ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IDA3ZGU3ZTEuLjI3ZTY3YTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtNDEzLDggKzQxMyw2IEBACiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgogc2dpLWlvYzQudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgotc2dpLXZpc3dzLnR4dAotCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgogc21zY19lY2UxMDk5LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWZpcm13YXJlLW9wYWwtZHVtcCBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1maXJtd2FyZS1vcGFsLWR1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmZTdmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1maXJtd2FyZS1vcGFsLWR1bXAKQEAgLTAsMCArMSw0MSBAQAorV2hhdDoJCS9zeXMvZmlybXdhcmUvb3BhbC9kdW1wCitEYXRlOgkJRmViIDIwMTQKK0NvbnRhY3Q6CVN0ZXdhcnQgU21pdGggPHN0ZXdhcnRAbGludXgudm5ldC5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgZGlyZWN0b3J5IGV4cG9zZXMgaW50ZXJmYWNlcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aAorCQl0aGUgRlNQIGFuZCBwbGF0Zm9ybSBkdW1wcyB0aHJvdWdoIE9QQUwgZmlybXdhcmUgaW50ZXJmYWNlLgorCisJCVRoaXMgaXMgb25seSBmb3IgdGhlIHBvd2VycGMvcG93ZXJudiBwbGF0Zm9ybS4KKworCQlpbml0aWF0ZV9kdW1wOglXaGVuICcxJyBpcyB3cml0dGVuIHRvIGl0LAorCQkJCXdlIHdpbGwgaW5pdGlhdGUgYSBkdW1wLgorCQkJCVJlYWQgdGhpcyBmaWxlIGZvciBzdXBwb3J0ZWQgY29tbWFuZHMuCisKKwkJMHhYWC0weFlZWVk6CUEgZGlyZWN0b3J5IGZvciBkdW1wIG9mIHR5cGUgMHhYWCBhbmQKKwkJCQlpZCAweFlZWVkgKGluIGhleCkuIFRoZSBuYW1lIG9mIHRoaXMKKwkJCQlkaXJlY3Rvcnkgc2hvdWxkIG5vdCBiZSByZWxpZWQgdXBvbiB0bworCQkJCWJlIGluIHRoaXMgZm9ybWF0LCBvbmx5IHRoYXQgaXQncyB1bmlxdWUKKwkJCQlhbW9uZyBhbGwgZHVtcHMuIEZvciBkZXRlcm1pbmluZyB0aGUgdHlwZQorCQkJCWFuZCBJRCBvZiB0aGUgZHVtcCwgdXNlIHRoZSBpZCBhbmQgdHlwZSBmaWxlcy4KKwkJCQlEbyBub3QgcmVseSBvbiBhbnkgcGFydGljdWxhciBzaXplIG9mIGR1bXAKKwkJCQl0eXBlIG9yIGR1bXAgaWQuCisKKwkJRWFjaCBkdW1wIGhhcyB0aGUgZm9sbG93aW5nIGZpbGVzOgorCQlpZDoJCUFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkdW1wIElECisJCQkJaW4gaGV4IChlLmcuICcweDAxJykKKwkJdHlwZToJCUFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mCisJCQkJZHVtcCBpbiB0aGUgZm9ybWF0ICIweCV4ICVzIiB3aXRoIHRoZSBJRAorCQkJCWluIGhleCBhbmQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZHVtcCB0eXBlCisJCQkJKG9yICd1bmtub3duJykuCisJCQkJVHlwZSAnMHhmZmZmZmZmZiB1bmtub3duJyBpcyB1c2VkIHdoZW4KKwkJCQl3ZSBjb3VsZCBub3QgZ2V0IHRoZSB0eXBlIGZyb20gZmlybXdhcmUuCisJCQkJZS5nLiAnMHgwMiBTeXN0ZW0vUGxhdGZvcm0gRHVtcCcKKwkJZHVtcDoJCUEgYmluYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgZHVtcC4KKwkJCQlUaGUgc2l6ZSBvZiB0aGUgZHVtcCBpcyB0aGUgc2l6ZSBvZiB0aGlzIGZpbGUuCisJCWFja25vd2xlZGdlOglXaGVuICdhY2snIGlzIHdyaXR0ZW4gdG8gdGhpcywgd2Ugd2lsbAorCQkJCWFja25vd2xlZGdlIHRoYXQgd2UndmUgcmV0cmlldmVkIHRoZQorCQkJCWR1bXAgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yLiBJdCB3aWxsCisJCQkJdGhlbiByZW1vdmUgaXQsIG1ha2luZyB0aGUgZHVtcAorCQkJCWluYWNjZXNzaWJsZS4KKwkJCQlSZWFkaW5nIHRoaXMgZmlsZSB3aWxsIGdldCBhIGxpc3Qgb2YKKwkJCQlzdXBwb3J0ZWQgYWN0aW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1maXJtd2FyZS1vcGFsLWVsb2cgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZmlybXdhcmUtb3BhbC1lbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjMwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZmlybXdhcmUtb3BhbC1lbG9nCkBAIC0wLDAgKzEsNjAgQEAKK1doYXQ6CQkvc3lzL2Zpcm13YXJlL29wYWwvZWxvZworRGF0ZToJCUZlYiAyMDE0CitDb250YWN0OglTdGV3YXJ0IFNtaXRoIDxzdGV3YXJ0QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGRpcmVjdG9yeSBleHBvc2VzIGVycm9yIGxvZyBlbnRyaWVzIHJldHJpZXZlZAorCQl0aHJvdWdoIHRoZSBPUEFMIGZpcm13YXJlIGludGVyZmFjZS4KKworCQlFYWNoIGVycm9yIGxvZyBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIElEIGFuZCB3aWxsCisJCWV4aXN0IHVudGlsIGV4cGxpY2l0bHkgYWNrbm93bGVkZ2VkIHRvIGZpcm13YXJlLgorCisJCUVhY2ggbG9nIGVudHJ5IGhhcyBhIGRpcmVjdG9yeSBpbiAvc3lzL2Zpcm13YXJlL29wYWwvZWxvZy4KKworCQlMb2cgZW50cmllcyBtYXkgYmUgcHVyZ2VkIGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3NvcgorCQliZWZvcmUgcmV0cmlldmVkIGJ5IGZpcm13YXJlIG9yIHJldHJpZXZlZC9hY2tub3dsZWRnZWQgYnkKKwkJTGludXggaWYgdGhlcmUgaXMgbm8gcm9vbSBmb3IgbW9yZSBsb2cgZW50cmllcy4KKworCQlJbiB0aGUgZXZlbnQgdGhhdCBMaW51eCBoYXMgcmV0cmlldmVkIHRoZSBsb2cgZW50cmllcworCQlidXQgbm90IGV4cGxpY2l0bHkgYWNrbm93bGVkZ2VkIHRoZW0gdG8gZmlybXdhcmUgYW5kCisJCXRoZSBzZXJ2aWNlIHByb2Nlc3NvciBuZWVkcyBtb3JlIHJvb20gZm9yIGxvZyBlbnRyaWVzLAorCQl0aGUgb25seSByZW1haW5pbmcgY29weSBvZiBhIGxvZyBtZXNzYWdlIG1heSBiZSBpbgorCQlMaW51eC4KKworCQlUeXBpY2FsbHksIGEgdXNlciBzcGFjZSBkYWVtb24gd2lsbCBtb25pdG9yIGZvciBuZXcKKwkJZW50cmllcywgcmVhZCB0aGVtIG91dCBhbmQgYWNrbm93bGVkZ2UgdGhlbS4KKworCQlUaGUgc2VydmljZSBwcm9jZXNzb3IgbWF5IGJlIGFibGUgdG8gc3RvcmUgbW9yZSBsb2cKKwkJZW50cmllcyB0aGFuIGZpcm13YXJlIGNhbiwgc28gYWZ0ZXIgeW91IGFja25vd2xlZGdlCisJCWFuIGV2ZW50IGZyb20gTGludXggeW91IG1heSBpbnN0YW50bHkgZ2V0IGFub3RoZXIgb25lCisJCWZyb20gdGhlIHF1ZXVlIHRoYXQgd2FzIGdlbmVyYXRlZCBzb21lIHRpbWUgaW4gdGhlIHBhc3QuCisKKwkJVGhlIHJhdyBsb2cgZm9ybWF0IGlzIGEgYmluYXJ5IGZvcm1hdC4gV2UgY3VycmVudGx5CisJCWRvIG5vdCBwYXJzZSB0aGlzIGF0IGFsbCBpbiBrZXJuZWwsIGxlYXZpbmcgaXQgdXAgdG8KKwkJdXNlciBzcGFjZSB0byBzb2x2ZSB0aGUgcHJvYmxlbS4gSW4gZnV0dXJlLCB3ZSBtYXkKKwkJZG8gbW9yZSBwYXJzaW5nIGluIGtlcm5lbCBhbmQgYWRkIG1vcmUgZmlsZXMgdG8gbWFrZQorCQlpdCBlYXNpZXIgZm9yIHNpbXBsZSB1c2VyIHNwYWNlIHByb2Nlc3NlcyB0byBleHRyYWN0CisJCW1vcmUgaW5mb3JtYXRpb24uCisKKwkJRm9yIGVhY2ggbG9nIGVudHJ5IChkaXJlY3RvcnkpLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZworCQlmaWxlczoKKworCQlpZDoJCUFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBJRCBvZiB0aGUKKwkJCQllcnJvciBsb2csIGluIGhleCAtIGUuZy4gIjB4MDEiLgorCisJCXR5cGU6CQlBbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBpZCBhbmQKKwkJCQlkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvciBsb2cuCisJCQkJQ3VycmVudGx5IGp1c3QgIjB4MDAgUEVMIiAtIHBsYXRmb3JtIGVycm9yIGxvZy4KKwkJCQlJbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsIHR5cGVzLgorCisJCXJhdzoJCUEgcmVhZC1vbmx5IGJpbmFyeSBmaWxlIHRoYXQgY2FuIGJlIHJlYWQKKwkJCQl0byBnZXQgdGhlIHJhdyBsb2cgZW50cnkuIFRoZXNlIGFyZQorCQkJCTwxNmtiLCBvZnRlbiBqdXN0IGh1bmRyZWRzIG9mIGJ5dGVzIGFuZAorCQkJCSJhdmVyYWdlIiAya2IuCisKKwkJYWNrbm93bGVkZ2U6CVdyaXRpbmcgJ2FjaycgdG8gdGhpcyBmaWxlIHdpbGwgYWNrbm93bGVkZ2UKKwkJCQl0aGUgZXJyb3IgbG9nIHRvIGZpcm13YXJlIChhbmQgaW4gdHVybgorCQkJCXRoZSBzZXJ2aWNlIHByb2Nlc3NvciwgaWYgYXBwbGljYWJsZSkuCisJCQkJU2hvcnRseSBhZnRlciBhY2tub3dsZWRnaW5nIGl0LCB0aGUgbG9nCisJCQkJZW50cnkgd2lsbCBiZSByZW1vdmVkIGZyb20gc3lzZnMuCisJCQkJUmVhZGluZyB0aGlzIGZpbGUgd2lsbCBsaXN0IHRoZSBzdXBwb3J0ZWQKKwkJCQlvcGVyYXRpb25zIChjdXJlbnRseSBqdXN0IGFja25vd2xlZGdlKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ldmVudF9zb3VyY2UtZGV2aWNlcy1ldmVudHMgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ldmVudF9zb3VyY2UtZGV2aWNlcy1ldmVudHMKaW5kZXggM2MxY2MyNC4uN2I0MGEzYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtZXZlbnRzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWV2ZW50X3NvdXJjZS1kZXZpY2VzLWV2ZW50cwpAQCAtNTcsNiArNTcsNTIzIEBACiAJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xEX1JFRl9MMQogCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9SVU5fQ1lDCiAJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1JVTl9JTlNUX0NNUEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfREVNQU5EX0wyX0JSX0FMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfVVRJTF83X1RPXzEwX1NMT1RTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BNQzJfU0FWRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF8xNkZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xTVV9ERVJBVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19TVF9DTVBMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjNfQURECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NUX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfQ0FTVE9VVF9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSVNFRworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfSU5TVF9USU1FTworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ1NUX0RJU1BfRkFJTF9BRERSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfRENfUFJFRl9TVFJFQU1fQ09ORklSTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JRVJBVF9XUl82NEsKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RUTEJfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUVSQVRfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0xNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX1BSSU9fNF81X0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVEX1RBCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0VYVF9JTlQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZTUVJUX0ZESVYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xEX01JU1NfRVhQT1NFRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MREYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfV1JJVEVfQUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfU1JRX1NURldECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9STDJMM19NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMzFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9MMjFfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfU0NBTF9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfOEZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE9XRVJfRVZFTlQxCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTERfQkFMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfMkZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFdTWU5DX0hFTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDIxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JRVJBVF9YTEFURV9XUl8xNk1QTFVTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX1JFUV9BTEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFNMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wzX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9MMV9QUkVGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TQ0FMQVJfU0lOR0xFX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0RDX1BSRUZfU1RSRUFNX0NPTkZJUk1fU1RSSURFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0lOU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9GUlNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wyTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0RRX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0ZMVVNIX1VMRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fTE1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREVSQVRfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhSRF9BTExfUlVOX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NRU0wX1BSRUZFVENIX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1NUQUxMX0NNUExVX0NZQ19DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fREwyTDNfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9GUlNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDIxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QTUMxX09WRVJGTE9XCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU0lOR0xFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDNNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX1ZFQ1RPUl9TUF9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9GRVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19JTlNUX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9DT01QTEVYX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0ZMVVNIX1VTVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFVfSURMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UwX0ZMVVNIX1VMRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTE1RX1NSUV9FTVBUWV9BTExfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfUkVKRUNUX0xNUV9GVUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wyMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TSExfQ1JFQVRFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9TVF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0RNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfTERfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFUxX0JVU1lfRlhVMF9JRExFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTERfUkVTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NOX1NYX0lfRE9ORQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TVENYX0NNUEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF8yRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19QUkVGX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1NSUV9TWU5DX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfUkVKRUNUX0VSQVRfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMV9JQ0FDSEVfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0ZMVVNIX1NSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MRF9SRUZfTDFfTFNVMAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZFU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX1ZFQ1RPUl9TSU5HTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZSRVFfVVAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0xNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MRFgKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DM19PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfQlJfTVBSRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU0hMX01BVENICisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19CUl9UQUtFTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JU0xCX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRElTUF9IRUxEX1RIRVJNQUwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fUkwyTDNfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfU1JRX1NURldECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9ETUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV8yRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfRlVMTF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MM19DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1NSUV9TMF9BTExPQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREVSQVRfTUlTU180SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9NUFJFRF9UQQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9MMk1JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFBVX0hFTERfUE9XRVIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1ZTVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1NSUV9TMF9WQUxJRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfRU1QVFlfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lPUFNfRElTUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9SVU5fU1BVUlIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wyMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF8xRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TTk9PUF9UTEJJRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDNNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TSU5HTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFRMQl9NSVNTXzE2RworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GTFVTSAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTkVTVF9QQUlSMl9BTkQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV8xRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19QUkVGX1JFUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19MRF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRElTUF9IRUxECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0xECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GTFVTSF9TUlEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQkNfUExVU184X0NPTlYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMzFfTU9EX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ1NUX0JVU1lfUkNfRlVMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9UQl9CSVRfVFJBTlMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhFUk1BTF9NQVgKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9GTFVTSF9VTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9SRUpFQ1RfTEhTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9MUlFfUzBfQUxMT0MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfQ09fTDMxCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BPV0VSX0VWRU5UNAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9VTkNPTkQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9EQ19QUkVGX1NUUkVBTV9BTExPQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QTUM0X1JFV0lORAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ0xEX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhSRF9QUklPXzJfM19DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9MMk1JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfREVNQU5EX0wyX0JIVF9SRURJUkVDVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19QUkVGX0NBTkNFTF9MMgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRklOX1NUQUxMX0NZQ19DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVEX0NDQUNIRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfVVRJTF8xX1RPXzJfU0xPVFMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1NUX0NNUExfSU5UCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9UV09fVEFCTEVXQUxLX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfU0VUX01QUkVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0RJU1BfVExCSUUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9GQ09OVgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ERVJBVF9NSVNTXzE2RworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTE1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19ERU1BTkRfTDJfQlJfUkVESVJFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fTDIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wyCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDIxX1NIUl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RUTEJfTUlTU180SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZQU0NSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfVkVDVF9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fUkwyTDNfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01FTTBfUlFfRElTUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZNWF9SRVNVTFRfU0FUXzEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDFfUFJFRgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0xNRU1fQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0dSUF9JQ19NSVNTX05PTlNQRUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUEJfTk9ERV9QVU1QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1NITF9NRVJHRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTkVTVF9QQUlSMV9BREQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0wzCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GTFVTSAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfU1JRX1NZTkNfQ09VTlQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DMl9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTERGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BPV0VSX0VWRU5UMworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ESVNQX1dUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX0JBTktfQ09ORkxJQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfTVBSRURfQ1JfVEEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfSU5TVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjJfQURECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRkxVU0gKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfTERTVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZJTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZDT05WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTERfVExCSUUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9ETUVNX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVEX0NSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9SRUpFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fR0NUX1VUSUxfM19UT182X1NMT1RTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0NNUExVX1NUQUxMX0VORF9HQ1RfTk9TTE9UCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfUkVKRUNUX0xNUV9GVUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9GRVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjBfQU5ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9MMworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QT1dFUl9FVkVOVDIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfUFJFRl9DQU5DRUxfUEFHRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZTUVJUX0ZESVYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0dSUF9DTVBMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU0NBTF9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0dSUF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTERYCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9MMgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX1ZFQ1RfRE9VQkxFX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxXzJGTE9QX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX1BSSU9fNl83X0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CQ19QTFVTXzhfUlNMVl9UQUtFTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9NUFJFRF9DUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19DT19NRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfU1JRX0ZVTExfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RBQkxFV0FMS19DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9TUlFfU1RGV0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fUk1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFUwX0ZJTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0wxX1NXX1BSRUYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wzMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNV9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MRF9SRUZfTDFfTFNVMQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9MMjFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU0NBTF9TSU5HTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0JSX01QUkVEX0xTVEFDSworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX1JMMkwzX01PRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9GTFVTSF9VU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX05DU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfVEFLRU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fTE1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EVExCX01JU1NfNEsKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNF9TQVZFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX1BFUk1VVEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1NMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfRkxVU0hfTFJRCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RUTEJfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZSU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX1ZFQ1RPUl9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0NBU1RPVVRfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9ETDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9TVEYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU1RfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9MMjFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0xPQ19HVUVTU19XUk9ORworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfU1RDWF9GQUlMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfUkVKRUNUX0xIUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19QUkVGX0NBTkNFTF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfUFJFRl9CVVNZCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19CUlVfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfTkNMRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9MMzFfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9OQ0xECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9MRFgKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfTE9DX0dVRVNTX0NPUlJFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhSRVNIX1RJTUVPCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wzX1BSRUZfU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRElTUF9DTEJfSEVMRF9TWU5DCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TSU1QTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfU0lOR0xFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfVEFCTEVXQUxLX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ19TVF9ET05FCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDIxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MQVJYX0xTVTEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREVSQVRfTUlTU180SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ0xEX0RJU1BfRkFJTF9BRERSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1NFR19FWENFUFRJT04KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRkxVU0hfRElTUF9TQgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9EQ19JTlYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0RMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EU0VHCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0JSX1BSRURfTFNUQUNLCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU1RGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GWF9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREVSQVRfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9ETDJMM19NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fR0NUX1VUSUxfMTFfUExVU19TTE9UUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0lGVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSVRMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TVEYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0ZMVVNIX1VTVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRFNUX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRlhVMV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU0hMX0RFQUxMT0NBVEVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NOX01fV1JfRE9ORQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfUkVKRUNUX1NFVF9NUFJFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19QUkVGX0xECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NOX01fUkRfRE9ORQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREVSQVRfTUlTU18xNkcKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZDT05WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0FOWV9USFJEX1JVTl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0xNUV9GVUxMX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTFNVX1JFSkVDVF9MSFMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xEX01JU1NfTDFfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDJfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfSU1DX01BVENIX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9STUVNX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX1NJTVBMRV9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9STDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZNQV9ET1VCTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVXzRGTE9QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjFfQU5ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fUk1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTFJRX1MwX1ZBTElECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTERGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0NPTVBMRVRJT04KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU1RfTUlTU19MMQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9OT0RFX1BVTVAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfU1RBTExfQ01QTFVfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfREVOT1JNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDMxX1NIUl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTkVTVF9QQUlSMF9BREQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9FRV9PRkZfRVhUX0lOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9ETUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfRlJPTV9ETDJMM19NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNl9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfMkZMT1BfRE9VQkxFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZYVV9CVVNZCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1JDTERfRElTUF9GQUlMX09USEVSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9SRUpFQ1RfTE1RX0ZVTEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfUkVMT0FEX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HUlBfTVJLCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19TVF9ORVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfRlNRUlRfRkRJVgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UwX0ZMVVNIX0xSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MQVJYX0xTVTAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUJVRl9GVUxMX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RMMkwzX1NIUl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0RDX1BSRUZfU1RSRUFNX0FMTE9DCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0dSUF9NUktfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fUkwyTDNfU0hSX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9HTE9CX0dVRVNTX0NPUlJFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1JFSkVDVF9MSFMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MTUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wzCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZSRVFfRE9XTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QQl9SRVRSWV9OT0RFX1BVTVAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX1JMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfSU5TVF9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9SVU5fUFVSUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfR1JQX0lDX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fUkwyTDNfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GTFVTSF9MUlEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RFUkFUX01JU1NfNjRLCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0RMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9TVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDIxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MV1NZTkMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9EQ19QUkVGX1NUUkVBTV9DT05GSVJNX1NUUklERQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTFNVX0ZMVVNIX0xSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0lNQ19NQVRDSF9DTVBMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjNfQU5ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BCX1JFVFJZX1NZU19QVU1QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19JTlNUX0ZJTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDMxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRFRMQl9NSVNTXzY0SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfUkVKRUNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0NPX0ZBSUxfQlVTWQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NRU0wX1dRX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0wzMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhFUk1BTF9XQVJOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfNEZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfTVBSRURfQ0NBQ0hFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wxX0RFTUFORF9XUklURQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GTFVTSF9CUl9NUFJFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRFRMQl9NSVNTXzE2RworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0RNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfUkNTVF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9QQVJUSUFMX0NERgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ESVNQX0NMQl9IRUxEX1NCCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfRk1BX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFUwX0JVU1lfRlhVMV9JRExFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX0RFTUFORF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMjFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRkxVU0hfVVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfREVOT1JNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfUEFSVElBTF9DREYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0wyMV9TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfUFJFRl9XUklURQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfRlJPTV9ETUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX1BSRUZfQ0FOQ0VMX0FMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfRENfUFJFRl9TVFJFQU1fQ09ORklSTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTFNVX0ZMVVNIX1NSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRklOX1NUQUxMX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ1NUX0RJU1BfRkFJTF9PVEhFUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0REX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDIxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UwX05DTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV80RkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxXzhGTE9QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV84RkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTE1RX1NSUV9FTVBUWV9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFRMQl9NSVNTXzY0SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX0NPTkNfUlVOX0lOU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9MMgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QQl9TWVNfUFVNUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDMxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX1BSSU9fMF8xX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ERVJBVF9NSVNTXzY0SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QTUMyX1JFV0lORAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fR1JQX0JSX01QUkVEX05PTlNQRUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01FTTBfUkRfQ0FOQ0VMX1RPVEFMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfRENfUFJFRl9TVFJFQU1fQ09ORklSTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMV9EQ0FDSEVfUkVMT0FEX1ZBTElECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TQ0FMQVJfRE9VQkxFX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19QUkVGX0hJVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0wzMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0ZYVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNF9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0wzCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTE1RX0xIUl9NRVJHRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CVEFDX0hJVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19SRF9CVVNZCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTDFfU1dfUFJFRgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDJNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfRENfUFJFRl9TVFJFQU1fQUxMT0MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9ERU5PUk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9ETDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfUFJFRF9DUl9UQQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZDT05WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRkxVU0hfVUxECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0JUQUNfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTERfTUlTU19FWFBPU0VEX0NZQ19DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0wyCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9EQ0FDSEVfUkVMT0FEX1ZBTElECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9GTUEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9GTFVTSF9TUlEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MMV9QUkVGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lPUFNfQ01QTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9TWVNfUFVNUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ0xEX0JVU1lfUkNfRlVMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTE1RX1MwX0FMTE9DCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0RJU1BfU1lOQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RMMkwzX01PRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfSUNfSU5WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDIxX01PRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfUFJFRl9MRFNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9TUlFfRU1QVFlfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9MTVFfUzBfVkFMSUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRkxVU0hfUEFSVElBTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZNQV9ET1VCTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fMVBMVVNfUFBDX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0wyTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TVVNQRU5ERUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9GTUEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU1RDWF9GQUlMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfRlNRUlRfRkRJVl9ET1VCTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRENfUFJFRl9EU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9TQ0FMX1NJTkdMRV9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfSElUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0dMT0JfR1VFU1NfV1JPTkcKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RGVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0wxCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX0RFTUFORF9SRVEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9GU1FSVF9GRElWX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZNQQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTERfTUlTU19MMQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwXzJGTE9QX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfRENfUFJFRl9TVFJJREVEX1NUUkVBTV9DT05GSVJNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wzMV9TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xTVV9SRUpFQ1RfRVJBVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDJNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9STDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX1BSRUYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9TUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0RJU1BfQUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RIUkRfR1JQX0NNUExfQk9USF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZTUVJUX0ZESVZfRE9VQkxFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfMUZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSFZfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fUkwyTDNfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RUTEJfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MTVFfTEhSX01FUkdFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lGVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fMVRIUkRfQ09OX1JVTl9JTlNUUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9DTVBMVV9TVEFMTF9DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NRU0wX1BCX1JEX0NMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RIUkRfMV9SVU5fQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RIUkRfMl9DT05DX1JVTl9JTlNUUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzJfUlVOX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzNfQ09OQ19SVU5fSU5TVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzNfUlVOX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzRfQ09OQ19SVU5fSU5TVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzRfUlVOX0NZQwogCiBEYXRlOgkJMjAxMy8wMS8wOAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ldmVudF9zb3VyY2UtZGV2aWNlcy1odl8yNHg3IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtaHZfMjR4NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzhlZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtaHZfMjR4NwpAQCAtMCwwICsxLDIzIEBACitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfMjR4Ny9pbnRlcmZhY2UvY2F0YWxvZworRGF0ZToJCUZlYnJ1YXJ5IDIwMTQKK0NvbnRhY3Q6CUNvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJpbmFyeSAiMjR4NyBjYXRhbG9nIiBwcm92aWRlZCBieSB0aGUKKwkJaHlwZXJ2aXNvciBvbiBQT1dFUjcgYW5kIDggc3lzdGVtcy4gVGhpcyBjYXRhbG9nIGxpc3RzIGV2ZW50cworCQlhdmFsaWFibGUgZnJvbSB0aGUgcG93ZXJwYyAiaHZfMjR4NyIgcG11LiBJdHMgZm9ybWF0IGlzCisJCWRvY3VtZW50ZWQgaGVyZToKKwkJaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ptZXNtb24vY2F0YWxvZy0yNHg3L21hc3Rlci9odi0yNHg3LWNhdGFsb2cuaAorCitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfMjR4Ny9pbnRlcmZhY2UvY2F0YWxvZ19sZW5ndGgKK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJQSBudW1iZXIgZXF1YWwgdG8gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2F0YWxvZy4gVGhpcyBpcworCQlhbHNvIGV4dHJhY3RhYmxlIGZyb20gdGhlIHByb3ZpZGVkIGJpbmFyeSAiY2F0YWxvZyIgc3lzZnMgZW50cnkuCisKK1doYXQ6CQkvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy9odl8yNHg3L2ludGVyZmFjZS9jYXRhbG9nX3ZlcnNpb24KK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJRXhwb3NlcyB0aGUgInZlcnNpb24iIGZpZWxkIG9mIHRoZSAyNHg3IGNhdGFsb2cuIFRoaXMgaXMgYWxzbworCQlleHRyYWN0YWJsZSBmcm9tIHRoZSBwcm92aWRlZCBiaW5hcnkgImNhdGFsb2ciIHN5c2ZzIGVudHJ5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtaHZfZ3BjaSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWV2ZW50X3NvdXJjZS1kZXZpY2VzLWh2X2dwY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNThjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWV2ZW50X3NvdXJjZS1kZXZpY2VzLWh2X2dwY2kKQEAgLTAsMCArMSw0MyBAQAorV2hhdDoJCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2h2X2dwY2kvaW50ZXJmYWNlL2NvbGxlY3RfcHJpdmlsZWdlZAorRGF0ZToJCUZlYnJ1YXJ5IDIwMTQKK0NvbnRhY3Q6CUNvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQknMCcgaWYgdGhlIGh5cGVydmlzb3IgaXMgY29uZmlndXJlZCB0byBmb3JiaWQgYWNjZXNzIHRvIGV2ZW50CisJCWNvdW50ZXJzIGJlaW5nIGFjY3VtdWxhdGVkIGJ5IG90aGVyIGd1ZXN0cyBhbmQgdG8gcGh5c2ljYWwKKwkJZG9tYWluIGV2ZW50IGNvdW50ZXJzLgorCQknMScgaWYgdGhhdCBhY2Nlc3MgaXMgYWxsb3dlZC4KKworV2hhdDoJCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2h2X2dwY2kvaW50ZXJmYWNlL2dhCitEYXRlOgkJRmVicnVhcnkgMjAxNAorQ29udGFjdDoJQ29keSBQIFNjaGFmZXIgPGNvZHlAbGludXgudm5ldC5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCTAgb3IgMS4gSW5kaWNhdGVzIHdoZXRoZXIgd2UgaGF2ZSBhY2Nlc3MgdG8gIkdBIiBldmVudHMgKGxpc3RlZAorCQlpbiBhcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmgpLgorCitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfZ3BjaS9pbnRlcmZhY2UvZXhwYW5kZWQKK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJMCBvciAxLiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBoYXZlIGFjY2VzcyB0byAiRVhQQU5ERUQiIGV2ZW50cyAobGlzdGVkCisJCWluIGFyY2gvcG93ZXJwYy9wZXJmL2h2LWdwY2kuaCkuCisKK1doYXQ6CQkvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy9odl9ncGNpL2ludGVyZmFjZS9sYWIKK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJMCBvciAxLiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBoYXZlIGFjY2VzcyB0byAiTEFCIiBldmVudHMgKGxpc3RlZAorCQlpbiBhcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmgpLgorCitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfZ3BjaS9pbnRlcmZhY2UvdmVyc2lvbgorRGF0ZToJCUZlYnJ1YXJ5IDIwMTQKK0NvbnRhY3Q6CUNvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBIG51bWJlciBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBncGNpIGludGVyZmFjZSB0aGF0IHRoZQorCQloeXBlcnZpc29yIHJlcG9ydHMgc3VwcG9ydGluZy4KKworV2hhdDoJCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2h2X2dwY2kvaW50ZXJmYWNlL2tlcm5lbF92ZXJzaW9uCitEYXRlOgkJRmVicnVhcnkgMjAxNAorQ29udGFjdDoJQ29keSBQIFNjaGFmZXIgPGNvZHlAbGludXgudm5ldC5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCUEgbnVtYmVyIGluZGljYXRpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBncGNpIGludGVyZmFjZQorCQl0aGF0IHRoZSBrZXJuZWwgaXMgYXdhcmUgb2YuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXNjc2lfaG9zdCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3Mtc2NzaV9ob3N0CmluZGV4IDI5YTRmODkuLjBlYjI1NWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3Mtc2NzaV9ob3N0CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3Mtc2NzaV9ob3N0CkBAIC0xMSwzICsxMSwxOSBAQAogCQlndWFyYW50ZWVkLiAgVGhlICdpc2NpX2lkJyBhdHRyaWJ1dGUgdW5hbWJpZ3VvdXNseSBpZGVudGlmaWVzCiAJCXRoZSBjb250cm9sbGVyIGluZGV4OiAnMCcgZm9yIHRoZSBmaXJzdCBjb250cm9sbGVyLAogCQknMScgZm9yIHRoZSBzZWNvbmQuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0WC9hY2Npb3BhdGhfc3RhdHVzCitEYXRlOgkJTm92ZW1iZXIgMjAxMworQ29udGFjdDoJU3RlcGhlbiBNLiBDYW1lcm9uIDxzY2FtZXJvbkBiZWFyZG9nLmNjZS5ocC5jb20+CitEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgIlNTRCBTbWFydCBQYXRoIgorCQlmZWF0dXJlIG9mIEhQIFNtYXJ0IEFycmF5IFJBSUQgY29udHJvbGxlcnMgdXNpbmcgdGhlIGhwc2EKKwkJZHJpdmVyLiAgU1NEIFNtYXJ0IFBhdGgsIHdoZW4gZW5hYmxlZCBwZXJtaXRzIHRoZSBkcml2ZXIgdG8KKwkJc2VuZCBpL28gcmVxdWVzdHMgZGlyZWN0bHkgdG8gcGh5c2ljYWwgZGV2aWNlcyB0aGF0IGFyZSBwYXJ0CisJCW9mIGEgbG9naWNhbCBkcml2ZSwgYnlwYXNzaW5nIHRoZSBjb250cm9sbGVycyBmaXJtd2FyZSBSQUlECisJCXN0YWNrIGZvciBhIHBlcmZvcm1hbmNlIGFkdmFudGFnZSB3aGVuIHBvc3NpYmxlLiAgQSB2YWx1ZSBvZgorCQknMScgaW5kaWNhdGVzIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIGFuZCB0aGUgY29udHJvbGxlciBtYXkKKwkJdXNlIHRoZSBkaXJlY3QgaS9vIHBhdGggdG8gcGh5c2ljYWwgZGV2aWNlcy4gIEEgdmFsdWUgb2YgemVybworCQltZWFucyB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCBhbmQgdGhlIGNvbnRyb2xsZXIgbWF5IG5vdCB1c2UKKwkJdGhlIGRpcmVjdCBpL28gcGF0aCB0byBwaHlzaWNhbCBkZXZpY2VzLiAgVGhpcyBzZXR0aW5nIGlzCisJCWNvbnRyb2xsZXIgd2lkZSwgYWZmZWN0aW5nIGFsbCBjb25maWd1cmVkIGxvZ2ljYWwgZHJpdmVzIG9uIHRoZQorCQljb250cm9sbGVyLiAgVGhpcyBmaWxlIGlzIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCAwZjljNmZmLi44ZDk2ZWJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw3IEBACiAJICAgIGdlbmVyaWNpcnEueG1sIHMzOTAtZHJpdmVycy54bWwgdWlvLWhvd3RvLnhtbCBzY3NpLnhtbCBcCiAJICAgIDgwMjExLnhtbCBkZWJ1Z29iamVjdHMueG1sIHNoLnhtbCByZWd1bGF0b3IueG1sIFwKIAkgICAgYWxzYS1kcml2ZXItYXBpLnhtbCB3cml0aW5nLWFuLWFsc2EtZHJpdmVyLnhtbCBcCi0JICAgIHRyYWNlcG9pbnQueG1sIGRybS54bWwgbWVkaWFfYXBpLnhtbAorCSAgICB0cmFjZXBvaW50LnhtbCBkcm0ueG1sIG1lZGlhX2FwaS54bWwgdzEueG1sCiAKIGluY2x1ZGUgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvTWFrZWZpbGUKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3cxLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdzEudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIyOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3cxLnRtcGwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKwkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgorCis8Ym9vayBpZD0idzFpZCI+CisgIDxib29raW5mbz4KKyAgICA8dGl0bGU+VzE6IERhbGxhcycgMS13aXJlIGJ1czwvdGl0bGU+CisKKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPkZyaWVzPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPGFkZHJlc3M+CisgICAgICAgICAgICA8ZW1haWw+RGF2aWRARnJpZXMubmV0PC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKworICAgIDwvYXV0aG9yZ3JvdXA+CisKKyAgICA8Y29weXJpZ2h0PgorICAgICAgPHllYXI+MjAxMzwveWVhcj4KKyAgICAgIDwhLS0KKyAgICAgIDxob2xkZXI+PC9ob2xkZXI+CisgICAgICAtLT4KKyAgICA8L2NvcHlyaWdodD4KKworICAgIDxsZWdhbG5vdGljZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICAgICBMaWNlbnNlIHZlcnNpb24gMi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAgICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICAgICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgICAgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorICAgICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCisgICAgICA8L3BhcmE+CisgICAgPC9sZWdhbG5vdGljZT4KKyAgPC9ib29raW5mbz4KKworICA8dG9jPjwvdG9jPgorCisgIDxjaGFwdGVyIGlkPSJ3MV9pbnRlcm5hbCI+CisgICAgPHRpdGxlPlcxIEFQSSBpbnRlcm5hbCB0byB0aGUga2VybmVsPC90aXRsZT4KKworICAgIDxzZWN0MSBpZD0idzFfaW50ZXJuYWxfYXBpIj4KKyAgICAgIDx0aXRsZT5XMSBBUEkgaW50ZXJuYWwgdG8gdGhlIGtlcm5lbDwvdGl0bGU+CisgICAgICA8c2VjdDIgaWQ9IncxLmgiPgorICAgICAgICA8dGl0bGU+ZHJpdmVycy93MS93MS5oPC90aXRsZT4KKyAgICAgICAgPHBhcmE+VzEgY29yZSBmdW5jdGlvbnMuPC9wYXJhPgorIUlkcml2ZXJzL3cxL3cxLmgKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzEuYyI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxLmM8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBjb3JlIGZ1bmN0aW9ucy48L3BhcmE+CishSWRyaXZlcnMvdzEvdzEuYworICAgICAgPC9zZWN0Mj4KKworICAgICAgPHNlY3QyIGlkPSJ3MV9mYW1pbHkuaCI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX2ZhbWlseS5oPC90aXRsZT4KKyAgICAgICAgPHBhcmE+QWxsb3dzIHJlZ2lzdGVyaW5nIGRldmljZSBmYW1pbHkgb3BlcmF0aW9ucy48L3BhcmE+CishSWRyaXZlcnMvdzEvdzFfZmFtaWx5LmgKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzFfZmFtaWx5LmMiPgorICAgICAgICA8dGl0bGU+ZHJpdmVycy93MS93MV9mYW1pbHkuYzwvdGl0bGU+CisgICAgICAgIDxwYXJhPkFsbG93cyByZWdpc3RlcmluZyBkZXZpY2UgZmFtaWx5IG9wZXJhdGlvbnMuPC9wYXJhPgorIUVkcml2ZXJzL3cxL3cxX2ZhbWlseS5jCisgICAgICA8L3NlY3QyPgorCisgICAgICA8c2VjdDIgaWQ9IncxX2ludC5jIj4KKyAgICAgICAgPHRpdGxlPmRyaXZlcnMvdzEvdzFfaW50LmM8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBpbnRlcm5hbCBpbml0aWFsaXphdGlvbiBmb3IgbWFzdGVyIGRldmljZXMuPC9wYXJhPgorIUVkcml2ZXJzL3cxL3cxX2ludC5jCisgICAgICA8L3NlY3QyPgorCisgICAgICA8c2VjdDIgaWQ9IncxX25ldGxpbmsuaCI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX25ldGxpbmsuaDwvdGl0bGU+CisgICAgICAgIDxwYXJhPlcxIGV4dGVybmFsIG5ldGxpbmsgQVBJIHN0cnVjdHVyZXMgYW5kIGNvbW1hbmRzLjwvcGFyYT4KKyFJZHJpdmVycy93MS93MV9uZXRsaW5rLmgKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzFfaW8uYyI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX2lvLmM8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBpbnB1dC9vdXRwdXQuPC9wYXJhPgorIUVkcml2ZXJzL3cxL3cxX2lvLmMKKyFJZHJpdmVycy93MS93MV9pby5jCisgICAgICA8L3NlY3QyPgorCisgICAgPC9zZWN0MT4KKworCisgIDwvY2hhcHRlcj4KKworPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKaW5kZXggMDY3NDFlOS4uZDAwNTZhNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC00NjgsOCArNDY4LDYgQEAKICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAgICAgICAgICAgKnJjaGlwID0gY2hpcDsKICAgICAgICAgICByZXR1cm4gMDsKICAgfQpAQCAtNDkyLDcgKzQ5MCw4IEBACiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogKDIpICovCi0gICAgICAgICAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisgICAgICAgICAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZjYXJkKTsKICAgICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAKQEAgLTU5MSw3ICs1OTAsOCBAQAogICBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAgIGludCBlcnI7CiAgIC4uLi4KLSAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisgIGVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorICAgICAgICAgICAgICAgICAgICAgMCwgJmNhcmQpOwogXV0+CiAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgpAQCAtODA5LDI4ICs4MDksMzQgQEAKIAogICAgICAgPHBhcmE+CiAgICAgICAgIEFzIG1lbnRpb25lZCBhYm92ZSwgdG8gY3JlYXRlIGEgY2FyZCBpbnN0YW5jZSwgY2FsbAotICAgICAgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4uCisgICAgICA8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPi4KIAogICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwogICBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAgIGludCBlcnI7Ci0gIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIG1vZHVsZSwgZXh0cmFfc2l6ZSwgJmNhcmQpOworICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIG1vZHVsZSwgZXh0cmFfc2l6ZSwgJmNhcmQpOwogXV0+CiAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgZnVuY3Rpb24gdGFrZXMgZml2ZSBhcmd1bWVudHMsIHRoZSBjYXJkLWluZGV4IG51bWJlciwgdGhlCi0gICAgICAgIGlkIHN0cmluZywgdGhlIG1vZHVsZSBwb2ludGVyICh1c3VhbGx5CisgICAgICAgIFRoZSBmdW5jdGlvbiB0YWtlcyBzaXggYXJndW1lbnRzOiB0aGUgcGFyZW50IGRldmljZSBwb2ludGVyLAorICAgICAgICB0aGUgY2FyZC1pbmRleCBudW1iZXIsIHRoZSBpZCBzdHJpbmcsIHRoZSBtb2R1bGUgcG9pbnRlciAodXN1YWxseQogICAgICAgICA8Y29uc3RhbnQ+VEhJU19NT0RVTEU8L2NvbnN0YW50PiksCiAgICAgICAgIHRoZSBzaXplIG9mIGV4dHJhLWRhdGEgc3BhY2UsIGFuZCB0aGUgcG9pbnRlciB0byByZXR1cm4gdGhlCiAgICAgICAgIGNhcmQgaW5zdGFuY2UuICBUaGUgZXh0cmFfc2l6ZSBhcmd1bWVudCBpcyB1c2VkIHRvCiAgICAgICAgIGFsbG9jYXRlIGNhcmQtJmd0O3ByaXZhdGVfZGF0YSBmb3IgdGhlCiAgICAgICAgIGNoaXAtc3BlY2lmaWMgZGF0YS4gIE5vdGUgdGhhdCB0aGVzZSBkYXRhCi0gICAgICAgIGFyZSBhbGxvY2F0ZWQgYnkgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4uCisgICAgICAgIGFyZSBhbGxvY2F0ZWQgYnkgPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorCVRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHBvaW50ZXIgb2Ygc3RydWN0CisJPHN0cnVjdG5hbWU+ZGV2aWNlPC9zdHJ1Y3RuYW1lPiwgc3BlY2lmaWVzIHRoZSBwYXJlbnQgZGV2aWNlLgorCUZvciBQQ0kgZGV2aWNlcywgdHlwaWNhbGx5ICZhbXA7cGNpLSZndDsgaXMgcGFzc2VkIHRoZXJlLgogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdGlvbj4KIApAQCAtOTE2LDE2ICs5MjIsMTYgQEAKICAgICAgIDwvcGFyYT4KIAogICAgICAgPHNlY3Rpb24gaWQ9ImNhcmQtbWFuYWdlbWVudC1jaGlwLXNwZWNpZmljLXNuZC1jYXJkLW5ldyI+Ci0gICAgICAgIDx0aXRsZT4xLiBBbGxvY2F0aW5nIHZpYSA8ZnVuY3Rpb24+c25kX2NhcmRfY3JlYXRlKCk8L2Z1bmN0aW9uPi48L3RpdGxlPgorICAgICAgICA8dGl0bGU+MS4gQWxsb2NhdGluZyB2aWEgPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4uPC90aXRsZT4KICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB5b3UgY2FuIHBhc3MgdGhlIGV4dHJhLWRhdGEtbGVuZ3RoCi0JICB0byB0aGUgNHRoIGFyZ3VtZW50IG9mIDxmdW5jdGlvbj5zbmRfY2FyZF9jcmVhdGUoKTwvZnVuY3Rpb24+LCBpLmUuCisJICB0byB0aGUgNXRoIGFyZ3VtZW50IG9mIDxmdW5jdGlvbj5zbmRfY2FyZF9uZXcoKTwvZnVuY3Rpb24+LCBpLmUuCiAKICAgICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCi0gIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXljaGlwKSwgJmNhcmQpOworICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXljaGlwKSwgJmNhcmQpOwogXV0+CiAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgpAQCAtOTU0LDcgKzk2MCw3IEBACiAKICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgQWZ0ZXIgYWxsb2NhdGluZyBhIGNhcmQgaW5zdGFuY2UgdmlhCi0gICAgICAgICAgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4gKHdpdGgKKyAgICAgICAgICA8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPiAod2l0aAogICAgICAgICAgIDxjb25zdGFudD4wPC9jb25zdGFudD4gb24gdGhlIDR0aCBhcmcpLCBjYWxsCiAgICAgICAgICAgPGZ1bmN0aW9uPmt6YWxsb2MoKTwvZnVuY3Rpb24+LiAKIApAQCAtOTYzLDcgKzk2OSw4IEBACiA8IVtDREFUQVsKICAgc3RydWN0IHNuZF9jYXJkICpjYXJkOwogICBzdHJ1Y3QgbXljaGlwICpjaGlwOwotICBlcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKyAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAwLCAmY2FyZCk7CiAgIC4uLi4uCiAgIGNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogXV0+CkBAIC0xMTcwLDggKzExNzcsNiBAQAogICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KICAgICAgICAgICAqcmNoaXAgPSBjaGlwOwogICAgICAgICAgIHJldHVybiAwOwogICB9ICAgICAgICAKQEAgLTE1MjYsMzAgKzE1MzEsNiBAQAogCiAgICAgPC9zZWN0aW9uPgogCi0gICAgPHNlY3Rpb24gaWQ9InBjaS1yZXNvdXJjZS1kZXZpY2Utc3RydWN0Ij4KLSAgICAgIDx0aXRsZT5SZWdpc3RyYXRpb24gb2YgRGV2aWNlIFN0cnVjdDwvdGl0bGU+Ci0gICAgICA8cGFyYT4KLQlBdCBzb21lIHBvaW50LCB0eXBpY2FsbHkgYWZ0ZXIgY2FsbGluZyA8ZnVuY3Rpb24+c25kX2RldmljZV9uZXcoKTwvZnVuY3Rpb24+LAotCXlvdSBuZWVkIHRvIHJlZ2lzdGVyIHRoZSBzdHJ1Y3QgPHN0cnVjdG5hbWU+ZGV2aWNlPC9zdHJ1Y3RuYW1lPiBvZiB0aGUgY2hpcAotCXlvdSdyZSBoYW5kbGluZyBmb3IgdWRldiBhbmQgY28uICBBTFNBIHByb3ZpZGVzIGEgbWFjcm8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotCW9sZGVyIGtlcm5lbHMuICBTaW1wbHkgY2FsbCBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+Ci0gICAgICAgICAgPHByb2dyYW1saXN0aW5nPgotPCFbQ0RBVEFbCi0gIHNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLV1dPgotICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgotCXNvIHRoYXQgaXQgc3RvcmVzIHRoZSBQQ0kncyBkZXZpY2UgcG9pbnRlciB0byB0aGUgY2FyZC4gIFRoaXMgd2lsbCBiZQotCXJlZmVycmVkIGJ5IEFMU0EgY29yZSBmdW5jdGlvbnMgbGF0ZXIgd2hlbiB0aGUgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZC4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotCUluIHRoZSBjYXNlIG9mIG5vbi1QQ0ksIHBhc3MgdGhlIHByb3BlciBkZXZpY2Ugc3RydWN0IHBvaW50ZXIgb2YgdGhlIEJVUwotCWluc3RlYWQuICAoSW4gdGhlIGNhc2Ugb2YgbGVnYWN5IElTQSB3aXRob3V0IFBuUCwgeW91IGRvbid0IGhhdmUgdG8gZG8KLQlhbnl0aGluZy4pCi0gICAgICA8L3BhcmE+Ci0gICAgPC9zZWN0aW9uPgotCiAgICAgPHNlY3Rpb24gaWQ9InBjaS1yZXNvdXJjZS1lbnRyaWVzIj4KICAgICAgIDx0aXRsZT5QQ0kgRW50cmllczwvdGl0bGU+CiAgICAgICA8cGFyYT4KQEAgLTU3NDAsNyArNTcyMSw4IEBACiAgICAgICAgICAgc3RydWN0IG15Y2hpcCAqY2hpcDsKICAgICAgICAgICBpbnQgZXJyOwogICAgICAgICAgIC4uLi4KLSAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKyAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNhcmQpOwogICAgICAgICAgIC4uLi4KICAgICAgICAgICBjaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKICAgICAgICAgICAuLi4uCkBAIC01NzUyLDcgKzU3MzQsNyBAQAogICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CiAKIAlXaGVuIHlvdSBjcmVhdGVkIHRoZSBjaGlwIGRhdGEgd2l0aAotCTxmdW5jdGlvbj5zbmRfY2FyZF9jcmVhdGUoKTwvZnVuY3Rpb24+LCBpdCdzIGFueXdheSBhY2Nlc3NpYmxlCisJPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4sIGl0J3MgYW55d2F5IGFjY2Vzc2libGUKIAl2aWEgPHN0cnVjdGZpZWxkPnByaXZhdGVfZGF0YTwvc3RydWN0ZmllbGQ+IGZpZWxkLgogCiAgICAgICA8aW5mb3JtYWxleGFtcGxlPgpAQCAtNTc2Niw4ICs1NzQ4LDggQEAKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwOwogICAgICAgICAgIGludCBlcnI7CiAgICAgICAgICAgLi4uLgotICAgICAgICAgIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBteWNoaXApLCAmY2FyZCk7CisgICAgICAgICAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXljaGlwKSwgJmNhcmQpOwogICAgICAgICAgIC4uLi4KICAgICAgICAgICBjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogICAgICAgICAgIC4uLi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUENJL3BjaS1pb3YtaG93dG8udHh0IGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQKaW5kZXggODY1NTFjYy4uMmQ5MWFlMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQKQEAgLTY4LDEwICs2OCw2IEBACiAJZWNobyAgMCA+IFwKICAgICAgICAgL3N5cy9idXMvcGNpL2RldmljZXMvPERPTUFJTjpCVVM6REVWSUNFLkZVTkNUSU9OPi9zcmlvdl9udW12ZnMKIAotVG8gbm90aWZ5IFNSLUlPViBjb3JlIG9mIFZpcnR1YWwgRnVuY3Rpb24gTWlncmF0aW9uOgotKGEpIEluIHRoZSBkcml2ZXI6Ci0JaXJxcmV0dXJuX3QgcGNpX3NyaW92X21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLQogMy4yIFVzYWdlIGV4YW1wbGUKIAogRm9sbG93aW5nIHBpZWNlIG9mIGNvZGUgaWxsdXN0cmF0ZXMgdGhlIHVzYWdlIG9mIHRoZSBTUi1JT1YgQVBJLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvUlRGUC50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9SVEZQLnR4dAppbmRleCAyNzNlNjU0ZC4uMmYwZmNiMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvUlRGUC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvUlRGUC50eHQKQEAgLTMxLDYgKzMxLDE0IEBACiAoSW4gY29udHJhc3QsIGltcGxlbWVudGF0aW9uIG9mIFJDVSBpcyBwZXJtaXR0ZWQgb25seSBpbiBzb2Z0d2FyZSBsaWNlbnNlZAogdW5kZXIgZWl0aGVyIEdQTCBvciBMR1BMLiAgU29ycnkhISEpCiAKK0luIDE5ODcsIFJhc2hpZCBldCBhbC4gZGVzY3JpYmVkIGxhenkgVExCLWZsdXNoIFtSaWNoYXJkUmFzaGlkODdhXS4KK0F0IGZpcnN0IGdsYW5jZSwgdGhpcyBoYXMgbm90aGluZyB0byBkbyB3aXRoIFJDVSwgYnV0IG5ldmVydGhlbGVzcwordGhpcyBwYXBlciBoZWxwZWQgaW5zcGlyZSB0aGUgdXBkYXRlLXNpZGUgYmF0Y2hpbmcgdXNlZCBpbiB0aGUgbGF0ZXIKK1JDVSBpbXBsZW1lbnRhdGlvbiBpbiBEWU5JWC9wdHguICBJbiAxOTg4LCBCYXJiYXJhIExpc2tvdiBwdWJsaXNoZWQKK2EgZGVzY3JpcHRpb24gb2YgQXJndXMgdGhhdCBub3RlZCB0aGF0IHVzZSBvZiBvdXQtb2YtZGF0ZSB2YWx1ZXMgY2FuCitiZSB0b2xlcmF0ZWQgaW4gc29tZSBzaXR1YXRpb25zLiAgVGh1cywgdGhpcyBwYXBlciBwcm92aWRlcyBzb21lIGVhcmx5Cit0aGVvcmV0aWNhbCBqdXN0aWZpY2F0aW9uIGZvciB1c2Ugb2Ygc3RhbGUgZGF0YS4KKwogSW4gMTk5MCwgUHVnaCBbUHVnaDkwXSBub3RlZCB0aGF0IGV4cGxpY2l0bHkgdHJhY2tpbmcgd2hpY2ggdGhyZWFkcwogd2VyZSByZWFkaW5nIGEgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgcGVybWl0dGVkIGRlZmVycmVkIGZyZWUgdG8gb3BlcmF0ZQogaW4gdGhlIHByZXNlbmNlIG9mIG5vbi10ZXJtaW5hdGluZyB0aHJlYWRzLiAgSG93ZXZlciwgdGhpcyBleHBsaWNpdApAQCAtNDEsMTEgKzQ5LDExIEBACiB0byBzZWUgaG93IG11Y2ggb2YgdGhlIHBlcmZvcm1hbmNlIGFkdmFudGFnZSByZXBvcnRlZCBpbiAxOTkwIHJlbWFpbnMKIHRvZGF5LgogCi1BdCBhYm91dCB0aGlzIHNhbWUgdGltZSwgQWRhbXMgW0FkYW1zOTFdIGRlc2NyaWJlZCBgYGNoYW90aWMgcmVsYXhhdGlvbicnLAotd2hlcmUgdGhlIG5vcm1hbCBiYXJyaWVycyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgaXRlcmF0aW9ucyBvZiBjb252ZXJnZW50Ci1udW1lcmljYWwgYWxnb3JpdGhtcyBhcmUgcmVsYXhlZCwgc28gdGhhdCBpdGVyYXRpb24gJG4kIG1pZ2h0IHVzZQotZGF0YSBmcm9tIGl0ZXJhdGlvbiAkbi0xJCBvciBldmVuICRuLTIkLiAgVGhpcyBpbnRyb2R1Y2VzIGVycm9yLAotd2hpY2ggdHlwaWNhbGx5IHNsb3dzIGNvbnZlcmdlbmNlIGFuZCB0aHVzIGluY3JlYXNlcyB0aGUgbnVtYmVyIG9mCitBdCBhYm91dCB0aGlzIHNhbWUgdGltZSwgQW5kcmV3cyBbQW5kcmV3czkxdGV4dGJvb2tdIGRlc2NyaWJlZCBgYGNoYW90aWMKK3JlbGF4YXRpb24nJywgd2hlcmUgdGhlIG5vcm1hbCBiYXJyaWVycyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgaXRlcmF0aW9ucworb2YgY29udmVyZ2VudCBudW1lcmljYWwgYWxnb3JpdGhtcyBhcmUgcmVsYXhlZCwgc28gdGhhdCBpdGVyYXRpb24gJG4kCittaWdodCB1c2UgZGF0YSBmcm9tIGl0ZXJhdGlvbiAkbi0xJCBvciBldmVuICRuLTIkLiAgVGhpcyBpbnRyb2R1Y2VzCitlcnJvciwgd2hpY2ggdHlwaWNhbGx5IHNsb3dzIGNvbnZlcmdlbmNlIGFuZCB0aHVzIGluY3JlYXNlcyB0aGUgbnVtYmVyIG9mCiBpdGVyYXRpb25zIHJlcXVpcmVkLiAgSG93ZXZlciwgdGhpcyBpbmNyZWFzZSBpcyBzb21ldGltZXMgbW9yZSB0aGFuIG1hZGUKIHVwIGZvciBieSBhIHJlZHVjdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZSBiYXJyaWVyIG9wZXJhdGlvbnMsCiB3aGljaCBhcmUgb3RoZXJ3aXNlIHJlcXVpcmVkIHRvIHN5bmNocm9uaXplIHRoZSB0aHJlYWRzIGF0IHRoZSBlbmQKQEAgLTU1LDcgKzYzLDggQEAKIAogSW4gMTk5MiwgSGVucnkgKG5vdyBBbGV4aWEpIE1hc3NhbGluIGNvbXBsZXRlZCBhIGRpc3NlcnRhdGlvbiBhZHZpc2luZwogcGFyYWxsZWwgcHJvZ3JhbW1lcnMgdG8gZGVmZXIgcHJvY2Vzc2luZyB3aGVuIGZlYXNpYmxlIHRvIHNpbXBsaWZ5Ci1zeW5jaHJvbml6YXRpb24uICBSQ1UgbWFrZXMgZXh0cmVtZWx5IGhlYXZ5IHVzZSBvZiB0aGlzIGFkdmljZS4KK3N5bmNocm9uaXphdGlvbiBbSE1hc3NhbGluUGhEXS4gIFJDVSBtYWtlcyBleHRyZW1lbHkgaGVhdnkgdXNlIG9mCit0aGlzIGFkdmljZS4KIAogSW4gMTk5MywgSmFjb2Jzb24gW0phY29ic29uOTNdIHZlcmJhbGx5IGRlc2NyaWJlZCB3aGF0IGlzIHBlcmhhcHMgdGhlCiBzaW1wbGVzdCBkZWZlcnJlZC1mcmVlIHRlY2huaXF1ZTogc2ltcGx5IHdhaXRpbmcgYSBmaXhlZCBhbW91bnQgb2YgdGltZQpAQCAtOTAsMjcgKzk5LDI5IEBACiBzeXN0ZW1zIG1hZGUgcGVydmFzaXZlIHVzZSBvZiBSQ1UgaW4gcGxhY2Ugb2YgImV4aXN0ZW5jZSBsb2NrcyIsIHdoaWNoCiBncmVhdGx5IHNpbXBsaWZpZXMgbG9ja2luZyBoaWVyYXJjaGllcyBhbmQgaGVscHMgYXZvaWQgZGVhZGxvY2tzLgogCi0yMDAxIHNhdyB0aGUgZmlyc3QgUkNVIHByZXNlbnRhdGlvbiBpbnZvbHZpbmcgTGludXggW01jS2VubmV5MDFhXQotYXQgT0xTLiAgVGhlIHJlc3VsdGluZyBhYnVuZGFuY2Ugb2YgUkNVIHBhdGNoZXMgd2FzIHByZXNlbnRlZCB0aGUKLWZvbGxvd2luZyB5ZWFyIFtNY0tlbm5leTAyYV0sIGFuZCB1c2Ugb2YgUkNVIGluIGRjYWNoZSB3YXMgZmlyc3QKLWRlc2NyaWJlZCB0aGF0IHNhbWUgeWVhciBbTGluZGVyMDJhXS4KK1RoZSB5ZWFyIDIwMDAgc2F3IGFuIGVtYWlsIGV4Y2hhbmdlIHRoYXQgd291bGQgbGlrZWx5IGhhdmUKK2xlZCB0byB5ZXQgYW5vdGhlciBpbmRlcGVuZGVudCBpbnZlbnRpb24gb2Ygc29tZXRoaW5nIGxpa2UgUkNVCitbUnVzdHlSdXNzZWxsMjAwMGEsUnVzdHlSdXNzZWxsMjAwMGJdLiAgSW5zdGVhZCwgMjAwMSBzYXcgdGhlIGZpcnN0CitSQ1UgcHJlc2VudGF0aW9uIGludm9sdmluZyBMaW51eCBbTWNLZW5uZXkwMWFdIGF0IE9MUy4gIFRoZSByZXN1bHRpbmcKK2FidW5kYW5jZSBvZiBSQ1UgcGF0Y2hlcyB3YXMgcHJlc2VudGVkIHRoZSBmb2xsb3dpbmcgeWVhciBbTWNLZW5uZXkwMmFdLAorYW5kIHVzZSBvZiBSQ1UgaW4gZGNhY2hlIHdhcyBmaXJzdCBkZXNjcmliZWQgdGhhdCBzYW1lIHllYXIgW0xpbmRlcjAyYV0uCiAKIEFsc28gaW4gMjAwMiwgTWljaGFlbCBbTWljaGFlbDAyYixNaWNoYWVsMDJhXSBwcmVzZW50ZWQgImhhemFyZC1wb2ludGVyIgogdGVjaG5pcXVlcyB0aGF0IGRlZmVyIHRoZSBkZXN0cnVjdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMgdG8gc2ltcGxpZnkKIG5vbi1ibG9ja2luZyBzeW5jaHJvbml6YXRpb24gKHdhaXQtZnJlZSBzeW5jaHJvbml6YXRpb24sIGxvY2stZnJlZQogc3luY2hyb25pemF0aW9uLCBhbmQgb2JzdHJ1Y3Rpb24tZnJlZSBzeW5jaHJvbml6YXRpb24gYXJlIGFsbCBleGFtcGxlcyBvZgotbm9uLWJsb2NraW5nIHN5bmNocm9uaXphdGlvbikuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHRlY2huaXF1ZSBlbGltaW5hdGVzCi1sb2NraW5nLCByZWR1Y2VzIGNvbnRlbnRpb24sIHJlZHVjZXMgbWVtb3J5IGxhdGVuY3kgZm9yIHJlYWRlcnMsIGFuZAotcGFyYWxsZWxpemVzIHBpcGVsaW5lIHN0YWxscyBhbmQgbWVtb3J5IGxhdGVuY3kgZm9yIHdyaXRlcnMuICBIb3dldmVyLAotdGhlc2UgdGVjaG5pcXVlcyBzdGlsbCBpbXBvc2Ugc2lnbmlmaWNhbnQgcmVhZC1zaWRlIG92ZXJoZWFkIGluIHRoZQotZm9ybSBvZiBtZW1vcnkgYmFycmllcnMuICBSZXNlYXJjaGVycyBhdCBTdW4gd29ya2VkIGFsb25nIHNpbWlsYXIgbGluZXMKLWluIHRoZSBzYW1lIHRpbWVmcmFtZSBbSGVybGloeUxNMDJdLiAgVGhlc2UgdGVjaG5pcXVlcyBjYW4gYmUgdGhvdWdodAotb2YgYXMgaW5zaWRlLW91dCByZWZlcmVuY2UgY291bnRzLCB3aGVyZSB0aGUgY291bnQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlCi1udW1iZXIgb2YgaGF6YXJkIHBvaW50ZXJzIHJlZmVyZW5jaW5nIGEgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4KLXRoZSBtb3JlIGNvbnZlbnRpb25hbCBjb3VudGVyIGZpZWxkIHdpdGhpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXRzZWxmLgotVGhlIGtleSBhZHZhbnRhZ2Ugb2YgaW5zaWRlLW91dCByZWZlcmVuY2UgY291bnRzIGlzIHRoYXQgdGhleSBjYW4gYmUKLXN0b3JlZCBpbiBpbW1vcnRhbCB2YXJpYWJsZXMsIHRodXMgYWxsb3dpbmcgcmFjZXMgYmV0d2VlbiBhY2Nlc3MgYW5kCi1kZWxldGlvbiB0byBiZSBhdm9pZGVkLgorbm9uLWJsb2NraW5nIHN5bmNocm9uaXphdGlvbikuICBUaGUgY29ycmVzcG9uZGluZyBqb3VybmFsIGFydGljbGUgYXBwZWFyZWQKK2luIDIwMDQgW01hZ2VkTWljaGFlbDA0YV0uICBUaGlzIHRlY2huaXF1ZSBlbGltaW5hdGVzIGxvY2tpbmcsIHJlZHVjZXMKK2NvbnRlbnRpb24sIHJlZHVjZXMgbWVtb3J5IGxhdGVuY3kgZm9yIHJlYWRlcnMsIGFuZCBwYXJhbGxlbGl6ZXMgcGlwZWxpbmUKK3N0YWxscyBhbmQgbWVtb3J5IGxhdGVuY3kgZm9yIHdyaXRlcnMuICBIb3dldmVyLCB0aGVzZSB0ZWNobmlxdWVzIHN0aWxsCitpbXBvc2Ugc2lnbmlmaWNhbnQgcmVhZC1zaWRlIG92ZXJoZWFkIGluIHRoZSBmb3JtIG9mIG1lbW9yeSBiYXJyaWVycy4KK1Jlc2VhcmNoZXJzIGF0IFN1biB3b3JrZWQgYWxvbmcgc2ltaWxhciBsaW5lcyBpbiB0aGUgc2FtZSB0aW1lZnJhbWUKK1tIZXJsaWh5TE0wMl0uICBUaGVzZSB0ZWNobmlxdWVzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGluc2lkZS1vdXQgcmVmZXJlbmNlCitjb3VudHMsIHdoZXJlIHRoZSBjb3VudCBpcyByZXByZXNlbnRlZCBieSB0aGUgbnVtYmVyIG9mIGhhemFyZCBwb2ludGVycworcmVmZXJlbmNpbmcgYSBnaXZlbiBkYXRhIHN0cnVjdHVyZSByYXRoZXIgdGhhbiB0aGUgbW9yZSBjb252ZW50aW9uYWwKK2NvdW50ZXIgZmllbGQgd2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZSBpdHNlbGYuICBUaGUga2V5IGFkdmFudGFnZQorb2YgaW5zaWRlLW91dCByZWZlcmVuY2UgY291bnRzIGlzIHRoYXQgdGhleSBjYW4gYmUgc3RvcmVkIGluIGltbW9ydGFsCit2YXJpYWJsZXMsIHRodXMgYWxsb3dpbmcgcmFjZXMgYmV0d2VlbiBhY2Nlc3MgYW5kIGRlbGV0aW9uIHRvIGJlIGF2b2lkZWQuCiAKIEJ5IHRoZSBzYW1lIHRva2VuLCBSQ1UgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSAiYnVsayByZWZlcmVuY2UgY291bnQiLAogd2hlcmUgc29tZSBmb3JtIG9mIHJlZmVyZW5jZSBjb3VudGVyIGNvdmVycyBhbGwgcmVmZXJlbmNlIGJ5IGEgZ2l2ZW4gQ1BVCkBAIC0xMjMsOCArMTM0LDEwIEBACiAKIEluIDIwMDMsIHRoZSBLNDIgZ3JvdXAgZGVzY3JpYmVkIGhvdyBSQ1UgY291bGQgYmUgdXNlZCB0byBjcmVhdGUKIGhvdC1wbHVnZ2FibGUgaW1wbGVtZW50YXRpb25zIG9mIG9wZXJhdGluZy1zeXN0ZW0gZnVuY3Rpb25zIFtBcHBhdm9vMDNhXS4KLUxhdGVyIHRoYXQgeWVhciBzYXcgYSBwYXBlciBkZXNjcmliaW5nIGFuIFJDVSBpbXBsZW1lbnRhdGlvbiBvZiBTeXN0ZW0KLVYgSVBDIFtBcmNhbmdlbGkwM10sIGFuZCBhbiBpbnRyb2R1Y3Rpb24gdG8gUkNVIGluIExpbnV4IEpvdXJuYWwKK0xhdGVyIHRoYXQgeWVhciBzYXcgYSBwYXBlciBkZXNjcmliaW5nIGFuIFJDVSBpbXBsZW1lbnRhdGlvbgorb2YgU3lzdGVtIFYgSVBDIFtBcmNhbmdlbGkwM10gKGZvbGxvd2luZyB1cCBvbiBhIHN1Z2dlc3Rpb24gYnkKK0h1Z2ggRGlja2lucyBbRGlja2luczAyYV0gYW5kIGFuIGltcGxlbWVudGF0aW9uIGJ5IE1pbmdtaW5nIENhbworW01pbmdtaW5nQ2FvMjAwMklQQ1JDVV0pLCBhbmQgYW4gaW50cm9kdWN0aW9uIHRvIFJDVSBpbiBMaW51eCBKb3VybmFsCiBbTWNLZW5uZXkwM2FdLgogCiAyMDA0IGhhcyBzZWVuIGEgTGludXgtSm91cm5hbCBhcnRpY2xlIG9uIHVzZSBvZiBSQ1UgaW4gZGNhY2hlCkBAIC0zODMsNiArMzk2LDIxIEBACiB9CiB9CiAKK0BwaGR0aGVzaXN7SE1hc3NhbGluUGhECissYXV0aG9yPSJILiBNYXNzYWxpbiIKKyx0aXRsZT0iU3ludGhlc2lzOiBBbiBFZmZpY2llbnQgSW1wbGVtZW50YXRpb24gb2YgRnVuZGFtZW50YWwgT3BlcmF0aW5nCitTeXN0ZW0gU2VydmljZXMiCissc2Nob29sPSJDb2x1bWJpYSBVbml2ZXJzaXR5IgorLGFkZHJlc3M9Ik5ldyBZb3JrLCBOWSIKKyx5ZWFyPSIxOTkyIgorLGFubm90YXRpb249eworCU1vbmRvIG9wdGltaXppbmcgY29tcGlsZXIuCisJV2FpdC1mcmVlIHN0dWZmLgorCUdvb2QgYWR2aWNlOiBkZWZlciB3b3JrIHRvIGF2b2lkIHN5bmNocm9uaXphdGlvbi4gIFNlZSBwYWdlIDkwCisJCShQREYgcGFnZSAxMDYpLCBTZWN0aW9uIDUuNCwgZm91cnRoIGJ1bGxldCBwb2ludC4KK30KK30KKwogQHVucHVibGlzaGVke0phY29ic29uOTMKICxhdXRob3I9IlZhbiBKYWNvYnNvbiIKICx0aXRsZT0iQXZvaWQgUmVhZC1TaWRlIExvY2tpbmcgVmlhIERlbGF5ZWQgRnJlZSIKQEAgLTY3MSw2ICs2OTksMjAgQEAKIFtWaWV3ZWQgT2N0b2JlciAxOCwgMjAwNF0iCiB9CiAKK0Bjb25mZXJlbmNle01pY2hhZWwwMmIKKyxhdXRob3I9Ik1hZ2VkIE0uIE1pY2hhZWwiCissdGl0bGU9IkhpZ2ggUGVyZm9ybWFuY2UgRHluYW1pYyBMb2NrLUZyZWUgSGFzaCBUYWJsZXMgYW5kIExpc3QtQmFzZWQgU2V0cyIKKyxZZWFyPSIyMDAyIgorLE1vbnRoPSJBdWd1c3QiCissYm9va3RpdGxlPSJ7UHJvY2VlZGluZ3Mgb2YgdGhlIDE0XHRleHRzdXBlcnNjcmlwdHt0aH0gQW5udWFsIEFDTQorU3ltcG9zaXVtIG9uIFBhcmFsbGVsCitBbGdvcml0aG1zIGFuZCBBcmNoaXRlY3R1cmV9IgorLHBhZ2VzPSI3My04MiIKKyxhbm5vdGF0aW9uPXsKK0xpa2UgdGhlIHRpdGxlIHNheXMuLi4KK30KK30KKwogQENvbmZlcmVuY2V7TGluZGVyMDJhCiAsQXV0aG9yPSJIYW5uYSBMaW5kZXIgYW5kIERpcGFua2FyIFNhcm1hIGFuZCBNYW5lZXNoIFNvbmkiCiAsVGl0bGU9IlNjYWxhYmlsaXR5IG9mIHRoZSBEaXJlY3RvcnkgRW50cnkgQ2FjaGUiCkBAIC03MjcsNiArNzY5LDI0IEBACiB9CiB9CiAKK0Bjb25mZXJlbmNle01pY2hhZWwwMmEKKyxhdXRob3I9Ik1hZ2VkIE0uIE1pY2hhZWwiCissdGl0bGU9IlNhZmUgTWVtb3J5IFJlY2xhbWF0aW9uIGZvciBEeW5hbWljIExvY2stRnJlZSBPYmplY3RzIFVzaW5nIEF0b21pYworUmVhZHMgYW5kIFdyaXRlcyIKKyxZZWFyPSIyMDAyIgorLE1vbnRoPSJBdWd1c3QiCissYm9va3RpdGxlPSJ7UHJvY2VlZGluZ3Mgb2YgdGhlIDIxXHRleHRzdXBlcnNjcmlwdHtzdH0gQW5udWFsIEFDTQorU3ltcG9zaXVtIG9uIFByaW5jaXBsZXMgb2YgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nfSIKKyxwYWdlcz0iMjEtMzAiCissYW5ub3RhdGlvbj17CisJRWFjaCB0aHJlYWQga2VlcHMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaXRlbXMgdGhhdCBpdCBpcworCWN1cnJlbnRseSByZWZlcmVuY2luZy4JU29ydCBvZiBhbiBpbnNpZGUtb3V0IGdhcmJhZ2UgY29sbGVjdGlvbgorCW1lY2hhbmlzbSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIHRoZSBhY2Nlc3NpbmcgY29kZSB0byBleHBsaWNpdGx5CisJc3RhdGUgaXRzIG5lZWRzLiAgQWxzbyByZXF1aXJlcyByZWFkLXNpZGUgbWVtb3J5IGJhcnJpZXJzIG9uCisJbW9zdCBhcmNoaXRlY3R1cmVzLgorfQorfQorCiBAdW5wdWJsaXNoZWR7RGlja2luczAyYQogLGF1dGhvcj0iSHVnaCBEaWNraW5zIgogLHRpdGxlPSJVc2UgUkNVIGZvciBTeXN0ZW0tViBJUEMiCkBAIC03MzUsNiArNzk1LDE3IEBACiAsbm90ZT0icHJpdmF0ZSBjb21tdW5pY2F0aW9uIgogfQogCitASW5Qcm9jZWVkaW5nc3tIZXJsaWh5TE0wMgorLGF1dGhvcj17TWF1cmljZSBIZXJsaWh5IGFuZCBWaWN0b3IgTHVjaGFuZ2NvIGFuZCBNYXJrIE1vaXJ9CissdGl0bGU9IlRoZSBSZXBlYXQgT2ZmZW5kZXIgUHJvYmxlbTogQSBNZWNoYW5pc20gZm9yIFN1cHBvcnRpbmcgRHluYW1pYy1TaXplZCwKK0xvY2stRnJlZSBEYXRhIFN0cnVjdHVyZXMiCissYm9va3RpdGxlPXtQcm9jZWVkaW5ncyBvZiAxNlx0ZXh0c3VwZXJzY3JpcHR7dGh9IEludGVybmF0aW9uYWwKK1N5bXBvc2l1bSBvbiBEaXN0cmlidXRlZCBDb21wdXRpbmd9CisseWVhcj0yMDAyCissbW9udGg9Ik9jdG9iZXIiCisscGFnZXM9IjMzOS0zNTMiCit9CisKIEB1bnB1Ymxpc2hlZHtTYXJtYTAyYgogLEF1dGhvcj0iRGlwYW5rYXIgU2FybWEiCiAsVGl0bGU9IlNvbWUgZGNhY2hlXF9yY3UgYmVuY2htYXJrIG51bWJlcnMiCkBAIC03NDksNiArODIwLDE5IEBACiB9CiB9CiAKK0B1bnB1Ymxpc2hlZHtNaW5nbWluZ0NhbzIwMDJJUENSQ1UKKyxBdXRob3I9Ik1pbmdtaW5nIENhbyIKKyxUaXRsZT0iW1BBVENIXXVwZGF0ZWQgaXBjIGxvY2sgcGF0Y2giCissbW9udGg9Ik9jdG9iZXIiCisseWVhcj0iMjAwMiIKKyxub3RlPSJBdmFpbGFibGU6CitcdXJse2h0dHBzOi8vbGttbC5vcmcvbGttbC8yMDAyLzEwLzI0LzI2Mn0KK1tWaWV3ZWQgRmVicnVhcnkgMTUsIDIwMTRdIgorLGFubm90YXRpb249eworCU1pbmdtaW5nIENhbydzIHBhdGNoIHRvIGludHJvZHVjZSBSQ1UgdG8gU3lzViBJUEMuCit9Cit9CisKIEB1bnB1Ymxpc2hlZHtMaW51c1RvcnZhbGRzMjAwM2EKICxBdXRob3I9IkxpbnVzIFRvcnZhbGRzIgogLFRpdGxlPSJSZToge1tQQVRDSF19IHNtYWxsIGZpeGVzIGluIGJybG9jay5oIgpAQCAtOTgyLDYgKzEwNjYsMjMgQEAKIH0KIH0KIAorQGFydGljbGV7TWFnZWRNaWNoYWVsMDRhCissYXV0aG9yPSJNYWdlZCBNLiBNaWNoYWVsIgorLHRpdGxlPSJIYXphcmQgUG9pbnRlcnM6IFNhZmUgTWVtb3J5IFJlY2xhbWF0aW9uIGZvciBMb2NrLUZyZWUgT2JqZWN0cyIKKyxZZWFyPSIyMDA0IgorLE1vbnRoPSJKdW5lIgorLGpvdXJuYWw9IklFRUUgVHJhbnNhY3Rpb25zIG9uIFBhcmFsbGVsIGFuZCBEaXN0cmlidXRlZCBTeXN0ZW1zIgorLHZvbHVtZT0iMTUiCissbnVtYmVyPSI2IgorLHBhZ2VzPSI0OTEtNTA0IgorLHVybD0iQXZhaWxhYmxlOgorXHVybHtodHRwOi8vd3d3LnJlc2VhcmNoLmlibS5jb20vcGVvcGxlL20vbWljaGFlbC9pZWVldHBkcy0yMDA0LnBkZn0KK1tWaWV3ZWQgTWFyY2ggMSwgMjAwNV0iCissYW5ub3RhdGlvbj17CisJTmV3IGNhbm9uaWNhbCBoYXphcmQtcG9pbnRlciBjaXRhdGlvbi4KK30KK30KKwogQHBoZHRoZXNpc3tQYXVsRWR3YXJkTWNLZW5uZXlQaEQKICxhdXRob3I9IlBhdWwgRS4gTWNLZW5uZXkiCiAsdGl0bGU9IkV4cGxvaXRpbmcgRGVmZXJyZWQgRGVzdHJ1Y3Rpb246CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCA5MTI2NjE5Li45ZDEwZDFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTI1NiwxMCArMjU2LDEwIEBACiAJCXZhcmlhdGlvbnMgb24gdGhpcyB0aGVtZS4KIAogCWIuCUxpbWl0aW5nIHVwZGF0ZSByYXRlLiAgRm9yIGV4YW1wbGUsIGlmIHVwZGF0ZXMgb2NjdXIgb25seQotCQlvbmNlIHBlciBob3VyLCB0aGVuIG5vIGV4cGxpY2l0IHJhdGUgbGltaXRpbmcgaXMgcmVxdWlyZWQsCi0JCXVubGVzcyB5b3VyIHN5c3RlbSBpcyBhbHJlYWR5IGJhZGx5IGJyb2tlbi4gIFRoZSBkY2FjaGUKLQkJc3Vic3lzdGVtIHRha2VzIHRoaXMgYXBwcm9hY2ggLS0gdXBkYXRlcyBhcmUgZ3VhcmRlZAotCQlieSBhIGdsb2JhbCBsb2NrLCBsaW1pdGluZyB0aGVpciByYXRlLgorCQlvbmNlIHBlciBob3VyLCB0aGVuIG5vIGV4cGxpY2l0IHJhdGUgbGltaXRpbmcgaXMKKwkJcmVxdWlyZWQsIHVubGVzcyB5b3VyIHN5c3RlbSBpcyBhbHJlYWR5IGJhZGx5IGJyb2tlbi4KKwkJT2xkZXIgdmVyc2lvbnMgb2YgdGhlIGRjYWNoZSBzdWJzeXN0ZW0gdGFrZSB0aGlzIGFwcHJvYWNoLAorCQlndWFyZGluZyB1cGRhdGVzIHdpdGggYSBnbG9iYWwgbG9jaywgbGltaXRpbmcgdGhlaXIgcmF0ZS4KIAogCWMuCVRydXN0ZWQgdXBkYXRlIC0tIGlmIHVwZGF0ZXMgY2FuIG9ubHkgYmUgZG9uZSBtYW51YWxseSBieQogCQlzdXBlcnVzZXIgb3Igc29tZSBvdGhlciB0cnVzdGVkIHVzZXIsIHRoZW4gaXQgbWlnaHQgbm90CkBAIC0yNjgsNyArMjY4LDggQEAKIAkJdGhlIG1hY2hpbmUuCiAKIAlkLglVc2UgY2FsbF9yY3VfYmgoKSByYXRoZXIgdGhhbiBjYWxsX3JjdSgpLCBpbiBvcmRlciB0byB0YWtlCi0JCWFkdmFudGFnZSBvZiBjYWxsX3JjdV9iaCgpJ3MgZmFzdGVyIGdyYWNlIHBlcmlvZHMuCisJCWFkdmFudGFnZSBvZiBjYWxsX3JjdV9iaCgpJ3MgZmFzdGVyIGdyYWNlIHBlcmlvZHMuICAoVGhpcworCQlpcyBvbmx5IGEgcGFydGlhbCBzb2x1dGlvbiwgdGhvdWdoLikKIAogCWUuCVBlcmlvZGljYWxseSBpbnZva2Ugc3luY2hyb25pemVfcmN1KCksIHBlcm1pdHRpbmcgYSBsaW1pdGVkCiAJCW51bWJlciBvZiB1cGRhdGVzIHBlciBncmFjZSBwZXJpb2QuCkBAIC0yNzYsNiArMjc3LDEzIEBACiAJVGhlIHNhbWUgY2F1dGlvbnMgYXBwbHkgdG8gY2FsbF9yY3VfYmgoKSwgY2FsbF9yY3Vfc2NoZWQoKSwKIAljYWxsX3NyY3UoKSwgYW5kIGtmcmVlX3JjdSgpLgogCisJTm90ZSB0aGF0IGFsdGhvdWdoIHRoZXNlIHByaW1pdGl2ZXMgZG8gdGFrZSBhY3Rpb24gdG8gYXZvaWQgbWVtb3J5CisJZXhoYXVzdGlvbiB3aGVuIGFueSBnaXZlbiBDUFUgaGFzIHRvbyBtYW55IGNhbGxiYWNrcywgYSBkZXRlcm1pbmVkCisJdXNlciBjb3VsZCBzdGlsbCBleGhhdXN0IG1lbW9yeS4gIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZQorCWlmIGEgc3lzdGVtIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgQ1BVcyBoYXMgYmVlbiBjb25maWd1cmVkIHRvCisJb2ZmbG9hZCBhbGwgb2YgaXRzIFJDVSBjYWxsYmFja3Mgb250byBhIHNpbmdsZSBDUFUsIG9yIGlmIHRoZQorCXN5c3RlbSBoYXMgcmVsYXRpdmVseSBsaXR0bGUgZnJlZSBtZW1vcnkuCisKIDkuCUFsbCBSQ1UgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlcywgd2hpY2ggaW5jbHVkZQogCXJjdV9kZXJlZmVyZW5jZSgpLCBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSgpLCBhbmQKIAlsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1KCksIG11c3QgYmUgZWl0aGVyIHdpdGhpbiBhbiBSQ1UgcmVhZC1zaWRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybTY0L21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL2FybTY0L21lbW9yeS50eHQKaW5kZXggNWUwNTRiZi4uODVlMjRjNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm02NC9tZW1vcnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYXJtNjQvbWVtb3J5LnR4dApAQCAtMzUsMTEgKzM1LDEzIEBACiAKIGZmZmZmZmJlMDAwMDAwMDAJZmZmZmZmYmZmYmJmZmZmZgkgIH44R0IJCVtndWFyZCwgZnV0dXJlIHZtbWVtYXBdCiAKK2ZmZmZmZmJmZmEwMDAwMDAJZmZmZmZmYmZmYWZmZmZmZgkgIDE2TUIJCVBDSSBJL08gc3BhY2UKKworZmZmZmZmYmZmYjAwMDAwMAlmZmZmZmZiZmZiYmZmZmZmCSAgMTJNQgkJW2d1YXJkXQorCiBmZmZmZmZiZmZiYzAwMDAwCWZmZmZmZmJmZmJkZmZmZmYJICAgMk1CCQllYXJseXByaW50ayBkZXZpY2UKIAotZmZmZmZmYmZmYmUwMDAwMAlmZmZmZmZiZmZiZTBmZmZmCSAgNjRLQgkJUENJIEkvTyBzcGFjZQotCi1mZmZmZmZiZmZiZTEwMDAwCWZmZmZmZmJjZmZmZmZmZmYJICB+Mk1CCQlbZ3VhcmRdCitmZmZmZmZiZmZiZTAwMDAwCWZmZmZmZmJmZmJmZmZmZmYJICAgMk1CCQlbZ3VhcmRdCiAKIGZmZmZmZmJmZmMwMDAwMDAJZmZmZmZmYmZmZmZmZmZmZgkgIDY0TUIJCW1vZHVsZXMKIApAQCAtNjAsMTEgKzYyLDEzIEBACiAKIGZmZmZmZGZlMDAwMDAwMDAJZmZmZmZkZmZmYmJmZmZmZgkgIH44R0IJCVtndWFyZCwgZnV0dXJlIHZtbWVtYXBdCiAKK2ZmZmZmZGZmZmEwMDAwMDAJZmZmZmZkZmZmYWZmZmZmZgkgIDE2TUIJCVBDSSBJL08gc3BhY2UKKworZmZmZmZkZmZmYjAwMDAwMAlmZmZmZmRmZmZiYmZmZmZmCSAgMTJNQgkJW2d1YXJkXQorCiBmZmZmZmRmZmZiYzAwMDAwCWZmZmZmZGZmZmJkZmZmZmYJICAgMk1CCQllYXJseXByaW50ayBkZXZpY2UKIAotZmZmZmZkZmZmYmUwMDAwMAlmZmZmZmRmZmZiZTBmZmZmCSAgNjRLQgkJUENJIEkvTyBzcGFjZQotCi1mZmZmZmRmZmZiZTEwMDAwCWZmZmZmZGZmZmJmZmZmZmYJICB+Mk1CCQlbZ3VhcmRdCitmZmZmZmRmZmZiZTAwMDAwCWZmZmZmZGZmZmJmZmZmZmYJICAgMk1CCQlbZ3VhcmRdCiAKIGZmZmZmZGZmZmMwMDAwMDAJZmZmZmZkZmZmZmZmZmZmZgkgIDY0TUIJCW1vZHVsZXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9kcmJkL2RhdGEtc3RydWN0dXJlLXY5LnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvZHJiZC9kYXRhLXN0cnVjdHVyZS12OS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MmEwZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvZHJiZC9kYXRhLXN0cnVjdHVyZS12OS50eHQKQEAgLTAsMCArMSwzOCBAQAorVGhpcyBkZXNjcmliZXMgdGhlIGluIGtlcm5lbCBkYXRhIHN0cnVjdHVyZSBmb3IgRFJCRC05LiBTdGFydGluZyB3aXRoCitMaW51eCB2My4xNCB3ZSBhcmUgcmVvcmdhbml6aW5nIERSQkQgdG8gdXNlIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCisKK0Jhc2ljIERhdGEgU3RydWN0dXJlCis9PT09PT09PT09PT09PT09PT09PQorCitBIG5vZGUgaGFzIGEgbnVtYmVyIG9mIERSQkQgcmVzb3VyY2VzLiAgRWFjaCBzdWNoIHJlc291cmNlIGhhcyBhIG51bWJlciBvZgorZGV2aWNlcyAoYWthIHZvbHVtZXMpIGFuZCBjb25uZWN0aW9ucyB0byBvdGhlciBub2RlcyAoInBlZXIgbm9kZXMiKS4gRWFjaCBEUkJECitkZXZpY2UgaXMgcmVwcmVzZW50ZWQgYnkgYSBibG9jayBkZXZpY2UgbG9jYWxseS4KKworVGhlIERSQkQgb2JqZWN0cyBhcmUgaW50ZXJjb25uZWN0ZWQgdG8gZm9ybSBhIG1hdHJpeCBhcyBkZXBpY3RlZCBiZWxvdzsgYQorZHJiZF9wZWVyX2RldmljZSBvYmplY3Qgc2l0cyBhdCBlYWNoIGludGVyc2VjdGlvbiBiZXR3ZWVuIGEgZHJiZF9kZXZpY2UgYW5kIGEKK2RyYmRfY29ubmVjdGlvbjoKKworICAvLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy4uLi4uKy0tLS0tLS0tLS0tLS0tLVwKKyAgfCAgIHJlc291cmNlICAgfCAgICBkZXZpY2UgICAgIHwgICAgIHwgICAgZGV2aWNlICAgICB8CisgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLi4uLi4rLS0tLS0tLS0tLS0tLS0tKworICB8ICBjb25uZWN0aW9uICB8ICBwZWVyX2RldmljZSAgfCAgICAgfCAgcGVlcl9kZXZpY2UgIHwKKyAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsuLi4uListLS0tLS0tLS0tLS0tLS0rCisgIDogICAgICAgICAgICAgIDogICAgICAgICAgICAgICA6ICAgICA6ICAgICAgICAgICAgICAgOgorICA6ICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgOiAgICAgOiAgICAgICAgICAgICAgIDoKKyAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsuLi4uListLS0tLS0tLS0tLS0tLS0rCisgIHwgIGNvbm5lY3Rpb24gIHwgIHBlZXJfZGV2aWNlICB8ICAgICB8ICBwZWVyX2RldmljZSAgfAorICBcLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy4uLi4uKy0tLS0tLS0tLS0tLS0tLS8KKworSW4gdGhpcyB0YWJsZSwgaG9yaXpvbnRhbGx5LCBkZXZpY2VzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHJlc291cmNlcyBieSB0aGVpcgordm9sdW1lIG51bWJlci4gIExpa2V3aXNlLCBwZWVyX2RldmljZXMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gY29ubmVjdGlvbnMgYnkKK3RoZWlyIHZvbHVtZSBudW1iZXIuICBPYmplY3RzIGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24gYXJlIGNvbm5lY3RlZCBieSBkb3VibGUKK2xpbmtlZCBsaXN0cy4gIFRoZXJlIGFyZSBiYWNrIHBvaW50ZXJzIGZyb20gcGVlcl9kZXZpY2VzIHRvIHRoZWlyIGNvbm5lY3Rpb25zIGEKK2RldmljZXMsIGFuZCBmcm9tIGNvbm5lY3Rpb25zIGFuZCBkZXZpY2VzIHRvIHRoZWlyIHJlc291cmNlLgorCitBbGwgcmVzb3VyY2VzIGFyZSBpbiB0aGUgZHJiZF9yZXNvdXJjZXMgZG91YmxlLWxpbmtlZCBsaXN0LiAgSW4gYWRkaXRpb24sIGFsbAorZGV2aWNlcyBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlaXIgbWlub3IgZGV2aWNlIG51bWJlciB2aWEgdGhlIGRyYmRfZGV2aWNlcyBpZHIuCisKK1RoZSBkcmJkX3Jlc291cmNlLCBkcmJkX2Nvbm5lY3Rpb24sIGFuZCBkcmJkX2RldmljZSBvYmplY3RzIGFyZSByZWZlcmVuY2UKK2NvdW50ZWQuICBUaGUgcGVlcl9kZXZpY2Ugb2JqZWN0cyBvbmx5IHNlcnZlIHRvIGVzdGFibGlzaCB0aGUgbGlua3MgYmV0d2VlbgorZGV2aWNlcyBhbmQgY29ubmVjdGlvbnM7IHRoZWlyIGxpZmV0aW1lIGlzIGRldGVybWluZWQgYnkgdGhlIGxpZmV0aW1lIG9mIHRoZQorZGV2aWNlIGFuZCBjb25uZWN0aW9uIHdoaWNoIHRoZXkgcmVmZXJlbmNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jIGIvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jCmluZGV4IGFkY2NhMDMuLmQxMmNjOTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29ubmVjdG9yL2NuX3Rlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL2Nvbm5lY3Rvci9jbl90ZXN0LmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJCW1lbWNweShtICsgMSwgZGF0YSwgbS0+bGVuKTsKIAotCQljbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0FUT01JQyk7CisJCWNuX25ldGxpbmtfc2VuZChtLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAkJa2ZyZWUobSk7CiAJfQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAppbmRleCAxMDM3OGNjLi4wODdkMjEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKQEAgLTQxMCw2ICs0MTAsNyBAQAogCQkxOTQgPSAvZGV2L3prc2hpbQlaZXJvLUtub3dsZWRnZSBuZXR3b3JrIHNoaW0gY29udHJvbAogCQkxOTUgPSAvZGV2L2Vsb2dyYXBoaWNzL2UyMjAxCUVsb2dyYXBoaWNzIHRvdWNoc2NyZWVuIEUyNzEtMjIwMQogCQkxOTYgPSAvZGV2L3ZmaW8vdmZpbwlWRklPIHVzZXJzcGFjZSBkcml2ZXIgaW50ZXJmYWNlCisJCTE5NyA9IC9kZXYvcHhhM3h4LWdjdQlQWEEzeHggZ3JhcGhpY3MgY29udHJvbGxlciB1bml0IGRyaXZlcgogCQkxOTggPSAvZGV2L3NleGVjCVNpZ25lZCBleGVjdXRhYmxlIGludGVyZmFjZQogCQkxOTkgPSAvZGV2L3NjYW5uZXJzL2N1ZWNhdCA6Q3VlQ2F0IGJhcmNvZGUgc2Nhbm5lcgogCQkyMDAgPSAvZGV2L25ldC90dW4JVEFQL1RVTiBuZXR3b3JrIGRldmljZQpAQCAtNDUxLDYgKzQ1Miw3IEBACiAJCTIzNiA9IC9kZXYvbWFwcGVyL2NvbnRyb2wJRGV2aWNlLU1hcHBlciBjb250cm9sIGRldmljZQogCQkyMzcgPSAvZGV2L2xvb3AtY29udHJvbCBMb29wYmFjayBjb250cm9sIGRldmljZQogCQkyMzggPSAvZGV2L3Zob3N0LW5ldAlIb3N0IGtlcm5lbCBhY2NlbGVyYXRvciBmb3IgdmlydGlvIG5ldAorCQkyMzkgPSAvZGV2L3VoaWQJCVVzZXItc3BhY2UgSS9PIGRyaXZlciBzdXBwb3J0IGZvciBISUQgc3Vic3lzdGVtCiAKIAkJMjQwLTI1NAkJCVJlc2VydmVkIGZvciBsb2NhbCB1c2UKIAkJMjU1CQkJUmVzZXJ2ZWQgZm9yIE1JU0NfRFlOQU1JQ19NSU5PUgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcm1hZGEtMzcwLXhwLW1waWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcm1hZGEtMzcwLXhwLW1waWMudHh0CmluZGV4IGQ3NDA5MWEuLjVmYzAzMTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtYWRhLTM3MC14cC1tcGljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FybWFkYS0zNzAteHAtbXBpYy50eHQKQEAgLTEsNCArMSw0IEBACi1NYXJ2ZWxsIEFybWFkYSAzNzAgYW5kIEFybWFkYSBYUCBJbnRlcnJ1cHQgQ29udHJvbGxlcgorTWFydmVsbCBBcm1hZGEgMzcwLCAzNzUsIDM4eCwgWFAgSW50ZXJydXB0IENvbnRyb2xsZXIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CkBAIC0xNiw3ICsxNiwxMyBAQAogICBhdXRvbWF0aWNhbGx5IG1hcCB0byB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXJzIG9mIHRoZQogICBjdXJyZW50IENQVSkKIAorT3B0aW9uYWwgcHJvcGVydGllczoKIAorLSBpbnRlcnJ1cHRzOiBJZiBkZWZpbmVkLCB0aGVuIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgTVBJQyBpcworICBjb25uZWN0ZWQgYXMgYSBzbGF2ZSB0byBhbm90aGVyIGludGVycnVwdCBjb250cm9sbGVyLiBUaGlzIGlzCisgIHR5cGljYWxseSB0aGUgY2FzZSBvbiBBcm1hZGEgMzc1IGFuZCBBcm1hZGEgMzh4LCB3aGVyZSB0aGUgTVBJQyBpcworICBjb25uZWN0ZWQgYXMgYSBzbGF2ZSB0byB0aGUgQ29ydGV4LUE5IEdJQy4gVGhlIHByb3ZpZGVkIGludGVycnVwdAorICBpbmRpY2F0ZSB0byB3aGljaCBHSUMgaW50ZXJydXB0IHRoZSBNUElDIG91dHB1dCBpcyBjb25uZWN0ZWQuCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXRtZWwtYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXRtZWwtYWRjLnR4dAppbmRleCBkMTA2MTQ2Li45YTExNzViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2F0bWVsLWFkYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hdG1lbC1hZGMudHh0CkBAIC01LDYgKzUsOSBAQAogICAgIDxjaGlwPiBjYW4gYmUgImF0OTFzYW05MjYwIiwgImF0OTFzYW05ZzQ1IiBvciAiYXQ5MXNhbTl4NSIKICAgLSByZWc6IFNob3VsZCBjb250YWluIEFEQyByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogICAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBJUlEgbGluZSBmb3IgdGhlIEFEQworICAtIGNsb2NrLW5hbWVzOiB0dXBsZSBsaXN0aW5nIGlucHV0IGNsb2NrIG5hbWVzLgorCVJlcXVpcmVkIGVsZW1lbnRzOiAiYWRjX2NsayIsICJhZGNfb3BfY2xrIi4KKyAgLSBjbG9ja3M6IHBoYW5kbGVzIHRvIGlucHV0IGNsb2Nrcy4KICAgLSBhdG1lbCxhZGMtY2hhbm5lbHMtdXNlZDogQml0bWFzayBvZiB0aGUgY2hhbm5lbHMgbXV4ZWQgYW5kIGVuYWJsZSBmb3IgdGhpcwogICAgIGRldmljZQogICAtIGF0bWVsLGFkYy1zdGFydHVwLXRpbWU6IFN0YXJ0dXAgVGltZSBvZiB0aGUgQURDIGluIG1pY3Jvc2Vjb25kcyBhcwpAQCAtNDQsNiArNDcsOCBAQAogCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtYWRjIjsKIAlyZWcgPSA8MHhmZmZiMDAwMCAweDEwMD47CiAJaW50ZXJydXB0cyA9IDwyMCA0PjsKKwljbG9ja3MgPSA8JmFkY19jbGs+LCA8JmFkY19vcF9jbGs+OworCWNsb2NrLW5hbWVzID0gImFkY19jbGsiLCAiYWRjX29wX2NsayI7CiAJYXRtZWwsYWRjLWNoYW5uZWwtYmFzZSA9IDwweDMwPjsKIAlhdG1lbCxhZGMtY2hhbm5lbHMtdXNlZCA9IDwweGZmPjsKIAlhdG1lbCxhZGMtZHJkeS1tYXNrID0gPDB4MTAwMDA+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tYXJ2ZWxsLGRvdmUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tYXJ2ZWxsLGRvdmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21hcnZlbGwsZG92ZS50eHQKQEAgLTAsMCArMSwyMiBAQAorTWFydmVsbCBEb3ZlIFBsYXRmb3JtcyBEZXZpY2UgVHJlZSBCaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQm9hcmRzIHdpdGggYSBNYXJ2ZWxsIERvdmUgU29DIHNoYWxsIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydHk6CistIGNvbXBhdGlibGU6IG11c3QgY29udGFpbiAibWFydmVsbCxkb3ZlIjsKKworKiBHbG9iYWwgQ29uZmlndXJhdGlvbiByZWdpc3RlcnMKKworR2xvYmFsIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIG9mIERvdmUgU29DIGFyZSBzaGFyZWQgYnkgYSBzeXNjb24gbm9kZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogbXVzdCBjb250YWluICJtYXJ2ZWxsLGRvdmUtZ2xvYmFsLWNvbmZpZyIgYW5kICJzeXNjb24iLgorLSByZWc6IGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgR2xvYmFsIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorCitFeGFtcGxlOgorCitnY29uZjogZ2xvYmFsLWNvbmZpZ0BlODAyYyB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGRvdmUtZ2xvYmFsLWNvbmZpZyIsICJzeXNjb24iOworCXJlZyA9IDwweGU4MDJjIDB4MTQ+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYWhjaS1wbGF0Zm9ybS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FoY2ktcGxhdGZvcm0udHh0CmluZGV4IDg5ZGUxNTYuLjQ4YjI4NWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYWhjaS1wbGF0Zm9ybS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2F0YS9haGNpLXBsYXRmb3JtLnR4dApAQCAtNCwxNyArNCwzMyBAQAogRWFjaCBTQVRBIGNvbnRyb2xsZXIgc2hvdWxkIGhhdmUgaXRzIG93biBub2RlLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlICAgICAgICA6IGNvbXBhdGlibGUgbGlzdCwgY29udGFpbnMgInNucHMsc3BlYXItYWhjaSIKKy0gY29tcGF0aWJsZSAgICAgICAgOiBjb21wYXRpYmxlIGxpc3QsIG9uZSBvZiAic25wcyxzcGVhci1haGNpIiwKKyAgICAgICAgICAgICAgICAgICAgICAic25wcyxleHlub3M1NDQwLWFoY2kiLCAiaWJtLDQ3Nmd0ci1haGNpIiwKKyAgICAgICAgICAgICAgICAgICAgICAiYWxsd2lubmVyLHN1bjRpLWExMC1haGNpIiwgImZzbCxpbXg1My1haGNpIgorICAgICAgICAgICAgICAgICAgICAgICJmc2wsaW14NnEtYWhjaSIgb3IgInNucHMsZHdjLWFoY2kiCiAtIGludGVycnVwdHMgICAgICAgIDogPGludGVycnVwdCBtYXBwaW5nIGZvciBTQVRBIElSUT4KIC0gcmVnICAgICAgICAgICAgICAgOiA8cmVnaXN0ZXJzIG1hcHBpbmc+CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGRtYS1jb2hlcmVudCAgICAgIDogUHJlc2VudCBpZiBkbWEgb3BlcmF0aW9ucyBhcmUgY29oZXJlbnQKKy0gY2xvY2tzICAgICAgICAgICAgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBwYWlycworLSB0YXJnZXQtc3VwcGx5ICAgICA6IHJlZ3VsYXRvciBmb3IgU0FUQSB0YXJnZXQgcG93ZXIKIAotRXhhbXBsZToKKyJmc2wsaW14NTMtYWhjaSIsICJmc2wsaW14NnEtYWhjaSIgcmVxdWlyZWQgcHJvcGVydGllczoKKy0gY2xvY2tzICAgICAgICAgICAgOiBtdXN0IGNvbnRhaW4gdGhlIHNhdGEsIHNhdGFfcmVmIGFuZCBhaGIgY2xvY2tzCistIGNsb2NrLW5hbWVzICAgICAgIDogbXVzdCBjb250YWluICJhaGIiIGZvciB0aGUgYWhiIGNsb2NrCisKK0V4YW1wbGVzOgogICAgICAgICBzYXRhQGZmZTA4MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJzbnBzLHNwZWFyLWFoY2kiOwogCQlyZWcgPSA8MHhmZmUwODAwMCAweDEwMDA+OwogCQlpbnRlcnJ1cHRzID0gPDExNT47Ci0KICAgICAgICAgfTsKKworCWFoY2k6IHNhdGFAMDFjMTgwMDAgeworCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtYWhjaSI7CisJCXJlZyA9IDwweDAxYzE4MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8NTY+OworCQljbG9ja3MgPSA8JnBsbDYgMD4sIDwmYWhiX2dhdGVzIDI1PjsKKwkJdGFyZ2V0LXN1cHBseSA9IDwmcmVnX2FoY2lfNXY+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FwbS14Z2VuZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FwbS14Z2VuZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjZmJmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYXBtLXhnZW5lLnR4dApAQCAtMCwwICsxLDc2IEBACisqIEFQTSBYLUdlbmUgNi4wIEdiL3MgU0FUQSBob3N0IGNvbnRyb2xsZXIgbm9kZXMKKworU0FUQSBob3N0IGNvbnRyb2xsZXIgbm9kZXMgYXJlIGRlZmluZWQgdG8gZGVzY3JpYmUgb24tY2hpcCBTZXJpYWwgQVRBCitjb250cm9sbGVycy4gRWFjaCBTQVRBIGNvbnRyb2xsZXIgKHBhaXIgb2YgcG9ydHMpIGhhdmUgaXRzIG93biBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IFNoYWxsIGNvbnRhaW46CisgICogImFwbSx4Z2VuZS1haGNpIgorLSByZWcJCQk6IEZpcnN0IG1lbW9yeSByZXNvdXJjZSBzaGFsbCBiZSB0aGUgQUhDSSBtZW1vcnkKKwkJCSAgcmVzb3VyY2UuCisJCQkgIFNlY29uZCBtZW1vcnkgcmVzb3VyY2Ugc2hhbGwgYmUgdGhlIGhvc3QgY29udHJvbGxlcgorCQkJICBjb3JlIG1lbW9yeSByZXNvdXJjZS4KKwkJCSAgVGhpcmQgbWVtb3J5IHJlc291cmNlIHNoYWxsIGJlIHRoZSBob3N0IGNvbnRyb2xsZXIKKwkJCSAgZGlhZ25vc3RpYyBtZW1vcnkgcmVzb3VyY2UuCisJCQkgIDR0aCBtZW1vcnkgcmVzb3VyY2Ugc2hhbGwgYmUgdGhlIGhvc3QgY29udHJvbGxlcgorCQkJICBBWEkgbWVtb3J5IHJlc291cmNlLgorCQkJICA1dGggb3B0aW9uYWwgbWVtb3J5IHJlc291cmNlIHNoYWxsIGJlIHRoZSBob3N0CisJCQkgIGNvbnRyb2xsZXIgTVVYIG1lbW9yeSByZXNvdXJjZSBpZiByZXF1aXJlZC4KKy0gaW50ZXJydXB0cwkJOiBJbnRlcnJ1cHQtc3BlY2lmaWVyIGZvciBTQVRBIGhvc3QgY29udHJvbGxlciBJUlEuCistIGNsb2NrcwkJOiBSZWZlcmVuY2UgdG8gdGhlIGNsb2NrIGVudHJ5LgorLSBwaHlzCQkJOiBBIGxpc3Qgb2YgcGhhbmRsZXMgKyBwaHktc3BlY2lmaWVycywgb25lIGZvciBlYWNoCisJCQkgIGVudHJ5IGluIHBoeS1uYW1lcy4KKy0gcGh5LW5hbWVzCQk6IFNob3VsZCBjb250YWluOgorICAqICJzYXRhLXBoeSIgZm9yIHRoZSBTQVRBIDYuMEdicHMgUEhZCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHN0YXR1cwkJOiBTaGFsbCBiZSAib2siIGlmIGVuYWJsZWQgb3IgImRpc2FibGVkIiBpZiBkaXNhYmxlZC4KKwkJCSAgRGVmYXVsdCBpcyAib2siLgorCitFeGFtcGxlOgorCQlzYXRhY2xrOiBzYXRhY2xrIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEwMDAwMDAwMD47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2F0YWNsayI7CisJCX07CisKKwkJcGh5MjogcGh5QDFmMjJhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyMmEwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCX07CisKKwkJcGh5MzogcGh5QDFmMjNhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyM2EwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCX07CisKKwkJc2F0YTI6IHNhdGFAMWE0MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaSI7CisJCQlyZWcgPSA8MHgwIDB4MWE0MDAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMjAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMmQwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMmUwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMjcwMDAgMHgwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDg3IDB4ND47CisJCQlzdGF0dXMgPSAib2siOworCQkJY2xvY2tzID0gPCZzYXRhY2xrIDA+OworCQkJcGh5cyA9IDwmcGh5MiAwPjsKKwkJCXBoeS1uYW1lcyA9ICJzYXRhLXBoeSI7CisJCX07CisKKwkJc2F0YTM6IHNhdGFAMWE4MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaS1wY2llIjsKKwkJCXJlZyA9IDwweDAgMHgxYTgwMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzZDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzZTAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzNzAwMCAweDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4ODggMHg0PjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCQljbG9ja3MgPSA8JnNhdGFjbGsgMD47CisJCQlwaHlzID0gPCZwaHkzIDA+OworCQkJcGh5LW5hbWVzID0gInNhdGEtcGh5IjsKKwkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncmFwaC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3JhcGgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3JhcGgudHh0CkBAIC0wLDAgKzEsMTI5IEBACitDb21tb24gYmluZGluZ3MgZm9yIGRldmljZSBncmFwaHMKKworR2VuZXJhbCBjb25jZXB0CistLS0tLS0tLS0tLS0tLS0KKworVGhlIGhpZXJhcmNoaWNhbCBvcmdhbmlzYXRpb24gb2YgdGhlIGRldmljZSB0cmVlIGlzIHdlbGwgc3VpdGVkIHRvIGRlc2NyaWJlCitjb250cm9sIGZsb3cgdG8gZGV2aWNlcywgYnV0IHRoZXJlIGNhbiBiZSBtb3JlIGNvbXBsZXggY29ubmVjdGlvbnMgYmV0d2VlbgorZGV2aWNlcyB0aGF0IHdvcmsgdG9nZXRoZXIgdG8gZm9ybSBhIGxvZ2ljYWwgY29tcG91bmQgZGV2aWNlLCBmb2xsb3dpbmcgYW4KK2FyYml0cmFyaWx5IGNvbXBsZXggZ3JhcGguCitUaGVyZSBhbHJlYWR5IGlzIGEgc2ltcGxlIGRpcmVjdGVkIGdyYXBoIGJldHdlZW4gZGV2aWNlcyB0cmVlIG5vZGVzIHVzaW5nCitwaGFuZGxlIHByb3BlcnRpZXMgcG9pbnRpbmcgdG8gb3RoZXIgbm9kZXMgdG8gZGVzY3JpYmUgY29ubmVjdGlvbnMgdGhhdAorY2FuIG5vdCBiZSBpbmZlcnJlZCBmcm9tIGRldmljZSB0cmVlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiBUaGUgZGV2aWNlCit0cmVlIGdyYXBoIGJpbmRpbmdzIGRlc2NyaWJlZCBoZXJlaW4gYWJzdHJhY3QgbW9yZSBjb21wbGV4IGRldmljZXMgdGhhdCBjYW4KK2hhdmUgbXVsdGlwbGUgc3BlY2lmaWFibGUgcG9ydHMsIGVhY2ggb2Ygd2hpY2ggY2FuIGJlIGxpbmtlZCB0byBvbmUgb3IgbW9yZQorcG9ydHMgb2Ygb3RoZXIgZGV2aWNlcy4KKworVGhlc2UgY29tbW9uIGJpbmRpbmdzIGRvIG5vdCBjb250YWluIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlyZWN0aW9uIG9yCit0eXBlIG9mIHRoZSBjb25uZWN0aW9ucywgdGhleSBqdXN0IG1hcCB0aGVpciBleGlzdGVuY2UuIFNwZWNpZmljIHByb3BlcnRpZXMKK21heSBiZSBkZXNjcmliZWQgYnkgc3BlY2lhbGl6ZWQgYmluZGluZ3MgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGNvbm5lY3Rpb24uCisKK1RvIHNlZSBob3cgdGhpcyBiaW5kaW5nIGFwcGxpZXMgdG8gdmlkZW8gcGlwZWxpbmVzLCBmb3IgZXhhbXBsZSwgc2VlCitEb2N1bWVudGF0aW9uL2RldmljZS10cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvLWludGVyZmFjZXMudHh0LgorSGVyZSB0aGUgcG9ydHMgZGVzY3JpYmUgZGF0YSBpbnRlcmZhY2VzLCBhbmQgdGhlIGxpbmtzIGJldHdlZW4gdGhlbSBhcmUKK3RoZSBjb25uZWN0aW5nIGRhdGEgYnVzZXMuIEEgc2luZ2xlIHBvcnQgd2l0aCBtdWx0aXBsZSBjb25uZWN0aW9ucyBjYW4KK2NvcnJlc3BvbmQgdG8gbXVsdGlwbGUgZGV2aWNlcyBiZWluZyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGh5c2ljYWwgYnVzLgorCitPcmdhbmlzYXRpb24gb2YgcG9ydHMgYW5kIGVuZHBvaW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUG9ydHMgYXJlIGRlc2NyaWJlZCBieSBjaGlsZCAncG9ydCcgbm9kZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Ugbm9kZS4KK0VhY2ggcG9ydCBub2RlIGNvbnRhaW5zIGFuICdlbmRwb2ludCcgc3Vibm9kZSBmb3IgZWFjaCByZW1vdGUgZGV2aWNlIHBvcnQKK2Nvbm5lY3RlZCB0byB0aGlzIHBvcnQuIElmIGEgc2luZ2xlIHBvcnQgaXMgY29ubmVjdGVkIHRvIG1vcmUgdGhhbiBvbmUKK3JlbW90ZSBkZXZpY2UsIGFuICdlbmRwb2ludCcgY2hpbGQgbm9kZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIGxpbmsuCitJZiBtb3JlIHRoYW4gb25lIHBvcnQgaXMgcHJlc2VudCBpbiBhIGRldmljZSBub2RlIG9yIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKK2VuZHBvaW50IGF0IGEgcG9ydCwgb3IgYSBwb3J0IG5vZGUgbmVlZHMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2VsZWN0ZWQKK2hhcmR3YXJlIGludGVyZmFjZSwgYSBjb21tb24gc2NoZW1lIHVzaW5nICcjYWRkcmVzcy1jZWxscycsICcjc2l6ZS1jZWxscycKK2FuZCAncmVnJyBwcm9wZXJ0aWVzIGlzIHVzZWQgbnVtYmVyIHRoZSBub2Rlcy4KKworZGV2aWNlIHsKKyAgICAgICAgLi4uCisgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OworICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKworICAgICAgICBwb3J0QDAgeworCSAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcmVnID0gPDA+OworCisgICAgICAgICAgICAgICAgZW5kcG9pbnRAMCB7CisJCQlyZWcgPSA8MD47CisJCQkuLi4KKwkJfTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludEAxIHsKKwkJCXJlZyA9IDwxPjsKKwkJCS4uLgorCQl9OworICAgICAgICB9OworCisgICAgICAgIHBvcnRAMSB7CisJCXJlZyA9IDwxPjsKKworCQllbmRwb2ludCB7IC4uLiB9OworCX07Cit9OworCitBbGwgJ3BvcnQnIG5vZGVzIGNhbiBiZSBncm91cGVkIHVuZGVyIGFuIG9wdGlvbmFsICdwb3J0cycgbm9kZSwgd2hpY2gKK2FsbG93cyB0byBzcGVjaWZ5ICNhZGRyZXNzLWNlbGxzLCAjc2l6ZS1jZWxscyBwcm9wZXJ0aWVzIGZvciB0aGUgJ3BvcnQnCitub2RlcyBpbmRlcGVuZGVudGx5IGZyb20gYW55IG90aGVyIGNoaWxkIGRldmljZSBub2RlcyBhIGRldmljZSBtaWdodAoraGF2ZS4KKworZGV2aWNlIHsKKyAgICAgICAgLi4uCisgICAgICAgIHBvcnRzIHsKKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKyAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKworICAgICAgICAgICAgICAgIHBvcnRAMCB7CisgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50QDAgeyAuLi4gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50QDEgeyAuLi4gfTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgcG9ydEAxIHsgLi4uIH07CisgICAgICAgIH07Cit9OworCitMaW5rcyBiZXR3ZWVuIGVuZHBvaW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRWFjaCBlbmRwb2ludCBzaG91bGQgY29udGFpbiBhICdyZW1vdGUtZW5kcG9pbnQnIHBoYW5kbGUgcHJvcGVydHkgdGhhdCBwb2ludHMKK3RvIHRoZSBjb3JyZXNwb25kaW5nIGVuZHBvaW50IGluIHRoZSBwb3J0IG9mIHRoZSByZW1vdGUgZGV2aWNlLiBJbiB0dXJuLCB0aGUKK3JlbW90ZSBlbmRwb2ludCBzaG91bGQgY29udGFpbiBhICdyZW1vdGUtZW5kcG9pbnQnIHByb3BlcnR5LiBJZiBpdCBoYXMgb25lLAoraXQgbXVzdCBub3QgcG9pbnQgdG8gYW5vdGhlciB0aGFuIHRoZSBsb2NhbCBlbmRwb2ludC4gVHdvIGVuZHBvaW50cyB3aXRoIHRoZWlyCisncmVtb3RlLWVuZHBvaW50JyBwaGFuZGxlcyBwb2ludGluZyBhdCBlYWNoIG90aGVyIGZvcm0gYSBsaW5rIGJldHdlZW4gdGhlCitjb250YWluaW5nIHBvcnRzLgorCitkZXZpY2UtMSB7CisgICAgICAgIHBvcnQgeworICAgICAgICAgICAgICAgIGRldmljZV8xX291dHB1dDogZW5kcG9pbnQgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWVuZHBvaW50ID0gPCZkZXZpY2VfMl9pbnB1dD47CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKK307CisKK2RldmljZS0yIHsKKyAgICAgICAgcG9ydCB7CisgICAgICAgICAgICAgICAgZGV2aWNlXzJfaW5wdXQ6IGVuZHBvaW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS1lbmRwb2ludCA9IDwmZGV2aWNlXzFfb3V0cHV0PjsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9OworfTsKKworCitSZXF1aXJlZCBwcm9wZXJ0aWVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgJ3BvcnQnIG9yIG1vcmUgdGhhbiBvbmUgJ2VuZHBvaW50JyBub2RlIG9yICdyZWcnCitwcm9wZXJ0eSBpcyBwcmVzZW50IGluIHBvcnQgYW5kL29yIGVuZHBvaW50IG5vZGVzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcworYXJlIHJlcXVpcmVkIGluIGEgcmVsZXZhbnQgcGFyZW50IG5vZGU6CisKKyAtICNhZGRyZXNzLWNlbGxzIDogbnVtYmVyIG9mIGNlbGxzIHJlcXVpcmVkIHRvIGRlZmluZSBwb3J0L2VuZHBvaW50CisgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIsIHNob3VsZCBiZSAxLgorIC0gI3NpemUtY2VsbHMgICAgOiBzaG91bGQgYmUgemVyby4KKworT3B0aW9uYWwgZW5kcG9pbnQgcHJvcGVydGllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIHJlbW90ZS1lbmRwb2ludDogcGhhbmRsZSB0byBhbiAnZW5kcG9pbnQnIHN1Ym5vZGUgb2YgYSByZW1vdGUgZGV2aWNlIG5vZGUuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dAppbmRleCAxYTFhYzJlLi5mNDdlNTZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CkBAIC0xOCw2ICsxOCw3IEBACiBhdG1lbCxhdDk3c2MzMjA0dAlpMmMgdHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUgKFRQTSkKIGNhcGVsbGEsY20zMjE4MQkJQ00zMjE4MTogQW1iaWVudCBMaWdodCBTZW5zb3IKIGNhdGFseXN0LDI0YzMyCQlpMmMgc2VyaWFsIGVlcHJvbQorY2lycnVzLGNzNDJsNTEJCUNpcnJ1cyBMb2dpYyBDUzQyTDUxIGF1ZGlvIGNvZGVjCiBkYWxsYXMsZHMxMzA3CQk2NCB4IDgsIFNlcmlhbCwgSTJDIFJlYWwtVGltZSBDbG9jawogZGFsbGFzLGRzMTMzOAkJSTJDIFJUQyB3aXRoIDU2LUJ5dGUgTlYgUkFNCiBkYWxsYXMsZHMxMzM5CQlJMkMgU2VyaWFsIFJlYWwtVGltZSBDbG9jawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdmY2MTAtYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3ZmNjEwLWFkYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYmZmMTkyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdmY2MTAtYWRjLnR4dApAQCAtMCwwICsxLDIyIEBACitGcmVlc2NhbGUgdmY2MTAgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydGVyIGJpbmRpbmdzCisKK1RoZSBkZXZpY2V0cmVlIGJpbmRpbmdzIGFyZSBmb3IgdGhlIG5ldyBBREMgZHJpdmVyIHdyaXR0ZW4gZm9yCit2ZjYxMC9pLk1YNnNseCBhbmQgdXB3YXJkIFNvQ3MgZnJvbSBGcmVlc2NhbGUuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBjb250YWluICJmc2wsdmY2MTAtYWRjIgorLSByZWc6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gdGhlIGludGVycnVwdCBmb3IgdGhlIGRldmljZQorLSBjbG9ja3M6IFRoZSBjbG9jayBpcyBuZWVkZWQgYnkgdGhlIEFEQyBjb250cm9sbGVyLCBBREMgY2xvY2sgc291cmNlIGlzIGlwZyBjbG9jay4KKy0gY2xvY2stbmFtZXM6IE11c3QgY29udGFpbiAiYWRjIiwgbWF0Y2hpbmcgZW50cnkgaW4gdGhlIGNsb2NrcyBwcm9wZXJ0eS4KKy0gdnJlZi1zdXBwbHk6IFRoZSByZWd1bGF0b3Igc3VwcGx5IEFEQyByZWZyZW5jZSB2b2x0YWdlLgorCitFeGFtcGxlOgorYWRjMDogYWRjQDQwMDNiMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCx2ZjYxMC1hZGMiOworCXJlZyA9IDwweDQwMDNiMDAwIDB4MTAwMD47CisJaW50ZXJydXB0cyA9IDwwIDUzIDB4MDQ+OworCWNsb2NrcyA9IDwmY2xrcyBWRjYxMF9DTEtfQURDMD47CisJY2xvY2stbmFtZXMgPSAiYWRjIjsKKwl2cmVmLXN1cHBseSA9IDwmcmVnX3ZjY18zdjNfbWN1PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy94aWxpbngteGFkYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy94aWxpbngteGFkYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllZTkwOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3hpbGlueC14YWRjLnR4dApAQCAtMCwwICsxLDExMyBAQAorWGlsaW54IFhBREMgZGV2aWNlIGRyaXZlcgorCitUaGlzIGJpbmRpbmcgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBiaW5kaW5ncyBmb3IgYm90aCBvZiB0aGVtIHNpbmNlIHRoZQorYmluZGluZ3MgYXJlIHZlcnkgc2ltaWxhci4gVGhlIFhpbGlueCBYQURDIGlzIGEgQURDIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZQorc2VyaWVzIDcgRlBHQXMgZnJvbSBYaWxpbnguIFRoZSBYQURDIGhhcyBhIERSUCBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpb24uCitDdXJyZW50bHkgdHdvIGRpZmZlcmVudCBmcm9udGVuZHMgZm9yIHRoZSBEUlAgaW50ZXJmYWNlIGV4aXN0LiBPbmUgdGhhdCBpcyBvbmx5CithdmFpbGFibGUgb24gdGhlIFpZTlEgZmFtaWx5IGFzIGEgaGFyZG1hY3JvIGluIHRoZSBTb0MgcG9ydGlvbiBvZiB0aGUgWllOUS4gVGhlCitvdGhlciBvbmUgaXMgYXZhaWxhYmxlIG9uIGFsbCBzZXJpZXMgNyBwbGF0Zm9ybXMgYW5kIGlzIGEgc29mdG1hY3JvIHdpdGggYSBBWEkKK2ludGVyZmFjZS4gVGhpcyBiaW5kaW5nIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgYmluZGluZ3MgZm9yIGJvdGggb2YgdGhlbSBzaW5jZQordGhlIGJpbmRpbmdzIGFyZSB2ZXJ5IHNpbWlsYXIuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisJLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mCisJCSogInhsbngsenlucS14YWRjLTEuMDAuYSI6IFdoZW4gdXNpbmcgdGhlIFpZTlEgZGV2aWNlCisJCSAgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgdG8gaW50ZXJmYWNlIHRvIHRoZSBYQURDIGhhcmRtYWNyby4KKwkJKiAieGxueCxheGkteGFkYy0xLjAwLmEiOiBXaGVuIHVzaW5nIHRoZSBheGkteGFkYyBwY29yZSB0bworCQkgIGludGVyZmFjZSB0byB0aGUgWEFEQyBoYXJkbWFjcm8uCisJLSByZWc6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCisJLSBpbnRlcnJ1cHRzOiBJbnRlcnJ1cHQgZm9yIHRoZSBYQURDIGNvbnRyb2wgaW50ZXJmYWNlLgorCS0gY2xvY2tzOiBXaGVuIHVzaW5nIHRoZSBaWU5RIHRoaXMgbXVzdCBiZSB0aGUgWllOUSBQQ0FQIGNsb2NrLAorCSAgd2hlbiB1c2luZyB0aGUgQVhJLVhBREMgcGNvcmUgdGhpcyBtdXN0IGJlIHRoZSBjbG9jayB0aGF0IHByb3ZpZGVzIHRoZQorCSAgY2xvY2sgdG8gdGhlIEFYSSBidXMgaW50ZXJmYWNlIG9mIHRoZSBjb3JlLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCS0gaW50ZXJydXB0LXBhcmVudDogcGhhbmRsZSB0byB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyCisJLSB4bG54LGV4dGVybmFsLW11eDoKKwkJKiAibm9uZSI6IE5vIGV4dGVybmFsIG11bHRpcGxleGVyIGlzIHVzZWQsIHRoaXMgaXMgdGhlIGRlZmF1bHQKKwkJICBpZiB0aGUgcHJvcGVydHkgaXMgb21pdHRlZC4KKwkJKiAic2luZ2xlIjogRXh0ZXJuYWwgbXVsdGlwbGV4ZXIgbW9kZSBpcyB1c2VkIHdpdGggb25lCisJCSAgIG11bHRpcGxleGVyLgorCQkqICJkdWFsIjogRXh0ZXJuYWwgbXVsdGlwbGV4ZXIgbW9kZSBpcyB1c2VkIHdpdGggdHdvCisJCSAgbXVsdGlwbGV4ZXJzIGZvciBzaW11bHRhbmVvdXMgc2FtcGxpbmcuCisJLSB4bG54LGV4dGVybmFsLW11eC1jaGFubmVsOiBDb25maWd1cmVzIHdoaWNoIHBhaXIgb2YgcGlucyBpcyB1c2VkIHRvCisJICBzYW1wbGUgZGF0YSBpbiBleHRlcm5hbCBtdXggbW9kZS4KKwkgIFZhbGlkIHZhbHVlcyBmb3Igc2luZ2xlIGV4dGVybmFsIG11bHRpcGxleGVyIG1vZGUgYXJlOgorCQkwOiBWUC9WTgorCQkxOiBWQVVYUFswXS9WQVVYTlswXQorCQkyOiBWQVVYUFsxXS9WQVVYTlsxXQorCQkuLi4KKwkJMTY6IFZBVVhQWzE1XS9WQVVYTlsxNV0KKwkgIFZhbGlkIHZhbHVlcyBmb3IgZHVhbCBleHRlcm5hbCBtdWx0aXBsZXhlciBtb2RlIGFyZToKKwkJMTogVkFVWFBbMF0vVkFVWE5bMF0gLSBWQVVYUFs4XS9WQVVYTls4XQorCQkyOiBWQVVYUFsxXS9WQVVYTlsxXSAtIFZBVVhQWzldL1ZBVVhOWzldCisJCS4uLgorCQk4OiBWQVVYUFs3XS9WQVVYTls3XSAtIFZBVVhQWzE1XS9WQVVYTlsxNV0KKworCSAgVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBwcmVzZW50IGlmIHRoZSBkZXZpY2UgaXMgY29uZmlndXJlZCBmb3IKKwkgIGV4dGVybmFsIG11bHRpcGxleGVyIG1vZGUgKGVpdGhlciBzaW5nbGUgb3IgZHVhbCkuIElmIHRoZSBkZXZpY2UgaXMKKwkgIG5vdCB1c2luZyBleHRlcm5hbCBtdWx0aXBsZXhlciBtb2RlIHRoZSBwcm9wZXJ0eSBpcyBpZ25vcmVkLgorCS0geG5seCxjaGFubmVsczogTGlzdCBvZiBleHRlcm5hbCBjaGFubmVscyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIEFEQworCSAgUmVxdWlyZWQgcHJvcGVydGllczoKKwkJKiAjYWRkcmVzcy1jZWxsczogU2hvdWxkIGJlIDEuCisJCSogI3NpemUtY2VsbHM6IFNob3VsZCBiZSAwLgorCisJICBUaGUgY2hpbGQgbm9kZXMgb2YgdGhpcyBub2RlIHJlcHJlc2VudCB0aGUgZXh0ZXJuYWwgY2hhbm5lbHMgd2hpY2ggYXJlCisJICBjb25uZWN0ZWQgdG8gdGhlIEFEQy4gSWYgdGhlIHByb3BlcnR5IGlzIG5vIHByZXNlbnQgbm8gZXh0ZXJuYWwKKwkgIGNoYW5uZWxzIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBjb25uZWN0ZWQuCisKKwkgIEVhY2ggY2hpbGQgbm9kZSByZXByZXNlbnRzIG9uZSBjaGFubmVsIGFuZCBoYXMgdGhlIGZvbGxvd2luZworCSAgcHJvcGVydGllczoKKwkJUmVxdWlyZWQgcHJvcGVydGllczoKKwkJCSogcmVnOiBQYWlyIG9mIHBpbnMgdGhlIHRoZSBjaGFubmVsIGlzIGNvbm5lY3RlZCB0by4KKwkJCQkwOiBWUC9WTgorCQkJCTE6IFZBVVhQWzBdL1ZBVVhOWzBdCisJCQkJMjogVkFVWFBbMV0vVkFVWE5bMV0KKwkJCQkuLi4KKwkJCQkxNjogVkFVWFBbMTVdL1ZBVVhOWzE1XQorCQkJICBOb3RlIGVhY2ggY2hhbm5lbCBudW1iZXIgc2hvdWxkIG9ubHkgYmUgdXNlZCBhdCBtb3N0CisJCQkgIG9uY2UuCisJCU9wdGlvbmFsIHByb3BlcnRpZXM6CisJCQkqIHhsbngsYmlwb2xhcjogSWYgc2V0IHRoZSBjaGFubmVsIGlzIHVzZWQgaW4gYmlwb2xhcgorCQkJICBtb2RlLgorCisKK0V4YW1wbGVzOgorCXhhZGNAZjgwMDcxMDAgeworCQljb21wYXRpYmxlID0gInhsbngsenlucS14YWRjLTEuMDAuYSI7CisJCXJlZyA9IDwweGY4MDA3MTAwIDB4MjA+OworCQlpbnRlcnJ1cHRzID0gPDAgNyA0PjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwkJY2xvY2tzID0gPCZwY2FwX2Nsaz47CisKKwkJeGxueCxjaGFubmVscyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2hhbm5lbEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQl9OworCQkJY2hhbm5lbEAxIHsKKwkJCQlyZWcgPSA8MT47CisJCQl9OworCQkJY2hhbm5lbEA4IHsKKwkJCQlyZWcgPSA8OD47CisJCQl9OworCQl9OworCX07CisKKwl4YWRjQDQzMjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJ4bG54LGF4aS14YWRjLTEuMDAuYSI7CisJCXJlZyA9IDwweDQzMjAwMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MCA1MyA0PjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwkJY2xvY2tzID0gPCZmcGdhMV9jbGs+OworCisJCXhsbngsY2hhbm5lbHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNoYW5uZWxAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXhsbngsYmlwb2xhcjsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FsbHdpbm5lcixzdW40aS1pYy50eHQKaW5kZXggMzJjZWM0Yi4uYjI5MGNhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FsbHdpbm5lcixzdW40aS1pYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FsbHdpbm5lcixzdW40aS1pYy50eHQKQEAgLTIsNyArMiw3IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLWljIgorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIgogLSByZWcgOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMuCiAtIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgogLSAjaW50ZXJydXB0LWNlbGxzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgpAQCAtMTEsNyArMTEsNyBAQAogRXhhbXBsZToKIAogaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXIgewotCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWljIjsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtaWMiOwogCXJlZyA9IDwweDAxYzIwNDAwIDB4NDAwPjsKIAlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FsbHdpbm5lcixzdW42N2ktc2Mtbm1pLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNjdpLXNjLW5taS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNWNkYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNjdpLXNjLW5taS50eHQKQEAgLTAsMCArMSwyNyBAQAorQWxsd2lubmVyIFN1bnhpIE5NSSBDb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNjLW5taSIgb3IKKyAgImFsbHdpbm5lcixzdW42aS1hMzEtc2Mtbm1pIgorLSByZWcgOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMuCistIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorICBpbnRlcnJ1cHQgc291cmNlLiBUaGUgdmFsdWUgc2hhbGwgYmUgMi4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIElSUSBudW1iZXIsIHRoZQorICBzZWNvbmQgY2VsbCB0aGUgdHJpZ2dlciB0eXBlIGFzIGRlZmluZWQgaW4gaW50ZXJydXB0LnR4dCBpbiB0aGlzIGRpcmVjdG9yeS4KKy0gaW50ZXJydXB0LXBhcmVudDogU3BlY2lmaWVzIHRoZSBwYXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXIuCistIGludGVycnVwdHM6IFNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGxpbmUgKE5NSSkgd2hpY2ggaXMgaGFuZGxlZCBieQorICB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gdGhlIHBhcmVudCBjb250cm9sbGVyJ3Mgbm90YXRpb24uIFRoaXMgdmFsdWUKKyAgc2hhbGwgYmUgdGhlIE5NSS4KKworRXhhbXBsZToKKworc2Mtbm1pLWludGNAMDFjMDAwMzAgeworCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1zYy1ubWkiOworCWludGVycnVwdC1jb250cm9sbGVyOworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJcmVnID0gPDB4MDFjMDAwMzAgMHgwYz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwlpbnRlcnJ1cHRzID0gPDAgMCA0PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvaWZjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvZnNsL2lmYy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9pZmMudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL2ZzbC9pZmMudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL3RpLWFlbWlmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvdGktYWVtaWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTI3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL3RpLWFlbWlmLnR4dApAQCAtMCwwICsxLDIxMCBAQAorKiBEZXZpY2UgdHJlZSBiaW5kaW5ncyBmb3IgVGV4YXMgaW5zdHJ1bWVudHMgQUVNSUYgY29udHJvbGxlcgorCitUaGUgQXN5bmMgRXh0ZXJuYWwgTWVtb3J5IEludGVyZmFjZSAoRU1JRjE2L0FFTUlGKSBjb250cm9sbGVyIGlzIGludGVuZGVkIHRvCitwcm92aWRlIGEgZ2x1ZS1sZXNzIGludGVyZmFjZSB0byBhIHZhcmlldHkgb2YgYXN5bmNocm9ub3VzIG1lbW9yeSBkZXZpY2VzIGxpa2UKK0FTUkEgTSwgTk9SIGFuZCBOQU5EIG1lbW9yeS4gQSB0b3RhbCBvZiAyNTZNIGJ5dGVzIG9mIGFueSBvZiB0aGVzZSBtZW1vcmllcworY2FuIGJlIGFjY2Vzc2VkIGF0IGFueSBnaXZlbiB0aW1lIHZpYSBmb3VyIGNoaXAgc2VsZWN0cyB3aXRoIDY0TSBieXRlIGFjY2VzcworcGVyIGNoaXAgc2VsZWN0LiBTeW5jaHJvbm91cyBtZW1vcmllcyBzdWNoIGFzIEREUjEgU0QgUkFNLCBTRFIgU0RSQU0KK2FuZCBNb2JpbGUgU0RSIGFyZSBub3Qgc3VwcG9ydGVkLgorCitEb2N1bWVudGF0aW9uOgorRGF2aW5jaSBETTY0NnggLSBodHRwOi8vd3d3LnRpLmNvbS9saXQvdWcvc3BydWVxN2Mvc3BydWVxN2MucGRmCitPTUFQLUwxMzggKERBODUwKSAtIGh0dHA6Ly93d3cudGkuY29tL2xpdC91Zy9zcHJ1aDc3YS9zcHJ1aDc3YS5wZGYKK0tlc3RvbmUgLSBodHRwOi8vd3d3LnRpLmNvbS9saXQvdWcvc3BydWd6M2Evc3BydWd6M2EucGRmCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZToJCSJ0aSxkYXZpbmNpLWFlbWlmIgorCQkJInRpLGtleXN0b25lLWFlbWlmIgorCQkJInRpLGRhODUwLWFlbWlmIgorCistIHJlZzoJCQljb250YWlucyBvZmZzZXQvbGVuZ3RoIHZhbHVlIGZvciBBRU1JRiBjb250cm9sIHJlZ2lzdGVycworCQkJc3BhY2UuCisKKy0gI2FkZHJlc3MtY2VsbHM6CU11c3QgYmUgMi4gVGhlIHBhcnRpdGlvbiBudW1iZXIgaGFzIHRvIGJlIGVuY29kZWQgaW4gdGhlCisJCQlmaXJzdCBhZGRyZXNzIGNlbGwgYW5kIGl0IG1heSBhY2NlcHQgdmFsdWVzIDAuLk4tMQorCQkJKE4gLSB0b3RhbCBudW1iZXIgb2YgcGFydGl0aW9ucykuIEl0J3MgcmVjb21tZW5kZWQgdG8KKwkJCWFzc2lnbiBOLTEgbnVtYmVyIGZvciB0aGUgY29udHJvbCBwYXJ0aXRpb24uIFRoZSBzZWNvbmQKKwkJCWNlbGwgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBwYXJ0aXRpb24uCisKKy0gI3NpemUtY2VsbHM6CQlNdXN0IGJlIHNldCB0byAxLgorCistIHJhbmdlczoJCUNvbnRhaW5zIG1lbW9yeSByZWdpb25zLiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mCisJCQlyYW5nZXMvcGFydGl0aW9uczoKKwkJCS0gQ1Mtc3BlY2lmaWMgcGFydGl0aW9uL3JhbmdlLiBJZiBjb250aW51b3VzLCBtdXN0IGJlCisJCQlzZXQgdXAgdG8gcmVmbGVjdCB0aGUgbWVtb3J5IGxheW91dCBmb3IgNCBjaGlwc2VsZWN0cywKKwkJCWlmIG5vdCB0aGVuIGFkZGl0aW9uYWwgcmFuZ2UvcGFydGl0aW9uIGNhbiBiZSBhZGRlZCBhbmQKKwkJCWNoaWxkIGRldmljZSBjYW4gc2VsZWN0IHRoZSBwcm9wZXIgb25lLgorCQkJLSBjb250cm9sIHBhcnRpdGlvbiB3aGljaCBpcyBjb21tb24gZm9yIGFsbCBDUworCQkJaW50ZXJmYWNlcy4KKworLSBjbG9ja3M6CQl0aGUgY2xvY2sgZmVlZGluZyB0aGUgY29udHJvbGxlciBjbG9jay4gUmVxdWlyZWQgb25seQorCQkJaWYgY2xvY2sgdHJlZSBkYXRhIHByZXNlbnQgaW4gZGV2aWNlIHRyZWUuCisJCQlTZWUgY2xvY2stYmluZGluZ3MudHh0CisKKy0gY2xvY2stbmFtZXM6CQljbG9jayBuYW1lLiBJdCBoYXMgdG8gYmUgImFlbWlmIi4gUmVxdWlyZWQgb25seSBpZiBjbG9jaworCQkJdHJlZSBkYXRhIHByZXNlbnQgaW4gZGV2aWNlIHRyZWUsIGluIGFub3RoZXIgY2FzZSBkb24ndAorCQkJdXNlIGl0LgorCQkJU2VlIGNsb2NrLWJpbmRpbmdzLnR4dAorCistIGNsb2NrLXJhbmdlczoJCUVtcHR5IHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCBjaGlsZCBub2RlcyBjYW4gaW5oZXJpdAorCQkJbmFtZWQgY2xvY2tzLiBSZXF1aXJlZCBvbmx5IGlmIGNsb2NrIHRyZWUgZGF0YSBwcmVzZW50CisJCQlpbiBkZXZpY2UgdHJlZS4KKwkJCVNlZSBjbG9jay1iaW5kaW5ncy50eHQKKworCitDaGlsZCBjaGlwLXNlbGVjdCAoY3MpIG5vZGVzIGNvbnRhaW4gdGhlIG1lbW9yeSBkZXZpY2VzIG5vZGVzIGNvbm5lY3RlZCB0bworc3VjaCBhcyBOT1IgKGUuZy4gY2ZpLWZsYXNoKSBhbmQgTkFORCAodGksZGF2aW5jaS1uYW5kLCBzZWUgZGF2aW5jaS1uYW5kLnR4dCkuCitUaGVyZSBtaWdodCBiZSBib2FyZCBzcGVjaWZpYyBkZXZpY2VzIGxpa2UgRlBHQXMuCisKK1JlcXVpcmVkIGNoaWxkIGNzIG5vZGUgcHJvcGVydGllczoKKworLSAjYWRkcmVzcy1jZWxsczoJTXVzdCBiZSAyLgorCistICNzaXplLWNlbGxzOgkJTXVzdCBiZSAxLgorCistIHJhbmdlczoJCUVtcHR5IHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCBjaGlsZCBub2RlcyBjYW4gaW5oZXJpdAorCQkJbWVtb3J5IGxheW91dC4KKworLSBjbG9jay1yYW5nZXM6CQlFbXB0eSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgY2hpbGQgbm9kZXMgY2FuIGluaGVyaXQKKwkJCW5hbWVkIGNsb2Nrcy4gUmVxdWlyZWQgb25seSBpZiBjbG9jayB0cmVlIGRhdGEgcHJlc2VudAorCQkJaW4gZGV2aWNlIHRyZWUuCisKKy0gdGksY3MtY2hpcHNlbGVjdDoJbnVtYmVyIG9mIGNoaXBzZWxlY3QuIEluZGljYXRlcyBvbiB0aGUgYWVtaWYgZHJpdmVyCisJCQl3aGljaCBjaGlwc2VsZWN0IGlzIHVzZWQgZm9yIGFjY2Vzc2luZyB0aGUgbWVtb3J5LiBGb3IKKwkJCWNvbXBhdGlibGVzICJ0aSxkYXZpbmNpLWFlbWlmIiBhbmQgInRpLGtleXN0b25lLWFlbWlmIgorCQkJaXQgY2FuIGJlIGluIHJhbmdlIFswLTNdLiBGb3IgY29tcGF0aWJsZQorCQkJInRpLGRhODUwLWFlbWlmIiByYW5nZSBpcyBbMi01XS4KKworT3B0aW9uYWwgY2hpbGQgY3Mgbm9kZSBwcm9wZXJ0aWVzOgorCistIHRpLGNzLWJ1cy13aWR0aDoJCXdpZHRoIG9mIHRoZSBhc3luY2hyb25vdXMgZGV2aWNlJ3MgZGF0YSBidXMKKwkJCQk4IG9yIDE2IGlmIG5vdCBwcmVzZXQgOAorCistIHRpLGNzLXNlbGVjdC1zdHJvYmUtbW9kZToJZW5hYmxlL2Rpc2FibGUgc2VsZWN0IHN0cm9iZSBtb2RlCisJCQkJSW4gc2VsZWN0IHN0cm9iZSBtb2RlIGNoaXAgc2VsZWN0IGJlaGF2ZXMgYXMKKwkJCQl0aGUgc3Ryb2JlIGFuZCBpcyBhY3RpdmUgb25seSBkdXJpbmcgdGhlIHN0cm9iZQorCQkJCXBlcmlvZC4gSWYgcHJlc2VudCB0aGVuIGVuYWJsZS4KKworLSB0aSxjcy1leHRlbmRlZC13YWl0LW1vZGU6CWVuYWJsZS9kaXNhYmxlIGV4dGVuZGVkIHdhaXQgbW9kZQorCQkJCWlmIHNldCwgdGhlIGNvbnRyb2xsZXIgbW9uaXRvcnMgdGhlIEVNSUZXQUlUIHBpbgorCQkJCW1hcHBlZCB0byB0aGF0IGNoaXAgc2VsZWN0IHRvIGRldGVybWluZSBpZiB0aGUKKwkJCQlkZXZpY2Ugd2FudHMgdG8gZXh0ZW5kIHRoZSBzdHJvYmUgcGVyaW9kLiBJZgorCQkJCXByZXNlbnQgdGhlbiBlbmFibGUuCisKKy0gdGksY3MtbWluLXR1cm5hcm91bmQtbnM6CW1pbmltdW0gdHVybiBhcm91bmQgdGltZSwgbnMKKwkJCQlUaW1lIGJldHdlZW4gdGhlIGVuZCBvZiBvbmUgYXN5bmNocm9ub3VzIG1lbW9yeQorCQkJCWFjY2VzcyBhbmQgdGhlIHN0YXJ0IG9mIGFub3RoZXIgYXN5bmNocm9ub3VzCisJCQkJbWVtb3J5IGFjY2Vzcy4gVGhpcyBkZWxheSBpcyBub3QgaW5jdXJyZWQKKwkJCQliZXR3ZWVuIGEgcmVhZCBmb2xsb3dlZCBieSByZWFkIG9yIGEgd3JpdGUKKwkJCQlmb2xsb3dlZCBieSBhIHdyaXRlIHRvIHNhbWUgY2hpcCBzZWxlY3QuCisKKy0gdGksY3MtcmVhZC1zZXR1cC1uczoJCXJlYWQgc2V0dXAgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgYSBtZW1vcnkgY3ljbGUKKwkJCQlhbmQgdGhlIGFjdGl2YXRpb24gb2YgcmVhZCBzdHJvYmUuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKKy0gdGksY3MtcmVhZC1zdHJvYmUtbnM6CQlyZWFkIHN0cm9iZSB3aWR0aCwgbnMKKwkJCQlUaW1lIGJldHdlZW4gdGhlIGFjdGl2YXRpb24gYW5kIGRlYWN0aXZhdGlvbiBvZgorCQkJCXRoZSByZWFkIHN0cm9iZS4KKwkJCQlNaW5pbXVtIHZhbHVlIGlzIDEgKDAgdHJlYXRlZCBhcyAxKS4KKworLSB0aSxjcy1yZWFkLWhvbGQtbnM6CQlyZWFkIGhvbGQgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBkZWFjdGl2YXRpb24gb2YgdGhlIHJlYWQKKwkJCQlzdHJvYmUgYW5kIHRoZSBlbmQgb2YgdGhlIGN5Y2xlICh3aGljaCBtYXkgYmUKKwkJCQllaXRoZXIgYW4gYWRkcmVzcyBjaGFuZ2Ugb3IgdGhlIGRlYWN0aXZhdGlvbiBvZgorCQkJCXRoZSBjaGlwIHNlbGVjdCBzaWduYWwuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKKy0gdGksY3Mtd3JpdGUtc2V0dXAtbnM6CQl3cml0ZSBzZXR1cCB3aWR0aCwgbnMKKwkJCQlUaW1lIGJldHdlZW4gdGhlIGJlZ2lubmluZyBvZiBhIG1lbW9yeSBjeWNsZQorCQkJCWFuZCB0aGUgYWN0aXZhdGlvbiBvZiB3cml0ZSBzdHJvYmUuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKKy0gdGksY3Mtd3JpdGUtc3Ryb2JlLW5zOgl3cml0ZSBzdHJvYmUgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gb2YKKwkJCQl0aGUgd3JpdGUgc3Ryb2JlLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXdyaXRlLWhvbGQtbnM6CQl3cml0ZSBob2xkIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgZGVhY3RpdmF0aW9uIG9mIHRoZSB3cml0ZQorCQkJCXN0cm9iZSBhbmQgdGhlIGVuZCBvZiB0aGUgY3ljbGUgKHdoaWNoIG1heSBiZQorCQkJCWVpdGhlciBhbiBhZGRyZXNzIGNoYW5nZSBvciB0aGUgZGVhY3RpdmF0aW9uIG9mCisJCQkJdGhlIGNoaXAgc2VsZWN0IHNpZ25hbC4KKwkJCQlNaW5pbXVtIHZhbHVlIGlzIDEgKDAgdHJlYXRlZCBhcyAxKS4KKworSWYgYW55IG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBhYnNlbnQsIGN1cnJlbnQgcGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgdGFrZW4KK2Zyb20gdGhlIGNvcnJlc3BvbmRpbmcgSFcgcmVnLgorCitFeGFtcGxlIGZvciBhZW1pZiwgZGF2aW5jaSBuYW5kIGFuZCBub3IgZmxhc2ggY2hpcCBzZWxlY3Qgc2hvd24gYmVsb3cuCisKK21lbW9yeS1jb250cm9sbGVyQDIxMDAwQTAwIHsKKwljb21wYXRpYmxlID0gInRpLGRhdmluY2ktYWVtaWYiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNsb2NrcyA9IDwmY2xrYWVtaWYgMD47CisJY2xvY2stbmFtZXMgPSAiYWVtaWYiOworCWNsb2NrLXJhbmdlczsKKwlyZWcgPSA8MHgyMTAwMEEwMCAweDAwMDAwMTAwPjsKKwlyYW5nZXMgPSA8MCAwIDB4NzAwMDAwMDAgMHgxMDAwMDAwMAorCQkgIDEgMCAweDIxMDAwQTAwIDB4MDAwMDAxMDA+OworCQkgIC8qCisJCSAgICogUGFydGl0aW9uMDogQ1Mtc3BlY2lmaWMgbWVtb3J5IHJhbmdlIHdoaWNoIGlzCisJCSAgICogaW1wbGVtZW50ZWQgYXMgY29udGludW91cyBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uCisJCSAgICogUGFydGl0aW9uMTogY29udHJvbCBtZW1vcnkgcmFuZ2UKKwkJICAgKi8KKworCW5hbmQ6Y3MyIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljbG9jay1yYW5nZXM7CisJCXJhbmdlczsKKworCQl0aSxjcy1jaGlwc2VsZWN0ID0gPDI+OworCQkvKiBhbGwgdGltaW5ncyBpbiBuYW5vc2Vjb25kcyAqLworCQl0aSxjcy1taW4tdHVybmFyb3VuZC1ucyA9IDwwPjsKKwkJdGksY3MtcmVhZC1ob2xkLW5zID0gPDc+OworCQl0aSxjcy1yZWFkLXN0cm9iZS1ucyA9IDw0Mj47CisJCXRpLGNzLXJlYWQtc2V0dXAtbnMgPSA8MTQ+OworCQl0aSxjcy13cml0ZS1ob2xkLW5zID0gPDc+OworCQl0aSxjcy13cml0ZS1zdHJvYmUtbnMgPSA8NDI+OworCQl0aSxjcy13cml0ZS1zZXR1cC1ucyA9IDwxND47CisKKwkJbmFuZEAwLDB4ODAwMDAwMCB7CisJCQljb21wYXRpYmxlID0gInRpLGRhdmluY2ktbmFuZCI7CisJCQlyZWcgPSA8MCAweDgwMDAwMDAgMHg0MDAwMDAwCisJCQkgICAgICAgMSAweDAwMDAwMDAgMHgwMDAwMTAwPjsKKwkJCS8qCisJCQkgKiBQYXJ0aXRpb24wLCBvZmZzZXQgMHg4MDAwMDAwLCBzaXplIDB4NDAwMDAwMAorCQkJICogUGFydGl0aW9uMSwgb2Zmc2V0IDB4MDAwMDAwMCwgc2l6ZSAweDAwMDAxMDAKKwkJCSAqLworCisJCQkuLiBzZWUgZGF2aW5jaS1uYW5kLnR4dAorCQl9OworCX07CisKKwlub3I6Y3MwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljbG9jay1yYW5nZXM7CisJCXJhbmdlczsKKworCQl0aSxjcy1jaGlwc2VsZWN0ID0gPDA+OworCQkvKiBhbGwgdGltaW5ncyBpbiBuYW5vc2Vjb25kcyAqLworCQl0aSxjcy1taW4tdHVybmFyb3VuZC1ucyA9IDwwPjsKKwkJdGksY3MtcmVhZC1ob2xkLW5zID0gPDg+OworCQl0aSxjcy1yZWFkLXN0cm9iZS1ucyA9IDw0MD47CisJCXRpLGNzLXJlYWQtc2V0dXAtbnMgPSA8MTQ+OworCQl0aSxjcy13cml0ZS1ob2xkLW5zID0gPDc+OworCQl0aSxjcy13cml0ZS1zdHJvYmUtbnMgPSA8NDA+OworCQl0aSxjcy13cml0ZS1zZXR1cC1ucyA9IDwxND47CisJCXRpLGNzLWJ1cy13aWR0aCA9IDwxNj47CisKKwkJZmxhc2hAMCwweDAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMHgwMDAwMDAwIDB4NDAwMDAwMD47CisKKwkJCS4uLgorCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zMm1wYTAxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcGEwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZDNkOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcGEwMS50eHQKQEAgLTAsMCArMSw5MCBAQAorCisqIFNhbXN1bmcgUzJNUEEwMSBWb2x0YWdlIGFuZCBDdXJyZW50IFJlZ3VsYXRvcgorCitUaGUgU2Ftc3VuZyBTMk1QQTAxIGlzIGEgbXVsdGktZnVuY3Rpb24gZGV2aWNlIHdoaWNoIGluY2x1ZGVzIGhpZ2gKK2VmZmljaWVuY3kgYnVjayBjb252ZXJ0ZXJzIGluY2x1ZGluZyBEdWFsLVBoYXNlIGJ1Y2sgY29udmVydGVyLCB2YXJpb3VzIExET3MsCithbmQgYW4gUlRDLiBJdCBpcyBpbnRlcmZhY2VkIHRvIHRoZSBob3N0IGNvbnRyb2xsZXIgdXNpbmcgYW4gSTJDIGludGVyZmFjZS4KK0VhY2ggc3ViLWJsb2NrIGlzIGFkZHJlc3NlZCBieSB0aGUgaG9zdCBzeXN0ZW0gdXNpbmcgZGlmZmVyZW50IEkyQyBzbGF2ZQorYWRkcmVzc2VzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInNhbXN1bmcsczJtcGEwMS1wbWljIi4KKy0gcmVnOiBTcGVjaWZpZXMgdGhlIEkyQyBzbGF2ZSBhZGRyZXNzIG9mIHRoZSBQTUlDIGJsb2NrLiBJdCBzaG91bGQgYmUgMHg2Ni4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gaW50ZXJydXB0LXBhcmVudDogU3BlY2lmaWVzIHRoZSBwaGFuZGxlIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0byB3aGljaAorICB0aGUgaW50ZXJydXB0cyBmcm9tIHMybXBhMDEgYXJlIGRlbGl2ZXJlZCB0by4KKy0gaW50ZXJydXB0czogQW4gaW50ZXJydXB0IHNwZWNpZmllciBmb3IgdGhlIHNvbGUgaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUKKyAgZGV2aWNlLgorCitPcHRpb25hbCBub2RlczoKKy0gcmVndWxhdG9yczogVGhlIHJlZ3VsYXRvcnMgb2YgczJtcGEwMSB0aGF0IGhhdmUgdG8gYmUgaW5zdGFudGlhdGVkIHNob3VsZCBiZQorICBpbmNsdWRlZCBpbiBhIHN1Yi1ub2RlIG5hbWVkICdyZWd1bGF0b3JzJy4gUmVndWxhdG9yIG5vZGVzIGFuZCBjb25zdHJhaW50cworICBpbmNsdWRlZCBpbiB0aGlzIHN1Yi1ub2RlIHVzZSB0aGUgc3RhbmRhcmQgcmVndWxhdG9yIGJpbmRpbmdzIHdoaWNoIGFyZQorICBkb2N1bWVudGVkIGVsc2V3aGVyZS4KKworUHJvcGVydGllcyBmb3IgQlVDSyByZWd1bGF0b3Igbm9kZXM6CistIHJlZ3VsYXRvci1yYW1wLWRlbGF5OiByYW1wIGRlbGF5IGluIHVWL3VzLiBNYXkgYmUgNjI1MCwgMTI1MDAKKyAgKGRlZmF1bHQpLCAyNTAwMCwgb3IgNTAwMDAuIE1heSBiZSAwIGZvciBkaXNhYmxpbmcgdGhlIHJhbXAgZGVsYXkgb24KKyAgQlVDS3sxLDIsMyw0fS4KKworIEluIHRoZSBhYnNlbmNlIG9mIHRoZSByZWd1bGF0b3ItcmFtcC1kZWxheSBwcm9wZXJ0eSwgdGhlIGRlZmF1bHQgcmFtcAorIGRlbGF5IHdpbGwgYmUgdXNlZC4KKworICBOT1RFOiBTb21lIEJVQ0tzIHNoYXJlIHRoZSByYW1wIHJhdGUgc2V0dGluZyBpLmUuIHNhbWUgcmFtcCB2YWx1ZSB3aWxsIGJlIHNldAorICBmb3IgYSBwYXJ0aWN1bGFyIGdyb3VwIG9mIEJVQ0tzLiBTbyBwcm92aWRlIHNhbWUgcmVndWxhdG9yLXJhbXAtZGVsYXk9PHZhbHVlPi4KKworICBUaGUgZm9sbG93aW5nIEJVQ0tzIHNoYXJlIHJhbXAgc2V0dGluZ3M6CisgICogMSBhbmQgNgorICAqIDIgYW5kIDQKKyAgKiA4LCA5LCBhbmQgMTAKKworVGhlIGZvbGxvd2luZyBhcmUgdGhlIG5hbWVzIG9mIHRoZSByZWd1bGF0b3JzIHRoYXQgdGhlIHMybXBhMDEgUE1JQyBibG9jaworc3VwcG9ydHMuIE5vdGU6IFRoZSAnbicgaW4gTERPbiBhbmQgQlVDS24gcmVwcmVzZW50cyB0aGUgTERPIG9yIEJVQ0sgbnVtYmVyCithcyBwZXIgdGhlIGRhdGFzaGVldCBvZiBzMm1wYTAxLgorCisJLSBMRE9uCisJCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gMjYKKwkJICAtIEV4YW1wbGU6IExETzEsIExEMDIsIExETzI2CisJLSBCVUNLbgorCQkgIC0gdmFsaWQgdmFsdWVzIGZvciBuIGFyZSAxIHRvIDEwLgorCQkgIC0gRXhhbXBsZTogQlVDSzEsIEJVQ0syLCBCVUNLOQorCitFeGFtcGxlOgorCisJczJtcGEwMV9wbWljQDY2IHsKKwkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMybXBhMDEtcG1pYyI7CisJCXJlZyA9IDwweDY2PjsKKworCQlyZWd1bGF0b3JzIHsKKwkJCWxkbzFfcmVnOiBMRE8xIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJWRERfQUxJVkUiOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEwMDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEwMDAwMDA+OworCQkJfTsKKworCQkJbGRvMl9yZWc6IExETzIgeworCQkJCXJlZ3VsYXRvci1uYW1lID0gIlZERFFfTU1DMiI7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MjgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MjgwMDAwMD47CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCWJ1Y2sxX3JlZzogQlVDSzEgeworCQkJCXJlZ3VsYXRvci1uYW1lID0gInZkZF9taWYiOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDk1MDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTM1MDAwMD47CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCX07CisKKwkJCWJ1Y2syX3JlZzogQlVDSzIgeworCQkJCXJlZ3VsYXRvci1uYW1lID0gInZkZF9hcm0iOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDk1MDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTM1MDAwMD47CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDw1MDAwMD47CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBzMTEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zMm1wczExLnR4dAppbmRleCAxNWVlODljM2MuLmY2OWJlYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcHMxMS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zMm1wczExLnR4dApAQCAtMSw1ICsxLDUgQEAKIAotKiBTYW1zdW5nIFMyTVBTMTEgVm9sdGFnZSBhbmQgQ3VycmVudCBSZWd1bGF0b3IKKyogU2Ftc3VuZyBTMk1QUzExIGFuZCBTMk1QUzE0IFZvbHRhZ2UgYW5kIEN1cnJlbnQgUmVndWxhdG9yCiAKIFRoZSBTYW1zdW5nIFMyTVBTMTEgaXMgYSBtdWx0aS1mdW5jdGlvbiBkZXZpY2Ugd2hpY2ggaW5jbHVkZXMgdm9sdGFnZSBhbmQKIGN1cnJlbnQgcmVndWxhdG9ycywgUlRDLCBjaGFyZ2VyIGNvbnRyb2xsZXIgYW5kIG90aGVyIHN1Yi1ibG9ja3MuIEl0IGlzCkBAIC03LDcgKzcsNyBAQAogYWRkcmVzc2VkIGJ5IHRoZSBob3N0IHN5c3RlbSB1c2luZyBkaWZmZXJlbnQgSTJDIHNsYXZlIGFkZHJlc3Nlcy4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzYW1zdW5nLHMybXBzMTEtcG1pYyIuCistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAic2Ftc3VuZyxzMm1wczExLXBtaWMiIG9yICJzYW1zdW5nLHMybXBzMTQtcG1pYyIuCiAtIHJlZzogU3BlY2lmaWVzIHRoZSBJMkMgc2xhdmUgYWRkcmVzcyBvZiB0aGUgcG1pYyBibG9jay4gSXQgc2hvdWxkIGJlIDB4NjYuCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CkBAIC01OSwxMCArNTksMTQgQEAKIGFzIHBlciB0aGUgZGF0YXNoZWV0IG9mIHMybXBzMTEuCiAKIAktIExET24KLQkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmUgMSB0byAzOAorCQkgIC0gdmFsaWQgdmFsdWVzIGZvciBuIGFyZToKKwkJCS0gUzJNUFMxMTogMSB0byAzOAorCQkJLSBTMk1QUzE0OiAxIHRvIDI1CiAJCSAgLSBFeGFtcGxlOiBMRE8xLCBMRDAyLCBMRE8yOAogCS0gQlVDS24KLQkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmUgMSB0byAxMC4KKwkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmU6CisJCQktIFMyTVBTMTE6IDEgdG8gMTAKKwkJCS0gUzJNUFMxNDogMSB0byA1CiAJCSAgLSBFeGFtcGxlOiBCVUNLMSwgQlVDSzIsIEJVQ0s5CiAKIEV4YW1wbGU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvdHBzNjU5MTAudHh0CmluZGV4IGI0YmQ5OGEuLjM4ODMzZTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvdHBzNjU5MTAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvdHBzNjU5MTAudHh0CkBAIC0xMSw3ICsxMSw3IEBACiAtICNpbnRlcnJ1cHQtY2VsbHM6IHRoZSBudW1iZXIgb2YgY2VsbHMgdG8gZGVzY3JpYmUgYW4gSVJRLCB0aGlzIHNob3VsZCBiZSAyLgogICBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgSVJRIG51bWJlci4KICAgVGhlIHNlY29uZCBjZWxsIGlzIHRoZSBmbGFncywgZW5jb2RlZCBhcyB0aGUgdHJpZ2dlciBtYXNrcyBmcm9tCi0gIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHRzLnR4dAorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaW50ZXJydXB0cy50eHQKIC0gcmVndWxhdG9yczogVGhpcyBpcyB0aGUgbGlzdCBvZiBjaGlsZCBub2RlcyB0aGF0IHNwZWNpZnkgdGhlIHJlZ3VsYXRvcgogICBpbml0aWFsaXphdGlvbiBkYXRhIGZvciBkZWZpbmVkIHJlZ3VsYXRvcnMuIE5vdCBhbGwgcmVndWxhdG9ycyBmb3IgdGhlIGdpdmVuCiAgIGRldmljZSBuZWVkIHRvIGJlIHByZXNlbnQuIFRoZSBkZWZpbml0aW9uIGZvciBlYWNoIG9mIHRoZXNlIG5vZGVzIGlzIGRlZmluZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2MvYWxsd2lubmVyLHN1bnhpLXNpZC50eHQKaW5kZXggNjhiYTM3Mi4uZmFiZGY2NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2MvYWxsd2lubmVyLHN1bnhpLXNpZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2MvYWxsd2lubmVyLHN1bnhpLXNpZC50eHQKQEAgLTEsMTIgKzEsMTIgQEAKIEFsbHdpbm5lciBzdW54aS1zaWQKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogImFsbHdpbm5lcixzdW40aS1zaWQiIG9yICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNpZCIuCistIGNvbXBhdGlibGU6ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNpZCIgb3IgImFsbHdpbm5lcixzdW43aS1hMjAtc2lkIgogLSByZWc6IFNob3VsZCBjb250YWluIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAKIEV4YW1wbGUgZm9yIHN1bjRpOgogCXNpZEAwMWMyMzgwMCB7Ci0JCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXNpZCI7CisJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zaWQiOwogCQlyZWcgPSA8MHgwMWMyMzgwMCAweDEwPgogCX07CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2F0bWVsLXNzYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hdG1lbC1zc2MudHh0CmluZGV4IDYwOTYwYjIuLmVmYzk4ZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2F0bWVsLXNzYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2MvYXRtZWwtc3NjLnR4dApAQCAtMTcsNiArMTcsMTQgQEAKICAgU2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvYXRtZWwtZG1hLnR4dCBmb3IgZGV0YWlscy4KIC0gZG1hLW5hbWVzOiBNdXN0IGJlICJ0eCIsICJyeCIuCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgIC0gYXRtZWwsY2xrLWZyb20tcmstcGluOiBib29sIHByb3BlcnR5LgorICAgICAtIFdoZW4gU1NDIHdvcmtzIGluIHNsYXZlIG1vZGUsIGFjY29yZGluZyB0byB0aGUgaGFyZHdhcmUgZGVzaWduLCB0aGUKKyAgICAgICBjbG9jayBjYW4gZ2V0IGZyb20gVEsgcGluLCBhbmQgYWxzbyBjYW4gZ2V0IGZyb20gUksgcGluLiBTbywgYWRkCisgICAgICAgdGhpcyBwYXJhbWV0ZXIgdG8gY2hvb3NlIHdoZXJlIHRoZSBjbG9jayBmcm9tLgorICAgICAtIEJ5IGRlZmF1bHQgdGhlIGNsb2NrIGlzIGZyb20gVEsgcGluLCBpZiB0aGUgY2xvY2sgZnJvbSBSSyBwaW4sIHRoaXMKKyAgICAgICBwcm9wZXJ0eSBpcyBuZWVkZWQuCisKIEV4YW1wbGVzOgogLSBQREMgdHJhbnNmZXI6CiBzc2MwOiBzc2NAZmZmYmMwMDAgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9zcmFtLnR4dAppbmRleCA0ZDBhMDBlLi4zNmNiZTVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9zcmFtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9zcmFtLnR4dApAQCAtOCw5ICs4LDQ0IEBACiAKIC0gcmVnIDogU1JBTSBpb21lbSBhZGRyZXNzIHJhbmdlCiAKK1Jlc2VydmluZyBzcmFtIGFyZWFzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhY2ggY2hpbGQgb2YgdGhlIHNyYW0gbm9kZSBzcGVjaWZpZXMgYSByZWdpb24gb2YgcmVzZXJ2ZWQgbWVtb3J5LiBFYWNoCitjaGlsZCBub2RlIHNob3VsZCB1c2UgYSAncmVnJyBwcm9wZXJ0eSB0byBzcGVjaWZ5IGEgc3BlY2lmaWMgcmFuZ2Ugb2YKK3Jlc2VydmVkIG1lbW9yeS4KKworRm9sbG93aW5nIHRoZSBnZW5lcmljLW5hbWVzIHJlY29tbWVuZGVkIHByYWN0aWNlLCBub2RlIG5hbWVzIHNob3VsZAorcmVmbGVjdCB0aGUgcHVycG9zZSBvZiB0aGUgbm9kZS4gVW5pdCBhZGRyZXNzIChAPGFkZHJlc3M+KSBzaG91bGQgYmUKK2FwcGVuZGVkIHRvIHRoZSBuYW1lLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGluIHRoZSBzcmFtIG5vZGU6CisKKy0gI2FkZHJlc3MtY2VsbHMsICNzaXplLWNlbGxzIDogc2hvdWxkIHVzZSB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIHJvb3Qgbm9kZQorLSByYW5nZXMgOiBzdGFuZGFyZCBkZWZpbml0aW9uLCBzaG91bGQgdHJhbnNsYXRlIGZyb20gbG9jYWwgYWRkcmVzc2VzCisgICAgICAgICAgIHdpdGhpbiB0aGUgc3JhbSB0byBidXMgYWRkcmVzc2VzCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgaW4gdGhlIGFyZWEgbm9kZXM6CisKKy0gcmVnIDogaW9tZW0gYWRkcmVzcyByYW5nZSwgcmVsYXRpdmUgdG8gdGhlIFNSQU0gcmFuZ2UKKworT3B0aW9uYWwgcHJvcGVydGllcyBpbiB0aGUgYXJlYSBub2RlczoKKworLSBjb21wYXRpYmxlIDogc3RhbmRhcmQgZGVmaW5pdGlvbiwgc2hvdWxkIGNvbnRhaW4gYSB2ZW5kb3Igc3BlY2lmaWMgc3RyaW5nCisgICAgICAgICAgICAgICBpbiB0aGUgZm9ybSA8dmVuZG9yPixbPGRldmljZT4tXTx1c2FnZT4KKwogRXhhbXBsZToKIAogc3JhbTogc3JhbUA1YzAwMDAwMCB7CiAJY29tcGF0aWJsZSA9ICJtbWlvLXNyYW0iOwogCXJlZyA9IDwweDVjMDAwMDAwIDB4NDAwMDA+OyAvKiAyNTYgS2lCIFNSQU0gYXQgYWRkcmVzcyAweDVjMDAwMDAwICovCisKKwkjYWRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCXJhbmdlcyA9IDwwIDB4NWMwMDAwMDAgMHg0MDAwMD47CisKKwlzbXAtc3JhbUAxMDAgeworCQljb21wYXRpYmxlID0gInNvY3ZlbmRvcixzbXAtc3JhbSI7CisJCXJlZyA9IDwweDEwMCAweDUwPjsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzODg1MS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rczg4NTEudHh0CmluZGV4IDExYWNlM2MuLjRmYzM5MjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzODg1MS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9taWNyZWwta3M4ODUxLnR4dApAQCAtNywzICs3LDQgQEAKIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gbG9jYWwtbWFjLWFkZHJlc3MgOiBFdGhlcm5ldCBtYWMgYWRkcmVzcyB0byB1c2UKKy0gdmRkLXN1cHBseToJc3VwcGx5IGZvciBFdGhlcm5ldCBtYWMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvYXBtLXhnZW5lLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2FwbS14Z2VuZS1waHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2E2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2FwbS14Z2VuZS1waHkudHh0CkBAIC0wLDAgKzEsNzkgQEAKKyogQVBNIFgtR2VuZSAxNUdicHMgTXVsdGktcHVycG9zZSBQSFkgbm9kZXMKKworUEhZIG5vZGVzIGFyZSBkZWZpbmVkIHRvIGRlc2NyaWJlIG9uLWNoaXAgMTVHYnBzIE11bHRpLXB1cnBvc2UgUEhZLiBFYWNoCitQSFkgKHBhaXIgb2YgbGFuZXMpIGhhcyBpdHMgb3duIG5vZGUuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUJCTogU2hhbGwgYmUgImFwbSx4Z2VuZS1waHkiLgorLSByZWcJCQk6IFBIWSBtZW1vcnkgcmVzb3VyY2UgaXMgdGhlIFNEUyBQSFkgYWNjZXNzIHJlc291cmNlLgorLSAjcGh5LWNlbGxzCQk6IFNoYWxsIGJlIDEgYXMgaXQgZXhwZWN0cyBvbmUgYXJndW1lbnQgZm9yIHNldHRpbmcKKwkJCSAgdGhlIG1vZGUgb2YgdGhlIFBIWS4gUG9zc2libGUgdmFsdWVzIGFyZSAwIChTQVRBKSwKKwkJCSAgMSAoU0dNSUkpLCAyIChQQ0llKSwgMyAoVVNCKSwgYW5kIDQgKFhGSSkuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHN0YXR1cwkJOiBTaGFsbCBiZSAib2siIGlmIGVuYWJsZWQgb3IgImRpc2FibGVkIiBpZiBkaXNhYmxlZC4KKwkJCSAgRGVmYXVsdCBpcyAib2siLgorLSBjbG9ja3MJCTogUmVmZXJlbmNlIHRvIHRoZSBjbG9jayBlbnRyeS4KKy0gYXBtLHR4LWV5ZS10dW5pbmcJOiBNYW51YWwgY29udHJvbCB0byBmaW5lIHR1bmUgdGhlIGNhcHR1cmUgb2YgdGhlIHNlcmlhbAorCQkJICBiaXQgbGluZXMgZnJvbSB0aGUgYXV0b21hdGljIGNhbGlicmF0ZWQgcG9zaXRpb24uCisJCQkgIFR3byBzZXQgb2YgMy10dXBsZSBzZXR0aW5nIGZvciBlYWNoICh1cCB0byAzKQorCQkJICBzdXBwb3J0ZWQgbGluayBzcGVlZCBvbiB0aGUgaG9zdC4gUmFuZ2UgZnJvbSAwIHRvCisJCQkgIDEyNyBpbiB1bml0IG9mIG9uZSBiaXQgcGVyaW9kLiBEZWZhdWx0IGlzIDEwLgorLSBhcG0sdHgtZXllLWRpcmVjdGlvbgk6IEV5ZSB0dW5pbmcgbWFudWFsIGNvbnRyb2wgZGlyZWN0aW9uLiAwIG1lYW5zIHNhbXBsZQorCQkJICBkYXRhIGVhcmxpZXIgdGhhbiB0aGUgbm9taW5hbCBzYW1wbGluZyBwb2ludC4gMSBtZWFucworCQkJICBzYW1wbGUgZGF0YSBsYXRlciB0aGFuIHRoZSBub21pbmFsIHNhbXBsaW5nIHBvaW50LgorCQkJICBUd28gc2V0IG9mIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykKKwkJCSAgc3VwcG9ydGVkIGxpbmsgc3BlZWQgb24gdGhlIGhvc3QuIERlZmF1bHQgaXMgMC4KKy0gYXBtLHR4LWJvb3N0LWdhaW4JOiBGcmVxdWVuY3kgYm9vc3QgQUMgKExTQiAzLWJpdCkgYW5kIERDICgyLWJpdCkKKwkJCSAgZ2FpbiBjb250cm9sLiBUd28gc2V0IG9mIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaAorCQkJICAodXAgdG8gMykgc3VwcG9ydGVkIGxpbmsgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGlzCisJCQkgIGJldHdlZW4gMCB0byAzMSBpbiB1bml0IG9mIGRCLiBEZWZhdWx0IGlzIDMuCistIGFwbSx0eC1hbXBsaXR1ZGUJOiBBbXBsaXR1ZGUgY29udHJvbC4gVHdvIHNldCBvZiAzLXR1cGxlIHNldHRpbmcgZm9yCisJCQkgIGVhY2ggKHVwIHRvIDMpIHN1cHBvcnRlZCBsaW5rIHNwZWVkIG9uIHRoZSBob3N0LgorCQkJICBSYW5nZSBpcyBiZXR3ZWVuIDAgdG8gMTk5NTAwIGluIHVuaXQgb2YgdVYuCisJCQkgIERlZmF1bHQgaXMgMTk5NTAwIHVWLgorLSBhcG0sdHgtcHJlLWN1cnNvcjEJOiAxc3QgcHJlLWN1cnNvciBlbXBoYXNpcyB0YXBzIGNvbnRyb2wuIFR3byBzZXQgb2YKKwkJCSAgMy10dXBsZSBzZXR0aW5nIGZvciBlYWNoICh1cCB0byAzKSBzdXBwb3J0ZWQgbGluaworCQkJICBzcGVlZCBvbiB0aGUgaG9zdC4gUmFuZ2UgaXMgMCB0byAyNzMwMDAgaW4gdW5pdCBvZgorCQkJICB1Vi4gRGVmYXVsdCBpcyAwLgorLSBhcG0sdHgtcHJlLWN1cnNvcjIJOiAyc3QgcHJlLWN1cnNvciBlbXBoYXNpcyB0YXBzIGNvbnRyb2wuIFR3byBzZXQgb2YKKwkJCSAgMy10dXBsZSBzZXR0aW5nIGZvciBlYWNoICh1cCB0byAzKSBzdXBwb3J0ZWQgbGluaworCQkJICBzcGVlZCBvbiB0aGUgaG9zdC4gUmFuZ2UgaXMgMCB0byAxMjc0MDAgaW4gdW5pdCB1Vi4KKwkJCSAgRGVmYXVsdCBpcyAweDAuCistIGFwbSx0eC1wb3N0LWN1cnNvcgk6IFBvc3QtY3Vyc29yIGVtcGhhc2lzIHRhcHMgY29udHJvbC4gVHdvIHNldCBvZgorCQkJICAzLXR1cGxlIHNldHRpbmcgZm9yIEdlbjEsIEdlbjIsIGFuZCBHZW4zLiBSYW5nZSBpcworCQkJICBiZXR3ZWVuIDAgdG8gMHgxZiBpbiB1bml0IG9mIDE4LjJtVi4gRGVmYXVsdCBpcyAweGYuCistIGFwbSx0eC1zcGVlZAkJOiBUeCBvcGVyYXRpbmcgc3BlZWQuIE9uZSBzZXQgb2YgMy10dXBsZSBmb3IgZWFjaAorCQkJICBzdXBwb3J0ZWQgbGluayBzcGVlZCBvbiB0aGUgaG9zdC4KKwkJCSAgIDAgPSAxLTJHYnBzCisJCQkgICAxID0gMi00R2JwcyAoMXN0IHR1cGxlIGRlZmF1bHQpCisJCQkgICAyID0gNC04R2JwcworCQkJICAgMyA9IDgtMTVHYnBzICgybmQgdHVwbGUgZGVmYXVsdCkKKwkJCSAgIDQgPSAyLjUtNEdicHMKKwkJCSAgIDUgPSA0LTVHYnBzCisJCQkgICA2ID0gNS02R2JwcworCQkJICAgNyA9IDYtMTZHYnBzICgzcmQgdHVwbGUgZGVmYXVsdCkKKworTk9URTogUEhZIG92ZXJyaWRlIHBhcmFtZXRlcnMgYXJlIGJvYXJkIHNwZWNpZmljIHNldHRpbmcuCisKK0V4YW1wbGU6CisJCXBoeTE6IHBoeUAxZjIxYTAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiOworCQkJcmVnID0gPDB4MCAweDFmMjFhMDAwIDB4MCAweDEwMD47CisJCQkjcGh5LWNlbGxzID0gPDE+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwaHkyOiBwaHlAMWYyMmEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtcGh5IjsKKwkJCXJlZyA9IDwweDAgMHgxZjIyYTAwMCAweDAgMHgxMDA+OworCQkJI3BoeS1jZWxscyA9IDwxPjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCX07CisKKwkJcGh5MzogcGh5QDFmMjNhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyM2EwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCQlzdGF0dXMgPSAib2siOworCQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3NhbXN1bmctcGh5LnR4dAppbmRleCBjMGZjY2FhLi4yOGY5ZWRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3NhbXN1bmctcGh5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3NhbXN1bmctcGh5LnR4dApAQCAtMjAsMyArMjAsNTcgQEAKIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAic2Ftc3VuZyxleHlub3M1MjUwLWRwLXZpZGVvLXBoeSI7CiAtIHJlZyA6IG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEaXNwbGF5IFBvcnQgUEhZIHJlZ2lzdGVyIHNldDsKIC0gI3BoeS1jZWxscyA6IGZyb20gdGhlIGdlbmVyaWMgUEhZIGJpbmRpbmdzLCBtdXN0IGJlIDA7CisKK1NhbXN1bmcgUzVQL0VYWU5PUyBTb0Mgc2VyaWVzIFVTQiBQSFkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGxpc3RlZCBjb21wYXRpYmxlczoKKwktICJzYW1zdW5nLGV4eW5vczQyMTAtdXNiMi1waHkiCisJLSAic2Ftc3VuZyxleHlub3M0eDEyLXVzYjItcGh5IgorCS0gInNhbXN1bmcsZXh5bm9zNTI1MC11c2IyLXBoeSIKKy0gcmVnIDogYSBsaXN0IG9mIHJlZ2lzdGVycyB1c2VkIGJ5IHBoeSBkcml2ZXIKKwktIGZpcnN0IGFuZCBvYmxpZ2F0b3J5IGlzIHRoZSBsb2NhdGlvbiBvZiBwaHkgbW9kdWxlcyByZWdpc3RlcnMKKy0gc2Ftc3VuZyxzeXNyZWctcGhhbmRsZSAtIGhhbmRsZSB0byBzeXNjb24gdXNlZCB0byBjb250cm9sIHRoZSBzeXN0ZW0gcmVnaXN0ZXJzCistIHNhbXN1bmcscG11cmVnLXBoYW5kbGUgLSBoYW5kbGUgdG8gc3lzY29uIHVzZWQgdG8gY29udHJvbCBQTVUgcmVnaXN0ZXJzCistICNwaHktY2VsbHMgOiBmcm9tIHRoZSBnZW5lcmljIHBoeSBiaW5kaW5ncywgbXVzdCBiZSAxOworLSBjbG9ja3MgYW5kIGNsb2NrLW5hbWVzOgorCS0gdGhlICJwaHkiIGNsb2NrIGlzIHJlcXVpcmVkIGJ5IHRoZSBwaHkgbW9kdWxlLCB1c2VkIGFzIGEgZ2F0ZQorCS0gdGhlICJyZWYiIGNsb2NrIGlzIHVzZWQgdG8gZ2V0IHRoZSByYXRlIG9mIHRoZSBjbG9jayBwcm92aWRlZCB0byB0aGUKKwkgIFBIWSBtb2R1bGUKKworVGhlIGZpcnN0IHBoYW5kbGUgYXJndW1lbnQgaW4gdGhlIFBIWSBzcGVjaWZpZXIgaWRlbnRpZmllcyB0aGUgUEhZLCBpdHMKK21lYW5pbmcgaXMgY29tcGF0aWJsZSBkZXBlbmRlbnQuIEZvciB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCBTb0NzIChFeHlub3MgNDIxMAorYW5kIEV4eW5vcyA0MjEyKSBpdCBpcyBhcyBmb2xsb3dzOgorICAwIC0gVVNCIGRldmljZSAoImRldmljZSIpLAorICAxIC0gVVNCIGhvc3QgKCJob3N0IiksCisgIDIgLSBIU0lDMCAoImhzaWMwIiksCisgIDMgLSBIU0lDMSAoImhzaWMxIiksCisKK0V4eW5vcyA0MjEwIGFuZCBFeHlub3MgNDIxMiB1c2UgbW9kZSBzd2l0Y2hpbmcgYW5kIHJlcXVpcmUgdGhhdCBtb2RlIHN3aXRjaAorcmVnaXN0ZXIgaXMgc3VwcGxpZWQuCisKK0V4YW1wbGU6CisKK0ZvciBFeHlub3MgNDQxMiAoY29tcGF0aWJsZSB3aXRoIEV4eW5vcyA0MjEyKToKKwordXNicGh5OiBwaHlAMTI1YjAwMDAgeworCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0eDEyLXVzYjItcGh5IjsKKwlyZWcgPSA8MHgxMjViMDAwMCAweDEwMD47CisJY2xvY2tzID0gPCZjbG9jayAzMDU+LCA8JmNsb2NrIDI+OworCWNsb2NrLW5hbWVzID0gInBoeSIsICJyZWYiOworCXN0YXR1cyA9ICJva2F5IjsKKwkjcGh5LWNlbGxzID0gPDE+OworCXNhbXN1bmcsc3lzcmVnLXBoYW5kbGUgPSA8JnN5c19yZWc+OworCXNhbXN1bmcscG11cmVnLXBoYW5kbGUgPSA8JnBtdV9yZWc+OworfTsKKworVGhlbiB0aGUgUEhZIGNhbiBiZSB1c2VkIGluIG90aGVyIG5vZGVzIHN1Y2ggYXM6CisKK3BoeS1jb25zdW1lckAxMjM0MDAwMCB7CisJcGh5cyA9IDwmdXNicGh5IDI+OworCXBoeS1uYW1lcyA9ICJwaHkiOworfTsKKworUmVmZXIgdG8gRFQgYmluZGluZ3MgZG9jdW1lbnRhdGlvbiBvZiBwYXJ0aWN1bGFyIFBIWSBjb25zdW1lciBkZXZpY2VzIGZvciBtb3JlCitpbmZvcm1hdGlvbiBhYm91dCByZXF1aXJlZCBQSFlzIGFuZCB0aGUgd2F5IG9mIHNwZWNpZmljYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3N1bjRpLXVzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODIzNjFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dApAQCAtMCwwICsxLDI2IEBACitBbGx3aW5uZXIgc3VuNGkgVVNCIFBIWQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2YgImFsbHdpbm5lcixzdW40aS1hMTAtdXNiLXBoeSIsCisgICJhbGx3aW5uZXIsc3VuNWktYTEzLXVzYi1waHkiIG9yICJhbGx3aW5uZXIsc3VuN2ktYTIwLXVzYi1waHkiCistIHJlZyA6IGEgbGlzdCBvZiBvZmZzZXQgKyBsZW5ndGggcGFpcnMKKy0gcmVnLW5hbWVzIDogInBoeV9jdHJsIiwgInBtdTEiIGFuZCBmb3Igc3VuNGkgb3Igc3VuN2kgInBtdTIiCistICNwaHktY2VsbHMgOiBmcm9tIHRoZSBnZW5lcmljIHBoeSBiaW5kaW5ncywgbXVzdCBiZSAxCistIGNsb2NrcyA6IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgZm9yIHRoZSBwaHkgY2xvY2sKKy0gY2xvY2stbmFtZXMgOiAidXNiX3BoeSIKKy0gcmVzZXRzIDogYSBsaXN0IG9mIHBoYW5kbGUgKyByZXNldCBzcGVjaWZpZXIgcGFpcnMKKy0gcmVzZXQtbmFtZXMgOiAidXNiMF9yZXNldCIsICJ1c2IxX3Jlc2V0IiBhbmQgZm9yIHN1bjRpIG9yIHN1bjdpICJ1c2IyX3Jlc2V0IgorCitFeGFtcGxlOgorCXVzYnBoeTogcGh5QDB4MDFjMTM0MDAgeworCQkjcGh5LWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdXNiLXBoeSI7CisJCS8qIHBoeSBiYXNlIHJlZ3MsIHBoeTEgcG11IHJlZywgcGh5MiBwbXUgcmVnICovCisJCXJlZyA9IDwweDAxYzEzNDAwIDB4MTAgMHgwMWMxNDgwMCAweDQgMHgwMWMxYzgwMCAweDQ+OworCQlyZWctbmFtZXMgPSAicGh5X2N0cmwiLCAicG11MSIsICJwbXUyIjsKKwkJY2xvY2tzID0gPCZ1c2JfY2xrIDg+OworCQljbG9jay1uYW1lcyA9ICJ1c2JfcGh5IjsKKwkJcmVzZXRzID0gPCZ1c2JfY2xrIDE+LCA8JnVzYl9jbGsgMj47CisJCXJlc2V0LW5hbWVzID0gInVzYjFfcmVzZXQiLCAidXNiMl9yZXNldCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhmYjBmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0CkBAIC0wLDAgKzEsODYgQEAKK1RJIFBIWTogRFQgRE9DVU1FTlRBVElPTiBGT1IgUEhZcyBpbiBUSSBQTEFURk9STXMKKworT01BUCBDT05UUk9MIFBIWQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZgorICJ0aSxjb250cm9sLXBoeS1vdGdocyIgLSBpZiBpdCBoYXMgb3RnaHNfY29udHJvbCBtYWlsYm94IHJlZ2lzdGVyIGFzIG9uIE9NQVA0LgorICJ0aSxjb250cm9sLXBoeS11c2IyIiAtIGlmIGl0IGhhcyBQb3dlciBkb3duIGJpdCBpbiBjb250cm9sX2Rldl9jb25mIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIFVTQjJfUEhZIG9uIE9NQVA1LgorICJ0aSxjb250cm9sLXBoeS1waXBlMyIgLSBpZiBpdCBoYXMgRFBMTCBhbmQgaW5kaXZpZHVhbCBSeCAmIFR4IHBvd2VyIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gVVNCMyBQSFkgYW5kIFNBVEEgUEhZIG9uIE9NQVA1LgorICJ0aSxjb250cm9sLXBoeS11c2IyLWRyYTciIC0gaWYgaXQgaGFzIHBvd2VyIGRvd24gcmVnaXN0ZXIgbGlrZSBVU0IyIFBIWSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgRFJBNyBwbGF0Zm9ybS4KKyAidGksY29udHJvbC1waHktdXNiMi1hbTQzNyIgLSBpZiBpdCBoYXMgcG93ZXIgZG93biByZWdpc3RlciBsaWtlIFVTQjIgUEhZIG9uCisgICAgICAgICAgICAgICAgICAgICAgICBBTTQzNyBwbGF0Zm9ybS4KKyAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLiBJdCBjb250YWlucworICAgdGhlIGFkZHJlc3Mgb2YgIm90Z2hzX2NvbnRyb2wiIGZvciBjb250cm9sLXBoeS1vdGdocyBvciAicG93ZXIiIHJlZ2lzdGVyCisgICBmb3Igb3RoZXIgdHlwZXMuCisgLSByZWctbmFtZXM6IHNob3VsZCBiZSAib3RnaHNfY29udHJvbCIgY29udHJvbC1waHktb3RnaHMgYW5kICJwb3dlciIgZm9yCisgICBvdGhlciB0eXBlcy4KKworb21hcF9jb250cm9sX3VzYjogb21hcC1jb250cm9sLXVzYkA0YTAwMjMwMCB7CisgICAgICAgIGNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktb3RnaHMiOworICAgICAgICByZWcgPSA8MHg0YTAwMjMzYyAweDQ+OworICAgICAgICByZWctbmFtZXMgPSAib3RnaHNfY29udHJvbCI7Cit9OworCitPTUFQIFVTQjIgUEhZCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLG9tYXAtdXNiMiIKKyAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorIC0gI3BoeS1jZWxsczogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBzaG91bGQgYmUgZ2l2ZW4gaW4gdGhlCisgICBwaGFuZGxlIHdoaWxlIHJlZmVyZW5jaW5nIHRoaXMgcGh5LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gY3RybC1tb2R1bGUgOiBwaGFuZGxlIG9mIHRoZSBjb250cm9sIG1vZHVsZSB1c2VkIGJ5IFBIWSBkcml2ZXIgdG8gcG93ZXIgb24KKyAgIHRoZSBQSFkuCisKK1RoaXMgaXMgdXN1YWxseSBhIHN1Ym5vZGUgb2Ygb2NwMnNjcCB0byB3aGljaCBpdCBpcyBjb25uZWN0ZWQuCisKK3VzYjJwaHlANGEwYWQwODAgeworCWNvbXBhdGlibGUgPSAidGksb21hcC11c2IyIjsKKwlyZWcgPSA8MHg0YTBhZDA4MCAweDU4PjsKKwljdHJsLW1vZHVsZSA9IDwmb21hcF9jb250cm9sX3VzYj47CisJI3BoeS1jZWxscyA9IDwwPjsKK307CisKK1RJIFBJUEUzIFBIWQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxwaHktdXNiMyIgb3IgInRpLHBoeS1waXBlMy1zYXRhIi4KKyAgICJ0aSxvbWFwLXVzYjMiIGlzIGRlcHJlY2F0ZWQuCisgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KKyAtIHJlZy1uYW1lczogVGhlIG5hbWVzIG9mIHRoZSByZWdpc3RlciBhZGRyZXNzZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVnaXN0ZXJzCisgICBmaWxsZWQgaW4gInJlZyIuCisgLSAjcGh5LWNlbGxzOiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjZWxscyB0aGF0IHNob3VsZCBiZSBnaXZlbiBpbiB0aGUKKyAgIHBoYW5kbGUgd2hpbGUgcmVmZXJlbmNpbmcgdGhpcyBwaHkuCisgLSBjbG9ja3M6IGEgbGlzdCBvZiBwaGFuZGxlcyBhbmQgY2xvY2stc3BlY2lmaWVyIHBhaXJzLCBvbmUgZm9yIGVhY2ggZW50cnkgaW4KKyAgIGNsb2NrLW5hbWVzLgorIC0gY2xvY2stbmFtZXM6IHNob3VsZCBpbmNsdWRlOgorICAgKiAid2t1cGNsayIgLSB3YWtldXAgY2xvY2suCisgICAqICJzeXNjbGsiIC0gc3lzdGVtIGNsb2NrLgorICAgKiAicmVmY2xrIiAtIHJlZmVyZW5jZSBjbG9jay4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGN0cmwtbW9kdWxlIDogcGhhbmRsZSBvZiB0aGUgY29udHJvbCBtb2R1bGUgdXNlZCBieSBQSFkgZHJpdmVyIHRvIHBvd2VyIG9uCisgICB0aGUgUEhZLgorCitUaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIG9mIG9jcDJzY3AgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkLgorCit1c2IzcGh5QDRhMDg0NDAwIHsKKwljb21wYXRpYmxlID0gInRpLHBoeS11c2IzIjsKKwlyZWcgPSA8MHg0YTA4NDQwMCAweDgwPiwKKwkgICAgICA8MHg0YTA4NDgwMCAweDY0PiwKKwkgICAgICA8MHg0YTA4NGMwMCAweDQwPjsKKwlyZWctbmFtZXMgPSAicGh5X3J4IiwgInBoeV90eCIsICJwbGxfY3RybCI7CisJY3RybC1tb2R1bGUgPSA8Jm9tYXBfY29udHJvbF91c2I+OworCSNwaHktY2VsbHMgPSA8MD47CisJY2xvY2tzID0gPCZ1c2JfcGh5X2NtX2NsazMyaz4sCisJCSA8JnN5c19jbGtpbj4sCisJCSA8JnVzYl9vdGdfc3NfcmVmY2xrOTYwbT47CisJY2xvY2stbmFtZXMgPQkid2t1cGNsayIsCisJCQkic3lzY2xrIiwKKwkJCSJyZWZjbGsiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM3MC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM3MC1waW5jdHJsLnR4dAppbmRleCAwMWVmNDA4Li5hZGRhMmE4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzAtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzcwLXBpbmN0cmwudHh0CkBAIC01LDYgKzUsNyBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlOiAibWFydmVsbCw4OGY2NzEwLXBpbmN0cmwiCistIHJlZzogcmVnaXN0ZXIgc3BlY2lmaWVyIG9mIE1QUCByZWdpc3RlcnMKIAogQXZhaWxhYmxlIG1wcCBwaW5zL2dyb3VwcyBhbmQgZnVuY3Rpb25zOgogTm90ZTogYnJhY2tldHMgKHgpIGFyZSBub3QgcGFydCBvZiB0aGUgbXBwIG5hbWUgZm9yIG1hcnZlbGwsZnVuY3Rpb24gYW5kIGdpdmVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzUtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzUtcGluY3RybC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlMGNkYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM3NS1waW5jdHJsLnR4dApAQCAtMCwwICsxLDgyIEBACisqIE1hcnZlbGwgQXJtYWRhIDM3NSBTb0MgcGluY3RybCBkcml2ZXIgZm9yIG1wcAorCitQbGVhc2UgcmVmZXIgdG8gbWFydmVsbCxtdmVidS1waW5jdHJsLnR4dCBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgY29tbW9uIGJpbmRpbmcKK3BhcnQgYW5kIHVzYWdlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibWFydmVsbCw4OGY2NzIwLXBpbmN0cmwiCistIHJlZzogcmVnaXN0ZXIgc3BlY2lmaWVyIG9mIE1QUCByZWdpc3RlcnMKKworQXZhaWxhYmxlIG1wcCBwaW5zL2dyb3VwcyBhbmQgZnVuY3Rpb25zOgorTm90ZTogYnJhY2tldHMgKHgpIGFyZSBub3QgcGFydCBvZiB0aGUgbXBwIG5hbWUgZm9yIG1hcnZlbGwsZnVuY3Rpb24gYW5kIGdpdmVuCitvbmx5IGZvciBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGluIHRoaXMgZG9jdW1lbnQuCisKK25hbWUgICAgICAgICAgcGlucyAgICAgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorbXBwMCAgICAgICAgICAwICAgICAgICBncGlvLCBkZXYoYWQyKSwgc3BpMChjczEpLCBzcGkxKGNzMSkKK21wcDEgICAgICAgICAgMSAgICAgICAgZ3BpbywgZGV2KGFkMyksIHNwaTAobW9zaSksIHNwaTEobW9zaSkKK21wcDIgICAgICAgICAgMiAgICAgICAgZ3BpbywgZGV2KGFkNCksIHB0cChldmVudHJlcSksIGxlZChjMCksIGF1ZGlvKHNkaSkKK21wcDMgICAgICAgICAgMyAgICAgICAgZ3BpbywgZGV2KGFkNSksIHB0cCh0cmlnZ2VuKSwgbGVkKHAzKSwgYXVkaW8obWNsaykKK21wcDQgICAgICAgICAgNCAgICAgICAgZ3BpbywgZGV2KGFkNiksIHNwaTAobWlzbyksIHNwaTEobWlzbykKK21wcDUgICAgICAgICAgNSAgICAgICAgZ3BpbywgZGV2KGFkNyksIHNwaTAoY3MyKSwgc3BpMShjczIpCittcHA2ICAgICAgICAgIDYgICAgICAgIGdwaW8sIGRldihhZDApLCBsZWQocDEpLCBhdWRpbyhyY2xrKQorbXBwNyAgICAgICAgICA3ICAgICAgICBncGlvLCBkZXYoYWQxKSwgcHRwKGNsayksIGxlZChwMiksIGF1ZGlvKGV4dGNsaykKK21wcDggICAgICAgICAgOCAgICAgICAgZ3BpbywgZGV2IChib290Y3MpLCBzcGkwKGNzMCksIHNwaTEoY3MwKQorbXBwOSAgICAgICAgICA5ICAgICAgICBncGlvLCBuZih3ZW4pLCBzcGkwKHNjayksIHNwaTEoc2NrKQorbXBwMTAgICAgICAgIDEwICAgICAgICBncGlvLCBuZihyZW4pLCBkcmFtKHZ0dGN0cmwpLCBsZWQoYzEpCittcHAxMSAgICAgICAgMTEgICAgICAgIGdwaW8sIGRldihhMCksIGxlZChjMiksIGF1ZGlvKHNkbykKK21wcDEyICAgICAgICAxMiAgICAgICAgZ3BpbywgZGV2KGExKSwgYXVkaW8oYmNsaykKK21wcDEzICAgICAgICAxMyAgICAgICAgZ3BpbywgZGV2KHJlYWR5biksIHBjaWUwKHJzdG91dG4pLCBwY2llMShyc3RvdXRuKQorbXBwMTQgICAgICAgIDE0ICAgICAgICBncGlvLCBpMmMwKHNkYSksIHVhcnQxKHR4ZCkKK21wcDE1ICAgICAgICAxNSAgICAgICAgZ3BpbywgaTJjMChzY2spLCB1YXJ0MShyeGQpCittcHAxNiAgICAgICAgMTYgICAgICAgIGdwaW8sIHVhcnQwKHR4ZCkKK21wcDE3ICAgICAgICAxNyAgICAgICAgZ3BpbywgdWFydDAocnhkKQorbXBwMTggICAgICAgIDE4ICAgICAgICBncGlvLCB0ZG0oaW50bikKK21wcDE5ICAgICAgICAxOSAgICAgICAgZ3BpbywgdGRtKHJzdG4pCittcHAyMCAgICAgICAgMjAgICAgICAgIGdwaW8sIHRkbShwY2xrKQorbXBwMjEgICAgICAgIDIxICAgICAgICBncGlvLCB0ZG0oZnN5bmMpCittcHAyMiAgICAgICAgMjIgICAgICAgIGdwaW8sIHRkbShkcngpCittcHAyMyAgICAgICAgMjMgICAgICAgIGdwaW8sIHRkbShkdHgpCittcHAyNCAgICAgICAgMjQgICAgICAgIGdwaW8sIGxlZChwMCksIGdlMShyeGQwKSwgc2QoY21kKSwgdWFydDAocnRzKQorbXBwMjUgICAgICAgIDI1ICAgICAgICBncGlvLCBsZWQocDIpLCBnZTEocnhkMSksIHNkKGQwKSwgdWFydDAoY3RzKQorbXBwMjYgICAgICAgIDI2ICAgICAgICBncGlvLCBwY2llMChjbGtyZXEpLCBnZTEocnhkMiksIHNkKGQyKSwgdWFydDEocnRzKQorbXBwMjcgICAgICAgIDI3ICAgICAgICBncGlvLCBwY2llMShjbGtyZXEpLCBnZTEocnhkMyksIHNkKGQxKSwgdWFydDEoY3RzKQorbXBwMjggICAgICAgIDI4ICAgICAgICBncGlvLCBsZWQocDMpLCBnZTEodHhjdGwpLCBzZChjbGspCittcHAyOSAgICAgICAgMjkgICAgICAgIGdwaW8sIHBjaWUxKGNsa3JlcSksIGdlMShyeGNsayksIHNkKGQzKQorbXBwMzAgICAgICAgIDMwICAgICAgICBncGlvLCBnZTEodHhkMCksIHNwaTEoY3MwKQorbXBwMzEgICAgICAgIDMxICAgICAgICBncGlvLCBnZTEodHhkMSksIHNwaTEobW9zaSkKK21wcDMyICAgICAgICAzMiAgICAgICAgZ3BpbywgZ2UxKHR4ZDIpLCBzcGkxKHNjayksIHB0cCh0cmlnZ2VuKQorbXBwMzMgICAgICAgIDMzICAgICAgICBncGlvLCBnZTEodHhkMyksIHNwaTEobWlzbykKK21wcDM0ICAgICAgICAzNCAgICAgICAgZ3BpbywgZ2UxKHR4Y2xrb3V0KSwgc3BpMShzY2spCittcHAzNSAgICAgICAgMzUgICAgICAgIGdwaW8sIGdlMShyeGN0bCksIHNwaTEoY3MxKSwgc3BpMChjczIpCittcHAzNiAgICAgICAgMzYgICAgICAgIGdwaW8sIHBjaWUwKGNsa3JlcSkKK21wcDM3ICAgICAgICAzNyAgICAgICAgZ3BpbywgcGNpZTAoY2xrcmVxKSwgdGRtKGludG4pLCBnZShtZGMpCittcHAzOCAgICAgICAgMzggICAgICAgIGdwaW8sIHBjaWUxKGNsa3JlcSksIGdlKG1kaW8pCittcHAzOSAgICAgICAgMzkgICAgICAgIGdwaW8sIHJlZihjbGtvdXQpCittcHA0MCAgICAgICAgNDAgICAgICAgIGdwaW8sIHVhcnQxKHR4ZCkKK21wcDQxICAgICAgICA0MSAgICAgICAgZ3BpbywgdWFydDEocnhkKQorbXBwNDIgICAgICAgIDQyICAgICAgICBncGlvLCBzcGkxKGNzMiksIGxlZChjMCkKK21wcDQzICAgICAgICA0MyAgICAgICAgZ3Bpbywgc2F0YTAocHJzbnQpLCBkcmFtKHZ0dGN0cmwpCittcHA0NCAgICAgICAgNDQgICAgICAgIGdwaW8sIHNhdGEwKHByc250KQorbXBwNDUgICAgICAgIDQ1ICAgICAgICBncGlvLCBzcGkwKGNzMiksIHBjaWUwKHJzdG91dG4pCittcHA0NiAgICAgICAgNDYgICAgICAgIGdwaW8sIGxlZChwMCksIGdlMCh0eGQwKSwgZ2UxKHR4ZDApCittcHA0NyAgICAgICAgNDcgICAgICAgIGdwaW8sIGxlZChwMSksIGdlMCh0eGQxKSwgZ2UxKHR4ZDEpCittcHA0OCAgICAgICAgNDggICAgICAgIGdwaW8sIGxlZChwMiksIGdlMCh0eGQyKSwgZ2UxKHR4ZDIpCittcHA0OSAgICAgICAgNDkgICAgICAgIGdwaW8sIGxlZChwMyksIGdlMCh0eGQzKSwgZ2UxKHR4ZDMpCittcHA1MCAgICAgICAgNTAgICAgICAgIGdwaW8sIGxlZChjMCksIGdlMChyeGQwKSwgZ2UxKHJ4ZDApCittcHA1MSAgICAgICAgNTEgICAgICAgIGdwaW8sIGxlZChjMSksIGdlMChyeGQxKSwgZ2UxKHJ4ZDEpCittcHA1MiAgICAgICAgNTIgICAgICAgIGdwaW8sIGxlZChjMiksIGdlMChyeGQyKSwgZ2UxKHJ4ZDIpCittcHA1MyAgICAgICAgNTMgICAgICAgIGdwaW8sIHBjaWUxKHJzdG91dG4pLCBnZTAocnhkMyksIGdlMShyeGQzKQorbXBwNTQgICAgICAgIDU0ICAgICAgICBncGlvLCBwY2llMChyc3RvdXRuKSwgZ2UwKHJ4Y3RsKSwgZ2UxKHJ4Y3RsKQorbXBwNTUgICAgICAgIDU1ICAgICAgICBncGlvLCBnZTAocnhjbGspLCBnZTEocnhjbGspCittcHA1NiAgICAgICAgNTYgICAgICAgIGdwaW8sIGdlMCh0eGNsa291dCksIGdlMSh0eGNsa291dCkKK21wcDU3ICAgICAgICA1NyAgICAgICAgZ3BpbywgZ2UwKHR4Y3RsKSwgZ2UxKHR4Y3RsKQorbXBwNTggICAgICAgIDU4ICAgICAgICBncGlvLCBsZWQoYzApCittcHA1OSAgICAgICAgNTkgICAgICAgIGdwaW8sIGxlZChjMSkKK21wcDYwICAgICAgICA2MCAgICAgICAgZ3BpbywgdWFydDEodHhkKSwgbGVkKGMyKQorbXBwNjEgICAgICAgIDYxICAgICAgICBncGlvLCBpMmMxKHNkYSksIHVhcnQxKHJ4ZCksIHNwaTEoY3MyKSwgbGVkKHAwKQorbXBwNjIgICAgICAgIDYyICAgICAgICBncGlvLCBpMmMxKHNjayksIGxlZChwMSkKK21wcDYzICAgICAgICA2MyAgICAgICAgZ3BpbywgcHRwKHRyaWdnZW4pLCBsZWQocDIpCittcHA2NCAgICAgICAgNjQgICAgICAgIGdwaW8sIGRyYW0odnR0Y3RybCksIGxlZChwMykKK21wcDY1ICAgICAgICA2NSAgICAgICAgZ3Bpbywgc2F0YTEocHJzbnQpCittcHA2NiAgICAgICAgNjYgICAgICAgIGdwaW8sIHB0cChldmVudHJlcSksIHNwaTEoY3MzKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzh4LXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzh4LXBpbmN0cmwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2M5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zOHgtcGluY3RybC50eHQKQEAgLTAsMCArMSw4MCBAQAorKiBNYXJ2ZWxsIEFybWFkYSAzODAvMzg1IFNvQyBwaW5jdHJsIGRyaXZlciBmb3IgbXBwCisKK1BsZWFzZSByZWZlciB0byBtYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0IGluIHRoaXMgZGlyZWN0b3J5IGZvciBjb21tb24gYmluZGluZworcGFydCBhbmQgdXNhZ2UuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJtYXJ2ZWxsLDg4ZjY4MTAtcGluY3RybCIsICJtYXJ2ZWxsLDg4ZjY4MjAtcGluY3RybCIgb3IKKyAgIm1hcnZlbGwsODhmNjgyOC1waW5jdHJsIiBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmljIHZhcmlhbnQgb2YgdGhlCisgIFNvQyBiZWluZyB1c2VkLgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCisKK0F2YWlsYWJsZSBtcHAgcGlucy9ncm91cHMgYW5kIGZ1bmN0aW9uczoKK05vdGU6IGJyYWNrZXRzICh4KSBhcmUgbm90IHBhcnQgb2YgdGhlIG1wcCBuYW1lIGZvciBtYXJ2ZWxsLGZ1bmN0aW9uIGFuZCBnaXZlbgorb25seSBmb3IgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBpbiB0aGlzIGRvY3VtZW50LgorCituYW1lICAgICAgICAgIHBpbnMgICAgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK21wcDAgICAgICAgICAgMCAgICAgICAgZ3BpbywgdWEwKHJ4ZCkKK21wcDEgICAgICAgICAgMSAgICAgICAgZ3BpbywgdWEwKHR4ZCkKK21wcDIgICAgICAgICAgMiAgICAgICAgZ3BpbywgaTJjMChzY2spCittcHAzICAgICAgICAgIDMgICAgICAgIGdwaW8sIGkyYzAoc2RhKQorbXBwNCAgICAgICAgICA0ICAgICAgICBncGlvLCBnZShtZGMpLCB1YTEodHhkKSwgdWEwKHJ0cykKK21wcDUgICAgICAgICAgNSAgICAgICAgZ3BpbywgZ2UobWRpbyksIHVhMShyeGQpLCB1YTAoY3RzKQorbXBwNiAgICAgICAgICA2ICAgICAgICBncGlvLCBnZTAodHhjbGtvdXQpLCBnZTAoY3JzKSwgZGV2KGNzMykKK21wcDcgICAgICAgICAgNyAgICAgICAgZ3BpbywgZ2UwKHR4ZDApLCBkZXYoYWQ5KQorbXBwOCAgICAgICAgICA4ICAgICAgICBncGlvLCBnZTAodHhkMSksIGRldihhZDEwKQorbXBwOSAgICAgICAgICA5ICAgICAgICBncGlvLCBnZTAodHhkMiksIGRldihhZDExKQorbXBwMTAgICAgICAgICAxMCAgICAgICBncGlvLCBnZTAodHhkMyksIGRldihhZDEyKQorbXBwMTEgICAgICAgICAxMSAgICAgICBncGlvLCBnZTAodHhjdGwpLCBkZXYoYWQxMykKK21wcDEyICAgICAgICAgMTIgICAgICAgZ3BpbywgZ2UwKHJ4ZDApLCBwY2llMChyc3RvdXQpLCBwY2llMShyc3RvdXQpIFsxXSwgc3BpMChjczEpLCBkZXYoYWQxNCkKK21wcDEzICAgICAgICAgMTMgICAgICAgZ3BpbywgZ2UwKHJ4ZDEpLCBwY2llMChjbGtyZXEpLCBwY2llMShjbGtyZXEpIFsxXSwgc3BpMChjczIpLCBkZXYoYWQxNSkKK21wcDE0ICAgICAgICAgMTQgICAgICAgZ3BpbywgZ2UwKHJ4ZDIpLCBwdHAoY2xrKSwgbSh2dHRfY3RybCksIHNwaTAoY3MzKSwgZGV2KHdlbjEpCittcHAxNSAgICAgICAgIDE1ICAgICAgIGdwaW8sIGdlMChyeGQzKSwgZ2UobWRjIHNsYXZlKSwgcGNpZTAocnN0b3V0KSwgc3BpMChtb3NpKSwgcGNpZTEocnN0b3V0KSBbMV0KK21wcDE2ICAgICAgICAgMTYgICAgICAgZ3BpbywgZ2UwKHJ4Y3RsKSwgZ2UobWRpbyBzbGF2ZSksIG0oZGVjY19lcnIpLCBzcGkwKG1pc28pLCBwY2llMChjbGtyZXEpCittcHAxNyAgICAgICAgIDE3ICAgICAgIGdwaW8sIGdlMChyeGNsayksIHB0cChjbGspLCB1YTEocnhkKSwgc3BpMChzY2spLCBzYXRhMShwcnNudCkKK21wcDE4ICAgICAgICAgMTggICAgICAgZ3BpbywgZ2UwKHJ4ZXJyKSwgcHRwKHRyaWdfZ2VuKSwgdWExKHR4ZCksIHNwaTAoY3MwKSwgcGNpZTEocnN0b3V0KSBbMV0KK21wcDE5ICAgICAgICAgMTkgICAgICAgZ3BpbywgZ2UwKGNvbCksIHB0cChldmVudF9yZXEpLCBwY2llMChjbGtyZXEpLCBzYXRhMShwcnNudCksIHVhMChjdHMpCittcHAyMCAgICAgICAgIDIwICAgICAgIGdwaW8sIGdlMCh0eGNsayksIHB0cChjbGspLCBwY2llMShyc3RvdXQpIFsxXSwgc2F0YTAocHJzbnQpLCB1YTAocnRzKQorbXBwMjEgICAgICAgICAyMSAgICAgICBncGlvLCBzcGkwKGNzMSksIGdlMShyeGQwKSwgc2F0YTAocHJzbnQpLCBzZDAoY21kKSwgZGV2KGJvb3RjcykKK21wcDIyICAgICAgICAgMjIgICAgICAgZ3Bpbywgc3BpMChtb3NpKSwgZGV2KGFkMCkKK21wcDIzICAgICAgICAgMjMgICAgICAgZ3Bpbywgc3BpMChzY2spLCBkZXYoYWQyKQorbXBwMjQgICAgICAgICAyNCAgICAgICBncGlvLCBzcGkwKG1pc28pLCB1YTAoY3RzKSwgdWExKHJ4ZCksIHNkMChkNCksIGRldihyZWFkeSkKK21wcDI1ICAgICAgICAgMjUgICAgICAgZ3Bpbywgc3BpMChjczApLCB1YTAocnRzKSwgdWExKHR4ZCksIHNkMChkNSksIGRldihjczApCittcHAyNiAgICAgICAgIDI2ICAgICAgIGdwaW8sIHNwaTAoY3MyKSwgaTJjMShzY2spLCBzZDAoZDYpLCBkZXYoY3MxKQorbXBwMjcgICAgICAgICAyNyAgICAgICBncGlvLCBzcGkwKGNzMyksIGdlMSh0eGNsa291dCksIGkyYzEoc2RhKSwgc2QwKGQ3KSwgZGV2KGNzMikKK21wcDI4ICAgICAgICAgMjggICAgICAgZ3BpbywgZ2UxKHR4ZDApLCBzZDAoY2xrKSwgZGV2KGFkNSkKK21wcDI5ICAgICAgICAgMjkgICAgICAgZ3BpbywgZ2UxKHR4ZDEpLCBkZXYoYWxlMCkKK21wcDMwICAgICAgICAgMzAgICAgICAgZ3BpbywgZ2UxKHR4ZDIpLCBkZXYob2VuKQorbXBwMzEgICAgICAgICAzMSAgICAgICBncGlvLCBnZTEodHhkMyksIGRldihhbGUxKQorbXBwMzIgICAgICAgICAzMiAgICAgICBncGlvLCBnZTEodHhjdGwpLCBkZXYod2VuMCkKK21wcDMzICAgICAgICAgMzMgICAgICAgZ3BpbywgbShkZWNjX2VyciksIGRldihhZDMpCittcHAzNCAgICAgICAgIDM0ICAgICAgIGdwaW8sIGRldihhZDEpCittcHAzNSAgICAgICAgIDM1ICAgICAgIGdwaW8sIHJlZihjbGtfb3V0MSksIGRldihhMSkKK21wcDM2ICAgICAgICAgMzYgICAgICAgZ3BpbywgcHRwKHRyaWdfZ2VuKSwgZGV2KGEwKQorbXBwMzcgICAgICAgICAzNyAgICAgICBncGlvLCBwdHAoY2xrKSwgZ2UxKHJ4Y2xrKSwgc2QwKGQzKSwgZGV2KGFkOCkKK21wcDM4ICAgICAgICAgMzggICAgICAgZ3BpbywgcHRwKGV2ZW50X3JlcSksIGdlMShyeGQxKSwgcmVmKGNsa19vdXQwKSwgc2QwKGQwKSwgZGV2KGFkNCkKK21wcDM5ICAgICAgICAgMzkgICAgICAgZ3BpbywgaTJjMShzY2spLCBnZTEocnhkMiksIHVhMChjdHMpLCBzZDAoZDEpLCBkZXYoYTIpCittcHA0MCAgICAgICAgIDQwICAgICAgIGdwaW8sIGkyYzEoc2RhKSwgZ2UxKHJ4ZDMpLCB1YTAocnRzKSwgc2QwKGQyKSwgZGV2KGFkNikKK21wcDQxICAgICAgICAgNDEgICAgICAgZ3BpbywgdWExKHJ4ZCksIGdlMShyeGN0bCksIHVhMChjdHMpLCBzcGkxKGNzMyksIGRldihidXJzdC9sYXN0KQorbXBwNDIgICAgICAgICA0MiAgICAgICBncGlvLCB1YTEodHhkKSwgdWEwKHJ0cyksIGRldihhZDcpCittcHA0MyAgICAgICAgIDQzICAgICAgIGdwaW8sIHBjaWUwKGNsa3JlcSksIG0odnR0X2N0cmwpLCBtKGRlY2NfZXJyKSwgcGNpZTAocnN0b3V0KSwgZGV2KGNsa291dCkKK21wcDQ0ICAgICAgICAgNDQgICAgICAgZ3Bpbywgc2F0YTAocHJzbnQpLCBzYXRhMShwcnNudCksIHNhdGEyKHByc250KSBbMl0sIHNhdGEzKHByc250KSBbM10sIHBjaWUwKHJzdG91dCkKK21wcDQ1ICAgICAgICAgNDUgICAgICAgZ3BpbywgcmVmKGNsa19vdXQwKSwgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHBjaWUyKHJzdG91dCksIHBjaWUzKHJzdG91dCkKK21wcDQ2ICAgICAgICAgNDYgICAgICAgZ3BpbywgcmVmKGNsa19vdXQxKSwgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHBjaWUyKHJzdG91dCksIHBjaWUzKHJzdG91dCkKK21wcDQ3ICAgICAgICAgNDcgICAgICAgZ3Bpbywgc2F0YTAocHJzbnQpLCBzYXRhMShwcnNudCksIHNhdGEyKHByc250KSBbMl0sIHNwaTEoY3MyKSwgc2F0YTMocHJzbnQpIFsyXQorbXBwNDggICAgICAgICA0OCAgICAgICBncGlvLCBzYXRhMChwcnNudCksIG0odnR0X2N0cmwpLCB0ZG0yYyhwY2xrKSwgYXVkaW8obWNsayksIHNkMChkNCkKK21wcDQ5ICAgICAgICAgNDkgICAgICAgZ3Bpbywgc2F0YTIocHJzbnQpIFsyXSwgc2F0YTMocHJzbnQpIFsyXSwgdGRtMmMoZnN5bmMpLCBhdWRpbyhscmNsayksIHNkMChkNSkKK21wcDUwICAgICAgICAgNTAgICAgICAgZ3BpbywgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHRkbTJjKGRyeCksIGF1ZGlvKGV4dGNsayksIHNkMChjbWQpCittcHA1MSAgICAgICAgIDUxICAgICAgIGdwaW8sIHRkbTJjKGR0eCksIGF1ZGlvKHNkbyksIG0oZGVjY19lcnIpCittcHA1MiAgICAgICAgIDUyICAgICAgIGdwaW8sIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCB0ZG0yYyhpbnRuKSwgYXVkaW8oc2RpKSwgc2QwKGQ2KQorbXBwNTMgICAgICAgICA1MyAgICAgICBncGlvLCBzYXRhMShwcnNudCksIHNhdGEwKHByc250KSwgdGRtMmMocnN0biksIGF1ZGlvKGJjbGspLCBzZDAoZDcpCittcHA1NCAgICAgICAgIDU0ICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgc2F0YTEocHJzbnQpLCBwY2llMChyc3RvdXQpLCBwY2llMShyc3RvdXQpIFsxXSwgc2QwKGQzKQorbXBwNTUgICAgICAgICA1NSAgICAgICBncGlvLCB1YTEoY3RzKSwgZ2UobWRpbyksIHBjaWUxKGNsa3JlcSkgWzFdLCBzcGkxKGNzMSksIHNkMChkMCkKK21wcDU2ICAgICAgICAgNTYgICAgICAgZ3BpbywgdWExKHJ0cyksIGdlKG1kYyksIG0oZGVjY19lcnIpLCBzcGkxKG1vc2kpCittcHA1NyAgICAgICAgIDU3ICAgICAgIGdwaW8sIHNwaTEoc2NrKSwgc2QwKGNsaykKK21wcDU4ICAgICAgICAgNTggICAgICAgZ3BpbywgcGNpZTEoY2xrcmVxKSBbMV0sIGkyYzEoc2NrKSwgcGNpZTIoY2xrcmVxKSwgc3BpMShtaXNvKSwgc2QwKGQxKQorbXBwNTkgICAgICAgICA1OSAgICAgICBncGlvLCBwY2llMChyc3RvdXQpLCBpMmMxKHNkYSksIHBjaWUxKHJzdG91dCkgWzFdLCBzcGkxKGNzMCksIHNkMChkMikKKworWzFdOiBvbmx5IGF2YWlsYWJsZSBvbiA4OEY2ODIwIGFuZCA4OEY2ODI4CitbMl06IG9ubHkgYXZhaWxhYmxlIG9uIDg4RjY4MjgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLXhwLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEteHAtcGluY3RybC50eHQKaW5kZXggYmZhMGEyZS4uMzczZGJjY2QgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLXhwLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLXhwLXBpbmN0cmwudHh0CkBAIC02LDYgKzYsNyBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogIm1hcnZlbGwsbXY3ODIzMC1waW5jdHJsIiwgIm1hcnZlbGwsbXY3ODI2MC1waW5jdHJsIiwKICAgICAgICAgICAgICAgIm1hcnZlbGwsbXY3ODQ2MC1waW5jdHJsIgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCiAKIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBBcm1hZGEgWFAgdmFyaWFudHMsIGkuZS4gbXY3ODIzMCwgbXY3ODI2MCwgYW5kIG12Nzg0NjAuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsZG92ZS1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsZG92ZS1waW5jdHJsLnR4dAppbmRleCA1MGVjMzUxLi5jZjUyNDc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGRvdmUtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxkb3ZlLXBpbmN0cmwudHh0CkBAIC02LDYgKzYsNyBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogIm1hcnZlbGwsZG92ZS1waW5jdHJsIgogLSBjbG9ja3M6IChvcHRpb25hbCkgcGhhbmRsZSBvZiBwZG1hIGNsb2NrCistIHJlZzogcmVnaXN0ZXIgc3BlY2lmaWVycyBvZiBNUFAsIE1QUDQsIGFuZCBQTVUgTVBQIHJlZ2lzdGVycwogCiBBdmFpbGFibGUgbXBwIHBpbnMvZ3JvdXBzIGFuZCBmdW5jdGlvbnM6CiBOb3RlOiBicmFja2V0cyAoeCkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtcHAgbmFtZSBmb3IgbWFydmVsbCxmdW5jdGlvbiBhbmQgZ2l2ZW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsa2lya3dvb2QtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGtpcmt3b29kLXBpbmN0cmwudHh0CmluZGV4IDk1ZGFmNjMuLjczMDQ0NGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsa2lya3dvb2QtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxraXJrd29vZC1waW5jdHJsLnR4dApAQCAtOCw2ICs4LDcgQEAKICAgICAgICAgICAgICAgIm1hcnZlbGwsODhmNjE5MC1waW5jdHJsIiwgIm1hcnZlbGwsODhmNjE5Mi1waW5jdHJsIiwKICAgICAgICAgICAgICAgIm1hcnZlbGwsODhmNjI4MS1waW5jdHJsIiwgIm1hcnZlbGwsODhmNjI4Mi1waW5jdHJsIgogICAgICAgICAgICAgICAibWFydmVsbCw5OGR4NDEyMi1waW5jdHJsIgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCiAKIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBraXJrd29vZCB2YXJpYW50cywgaS5lLiA4OGY2MTgwLCA4OGY2MTl4LCBhbmQgODhmNjI4eC4KIEl0IGFsc28gc3VwcG9ydCB0aGUgODhmNjI4MS1iYXNlZCB2YXJpYW50IGluIHRoZSA5OGR4NDEyeCBCb2JjYXQgU29Dcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsbXZlYnUtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0CmluZGV4IDBhMjZjM2EuLjBjMDlmNGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsbXZlYnUtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxtdmVidS1waW5jdHJsLnR4dApAQCAtMzcsNyArMzcsNyBAQAogCiBwaW5jdHJsOiBwaW5jdHJsQGQwMjAwIHsKIAljb21wYXRpYmxlID0gIm1hcnZlbGwsZG92ZS1waW5jdHJsIjsKLQlyZWcgPSA8MHhkMDIwMCAweDIwPjsKKwlyZWcgPSA8MHhkMDIwMCAweDE0PiwgPDB4ZDA0NDAgMHgwND4sIDwweGQ4MDJjIDB4MDg+OwogCiAJcG14X3VhcnQxX3N3OiBwbXgtdWFydDEtc3cgewogCQltYXJ2ZWxsLHBpbnMgPSAibXBwX3VhcnQxIjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLnR4dAppbmRleCBiYzBkZmRmLi42NmRjYWE5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXNpbmdsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zaW5nbGUudHh0CkBAIC02Myw2ICs2MywxMyBAQAogCQkvKiBpbnB1dCwgZW5hYmxlIGJpdHMsIGRpc2FibGUgYml0cywgbWFzayAqLwogCQlwaW5jdHJsLXNpbmdsZSxpbnB1dC1zY2htaXR0LWVuYWJsZSA9IDwweDMwIDB4NDAgMCAweDcwPjsKIAorLSBwaW5jdHJsLXNpbmdsZSxsb3ctcG93ZXItbW9kZSA6IGFycmF5IG9mIHZhbHVlIHRoYXQgYXJlIHVzZWQgdG8gY29uZmlndXJlCisgIGxvdyBwb3dlciBtb2RlIG9mIHRoaXMgcGluLiBGb3Igc29tZSBzaWxpY29ucywgdGhlIGxvdyBwb3dlciBtb2RlIHdpbGwKKyAgY29udHJvbCB0aGUgb3V0cHV0IG9mIHRoZSBwaW4gd2hlbiB0aGUgcGFkIGluY2x1ZGluZyB0aGUgcGluIGVudGVyIGxvdworICBwb3dlciBtb2RlLgorCQkvKiBsb3cgcG93ZXIgbW9kZSB2YWx1ZSwgbWFzayAqLworCQlwaW5jdHJsLXNpbmdsZSxsb3ctcG93ZXItbW9kZSA9IDwweDI4OCAweDM4OD47CisKIC0gcGluY3RybC1zaW5nbGUsZ3Bpby1yYW5nZSA6IGxpc3Qgb2YgdmFsdWUgdGhhdCBhcmUgdXNlZCB0byBjb25maWd1cmUgYSBHUElPCiAgIHJhbmdlLiBUaGV5J3JlIHZhbHVlIG9mIHN1Ym5vZGUgcGhhbmRsZSwgcGluIGJhc2UgaW4gcGluY3RybCBkZXZpY2UsIHBpbgogICBudW1iZXIgaW4gdGhpcyByYW5nZSwgR1BJTyBmdW5jdGlvbiB2YWx1ZSBvZiB0aGlzIEdQSU8gcmFuZ2UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc3QudHh0CmluZGV4IDA1YmY4MmEuLjRiZDViZTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc3QudHh0CkBAIC0xMSwxOCArMTEsNjggQEAKIFNUIHBpbmN0cmwgZHJpdmVyIGNvbnRyb2xzIFBJTyBtdWx0aXBsZXhpbmcgYmxvY2sgYW5kIGFsc28gaW50ZXJhY3RzIHdpdGgKIGdwaW8gZHJpdmVyIHRvIGNvbmZpZ3VyZSBhIHBpbi4KIAotUmVxdWlyZWQgcHJvcGVydGllczogKFBJTyBtdWx0aXBsZXhpbmcgYmxvY2spCitHUElPIGJhbmsgY2FuIGhhdmUgb25lIG9mIHRoZSB0d28gcG9zc2libGUgdHlwZXMgb2YgaW50ZXJydXB0LXdpcmluZ3MuCisKK0ZpcnN0IHR5cGUgaXMgdmlhIGlycW11eCwgc2luZ2xlIGludGVycnVwdCBpcyB1c2VkIGJ5IG11bHRpcGxlIGdwaW8gYmFua3MuIFRoaXMKK3JlZHVjZXMgbnVtYmVyIG9mIG92ZXJhbGwgaW50ZXJydXB0cyBudW1iZXJzIHJlcXVpcmVkLiBBbGwgdGhlc2UgYmFua3MgYmVsb25nIHRvCithIHNpbmdsZSBwaW5jb250cm9sbGVyLgorCQkgIF9fX19fX19fXworCQkgfAkgICB8LS0tLT4gW2dwaW8tYmFuayAobikgICAgXQorCQkgfAkgICB8LS0tLT4gW2dwaW8tYmFuayAobiArIDEpXQorCVtpcnFOXS0tIHwgaXJxLW11eCB8LS0tLT4gW2dwaW8tYmFuayAobiArIDIpXQorCQkgfAkgICB8LS0tLT4gW2dwaW8tYmFuayAoLi4uICApXQorCQkgfF9fX19fX19fX3wtLS0tPiBbZ3Bpby1iYW5rIChuICsgNyldCisKK1NlY29uZCB0eXBlIGhhcyBhIGRlZGljYXRlZCBpbnRlcnJ1cHQgcGVyIGdwaW8gYmFuay4KKworCVtpcnFOXS0tLS0+IFtncGlvLWJhbmsgKG4pXQorCisKK1BpbiBjb250cm9sbGVyIG5vZGU6CitSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlCTogc2hvdWxkIGJlICJzdCw8U09DPi08cGlvLWJsb2NrPi1waW5jdHJsIgogCWxpa2Ugc3Qsc3RpaDQxNS1zYmMtcGluY3RybCwgc3Qsc3RpaDQxNS1mcm9udC1waW5jdHJsIGFuZCBzbyBvbi4KLS0gZ3Bpby1jb250cm9sbGVyIDogSW5kaWNhdGVzIHRoaXMgZGV2aWNlIGlzIGEgR1BJTyBjb250cm9sbGVyCi0tICNncGlvLWNlbGxzCSAgOiBTaG91bGQgYmUgb25lLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlci4KKy0gc3Qsc3lzY2ZnCQk6IFNob3VsZCBiZSBhIHBoYW5kbGUgb2YgdGhlIHN5c2NmZyBub2RlLgogLSBzdCxyZXRpbWUtcGluLW1hc2sJOiBTaG91bGQgYmUgbWFzayB0byBzcGVjaWZ5IHdoaWNoIHBpbnMgY2FuIGJlIHJldGltZWQuCiAJSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHRoZSBwaW5zIGluIHRoZQogCWJhbmsgYXJlIGNhcGFibGUgb2YgcmV0aW1pbmcuIFJldGltaW5nIGlzIG1haW5seSB1c2VkIHRvIGltcHJvdmUgdGhlCiAJSU8gdGltaW5nIG1hcmdpbnMgb2YgZXh0ZXJuYWwgc3luY2hyb25vdXMgaW50ZXJmYWNlcy4KLS0gc3QsYmFuay1uYW1lCQk6IFNob3VsZCBiZSBhIG5hbWUgc3RyaW5nIGZvciB0aGlzIGJhbmsgYXMKLQkJCXNwZWNpZmllZCBpbiBkYXRhc2hlZXQuCi0tIHN0LHN5c2NmZwkJOiBTaG91bGQgYmUgYSBwaGFuZGxlIG9mIHRoZSBzeXNjZmcgbm9kZS4KKy0gcmFuZ2VzIDogZGVmaW5lcyBtYXBwaW5nIGJldHdlZW4gcGluIGNvbnRyb2xsZXIgbm9kZSAocGFyZW50KSB0byBncGlvLWJhbmsKKyAgbm9kZSAoY2hpbGRyZW4pLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBpbnRlcnJ1cHRzCTogSW50ZXJydXB0IG51bWJlciBvZiB0aGUgaXJxbXV4LiBJZiB0aGUgaW50ZXJydXB0IGlzIHNoYXJlZAorICB3aXRoIG90aGVyIGdwaW8gYmFua3MgdmlhIGlycW11eC4KKyAgYSBpcnFsaW5lIGFuZCBncGlvIGJhbmtzLgorLSByZWcJCTogaXJxbXV4IG1lbW9yeSByZXNvdXJjZS4gSWYgaXJxbXV4IGlzIHByZXNlbnQuCistIHJlZy1uYW1lcwk6IGlycW11eCByZXNvdXJjZSBzaG91bGQgYmUgbmFtZWQgYXMgImlycW11eCIuCisKK0dQSU8gY29udHJvbGxlci9iYW5rIG5vZGUuCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBncGlvLWNvbnRyb2xsZXIgOiBJbmRpY2F0ZXMgdGhpcyBkZXZpY2UgaXMgYSBHUElPIGNvbnRyb2xsZXIKKy0gI2dwaW8tY2VsbHMJICA6IFNob3VsZCBiZSBvbmUuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyLgorLSBzdCxiYW5rLW5hbWUJICA6IFNob3VsZCBiZSBhIG5hbWUgc3RyaW5nIGZvciB0aGlzIGJhbmsgYXMgc3BlY2lmaWVkIGluCisgIGRhdGFzaGVldC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gaW50ZXJydXB0cwk6IEludGVycnVwdCBudW1iZXIgZm9yIHRoaXMgZ3BpbyBiYW5rLiBJZiB0aGVyZSBpcyBhIGRlZGljYXRlZAorICBpbnRlcnJ1cHQgd2lyZWQgdXAgZm9yIHRoaXMgZ3BpbyBiYW5rLgorCistIGludGVycnVwdC1jb250cm9sbGVyIDogSW5kaWNhdGVzIHRoaXMgZGV2aWNlIGlzIGEgaW50ZXJydXB0IGNvbnRyb2xsZXIuIEdQSU8KKyAgYmFuayBjYW4gYmUgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIgaWZmIG9uZSBvZiB0aGUgaW50ZXJydXB0IHR5cGUgZWl0aGVyIHZpYQoraXJxbXV4IG9yIGEgZGVkaWNhdGVkIGludGVycnVwdCBwZXIgYmFuayBpcyBzcGVjaWZpZWQuCisKKy0gI2ludGVycnVwdC1jZWxsczogdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIDIuCisgICAgIC0gRmlyc3QgQ2VsbDogcmVwcmVzZW50cyB0aGUgZXh0ZXJuYWwgZ3BpbyBpbnRlcnJ1cHQgbnVtYmVyIGxvY2FsIHRvIHRoZQorICAgICAgIGdwaW8gaW50ZXJydXB0IHNwYWNlIG9mIHRoZSBjb250cm9sbGVyLgorICAgICAtIFNlY29uZCBDZWxsOiBmbGFncyB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiB0aGUgaW50ZXJydXB0CisgICAgICAgLSAxID0gcmlzaW5nIGVkZ2UgdHJpZ2dlcmVkCisgICAgICAgLSAyID0gZmFsbGluZyBlZGdlIHRyaWdnZXJlZAorICAgICAgIC0gMyA9IHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJlZAorICAgICAgIC0gNCA9IGhpZ2ggbGV2ZWwgdHJpZ2dlcmVkCisgICAgICAgLSA4ID0gbG93IGxldmVsIHRyaWdnZXJlZAorZm9yIHJlbGF0ZWQgbWFjcm9zIGxvb2sgaW46CitpbmNsdWRlL2R0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2lycS5oCiAKIEV4YW1wbGU6CiAJcGluLWNvbnRyb2xsZXItc2JjIHsKQEAgLTMwLDEwICs4MCwxNyBAQAogCQkjc2l6ZS1jZWxscwk9IDwxPjsKIAkJY29tcGF0aWJsZQk9ICJzdCxzdGloNDE1LXNiYy1waW5jdHJsIjsKIAkJc3Qsc3lzY2ZnCT0gPCZzeXNjZmdfc2JjPjsKKwkJcmVnIAkJPSA8MHhmZTYxZjA4MCAweDQ+OworCQlyZWctbmFtZXMJPSAiaXJxbXV4IjsKKwkJaW50ZXJydXB0cyAJPSA8R0lDX1NQSSAxODAgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWludGVycnVwdHMtbmFtZXMgPSAiaXJxbXV4IjsKIAkJcmFuZ2VzIAkJPSA8MCAweGZlNjEwMDAwIDB4NTAwMD47CisKIAkJUElPMDogZ3Bpb0BmZTYxMDAwMCB7CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscwk9IDwxPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJCXJlZwkJPSA8MCAweDEwMD47CiAJCQlzdCxiYW5rLW5hbWUJPSAiUElPMCI7CiAJCX07CkBAIC0xMDUsNiArMTYyLDEwIEBACiAKIHNkaGNpMDpzZGhjaUBmZTgxMDAwMHsKIAkuLi4KKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZQSU8zPjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCWludGVycnVwdHMgPSA8MyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsgLyogSW50ZXJydXB0IGxpbmUgdmlhIFBJTzMtMyAqLworCWludGVycnVwdHMtbmFtZXMgPSAiY2FyZC1kZXRlY3QiOwogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wCT0gPCZwaW5jdHJsX21tYz47CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxtc204OTc0LXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxtc204OTc0LXBpbmN0cmwudHh0CmluZGV4IDRjMzUyYmUuLjlmYjg5ZTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sbXNtODk3NC1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLG1zbTg5NzQtcGluY3RybC50eHQKQEAgLTEsNyArMSw3IEBACiBRdWFsY29tbSBNU004OTc0IFRMTU0gYmxvY2sKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogInFjb20sbXNtOHg3NC1waW5jdHJsIgorLSBjb21wYXRpYmxlOiAicWNvbSxtc204OTc0LXBpbmN0cmwiCiAtIHJlZzogU2hvdWxkIGJlIHRoZSBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgVExNTSBibG9jay4KIC0gaW50ZXJydXB0czogU2hvdWxkIGJlIHRoZSBwYXJlbnQgSVJRIG9mIHRoZSBUTE1NIGJsb2NrLgogLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyLgpAQCAtNDIsMTQgKzQyLDE0IEBACiBOb3RlIHRoYXQgbm90IGFsbCBwcm9wZXJ0aWVzIGFyZSB2YWxpZCBmb3IgYWxsIHBpbnMuCiAKIAotVmFsaWQgdmFsdWVzIGZvciBxY29tLHBpbnMgYXJlOgorVmFsaWQgdmFsdWVzIGZvciBwaW5zIGFyZToKICAgZ3BpbzAtZ3BpbzE0NQogICAgIFN1cHBvcnRzIG11eCwgYmlhcyBhbmQgZHJpdmUtc3RyZW5ndGgKIAogICBzZGMxX2Nsaywgc2RjMV9jbWQsIHNkYzFfZGF0YSwgc2RjMl9jbGssIHNkYzJfY21kLCBzZGMyX2RhdGEKICAgICBTdXBwb3J0cyBiaWFzIGFuZCBkcml2ZS1zdHJlbmd0aAogCi1WYWxpZCB2YWx1ZXMgZm9yIHFjb20sZnVuY3Rpb24gYXJlOgorVmFsaWQgdmFsdWVzIGZvciBmdW5jdGlvbiBhcmU6CiAgIGJsc3BfaTJjMiwgYmxzcF9pMmM2LCBibHNwX2kyYzExLCBibHNwX3NwaTEsIGJsc3BfdWFydDIsIGJsc3BfdWFydDgsIHNsaW1idXMKIAogICAoTm90ZSB0aGF0IHRoaXMgaXMgbm90IHlldCB0aGUgY29tcGxldGUgbGlzdCBvZiBmdW5jdGlvbnMpCkBAIC03MywxOCArNzMsMTggQEAKIAogCQl1YXJ0Ml9kZWZhdWx0OiB1YXJ0Ml9kZWZhdWx0IHsKIAkJCW11eCB7Ci0JCQkJcWNvbSxwaW5zID0gImdwaW80IiwgImdwaW81IjsKLQkJCQlxY29tLGZ1bmN0aW9uID0gImJsc3BfdWFydDIiOworCQkJCXBpbnMgPSAiZ3BpbzQiLCAiZ3BpbzUiOworCQkJCWZ1bmN0aW9uID0gImJsc3BfdWFydDIiOwogCQkJfTsKIAogCQkJdHggewotCQkJCXFjb20scGlucyA9ICJncGlvNCI7CisJCQkJcGlucyA9ICJncGlvNCI7CiAJCQkJZHJpdmUtc3RyZW5ndGggPSA8ND47CiAJCQkJYmlhcy1kaXNhYmxlOwogCQkJfTsKIAogCQkJcnggewotCQkJCXFjb20scGlucyA9ICJncGlvNSI7CisJCQkJcGlucyA9ICJncGlvNSI7CiAJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CiAJCQkJYmlhcy1wdWxsLXVwOwogCQkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3NhbXN1bmctcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zYW1zdW5nLXBpbmN0cmwudHh0CmluZGV4IDI1NzY3N2QuLjJiMzI3ODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3NhbXN1bmctcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc2Ftc3VuZy1waW5jdHJsLnR4dApAQCAtMTYsNiArMTYsNyBAQAogICAtICJzYW1zdW5nLGV4eW5vczQyMTAtcGluY3RybCI6IGZvciBFeHlub3M0MjEwIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgIC0gInNhbXN1bmcsZXh5bm9zNHgxMi1waW5jdHJsIjogZm9yIEV4eW5vczR4MTIgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgLSAic2Ftc3VuZyxleHlub3M1MjUwLXBpbmN0cmwiOiBmb3IgRXh5bm9zNTI1MCBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgorICAtICJzYW1zdW5nLGV4eW5vczUyNjAtcGluY3RybCI6IGZvciBFeHlub3M1MjYwIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgIC0gInNhbXN1bmcsZXh5bm9zNTQyMC1waW5jdHJsIjogZm9yIEV4eW5vczU0MjAgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KIAogLSByZWc6IEJhc2UgYWRkcmVzcyBvZiB0aGUgcGluIGNvbnRyb2xsZXIgaGFyZHdhcmUgbW9kdWxlIGFuZCBsZW5ndGggb2YKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9sMmNhY2hlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9sMmNhY2hlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFiMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2wyY2FjaGUudHh0CkBAIC0wLDAgKzEsMjMgQEAKK0ZyZWVzY2FsZSBMMiBDYWNoZSBDb250cm9sbGVyCisKK0wyIGNhY2hlIGlzIHByZXNlbnQgaW4gRnJlZXNjYWxlJ3MgUW9ySVEgYW5kIFFvcklRIFFvbnZlcmdlIHBsYXRmb3Jtcy4KK1RoZSBjYWNoZSBiaW5kaW5ncyBleHBsYWluZWQgYmVsb3cgYXJlIGVQQVBSIGNvbXBsaWFudAorCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUJOiBTaG91bGQgaW5jbHVkZSAiZnNsLGNoaXAtbDItY2FjaGUtY29udHJvbGxlciIgYW5kICJjYWNoZSIKKwkJICB3aGVyZSBjaGlwIGlzIHRoZSBwcm9jZXNzb3IgKGJzYzkxMzIsIG5wYzg1NzIgZXRjLikKKy0gcmVnCQk6IEFkZHJlc3MgYW5kIHNpemUgb2YgTDIgY2FjaGUgY29udHJvbGxlciByZWdpc3RlcnMKKy0gY2FjaGUtc2l6ZQk6IFNpemUgb2YgdGhlIGVudGlyZSBMMiBjYWNoZQorLSBpbnRlcnJ1cHRzCTogRXJyb3IgaW50ZXJydXB0IG9mIEwyIGNvbnRyb2xsZXIKKy0gY2FjaGUtbGluZS1zaXplIDogU2l6ZSBvZiBMMiBjYWNoZSBsaW5lcworCitFeGFtcGxlOgorCisJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxic2M5MTMyLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOworCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OyAvLyAzMiBieXRlcworCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwyNTZLCisJCWludGVycnVwdHMgPSA8MTYgMiAxIDA+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbWVtLWN0cmxyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9tZW0tY3RybHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Nzg1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbWVtLWN0cmxyLnR4dApAQCAtMCwwICsxLDI3IEBACitGcmVlc2NhbGUgRERSIG1lbW9yeSBjb250cm9sbGVyCisKK1Byb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZQk6IFNob3VsZCBpbmNsdWRlICJmc2wsY2hpcC1tZW1vcnktY29udHJvbGxlciIgd2hlcmUKKwkJICBjaGlwIGlzIHRoZSBwcm9jZXNzb3IgKGJzYzkxMzIsIG1wYzg1NzIgZXRjLiksIG9yCisJCSAgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciIuCistIHJlZwkJOiBBZGRyZXNzIGFuZCBzaXplIG9mIEREUiBjb250cm9sbGVyIHJlZ2lzdGVycworLSBpbnRlcnJ1cHRzCTogRXJyb3IgaW50ZXJydXB0IG9mIEREUiBjb250cm9sbGVyCisKK0V4YW1wbGUgMToKKworCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxic2M5MTMyLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSA4PjsKKwl9OworCisKK0V4YW1wbGUgMjoKKworCWRkcjE6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC43IiwKKwkJCQkiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci50eHQKaW5kZXggNjNjNjU5OC4uZTVjYWMxZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci50eHQKQEAgLTgsOCArOCwxMiBAQAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gZW5hYmxlLWdwaW8JCTogR1BJTyB0byB1c2UgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIHJlZ3VsYXRvci4KIC0gZ3Bpb3MJCQk6IEdQSU8gZ3JvdXAgdXNlZCB0byBjb250cm9sIHZvbHRhZ2UuCistIGdwaW9zLXN0YXRlcwkJOiBncGlvcyBwaW4ncyBpbml0aWFsIHN0YXRlcyBhcnJheS4gMDogTE9XLCAxOiBISUdILgorCQkJICBkZWZ1YWx0IGlzIExPVyBpZiBub3RoaW5nIGlzIHNwZWNpZmllZC4KIC0gc3RhcnR1cC1kZWxheS11cwk6IFN0YXJ0dXAgdGltZSBpbiBtaWNyb3NlY29uZHMuCiAtIGVuYWJsZS1hY3RpdmUtaGlnaAk6IFBvbGFyaXR5IG9mIEdQSU8gaXMgYWN0aXZlIGhpZ2ggKGRlZmF1bHQgaXMgbG93KS4KKy0gcmVndWxhdG9yLXR5cGUJOiBTcGVjaWZpZXMgd2hhdCBpcyBiZWluZyByZWd1bGF0ZWQsIG11c3QgYmUgZWl0aGVyCisJCQkgICJ2b2x0YWdlIiBvciAiY3VycmVudCIsIGRlZmF1bHRzIHRvIGN1cnJlbnQuCiAKIEFueSBwcm9wZXJ0eSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIGNvcmUgcmVndWxhdG9yIGJpbmRpbmcgZGVmaW5lZCBpbgogcmVndWxhdG9yLnR4dCBjYW4gYWxzbyBiZSB1c2VkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3BmdXplMTAwLnR4dAppbmRleCBmYzk4OWIyLi4zNGVmNWQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3BmdXplMTAwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3BmdXplMTAwLnR4dApAQCAtMSw3ICsxLDcgQEAKIFBGVVpFMTAwIGZhbWlseSBvZiByZWd1bGF0b3JzCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJmc2wscGZ1emUxMDAiCistIGNvbXBhdGlibGU6ICJmc2wscGZ1emUxMDAiIG9yICJmc2wscGZ1emUyMDAiCiAtIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MKIAogUmVxdWlyZWQgY2hpbGQgbm9kZToKQEAgLTEwLDExICsxMCwxNCBAQAogICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQuCiAKICAgVGhlIHZhbGlkIG5hbWVzIGZvciByZWd1bGF0b3JzIGFyZToKKyAgLS1QRlVaRTEwMAogICBzdzFhYixzdzFjLHN3MixzdzNhLHN3M2Isc3c0LHN3YnN0LHZzbnZzLHZyZWZkZHIsdmdlbjF+dmdlbjYKKyAgLS1QRlVaRTIwMAorICBzdzFhYixzdzIsc3czYSxzdzNiLHN3YnN0LHZzbnZzLHZyZWZkZHIsdmdlbjF+dmdlbjYKIAogRWFjaCByZWd1bGF0b3IgaXMgZGVmaW5lZCB1c2luZyB0aGUgc3RhbmRhcmQgYmluZGluZyBmb3IgcmVndWxhdG9ycy4KIAotRXhhbXBsZToKK0V4YW1wbGUgMTogUEZVWkUxMDAKIAogCXBtaWM6IHBmdXplMTAwQDA4IHsKIAkJY29tcGF0aWJsZSA9ICJmc2wscGZ1emUxMDAiOwpAQCAtMTEzLDMgKzExNiw5MiBAQAogCQkJfTsKIAkJfTsKIAl9OworCisKK0V4YW1wbGUgMjogUEZVWkUyMDAKKworCXBtaWM6IHBmdXplMjAwQDA4IHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscGZ1emUyMDAiOworCQlyZWcgPSA8MHgwOD47CisKKwkJcmVndWxhdG9ycyB7CisJCQlzdzFhX3JlZzogc3cxYWIgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDMwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTg3NTAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDw2MjUwPjsKKwkJCX07CisKKwkJCXN3Ml9yZWc6IHN3MiB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8ODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJc3czYV9yZWc6IHN3M2EgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDQwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTk3NTAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXN3M2JfcmVnOiBzdzNiIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw0MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE5NzUwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlzd2JzdF9yZWc6IHN3YnN0IHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw1MDAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw1MTUwMDAwPjsKKwkJCX07CisKKwkJCXNudnNfcmVnOiB2c252cyB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTAwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzAwMDAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXZyZWZfcmVnOiB2cmVmZGRyIHsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJdmdlbjFfcmVnOiB2Z2VuMSB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8ODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxNTUwMDAwPjsKKwkJCX07CisKKwkJCXZnZW4yX3JlZzogdmdlbjIgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTU1MDAwMD47CisJCQl9OworCisJCQl2Z2VuM19yZWc6IHZnZW4zIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCX07CisKKwkJCXZnZW40X3JlZzogdmdlbjQgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMzMDAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQl2Z2VuNV9yZWc6IHZnZW41IHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJdmdlbjZfcmVnOiB2Z2VuNiB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9zNW04NzY3LXJlZ3VsYXRvci50eHQKaW5kZXggZmM2YjM4Zi4uZDI5MDk4OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9zNW04NzY3LXJlZ3VsYXRvci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9zNW04NzY3LXJlZ3VsYXRvci50eHQKQEAgLTY5LDEzICs2OSwxNiBAQAogCQl9OwogCX07CiBUaGUgYWJvdmUgcmVndWxhdG9yIGVudHJpZXMgYXJlIGRlZmluZWQgaW4gcmVndWxhdG9yIGJpbmRpbmdzIGRvY3VtZW50YXRpb24KLWV4Y2VwdCBvcF9tb2RlIGRlc2NyaXB0aW9uLgorZXhjZXB0IHRoZXNlIHByb3BlcnRpZXM6CiAJLSBvcF9tb2RlOiBkZXNjcmliZXMgdGhlIGRpZmZlcmVudCBvcGVyYXRpbmcgbW9kZXMgb2YgdGhlIExETydzIHdpdGgKIAkJcG93ZXIgbW9kZSBjaGFuZ2UgaW4gU09DLiBUaGUgZGlmZmVyZW50IHBvc3NpYmxlIHZhbHVlcyBhcmUsCiAJCTAgLSBhbHdheXMgb2ZmIG1vZGUKIAkJMSAtIG9uIGluIG5vcm1hbCBtb2RlCiAJCTIgLSBsb3cgcG93ZXIgbW9kZQogCQkzIC0gc3VzcGVuZCBtb2RlCisJLSBzNW04NzY3LHBtaWMtZXh0LWNvbnRyb2wtZ3Bpb3M6IChvcHRpb25hbCkgR1BJTyBzcGVjaWZpZXIgZm9yIG9uZQorCQlHUElPIGNvbnRyb2xsaW5nIHRoaXMgcmVndWxhdG9yIChlbmFibGUvZGlzYWJsZSk7IFRoaXMgaXMKKwkJdmFsaWQgb25seSBmb3IgYnVjazkuCiAKIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBuYW1lcyBvZiB0aGUgcmVndWxhdG9ycyB0aGF0IHRoZSBzNW04NzY3IHBtaWMgYmxvY2sKIHN1cHBvcnRzLiBOb3RlOiBUaGUgJ24nIGluIExET24gYW5kIEJVQ0tuIHJlcHJlc2VudHMgdGhlIExETyBvciBCVUNLIG51bWJlcgpAQCAtMTQ4LDUgKzE1MSwxMyBAQAogCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CiAJCQkJcmVndWxhdG9yLWJvb3Qtb247CiAJCQl9OworCisJCQl2ZW1tY19yZWc6IEJVQ0s5IHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJWTUVNX1ZERF8yLjhWIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwyODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwyODAwMDAwPjsKKwkJCQlvcF9tb2RlID0gPDM+OyAvKiBTdGFuZGJ5IE1vZGUgKi8KKwkJCQlzNW04NzY3LHBtaWMtZXh0LWNvbnRyb2wtZ3Bpb3MgPSA8JmdwazAgMiAwPjsKKwkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IudHh0CmluZGV4IDJlNTdhMzMuLmM1OGRiNzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLnR4dApAQCAtNCwxMCArNCwxNCBAQAogLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgogICAtICJ0aSxhYmItdjEiIGZvciBvbGRlciBTb0NzIGxpa2UgT01BUDMKICAgLSAidGksYWJiLXYyIiBmb3IgbmV3ZXIgU29DcyBsaWtlIE9NQVA0LCBPTUFQNQorICAtICJ0aSxhYmItdjMiIGZvciBhIGdlbmVyaWMgZGVmaW5pdGlvbiB3aGVyZSBzZXR1cCBhbmQgY29udHJvbCByZWdpc3RlcnMgYXJlCisgICAgIHByb3ZpZGVkIChleGFtcGxlOiBEUkE3KQogLSByZWc6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLiBJdCBjb250YWlucwogICB0aGUgaW5mb3JtYXRpb24gb2YgcmVnaXN0ZXJzIGluIHRoZSBzYW1lIG9yZGVyIGFzIGRlc2NyaWJlZCBieSByZWctbmFtZXMKIC0gcmVnLW5hbWVzOiBTaG91bGQgY29udGFpbiB0aGUgcmVnIG5hbWVzCi0gIC0gImJhc2UtYWRkcmVzcyIJLSBjb250YWlucyBiYXNlIGFkZHJlc3Mgb2YgQUJCIG1vZHVsZQorICAtICJiYXNlLWFkZHJlc3MiCS0gY29udGFpbnMgYmFzZSBhZGRyZXNzIG9mIEFCQiBtb2R1bGUgKHRpLGFiYi12MSx0aSxhYmItdjIpCisgIC0gImNvbnRyb2wtYWRkcmVzcyIJLSBjb250YWlucyBjb250cm9sIHJlZ2lzdGVyIGFkZHJlc3Mgb2YgQUJCIG1vZHVsZSAodGksYWJiLXYzKQorICAtICJzZXR1cC1hZGRyZXNzIgktIGNvbnRhaW5zIHNldHVwIHJlZ2lzdGVyIGFkZHJlc3Mgb2YgQUJCIG1vZHVsZSAodGksYWJiLXYzKQogICAtICJpbnQtYWRkcmVzcyIJLSBjb250YWlucyBhZGRyZXNzIG9mIGludGVycnVwdCByZWdpc3RlciBmb3IgQUJCIG1vZHVsZQogICAoYWxzbyBzZWUgT3B0aW9uYWwgcHJvcGVydGllcykKIC0gI2FkZHJlc3MtY2VsbDogc2hvdWxkIGJlIDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZWZtMzItdWFydC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2VmbTMyLXVhcnQudHh0CmluZGV4IDhlMDgwYjguLjE5ODRiZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZWZtMzItdWFydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9lZm0zMi11YXJ0LnR4dApAQCAtNiw3ICs2LDcgQEAKIC0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIHVhcnQgaW50ZXJydXB0CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6Ci0tIGxvY2F0aW9uIDogRGVjaWRlcyB0aGUgbG9jYXRpb24gb2YgdGhlIFVTQVJUIEkvTyBwaW5zLgorLSBlZm0zMixsb2NhdGlvbiA6IERlY2lkZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBVU0FSVCBJL08gcGlucy4KICAgQWxsb3dlZCByYW5nZSA6IFswIC4uIDVdCiAgIERlZmF1bHQ6IDAKIApAQCAtMTYsNSArMTYsNSBAQAogCWNvbXBhdGlibGUgPSAiZWZtMzIsdWFydCI7CiAJcmVnID0gPDB4NDAwMGM0MDAgMHg0MDA+OwogCWludGVycnVwdHMgPSA8MTU+OwotCWxvY2F0aW9uID0gPDA+OworCWVmbTMyLGxvY2F0aW9uID0gPDA+OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZnNsLWxwdWFydC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2ZzbC1scHVhcnQudHh0CmluZGV4IDZmZDFkZDEuLmExZDEyMDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZnNsLWxwdWFydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9mc2wtbHB1YXJ0LnR4dApAQCAtNCwxMSArNCwyNCBAQAogLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPHNvYz4tbHB1YXJ0IgogLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQogLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gdWFydCBpbnRlcnJ1cHQKKy0gY2xvY2tzIDogcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBwYWlycywgb25lIGZvciBlYWNoIGVudHJ5IGluIGNsb2NrLW5hbWVzCistIGNsb2NrLW5hbWVzIDogc2hvdWxkIGNvbnRhaW46ICJpcGciIC0gdGhlIHVhcnQgY2xvY2sKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gZG1hczogQSBsaXN0IG9mIHR3byBkbWEgc3BlY2lmaWVycywgb25lIGZvciBlYWNoIGVudHJ5IGluIGRtYS1uYW1lcy4KKy0gZG1hLW5hbWVzOiBzaG91bGQgY29udGFpbiAidHgiIGFuZCAicngiLgorCitOb3RlOiBPcHRpb25hbCBwcm9wZXJ0aWVzIGZvciBETUEgc3VwcG9ydC4gV3JpdGUgdGhlbSBib3RoIG9yIGJvdGggbm90LgogCiBFeGFtcGxlOgogCiB1YXJ0MDogc2VyaWFsQDQwMDI3MDAwIHsKLQkgICAgICAgY29tcGF0aWJsZSA9ICJmc2wsdmY2MTAtbHB1YXJ0IjsKLQkgICAgICAgcmVnID0gPDB4NDAwMjcwMDAgMHgxMDAwPjsKLQkgICAgICAgaW50ZXJydXB0cyA9IDwwIDYxIDB4MDA+OwotICAgICAgIH07CisJCWNvbXBhdGlibGUgPSAiZnNsLHZmNjEwLWxwdWFydCI7CisJCXJlZyA9IDwweDQwMDI3MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MCA2MSAweDAwPjsKKwkJY2xvY2tzID0gPCZjbGtzIFZGNjEwX0NMS19VQVJUMD47CisJCWNsb2NrLW5hbWVzID0gImlwZyI7CisJCWRtYXMgPSA8JmVkbWEwIDAgMj4sCisJCQk8JmVkbWEwIDAgMz47CisJCWRtYS1uYW1lcyA9ICJyeCIsInR4IjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9tYXhpbSxtYXgzMTB4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvbWF4aW0sbWF4MzEweC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhOTE5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvbWF4aW0sbWF4MzEweC50eHQKQEAgLTAsMCArMSwzNiBAQAorKiBNYXhpbSBNQVgzMTBYIGFkdmFuY2VkIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXItVHJhbnNtaXR0ZXIgKFVBUlQpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgLSAibWF4aW0sbWF4MzEwNyIgZm9yIE1heGltIE1BWDMxMDcsCisgIC0gIm1heGltLG1heDMxMDgiIGZvciBNYXhpbSBNQVgzMTA4LAorICAtICJtYXhpbSxtYXgzMTA5IiBmb3IgTWF4aW0gTUFYMzEwOSwKKyAgLSAibWF4aW0sbWF4MTQ4MzAiIGZvciBNYXhpbSBNQVgxNDgzMC4KKy0gcmVnOiBTUEkgY2hpcCBzZWxlY3QgbnVtYmVyLgorLSBpbnRlcnJ1cHQtcGFyZW50OiBUaGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQKKyAgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBJQy4KKy0gaW50ZXJydXB0czogU3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIG9mIHRoZSBwYXJlbnQgaW50ZXJydXB0CisgIGNvbnRyb2xsZXIuIFRoZSBmb3JtYXQgb2YgdGhlIGludGVycnVwdCBzcGVjaWZpZXIgZGVwZW5kcyBvbiB0aGUKKyAgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLgorLSBjbG9ja3M6IHBoYW5kbGUgdG8gdGhlIElDIHNvdXJjZSBjbG9jay4KKy0gY2xvY2stbmFtZXM6IFNob3VsZCBiZSAieHRhbCIgaWYgY2xvY2sgaXMgYW4gZXh0ZXJuYWwgY3J5c3RhbCBvcgorICAib3NjIiBpZiBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UgaXMgdXNlZC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gZ3Bpby1jb250cm9sbGVyOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBHUElPIGNvbnRyb2xsZXIuCistICNncGlvLWNlbGxzOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgR1BJTyBudW1iZXIgYW5kCisgIHRoZSBzZWNvbmQgY2VsbCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIEdQSU8gcG9sYXJpdHk6CisgICAgMCA9IGFjdGl2ZSBoaWdoLAorICAgIDEgPSBhY3RpdmUgbG93LgorCitFeGFtcGxlOgorCW1heDE0ODMwOiBtYXgxNDgzMEAwIHsKKwkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgxNDgzMCI7CisJCXJlZyA9IDwwPjsKKwkJY2xvY2tzID0gPCZjbGsyMG0+OworCQljbG9jay1uYW1lcyA9ICJvc2MiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvMz47CisJCWludGVycnVwdHMgPSA8NyBJUlFfVFlQRV9FREdFX0ZBTExJTkc+OworCQlncGlvLWNvbnRyb2xsZXI7CisJCSNncGlvLWNlbGxzID0gPDI+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3JlbmVzYXMsc2NpLXNlcmlhbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3JlbmVzYXMsc2NpLXNlcmlhbC50eHQKaW5kZXggZjM3MmNmMi4uNTNlNmMxNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9yZW5lc2FzLHNjaS1zZXJpYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvcmVuZXNhcyxzY2ktc2VyaWFsLnR4dApAQCAtMzcsNyArMzcsNyBAQAogCX07CiAKIAlzY2lmYTA6IHNlcmlhbEBlNmM0MDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmYS1yOGE3NzkwIiwgInJlbmVzYXMsc2NpZmEtZ2VuZXJpYyI7CisJCWNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmYS1yOGE3NzkwIiwgInJlbmVzYXMsc2NpZmEiOwogCQlyZWcgPSA8MCAweGU2YzQwMDAwIDAgNjQ+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQlpbnRlcnJ1cHRzID0gPDAgMTQ0IElSUV9UWVBFX0xFVkVMX0hJR0g+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2FybWFkYS0zNzBkYi1hdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvYXJtYWRhLTM3MGRiLWF1ZGlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk4NGQyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvYXJtYWRhLTM3MGRiLWF1ZGlvLnR4dApAQCAtMCwwICsxLDI3IEBACitEZXZpY2UgVHJlZSBiaW5kaW5ncyBmb3IgdGhlIEFybWFkYSAzNzAgREIgYXVkaW8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBEZXZpY2UgVHJlZSBiaW5kaW5ncyBhcmUgdXNlZCB0byBkZXNjcmliZSB0aGUgYXVkaW8gY29tcGxleAorZm91bmQgb24gdGhlIEFybWFkYSAzNzAgREIgcGxhdGZvcm0uCisKK01hbmRhdG9yeSBwcm9wZXJ0aWVzOgorCisgKiBjb21wYXRpYmxlOiBtdXN0IGJlICJtYXJ2ZWxsLGEzNzBkYi1hdWRpbyIKKworICogbWFydmVsbCxhdWRpby1jb250cm9sbGVyOiBhIHBoYW5kbGUgdGhhdCBwb2ludHMgdG8gdGhlIGF1ZGlvCisgICBjb250cm9sbGVyIG9mIHRoZSBBcm1hZGEgMzcwIFNvQy4KKworICogbWFydmVsbCxhdWRpby1jb2RlYzogYSBzZXQgb2YgdGhyZWUgcGhhbmRsZXMgdGhhdCBwb2ludHMgdG86CisKKyAgICAxLyB0aGUgYW5hbG9nIGF1ZGlvIGNvZGVjIGNvbm5lY3RlZCB0byB0aGUgQXJtYWRhIDM3MCBTb0MKKyAgICAyLyB0aGUgUy9QRElGIHRyYW5zY2VpdmVyCisgICAgMy8gdGhlIFMvUERJRiByZWNlaXZlcgorCitFeGFtcGxlOgorCisJc291bmQgeworCSAgICAgIGNvbXBhdGlibGUgPSAibWFydmVsbCxhMzcwZGItYXVkaW8iOworCSAgICAgIG1hcnZlbGwsYXVkaW8tY29udHJvbGxlciA9IDwmYXVkaW9fY29udHJvbGxlcj47CisJICAgICAgbWFydmVsbCxhdWRpby1jb2RlYyA9IDwmYXVkaW9fY29kZWMgJnNwZGlmX291dCAmc3BkaWZfaW4+OworCSAgICAgIHN0YXR1cyA9ICJva2F5IjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2NzNDJ4eDgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2NzNDJ4eDgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzFmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvY3M0Mnh4OC50eHQKQEAgLTAsMCArMSwyOCBAQAorQ1M0MjQ0OC9DUzQyODg4IGF1ZGlvIENPREVDCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogbXVzdCBjb250YWluIG9uZSBvZiAiY2lycnVzLGNzNDI0NDgiIGFuZCAiY2lycnVzLGNzNDI4ODgiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3IgSTJDCisKKyAgLSBjbG9ja3MgOiBhIGxpc3Qgb2YgcGhhbmRsZXMgKyBjbG9jay1zcGVjaWZpZXJzLCBvbmUgZm9yIGVhY2ggZW50cnkgaW4KKyAgICBjbG9jay1uYW1lcworCisgIC0gY2xvY2stbmFtZXMgOiBtdXN0IGNvbnRhaW4gIm1jbGsiCisKKyAgLSBWQS1zdXBwbHksIFZELXN1cHBseSwgVkxTLXN1cHBseSwgVkxDLXN1cHBseTogcG93ZXIgc3VwcGxpZXMgZm9yIHRoZSBkZXZpY2UsCisgICAgYXMgY292ZXJlZCBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKKworRXhhbXBsZToKKworY29kZWM6IGNzNDI4ODhANDggeworCWNvbXBhdGlibGUgPSAiY2lycnVzLGNzNDI4ODgiOworCXJlZyA9IDwweDQ4PjsKKwljbG9ja3MgPSA8JmNvZGVjX21jbGsgMD47CisJY2xvY2stbmFtZXMgPSAibWNsayI7CisJVkEtc3VwcGx5ID0gPCZyZWdfYXVkaW8+OworCVZELXN1cHBseSA9IDwmcmVnX2F1ZGlvPjsKKwlWTFMtc3VwcGx5ID0gPCZyZWdfYXVkaW8+OworCVZMQy1zdXBwbHkgPSA8JnJlZ19hdWRpbz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhOTA1NS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGE5MDU1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDFiN2NjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhOTA1NS50eHQKQEAgLTAsMCArMSwyMiBAQAorKiBEaWFsb2cgREE5MDU1IEF1ZGlvIENPREVDCisKK0RBOTA1NSBwcm92aWRlcyBBdWRpbyBDT0RFQyBzdXBwb3J0IChJMkMgb25seSkuCisKK1RoZSBBdWRpbyBDT0RFQyBkZXZpY2UgaW4gREE5MDU1IGhhcyBpdCdzIG93biBJMkMgYWRkcmVzcyB3aGljaCBpcyBjb25maWd1cmFibGUsCitzbyB0aGUgZGV2aWNlIGlzIGluc3RhbnRpYXRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIFBNSUMgKE1GRCkgZGV2aWNlLgorCitGb3IgZGV0YWlscyBvbiBhY2NvbXBhbnlpbmcgUE1JQyBJMkMgZGV2aWNlLCBzZWUgdGhlIGZvbGxvd2luZzoKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvZGE5MDU1LnR4dAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZTogImRsZyxkYTkwNTUtY29kZWMiCisgIC0gcmVnOiBTcGVjaWZpZXMgdGhlIEkyQyBzbGF2ZSBhZGRyZXNzCisKKworRXhhbXBsZToKKworCWNvZGVjOiBkYTkwNTUtY29kZWNAMWEgeworCQljb21wYXRpYmxlID0gImRsZyxkYTkwNTUtY29kZWMiOworCQlyZWcgPSA8MHgxYT47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYXZpbmNpLWV2bS1hdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGF2aW5jaS1ldm0tYXVkaW8udHh0CmluZGV4IDg2NTE3OGQuLjk2M2UxMDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYXZpbmNpLWV2bS1hdWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhdmluY2ktZXZtLWF1ZGlvLnR4dApAQCAtNSwxMiArNSwxOSBAQAogLSB0aSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNvbXBsZXguCiAtIHRpLGF1ZGlvLWNvZGVjIDogVGhlIHBoYW5kbGUgb2YgdGhlIFRMVjMyMEFJQzN4IGF1ZGlvIGNvZGVjCiAtIHRpLG1jYXNwLWNvbnRyb2xsZXIgOiBUaGUgcGhhbmRsZSBvZiB0aGUgTWNBU1AgY29udHJvbGxlcgotLSB0aSxjb2RlYy1jbG9jay1yYXRlIDogVGhlIENvZGVjIENsb2NrIHJhdGUgKGluIEh6KSBhcHBsaWVkIHRvIHRoZSBDb2RlYwogLSB0aSxhdWRpby1yb3V0aW5nIDogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCiAgIEVhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MsIHRoZSBmaXJzdCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNpbmssCiAgIHRoZSBzZWNvbmQgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzb3VyY2UuIFZhbGlkIG5hbWVzIGZvciBzb3VyY2VzIGFuZAogICBzaW5rcyBhcmUgdGhlIGNvZGVjJ3MgcGlucywgYW5kIHRoZSBqYWNrcyBvbiB0aGUgYm9hcmQ6CiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHRpLGNvZGVjLWNsb2NrLXJhdGUgOiBUaGUgQ29kZWMgQ2xvY2sgcmF0ZSAoaW4gSHopIGFwcGxpZWQgdG8gdGhlIENvZGVjLgorLSBjbG9ja3MgOiBSZWZlcmVuY2UgdG8gdGhlIG1hc3RlciBjbG9jaworLSBjbG9jay1uYW1lcyA6IFRoZSBjbG9jayBzaG91bGQgYmUgbmFtZWQgIm1jbGsiCistIEVpdGhlciBjb2RlYy1jbG9jay1yYXRlIG9yIHRoZSBjb2RlYy1jbG9jayByZWZlcmVuY2UgaGFzIHRvIGJlIGRlZmluZWQuIElmCisgIHRoZSBib3RoIGFyZSBkZWZpbmVkIHRoZSBkcml2ZXIgYXR0ZW1wdHMgdG8gc2V0IHJlZmVyZW5jZWQgY2xvY2sgdG8gdGhlCisgIGRlZmluZWQgcmF0ZSBhbmQgdGFrZXMgdGhlIHJhdGUgZnJvbSB0aGUgY2xvY2sgcmVmZXJlbmNlLgorCiAgIEJvYXJkIGNvbm5lY3RvcnM6CiAKICAgKiBIZWFkcGhvbmUgSmFjawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2V1a3JlYS10bHYzMjAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2V1a3JlYS10bHYzMjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzk4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZXVrcmVhLXRsdjMyMC50eHQKQEAgLTAsMCArMSwyMSBAQAorQXVkaW8gY29tcGxleCBmb3IgRXVrcmVhIGJvYXJkcyB3aXRoIHRsdjMyMGFpYzIzIGNvZGVjLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogImV1a3JlYSxhc29jLXRsdjMyMCIKKy0gZXVrcmVhLG1vZGVsIDogVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoaXMgc291bmQgY29tcGxleC4KKy0gc3NpLWNvbnRyb2xsZXIgOiBUaGUgcGhhbmRsZSBvZiB0aGUgU1NJIGNvbnRyb2xsZXIuCistIGZzbCxtdXgtaW50LXBvcnQgOiBUaGUgaW50ZXJuYWwgcG9ydCBvZiB0aGUgaS5NWCBhdWRpbyBtdXhlciAoQVVETVVYKS4KKy0gZnNsLG11eC1leHQtcG9ydCA6IFRoZSBleHRlcm5hbCBwb3J0IG9mIHRoZSBpLk1YIGF1ZGlvIG11eGVyLgorCitOb3RlOiBUaGUgQVVETVVYIHBvcnQgbnVtYmVyaW5nIHNob3VsZCBzdGFydCBhdCAxLCB3aGljaCBpcyBjb25zaXN0ZW50IHdpdGgKK2hhcmR3YXJlIG1hbnVhbC4KKworRXhhbXBsZToKKworCXNvdW5kIHsKKwkJY29tcGF0aWJsZSA9ICJldWtyZWEsYXNvYy10bHYzMjAiOworCQlldWtyZWEsbW9kZWwgPSAiaW14NTEtZXVrcmVhLXRsdjMyMGFpYzIzIjsKKwkJc3NpLWNvbnRyb2xsZXIgPSA8JnNzaTI+OworCQlmc2wsbXV4LWludC1wb3J0ID0gPDI+OworCQlmc2wsbXV4LWV4dC1wb3J0ID0gPDM+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLGVzYWkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxlc2FpLnR4dAppbmRleCBkN2I5OWZhLi5hZWI4YzRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLGVzYWkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsZXNhaS50eHQKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgdGhhdCBFU0FJIHdvdWxkIHdvcmsgaW4gdGhlIHN5bmNocm9ub3VzIG1vZGUsIHdoaWNoIG1lYW5zIGFsbCB0aGUgc2V0dGluZ3MKICAgICBmb3IgUmVjZWl2aW5nIHdvdWxkIGJlIGR1cGxpY2F0ZWQgZnJvbSBUcmFuc21pdGlvbiByZWxhdGVkIHJlZ2lzdGVycy4KIAorICAtIGJpZy1lbmRpYW4gOiBJZiB0aGlzIHByb3BlcnR5IGlzIGFic2VudCwgdGhlIG5hdGl2ZSBlbmRpYW4gbW9kZSB3aWxsCisgICAgYmUgaW4gdXNlIGFzIGRlZmF1bHQsIG9yIHRoZSBiaWcgZW5kaWFuIG1vZGUgd2lsbCBiZSBpbiB1c2UgZm9yIGFsbCB0aGUKKyAgICBkZXZpY2UgcmVnaXN0ZXJzLgorCiBFeGFtcGxlOgogCiBlc2FpOiBlc2FpQDAyMDI0MDAwIHsKQEAgLTQ2LDUgKzUwLDYgQEAKIAlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCWZzbCxmaWZvLWRlcHRoID0gPDEyOD47CiAJZnNsLGVzYWktc3luY2hyb25vdXM7CisJYmlnLWVuZGlhbjsKIAlzdGF0dXMgPSAiZGlzYWJsZWQiOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsc3BkaWYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxzcGRpZi50eHQKaW5kZXggZjJhZTMzNS4uM2U5ZTgyYzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsc3BkaWYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsc3BkaWYudHh0CkBAIC0yOSw2ICsyOSwxMCBAQAogCQkJY2FuIGFsc28gYmUgcmVmZXJyZWQgdG8gVHhDbGtfU291cmNlCiAJCQliaXQgb2YgcmVnaXN0ZXIgU1BESUZfU1RDLgogCisgICAtIGJpZy1lbmRpYW4gOiBJZiB0aGlzIHByb3BlcnR5IGlzIGFic2VudCwgdGhlIG5hdGl2ZSBlbmRpYW4gbW9kZSB3aWxsCisgICBiZSBpbiB1c2UgYXMgZGVmYXVsdCwgb3IgdGhlIGJpZyBlbmRpYW4gbW9kZSB3aWxsIGJlIGluIHVzZSBmb3IgYWxsIHRoZQorICAgZGV2aWNlIHJlZ2lzdGVycy4KKwogRXhhbXBsZToKIAogc3BkaWY6IHNwZGlmQDAyMDA0MDAwIHsKQEAgLTUwLDUgKzU0LDYgQEAKIAkJInJ4dHg1IiwgInJ4dHg2IiwKIAkJInJ4dHg3IjsKIAorCWJpZy1lbmRpYW47CiAJc3RhdHVzID0gIm9rYXkiOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tdmVidS1hdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbXZlYnUtYXVkaW8udHh0CmluZGV4IGYwMDYyYzUuLmNiOGMwN2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tdmVidS1hdWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL212ZWJ1LWF1ZGlvLnR4dApAQCAtNSw2ICs1LDcgQEAKIC0gY29tcGF0aWJsZToKICAgIm1hcnZlbGwsa2lya3dvb2QtYXVkaW8iIGZvciBLaXJrd29vZCBwbGF0Zm9ybXMKICAgIm1hcnZlbGwsZG92ZS1hdWRpbyIgZm9yIERvdmUgcGxhdGZvcm1zCisgICJtYXJ2ZWxsLGFybWFkYTM3MC1hdWRpbyIgZm9yIEFybWFkYSAzNzAgcGxhdGZvcm1zCiAKIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCiAgIHJlZ2lvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9wY201MTJ4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9wY201MTJ4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWZmNzVlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3BjbTUxMngudHh0CkBAIC0wLDAgKzEsMzAgQEAKK1BDTTUxMnggYXVkaW8gQ09ERUNzCisKK1RoZXNlIGRldmljZXMgc3VwcG9ydCBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiBPbmUgb2YgInRpLHBjbTUxMjEiIG9yICJ0aSxwY201MTIyIgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKKyAgLSBBVkRELXN1cHBseSwgRFZERC1zdXBwbHksIGFuZCBDUFZERC1zdXBwbHkgOiBwb3dlciBzdXBwbGllcyBmb3IgdGhlCisgICAgZGV2aWNlLCBhcyBjb3ZlcmVkIGluIGJpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKyAgLSBjbG9ja3MgOiBBIGNsb2NrIHNwZWNpZmllciBmb3IgdGhlIGNsb2NrIGNvbm5lY3RlZCBhcyBTQ0xLLiAgSWYgdGhpcworICAgIGlzIGFic2VudCB0aGUgZGV2aWNlIHdpbGwgYmUgY29uZmlndXJlZCB0byBjbG9jayBmcm9tIEJDTEsuCisKK0V4YW1wbGU6CisKKwlwY201MTIyOiBwY201MTIyQDRjIHsKKwkJY29tcGF0aWJsZSA9ICJ0aSxwY201MTIyIjsKKwkJcmVnID0gPDB4NGM+OworCisJCUFWREQtc3VwcGx5ID0gPCZyZWdfM3YzX2FuYWxvZz47CisJCURWREQtc3VwcGx5ID0gPCZyZWdfMXY4PjsKKwkJQ1BWREQtc3VwcGx5ID0gPCZyZWdfM3YzPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNuZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcmVuZXNhcyxyc25kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRlOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNuZC50eHQKQEAgLTAsMCArMSwxMDUgQEAKK1JlbmVzYXMgUi1DYXIgc291bmQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQkJCTogInJlbmVzYXMscmNhcl9zb3VuZC1nZW4xIiBpZiBnZW5lcmF0aW9uMQorCQkJCSAgInJlbmVzYXMscmNhcl9zb3VuZC1nZW4yIiBpZiBnZW5lcmF0aW9uMgorLSByZWcJCQkJOiBTaG91bGQgY29udGFpbiB0aGUgcmVnaXN0ZXIgcGh5c2ljYWwgYWRkcmVzcy4KKwkJCQkgIHJlcXVpcmVkIHJlZ2lzdGVyIGlzCisJCQkJICAgU1JVL0FERy9TU0kgICAgICBpZiBnZW5lcmF0aW9uMQorCQkJCSAgIFNSVS9BREcvU1NJVS9TU0kgaWYgZ2VuZXJhdGlvbjIKKy0gcmNhcl9zb3VuZCxzc2kJCTogU2hvdWxkIGNvbnRhaW4gU1NJIGZlYXR1cmUuCisJCQkJICBUaGUgbnVtYmVyIG9mIFNTSSBzdWJub2RlIHNob3VsZCBiZSBzYW1lIGFzIEhXLgorCQkJCSAgc2VlIGJlbG93IGZvciBkZXRhaWwuCistIHJjYXJfc291bmQsc3JjCQk6IFNob3VsZCBjb250YWluIFNSQyBmZWF0dXJlLgorCQkJCSAgVGhlIG51bWJlciBvZiBTUkMgc3Vibm9kZSBzaG91bGQgYmUgc2FtZSBhcyBIVy4KKwkJCQkgIHNlZSBiZWxvdyBmb3IgZGV0YWlsLgorLSByY2FyX3NvdW5kLGRhaQkJOiBEQUkgY29udGVudHMuCisJCQkJICBUaGUgbnVtYmVyIG9mIERBSSBzdWJub2RlIHNob3VsZCBiZSBzYW1lIGFzIEhXLgorCQkJCSAgc2VlIGJlbG93IGZvciBkZXRhaWwuCisKK1NTSSBzdWJub2RlIHByb3BlcnRpZXM6CistIGludGVycnVwdHMJCQk6IFNob3VsZCBjb250YWluIFNTSSBpbnRlcnJ1cHQgZm9yIFBJTyB0cmFuc2ZlcgorLSBzaGFyZWQtcGluCQkJOiBpZiBzaGFyZWQgY2xvY2sgcGluCisKK1NSQyBzdWJub2RlIHByb3BlcnRpZXM6CitubyBwcm9wZXJ0aWVzIGF0IHRoaXMgcG9pbnQKKworREFJIHN1Ym5vZGUgcHJvcGVydGllczoKKy0gcGxheWJhY2sJCQk6IGxpc3Qgb2YgcGxheWJhY2sgbW9kdWxlcworLSBjYXB0dXJlCQkJOiBsaXN0IG9mIGNhcHR1cmUgIG1vZHVsZXMKKworRXhhbXBsZToKKworcmNhcl9zb3VuZDogcmNhcl9zb3VuZEAweGZmZDkwMDAwIHsKKwkjc291bmQtZGFpLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAicmVuZXNhcyxyY2FyX3NvdW5kLWdlbjIiOworCXJlZyA9CTwwIDB4ZWM1MDAwMDAgMCAweDEwMDA+LCAvKiBTQ1UgKi8KKwkJPDAgMHhlYzVhMDAwMCAwIDB4MTAwPiwgIC8qIEFERyAqLworCQk8MCAweGVjNTQwMDAwIDAgMHgxMDAwPiwgLyogU1NJVSAqLworCQk8MCAweGVjNTQxMDAwIDAgMHgxMjgwPjsgLyogU1NJICovCisKKwlyY2FyX3NvdW5kLHNyYyB7CisJCXNyYzA6IHNyY0AwIHsgfTsKKwkJc3JjMTogc3JjQDEgeyB9OworCQlzcmMyOiBzcmNAMiB7IH07CisJCXNyYzM6IHNyY0AzIHsgfTsKKwkJc3JjNDogc3JjQDQgeyB9OworCQlzcmM1OiBzcmNANSB7IH07CisJCXNyYzY6IHNyY0A2IHsgfTsKKwkJc3JjNzogc3JjQDcgeyB9OworCQlzcmM4OiBzcmNAOCB7IH07CisJCXNyYzk6IHNyY0A5IHsgfTsKKwl9OworCisJcmNhcl9zb3VuZCxzc2kgeworCQlzc2kwOiBzc2lAMCB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzcwIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2kxOiBzc2lAMSB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzcxIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2kyOiBzc2lAMiB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzcyIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2kzOiBzc2lAMyB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzczIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2k0OiBzc2lANCB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzc0IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2k1OiBzc2lANSB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzc1IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2k2OiBzc2lANiB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzc2IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2k3OiBzc2lANyB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzc3IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2k4OiBzc2lAOCB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzc4IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCQlzc2k5OiBzc2lAOSB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzc5IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCX07CisKKwlyY2FyX3NvdW5kLGRhaSB7CisJCWRhaTAgeworCQkJcGxheWJhY2sgPSA8JnNzaTUgJnNyYzU+OworCQkJY2FwdHVyZSAgPSA8JnNzaTY+OworCQl9OworCQlkYWkxIHsKKwkJCXBsYXliYWNrID0gPCZzc2kzPjsKKwkJfTsKKwkJZGFpMiB7CisJCQljYXB0dXJlICA9IDwmc3NpND47CisJCX07CisJCWRhaTMgeworCQkJcGxheWJhY2sgPSA8JnNzaTc+OworCQl9OworCQlkYWk0IHsKKwkJCWNhcHR1cmUgID0gPCZzc2k4PjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0CmluZGV4IDE5Yzg0ZGYuLjEzMWFhMmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dApAQCAtOCwxNiArOCwyNiBAQAogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogCistIHNpbXBsZS1hdWRpby1jYXJkLG5hbWUJCTogVXNlciBzcGVjaWZpZWQgYXVkaW8gc291bmQgY2FyZCBuYW1lLCBvbmUgc3RyaW5nCisJCQkJCSAgcHJvcGVydHkuCiAtIHNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdAkJOiBDUFUvQ09ERUMgY29tbW9uIGF1ZGlvIGZvcm1hdC4KIAkJCQkJICAiaTJzIiwgInJpZ2h0X2oiLCAibGVmdF9qIiAsICJkc3BfYSIKIAkJCQkJICAiZHNwX2IiLCAiYWM5NyIsICJwZG0iLCAibXNiIiwgImxzYiIKKy0gc2ltcGxlLWF1ZGlvLWNhcmQsd2lkZ2V0cwkJOiBQbGVhc2UgcmVmZXIgdG8gd2lkZ2V0cy50eHQuCiAtIHNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmcJCTogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCiAJCQkJCSAgRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncywgdGhlIGZpcnN0IGJlaW5nIHRoZQogCQkJCQkgIGNvbm5lY3Rpb24ncyBzaW5rLCB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3MKIAkJCQkJICBzb3VyY2UuCistIGRhaS10ZG0tc2xvdC1udW0JCQk6IFBsZWFzZSByZWZlciB0byB0ZG0tc2xvdC50eHQuCistIGRhaS10ZG0tc2xvdC13aWR0aAkJCTogUGxlYXNlIHJlZmVyIHRvIHRkbS1zbG90LnR4dC4KIAogUmVxdWlyZWQgc3Vibm9kZXM6CiAKKy0gc2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmsJCTogY29udGFpbmVyIGZvciB0aGUgQ1BVIGFuZCBDT0RFQyBzdWItbm9kZXMKKwkJCQkJICBUaGlzIGNvbnRhaW5lciBtYXkgYmUgb21pdHRlZCB3aGVuIHRoZQorCQkJCQkgIGNhcmQgaGFzIG9ubHkgb25lIERBSSBsaW5rLgorCQkJCQkgIFNlZSB0aGUgZXhhbXBsZXMuCisKIC0gc2ltcGxlLWF1ZGlvLWNhcmQsY3B1CQkJOiBDUFUgICBzdWItbm9kZQogLSBzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYwkJOiBDT0RFQyBzdWItbm9kZQogCkBAIC0zOCwxNSArNDgsMjkgQEAKIAkJCQkJICBjbG9jayBub2RlICg9IGNvbW1vbiBjbG9jayksIG9yICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5IgogCQkJCQkgIChpZiBzeXN0ZW0gZG9lbnMndCBzdXBwb3J0IGNvbW1vbiBjbG9jaykKIAotRXhhbXBsZToKK05vdGU6CisgKiBGb3IgJ2Zvcm1hdCcsICdmcmFtZS1tYXN0ZXInLCAnYml0Y2xvY2stbWFzdGVyJywgJ2JpdGNsb2NrLWludmVyc2lvbicgYW5kCisgICAnZnJhbWUtaW52ZXJzaW9uJywgdGhlIHNpbXBsZSBjYXJkIHdpbGwgdXNlIHRoZSBzZXR0aW5ncyBvZiBDT0RFQyBmb3IgYm90aAorICAgQ1BVIGFuZCBDT0RFQyBzaWRlcyBhcyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNldHRpbmdzIGlkZW50aWNhbCBmb3IgYm90aCBlbmRzCisgICBvZiB0aGUgbGluay4KKworRXhhbXBsZSAxIC0gc2luZ2xlIERBSSBsaW5rOgogCiBzb3VuZCB7CiAJY29tcGF0aWJsZSA9ICJzaW1wbGUtYXVkaW8tY2FyZCI7CisJc2ltcGxlLWF1ZGlvLWNhcmQsbmFtZSA9ICJWRjYxMC1Ub3dlci1Tb3VuZC1DYXJkIjsKIAlzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgPSAibGVmdF9qIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCx3aWRnZXRzID0KKwkJIk1pY3JvcGhvbmUiLCAiTWljcm9waG9uZSBKYWNrIiwKKwkJIkhlYWRwaG9uZSIsICJIZWFkcGhvbmUgSmFjayIsCisJCSJTcGVha2VyIiwgIkV4dGVybmFsIFNwZWFrZXIiOwogCXNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmcgPQotCQkiTUlDX0lOIiwgIk1pYyBKYWNrIiwKKwkJIk1JQ19JTiIsICJNaWNyb3Bob25lIEphY2siLAogCQkiSGVhZHBob25lIEphY2siLCAiSFBfT1VUIiwKLQkJIkV4dCBTcGsiLCAiTElORV9PVVQiOworCQkiRXh0ZXJuYWwgU3BlYWtlciIsICJMSU5FX09VVCI7CisKKwlkYWktdGRtLXNsb3QtbnVtID0gPDI+OworCWRhaS10ZG0tc2xvdC13aWR0aCA9IDw4PjsKIAogCXNpbXBsZS1hdWRpby1jYXJkLGNwdSB7CiAJCXNvdW5kLWRhaSA9IDwmc2hfZnNpMiAwPjsKQEAgLTc1LDMgKzk5LDM4IEBACiAJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAlpbnRlcnJ1cHRzID0gPDAgMTQ2IDB4ND47CiB9OworCitFeGFtcGxlIDIgLSBtYW55IERBSSBsaW5rczoKKworc291bmQgeworCWNvbXBhdGlibGUgPSAic2ltcGxlLWF1ZGlvLWNhcmQiOworCXNpbXBsZS1hdWRpby1jYXJkLG5hbWUgPSAiQ3Vib3ggQXVkaW8iOworCXNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCA9ICJpMnMiOworCisJc2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmtAMCB7CQkvKiBJMlMgLSBIRE1JICovCisJCXNpbXBsZS1hdWRpby1jYXJkLGNwdSB7CisJCQlzb3VuZC1kYWkgPSA8JmF1ZGlvMSAwPjsKKwkJfTsKKwkJc2ltcGxlLWF1ZGlvLWNhcmQsY29kZWMgeworCQkJc291bmQtZGFpID0gPCZ0ZGE5OTh4IDA+OworCQl9OworCX07CisKKwlzaW1wbGUtYXVkaW8tY2FyZCxkYWktbGlua0AxIHsJCS8qIFMvUERJRiAtIEhETUkgKi8KKwkJc2ltcGxlLWF1ZGlvLWNhcmQsY3B1IHsKKwkJCXNvdW5kLWRhaSA9IDwmYXVkaW8xIDE+OworCQl9OworCQlzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYyB7CisJCQlzb3VuZC1kYWkgPSA8JnRkYTk5OHggMT47CisJCX07CisJfTsKKworCXNpbXBsZS1hdWRpby1jYXJkLGRhaS1saW5rQDIgewkJLyogUy9QRElGIC0gUy9QRElGICovCisJCXNpbXBsZS1hdWRpby1jYXJkLGNwdSB7CisJCQlzb3VuZC1kYWkgPSA8JmF1ZGlvMSAxPjsKKwkJfTsKKwkJc2ltcGxlLWF1ZGlvLWNhcmQsY29kZWMgeworCQkJc291bmQtZGFpID0gPCZzcGRpZl9jb2RlYz47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1jb2RlYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyZjVlYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLWNvZGVjLnR4dApAQCAtMCwwICsxLDE3IEBACitTaVJGIGludGVybmFsIGF1ZGlvIENPREVDCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIiBvciAic2lyZixwcmltYTItYXVkaW8tY29kZWMiCisKKyAgLSByZWcgOiB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLgorCisgIC0gY2xvY2tzOiB0aGUgY2xvY2sgb2YgU2lSRiBpbnRlcm5hbCBhdWRpbyBjb2RlYworCitFeGFtcGxlOgorCithdWRpb2NvZGVjOiBhdWRpb2NvZGVjQGIwMDQwMDAwIHsKKwljb21wYXRpYmxlID0gInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIjsKKwlyZWcgPSA8MHhiMDA0MDAwMCAweDEwMDAwPjsKKwljbG9ja3MgPSA8JmNsa3MgMjc+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2NmRlMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLXBvcnQudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyogU2lSRiBTb0MgYXVkaW8gcG9ydAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAic2lyZixhdWRpby1wb3J0IgorLSByZWc6IEJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBlbnRyaWVzOgorLSBkbWFzOiBMaXN0IG9mIERNQSBjb250cm9sbGVyIHBoYW5kbGUgYW5kIERNQSByZXF1ZXN0IGxpbmUgb3JkZXJlZCBwYWlycy4KKy0gZG1hLW5hbWVzOiBJZGVudGlmaWVyIHN0cmluZyBmb3IgZWFjaCBETUEgcmVxdWVzdCBsaW5lIGluIHRoZSBkbWFzIHByb3BlcnR5LgorICBUaGVzZSBzdHJpbmdzIGNvcnJlc3BvbmQgMToxIHdpdGggdGhlIG9yZGVyZWQgcGFpcnMgaW4gZG1hcy4KKworICBPbmUgb2YgdGhlIERNQSBjaGFubmVscyB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB0cmFuc21pc3Npb24gKHNob3VsZCBiZQorICBuYW1lZCAidHgiKSBhbmQgb25lIGZvciByZWNlcHRpb24gKHNob3VsZCBiZSBuYW1lZCAicngiKS4KKworRXhhbXBsZToKKworYXVkaW9wb3J0OiBhdWRpb3BvcnRAYjAwNDAwMDAgeworCWNvbXBhdGlibGUgPSAic2lyZixhdWRpby1wb3J0IjsKKwlyZWcgPSA8MHhiMDA0MDAwMCAweDEwMDAwPjsKKwlkbWFzID0gPCZkbWFjMSAzPiwgPCZkbWFjMSA4PjsKKwlkbWEtbmFtZXMgPSAicngiLCAidHgiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg4ODJjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8udHh0CkBAIC0wLDAgKzEsNDEgQEAKKyogU2lSRiBhdGxhczYgYW5kIHByaW1hMiBpbnRlcm5hbCBhdWRpbyBjb2RlYyBhbmQgcG9ydCBiYXNlZCBhdWRpbyBzZXR1cHMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogInNpcmYsc2lyZi1hdWRpby1jYXJkIgorLSBzaXJmLGF1ZGlvLXBsYXRmb3JtOiBwaGFuZGxlIGZvciB0aGUgcGxhdGZvcm0gbm9kZQorLSBzaXJmLGF1ZGlvLWNvZGVjOiBwaGFuZGxlIGZvciB0aGUgU2lSRiBpbnRlcm5hbCBjb2RlYyBub2RlCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGhwLXBhLWdwaW9zOiBOZWVkIHRvIGJlIHByZXNlbnQgaWYgdGhlIGJvYXJkIG5lZWQgY29udHJvbCBleHRlcm5hbAorICBoZWFkcGhvbmUgYW1wbGlmaWVyLgorLSBzcGstcGEtZ3Bpb3M6IE5lZWQgdG8gYmUgcHJlc2VudCBpZiB0aGUgYm9hcmQgbmVlZCBjb250cm9sIGV4dGVybmFsCisgIHNwZWFrZXIgYW1wbGlmaWVyLgorLSBocC1zd2l0Y2gtZ3Bpb3M6IE5lZWQgdG8gYmUgcHJlc2VudCBpZiB0aGUgYm9hcmQgY2FwYWJsZSB0byBkZXRlY3QgamFjaworICBpbnNlcnRpb24sIHJlbW92YWwuCisKK0F2YWlsYWJsZSBhdWRpbyBlbmRwb2ludHMgZm9yIHRoZSBhdWRpby1yb3V0aW5nIHRhYmxlOgorCitCb2FyZCBjb25uZWN0b3JzOgorICogSGVhZHNldCBTdGVyZW9waG9uZQorICogRXh0IFNwaworICogTGluZSBJbgorICogTWljCisKK1NpUkYgaW50ZXJuYWwgYXVkaW8gY29kZWMgcGluczoKKyAqIEhQT1VUTAorICogSFBPVVRSCisgKiBTUEtPVVQKKyAqIEV4dCBNaWMKKyAqIE1pYyBCaWFzCisKK0V4YW1wbGU6CisKK3NvdW5kIHsKKwkJY29tcGF0aWJsZSA9ICJzaXJmLHNpcmYtYXVkaW8tY2FyZCI7CisJCXNpcmYsYXVkaW8tY29kZWMgPSA8JmF1ZGlvY29kZWM+OworCQlzaXJmLGF1ZGlvLXBsYXRmb3JtID0gPCZhdWRpb3BvcnQ+OworCQlocC1wYS1ncGlvcyA9IDwmZ3BpbyA0NCAwPjsKKwkJc3BrLXBhLWdwaW9zID0gPCZncGlvIDQ2IDA+OworCQlocC1zd2l0Y2gtZ3Bpb3MgPSA8JmdwaW8gNDUgMD47Cit9OworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGRtLXNsb3QudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RkbS1zbG90LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJjODQyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RkbS1zbG90LnR4dApAQCAtMCwwICsxLDIwIEBACitURE0gc2xvdDoKKworVGhpcyBzcGVjaWZpZXMgYXVkaW8gREFJJ3MgVERNIHNsb3QuCisKK1RETSBzbG90IHByb3BlcnRpZXM6CitkYWktdGRtLXNsb3QtbnVtIDogTnVtYmVyIG9mIHNsb3RzIGluIHVzZS4KK2RhaS10ZG0tc2xvdC13aWR0aCA6ICBXaWR0aCBpbiBiaXRzIGZvciBlYWNoIHNsb3QuCisKK0ZvciBpbnN0YW5jZToKKwlkYWktdGRtLXNsb3QtbnVtID0gPDI+OworCWRhaS10ZG0tc2xvdC13aWR0aCA9IDw4PjsKKworQW5kIGZvciBlYWNoIHNwY2lmaWVkIGRyaXZlciwgdGhlcmUgY291bGQgYmUgb25lIC5vZl94bGF0ZV90ZG1fc2xvdF9tYXNrKCkKK3RvIHNwZWNpZnkgYSBleHBsaWNpdCBtYXBwaW5nIG9mIHRoZSBjaGFubmVscyBhbmQgdGhlIHNsb3RzLiBJZiBpdCdzIGFic2VudAordGhlIGRlZmF1bHQgc25kX3NvY19vZl94bGF0ZV90ZG1fc2xvdF9tYXNrKCkgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRpbmcgdGhlCit0eCBhbmQgcnggbWFza3MuCisKK0ZvciBzbmRfc29jX29mX3hsYXRlX3RkbV9zbG90X21hc2soKSwgdGhlIHR4IGFuZCByeCBtYXNrcyB3aWxsIHVzZSBhIDEgYml0Citmb3IgYW4gYWN0aXZlIHNsb3QgYXMgZGVmYXVsdCwgYW5kIHRoZSBkZWZhdWx0IGFjdGl2ZSBiaXRzIGFyZSBhdCB0aGUgTFNCIG9mCit0aGUgbWFza3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjNjZkZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LnR4dApAQCAtMCwwICsxLDYxIEBACitUZXhhcyBJbnN0cnVtZW50cyAtIHRsdjMyMGFpYzMxeHggQ29kZWMgbW9kdWxlCisKK1RoZSB0bHYzMjBhaWMzMXh4IHNlcmlhbCBjb250cm9sIGJ1cyBjb21tdW5pY2F0ZXMgdGhyb3VnaCBJMkMgcHJvdG9jb2xzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSAtICJzdHJpbmciIC0gT25lIG9mOgorICAgICJ0aSx0bHYzMjBhaWMzMTB4IiAtIEdlbmVyaWMgVExWMzIwQUlDMzF4eCB3aXRoIG1vbm8gc3BlYWtlciBhbXAKKyAgICAidGksdGx2MzIwYWljMzExeCIgLSBHZW5lcmljIFRMVjMyMEFJQzMxeHggd2l0aCBzdGVyZW8gc3BlYWtlciBhbXAKKyAgICAidGksdGx2MzIwYWljMzEwMCIgLSBUTFYzMjBBSUMzMTAwIChtb25vIHNwZWFrZXIgYW1wLCBubyBNaW5pRFNQKQorICAgICJ0aSx0bHYzMjBhaWMzMTEwIiAtIFRMVjMyMEFJQzMxMTAgKHN0ZXJlbyBzcGVha2VyIGFtcCwgbm8gTWluaURTUCkKKyAgICAidGksdGx2MzIwYWljMzEyMCIgLSBUTFYzMjBBSUMzMTIwIChtb25vIHNwZWFrZXIgYW1wLCBNaW5pRFNQKQorICAgICJ0aSx0bHYzMjBhaWMzMTExIiAtIFRMVjMyMEFJQzMxMTEgKHN0ZXJlbyBzcGVha2VyIGFtcCwgTWluaURTUCkKKworLSByZWcgLSA8aW50PiAtICBJMkMgc2xhdmUgYWRkcmVzcworCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gZ3Bpby1yZXNldCAtIGdwaW8gcGluIG51bWJlciB1c2VkIGZvciBjb2RlYyByZXNldAorLSBhaTMxeHgtbWljYmlhcy12ZyAtIE1pY0JpYXMgVm9sdGFnZSBzZXR0aW5nCisgICAgICAgIDEgb3IgTUlDQklBU18yXzBWIC0gTUlDQklBUyBvdXRwdXQgaXMgcG93ZXJlZCB0byAyLjBWCisgICAgICAgIDIgb3IgTUlDQklBU18yXzVWIC0gTUlDQklBUyBvdXRwdXQgaXMgcG93ZXJlZCB0byAyLjVWCisgICAgICAgIDMgb3IgTUlDQklBU19BVkREIC0gTUlDQklBUyBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIEFWREQKKwlJZiB0aGlzIG5vZGUgaXMgbm90IG1lbnRpb25lZCBvciBpZiB0aGUgdmFsdWUgaXMgdW5rbm93biwgdGhlbgorCW1pY2JpYXMJaXMgc2V0IHRvIDIuMFYuCistIEhQVkRELXN1cHBseSwgU1BSVkRELXN1cHBseSwgU1BMVkRELXN1cHBseSwgQVZERC1zdXBwbHksIElPVkRELXN1cHBseSwKKyAgRFZERC1zdXBwbHkgOiBwb3dlciBzdXBwbGllcyBmb3IgdGhlIGRldmljZSBhcyBjb3ZlcmVkIGluCisgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAorCitDT0RFQyBvdXRwdXQgcGluczoKKyAgKiBIUEwKKyAgKiBIUFIKKyAgKiBTUEwsIGRldmljZXMgd2l0aCBzdGVyZW8gc3BlYWtlciBhbXAKKyAgKiBTUFIsIGRldmljZXMgd2l0aCBzdGVyZW8gc3BlYWtlciBhbXAKKyAgKiBTUEssIGRldmljZXMgd2l0aCBtb25vIHNwZWFrZXIgYW1wCisgICogTUlDQklBUworCitDT0RFQyBpbnB1dCBwaW5zOgorICAqIE1JQzFMUAorICAqIE1JQzFSUAorICAqIE1JQzFMTQorCitUaGUgcGlucyBjYW4gYmUgdXNlZCBpbiByZWZlcnJpbmcgc291bmQgbm9kZSdzIGF1ZGlvLXJvdXRpbmcgcHJvcGVydHkuCisKK0V4YW1wbGU6CisjaW5jbHVkZSA8ZHQtYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC1taWNiaWFzLmg+CisKK3RsdjMyMGFpYzMxeHg6IHRsdjMyMGFpYzMxeHhAMTggeworCWNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzExeCI7CisJcmVnID0gPDB4MTg+OworCisJYWkzMXh4LW1pY2JpYXMtdmcgPSA8TUlDQklBU19PRkY+OworCisJSFBWREQtc3VwcGx5ID0gPCZyZWd1bGF0b3I+OworCVNQUlZERC1zdXBwbHkgPSA8JnJlZ3VsYXRvcj47CisJU1BMVkRELXN1cHBseSA9IDwmcmVndWxhdG9yPjsKKwlBVkRELXN1cHBseSA9IDwmcmVndWxhdG9yPjsKKwlJT1ZERC1zdXBwbHkgPSA8JnJlZ3VsYXRvcj47CisJRFZERC1zdXBwbHkgPSA8JnJlZ3VsYXRvcj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMyeDQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMyeDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjc0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzJ4NC50eHQKQEAgLTAsMCArMSwzMCBAQAorVGV4YXMgSW5zdHJ1bWVudHMgLSB0bHYzMjBhaWMzMng0IENvZGVjIG1vZHVsZQorCitUaGUgdGx2MzIwYWljMzJ4NCBzZXJpYWwgY29udHJvbCBidXMgY29tbXVuaWNhdGVzIHRocm91Z2ggSTJDIHByb3RvY29scworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSx0bHYzMjBhaWMzMng0IgorIC0gcmVnOiBJMkMgc2xhdmUgYWRkcmVzcworIC0gc3VwcGx5LSo6IFJlcXVpcmVkIHN1cHBseSByZWd1bGF0b3JzIGFyZToKKyAgICAiaW92IiAtIGRpZ2l0YWwgSU8gcG93ZXIgc3VwcGx5CisgICAgImxkb2luIiAtIExETyBwb3dlciBzdXBwbHkKKyAgICAiZHYiIC0gRGlnaXRhbCBjb3JlIHBvd2VyIHN1cHBseQorICAgICJhdiIgLSBBbmFsb2cgY29yZSBwb3dlciBzdXBwbHkKKyAgICBJZiB5b3Ugc3VwcGx5IGxkb2luLCBkdiBhbmQgYXYgYXJlIG9wdGlvbmFsLiBPdGhlcndpc2UgdGhleSBhcmUgcmVxdWlyZWQKKyAgIFNlZSByZWd1bGF0b3IvcmVndWxhdG9yLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV0YWlsZWQgYmluZGluZworICAgZm9ybWF0LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gcmVzZXQtZ3Bpb3M6IFJlc2V0LUdQSU8gcGhhbmRsZSB3aXRoIGFyZ3MgYXMgZGVzY3JpYmVkIGluIGdwaW8vZ3Bpby50eHQKKyAtIGNsb2Nrcy9jbG9jay1uYW1lczogQ2xvY2sgbmFtZWQgJ21jbGsnIGZvciB0aGUgbWFzdGVyIGNsb2NrIG9mIHRoZSBjb2RlYy4KKyAgIFNlZSBjbG9jay9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXRhaWxlZCBmb3JtYXQuCisKKworRXhhbXBsZToKKworY29kZWM6IHRsdjMyMGFpYzMyeDRAMTggeworCWNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzJ4NCI7CisJcmVnID0gPDB4MTg+OworCWNsb2NrcyA9IDwmY2xrcyAyMDE+OworCWNsb2NrLW5hbWVzID0gIm1jbGsiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljM3gudHh0CmluZGV4IDlkOGVhMTQuLjVlNjA0MGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzeC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzN4LnR4dApAQCAtNiw3ICs2LDYgQEAKIAogLSBjb21wYXRpYmxlIC0gInN0cmluZyIgLSBPbmUgb2Y6CiAgICAgInRpLHRsdjMyMGFpYzN4IiAtIEdlbmVyaWMgVExWMzIwQUlDM3ggZGV2aWNlCi0gICAgInRpLHRsdjMyMGFpYzMyeDQiIC0gVExWMzIwQUlDMzJ4NAogICAgICJ0aSx0bHYzMjBhaWMzMyIgLSBUTFYzMjBBSUMzMwogICAgICJ0aSx0bHYzMjBhaWMzMDA3IiAtIFRMVjMyMEFJQzMwMDcKICAgICAidGksdGx2MzIwYWljMzEwNiIgLSBUTFYzMjBBSUMzMTA2CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd2lkZ2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd2lkZ2V0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkZTViYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93aWRnZXRzLnR4dApAQCAtMCwwICsxLDIwIEBACitXaWRnZXRzOgorCitUaGlzIG1haW5seSBzcGVjaWZpZXMgYXVkaW8gb2ZmLWNvZGVjIERBUE0gd2lkZ2V0cy4KKworRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncyBpbiBEVDoKKworCSJ0ZW1wbGF0ZS13bmFtZSIsICJ1c2VyLXN1cHBsaWVkLXduYW1lIgorCitUaGUgInRlbXBsYXRlLXduYW1lIiBiZWluZyB0aGUgdGVtcGxhdGUgd2lkZ2V0IG5hbWUgYW5kIGN1cnJlbnRseSBpbmNsdWRlczoKKyJNaWNyb3Bob25lIiwgIkxpbmUiLCAiSGVhZHBob25lIiBhbmQgIlNwZWFrZXIiLgorCitUaGUgInVzZXItc3VwcGxpZWQtd25hbWUiIGJlaW5nIHRoZSB1c2VyIHNwZWNpZmllZCB3aWRnZXQgbmFtZS4KKworRm9yIGluc3RhbmNlOgorCXNpbXBsZS1hdWRpby13aWRnZXRzID0KKwkJIk1pY3JvcGhvbmUiLCAiTWljcm9waG9uZSBKYWNrIiwKKwkJIkxpbmUiLCAiTGluZSBJbiBKYWNrIiwKKwkJIkxpbmUiLCAiTGluZSBPdXQgSmFjayIsCisJCSJIZWFkcGhvbmUiLCAiSGVhZHBob25lIEphY2siLAorCQkiU3BlYWtlciIsICJTcGVha2VyIEV4dGVybmFsIjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZWZtMzItc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZWZtMzItc3BpLnR4dAppbmRleCBhNTkwY2E1Li44ZjA4MWM5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2VmbTMyLXNwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9lZm0zMi1zcGkudHh0CkBAIC0zLDI0ICszLDI0IEBACiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSAjYWRkcmVzcy1jZWxsczogc2VlIHNwaS1idXMudHh0CiAtICNzaXplLWNlbGxzOiBzZWUgc3BpLWJ1cy50eHQKLS0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJlZm0zMixzcGkiCistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiZW5lcmd5bWljcm8sZWZtMzItc3BpIgogLSByZWc6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBjb250cm9sbGVyCiAtIGludGVycnVwdHM6IHBhaXIgc3BlY2lmeWluZyByeCBhbmQgdHggaXJxCiAtIGNsb2NrczogcGhhbmRsZSB0byB0aGUgc3BpIGNsb2NrCiAtIGNzLWdwaW9zOiBzZWUgc3BpLWJ1cy50eHQKLS0gbG9jYXRpb246IFZhbHVlIHRvIHdyaXRlIHRvIHRoZSBST1VURSByZWdpc3RlcidzIExPQ0FUSU9OIGJpdGZpZWxkIHRvIGNvbmZpZ3VyZSB0aGUgcGlubXV4IGZvciB0aGUgZGV2aWNlLCBzZWUgZGF0YXNoZWV0IGZvciB2YWx1ZXMuCistIGVmbTMyLGxvY2F0aW9uOiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgUk9VVEUgcmVnaXN0ZXIncyBMT0NBVElPTiBiaXRmaWVsZCB0byBjb25maWd1cmUgdGhlIHBpbm11eCBmb3IgdGhlIGRldmljZSwgc2VlIGRhdGFzaGVldCBmb3IgdmFsdWVzLgogCiBFeGFtcGxlOgogCiBzcGkxOiBzcGlAMHg0MDAwYzQwMCB7IC8qIFVTQVJUMSAqLwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDA+OwotCWNvbXBhdGlibGUgPSAiZWZtMzIsc3BpIjsKKwljb21wYXRpYmxlID0gImVuZXJneW1pY3JvLGVmbTMyLXNwaSI7CiAJcmVnID0gPDB4NDAwMGM0MDAgMHg0MDA+OwogCWludGVycnVwdHMgPSA8MTUgMTY+OwogCWNsb2NrcyA9IDwmY211IDIwPjsKIAljcy1ncGlvcyA9IDwmZ3BpbyA1MSAxPjsgLy8gRDMKLQlsb2NhdGlvbiA9IDwxPjsKKwllZm0zMixsb2NhdGlvbiA9IDwxPjsKIAlzdGF0dXMgPSAib2siOwogCiAJa3M4ODUxQDAgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9xY29tLHNwaS1xdXAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9xY29tLHNwaS1xdXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmEyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3Fjb20sc3BpLXF1cC50eHQKQEAgLTAsMCArMSw4NSBAQAorUXVhbGNvbW0gVW5pdmVyc2FsIFBlcmlwaGVyYWwgKFFVUCkgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpCisKK1RoZSBRVVAgY29yZSBpcyBhbiBBSEIgc2xhdmUgdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBkYXRhIHBhdGggKGFuIG91dHB1dCBGSUZPCithbmQgYW4gaW5wdXQgRklGTykgZm9yIHNlcmlhbCBwZXJpcGhlcmFsIGludGVyZmFjZSAoU1BJKSBtaW5pLWNvcmUuCisKK1NQSSBpbiBtYXN0ZXIgbW9kZSBzdXBwb3J0cyB1cCB0byA1ME1IeiwgdXAgdG8gZm91ciBjaGlwIHNlbGVjdHMsIHByb2dyYW1tYWJsZQorZGF0YSBwYXRoIGZyb20gNCBiaXRzIHRvIDMyIGJpdHMgYW5kIG51bWVyb3VzIHByb3RvY29sIHZhcmlhbnRzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAgICAgU2hvdWxkIGNvbnRhaW4gInFjb20sc3BpLXF1cC12Mi4xLjEiIG9yICJxY29tLHNwaS1xdXAtdjIuMi4xIgorLSByZWc6ICAgICAgICAgICAgU2hvdWxkIGNvbnRhaW4gYmFzZSByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoCistIGludGVycnVwdHM6ICAgICBJbnRlcnJ1cHQgbnVtYmVyIHVzZWQgYnkgdGhpcyBjb250cm9sbGVyCisKKy0gY2xvY2tzOiAgICAgICAgIFNob3VsZCBjb250YWluIHRoZSBjb3JlIGNsb2NrIGFuZCB0aGUgQUhCIGNsb2NrLgorLSBjbG9jay1uYW1lczogICAgU2hvdWxkIGJlICJjb3JlIiBmb3IgdGhlIGNvcmUgY2xvY2sgYW5kICJpZmFjZSIgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgQUhCIGNsb2NrLgorCistICNhZGRyZXNzLWNlbGxzOiBOdW1iZXIgb2YgY2VsbHMgcmVxdWlyZWQgdG8gZGVmaW5lIGEgY2hpcCBzZWxlY3QKKyAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb24gdGhlIFNQSSBidXMuIFNob3VsZCBiZSBzZXQgdG8gMS4KKy0gI3NpemUtY2VsbHM6ICAgIFNob3VsZCBiZSB6ZXJvLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBzcGktbWF4LWZyZXF1ZW5jeTogU3BlY2lmaWVzIG1heGltdW0gU1BJIGNsb2NrIGZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgIFVuaXRzIC0gSHouIERlZmluaXRpb24gYXMgcGVyCisgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1idXMudHh0CisKK1NQSSBzbGF2ZSBub2RlcyBtdXN0IGJlIGNoaWxkcmVuIG9mIHRoZSBTUEkgbWFzdGVyIG5vZGUgYW5kIGNhbiBjb250YWluCitwcm9wZXJ0aWVzIGRlc2NyaWJlZCBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1idXMudHh0CisKK0V4YW1wbGU6CisKKwlzcGlfODogc3BpQGY5OTY0MDAwIHsgLyogQkxTUDIgUVVQMiAqLworCisJCWNvbXBhdGlibGUgPSAicWNvbSxzcGktcXVwLXYyIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlyZWcgPSA8MHhmOTk2NDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgMTAyIDA+OworCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxOTIwMDAwMD47CisKKwkJY2xvY2tzID0gPCZnY2MgR0NDX0JMU1AyX1FVUDJfU1BJX0FQUFNfQ0xLPiwgPCZnY2MgR0NDX0JMU1AyX0FIQl9DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlIiwgImlmYWNlIjsKKworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JnNwaThfZGVmYXVsdD47CisKKwkJZGV2aWNlQDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMjItZHVtbXkiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwwPjsgLyogQ2hpcCBzZWxlY3QgMCAqLworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MTkyMDAwMDA+OworCQkJc3BpLWNwb2w7CisJCX07CisKKwkJZGV2aWNlQDEgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMjItZHVtbXkiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwxPjsgLyogQ2hpcCBzZWxlY3QgMSAqLworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8OTYwMDAwMD47CisJCQlzcGktY3BoYTsKKwkJfTsKKworCQlkZXZpY2VAMiB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAyMi1kdW1teSI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDI+OyAvKiBDaGlwIHNlbGVjdCAyICovCisJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxOTIwMDAwMD47CisJCQlzcGktY3BvbDsKKwkJCXNwaS1jcGhhOworCQl9OworCisJCWRldmljZUAzIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDIyLWR1bW15IjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8Mz47IC8qIENoaXAgc2VsZWN0IDMgKi8KKwkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKKwkJCXNwaS1jcG9sOworCQkJc3BpLWNwaGE7CisJCQlzcGktY3MtaGlnaDsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1oc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtaHNwaS50eHQKaW5kZXggMzBiNTdiMS4uMzE5YmFkNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1oc3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLWhzcGkudHh0CkBAIC0xLDcgKzEsMjkgQEAKIFJlbmVzYXMgSFNQSS4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IAkicmVuZXNhcyxoc3BpIgotLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCi0tIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgbGluZSB1c2VkIGJ5IEhTUEkKKy0gY29tcGF0aWJsZSAgICAgICA6ICJyZW5lc2FzLGhzcGktPHNvY3R5cGU+IiwgInJlbmVzYXMsaHNwaSIgYXMgZmFsbGJhY2suCisJCSAgICAgRXhhbXBsZXMgd2l0aCBzb2N0eXBlcyBhcmU6CisJCSAgICAgICAtICJyZW5lc2FzLGhzcGktcjhhNzc3OCIgKFItQ2FyIE0xKQorCQkgICAgICAgLSAicmVuZXNhcyxoc3BpLXI4YTc3NzkiIChSLUNhciBIMSkKKy0gcmVnICAgICAgICAgICAgICA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0LXBhcmVudCA6IFRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorCQkgICAgIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCistIGludGVycnVwdHMgICAgICAgOiBJbnRlcnJ1cHQgc3BlY2lmaWVyCistICNhZGRyZXNzLWNlbGxzICAgOiBNdXN0IGJlIDwxPgorLSAjc2l6ZS1jZWxscyAgICAgIDogTXVzdCBiZSA8MD4KKworUGluY3RybCBwcm9wZXJ0aWVzIG1pZ2h0IGJlIG5lZWRlZCwgdG9vLiAgU2VlCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLCouCisKK0V4YW1wbGU6CisKKwloc3BpMDogc3BpQGZmZmM3MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyZW5lc2FzLGhzcGktcjhhNzc3OCIsICJyZW5lc2FzLGhzcGkiOworCQlyZWcgPSA8MHhmZmZjNzAwMCAweDE4PjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwkJaW50ZXJydXB0cyA9IDwwIDYzIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1tc2lvZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLW1zaW9mLnR4dAppbmRleCBlNjIyMjEwLi5mMjRiYWYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLW1zaW9mLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLW1zaW9mLnR4dApAQCAtMSwxMiArMSw0MCBAQAogUmVuZXNhcyBNU0lPRiBzcGkgY29udHJvbGxlcgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlIDogCSJyZW5lc2FzLHNoLW1zaW9mIiBmb3IgU3VwZXJIIG9yCi0JCSJyZW5lc2FzLHNoLW1vYmlsZS1tc2lvZiIgZm9yIFNIIE1vYmlsZSBzZXJpZXMKLS0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQotLSBpbnRlcnJ1cHRzIDogaW50ZXJydXB0IGxpbmUgdXNlZCBieSBNU0lPRgorLSBjb21wYXRpYmxlICAgICAgICAgICA6ICJyZW5lc2FzLG1zaW9mLTxzb2N0eXBlPiIgZm9yIFNvQ3MsCisJCQkgInJlbmVzYXMsc2gtbXNpb2YiIGZvciBTdXBlckgsIG9yCisJCQkgInJlbmVzYXMsc2gtbW9iaWxlLW1zaW9mIiBmb3IgU0ggTW9iaWxlIHNlcmllcy4KKwkJCSBFeGFtcGxlcyB3aXRoIHNvY3R5cGVzIGFyZToKKwkJCSAicmVuZXNhcyxtc2lvZi1yOGE3NzkwIiAoUi1DYXIgSDIpCisJCQkgInJlbmVzYXMsbXNpb2YtcjhhNzc5MSIgKFItQ2FyIE0yKQorLSByZWcgICAgICAgICAgICAgICAgICA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0LXBhcmVudCAgICAgOiBUaGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQKKwkJCSBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZQorLSBpbnRlcnJ1cHRzICAgICAgICAgICA6IEludGVycnVwdCBzcGVjaWZpZXIKKy0gI2FkZHJlc3MtY2VsbHMgICAgICAgOiBNdXN0IGJlIDwxPgorLSAjc2l6ZS1jZWxscyAgICAgICAgICA6IE11c3QgYmUgPDA+CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6Ci0tIG51bS1jcwkJOiB0b3RhbCBudW1iZXIgb2YgY2hpcC1zZWxlY3RzCi0tIHJlbmVzYXMsdHgtZmlmby1zaXplCTogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHR4IGZpZm8gc2l6ZSBnaXZlbiBpbiB3b3JkcwotLSByZW5lc2FzLHJ4LWZpZm8tc2l6ZQk6IE92ZXJyaWRlcyB0aGUgZGVmYXVsdCByeCBmaWZvIHNpemUgZ2l2ZW4gaW4gd29yZHMKKy0gY2xvY2tzICAgICAgICAgICAgICAgOiBNdXN0IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uYWwgY2xvY2suCistIG51bS1jcyAgICAgICAgICAgICAgIDogVG90YWwgbnVtYmVyIG9mIGNoaXAtc2VsZWN0cyAoZGVmYXVsdCBpcyAxKQorCitPcHRpb25hbCBwcm9wZXJ0aWVzLCBkZXByZWNhdGVkIGZvciBzb2N0eXBlLXNwZWNpZmljIGJpbmRpbmdzOgorLSByZW5lc2FzLHR4LWZpZm8tc2l6ZSA6IE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0eCBmaWZvIHNpemUgZ2l2ZW4gaW4gd29yZHMKKwkJCSAoZGVmYXVsdCBpcyA2NCkKKy0gcmVuZXNhcyxyeC1maWZvLXNpemUgOiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgcnggZmlmbyBzaXplIGdpdmVuIGluIHdvcmRzCisJCQkgKGRlZmF1bHQgaXMgNjQsIG9yIDI1NiBvbiBSLUNhciBIMiBhbmQgTTIpCisKK1BpbmN0cmwgcHJvcGVydGllcyBtaWdodCBiZSBuZWVkZWQsIHRvby4gIFNlZQorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcywqLgorCitFeGFtcGxlOgorCisJbXNpb2YwOiBzcGlAZTZlMjAwMDAgeworCQljb21wYXRpYmxlID0gInJlbmVzYXMsbXNpb2YtcjhhNzc5MSI7CisJCXJlZyA9IDwwIDB4ZTZlMjAwMDAgMCAweDAwNjQ+OworCQlpbnRlcnJ1cHRzID0gPDAgMTU2IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQljbG9ja3MgPSA8Jm1zdHAwX2Nsa3MgUjhBNzc5MV9DTEtfTVNJT0YwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1mc2wtZHNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1mc2wtZHNwaS50eHQKaW5kZXggYTFmYjMwMy4uNTM3NmRlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktZnNsLWRzcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWZzbC1kc3BpLnR4dApAQCAtMTAsNiArMTAsNyBAQAogLSBwaW5jdHJsLW5hbWVzOiBtdXN0IGNvbnRhaW4gYSAiZGVmYXVsdCIgZW50cnkuCiAtIHNwaS1udW0tY2hpcHNlbGVjdHMgOiB0aGUgbnVtYmVyIG9mIHRoZSBjaGlwc2VsZWN0IHNpZ25hbHMuCiAtIGJ1cy1udW0gOiB0aGUgc2xhdmUgY2hpcCBjaGlwc2VsZWN0IHNpZ25hbCBudW1iZXIuCistIGJpZy1lbmRpYW4gOiBpZiBEU1BJIG1vZHVkbGUgaXMgYmlnIGVuZGlhbiwgdGhlIGJvb2wgd2lsbCBiZSBzZXQgaW4gbm9kZS4KIEV4YW1wbGU6CiAKIGRzcGkwQDQwMDJjMDAwIHsKQEAgLTI0LDYgKzI1LDcgQEAKIAlidXMtbnVtID0gPDA+OwogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wID0gPCZwaW5jdHJsX2RzcGkwXzE+OworCWJpZy1lbmRpYW47CiAJc3RhdHVzID0gIm9rYXkiOwogCiAJc2ZsYXNoOiBhdDI2ZGYwODFhQDAgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktcnNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1yc3BpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTdkODJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktcnNwaS50eHQKQEAgLTAsMCArMSw2MSBAQAorRGV2aWNlIHRyZWUgY29uZmlndXJhdGlvbiBmb3IgUmVuZXNhcyBSU1BJL1FTUEkgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgICAgICAgOiBGb3IgUmVuZXNhcyBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2Ugb24gbGVnYWN5IFNIOgorCQkgICAgICJyZW5lc2FzLHJzcGktPHNvY3R5cGU+IiwgInJlbmVzYXMscnNwaSIgYXMgZmFsbGJhY2suCisJCSAgICAgRm9yIFJlbmVzYXMgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIG9uIFJaL0ExSDoKKwkJICAgICAicmVuZXNhcyxyc3BpLTxzb2N0eXBlPiIsICJyZW5lc2FzLHJzcGktcnoiIGFzIGZhbGxiYWNrLgorCQkgICAgIEZvciBRdWFkIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSBvbiBSLUNhciBHZW4yOgorCQkgICAgICJyZW5lc2FzLHFzcGktPHNvY3R5cGU+IiwgInJlbmVzYXMscXNwaSIgYXMgZmFsbGJhY2suCisJCSAgICAgRXhhbXBsZXMgd2l0aCBzb2N0eXBlcyBhcmU6CisJCSAgICAgICAgLSAicmVuZXNhcyxyc3BpLXNoNzc1NyIgKFNIKQorCQkJLSAicmVuZXNhcyxyc3BpLXI3czcyMTAwIiAoUlovQTFIKQorCQkJLSAicmVuZXNhcyxxc3BpLXI4YTc3OTAiIChSLUNhciBIMikKKwkJCS0gInJlbmVzYXMscXNwaS1yOGE3NzkxIiAoUi1DYXIgTTIpCistIHJlZyAgICAgICAgICAgICAgOiBBZGRyZXNzIHN0YXJ0IGFuZCBhZGRyZXNzIHJhbmdlIHNpemUgb2YgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzICAgICAgIDogQSBsaXN0IG9mIGludGVycnVwdC1zcGVjaWZpZXJzLCBvbmUgZm9yIGVhY2ggZW50cnkgaW4KKwkJICAgICBpbnRlcnJ1cHQtbmFtZXMuCisJCSAgICAgSWYgaW50ZXJydXB0LW5hbWVzIGlzIG5vdCBwcmVzZW50LCBhbiBpbnRlcnJ1cHQgc3BlY2lmaWVyCisJCSAgICAgZm9yIGEgc2luZ2xlIG11eGVkIGludGVycnVwdC4KKy0gaW50ZXJydXB0LW5hbWVzICA6IEEgbGlzdCBvZiBpbnRlcnJ1cHQgbmFtZXMuIFNob3VsZCBjb250YWluIChpZiBwcmVzZW50KToKKwkJICAgICAgIC0gImVycm9yIiBmb3IgU1BFSSwKKwkJICAgICAgIC0gInJ4IiBmb3IgU1BSSSwKKwkJICAgICAgIC0gInR4IiB0byBTUFRJLAorCQkgICAgICAgLSAibXV4IiBmb3IgYSBzaW5nbGUgbXV4ZWQgaW50ZXJydXB0LgorLSBpbnRlcnJ1cHQtcGFyZW50IDogVGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0CisJCSAgICAgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UuCistIG51bS1jcwkgICA6IE51bWJlciBvZiBjaGlwIHNlbGVjdHMuIFNvbWUgUlNQSSBjb3JlcyBoYXZlIG1vcmUgdGhhbiAxLgorLSAjYWRkcmVzcy1jZWxscyAgIDogTXVzdCBiZSA8MT4KKy0gI3NpemUtY2VsbHMgICAgICA6IE11c3QgYmUgPDA+CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGNsb2NrcyAgICAgICAgICAgOiBNdXN0IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uYWwgY2xvY2suCisKK1BpbmN0cmwgcHJvcGVydGllcyBtaWdodCBiZSBuZWVkZWQsIHRvby4gIFNlZQorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcywqLgorCitFeGFtcGxlczoKKworCXNwaTA6IHNwaUBlODAwYzgwMCB7CisJCWNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3BpLXI3czcyMTAwIiwgInJlbmVzYXMscnNwaS1yeiI7CisJCXJlZyA9IDwweGU4MDBjODAwIDB4MjQ+OworCQlpbnRlcnJ1cHRzID0gPDAgMjM4IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJICAgICA8MCAyMzkgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkgICAgIDwwIDI0MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImVycm9yIiwgInJ4IiwgInR4IjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwkJbnVtLWNzID0gPDE+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJfTsKKworCXNwaTogc3BpQGU2YjEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyZW5lc2FzLHFzcGktcjhhNzc5MSIsICJyZW5lc2FzLHFzcGkiOworCQlyZWcgPSA8MCAweGU2YjEwMDAwIDAgMHgyYz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCWludGVycnVwdHMgPSA8MCAxODQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmbXN0cDlfY2xrcyBSOEE3NzkxX0NMS19RU1BJX01PRD47CisJCW51bS1jcyA9IDwxPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zdW40aS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zdW40aS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4MjdmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXN1bjRpLnR4dApAQCAtMCwwICsxLDI0IEBACitBbGx3aW5uZXIgQTEwIFNQSSBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjQtYTEwLXNwaSIuCistIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXIgbG9jYXRpb24gYW5kIGxlbmd0aC4KKy0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gaW50ZXJydXB0LgorLSBjbG9ja3M6IHBoYW5kbGUgdG8gdGhlIGNsb2NrcyBmZWVkaW5nIHRoZSBTUEkgY29udHJvbGxlci4gVHdvIGFyZQorICAgICAgICAgIG5lZWRlZDoKKyAgLSAiYWhiIjogdGhlIGdhdGVkIEFIQiBwYXJlbnQgY2xvY2sKKyAgLSAibW9kIjogdGhlIHBhcmVudCBtb2R1bGUgY2xvY2sKKy0gY2xvY2stbmFtZXM6IE11c3QgY29udGFpbiB0aGUgY2xvY2sgbmFtZXMgZGVzY3JpYmVkIGp1c3QgYWJvdmUKKworRXhhbXBsZToKKworc3BpMTogc3BpQDAxYzA2MDAwIHsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc3BpIjsKKwlyZWcgPSA8MHgwMWMwNjAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8MTE+OworCWNsb2NrcyA9IDwmYWhiX2dhdGVzIDIxPiwgPCZzcGkxX2Nsaz47CisJY2xvY2stbmFtZXMgPSAiYWhiIiwgIm1vZCI7CisJc3RhdHVzID0gImRpc2FibGVkIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zdW42aS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zdW42aS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkZTczZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXN1bjZpLnR4dApAQCAtMCwwICsxLDI0IEBACitBbGx3aW5uZXIgQTMxIFNQSSBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjZpLWEzMS1zcGkiLgorLSByZWc6IFNob3VsZCBjb250YWluIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGguCistIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIGludGVycnVwdC4KKy0gY2xvY2tzOiBwaGFuZGxlIHRvIHRoZSBjbG9ja3MgZmVlZGluZyB0aGUgU1BJIGNvbnRyb2xsZXIuIFR3byBhcmUKKyAgICAgICAgICBuZWVkZWQ6CisgIC0gImFoYiI6IHRoZSBnYXRlZCBBSEIgcGFyZW50IGNsb2NrCisgIC0gIm1vZCI6IHRoZSBwYXJlbnQgbW9kdWxlIGNsb2NrCistIGNsb2NrLW5hbWVzOiBNdXN0IGNvbnRhaW4gdGhlIGNsb2NrIG5hbWVzIGRlc2NyaWJlZCBqdXN0IGFib3ZlCistIHJlc2V0czogcGhhbmRsZSB0byB0aGUgcmVzZXQgY29udHJvbGxlciBhc3NlcnRpbmcgdGhpcyBkZXZpY2UgaW4KKyAgICAgICAgICByZXNldAorCitFeGFtcGxlOgorCitzcGkxOiBzcGlAMDFjNjkwMDAgeworCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1zcGkiOworCXJlZyA9IDwweDAxYzY5MDAwIDB4MTAwMD47CisJaW50ZXJydXB0cyA9IDwwIDY2IDQ+OworCWNsb2NrcyA9IDwmYWhiMV9nYXRlcyAyMT4sIDwmc3BpMV9jbGs+OworCWNsb2NrLW5hbWVzID0gImFoYiIsICJtb2QiOworCXJlc2V0cyA9IDwmYWhiMV9yc3QgMjE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYmUyYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EudHh0CkBAIC0wLDAgKzEsOSBAQAorQ2FkZW5jZSBYdGVuc2EgWFRGUEdBIHBsYXRmb3JtIFNQSSBjb250cm9sbGVyLgorCitUaGlzIHNpbXBsZSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgaXMgYnVpbHQgaW50byB4dGZwZ2EgYml0c3RyZWFtcyBhbmQgaXMgdXNlZAordG8gY29udHJvbCBkYXVnaHRlcmJvYXJkIGF1ZGlvIGNvZGVjLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImNkbnMseHRmcGdhLXNwaSIuCistIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyIGFuZCBsZW5ndGggb2YgbWVtb3J5IG1hcHBlZAorICByZWdpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9xY29tLHNwbWktcG1pYy1hcmIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvcWNvbSxzcG1pLXBtaWMtYXJiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVkMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvcWNvbSxzcG1pLXBtaWMtYXJiLnR4dApAQCAtMCwwICsxLDYxIEBACitRdWFsY29tbSBTUE1JIENvbnRyb2xsZXIgKFBNSUMgQXJiaXRlcikKKworVGhlIFNQTUkgUE1JQyBBcmJpdGVyIGlzIGZvdW5kIG9uIHRoZSBTbmFwZHJhZ29uIDgwMCBTZXJpZXMuICBJdCBpcyBhbiBTUE1JCitjb250cm9sbGVyIHdpdGggd3JhcHBpbmcgYXJiaXRyYXRpb24gbG9naWMgdG8gYWxsb3cgZm9yIG11bHRpcGxlIG9uLWNoaXAKK2RldmljZXMgdG8gY29udHJvbCBhIHNpbmdsZSBTUE1JIG1hc3Rlci4KKworVGhlIFBNSUMgQXJiaXRlciBjYW4gYWxzbyBhY3QgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIsIHByb3ZpZGluZyBpbnRlcnJ1cHRzCit0byBzbGF2ZSBkZXZpY2VzLgorCitTZWUgc3BtaS50eHQgZm9yIHRoZSBnZW5lcmljIFNQTUkgY29udHJvbGxlciBiaW5kaW5nIHJlcXVpcmVtZW50cyBmb3IgY2hpbGQKK25vZGVzLgorCitTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0IGZvcgorZ2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBiaW5kaW5nIGRvY3VtZW50YXRpb24uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInFjb20sc3BtaS1wbWljLWFyYiIuCistIHJlZy1uYW1lcyAgOiBtdXN0IGNvbnRhaW46CisgICAgICJjb3JlIiAtIGNvcmUgcmVnaXN0ZXJzCisgICAgICJpbnRyIiAtIGludGVycnVwdCBjb250cm9sbGVyIHJlZ2lzdGVycworICAgICAiY25mZyIgLSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworLSByZWcgOiBhZGRyZXNzICsgc2l6ZSBwYWlycyBkZXNjcmliaW5nIHRoZSBQTUlDIGFyYiByZWdpc3RlciBzZXRzOyBvcmRlciBtdXN0CisgICAgICAgIGNvcnJlc3BvbmQgd2l0aCB0aGUgb3JkZXIgb2YgZW50cmllcyBpbiByZWctbmFtZXMKKy0gI2FkZHJlc3MtY2VsbHMgOiBtdXN0IGJlIHNldCB0byAyCistICNzaXplLWNlbGxzIDogbXVzdCBiZSBzZXQgdG8gMAorLSBxY29tLGVlIDogaW5kaWNhdGVzIHRoZSBhY3RpdmUgRXhlY3V0aW9uIEVudmlyb25tZW50IGlkZW50aWZpZXIgKDAtNSkKKy0gcWNvbSxjaGFubmVsIDogd2hpY2ggb2YgdGhlIFBNSUMgQXJiIHByb3ZpZGVkIGNoYW5uZWxzIHRvIHVzZSBmb3IgYWNjZXNzZXMgKDAtNSkKKy0gaW50ZXJydXB0cyA6IGludGVycnVwdCBsaXN0IGZvciB0aGUgUE1JQyBBcmIgY29udHJvbGxlciwgbXVzdCBjb250YWluIGEKKyAgICAgICAgICAgICAgIHNpbmdsZSBpbnRlcnJ1cHQgZW50cnkgZm9yIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdAorLSBpbnRlcnJ1cHQtbmFtZXMgOiBjb3JyZXNwb25kaW5nIGludGVycnVwdCBuYW1lcyBmb3IgdGhlIGludGVycnVwdHMKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVkIGluIHRoZSAnaW50ZXJydXB0cycgcHJvcGVydHksIG11c3QgY29udGFpbjoKKyAgICAgInBlcmlwaF9pcnEiIC0gc3VtbWFyeSBpbnRlcnJ1cHQgZm9yIFBNSUMgcGVyaXBoZXJhbHMKKy0gaW50ZXJydXB0LWNvbnRyb2xsZXIgOiBib29sZWFuIGluZGljYXRvciB0aGF0IHRoZSBQTUlDIGFyYml0ZXIgaXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxscyA6ICBtdXN0IGJlIHNldCB0byA0LiBJbnRlcnJ1cHRzIGFyZSBzcGVjaWZpZWQgYXMgYSA0LXR1cGxlOgorICAgIGNlbGwgMTogc2xhdmUgSUQgZm9yIHRoZSByZXF1ZXN0ZWQgaW50ZXJydXB0ICgwLTE1KQorICAgIGNlbGwgMjogcGVyaXBoZXJhbCBJRCBmb3IgcmVxdWVzdGVkIGludGVycnVwdCAoMC0yNTUpCisgICAgY2VsbCAzOiB0aGUgcmVxdWVzdGVkIHBlcmlwaGVyYWwgaW50ZXJydXB0ICgwLTcpCisgICAgY2VsbCA0OiBpbnRlcnJ1cHQgZmxhZ3MgaW5kaWNhdGluZyBsZXZlbC1zZW5zZSBpbmZvcm1hdGlvbiwgYXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaXJxLmgKKworRXhhbXBsZToKKworCXNwbWkgeworCQljb21wYXRpYmxlID0gInFjb20sc3BtaS1wbWljLWFyYiI7CisJCXJlZy1uYW1lcyA9ICJjb3JlIiwgImludHIiLCAiY25mZyI7CisJCXJlZyA9IDwweGZjNGNmMDAwIDB4MTAwMD4sCisJCSAgICAgIDwweGZjNGNiMDAwIDB4MTAwMD4sCisJCSAgICAgIDwweGZjNGNhMDAwIDB4MTAwMD47CisKKwkJaW50ZXJydXB0LW5hbWVzID0gInBlcmlwaF9pcnEiOworCQlpbnRlcnJ1cHRzID0gPDAgMTkwIDA+OworCisJCXFjb20sZWUgPSA8MD47CisJCXFjb20sY2hhbm5lbCA9IDwwPjsKKworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3NwbWkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvc3BtaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyYTQyZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3NwbWkudHh0CkBAIC0wLDAgKzEsNDEgQEAKK1N5c3RlbSBQb3dlciBNYW5hZ2VtZW50IEludGVyZmFjZSAoU1BNSSkgQ29udHJvbGxlcgorCitUaGlzIGRvY3VtZW50IGRlZmluZXMgYSBnZW5lcmljIHNldCBvZiBiaW5kaW5ncyBmb3IgdXNlIGJ5IFNQTUkgY29udHJvbGxlcnMuICBBCitjb250cm9sbGVyIGlzIG1vZGVsbGVkIGluIGRldmljZSB0cmVlIGFzIGEgbm9kZSB3aXRoIHplcm8gb3IgbW9yZSBjaGlsZCBub2RlcywKK2VhY2ggcmVwcmVzZW50aW5nIGEgdW5pcXVlIHNsYXZlIG9uIHRoZSBidXMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistICNhZGRyZXNzLWNlbGxzIDogbXVzdCBiZSBzZXQgdG8gMgorLSAjc2l6ZS1jZWxscyA6IG11c3QgYmUgc2V0IHRvIDAKKworQ2hpbGQgbm9kZXM6CisKK0FuIFNQTUkgY29udHJvbGxlciBub2RlIGNhbiBjb250YWluIHplcm8gb3IgbW9yZSBjaGlsZCBub2RlcyByZXByZXNlbnRpbmcgc2xhdmUKK2RldmljZXMgb24gdGhlIGJ1cy4gIENoaWxkICdyZWcnIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBhcyBhbiBhZGRyZXNzLCB0eXBlCitwYWlyLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC0xNSAoNCBiaXRzKS4gIFRoZSB0eXBlIG11c3QgYmUgb25lIG9mCitTUE1JX1VTSUQgKDApIG9yIFNQTUlfR1NJRCAoMSkgZm9yIFVuaXF1ZSBTbGF2ZSBJRCBvciBHcm91cCBTbGF2ZSBJRCByZXNwZWN0aXZlbHkuCitUaGVzZSBhcmUgdGhlIGlkZW50aWZpZXJzICJzdGF0aWNhbGx5IGFzc2lnbmVkIGJ5IHRoZSBzeXN0ZW0gaW50ZWdyYXRvciIsIGFzCitwZXIgdGhlIFNQTUkgc3BlYy4KKworRWFjaCBjaGlsZCBub2RlIG11c3QgaGF2ZSBvbmUgYW5kIG9ubHkgb25lICdyZWcnIGVudHJ5IG9mIHR5cGUgU1BNSV9VU0lELgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmg+CisKKwlzcG1pQC4uIHsKKwkJY29tcGF0aWJsZSA9ICIuLi4iOworCQlyZWcgPSA8Li4uPjsKKworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPDA+OworCisJCWNoaWxkQDAgeworCQkJY29tcGF0aWJsZSA9ICIuLi4iOworCQkJcmVnID0gPDAgU1BNSV9VU0lEPjsKKwkJfTsKKworCQljaGlsZEA3IHsKKwkJCWNvbXBhdGlibGUgPSAiLi4uIjsKKwkJCXJlZyA9IDw3IFNQTUlfVVNJRAorCQkJICAgICAgIDMgU1BNSV9HU0lEPjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9mc2wtaW14LWRybS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2ZzbC1pbXgtZHJtLnR4dAppbmRleCBiODc2ZDQ5Li4zYmU1Y2U3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2ZzbC1pbXgtZHJtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2ZzbC1pbXgtZHJtLnR4dApAQCAtMSwzICsxLDIyIEBACitGcmVlc2NhbGUgaS5NWCBEUk0gbWFzdGVyIGRldmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZyZWVzY2FsZSBpLk1YIERSTSBtYXN0ZXIgZGV2aWNlIGlzIGEgdmlydHVhbCBkZXZpY2UgbmVlZGVkIHRvIGxpc3QgYWxsCitJUFUgb3Igb3RoZXIgZGlzcGxheSBpbnRlcmZhY2Ugbm9kZXMgdGhhdCBjb21wcmlzZSB0aGUgZ3JhcGhpY3Mgc3Vic3lzdGVtLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImZzbCxpbXgtZGlzcGxheS1zdWJzeXN0ZW0iCistIHBvcnRzOiBTaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgcGhhbmRsZXMgcG9pbnRpbmcgdG8gZGlzcGxheSBpbnRlcmZhY2UgcG9ydHMKKyAgb2YgSVBVIGRldmljZXMKKworZXhhbXBsZToKKworZGlzcGxheS1zdWJzeXN0ZW0geworCWNvbXBhdGlibGUgPSAiZnNsLGRpc3BsYXktc3Vic3lzdGVtIjsKKwlwb3J0cyA9IDwmaXB1X2RpMD47Cit9OworCisKIEZyZWVzY2FsZSBpLk1YIElQVXYzCiA9PT09PT09PT09PT09PT09PT09PQogCkBAIC03LDE4ICsyNiwzMSBAQAogICBkYXRhc2hlZXQKIC0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gc3luYyBpbnRlcnJ1cHQgYW5kIGVycm9yIGludGVycnVwdCwKICAgaW4gdGhpcyBvcmRlci4KLS0gI2NydGMtY2VsbHM6IDEsIFNlZSBiZWxvdwogLSByZXNldHM6IHBoYW5kbGUgcG9pbnRpbmcgdG8gdGhlIHN5c3RlbSByZXNldCBjb250cm9sbGVyIGFuZAogICAgICAgICAgIHJlc2V0IGxpbmUgaW5kZXgsIHNlZSByZXNldC9mc2wsaW14LXNyYy50eHQgZm9yIGRldGFpbHMKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHBvcnRAWzAtM106IFBvcnQgbm9kZXMgd2l0aCBlbmRwb2ludCBkZWZpbml0aW9ucyBhcyBkZWZpbmVkIGluCisgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby1pbnRlcmZhY2VzLnR4dC4KKyAgUG9ydHMgMCBhbmQgMSBzaG91bGQgY29ycmVzcG9uZCB0byBDU0kwIGFuZCBDU0kxLAorICBwb3J0cyAyIGFuZCAzIHNob3VsZCBjb3JyZXNwb25kIHRvIERJMCBhbmQgREkxLCByZXNwZWN0aXZlbHkuCiAKIGV4YW1wbGU6CiAKIGlwdTogaXB1QDE4MDAwMDAwIHsKLQkjY3J0Yy1jZWxscyA9IDwxPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKIAljb21wYXRpYmxlID0gImZzbCxpbXg1My1pcHUiOwogCXJlZyA9IDwweDE4MDAwMDAwIDB4MDgwMDAwMDAwPjsKIAlpbnRlcnJ1cHRzID0gPDExIDEwPjsKIAlyZXNldHMgPSA8JnNyYyAyPjsKKworCWlwdV9kaTA6IHBvcnRAMiB7CisJCXJlZyA9IDwyPjsKKworCQlpcHVfZGkwX2Rpc3AwOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXlfaW4+OworCQl9OworCX07CiB9OwogCiBQYXJhbGxlbCBkaXNwbGF5IHN1cHBvcnQKQEAgLTI2LDE5ICs1OCwyNSBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSIKLS0gY3J0YzogdGhlIGNydGMgdGhpcyBkaXNwbGF5IGlzIGNvbm5lY3RlZCB0bywgc2VlIGJlbG93CiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBpbnRlcmZhY2VfcGl4X2ZtdDogSG93IHRoaXMgZGlzcGxheSBpcyBjb25uZWN0ZWQgdG8gdGhlCi0gIGNydGMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgdHlwZXM6ICJyZ2IyNCIsICJyZ2I1NjUiLCAiYmdyNjY2IgorICBkaXNwbGF5IGludGVyZmFjZS4gQ3VycmVudGx5IHN1cHBvcnRlZCB0eXBlczogInJnYjI0IiwgInJnYjU2NSIsICJiZ3I2NjYiCiAtIGVkaWQ6IHZlcmJhdGltIEVESUQgZGF0YSBibG9jayBkZXNjcmliaW5nIGF0dGFjaGVkIGRpc3BsYXkuCiAtIGRkYzogcGhhbmRsZSBkZXNjcmliaW5nIHRoZSBpMmMgYnVzIGhhbmRsaW5nIHRoZSBkaXNwbGF5IGRhdGEKICAgY2hhbm5lbAorLSBwb3J0OiBBIHBvcnQgbm9kZSB3aXRoIGVuZHBvaW50IGRlZmluaXRpb25zIGFzIGRlZmluZWQgaW4KKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvLWludGVyZmFjZXMudHh0LgogCiBleGFtcGxlOgogCiBkaXNwbGF5QGRpMCB7CiAJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwogCWVkaWQgPSBbZWRpZC1kYXRhXTsKLQljcnRjID0gPCZpcHUgMD47CiAJaW50ZXJmYWNlLXBpeC1mbXQgPSAicmdiMjQiOworCisJcG9ydCB7CisJCWRpc3BsYXlfaW46IGVuZHBvaW50IHsKKwkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMF9kaXNwMD47CisJCX07CisJfTsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2hkbWkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9oZG1pLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjc1NmNmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9oZG1pLnR4dApAQCAtMCwwICsxLDU4IEBACitEZXZpY2UtVHJlZSBiaW5kaW5ncyBmb3IgSERNSSBUcmFuc21pdHRlcgorCitIRE1JIFRyYW5zbWl0dGVyCis9PT09PT09PT09PT09PT09CisKK1RoZSBIRE1JIFRyYW5zbWl0dGVyIGlzIGEgU3lub3BzeXMgRGVzaWduV2FyZSBIRE1JIDEuNCBUWCBjb250cm9sbGVyIElQCit3aXRoIGFjY29tcGFueWluZyBQSFkgSVAuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSAjYWRkcmVzcy1jZWxscyA6IHNob3VsZCBiZSA8MT4KKyAtICNzaXplLWNlbGxzIDogc2hvdWxkIGJlIDwwPgorIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiZnNsLGlteDZxLWhkbWkiIG9yICJmc2wsaW14NmRsLWhkbWkiLgorIC0gZ3ByIDogc2hvdWxkIGJlIDwmZ3ByPi4KKyAgIFRoZSBwaGFuZGxlIHBvaW50cyB0byB0aGUgaW9tdXhjLWdwciByZWdpb24gY29udGFpbmluZyB0aGUgSERNSQorICAgbXVsdGlwbGV4ZXIgY29udHJvbCByZWdpc3Rlci4KKyAtIGNsb2NrcywgY2xvY2stbmFtZXMgOiBwaGFuZGxlcyB0byB0aGUgSERNSSBpYWhiIGFuZCBpc3JmIGNsb2NrcywgYXMgZGVzY3JpYmVkCisgICBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0IGFuZAorICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2lteDZxLWNsb2NrLnR4dC4KKyAtIHBvcnRAWzAtNF06IFVwIHRvIGZvdXIgcG9ydCBub2RlcyB3aXRoIGVuZHBvaW50IGRlZmluaXRpb25zIGFzIGRlZmluZWQgaW4KKyAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby1pbnRlcmZhY2VzLnR4dCwKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvdXIgaW5wdXRzIHRvIHRoZSBIRE1JIG11bHRpcGxleGVyLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gZGRjLWkyYy1idXM6IHBoYW5kbGUgb2YgYW4gSTJDIGNvbnRyb2xsZXIgdXNlZCBmb3IgRERDIEVESUQgcHJvYmluZworCitleGFtcGxlOgorCisJZ3ByOiBpb211eGMtZ3ByQDAyMGUwMDAwIHsKKwkJLyogLi4uICovCisJfTsKKworICAgICAgICBoZG1pOiBoZG1pQDAxMjAwMDAgeworICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OworICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gPDA+OworICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWhkbWkiOworICAgICAgICAgICAgICAgIHJlZyA9IDwweDAwMTIwMDAwIDB4OTAwMD47CisgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwwIDExNSAweDA0PjsKKyAgICAgICAgICAgICAgICBncHIgPSA8Jmdwcj47CisgICAgICAgICAgICAgICAgY2xvY2tzID0gPCZjbGtzIDEyMz4sIDwmY2xrcyAxMjQ+OworICAgICAgICAgICAgICAgIGNsb2NrLW5hbWVzID0gImlhaGIiLCAiaXNmciI7CisgICAgICAgICAgICAgICAgZGRjLWkyYy1idXMgPSA8JmkyYzI+OworCisgICAgICAgICAgICAgICAgcG9ydEAwIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwwPjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaGRtaV9tdXhfMDogZW5kcG9pbnQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX2hkbWk+OworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgcG9ydEAxIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxPjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaGRtaV9tdXhfMTogZW5kcG9pbnQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2hkbWk+OworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9sZGIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9sZGIudHh0CmluZGV4IGVkOTM3NzguLjU3OGExZmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vbGRiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2xkYi50eHQKQEAgLTUwLDEyICs1MCwxNCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogIC0gcmVnIDogc2hvdWxkIGJlIDwwPiBvciA8MT4KLSAtIGNydGNzIDogYSBsaXN0IG9mIHBoYW5kbGVzIHdpdGggaW5kZXggcG9pbnRpbmcgdG8gdGhlIElQVSBkaXNwbGF5IGludGVyZmFjZXMKLSAgICAgICAgICAgdGhhdCBjYW4gYmUgdXNlZCBhcyB2aWRlbyBzb3VyY2UgZm9yIHRoaXMgY2hhbm5lbC4KICAtIGZzbCxkYXRhLW1hcHBpbmcgOiBzaG91bGQgYmUgInNwd2ciIG9yICJqZWlkYSIKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIGNvbG9yIGJpdHMgYXJlIGxhaWQgb3V0IGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQgTFZEUyBzaWduYWwuCiAgLSBmc2wsZGF0YS13aWR0aCA6IHNob3VsZCBiZSA8MTg+IG9yIDwyND4KKyAtIHBvcnQ6IEEgcG9ydCBub2RlIHdpdGggZW5kcG9pbnQgZGVmaW5pdGlvbnMgYXMgZGVmaW5lZCBpbgorICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvLWludGVyZmFjZXMudHh0LgorICAgT24gaS5NWDYsIHRoZXJlIHNob3VsZCBiZSBmb3VyIHBvcnRzIChwb3J0QFswLTNdKSB0aGF0IGNvcnJlc3BvbmQKKyAgIHRvIHRoZSBmb3VyIExWRFMgbXVsdGlwbGV4ZXIgaW5wdXRzLgogCiBleGFtcGxlOgogCkBAIC03NywyMyArNzksMzMgQEAKIAogCWx2ZHMtY2hhbm5lbEAwIHsKIAkJcmVnID0gPDA+OwotCQljcnRjcyA9IDwmaXB1IDA+OwogCQlmc2wsZGF0YS1tYXBwaW5nID0gInNwd2ciOwogCQlmc2wsZGF0YS13aWR0aCA9IDwyND47CiAKIAkJZGlzcGxheS10aW1pbmdzIHsKIAkJCS8qIC4uLiAqLwogCQl9OworCisJCXBvcnQgeworCQkJbHZkczBfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfbHZkczA+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJbHZkcy1jaGFubmVsQDEgewogCQlyZWcgPSA8MT47Ci0JCWNydGNzID0gPCZpcHUgMT47CiAJCWZzbCxkYXRhLW1hcHBpbmcgPSAic3B3ZyI7CiAJCWZzbCxkYXRhLXdpZHRoID0gPDI0PjsKIAogCQlkaXNwbGF5LXRpbWluZ3MgewogCQkJLyogLi4uICovCiAJCX07CisKKwkJcG9ydCB7CisJCQlsdmRzMV9pbjogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMV9sdmRzMT47CisJCQl9OworCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL2FsbHdpbm5lcixzdW40aS10aW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvYWxsd2lubmVyLHN1bjRpLXRpbWVyLnR4dAppbmRleCA0OGFlYjc4Li41YzJlMjM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvYWxsd2lubmVyLHN1bjRpLXRpbWVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvYWxsd2lubmVyLHN1bjRpLXRpbWVyLnR4dApAQCAtMiw3ICsyLDcgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIAotLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuNGktdGltZXIiCistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiCiAtIHJlZyA6IFNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIHJlZ2lzdGVycy4KIC0gaW50ZXJydXB0cyA6IFRoZSBpbnRlcnJ1cHQgb2YgdGhlIGZpcnN0IHRpbWVyCiAtIGNsb2NrczogcGhhbmRsZSB0byB0aGUgc291cmNlIGNsb2NrICh1c3VhbGx5IGEgMjQgTUh6IGZpeGVkIGNsb2NrKQpAQCAtMTAsNyArMTAsNyBAQAogRXhhbXBsZToKIAogdGltZXIgewotCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIjsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiOwogCXJlZyA9IDwweDAxYzIwYzAwIDB4NDAwPjsKIAlpbnRlcnJ1cHRzID0gPDIyPjsKIAljbG9ja3MgPSA8Jm9zYz47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvdGksa2V5c3RvbmUtdGltZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL3RpLGtleXN0b25lLXRpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJlMzYxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL3RpLGtleXN0b25lLXRpbWVyLnR4dApAQCAtMCwwICsxLDI5IEBACisqIERldmljZSB0cmVlIGJpbmRpbmdzIGZvciBUZXhhcyBpbnN0cnVtZW50cyBLZXlzdG9uZSB0aW1lcgorCitUaGlzIGRvY3VtZW50IHByb3ZpZGVzIGJpbmRpbmdzIGZvciB0aGUgNjQtYml0IHRpbWVyIGluIHRoZSBLZXlTdG9uZQorYXJjaGl0ZWN0dXJlIGRldmljZXMuIFRoZSB0aW1lciBjYW4gYmUgY29uZmlndXJlZCBhcyBhIGdlbmVyYWwtcHVycG9zZSA2NC1iaXQKK3RpbWVyLCBkdWFsIGdlbmVyYWwtcHVycG9zZSAzMi1iaXQgdGltZXJzLiBXaGVuIGNvbmZpZ3VyZWQgYXMgZHVhbCAzMi1iaXQKK3RpbWVycywgZWFjaCBoYWxmIGNhbiBvcGVyYXRlIGluIGNvbmp1bmN0aW9uIChjaGFpbiBtb2RlKSBvciBpbmRlcGVuZGVudGx5CisodW5jaGFpbmVkIG1vZGUpIG9mIGVhY2ggb3RoZXIuCisKK0l0IGlzIGdsb2JhbCB0aW1lciBpcyBhIGZyZWUgcnVubmluZyB1cC1jb3VudGVyIGFuZCBjYW4gZ2VuZXJhdGUgaW50ZXJydXB0Cit3aGVuIHRoZSBjb3VudGVyIHJlYWNoZXMgcHJlc2V0IGNvdW50ZXIgdmFsdWVzLgorCitEb2N1bWVudGF0aW9uOgoraHR0cDovL3d3dy50aS5jb20vbGl0L3VnL3NwcnVndjVhL3NwcnVndjVhLnBkZgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInRpLGtleXN0b25lLXRpbWVyIi4KKy0gcmVnIDogc3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgY291bnQgb2YgdGhlIHJlZ2lzdGVycy4KKy0gaW50ZXJydXB0cyA6IGludGVycnVwdCBnZW5lcmF0ZWQgYnkgdGhlIHRpbWVyLgorLSBjbG9ja3MgOiB0aGUgY2xvY2sgZmVlZGluZyB0aGUgdGltZXIgY2xvY2suCisKK0V4YW1wbGU6CisKK3RpbWVyQDIyZjAwMDAgeworCWNvbXBhdGlibGUgPSAidGksa2V5c3RvbmUtdGltZXIiOworCXJlZyA9IDwweDAyMmYwMDAwIDB4ODA+OworCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMTAgSVJRX1RZUEVfRURHRV9SSVNJTkc+OworCWNsb2NrcyA9IDwmY2xrdGltZXIxNT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLWlteC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtaW14LnR4dAppbmRleCBiNGI1Yjc5Li5hNmEzMmNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtaW14LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtaW14LnR4dApAQCAtMTgsNiArMTgsNyBAQAogLSB2YnVzLXN1cHBseTogcmVndWxhdG9yIGZvciB2YnVzCiAtIGRpc2FibGUtb3Zlci1jdXJyZW50OiBkaXNhYmxlIG92ZXIgY3VycmVudCBkZXRlY3QKIC0gZXh0ZXJuYWwtdmJ1cy1kaXZpZGVyOiBlbmFibGVzIG9mZi1jaGlwIHJlc2lzdG9yIGRpdmlkZXIgZm9yIFZidXMKKy0gbWF4aW11bS1zcGVlZDogbGltaXQgdGhlIG1heGltdW0gY29ubmVjdGlvbiBzcGVlZCB0byAiZnVsbC1zcGVlZCIuCiAKIEV4YW1wbGVzOgogdXNiQDAyMTg0MDAwIHsgLyogVVNCIE9URyAqLwpAQCAtMjgsNCArMjksNSBAQAogCWZzbCx1c2JtaXNjID0gPCZ1c2JtaXNjIDA+OwogCWRpc2FibGUtb3Zlci1jdXJyZW50OwogCWV4dGVybmFsLXZidXMtZGl2aWRlcjsKKwltYXhpbXVtLXNwZWVkID0gImZ1bGwtc3BlZWQiOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy16ZXZpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtemV2aW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYmNiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtemV2aW8udHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogTFNJIFpldmlvIFVTQiBPVEcgQ29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImxzaSx6ZXZpby11c2IiCistIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKKy0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gY29udHJvbGxlciBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gdmJ1cy1zdXBwbHk6IHJlZ3VsYXRvciBmb3IgdmJ1cworCitFeGFtcGxlczoKKwkJdXNiMDogdXNiQGIwMDAwMDAwIHsKKwkJCXJlZyA9IDwweGIwMDAwMDAwIDB4MTAwMD47CisJCQljb21wYXRpYmxlID0gImxzaSx6ZXZpby11c2IiOworCQkJaW50ZXJydXB0cyA9IDw4PjsKKwkJCXZidXMtc3VwcGx5ID0gPCZ2YnVzX3JlZz47CisJCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dAppbmRleCBlODA3NjM1Li40NzEzNjZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKQEAgLTYsMTEgKzYsMTMgQEAKICAtIGNvbXBhdGlibGU6IG11c3QgYmUgInNucHMsZHdjMyIKICAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCiAgLSBpbnRlcnJ1cHRzOiBJbnRlcnJ1cHRzIHVzZWQgYnkgdGhlIGR3YzMgY29udHJvbGxlci4KKworT3B0aW9uYWwgcHJvcGVydGllczoKICAtIHVzYi1waHkgOiBhcnJheSBvZiBwaGFuZGxlIGZvciB0aGUgUEhZIGRldmljZS4gIFRoZSBmaXJzdCBlbGVtZW50CiAgICBpbiB0aGUgYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBoYW5kbGUgdG8gdGhlIFVTQjIvSFMgUEhZIGFuZAogICAgdGhlIHNlY29uZCBlbGVtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgaGFuZGxlIHRvIHRoZSBVU0IzL1NTIFBIWQotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gcGh5czogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncworIC0gcGh5LW5hbWVzOiBmcm9tIHRoZSAqR2VuZXJpYyBQSFkqIGJpbmRpbmdzCiAgLSB0eC1maWZvLXJlc2l6ZTogZGV0ZXJtaW5lcyBpZiB0aGUgRklGTyAqaGFzKiB0byBiZSByZWFsbG9jYXRlZC4KIAogVGhpcyBpcyB1c3VhbGx5IGEgc3Vibm9kZSB0byBEV0MzIGdsdWUgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9mc2wtdXNiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZnNsLXVzYi50eHQKaW5kZXggYmQ1NzIzZi4uNDc3OWMwMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9mc2wtdXNiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2ZzbC11c2IudHh0CkBAIC04LDcgKzgsOSBAQAogUmVxdWlyZWQgcHJvcGVydGllcyA6CiAgLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wtdXNiMi1tcGgiIGZvciBtdWx0aSBwb3J0IGhvc3QgVVNCCiAgICBjb250cm9sbGVycywgb3IgImZzbC11c2IyLWRyIiBmb3IgZHVhbCByb2xlIFVTQiBjb250cm9sbGVycwotICAgb3IgImZzbCxtcGM1MTIxLXVzYjItZHIiIGZvciBkdWFsIHJvbGUgVVNCIGNvbnRyb2xsZXJzIG9mIE1QQzUxMjEKKyAgIG9yICJmc2wsbXBjNTEyMS11c2IyLWRyIiBmb3IgZHVhbCByb2xlIFVTQiBjb250cm9sbGVycyBvZiBNUEM1MTIxLgorICAgV2hlcmV2ZXIgYXBwbGljYWJsZSwgdGhlIElQIHZlcnNpb24gb2YgdGhlIFVTQiBjb250cm9sbGVyIHNob3VsZAorICAgYWxzbyBiZSBtZW50aW9uZWQgKGZvciBlZy4gZnNsLXVzYjItZHItdjIuMiBmb3IgYnNjOTEzMikuCiAgLSBwaHlfdHlwZSA6IEZvciBtdWx0aSBwb3J0IGhvc3QgVVNCIGNvbnRyb2xsZXJzLCBzaG91bGQgYmUgb25lIG9mCiAgICAidWxwaSIsIG9yICJzZXJpYWwiLiBGb3IgZHVhbCByb2xlIFVTQiBjb250cm9sbGVycywgc2hvdWxkIGJlCiAgICBvbmUgb2YgInVscGkiLCAidXRtaSIsICJ1dG1pX3dpZGUiLCBvciAic2VyaWFsIi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXhzLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL214cy1waHkudHh0CmluZGV4IDU4MzViMjcuLmNlZjE4MWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXhzLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9teHMtcGh5LnR4dApAQCAtMSwxMyArMSwxOSBAQAogKiBGcmVlc2NhbGUgTVhTIFVTQiBQaHkgRGV2aWNlCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiZnNsLGlteDIzLXVzYnBoeSIKKy0gY29tcGF0aWJsZTogc2hvdWxkIGNvbnRhaW46CisJKiAiZnNsLGlteDIzLXVzYnBoeSIgZm9yIGlteDIzIGFuZCBpbXgyOAorCSogImZzbCxpbXg2cS11c2JwaHkiIGZvciBpbXg2ZHEgYW5kIGlteDZkbAorCSogImZzbCxpbXg2c2wtdXNicGh5IiBmb3IgaW14NnNsCisgICJmc2wsaW14MjMtdXNicGh5IiBpcyBzdGlsbCBhIGZhbGxiYWNrIGZvciBvdGhlciBzdHJpbmdzCiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gcGh5IGludGVycnVwdAorLSBmc2wsYW5hdG9wOiBwaGFuZGxlIGZvciBhbmF0b3AgcmVnaXN0ZXIsIGl0IGlzIG9ubHkgZm9yIGlteDYgU29DIHNlcmllcwogCiBFeGFtcGxlOgogdXNicGh5MTogdXNicGh5QDAyMGM5MDAwIHsKIAljb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2JwaHkiLCAiZnNsLGlteDIzLXVzYnBoeSI7CiAJcmVnID0gPDB4MDIwYzkwMDAgMHgxMDAwPjsKIAlpbnRlcnJ1cHRzID0gPDAgNDQgMHgwND47CisJZnNsLGFuYXRvcCA9IDwmYW5hdG9wPjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL29tYXAtdXNiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0CmluZGV4IGM0OTUxMzUuLjM4YjJmYWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0CkBAIC03NiwyNyArNzYsMyBAQAogCXJhbmdlczsKIH07CiAKLU9NQVAgQ09OVFJPTCBVU0IKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YKLSAidGksY29udHJvbC1waHktb3RnaHMiIC0gaWYgaXQgaGFzIG90Z2hzX2NvbnRyb2wgbWFpbGJveCByZWdpc3RlciBhcyBvbiBPTUFQNC4KLSAidGksY29udHJvbC1waHktdXNiMiIgLSBpZiBpdCBoYXMgUG93ZXIgZG93biBiaXQgaW4gY29udHJvbF9kZXZfY29uZiByZWdpc3RlcgotCQkJZS5nLiBVU0IyX1BIWSBvbiBPTUFQNS4KLSAidGksY29udHJvbC1waHktcGlwZTMiIC0gaWYgaXQgaGFzIERQTEwgYW5kIGluZGl2aWR1YWwgUnggJiBUeCBwb3dlciBjb250cm9sCi0JCQllLmcuIFVTQjMgUEhZIGFuZCBTQVRBIFBIWSBvbiBPTUFQNS4KLSAidGksY29udHJvbC1waHktZHJhN3VzYjIiIC0gaWYgaXQgaGFzIHBvd2VyIGRvd24gcmVnaXN0ZXIgbGlrZSBVU0IyIFBIWSBvbgotCQkJRFJBNyBwbGF0Zm9ybS4KLSAidGksY29udHJvbC1waHktYW00Mzd1c2IyIiAtIGlmIGl0IGhhcyBwb3dlciBkb3duIHJlZ2lzdGVyIGxpa2UgVVNCMiBQSFkgb24KLQkJCUFNNDM3IHBsYXRmb3JtLgotIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuIEl0IGNvbnRhaW5zCi0gICB0aGUgYWRkcmVzcyBvZiAib3RnaHNfY29udHJvbCIgZm9yIGNvbnRyb2wtcGh5LW90Z2hzIG9yICJwb3dlciIgcmVnaXN0ZXIKLSAgIGZvciBvdGhlciB0eXBlcy4KLSAtIHJlZy1uYW1lczogc2hvdWxkIGJlICJvdGdoc19jb250cm9sIiBjb250cm9sLXBoeS1vdGdocyBhbmQgInBvd2VyIiBmb3IKLSAgIG90aGVyIHR5cGVzLgotCi1vbWFwX2NvbnRyb2xfdXNiOiBvbWFwLWNvbnRyb2wtdXNiQDRhMDAyMzAwIHsKLQljb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LW90Z2hzIjsKLQlyZWcgPSA8MHg0YTAwMjMzYyAweDQ+OwotCXJlZy1uYW1lcyA9ICJvdGdoc19jb250cm9sIjsKLX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3BsYXRmb3JtLXVoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9wbGF0Zm9ybS11aGNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYjA3MS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3BsYXRmb3JtLXVoY2kudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotR2VuZXJpYyBQbGF0Zm9ybSBVSENJIENvbnRyb2xsZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgOiAicGxhdGZvcm0tdWhjaSIKLS0gcmVnIDogU2hvdWxkIGNvbnRhaW4gMSByZWdpc3RlciByYW5nZXMoYWRkcmVzcyBhbmQgbGVuZ3RoKQotLSBpbnRlcnJ1cHRzIDogVUhDSSBjb250cm9sbGVyIGludGVycnVwdAotCi1FeGFtcGxlOgotCi0JdWhjaUBkODAwN2IwMCB7Ci0JCWNvbXBhdGlibGUgPSAicGxhdGZvcm0tdWhjaSI7Ci0JCXJlZyA9IDwweGQ4MDA3YjAwIDB4MjAwPjsKLQkJaW50ZXJydXB0cyA9IDw0Mz47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLWVoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItZWhjaS50eHQKaW5kZXggZmExODYxMi4uZmYxNTFlYzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLWVoY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLWVoY2kudHh0CkBAIC0xLDE5ICsxLDIwIEBACiBVU0IgRUhDSSBjb250cm9sbGVycwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotICAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInVzYi1laGNpIi4KKyAgLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJnZW5lcmljLWVoY2kiLgogICAtIHJlZyA6IHNob3VsZCBjb250YWluIGF0IGxlYXN0IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgc3RhbmRhcmQgRUhDSQogICAgIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gT3B0aW9uYWwgcGxhdGZvcm0tZGVwZW5kZW50IHJlZ2lzdGVycwogICAgIChkZWJ1Zy1wb3J0IG9yIG90aGVyKSBjYW4gYmUgYWxzbyBzcGVjaWZpZWQgaGVyZSwgYnV0IG9ubHkgYWZ0ZXIKICAgICBkZWZpbml0aW9uIG9mIHN0YW5kYXJkIEVIQ0kgcmVnaXN0ZXJzLgogICAtIGludGVycnVwdHMgOiBvbmUgRUhDSSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGRlc2NyaWJlZCBoZXJlLgotSWYgZGV2aWNlIHJlZ2lzdGVycyBhcmUgaW1wbGVtZW50ZWQgaW4gYmlnIGVuZGlhbiBtb2RlLCB0aGUgZGV2aWNlCi1ub2RlIHNob3VsZCBoYXZlICJiaWctZW5kaWFuLXJlZ3MiIHByb3BlcnR5LgotSWYgY29udHJvbGxlciBpbXBsZW1lbnRhdGlvbiBvcGVyYXRlcyB3aXRoIGJpZyBlbmRpYW4gZGVzY3JpcHRvcnMsCi0iYmlnLWVuZGlhbi1kZXNjIiBwcm9wZXJ0eSBzaG91bGQgYmUgc3BlY2lmaWVkLgotSWYgYm90aCBiaWcgZW5kaWFuIHJlZ2lzdGVycyBhbmQgZGVzY3JpcHRvcnMgYXJlIHVzZWQgYnkgdGhlIGNvbnRyb2xsZXIKLWltcGxlbWVudGF0aW9uLCAiYmlnLWVuZGlhbiIgcHJvcGVydHkgY2FuIGJlIHNwZWNpZmllZCBpbnN0ZWFkIG9mIGhhdmluZwotYm90aCAiYmlnLWVuZGlhbi1yZWdzIiBhbmQgImJpZy1lbmRpYW4tZGVzYyIuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBiaWctZW5kaWFuLXJlZ3MgOiBib29sZWFuLCBzZXQgdGhpcyBmb3IgaGNkcyB3aXRoIGJpZy1lbmRpYW4gcmVnaXN0ZXJzCisgLSBiaWctZW5kaWFuLWRlc2MgOiBib29sZWFuLCBzZXQgdGhpcyBmb3IgaGNkcyB3aXRoIGJpZy1lbmRpYW4gZGVzY3JpcHRvcnMKKyAtIGJpZy1lbmRpYW4gOiBib29sZWFuLCBmb3IgaGNkcyB3aXRoIGJpZy1lbmRpYW4tcmVncyArIGJpZy1lbmRpYW4tZGVzYworIC0gY2xvY2tzIDogYSBsaXN0IG9mIHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgcGFpcnMKKyAtIHBoeXMgOiBwaGFuZGxlICsgcGh5IHNwZWNpZmllciBwYWlyCisgLSBwaHktbmFtZXMgOiAidXNiIgogCiBFeGFtcGxlIChTZXF1b2lhIDQ0MEVQeCk6CiAgICAgZWhjaUBlMDAwMDMwMCB7CkBAIC0yMywzICsyNCwxMyBAQAogCSAgIHJlZyA9IDwwIGUwMDAwMzAwIDkwIDAgZTAwMDAzOTAgNzA+OwogCSAgIGJpZy1lbmRpYW47CiAgICB9OworCitFeGFtcGxlIChBbGx3aW5uZXIgc3VuNGkgQTEwIFNvQyk6CisgICBlaGNpMDogdXNiQDAxYzE0MDAwIHsKKwkgICBjb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtZWhjaSIsICJnZW5lcmljLWVoY2kiOworCSAgIHJlZyA9IDwweDAxYzE0MDAwIDB4MTAwPjsKKwkgICBpbnRlcnJ1cHRzID0gPDM5PjsKKwkgICBjbG9ja3MgPSA8JmFoYl9nYXRlcyAxPjsKKwkgICBwaHlzID0gPCZ1c2JwaHkgMT47CisJICAgcGh5LW5hbWVzID0gInVzYiI7CisgICB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2Itb2hjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1vaGNpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY2N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2Itb2hjaS50eHQKQEAgLTAsMCArMSwyNSBAQAorVVNCIE9IQ0kgY29udHJvbGxlcnMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJnZW5lcmljLW9oY2kiCistIHJlZyA6IG9oY2kgY29udHJvbGxlciByZWdpc3RlciByYW5nZSAoYWRkcmVzcyBhbmQgbGVuZ3RoKQorLSBpbnRlcnJ1cHRzIDogb2hjaSBjb250cm9sbGVyIGludGVycnVwdAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBiaWctZW5kaWFuLXJlZ3MgOiBib29sZWFuLCBzZXQgdGhpcyBmb3IgaGNkcyB3aXRoIGJpZy1lbmRpYW4gcmVnaXN0ZXJzCistIGJpZy1lbmRpYW4tZGVzYyA6IGJvb2xlYW4sIHNldCB0aGlzIGZvciBoY2RzIHdpdGggYmlnLWVuZGlhbiBkZXNjcmlwdG9ycworLSBiaWctZW5kaWFuIDogYm9vbGVhbiwgZm9yIGhjZHMgd2l0aCBiaWctZW5kaWFuLXJlZ3MgKyBiaWctZW5kaWFuLWRlc2MKKy0gY2xvY2tzIDogYSBsaXN0IG9mIHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgcGFpcnMKKy0gcGh5cyA6IHBoYW5kbGUgKyBwaHkgc3BlY2lmaWVyIHBhaXIKKy0gcGh5LW5hbWVzIDogInVzYiIKKworRXhhbXBsZToKKworCW9oY2kwOiB1c2JAMDFjMTQ0MDAgeworCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtb2hjaSIsICJnZW5lcmljLW9oY2kiOworCQlyZWcgPSA8MHgwMWMxNDQwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8NjQ+OworCQljbG9ja3MgPSA8JnVzYl9jbGsgNj4sIDwmYWhiX2dhdGVzIDI+OworCQlwaHlzID0gPCZ1c2JwaHkgMT47CisJCXBoeS1uYW1lcyA9ICJ1c2IiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItcGh5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyNDVjOC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1waHkudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotVVNCIFBIWQotCi1PTUFQIFVTQjIgUEhZCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLG9tYXAtdXNiMiIKLSAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgotIC0gI3BoeS1jZWxsczogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBzaG91bGQgYmUgZ2l2ZW4gaW4gdGhlCi0gICBwaGFuZGxlIHdoaWxlIHJlZmVyZW5jaW5nIHRoaXMgcGh5LgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgotIC0gY3RybC1tb2R1bGUgOiBwaGFuZGxlIG9mIHRoZSBjb250cm9sIG1vZHVsZSB1c2VkIGJ5IFBIWSBkcml2ZXIgdG8gcG93ZXIgb24KLSAgIHRoZSBQSFkuCi0KLVRoaXMgaXMgdXN1YWxseSBhIHN1Ym5vZGUgb2Ygb2NwMnNjcCB0byB3aGljaCBpdCBpcyBjb25uZWN0ZWQuCi0KLXVzYjJwaHlANGEwYWQwODAgewotCWNvbXBhdGlibGUgPSAidGksb21hcC11c2IyIjsKLQlyZWcgPSA8MHg0YTBhZDA4MCAweDU4PjsKLQljdHJsLW1vZHVsZSA9IDwmb21hcF9jb250cm9sX3VzYj47Ci0JI3BoeS1jZWxscyA9IDwwPjsKLX07Ci0KLU9NQVAgVVNCMyBQSFkKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAidGksb21hcC11c2IzIgotIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuCi0gLSByZWctbmFtZXM6IFRoZSBuYW1lcyBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVycwotICAgZmlsbGVkIGluICJyZWciLgotIC0gI3BoeS1jZWxsczogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBzaG91bGQgYmUgZ2l2ZW4gaW4gdGhlCi0gICBwaGFuZGxlIHdoaWxlIHJlZmVyZW5jaW5nIHRoaXMgcGh5LgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgotIC0gY3RybC1tb2R1bGUgOiBwaGFuZGxlIG9mIHRoZSBjb250cm9sIG1vZHVsZSB1c2VkIGJ5IFBIWSBkcml2ZXIgdG8gcG93ZXIgb24KLSAgIHRoZSBQSFkuCi0KLVRoaXMgaXMgdXN1YWxseSBhIHN1Ym5vZGUgb2Ygb2NwMnNjcCB0byB3aGljaCBpdCBpcyBjb25uZWN0ZWQuCi0KLXVzYjNwaHlANGEwODQ0MDAgewotCWNvbXBhdGlibGUgPSAidGksb21hcC11c2IzIjsKLQlyZWcgPSA8MHg0YTA4NDQwMCAweDgwPiwKLQkgICAgICA8MHg0YTA4NDgwMCAweDY0PiwKLQkgICAgICA8MHg0YTA4NGMwMCAweDQwPjsKLQlyZWctbmFtZXMgPSAicGh5X3J4IiwgInBoeV90eCIsICJwbGxfY3RybCI7Ci0JY3RybC1tb2R1bGUgPSA8Jm9tYXBfY29udHJvbF91c2I+OwotCSNwaHktY2VsbHMgPSA8MD47Ci19OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItdWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi11aGNpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTgxMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItdWhjaS50eHQKQEAgLTAsMCArMSwxNSBAQAorR2VuZXJpYyBQbGF0Zm9ybSBVSENJIENvbnRyb2xsZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAiZ2VuZXJpYy11aGNpIiAoZGVwcmVjYXRlZDogInBsYXRmb3JtLXVoY2kiKQorLSByZWcgOiBTaG91bGQgY29udGFpbiAxIHJlZ2lzdGVyIHJhbmdlcyhhZGRyZXNzIGFuZCBsZW5ndGgpCistIGludGVycnVwdHMgOiBVSENJIGNvbnRyb2xsZXIgaW50ZXJydXB0CisKK0V4YW1wbGU6CisKKwl1aGNpQGQ4MDA3YjAwIHsKKwkJY29tcGF0aWJsZSA9ICJnZW5lcmljLXVoY2kiOworCQlyZWcgPSA8MHhkODAwN2IwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8NDM+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi14aGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0CmluZGV4IDU3NTJkZjAuLjkwZjhmNjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0CkBAIC0xLDE0ICsxLDE0IEBACiBVU0IgeEhDSSBjb250cm9sbGVycwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotICAtIGNvbXBhdGlibGU6IHNob3VsZCBiZSAieGhjaS1wbGF0Zm9ybSIuCisgIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJnZW5lcmljLXhoY2kiIChkZXByZWNhdGVkOiAieGhjaS1wbGF0Zm9ybSIpLgogICAtIHJlZzogc2hvdWxkIGNvbnRhaW4gYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBzdGFuZGFyZCBYSENJCiAgICAgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgogICAtIGludGVycnVwdHM6IG9uZSBYSENJIGludGVycnVwdCBzaG91bGQgYmUgZGVzY3JpYmVkIGhlcmUuCiAKIEV4YW1wbGU6CiAJdXNiQGYwOTMxMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJ4aGNpLXBsYXRmb3JtIjsKKwkJY29tcGF0aWJsZSA9ICJnZW5lcmljLXhoY2kiOwogCQlyZWcgPSA8MHhmMDkzMTAwMCAweDhjOD47CiAJCWludGVycnVwdHMgPSA8MHgwIDB4NGUgMHgwPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92aWEsdnQ4NTAwLWVoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92aWEsdnQ4NTAwLWVoY2kudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IzYWQxLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdmlhLHZ0ODUwMC1laGNpLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLVZJQS9Xb25kZXJtZWRpYSBWVDg1MDAgRUhDSSBDb250cm9sbGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlIDogInZpYSx2dDg1MDAtZWhjaSIKLS0gcmVnIDogU2hvdWxkIGNvbnRhaW4gMSByZWdpc3RlciByYW5nZXMoYWRkcmVzcyBhbmQgbGVuZ3RoKQotLSBpbnRlcnJ1cHRzIDogZWhjaSBjb250cm9sbGVyIGludGVycnVwdAotCi1FeGFtcGxlOgotCi0JZWhjaUBkODAwNzkwMCB7Ci0JCWNvbXBhdGlibGUgPSAidmlhLHZ0ODUwMC1laGNpIjsKLQkJcmVnID0gPDB4ZDgwMDc5MDAgMHgyMDA+OwotCQlpbnRlcnJ1cHRzID0gPDQzPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92dDg1MDAtZWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3Z0ODUwMC1laGNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiOGZkNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3Z0ODUwMC1laGNpLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVZJQSBWVDg1MDAgYW5kIFdvbmRlcm1lZGlhIFdNOHh4eCBTb0MgVVNCIGNvbnRyb2xsZXJzLgotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ2aWEsdnQ4NTAwLWVoY2kiIG9yICJ3bSxwcml6bS1laGNpIi4KLSAtIHJlZzogQWRkcmVzcyByYW5nZSBvZiB0aGUgZWhjaSByZWdpc3RlcnMuIHNpemUgc2hvdWxkIGJlIDB4MjAwCi0gLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiB0aGUgZWhjaSBpbnRlcnJ1cHQuCi0KLXVzYjogZWhjaUBEODAwNzEwMCB7Ci0JY29tcGF0aWJsZSA9ICJ3bSxwcml6bS1laGNpIiwgInVzYi1laGNpIjsKLQlyZWcgPSA8MHhEODAwNzEwMCAweDIwMD47Ci0JaW50ZXJydXB0cyA9IDwxPjsKLX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvb2YteGlsaW54LXdkdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvb2YteGlsaW54LXdkdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2Mzc4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9vZi14aWxpbngtd2R0LnR4dApAQCAtMCwwICsxLDIzIEBACitYaWxpbnggQVhJL1BMQiBzb2Z0LWNvcmUgd2F0Y2hkb2cgRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IFNob3VsZCBiZSAieGxueCx4cHMtdGltZWJhc2Utd2R0LTEuMDAuYSIgb3IKKwkJCSAgInhsbngseHBzLXRpbWViYXNlLXdkdC0xLjAxLmEiLgorLSByZWcJCQk6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBjbG9jay1mcmVxdWVuY3kJOiBGcmVxdWVuY3kgb2YgY2xvY2sgaW4gSHoKKy0geGxueCx3ZHQtZW5hYmxlLW9uY2UJOiAwIC0gV2F0Y2hkb2cgY2FuIGJlIHJlc3RhcnRlZAorCQkJICAxIC0gV2F0Y2hkb2cgY2FuIGJlIGVuYWJsZWQganVzdCBvbmNlCistIHhsbngsd2R0LWludGVydmFsCTogV2F0Y2hkb2cgdGltZW91dCBpbnRlcnZhbCBpbiAyXjx2YWw+IGNsb2NrIGN5Y2xlcywKKwkJCSAgPHZhbD4gaXMgaW50ZWdlciBmcm9tIDggdG8gMzEuCisKK0V4YW1wbGU6CitheGktdGltZWJhc2Utd2R0QDQwMTAwMDAwIHsKKwljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OworCWNvbXBhdGlibGUgPSAieGxueCx4cHMtdGltZWJhc2Utd2R0LTEuMDAuYSI7CisJcmVnID0gPDB4NDAxMDAwMDAgMHgxMDAwMD47CisJeGxueCx3ZHQtZW5hYmxlLW9uY2UgPSA8MHgwPjsKKwl4bG54LHdkdC1pbnRlcnZhbCA9IDwweDFiPjsKK30gOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3N1bnhpLXdkdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dAppbmRleCBlMzljYjI2Li5iOGY3NWM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dApAQCAtMiwxMyArMiwxMyBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImFsbHdpbm5lciw8c29jLWZhbWlseT4td2R0IiwgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAgU29DIGZhbWlsaWVzIGJlaW5nIHN1bjRpIGFuZCBzdW42aQorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlIGVpdGhlciAiYWxsd2lubmVyLHN1bjRpLWExMC13ZHQiIG9yCisgICAgICAgICAgICAgICAiYWxsd2lubmVyLHN1bjZpLWEzMS13ZHQiCiAtIHJlZyA6IFNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIHJlZ2lzdGVycy4KIAogRXhhbXBsZToKIAogd2R0OiB3YXRjaGRvZ0AwMWMyMGM5MCB7Ci0JY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktd2R0IjsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtd2R0IjsKIAlyZWcgPSA8MHgwMWMyMGM5MCAweDEwPjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZtYy9mbWMtd3JpdGUtZWVwcm9tLnR4dCBiL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0CmluZGV4IDQ0YTNiYzYuLmUwYTk3MTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0CkBAIC05LDcgKzksMTIgQEAKIGV4cGVjdGVkIHRvIG9ubHkgaGFwcGVuIGR1cmluZyBtYW51ZmFjdHVyaW5nLiBGb3IgdGhpcyByZWFzb24sIHRoZQogbW9kdWxlIG1ha2VzIGl0IHVubGlrZWx5IGZvciB0aGUgcmFuZG9tIHVzZXIgdG8gY2hhbmdlIGEgd29ya2luZyBFRVBST00uCiAKLVRoZSBtb2R1bGUgdGFrZXMgdGhlIGZvbGxvd2luZyBtZWFzdXJlczoKK0hvd2V2ZXIsIHNpbmNlIHRoZSBFRVBST00gbWF5IGluY2x1ZGUgYXBwbGljYXRpb24tc3BlY2lmaWMgaW5mb3JtYXRpb24KK290aGVyIHRoYW4gdGhlIGlkZW50aWZpY2F0aW9uLCBsYXRlciB2ZXJzaW9ucyBvZiB0aGlzIHBhY2thZ2VzIGFkZGVkCit3cml0ZS1zdXBwb3J0IHRocm91Z2ggc3lzZnMuIFNlZSAqbm90ZSBBY2Nlc3NpbmcgdGhlIEVFUFJPTTo6LgorCitUbyBhdm9pZCBkYW1hZ2luZyB0aGUgRUVQUk9NIGNvbnRlbnQsIHRoZSBtb2R1bGUgdGFrZXMgdGhlIGZvbGxvd2luZworbWVhc3VyZXM6CiAKICAgICogSXQgYWNjZXB0cyBhIGBmaWxlPScgYXJndW1lbnQgKHdpdGhpbiAvbGliL2Zpcm13YXJlKSBhbmQgaWYgbm8KICAgICAgc3VjaCBhcmd1bWVudCBpcyByZWNlaXZlZCwgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZyB0byBFRVBST00KQEAgLTcwLDU2ICs3NSwyNCBAQAogICAgICAgICBbICAxMzIuODk5ODcyXSAgZmFrZS1mbWM6IFByb2R1Y3QgbmFtZTogRm1jRGVsYXkxbnM0Y2hhCiAKIAotV3JpdGluZyB0byB0aGUgRUVQUk9NCitBY2Nlc3NpbmcgdGhlIEVFUFJPTQogPT09PT09PT09PT09PT09PT09PT09CiAKLU9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIGJpbmFyeSBmaWxlIGZvciB5b3VyIEVFUFJPTSwgeW91IGNhbiB3cml0ZSBpdAotdG8gdGhlIHN0b3JhZ2UgbWVkaXVtIHVzaW5nIHRoZSBmbWMtd3JpdGUtZWVwcm9tIChTZWUgKm5vdGUKLWZtYy13cml0ZS1lZXByb206Oiwgd2hpbGUgcmVseWluZyBvbiBhIGNhcnJpZXIgZHJpdmVyLiAgVGhlIHByb2NlZHVyZQotaGVyZSBzaG93biBoZXJlIHVzZXMgdGhlIFNQRUMgZHJpdmVyCi0oYGh0dHA6Ly93d3cub2h3ci5vcmcvcHJvamVjdHMvc3BlYy1zdycpLgorVGhlIGJ1cyBjcmVhdGVzIGEgc3lzZnMgYmluYXJ5IGZpbGUgY2FsbGVkIGVlcHJvbSBmb3IgZWFjaCBtZXp6YW5pbmUgaXQKK2tub3dzIGFib3V0OgogCi1UaGUgZXhhbXBsZSBhc3N1bWVzIG5vIGRyaXZlciBpcyBhbHJlYWR5IGxvYWRlZCAoYWN0dWFsbHksIEkgdW5sb2FkZWQKLXRoZW0gYnkgaGFuZCBhcyBldmVyeXRoaW5nIGxvYWRzIGF1dG9tYXRpY2FsbHkgYXQgYm9vdCB0aW1lIGFmdGVyIHlvdQotaW5zdGFsbGVkIHRoZSBtb2R1bGVzKSwgYW5kIHNob3dzIGtlcm5lbCBtZXNzYWdlcyB0b2dldGhlciB3aXRoCi1jb21tYW5kcy4gSGVyZSB0aGUgcHJvbXB0IGlzIHNwdXNhLnJvb3QjIGFuZCB0d28gU1BFQyBjYXJkcyBhcmUgcGx1Z2dlZAotaW4gdGhlIHN5c3RlbS4KKyAgICAgICAgc3B1c2Eucm9vdCMgY2QgL3N5cy9idXMvZm1jL2RldmljZXM7IGxzIC1sICovZWVwcm9tCisgICAgICAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBGZWIgMjEgMTI6MzAgRm1jQWRjMTAwbTE0YjRjaGEtMDgwMC9lZXByb20KKyAgICAgICAgLXItLXItLXItLSAxIHJvb3Qgcm9vdCA4MTkyIEZlYiAyMSAxMjozMCBGbWNEZWxheTFuczRjaGEtMDIwMC9lZXByb20KKyAgICAgICAgLXItLXItLXItLSAxIHJvb3Qgcm9vdCA4MTkyIEZlYiAyMSAxMjozMCBGbWNEaW81Y2hhLTA0MDAvZWVwcm9tCiAKLSAgICAgc3B1c2Eucm9vdCMgaW5zbW9kIGZtYy5rbwotICAgICBzcHVzYS5yb290IyBpbnNtb2Qgc3BlYy5rbwotICAgICBbMTM5NzIuMzgyODE4XSBzcGVjIDAwMDA6MDI6MDAuMDogIHByb2JlIGZvciBkZXZpY2UgMDAwMjowMDAwCi0gICAgIFsxMzk3Mi4zOTI3NzNdIHNwZWMgMDAwMDowMjowMC4wOiBnb3QgZmlsZSAiZm1jL3NwZWMtaW5pdC5iaW4iLCAxNDg0NDA0ICgweDE2YTY3NCkgYnl0ZXMKLSAgICAgWzEzOTcyLjU5MTM4OF0gc3BlYyAwMDAwOjAyOjAwLjA6IEZQR0EgcHJvZ3JhbW1pbmcgc3VjY2Vzc2Z1bAotICAgICBbMTM5NzIuODgzMDExXSBzcGVjIDAwMDA6MDI6MDAuMDogRUVQUk9NIGhhcyBubyBGUlUgaW5mb3JtYXRpb24KLSAgICAgWzEzOTcyLjg4ODcxOV0gc3BlYyAwMDAwOjAyOjAwLjA6IE5vIGRldmljZV9pZCBmaWxsZWQsIHVzaW5nIGluZGV4Ci0gICAgIFsxMzk3Mi44OTQ2NzZdIHNwZWMgMDAwMDowMjowMC4wOiBObyBtZXp6YW5pbmVfbmFtZSBmb3VuZAotICAgICBbMTM5NzIuODk5ODYzXSAvaG9tZS9ydWJpbmkvd2lwL3NwZWMtc3cva2VybmVsL3NwZWMtZ3Bpby5jIC0gc3BlY19ncGlvX2luaXQKLSAgICAgWzEzOTcyLjkwNjU3OF0gc3BlYyAwMDAwOjA0OjAwLjA6ICBwcm9iZSBmb3IgZGV2aWNlIDAwMDQ6MDAwMAotICAgICBbMTM5NzIuOTE2NTA5XSBzcGVjIDAwMDA6MDQ6MDAuMDogZ290IGZpbGUgImZtYy9zcGVjLWluaXQuYmluIiwgMTQ4NDQwNCAoMHgxNmE2NzQpIGJ5dGVzCi0gICAgIFsxMzk3My4xMTUwOTZdIHNwZWMgMDAwMDowNDowMC4wOiBGUEdBIHByb2dyYW1taW5nIHN1Y2Nlc3NmdWwKLSAgICAgWzEzOTczLjQwMTc5OF0gc3BlYyAwMDAwOjA0OjAwLjA6IEVFUFJPTSBoYXMgbm8gRlJVIGluZm9ybWF0aW9uCi0gICAgIFsxMzk3My40MDc0NzRdIHNwZWMgMDAwMDowNDowMC4wOiBObyBkZXZpY2VfaWQgZmlsbGVkLCB1c2luZyBpbmRleAotICAgICBbMTM5NzMuNDEzNDE3XSBzcGVjIDAwMDA6MDQ6MDAuMDogTm8gbWV6emFuaW5lX25hbWUgZm91bmQKLSAgICAgWzEzOTczLjQxODYwMF0gL2hvbWUvcnViaW5pL3dpcC9zcGVjLXN3L2tlcm5lbC9zcGVjLWdwaW8uYyAtIHNwZWNfZ3Bpb19pbml0Ci0gICAgIHNwdXNhLnJvb3QjIGxzIC9zeXMvYnVzL2ZtYy9kZXZpY2VzCi0gICAgIGZtYy0wMDAwICBmbWMtMDAwMQotICAgICBzcHVzYS5yb290IyBpbnNtb2QgZm1jLXdyaXRlLWVlcHJvbS5rbyBidXNpZD0weDAyMDAgZmlsZT1mZGVsYXktZWVwcm9tLmJpbgotICAgICBbMTQxMDMuOTY2MjU5XSBzcGVjIDAwMDA6MDI6MDAuMDogTWF0Y2hpbmcgYW4gZ2VuZXJpYyBkcml2ZXIgKG5vIElEKQotICAgICBbMTQxMDMuOTc1NTE5XSBzcGVjIDAwMDA6MDI6MDAuMDogcHJvZ3JhbW1pbmcgNjE1NSBieXRlcwotICAgICBbMTQxMjYuMzczNzYyXSBzcGVjIDAwMDA6MDI6MDAuMDogd3JpdGVfZWVwcm9tOiBzdWNjZXNzCi0gICAgIFsxNDEyNi4zNzg3NzBdIHNwZWMgMDAwMDowNDowMC4wOiBNYXRjaGluZyBhbiBnZW5lcmljIGRyaXZlciAobm8gSUQpCi0gICAgIFsxNDEyNi4zODQ5MDNdIHNwZWMgMDAwMDowNDowMC4wOiBmbWNfd3JpdGVfZWVwcm9tOiBubyBmaWxlbmFtZSBnaXZlbjogbm90IHByb2dyYW1taW5nCi0gICAgIFsxNDEyNi4zOTI2MDBdIGZtY193cml0ZV9lZXByb206IHByb2JlIG9mIGZtYy0wMDAxIGZhaWxlZCB3aXRoIGVycm9yIC0yCitFdmVyeWJvZHkgY2FuIHJlYWQgdGhlIGZpbGVzIGFuZCB0aGUgc3VwZXJ1c2VyIGNhbiBhbHNvIG1vZGlmeSBpdCwgYnV0Cit0aGUgb3BlcmF0aW9uIG1heSBvbiB0aGUgY2FycmllciBkcml2ZXIsIGlmIHRoZSBjYXJyaWVyIGlzIHVuYWJsZSB0bworYWNjZXNzIHRoZSBJMkMgYnVzLiAgRm9yIGV4YW1wbGUsIHRoZSBzcGVjIGRyaXZlciBjYW4gYWNjZXNzIHRoZSBidXMKK29ubHkgd2l0aCBpdHMgZ29sZGVuIGdhdGV3YXJlOiBhZnRlciBhIG1lenphbmluZSBkcml2ZXIgcmVwcm9ncmFtbWVkCit0aGUgRlBHQSB3aXRoIGEgY3VzdG9tIGNpcmN1aXQsIHRoZSBjYXJyaWVyIGlzIHVuYWJsZSB0byBhY2Nlc3MgdGhlCitFRVBST00gYW5kIHJldHVybnMgRU5PVFNVUFAuCiAKLVJlYWRpbmcgYmFjayB0aGUgRUVQUk9NCi09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbiBvcmRlciB0byByZWFkIGJhY2sgdGhlIGJpbmFyeSBjb250ZW50IG9mIHRoZSBFRVBST00gb2YgeW91cgotbWV6emFuaW5lIGRldmljZSwgdGhlIGJ1cyBjcmVhdGVzIGEgcmVhZC1vbmx5IHN5c2ZzIGZpbGUgY2FsbGVkIGVlcHJvbQotZm9yIGVhY2ggbWV6emFuaW5lIGl0IGtub3dzIGFib3V0OgotCi0gICBzcHVzYS5yb290IyBjZCAvc3lzL2J1cy9mbWMvZGV2aWNlczsgbHMgLWwgKi9lZXByb20KLSAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBBcHIgIDkgMTY6NTMgRm1jRGVsYXkxbnM0Y2hhLWYwMDEvZWVwcm9tCi0gICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgQXByICA5IDE3OjE5IGZha2UtZGVzaWduLWZvci10ZXN0aW5nLWYwMDIvZWVwcm9tCi0gICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgQXByICA5IDE3OjE5IGZha2UtZGVzaWduLWZvci10ZXN0aW5nLWYwMDMvZWVwcm9tCi0gICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgQXByICA5IDE3OjE5IGZtYy1mMDA0L2VlcHJvbQorQW4gYWx0ZXJuYXRpdmUgd2F5IHRvIHdyaXRlIHRoZSBFRVBST00gaXMgdGhlIG1lenphbmluZSBkcml2ZXIKK2ZtYy13cml0ZS1lZXByb20gKFNlZSAqbm90ZSBmbWMtd3JpdGUtZWVwcm9tOjopLCBidXQgdGhlIHByb2NlZHVyZSBpcworbW9yZSBjb21wbGV4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZGMxMjhkODE4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZGMxMjhkODE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Yzk1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkYzEyOGQ4MTgKQEAgLTAsMCArMSw0NyBAQAorS2VybmVsIGRyaXZlciBhZGMxMjhkODE4Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFRleGFzIEluc3RydW1lbnRzIEFEQzgxOEQ4MTgKKyAgICBQcmVmaXg6ICdhZGM4MThkODE4JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgxZCwgMHgxZSwgMHgxZiwgMHgyZCwgMHgyZSwgMHgyZgorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBUSSB3ZWJzaXRlCisgICAgICAgICAgICAgICBodHRwOi8vd3d3LnRpLmNvbS8KKworQXV0aG9yOiBHdWVudGVyIFJvZWNrCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBBREMxMjhEODE4LgorSXQgaXMgZGVzY3JpYmVkIGFzICdBREMgU3lzdGVtIE1vbml0b3Igd2l0aCBUZW1wZXJhdHVyZSBTZW5zb3InLgorCitUaGUgQURDMTI4RDgxOCBpbXBsZW1lbnRzIG9uZSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIHNldmVuIHZvbHRhZ2Ugc2Vuc29ycy4KKworVGVtcGVyYXR1cmVzIGFyZSBtZWFzdXJlZCBpbiBkZWdyZWVzIENlbHNpdXMuIFRoZXJlIGlzIG9uZSBzZXQgb2YgbGltaXRzLgorV2hlbiB0aGUgSE9UIFRlbXBlcmF0dXJlIExpbWl0IGlzIGNyb3NzZWQsIHRoaXMgd2lsbCBjYXVzZSBhbiBhbGFybSB0aGF0IHdpbGwKK2JlIHJlYXNzZXJ0ZWQgdW50aWwgdGhlIHRlbXBlcmF0dXJlIGRyb3BzIGJlbG93IHRoZSBIT1QgSHlzdGVyZXNpcy4KK01lYXN1cmVtZW50cyBhcmUgZ3VhcmFudGVlZCBiZXR3ZWVuIC01NSBhbmQgKzEyNSBkZWdyZWVzLiBUaGUgdGVtcGVyYXR1cmUKK21lYXN1cmVtZW50IGhhcyBhIHJlc29sdXRpb24gb2YgMC41IGRlZ3JlZXM7IHRoZSBsaW1pdHMgaGF2ZSBhIHJlc29sdXRpb24KK29mIDEgZGVncmVlLgorCitWb2x0YWdlIHNlbnNvcnMgKGFsc28ga25vd24gYXMgSU4gc2Vuc29ycykgcmVwb3J0IHRoZWlyIHZhbHVlcyBpbiB2b2x0cy4KK0FuIGFsYXJtIGlzIHRyaWdnZXJlZCBpZiB0aGUgdm9sdGFnZSBoYXMgY3Jvc3NlZCBhIHByb2dyYW1tYWJsZSBtaW5pbXVtCitvciBtYXhpbXVtIGxpbWl0LiBOb3RlIHRoYXQgbWluaW11bSBpbiB0aGlzIGNhc2UgYWx3YXlzIG1lYW5zICdjbG9zZXN0IHRvCit6ZXJvJzsgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIG5lZ2F0aXZlIHZvbHRhZ2UgbWVhc3VyZW1lbnRzLiBBbGwgdm9sdGFnZQoraW5wdXRzIGNhbiBtZWFzdXJlIHZvbHRhZ2VzIGJldHdlZW4gMCBhbmQgMi41NSB2b2x0cywgd2l0aCBhIHJlc29sdXRpb24KK29mIDAuNjI1IG1WLgorCitJZiBhbiBhbGFybSB0cmlnZ2VycywgaXQgd2lsbCByZW1haW4gdHJpZ2dlcmVkIHVudGlsIHRoZSBoYXJkd2FyZSByZWdpc3RlcgoraXMgcmVhZCBhdCBsZWFzdCBvbmNlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNhdXNlIGZvciB0aGUgYWxhcm0gbWF5CithbHJlYWR5IGhhdmUgZGlzYXBwZWFyZWQgYnkgdGhlIHRpbWUgdGhlIGFsYXJtIGlzIHJlYWQuIFRoZSBkcml2ZXIKK2NhY2hlcyB0aGUgYWxhcm0gc3RhdHVzIGZvciBlYWNoIHNlbnNvciB1bnRpbCBpdCBpcyBhdCBsZWFzdCByZXBvcnRlZAorb25jZSwgdG8gZW5zdXJlIHRoYXQgYWxhcm1zIGFyZSByZXBvcnRlZCB0byB1c2VyIHNwYWNlLgorCitUaGUgQURDMTI4RDgxOCBvbmx5IHVwZGF0ZXMgaXRzIHZhbHVlcyBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIHNlY29uZDsKK3JlYWRpbmcgaXQgbW9yZSBvZnRlbiB3aWxsIGRvIG5vIGhhcm0sIGJ1dCB3aWxsIHJldHVybiAnb2xkJyB2YWx1ZXMuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBzY2FubmVkIGFkZHJlc3MgbGlzdCwgdGhlIGNoaXAgY2FuIGFsc28gYmUgY29uZmlndXJlZCBmb3IKK2FkZHJlc3NlcyAweDM1IHRvIDB4MzcuIFRob3NlIGFkZHJlc3NlcyBhcmUgbm90IHNjYW5uZWQuIFlvdSBoYXZlIHRvIGluc3RhbnRpYXRlCit0aGUgZHJpdmVyIGV4cGxpY2l0bHkgaWYgdGhlIGNoaXAgaXMgY29uZmlndXJlZCBmb3IgYW55IG9mIHRob3NlIGFkZHJlc3NlcyBpbgoreW91ciBzeXN0ZW0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTUyNDUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTUyNDUKaW5kZXggY2JkOGFlYS4uNzdlYWYyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTk1MjQ1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05NTI0NQpAQCAtMjQsOCArMjQsMTIgQEAKIGdpdmVuIHdpdGhpbiBhIHJhbmdlIG9mIC0xMjcgdG8gKzI1NSBkZWdyZWVzLiBSZXNvbHV0aW9uIGRlcGVuZHMgb24KIHRlbXBlcmF0dXJlIGlucHV0IGFuZCByYW5nZS4KIAotRWFjaCBzZW5zb3IgaGFzIGl0cyBvd24gY3JpdGljYWwgbGltaXQsIGJ1dCB0aGUgaHlzdGVyZXNpcyBpcyBjb21tb24gdG8gYWxsCi10d28gY2hhbm5lbHMuCitFYWNoIHNlbnNvciBoYXMgaXRzIG93biBjcml0aWNhbCBsaW1pdC4gQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhIHJlbGF0aXZlCitoeXN0ZXJlc2lzIHZhbHVlIGNvbW1vbiB0byBib3RoIGNyaXRpY2FsIGxpbWl0cy4gVG8gbWFrZSBsaWZlIGVhc2llciB0bwordXNlci1zcGFjZSBhcHBsaWNhdGlvbnMsIHR3byBhYnNvbHV0ZSB2YWx1ZXMgYXJlIGV4cG9ydGVkLCBvbmUgZm9yIGVhY2gKK2NoYW5uZWwsIGJ1dCB0aGVzZSB2YWx1ZXMgYXJlIG9mIGNvdXJzZSBsaW5rZWQuIE9ubHkgdGhlIGxvY2FsIGh5c3RlcmVzaXMKK2NhbiBiZSBzZXQgZnJvbSB1c2VyLXNwYWNlLCBhbmQgdGhlIHNhbWUgZGVsdGEgYXBwbGllcyB0byB0aGUgcmVtb3RlCitoeXN0ZXJlc2lzLgogCiBUaGUgbG05NTI0NSBkcml2ZXIgY2FuIGNoYW5nZSBpdHMgdXBkYXRlIGludGVydmFsIHRvIGEgZml4ZWQgc2V0IG9mIHZhbHVlcy4KIEl0IHdpbGwgcm91bmQgdXAgdG8gdGhlIG5leHQgc2VsZWN0YWJsZSBpbnRlcnZhbC4gU2VlIHRoZSBkYXRhc2hlZXQgZm9yIGV4YWN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NDUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkMGY3ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk0NQpAQCAtMCwwICsxLDg0IEBACitLZXJuZWwgZHJpdmVyIGx0YzI5NDUKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogTGluZWFyIFRlY2hub2xvZ3kgTFRDMjk0NQorICAgIFByZWZpeDogJ2x0YzI5NDUnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KKyAgICBEYXRhc2hlZXQ6CisgICAgICAgIGh0dHA6Ly9jZHMubGluZWFyLmNvbS9kb2NzL2VuL2RhdGFzaGVldC8yOTQ1ZmEucGRmCisKK0F1dGhvcjogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgTFRDMjk0NSAgaXMgYSByYWlsLXRvLXJhaWwgc3lzdGVtIG1vbml0b3IgdGhhdCBtZWFzdXJlcyBjdXJyZW50LCB2b2x0YWdlLAorYW5kIHBvd2VyIGNvbnN1bXB0aW9uLgorCisKK1VzYWdlIE5vdGVzCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBkb2VzIG5vdCBwcm9iZSBmb3IgTFRDMjk0NSBkZXZpY2VzLCBzaW5jZSB0aGVyZSBpcyBubyByZWdpc3Rlcgord2hpY2ggY2FuIGJlIHNhZmVseSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjaGlwLiBZb3Ugd2lsbCBoYXZlIHRvIGluc3RhbnRpYXRlCit0aGUgZGV2aWNlcyBleHBsaWNpdGx5LgorCitFeGFtcGxlOiB0aGUgZm9sbG93aW5nIHdpbGwgbG9hZCB0aGUgZHJpdmVyIGZvciBhbiBMVEMyOTQ1IGF0IGFkZHJlc3MgMHgxMAorb24gSTJDIGJ1cyAjMToKKyQgbW9kcHJvYmUgbHRjMjk0NQorJCBlY2hvIGx0YzI5NDUgMHgxMCA+IC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0xL25ld19kZXZpY2UKKworCitTeXNmcyBlbnRyaWVzCistLS0tLS0tLS0tLS0tCisKK1ZvbHRhZ2UgcmVhZGluZ3MgcHJvdmlkZWQgYnkgdGhpcyBkcml2ZXIgYXJlIHJlcG9ydGVkIGFzIG9idGFpbmVkIGZyb20gdGhlIEFEQworcmVnaXN0ZXJzLiBJZiBhIHNldCBvZiB2b2x0YWdlIGRpdmlkZXIgcmVzaXN0b3JzIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZQorcmVhbCB2b2x0YWdlIGJ5IG11bHRpcGx5aW5nIHRoZSByZXBvcnRlZCB2YWx1ZSB3aXRoIChSMStSMikvUjIsIHdoZXJlIFIxIGlzIHRoZQordmFsdWUgb2YgdGhlIGRpdmlkZXIgcmVzaXN0b3IgYWdhaW5zdCB0aGUgbWVhc3VyZWQgdm9sdGFnZSBhbmQgUjIgaXMgdGhlIHZhbHVlCitvZiB0aGUgZGl2aWRlciByZXNpc3RvciBhZ2FpbnN0IEdyb3VuZC4KKworQ3VycmVudCByZWFkaW5nIHByb3ZpZGVkIGJ5IHRoaXMgZHJpdmVyIGlzIHJlcG9ydGVkIGFzIG9idGFpbmVkIGZyb20gdGhlIEFEQworQ3VycmVudCBTZW5zZSByZWdpc3Rlci4gVGhlIHJlcG9ydGVkIHZhbHVlIGFzc3VtZXMgdGhhdCBhIDEgbU9obSBzZW5zZSByZXNpc3RvcgoraXMgaW5zdGFsbGVkLiBJZiBhIGRpZmZlcmVudCBzZW5zZSByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgcmVhbAorY3VycmVudCBieSBkaXZpZGluZyB0aGUgcmVwb3J0ZWQgdmFsdWUgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlIGluIG1PaG0uCisKK2luMV9pbnB1dAkJVklOIHZvbHRhZ2UgKG1WKS4gVm9sdGFnZSBpcyBtZWFzdXJlZCBlaXRoZXIgYXQKKwkJCVNFTlNFKyBvciBWREQgcGluIGRlcGVuZGluZyBvbiBjaGlwIGNvbmZpZ3VyYXRpb24uCitpbjFfbWluCQkJVW5kZXJ2b2x0YWdlIHRocmVzaG9sZAoraW4xX21heAkJCU92ZXJ2b2x0YWdlIHRocmVzaG9sZAoraW4xX2xvd2VzdAkJTG93ZXN0IG1lYXN1cmVkIHZvbHRhZ2UKK2luMV9oaWdoZXN0CQlIaWdoZXN0IG1lYXN1cmVkIHZvbHRhZ2UKK2luMV9yZXNldF9oaXN0b3J5CVdyaXRlIDEgdG8gcmVzZXQgaW4xIGhpc3RvcnkKK2luMV9taW5fYWxhcm0JCVVuZGVydm9sdGFnZSBhbGFybQoraW4xX21heF9hbGFybQkJT3ZlcnZvbHRhZ2UgYWxhcm0KKworaW4yX2lucHV0CQlBRElOIHZvbHRhZ2UgKG1WKQoraW4yX21pbgkJCVVuZGVydm9sdGFnZSB0aHJlc2hvbGQKK2luMl9tYXgJCQlPdmVydm9sdGFnZSB0aHJlc2hvbGQKK2luMl9sb3dlc3QJCUxvd2VzdCBtZWFzdXJlZCB2b2x0YWdlCitpbjJfaGlnaGVzdAkJSGlnaGVzdCBtZWFzdXJlZCB2b2x0YWdlCitpbjJfcmVzZXRfaGlzdG9yeQlXcml0ZSAxIHRvIHJlc2V0IGluMiBoaXN0b3J5CitpbjJfbWluX2FsYXJtCQlVbmRlcnZvbHRhZ2UgYWxhcm0KK2luMl9tYXhfYWxhcm0JCU92ZXJ2b2x0YWdlIGFsYXJtCisKK2N1cnIxX2lucHV0CQlTRU5TRSBjdXJyZW50IChtQSkKK2N1cnIxX21pbgkJVW5kZXJjdXJyZW50IHRocmVzaG9sZAorY3VycjFfbWF4CQlPdmVyY3VycmVudCB0aHJlc2hvbGQKK2N1cnIxX2xvd2VzdAkJTG93ZXN0IG1lYXN1cmVkIGN1cnJlbnQKK2N1cnIxX2hpZ2hlc3QJCUhpZ2hlc3QgbWVhc3VyZWQgY3VycmVudAorY3VycjFfcmVzZXRfaGlzdG9yeQlXcml0ZSAxIHRvIHJlc2V0IGN1cnIxIGhpc3RvcnkKK2N1cnIxX21pbl9hbGFybQkJVW5kZXJjdXJyZW50IGFsYXJtCitjdXJyMV9tYXhfYWxhcm0JCU92ZXJjdXJyZW50IGFsYXJtCisKK3Bvd2VyMV9pbnB1dAkJUG93ZXIgKGluIHVXKS4gUG93ZXIgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBTRU5TRSsvVkRECisJCQl2b2x0YWdlIG9yIEFESU4gdm9sdGFnZSBkZXBlbmRpbmcgb24gY2hpcCBjb25maWd1cmF0aW9uLgorcG93ZXIxX21pbgkJTG93IGxvd2VyIHRocmVzaG9sZAorcG93ZXIxX21heAkJSGlnaCBwb3dlciB0aHJlc2hvbGQKK3Bvd2VyMV9pbnB1dF9sb3dlc3QJSGlzdG9yaWNhbCBtaW5pbXVtIHBvd2VyIHVzZQorcG93ZXIxX2lucHV0X2hpZ2hlc3QJSGlzdG9yaWNhbCBtYXhpbXVtIHBvd2VyIHVzZQorcG93ZXIxX3Jlc2V0X2hpc3RvcnkJV3JpdGUgMSB0byByZXNldCBwb3dlcjEgaGlzdG9yeQorcG93ZXIxX21pbl9hbGFybQlMb3cgcG93ZXIgYWxhcm0KK3Bvd2VyMV9tYXhfYWxhcm0JSGlnaCBwb3dlciBhbGFybQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGMyOTc4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGMyOTc4CmluZGV4IGEwNTQ2ZmMuLjY4NmMwNzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk3OAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NzgKQEAgLTIzLDYgKzIzLDEwIEBACiAgICAgUHJlZml4OiAnbHRjMzg4MycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQogICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5saW5lYXIuY29tL3Byb2R1Y3QvbHRjMzg4MworICAqIExpbmVhciBUZWNobm9sb2d5IExUTTQ2NzYKKyAgICBQcmVmaXg6ICdsdG00Njc2JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LmxpbmVhci5jb20vcHJvZHVjdC9sdG00Njc2CiAKIEF1dGhvcjogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgogCkBAIC0zMyw3ICszNyw4IEBACiBMVEMyOTc0IGlzIGEgcXVhZCBkaWdpdGFsIHBvd2VyIHN1cHBseSBtYW5hZ2VyLiBMVEMyOTc4IGlzIGFuIG9jdGFsIHBvd2VyIHN1cHBseQogbW9uaXRvci4gTFRDMjk3NyBpcyBhIHBpbiBjb21wYXRpYmxlIHJlcGxhY2VtZW50IGZvciBMVEMyOTc4LiBMVEMzODgwIGlzIGEgZHVhbAogb3V0cHV0IHBvbHktcGhhc2Ugc3RlcC1kb3duIERDL0RDIGNvbnRyb2xsZXIuIExUQzM4ODMgaXMgYSBzaW5nbGUgcGhhc2UKLXN0ZXAtZG93biBEQy9EQyBjb250cm9sbGVyLgorc3RlcC1kb3duIERDL0RDIGNvbnRyb2xsZXIuIExUTTQ2NzYgaXMgYSBkdWFsIDEzQSBvciBzaW5nbGUgMjZBIHVNb2R1bGUKK3JlZ3VsYXRvci4KIAogCiBVc2FnZSBOb3RlcwpAQCAtNzUsNyArODAsNyBAQAogCQkJTFRDMjk3NDogTj0yLTUKIAkJCUxUQzI5Nzc6IE49Mi05CiAJCQlMVEMyOTc4OiBOPTItOQotCQkJTFRDMzg4MDogTj0yLTMKKwkJCUxUQzM4ODAsIExUTTQ2NzY6IE49Mi0zCiAJCQlMVEMzODgzOiBOPTIKIGluW05dX2lucHV0CQlNZWFzdXJlZCBvdXRwdXQgdm9sdGFnZS4KIGluW05dX21pbgkJTWluaW11bSBvdXRwdXQgdm9sdGFnZS4KQEAgLTk1LDcgKzEwMCw3IEBACiAJCQlhbmQgdGVtcDUgcmVwb3J0cyB0aGUgY2hpcCB0ZW1wZXJhdHVyZS4KIAkJCU9uIExUQzI5NzcgYW5kIExUQzI5NzgsIG9ubHkgb25lIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50CiAJCQlpcyBzdXBwb3J0ZWQgYW5kIHJlcG9ydHMgdGhlIGNoaXAgdGVtcGVyYXR1cmUuCi0JCQlPbiBMVEMzODgwLCB0ZW1wMSBhbmQgdGVtcDIgcmVwb3J0IGV4dGVybmFsCisJCQlPbiBMVEMzODgwIGFuZCBMVE00Njc2LCB0ZW1wMSBhbmQgdGVtcDIgcmVwb3J0IGV4dGVybmFsCiAJCQl0ZW1wZXJhdHVyZXMsIGFuZCB0ZW1wMyByZXBvcnRzIHRoZSBjaGlwIHRlbXBlcmF0dXJlLgogCQkJT24gTFRDMzg4MywgdGVtcDEgcmVwb3J0cyBhbiBleHRlcm5hbCB0ZW1wZXJhdHVyZSwKIAkJCWFuZCB0ZW1wMiByZXBvcnRzIHRoZSBjaGlwIHRlbXBlcmF0dXJlLgpAQCAtMTIzLDExICsxMjgsMTEgQEAKIAkJCUxUQzI5NzQ6IE49MS00CiAJCQlMVEMyOTc3OiBOb3Qgc3VwcG9ydGVkCiAJCQlMVEMyOTc4OiBOb3Qgc3VwcG9ydGVkCi0JCQlMVEMzODgwOiBOPTEtMgorCQkJTFRDMzg4MCwgTFRNNDY3NjogTj0xLTIKIAkJCUxUQzM4ODM6IE49MgogcG93ZXJbTl1faW5wdXQJCU1lYXN1cmVkIG91dHB1dCBwb3dlci4KIAotY3VycjFfbGFiZWwJCSJpaW4iLiBMVEMzODgwIGFuZCBMVEMzODgzIG9ubHkuCitjdXJyMV9sYWJlbAkJImlpbiIuIExUQzM4ODAsIExUQzM4ODMsIGFuZCBMVE00Njc2IG9ubHkuCiBjdXJyMV9pbnB1dAkJTWVhc3VyZWQgaW5wdXQgY3VycmVudC4KIGN1cnIxX21heAkJTWF4aW11bSBpbnB1dCBjdXJyZW50LgogY3VycjFfbWF4X2FsYXJtCQlJbnB1dCBjdXJyZW50IGhpZ2ggYWxhcm0uCkBAIC0xMzgsNyArMTQzLDcgQEAKIAkJCUxUQzI5NzQ6IE49MS00CiAJCQlMVEMyOTc3OiBub3Qgc3VwcG9ydGVkCiAJCQlMVEMyOTc4OiBub3Qgc3VwcG9ydGVkCi0JCQlMVEMzODgwOiBOPTItMworCQkJTFRDMzg4MCwgTFRNNDY3NjogTj0yLTMKIAkJCUxUQzM4ODM6IE49MgogY3VycltOXV9pbnB1dAkJTWVhc3VyZWQgb3V0cHV0IGN1cnJlbnQuCiBjdXJyW05dX21heAkJTWF4aW11bSBvdXRwdXQgY3VycmVudC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDI2MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDI2MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZmNGFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjYwCkBAIC0wLDAgKzEsNTYgQEAKK0tlcm5lbCBkcml2ZXIgbHRjNDI2MAorPT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYwCisgICAgUHJlZml4OiAnbHRjNDI2MCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQorICAgIERhdGFzaGVldDoKKyAgICAgICAgaHR0cDovL2Nkcy5saW5lYXIuY29tL2RvY3MvZW4vZGF0YXNoZWV0LzQyNjBmYy5wZGYKKworQXV0aG9yOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBMVEM0MjYwIEhvdCBTd2FwIGNvbnRyb2xsZXIgYWxsb3dzIGEgYm9hcmQgdG8gYmUgc2FmZWx5IGluc2VydGVkCithbmQgcmVtb3ZlZCBmcm9tIGEgbGl2ZSBiYWNrcGxhbmUuCisKKworVXNhZ2UgTm90ZXMKKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGRvZXMgbm90IHByb2JlIGZvciBMVEM0MjYwIGRldmljZXMsIHNpbmNlIHRoZXJlIGlzIG5vIHJlZ2lzdGVyCit3aGljaCBjYW4gYmUgc2FmZWx5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNoaXAuIFlvdSB3aWxsIGhhdmUgdG8gaW5zdGFudGlhdGUKK3RoZSBkZXZpY2VzIGV4cGxpY2l0bHkuCisKK0V4YW1wbGU6IHRoZSBmb2xsb3dpbmcgd2lsbCBsb2FkIHRoZSBkcml2ZXIgZm9yIGFuIExUQzQyNjAgYXQgYWRkcmVzcyAweDEwCitvbiBJMkMgYnVzICMxOgorJCBtb2Rwcm9iZSBsdGM0MjYwCiskIGVjaG8gbHRjNDI2MCAweDEwID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTEvbmV3X2RldmljZQorCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworVm9sdGFnZSByZWFkaW5ncyBwcm92aWRlZCBieSB0aGlzIGRyaXZlciBhcmUgcmVwb3J0ZWQgYXMgb2J0YWluZWQgZnJvbSB0aGUgQURDCityZWdpc3RlcnMuIElmIGEgc2V0IG9mIHZvbHRhZ2UgZGl2aWRlciByZXNpc3RvcnMgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlCityZWFsIHZvbHRhZ2UgYnkgbXVsdGlwbHlpbmcgdGhlIHJlcG9ydGVkIHZhbHVlIHdpdGggKFIxK1IyKS9SMiwgd2hlcmUgUjEgaXMgdGhlCit2YWx1ZSBvZiB0aGUgZGl2aWRlciByZXNpc3RvciBhZ2FpbnN0IHRoZSBtZWFzdXJlZCB2b2x0YWdlIGFuZCBSMiBpcyB0aGUgdmFsdWUKK29mIHRoZSBkaXZpZGVyIHJlc2lzdG9yIGFnYWluc3QgR3JvdW5kLgorCitDdXJyZW50IHJlYWRpbmcgcHJvdmlkZWQgYnkgdGhpcyBkcml2ZXIgaXMgcmVwb3J0ZWQgYXMgb2J0YWluZWQgZnJvbSB0aGUgQURDCitDdXJyZW50IFNlbnNlIHJlZ2lzdGVyLiBUaGUgcmVwb3J0ZWQgdmFsdWUgYXNzdW1lcyB0aGF0IGEgMSBtT2htIHNlbnNlIHJlc2lzdG9yCitpcyBpbnN0YWxsZWQuIElmIGEgZGlmZmVyZW50IHNlbnNlIHJlc2lzdG9yIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZSByZWFsCitjdXJyZW50IGJ5IGRpdmlkaW5nIHRoZSByZXBvcnRlZCB2YWx1ZSBieSB0aGUgc2Vuc2UgcmVzaXN0b3IgdmFsdWUgaW4gbU9obS4KKworaW4xX2lucHV0CQlTT1VSQ0Ugdm9sdGFnZSAobVYpCitpbjFfbWluX2FsYXJtCQlVbmRlcnZvbHRhZ2UgYWxhcm0KK2luMV9tYXhfYWxhcm0JCU92ZXJ2b2x0YWdlIGFsYXJtCisKK2luMl9pbnB1dAkJQURJTiB2b2x0YWdlIChtVikKK2luMl9hbGFybQkJUG93ZXIgYmFkIGFsYXJtCisKK2N1cnIxX2lucHV0CQlTRU5TRSBjdXJyZW50IChtQSkKK2N1cnIxX2FsYXJtCQlTRU5TRSBvdmVyY3VycmVudCBhbGFybQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA5MWYwYmU4Li5iYzM0Nzg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMTAyNSw2ICsxMDI1LDEzIEBACiAJCQlwYXJhbWV0ZXIgd2lsbCBmb3JjZSBpYTY0X3NhbF9jYWNoZV9mbHVzaCB0byBjYWxsCiAJCQlpYTY0X3BhbF9jYWNoZV9mbHVzaCBpbnN0ZWFkIG9mIFNBTF9DQUNIRV9GTFVTSC4KIAorCWZvcmNlcGFlIFtYODYtMzJdCisJCQlGb3JjZWZ1bGx5IGVuYWJsZSBQaHlzaWNhbCBBZGRyZXNzIEV4dGVuc2lvbiAoUEFFKS4KKwkJCU1hbnkgUGVudGl1bSBNIHN5c3RlbXMgZGlzYWJsZSBQQUUgYnV0IG1heSBoYXZlIGEKKwkJCWZ1bmN0aW9uYWxseSB1c2FibGUgUEFFIGltcGxlbWVudGF0aW9uLgorCQkJV2FybmluZzogdXNlIG9mIHRoaXMgcGFyYW1ldGVyIHdpbGwgdGFpbnQgdGhlIGtlcm5lbAorCQkJYW5kIG1heSBjYXVzZSB1bmtub3duIHByb2JsZW1zLgorCiAJZnRyYWNlPVt0cmFjZXJdCiAJCQlbRlRSQUNFXSB3aWxsIHNldCBhbmQgc3RhcnQgdGhlIHNwZWNpZmllZCB0cmFjZXIKIAkJCWFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgZWFybHkKQEAgLTIwNjcsOCArMjA3NCw4IEBACiAJCQlJT0FQSUNzIHRoYXQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4KIAogCW5va2FzbHIJCVtYODZdCi0JCQlEaXNhYmxlIGtlcm5lbCBiYXNlIG9mZnNldCBBU0xSIChBZGRyZXNzIFNwYWNlCi0JCQlMYXlvdXQgUmFuZG9taXphdGlvbikgaWYgYnVpbHQgaW50byB0aGUga2VybmVsLgorCQkJRGlzYWJsZSBrZXJuZWwgYW5kIG1vZHVsZSBiYXNlIG9mZnNldCBBU0xSIChBZGRyZXNzCisJCQlTcGFjZSBMYXlvdXQgUmFuZG9taXphdGlvbikgaWYgYnVpbHQgaW50byB0aGUga2VybmVsLgogCiAJbm9hdXRvZ3JvdXAJRGlzYWJsZSBzY2hlZHVsZXIgYXV0b21hdGljIHRhc2sgZ3JvdXAgY3JlYXRpb24uCiAKQEAgLTM0MjMsMTQgKzM0MzAsMjQgQEAKIAkJCQkJb2YgQ09ORklHX0hJR0hQVEUuCiAKIAl2ZHNvPQkJW1g4NixTSF0KLQkJCXZkc289MjogZW5hYmxlIGNvbXBhdCBWRFNPIChkZWZhdWx0IHdpdGggQ09NUEFUX1ZEU08pCi0JCQl2ZHNvPTE6IGVuYWJsZSBWRFNPIChkZWZhdWx0KQorCQkJT24gWDg2XzMyLCB0aGlzIGlzIGFuIGFsaWFzIGZvciB2ZHNvMzI9LiAgT3RoZXJ3aXNlOgorCisJCQl2ZHNvPTE6IGVuYWJsZSBWRFNPICh0aGUgZGVmYXVsdCkKIAkJCXZkc289MDogZGlzYWJsZSBWRFNPIG1hcHBpbmcKIAotCXZkc28zMj0JCVtYODZdCi0JCQl2ZHNvMzI9MjogZW5hYmxlIGNvbXBhdCBWRFNPIChkZWZhdWx0IHdpdGggQ09NUEFUX1ZEU08pCi0JCQl2ZHNvMzI9MTogZW5hYmxlIDMyLWJpdCBWRFNPIChkZWZhdWx0KQotCQkJdmRzbzMyPTA6IGRpc2FibGUgMzItYml0IFZEU08gbWFwcGluZworCXZkc28zMj0JCVtYODZdIENvbnRyb2wgdGhlIDMyLWJpdCB2RFNPCisJCQl2ZHNvMzI9MTogZW5hYmxlIDMyLWJpdCBWRFNPCisJCQl2ZHNvMzI9MCBvciB2ZHNvMzI9MjogZGlzYWJsZSAzMi1iaXQgVkRTTworCisJCQlTZWUgdGhlIGhlbHAgdGV4dCBmb3IgQ09ORklHX0NPTVBBVF9WRFNPIGZvciBtb3JlCisJCQlkZXRhaWxzLiAgSWYgQ09ORklHX0NPTVBBVF9WRFNPIGlzIHNldCwgdGhlIGRlZmF1bHQgaXMKKwkJCXZkc28zMj0wOyBvdGhlcndpc2UsIHRoZSBkZWZhdWx0IGlzIHZkc28zMj0xLgorCisJCQlGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGtlcm5lbHMsIHZkc28zMj0yIGlzIGFuCisJCQlhbGlhcyBmb3IgdmRzbzMyPTAuCisKKwkJCVRyeSB2ZHNvMzI9MCBpZiB5b3UgZW5jb3VudGVyIGFuIGVycm9yIHRoYXQgc2F5czoKKwkJCWRsX21haW46IEFzc2VydGlvbiBgKHZvaWQgKikgcGgtPnBfdmFkZHIgPT0gX3J0bGRfbG9jYWwuX2RsX3N5c2luZm9fZHNvJyBmYWlsZWQhCiAKIAl2ZWN0b3I9CQlbSUEtNjQsU01QXQogCQkJdmVjdG9yPXBlcmNwdTogZW5hYmxlIHBlcmNwdSB2ZWN0b3IgZG9tYWluCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wZXItQ1BVLWt0aHJlYWRzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CmluZGV4IDgyNzEwNGYuLmYzY2QyOTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CkBAIC0xNjIsNyArMTYyLDE4IEBACiBUbyByZWR1Y2UgaXRzIE9TIGppdHRlciwgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6CiAxLglSdW4geW91ciB3b3JrbG9hZCBhdCBhIHJlYWwtdGltZSBwcmlvcml0eSwgd2hpY2ggd2lsbCBhbGxvdwogCXByZWVtcHRpbmcgdGhlIGt3b3JrZXIgZGFlbW9ucy4KLTIuCURvIGFueSBvZiB0aGUgZm9sbG93aW5nIG5lZWRlZCB0byBhdm9pZCBqaXR0ZXIgdGhhdCB5b3VyCisyLglBIGdpdmVuIHdvcmtxdWV1ZSBjYW4gYmUgbWFkZSB2aXNpYmxlIGluIHRoZSBzeXNmcyBmaWxlc3lzdGVtCisJYnkgcGFzc2luZyB0aGUgV1FfU1lTRlMgdG8gdGhhdCB3b3JrcXVldWUncyBhbGxvY193b3JrcXVldWUoKS4KKwlTdWNoIGEgd29ya3F1ZXVlIGNhbiBiZSBjb25maW5lZCB0byBhIGdpdmVuIHN1YnNldCBvZiB0aGUKKwlDUFVzIHVzaW5nIHRoZSAvc3lzL2RldmljZXMvdmlydHVhbC93b3JrcXVldWUvKi9jcHVtYXNrIHN5c2ZzCisJZmlsZXMuCVRoZSBzZXQgb2YgV1FfU1lTRlMgd29ya3F1ZXVlcyBjYW4gYmUgZGlzcGxheWVkIHVzaW5nCisJImxzIHN5cy9kZXZpY2VzL3ZpcnR1YWwvd29ya3F1ZXVlIi4gIFRoYXQgc2FpZCwgdGhlIHdvcmtxdWV1ZXMKKwltYWludGFpbmVyIHdvdWxkIGxpa2UgdG8gY2F1dGlvbiBwZW9wbGUgYWdhaW5zdCBpbmRpc2NyaW1pbmF0ZWx5CisJc3ByaW5rbGluZyBXUV9TWVNGUyBhY3Jvc3MgYWxsIHRoZSB3b3JrcXVldWVzLglUaGUgcmVhc29uIGZvcgorCWNhdXRpb24gaXMgdGhhdCBpdCBpcyBlYXN5IHRvIGFkZCBXUV9TWVNGUywgYnV0IGJlY2F1c2Ugc3lzZnMgaXMKKwlwYXJ0IG9mIHRoZSBmb3JtYWwgdXNlci9rZXJuZWwgQVBJLCBpdCBjYW4gYmUgbmVhcmx5IGltcG9zc2libGUKKwl0byByZW1vdmUgaXQsIGV2ZW4gaWYgaXRzIGFkZGl0aW9uIHdhcyBhIG1pc3Rha2UuCiszLglEbyBhbnkgb2YgdGhlIGZvbGxvd2luZyBuZWVkZWQgdG8gYXZvaWQgaml0dGVyIHRoYXQgeW91cgogCWFwcGxpY2F0aW9uIGNhbm5vdCB0b2xlcmF0ZToKIAlhLglCdWlsZCB5b3VyIGtlcm5lbCB3aXRoIENPTkZJR19TTFVCPXkgcmF0aGVyIHRoYW4KIAkJQ09ORklHX1NMQUI9eSwgdGh1cyBhdm9pZGluZyB0aGUgc2xhYiBhbGxvY2F0b3IncyBwZXJpb2RpYwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CmluZGV4IDEwMmRjMTkuLjExYzFkMjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKQEAgLTYwOCwyNiArNjA4LDMwIEBACiAJYiA9IHA7ICAvKiBCVUc6IENvbXBpbGVyIGNhbiByZW9yZGVyISEhICovCiAJZG9fc29tZXRoaW5nKCk7CiAKLVRoZSBzb2x1dGlvbiBpcyBhZ2FpbiBBQ0NFU1NfT05DRSgpLCB3aGljaCBwcmVzZXJ2ZXMgdGhlIG9yZGVyaW5nIGJldHdlZW4KLXRoZSBsb2FkIGZyb20gdmFyaWFibGUgJ2EnIGFuZCB0aGUgc3RvcmUgdG8gdmFyaWFibGUgJ2InOgorVGhlIHNvbHV0aW9uIGlzIGFnYWluIEFDQ0VTU19PTkNFKCkgYW5kIGJhcnJpZXIoKSwgd2hpY2ggcHJlc2VydmVzIHRoZQorb3JkZXJpbmcgYmV0d2VlbiB0aGUgbG9hZCBmcm9tIHZhcmlhYmxlICdhJyBhbmQgdGhlIHN0b3JlIHRvIHZhcmlhYmxlICdiJzoKIAogCXEgPSBBQ0NFU1NfT05DRShhKTsKIAlpZiAocSkgeworCQliYXJyaWVyKCk7CiAJCUFDQ0VTU19PTkNFKGIpID0gcDsKIAkJZG9fc29tZXRoaW5nKCk7CiAJfSBlbHNlIHsKKwkJYmFycmllcigpOwogCQlBQ0NFU1NfT05DRShiKSA9IHA7CiAJCWRvX3NvbWV0aGluZ19lbHNlKCk7CiAJfQogCi1Zb3UgY291bGQgYWxzbyB1c2UgYmFycmllcigpIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gbW92aW5nCi10aGUgc3RvcmVzIHRvIHZhcmlhYmxlICdiJywgYnV0IGJhcnJpZXIoKSB3b3VsZCBub3QgcHJldmVudCB0aGUKLWNvbXBpbGVyIGZyb20gcHJvdmluZyB0byBpdHNlbGYgdGhhdCBhPT0xIGFsd2F5cywgc28gQUNDRVNTX09OQ0UoKQotaXMgYWxzbyBuZWVkZWQuCitUaGUgaW5pdGlhbCBBQ0NFU1NfT05DRSgpIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20KK3Byb3ZpbmcgdGhlIHZhbHVlIG9mICdhJywgYW5kIHRoZSBwYWlyIG9mIGJhcnJpZXIoKSBpbnZvY2F0aW9ucyBhcmUKK3JlcXVpcmVkIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gcHVsbGluZyB0aGUgdHdvIGlkZW50aWNhbCBzdG9yZXMKK3RvICdiJyBvdXQgZnJvbSB0aGUgbGVncyBvZiB0aGUgImlmIiBzdGF0ZW1lbnQuCiAKIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgY29udHJvbCBkZXBlbmRlbmNpZXMgYWJzb2x1dGVseSByZXF1aXJlIGEKIGEgY29uZGl0aW9uYWwuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyAib3B0aW1pemVkIiB2ZXJzaW9uIG9mCi10aGUgYWJvdmUgZXhhbXBsZSBicmVha3Mgb3JkZXJpbmc6Cit0aGUgYWJvdmUgZXhhbXBsZSBicmVha3Mgb3JkZXJpbmcsIHdoaWNoIGlzIHdoeSB0aGUgYmFycmllcigpIGludm9jYXRpb25zCithcmUgYWJzb2x1dGVseSByZXF1aXJlZCBpZiB5b3UgaGF2ZSBpZGVudGljYWwgc3RvcmVzIGluIGJvdGggbGVncyBvZgordGhlICJpZiIgc3RhdGVtZW50OgogCiAJcSA9IEFDQ0VTU19PTkNFKGEpOwogCUFDQ0VTU19PTkNFKGIpID0gcDsgIC8qIEJVRzogTm8gb3JkZXJpbmcgdnMuIGxvYWQgZnJvbSBhISEhICovCkBAIC02NDMsOSArNjQ3LDExIEBACiBmb3IgZXhhbXBsZSwgYXMgZm9sbG93czoKIAogCWlmIChBQ0NFU1NfT05DRShhKSA+IDApIHsKKwkJYmFycmllcigpOwogCQlBQ0NFU1NfT05DRShiKSA9IHEgLyAyOwogCQlkb19zb21ldGhpbmcoKTsKIAl9IGVsc2UgeworCQliYXJyaWVyKCk7CiAJCUFDQ0VTU19PTkNFKGIpID0gcSAvIDM7CiAJCWRvX3NvbWV0aGluZ19lbHNlKCk7CiAJfQpAQCAtNjU5LDkgKzY2NSwxMSBAQAogCiAJcSA9IEFDQ0VTU19PTkNFKGEpOwogCWlmIChxICUgTUFYKSB7CisJCWJhcnJpZXIoKTsKIAkJQUNDRVNTX09OQ0UoYikgPSBwOwogCQlkb19zb21ldGhpbmcoKTsKIAl9IGVsc2UgeworCQliYXJyaWVyKCk7CiAJCUFDQ0VTU19PTkNFKGIpID0gcDsKIAkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKIAl9CkBAIC03MjMsOCArNzMxLDEzIEBACiAgICAgICB1c2Ugc21iX3JtYigpLCBzbXBfd21iKCksIG9yLCBpbiB0aGUgY2FzZSBvZiBwcmlvciBzdG9yZXMgYW5kCiAgICAgICBsYXRlciBsb2Fkcywgc21wX21iKCkuCiAKKyAgKCopIElmIGJvdGggbGVncyBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgYmVnaW4gd2l0aCBpZGVudGljYWwgc3RvcmVzCisgICAgICB0byB0aGUgc2FtZSB2YXJpYWJsZSwgYSBiYXJyaWVyKCkgc3RhdGVtZW50IGlzIHJlcXVpcmVkIGF0IHRoZQorICAgICAgYmVnaW5uaW5nIG9mIGVhY2ggbGVnIG9mIHRoZSAiaWYiIHN0YXRlbWVudC4KKwogICAoKikgQ29udHJvbCBkZXBlbmRlbmNpZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcnVuLXRpbWUgY29uZGl0aW9uYWwKLSAgICAgIGJldHdlZW4gdGhlIHByaW9yIGxvYWQgYW5kIHRoZSBzdWJzZXF1ZW50IHN0b3JlLiAgSWYgdGhlIGNvbXBpbGVyCisgICAgICBiZXR3ZWVuIHRoZSBwcmlvciBsb2FkIGFuZCB0aGUgc3Vic2VxdWVudCBzdG9yZSwgYW5kIHRoaXMKKyAgICAgIGNvbmRpdGlvbmFsIG11c3QgaW52b2x2ZSB0aGUgcHJpb3IgbG9hZC4gIElmIHRoZSBjb21waWxlcgogICAgICAgaXMgYWJsZSB0byBvcHRpbWl6ZSB0aGUgY29uZGl0aW9uYWwgYXdheSwgaXQgd2lsbCBoYXZlIGFsc28KICAgICAgIG9wdGltaXplZCBhd2F5IHRoZSBvcmRlcmluZy4gIENhcmVmdWwgdXNlIG9mIEFDQ0VTU19PTkNFKCkgY2FuCiAgICAgICBoZWxwIHRvIHByZXNlcnZlIHRoZSBuZWVkZWQgY29uZGl0aW9uYWwuCkBAIC0xMjQ5LDYgKzEyNjIsMjMgQEAKIHdoaWxlIHBlcmZlY3RseSBzYWZlIGluIHNpbmdsZS10aHJlYWRlZCBjb2RlLCBjYW4gYmUgZmF0YWwgaW4gY29uY3VycmVudAogY29kZS4gIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdGhlc2Ugc29ydHMgb2Ygb3B0aW1pemF0aW9uczoKIAorICgqKSBUaGUgY29tcGlsZXIgaXMgd2l0aGluIGl0cyByaWdodHMgdG8gcmVvcmRlciBsb2FkcyBhbmQgc3RvcmVzCisgICAgIHRvIHRoZSBzYW1lIHZhcmlhYmxlLCBhbmQgaW4gc29tZSBjYXNlcywgdGhlIENQVSBpcyB3aXRoaW4gaXRzCisgICAgIHJpZ2h0cyB0byByZW9yZGVyIGxvYWRzIHRvIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhpcyBtZWFucyB0aGF0CisgICAgIHRoZSBmb2xsb3dpbmcgY29kZToKKworCWFbMF0gPSB4OworCWFbMV0gPSB4OworCisgICAgIE1pZ2h0IHJlc3VsdCBpbiBhbiBvbGRlciB2YWx1ZSBvZiB4IHN0b3JlZCBpbiBhWzFdIHRoYW4gaW4gYVswXS4KKyAgICAgUHJldmVudCBib3RoIHRoZSBjb21waWxlciBhbmQgdGhlIENQVSBmcm9tIGRvaW5nIHRoaXMgYXMgZm9sbG93czoKKworCWFbMF0gPSBBQ0NFU1NfT05DRSh4KTsKKwlhWzFdID0gQUNDRVNTX09OQ0UoeCk7CisKKyAgICAgSW4gc2hvcnQsIEFDQ0VTU19PTkNFKCkgcHJvdmlkZXMgY2FjaGUgY29oZXJlbmNlIGZvciBhY2Nlc3NlcyBmcm9tCisgICAgIG11bHRpcGxlIENQVXMgdG8gYSBzaW5nbGUgdmFyaWFibGUuCisKICAoKikgVGhlIGNvbXBpbGVyIGlzIHdpdGhpbiBpdHMgcmlnaHRzIHRvIG1lcmdlIHN1Y2Nlc3NpdmUgbG9hZHMgZnJvbQogICAgICB0aGUgc2FtZSB2YXJpYWJsZS4gIFN1Y2ggbWVyZ2luZyBjYW4gY2F1c2UgdGhlIGNvbXBpbGVyIHRvICJvcHRpbWl6ZSIKICAgICAgdGhlIGZvbGxvd2luZyBjb2RlOgpAQCAtMTY0NCwxMiArMTY3NCwxMiBAQAogICAgICBNZW1vcnkgb3BlcmF0aW9ucyBpc3N1ZWQgYWZ0ZXIgdGhlIEFDUVVJUkUgd2lsbCBiZSBjb21wbGV0ZWQgYWZ0ZXIgdGhlCiAgICAgIEFDUVVJUkUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAKLSAgICAgTWVtb3J5IG9wZXJhdGlvbnMgaXNzdWVkIGJlZm9yZSB0aGUgQUNRVUlSRSBtYXkgYmUgY29tcGxldGVkIGFmdGVyIHRoZQotICAgICBBQ1FVSVJFIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiAgQW4gc21wX21iX19iZWZvcmVfc3BpbmxvY2soKSwgY29tYmluZWQKLSAgICAgd2l0aCBhIGZvbGxvd2luZyBBQ1FVSVJFLCBvcmRlcnMgcHJpb3IgbG9hZHMgYWdhaW5zdCBzdWJzZXF1ZW50IHN0b3JlcyBhbmQKLSAgICAgc3RvcmVzIGFuZCBwcmlvciBzdG9yZXMgYWdhaW5zdCBzdWJzZXF1ZW50IHN0b3Jlcy4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICAgIHdlYWtlciB0aGFuIHNtcF9tYigpISAgVGhlIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCkgcHJpbWl0aXZlIGlzIGZyZWUgb24KLSAgICAgbWFueSBhcmNoaXRlY3R1cmVzLgorICAgICBNZW1vcnkgb3BlcmF0aW9ucyBpc3N1ZWQgYmVmb3JlIHRoZSBBQ1FVSVJFIG1heSBiZSBjb21wbGV0ZWQgYWZ0ZXIKKyAgICAgdGhlIEFDUVVJUkUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBBbiBzbXBfbWJfX2JlZm9yZV9zcGlubG9jaygpLAorICAgICBjb21iaW5lZCB3aXRoIGEgZm9sbG93aW5nIEFDUVVJUkUsIG9yZGVycyBwcmlvciBsb2FkcyBhZ2FpbnN0CisgICAgIHN1YnNlcXVlbnQgbG9hZHMgYW5kIHN0b3JlcyBhbmQgYWxzbyBvcmRlcnMgcHJpb3Igc3RvcmVzIGFnYWluc3QKKyAgICAgc3Vic2VxdWVudCBzdG9yZXMuICBOb3RlIHRoYXQgdGhpcyBpcyB3ZWFrZXIgdGhhbiBzbXBfbWIoKSEgIFRoZQorICAgICBzbXBfbWJfX2JlZm9yZV9zcGlubG9jaygpIHByaW1pdGl2ZSBpcyBmcmVlIG9uIG1hbnkgYXJjaGl0ZWN0dXJlcy4KIAogICgyKSBSRUxFQVNFIG9wZXJhdGlvbiBpbXBsaWNhdGlvbjoKIApAQCAtMTY5NCwyNCArMTcyNCwyMSBAQAogCiAJQUNRVUlSRSBNLCBTVE9SRSAqQiwgU1RPUkUgKkEsIFJFTEVBU0UgTQogCi1UaGlzIHNhbWUgcmVvcmRlcmluZyBjYW4gb2YgY291cnNlIG9jY3VyIGlmIHRoZSBsb2NrJ3MgQUNRVUlSRSBhbmQgUkVMRUFTRSBhcmUKLXRvIHRoZSBzYW1lIGxvY2sgdmFyaWFibGUsIGJ1dCBvbmx5IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGFub3RoZXIgQ1BVIG5vdAotaG9sZGluZyB0aGF0IGxvY2suCitXaGVuIHRoZSBBQ1FVSVJFIGFuZCBSRUxFQVNFIGFyZSBhIGxvY2sgYWNxdWlzaXRpb24gYW5kIHJlbGVhc2UsCityZXNwZWN0aXZlbHksIHRoaXMgc2FtZSByZW9yZGVyaW5nIGNhbiBvY2N1ciBpZiB0aGUgbG9jaydzIEFDUVVJUkUgYW5kCitSRUxFQVNFIGFyZSB0byB0aGUgc2FtZSBsb2NrIHZhcmlhYmxlLCBidXQgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZgorYW5vdGhlciBDUFUgbm90IGhvbGRpbmcgdGhhdCBsb2NrLiAgSW4gc2hvcnQsIGEgQUNRVUlSRSBmb2xsb3dlZCBieSBhbgorUkVMRUFTRSBtYXkgLW5vdC0gYmUgYXNzdW1lZCB0byBiZSBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIuCiAKLUluIHNob3J0LCBhIFJFTEVBU0UgZm9sbG93ZWQgYnkgYW4gQUNRVUlSRSBtYXkgLW5vdC0gYmUgYXNzdW1lZCB0byBiZSBhIGZ1bGwKLW1lbW9yeSBiYXJyaWVyIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgZm9yIGEgcHJlY2VkaW5nIFJFTEVBU0UgdG8gcGFzcyBhCi1sYXRlciBBQ1FVSVJFIGZyb20gdGhlIHZpZXdwb2ludCBvZiB0aGUgQ1BVLCBidXQgbm90IGZyb20gdGhlIHZpZXdwb2ludAotb2YgdGhlIGNvbXBpbGVyLiAgTm90ZSB0aGF0IGRlYWRsb2NrcyBjYW5ub3QgYmUgaW50cm9kdWNlZCBieSB0aGlzCi1pbnRlcmNoYW5nZSBiZWNhdXNlIGlmIHN1Y2ggYSBkZWFkbG9jayB0aHJlYXRlbmVkLCB0aGUgUkVMRUFTRSB3b3VsZAotc2ltcGx5IGNvbXBsZXRlLgotCi1JZiBpdCBpcyBuZWNlc3NhcnkgZm9yIGEgUkVMRUFTRS1BQ1FVSVJFIHBhaXIgdG8gcHJvZHVjZSBhIGZ1bGwgYmFycmllciwgdGhlCi1BQ1FVSVJFIGNhbiBiZSBmb2xsb3dlZCBieSBhbiBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCkgaW52b2NhdGlvbi4gIFRoaXMKLXdpbGwgcHJvZHVjZSBhIGZ1bGwgYmFycmllciBpZiBlaXRoZXIgKGEpIHRoZSBSRUxFQVNFIGFuZCB0aGUgQUNRVUlSRSBhcmUKLWV4ZWN1dGVkIGJ5IHRoZSBzYW1lIENQVSBvciB0YXNrLCBvciAoYikgdGhlIFJFTEVBU0UgYW5kIEFDUVVJUkUgYWN0IG9uIHRoZQotc2FtZSB2YXJpYWJsZS4gIFRoZSBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCkgcHJpbWl0aXZlIGlzIGZyZWUgb24gbWFueQotYXJjaGl0ZWN0dXJlcy4gIFdpdGhvdXQgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpLCB0aGUgY3JpdGljYWwgc2VjdGlvbnMKLWNvcnJlc3BvbmRpbmcgdG8gdGhlIFJFTEVBU0UgYW5kIHRoZSBBQ1FVSVJFIGNhbiBjcm9zczoKK1NpbWlsYXJseSwgdGhlIHJldmVyc2UgY2FzZSBvZiBhIFJFTEVBU0UgZm9sbG93ZWQgYnkgYW4gQUNRVUlSRSBkb2VzIG5vdAoraW1wbHkgYSBmdWxsIG1lbW9yeSBiYXJyaWVyLiAgSWYgaXQgaXMgbmVjZXNzYXJ5IGZvciBhIFJFTEVBU0UtQUNRVUlSRQorcGFpciB0byBwcm9kdWNlIGEgZnVsbCBiYXJyaWVyLCB0aGUgQUNRVUlSRSBjYW4gYmUgZm9sbG93ZWQgYnkgYW4KK3NtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKSBpbnZvY2F0aW9uLiAgVGhpcyB3aWxsIHByb2R1Y2UgYSBmdWxsIGJhcnJpZXIKK2lmIGVpdGhlciAoYSkgdGhlIFJFTEVBU0UgYW5kIHRoZSBBQ1FVSVJFIGFyZSBleGVjdXRlZCBieSB0aGUgc2FtZQorQ1BVIG9yIHRhc2ssIG9yIChiKSB0aGUgUkVMRUFTRSBhbmQgQUNRVUlSRSBhY3Qgb24gdGhlIHNhbWUgdmFyaWFibGUuCitUaGUgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpIHByaW1pdGl2ZSBpcyBmcmVlIG9uIG1hbnkgYXJjaGl0ZWN0dXJlcy4KK1dpdGhvdXQgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpLCB0aGUgQ1BVJ3MgZXhlY3V0aW9uIG9mIHRoZSBjcml0aWNhbAorc2VjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgUkVMRUFTRSBhbmQgdGhlIEFDUVVJUkUgY2FuIGNyb3NzLCBzbyB0aGF0OgogCiAJKkEgPSBhOwogCVJFTEVBU0UgTQpAQCAtMTcyMiw3ICsxNzQ5LDM2IEBACiAKIAlBQ1FVSVJFIE4sIFNUT1JFICpCLCBTVE9SRSAqQSwgUkVMRUFTRSBNCiAKLVdpdGggc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpLCB0aGV5IGNhbm5vdCwgc28gdGhhdDoKK0l0IG1pZ2h0IGFwcGVhciB0aGF0IHRoaXMgcmVvcmRlcmluZyBjb3VsZCBpbnRyb2R1Y2UgYSBkZWFkbG9jay4KK0hvd2V2ZXIsIHRoaXMgY2Fubm90IGhhcHBlbiBiZWNhdXNlIGlmIHN1Y2ggYSBkZWFkbG9jayB0aHJlYXRlbmVkLAordGhlIFJFTEVBU0Ugd291bGQgc2ltcGx5IGNvbXBsZXRlLCB0aGVyZWJ5IGF2b2lkaW5nIHRoZSBkZWFkbG9jay4KKworCVdoeSBkb2VzIHRoaXMgd29yaz8KKworCU9uZSBrZXkgcG9pbnQgaXMgdGhhdCB3ZSBhcmUgb25seSB0YWxraW5nIGFib3V0IHRoZSBDUFUgZG9pbmcKKwl0aGUgcmVvcmRlcmluZywgbm90IHRoZSBjb21waWxlci4gIElmIHRoZSBjb21waWxlciAob3IsIGZvcgorCXRoYXQgbWF0dGVyLCB0aGUgZGV2ZWxvcGVyKSBzd2l0Y2hlZCB0aGUgb3BlcmF0aW9ucywgZGVhZGxvY2sKKwktY291bGQtIG9jY3VyLgorCisJQnV0IHN1cHBvc2UgdGhlIENQVSByZW9yZGVyZWQgdGhlIG9wZXJhdGlvbnMuICBJbiB0aGlzIGNhc2UsCisJdGhlIHVubG9jayBwcmVjZWRlcyB0aGUgbG9jayBpbiB0aGUgYXNzZW1ibHkgY29kZS4gIFRoZSBDUFUKKwlzaW1wbHkgZWxlY3RlZCB0byB0cnkgZXhlY3V0aW5nIHRoZSBsYXRlciBsb2NrIG9wZXJhdGlvbiBmaXJzdC4KKwlJZiB0aGVyZSBpcyBhIGRlYWRsb2NrLCB0aGlzIGxvY2sgb3BlcmF0aW9uIHdpbGwgc2ltcGx5IHNwaW4gKG9yCisJdHJ5IHRvIHNsZWVwLCBidXQgbW9yZSBvbiB0aGF0IGxhdGVyKS4JVGhlIENQVSB3aWxsIGV2ZW50dWFsbHkKKwlleGVjdXRlIHRoZSB1bmxvY2sgb3BlcmF0aW9uICh3aGljaCBwcmVjZWRlZCB0aGUgbG9jayBvcGVyYXRpb24KKwlpbiB0aGUgYXNzZW1ibHkgY29kZSksIHdoaWNoIHdpbGwgdW5yYXZlbCB0aGUgcG90ZW50aWFsIGRlYWRsb2NrLAorCWFsbG93aW5nIHRoZSBsb2NrIG9wZXJhdGlvbiB0byBzdWNjZWVkLgorCisJQnV0IHdoYXQgaWYgdGhlIGxvY2sgaXMgYSBzbGVlcGxvY2s/ICBJbiB0aGF0IGNhc2UsIHRoZSBjb2RlIHdpbGwKKwl0cnkgdG8gZW50ZXIgdGhlIHNjaGVkdWxlciwgd2hlcmUgaXQgd2lsbCBldmVudHVhbGx5IGVuY291bnRlcgorCWEgbWVtb3J5IGJhcnJpZXIsIHdoaWNoIHdpbGwgZm9yY2UgdGhlIGVhcmxpZXIgdW5sb2NrIG9wZXJhdGlvbgorCXRvIGNvbXBsZXRlLCBhZ2FpbiB1bnJhdmVsaW5nIHRoZSBkZWFkbG9jay4gIFRoZXJlIG1pZ2h0IGJlCisJYSBzbGVlcC11bmxvY2sgcmFjZSwgYnV0IHRoZSBsb2NraW5nIHByaW1pdGl2ZSBuZWVkcyB0byByZXNvbHZlCisJc3VjaCByYWNlcyBwcm9wZXJseSBpbiBhbnkgY2FzZS4KKworV2l0aCBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCksIHRoZSB0d28gY3JpdGljYWwgc2VjdGlvbnMgY2Fubm90IG92ZXJsYXAuCitGb3IgZXhhbXBsZSwgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGUsIHRoZSBzdG9yZSB0byAqQSB3aWxsIGFsd2F5cyBiZQorc2VlbiBieSBvdGhlciBDUFVzIGJlZm9yZSB0aGUgc3RvcmUgdG8gKkI6CiAKIAkqQSA9IGE7CiAJUkVMRUFTRSBNCkBAIC0xNzMwLDEzICsxNzg2LDE4IEBACiAJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOwogCSpCID0gYjsKIAotd2lsbCBhbHdheXMgb2NjdXIgYXMgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmc6CitUaGUgb3BlcmF0aW9ucyB3aWxsIGFsd2F5cyBvY2N1ciBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcmRlcnM6CiAKLQlTVE9SRSAqQSwgUkVMRUFTRSwgQUNRVUlSRSwgU1RPUkUgKkIKLQlTVE9SRSAqQSwgQUNRVUlSRSwgUkVMRUFTRSwgU1RPUkUgKkIKKwlTVE9SRSAqQSwgUkVMRUFTRSwgQUNRVUlSRSwgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpLCBTVE9SRSAqQgorCVNUT1JFICpBLCBBQ1FVSVJFLCBSRUxFQVNFLCBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCksIFNUT1JFICpCCisJQUNRVUlSRSwgU1RPUkUgKkEsIFJFTEVBU0UsIHNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKSwgU1RPUkUgKkIKIAogSWYgdGhlIFJFTEVBU0UgYW5kIEFDUVVJUkUgd2VyZSBpbnN0ZWFkIGJvdGggb3BlcmF0aW5nIG9uIHRoZSBzYW1lIGxvY2sKLXZhcmlhYmxlLCBvbmx5IHRoZSBmaXJzdCBvZiB0aGVzZSB0d28gYWx0ZXJuYXRpdmVzIGNhbiBvY2N1ci4KK3ZhcmlhYmxlLCBvbmx5IHRoZSBmaXJzdCBvZiB0aGVzZSBhbHRlcm5hdGl2ZXMgY2FuIG9jY3VyLiAgSW4gYWRkaXRpb24sCit0aGUgbW9yZSBzdHJvbmdseSBvcmRlcmVkIHN5c3RlbXMgbWF5IHJ1bGUgb3V0IHNvbWUgb2YgdGhlIGFib3ZlIG9yZGVycy4KK0J1dCBpbiBhbnkgY2FzZSwgYXMgbm90ZWQgZWFybGllciwgdGhlIHNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKQorZW5zdXJlcyB0aGF0IHRoZSBzdG9yZSB0byAqQSB3aWxsIGFsd2F5cyBiZSBzZWVuIGFzIGhhcHBlbmluZyBiZWZvcmUKK3RoZSBzdG9yZSB0byAqQi4KIAogTG9ja3MgYW5kIHNlbWFwaG9yZXMgbWF5IG5vdCBwcm92aWRlIGFueSBndWFyYW50ZWUgb2Ygb3JkZXJpbmcgb24gVVAgY29tcGlsZWQKIHN5c3RlbXMsIGFuZCBzbyBjYW5ub3QgYmUgY291bnRlZCBvbiBpbiBzdWNoIGEgc2l0dWF0aW9uIHRvIGFjdHVhbGx5IGFjaGlldmUKQEAgLTI3NTcsNyArMjgxOCw3IEBACiBjb21iaW5hdGlvbiBvZiBlbGVtZW50cyBjb21iaW5lZCBvciBkaXNjYXJkZWQsIHByb3ZpZGVkIHRoZSBwcm9ncmFtJ3MgdmlldyBvZgogdGhlIHdvcmxkIHJlbWFpbnMgY29uc2lzdGVudC4gIE5vdGUgdGhhdCBBQ0NFU1NfT05DRSgpIGlzIC1ub3QtIG9wdGlvbmFsCiBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgYXMgdGhlcmUgYXJlIGFyY2hpdGVjdHVyZXMgd2hlcmUgYSBnaXZlbiBDUFUgbWlnaHQKLWludGVyY2hhbmdlIHN1Y2Nlc3NpdmUgbG9hZHMgdG8gdGhlIHNhbWUgbG9jYXRpb24uICBPbiBzdWNoIGFyY2hpdGVjdHVyZXMsCityZW9yZGVyIHN1Y2Nlc3NpdmUgbG9hZHMgdG8gdGhlIHNhbWUgbG9jYXRpb24uICBPbiBzdWNoIGFyY2hpdGVjdHVyZXMsCiBBQ0NFU1NfT05DRSgpIGRvZXMgd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgdGhpcywgZm9yIGV4YW1wbGUsIG9uCiBJdGFuaXVtIHRoZSB2b2xhdGlsZSBjYXN0cyB1c2VkIGJ5IEFDQ0VTU19PTkNFKCkgY2F1c2UgR0NDIHRvIGVtaXQgdGhlCiBzcGVjaWFsIGxkLmFjcSBhbmQgc3QucmVsIGluc3RydWN0aW9ucyB0aGF0IHByZXZlbnQgc3VjaCByZW9yZGVyaW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGxpbmtfbW1hcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0bGlua19tbWFwLnR4dAppbmRleCBiMjYxMjI5Li5jNmFmNGJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0bGlua19tbWFwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0bGlua19tbWFwLnR4dApAQCAtMjI2LDkgKzIyNiw5IEBACiAJdm9pZCAqcnhfcmluZywgKnR4X3Jpbmc7CiAKIAkvKiBDb25maWd1cmUgcmluZyBwYXJhbWV0ZXJzICovCi0JaWYgKHNldHNvY2tvcHQoZmQsIE5FVExJTktfUlhfUklORywgJnJlcSwgc2l6ZW9mKHJlcSkpIDwgMCkKKwlpZiAoc2V0c29ja29wdChmZCwgU09MX05FVExJTkssIE5FVExJTktfUlhfUklORywgJnJlcSwgc2l6ZW9mKHJlcSkpIDwgMCkKIAkJZXhpdCgxKTsKLQlpZiAoc2V0c29ja29wdChmZCwgTkVUTElOS19UWF9SSU5HLCAmcmVxLCBzaXplb2YocmVxKSkgPCAwKQorCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfTkVUTElOSywgTkVUTElOS19UWF9SSU5HLCAmcmVxLCBzaXplb2YocmVxKSkgPCAwKQogCQlleGl0KDEpCiAKIAkvKiBDYWxjdWxhdGUgc2l6ZSBvZiBlYWNoIGluZGl2aWR1YWwgcmluZyAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9waHkvc2Ftc3VuZy11c2IyLnR4dCBiL0RvY3VtZW50YXRpb24vcGh5L3NhbXN1bmctdXNiMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxMmQ0MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcGh5L3NhbXN1bmctdXNiMi50eHQKQEAgLTAsMCArMSwxMzUgQEAKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8CQkJU2Ftc3VuZyBVU0IgMi4wIFBIWSBhZGFwdGF0aW9uIGxheWVyCQkgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKycKKworfCAxLiBEZXNjcmlwdGlvbgorKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgVVNCIDIuMCBQSFkgbW9kdWxlIGluIFNhbXN1bmcgU29DcyBpcyBzaW1pbGFyCithbW9uZyBtYW55IFNvQ3MuIEluIHNwaXRlIG9mIHRoZSBzaW1pbGFyaXRpZXMgaXQgcHJvdmVkIGRpZmZpY3VsdCB0bworY3JlYXRlIGEgb25lIGRyaXZlciB0aGF0IHdvdWxkIGZpdCBhbGwgdGhlc2UgUEhZIGNvbnRyb2xsZXJzLiBPZnRlbgordGhlIGRpZmZlcmVuY2VzIHdlcmUgbWlub3IgYW5kIHdlcmUgZm91bmQgaW4gcGFydGljdWxhciBiaXRzIG9mIHRoZQorcmVnaXN0ZXJzIG9mIHRoZSBQSFkuIEluIHNvbWUgcmFyZSBjYXNlcyB0aGUgb3JkZXIgb2YgcmVnaXN0ZXIgd3JpdGVzIG9yCit0aGUgUEhZIHBvd2VyaW5nIHVwIHByb2Nlc3MgaGFkIHRvIGJlIGFsdGVyZWQuIFRoaXMgYWRhcHRhdGlvbiBsYXllciBpcworYSBjb21wcm9taXNlIGJldHdlZW4gaGF2aW5nIHNlcGFyYXRlIGRyaXZlcnMgYW5kIGhhdmluZyBhIHNpbmdsZSBkcml2ZXIKK3dpdGggYWRkZWQgc3VwcG9ydCBmb3IgbWFueSBzcGVjaWFsIGNhc2VzLgorCit8IDIuIEZpbGVzIGRlc2NyaXB0aW9uCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIHBoeS1zYW1zdW5nLXVzYjIuYworICAgVGhpcyBpcyB0aGUgbWFpbiBmaWxlIG9mIHRoZSBhZGFwdGF0aW9uIGxheWVyLiBUaGlzIGZpbGUgY29udGFpbnMKKyAgIHRoZSBwcm9iZSBmdW5jdGlvbiBhbmQgcHJvdmlkZXMgdHdvIGNhbGxiYWNrcyB0byB0aGUgR2VuZXJpYyBQSFkKKyAgIEZyYW1ld29yay4gVGhpcyB0d28gY2FsbGJhY2tzIGFyZSB1c2VkIHRvIHBvd2VyIG9uIGFuZCBwb3dlciBvZmYgdGhlCisgICBwaHkuIFRoZXkgY2Fycnkgb3V0IHRoZSBjb21tb24gd29yayB0aGF0IGhhcyB0byBiZSBkb25lIG9uIGFsbCB2ZXJzaW9uCisgICBvZiB0aGUgUEhZIG1vZHVsZS4gRGVwZW5kaW5nIG9uIHdoaWNoIFNvQyB3YXMgY2hvc2VuIHRoZXkgZXhlY3V0ZSBTb0MKKyAgIHNwZWNpZmljIGNhbGxiYWNrcy4gVGhlIHNwZWNpZmljIFNvQyB2ZXJzaW9uIGlzIHNlbGVjdGVkIGJ5IGNob29zaW5nCisgICB0aGUgYXBwcm9wcmlhdGUgY29tcGF0aWJsZSBzdHJpbmcuIEluIGFkZGl0aW9uLCB0aGlzIGZpbGUgY29udGFpbnMKKyAgIHN0cnVjdCBvZl9kZXZpY2VfaWQgZGVmaW5pdGlvbnMgZm9yIHBhcnRpY3VsYXIgU29Dcy4KKworLSBwaHktc2Ftc3VuZy11c2IyLmgKKyAgIFRoaXMgaXMgdGhlIGluY2x1ZGUgZmlsZS4gSXQgZGVjbGFyZXMgdGhlIHN0cnVjdHVyZXMgdXNlZCBieSB0aGlzCisgICBkcml2ZXIuIEluIGFkZGl0aW9uIGl0IHNob3VsZCBjb250YWluIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yCisgICBzdHJ1Y3R1cmVzIHRoYXQgZGVzY3JpYmUgcGFydGljdWxhciBTb0NzLgorCit8IDMuIFN1cHBvcnRpbmcgU29DcworKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHN1cHBvcnQgYSBuZXcgU29DIGEgbmV3IGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBkcml2ZXJzL3BoeQorZGlyZWN0b3J5LiBFYWNoIFNvQydzIGNvbmZpZ3VyYXRpb24gaXMgc3RvcmVkIGluIGFuIGluc3RhbmNlIG9mIHRoZQorc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnLgorCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgeworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSAqcGh5czsKKwlpbnQgKCpyYXRlX3RvX2NsaykodW5zaWduZWQgbG9uZywgdTMyICopOworCXVuc2lnbmVkIGludCBudW1fcGh5czsKKwlib29sIGhhc19tb2RlX3N3aXRjaDsKK307CisKK1RoZSBudW1fcGh5cyBpcyB0aGUgbnVtYmVyIG9mIHBoeXMgaGFuZGxlZCBieSB0aGUgZHJpdmVyLiAqcGh5cyBpcyBhbgorYXJyYXkgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBwaHkuIFRoZSBoYXNfbW9kZV9zd2l0Y2gKK3Byb3BlcnR5IGlzIGEgYm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBTb0MgaGFzIFVTQiBob3N0CithbmQgZGV2aWNlIG9uIGEgc2luZ2xlIHBhaXIgb2YgcGlucy4gSWYgc28sIGEgc3BlY2lhbCByZWdpc3RlciBoYXMgdG8KK2JlIG1vZGlmaWVkIHRvIGNoYW5nZSB0aGUgaW50ZXJuYWwgcm91dGluZyBvZiB0aGVzZSBwaW5zIGJldHdlZW4gYSBVU0IKK2RldmljZSBvciBob3N0IG1vZHVsZS4KKworRm9yIGV4YW1wbGUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIEV4eW5vcyA0MjEwIGlzIGZvbGxvd2luZzoKKworY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczQyMTBfdXNiMl9waHlfY29uZmlnID0geworCS5oYXNfbW9kZV9zd2l0Y2ggICAgICAgID0gMCwKKwkubnVtX3BoeXMJCT0gRVhZTk9TNDIxMF9OVU1fUEhZUywKKwkucGh5cwkJCT0gZXh5bm9zNDIxMF9waHlzLAorCS5yYXRlX3RvX2NsawkJPSBleHlub3M0MjEwX3JhdGVfdG9fY2xrLAorfQorCistIGludCAoKnJhdGVfdG9fY2xrKSh1bnNpZ25lZCBsb25nLCB1MzIgKikKKwlUaGUgcmF0ZV90b19jbGsgY2FsbGJhY2sgaXMgdG8gY29udmVydCB0aGUgcmF0ZSBvZiB0aGUgY2xvY2sKKwl1c2VkIGFzIHRoZSByZWZlcmVuY2UgY2xvY2sgZm9yIHRoZSBQSFkgbW9kdWxlIHRvIHRoZSB2YWx1ZQorCXRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gdGhlIGhhcmR3YXJlIHJlZ2lzdGVyLgorCitUaGUgZXh5bm9zNDIxMF9waHlzIGNvbmZpZ3VyYXRpb24gYXJyYXkgaXMgYXMgZm9sbG93czoKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSBleHlub3M0MjEwX3BoeXNbXSA9IHsKKwl7CisJCS5sYWJlbAkJPSAiZGV2aWNlIiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfREVWSUNFLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaG9zdCIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hPU1QsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMCIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hTSUMwLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzEiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9IU0lDMSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJe30sCit9OworCistIGludCAoKnBvd2VyX29uKShzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqKTsKKy0gaW50ICgqcG93ZXJfb2ZmKShzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqKTsKKwlUaGVzZSB0d28gY2FsbGJhY2tzIGFyZSB1c2VkIHRvIHBvd2VyIG9uIGFuZCBwb3dlciBvZmYgdGhlIHBoeQorCWJ5IG1vZGlmeWluZyBhcHByb3ByaWF0ZSByZWdpc3RlcnMuCisKK0ZpbmFsIGNoYW5nZSB0byB0aGUgZHJpdmVyIGlzIGFkZGluZyBhcHByb3ByaWF0ZSBjb21wYXRpYmxlIHZhbHVlIHRvIHRoZQorcGh5LXNhbXN1bmctdXNiMi5jIGZpbGUuIEluIGNhc2Ugb2YgRXh5bm9zIDQyMTAgdGhlIGZvbGxvd2luZyBsaW5lcyB3ZXJlCithZGRlZCB0byB0aGUgc3RydWN0IG9mX2RldmljZV9pZCBzYW1zdW5nX3VzYjJfcGh5X29mX21hdGNoW10gYXJyYXk6CisKKyNpZmRlZiBDT05GSUdfUEhZX0VYWU5PUzQyMTBfVVNCMgorCXsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEwLXVzYjItcGh5IiwKKwkJLmRhdGEgPSAmZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWcsCisJfSwKKyNlbmRpZgorCitUbyBhZGQgZnVydGhlciBmbGV4aWJpbGl0eSB0byB0aGUgZHJpdmVyIHRoZSBLY29uZmlnIGZpbGUgZW5hYmxlcyB0bworaW5jbHVkZSBzdXBwb3J0IGZvciBzZWxlY3RlZCBTb0NzIGluIHRoZSBjb21waWxlZCBkcml2ZXIuIFRoZSBLY29uZmlnCitlbnRyeSBmb3IgRXh5bm9zIDQyMTAgaXMgZm9sbG93aW5nOgorCitjb25maWcgUEhZX0VYWU5PUzQyMTBfVVNCMgorCWJvb2wgIlN1cHBvcnQgZm9yIEV4eW5vcyA0MjEwIgorCWRlcGVuZHMgb24gUEhZX1NBTVNVTkdfVVNCMgorCWRlcGVuZHMgb24gQ1BVX0VYWU5PUzQyMTAKKwloZWxwCisJICBFbmFibGUgVVNCIFBIWSBzdXBwb3J0IGZvciBFeHlub3MgNDIxMC4gVGhpcyBvcHRpb24gcmVxdWlyZXMgdGhhdAorCSAgU2Ftc3VuZyBVU0IgMi4wIFBIWSBkcml2ZXIgaXMgZW5hYmxlZCBhbmQgbWVhbnMgdGhhdCBzdXBwb3J0IGZvciB0aGlzCisJICBwYXJ0aWN1bGFyIFNvQyBpcyBjb21waWxlZCBpbiB0aGUgZHJpdmVyLiBJbiBjYXNlIG9mIEV4eW5vcyA0MjEwIGZvdXIKKwkgIHBoeXMgYXJlIGF2YWlsYWJsZSAtIGRldmljZSwgaG9zdCwgSFNDSTAgYW5kIEhTQ0kxLgorCitUaGUgbmV3bHkgY3JlYXRlZCBmaWxlIHRoYXQgc3VwcG9ydHMgdGhlIG5ldyBTb0MgaGFzIHRvIGJlIGFsc28gYWRkZWQgdG8gdGhlCitNYWtlZmlsZS4gSW4gY2FzZSBvZiBFeHlub3MgNDIxMCB0aGUgYWRkZWQgbGluZSBpcyBmb2xsb3dpbmc6CisKK29iai0kKENPTkZJR19QSFlfRVhZTk9TNDIxMF9VU0IyKSAgICAgICArPSBwaHktZXh5bm9zNDIxMC11c2IyLm8KKworQWZ0ZXIgY29tcGxldGluZyB0aGVzZSBzdGVwcyB0aGUgc3VwcG9ydCBmb3IgdGhlIG5ldyBTb0Mgc2hvdWxkIGJlIHJlYWR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcwppbmRleCA2ZWRhYTY1Li45MWJhNThlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcworKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcwpAQCAtMSwzICsxLDE2IEBACitSZWxlYXNlIERhdGUgICAgOiBNb24uIE1hciAxMCwgMjAxNCAxNzowMDowMCBQU1QgMjAxNCAtCisJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKKwkJCUFkYW0gUmFkZm9yZAorCQkJS2FzaHlhcCBEZXNhaQorCQkJU3VtaXQgU2F4ZW5hCitDdXJyZW50IFZlcnNpb24gOiAwNi44MDMuMDEuMDAtcmMxCitPbGQgVmVyc2lvbiAgICAgOiAwNi43MDAuMDYuMDAtcmMxCisgICAgMS4gTG9hZCBjb3JyZWN0IHJhaWQgY29udGV4dCB0aW1lb3V0IHZhbHVlIGZvciBtdWx0aXBhdGhpbmcgJiBjbHVzdGVyaW5nLgorICAgIDIuIEZpeCBtZWdhc2FzX2lvY19pbml0X2Z1c2lvbiB0byB1c2UgbG9jYWwgc3RhY2sgdmFyaWFibGUuCisgICAgMy4gUmV0dXJuIGxlYWtlZCBNUFQgZnJhbWVzIHRvIE1QVCBjb21tYW5kIHBvb2wuCisgICAgNC4gQWRkIERlbGwgUG93ZXJFZGdlIFZSVFggU1ItSU9WIFZGIGRldmljZSBzdXBwb3J0LgorICAgIDUuIFZlcnNpb24gYW5kIENoYW5nZWxvZyB1cGRhdGUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBSZWxlYXNlIERhdGUgICAgOiBTYXQuIEF1ZyAzMSwgMjAxMyAxNzowMDowMCBQU1QgMjAxMyAtCiAJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKIAkJCUFkYW0gUmFkZm9yZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zZ2ktdmlzd3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zZ2ktdmlzd3MudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwODExYy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLVRoZSBTR0kgVmlzdWFsIFdvcmtzdGF0aW9ucyAobW9kZWxzIDMyMCBhbmQgNTQwKSBhcmUgYmFzZWQgYXJvdW5kCi10aGUgQ29iYWx0LCBMaXRoaXVtLCBhbmQgQXJzZW5pYyBBU0lDcy4gIFRoZSBDb2JhbHQgQVNJQyBpcyB0aGUKLW1haW4gc3lzdGVtIEFTSUMgd2hpY2ggaW50ZXJmYWNlcyB0aGUgMS00IElBMzIgY3B1cywgdGhlIG1lbW9yeQotc3lzdGVtLCBhbmQgdGhlIEkvTyBzeXN0ZW0gaW4gdGhlIExpdGhpdW0gQVNJQy4gIFRoZSBDb2JhbHQgQVNJQwotYWxzbyBjb250YWlucyB0aGUgM0QgZ2Z4IHJlbmRlcmluZyBlbmdpbmUgd2hpY2ggcmVuZGVycyB0byBtYWluCi1zeXN0ZW0gbWVtb3J5IC0tIHBhcnQgb2Ygd2hpY2ggaXMgdXNlZCBhcyB0aGUgZnJhbWUgYnVmZmVyIHdoaWNoCi1pcyBETUEnZWQgdG8gYSB2aWRlbyBjb25uZWN0b3IgdXNpbmcgdGhlIEFyc2VuaWMgQVNJQy4gIEEgUElJWDQKLWNoaXAgYW5kIE5TODczMDcgYXJlIHVzZWQgdG8gcHJvdmlkZSBsZWdhY3kgZGV2aWNlIHN1cHBvcnQgKElERSwKLXNlcmlhbCwgZmxvcHB5LCBhbmQgcGFyYWxsZWwpLgotCi1UaGUgVmlzdWFsIFdvcmtzdGF0aW9uIGNoaXBzZXQgbGFyZ2VseSBjb25mb3JtcyB0byB0aGUgUEMgYXJjaGl0ZWN0dXJlCi13aXRoIHNvbWUgbm90YWJsZSBleGNlcHRpb25zIHN1Y2ggYXMgaW50ZXJydXB0IGhhbmRsaW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy92d3NuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2Y2JkYi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy92d3NuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi12d3NuZCAtIFNvdW5kIGRyaXZlciBmb3IgdGhlIFNpbGljb24gR3JhcGhpY3MgMzIwIGFuZCA1NDAgVmlzdWFsCi1Xb3Jrc3RhdGlvbnMnIG9uYm9hcmQgYXVkaW8uCi0KLUNvcHlyaWdodCAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLQotQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBNYXJjaCAxOTk5LCB0aGVyZSBhcmUgdHdvIG1vZGVscyBvZgotVmlzdWFsIFdvcmtzdGF0aW9uLCB0aGUgMzIwIGFuZCB0aGUgNTQwLiAgVGhpcyBkb2N1bWVudCBvbmx5IGRlc2NyaWJlcwotdGhvc2UgbW9kZWxzLiAgRnV0dXJlIFZpc3VhbCBXb3Jrc3RhdGlvbiBtb2RlbHMgbWF5IGhhdmUgZGlmZmVyZW50Ci1zb3VuZCBjYXBhYmlsaXRpZXMsIGFuZCB0aGlzIGRyaXZlciB3aWxsIHByb2JhYmx5IG5vdCB3b3JrIG9uIHRob3NlCi1ib3hlcy4KLQotVGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiBoYXMgYW4gQW5hbG9nIERldmljZXMgQUQxODQzICJTb3VuZENvbW0iIGF1ZGlvCi1jb2RlYyBjaGlwLiAgVGhlIEFEMTg0MyBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBDb2JhbHQgSS9PIEFTSUMsIGFsc28KLWtub3duIGFzIExpdGhpdW0uICBUaGlzIGRyaXZlciBwcm9ncmFtcyBib3RoIGNoaXBzLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVFVSUNLIENPTkZJR1VSQVRJT04KLQotCSMgaW5zbW9kIHNvdW5kY29yZQotCSMgaW5zbW9kIHZ3c25kCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotSS9PIENPTk5FQ1RJT05TCi0KLU9uIHRoZSBWaXN1YWwgV29ya3N0YXRpb24sIG9ubHkgdGhyZWUgb2YgdGhlIEFEMTg0MyBpbnB1dHMgYXJlIGhvb2tlZAotdXAuICBUaGUgYW5hbG9nIGxpbmUgaW4gamFja3MgYXJlIGNvbm5lY3RlZCB0byB0aGUgQUQxODQzJ3MgQVVYMQotaW5wdXQuICBUaGUgQ0QgYXVkaW8gbGluZXMgYXJlIGNvbm5lY3RlZCB0byB0aGUgQUQxODQzJ3MgQVVYMiBpbnB1dC4KLVRoZSBtaWNyb3Bob25lIGphY2sgaXMgY29ubmVjdGVkIHRvIHRoZSBBRDE4NDMncyBNSUMgaW5wdXQuICBUaGUgbWljCi1qYWNrIGlzIG1vbm8sIGJ1dCB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byBib3RoIHRoZSBsZWZ0IGFuZCByaWdodAotTUlDIGlucHV0cy4gIFlvdSBjYW4gcmVjb3JkIGluIHN0ZXJlbyBmcm9tIHRoZSBtaWMgaW5wdXQsIGJ1dCB5b3Ugd2lsbAotZ2V0IHRoZSBzYW1lIHNpZ25hbCBvbiBib3RoIGNoYW5uZWxzICh3aXRoaW4gdGhlIGxpbWl0cyBvZiBBL0QKLWFjY3VyYWN5KS4gIEZ1bGwgc2NhbGUgb24gdGhlIExpbmUgaW5wdXQgaXMgKy8tIDIuMCBWLiAgRnVsbCBzY2FsZSBvbgotdGhlIE1JQyBpbnB1dCBpcyAyMCBkQiBsZXNzLCBvciArLy0gMC4yIFYuCi0KLVRoZSBBRDE4NDMncyBMT1VUMSBvdXRwdXRzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIExpbmUgT3V0IGphY2tzLiAgVGhlCi1BRDE4NDMncyBIUE9VVCBvdXRwdXRzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIHNwZWFrZXIvaGVhZHBob25lIGphY2suCi1MT1VUMiBpcyBub3QgY29ubmVjdGVkLiAgTGluZSBvdXQncyBtYXhpbXVtIGxldmVsIGlzICsvLSAyLjAgViBwZWFrIHRvCi1wZWFrLiAgVGhlIHNwZWFrZXIvaGVhZHBob25lIG91dCdzIG1heGltdW0gaXMgKy8tIDQuMCBWIHBlYWsgdG8gcGVhay4KLQotVGhlIEFEMTg0MydzIFBDTSBpbnB1dCBjaGFubmVsIGFuZCBvbmUgb2YgaXRzIG91dHB1dCBjaGFubmVscyAoREFDMSkKLWFyZSBjb25uZWN0ZWQgdG8gTGl0aGl1bS4gIFRoZSBvdGhlciBvdXRwdXQgY2hhbm5lbCAoREFDMikgaXMgbm90Ci1jb25uZWN0ZWQuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQ0FQQUJJTElUSUVTCi0KLVRoZSBBRDE4NDMgaGFzIFBDTSBpbnB1dCBhbmQgb3V0cHV0IChQdWxzZSBDb2RlIE1vZHVsYXRpb24sIGFsc28ga25vd24KLWFzIHdhdmV0YWJsZSkuICBQQ00gaW5wdXQgYW5kIG91dHB1dCBjYW4gYmUgbW9ubyBvciBzdGVyZW8gaW4gYW55IG9mCi1mb3VyIGZvcm1hdHMuICBUaGUgZm9ybWF0cyBhcmUgMTYgYml0IHNpZ25lZCBhbmQgOCBiaXQgdW5zaWduZWQsCi11LUxhdywgYW5kIEEtTGF3IGZvcm1hdC4gIEFueSBzYW1wbGUgcmF0ZSBmcm9tIDQgS0h6IHRvIDQ5IEtIeiBpcwotYXZhaWxhYmxlLCBpbiAxIEh6IGluY3JlbWVudHMuCi0KLVRoZSBBRDE4NDMgaW5jbHVkZXMgYW4gYW5hbG9nIG1peGVyIHRoYXQgY2FuIG1peCBhbGwgdGhyZWUgaW5wdXQKLXNpZ25hbHMgKGxpbmUsIG1pYyBhbmQgQ0QpIGludG8gdGhlIGFuYWxvZyBvdXRwdXRzLiAgVGhlIG1peGVyIGhhcyBhCi1zZXBhcmF0ZSBnYWluIGNvbnRyb2wgYW5kIG11dGUgc3dpdGNoIGZvciBlYWNoIGlucHV0LgotCi1UaGVyZSBhcmUgdHdvIG91dHB1dHMsIGxpbmUgb3V0IGFuZCBzcGVha2VyL2hlYWRwaG9uZSBvdXQuICBUaGV5Ci1hbHdheXMgcHJvZHVjZSB0aGUgc2FtZSBzaWduYWwsIGFuZCB0aGUgc3BlYWtlciBhbHdheXMgaGFzIDMgZEIgbW9yZQotZ2FpbiB0aGFuIHRoZSBsaW5lIG91dC4gIFRoZSBzcGVha2VyL2hlYWRwaG9uZSBvdXRwdXQgY2FuIGJlIG11dGVkLAotYnV0IHRoaXMgZHJpdmVyIGRvZXMgbm90IGV4cG9ydCB0aGF0IGZ1bmN0aW9uLgotCi1UaGUgaGFyZHdhcmUgY2FuIHN5bmMgYXVkaW8gdG8gdGhlIHZpZGVvIGNsb2NrLCBidXQgdGhpcyBkcml2ZXIgZG9lcwotbm90IGhhdmUgYSB3YXkgdG8gc3BlY2lmeSBzeW5jaW5nIHRvIHZpZGVvLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBST0dSQU1NSU5HCi0KLVRoaXMgc2VjdGlvbiBleHBsYWlucyB0aGUgQVBJIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLiAgQWxzbyBzZWUgdGhlCi1PcGVuIFNvdW5kIFByb2dyYW1taW5nIEd1aWRlIGF0IGh0dHA6Ly93d3cub3BlbnNvdW5kLmNvbS9wZ3VpZGUvIC4KLVRoaXMgc2VjdGlvbiBhc3N1bWVzIGZhbWlsaWFyaXR5IHdpdGggdGhhdCBkb2N1bWVudC4KLQotVGhlIGRyaXZlciBoYXMgdHdvIGludGVyZmFjZXMsIGFuIEkvTyBpbnRlcmZhY2UgYW5kIGEgbWl4ZXIgaW50ZXJmYWNlLgotVGhlcmUgaXMgbm8gTUlESSBvciBzZXF1ZW5jZXIgY2FwYWJpbGl0eS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QUk9HUkFNTUlORyBQQ00gSS9PCi0KLVRoZSBJL08gaW50ZXJmYWNlIGlzIHVzdWFsbHkgYWNjZXNzZWQgYXMgL2Rldi9hdWRpbyBvciAvZGV2L2RzcC4KLVVzaW5nIHRoZSBzdGFuZGFyZCBPcGVuIFNvdW5kIFN5c3RlbSAoT1NTKSBpb2N0bCBjYWxscywgdGhlIHNhbXBsZQotcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzLCBhbmQgc2FtcGxlIGZvcm1hdCBtYXkgYmUgc2V0IHdpdGhpbiB0aGUKLWxpbWl0YXRpb25zIGRlc2NyaWJlZCBhYm92ZS4gIFRoZSBkcml2ZXIgc3VwcG9ydHMgdHJpZ2dlcmluZy4gIEl0IGFsc28KLXN1cHBvcnRzIGdldHRpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQgcG9pbnRlcnMgd2l0aCBvbmUtc2FtcGxlCi1hY2N1cmFjeS4KLQotVGhlIFNORENUTF9EU1BfR0VUQ0FQIGlvY3RsIHJldHVybnMgdGhlc2UgY2FwYWJpbGl0aWVzLgotCi0JRFNQX0NBUF9EVVBMRVggLSBkcml2ZXIgc3VwcG9ydHMgZnVsbCBkdXBsZXguCi0KLQlEU1BfQ0FQX1RSSUdHRVIgLSBkcml2ZXIgc3VwcG9ydHMgdHJpZ2dlcmluZy4KLQotCURTUF9DQVBfUkVBTFRJTUUgLSB2YWx1ZXMgcmV0dXJuZWQgYnkgU05EQ1RMX0RTUF9HRVRJUFRSCi0JYW5kIFNORENUTF9EU1BfR0VUT1BUUiBhcmUgYWNjdXJhdGUgdG8gYSBmZXcgc2FtcGxlcy4KLQotTWVtb3J5IG1hcHBpbmcgKG1tYXApIGlzIG5vdCBpbXBsZW1lbnRlZC4KLQotVGhlIGRyaXZlciBwZXJtaXRzIHN1YmRpdmlkZWQgZnJhZ21lbnQgc2l6ZXMgZnJvbSA2NCB0byA0MDk2IGJ5dGVzLgotVGhlIG51bWJlciBvZiBmcmFnbWVudHMgY2FuIGJlIGFueXRoaW5nIGZyb20gMyBmcmFnbWVudHMgdG8gaG93ZXZlcgotbWFueSBmcmFnbWVudHMgZml0IGludG8gMTI0IGtpbG9ieXRlcy4gIEl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvCi1kZXRlcm1pbmUgaG93IGZldy9zbWFsbCBmcmFnbWVudHMgY2FuIGJlIHVzZWQgd2l0aG91dCBpbnRyb2R1Y2luZwotZ2xpdGNoZXMgd2l0aCBhIGdpdmVuIHdvcmtsb2FkLiAgTGludXggaXMgbm90IHJlYWx0aW1lLCBzbyB3ZSBjYW4ndAotcHJvbWlzZSBhbnl0aGluZy4gIChzaWdoLi4uKQotCi1XaGVuIHRoaXMgZHJpdmVyIGlzIHN3aXRjaGVkIGludG8gb3Igb3V0IG9mIG11LUxhdyBvciBBLUxhdyBtb2RlIG9uCi1vdXRwdXQsIGl0IG1heSBwcm9kdWNlIGFuIGF1ZGlibGUgY2xpY2suICBUaGlzIGlzIHVuYXZvaWRhYmxlLiAgVG8KLXByZXZlbnQgY2xpY2tpbmcsIHVzZSBzaWduZWQgMTYtYml0IG1vZGUgaW5zdGVhZCwgYW5kIGNvbnZlcnQgZnJvbQotbXUtTGF3IG9yIEEtTGF3IGZvcm1hdCBpbiBzb2Z0d2FyZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QUk9HUkFNTUlORyBUSEUgTUlYRVIgSU5URVJGQUNFCi0KLVRoZSBtaXhlciBpbnRlcmZhY2UgaXMgdXN1YWxseSBhY2Nlc3NlZCBhcyAvZGV2L21peGVyLiAgSXQgaXMgYWNjZXNzZWQKLXRocm91Z2ggaW9jdGxzLiAgVGhlIG1peGVyIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gY29udHJvbCBnYWluIG9yCi1tdXRlIHNldmVyYWwgYXVkaW8gc2lnbmFsIHBhdGhzLCBhbmQgYWxzbyBhbGxvd3Mgc2VsZWN0aW9uIG9mIHRoZQotcmVjb3JkaW5nIHNvdXJjZS4KLQotRWFjaCBvZiB0aGUgY29uc3RhbnRzIGRlc2NyaWJlZCBoZXJlIGNhbiBiZSByZWFkIHVzaW5nIHRoZQotTUlYRVJfUkVBRChTT1VORF9NSVhFUl94eHgpIGlvY3RsLiAgVGhvc2UgdGhhdCBhcmUgbm90IHJlYWQtb25seSBjYW4KLWFsc28gYmUgd3JpdHRlbiB1c2luZyB0aGUgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfeHh4KSBpb2N0bC4gIEluIG1vc3QKLWNhc2VzLCA8c3lzL3NvdW5kY2FyZC5oPiBkZWZpbmVzIGNvbnN0YW50cyBTT1VORF9NSVhFUl9SRUFEX3h4eCBhbmQKLVNPVU5EX01JWEVSX1dSSVRFX3h4eCB3aGljaCB3b3JrIGp1c3QgYXMgd2VsbC4KLQotU09VTkRfTUlYRVJfQ0FQUwlSZWFkLW9ubHkKLQotVGhpcyBpcyBhIG1hc2sgb2Ygb3B0aW9uYWwgZHJpdmVyIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBpbXBsZW1lbnRlZC4KLVRoaXMgZHJpdmVyJ3Mgb25seSBjYXBhYmlsaXR5IGlzIFNPVU5EX0NBUF9FWENMX0lOUFVULCB3aGljaCBtZWFucwotdGhhdCBvbmx5IG9uZSByZWNvcmRpbmcgc291cmNlIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLgotCi1TT1VORF9NSVhFUl9ERVZNQVNLCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiB0aGUgc291bmQgY2hhbm5lbHMuICBUaGlzIGRyaXZlcidzIGNoYW5uZWxzIGFyZSBQQ00sCi1MSU5FLCBNSUMsIENELCBhbmQgUkVDTEVWLgotCi1TT1VORF9NSVhFUl9TVEVSRU9ERVZTCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiB3aGljaCBzb3VuZCBjaGFubmVscyBhcmUgY2FwYWJsZSBvZiBzdGVyZW8uICBBbGwKLWNoYW5uZWxzIGFyZSBjYXBhYmxlIG9mIHN0ZXJlby4gIChCdXQgc2VlIGNhdmVhdCBvbiBNSUMgaW5wdXQgaW4gSS9PCi1DT05ORUNUSU9OUyBzZWN0aW9uIGFib3ZlKS4KLQotU09VTkRfTUlYRVJfT1VUTUFTSwlSZWFkLW9ubHkKLQotVGhpcyBpcyBhIG1hc2sgb2YgY2hhbm5lbHMgdGhhdCByb3V0ZSBpbnB1dHMgdGhyb3VnaCB0byBvdXRwdXRzLgotVGhvc2UgYXJlIExJTkUsIE1JQywgYW5kIENELgotCi1TT1VORF9NSVhFUl9SRUNNQVNLCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSByZWNvcmRpbmcgc291cmNlcy4gIFRob3NlIGFyZQotUENNLCBMSU5FLCBNSUMsIENELgotCi1TT1VORF9NSVhFUl9QQ00JCURlZmF1bHQ6IDB4NTc1NyAoMCBkQikKLQotVGhpcyBpcyB0aGUgZ2FpbiBjb250cm9sIGZvciBQQ00gb3V0cHV0LiAgVGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwKLWdhaW4gYXJlIGNvbnRyb2xsZWQgaW5kZXBlbmRlbnRseS4gIFRoaXMgZ2FpbiBjb250cm9sIGhhcyA2NCBsZXZlbHMsCi13aGljaCByYW5nZSBmcm9tIC04Mi41IGRCIHRvICsxMi4wIGRCIGluIDEuNSBkQiBzdGVwcy4gIFRob3NlIDY0Ci1sZXZlbHMgYXJlIG1hcHBlZCBvbnRvIDEwMCBsZXZlbHMgYXQgdGhlIGlvY3RsLCBzZWUgYmVsb3cuCi0KLVNPVU5EX01JWEVSX0xJTkUJRGVmYXVsdDogMHg0YTRhICgwIGRCKQotCi1UaGlzIGlzIHRoZSBnYWluIGNvbnRyb2wgZm9yIG1peGluZyB0aGUgTGluZSBJbiBzb3VyY2UgaW50byB0aGUKLW91dHB1dHMuICBUaGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBnYWluIGFyZSBjb250cm9sbGVkCi1pbmRlcGVuZGVudGx5LiAgVGhpcyBnYWluIGNvbnRyb2wgaGFzIDMyIGxldmVscywgd2hpY2ggcmFuZ2UgZnJvbQotLTM0LjUgZEIgdG8gKzEyLjAgZEIgaW4gMS41IGRCIHN0ZXBzLiAgVGhvc2UgMzIgbGV2ZWxzIGFyZSBtYXBwZWQgb250bwotMTAwIGxldmVscyBhdCB0aGUgaW9jdGwsIHNlZSBiZWxvdy4KLQotU09VTkRfTUlYRVJfTUlDCQlEZWZhdWx0OiAweDRhNGEgKDAgZEIpCi0KLVRoaXMgaXMgdGhlIGdhaW4gY29udHJvbCBmb3IgbWl4aW5nIHRoZSBNSUMgc291cmNlIGludG8gdGhlIG91dHB1dHMuCi1UaGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBnYWluIGFyZSBjb250cm9sbGVkIGluZGVwZW5kZW50bHkuICBUaGlzCi1nYWluIGNvbnRyb2wgaGFzIDMyIGxldmVscywgd2hpY2ggcmFuZ2UgZnJvbSAtMzQuNSBkQiB0byArMTIuMCBkQiBpbgotMS41IGRCIHN0ZXBzLiAgVGhvc2UgMzIgbGV2ZWxzIGFyZSBtYXBwZWQgb250byAxMDAgbGV2ZWxzIGF0IHRoZQotaW9jdGwsIHNlZSBiZWxvdy4KLQotU09VTkRfTUlYRVJfQ0QJCURlZmF1bHQ6IDB4NGE0YSAoMCBkQikKLQotVGhpcyBpcyB0aGUgZ2FpbiBjb250cm9sIGZvciBtaXhpbmcgdGhlIENEIGF1ZGlvIHNvdXJjZSBpbnRvIHRoZQotb3V0cHV0cy4gIFRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGdhaW4gYXJlIGNvbnRyb2xsZWQKLWluZGVwZW5kZW50bHkuICBUaGlzIGdhaW4gY29udHJvbCBoYXMgMzIgbGV2ZWxzLCB3aGljaCByYW5nZSBmcm9tCi0tMzQuNSBkQiB0byArMTIuMCBkQiBpbiAxLjUgZEIgc3RlcHMuICBUaG9zZSAzMiBsZXZlbHMgYXJlIG1hcHBlZCBvbnRvCi0xMDAgbGV2ZWxzIGF0IHRoZSBpb2N0bCwgc2VlIGJlbG93LgotCi1TT1VORF9NSVhFUl9SRUNMRVYJIERlZmF1bHQ6IDAgKDAgZEIpCi0KLVRoaXMgaXMgdGhlIGdhaW4gY29udHJvbCBmb3IgUENNIGlucHV0IChSRUNvcmRpbmcgTEVWZWwpLiAgVGhlIGxlZnQKLWFuZCByaWdodCBjaGFubmVsIGdhaW4gYXJlIGNvbnRyb2xsZWQgaW5kZXBlbmRlbnRseS4gIFRoaXMgZ2FpbgotY29udHJvbCBoYXMgMTYgbGV2ZWxzLCB3aGljaCByYW5nZSBmcm9tIDAgZEIgdG8gKzIyLjUgZEIgaW4gMS41IGRCCi1zdGVwcy4gIFRob3NlIDE2IGxldmVscyBhcmUgbWFwcGVkIG9udG8gMTAwIGxldmVscyBhdCB0aGUgaW9jdGwsIHNlZQotYmVsb3cuCi0KLVNPVU5EX01JWEVSX1JFQ1NSQwkgRGVmYXVsdDogU09VTkRfTUFTS19MSU5FCi0KLVRoaXMgaXMgYSBtYXNrIG9mIGN1cnJlbnRseSBzZWxlY3RlZCBQQ00gaW5wdXQgc291cmNlcyAoUkVDb3JkaW5nCi1Tb3VSQ2VzKS4gIEJlY2F1c2UgdGhlIEFEMTg0MyBjYW4gb25seSBoYXZlIGEgc2luZ2xlIHJlY29yZGluZyBzb3VyY2UKLWF0IGEgdGltZSwgb25seSBvbmUgYml0IGF0IGEgdGltZSBjYW4gYmUgc2V0IGluIHRoaXMgbWFzay4gIFRoZQotYWxsb3dhYmxlIHZhbHVlcyBhcmUgU09VTkRfTUFTS19QQ00sIFNPVU5EX01BU0tfTElORSwgU09VTkRfTUFTS19NSUMsCi1vciBTT1VORF9NQVNLX0NELiAgU2VsZWN0aW5nIFNPVU5EX01BU0tfUENNIHNldHMgdXAgaW50ZXJuYWwKLXJlc2FtcGxpbmcgd2hpY2ggaXMgdXNlZnVsIGZvciBsb29wYmFjayB0ZXN0aW5nIGFuZCBmb3IgaGFyZHdhcmUKLXNhbXBsZSByYXRlIGNvbnZlcnNpb24uICBCdXQgc29mdHdhcmUgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBpcwotcHJvYmFibHkgZmFzdGVyLCBzbyBJIGRvbid0IGtub3cgaG93IHVzZWZ1bCB0aGF0IGlzLgotCi1TT1VORF9NSVhFUl9PVVRTUkMJREVGQVVMVDogU09VTkRfTUFTS19MSU5FfFNPVU5EX01BU0tfTUlDfFNPVU5EX01BU0tfQ0QKLQotVGhpcyBpcyBhIG1hc2sgb2Ygc291cmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgcGFzc2VkIHRocm91Z2ggdG8gdGhlCi1vdXRwdXRzLiAgVGhvc2Ugc291cmNlcyB3aG9zZSBiaXRzIGFyZSBub3Qgc2V0IGFyZSBtdXRlZC4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1HQUlOIENPTlRST0wKLQotVGhlcmUgYXJlIGZpdmUgZ2FpbiBjb250cm9scyBsaXN0ZWQgYWJvdmUuICBFYWNoIGhhcyAxNiwgMzIsIG9yIDY0Ci1zdGVwcy4gIEVhY2ggY29udHJvbCBoYXMgMS41IGRCIG9mIGdhaW4gcGVyIHN0ZXAuICBFYWNoIGNvbnRyb2wgaXMKLXN0ZXJlby4KLQotVGhlIE9TUyBkZWZpbmVzIHRoZSBhcmd1bWVudCB0byBhIGNoYW5uZWwgZ2FpbiBpb2N0bCBhcyBoYXZpbmcgdHdvCi1jb21wb25lbnRzLCBsZWZ0IGFuZCByaWdodCwgZWFjaCBvZiB3aGljaCByYW5nZXMgZnJvbSAwIHRvIDEwMC4gIFRoZQotdHdvIGNvbXBvbmVudHMgYXJlIHBhY2tlZCBpbnRvIHRoZSBzYW1lIHdvcmQsIHdpdGggdGhlIGxlZnQgc2lkZSBnYWluCi1pbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgYW5kIHRoZSByaWdodCBzaWRlIGdhaW4gaW4gdGhlIHNlY29uZAotbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZS4gIEluIEMsIHdlIHdvdWxkIHNheSB0aGlzLgotCi0JI2luY2x1ZGUgPGFzc2VydC5oPgotCi0JLi4uCi0KLQkgCWFzc2VydChsZWZ0Z2FpbiA+PSAwICYmIGxlZnRnYWluIDw9IDEwMCk7Ci0JCWFzc2VydChyaWdodGdhaW4gPj0gMCAmJiByaWdodGdhaW4gPD0gMTAwKTsKLQkJYXJnID0gbGVmdGdhaW4gfCByaWdodGdhaW4gPDwgODsKLQotU28gZWFjaCBPU1MgZ2FpbiBjb250cm9sIGhhcyAxMDEgc3RlcHMuICBCdXQgdGhlIGhhcmR3YXJlIGhhcyAxNiwgMzIsCi1vciA2NCBzdGVwcy4gIFRoZSBoYXJkd2FyZSBzdGVwcyBhcmUgc3ByZWFkIGFjcm9zcyB0aGUgMTAxIE9TUyBzdGVwcwotbmVhcmx5IGV2ZW5seS4gIFRoZSBjb252ZXJzaW9uIGZvcm11bGFzIGFyZSBsaWtlIHRoaXMsIGdpdmVuIE4gZXF1YWxzCi0xNiwgMzIsIG9yIDY0LgotCi0JaW50IHJvdW5kID0gTi8yIC0gMTsKLQlPU1NfZ2Fpbl9zdGVwcyA9IChod19nYWluX3N0ZXBzICogMTAwICsgcm91bmQpIC8gKE4gLSAxKTsKLQlod19nYWluX3N0ZXBzID0gKE9TU19nYWluX3N0ZXBzICogKE4gLSAxKSArIHJvdW5kKSAvIDEwMDsKLQotSGVyZSBpcyBhIHNuaXBwZXQgb2YgQyBjb2RlIHRoYXQgd2lsbCByZXR1cm4gdGhlIGxlZnQgYW5kIHJpZ2h0IGdhaW4KLW9mIGFueSBjaGFubmVsIGluIGRCLiAgUGFzcyBpdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgZ2Fpbl9kZXNjX3QKLXN0cnVjdHVyZXMgdG8gYWNjZXNzIGFueSBvZiB0aGUgZml2ZSBjaGFubmVscycgZ2FpbnMuCi0KLQl0eXBlZGVmIHN0cnVjdCBnYWluX2Rlc2MgewotCQlmbG9hdCBtaW5fZ2FpbjsKLQkJZmxvYXQgZ2Fpbl9zdGVwOwotCQlpbnQgbmJpdHM7Ci0JCWludCBjaGFuOwotCX0gZ2Fpbl9kZXNjX3Q7Ci0KLQljb25zdCBnYWluX2Rlc2NfdCBnYWluX3BjbSAgICA9IHsgLTgyLjUsIDEuNSwgNiwgU09VTkRfTUlYRVJfUENNICAgIH07Ci0JY29uc3QgZ2Fpbl9kZXNjX3QgZ2Fpbl9saW5lICAgPSB7IC0zNC41LCAxLjUsIDUsIFNPVU5EX01JWEVSX0xJTkUgICB9OwotCWNvbnN0IGdhaW5fZGVzY190IGdhaW5fbWljICAgID0geyAtMzQuNSwgMS41LCA1LCBTT1VORF9NSVhFUl9NSUMgICAgfTsKLQljb25zdCBnYWluX2Rlc2NfdCBnYWluX2NkICAgICA9IHsgLTM0LjUsIDEuNSwgNSwgU09VTkRfTUlYRVJfQ0QgICAgIH07Ci0JY29uc3QgZ2Fpbl9kZXNjX3QgZ2Fpbl9yZWNsZXYgPSB7ICAgMC4wLCAxLjUsIDQsIFNPVU5EX01JWEVSX1JFQ0xFViB9OwotCi0JaW50IGdldF9nYWluX2RCKGludCBmZCwgY29uc3QgZ2Fpbl9kZXNjX3QgKmdwLAotCQkJZmxvYXQgKmxlZnQsIGZsb2F0ICpyaWdodCkKLQl7Ci0JCWludCB3b3JkOwotCQlpbnQgbGcsIHJnOwotCQlpbnQgbWFzayA9ICgxIDw8IGdwLT5uYml0cykgLSAxOwotCi0JCWlmIChpb2N0bChmZCwgTUlYRVJfUkVBRChncC0+Y2hhbiksICZ3b3JkKSAhPSAwKQotCQkJcmV0dXJuIC0xOwkvKiBmYWlsICovCi0JCWxnID0gd29yZCAmIDB4RkY7Ci0JCXJnID0gd29yZCA+PiA4ICYgMHhGRjsKLQkJbGcgPSAobGcgKiBtYXNrICsgbWFzayAvIDIpIC8gMTAwOwotCQlyZyA9IChyZyAqIG1hc2sgKyBtYXNrIC8gMikgLyAxMDA7Ci0JCSpsZWZ0ID0gZ3AtPm1pbl9nYWluICsgZ3AtPmdhaW5fc3RlcCAqIGxnOwotCQkqcmlnaHQgPSBncC0+bWluX2dhaW4gKyBncC0+Z2Fpbl9zdGVwICogcmc7Ci0JCXJldHVybiAwOwotCX0JCi0KLUFuZCBoZXJlIGlzIHRoZSBjb3JyZXNwb25kaW5nIHJvdXRpbmUgdG8gc2V0IGEgY2hhbm5lbCdzIGdhaW4gaW4gZEIuCi0KLQlpbnQgc2V0X2dhaW5fZEIoaW50IGZkLCBjb25zdCBnYWluX2Rlc2NfdCAqZ3AsIGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KQotCXsKLQkJZmxvYXQgbWF4X2dhaW4gPQotCQkJZ3AtPm1pbl9nYWluICsgKDEgPDwgZ3AtPm5iaXRzKSAqIGdwLT5nYWluX3N0ZXA7Ci0JCWZsb2F0IHJvdW5kID0gZ3AtPmdhaW5fc3RlcCAvIDI7Ci0JCWludCBtYXNrID0gKDEgPDwgZ3AtPm5iaXRzKSAtIDE7Ci0JCWludCB3b3JkOwotCQlpbnQgbGcsIHJnOwotCi0JCWlmIChsZWZ0IDwgZ3AtPm1pbl9nYWluIHx8IHJpZ2h0IDwgZ3AtPm1pbl9nYWluKQotCQkJcmV0dXJuIEVJTlZBTDsKLQkJbGcgPSAobGVmdCAtIGdwLT5taW5fZ2FpbiArIHJvdW5kKSAvIGdwLT5nYWluX3N0ZXA7Ci0JCXJnID0gKHJpZ2h0IC0gZ3AtPm1pbl9nYWluICsgcm91bmQpIC8gZ3AtPmdhaW5fc3RlcDsKLQkJaWYgKGxnID49ICgxIDw8IGdwLT5uYml0cykgfHwgcmcgPj0gKDEgPDwgZ3AtPm5iaXRzKSkKLQkJCXJldHVybiBFSU5WQUw7Ci0JCWxnID0gKDEwMCAqIGxnICsgbWFzayAvIDIpIC8gbWFzazsKLQkJcmcgPSAoMTAwICogcmcgKyBtYXNrIC8gMikgLyBtYXNrOwotCQl3b3JkID0gbGcgfCByZyA8PCA4OwotCi0JCXJldHVybiBpb2N0bChmZCwgTUlYRVJfV1JJVEUoZ3AtPmNoYW4pLCAmd29yZCk7Ci0JfQotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXYgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXYKaW5kZXggZWQyZGE1ZS4uM2QxNDAzNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2CisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldgpAQCAtODUsNiArODUsMTIgQEAKIAlTUElfTU9ERV8wLi5TUElfTU9ERV8zOyBvciBpZiB5b3UgcHJlZmVyIHlvdSBjYW4gY29tYmluZSBTUElfQ1BPTAogCShjbG9jayBwb2xhcml0eSwgaWRsZSBoaWdoIGlmZiB0aGlzIGlzIHNldCkgb3IgU1BJX0NQSEEgKGNsb2NrIHBoYXNlLAogCXNhbXBsZSBvbiB0cmFpbGluZyBlZGdlIGlmZiB0aGlzIGlzIHNldCkgZmxhZ3MuCisJTm90ZSB0aGF0IHRoaXMgcmVxdWVzdCBpcyBsaW1pdGVkIHRvIFNQSSBtb2RlIGZsYWdzIHRoYXQgZml0IGluIGEKKwlzaW5nbGUgYnl0ZS4KKworICAgIFNQSV9JT0NfUkRfTU9ERTMyLCBTUElfSU9DX1dSX01PREUzMiAuLi4gcGFzcyBhIHBvaW50ZXIgdG8gYSB1aW4zMl90CisJd2hpY2ggd2lsbCByZXR1cm4gKFJEKSBvciBhc3NpZ24gKFdSKSB0aGUgZnVsbCBTUEkgdHJhbnNmZXIgbW9kZSwKKwlub3QgbGltaXRlZCB0byB0aGUgYml0cyB0aGF0IGZpdCBpbiBvbmUgYnl0ZS4KIAogICAgIFNQSV9JT0NfUkRfTFNCX0ZJUlNULCBTUElfSU9DX1dSX0xTQl9GSVJTVCAuLi4gcGFzcyBhIHBvaW50ZXIgdG8gYSBieXRlCiAJd2hpY2ggd2lsbCByZXR1cm4gKFJEKSBvciBhc3NpZ24gKFdSKSB0aGUgYml0IGp1c3RpZmljYXRpb24gdXNlZCB0bwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X2ZkeC5jIGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X2ZkeC5jCmluZGV4IDM2ZWMwNzcuLjBlYTNlNTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl9mZHguYworKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfZmR4LmMKQEAgLTc4LDEwICs3OCwxMCBAQAogCiBzdGF0aWMgdm9pZCBkdW1wc3RhdChjb25zdCBjaGFyICpuYW1lLCBpbnQgZmQpCiB7Ci0JX191OAltb2RlLCBsc2IsIGJpdHM7Ci0JX191MzIJc3BlZWQ7CisJX191OAlsc2IsIGJpdHM7CisJX191MzIJbW9kZSwgc3BlZWQ7CiAKLQlpZiAoaW9jdGwoZmQsIFNQSV9JT0NfUkRfTU9ERSwgJm1vZGUpIDwgMCkgeworCWlmIChpb2N0bChmZCwgU1BJX0lPQ19SRF9NT0RFMzIsICZtb2RlKSA8IDApIHsKIAkJcGVycm9yKCJTUEkgcmRfbW9kZSIpOwogCQlyZXR1cm47CiAJfQpAQCAtOTgsNyArOTgsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcHJpbnRmKCIlczogc3BpIG1vZGUgJWQsICVkIGJpdHMgJXNwZXIgd29yZCwgJWQgSHogbWF4XG4iLAorCXByaW50ZigiJXM6IHNwaSBtb2RlIDB4JXgsICVkIGJpdHMgJXNwZXIgd29yZCwgJWQgSHogbWF4XG4iLAogCQluYW1lLCBtb2RlLCBiaXRzLCBsc2IgPyAiKGxzYiBmaXJzdCkgIiA6ICIiLCBzcGVlZCk7CiB9CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl90ZXN0LmMgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfdGVzdC5jCmluZGV4IDE2ZmVkYTkuLjNhMmY5ZDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl90ZXN0LmMKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X3Rlc3QuYwpAQCAtMzAsNyArMzAsNyBAQAogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqZGV2aWNlID0gIi9kZXYvc3BpZGV2MS4xIjsKLXN0YXRpYyB1aW50OF90IG1vZGU7CitzdGF0aWMgdWludDMyX3QgbW9kZTsKIHN0YXRpYyB1aW50OF90IGJpdHMgPSA4Owogc3RhdGljIHVpbnQzMl90IHNwZWVkID0gNTAwMDAwOwogc3RhdGljIHVpbnQxNl90IGRlbGF5OwpAQCAtNTcsNiArNTcsMjEgQEAKIAkJLmJpdHNfcGVyX3dvcmQgPSBiaXRzLAogCX07CiAKKwlpZiAobW9kZSAmIFNQSV9UWF9RVUFEKQorCQl0ci50eF9uYml0cyA9IDQ7CisJZWxzZSBpZiAobW9kZSAmIFNQSV9UWF9EVUFMKQorCQl0ci50eF9uYml0cyA9IDI7CisJaWYgKG1vZGUgJiBTUElfUlhfUVVBRCkKKwkJdHIucnhfbmJpdHMgPSA0OworCWVsc2UgaWYgKG1vZGUgJiBTUElfUlhfRFVBTCkKKwkJdHIucnhfbmJpdHMgPSAyOworCWlmICghKG1vZGUgJiBTUElfTE9PUCkpIHsKKwkJaWYgKG1vZGUgJiAoU1BJX1RYX1FVQUQgfCBTUElfVFhfRFVBTCkpCisJCQl0ci5yeF9idWYgPSAwOworCQllbHNlIGlmIChtb2RlICYgKFNQSV9SWF9RVUFEIHwgU1BJX1JYX0RVQUwpKQorCQkJdHIudHhfYnVmID0gMDsKKwl9CisKIAlyZXQgPSBpb2N0bChmZCwgU1BJX0lPQ19NRVNTQUdFKDEpLCAmdHIpOwogCWlmIChyZXQgPCAxKQogCQlwYWJvcnQoImNhbid0IHNlbmQgc3BpIG1lc3NhZ2UiKTsKQEAgLTgxLDcgKzk2LDExIEBACiAJICAgICAiICAtTyAtLWNwb2wgICAgIGNsb2NrIHBvbGFyaXR5XG4iCiAJICAgICAiICAtTCAtLWxzYiAgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdFxuIgogCSAgICAgIiAgLUMgLS1jcy1oaWdoICBjaGlwIHNlbGVjdCBhY3RpdmUgaGlnaFxuIgotCSAgICAgIiAgLTMgLS0zd2lyZSAgICBTSS9TTyBzaWduYWxzIHNoYXJlZFxuIik7CisJICAgICAiICAtMyAtLTN3aXJlICAgIFNJL1NPIHNpZ25hbHMgc2hhcmVkXG4iCisJICAgICAiICAtTiAtLW5vLWNzICAgIG5vIGNoaXAgc2VsZWN0XG4iCisJICAgICAiICAtUiAtLXJlYWR5ICAgIHNsYXZlIHB1bGxzIGxvdyB0byBwYXVzZVxuIgorCSAgICAgIiAgLTIgLS1kdWFsICAgICBkdWFsIHRyYW5zZmVyXG4iCisJICAgICAiICAtNCAtLXF1YWQgICAgIHF1YWQgdHJhbnNmZXJcbiIpOwogCWV4aXQoMSk7CiB9CiAKQEAgLTEwMSwxMSArMTIwLDEzIEBACiAJCQl7ICIzd2lyZSIsICAgMCwgMCwgJzMnIH0sCiAJCQl7ICJuby1jcyIsICAgMCwgMCwgJ04nIH0sCiAJCQl7ICJyZWFkeSIsICAgMCwgMCwgJ1InIH0sCisJCQl7ICJkdWFsIiwgICAgMCwgMCwgJzInIH0sCisJCQl7ICJxdWFkIiwgICAgMCwgMCwgJzQnIH0sCiAJCQl7IE5VTEwsIDAsIDAsIDAgfSwKIAkJfTsKIAkJaW50IGM7CiAKLQkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJEOnM6ZDpiOmxIT0xDM05SIiwgbG9wdHMsIE5VTEwpOworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkQ6czpkOmI6bEhPTEMzTlIyNCIsIGxvcHRzLCBOVUxMKTsKIAogCQlpZiAoYyA9PSAtMSkKIAkJCWJyZWFrOwpAQCAtMTQ3LDExICsxNjgsMjMgQEAKIAkJY2FzZSAnUic6CiAJCQltb2RlIHw9IFNQSV9SRUFEWTsKIAkJCWJyZWFrOworCQljYXNlICcyJzoKKwkJCW1vZGUgfD0gU1BJX1RYX0RVQUw7CisJCQlicmVhazsKKwkJY2FzZSAnNCc6CisJCQltb2RlIHw9IFNQSV9UWF9RVUFEOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludF91c2FnZShhcmd2WzBdKTsKIAkJCWJyZWFrOwogCQl9CiAJfQorCWlmIChtb2RlICYgU1BJX0xPT1ApIHsKKwkJaWYgKG1vZGUgJiBTUElfVFhfRFVBTCkKKwkJCW1vZGUgfD0gU1BJX1JYX0RVQUw7CisJCWlmIChtb2RlICYgU1BJX1RYX1FVQUQpCisJCQltb2RlIHw9IFNQSV9SWF9RVUFEOworCX0KIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKQEAgLTE2OCwxMSArMjAxLDExIEBACiAJLyoKIAkgKiBzcGkgbW9kZQogCSAqLwotCXJldCA9IGlvY3RsKGZkLCBTUElfSU9DX1dSX01PREUsICZtb2RlKTsKKwlyZXQgPSBpb2N0bChmZCwgU1BJX0lPQ19XUl9NT0RFMzIsICZtb2RlKTsKIAlpZiAocmV0ID09IC0xKQogCQlwYWJvcnQoImNhbid0IHNldCBzcGkgbW9kZSIpOwogCi0JcmV0ID0gaW9jdGwoZmQsIFNQSV9JT0NfUkRfTU9ERSwgJm1vZGUpOworCXJldCA9IGlvY3RsKGZkLCBTUElfSU9DX1JEX01PREUzMiwgJm1vZGUpOwogCWlmIChyZXQgPT0gLTEpCiAJCXBhYm9ydCgiY2FuJ3QgZ2V0IHNwaSBtb2RlIik7CiAKQEAgLTE5OCw3ICsyMzEsNyBAQAogCWlmIChyZXQgPT0gLTEpCiAJCXBhYm9ydCgiY2FuJ3QgZ2V0IG1heCBzcGVlZCBoeiIpOwogCi0JcHJpbnRmKCJzcGkgbW9kZTogJWRcbiIsIG1vZGUpOworCXByaW50Zigic3BpIG1vZGU6IDB4JXhcbiIsIG1vZGUpOwogCXByaW50ZigiYml0cyBwZXIgd29yZDogJWRcbiIsIGJpdHMpOwogCXByaW50ZigibWF4IHNwZWVkOiAlZCBIeiAoJWQgS0h6KVxuIiwgc3BlZWQsIHNwZWVkLzEwMDApOwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dAppbmRleCBlNTUxMjRlLi5lYzhiZTQ2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKQEAgLTMyMCwxMCArMzIwLDExIEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLWh1bmdfdGFza193YXJuaW5nOgoraHVuZ190YXNrX3dhcm5pbmdzOgogCiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd2FybmluZ3MgdG8gcmVwb3J0LiBEdXJpbmcgYSBjaGVjayBpbnRlcnZhbAotV2hlbiB0aGlzIHZhbHVlIGlzIHJlYWNoZWQsIG5vIG1vcmUgdGhlIHdhcm5pbmdzIHdpbGwgYmUgcmVwb3J0ZWQuCitpZiBhIGh1bmcgdGFzayBpcyBkZXRlY3RlZCwgdGhpcyB2YWx1ZSBpcyBkZWNyZWFzZWQgYnkgMS4KK1doZW4gdGhpcyB2YWx1ZSByZWFjaGVzIDAsIG5vIG1vcmUgd2FybmluZ3Mgd2lsbCBiZSByZXBvcnRlZC4KIFRoaXMgZmlsZSBzaG93cyB1cCBpZiBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBlbmFibGVkLgogCiAtMTogcmVwb3J0IGFuIGluZmluaXRlIG51bWJlciBvZiB3YXJuaW5ncy4KQEAgLTQ0MSw4ICs0NDIsNyBAQAogZmVhdHVyZSBpcyB0b28gaGlnaCB0aGVuIHRoZSByYXRlIHRoZSBrZXJuZWwgc2FtcGxlcyBmb3IgTlVNQSBoaW50aW5nCiBmYXVsdHMgbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIG51bWFfYmFsYW5jaW5nX3NjYW5fcGVyaW9kX21pbl9tcywKIG51bWFfYmFsYW5jaW5nX3NjYW5fZGVsYXlfbXMsIG51bWFfYmFsYW5jaW5nX3NjYW5fcGVyaW9kX21heF9tcywKLW51bWFfYmFsYW5jaW5nX3NjYW5fc2l6ZV9tYiwgbnVtYV9iYWxhbmNpbmdfc2V0dGxlX2NvdW50IHN5c2N0bHMgYW5kCi1udW1hX2JhbGFuY2luZ19taWdyYXRlX2RlZmVycmVkLgorbnVtYV9iYWxhbmNpbmdfc2Nhbl9zaXplX21iLCBhbmQgbnVtYV9iYWxhbmNpbmdfc2V0dGxlX2NvdW50IHN5c2N0bHMuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTQ4MywxMyArNDgzLDYgQEAKIG51bWFfYmFsYW5jaW5nX3NjYW5fc2l6ZV9tYiBpcyBob3cgbWFueSBtZWdhYnl0ZXMgd29ydGggb2YgcGFnZXMgYXJlCiBzY2FubmVkIGZvciBhIGdpdmVuIHNjYW4uCiAKLW51bWFfYmFsYW5jaW5nX21pZ3JhdGVfZGVmZXJyZWQgaXMgaG93IG1hbnkgcGFnZSBtaWdyYXRpb25zIGdldCBza2lwcGVkCi11bmNvbmRpdGlvbmFsbHksIGFmdGVyIGEgcGFnZSBtaWdyYXRpb24gaXMgc2tpcHBlZCBiZWNhdXNlIGEgcGFnZSBpcyBzaGFyZWQKLXdpdGggb3RoZXIgdGFza3MuIFRoaXMgcmVkdWNlcyBwYWdlIG1pZ3JhdGlvbiBvdmVyaGVhZCwgYW5kIGRldGVybWluZXMKLWhvdyBtdWNoIHN0cm9uZ2VyIHRoZSAibW92ZSB0YXNrIG5lYXIgaXRzIG1lbW9yeSIgcG9saWN5IHNjaGVkdWxlciBiZWNvbWVzLAotdmVyc3VzIHRoZSAibW92ZSBtZW1vcnkgbmVhciBpdHMgdGFzayIgbWVtb3J5IG1hbmFnZW1lbnQgcG9saWN5LCBmb3Igd29ya2xvYWRzCi13aXRoIHNoYXJlZCBtZW1vcnkuCi0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIG9zcmVsZWFzZSwgb3N0eXBlICYgdmVyc2lvbjoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDkwCmluZGV4IDI4MTc2ZGUuLjNlMDkxMTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAKKysrIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MApAQCAtMjEsOCArMjEsNiBAQAogLSBUaGUgd2VhayBwdWxsdXAgY3VycmVudCBpcyBhIG1pbmltdW0gb2YgMC45bUEgYW5kIG1heGltdW0gb2YgNi4wbUEuCiAtIFRoZSA1ViBzdHJvbmcgcHVsbHVwIGlzIHN1cHBvcnRlZCB3aXRoIGEgbWluaW11bSBvZiA1LjltQSBhbmQgYQogICBtYXhpbXVtIG9mIDMwLjQgbUEuICAoRnJvbSBEUzI0OTAucGRmKQotLSBXaGlsZSB0aGUgZHMyNDkwIHN1cHBvcnRzIGEgaGFyZHdhcmUgc2VhcmNoIHRoZSBjb2RlIGRvZXNuJ3QgdGFrZQotICBhZHZhbnRhZ2Ugb2YgaXQgKGluIHRlc3RlZCBjYXNlIGl0IG9ubHkgcmV0dXJuZWQgZmlyc3QgZGV2aWNlKS4KIC0gVGhlIGhhcmR3YXJlIHdpbGwgZGV0ZWN0IHdoZW4gZGV2aWNlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIGJ1cyBvbiB0aGUKICAgbmV4dCBidXMgKHJlc2V0Pykgb3BlcmF0aW9uLCBob3dldmVyIG9ubHkgYSBtZXNzYWdlIGlzIHByaW50ZWQgYXMKICAgdGhlIGNvcmUgdzEgY29kZSBkb2Vzbid0IG1ha2UgdXNlIG9mIHRoZSBpbmZvcm1hdGlvbi4gIENvbm5lY3RpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluayBiL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluawppbmRleCBmNTlhMzE5Li45MjdhNTJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKKysrIGIvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rCkBAIC01LDggKzUsOCBAQAogPT09PT09PT09PT09PQogCiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbWVzc2FnZXMgYmV0d2VlbiB3MSBjb3JlIGFuZCB1c2Vyc3BhY2U6Ci0xLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgbmV3IG1hc3RlciBvciBzbGF2ZSBkZXZpY2UKLQlmb3VuZCBlaXRoZXIgZHVlIHRvIGF1dG9tYXRpYyBvciByZXF1ZXN0ZWQgc2VhcmNoLgorMS4gRXZlbnRzLiBUaGV5IGFyZSBnZW5lcmF0ZWQgZWFjaCB0aW1lIGEgbmV3IG1hc3RlciBvciBzbGF2ZSBkZXZpY2UKKwlpcyBmb3VuZCBlaXRoZXIgZHVlIHRvIGF1dG9tYXRpYyBvciByZXF1ZXN0ZWQgc2VhcmNoLgogMi4gVXNlcnNwYWNlIGNvbW1hbmRzLgogMy4gUmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMuCiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogb2YgdGhlIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpIGFuZCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKS4KIElmIHJlcGx5IGlzIGdlbmVyYXRlZCBmb3IgbWFzdGVyIG9yIHJvb3QgY29tbWFuZCAod2hpY2ggZG8gbm90IGhhdmUKIHcxX25ldGxpbmtfY21kIGF0dGFjaGVkKSwgcmVwbHkgd2lsbCBjb250YWluIG9ubHkgY25fbXNnIGFuZCB3MV9uZXRsaW5rX21zZwotc3RydWN0aXJlcy4KK3N0cnVjdHVyZXMuCiAKIHcxX25ldGxpbmtfbXNnLnN0YXR1cyBmaWVsZCB3aWxsIGNhcnJ5IHBvc2l0aXZlIGVycm9yIHZhbHVlCiAoRUlOVkFMIGZvciBleGFtcGxlKSBvciB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KQEAgLTE2MCw3ICsxNjAsNyBAQAogVGhlbiBhbGwgcmVxdWVzdGVkIGluIHcxX25ldGxpbmtfbXNnIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbmUgYnkgb25lLgogSWYgY29tbWFuZCByZXF1aXJlcyByZXBseSAobGlrZSByZWFkIGNvbW1hbmQpIGl0IGlzIHNlbnQgb24gY29tbWFuZCBjb21wbGV0aW9uLgogCi1XaGVuIGFsbCBjb21tYW5kcyAodzFfbmV0bGlua19jbWQpIGFyZSBwcm9jZXNzZWQgbXVzdGVyIGRldmljZSBpcyB1bmxvY2tlZAorV2hlbiBhbGwgY29tbWFuZHMgKHcxX25ldGxpbmtfY21kKSBhcmUgcHJvY2Vzc2VkIG1hc3RlciBkZXZpY2UgaXMgdW5sb2NrZWQKIGFuZCBuZXh0IHcxX25ldGxpbmtfbXNnIGhlYWRlciBwcm9jZXNzaW5nIHN0YXJ0ZWQuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctcGFyYW1ldGVycy50eHQKaW5kZXggZjk0OTJmZS4uNjkyNzkxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLXBhcmFtZXRlcnMudHh0CkBAIC0xNTAsNiArMTUwLDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGl0ODdfd2R0Ogogbm9nYW1lcG9ydDogRm9yYmlkIHRoZSBhY3RpdmF0aW9uIG9mIGdhbWUgcG9ydCwgZGVmYXVsdD0wCitub2NpcjogRm9yYmlkIHRoZSB1c2Ugb2YgQ0lSICh3b3JrYXJvdW5kIGZvciBzb21lIGJ1Z2d5IHNldHVwcyk7IHNldCB0byAxIGlmCitzeXN0ZW0gcmVzZXRzIGRlc3BpdGUgd2F0Y2hkb2cgZGFlbW9uIHJ1bm5pbmcsIGRlZmF1bHQ9MAogZXhjbHVzaXZlOiBXYXRjaGRvZyBleGNsdXNpdmUgZGV2aWNlIG9wZW4sIGRlZmF1bHQ9MQogdGltZW91dDogV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLCBkZWZhdWx0PTYwCiB0ZXN0bW9kZTogV2F0Y2hkb2cgdGVzdCBtb2RlICgxID0gbm8gcmVib290KSwgZGVmYXVsdD0wCkBAIC0zMjUsNiArMzI3LDExIEBACiBzdG1wM3h4eF93ZHQ6CiBoZWFydGJlYXQ6IFdhdGNoZG9nIGhlYXJ0YmVhdCBwZXJpb2QgaW4gc2Vjb25kcyBmcm9tIDEgdG8gNDE5NDMwNCwgZGVmYXVsdCAxOQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordGVncmFfd2R0OgoraGVhcnRiZWF0OiBXYXRjaGRvZyBoZWFydGJlYXRzIGluIHNlY29uZHMuIChkZWZhdWx0ID0gMTIwKQorbm93YXlvdXQ6IFdhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZAorCShkZWZhdWx0PWtlcm5lbCBjb25maWcgcGFyYW1ldGVyKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdHM3Mnh4X3dkdDoKIHRpbWVvdXQ6IFdhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gKDEgPD0gdGltZW91dCA8PSA4LCBkZWZhdWx0PTgpCiBub3dheW91dDogRGlzYWJsZSB3YXRjaGRvZyBzaHV0ZG93biBvbiBjbG9zZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAppbmRleCBjYjgxNzQxZC4uYTc1ZTNhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKQEAgLTE4Miw3ICsxODIsNyBAQAogMDIyNi8xCTIuMDIrKDMgZXh0X2xvYWRlcl92ZXIJRXh0ZW5kZWQgYm9vdCBsb2FkZXIgdmVyc2lvbgogMDIyNy8xCTIuMDIrKDMJZXh0X2xvYWRlcl90eXBlCUV4dGVuZGVkIGJvb3QgbG9hZGVyIElECiAwMjI4LzQJMi4wMisJY21kX2xpbmVfcHRyCTMyLWJpdCBwb2ludGVyIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lCi0wMjJDLzQJMi4wMysJcmFtZGlza19tYXgJSGlnaGVzdCBsZWdhbCBpbml0cmQgYWRkcmVzcworMDIyQy80CTIuMDMrCWluaXRyZF9hZGRyX21heAlIaWdoZXN0IGxlZ2FsIGluaXRyZCBhZGRyZXNzCiAwMjMwLzQJMi4wNSsJa2VybmVsX2FsaWdubWVudCBQaHlzaWNhbCBhZGRyIGFsaWdubWVudCByZXF1aXJlZCBmb3Iga2VybmVsCiAwMjM0LzEJMi4wNSsJcmVsb2NhdGFibGVfa2VybmVsIFdoZXRoZXIga2VybmVsIGlzIHJlbG9jYXRhYmxlIG9yIG5vdAogMDIzNS8xCTIuMTArCW1pbl9hbGlnbm1lbnQJTWluaW11bSBhbGlnbm1lbnQsIGFzIGEgcG93ZXIgb2YgdHdvCkBAIC01MzQsNyArNTM0LDcgQEAKICAgemVybywgdGhlIGtlcm5lbCB3aWxsIGFzc3VtZSB0aGF0IHlvdXIgYm9vdCBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydAogICB0aGUgMi4wMisgcHJvdG9jb2wuCiAKLUZpZWxkIG5hbWU6CXJhbWRpc2tfbWF4CitGaWVsZCBuYW1lOglpbml0cmRfYWRkcl9tYXgKIFR5cGU6CQlyZWFkCiBPZmZzZXQvc2l6ZToJMHgyMmMvNAogUHJvdG9jb2w6CTIuMDMrCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDlkMzNjY2IuLmUyZWQ2OWYgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC05MTEsMTEgKzkxMSwxMSBAQAogRjoJYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlLwogCiBBUk0vRlJFRVNDQUxFIElNWCAvIE1YQyBBUk0gQVJDSElURUNUVVJFCi1NOglTaGF3biBHdW8gPHNoYXduLmd1b0BsaW5hcm8ub3JnPgorTToJU2hhd24gR3VvIDxzaGF3bi5ndW9AZnJlZXNjYWxlLmNvbT4KIE06CVNhc2NoYSBIYXVlciA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CU1haW50YWluZWQKLVQ6CWdpdCBnaXQ6Ly9naXQubGluYXJvLm9yZy9wZW9wbGUvc2hhd25ndW8vbGludXgtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zaGF3bmd1by9saW51eC5naXQKIEY6CWFyY2gvYXJtL21hY2gtaW14LwogRjoJYXJjaC9hcm0vYm9vdC9kdHMvaW14KgogRjoJYXJjaC9hcm0vY29uZmlncy9pbXgqX2RlZmNvbmZpZwpAQCAtMTMyMCw2ICsxMzIwLDcgQEAKIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglTdXBwb3J0ZWQKIEY6CWFyY2gvYXJtL21hY2gtdTMwMC8KK0Y6CWRyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdTMwMC5jCiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dTMwMC5jCiBGOglkcml2ZXJzL3J0Yy9ydGMtY29oOTAxMzMxLmMKIEY6CWRyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCkBAIC0xODMyLDggKzE4MzMsOCBAQAogRjoJaW5jbHVkZS9uZXQvYmx1ZXRvb3RoLwogCiBCT05ESU5HIERSSVZFUgotTToJSmF5IFZvc2J1cmdoIDxmdWJhckB1cy5pYm0uY29tPgotTToJVmVhY2VzbGF2IEZhbGljbyA8dmZhbGljb0ByZWRoYXQuY29tPgorTToJSmF5IFZvc2J1cmdoIDxqLnZvc2J1cmdoQGdtYWlsLmNvbT4KK006CVZlYWNlc2xhdiBGYWxpY28gPHZmYWxpY29AZ21haWwuY29tPgogTToJQW5keSBHb3Nwb2RhcmVrIDxhbmR5QGdyZXlob3VzZS5uZXQ+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2JvbmRpbmcvCkBAIC0xOTIwLDggKzE5MjEsOCBAQAogRjoJaW5jbHVkZS9saW51eC9iY21hLwogCiBCUk9DQURFIEJGQSBGQyBTQ1NJIERSSVZFUgotTToJQW5pbCBHdXJ1bXVydGh5IDxhZ3VydW11ckBicm9jYWRlLmNvbT4KLU06CVZpamF5YSBNb2hhbiBHdXZ2YSA8dm1vaGFuQGJyb2NhZGUuY29tPgorTToJQW5pbCBHdXJ1bXVydGh5IDxhbmlsLmd1cnVtdXJ0aHlAcWxvZ2ljLmNvbT4KK006CVN1ZGFyc2FuYSBLYWxsdXJ1IDxzdWRhcnNhbmEua2FsbHVydUBxbG9naWMuY29tPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9zY3NpL2JmYS8KQEAgLTIyMDMsNiArMjIwNCwxMyBAQAogUzoJT2RkIEZpeGVzCiBGOglzb3VuZC9zb2MvY29kZWNzL2NzNDI3MCoKIAorQ0lSUlVTIExPR0lDIEFVRElPIENPREVDIERSSVZFUlMKK006CUJyaWFuIEF1c3RpbiA8YnJpYW4uYXVzdGluQGNpcnJ1cy5jb20+CitNOglQYXVsIEhhbmRyaWdhbiA8UGF1bC5IYW5kcmlnYW5AY2lycnVzLmNvbT4KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglNYWludGFpbmVkCitGOglzb3VuZC9zb2MvY29kZWNzL2NzKgorCiBDTEVBTkNBQ0hFIEFQSQogTToJS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwpAQCAtMjgwMSw5ICsyODA5LDkgQEAKIEY6CWRyaXZlcnMvYWNwaS9kb2NrLmMKIAogRE9DVU1FTlRBVElPTgotTToJUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KK006CVJhbmR5IER1bmxhcCA8cmR1bmxhcEBpbmZyYWRlYWQub3JnPgogTDoJbGludXgtZG9jQHZnZXIua2VybmVsLm9yZwotVDoJVEJECitUOglxdWlsdCBodHRwOi8vd3d3LmluZnJhZGVhZC5vcmcvfnJkdW5sYXAvRG9jL3BhdGNoZXMvCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uLwogCkBAIC00NTQ1LDYgKzQ1NTMsNyBAQAogTToJQWxleCBEdXljayA8YWxleGFuZGVyLmguZHV5Y2tAaW50ZWwuY29tPgogTToJSm9obiBSb25jaWFrIDxqb2huLnJvbmNpYWtAaW50ZWwuY29tPgogTToJTWl0Y2ggV2lsbGlhbXMgPG1pdGNoLmEud2lsbGlhbXNAaW50ZWwuY29tPgorTToJTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CiBMOgllMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly93d3cuaW50ZWwuY29tL3N1cHBvcnQvZmVlZGJhY2suaHRtCiBXOglodHRwOi8vZTEwMDAuc291cmNlZm9yZ2UubmV0LwpAQCAtNTI0NSwxMSArNTI1NCwxMCBAQAogRjoJYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4LwogCiBMSU5VWCBGT1IgUE9XRVJQQyBFTUJFRERFRCBQUEM0WFgKLU06CUpvc2ggQm95ZXIgPGp3Ym95ZXJAZ21haWwuY29tPgorTTogIEFsaXN0YWlyIFBvcHBsZSA8YWxpc3RhaXJAcG9wcGxlLmlkLmF1PgogTToJTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KIFc6CWh0dHA6Ly93d3cucGVuZ3VpbnBwYy5vcmcvCiBMOglsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZwotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qd2JveWVyL3Bvd2VycGMtNHh4LmdpdAogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvCiBGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC8KQEAgLTU2ODcsNiArNTY5NSwxMiBAQAogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3dhdGNoZG9nL21lbmEyMV93ZHQuYwogCitNRU4gQ0hBTUVMRU9OIEJVUyAobWNiKQorTTogIAlKb2hhbm5lcyBUaHVtc2hpcm4gPGpvaGFubmVzLnRodW1zaGlybkBtZW4uZGU+CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbWNiLworRjoJaW5jbHVkZS9saW51eC9tY2IuaAorCiBNRVRBRyBBUkNISVRFQ1RVUkUKIE06CUphbWVzIEhvZ2FuIDxqYW1lcy5ob2dhbkBpbWd0ZWMuY29tPgogTDoJbGludXgtbWV0YWdAdmdlci5rZXJuZWwub3JnCkBAIC02MDA1LDYgKzYwMTksNyBAQAogRjoJaW5jbHVkZS91YXBpL2xpbnV4L25ldGRldmljZS5oCiBGOgl0b29scy9uZXQvCiBGOgl0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvCitGOglsaWIvcmFuZG9tMzIuYwogCiBORVRXT1JLSU5HIFtJUHY0L0lQdjZdCiBNOgkiRGF2aWQgUy4gTWlsbGVyIiA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KQEAgLTc0MDMsMTAgKzc0MTgsMjYgQEAKIFM6CVN1cHBvcnRlZAogRjoJYXJjaC9zMzkwLwogRjoJZHJpdmVycy9zMzkwLwotRjoJYmxvY2svcGFydGl0aW9ucy9pYm0uYwogRjoJRG9jdW1lbnRhdGlvbi9zMzkwLwogRjoJRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3MzOTAqCiAKK1MzOTAgQ09NTU9OIEkvTyBMQVlFUgorTToJU2ViYXN0aWFuIE90dCA8c2Vib3R0QGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CVBldGVyIE9iZXJwYXJsZWl0ZXIgPG9iZXJwYXJAbGludXgudm5ldC5pYm0uY29tPgorTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9zMzkwL2Npby8KKworUzM5MCBEQVNEIERSSVZFUgorTToJU3RlZmFuIFdlaW5odWJlciA8d2VpbkBkZS5pYm0uY29tPgorTToJU3RlZmFuIEhhYmVybGFuZCA8c3RlZmFuLmhhYmVybGFuZEBkZS5pYm0uY29tPgorTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QqCitGOglibG9jay9wYXJ0aXRpb25zL2libS5jCisKIFMzOTAgTkVUV09SSyBEUklWRVJTCiBNOglVcnN1bGEgQnJhdW4gPHVyc3VsYS5icmF1bkBkZS5pYm0uY29tPgogTToJRnJhbmsgQmxhc2Noa2EgPGJsYXNjaGthQGxpbnV4LnZuZXQuaWJtLmNvbT4KQEAgLTc0MTYsNiArNzQ0NywxNSBAQAogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3MzOTAvbmV0LwogCitTMzkwIFBDSSBTVUJTWVNURU0KK006CVNlYmFzdGlhbiBPdHQgPHNlYm90dEBsaW51eC52bmV0LmlibS5jb20+CitNOglHZXJhbGQgU2NoYWVmZXIgPGdlcmFsZC5zY2hhZWZlckBkZS5pYm0uY29tPgorTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KK1M6CVN1cHBvcnRlZAorRjoJYXJjaC9zMzkwL3BjaS8KK0Y6CWRyaXZlcnMvcGNpL2hvdHBsdWcvczM5MF9wY2lfaHBjLmMKKwogUzM5MCBaQ1JZUFQgRFJJVkVSCiBNOglJbmdvIFR1Y2hzY2hlcmVyIDxpbmdvLnR1Y2hzY2hlcmVyQGRlLmlibS5jb20+CiBNOglsaW51eDM5MEBkZS5pYm0uY29tCkBAIC03Nzk5LDEzICs3ODM5LDYgQEAKIEY6CWRyaXZlcnMvdHR5L3NlcmlhbC9pb2M/X3NlcmlhbC5jCiBGOglpbmNsdWRlL2xpbnV4L2lvYz8uaAogCi1TR0kgVklTVUFMIFdPUktTVEFUSU9OIDMyMCBBTkQgNTQwCi1NOglBbmRyZXkgUGFuaW4gPHBhemtlQGRvbnBhYy5ydT4KLUw6CWxpbnV4LXZpc3dzLWRldmVsQGxpc3RzLnNmLm5ldAotVzoJaHR0cDovL2xpbnV4LXZpc3dzLnNmLm5ldAotUzoJTWFpbnRhaW5lZCBmb3IgMi42LgotRjoJRG9jdW1lbnRhdGlvbi9zZ2ktdmlzd3MudHh0Ci0KIFNHSSBYUC9YUEMvWFBORVQgRFJJVkVSCiBNOglDbGlmZiBXaGlja21hbiA8Y3B3QHNnaS5jb20+CiBNOglSb2JpbiBIb2x0IDxyb2Jpbm1ob2x0QGdtYWlsLmNvbT4KQEAgLTgzNTMsNiArODM4NiwxMiBAQAogUzoJT2RkIEZpeGVzCiBGOglkcml2ZXJzL3N0YWdpbmcvc203eHhmYi8KIAorU1RBR0lORyAtIFNMSUNPU1MKK006CUxpb3IgRG90YW4gPGxpb2RvdEBnbWFpbC5jb20+CitNOglDaHJpc3RvcGhlciBIYXJyZXIgPGNoYXJyZXJAYWxhY3JpdGVjaC5jb20+CitTOglPZGQgRml4ZXMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9zbGljb3NzLworCiBTVEFHSU5HIC0gU09GVExPR0lDIDZ4MTAgTVBFRyBDT0RFQwogTToJSXNtYWVsIEx1Y2VubyA8aXNtYWVsLmx1Y2Vub0Bjb3JwLmJsdWVjaGVycnkubmV0PgogUzoJU3VwcG9ydGVkCkBAIC05MDM4LDYgKzkwNzcsMTMgQEAKIEY6CWluY2x1ZGUvbGludXgvY2Ryb20uaAogRjoJaW5jbHVkZS91YXBpL2xpbnV4L2Nkcm9tLmgKIAorVU5JU1lTIFMtUEFSIERSSVZFUlMKK006ICAgICBCZW5qYW1pbiBSb21lciA8YmVuamFtaW4ucm9tZXJAdW5pc3lzLmNvbT4KK006ICAgICBEYXZpZCBLZXJzaG5lciA8ZGF2aWQua2Vyc2huZXJAdW5pc3lzLmNvbT4KK0w6ICAgICBzcGFybWFpbnRhaW5lckB1bmlzeXMuY29tIChVbmlzeXMgaW50ZXJuYWwpCitTOiAgICAgU3VwcG9ydGVkCitGOiAgICAgZHJpdmVycy9zdGFnaW5nL3VuaXN5cy8KKwogVU5JVkVSU0FMIEZMQVNIIFNUT1JBR0UgSE9TVCBDT05UUk9MTEVSIERSSVZFUgogTToJVmluYXlhayBIb2xpa2F0dGkgPHZpbmhvbGlrYXR0aUBnbWFpbC5jb20+CiBNOglTYW50b3NoIFkgPHNhbnRvc2hzeUBnbWFpbC5jb20+CkBAIC05MDc2LDggKzkxMjIsNyBAQAogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy8KIAogVVNCIEFUVEFDSEVEIFNDU0kKLU06CU1hdHRoZXcgV2lsY294IDx3aWxseUBsaW51eC5pbnRlbC5jb20+Ci1NOglTYXJhaCBTaGFycCA8c2FyYWguYS5zaGFycEBsaW51eC5pbnRlbC5jb20+CitNOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogTToJR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwpAQCAtOTMwMyw3ICs5MzQ4LDcgQEAKIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwogCiBVU0IgWEhDSSBEUklWRVIKLU06CVNhcmFoIFNoYXJwIDxzYXJhaC5hLnNoYXJwQGxpbnV4LmludGVsLmNvbT4KK006CU1hdGhpYXMgTnltYW4gPG1hdGhpYXMubnltYW5AaW50ZWwuY29tPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3VzYi9ob3N0L3hoY2kqCkBAIC05NzgxLDYgKzk4MjYsMTIgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jCiAKK1hURU5TQSBYVEZQR0EgUExBVEZPUk0gU1VQUE9SVAorTToJTWF4IEZpbGlwcG92IDxqY212YmtiY0BnbWFpbC5jb20+CitMOglsaW51eC14dGVuc2FAbGludXgteHRlbnNhLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zcGkvc3BpLXh0ZW5zYS14dGZwZ2EuYworCiBZQU0gRFJJVkVSIEZPUiBBWC4yNQogTToJSmVhbi1QYXVsIFJvdWJlbGF0IDxqcHJAZjZmYmIub3JnPgogTDoJbGludXgtaGFtc0B2Z2VyLmtlcm5lbC5vcmcKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZWY3NzllYy4uZTVhYzhhNiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gMwogUEFUQ0hMRVZFTCA9IDE0CiBTVUJMRVZFTCA9IDAKLUVYVFJBVkVSU0lPTiA9IC1yYzcKK0VYVFJBVkVSU0lPTiA9CiBOQU1FID0gU2h1ZmZsaW5nIFpvbWJpZSBKdXJvcgogCiAjICpET0NVTUVOVEFUSU9OKgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBhNzNhOGUyLi45NmU1NGJlIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw3ICsxLDkgQEAKIAotZ2VuZXJpYy15ICs9IGNsa2Rldi5oCiAKK2dlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGV4ZWMuaAotZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTc3ZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19BTFBIQV9DUFVUSU1FX0gKLSNkZWZpbmUgX19BTFBIQV9DUFVUSU1FX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KLQotI2VuZGlmIC8qIF9fQUxQSEFfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IGVkYjRlMDAuLjA3NmMzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCkBAIC0yNTQsMTIgKzI1NCw2IEBACiAJfQogfQogCi1pbnQKLXBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQogLyoKICAqICBJZiB3ZSBzZXQgdXAgYSBkZXZpY2UgZm9yIGJ1cyBtYXN0ZXJpbmcsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxhdGVuY3kKICAqICB0aW1lciBhcyBjZXJ0YWluIGZpcm13YXJlIGZvcmdldHMgdG8gc2V0IGl0IHByb3Blcmx5LCBhcyBzZWVuCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMGQzMzYyOS4uZTc2ZmQ3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwxNSArMSwxNSBAQAogZ2VuZXJpYy15ICs9IGF1eHZlYy5oCiBnZW5lcmljLXkgKz0gYmFycmllci5oCi1nZW5lcmljLXkgKz0gYnVncy5oCiBnZW5lcmljLXkgKz0gYml0c3BlcmxvbmcuaAorZ2VuZXJpYy15ICs9IGJ1Z3MuaAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCiBnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZGV2aWNlLmgKIGdlbmVyaWMteSArPSBkaXY2NC5oCiBnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAogZ2VuZXJpYy15ICs9IGVycm5vLmgKLWdlbmVyaWMteSArPSBmY250bC5oCiBnZW5lcmljLXkgKz0gZmIuaAorZ2VuZXJpYy15ICs9IGZjbnRsLmgKIGdlbmVyaWMteSArPSBmdHJhY2UuaAogZ2VuZXJpYy15ICs9IGhhcmRpcnEuaAogZ2VuZXJpYy15ICs9IGhhc2guaApAQCAtMjIsNiArMjIsNyBAQAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCiBnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtc2didWYuaAogZ2VuZXJpYy15ICs9IHBhcmFtLmgKQEAgLTMwLDYgKzMxLDcgQEAKIGdlbmVyaWMteSArPSBwZXJjcHUuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCkBAIC00OCw0ICs1MCwzIEBACiBnZW5lcmljLXkgKz0gdXNlci5oCiBnZW5lcmljLXkgKz0gdmdhLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggMTU5NDk0NS4uYjc2YWU0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC01MzQsNyArNTM0LDYgQEAKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBQSU5DVFJMX0RPVkUKIAlzZWxlY3QgUExBVF9PUklPTl9MRUdBQ1kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgTWFydmVsbCBEb3ZlIFNvQyA4OEFQNTEwCiAKQEAgLTYzMyw3ICs2MzIsNiBAQAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfSURFCiAJc2VsZWN0IEhBVkVfUFdNCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IFVTRV9PRgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBOWFAgTFBDMzJYWCBmYW1pbHkgb2YgcHJvY2Vzc29ycwpAQCAtNzcwLDcgKzc2OCw2IEBACiAJc2VsZWN0IFNBTVNVTkdfQVRBR1MKIAlzZWxlY3QgU0FNU1VOR19XQUtFTUFTSwogCXNlbGVjdCBTQU1TVU5HX1dEVF9SRVNFVAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCWhlbHAKIAkgIFNhbXN1bmcgUzNDNjRYWCBzZXJpZXMgYmFzZWQgc3lzdGVtcwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hdGxhczYuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0bGFzNi5kdHNpCmluZGV4IGY4Njc0YmMuLjBjODFkYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0bGFzNi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0bGFzNi5kdHNpCkBAIC0yMTcsOCArMjE3LDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDE3PjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAxMz47Ci0JCQkJc2lyZix1YXJ0LWRtYS1yeC1jaGFubmVsID0gPDIxPjsKLQkJCQlzaXJmLHVhcnQtZG1hLXR4LWNoYW5uZWwgPSA8Mj47CisJCQkJZG1hcyA9IDwmZG1hYzEgNT4sIDwmZG1hYzAgMj47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCXVhcnQxOiB1YXJ0QGIwMDYwMDAwIHsKQEAgLTIyOCw2ICsyMjgsNyBAQAogCQkJCWludGVycnVwdHMgPSA8MTg+OwogCQkJCWZpZm9zaXplID0gPDMyPjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMTQ+OworCQkJCWRtYS1uYW1lcyA9ICJuby1yeCIsICJuby10eCI7CiAJCQl9OwogCiAJCQl1YXJ0MjogdWFydEBiMDA3MDAwMCB7CkBAIC0yMzcsOCArMjM4LDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDE5PjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAxNT47Ci0JCQkJc2lyZix1YXJ0LWRtYS1yeC1jaGFubmVsID0gPDY+OwotCQkJCXNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCA9IDw3PjsKKwkJCQlkbWFzID0gPCZkbWFjMCA2PiwgPCZkbWFjMCA3PjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdXNwMDogdXNwQGIwMDgwMDAwIHsKQEAgLTI0OCw4ICsyNDksOCBAQAogCQkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDI4PjsKLQkJCQlzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCA9IDwxNz47Ci0JCQkJc2lyZix1c3AtZG1hLXR4LWNoYW5uZWwgPSA8MTg+OworCQkJCWRtYXMgPSA8JmRtYWMxIDE+LCA8JmRtYWMxIDI+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1c3AxOiB1c3BAYjAwOTAwMDAgewpAQCAtMjU5LDggKzI2MCw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMjk+OwotCQkJCXNpcmYsdXNwLWRtYS1yeC1jaGFubmVsID0gPDE0PjsKLQkJCQlzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCA9IDwxNT47CisJCQkJZG1hcyA9IDwmZG1hYzAgMTQ+LCA8JmRtYWMwIDE1PjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJZG1hYzA6IGRtYS1jb250cm9sbGVyQGIwMGIwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWFwZjUxZGV2LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWFwZjUxZGV2LmR0cwppbmRleCA1YTdmNTUyLi5kM2Y5ODE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg1MS1hcGY1MWRldi5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYXBmNTFkZXYuZHRzCkBAIC0xOCw3ICsxOCw2IEBACiAKIAlkaXNwbGF5QGRpMSB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKLQkJY3J0Y3MgPSA8JmlwdSAwPjsKIAkJaW50ZXJmYWNlLXBpeC1mbXQgPSAiYmdyNjY2IjsKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZwaW5jdHJsX2lwdV9kaXNwMV8xPjsKQEAgLTQxLDYgKzQwLDEyIEBACiAJCQkJcGl4ZWxjbGstYWN0aXZlID0gPDA+OwogCQkJfTsKIAkJfTsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXlfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfZGlzcDA+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJZ3Bpby1rZXlzIHsKQEAgLTEyMiwzICsxMjcsNyBAQAogCQl9OwogCX07CiB9OworCismaXB1X2RpMF9kaXNwMCB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5X2luPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1MS1iYWJiYWdlLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWJhYmJhZ2UuZHRzCmluZGV4IGJlMTQwN2MuLjY3MTkyNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWJhYmJhZ2UuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWJhYmJhZ2UuZHRzCkBAIC0yMSw5ICsyMSw4IEBACiAJCXJlZyA9IDwweDkwMDAwMDAwIDB4MjAwMDAwMDA+OwogCX07CiAKLQlkaXNwbGF5QGRpMCB7CisJZGlzcGxheTA6IGRpc3BsYXlAZGkwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwotCQljcnRjcyA9IDwmaXB1IDA+OwogCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJyZ2IyNCI7CiAJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9pcHVfZGlzcDFfMT47CkBAIC00MSwxMSArNDAsMTYgQEAKIAkJCQl2c3luYy1sZW4gPSA8MTA+OwogCQkJfTsKIAkJfTsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXkwX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2Rpc3AwPjsKKwkJCX07CisJCX07CiAJfTsKIAotCWRpc3BsYXlAZGkxIHsKKwlkaXNwbGF5MTogZGlzcGxheUBkaTEgewogCQljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7Ci0JCWNydGNzID0gPCZpcHUgMT47CiAJCWludGVyZmFjZS1waXgtZm10ID0gInJnYjU2NSI7CiAJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9pcHVfZGlzcDJfMT47CkBAIC02OCw2ICs3MiwxMiBAQAogCQkJCXBpeGVsY2xrLWFjdGl2ZSA9IDwwPjsKIAkJCX07CiAJCX07CisKKwkJcG9ydCB7CisJCQlkaXNwbGF5MV9pbjogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMV9kaXNwMT47CisJCQl9OworCQl9OwogCX07CiAKIAlncGlvLWtleXMgewpAQCAtMjU4LDYgKzI2OCwxNCBAQAogCX07CiB9OwogCismaXB1X2RpMF9kaXNwMCB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5MF9pbj47Cit9OworCismaXB1X2RpMV9kaXNwMSB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5MV9pbj47Cit9OworCiAmc3NpMiB7CiAJZnNsLG1vZGUgPSAiaTJzLXNsYXZlIjsKIAlzdGF0dXMgPSAib2theSI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEuZHRzaQppbmRleCA0YmNkZDNhLi4yOGM5NmFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kKQEAgLTc5LDYgKzc5LDExIEBACiAJCX07CiAJfTsKIAorCWRpc3BsYXktc3Vic3lzdGVtIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIjsKKwkJcG9ydHMgPSA8JmlwdV9kaTA+LCA8JmlwdV9kaTE+OworCX07CisKIAlzb2MgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CkBAIC05MiwxMyArOTcsMjggQEAKIAkJfTsKIAogCQlpcHU6IGlwdUA0MDAwMDAwMCB7Ci0JCQkjY3J0Yy1jZWxscyA9IDwxPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1pcHUiOwogCQkJcmVnID0gPDB4NDAwMDAwMDAgMHgyMDAwMDAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDExIDEwPjsKIAkJCWNsb2NrcyA9IDwmY2xrcyA1OT4sIDwmY2xrcyAxMTA+LCA8JmNsa3MgNjE+OwogCQkJY2xvY2stbmFtZXMgPSAiYnVzIiwgImRpMCIsICJkaTEiOwogCQkJcmVzZXRzID0gPCZzcmMgMj47CisKKwkJCWlwdV9kaTA6IHBvcnRAMiB7CisJCQkJcmVnID0gPDI+OworCisJCQkJaXB1X2RpMF9kaXNwMDogZW5kcG9pbnQgeworCQkJCX07CisJCQl9OworCisJCQlpcHVfZGkxOiBwb3J0QDMgeworCQkJCXJlZyA9IDwzPjsKKworCQkJCWlwdV9kaTFfZGlzcDE6IGVuZHBvaW50IHsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAogCQlhaXBzQDcwMDAwMDAwIHsgLyogQUlQUzEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW01M2V2ay5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tNTNldmsuZHRzCmluZGV4IDdkMzA0ZDAuLjAyOThhZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW01M2V2ay5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbTUzZXZrLmR0cwpAQCAtMjEsOSArMjEsOCBAQAogCX07CiAKIAlzb2MgewotCQlkaXNwbGF5QGRpMSB7CisJCWRpc3BsYXkxOiBkaXNwbGF5QGRpMSB7CiAJCQljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7Ci0JCQljcnRjcyA9IDwmaXB1IDE+OwogCQkJaW50ZXJmYWNlLXBpeC1mbXQgPSAiYmdyNjY2IjsKIAkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaXB1X2Rpc3AyXzE+OwpAQCAtNDQsNiArNDMsMTIgQEAKIAkJCQl9OwogCQkJfTsKIAkJfTsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXkxX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX2Rpc3AxPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWJhY2tsaWdodCB7CkBAIC0yMjEsNiArMjI2LDEwIEBACiAJfTsKIH07CiAKKyZpcHVfZGkxX2Rpc3AxIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXkxX2luPjsKK307CisKICZuZmMgewogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wID0gPCZwaW5jdHJsX25hbmRfMT47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tYmE1My5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tYmE1My5kdHMKaW5kZXggYTYzMDkwMi4uYTViNTVjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbWJhNTMuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW1iYTUzLmR0cwpAQCAtMzgsOSArMzgsMTQgQEAKIAkJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwogCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfZGlzcDFfMT47Ci0JCWNydGNzID0gPCZpcHUgMT47CiAJCWludGVyZmFjZS1waXgtZm10ID0gInJnYjI0IjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXkxX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX2Rpc3AxPjsKKwkJCX07CisJCX07CiAJfTsKIAogCXJlZ18zcDJ2OiAzcDJ2IHsKQEAgLTE0MSw2ICsxNDYsMTAgQEAKIAl9OwogfTsKIAorJmlwdV9kaTFfZGlzcDEgeworCXJlbW90ZS1lbmRwb2ludCA9IDwmZGlzcGxheTFfaW4+OworfTsKKwogJmNzcGkgewogCXN0YXR1cyA9ICJva2F5IjsKIH07CkBAIC0yMjgsNyArMjM3LDcgQEAKICZ0dmUgewogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wID0gPCZwaW5jdHJsX3ZnYV9zeW5jXzE+OwotCWRkYyA9IDwmaTJjMz47CisJaTJjLWRkYy1idXMgPSA8JmkyYzM+OwogCWZzbCx0dmUtbW9kZSA9ICJ2Z2EiOwogCWZzbCxoc3luYy1waW4gPSA8ND47CiAJZnNsLHZzeW5jLXBpbiA9IDw2PjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLXFzYi5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCmluZGV4IDkxYTU5MzUuLjhiMjU0MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLXFzYi5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtcXNiLmR0cwpAQCAtMjEsOSArMjEsOCBAQAogCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwMDAwPjsKIAl9OwogCi0JZGlzcGxheUBkaTAgeworCWRpc3BsYXkwOiBkaXNwbGF5QGRpMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKLQkJY3J0Y3MgPSA8JmlwdSAwPjsKIAkJaW50ZXJmYWNlLXBpeC1mbXQgPSAicmdiNTY1IjsKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZwaW5jdHJsX2lwdV9kaXNwMF8xPjsKQEAgLTQ2LDYgKzQ1LDEyIEBACiAJCQkJcGl4ZWxjbGstYWN0aXZlID0gPDA+OwogCQkJfTsKIAkJfTsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXkwX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2Rpc3AwPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWdwaW8ta2V5cyB7CkBAIC0xMjYsNiArMTMxLDEwIEBACiAJc3RhdHVzID0gIm9rYXkiOwogfTsKIAorJmlwdV9kaTBfZGlzcDAgeworCXJlbW90ZS1lbmRwb2ludCA9IDwmZGlzcGxheTBfaW4+OworfTsKKwogJnNzaTIgewogCWZzbCxtb2RlID0gImkycy1zbGF2ZSI7CiAJc3RhdHVzID0gIm9rYXkiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKaW5kZXggNDMwN2U4MC4uMDRkMzEyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My5kdHNpCkBAIC00NSw2ICs0NSwxMSBAQAogCQl9OwogCX07CiAKKwlkaXNwbGF5LXN1YnN5c3RlbSB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1kaXNwbGF5LXN1YnN5c3RlbSI7CisJCXBvcnRzID0gPCZpcHVfZGkwPiwgPCZpcHVfZGkxPjsKKwl9OworCiAJdHppYzogdHotaW50ZXJydXB0LWNvbnRyb2xsZXJAMGZmZmMwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxpbXg1My10emljIiwgImZzbCx0emljIjsKIAkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CkBAIC04NSwxMyArOTAsNDkgQEAKIAkJcmFuZ2VzOwogCiAJCWlwdTogaXB1QDE4MDAwMDAwIHsKLQkJCSNjcnRjLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlwdSI7CiAJCQlyZWcgPSA8MHgxODAwMDAwMCAweDA4MDAwMDAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDExIDEwPjsKIAkJCWNsb2NrcyA9IDwmY2xrcyA1OT4sIDwmY2xrcyAxMTA+LCA8JmNsa3MgNjE+OwogCQkJY2xvY2stbmFtZXMgPSAiYnVzIiwgImRpMCIsICJkaTEiOwogCQkJcmVzZXRzID0gPCZzcmMgMj47CisKKwkJCWlwdV9kaTA6IHBvcnRAMiB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDI+OworCisJCQkJaXB1X2RpMF9kaXNwMDogZW5kcG9pbnRAMCB7CisJCQkJCXJlZyA9IDwwPjsKKwkJCQl9OworCisJCQkJaXB1X2RpMF9sdmRzMDogZW5kcG9pbnRAMSB7CisJCQkJCXJlZyA9IDwxPjsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMF9pbj47CisJCQkJfTsKKwkJCX07CisKKwkJCWlwdV9kaTE6IHBvcnRAMyB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDM+OworCisJCQkJaXB1X2RpMV9kaXNwMTogZW5kcG9pbnRAMCB7CisJCQkJCXJlZyA9IDwwPjsKKwkJCQl9OworCisJCQkJaXB1X2RpMV9sdmRzMTogZW5kcG9pbnRAMSB7CisJCQkJCXJlZyA9IDwxPjsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMV9pbj47CisJCQkJfTsKKworCQkJCWlwdV9kaTFfdHZlOiBlbmRwb2ludEAyIHsKKwkJCQkJcmVnID0gPDI+OworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnR2ZV9pbj47CisJCQkJfTsKKwkJCX07CiAJCX07CiAKIAkJYWlwc0A1MDAwMDAwMCB7IC8qIEFJUFMxICovCkBAIC04MzgsMTQgKzg3OSwyNCBAQAogCiAJCQkJbHZkcy1jaGFubmVsQDAgewogCQkJCQlyZWcgPSA8MD47Ci0JCQkJCWNydGNzID0gPCZpcHUgMD47CiAJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJCQkJcG9ydCB7CisJCQkJCQlsdmRzMF9pbjogZW5kcG9pbnQgeworCQkJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMF9sdmRzMD47CisJCQkJCQl9OworCQkJCQl9OwogCQkJCX07CiAKIAkJCQlsdmRzLWNoYW5uZWxAMSB7CiAJCQkJCXJlZyA9IDwxPjsKLQkJCQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQkJCQlwb3J0IHsKKwkJCQkJCWx2ZHMxX2luOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CiAJCQkJfTsKIAkJCX07CiAKQEAgLTExMDMsOCArMTE1NCwxMyBAQAogCQkJCWludGVycnVwdHMgPSA8OTI+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyA2OT4sIDwmY2xrcyAxMTY+OwogCQkJCWNsb2NrLW5hbWVzID0gInR2ZSIsICJkaV9zZWwiOwotCQkJCWNydGNzID0gPCZpcHUgMT47CiAJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQkJCXBvcnQgeworCQkJCQl0dmVfaW46IGVuZHBvaW50IHsKKwkJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMV90dmU+OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCiAJCQl2cHU6IHZwdUA2M2ZmNDAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2ZGwuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpCmluZGV4IDllOGFlMTEuLjI1YmJkZDZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg2ZGwuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2ZGwuZHRzaQpAQCAtNzAsNiArNzAsMTUgQEAKIAkJCX07CiAJCX07CiAJfTsKKworCWRpc3BsYXktc3Vic3lzdGVtIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIjsKKwkJcG9ydHMgPSA8JmlwdTFfZGkwPiwgPCZpcHUxX2RpMT47CisJfTsKK307CisKKyZoZG1pIHsKKwljb21wYXRpYmxlID0gImZzbCxpbXg2ZGwtaGRtaSI7CiB9OwogCiAmbGRiIHsKQEAgLTc5LDEyICs4OCw0IEBACiAJY2xvY2stbmFtZXMgPSAiZGkwX3BsbCIsICJkaTFfcGxsIiwKIAkJICAgICAgImRpMF9zZWwiLCAiZGkxX3NlbCIsCiAJCSAgICAgICJkaTAiLCAiZGkxIjsKLQotCWx2ZHMtY2hhbm5lbEAwIHsKLQkJY3J0Y3MgPSA8JmlwdTEgMD4sIDwmaXB1MSAxPjsKLQl9OwotCi0JbHZkcy1jaGFubmVsQDEgewotCQljcnRjcyA9IDwmaXB1MSAwPiwgPCZpcHUxIDE+OwotCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxLmR0c2kKaW5kZXggZjAyNGVmMi4uMmE4ZDlkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpCkBAIC0xMzIsMTMgKzEzMiw4NCBAQAogCQl9OwogCiAJCWlwdTI6IGlwdUAwMjgwMDAwMCB7Ci0JCQkjY3J0Yy1jZWxscyA9IDwxPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1pcHUiOwogCQkJcmVnID0gPDB4MDI4MDAwMDAgMHg0MDAwMDA+OwogCQkJaW50ZXJydXB0cyA9IDwwIDggMHg0IDAgNyAweDQ+OwogCQkJY2xvY2tzID0gPCZjbGtzIDEzMz4sIDwmY2xrcyAxMzQ+LCA8JmNsa3MgMTM3PjsKIAkJCWNsb2NrLW5hbWVzID0gImJ1cyIsICJkaTAiLCAiZGkxIjsKIAkJCXJlc2V0cyA9IDwmc3JjIDQ+OworCisJCQlpcHUyX2RpMDogcG9ydEAyIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mj47CisKKwkJCQlpcHUyX2RpMF9kaXNwMDogZW5kcG9pbnRAMCB7CisJCQkJfTsKKworCQkJCWlwdTJfZGkwX2hkbWk6IGVuZHBvaW50QDEgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmhkbWlfbXV4XzI+OworCQkJCX07CisKKwkJCQlpcHUyX2RpMF9taXBpOiBlbmRwb2ludEAyIHsKKwkJCQl9OworCisJCQkJaXB1Ml9kaTBfbHZkczA6IGVuZHBvaW50QDMgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMwX211eF8yPjsKKwkJCQl9OworCisJCQkJaXB1Ml9kaTBfbHZkczE6IGVuZHBvaW50QDQgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMxX211eF8yPjsKKwkJCQl9OworCQkJfTsKKworCQkJaXB1Ml9kaTE6IHBvcnRAMyB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDM+OworCisJCQkJaXB1Ml9kaTFfaGRtaTogZW5kcG9pbnRAMSB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaGRtaV9tdXhfMz47CisJCQkJfTsKKworCQkJCWlwdTJfZGkxX21pcGk6IGVuZHBvaW50QDIgeworCQkJCX07CisKKwkJCQlpcHUyX2RpMV9sdmRzMDogZW5kcG9pbnRAMyB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczBfbXV4XzM+OworCQkJCX07CisKKwkJCQlpcHUyX2RpMV9sdmRzMTogZW5kcG9pbnRANCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczFfbXV4XzM+OworCQkJCX07CisJCQl9OworCQl9OworCX07CisKKwlkaXNwbGF5LXN1YnN5c3RlbSB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1kaXNwbGF5LXN1YnN5c3RlbSI7CisJCXBvcnRzID0gPCZpcHUxX2RpMD4sIDwmaXB1MV9kaTE+LCA8JmlwdTJfZGkwPiwgPCZpcHUyX2RpMT47CisJfTsKK307CisKKyZoZG1pIHsKKwljb21wYXRpYmxlID0gImZzbCxpbXg2cS1oZG1pIjsKKworCXBvcnRAMiB7CisJCXJlZyA9IDwyPjsKKworCQloZG1pX211eF8yOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkwX2hkbWk+OworCQl9OworCX07CisKKwlwb3J0QDMgeworCQlyZWcgPSA8Mz47CisKKwkJaGRtaV9tdXhfMzogZW5kcG9pbnQgeworCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMV9oZG1pPjsKIAkJfTsKIAl9OwogfTsKQEAgLTE1MiwxMCArMjIzLDU2IEBACiAJCSAgICAgICJkaTAiLCAiZGkxIjsKIAogCWx2ZHMtY2hhbm5lbEAwIHsKLQkJY3J0Y3MgPSA8JmlwdTEgMD4sIDwmaXB1MSAxPiwgPCZpcHUyIDA+LCA8JmlwdTIgMT47CisJCXBvcnRAMiB7CisJCQlyZWcgPSA8Mj47CisKKwkJCWx2ZHMwX211eF8yOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMF9sdmRzMD47CisJCQl9OworCQl9OworCisJCXBvcnRAMyB7CisJCQlyZWcgPSA8Mz47CisKKwkJCWx2ZHMwX211eF8zOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMV9sdmRzMD47CisJCQl9OworCQl9OwogCX07CiAKIAlsdmRzLWNoYW5uZWxAMSB7Ci0JCWNydGNzID0gPCZpcHUxIDA+LCA8JmlwdTEgMT4sIDwmaXB1MiAwPiwgPCZpcHUyIDE+OworCQlwb3J0QDIgeworCQkJcmVnID0gPDI+OworCisJCQlsdmRzMV9tdXhfMjogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1Ml9kaTBfbHZkczE+OworCQkJfTsKKwkJfTsKKworCQlwb3J0QDMgeworCQkJcmVnID0gPDM+OworCisJCQlsdmRzMV9tdXhfMzogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1Ml9kaTFfbHZkczE+OworCQkJfTsKKwkJfTsKKwl9OworfTsKKworJm1pcGlfZHNpIHsKKwlwb3J0QDIgeworCQlyZWcgPSA8Mj47CisKKwkJbWlwaV9tdXhfMjogZW5kcG9pbnQgeworCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMF9taXBpPjsKKwkJfTsKKwl9OworCisJcG9ydEAzIHsKKwkJcmVnID0gPDM+OworCisJCW1pcGlfbXV4XzM6IGVuZHBvaW50IHsKKwkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1Ml9kaTFfbWlwaT47CisJCX07CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLmR0c2kKaW5kZXggZmIyOGIyZS4uNjRhOGNiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaQpAQCAtMTM1OCwxMyArMTM1OCw3NiBAQAogCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAKIAkJCQlsdmRzLWNoYW5uZWxAMCB7CisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCQkJcmVnID0gPDA+OwogCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJCXBvcnRAMCB7CisJCQkJCQlyZWcgPSA8MD47CisKKwkJCQkJCWx2ZHMwX211eF8wOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMF9sdmRzMD47CisJCQkJCQl9OworCQkJCQl9OworCisJCQkJCXBvcnRAMSB7CisJCQkJCQlyZWcgPSA8MT47CisKKwkJCQkJCWx2ZHMwX211eF8xOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMV9sdmRzMD47CisJCQkJCQl9OworCQkJCQl9OwogCQkJCX07CiAKIAkJCQlsdmRzLWNoYW5uZWxAMSB7CisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCQkJcmVnID0gPDE+OwogCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJCXBvcnRAMCB7CisJCQkJCQlyZWcgPSA8MD47CisKKwkJCQkJCWx2ZHMxX211eF8wOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMF9sdmRzMT47CisJCQkJCQl9OworCQkJCQl9OworCisJCQkJCXBvcnRAMSB7CisJCQkJCQlyZWcgPSA8MT47CisKKwkJCQkJCWx2ZHMxX211eF8xOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMV9sdmRzMT47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CisJCQl9OworCisJCQloZG1pOiBoZG1pQDAxMjAwMDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZyA9IDwweDAwMTIwMDAwIDB4OTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDExNSAweDA0PjsKKwkJCQlncHIgPSA8Jmdwcj47CisJCQkJY2xvY2tzID0gPCZjbGtzIDEyMz4sIDwmY2xrcyAxMjQ+OworCQkJCWNsb2NrLW5hbWVzID0gImlhaGIiLCAiaXNmciI7CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQkJCXBvcnRAMCB7CisJCQkJCXJlZyA9IDwwPjsKKworCQkJCQloZG1pX211eF8wOiBlbmRwb2ludCB7CisJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX2hkbWk+OworCQkJCQl9OworCQkJCX07CisKKwkJCQlwb3J0QDEgeworCQkJCQlyZWcgPSA8MT47CisKKwkJCQkJaGRtaV9tdXhfMTogZW5kcG9pbnQgeworCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMV9oZG1pPjsKKwkJCQkJfTsKIAkJCQl9OwogCQkJfTsKIApAQCAtMTU3OSw4ICsxNjQyLDI3IEBACiAJCQkJcmVnID0gPDB4MDIxZGMwMDAgMHg0MDAwPjsKIAkJCX07CiAKLQkJCW1pcGlAMDIxZTAwMDAgeyAvKiBNSVBJLURTSSAqLworCQkJbWlwaV9kc2k6IG1pcGlAMDIxZTAwMDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJCXJlZyA9IDwweDAyMWUwMDAwIDB4NDAwMD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQkJCXBvcnRAMCB7CisJCQkJCXJlZyA9IDwwPjsKKworCQkJCQltaXBpX211eF8wOiBlbmRwb2ludCB7CisJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX21pcGk+OworCQkJCQl9OworCQkJCX07CisKKwkJCQlwb3J0QDEgeworCQkJCQlyZWcgPSA8MT47CisKKwkJCQkJbWlwaV9tdXhfMTogZW5kcG9pbnQgeworCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUxX2RpMV9taXBpPjsKKwkJCQkJfTsKKwkJCQl9OwogCQkJfTsKIAogCQkJdmRvYUAwMjFlNDAwMCB7CkBAIC0xNjM0LDEzICsxNzE2LDY0IEBACiAJCX07CiAKIAkJaXB1MTogaXB1QDAyNDAwMDAwIHsKLQkJCSNjcnRjLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWlwdSI7CiAJCQlyZWcgPSA8MHgwMjQwMDAwMCAweDQwMDAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgNiAweDQgMCA1IDB4ND47CiAJCQljbG9ja3MgPSA8JmNsa3MgMTMwPiwgPCZjbGtzIDEzMT4sIDwmY2xrcyAxMzI+OwogCQkJY2xvY2stbmFtZXMgPSAiYnVzIiwgImRpMCIsICJkaTEiOwogCQkJcmVzZXRzID0gPCZzcmMgMj47CisKKwkJCWlwdTFfZGkwOiBwb3J0QDIgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZyA9IDwyPjsKKworCQkJCWlwdTFfZGkwX2Rpc3AwOiBlbmRwb2ludEAwIHsKKwkJCQl9OworCisJCQkJaXB1MV9kaTBfaGRtaTogZW5kcG9pbnRAMSB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaGRtaV9tdXhfMD47CisJCQkJfTsKKworCQkJCWlwdTFfZGkwX21pcGk6IGVuZHBvaW50QDIgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jm1pcGlfbXV4XzA+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMF9sdmRzMDogZW5kcG9pbnRAMyB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczBfbXV4XzA+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMF9sdmRzMTogZW5kcG9pbnRANCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczFfbXV4XzA+OworCQkJCX07CisJCQl9OworCisJCQlpcHUxX2RpMTogcG9ydEAzIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mz47CisKKwkJCQlpcHUxX2RpMF9kaXNwMTogZW5kcG9pbnRAMCB7CisJCQkJfTsKKworCQkJCWlwdTFfZGkxX2hkbWk6IGVuZHBvaW50QDEgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmhkbWlfbXV4XzE+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMV9taXBpOiBlbmRwb2ludEAyIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZtaXBpX211eF8xPjsKKwkJCQl9OworCisJCQkJaXB1MV9kaTFfbHZkczA6IGVuZHBvaW50QDMgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMwX211eF8xPjsKKwkJCQl9OworCisJCQkJaXB1MV9kaTFfbHZkczE6IGVuZHBvaW50QDQgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMxX211eF8xPjsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3ByaW1hMi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLmR0c2kKaW5kZXggMGUyMTk5My4uODU4MmFlNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLmR0c2kKQEAgLTIyMyw4ICsyMjMsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MTc+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDEzPjsKLQkJCQlzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwgPSA8MjE+OwotCQkJCXNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCA9IDwyPjsKKwkJCQlkbWFzID0gPCZkbWFjMSA1PiwgPCZkbWFjMCAyPjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdWFydDE6IHVhcnRAYjAwNjAwMDAgewpAQCAtMjQzLDggKzI0Myw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwxOT47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMTU+OwotCQkJCXNpcmYsdWFydC1kbWEtcngtY2hhbm5lbCA9IDw2PjsKLQkJCQlzaXJmLHVhcnQtZG1hLXR4LWNoYW5uZWwgPSA8Nz47CisJCQkJZG1hcyA9IDwmZG1hYzAgNj4sIDwmZG1hYzAgNz47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCXVzcDA6IHVzcEBiMDA4MDAwMCB7CkBAIC0yNTQsOCArMjU0LDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDIwPjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAyOD47Ci0JCQkJc2lyZix1c3AtZG1hLXJ4LWNoYW5uZWwgPSA8MTc+OwotCQkJCXNpcmYsdXNwLWRtYS10eC1jaGFubmVsID0gPDE4PjsKKwkJCQlkbWFzID0gPCZkbWFjMSAxPiwgPCZkbWFjMSAyPjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdXNwMTogdXNwQGIwMDkwMDAwIHsKQEAgLTI2NSw4ICsyNjUsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MjE+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDI5PjsKLQkJCQlzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCA9IDwxND47Ci0JCQkJc2lyZix1c3AtZG1hLXR4LWNoYW5uZWwgPSA8MTU+OworCQkJCWRtYXMgPSA8JmRtYWMwIDE0PiwgPCZkbWFjMCAxNT47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCXVzcDI6IHVzcEBiMDBhMDAwMCB7CkBAIC0yNzYsOCArMjc2LDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAzMD47Ci0JCQkJc2lyZix1c3AtZG1hLXJ4LWNoYW5uZWwgPSA8MTA+OwotCQkJCXNpcmYsdXNwLWRtYS10eC1jaGFubmVsID0gPDExPjsKKwkJCQlkbWFzID0gPCZkbWFjMCAxMD4sIDwmZG1hYzAgMTE+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQlkbWFjMDogZG1hLWNvbnRyb2xsZXJAYjAwYjAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcjhhNzc5MS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvcjhhNzc5MS5kdHNpCmluZGV4IDE5YzY1NTAuLjNiMDc1ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3I4YTc3OTEuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkxLmR0c2kKQEAgLTQyOSw3ICs0MjksNyBAQAogCQkJCVI4QTc3OTFfQ0xLX01TSU9GMSBSOEE3NzkxX0NMS19TQ0lGQjIKIAkJCT47CiAJCQljbG9jay1vdXRwdXQtbmFtZXMgPQotCQkJCSJzY2lmYTIiLCAic2NpZmExIiwgInNjaWZhMCIsICJtaXNvZjIiLCAic2NpZmIwIiwKKwkJCQkic2NpZmEyIiwgInNjaWZhMSIsICJzY2lmYTAiLCAibXNpb2YyIiwgInNjaWZiMCIsCiAJCQkJInNjaWZiMSIsICJtc2lvZjEiLCAic2NpZmIyIjsKIAkJfTsKIAkJbXN0cDNfY2xrczogbXN0cDNfY2xrc0BlNjE1MDEzYyB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzNi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc2FtYTVkMzYuZHRzaQppbmRleCA2YzMxYzI2Li5kYjU4Y2FkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzNi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NhbWE1ZDM2LmR0c2kKQEAgLTgsOCArOCw4IEBACiAgKi8KICNpbmNsdWRlICJzYW1hNWQzLmR0c2kiCiAjaW5jbHVkZSAic2FtYTVkM19jYW4uZHRzaSIKLSNpbmNsdWRlICJzYW1hNWQzX2VtYWMuZHRzaSIKICNpbmNsdWRlICJzYW1hNWQzX2dtYWMuZHRzaSIKKyNpbmNsdWRlICJzYW1hNWQzX2VtYWMuZHRzaSIKICNpbmNsdWRlICJzYW1hNWQzX2xjZC5kdHNpIgogI2luY2x1ZGUgInNhbWE1ZDNfbWNpMi5kdHNpIgogI2luY2x1ZGUgInNhbWE1ZDNfdGNiMS5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAuZHRzaQppbmRleCBkNGQyNzYzLi43NzUzYmUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAuZHRzaQpAQCAtMzMxLDcgKzMzMSw3IEBACiAJCX07CiAKIAkJaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMDFjMjA0MDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktaWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIjsKIAkJCXJlZyA9IDwweDAxYzIwNDAwIDB4NDAwPjsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKQEAgLTQwMyw3ICs0MDMsNyBAQAogCQl9OwogCiAJCXRpbWVyQDAxYzIwYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciI7CiAJCQlyZWcgPSA8MHgwMWMyMGMwMCAweDkwPjsKIAkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJY2xvY2tzID0gPCZvc2MyNE0+OwpAQCAtNDIxLDcgKzQyMSw3IEBACiAJCX07CiAKIAkJc2lkOiBlZXByb21AMDFjMjM4MDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktc2lkIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zaWQiOwogCQkJcmVnID0gPDB4MDFjMjM4MDAgMHgxMD47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMHMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMHMuZHRzaQppbmRleCA3OWZkNDEyLi5lZTE3YjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTBzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEwcy5kdHNpCkBAIC0yOTQsNyArMjk0LDcgQEAKIAkJfTsKIAogCQlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMWMyMDQwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1pYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtaWMiOwogCQkJcmVnID0gPDB4MDFjMjA0MDAgMHg0MDA+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJCX07CiAKIAkJdGltZXJAMDFjMjBjMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktdGltZXIiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIjsKIAkJCXJlZyA9IDwweDAxYzIwYzAwIDB4OTA+OwogCQkJaW50ZXJydXB0cyA9IDwyMj47CiAJCQljbG9ja3MgPSA8Jm9zYzI0TT47CkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJfTsKIAogCQlzaWQ6IGVlcHJvbUAwMWMyMzgwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1zaWQiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNpZCI7CiAJCQlyZWcgPSA8MHgwMWMyMzgwMCAweDEwPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQppbmRleCBjNDYzZmQ3Li4zNDkwZWY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCXJhbmdlczsKIAogCQlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMWMyMDQwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1pYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtaWMiOwogCQkJcmVnID0gPDB4MDFjMjA0MDAgMHg0MDA+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJCX07CiAKIAkJdGltZXJAMDFjMjBjMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktdGltZXIiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIjsKIAkJCXJlZyA9IDwweDAxYzIwYzAwIDB4OTA+OwogCQkJaW50ZXJydXB0cyA9IDwyMj47CiAJCQljbG9ja3MgPSA8Jm9zYzI0TT47CkBAIC0zNDEsNyArMzQxLDcgQEAKIAkJfTsKIAogCQlzaWQ6IGVlcHJvbUAwMWMyMzgwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1zaWQiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNpZCI7CiAJCQlyZWcgPSA8MHgwMWMyMzgwMCAweDEwPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNmktYTMxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW42aS1hMzEuZHRzaQppbmRleCA1MjU2YWQ5Li4zOGQ0M2ZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW42aS1hMzEuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW42aS1hMzEuZHRzaQpAQCAtMTkwLDYgKzE5MCwxNCBAQAogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmFuZ2VzOwogCisJCW5taV9pbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMWYwMGMwYyB7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW42aS1hMzEtc2Mtbm1pIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDwweDAxZjAwYzBjIDB4Mzg+OworCQkJaW50ZXJydXB0cyA9IDwwIDMyIDQ+OworCQl9OworCiAJCXBpbzogcGluY3RybEAwMWMyMDgwMCB7CiAJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW42aS1hMzEtcGluY3RybCI7CiAJCQlyZWcgPSA8MHgwMWMyMDgwMCAweDQwMD47CkBAIC0yMzEsNyArMjM5LDcgQEAKIAkJfTsKIAogCQl0aW1lckAwMWMyMGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS10aW1lciI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiOwogCQkJcmVnID0gPDB4MDFjMjBjMDAgMHhhMD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMTggND4sCiAJCQkJICAgICA8MCAxOSA0PiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKaW5kZXggNmYyNWNmNS4uY2FkY2YyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKQEAgLTMzOSw2ICszMzksMTQgQEAKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJhbmdlczsKIAorCQlubWlfaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMDFjMDAwMzAgeworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNjLW5taSI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHgwMWMwMDAzMCAweDBjPjsKKwkJCWludGVycnVwdHMgPSA8MCAwIDQ+OworCQl9OworCiAJCWVtYWM6IGV0aGVybmV0QDAxYzBiMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1lbWFjIjsKIAkJCXJlZyA9IDwweDAxYzBiMDAwIDB4MTAwMD47CkBAIC00MzUsNyArNDQzLDcgQEAKIAkJfTsKIAogCQl0aW1lckAwMWMyMGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS10aW1lciI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiOwogCQkJcmVnID0gPDB4MDFjMjBjMDAgMHg5MD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMjIgND4sCiAJCQkJICAgICA8MCAyMyA0PiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtNzAwMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kKaW5kZXggOGI2N2IxOS4uNzg5ZDBiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kKQEAgLTI0LDYgKzI0LDEyIEBACiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDA+OwogCQkJY2xvY2tzID0gPCZjbGtjIDM+OworCQkJb3BlcmF0aW5nLXBvaW50cyA9IDwKKwkJCQkvKiBrSHogICAgdVYgKi8KKwkJCQk2NjY2NjcgIDEwMDAwMDAKKwkJCQkzMzMzMzQgIDEwMDAwMDAKKwkJCQkyMjIyMjMgIDEwMDAwMDAKKwkJCT47CiAJCX07CiAKIAkJY3B1QDEgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDMyNzhhZmUuLjIzZTcyOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTcsMTYgKzcsMTkgQEAKIGdlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCiBnZW5lcmljLXkgKz0gZXJybm8uaAogZ2VuZXJpYy15ICs9IGV4ZWMuaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpcGNidWYuaAogZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKIGdlbmVyaWMteSArPSBrZGVidWcuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKIGdlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaAogZ2VuZXJpYy15ICs9IHBhcnBvcnQuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSBzZWN0aW9ucy5oCiBnZW5lcmljLXkgKz0gc2VnbWVudC5oCkBAIC0zMyw1ICszNiwzIEBACiBnZW5lcmljLXkgKz0gdGltZXguaAogZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKIGdlbmVyaWMteSArPSB1bmFsaWduZWQuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggNThiOGI4NC4uMmZlODVmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0yMCw5ICsyMCw2IEBACiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfY3B1bWFzayhjcHUpCSgmY3B1X3RvcG9sb2d5W2NwdV0uY29yZV9zaWJsaW5nKQogI2RlZmluZSB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpCSgmY3B1X3RvcG9sb2d5W2NwdV0udGhyZWFkX3NpYmxpbmcpCiAKLSNkZWZpbmUgbWNfY2FwYWJsZSgpCShjcHVfdG9wb2xvZ3lbMF0uc29ja2V0X2lkICE9IC0xKQotI2RlZmluZSBzbXRfY2FwYWJsZSgpCShjcHVfdG9wb2xvZ3lbMF0udGhyZWFkX2lkICE9IC0xKQotCiB2b2lkIGluaXRfY3B1X3RvcG9sb2d5KHZvaWQpOwogdm9pZCBzdG9yZV9jcHVfdG9wb2xvZ3kodW5zaWduZWQgaW50IGNwdWlkKTsKIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY29yZWdyb3VwX21hc2soaW50IGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKaW5kZXggMzE3ZGE4OC4uZDBkNDY3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwpAQCAtMTksNyArMTksNyBAQAogc3RhdGljIGludCBkZWJ1Z19wY2k7CiAKIC8qCi0gKiBXZSBjYW4ndCB1c2UgcGNpX2ZpbmRfZGV2aWNlKCkgaGVyZSBzaW5jZSB3ZSBhcmUKKyAqIFdlIGNhbid0IHVzZSBwY2lfZ2V0X2RldmljZSgpIGhlcmUgc2luY2Ugd2UgYXJlCiAgKiBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KICAqLwogc3RhdGljIHZvaWQgcGNpYmlvc19idXNfcmVwb3J0X3N0YXR1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1X2ludCBzdGF0dXNfbWFzaywgaW50IHdhcm4pCkBAIC01NywxMyArNTcsMTAgQEAKIAogdm9pZCBwY2liaW9zX3JlcG9ydF9zdGF0dXModV9pbnQgc3RhdHVzX21hc2ssIGludCB3YXJuKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAotCWxpc3RfZm9yX2VhY2gobCwgJnBjaV9yb290X2J1c2VzKSB7Ci0JCXN0cnVjdCBwY2lfYnVzICpidXMgPSBwY2lfYnVzX2IobCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnBjaV9yb290X2J1c2VzLCBub2RlKQogCQlwY2liaW9zX2J1c19yZXBvcnRfc3RhdHVzKGJ1cywgc3RhdHVzX21hc2ssIHdhcm4pOwotCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDkyZjdiMTUuLmFkYWJlYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KIApAQCAtMTMzLDcgKzEzMiwxMSBAQAogCiB2b2lkICgqYXJtX3BtX2lkbGUpKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgY29yZSBpZGxlIGxvb3AuCisgKi8KKwordm9pZCBhcmNoX2NwdV9pZGxlKHZvaWQpCiB7CiAJaWYgKGFybV9wbV9pZGxlKQogCQlhcm1fcG1faWRsZSgpOwpAQCAtMTY4LDE1ICsxNzEsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBDYWxsZWQgZnJvbSB0aGUgY29yZSBpZGxlIGxvb3AuCi0gKi8KLXZvaWQgYXJjaF9jcHVfaWRsZSh2b2lkKQotewotCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKQotCQlkZWZhdWx0X2lkbGUoKTsKLX0KLQotLyoKICAqIENhbGxlZCBieSBrZXhlYywgaW1tZWRpYXRlbHkgcHJpb3IgdG8gbWFjaGluZV9rZXhlYygpLgogICoKICAqIFRoaXMgbXVzdCBjb21wbGV0ZWx5IGRpc2FibGUgYWxsIHNlY29uZGFyeSBDUFVzOyBzaW1wbHkgY2F1c2luZyB0aG9zZSBDUFVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4NTAuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jCmluZGV4IDJhYjAwNDMuLjg1Mzk5YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jCkBAIC00NzIsNyArNDcyLDcgQEAKIAlDTEsoInNwaV9kYXZpbmNpLjAiLAlOVUxMLAkJJnNwaTBfY2xrKSwKIAlDTEsoInNwaV9kYXZpbmNpLjEiLAlOVUxMLAkJJnNwaTFfY2xrKSwKIAlDTEsoInZwaWYiLAkJTlVMTCwJCSZ2cGlmX2NsayksCi0JQ0xLKCJhaGNpIiwJCU5VTEwsCQkmc2F0YV9jbGspLAorCUNMSygiYWhjaV9kYTg1MCIsCQlOVUxMLAkJJnNhdGFfY2xrKSwKIAlDTEsoImRhdmluY2ktcnByb2MuMCIsCU5VTEwsCQkmZHNwX2NsayksCiAJQ0xLKCJlaHJwd20iLAkJImZjayIsCQkmZWhycHdtX2NsayksCiAJQ0xLKCJlaHJwd20iLAkJInRiY2xrIiwJJmVocnB3bV90YmNsayksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwppbmRleCAwNDg2Y2RmLi41NmVhNDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKQEAgLTEwMjAsNyArMTAyMCw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQVJDSF9EQVZJTkNJX0RBODUwCi0KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGE4NTBfc2F0YV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydAk9IERBODUwX1NBVEFfQkFTRSwKQEAgLTEwMjgsMTAzICsxMDI3LDIyIEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQJPSBEQThYWF9TWVNDRkcxX0JBU0UgKyBEQThYWF9QV1JETl9SRUcsCisJCS5lbmQJPSBEQThYWF9TWVNDRkcxX0JBU0UgKyBEQThYWF9QV1JETl9SRUcgKyAweDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJewogCQkuc3RhcnQJPSBJUlFfREE4NTBfU0FUQUlOVCwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CiAKLS8qIFNBVEEgUEhZIENvbnRyb2wgUmVnaXN0ZXIgb2Zmc2V0IGZyb20gQUhDSSBiYXNlICovCi0jZGVmaW5lIFNBVEFfUDBQSFlDUl9SRUcJMHgxNzgKLQotI2RlZmluZSBTQVRBX1BIWV9NUFkoeCkJCSgoeCkgPDwgMCkKLSNkZWZpbmUgU0FUQV9QSFlfTE9TKHgpCQkoKHgpIDw8IDYpCi0jZGVmaW5lIFNBVEFfUEhZX1JYQ0RSKHgpCSgoeCkgPDwgMTApCi0jZGVmaW5lIFNBVEFfUEhZX1JYRVEoeCkJKCh4KSA8PCAxMykKLSNkZWZpbmUgU0FUQV9QSFlfVFhTV0lORyh4KQkoKHgpIDw8IDE5KQotI2RlZmluZSBTQVRBX1BIWV9FTlBMTCh4KQkoKHgpIDw8IDMxKQotCi1zdGF0aWMgc3RydWN0IGNsayAqZGE4NTBfc2F0YV9jbGs7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkYTg1MF9zYXRhX3JlZmNsa3BuOwotCi0vKiBTdXBwb3J0ZWQgREE4NTAgU0FUQSBjcnlzdGFsIGZyZXF1ZW5jaWVzICovCi0jZGVmaW5lIEtIWl9UT19IWihmcmVxKSAoKGZyZXEpICogMTAwMCkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhODUwX3NhdGFfeHRhbFtdID0gewotCUtIWl9UT19IWigzMDAwMDApLAotCUtIWl9UT19IWigyNTAwMDApLAotCTAsCQkJLyogUmVzZXJ2ZWQgKi8KLQlLSFpfVE9fSFooMTg3NTAwKSwKLQlLSFpfVE9fSFooMTUwMDAwKSwKLQlLSFpfVE9fSFooMTI1MDAwKSwKLQlLSFpfVE9fSFooMTIwMDAwKSwKLQlLSFpfVE9fSFooMTAwMDAwKSwKLQlLSFpfVE9fSFooNzUwMDApLAotCUtIWl9UT19IWig2MDAwMCksCi19OwotCi1zdGF0aWMgaW50IGRhODUwX3NhdGFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgaSwgcmV0OwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlkYTg1MF9zYXRhX2NsayA9IGNsa19nZXQoZGV2LCBOVUxMKTsKLQlpZiAoSVNfRVJSKGRhODUwX3NhdGFfY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGE4NTBfc2F0YV9jbGspOwotCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhODUwX3NhdGFfY2xrKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjA7Ci0KLQkvKiBFbmFibGUgU0FUQSBjbG9jayByZWNlaXZlciAqLwotCXZhbCA9IF9fcmF3X3JlYWRsKERBOFhYX1NZU0NGRzFfVklSVChEQThYWF9QV1JETl9SRUcpKTsKLQl2YWwgJj0gfkJJVCgwKTsKLQlfX3Jhd193cml0ZWwodmFsLCBEQThYWF9TWVNDRkcxX1ZJUlQoREE4WFhfUFdSRE5fUkVHKSk7Ci0KLQkvKiBHZXQgdGhlIG11bHRpcGxpZXIgbmVlZGVkIGZvciAxLjVHSHogUExMIG91dHB1dCAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhODUwX3NhdGFfeHRhbCk7IGkrKykKLQkJaWYgKGRhODUwX3NhdGFfeHRhbFtpXSA9PSBkYTg1MF9zYXRhX3JlZmNsa3BuKQotCQkJYnJlYWs7Ci0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGRhODUwX3NhdGFfeHRhbCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnIxOwotCX0KLQotCXZhbCA9IFNBVEFfUEhZX01QWShpICsgMSkgfAotCQlTQVRBX1BIWV9MT1MoMSkgfAotCQlTQVRBX1BIWV9SWENEUig0KSB8Ci0JCVNBVEFfUEhZX1JYRVEoMSkgfAotCQlTQVRBX1BIWV9UWFNXSU5HKDMpIHwKLQkJU0FUQV9QSFlfRU5QTEwoMSk7Ci0KLQlfX3Jhd193cml0ZWwodmFsLCBhZGRyICsgU0FUQV9QMFBIWUNSX1JFRyk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyMToKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGE4NTBfc2F0YV9jbGspOwotZXJyMDoKLQljbGtfcHV0KGRhODUwX3NhdGFfY2xrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBkYTg1MF9zYXRhX2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTg1MF9zYXRhX2Nsayk7Ci0JY2xrX3B1dChkYTg1MF9zYXRhX2Nsayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhIGRhODUwX3NhdGFfcGRhdGEgPSB7Ci0JLmluaXQJPSBkYTg1MF9zYXRhX2luaXQsCi0JLmV4aXQJPSBkYTg1MF9zYXRhX2V4aXQsCi19OwotCiBzdGF0aWMgdTY0IGRhODUwX3NhdGFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhODUwX3NhdGFfZGV2aWNlID0gewotCS5uYW1lCT0gImFoY2kiLAorCS5uYW1lCT0gImFoY2lfZGE4NTAiLAogCS5pZAk9IC0xLAogCS5kZXYJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZkYTg1MF9zYXRhX3BkYXRhLAogCQkuZG1hX21hc2sJCT0gJmRhODUwX3NhdGFfZG1hbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKIAl9LApAQCAtMTEzNCw5ICsxMDUyLDggQEAKIAogaW50IF9faW5pdCBkYTg1MF9yZWdpc3Rlcl9zYXRhKHVuc2lnbmVkIGxvbmcgcmVmY2xrcG4pCiB7Ci0JZGE4NTBfc2F0YV9yZWZjbGtwbiA9IHJlZmNsa3BuOwotCWlmICghZGE4NTBfc2F0YV9yZWZjbGtwbikKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogcGxlYXNlIHNlZSBjb21tZW50IGluIGRyaXZlcnMvYXRhL2FoY2lfZGE4NTAuYyAqLworCUJVR19PTihyZWZjbGtwbiAhPSAxMDAgKiAxMDAwICogMTAwMCk7CiAKIAlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYTg1MF9zYXRhX2RldmljZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZwppbmRleCA0YzQxNGFmLi44ZDE5N2RjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKQEAgLTM2LDcgKzM2LDYgQEAKIAlzZWxlY3QgSEFWRV9BUk1fU0NVIGlmIFNNUAogCXNlbGVjdCBIQVZFX1NNUAogCXNlbGVjdCBQSU5DVFJMCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19YSENJCiAJaGVscAogCSAgU2Ftc3VuZyBFWFlOT1M1IChDb3J0ZXgtQTE1KSBTb0MgYmFzZWQgc3lzdGVtcwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMKaW5kZXggYjM3MzhlNi4uOGY0NWFmZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYwpAQCAtMTI4LDI3ICsxMjgsMTUgQEAKIAkubnVtX3Jlc291cmNlcyA9IDEsCiB9OwogCi1zdGF0aWMgaW50IG1vYm9hcmRfdWFydDBfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgX19pbml0IG1vYm9hcmRfdWFydDBfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBncGlvX3JlcXVlc3QoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSwgInVhcnQwLWN0cy1oYWNrIik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpLCAwKTsKLQlpZiAocmV0KQorCWlmICghZ3Bpb19yZXF1ZXN0KElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSksICJ1YXJ0MC1jdHMtaGFjayIpKSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpLCAwKTsKIAkJZ3Bpb19mcmVlKElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbW9ib2FyZF91YXJ0MF9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JZ3Bpb19mcmVlKElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSkpOworCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydDBfcGRhdGEgX19pbml0Y29uc3QgPSB7Ci0JLmluaXQgPSBtb2JvYXJkX3VhcnQwX2luaXQsCi0JLmV4aXQgPSBtb2JvYXJkX3VhcnQwX2V4aXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0NF9wZGF0YSBfX2luaXRjb25zdCA9IHsKQEAgLTU0Myw2ICs1MzEsNyBAQAogCiAJaW14MzFfYWRkX2lteDJfd2R0KCk7CiAKKwltb2JvYXJkX3VhcnQwX2luaXQoKTsKIAlpbXgzMV9hZGRfaW14X3VhcnQwKCZ1YXJ0MF9wZGF0YSk7CiAJaW14MzFfYWRkX2lteF91YXJ0NCgmdWFydDRfcGRhdGEpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14NnEuYwppbmRleCA3YTliOTg1Li4yOWUzZmU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDZxLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiBpbnQgaW14NnFfc2V0X2xwbShlbnVtIG14Y19jcHVfcHdyX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmlvbXV4Y19pcnFfZGVzYzsKKwlzdHJ1Y3QgaXJxX2RhdGEgKmlvbXV4Y19pcnFfZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEoMzIpOwogCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKGNjbV9iYXNlICsgQ0xQQ1IpOwogCiAJdmFsICY9IH5CTV9DTFBDUl9MUE07CkBAIC0xNjcsMTAgKzE2Nyw5IEBACiAJICogMykgU29mdHdhcmUgc2hvdWxkIG1hc2sgSVJRICMzMiByaWdodCBhZnRlciBDQ00gTG93LVBvd2VyIG1vZGUKIAkgKiAgICBpcyBzZXQgKHNldCBiaXRzIDAtMSBvZiBDQ01fQ0xQQ1IpLgogCSAqLwotCWlvbXV4Y19pcnFfZGVzYyA9IGlycV90b19kZXNjKDMyKTsKLQlpbXhfZ3BjX2lycV91bm1hc2soJmlvbXV4Y19pcnFfZGVzYy0+aXJxX2RhdGEpOworCWlteF9ncGNfaXJxX3VubWFzayhpb211eGNfaXJxX2RhdGEpOwogCXdyaXRlbF9yZWxheGVkKHZhbCwgY2NtX2Jhc2UgKyBDTFBDUik7Ci0JaW14X2dwY19pcnFfbWFzaygmaW9tdXhjX2lycV9kZXNjLT5pcnFfZGF0YSk7CisJaW14X2dwY19pcnFfbWFzayhpb211eGNfaXJxX2RhdGEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9wbS1tbXAyLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9wbS1tbXAyLmMKaW5kZXggNDYxYTE5MS4uNDNiMWE1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvcG0tbW1wMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3BtLW1tcDIuYwpAQCAtMjcsMjIgKzI3LDggQEAKIAogaW50IG1tcDJfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCiB7Ci0JaW50IGlycSA9IGQtPmlycTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7Ci0KLQlpZiAodW5saWtlbHkoaXJxID49IG5yX2lycXMpKSB7Ci0JCXByX2VycigiSVJRIG51Ym1lcnMgYXJlIG91dCBvZiBib3VuZGFyeSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAob24pIHsKLQkJaWYgKGRlc2MtPmFjdGlvbikKLQkJCWRlc2MtPmFjdGlvbi0+ZmxhZ3MgfD0gSVJRRl9OT19TVVNQRU5EOwotCX0gZWxzZSB7Ci0JCWlmIChkZXNjLT5hY3Rpb24pCi0JCQlkZXNjLT5hY3Rpb24tPmZsYWdzICY9IH5JUlFGX05PX1NVU1BFTkQ7Ci0JfQorCWludCBpcnEgPSBkLT5pcnE7CiAKIAkvKiBlbmFibGUgd2FrZXVwIHNvdXJjZXMgKi8KIAlzd2l0Y2ggKGlycSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvcG0tcHhhOTEwLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9wbS1weGE5MTAuYwppbmRleCA0ODk4MWNhLi4wNGM5ZGFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9wbS1weGE5MTAuYworKysgYi9hcmNoL2FybS9tYWNoLW1tcC9wbS1weGE5MTAuYwpAQCAtMjcsMjIgKzI3LDggQEAKIAogaW50IHB4YTkxMF9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKIHsKLQlpbnQgaXJxID0gZGF0YS0+aXJxOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGRhdGEtPmlycSk7CiAJdWludDMyX3QgYXd1Y3JtID0gMCwgYXBjciA9IDA7Ci0KLQlpZiAodW5saWtlbHkoaXJxID49IG5yX2lycXMpKSB7Ci0JCXByX2VycigiSVJRIG51Ym1lcnMgYXJlIG91dCBvZiBib3VuZGFyeSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAob24pIHsKLQkJaWYgKGRlc2MtPmFjdGlvbikKLQkJCWRlc2MtPmFjdGlvbi0+ZmxhZ3MgfD0gSVJRRl9OT19TVVNQRU5EOwotCX0gZWxzZSB7Ci0JCWlmIChkZXNjLT5hY3Rpb24pCi0JCQlkZXNjLT5hY3Rpb24tPmZsYWdzICY9IH5JUlFGX05PX1NVU1BFTkQ7Ci0JfQorCWludCBpcnEgPSBkYXRhLT5pcnE7CiAKIAkvKiBzZXR0aW5nIHdha2V1cCBzb3VyY2VzICovCiAJc3dpdGNoIChpcnEpIHsKQEAgLTExNSw5ICsxMDEsMTEgQEAKIAkJaWYgKGlycSA+PSBJUlFfR1BJT19TVEFSVCAmJiBpcnEgPCBJUlFfQk9BUkRfU1RBUlQpIHsKIAkJCWF3dWNybSA9IE1QTVVfQVdVQ1JNX1dBS0VVUCgyKTsKIAkJCWFwY3IgfD0gTVBNVV9BUENSX1NMUFdQMjsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CisJCQkvKiBGSVhNRTogVGhpcyBzaG91bGQgcmV0dXJuIGEgcHJvcGVyIGVycm9yIGNvZGUgISAqLwogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogbm8gZGVmaW5lZCB3YWtlIHVwIHNvdXJjZSBpcnE6ICVkXG4iLAogCQkJCWlycSk7CisJCX0KIAl9CiAKIAlpZiAob24pIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYW1zLWRlbHRhLWZpcS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9hbXMtZGVsdGEtZmlxLmMKaW5kZXggZjEyYTEyYS4uZDFmMTIwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9hbXMtZGVsdGEtZmlxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9hbXMtZGVsdGEtZmlxLmMKQEAgLTQ0LDEzICs0NCwxMCBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZGVmZXJyZWRfZmlxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmlycV9kZXNjOwotCXN0cnVjdCBpcnFfY2hpcCAqaXJxX2NoaXAgPSBOVUxMOwogCWludCBncGlvLCBpcnFfbnVtLCBmaXFfY291bnQ7CisJc3RydWN0IGlycV9jaGlwICppcnFfY2hpcDsKIAotCWlycV9kZXNjID0gaXJxX3RvX2Rlc2MoZ3Bpb190b19pcnEoQU1TX0RFTFRBX0dQSU9fUElOX0tFWUJSRF9DTEspKTsKLQlpZiAoaXJxX2Rlc2MpCi0JCWlycV9jaGlwID0gaXJxX2Rlc2MtPmlycV9kYXRhLmNoaXA7CisJaXJxX2NoaXAgPSBpcnFfZ2V0X2NoaXAoZ3Bpb190b19pcnEoQU1TX0RFTFRBX0dQSU9fUElOX0tFWUJSRF9DTEspKTsKIAogCS8qCiAJICogRm9yIGVhY2ggaGFuZGxlZCBHUElPIGludGVycnVwdCwga2VlcCBjYWxsaW5nIGl0cyBpbnRlcnJ1cHQgaGFuZGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCmluZGV4IDBhZjdjYTAuLjZmYjkxZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKQEAgLTIxLDcgKzIxLDYgQEAKIAlzZWxlY3QgUE1fT1BQIGlmIFBNCiAJc2VsZWN0IFBNX1JVTlRJTUUgaWYgQ1BVX0lETEUKIAlzZWxlY3QgU09DX0hBU19PTUFQMl9TRFJDCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJIGlmIFVTQl9TVVBQT1JUCiAKIGNvbmZpZyBBUkNIX09NQVA0CiAJYm9vbCAiVEkgT01BUDQiCkBAIC00Miw3ICs0MSw2IEBACiAJc2VsZWN0IFBMMzEwX0VSUkFUQV83Mjc5MTUKIAlzZWxlY3QgUE1fT1BQIGlmIFBNCiAJc2VsZWN0IFBNX1JVTlRJTUUgaWYgQ1BVX0lETEUKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kgaWYgVVNCX1NVUFBPUlQKIAlzZWxlY3QgQVJNX0VSUkFUQV83NTQzMjIKIAlzZWxlY3QgQVJNX0VSUkFUQV83NzU0MjAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCmluZGV4IDA1ZmE1MDUuLjNiOGM4NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKQEAgLTI0LDE3ICsyNCwyMSBAQAogCiBjb25maWcgQVJDSF9FTUVWMgogCWJvb2wgIkVtbWEgTW9iaWxlIEVWMiIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0VNX1NUSQogCiBjb25maWcgQVJDSF9SN1M3MjEwMAogCWJvb2wgIlJaL0ExSCAoUjdTNzIxMDApIgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCiBjb25maWcgQVJDSF9SOEE3NzkwCiAJYm9vbCAiUi1DYXIgSDIgKFI4QTc3OTAwKSIKIAlzZWxlY3QgUkVORVNBU19JUlFDCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogY29uZmlnIEFSQ0hfUjhBNzc5MQogCWJvb2wgIlItQ2FyIE0yIChSOEE3NzkxMCkiCiAJc2VsZWN0IFJFTkVTQVNfSVJRQworCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKIGNvbW1lbnQgIlJlbmVzYXMgQVJNIFNvQ3MgQm9hcmQgVHlwZSIKIApAQCAtNjgsNiArNzIsOCBAQAogCXNlbGVjdCBBUk1fQ1BVX1NVU1BFTkQgaWYgUE0gfHwgQ1BVX0lETEUKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IFNIX0NMS19DUEcKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAKIGNvbmZpZyBBUkNIX1NINzNBMAogCWJvb2wgIlNILU1vYmlsZSBBRzUgKFI4QTczQTAwKSIKQEAgLTc3LDYgKzgzLDggQEAKIAlzZWxlY3QgSTJDCiAJc2VsZWN0IFNIX0NMS19DUEcKIAlzZWxlY3QgUkVORVNBU19JTlRDX0lSUVBJTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIEFSQ0hfUjhBNzNBNAogCWJvb2wgIlItTW9iaWxlIEFQRTYgKFI4QTczQTQwKSIKQEAgLTg3LDYgKzk1LDggQEAKIAlzZWxlY3QgUkVORVNBU19JUlFDCiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKIAlzZWxlY3QgQVJDSF9IQVNfT1BQCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQVJDSF9SOEE3NzQwCiAJYm9vbCAiUi1Nb2JpbGUgQTEgKFI4QTc3NDAwKSIKQEAgLTk1LDYgKzEwNSw4IEBACiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBTSF9DTEtfQ1BHCiAJc2VsZWN0IFJFTkVTQVNfSU5UQ19JUlFQSU4KKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAKIGNvbmZpZyBBUkNIX1I4QTc3NzgKIAlib29sICJSLUNhciBNMUEgKFI4QTc3NzgxKSIKQEAgLTEwMiw4ICsxMTQsNyBAQAogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgU0hfQ0xLX0NQRwogCXNlbGVjdCBBUk1fR0lDCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIEFSQ0hfUjhBNzc3OQogCWJvb2wgIlItQ2FyIEgxIChSOEE3Nzc5MCkiCkBAIC0xMTEsOSArMTIyLDggQEAKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgU0hfQ0xLX0NQRwotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBSRU5FU0FTX0lOVENfSVJRUElOCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIEFSQ0hfUjhBNzc5MAogCWJvb2wgIlItQ2FyIEgyIChSOEE3NzkwMCkiCkBAIC0xMjMsNiArMTMzLDcgQEAKIAlzZWxlY3QgTUlHSFRfSEFWRV9QQ0kKIAlzZWxlY3QgU0hfQ0xLX0NQRwogCXNlbGVjdCBSRU5FU0FTX0lSUUMKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiBjb25maWcgQVJDSF9SOEE3NzkxCiAJYm9vbCAiUi1DYXIgTTIgKFI4QTc3OTEwKSIKQEAgLTEzMiw2ICsxNDMsNyBAQAogCXNlbGVjdCBNSUdIVF9IQVZFX1BDSQogCXNlbGVjdCBTSF9DTEtfQ1BHCiAJc2VsZWN0IFJFTkVTQVNfSVJRQworCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKIGNvbmZpZyBBUkNIX0VNRVYyCiAJYm9vbCAiRW1tYSBNb2JpbGUgRVYyIgpAQCAtMTQxLDYgKzE1Myw3IEBACiAJc2VsZWN0IE1JR0hUX0hBVkVfUENJCiAJc2VsZWN0IFVTRV9PRgogCXNlbGVjdCBBVVRPX1pSRUxBRERSCisJc2VsZWN0IFNZU19TVVBQT1JUU19FTV9TVEkKIAogY29uZmlnIEFSQ0hfUjdTNzIxMDAKIAlib29sICJSWi9BMUggKFI3UzcyMTAwKSIKQEAgLTE0OCw2ICsxNjEsNyBAQAogCXNlbGVjdCBBUk1fR0lDCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBTSF9DTEtfQ1BHCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAKIGNvbW1lbnQgIlJlbmVzYXMgQVJNIFNvQ3MgQm9hcmQgVHlwZSIKIApAQCAtMzIxLDI0ICszMzUsNiBAQAogCSAgd2FudCB0byBzZWxlY3QgYSBIWiB2YWx1ZSBzdWNoIGFzIDEyOCB0aGF0IGNhbiBldmVubHkgZGl2aWRlIFJDTEsuCiAJICBBIEhaIHZhbHVlIHRoYXQgZG9lcyBub3QgZGl2aWRlIGV2ZW5seSBtYXkgY2F1c2UgdGltZXIgZHJpZnQuCiAKLWNvbmZpZyBTSF9USU1FUl9DTVQKLQlib29sICJDTVQgdGltZXIgZHJpdmVyIgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiB0aGUgQ01UIHRpbWVyIGRyaXZlci4KLQotY29uZmlnIFNIX1RJTUVSX1RNVQotCWJvb2wgIlRNVSB0aW1lciBkcml2ZXIiCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIHRoZSBUTVUgdGltZXIgZHJpdmVyLgotCi1jb25maWcgRU1fVElNRVJfU1RJCi0JYm9vbCAiU1RJIHRpbWVyIGRyaXZlciIKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgdGhlIFNUSSB0aW1lciBkcml2ZXIuCi0KIGVuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXJtYWRpbGxvODAwZXZhLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFybWFkaWxsbzgwMGV2YS5jCmluZGV4IDkzNTMzZTIuLjkzMjM4NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXJtYWRpbGxvODAwZXZhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcm1hZGlsbG84MDBldmEuYwpAQCAtOTg4LDE0ICs5ODgsMTIgQEAKIAkuY2FyZAkJPSAiRlNJMkEtV004OTc4IiwKIAkuY29kZWMJCT0gIndtODk3OC4wLTAwMWEiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKLQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUywKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWEtZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9JQl9ORiwKIAl9LAogCS5jb2RlY19kYWkgPSB7CiAJCS5uYW1lCT0gIndtODk3OC1oaWZpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0gfCBTTkRfU09DX0RBSUZNVF9OQl9ORiwKIAkJLnN5c2Nsawk9IDEyMjg4MDAwLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1ib2Nrdy5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1ib2Nrdy5jCmluZGV4IGM0NzUyMjAuLjc0YzI3ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYm9ja3cuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWJvY2t3LmMKQEAgLTQyOSwxNCArNDI5LDEyIEBACiAJCS5jYXJkCQk9ICJTU0k1Ni1BSzQ2NDMiLAogCQkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTIiLAogCQkucGxhdGZvcm0JPSAicmNhcl9zb3VuZCIsCi0JCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KLAorCQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0xFRlRfSiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5jcHVfZGFpID0gewogCQkJLm5hbWUJPSAicnNuZC1kYWkuMCIsCi0JCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKIAkJfSwKIAkJLmNvZGVjX2RhaSA9IHsKIAkJCS5uYW1lCT0gImFrNDY0Mi1oaWZpIiwKLQkJCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkJLnN5c2Nsawk9IDExMjg5NjAwLAogCQl9LAogCX0sCkBAIC00NDYsMTAgKzQ0NCw5IEBACiAJCS5jYXJkCQk9ICJTU0kzLUFLNDU1NChwbGF5YmFjaykiLAogCQkuY29kZWMJCT0gImFrNDU1NC1hZGMtZGFjLjAiLAogCQkucGxhdGZvcm0JPSAicmNhcl9zb3VuZCIsCisJCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyB8IFNORF9TT0NfREFJRk1UX1JJR0hUX0osCiAJCS5jcHVfZGFpID0gewogCQkJLm5hbWUJPSAicnNuZC1kYWkuMSIsCi0JCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9SSUdIVF9KLAogCQl9LAogCQkuY29kZWNfZGFpID0gewogCQkJLm5hbWUJPSAiYWs0NTU0LWhpZmkiLApAQCAtNDYxLDEwICs0NTgsOSBAQAogCQkuY2FyZAkJPSAiU1NJNC1BSzQ1NTQoY2FwdHVyZSkiLAogCQkuY29kZWMJCT0gImFrNDU1NC1hZGMtZGFjLjAiLAogCQkucGxhdGZvcm0JPSAicmNhcl9zb3VuZCIsCisJCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyB8IFNORF9TT0NfREFJRk1UX0xFRlRfSiwKIAkJLmNwdV9kYWkgPSB7CiAJCQkubmFtZQk9ICJyc25kLWRhaS4yIiwKLQkJCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0xFRlRfSiwKIAkJfSwKIAkJLmNvZGVjX2RhaSA9IHsKIAkJCS5uYW1lCT0gImFrNDU1NC1oaWZpIiwKQEAgLTQ3NiwxMCArNDcyLDkgQEAKIAkJLmNhcmQJCT0gIlNTSTctQUs0NTU0KHBsYXliYWNrKSIsCiAJCS5jb2RlYwkJPSAiYWs0NTU0LWFkYy1kYWMuMSIsCiAJCS5wbGF0Zm9ybQk9ICJyY2FyX3NvdW5kIiwKKwkJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfUklHSFRfSiwKIAkJLmNwdV9kYWkgPSB7CiAJCQkubmFtZQk9ICJyc25kLWRhaS4zIiwKLQkJCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX1JJR0hUX0osCiAJCX0sCiAJCS5jb2RlY19kYWkgPSB7CiAJCQkubmFtZQk9ICJhazQ1NTQtaGlmaSIsCkBAIC00OTEsMTAgKzQ4Niw5IEBACiAJCS5jYXJkCQk9ICJTU0k4LUFLNDU1NChjYXB0dXJlKSIsCiAJCS5jb2RlYwkJPSAiYWs0NTU0LWFkYy1kYWMuMSIsCiAJCS5wbGF0Zm9ybQk9ICJyY2FyX3NvdW5kIiwKKwkJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfTEVGVF9KLAogCQkuY3B1X2RhaSA9IHsKIAkJCS5uYW1lCT0gInJzbmQtZGFpLjQiLAotCQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0gfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfTEVGVF9KLAogCQl9LAogCQkuY29kZWNfZGFpID0gewogCQkJLm5hbWUJPSAiYWs0NTU0LWhpZmkiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rem05Zy5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rem05Zy5jCmluZGV4IGJjNDBiODUuLjAzZGMzYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta3ptOWcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWt6bTlnLmMKQEAgLTU4OSwxNCArNTg5LDEyIEBACiAJLmNhcmQJCT0gIkZTSTJBLUFLNDY0OCIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCi0JLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0osCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0ogfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2lhLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAogCX0sCiAJLmNvZGVjX2RhaSA9IHsKIAkJLm5hbWUJPSAiYWs0NjQyLWhpZmkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLnN5c2Nsawk9IDExMjg5NjAwLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCmluZGV4IDNhYmEwMzcuLjBmZjRkOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKQEAgLTUwOSw5ICs1MDksOSBAQAogCS5jYXJkCQk9ICJGU0kyQi1IRE1JIiwKIAkuY29kZWMJCT0gInNoLW1vYmlsZS1oZG1pIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2liLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJzaF9tb2JpbGVfaGRtaS1oaWZpIiwKQEAgLTkwNSwxNCArOTA1LDEyIEBACiAJLmNhcmQJCT0gIkZTSTJBLUFLNDY0MyIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEzIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCi0JLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0osCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0ogfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2lhLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAogCX0sCiAJLmNvZGVjX2RhaSA9IHsKIAkJLm5hbWUJPSAiYWs0NjQyLWhpZmkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLnN5c2Nsawk9IDExMjg5NjAwLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCmluZGV4IGIxMjMyZDguLjQ5MjZiZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKQEAgLTE5LDcgKzE5LDYgQEAKIAlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgogCXNlbGVjdCBTT0NfQlVTCiAJc2VsZWN0IFNQQVJTRV9JUlEKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kgaWYgVVNCX1NVUFBPUlQKIAlzZWxlY3QgVVNCX1VMUEkgaWYgVVNCX1BIWQogCXNlbGVjdCBVU0JfVUxQSV9WSUVXUE9SVCBpZiBVU0JfUEhZCiAJc2VsZWN0IFVTRV9PRgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlCmluZGV4IDBmMzYyYjYuLjNlYzc0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLCBVMzAwIG1hY2hpbmUuCiAjCiAKLW9iai15CQk6PSBjb3JlLm8gdGltZXIubworb2JqLXkJCTo9IGNvcmUubwogb2JqLW0JCTo9CiBvYmotbgkJOj0KIG9iai0JCTo9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA4ZmQzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qCi0gKgotICogYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKLSAqCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU1QtRXJpY3Nzb24gQUIKLSAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgotICogVGltZXIgQ09IIDkwMSAzMjgsIHJ1bnMgdGhlIE9TIHRpbWVyIGludGVycnVwdC4KLSAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZF9jbG9jay5oPgotCi0vKiBHZW5lcmljIHN0dWZmICovCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotCi0vKgotICogQVBQIHNpZGUgc3BlY2lhbCB0aW1lciByZWdpc3RlcnMKLSAqIFRoaXMgdGltZXIgY29udGFpbnMgZm91ciB0aW1lcnMgd2hpY2ggY2FuIGZpcmUgYW4gaW50ZXJydXB0IGVhY2guCi0gKiBPUyAob3BlcmF0aW5nIHN5c3RlbSkgdGltZXIgQCAzMjc2OCBIegotICogREQgKGRldmljZSBkcml2ZXIpIHRpbWVyIEAgMSBrSHoKLSAqIEdQMSAoZ2VuZXJhbCBwdXJwb3NlIDEpIHRpbWVyIEAgMU1IegotICogR1AyIChnZW5lcmFsIHB1cnBvc2UgMikgdGltZXIgQCAxTUh6Ci0gKi8KLQotLyogUmVzZXQgT1MgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUk9TVAkJCQkJKDB4MDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUk9TVF9USU1FUl9SRVNFVAkJCQkoMHgwMDAwMDAwMCkKLS8qIEVuYWJsZSBPUyBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FT1NUCQkJCQkoMHgwMDA0KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FT1NUX1RJTUVSX0VOQUJMRQkJCSgweDAwMDAwMDAwKQotLyogRGlzYWJsZSBPUyBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ET1NUCQkJCQkoMHgwMDA4KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ET1NUX1RJTUVSX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKLS8qIE9TIFRpbWVyIE1vZGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU09TVE0JCQkJCSgweDAwMGMpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NPU1RNX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TT1NUTV9NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMDEpCi0vKiBPUyBUaW1lciBTdGF0dXMgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUUwkJCQkJKDB4MDAxMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19USU1FUl9TVEFURV9NQVNLCQkJKDB4MDAwMDAwMEYpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfVElNRVJfU1RBVEVfSURMRQkJCSgweDAwMDAwMDAxKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX1RJTUVSX1NUQVRFX0FDVElWRQkJCSgweDAwMDAwMDAyKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX0VOQUJMRV9JTkQJCQkJKDB4MDAwMDAwMTApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfTU9ERV9NQVNLCQkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19JUlFfRU5BQkxFRF9JTkQJCQkoMHgwMDAwMDA0MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19JUlFfUEVORElOR19JTkQJCQkoMHgwMDAwMDA4MCkKLS8qIE9TIFRpbWVyIEN1cnJlbnQgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUQ0MJCQkJCSgweDAwMTQpCi0vKiBPUyBUaW1lciBUZXJtaW5hbCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RUQwkJCQkJKDB4MDAxOCkKLS8qIE9TIFRpbWVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUUJCQkJCSgweDAwMWMpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElFX0lSUV9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElFX0lSUV9FTkFCTEUJCQkJKDB4MDAwMDAwMDEpCi0vKiBPUyBUaW1lciBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUEJCQkJCSgweDAwMjApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElBX0lSUV9BQ0sJCQkJKDB4MDAwMDAwODApCi0KLS8qIFJlc2V0IEREIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JERFQJCQkJCSgweDAwNDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JERFRfVElNRVJfUkVTRVQJCQkJKDB4MDAwMDAwMDApCi0vKiBFbmFibGUgREQgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUREVAkJCQkJKDB4MDA0NCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUREVF9USU1FUl9FTkFCTEUJCQkoMHgwMDAwMDAwMCkKLS8qIERpc2FibGUgREQgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREREVAkJCQkJKDB4MDA0OCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREREVF9USU1FUl9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCi0vKiBERCBUaW1lciBNb2RlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NERFRNCQkJCQkoMHgwMDRjKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TRERUTV9NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0REVE1fTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDAxKQotLyogREQgVGltZXIgU3RhdHVzIFJlZ2lzdGVyIDMyYml0IChSLy0pICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFMJCQkJCSgweDAwNTApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfVElNRVJfU1RBVEVfTUFTSwkJCSgweDAwMDAwMDBGKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX1RJTUVSX1NUQVRFX0lETEUJCQkoMHgwMDAwMDAwMSkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19USU1FUl9TVEFURV9BQ1RJVkUJCQkoMHgwMDAwMDAwMikKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19FTkFCTEVfSU5ECQkJCSgweDAwMDAwMDEwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX01PREVfTUFTSwkJCQkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMjApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfSVJRX0VOQUJMRURfSU5ECQkJKDB4MDAwMDAwNDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfSVJRX1BFTkRJTkdfSU5ECQkJKDB4MDAwMDAwODApCi0vKiBERCBUaW1lciBDdXJyZW50IENvdW50IFJlZ2lzdGVyIDMyYml0IChSLy0pICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVENDCQkJCQkoMHgwMDU0KQotLyogREQgVGltZXIgVGVybWluYWwgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUVEMJCQkJCSgweDAwNTgpCi0vKiBERCBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElFCQkJCQkoMHgwMDVjKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJRV9JUlFfRElTQUJMRQkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJRV9JUlFfRU5BQkxFCQkJCSgweDAwMDAwMDAxKQotLyogREQgVGltZXIgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElBCQkJCQkoMHgwMDYwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJQV9JUlFfQUNLCQkJCSgweDAwMDAwMDgwKQotCi0vKiBSZXNldCBHUDEgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkdQVDEJCQkJCSgweDAwODApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JHUFQxX1RJTUVSX1JFU0VUCQkJKDB4MDAwMDAwMDApCi0vKiBFbmFibGUgR1AxIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VHUFQxCQkJCQkoMHgwMDg0KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FR1BUMV9USU1FUl9FTkFCTEUJCQkoMHgwMDAwMDAwMCkKLS8qIERpc2FibGUgR1AxIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RHUFQxCQkJCQkoMHgwMDg4KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCi0vKiBHUDEgVGltZXIgTW9kZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMU0JCQkJCSgweDAwOGMpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQxTV9NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAwMSkKLS8qIEdQMSBUaW1lciBTdGF0dXMgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVMJCQkJCSgweDAwOTApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX1RJTUVSX1NUQVRFX01BU0sJCQkoMHgwMDAwMDAwRikKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfVElNRVJfU1RBVEVfSURMRQkJCSgweDAwMDAwMDAxKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19USU1FUl9TVEFURV9BQ1RJVkUJCQkoMHgwMDAwMDAwMikKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfRU5BQkxFX0lORAkJCQkoMHgwMDAwMDAxMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfTU9ERV9NQVNLCQkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19JUlFfRU5BQkxFRF9JTkQJCQkoMHgwMDAwMDA0MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfSVJRX1BFTkRJTkdfSU5ECQkJKDB4MDAwMDAwODApCi0vKiBHUDEgVGltZXIgQ3VycmVudCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxQ0MJCQkJCSgweDAwOTQpCi0vKiBHUDEgVGltZXIgVGVybWluYWwgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVRDCQkJCQkoMHgwMDk4KQotLyogR1AxIFRpbWVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlFCQkJCQkoMHgwMDljKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUJCQkoMHgwMDAwMDAwMSkKLS8qIEdQMSBUaW1lciBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlBCQkJCQkoMHgwMGEwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUFfSVJRX0FDSwkJCQkoMHgwMDAwMDA4MCkKLQotLyogUmVzZXQgR1AyIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JHUFQyCQkJCQkoMHgwMGMwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SR1BUMl9USU1FUl9SRVNFVAkJCSgweDAwMDAwMDAwKQotLyogRW5hYmxlIEdQMiBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FR1BUMgkJCQkJKDB4MDBjNCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUdQVDJfVElNRVJfRU5BQkxFCQkJKDB4MDAwMDAwMDApCi0vKiBEaXNhYmxlIEdQMiBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ER1BUMgkJCQkJKDB4MDBjOCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREdQVDJfVElNRVJfRElTQUJMRQkJCSgweDAwMDAwMDAwKQotLyogR1AyIFRpbWVyIE1vZGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDJNCQkJCQkoMHgwMGNjKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMk1fTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQyTV9NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMDEpCi0vKiBHUDIgVGltZXIgU3RhdHVzIFJlZ2lzdGVyIDMyYml0IChSLy0pICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTCQkJCQkoMHgwMGQwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19USU1FUl9TVEFURV9NQVNLCQkJKDB4MDAwMDAwMEYpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX1RJTUVSX1NUQVRFX0lETEUJCQkoMHgwMDAwMDAwMSkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfVElNRVJfU1RBVEVfQUNUSVZFCQkJKDB4MDAwMDAwMDIpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX0VOQUJMRV9JTkQJCQkJKDB4MDAwMDAwMTApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX01PREVfTUFTSwkJCQkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfSVJRX0VOQUJMRURfSU5ECQkJKDB4MDAwMDAwNDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX0lSUV9QRU5ESU5HX0lORAkJCSgweDAwMDAwMDgwKQotLyogR1AyIFRpbWVyIEN1cnJlbnQgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMkNDCQkJCQkoMHgwMGQ0KQotLyogR1AyIFRpbWVyIFRlcm1pbmFsIENvdW50IFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJUQwkJCQkJKDB4MDBkOCkKLS8qIEdQMiBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJRQkJCQkJKDB4MDBkYykKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklFX0lSUV9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJRV9JUlFfRU5BQkxFCQkJKDB4MDAwMDAwMDEpCi0vKiBHUDIgVGltZXIgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJQQkJCQkJKDB4MDBlMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklBX0lSUV9BQ0sJCQkJKDB4MDAwMDAwODApCi0KLS8qIENsb2NrIHJlcXVlc3QgY29udHJvbCByZWdpc3RlciAtIGFsbCBmb3VyIHRpbWVycyAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9DUkMJCQkJCSgweDEwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfQ1JDX0NMT0NLX1JFUVVFU1RfRU5BQkxFCQkJKDB4MDAwMDAwMDEpCi0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKnUzMDBfdGltZXJfYmFzZTsKLQotc3RydWN0IHUzMDBfY2xvY2tldmVudF9kYXRhIHsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNldmQ7Ci0JdW5zaWduZWQgdGlja3NfcGVyX2ppZmZ5OwotfTsKLQotLyoKLSAqIFRoZSB1MzAwX3NldF9tb2RlKCkgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBmaXJzdCwgaWYgd2UKLSAqIGhhdmUgb25lc2hvdCB0aW1lciBhY3RpdmUsIHRoZSBvbmVzaG90IHNjaGVkdWxpbmcgZnVuY3Rpb24KLSAqIHUzMDBfc2V0X25leHRfZXZlbnQoKSBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHUzMDBfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQlzdHJ1Y3QgdTMwMF9jbG9ja2V2ZW50X2RhdGEgKmNldmRhdGEgPQotCQljb250YWluZXJfb2YoZXZ0LCBzdHJ1Y3QgdTMwMF9jbG9ja2V2ZW50X2RhdGEsIGNldmQpOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKLQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIEdQVDEgKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRElTQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7Ci0JCS8qIERpc2FibGUgR1AxIHdoaWxlIHdlJ3JlIHJlcHJvZ3JhbW1pbmcgaXQuICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREdQVDEpOwotCQkvKgotCQkgKiBTZXQgdGhlIHBlcmlvZGljIG1vZGUgdG8gYSBjZXJ0YWluIG51bWJlciBvZiB0aWNrcyBwZXIKLQkJICogamlmZnkuCi0JCSAqLwotCQl3cml0ZWwoY2V2ZGF0YS0+dGlja3NfcGVyX2ppZmZ5LAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMVRDKTsKLQkJLyoKLQkJICogU2V0IGNvbnRpbnVvdXMgbW9kZSwgc28gdGhlIHRpbWVyIGtlZXBzIHRyaWdnZXJpbmcKLQkJICogaW50ZXJydXB0cy4KLQkJICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9TR1BUMU1fTU9ERV9DT05USU5VT1VTLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfU0dQVDFNKTsKLQkJLyogRW5hYmxlIHRpbWVyIGludGVycnVwdHMgKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRU5BQkxFLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKLQkJLyogVGhlbiBlbmFibGUgdGhlIE9TIHRpbWVyIGFnYWluICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9FR1BUMV9USU1FUl9FTkFCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9FR1BUMSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKLQkJLyogSnVzdCBicmVhazsgaGVyZT8gKi8KLQkJLyoKLQkJICogVGhlIGFjdHVhbCBldmVudCB3aWxsIGJlIHByb2dyYW1tZWQgYnkgdGhlIG5leHQgZXZlbnQgaG9vaywKLQkJICogc28gd2UganVzdCBzZXQgYSBkdW1teSB2YWx1ZSBzb21ld2hlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLQkJICogdW5pdmVyc2UgaGVyZS4KLQkJICovCi0JCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiBHUFQxICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOwotCQkvKiBEaXNhYmxlIEdQMSB3aGlsZSB3ZSdyZSByZXByb2dyYW1taW5nIGl0LiAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RHUFQxKTsKLQkJLyoKLQkJICogRXhwaXJlIGZhciBpbiB0aGUgZnV0dXJlLCB1MzAwX3NldF9uZXh0X2V2ZW50KCkgd2lsbCBiZQotCQkgKiBjYWxsZWQgc29vbi4uLgotCQkgKi8KLQkJd3JpdGVsKDB4RkZGRkZGRkYsIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFUQyk7Ci0JCS8qIFdlIHJ1biBvbmUgc2hvdCBwZXIgdGljayBoZXJlISAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfT05FX1NIT1QsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9TR1BUMU0pOwotCQkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgdGhpcyB0aW1lciAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOwotCQkvKiBFbmFibGUgdGltZXIgKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0VHUFQxX1RJTUVSX0VOQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0VHUFQxKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKLQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIEdQMSAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9ESVNBQkxFLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKLQkJLyogRGlzYWJsZSBHUDEgKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RHUFQxX1RJTUVSX0RJU0FCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ER1BUMSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgotCQkvKiBJZ25vcmUgdGhpcyBjYWxsICovCi0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIFRoZSBhcHAgdGltZXIgaW4gb25lIHNob3QgbW9kZSBvYnZpb3VzbHkgaGFzIHRvIGJlIHJlcHJvZ3JhbW1lZAotICogaW4gRVhBQ1RMWSB0aGlzIHNlcXVlbmNlIHRvIHdvcmsgcHJvcGVybHkuIERvIE5PVCB0cnkgdG8gZS5nLiByZXBsYWNlCi0gKiB0aGUgaW50ZXJydXB0IGRpc2FibGUgKyB0aW1lciBkaXNhYmxlIGNvbW1hbmRzIHdpdGggYSByZXNldCBjb21tYW5kLAotICogaXQgd2lsbCBmYWlsIG1pc2VyYWJseS4gQXBwYXJlbnRseSAoYW5kIEkgZm91bmQgdGhpcyB0aGUgaGFyZCB3YXkpCi0gKiB0aGUgdGltZXIgaXMgdmVyeSBzZW5zaXRpdmUgdG8gdGhlIGluc3RydWN0aW9uIG9yZGVyLCB0aG91Z2ggeW91IGRvbid0Ci0gKiBnZXQgdGhhdCBpbXByZXNzaW9uIGZyb20gdGhlIGRhdGEgc2hlZXQuCi0gKi8KLXN0YXRpYyBpbnQgdTMwMF9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKLQkJCSAgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi0KLXsKLQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gR1BUMSAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUsCi0JICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7Ci0JLyogRGlzYWJsZSBHUDEgd2hpbGUgd2UncmUgcmVwcm9ncmFtbWluZyBpdC4gKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRSwKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREdQVDEpOwotCS8qIFJlc2V0IHRoZSBHZW5lcmFsIFB1cnBvc2UgdGltZXIgMS4gKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUkdQVDFfVElNRVJfUkVTRVQsCi0JICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JHUFQxKTsKLQkvKiBJUlEgaW4gbiAqIGN5Y2xlcyAqLwotCXdyaXRlbChjeWNsZXMsIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFUQyk7Ci0JLyoKLQkgKiBXZSBydW4gb25lIHNob3QgcGVyIHRpY2sgaGVyZSEgKFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHJlY29uZmlndXJlLAotCSAqIHRoZSB0aW1lciB3aWxsIHRpbHQgaWYgeW91IGRvbid0ISkKLQkgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfT05FX1NIT1QsCi0JICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1NHUFQxTSk7Ci0JLyogRW5hYmxlIHRpbWVyIGludGVycnVwdHMgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUsCi0JICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7Ci0JLyogVGhlbiBlbmFibGUgdGhlIE9TIHRpbWVyIGFnYWluICovCi0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX0VHUFQxX1RJTUVSX0VOQUJMRSwKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRUdQVDEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHUzMDBfY2xvY2tldmVudF9kYXRhIHUzMDBfY2xvY2tldmVudF9kYXRhID0gewotCS8qIFVzZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgMSBhcyBjbG9jayBldmVudCAqLwotCS5jZXZkID0gewotCQkubmFtZQkJPSAiR1BUMSIsCi0JCS8qIFJlYXNvbmFibHkgZmFzdCBhbmQgYWNjdXJhdGUgY2xvY2sgZXZlbnQgKi8KLQkJLnJhdGluZwkJPSAzMDAsCi0JCS5mZWF0dXJlcwk9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwKLQkJCUNMT0NLX0VWVF9GRUFUX09ORVNIT1QsCi0JCS5zZXRfbmV4dF9ldmVudAk9IHUzMDBfc2V0X25leHRfZXZlbnQsCi0JCS5zZXRfbW9kZQk9IHUzMDBfc2V0X21vZGUsCi0JfSwKLX07Ci0KLS8qIENsb2NrIGV2ZW50IHRpbWVyIGludGVycnVwdCBoYW5kbGVyICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgdTMwMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZ1MzAwX2Nsb2NrZXZlbnRfZGF0YS5jZXZkOwotCS8qIEFDSy9DbGVhciB0aW1lciBJUlEgZm9yIHRoZSBBUFAgR1BUMSBUaW1lciAqLwotCi0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJQV9JUlFfQUNLLAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUEpOwotCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdTMwMF90aW1lcl9pcnEgPSB7Ci0JLm5hbWUJCT0gIlUzMDAgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotCS5oYW5kbGVyCT0gdTMwMF90aW1lcl9pbnRlcnJ1cHQsCi19OwotCi0vKgotICogT3ZlcnJpZGUgdGhlIGdsb2JhbCB3ZWFrIHNjaGVkX2Nsb2NrIHN5bWJvbCB3aXRoIHRoaXMKLSAqIGxvY2FsIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgdGhlIGNsb2Nrc291cmNlIHRvIGdldCBzb21lCi0gKiBiZXR0ZXIgcmVzb2x1dGlvbiB3aGVuIHNjaGVkdWxpbmcgdGhlIGtlcm5lbC4gV2UgYWNjZXB0IHRoYXQKLSAqIHRoaXMgd3JhcHMgYXJvdW5kIGZvciBub3csIHNpbmNlIGl0IGlzIGp1c3QgYSByZWxhdGl2ZSB0aW1lCi0gKiBzdGFtcC4gKEluc3BpcmVkIGJ5IE9NQVAgaW1wbGVtZW50YXRpb24uKQotICovCi0KLXN0YXRpYyB1NjQgbm90cmFjZSB1MzAwX3JlYWRfc2NoZWRfY2xvY2sodm9pZCkKLXsKLQlyZXR1cm4gcmVhZGwodTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMkNDKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdTMwMF9yZWFkX2N1cnJlbnRfdGltZXIodm9pZCkKLXsKLQlyZXR1cm4gcmVhZGwodTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMkNDKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZWxheV90aW1lciB1MzAwX2RlbGF5X3RpbWVyOwotCi0vKgotICogVGhpcyBzZXRzIHVwIHRoZSBzeXN0ZW0gdGltZXJzLCBjbG9jayBzb3VyY2UgYW5kIGNsb2NrIGV2ZW50LgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdTMwMF90aW1lcl9pbml0X29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JdW5zaWduZWQgaW50IGlycTsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCi0JdTMwMF90aW1lcl9iYXNlID0gb2ZfaW9tYXAobnAsIDApOwotCWlmICghdTMwMF90aW1lcl9iYXNlKQotCQlwYW5pYygiY291bGQgbm90IGlvcmVtYXAgc3lzdGVtIHRpbWVyXG4iKTsKLQotCS8qIEdldCB0aGUgSVJRIGZvciB0aGUgR1AxIHRpbWVyICovCi0JaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDIpOwotCWlmICghaXJxKQotCQlwYW5pYygibm8gSVJRIGZvciBzeXN0ZW0gdGltZXJcbiIpOwotCi0JcHJfaW5mbygiVTMwMCBHUDEgdGltZXIgQCBiYXNlOiAlcCwgSVJROiAldVxuIiwgdTMwMF90aW1lcl9iYXNlLCBpcnEpOwotCi0JLyogQ2xvY2sgdGhlIGludGVycnVwdCBjb250cm9sbGVyICovCi0JY2xrID0gb2ZfY2xrX2dldChucCwgMCk7Ci0JQlVHX09OKElTX0VSUihjbGspKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKLQlyYXRlID0gY2xrX2dldF9yYXRlKGNsayk7Ci0KLQl1MzAwX2Nsb2NrZXZlbnRfZGF0YS50aWNrc19wZXJfamlmZnkgPSBESVZfUk9VTkRfQ0xPU0VTVChyYXRlLCBIWik7Ci0KLQlzY2hlZF9jbG9ja19yZWdpc3Rlcih1MzAwX3JlYWRfc2NoZWRfY2xvY2ssIDMyLCByYXRlKTsKLQotCXUzMDBfZGVsYXlfdGltZXIucmVhZF9jdXJyZW50X3RpbWVyID0gJnUzMDBfcmVhZF9jdXJyZW50X3RpbWVyOwotCXUzMDBfZGVsYXlfdGltZXIuZnJlcSA9IHJhdGU7Ci0JcmVnaXN0ZXJfY3VycmVudF90aW1lcl9kZWxheSgmdTMwMF9kZWxheV90aW1lcik7Ci0KLQkvKgotCSAqIERpc2FibGUgdGhlICJPUyIgYW5kICJERCIgdGltZXJzIC0gdGhlc2UgYXJlIGRlc2lnbmVkIGZvciBTeW1iaWFuIQotCSAqIEV4YW1wbGUgdXNhZ2UgaW4gY25oMTYwMTU3OCBjcHUgc3Vic3lzdGVtIHBkX3RpbWVyX2FwcC5jCi0JICovCi0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX0NSQ19DTE9DS19SRVFVRVNUX0VOQUJMRSwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfQ1JDKTsKLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUk9TVF9USU1FUl9SRVNFVCwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUk9TVCk7Ci0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RPU1RfVElNRVJfRElTQUJMRSwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRE9TVCk7Ci0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX1JERFRfVElNRVJfUkVTRVQsCi0JCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JERFQpOwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ERERUX1RJTUVSX0RJU0FCTEUsCi0JCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RERFQpOwotCi0JLyogUmVzZXQgdGhlIEdlbmVyYWwgUHVycG9zZSB0aW1lciAxLiAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9SR1BUMV9USU1FUl9SRVNFVCwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUkdQVDEpOwotCi0JLyogU2V0IHVwIHRoZSBJUlEgaGFuZGxlciAqLwotCXNldHVwX2lycShpcnEsICZ1MzAwX3RpbWVyX2lycSk7Ci0KLQkvKiBSZXNldCB0aGUgR2VuZXJhbCBQdXJwb3NlIHRpbWVyIDIgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUkdQVDJfVElNRVJfUkVTRVQsCi0JCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JHUFQyKTsKLQkvKiBTZXQgdGhpcyB0aW1lciB0byBydW4gYXJvdW5kIGZvcmV2ZXIgKi8KLQl3cml0ZWwoMHhGRkZGRkZGRlUsIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDJUQyk7Ci0JLyogU2V0IGNvbnRpbnVvdXMgbW9kZSBzbyBpdCB3cmFwcyBhcm91bmQgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDJNX01PREVfQ09OVElOVU9VUywKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfU0dQVDJNKTsKLQkvKiBEaXNhYmxlIHRpbWVyIGludGVycnVwdHMgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMklFX0lSUV9ESVNBQkxFLAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQySUUpOwotCS8qIFRoZW4gZW5hYmxlIHRoZSBHUDIgdGltZXIgdG8gdXNlIGFzIGEgZnJlZSBydW5uaW5nIHVzIGNvdW50ZXIgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfRUdQVDJfVElNRVJfRU5BQkxFLAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9FR1BUMik7Ci0KLQkvKiBVc2UgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIDIgYXMgY2xvY2sgc291cmNlICovCi0JaWYgKGNsb2Nrc291cmNlX21taW9faW5pdCh1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQyQ0MsCi0JCQkiR1BUMiIsIHJhdGUsIDMwMCwgMzIsIGNsb2Nrc291cmNlX21taW9fcmVhZGxfdXApKQotCQlwcl9lcnIoInRpbWVyOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBVMzAwIGNsb2NrIHNvdXJjZVxuIik7Ci0KLQkvKiBDb25maWd1cmUgYW5kIHJlZ2lzdGVyIHRoZSBjbG9ja2V2ZW50ICovCi0JY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3RlcigmdTMwMF9jbG9ja2V2ZW50X2RhdGEuY2V2ZCwgcmF0ZSwKLQkJCQkJMSwgMHhmZmZmZmZmZik7Ci0KLQkvKgotCSAqIFRPRE86IGluaXQgYW5kIHJlZ2lzdGVyIHRoZSByZXN0IG9mIHRoZSB0aW1lcnMgdG9vLCB0aGV5IGNhbiBiZQotCSAqIHVzZWQgYnkgaHJ0aW1lcnMhCi0JICovCi19Ci0KLUNMT0NLU09VUkNFX09GX0RFQ0xBUkUodTMwMF90aW1lciwgInN0ZXJpY3Nzb24sdTMwMC1hcHB0aW1lciIsCi0JCSAgICAgICB1MzAwX3RpbWVyX2luaXRfb2YpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC16eW5xL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXp5bnEvS2NvbmZpZwppbmRleCA2YjA0MjYwLi5mMDNlNzViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXp5bnEvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXp5bnEvS2NvbmZpZwpAQCAtMiw2ICsyLDggQEAKIAlib29sICJYaWxpbnggWnlucSBBUk0gQ29ydGV4IEE5IFBsYXRmb3JtIiBpZiBBUkNIX01VTFRJX1Y3CiAJc2VsZWN0IEFSTV9BTUJBCiAJc2VsZWN0IEFSTV9HSUMKKwlzZWxlY3QgQVJDSF9IQVNfQ1BVRlJFUQorCXNlbGVjdCBBUkNIX0hBU19PUFAKIAlzZWxlY3QgQ09NTU9OX0NMSwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwpAQCAtMTMsNiArMTUsNiBAQAogCXNlbGVjdCBIQVZFX1NNUAogCXNlbGVjdCBTUEFSU0VfSVJRCiAJc2VsZWN0IENBREVOQ0VfVFRDX1RJTUVSCi0Jc2VsZWN0IEFSTV9HTE9CQUxfVElNRVIKKwlzZWxlY3QgQVJNX0dMT0JBTF9USU1FUiBpZiAhQ1BVX0ZSRVEKIAloZWxwCiAJICBTdXBwb3J0IGZvciBYaWxpbnggWnlucSBBUk0gQ29ydGV4IEE5IFBsYXRmb3JtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLXp5bnEvY29tbW9uLmMKaW5kZXggOGMwOWE4My4uYTM5YmU4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC16eW5xL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtenlucS9jb21tb24uYwpAQCAtNjQsNiArNjQsOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgenlucV9pbml0X21hY2hpbmUodm9pZCkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2luZm8gZGV2aW5mbyA9IHsgLm5hbWUgPSAiY3B1ZnJlcS1jcHUwIiwgfTsKKwogCS8qCiAJICogNjRLQiB3YXkgc2l6ZSwgOC13YXkgYXNzb2NpYXRpdml0eSwgcGFyaXR5IGRpc2FibGVkCiAJICovCkBAIC03Miw2ICs3NCw3IEBACiAJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsIE5VTEwsIE5VTEwpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ6eW5xX2NwdWlkbGVfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZnVsbCgmZGV2aW5mbyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB6eW5xX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZyBiL2FyY2gvYXJtNjQvS2NvbmZpZwppbmRleCBjNmUyZjViLi44MDMzYjliIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L0tjb25maWcKKysrIGIvYXJjaC9hcm02NC9LY29uZmlnCkBAIC0xNiw2ICsxNiw3IEBACiAJc2VsZWN0IERDQUNIRV9XT1JEX0FDQ0VTUwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUIGlmIFNNUAorCXNlbGVjdCBHRU5FUklDX0NQVV9BVVRPUFJPQkUKIAlzZWxlY3QgR0VORVJJQ19JT01BUAogCXNlbGVjdCBHRU5FUklDX0lSUV9QUk9CRQogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCkBAIC0yNiw2ICsyNyw3IEBACiAJc2VsZWN0IEdFTkVSSUNfVElNRV9WU1lTQ0FMTAogCXNlbGVjdCBIQVJESVJRU19TV19SRVNFTkQKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKKwlzZWxlY3QgSEFWRV9BUkNIX0tHREIKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCXNlbGVjdCBIQVZFX0RFQlVHX0JVR1ZFUkJPU0UKIAlzZWxlY3QgSEFWRV9ERUJVR19LTUVNTEVBSwpAQCAtMzgsNiArNDAsOCBAQAogCXNlbGVjdCBIQVZFX01FTUJMT0NLCiAJc2VsZWN0IEhBVkVfUEFUQV9QTEFURk9STQogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCisJc2VsZWN0IEhBVkVfUEVSRl9SRUdTCisJc2VsZWN0IEhBVkVfUEVSRl9VU0VSX1NUQUNLX0RVTVAKIAlzZWxlY3QgSVJRX0RPTUFJTgogCXNlbGVjdCBNT0RVTEVTX1VTRV9FTEZfUkVMQQogCXNlbGVjdCBOT19CT09UTUVNCkBAIC03Myw3ICs3Nyw3IEBACiBjb25maWcgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVAogCWRlZl9ib29sIHkKIAotY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKK2NvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQogCWRlZl9ib29sIHkKIAogY29uZmlnIEdFTkVSSUNfSFdFSUdIVApAQCAtODUsNyArODksNyBAQAogY29uZmlnIEdFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgWk9ORV9ETUEzMgorY29uZmlnIFpPTkVfRE1BCiAJZGVmX2Jvb2wgeQogCiBjb25maWcgQVJDSF9ETUFfQUREUl9UXzY0QklUCkBAIC0xNjQsNiArMTY4LDIyIEBACiAKIAkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCiAKK2NvbmZpZyBTQ0hFRF9NQworCWJvb2wgIk11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTTVAKKwloZWxwCisJICBNdWx0aS1jb3JlIHNjaGVkdWxlciBzdXBwb3J0IGltcHJvdmVzIHRoZSBDUFUgc2NoZWR1bGVyJ3MgZGVjaXNpb24KKwkgIG1ha2luZyB3aGVuIGRlYWxpbmcgd2l0aCBtdWx0aS1jb3JlIENQVSBjaGlwcyBhdCBhIGNvc3Qgb2Ygc2xpZ2h0bHkKKwkgIGluY3JlYXNlZCBvdmVyaGVhZCBpbiBzb21lIHBsYWNlcy4gSWYgdW5zdXJlIHNheSBOIGhlcmUuCisKK2NvbmZpZyBTQ0hFRF9TTVQKKwlib29sICJTTVQgc2NoZWR1bGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTTVAKKwloZWxwCisJICBJbXByb3ZlcyB0aGUgQ1BVIHNjaGVkdWxlcidzIGRlY2lzaW9uIG1ha2luZyB3aGVuIGRlYWxpbmcgd2l0aAorCSAgTXVsdGlUaHJlYWRpbmcgYXQgYSBjb3N0IG9mIHNsaWdodGx5IGluY3JlYXNlZCBvdmVyaGVhZCBpbiBzb21lCisJICBwbGFjZXMuIElmIHVuc3VyZSBzYXkgTiBoZXJlLgorCiBjb25maWcgTlJfQ1BVUwogCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCiAJcmFuZ2UgMiAzMgpAQCAtMzAxLDEwICszMjEsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvY3B1aWRsZS9LY29uZmlnIgogCi1lbmRtZW51Ci0KLW1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyIKLQogc291cmNlICJrZXJuZWwvcG93ZXIvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtLXN0b3JtLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS1zdG9ybS5kdHNpCmluZGV4IGQzN2Q3MzYuLjkzZjRiMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtLXN0b3JtLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9hcG0tc3Rvcm0uZHRzaQpAQCAtMTc2LDYgKzE3Niw4NyBAQAogCQkJCXJlZy1uYW1lcyA9ICJjc3ItcmVnIjsKIAkJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiZXRoOGNsayI7CiAJCQl9OworCisJCQlzYXRhcGh5MWNsazogc2F0YXBoeTFjbGtAMWYyMWMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWRldmljZS1jbG9jayI7CisJCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJCWNsb2NrcyA9IDwmc29jcGxsZGl2MiAwPjsKKwkJCQlyZWcgPSA8MHgwIDB4MWYyMWMwMDAgMHgwIDB4MTAwMD47CisJCQkJcmVnLW5hbWVzID0gImNzci1yZWciOworCQkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzYXRhcGh5MWNsayI7CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQljc3Itb2Zmc2V0ID0gPDB4ND47CisJCQkJY3NyLW1hc2sgPSA8MHgwMD47CisJCQkJZW5hYmxlLW9mZnNldCA9IDwweDA+OworCQkJCWVuYWJsZS1tYXNrID0gPDB4MDY+OworCQkJfTsKKworCQkJc2F0YXBoeTJjbGs6IHNhdGFwaHkxY2xrQDFmMjJjMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1kZXZpY2UtY2xvY2siOworCQkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCQljbG9ja3MgPSA8JnNvY3BsbGRpdjIgMD47CisJCQkJcmVnID0gPDB4MCAweDFmMjJjMDAwIDB4MCAweDEwMDA+OworCQkJCXJlZy1uYW1lcyA9ICJjc3ItcmVnIjsKKwkJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2F0YXBoeTJjbGsiOworCQkJCXN0YXR1cyA9ICJvayI7CisJCQkJY3NyLW9mZnNldCA9IDwweDQ+OworCQkJCWNzci1tYXNrID0gPDB4M2E+OworCQkJCWVuYWJsZS1vZmZzZXQgPSA8MHgwPjsKKwkJCQllbmFibGUtbWFzayA9IDwweDA2PjsKKwkJCX07CisKKwkJCXNhdGFwaHkzY2xrOiBzYXRhcGh5MWNsa0AxZjIzYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtZGV2aWNlLWNsb2NrIjsKKwkJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkJY2xvY2tzID0gPCZzb2NwbGxkaXYyIDA+OworCQkJCXJlZyA9IDwweDAgMHgxZjIzYzAwMCAweDAgMHgxMDAwPjsKKwkJCQlyZWctbmFtZXMgPSAiY3NyLXJlZyI7CisJCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInNhdGFwaHkzY2xrIjsKKwkJCQlzdGF0dXMgPSAib2siOworCQkJCWNzci1vZmZzZXQgPSA8MHg0PjsKKwkJCQljc3ItbWFzayA9IDwweDNhPjsKKwkJCQllbmFibGUtb2Zmc2V0ID0gPDB4MD47CisJCQkJZW5hYmxlLW1hc2sgPSA8MHgwNj47CisJCQl9OworCisJCQlzYXRhMDFjbGs6IHNhdGEwMWNsa0AxZjIxYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtZGV2aWNlLWNsb2NrIjsKKwkJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkJY2xvY2tzID0gPCZzb2NwbGxkaXYyIDA+OworCQkJCXJlZyA9IDwweDAgMHgxZjIxYzAwMCAweDAgMHgxMDAwPjsKKwkJCQlyZWctbmFtZXMgPSAiY3NyLXJlZyI7CisJCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInNhdGEwMWNsayI7CisJCQkJY3NyLW9mZnNldCA9IDwweDQ+OworCQkJCWNzci1tYXNrID0gPDB4MDU+OworCQkJCWVuYWJsZS1vZmZzZXQgPSA8MHgwPjsKKwkJCQllbmFibGUtbWFzayA9IDwweDM5PjsKKwkJCX07CisKKwkJCXNhdGEyM2Nsazogc2F0YTIzY2xrQDFmMjJjMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1kZXZpY2UtY2xvY2siOworCQkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCQljbG9ja3MgPSA8JnNvY3BsbGRpdjIgMD47CisJCQkJcmVnID0gPDB4MCAweDFmMjJjMDAwIDB4MCAweDEwMDA+OworCQkJCXJlZy1uYW1lcyA9ICJjc3ItcmVnIjsKKwkJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2F0YTIzY2xrIjsKKwkJCQljc3Itb2Zmc2V0ID0gPDB4ND47CisJCQkJY3NyLW1hc2sgPSA8MHgwNT47CisJCQkJZW5hYmxlLW9mZnNldCA9IDwweDA+OworCQkJCWVuYWJsZS1tYXNrID0gPDB4Mzk+OworCQkJfTsKKworCQkJc2F0YTQ1Y2xrOiBzYXRhNDVjbGtAMWYyM2MwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWRldmljZS1jbG9jayI7CisJCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJCWNsb2NrcyA9IDwmc29jcGxsZGl2MiAwPjsKKwkJCQlyZWcgPSA8MHgwIDB4MWYyM2MwMDAgMHgwIDB4MTAwMD47CisJCQkJcmVnLW5hbWVzID0gImNzci1yZWciOworCQkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzYXRhNDVjbGsiOworCQkJCWNzci1vZmZzZXQgPSA8MHg0PjsKKwkJCQljc3ItbWFzayA9IDwweDA1PjsKKwkJCQllbmFibGUtb2Zmc2V0ID0gPDB4MD47CisJCQkJZW5hYmxlLW1hc2sgPSA8MHgzOT47CisJCQl9OwogCQl9OwogCiAJCXNlcmlhbDA6IHNlcmlhbEAxYzAyMDAwMCB7CkBAIC0xODcsNSArMjY4LDc2IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQkJaW50ZXJydXB0cyA9IDwweDAgMHg0YyAweDQ+OwogCQl9OworCisJCXBoeTE6IHBoeUAxZjIxYTAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiOworCQkJcmVnID0gPDB4MCAweDFmMjFhMDAwIDB4MCAweDEwMD47CisJCQkjcGh5LWNlbGxzID0gPDE+OworCQkJY2xvY2tzID0gPCZzYXRhcGh5MWNsayAwPjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQlhcG0sdHgtYm9vc3QtZ2FpbiA9IDwzMCAzMCAzMCAzMCAzMCAzMD47CisJCQlhcG0sdHgtZXllLXR1bmluZyA9IDwyIDEwIDEwIDIgMTAgMTA+OworCQl9OworCisJCXBoeTI6IHBoeUAxZjIyYTAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiOworCQkJcmVnID0gPDB4MCAweDFmMjJhMDAwIDB4MCAweDEwMD47CisJCQkjcGh5LWNlbGxzID0gPDE+OworCQkJY2xvY2tzID0gPCZzYXRhcGh5MmNsayAwPjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCQlhcG0sdHgtYm9vc3QtZ2FpbiA9IDwzMCAzMCAzMCAzMCAzMCAzMD47CisJCQlhcG0sdHgtZXllLXR1bmluZyA9IDwxIDEwIDEwIDIgMTAgMTA+OworCQl9OworCisJCXBoeTM6IHBoeUAxZjIzYTAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiOworCQkJcmVnID0gPDB4MCAweDFmMjNhMDAwIDB4MCAweDEwMD47CisJCQkjcGh5LWNlbGxzID0gPDE+OworCQkJY2xvY2tzID0gPCZzYXRhcGh5M2NsayAwPjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCQlhcG0sdHgtYm9vc3QtZ2FpbiA9IDwzMSAzMSAzMSAzMSAzMSAzMT47CisJCQlhcG0sdHgtZXllLXR1bmluZyA9IDwyIDEwIDEwIDIgMTAgMTA+OworCQl9OworCisJCXNhdGExOiBzYXRhQDFhMDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWFoY2kiOworCQkJcmVnID0gPDB4MCAweDFhMDAwMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjEwMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjFkMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjFlMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjE3MDAwIDB4MCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHg4NiAweDQ+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCWNsb2NrcyA9IDwmc2F0YTAxY2xrIDA+OworCQkJcGh5cyA9IDwmcGh5MSAwPjsKKwkJCXBoeS1uYW1lcyA9ICJzYXRhLXBoeSI7CisJCX07CisKKwkJc2F0YTI6IHNhdGFAMWE0MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaSI7CisJCQlyZWcgPSA8MHgwIDB4MWE0MDAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMjAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMmQwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMmUwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMjcwMDAgMHgwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDg3IDB4ND47CisJCQlzdGF0dXMgPSAib2siOworCQkJY2xvY2tzID0gPCZzYXRhMjNjbGsgMD47CisJCQlwaHlzID0gPCZwaHkyIDA+OworCQkJcGh5LW5hbWVzID0gInNhdGEtcGh5IjsKKwkJfTsKKworCQlzYXRhMzogc2F0YUAxYTgwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1haGNpIjsKKwkJCXJlZyA9IDwweDAgMHgxYTgwMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzZDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzZTAwMCAweDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4ODggMHg0PjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCQljbG9ja3MgPSA8JnNhdGE0NWNsayAwPjsKKwkJCXBoeXMgPSA8JnBoeTMgMD47CisJCQlwaHktbmFtZXMgPSAic2F0YS1waHkiOworCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA3MWM1M2VjLi40YmNhNDkyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEyLDYgKzEyLDcgQEAKIGdlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCiBnZW5lcmljLXkgKz0gZXJybm8uaAogZ2VuZXJpYy15ICs9IGZ0cmFjZS5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaHdfaXJxLmgKIGdlbmVyaWMteSArPSBpb2N0bC5oCiBnZW5lcmljLXkgKz0gaW9jdGxzLmgKQEAgLTIyLDEzICsyMywxNiBAQAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCiBnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtc2didWYuaAogZ2VuZXJpYy15ICs9IG11dGV4LmgKIGdlbmVyaWMteSArPSBwY2kuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCitnZW5lcmljLXkgKz0gcndzZW0uaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZWN0aW9ucy5oCiBnZW5lcmljLXkgKz0gc2VnbWVudC5oCkBAIC0zOCw4ICs0Miw4IEBACiBnZW5lcmljLXkgKz0gc2l6ZXMuaAogZ2VuZXJpYy15ICs9IHNvY2tldC5oCiBnZW5lcmljLXkgKz0gc29ja2lvcy5oCi1nZW5lcmljLXkgKz0gc3dpdGNoX3RvLmgKIGdlbmVyaWMteSArPSBzd2FiLmgKK2dlbmVyaWMteSArPSBzd2l0Y2hfdG8uaAogZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKIGdlbmVyaWMteSArPSB0ZXJtaW9zLmgKIGdlbmVyaWMteSArPSB0b3BvbG9neS5oCkBAIC00OSw1ICs1MywzIEBACiBnZW5lcmljLXkgKz0gdXNlci5oCiBnZW5lcmljLXkgKz0gdmdhLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9iYXJyaWVyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaAppbmRleCA0MDljYTM3Li42NmViNzY0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSB3ZmkoKQkJYXNtIHZvbGF0aWxlKCJ3ZmkiIDogOiA6ICJtZW1vcnkiKQogCiAjZGVmaW5lIGlzYigpCQlhc20gdm9sYXRpbGUoImlzYiIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIGRtYihvcHQpCWFzbSB2b2xhdGlsZSgiZG1iIHN5IiA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgZHNiKG9wdCkJYXNtIHZvbGF0aWxlKCJkc2Igc3kiIDogOiA6ICJtZW1vcnkiKQogCiAjZGVmaW5lIG1iKCkJCWRzYigpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDg4OTMyNDk4Li40YzYwZTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtODUsNiArODUsMTMgQEAKIH0KIAogLyoKKyAqIENhY2hlIG1haW50ZW5hbmNlIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBETUEgQVBJLiBObyB0byBiZSB1c2VkIGRpcmVjdGx5LgorICovCitleHRlcm4gdm9pZCBfX2RtYV9tYXBfYXJlYShjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiB2b2lkIF9fZG1hX3VubWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CitleHRlcm4gdm9pZCBfX2RtYV9mbHVzaF9yYW5nZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisKKy8qCiAgKiBDb3B5IHVzZXIgZGF0YSBmcm9tL3RvIGEgcGFnZSB3aGljaCBpcyBtYXBwZWQgaW50byBhIGRpZmZlcmVudAogICogcHJvY2Vzc2VzIGFkZHJlc3Mgc3BhY2UuICBSZWFsbHksIHdlIHdhbnQgdG8gYWxsb3cgb3VyICJ1c2VyCiAgKiBzcGFjZSIgbW9kZWwgdG8gaGFuZGxlIHRoaXMuCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCBmZGEyNzA0Li5lNzFmODFmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NvbXBhdC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTIyOCw3ICsyMjgsNyBAQAogCXJldHVybiAodTMyKSh1bnNpZ25lZCBsb25nKXVwdHI7CiB9CiAKLSNkZWZpbmUgY29tcGF0X3VzZXJfc3RhY2tfcG9pbnRlcigpIChjdXJyZW50X3B0X3JlZ3MoKS0+Y29tcGF0X3NwKQorI2RlZmluZSBjb21wYXRfdXNlcl9zdGFja19wb2ludGVyKCkgKHVzZXJfc3RhY2tfcG9pbnRlcihjdXJyZW50X3B0X3JlZ3MoKSkpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKmFyY2hfY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobG9uZyBsZW4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGFjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IExpbmFybyBMdGQuIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9DUFVGRUFUVVJFX0gKKyNkZWZpbmUgX19BU01fQ1BVRkVBVFVSRV9ICisKKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KKworLyoKKyAqIEluIHRoZSBhcm02NCB3b3JsZCAoYXMgaW4gdGhlIEFSTSB3b3JsZCksIGVsZl9od2NhcCBpcyB1c2VkIGJvdGggaW50ZXJuYWxseQorICogaW4gdGhlIGtlcm5lbCBhbmQgZm9yIHVzZXIgc3BhY2UgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvcHRpb25hbCBmZWF0dXJlcworICogYXJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzeXN0ZW0uIFNvIGxldCdzIG1hcCBmZWF0dXJlICd4JyB0byBIV0NBUF94LgorICogTm90ZSB0aGF0IEhXQ0FQX3ggY29uc3RhbnRzIGFyZSBiaXQgZmllbGRzIHNvIHdlIG5lZWQgdG8gdGFrZSB0aGUgbG9nLgorICovCisKKyNkZWZpbmUgTUFYX0NQVV9GRUFUVVJFUwkoOCAqIHNpemVvZihlbGZfaHdjYXApKQorI2RlZmluZSBjcHVfZmVhdHVyZSh4KQkJaWxvZzIoSFdDQVBfICMjIHgpCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaGF2ZV9mZWF0dXJlKHVuc2lnbmVkIGludCBudW0pCit7CisJcmV0dXJuIGVsZl9od2NhcCAmICgxVUwgPDwgbnVtKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmgKaW5kZXggNjIzMTQ3OS4uNmU5YjViMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kZWJ1Zy1tb25pdG9ycy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaApAQCAtMjYsNiArMjYsNTMgQEAKICNkZWZpbmUgREJHX0VTUl9FVlRfSFdXUAkweDIKICNkZWZpbmUgREJHX0VTUl9FVlRfQlJLCQkweDYKIAorLyoKKyAqIEJyZWFrIHBvaW50IGluc3RydWN0aW9uIGVuY29kaW5nCisgKi8KKyNkZWZpbmUgQlJFQUtfSU5TVFJfU0laRQkJNAorCisvKgorICogRVNSIHZhbHVlcyBleHBlY3RlZCBmb3IgZHluYW1pYyBhbmQgY29tcGlsZSB0aW1lIEJSSyBpbnN0cnVjdGlvbgorICovCisjZGVmaW5lIERCR19FU1JfVkFMX0JSSyh4KQkoMHhmMjAwMDAwMCB8ICgoeCkgJiAweGZmZmZmKSkKKworLyoKKyAqICNpbW0xNiB2YWx1ZXMgdXNlZCBmb3IgQlJLIGluc3RydWN0aW9uIGdlbmVyYXRpb24KKyAqIEFsbG93ZWQgdmFsdWVzIGZvciBrZ2JkIGFyZSAweDQwMCAtIDB4N2ZmCisgKiAweDQwMDogZm9yIGR5bmFtaWMgQlJLIGluc3RydWN0aW9uCisgKiAweDQwMTogZm9yIGNvbXBpbGUgdGltZSBCUksgaW5zdHJ1Y3Rpb24KKyAqLworI2RlZmluZSBLR0RCX0RZTl9ER0JfQlJLX0lNTQkJMHg0MDAKKyNkZWZpbmUgS0RCR19DT01QSUxFRF9EQkdfQlJLX0lNTQkweDQwMQorCisvKgorICogQlJLIGluc3RydWN0aW9uIGVuY29kaW5nCisgKiBUaGUgI2ltbTE2IHZhbHVlIHNob3VsZCBiZSBwbGFjZWQgYXQgYml0c1syMDo1XSB3aXRoaW4gQlJLIGlucworICovCisjZGVmaW5lIEFBUkNINjRfQlJFQUtfTU9OCTB4ZDQyMDAwMDAKKworLyoKKyAqIEV4dHJhY3QgYnl0ZSBmcm9tIEJSSyBpbnN0cnVjdGlvbgorICovCisjZGVmaW5lIEtHREJfRFlOX0RHQl9CUktfSU5TX0JZVEUoeCkgXAorCSgoKChBQVJDSDY0X0JSRUFLX01PTikgJiAweGZmZTAwMDFmKSA+PiAoeCAqIDgpKSAmIDB4ZmYpCisKKy8qCisgKiBFeHRyYWN0IGJ5dGUgZnJvbSBCUksgI2ltbTE2CisgKi8KKyNkZWZpbmUgS0dCRF9EWU5fREdCX0JSS19JTU1fQllURSh4KSBcCisJKCgoKChLR0RCX0RZTl9ER0JfQlJLX0lNTSkgJiAweGZmZmYpIDw8IDUpID4+ICh4ICogOCkpICYgMHhmZikKKworI2RlZmluZSBLR0RCX0RZTl9ER0JfQlJLX0JZVEUoeCkgXAorCShLR0RCX0RZTl9ER0JfQlJLX0lOU19CWVRFKHgpIHwgS0dCRF9EWU5fREdCX0JSS19JTU1fQllURSh4KSkKKworI2RlZmluZSAgS0dEQl9EWU5fQlJLX0lOU19CWVRFMCAgS0dEQl9EWU5fREdCX0JSS19CWVRFKDApCisjZGVmaW5lICBLR0RCX0RZTl9CUktfSU5TX0JZVEUxICBLR0RCX0RZTl9ER0JfQlJLX0JZVEUoMSkKKyNkZWZpbmUgIEtHREJfRFlOX0JSS19JTlNfQllURTIgIEtHREJfRFlOX0RHQl9CUktfQllURSgyKQorI2RlZmluZSAgS0dEQl9EWU5fQlJLX0lOU19CWVRFMyAgS0dEQl9EWU5fREdCX0JSS19CWVRFKDMpCisKKyNkZWZpbmUgQ0FDSEVfRkxVU0hfSVNfU0FGRQkJMQorCiBlbnVtIGRlYnVnX2VsIHsKIAlEQkdfQUNUSVZFX0VMMCA9IDAsCiAJREJHX0FDVElWRV9FTDEsCkBAIC00MywyMyArOTAsNiBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAotI2RlZmluZSBsb2NhbF9kYmdfc2F2ZShmbGFncykJCQkJCQkJXAotCWRvIHsJCQkJCQkJCQlcCi0JCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7CQkJCVwKLQkJYXNtIHZvbGF0aWxlKAkJCQkJCQlcCi0JCSJtcnMJJTAsIGRhaWYJCQkvLyBsb2NhbF9kYmdfc2F2ZVxuIglcCi0JCSJtc3IJZGFpZnNldCwgIzgiCQkJCQkJXAotCQk6ICI9ciIgKGZsYWdzKSA6IDogIm1lbW9yeSIpOwkJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgbG9jYWxfZGJnX3Jlc3RvcmUoZmxhZ3MpCQkJCQkJXAotCWRvIHsJCQkJCQkJCQlcCi0JCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7CQkJCVwKLQkJYXNtIHZvbGF0aWxlKAkJCQkJCQlcCi0JCSJtc3IJZGFpZiwgJTAJCQkvLyBsb2NhbF9kYmdfcmVzdG9yZVxuIglcCi0JCTogOiAiciIgKGZsYWdzKSA6ICJtZW1vcnkiKTsJCQkJCVwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIERCR19BUkNIX0lEX1JFU0VSVkVECTAJLyogSW4gY2FzZSBvZiBwdHJhY2UgQUJJIHVwZGF0ZXMuICovCiAKICNkZWZpbmUgREJHX0hPT0tfSEFORExFRAkwCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggZmQwYzBjMC4uM2E0NTcyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtMzAsNiArMzAsOCBAQAogCiAjZGVmaW5lIERNQV9FUlJPUl9DT0RFCSh+KGRtYV9hZGRyX3QpMCkKIGV4dGVybiBzdHJ1Y3QgZG1hX21hcF9vcHMgKmRtYV9vcHM7CitleHRlcm4gc3RydWN0IGRtYV9tYXBfb3BzIGNvaGVyZW50X3N3aW90bGJfZG1hX29wczsKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcF9vcHMgbm9uY29oZXJlbnRfc3dpb3RsYl9kbWFfb3BzOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkbWFfbWFwX29wcyAqX19nZW5lcmljX2RtYV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNDcsNiArNDksMTEgQEAKIAkJcmV0dXJuIF9fZ2VuZXJpY19kbWFfb3BzKGRldik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkbWFfbWFwX29wcyAqb3BzKQoreworCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IG9wczsKK30KKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oPgogCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGh5c190b19kbWEoc3RydWN0IGRldmljZSAqZGV2LCBwaHlzX2FkZHJfdCBwYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdjYXAuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdjYXAuaAppbmRleCA2Y2RkYmIwLi4wMjRjNDYxIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h3Y2FwLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od2NhcC5oCkBAIC0zMiw2ICszMiwxMiBAQAogI2RlZmluZSBDT01QQVRfSFdDQVBfSURJVgkoQ09NUEFUX0hXQ0FQX0lESVZBfENPTVBBVF9IV0NBUF9JRElWVCkKICNkZWZpbmUgQ09NUEFUX0hXQ0FQX0VWVFNUUk0JKDEgPDwgMjEpCiAKKyNkZWZpbmUgQ09NUEFUX0hXQ0FQMl9BRVMJKDEgPDwgMCkKKyNkZWZpbmUgQ09NUEFUX0hXQ0FQMl9QTVVMTAkoMSA8PCAxKQorI2RlZmluZSBDT01QQVRfSFdDQVAyX1NIQTEJKDEgPDwgMikKKyNkZWZpbmUgQ09NUEFUX0hXQ0FQMl9TSEEyCSgxIDw8IDMpCisjZGVmaW5lIENPTVBBVF9IV0NBUDJfQ1JDMzIJKDEgPDwgNCkKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIC8qCiAgKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CkBAIC00MSw3ICs0Nyw4IEBACiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAjZGVmaW5lIENPTVBBVF9FTEZfSFdDQVAJKGNvbXBhdF9lbGZfaHdjYXApCi1leHRlcm4gdW5zaWduZWQgaW50IGNvbXBhdF9lbGZfaHdjYXA7CisjZGVmaW5lIENPTVBBVF9FTEZfSFdDQVAyCShjb21wYXRfZWxmX2h3Y2FwMikKK2V4dGVybiB1bnNpZ25lZCBpbnQgY29tcGF0X2VsZl9od2NhcCwgY29tcGF0X2VsZl9od2NhcDI7CiAjZW5kaWYKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZWxmX2h3Y2FwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDRjYzgxM2UuLjc4NDZhNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmgKQEAgLTEyMSw3ICsxMjEsNyBAQAogICogIEkvTyBwb3J0IGFjY2VzcyBwcmltaXRpdmVzLgogICovCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweGZmZmYKLSNkZWZpbmUgUENJX0lPQkFTRQkJKCh2b2lkIF9faW9tZW0gKikoTU9EVUxFU19WQUREUiAtIFNaXzJNKSkKKyNkZWZpbmUgUENJX0lPQkFTRQkJKCh2b2lkIF9faW9tZW0gKikoTU9EVUxFU19WQUREUiAtIFNaXzMyTSkpCiAKIHN0YXRpYyBpbmxpbmUgdTggaW5iKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAppbmRleCBiMmZjZmJjLi4xMWNjOTQxIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCkBAIC05MCw1ICs5MCwyOCBAQAogCXJldHVybiBmbGFncyAmIFBTUl9JX0JJVDsKIH0KIAorLyoKKyAqIHNhdmUgYW5kIHJlc3RvcmUgZGVidWcgc3RhdGUKKyAqLworI2RlZmluZSBsb2NhbF9kYmdfc2F2ZShmbGFncykJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgZmxhZ3MpOwkJCVwKKwkJYXNtIHZvbGF0aWxlKAkJCQkJCVwKKwkJIm1ycyAgICAlMCwgZGFpZgkJLy8gbG9jYWxfZGJnX3NhdmVcbiIJXAorCQkibXNyICAgIGRhaWZzZXQsICM4IgkJCQkJXAorCQk6ICI9ciIgKGZsYWdzKSA6IDogIm1lbW9yeSIpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9kYmdfcmVzdG9yZShmbGFncykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7CQkJXAorCQlhc20gdm9sYXRpbGUoCQkJCQkJXAorCQkibXNyICAgIGRhaWYsICUwCQkvLyBsb2NhbF9kYmdfcmVzdG9yZVxuIglcCisJCTogOiAiciIgKGZsYWdzKSA6ICJtZW1vcnkiKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfZGJnX2VuYWJsZSgpCWFzbSgibXNyCWRhaWZjbHIsICM4IiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgbG9jYWxfZGJnX2Rpc2FibGUoKQlhc20oIm1zcglkYWlmc2V0LCAjOCIgOiA6IDogIm1lbW9yeSIpCisKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2tnZGIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va2dkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGFhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2tnZGIuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQUFyY2g2NCBLR0RCIHN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9pbmNsdWRlL2tnZGIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDYXZpdW0gSW5jLgorICogQXV0aG9yOiBWaWpheWEgS3VtYXIgSyA8dmlqYXlhLmt1bWFyQGNhdml1bW5ldHdvcmtzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19BUk1fS0dEQl9ICisjZGVmaW5lIF9fQVJNX0tHREJfSAorCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2RlYnVnLW1vbml0b3JzLmg+CisKKyNpZm5kZWYJX19BU1NFTUJMWV9fCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2tnZGJfYnJlYWtwb2ludCh2b2lkKQoreworCWFzbSAoImJyayAlMCIgOiA6ICJJIiAoS0RCR19DT01QSUxFRF9EQkdfQlJLX0lNTSkpOworfQorCitleHRlcm4gdm9pZCBrZ2RiX2hhbmRsZV9idXNfZXJyb3Iodm9pZCk7CitleHRlcm4gaW50IGtnZGJfZmF1bHRfZXhwZWN0ZWQ7CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBnZGIgaXMgZXhwZWN0aW5nIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGxheW91dC4KKyAqCisgKiBHZW5lcmFsIHB1cnBvc2UgcmVnczoKKyAqICAgICByMC1yMzA6IDY0IGJpdAorICogICAgIHNwLHBjIDogNjQgYml0CisgKiAgICAgcHN0YXRlICA6IDY0IGJpdAorICogICAgIFRvdGFsOiAzNAorICogRlBVIHJlZ3M6CisgKiAgICAgZjAtZjMxOiAxMjggYml0CisgKiAgICAgVG90YWw6IDMyCisgKiBFeHRyYSByZWdzCisgKiAgICAgZnBzciAmIGZwY3I6IDMyIGJpdAorICogICAgIFRvdGFsOiAyCisgKgorICovCisKKyNkZWZpbmUgX0dQX1JFR1MJCTM0CisjZGVmaW5lIF9GUF9SRUdTCQkzMgorI2RlZmluZSBfRVhUUkFfUkVHUwkJMgorLyoKKyAqIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgc2l6ZSBpbiBieXRlcy4KKyAqIHBzdGF0ZSBpcyBvbmx5IDQgYnl0ZXMuIHN1YnRyYWN0IDQgYnl0ZXMKKyAqLworI2RlZmluZSBHUF9SRUdfQllURVMJCShfR1BfUkVHUyAqIDgpCisjZGVmaW5lIERCR19NQVhfUkVHX05VTQkJKF9HUF9SRUdTICsgX0ZQX1JFR1MgKyBfRVhUUkFfUkVHUykKKworLyoKKyAqIFNpemUgb2YgSS9PIGJ1ZmZlciBmb3IgZ2RiIHBhY2tldC4KKyAqIGNvbnNpZGVyaW5nIHRvIGhvbGQgYWxsIHJlZ2lzdGVyIGNvbnRlbnRzLCBzaXplIGlzIHNldAorICovCisKKyNkZWZpbmUgQlVGTUFYCQkJMjA0OAorCisvKgorICogTnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciBnZGJfcmVncyBidWZmZXIuCisgKiBfR1BfUkVHUzogOCBieXRlcywgX0ZQX1JFR1M6IDE2IGJ5dGVzIGFuZCBfRVhUUkFfUkVHUzogNCBieXRlcyBlYWNoCisgKiBHREIgZmFpbHMgdG8gY29ubmVjdCBmb3Igc2l6ZSBiZXlvbmQgdGhpcyB3aXRoIGVycm9yCisgKiAiJ2cnIHBhY2tldCByZXBseSBpcyB0b28gbG9uZyIKKyAqLworCisjZGVmaW5lIE5VTVJFR0JZVEVTCSgoX0dQX1JFR1MgKiA4KSArIChfRlBfUkVHUyAqIDE2KSArIFwKKwkJCShfRVhUUkFfUkVHUyAqIDQpKQorCisjZW5kaWYgLyogX19BU01fS0dEQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oCmluZGV4IDBlYjM5ODYuLjIxZWY0OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oCkBAIC0xMDYsNyArMTA2LDYgQEAKIAogLyogVlRDUl9FTDIgUmVnaXN0ZXJzIGJpdHMgKi8KICNkZWZpbmUgVlRDUl9FTDJfUFNfTUFTSwkoNyA8PCAxNikKLSNkZWZpbmUgVlRDUl9FTDJfUFNfNDBCCQkoMiA8PCAxNikKICNkZWZpbmUgVlRDUl9FTDJfVEcwX01BU0sJKDEgPDwgMTQpCiAjZGVmaW5lIFZUQ1JfRUwyX1RHMF80SwkJKDAgPDwgMTQpCiAjZGVmaW5lIFZUQ1JfRUwyX1RHMF82NEsJKDEgPDwgMTQpCkBAIC0xMjksMTAgKzEyOCw5IEBACiAgKiA2NGtCIHBhZ2VzIChURzAgPSAxKQogICogMiBsZXZlbCBwYWdlIHRhYmxlcyAoU0wgPSAxKQogICovCi0jZGVmaW5lIFZUQ1JfRUwyX0ZMQUdTCQkoVlRDUl9FTDJfUFNfNDBCIHwgVlRDUl9FTDJfVEcwXzY0SyB8IFwKLQkJCQkgVlRDUl9FTDJfU0gwX0lOTkVSIHwgVlRDUl9FTDJfT1JHTjBfV0JXQSB8IFwKLQkJCQkgVlRDUl9FTDJfSVJHTjBfV0JXQSB8IFZUQ1JfRUwyX1NMMF9MVkwxIHwgXAotCQkJCSBWVENSX0VMMl9UMFNaXzQwQikKKyNkZWZpbmUgVlRDUl9FTDJfRkxBR1MJCShWVENSX0VMMl9URzBfNjRLIHwgVlRDUl9FTDJfU0gwX0lOTkVSIHwgXAorCQkJCSBWVENSX0VMMl9PUkdOMF9XQldBIHwgVlRDUl9FTDJfSVJHTjBfV0JXQSB8IFwKKwkJCQkgVlRDUl9FTDJfU0wwX0xWTDEgfCBWVENSX0VMMl9UMFNaXzQwQikKICNkZWZpbmUgVlRUQlJfWAkJKDM4IC0gVlRDUl9FTDJfVDBTWl80MEIpCiAjZWxzZQogLyoKQEAgLTE0MiwxMCArMTQwLDkgQEAKICAqIDRrQiBwYWdlcyAoVEcwID0gMCkKICAqIDMgbGV2ZWwgcGFnZSB0YWJsZXMgKFNMID0gMSkKICAqLwotI2RlZmluZSBWVENSX0VMMl9GTEFHUwkJKFZUQ1JfRUwyX1BTXzQwQiB8IFZUQ1JfRUwyX1RHMF80SyB8IFwKLQkJCQkgVlRDUl9FTDJfU0gwX0lOTkVSIHwgVlRDUl9FTDJfT1JHTjBfV0JXQSB8IFwKLQkJCQkgVlRDUl9FTDJfSVJHTjBfV0JXQSB8IFZUQ1JfRUwyX1NMMF9MVkwxIHwgXAotCQkJCSBWVENSX0VMMl9UMFNaXzQwQikKKyNkZWZpbmUgVlRDUl9FTDJfRkxBR1MJCShWVENSX0VMMl9URzBfNEsgfCBWVENSX0VMMl9TSDBfSU5ORVIgfCBcCisJCQkJIFZUQ1JfRUwyX09SR04wX1dCV0EgfCBWVENSX0VMMl9JUkdOMF9XQldBIHwgXAorCQkJCSBWVENSX0VMMl9TTDBfTFZMMSB8IFZUQ1JfRUwyX1QwU1pfNDBCKQogI2RlZmluZSBWVFRCUl9YCQkoMzcgLSBWVENSX0VMMl9UMFNaXzQwQikKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1od2RlZi5oCmluZGV4IGIxZDJlMjYuLmY3YWY2NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1od2RlZi5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1od2RlZi5oCkBAIC0xMDAsOSArMTAwLDkgQEAKICNkZWZpbmUgUFRFX0hZUAkJCVBURV9VU0VSCiAKIC8qCi0gKiA0MC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBzdXBwb3J0ZWQuCisgKiBIaWdoZXN0IHBvc3NpYmxlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydGVkLgogICovCi0jZGVmaW5lIFBIWVNfTUFTS19TSElGVAkJKDQwKQorI2RlZmluZSBQSFlTX01BU0tfU0hJRlQJCSg0OCkKICNkZWZpbmUgUEhZU19NQVNLCQkoKFVMKDEpIDw8IFBIWVNfTUFTS19TSElGVCkgLSAxKQogCiAvKgpAQCAtMTIyLDcgKzEyMiw2IEBACiAjZGVmaW5lIFRDUl9TSEFSRUQJCSgoVUwoMykgPDwgMTIpIHwgKFVMKDMpIDw8IDI4KSkKICNkZWZpbmUgVENSX1RHMF82NEsJCShVTCgxKSA8PCAxNCkKICNkZWZpbmUgVENSX1RHMV82NEsJCShVTCgxKSA8PCAzMCkKLSNkZWZpbmUgVENSX0lQU180MEJJVAkJKFVMKDIpIDw8IDMyKQogI2RlZmluZSBUQ1JfQVNJRDE2CQkoVUwoMSkgPDwgMzYpCiAjZGVmaW5lIFRDUl9UQkkwCQkoVUwoMSkgPDwgMzcpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggYWEzOTE3Yy4uOTBjODExZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkJICAgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKIHsKIAlpZiAocHRlX3ZhbGlkX3VzZXIocHRlKSkgewotCQlpZiAocHRlX2V4ZWMocHRlKSkKKwkJaWYgKCFwdGVfc3BlY2lhbChwdGUpICYmIHB0ZV9leGVjKHB0ZSkpCiAJCQlfX3N5bmNfaWNhY2hlX2RjYWNoZShwdGUsIGFkZHIpOwogCQlpZiAocHRlX2RpcnR5KHB0ZSkgJiYgcHRlX3dyaXRlKHB0ZSkpCiAJCQlwdGVfdmFsKHB0ZSkgJj0gflBURV9SRE9OTFk7CkBAIC0yMjcsMzYgKzIyNywzNiBAQAogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TUEVDSUFMCiAKLS8qCi0gKiBTb2Z0d2FyZSBQTUQgYml0cyBmb3IgVEhQCi0gKi8KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcG1kX3B0ZShwbWRfdCBwbWQpCit7CisJcmV0dXJuIF9fcHRlKHBtZF92YWwocG1kKSk7Cit9CiAKLSNkZWZpbmUgUE1EX1NFQ1RfRElSVFkJCShfQVQocG1kdmFsX3QsIDEpIDw8IDU1KQotI2RlZmluZSBQTURfU0VDVF9TUExJVFRJTkcJKF9BVChwbWR2YWxfdCwgMSkgPDwgNTcpCitzdGF0aWMgaW5saW5lIHBtZF90IHB0ZV9wbWQocHRlX3QgcHRlKQoreworCXJldHVybiBfX3BtZChwdGVfdmFsKHB0ZSkpOworfQogCiAvKgogICogVEhQIGRlZmluaXRpb25zLgogICovCi0jZGVmaW5lIHBtZF95b3VuZyhwbWQpCQkocG1kX3ZhbChwbWQpICYgUE1EX1NFQ1RfQUYpCi0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUE1EX1dSSVRFCi0jZGVmaW5lIHBtZF93cml0ZShwbWQpCQkoIShwbWRfdmFsKHBtZCkgJiBQTURfU0VDVF9SRE9OTFkpKQogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAjZGVmaW5lIHBtZF90cmFuc19odWdlKHBtZCkJKHBtZF92YWwocG1kKSAmJiAhKHBtZF92YWwocG1kKSAmIFBNRF9UQUJMRV9CSVQpKQotI2RlZmluZSBwbWRfdHJhbnNfc3BsaXR0aW5nKHBtZCkgKHBtZF92YWwocG1kKSAmIFBNRF9TRUNUX1NQTElUVElORykKKyNkZWZpbmUgcG1kX3RyYW5zX3NwbGl0dGluZyhwbWQpCXB0ZV9zcGVjaWFsKHBtZF9wdGUocG1kKSkKICNlbmRpZgogCi0jZGVmaW5lIFBNRF9CSVRfRlVOQyhmbixvcCkgXAotc3RhdGljIGlubGluZSBwbWRfdCBwbWRfIyNmbihwbWRfdCBwbWQpIHsgcG1kX3ZhbChwbWQpIG9wOyByZXR1cm4gcG1kOyB9CisjZGVmaW5lIHBtZF95b3VuZyhwbWQpCQlwdGVfeW91bmcocG1kX3B0ZShwbWQpKQorI2RlZmluZSBwbWRfd3Jwcm90ZWN0KHBtZCkJcHRlX3BtZChwdGVfd3Jwcm90ZWN0KHBtZF9wdGUocG1kKSkpCisjZGVmaW5lIHBtZF9ta3NwbGl0dGluZyhwbWQpCXB0ZV9wbWQocHRlX21rc3BlY2lhbChwbWRfcHRlKHBtZCkpKQorI2RlZmluZSBwbWRfbWtvbGQocG1kKQkJcHRlX3BtZChwdGVfbWtvbGQocG1kX3B0ZShwbWQpKSkKKyNkZWZpbmUgcG1kX21rd3JpdGUocG1kKQlwdGVfcG1kKHB0ZV9ta3dyaXRlKHBtZF9wdGUocG1kKSkpCisjZGVmaW5lIHBtZF9ta2RpcnR5KHBtZCkJcHRlX3BtZChwdGVfbWtkaXJ0eShwbWRfcHRlKHBtZCkpKQorI2RlZmluZSBwbWRfbWt5b3VuZyhwbWQpCXB0ZV9wbWQocHRlX21reW91bmcocG1kX3B0ZShwbWQpKSkKKyNkZWZpbmUgcG1kX21rbm90cHJlc2VudChwbWQpCShfX3BtZChwbWRfdmFsKHBtZCkgJj0gflBNRF9UWVBFX01BU0spKQogCi1QTURfQklUX0ZVTkMod3Jwcm90ZWN0LAl8PSBQTURfU0VDVF9SRE9OTFkpOwotUE1EX0JJVF9GVU5DKG1rb2xkLAkmPSB+UE1EX1NFQ1RfQUYpOwotUE1EX0JJVF9GVU5DKG1rc3BsaXR0aW5nLCB8PSBQTURfU0VDVF9TUExJVFRJTkcpOwotUE1EX0JJVF9GVU5DKG1rd3JpdGUsICAgJj0gflBNRF9TRUNUX1JET05MWSk7Ci1QTURfQklUX0ZVTkMobWtkaXJ0eSwgICB8PSBQTURfU0VDVF9ESVJUWSk7Ci1QTURfQklUX0ZVTkMobWt5b3VuZywgICB8PSBQTURfU0VDVF9BRik7Ci1QTURfQklUX0ZVTkMobWtub3RwcmVzZW50LCAmPSB+UE1EX1RZUEVfTUFTSyk7CisjZGVmaW5lIF9fSEFWRV9BUkNIX1BNRF9XUklURQorI2RlZmluZSBwbWRfd3JpdGUocG1kKQkJcHRlX3dyaXRlKHBtZF9wdGUocG1kKSkKIAogI2RlZmluZSBwbWRfbWtodWdlKHBtZCkJCShfX3BtZChwbWRfdmFsKHBtZCkgJiB+UE1EX1RBQkxFX0JJVCkpCiAKQEAgLTI2NiwxNSArMjY2LDYgQEAKIAogI2RlZmluZSBwbWRfcGFnZShwbWQpICAgICAgICAgICBwZm5fdG9fcGFnZShfX3BoeXNfdG9fcGZuKHBtZF92YWwocG1kKSAmIFBIWVNfTUFTSykpCiAKLXN0YXRpYyBpbmxpbmUgcG1kX3QgcG1kX21vZGlmeShwbWRfdCBwbWQsIHBncHJvdF90IG5ld3Byb3QpCi17Ci0JY29uc3QgcG1kdmFsX3QgbWFzayA9IFBNRF9TRUNUX1VTRVIgfCBQTURfU0VDVF9QWE4gfCBQTURfU0VDVF9VWE4gfAotCQkJICAgICAgUE1EX1NFQ1RfUkRPTkxZIHwgUE1EX1NFQ1RfUFJPVF9OT05FIHwKLQkJCSAgICAgIFBNRF9TRUNUX1ZBTElEOwotCXBtZF92YWwocG1kKSA9IChwbWRfdmFsKHBtZCkgJiB+bWFzaykgfCAocGdwcm90X3ZhbChuZXdwcm90KSAmIG1hc2spOwotCXJldHVybiBwbWQ7Ci19Ci0KICNkZWZpbmUgc2V0X3BtZF9hdChtbSwgYWRkciwgcG1kcCwgcG1kKQlzZXRfcG1kKHBtZHAsIHBtZCkKIAogc3RhdGljIGlubGluZSBpbnQgaGFzX3RyYW5zcGFyZW50X2h1Z2VwYWdlKHZvaWQpCkBAIC0yODYsMTEgKzI3Nyw5IEBACiAgKiBNYXJrIHRoZSBwcm90IHZhbHVlIGFzIHVuY2FjaGVhYmxlIGFuZCB1bmJ1ZmZlcmFibGUuCiAgKi8KICNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KSBcCi0JX19wZ3Byb3RfbW9kaWZ5KHByb3QsIFBURV9BVFRSSU5EWF9NQVNLLCBQVEVfQVRUUklORFgoTVRfREVWSUNFX25HblJuRSkpCisJX19wZ3Byb3RfbW9kaWZ5KHByb3QsIFBURV9BVFRSSU5EWF9NQVNLLCBQVEVfQVRUUklORFgoTVRfREVWSUNFX25HblJuRSkgfCBQVEVfUFhOIHwgUFRFX1VYTikKICNkZWZpbmUgcGdwcm90X3dyaXRlY29tYmluZShwcm90KSBcCi0JX19wZ3Byb3RfbW9kaWZ5KHByb3QsIFBURV9BVFRSSU5EWF9NQVNLLCBQVEVfQVRUUklORFgoTVRfTk9STUFMX05DKSkKLSNkZWZpbmUgcGdwcm90X2RtYWNvaGVyZW50KHByb3QpIFwKLQlfX3BncHJvdF9tb2RpZnkocHJvdCwgUFRFX0FUVFJJTkRYX01BU0ssIFBURV9BVFRSSU5EWChNVF9OT1JNQUxfTkMpKQorCV9fcGdwcm90X21vZGlmeShwcm90LCBQVEVfQVRUUklORFhfTUFTSywgUFRFX0FUVFJJTkRYKE1UX05PUk1BTF9OQykgfCBQVEVfUFhOIHwgUFRFX1VYTikKICNkZWZpbmUgX19IQVZFX1BIWVNfTUVNX0FDQ0VTU19QUk9UCiBzdHJ1Y3QgZmlsZTsKIGV4dGVybiBwZ3Byb3RfdCBwaHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBwZm4sCkBAIC0zODMsNiArMzcyLDExIEBACiAJcmV0dXJuIHB0ZTsKIH0KIAorc3RhdGljIGlubGluZSBwbWRfdCBwbWRfbW9kaWZ5KHBtZF90IHBtZCwgcGdwcm90X3QgbmV3cHJvdCkKK3sKKwlyZXR1cm4gcHRlX3BtZChwdGVfbW9kaWZ5KHBtZF9wdGUocG1kKSwgbmV3cHJvdCkpOworfQorCiBleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKIGV4dGVybiBwZ2RfdCBpZG1hcF9wZ19kaXJbUFRSU19QRVJfUEdEXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wc2NpLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BzY2kuaAppbmRleCBlNTMxMmVhLi5kMTVhYjhiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wc2NpLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wc2NpLmgKQEAgLTE0LDYgKzE0LDYgQEAKICNpZm5kZWYgX19BU01fUFNDSV9ICiAjZGVmaW5lIF9fQVNNX1BTQ0lfSAogCi1pbnQgcHNjaV9pbml0KHZvaWQpOwordm9pZCBwc2NpX2luaXQodm9pZCk7CiAKICNlbmRpZiAvKiBfX0FTTV9QU0NJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDBlN2ZhNDkuLmM3YmEyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtNjgsNiArNjgsNyBAQAogCiAvKiBBcmNoaXRlY3R1cmFsbHkgZGVmaW5lZCBtYXBwaW5nIGJldHdlZW4gQUFyY2gzMiBhbmQgQUFyY2g2NCByZWdpc3RlcnMgKi8KICNkZWZpbmUgY29tcGF0X3Vzcih4KQlyZWdzWyh4KV0KKyNkZWZpbmUgY29tcGF0X2ZwCXJlZ3NbMTFdCiAjZGVmaW5lIGNvbXBhdF9zcAlyZWdzWzEzXQogI2RlZmluZSBjb21wYXRfbHIJcmVnc1sxNF0KICNkZWZpbmUgY29tcGF0X3NwX2h5cAlyZWdzWzE1XQpAQCAtMTMyLDcgKzEzMyw3IEBACiAJKCEoKHJlZ3MpLT5wc3RhdGUgJiBQU1JfRl9CSVQpKQogCiAjZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSBcCi0JKChyZWdzKS0+c3ApCisJKCFjb21wYXRfdXNlcl9tb2RlKHJlZ3MpKSA/ICgocmVncyktPnNwKSA6ICgocmVncyktPmNvbXBhdF9zcCkKIAogLyoKICAqIEFyZSB0aGUgY3VycmVudCByZWdpc3RlcnMgc3VpdGFibGUgZm9yIHVzZXIgbW9kZT8gKHVzZWQgdG8gbWFpbnRhaW4KQEAgLTE2NCw3ICsxNjUsNyBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykJKHJlZ3MpLT5wYworI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCSgodW5zaWduZWQgbG9uZykocmVncyktPnBjKQogCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGIuaAppbmRleCA3MTcwMzFhLi43MmNhZGY1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYi5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiLmgKQEAgLTE5LDExNSArMTksNDQgQEAKICNpZm5kZWYgX19BU01fVExCX0gKICNkZWZpbmUgX19BU01fVExCX0gKIAotI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAKLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotCi0jZGVmaW5lIE1NVV9HQVRIRVJfQlVORExFCTgKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90bGIuaD4KIAogLyoKLSAqIFRMQiBoYW5kbGluZy4gIFRoaXMgYWxsb3dzIHVzIHRvIHJlbW92ZSBwYWdlcyBmcm9tIHRoZSBwYWdlCi0gKiB0YWJsZXMsIGFuZCBlZmZpY2llbnRseSBoYW5kbGUgdGhlIFRMQiBpc3N1ZXMuCi0gKi8KLXN0cnVjdCBtbXVfZ2F0aGVyIHsKLQlzdHJ1Y3QgbW1fc3RydWN0CSptbTsKLQl1bnNpZ25lZCBpbnQJCWZ1bGxtbTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJKnZtYTsKLQl1bnNpZ25lZCBsb25nCQlzdGFydCwgZW5kOwotCXVuc2lnbmVkIGxvbmcJCXJhbmdlX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcJCXJhbmdlX2VuZDsKLQl1bnNpZ25lZCBpbnQJCW5yOwotCXVuc2lnbmVkIGludAkJbWF4OwotCXN0cnVjdCBwYWdlCQkqKnBhZ2VzOwotCXN0cnVjdCBwYWdlCQkqbG9jYWxbTU1VX0dBVEhFUl9CVU5ETEVdOwotfTsKLQotLyoKLSAqIFRoaXMgaXMgdW5uZWNlc3NhcmlseSBjb21wbGV4LiAgVGhlcmUncyB0aHJlZSB3YXlzIHRoZSBUTEIgc2hvb3Rkb3duCi0gKiBjb2RlIGlzIHVzZWQ6CisgKiBUaGVyZSdzIHRocmVlIHdheXMgdGhlIFRMQiBzaG9vdGRvd24gY29kZSBpcyB1c2VkOgogICogIDEuIFVubWFwcGluZyBhIHJhbmdlIG9mIHZtYXMuICBTZWUgemFwX3BhZ2VfcmFuZ2UoKSwgdW5tYXBfcmVnaW9uKCkuCiAgKiAgICAgdGxiLT5mdWxsbW0gPSAwLCBhbmQgdGxiX3N0YXJ0X3ZtYS90bGJfZW5kX3ZtYSB3aWxsIGJlIGNhbGxlZC4KLSAqICAgICB0bGItPnZtYSB3aWxsIGJlIG5vbi1OVUxMLgogICogIDIuIFVubWFwcGluZyBhbGwgdm1hcy4gIFNlZSBleGl0X21tYXAoKS4KICAqICAgICB0bGItPmZ1bGxtbSA9IDEsIGFuZCB0bGJfc3RhcnRfdm1hL3RsYl9lbmRfdm1hIHdpbGwgYmUgY2FsbGVkLgotICogICAgIHRsYi0+dm1hIHdpbGwgYmUgbm9uLU5VTEwuICBBZGRpdGlvbmFsbHksIHBhZ2UgdGFibGVzIHdpbGwgYmUgZnJlZWQuCisgKiAgICAgUGFnZSB0YWJsZXMgd2lsbCBiZSBmcmVlZC4KICAqICAzLiBVbm1hcHBpbmcgYXJndW1lbnQgcGFnZXMuICBTZWUgc2hpZnRfYXJnX3BhZ2VzKCkuCiAgKiAgICAgdGxiLT5mdWxsbW0gPSAwLCBidXQgdGxiX3N0YXJ0X3ZtYS90bGJfZW5kX3ZtYSB3aWxsIG5vdCBiZSBjYWxsZWQuCi0gKiAgICAgdGxiLT52bWEgd2lsbCBiZSBOVUxMLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIpCiB7Ci0JaWYgKHRsYi0+ZnVsbG1tIHx8ICF0bGItPnZtYSkKKwlpZiAodGxiLT5mdWxsbW0pIHsKIAkJZmx1c2hfdGxiX21tKHRsYi0+bW0pOwotCWVsc2UgaWYgKHRsYi0+cmFuZ2VfZW5kID4gMCkgewotCQlmbHVzaF90bGJfcmFuZ2UodGxiLT52bWEsIHRsYi0+cmFuZ2Vfc3RhcnQsIHRsYi0+cmFuZ2VfZW5kKTsKLQkJdGxiLT5yYW5nZV9zdGFydCA9IFRBU0tfU0laRTsKLQkJdGxiLT5yYW5nZV9lbmQgPSAwOworCX0gZWxzZSBpZiAodGxiLT5lbmQgPiAwKSB7CisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCB2bWEgPSB7IC52bV9tbSA9IHRsYi0+bW0sIH07CisJCWZsdXNoX3RsYl9yYW5nZSgmdm1hLCB0bGItPnN0YXJ0LCB0bGItPmVuZCk7CisJCXRsYi0+c3RhcnQgPSBUQVNLX1NJWkU7CisJCXRsYi0+ZW5kID0gMDsKIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfYWRkX2ZsdXNoKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpZiAoIXRsYi0+ZnVsbG1tKSB7Ci0JCWlmIChhZGRyIDwgdGxiLT5yYW5nZV9zdGFydCkKLQkJCXRsYi0+cmFuZ2Vfc3RhcnQgPSBhZGRyOwotCQlpZiAoYWRkciArIFBBR0VfU0laRSA+IHRsYi0+cmFuZ2VfZW5kKQotCQkJdGxiLT5yYW5nZV9lbmQgPSBhZGRyICsgUEFHRV9TSVpFOworCQl0bGItPnN0YXJ0ID0gbWluKHRsYi0+c3RhcnQsIGFkZHIpOworCQl0bGItPmVuZCA9IG1heCh0bGItPmVuZCwgYWRkciArIFBBR0VfU0laRSk7CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX190bGJfYWxsb2NfcGFnZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiKQotewotCXVuc2lnbmVkIGxvbmcgYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX05PV0FJVCB8IF9fR0ZQX05PV0FSTiwgMCk7Ci0KLQlpZiAoYWRkcikgewotCQl0bGItPnBhZ2VzID0gKHZvaWQgKilhZGRyOwotCQl0bGItPm1heCA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfZmx1c2hfbW11KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIpCi17Ci0JdGxiX2ZsdXNoKHRsYik7Ci0JZnJlZV9wYWdlc19hbmRfc3dhcF9jYWNoZSh0bGItPnBhZ2VzLCB0bGItPm5yKTsKLQl0bGItPm5yID0gMDsKLQlpZiAodGxiLT5wYWdlcyA9PSB0bGItPmxvY2FsKQotCQlfX3RsYl9hbGxvY19wYWdlKHRsYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdGxiX2dhdGhlcl9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXRsYi0+bW0gPSBtbTsKLQl0bGItPmZ1bGxtbSA9ICEoc3RhcnQgfCAoZW5kKzEpKTsKLQl0bGItPnN0YXJ0ID0gc3RhcnQ7Ci0JdGxiLT5lbmQgPSBlbmQ7Ci0JdGxiLT52bWEgPSBOVUxMOwotCXRsYi0+bWF4ID0gQVJSQVlfU0laRSh0bGItPmxvY2FsKTsKLQl0bGItPnBhZ2VzID0gdGxiLT5sb2NhbDsKLQl0bGItPm5yID0gMDsKLQlfX3RsYl9hbGxvY19wYWdlKHRsYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdGxiX2ZpbmlzaF9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdGxiX2ZsdXNoX21tdSh0bGIpOwotCi0JLyoga2VlcCB0aGUgcGFnZSB0YWJsZSBjYWNoZSB3aXRoaW4gYm91bmRzICovCi0JY2hlY2tfcGd0X2NhY2hlKCk7Ci0KLQlpZiAodGxiLT5wYWdlcyAhPSB0bGItPmxvY2FsKQotCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXRsYi0+cGFnZXMsIDApOwotfQotCiAvKgogICogTWVtb3JpemUgdGhlIHJhbmdlIGZvciB0aGUgVExCIGZsdXNoLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXRsYl9yZW1vdmVfdGxiX2VudHJ5KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfcmVtb3ZlX3RsYl9lbnRyeShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwdGVfdCAqcHRlcCwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdGxiX2FkZF9mbHVzaCh0bGIsIGFkZHIpOwogfQpAQCAtMTM3LDM4ICs2NiwyNCBAQAogICogY2FzZSB3aGVyZSB3ZSdyZSBkb2luZyBhIGZ1bGwgTU0gZmx1c2guICBXaGVuIHdlJ3JlIGRvaW5nIGEgbXVubWFwLAogICogdGhlIHZtYXMgYXJlIGFkanVzdGVkIHRvIG9ubHkgY292ZXIgdGhlIHJlZ2lvbiB0byBiZSB0b3JuIGRvd24uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotdGxiX3N0YXJ0X3ZtYShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bGJfc3RhcnRfdm1hKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsCisJCQkJIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWlmICghdGxiLT5mdWxsbW0pIHsKLQkJdGxiLT52bWEgPSB2bWE7Ci0JCXRsYi0+cmFuZ2Vfc3RhcnQgPSBUQVNLX1NJWkU7Ci0JCXRsYi0+cmFuZ2VfZW5kID0gMDsKKwkJdGxiLT5zdGFydCA9IFRBU0tfU0laRTsKKwkJdGxiLT5lbmQgPSAwOwogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi10bGJfZW5kX3ZtYShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bGJfZW5kX3ZtYShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLAorCQkJICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWlmICghdGxiLT5mdWxsbW0pCiAJCXRsYl9mbHVzaCh0bGIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX3RsYl9yZW1vdmVfcGFnZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQl0bGItPnBhZ2VzW3RsYi0+bnIrK10gPSBwYWdlOwotCVZNX0JVR19PTih0bGItPm5yID4gdGxiLT5tYXgpOwotCXJldHVybiB0bGItPm1heCAtIHRsYi0+bnI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfcmVtb3ZlX3BhZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JaWYgKCFfX3RsYl9yZW1vdmVfcGFnZSh0bGIsIHBhZ2UpKQotCQl0bGJfZmx1c2hfbW11KHRsYik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwZ3RhYmxlX3QgcHRlLAotCXVuc2lnbmVkIGxvbmcgYWRkcikKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCXRsYl9hZGRfZmx1c2godGxiLCBhZGRyKTsKQEAgLTE4NCwxNiArOTksNSBAQAogfQogI2VuZGlmCiAKLSNkZWZpbmUgcHRlX2ZyZWVfdGxiKHRsYiwgcHRlcCwgYWRkcikJX19wdGVfZnJlZV90bGIodGxiLCBwdGVwLCBhZGRyKQotI2RlZmluZSBwbWRfZnJlZV90bGIodGxiLCBwbWRwLCBhZGRyKQlfX3BtZF9mcmVlX3RsYih0bGIsIHBtZHAsIGFkZHIpCi0jZGVmaW5lIHB1ZF9mcmVlX3RsYih0bGIsIHB1ZHAsIGFkZHIpCXB1ZF9mcmVlKCh0bGIpLT5tbSwgcHVkcCkKLQotI2RlZmluZSB0bGJfbWlncmF0ZV9maW5pc2gobW0pCQlkbyB7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdGxiX3JlbW92ZV9wbWRfdGxiX2VudHJ5KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdGxiX2FkZF9mbHVzaCh0bGIsIGFkZHIpOwotfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTcyZTZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX19BU01fVE9QT0xPR1lfSAorI2RlZmluZSBfX0FTTV9UT1BPTE9HWV9ICisKKyNpZmRlZiBDT05GSUdfU01QCisKKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisKK3N0cnVjdCBjcHVfdG9wb2xvZ3kgeworCWludCB0aHJlYWRfaWQ7CisJaW50IGNvcmVfaWQ7CisJaW50IGNsdXN0ZXJfaWQ7CisJY3B1bWFza190IHRocmVhZF9zaWJsaW5nOworCWNwdW1hc2tfdCBjb3JlX3NpYmxpbmc7Cit9OworCitleHRlcm4gc3RydWN0IGNwdV90b3BvbG9neSBjcHVfdG9wb2xvZ3lbTlJfQ1BVU107CisKKyNkZWZpbmUgdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpCShjcHVfdG9wb2xvZ3lbY3B1XS5jbHVzdGVyX2lkKQorI2RlZmluZSB0b3BvbG9neV9jb3JlX2lkKGNwdSkJCShjcHVfdG9wb2xvZ3lbY3B1XS5jb3JlX2lkKQorI2RlZmluZSB0b3BvbG9neV9jb3JlX2NwdW1hc2soY3B1KQkoJmNwdV90b3BvbG9neVtjcHVdLmNvcmVfc2libGluZykKKyNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KQkoJmNwdV90b3BvbG9neVtjcHVdLnRocmVhZF9zaWJsaW5nKQorCisjZGVmaW5lIG1jX2NhcGFibGUoKQkoY3B1X3RvcG9sb2d5WzBdLmNsdXN0ZXJfaWQgIT0gLTEpCisjZGVmaW5lIHNtdF9jYXBhYmxlKCkJKGNwdV90b3BvbG9neVswXS50aHJlYWRfaWQgIT0gLTEpCisKK3ZvaWQgaW5pdF9jcHVfdG9wb2xvZ3kodm9pZCk7Cit2b2lkIHN0b3JlX2NwdV90b3BvbG9neSh1bnNpZ25lZCBpbnQgY3B1aWQpOworY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlZ3JvdXBfbWFzayhpbnQgY3B1KTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfY3B1X3RvcG9sb2d5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX2NwdV90b3BvbG9neSh1bnNpZ25lZCBpbnQgY3B1aWQpIHsgfQorCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CisKKyNlbmRpZiAvKiBfQVNNX0FSTV9UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDZjMGY2ODQuLjNiZjhmNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC04Myw3ICs4Myw3IEBACiAgKiBSZXR1cm5zIDEgaWYgdGhlIHJhbmdlIGlzIHZhbGlkLCAwIG90aGVyd2lzZS4KICAqCiAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXN0OgotICogKHU2NSlhZGRyICsgKHU2NSlzaXplIDwgKHU2NSljdXJyZW50LT5hZGRyX2xpbWl0CisgKiAodTY1KWFkZHIgKyAodTY1KXNpemUgPD0gY3VycmVudC0+YWRkcl9saW1pdAogICoKICAqIFRoaXMgbmVlZHMgNjUtYml0IGFyaXRobWV0aWMuCiAgKi8KQEAgLTkxLDcgKzkxLDcgQEAKICh7CQkJCQkJCQkJXAogCXVuc2lnbmVkIGxvbmcgZmxhZywgcm9rc3VtOwkJCQkJXAogCV9fY2hrX3VzZXJfcHRyKGFkZHIpOwkJCQkJCVwKLQlhc20oImFkZHMgJTEsICUxLCAlMzsgY2NtcCAlMSwgJTQsICMyLCBjYzsgY3NldCAlMCwgY2MiCQlcCisJYXNtKCJhZGRzICUxLCAlMSwgJTM7IGNjbXAgJTEsICU0LCAjMiwgY2M7IGNzZXQgJTAsIGxzIgkJXAogCQk6ICI9JnIiIChmbGFnKSwgIj0mciIgKHJva3N1bSkJCQkJXAogCQk6ICIxIiAoYWRkciksICJJciIgKHNpemUpLAkJCQlcCiAJCSAgInIiIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmFkZHJfbGltaXQpCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCA4MmNlMjE3Li5hNDY1NGM2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAjaWZkZWYgQ09ORklHX0NPTVBBVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX0dFVERFTlRTNjQKICNkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NUQVQ2NAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkIGIvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZAppbmRleCBlNGI3OGJkLi45NDIzNzZkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKQEAgLTksNiArOSw3IEBACiBoZWFkZXIteSArPSBmY250bC5oCiBoZWFkZXIteSArPSBod2NhcC5oCiBoZWFkZXIteSArPSBrdm1fcGFyYS5oCitoZWFkZXIteSArPSBwZXJmX3JlZ3MuaAogaGVhZGVyLXkgKz0gcGFyYW0uaAogaGVhZGVyLXkgKz0gcHRyYWNlLmgKIGhlYWRlci15ICs9IHNldHVwLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9wZXJmX3JlZ3MuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9wZXJmX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJiODMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL3BlcmZfcmVncy5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX0FTTV9BUk02NF9QRVJGX1JFR1NfSAorI2RlZmluZSBfQVNNX0FSTTY0X1BFUkZfUkVHU19ICisKK2VudW0gcGVyZl9ldmVudF9hcm1fcmVncyB7CisJUEVSRl9SRUdfQVJNNjRfWDAsCisJUEVSRl9SRUdfQVJNNjRfWDEsCisJUEVSRl9SRUdfQVJNNjRfWDIsCisJUEVSRl9SRUdfQVJNNjRfWDMsCisJUEVSRl9SRUdfQVJNNjRfWDQsCisJUEVSRl9SRUdfQVJNNjRfWDUsCisJUEVSRl9SRUdfQVJNNjRfWDYsCisJUEVSRl9SRUdfQVJNNjRfWDcsCisJUEVSRl9SRUdfQVJNNjRfWDgsCisJUEVSRl9SRUdfQVJNNjRfWDksCisJUEVSRl9SRUdfQVJNNjRfWDEwLAorCVBFUkZfUkVHX0FSTTY0X1gxMSwKKwlQRVJGX1JFR19BUk02NF9YMTIsCisJUEVSRl9SRUdfQVJNNjRfWDEzLAorCVBFUkZfUkVHX0FSTTY0X1gxNCwKKwlQRVJGX1JFR19BUk02NF9YMTUsCisJUEVSRl9SRUdfQVJNNjRfWDE2LAorCVBFUkZfUkVHX0FSTTY0X1gxNywKKwlQRVJGX1JFR19BUk02NF9YMTgsCisJUEVSRl9SRUdfQVJNNjRfWDE5LAorCVBFUkZfUkVHX0FSTTY0X1gyMCwKKwlQRVJGX1JFR19BUk02NF9YMjEsCisJUEVSRl9SRUdfQVJNNjRfWDIyLAorCVBFUkZfUkVHX0FSTTY0X1gyMywKKwlQRVJGX1JFR19BUk02NF9YMjQsCisJUEVSRl9SRUdfQVJNNjRfWDI1LAorCVBFUkZfUkVHX0FSTTY0X1gyNiwKKwlQRVJGX1JFR19BUk02NF9YMjcsCisJUEVSRl9SRUdfQVJNNjRfWDI4LAorCVBFUkZfUkVHX0FSTTY0X1gyOSwKKwlQRVJGX1JFR19BUk02NF9MUiwKKwlQRVJGX1JFR19BUk02NF9TUCwKKwlQRVJGX1JFR19BUk02NF9QQywKKwlQRVJGX1JFR19BUk02NF9NQVgsCit9OworI2VuZGlmIC8qIF9BU01fQVJNNjRfUEVSRl9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC9hcm02NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMmQ0NTU0Yi4uN2Q4MTFkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTE0LDEyICsxNCwxNCBAQAogYXJtNjQtb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IHN5czMyLm8ga3VzZXIzMi5vIHNpZ25hbDMyLm8gCVwKIAkJCQkJICAgc3lzX2NvbXBhdC5vCiBhcm02NC1vYmotJChDT05GSUdfTU9EVUxFUykJCSs9IGFybTY0a3N5bXMubyBtb2R1bGUubwotYXJtNjQtb2JqLSQoQ09ORklHX1NNUCkJCQkrPSBzbXAubyBzbXBfc3Bpbl90YWJsZS5vCithcm02NC1vYmotJChDT05GSUdfU01QKQkJCSs9IHNtcC5vIHNtcF9zcGluX3RhYmxlLm8gdG9wb2xvZ3kubworYXJtNjQtb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKQkJKz0gcGVyZl9yZWdzLm8KIGFybTY0LW9iai0kKENPTkZJR19IV19QRVJGX0VWRU5UUykJKz0gcGVyZl9ldmVudC5vCi1hcm02NC1vYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKSs9IGh3X2JyZWFrcG9pbnQubworYXJtNjQtb2JqLSQoQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCkJKz0gaHdfYnJlYWtwb2ludC5vCiBhcm02NC1vYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogYXJtNjQtb2JqLSQoQ09ORklHX0FSTTY0X0NQVV9TVVNQRU5EKQkrPSBzbGVlcC5vIHN1c3BlbmQubwogYXJtNjQtb2JqLSQoQ09ORklHX0pVTVBfTEFCRUwpCQkrPSBqdW1wX2xhYmVsLm8KK2FybTY0LW9iai0kKENPTkZJR19LR0RCKQkJKz0ga2dkYi5vCiAKIG9iai15CQkJCQkrPSAkKGFybTY0LW9iai15KSB2ZHNvLwogb2JqLW0JCQkJCSs9ICQoYXJtNjQtb2JqLW0pCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZGVidWctbW9uaXRvcnMuYwppbmRleCA2MzZiYThiLi4xNGJhMjNjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2RlYnVnLW1vbml0b3JzLmMKQEAgLTEzNyw3ICsxMzcsNiBAQAogc3RhdGljIHZvaWQgY2xlYXJfb3NfbG9jayh2b2lkICp1bnVzZWQpCiB7CiAJYXNtIHZvbGF0aWxlKCJtc3Igb3NsYXJfZWwxLCAlMCIgOiA6ICJyIiAoMCkpOwotCWlzYigpOwogfQogCiBzdGF0aWMgaW50IG9zX2xvY2tfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKQEAgLTE1Niw4ICsxNTUsOSBAQAogc3RhdGljIGludCBkZWJ1Z19tb25pdG9yc19pbml0KHZvaWQpCiB7CiAJLyogQ2xlYXIgdGhlIE9TIGxvY2suICovCi0Jc21wX2NhbGxfZnVuY3Rpb24oY2xlYXJfb3NfbG9jaywgTlVMTCwgMSk7Ci0JY2xlYXJfb3NfbG9jayhOVUxMKTsKKwlvbl9lYWNoX2NwdShjbGVhcl9vc19sb2NrLCBOVUxMLCAxKTsKKwlpc2IoKTsKKwlsb2NhbF9kYmdfZW5hYmxlKCk7CiAKIAkvKiBSZWdpc3RlciBob3RwbHVnIGhhbmRsZXIuICovCiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZvc19sb2NrX25iKTsKQEAgLTE4OSw3ICsxODksNyBAQAogCiAvKiBFTDEgU2luZ2xlIFN0ZXAgSGFuZGxlciBob29rcyAqLwogc3RhdGljIExJU1RfSEVBRChzdGVwX2hvb2spOwotREVGSU5FX1JXTE9DSyhzdGVwX2hvb2tfbG9jayk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhzdGVwX2hvb2tfbG9jayk7CiAKIHZvaWQgcmVnaXN0ZXJfc3RlcF9ob29rKHN0cnVjdCBzdGVwX2hvb2sgKmhvb2spCiB7CkBAIC0yNzYsNyArMjc2LDcgQEAKICAqIFVzZSByZWFkZXIvd3JpdGVyIGxvY2tzIGluc3RlYWQgb2YgcGxhaW4gc3BpbmxvY2suCiAgKi8KIHN0YXRpYyBMSVNUX0hFQUQoYnJlYWtfaG9vayk7Ci1ERUZJTkVfUldMT0NLKGJyZWFrX2hvb2tfbG9jayk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhicmVha19ob29rX2xvY2spOwogCiB2b2lkIHJlZ2lzdGVyX2JyZWFrX2hvb2soc3RydWN0IGJyZWFrX2hvb2sgKmhvb2spCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMKaW5kZXggMGIyODFmZi4uNjEwMzVkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2hlYWQuUwpAQCAtMzg0LDI2ICszODQsMTggQEAKICAqIFByZXNlcnZlczoJdGJsLCBmbGFncwogICogQ29ycnVwdHM6CXBoeXMsIHN0YXJ0LCBlbmQsIHBzdGF0ZQogICovCi0JLm1hY3JvCWNyZWF0ZV9ibG9ja19tYXAsIHRibCwgZmxhZ3MsIHBoeXMsIHN0YXJ0LCBlbmQsIGlkbWFwPTAKKwkubWFjcm8JY3JlYXRlX2Jsb2NrX21hcCwgdGJsLCBmbGFncywgcGh5cywgc3RhcnQsIGVuZAogCWxzcglccGh5cywgXHBoeXMsICNCTE9DS19TSElGVAotCS5pZglcaWRtYXAKLQlhbmQJXHN0YXJ0LCBccGh5cywgI1BUUlNfUEVSX1BURSAtIDEJLy8gdGFibGUgaW5kZXgKLQkuZWxzZQogCWxzcglcc3RhcnQsIFxzdGFydCwgI0JMT0NLX1NISUZUCiAJYW5kCVxzdGFydCwgXHN0YXJ0LCAjUFRSU19QRVJfUFRFIC0gMQkvLyB0YWJsZSBpbmRleAotCS5lbmRpZgogCW9ycglccGh5cywgXGZsYWdzLCBccGh5cywgbHNsICNCTE9DS19TSElGVAkvLyB0YWJsZSBlbnRyeQotCS5pZm5jCVxzdGFydCxcZW5kCiAJbHNyCVxlbmQsIFxlbmQsICNCTE9DS19TSElGVAogCWFuZAlcZW5kLCBcZW5kLCAjUFRSU19QRVJfUFRFIC0gMQkJLy8gdGFibGUgZW5kIGluZGV4Ci0JLmVuZGlmCiA5OTk5OglzdHIJXHBoeXMsIFtcdGJsLCBcc3RhcnQsIGxzbCAjM10JCS8vIHN0b3JlIHRoZSBlbnRyeQotCS5pZm5jCVxzdGFydCxcZW5kCiAJYWRkCVxzdGFydCwgXHN0YXJ0LCAjMQkJCS8vIG5leHQgZW50cnkKIAlhZGQJXHBoeXMsIFxwaHlzLCAjQkxPQ0tfU0laRQkJLy8gbmV4dCBibG9jawogCWNtcAlcc3RhcnQsIFxlbmQKIAliLmxzCTk5OTliCi0JLmVuZGlmCiAJLmVuZG0KIAogLyoKQEAgLTQzNSw5ICs0MjcsMTMgQEAKIAkgKiBDcmVhdGUgdGhlIGlkZW50aXR5IG1hcHBpbmcuCiAJICovCiAJYWRkCXgwLCB4MjUsICNQQUdFX1NJWkUJCS8vIHNlY3Rpb24gdGFibGUgYWRkcmVzcwotCWFkcgl4MywgX190dXJuX21tdV9vbgkJLy8gdmlydHVhbC9waHlzaWNhbCBhZGRyZXNzCisJbGRyCXgzLCA9S0VSTkVMX1NUQVJUCisJYWRkCXgzLCB4MywgeDI4CQkJLy8gX19wYShLRVJORUxfU1RBUlQpCiAJY3JlYXRlX3BnZF9lbnRyeSB4MjUsIHgwLCB4MywgeDUsIHg2Ci0JY3JlYXRlX2Jsb2NrX21hcCB4MCwgeDcsIHgzLCB4NSwgeDUsIGlkbWFwPTEKKwlsZHIJeDYsID1LRVJORUxfRU5ECisJbW92CXg1LCB4MwkJCQkvLyBfX3BhKEtFUk5FTF9TVEFSVCkKKwlhZGQJeDYsIHg2LCB4MjgJCQkvLyBfX3BhKEtFUk5FTF9FTkQpCisJY3JlYXRlX2Jsb2NrX21hcCB4MCwgeDcsIHgzLCB4NSwgeDYKIAogCS8qCiAJICogTWFwIHRoZSBrZXJuZWwgaW1hZ2UgKHN0YXJ0aW5nIHdpdGggUEhZU19PRkZTRVQpLgpAQCAtNDQ1LDcgKzQ0MSw3IEBACiAJYWRkCXgwLCB4MjYsICNQQUdFX1NJWkUJCS8vIHNlY3Rpb24gdGFibGUgYWRkcmVzcwogCW1vdgl4NSwgI1BBR0VfT0ZGU0VUCiAJY3JlYXRlX3BnZF9lbnRyeSB4MjYsIHgwLCB4NSwgeDMsIHg2Ci0JbGRyCXg2LCA9S0VSTkVMX0VORCAtIDEKKwlsZHIJeDYsID1LRVJORUxfRU5ECiAJbW92CXgzLCB4MjQJCQkJLy8gcGh5cyBvZmZzZXQKIAljcmVhdGVfYmxvY2tfbWFwIHgwLCB4NywgeDMsIHg1LCB4NgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9rZ2RiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjOWNmMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2tnZGIuYwpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIEFBcmNoNjQgS0dEQiBzdXBwb3J0CisgKgorICogQmFzZWQgb24gYXJjaC9hcm0va2VybmVsL2tnZGIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDYXZpdW0gSW5jLgorICogQXV0aG9yOiBWaWpheWEgS3VtYXIgSyA8dmlqYXlhLmt1bWFyQGNhdml1bW5ldHdvcmtzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisKK3N0cnVjdCBkYmdfcmVnX2RlZl90IGRiZ19yZWdfZGVmW0RCR19NQVhfUkVHX05VTV0gPSB7CisJeyAieDAiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1swXSl9LAorCXsgIngxIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMV0pfSwKKwl7ICJ4MiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzJdKX0sCisJeyAieDMiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1szXSl9LAorCXsgIng0IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbNF0pfSwKKwl7ICJ4NSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzVdKX0sCisJeyAieDYiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1s2XSl9LAorCXsgIng3IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbN10pfSwKKwl7ICJ4OCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzhdKX0sCisJeyAieDkiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1s5XSl9LAorCXsgIngxMCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzEwXSl9LAorCXsgIngxMSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzExXSl9LAorCXsgIngxMiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzEyXSl9LAorCXsgIngxMyIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzEzXSl9LAorCXsgIngxNCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE0XSl9LAorCXsgIngxNSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE1XSl9LAorCXsgIngxNiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE2XSl9LAorCXsgIngxNyIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE3XSl9LAorCXsgIngxOCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE4XSl9LAorCXsgIngxOSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE5XSl9LAorCXsgIngyMCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzIwXSl9LAorCXsgIngyMSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzIxXSl9LAorCXsgIngyMiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzIyXSl9LAorCXsgIngyMyIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzIzXSl9LAorCXsgIngyNCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI0XSl9LAorCXsgIngyNSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI1XSl9LAorCXsgIngyNiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI2XSl9LAorCXsgIngyNyIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI3XSl9LAorCXsgIngyOCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI4XSl9LAorCXsgIngyOSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI5XSl9LAorCXsgIngzMCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzMwXSl9LAorCXsgInNwIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHNwKX0sCisJeyAicGMiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcGMpfSwKKwl7ICJwc3RhdGUiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcHN0YXRlKX0sCisJeyAidjAiLCAxNiwgLTEgfSwKKwl7ICJ2MSIsIDE2LCAtMSB9LAorCXsgInYyIiwgMTYsIC0xIH0sCisJeyAidjMiLCAxNiwgLTEgfSwKKwl7ICJ2NCIsIDE2LCAtMSB9LAorCXsgInY1IiwgMTYsIC0xIH0sCisJeyAidjYiLCAxNiwgLTEgfSwKKwl7ICJ2NyIsIDE2LCAtMSB9LAorCXsgInY4IiwgMTYsIC0xIH0sCisJeyAidjkiLCAxNiwgLTEgfSwKKwl7ICJ2MTAiLCAxNiwgLTEgfSwKKwl7ICJ2MTEiLCAxNiwgLTEgfSwKKwl7ICJ2MTIiLCAxNiwgLTEgfSwKKwl7ICJ2MTMiLCAxNiwgLTEgfSwKKwl7ICJ2MTQiLCAxNiwgLTEgfSwKKwl7ICJ2MTUiLCAxNiwgLTEgfSwKKwl7ICJ2MTYiLCAxNiwgLTEgfSwKKwl7ICJ2MTciLCAxNiwgLTEgfSwKKwl7ICJ2MTgiLCAxNiwgLTEgfSwKKwl7ICJ2MTkiLCAxNiwgLTEgfSwKKwl7ICJ2MjAiLCAxNiwgLTEgfSwKKwl7ICJ2MjEiLCAxNiwgLTEgfSwKKwl7ICJ2MjIiLCAxNiwgLTEgfSwKKwl7ICJ2MjMiLCAxNiwgLTEgfSwKKwl7ICJ2MjQiLCAxNiwgLTEgfSwKKwl7ICJ2MjUiLCAxNiwgLTEgfSwKKwl7ICJ2MjYiLCAxNiwgLTEgfSwKKwl7ICJ2MjciLCAxNiwgLTEgfSwKKwl7ICJ2MjgiLCAxNiwgLTEgfSwKKwl7ICJ2MjkiLCAxNiwgLTEgfSwKKwl7ICJ2MzAiLCAxNiwgLTEgfSwKKwl7ICJ2MzEiLCAxNiwgLTEgfSwKKwl7ICJmcHNyIiwgNCwgLTEgfSwKKwl7ICJmcGNyIiwgNCwgLTEgfSwKK307CisKK2NoYXIgKmRiZ19nZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVnbm8gPj0gREJHX01BWF9SRUdfTlVNIHx8IHJlZ25vIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGJnX3JlZ19kZWZbcmVnbm9dLm9mZnNldCAhPSAtMSkKKwkJbWVtY3B5KG1lbSwgKHZvaWQgKilyZWdzICsgZGJnX3JlZ19kZWZbcmVnbm9dLm9mZnNldCwKKwkJICAgICAgIGRiZ19yZWdfZGVmW3JlZ25vXS5zaXplKTsKKwllbHNlCisJCW1lbXNldChtZW0sIDAsIGRiZ19yZWdfZGVmW3JlZ25vXS5zaXplKTsKKwlyZXR1cm4gZGJnX3JlZ19kZWZbcmVnbm9dLm5hbWU7Cit9CisKK2ludCBkYmdfc2V0X3JlZyhpbnQgcmVnbm8sIHZvaWQgKm1lbSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHJlZ25vID49IERCR19NQVhfUkVHX05VTSB8fCByZWdubyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQgIT0gLTEpCisJCW1lbWNweSgodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0LCBtZW0sCisJCSAgICAgICBkYmdfcmVnX2RlZltyZWdub10uc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3NsZWVwaW5nX3RocmVhZF90b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBwdF9yZWdzICp0aHJlYWRfcmVnczsKKworCS8qIEluaXRpYWxpemUgdG8gemVybyAqLworCW1lbXNldCgoY2hhciAqKWdkYl9yZWdzLCAwLCBOVU1SRUdCWVRFUyk7CisJdGhyZWFkX3JlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CisJbWVtY3B5KCh2b2lkICopZ2RiX3JlZ3MsICh2b2lkICopdGhyZWFkX3JlZ3MtPnJlZ3MsIEdQX1JFR19CWVRFUyk7Cit9CisKK3ZvaWQga2dkYl9hcmNoX3NldF9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYykKK3sKKwlyZWdzLT5wYyA9IHBjOworfQorCitzdGF0aWMgaW50IGNvbXBpbGVkX2JyZWFrOworCitzdGF0aWMgdm9pZCBrZ2RiX2FyY2hfdXBkYXRlX2FkZHIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJY2hhciAqcmVtY29tX2luX2J1ZmZlcikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJY2hhciAqcHRyOworCisJcHRyID0gJnJlbWNvbV9pbl9idWZmZXJbMV07CisJaWYgKGtnZGJfaGV4MmxvbmcoJnB0ciwgJmFkZHIpKQorCQlrZ2RiX2FyY2hfc2V0X3BjKHJlZ3MsIGFkZHIpOworCWVsc2UgaWYgKGNvbXBpbGVkX2JyZWFrID09IDEpCisJCWtnZGJfYXJjaF9zZXRfcGMocmVncywgcmVncy0+cGMgKyA0KTsKKworCWNvbXBpbGVkX2JyZWFrID0gMDsKK30KKworaW50IGtnZGJfYXJjaF9oYW5kbGVfZXhjZXB0aW9uKGludCBleGNlcHRpb25fdmVjdG9yLCBpbnQgc2lnbm8sCisJCQkgICAgICAgaW50IGVycl9jb2RlLCBjaGFyICpyZW1jb21faW5fYnVmZmVyLAorCQkJICAgICAgIGNoYXIgKnJlbWNvbV9vdXRfYnVmZmVyLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpsaW51eF9yZWdzKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKHJlbWNvbV9pbl9idWZmZXJbMF0pIHsKKwljYXNlICdEJzoKKwljYXNlICdrJzoKKwkJLyoKKwkJICogUGFja2V0IEQgKERldGFjaCksIGsgKGtpbGwpLiBObyBzcGVjaWFsIGhhbmRsaW5nCisJCSAqIGlzIHJlcXVpcmVkIGhlcmUuIEhhbmRsZSBzYW1lIGFzIGMgcGFja2V0LgorCQkgKi8KKwljYXNlICdjJzoKKwkJLyoKKwkJICogUGFja2V0IGMgKENvbnRpbnVlKSB0byBjb250aW51ZSBleGVjdXRpbmcuCisJCSAqIFNldCBwYyB0byByZXF1aXJlZCBhZGRyZXNzLgorCQkgKiBUcnkgdG8gcmVhZCBvcHRpb25hbCBwYXJhbWV0ZXIgYW5kIHNldCBwYy4KKwkJICogSWYgdGhpcyB3YXMgYSBjb21waWxlZCBicmVha3BvaW50LCB3ZSBuZWVkIHRvIG1vdmUKKwkJICogdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gZWxzZSB3ZSB3aWxsIGp1c3QgYnJlYWtwb2ludAorCQkgKiBvdmVyIGFuZCBvdmVyIGFnYWluLgorCQkgKi8KKwkJa2dkYl9hcmNoX3VwZGF0ZV9hZGRyKGxpbnV4X3JlZ3MsIHJlbWNvbV9pbl9idWZmZXIpOworCQlhdG9taWNfc2V0KCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCwgLTEpOworCQlrZ2RiX3NpbmdsZV9zdGVwID0gIDA7CisKKwkJLyoKKwkJICogUmVjZWl2ZWQgY29udGludWUgY29tbWFuZCwgZGlzYWJsZSBzaW5nbGUgc3RlcAorCQkgKi8KKwkJaWYgKGtlcm5lbF9hY3RpdmVfc2luZ2xlX3N0ZXAoKSkKKwkJCWtlcm5lbF9kaXNhYmxlX3NpbmdsZV9zdGVwKCk7CisKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCS8qCisJCSAqIFVwZGF0ZSBzdGVwIGFkZHJlc3MgdmFsdWUgd2l0aCBhZGRyZXNzIHBhc3NlZAorCQkgKiB3aXRoIHN0ZXAgcGFja2V0LgorCQkgKiBPbiBkZWJ1ZyBleGNlcHRpb24gcmV0dXJuIFBDIGlzIGNvcGllZCB0byBFTFIKKwkJICogU28ganVzdCB1cGRhdGUgUEMuCisJCSAqIElmIG5vIHN0ZXAgYWRkcmVzcyBpcyBwYXNzZWQsIHJlc3VtZSBmcm9tIHRoZSBhZGRyZXNzCisJCSAqIHBvaW50ZWQgYnkgUEMuIERvIG5vdCB1cGRhdGUgUEMKKwkJICovCisJCWtnZGJfYXJjaF91cGRhdGVfYWRkcihsaW51eF9yZWdzLCByZW1jb21faW5fYnVmZmVyKTsKKwkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCQlrZ2RiX3NpbmdsZV9zdGVwID0gIDE7CisKKwkJLyoKKwkJICogRW5hYmxlIHNpbmdsZSBzdGVwIGhhbmRsaW5nCisJCSAqLworCQlpZiAoIWtlcm5lbF9hY3RpdmVfc2luZ2xlX3N0ZXAoKSkKKwkJCWtlcm5lbF9lbmFibGVfc2luZ2xlX3N0ZXAobGludXhfcmVncyk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC0xOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGtnZGJfYnJrX2ZuKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgZXNyKQoreworCWtnZGJfaGFuZGxlX2V4Y2VwdGlvbigxLCBTSUdUUkFQLCAwLCByZWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZ2RiX2NvbXBpbGVkX2Jya19mbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGVzcikKK3sKKwljb21waWxlZF9icmVhayA9IDE7CisJa2dkYl9oYW5kbGVfZXhjZXB0aW9uKDEsIFNJR1RSQVAsIDAsIHJlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga2dkYl9zdGVwX2Jya19mbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGVzcikKK3sKKwlrZ2RiX2hhbmRsZV9leGNlcHRpb24oMSwgU0lHVFJBUCwgMCwgcmVncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnJlYWtfaG9vayBrZ2RiX2Jya3B0X2hvb2sgPSB7CisJLmVzcl9tYXNrCT0gMHhmZmZmZmZmZiwKKwkuZXNyX3ZhbAk9IERCR19FU1JfVkFMX0JSSyhLR0RCX0RZTl9ER0JfQlJLX0lNTSksCisJLmZuCQk9IGtnZGJfYnJrX2ZuCit9OworCitzdGF0aWMgc3RydWN0IGJyZWFrX2hvb2sga2dkYl9jb21waWxlZF9icmtwdF9ob29rID0geworCS5lc3JfbWFzawk9IDB4ZmZmZmZmZmYsCisJLmVzcl92YWwJPSBEQkdfRVNSX1ZBTF9CUksoS0RCR19DT01QSUxFRF9EQkdfQlJLX0lNTSksCisJLmZuCQk9IGtnZGJfY29tcGlsZWRfYnJrX2ZuCit9OworCitzdGF0aWMgc3RydWN0IHN0ZXBfaG9vayBrZ2RiX3N0ZXBfaG9vayA9IHsKKwkuZm4JCT0ga2dkYl9zdGVwX2Jya19mbgorfTsKKworc3RhdGljIHZvaWQga2dkYl9jYWxsX25taV9ob29rKHZvaWQgKmlnbm9yZWQpCit7CisJa2dkYl9ubWljYWxsYmFjayhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBnZXRfaXJxX3JlZ3MoKSk7Cit9CisKK3ZvaWQga2dkYl9yb3VuZHVwX2NwdXModW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJc21wX2NhbGxfZnVuY3Rpb24oa2dkYl9jYWxsX25taV9ob29rLCBOVUxMLCAwKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworfQorCitzdGF0aWMgaW50IF9fa2dkYl9ub3RpZnkoc3RydWN0IGRpZV9hcmdzICphcmdzLCB1bnNpZ25lZCBsb25nIGNtZCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGFyZ3MtPnJlZ3M7CisKKwlpZiAoa2dkYl9oYW5kbGVfZXhjZXB0aW9uKDEsIGFyZ3MtPnNpZ25yLCBjbWQsIHJlZ3MpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9TVE9QOworfQorCitzdGF0aWMgaW50CitrZ2RiX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJldCA9IF9fa2dkYl9ub3RpZnkocHRyLCBjbWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga2dkYl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGtnZGJfbm90aWZ5LAorCS8qCisJICogV2FudCB0byBiZSBsb3dlc3QgcHJpb3JpdHkKKwkgKi8KKwkucHJpb3JpdHkJPSAtSU5UX01BWCwKK307CisKKy8qCisgKiBrZ2RiX2FyY2hfaW5pdCAtIFBlcmZvcm0gYW55IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbml0YWxpemF0aW9uLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgaW5pdGFsaXphdGlvbiBvZiBhbnkgYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyBjYWxsYmFja3MuCisgKi8KK2ludCBrZ2RiX2FyY2hfaW5pdCh2b2lkKQoreworCWludCByZXQgPSByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtnZGJfbm90aWZpZXIpOworCisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmVnaXN0ZXJfYnJlYWtfaG9vaygma2dkYl9icmtwdF9ob29rKTsKKwlyZWdpc3Rlcl9icmVha19ob29rKCZrZ2RiX2NvbXBpbGVkX2Jya3B0X2hvb2spOworCXJlZ2lzdGVyX3N0ZXBfaG9vaygma2dkYl9zdGVwX2hvb2spOworCXJldHVybiAwOworfQorCisvKgorICoga2dkYl9hcmNoX2V4aXQgLSBQZXJmb3JtIGFueSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdW5pbml0YWxpemF0aW9uLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgdW5pbml0YWxpemF0aW9uIG9mIGFueSBhcmNoaXRlY3R1cmUKKyAqIHNwZWNpZmljIGNhbGxiYWNrcywgZm9yIGR5bmFtaWMgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbi4KKyAqLwordm9pZCBrZ2RiX2FyY2hfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfYnJlYWtfaG9vaygma2dkYl9icmtwdF9ob29rKTsKKwl1bnJlZ2lzdGVyX2JyZWFrX2hvb2soJmtnZGJfY29tcGlsZWRfYnJrcHRfaG9vayk7CisJdW5yZWdpc3Rlcl9zdGVwX2hvb2soJmtnZGJfc3RlcF9ob29rKTsKKwl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7Cit9CisKKy8qCisgKiBBUk0gaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgaW4gTEUuCisgKiBCcmVhayBpbnN0cnVjdGlvbiBpcyBlbmNvZGVkIGluIExFIGZvcm1hdAorICovCitzdHJ1Y3Qga2dkYl9hcmNoIGFyY2hfa2dkYl9vcHMgPSB7CisJLmdkYl9icHRfaW5zdHIgPSB7CisJCUtHREJfRFlOX0JSS19JTlNfQllURTAsCisJCUtHREJfRFlOX0JSS19JTlNfQllURTEsCisJCUtHREJfRFlOX0JSS19JTlNfQllURTIsCisJCUtHREJfRFlOX0JSS19JTlNfQllURTMsCisJfQorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA1YjFjZDc5Li5lODY4YzcyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0xMzQ4LDggKzEzNDgsOCBAQAogICogQ2FsbGNoYWluIGhhbmRsaW5nIGNvZGUuCiAgKi8KIHN0cnVjdCBmcmFtZV90YWlsIHsKLQlzdHJ1Y3QgZnJhbWVfdGFpbCAgIF9fdXNlciAqZnA7Ci0JdW5zaWduZWQgbG9uZwkgICAgbHI7CisJc3RydWN0IGZyYW1lX3RhaWwJX191c2VyICpmcDsKKwl1bnNpZ25lZCBsb25nCQlscjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xMzg2LDIyICsxMzg2LDgwIEBACiAJcmV0dXJuIGJ1ZnRhaWwuZnA7CiB9CiAKKy8qCisgKiBUaGUgcmVnaXN0ZXJzIHdlJ3JlIGludGVyZXN0ZWQgaW4gYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlCisgKiBsZW5ndGggc2F2ZWQgcmVnaXN0ZXIgc3RydWN0dXJlLiBUaGUgZnAgcG9pbnRzIGF0IHRoZSBlbmQgb2YgdGhpcworICogc3RydWN0dXJlIHNvIHRoZSBhZGRyZXNzIG9mIHRoaXMgc3RydWN0IGlzOgorICogKHN0cnVjdCBjb21wYXRfZnJhbWVfdGFpbCAqKSh4eHgtPmZwKS0xCisgKgorICogVGhpcyBjb2RlIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgQVJNIE9Qcm9maWxlIHN1cHBvcnQuCisgKi8KK3N0cnVjdCBjb21wYXRfZnJhbWVfdGFpbCB7CisJY29tcGF0X3VwdHJfdAlmcDsgLyogYSAoc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsICopIGluIGNvbXBhdCBtb2RlICovCisJdTMyCQlzcDsKKwl1MzIJCWxyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIHN0cnVjdCBjb21wYXRfZnJhbWVfdGFpbCBfX3VzZXIgKgorY29tcGF0X3VzZXJfYmFja3RyYWNlKHN0cnVjdCBjb21wYXRfZnJhbWVfdGFpbCBfX3VzZXIgKnRhaWwsCisJCSAgICAgIHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIGJ1ZnRhaWw7CisJdW5zaWduZWQgbG9uZyBlcnI7CisKKwkvKiBBbHNvIGNoZWNrIGFjY2Vzc2liaWxpdHkgb2Ygb25lIHN0cnVjdCBmcmFtZV90YWlsIGJleW9uZCAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB0YWlsLCBzaXplb2YoYnVmdGFpbCkpKQorCQlyZXR1cm4gTlVMTDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisJZXJyID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygmYnVmdGFpbCwgdGFpbCwgc2l6ZW9mKGJ1ZnRhaWwpKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gTlVMTDsKKworCXBlcmZfY2FsbGNoYWluX3N0b3JlKGVudHJ5LCBidWZ0YWlsLmxyKTsKKworCS8qCisJICogRnJhbWUgcG9pbnRlcnMgc2hvdWxkIHN0cmljdGx5IHByb2dyZXNzIGJhY2sgdXAgdGhlIHN0YWNrCisJICogKHRvd2FyZHMgaGlnaGVyIGFkZHJlc3NlcykuCisJICovCisJaWYgKHRhaWwgKyAxID49IChzdHJ1Y3QgY29tcGF0X2ZyYW1lX3RhaWwgX191c2VyICopCisJCQljb21wYXRfcHRyKGJ1ZnRhaWwuZnApKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAoc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIF9fdXNlciAqKWNvbXBhdF9wdHIoYnVmdGFpbC5mcCkgLSAxOworfQorCiB2b2lkIHBlcmZfY2FsbGNoYWluX3VzZXIoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSwKIAkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgZnJhbWVfdGFpbCBfX3VzZXIgKnRhaWw7Ci0KIAlpZiAocGVyZl9ndWVzdF9jYnMgJiYgcGVyZl9ndWVzdF9jYnMtPmlzX2luX2d1ZXN0KCkpIHsKIAkJLyogV2UgZG9uJ3Qgc3VwcG9ydCBndWVzdCBvcyBjYWxsY2hhaW4gbm93ICovCiAJCXJldHVybjsKIAl9CiAKIAlwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgcmVncy0+cGMpOwotCXRhaWwgPSAoc3RydWN0IGZyYW1lX3RhaWwgX191c2VyICopcmVncy0+cmVnc1syOV07CiAKLQl3aGlsZSAoZW50cnktPm5yIDwgUEVSRl9NQVhfU1RBQ0tfREVQVEggJiYKLQkgICAgICAgdGFpbCAmJiAhKCh1bnNpZ25lZCBsb25nKXRhaWwgJiAweGYpKQotCQl0YWlsID0gdXNlcl9iYWNrdHJhY2UodGFpbCwgZW50cnkpOworCWlmICghY29tcGF0X3VzZXJfbW9kZShyZWdzKSkgeworCQkvKiBBQVJDSDY0IG1vZGUgKi8KKwkJc3RydWN0IGZyYW1lX3RhaWwgX191c2VyICp0YWlsOworCisJCXRhaWwgPSAoc3RydWN0IGZyYW1lX3RhaWwgX191c2VyICopcmVncy0+cmVnc1syOV07CisKKwkJd2hpbGUgKGVudHJ5LT5uciA8IFBFUkZfTUFYX1NUQUNLX0RFUFRIICYmCisJCSAgICAgICB0YWlsICYmICEoKHVuc2lnbmVkIGxvbmcpdGFpbCAmIDB4ZikpCisJCQl0YWlsID0gdXNlcl9iYWNrdHJhY2UodGFpbCwgZW50cnkpOworCX0gZWxzZSB7CisJCS8qIEFBUkNIMzIgY29tcGF0IG1vZGUgKi8KKwkJc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIF9fdXNlciAqdGFpbDsKKworCQl0YWlsID0gKHN0cnVjdCBjb21wYXRfZnJhbWVfdGFpbCBfX3VzZXIgKilyZWdzLT5jb21wYXRfZnAgLSAxOworCisJCXdoaWxlICgoZW50cnktPm5yIDwgUEVSRl9NQVhfU1RBQ0tfREVQVEgpICYmCisJCQl0YWlsICYmICEoKHVuc2lnbmVkIGxvbmcpdGFpbCAmIDB4MykpCisJCQl0YWlsID0gY29tcGF0X3VzZXJfYmFja3RyYWNlKHRhaWwsIGVudHJ5KTsKKwl9CiB9CiAKIC8qCkBAIC0xNDI5LDYgKzE0ODcsNyBAQAogCWZyYW1lLmZwID0gcmVncy0+cmVnc1syOV07CiAJZnJhbWUuc3AgPSByZWdzLT5zcDsKIAlmcmFtZS5wYyA9IHJlZ3MtPnBjOworCiAJd2Fsa19zdGFja2ZyYW1lKCZmcmFtZSwgY2FsbGNoYWluX3RyYWNlLCBlbnRyeSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfcmVncy5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkNmYwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfcmVncy5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxhc20vcGVyZl9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCit1NjQgcGVyZl9yZWdfdmFsdWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBpZHgpCit7CisJaWYgKFdBUk5fT05fT05DRSgodTMyKWlkeCA+PSBQRVJGX1JFR19BUk02NF9NQVgpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ29tcGF0IChpLmUuIDMyIGJpdCkgbW9kZToKKwkgKiAtIFBDIGhhcyBiZWVuIHNldCBpbiB0aGUgcHRfcmVncyBzdHJ1Y3QgaW4ga2VybmVsX2VudHJ5LAorCSAqIC0gSGFuZGxlIFNQIGFuZCBMUiBoZXJlLgorCSAqLworCWlmIChjb21wYXRfdXNlcl9tb2RlKHJlZ3MpKSB7CisJCWlmICgodTMyKWlkeCA9PSBQRVJGX1JFR19BUk02NF9TUCkKKwkJCXJldHVybiByZWdzLT5jb21wYXRfc3A7CisJCWlmICgodTMyKWlkeCA9PSBQRVJGX1JFR19BUk02NF9MUikKKwkJCXJldHVybiByZWdzLT5jb21wYXRfbHI7CisJfQorCisJcmV0dXJuIHJlZ3MtPnJlZ3NbaWR4XTsKK30KKworI2RlZmluZSBSRUdfUkVTRVJWRUQgKH4oKDFVTEwgPDwgUEVSRl9SRUdfQVJNNjRfTUFYKSAtIDEpKQorCitpbnQgcGVyZl9yZWdfdmFsaWRhdGUodTY0IG1hc2spCit7CisJaWYgKCFtYXNrIHx8IG1hc2sgJiBSRUdfUkVTRVJWRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3U2NCBwZXJmX3JlZ19hYmkoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWlmIChpc19jb21wYXRfdGhyZWFkKHRhc2tfdGhyZWFkX2luZm8odGFzaykpKQorCQlyZXR1cm4gUEVSRl9TQU1QTEVfUkVHU19BQklfMzI7CisJZWxzZQorCQlyZXR1cm4gUEVSRl9TQU1QTEVfUkVHU19BQklfNjQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMWMwYTliZS4uNjM5MTQ4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CkBAIC03Miw4ICs3MSwxNyBAQAogCiB2b2lkIHNvZnRfcmVzdGFydCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJdHlwZWRlZiB2b2lkICgqcGh5c19yZXNldF90KSh1bnNpZ25lZCBsb25nKTsKKwlwaHlzX3Jlc2V0X3QgcGh5c19yZXNldDsKKwogCXNldHVwX3Jlc3RhcnQoKTsKLQljcHVfcmVzZXQoYWRkcik7CisKKwkvKiBTd2l0Y2ggdG8gdGhlIGlkZW50aXR5IG1hcHBpbmcgKi8KKwlwaHlzX3Jlc2V0ID0gKHBoeXNfcmVzZXRfdCl2aXJ0X3RvX3BoeXMoY3B1X3Jlc2V0KTsKKwlwaHlzX3Jlc2V0KGFkZHIpOworCisJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJQlVHKCk7CiB9CiAKIC8qCkBAIC05NCwxMCArMTAyLDggQEAKIAkgKiBUaGlzIHNob3VsZCBkbyBhbGwgdGhlIGNsb2NrIHN3aXRjaGluZyBhbmQgd2FpdCBmb3IgaW50ZXJydXB0CiAJICogdHJpY2tzCiAJICovCi0JaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpIHsKLQkJY3B1X2RvX2lkbGUoKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KKwljcHVfZG9faWRsZSgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcHNjaS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcHNjaS5jCmluZGV4IDRmOTdkYjMuLmVhNDgyOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3BzY2kuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9wc2NpLmMKQEAgLTE3NiwyMiArMTc2LDIwIEBACiAJe30sCiB9OwogCi1pbnQgX19pbml0IHBzY2lfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgcHNjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAljb25zdCBjaGFyICptZXRob2Q7CiAJdTMyIGlkOwotCWludCBlcnIgPSAwOwogCiAJbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgcHNjaV9vZl9tYXRjaCk7CiAJaWYgKCFucCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAogCXByX2luZm8oInByb2JpbmcgZnVuY3Rpb24gSURzIGZyb20gZGV2aWNlLXRyZWVcbiIpOwogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAibWV0aG9kIiwgJm1ldGhvZCkpIHsKIAkJcHJfd2FybmluZygibWlzc2luZyBcIm1ldGhvZFwiIHByb3BlcnR5XG4iKTsKLQkJZXJyID0gLUVOWElPOwogCQlnb3RvIG91dF9wdXRfbm9kZTsKIAl9CiAKQEAgLTIwMSw3ICsxOTksNiBAQAogCQlpbnZva2VfcHNjaV9mbiA9IF9faW52b2tlX3BzY2lfZm5fc21jOwogCX0gZWxzZSB7CiAJCXByX3dhcm5pbmcoImludmFsaWQgXCJtZXRob2RcIiBwcm9wZXJ0eTogJXNcbiIsIG1ldGhvZCk7Ci0JCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X3B1dF9ub2RlOwogCX0KIApAQCAtMjI3LDcgKzIyNCw3IEBACiAKIG91dF9wdXRfbm9kZToKIAlvZl9ub2RlX3B1dChucCk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm47CiB9CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0yNTEsNyArMjQ4LDcgQEAKIHsKIAlpbnQgZXJyID0gcHNjaV9vcHMuY3B1X29uKGNwdV9sb2dpY2FsX21hcChjcHUpLCBfX3BhKHNlY29uZGFyeV9lbnRyeSkpOwogCWlmIChlcnIpCi0JCXByX2VycigicHNjaTogZmFpbGVkIHRvIGJvb3QgQ1BVJWQgKCVkKVxuIiwgY3B1LCBlcnIpOworCQlwcl9lcnIoImZhaWxlZCB0byBib290IENQVSVkICglZClcbiIsIGNwdSwgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yNzgsNyArMjc1LDcgQEAKIAogCXJldCA9IHBzY2lfb3BzLmNwdV9vZmYoc3RhdGUpOwogCi0JcHJfY3JpdCgicHNjaTogdW5hYmxlIHRvIHBvd2VyIG9mZiBDUFUldSAoJWQpXG4iLCBjcHUsIHJldCk7CisJcHJfY3JpdCgidW5hYmxlIHRvIHBvd2VyIG9mZiBDUFUldSAoJWQpXG4iLCBjcHUsIHJldCk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMKaW5kZXggYzhlOWVmZi4uNjdkYTMwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jCkBAIC02OSw2ICs2OSw3IEBACiAJCQkJIENPTVBBVF9IV0NBUF9WRlB2M3xDT01QQVRfSFdDQVBfVkZQdjR8XAogCQkJCSBDT01QQVRfSFdDQVBfTkVPTnxDT01QQVRfSFdDQVBfSURJVikKIHVuc2lnbmVkIGludCBjb21wYXRfZWxmX2h3Y2FwIF9fcmVhZF9tb3N0bHkgPSBDT01QQVRfRUxGX0hXQ0FQX0RFRkFVTFQ7Cit1bnNpZ25lZCBpbnQgY29tcGF0X2VsZl9od2NhcDIgX19yZWFkX21vc3RseTsKICNlbmRpZgogCiBzdGF0aWMgY29uc3QgY2hhciAqY3B1X25hbWU7CkBAIC0yNDIsNiArMjQzLDM4IEBACiAJYmxvY2sgPSAoZmVhdHVyZXMgPj4gMTYpICYgMHhmOwogCWlmIChibG9jayAmJiAhKGJsb2NrICYgMHg4KSkKIAkJZWxmX2h3Y2FwIHw9IEhXQ0FQX0NSQzMyOworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS8qCisJICogSURfSVNBUjVfRUwxIGNhcnJpZXMgc2ltaWxhciBpbmZvcm1hdGlvbiBhcyBhYm92ZSwgYnV0IHBlcnRhaW5pbmcgdG8KKwkgKiB0aGUgQWFyY2gzMiAzMi1iaXQgZXhlY3V0aW9uIHN0YXRlLgorCSAqLworCWZlYXR1cmVzID0gcmVhZF9jcHVpZChJRF9JU0FSNV9FTDEpOworCWJsb2NrID0gKGZlYXR1cmVzID4+IDQpICYgMHhmOworCWlmICghKGJsb2NrICYgMHg4KSkgeworCQlzd2l0Y2ggKGJsb2NrKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgMjoKKwkJCWNvbXBhdF9lbGZfaHdjYXAyIHw9IENPTVBBVF9IV0NBUDJfUE1VTEw7CisJCWNhc2UgMToKKwkJCWNvbXBhdF9lbGZfaHdjYXAyIHw9IENPTVBBVF9IV0NBUDJfQUVTOworCQljYXNlIDA6CisJCQlicmVhazsKKwkJfQorCX0KKworCWJsb2NrID0gKGZlYXR1cmVzID4+IDgpICYgMHhmOworCWlmIChibG9jayAmJiAhKGJsb2NrICYgMHg4KSkKKwkJY29tcGF0X2VsZl9od2NhcDIgfD0gQ09NUEFUX0hXQ0FQMl9TSEExOworCisJYmxvY2sgPSAoZmVhdHVyZXMgPj4gMTIpICYgMHhmOworCWlmIChibG9jayAmJiAhKGJsb2NrICYgMHg4KSkKKwkJY29tcGF0X2VsZl9od2NhcDIgfD0gQ09NUEFUX0hXQ0FQMl9TSEEyOworCisJYmxvY2sgPSAoZmVhdHVyZXMgPj4gMTYpICYgMHhmOworCWlmIChibG9jayAmJiAhKGJsb2NrICYgMHg4KSkKKwkJY29tcGF0X2VsZl9od2NhcDIgfD0gQ09NUEFUX0hXQ0FQMl9DUkMzMjsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfbWFjaGluZV9mZHQocGh5c19hZGRyX3QgZHRfcGh5cykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKaW5kZXggN2NmYjkyYS4uZjBhMTQxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKQEAgLTExNCw2ICsxMTQsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBzbXBfc3RvcmVfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdWlkKQoreworCXN0b3JlX2NwdV90b3BvbG9neShjcHVpZCk7Cit9CisKIC8qCiAgKiBUaGlzIGlzIHRoZSBzZWNvbmRhcnkgQ1BVIGJvb3QgZW50cnkuICBXZSdyZSB1c2luZyB0aGlzIENQVXMKICAqIGlkbGUgdGhyZWFkIHN0YWNrLCBidXQgYSBzZXQgb2YgdGVtcG9yYXJ5IHBhZ2UgdGFibGVzLgpAQCAtMTUyLDYgKzE1Nyw4IEBACiAJICovCiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwogCisJc21wX3N0b3JlX2NwdV9pbmZvKGNwdSk7CisKIAkvKgogCSAqIE9LLCBub3cgaXQncyBzYWZlIHRvIGxldCB0aGUgYm9vdCBDUFUgY29udGludWUuICBXYWl0IGZvcgogCSAqIHRoZSBDUFUgbWlncmF0aW9uIGNvZGUgdG8gbm90aWNlIHRoYXQgdGhlIENQVSBpcyBvbmxpbmUKQEAgLTE2MCw2ICsxNjcsNyBAQAogCXNldF9jcHVfb25saW5lKGNwdSwgdHJ1ZSk7CiAJY29tcGxldGUoJmNwdV9ydW5uaW5nKTsKIAorCWxvY2FsX2RiZ19lbmFibGUoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJbG9jYWxfYXN5bmNfZW5hYmxlKCk7CiAKQEAgLTM5MCw2ICszOTgsMTAgQEAKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCBjcHUsIG5jb3JlcyA9IG51bV9wb3NzaWJsZV9jcHVzKCk7CiAKKwlpbml0X2NwdV90b3BvbG9neSgpOworCisJc21wX3N0b3JlX2NwdV9pbmZvKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKIAkvKgogCSAqIGFyZSB3ZSB0cnlpbmcgdG8gYm9vdCBtb3JlIGNvcmVzIHRoYW4gZXhpc3Q/CiAJICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zbXBfc3Bpbl90YWJsZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wX3NwaW5fdGFibGUuYwppbmRleCA0NGMyMjgwLi43YTUzMGQyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbXBfc3Bpbl90YWJsZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCXJldHVybiBzZWNvbmRhcnlfaG9sZGluZ19wZW5fcmVsZWFzZSAhPSBJTlZBTElEX0hXSUQgPyAtRU5PU1lTIDogMDsKIH0KIAotdm9pZCBzbXBfc3Bpbl90YWJsZV9jcHVfcG9zdGJvb3Qodm9pZCkKK3N0YXRpYyB2b2lkIHNtcF9zcGluX3RhYmxlX2NwdV9wb3N0Ym9vdCh2b2lkKQogewogCS8qCiAJICogTGV0IHRoZSBwcmltYXJ5IHByb2Nlc3NvciBrbm93IHdlJ3JlIG91dCBvZiB0aGUgcGVuLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvYXJtNjQva2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwNmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3RvcG9sb2d5LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIGFyY2gvYXJtNjQva2VybmVsL3RvcG9sb2d5LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsMjAxMywyMDE0IExpbmFybyBMaW1pdGVkLgorICoKKyAqIEJhc2VkIG9uIHRoZSBhcm0zMiB2ZXJzaW9uIHdyaXR0ZW4gYnkgVmluY2VudCBHdWl0dG90IGluIHR1cm4gYmFzZWQgb24KKyAqIGFyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CisKKy8qCisgKiBjcHUgdG9wb2xvZ3kgdGFibGUKKyAqLworc3RydWN0IGNwdV90b3BvbG9neSBjcHVfdG9wb2xvZ3lbTlJfQ1BVU107CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfdG9wb2xvZ3kpOworCitjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X2NvcmVncm91cF9tYXNrKGludCBjcHUpCit7CisJcmV0dXJuICZjcHVfdG9wb2xvZ3lbY3B1XS5jb3JlX3NpYmxpbmc7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zaWJsaW5nc19tYXNrcyh1bnNpZ25lZCBpbnQgY3B1aWQpCit7CisJc3RydWN0IGNwdV90b3BvbG9neSAqY3B1X3RvcG8sICpjcHVpZF90b3BvID0gJmNwdV90b3BvbG9neVtjcHVpZF07CisJaW50IGNwdTsKKworCWlmIChjcHVpZF90b3BvLT5jbHVzdGVyX2lkID09IC0xKSB7CisJCS8qCisJCSAqIERUIGRvZXMgbm90IGNvbnRhaW4gdG9wb2xvZ3kgaW5mb3JtYXRpb24gZm9yIHRoaXMgY3B1CisJCSAqIHJlc2V0IGl0IHRvIGRlZmF1bHQgYmVoYXZpb3VyCisJCSAqLworCQlwcl9kZWJ1ZygiQ1BVJXU6IE5vIHRvcG9sb2d5IGluZm9ybWF0aW9uIGNvbmZpZ3VyZWRcbiIsIGNwdWlkKTsKKwkJY3B1aWRfdG9wby0+Y29yZV9pZCA9IDA7CisJCWNwdW1hc2tfc2V0X2NwdShjcHVpZCwgJmNwdWlkX3RvcG8tPmNvcmVfc2libGluZyk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHVpZCwgJmNwdWlkX3RvcG8tPnRocmVhZF9zaWJsaW5nKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHVwZGF0ZSBjb3JlIGFuZCB0aHJlYWQgc2libGluZyBtYXNrcyAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJY3B1X3RvcG8gPSAmY3B1X3RvcG9sb2d5W2NwdV07CisKKwkJaWYgKGNwdWlkX3RvcG8tPmNsdXN0ZXJfaWQgIT0gY3B1X3RvcG8tPmNsdXN0ZXJfaWQpCisJCQljb250aW51ZTsKKworCQljcHVtYXNrX3NldF9jcHUoY3B1aWQsICZjcHVfdG9wby0+Y29yZV9zaWJsaW5nKTsKKwkJaWYgKGNwdSAhPSBjcHVpZCkKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVpZF90b3BvLT5jb3JlX3NpYmxpbmcpOworCisJCWlmIChjcHVpZF90b3BvLT5jb3JlX2lkICE9IGNwdV90b3BvLT5jb3JlX2lkKQorCQkJY29udGludWU7CisKKwkJY3B1bWFza19zZXRfY3B1KGNwdWlkLCAmY3B1X3RvcG8tPnRocmVhZF9zaWJsaW5nKTsKKwkJaWYgKGNwdSAhPSBjcHVpZCkKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVpZF90b3BvLT50aHJlYWRfc2libGluZyk7CisJfQorfQorCit2b2lkIHN0b3JlX2NwdV90b3BvbG9neSh1bnNpZ25lZCBpbnQgY3B1aWQpCit7CisJdXBkYXRlX3NpYmxpbmdzX21hc2tzKGNwdWlkKTsKK30KKworLyoKKyAqIGluaXRfY3B1X3RvcG9sb2d5IGlzIGNhbGxlZCBhdCBib290IHdoZW4gb25seSBvbmUgY3B1IGlzIHJ1bm5pbmcKKyAqIHdoaWNoIHByZXZlbnQgc2ltdWx0YW5lb3VzIHdyaXRlIGFjY2VzcyB0byBjcHVfdG9wb2xvZ3kgYXJyYXkKKyAqLwordm9pZCBfX2luaXQgaW5pdF9jcHVfdG9wb2xvZ3kodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJLyogaW5pdCBjb3JlIG1hc2sgYW5kIHBvd2VyKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBjcHVfdG9wb2xvZ3kgKmNwdV90b3BvID0gJmNwdV90b3BvbG9neVtjcHVdOworCisJCWNwdV90b3BvLT50aHJlYWRfaWQgPSAtMTsKKwkJY3B1X3RvcG8tPmNvcmVfaWQgPSAgLTE7CisJCWNwdV90b3BvLT5jbHVzdGVyX2lkID0gLTE7CisJCWNwdW1hc2tfY2xlYXIoJmNwdV90b3BvLT5jb3JlX3NpYmxpbmcpOworCQljcHVtYXNrX2NsZWFyKCZjcHVfdG9wby0+dGhyZWFkX3NpYmxpbmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYwppbmRleCBhNzE0OWNhLi41MDM4NGZlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCkBAIC0xMDYsNDkgKzEwNiwzMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB2ZHNvX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcGFnZSAqcGc7Ci0JY2hhciAqdmJhc2U7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAobWVtY21wKCZ2ZHNvX3N0YXJ0LCAiXDE3N0VMRiIsIDQpKSB7CisJCXByX2VycigidkRTTyBpcyBub3QgYSB2YWxpZCBFTEYgb2JqZWN0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXZkc29fcGFnZXMgPSAoJnZkc29fZW5kIC0gJnZkc29fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CiAJcHJfaW5mbygidmRzbzogJWxkIHBhZ2VzICglbGQgY29kZSwgJWxkIGRhdGEpIGF0IGJhc2UgJXBcbiIsCiAJCXZkc29fcGFnZXMgKyAxLCB2ZHNvX3BhZ2VzLCAxTCwgJnZkc29fc3RhcnQpOwogCiAJLyogQWxsb2NhdGUgdGhlIHZEU08gcGFnZWxpc3QsIHBsdXMgYSBwYWdlIGZvciB0aGUgZGF0YS4gKi8KLQl2ZHNvX3BhZ2VsaXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiAodmRzb19wYWdlcyArIDEpLAorCXZkc29fcGFnZWxpc3QgPSBrY2FsbG9jKHZkc29fcGFnZXMgKyAxLCBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKHZkc29fcGFnZWxpc3QgPT0gTlVMTCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSB2RFNPIHBhZ2VsaXN0IVxuIik7CisJaWYgKHZkc29fcGFnZWxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogR3JhYiB0aGUgdkRTTyBjb2RlIHBhZ2VzLiAqLwotCWZvciAoaSA9IDA7IGkgPCB2ZHNvX3BhZ2VzOyBpKyspIHsKLQkJcGcgPSB2aXJ0X3RvX3BhZ2UoJnZkc29fc3RhcnQgKyBpKlBBR0VfU0laRSk7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHBnKTsKLQkJZ2V0X3BhZ2UocGcpOwotCQl2ZHNvX3BhZ2VsaXN0W2ldID0gcGc7Ci0JfQotCi0JLyogU2FuaXR5IGNoZWNrIHRoZSBzaGFyZWQgb2JqZWN0IGhlYWRlci4gKi8KLQl2YmFzZSA9IHZtYXAodmRzb19wYWdlbGlzdCwgMSwgMCwgUEFHRV9LRVJORUwpOwotCWlmICh2YmFzZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIG1hcCB2RFNPIHBhZ2VsaXN0IVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0gZWxzZSBpZiAobWVtY21wKHZiYXNlLCAiXDE3N0VMRiIsIDQpKSB7Ci0JCXByX2VycigidkRTTyBpcyBub3QgYSB2YWxpZCBFTEYgb2JqZWN0IVxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5tYXA7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCB2ZHNvX3BhZ2VzOyBpKyspCisJCXZkc29fcGFnZWxpc3RbaV0gPSB2aXJ0X3RvX3BhZ2UoJnZkc29fc3RhcnQgKyBpICogUEFHRV9TSVpFKTsKIAogCS8qIEdyYWIgdGhlIHZEU08gZGF0YSBwYWdlLiAqLwotCXBnID0gdmlydF90b19wYWdlKHZkc29fZGF0YSk7Ci0JZ2V0X3BhZ2UocGcpOwotCXZkc29fcGFnZWxpc3RbaV0gPSBwZzsKKwl2ZHNvX3BhZ2VsaXN0W2ldID0gdmlydF90b19wYWdlKHZkc29fZGF0YSk7CiAKLXVubWFwOgotCXZ1bm1hcCh2YmFzZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwodmRzb19pbml0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwLWluaXQuUyBiL2FyY2gvYXJtNjQva3ZtL2h5cC1pbml0LlMKaW5kZXggMmIwMjQ0ZC4uZDk2ODc5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwLWluaXQuUworKysgYi9hcmNoL2FybTY0L2t2bS9oeXAtaW5pdC5TCkBAIC02OCw2ICs2OCwxMiBAQAogCW1zcgl0Y3JfZWwyLCB4NAogCiAJbGRyCXg0LCA9VlRDUl9FTDJfRkxBR1MKKwkvKgorCSAqIFJlYWQgdGhlIFBBUmFuZ2UgYml0cyBmcm9tIElEX0FBNjRNTUZSMF9FTDEgYW5kIHNldCB0aGUgUFMgYml0cyBpbgorCSAqIFZUQ1JfRUwyLgorCSAqLworCW1ycwl4NSwgSURfQUE2NE1NRlIwX0VMMQorCWJmaQl4NCwgeDUsICMxNiwgIzMKIAltc3IJdnRjcl9lbDIsIHg0CiAKIAltcnMJeDQsIG1haXJfZWwxCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2NhY2hlLlMgYi9hcmNoL2FybTY0L21tL2NhY2hlLlMKaW5kZXggMWVhOWYyNi4uYzQ2ZjQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9jYWNoZS5TCisrKyBiL2FyY2gvYXJtNjQvbW0vY2FjaGUuUwpAQCAtMzAsNyArMzAsNyBAQAogICoKICAqCUNvcnJ1cHRlZCByZWdpc3RlcnM6IHgwLXg3LCB4OS14MTEKICAqLwotRU5UUlkoX19mbHVzaF9kY2FjaGVfYWxsKQorX19mbHVzaF9kY2FjaGVfYWxsOgogCWRzYglzeQkJCQkvLyBlbnN1cmUgb3JkZXJpbmcgd2l0aCBwcmV2aW91cyBtZW1vcnkgYWNjZXNzZXMKIAltcnMJeDAsIGNsaWRyX2VsMQkJCS8vIHJlYWQgY2xpZHIKIAlhbmQJeDMsIHgwLCAjMHg3MDAwMDAwCQkvLyBleHRyYWN0IGxvYyBmcm9tIGNsaWRyCkBAIC0xNjYsMyArMTY2LDgxIEBACiAJZHNiCXN5CiAJcmV0CiBFTkRQUk9DKF9fZmx1c2hfZGNhY2hlX2FyZWEpCisKKy8qCisgKglfX2RtYV9pbnZfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCisgKi8KK19fZG1hX2ludl9yYW5nZToKKwlkY2FjaGVfbGluZV9zaXplIHgyLCB4MworCXN1Ygl4MywgeDIsICMxCisJYmljCXgwLCB4MCwgeDMKKwliaWMJeDEsIHgxLCB4MworMToJZGMJaXZhYywgeDAJCQkvLyBpbnZhbGlkYXRlIEQgLyBVIGxpbmUKKwlhZGQJeDAsIHgwLCB4MgorCWNtcAl4MCwgeDEKKwliLmxvCTFiCisJZHNiCXN5CisJcmV0CitFTkRQUk9DKF9fZG1hX2ludl9yYW5nZSkKKworLyoKKyAqCV9fZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitfX2RtYV9jbGVhbl9yYW5nZToKKwlkY2FjaGVfbGluZV9zaXplIHgyLCB4MworCXN1Ygl4MywgeDIsICMxCisJYmljCXgwLCB4MCwgeDMKKzE6CWRjCWN2YWMsIHgwCQkJLy8gY2xlYW4gRCAvIFUgbGluZQorCWFkZAl4MCwgeDAsIHgyCisJY21wCXgwLCB4MQorCWIubG8JMWIKKwlkc2IJc3kKKwlyZXQKK0VORFBST0MoX19kbWFfY2xlYW5fcmFuZ2UpCisKKy8qCisgKglfX2RtYV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqLworRU5UUlkoX19kbWFfZmx1c2hfcmFuZ2UpCisJZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKKwlzdWIJeDMsIHgyLCAjMQorCWJpYwl4MCwgeDAsIHgzCisxOglkYwljaXZhYywgeDAJCQkvLyBjbGVhbiAmIGludmFsaWRhdGUgRCAvIFUgbGluZQorCWFkZAl4MCwgeDAsIHgyCisJY21wCXgwLCB4MQorCWIubG8JMWIKKwlkc2IJc3kKKwlyZXQKK0VORFBST0MoX19kbWFfZmx1c2hfcmFuZ2UpCisKKy8qCisgKglfX2RtYV9tYXBfYXJlYShzdGFydCwgc2l6ZSwgZGlyKQorICoJLSBzdGFydAktIGtlcm5lbCB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gc2l6ZQktIHNpemUgb2YgcmVnaW9uCisgKgktIGRpcgktIERNQSBkaXJlY3Rpb24KKyAqLworRU5UUlkoX19kbWFfbWFwX2FyZWEpCisJYWRkCXgxLCB4MSwgeDAKKwljbXAJdzIsICNETUFfRlJPTV9ERVZJQ0UKKwliLmVxCV9fZG1hX2ludl9yYW5nZQorCWIJX19kbWFfY2xlYW5fcmFuZ2UKK0VORFBST0MoX19kbWFfbWFwX2FyZWEpCisKKy8qCisgKglfX2RtYV91bm1hcF9hcmVhKHN0YXJ0LCBzaXplLCBkaXIpCisgKgktIHN0YXJ0CS0ga2VybmVsIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBzaXplCS0gc2l6ZSBvZiByZWdpb24KKyAqCS0gZGlyCS0gRE1BIGRpcmVjdGlvbgorICovCitFTlRSWShfX2RtYV91bm1hcF9hcmVhKQorCWFkZAl4MSwgeDEsIHgwCisJY21wCXcyLCAjRE1BX1RPX0RFVklDRQorCWIubmUJX19kbWFfaW52X3JhbmdlCisJcmV0CitFTkRQUk9DKF9fZG1hX3VubWFwX2FyZWEpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMgYi9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKaW5kZXggZmJkNzY3OC4uMGJhMzQ3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYwpAQCAtMzAsMTggKzMwLDI2IEBACiBzdHJ1Y3QgZG1hX21hcF9vcHMgKmRtYV9vcHM7CiBFWFBPUlRfU1lNQk9MKGRtYV9vcHMpOwogCi1zdGF0aWMgdm9pZCAqYXJtNjRfc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJCQkgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzLAotCQkJCQkgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQorc3RhdGljIHBncHJvdF90IF9fZ2V0X2RtYV9wZ3Byb3Qoc3RydWN0IGRtYV9hdHRycyAqYXR0cnMsIHBncHJvdF90IHByb3QsCisJCQkJIGJvb2wgY29oZXJlbnQpCit7CisJaWYgKCFjb2hlcmVudCB8fCBkbWFfZ2V0X2F0dHIoRE1BX0FUVFJfV1JJVEVfQ09NQklORSwgYXR0cnMpKQorCQlyZXR1cm4gcGdwcm90X3dyaXRlY29tYmluZShwcm90KTsKKwlyZXR1cm4gcHJvdDsKK30KKworc3RhdGljIHZvaWQgKl9fZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncywKKwkJCQkgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewogCWlmIChkZXYgPT0gTlVMTCkgewogCQlXQVJOX09OQ0UoMSwgIlVzZSBhbiBhY3R1YWwgZGV2aWNlIHN0cnVjdHVyZSBmb3IgRE1BIGFsbG9jYXRpb25cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfWk9ORV9ETUEzMikgJiYKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfWk9ORV9ETUEpICYmCiAJICAgIGRldi0+Y29oZXJlbnRfZG1hX21hc2sgPD0gRE1BX0JJVF9NQVNLKDMyKSkKLQkJZmxhZ3MgfD0gR0ZQX0RNQTMyOworCQlmbGFncyB8PSBHRlBfRE1BOwogCWlmIChJU19FTkFCTEVEKENPTkZJR19ETUFfQ01BKSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIApAQCAtNTgsOSArNjYsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXJtNjRfc3dpb3RsYl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkJCXN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQorc3RhdGljIHZvaWQgX19kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7CiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCVdBUk5fT05DRSgxLCAiVXNlIGFuIGFjdHVhbCBkZXZpY2Ugc3RydWN0dXJlIGZvciBETUEgYWxsb2NhdGlvblxuIik7CkBAIC03OCw5ICs4NiwyMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcF9vcHMgYXJtNjRfc3dpb3RsYl9kbWFfb3BzID0gewotCS5hbGxvYyA9IGFybTY0X3N3aW90bGJfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWUgPSBhcm02NF9zd2lvdGxiX2ZyZWVfY29oZXJlbnQsCitzdGF0aWMgdm9pZCAqX19kbWFfYWxsb2Nfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzLAorCQkJCSAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICoqbWFwOworCXZvaWQgKnB0ciwgKmNvaGVyZW50X3B0cjsKKwlpbnQgb3JkZXIsIGk7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCXB0ciA9IF9fZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgZG1hX2hhbmRsZSwgZmxhZ3MsIGF0dHJzKTsKKwlpZiAoIXB0cikKKwkJZ290byBub19tZW07CisJbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgPDwgb3JkZXIsIGZsYWdzICYgfkdGUF9ETUEpOworCWlmICghbWFwKQorCQlnb3RvIG5vX21hcDsKKworCS8qIHJlbW92ZSBhbnkgZGlydHkgY2FjaGUgbGluZXMgb24gdGhlIGtlcm5lbCBhbGlhcyAqLworCV9fZG1hX2ZsdXNoX3JhbmdlKHB0ciwgcHRyICsgc2l6ZSk7CisKKwkvKiBjcmVhdGUgYSBjb2hlcmVudCBtYXBwaW5nICovCisJcGFnZSA9IHZpcnRfdG9fcGFnZShwdHIpOworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZSA+PiBQQUdFX1NISUZUKTsgaSsrKQorCQltYXBbaV0gPSBwYWdlICsgaTsKKwljb2hlcmVudF9wdHIgPSB2bWFwKG1hcCwgc2l6ZSA+PiBQQUdFX1NISUZULCBWTV9NQVAsCisJCQkgICAgX19nZXRfZG1hX3BncHJvdChhdHRycywgcGdwcm90X2RlZmF1bHQsIGZhbHNlKSk7CisJa2ZyZWUobWFwKTsKKwlpZiAoIWNvaGVyZW50X3B0cikKKwkJZ290byBub19tYXA7CisKKwlyZXR1cm4gY29oZXJlbnRfcHRyOworCitub19tYXA6CisJX19kbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHB0ciwgKmRtYV9oYW5kbGUsIGF0dHJzKTsKK25vX21lbToKKwkqZG1hX2hhbmRsZSA9IH4wOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2RtYV9mcmVlX25vbmNvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwl2b2lkICpzd2lvdGxiX2FkZHIgPSBwaHlzX3RvX3ZpcnQoZG1hX3RvX3BoeXMoZGV2LCBkbWFfaGFuZGxlKSk7CisKKwl2dW5tYXAodmFkZHIpOworCV9fZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBzd2lvdGxiX2FkZHIsIGRtYV9oYW5kbGUsIGF0dHJzKTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgX19zd2lvdGxiX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlkbWFfYWRkcl90IGRldl9hZGRyOworCisJZGV2X2FkZHIgPSBzd2lvdGxiX21hcF9wYWdlKGRldiwgcGFnZSwgb2Zmc2V0LCBzaXplLCBkaXIsIGF0dHJzKTsKKwlfX2RtYV9tYXBfYXJlYShwaHlzX3RvX3ZpcnQoZG1hX3RvX3BoeXMoZGV2LCBkZXZfYWRkcikpLCBzaXplLCBkaXIpOworCisJcmV0dXJuIGRldl9hZGRyOworfQorCisKK3N0YXRpYyB2b2lkIF9fc3dpb3RsYl91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCQkgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJX19kbWFfdW5tYXBfYXJlYShwaHlzX3RvX3ZpcnQoZG1hX3RvX3BoeXMoZGV2LCBkZXZfYWRkcikpLCBzaXplLCBkaXIpOworCXN3aW90bGJfdW5tYXBfcGFnZShkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKK30KKworc3RhdGljIGludCBfX3N3aW90bGJfbWFwX3NnX2F0dHJzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCQkJICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBzd2lvdGxiX21hcF9zZ19hdHRycyhkZXYsIHNnbCwgbmVsZW1zLCBkaXIsIGF0dHJzKTsKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCByZXQsIGkpCisJCV9fZG1hX21hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIHNnLT5kbWFfYWRkcmVzcykpLAorCQkJICAgICAgIHNnLT5sZW5ndGgsIGRpcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX3N3aW90bGJfdW5tYXBfc2dfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZWxlbXMsCisJCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKQorCQlfX2RtYV91bm1hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIHNnLT5kbWFfYWRkcmVzcykpLAorCQkJCSBzZy0+bGVuZ3RoLCBkaXIpOworCXN3aW90bGJfdW5tYXBfc2dfYXR0cnMoZGV2LCBzZ2wsIG5lbGVtcywgZGlyLCBhdHRycyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBkbWFfYWRkcl90IGRldl9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJX19kbWFfdW5tYXBfYXJlYShwaHlzX3RvX3ZpcnQoZG1hX3RvX3BoeXMoZGV2LCBkZXZfYWRkcikpLCBzaXplLCBkaXIpOworCXN3aW90bGJfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIpOworfQorCitzdGF0aWMgdm9pZCBfX3N3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgZG1hX2FkZHJfdCBkZXZfYWRkciwgc2l6ZV90IHNpemUsCisJCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIpOworCV9fZG1hX21hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIGRldl9hZGRyKSksIHNpemUsIGRpcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVsZW1zLAorCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKQorCQlfX2RtYV91bm1hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIHNnLT5kbWFfYWRkcmVzcykpLAorCQkJCSBzZy0+bGVuZ3RoLCBkaXIpOworCXN3aW90bGJfc3luY19zZ19mb3JfY3B1KGRldiwgc2dsLCBuZWxlbXMsIGRpcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZWxlbXMsCisJCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCXN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKGRldiwgc2dsLCBuZWxlbXMsIGRpcik7CisJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKQorCQlfX2RtYV9tYXBfYXJlYShwaHlzX3RvX3ZpcnQoZG1hX3RvX3BoeXMoZGV2LCBzZy0+ZG1hX2FkZHJlc3MpKSwKKwkJCSAgICAgICBzZy0+bGVuZ3RoLCBkaXIpOworfQorCisvKiB2bWEtPnZtX3BhZ2VfcHJvdCBtdXN0IGJlIHNldCBhcHByb3ByaWF0ZWx5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgX19kbWFfY29tbW9uX21tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplKQoreworCWludCByZXQgPSAtRU5YSU87CisJdW5zaWduZWQgbG9uZyBucl92bWFfcGFnZXMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PgorCQkJCQlQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBkbWFfdG9fcGh5cyhkZXYsIGRtYV9hZGRyKSA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgb2ZmID0gdm1hLT52bV9wZ29mZjsKKworCWlmIChkbWFfbW1hcF9mcm9tX2NvaGVyZW50KGRldiwgdm1hLCBjcHVfYWRkciwgc2l6ZSwgJnJldCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAob2ZmIDwgbnJfcGFnZXMgJiYgbnJfdm1hX3BhZ2VzIDw9IChucl9wYWdlcyAtIG9mZikpIHsKKwkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkgICAgICBwZm4gKyBvZmYsCisJCQkJICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fc3dpb3RsYl9tbWFwX25vbmNvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX2dldF9kbWFfcGdwcm90KGF0dHJzLCB2bWEtPnZtX3BhZ2VfcHJvdCwgZmFsc2UpOworCXJldHVybiBfX2RtYV9jb21tb25fbW1hcChkZXYsIHZtYSwgY3B1X2FkZHIsIGRtYV9hZGRyLCBzaXplKTsKK30KKworc3RhdGljIGludCBfX3N3aW90bGJfbW1hcF9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQl2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCXN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCS8qIEp1c3QgdXNlIHdoYXRldmVyIHBhZ2VfcHJvdCBhdHRyaWJ1dGVzIHdlcmUgc3BlY2lmaWVkICovCisJcmV0dXJuIF9fZG1hX2NvbW1vbl9tbWFwKGRldiwgdm1hLCBjcHVfYWRkciwgZG1hX2FkZHIsIHNpemUpOworfQorCitzdHJ1Y3QgZG1hX21hcF9vcHMgbm9uY29oZXJlbnRfc3dpb3RsYl9kbWFfb3BzID0geworCS5hbGxvYyA9IF9fZG1hX2FsbG9jX25vbmNvaGVyZW50LAorCS5mcmVlID0gX19kbWFfZnJlZV9ub25jb2hlcmVudCwKKwkubW1hcCA9IF9fc3dpb3RsYl9tbWFwX25vbmNvaGVyZW50LAorCS5tYXBfcGFnZSA9IF9fc3dpb3RsYl9tYXBfcGFnZSwKKwkudW5tYXBfcGFnZSA9IF9fc3dpb3RsYl91bm1hcF9wYWdlLAorCS5tYXBfc2cgPSBfX3N3aW90bGJfbWFwX3NnX2F0dHJzLAorCS51bm1hcF9zZyA9IF9fc3dpb3RsYl91bm1hcF9zZ19hdHRycywKKwkuc3luY19zaW5nbGVfZm9yX2NwdSA9IF9fc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1LAorCS5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlID0gX19zd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UsCisJLnN5bmNfc2dfZm9yX2NwdSA9IF9fc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUsCisJLnN5bmNfc2dfZm9yX2RldmljZSA9IF9fc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UsCisJLmRtYV9zdXBwb3J0ZWQgPSBzd2lvdGxiX2RtYV9zdXBwb3J0ZWQsCisJLm1hcHBpbmdfZXJyb3IgPSBzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yLAorfTsKK0VYUE9SVF9TWU1CT0wobm9uY29oZXJlbnRfc3dpb3RsYl9kbWFfb3BzKTsKKworc3RydWN0IGRtYV9tYXBfb3BzIGNvaGVyZW50X3N3aW90bGJfZG1hX29wcyA9IHsKKwkuYWxsb2MgPSBfX2RtYV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZSA9IF9fZG1hX2ZyZWVfY29oZXJlbnQsCisJLm1tYXAgPSBfX3N3aW90bGJfbW1hcF9jb2hlcmVudCwKIAkubWFwX3BhZ2UgPSBzd2lvdGxiX21hcF9wYWdlLAogCS51bm1hcF9wYWdlID0gc3dpb3RsYl91bm1hcF9wYWdlLAogCS5tYXBfc2cgPSBzd2lvdGxiX21hcF9zZ19hdHRycywKQEAgLTkyLDEyICszMDMsMTkgQEAKIAkuZG1hX3N1cHBvcnRlZCA9IHN3aW90bGJfZG1hX3N1cHBvcnRlZCwKIAkubWFwcGluZ19lcnJvciA9IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IsCiB9OworRVhQT1JUX1NZTUJPTChjb2hlcmVudF9zd2lvdGxiX2RtYV9vcHMpOwogCi12b2lkIF9faW5pdCBhcm02NF9zd2lvdGxiX2luaXQodm9pZCkKK2V4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUoc2l6ZV90IGRlZmF1bHRfc2l6ZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHN3aW90bGJfbGF0ZV9pbml0KHZvaWQpCiB7Ci0JZG1hX29wcyA9ICZhcm02NF9zd2lvdGxiX2RtYV9vcHM7Ci0Jc3dpb3RsYl9pbml0KDEpOworCXNpemVfdCBzd2lvdGxiX3NpemUgPSBtaW4oU1pfNjRNLCBNQVhfT1JERVJfTlJfUEFHRVMgPDwgUEFHRV9TSElGVCk7CisKKwlkbWFfb3BzID0gJmNvaGVyZW50X3N3aW90bGJfZG1hX29wczsKKworCXJldHVybiBzd2lvdGxiX2xhdGVfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZShzd2lvdGxiX3NpemUpOwogfQorc3Vic3lzX2luaXRjYWxsKHN3aW90bGJfbGF0ZV9pbml0KTsKIAogI2RlZmluZSBQUkVBTExPQ19ETUFfREVCVUdfRU5UUklFUwk0MDk2CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vaW5pdC5jIGIvYXJjaC9hcm02NC9tbS9pbml0LmMKaW5kZXggZDBiNGMyZS4uODg2MjdjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm02NC9tbS9pbml0LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KQEAgLTU5LDIyICs2MCwyMiBAQAogZWFybHlfcGFyYW0oImluaXRyZCIsIGVhcmx5X2luaXRyZCk7CiAjZW5kaWYKIAotI2RlZmluZSBNQVhfRE1BMzJfUEZOICgoNFVMICogMTAyNCAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX1NISUZUKQotCiBzdGF0aWMgdm9pZCBfX2luaXQgem9uZV9zaXplc19pbml0KHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCkKIHsKIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyZWc7CiAJdW5zaWduZWQgbG9uZyB6b25lX3NpemVbTUFYX05SX1pPTkVTXSwgemhvbGVfc2l6ZVtNQVhfTlJfWk9ORVNdOwotCXVuc2lnbmVkIGxvbmcgbWF4X2RtYTMyID0gbWluOworCXVuc2lnbmVkIGxvbmcgbWF4X2RtYSA9IG1pbjsKIAogCW1lbXNldCh6b25lX3NpemUsIDAsIHNpemVvZih6b25lX3NpemUpKTsKIAotI2lmZGVmIENPTkZJR19aT05FX0RNQTMyCiAJLyogNEdCIG1heGltdW0gZm9yIDMyLWJpdCBvbmx5IGNhcGFibGUgZGV2aWNlcyAqLwotCW1heF9kbWEzMiA9IG1heChtaW4sIG1pbihtYXgsIE1BWF9ETUEzMl9QRk4pKTsKLQl6b25lX3NpemVbWk9ORV9ETUEzMl0gPSBtYXhfZG1hMzIgLSBtaW47Ci0jZW5kaWYKLQl6b25lX3NpemVbWk9ORV9OT1JNQUxdID0gbWF4IC0gbWF4X2RtYTMyOworCWlmIChJU19FTkFCTEVEKENPTkZJR19aT05FX0RNQSkpIHsKKwkJdW5zaWduZWQgbG9uZyBtYXhfZG1hX3BoeXMgPQorCQkJKHVuc2lnbmVkIGxvbmcpZG1hX3RvX3BoeXMoTlVMTCwgRE1BX0JJVF9NQVNLKDMyKSArIDEpOworCQltYXhfZG1hID0gbWF4KG1pbiwgbWluKG1heCwgbWF4X2RtYV9waHlzID4+IFBBR0VfU0hJRlQpKTsKKwkJem9uZV9zaXplW1pPTkVfRE1BXSA9IG1heF9kbWEgLSBtaW47CisJfQorCXpvbmVfc2l6ZVtaT05FX05PUk1BTF0gPSBtYXggLSBtYXhfZG1hOwogCiAJbWVtY3B5KHpob2xlX3NpemUsIHpvbmVfc2l6ZSwgc2l6ZW9mKHpob2xlX3NpemUpKTsKIApAQCAtODQsMTUgKzg1LDE1IEBACiAKIAkJaWYgKHN0YXJ0ID49IG1heCkKIAkJCWNvbnRpbnVlOwotI2lmZGVmIENPTkZJR19aT05FX0RNQTMyCi0JCWlmIChzdGFydCA8IG1heF9kbWEzMikgewotCQkJdW5zaWduZWQgbG9uZyBkbWFfZW5kID0gbWluKGVuZCwgbWF4X2RtYTMyKTsKLQkJCXpob2xlX3NpemVbWk9ORV9ETUEzMl0gLT0gZG1hX2VuZCAtIHN0YXJ0OworCisJCWlmIChJU19FTkFCTEVEKENPTkZJR19aT05FX0RNQSkgJiYgc3RhcnQgPCBtYXhfZG1hKSB7CisJCQl1bnNpZ25lZCBsb25nIGRtYV9lbmQgPSBtaW4oZW5kLCBtYXhfZG1hKTsKKwkJCXpob2xlX3NpemVbWk9ORV9ETUFdIC09IGRtYV9lbmQgLSBzdGFydDsKIAkJfQotI2VuZGlmCi0JCWlmIChlbmQgPiBtYXhfZG1hMzIpIHsKKworCQlpZiAoZW5kID4gbWF4X2RtYSkgewogCQkJdW5zaWduZWQgbG9uZyBub3JtYWxfZW5kID0gbWluKGVuZCwgbWF4KTsKLQkJCXVuc2lnbmVkIGxvbmcgbm9ybWFsX3N0YXJ0ID0gbWF4KHN0YXJ0LCBtYXhfZG1hMzIpOworCQkJdW5zaWduZWQgbG9uZyBub3JtYWxfc3RhcnQgPSBtYXgoc3RhcnQsIG1heF9kbWEpOwogCQkJemhvbGVfc2l6ZVtaT05FX05PUk1BTF0gLT0gbm9ybWFsX2VuZCAtIG5vcm1hbF9zdGFydDsKIAkJfQogCX0KQEAgLTI2MSw4ICsyNjIsNiBAQAogICovCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQogewotCWFybTY0X3N3aW90bGJfaW5pdCgpOwotCiAJbWF4X21hcG5yICAgPSBwZm5fdG9fcGFnZShtYXhfcGZuICsgUEhZU19QRk5fT0ZGU0VUKSAtIG1lbV9tYXA7CiAKICNpZm5kZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL3Byb2MuUyBiL2FyY2gvYXJtNjQvbW0vcHJvYy5TCmluZGV4IDEzMzNlNmY5Li5lMDg1ZWU2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL3Byb2MuUworKysgYi9hcmNoL2FybTY0L21tL3Byb2MuUwpAQCAtMTczLDEyICsxNzMsNiBAQAogICoJdmFsdWUgb2YgdGhlIFNDVExSX0VMMSByZWdpc3Rlci4KICAqLwogRU5UUlkoX19jcHVfc2V0dXApCi0JLyoKLQkgKiBQcmVzZXJ2ZSB0aGUgbGluayByZWdpc3RlciBhY3Jvc3MgdGhlIGZ1bmN0aW9uIGNhbGwuCi0JICovCi0JbW92CXgyOCwgbHIKLQlibAlfX2ZsdXNoX2RjYWNoZV9hbGwKLQltb3YJbHIsIHgyOAogCWljCWlhbGx1CQkJCS8vIEkrQlRCIGNhY2hlIGludmFsaWRhdGUKIAl0bGJpCXZtYWxsZTFpcwkJCS8vIGludmFsaWRhdGUgSSArIEQgVExCcwogCWRzYglzeQpAQCAtMjE1LDggKzIwOSwxNCBAQAogCSAqIFNldC9wcmVwYXJlIFRDUiBhbmQgVFRCUi4gV2UgdXNlIDUxMkdCICgzOS1iaXQpIGFkZHJlc3MgcmFuZ2UgZm9yCiAJICogYm90aCB1c2VyIGFuZCBrZXJuZWwuCiAJICovCi0JbGRyCXgxMCwgPVRDUl9UeFNaKFZBX0JJVFMpIHwgVENSX0ZMQUdTIHwgVENSX0lQU180MEJJVCB8IFwKKwlsZHIJeDEwLCA9VENSX1R4U1ooVkFfQklUUykgfCBUQ1JfRkxBR1MgfCBcCiAJCSAgICAgIFRDUl9BU0lEMTYgfCBUQ1JfVEJJMCB8ICgxIDw8IDMxKQorCS8qCisJICogUmVhZCB0aGUgUEFSYW5nZSBiaXRzIGZyb20gSURfQUE2NE1NRlIwX0VMMSBhbmQgc2V0IHRoZSBJUFMgYml0cyBpbgorCSAqIFRDUl9FTDEuCisJICovCisJbXJzCXg5LCBJRF9BQTY0TU1GUjBfRUwxCisJYmZpCXgxMCwgeDksICMzMiwgIzMKICNpZmRlZiBDT05GSUdfQVJNNjRfNjRLX1BBR0VTCiAJb3JyCXgxMCwgeDEwLCBUQ1JfVEcwXzY0SwogCW9ycgl4MTAsIHgxMCwgVENSX1RHMV82NEsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL01ha2VmaWxlCmluZGV4IDc5YzA3NmUuLmM3NDBhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9NYWtlZmlsZQpAQCAtMSArMSBAQAotb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vIGZyYW0ubworb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL2ZyYW0uYyBiL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvZnJhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ2NmE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvZnJhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIEZSQU0gZHJpdmVyIGZvciBNSU1DMjAwIGJvYXJkCi0gKgotICogQ29weXJpZ2h0IDIwMDggTWFyayBKYWNrc29uIDxtcGZqQG1pbWMuY28udWs+Ci0gKgotICogVGhpcyBtb2R1bGUgYWRkcyAqdmVyeSogc2ltcGx5IHN1cHBvcnQgZm9yIHRoZSBzeXN0ZW0ncyBGUkFNIGRldmljZS4KLSAqIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgaGFyZC1jb2RlZCB0byB0aGUgTUlNQzIwMCBwbGF0Zm9ybSwgYW5kIG9ubHkKLSAqIHN1cHBvcnRzIG1tYXAoKS4KLSAqLwotCi0jZGVmaW5lIEZSQU1fVkVSU0lPTgkiMS4wIgotCi0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNkZWZpbmUgRlJBTV9CQVNFCTB4YWMwMDAwMDAKLSNkZWZpbmUgRlJBTV9TSVpFCTB4MjAwMDAKLQotLyoKLSAqIFRoZSBhcmUgdGhlIGZpbGUgb3BlcmF0aW9uIGZ1bmN0aW9uIGZvciB1c2VyIGFjY2VzcyB0byAvZGV2L2ZyYW0KLSAqLwotCi1zdGF0aWMgaW50IGZyYW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsCi0JCXZtYS0+dm1fc3RhcnQsCi0JCXZpcnRfdG9fcGh5cygodm9pZCAqKSgodW5zaWduZWQgbG9uZylGUkFNX0JBU0UpKSA+PiBQQUdFX1NISUZULAotCQl2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0LAotCQlQQUdFX1NIQVJFRCk7Ci0KLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyYW1fZm9wcyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5tbWFwCQkJPSBmcmFtX21tYXAsCi0JLmxsc2VlawkJCT0gbm9vcF9sbHNlZWssCi19OwotCi0jZGVmaW5lIEZSQU1fTUlOT1IJMAotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZnJhbV9kZXYgPSB7Ci0JRlJBTV9NSU5PUiwKLQkiZnJhbSIsCi0JJmZyYW1fZm9wcwotfTsKLQotc3RhdGljIGludCBfX2luaXQKLWZyYW1faW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZmcmFtX2Rldik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImZyYW06IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCi0JCSAgICBGUkFNX01JTk9SKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRlJBTSBtZW1vcnkgZHJpdmVyIHYiIEZSQU1fVkVSU0lPTiAiXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1mcmFtX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZmcmFtX2Rldik7Ci19Ci0KLW1vZHVsZV9pbml0KGZyYW1faW5pdCk7Ci1tb2R1bGVfZXhpdChmcmFtX2NsZWFudXBfbW9kdWxlKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1NT0RVTEVfQUxJQVNfTUlTQ0RFVihGUkFNX01JTk9SKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYzdjNjRhNi4uMDBhMGYzYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsMjIgKzEsMjMgQEAKIAotZ2VuZXJpYy15CSs9IGNsa2Rldi5oCi1nZW5lcmljLXkgICAgICAgKz0gY3B1dGltZS5oCi1nZW5lcmljLXkgICAgICAgKz0gZGVsYXkuaAotZ2VuZXJpYy15ICAgICAgICs9IGRldmljZS5oCi1nZW5lcmljLXkgICAgICAgKz0gZGl2NjQuaAotZ2VuZXJpYy15ICAgICAgICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKLWdlbmVyaWMteQkrPSBleGVjLmgKLWdlbmVyaWMteSAgICAgICArPSBmdXRleC5oCi1nZW5lcmljLXkJKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgICAgICAgKz0gaXJxX3JlZ3MuaAotZ2VuZXJpYy15CSs9IHBhcmFtLmgKLWdlbmVyaWMteSAgICAgICArPSBsb2NhbC5oCi1nZW5lcmljLXkgICAgICAgKz0gbG9jYWw2NC5oCi1nZW5lcmljLXkgICAgICAgKz0gcGVyY3B1LmgKLWdlbmVyaWMteSAgICAgICArPSBzY2F0dGVybGlzdC5oCi1nZW5lcmljLXkgICAgICAgKz0gc2VjdGlvbnMuaAotZ2VuZXJpYy15ICAgICAgICs9IHRvcG9sb2d5LmgKLWdlbmVyaWMteQkrPSB0cmFjZV9jbG9jay5oCitnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKK2dlbmVyaWMteSArPSBkZWxheS5oCitnZW5lcmljLXkgKz0gZGV2aWNlLmgKK2dlbmVyaWMteSArPSBkaXY2NC5oCitnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAorZ2VuZXJpYy15ICs9IGV4ZWMuaAorZ2VuZXJpYy15ICs9IGZ1dGV4LmgKK2dlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gcGFyYW0uaAorZ2VuZXJpYy15ICs9IHBlcmNwdS5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAorZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKK2dlbmVyaWMteSArPSB0b3BvbG9neS5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHZnYS5oCi1nZW5lcmljLXkgICAgICAgKz0geG9yLmgKLWdlbmVyaWMteQkrPSBoYXNoLmgKK2dlbmVyaWMteSArPSB4b3IuaApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9idWdzLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J1Z3MuaAppbmRleCA3NjM1ZTc3Li4yNzg2NjFiIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J1Z3MuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J1Z3MuaApAQCAtOSw3ICs5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2J1Z3Modm9pZCkKIHsKLQljcHVfZGF0YS0+bG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OworCWJvb3RfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OwogfQogCiAjZW5kaWYgLyogX19BU01fQVZSMzJfQlVHU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA0OGQ3MWM1Li45NzJhZGNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTgzLDEzICs4Myw4IEBACiAKIGV4dGVybiBzdHJ1Y3QgYXZyMzJfY3B1aW5mbyBib290X2NwdV9kYXRhOwogCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIHN0cnVjdCBhdnIzMl9jcHVpbmZvIGNwdV9kYXRhW107Ci0jZGVmaW5lIGN1cnJlbnRfY3B1X2RhdGEgY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXQotI2Vsc2UKLSNkZWZpbmUgY3B1X2RhdGEgKCZib290X2NwdV9kYXRhKQorLyogTm8gU01QIHN1cHBvcnQgc28gZmFyICovCiAjZGVmaW5lIGN1cnJlbnRfY3B1X2RhdGEgYm9vdF9jcHVfZGF0YQotI2VuZGlmCiAKIC8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KICAqIHNwYWNlIGR1cmluZyBtbWFwJ3MKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKaW5kZXggMjIzM2JlNy4uMDM0MWFlMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKQEAgLTM5LDEwICszOSwxMiBAQAogCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgKmVuZHA7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZiB8fCB2YWwgPiAweDNmKQorCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsID4gMHgzZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdmFsID0gKHZhbCA8PCAxMikgfCAoc3lzcmVnX3JlYWQoUENDUikgJiAweGZmZmMwZmZmKTsKIAlzeXNyZWdfd3JpdGUoUENDUiwgdmFsKTsKQEAgLTYxLDExICs2MywxMSBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgKmVuZHA7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCXN5c3JlZ193cml0ZShQQ05UMCwgdmFsKTsKIAogCXJldHVybiBjb3VudDsKQEAgLTg0LDEwICs4NiwxMiBAQAogCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgKmVuZHA7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZiB8fCB2YWwgPiAweDNmKQorCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsID4gMHgzZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdmFsID0gKHZhbCA8PCAxOCkgfCAoc3lzcmVnX3JlYWQoUENDUikgJiAweGZmMDNmZmZmKTsKIAlzeXNyZWdfd3JpdGUoUENDUiwgdmFsKTsKQEAgLTEwNiwxMSArMTEwLDExIEBACiAJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciAqZW5kcDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJc3lzcmVnX3dyaXRlKFBDTlQxLCB2YWwpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMTI5LDExICsxMzMsMTEgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyICplbmRwOworCWludCByZXQ7CiAKLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAlzeXNyZWdfd3JpdGUoUENDTlQsIHZhbCk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xNTIsMTEgKzE1NiwxMSBAQAogCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgcGNjciwgdmFsOwotCWNoYXIgKmVuZHA7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCWlmICh2YWwpCiAJCXZhbCA9IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vY2FjaGUuYyBiL2FyY2gvYXZyMzIvbW0vY2FjaGUuYwppbmRleCA2YTQ2ZWNkLi44NWQ2MzVjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21tL2NhY2hlLmMKKysrIGIvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCkBAIC0xMTEsNiArMTExLDcgQEAKIAlfX2ZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCAmIH4obGluZXN6IC0gMSksCiAJCQkgICAgIChlbmQgKyBsaW5lc3ogLSAxKSAmIH4obGluZXN6IC0gMSkpOwogfQorRVhQT1JUX1NZTUJPTChmbHVzaF9pY2FjaGVfcmFuZ2UpOwogCiAvKgogICogVGhpcyBvbmUgaXMgY2FsbGVkIGZyb20gX19kb19mYXVsdCgpIGFuZCBkb19zd2FwX3BhZ2UoKS4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMzU5ZDM2Zi4uMGQ5M2I5YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEwLDYgKzEwLDcgQEAKIGdlbmVyaWMteSArPSBlcnJuby5oCiBnZW5lcmljLXkgKz0gZmIuaAogZ2VuZXJpYy15ICs9IGZ1dGV4LmgKK2dlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpcGNidWYuaApAQCAtMTcsMTQgKzE4LDE2IEBACiBnZW5lcmljLXkgKz0ga2RlYnVnLmgKIGdlbmVyaWMteSArPSBrbWFwX3R5cGVzLmgKIGdlbmVyaWMteSArPSBrdm1fcGFyYS5oCi1nZW5lcmljLXkgKz0gbG9jYWw2NC5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbW1hbi5oCiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBtdXRleC5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCiBnZW5lcmljLXkgKz0gcGdhbGxvYy5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZW1idWYuaApAQCAtNDQsNSArNDcsMyBAQAogZ2VuZXJpYy15ICs9IHVuYWxpZ25lZC5oCiBnZW5lcmljLXkgKz0gdXNlci5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IDJmZDA0ZjEuLjg5ZGU1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMjAsMTUgKzIwLDYgQEAKIC8qIFNZU19JUlFTIGFuZCBOUl9JUlFTIGFyZSBkZWZpbmVkIGluIDxtYWNoLWJmNXh4L2lycS5oPiAqLwogI2luY2x1ZGUgPG1hY2gvaXJxLmg+CiAKLS8qCi0gKiBwbSBzYXZlIGJmaW4gcGludCByZWdpc3RlcnMKLSAqLwotc3RydWN0IGFkaV9wbV9waW50X3NhdmUgewotCXUzMiBhc3NpZ247Ci0JdTMyIGVkZ2Vfc2V0OwotCXUzMiBpbnZlcnRfc2V0OwotfTsKLQogI2lmIEFOT01BTFlfMDUwMDAyNDQgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCiAjIGRlZmluZSBOT1BfUEFEX0FOT01BTFlfMDUwMDAyNDQgIm5vcDsgbm9wOyIKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2M2eC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2M2eC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggZDczYmI4NS4uOGRiZGNlOCAxMDA2NDQKLS0tIGEvYXJjaC9jNngvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYzZ4L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTUsNiArMTUsNyBAQAogZ2VuZXJpYy15ICs9IGZiLmgKIGdlbmVyaWMteSArPSBmY250bC5oCiBnZW5lcmljLXkgKz0gZnV0ZXguaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGh3X2lycS5oCiBnZW5lcmljLXkgKz0gaW8uaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKQEAgLTI0LDYgKzI1LDcgQEAKIGdlbmVyaWMteSArPSBrZGVidWcuaAogZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1tYW4uaAogZ2VuZXJpYy15ICs9IG1tdS5oCiBnZW5lcmljLXkgKz0gbW11X2NvbnRleHQuaApAQCAtMzQsNiArMzYsNyBAQAogZ2VuZXJpYy15ICs9IHBnYWxsb2MuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlZ21lbnQuaApAQCAtNTYsNSArNTksMyBAQAogZ2VuZXJpYy15ICs9IHVzZXIuaAogZ2VuZXJpYy15ICs9IHZnYS5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGYzZmQ4NzYuLmFmZmY1MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtNSwxMiArNSwxNCBAQAogCiBnZW5lcmljLXkgKz0gYmFycmllci5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBrdm1fcGFyYS5oCiBnZW5lcmljLXkgKz0gbGlua2FnZS5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtb2R1bGUuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKIGdlbmVyaWMteSArPSB2Z2EuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NmE2NS4uMDAwMDAwMAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fQ1JJU19DUFVUSU1FX0gKLSNkZWZpbmUgX19DUklTX0NQVVRJTUVfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgotCi0jZW5kaWYgLyogX19DUklTX0NQVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGJjNDJmMTQuLjg3Yjk1ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNiArMSw4IEBACiAKIGdlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGV4ZWMuaAotZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjMzczYS4uMDAwMDAwMAotLS0gYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9DUFVUSU1FX0gKLSNkZWZpbmUgX0FTTV9DUFVUSU1FX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KLQotI2VuZGlmIC8qIF9BU01fQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5jIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYwppbmRleCBjMjgxMjE3Li42N2IxZDE2IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5jCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmMKQEAgLTg4LDcgKzg4LDcgQEAKIAogCS8qIERlcHRoLUZpcnN0IFNlYXJjaCBvbiBidXMgdHJlZSAqLwogCWZvciAobG49YnVzX2xpc3QtPm5leHQ7IGxuICE9IGJ1c19saXN0OyBsbj1sbi0+bmV4dCkgewotCQlidXMgPSBwY2lfYnVzX2IobG4pOworCQlidXMgPSBsaXN0X2VudHJ5KGxuLCBzdHJ1Y3QgcGNpX2J1cywgbm9kZSk7CiAJCWlmICgoZGV2ID0gYnVzLT5zZWxmKSkgewogCQkJZm9yIChpZHggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsgaWR4IDwgUENJX05VTV9SRVNPVVJDRVM7IGlkeCsrKSB7CiAJCQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAzOGNhNDVkLi5lYWRjYzExIDEwMDY0NAotLS0gYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTI1LDE0ICsyNSwxNiBAQAogZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKIGdlbmVyaWMteSArPSBrZGVidWcuaAogZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAotZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1tYW4uaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCiBnZW5lcmljLXkgKz0gcGNpLmgKIGdlbmVyaWMteSArPSBwZXJjcHUuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gcndzZW0uaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKQEAgLTQ1LDggKzQ3LDggQEAKIGdlbmVyaWMteSArPSBzaXplcy5oCiBnZW5lcmljLXkgKz0gc29ja2V0LmgKIGdlbmVyaWMteSArPSBzb2NraW9zLmgKLWdlbmVyaWMteSArPSBzdGF0ZnMuaAogZ2VuZXJpYy15ICs9IHN0YXQuaAorZ2VuZXJpYy15ICs9IHN0YXRmcy5oCiBnZW5lcmljLXkgKz0gdGVybWJpdHMuaAogZ2VuZXJpYy15ICs9IHRlcm1pb3MuaAogZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKQEAgLTU1LDQgKzU3LDMgQEAKIGdlbmVyaWMteSArPSB1Y29udGV4dC5oCiBnZW5lcmljLXkgKz0gdW5hbGlnbmVkLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2VuZXJpY19kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZwppbmRleCBmNGEwZGFhLi5iNGVmYWYyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZwpAQCAtMjksOSArMjksOSBAQAogQ09ORklHX0FDUElfRkFOPW0KIENPTkZJR19BQ1BJX0RPQ0s9eQogQ09ORklHX0FDUElfUFJPQ0VTU09SPW0KLUNPTkZJR19BQ1BJX0NPTlRBSU5FUj1tCitDT05GSUdfQUNQSV9DT05UQUlORVI9eQogQ09ORklHX0hPVFBMVUdfUENJPXkKLUNPTkZJR19IT1RQTFVHX1BDSV9BQ1BJPW0KK0NPTkZJR19IT1RQTFVHX1BDSV9BQ1BJPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQogQ09ORklHX0lORVQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKaW5kZXggOGU4NThiNS4uMWE4NzFiNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYworKysgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCkBAIC0xMTQwLDExICsxMTQwLDEzIEBACiAKICNpZmRlZiBDT05GSUdfTlVNQQogCXsKKwkJaW50IG5vZGUgPSBpb2MtPm5vZGU7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwotCQlwYWdlID0gYWxsb2NfcGFnZXNfZXhhY3Rfbm9kZShpb2MtPm5vZGUgPT0gTUFYX05VTU5PREVTID8KLQkJICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9ub2RlX2lkKCkgOiBpb2MtPm5vZGUsIGZsYWdzLAotCQkgICAgICAgICAgICAgICAgICAgICAgICBnZXRfb3JkZXIoc2l6ZSkpOwogCisJCWlmIChub2RlID09IE5VTUFfTk9fTk9ERSkKKwkJCW5vZGUgPSBudW1hX25vZGVfaWQoKTsKKworCQlwYWdlID0gYWxsb2NfcGFnZXNfZXhhY3Rfbm9kZShub2RlLCBmbGFncywgZ2V0X29yZGVyKHNpemUpKTsKIAkJaWYgKHVubGlrZWx5KCFwYWdlKSkKIAkJCXJldHVybiBOVUxMOwogCkBAIC0xNTk2LDcgKzE1OTgsNyBAQAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQKK3N0YXRpYyB2b2lkCiBpb2NfaW92YV9pbml0KHN0cnVjdCBpb2MgKmlvYykKIHsKIAlpbnQgdGNuZmc7CkBAIC0xODA3LDcgKzE4MDksNyBAQAogCXsgU1gyMDAwX0lPQ19JRCwgInN4MjAwMCIsIE5VTEwgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW9jICogX19pbml0CitzdGF0aWMgc3RydWN0IGlvYyAqCiBpb2NfaW5pdCh1bnNpZ25lZCBsb25nIGhwYSwgdm9pZCAqaGFuZGxlKQogewogCXN0cnVjdCBpb2MgKmlvYzsKQEAgLTE5MTQsNyArMTkxNiw3IEBACiAJc2VxX3ByaW50ZihzLCAiSGV3bGV0dCBQYWNrYXJkICVzIElPQyByZXYgJWQuJWRcbiIsCiAJCWlvYy0+bmFtZSwgKChpb2MtPnJldiA+PiA0KSAmIDB4RiksIChpb2MtPnJldiAmIDB4RikpOwogI2lmZGVmIENPTkZJR19OVU1BCi0JaWYgKGlvYy0+bm9kZSAhPSBNQVhfTlVNTk9ERVMpCisJaWYgKGlvYy0+bm9kZSAhPSBOVU1BX05PX05PREUpCiAJCXNlcV9wcmludGYocywgIk5VTUEgbm9kZSAgICAgICA6ICVkXG4iLCBpb2MtPm5vZGUpOwogI2VuZGlmCiAJc2VxX3ByaW50ZihzLCAiSU9WQSBzaXplICAgICAgIDogJWxkIE1CXG4iLCAoKGlvYy0+cGRpcl9zaXplID4+IDMpICogaW92cF9zaXplKS8oMTAyNCoxMDI0KSk7CkBAIC0yMDE1LDMzICsyMDE3LDIxIEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gSU9DIGZvciBQQ0kgQnVzICUwNHg6JTAyeCBpbiBBQ1BJXG4iLCBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyKTsKIH0KIAotI2lmZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgdm9pZCBfX2luaXQKIHNiYV9tYXBfaW9jX3RvX25vZGUoc3RydWN0IGlvYyAqaW9jLCBhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CisjaWZkZWYgQ09ORklHX05VTUEKIAl1bnNpZ25lZCBpbnQgbm9kZTsKLQlpbnQgcHhtOwogCi0JaW9jLT5ub2RlID0gTUFYX05VTU5PREVTOwotCi0JcHhtID0gYWNwaV9nZXRfcHhtKGhhbmRsZSk7Ci0KLQlpZiAocHhtIDwgMCkKLQkJcmV0dXJuOwotCi0Jbm9kZSA9IHB4bV90b19ub2RlKHB4bSk7Ci0KLQlpZiAobm9kZSA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5vZGUpKQotCQlyZXR1cm47CisJbm9kZSA9IGFjcGlfZ2V0X25vZGUoaGFuZGxlKTsKKwlpZiAobm9kZSAhPSBOVU1BX05PX05PREUgJiYgIW5vZGVfb25saW5lKG5vZGUpKQorCQlub2RlID0gTlVNQV9OT19OT0RFOwogCiAJaW9jLT5ub2RlID0gbm9kZTsKLQlyZXR1cm47Ci19Ci0jZWxzZQotI2RlZmluZSBzYmFfbWFwX2lvY190b19ub2RlKGlvYywgaGFuZGxlKQogI2VuZGlmCit9CiAKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50CiBhY3BpX3NiYV9pb2NfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAogCQkgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICpub3RfdXNlZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDI4M2E4MzEuLjBkYTRhYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw4ICsxLDkgQEAKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCi1nZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAotZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSB2dGltZS5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAorZ2VuZXJpYy15ICs9IHZ0aW1lLmgKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCA3MWZiYWFhLi43ZDQxY2MwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BjaS5oCkBAIC05OCw3ICs5OCw3IEBACiAJc3RydWN0IGFjcGlfZGV2aWNlICpjb21wYW5pb247CiAJdm9pZCAqaW9tbXU7CiAJaW50IHNlZ21lbnQ7Ci0JaW50IG5vZGU7CQkvKiBuZWFyZXN0IG5vZGUgd2l0aCBtZW1vcnkgb3IgLTEgZm9yIGdsb2JhbCBhbGxvY2F0aW9uICovCisJaW50IG5vZGU7CQkvKiBuZWFyZXN0IG5vZGUgd2l0aCBtZW1vcnkgb3IgTlVNQV9OT19OT0RFIGZvciBnbG9iYWwgYWxsb2NhdGlvbiAqLwogCiAJdm9pZCAqcGxhdGZvcm1fZGF0YTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IGEyNDk2ZTQuLjVjYjU1YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC03Nyw3ICs3Nyw2IEBACiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJCShjcHVfZGF0YShjcHUpLT5jb3JlX2lkKQogI2RlZmluZSB0b3BvbG9neV9jb3JlX2NwdW1hc2soY3B1KQkJKCZjcHVfY29yZV9tYXBbY3B1XSkKICNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KQkJKCZwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSkKLSNkZWZpbmUgc210X2NhcGFibGUoKSAJCQkJKHNtcF9udW1fc2libGluZ3MgPiAxKQogI2VuZGlmCiAKIGV4dGVybiB2b2lkIGFyY2hfZml4X3BoeXNfcGFja2FnZV9pZChpbnQgbnVtLCB1MzIgc2xvdCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDQ2NzQ5N2EuLjBkNDA3YjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC03OTksMTQgKzc5OSw5IEBACiAgKiAgQUNQSSBiYXNlZCBob3RwbHVnIENQVSBzdXBwb3J0CiAgKi8KICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQotc3RhdGljCi1pbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKQorc3RhdGljIGludCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCWludCBweG1faWQ7Ci0JaW50IG5pZDsKLQotCXB4bV9pZCA9IGFjcGlfZ2V0X3B4bShoYW5kbGUpOwogCS8qCiAJICogV2UgZG9uJ3QgaGF2ZSBjcHUtb25seS1ub2RlIGhvdGFkZC4gQnV0IGlmIHRoZSBzeXN0ZW0gZXF1aXBzCiAJICogU1JBVCB0YWJsZSwgcHhtIGlzIGFscmVhZHkgZm91bmQgYW5kIG5vZGUgaXMgcmVhZHkuCkBAIC04MTQsMTEgKzgwOSwxMCBAQAogCSAqIFRoaXMgY29kZSBoZXJlIGlzIGZvciB0aGUgc3lzdGVtIHdoaWNoIGRvZXNuJ3QgaGF2ZSBmdWxsIFNSQVQKICAgCSAqIHRhYmxlIGZvciBwb3NzaWJsZSBjcHVzLgogCSAqLwotCW5pZCA9IGFjcGlfbWFwX3B4bV90b19ub2RlKHB4bV9pZCk7CiAJbm9kZV9jcHVpZFtjcHVdLnBoeXNfaWQgPSBwaHlzaWQ7Ci0Jbm9kZV9jcHVpZFtjcHVdLm5pZCA9IG5pZDsKKwlub2RlX2NwdWlkW2NwdV0ubmlkID0gYWNwaV9nZXRfbm9kZShoYW5kbGUpOwogI2VuZGlmCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IGFkZGl0aW9uYWxfY3B1cyBfX2luaXRkYXRhID0gLTE7CkBAIC05MjUsNyArOTE5LDcgQEAKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwogCXN0cnVjdCBhY3BpX21hZHRfaW9fc2FwaWMgKmlvc2FwaWM7CiAJdW5zaWduZWQgaW50IGdzaV9iYXNlOwotCWludCBweG0sIG5vZGU7CisJaW50IG5vZGU7CiAKIAkvKiBPbmx5IGNhcmUgYWJvdXQgb2JqZWN0cyB3LyBhIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIE1BRFQgKi8KIAlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9NQVQiLCBOVUxMLCAmYnVmZmVyKSkpCkBAIC05NTIsMTcgKzk0Niw5IEBACiAKIAlrZnJlZShidWZmZXIucG9pbnRlcik7CiAKLQkvKgotCSAqIE9LLCBpdCdzIGFuIElPU0FQSUMgTUFEVCBlbnRyeSwgbG9vayBmb3IgYSBfUFhNIHZhbHVlIHRvIHRlbGwKLQkgKiB1cyB3aGljaCBub2RlIHRvIGFzc29jaWF0ZSB0aGlzIHdpdGguCi0JICovCi0JcHhtID0gYWNwaV9nZXRfcHhtKGhhbmRsZSk7Ci0JaWYgKHB4bSA8IDApCi0JCXJldHVybiBBRV9PSzsKLQotCW5vZGUgPSBweG1fdG9fbm9kZShweG0pOwotCi0JaWYgKG5vZGUgPj0gTUFYX05VTU5PREVTIHx8ICFub2RlX29ubGluZShub2RlKSB8fAorCS8qIE9LLCBpdCdzIGFuIElPU0FQSUMgTUFEVCBlbnRyeTsgYXNzb2NpYXRlIGl0IHdpdGggYSBub2RlICovCisJbm9kZSA9IGFjcGlfZ2V0X25vZGUoaGFuZGxlKTsKKwlpZiAobm9kZSA9PSBOVU1BX05PX05PREUgfHwgIW5vZGVfb25saW5lKG5vZGUpIHx8CiAJICAgIGNwdW1hc2tfZW1wdHkoY3B1bWFza19vZl9ub2RlKG5vZGUpKSkKIAkJcmV0dXJuIEFFX09LOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwppbmRleCBkYTViNDYyLi43NDFiOTljIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKQEAgLTQ3Nyw2ICs0NzcsOSBAQAogCWNoYXIgKmNwLCB2ZW5kb3JbMTAwXSA9ICJ1bmtub3duIjsKIAlpbnQgaTsKIAorCXNldF9iaXQoRUZJX0JPT1QsICZlZmkuZmxhZ3MpOworCXNldF9iaXQoRUZJXzY0QklULCAmZWZpLmZsYWdzKTsKKwogCS8qCiAJICogSXQncyB0b28gZWFybHkgdG8gYmUgYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGtlcm5lbCBjb21tYW5kIGxpbmUKIAkgKiBzdXBwb3J0Li4uCkBAIC01MjksNiArNTMyLDggQEAKIAkgICAgICAgZWZpLnN5c3RhYi0+aGRyLnJldmlzaW9uID4+IDE2LAogCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gJiAweGZmZmYsIHZlbmRvcik7CiAKKwlzZXRfYml0KEVGSV9TWVNURU1fVEFCTEVTLCAmZWZpLmZsYWdzKTsKKwogCXBhbG9fcGh5cyAgICAgID0gRUZJX0lOVkFMSURfVEFCTEVfQUREUjsKIAogCWlmIChlZmlfY29uZmlnX2luaXQoYXJjaF90YWJsZXMpICE9IDApCkBAIC02NTcsNiArNjYyLDggQEAKIAkJcmV0dXJuOwogCX0KIAorCXNldF9iaXQoRUZJX1JVTlRJTUVfU0VSVklDRVMsICZlZmkuZmxhZ3MpOworCiAJLyoKIAkgKiBOb3cgdGhhdCBFRkkgaXMgaW4gdmlydHVhbCBtb2RlLCB3ZSBjYWxsIHRoZSBFRkkgZnVuY3Rpb25zIG1vcmUKIAkgKiBlZmZpY2llbnRseToKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwppbmRleCAxMDM0ODg0Li4wODg0ZjVlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCkBAIC0zNjQsNyArMzY0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX21vdmVfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0Jc21wX2lycV9tb3ZlX2NsZWFudXBfaW50ZXJydXB0LAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJImlycV9tb3ZlIgogfTsKIApAQCAtNDg5LDE0ICs0ODgsMTMgQEAKIAlpYTY0X3NybHpfZCgpOwogCXdoaWxlICh2ZWN0b3IgIT0gSUE2NF9TUFVSSU9VU19JTlRfVkVDVE9SKSB7CiAJCWludCBpcnEgPSBsb2NhbF92ZWN0b3JfdG9faXJxKHZlY3Rvcik7Ci0JCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAKIAkJaWYgKHVubGlrZWx5KElTX0xPQ0FMX1RMQl9GTFVTSCh2ZWN0b3IpKSkgewogCQkJc21wX2xvY2FsX2ZsdXNoX3RsYigpOwotCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CisJCQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCQl9IGVsc2UgaWYgKHVubGlrZWx5KElTX1JFU0NIRURVTEUodmVjdG9yKSkpIHsKIAkJCXNjaGVkdWxlcl9pcGkoKTsKLQkJCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGRlc2MpOworCQkJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAkJfSBlbHNlIHsKIAkJCWlhNjRfc2V0cmVnKF9JQTY0X1JFR19DUl9UUFIsIHZlY3Rvcik7CiAJCQlpYTY0X3NybHpfZCgpOwpAQCAtNTQ5LDEzICs1NDcsMTIgQEAKIAkgICovCiAJd2hpbGUgKHZlY3RvciAhPSBJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IpIHsKIAkJaW50IGlycSA9IGxvY2FsX3ZlY3Rvcl90b19pcnEodmVjdG9yKTsKLQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAogCQlpZiAodW5saWtlbHkoSVNfTE9DQUxfVExCX0ZMVVNIKHZlY3RvcikpKSB7CiAJCQlzbXBfbG9jYWxfZmx1c2hfdGxiKCk7Ci0JCQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBkZXNjKTsKKwkJCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJCX0gZWxzZSBpZiAodW5saWtlbHkoSVNfUkVTQ0hFRFVMRSh2ZWN0b3IpKSkgewotCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CisJCQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKE5VTEwpOwogCkBAIC02MDIsNyArNTk5LDYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXBpX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWhhbmRsZV9JUEksCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiSVBJIgogfTsKIApAQCAtNjExLDEzICs2MDcsMTEgQEAKICAqLwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcmVzY2hlZF9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlkdW1teV9oYW5kbGVyLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJInJlc2NoZWQiCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0bGJfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JZHVtbXlfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJ0bGJfZmx1c2giCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwppbmRleCBiOGVkZmE3Li5kYjdiMzZiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCS8qIENvcHkgdGhlIG91dHB1dCBpbnRvIG1sb2didWYgKi8KIAlpZiAob29wc19pbl9wcm9ncmVzcykgewogCQkvKiBtbG9nYnVmIHdhcyBhYmFuZG9uZWQsIHVzZSBwcmludGsgZGlyZWN0bHkgaW5zdGVhZC4gKi8KLQkJcHJpbnRrKHRlbXBfYnVmKTsKKwkJcHJpbnRrKCIlcyIsIHRlbXBfYnVmKTsKIAl9IGVsc2UgewogCQlzcGluX2xvY2soJm1sb2didWZfd2xvY2spOwogCQlmb3IgKHAgPSB0ZW1wX2J1ZjsgKnA7IHArKykgewpAQCAtMjY4LDcgKzI2OCw3IEBACiAJCX0KIAkJKnAgPSAnXDAnOwogCQlpZiAodGVtcF9idWZbMF0pCi0JCQlwcmludGsodGVtcF9idWYpOworCQkJcHJpbnRrKCIlcyIsIHRlbXBfYnVmKTsKIAkJbWxvZ2J1Zl9zdGFydCA9IGluZGV4OwogCiAJCW1sb2didWZfdGltZXN0YW1wID0gMDsKQEAgLTE3NzIsMzggKzE3NzIsMzIgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY21jaV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jbWNfaW50X2hhbmRsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiY21jX2huZGxyIgogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY21jcF9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jbWNfaW50X2NhbGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJjbWNfcG9sbCIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jYV9yZHp2X2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX3JlbmRlel9pbnRfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJtY2FfcmR6diIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jYV93a3VwX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX3dha2V1cF9pbnRfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJtY2Ffd2t1cCIKIH07CiAKICNpZmRlZiBDT05GSUdfQUNQSQogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWNhX2NwZV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jcGVfaW50X2hhbmRsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiY3BlX2huZGxyIgogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWNhX2NwZXBfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JaWE2NF9tY2FfY3BlX2ludF9jYWxsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiY3BlX3BvbGwiCiB9OwogI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMKaW5kZXggZmIyZjFlNi4uYzQzMGY5MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tc2lfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYwpAQCAtMTcsMTIgKzE3LDkgQEAKIHsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJdTMyIGFkZHIsIGRhdGE7Ci0JaW50IGNwdSA9IGZpcnN0X2NwdSgqY3B1X21hc2spOworCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0X2FuZChjcHVfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAl1bnNpZ25lZCBpbnQgaXJxID0gaWRhdGEtPmlycTsKIAotCWlmICghY3B1X29ubGluZShjcHUpKQotCQlyZXR1cm4gLTE7Ci0KIAlpZiAoaXJxX3ByZXBhcmVfbW92ZShpcnEsIGNwdSkpCiAJCXJldHVybiAtMTsKIApAQCAtMTM5LDEwICsxMzYsNyBAQAogCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycV9jZmcgKyBpcnE7CiAJc3RydWN0IG1zaV9tc2cgbXNnOwotCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOwotCi0JaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiAtMTsKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAogCWlmIChpcnFfcHJlcGFyZV9tb3ZlKGlycSwgY3B1KSkKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCBjYjU5Mjc3Li5kODQxYzRiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtNjM4Nyw3ICs2Mzg3LDYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcGVyZm1vbl9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPSBwZm1faW50ZXJydXB0X2hhbmRsZXIsCi0JLmZsYWdzICAgPSBJUlFGX0RJU0FCTEVELAogCS5uYW1lICAgID0gInBlcmZtb24iCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCmluZGV4IGZiYWFjMWEuLjcxYzUyYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCkBAIC0zODAsNyArMzgwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdGltZXJfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JdGltZXJfaW50ZXJydXB0LAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQgfCBJUlFGX0lSUVBPTEwsCisJLmZsYWdzID0JSVJRRl9JUlFQT0xMLAogCS5uYW1lID0JCSJ0aW1lciIKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvZml4dXAuYyBiL2FyY2gvaWE2NC9wY2kvZml4dXAuYwppbmRleCA1ZGM5NjlkLi5lZWUwNjlhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL2ZpeHVwLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9maXh1cC5jCkBAIC01LDYgKzUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZnYWFyYi5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KIApAQCAtMTksOSArMjAsMTAgQEAKICAqIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgYm9vdCB2aWRlbwogICogY2FyZCB3aXRoIHRoaXMgY29weS4gT24gbGFwdG9wcyB0aGlzIGNvcHkgaGFzIHRvIGJlIHVzZWQgc2luY2UKICAqIHRoZSBtYWluIFJPTSBtYXkgYmUgY29tcHJlc3NlZCBvciBjb21iaW5lZCB3aXRoIGFub3RoZXIgaW1hZ2UuCi0gKiBTZWUgcGNpX21hcF9yb20oKSBmb3IgdXNlIG9mIHRoaXMgZmxhZy4gSU9SRVNPVVJDRV9ST01fU0hBRE9XCi0gKiBpcyBtYXJrZWQgaGVyZSBzaW5jZSB0aGUgYm9vdCB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB0aGUgb25seSBlbmFibGVkCi0gKiB2aWRlbyBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKyAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBCZWZvcmUgbWFya2luZyB0aGUgZGV2aWNlCisgKiB3aXRoIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBjaGVjayBpZiBhIHZnYV9kZWZhdWx0X2RldmljZSBpcyBhbHJlYWR5IHNldAorICogYnkgZWl0aGVyIGFyY2ggY2RlIG9yIHZnYS1hcmJpdHJhdGlvbiwgaWYgc28gb25seSBhcHBseSB0aGUgZml4dXAgdG8gdGhpcworICogYWxyZWFkeSBkZXRlcm1pbmVkIHByaW1hcnkgdmlkZW8gY2FyZC4KICAqLwogCiBzdGF0aWMgdm9pZCBwY2lfZml4dXBfdmlkZW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC0zNSw5ICszNyw2IEBACiAJCXJldHVybjsKIAkvKiBNYXliZSwgdGhpcyBtYWNoaW5lIHN1cHBvcnRzIGxlZ2FjeSBtZW1vcnkgbWFwLiAqLwogCi0JaWYgKChwZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EpCi0JCXJldHVybjsKLQogCS8qIElzIFZHQSByb3V0ZWQgdG8gdXM/ICovCiAJYnVzID0gcGRldi0+YnVzOwogCXdoaWxlIChidXMpIHsKQEAgLTYwLDEwICs1OSwxNCBAQAogCQl9CiAJCWJ1cyA9IGJ1cy0+cGFyZW50OwogCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbmZpZyk7Ci0JaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKLQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJCb290IHZpZGVvIGRldmljZVxuIik7CisJaWYgKCF2Z2FfZGVmYXVsdF9kZXZpY2UoKSB8fCBwZGV2ID09IHZnYV9kZWZhdWx0X2RldmljZSgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKKwkJaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKKwkJCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgIkJvb3QgdmlkZW8gZGV2aWNlXG4iKTsKKwkJCXZnYV9zZXRfZGVmYXVsdF9kZXZpY2UocGRldik7CisJCX0KIAl9CiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2ZpeHVwX3ZpZGVvKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0NMQVNTX0ZJTkFMKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJCQkJUENJX0NMQVNTX0RJU1BMQVlfVkdBLCA4LCBwY2lfZml4dXBfdmlkZW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggOWU0OTM4ZC4uMjkxYTU4MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9wY2kuYworKysgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCkBAIC0xMjYsNyArMTI2LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljb250cm9sbGVyLT5zZWdtZW50ID0gc2VnOwotCWNvbnRyb2xsZXItPm5vZGUgPSAtMTsKIAlyZXR1cm4gY29udHJvbGxlcjsKIH0KIApAQCAtNDMwLDE5ICs0MjksMTQgQEAKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IE5VTEw7CiAJaW50IGJ1c251bSA9IHJvb3QtPnNlY29uZGFyeS5zdGFydDsKIAlzdHJ1Y3QgcGNpX2J1cyAqcGJ1czsKLQlpbnQgcHhtLCByZXQ7CisJaW50IHJldDsKIAogCWNvbnRyb2xsZXIgPSBhbGxvY19wY2lfY29udHJvbGxlcihkb21haW4pOwogCWlmICghY29udHJvbGxlcikKIAkJcmV0dXJuIE5VTEw7CiAKIAljb250cm9sbGVyLT5jb21wYW5pb24gPSBkZXZpY2U7Ci0KLQlweG0gPSBhY3BpX2dldF9weG0oZGV2aWNlLT5oYW5kbGUpOwotI2lmZGVmIENPTkZJR19OVU1BCi0JaWYgKHB4bSA+PSAwKQotCQljb250cm9sbGVyLT5ub2RlID0gcHhtX3RvX25vZGUocHhtKTsKLSNlbmRpZgorCWNvbnRyb2xsZXItPm5vZGUgPSBhY3BpX2dldF9ub2RlKGRldmljZS0+aGFuZGxlKTsKIAogCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggNjJjZjRkZC4uODVkMDk1MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC0yMDksOCArMjA5LDggQEAKIAluYXNpZF90IG5hc2lkOwogCWludCBzbGljZTsKIAotCW5hc2lkID0gY3B1aWRfdG9fbmFzaWQoY3B1bWFza19maXJzdChtYXNrKSk7Ci0Jc2xpY2UgPSBjcHVpZF90b19zbGljZShjcHVtYXNrX2ZpcnN0KG1hc2spKTsKKwluYXNpZCA9IGNwdWlkX3RvX25hc2lkKGNwdW1hc2tfZmlyc3RfYW5kKG1hc2ssIGNwdV9vbmxpbmVfbWFzaykpOworCXNsaWNlID0gY3B1aWRfdG9fc2xpY2UoY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc25faXJxX2luZm8sIHNuX2lycV9pbmZvX3NhZmUsCiAJCQkJIHNuX2lycV9saFtpcnFdLCBsaXN0KQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKaW5kZXggMmI5OGI5ZS4uYWZjNThkMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKIAl1bnNpZ25lZCBpbnQgY3B1LCBpcnEgPSBkYXRhLT5pcnE7CiAKLQljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9tYXNrKTsKKwljcHUgPSBjcHVtYXNrX2ZpcnN0X2FuZChjcHVfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAlzbl9pcnFfaW5mbyA9IHNuX21zaV9pbmZvW2lycV0uc25faXJxX2luZm87CiAJaWYgKHNuX2lycV9pbmZvID09IE5VTEwgfHwgc25faXJxX2luZm8tPmlycV9pbnRfYml0ID49IDApCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDkzMjQzNWEuLjY3Nzc5YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw3ICsxLDkgQEAKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCi1nZW5lcmljLXkgKz0gbW9kdWxlLmgKLWdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBtb2R1bGUuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQ3NTUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19NMzJSX0NQVVRJTUVfSAotI2RlZmluZSBfX00zMlJfQ1BVVElNRV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+Ci0KLSNlbmRpZiAvKiBfX00zMlJfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IGRiZGQyMjMuLmIyZTMyMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0xNyw2ICsxNyw3IEBACiAJc2VsZWN0IEZQVSBpZiBNTVUKIAlzZWxlY3QgQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUIGlmIE1NVSAmJiAhQ09MREZJUkUKKwlzZWxlY3QgSEFWRV9GVVRFWF9DTVBYQ0hHIGlmIE1NVSAmJiBGVVRFWAogCXNlbGVjdCBIQVZFX01PRF9BUkNIX1NQRUNJRklDCiAJc2VsZWN0IE1PRFVMRVNfVVNFX0VMRl9SRUwKIAlzZWxlY3QgTU9EVUxFU19VU0VfRUxGX1JFTEEKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9jaWEuYyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwppbmRleCAxOGMwZTI5Li4yMDgxYjhjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMgYi9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCmluZGV4IDNlNzNhNjMuLjNkMmI2M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZwppbmRleCA1NTlmZjNhLi45NmRhNDk2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnCkBAIC0yNCw2ICsyNCw4IEBACiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDIwPXkKIENPTkZJR19NNjgwMzA9eQogQ09ORklHX002ODA0MD15CkBAIC04NSw2ICs4Nyw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtOTQsNiArOTcsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyNiw2ICsxMzEsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTYzLDggKzE2OSw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTkwLDcgKzE5NCw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC01MTIsNyArNTE1LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCmluZGV4IGNiMWY1NWQuLjFiODczOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZwpAQCAtMjUsNiArMjUsOCBAQAogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVjY4X1BBUlRJVElPTj15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODAyMD15CiBDT05GSUdfTTY4MDMwPXkKIENPTkZJR19NNjgwNDA9eQpAQCAtODMsNiArODUsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTkyLDYgKzk1LDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMjQsNiArMTI5LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE2MSw4ICsxNjcsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4OCw3ICsxOTIsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDcwLDcgKzQ3Myw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKaW5kZXggZTg4MGNmYi4uNmVhNGU5MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVjY4X1BBUlRJVElPTj15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODAyMD15CiBDT05GSUdfTTY4MDMwPXkKIENPTkZJR19NNjgwNDA9eQpAQCAtODIsNiArODQsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTkxLDYgKzk0LDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMjMsNiArMTI4LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE2MCw4ICsxNjYsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4Nyw3ICsxOTEsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDg3LDcgKzQ5MCw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKaW5kZXggNGFhNGY0NS4uZTVhMTI3MyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogQ09ORklHX1NVTl9QQVJUSVRJT049eQogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODA0MD15CiBDT05GSUdfTTY4MDYwPXkKIENPTkZJR19WTUU9eQpAQCAtODEsNiArODMsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTkwLDYgKzkzLDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMjIsNiArMTI3LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE1OSw4ICsxNjUsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4Niw3ICsxOTAsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDYzLDcgKzQ2Niw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKaW5kZXggN2NkOWQ5Zi4uODkzNmQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZwpAQCAtMjUsNiArMjUsOCBAQAogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVjY4X1BBUlRJVElPTj15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODAyMD15CiBDT05GSUdfTTY4MDMwPXkKIENPTkZJR19NNjgwNDA9eQpAQCAtODMsNiArODUsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTkyLDYgKzk1LDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMjQsNiArMTI5LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE2MSw4ICsxNjcsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4OCw3ICsxOTIsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDcyLDcgKzQ3NSw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZwppbmRleCAzMWY1YmQwLi5iZTUzNDJjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKQEAgLTI0LDYgKzI0LDggQEAKICMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX1NZU1Y2OF9QQVJUSVRJT049eQogQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19CT09USU5GT19QUk9DPXkKIENPTkZJR19NNjgwMjA9eQogQ09ORklHX002ODAzMD15CiBDT05GSUdfTTY4MDQwPXkKQEAgLTgyLDYgKzg0LDcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfVEFCTEVTPW0KK0NPTkZJR19ORl9UQUJMRVNfSU5FVD1tCiBDT05GSUdfTkZUX0VYVEhEUj1tCiBDT05GSUdfTkZUX01FVEE9bQogQ09ORklHX05GVF9DVD1tCkBAIC05MSw2ICs5NCw4IEBACiBDT05GSUdfTkZUX0xPRz1tCiBDT05GSUdfTkZUX0xJTUlUPW0KIENPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfUVVFVUU9bQorQ09ORklHX05GVF9SRUpFQ1Q9bQogQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMTIzLDYgKzEyOCw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0xNjAsOCArMTY2LDYgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQotQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkBAIC0xODcsNyArMTkxLDYgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KQEAgLTQ5NSw3ICs0OTgsNiBAQAogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19YWl9ERUNfWDg2PXkKIENPTkZJR19YWl9ERUNfUE9XRVJQQz15CiBDT05GSUdfWFpfREVDX0lBNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCmluZGV4IDRlNWFkZmYuLmYyNzE5NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKQEAgLTIwLDYgKzIwLDggQEAKIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUw9eQogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODAyMD15CiBDT05GSUdfTTY4MDQwPXkKIENPTkZJR19NNjgwNjA9eQpAQCAtOTEsNiArOTMsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTEwMCw2ICsxMDMsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEzMiw2ICsxMzcsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTY5LDggKzE3NSw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTk2LDcgKzIwMCw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC01NzEsNyArNTc0LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNDdfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKaW5kZXggMDJjZGJhYy4uYzM4ODc2MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKQEAgLTI0LDYgKzI0LDggQEAKIENPTkZJR19TVU5fUEFSVElUSU9OPXkKICMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19CT09USU5GT19QUk9DPXkKIENPTkZJR19NNjgwMzA9eQogQ09ORklHX1ZNRT15CiBDT05GSUdfTVZNRTE0Nz15CkBAIC04MCw2ICs4Miw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtODksNiArOTIsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyMSw2ICsxMjYsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTU4LDggKzE2NCw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTg1LDcgKzE4OSw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00NjMsNyArNDY2LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNnhfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcKaW5kZXggMDVhOTkwYS4uZjdmZjc4NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcKQEAgLTI0LDYgKzI0LDggQEAKIENPTkZJR19TVU5fUEFSVElUSU9OPXkKICMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19CT09USU5GT19QUk9DPXkKIENPTkZJR19NNjgwNDA9eQogQ09ORklHX002ODA2MD15CiBDT05GSUdfVk1FPXkKQEAgLTgxLDYgKzgzLDcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfVEFCTEVTPW0KK0NPTkZJR19ORl9UQUJMRVNfSU5FVD1tCiBDT05GSUdfTkZUX0VYVEhEUj1tCiBDT05GSUdfTkZUX01FVEE9bQogQ09ORklHX05GVF9DVD1tCkBAIC05MCw2ICs5Myw4IEBACiBDT05GSUdfTkZUX0xPRz1tCiBDT05GSUdfTkZUX0xJTUlUPW0KIENPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfUVVFVUU9bQorQ09ORklHX05GVF9SRUpFQ1Q9bQogQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMTIyLDYgKzEyNyw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0xNTksOCArMTY1LDYgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQotQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkBAIC0xODYsNyArMTkwLDYgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KQEAgLTQ2NCw3ICs0NjcsNiBAQAogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19YWl9ERUNfWDg2PXkKIENPTkZJR19YWl9ERUNfUE9XRVJQQz15CiBDT05GSUdfWFpfREVDX0lBNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKaW5kZXggNTY4ZTJhOS4uZjBjNzJhYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCkBAIC0yNSw2ICsyNSw4IEBACiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDQwPXkKIENPTkZJR19NNjgwNjA9eQogQ09ORklHX1E0MD15CkBAIC04MSw2ICs4Myw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtOTAsNiArOTMsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyMiw2ICsxMjcsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTU5LDggKzE2NSw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTg2LDcgKzE5MCw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00ODUsNyArNDg4LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcKaW5kZXggNjBiMGFlYS4uN2JjYTBmNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcKQEAgLTI0LDYgKzI0LDggQEAKICMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX1NZU1Y2OF9QQVJUSVRJT049eQogQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19CT09USU5GT19QUk9DPXkKIENPTkZJR19TVU4zPXkKICMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldAogQ09ORklHX0NMRUFOQ0FDSEU9eQpAQCAtNzgsNiArODAsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTg3LDYgKzkwLDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMTksNiArMTI0LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE1Niw4ICsxNjIsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4Myw3ICsxODcsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDY0LDcgKzQ2Nyw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKaW5kZXggMjFiZGEzMy4uMzE3ZjNlMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVjY4X1BBUlRJVElPTj15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX1NVTjNYPXkKICMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldAogQ09ORklHX0NMRUFOQ0FDSEU9eQpAQCAtNzgsNiArODAsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTg3LDYgKzkwLDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMTksNiArMTI0LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE1Niw4ICsxNjIsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4Myw3ICsxODcsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDY0LDcgKzQ2Nyw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA2ZmI5ZTgxLi5jNjdjOTRhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTE0LDggKzE0LDkgQEAKIGdlbmVyaWMteSArPSBrZGVidWcuaAogZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKLWdlbmVyaWMteSArPSBsb2NhbDY0LmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtdXRleC5oCiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvaGVhZC5TIGIvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMKaW5kZXggNGM5OWJhYi4uM2FiMzI5YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMKQEAgLTI3NSw3ICsyNzUsNiBAQAogCiAjaWZkZWYgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEUKICNkZWZpbmUgQ09OU09MRQotI2RlZmluZSBDT05TT0xFX1BFTkdVSU4KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USwpAQCAtNjU4LDI3ICs2NTcsNiBAQAogCW1vdmVsCSVhMEAsJWExQAogI2VuZGlmCiAKLSNpZiAwCi0JLyoKLQkgKiBDbGVhciB0aGUgc2NyZWVuCi0JICovCi0JbGVhCSVwY0AoTChtYWNfdmlkZW9iYXNlKSksJWEwCi0JbW92ZWwJJWEwQCwlYTEKLQlsZWEJJXBjQChMKG1hY19kaW1lbnNpb25zKSksJWEwCi0JbW92ZWwJJWEwQCwlZDEKLQlzd2FwCSVkMQkJLyogI3Jvd3MgaXMgaGlnaCBieXRlcyAqLwotCWFuZGwJIzB4RkZGRiwlZDEJLyogcm93cyAqLwotCXN1YmwJIzEwLCVkMQotCWxlYQklcGNAKEwobWFjX3Jvd2J5dGVzKSksJWEwCi1sb29weTI6Ci0JbW92ZWwJJWEwQCwlZDAKLQlzdWJxbAkjMSwlZDAKLWxvb3B4MjoKLQltb3ZlYgkjMHg1NSwgJWExQCsKLQlkYnJhCSVkMCxsb29weDIKLQlkYnJhCSVkMSxsb29weTIKLSNlbmRpZgotCiBMKHRlc3Rfbm90bWFjKToKICNlbmRpZiAvKiBDT05GSUdfTUFDICovCiAKQEAgLTkwNywxNSArODg1LDE1IEBACiAgKi8KICNpZmRlZiBDT05GSUdfTUFDCiAJaXNfbm90X21hYyhMKG5vY29uKSkKLSNpZmRlZiBDT05TT0xFCisjICBpZmRlZiBDT05TT0xFCiAJY29uc29sZV9pbml0Ci0jaWZkZWYgQ09OU09MRV9QRU5HVUlOCisjICAgIGlmZGVmIENPTkZJR19MT0dPCiAJY29uc29sZV9wdXRfcGVuZ3VpbgotI2VuZGlmCS8qIENPTlNPTEVfUEVOR1VJTiAqLworIyAgICBlbmRpZiAvKiBDT05GSUdfTE9HTyAqLwogCWNvbnNvbGVfcHV0X3N0YXRzCi0jZW5kaWYJLyogQ09OU09MRSAqLworIyAgZW5kaWYgLyogQ09OU09MRSAqLwogTChub2Nvbik6Ci0jZW5kaWYJLyogQ09ORklHX01BQyAqLworI2VuZGlmIC8qIENPTkZJR19NQUMgKi8KIAogCiAJcHV0YwknXG4nCkBAIC0zMzI0LDE0ICszMzAyLDEzIEBACiAjZGVmaW5lIExjb25zb2xlX3N0cnVjdF9udW1fY29sdW1ucwk4CiAjZGVmaW5lIExjb25zb2xlX3N0cnVjdF9udW1fcm93cwkxMgogI2RlZmluZSBMY29uc29sZV9zdHJ1Y3RfbGVmdF9lZGdlCTE2Ci0jZGVmaW5lIExjb25zb2xlX3N0cnVjdF9wZW5ndWluX3B1dGMJMjAKIAogZnVuY19zdGFydAljb25zb2xlX2luaXQsJWEwLSVhNC8lZDAtJWQ3CiAJLyoKIAkgKglTb21lIG9mIHRoZSByZWdpc3RlciB1c2FnZSB0aGF0IGZvbGxvd3MKIAkgKgkJYTAgPSBwb2ludGVyIHRvIGJvb3RfaW5mbwogCSAqCQlhMSA9IHBvaW50ZXIgdG8gc2NyZWVuCi0JICoJCWEyID0gcG9pbnRlciB0byBMY29uc29sZV9nbG9iYWxzCisJICoJCWEyID0gcG9pbnRlciB0byBjb25zb2xlX2dsb2JhbHMKIAkgKgkJZDMgPSBwaXhlbCB3aWR0aCBvZiBzY3JlZW4KIAkgKgkJZDQgPSBwaXhlbCBoZWlnaHQgb2Ygc2NyZWVuCiAJICoJCShkMyxkNCkgfj0gKHgseSkgb2YgYSBwb2ludCBqdXN0IGJlbG93CkBAIC0zNDU2LDcgKzM0MzMsNyBAQAogCiBmdW5jX3JldHVybgljb25zb2xlX3B1dF9zdGF0cwogCi0jaWZkZWYgQ09OU09MRV9QRU5HVUlOCisjaWZkZWYgQ09ORklHX0xPR08KIGZ1bmNfc3RhcnQJY29uc29sZV9wdXRfcGVuZ3VpbiwlYTAtJWExLyVkMC0lZDcKIAkvKgogCSAqCUdldCAndGhhdF9wZW5ndWluJyBvbnRvIHRoZSBzY3JlZW4gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lcgpAQCAtMzc5OSwzOCArMzc3Niw2IEBACiBmdW5jX3JldHVybgljb25zb2xlX3Bsb3RfcGl4ZWwKICNlbmRpZiAvKiBDT05TT0xFICovCiAKLSNpZiAwCi0vKgotICogVGhpcyBpcyBzb21lIG9sZCBjb2RlIGx5aW5nIGFyb3VuZC4gIEkgZG9uJ3QgYmVsaWV2ZQotICogaXQncyB1c2VkIG9yIGltcG9ydGFudCBhbnltb3JlLiAgTXkgZ3Vlc3MgaXMgaXQgY29udHJpYnV0ZWQKLSAqIHRvIGdldHRpbmcgdG8gdGhpcyBwb2ludCwgYnV0IGl0J3MgZG9uZSBmb3Igbm93LgotICogSXQgd2FzIHN0aWxsIGluIHRoZSAyLjEuNzcgaGVhZC5TLCBzbyBpdCdzIHN0aWxsIGhlcmUuCi0gKiAoQW5kIHN0aWxsIG5vdCB1c2VkISkKLSAqLwotTChzaG93dGVzdCk6Ci0JbW92ZW1sCSVhMC8lZDcsJXNwQC0KLQlwdXRzCSJBPSIKLQlwdXRuCSVhMQotCi0JLmxvbmcJMHhmMDExOWYxNQkJfCBwdGVzdHIJIzUsJWExQCwjNywlYTAKLQotCXB1dHMJIkRBPSIKLQlwdXRuCSVhMAotCi0JcHV0cwkiRD0iCi0JcHV0bgklYTBACi0KLQlwdXRzCSJTPSIKLQlsZWEJJXBjQChMKG1tdSkpLCVhMAotCS5sb25nCTB4ZjAxMDYyMDAJCXwgcG1vdmUJCSVwc3IsJWEwQAotCWNscmwJJWQ3Ci0JbW92ZXcJJWEwQCwlZDcKLQlwdXRuCSVkNwotCi0JcHV0YwknXG4nCi0JbW92ZW1sCSVzcEArLCVhMC8lZDcKLQlydHMKLSNlbmRpZgkvKiAwICovCiAKIF9fSU5JVERBVEEKIAkuYWxpZ24JNApAQCAtMzg0OSw3ICszNzk0LDYgQEAKIAkubG9uZwkwCQkvKiBtYXggbnVtIGNvbHVtbnMgKi8KIAkubG9uZwkwCQkvKiBtYXggbnVtIHJvd3MgKi8KIAkubG9uZwkwCQkvKiBsZWZ0IGVkZ2UgKi8KLQkubG9uZwkwCQkvKiBtYWMgcHV0YyAqLwogTChjb25zb2xlX2ZvbnQpOgogCS5sb25nCTAJCS8qIHBvaW50ZXIgdG8gY29uc29sZSBmb250IChzdHJ1Y3QgZm9udF9kZXNjKSAqLwogTChjb25zb2xlX2ZvbnRfZGF0YSk6CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2ludHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCmluZGV4IDA3N2QzYTcuLjViOGQ2NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCkBAIC0xMCw5ICsxMCw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL0tjb25maWcgYi9hcmNoL21ldGFnL0tjb25maWcKaW5kZXggZTU2YWJkMi4uYjFkM2M5YyAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9LY29uZmlnCisrKyBiL2FyY2gvbWV0YWcvS2NvbmZpZwpAQCAtOSw2ICs5LDcgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCXNlbGVjdCBIQVZFX0NfUkVDT1JETUNPVU5UCiAJc2VsZWN0IEhBVkVfREVCVUdfS01FTUxFQUsKKwlzZWxlY3QgSEFWRV9ERUJVR19TVEFDS09WRVJGTE9XCiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgpAQCAtMjksNyArMzAsNiBAQAogCXNlbGVjdCBPRgogCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQogCXNlbGVjdCBTUEFSU0VfSVJRCi0Jc2VsZWN0IEhBVkVfREVCVUdfU1RBQ0tPVkVSRkxPVwogCiBjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCiAJZGVmX2Jvb2wgeQpkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBiNzE2ZDgwLi5jMjllYWQ4IDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTMsNiArMTMsNyBAQAogZ2VuZXJpYy15ICs9IGZjbnRsLmgKIGdlbmVyaWMteSArPSBmdXRleC5oCiBnZW5lcmljLXkgKz0gaGFyZGlycS5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaHdfaXJxLmgKIGdlbmVyaWMteSArPSBpb2N0bC5oCiBnZW5lcmljLXkgKz0gaW9jdGxzLmgKQEAgLTIzLDYgKzI0LDcgQEAKIGdlbmVyaWMteSArPSBrdm1fcGFyYS5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAogZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBtdXRleC5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaApAQCAtMzAsNiArMzIsNyBAQAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZWN0aW9ucy5oCiBnZW5lcmljLXkgKz0gc2VtYnVmLmgKQEAgLTUyLDUgKzU1LDMgQEAKIGdlbmVyaWMteSArPSB1c2VyLmgKIGdlbmVyaWMteSArPSB2Z2EuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggOGU5YzBiMy4uZTk1Zjg3NCAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMywzMyArMyw2IEBACiAKICNpZmRlZiBDT05GSUdfTlVNQQogCi0vKiBzY2hlZF9kb21haW5zIFNEX05PREVfSU5JVCBmb3IgTWV0YSBtYWNoaW5lcyAqLwotI2RlZmluZSBTRF9OT0RFX0lOSVQgKHN0cnVjdCBzY2hlZF9kb21haW4pIHsJCVwKLQkucGFyZW50CQkJPSBOVUxMLAkJCVwKLQkuY2hpbGQJCQk9IE5VTEwsCQkJXAotCS5ncm91cHMJCQk9IE5VTEwsCQkJXAotCS5taW5faW50ZXJ2YWwJCT0gOCwJCQlcCi0JLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCi0JLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKLQkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9uaWNlX3RyaWVzCT0gMiwJCQlcCi0JLmJ1c3lfaWR4CQk9IDMsCQkJXAotCS5pZGxlX2lkeAkJPSAyLAkJCVwKLQkubmV3aWRsZV9pZHgJCT0gMCwJCQlcCi0JLndha2VfaWR4CQk9IDAsCQkJXAotCS5mb3JrZXhlY19pZHgJCT0gMCwJCQlcCi0JLmZsYWdzCQkJPSBTRF9MT0FEX0JBTEFOQ0UJXAotCQkJCXwgU0RfQkFMQU5DRV9GT1JLCVwKLQkJCQl8IFNEX0JBTEFOQ0VfRVhFQwlcCi0JCQkJfCBTRF9CQUxBTkNFX05FV0lETEUJXAotCQkJCXwgU0RfU0VSSUFMSVpFLAkJXAotCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKLQkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJXAotCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXAotCS5tYXhfbmV3aWRsZV9sYl9jb3N0CT0gMCwJCQlcCi0JLm5leHRfZGVjYXlfbWF4X2xiX2Nvc3QJPSBqaWZmaWVzLAkJXAotfQotCiAjZGVmaW5lIGNwdV90b19ub2RlKGNwdSkJKCh2b2lkKShjcHUpLCAwKQogI2RlZmluZSBwYXJlbnRfbm9kZShub2RlKQkoKHZvaWQpKG5vZGUpLCAwKQogCmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2tlcm5lbC9pcnEuYyBiL2FyY2gvbWV0YWcva2VybmVsL2lycS5jCmluZGV4IDNiNGI3ZjYuLjUzODVkZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWV0YWcva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbWV0YWcva2VybmVsL2lycS5jCkBAIC0yNjEsMTggKzI2MSw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyB2b2lkIHJvdXRlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBjcHUpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCWlmIChjaGlwLT5pcnFfc2V0X2FmZmluaXR5KQotCQljaGlwLT5pcnFfc2V0X2FmZmluaXR5KGRhdGEsIGNwdW1hc2tfb2YoY3B1KSwgZmFsc2UpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci19Ci0KIC8qCiAgKiBUaGUgQ1BVIGhhcyBiZWVuIG1hcmtlZCBvZmZsaW5lLiAgTWlncmF0ZSBJUlFzIG9mZiB0aGlzIENQVS4gIElmCiAgKiB0aGUgYWZmaW5pdHkgc2V0dGluZ3MgZG8gbm90IGFsbG93IG90aGVyIENQVXMsIGZvcmNlIHRoZW0gb250byBhbnkKQEAgLTI4MSwxMCArMjY5LDkgQEAKIHZvaWQgbWlncmF0ZV9pcnFzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGksIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKLQlmb3JfZWFjaF9pcnFfZGVzYyhpLCBkZXNjKSB7Ci0JCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9kZXNjX2dldF9pcnFfZGF0YShkZXNjKTsKKwlmb3JfZWFjaF9hY3RpdmVfaXJxKGkpIHsKKwkJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpKTsKIAkJdW5zaWduZWQgaW50IG5ld2NwdTsKIAogCQlpZiAoaXJxZF9pc19wZXJfY3B1KGRhdGEpKQpAQCAtMzAwLDExICsyODcsOCBAQAogCQkJCQkgICAgaSwgY3B1KTsKIAogCQkJY3B1bWFza19zZXRhbGwoZGF0YS0+YWZmaW5pdHkpOwotCQkJbmV3Y3B1ID0gY3B1bWFza19hbnlfYW5kKGRhdGEtPmFmZmluaXR5LAotCQkJCQkJIGNwdV9vbmxpbmVfbWFzayk7CiAJCX0KLQotCQlyb3V0ZV9pcnEoZGF0YSwgaSwgbmV3Y3B1KTsKKwkJaXJxX3NldF9hZmZpbml0eShpLCBkYXRhLT5hZmZpbml0eSk7CiAJfQogfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL21ldGFnL2tlcm5lbC9zaWduYWwuYwppbmRleCAzYmU2MWNmLi5iOWU0YTgyIDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL21ldGFnL2tlcm5lbC9zaWduYWwuYwpAQCAtMTUyLDE4ICsxNTIsMTggQEAKIAlyZXR1cm4gKHZvaWQgX191c2VyICopc3A7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAotCQkJICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpzZXQsCisJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCWludCBlcnIgPSAtRUZBVUxUOworCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBjb2RlOwogCi0JZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MtPlJFR19TUCwgc2l6ZW9mKCpmcmFtZSkpOworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKCZrc2lnLT5rYSwgcmVncy0+UkVHX1NQLCBzaXplb2YoKmZyYW1lKSk7CiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLQllcnIgPSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pOworCWVyciA9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8pOwogCiAJLyogQ3JlYXRlIHRoZSB1Y29udGV4dC4gICovCiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19mbGFncyk7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CiAKIAlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBTZXQgdXAgdG8gcmV0dXJuIGZyb20gdXNlcnNwYWNlLiAgKi8KIApAQCAtMTg3LDE1ICsxODcsMTUgQEAKIAllcnIgfD0gX19wdXRfdXNlcihjb2RlLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikoJmZyYW1lLT5yZXRjb2RlWzFdKSk7CiAKIAlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPlJFR19SVFAgPSAodW5zaWduZWQgbG9uZykgZnJhbWUtPnJldGNvZGU7CiAJcmVncy0+UkVHX1NQID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lICsgc2l6ZW9mKCpmcmFtZSk7Ci0JcmVncy0+UkVHX0FSRzEgPSBzaWc7CisJcmVncy0+UkVHX0FSRzEgPSBrc2lnLT5zaWc7CiAJcmVncy0+UkVHX0FSRzIgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOwogCXJlZ3MtPlJFR19BUkczID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7Ci0JcmVncy0+UkVHX1BDID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworCXJlZ3MtPlJFR19QQyA9ICh1bnNpZ25lZCBsb25nKSBrc2lnLT5rYS5zYS5zYV9oYW5kbGVyOwogCiAJcHJfZGVidWcoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSUwOHggcHI9JTA4eFxuIiwKIAkJIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsIHJlZ3MtPlJFR19QQywKQEAgLTIwNSwyNCArMjA1LDE5IEBACiAJICogZWZmZWN0aXZlIGNhY2hlIGZsdXNoIC0gZGlyZWN0ZWQgcmF0aGVyIHRoYW4gJ2Z1bGwgZmx1c2gnLgogCSAqLwogCWZsdXNoX2NhY2hlX3NpZ3RyYW1wKHJlZ3MtPlJFR19SVFAsIHNpemVvZihmcmFtZS0+cmV0Y29kZSkpOwotb3V0OgotCWlmIChlcnIpIHsKLQkJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc2lnaW5mb190ICppbmZvLAotCQkJICBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIGhhbmRsZV9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXNpZ3NldF90ICpvbGRzZXQgPSBzaWdtYXNrX3RvX3NhdmUoKTsKKwlpbnQgcmV0OwogCiAJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwotCWlmIChzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpKQotCQlyZXR1cm47CisJcmV0ID0gc2V0dXBfcnRfZnJhbWUoa3NpZywgb2xkc2V0LCByZWdzKTsKIAotCXNpZ25hbF9kZWxpdmVyZWQoc2lnLCBpbmZvLCBrYSwgcmVncywgdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpOworCXNpZ25hbF9zZXR1cF9kb25lKHJldCwga3NpZywgdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpOwogfQogCiAgLyoKQEAgLTIzNSwxMCArMjMwLDggQEAKIHN0YXRpYyBpbnQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc3lzY2FsbCkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMCwgY29udGludWVfYWRkciA9IDAsIHJlc3RhcnRfYWRkciA9IDA7Ci0Jc3RydWN0IGtfc2lnYWN0aW9uIGthOwotCXNpZ2luZm9fdCBpbmZvOwotCWludCBzaWducjsKIAlpbnQgcmVzdGFydCA9IDA7CisJc3RydWN0IGtzaWduYWwga3NpZzsKIAogCS8qCiAJICogQnkgdGhlIGVuZCBvZiBydF9zaWdyZXR1cm4gdGhlIGNvbnRleHQgZGVzY3JpYmVzIHRoZSBwb2ludCB0aGF0IHRoZQpAQCAtMjc1LDcgKzI2OCw4IEBACiAJICogR2V0IHRoZSBzaWduYWwgdG8gZGVsaXZlci4gV2hlbiBydW5uaW5nIHVuZGVyIHB0cmFjZSwgYXQgdGhpcyBwb2ludAogCSAqIHRoZSBkZWJ1Z2dlciBtYXkgY2hhbmdlIGFsbCBvdXIgcmVnaXN0ZXJzIC4uLgogCSAqLwotCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOworCWdldF9zaWduYWwoJmtzaWcpOworCiAJLyoKIAkgKiBEZXBlbmRpbmcgb24gdGhlIHNpZ25hbCBzZXR0aW5ncyB3ZSBtYXkgbmVlZCB0byByZXZlcnQgdGhlIGRlY2lzaW9uCiAJICogdG8gcmVzdGFydCB0aGUgc3lzdGVtIGNhbGwuIEJ1dCBza2lwIHRoaXMgaWYgYSBkZWJ1Z2dlciBoYXMgY2hvc2VuIHRvCkBAIC0yODMsMTkgKzI3NywxOSBAQAogCSAqLwogCWlmIChyZWdzLT5SRUdfUEMgIT0gcmVzdGFydF9hZGRyKQogCQlyZXN0YXJ0ID0gMDsKLQlpZiAoc2lnbnIgPiAwKSB7CisJaWYgKGtzaWcuc2lnID4gMCkgewogCQlpZiAodW5saWtlbHkocmVzdGFydCkpIHsKIAkJCWlmIChyZXR2YWwgPT0gLUVSRVNUQVJUTk9IQU5ECiAJCQkgICAgfHwgcmV0dmFsID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0sKIAkJCSAgICB8fCAocmV0dmFsID09IC1FUkVTVEFSVFNZUwotCQkJCSYmICEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkpIHsKKwkJCQkmJiAhKGtzaWcua2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkpIHsKIAkJCQlyZWdzLT5SRUdfUkVUVkFMID0gLUVJTlRSOwogCQkJCXJlZ3MtPlJFR19QQyA9IGNvbnRpbnVlX2FkZHI7CiAJCQl9CiAJCX0KIAogCQkvKiBXaGVlISBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwotCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAmaW5mbywgJmthLCByZWdzKTsKKwkJaGFuZGxlX3NpZ25hbCgma3NpZywgcmVncyk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMmI5OGJjNy4uYzk4ZWQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDggKzEsMTAgQEAKIAogZ2VuZXJpYy15ICs9IGJhcnJpZXIuaAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHN5c2NhbGxzLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHN5c2NhbGxzLmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2OGFkNy4uMDAwMDAwMAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jIGIvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMKaW5kZXggNjY4MDRhZC4uNzA5OTZjYyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMKQEAgLTEyOTQsMTEgKzEyOTQsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19maW5pc2hfYWRkaW5nX3RvX2J1cyk7CiAKLWludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCi17Ci0JcmV0dXJuIHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzayk7Ci19Ci0KIHN0YXRpYyB2b2lkIHBjaWJpb3Nfc2V0dXBfcGhiX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnJlc291cmNlcykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnIGIvYXJjaC9taXBzL0tjb25maWcKaW5kZXggZGNhZTNhNy4uMTZkNWFiMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcKQEAgLTEwLDYgKzEwLDcgQEAKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBQRVJGX1VTRV9WTUFMTE9DCiAJc2VsZWN0IEhBVkVfQVJDSF9LR0RCCisJc2VsZWN0IEhBVkVfQVJDSF9TRUNDT01QX0ZJTFRFUgogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCiAJc2VsZWN0IEFSQ0hfSEFWRV9DVVNUT01fR1BJT19ICiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCkBAIC02MiwxMyArNjMsMTIgQEAKIAlzZWxlY3QgQ0VWVF9SNEsKIAlzZWxlY3QgQ1NSQ19SNEsKIAlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBETUFfTUFZQkVfQ09IRVJFTlQJIyBBdTEwMDAsMTUwMCwxMTAwIGFyZW4ndCwgcmVzdCBpcwogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfWkJPT1QKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAogY29uZmlnIEFSNwogCWJvb2wgIlRleGFzIEluc3RydW1lbnRzIEFSNyIKQEAgLTEyMyw3ICsxMjMsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCi0Jc2VsZWN0IEVBUkxZX1BSSU5US184MjUwIGlmIEVBUkxZX1BSSU5USworCXNlbGVjdCBVU0VfR0VORVJJQ19FQVJMWV9QUklOVEtfODI1MAogCWhlbHAKIAkgU3VwcG9ydCBmb3IgQkNNNDdYWCBiYXNlZCBib2FyZHMKIApAQCAtMTUwLDcgKzE1MCw2IEBACiAJc2VsZWN0IENTUkNfUjRLCiAJc2VsZWN0IENFVlRfR1Q2NDFYWAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgRUFSTFlfUFJJTlRLXzgyNTAgaWYgRUFSTFlfUFJJTlRLCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgSTgyNTMKIAlzZWxlY3QgSTgyNTkKQEAgLTE2Myw2ICsxNjIsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KKwlzZWxlY3QgVVNFX0dFTkVSSUNfRUFSTFlfUFJJTlRLXzgyNTAKIAogY29uZmlnIE1BQ0hfREVDU1RBVElPTgogCWJvb2wgIkRFQ3N0YXRpb25zIgpAQCAtMjM1LDcgKzIzNSw2IEBACiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKLQlzZWxlY3QgSEFWRV9QV00KIAlzZWxlY3QgSEFWRV9DTEsKIAlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCkBAIC0zMjAsNiArMzE5LDcgQEAKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IyCisJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SM181CiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFM2NF9SMQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTNjRfUjIKIAlzZWxlY3QgU1lTX0hBU19DUFVfTkVWQURBCkBAIC0zMjksNiArMzI5LDcgQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX01JUFNfQ01QCisJc2VsZWN0IFNZU19TVVBQT1JUU19NSVBTX0NQUwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVVMVElUSFJFQURJTkcKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNQVJUTUlQUwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfWkJPT1QKQEAgLTM2MCw3ICszNjEsNiBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01BUlRNSVBTCiAJc2VsZWN0IFNZU19TVVBQT1JUU19NSUNST01JUFMKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9ERVNDCiAJc2VsZWN0IFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTwogCXNlbGVjdCBVU0VfT0YKQEAgLTY3NCw2ICs2NzQsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfSElHSE1FTQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCXNlbGVjdCBVU0VfR0VORVJJQ19FQVJMWV9QUklOVEtfODI1MAogCWhlbHAKIAkgIFRoZSBTTkkgUk0yMDAvMzAwLzQwMCBhcmUgTUlQUy1iYXNlZCBtYWNoaW5lcyBtYW51ZmFjdHVyZWQgYnkKIAkgIFNpZW1lbnMgTml4ZG9yZiBJbmZvcm1hdGlvbnNzeXN0ZW1lIChTTkkpLCBwYXJlbnQgY29tcGFueSBvZiBQeXJhbWlkCkBAIC03MTgsOCArNzE5LDYgQEAKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFpPTkVfRE1BMzIKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgSE9MRVNfSU5fWk9ORQogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCWhlbHAKQEAgLTc1Niw4ICs3NTUsNiBAQAogCXNlbGVjdCBaT05FX0RNQTMyIGlmIDY0QklUCiAJc2VsZWN0IFNZTkNfUjRLCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJIGlmIFVTQl9TVVBQT1JUCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJIGlmIFVTQl9TVVBQT1JUCiAJc2VsZWN0IFNZU19TVVBQT1JUU19aQk9PVAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfWkJPT1RfVUFSVDE2NTUwCiAJaGVscApAQCAtNzgyLDcgKzc3OSw2IEBACiAJc2VsZWN0IENFVlRfUjRLCiAJc2VsZWN0IENTUkNfUjRLCiAJc2VsZWN0IElSUV9DUFUKLQlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKIAlzZWxlY3QgWk9ORV9ETUEzMiBpZiA2NEJJVAogCXNlbGVjdCBTWU5DX1I0SwogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwpAQCAtODY4LDYgKzg2NCw3IEBACiAJYm9vbAogCiBjb25maWcgQ0VWVF9HSUMKKwlzZWxlY3QgTUlQU19DTQogCWJvb2wKIAogY29uZmlnIENFVlRfU0IxMjUwCkBAIC04ODYsNiArODgzLDcgQEAKIAlib29sCiAKIGNvbmZpZyBDU1JDX0dJQworCXNlbGVjdCBNSVBTX0NNCiAJYm9vbAogCiBjb25maWcgQ1NSQ19TQjEyNTAKQEAgLTEwMzAsNiArMTAyOCw3IEBACiAJYm9vbAogCiBjb25maWcgSVJRX0dJQworCXNlbGVjdCBNSVBTX0NNCiAJYm9vbAogCiBjb25maWcgUENJX0dUNjRYWFhfUENJMApAQCAtMTE0OCw2ICsxMTQ3LDE4IEBACiAJcHJvbXB0ICJDUFUgdHlwZSIKIAlkZWZhdWx0IENQVV9SNFgwMAogCitjb25maWcgQ1BVX0xPT05HU09OMworCWJvb2wgIkxvb25nc29uIDMgQ1BVIgorCWRlcGVuZHMgb24gU1lTX0hBU19DUFVfTE9PTkdTT04zCisJc2VsZWN0IENQVV9TVVBQT1JUU182NEJJVF9LRVJORUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTX0hJR0hNRU0KKwlzZWxlY3QgQ1BVX1NVUFBPUlRTX0hVR0VQQUdFUworCXNlbGVjdCBXRUFLX09SREVSSU5HCisJc2VsZWN0IFdFQUtfUkVPUkRFUklOR19CRVlPTkRfTExTQworCWhlbHAKKwkJVGhlIExvb25nc29uIDMgcHJvY2Vzc29yIGltcGxlbWVudHMgdGhlIE1JUFM2NFIyIGluc3RydWN0aW9uCisJCXNldCB3aXRoIG1hbnkgZXh0ZW5zaW9ucy4KKwogY29uZmlnIENQVV9MT09OR1NPTjJFCiAJYm9vbCAiTG9vbmdzb24gMkUiCiAJZGVwZW5kcyBvbiBTWVNfSEFTX0NQVV9MT09OR1NPTjJFCkBAIC0xMjAzLDYgKzEyMTQsNyBAQAogCXNlbGVjdCBDUFVfSEFTX1BSRUZFVENICiAJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTX0hJR0hNRU0KKwlzZWxlY3QgQ1BVX1NVUFBPUlRTX01TQQogCXNlbGVjdCBIQVZFX0tWTQogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgcmVsZWFzZSAyIG9yIGxhdGVyIG9mIHRoZQpAQCAtMTIzOCw2ICsxMjUwLDcgQEAKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfSElHSE1FTQogCXNlbGVjdCBDUFVfU1VQUE9SVFNfSFVHRVBBR0VTCisJc2VsZWN0IENQVV9TVVBQT1JUU19NU0EKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gdG8gYnVpbGQgYSBrZXJuZWwgZm9yIHJlbGVhc2UgMiBvciBsYXRlciBvZiB0aGUKIAkgIE1JUFM2NCBhcmNoaXRlY3R1cmUuICBNYW55IG1vZGVybiBlbWJlZGRlZCBzeXN0ZW1zIHdpdGggYSA2NC1iaXQKQEAgLTEzOTYsNyArMTQwOSw2IEBACiAJc2VsZWN0IExJQkZEVAogCXNlbGVjdCBVU0VfT0YKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCi0Jc2VsZWN0IFNZU19IQVNfRE1BX09QUwogCXNlbGVjdCBNSVBTX0wxX0NBQ0hFX1NISUZUXzcKIAloZWxwCiAJICBUaGUgQ2F2aXVtIE9jdGVvbiBwcm9jZXNzb3IgaXMgYSBoaWdobHkgaW50ZWdyYXRlZCBjaGlwIGNvbnRhaW5pbmcKQEAgLTE0NDgsNiArMTQ2MCwyNiBAQAogCSAgTmV0bG9naWMgTWljcm9zeXN0ZW1zIFhMUCBwcm9jZXNzb3JzLgogZW5kY2hvaWNlCiAKK2NvbmZpZyBDUFVfTUlQUzMyXzNfNV9GRUFUVVJFUworCWJvb2wgIk1JUFMzMiBSZWxlYXNlIDMuNSBGZWF0dXJlcyIKKwlkZXBlbmRzIG9uIFNZU19IQVNfQ1BVX01JUFMzMl9SM181CisJZGVwZW5kcyBvbiBDUFVfTUlQUzMyX1IyCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciByZWxlYXNlIDIgb3IgbGF0ZXIgb2YgdGhlCisJICBNSVBTMzIgYXJjaGl0ZWN0dXJlIGluY2x1ZGluZyBmZWF0dXJlcyBmcm9tIHRoZSAzLjUgcmVsZWFzZSBzdWNoIGFzCisJICBzdXBwb3J0IGZvciBFbmhhbmNlZCBWaXJ0dWFsIEFkZHJlc3NpbmcgKEVWQSkuCisKK2NvbmZpZyBDUFVfTUlQUzMyXzNfNV9FVkEKKwlib29sICJFbmhhbmNlZCBWaXJ0dWFsIEFkZHJlc3NpbmcgKEVWQSkiCisJZGVwZW5kcyBvbiBDUFVfTUlQUzMyXzNfNV9GRUFUVVJFUworCXNlbGVjdCBFVkEKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSBFbmhhbmNlZCBWaXJ0dWFsCisJICBBZGRyZXNzaW5nIChFVkEpIG9uIHlvdXIgTUlQUzMyIGNvcmUgKHN1Y2ggYXMgcHJvQXB0aXYpLgorCSAgT25lIG9mIGl0cyBwcmltYXJ5IGJlbmVmaXRzIGlzIGFuIGluY3JlYXNlIGluIHRoZSBtYXhpbXVtIHNpemUKKwkgIG9mIGxvd21lbSAodXAgdG8gM0dCKS4gSWYgdW5zdXJlLCBzYXkgJ04nIGhlcmUuCisKIGlmIENQVV9MT09OR1NPTjJGCiBjb25maWcgQ1BVX05PUF9XT1JLQVJPVU5EUwogCWJvb2wKQEAgLTE1MjMsNiArMTU1NSwxMCBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01QCiAJc2VsZWN0IFNZU19TVVBQT1JUU19IT1RQTFVHX0NQVQogCitjb25maWcgU1lTX0hBU19DUFVfTE9PTkdTT04zCisJYm9vbAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfQ1BVRlJFUQorCiBjb25maWcgU1lTX0hBU19DUFVfTE9PTkdTT04yRQogCWJvb2wKIApAQCAtMTU0MSw2ICsxNTc3LDkgQEAKIGNvbmZpZyBTWVNfSEFTX0NQVV9NSVBTMzJfUjIKIAlib29sCiAKK2NvbmZpZyBTWVNfSEFTX0NQVV9NSVBTMzJfUjNfNQorCWJvb2wKKwogY29uZmlnIFNZU19IQVNfQ1BVX01JUFM2NF9SMQogCWJvb2wKIApAQCAtMTY1Nyw2ICsxNjk2LDkgQEAKIAlib29sCiAJZGVmYXVsdCB5IGlmIENQVV9NSVBTMzJfUjIgfHwgQ1BVX01JUFM2NF9SMiB8fCBDUFVfQ0FWSVVNX09DVEVPTgogCitjb25maWcgRVZBCisJYm9vbAorCiBjb25maWcgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCWJvb2wKIGNvbmZpZyBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCkBAIC0xNzI5LDcgKzE3NzEsNyBAQAogCiBjb25maWcgUEFHRV9TSVpFXzRLQgogCWJvb2wgIjRrQiIKLQlkZXBlbmRzIG9uICFDUFVfTE9PTkdTT04yCisJZGVwZW5kcyBvbiAhQ1BVX0xPT05HU09OMiAmJiAhQ1BVX0xPT05HU09OMwogCWhlbHAKIAkgVGhpcyBvcHRpb24gc2VsZWN0IHRoZSBzdGFuZGFyZCA0a0IgTGludXggcGFnZSBzaXplLiAgT24gc29tZQogCSBSMzAwMC1mYW1pbHkgcHJvY2Vzc29ycyB0aGlzIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSBwYWdlIHNpemUuICBVc2luZwpAQCAtMTc3NiwxMiArMTgxOCwxMiBAQAogCiBjb25maWcgRk9SQ0VfTUFYX1pPTkVPUkRFUgogCWludCAiTWF4aW11bSB6b25lIG9yZGVyIgotCXJhbmdlIDE0IDY0IGlmIEhVR0VUTEJfUEFHRSAmJiBQQUdFX1NJWkVfNjRLQgotCWRlZmF1bHQgIjE0IiBpZiBIVUdFVExCX1BBR0UgJiYgUEFHRV9TSVpFXzY0S0IKLQlyYW5nZSAxMyA2NCBpZiBIVUdFVExCX1BBR0UgJiYgUEFHRV9TSVpFXzMyS0IKLQlkZWZhdWx0ICIxMyIgaWYgSFVHRVRMQl9QQUdFICYmIFBBR0VfU0laRV8zMktCCi0JcmFuZ2UgMTIgNjQgaWYgSFVHRVRMQl9QQUdFICYmIFBBR0VfU0laRV8xNktCCi0JZGVmYXVsdCAiMTIiIGlmIEhVR0VUTEJfUEFHRSAmJiBQQUdFX1NJWkVfMTZLQgorCXJhbmdlIDE0IDY0IGlmIE1JUFNfSFVHRV9UTEJfU1VQUE9SVCAmJiBQQUdFX1NJWkVfNjRLQgorCWRlZmF1bHQgIjE0IiBpZiBNSVBTX0hVR0VfVExCX1NVUFBPUlQgJiYgUEFHRV9TSVpFXzY0S0IKKwlyYW5nZSAxMyA2NCBpZiBNSVBTX0hVR0VfVExCX1NVUFBPUlQgJiYgUEFHRV9TSVpFXzMyS0IKKwlkZWZhdWx0ICIxMyIgaWYgTUlQU19IVUdFX1RMQl9TVVBQT1JUICYmIFBBR0VfU0laRV8zMktCCisJcmFuZ2UgMTIgNjQgaWYgTUlQU19IVUdFX1RMQl9TVVBQT1JUICYmIFBBR0VfU0laRV8xNktCCisJZGVmYXVsdCAiMTIiIGlmIE1JUFNfSFVHRV9UTEJfU1VQUE9SVCAmJiBQQUdFX1NJWkVfMTZLQgogCXJhbmdlIDExIDY0CiAJZGVmYXVsdCAiMTEiCiAJaGVscApAQCAtMTg3MCw2ICsxOTEyLDcgQEAKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfRUkKIAlzZWxlY3QgU1lOQ19SNEsKKwlzZWxlY3QgTUlQU19HSUNfSVBJCiAJc2VsZWN0IE1JUFNfTVQKIAlzZWxlY3QgU01QCiAJc2VsZWN0IFNNUF9VUApAQCAtMTg4Nyw2ICsxOTMwLDcgQEAKIAlib29sICJVc2UgYWxsIFRDcyBvbiBhbGwgVlBFcyBmb3IgU01QIChERVBSRUNBVEVEKSIKIAlkZXBlbmRzIG9uIENQVV9NSVBTMzJfUjIKIAlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NVUxUSVRIUkVBRElORworCWRlcGVuZHMgb24gIU1JUFNfQ1BTCiAJc2VsZWN0IENQVV9NSVBTUjJfSVJRX1ZJCiAJc2VsZWN0IENQVV9NSVBTUjJfSVJRX0VJCiAJc2VsZWN0IE1JUFNfTVQKQEAgLTE5OTQsMTMgKzIwMzgsNDUgQEAKIAlkZXBlbmRzIG9uIE1JUFNfVlBFX0FQU1BfQVBJICYmICFNSVBTX0NNUAogCiBjb25maWcgTUlQU19DTVAKLQlib29sICJNSVBTIENNUCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01JUFNfQ01QICYmIE1JUFNfTVRfU01QCisJYm9vbCAiTUlQUyBDTVAgZnJhbWV3b3JrIHN1cHBvcnQgKERFUFJFQ0FURUQpIgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01JUFNfQ01QICYmICFNSVBTX01UX1NNVEMKKwlzZWxlY3QgTUlQU19HSUNfSVBJCiAJc2VsZWN0IFNZTkNfUjRLCiAJc2VsZWN0IFdFQUtfT1JERVJJTkcKIAlkZWZhdWx0IG4KIAloZWxwCi0JICBFbmFibGUgQ29oZXJlbmN5IE1hbmFnZXIgcHJvY2Vzc29yIChDTVApIHN1cHBvcnQuCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIGEgYm9vdGxvYWRlciB3aGljaCBpbXBsZW1lbnRzIHRoZSAiQ01QCisJICBmcmFtZXdvcmsiIHByb3RvY29sIChpZS4gWUFNT04pIGFuZCB3YW50IHlvdXIga2VybmVsIHRvIG1ha2UgdXNlIG9mCisJICBpdHMgYWJpbGl0eSB0byBzdGFydCBzZWNvbmRhcnkgQ1BVcy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgbmVlZCwgeW91IHNob3VsZCB1c2UgQ09ORklHX01JUFNfQ1BTCisJICBpbnN0ZWFkIG9mIHRoaXMuCisKK2NvbmZpZyBNSVBTX0NQUworCWJvb2wgIk1JUFMgQ29oZXJlbnQgUHJvY2Vzc2luZyBTeXN0ZW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NSVBTX0NQUworCXNlbGVjdCBNSVBTX0NNCisJc2VsZWN0IE1JUFNfQ1BDCisJc2VsZWN0IE1JUFNfR0lDX0lQSQorCXNlbGVjdCBTTVAKKwlzZWxlY3QgU1lOQ19SNEsgaWYgKENFVlRfUjRLIHx8IENTUkNfUjRLKQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01QCisJc2VsZWN0IFdFQUtfT1JERVJJTkcKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2lzaCB0byBydW4gYW4gU01QIGtlcm5lbCBhY3Jvc3MgbXVsdGlwbGUgY29yZXMKKwkgIHdpdGhpbiBhIE1JUFMgQ29oZXJlbnQgUHJvY2Vzc2luZyBTeXN0ZW0uIFdoZW4gdGhpcyBvcHRpb24gaXMKKwkgIGVuYWJsZWQgdGhlIGtlcm5lbCB3aWxsIHByb2JlIGZvciBvdGhlciBjb3JlcyBhbmQgYm9vdCB0aGVtIHdpdGgKKwkgIG5vIGV4dGVybmFsIGFzc2lzdGFuY2UuIEl0IGlzIHNhZmUgdG8gZW5hYmxlIHRoaXMgd2hlbiBoYXJkd2FyZQorCSAgc3VwcG9ydCBpcyB1bmF2YWlsYWJsZS4KKworY29uZmlnIE1JUFNfR0lDX0lQSQorCWJvb2wKKworY29uZmlnIE1JUFNfQ00KKwlib29sCisKK2NvbmZpZyBNSVBTX0NQQworCWJvb2wKIAogY29uZmlnIFNCMV9QQVNTXzFfV09SS0FST1VORFMKIAlib29sCkBAIC0yMDQzLDYgKzIxMTksMjEgQEAKIAkgIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCB0aGUga2VybmVsIHdpbGwgYmUgYnVpbHQgdXNpbmcgdGhlCiAJICBtaWNyb01JUFMgSVNBCiAKK2NvbmZpZyBDUFVfSEFTX01TQQorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBNSVBTIFNJTUQgQXJjaGl0ZWN0dXJlIgorCWRlcGVuZHMgb24gQ1BVX1NVUFBPUlRTX01TQQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1JUFMgU0lNRCBBcmNoaXRlY3R1cmUgKE1TQSkgaW50cm9kdWNlcyAxMjggYml0IHdpZGUgdmVjdG9yIHJlZ2lzdGVycworCSAgYW5kIGEgc2V0IG9mIFNJTUQgaW5zdHJ1Y3Rpb25zIHRvIG9wZXJhdGUgb24gdGhlbS4gV2hlbiB0aGlzIG9wdGlvbgorCSAgaXMgZW5hYmxlZCB0aGUga2VybmVsIHdpbGwgc3VwcG9ydCBhbGxvY2F0aW5nICYgc3dpdGNoaW5nIE1TQQorCSAgdmVjdG9yIHJlZ2lzdGVyIGNvbnRleHRzLiBJZiB5b3Uga25vdyB0aGF0IHlvdXIga2VybmVsIHdpbGwgb25seSBiZQorCSAgcnVubmluZyBvbiBDUFVzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IE1TQSBvciB0aGF0IHlvdXIgdXNlcmxhbmQgd2lsbAorCSAgbm90IGJlIG1ha2luZyB1c2Ugb2YgaXQgdGhlbiB5b3UgbWF5IHdpc2ggdG8gc2F5IE4gaGVyZSB0byByZWR1Y2UKKwkgIHRoZSBzaXplICYgY29tcGxleGl0eSBvZiB5b3VyIGtlcm5lbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIENQVV9IQVNfV0IKIAlib29sCiAKQEAgLTIwOTQsNyArMjE4NSw3IEBACiAjCiBjb25maWcgSElHSE1FTQogCWJvb2wgIkhpZ2ggTWVtb3J5IFN1cHBvcnQiCi0JZGVwZW5kcyBvbiAzMkJJVCAmJiBDUFVfU1VQUE9SVFNfSElHSE1FTSAmJiBTWVNfU1VQUE9SVFNfSElHSE1FTQorCWRlcGVuZHMgb24gMzJCSVQgJiYgQ1BVX1NVUFBPUlRTX0hJR0hNRU0gJiYgU1lTX1NVUFBPUlRTX0hJR0hNRU0gJiYgIUNQVV9NSVBTMzJfM181X0VWQQogCiBjb25maWcgQ1BVX1NVUFBPUlRTX0hJR0hNRU0KIAlib29sCkBAIC0yMTA4LDYgKzIxOTksOSBAQAogY29uZmlnIFNZU19TVVBQT1JUU19NSUNST01JUFMKIAlib29sCiAKK2NvbmZpZyBDUFVfU1VQUE9SVFNfTVNBCisJYm9vbAorCiBjb25maWcgQVJDSF9GTEFUTUVNX0VOQUJMRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uICFOVU1BICYmICFDUFVfTE9PTkdTT04yCkBAIC0yMTgxLDYgKzIyNzUsOSBAQAogY29uZmlnIFNZU19TVVBQT1JUU19NSVBTX0NNUAogCWJvb2wKIAorY29uZmlnIFNZU19TVVBQT1JUU19NSVBTX0NQUworCWJvb2wKKwogY29uZmlnIFNZU19TVVBQT1JUU19TTVAKIAlib29sCiAKQEAgLTIzNTMsOSArMjQ1MCw4IEBACiAJICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgogCiBjb25maWcgTUlQU19PMzJfRlA2NF9TVVBQT1JUCi0JYm9vbCAiU3VwcG9ydCBmb3IgTzMyIGJpbmFyaWVzIHVzaW5nIDY0LWJpdCBGUCIKKwlib29sICJTdXBwb3J0IGZvciBPMzIgYmluYXJpZXMgdXNpbmcgNjQtYml0IEZQIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gMzJCSVQgfHwgTUlQUzMyX08zMgotCWRlZmF1bHQgeQogCWhlbHAKIAkgIFdoZW4gdGhpcyBpcyBlbmFibGVkLCB0aGUga2VybmVsIHdpbGwgc3VwcG9ydCB1c2Ugb2YgNjQtYml0IGZsb2F0aW5nCiAJICBwb2ludCByZWdpc3RlcnMgd2l0aCBiaW5hcmllcyB1c2luZyB0aGUgTzMyIEFCSSBhbG9uZyB3aXRoIHRoZQpAQCAtMjM2Nyw3ICsyNDYzLDE0IEBACiAJICBvZiB5b3VyIGtlcm5lbCAmIHBvdGVudGlhbGx5IGltcHJvdmUgRlAgZW11bGF0aW9uIHBlcmZvcm1hbmNlIGJ5CiAJICBzYXlpbmcgTiBoZXJlLgogCi0JICBJZiB1bnN1cmUsIHNheSBZLgorCSAgQWx0aG91Z2ggYmludXRpbHMgY3VycmVudGx5IHN1cHBvcnRzIHVzZSBvZiB0aGlzIGZsYWcgdGhlIGRldGFpbHMKKwkgIGNvbmNlcm5pbmcgaXRzIGVmZmVjdCB1cG9uIHRoZSBPMzIgQUJJIGluIHVzZXJsYW5kIGFyZSBzdGlsbCBiZWluZworCSAgd29ya2VkIG9uLiBJbiBvcmRlciB0byBhdm9pZCB1c2VybGFuZCBiZWNvbWluZyBkZXBlbmRhbnQgdXBvbiBjdXJyZW50CisJICBiZWhhdmlvdXIgYmVmb3JlIHRoZSBkZXRhaWxzIGhhdmUgYmVlbiBmaW5hbGlzZWQsIHRoaXMgb3B0aW9uIHNob3VsZAorCSAgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYW5kIG9ubHkgZW5hYmxlZCBieSB0aG9zZSB3b3JraW5nIHVwb24KKwkgIHNhaWQgZGV0YWlscy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFVTRV9PRgogCWJvb2wKQEAgLTI0MDcsNiArMjUxMCwxNyBAQAogCSAgeW91ciBib3guIE90aGVyIGJ1cyBzeXN0ZW1zIGFyZSBJU0EsIEVJU0EsIG9yIFZFU0EuIElmIHlvdSBoYXZlIFBDSSwKIAkgIHNheSBZLCBvdGhlcndpc2UgTi4KIAorY29uZmlnIEhUX1BDSQorCWJvb2wgIlN1cHBvcnQgZm9yIEhULWxpbmtlZCBQQ0kiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUFVfTE9PTkdTT04zCisJc2VsZWN0IFBDSQorCXNlbGVjdCBQQ0lfRE9NQUlOUworCWhlbHAKKwkgIExvb25nc29uIGZhbWlseSBtYWNoaW5lcyB1c2UgSHlwZXItVHJhbnNwb3J0IGJ1cyBmb3IgaW50ZXItY29yZQorCSAgY29ubmVjdGlvbiBhbmQgZGV2aWNlIGNvbm5lY3Rpb24uIFRoZSBQQ0kgYnVzIGlzIGEgc3Vib3JkaW5hdGUKKwkgIGxpbmtlZCBhdCBIVC4gQ2hvb3NlIFkgZm9yIExvb25nc29uLTMgYmFzZWQgbWFjaGluZXMuCisKIGNvbmZpZyBQQ0lfRE9NQUlOUwogCWJvb2wKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcuZGVidWcgYi9hcmNoL21pcHMvS2NvbmZpZy5kZWJ1ZwppbmRleCBiMTQ3ZTcwLi4yNWRlMjkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL21pcHMvS2NvbmZpZy5kZWJ1ZwpAQCAtMjEsMTMgKzIxLDE3IEBACiAJICB1bmxlc3MgeW91IHdhbnQgdG8gZGVidWcgc3VjaCBhIGNyYXNoLgogCiBjb25maWcgRUFSTFlfUFJJTlRLXzgyNTAKLQlib29sICI4MjUwLzE2NTUwIGFuZCBjb21wYXRpYmxlIHNlcmlhbCBlYXJseSBwcmludGsgZHJpdmVyIgotCWRlcGVuZHMgb24gRUFSTFlfUFJJTlRLCi0JZGVmYXVsdCBuCisJYm9vbAorCWRlcGVuZHMgb24gRUFSTFlfUFJJTlRLICYmIFVTRV9HRU5FUklDX0VBUkxZX1BSSU5US184MjUwCisJZGVmYXVsdCB5CiAJaGVscAorCSAgIjgyNTAvMTY1NTAgYW5kIGNvbXBhdGlibGUgc2VyaWFsIGVhcmx5IHByaW50ayBkcml2ZXIiCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byB1c2UgYSA4MjUwLzE2NTUwIHNlcmlhbAogCSAgcG9ydCBhcyB0aGUgYm9vdCBjb25zb2xlLgogCitjb25maWcgVVNFX0dFTkVSSUNfRUFSTFlfUFJJTlRLXzgyNTAKKwlib29sCisKIGNvbmZpZyBDTURMSU5FX0JPT0wKIAlib29sICJCdWlsdC1pbiBrZXJuZWwgY29tbWFuZCBsaW5lIgogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IDliODU1NmQuLjFhNWI0MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTExOSw2ICsxMTksMTEgQEAKIGNmbGFncy0kKENPTkZJR19TQjFYWFhfQ09SRUxJUykJKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLXNjaGVkLXByb2xvZykgXAogCQkJCSAgIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCiAKK2lmZXEgKCQoQ09ORklHX0NQVV9IQVNfTVNBKSx5KQordG9vbGNoYWluLW1zYQkJCTo9ICQoY2FsbCBjYy1vcHRpb24teW4sLW1oYXJkLWZsb2F0IC1tZnA2NCAtbW1zYSkKK2NmbGFncy0kKHRvb2xjaGFpbi1tc2EpCQkrPSAtRFRPT0xDSEFJTl9TVVBQT1JUU19NU0EKK2VuZGlmCisKICMKICMgQ1BVLWRlcGVuZGVudCBjb21waWxlci9hc3NlbWJsZXIgb3B0aW9ucyBmb3Igb3B0aW1pemF0aW9uLgogIwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKaW5kZXggNzAzMmFjNy4uYjk2Mjg5OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnCkBAIC0xNiwzNiArMTYsMjkgQEAKIGNob2ljZQogCXByb21wdCAiTWFjaGluZSB0eXBlIgogCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZCi0JZGVmYXVsdCBNSVBTX0RCMTAwMAorCWRlZmF1bHQgTUlQU19EQjFYWFgKIAogY29uZmlnIE1JUFNfTVRYMQogCWJvb2wgIjRHIFN5c3RlbXMgTVRYLTEgYm9hcmQiCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAotY29uZmlnIE1JUFNfREIxMDAwCi0JYm9vbCAiQWxjaGVteSBEQjEwMDAvREIxNTAwL0RCMTEwMCBQQjE1MDAvMTEwMCBib2FyZHMiCi0Jc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KLQlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKLQotY29uZmlnIE1JUFNfREIxMjM1Ci0JYm9vbCAiQWxjaGVteSBEQjEyMDAvUEIxMjAwL0RCMTMwMC9EQjE1NTAvUEIxNTUwIGJvYXJkcyIKK2NvbmZpZyBNSVBTX0RCMVhYWAorCWJvb2wgIkFsY2hlbXkgREIxWFhYIC8gUEIxWFhYIGJvYXJkcyIKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBETUFfQ09IRVJFTlQKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgQWxjaGVteQorCSAgZGV2ZWxvcG1lbnQgYm9hcmRzOiAgREIxMDAwIERCMTUwMCBEQjExMDAgREIxNTUwIERCMTIwMCBEQjEzMDAKKwkJCSAgICAgICBQQjE1MDAgUEIxMTAwIFBCMTU1MCBQQjEyMDAKKwkgIEJvYXJkIHR5cGUgaXMgYXV0b2RldGVjdGVkIGR1cmluZyBib290LgogCiBjb25maWcgTUlQU19YWFMxNTAwCiAJYm9vbCAiTXlDYWJsZSBYWFMxNTAwIGJvYXJkIgotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwpAQCAtNTQsNyArNDcsNiBAQAogCWJvb2wgIlRyYXBlemUgSVRTIEdQUiBib2FyZCIKIAlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9hbGNoZW15L1BsYXRmb3JtCmluZGV4IGIzYWZjZGQuLjMzYzlkYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L1BsYXRmb3JtCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L1BsYXRmb3JtCkBAIC01LDE4ICs1LDEyIEBACiAKIAogIwotIyBBTUQgQWxjaGVteSBEYjEwMDAvRGIxNTAwL1BiMTUwMC9EYjExMDAvUGIxMTAwIGV2YWwgYm9hcmRzCisjIEFNRCBBbGNoZW15IERiMTAwMC9EYjE1MDAvUGIxNTAwL0RiMTEwMC9QYjExMDAKKyMgICAgICAgICAgICAgRGIxNTUwL1BiMTU1MC9EYjEyMDAvUGIxMjAwL0RiMTMwMAogIwotcGxhdGZvcm0tJChDT05GSUdfTUlQU19EQjEwMDApCSs9IGFsY2hlbXkvZGV2Ym9hcmRzLwotY2ZsYWdzLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCi1sb2FkLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBBTUQgQWxjaGVteSBEYjEyMDAvUGIxMjAwL0RiMTU1MC9QYjE1NTAvRGIxMzAwIGV2YWwgYm9hcmRzCi0jCi1wbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTIzNSkJKz0gYWxjaGVteS9kZXZib2FyZHMvCi1jZmxhZ3MtJChDT05GSUdfTUlQU19EQjEyMzUpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKLWxvYWQtJChDT05GSUdfTUlQU19EQjEyMzUpCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorcGxhdGZvcm0tJChDT05GSUdfTUlQU19EQjFYWFgpCSs9IGFsY2hlbXkvZGV2Ym9hcmRzLworY2ZsYWdzLSQoQ09ORklHX01JUFNfREIxWFhYKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCitsb2FkLSQoQ09ORklHX01JUFNfREIxWFhYKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKIAogIwogIyA0Ry1TeXN0ZW1zIE1UWC0xICJNZXNoQ3ViZSIgd2lyZWxlc3Mgcm91dGVyCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9ib2FyZC1ncHIuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLWdwci5jCmluZGV4IDllZGMzNWYuLmFjZjlhMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLWdwci5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLWdwci5jCkBAIC01MywxMCArNTMsOCBAQAogCXByb21faW5pdF9jbWRsaW5lKCk7CiAKIAltZW1zaXplX3N0ciA9IHByb21fZ2V0ZW52KCJtZW1zaXplIik7Ci0JaWYgKCFtZW1zaXplX3N0cikKKwlpZiAoIW1lbXNpemVfc3RyIHx8IGtzdHJ0b3VsKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSkpCiAJCW1lbXNpemUgPSAweDA0MDAwMDAwOwotCWVsc2UKLQkJc3RyaWN0X3N0cnRvdWwobWVtc2l6ZV9zdHIsIDAsICZtZW1zaXplKTsKIAlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW1zaXplLCBCT09UX01FTV9SQU0pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9ib2FyZC1tdHgxLmMgYi9hcmNoL21pcHMvYWxjaGVteS9ib2FyZC1tdHgxLmMKaW5kZXggOTk2OWRiYS4uMjVhNTlhMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvYm9hcmQtbXR4MS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLW10eDEuYwpAQCAtNTIsMTAgKzUyLDggQEAKIAlwcm9tX2luaXRfY21kbGluZSgpOwogCiAJbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOwotCWlmICghbWVtc2l6ZV9zdHIpCisJaWYgKCFtZW1zaXplX3N0ciB8fCBrc3RydG91bChtZW1zaXplX3N0ciwgMCwgJm1lbXNpemUpKQogCQltZW1zaXplID0gMHgwNDAwMDAwMDsKLQllbHNlCi0JCXN0cmljdF9zdHJ0b3VsKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CiAJYWRkX21lbW9yeV9yZWdpb24oMCwgbWVtc2l6ZSwgQk9PVF9NRU1fUkFNKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwppbmRleCA2MmI0ZTdiLi41NjZhMTc0MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpbmNsdWRlIDxhc20vZG1hLWNvaGVyZW5jZS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKQEAgLTU5LDYgKzYwLDE1IEBACiAJCS8qIENsZWFyIHRvIG9idGFpbiBiZXN0IHN5c3RlbSBidXMgcGVyZm9ybWFuY2UgKi8KIAkJY2xlYXJfYzBfY29uZmlnKDEgPDwgMTkpOyAvKiBDbGVhciBDb25maWdbT0RdICovCiAKKwlod19jb2hlcmVudGlvID0gMDsKKwljb2hlcmVudGlvID0gMTsKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgorCQljb2hlcmVudGlvID0gMDsKKwl9CisKIAlib2FyZF9zZXR1cCgpOwkvKiBib2FyZCBzcGVjaWZpYyBzZXR1cCAqLwogCiAJLyogSU8vTUVNIHJlc291cmNlcy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2xlZXBlci5TCmluZGV4IDcwNmQ5MzMuLmM3M2Q4MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NsZWVwZXIuUwpAQCAtOTUsNyArOTUsNyBAQAogCiAJLyogY2FjaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucywgYXMgbWVtb3J5IGdldHMgcHV0IHRvIHNsZWVwICovCiAJbGEJdDAsIDFmCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCWNhY2hlCTB4MTQsIDAodDApCiAJY2FjaGUJMHgxNCwgMzIodDApCiAJY2FjaGUJMHgxNCwgNjQodDApCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCS8qIGNhY2hlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMsIGFzIG1lbW9yeSBnZXRzIHB1dCB0byBzbGVlcCAqLwogCWxhCXQwLCAxZgotCS5zZXQJbWlwczMKKwkuc2V0CWFyY2g9cjQwMDAKIAljYWNoZQkweDE0LCAwKHQwKQogCWNhY2hlCTB4MTQsIDMyKHQwKQogCWNhY2hlCTB4MTQsIDY0KHQwKQpAQCAtMTYzLDcgKzE2Myw3IEBACiAJbGEJdDEsIDRmCiAJc3VidQl0MiwgdDEsIHQwCiAKLQkuc2V0CW1pcHMzCisJLnNldAlhcmNoPXI0MDAwCiAKIDE6CWNhY2hlCTB4MTQsIDAodDApCiAJc3VidQl0MiwgdDIsIDMyCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvTWFrZWZpbGUgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvTWFrZWZpbGUKaW5kZXggMTViZjczMC4uOWRhMzY1OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZQpAQCAtMiw3ICsyLDUgQEAKICMgQWxjaGVteSBEZXZlbGJvYXJkcwogIwogCi1vYmoteSArPSBiY3NyLm8gcGxhdGZvcm0ubworb2JqLXkgKz0gYmNzci5vIHBsYXRmb3JtLm8gZGIxMDAwLm8gZGIxMjAwLm8gZGIxMzAwLm8gZGIxNTUwLm8gZGIxeHh4Lm8KIG9iai0kKENPTkZJR19QTSkJCSs9IHBtLm8KLW9iai0kKENPTkZJR19NSVBTX0RCMTAwMCkJKz0gZGIxMDAwLm8KLW9iai0kKENPTkZJR19NSVBTX0RCMTIzNSkJKz0gZGIxMjM1Lm8gZGIxMjAwLm8gZGIxMzAwLm8gZGIxNTUwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEwMDAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEwMDAuYwppbmRleCA1NDgzOTA2Li45MmRkOTI5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMDAwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTAwMC5jCkBAIC00MSw0MiArNDEsMjcgQEAKIAogI2RlZmluZSBGX1NXQVBQRUQgKGJjc3JfcmVhZChCQ1NSX1NUQVRVUykgJiBCQ1NSX1NUQVRVU19EQjEwMDBfU1dBUEJPT1QpCiAKLXN0cnVjdCBwY2lfZGV2OworY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpOwogCi1zdGF0aWMgY29uc3QgY2hhciAqYm9hcmRfdHlwZV9zdHIodm9pZCkKLXsKLQlzd2l0Y2ggKEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpKSB7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9EQjEwMDA6Ci0JCXJldHVybiAiREIxMDAwIjsKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTUwMDoKLQkJcmV0dXJuICJEQjE1MDAiOwotCWNhc2UgQkNTUl9XSE9BTUlfREIxMTAwOgotCQlyZXR1cm4gIkRCMTEwMCI7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjE1MDA6Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjE1MDBSMjoKLQkJcmV0dXJuICJQQjE1MDAiOwotCWNhc2UgQkNTUl9XSE9BTUlfUEIxMTAwOgotCQlyZXR1cm4gIlBCMTEwMCI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICIodW5rbm93bikiOwotCX0KLX0KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuIGJvYXJkX3R5cGVfc3RyKCk7Ci19Ci0KLXZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCitpbnQgX19pbml0IGRiMTAwMF9ib2FyZF9zZXR1cCh2b2lkKQogewogCS8qIGluaXRpYWxpemUgYm9hcmQgcmVnaXN0ZXIgc3BhY2UgKi8KIAliY3NyX2luaXQoREIxMDAwX0JDU1JfUEhZU19BRERSLAogCQkgIERCMTAwMF9CQ1NSX1BIWVNfQUREUiArIERCMTAwMF9CQ1NSX0hFWExFRF9PRlMpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgJXMgQm9hcmRcbiIsIGJvYXJkX3R5cGVfc3RyKCkpOworCXN3aXRjaCAoQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSkpIHsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTAwMDoKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTUwMDoKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTEwMDoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMDoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMFIyOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxMTAwOgorCQlwcl9pbmZvKCJBTUQgQWxjaGVteSAlcyBCb2FyZFxuIiwgZ2V0X3N5c3RlbV90eXBlKCkpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLQogc3RhdGljIGludCBkYjE1MDBfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpZiAoKHNsb3QgPCAxMikgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCkBAIC0xMTQsMTcgKzk5LDEwIEBACiAJLnJlc291cmNlCT0gYWxjaGVteV9wY2lfaG9zdF9yZXMsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBkYjE1MDBfcGNpX2luaXQodm9pZCkKK2ludCBfX2luaXQgZGIxNTAwX3BjaV9zZXR1cCh2b2lkKQogewotCWludCBpZCA9IEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpOwotCWlmICgoaWQgPT0gQkNTUl9XSE9BTUlfREIxNTAwKSB8fCAoaWQgPT0gQkNTUl9XSE9BTUlfUEIxNTAwKSB8fAotCSAgICAoaWQgPT0gQkNTUl9XSE9BTUlfUEIxNTAwUjIpKQotCQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYjE1MDBfcGNpX2hvc3RfZGV2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYjE1MDBfcGNpX2hvc3RfZGV2KTsKIH0KLS8qIG11c3QgYmUgYXJjaF9pbml0Y2FsbDsgTUlQUyBQQ0kgc2NhbnMgYnVzc2VzIGluIGEgc3Vic3lzX2luaXRjYWxsICovCi1hcmNoX2luaXRjYWxsKGRiMTUwMF9wY2lfaW5pdCk7Ci0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTExMDBfbGNkX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKQEAgLTUxMyw3ICs0OTEsNyBAQAogCSZkYjEwMDBfaXJkYV9kZXYsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBkYjEwMDBfZGV2X2luaXQodm9pZCkKK2ludCBfX2luaXQgZGIxMDAwX2Rldl9zZXR1cCh2b2lkKQogewogCWludCBib2FyZCA9IEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpOwogCWludCBjMCwgYzEsIGQwLCBkMSwgczAsIHMxLCBmbGFzaHNpemUgPSAzMiwgIHR3b3NvY2tzID0gMTsKQEAgLTYyMyw0ICs2MDEsMyBAQAogCWRiMXhfcmVnaXN0ZXJfbm9yZmxhc2goZmxhc2hzaXplIDw8IDIwLCA0IC8qIDMyYml0ICovLCBGX1NXQVBQRUQpOwogCXJldHVybiAwOwogfQotZGV2aWNlX2luaXRjYWxsKGRiMTAwMF9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwLmMKaW5kZXggYTg0ZDk4Yi4uOWU0NjY2NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIwMC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAuYwpAQCAtMzUsMTYgKzM1LDYzIEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMTAwX21tYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEyMDBmYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTE1NTBfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2Jjc3IuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvZGIxMjAwLmg+CiAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCisjZGVmaW5lIEJDU1JfSU5UX0lERQkJMHgwMDAxCisjZGVmaW5lIEJDU1JfSU5UX0VUSAkJMHgwMDAyCisjZGVmaW5lIEJDU1JfSU5UX1BDMAkJMHgwMDA0CisjZGVmaW5lIEJDU1JfSU5UX1BDMFNUU0NIRwkweDAwMDgKKyNkZWZpbmUgQkNTUl9JTlRfUEMxCQkweDAwMTAKKyNkZWZpbmUgQkNTUl9JTlRfUEMxU1RTQ0hHCTB4MDAyMAorI2RlZmluZSBCQ1NSX0lOVF9EQwkJMHgwMDQwCisjZGVmaW5lIEJDU1JfSU5UX0ZMQVNIQlVTWQkweDAwODAKKyNkZWZpbmUgQkNTUl9JTlRfUEMwSU5TRVJUCTB4MDEwMAorI2RlZmluZSBCQ1NSX0lOVF9QQzBFSkVDVAkweDAyMDAKKyNkZWZpbmUgQkNTUl9JTlRfUEMxSU5TRVJUCTB4MDQwMAorI2RlZmluZSBCQ1NSX0lOVF9QQzFFSkVDVAkweDA4MDAKKyNkZWZpbmUgQkNTUl9JTlRfU0QwSU5TRVJUCTB4MTAwMAorI2RlZmluZSBCQ1NSX0lOVF9TRDBFSkVDVAkweDIwMDAKKyNkZWZpbmUgQkNTUl9JTlRfU0QxSU5TRVJUCTB4NDAwMAorI2RlZmluZSBCQ1NSX0lOVF9TRDFFSkVDVAkweDgwMDAKKworI2RlZmluZSBEQjEyMDBfSURFX1BIWVNfQUREUgkweDE4ODAwMDAwCisjZGVmaW5lIERCMTIwMF9JREVfUkVHX1NISUZUCTUKKyNkZWZpbmUgREIxMjAwX0lERV9QSFlTX0xFTgkoMTYgPDwgREIxMjAwX0lERV9SRUdfU0hJRlQpCisjZGVmaW5lIERCMTIwMF9FVEhfUEhZU19BRERSCTB4MTkwMDAzMDAKKyNkZWZpbmUgREIxMjAwX05BTkRfUEhZU19BRERSCTB4MjAwMDAwMDAKKworI2RlZmluZSBQQjEyMDBfSURFX1BIWVNfQUREUgkweDBDODAwMDAwCisjZGVmaW5lIFBCMTIwMF9FVEhfUEhZU19BRERSCTB4MEQwMDAzMDAKKyNkZWZpbmUgUEIxMjAwX05BTkRfUEhZU19BRERSCTB4MUMwMDAwMDAKKworI2RlZmluZSBEQjEyMDBfSU5UX0JFR0lOCShBVTEwMDBfTUFYX0lOVFIgKyAxKQorI2RlZmluZSBEQjEyMDBfSURFX0lOVAkJKERCMTIwMF9JTlRfQkVHSU4gKyAwKQorI2RlZmluZSBEQjEyMDBfRVRIX0lOVAkJKERCMTIwMF9JTlRfQkVHSU4gKyAxKQorI2RlZmluZSBEQjEyMDBfUEMwX0lOVAkJKERCMTIwMF9JTlRfQkVHSU4gKyAyKQorI2RlZmluZSBEQjEyMDBfUEMwX1NUU0NIR19JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyAzKQorI2RlZmluZSBEQjEyMDBfUEMxX0lOVAkJKERCMTIwMF9JTlRfQkVHSU4gKyA0KQorI2RlZmluZSBEQjEyMDBfUEMxX1NUU0NIR19JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyA1KQorI2RlZmluZSBEQjEyMDBfRENfSU5UCQkoREIxMjAwX0lOVF9CRUdJTiArIDYpCisjZGVmaW5lIERCMTIwMF9GTEFTSEJVU1lfSU5UCShEQjEyMDBfSU5UX0JFR0lOICsgNykKKyNkZWZpbmUgREIxMjAwX1BDMF9JTlNFUlRfSU5UCShEQjEyMDBfSU5UX0JFR0lOICsgOCkKKyNkZWZpbmUgREIxMjAwX1BDMF9FSkVDVF9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyA5KQorI2RlZmluZSBEQjEyMDBfUEMxX0lOU0VSVF9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyAxMCkKKyNkZWZpbmUgREIxMjAwX1BDMV9FSkVDVF9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyAxMSkKKyNkZWZpbmUgREIxMjAwX1NEMF9JTlNFUlRfSU5UCShEQjEyMDBfSU5UX0JFR0lOICsgMTIpCisjZGVmaW5lIERCMTIwMF9TRDBfRUpFQ1RfSU5UCShEQjEyMDBfSU5UX0JFR0lOICsgMTMpCisjZGVmaW5lIFBCMTIwMF9TRDFfSU5TRVJUX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDE0KQorI2RlZmluZSBQQjEyMDBfU0QxX0VKRUNUX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDE1KQorI2RlZmluZSBEQjEyMDBfSU5UX0VORAkJKERCMTIwMF9JTlRfQkVHSU4gKyAxNSkKKwogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpOwogCiBzdGF0aWMgaW50IF9faW5pdCBkYjEyMDBfZGV0ZWN0X2JvYXJkKHZvaWQpCkBAIC04OSw2ICsxMzYsMTUgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAl3aG9hbWkgPSBiY3NyX3JlYWQoQkNTUl9XSE9BTUkpOworCXN3aXRjaCAoQkNTUl9XSE9BTUlfQk9BUkQod2hvYW1pKSkgeworCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjE6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMjoKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTIwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteS9BTUQvUk1JICVzIEJvYXJkLCBDUExEIFJldiAlZCIKIAkJIiAgQm9hcmQtSUQgJWQJRGF1Z2h0ZXJjYXJkIElEICVkXG4iLCBnZXRfc3lzdGVtX3R5cGUoKSwKIAkJKHdob2FtaSA+PiA0KSAmIDB4ZiwgKHdob2FtaSA+PiA4KSAmIDB4Ziwgd2hvYW1pICYgMHhmKTsKQEAgLTI3NSwzMiArMzMxLDM4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgc3RydWN0IHBhdGFfcGxhdGZvcm1faW5mbyBkYjEyMDBfaWRlX2luZm8gPSB7CisJLmlvcG9ydF9zaGlmdAk9IERCMTIwMF9JREVfUkVHX1NISUZULAorfTsKKworI2RlZmluZSBJREVfQUxUX1NUQVJUCSgxNCA8PCBEQjEyMDBfSURFX1JFR19TSElGVCkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGIxMjAwX2lkZV9yZXNbXSA9IHsKIAlbMF0gPSB7CiAJCS5zdGFydAk9IERCMTIwMF9JREVfUEhZU19BRERSLAotCQkuZW5kCT0gREIxMjAwX0lERV9QSFlTX0FERFIgKyBEQjEyMDBfSURFX1BIWVNfTEVOIC0gMSwKKwkJLmVuZAk9IERCMTIwMF9JREVfUEhZU19BRERSICsgSURFX0FMVF9TVEFSVCAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0geworCQkuc3RhcnQJPSBEQjEyMDBfSURFX1BIWVNfQUREUiArIElERV9BTFRfU1RBUlQsCisJCS5lbmQJPSBEQjEyMDBfSURFX1BIWVNfQUREUiArIERCMTIwMF9JREVfUEhZU19MRU4gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyXSA9IHsKIAkJLnN0YXJ0CT0gREIxMjAwX0lERV9JTlQsCiAJCS5lbmQJPSBEQjEyMDBfSURFX0lOVCwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKLQlbMl0gPSB7Ci0JCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEsCi0JCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX0RNQV9SRVExLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKLQl9LAogfTsKIAogc3RhdGljIHU2NCBhdTEyMDBfaWRlX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfaWRlX2RldiA9IHsKLQkubmFtZQkJPSAiYXUxMjAwLWlkZSIsCisJLm5hbWUJCT0gInBhdGFfcGxhdGZvcm0iLAogCS5pZAkJPSAwLAogCS5kZXYgPSB7CiAJCS5kbWFfbWFzawkJPSAmYXUxMjAwX2lkZV9kbWFtYXNrLAogCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmZGIxMjAwX2lkZV9pbmZvLAogCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRiMTIwMF9pZGVfcmVzKSwKIAkucmVzb3VyY2UJPSBkYjEyMDBfaWRlX3JlcywKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMzUuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMzUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMTlkYy4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogREIxMjAwL1BCMTIwMCAvIERCMTU1MCAvIERCMTMwMCBib2FyZCBzdXBwb3J0LgotICoKLSAqIFRoZXNlIDQgYm9hcmRzIGNhbiByZWxpYWJseSBiZSBzdXBwb3J0ZWQgaW4gYSBzaW5nbGUga2VybmVsIGltYWdlLgotICovCi0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2Jjc3IuaD4KLQotaW50IF9faW5pdCBkYjEyMDBfYm9hcmRfc2V0dXAodm9pZCk7Ci1pbnQgX19pbml0IGRiMTIwMF9kZXZfc2V0dXAodm9pZCk7Ci1pbnQgX19pbml0IGRiMTMwMF9ib2FyZF9zZXR1cCh2b2lkKTsKLWludCBfX2luaXQgZGIxMzAwX2Rldl9zZXR1cCh2b2lkKTsKLWludCBfX2luaXQgZGIxNTUwX2JvYXJkX3NldHVwKHZvaWQpOwotaW50IF9faW5pdCBkYjE1NTBfZGV2X3NldHVwKHZvaWQpOwotaW50IF9faW5pdCBkYjE1NTBfcGNpX3NldHVwKGludCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpib2FyZF90eXBlX3N0cih2b2lkKQotewotCXN3aXRjaCAoQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSkpIHsKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTIwMF9ERFIxOgotCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjI6Ci0JCXJldHVybiAiUEIxMjAwIjsKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTIwMDoKLQkJcmV0dXJuICJEQjEyMDAiOwotCWNhc2UgQkNTUl9XSE9BTUlfREIxMzAwOgotCQlyZXR1cm4gIkRCMTMwMCI7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9EQjE1NTA6Ci0JCXJldHVybiAiREIxNTUwIjsKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9TRFI6Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSOgotCQlyZXR1cm4gIlBCMTU1MCI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICIodW5rbm93bikiOwotCX0KLX0KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuIGJvYXJkX3R5cGVfc3RyKCk7Ci19Ci0KLXZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7Ci0JY2FzZSBBTENIRU1ZX0NQVV9BVTE1NTA6Ci0JCXJldCA9IGRiMTU1MF9ib2FyZF9zZXR1cCgpOwotCQlicmVhazsKLQljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKLQkJcmV0ID0gZGIxMjAwX2JvYXJkX3NldHVwKCk7Ci0JCWJyZWFrOwotCWNhc2UgQUxDSEVNWV9DUFVfQVUxMzAwOgotCQlyZXQgPSBkYjEzMDBfYm9hcmRfc2V0dXAoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBDUFUgb24gYm9hcmRcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCX0KLQlpZiAocmV0KQotCQlwYW5pYygiY2Fubm90IGluaXRpYWxpemUgYm9hcmQgc3VwcG9ydCIpOwotfQotCi1pbnQgX19pbml0IGRiMTIzNV9hcmNoX2luaXQodm9pZCkKLXsKLQlpbnQgaWQgPSBCQ1NSX1dIT0FNSV9CT0FSRChiY3NyX3JlYWQoQkNTUl9XSE9BTUkpKTsKLQlpZiAoaWQgPT0gQkNTUl9XSE9BTUlfREIxNTUwKQotCQlyZXR1cm4gZGIxNTUwX3BjaV9zZXR1cCgwKTsKLQllbHNlIGlmICgoaWQgPT0gQkNTUl9XSE9BTUlfUEIxNTUwX1NEUikgfHwKLQkJIChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSKSkKLQkJcmV0dXJuIGRiMTU1MF9wY2lfc2V0dXAoMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLWFyY2hfaW5pdGNhbGwoZGIxMjM1X2FyY2hfaW5pdCk7Ci0KLWludCBfX2luaXQgZGIxMjM1X2Rldl9pbml0KHZvaWQpCi17Ci0Jc3dpdGNoIChCQ1NSX1dIT0FNSV9CT0FSRChiY3NyX3JlYWQoQkNTUl9XSE9BTUkpKSkgewotCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjE6Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMjoKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTIwMDoKLQkJcmV0dXJuIGRiMTIwMF9kZXZfc2V0dXAoKTsKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTMwMDoKLQkJcmV0dXJuIGRiMTMwMF9kZXZfc2V0dXAoKTsKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTU1MDoKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9TRFI6Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSOgotCQlyZXR1cm4gZGIxNTUwX2Rldl9zZXR1cCgpOwotCX0KLQlyZXR1cm4gMDsKLX0KLWRldmljZV9pbml0Y2FsbChkYjEyMzVfZGV2X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTMwMC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTMwMC5jCmluZGV4IDYxNjdlNzMuLjFhZWQ2YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEzMDAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMzAwLmMKQEAgLTI2LDEyICsyNiw0NCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEyMDBmYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9kYjEzMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9wcm9tLmg+CiAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCisvKiBGUEdBIChleHRlcm5hbCBtdXgpIGludGVycnVwdCBzb3VyY2VzICovCisjZGVmaW5lIERCMTMwMF9GSVJTVF9JTlQJKEFMQ0hFTVlfR1BJQ19JTlRfTEFTVCArIDEpCisjZGVmaW5lIERCMTMwMF9JREVfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDApCisjZGVmaW5lIERCMTMwMF9FVEhfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDEpCisjZGVmaW5lIERCMTMwMF9DRl9JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMikKKyNkZWZpbmUgREIxMzAwX1ZJREVPX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDQpCisjZGVmaW5lIERCMTMwMF9IRE1JX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyA1KQorI2RlZmluZSBEQjEzMDBfRENfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDYpCisjZGVmaW5lIERCMTMwMF9GTEFTSF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyA3KQorI2RlZmluZSBEQjEzMDBfQ0ZfSU5TRVJUX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDgpCisjZGVmaW5lIERCMTMwMF9DRl9FSkVDVF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyA5KQorI2RlZmluZSBEQjEzMDBfQUM5N19JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMTApCisjZGVmaW5lIERCMTMwMF9BQzk3X1BFTl9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyAxMSkKKyNkZWZpbmUgREIxMzAwX1NEMV9JTlNFUlRfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgMTIpCisjZGVmaW5lIERCMTMwMF9TRDFfRUpFQ1RfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgMTMpCisjZGVmaW5lIERCMTMwMF9PVEdfVkJVU19PQ19JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyAxNCkKKyNkZWZpbmUgREIxMzAwX0hPU1RfVkJVU19PQ19JTlQgKERCMTMwMF9GSVJTVF9JTlQgKyAxNSkKKyNkZWZpbmUgREIxMzAwX0xBU1RfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDE1KQorCisvKiBTTVNDOTIxMCBDUyAqLworI2RlZmluZSBEQjEzMDBfRVRIX1BIWVNfQUREUgkweDE5MDAwMDAwCisjZGVmaW5lIERCMTMwMF9FVEhfUEhZU19FTkQJMHgxOTdmZmZmZgorCisvKiBBVEEgQ1MgKi8KKyNkZWZpbmUgREIxMzAwX0lERV9QSFlTX0FERFIJMHgxODgwMDAwMAorI2RlZmluZSBEQjEzMDBfSURFX1JFR19TSElGVAk1CisjZGVmaW5lIERCMTMwMF9JREVfUEhZU19MRU4JKDE2IDw8IERCMTMwMF9JREVfUkVHX1NISUZUKQorCisvKiBOQU5EIENTICovCisjZGVmaW5lIERCMTMwMF9OQU5EX1BIWVNfQUREUgkweDIwMDAwMDAwCisjZGVmaW5lIERCMTMwMF9OQU5EX1BIWVNfRU5ECTB4MjAwMDBmZmYKKworCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGRiMTMwMF9pMmNfZGV2c1tdIF9faW5pdGRhdGEgPSB7CiAJeyBJMkNfQk9BUkRfSU5GTygid204NzMxIiwgMHgxYiksIH0sCS8qIEkyUyBhdWRpbyBjb2RlYyAqLwogCXsgSTJDX0JPQVJEX0lORk8oIm5lMTYxOSIsIDB4MmQpLCB9LAkvKiBhZG0xMDI1LWNvbXBhdCBod21vbiAqLwpAQCAtNzU5LDExICs3OTEsMTUgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB3aG9hbWk7CiAKLQlkYjEzMDBfZ3Bpb19jb25maWcoKTsKIAliY3NyX2luaXQoREIxMzAwX0JDU1JfUEhZU19BRERSLAogCQkgIERCMTMwMF9CQ1NSX1BIWVNfQUREUiArIERCMTMwMF9CQ1NSX0hFWExFRF9PRlMpOwogCiAJd2hvYW1pID0gYmNzcl9yZWFkKEJDU1JfV0hPQU1JKTsKKwlpZiAoQkNTUl9XSE9BTUlfQk9BUkQod2hvYW1pKSAhPSBCQ1NSX1dIT0FNSV9EQjEzMDApCisJCXJldHVybiAtRU5PREVWOworCisJZGIxMzAwX2dwaW9fY29uZmlnKCk7CisKIAlwcmludGsoS0VSTl9JTkZPICJOZXRMb2dpYyBEQkF1MTMwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybS5cblx0IgogCQkiQm9hcmRJRCAlZCAgIENQTEQgUmV2ICVkICAgRGF1Z2h0ZXJjYXJkSUQgJWRcbiIsCiAJCUJDU1JfV0hPQU1JX0JPQVJEKHdob2FtaSksIEJDU1JfV0hPQU1JX0NQTEQod2hvYW1pKSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjE1NTAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjE1NTAuYwppbmRleCAwMTZjZGRhLi5iYmQ4ZDk4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxNTUwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTU1MC5jCkBAIC02MiwxMCArNjIsMTYgQEAKIAkJICBEQjE1NTBfQkNTUl9QSFlTX0FERFIgKyBEQjE1NTBfQkNTUl9IRVhMRURfT0ZTKTsKIAogCXdob2FtaSA9IGJjc3JfcmVhZChCQ1NSX1dIT0FNSSk7IC8qIFBCMTU1MCBoZXhsZWQgb2Zmc2V0IGRpZmZlcnMgKi8KLQlpZiAoKEJDU1JfV0hPQU1JX0JPQVJEKHdob2FtaSkgPT0gQkNTUl9XSE9BTUlfUEIxNTUwX1NEUikgfHwKLQkgICAgKEJDU1JfV0hPQU1JX0JPQVJEKHdob2FtaSkgPT0gQkNTUl9XSE9BTUlfUEIxNTUwX0REUikpCisJc3dpdGNoIChCQ1NSX1dIT0FNSV9CT0FSRCh3aG9hbWkpKSB7CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfU0RSOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTUwX0REUjoKIAkJYmNzcl9pbml0KFBCMTU1MF9CQ1NSX1BIWVNfQUREUiwKIAkJCSAgUEIxNTUwX0JDU1JfUEhZU19BRERSICsgUEIxNTUwX0JDU1JfSEVYTEVEX09GUyk7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjE1NTA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCXByX2luZm8oIkFsY2hlbXkvQU1EICVzIEJvYXJkLCBDUExEIFJldiAlZCBCb2FyZC1JRCAlZAkiCVwKIAkJIkRhdWdodGVyY2FyZCBJRCAlZFxuIiwgZ2V0X3N5c3RlbV90eXBlKCksCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeHh4LmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0N2Y5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4eHguYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIEFsY2hlbXkgREIvUEIxeHh4IGJvYXJkIHN1cHBvcnQuCisgKi8KKworI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgorCitpbnQgX19pbml0IGRiMTAwMF9ib2FyZF9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxMDAwX2Rldl9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxNTAwX3BjaV9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxMjAwX2JvYXJkX3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjEyMDBfZGV2X3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjEzMDBfYm9hcmRfc2V0dXAodm9pZCk7CitpbnQgX19pbml0IGRiMTMwMF9kZXZfc2V0dXAodm9pZCk7CitpbnQgX19pbml0IGRiMTU1MF9ib2FyZF9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxNTUwX2Rldl9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxNTUwX3BjaV9zZXR1cChpbnQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRfdHlwZV9zdHIodm9pZCkKK3sKKwlzd2l0Y2ggKEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpKSB7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjEwMDA6CisJCXJldHVybiAiREIxMDAwIjsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTUwMDoKKwkJcmV0dXJuICJEQjE1MDAiOworCWNhc2UgQkNTUl9XSE9BTUlfREIxMTAwOgorCQlyZXR1cm4gIkRCMTEwMCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1MDA6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1MDBSMjoKKwkJcmV0dXJuICJQQjE1MDAiOworCWNhc2UgQkNTUl9XSE9BTUlfUEIxMTAwOgorCQlyZXR1cm4gIlBCMTEwMCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMToKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTIwMF9ERFIyOgorCQlyZXR1cm4gIlBCMTIwMCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjEyMDA6CisJCXJldHVybiAiREIxMjAwIjsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTMwMDoKKwkJcmV0dXJuICJEQjEzMDAiOworCWNhc2UgQkNTUl9XSE9BTUlfREIxNTUwOgorCQlyZXR1cm4gIkRCMTU1MCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfU0RSOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTUwX0REUjoKKwkJcmV0dXJuICJQQjE1NTAiOworCWRlZmF1bHQ6CisJCXJldHVybiAiKHVua25vd24pIjsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiBib2FyZF90eXBlX3N0cigpOworfQorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgorCQlyZXQgPSBkYjEwMDBfYm9hcmRfc2V0dXAoKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1NTA6CisJCXJldCA9IGRiMTU1MF9ib2FyZF9zZXR1cCgpOworCQlicmVhazsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwkJcmV0ID0gZGIxMjAwX2JvYXJkX3NldHVwKCk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMzAwOgorCQlyZXQgPSBkYjEzMDBfYm9hcmRfc2V0dXAoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBDUFUgb24gYm9hcmRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCX0KKwlpZiAocmV0KQorCQlwYW5pYygiY2Fubm90IGluaXRpYWxpemUgYm9hcmQgc3VwcG9ydCIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkYjF4eHhfYXJjaF9pbml0KHZvaWQpCit7CisJaW50IGlkID0gQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSk7CisJaWYgKGlkID09IEJDU1JfV0hPQU1JX0RCMTU1MCkKKwkJcmV0dXJuIGRiMTU1MF9wY2lfc2V0dXAoMCk7CisJZWxzZSBpZiAoKGlkID09IEJDU1JfV0hPQU1JX1BCMTU1MF9TRFIpIHx8CisJCSAoaWQgPT0gQkNTUl9XSE9BTUlfUEIxNTUwX0REUikpCisJCXJldHVybiBkYjE1NTBfcGNpX3NldHVwKDEpOworCWVsc2UgaWYgKChpZCA9PSBCQ1NSX1dIT0FNSV9EQjE1MDApIHx8IChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1MDApIHx8CisJCSAoaWQgPT0gQkNTUl9XSE9BTUlfUEIxNTAwUjIpKQorCQlyZXR1cm4gZGIxNTAwX3BjaV9zZXR1cCgpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGRiMXh4eF9hcmNoX2luaXQpOworCitzdGF0aWMgaW50IF9faW5pdCBkYjF4eHhfZGV2X2luaXQodm9pZCkKK3sKKwlzd2l0Y2ggKEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpKSB7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjEwMDA6CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjE1MDA6CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjExMDA6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1MDA6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1MDBSMjoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTEwMDoKKwkJcmV0dXJuIGRiMTAwMF9kZXZfc2V0dXAoKTsKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTIwMF9ERFIxOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjI6CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjEyMDA6CisJCXJldHVybiBkYjEyMDBfZGV2X3NldHVwKCk7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjEzMDA6CisJCXJldHVybiBkYjEzMDBfZGV2X3NldHVwKCk7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjE1NTA6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfU0RSOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTUwX0REUjoKKwkJcmV0dXJuIGRiMTU1MF9kZXZfc2V0dXAoKTsKKwl9CisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoZGIxeHh4X2Rldl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hcjcvdGltZS5jIGIvYXJjaC9taXBzL2FyNy90aW1lLmMKaW5kZXggMWRjNmMzYi4uMjJjOTMyMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FyNy90aW1lLmMKKysrIGIvYXJjaC9taXBzL2FyNy90aW1lLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIFNldHRpbmcgdXAgdGhlIGNsb2NrIG9uIHRoZSBNSVBTIGJvYXJkcy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdGg3OS9LY29uZmlnIGIvYXJjaC9taXBzL2F0aDc5L0tjb25maWcKaW5kZXggMzk5NWUzMS4uZGZjNjAyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F0aDc5L0tjb25maWcKKysrIGIvYXJjaC9taXBzL2F0aDc5L0tjb25maWcKQEAgLTc0LDM0ICs3NCwyNiBAQAogZW5kbWVudQogCiBjb25maWcgU09DX0FSNzFYWAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBIV19IQVNfUENJCiAJZGVmX2Jvb2wgbgogCiBjb25maWcgU09DX0FSNzI0WAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFBDSV9BUjcyNFggaWYgUENJCiAJZGVmX2Jvb2wgbgogCiBjb25maWcgU09DX0FSOTEzWAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCWRlZl9ib29sIG4KIAogY29uZmlnIFNPQ19BUjkzM1gKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlkZWZfYm9vbCBuCiAKIGNvbmZpZyBTT0NfQVI5MzRYCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgUENJX0FSNzI0WCBpZiBQQ0kKIAlkZWZfYm9vbCBuCiAKIGNvbmZpZyBTT0NfUUNBOTU1WAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFBDSV9BUjcyNFggaWYgUENJCiAJZGVmX2Jvb2wgbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvTWFrZWZpbGUgYi9hcmNoL21pcHMvYmNtNDd4eC9NYWtlZmlsZQppbmRleCA0Njg4YjZhLi5kNThjNTFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYmNtNDd4eC9NYWtlZmlsZQpAQCAtNCw0ICs0LDQgQEAKICMKIAogb2JqLXkJCQkJKz0gaXJxLm8gbnZyYW0ubyBwcm9tLm8gc2VyaWFsLm8gc2V0dXAubyB0aW1lLm8gc3Byb20ubwotb2JqLXkJCQkJKz0gYm9hcmQubyBidXR0b25zLm8gbGVkcy5vCitvYmoteQkJCQkrPSBib2FyZC5vIGJ1dHRvbnMubyBsZWRzLm8gd29ya2Fyb3VuZHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvYmNtNDd4eF9wcml2YXRlLmggYi9hcmNoL21pcHMvYmNtNDd4eC9iY200N3h4X3ByaXZhdGUuaAppbmRleCA1Yzk0YWNlLi4wMTk0YzNiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9iY200N3h4X3ByaXZhdGUuaAorKysgYi9hcmNoL21pcHMvYmNtNDd4eC9iY200N3h4X3ByaXZhdGUuaApAQCAtOSw0ICs5LDcgQEAKIC8qIGxlZHMuYyAqLwogdm9pZCBfX2luaXQgYmNtNDd4eF9sZWRzX3JlZ2lzdGVyKHZvaWQpOwogCisvKiB3b3JrYXJvdW5kcy5jICovCit2b2lkIF9faW5pdCBiY200N3h4X3dvcmthcm91bmRzKHZvaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L2JvYXJkLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9ib2FyZC5jCmluZGV4IDZkNjEyZTIuLjQ0YWIxYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2JvYXJkLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvYm9hcmQuYwpAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbTQ3eHhfYm9hcmQuaD4KQEAgLTcxLDcgKzcyLDExIEBACiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfV0w1MDBXLCAiQXN1cyBXTDUwMFcifSwgIldMNTAwZ1ctIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfV0w1MjBHQywgIkFzdXMgV0w1MjBHQyJ9LCAiV0w1MjBHQy0ifSwKIAl7e0JDTTQ3WFhfQk9BUkRfQVNVU19XTDUyMEdVLCAiQXN1cyBXTDUyMEdVIn0sICJXTDUyMEdVLSJ9LAorCXt7QkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdEMzMwMSwgIkJlbGtpbiBGN0QzMzAxIn0sICJGN0QzMzAxIn0sCisJe3tCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0QzMzAyLCAiQmVsa2luIEY3RDMzMDIifSwgIkY3RDMzMDIifSwKIAl7e0JDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQzMDEsICJCZWxraW4gRjdENDMwMSJ9LCAiRjdENDMwMSJ9LAorCXt7QkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMiwgIkJlbGtpbiBGN0Q0MzAyIn0sICJGN0Q0MzAyIn0sCisJe3tCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0NDAxLCAiQmVsa2luIEY3RDQ0MDEifSwgIkY3RDQ0MDEifSwKIAl7IHswfSwgTlVMTH0sCiB9OwogCkBAIC0xNzUsNyArMTgwLDE2IEBACiAJe3tCQ000N1hYX0JPQVJEX1BISUNPTU1fTTEsICJQaGljb21tIE0xIn0sICIweDA1OTAiLCAiODAiLCAiMHgxMTA0In0sCiAJe3tCQ000N1hYX0JPQVJEX1pURV9IMjE4TiwgIlpURSBIMjE4TiJ9LCAiMHgwNTNkIiwgIjEyMzQiLCAiMHgxMzA1In0sCiAJe3tCQ000N1hYX0JPQVJEX05FVEdFQVJfV05SMzUwMEwsICJOZXRnZWFyIFdOUjM1MDBMIn0sICIweDA0Q0YiLCAiMzUwMCIsICIwMiJ9LAotCXt7QkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0R1NWMSwgIkxpbmtzeXMgV1JUNTRHUyBWMSJ9LCAiMHgwMTAxIiwgIjQyIiwgIjB4MTAifSwKKwl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEcsICJMaW5rc3lzIFdSVDU0Ry9HUy9HTCJ9LCAiMHgwMTAxIiwgIjQyIiwgIjB4MTAifSwKKwl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEcsICJMaW5rc3lzIFdSVDU0Ry9HUy9HTCJ9LCAiMHgwNDY3IiwgIjQyIiwgIjB4MTAifSwKKwl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEcsICJMaW5rc3lzIFdSVDU0Ry9HUy9HTCJ9LCAiMHgwNzA4IiwgIjQyIiwgIjB4MTAifSwKKwl7IHswfSwgTlVMTH0sCit9OworCisvKiBib2FyZHR5cGUsIGJvYXJkcmV2ICovCitzdGF0aWMgY29uc3QKK3N0cnVjdCBiY200N3h4X2JvYXJkX3R5cGVfbGlzdDIgYmNtNDd4eF9ib2FyZF9saXN0X2JvYXJkX3R5cGVfcmV2W10gX19pbml0Y29uc3QgPSB7CisJe3tCQ000N1hYX0JPQVJEX1NJRU1FTlNfU0U1MDVWMiwgIlNpZW1lbnMgU0U1MDUgVjIifSwgIjB4MDEwMSIsICIweDEwIn0sCiAJeyB7MH0sIE5VTEx9LAogfTsKIApAQCAtMjcyLDYgKzI4NiwxNiBAQAogCQkJCXJldHVybiAmZTMtPmJvYXJkOwogCQl9CiAJfQorCisJaWYgKGJjbTQ3eHhfbnZyYW1fZ2V0ZW52KCJib2FyZHR5cGUiLCBidWYxLCBzaXplb2YoYnVmMSkpID49IDAgJiYKKwkgICAgYmNtNDd4eF9udnJhbV9nZXRlbnYoImJvYXJkcmV2IiwgYnVmMiwgc2l6ZW9mKGJ1ZjIpKSA+PSAwICYmCisJICAgIGJjbTQ3eHhfbnZyYW1fZ2V0ZW52KCJib2FyZG51bSIsIGJ1ZjMsIHNpemVvZihidWYzKSkgPT0gIC1FTk9FTlQpIHsKKwkJZm9yIChlMiA9IGJjbTQ3eHhfYm9hcmRfbGlzdF9ib2FyZF90eXBlX3JldjsgZTItPnZhbHVlMTsgZTIrKykgeworCQkJaWYgKCFzdHJjbXAoYnVmMSwgZTItPnZhbHVlMSkgJiYKKwkJCSAgICAhc3RyY21wKGJ1ZjIsIGUyLT52YWx1ZTIpKQorCQkJCXJldHVybiAmZTItPmJvYXJkOworCQl9CisJfQogCXJldHVybiBiY200N3h4X2JvYXJkX3Vua25vd247CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L2J1dHRvbnMuYyBiL2FyY2gvbWlwcy9iY200N3h4L2J1dHRvbnMuYwppbmRleCA4NzJjNjJlLi40OWExY2UwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9idXR0b25zLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvYnV0dG9ucy5jCkBAIC0yNTksNiArMjU5LDE4IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDU0ZzNndjJbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDUsIEtFWV9XSU1BWCksCisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDU0Z3N2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1dQU19CVVRUT04pLAorCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCiBiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQ2MTBudjFbXSBfX2luaXRjb25zdCA9IHsKIAlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKIAlCQ000N1hYX0dQSU9fS0VZKDgsIEtFWV9XUFNfQlVUVE9OKSwKQEAgLTI3MCw2ICsyODIsMTIgQEAKIAlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0c2w1NGdzW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCiAvKiBNb3Rvcm9sYSAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KQEAgLTQwMiw3ICs0MjAsMTEgQEAKIAkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19hc3VzX3dsaGRkKTsKIAkJYnJlYWs7CiAKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDMzMDE6CisJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0QzMzAyOgogCWNhc2UgQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMToKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQzMDI6CisJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0NDAxOgogCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2JlbGtpbl9mN2Q0MzAxKTsKIAkJYnJlYWs7CiAKQEAgLTQ3OSwxMiArNTAxLDIxIEBACiAJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUMzEwTlYxOgogCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0MzEwbnYxKTsKIAkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NTRnc3YxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHM0dWMjoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDU0ZzNndjIpOworCQlicmVhazsKIAljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjE6CiAJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQ2MTBudjEpOwogCQlicmVhazsKIAljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjI6CiAJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQ2MTBudjIpOwogCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlRTTDU0R1M6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnRzbDU0Z3MpOworCQlicmVhazsKIAogCWNhc2UgQkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XRTgwMEc6CiAJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbW90b3JvbGFfd2U4MDBnKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L2xlZHMuYyBiL2FyY2gvbWlwcy9iY200N3h4L2xlZHMuYwppbmRleCA2NDdkMTU1Li5hZGNiNTQ3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9sZWRzLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvbGVkcy5jCkBAIC0yOTIsNiArMjkyLDIxIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfbGlua3N5c193cnQ1NGdzdjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJ1bmsiLCAiZG16IiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDUsICJ3aGl0ZSIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJvcmFuZ2UiLCAid3BzIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfbGlua3N5c193cnQ1NGczZ3YyW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJncmVlbiIsICIzZyIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMywgImJsdWUiLCAiM2ciLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKIGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDYxMG52MVtdIF9faW5pdGNvbnN0ID0gewogCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJ1c2IiLCAgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCiAJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLApAQCAtMzA4LDYgKzMyMywxNSBAQAogCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJ1c2IiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX3dydHNsNTRnc1tdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJ3bGFuIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJ3aGl0ZSIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJvcmFuZ2UiLCAid3BzIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg3LCAidW5rIiwgImRteiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKwogLyogTW90b3JvbGEgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZApAQCAtMzU5LDYgKzM4MywxNCBAQAogCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJjb25uZWN0ZWQiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKIH07CiAKKy8qIFNpZW1lbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19zaWVtZW5zX3NlNTA1djJbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJ1bmsiLCAiZG16IiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAidW5rIiwgIndsYW4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDUsICJ1bmsiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorfTsKKwogLyogU2ltcGxlVGVjaCAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCkBAIC00MjUsNyArNDU3LDExIEBACiAJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3dsaGRkKTsKIAkJYnJlYWs7CiAKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDMzMDE6CisJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0QzMzAyOgogCWNhc2UgQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMToKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQzMDI6CisJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0NDAxOgogCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYmVsa2luX2Y3ZDQzMDEpOwogCQlicmVhazsKIApAQCAtNTAyLDEyICs1MzgsMjEgQEAKIAljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQzMTBOVjE6CiAJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDMxMG52MSk7CiAJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0RzoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0NTRnc3YxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHM0dWMjoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0NTRnM2d2Mik7CisJCWJyZWFrOwogCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDYxME5WMToKIAkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0NjEwbnYxKTsKIAkJYnJlYWs7CiAJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNjEwTlYyOgogCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c193cnQ2MTBudjIpOwogCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlRTTDU0R1M6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydHNsNTRncyk7CisJCWJyZWFrOwogCiAJY2FzZSBCQ000N1hYX0JPQVJEX01PVE9ST0xBX1dFODAwRzoKIAkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX21vdG9yb2xhX3dlODAwZyk7CkBAIC01MjksNiArNTc0LDEwIEBACiAJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19uZXRnZWFyX3ducjgzNGJ2Mik7CiAJCWJyZWFrOwogCisJY2FzZSBCQ000N1hYX0JPQVJEX1NJRU1FTlNfU0U1MDVWMjoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX3NpZW1lbnNfc2U1MDV2Mik7CisJCWJyZWFrOworCiAJY2FzZSBCQ000N1hYX0JPQVJEX1NJTVBMRVRFQ0hfU0lNUExFU0hBUkU6CiAJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19zaW1wbGV0ZWNoX3NpbXBsZXNoYXJlKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9udnJhbS5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYwppbmRleCA2ZGVjYjI3Li4yYmVkNzNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9udnJhbS5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCWNoYXIgbnZyYW1fdmFyWzEwXTsKIAljaGFyIGJ1ZlszMF07CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAJCWVyciA9IHNucHJpbnRmKG52cmFtX3Zhciwgc2l6ZW9mKG52cmFtX3ZhciksICJncGlvJWkiLCBpKTsKIAkJaWYgKGVyciA8PSAwKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwppbmRleCAwMjViZTIxLi42M2E0YjBlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogewogCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKIAotCWlmIChjLT5jcHV0eXBlID09IENQVV83NEspIHsKKwlpZiAoKGMtPmNwdXR5cGUgPT0gQ1BVXzc0SykgfHwgKGMtPmNwdXR5cGUgPT0gQ1BVXzEwNzRLKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJiY200N3h4OiB1c2luZyBiY21hIGJ1c1xuIik7CiAjaWZkZWYgQ09ORklHX0JDTTQ3WFhfQkNNQQogCQliY200N3h4X2J1c190eXBlID0gQkNNNDdYWF9CVVNfVFlQRV9CQ01BOwpAQCAtMjgyLDYgKzI4Miw3IEBACiAJfQogCWJjbTQ3eHhfYnV0dG9uc19yZWdpc3RlcigpOwogCWJjbTQ3eHhfbGVkc19yZWdpc3RlcigpOworCWJjbTQ3eHhfd29ya2Fyb3VuZHMoKTsKIAogCWZpeGVkX3BoeV9hZGQoUEhZX1BPTEwsIDAsICZiY200N3h4X2ZpeGVkX3BoeV9zdGF0dXMpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvd29ya2Fyb3VuZHMuYyBiL2FyY2gvbWlwcy9iY200N3h4L3dvcmthcm91bmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxY2U0NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3dvcmthcm91bmRzLmMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgImJjbTQ3eHhfcHJpdmF0ZS5oIgorCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGJjbTQ3eHhfYm9hcmQuaD4KKyNpbmNsdWRlIDxiY200N3h4Lmg+CisKK3N0YXRpYyB2b2lkIF9faW5pdCBiY200N3h4X3dvcmthcm91bmRzX25ldGdlYXJfd25yMzUwMGwodm9pZCkKK3sKKwljb25zdCBpbnQgdXNiX3Bvd2VyID0gMTI7CisJaW50IGVycjsKKworCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUodXNiX3Bvd2VyLCBHUElPRl9PVVRfSU5JVF9ISUdILCAidXNiX3Bvd2VyIik7CisJaWYgKGVycikKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVxdWVzdCBVU0IgcG93ZXIgZ3BpbzogJWRcbiIsIGVycik7CisJZWxzZQorCQlncGlvX2ZyZWUodXNiX3Bvd2VyKTsKK30KKwordm9pZCBfX2luaXQgYmNtNDd4eF93b3JrYXJvdW5kcyh2b2lkKQoreworCWVudW0gYmNtNDd4eF9ib2FyZCBib2FyZCA9IGJjbTQ3eHhfYm9hcmRfZ2V0KCk7CisKKwlzd2l0Y2ggKGJvYXJkKSB7CisJY2FzZSBCQ000N1hYX0JPQVJEX05FVEdFQVJfV05SMzUwMEw6CisJCWJjbTQ3eHhfd29ya2Fyb3VuZHNfbmV0Z2Vhcl93bnIzNTAwbCgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBObyB3b3JrYXJvdW5kKHMpIG5lZWRlZCAqLworCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYyBiL2FyY2gvbWlwcy9iY202M3h4L2NwdS5jCmluZGV4IDFiMWI4YTguLmZkNGU3NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY202M3h4L2NwdS5jCisrKyBiL2FyY2gvbWlwcy9iY202M3h4L2NwdS5jCkBAIC0yOTksMTQgKzI5OSwxMyBAQAogdm9pZCBfX2luaXQgYmNtNjN4eF9jcHVfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCB0bXA7Ci0Jc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdTMyIGNoaXBpZF9yZWc7CiAKIAkvKiBzb2MgcmVnaXN0ZXJzIGxvY2F0aW9uIGRlcGVuZHMgb24gY3B1IHR5cGUgKi8KIAljaGlwaWRfcmVnID0gMDsKIAotCXN3aXRjaCAoYy0+Y3B1dHlwZSkgeworCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CiAJY2FzZSBDUFVfQk1JUFMzMzAwOgogCQlpZiAoKHJlYWRfYzBfcHJpZCgpICYgUFJJRF9JTVBfTUFTSykgIT0gUFJJRF9JTVBfQk1JUFMzMzAwX0FMVCkKIAkJCV9fY3B1X25hbWVbY3B1XSA9ICJCcm9hZGNvbSBCQ002MzM4IjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYwppbmRleCAyNWZiZmFlLi5jMmJiNGY4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCkBAIC05NzUsMTAgKzk3NSw2IEBACiAJaWYgKGNpdSA+IDEgfHwgYml0ID4gNjMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogVGhlc2UgYXJlIHRoZSBHUElPIGxpbmVzICovCi0JaWYgKGNpdSA9PSAwICYmIGJpdCA+PSAxNiAmJiBiaXQgPCAzMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkqb3V0X2h3aXJxID0gKGNpdSA8PCA2KSB8IGJpdDsKIAkqb3V0X3R5cGUgPSAwOwogCkBAIC0xMDA3LDYgKzEwMDMsMTAgQEAKIAlpZiAoIW9jdGVvbl9pcnFfdmlycV9pbl9yYW5nZSh2aXJxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBEb24ndCBtYXAgaXJxIGlmIGl0IGlzIHJlc2VydmVkIGZvciBHUElPLiAqLworCWlmIChsaW5lID09IDAgJiYgYml0ID49IDE2ICYmIGJpdCA8MzIpCisJCXJldHVybiAwOworCiAJaWYgKGxpbmUgPiAxIHx8IG9jdGVvbl9pcnFfY2l1X3RvX2lycVtsaW5lXVtiaXRdICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNTI1LDEwICsxNTI1LDYgQEAKIAljaXUgPSBpbnRzcGVjWzBdOwogCWJpdCA9IGludHNwZWNbMV07CiAKLQkvKiBMaW5lIDcgIGFyZSB0aGUgR1BJTyBsaW5lcyAqLwotCWlmIChjaXUgPiA2IHx8IGJpdCA+IDYzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCSpvdXRfaHdpcnEgPSAoY2l1IDw8IDYpIHwgYml0OwogCSpvdXRfdHlwZSA9IDA7CiAKQEAgLTE1NzAsOCArMTU2NiwxNCBAQAogCWlmICghb2N0ZW9uX2lycV92aXJxX2luX3JhbmdlKHZpcnEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIExpbmUgNyAgYXJlIHRoZSBHUElPIGxpbmVzICovCi0JaWYgKGxpbmUgPiA2IHx8IG9jdGVvbl9pcnFfY2l1X3RvX2lycVtsaW5lXVtiaXRdICE9IDApCisJLyoKKwkgKiBEb24ndCBtYXAgaXJxIGlmIGl0IGlzIHJlc2VydmVkIGZvciBHUElPLgorCSAqIChMaW5lIDcgYXJlIHRoZSBHUElPIGxpbmVzLikKKwkgKi8KKwlpZiAobGluZSA9PSA3KQorCQlyZXR1cm4gMDsKKworCWlmIChsaW5lID4gNyB8fCBvY3Rlb25faXJxX2NpdV90b19pcnFbbGluZV1bYml0XSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChvY3Rlb25faXJxX2NpdTJfaXNfZWRnZShsaW5lLCBiaXQpKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzI2YjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi1DT05GSUdfTUlQUz15Ci1DT05GSUdfTUlQU19BTENIRU1ZPXkKLUNPTkZJR19NSVBTX0RCMTAwMD15Ci1DT05GSUdfU0NIRURfT01JVF9GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19USUNLX09ORVNIT1Q9eQotQ09ORklHX05PX0haPXkKLUNPTkZJR19ISUdIX1JFU19USU1FUlM9eQotQ09ORklHX0haXzEwMD15Ci1DT05GSUdfSFo9MTAwCi1DT05GSUdfUFJFRU1QVF9OT05FPXkKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotQ09ORklHX0NST1NTX0NPTVBJTEU9IiIKLUNPTkZJR19MT0NBTFZFUlNJT049Ii1kYjF4MDAiCi1DT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQotQ09ORklHX0tFUk5FTF9MWk1BPXkKLUNPTkZJR19ERUZBVUxUX0hPU1ROQU1FPSJkYjF4MDAiCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotQ09ORklHX0ZIQU5ETEU9eQotQ09ORklHX0FVRElUPXkKLUNPTkZJR19USU5ZX1JDVT15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xOAotQ09ORklHX05BTUVTUEFDRVM9eQotQ09ORklHX1VUU19OUz15Ci1DT05GSUdfSVBDX05TPXkKLUNPTkZJR19VU0VSX05TPXkKLUNPTkZJR19QSURfTlM9eQotQ09ORklHX05FVF9OUz15Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19FWFBFUlQ9eQotQ09ORklHX0tBTExTWU1TPXkKLUNPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NJR05BTEZEPXkKLUNPTkZJR19USU1FUkZEPXkKLUNPTkZJR19FVkVOVEZEPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfQUlPPXkKLUNPTkZJR19FTUJFRERFRD15Ci1DT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15Ci1DT05GSUdfUEVSRl9VU0VfVk1BTExPQz15Ci1DT05GSUdfUENJX1FVSVJLUz15Ci1DT05GSUdfU0xBQj15Ci1DT05GSUdfU0xBQklORk89eQotQ09ORklHX0JMT0NLPXkKLUNPTkZJR19MQkRBRj15Ci1DT05GSUdfQkxLX0RFVl9CU0c9eQotQ09ORklHX0JMS19ERVZfQlNHTElCPXkKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0RFRkFVTFRfTk9PUD15Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgotQ09ORklHX0ZSRUVaRVI9eQotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotQ09ORklHX1BDQ0FSRD15Ci1DT05GSUdfUENNQ0lBPXkKLUNPTkZJR19QQ01DSUFfTE9BRF9DSVM9eQotQ09ORklHX1BDTUNJQV9BTENIRU1ZX0RFVkJPQVJEPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15Ci1DT05GSUdfU1VTUEVORD15Ci1DT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKLUNPTkZJR19QTV9TTEVFUD15Ci1DT05GSUdfUE1fUlVOVElNRT15Ci1DT05GSUdfUE09eQotQ09ORklHX05FVD15Ci1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci1DT05GSUdfSVBfUE5QX1JBUlA9eQotQ09ORklHX05FVF9JUElQPXkKLUNPTkZJR19JTkVUX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9MUk89eQotQ09ORklHX1RDUF9DT05HX0NVQklDPXkKLUNPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKLUNPTkZJR19JUFY2PXkKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15Ci1DT05GSUdfSVBWNl9TSVQ9eQotQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQotQ09ORklHX1NUUD15Ci1DT05GSUdfR0FSUD15Ci1DT05GSUdfQlJJREdFPXkKLUNPTkZJR19CUklER0VfSUdNUF9TTk9PUElORz15Ci1DT05GSUdfVkxBTl84MDIxUT15Ci1DT05GSUdfVkxBTl84MDIxUV9HVlJQPXkKLUNPTkZJR19MTEM9eQotQ09ORklHX0xMQzI9eQotQ09ORklHX0ROU19SRVNPTFZFUj15Ci1DT05GSUdfQlQ9eQotQ09ORklHX0JUX0wyQ0FQPXkKLUNPTkZJR19CVF9TQ089eQotQ09ORklHX0JUX1JGQ09NTT15Ci1DT05GSUdfQlRfUkZDT01NX1RUWT15Ci1DT05GSUdfQlRfQk5FUD15Ci1DT05GSUdfQlRfQk5FUF9NQ19GSUxURVI9eQotQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSPXkKLUNPTkZJR19CVF9ISURQPXkKLUNPTkZJR19CVF9IQ0lCVFVTQj15Ci1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIiCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPXkKLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMS0RFVlM9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0dFTl9QUk9CRT15Ci1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci1DT05GSUdfTVREX0NGSV9OT1NXQVA9eQotQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotQ09ORklHX01URF9DRklfSTQ9eQotQ09ORklHX01URF9DRklfSTg9eQotQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQotQ09ORklHX01URF9DRklfQU1EU1REPXkKLUNPTkZJR19NVERfQ0ZJX1VUSUw9eQotQ09ORklHX01URF9QSFlTTUFQPXkKLUNPTkZJR19TQ1NJX01PRD15Ci1DT05GSUdfU0NTST15Ci1DT05GSUdfU0NTSV9ETUE9eQotQ09ORklHX1NDU0lfUFJPQ19GUz15Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TRz15Ci1DT05GSUdfU0NTSV9NVUxUSV9MVU49eQotQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKLUNPTkZJR19BVEE9eQotQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKLUNPTkZJR19BVEFfU0ZGPXkKLUNPTkZJR19BVEFfQk1ETUE9eQotQ09ORklHX1BBVEFfSFBUMzdYPXkKLUNPTkZJR19QQVRBX1BDTUNJQT15Ci1DT05GSUdfTUQ9eQotQ09ORklHX0JMS19ERVZfRE09eQotQ09ORklHX0ZJUkVXSVJFPXkKLUNPTkZJR19GSVJFV0lSRV9PSENJPXkKLUNPTkZJR19GSVJFV0lSRV9PSENJX0RFQlVHPXkKLUNPTkZJR19GSVJFV0lSRV9ORVQ9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX01JST15Ci1DT05GSUdfUEhZTElCPXkKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JUFNfQVUxWDAwX0VORVQ9eQotQ09ORklHX05FVF9QQ01DSUE9eQotQ09ORklHX1BDTUNJQV8zQzU4OT15Ci1DT05GSUdfUENNQ0lBX1BDTkVUPXkKLUNPTkZJR19QUFA9eQotQ09ORklHX1BQUF9NVUxUSUxJTks9eQotQ09ORklHX1BQUF9GSUxURVI9eQotQ09ORklHX1BQUF9BU1lOQz15Ci1DT05GSUdfUFBQX1NZTkNfVFRZPXkKLUNPTkZJR19QUFBfREVGTEFURT15Ci1DT05GSUdfUFBQX0JTRENPTVA9eQotQ09ORklHX1BQUF9NUFBFPXkKLUNPTkZJR19QUFBPRT15Ci1DT05GSUdfSU5QVVQ9eQotQ09ORklHX0lOUFVUX0VWREVWPXkKLUNPTkZJR19JTlBVVF9NSVNDPXkKLUNPTkZJR19JTlBVVF9VSU5QVVQ9eQotQ09ORklHX1ZUPXkKLUNPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVM9eQotQ09ORklHX0RFVktNRU09eQotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00Ci1DT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00Ci1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1RUWV9QUklOVEs9eQotQ09ORklHX0RFVlBPUlQ9eQotQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKLUNPTkZJR19GQj15Ci1DT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKLUNPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQotQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQotQ09ORklHX0ZCX0FVMTEwMD15Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWT15Ci1DT05GSUdfRk9OVFM9eQotQ09ORklHX0ZPTlRfOHgxNj15Ci1DT05GSUdfU09VTkQ9eQotQ09ORklHX1NORD15Ci1DT05GSUdfU05EX1RJTUVSPXkKLUNPTkZJR19TTkRfUENNPXkKLUNPTkZJR19TTkRfSkFDSz15Ci1DT05GSUdfU05EX1NFUVVFTkNFUj15Ci1DT05GSUdfU05EX0hSVElNRVI9eQotQ09ORklHX1NORF9TRVFfSFJUSU1FUl9ERUZBVUxUPXkKLUNPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlM9eQotQ09ORklHX1NORF9WTUFTVEVSPXkKLUNPTkZJR19TTkRfQUM5N19DT0RFQz15Ci1DT05GSUdfU05EX1NPQz15Ci1DT05GSUdfU05EX1NPQ19BQzk3X0JVUz15Ci1DT05GSUdfU05EX1NPQ19BVTFYQVVESU89eQotQ09ORklHX1NORF9TT0NfQVUxWEFDOTdDPXkKLUNPTkZJR19TTkRfU09DX0RCMTAwMD15Ci1DT05GSUdfU05EX1NPQ19BQzk3X0NPREVDPXkKLUNPTkZJR19BQzk3X0JVUz15Ci1DT05GSUdfSElEX1NVUFBPUlQ9eQotQ09ORklHX0hJRD15Ci1DT05GSUdfSElEUkFXPXkKLUNPTkZJR19VU0JfSElEPXkKLUNPTkZJR19VU0JfU1VQUE9SVD15Ci1DT05GSUdfVVNCPXkKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9eQotQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKLUNPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRD15Ci1DT05GSUdfVVNCX09IQ0lfSENEPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0RfUExBVEZPUk09eQotQ09ORklHX1VTQl9VSENJX0hDRD15Ci1DT05GSUdfVVNCX1NUT1JBR0U9eQotQ09ORklHX05FV19MRURTPXkKLUNPTkZJR19MRURTX0NMQVNTPXkKLUNPTkZJR19MRURTX1RSSUdHRVJTPXkKLUNPTkZJR19SVENfTElCPXkKLUNPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUQ19IQ1RPU1lTPXkKLUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCi1DT05GSUdfUlRDX0lOVEZfU1lTRlM9eQotQ09ORklHX1JUQ19JTlRGX1BST0M9eQotQ09ORklHX1JUQ19JTlRGX0RFVj15Ci1DT05GSUdfUlRDX0RSVl9BVTFYWFg9eQotQ09ORklHX0VYVDRfRlM9eQotQ09ORklHX0VYVDRfVVNFX0ZPUl9FWFQyMz15Ci1DT05GSUdfRVhUNF9GU19YQVRUUj15Ci1DT05GSUdfRVhUNF9GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQotQ09ORklHX0pCRDI9eQotQ09ORklHX0ZTX01CQ0FDSEU9eQotQ09ORklHX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhQT1JURlM9eQotQ09ORklHX0ZJTEVfTE9DS0lORz15Ci1DT05GSUdfRlNOT1RJRlk9eQotQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0lOT1RJRllfVVNFUj15Ci1DT05GSUdfR0VORVJJQ19BQ0w9eQotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1BST0NfU1lTQ1RMPXkKLUNPTkZJR19TWVNGUz15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15Ci1DT05GSUdfVE1QRlNfWEFUVFI9eQotQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9GU19ERUJVRz0wCi1DT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQotQ09ORklHX0pGRlMyX1NVTU1BUlk9eQotQ09ORklHX0pGRlMyX0ZTX1hBVFRSPXkKLUNPTkZJR19KRkZTMl9GU19QT1NJWF9BQ0w9eQotQ09ORklHX0pGRlMyX0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TPXkKLUNPTkZJR19KRkZTMl9aTElCPXkKLUNPTkZJR19KRkZTMl9MWk89eQotQ09ORklHX0pGRlMyX1JUSU1FPXkKLUNPTkZJR19KRkZTMl9SVUJJTj15Ci1DT05GSUdfSkZGUzJfQ01PREVfUFJJT1JJVFk9eQotQ09ORklHX1NRVUFTSEZTPXkKLUNPTkZJR19TUVVBU0hGU19aTElCPXkKLUNPTkZJR19TUVVBU0hGU19MWk89eQotQ09ORklHX1NRVUFTSEZTX1haPXkKLUNPTkZJR19TUVVBU0hGU19GUkFHTUVOVF9DQUNIRV9TSVpFPTMKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci1DT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ORlNfVjRfMT15Ci1DT05GSUdfUE5GU19GSUxFX0xBWU9VVD15Ci1DT05GSUdfUE5GU19CTE9DSz15Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX05GU19VU0VfS0VSTkVMX0ROUz15Ci1DT05GSUdfTkZTX1VTRV9ORVdfSURNQVBQRVI9eQotQ09ORklHX05GU0Q9eQotQ09ORklHX05GU0RfVjJfQUNMPXkKLUNPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19ORlNEX1YzX0FDTD15Ci1DT05GSUdfTkZTRF9WND15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19ORlNfQUNMX1NVUFBPUlQ9eQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz15Ci1DT05GSUdfU1VOUlBDX0dTUz15Ci1DT05GSUdfU1VOUlBDX0JBQ0tDSEFOTkVMPXkKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLUNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD15Ci1DT05GSUdfTkxTX0FTQ0lJPXkKLUNPTkZJR19OTFNfSVNPODg1OV8xPXkKLUNPTkZJR19OTFNfSVNPODg1OV8xNT15Ci1DT05GSUdfTkxTX1VURjg9eQotQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKLUNPTkZJR19FQVJMWV9QUklOVEs9eQotQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0ibm9pcnFkZWJ1ZyByb290d2FpdCByb290PS9kZXYvc2RhMSByb290ZnN0eXBlPWV4dDQgY29uc29sZT10dHlTMCwxMTUyMDAgdmlkZW89YXUxMTAwZmI6cGFuZWw6Q1JUXzgwMHg2MDBfMTYiCi1DT05GSUdfREVCVUdfWkJPT1Q9eQotQ09ORklHX0tFWVM9eQotQ09ORklHX0tFWVNfREVCVUdfUFJPQ19LRVlTPXkKLUNPTkZJR19TRUNVUklUWUZTPXkKLUNPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15Ci1DT05GSUdfREVGQVVMVF9TRUNVUklUWT0iIgotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQotQ09ORklHX0NSWVBUT19BRUFEMj15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQotQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fSEFTSDI9eQotQ09ORklHX0NSWVBUT19STkc9eQotQ09ORklHX0NSWVBUT19STkcyPXkKLUNPTkZJR19DUllQVE9fUENPTVAyPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci1DT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUl9ESVNBQkxFX1RFU1RTPXkKLUNPTkZJR19DUllQVE9fV09SS1FVRVVFPXkKLUNPTkZJR19DUllQVE9fRUNCPXkKLUNPTkZJR19DUllQVE9fU0hBMT15Ci1DT05GSUdfQ1JZUFRPX0FFUz15Ci1DT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkc9eQotQ09ORklHX0JJVFJFVkVSU0U9eQotQ09ORklHX0NSQ19DQ0lUVD15Ci1DT05GSUdfQ1JDMTY9eQotQ09ORklHX0NSQ19JVFVfVD15Ci1DT05GSUdfQ1JDMzI9eQotQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfWkxJQl9ERUZMQVRFPXkKLUNPTkZJR19MWk9fQ09NUFJFU1M9eQotQ09ORklHX0xaT19ERUNPTVBSRVNTPXkKLUNPTkZJR19YWl9ERUM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjM1X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTIzNV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTQ5ZjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjM1X2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi1DT05GSUdfTUlQU19BTENIRU1ZPXkKLUNPTkZJR19NSVBTX0RCMTIzNT15Ci1DT05GSUdfQ09NUEFDVElPTj15Ci1DT05GSUdfS1NNPXkKLUNPTkZJR19IWl8xMDA9eQotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DQUxWRVJTSU9OPSItZGIxMjM1IgotQ09ORklHX0tFUk5FTF9MWk1BPXkKLUNPTkZJR19ERUZBVUxUX0hPU1ROQU1FPSJkYjEyMzUiCi1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKLUNPTkZJR19GSEFORExFPXkKLUNPTkZJR19UQVNLU1RBVFM9eQotQ09ORklHX1RBU0tfREVMQVlfQUNDVD15Ci1DT05GSUdfQVVESVQ9eQotQ09ORklHX0FVRElUX0xPR0lOVUlEX0lNTVVUQUJMRT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNgotQ09ORklHX05BTUVTUEFDRVM9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19TTEFCPXkKLUNPTkZJR19KVU1QX0xBQkVMPXkKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotQ09ORklHX0xETV9QQVJUSVRJT049eQotQ09ORklHX0VGSV9QQVJUSVRJT049eQotQ09ORklHX1BDST15Ci1DT05GSUdfUENDQVJEPXkKLUNPTkZJR19QQ01DSUFfQUxDSEVNWV9ERVZCT0FSRD15Ci1DT05GSUdfUE1fUlVOVElNRT15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX1VOSVhfRElBRz15Ci1DT05GSUdfWEZSTV9VU0VSPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15Ci1DT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKLUNPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQotQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci1DT05GSUdfSVBfUE5QX1JBUlA9eQotQ09ORklHX05FVF9JUElQPXkKLUNPTkZJR19ORVRfSVBHUkVfREVNVVg9eQotQ09ORklHX05FVF9JUEdSRT15Ci1DT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15Ci1DT05GSUdfSVBfTVJPVVRFPXkKLUNPTkZJR19JUF9NUk9VVEVfTVVMVElQTEVfVEFCTEVTPXkKLUNPTkZJR19JUF9QSU1TTV9WMT15Ci1DT05GSUdfSVBfUElNU01fVjI9eQotQ09ORklHX0FSUEQ9eQotQ09ORklHX1NZTl9DT09LSUVTPXkKLUNPTkZJR19ORVRfSVBWVEk9eQotQ09ORklHX0lORVRfQUg9eQotQ09ORklHX0lORVRfRVNQPXkKLUNPTkZJR19JTkVUX0lQQ09NUD15Ci1DT05GSUdfSU5FVF9VRFBfRElBRz15Ci1DT05GSUdfVENQX0NPTkdfQURWQU5DRUQ9eQotQ09ORklHX1RDUF9DT05HX0hTVENQPXkKLUNPTkZJR19UQ1BfQ09OR19IWUJMQT15Ci1DT05GSUdfVENQX0NPTkdfU0NBTEFCTEU9eQotQ09ORklHX1RDUF9DT05HX0xQPXkKLUNPTkZJR19UQ1BfQ09OR19WRU5PPXkKLUNPTkZJR19UQ1BfQ09OR19ZRUFIPXkKLUNPTkZJR19UQ1BfQ09OR19JTExJTk9JUz15Ci1DT05GSUdfREVGQVVMVF9IWUJMQT15Ci1DT05GSUdfVENQX01ENVNJRz15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKLUNPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKLUNPTkZJR19JUFY2X1JPVVRFX0lORk89eQotQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQotQ09ORklHX0lORVQ2X0FIPXkKLUNPTkZJR19JTkVUNl9FU1A9eQotQ09ORklHX0lORVQ2X0lQQ09NUD15Ci1DT05GSUdfSVBWNl9NSVA2PXkKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049eQotQ09ORklHX0lQVjZfU0lUXzZSRD15Ci1DT05GSUdfSVBWNl9UVU5ORUw9eQotQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTPXkKLUNPTkZJR19JUFY2X1NVQlRSRUVTPXkKLUNPTkZJR19JUFY2X01ST1VURT15Ci1DT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTPXkKLUNPTkZJR19JUFY2X1BJTVNNX1YyPXkKLUNPTkZJR19ORVRGSUxURVI9eQotQ09ORklHX05GX0NPTk5UUkFDSz15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVPVVQ9eQotQ09ORklHX05GX0NPTk5UUkFDS19USU1FU1RBTVA9eQotQ09ORklHX05GX0NUX1BST1RPX0RDQ1A9eQotQ09ORklHX05GX0NUX1BST1RPX1NDVFA9eQotQ09ORklHX05GX0NUX1BST1RPX1VEUExJVEU9eQotQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9eQotQ09ORklHX05GX0NPTk5UUkFDS19GVFA9eQotQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVJDPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUz15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1NOTVA9eQotQ09ORklHX05GX0NPTk5UUkFDS19QUFRQPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfU0FORT15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1NJUD15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9eQotQ09ORklHX05GX0NUX05FVExJTks9eQotQ09ORklHX05GX0NUX05FVExJTktfVElNRU9VVD15Ci1DT05GSUdfTkZfQ1RfTkVUTElOS19IRUxQRVI9eQotQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFX0NUPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0hNQVJLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0lETEVUSU1FUj15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9MRUQ9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTE9HPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9URUU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQUREUlRZUEU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DTFVTVEVSPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ1BVPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RFVkdST1VQPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ORkFDQ1Q9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PU0Y9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BIWVNERVY9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND15Ci1DT05GSUdfSVBfTkZfSVBUQUJMRVM9eQotQ09ORklHX0lQX05GX01BVENIX0FIPXkKLUNPTkZJR19JUF9ORl9NQVRDSF9FQ049eQotQ09ORklHX0lQX05GX01BVENIX1JQRklMVEVSPXkKLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9eQotQ09ORklHX0lQX05GX0ZJTFRFUj15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9eQotQ09ORklHX05GX05BVD15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9eQotQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9eQotQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD15Ci1DT05GSUdfSVBfTkZfTUFOR0xFPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfRUNOPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfVFRMPXkKLUNPTkZJR19JUF9ORl9SQVc9eQotQ09ORklHX0lQX05GX0FSUFRBQkxFUz15Ci1DT05GSUdfSVBfTkZfQVJQRklMVEVSPXkKLUNPTkZJR19JUF9ORl9BUlBfTUFOR0xFPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj15Ci1DT05GSUdfSVA2X05GX0lQVEFCTEVTPXkKLUNPTkZJR19JUDZfTkZfTUFUQ0hfQUg9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND15Ci1DT05GSUdfSVA2X05GX01BVENIX0ZSQUc9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPXkKLUNPTkZJR19JUDZfTkZfTUFUQ0hfSEw9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSPXkKLUNPTkZJR19JUDZfTkZfTUFUQ0hfTUg9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9SUEZJTFRFUj15Ci1DT05GSUdfSVA2X05GX01BVENIX1JUPXkKLUNPTkZJR19JUDZfTkZfVEFSR0VUX0hMPXkKLUNPTkZJR19JUDZfTkZfRklMVEVSPXkKLUNPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVD15Ci1DT05GSUdfSVA2X05GX01BTkdMRT15Ci1DT05GSUdfSVA2X05GX1JBVz15Ci1DT05GSUdfQlJJREdFX05GX0VCVEFCTEVTPXkKLUNPTkZJR19CUklER0VfRUJUX0JST1VURT15Ci1DT05GSUdfQlJJREdFX0VCVF9UX0ZJTFRFUj15Ci1DT05GSUdfQlJJREdFX0VCVF9UX05BVD15Ci1DT05GSUdfQlJJREdFX0VCVF84MDJfMz15Ci1DT05GSUdfQlJJREdFX0VCVF9BTU9ORz15Ci1DT05GSUdfQlJJREdFX0VCVF9BUlA9eQotQ09ORklHX0JSSURHRV9FQlRfSVA9eQotQ09ORklHX0JSSURHRV9FQlRfSVA2PXkKLUNPTkZJR19CUklER0VfRUJUX0xJTUlUPXkKLUNPTkZJR19CUklER0VfRUJUX01BUks9eQotQ09ORklHX0JSSURHRV9FQlRfUEtUVFlQRT15Ci1DT05GSUdfQlJJREdFX0VCVF9TVFA9eQotQ09ORklHX0JSSURHRV9FQlRfVkxBTj15Ci1DT05GSUdfQlJJREdFX0VCVF9BUlBSRVBMWT15Ci1DT05GSUdfQlJJREdFX0VCVF9ETkFUPXkKLUNPTkZJR19CUklER0VfRUJUX01BUktfVD15Ci1DT05GSUdfQlJJREdFX0VCVF9SRURJUkVDVD15Ci1DT05GSUdfQlJJREdFX0VCVF9TTkFUPXkKLUNPTkZJR19CUklER0VfRUJUX0xPRz15Ci1DT05GSUdfQlJJREdFX0VCVF9ORkxPRz15Ci1DT05GSUdfTDJUUD15Ci1DT05GSUdfTDJUUF9WMz15Ci1DT05GSUdfTDJUUF9JUD15Ci1DT05GSUdfTDJUUF9FVEg9eQotQ09ORklHX0JSSURHRT15Ci1DT05GSUdfVkxBTl84MDIxUT15Ci1DT05GSUdfVkxBTl84MDIxUV9HVlJQPXkKLUNPTkZJR19MTEMyPXkKLUNPTkZJR19ORVRfU0NIRUQ9eQotQ09ORklHX05FVF9TQ0hfQ0JRPXkKLUNPTkZJR19ORVRfU0NIX0hUQj15Ci1DT05GSUdfTkVUX1NDSF9IRlNDPXkKLUNPTkZJR19ORVRfU0NIX1BSSU89eQotQ09ORklHX05FVF9TQ0hfTVVMVElRPXkKLUNPTkZJR19ORVRfU0NIX1JFRD15Ci1DT05GSUdfTkVUX1NDSF9TRkI9eQotQ09ORklHX05FVF9TQ0hfU0ZRPXkKLUNPTkZJR19ORVRfU0NIX1RFUUw9eQotQ09ORklHX05FVF9TQ0hfVEJGPXkKLUNPTkZJR19ORVRfU0NIX0dSRUQ9eQotQ09ORklHX05FVF9TQ0hfRFNNQVJLPXkKLUNPTkZJR19ORVRfU0NIX05FVEVNPXkKLUNPTkZJR19ORVRfU0NIX0RSUj15Ci1DT05GSUdfTkVUX1NDSF9NUVBSSU89eQotQ09ORklHX05FVF9TQ0hfQ0hPS0U9eQotQ09ORklHX05FVF9TQ0hfUUZRPXkKLUNPTkZJR19ORVRfU0NIX0NPREVMPXkKLUNPTkZJR19ORVRfU0NIX0ZRX0NPREVMPXkKLUNPTkZJR19ORVRfU0NIX0lOR1JFU1M9eQotQ09ORklHX05FVF9TQ0hfUExVRz15Ci1DT05GSUdfTkVUX0NMU19CQVNJQz15Ci1DT05GSUdfTkVUX0NMU19UQ0lOREVYPXkKLUNPTkZJR19ORVRfQ0xTX1JPVVRFND15Ci1DT05GSUdfTkVUX0NMU19GVz15Ci1DT05GSUdfTkVUX0NMU19VMzI9eQotQ09ORklHX0NMU19VMzJfUEVSRj15Ci1DT05GSUdfQ0xTX1UzMl9NQVJLPXkKLUNPTkZJR19ORVRfQ0xTX1JTVlA9eQotQ09ORklHX05FVF9DTFNfUlNWUDY9eQotQ09ORklHX05FVF9DTFNfRkxPVz15Ci1DT05GSUdfTkVUX0VNQVRDSD15Ci1DT05GSUdfTkVUX0VNQVRDSF9DTVA9eQotQ09ORklHX05FVF9FTUFUQ0hfTkJZVEU9eQotQ09ORklHX05FVF9FTUFUQ0hfVTMyPXkKLUNPTkZJR19ORVRfRU1BVENIX01FVEE9eQotQ09ORklHX05FVF9FTUFUQ0hfVEVYVD15Ci1DT05GSUdfTkVUX0NMU19BQ1Q9eQotQ09ORklHX05FVF9BQ1RfUE9MSUNFPXkKLUNPTkZJR19ORVRfQUNUX0dBQ1Q9eQotQ09ORklHX0dBQ1RfUFJPQj15Ci1DT05GSUdfTkVUX0FDVF9NSVJSRUQ9eQotQ09ORklHX05FVF9BQ1RfTkFUPXkKLUNPTkZJR19ORVRfQUNUX1BFRElUPXkKLUNPTkZJR19ORVRfQUNUX1NJTVA9eQotQ09ORklHX05FVF9BQ1RfU0tCRURJVD15Ci1DT05GSUdfTkVUX0FDVF9DU1VNPXkKLUNPTkZJR19ORVRfQ0xTX0lORD15Ci1DT05GSUdfQlQ9eQotQ09ORklHX0JUX1JGQ09NTT15Ci1DT05GSUdfQlRfUkZDT01NX1RUWT15Ci1DT05GSUdfQlRfQk5FUD15Ci1DT05GSUdfQlRfQk5FUF9NQ19GSUxURVI9eQotQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSPXkKLUNPTkZJR19CVF9ISURQPXkKLUNPTkZJR19CVF9IQ0lCVFVTQj15Ci1DT05GSUdfQ0ZHODAyMTE9eQotQ09ORklHX0NGRzgwMjExX0NFUlRJRklDQVRJT05fT05VUz15Ci1DT05GSUdfQ0ZHODAyMTFfV0VYVD15Ci1DT05GSUdfTUFDODAyMTE9eQotQ09ORklHX01BQzgwMjExX0xFRFM9eQotQ09ORklHX1JGS0lMTD15Ci1DT05GSUdfUkZLSUxMX0lOUFVUPXkKLUNPTkZJR19ERVZUTVBGUz15Ci1DT05GSUdfREVWVE1QRlNfTU9VTlQ9eQotQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9QSFlTTUFQPXkKLUNPTkZJR19NVERfTTI1UDgwPXkKLUNPTkZJR19NVERfTkFORD15Ci1DT05GSUdfTVREX05BTkRfUExBVEZPUk09eQotQ09ORklHX0VFUFJPTV9BVDI0PXkKLUNPTkZJR19FRVBST01fQVQyNT15Ci1DT05GSUdfSURFPXkKLUNPTkZJR19CTEtfREVWX0lERV9BVTFYWFg9eQotQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0NIUl9ERVZfU0c9eQotQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKLUNPTkZJR19BVEE9eQotQ09ORklHX1BBVEFfSFBUMzdYPXkKLUNPTkZJR19QQVRBX1BDTUNJQT15Ci1DT05GSUdfUEFUQV9QTEFURk9STT15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfTUlQU19BVTFYMDBfRU5FVD15Ci1DT05GSUdfU01DOTFYPXkKLUNPTkZJR19TTVNDOTExWD15Ci1DT05GSUdfQU1EX1BIWT15Ci1DT05GSUdfU01TQ19QSFk9eQotQ09ORklHX1JUMlgwMD15Ci1DT05GSUdfUlQ3M1VTQj15Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKLUNPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFg9eQotQ09ORklHX0lOUFVUX01JU0M9eQotQ09ORklHX0lOUFVUX1VJTlBVVD15Ci1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1RUWV9QUklOVEs9eQotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotQ09ORklHX0kyQ19BVTE1NTA9eQotQ09ORklHX1NQST15Ci1DT05GSUdfU1BJX0FVMTU1MD15Ci1DT05GSUdfR1BJT19TWVNGUz15Ci1DT05GSUdfU0VOU09SU19BRE0xMDI1PXkKLUNPTkZJR19TRU5TT1JTX0xNNzA9eQotQ09ORklHX1NPVU5EPXkKLUNPTkZJR19TTkQ9eQotQ09ORklHX1NORF9IUlRJTUVSPXkKLUNPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlM9eQotQ09ORklHX1NORF9TT0M9eQotQ09ORklHX1NORF9TT0NfQVUxWFBTQz15Ci1DT05GSUdfU05EX1NPQ19EQjEyMDA9eQotQ09ORklHX0hJRFJBVz15Ci1DT05GSUdfVUhJRD15Ci1DT05GSUdfVVNCX0hJRERFVj15Ci1DT05GSUdfVVNCPXkKLUNPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlM9eQotQ09ORklHX1VTQl9FSENJX0hDRD15Ci1DT05GSUdfVVNCX0VIQ0lfSENEX1BMQVRGT1JNPXkKLUNPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVD15Ci1DT05GSUdfVVNCX09IQ0lfSENEPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0RfUExBVEZPUk09eQotQ09ORklHX1VTQl9TVE9SQUdFPXkKLUNPTkZJR19NTUM9eQotQ09ORklHX01NQ19BVTFYPXkKLUNPTkZJR19ORVdfTEVEUz15Ci1DT05GSUdfTEVEU19DTEFTUz15Ci1DT05GSUdfUlRDX0NMQVNTPXkKLUNPTkZJR19SVENfRFJWX0FVMVhYWD15Ci1DT05GSUdfRVhUNF9GUz15Ci1DT05GSUdfRVhUNF9GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQotQ09ORklHX1hGU19GUz15Ci1DT05GSUdfWEZTX1BPU0lYX0FDTD15Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15Ci1DT05GSUdfQ09ORklHRlNfRlM9eQotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9TVU1NQVJZPXkKLUNPTkZJR19KRkZTMl9GU19YQVRUUj15Ci1DT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUz15Ci1DT05GSUdfSkZGUzJfTFpPPXkKLUNPTkZJR19KRkZTMl9DTU9ERV9GQVZPVVJMWk89eQotQ09ORklHX1NRVUFTSEZTPXkKLUNPTkZJR19TUVVBU0hGU19MWk89eQotQ09ORklHX1NRVUFTSEZTX1haPXkKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WM19BQ0w9eQotQ09ORklHX05GU19WND15Ci1DT05GSUdfTkZTX1Y0XzE9eQotQ09ORklHX05GU19WNF8xX0lNUExFTUVOVEFUSU9OX0lEX0RPTUFJTj0ia2VybmVsLm9yZyIKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkZTRD15Ci1DT05GSUdfTkZTRF9WM19BQ0w9eQotQ09ORklHX05GU0RfVjQ9eQotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQotQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQotQ09ORklHX05MU19DT0RFUEFHRV84NTI9eQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPXkKLUNPTkZJR19OTFNfQVNDSUk9eQotQ09ORklHX05MU19JU084ODU5XzE9eQotQ09ORklHX05MU19JU084ODU5XzI9eQotQ09ORklHX05MU19JU084ODU5XzE1PXkKLUNPTkZJR19OTFNfVVRGOD15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotQ09ORklHX1NUUklQX0FTTV9TWU1TPXkKLUNPTkZJR19TRUNVUklUWUZTPXkKLUNPTkZJR19DUllQVE9fVVNFUj15Ci1DT05GSUdfQ1JZUFRPX05VTEw9eQotQ09ORklHX0NSWVBUT19DUllQVEQ9eQotQ09ORklHX0NSWVBUT19DQ009eQotQ09ORklHX0NSWVBUT19HQ009eQotQ09ORklHX0NSWVBUT19DVFM9eQotQ09ORklHX0NSWVBUT19MUlc9eQotQ09ORklHX0NSWVBUT19QQ0JDPXkKLUNPTkZJR19DUllQVE9fWFRTPXkKLUNPTkZJR19DUllQVE9fWENCQz15Ci1DT05GSUdfQ1JZUFRPX1ZNQUM9eQotQ09ORklHX0NSWVBUT19NRDQ9eQotQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz15Ci1DT05GSUdfQ1JZUFRPX1JNRDEyOD15Ci1DT05GSUdfQ1JZUFRPX1JNRDE2MD15Ci1DT05GSUdfQ1JZUFRPX1JNRDI1Nj15Ci1DT05GSUdfQ1JZUFRPX1JNRDMyMD15Ci1DT05GSUdfQ1JZUFRPX1NIQTI1Nj15Ci1DT05GSUdfQ1JZUFRPX1NIQTUxMj15Ci1DT05GSUdfQ1JZUFRPX1RHUjE5Mj15Ci1DT05GSUdfQ1JZUFRPX1dQNTEyPXkKLUNPTkZJR19DUllQVE9fQU5VQklTPXkKLUNPTkZJR19DUllQVE9fQkxPV0ZJU0g9eQotQ09ORklHX0NSWVBUT19DQU1FTExJQT15Ci1DT05GSUdfQ1JZUFRPX0NBU1Q1PXkKLUNPTkZJR19DUllQVE9fQ0FTVDY9eQotQ09ORklHX0NSWVBUT19GQ1JZUFQ9eQotQ09ORklHX0NSWVBUT19LSEFaQUQ9eQotQ09ORklHX0NSWVBUT19TQUxTQTIwPXkKLUNPTkZJR19DUllQVE9fU0VFRD15Ci1DT05GSUdfQ1JZUFRPX1NFUlBFTlQ9eQotQ09ORklHX0NSWVBUT19URUE9eQotQ09ORklHX0NSWVBUT19UV09GSVNIPXkKLUNPTkZJR19DUllQVE9fWkxJQj15Ci1DT05GSUdfQ1JZUFRPX0xaTz15Ci1DT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9eQotQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjF4eHhfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxeHh4X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTliNmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxeHh4X2RlZmNvbmZpZwpAQCAtMCwwICsxLDI0NSBAQAorQ09ORklHX01JUFNfQUxDSEVNWT15CitDT05GSUdfTUlQU19EQjFYWFg9eQorQ09ORklHX0NNQT15CitDT05GSUdfQ01BX0RFQlVHPXkKK0NPTkZJR19IWl8xMDA9eQorQ09ORklHX0xPQ0FMVkVSU0lPTj0iLWRiMXh4eCIKK0NPTkZJR19LRVJORUxfWFo9eQorQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9ImRiMXh4eCIKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0ZIQU5ETEU9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE2CitDT05GSUdfQ0dST1VQUz15CitDT05GSUdfQ0dST1VQX0ZSRUVaRVI9eQorQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKK0NPTkZJR19SRVNPVVJDRV9DT1VOVEVSUz15CitDT05GSUdfTUVNQ0c9eQorQ09ORklHX01FTUNHX1NXQVA9eQorQ09ORklHX01FTUNHX0tNRU09eQorQ09ORklHX0NHUk9VUF9TQ0hFRD15CitDT05GSUdfQ0ZTX0JBTkRXSURUSD15CitDT05GSUdfUlRfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0JMS19DR1JPVVA9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NMQUI9eQorQ09ORklHX0JMS19ERVZfQlNHTElCPXkKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfUkVBTExPQ19FTkFCTEVfQVVUTz15CitDT05GSUdfUENDQVJEPXkKK0NPTkZJR19QQ01DSUFfQUxDSEVNWV9ERVZCT0FSRD15CitDT05GSUdfUE1fUlVOVElNRT15CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9ESUFHPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19VTklYX0RJQUc9eQorQ09ORklHX1hGUk1fVVNFUj15CitDT05GSUdfWEZSTV9TVUJfUE9MSUNZPXkKK0NPTkZJR19YRlJNX01JR1JBVEU9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9GSUJfVFJJRV9TVEFUUz15CitDT05GSUdfTkVUX0lQSVA9eQorQ09ORklHX05FVF9JUEdSRV9ERU1VWD15CitDT05GSUdfTkVUX0lQR1JFPXkKK0NPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUPXkKK0NPTkZJR19TWU5fQ09PS0lFUz15CitDT05GSUdfSU5FVF9BSD15CitDT05GSUdfSU5FVF9FU1A9eQorQ09ORklHX0lORVRfSVBDT01QPXkKK0NPTkZJR19JTkVUX1VEUF9ESUFHPXkKK0NPTkZJR19UQ1BfQ09OR19BRFZBTkNFRD15CitDT05GSUdfVENQX0NPTkdfVkVOTz15CitDT05GSUdfREVGQVVMVF9WRU5PPXkKK0NPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKK0NPTkZJR19JUFY2X1JPVVRFX0lORk89eQorQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQorQ09ORklHX0lORVQ2X0FIPXkKK0NPTkZJR19JTkVUNl9FU1A9eQorQ09ORklHX0lORVQ2X0lQQ09NUD15CitDT05GSUdfSVBWNl9NSVA2PXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049eQorQ09ORklHX0lQVjZfVlRJPXkKK0NPTkZJR19JUFY2X1NJVF82UkQ9eQorQ09ORklHX0lQVjZfR1JFPXkKK0NPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBWNl9TVUJUUkVFUz15CitDT05GSUdfSVBWNl9NUk9VVEU9eQorQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBWNl9QSU1TTV9WMj15CitDT05GSUdfQlJJREdFPXkKK0NPTkZJR19ORVRMSU5LX01NQVA9eQorQ09ORklHX05FVExJTktfRElBRz15CitDT05GSUdfSVJEQT15CitDT05GSUdfSVJMQU49eQorQ09ORklHX0lSQ09NTT15CitDT05GSUdfSVJEQV9VTFRSQT15CitDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVA9eQorQ09ORklHX0lSREFfRkFTVF9SUj15CitDT05GSUdfQVUxMDAwX0ZJUj15CitDT05GSUdfQlQ9eQorQ09ORklHX0JUX1JGQ09NTT15CitDT05GSUdfQlRfUkZDT01NX1RUWT15CitDT05GSUdfQlRfQk5FUD15CitDT05GSUdfQlRfQk5FUF9NQ19GSUxURVI9eQorQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSPXkKK0NPTkZJR19CVF9ISURQPXkKK0NPTkZJR19CVF9IQ0lCVFVTQj15CitDT05GSUdfQ0ZHODAyMTE9eQorQ09ORklHX0NGRzgwMjExX1dFWFQ9eQorQ09ORklHX01BQzgwMjExPXkKK0NPTkZJR19ERVZUTVBGUz15CitDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorQ09ORklHX01URD15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9CTE9DSz15CitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfTTI1UDgwPXkKK0NPTkZJR19NVERfU1NUMjVMPXkKK0NPTkZJR19NVERfTkFORD15CitDT05GSUdfTVREX05BTkRfRUNDX0JDSD15CitDT05GSUdfTVREX05BTkRfQVUxNTUwPXkKK0NPTkZJR19NVERfTkFORF9QTEFURk9STT15CitDT05GSUdfRUVQUk9NX0FUMjQ9eQorQ09ORklHX0VFUFJPTV9BVDI1PXkKK0NPTkZJR19TQ1NJX1RHVD15CitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQ0hSX0RFVl9TRz15CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorQ09ORklHX0FUQT15CitDT05GSUdfUEFUQV9IUFQzN1g9eQorQ09ORklHX1BBVEFfSFBUM1gyTj15CitDT05GSUdfUEFUQV9QQ01DSUE9eQorQ09ORklHX1BBVEFfUExBVEZPUk09eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX05MTU9OPXkKK0NPTkZJR19QQ01DSUFfM0M1ODk9eQorQ09ORklHX01JUFNfQVUxWDAwX0VORVQ9eQorQ09ORklHX1NNQzkxWD15CitDT05GSUdfU01TQzkxMVg9eQorQ09ORklHX0FNRF9QSFk9eQorQ09ORklHX1NNU0NfUEhZPXkKK0NPTkZJR19JTlBVVF9FVkRFVj15CitDT05GSUdfS0VZQk9BUkRfR1BJTz15CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDY9eQorQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWD15CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfVUlOUFVUPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfVFRZX1BSSU5USz15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0FVMTU1MD15CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfQVUxNTUwPXkKK0NPTkZJR19TUElfR1BJTz15CitDT05GSUdfU0VOU09SU19BRE0xMDI1PXkKK0NPTkZJR19TRU5TT1JTX0xNNzA9eQorQ09ORklHX0ZCPXkKK0NPTkZJR19GQl9BVTExMDA9eQorQ09ORklHX0ZCX0FVMTIwMD15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWT15CitDT05GSUdfU09VTkQ9eQorQ09ORklHX1NORD15CitDT05GSUdfU05EX1NFUVVFTkNFUj15CitDT05GSUdfU05EX0hSVElNRVI9eQorQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15CitDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRT15CitDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRV9ERUZBVUxUPTEKK0NPTkZJR19TTkRfU09DPXkKK0NPTkZJR19TTkRfU09DX0FVMVhQU0M9eQorQ09ORklHX1NORF9TT0NfQVUxWEFVRElPPXkKK0NPTkZJR19TTkRfU09DX0RCMTAwMD15CitDT05GSUdfU05EX1NPQ19EQjEyMDA9eQorQ09ORklHX0hJRFJBVz15CitDT05GSUdfVUhJRD15CitDT05GSUdfSElEX0xPR0lURUNIPXkKK0NPTkZJR19ISURfTE9HSVRFQ0hfREo9eQorQ09ORklHX1VTQl9ISURERVY9eQorQ09ORklHX1VTQj15CitDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTPXkKK0NPTkZJR19VU0JfT1RHPXkKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKK0NPTkZJR19VU0JfRUhDSV9IQ0RfUExBVEZPUk09eQorQ09ORklHX1VTQl9PSENJX0hDRD15CitDT05GSUdfVVNCX09IQ0lfSENEX1BMQVRGT1JNPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CitDT05GSUdfTU1DPXkKK0NPTkZJR19NTUNfQ0xLR0FURT15CitDT05GSUdfU0RJT19VQVJUPXkKK0NPTkZJR19NTUNfQVUxWD15CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorQ09ORklHX0xFRFNfVFJJR0dFUlM9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9BVTFYWFg9eQorQ09ORklHX0ZJUk1XQVJFX01FTU1BUD15CitDT05GSUdfRVhUNF9GUz15CitDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQorQ09ORklHX1hGU19GUz15CitDT05GSUdfWEZTX1BPU0lYX0FDTD15CitDT05GSUdfRkFOT1RJRlk9eQorQ09ORklHX0ZVU0VfRlM9eQorQ09ORklHX0NVU0U9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQorQ09ORklHX0NPTkZJR0ZTX0ZTPXkKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfU1VNTUFSWT15CitDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUz15CitDT05GSUdfSkZGUzJfTFpPPXkKK0NPTkZJR19KRkZTMl9SVUJJTj15CitDT05GSUdfU1FVQVNIRlM9eQorQ09ORklHX1NRVUFTSEZTX0ZJTEVfRElSRUNUPXkKK0NPTkZJR19TUVVBU0hGU19YQVRUUj15CitDT05GSUdfU1FVQVNIRlNfTFpPPXkKK0NPTkZJR19TUVVBU0hGU19YWj15CitDT05GSUdfRjJGU19GUz15CitDT05GSUdfRjJGU19GU19TRUNVUklUWT15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjNfQUNMPXkKK0NPTkZJR19ORlNfVjQ9eQorQ09ORklHX05GU19WNF8xPXkKK0NPTkZJR19ORlNfVjRfMj15CitDT05GSUdfTkZTX1Y0XzFfSU1QTEVNRU5UQVRJT05fSURfRE9NQUlOPSJsb2NhbCIKK0NPTkZJR19ORlNfVjRfMV9NSUdSQVRJT049eQorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjNfQUNMPXkKK0NPTkZJR19ORlNEX1Y0PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUyPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD15CitDT05GSUdfTkxTX0FTQ0lJPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKK0NPTkZJR19OTFNfSVNPODg1OV8yPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xNT15CitDT05GSUdfTkxTX1VURjg9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19TRUNVUklUWUZTPXkKK0NPTkZJR19DUllQVE9fVVNFUj15CitDT05GSUdfQ1JZUFRPX0NSWVBURD15CitDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9eQorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj15CitDT05GSUdfQ1JDMzJfU0xJQ0VCWTQ9eQorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9sb29uZ3NvbjNfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbG9vbmdzb24zX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTE3NjFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbG9vbmdzb24zX2RlZmNvbmZpZwpAQCAtMCwwICsxLDM2MiBAQAorQ09ORklHX01BQ0hfTE9PTkdTT049eQorQ09ORklHX1NXSU9UTEI9eQorQ09ORklHX0xFTU9URV9NQUNIM0E9eQorQ09ORklHX0NQVV9MT09OR1NPTjM9eQorQ09ORklHXzY0QklUPXkKK0NPTkZJR19QQUdFX1NJWkVfMTZLQj15CitDT05GSUdfS1NNPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9NAorQ09ORklHX0haXzI1Nj15CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfS0VYRUM9eQorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKK0NPTkZJR19UQVNLU1RBVFM9eQorQ09ORklHX1RBU0tfREVMQVlfQUNDVD15CitDT05GSUdfVEFTS19YQUNDVD15CitDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlM9eQorQ09ORklHX01FTUNHPXkKK0NPTkZJR19NRU1DR19TV0FQPXkKK0NPTkZJR19CTEtfQ0dST1VQPXkKK0NPTkZJR19TQ0hFRF9BVVRPR1JPVVA9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1JFTEFZPXkKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfUkRfQlpJUDI9eQorQ09ORklHX1JEX0xaTUE9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19CTEtfREVWX0lOVEVHUklUWT15CitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19DRlFfR1JPVVBfSU9TQ0hFRD15CitDT05GSUdfUENJPXkKK0NPTkZJR19IVF9QQ0k9eQorQ09ORklHX1BDSUVQT1JUQlVTPXkKK0NPTkZJR19IT1RQTFVHX1BDSV9QQ0lFPXkKKyMgQ09ORklHX1BDSUVBRVIgaXMgbm90IHNldAorQ09ORklHX1BDSUVBU1BNX1BFUkZPUk1BTkNFPXkKK0NPTkZJR19IT1RQTFVHX1BDST15CitDT05GSUdfSE9UUExVR19QQ0lfU0hQQz1tCitDT05GSUdfQklORk1UX01JU0M9bQorQ09ORklHX01JUFMzMl9DT01QQVQ9eQorQ09ORklHX01JUFMzMl9PMzI9eQorQ09ORklHX01JUFMzMl9OMzI9eQorQ09ORklHX1BNX1JVTlRJTUU9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTV9VU0VSPXkKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX05FVEZJTFRFUj15CitDT05GSUdfTkVURklMVEVSX05FVExJTktfTE9HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQorQ09ORklHX0lQX1ZTPW0KK0NPTkZJR19JUF9ORl9JUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQorQ09ORklHX0lQX05GX01BVENIX0VDTj1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQorQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorQ09ORklHX0lQX1NDVFA9bQorQ09ORklHX0wyVFA9bQorQ09ORklHX0JSSURHRT1tCitDT05GSUdfQ0ZHODAyMTE9bQorQ09ORklHX0NGRzgwMjExX1dFWFQ9eQorQ09ORklHX01BQzgwMjExPW0KK0NPTkZJR19SRktJTEw9bQorQ09ORklHX1JGS0lMTF9JTlBVVD15CitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19ERVZUTVBGU19NT1VOVD15CitDT05GSUdfTVREPW0KK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX1JBSURfQVRUUlM9bQorQ09ORklHX1NDU0lfVEdUPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19CTEtfREVWX1NSPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19DSFJfREVWX1NDSD1tCitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKK0NPTkZJR19TQ1NJX0xPR0dJTkc9eQorQ09ORklHX1NDU0lfU1BJX0FUVFJTPW0KK0NPTkZJR19TQ1NJX0ZDX0FUVFJTPW0KK0NPTkZJR19JU0NTSV9UQ1A9bQorQ09ORklHX01FR0FSQUlEX05FV0dFTj15CitDT05GSUdfTUVHQVJBSURfTU09eQorQ09ORklHX01FR0FSQUlEX01BSUxCT1g9eQorQ09ORklHX01FR0FSQUlEX0xFR0FDWT15CitDT05GSUdfTUVHQVJBSURfU0FTPXkKK0NPTkZJR19BVEE9eQorQ09ORklHX1NBVEFfQUhDST15CitDT05GSUdfUEFUQV9BVElJWFA9eQorQ09ORklHX01EPXkKK0NPTkZJR19CTEtfREVWX01EPW0KK0NPTkZJR19NRF9MSU5FQVI9bQorQ09ORklHX01EX1JBSUQwPW0KK0NPTkZJR19NRF9SQUlEMT1tCitDT05GSUdfTURfUkFJRDEwPW0KK0NPTkZJR19NRF9SQUlENDU2PW0KK0NPTkZJR19NRF9NVUxUSVBBVEg9bQorQ09ORklHX0JMS19ERVZfRE09bQorQ09ORklHX0RNX0NSWVBUPW0KK0NPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fTUlSUk9SPW0KK0NPTkZJR19ETV9aRVJPPW0KK0NPTkZJR19UQVJHRVRfQ09SRT1tCitDT05GSUdfVENNX0lCTE9DSz1tCitDT05GSUdfVENNX0ZJTEVJTz1tCitDT05GSUdfVENNX1BTQ1NJPW0KK0NPTkZJR19MT09QQkFDS19UQVJHRVQ9bQorQ09ORklHX0lTQ1NJX1RBUkdFVD1tCitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfVFVOPW0KKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0FEQVBURUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9BTFRFT04gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9BTUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9BUkMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9BVEhFUk9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DQURFTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQlJPQURDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9CUk9DQURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQ0hFTFNJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0NJUlJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0NJU0NPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfREVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9FTVVMRVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9FWEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfSFAgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPXkKK0NPTkZJR19FMTAwMEU9eQorQ09ORklHX0lHQj15CitDT05GSUdfSVhHQj15CitDT05GSUdfSVhHQkU9eQorIyBDT05GSUdfTkVUX1ZFTkRPUl9JODI1WFggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUVMTEFOT1ggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NWVJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX05WSURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX09LSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUEFDS0VUX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1FMT0dJQyBpcyBub3Qgc2V0CitDT05GSUdfODEzOUNQPW0KK0NPTkZJR184MTM5VE9PPW0KK0NPTkZJR19SODE2OT15CisjIENPTkZJR19ORVRfVkVORE9SX1JEQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NFRVEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TSUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNU0MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TVE1JQ1JPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU1VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfVEVIVVRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfVEkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9UT1NISUJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfV0laTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorQ09ORklHX1BQUF9CU0RDT01QPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0ZJTFRFUj15CitDT05GSUdfUFBQX01QUEU9bQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorQ09ORklHX1BQUE9FPW0KK0NPTkZJR19QUFBPTDJUUD1tCitDT05GSUdfUFBQX0FTWU5DPW0KK0NPTkZJR19QUFBfU1lOQ19UVFk9bQorQ09ORklHX0FUSF9DQVJEUz1tCitDT05GSUdfQVRIOUs9bQorQ09ORklHX0hPU1RBUD1tCitDT05GSUdfSU5QVVRfUE9MTERFVj1tCitDT05GSUdfSU5QVVRfU1BBUlNFS01BUD15CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX0tFWUJPQVJEX1hUS0JEPW0KK0NPTkZJR19NT1VTRV9QUzJfU0VOVEVMSUM9eQorQ09ORklHX01PVVNFX1NFUklBTD1tCitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfVUlOUFVUPW0KK0NPTkZJR19TRVJJT19TRVJQT1JUPW0KK0NPTkZJR19TRVJJT19SQVc9bQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MTYKK0NPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xNgorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19SQVdfRFJJVkVSPW0KK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX1BJSVg0PXkKK0NPTkZJR19TRU5TT1JTX0xNNzU9bQorQ09ORklHX1NFTlNPUlNfTE05Mz1tCitDT05GSUdfU0VOU09SU19XODM2MjdIRj1tCitDT05GSUdfTUVESUFfU1VQUE9SVD1tCitDT05GSUdfTUVESUFfQ0FNRVJBX1NVUFBPUlQ9eQorQ09ORklHX01FRElBX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfVklERU9fQ0xBU1M9bQorQ09ORklHX0RSTT15CitDT05GSUdfRFJNX1JBREVPTj15CitDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQorQ09ORklHX0ZCX1JBREVPTj15CitDT05GSUdfTENEX0NMQVNTX0RFVklDRT15CitDT05GSUdfTENEX1BMQVRGT1JNPW0KK0NPTkZJR19CQUNLTElHSFRfR0VORVJJQz1tCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTj15CitDT05GSUdfTE9HTz15CitDT05GSUdfU09VTkQ9eQorQ09ORklHX1NORD1tCitDT05GSUdfU05EX1NFUVVFTkNFUj1tCitDT05GSUdfU05EX1NFUV9EVU1NWT1tCisjIENPTkZJR19TTkRfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfSERBX0lOVEVMPW0KK0NPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUj15CitDT05GSUdfU05EX0hEQV9DT0RFQ19SRUFMVEVLPW0KK0NPTkZJR19TTkRfSERBX0NPREVDX0NPTkVYQU5UPW0KKyMgQ09ORklHX1NORF9VU0IgaXMgbm90IHNldAorQ09ORklHX0hJRF9BNFRFQ0g9bQorQ09ORklHX0hJRF9TVU5QTFVTPW0KK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9NT049eQorQ09ORklHX1VTQl9YSENJX0hDRD1tCitDT05GSUdfVVNCX0VIQ0lfSENEPXkKK0NPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVD15CitDT05GSUdfVVNCX09IQ0lfSENEPXkKK0NPTkZJR19VU0JfVUhDSV9IQ0Q9bQorQ09ORklHX1VTQl9TVE9SQUdFPW0KK0NPTkZJR19VU0JfU0VSSUFMPW0KK0NPTkZJR19VU0JfU0VSSUFMX09QVElPTj1tCitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX0NNT1M9eQorQ09ORklHX0RNQURFVklDRVM9eQorQ09ORklHX1BNX0RFVkZSRVE9eQorQ09ORklHX0RFVkZSRVFfR09WX1NJTVBMRV9PTkRFTUFORD15CitDT05GSUdfREVWRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorQ09ORklHX0RFVkZSRVFfR09WX1BPV0VSU0FWRT15CitDT05GSUdfREVWRlJFUV9HT1ZfVVNFUlNQQUNFPXkKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDRfRlM9eQorQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19RVU9UQT15CisjIENPTkZJR19QUklOVF9RVU9UQV9XQVJOSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPXkKK0NPTkZJR19GVVNFX0ZTPW0KK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT05MzYKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9ImdiMjMxMiIKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19DT05GSUdGU19GUz15CitDT05GSUdfQ1JBTUZTPW0KK0NPTkZJR19TUVVBU0hGUz15CitDT05GSUdfU1FVQVNIRlNfWEFUVFI9eQorQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzX0FDTD15CitDT05GSUdfTkZTX1Y0PW0KK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1YzX0FDTD15CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfQ0lGUz1tCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CitDT05GSUdfTkxTX0NPREVQQUdFXzkzNj15CitDT05GSUdfTkxTX0FTQ0lJPXkKK0NPTkZJR19OTFNfVVRGOD15CitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorQ09ORklHX1NUUklQX0FTTV9TWU1TPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKK0NPTkZJR19TRUNVUklUWUZTPXkKK0NPTkZJR19TRUNVUklUWV9ORVRXT1JLPXkKK0NPTkZJR19TRUNVUklUWV9QQVRIPXkKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYPXkKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYX0JPT1RQQVJBTT15CitDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9ESVNBQkxFPXkKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CitDT05GSUdfQ1JZUFRPX0FVVEhFTkM9bQorQ09ORklHX0NSWVBUT19ITUFDPXkKK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fVEdSMTkyPW0KK0NPTkZJR19DUllQVE9fV1A1MTI9bQorQ09ORklHX0NSWVBUT19BTlVCSVM9bQorQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCitDT05GSUdfQ1JZUFRPX0NBU1Q1PW0KK0NPTkZJR19DUllQVE9fQ0FTVDY9bQorQ09ORklHX0NSWVBUT19LSEFaQUQ9bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fVEVBPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSD1tCitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCmluZGV4IGNlMWQzZWUuLmI3NDViNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKQEAgLTEsNyArMSw5IEBACiBDT05GSUdfTUlQU19NQUxUQT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0NQVV9NSVBTMzJfUjI9eQorQ09ORklHX1BBR0VfU0laRV8xNktCPXkKIENPTkZJR19NSVBTX01UX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CiBDT05GSUdfSFpfMTAwPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19OT19IWj15CkBAIC00Miw3ICs0NCw2IEBACiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPW0KIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9bQogQ09ORklHX1RDUF9NRDVTSUc9eQotQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSVBWNl9ST1VURVJfUFJFRj15CiBDT05GSUdfSVBWNl9ST1VURV9JTkZPPXkKIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFEPXkKQEAgLTY4LDcgKzY5LDYgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfQ1RfTkVUTElOSz1tCi1DT05GSUdfTkVURklMVEVSX1RQUk9YWT1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KQEAgLTEyNSw3ICsxMjUsNiBAQAogQ09ORklHX0lQX1ZTX1NFRD1tCiBDT05GSUdfSVBfVlNfTlE9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19JUF9ORl9RVUVVRT1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KIENPTkZJR19JUF9ORl9NQVRDSF9FQ049bQpAQCAtMTg1LDcgKzE4NCw2IEBACiBDT05GSUdfREVWX0FQUExFVEFMSz1tCiBDT05GSUdfSVBERFA9bQogQ09ORklHX0lQRERQX0VOQ0FQPXkKLUNPTkZJR19JUEREUF9ERUNBUD15CiBDT05GSUdfUEhPTkVUPW0KIENPTkZJR19ORVRfU0NIRUQ9eQogQ09ORklHX05FVF9TQ0hfQ0JRPW0KQEAgLTIyNiw5ICsyMjQsOSBAQAogQ09ORklHX01BQzgwMjExX01FU0g9eQogQ09ORklHX1JGS0lMTD1tCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19DT05ORUNUT1I9bQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX09PUFM9bQogQ09ORklHX01URF9DRkk9eQpAQCAtMzI4LDcgKzMyNiw2IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0Ci1DT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9rdm1fZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfa3ZtX2RlZmNvbmZpZwppbmRleCAzNDFiYjQ3Li40ZjdkOTUyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9rdm1fZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2t2bV9kZWZjb25maWcKQEAgLTMsNiArMyw3IEBACiBDT05GSUdfQ1BVX01JUFMzMl9SMj15CiBDT05GSUdfUEFHRV9TSVpFXzE2S0I9eQogQ09ORklHX01JUFNfTVRfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKIENPTkZJR19IWl8xMDA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX05PX0haPXkKQEAgLTQ0LDcgKzQ1LDYgQEAKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD1tCiBDT05GSUdfVENQX01ENVNJRz15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKIENPTkZJR19JUFY2X1JPVVRFX0lORk89eQogQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQpAQCAtNzAsNyArNzAsNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LPW0KLUNPTkZJR19ORVRGSUxURVJfVFBST1hZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQpAQCAtMTI3LDcgKzEyNiw2IEBACiBDT05GSUdfSVBfVlNfU0VEPW0KIENPTkZJR19JUF9WU19OUT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX1FVRVVFPW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCkBAIC0xODcsNyArMTg1LDYgQEAKIENPTkZJR19ERVZfQVBQTEVUQUxLPW0KIENPTkZJR19JUEREUD1tCiBDT05GSUdfSVBERFBfRU5DQVA9eQotQ09ORklHX0lQRERQX0RFQ0FQPXkKIENPTkZJR19QSE9ORVQ9bQogQ09ORklHX05FVF9TQ0hFRD15CiBDT05GSUdfTkVUX1NDSF9DQlE9bQpAQCAtMjI4LDkgKzIyNSw5IEBACiBDT05GSUdfTUFDODAyMTFfTUVTSD15CiBDT05GSUdfUkZLSUxMPW0KIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0NPTk5FQ1RPUj1tCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfT09QUz1tCiBDT05GSUdfTVREX0NGST15CkBAIC0zMDAsNiArMjk3LDcgQEAKIENPTkZJR19NQUNWTEFOPW0KIENPTkZJR19UVU49bQogQ09ORklHX1ZFVEg9bQorQ09ORklHX1ZIT1NUX05FVD1tCiBDT05GSUdfUENORVQzMj15CiBDT05GSUdfQ0hFTFNJT19UMz1tCiBDT05GSUdfQVg4ODc5Nj1tCkBAIC0zMjksNyArMzI3LDYgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKQEAgLTQ1Myw0ICs0NTAsMyBAQAogQ09ORklHX0tWTT1tCiBDT05GSUdfS1ZNX01JUFNfRFlOX1RSQU5TPXkKIENPTkZJR19LVk1fTUlQU19ERUJVR19DT1AwX0NPVU5URVJTPXkKLUNPTkZJR19WSE9TVF9ORVQ9bQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfa3ZtX2d1ZXN0X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2t2bV9ndWVzdF9kZWZjb25maWcKaW5kZXggMmI4NTU4Yi4uZTM2NjgxYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfa3ZtX2d1ZXN0X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9rdm1fZ3Vlc3RfZGVmY29uZmlnCkBAIC00NCw3ICs0NCw2IEBACiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPW0KIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9bQogQ09ORklHX1RDUF9NRDVTSUc9eQotQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSVBWNl9ST1VURVJfUFJFRj15CiBDT05GSUdfSVBWNl9ST1VURV9JTkZPPXkKIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFEPXkKQEAgLTcwLDcgKzY5LDYgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfQ1RfTkVUTElOSz1tCi1DT05GSUdfTkVURklMVEVSX1RQUk9YWT1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KQEAgLTEyNyw3ICsxMjUsNiBAQAogQ09ORklHX0lQX1ZTX1NFRD1tCiBDT05GSUdfSVBfVlNfTlE9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19JUF9ORl9RVUVVRT1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KIENPTkZJR19JUF9ORl9NQVRDSF9FQ049bQpAQCAtMTg3LDcgKzE4NCw2IEBACiBDT05GSUdfREVWX0FQUExFVEFMSz1tCiBDT05GSUdfSVBERFA9bQogQ09ORklHX0lQRERQX0VOQ0FQPXkKLUNPTkZJR19JUEREUF9ERUNBUD15CiBDT05GSUdfUEhPTkVUPW0KIENPTkZJR19ORVRfU0NIRUQ9eQogQ09ORklHX05FVF9TQ0hfQ0JRPW0KQEAgLTIyOCw5ICsyMjQsOSBAQAogQ09ORklHX01BQzgwMjExX01FU0g9eQogQ09ORklHX1JGS0lMTD1tCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19DT05ORUNUT1I9bQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX09PUFM9bQogQ09ORklHX01URF9DRkk9eQpAQCAtMzMxLDcgKzMyNyw2IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0Ci1DT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YWFwcnBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFhcHJwX2RlZmNvbmZpZwppbmRleCA5MzA1N2E3Li5mYjA0MmNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YWFwcnBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhYXBycF9kZWZjb25maWcKQEAgLTQ0LDcgKzQ0LDYgQEAKIENPTkZJR19JTkVUX0VTUD1tCiBDT05GSUdfSU5FVF9JUENPTVA9bQogIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSU5FVDZfQUg9bQogQ09ORklHX0lORVQ2X0VTUD1tCiBDT05GSUdfSU5FVDZfSVBDT01QPW0KQEAgLTU1LDcgKzU0LDYgQEAKIENPTkZJR19ERVZfQVBQTEVUQUxLPW0KIENPTkZJR19JUEREUD1tCiBDT05GSUdfSVBERFBfRU5DQVA9eQotQ09ORklHX0lQRERQX0RFQ0FQPXkKIENPTkZJR19ORVRfU0NIRUQ9eQogQ09ORklHX05FVF9TQ0hfQ0JRPW0KIENPTkZJR19ORVRfU0NIX0hUQj1tCkBAIC04MCw2ICs3OCw3IEBACiBDT05GSUdfTkVUX0FDVF9QT0xJQ0U9eQogQ09ORklHX05FVF9DTFNfSU5EPXkKICMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQogQ09ORklHX0lERT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdGNfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXRjX2RlZmNvbmZpZwppbmRleCA0ZTU0Yjc1Li5lYjMxNjQ0NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXRjX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdGNfZGVmY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogQ09ORklHX01JUFNfTUFMVEE9eQogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19DUFVfTUlQUzMyX1IyPXkKK0NPTkZJR19QQUdFX1NJWkVfMTZLQj15CiBDT05GSUdfTUlQU19NVF9TTVRDPXkKICMgQ09ORklHX01JUFNfTVRfRlBBRkYgaXMgbm90IHNldAogQ09ORklHX05SX0NQVVM9OQpAQCAtNDUsNyArNDYsNiBAQAogQ09ORklHX0lORVRfRVNQPW0KIENPTkZJR19JTkVUX0lQQ09NUD1tCiAjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JTkVUNl9BSD1tCiBDT05GSUdfSU5FVDZfRVNQPW0KIENPTkZJR19JTkVUNl9JUENPTVA9bQpAQCAtNTYsNyArNTYsNiBAQAogQ09ORklHX0RFVl9BUFBMRVRBTEs9bQogQ09ORklHX0lQRERQPW0KIENPTkZJR19JUEREUF9FTkNBUD15Ci1DT05GSUdfSVBERFBfREVDQVA9eQogQ09ORklHX05FVF9TQ0hFRD15CiBDT05GSUdfTkVUX1NDSF9DQlE9bQogQ09ORklHX05FVF9TQ0hfSFRCPW0KQEAgLTgxLDYgKzgwLDcgQEAKIENPTkZJR19ORVRfQUNUX1BPTElDRT15CiBDT05GSUdfTkVUX0NMU19JTkQ9eQogIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCiBDT05GSUdfSURFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdnBfZGVmY29uZmlnCmluZGV4IGQ3NTkzMTguLjEwZWYzYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXZwX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogQ09ORklHX01JUFNfTUFMVEE9eQogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19DUFVfTUlQUzMyX1IyPXkKK0NPTkZJR19QQUdFX1NJWkVfMTZLQj15CiBDT05GSUdfTUlQU19NVF9TTVA9eQogQ09ORklHX1NDSEVEX1NNVD15CiBDT05GSUdfTUlQU19DTVA9eQotQ09ORklHX05SX0NQVVM9MgorQ09ORklHX05SX0NQVVM9OAogQ09ORklHX0haXzEwMD15CiBDT05GSUdfTE9DQUxWRVJTSU9OPSJjbXAiCiBDT05GSUdfU1lTVklQQz15CkBAIC00Nyw3ICs0OCw2IEBACiBDT05GSUdfSU5FVF9FU1A9bQogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lORVQ2X0FIPW0KIENPTkZJR19JTkVUNl9FU1A9bQogQ09ORklHX0lORVQ2X0lQQ09NUD1tCkBAIC04Miw2ICs4Miw3IEBACiBDT05GSUdfTkVUX0FDVF9QT0xJQ0U9eQogQ09ORklHX05FVF9DTFNfSU5EPXkKICMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQogQ09ORklHX0lERT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdnBfZXZhX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9ldmFfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzAwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdnBfZXZhX2RlZmNvbmZpZwpAQCAtMCwwICsxLDIwMCBAQAorQ09ORklHX01JUFNfTUFMVEE9eQorQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKK0NPTkZJR19DUFVfTUlQUzMyX1IyPXkKK0NPTkZJR19DUFVfTUlQUzMyXzNfNV9GRUFUVVJFUz15CitDT05GSUdfUEFHRV9TSVpFXzE2S0I9eQorQ09ORklHX01JUFNfTVRfU01QPXkKK0NPTkZJR19TQ0hFRF9TTVQ9eQorQ09ORklHX01JUFNfQ01QPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19IWl8xMDA9eQorQ09ORklHX0xPQ0FMVkVSU0lPTj0iY21wIgorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQVVESVQ9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfU0xBQj15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfUENJPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTV9VU0VSPW0KK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfTkVUX0lQSVA9bQorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorQ09ORklHX0lQX1BJTVNNX1YyPXkKK0NPTkZJR19TWU5fQ09PS0lFUz15CitDT05GSUdfSU5FVF9BSD1tCitDT05GSUdfSU5FVF9FU1A9bQorQ09ORklHX0lORVRfSVBDT01QPW0KKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUNl9BSD1tCitDT05GSUdfSU5FVDZfRVNQPW0KK0NPTkZJR19JTkVUNl9JUENPTVA9bQorQ09ORklHX0lQVjZfVFVOTkVMPW0KK0NPTkZJR19CUklER0U9bQorQ09ORklHX1ZMQU5fODAyMVE9bQorQ09ORklHX0FUQUxLPW0KK0NPTkZJR19ERVZfQVBQTEVUQUxLPW0KK0NPTkZJR19JUEREUD1tCitDT05GSUdfSVBERFBfRU5DQVA9eQorQ09ORklHX05FVF9TQ0hFRD15CitDT05GSUdfTkVUX1NDSF9DQlE9bQorQ09ORklHX05FVF9TQ0hfSFRCPW0KK0NPTkZJR19ORVRfU0NIX0hGU0M9bQorQ09ORklHX05FVF9TQ0hfUFJJTz1tCitDT05GSUdfTkVUX1NDSF9SRUQ9bQorQ09ORklHX05FVF9TQ0hfU0ZRPW0KK0NPTkZJR19ORVRfU0NIX1RFUUw9bQorQ09ORklHX05FVF9TQ0hfVEJGPW0KK0NPTkZJR19ORVRfU0NIX0dSRUQ9bQorQ09ORklHX05FVF9TQ0hfRFNNQVJLPW0KK0NPTkZJR19ORVRfU0NIX05FVEVNPW0KK0NPTkZJR19ORVRfU0NIX0lOR1JFU1M9bQorQ09ORklHX05FVF9DTFNfQkFTSUM9bQorQ09ORklHX05FVF9DTFNfVENJTkRFWD1tCitDT05GSUdfTkVUX0NMU19ST1VURTQ9bQorQ09ORklHX05FVF9DTFNfRlc9bQorQ09ORklHX05FVF9DTFNfVTMyPW0KK0NPTkZJR19ORVRfQ0xTX1JTVlA9bQorQ09ORklHX05FVF9DTFNfUlNWUDY9bQorQ09ORklHX05FVF9DTFNfQUNUPXkKK0NPTkZJR19ORVRfQUNUX1BPTElDRT15CitDT05GSUdfTkVUX0NMU19JTkQ9eQorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCitDT05GSUdfSURFPXkKKyMgQ09ORklHX0lERV9QUk9DX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERVBDSV9QQ0lCVVNfT1JERVIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9QSUlYPXkKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKKyMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQURBUFRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0FMVEVPTiBpcyBub3Qgc2V0CitDT05GSUdfUENORVQzMj15CisjIENPTkZJR19ORVRfVkVORE9SX0FUSEVST1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9CUk9BRENPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0JST0NBREUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9DSEVMU0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQ0lTQ08gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9ERUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9ETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0VNVUxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0VYQVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9IUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0lOVEVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01FTExBTk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUlDUkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTVlSSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9OVklESUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9PS0kgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BBQ0tFVF9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9RTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SRUFMVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0VFUSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NJTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01TQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NUTUlDUk8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TVU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9URUhVVEkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9USSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9XSVpORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD00CitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9bQorQ09ORklHX0ZCPXkKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKK0NPTkZJR19GQl9NQVRST1g9eQorQ09ORklHX0ZCX01BVFJPWF9HPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9FSENJX0hDRD15CisjIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1VIQ0lfSENEPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorQ09ORklHX0xFRFNfVFJJR0dFUlM9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CitDT05GSUdfTEVEU19UUklHR0VSX0lERV9ESVNLPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfQkFDS0xJR0hUPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX0NNT1M9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19YRlNfRlM9eQorQ09ORklHX1hGU19RVU9UQT15CitDT05GSUdfWEZTX1BPU0lYX0FDTD15CitDT05GSUdfUVVPVEE9eQorQ09ORklHX1FGTVRfVjI9eQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfQ0lGUz1tCitDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0g9eQorQ09ORklHX0NJRlNfWEFUVFI9eQorQ09ORklHX0NJRlNfUE9TSVg9eQorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorQ09ORklHX05MU19JU084ODU5XzE9bQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTlVMTD1tCitDT05GSUdfQ1JZUFRPX1BDQkM9bQorQ09ORklHX0NSWVBUT19ITUFDPXkKK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCitDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KK0NPTkZJR19DUllQVE9fQ0FTVDU9bQorQ09ORklHX0NSWVBUT19DQVNUNj1tCitDT05GSUdfQ1JZUFRPX0tIQVpBRD1tCitDT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQorQ09ORklHX0NSWVBUT19URUE9bQorQ09ORklHX0NSWVBUT19UV09GSVNIPW0KKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YXVwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhdXBfZGVmY29uZmlnCmluZGV4IDk4NjhmYzkuLjYyMzQ0NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhdXBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhdXBfZGVmY29uZmlnCkBAIC00Myw3ICs0Myw2IEBACiBDT05GSUdfSU5FVF9FU1A9bQogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lORVQ2X0FIPW0KIENPTkZJR19JTkVUNl9FU1A9bQogQ09ORklHX0lORVQ2X0lQQ09NUD1tCkBAIC01NCw3ICs1Myw2IEBACiBDT05GSUdfREVWX0FQUExFVEFMSz1tCiBDT05GSUdfSVBERFA9bQogQ09ORklHX0lQRERQX0VOQ0FQPXkKLUNPTkZJR19JUEREUF9ERUNBUD15CiBDT05GSUdfTkVUX1NDSEVEPXkKIENPTkZJR19ORVRfU0NIX0NCUT1tCiBDT05GSUdfTkVUX1NDSF9IVEI9bQpAQCAtNzksNiArNzcsNyBAQAogQ09ORklHX05FVF9BQ1RfUE9MSUNFPXkKIENPTkZJR19ORVRfQ0xTX0lORD15CiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KIENPTkZJR19JREU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMmQ3ZjY1MC4uMDU0MzkxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0yLDE2ICsyLDE3IEBACiBnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gY3VycmVudC5oCiBnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbXV0ZXguaAogZ2VuZXJpYy15ICs9IHBhcnBvcnQuaAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKIGdlbmVyaWMteSArPSBzZWdtZW50LmgKIGdlbmVyaWMteSArPSBzZXJpYWwuaAogZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSB1Y29udGV4dC5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20tZXZhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtLWV2YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWM1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtLWV2YS5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisgKgorICovCisKKyNpZm5kZWYgX19BU01fQVNNX0VWQV9ICisjZGVmaW5lIF9fQVNNX0FTTV9FVkFfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2lmZGVmIENPTkZJR19FVkEKKworI2RlZmluZSBfX0JVSUxEX0VWQV9JTlNOKGluc24sIHJlZywgYWRkcikJCQkJXAorCQkJCSIJLnNldAlwdXNoXG4iCQkJXAorCQkJCSIJLnNldAltaXBzMFxuIgkJXAorCQkJCSIJLnNldAlldmFcbiIJCQlcCisJCQkJIgkiaW5zbiIgInJlZyIsICJhZGRyICJcbiIJXAorCQkJCSIJLnNldAlwb3BcbiIKKworI2RlZmluZSB1c2VyX2NhY2hlKG9wLCBiYXNlKQkJX19CVUlMRF9FVkFfSU5TTigiY2FjaGVlIiwgb3AsIGJhc2UpCisjZGVmaW5lIHVzZXJfbGwocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigibGxlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3NjKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oInNjZSIsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sdyhyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJsd2UiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbHdsKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oImx3bGUiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbHdyKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oImx3cmUiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbGgocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigibGhlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2xiKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oImxiZSIsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sYnUocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigibGJ1ZSIsIHJlZywgYWRkcikKKy8qIE5vIDY0LWJpdCBFVkEgaW5zdHJ1Y3Rpb24gZm9yIGxvYWRpbmcgZG91YmxlIHdvcmRzICovCisjZGVmaW5lIHVzZXJfbGQocmVnLCBhZGRyKQkJdXNlcl9sdyhyZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc3cocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigic3dlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3N3bChyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJzd2xlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3N3cihyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJzd3JlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3NoKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oInNoZSIsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zYihyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJzYmUiLCByZWcsIGFkZHIpCisvKiBObyA2NC1iaXQgRVZBIGluc3RydWN0aW9uIGZvciBzdG9yaW5nIGRvdWJsZSB3b3JkcyAqLworI2RlZmluZSB1c2VyX3NkKHJlZywgYWRkcikJCXVzZXJfc3cocmVnLCBhZGRyKQorCisjZWxzZQorCisjZGVmaW5lIHVzZXJfY2FjaGUob3AsIGJhc2UpCQkiY2FjaGUgIiBvcCAiLCAiIGJhc2UgIlxuIgorI2RlZmluZSB1c2VyX2xsKHJlZywgYWRkcikJCSJsbCAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX3NjKHJlZywgYWRkcikJCSJzYyAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX2x3KHJlZywgYWRkcikJCSJsdyAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX2x3bChyZWcsIGFkZHIpCQkibHdsICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfbHdyKHJlZywgYWRkcikJCSJsd3IgIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9saChyZWcsIGFkZHIpCQkibGggIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9sYihyZWcsIGFkZHIpCQkibGIgIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9sYnUocmVnLCBhZGRyKQkJImxidSAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX3N3KHJlZywgYWRkcikJCSJzdyAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX3N3bChyZWcsIGFkZHIpCQkic3dsICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfc3dyKHJlZywgYWRkcikJCSJzd3IgIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9zaChyZWcsIGFkZHIpCQkic2ggIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9zYihyZWcsIGFkZHIpCQkic2IgIiByZWcgIiwgIiBhZGRyICJcbiIKKworI2lmZGVmIENPTkZJR18zMkJJVAorLyoKKyAqIE5vICdzZCcgb3IgJ2xkJyBpbnN0cnVjdGlvbnMgaW4gMzItYml0IGJ1dCB0aGUgY29kZSB3aWxsCisgKiBkbyB0aGUgY29ycmVjdCB0aGluZworICovCisjZGVmaW5lIHVzZXJfc2QocmVnLCBhZGRyKQkJdXNlcl9zdyhyZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbGQocmVnLCBhZGRyKQkJdXNlcl9sdyhyZWcsIGFkZHIpCisjZWxzZQorI2RlZmluZSB1c2VyX3NkKHJlZywgYWRkcikJCSJzZCAiIHJlZyIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfbGQocmVnLCBhZGRyKQkJImxkICIgcmVnIiwgIiBhZGRyICJcbiIKKyNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KKworI2VuZGlmIC8qIENPTkZJR19FVkEgKi8KKworI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCisKKyNpZmRlZiBDT05GSUdfRVZBCisKKyNkZWZpbmUgX19CVUlMRF9FVkFfSU5TTihpbnNuLCByZWcsIGFkZHIpCQkJXAorCQkJCS5zZXQJcHVzaDsJCQlcCisJCQkJLnNldAltaXBzMDsJCQlcCisJCQkJLnNldAlldmE7CQkJXAorCQkJCWluc24gcmVnLCBhZGRyOwkJCVwKKwkJCQkuc2V0CXBvcDsKKworI2RlZmluZSB1c2VyX2NhY2hlKG9wLCBiYXNlKQkJX19CVUlMRF9FVkFfSU5TTihjYWNoZWUsIG9wLCBiYXNlKQorI2RlZmluZSB1c2VyX2xsKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04obGxlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc2MocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihzY2UsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sdyhyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKGx3ZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2x3bChyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKGx3bGUsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sd3IocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihsd3JlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbGgocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihsaGUsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sYihyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKGxiZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2xidShyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKGxidWUsIHJlZywgYWRkcikKKy8qIE5vIDY0LWJpdCBFVkEgaW5zdHJ1Y3Rpb24gZm9yIGxvYWRpbmcgZG91YmxlIHdvcmRzICovCisjZGVmaW5lIHVzZXJfbGQocmVnLCBhZGRyKQkJdXNlcl9sdyhyZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc3cocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihzd2UsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zd2wocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihzd2xlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc3dyKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oc3dyZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3NoKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oc2hlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc2IocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihzYmUsIHJlZywgYWRkcikKKy8qIE5vIDY0LWJpdCBFVkEgaW5zdHJ1Y3Rpb24gZm9yIGxvYWRpbmcgZG91YmxlIHdvcmRzICovCisjZGVmaW5lIHVzZXJfc2QocmVnLCBhZGRyKQkJdXNlcl9zdyhyZWcsIGFkZHIpCisjZWxzZQorCisjZGVmaW5lIHVzZXJfY2FjaGUob3AsIGJhc2UpCQljYWNoZSBvcCwgYmFzZQorI2RlZmluZSB1c2VyX2xsKHJlZywgYWRkcikJCWxsIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX3NjKHJlZywgYWRkcikJCXNjIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX2x3KHJlZywgYWRkcikJCWx3IHJlZywgYWRkcgorI2RlZmluZSB1c2VyX2x3bChyZWcsIGFkZHIpCQlsd2wgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfbHdyKHJlZywgYWRkcikJCWx3ciByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9saChyZWcsIGFkZHIpCQlsaCByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9sYihyZWcsIGFkZHIpCQlsYiByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9sYnUocmVnLCBhZGRyKQkJbGJ1IHJlZywgYWRkcgorI2RlZmluZSB1c2VyX3N3KHJlZywgYWRkcikJCXN3IHJlZywgYWRkcgorI2RlZmluZSB1c2VyX3N3bChyZWcsIGFkZHIpCQlzd2wgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfc3dyKHJlZywgYWRkcikJCXN3ciByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9zaChyZWcsIGFkZHIpCQlzaCByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9zYihyZWcsIGFkZHIpCQlzYiByZWcsIGFkZHIKKworI2lmZGVmIENPTkZJR18zMkJJVAorLyoKKyAqIE5vICdzZCcgb3IgJ2xkJyBpbnN0cnVjdGlvbnMgaW4gMzItYml0IGJ1dCB0aGUgY29kZSB3aWxsCisgKiBkbyB0aGUgY29ycmVjdCB0aGluZworICovCisjZGVmaW5lIHVzZXJfc2QocmVnLCBhZGRyKQkJdXNlcl9zdyhyZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbGQocmVnLCBhZGRyKQkJdXNlcl9sdyhyZWcsIGFkZHIpCisjZWxzZQorI2RlZmluZSB1c2VyX3NkKHJlZywgYWRkcikJCXNkIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX2xkKHJlZywgYWRkcikJCWxkIHJlZywgYWRkcgorI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLworCisjZW5kaWYgLyogQ09ORklHX0VWQSAqLworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0FTTV9BU01fRVZBX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20uaAppbmRleCA4Nzk2OTFkLi43YzI2YjI4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIF9fQVNNX0FTTV9ICiAKICNpbmNsdWRlIDxhc20vc2dpZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9hc20tZXZhLmg+CiAKICNpZm5kZWYgQ0FUCiAjaWZkZWYgX19TVERDX18KQEAgLTE0NSwxOSArMTQ2LDI3IEBACiAKICNkZWZpbmUgUFJFRihoaW50LGFkZHIpCQkJCQlcCiAJCS5zZXQJcHVzaDsJCQkJXAotCQkuc2V0CW1pcHM0OwkJCQlcCisJCS5zZXQJYXJjaD1yNTAwMDsJCQlcCiAJCXByZWYJaGludCwgYWRkcjsJCQlcCiAJCS5zZXQJcG9wCiAKKyNkZWZpbmUgUFJFRkUoaGludCwgYWRkcikJCQkJXAorCQkuc2V0CXB1c2g7CQkJCVwKKwkJLnNldAltaXBzMDsJCQkJXAorCQkuc2V0CWV2YTsJCQkJXAorCQlwcmVmZQloaW50LCBhZGRyOwkJCVwKKwkJLnNldAlwb3AKKwogI2RlZmluZSBQUkVGWChoaW50LGFkZHIpCQkJCVwKIAkJLnNldAlwdXNoOwkJCQlcCi0JCS5zZXQJbWlwczQ7CQkJCVwKKwkJLnNldAlhcmNoPXI1MDAwOwkJCVwKIAkJcHJlZngJaGludCwgYWRkcjsJCQlcCiAJCS5zZXQJcG9wCiAKICNlbHNlIC8qICFDT05GSUdfQ1BVX0hBU19QUkVGRVRDSCAqLwogCiAjZGVmaW5lIFBSRUYoaGludCwgYWRkcikKKyNkZWZpbmUgUFJFRkUoaGludCwgYWRkcikKICNkZWZpbmUgUFJFRlgoaGludCwgYWRkcikKIAogI2VuZGlmIC8qICFDT05GSUdfQ1BVX0hBU19QUkVGRVRDSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTMyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaAppbmRleCA3MGUxZjE3Li5lMzhjMjgxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaApAQCAtMTQsNzUgKzE0LDc1IEBACiAKIAkubWFjcm8JZnB1X3NhdmVfc2luZ2xlIHRocmVhZCB0bXA9dDAKIAljZmMxCVx0bXAsICBmY3IzMQotCXN3YzEJJGYwLCAgVEhSRUFEX0ZQUjAoXHRocmVhZCkKLQlzd2MxCSRmMSwgIFRIUkVBRF9GUFIxKFx0aHJlYWQpCi0Jc3djMQkkZjIsICBUSFJFQURfRlBSMihcdGhyZWFkKQotCXN3YzEJJGYzLCAgVEhSRUFEX0ZQUjMoXHRocmVhZCkKLQlzd2MxCSRmNCwgIFRIUkVBRF9GUFI0KFx0aHJlYWQpCi0Jc3djMQkkZjUsICBUSFJFQURfRlBSNShcdGhyZWFkKQotCXN3YzEJJGY2LCAgVEhSRUFEX0ZQUjYoXHRocmVhZCkKLQlzd2MxCSRmNywgIFRIUkVBRF9GUFI3KFx0aHJlYWQpCi0Jc3djMQkkZjgsICBUSFJFQURfRlBSOChcdGhyZWFkKQotCXN3YzEJJGY5LCAgVEhSRUFEX0ZQUjkoXHRocmVhZCkKLQlzd2MxCSRmMTAsIFRIUkVBRF9GUFIxMChcdGhyZWFkKQotCXN3YzEJJGYxMSwgVEhSRUFEX0ZQUjExKFx0aHJlYWQpCi0Jc3djMQkkZjEyLCBUSFJFQURfRlBSMTIoXHRocmVhZCkKLQlzd2MxCSRmMTMsIFRIUkVBRF9GUFIxMyhcdGhyZWFkKQotCXN3YzEJJGYxNCwgVEhSRUFEX0ZQUjE0KFx0aHJlYWQpCi0Jc3djMQkkZjE1LCBUSFJFQURfRlBSMTUoXHRocmVhZCkKLQlzd2MxCSRmMTYsIFRIUkVBRF9GUFIxNihcdGhyZWFkKQotCXN3YzEJJGYxNywgVEhSRUFEX0ZQUjE3KFx0aHJlYWQpCi0Jc3djMQkkZjE4LCBUSFJFQURfRlBSMTgoXHRocmVhZCkKLQlzd2MxCSRmMTksIFRIUkVBRF9GUFIxOShcdGhyZWFkKQotCXN3YzEJJGYyMCwgVEhSRUFEX0ZQUjIwKFx0aHJlYWQpCi0Jc3djMQkkZjIxLCBUSFJFQURfRlBSMjEoXHRocmVhZCkKLQlzd2MxCSRmMjIsIFRIUkVBRF9GUFIyMihcdGhyZWFkKQotCXN3YzEJJGYyMywgVEhSRUFEX0ZQUjIzKFx0aHJlYWQpCi0Jc3djMQkkZjI0LCBUSFJFQURfRlBSMjQoXHRocmVhZCkKLQlzd2MxCSRmMjUsIFRIUkVBRF9GUFIyNShcdGhyZWFkKQotCXN3YzEJJGYyNiwgVEhSRUFEX0ZQUjI2KFx0aHJlYWQpCi0Jc3djMQkkZjI3LCBUSFJFQURfRlBSMjcoXHRocmVhZCkKLQlzd2MxCSRmMjgsIFRIUkVBRF9GUFIyOChcdGhyZWFkKQotCXN3YzEJJGYyOSwgVEhSRUFEX0ZQUjI5KFx0aHJlYWQpCi0Jc3djMQkkZjMwLCBUSFJFQURfRlBSMzAoXHRocmVhZCkKLQlzd2MxCSRmMzEsIFRIUkVBRF9GUFIzMShcdGhyZWFkKQorCXN3YzEJJGYwLCAgVEhSRUFEX0ZQUjBfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxLCAgVEhSRUFEX0ZQUjFfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyLCAgVEhSRUFEX0ZQUjJfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYzLCAgVEhSRUFEX0ZQUjNfTFM2NChcdGhyZWFkKQorCXN3YzEJJGY0LCAgVEhSRUFEX0ZQUjRfTFM2NChcdGhyZWFkKQorCXN3YzEJJGY1LCAgVEhSRUFEX0ZQUjVfTFM2NChcdGhyZWFkKQorCXN3YzEJJGY2LCAgVEhSRUFEX0ZQUjZfTFM2NChcdGhyZWFkKQorCXN3YzEJJGY3LCAgVEhSRUFEX0ZQUjdfTFM2NChcdGhyZWFkKQorCXN3YzEJJGY4LCAgVEhSRUFEX0ZQUjhfTFM2NChcdGhyZWFkKQorCXN3YzEJJGY5LCAgVEhSRUFEX0ZQUjlfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxMCwgVEhSRUFEX0ZQUjEwX0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMTEsIFRIUkVBRF9GUFIxMV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjEyLCBUSFJFQURfRlBSMTJfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxMywgVEhSRUFEX0ZQUjEzX0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMTQsIFRIUkVBRF9GUFIxNF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjE1LCBUSFJFQURfRlBSMTVfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxNiwgVEhSRUFEX0ZQUjE2X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMTcsIFRIUkVBRF9GUFIxN19MUzY0KFx0aHJlYWQpCisJc3djMQkkZjE4LCBUSFJFQURfRlBSMThfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxOSwgVEhSRUFEX0ZQUjE5X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjAsIFRIUkVBRF9GUFIyMF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjIxLCBUSFJFQURfRlBSMjFfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyMiwgVEhSRUFEX0ZQUjIyX0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjMsIFRIUkVBRF9GUFIyM19MUzY0KFx0aHJlYWQpCisJc3djMQkkZjI0LCBUSFJFQURfRlBSMjRfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyNSwgVEhSRUFEX0ZQUjI1X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjYsIFRIUkVBRF9GUFIyNl9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjI3LCBUSFJFQURfRlBSMjdfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyOCwgVEhSRUFEX0ZQUjI4X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjksIFRIUkVBRF9GUFIyOV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjMwLCBUSFJFQURfRlBSMzBfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYzMSwgVEhSRUFEX0ZQUjMxX0xTNjQoXHRocmVhZCkKIAlzdwlcdG1wLCBUSFJFQURfRkNSMzEoXHRocmVhZCkKIAkuZW5kbQogCiAJLm1hY3JvCWZwdV9yZXN0b3JlX3NpbmdsZSB0aHJlYWQgdG1wPXQwCiAJbHcJXHRtcCwgVEhSRUFEX0ZDUjMxKFx0aHJlYWQpCi0JbHdjMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQotCWx3YzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKLQlsd2MxCSRmMiwgIFRIUkVBRF9GUFIyKFx0aHJlYWQpCi0JbHdjMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQotCWx3YzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKLQlsd2MxCSRmNSwgIFRIUkVBRF9GUFI1KFx0aHJlYWQpCi0JbHdjMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQotCWx3YzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKLQlsd2MxCSRmOCwgIFRIUkVBRF9GUFI4KFx0aHJlYWQpCi0JbHdjMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQotCWx3YzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCi0JbHdjMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKLQlsd2MxCSRmMTIsIFRIUkVBRF9GUFIxMihcdGhyZWFkKQotCWx3YzEJJGYxMywgVEhSRUFEX0ZQUjEzKFx0aHJlYWQpCi0JbHdjMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKLQlsd2MxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQotCWx3YzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCi0JbHdjMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKLQlsd2MxCSRmMTgsIFRIUkVBRF9GUFIxOChcdGhyZWFkKQotCWx3YzEJJGYxOSwgVEhSRUFEX0ZQUjE5KFx0aHJlYWQpCi0JbHdjMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKLQlsd2MxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQotCWx3YzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCi0JbHdjMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKLQlsd2MxCSRmMjQsIFRIUkVBRF9GUFIyNChcdGhyZWFkKQotCWx3YzEJJGYyNSwgVEhSRUFEX0ZQUjI1KFx0aHJlYWQpCi0JbHdjMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKLQlsd2MxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQotCWx3YzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCi0JbHdjMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKLQlsd2MxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQotCWx3YzEJJGYzMSwgVEhSRUFEX0ZQUjMxKFx0aHJlYWQpCisJbHdjMQkkZjAsICBUSFJFQURfRlBSMF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjEsICBUSFJFQURfRlBSMV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjIsICBUSFJFQURfRlBSMl9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjMsICBUSFJFQURfRlBSM19MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjQsICBUSFJFQURfRlBSNF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjUsICBUSFJFQURfRlBSNV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjYsICBUSFJFQURfRlBSNl9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjcsICBUSFJFQURfRlBSN19MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjgsICBUSFJFQURfRlBSOF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjksICBUSFJFQURfRlBSOV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjEwLCBUSFJFQURfRlBSMTBfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYxMSwgVEhSRUFEX0ZQUjExX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTIsIFRIUkVBRF9GUFIxMl9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjEzLCBUSFJFQURfRlBSMTNfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYxNCwgVEhSRUFEX0ZQUjE0X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTUsIFRIUkVBRF9GUFIxNV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjE2LCBUSFJFQURfRlBSMTZfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYxNywgVEhSRUFEX0ZQUjE3X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTgsIFRIUkVBRF9GUFIxOF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjE5LCBUSFJFQURfRlBSMTlfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyMCwgVEhSRUFEX0ZQUjIwX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMjEsIFRIUkVBRF9GUFIyMV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjIyLCBUSFJFQURfRlBSMjJfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyMywgVEhSRUFEX0ZQUjIzX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMjQsIFRIUkVBRF9GUFIyNF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjI1LCBUSFJFQURfRlBSMjVfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyNiwgVEhSRUFEX0ZQUjI2X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMjcsIFRIUkVBRF9GUFIyN19MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjI4LCBUSFJFQURfRlBSMjhfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyOSwgVEhSRUFEX0ZQUjI5X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMzAsIFRIUkVBRF9GUFIzMF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjMxLCBUSFJFQURfRlBSMzFfTFM2NChcdGhyZWFkKQogCWN0YzEJXHRtcCwgZmNyMzEKIAkuZW5kbQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCmluZGV4IDMyMjBjOTMuLmI0NjRiOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBfQVNNX0FTTU1BQ1JPX0gKIAogI2luY2x1ZGUgPGFzbS9oYXphcmRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNpZmRlZiBDT05GSUdfMzJCSVQKICNpbmNsdWRlIDxhc20vYXNtbWFjcm8tMzIuaD4KQEAgLTU0LDU5ICs1NSw2OSBAQAogCS5lbmRtCiAKIAkubWFjcm8JbG9jYWxfaXJxX2Rpc2FibGUgcmVnPXQwCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlsdyAgICAgIFxyZWcsIFRJX1BSRV9DT1VOVCgkMjgpCisJYWRkaSAgICBccmVnLCBccmVnLCAxCisJc3cgICAgICBccmVnLCBUSV9QUkVfQ09VTlQoJDI4KQorI2VuZGlmCiAJbWZjMAlccmVnLCBDUDBfU1RBVFVTCiAJb3JpCVxyZWcsIFxyZWcsIDEKIAl4b3JpCVxyZWcsIFxyZWcsIDEKIAltdGMwCVxyZWcsIENQMF9TVEFUVVMKIAlpcnFfZGlzYWJsZV9oYXphcmQKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCWx3ICAgICAgXHJlZywgVElfUFJFX0NPVU5UKCQyOCkKKwlhZGRpICAgIFxyZWcsIFxyZWcsIC0xCisJc3cgICAgICBccmVnLCBUSV9QUkVfQ09VTlQoJDI4KQorI2VuZGlmCiAJLmVuZG0KICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAKIAkubWFjcm8JZnB1X3NhdmVfMTZldmVuIHRocmVhZCB0bXA9dDAKIAljZmMxCVx0bXAsIGZjcjMxCi0Jc2RjMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQotCXNkYzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKLQlzZGMxCSRmNCwgIFRIUkVBRF9GUFI0KFx0aHJlYWQpCi0Jc2RjMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQotCXNkYzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKLQlzZGMxCSRmMTAsIFRIUkVBRF9GUFIxMChcdGhyZWFkKQotCXNkYzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCi0Jc2RjMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKLQlzZGMxCSRmMTYsIFRIUkVBRF9GUFIxNihcdGhyZWFkKQotCXNkYzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCi0Jc2RjMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKLQlzZGMxCSRmMjIsIFRIUkVBRF9GUFIyMihcdGhyZWFkKQotCXNkYzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCi0Jc2RjMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKLQlzZGMxCSRmMjgsIFRIUkVBRF9GUFIyOChcdGhyZWFkKQotCXNkYzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCisJc2RjMQkkZjAsICBUSFJFQURfRlBSMF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjIsICBUSFJFQURfRlBSMl9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjQsICBUSFJFQURfRlBSNF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjYsICBUSFJFQURfRlBSNl9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjgsICBUSFJFQURfRlBSOF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjEwLCBUSFJFQURfRlBSMTBfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYxMiwgVEhSRUFEX0ZQUjEyX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTQsIFRIUkVBRF9GUFIxNF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjE2LCBUSFJFQURfRlBSMTZfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYxOCwgVEhSRUFEX0ZQUjE4X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjAsIFRIUkVBRF9GUFIyMF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjIyLCBUSFJFQURfRlBSMjJfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyNCwgVEhSRUFEX0ZQUjI0X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjYsIFRIUkVBRF9GUFIyNl9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjI4LCBUSFJFQURfRlBSMjhfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYzMCwgVEhSRUFEX0ZQUjMwX0xTNjQoXHRocmVhZCkKIAlzdwlcdG1wLCBUSFJFQURfRkNSMzEoXHRocmVhZCkKIAkuZW5kbQogCiAJLm1hY3JvCWZwdV9zYXZlXzE2b2RkIHRocmVhZAogCS5zZXQJcHVzaAogCS5zZXQJbWlwczY0cjIKLQlzZGMxCSRmMSwgIFRIUkVBRF9GUFIxKFx0aHJlYWQpCi0Jc2RjMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQotCXNkYzEJJGY1LCAgVEhSRUFEX0ZQUjUoXHRocmVhZCkKLQlzZGMxCSRmNywgIFRIUkVBRF9GUFI3KFx0aHJlYWQpCi0Jc2RjMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQotCXNkYzEJJGYxMSwgVEhSRUFEX0ZQUjExKFx0aHJlYWQpCi0Jc2RjMQkkZjEzLCBUSFJFQURfRlBSMTMoXHRocmVhZCkKLQlzZGMxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQotCXNkYzEJJGYxNywgVEhSRUFEX0ZQUjE3KFx0aHJlYWQpCi0Jc2RjMQkkZjE5LCBUSFJFQURfRlBSMTkoXHRocmVhZCkKLQlzZGMxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQotCXNkYzEJJGYyMywgVEhSRUFEX0ZQUjIzKFx0aHJlYWQpCi0Jc2RjMQkkZjI1LCBUSFJFQURfRlBSMjUoXHRocmVhZCkKLQlzZGMxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQotCXNkYzEJJGYyOSwgVEhSRUFEX0ZQUjI5KFx0aHJlYWQpCi0Jc2RjMQkkZjMxLCBUSFJFQURfRlBSMzEoXHRocmVhZCkKKwlzZGMxCSRmMSwgIFRIUkVBRF9GUFIxX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMywgIFRIUkVBRF9GUFIzX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmNSwgIFRIUkVBRF9GUFI1X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmNywgIFRIUkVBRF9GUFI3X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmOSwgIFRIUkVBRF9GUFI5X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTEsIFRIUkVBRF9GUFIxMV9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjEzLCBUSFJFQURfRlBSMTNfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTcsIFRIUkVBRF9GUFIxN19MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjE5LCBUSFJFQURfRlBSMTlfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjMsIFRIUkVBRF9GUFIyM19MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjI1LCBUSFJFQURfRlBSMjVfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyNywgVEhSRUFEX0ZQUjI3X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjksIFRIUkVBRF9GUFIyOV9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjMxLCBUSFJFQURfRlBSMzFfTFM2NChcdGhyZWFkKQogCS5zZXQJcG9wCiAJLmVuZG0KIAogCS5tYWNybwlmcHVfc2F2ZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXAKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCiAJc2xsCVx0bXAsIFxzdGF0dXMsIDUKIAliZ2V6CVx0bXAsIDEwZgogCWZwdV9zYXZlXzE2b2RkIFx0aHJlYWQKQEAgLTExNyw0OSArMTI4LDQ5IEBACiAKIAkubWFjcm8JZnB1X3Jlc3RvcmVfMTZldmVuIHRocmVhZCB0bXA9dDAKIAlsdwlcdG1wLCBUSFJFQURfRkNSMzEoXHRocmVhZCkKLQlsZGMxCSRmMCwgIFRIUkVBRF9GUFIwKFx0aHJlYWQpCi0JbGRjMQkkZjIsICBUSFJFQURfRlBSMihcdGhyZWFkKQotCWxkYzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKLQlsZGMxCSRmNiwgIFRIUkVBRF9GUFI2KFx0aHJlYWQpCi0JbGRjMQkkZjgsICBUSFJFQURfRlBSOChcdGhyZWFkKQotCWxkYzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCi0JbGRjMQkkZjEyLCBUSFJFQURfRlBSMTIoXHRocmVhZCkKLQlsZGMxCSRmMTQsIFRIUkVBRF9GUFIxNChcdGhyZWFkKQotCWxkYzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCi0JbGRjMQkkZjE4LCBUSFJFQURfRlBSMTgoXHRocmVhZCkKLQlsZGMxCSRmMjAsIFRIUkVBRF9GUFIyMChcdGhyZWFkKQotCWxkYzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCi0JbGRjMQkkZjI0LCBUSFJFQURfRlBSMjQoXHRocmVhZCkKLQlsZGMxCSRmMjYsIFRIUkVBRF9GUFIyNihcdGhyZWFkKQotCWxkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCi0JbGRjMQkkZjMwLCBUSFJFQURfRlBSMzAoXHRocmVhZCkKKwlsZGMxCSRmMCwgIFRIUkVBRF9GUFIwX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMiwgIFRIUkVBRF9GUFIyX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmNCwgIFRIUkVBRF9GUFI0X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmNiwgIFRIUkVBRF9GUFI2X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmOCwgIFRIUkVBRF9GUFI4X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTAsIFRIUkVBRF9GUFIxMF9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjEyLCBUSFJFQURfRlBSMTJfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxNCwgVEhSRUFEX0ZQUjE0X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTYsIFRIUkVBRF9GUFIxNl9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjE4LCBUSFJFQURfRlBSMThfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyMCwgVEhSRUFEX0ZQUjIwX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMjIsIFRIUkVBRF9GUFIyMl9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjI0LCBUSFJFQURfRlBSMjRfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyNiwgVEhSRUFEX0ZQUjI2X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMjgsIFRIUkVBRF9GUFIyOF9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjMwLCBUSFJFQURfRlBSMzBfTFM2NChcdGhyZWFkKQogCWN0YzEJXHRtcCwgZmNyMzEKIAkuZW5kbQogCiAJLm1hY3JvCWZwdV9yZXN0b3JlXzE2b2RkIHRocmVhZAogCS5zZXQJcHVzaAogCS5zZXQJbWlwczY0cjIKLQlsZGMxCSRmMSwgIFRIUkVBRF9GUFIxKFx0aHJlYWQpCi0JbGRjMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQotCWxkYzEJJGY1LCAgVEhSRUFEX0ZQUjUoXHRocmVhZCkKLQlsZGMxCSRmNywgIFRIUkVBRF9GUFI3KFx0aHJlYWQpCi0JbGRjMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQotCWxkYzEJJGYxMSwgVEhSRUFEX0ZQUjExKFx0aHJlYWQpCi0JbGRjMQkkZjEzLCBUSFJFQURfRlBSMTMoXHRocmVhZCkKLQlsZGMxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQotCWxkYzEJJGYxNywgVEhSRUFEX0ZQUjE3KFx0aHJlYWQpCi0JbGRjMQkkZjE5LCBUSFJFQURfRlBSMTkoXHRocmVhZCkKLQlsZGMxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQotCWxkYzEJJGYyMywgVEhSRUFEX0ZQUjIzKFx0aHJlYWQpCi0JbGRjMQkkZjI1LCBUSFJFQURfRlBSMjUoXHRocmVhZCkKLQlsZGMxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQotCWxkYzEJJGYyOSwgVEhSRUFEX0ZQUjI5KFx0aHJlYWQpCi0JbGRjMQkkZjMxLCBUSFJFQURfRlBSMzEoXHRocmVhZCkKKwlsZGMxCSRmMSwgIFRIUkVBRF9GUFIxX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMywgIFRIUkVBRF9GUFIzX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmNSwgIFRIUkVBRF9GUFI1X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmNywgIFRIUkVBRF9GUFI3X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmOSwgIFRIUkVBRF9GUFI5X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTEsIFRIUkVBRF9GUFIxMV9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjEzLCBUSFJFQURfRlBSMTNfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTcsIFRIUkVBRF9GUFIxN19MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjE5LCBUSFJFQURfRlBSMTlfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMjMsIFRIUkVBRF9GUFIyM19MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjI1LCBUSFJFQURfRlBSMjVfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyNywgVEhSRUFEX0ZQUjI3X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMjksIFRIUkVBRF9GUFIyOV9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjMxLCBUSFJFQURfRlBSMzFfTFM2NChcdGhyZWFkKQogCS5zZXQJcG9wCiAJLmVuZG0KIAogCS5tYWNybwlmcHVfcmVzdG9yZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXAKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCiAJc2xsCVx0bXAsIFxzdGF0dXMsIDUKIAliZ2V6CVx0bXAsIDEwZgkJCQkjIDE2IHJlZ2lzdGVyIG1vZGU/CiAKQEAgLTE2OSw2ICsxODAsMTcgQEAKIAlmcHVfcmVzdG9yZV8xNmV2ZW4gXHRocmVhZCBcdG1wCiAJLmVuZG0KIAorI2lmZGVmIENPTkZJR19DUFVfTUlQU1IyCisJLm1hY3JvCV9FWFQJcmQsIHJzLCBwLCBzCisJZXh0CVxyZCwgXHJzLCBccCwgXHMKKwkuZW5kbQorI2Vsc2UgLyogIUNPTkZJR19DUFVfTUlQU1IyICovCisJLm1hY3JvCV9FWFQJcmQsIHJzLCBwLCBzCisJc3JsCVxyZCwgXHJzLCBccAorCWFuZGkJXHJkLCBccmQsICgxIDw8IFxzKSAtIDEKKwkuZW5kbQorI2VuZGlmIC8qICFDT05GSUdfQ1BVX01JUFNSMiAqLworCiAvKgogICogVGVtcG9yYXJ5IHVudGlsIGFsbCBnYXMgaGF2ZSBNVCBBU0Ugc3VwcG9ydAogICovCkBAIC0xOTYsNCArMjE4LDE5NSBAQAogCSAud29yZAkweDQxODAwMDAwIHwgKFxydCA8PCAxNikgfCAoXHJkIDw8IDExKSB8IChcdSA8PCA1KSB8IChcc2VsKQogCS5lbmRtCiAKKyNpZmRlZiBUT09MQ0hBSU5fU1VQUE9SVFNfTVNBCisJLm1hY3JvCWxkX2QJd2QsIG9mZiwgYmFzZQorCS5zZXQJcHVzaAorCS5zZXQJbWlwczMycjIKKwkuc2V0CW1zYQorCWxkLmQJJHdcd2QsIFxvZmYoXGJhc2UpCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCXN0X2QJd2QsIG9mZiwgYmFzZQorCS5zZXQJcHVzaAorCS5zZXQJbWlwczMycjIKKwkuc2V0CW1zYQorCXN0LmQJJHdcd2QsIFxvZmYoXGJhc2UpCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWNvcHlfdV93CXJkLCB3cywgbgorCS5zZXQJcHVzaAorCS5zZXQJbWlwczMycjIKKwkuc2V0CW1zYQorCWNvcHlfdS53IFxyZCwgJHdcd3NbXG5dCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWNvcHlfdV9kCXJkLCB3cywgbgorCS5zZXQJcHVzaAorCS5zZXQJbWlwczY0cjIKKwkuc2V0CW1zYQorCWNvcHlfdS5kIFxyZCwgJHdcd3NbXG5dCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWluc2VydF93CXdkLCBuLCBycworCS5zZXQJcHVzaAorCS5zZXQJbWlwczMycjIKKwkuc2V0CW1zYQorCWluc2VydC53ICR3XHdkW1xuXSwgXHJzCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWluc2VydF9kCXdkLCBuLCBycworCS5zZXQJcHVzaAorCS5zZXQJbWlwczY0cjIKKwkuc2V0CW1zYQorCWluc2VydC5kICR3XHdkW1xuXSwgXHJzCisJLnNldAlwb3AKKwkuZW5kbQorI2Vsc2UKKwkvKgorCSAqIFRlbXBvcmFyeSB1bnRpbCBhbGwgdG9vbGNoYWlucyBpbiB1c2UgaW5jbHVkZSBNU0Egc3VwcG9ydC4KKwkgKi8KKwkubWFjcm8JY2ZjbXNhCXJkLCBjcworCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS53b3JkCTB4Nzg3ZTAwNTkgfCAoXGNzIDw8IDExKQorCW1vdmUJXHJkLCAkMQorCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwljdGNtc2EJY2QsIHJzCisJLnNldAlwdXNoCisJLnNldAlub2F0CisJbW92ZQkkMSwgXHJzCisJLndvcmQJMHg3ODNlMDgxOSB8IChcY2QgPDwgNikKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JbGRfZAl3ZCwgb2ZmLCBiYXNlCisJLnNldAlwdXNoCisJLnNldAlub2F0CisJYWRkCSQxLCBcYmFzZSwgXG9mZgorCS53b3JkCTB4NzgwMDA4MjMgfCAoXHdkIDw8IDYpCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCXN0X2QJd2QsIG9mZiwgYmFzZQorCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCWFkZAkkMSwgXGJhc2UsIFxvZmYKKwkud29yZAkweDc4MDAwODI3IHwgKFx3ZCA8PCA2KQorCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwljb3B5X3VfdwlyZCwgd3MsIG4KKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwkud29yZAkweDc4ZjAwMDU5IHwgKFxuIDw8IDE2KSB8IChcd3MgPDwgMTEpCisJLyogbW92ZSB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnLi4uICovCisJb3IJXHJkLCAkMSwgemVybworCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwljb3B5X3VfZAlyZCwgd3MsIG4KKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwkud29yZAkweDc4ZjgwMDU5IHwgKFxuIDw8IDE2KSB8IChcd3MgPDwgMTEpCisJLyogbW92ZSB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnLi4uICovCisJb3IJXHJkLCAkMSwgemVybworCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwlpbnNlcnRfdwl3ZCwgbiwgcnMKKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwkvKiBtb3ZlIHRyaWdnZXJzIGFuIGFzc2VtYmxlciBidWcuLi4gKi8KKwlvcgkkMSwgXHJzLCB6ZXJvCisJLndvcmQJMHg3OTMwMDgxOSB8IChcbiA8PCAxNikgfCAoXHdkIDw8IDYpCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWluc2VydF9kCXdkLCBuLCBycworCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS8qIG1vdmUgdHJpZ2dlcnMgYW4gYXNzZW1ibGVyIGJ1Zy4uLiAqLworCW9yCSQxLCBccnMsIHplcm8KKwkud29yZAkweDc5MzgwODE5IHwgKFxuIDw8IDE2KSB8IChcd2QgPDwgNikKKwkuc2V0CXBvcAorCS5lbmRtCisjZW5kaWYKKworCS5tYWNybwltc2Ffc2F2ZV9hbGwJdGhyZWFkCisJc3RfZAkwLCBUSFJFQURfRlBSMCwgXHRocmVhZAorCXN0X2QJMSwgVEhSRUFEX0ZQUjEsIFx0aHJlYWQKKwlzdF9kCTIsIFRIUkVBRF9GUFIyLCBcdGhyZWFkCisJc3RfZAkzLCBUSFJFQURfRlBSMywgXHRocmVhZAorCXN0X2QJNCwgVEhSRUFEX0ZQUjQsIFx0aHJlYWQKKwlzdF9kCTUsIFRIUkVBRF9GUFI1LCBcdGhyZWFkCisJc3RfZAk2LCBUSFJFQURfRlBSNiwgXHRocmVhZAorCXN0X2QJNywgVEhSRUFEX0ZQUjcsIFx0aHJlYWQKKwlzdF9kCTgsIFRIUkVBRF9GUFI4LCBcdGhyZWFkCisJc3RfZAk5LCBUSFJFQURfRlBSOSwgXHRocmVhZAorCXN0X2QJMTAsIFRIUkVBRF9GUFIxMCwgXHRocmVhZAorCXN0X2QJMTEsIFRIUkVBRF9GUFIxMSwgXHRocmVhZAorCXN0X2QJMTIsIFRIUkVBRF9GUFIxMiwgXHRocmVhZAorCXN0X2QJMTMsIFRIUkVBRF9GUFIxMywgXHRocmVhZAorCXN0X2QJMTQsIFRIUkVBRF9GUFIxNCwgXHRocmVhZAorCXN0X2QJMTUsIFRIUkVBRF9GUFIxNSwgXHRocmVhZAorCXN0X2QJMTYsIFRIUkVBRF9GUFIxNiwgXHRocmVhZAorCXN0X2QJMTcsIFRIUkVBRF9GUFIxNywgXHRocmVhZAorCXN0X2QJMTgsIFRIUkVBRF9GUFIxOCwgXHRocmVhZAorCXN0X2QJMTksIFRIUkVBRF9GUFIxOSwgXHRocmVhZAorCXN0X2QJMjAsIFRIUkVBRF9GUFIyMCwgXHRocmVhZAorCXN0X2QJMjEsIFRIUkVBRF9GUFIyMSwgXHRocmVhZAorCXN0X2QJMjIsIFRIUkVBRF9GUFIyMiwgXHRocmVhZAorCXN0X2QJMjMsIFRIUkVBRF9GUFIyMywgXHRocmVhZAorCXN0X2QJMjQsIFRIUkVBRF9GUFIyNCwgXHRocmVhZAorCXN0X2QJMjUsIFRIUkVBRF9GUFIyNSwgXHRocmVhZAorCXN0X2QJMjYsIFRIUkVBRF9GUFIyNiwgXHRocmVhZAorCXN0X2QJMjcsIFRIUkVBRF9GUFIyNywgXHRocmVhZAorCXN0X2QJMjgsIFRIUkVBRF9GUFIyOCwgXHRocmVhZAorCXN0X2QJMjksIFRIUkVBRF9GUFIyOSwgXHRocmVhZAorCXN0X2QJMzAsIFRIUkVBRF9GUFIzMCwgXHRocmVhZAorCXN0X2QJMzEsIFRIUkVBRF9GUFIzMSwgXHRocmVhZAorCS5lbmRtCisKKwkubWFjcm8JbXNhX3Jlc3RvcmVfYWxsCXRocmVhZAorCWxkX2QJMCwgVEhSRUFEX0ZQUjAsIFx0aHJlYWQKKwlsZF9kCTEsIFRIUkVBRF9GUFIxLCBcdGhyZWFkCisJbGRfZAkyLCBUSFJFQURfRlBSMiwgXHRocmVhZAorCWxkX2QJMywgVEhSRUFEX0ZQUjMsIFx0aHJlYWQKKwlsZF9kCTQsIFRIUkVBRF9GUFI0LCBcdGhyZWFkCisJbGRfZAk1LCBUSFJFQURfRlBSNSwgXHRocmVhZAorCWxkX2QJNiwgVEhSRUFEX0ZQUjYsIFx0aHJlYWQKKwlsZF9kCTcsIFRIUkVBRF9GUFI3LCBcdGhyZWFkCisJbGRfZAk4LCBUSFJFQURfRlBSOCwgXHRocmVhZAorCWxkX2QJOSwgVEhSRUFEX0ZQUjksIFx0aHJlYWQKKwlsZF9kCTEwLCBUSFJFQURfRlBSMTAsIFx0aHJlYWQKKwlsZF9kCTExLCBUSFJFQURfRlBSMTEsIFx0aHJlYWQKKwlsZF9kCTEyLCBUSFJFQURfRlBSMTIsIFx0aHJlYWQKKwlsZF9kCTEzLCBUSFJFQURfRlBSMTMsIFx0aHJlYWQKKwlsZF9kCTE0LCBUSFJFQURfRlBSMTQsIFx0aHJlYWQKKwlsZF9kCTE1LCBUSFJFQURfRlBSMTUsIFx0aHJlYWQKKwlsZF9kCTE2LCBUSFJFQURfRlBSMTYsIFx0aHJlYWQKKwlsZF9kCTE3LCBUSFJFQURfRlBSMTcsIFx0aHJlYWQKKwlsZF9kCTE4LCBUSFJFQURfRlBSMTgsIFx0aHJlYWQKKwlsZF9kCTE5LCBUSFJFQURfRlBSMTksIFx0aHJlYWQKKwlsZF9kCTIwLCBUSFJFQURfRlBSMjAsIFx0aHJlYWQKKwlsZF9kCTIxLCBUSFJFQURfRlBSMjEsIFx0aHJlYWQKKwlsZF9kCTIyLCBUSFJFQURfRlBSMjIsIFx0aHJlYWQKKwlsZF9kCTIzLCBUSFJFQURfRlBSMjMsIFx0aHJlYWQKKwlsZF9kCTI0LCBUSFJFQURfRlBSMjQsIFx0aHJlYWQKKwlsZF9kCTI1LCBUSFJFQURfRlBSMjUsIFx0aHJlYWQKKwlsZF9kCTI2LCBUSFJFQURfRlBSMjYsIFx0aHJlYWQKKwlsZF9kCTI3LCBUSFJFQURfRlBSMjcsIFx0aHJlYWQKKwlsZF9kCTI4LCBUSFJFQURfRlBSMjgsIFx0aHJlYWQKKwlsZF9kCTI5LCBUSFJFQURfRlBSMjksIFx0aHJlYWQKKwlsZF9kCTMwLCBUSFJFQURfRlBSMzAsIFx0aHJlYWQKKwlsZF9kCTMxLCBUSFJFQURfRlBSMzEsIFx0aHJlYWQKKwkuZW5kbQorCiAjZW5kaWYgLyogX0FTTV9BU01NQUNST19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggN2VlZDJmMi4uZThlYjNkNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtNTMsNyArNTMsNyBAQAogCQlpbnQgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbAklMCwgJTEJCSMgYXRvbWljX2FkZAkJXG4iCiAJCSIJYWRkdQklMCwgJTIJCQkJCVxuIgogCQkiCXNjCSUwLCAlMQkJCQkJXG4iCkBAIC02Niw3ICs2Niw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbAklMCwgJTEJCSMgYXRvbWljX2FkZAlcbiIKIAkJCSIJYWRkdQklMCwgJTIJCQkJXG4iCiAJCQkiCXNjCSUwLCAlMQkJCQlcbiIKQEAgLTk2LDcgKzk2LDcgQEAKIAkJaW50IHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGwJJTAsICUxCQkjIGF0b21pY19zdWIJCVxuIgogCQkiCXN1YnUJJTAsICUyCQkJCQlcbiIKIAkJIglzYwklMCwgJTEJCQkJCVxuIgpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbAklMCwgJTEJCSMgYXRvbWljX3N1YglcbiIKIAkJCSIJc3VidQklMCwgJTIJCQkJXG4iCiAJCQkiCXNjCSUwLCAlMQkJCQlcbiIKQEAgLTEzOSw3ICsxMzksNyBAQAogCQlpbnQgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbAklMSwgJTIJCSMgYXRvbWljX2FkZF9yZXR1cm4JXG4iCiAJCSIJYWRkdQklMCwgJTEsICUzCQkJCVxuIgogCQkiCXNjCSUwLCAlMgkJCQkJXG4iCkBAIC0xNTMsNyArMTUzLDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCWxsCSUxLCAlMgkjIGF0b21pY19hZGRfcmV0dXJuCVxuIgogCQkJIglhZGR1CSUwLCAlMSwgJTMJCQlcbiIKIAkJCSIJc2MJJTAsICUyCQkJCVxuIgpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCWludCB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJIyBhdG9taWNfc3ViX3JldHVybglcbiIKIAkJIglzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJc2MJJTAsICUyCQkJCQlcbiIKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGwJJTEsICUyCSMgYXRvbWljX3N1Yl9yZXR1cm4JXG4iCiAJCQkiCXN1YnUJJTAsICUxLCAlMwkJCVxuIgogCQkJIglzYwklMCwgJTIJCQkJXG4iCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJaW50IHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGwJJTEsICUyCQkjIGF0b21pY19zdWJfaWZfcG9zaXRpdmVcbiIKIAkJIglzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJYmx0egklMCwgMWYJCQkJCVxuIgpAQCAtMjY2LDcgKzI2Niw3IEBACiAJCWludCB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJIyBhdG9taWNfc3ViX2lmX3Bvc2l0aXZlXG4iCiAJCSIJc3VidQklMCwgJTEsICUzCQkJCVxuIgogCQkiCWJsdHoJJTAsIDFmCQkJCQlcbiIKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQlsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGxkCSUwLCAlMQkJIyBhdG9taWM2NF9hZGQJCVxuIgogCQkiCWRhZGR1CSUwLCAlMgkJCQkJXG4iCiAJCSIJc2NkCSUwLCAlMQkJCQkJXG4iCkBAIC00MzMsNyArNDMzLDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCWxsZAklMCwgJTEJCSMgYXRvbWljNjRfYWRkCVxuIgogCQkJIglkYWRkdQklMCwgJTIJCQkJXG4iCiAJCQkiCXNjZAklMCwgJTEJCQkJXG4iCkBAIC00NjMsNyArNDYzLDcgQEAKIAkJbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsZAklMCwgJTEJCSMgYXRvbWljNjRfc3ViCQlcbiIKIAkJIglkc3VidQklMCwgJTIJCQkJCVxuIgogCQkiCXNjZAklMCwgJTEJCQkJCVxuIgpAQCAtNDc2LDcgKzQ3Niw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbGQJJTAsICUxCQkjIGF0b21pYzY0X3N1YglcbiIKIAkJCSIJZHN1YnUJJTAsICUyCQkJCVxuIgogCQkJIglzY2QJJTAsICUxCQkJCVxuIgpAQCAtNTA2LDcgKzUwNiw3IEBACiAJCWxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbGQJJTEsICUyCQkjIGF0b21pYzY0X2FkZF9yZXR1cm4JXG4iCiAJCSIJZGFkZHUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIglzY2QJJTAsICUyCQkJCQlcbiIKQEAgLTUyMCw3ICs1MjAsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGxkCSUxLCAlMgkjIGF0b21pYzY0X2FkZF9yZXR1cm4JXG4iCiAJCQkiCWRhZGR1CSUwLCAlMSwgJTMJCQlcbiIKIAkJCSIJc2NkCSUwLCAlMgkJCQlcbiIKQEAgLTU1Niw3ICs1NTYsNyBAQAogCQlsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGxkCSUxLCAlMgkJIyBhdG9taWM2NF9zdWJfcmV0dXJuCVxuIgogCQkiCWRzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJc2NkCSUwLCAlMgkJCQkJXG4iCkBAIC01NzEsNyArNTcxLDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCWxsZAklMSwgJTIJIyBhdG9taWM2NF9zdWJfcmV0dXJuCVxuIgogCQkJIglkc3VidQklMCwgJTEsICUzCQkJXG4iCiAJCQkiCXNjZAklMCwgJTIJCQkJXG4iCkBAIC02MTUsNyArNjE1LDcgQEAKIAkJbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsZAklMSwgJTIJCSMgYXRvbWljNjRfc3ViX2lmX3Bvc2l0aXZlXG4iCiAJCSIJZHN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIglibHR6CSUwLCAxZgkJCQkJXG4iCkBAIC02MzMsNyArNjMzLDcgQEAKIAkJbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsZAklMSwgJTIJCSMgYXRvbWljNjRfc3ViX2lmX3Bvc2l0aXZlXG4iCiAJCSIJZHN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIglibHR6CSUwLCAxZgkJCQkJXG4iCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYml0b3BzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggNzEzMDVhOC4uNmE2NWQ0OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JpdG9wcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9iaXRvcHMuaApAQCAtNzksNyArNzksNyBAQAogCiAJaWYgKGtlcm5lbF91c2VzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CSIgX19MTCAiJTAsICUxCQkJIyBzZXRfYml0CVxuIgogCQkiCW9yCSUwLCAlMgkJCQkJXG4iCiAJCSIJIiBfX1NDCSIlMCwgJTEJCQkJCVxuIgpAQCAtMTAxLDcgKzEwMSw3IEBACiAJfSBlbHNlIGlmIChrZXJuZWxfdXNlc19sbHNjKSB7CiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMICIlMCwgJTEJCSMgc2V0X2JpdAlcbiIKIAkJCSIJb3IJJTAsICUyCQkJCVxuIgogCQkJIgkiIF9fU0MJIiUwLCAlMQkJCQlcbiIKQEAgLTEzMSw3ICsxMzEsNyBAQAogCiAJaWYgKGtlcm5lbF91c2VzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CSIgX19MTCAiJTAsICUxCQkJIyBjbGVhcl9iaXQJXG4iCiAJCSIJYW5kCSUwLCAlMgkJCQkJXG4iCiAJCSIJIiBfX1NDICIlMCwgJTEJCQkJCVxuIgpAQCAtMTUzLDcgKzE1Myw3IEBACiAJfSBlbHNlIGlmIChrZXJuZWxfdXNlc19sbHNjKSB7CiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMICIlMCwgJTEJCSMgY2xlYXJfYml0CVxuIgogCQkJIglhbmQJJTAsICUyCQkJCVxuIgogCQkJIgkiIF9fU0MgIiUwLCAlMQkJCQlcbiIKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJIjE6CSIgX19MTCAiJTAsICUxCQkjIGNoYW5nZV9iaXQJXG4iCiAJCSIJeG9yCSUwLCAlMgkJCQlcbiIKIAkJIgkiIF9fU0MJIiUwLCAlMQkJCQlcbiIKQEAgLTIxMSw3ICsyMTEsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMICIlMCwgJTEJCSMgY2hhbmdlX2JpdAlcbiIKIAkJCSIJeG9yCSUwLCAlMgkJCQlcbiIKIAkJCSIJIiBfX1NDCSIlMCwgJTEJCQkJXG4iCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CSIgX19MTCAiJTAsICUxCQkjIHRlc3RfYW5kX3NldF9iaXQJXG4iCiAJCSIJb3IJJTIsICUwLCAlMwkJCQlcbiIKIAkJIgkiIF9fU0MJIiUyLCAlMQkJCQkJXG4iCkBAIC0yNjAsNyArMjYwLDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCSIgX19MTCAiJTAsICUxCSMgdGVzdF9hbmRfc2V0X2JpdAlcbiIKIAkJCSIJb3IJJTIsICUwLCAlMwkJCVxuIgogCQkJIgkiIF9fU0MJIiUyLCAlMQkJCQlcbiIKQEAgLTI5OCw3ICsyOTgsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJIiBfX0xMICIlMCwgJTEJCSMgdGVzdF9hbmRfc2V0X2JpdAlcbiIKIAkJIglvcgklMiwgJTAsICUzCQkJCVxuIgogCQkiCSIgX19TQwkiJTIsICUxCQkJCQlcbiIKQEAgLTMxNCw3ICszMTQsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMICIlMCwgJTEJIyB0ZXN0X2FuZF9zZXRfYml0CVxuIgogCQkJIglvcgklMiwgJTAsICUzCQkJXG4iCiAJCQkiCSIgX19TQwkiJTIsICUxCQkJCVxuIgpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOgkiIF9fTEwJIiUwLCAlMQkJIyB0ZXN0X2FuZF9jbGVhcl9iaXQJXG4iCiAJCSIJb3IJJTIsICUwLCAlMwkJCQlcbiIKIAkJIgl4b3IJJTIsICUzCQkJCQlcbiIKQEAgLTM4Niw3ICszODYsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMCSIlMCwgJTEgIyB0ZXN0X2FuZF9jbGVhcl9iaXQJXG4iCiAJCQkiCW9yCSUyLCAlMCwgJTMJCQlcbiIKIAkJCSIJeG9yCSUyLCAlMwkJCQlcbiIKQEAgLTQyNyw3ICs0MjcsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJIiBfX0xMCSIlMCwgJTEJCSMgdGVzdF9hbmRfY2hhbmdlX2JpdAlcbiIKIAkJIgl4b3IJJTIsICUwLCAlMwkJCQlcbiIKIAkJIgkiIF9fU0MJIiUyLCAlMQkJCQkJXG4iCkBAIC00NDMsNyArNDQzLDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCSIgX19MTAkiJTAsICUxICMgdGVzdF9hbmRfY2hhbmdlX2JpdAlcbiIKIAkJCSIJeG9yCSUyLCAlMCwgJTMJCQlcbiIKIAkJCSIJIiBfX1NDCSJcdCUyLCAlMQkJCVxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaAppbmRleCA0ZDJjZGVhLi4xZjdjYThiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaApAQCAtNjEsMTUgKzYxLDIxIEBACiAvKgogICogVmFsaWQgbWFjaHR5cGUgZm9yIExvb25nc29uIGZhbWlseQogICovCi0jZGVmaW5lIE1BQ0hfTE9PTkdTT05fVU5LTk9XTiAgMAotI2RlZmluZSBNQUNIX0xFTU9URV9GTDJFICAgICAgIDEKLSNkZWZpbmUgTUFDSF9MRU1PVEVfRkwyRiAgICAgICAyCi0jZGVmaW5lIE1BQ0hfTEVNT1RFX01MMkY3ICAgICAgMwotI2RlZmluZSBNQUNIX0xFTU9URV9ZTDJGODkgICAgIDQKLSNkZWZpbmUgTUFDSF9ERVhYT05fR0RJVU0yRjEwICA1Ci0jZGVmaW5lIE1BQ0hfTEVNT1RFX05BUwkgICAgICAgNgotI2RlZmluZSBNQUNIX0xFTU9URV9MTDJGICAgICAgIDcKLSNkZWZpbmUgTUFDSF9MT09OR1NPTl9FTkQgICAgICA4CitlbnVtIGxvb25nc29uX21hY2hpbmVfdHlwZSB7CisJTUFDSF9MT09OR1NPTl9VTktOT1dOLAorCU1BQ0hfTEVNT1RFX0ZMMkUsCisJTUFDSF9MRU1PVEVfRkwyRiwKKwlNQUNIX0xFTU9URV9NTDJGNywKKwlNQUNIX0xFTU9URV9ZTDJGODksCisJTUFDSF9ERVhYT05fR0RJVU0yRjEwLAorCU1BQ0hfTEVNT1RFX05BUywKKwlNQUNIX0xFTU9URV9MTDJGLAorCU1BQ0hfTEVNT1RFX0ExMDA0LAorCU1BQ0hfTEVNT1RFX0ExMTAxLAorCU1BQ0hfTEVNT1RFX0ExMjAxLAorCU1BQ0hfTEVNT1RFX0ExMjA1LAorCU1BQ0hfTE9PTkdTT05fRU5ECit9OwogCiAvKgogICogVmFsaWQgbWFjaHR5cGUgZm9yIGdyb3VwIElOR0VOSUMKQEAgLTExMiw2ICsxMTgsOCBAQAogZXh0ZXJuIHZvaWQgZnJlZV9pbml0X3BhZ2VzKGNvbnN0IGNoYXIgKndoYXQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBlbmQpOwogCitleHRlcm4gdm9pZCAoKmZyZWVfaW5pdF9wYWdlc19ldmEpKHZvaWQgKmJlZ2luLCB2b2lkICplbmQpOworCiAvKgogICogSW5pdGlhbCBrZXJuZWwgY29tbWFuZCBsaW5lLCB1c3VhbGx5IHNldHVwIGJ5IHByb21faW5pdCgpCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKaW5kZXggYWMzZDJiOC4uMzQxOGM1MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTcsNiArNyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDAxIFRoaWVtbyBTZXVmZXIuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWFjaWVqIFcuIFJvenlja2kKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaWZuZGVmIF9BU01fQ0hFQ0tTVU1fSAogI2RlZmluZSBfQVNNX0NIRUNLU1VNX0gKQEAgLTI5LDkgKzMwLDEzIEBACiAgKi8KIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKLV9fd3N1bSBfX2NzdW1fcGFydGlhbF9jb3B5X3VzZXIoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCi0JCQkJaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKK19fd3N1bSBfX2NzdW1fcGFydGlhbF9jb3B5X2tlcm5lbChjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cik7CiAKK19fd3N1bSBfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cik7CitfX3dzdW0gX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cik7CiAvKgogICogdGhpcyBpcyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBhYm92ZSB0aGF0IHJlY29yZHMgZXJyb3JzIGl0IGZpbmRzIGluICplcnJwLAogICogYnV0IGNvbnRpbnVlcyBhbmQgemVyb3MgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KQEAgLTQxLDggKzQ2LDI2IEBACiAJCQkJICAgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCW1pZ2h0X2ZhdWx0KCk7Ci0JcmV0dXJuIF9fY3N1bV9wYXJ0aWFsX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkICopc3JjLCBkc3QsCi0JCQkJCWxlbiwgc3VtLCBlcnJfcHRyKTsKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKQorCQlyZXR1cm4gX19jc3VtX3BhcnRpYWxfY29weV9rZXJuZWwoKF9fZm9yY2Ugdm9pZCAqKXNyYywgZHN0LAorCQkJCQkJICBsZW4sIHN1bSwgZXJyX3B0cik7CisJZWxzZQorCQlyZXR1cm4gX19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoKF9fZm9yY2Ugdm9pZCAqKXNyYywgZHN0LAorCQkJCQkJICAgICBsZW4sIHN1bSwgZXJyX3B0cik7Cit9CisKKyNkZWZpbmUgX0hBVkVfQVJDSF9DT1BZX0FORF9DU1VNX0ZST01fVVNFUgorc3RhdGljIGlubGluZQorX193c3VtIGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCBsZW4pKQorCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwKKwkJCQkJCSAgIGVycl9wdHIpOworCWlmIChsZW4pCisJCSplcnJfcHRyID0gLUVGQVVMVDsKKworCXJldHVybiBzdW07CiB9CiAKIC8qCkBAIC01NCw5ICs3NywxNiBAQAogCQkJICAgICBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7CiAJbWlnaHRfZmF1bHQoKTsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKQotCQlyZXR1cm4gX19jc3VtX3BhcnRpYWxfY29weV91c2VyKHNyYywgKF9fZm9yY2Ugdm9pZCAqKWRzdCwKLQkJCQkJCWxlbiwgc3VtLCBlcnJfcHRyKTsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKSB7CisJCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCisJCQlyZXR1cm4gX19jc3VtX3BhcnRpYWxfY29weV9rZXJuZWwoc3JjLAorCQkJCQkJCSAgKF9fZm9yY2Ugdm9pZCAqKWRzdCwKKwkJCQkJCQkgIGxlbiwgc3VtLCBlcnJfcHRyKTsKKwkJZWxzZQorCQkJcmV0dXJuIF9fY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihzcmMsCisJCQkJCQkJICAgKF9fZm9yY2Ugdm9pZCAqKWRzdCwKKwkJCQkJCQkgICBsZW4sIHN1bSwgZXJyX3B0cik7CisJfQogCWlmIChsZW4pCiAJCSplcnJfcHRyID0gLUVGQVVMVDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NtcHhjaGcuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKaW5kZXggNDY2MDY5Yi4uZWVmY2FhMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NtcHhjaGcuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY21weGNoZy5oCkBAIC0yMiwxMSArMjIsMTEgQEAKIAkJdW5zaWduZWQgbG9uZyBkdW1teTsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbAklMCwgJTMJCQkjIHhjaGdfdTMyCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQkiCW1vdmUJJTIsICV6NAkJCQkJXG4iCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiCXNjCSUyLCAlMQkJCQkJXG4iCiAJCSIJYmVxemwJJTIsIDFiCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKQEAgLTM4LDExICszOCwxMSBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGwJJTAsICUzCQkjIHhjaGdfdTMyCVxuIgogCQkJIgkuc2V0CW1pcHMwCQkJCVxuIgogCQkJIgltb3ZlCSUyLCAlejQJCQkJXG4iCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglzYwklMiwgJTEJCQkJXG4iCiAJCQkiCS5zZXQJbWlwczAJCQkJXG4iCiAJCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKQEAgLTc0LDcgKzc0LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBkdW1teTsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbGQJJTAsICUzCQkJIyB4Y2hnX3U2NAlcbiIKIAkJIgltb3ZlCSUyLCAlejQJCQkJCVxuIgogCQkiCXNjZAklMiwgJTEJCQkJCVxuIgpAQCAtODgsNyArODgsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGxkCSUwLCAlMwkJIyB4Y2hnX3U2NAlcbiIKIAkJCSIJbW92ZQklMiwgJXo0CQkJCVxuIgogCQkJIglzY2QJJTIsICUxCQkJCVxuIgpAQCAtMTQ1LDEyICsxNDUsMTIgQEAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJCSIJLnNldAlwdXNoCQkJCVxuIglcCiAJCSIJLnNldAlub2F0CQkJCVxuIglcCi0JCSIJLnNldAltaXBzMwkJCQlcbiIJXAorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIglcCiAJCSIxOgkiIGxkICIJJTAsICUyCQkjIF9fY21weGNoZ19hc20gXG4iCVwKIAkJIglibmUJJTAsICV6MywgMmYJCQlcbiIJXAogCQkiCS5zZXQJbWlwczAJCQkJXG4iCVwKIAkJIgltb3ZlCSQxLCAlejQJCQkJXG4iCVwKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkJIgkiIHN0ICIJJDEsICUxCQkJCVxuIglcCiAJCSIJYmVxemwJJDEsIDFiCQkJCVxuIglcCiAJCSIyOgkJCQkJCVxuIglcCkBAIC0xNjIsMTIgKzE2MiwxMiBAQAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkJIgkuc2V0CXB1c2gJCQkJXG4iCVwKIAkJIgkuc2V0CW5vYXQJCQkJXG4iCVwKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkJIjE6CSIgbGQgIgklMCwgJTIJCSMgX19jbXB4Y2hnX2FzbSBcbiIJXAogCQkiCWJuZQklMCwgJXozLCAyZgkJCVxuIglcCiAJCSIJLnNldAltaXBzMAkJCQlcbiIJXAogCQkiCW1vdmUJJDEsICV6NAkJCQlcbiIJXAotCQkiCS5zZXQJbWlwczMJCQkJXG4iCVwKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIJXAogCQkiCSIgc3QgIgkkMSwgJTEJCQkJXG4iCVwKIAkJIgliZXF6CSQxLCAxYgkJCQlcbiIJXAogCQkiCS5zZXQJcG9wCQkJCVxuIglcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmgKaW5kZXggNmU3MGIwMy4uZjU2Y2M5NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1mZWF0dXJlcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaApAQCAtMjYsNyArMjYsOSBAQAogI2lmbmRlZiBjcHVfaGFzX3NlZ21lbnRzCiAjZGVmaW5lIGNwdV9oYXNfc2VnbWVudHMJKGNwdV9kYXRhWzBdLm9wdGlvbnMgJiBNSVBTX0NQVV9TRUdNRU5UUykKICNlbmRpZgotCisjaWZuZGVmIGNwdV9oYXNfZXZhCisjZGVmaW5lIGNwdV9oYXNfZXZhCQkoY3B1X2RhdGFbMF0ub3B0aW9ucyAmIE1JUFNfQ1BVX0VWQSkKKyNlbmRpZgogCiAvKgogICogRm9yIHRoZSBtb21lbnQgd2UgZG9uJ3QgY29uc2lkZXIgUjYwMDAgYW5kIFI4MDAwIHNvIHdlIGNhbiBhc3N1bWUgdGhhdApAQCAtMjk5LDQgKzMwMSwxMCBAQAogI2RlZmluZSBjcHVfaGFzX3Z6CQkoY3B1X2RhdGFbMF0uYXNlcyAmIE1JUFNfQVNFX1ZaKQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSEFTX01TQSkgJiYgIWRlZmluZWQoY3B1X2hhc19tc2EpCisjIGRlZmluZSBjcHVfaGFzX21zYQkJKGNwdV9kYXRhWzBdLmFzZXMgJiBNSVBTX0FTRV9NU0EpCisjZWxpZiAhZGVmaW5lZChjcHVfaGFzX21zYSkKKyMgZGVmaW5lIGNwdV9oYXNfbXNhCQkwCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQVNNX0NQVV9GRUFUVVJFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWluZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oCmluZGV4IDhmN2FkZjAuLmRjMjEzNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oCkBAIC00OSw2ICs0OSw3IEBACiAJdW5zaWduZWQgbG9uZwkJYXNlczsKIAl1bnNpZ25lZCBpbnQJCXByb2Nlc3Nvcl9pZDsKIAl1bnNpZ25lZCBpbnQJCWZwdV9pZDsKKwl1bnNpZ25lZCBpbnQJCW1zYV9pZDsKIAl1bnNpZ25lZCBpbnQJCWNwdXR5cGU7CiAJaW50CQkJaXNhX2xldmVsOwogCWludAkJCXRsYnNpemU7CkBAIC05NSw0ICs5NiwzMSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKl9fY3B1X25hbWVbXTsKICNkZWZpbmUgY3B1X25hbWVfc3RyaW5nKCkJX19jcHVfbmFtZVtzbXBfcHJvY2Vzc29yX2lkKCldCiAKK3N0cnVjdCBzZXFfZmlsZTsKK3N0cnVjdCBub3RpZmllcl9ibG9jazsKKworZXh0ZXJuIGludCByZWdpc3Rlcl9wcm9jX2NwdWluZm9fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50IHByb2NfY3B1aW5mb19ub3RpZmllcl9jYWxsX2NoYWluKHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KTsKKworI2RlZmluZSBwcm9jX2NwdWluZm9fbm90aWZpZXIoZm4sIHByaSkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZm4jI19uYiA9IHsJCQlcCisJCS5ub3RpZmllcl9jYWxsID0gZm4sCQkJCQlcCisJCS5wcmlvcml0eSA9IHByaQkJCQkJCVwKKwl9OwkJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJlZ2lzdGVyX3Byb2NfY3B1aW5mb19ub3RpZmllcigmZm4jI19uYik7CQkJXAorfSkKKworc3RydWN0IHByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzIHsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm07CisJdW5zaWduZWQgbG9uZyBuOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01QKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCisjIGRlZmluZSBjcHVfdnBlX2lkKGNwdWluZm8pCSgoY3B1aW5mbyktPnZwZV9pZCkKKyNlbHNlCisjIGRlZmluZSBjcHVfdnBlX2lkKGNwdWluZm8pCTAKKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU01fQ1BVX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS10eXBlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaAppbmRleCAwMmY1OTFiLi43MjE5MDYxMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS10eXBlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS10eXBlLmgKQEAgLTIwLDYgKzIwLDEwIEBACiAJY2FzZSBDUFVfTE9PTkdTT04yOgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU1lTX0hBU19DUFVfTE9PTkdTT04zCisJY2FzZSBDUFVfTE9PTkdTT04zOgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfU1lTX0hBU19DUFVfTE9PTkdTT04xQgogCWNhc2UgQ1BVX0xPT05HU09OMToKICNlbmRpZgpAQCAtNDYsNiArNTAsOCBAQAogCWNhc2UgQ1BVX00xNEtFQzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgogCWNhc2UgQ1BVX1BST0FQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgorCWNhc2UgQ1BVX001MTUwOgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU1lTX0hBU19DUFVfTUlQUzY0X1IxCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggNzY0MTFkZi4uNTMwZWI4YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaApAQCAtODIsMTAgKzgyLDEwIEBACiAjZGVmaW5lIFBSSURfSU1QX1JNNzAwMAkJMHgyNzAwCiAjZGVmaW5lIFBSSURfSU1QX05FVkFEQQkJMHgyODAwCQkvKiBSTTUyNjAgPz8/ICovCiAjZGVmaW5lIFBSSURfSU1QX1JNOTAwMAkJMHgzNDAwCi0jZGVmaW5lIFBSSURfSU1QX0xPT05HU09OMQkweDQyMDAKKyNkZWZpbmUgUFJJRF9JTVBfTE9PTkdTT05fMzIJMHg0MjAwICAvKiBMb29uZ3Nvbi0xICovCiAjZGVmaW5lIFBSSURfSU1QX1I1NDMyCQkweDU0MDAKICNkZWZpbmUgUFJJRF9JTVBfUjU1MDAJCTB4NTUwMAotI2RlZmluZSBQUklEX0lNUF9MT09OR1NPTjIJMHg2MzAwCisjZGVmaW5lIFBSSURfSU1QX0xPT05HU09OXzY0CTB4NjMwMCAgLyogTG9vbmdzb24tMi8zICovCiAKICNkZWZpbmUgUFJJRF9JTVBfVU5LTk9XTgkweGZmMDAKIApAQCAtMTE1LDYgKzExNSw4IEBACiAjZGVmaW5lIFBSSURfSU1QX0lOVEVSQVBUSVZfTVAJMHhhMTAwCiAjZGVmaW5lIFBSSURfSU1QX1BST0FQVElWX1VQCTB4YTIwMAogI2RlZmluZSBQUklEX0lNUF9QUk9BUFRJVl9NUAkweGEzMDAKKyNkZWZpbmUgUFJJRF9JTVBfTTUxNTAJCTB4YTcwMAorI2RlZmluZSBQUklEX0lNUF9QNTYwMAkJMHhhODAwCiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIFBSSUQncyBmb3Igd2hlbiAyMzoxNiA9PSBQUklEX0NPTVBfU0lCWVRFCkBAIC0yMjksNiArMjMxLDcgQEAKICNkZWZpbmUgUFJJRF9SRVZfTE9PTkdTT04xQgkweDAwMjAKICNkZWZpbmUgUFJJRF9SRVZfTE9PTkdTT04yRQkweDAwMDIKICNkZWZpbmUgUFJJRF9SRVZfTE9PTkdTT04yRgkweDAwMDMKKyNkZWZpbmUgUFJJRF9SRVZfTE9PTkdTT04zQQkweDAwMDUKIAogLyoKICAqIE9sZGVyIHByb2Nlc3NvcnMgdXNlZCB0byBlbmNvZGUgcHJvY2Vzc29yIHZlcnNpb24gYW5kIHJldmlzaW9uIGluIHR3bwpAQCAtMjk2LDE0ICsyOTksMTQgQEAKIAlDUFVfNEtDLCBDUFVfNEtFQywgQ1BVXzRLU0MsIENQVV8yNEssIENQVV8zNEssIENQVV8xMDA0SywgQ1BVXzc0SywKIAlDUFVfQUxDSEVNWSwgQ1BVX1BSNDQ1MCwgQ1BVX0JNSVBTMzIsIENQVV9CTUlQUzMzMDAsIENQVV9CTUlQUzQzNTAsCiAJQ1BVX0JNSVBTNDM4MCwgQ1BVX0JNSVBTNTAwMCwgQ1BVX0paUklTQywgQ1BVX0xPT05HU09OMSwgQ1BVX00xNEtDLAotCUNQVV9NMTRLRUMsIENQVV9JTlRFUkFQVElWLCBDUFVfUFJPQVBUSVYsCisJQ1BVX00xNEtFQywgQ1BVX0lOVEVSQVBUSVYsIENQVV9QNTYwMCwgQ1BVX1BST0FQVElWLCBDUFVfMTA3NEssIENQVV9NNTE1MCwKIAogCS8qCiAJICogTUlQUzY0IGNsYXNzIHByb2Nlc3NvcnMKIAkgKi8KIAlDUFVfNUtDLCBDUFVfNUtFLCBDUFVfMjBLQywgQ1BVXzI1S0YsIENQVV9TQjEsIENQVV9TQjFBLCBDUFVfTE9PTkdTT04yLAotCUNQVV9DQVZJVU1fT0NURU9OLCBDUFVfQ0FWSVVNX09DVEVPTl9QTFVTLCBDUFVfQ0FWSVVNX09DVEVPTjIsCi0JQ1BVX0NBVklVTV9PQ1RFT04zLCBDUFVfWExSLCBDUFVfWExQLAorCUNQVV9MT09OR1NPTjMsIENQVV9DQVZJVU1fT0NURU9OLCBDUFVfQ0FWSVVNX09DVEVPTl9QTFVTLAorCUNQVV9DQVZJVU1fT0NURU9OMiwgQ1BVX0NBVklVTV9PQ1RFT04zLCBDUFVfWExSLCBDUFVfWExQLAogCiAJQ1BVX0xBU1QKIH07CkBAIC0zNTgsNiArMzYxLDcgQEAKICNkZWZpbmUgTUlQU19DUFVfTUlDUk9NSVBTCTB4MDEwMDAwMDAgLyogQ1BVIGhhcyBtaWNyb01JUFMgY2FwYWJpbGl0eSAqLwogI2RlZmluZSBNSVBTX0NQVV9UTEJJTlYJCTB4MDIwMDAwMDAgLyogQ1BVIHN1cHBvcnRzIFRMQklOVi9GICovCiAjZGVmaW5lIE1JUFNfQ1BVX1NFR01FTlRTCTB4MDQwMDAwMDAgLyogQ1BVIHN1cHBvcnRzIFNlZ21lbnRhdGlvbiBDb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNSVBTX0NQVV9FVkEJCTB4ODAwMDAwMDAgLyogQ1BVIHN1cHBvcnRzIEVuaGFuY2VkIFZpcnR1YWwgQWRkcmVzc2luZyAqLwogCiAvKgogICogQ1BVIEFTRSBlbmNvZGluZ3MKQEAgLTM3MCw1ICszNzQsNiBAQAogI2RlZmluZSBNSVBTX0FTRV9NSVBTTVQJCTB4MDAwMDAwMjAgLyogQ1BVIHN1cHBvcnRzIE1JUFMgTVQgKi8KICNkZWZpbmUgTUlQU19BU0VfRFNQMlAJCTB4MDAwMDAwNDAgLyogU2lnbmFsIFByb2Nlc3NpbmcgQVNFIFJldiAyICovCiAjZGVmaW5lIE1JUFNfQVNFX1ZaCQkweDAwMDAwMDgwIC8qIFZpcnR1YWxpemF0aW9uIEFTRSAqLworI2RlZmluZSBNSVBTX0FTRV9NU0EJCTB4MDAwMDAxMDAgLyogTUlQUyBTSU1EIEFyY2hpdGVjdHVyZSAqLwogCiAjZW5kaWYgLyogX0FTTV9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCA4NDIzOGM1Li4wNjQxMmFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtNDksOSArNDksMTQgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKIHsKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CisKIAlpZighZGV2LT5kbWFfbWFzayB8fCAhZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spKQogCQlyZXR1cm4gLUVJTzsKIAorCWlmIChvcHMtPnNldF9kbWFfbWFzaykKKwkJcmV0dXJuIG9wcy0+c2V0X2RtYV9tYXNrKGRldiwgbWFzayk7CisKIAkqZGV2LT5kbWFfbWFzayA9IG1hc2s7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHUuaAppbmRleCA2Yjk3NDk1Li40ZDg2YjcyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZwdS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBGUFVfNjRCSVQ6Ci0jaWYgIShkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IyKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTNjQpKQorI2lmICEoZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikgfHwgZGVmaW5lZChDT05GSUdfNjRCSVQpKQogCQkvKiB3ZSBvbmx5IGhhdmUgYSAzMi1iaXQgRlBVICovCiAJCXJldHVybiBTSUdGUEU7CiAjZW5kaWYKQEAgLTE4MCw3ICsxODAsNyBAQAogCQlfcmVzdG9yZV9mcCh0c2spOwogfQogCi1zdGF0aWMgaW5saW5lIGZwdXJlZ190ICpnZXRfZnB1X3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitzdGF0aWMgaW5saW5lIHVuaW9uIGZwdXJlZyAqZ2V0X2ZwdV9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCWlmICh0c2sgPT0gY3VycmVudCkgewogCQlwcmVlbXB0X2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdHJhY2UuaAppbmRleCBjZTM1YzlhLi45OTJhYWJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnRyYWNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC0yMiwxMiArMjIsMTIgQEAKICNkZWZpbmUgc2FmZV9sb2FkKGxvYWQsIHNyYywgZHN0LCBlcnJvcikJCVwKIGRvIHsJCQkJCQkJXAogCWFzbSB2b2xhdGlsZSAoCQkJCQlcCi0JCSIxOiAiIGxvYWQgIiAlWyIgU1RSKGRzdCkgIl0sIDAoJVsiIFNUUihzcmMpICJdKVxuIlwKLQkJIiAgIGxpICVbIiBTVFIoZXJyb3IpICJdLCAwXG4iCQlcCisJCSIxOiAiIGxvYWQgIiAlW3RtcF9kc3RdLCAwKCVbdG1wX3NyY10pXG4iCVwKKwkJIiAgIGxpICVbdG1wX2Vycl0sIDBcbiIJCQlcCiAJCSIyOlxuIgkJCQkJXAogCQkJCQkJCVwKIAkJIi5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCQlcCi0JCSIzOiBsaSAlWyIgU1RSKGVycm9yKSAiXSwgMVxuIgkJXAorCQkiMzogbGkgJVt0bXBfZXJyXSwgMVxuIgkJCVwKIAkJIiAgIGogMmJcbiIJCQkJXAogCQkiLnByZXZpb3VzXG4iCQkJCVwKIAkJCQkJCQlcCkBAIC0zNSw4ICszNSw4IEBACiAJCVNUUihQVFIpICJcdDFiLCAzYlxuXHQiCQkJXAogCQkiLnByZXZpb3VzXG4iCQkJCVwKIAkJCQkJCQlcCi0JCTogW2RzdF0gIj0mciIgKGRzdCksIFtlcnJvcl0gIj1yIiAoZXJyb3IpXAotCQk6IFtzcmNdICJyIiAoc3JjKQkJCVwKKwkJOiBbdG1wX2RzdF0gIj0mciIgKGRzdCksIFt0bXBfZXJyXSAiPXIiIChlcnJvcilcCisJCTogW3RtcF9zcmNdICJyIiAoc3JjKQkJCVwKIAkJOiAibWVtb3J5IgkJCQlcCiAJKTsJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtNDQsMTIgKzQ0LDEyIEBACiAjZGVmaW5lIHNhZmVfc3RvcmUoc3RvcmUsIHNyYywgZHN0LCBlcnJvcikJXAogZG8gewkJCQkJCVwKIAlhc20gdm9sYXRpbGUgKAkJCQlcCi0JCSIxOiAiIHN0b3JlICIgJVsiIFNUUihzcmMpICJdLCAwKCVbIiBTVFIoZHN0KSAiXSlcbiJcCi0JCSIgICBsaSAlWyIgU1RSKGVycm9yKSAiXSwgMFxuIglcCisJCSIxOiAiIHN0b3JlICIgJVt0bXBfc3JjXSwgMCglW3RtcF9kc3RdKVxuIlwKKwkJIiAgIGxpICVbdG1wX2Vycl0sIDBcbiIJCVwKIAkJIjI6XG4iCQkJCVwKIAkJCQkJCVwKIAkJIi5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCVwKLQkJIjM6IGxpICVbIiBTVFIoZXJyb3IpICJdLCAxXG4iCVwKKwkJIjM6IGxpICVbdG1wX2Vycl0sIDFcbiIJCVwKIAkJIiAgIGogMmJcbiIJCQlcCiAJCSIucHJldmlvdXNcbiIJCQlcCiAJCQkJCQlcCkBAIC01Nyw4ICs1Nyw4IEBACiAJCVNUUihQVFIpICJcdDFiLCAzYlxuXHQiCQlcCiAJCSIucHJldmlvdXNcbiIJCQlcCiAJCQkJCQlcCi0JCTogW2Vycm9yXSAiPXIiIChlcnJvcikJCVwKLQkJOiBbZHN0XSAiciIgKGRzdCksIFtzcmNdICJyIiAoc3JjKVwKKwkJOiBbdG1wX2Vycl0gIj1yIiAoZXJyb3IpCVwKKwkJOiBbdG1wX2RzdF0gInIiIChkc3QpLCBbdG1wX3NyY10gInIiIChzcmMpXAogCQk6ICJtZW1vcnkiCQkJXAogCSk7CQkJCQlcCiB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z1dGV4LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnV0ZXguaAppbmRleCA2ZWExNTgxLi4xOTRjZGEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnV0ZXguaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnV0ZXguaApAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1ldmEuaD4KICNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KQEAgLTIyLDExICsyMywxMSBAQAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkJIgkuc2V0CXB1c2gJCQkJXG4iCVwKIAkJIgkuc2V0CW5vYXQJCQkJXG4iCVwKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkJIjE6CWxsCSUxLCAlNAkjIF9fZnV0ZXhfYXRvbWljX29wCVxuIglcCiAJCSIJLnNldAltaXBzMAkJCQlcbiIJXAogCQkiCSIgaW5zbgkiCQkJCVxuIglcCi0JCSIJLnNldAltaXBzMwkJCQlcbiIJXAorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIglcCiAJCSIyOglzYwkkMSwgJTIJCQkJXG4iCVwKIAkJIgliZXF6bAkkMSwgMWIJCQkJXG4iCVwKIAkJX19XRUFLX0xMU0NfTUIJCQkJCQlcCkBAIC00OCwxMiArNDksMTIgQEAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJCSIJLnNldAlwdXNoCQkJCVxuIglcCiAJCSIJLnNldAlub2F0CQkJCVxuIglcCi0JCSIJLnNldAltaXBzMwkJCQlcbiIJXAotCQkiMToJbGwJJTEsICU0CSMgX19mdXRleF9hdG9taWNfb3AJXG4iCVwKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIJXAorCQkiMToJInVzZXJfbGwoIiUxIiwgIiU0IikiICMgX19mdXRleF9hdG9taWNfb3BcbiIJXAogCQkiCS5zZXQJbWlwczAJCQkJXG4iCVwKIAkJIgkiIGluc24JIgkJCQlcbiIJXAotCQkiCS5zZXQJbWlwczMJCQkJXG4iCVwKLQkJIjI6CXNjCSQxLCAlMgkJCQlcbiIJXAorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIglcCisJCSIyOgkidXNlcl9zYygiJDEiLCAiJTIiKSIJCQlcbiIJXAogCQkiCWJlcXoJJDEsIDFiCQkJCVxuIglcCiAJCV9fV0VBS19MTFNDX01CCQkJCQkJXAogCQkiMzoJCQkJCQlcbiIJXApAQCAtMTQ2LDEyICsxNDcsMTIgQEAKIAkJIiMgZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWMJCQlcbiIKIAkJIgkuc2V0CXB1c2gJCQkJCVxuIgogCQkiCS5zZXQJbm9hdAkJCQkJXG4iCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKIAkJIglibmUJJTEsICV6NCwgM2YJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCSIJbW92ZQkkMSwgJXo1CQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIyOglzYwkkMSwgJTIJCQkJCVxuIgogCQkiCWJlcXpsCSQxLCAxYgkJCQkJXG4iCiAJCV9fV0VBS19MTFNDX01CCkBAIC0xNzMsMTMgKzE3NCwxMyBAQAogCQkiIyBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYwkJCVxuIgogCQkiCS5zZXQJcHVzaAkJCQkJXG4iCiAJCSIJLnNldAlub2F0CQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKLQkJIjE6CWxsCSUxLCAlMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgorCQkiMToJInVzZXJfbGwoIiUxIiwgIiUzIikiCQkJCVxuIgogCQkiCWJuZQklMSwgJXo0LCAzZgkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJIgltb3ZlCSQxLCAlejUJCQkJCVxuIgotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgotCQkiMjoJc2MJJDEsICUyCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCisJCSIyOgkidXNlcl9zYygiJDEiLCAiJTIiKSIJCQkJXG4iCiAJCSIJYmVxegkkMSwgMWIJCQkJCVxuIgogCQlfX1dFQUtfTExTQ19NQgogCQkiMzoJCQkJCQkJXG4iCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZncvZncuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9mdy5oCmluZGV4IGQ2YzUwYTcuLmYzZTY5NzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9mdy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9mdy5oCkBAIC0zOCw3ICszOCw3IEBACiAKIGV4dGVybiB2b2lkIGZ3X2luaXRfY21kbGluZSh2b2lkKTsKIGV4dGVybiBjaGFyICpmd19nZXRjbWRsaW5lKHZvaWQpOwotZXh0ZXJuIGZ3X21lbWJsb2NrX3QgKmZ3X2dldG1kZXNjKHZvaWQpOworZXh0ZXJuIGZ3X21lbWJsb2NrX3QgKmZ3X2dldG1kZXNjKGludCk7CiBleHRlcm4gdm9pZCBmd19tZW1pbml0KHZvaWQpOwogZXh0ZXJuIGNoYXIgKmZ3X2dldGVudihjaGFyICpuYW1lKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGZ3X2dldGVudmwoY2hhciAqbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2NtcHJlZ3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9nY21wcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzM1OWY3Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9nY21wcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDA3IE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuCi0gKgotICogTXVsdGlwcm9jZXNzb3IgU3Vic3lzdGVtIFJlZ2lzdGVyIERlZmluaXRpb25zCi0gKgotICovCi0jaWZuZGVmIF9BU01fR0NNUFJFR1NfSAotI2RlZmluZSBfQVNNX0dDTVBSRUdTX0gKLQotCi0vKiBPZmZzZXRzIHRvIG1ham9yIGJsb2NrcyB3aXRoaW4gR0NNUCBmcm9tIEdDTVAgYmFzZSAqLwotI2RlZmluZSBHQ01QX0dDQl9PRlMJCTB4MDAwMCAvKiBHbG9iYWwgQ29udHJvbCBCbG9jayAqLwotI2RlZmluZSBHQ01QX0NMQ0JfT0ZTCQkweDIwMDAgLyogQ29yZSBMb2NhbCBDb250cm9sIEJsb2NrICovCi0jZGVmaW5lIEdDTVBfQ09DQl9PRlMJCTB4NDAwMCAvKiBDb3JlIE90aGVyIENvbnRyb2wgQmxvY2sgKi8KLSNkZWZpbmUgR0NNUF9HREJfT0ZTCQkweDgwMDAgLyogR2xvYmFsIERlYnVnIEJsb2NrICovCi0KLS8qIE9mZnNldHMgdG8gaW5kaXZpZHVhbCBHQ01QIHJlZ2lzdGVycyBmcm9tIEdDTVAgYmFzZSAqLwotI2RlZmluZSBHQ01QT0ZTKGJsb2NrLCB0YWcsIHJlZykJXAotCShHQ01QXyMjYmxvY2sjI19PRlMgKyBHQ01QXyMjdGFnIyNfIyNyZWcjI19PRlMpCi0jZGVmaW5lIEdDTVBPRlNuKGJsb2NrLCB0YWcsIHJlZywgbikgXAotCShHQ01QXyMjYmxvY2sjI19PRlMgKyBHQ01QXyMjdGFnIyNfIyNyZWcjI19PRlMobikpCi0KLSNkZWZpbmUgR0NNUEdDQk9GUyhyZWcpCQlHQ01QT0ZTKEdDQiwgR0NCLCByZWcpCi0jZGVmaW5lIEdDTVBHQ0JPRlNuKHJlZywgbikJR0NNUE9GU24oR0NCLCBHQ0IsIHJlZywgbikKLSNkZWZpbmUgR0NNUENMQ0JPRlMocmVnKQlHQ01QT0ZTKENMQ0IsIENDQiwgcmVnKQotI2RlZmluZSBHQ01QQ09DQk9GUyhyZWcpCUdDTVBPRlMoQ09DQiwgQ0NCLCByZWcpCi0jZGVmaW5lIEdDTVBHREJPRlMocmVnKQkJR0NNUE9GUyhHREIsIEdEQiwgcmVnKQotCi0vKiBHQ01QIHJlZ2lzdGVyIGFjY2VzcyAqLwotI2RlZmluZSBHQ01QR0NCKHJlZykJCQlSRUdQKF9nY21wX2Jhc2UsIEdDTVBHQ0JPRlMocmVnKSkKLSNkZWZpbmUgR0NNUEdDQm4ocmVnLCBuKQkgICAgICAgUkVHUChfZ2NtcF9iYXNlLCBHQ01QR0NCT0ZTbihyZWcsIG4pKQotI2RlZmluZSBHQ01QQ0xDQihyZWcpCQkJUkVHUChfZ2NtcF9iYXNlLCBHQ01QQ0xDQk9GUyhyZWcpKQotI2RlZmluZSBHQ01QQ09DQihyZWcpCQkJUkVHUChfZ2NtcF9iYXNlLCBHQ01QQ09DQk9GUyhyZWcpKQotI2RlZmluZSBHQ01QR0RCKHJlZykJCQlSRUdQKF9nY21wX2Jhc2UsIEdDTVBHREJPRlMocmVnKSkKLQotLyogTWFzayBnZW5lcmF0aW9uICovCi0jZGVmaW5lIEdDTVBNU0soYmxvY2ssIHJlZywgYml0cykJKE1TSyhiaXRzKTw8R0NNUF8jI2Jsb2NrIyNfIyNyZWcjI19TSEYpCi0jZGVmaW5lIEdDTVBHQ0JNU0socmVnLCBiaXRzKQkJR0NNUE1TSyhHQ0IsIHJlZywgYml0cykKLSNkZWZpbmUgR0NNUENDQk1TSyhyZWcsIGJpdHMpCQlHQ01QTVNLKENDQiwgcmVnLCBiaXRzKQotI2RlZmluZSBHQ01QR0RCTVNLKHJlZywgYml0cykJCUdDTVBNU0soR0RCLCByZWcsIGJpdHMpCi0KLS8qIEdDQiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0NNUF9HQ0JfR0NfT0ZTCQkJMHgwMDAwCS8qIEdsb2JhbCBDb25maWcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJIEdDTVBfR0NCX0dDX05VTUlPQ1VfU0hGCTgKLSNkZWZpbmUJIEdDTVBfR0NCX0dDX05VTUlPQ1VfTVNLCUdDTVBHQ0JNU0soR0NfTlVNSU9DVSwgNCkKLSNkZWZpbmUJIEdDTVBfR0NCX0dDX05VTUNPUkVTX1NIRgkwCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ19OVU1DT1JFU19NU0sJR0NNUEdDQk1TSyhHQ19OVU1DT1JFUywgOCkKLSNkZWZpbmUgR0NNUF9HQ0JfR0NNUEJfT0ZTCQkweDAwMDgJCS8qIEdsb2JhbCBHQ01QIEJhc2UgKi8KLSNkZWZpbmUJIEdDTVBfR0NCX0dDTVBCX0dDTVBCQVNFX1NIRgkxNQotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfR0NNUEJBU0VfTVNLCUdDTVBHQ0JNU0soR0NNUEJfR0NNUEJBU0UsIDE3KQotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfU0hGCTAKLSNkZWZpbmUJIEdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX01TSwlHQ01QR0NCTVNLKEdDTVBCX0NNREVGVEdULCAyKQotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfRElTQUJMRUQJMAotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfTUVNCQkxCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9JT0NVMQkJMgotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfSU9DVTIJCTMKLSNkZWZpbmUgR0NNUF9HQ0JfQ0NNQ19PRlMJCTB4MDAxMAkvKiBHbG9iYWwgQ00gQ29udHJvbCAqLwotI2RlZmluZSBHQ01QX0dDQl9HQ1NSQVBfT0ZTCQkweDAwMjAJLyogR2xvYmFsIENTUiBBY2Nlc3MgUHJpdmlsZWdlICovCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ1NSQVBfQ01BQ0NFU1NfU0hGCTAKLSNkZWZpbmUJIEdDTVBfR0NCX0dDU1JBUF9DTUFDQ0VTU19NU0sJR0NNUEdDQk1TSyhHQ1NSQVBfQ01BQ0NFU1MsIDgpCi0jZGVmaW5lIEdDTVBfR0NCX0dDTVBSRVZfT0ZTCQkweDAwMzAJLyogR0NNUCBSZXZpc2lvbiBSZWdpc3RlciAqLwotI2RlZmluZSBHQ01QX0dDQl9HQ01FTV9PRlMJCTB4MDA0MAkvKiBHbG9iYWwgQ00gRXJyb3IgTWFzayAqLwotI2RlZmluZSBHQ01QX0dDQl9HQ01FQ19PRlMJCTB4MDA0OAkvKiBHbG9iYWwgQ00gRXJyb3IgQ2F1c2UgKi8KLSNkZWZpbmUJIEdDTVBfR0NCX0dNRUNfRVJST1JfVFlQRV9TSEYJMjcKLSNkZWZpbmUJIEdDTVBfR0NCX0dNRUNfRVJST1JfVFlQRV9NU0sJR0NNUEdDQk1TSyhHTUVDX0VSUk9SX1RZUEUsIDUpCi0jZGVmaW5lCSBHQ01QX0dDQl9HTUVDX0VSUk9SX0lORk9fU0hGCTAKLSNkZWZpbmUJIEdDTVBfR0NCX0dNRUNfRVJST1JfSU5GT19NU0sJR0NNUEdDQk1TSyhHTUVDX0VSUk9SX0lORk8sIDI3KQotI2RlZmluZSBHQ01QX0dDQl9HQ01FQV9PRlMJCTB4MDA1MAkvKiBHbG9iYWwgQ00gRXJyb3IgQWRkcmVzcyAqLwotI2RlZmluZSBHQ01QX0dDQl9HQ01FT19PRlMJCTB4MDA1OAkvKiBHbG9iYWwgQ00gRXJyb3IgTXVsdGlwbGUgKi8KLSNkZWZpbmUJIEdDTVBfR0NCX0dNRU9fRVJST1JfMk5EX1NIRgkwCi0jZGVmaW5lCSBHQ01QX0dDQl9HTUVPX0VSUk9SXzJORF9NU0sJR0NNUEdDQk1TSyhHTUVPX0VSUk9SXzJORCwgNSkKLSNkZWZpbmUgR0NNUF9HQ0JfR0lDQkFfT0ZTCQkweDAwODAJLyogR2xvYmFsIEludGVycnVwdCBDb250cm9sbGVyIEJhc2UgQWRkcmVzcyAqLwotI2RlZmluZQkgR0NNUF9HQ0JfR0lDQkFfQkFTRV9TSEYJMTcKLSNkZWZpbmUJIEdDTVBfR0NCX0dJQ0JBX0JBU0VfTVNLCUdDTVBHQ0JNU0soR0lDQkFfQkFTRSwgMTUpCi0jZGVmaW5lCSBHQ01QX0dDQl9HSUNCQV9FTl9TSEYJCTAKLSNkZWZpbmUJIEdDTVBfR0NCX0dJQ0JBX0VOX01TSwkJR0NNUEdDQk1TSyhHSUNCQV9FTiwgMSkKLQotLyogR0NCIFJlZ2lvbnMgKi8KLSNkZWZpbmUgR0NNUF9HQ0JfQ014QkFTRV9PRlMobikJCSgweDAwOTArMTYqKG4pKQkJLyogR2xvYmFsIFJlZ2lvblswLTNdIEJhc2UgQWRkcmVzcyAqLwotI2RlZmluZQkgR0NNUF9HQ0JfQ014QkFTRV9CQVNFX1NIRgkxNgotI2RlZmluZQkgR0NNUF9HQ0JfQ014QkFTRV9CQVNFX01TSwlHQ01QR0NCTVNLKENNeEJBU0VfQkFTRSwgMTYpCi0jZGVmaW5lIEdDTVBfR0NCX0NNeE1BU0tfT0ZTKG4pCQkoMHgwMDk4KzE2KihuKSkJCS8qIEdsb2JhbCBSZWdpb25bMC0zXSBBZGRyZXNzIE1hc2sgKi8KLSNkZWZpbmUJIEdDTVBfR0NCX0NNeE1BU0tfTUFTS19TSEYJMTYKLSNkZWZpbmUJIEdDTVBfR0NCX0NNeE1BU0tfTUFTS19NU0sJR0NNUEdDQk1TSyhDTXhNQVNLX01BU0ssIDE2KQotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19DTVJFR1RHVF9TSEYJMAotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19DTVJFR1RHVF9NU0sJR0NNUEdDQk1TSyhDTXhNQVNLX0NNUkVHVEdULCAyKQotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19DTVJFR1RHVF9NRU0JIDAKLSNkZWZpbmUJIEdDTVBfR0NCX0NNeE1BU0tfQ01SRUdUR1RfTUVNMQkgMQotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19DTVJFR1RHVF9JT0NVMSAyCi0jZGVmaW5lCSBHQ01QX0dDQl9DTXhNQVNLX0NNUkVHVEdUX0lPQ1UyIDMKLQotCi0vKiBDb3JlIGxvY2FsL0NvcmUgb3RoZXIgY29udHJvbCBibG9jayByZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0NNUF9DQ0JfUkVTRVRSX09GUwkJMHgwMDAwCQkJLyogUmVzZXQgUmVsZWFzZSAqLwotI2RlZmluZQkgR0NNUF9DQ0JfUkVTRVRSX0lOUkVTRVRfU0hGCTAKLSNkZWZpbmUJIEdDTVBfQ0NCX1JFU0VUUl9JTlJFU0VUX01TSwlHQ01QQ0NCTVNLKFJFU0VUUl9JTlJFU0VULCAxNikKLSNkZWZpbmUgR0NNUF9DQ0JfQ09IQ1RMX09GUwkJMHgwMDA4CQkJLyogQ29oZXJlbmNlIENvbnRyb2wgKi8KLSNkZWZpbmUJIEdDTVBfQ0NCX0NPSENUTF9ET01BSU5fU0hGCTAKLSNkZWZpbmUJIEdDTVBfQ0NCX0NPSENUTF9ET01BSU5fTVNLCUdDTVBDQ0JNU0soQ09IQ1RMX0RPTUFJTiwgOCkKLSNkZWZpbmUgR0NNUF9DQ0JfQ0ZHX09GUwkJMHgwMDEwCQkJLyogQ29uZmlnICovCi0jZGVmaW5lCSBHQ01QX0NDQl9DRkdfSU9DVVRZUEVfU0hGCTEwCi0jZGVmaW5lCSBHQ01QX0NDQl9DRkdfSU9DVVRZUEVfTVNLCUdDTVBDQ0JNU0soQ0ZHX0lPQ1VUWVBFLCAyKQotI2RlZmluZQkgIEdDTVBfQ0NCX0NGR19JT0NVVFlQRV9DUFUJMAotI2RlZmluZQkgIEdDTVBfQ0NCX0NGR19JT0NVVFlQRV9OQ0lPQ1UJMQotI2RlZmluZQkgIEdDTVBfQ0NCX0NGR19JT0NVVFlQRV9DSU9DVQkyCi0jZGVmaW5lCSBHQ01QX0NDQl9DRkdfTlVNVlBFX1NIRgkwCi0jZGVmaW5lCSBHQ01QX0NDQl9DRkdfTlVNVlBFX01TSwlHQ01QQ0NCTVNLKENGR19OVU1WUEUsIDEwKQotI2RlZmluZSBHQ01QX0NDQl9PVEhFUl9PRlMJCTB4MDAxOAkJLyogT3RoZXIgQWRkcmVzcyAqLwotI2RlZmluZQkgR0NNUF9DQ0JfT1RIRVJfQ09SRU5VTV9TSEYJMTYKLSNkZWZpbmUJIEdDTVBfQ0NCX09USEVSX0NPUkVOVU1fTVNLCUdDTVBDQ0JNU0soT1RIRVJfQ09SRU5VTSwgMTYpCi0jZGVmaW5lIEdDTVBfQ0NCX1JFU0VUQkFTRV9PRlMJCTB4MDAyMAkJLyogUmVzZXQgRXhjZXB0aW9uIEJhc2UgKi8KLSNkZWZpbmUJIEdDTVBfQ0NCX1JFU0VUQkFTRV9CRVZfU0hGCTEyCi0jZGVmaW5lCSBHQ01QX0NDQl9SRVNFVEJBU0VfQkVWX01TSwlHQ01QQ0NCTVNLKFJFU0VUQkFTRV9CRVYsIDIwKQotI2RlZmluZSBHQ01QX0NDQl9JRF9PRlMJCQkweDAwMjgJCS8qIElkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lIEdDTVBfQ0NCX0RJTlRHUk9VUF9PRlMJCTB4MDAzMAkJLyogRElOVCBHcm91cCBQYXJ0aWNpcGF0ZSAqLwotI2RlZmluZSBHQ01QX0NDQl9EQkdHUk9VUF9PRlMJCTB4MDEwMAkJLyogRGVidWdCcmVhayBHcm91cCAqLwotCi1leHRlcm4gaW50IF9faW5pdCBnY21wX3Byb2JlKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIGludCBfX2luaXQgZ2NtcF9uaW9jdSh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBnY21wX3NldHJlZ2lvbihpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7Ci0jZW5kaWYgLyogX0FTTV9HQ01QUkVHU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2ljLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2ljLmgKaW5kZXggYjJlM2U5My4uMDgyNzE2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2dpYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9naWMuaApAQCAtMTEsNiArMTEsOSBAQAogI2lmbmRlZiBfQVNNX0dJQ1JFR1NfSAogI2RlZmluZSBfQVNNX0dJQ1JFR1NfSAogCisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorCiAjdW5kZWYJR0lDSVNCWVRFTElUVExFRU5ESUFOCiAKIC8qIENvbnN0YW50cyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaAppbmRleCAzMzIxZGQ1Li45MzNiNTBlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaApAQCAtMzMxLDcgKzMzMSw3IEBACiAJCWlmIChpcnEpCQkJCQkJXAogCQkJbG9jYWxfaXJxX3NhdmUoX19mbGFncyk7CQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKLQkJCSIuc2V0CW1pcHMzIgkJIlx0XHQjIF9fd3JpdGVxIiJcblx0IglcCisJCQkiLnNldAlhcmNoPXI0MDAwIgkiXHRcdCMgX193cml0ZXEiIlxuXHQiCVwKIAkJCSJkc2xsMzIgJUwwLCAlTDAsIDAiCQkJIlxuXHQiCVwKIAkJCSJkc3JsMzIgJUwwLCAlTDAsIDAiCQkJIlxuXHQiCVwKIAkJCSJkc2xsMzIgJU0wLCAlTTAsIDAiCQkJIlxuXHQiCVwKQEAgLTM2MSw3ICszNjEsNyBAQAogCQlpZiAoaXJxKQkJCQkJCVwKIAkJCWxvY2FsX2lycV9zYXZlKF9fZmxhZ3MpOwkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkiLnNldAltaXBzMyIJCSJcdFx0IyBfX3JlYWRxIiAiXG5cdCIJXAorCQkJIi5zZXQJYXJjaD1yNDAwMCIJIlx0XHQjIF9fcmVhZHEiICJcblx0IglcCiAJCQkibGQJJUwwLCAlMSIJCQkiXG5cdCIJXAogCQkJImRzcmEzMiAlTTAsICVMMCwgMCIJCQkiXG5cdCIJXAogCQkJInNsbAklTDAsICVMMCwgMCIJCQkiXG5cdCIJXApAQCAtNTg0LDcgKzU4NCw3IEBACiAgKgogICogVGhpcyBBUEkgdXNlZCB0byBiZSBleHBvcnRlZDsgaXQgbm93IGlzIGZvciBhcmNoIGNvZGUgaW50ZXJuYWwgdXNlIG9ubHkuCiAgKi8KLSNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCisjaWYgZGVmaW5lZChDT05GSUdfRE1BX05PTkNPSEVSRU5UKSB8fCBkZWZpbmVkKENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQpCiAKIGV4dGVybiB2b2lkICgqX2RtYV9jYWNoZV93YmFja19pbnYpKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCAoKl9kbWFfY2FjaGVfd2JhY2spKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CkBAIC02MDMsNyArNjAzLDcgQEAKICNkZWZpbmUgZG1hX2NhY2hlX2ludihzdGFydCxzaXplKQlcCiAJZG8geyAodm9pZCkgKHN0YXJ0KTsgKHZvaWQpIChzaXplKTsgfSB3aGlsZSAoMCkKIAotI2VuZGlmIC8qIENPTkZJR19ETUFfTk9OQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfRE1BX05PTkNPSEVSRU5UIHx8IENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQgKi8KIAogLyoKICAqIFJlYWQgYSAzMi1iaXQgcmVnaXN0ZXIgdGhhdCByZXF1aXJlcyBhIDY0LWJpdCByZWFkIGN5Y2xlIG9uIHRoZSBidXMuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbG9jYWwuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9sb2NhbC5oCmluZGV4IGQ0NDYyMmMuLjQ2ZGZjM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9sb2NhbC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9sb2NhbC5oCkBAIC0zMyw3ICszMyw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOiIJX19MTAkiJTEsICUyCQkjIGxvY2FsX2FkZF9yZXR1cm4JXG4iCiAJCSIJYWRkdQklMCwgJTEsICUzCQkJCVxuIgogCQkJX19TQwkiJTAsICUyCQkJCQlcbiIKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6IglfX0xMCSIlMSwgJTIJCSMgbG9jYWxfYWRkX3JldHVybglcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCQlfX1NDCSIlMCwgJTIJCQkJCVxuIgpAQCAtNzgsNyArNzgsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToiCV9fTEwJIiUxLCAlMgkJIyBsb2NhbF9zdWJfcmV0dXJuCVxuIgogCQkiCXN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJCV9fU0MJIiUwLCAlMgkJCQkJXG4iCkBAIC05Miw3ICs5Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOiIJX19MTAkiJTEsICUyCQkjIGxvY2FsX3N1Yl9yZXR1cm4JXG4iCiAJCSIJc3VidQklMCwgJTEsICUzCQkJCVxuIgogCQkJX19TQwkiJTAsICUyCQkJCQlcbiIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaAppbmRleCA1NGY5ZTg0Li5iNGMzZWNiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCkBAIC0xMTYxLDE4ICsxMTYxLDYgQEAKICNkZWZpbmUgTUFDX1JYX0JVRkYzX1NUQVRVUwkweDMwCiAjZGVmaW5lIE1BQ19SWF9CVUZGM19BRERSCTB4MzQKIAotI2RlZmluZSBVQVJUX1JYCQkwCS8qIFJlY2VpdmUgYnVmZmVyICovCi0jZGVmaW5lIFVBUlRfVFgJCTQJLyogVHJhbnNtaXQgYnVmZmVyICovCi0jZGVmaW5lIFVBUlRfSUVSCTgJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBVQVJUX0lJUgkweEMJLyogSW50ZXJydXB0IElEIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfRkNSCTB4MTAJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfTENSCTB4MTQJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfTUNSCTB4MTgJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBVQVJUX0xTUgkweDFDCS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfTVNSCTB4MjAJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfQ0xLCTB4MjgJLyogQmF1ZCBSYXRlIENsb2NrIERpdmlkZXIgKi8KLSNkZWZpbmUgVUFSVF9NT0RfQ05UUkwJMHgxMDAJLyogTW9kdWxlIENvbnRyb2wgKi8KLQogLyogU1NJTyAqLwogI2RlZmluZSBTU0kwX1NUQVRVUwkJMHhCMTYwMDAwMAogIyAgZGVmaW5lIFNTSV9TVEFUVVNfQkYJCSgxIDw8IDQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2JjbTQ3eHhfYm9hcmQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvYmNtNDd4eF9ib2FyZC5oCmluZGV4IDQwMDA1ZmIuLmJiYTczOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvYmNtNDd4eF9ib2FyZC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvYmNtNDd4eF9ib2FyZC5oCkBAIC0yNyw3ICsyNywxMSBAQAogCUJDTTQ3WFhfQk9BUkRfQVNVU19XTDcwMEdFLAogCUJDTTQ3WFhfQk9BUkRfQVNVU19XTEhERCwKIAorCUJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDMzMDEsCisJQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdEMzMwMiwKIAlCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0MzAxLAorCUJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQzMDIsCisJQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDQwMSwKIAogCUJDTTQ3WFhfQk9BUkRfQlVGRkFMT19XQlIyX0c1NCwKIAlCQ000N1hYX0JPQVJEX0JVRkZBTE9fV0hSMl9BNTRHNTQsCkBAIC02Niw3ICs3MCw3IEBACiAJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDMxME5WMSwKIAlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUMzEwTlYyLAogCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEczR1YyLAotCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEdTVjEsCisJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0RywKIAlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNjEwTlYxLAogCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjIsCiAJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVFNMNTRHUywKQEAgLTk0LDYgKzk4LDggQEAKIAogCUJDTTQ3WFhfQk9BUkRfUEhJQ09NTV9NMSwKIAorCUJDTTQ3WFhfQk9BUkRfU0lFTUVOU19TRTUwNVYyLAorCiAJQkNNNDdYWF9CT0FSRF9TSU1QTEVURUNIX1NJTVBMRVNIQVJFLAogCiAJQkNNNDdYWF9CT0FSRF9aVEVfSDIxOE4sCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2NlNzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIEFNRCBBbGNoZW15IERCQXUxMjAwIFJlZmVyZW5jZSBCb2FyZAotICogQm9hcmQgcmVnaXN0ZXIgZGVmaW5lcy4KLSAqCi0gKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcwotICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAqCi0gKgotICovCi0jaWZuZGVmIF9fQVNNX0RCMTIwMF9ICi0jZGVmaW5lIF9fQVNNX0RCMTIwMF9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgotCi0vKiBCaXQgcG9zaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IGludGVycnVwdCBzb3VyY2VzICovCi0jZGVmaW5lIEJDU1JfSU5UX0lERQkJMHgwMDAxCi0jZGVmaW5lIEJDU1JfSU5UX0VUSAkJMHgwMDAyCi0jZGVmaW5lIEJDU1JfSU5UX1BDMAkJMHgwMDA0Ci0jZGVmaW5lIEJDU1JfSU5UX1BDMFNUU0NIRwkweDAwMDgKLSNkZWZpbmUgQkNTUl9JTlRfUEMxCQkweDAwMTAKLSNkZWZpbmUgQkNTUl9JTlRfUEMxU1RTQ0hHCTB4MDAyMAotI2RlZmluZSBCQ1NSX0lOVF9EQwkJMHgwMDQwCi0jZGVmaW5lIEJDU1JfSU5UX0ZMQVNIQlVTWQkweDAwODAKLSNkZWZpbmUgQkNTUl9JTlRfUEMwSU5TRVJUCTB4MDEwMAotI2RlZmluZSBCQ1NSX0lOVF9QQzBFSkVDVAkweDAyMDAKLSNkZWZpbmUgQkNTUl9JTlRfUEMxSU5TRVJUCTB4MDQwMAotI2RlZmluZSBCQ1NSX0lOVF9QQzFFSkVDVAkweDA4MDAKLSNkZWZpbmUgQkNTUl9JTlRfU0QwSU5TRVJUCTB4MTAwMAotI2RlZmluZSBCQ1NSX0lOVF9TRDBFSkVDVAkweDIwMDAKLSNkZWZpbmUgQkNTUl9JTlRfU0QxSU5TRVJUCTB4NDAwMAotI2RlZmluZSBCQ1NSX0lOVF9TRDFFSkVDVAkweDgwMDAKLQotI2RlZmluZSBJREVfUkVHX1NISUZUCQk1Ci0KLSNkZWZpbmUgREIxMjAwX0lERV9QSFlTX0FERFIJMHgxODgwMDAwMAotI2RlZmluZSBEQjEyMDBfSURFX1BIWVNfTEVOCSgxNiA8PCBJREVfUkVHX1NISUZUKQotI2RlZmluZSBEQjEyMDBfRVRIX1BIWVNfQUREUgkweDE5MDAwMzAwCi0jZGVmaW5lIERCMTIwMF9OQU5EX1BIWVNfQUREUgkweDIwMDAwMDAwCi0KLSNkZWZpbmUgUEIxMjAwX0lERV9QSFlTX0FERFIJMHgwQzgwMDAwMAotI2RlZmluZSBQQjEyMDBfRVRIX1BIWVNfQUREUgkweDBEMDAwMzAwCi0jZGVmaW5lIFBCMTIwMF9OQU5EX1BIWVNfQUREUgkweDFDMDAwMDAwCi0KLS8qCi0gKiBFeHRlcm5hbCBJbnRlcnJ1cHRzIGZvciBEQkF1MTIwMCBhcyBvZiA4LzYvMjAwNC4KLSAqIEJpdCBwb3NpdGlvbnMgaW4gdGhlIENQTEQgcmVnaXN0ZXJzIGNhbiBiZSBjYWxjdWxhdGVkIGJ5IHRha2luZwotICogdGhlIGludGVycnVwdCBkZWZpbmUgYW5kIHN1YnRyYWN0aW5nIHRoZSBEQjEyMDBfSU5UX0JFR0lOIHZhbHVlLgotICoKLSAqICAgRXhhbXBsZTogSURFIGJpcyBwb3MgaXMgID0gNjQgLSA2NAotICoJICAgICAgRVRIIGJpdCBwb3MgaXMgID0gNjUgLSA2NAotICovCi1lbnVtIGV4dGVybmFsX2RiMTIwMF9pbnRzIHsKLQlEQjEyMDBfSU5UX0JFR0lOCT0gQVUxMDAwX01BWF9JTlRSICsgMSwKLQotCURCMTIwMF9JREVfSU5UCQk9IERCMTIwMF9JTlRfQkVHSU4sCi0JREIxMjAwX0VUSF9JTlQsCi0JREIxMjAwX1BDMF9JTlQsCi0JREIxMjAwX1BDMF9TVFNDSEdfSU5ULAotCURCMTIwMF9QQzFfSU5ULAotCURCMTIwMF9QQzFfU1RTQ0hHX0lOVCwKLQlEQjEyMDBfRENfSU5ULAotCURCMTIwMF9GTEFTSEJVU1lfSU5ULAotCURCMTIwMF9QQzBfSU5TRVJUX0lOVCwKLQlEQjEyMDBfUEMwX0VKRUNUX0lOVCwKLQlEQjEyMDBfUEMxX0lOU0VSVF9JTlQsCi0JREIxMjAwX1BDMV9FSkVDVF9JTlQsCi0JREIxMjAwX1NEMF9JTlNFUlRfSU5ULAotCURCMTIwMF9TRDBfRUpFQ1RfSU5ULAotCVBCMTIwMF9TRDFfSU5TRVJUX0lOVCwKLQlQQjEyMDBfU0QxX0VKRUNUX0lOVCwKLQotCURCMTIwMF9JTlRfRU5ECQk9IERCMTIwMF9JTlRfQkVHSU4gKyAxNSwKLX07Ci0KLSNlbmRpZiAvKiBfX0FTTV9EQjEyMDBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTMwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFlZGU0Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjEzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBOZXRMb2dpYyBEQjEzMDAgYm9hcmQgY29uc3RhbnRzCi0gKi8KLQotI2lmbmRlZiBfREIxMzAwX0hfCi0jZGVmaW5lIF9EQjEzMDBfSF8KLQotLyogRlBHQSAoZXh0ZXJuYWwgbXV4KSBpbnRlcnJ1cHQgc291cmNlcyAqLwotI2RlZmluZSBEQjEzMDBfRklSU1RfSU5UCShBTENIRU1ZX0dQSUNfSU5UX0xBU1QgKyAxKQotI2RlZmluZSBEQjEzMDBfSURFX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyAwKQotI2RlZmluZSBEQjEzMDBfRVRIX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyAxKQotI2RlZmluZSBEQjEzMDBfQ0ZfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDIpCi0jZGVmaW5lIERCMTMwMF9WSURFT19JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyA0KQotI2RlZmluZSBEQjEzMDBfSERNSV9JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgNSkKLSNkZWZpbmUgREIxMzAwX0RDX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyA2KQotI2RlZmluZSBEQjEzMDBfRkxBU0hfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgNykKLSNkZWZpbmUgREIxMzAwX0NGX0lOU0VSVF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyA4KQotI2RlZmluZSBEQjEzMDBfQ0ZfRUpFQ1RfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgOSkKLSNkZWZpbmUgREIxMzAwX0FDOTdfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDEwKQotI2RlZmluZSBEQjEzMDBfQUM5N19QRU5fSU5UCShEQjEzMDBfRklSU1RfSU5UICsgMTEpCi0jZGVmaW5lIERCMTMwMF9TRDFfSU5TRVJUX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDEyKQotI2RlZmluZSBEQjEzMDBfU0QxX0VKRUNUX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDEzKQotI2RlZmluZSBEQjEzMDBfT1RHX1ZCVVNfT0NfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgMTQpCi0jZGVmaW5lIERCMTMwMF9IT1NUX1ZCVVNfT0NfSU5UIChEQjEzMDBfRklSU1RfSU5UICsgMTUpCi0jZGVmaW5lIERCMTMwMF9MQVNUX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyAxNSkKLQotLyogU01TQzkyMTAgQ1MgKi8KLSNkZWZpbmUgREIxMzAwX0VUSF9QSFlTX0FERFIJMHgxOTAwMDAwMAotI2RlZmluZSBEQjEzMDBfRVRIX1BIWVNfRU5ECTB4MTk3ZmZmZmYKLQotLyogQVRBIENTICovCi0jZGVmaW5lIERCMTMwMF9JREVfUEhZU19BRERSCTB4MTg4MDAwMDAKLSNkZWZpbmUgREIxMzAwX0lERV9SRUdfU0hJRlQJNQotI2RlZmluZSBEQjEzMDBfSURFX1BIWVNfTEVOCSgxNiA8PCBEQjEzMDBfSURFX1JFR19TSElGVCkKLQotLyogTkFORCBDUyAqLwotI2RlZmluZSBEQjEzMDBfTkFORF9QSFlTX0FERFIJMHgyMDAwMDAwMAotI2RlZmluZSBEQjEzMDBfTkFORF9QSFlTX0VORAkweDIwMDAwZmZmCi0KLSNlbmRpZgkvKiBfREIxMzAwX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9ib290X3BhcmFtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9ib290X3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5YTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2Jvb3RfcGFyYW0uaApAQCAtMCwwICsxLDE2MyBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0xPT05HU09OX0JPT1RfUEFSQU1fSF8KKyNkZWZpbmUgX19BU01fTUFDSF9MT09OR1NPTl9CT09UX1BBUkFNX0hfCisKKyNkZWZpbmUgU1lTVEVNX1JBTV9MT1cJCTEKKyNkZWZpbmUgU1lTVEVNX1JBTV9ISUdICQkyCisjZGVmaW5lIE1FTV9SRVNFUlZFRAkJMworI2RlZmluZSBQQ0lfSU8JCQk0CisjZGVmaW5lIFBDSV9NRU0JCQk1CisjZGVmaW5lIExPT05HU09OX0NGR19SRUcJNgorI2RlZmluZSBWSURFT19ST00JCTcKKyNkZWZpbmUgQURBUFRFUl9ST00JCTgKKyNkZWZpbmUgQUNQSV9UQUJMRQkJOQorI2RlZmluZSBNQVhfTUVNT1JZX1RZUEUJCTEwCisKKyNkZWZpbmUgTE9PTkdTT04zX0JPT1RfTUVNX01BUF9NQVggMTI4CitzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfbG9vbmdzb24geworCXUxNiB2ZXJzOwkvKiB2ZXJzaW9uIG9mIGVmaV9tZW1vcnlfbWFwICovCisJdTMyIG5yX21hcDsJLyogbnVtYmVyIG9mIG1lbW9yeV9tYXBzICovCisJdTMyIG1lbV9mcmVxOwkvKiBtZW1vcnkgZnJlcXVlbmNlICovCisJc3RydWN0IG1lbV9tYXAgeworCQl1MzIgbm9kZV9pZDsJLyogbm9kZV9pZCB3aGljaCBtZW1vcnkgYXR0YWNoZWQgdG8gKi8KKwkJdTMyIG1lbV90eXBlOwkvKiBzeXN0ZW0gbWVtb3J5LCBwY2kgbWVtb3J5LCBwY2kgaW8sIGV0Yy4gKi8KKwkJdTY0IG1lbV9zdGFydDsJLyogbWVtb3J5IG1hcCBzdGFydCBhZGRyZXNzICovCisJCXUzMiBtZW1fc2l6ZTsJLyogZWFjaCBtZW1vcnlfbWFwIHNpemUsIG5vdCB0aGUgdG90YWwgc2l6ZSAqLworCX0gbWFwW0xPT05HU09OM19CT09UX01FTV9NQVBfTUFYXTsKK30gX19wYWNrZWQ7CisKK2VudW0gbG9vbmdzb25fY3B1X3R5cGUgeworCUxvb25nc29uXzJFID0gMCwKKwlMb29uZ3Nvbl8yRiA9IDEsCisJTG9vbmdzb25fM0EgPSAyLAorCUxvb25nc29uXzNCID0gMywKKwlMb29uZ3Nvbl8xQSA9IDQsCisJTG9vbmdzb25fMUIgPSA1Cit9OworCisvKgorICogQ2FwYWJpbGl0eSBhbmQgZmVhdHVyZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSBmb3IgTUlQUyBDUFUKKyAqLworc3RydWN0IGVmaV9jcHVpbmZvX2xvb25nc29uIHsKKwl1MTYgdmVyczsgICAgIC8qIHZlcnNpb24gb2YgZWZpX2NwdWluZm9fbG9vbmdzb24gKi8KKwl1MzIgcHJvY2Vzc29yX2lkOyAvKiBQUklELCBlLmcuIDYzMDUsIDYzMDYgKi8KKwl1MzIgY3B1dHlwZTsgIC8qIExvb25nc29uXzNBLzNCLCBldGMuICovCisJdTMyIHRvdGFsX25vZGU7ICAgLyogbnVtIG9mIHRvdGFsIG51bWEgbm9kZXMgKi8KKwl1MzIgY3B1X3N0YXJ0dXBfY29yZV9pZDsgLyogQ29yZSBpZCAqLworCXUzMiBjcHVfY2xvY2tfZnJlcTsgLyogY3B1X2Nsb2NrICovCisJdTMyIG5yX2NwdXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3lzdGVtX2xvb25nc29uIHsKKwl1MTYgdmVyczsgICAgIC8qIHZlcnNpb24gb2Ygc3lzdGVtX2xvb25nc29uICovCisJdTMyIGNjbnVtYV9zbXA7IC8qIDA6IG5vIG51bWE7IDE6IGhhcyBudW1hICovCisJdTMyIHNpbmdfZG91YmxlX2NoYW5uZWw7IC8qIDE6c2luZ2xlOyAyOmRvdWJsZSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGlycV9zb3VyY2Vfcm91dGluZ190YWJsZSB7CisJdTE2IHZlcnM7CisJdTE2IHNpemU7CisJdTE2IHJ0cl9idXM7CisJdTE2IHJ0cl9kZXZmbjsKKwl1MzIgdmVuZG9yOworCXUzMiBkZXZpY2U7CisJdTMyIFBJQ190eXBlOyAgIC8qIGNvbmZvcm0gdXNlIEhUIG9yIFBDSSB0byByb3V0ZSB0byBDUFUtUElDICovCisJdTY0IGh0X2ludF9iaXQ7IC8qIDNBOiAxPDwyNDsgM0I6IDE8PDE2ICovCisJdTY0IGh0X2VuYWJsZTsgIC8qIGlycXMgdXNlZCBpbiB0aGlzIFBJQyAqLworCXUzMiBub2RlX2lkOyAgICAvKiBub2RlIGlkOiAweDAtMDsgMHgxLTE7IDB4MTAtMjsgMHgxMS0zICovCisJdTY0IHBjaV9tZW1fc3RhcnRfYWRkcjsKKwl1NjQgcGNpX21lbV9lbmRfYWRkcjsKKwl1NjQgcGNpX2lvX3N0YXJ0X2FkZHI7CisJdTY0IHBjaV9pb19lbmRfYWRkcjsKKwl1NjQgcGNpX2NvbmZpZ19hZGRyOworCXUzMiBkbWFfbWFza19iaXRzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGludGVyZmFjZV9pbmZvIHsKKwl1MTYgdmVyczsgLyogdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNpdGlvbiAqLworCXUxNiBzaXplOworCXU4ICBmbGFnOworCWNoYXIgZGVzY3JpcHRpb25bNjRdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNQVhfUkVTT1VSQ0VfTlVNQkVSIDEyOAorc3RydWN0IHJlc291cmNlX2xvb25nc29uIHsKKwl1NjQgc3RhcnQ7IC8qIHJlc291cmNlIHN0YXJ0IGFkZHJlc3MgKi8KKwl1NjQgZW5kOyAgIC8qIHJlc291cmNlIGVuZCBhZGRyZXNzICovCisJY2hhciBuYW1lWzY0XTsKKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgYXJjaGRldl9kYXRhIHt9OyAgLyogYXJjaCBzcGVjaWZpYyBhZGRpdGlvbnMgKi8KKworc3RydWN0IGJvYXJkX2RldmljZXMgeworCWNoYXIgbmFtZVs2NF07ICAgIC8qIGhvbGQgdGhlIGRldmljZSBuYW1lICovCisJdTMyIG51bV9yZXNvdXJjZXM7IC8qIG51bWJlciBvZiBkZXZpY2VfcmVzb3VyY2UgKi8KKwkvKiBmb3IgZWFjaCBkZXZpY2UncyByZXNvdXJjZSAqLworCXN0cnVjdCByZXNvdXJjZV9sb29uZ3NvbiByZXNvdXJjZVtNQVhfUkVTT1VSQ0VfTlVNQkVSXTsKKwkvKiBhcmNoIHNwZWNpZmljIGFkZGl0aW9ucyAqLworCXN0cnVjdCBhcmNoZGV2X2RhdGEgYXJjaGRhdGE7Cit9OworCitzdHJ1Y3QgbG9vbmdzb25fc3BlY2lhbF9hdHRyaWJ1dGUgeworCXUxNiB2ZXJzOyAgICAgLyogdmVyc2lvbiBvZiB0aGlzIHNwZWNpYWwgKi8KKwljaGFyIHNwZWNpYWxfbmFtZVs2NF07IC8qIHNwZWNpYWxfYXRyaWJ1dGVfbmFtZSAqLworCXUzMiBsb29uZ3Nvbl9zcGVjaWFsX3R5cGU7IC8qIHR5cGUgb2Ygc3BlY2lhbCBkZXZpY2UgKi8KKwkvKiBmb3IgZWFjaCBkZXZpY2UncyByZXNvdXJjZSAqLworCXN0cnVjdCByZXNvdXJjZV9sb29uZ3NvbiByZXNvdXJjZVtNQVhfUkVTT1VSQ0VfTlVNQkVSXTsKK307CisKK3N0cnVjdCBsb29uZ3Nvbl9wYXJhbXMgeworCXU2NCBtZW1vcnlfb2Zmc2V0OwkvKiBlZmlfbWVtb3J5X21hcF9sb29uZ3NvbiBzdHJ1Y3Qgb2Zmc2V0ICovCisJdTY0IGNwdV9vZmZzZXQ7CQkvKiBlZmlfY3B1aW5mb19sb29uZ3NvbiBzdHJ1Y3Qgb2Zmc2V0ICovCisJdTY0IHN5c3RlbV9vZmZzZXQ7CS8qIHN5c3RlbV9sb29uZ3NvbiBzdHJ1Y3Qgb2Zmc2V0ICovCisJdTY0IGlycV9vZmZzZXQ7CQkvKiBpcnFfc291cmNlX3JvdXRpbmdfdGFibGUgc3RydWN0IG9mZnNldCAqLworCXU2NCBpbnRlcmZhY2Vfb2Zmc2V0OwkvKiBpbnRlcmZhY2VfaW5mbyBzdHJ1Y3Qgb2Zmc2V0ICovCisJdTY0IHNwZWNpYWxfb2Zmc2V0OwkvKiBsb29uZ3Nvbl9zcGVjaWFsX2F0dHJpYnV0ZSBzdHJ1Y3Qgb2Zmc2V0ICovCisJdTY0IGJvYXJkZGV2X3RhYmxlX29mZnNldDsgIC8qIGJvYXJkX2RldmljZXMgb2Zmc2V0ICovCit9OworCitzdHJ1Y3Qgc21iaW9zX3RhYmxlcyB7CisJdTE2IHZlcnM7ICAgICAvKiB2ZXJzaW9uIG9mIHNtYmlvcyAqLworCXU2NCB2Z2FfYmlvczsgLyogdmdhX2Jpb3MgYWRkcmVzcyAqLworCXN0cnVjdCBsb29uZ3Nvbl9wYXJhbXMgbHA7Cit9OworCitzdHJ1Y3QgZWZpX3Jlc2V0X3N5c3RlbV90IHsKKwl1NjQgUmVzZXRDb2xkOworCXU2NCBSZXNldFdhcm07CisJdTY0IFJlc2V0VHlwZTsKKwl1NjQgU2h1dGRvd247CisJdTY0IERvU3VzcGVuZDsgLyogTlVMTCBpZiBub3Qgc3VwcG9ydCAqLworfTsKKworc3RydWN0IGVmaV9sb29uZ3NvbiB7CisJdTY0IG1wczsJLyogTVBTIHRhYmxlICovCisJdTY0IGFjcGk7CS8qIEFDUEkgdGFibGUgKElBNjQgZXh0IDAuNzEpICovCisJdTY0IGFjcGkyMDsJLyogQUNQSSB0YWJsZSAoQUNQSSAyLjApICovCisJc3RydWN0IHNtYmlvc190YWJsZXMgc21iaW9zOwkvKiBTTSBCSU9TIHRhYmxlICovCisJdTY0IHNhbF9zeXN0YWI7CS8qIFNBTCBzeXN0ZW0gdGFibGUgKi8KKwl1NjQgYm9vdF9pbmZvOwkvKiBib290IGluZm8gdGFibGUgKi8KK307CisKK3N0cnVjdCBib290X3BhcmFtcyB7CisJc3RydWN0IGVmaV9sb29uZ3NvbiBlZmk7CisJc3RydWN0IGVmaV9yZXNldF9zeXN0ZW1fdCByZXNldF9zeXN0ZW07Cit9OworCitzdHJ1Y3QgbG9vbmdzb25fc3lzdGVtX2NvbmZpZ3VyYXRpb24geworCXUzMiBucl9jcHVzOworCWVudW0gbG9vbmdzb25fY3B1X3R5cGUgY3B1dHlwZTsKKwl1NjQgaHRfY29udHJvbF9iYXNlOworCXU2NCBwY2lfbWVtX3N0YXJ0X2FkZHI7CisJdTY0IHBjaV9tZW1fZW5kX2FkZHI7CisJdTY0IHBjaV9pb19iYXNlOworCXU2NCByZXN0YXJ0X2FkZHI7CisJdTY0IHBvd2Vyb2ZmX2FkZHI7CisJdTY0IHN1c3BlbmRfYWRkcjsKKwl1NjQgdmdhYmlvc19hZGRyOworCXUzMiBkbWFfbWFza19iaXRzOworfTsKKworZXh0ZXJuIHN0cnVjdCBlZmlfbWVtb3J5X21hcF9sb29uZ3NvbiAqbG9vbmdzb25fbWVtbWFwOworZXh0ZXJuIHN0cnVjdCBsb29uZ3Nvbl9zeXN0ZW1fY29uZmlndXJhdGlvbiBsb29uZ3Nvbl9zeXNjb25mOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9kbWEtY29oZXJlbmNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9kbWEtY29oZXJlbmNlLmgKaW5kZXggYWViMmMwNS4uNmE5MDI3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vZG1hLWNvaGVyZW5jZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2RtYS1jb2hlcmVuY2UuaApAQCAtMTEsMjQgKzExLDQwIEBACiAjaWZuZGVmIF9fQVNNX01BQ0hfTE9PTkdTT05fRE1BX0NPSEVSRU5DRV9ICiAjZGVmaW5lIF9fQVNNX01BQ0hfTE9PTkdTT05fRE1BX0NPSEVSRU5DRV9ICiAKKyNpZmRlZiBDT05GSUdfU1dJT1RMQgorI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KKyNlbmRpZgorCiBzdHJ1Y3QgZGV2aWNlOwogCitleHRlcm4gZG1hX2FkZHJfdCBwaHlzX3RvX2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBhZGRyKTsKK2V4dGVybiBwaHlzX2FkZHJfdCBkbWFfdG9fcGh5cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZGFkZHIpOwogc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBsYXRfbWFwX2RtYV9tZW0oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICphZGRyLAogCQkJCQkgIHNpemVfdCBzaXplKQogeworI2lmZGVmIENPTkZJR19DUFVfTE9PTkdTT04zCisJcmV0dXJuIHZpcnRfdG9fcGh5cyhhZGRyKTsKKyNlbHNlCiAJcmV0dXJuIHZpcnRfdG9fcGh5cyhhZGRyKSB8IDB4ODAwMDAwMDA7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBsYXRfbWFwX2RtYV9tZW1fcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKyNpZmRlZiBDT05GSUdfQ1BVX0xPT05HU09OMworCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSk7CisjZWxzZQogCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSkgfCAweDgwMDAwMDAwOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwbGF0X2RtYV9hZGRyX3RvX3BoeXMoc3RydWN0IGRldmljZSAqZGV2LAogCWRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX0xPT05HU09OMkYpICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9MT09OR1NPTjMpICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQorCXJldHVybiBkbWFfYWRkcjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9MT09OR1NPTjJGKSAmJiBkZWZpbmVkKENPTkZJR182NEJJVCkKIAlyZXR1cm4gKGRtYV9hZGRyID4gMHg4ZmZmZmZmZikgPyBkbWFfYWRkciA6IChkbWFfYWRkciAmIDB4MGZmZmZmZmYpOwogI2Vsc2UKIAlyZXR1cm4gZG1hX2FkZHIgJiAweDdmZmZmZmZmOwpAQCAtNTUsNyArNzEsMTEgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcGxhdF9kZXZpY2VfaXNfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQogeworI2lmZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKIAlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIDE7CisjZW5kaWYgLyogQ09ORklHX0RNQV9OT05DT0hFUkVOVCAqLwogfQogCiAjZW5kaWYgLyogX19BU01fTUFDSF9MT09OR1NPTl9ETUFfQ09IRVJFTkNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1NjBiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2lycS5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX19BU01fTUFDSF9MT09OR1NPTl9JUlFfSF8KKyNkZWZpbmUgX19BU01fTUFDSF9MT09OR1NPTl9JUlFfSF8KKworI2luY2x1ZGUgPGJvb3RfcGFyYW0uaD4KKworI2lmZGVmIENPTkZJR19DUFVfTE9PTkdTT04zCisKKy8qIGNwdSBjb3JlIGludGVycnVwdCBudW1iZXJzICovCisjZGVmaW5lIE1JUFNfQ1BVX0lSUV9CQVNFIDU2CisKKyNkZWZpbmUgTE9PTkdTT05fVUFSVF9JUlEgICAoTUlQU19DUFVfSVJRX0JBU0UgKyAyKSAvKiBVQVJUICovCisjZGVmaW5lIExPT05HU09OX0hUMV9JUlEgICAgKE1JUFNfQ1BVX0lSUV9CQVNFICsgMykgLyogSFQxICovCisjZGVmaW5lIExPT05HU09OX1RJTUVSX0lSUSAgKE1JUFNfQ1BVX0lSUV9CQVNFICsgNykgLyogQ1BVIFRpbWVyICovCisKKyNkZWZpbmUgTE9PTkdTT05fSFQxX0NGR19CQVNFCQlsb29uZ3Nvbl9zeXNjb25mLmh0X2NvbnRyb2xfYmFzZQorI2RlZmluZSBMT09OR1NPTl9IVDFfSU5UX1ZFQ1RPUl9CQVNFCShMT09OR1NPTl9IVDFfQ0ZHX0JBU0UgKyAweDgwKQorI2RlZmluZSBMT09OR1NPTl9IVDFfSU5UX0VOX0JBU0UJKExPT05HU09OX0hUMV9DRkdfQkFTRSArIDB4YTApCisjZGVmaW5lIExPT05HU09OX0hUMV9JTlRfVkVDVE9SKG4pCVwKKwkJTE9PTkdTT04zX1JFRzMyKExPT05HU09OX0hUMV9JTlRfVkVDVE9SX0JBU0UsIDQgKiAobikpCisjZGVmaW5lIExPT05HU09OX0hUMV9JTlROX0VOKG4pCQlcCisJCUxPT05HU09OM19SRUczMihMT09OR1NPTl9IVDFfSU5UX0VOX0JBU0UsIDQgKiAobikpCisKKyNkZWZpbmUgTE9PTkdTT05fSU5UX1JPVVRFUl9PRkZTRVQJMHgxNDAwCisjZGVmaW5lIExPT05HU09OX0lOVF9ST1VURVJfSU5URU4JXAorCSAgTE9PTkdTT04zX1JFRzMyKExPT05HU09OM19SRUdfQkFTRSwgTE9PTkdTT05fSU5UX1JPVVRFUl9PRkZTRVQgKyAweDI0KQorI2RlZmluZSBMT09OR1NPTl9JTlRfUk9VVEVSX0lOVEVOU0VUCVwKKwkgIExPT05HU09OM19SRUczMihMT09OR1NPTjNfUkVHX0JBU0UsIExPT05HU09OX0lOVF9ST1VURVJfT0ZGU0VUICsgMHgyOCkKKyNkZWZpbmUgTE9PTkdTT05fSU5UX1JPVVRFUl9JTlRFTkNMUglcCisJICBMT09OR1NPTjNfUkVHMzIoTE9PTkdTT04zX1JFR19CQVNFLCBMT09OR1NPTl9JTlRfUk9VVEVSX09GRlNFVCArIDB4MmMpCisjZGVmaW5lIExPT05HU09OX0lOVF9ST1VURVJfRU5UUlkobikJXAorCSAgTE9PTkdTT04zX1JFRzgoTE9PTkdTT04zX1JFR19CQVNFLCBMT09OR1NPTl9JTlRfUk9VVEVSX09GRlNFVCArIG4pCisjZGVmaW5lIExPT05HU09OX0lOVF9ST1VURVJfTFBDCQlMT09OR1NPTl9JTlRfUk9VVEVSX0VOVFJZKDB4MGEpCisjZGVmaW5lIExPT05HU09OX0lOVF9ST1VURVJfSFQxKG4pCUxPT05HU09OX0lOVF9ST1VURVJfRU5UUlkobiArIDB4MTgpCisKKyNkZWZpbmUgTE9PTkdTT05fSU5UX0NPUkUwX0lOVDAJCTB4MTEgLyogcm91dGUgdG8gaW50IDAgb2YgY29yZSAwICovCisjZGVmaW5lIExPT05HU09OX0lOVF9DT1JFMF9JTlQxCQkweDIxIC8qIHJvdXRlIHRvIGludCAxIG9mIGNvcmUgMCAqLworCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZml4dXBfaXJxcyh2b2lkKTsKK2V4dGVybiB2b2lkIGxvb25nc29uM19pcGlfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworI2luY2x1ZGVfbmV4dCA8aXJxLmg+CisjZW5kaWYgLyogX19BU01fTUFDSF9MT09OR1NPTl9JUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2xvb25nc29uLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9sb29uZ3Nvbi5oCmluZGV4IGIyODY1MzQuLmYzZmQxZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2xvb25nc29uLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbG9vbmdzb24uaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rY29uZmlnLmg+CisjaW5jbHVkZSA8Ym9vdF9wYXJhbS5oPgogCiAvKiBsb29uZ3NvbiBpbnRlcm5hbCBub3J0aGJyaWRnZSBpbml0aWFsaXphdGlvbiAqLwogZXh0ZXJuIHZvaWQgYm9uaXRvX2lycV9pbml0KHZvaWQpOwpAQCAtMjQsOCArMjUsOSBAQAogZXh0ZXJuIHZvaWQgbWFjaF9wcmVwYXJlX3NodXRkb3duKHZvaWQpOwogCiAvKiBlbnZpcm9ubWVudCBhcmd1bWVudHMgZnJvbSBib290bG9hZGVyICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBjcHVfY2xvY2tfZnJlcTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1lbXNpemUsIGhpZ2htZW1zaXplOworZXh0ZXJuIHUzMiBjcHVfY2xvY2tfZnJlcTsKK2V4dGVybiB1MzIgbWVtc2l6ZSwgaGlnaG1lbXNpemU7CitleHRlcm4gc3RydWN0IHBsYXRfc21wX29wcyBsb29uZ3NvbjNfc21wX29wczsKIAogLyogbG9vbmdzb24tc3BlY2lmaWMgY29tbWFuZCBsaW5lLCBlbnYgYW5kIG1lbW9yeSBpbml0aWFsaXphdGlvbiAqLwogZXh0ZXJuIHZvaWQgX19pbml0IHByb21faW5pdF9tZW1vcnkodm9pZCk7CkBAIC02MSw2ICs2MywxMiBAQAogI2RlZmluZSBMT09OR1NPTl9SRUcoeCkgXAogCSgqKHZvbGF0aWxlIHUzMiAqKSgoY2hhciAqKUNLU0VHMUFERFIoTE9PTkdTT05fUkVHX0JBU0UpICsgKHgpKSkKIAorI2RlZmluZSBMT09OR1NPTjNfUkVHOChiYXNlLCB4KSBcCisJKCoodm9sYXRpbGUgdTggKikoKGNoYXIgKilUT19VTkNBQyhiYXNlKSArICh4KSkpCisKKyNkZWZpbmUgTE9PTkdTT04zX1JFRzMyKGJhc2UsIHgpIFwKKwkoKih2b2xhdGlsZSB1MzIgKikoKGNoYXIgKilUT19VTkNBQyhiYXNlKSArICh4KSkpCisKICNkZWZpbmUgTE9PTkdTT05fSVJRX0JBU0UJMzIKICNkZWZpbmUgTE9PTkdTT04yX1BFUkZDTlRfSVJRCShNSVBTX0NQVV9JUlFfQkFTRSArIDYpIC8qIGNwdSBwZXJmIGNvdW50ZXIgKi8KIApAQCAtODYsNiArOTQsMTAgQEAKICNkZWZpbmUgTE9PTkdTT05fUkVHX0JBU0UJMHgxZmUwMDAwMAogI2RlZmluZSBMT09OR1NPTl9SRUdfU0laRQkweDAwMTAwMDAwCS8qIDI1NkJ5dGVzICsgMjU2Qnl0ZXMgKyA/Pz8gKi8KICNkZWZpbmUgTE9PTkdTT05fUkVHX1RPUAkoTE9PTkdTT05fUkVHX0JBU0UrTE9PTkdTT05fUkVHX1NJWkUtMSkKKy8qIExvb25nc29uLTMgc3BlY2lmaWMgcmVnaXN0ZXJzICovCisjZGVmaW5lIExPT05HU09OM19SRUdfQkFTRQkweDNmZjAwMDAwCisjZGVmaW5lIExPT05HU09OM19SRUdfU0laRQkweDAwMTAwMDAwCS8qIDI1NkJ5dGVzICsgMjU2Qnl0ZXMgKyA/Pz8gKi8KKyNkZWZpbmUgTE9PTkdTT04zX1JFR19UT1AJKExPT05HU09OM19SRUdfQkFTRStMT09OR1NPTjNfUkVHX1NJWkUtMSkKIAogI2RlZmluZSBMT09OR1NPTl9MSU8xX0JBU0UJMHgxZmYwMDAwMAogI2RlZmluZSBMT09OR1NPTl9MSU8xX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLwpAQCAtMTAxLDcgKzExMywxMyBAQAogI2RlZmluZSBMT09OR1NPTl9QQ0lDRkdfQkFTRQkweDFmZTgwMDAwCiAjZGVmaW5lIExPT05HU09OX1BDSUNGR19TSVpFCTB4MDAwMDA4MDAJLyogMksgKi8KICNkZWZpbmUgTE9PTkdTT05fUENJQ0ZHX1RPUAkoTE9PTkdTT05fUENJQ0ZHX0JBU0UrTE9PTkdTT05fUENJQ0ZHX1NJWkUtMSkKKworI2lmIGRlZmluZWQoQ09ORklHX0hUX1BDSSkKKyNkZWZpbmUgTE9PTkdTT05fUENJSU9fQkFTRQlsb29uZ3Nvbl9zeXNjb25mLnBjaV9pb19iYXNlCisjZWxzZQogI2RlZmluZSBMT09OR1NPTl9QQ0lJT19CQVNFCTB4MWZkMDAwMDAKKyNlbmRpZgorCiAjZGVmaW5lIExPT05HU09OX1BDSUlPX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLwogI2RlZmluZSBMT09OR1NPTl9QQ0lJT19UT1AJKExPT05HU09OX1BDSUlPX0JBU0UrTE9PTkdTT05fUENJSU9fU0laRS0xKQogCkBAIC0yMzEsNiArMjQ5LDkgQEAKICNkZWZpbmUgTE9PTkdTT05fUFhBUkJfQ0ZHCQlMT09OR1NPTl9SRUcoTE9PTkdTT05fUkVHQkFTRSArIDB4NjgpCiAjZGVmaW5lIExPT05HU09OX1BYQVJCX1NUQVRVUwkJTE9PTkdTT05fUkVHKExPT05HU09OX1JFR0JBU0UgKyAweDZjKQogCisvKiBDaGlwIENvbmZpZyAqLworI2RlZmluZSBMT09OR1NPTl9DSElQQ0ZHMAkJTE9PTkdTT05fUkVHKExPT05HU09OX1JFR0JBU0UgKyAweDgwKQorCiAvKiBwY2ltYXAgKi8KIAogI2RlZmluZSBMT09OR1NPTl9QQ0lNQVBfUENJTUFQX0xPMAkweDAwMDAwMDNmCkBAIC0yNDYsOSArMjY3LDYgQEAKICNpZmRlZiBDT05GSUdfQ1BVX1NVUFBPUlRTX0NQVUZSRVEKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiBleHRlcm4gc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGxvb25nc29uMl9jbG9ja21vZF90YWJsZVtdOwotCi0vKiBDaGlwIENvbmZpZyAqLwotI2RlZmluZSBMT09OR1NPTl9DSElQQ0ZHMAkJTE9PTkdTT05fUkVHKExPT05HU09OX1JFR0JBU0UgKyAweDgwKQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9tYWNoaW5lLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9tYWNoaW5lLmgKaW5kZXggMzgxMGQ1Yy4uMWIxZjU5MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbWFjaGluZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL21hY2hpbmUuaApAQCAtMjQsNCArMjQsMTAgQEAKIAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTEVNT1RFX01BQ0gzQQorCisjZGVmaW5lIExPT05HU09OX01BQ0hUWVBFIE1BQ0hfTEVNT1RFX0ExMTAxCisKKyNlbmRpZiAvKiBDT05GSUdfTEVNT1RFX01BQ0gzQSAqLworCiAjZW5kaWYgLyogX19BU01fTUFDSF9MT09OR1NPTl9NQUNISU5FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL3BjaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vcGNpLmgKaW5kZXggYmM5OWRhYi4uMTIxMjc3NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vcGNpLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vcGNpLmgKQEAgLTQwLDggKzQwLDEzIEBACiAjZWxzZQkvKiBsb29uZ3NvbjJmLzMyYml0ICYgbG9vbmdzb24yZSAqLwogCiAvKiB0aGlzIHBjaSBtZW1vcnkgc3BhY2UgaXMgbWFwcGVkIGJ5IHBjaW1hcCBpbiBwY2kuYyAqLworI2lmZGVmIENPTkZJR19DUFVfTE9PTkdTT04zCisjZGVmaW5lIExPT05HU09OX1BDSV9NRU1fU1RBUlQJMHg0MDAwMDAwMFVMCisjZGVmaW5lIExPT05HU09OX1BDSV9NRU1fRU5ECTB4N2VmZmZmZmZVTAorI2Vsc2UKICNkZWZpbmUgTE9PTkdTT05fUENJX01FTV9TVEFSVAlMT09OR1NPTl9QQ0lMTzFfQkFTRQogI2RlZmluZSBMT09OR1NPTl9QQ0lfTUVNX0VORAkoTE9PTkdTT05fUENJTE8xX0JBU0UgKyAweDA0MDAwMDAwICogMikKKyNlbmRpZgogLyogdGhpcyBpcyBhbiBvZmZzZXQgZnJvbSBtaXBzX2lvX3BvcnRfYmFzZSAqLwogI2RlZmluZSBMT09OR1NPTl9QQ0lfSU9fU1RBUlQJMHgwMDAwNDAwMFVMCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL3NwYWNlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vc3BhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MDZlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL3NwYWNlcy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0xPT05HU09OX1NQQUNFU19IXworI2RlZmluZSBfX0FTTV9NQUNIX0xPT05HU09OX1NQQUNFU19IXworCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCisjZGVmaW5lIENBQ19CQVNFICAgICAgICBfQUMoMHg5ODAwMDAwMDAwMDAwMDAwLCBVTCkKKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KKworI2luY2x1ZGUgPGFzbS9tYWNoLWdlbmVyaWMvc3BhY2VzLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL2tlcm5lbC1lbnRyeS1pbml0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YS9rZXJuZWwtZW50cnktaW5pdC5oCmluZGV4IDBiNzkzZTcuLjdjNWUxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL2tlcm5lbC1lbnRyeS1pbml0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEva2VybmVsLWVudHJ5LWluaXQuaApAQCAtNSwxMCArNSw4MCBAQAogICoKICAqIENocmlzIERlYXJtYW4gKGNocmlzQG1pcHMuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDA3IE1pcHMgVGVjaG5vbG9naWVzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqLwogI2lmbmRlZiBfX0FTTV9NQUNIX01JUFNfS0VSTkVMX0VOVFJZX0lOSVRfSAogI2RlZmluZSBfX0FTTV9NQUNIX01JUFNfS0VSTkVMX0VOVFJZX0lOSVRfSAogCisJLyoKKwkgKiBQcmVwYXJlIHNlZ21lbnRzIGZvciBFVkEgYm9vdDoKKwkgKgorCSAqIFRoaXMgaXMgaW4gY2FzZSB0aGUgcHJvY2Vzc29yIGJvb3RzIGluIGxlZ2FjeSBjb25maWd1cmF0aW9uCisJICogKFNJX0VWQVJlc2V0IGlzIGRlLWFzc2VydGVkIGFuZCBDT05GSUc1LksgPT0gMCkKKwkgKgorCSAqIE9uIGVudHJ5LCB0MSBpcyBsb2FkZWQgd2l0aCBDUDBfQ09ORklHCisJICoKKwkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09IE1hcHBpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICogVmlydHVhbCBtZW1vcnkgICAgICAgICAgIFBoeXNpY2FsIG1lbW9yeSAgICAgICAgICAgTWFwcGluZworCSAqIDB4MDAwMDAwMDAgLSAweDdmZmZmZmZmICAweDgwMDAwMDAwIC0gMHhmZmZmZmZmZmYgICBNVVNVSyAoa3VzZWcpCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIEZsYXQgMkdCIHBoeXNpY2FsIG1lbW9yeQorCSAqCisJICogMHg4MDAwMDAwMCAtIDB4OWZmZmZmZmYgIDB4MDAwMDAwMDAgLSAweDFmZmZmZmZmZiAgIE1VU1VLIChrc2VnMCkKKwkgKiAweGEwMDAwMDAwIC0gMHhiZjAwMDAwMCAgMHgwMDAwMDAwMCAtIDB4MWZmZmZmZmZmICAgTVVTVUsgKGtzZWcxKQorCSAqIDB4YzAwMDAwMDAgLSAweGRmZmZmZmZmICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgIE1LICAoa3NlZzIpCisJICogMHhlMDAwMDAwMCAtIDB4ZmZmZmZmZmYgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgTUsgIChrc2VnMykKKwkgKgorCSAqCisJICogTG93bWVtIGlzIGV4cGFuZGVkIHRvIDJHQgorCSAqLworCS5tYWNybwlldmFfZW50cnkKKwkvKgorCSAqIEdldCBDb25maWcuSzAgdmFsdWUgYW5kIHVzZSBpdCB0byBwcm9ncmFtCisJICogdGhlIHNlZ21lbnRhdGlvbiByZWdpc3RlcnMKKwkgKi8KKwlhbmRpCXQxLCAweDcgLyogQ0NBICovCisJbW92ZQl0MiwgdDEKKwlpbnMJdDIsIHQxLCAxNiwgMworCS8qIFNlZ0N0bDAgKi8KKwlsaSAgICAgIHQwLCAoKE1JUFNfU0VHQ0ZHX01LIDw8IE1JUFNfU0VHQ0ZHX0FNX1NISUZUKSB8CQlcCisJCSgwIDw8IE1JUFNfU0VHQ0ZHX1BBX1NISUZUKSB8CQkJCVwKKwkJKDEgPDwgTUlQU19TRUdDRkdfRVVfU0hJRlQpKSB8CQkJCVwKKwkJKCgoTUlQU19TRUdDRkdfTUsgPDwgTUlQU19TRUdDRkdfQU1fU0hJRlQpIHwJCVwKKwkJKDAgPDwgTUlQU19TRUdDRkdfUEFfU0hJRlQpIHwJCQkJXAorCQkoMSA8PCBNSVBTX1NFR0NGR19FVV9TSElGVCkpIDw8IDE2KQorCW9yCXQwLCB0MgorCW10YzAJdDAsICQ1LCAyCisKKwkvKiBTZWdDdGwxICovCisJbGkgICAgICB0MCwgKChNSVBTX1NFR0NGR19NVVNVSyA8PCBNSVBTX1NFR0NGR19BTV9TSElGVCkgfAlcCisJCSgwIDw8IE1JUFNfU0VHQ0ZHX1BBX1NISUZUKSB8CQkJCVwKKwkJKDIgPDwgTUlQU19TRUdDRkdfQ19TSElGVCkgfAkJCQlcCisJCSgxIDw8IE1JUFNfU0VHQ0ZHX0VVX1NISUZUKSkgfAkJCQlcCisJCSgoKE1JUFNfU0VHQ0ZHX01VU1VLIDw8IE1JUFNfU0VHQ0ZHX0FNX1NISUZUKSB8CQlcCisJCSgwIDw8IE1JUFNfU0VHQ0ZHX1BBX1NISUZUKSB8CQkJCVwKKwkJKDEgPDwgTUlQU19TRUdDRkdfRVVfU0hJRlQpKSA8PCAxNikKKwlpbnMJdDAsIHQxLCAxNiwgMworCW10YzAJdDAsICQ1LCAzCisKKwkvKiBTZWdDdGwyICovCisJbGkJdDAsICgoTUlQU19TRUdDRkdfTVVTVUsgPDwgTUlQU19TRUdDRkdfQU1fU0hJRlQpIHwJXAorCQkoNiA8PCBNSVBTX1NFR0NGR19QQV9TSElGVCkgfAkJCQlcCisJCSgxIDw8IE1JUFNfU0VHQ0ZHX0VVX1NISUZUKSkgfAkJCQlcCisJCSgoKE1JUFNfU0VHQ0ZHX01VU1VLIDw8IE1JUFNfU0VHQ0ZHX0FNX1NISUZUKSB8CQlcCisJCSg0IDw8IE1JUFNfU0VHQ0ZHX1BBX1NISUZUKSB8CQkJCVwKKwkJKDEgPDwgTUlQU19TRUdDRkdfRVVfU0hJRlQpKSA8PCAxNikKKwlvcgl0MCwgdDIKKwltdGMwCXQwLCAkNSwgNAorCisJamFsCW1pcHNfaWhiCisJbWZjMCAgICB0MCwgJDE2LCA1CisJbGkgICAgICB0MiwgMHg0MDAwMDAwMCAgICAgIC8qIEsgYml0ICovCisJb3IgICAgICB0MCwgdDAsIHQyCisJbXRjMCAgICB0MCwgJDE2LCA1CisJc3luYworCWphbAltaXBzX2loYgorCS5lbmRtCisKIAkubWFjcm8Ja2VybmVsX2VudHJ5X3NldHVwCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCW1mYzAJdDAsIENQMF9DT05GSUcKQEAgLTM5LDE0ICsxMDksNTcgQEAKIG5vbm10X3Byb2Nlc3NvcjoKIAkuYXNjaXoJIlNNVEMga2VybmVsIHJlcXVpcmVzIHRoZSBNVCBBU0UgdG8gcnVuXG4iCiAJX19GSU5JVAotMDoKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VWQQorCXN5bmMKKwllaGIKKworCW1mYzAgICAgdDEsIENQMF9DT05GSUcKKwliZ2V6ICAgIHQxLCA5ZgorCW1mYzAJdDAsIENQMF9DT05GSUcsIDEKKwliZ2V6CXQwLCA5ZgorCW1mYzAJdDAsIENQMF9DT05GSUcsIDIKKwliZ2V6CXQwLCA5ZgorCW1mYzAJdDAsIENQMF9DT05GSUcsIDMKKwlzbGwgICAgIHQwLCB0MCwgNiAgIC8qIFNDIGJpdCAqLworCWJnZXogICAgdDAsIDlmCisKKwlldmFfZW50cnkKKwliICAgICAgIDBmCis5OgorCS8qIEFzc3VtZSB3ZSBjYW1lIGZyb20gWUFNT04uLi4gKi8KKwlQVFJfTEEJdjAsIDB4OWZjMDA1MzQJLyogWUFNT04gcHJpbnQgKi8KKwlsdwl2MCwgKHYwKQorCW1vdmUJYTAsIHplcm8KKwlQVFJfTEEgIGExLCBub25zY19wcm9jZXNzb3IKKwlqYWwJdjAKKworCVBUUl9MQQl2MCwgMHg5ZmMwMDUyMAkvKiBZQU1PTiBleGl0ICovCisJbHcJdjAsICh2MCkKKwlsaQlhMCwgMQorCWphbAl2MAorCisxOgliCTFiCisJbm9wCisJX19JTklUREFUQQorbm9uc2NfcHJvY2Vzc29yOgorCS5hc2NpeiAgIkVWQSBrZXJuZWwgcmVxdWlyZXMgYSBNSVBTIGNvcmUgd2l0aCBTZWdtZW50IENvbnRyb2wgaW1wbGVtZW50ZWRcbiIKKwlfX0ZJTklUCisjZW5kaWYgLyogQ09ORklHX0VWQSAqLworMDoKIAkuZW5kbQogCiAvKgogICogRG8gU01QIHNsYXZlIHByb2Nlc3NvciBzZXR1cCBuZWNlc3NhcnkgYmVmb3JlIHdlIGNhbiBzYWZlbHkgZXhlY3V0ZSBDIGNvZGUuCiAgKi8KIAkubWFjcm8Jc21wX3NsYXZlX3NldHVwCisjaWZkZWYgQ09ORklHX0VWQQorCXN5bmMKKwllaGIKKwltZmMwICAgIHQxLCBDUDBfQ09ORklHCisJZXZhX2VudHJ5CisjZW5kaWYKIAkuZW5kbQogCiAjZW5kaWYgLyogX19BU01fTUFDSF9NSVBTX0tFUk5FTF9FTlRSWV9JTklUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL3NwYWNlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEvc3BhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlNTQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL3NwYWNlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KKyAqLworCisjaWZuZGVmIF9BU01fTUFMVEFfU1BBQ0VTX0gKKyNkZWZpbmUgX0FTTV9NQUxUQV9TUEFDRVNfSAorCisjaWZkZWYgQ09ORklHX0VWQQorCisvKgorICogVHJhZGl0aW9uYWwgTWFsdGEgQm9hcmQgTWVtb3J5IE1hcCBmb3IgRVZBCisgKgorICogMHgwMDAwMDAwMCAtIDB4MGZmZmZmZmY6IDFzdCBSQU0gcmVnaW9uLCAyNTZNQgorICogMHgxMDAwMDAwMCAtIDB4MWJmZmZmZmY6IEdJQyBhbmQgQ1BDIENvbnRyb2wgUmVnaXN0ZXJzCisgKiAweDFjMDAwMDAwIC0gMHgxZmZmZmZmZjogSS9PIEFuZCBGbGFzaAorICogMHgyMDAwMDAwMCAtIDB4N2ZmZmZmZmY6IDJuZCBSQU0gcmVnaW9uLCAxLjVHQgorICogMHg4MDAwMDAwMCAtIDB4ZmZmZmZmZmY6IFBoeXNpY2FsIG1lbW9yeSBhbGlhc2VzIHRvIDB4MCAoMkdCKQorICoKKyAqIFRoZSBrZXJuZWwgaXMgc3RpbGwgbG9jYXRlZCBpbiAweDgwMDAwMDAwKGtzZWcwKS4gSG93ZXZlciwKKyAqIHRoZSBwaHlzaWNhbCBtYXNrIGhhcyBiZWVuIHNoaWZ0ZWQgdG8gMHg4MDAwMDAwMCB3aGljaCBleHBsb2l0cyB0aGUgYWxpYXMKKyAqIG9uIHRoZSBNYWx0YSBib2FyZC4gQXMgYSByZXN1bHQgb2Ygd2hpY2gsIHdlIG92ZXJyaWRlIHRoZSBfX3BhX3N5bWJvbAorICogdG8gcGVmb3JtIGRpcmVjdCBtYXBwaW5nIGZyb20gdmlydHVhbCB0byBwaHlzaWNhbCBhZGRyZXNzZXMuIEluIG90aGVyCisgKiB3b3JkcywgdGhlIDB4ODAwMDAwMDAgdmlydHVhbCBhZGRyZXNzIG1hcHMgdG8gMHg4MDAwMDAwMCBwaHlzaWNhbCBhZGRyZXNzCisgKiB3aGljaCBpbiB0dXJuIGFsaWFzZXMgdG8gMHgwLiBXZSBkbyB0aGlzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIGEgZmxhdAorICogMkdCIG9mIG1lbW9yeSAoMHg4MDAwMDAwMCAtIDB4ZmZmZmZmZmYpIHNvIHdlIGNhbiBhdm9pZCB0aGUgSS9PIGhvbGUgaW4KKyAqIDB4MTAwMDAwMDAgLSAweDFmZmZmZmZmLgorICogVGhlIGxhc3QgNjRLQiBvZiBwaHlzaWNhbCBtZW1vcnkgYXJlIHJlc2VydmVkIGZvciBjb3JyZWN0IEhJR0hNRU0KKyAqIG1hY3JvcyBhcml0aG1ldGljcy4KKyAqCisgKi8KKworI2RlZmluZSBQQUdFX09GRlNFVAlfQUMoMHgwLCBVTCkKKyNkZWZpbmUgUEhZU19PRkZTRVQJX0FDKDB4ODAwMDAwMDAsIFVMKQorI2RlZmluZSBISUdITUVNX1NUQVJUCV9BQygweGZmZmYwMDAwLCBVTCkKKworI2RlZmluZSBfX3BhX3N5bWJvbCh4KQkoUkVMT0NfSElERSgodW5zaWduZWQgbG9uZykoeCksIDApKQorCisjZW5kaWYgLyogQ09ORklHX0VWQSAqLworCisjaW5jbHVkZSA8YXNtL21hY2gtZ2VuZXJpYy9zcGFjZXMuaD4KKworI2VuZGlmIC8qIF9BU01fTUFMVEFfU1BBQ0VTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBtY3MtbXNwNzF4eC9tc3BfcmVnb3BzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbWNzLW1zcDcxeHgvbXNwX3JlZ29wcy5oCmluZGV4IDJkYmM3YTguLmZjOTQ2YzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBtY3MtbXNwNzF4eC9tc3BfcmVnb3BzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG1jcy1tc3A3MXh4L21zcF9yZWdvcHMuaApAQCAtNzYsNyArNzYsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIgkuc2V0CXB1c2gJCQkJXG4iCi0JIgkuc2V0CW1pcHMzCQkJCVxuIgorCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJIjE6CWxsCSUwLCAlMQkjIHNldF92YWx1ZV9yZWczMglcbiIKIAkiCWFuZAklMCwgJTIJCQkJXG4iCiAJIglvcgklMCwgJTMJCQkJXG4iCkBAIC05OCw3ICs5OCw3IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkiCS5zZXQJcHVzaAkJCQlcbiIKLQkiCS5zZXQJbWlwczMJCQkJXG4iCisJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkiMToJbGwJJTAsICUxCQkjIHNldF9yZWczMglcbiIKIAkiCW9yCSUwLCAlMgkJCQlcbiIKIAkiCXNjCSUwLCAlMQkJCQlcbiIKQEAgLTExOSw3ICsxMTksNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIgkuc2V0CXB1c2gJCQkJXG4iCi0JIgkuc2V0CW1pcHMzCQkJCVxuIgorCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJIjE6CWxsCSUwLCAlMQkJIyBjbGVhcl9yZWczMglcbiIKIAkiCWFuZAklMCwgJTIJCQkJXG4iCiAJIglzYwklMCwgJTEJCQkJXG4iCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSIJLnNldAlwdXNoCQkJCVxuIgotCSIJLnNldAltaXBzMwkJCQlcbiIKKwkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCSIxOglsbAklMCwgJTEJCSMgdG9nZ2xlX3JlZzMyCVxuIgogCSIJeG9yCSUwLCAlMgkJCQlcbiIKIAkiCXNjCSUwLCAlMQkJCQlcbiIKQEAgLTIxNiw3ICsyMTYsNyBAQAogI2RlZmluZSBjdXN0b21fcmVhZF9yZWczMihhZGRyZXNzLCB0bXApCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkiCS5zZXQJcHVzaAkJCQlcbiIJXAotCSIJLnNldAltaXBzMwkJCQlcbiIJXAorCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkiMToJbGwJJTAsICUxCSNjdXN0b21fcmVhZF9yZWczMglcbiIJXAogCSIJLnNldAlwb3AJCQkJXG4iCVwKIAk6ICI9ciIgKHRtcCksICI9bSIgKCphZGRyZXNzKQkJCQlcCkBAIC0yMjUsNyArMjI1LDcgQEAKICNkZWZpbmUgY3VzdG9tX3dyaXRlX3JlZzMyKGFkZHJlc3MsIHRtcCkJCQlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJIgkuc2V0CXB1c2gJCQkJXG4iCVwKLQkiCS5zZXQJbWlwczMJCQkJXG4iCVwKKwkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIglcCiAJIglzYwklMCwgJTEJI2N1c3RvbV93cml0ZV9yZWczMglcbiIJXAogCSIJIl9fYmVxeiIlMCwgMWIJCQkJXG4iCVwKIAkiCW5vcAkJCQkJXG4iCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9tYWx0YS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL21hbHRhLmgKaW5kZXggNzIyYmM4OC4uZmQ5Nzc0MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL21hbHRhLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL21hbHRhLmgKQEAgLTY0LDYgKzY0LDExIEBACiAjZGVmaW5lIEdJQ19BRERSU1BBQ0VfU1oJCSgxMjggKiAxMDI0KQogCiAvKgorICogQ1BDIFNwZWNpZmljIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgQ1BDX0JBU0VfQUREUgkJCTB4MWJkZTAwMDAKKworLyoKICAqIE1TQzAxIEJJVSBTcGVjaWZpYyBkZWZpbml0aW9ucwogICogRklYTUUgOiBUaGVzZSBzaG91bGQgYmUgZWxzZXdoZXJlID8KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3BpaXg0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcGlpeDQuaAppbmRleCA4MzZlMmVkLi45Y2Y1NDA0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcGlpeDQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcGlpeDQuaApAQCAtNTAsNCArNTAsOSBAQAogI2RlZmluZSBQSUlYNF9GVU5DMV9JREVUSU1fU0VDT05EQVJZX0hJCQkweDQzCiAjZGVmaW5lICAgUElJWDRfRlVOQzFfSURFVElNX1NFQ09OREFSWV9ISV9JREVfREVDT0RFX0VOCSgxIDw8IDcpCiAKKy8qIFBvd2VyIE1hbmFnZW1lbnQgQ29uZmlndXJhdGlvbiBTcGFjZSAqLworI2RlZmluZSBQSUlYNF9GVU5DM19QTUJBCQkJMHg0MAorI2RlZmluZSBQSUlYNF9GVU5DM19QTVJFR01JU0MJCQkweDgwCisjZGVmaW5lICAgUElJWDRfRlVOQzNfUE1SRUdNSVNDX0VOCQkJKDEgPDwgMCkKKwogI2VuZGlmIC8qIF9fQVNNX01JUFNfQk9BUkRTX1BJSVg0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1jbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWQyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1jbS5oCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBQYXVsIEJ1cnRvbiA8cGF1bC5idXJ0b25AaW1ndGVjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX01JUFNfQVNNX01JUFNfQ01fSF9fCisjZGVmaW5lIF9fTUlQU19BU01fTUlQU19DTV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ00gR0NSIGJsb2NrICovCitleHRlcm4gdm9pZCBfX2lvbWVtICptaXBzX2NtX2Jhc2U7CisKKy8qIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIENNIEwyLW9ubHkgc3luYyByZWdpb24gKi8KK2V4dGVybiB2b2lkIF9faW9tZW0gKm1pcHNfY21fbDJzeW5jX2Jhc2U7CisKKy8qKgorICogX19taXBzX2NtX3BoeXNfYmFzZSAtIHJldHJpZXZlIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIENNCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIENvaGVyZW5jZSBNYW5hZ2VyCisgKiBnbG9iYWwgY29udHJvbCBibG9jaywgb3IgMCBpZiBubyBDb2hlcmVuY2UgTWFuYWdlciBpcyBwcmVzZW50LiBJdCBwcm92aWRlcworICogYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIHJlYWRzIHRoZSBDTUdDUkJhc2UgcmVnaXN0ZXIgd2hlcmUgYXZhaWxhYmxlLAorICogYW5kIG1heSBiZSBvdmVycmlkZW4gYnkgcGxhdGZvcm1zIHdoaWNoIGRldGVybWluZSB0aGlzIGFkZHJlc3MgaW4gYQorICogZGlmZmVyZW50IHdheSBieSBkZWZpbmluZyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgcHJvdG90eXBlIGV4Y2VwdCBmb3IgdGhlCisgKiBuYW1lIG1pcHNfY21fcGh5c19iYXNlICh3aXRob3V0IHVuZGVyc2NvcmVzKS4KKyAqLworZXh0ZXJuIHBoeXNfdCBfX21pcHNfY21fcGh5c19iYXNlKHZvaWQpOworCisvKioKKyAqIG1pcHNfY21fcHJvYmUgLSBwcm9iZSBmb3IgYSBDb2hlcmVuY2UgTWFuYWdlcgorICoKKyAqIEF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBhIENvaGVyZW5jZSBNYW5hZ2VyLiBSZXR1cm5zIDAgaWYgYSBDTQorICogaXMgc3VjY2Vzc2Z1bGx5IGRldGVjdGVkLCBlbHNlIC1lcnJuby4KKyAqLworI2lmZGVmIENPTkZJR19NSVBTX0NNCitleHRlcm4gaW50IG1pcHNfY21fcHJvYmUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbWlwc19jbV9wcm9iZSh2b2lkKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKKy8qKgorICogbWlwc19jbV9wcmVzZW50IC0gZGV0ZXJtaW5lIHdoZXRoZXIgYSBDb2hlcmVuY2UgTWFuYWdlciBpcyBwcmVzZW50CisgKgorICogUmV0dXJucyB0cnVlIGlmIGEgQ00gaXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBlbHNlIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWlwc19jbV9wcmVzZW50KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01JUFNfQ00KKwlyZXR1cm4gbWlwc19jbV9iYXNlICE9IE5VTEw7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisvKioKKyAqIG1pcHNfY21faGFzX2wyc3luYyAtIGRldGVybWluZSB3aGV0aGVyIGFuIEwyLW9ubHkgc3luYyByZWdpb24gaXMgcHJlc2VudAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3lzdGVtIGltcGxlbWVudHMgYW4gTDItb25seSBzeW5jIHJlZ2lvbiwgZWxzZSBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIG1pcHNfY21faGFzX2wyc3luYyh2b2lkKQoreworI2lmZGVmIENPTkZJR19NSVBTX0NNCisJcmV0dXJuIG1pcHNfY21fbDJzeW5jX2Jhc2UgIT0gTlVMTDsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qIE9mZnNldHMgdG8gcmVnaXN0ZXIgYmxvY2tzIGZyb20gdGhlIENNIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBNSVBTX0NNX0dDQl9PRlMJCTB4MDAwMCAvKiBHbG9iYWwgQ29udHJvbCBCbG9jayAqLworI2RlZmluZSBNSVBTX0NNX0NMQ0JfT0ZTCTB4MjAwMCAvKiBDb3JlIExvY2FsIENvbnRyb2wgQmxvY2sgKi8KKyNkZWZpbmUgTUlQU19DTV9DT0NCX09GUwkweDQwMDAgLyogQ29yZSBPdGhlciBDb250cm9sIEJsb2NrICovCisjZGVmaW5lIE1JUFNfQ01fR0RCX09GUwkJMHg2MDAwIC8qIEdsb2JhbCBEZWJ1ZyBCbG9jayAqLworCisvKiBUb3RhbCBzaXplIG9mIHRoZSBDTSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBNSVBTX0NNX0dDUl9TSVpFCTB4ODAwMAorCisvKiBTaXplIG9mIHRoZSBMMi1vbmx5IHN5bmMgcmVnaW9uICovCisjZGVmaW5lIE1JUFNfQ01fTDJTWU5DX1NJWkUJMHgxMDAwCisKKy8qIE1hY3JvcyB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zICovCisjZGVmaW5lIEJVSUxEX0NNX1JfKG5hbWUsIG9mZikJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdTMyICphZGRyX2djcl8jI25hbWUodm9pZCkJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuICh1MzIgKikobWlwc19jbV9iYXNlICsgKG9mZikpOwkJCVwKK30JCQkJCQkJCVwKKwkJCQkJCQkJXAorc3RhdGljIGlubGluZSB1MzIgcmVhZF9nY3JfIyNuYW1lKHZvaWQpCQkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gX19yYXdfcmVhZGwoYWRkcl9nY3JfIyNuYW1lKCkpOwkJCVwKK30KKworI2RlZmluZSBCVUlMRF9DTV9fVyhuYW1lLCBvZmYpCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZ2NyXyMjbmFtZSh1MzIgdmFsdWUpCQkJXAorewkJCQkJCQkJXAorCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYWRkcl9nY3JfIyNuYW1lKCkpOwkJCVwKK30KKworI2RlZmluZSBCVUlMRF9DTV9SVyhuYW1lLCBvZmYpCQkJCQlcCisJQlVJTERfQ01fUl8obmFtZSwgb2ZmKQkJCQkJXAorCUJVSUxEX0NNX19XKG5hbWUsIG9mZikKKworI2RlZmluZSBCVUlMRF9DTV9DeF9SXyhuYW1lLCBvZmYpCQkJCVwKKwlCVUlMRF9DTV9SXyhjbF8jI25hbWUsIE1JUFNfQ01fQ0xDQl9PRlMgKyAob2ZmKSkJXAorCUJVSUxEX0NNX1JfKGNvXyMjbmFtZSwgTUlQU19DTV9DT0NCX09GUyArIChvZmYpKQorCisjZGVmaW5lIEJVSUxEX0NNX0N4X19XKG5hbWUsIG9mZikJCQkJXAorCUJVSUxEX0NNX19XKGNsXyMjbmFtZSwgTUlQU19DTV9DTENCX09GUyArIChvZmYpKQlcCisJQlVJTERfQ01fX1coY29fIyNuYW1lLCBNSVBTX0NNX0NPQ0JfT0ZTICsgKG9mZikpCisKKyNkZWZpbmUgQlVJTERfQ01fQ3hfUlcobmFtZSwgb2ZmKQkJCQlcCisJQlVJTERfQ01fQ3hfUl8obmFtZSwgb2ZmKQkJCQlcCisJQlVJTERfQ01fQ3hfX1cobmFtZSwgb2ZmKQorCisvKiBHQ0IgcmVnaXN0ZXIgYWNjZXNzb3IgZnVuY3Rpb25zICovCitCVUlMRF9DTV9SXyhjb25maWcsCQlNSVBTX0NNX0dDQl9PRlMgKyAweDAwKQorQlVJTERfQ01fUlcoYmFzZSwJCU1JUFNfQ01fR0NCX09GUyArIDB4MDgpCitCVUlMRF9DTV9SVyhhY2Nlc3MsCQlNSVBTX0NNX0dDQl9PRlMgKyAweDIwKQorQlVJTERfQ01fUl8ocmV2LAkJTUlQU19DTV9HQ0JfT0ZTICsgMHgzMCkKK0JVSUxEX0NNX1JXKGVycm9yX21hc2ssCQlNSVBTX0NNX0dDQl9PRlMgKyAweDQwKQorQlVJTERfQ01fUlcoZXJyb3JfY2F1c2UsCU1JUFNfQ01fR0NCX09GUyArIDB4NDgpCitCVUlMRF9DTV9SVyhlcnJvcl9hZGRyLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHg1MCkKK0JVSUxEX0NNX1JXKGVycm9yX211bHQsCQlNSVBTX0NNX0dDQl9PRlMgKyAweDU4KQorQlVJTERfQ01fUlcobDJfb25seV9zeW5jX2Jhc2UsCU1JUFNfQ01fR0NCX09GUyArIDB4NzApCitCVUlMRF9DTV9SVyhnaWNfYmFzZSwJCU1JUFNfQ01fR0NCX09GUyArIDB4ODApCitCVUlMRF9DTV9SVyhjcGNfYmFzZSwJCU1JUFNfQ01fR0NCX09GUyArIDB4ODgpCitCVUlMRF9DTV9SVyhyZWcwX2Jhc2UsCQlNSVBTX0NNX0dDQl9PRlMgKyAweDkwKQorQlVJTERfQ01fUlcocmVnMF9tYXNrLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHg5OCkKK0JVSUxEX0NNX1JXKHJlZzFfYmFzZSwJCU1JUFNfQ01fR0NCX09GUyArIDB4YTApCitCVUlMRF9DTV9SVyhyZWcxX21hc2ssCQlNSVBTX0NNX0dDQl9PRlMgKyAweGE4KQorQlVJTERfQ01fUlcocmVnMl9iYXNlLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHhiMCkKK0JVSUxEX0NNX1JXKHJlZzJfbWFzaywJCU1JUFNfQ01fR0NCX09GUyArIDB4YjgpCitCVUlMRF9DTV9SVyhyZWczX2Jhc2UsCQlNSVBTX0NNX0dDQl9PRlMgKyAweGMwKQorQlVJTERfQ01fUlcocmVnM19tYXNrLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHhjOCkKK0JVSUxEX0NNX1JfKGdpY19zdGF0dXMsCQlNSVBTX0NNX0dDQl9PRlMgKyAweGQwKQorQlVJTERfQ01fUl8oY3BjX3N0YXR1cywJCU1JUFNfQ01fR0NCX09GUyArIDB4ZjApCisKKy8qIENvcmUgTG9jYWwgJiBDb3JlIE90aGVyIHJlZ2lzdGVyIGFjY2Vzc29yIGZ1bmN0aW9ucyAqLworQlVJTERfQ01fQ3hfUlcocmVzZXRfcmVsZWFzZSwJMHgwMCkKK0JVSUxEX0NNX0N4X1JXKGNvaGVyZW5jZSwJMHgwOCkKK0JVSUxEX0NNX0N4X1JfKGNvbmZpZywJCTB4MTApCitCVUlMRF9DTV9DeF9SVyhvdGhlciwJCTB4MTgpCitCVUlMRF9DTV9DeF9SVyhyZXNldF9iYXNlLAkweDIwKQorQlVJTERfQ01fQ3hfUl8oaWQsCQkweDI4KQorQlVJTERfQ01fQ3hfUlcocmVzZXRfZXh0X2Jhc2UsCTB4MzApCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzBfcHJpb3JpdHksCTB4NDApCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzFfcHJpb3JpdHksCTB4NDgpCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzJfcHJpb3JpdHksCTB4NTApCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzNfcHJpb3JpdHksCTB4NTgpCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzRfcHJpb3JpdHksCTB4NjApCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzVfcHJpb3JpdHksCTB4NjgpCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzZfcHJpb3JpdHksCTB4NzApCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzdfcHJpb3JpdHksCTB4NzgpCitCVUlMRF9DTV9DeF9SXyh0Y2lkXzhfcHJpb3JpdHksCTB4ODApCisKKy8qIEdDUl9DT05GSUcgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DT05GSUdfTlVNSU9DVV9TSEYJCTgKKyNkZWZpbmUgQ01fR0NSX0NPTkZJR19OVU1JT0NVX01TSwkJKF9VTENBU1RfKDB4ZikgPDwgOCkKKyNkZWZpbmUgQ01fR0NSX0NPTkZJR19QQ09SRVNfU0hGCQkwCisjZGVmaW5lIENNX0dDUl9DT05GSUdfUENPUkVTX01TSwkJKF9VTENBU1RfKDB4ZmYpIDw8IDApCisKKy8qIEdDUl9CQVNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQkFTRV9HQ1JCQVNFX1NIRgkJCTE1CisjZGVmaW5lIENNX0dDUl9CQVNFX0dDUkJBU0VfTVNLCQkJKF9VTENBU1RfKDB4MWZmZmYpIDw8IDE1KQorI2RlZmluZSBDTV9HQ1JfQkFTRV9DTURFRlRHVF9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0JBU0VfQ01ERUZUR1RfTVNLCQkoX1VMQ0FTVF8oMHgzKSA8PCAwKQorI2RlZmluZSAgQ01fR0NSX0JBU0VfQ01ERUZUR1RfRElTQUJMRUQJCTAKKyNkZWZpbmUgIENNX0dDUl9CQVNFX0NNREVGVEdUX01FTQkJMQorI2RlZmluZSAgQ01fR0NSX0JBU0VfQ01ERUZUR1RfSU9DVTAJCTIKKyNkZWZpbmUgIENNX0dDUl9CQVNFX0NNREVGVEdUX0lPQ1UxCQkzCisKKy8qIEdDUl9BQ0NFU1MgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9BQ0NFU1NfQUNDRVNTRU5fU0hGCQkwCisjZGVmaW5lIENNX0dDUl9BQ0NFU1NfQUNDRVNTRU5fTVNLCQkoX1VMQ0FTVF8oMHhmZikgPDwgMCkKKworLyogR0NSX1JFViByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX1JFVl9NQUpPUl9TSEYJCQk4CisjZGVmaW5lIENNX0dDUl9SRVZfTUFKT1JfTVNLCQkJKF9VTENBU1RfKDB4ZmYpIDw8IDgpCisjZGVmaW5lIENNX0dDUl9SRVZfTUlOT1JfU0hGCQkJMAorI2RlZmluZSBDTV9HQ1JfUkVWX01JTk9SX01TSwkJCShfVUxDQVNUXygweGZmKSA8PCAwKQorCisvKiBHQ1JfRVJST1JfQ0FVU0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9FUlJPUl9DQVVTRV9FUlJUWVBFX1NIRgkJMjcKKyNkZWZpbmUgQ01fR0NSX0VSUk9SX0NBVVNFX0VSUlRZUEVfTVNLCQkoX1VMQ0FTVF8oMHgxZikgPDwgMjcpCisjZGVmaW5lIENNX0dDUl9FUlJPUl9DQVVTRV9FUlJJTkZPX1NIRgkJMAorI2RlZmluZSBDTV9HQ1JfRVJST1JfQ0FVU0VfRVJSSU5HT19NU0sJCShfVUxDQVNUXygweDdmZmZmZmYpIDw8IDApCisKKy8qIEdDUl9FUlJPUl9NVUxUIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfRVJST1JfTVVMVF9FUlIyTkRfU0hGCQkwCisjZGVmaW5lIENNX0dDUl9FUlJPUl9NVUxUX0VSUjJORF9NU0sJCShfVUxDQVNUXygweDFmKSA8PCAwKQorCisvKiBHQ1JfTDJfT05MWV9TWU5DX0JBU0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9MMl9PTkxZX1NZTkNfQkFTRV9TWU5DQkFTRV9TSEYJMTIKKyNkZWZpbmUgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNCQVNFX01TSwkoX1VMQ0FTVF8oMHhmZmZmZikgPDwgMTIpCisjZGVmaW5lIENNX0dDUl9MMl9PTkxZX1NZTkNfQkFTRV9TWU5DRU5fU0hGCTAKKyNkZWZpbmUgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNFTl9NU0sJKF9VTENBU1RfKDB4MSkgPDwgMCkKKworLyogR0NSX0dJQ19CQVNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfR0lDX0JBU0VfR0lDQkFTRV9TSEYJCTE3CisjZGVmaW5lIENNX0dDUl9HSUNfQkFTRV9HSUNCQVNFX01TSwkJKF9VTENBU1RfKDB4N2ZmZikgPDwgMTcpCisjZGVmaW5lIENNX0dDUl9HSUNfQkFTRV9HSUNFTl9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0dJQ19CQVNFX0dJQ0VOX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgMCkKKworLyogR0NSX0NQQ19CQVNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ1BDX0JBU0VfQ1BDQkFTRV9TSEYJCTE3CisjZGVmaW5lIENNX0dDUl9DUENfQkFTRV9DUENCQVNFX01TSwkJKF9VTENBU1RfKDB4N2ZmZikgPDwgMTcpCisjZGVmaW5lIENNX0dDUl9DUENfQkFTRV9DUENFTl9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0NQQ19CQVNFX0NQQ0VOX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgMCkKKworLyogR0NSX1JFR25fQkFTRSByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX1JFR25fQkFTRV9CQVNFQUREUl9TSEYJCTE2CisjZGVmaW5lIENNX0dDUl9SRUduX0JBU0VfQkFTRUFERFJfTVNLCQkoX1VMQ0FTVF8oMHhmZmZmKSA8PCAxNikKKworLyogR0NSX1JFR25fTUFTSyByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19BRERSTUFTS19TSEYJCTE2CisjZGVmaW5lIENNX0dDUl9SRUduX01BU0tfQUREUk1BU0tfTVNLCQkoX1VMQ0FTVF8oMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19DQ0FPVlJfU0hGCQk1CisjZGVmaW5lIENNX0dDUl9SRUduX01BU0tfQ0NBT1ZSX01TSwkJKF9VTENBU1RfKDB4MykgPDwgNSkKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19DQ0FPVlJFTl9TSEYJCTQKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19DQ0FPVlJFTl9NU0sJCShfVUxDQVNUXygweDEpIDw8IDQpCisjZGVmaW5lIENNX0dDUl9SRUduX01BU0tfRFJPUEwyX1NIRgkJMgorI2RlZmluZSBDTV9HQ1JfUkVHbl9NQVNLX0RST1BMMl9NU0sJCShfVUxDQVNUXygweDEpIDw8IDIpCisjZGVmaW5lIENNX0dDUl9SRUduX01BU0tfQ01UR1RfU0hGCQkwCisjZGVmaW5lIENNX0dDUl9SRUduX01BU0tfQ01UR1RfTVNLCQkoX1VMQ0FTVF8oMHgzKSA8PCAwKQorI2RlZmluZSAgQ01fR0NSX1JFR25fTUFTS19DTVRHVF9ESVNBQkxFRAkoX1VMQ0FTVF8oMHgwKSA8PCAwKQorI2RlZmluZSAgQ01fR0NSX1JFR25fTUFTS19DTVRHVF9NRU0JCShfVUxDQVNUXygweDEpIDw8IDApCisjZGVmaW5lICBDTV9HQ1JfUkVHbl9NQVNLX0NNVEdUX0lPQ1UwCQkoX1VMQ0FTVF8oMHgyKSA8PCAwKQorI2RlZmluZSAgQ01fR0NSX1JFR25fTUFTS19DTVRHVF9JT0NVMQkJKF9VTENBU1RfKDB4MykgPDwgMCkKKworLyogR0NSX0dJQ19TVEFUVVMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9HSUNfU1RBVFVTX0VYX1NIRgkJMAorI2RlZmluZSBDTV9HQ1JfR0lDX1NUQVRVU19FWF9NU0sJCShfVUxDQVNUXygweDEpIDw8IDApCisKKy8qIEdDUl9DUENfU1RBVFVTIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ1BDX1NUQVRVU19FWF9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0NQQ19TVEFUVVNfRVhfTVNLCQkoX1VMQ0FTVF8oMHgxKSA8PCAwKQorCisvKiBHQ1JfQ3hfQ09IRVJFTkNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ3hfQ09IRVJFTkNFX0NPSERPTUFJTkVOX1NIRgkwCisjZGVmaW5lIENNX0dDUl9DeF9DT0hFUkVOQ0VfQ09IRE9NQUlORU5fTVNLCShfVUxDQVNUXygweGZmKSA8PCAwKQorCisvKiBHQ1JfQ3hfQ09ORklHIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ3hfQ09ORklHX0lPQ1VUWVBFX1NIRgkJMTAKKyNkZWZpbmUgQ01fR0NSX0N4X0NPTkZJR19JT0NVVFlQRV9NU0sJCShfVUxDQVNUXygweDMpIDw8IDEwKQorI2RlZmluZSBDTV9HQ1JfQ3hfQ09ORklHX1BWUEVfU0hGCQkwCisjZGVmaW5lIENNX0dDUl9DeF9DT05GSUdfUFZQRV9NU0sJCShfVUxDQVNUXygweDFmZikgPDwgMCkKKworLyogR0NSX0N4X09USEVSIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ3hfT1RIRVJfQ09SRU5VTV9TSEYJCTE2CisjZGVmaW5lIENNX0dDUl9DeF9PVEhFUl9DT1JFTlVNX01TSwkJKF9VTENBU1RfKDB4ZmZmZikgPDwgMTYpCisKKy8qIEdDUl9DeF9SRVNFVF9CQVNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfQkFTRV9CRVZFWENCQVNFX1NIRgkxMgorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfQkFTRV9CRVZFWENCQVNFX01TSwkoX1VMQ0FTVF8oMHhmZmZmZikgPDwgMTIpCisKKy8qIEdDUl9DeF9SRVNFVF9FWFRfQkFTRSByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX0N4X1JFU0VUX0VYVF9CQVNFX0VWQVJFU0VUX1NIRgkzMQorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfRVZBUkVTRVRfTVNLCShfVUxDQVNUXygweDEpIDw8IDMxKQorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfVUVCX1NIRgkzMAorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfVUVCX01TSwkoX1VMQ0FTVF8oMHgxKSA8PCAzMCkKKyNkZWZpbmUgQ01fR0NSX0N4X1JFU0VUX0VYVF9CQVNFX0JFVkVYQ01BU0tfU0hGCTIwCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9CRVZFWENNQVNLX01TSwkoX1VMQ0FTVF8oMHhmZikgPDwgMjApCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9CRVZFWENQQV9TSEYJMQorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfQkVWRVhDUEFfTVNLCShfVUxDQVNUXygweDdmKSA8PCAxKQorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfUFJFU0VOVF9TSEYJMAorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfUFJFU0VOVF9NU0sJKF9VTENBU1RfKDB4MSkgPDwgMCkKKworLyoqCisgKiBtaXBzX2NtX251bWNvcmVzIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgY29yZXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtCisgKgorICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFBDT1JFUyBmaWVsZCBvZiB0aGUgR0NSX0NPTkZJRyByZWdpc3RlciBwbHVzIDEsIG9yCisgKiB6ZXJvIGlmIG5vIENvaGVyZW5jZSBNYW5hZ2VyIGlzIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbWlwc19jbV9udW1jb3Jlcyh2b2lkKQoreworCWlmICghbWlwc19jbV9wcmVzZW50KCkpCisJCXJldHVybiAwOworCisJcmV0dXJuICgocmVhZF9nY3JfY29uZmlnKCkgJiBDTV9HQ1JfQ09ORklHX1BDT1JFU19NU0spCisJCT4+IENNX0dDUl9DT05GSUdfUENPUkVTX1NIRikgKyAxOworfQorCisvKioKKyAqIG1pcHNfY21fbnVtaW9jdSAtIHJldHVybiB0aGUgbnVtYmVyIG9mIElPQ1VzIHByZXNlbnQgaW4gdGhlIHN5c3RlbQorICoKKyAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBOVU1JT0NVIGZpZWxkIG9mIHRoZSBHQ1JfQ09ORklHIHJlZ2lzdGVyLCBvciB6ZXJvCisgKiBpZiBubyBDb2hlcmVuY2UgTWFuYWdlciBpcyBwcmVzZW50LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG1pcHNfY21fbnVtaW9jdSh2b2lkKQoreworCWlmICghbWlwc19jbV9wcmVzZW50KCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIChyZWFkX2djcl9jb25maWcoKSAmIENNX0dDUl9DT05GSUdfTlVNSU9DVV9NU0spCisJCT4+IENNX0dDUl9DT05GSUdfTlVNSU9DVV9TSEY7Cit9CisKKy8qKgorICogbWlwc19jbV9sMnN5bmMgLSBwZXJmb3JtIGFuIEwyLW9ubHkgc3luYyBvcGVyYXRpb24KKyAqCisgKiBJZiBhbiBMMi1vbmx5IHN5bmMgcmVnaW9uIGlzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSB0aGVuIHRoaXMgZnVuY3Rpb24KKyAqIHBlcmZvcm1zIGFuZCBMMi1vbmx5IHN5bmMgYW5kIHJldHVybnMgemVyby4gT3RoZXJ3aXNlIGl0IHJldHVybnMgLUVOT0RFVi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbWlwc19jbV9sMnN5bmModm9pZCkKK3sKKwlpZiAoIW1pcHNfY21faGFzX2wyc3luYygpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdyaXRlbCgwLCBtaXBzX2NtX2wyc3luY19iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9fTUlQU19BU01fTUlQU19DTV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNwYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY3BjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4NTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNwYy5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBQYXVsIEJ1cnRvbiA8cGF1bC5idXJ0b25AaW1ndGVjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX01JUFNfQVNNX01JUFNfQ1BDX0hfXworI2RlZmluZSBfX01JUFNfQVNNX01JUFNfQ1BDX0hfXworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBDUEMgcmVnaXN0ZXJzICovCitleHRlcm4gdm9pZCBfX2lvbWVtICptaXBzX2NwY19iYXNlOworCisvKioKKyAqIG1pcHNfY3BjX2RlZmF1bHRfcGh5c19iYXNlIC0gcmV0cmlldmUgdGhlIGRlZmF1bHQgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBDUEMKKyAqCisgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ2x1c3RlciBQb3dlciBDb250cm9sbGVyCisgKiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycy4gVGhpcyBpcyBwbGF0Zm9ybSBkZXBlbmRhbnQgJiBtdXN0IHRoZXJlZm9yZSBiZQorICogaW1wbGVtZW50ZWQgcGVyLXBsYXRmb3JtLgorICovCitleHRlcm4gcGh5c190IG1pcHNfY3BjX2RlZmF1bHRfcGh5c19iYXNlKHZvaWQpOworCisvKioKKyAqIG1pcHNfY3BjX3BoeXNfYmFzZSAtIHJldHJpZXZlIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIENQQworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBDbHVzdGVyIFBvd2VyCisgKiBDb250cm9sbGVyIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzLCBvciAwIGlmIG5vIENsdXN0ZXIgUG93ZXIgQ29udHJvbGxlcgorICogaXMgcHJlc2VudC4gSXQgbWF5IGJlIG92ZXJyaWRlbiBieSBpbmRpdmlkdWFsIHBsYXRmb3JtcyB3aGljaCBkZXRlcm1pbmUKKyAqIHRoaXMgYWRkcmVzcyBpbiBhIGRpZmZlcmVudCB3YXkuCisgKi8KK2V4dGVybiBwaHlzX3QgX193ZWFrIG1pcHNfY3BjX3BoeXNfYmFzZSh2b2lkKTsKKworLyoqCisgKiBtaXBzX2NwY19wcm9iZSAtIHByb2JlIGZvciBhIENsdXN0ZXIgUG93ZXIgQ29udHJvbGxlcgorICoKKyAqIEF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBhIENsdXN0ZXIgUG93ZXIgQ29udHJvbGxlci4gUmV0dXJucyAwIGlmCisgKiBhIENQQyBpcyBzdWNjZXNzZnVsbHkgZGV0ZWN0ZWQsIGVsc2UgLWVycm5vLgorICovCisjaWZkZWYgQ09ORklHX01JUFNfQ1BDCitleHRlcm4gaW50IG1pcHNfY3BjX3Byb2JlKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1pcHNfY3BjX3Byb2JlKHZvaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworLyoqCisgKiBtaXBzX2NwY19wcmVzZW50IC0gZGV0ZXJtaW5lIHdoZXRoZXIgYSBDbHVzdGVyIFBvd2VyIENvbnRyb2xsZXIgaXMgcHJlc2VudAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIENQQyBpcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0sIGVsc2UgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtaXBzX2NwY19wcmVzZW50KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01JUFNfQ1BDCisJcmV0dXJuIG1pcHNfY3BjX2Jhc2UgIT0gTlVMTDsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qIE9mZnNldHMgZnJvbSB0aGUgQ1BDIGJhc2UgYWRkcmVzcyB0byB2YXJpb3VzIGNvbnRyb2wgYmxvY2tzICovCisjZGVmaW5lIE1JUFNfQ1BDX0dDQl9PRlMJMHgwMDAwCisjZGVmaW5lIE1JUFNfQ1BDX0NMQ0JfT0ZTCTB4MjAwMAorI2RlZmluZSBNSVBTX0NQQ19DT0NCX09GUwkweDQwMDAKKworLyogTWFjcm9zIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQlVJTERfQ1BDX1JfKG5hbWUsIG9mZikgXAorc3RhdGljIGlubGluZSB1MzIgcmVhZF9jcGNfIyNuYW1lKHZvaWQpCQkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gX19yYXdfcmVhZGwobWlwc19jcGNfYmFzZSArIChvZmYpKTsJCVwKK30KKworI2RlZmluZSBCVUlMRF9DUENfX1cobmFtZSwgb2ZmKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfY3BjXyMjbmFtZSh1MzIgdmFsdWUpCQkJXAorewkJCQkJCQkJXAorCV9fcmF3X3dyaXRlbCh2YWx1ZSwgbWlwc19jcGNfYmFzZSArIChvZmYpKTsJCVwKK30KKworI2RlZmluZSBCVUlMRF9DUENfUlcobmFtZSwgb2ZmKQkJCQkJXAorCUJVSUxEX0NQQ19SXyhuYW1lLCBvZmYpCQkJCQlcCisJQlVJTERfQ1BDX19XKG5hbWUsIG9mZikKKworI2RlZmluZSBCVUlMRF9DUENfQ3hfUl8obmFtZSwgb2ZmKQkJCQlcCisJQlVJTERfQ1BDX1JfKGNsXyMjbmFtZSwgTUlQU19DUENfQ0xDQl9PRlMgKyAob2ZmKSkJXAorCUJVSUxEX0NQQ19SXyhjb18jI25hbWUsIE1JUFNfQ1BDX0NPQ0JfT0ZTICsgKG9mZikpCisKKyNkZWZpbmUgQlVJTERfQ1BDX0N4X19XKG5hbWUsIG9mZikJCQkJXAorCUJVSUxEX0NQQ19fVyhjbF8jI25hbWUsIE1JUFNfQ1BDX0NMQ0JfT0ZTICsgKG9mZikpCVwKKwlCVUlMRF9DUENfX1coY29fIyNuYW1lLCBNSVBTX0NQQ19DT0NCX09GUyArIChvZmYpKQorCisjZGVmaW5lIEJVSUxEX0NQQ19DeF9SVyhuYW1lLCBvZmYpCQkJCVwKKwlCVUlMRF9DUENfQ3hfUl8obmFtZSwgb2ZmKQkJCQlcCisJQlVJTERfQ1BDX0N4X19XKG5hbWUsIG9mZikKKworLyogR0NCIHJlZ2lzdGVyIGFjY2Vzc29yIGZ1bmN0aW9ucyAqLworQlVJTERfQ1BDX1JXKGFjY2VzcywJCU1JUFNfQ1BDX0dDQl9PRlMgKyAweDAwKQorQlVJTERfQ1BDX1JXKHNlcWRlbCwJCU1JUFNfQ1BDX0dDQl9PRlMgKyAweDA4KQorQlVJTERfQ1BDX1JXKHJhaWwsCQlNSVBTX0NQQ19HQ0JfT0ZTICsgMHgxMCkKK0JVSUxEX0NQQ19SVyhyZXNldGxlbiwJCU1JUFNfQ1BDX0dDQl9PRlMgKyAweDE4KQorQlVJTERfQ1BDX1JfKHJldmlzaW9uLAkJTUlQU19DUENfR0NCX09GUyArIDB4MjApCisKKy8qIENvcmUgTG9jYWwgJiBDb3JlIE90aGVyIGFjY2Vzc29yIGZ1bmN0aW9ucyAqLworQlVJTERfQ1BDX0N4X1JXKGNtZCwJCTB4MDApCitCVUlMRF9DUENfQ3hfUlcoc3RhdF9jb25mLAkweDA4KQorQlVJTERfQ1BDX0N4X1JXKG90aGVyLAkJMHgxMCkKKworLyogQ1BDX0N4X0NNRCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ1BDX0N4X0NNRF9TSEYJCQkJMAorI2RlZmluZSBDUENfQ3hfQ01EX01TSwkJCQkoX1VMQ0FTVF8oMHhmKSA8PCAwKQorI2RlZmluZSAgQ1BDX0N4X0NNRF9DTE9DS09GRgkJCShfVUxDQVNUXygweDEpIDw8IDApCisjZGVmaW5lICBDUENfQ3hfQ01EX1BXUkRPV04JCQkoX1VMQ0FTVF8oMHgyKSA8PCAwKQorI2RlZmluZSAgQ1BDX0N4X0NNRF9QV1JVUAkJCShfVUxDQVNUXygweDMpIDw8IDApCisjZGVmaW5lICBDUENfQ3hfQ01EX1JFU0VUCQkJKF9VTENBU1RfKDB4NCkgPDwgMCkKKworLyogQ1BDX0N4X1NUQVRfQ09ORiByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ1BDX0N4X1NUQVRfQ09ORl9QV1JVUEVfU0hGCQkyMworI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX1BXUlVQRV9NU0sJCShfVUxDQVNUXygweDEpIDw8IDIzKQorI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX1NIRgkJMTkKKyNkZWZpbmUgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9NU0sJCShfVUxDQVNUXygweGYpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9EMAkJKF9VTENBU1RfKDB4MCkgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX1UwCQkoX1VMQ0FTVF8oMHgxKSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfVTEJCShfVUxDQVNUXygweDIpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9VMgkJKF9VTENBU1RfKDB4MykgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX1UzCQkoX1VMQ0FTVF8oMHg0KSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfVTQJCShfVUxDQVNUXygweDUpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9VNQkJKF9VTENBU1RfKDB4NikgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX1U2CQkoX1VMQ0FTVF8oMHg3KSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfRDEJCShfVUxDQVNUXygweDgpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9EMwkJKF9VTENBU1RfKDB4OSkgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX0QyCQkoX1VMQ0FTVF8oMHhhKSA8PCAxOSkKKyNkZWZpbmUgQ1BDX0N4X1NUQVRfQ09ORl9DTEtHQVRfSU1QTF9TSEYJMTcKKyNkZWZpbmUgQ1BDX0N4X1NUQVRfQ09ORl9DTEtHQVRfSU1QTF9NU0sJKF9VTENBU1RfKDB4MSkgPDwgMTcpCisjZGVmaW5lIENQQ19DeF9TVEFUX0NPTkZfUFdSRE5fSU1QTF9TSEYJCTE2CisjZGVmaW5lIENQQ19DeF9TVEFUX0NPTkZfUFdSRE5fSU1QTF9NU0sJCShfVUxDQVNUXygweDEpIDw8IDE2KQorI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX0VKVEFHX1BST0JFX1NIRgkxNQorI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX0VKVEFHX1BST0JFX01TSwkoX1VMQ0FTVF8oMHgxKSA8PCAxNSkKKworLyogQ1BDX0N4X09USEVSIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDUENfQ3hfT1RIRVJfQ09SRU5VTV9TSEYJCTE2CisjZGVmaW5lIENQQ19DeF9PVEhFUl9DT1JFTlVNX01TSwkJKF9VTENBU1RfKDB4ZmYpIDw8IDE2KQorCisjZW5kaWYgLyogX19NSVBTX0FTTV9NSVBTX0NQQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzX210LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc19tdC5oCmluZGV4IGFjNzkzNTIuLmEzZGYwYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzX210LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNfbXQuaApAQCAtMTgsNyArMTgsMTIgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG10X2ZwZW11bF90aHJlc2hvbGQ7CiAKIGV4dGVybiB2b2lkIG1pcHNfbXRfcmVnZHVtcCh1bnNpZ25lZCBsb25nIHByZXZpb3VzX212cGNvbnRyb2xfdmFsdWUpOworCisjaWZkZWYgQ09ORklHX01JUFNfTVQKIGV4dGVybiB2b2lkIG1pcHNfbXRfc2V0X2NwdW9wdGlvbnModm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG1pcHNfbXRfc2V0X2NwdW9wdGlvbnModm9pZCkgeyB9CisjZW5kaWYKIAogc3RydWN0IGNsYXNzOwogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqbXRfY2xhc3M7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc210cmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNtdHJlZ3MuaAppbmRleCAzOGI3NzA0Li42ZWZhNzlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc210cmVncy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzbXRyZWdzLmgKQEAgLTE3Niw2ICsxNzYsMTcgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb3JlX252cGVzKHZvaWQpCit7CisJdW5zaWduZWQgY29uZjA7CisKKwlpZiAoIWNwdV9oYXNfbWlwc210KQorCQlyZXR1cm4gMTsKKworCWNvbmYwID0gcmVhZF9jMF9tdnBjb25mMCgpOworCXJldHVybiAoKGNvbmYwICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkgKyAxOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkdnBlKHZvaWQpCiB7CiAJaW50IHJlcyA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCmluZGV4IGJiYzNkZDQuLjNlMDI1YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCkBAIC01NjgsMTEgKzU2OCwyMyBAQAogI2RlZmluZSBNSVBTX0NPTkYxX1BDCQkoX1VMQ0FTVF8oMSkgPDwJIDQpCiAjZGVmaW5lIE1JUFNfQ09ORjFfTUQJCShfVUxDQVNUXygxKSA8PAkgNSkKICNkZWZpbmUgTUlQU19DT05GMV9DMgkJKF9VTENBU1RfKDEpIDw8CSA2KQorI2RlZmluZSBNSVBTX0NPTkYxX0RBX1NIRgk3CisjZGVmaW5lIE1JUFNfQ09ORjFfREFfU1oJMwogI2RlZmluZSBNSVBTX0NPTkYxX0RBCQkoX1VMQ0FTVF8oNykgPDwJIDcpCisjZGVmaW5lIE1JUFNfQ09ORjFfRExfU0hGCTEwCisjZGVmaW5lIE1JUFNfQ09ORjFfRExfU1oJMwogI2RlZmluZSBNSVBTX0NPTkYxX0RMCQkoX1VMQ0FTVF8oNykgPDwgMTApCisjZGVmaW5lIE1JUFNfQ09ORjFfRFNfU0hGCTEzCisjZGVmaW5lIE1JUFNfQ09ORjFfRFNfU1oJMwogI2RlZmluZSBNSVBTX0NPTkYxX0RTCQkoX1VMQ0FTVF8oNykgPDwgMTMpCisjZGVmaW5lIE1JUFNfQ09ORjFfSUFfU0hGCTE2CisjZGVmaW5lIE1JUFNfQ09ORjFfSUFfU1oJMwogI2RlZmluZSBNSVBTX0NPTkYxX0lBCQkoX1VMQ0FTVF8oNykgPDwgMTYpCisjZGVmaW5lIE1JUFNfQ09ORjFfSUxfU0hGCTE5CisjZGVmaW5lIE1JUFNfQ09ORjFfSUxfU1oJMwogI2RlZmluZSBNSVBTX0NPTkYxX0lMCQkoX1VMQ0FTVF8oNykgPDwgMTkpCisjZGVmaW5lIE1JUFNfQ09ORjFfSVNfU0hGCTIyCisjZGVmaW5lIE1JUFNfQ09ORjFfSVNfU1oJMwogI2RlZmluZSBNSVBTX0NPTkYxX0lTCQkoX1VMQ0FTVF8oNykgPDwgMjIpCiAjZGVmaW5lIE1JUFNfQ09ORjFfVExCU19TSElGVCAgICgyNSkKICNkZWZpbmUgTUlQU19DT05GMV9UTEJTX1NJWkUgICAgKDYpCkBAIC02NTMsOSArNjY1LDE2IEBACiAKICNkZWZpbmUgTUlQU19DT05GN19SUFMJCShfVUxDQVNUXygxKSA8PCAyKQogCisjZGVmaW5lIE1JUFNfQ09ORjdfSUFSCQkoX1VMQ0FTVF8oMSkgPDwgMTApCisjZGVmaW5lIE1JUFNfQ09ORjdfQVIJCShfVUxDQVNUXygxKSA8PCAxNikKKwogLyogIEVudHJ5SEkgYml0IGRlZmluaXRpb24gKi8KICNkZWZpbmUgTUlQU19FTlRSWUhJX0VISU5WCShfVUxDQVNUXygxKSA8PCAxMCkKIAorLyogQ01HQ1JCYXNlIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNSVBTX0NNR0NSQl9CQVNFCTExCisjZGVmaW5lIE1JUFNfQ01HQ1JGX0JBU0UJKH5fVUxDQVNUXygoMSA8PCBNSVBTX0NNR0NSQl9CQVNFKSAtIDEpKQorCiAvKgogICogQml0cyBpbiB0aGUgTUlQUzMyLzY0IGNvcHJvY2Vzc29yIDEgKEZQVSkgcmV2aXNpb24gcmVnaXN0ZXIuCiAgKi8KQEAgLTEwMTAsNiArMTAyOSw4IEBACiAKICNkZWZpbmUgcmVhZF9jMF9wcmlkKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTUsIDApCiAKKyNkZWZpbmUgcmVhZF9jMF9jbWdjcmJhc2UoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE1LCAzKQorCiAjZGVmaW5lIHJlYWRfYzBfY29uZmlnKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgMCkKICNkZWZpbmUgcmVhZF9jMF9jb25maWcxKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgMSkKICNkZWZpbmUgcmVhZF9jMF9jb25maWcyKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgMikKQEAgLTE4ODMsNiArMTkwNCw3IEBACiBfX0JVSUxEX1NFVF9DMChzdGF0dXMpCiBfX0JVSUxEX1NFVF9DMChjYXVzZSkKIF9fQlVJTERfU0VUX0MwKGNvbmZpZykKK19fQlVJTERfU0VUX0MwKGNvbmZpZzUpCiBfX0JVSUxEX1NFVF9DMChpbnRjb250cm9sKQogX19CVUlMRF9TRVRfQzAoaW50Y3RsKQogX19CVUlMRF9TRVRfQzAoc3JzbWFwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21vZHVsZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21vZHVsZS5oCmluZGV4IDQ0YjcwNWQuLmMyZWRhZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tb2R1bGUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmgKQEAgLTEyNiw2ICsxMjYsOCBAQAogI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIkxPT05HU09OMSAiCiAjZWxpZiBkZWZpbmVkIENPTkZJR19DUFVfTE9PTkdTT04yCiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWSAiTE9PTkdTT04yICIKKyNlbGlmIGRlZmluZWQgQ09ORklHX0NQVV9MT09OR1NPTjMKKyNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJMT09OR1NPTjMgIgogI2VsaWYgZGVmaW5lZCBDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04KICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJPQ1RFT04gIgogI2VsaWYgZGVmaW5lZCBDT05GSUdfQ1BVX1hMUgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21zYS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21zYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYWJhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbXNhLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IFBhdWwgQnVydG9uIDxwYXVsLmJ1cnRvbkBpbWd0ZWMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX01TQV9ICisjZGVmaW5lIF9BU01fTVNBX0gKKworI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorCitleHRlcm4gdm9pZCBfc2F2ZV9tc2Eoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgX3Jlc3RvcmVfbXNhKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9tc2Eodm9pZCkKK3sKKwlpZiAoY3B1X2hhc19tc2EpIHsKKwkJc2V0X2MwX2NvbmZpZzUoTUlQU19DT05GNV9NU0FFTik7CisJCWVuYWJsZV9mcHVfaGF6YXJkKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9tc2Eodm9pZCkKK3sKKwlpZiAoY3B1X2hhc19tc2EpIHsKKwkJY2xlYXJfYzBfY29uZmlnNShNSVBTX0NPTkY1X01TQUVOKTsKKwkJZGlzYWJsZV9mcHVfaGF6YXJkKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBpc19tc2FfZW5hYmxlZCh2b2lkKQoreworCWlmICghY3B1X2hhc19tc2EpCisJCXJldHVybiAwOworCisJcmV0dXJuIHJlYWRfYzBfY29uZmlnNSgpICYgTUlQU19DT05GNV9NU0FFTjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGhyZWFkX21zYV9jb250ZXh0X2xpdmUodm9pZCkKK3sKKwkvKgorCSAqIENoZWNrIGNwdV9oYXNfbXNhIG9ubHkgaWYgaXQncyBhIGNvbnN0YW50LiBUaGlzIHdpbGwgYWxsb3cgdGhlCisJICogY29tcGlsZXIgdG8gb3B0aW1pc2Ugb3V0IGNvZGUgZm9yIENQVXMgd2l0aG91dCBNU0Egd2l0aG91dCBhZGRpbmcKKwkgKiBhbiBleHRyYSByZWR1bmRhbnQgY2hlY2sgZm9yIENQVXMgd2l0aCBNU0EuCisJICovCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGNwdV9oYXNfbXNhKSAmJiAhY3B1X2hhc19tc2EpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRlc3RfdGhyZWFkX2ZsYWcoVElGX01TQV9DVFhfTElWRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX21zYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CisJaWYgKGNwdV9oYXNfbXNhKQorCQlfc2F2ZV9tc2EodCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX21zYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CisJaWYgKGNwdV9oYXNfbXNhKQorCQlfcmVzdG9yZV9tc2EodCk7Cit9CisKKyNpZmRlZiBUT09MQ0hBSU5fU1VQUE9SVFNfTVNBCisKKyNkZWZpbmUgX19CVUlMRF9NU0FfQ1RMX1JFRyhuYW1lLCBjcykJCQkJXAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9tc2FfIyNuYW1lKHZvaWQpCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgaW50IHJlZzsJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkiCS5zZXQJcHVzaFxuIgkJCQkJXAorCSIJLnNldAltc2FcbiIJCQkJCVwKKwkiCWNmY21zYQklMCwgJCIgI2NzICJcbiIJCQkJXAorCSIJLnNldAlwb3BcbiIJCQkJCVwKKwk6ICI9ciIocmVnKSk7CQkJCQkJXAorCXJldHVybiByZWc7CQkJCQkJXAorfQkJCQkJCQkJXAorCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbXNhXyMjbmFtZSh1bnNpZ25lZCBpbnQgdmFsKQkJXAorewkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSIJLnNldAlwdXNoXG4iCQkJCQlcCisJIgkuc2V0CW1zYVxuIgkJCQkJXAorCSIJY2ZjbXNhCSQiICNjcyAiLCAlMFxuIgkJCQlcCisJIgkuc2V0CXBvcFxuIgkJCQkJXAorCTogOiAiciIodmFsKSk7CQkJCQkJXAorfQorCisjZWxzZSAvKiAhVE9PTENIQUlOX1NVUFBPUlRTX01TQSAqLworCisvKgorICogRGVmaW5lIGZ1bmN0aW9ucyB1c2luZyAud29yZCBmb3IgdGhlIGNbZnRdY21zYSBpbnN0cnVjdGlvbnMgaW4gb3JkZXIgdG8KKyAqIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggdG9vbGNoYWlucyB0aGF0IGRvIG5vdCBzdXBwb3J0IE1TQS4gT25jZSBhbGwKKyAqIHRvb2xjaGFpbnMgaW4gdXNlIHN1cHBvcnQgTVNBIHRoZXNlIGNhbiBiZSByZW1vdmVkLgorICovCisKKyNkZWZpbmUgX19CVUlMRF9NU0FfQ1RMX1JFRyhuYW1lLCBjcykJCQkJXAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9tc2FfIyNuYW1lKHZvaWQpCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgaW50IHJlZzsJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkiCS5zZXQJcHVzaFxuIgkJCQkJXAorCSIJLnNldAlub2F0XG4iCQkJCQlcCisJIgkud29yZAkweDc4N2UwMDU5IHwgKCIgI2NzICIgPDwgMTEpXG4iCQlcCisJIgltb3ZlCSUwLCAkMVxuIgkJCQlcCisJIgkuc2V0CXBvcFxuIgkJCQkJXAorCTogIj1yIihyZWcpKTsJCQkJCQlcCisJcmV0dXJuIHJlZzsJCQkJCQlcCit9CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tc2FfIyNuYW1lKHVuc2lnbmVkIGludCB2YWwpCQlcCit7CQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIgkuc2V0CXB1c2hcbiIJCQkJCVwKKwkiCS5zZXQJbm9hdFxuIgkJCQkJXAorCSIJbW92ZQkkMSwgJTBcbiIJCQkJXAorCSIJLndvcmQJMHg3ODNlMDgxOSB8ICgiICNjcyAiIDw8IDYpXG4iCQlcCisJIgkuc2V0CXBvcFxuIgkJCQkJXAorCTogOiAiciIodmFsKSk7CQkJCQkJXAorfQorCisjZW5kaWYgLyogIVRPT0xDSEFJTl9TVVBQT1JUU19NU0EgKi8KKworI2RlZmluZSBNU0FfSVIJCTAKKyNkZWZpbmUgTVNBX0NTUgkJMQorI2RlZmluZSBNU0FfQUNDRVNTCTIKKyNkZWZpbmUgTVNBX1NBVkUJMworI2RlZmluZSBNU0FfTU9ESUZZCTQKKyNkZWZpbmUgTVNBX1JFUVVFU1QJNQorI2RlZmluZSBNU0FfTUFQCQk2CisjZGVmaW5lIE1TQV9VTk1BUAk3CisKK19fQlVJTERfTVNBX0NUTF9SRUcoaXIsIDApCitfX0JVSUxEX01TQV9DVExfUkVHKGNzciwgMSkKK19fQlVJTERfTVNBX0NUTF9SRUcoYWNjZXNzLCAyKQorX19CVUlMRF9NU0FfQ1RMX1JFRyhzYXZlLCAzKQorX19CVUlMRF9NU0FfQ1RMX1JFRyhtb2RpZnksIDQpCitfX0JVSUxEX01TQV9DVExfUkVHKHJlcXVlc3QsIDUpCitfX0JVSUxEX01TQV9DVExfUkVHKG1hcCwgNikKK19fQlVJTERfTVNBX0NUTF9SRUcodW5tYXAsIDcpCisKKy8qIE1TQSBJbXBsZW1lbnRhdGlvbiBSZWdpc3RlciAoTVNBSVIpICovCisjZGVmaW5lIE1TQV9JUl9SRVZCCQkwCisjZGVmaW5lIE1TQV9JUl9SRVZGCQkoX1VMQ0FTVF8oMHhmZikgPDwgTVNBX0lSX1JFVkIpCisjZGVmaW5lIE1TQV9JUl9QUk9DQgkJOAorI2RlZmluZSBNU0FfSVJfUFJPQ0YJCShfVUxDQVNUXygweGZmKSA8PCBNU0FfSVJfUFJPQ0IpCisjZGVmaW5lIE1TQV9JUl9XUlBCCQkxNgorI2RlZmluZSBNU0FfSVJfV1JQRgkJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0lSX1dSUEIpCisKKy8qIE1TQSBDb250cm9sICYgU3RhdHVzIFJlZ2lzdGVyIChNU0FDU1IpICovCisjZGVmaW5lIE1TQV9DU1JfUk1CCQkwCisjZGVmaW5lIE1TQV9DU1JfUk1GCQkoX1VMQ0FTVF8oMHgzKSA8PCBNU0FfQ1NSX1JNQikKKyNkZWZpbmUgTVNBX0NTUl9STV9ORUFSRVNUCTAKKyNkZWZpbmUgTVNBX0NTUl9STV9UT19aRVJPCTEKKyNkZWZpbmUgTVNBX0NTUl9STV9UT19QT1MJMgorI2RlZmluZSBNU0FfQ1NSX1JNX1RPX05FRwkzCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NCCQkyCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NGCQkoX1VMQ0FTVF8oMHgxZikgPDwgTVNBX0NTUl9GTEFHU0IpCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfSUIJMgorI2RlZmluZSBNU0FfQ1NSX0ZMQUdTX0lGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRkxBR1NfSUIpCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfVUIJMworI2RlZmluZSBNU0FfQ1NSX0ZMQUdTX1VGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRkxBR1NfVUIpCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfT0IJNAorI2RlZmluZSBNU0FfQ1NSX0ZMQUdTX09GCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRkxBR1NfT0IpCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfWkIJNQorI2RlZmluZSBNU0FfQ1NSX0ZMQUdTX1pGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRkxBR1NfWkIpCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfVkIJNgorI2RlZmluZSBNU0FfQ1NSX0ZMQUdTX1ZGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRkxBR1NfVkIpCisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU0IJNworI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNGCShfVUxDQVNUXygweDFmKSA8PCBNU0FfQ1NSX0VOQUJMRVNCKQorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfSUIJNworI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfSUYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9FTkFCTEVTX0lCKQorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfVUIJOAorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfVUYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9FTkFCTEVTX1VCKQorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfT0IJOQorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfT0YJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9FTkFCTEVTX09CKQorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfWkIJMTAKKyNkZWZpbmUgTVNBX0NTUl9FTkFCTEVTX1pGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRU5BQkxFU19aQikKKyNkZWZpbmUgTVNBX0NTUl9FTkFCTEVTX1ZCCTExCisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19WRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0VOQUJMRVNfVkIpCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VCCQkxMgorI2RlZmluZSBNU0FfQ1NSX0NBVVNFRgkJKF9VTENBU1RfKDB4M2YpIDw8IE1TQV9DU1JfQ0FVU0VCKQorI2RlZmluZSBNU0FfQ1NSX0NBVVNFX0lCCTEyCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfSUYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9DQVVTRV9JQikKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9VQgkxMworI2RlZmluZSBNU0FfQ1NSX0NBVVNFX1VGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfQ0FVU0VfVUIpCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfT0IJMTQKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9PRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0NBVVNFX09CKQorI2RlZmluZSBNU0FfQ1NSX0NBVVNFX1pCCTE1CisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfWkYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9DQVVTRV9aQikKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9WQgkxNgorI2RlZmluZSBNU0FfQ1NSX0NBVVNFX1ZGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfQ0FVU0VfVkIpCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfRUIJMTcKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9FRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0NBVVNFX0VCKQorI2RlZmluZSBNU0FfQ1NSX05YQgkJMTgKKyNkZWZpbmUgTVNBX0NTUl9OWEYJCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfTlhCKQorI2RlZmluZSBNU0FfQ1NSX0ZTQgkJMjQKKyNkZWZpbmUgTVNBX0NTUl9GU0YJCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRlNCKQorCisjZW5kaWYgLyogX0FTTV9NU0FfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggNWUwOGJjYy4uNTY5OWVjMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0xOTAsNyArMTkwLDkgQEAKICAqIGh0dHBzOi8vcGF0Y2h3b3JrLmxpbnV4LW1pcHMub3JnL3BhdGNoLzE1NDEvCiAgKi8KIAorI2lmbmRlZiBfX3BhX3N5bWJvbAogI2RlZmluZSBfX3BhX3N5bWJvbCh4KQlfX3BhKFJFTE9DX0hJREUoKHVuc2lnbmVkIGxvbmcpKHgpLCAwKSkKKyNlbmRpZgogCiAjZGVmaW5lIHBmbl90b19rYWRkcihwZm4pCV9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUtYml0cy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUtYml0cy5oCmluZGV4IDMyYWVhNDguLmU1OTJmMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wZ3RhYmxlLWJpdHMuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGd0YWJsZS1iaXRzLmgKQEAgLTIzNSw2ICsyMzUsMTUgQEAKICNkZWZpbmUgX0NBQ0hFX0NBQ0hBQkxFX05PTkNPSEVSRU5UICg1PDxfQ0FDSEVfU0hJRlQpCiAjZGVmaW5lIF9DQUNIRV9VTkNBQ0hFRF9BQ0NFTEVSQVRFRCAoNzw8X0NBQ0hFX1NISUZUKQogCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfTE9PTkdTT04zKQorCisvKiBVc2luZyBDT0hFUkVOVCBmbGFnIGZvciBOT05DT0hFUkVOVCBkb2Vzbid0IGh1cnQuICovCisKKyNkZWZpbmUgX0NBQ0hFX1VOQ0FDSEVEICAgICAgICAgICAgICgyPDxfQ0FDSEVfU0hJRlQpICAvKiBMT09OR1NPTiAgICAgICAqLworI2RlZmluZSBfQ0FDSEVfQ0FDSEFCTEVfTk9OQ09IRVJFTlQgKDM8PF9DQUNIRV9TSElGVCkgIC8qIExPT05HU09OICAgICAgICovCisjZGVmaW5lIF9DQUNIRV9DQUNIQUJMRV9DT0hFUkVOVCAgICAoMzw8X0NBQ0hFX1NISUZUKSAgLyogTE9PTkdTT04tMyAgICAgKi8KKyNkZWZpbmUgX0NBQ0hFX1VOQ0FDSEVEX0FDQ0VMRVJBVEVEICg3PDxfQ0FDSEVfU0hJRlQpICAvKiBMT09OR1NPTiAgICAgICAqLworCiAjZWxzZQogCiAjZGVmaW5lIF9DQUNIRV9DQUNIQUJMRV9OT19XQQkgICAgKDA8PF9DQUNIRV9TSElGVCkgIC8qIFI0NjAwIG9ubHkJICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDM2MDViODQuLmFkNzBjYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTk3LDE4ICs5Nyw0OCBAQAogCiAjZGVmaW5lIE5VTV9GUFVfUkVHUwkzMgogCi10eXBlZGVmIF9fdTY0IGZwdXJlZ190OworI2lmZGVmIENPTkZJR19DUFVfSEFTX01TQQorIyBkZWZpbmUgRlBVX1JFR19XSURUSAkxMjgKKyNlbHNlCisjIGRlZmluZSBGUFVfUkVHX1dJRFRICTY0CisjZW5kaWYKKwordW5pb24gZnB1cmVnIHsKKwlfX3UzMgl2YWwzMltGUFVfUkVHX1dJRFRIIC8gMzJdOworCV9fdTY0CXZhbDY0W0ZQVV9SRUdfV0lEVEggLyA2NF07Cit9OworCisjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBGUFJfSURYKHdpZHRoLCBpZHgpCShpZHgpCisjZWxzZQorIyBkZWZpbmUgRlBSX0lEWCh3aWR0aCwgaWR4KQkoKEZQVV9SRUdfV0lEVEggLyAod2lkdGgpKSAtIDEgLSAoaWR4KSkKKyNlbmRpZgorCisjZGVmaW5lIEJVSUxEX0ZQUl9BQ0NFU1Mod2lkdGgpIFwKK3N0YXRpYyBpbmxpbmUgdSMjd2lkdGggZ2V0X2ZwciMjd2lkdGgodW5pb24gZnB1cmVnICpmcHIsIHVuc2lnbmVkIGlkeCkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gZnByLT52YWwjI3dpZHRoW0ZQUl9JRFgod2lkdGgsIGlkeCldOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZwciMjd2lkdGgodW5pb24gZnB1cmVnICpmcHIsIHVuc2lnbmVkIGlkeCwJXAorCQkJCSAgdSMjd2lkdGggdmFsKQkJCQlcCit7CQkJCQkJCQkJXAorCWZwci0+dmFsIyN3aWR0aFtGUFJfSURYKHdpZHRoLCBpZHgpXSA9IHZhbDsJCQlcCit9CisKK0JVSUxEX0ZQUl9BQ0NFU1MoMzIpCitCVUlMRF9GUFJfQUNDRVNTKDY0KQogCiAvKgotICogSXQgd291bGQgYmUgbmljZSB0byBhZGQgc29tZSBtb3JlIGZpZWxkcyBmb3IgZW11bGF0b3Igc3RhdGlzdGljcywgYnV0IHRoZXJlCi0gKiBhcmUgYSBudW1iZXIgb2YgZml4ZWQgb2Zmc2V0cyBpbiBvZmZzZXQuaCBhbmQgZWxzZXdoZXJlIHRoYXQgd291bGQgaGF2ZSB0bwotICogYmUgcmVjYWxjdWxhdGVkIGJ5IGhhbmQuICBTbyB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIHByaXZhdGUgdG8KLSAqIHRoZSBGUFUgZW11bGF0b3IgZm9yIG5vdy4gIFNlZSBhc20tbWlwcy9mcHVfZW11bGF0b3IuaC4KKyAqIEl0IHdvdWxkIGJlIG5pY2UgdG8gYWRkIHNvbWUgbW9yZSBmaWVsZHMgZm9yIGVtdWxhdG9yIHN0YXRpc3RpY3MsCisgKiB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcml2YXRlIHRvIHRoZSBGUFUgZW11bGF0b3IgZm9yIG5vdy4KKyAqIFNlZSBhcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1X2VtdWxhdG9yLmguCiAgKi8KIAogc3RydWN0IG1pcHNfZnB1X3N0cnVjdCB7Ci0JZnB1cmVnX3QJZnByW05VTV9GUFVfUkVHU107CisJdW5pb24gZnB1cmVnCWZwcltOVU1fRlBVX1JFR1NdOwogCXVuc2lnbmVkIGludAlmY3IzMTsKKwl1bnNpZ25lZCBpbnQJbXNhY3NyOwogfTsKIAogI2RlZmluZSBOVU1fRFNQX1JFR1MgICA2CkBAIC0yODQsOCArMzE0LDkgQEAKIAkgKiBTYXZlZCBGUFUvRlBVIGVtdWxhdG9yIHN0dWZmCQkJCVwKIAkgKi8JCQkJCQkJXAogCS5mcHUJCQk9IHsJCQkJXAotCQkuZnByCQk9IHswLH0sCQkJCVwKKwkJLmZwcgkJPSB7e3swLH0sfSx9LAkJCVwKIAkJLmZjcjMxCQk9IDAsCQkJCVwKKwkJLm1zYWNzcgkJPSAwLAkJCQlcCiAJfSwJCQkJCQkJXAogCS8qCQkJCQkJCVwKIAkgKiBGUFUgYWZmaW5pdHkgc3RhdGUgKG51bGwgaWYgbm90IEZQQUZGKQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDdiYmE5ZGEuLmJmMWFjOGQzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC04Miw3ICs4Miw3IEBACiAjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+Y3AwX2VwYykKICNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCiAKLWV4dGVybiBhc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gYXNtbGlua2FnZSBsb25nIHN5c2NhbGxfdHJhY2VfZW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgc3lzY2FsbCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2VfbGVhdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqKSBfX25vcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3I0a2NhY2hlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcjRrY2FjaGUuaAppbmRleCBjODRjYWRkLi5jYTY0Y2JlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcjRrY2FjaGUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcjRrY2FjaGUuaApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KICNpbmNsdWRlIDxhc20vY3B1LXR5cGUuaD4KICNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+IC8qIGZvciBzZWdtZW50X2VxKCkgKi8KIAogLyoKICAqIFRoaXMgbWFjcm8gcmV0dXJuIGEgcHJvcGVybHkgc2lnbi1leHRlbmRlZCBhZGRyZXNzIHN1aXRhYmxlIGFzIGJhc2UgYWRkcmVzcwpAQCAtMzUsNyArMzYsNyBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKIAkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKIAkiCS5zZXQJbm9yZW9yZGVyCQkJCVxuIglcCi0JIgkuc2V0CW1pcHMzXG5cdAkJCQlcbiIJXAorCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIglcCiAJIgljYWNoZQklMCwgJTEJCQkJCVxuIglcCiAJIgkuc2V0CXBvcAkJCQkJXG4iCVwKIAk6CQkJCQkJCQlcCkBAIC0yMDMsNyArMjA0LDcgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkiCS5zZXQJcHVzaAkJCVxuIgkJXAogCSIJLnNldAlub3Jlb3JkZXIJCVxuIgkJXAotCSIJLnNldAltaXBzMwkJCVxuIgkJXAorCSIJLnNldAlhcmNoPXI0MDAwCQlcbiIJCVwKIAkiMToJY2FjaGUJJTAsICglMSkJCVxuIgkJXAogCSIyOgkuc2V0CXBvcAkJCVxuIgkJXAogCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIglcbiIJCVwKQEAgLTIxMiw2ICsyMTMsMjAgQEAKIAk6CQkJCQkJCVwKIAk6ICJpIiAob3ApLCAiciIgKGFkZHIpKQogCisjZGVmaW5lIHByb3RlY3RlZF9jYWNoZWVfb3Aob3AsYWRkcikJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSIJLnNldAlwdXNoCQkJXG4iCQlcCisJIgkuc2V0CW5vcmVvcmRlcgkJXG4iCQlcCisJIgkuc2V0CW1pcHMwCQkJXG4iCQlcCisJIgkuc2V0CWV2YQkJCVxuIgkJXAorCSIxOgljYWNoZWUJJTAsICglMSkJCVxuIgkJXAorCSIyOgkuc2V0CXBvcAkJCVxuIgkJXAorCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIglcbiIJCVwKKwkiCSJTVFIoUFRSKSIgMWIsIDJiCQlcbiIJCVwKKwkiCS5wcmV2aW91cyIJCQkJCVwKKwk6CQkJCQkJCVwKKwk6ICJpIiAob3ApLCAiciIgKGFkZHIpKQorCiAvKgogICogVGhlIG5leHQgdHdvIGFyZSBmb3IgYmFkbGFuZCBhZGRyZXNzZXMgbGlrZSBzaWduYWwgdHJhbXBvbGluZXMuCiAgKi8KQEAgLTIyMyw3ICsyMzgsMTEgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19FVkEKKwkJcHJvdGVjdGVkX2NhY2hlZV9vcChIaXRfSW52YWxpZGF0ZV9JLCBhZGRyKTsKKyNlbHNlCiAJCXByb3RlY3RlZF9jYWNoZV9vcChIaXRfSW52YWxpZGF0ZV9JLCBhZGRyKTsKKyNlbmRpZgogCQlicmVhazsKIAl9CiB9CkBAIC0zNTYsNiArMzc1LDkxIEBACiAJCTogInIiIChiYXNlKSwJCQkJCQlcCiAJCSAgImkiIChvcCkpOwogCisvKgorICogUGVyZm9ybSB0aGUgY2FjaGUgb3BlcmF0aW9uIHNwZWNpZmllZCBieSBvcCB1c2luZyBhIHVzZXIgbW9kZSB2aXJ0dWFsCisgKiBhZGRyZXNzIHdoaWxlIGluIGtlcm5lbCBtb2RlLgorICovCisjZGVmaW5lIGNhY2hlMTZfdW5yb2xsMzJfdXNlcihiYXNlLG9wKQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiCS5zZXQgcHVzaAkJCQkJXG4iCVwKKwkiCS5zZXQgbm9yZW9yZGVyCQkJCQlcbiIJXAorCSIJLnNldCBtaXBzMAkJCQkJXG4iCVwKKwkiCS5zZXQgZXZhCQkJCQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDAwMCglMCk7IGNhY2hlZSAlMSwgMHgwMTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDIwKCUwKTsgY2FjaGVlICUxLCAweDAzMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwNDAoJTApOyBjYWNoZWUgJTEsIDB4MDUwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDA2MCglMCk7IGNhY2hlZSAlMSwgMHgwNzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDgwKCUwKTsgY2FjaGVlICUxLCAweDA5MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwYTAoJTApOyBjYWNoZWUgJTEsIDB4MGIwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDBjMCglMCk7IGNhY2hlZSAlMSwgMHgwZDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MGUwKCUwKTsgY2FjaGVlICUxLCAweDBmMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxMDAoJTApOyBjYWNoZWUgJTEsIDB4MTEwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDEyMCglMCk7IGNhY2hlZSAlMSwgMHgxMzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTQwKCUwKTsgY2FjaGVlICUxLCAweDE1MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxNjAoJTApOyBjYWNoZWUgJTEsIDB4MTcwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDE4MCglMCk7IGNhY2hlZSAlMSwgMHgxOTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MWEwKCUwKTsgY2FjaGVlICUxLCAweDFiMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxYzAoJTApOyBjYWNoZWUgJTEsIDB4MWQwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDFlMCglMCk7IGNhY2hlZSAlMSwgMHgxZjAoJTApCVxuIglcCisJIgkuc2V0IHBvcAkJCQkJXG4iCVwKKwkJOgkJCQkJCQlcCisJCTogInIiIChiYXNlKSwJCQkJCQlcCisJCSAgImkiIChvcCkpOworCisjZGVmaW5lIGNhY2hlMzJfdW5yb2xsMzJfdXNlcihiYXNlLCBvcCkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIgkuc2V0IHB1c2gJCQkJCVxuIglcCisJIgkuc2V0IG5vcmVvcmRlcgkJCQkJXG4iCVwKKwkiCS5zZXQgbWlwczAJCQkJCVxuIglcCisJIgkuc2V0IGV2YQkJCQkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwMDAoJTApOyBjYWNoZWUgJTEsIDB4MDIwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDA0MCglMCk7IGNhY2hlZSAlMSwgMHgwNjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDgwKCUwKTsgY2FjaGVlICUxLCAweDBhMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwYzAoJTApOyBjYWNoZWUgJTEsIDB4MGUwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDEwMCglMCk7IGNhY2hlZSAlMSwgMHgxMjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTQwKCUwKTsgY2FjaGVlICUxLCAweDE2MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxODAoJTApOyBjYWNoZWUgJTEsIDB4MWEwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDFjMCglMCk7IGNhY2hlZSAlMSwgMHgxZTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MjAwKCUwKTsgY2FjaGVlICUxLCAweDIyMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgyNDAoJTApOyBjYWNoZWUgJTEsIDB4MjYwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDI4MCglMCk7IGNhY2hlZSAlMSwgMHgyYTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MmMwKCUwKTsgY2FjaGVlICUxLCAweDJlMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgzMDAoJTApOyBjYWNoZWUgJTEsIDB4MzIwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDM0MCglMCk7IGNhY2hlZSAlMSwgMHgzNjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MzgwKCUwKTsgY2FjaGVlICUxLCAweDNhMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgzYzAoJTApOyBjYWNoZWUgJTEsIDB4M2UwKCUwKQlcbiIJXAorCSIJLnNldCBwb3AJCQkJCVxuIglcCisJCToJCQkJCQkJXAorCQk6ICJyIiAoYmFzZSksCQkJCQkJXAorCQkgICJpIiAob3ApKTsKKworI2RlZmluZSBjYWNoZTY0X3Vucm9sbDMyX3VzZXIoYmFzZSwgb3ApCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldCBwdXNoCQkJCQlcbiIJXAorCSIJLnNldCBub3Jlb3JkZXIJCQkJCVxuIglcCisJIgkuc2V0IG1pcHMwCQkJCQlcbiIJXAorCSIJLnNldCBldmEJCQkJCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDAwKCUwKTsgY2FjaGVlICUxLCAweDA0MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwODAoJTApOyBjYWNoZWUgJTEsIDB4MGMwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDEwMCglMCk7IGNhY2hlZSAlMSwgMHgxNDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTgwKCUwKTsgY2FjaGVlICUxLCAweDFjMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgyMDAoJTApOyBjYWNoZWUgJTEsIDB4MjQwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDI4MCglMCk7IGNhY2hlZSAlMSwgMHgyYzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MzAwKCUwKTsgY2FjaGVlICUxLCAweDM0MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgzODAoJTApOyBjYWNoZWUgJTEsIDB4M2MwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDQwMCglMCk7IGNhY2hlZSAlMSwgMHg0NDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4NDgwKCUwKTsgY2FjaGVlICUxLCAweDRjMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHg1MDAoJTApOyBjYWNoZWUgJTEsIDB4NTQwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDU4MCglMCk7IGNhY2hlZSAlMSwgMHg1YzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4NjAwKCUwKTsgY2FjaGVlICUxLCAweDY0MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHg2ODAoJTApOyBjYWNoZWUgJTEsIDB4NmMwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDcwMCglMCk7IGNhY2hlZSAlMSwgMHg3NDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4NzgwKCUwKTsgY2FjaGVlICUxLCAweDdjMCglMCkJXG4iCVwKKwkiCS5zZXQgcG9wCQkJCQlcbiIJXAorCQk6CQkJCQkJCVwKKwkJOiAiciIgKGJhc2UpLAkJCQkJCVwKKwkJICAiaSIgKG9wKSk7CisKIC8qIGJ1aWxkIGJsYXN0X3h4eCwgYmxhc3RfeHh4X3BhZ2UsIGJsYXN0X3h4eF9wYWdlX2luZGV4ZWQgKi8KICNkZWZpbmUgX19CVUlMRF9CTEFTVF9DQUNIRShwZngsIGRlc2MsIGluZGV4b3AsIGhpdG9wLCBsc2l6ZSwgZXh0cmEpCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHRyYSMjYmxhc3RfIyNwZngjI2NhY2hlIyNsc2l6ZSh2b2lkKQkJXApAQCAtNDI5LDYgKzUzMywzMiBAQAogX19CVUlMRF9CTEFTVF9DQUNIRShpbnZfcywgc2NhY2hlLCBJbmRleF9Xcml0ZWJhY2tfSW52X1NELCBIaXRfSW52YWxpZGF0ZV9TRCwgNjQsICkKIF9fQlVJTERfQkxBU1RfQ0FDSEUoaW52X3MsIHNjYWNoZSwgSW5kZXhfV3JpdGViYWNrX0ludl9TRCwgSGl0X0ludmFsaWRhdGVfU0QsIDEyOCwgKQogCisjZGVmaW5lIF9fQlVJTERfQkxBU1RfVVNFUl9DQUNIRShwZngsIGRlc2MsIGluZGV4b3AsIGhpdG9wLCBsc2l6ZSkgXAorc3RhdGljIGlubGluZSB2b2lkIGJsYXN0XyMjcGZ4IyNjYWNoZSMjbHNpemUjI191c2VyX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlKSBcCit7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBwYWdlOwkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZW5kID0gcGFnZSArIFBBR0VfU0laRTsJCQkJXAorCQkJCQkJCQkJXAorCV9fIyNwZngjI2ZsdXNoX3Byb2xvZ3VlCQkJCQkJXAorCQkJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2FjaGUjI2xzaXplIyNfdW5yb2xsMzJfdXNlcihzdGFydCwgaGl0b3ApOyAgICAgICAgICAgICBcCisJCXN0YXJ0ICs9IGxzaXplICogMzI7CQkJCQlcCisJfSB3aGlsZSAoc3RhcnQgPCBlbmQpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfXyMjcGZ4IyNmbHVzaF9lcGlsb2d1ZQkJCQkJCVwKK30KKworX19CVUlMRF9CTEFTVF9VU0VSX0NBQ0hFKGQsIGRjYWNoZSwgSW5kZXhfV3JpdGViYWNrX0ludl9ELCBIaXRfV3JpdGViYWNrX0ludl9ELAorCQkJIDE2KQorX19CVUlMRF9CTEFTVF9VU0VSX0NBQ0hFKGksIGljYWNoZSwgSW5kZXhfSW52YWxpZGF0ZV9JLCBIaXRfSW52YWxpZGF0ZV9JLCAxNikKK19fQlVJTERfQkxBU1RfVVNFUl9DQUNIRShkLCBkY2FjaGUsIEluZGV4X1dyaXRlYmFja19JbnZfRCwgSGl0X1dyaXRlYmFja19JbnZfRCwKKwkJCSAzMikKK19fQlVJTERfQkxBU1RfVVNFUl9DQUNIRShpLCBpY2FjaGUsIEluZGV4X0ludmFsaWRhdGVfSSwgSGl0X0ludmFsaWRhdGVfSSwgMzIpCitfX0JVSUxEX0JMQVNUX1VTRVJfQ0FDSEUoZCwgZGNhY2hlLCBJbmRleF9Xcml0ZWJhY2tfSW52X0QsIEhpdF9Xcml0ZWJhY2tfSW52X0QsCisJCQkgNjQpCitfX0JVSUxEX0JMQVNUX1VTRVJfQ0FDSEUoaSwgaWNhY2hlLCBJbmRleF9JbnZhbGlkYXRlX0ksIEhpdF9JbnZhbGlkYXRlX0ksIDY0KQorCiAvKiBidWlsZCBibGFzdF94eHhfcmFuZ2UsIHByb3RlY3RlZF9ibGFzdF94eHhfcmFuZ2UgKi8KICNkZWZpbmUgX19CVUlMRF9CTEFTVF9DQUNIRV9SQU5HRShwZngsIGRlc2MsIGhpdG9wLCBwcm90LCBleHRyYSkJXAogc3RhdGljIGlubGluZSB2b2lkIHByb3QjI2V4dHJhIyNibGFzdF8jI3BmeCMjY2FjaGUjI19yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCBcCkBAIC00NTAsMTIgKzU4MCw1MSBAQAogCV9fIyNwZngjI2ZsdXNoX2VwaWxvZ3VlCQkJCQkJXAogfQogCisjaWZuZGVmIENPTkZJR19FVkEKKwogX19CVUlMRF9CTEFTVF9DQUNIRV9SQU5HRShkLCBkY2FjaGUsIEhpdF9Xcml0ZWJhY2tfSW52X0QsIHByb3RlY3RlZF8sICkKLV9fQlVJTERfQkxBU1RfQ0FDSEVfUkFOR0Uocywgc2NhY2hlLCBIaXRfV3JpdGViYWNrX0ludl9TRCwgcHJvdGVjdGVkXywgKQogX19CVUlMRF9CTEFTVF9DQUNIRV9SQU5HRShpLCBpY2FjaGUsIEhpdF9JbnZhbGlkYXRlX0ksIHByb3RlY3RlZF8sICkKKworI2Vsc2UKKworI2RlZmluZSBfX0JVSUxEX1BST1RfQkxBU1RfQ0FDSEVfUkFOR0UocGZ4LCBkZXNjLCBoaXRvcCkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm90ZWN0ZWRfYmxhc3RfIyNwZngjI2NhY2hlIyNfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCxcCisJCQkJCQkJdW5zaWduZWQgbG9uZyBlbmQpIFwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsc2l6ZSA9IGNwdV8jI2Rlc2MjI19saW5lX3NpemUoKTsJCQlcCisJdW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnQgJiB+KGxzaXplIC0gMSk7CQkJXAorCXVuc2lnbmVkIGxvbmcgYWVuZCA9IChlbmQgLSAxKSAmIH4obHNpemUgLSAxKTsJCQlcCisJCQkJCQkJCQlcCisJX18jI3BmeCMjZmx1c2hfcHJvbG9ndWUJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIFVTRVJfRFMpKSB7CQkJCVwKKwkJd2hpbGUgKDEpIHsJCQkJCQlcCisJCQlwcm90ZWN0ZWRfY2FjaGVlX29wKGhpdG9wLCBhZGRyKTsJCVwKKwkJCWlmIChhZGRyID09IGFlbmQpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWFkZHIgKz0gbHNpemU7CQkJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJd2hpbGUgKDEpIHsJCQkJCQlcCisJCQlwcm90ZWN0ZWRfY2FjaGVfb3AoaGl0b3AsIGFkZHIpOwkJXAorCQkJaWYgKGFkZHIgPT0gYWVuZCkJCQkJXAorCQkJCWJyZWFrOwkJCQkJXAorCQkJYWRkciArPSBsc2l6ZTsJCQkJCVwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCV9fIyNwZngjI2ZsdXNoX2VwaWxvZ3VlCQkJCQkJXAorfQorCitfX0JVSUxEX1BST1RfQkxBU1RfQ0FDSEVfUkFOR0UoZCwgZGNhY2hlLCBIaXRfV3JpdGViYWNrX0ludl9EKQorX19CVUlMRF9QUk9UX0JMQVNUX0NBQ0hFX1JBTkdFKGksIGljYWNoZSwgSGl0X0ludmFsaWRhdGVfSSkKKworI2VuZGlmCitfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKHMsIHNjYWNoZSwgSGl0X1dyaXRlYmFja19JbnZfU0QsIHByb3RlY3RlZF8sICkKIF9fQlVJTERfQkxBU1RfQ0FDSEVfUkFOR0UoaSwgaWNhY2hlLCBIaXRfSW52YWxpZGF0ZV9JX0xvb25nc29uMiwgXAogCXByb3RlY3RlZF8sIGxvb25nc29uMl8pCiBfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKGQsIGRjYWNoZSwgSGl0X1dyaXRlYmFja19JbnZfRCwgLCApCitfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKGksIGljYWNoZSwgSGl0X0ludmFsaWRhdGVfSSwgLCApCiBfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKHMsIHNjYWNoZSwgSGl0X1dyaXRlYmFja19JbnZfU0QsICwgKQogLyogYmxhc3RfaW52X2RjYWNoZV9yYW5nZSAqLwogX19CVUlMRF9CTEFTVF9DQUNIRV9SQU5HRShpbnZfZCwgZGNhY2hlLCBIaXRfSW52YWxpZGF0ZV9ELCAsICkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmluZGV4IGVlZWIwZjQuLmY1NGJkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMzIsNiArMzIsOCBAQAogCV9fdTMyCQlzY19sbzI7CiAJX191MzIJCXNjX2hpMzsKIAlfX3UzMgkJc2NfbG8zOworCV9fdTY0CQlzY19tc2FyZWdzWzMyXTsJLyogTW9zdCBzaWduaWZpY2FudCA2NCBiaXRzICovCisJX191MzIJCXNjX21zYV9jc3I7CiB9OwogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJNjQgfHwgX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIgKi8KICNlbmRpZiAvKiBfQVNNX1NJR0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1jcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAtY3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwZDFhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAtY3BzLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogUGF1bCBCdXJ0b24gPHBhdWwuYnVydG9uQGltZ3RlYy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19NSVBTX0FTTV9TTVBfQ1BTX0hfXworI2RlZmluZSBfX01JUFNfQVNNX1NNUF9DUFNfSF9fCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCBib290X2NvbmZpZyB7CisJdW5zaWduZWQgaW50IGNvcmU7CisJdW5zaWduZWQgaW50IHZwZTsKKwl1bnNpZ25lZCBsb25nIHBjOworCXVuc2lnbmVkIGxvbmcgc3A7CisJdW5zaWduZWQgbG9uZyBncDsKK307CisKK2V4dGVybiBzdHJ1Y3QgYm9vdF9jb25maWcgbWlwc19jcHNfYm9vdGNmZzsKKworZXh0ZXJuIHZvaWQgbWlwc19jcHNfY29yZV9lbnRyeSh2b2lkKTsKKworI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCisKKy5leHRlcm4gbWlwc19jcHNfYm9vdGNmZzsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9fTUlQU19BU01fU01QX0NQU19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAtb3BzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLW9wcy5oCmluZGV4IGVmMmE4MDQuLjczZDM1YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAtb3BzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1vcHMuaApAQCAtMTMsNiArMTMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAorI2luY2x1ZGUgPGFzbS9taXBzLWNtLmg+CisKICNpZmRlZiBDT05GSUdfU01QCiAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CkBAIC00Myw2ICs0NSw5IEBACiAJbXBfb3BzLT5zbXBfc2V0dXAoKTsKIH0KIAorZXh0ZXJuIHZvaWQgZ2ljX3NlbmRfaXBpX3NpbmdsZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKTsKK2V4dGVybiB2b2lkIGdpY19zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKTsKKwogI2Vsc2UgLyogIUNPTkZJR19TTVAgKi8KIAogc3RydWN0IHBsYXRfc21wX29wczsKQEAgLTc2LDYgKzgxLDkgQEAKICNpZmRlZiBDT05GSUdfTUlQU19DTVAKIAlleHRlcm4gc3RydWN0IHBsYXRfc21wX29wcyBjbXBfc21wX29wczsKIAorCWlmICghbWlwc19jbV9wcmVzZW50KCkpCisJCXJldHVybiAtRU5PREVWOworCiAJcmVnaXN0ZXJfc21wX29wcygmY21wX3NtcF9vcHMpOwogCiAJcmV0dXJuIDA7CkBAIC05Nyw0ICsxMDUsMTMgQEAKICNlbmRpZgogfQogCisjaWZkZWYgQ09ORklHX01JUFNfQ1BTCitleHRlcm4gaW50IHJlZ2lzdGVyX2Nwc19zbXBfb3BzKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX2Nwc19zbXBfb3BzKHZvaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQVNNX1NNUF9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IGViNjAwODcuLmVmYTAyYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLmgKQEAgLTQyLDYgKzQyLDcgQEAKICNkZWZpbmUgU01QX0lDQUNIRV9GTFVTSAkweDQKIC8qIFVzZWQgYnkga2V4ZWMgY3Jhc2hkdW1wIHRvIHNhdmUgYWxsIGNwdSdzIHN0YXRlICovCiAjZGVmaW5lIFNNUF9EVU1QCQkweDgKKyNkZWZpbmUgU01QX0FTS19DMENPVU5UCQkweDEwCiAKIGV4dGVybiB2b2xhdGlsZSBjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja2ZyYW1lLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2tmcmFtZS5oCmluZGV4IDQ4NTdlMmMuLmQzMDFlMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja2ZyYW1lLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrZnJhbWUuaApAQCAtNDM1LDcgKzQzNSw3IEBACiAKIAkJLm1hY3JvCVJFU1RPUkVfU1BfQU5EX1JFVAogCQlMT05HX0wJc3AsIFBUX1IyOShzcCkKLQkJLnNldAltaXBzMworCQkuc2V0CWFyY2g9cjQwMDAKIAkJZXJldAogCQkuc2V0CW1pcHMwCiAJCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmgKaW5kZXggMjc4ZDQ1YS4uNDk1YzEwNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaApAQCAtMTYsMjIgKzE2LDI5IEBACiAjaW5jbHVkZSA8YXNtL3dhdGNoLmg+CiAjaW5jbHVkZSA8YXNtL2RzcC5oPgogI2luY2x1ZGUgPGFzbS9jb3AyLmg+CisjaW5jbHVkZSA8YXNtL21zYS5oPgogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKK2VudW0geworCUZQX1NBVkVfTk9ORQk9IDAsCisJRlBfU0FWRV9WRUNUT1IJPSAtMSwKKwlGUF9TQVZFX1NDQUxBUgk9IDEsCit9OworCiAvKioKICAqIHJlc3VtZSAtIHJlc3VtZSBleGVjdXRpb24gb2YgYSB0YXNrCiAgKiBAcHJldjoJVGhlIHRhc2sgcHJldmlvdXNseSBleGVjdXRlZC4KICAqIEBuZXh0OglUaGUgdGFzayB0byBiZWdpbiBleGVjdXRpbmcuCiAgKiBAbmV4dF90aToJdGFza190aHJlYWRfaW5mbyhuZXh0KS4KLSAqIEB1c2VkZnB1OglOb24temVybyBpZiBwcmV2J3MgRlAgY29udGV4dCBzaG91bGQgYmUgc2F2ZWQuCisgKiBAZnBfc2F2ZToJV2hpY2gsIGlmIGFueSwgRlAgY29udGV4dCB0byBzYXZlIGZvciBwcmV2LgogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGlsc3Qgc2NoZWR1bGluZyB0byBzYXZlIHRoZSBjb250ZXh0IG9mIHByZXYgJiBsb2FkCiAgKiB0aGUgY29udGV4dCBvZiBuZXh0LiBSZXR1cm5zIHByZXYuCiAgKi8KIGV4dGVybiBhc21saW5rYWdlIHN0cnVjdCB0YXNrX3N0cnVjdCAqcmVzdW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0LCBzdHJ1Y3QgdGhyZWFkX2luZm8gKm5leHRfdGksCi0JCXUzMiB1c2VkZnB1KTsKKwkJczMyIGZwX3NhdmUpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGxsX2JpdDsKIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxsX3Rhc2s7CkBAIC03NSw3ICs4Miw4IEBACiAKICNkZWZpbmUgc3dpdGNoX3RvKHByZXYsIG5leHQsIGxhc3QpCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCXUzMiBfX3VzZWRmcHUsIF9fYzBfc3RhdDsJCQkJCVwKKwl1MzIgX19jMF9zdGF0OwkJCQkJCQlcCisJczMyIF9fZnBzYXZlID0gRlBfU0FWRV9OT05FOwkJCQkJXAogCV9fbWlwc19tdF9mcGFmZl9zd2l0Y2hfdG8ocHJldik7CQkJCVwKIAlpZiAoY3B1X2hhc19kc3ApCQkJCQkJXAogCQlfX3NhdmVfZHNwKHByZXYpOwkJCQkJXApAQCAtODgsOCArOTYsMTIgQEAKIAkJd3JpdGVfYzBfc3RhdHVzKF9fYzBfc3RhdCAmIH5TVDBfQ1UyKTsJCQlcCiAJfQkJCQkJCQkJXAogCV9fY2xlYXJfc29mdHdhcmVfbGxfYml0KCk7CQkJCQlcCi0JX191c2VkZnB1ID0gdGVzdF9hbmRfY2xlYXJfdHNrX3RocmVhZF9mbGFnKHByZXYsIFRJRl9VU0VERlBVKTsJXAotCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0LCB0YXNrX3RocmVhZF9pbmZvKG5leHQpLCBfX3VzZWRmcHUpOyBcCisJaWYgKHRlc3RfYW5kX2NsZWFyX3Rza190aHJlYWRfZmxhZyhwcmV2LCBUSUZfVVNFREZQVSkpCQlcCisJCV9fZnBzYXZlID0gRlBfU0FWRV9TQ0FMQVI7CQkJCVwKKwlpZiAodGVzdF9hbmRfY2xlYXJfdHNrX3RocmVhZF9mbGFnKHByZXYsIFRJRl9VU0VETVNBKSkJCVwKKwkJX19mcHNhdmUgPSBGUF9TQVZFX1ZFQ1RPUjsJCQkJXAorCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0LCB0YXNrX3RocmVhZF9pbmZvKG5leHQpLCBfX2Zwc2F2ZSk7CVwKKwlkaXNhYmxlX21zYSgpOwkJCQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c2NhbGwuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKaW5kZXggMzNlOGRiZi4uNmM0ODhjOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c2NhbGwuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3lzY2FsbC5oCkBAIC0xMywxNyArMTMsMjkgQEAKICNpZm5kZWYgX19BU01fTUlQU19TWVNDQUxMX0gKICNkZWZpbmUgX19BU01fTUlQU19TWVNDQUxMX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaWZuZGVmIF9fTlJfc3lzY2FsbCAvKiBPbmx5IGRlZmluZWQgaWYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkkzMiAqLworI2RlZmluZSBfX05SX3N5c2NhbGwgNDAwMAorI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9ucihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlyZXR1cm4gcmVncy0+cmVnc1syXTsKKwkvKiBPMzIgQUJJIHN5c2NhbGwoKSAtIEVpdGhlciA2NC1iaXQgd2l0aCBPMzIgb3IgMzItYml0ICovCisJaWYgKChjb25maWdfZW5hYmxlZChDT05GSUdfMzJCSVQpIHx8CisJICAgIHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl8zMkJJVF9SRUdTKSkgJiYKKwkgICAgKHJlZ3MtPnJlZ3NbMl0gPT0gX19OUl9zeXNjYWxsKSkKKwkJcmV0dXJuIHJlZ3MtPnJlZ3NbNF07CisJZWxzZQorCQlyZXR1cm4gcmVncy0+cmVnc1syXTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1pcHNfZ2V0X3N5c2NhbGxfYXJnKHVuc2lnbmVkIGxvbmcgKmFyZywKQEAgLTM5LDE0ICs1MSwxNCBAQAogCiAjaWZkZWYgQ09ORklHXzMyQklUCiAJY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OgotCQlyZXR1cm4gZ2V0X3VzZXIoKmFyZywgKGludCAqKXVzcCArIDQgKiBuKTsKKwkJcmV0dXJuIGdldF91c2VyKCphcmcsIChpbnQgKil1c3AgKyBuKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OgogI2lmZGVmIENPTkZJR19NSVBTMzJfTzMyCiAJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9SRUdTKSkKLQkJCXJldHVybiBnZXRfdXNlcigqYXJnLCAoaW50ICopdXNwICsgNCAqIG4pOworCQkJcmV0dXJuIGdldF91c2VyKCphcmcsIChpbnQgKil1c3AgKyBuKTsKIAkJZWxzZQogI2VuZGlmCiAJCQkqYXJnID0gcmVncy0+cmVnc1s0ICsgbl07CkBAIC01Nyw2ICs2OSw4IEBACiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQorCisJdW5yZWFjaGFibGUoKTsKIH0KIAogc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X3JldHVybl92YWx1ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCkBAIC02NSw2ICs3OSwxMiBAQAogCXJldHVybiByZWdzLT5yZWdzWzJdOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9yb2xsYmFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIERvIG5vdGhpbmcgKi8KK30KKwogc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfc2V0X3JldHVybl92YWx1ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkJICAgIGludCBlcnJvciwgbG9uZyB2YWwpCkBAIC04MywxMSArMTAzLDE3IEBACiAJCQkJCSB1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IG4sCiAJCQkJCSB1bnNpZ25lZCBsb25nICphcmdzKQogewotCXVuc2lnbmVkIGxvbmcgYXJnOwogCWludCByZXQ7CisJLyogTzMyIEFCSSBzeXNjYWxsKCkgLSBFaXRoZXIgNjQtYml0IHdpdGggTzMyIG9yIDMyLWJpdCAqLworCWlmICgoY29uZmlnX2VuYWJsZWQoQ09ORklHXzMyQklUKSB8fAorCSAgICB0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfMzJCSVRfUkVHUykpICYmCisJICAgIChyZWdzLT5yZWdzWzJdID09IF9fTlJfc3lzY2FsbCkpIHsKKwkJaSsrOworCQluKys7CisJfQogCiAJd2hpbGUgKG4tLSkKLQkJcmV0IHw9IG1pcHNfZ2V0X3N5c2NhbGxfYXJnKCZhcmcsIHRhc2ssIHJlZ3MsIGkrKyk7CisJCXJldCB8PSBtaXBzX2dldF9zeXNjYWxsX2FyZyhhcmdzKyssIHRhc2ssIHJlZ3MsIGkrKyk7CiAKIAkvKgogCSAqIE5vIHdheSB0byBjb21tdW5pY2F0ZSBhbiBlcnJvciBiZWNhdXNlIHRoaXMgaXMgYSB2b2lkIGZ1bmN0aW9uLgpAQCAtMTAxLDExICsxMjcsMTMgQEAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHN5czMyX2NhbGxfdGFibGVbXTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHN5c24zMl9jYWxsX3RhYmxlW107CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fc3lzY2FsbF9nZXRfYXJjaCh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgc3lzY2FsbF9nZXRfYXJjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGFyY2ggPSBFTV9NSVBTOwogI2lmZGVmIENPTkZJR182NEJJVAotCWFyY2ggfD0gIF9fQVVESVRfQVJDSF82NEJJVDsKKwlpZiAoIXRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl8zMkJJVF9SRUdTKSkKKwkJYXJjaCB8PSBfX0FVRElUX0FSQ0hfNjRCSVQ7CiAjZW5kaWYKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAlhcmNoIHw9ICBfX0FVRElUX0FSQ0hfTEU7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDI0ODQ2ZjkuLmQyZDk2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMTYsNiArMTE2LDggQEAKICNkZWZpbmUgVElGX0xPQURfV0FUQ0gJCTI1CS8qIElmIHNldCwgbG9hZCB3YXRjaCByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0VQT0lOVAkyNgkvKiBzeXNjYWxsIHRyYWNlcG9pbnQgaW5zdHJ1bWVudGF0aW9uICovCiAjZGVmaW5lIFRJRl8zMkJJVF9GUFJFR1MJMjcJLyogMzItYml0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworI2RlZmluZSBUSUZfVVNFRE1TQQkJMjkJLyogTVNBIGhhcyBiZWVuIHVzZWQgdGhpcyBxdWFudHVtICovCisjZGVmaW5lIFRJRl9NU0FfQ1RYX0xJVkUJMzAJLyogTVNBIGNvbnRleHQgbXVzdCBiZSBwcmVzZXJ2ZWQgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJMzEJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtMTMzLDEwICsxMzUsMTMgQEAKICNkZWZpbmUgX1RJRl9GUFVCT1VORAkJKDE8PFRJRl9GUFVCT1VORCkKICNkZWZpbmUgX1RJRl9MT0FEX1dBVENICQkoMTw8VElGX0xPQURfV0FUQ0gpCiAjZGVmaW5lIF9USUZfMzJCSVRfRlBSRUdTCSgxPDxUSUZfMzJCSVRfRlBSRUdTKQorI2RlZmluZSBfVElGX1VTRURNU0EJCSgxPDxUSUZfVVNFRE1TQSkKKyNkZWZpbmUgX1RJRl9NU0FfQ1RYX0xJVkUJKDE8PFRJRl9NU0FfQ1RYX0xJVkUpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQogCiAjZGVmaW5lIF9USUZfV09SS19TWVNDQUxMX0VOVFJZCShfVElGX05PSFogfCBfVElGX1NZU0NBTExfVFJBQ0UgfAlcCi0JCQkJIF9USUZfU1lTQ0FMTF9BVURJVCB8IF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQorCQkJCSBfVElGX1NZU0NBTExfQVVESVQgfCBcCisJCQkJIF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UIHwgX1RJRl9TRUNDT01QKQogCiAvKiB3b3JrIHRvIGRvIGluIHN5c2NhbGxfdHJhY2VfbGVhdmUoKSAqLwogI2RlZmluZSBfVElGX1dPUktfU1lTQ0FMTF9FWElUCShfVElGX05PSFogfCBfVElGX1NZU0NBTExfVFJBQ0UgfAlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IDEyNjA5YTEuLjIwZWE0ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0xMCw4ICsxMCw0IEBACiAKICNpbmNsdWRlIDx0b3BvbG9neS5oPgogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzbXRfY2FwYWJsZSgpCShzbXBfbnVtX3NpYmxpbmdzID4gMSkKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU01fVE9QT0xPR1lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggZjNmYTM3NS4uYTEwOTUxMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAwMywgMDQgYnkgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA3ICBNYWNpZWogVy4gUm96eWNraQorICogQ29weXJpZ2h0IChDKSAyMDE0LCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaWZuZGVmIF9BU01fVUFDQ0VTU19ICiAjZGVmaW5lIF9BU01fVUFDQ0VTU19ICkBAIC0xMyw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hc20tZXZhLmg+CiAKIC8qCiAgKiBUaGUgZnMgdmFsdWUgZGV0ZXJtaW5lcyB3aGV0aGVyIGFyZ3VtZW50IHZhbGlkaXR5IGNoZWNraW5nIHNob3VsZCBiZQpAQCAtMjIyLDExICsyMjQsNDQgQEAKICAqIFl1Y2suICBXZSBuZWVkIHR3byB2YXJpYW50cywgb25lIGZvciA2NGJpdCBvcGVyYXRpb24gYW5kIG9uZQogICogZm9yIDMyIGJpdCBtb2RlIGFuZCBvbGQgaXJvbi4KICAqLworI2lmbmRlZiBDT05GSUdfRVZBCisjZGVmaW5lIF9fZ2V0X2tlcm5lbF9jb21tb24odmFsLCBzaXplLCBwdHIpIF9fZ2V0X3VzZXJfY29tbW9uKHZhbCwgc2l6ZSwgcHRyKQorI2Vsc2UKKy8qCisgKiBLZXJuZWwgc3BlY2lmaWMgZnVuY3Rpb25zIGZvciBFVkEuIFdlIG5lZWQgdG8gdXNlIG5vcm1hbCBsb2FkIGluc3RydWN0aW9ucworICogdG8gcmVhZCBkYXRhIGZyb20ga2VybmVsIHdoZW4gb3BlcmF0aW5nIGluIEVWQSBtb2RlLiBXZSB1c2UgdGhlc2UgbWFjcm9zIHRvCisgKiBhdm9pZCByZWRlZmluaW5nIF9fZ2V0X3VzZXJfYXNtIGZvciBFVkEuCisgKi8KKyN1bmRlZiBfbG9hZGQKKyN1bmRlZiBfbG9hZHcKKyN1bmRlZiBfbG9hZGgKKyN1bmRlZiBfbG9hZGIKICNpZmRlZiBDT05GSUdfMzJCSVQKLSNkZWZpbmUgX19HRVRfVVNFUl9EVyh2YWwsIHB0cikgX19nZXRfdXNlcl9hc21fbGwzMih2YWwsIHB0cikKKyNkZWZpbmUgX2xvYWRkCQkJX2xvYWR3CisjZWxzZQorI2RlZmluZSBfbG9hZGQocmVnLCBhZGRyKQkibGQgIiByZWcgIiwgIiBhZGRyCisjZW5kaWYKKyNkZWZpbmUgX2xvYWR3KHJlZywgYWRkcikJImx3ICIgcmVnICIsICIgYWRkcgorI2RlZmluZSBfbG9hZGgocmVnLCBhZGRyKQkibGggIiByZWcgIiwgIiBhZGRyCisjZGVmaW5lIF9sb2FkYihyZWcsIGFkZHIpCSJsYiAiIHJlZyAiLCAiIGFkZHIKKworI2RlZmluZSBfX2dldF9rZXJuZWxfY29tbW9uKHZhbCwgc2l6ZSwgcHRyKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCisJY2FzZSAxOiBfX2dldF9kYXRhX2FzbSh2YWwsIF9sb2FkYiwgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSAyOiBfX2dldF9kYXRhX2FzbSh2YWwsIF9sb2FkaCwgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSA0OiBfX2dldF9kYXRhX2FzbSh2YWwsIF9sb2FkdywgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSA4OiBfX0dFVF9EVyh2YWwsIF9sb2FkZCwgcHRyKTsgYnJlYWs7CQkJXAorCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR18zMkJJVAorI2RlZmluZSBfX0dFVF9EVyh2YWwsIGluc24sIHB0cikgX19nZXRfZGF0YV9hc21fbGwzMih2YWwsIGluc24sIHB0cikKICNlbmRpZgogI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBfX0dFVF9VU0VSX0RXKHZhbCwgcHRyKSBfX2dldF91c2VyX2FzbSh2YWwsICJsZCIsIHB0cikKKyNkZWZpbmUgX19HRVRfRFcodmFsLCBpbnNuLCBwdHIpIF9fZ2V0X2RhdGFfYXNtKHZhbCwgaW5zbiwgcHRyKQogI2VuZGlmCiAKIGV4dGVybiB2b2lkIF9fZ2V0X3VzZXJfdW5rbm93bih2b2lkKTsKQEAgLTIzNCwxMCArMjY5LDEwIEBACiAjZGVmaW5lIF9fZ2V0X3VzZXJfY29tbW9uKHZhbCwgc2l6ZSwgcHRyKQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCi0JY2FzZSAxOiBfX2dldF91c2VyX2FzbSh2YWwsICJsYiIsIHB0cik7IGJyZWFrOwkJCVwKLQljYXNlIDI6IF9fZ2V0X3VzZXJfYXNtKHZhbCwgImxoIiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgNDogX19nZXRfdXNlcl9hc20odmFsLCAibHciLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSA4OiBfX0dFVF9VU0VSX0RXKHZhbCwgcHRyKTsgYnJlYWs7CQkJCVwKKwljYXNlIDE6IF9fZ2V0X2RhdGFfYXNtKHZhbCwgdXNlcl9sYiwgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSAyOiBfX2dldF9kYXRhX2FzbSh2YWwsIHVzZXJfbGgsIHB0cik7IGJyZWFrOwkJXAorCWNhc2UgNDogX19nZXRfZGF0YV9hc20odmFsLCB1c2VyX2x3LCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDg6IF9fR0VUX0RXKHZhbCwgdXNlcl9sZCwgcHRyKTsgYnJlYWs7CQkJXAogCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC0yNDYsOCArMjgxLDEyIEBACiAoewkJCQkJCQkJCVwKIAlpbnQgX19ndV9lcnI7CQkJCQkJCVwKIAkJCQkJCQkJCVwKLQlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJCVwKLQlfX2dldF91c2VyX2NvbW1vbigoeCksIHNpemUsIHB0cik7CQkJCVwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CQkJCVwKKwkJX19nZXRfa2VybmVsX2NvbW1vbigoeCksIHNpemUsIHB0cik7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCVwKKwkJX19nZXRfdXNlcl9jb21tb24oKHgpLCBzaXplLCBwdHIpOwkJCVwKKwl9CQkJCQkJCQlcCiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCiAKQEAgLTI1NywxOCArMjk2LDIyIEBACiAJY29uc3QgX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqIF9fZ3VfcHRyID0gKHB0cik7CQlcCiAJCQkJCQkJCQlcCiAJbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAotCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCAgX19ndV9wdHIsIHNpemUpKSkJCVwKLQkJX19nZXRfdXNlcl9jb21tb24oKHgpLCBzaXplLCBfX2d1X3B0cik7CQkJXAorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCAgX19ndV9wdHIsIHNpemUpKSkgewkJXAorCQlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKQkJCVwKKwkJCV9fZ2V0X2tlcm5lbF9jb21tb24oKHgpLCBzaXplLCBfX2d1X3B0cik7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlfX2dldF91c2VyX2NvbW1vbigoeCksIHNpemUsIF9fZ3VfcHRyKTsJCVwKKwl9CQkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgX19nZXRfdXNlcl9hc20odmFsLCBpbnNuLCBhZGRyKQkJCQkJXAorI2RlZmluZSBfX2dldF9kYXRhX2FzbSh2YWwsIGluc24sIGFkZHIpCQkJCQlcCiB7CQkJCQkJCQkJXAogCWxvbmcgX19ndV90bXA7CQkJCQkJCVwKIAkJCQkJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CSIgaW5zbiAiCSUxLCAlMwkJCQlcbiIJXAorCSIxOgkiaW5zbigiJTEiLCAiJTMiKSIJCQkJXG4iCVwKIAkiMjoJCQkJCQkJXG4iCVwKIAkiCS5pbnNuCQkJCQkJXG4iCVwKIAkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCIJCQkJXG4iCVwKQEAgLTI4Nyw3ICszMzAsNyBAQAogLyoKICAqIEdldCBhIGxvbmcgbG9uZyA2NCB1c2luZyAzMiBiaXQgcmVnaXN0ZXJzLgogICovCi0jZGVmaW5lIF9fZ2V0X3VzZXJfYXNtX2xsMzIodmFsLCBhZGRyKQkJCQkJXAorI2RlZmluZSBfX2dldF9kYXRhX2FzbV9sbDMyKHZhbCwgaW5zbiwgYWRkcikJCQkJXAogewkJCQkJCQkJCVwKIAl1bmlvbiB7CQkJCQkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgbG9uZwlsOwkJCQlcCkBAIC0yOTUsOCArMzM4LDggQEAKIAl9IF9fZ3VfdG1wOwkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIxOglsdwklMSwgKCUzKQkJCQlcbiIJXAotCSIyOglsdwklRDEsIDQoJTMpCQkJCVxuIglcCisJIjE6CSIgaW5zbigiJTEiLCAiKCUzKSIpIgkJCQlcbiIJXAorCSIyOgkiIGluc24oIiVEMSIsICI0KCUzKSIpIgkJCQlcbiIJXAogCSIzOgkJCQkJCQlcbiIJXAogCSIJLmluc24JCQkJCQlcbiIJXAogCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIgkJCVxuIglcCkBAIC0zMTUsMzAgKzM1OCw3MyBAQAogCSh2YWwpID0gX19ndV90bXAudDsJCQkJCQlcCiB9CiAKKyNpZm5kZWYgQ09ORklHX0VWQQorI2RlZmluZSBfX3B1dF9rZXJuZWxfY29tbW9uKHB0ciwgc2l6ZSkgX19wdXRfdXNlcl9jb21tb24ocHRyLCBzaXplKQorI2Vsc2UKKy8qCisgKiBLZXJuZWwgc3BlY2lmaWMgZnVuY3Rpb25zIGZvciBFVkEuIFdlIG5lZWQgdG8gdXNlIG5vcm1hbCBsb2FkIGluc3RydWN0aW9ucworICogdG8gcmVhZCBkYXRhIGZyb20ga2VybmVsIHdoZW4gb3BlcmF0aW5nIGluIEVWQSBtb2RlLiBXZSB1c2UgdGhlc2UgbWFjcm9zIHRvCisgKiBhdm9pZCByZWRlZmluaW5nIF9fZ2V0X2RhdGFfYXNtIGZvciBFVkEuCisgKi8KKyN1bmRlZiBfc3RvcmVkCisjdW5kZWYgX3N0b3JldworI3VuZGVmIF9zdG9yZWgKKyN1bmRlZiBfc3RvcmViCisjaWZkZWYgQ09ORklHXzMyQklUCisjZGVmaW5lIF9zdG9yZWQJCQlfc3RvcmV3CisjZWxzZQorI2RlZmluZSBfc3RvcmVkKHJlZywgYWRkcikJImxkICIgcmVnICIsICIgYWRkcgorI2VuZGlmCisKKyNkZWZpbmUgX3N0b3JldyhyZWcsIGFkZHIpCSJzdyAiIHJlZyAiLCAiIGFkZHIKKyNkZWZpbmUgX3N0b3JlaChyZWcsIGFkZHIpCSJzaCAiIHJlZyAiLCAiIGFkZHIKKyNkZWZpbmUgX3N0b3JlYihyZWcsIGFkZHIpCSJzYiAiIHJlZyAiLCAiIGFkZHIKKworI2RlZmluZSBfX3B1dF9rZXJuZWxfY29tbW9uKHB0ciwgc2l6ZSkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIDE6IF9fcHV0X2RhdGFfYXNtKF9zdG9yZWIsIHB0cik7IGJyZWFrOwkJCVwKKwljYXNlIDI6IF9fcHV0X2RhdGFfYXNtKF9zdG9yZWgsIHB0cik7IGJyZWFrOwkJCVwKKwljYXNlIDQ6IF9fcHV0X2RhdGFfYXNtKF9zdG9yZXcsIHB0cik7IGJyZWFrOwkJCVwKKwljYXNlIDg6IF9fUFVUX0RXKF9zdG9yZWQsIHB0cik7IGJyZWFrOwkJCQlcCisJZGVmYXVsdDogX19wdXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSgwKQorI2VuZGlmCisKIC8qCiAgKiBZdWNrLiAgV2UgbmVlZCB0d28gdmFyaWFudHMsIG9uZSBmb3IgNjRiaXQgb3BlcmF0aW9uIGFuZCBvbmUKICAqIGZvciAzMiBiaXQgbW9kZSBhbmQgb2xkIGlyb24uCiAgKi8KICNpZmRlZiBDT05GSUdfMzJCSVQKLSNkZWZpbmUgX19QVVRfVVNFUl9EVyhwdHIpIF9fcHV0X3VzZXJfYXNtX2xsMzIocHRyKQorI2RlZmluZSBfX1BVVF9EVyhpbnNuLCBwdHIpIF9fcHV0X2RhdGFfYXNtX2xsMzIoaW5zbiwgcHRyKQogI2VuZGlmCiAjaWZkZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIF9fUFVUX1VTRVJfRFcocHRyKSBfX3B1dF91c2VyX2FzbSgic2QiLCBwdHIpCisjZGVmaW5lIF9fUFVUX0RXKGluc24sIHB0cikgX19wdXRfZGF0YV9hc20oaW5zbiwgcHRyKQogI2VuZGlmCiAKKyNkZWZpbmUgX19wdXRfdXNlcl9jb21tb24ocHRyLCBzaXplKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAorCWNhc2UgMTogX19wdXRfZGF0YV9hc20odXNlcl9zYiwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgMjogX19wdXRfZGF0YV9hc20odXNlcl9zaCwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgNDogX19wdXRfZGF0YV9hc20odXNlcl9zdywgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgODogX19QVVRfRFcodXNlcl9zZCwgcHRyKTsgYnJlYWs7CQkJCVwKKwlkZWZhdWx0OiBfX3B1dF91c2VyX3Vua25vd24oKTsgYnJlYWs7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIF9fcHV0X3VzZXJfbm9jaGVjayh4LCBwdHIsIHNpemUpCQkJCVwKICh7CQkJCQkJCQkJXAogCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbDsJCQkJCVwKIAlpbnQgX19wdV9lcnIgPSAwOwkJCQkJCVwKIAkJCQkJCQkJCVwKLQlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJCVwKIAlfX3B1X3ZhbCA9ICh4KTsJCQkJCQkJXAotCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCi0JY2FzZSAxOiBfX3B1dF91c2VyX2FzbSgic2IiLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSAyOiBfX3B1dF91c2VyX2FzbSgic2giLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSA0OiBfX3B1dF91c2VyX2FzbSgic3ciLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSA4OiBfX1BVVF9VU0VSX0RXKHB0cik7IGJyZWFrOwkJCQlcCi0JZGVmYXVsdDogX19wdXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgewkJCQlcCisJCV9fcHV0X2tlcm5lbF9jb21tb24ocHRyLCBzaXplKTsJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCVwKKwkJX19wdXRfdXNlcl9jb21tb24ocHRyLCBzaXplKTsJCQkJXAogCX0JCQkJCQkJCVwKIAlfX3B1X2VycjsJCQkJCQkJXAogfSkKQEAgLTM1MSwyMSArNDM3LDE5IEBACiAJCQkJCQkJCQlcCiAJbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAogCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgIF9fcHVfYWRkciwgc2l6ZSkpKSB7CVwKLQkJc3dpdGNoIChzaXplKSB7CQkJCQkJXAotCQljYXNlIDE6IF9fcHV0X3VzZXJfYXNtKCJzYiIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAotCQljYXNlIDI6IF9fcHV0X3VzZXJfYXNtKCJzaCIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAotCQljYXNlIDQ6IF9fcHV0X3VzZXJfYXNtKCJzdyIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAotCQljYXNlIDg6IF9fUFVUX1VTRVJfRFcoX19wdV9hZGRyKTsgYnJlYWs7CQlcCi0JCWRlZmF1bHQ6IF9fcHV0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQlcCi0JCX0JCQkJCQkJXAorCQlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKQkJCVwKKwkJCV9fcHV0X2tlcm5lbF9jb21tb24oX19wdV9hZGRyLCBzaXplKTsJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlfX3B1dF91c2VyX2NvbW1vbihfX3B1X2FkZHIsIHNpemUpOwkJXAogCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKIAlfX3B1X2VycjsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX3B1dF91c2VyX2FzbShpbnNuLCBwdHIpCQkJCQlcCisjZGVmaW5lIF9fcHV0X2RhdGFfYXNtKGluc24sIHB0cikJCQkJCVwKIHsJCQkJCQkJCQlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIxOgkiIGluc24gIgklejIsICUzCQkjIF9fcHV0X3VzZXJfYXNtXG4iCVwKKwkiMToJImluc24oIiV6MiIsICIlMyIpIgkjIF9fcHV0X2RhdGFfYXNtCVxuIglcCiAJIjI6CQkJCQkJCVxuIglcCiAJIgkuaW5zbgkJCQkJCVxuIglcCiAJIgkuc2VjdGlvbgkuZml4dXAsXCJheFwiCQkJXG4iCVwKQEAgLTM4MCwxMSArNDY0LDExIEBACiAJICAiaSIgKC1FRkFVTFQpKTsJCQkJCQlcCiB9CiAKLSNkZWZpbmUgX19wdXRfdXNlcl9hc21fbGwzMihwdHIpCQkJCQlcCisjZGVmaW5lIF9fcHV0X2RhdGFfYXNtX2xsMzIoaW5zbiwgcHRyKQkJCQkJXAogewkJCQkJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CXN3CSUyLCAoJTMpCSMgX19wdXRfdXNlcl9hc21fbGwzMglcbiIJXAotCSIyOglzdwklRDIsIDQoJTMpCQkJCVxuIglcCisJIjE6CSJpbnNuKCIlMiIsICIoJTMpIikiCSMgX19wdXRfZGF0YV9hc21fbGwzMglcbiIJXAorCSIyOgkiaW5zbigiJUQyIiwgIjQoJTMpIikiCQkJCVxuIglcCiAJIjM6CQkJCQkJCVxuIglcCiAJIgkuaW5zbgkJCQkJCVxuIglcCiAJIgkuc2VjdGlvbgkuZml4dXAsXCJheFwiCQkJXG4iCVwKQEAgLTQwMyw2ICs0ODcsMTEgQEAKIGV4dGVybiB2b2lkIF9fcHV0X3VzZXJfdW5rbm93bih2b2lkKTsKIAogLyoKKyAqIHVse2IsaCx3fSBhcmUgbWFjcm9zIGFuZCB0aGVyZSBhcmUgbm8gZXF1aXZhbGVudCBtYWNyb3MgZm9yIEVWQS4KKyAqIEVWQSB1bmFsaWduZWQgYWNjZXNzIGlzIGhhbmRsZWQgaW4gdGhlIEFERSBleGNlcHRpb24gaGFuZGxlci4KKyAqLworI2lmbmRlZiBDT05GSUdfRVZBCisvKgogICogcHV0X3VzZXJfdW5hbGlnbmVkOiAtIFdyaXRlIGEgc2ltcGxlIHZhbHVlIGludG8gdXNlciBzcGFjZS4KICAqIEB4OgkgVmFsdWUgdG8gY29weSB0byB1c2VyIHNwYWNlLgogICogQHB0cjogRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KQEAgLTUwNCw3ICs1OTMsNyBAQAogI2RlZmluZSBfX2dldF91c2VyX3VuYWxpZ25lZF9jb21tb24odmFsLCBzaXplLCBwdHIpCQkJXAogZG8gewkJCQkJCQkJCVwKIAlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMTogX19nZXRfdXNlcl9hc20odmFsLCAibGIiLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSAxOiBfX2dldF9kYXRhX2FzbSh2YWwsICJsYiIsIHB0cik7IGJyZWFrOwkJCVwKIAljYXNlIDI6IF9fZ2V0X3VzZXJfdW5hbGlnbmVkX2FzbSh2YWwsICJ1bGgiLCBwdHIpOyBicmVhazsJXAogCWNhc2UgNDogX19nZXRfdXNlcl91bmFsaWduZWRfYXNtKHZhbCwgInVsdyIsIHB0cik7IGJyZWFrOwlcCiAJY2FzZSA4OiBfX0dFVF9VU0VSX1VOQUxJR05FRF9EVyh2YWwsIHB0cik7IGJyZWFrOwkJXApAQCAtNTMxLDcgKzYyMCw3IEBACiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgX19nZXRfdXNlcl91bmFsaWduZWRfYXNtKHZhbCwgaW5zbiwgYWRkcikJCQlcCisjZGVmaW5lIF9fZ2V0X2RhdGFfdW5hbGlnbmVkX2FzbSh2YWwsIGluc24sIGFkZHIpCQkJXAogewkJCQkJCQkJCVwKIAlsb25nIF9fZ3VfdG1wOwkJCQkJCQlcCiAJCQkJCQkJCQlcCkBAIC01OTQsMTkgKzY4MywyMyBAQAogI2RlZmluZSBfX1BVVF9VU0VSX1VOQUxJR05FRF9EVyhwdHIpIF9fcHV0X3VzZXJfdW5hbGlnbmVkX2FzbSgidXNkIiwgcHRyKQogI2VuZGlmCiAKKyNkZWZpbmUgX19wdXRfdXNlcl91bmFsaWduZWRfY29tbW9uKHB0ciwgc2l6ZSkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAorCWNhc2UgMTogX19wdXRfZGF0YV9hc20oInNiIiwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgMjogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c2giLCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDQ6IF9fcHV0X3VzZXJfdW5hbGlnbmVkX2FzbSgidXN3IiwgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSA4OiBfX1BVVF9VU0VSX1VOQUxJR05FRF9EVyhwdHIpOyBicmVhazsJCQlcCisJZGVmYXVsdDogX19wdXRfdXNlcl91bmFsaWduZWRfdW5rbm93bigpOyBicmVhazsJCQlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkX25vY2hlY2soeCxwdHIsc2l6ZSkJCQlcCiAoewkJCQkJCQkJCVwKIAlfX3R5cGVvZl9fKCoocHRyKSkgX19wdV92YWw7CQkJCQlcCiAJaW50IF9fcHVfZXJyID0gMDsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJX19wdV92YWwgPSAoeCk7CQkJCQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMTogX19wdXRfdXNlcl9hc20oInNiIiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgMjogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c2giLCBwdHIpOyBicmVhazsJCVwKLQljYXNlIDQ6IF9fcHV0X3VzZXJfdW5hbGlnbmVkX2FzbSgidXN3IiwgcHRyKTsgYnJlYWs7CQlcCi0JY2FzZSA4OiBfX1BVVF9VU0VSX1VOQUxJR05FRF9EVyhwdHIpOyBicmVhazsJCQlcCi0JZGVmYXVsdDogX19wdXRfdXNlcl91bmFsaWduZWRfdW5rbm93bigpOyBicmVhazsJCQlcCi0JfQkJCQkJCQkJXAorCV9fcHV0X3VzZXJfdW5hbGlnbmVkX2NvbW1vbihwdHIsIHNpemUpOwkJCQlcCiAJX19wdV9lcnI7CQkJCQkJCVwKIH0pCiAKQEAgLTYxNiwxNSArNzA5LDkgQEAKIAlfX3R5cGVvZl9fKCoocHRyKSkgX19wdV92YWwgPSAoeCk7CQkJCVwKIAlpbnQgX19wdV9lcnIgPSAtRUZBVUxUOwkJCQkJCVwKIAkJCQkJCQkJCVwKLQlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICBfX3B1X2FkZHIsIHNpemUpKSkgewlcCi0JCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKLQkJY2FzZSAxOiBfX3B1dF91c2VyX2FzbSgic2IiLCBfX3B1X2FkZHIpOyBicmVhazsJCVwKLQkJY2FzZSAyOiBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oInVzaCIsIF9fcHVfYWRkcik7IGJyZWFrOyBcCi0JCWNhc2UgNDogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c3ciLCBfX3B1X2FkZHIpOyBicmVhazsgXAotCQljYXNlIDg6IF9fUFVUX1VTRVJfVU5BTEdJTkVEX0RXKF9fcHVfYWRkcik7IGJyZWFrOwlcCi0JCWRlZmF1bHQ6IF9fcHV0X3VzZXJfdW5hbGlnbmVkX3Vua25vd24oKTsgYnJlYWs7CQlcCi0JCX0JCQkJCQkJXAotCX0JCQkJCQkJCVwKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICBfX3B1X2FkZHIsIHNpemUpKSkJCVwKKwkJX19wdXRfdXNlcl91bmFsaWduZWRfY29tbW9uKF9fcHVfYWRkciwgc2l6ZSk7CQlcCisJCQkJCQkJCQlcCiAJX19wdV9lcnI7CQkJCQkJCVwKIH0pCiAKQEAgLTY2OSw2ICs3NTYsNyBAQAogfQogCiBleHRlcm4gdm9pZCBfX3B1dF91c2VyX3VuYWxpZ25lZF91bmtub3duKHZvaWQpOworI2VuZGlmCiAKIC8qCiAgKiBXZSdyZSBnZW5lcmF0aW5nIGp1bXAgdG8gc3Vicm91dGluZXMgd2hpY2ggd2lsbCBiZSBvdXRzaWRlIHRoZSByYW5nZSBvZgpAQCAtNjkzLDYgKzc4MSw3IEBACiAKIGV4dGVybiBzaXplX3QgX19jb3B5X3VzZXIodm9pZCAqX190bywgY29uc3Qgdm9pZCAqX19mcm9tLCBzaXplX3QgX19uKTsKIAorI2lmbmRlZiBDT05GSUdfRVZBCiAjZGVmaW5lIF9faW52b2tlX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJCQkJXAogKHsJCQkJCQkJCQlcCiAJcmVnaXN0ZXIgdm9pZCBfX3VzZXIgKl9fY3VfdG9fciBfX2FzbV9fKCIkNCIpOwkJCVwKQEAgLTcxMSw2ICs4MDAsMTEgQEAKIAlfX2N1X2xlbl9yOwkJCQkJCQlcCiB9KQogCisjZGVmaW5lIF9faW52b2tlX2NvcHlfdG9fa2VybmVsKHRvLCBmcm9tLCBuKQkJCQlcCisJX19pbnZva2VfY29weV90b191c2VyKHRvLCBmcm9tLCBuKQorCisjZW5kaWYKKwogLyoKICAqIF9fY29weV90b191c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGludG8gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgogICogQHRvOgkgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCkBAIC03MzUsNyArODI5LDEyIEBACiAJX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKIAlfX2N1X2xlbiA9IChuKTsJCQkJCQkJXAogCW1pZ2h0X2ZhdWx0KCk7CQkJCQkJCVwKLQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sIF9fY3VfbGVuKTsgXAorCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCQkJCVwKKwkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX2tlcm5lbChfX2N1X3RvLCBfX2N1X2Zyb20sCVwKKwkJCQkJCSAgIF9fY3VfbGVuKTsJCVwKKwllbHNlCQkJCQkJCQlcCisJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV90b191c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkJCQkJIF9fY3VfbGVuKTsJCVwKIAlfX2N1X2xlbjsJCQkJCQkJXAogfSkKIApAQCAtNzUwLDcgKzg0OSwxMiBAQAogCV9fY3VfdG8gPSAodG8pOwkJCQkJCQlcCiAJX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKIAlfX2N1X2xlbiA9IChuKTsJCQkJCQkJXAotCV9fY3VfbGVuID0gX19pbnZva2VfY29weV90b191c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwgX19jdV9sZW4pOyBcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkJCQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fa2VybmVsKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkJCQkJICAgX19jdV9sZW4pOwkJXAorCWVsc2UJCQkJCQkJCVwKKwkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCisJCQkJCQkgX19jdV9sZW4pOwkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCiB9KQogCkBAIC03NjMsOCArODY3LDE0IEBACiAJX19jdV90byA9ICh0byk7CQkJCQkJCVwKIAlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAogCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhfX2N1X3RvLCBfX2N1X2Zyb20sIFwKLQkJCQkJCSAgICBfX2N1X2xlbik7CQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkJCQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV9rZXJuZWxfaW5hdG9taWMoX19jdV90bywJXAorCQkJCQkJCSAgICAgIF9fY3VfZnJvbSxcCisJCQkJCQkJICAgICAgX19jdV9sZW4pO1wKKwllbHNlCQkJCQkJCQlcCisJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXJfaW5hdG9taWMoX19jdV90bywJXAorCQkJCQkJCSAgICBfX2N1X2Zyb20sCVwKKwkJCQkJCQkgICAgX19jdV9sZW4pOwlcCiAJX19jdV9sZW47CQkJCQkJCVwKIH0pCiAKQEAgLTc5MCwxNCArOTAwLDIzIEBACiAJX19jdV90byA9ICh0byk7CQkJCQkJCVwKIAlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAogCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIF9fY3VfdG8sIF9fY3VfbGVuKSkgewkJXAotCQltaWdodF9mYXVsdCgpOwkJCQkJCVwKLQkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCi0JCQkJCQkgX19jdV9sZW4pOwkJXAorCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsJCQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fa2VybmVsKF9fY3VfdG8sCQlcCisJCQkJCQkgICBfX2N1X2Zyb20sCQlcCisJCQkJCQkgICBfX2N1X2xlbik7CQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgX19jdV90bywgX19jdV9sZW4pKSB7ICAgICAgIFwKKwkJCW1pZ2h0X2ZhdWx0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV90b191c2VyKF9fY3VfdG8sCVwKKwkJCQkJCQkgX19jdV9mcm9tLAlcCisJCQkJCQkJIF9fY3VfbGVuKTsgICAgIFwKKwkJfQkJCQkJCQlcCiAJfQkJCQkJCQkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCiB9KQogCisjaWZuZGVmIENPTkZJR19FVkEKKwogI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQkJXAogKHsJCQkJCQkJCQlcCiAJcmVnaXN0ZXIgdm9pZCAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJCVwKQEAgLTgyMSw2ICs5NDAsMTcgQEAKIAlfX2N1X2xlbl9yOwkJCQkJCQlcCiB9KQogCisjZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV9rZXJuZWwodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKKworLyogRm9yIHVzZXJsYW5kIDwtPiB1c2VybGFuZCBvcGVyYXRpb25zICovCisjZGVmaW5lIF9fX2ludm9rZV9jb3B5X2luX3VzZXIodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKKworLyogRm9yIGtlcm5lbCA8LT4ga2VybmVsIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgX19faW52b2tlX2NvcHlfaW5fa2VybmVsKHRvLCBmcm9tLCBuKQkJCQlcCisJX19pbnZva2VfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCisKICNkZWZpbmUgX19pbnZva2VfY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCQkJXAogKHsJCQkJCQkJCQlcCiAJcmVnaXN0ZXIgdm9pZCAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJCVwKQEAgLTg0NCw2ICs5NzQsOTcgQEAKIAlfX2N1X2xlbl9yOwkJCQkJCQlcCiB9KQogCisjZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV9rZXJuZWxfaW5hdG9taWModG8sIGZyb20sIG4pCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkJCVwKKworI2Vsc2UKKworLyogRVZBIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworCitleHRlcm4gc2l6ZV90IF9fY29weV91c2VyX2luYXRvbWljX2V2YSh2b2lkICpfX3RvLCBjb25zdCB2b2lkICpfX2Zyb20sCisJCQkJICAgICAgIHNpemVfdCBfX24pOworZXh0ZXJuIHNpemVfdCBfX2NvcHlfZnJvbV91c2VyX2V2YSh2b2lkICpfX3RvLCBjb25zdCB2b2lkICpfX2Zyb20sCisJCQkJICAgc2l6ZV90IF9fbik7CitleHRlcm4gc2l6ZV90IF9fY29weV90b191c2VyX2V2YSh2b2lkICpfX3RvLCBjb25zdCB2b2lkICpfX2Zyb20sCisJCQkJIHNpemVfdCBfX24pOworZXh0ZXJuIHNpemVfdCBfX2NvcHlfaW5fdXNlcl9ldmEodm9pZCAqX190bywgY29uc3Qgdm9pZCAqX19mcm9tLCBzaXplX3QgX19uKTsKKworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgZnVuY19wdHIpCVwKKyh7CQkJCQkJCQkJXAorCXJlZ2lzdGVyIHZvaWQgKl9fY3VfdG9fciBfX2FzbV9fKCIkNCIpOwkJCQlcCisJcmVnaXN0ZXIgY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbV9yIF9fYXNtX18oIiQ1Iik7CQlcCisJcmVnaXN0ZXIgbG9uZyBfX2N1X2xlbl9yIF9fYXNtX18oIiQ2Iik7CQkJCVwKKwkJCQkJCQkJCVwKKwlfX2N1X3RvX3IgPSAodG8pOwkJCQkJCVwKKwlfX2N1X2Zyb21fciA9IChmcm9tKTsJCQkJCQlcCisJX19jdV9sZW5fciA9IChuKTsJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIuc2V0XHRub3Jlb3JkZXJcblx0IgkJCQkJCVwKKwlfX01PRFVMRV9KQUwoZnVuY19wdHIpCQkJCQkJXAorCSIuc2V0XHRub2F0XG5cdCIJCQkJCQlcCisJX19VQV9BRERVICJcdCQxLCAlMSwgJTJcblx0IgkJCQkJXAorCSIuc2V0XHRhdFxuXHQiCQkJCQkJCVwKKwkiLnNldFx0cmVvcmRlciIJCQkJCQkJXAorCTogIityIiAoX19jdV90b19yKSwgIityIiAoX19jdV9mcm9tX3IpLCAiK3IiIChfX2N1X2xlbl9yKQlcCisJOgkJCQkJCQkJXAorCTogIiQ4IiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxNCIsICIkMTUiLCAiJDI0IiwgIiQzMSIsCVwKKwkgIERBRERJX1NDUkFUQ0gsICJtZW1vcnkiKTsJCQkJCVwKKwlfX2N1X2xlbl9yOwkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9faW52b2tlX2NvcHlfdG9fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgZnVuY19wdHIpCVwKKyh7CQkJCQkJCQkJXAorCXJlZ2lzdGVyIHZvaWQgKl9fY3VfdG9fciBfX2FzbV9fKCIkNCIpOwkJCQlcCisJcmVnaXN0ZXIgY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbV9yIF9fYXNtX18oIiQ1Iik7CQlcCisJcmVnaXN0ZXIgbG9uZyBfX2N1X2xlbl9yIF9fYXNtX18oIiQ2Iik7CQkJCVwKKwkJCQkJCQkJCVwKKwlfX2N1X3RvX3IgPSAodG8pOwkJCQkJCVwKKwlfX2N1X2Zyb21fciA9IChmcm9tKTsJCQkJCQlcCisJX19jdV9sZW5fciA9IChuKTsJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCV9fTU9EVUxFX0pBTChmdW5jX3B0cikJCQkJCQlcCisJOiAiK3IiIChfX2N1X3RvX3IpLCAiK3IiIChfX2N1X2Zyb21fciksICIrciIgKF9fY3VfbGVuX3IpCVwKKwk6CQkJCQkJCQlcCisJOiAiJDgiLCAiJDkiLCAiJDEwIiwgIiQxMSIsICIkMTIiLCAiJDE0IiwgIiQxNSIsICIkMjQiLCAiJDMxIiwJXAorCSAgREFERElfU0NSQVRDSCwgIm1lbW9yeSIpOwkJCQkJXAorCV9fY3VfbGVuX3I7CQkJCQkJCVwKK30pCisKKy8qCisgKiBTb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBpbiB1c2VybGFuZC4gV2UgbmVlZCB0byBnbyB0aHJvdWdoCisgKiB0aGUgVExCCisgKi8KKyNkZWZpbmUgX19pbnZva2VfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgX19jb3B5X2Zyb21fdXNlcl9ldmEpCisKKyNkZWZpbmUgX19pbnZva2VfY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLAkJXAorCQkJCQkgICAgX19jb3B5X3VzZXJfaW5hdG9taWNfZXZhKQorCisjZGVmaW5lIF9faW52b2tlX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfdG9fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgX19jb3B5X3RvX3VzZXJfZXZhKQorCisjZGVmaW5lIF9fX2ludm9rZV9jb3B5X2luX3VzZXIodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgX19jb3B5X2luX3VzZXJfZXZhKQorCisvKgorICogU291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgaW4gdGhlIGtlcm5lbC4gV2UgYXJlIG5vdCBnb2luZyB0aHJvdWdoCisgKiB0aGUgVExCCisgKi8KKyNkZWZpbmUgX19pbnZva2VfY29weV9mcm9tX2tlcm5lbCh0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBfX2NvcHlfdXNlcikKKworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fa2VybmVsX2luYXRvbWljKHRvLCBmcm9tLCBuKQkJCVwKKwlfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgX19jb3B5X3VzZXJfaW5hdG9taWMpCisKKyNkZWZpbmUgX19pbnZva2VfY29weV90b19rZXJuZWwodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X3RvX3VzZXJfZXZhX2dlbmVyaWModG8sIGZyb20sIG4sIF9fY29weV91c2VyKQorCisjZGVmaW5lIF9fX2ludm9rZV9jb3B5X2luX2tlcm5lbCh0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBfX2NvcHlfdXNlcikKKworI2VuZGlmIC8qIENPTkZJR19FVkEgKi8KKwogLyoKICAqIF9fY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCiAgKiBAdG86CSAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgpAQCAtOTAxLDEwICsxMTIyLDE3IEBACiAJX19jdV90byA9ICh0byk7CQkJCQkJCVwKIAlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAogCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19jdV9mcm9tLCBfX2N1X2xlbikpIHsJCVwKLQkJbWlnaHRfZmF1bHQoKTsJCQkJCQlcCi0JCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCi0JCQkJCQkgICBfX2N1X2xlbik7CQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgewkJCQlcCisJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX2tlcm5lbChfX2N1X3RvLAkJXAorCQkJCQkJICAgICBfX2N1X2Zyb20sCQlcCisJCQkJCQkgICAgIF9fY3VfbGVuKTsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9fY3VfZnJvbSwgX19jdV9sZW4pKSB7CVwKKwkJCW1pZ2h0X2ZhdWx0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywJXAorCQkJCQkJCSAgIF9fY3VfZnJvbSwJXAorCQkJCQkJCSAgIF9fY3VfbGVuKTsgICBcCisJCX0JCQkJCQkJXAogCX0JCQkJCQkJCVwKIAlfX2N1X2xlbjsJCQkJCQkJXAogfSkKQEAgLTkxOCw5ICsxMTQ2LDE0IEBACiAJX19jdV90byA9ICh0byk7CQkJCQkJCVwKIAlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAogCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAotCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAkJXAotCQkJCQkgICBfX2N1X2xlbik7CQkJXAorCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsJCQkJXAorCQlfX2N1X2xlbiA9IF9fX2ludm9rZV9jb3B5X2luX2tlcm5lbChfX2N1X3RvLCBfX2N1X2Zyb20sCVwKKwkJCQkJCSAgICBfX2N1X2xlbik7CQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQltaWdodF9mYXVsdCgpOwkJCQkJCVwKKwkJX19jdV9sZW4gPSBfX19pbnZva2VfY29weV9pbl91c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkJCQkJICBfX2N1X2xlbik7CQlcCisJfQkJCQkJCQkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCiB9KQogCkBAIC05MzMsMTEgKzExNjYsMTcgQEAKIAlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAogCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCiAJX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19jdV9mcm9tLCBfX2N1X2xlbikgJiYJXAotCQkgICBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBfX2N1X3RvLCBfX2N1X2xlbikpKSB7CVwKLQkJbWlnaHRfZmF1bHQoKTsJCQkJCQlcCi0JCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCi0JCQkJCQkgICBfX2N1X2xlbik7CQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgewkJCQlcCisJCV9fY3VfbGVuID0gX19faW52b2tlX2NvcHlfaW5fa2VybmVsKF9fY3VfdG8sX19jdV9mcm9tLAlcCisJCQkJCQkgICAgX19jdV9sZW4pOwkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9fY3VfZnJvbSwgX19jdV9sZW4pICYmXAorCQkJICAgYWNjZXNzX29rKFZFUklGWV9XUklURSwgX19jdV90bywgX19jdV9sZW4pKSkge1wKKwkJCW1pZ2h0X2ZhdWx0KCk7CQkJCQlcCisJCQlfX2N1X2xlbiA9IF9fX2ludm9rZV9jb3B5X2luX3VzZXIoX19jdV90bywJXAorCQkJCQkJCSAgX19jdV9mcm9tLAlcCisJCQkJCQkJICBfX2N1X2xlbik7CVwKKwkJfQkJCQkJCQlcCiAJfQkJCQkJCQkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCiB9KQpAQCAtMTAwNywxNiArMTI0NiwyOCBAQAogewogCWxvbmcgcmVzOwogCi0JbWlnaHRfZmF1bHQoKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIm1vdmVcdCQ0LCAlMVxuXHQiCi0JCSJtb3ZlXHQkNSwgJTJcblx0IgotCQkibW92ZVx0JDYsICUzXG5cdCIKLQkJX19NT0RVTEVfSkFMKF9fc3RybmNweV9mcm9tX3VzZXJfbm9jaGVja19hc20pCi0JCSJtb3ZlXHQlMCwgJDIiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAoX190byksICJyIiAoX19mcm9tKSwgInIiIChfX2xlbikKLQkJOiAiJDIiLCAiJDMiLCAiJDQiLCAiJDUiLCAiJDYiLCBfX1VBX3QwLCAiJDMxIiwgIm1lbW9yeSIpOworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQkJIm1vdmVcdCQ2LCAlM1xuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fa2VybmVsX25vY2hlY2tfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKF9fdG8pLCAiciIgKF9fZnJvbSksICJyIiAoX19sZW4pCisJCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJbWlnaHRfZmF1bHQoKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQkJIm1vdmVcdCQ2LCAlM1xuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fdXNlcl9ub2NoZWNrX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChfX3RvKSwgInIiIChfX2Zyb20pLCAiciIgKF9fbGVuKQorCQkJOiAiJDIiLCAiJDMiLCAiJDQiLCAiJDUiLCAiJDYiLCBfX1VBX3QwLCAiJDMxIiwgIm1lbW9yeSIpOworCX0KIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDQ0LDE2ICsxMjk1LDI4IEBACiB7CiAJbG9uZyByZXM7CiAKLQltaWdodF9mYXVsdCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJIm1vdmVcdCQ1LCAlMlxuXHQiCi0JCSJtb3ZlXHQkNiwgJTNcblx0IgotCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fdXNlcl9hc20pCi0JCSJtb3ZlXHQlMCwgJDIiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAoX190byksICJyIiAoX19mcm9tKSwgInIiIChfX2xlbikKLQkJOiAiJDIiLCAiJDMiLCAiJDQiLCAiJDUiLCAiJDYiLCBfX1VBX3QwLCAiJDMxIiwgIm1lbW9yeSIpOworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQkJIm1vdmVcdCQ2LCAlM1xuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fa2VybmVsX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChfX3RvKSwgInIiIChfX2Zyb20pLCAiciIgKF9fbGVuKQorCQkJOiAiJDIiLCAiJDMiLCAiJDQiLCAiJDUiLCAiJDYiLCBfX1VBX3QwLCAiJDMxIiwgIm1lbW9yeSIpOworCX0gZWxzZSB7CisJCW1pZ2h0X2ZhdWx0KCk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQkibW92ZVx0JDUsICUyXG5cdCIKKwkJCSJtb3ZlXHQkNiwgJTNcblx0IgorCQkJX19NT0RVTEVfSkFMKF9fc3RybmNweV9mcm9tX3VzZXJfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKF9fdG8pLCAiciIgKF9fZnJvbSksICJyIiAoX19sZW4pCisJCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7CisJfQogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEwNjMsMTQgKzEzMjYsMjQgQEAKIHsKIAlsb25nIHJlczsKIAotCW1pZ2h0X2ZhdWx0KCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQlfX01PRFVMRV9KQUwoX19zdHJsZW5fdXNlcl9ub2NoZWNrX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChzKQotCQk6ICIkMiIsICIkNCIsIF9fVUFfdDAsICIkMzEiKTsKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJsZW5fa2VybmVsX25vY2hlY2tfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKHMpCisJCQk6ICIkMiIsICIkNCIsIF9fVUFfdDAsICIkMzEiKTsKKwl9IGVsc2UgeworCQltaWdodF9mYXVsdCgpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJX19NT0RVTEVfSkFMKF9fc3RybGVuX3VzZXJfbm9jaGVja19hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocykKKwkJCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOworCX0KIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDkzLDE0ICsxMzY2LDI0IEBACiB7CiAJbG9uZyByZXM7CiAKLQltaWdodF9mYXVsdCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJX19NT0RVTEVfSkFMKF9fc3RybGVuX3VzZXJfYXNtKQotCQkibW92ZVx0JTAsICQyIgotCQk6ICI9ciIgKHJlcykKLQkJOiAiciIgKHMpCi0JCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cmxlbl9rZXJuZWxfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKHMpCisJCQk6ICIkMiIsICIkNCIsIF9fVUFfdDAsICIkMzEiKTsKKwl9IGVsc2UgeworCQltaWdodF9mYXVsdCgpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJX19NT0RVTEVfSkFMKF9fc3RybGVuX2tlcm5lbF9hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocykKKwkJCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOworCX0KIAogCXJldHVybiByZXM7CiB9CkBAIC0xMTEwLDE1ICsxMzkzLDI2IEBACiB7CiAJbG9uZyByZXM7CiAKLQltaWdodF9mYXVsdCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJIm1vdmVcdCQ1LCAlMlxuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChzKSwgInIiIChuKQotCQk6ICIkMiIsICIkNCIsICIkNSIsIF9fVUFfdDAsICIkMzEiKTsKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQkibW92ZVx0JDUsICUyXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fa2VybmVsX25vY2hlY2tfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKHMpLCAiciIgKG4pCisJCQk6ICIkMiIsICIkNCIsICIkNSIsIF9fVUFfdDAsICIkMzEiKTsKKwl9IGVsc2UgeworCQltaWdodF9mYXVsdCgpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJIm1vdmVcdCQ1LCAlMlxuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJubGVuX3VzZXJfbm9jaGVja19hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocyksICJyIiAobikKKwkJCTogIiQyIiwgIiQ0IiwgIiQ1IiwgX19VQV90MCwgIiQzMSIpOworCX0KIAogCXJldHVybiByZXM7CiB9CkBAIC0xMTQyLDE0ICsxNDM2LDI1IEBACiAJbG9uZyByZXM7CiAKIAltaWdodF9mYXVsdCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJIm1vdmVcdCQ1LCAlMlxuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fdXNlcl9hc20pCi0JCSJtb3ZlXHQlMCwgJDIiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAocyksICJyIiAobikKLQkJOiAiJDIiLCAiJDQiLCAiJDUiLCBfX1VBX3QwLCAiJDMxIik7CisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJIm1vdmVcdCQ1LCAlMlxuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJubGVuX2tlcm5lbF9hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocyksICJyIiAobikKKwkJCTogIiQyIiwgIiQ0IiwgIiQ1IiwgX19VQV90MCwgIiQzMSIpOworCX0gZWxzZSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQkibW92ZVx0JDUsICUyXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fdXNlcl9hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocyksICJyIiAobikKKwkJCTogIiQyIiwgIiQ0IiwgIiQ1IiwgX19VQV90MCwgIiQzMSIpOworCX0KIAogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggNGQzYjkyOC4uNDEzZDZjNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMjQsNyArMjQsNiBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0jZGVmaW5lIF9fQVJDSF9PTUlUX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVEhPU1ROQU1FCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9pbnN0LmggYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9pbnN0LmgKaW5kZXggYjM5YmEyNS4uZGY2ZTc3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vaW5zdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2luc3QuaApAQCAtOCw2ICs4LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NiwgMjAwMCBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMjAwNiBieSBUaGllbW8gU2V1ZmVyCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqLwogI2lmbmRlZiBfVUFQSV9BU01fSU5TVF9ICiAjZGVmaW5lIF9VQVBJX0FTTV9JTlNUX0gKQEAgLTczLDEwICs3NCwxNiBAQAogZW51bSBzcGVjM19vcCB7CiAJZXh0X29wLCBkZXh0bV9vcCwgZGV4dHVfb3AsIGRleHRfb3AsCiAJaW5zX29wLCBkaW5zbV9vcCwgZGluc3Vfb3AsIGRpbnNfb3AsCi0JbHhfb3AgPSAweDBhLAotCWJzaGZsX29wID0gMHgyMCwKLQlkYnNoZmxfb3AgPSAweDI0LAotCXJkaHdyX29wID0gMHgzYgorCWx4X29wICAgICA9IDB4MGEsIGx3bGVfb3AgICA9IDB4MTksCisJbHdyZV9vcCAgID0gMHgxYSwgY2FjaGVlX29wID0gMHgxYiwKKwlzYmVfb3AgICAgPSAweDFjLCBzaGVfb3AgICAgPSAweDFkLAorCXNjZV9vcCAgICA9IDB4MWUsIHN3ZV9vcCAgICA9IDB4MWYsCisJYnNoZmxfb3AgID0gMHgyMCwgc3dsZV9vcCAgID0gMHgyMSwKKwlzd3JlX29wICAgPSAweDIyLCBwcmVmZV9vcCAgPSAweDIzLAorCWRic2hmbF9vcCA9IDB4MjQsIGxidWVfb3AgICA9IDB4MjgsCisJbGh1ZV9vcCAgID0gMHgyOSwgbGJlX29wICAgID0gMHgyYywKKwlsaGVfb3AgICAgPSAweDJkLCBsbGVfb3AgICAgPSAweDJlLAorCWx3ZV9vcCAgICA9IDB4MmYsIHJkaHdyX29wICA9IDB4M2IKIH07CiAKIC8qCkBAIC0xNjMsOCArMTcwLDggQEAKICAqLwogZW51bSBjb3AxeF9mdW5jIHsKIAlsd3hjMV9vcCAgICAgPQkweDAwLCBsZHhjMV9vcAkgICA9ICAweDAxLAotCXBmZXRjaF9vcCAgICA9CTB4MDcsIHN3eGMxX29wCSAgID0gIDB4MDgsCi0Jc2R4YzFfb3AgICAgID0JMHgwOSwgbWFkZF9zX29wCSAgID0gIDB4MjAsCisJc3d4YzFfb3AgICAgID0gIDB4MDgsIHNkeGMxX29wCSAgID0gIDB4MDksCisJcGZldGNoX29wICAgID0JMHgwZiwgbWFkZF9zX29wCSAgID0gIDB4MjAsCiAJbWFkZF9kX29wICAgID0JMHgyMSwgbWFkZF9lX29wCSAgID0gIDB4MjIsCiAJbXN1Yl9zX29wICAgID0JMHgyOCwgbXN1Yl9kX29wCSAgID0gIDB4MjksCiAJbXN1Yl9lX29wICAgID0JMHgyYSwgbm1hZGRfc19vcCAgID0gIDB4MzAsCkBAIC01OTIsNiArNTk5LDE1IEBACiAJOykpKSkpKSkKIH07CiAKK3N0cnVjdCBzcGVjM19mb3JtYXQgeyAgIC8qIFNQRUMzICovCisJQklURklFTERfRklFTEQodW5zaWduZWQgaW50IG9wY29kZTo2LAorCUJJVEZJRUxEX0ZJRUxEKHVuc2lnbmVkIGludCByczo1LAorCUJJVEZJRUxEX0ZJRUxEKHVuc2lnbmVkIGludCBydDo1LAorCUJJVEZJRUxEX0ZJRUxEKHNpZ25lZCBpbnQgc2ltbWVkaWF0ZTo5LAorCUJJVEZJRUxEX0ZJRUxEKHVuc2lnbmVkIGludCBmdW5jOjcsCisJOykpKSkpCit9OworCiAvKgogICogbWljcm9NSVBTIGluc3RydWN0aW9uIGZvcm1hdHMgKDMyLWJpdCBsZW5ndGgpCiAgKgpAQCAtODYzLDYgKzg3OSw3IEBACiAJc3RydWN0IGJfZm9ybWF0IGJfZm9ybWF0OwogCXN0cnVjdCBwc19mb3JtYXQgcHNfZm9ybWF0OwogCXN0cnVjdCB2X2Zvcm1hdCB2X2Zvcm1hdDsKKwlzdHJ1Y3Qgc3BlYzNfZm9ybWF0IHNwZWMzX2Zvcm1hdDsKIAlzdHJ1Y3QgZmJfZm9ybWF0IGZiX2Zvcm1hdDsKIAlzdHJ1Y3QgZnAwX2Zvcm1hdCBmcDBfZm9ybWF0OwogCXN0cnVjdCBtbV9mcDBfZm9ybWF0IG1tX2ZwMF9mb3JtYXQ7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zaWdjb250ZXh0LmggYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zaWdjb250ZXh0LmgKaW5kZXggNmM5OTA2Zi4uNjgxYzE3NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NpZ2NvbnRleHQuaApAQCAtMTIsNiArMTIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZ2lkZWZzLmg+CiAKKy8qIEJpdHMgd2hpY2ggbWF5IGJlIHNldCBpbiBzY191c2VkX21hdGggKi8KKyNkZWZpbmUgVVNFRE1BVEhfRlAJKDEgPDwgMCkKKyNkZWZpbmUgVVNFRE1BVEhfTVNBCSgxIDw8IDEpCisKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyCiAKIC8qCkBAIC0zNyw2ICs0MSw4IEBACiAJdW5zaWduZWQgbG9uZwkJc2NfbG8yOwogCXVuc2lnbmVkIGxvbmcJCXNjX2hpMzsKIAl1bnNpZ25lZCBsb25nCQlzY19sbzM7CisJdW5zaWduZWQgbG9uZyBsb25nCXNjX21zYXJlZ3NbMzJdOwkvKiBNb3N0IHNpZ25pZmljYW50IDY0IGJpdHMgKi8KKwl1bnNpZ25lZCBsb25nCQlzY19tc2FfY3NyOwogfTsKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJMzIgKi8KQEAgLTcwLDYgKzc2LDggQEAKIAlfX3UzMglzY191c2VkX21hdGg7CiAJX191MzIJc2NfZHNwOwogCV9fdTMyCXNjX3Jlc2VydmVkOworCV9fdTY0CXNjX21zYXJlZ3NbMzJdOworCV9fdTMyCXNjX21zYV9jc3I7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCmluZGV4IDI2YzYxNzUuLjI3N2RhYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQpAQCAtNTMsNiArNTMsOCBAQAogb2JqLSQoQ09ORklHX01JUFNfTVRfU01UQykJKz0gc210Yy5vIHNtdGMtYXNtLm8gc210Yy1wcm9jLm8KIG9iai0kKENPTkZJR19NSVBTX01UX1NNUCkJKz0gc21wLW10Lm8KIG9iai0kKENPTkZJR19NSVBTX0NNUCkJCSs9IHNtcC1jbXAubworb2JqLSQoQ09ORklHX01JUFNfQ1BTKQkJKz0gc21wLWNwcy5vIGNwcy12ZWMubworb2JqLSQoQ09ORklHX01JUFNfR0lDX0lQSSkJKz0gc21wLWdpYy5vCiBvYmotJChDT05GSUdfQ1BVX01JUFNSMikJKz0gc3ByYW0ubwogCiBvYmotJChDT05GSUdfTUlQU19WUEVfTE9BREVSKQkrPSB2cGUubwpAQCAtMTAyLDYgKzEwNCw5IEBACiAKIG9iai0kKENPTkZJR19KVU1QX0xBQkVMKQkrPSBqdW1wX2xhYmVsLm8KIAorb2JqLSQoQ09ORklHX01JUFNfQ00pCQkrPSBtaXBzLWNtLm8KK29iai0kKENPTkZJR19NSVBTX0NQQykJCSs9IG1pcHMtY3BjLm8KKwogIwogIyBEU1AgQVNFIHN1cHBvcnRlZCBmb3IgTUlQUzMyIG9yIE1JUFM2NCBSZWxlYXNlIDIgY29yZXMgb25seS4gSXQgaXMgbm90CiAjIHNhZmUgdG8gdW5jb25kaXRpb25uYWx5IHVzZSB0aGUgYXNzZW1ibGVyIC1tZHNwIC8gLW1kc3ByMiBzd2l0Y2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDBjMmU4NTMuLjBlYTc1YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc21wLWNwcy5oPgogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KIApAQCAtMTY4LDYgKzE2OSw3MiBAQAogCU9GRlNFVChUSFJFQURfRlBSMzAsIHRhc2tfc3RydWN0LCB0aHJlYWQuZnB1LmZwclszMF0pOwogCU9GRlNFVChUSFJFQURfRlBSMzEsIHRhc2tfc3RydWN0LCB0aHJlYWQuZnB1LmZwclszMV0pOwogCisJLyogdGhlIGxlYXN0IHNpZ25pZmljYW50IDY0IGJpdHMgb2YgZWFjaCBGUCByZWdpc3RlciAqLworCU9GRlNFVChUSFJFQURfRlBSMF9MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbMF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjFfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzFdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7CisJT0ZGU0VUKFRIUkVBRF9GUFIyX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSM19MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbM10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjRfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzRdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7CisJT0ZGU0VUKFRIUkVBRF9GUFI1X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwcls1XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSNl9MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbNl0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjdfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzddLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7CisJT0ZGU0VUKFRIUkVBRF9GUFI4X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwcls4XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSOV9MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbOV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjEwX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxMF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjExX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxMV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjEyX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxMl0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjEzX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxM10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjE0X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxNF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjE1X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxNV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjE2X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxNl0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjE3X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxN10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjE4X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxOF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjE5X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsxOV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjIwX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyMF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjIxX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyMV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjIyX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyMl0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjIzX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyM10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjI0X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyNF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjI1X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyNV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjI2X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyNl0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjI3X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyN10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjI4X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyOF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjI5X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclsyOV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjMwX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclszMF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjMxX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclszMV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwogCU9GRlNFVChUSFJFQURfRkNSMzEsIHRhc2tfc3RydWN0LCB0aHJlYWQuZnB1LmZjcjMxKTsKIAlCTEFOSygpOwogfQpAQCAtMjI4LDYgKzI5NSw3IEBACiAJT0ZGU0VUKFNDX0xPMiwgc2lnY29udGV4dCwgc2NfbG8yKTsKIAlPRkZTRVQoU0NfSEkzLCBzaWdjb250ZXh0LCBzY19oaTMpOwogCU9GRlNFVChTQ19MTzMsIHNpZ2NvbnRleHQsIHNjX2xvMyk7CisJT0ZGU0VUKFNDX01TQVJFR1MsIHNpZ2NvbnRleHQsIHNjX21zYXJlZ3MpOwogCUJMQU5LKCk7CiB9CiAjZW5kaWYKQEAgLTI0Miw2ICszMTAsNyBAQAogCU9GRlNFVChTQ19NRExPLCBzaWdjb250ZXh0LCBzY19tZGxvKTsKIAlPRkZTRVQoU0NfUEMsIHNpZ2NvbnRleHQsIHNjX3BjKTsKIAlPRkZTRVQoU0NfRlBDX0NTUiwgc2lnY29udGV4dCwgc2NfZnBjX2Nzcik7CisJT0ZGU0VUKFNDX01TQVJFR1MsIHNpZ2NvbnRleHQsIHNjX21zYXJlZ3MpOwogCUJMQU5LKCk7CiB9CiAjZW5kaWYKQEAgLTI1Myw2ICszMjIsNyBAQAogCU9GRlNFVChTQzMyX0ZQUkVHUywgc2lnY29udGV4dDMyLCBzY19mcHJlZ3MpOwogCU9GRlNFVChTQzMyX0ZQQ19DU1IsIHNpZ2NvbnRleHQzMiwgc2NfZnBjX2Nzcik7CiAJT0ZGU0VUKFNDMzJfRlBDX0VJUiwgc2lnY29udGV4dDMyLCBzY19mcGNfZWlyKTsKKwlPRkZTRVQoU0MzMl9NU0FSRUdTLCBzaWdjb250ZXh0MzIsIHNjX21zYXJlZ3MpOwogCUJMQU5LKCk7CiB9CiAjZW5kaWYKQEAgLTM5NywzICs0NjcsMTUgQEAKIAlPRkZTRVQoQ09QMF9TVEFUVVMsIG1pcHNfY29wcm9jLCByZWdbTUlQU19DUDBfU1RBVFVTXVswXSk7CiAJQkxBTksoKTsKIH0KKworI2lmZGVmIENPTkZJR19NSVBTX0NQUwordm9pZCBvdXRwdXRfY3BzX2RlZmluZXModm9pZCkKK3sKKwlDT01NRU5UKCIgTUlQUyBDUFMgb2Zmc2V0cy4gIik7CisJT0ZGU0VUKEJPT1RDRkdfQ09SRSwgYm9vdF9jb25maWcsIGNvcmUpOworCU9GRlNFVChCT09UQ0ZHX1ZQRSwgYm9vdF9jb25maWcsIHZwZSk7CisJT0ZGU0VUKEJPT1RDRkdfUEMsIGJvb3RfY29uZmlnLCBwYyk7CisJT0ZGU0VUKEJPT1RDRkdfU1AsIGJvb3RfY29uZmlnLCBzcCk7CisJT0ZGU0VUKEJPT1RDRkdfR1AsIGJvb3RfY29uZmlnLCBncCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYm1pcHNfdmVjLlMgYi9hcmNoL21pcHMva2VybmVsL2JtaXBzX3ZlYy5TCmluZGV4IGE1YmY3M2QuLjI5MGMyM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYm1pcHNfdmVjLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ibWlwc192ZWMuUwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJanIJazAKIAogCVJFU1RPUkVfQUxMCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCWVyZXQKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2Nwcy12ZWMuUyBiL2FyY2gvbWlwcy9rZXJuZWwvY3BzLXZlYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTQ2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL2Nwcy12ZWMuUwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogUGF1bCBCdXJ0b24gPHBhdWwuYnVydG9uQGltZ3RlYy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZW9wcy5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorCisjZGVmaW5lIEdDUl9DTF9DT0hFUkVOQ0VfT0ZTIDB4MjAwOAorCisuc2VjdGlvbiAudGV4dC5jcHMtdmVjCisuYmFsaWduIDB4MTAwMAorLnNldCBub3Jlb3JkZXIKKworTEVBRihtaXBzX2Nwc19jb3JlX2VudHJ5KQorCS8qCisJICogVGhlc2UgZmlyc3QgOCBieXRlcyB3aWxsIGJlIHBhdGNoZWQgYnkgY3BzX3NtcF9zZXR1cCB0byBsb2FkIHRoZQorCSAqIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ00gR0NScyBpbnRvIHJlZ2lzdGVyIHYxLgorCSAqLworCS5xdWFkCTAKKworCS8qIENoZWNrIHdoZXRoZXIgd2UncmUgaGVyZSBkdWUgdG8gYW4gTk1JICovCisJbWZjMAlrMCwgQ1AwX1NUQVRVUworCWFuZAlrMCwgazAsIFNUMF9OTUkKKwliZXF6CWswLCBub3Rfbm1pCisJIG5vcAorCisJLyogVGhpcyBpcyBhbiBOTUkgKi8KKwlsYQlrMCwgbm1pX2hhbmRsZXIKKwlqcglrMAorCSBub3AKKworbm90X25taToKKwkvKiBTZXR1cCBDYXVzZSAqLworCWxpCXQwLCBDQVVTRUZfSVYKKwltdGMwCXQwLCBDUDBfQ0FVU0UKKworCS8qIFNldHVwIFN0YXR1cyAqLworCWxpCXQwLCBTVDBfQ1UxIHwgU1QwX0NVMAorCW10YzAJdDAsIENQMF9TVEFUVVMKKworCS8qCisJICogQ2xlYXIgdGhlIGJpdHMgdXNlZCB0byBpbmRleCB0aGUgY2FjaGVzLiBOb3RlIHRoYXQgdGhlIGFyY2hpdGVjdHVyZQorCSAqIGRpY3RhdGVzIHRoYXQgd3JpdGluZyB0byBhbnkgb2YgVGFnTG8gb3IgVGFnSGkgc2VsZWN0cyAwIG9yIDIgc2hvdWxkCisJICogYmUgdmFsaWQgZm9yIGFsbCBNSVBTMzIgQ1BVcywgZXZlbiB0aG9zZSBmb3Igd2hpY2ggc2FpZCB3cml0ZXMgYXJlCisJICogdW5uZWNlc3NhcnkuCisJICovCisJbXRjMAl6ZXJvLCBDUDBfVEFHTE8sIDAKKwltdGMwCXplcm8sIENQMF9UQUdISSwgMAorCW10YzAJemVybywgQ1AwX1RBR0xPLCAyCisJbXRjMAl6ZXJvLCBDUDBfVEFHSEksIDIKKwllaGIKKworCS8qIFByaW1hcnkgY2FjaGUgY29uZmlndXJhdGlvbiBpcyBpbmRpY2F0ZWQgYnkgQ29uZmlnMSAqLworCW1mYzAJdjAsIENQMF9DT05GSUcsIDEKKworCS8qIERldGVjdCBJLWNhY2hlIGxpbmUgc2l6ZSAqLworCV9FWFQJdDAsIHYwLCBNSVBTX0NPTkYxX0lMX1NIRiwgTUlQU19DT05GMV9JTF9TWgorCWJlcXoJdDAsIGljYWNoZV9kb25lCisJIGxpCXQxLCAyCisJc2xsdgl0MCwgdDEsIHQwCisKKwkvKiBEZXRlY3QgSS1jYWNoZSBzaXplICovCisJX0VYVAl0MSwgdjAsIE1JUFNfQ09ORjFfSVNfU0hGLCBNSVBTX0NPTkYxX0lTX1NaCisJeG9yaQl0MiwgdDEsIDB4NworCWJlcXoJdDIsIDFmCisJIGxpCXQzLCAzMgorCWFkZGkJdDEsIHQxLCAxCisJc2xsdgl0MSwgdDMsIHQxCisxOgkvKiBBdCB0aGlzIHBvaW50IHQxID09IEktY2FjaGUgc2V0cyBwZXIgd2F5ICovCisJX0VYVAl0MiwgdjAsIE1JUFNfQ09ORjFfSUFfU0hGLCBNSVBTX0NPTkYxX0lBX1NaCisJYWRkaQl0MiwgdDIsIDEKKwltdWwJdDEsIHQxLCB0MAorCW11bAl0MSwgdDEsIHQyCisKKwlsaQlhMCwgS1NFRzAKKwlhZGQJYTEsIGEwLCB0MQorMToJY2FjaGUJSW5kZXhfU3RvcmVfVGFnX0ksIDAoYTApCisJYWRkCWEwLCBhMCwgdDAKKwlibmUJYTAsIGExLCAxYgorCSBub3AKK2ljYWNoZV9kb25lOgorCisJLyogRGV0ZWN0IEQtY2FjaGUgbGluZSBzaXplICovCisJX0VYVAl0MCwgdjAsIE1JUFNfQ09ORjFfRExfU0hGLCBNSVBTX0NPTkYxX0RMX1NaCisJYmVxegl0MCwgZGNhY2hlX2RvbmUKKwkgbGkJdDEsIDIKKwlzbGx2CXQwLCB0MSwgdDAKKworCS8qIERldGVjdCBELWNhY2hlIHNpemUgKi8KKwlfRVhUCXQxLCB2MCwgTUlQU19DT05GMV9EU19TSEYsIE1JUFNfQ09ORjFfRFNfU1oKKwl4b3JpCXQyLCB0MSwgMHg3CisJYmVxegl0MiwgMWYKKwkgbGkJdDMsIDMyCisJYWRkaQl0MSwgdDEsIDEKKwlzbGx2CXQxLCB0MywgdDEKKzE6CS8qIEF0IHRoaXMgcG9pbnQgdDEgPT0gRC1jYWNoZSBzZXRzIHBlciB3YXkgKi8KKwlfRVhUCXQyLCB2MCwgTUlQU19DT05GMV9EQV9TSEYsIE1JUFNfQ09ORjFfREFfU1oKKwlhZGRpCXQyLCB0MiwgMQorCW11bAl0MSwgdDEsIHQwCisJbXVsCXQxLCB0MSwgdDIKKworCWxpCWEwLCBLU0VHMAorCWFkZHUJYTEsIGEwLCB0MQorCXN1YnUJYTEsIGExLCB0MAorMToJY2FjaGUJSW5kZXhfU3RvcmVfVGFnX0QsIDAoYTApCisJYm5lCWEwLCBhMSwgMWIKKwkgYWRkCWEwLCBhMCwgdDAKK2RjYWNoZV9kb25lOgorCisJLyogU2V0IEtzZWcwIGNhY2hlYWJsZSwgY29oZXJlbnQsIHdyaXRlLWJhY2ssIHdyaXRlLWFsbG9jYXRlICovCisJbWZjMAl0MCwgQ1AwX0NPTkZJRworCW9yaQl0MCwgMHg3CisJeG9yaQl0MCwgMHgyCisJbXRjMAl0MCwgQ1AwX0NPTkZJRworCWVoYgorCisJLyogRW50ZXIgdGhlIGNvaGVyZW50IGRvbWFpbiAqLworCWxpCXQwLCAweGZmCisJc3cJdDAsIEdDUl9DTF9DT0hFUkVOQ0VfT0ZTKHYxKQorCWVoYgorCisJLyogSnVtcCB0byBrc2VnMCAqLworCWxhCXQwLCAxZgorCWpyCXQwCisJIG5vcAorCisxOgkvKiBXZSdyZSB1cCwgY2FjaGVkICYgY29oZXJlbnQgKi8KKworCS8qCisJICogVE9ETzogV2Ugc2hvdWxkIGNoZWNrIHRoZSBWUEUgbnVtYmVyIHdlIGludGVuZGVkIHRvIGJvb3QgaGVyZSwgYW5kCisJICogICAgICAgaWYgbm9uLXplcm8gd2Ugc2hvdWxkIHN0YXJ0IHRoYXQgVlBFIGFuZCBzdG9wIHRoaXMgb25lLiBGb3IKKwkgKiAgICAgICB0aGUgbW9tZW50IHRoaXMgZG9lc24ndCBtYXR0ZXIgc2luY2UgQ1BVcyBhcmUgYnJvdWdodCB1cAorCSAqICAgICAgIHNlcXVlbnRpYWxseSBhbmQgaW4gb3JkZXIsIGJ1dCBvbmNlIGhvdHBsdWcgaXMgaW1wbGVtZW50ZWQKKwkgKiAgICAgICB0aGlzIHdpbGwgbmVlZCByZXZpc2l0aW5nLgorCSAqLworCisJLyogT2ZmIHdlIGdvISAqLworCWxhCXQwLCBtaXBzX2Nwc19ib290Y2ZnCisJbHcJdDEsIEJPT1RDRkdfUEModDApCisJbHcJZ3AsIEJPT1RDRkdfR1AodDApCisJbHcJc3AsIEJPT1RDRkdfU1AodDApCisJanIJdDEKKwkgbm9wCisJRU5EKG1pcHNfY3BzX2NvcmVfZW50cnkpCisKKy5vcmcgMHgyMDAKK0xFQUYoZXhjZXBfdGxiZmlsbCkKKwliCS4KKwkgbm9wCisJRU5EKGV4Y2VwX3RsYmZpbGwpCisKKy5vcmcgMHgyODAKK0xFQUYoZXhjZXBfeHRsYmZpbGwpCisJYgkuCisJIG5vcAorCUVORChleGNlcF94dGxiZmlsbCkKKworLm9yZyAweDMwMAorTEVBRihleGNlcF9jYWNoZSkKKwliCS4KKwkgbm9wCisJRU5EKGV4Y2VwX2NhY2hlKQorCisub3JnIDB4MzgwCitMRUFGKGV4Y2VwX2dlbmV4KQorCWIJLgorCSBub3AKKwlFTkQoZXhjZXBfZ2VuZXgpCisKKy5vcmcgMHg0MDAKK0xFQUYoZXhjZXBfaW50ZXgpCisJYgkuCisJIG5vcAorCUVORChleGNlcF9pbnRleCkKKworLm9yZyAweDQ4MAorTEVBRihleGNlcF9lanRhZykKKwlsYQlrMCwgZWp0YWdfZGVidWdfaGFuZGxlcgorCWpyCWswCisJIG5vcAorCUVORChleGNlcF9lanRhZykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCmluZGV4IDUzMGY4MzIuLjZlOGZiODUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwpAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGFzbS9jcHUtdHlwZS5oPgogI2luY2x1ZGUgPGFzbS9mcHUuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgorI2luY2x1ZGUgPGFzbS9tc2EuaD4KICNpbmNsdWRlIDxhc20vd2F0Y2guaD4KICNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3NwcmFtLmg+CkBAIC0xMjYsNiArMTI4LDIwIEBACiAJcmV0dXJuICgoY3B1X2dldF9mcHVfaWQoKSAmIEZQSVJfSU1QX01BU0spICE9IEZQSVJfSU1QX05PTkUpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3B1X2dldF9tc2FfaWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXR1cywgY29uZjUsIG1zYV9pZDsKKworCXN0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCk7CisJX19lbmFibGVfZnB1KEZQVV82NEJJVCk7CisJY29uZjUgPSByZWFkX2MwX2NvbmZpZzUoKTsKKwllbmFibGVfbXNhKCk7CisJbXNhX2lkID0gcmVhZF9tc2FfaXIoKTsKKwl3cml0ZV9jMF9jb25maWc1KGNvbmY1KTsKKwl3cml0ZV9jMF9zdGF0dXMoc3RhdHVzKTsKKwlyZXR1cm4gbXNhX2lkOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3Byb2JlX3ZtYml0cyhzdHJ1Y3QgY3B1aW5mb19taXBzICpjKQogewogI2lmZGVmIF9fTkVFRF9WTUJJVFNfUFJPQkUKQEAgLTE2NiwxMSArMTgyLDEyIEBACiBzdGF0aWMgdm9pZCBzZXRfZnRsYl9lbmFibGUoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgaW50IGVuYWJsZSkKIHsKIAl1bnNpZ25lZCBpbnQgY29uZmlnNjsKLQkvKgotCSAqIENvbmZpZzYgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGFuZCBpdCdzIGN1cnJlbnRseSBvbmx5Ci0JICogdXNlZCBieSBwcm9BcHRpdgotCSAqLwotCWlmIChjLT5jcHV0eXBlID09IENQVV9QUk9BUFRJVikgeworCisJLyogSXQncyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgaG93IHRoZSBGVExCIGNhbiBiZSBlbmFibGVkICovCisJc3dpdGNoIChjLT5jcHV0eXBlKSB7CisJY2FzZSBDUFVfUFJPQVBUSVY6CisJY2FzZSBDUFVfUDU2MDA6CisJCS8qIHByb0FwdGl2ICYgcmVsYXRlZCBjb3JlcyB1c2UgQ29uZmlnNiB0byBlbmFibGUgdGhlIEZUTEIgKi8KIAkJY29uZmlnNiA9IHJlYWRfYzBfY29uZmlnNigpOwogCQlpZiAoZW5hYmxlKQogCQkJLyogRW5hYmxlIEZUTEIgKi8KQEAgLTE3OSw2ICsxOTYsNyBAQAogCQkJLyogRGlzYWJsZSBGVExCICovCiAJCQl3cml0ZV9jMF9jb25maWc2KGNvbmZpZzYgJiAgfk1JUFNfQ09ORjZfRlRMQkVOKTsKIAkJYmFja190b19iYWNrX2MwX2hhemFyZCgpOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTMwMSw2ICszMTksOCBAQAogCQljLT5hc2VzIHw9IE1JUFNfQVNFX1ZaOwogCWlmIChjb25maWczICYgTUlQU19DT05GM19TQykKIAkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9TRUdNRU5UUzsKKwlpZiAoY29uZmlnMyAmIE1JUFNfQ09ORjNfTVNBKQorCQljLT5hc2VzIHw9IE1JUFNfQVNFX01TQTsKIAogCXJldHVybiBjb25maWczICYgTUlQU19DT05GX007CiB9CkBAIC0zNjcsNiArMzg3LDkgQEAKIAljb25maWc1ICY9IH5NSVBTX0NPTkY1X1VGUjsKIAl3cml0ZV9jMF9jb25maWc1KGNvbmZpZzUpOwogCisJaWYgKGNvbmZpZzUgJiBNSVBTX0NPTkY1X0VWQSkKKwkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9FVkE7CisKIAlyZXR1cm4gY29uZmlnNSAmIE1JUFNfQ09ORl9NOwogfQogCkBAIC0zOTgsOCArNDIxLDEzIEBACiAKIAltaXBzX3Byb2JlX3dhdGNoX3JlZ2lzdGVycyhjKTsKIAotCWlmIChjcHVfaGFzX21pcHNfcjIpCisjaWZuZGVmIENPTkZJR19NSVBTX0NQUworCWlmIChjcHVfaGFzX21pcHNfcjIpIHsKIAkJYy0+Y29yZSA9IHJlYWRfYzBfZWJhc2UoKSAmIDB4M2ZmOworCQlpZiAoY3B1X2hhc19taXBzbXQpCisJCQljLT5jb3JlID4+PSBmbHMoY29yZV9udnBlcygpKSAtIDE7CisJfQorI2VuZGlmCiB9CiAKICNkZWZpbmUgUjRLX09QVFMgKE1JUFNfQ1BVX1RMQiB8IE1JUFNfQ1BVXzRLRVggfCBNSVBTX0NQVV80S19DQUNIRSBcCkBAIC03MTAsMTcgKzczOCwyMyBAQAogCQkJICAgICBNSVBTX0NQVV9MTFNDOwogCQljLT50bGJzaXplID0gNjQ7CiAJCWJyZWFrOwotCWNhc2UgUFJJRF9JTVBfTE9PTkdTT04yOgotCQljLT5jcHV0eXBlID0gQ1BVX0xPT05HU09OMjsKLQkJX19jcHVfbmFtZVtjcHVdID0gIklDVCBMb29uZ3Nvbi0yIjsKLQorCWNhc2UgUFJJRF9JTVBfTE9PTkdTT05fNjQ6ICAvKiBMb29uZ3Nvbi0yLzMgKi8KIAkJc3dpdGNoIChjLT5wcm9jZXNzb3JfaWQgJiBQUklEX1JFVl9NQVNLKSB7CiAJCWNhc2UgUFJJRF9SRVZfTE9PTkdTT04yRToKKwkJCWMtPmNwdXR5cGUgPSBDUFVfTE9PTkdTT04yOworCQkJX19jcHVfbmFtZVtjcHVdID0gIklDVCBMb29uZ3Nvbi0yIjsKIAkJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAibG9vbmdzb24yZSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgUFJJRF9SRVZfTE9PTkdTT04yRjoKKwkJCWMtPmNwdXR5cGUgPSBDUFVfTE9PTkdTT04yOworCQkJX19jcHVfbmFtZVtjcHVdID0gIklDVCBMb29uZ3Nvbi0yIjsKIAkJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAibG9vbmdzb24yZiIpOwogCQkJYnJlYWs7CisJCWNhc2UgUFJJRF9SRVZfTE9PTkdTT04zQToKKwkJCWMtPmNwdXR5cGUgPSBDUFVfTE9PTkdTT04zOworCQkJX19jcHVfbmFtZVtjcHVdID0gIklDVCBMb29uZ3Nvbi0zIjsKKwkJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAibG9vbmdzb24zYSIpOworCQkJYnJlYWs7CiAJCX0KIAogCQlzZXRfaXNhKGMsIE1JUFNfQ1BVX0lTQV9JSUkpOwpAQCAtNzI5LDcgKzc2Myw3IEBACiAJCQkgICAgIE1JUFNfQ1BVXzMyRlBSOwogCQljLT50bGJzaXplID0gNjQ7CiAJCWJyZWFrOwotCWNhc2UgUFJJRF9JTVBfTE9PTkdTT04xOgorCWNhc2UgUFJJRF9JTVBfTE9PTkdTT05fMzI6ICAvKiBMb29uZ3Nvbi0xICovCiAJCWRlY29kZV9jb25maWdzKGMpOwogCiAJCWMtPmNwdXR5cGUgPSBDUFVfTE9PTkdTT04xOwpAQCAtODA2LDcgKzg0MCw3IEBACiAJCV9fY3B1X25hbWVbY3B1XSA9ICJNSVBTIDEwMDRLYyI7CiAJCWJyZWFrOwogCWNhc2UgUFJJRF9JTVBfMTA3NEs6Ci0JCWMtPmNwdXR5cGUgPSBDUFVfNzRLOworCQljLT5jcHV0eXBlID0gQ1BVXzEwNzRLOwogCQlfX2NwdV9uYW1lW2NwdV0gPSAiTUlQUyAxMDc0S2MiOwogCQlicmVhazsKIAljYXNlIFBSSURfSU1QX0lOVEVSQVBUSVZfVVA6CkBAIC04MjUsNiArODU5LDE0IEBACiAJCWMtPmNwdXR5cGUgPSBDUFVfUFJPQVBUSVY7CiAJCV9fY3B1X25hbWVbY3B1XSA9ICJNSVBTIHByb0FwdGl2IChtdWx0aSkiOwogCQlicmVhazsKKwljYXNlIFBSSURfSU1QX1A1NjAwOgorCQljLT5jcHV0eXBlID0gQ1BVX1A1NjAwOworCQlfX2NwdV9uYW1lW2NwdV0gPSAiTUlQUyBQNTYwMCI7CisJCWJyZWFrOworCWNhc2UgUFJJRF9JTVBfTTUxNTA6CisJCWMtPmNwdXR5cGUgPSBDUFVfTTUxNTA7CisJCV9fY3B1X25hbWVbY3B1XSA9ICJNSVBTIE01MTUwIjsKKwkJYnJlYWs7CiAJfQogCiAJZGVjb2RlX2NvbmZpZ3MoYyk7CkBAIC0xMTc2LDYgKzEyMTgsMTIgQEAKIAllbHNlCiAJCWMtPnNyc2V0cyA9IDE7CiAKKwlpZiAoY3B1X2hhc19tc2EpIHsKKwkJYy0+bXNhX2lkID0gY3B1X2dldF9tc2FfaWQoKTsKKwkJV0FSTihjLT5tc2FfaWQgJiBNU0FfSVJfV1JQRiwKKwkJICAgICAiVmVjdG9yIHJlZ2lzdGVyIHBhcnRpdGlvbmluZyB1bmltcGxlbWVudGVkISIpOworCX0KKwogCWNwdV9wcm9iZV92bWJpdHMoYyk7CiAKICNpZmRlZiBDT05GSUdfNjRCSVQKQEAgLTExOTIsNCArMTI0MCw2IEBACiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgYy0+cHJvY2Vzc29yX2lkLCBjcHVfbmFtZV9zdHJpbmcoKSk7CiAJaWYgKGMtPm9wdGlvbnMgJiBNSVBTX0NQVV9GUFUpCiAJCXByaW50ayhLRVJOX0lORk8gIkZQVSByZXZpc2lvbiBpczogJTA4eFxuIiwgYy0+ZnB1X2lkKTsKKwlpZiAoY3B1X2hhc19tc2EpCisJCXByX2luZm8oIk1TQSByZXZpc2lvbiBpczogJTA4eFxuIiwgYy0+bXNhX2lkKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL21pcHMva2VybmVsL2Z0cmFjZS5jCmluZGV4IDE4NWJhMjUuLjc0ZmU3MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYwpAQCAtOTAsNiArOTAsNyBAQAogc3RhdGljIGludCBmdHJhY2VfbW9kaWZ5X2NvZGUodW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgaW50IG5ld19jb2RlKQogewogCWludCBmYXVsdGVkOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKIAkvKiAqKHVuc2lnbmVkIGludCAqKWlwID0gbmV3X2NvZGU7ICovCiAJc2FmZV9zdG9yZV9jb2RlKG5ld19jb2RlLCBpcCwgZmF1bHRlZCk7CkBAIC05Nyw3ICs5OCwxMCBAQAogCWlmICh1bmxpa2VseShmYXVsdGVkKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOwogCWZsdXNoX2ljYWNoZV9yYW5nZShpcCwgaXAgKyA4KTsKKwlzZXRfZnMob2xkX2ZzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTExLDExICsxMTUsMTAgQEAKIAlzYWZlX3N0b3JlX2NvZGUobmV3X2NvZGUxLCBpcCwgZmF1bHRlZCk7CiAJaWYgKHVubGlrZWx5KGZhdWx0ZWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpcCArPSA0OwotCXNhZmVfc3RvcmVfY29kZShuZXdfY29kZTIsIGlwLCBmYXVsdGVkKTsKKwlzYWZlX3N0b3JlX2NvZGUobmV3X2NvZGUyLCBpcCArIDQsIGZhdWx0ZWQpOwogCWlmICh1bmxpa2VseShmYXVsdGVkKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JZmx1c2hfaWNhY2hlX3JhbmdlKGlwLCBpcCArIDgpOyAvKiBvcmlnaW5hbCBpcCArIDEyICovCisJZmx1c2hfaWNhY2hlX3JhbmdlKGlwLCBpcCArIDgpOwogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKaW5kZXggZDg0ZjZhNS4uYTljZTM0MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwpAQCAtNjcsNyArNjcsNyBAQAogICovCiBORVNURUQoZXhjZXB0X3ZlYzNfcjQwMDAsIDAsIHNwKQogCS5zZXQJcHVzaAotCS5zZXQJbWlwczMKKwkuc2V0CWFyY2g9cjQwMDAKIAkuc2V0CW5vYXQKIAltZmMwCWsxLCBDUDBfQ0FVU0UKIAlsaQlrMCwgMzE8PDIKQEAgLTEzOSw3ICsxMzksNyBAQAogCW5vcAogCW5vcAogI2VuZGlmCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCXdhaXQKIAkvKiBlbmQgb2Ygcm9sbGJhY2sgcmVnaW9uICh0aGUgcmVnaW9uIHNpemUgbXVzdCBiZSBwb3dlciBvZiB0d28pICovCiAxOgpAQCAtNDc1LDggKzQ3NSwxMCBAQAogCUJVSUxEX0hBTkRMRVIgY3B1IGNwdSBzdGkgc2lsZW50CQkvKiAjMTEgKi8KIAlCVUlMRF9IQU5ETEVSIG92IG92IHN0aSBzaWxlbnQJCQkvKiAjMTIgKi8KIAlCVUlMRF9IQU5ETEVSIHRyIHRyIHN0aSBzaWxlbnQJCQkvKiAjMTMgKi8KKwlCVUlMRF9IQU5ETEVSIG1zYV9mcGUgbXNhX2ZwZSBzdGkgc2lsZW50CS8qICMxNCAqLwogCUJVSUxEX0hBTkRMRVIgZnBlIGZwZSBmcGUgc2lsZW50CQkvKiAjMTUgKi8KIAlCVUlMRF9IQU5ETEVSIGZ0bGIgZnRsYiBub25lIHNpbGVudAkJLyogIzE2ICovCisJQlVJTERfSEFORExFUiBtc2EgbXNhIHN0aSBzaWxlbnQJCS8qICMyMSAqLwogCUJVSUxEX0hBTkRMRVIgbWRteCBtZG14IHN0aSBzaWxlbnQJCS8qICMyMiAqLwogI2lmZGVmCUNPTkZJR19IQVJEV0FSRV9XQVRDSFBPSU5UUwogCS8qCkBAIC01NzUsNyArNTc3LDcgQEAKIAlvcmkJazEsIF9USFJFQURfTUFTSwogCXhvcmkJazEsIF9USFJFQURfTUFTSwogCUxPTkdfTAl2MSwgVElfVFBfVkFMVUUoazEpCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCWVyZXQKIAkuc2V0CW1pcHMwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKaW5kZXggN2I2YTViMy4uZTcxMmRjZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKQEAgLTE3NSw4ICsxNzUsOCBAQAogCURNVAkxMAkjIGRtdCB0MiAvKiB0MCwgdDEgYXJlIHVzZWQgYnkgQ0xJIGFuZCBzZXR1cF9jMF9zdGF0dXMoKSAqLwogCWphbAltaXBzX2loYgogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQlzZXR1cF9jMF9zdGF0dXNfc2VjCiAJc21wX3NsYXZlX3NldHVwCisJc2V0dXBfYzBfc3RhdHVzX3NlYwogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIAlhbmRpCXQyLCB0MiwgVlBFQ09OVFJPTF9URQogCWJlcXoJdDIsIDJmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lkbGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaWRsZS5jCmluZGV4IDM1NTMyNDMuLjgzN2ZmMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaWRsZS5jCkBAIC02NCw3ICs2NCw3IEBACiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKIAkJX19hc21fXygKIAkJIgkuc2V0CXB1c2gJCVxuIgotCQkiCS5zZXQJbWlwczMJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAlcbiIKIAkJIgl3YWl0CQkJXG4iCiAJCSIJLnNldAlwb3AJCVxuIik7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtODIsNyArODIsNyBAQAogCWlmICghbmVlZF9yZXNjaGVkKCkpCiAJCV9fYXNtX18oCiAJCSIJLnNldAlwdXNoCQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIJLnNldAlub2F0CQkJCQlcbiIKIAkJIgltZmMwCSQxLCAkMTIJCQkJCVxuIgogCQkiCXN5bmMJCQkJCQlcbiIKQEAgLTEwMyw3ICsxMDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgYzBzdGF0dXMgPSByZWFkX2MwX3N0YXR1cygpIHwgMTsJLyogaXJxcyBvbiAqLwogCiAJX19hc21fXygKLQkiCS5zZXQJbWlwczMJCQlcbiIKKwkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCSIJY2FjaGUJMHgxNCwgMCglMCkJCVxuIgogCSIJY2FjaGUJMHgxNCwgMzIoJTApCQlcbiIKIAkiCXN5bmMJCQkJXG4iCkBAIC0xODQsOCArMTg0LDExIEBACiAJY2FzZSBDUFVfMjRLOgogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV8xMDc0SzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgogCWNhc2UgQ1BVX1BST0FQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgorCWNhc2UgQ1BVX001MTUwOgogCQljcHVfd2FpdCA9IHI0a193YWl0OwogCQlpZiAocmVhZF9jMF9jb25maWc3KCkgJiBNSVBTX0NPTkY3X1dJSSkKIAkJCWNwdV93YWl0ID0gcjRrX3dhaXRfaXJxb2ZmOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtZ2ljLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYwppbmRleCA1YjVkZGIyLi44NTIwZGFkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9naWMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vZ2NtcHJlZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL21pcHMva2VybmVsL2tnZGIuYwppbmRleCBmY2FhYzJmLi43YWZjYzJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2tnZGIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2tnZGIuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogc3RhdGljIHN0cnVjdCBoYXJkX3RyYXBfaW5mbyB7CiAJdW5zaWduZWQgY2hhciB0dDsJLyogVHJhcCB0eXBlIGNvZGUgZm9yIE1JUFMgUjN4eHggYW5kIFI0eHh4ICovCkBAIC0yMDgsNyArMjA5LDE0IEBACiAKIHN0YXRpYyB2b2lkIGtnZGJfY2FsbF9ubWlfaG9vayh2b2lkICppZ25vcmVkKQogeworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCiAJa2dkYl9ubWljYWxsYmFjayhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBOVUxMKTsKKworCXNldF9mcyhvbGRfZnMpOwogfQogCiB2b2lkIGtnZGJfcm91bmR1cF9jcHVzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCkBAIC0yODIsNiArMjkwLDcgQEAKIAlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopcHRyOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gYXJncy0+cmVnczsKIAlpbnQgdHJhcCA9IChyZWdzLT5jcDBfY2F1c2UgJiAweDdjKSA+PiAyOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKICNpZmRlZiBDT05GSUdfS1BST0JFUwogCS8qCkBAIC0yOTYsMTEgKzMwNSwxNyBAQAogCWlmICh1c2VyX21vZGUocmVncykpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAorCS8qIEtlcm5lbCBtb2RlLiBTZXQgY29ycmVjdCBhZGRyZXNzIGxpbWl0ICovCisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwogCWlmIChhdG9taWNfcmVhZCgma2dkYl9hY3RpdmUpICE9IC0xKQogCQlrZ2RiX25taWNhbGxiYWNrKHNtcF9wcm9jZXNzb3JfaWQoKSwgcmVncyk7CiAKLQlpZiAoa2dkYl9oYW5kbGVfZXhjZXB0aW9uKHRyYXAsIGNvbXB1dGVfc2lnbmFsKHRyYXApLCBjbWQsIHJlZ3MpKQorCWlmIChrZ2RiX2hhbmRsZV9leGNlcHRpb24odHJhcCwgY29tcHV0ZV9zaWduYWwodHJhcCksIGNtZCwgcmVncykpIHsKKwkJc2V0X2ZzKG9sZF9mcyk7CiAJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9CiAKIAlpZiAoYXRvbWljX3JlYWQoJmtnZGJfc2V0dGluZ19icmVha3BvaW50KSkKIAkJaWYgKCh0cmFwID09IDkpICYmIChyZWdzLT5jcDBfZXBjID09ICh1bnNpZ25lZCBsb25nKWJyZWFraW5zdCkpCkBAIC0zMTAsNiArMzI1LDcgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJX19mbHVzaF9jYWNoZV9hbGwoKTsKIAorCXNldF9mcyhvbGRfZnMpOwogCXJldHVybiBOT1RJRllfU1RPUDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLWNtLmMgYi9hcmNoL21pcHMva2VybmVsL21pcHMtY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZmN2EwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzLWNtLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IFBhdWwgQnVydG9uIDxwYXVsLmJ1cnRvbkBpbWd0ZWMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGFzbS9taXBzLWNtLmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisKK3ZvaWQgX19pb21lbSAqbWlwc19jbV9iYXNlOwordm9pZCBfX2lvbWVtICptaXBzX2NtX2wyc3luY19iYXNlOworCitwaHlzX3QgX19taXBzX2NtX3BoeXNfYmFzZSh2b2lkKQoreworCXUzMiBjb25maWczID0gcmVhZF9jMF9jb25maWczKCk7CisJdTMyIGNtZ2NyOworCisJLyogQ2hlY2sgdGhlIENNR0NSQmFzZSByZWdpc3RlciBpcyBpbXBsZW1lbnRlZCAqLworCWlmICghKGNvbmZpZzMgJiBNSVBTX0NPTkYzX0NNR0NSKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWFkIHRoZSBhZGRyZXNzIGZyb20gQ01HQ1JCYXNlICovCisJY21nY3IgPSByZWFkX2MwX2NtZ2NyYmFzZSgpOworCXJldHVybiAoY21nY3IgJiBNSVBTX0NNR0NSRl9CQVNFKSA8PCAoMzYgLSAzMik7Cit9CisKK3BoeXNfdCBtaXBzX2NtX3BoeXNfYmFzZSh2b2lkKQorCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX21pcHNfY21fcGh5c19iYXNlIikpKTsKKworcGh5c190IF9fbWlwc19jbV9sMnN5bmNfcGh5c19iYXNlKHZvaWQpCit7CisJdTMyIGJhc2VfcmVnOworCisJLyoKKwkgKiBJZiB0aGUgTDItb25seSBzeW5jIHJlZ2lvbiBpcyBhbHJlYWR5IGVuYWJsZWQgdGhlbiBsZWF2ZSBpdCBhdCBpdCdzCisJICogY3VycmVudCBsb2NhdGlvbi4KKwkgKi8KKwliYXNlX3JlZyA9IHJlYWRfZ2NyX2wyX29ubHlfc3luY19iYXNlKCk7CisJaWYgKGJhc2VfcmVnICYgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNFTl9NU0spCisJCXJldHVybiBiYXNlX3JlZyAmIENNX0dDUl9MMl9PTkxZX1NZTkNfQkFTRV9TWU5DQkFTRV9NU0s7CisKKwkvKiBEZWZhdWx0IHRvIGZvbGxvd2luZyB0aGUgQ00gKi8KKwlyZXR1cm4gbWlwc19jbV9waHlzX2Jhc2UoKSArIE1JUFNfQ01fR0NSX1NJWkU7Cit9CisKK3BoeXNfdCBtaXBzX2NtX2wyc3luY19waHlzX2Jhc2Uodm9pZCkKKwlfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19taXBzX2NtX2wyc3luY19waHlzX2Jhc2UiKSkpOworCitzdGF0aWMgdm9pZCBtaXBzX2NtX3Byb2JlX2wyc3luYyh2b2lkKQoreworCXVuc2lnbmVkIG1ham9yX3JldjsKKwlwaHlzX3QgYWRkcjsKKworCS8qIEwyLW9ubHkgc3luYyB3YXMgaW50cm9kdWNlZCB3aXRoIENNIG1ham9yIHJldmlzaW9uIDYgKi8KKwltYWpvcl9yZXYgPSAocmVhZF9nY3JfcmV2KCkgJiBDTV9HQ1JfUkVWX01BSk9SX01TSykgPj4KKwkJQ01fR0NSX1JFVl9NQUpPUl9TSEY7CisJaWYgKG1ham9yX3JldiA8IDYpCisJCXJldHVybjsKKworCS8qIEZpbmQgYSBsb2NhdGlvbiBmb3IgdGhlIEwyIHN5bmMgcmVnaW9uICovCisJYWRkciA9IG1pcHNfY21fbDJzeW5jX3BoeXNfYmFzZSgpOworCUJVR19PTigoYWRkciAmIENNX0dDUl9MMl9PTkxZX1NZTkNfQkFTRV9TWU5DQkFTRV9NU0spICE9IGFkZHIpOworCWlmICghYWRkcikKKwkJcmV0dXJuOworCisJLyogU2V0IHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICYgZW5hYmxlIGl0ICovCisJd3JpdGVfZ2NyX2wyX29ubHlfc3luY19iYXNlKGFkZHIgfCBDTV9HQ1JfTDJfT05MWV9TWU5DX0JBU0VfU1lOQ0VOX01TSyk7CisKKwkvKiBNYXAgdGhlIHJlZ2lvbiAqLworCW1pcHNfY21fbDJzeW5jX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoYWRkciwgTUlQU19DTV9MMlNZTkNfU0laRSk7Cit9CisKK2ludCBtaXBzX2NtX3Byb2JlKHZvaWQpCit7CisJcGh5c190IGFkZHI7CisJdTMyIGJhc2VfcmVnOworCisJYWRkciA9IG1pcHNfY21fcGh5c19iYXNlKCk7CisJQlVHX09OKChhZGRyICYgQ01fR0NSX0JBU0VfR0NSQkFTRV9NU0spICE9IGFkZHIpOworCWlmICghYWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltaXBzX2NtX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoYWRkciwgTUlQU19DTV9HQ1JfU0laRSk7CisJaWYgKCFtaXBzX2NtX2Jhc2UpCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBzYW5pdHkgY2hlY2sgdGhhdCB3ZSdyZSBsb29raW5nIGF0IGEgQ00gKi8KKwliYXNlX3JlZyA9IHJlYWRfZ2NyX2Jhc2UoKTsKKwlpZiAoKGJhc2VfcmVnICYgQ01fR0NSX0JBU0VfR0NSQkFTRV9NU0spICE9IGFkZHIpIHsKKwkJcHJfZXJyKCJHQ1JzIGFwcGVhciB0byBoYXZlIGJlZW4gbW92ZWQgKGV4cGVjdGVkIHRoZW0gYXQgMHglMDhseCkhXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYWRkcik7CisJCW1pcHNfY21fYmFzZSA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHNldCBkZWZhdWx0IHRhcmdldCB0byBtZW1vcnkgKi8KKwliYXNlX3JlZyAmPSB+Q01fR0NSX0JBU0VfQ01ERUZUR1RfTVNLOworCWJhc2VfcmVnIHw9IENNX0dDUl9CQVNFX0NNREVGVEdUX01FTTsKKwl3cml0ZV9nY3JfYmFzZShiYXNlX3JlZyk7CisKKwkvKiBkaXNhYmxlIENNIHJlZ2lvbnMgKi8KKwl3cml0ZV9nY3JfcmVnMF9iYXNlKENNX0dDUl9SRUduX0JBU0VfQkFTRUFERFJfTVNLKTsKKwl3cml0ZV9nY3JfcmVnMF9tYXNrKENNX0dDUl9SRUduX01BU0tfQUREUk1BU0tfTVNLKTsKKwl3cml0ZV9nY3JfcmVnMV9iYXNlKENNX0dDUl9SRUduX0JBU0VfQkFTRUFERFJfTVNLKTsKKwl3cml0ZV9nY3JfcmVnMV9tYXNrKENNX0dDUl9SRUduX01BU0tfQUREUk1BU0tfTVNLKTsKKwl3cml0ZV9nY3JfcmVnMl9iYXNlKENNX0dDUl9SRUduX0JBU0VfQkFTRUFERFJfTVNLKTsKKwl3cml0ZV9nY3JfcmVnMl9tYXNrKENNX0dDUl9SRUduX01BU0tfQUREUk1BU0tfTVNLKTsKKwl3cml0ZV9nY3JfcmVnM19iYXNlKENNX0dDUl9SRUduX0JBU0VfQkFTRUFERFJfTVNLKTsKKwl3cml0ZV9nY3JfcmVnM19tYXNrKENNX0dDUl9SRUduX01BU0tfQUREUk1BU0tfTVNLKTsKKworCS8qIHByb2JlIGZvciBhbiBMMi1vbmx5IHN5bmMgcmVnaW9uICovCisJbWlwc19jbV9wcm9iZV9sMnN5bmMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLWNwYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzLWNwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZGM2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL21pcHMtY3BjLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogUGF1bCBCdXJ0b24gPHBhdWwuYnVydG9uQGltZ3RlYy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL21pcHMtY20uaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1jcGMuaD4KKwordm9pZCBfX2lvbWVtICptaXBzX2NwY19iYXNlOworCitwaHlzX3QgX193ZWFrIG1pcHNfY3BjX3BoeXNfYmFzZSh2b2lkKQoreworCXUzMiBjcGNfYmFzZTsKKworCWlmICghbWlwc19jbV9wcmVzZW50KCkpCisJCXJldHVybiAwOworCisJaWYgKCEocmVhZF9nY3JfY3BjX3N0YXR1cygpICYgQ01fR0NSX0NQQ19TVEFUVVNfRVhfTVNLKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB0aGUgQ1BDIGlzIGFscmVhZHkgZW5hYmxlZCwgbGVhdmUgaXQgc28gKi8KKwljcGNfYmFzZSA9IHJlYWRfZ2NyX2NwY19iYXNlKCk7CisJaWYgKGNwY19iYXNlICYgQ01fR0NSX0NQQ19CQVNFX0NQQ0VOX01TSykKKwkJcmV0dXJuIGNwY19iYXNlICYgQ01fR0NSX0NQQ19CQVNFX0NQQ0JBU0VfTVNLOworCisJLyogT3RoZXJ3aXNlLCBnaXZlIGl0IHRoZSBkZWZhdWx0IGFkZHJlc3MgJiBlbmFibGUgaXQgKi8KKwljcGNfYmFzZSA9IG1pcHNfY3BjX2RlZmF1bHRfcGh5c19iYXNlKCk7CisJd3JpdGVfZ2NyX2NwY19iYXNlKGNwY19iYXNlIHwgQ01fR0NSX0NQQ19CQVNFX0NQQ0VOX01TSyk7CisJcmV0dXJuIGNwY19iYXNlOworfQorCitpbnQgbWlwc19jcGNfcHJvYmUodm9pZCkKK3sKKwlwaHlzX3QgYWRkcjsKKworCWFkZHIgPSBtaXBzX2NwY19waHlzX2Jhc2UoKTsKKwlpZiAoIWFkZHIpCisJCXJldHVybiAtRU5PREVWOworCisJbWlwc19jcGNfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShhZGRyLCAweDgwMDApOworCWlmICghbWlwc19jcGNfYmFzZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMgYi9hcmNoL21pcHMva2VybmVsL21pcHNfa3N5bXMuYwppbmRleCA2ZTU4ZTk3Li4yNjA3YzNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21pcHNfa3N5bXMuYworKysgYi9hcmNoL21pcHMva2VybmVsL21pcHNfa3N5bXMuYwpAQCAtMTYsMTIgKzE2LDIwIEBACiAjaW5jbHVkZSA8YXNtL2Z0cmFjZS5oPgogCiBleHRlcm4gdm9pZCAqX19iemVybyh2b2lkICpfX3MsIHNpemVfdCBfX2NvdW50KTsKK2V4dGVybiBsb25nIF9fc3RybmNweV9mcm9tX2tlcm5lbF9ub2NoZWNrX2FzbShjaGFyICpfX3RvLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpfX2Zyb20sIGxvbmcgX19sZW4pOworZXh0ZXJuIGxvbmcgX19zdHJuY3B5X2Zyb21fa2VybmVsX2FzbShjaGFyICpfX3RvLCBjb25zdCBjaGFyICpfX2Zyb20sCisJCQkJICAgICAgbG9uZyBfX2xlbik7CiBleHRlcm4gbG9uZyBfX3N0cm5jcHlfZnJvbV91c2VyX25vY2hlY2tfYXNtKGNoYXIgKl9fdG8sCiAJCQkJCSAgICBjb25zdCBjaGFyICpfX2Zyb20sIGxvbmcgX19sZW4pOwogZXh0ZXJuIGxvbmcgX19zdHJuY3B5X2Zyb21fdXNlcl9hc20oY2hhciAqX190bywgY29uc3QgY2hhciAqX19mcm9tLAogCQkJCSAgICBsb25nIF9fbGVuKTsKK2V4dGVybiBsb25nIF9fc3RybGVuX2tlcm5lbF9ub2NoZWNrX2FzbShjb25zdCBjaGFyICpzKTsKK2V4dGVybiBsb25nIF9fc3RybGVuX2tlcm5lbF9hc20oY29uc3QgY2hhciAqcyk7CiBleHRlcm4gbG9uZyBfX3N0cmxlbl91c2VyX25vY2hlY2tfYXNtKGNvbnN0IGNoYXIgKnMpOwogZXh0ZXJuIGxvbmcgX19zdHJsZW5fdXNlcl9hc20oY29uc3QgY2hhciAqcyk7CitleHRlcm4gbG9uZyBfX3N0cm5sZW5fa2VybmVsX25vY2hlY2tfYXNtKGNvbnN0IGNoYXIgKnMpOworZXh0ZXJuIGxvbmcgX19zdHJubGVuX2tlcm5lbF9hc20oY29uc3QgY2hhciAqcyk7CiBleHRlcm4gbG9uZyBfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbShjb25zdCBjaGFyICpzKTsKIGV4dGVybiBsb25nIF9fc3Rybmxlbl91c2VyX2FzbShjb25zdCBjaGFyICpzKTsKIApAQCAtNDMsMTcgKzUxLDMxIEBACiAgKi8KIEVYUE9SVF9TWU1CT0woX19jb3B5X3VzZXIpOwogRVhQT1JUX1NZTUJPTChfX2NvcHlfdXNlcl9pbmF0b21pYyk7CisjaWZkZWYgQ09ORklHX0VWQQorRVhQT1JUX1NZTUJPTChfX2NvcHlfZnJvbV91c2VyX2V2YSk7CitFWFBPUlRfU1lNQk9MKF9fY29weV9pbl91c2VyX2V2YSk7CitFWFBPUlRfU1lNQk9MKF9fY29weV90b191c2VyX2V2YSk7CitFWFBPUlRfU1lNQk9MKF9fY29weV91c2VyX2luYXRvbWljX2V2YSk7CisjZW5kaWYKIEVYUE9SVF9TWU1CT0woX19iemVybyk7CitFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX2tlcm5lbF9ub2NoZWNrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX2tlcm5lbF9hc20pOwogRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyX25vY2hlY2tfYXNtKTsKIEVYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3N0cmxlbl9rZXJuZWxfbm9jaGVja19hc20pOworRVhQT1JUX1NZTUJPTChfX3N0cmxlbl9rZXJuZWxfYXNtKTsKIEVYUE9SVF9TWU1CT0woX19zdHJsZW5fdXNlcl9ub2NoZWNrX2FzbSk7CiBFWFBPUlRfU1lNQk9MKF9fc3RybGVuX3VzZXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19zdHJubGVuX2tlcm5lbF9ub2NoZWNrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fc3Rybmxlbl9rZXJuZWxfYXNtKTsKIEVYUE9SVF9TWU1CT0woX19zdHJubGVuX3VzZXJfbm9jaGVja19hc20pOwogRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcl9hc20pOwogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwotRVhQT1JUX1NZTUJPTChfX2NzdW1fcGFydGlhbF9jb3B5X3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NzdW1fcGFydGlhbF9jb3B5X2tlcm5lbCk7CitFWFBPUlRfU1lNQk9MKF9fY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKTsKIAogRVhQT1JUX1NZTUJPTChpbnZhbGlkX3B0ZV90YWJsZSk7CiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jCmluZGV4IDI0Y2RmNjQuLjRmMmQ5ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYworKysgYi9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMKQEAgLTgwNSw3ICs4MDUsNyBAQAogCX0KIH0KIAotLyogMjRLLzM0Sy8xMDA0SyBjb3JlcyBjYW4gc2hhcmUgdGhlIHNhbWUgZXZlbnQgbWFwLiAqLworLyogMjRLLzM0Sy8xMDA0Sy9pbnRlckFwdGl2L2xvb25nc29uMSBjb3JlcyBzaGFyZSB0aGUgc2FtZSBldmVudCBtYXAuICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHhjb3JlX2V2ZW50X21hcAogCQkJCVtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CiAJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10gPSB7IDB4MDAsIENOVFJfRVZFTiB8IENOVFJfT0RELCBQIH0sCkBAIC04MTQsOCArODE0LDggQEAKIAlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXSA9IHsgMHgwMiwgQ05UUl9PREQsIFQgfSwKIH07CiAKLS8qIDc0SyBjb3JlIGhhcyBkaWZmZXJlbnQgYnJhbmNoIGV2ZW50IGNvZGUuICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHg3NEtjb3JlX2V2ZW50X21hcAorLyogNzRLL3Byb0FwdGl2IGNvcmUgaGFzIGRpZmZlcmVudCBicmFuY2ggZXZlbnQgY29kZS4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG1pcHN4eGNvcmVfZXZlbnRfbWFwMgogCQkJCVtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CiAJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10gPSB7IDB4MDAsIENOVFJfRVZFTiB8IENOVFJfT0RELCBQIH0sCiAJW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXSA9IHsgMHgwMSwgQ05UUl9FVkVOIHwgQ05UUl9PREQsIFQgfSwKQEAgLTg0OSw3ICs4NDksNyBAQAogCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdID0geyAweDFjLCBDTlRSX0FMTCB9LCAvKiBQQVBJX0JSX01TUCAqLwogfTsKIAotLyogMjRLLzM0Sy8xMDA0SyBjb3JlcyBjYW4gc2hhcmUgdGhlIHNhbWUgY2FjaGUgZXZlbnQgbWFwLiAqLworLyogMjRLLzM0Sy8xMDA0Sy9pbnRlckFwdGl2L2xvb25nc29uMSBjb3JlcyBzaGFyZSB0aGUgc2FtZSBjYWNoZSBldmVudCBtYXAuICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHhjb3JlX2NhY2hlX21hcAogCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KIAkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCkBAIC05MzAsOCArOTMwLDggQEAKIH0sCiB9OwogCi0vKiA3NEsgY29yZSBoYXMgY29tcGxldGVseSBkaWZmZXJlbnQgY2FjaGUgZXZlbnQgbWFwLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgbWlwc3h4NzRLY29yZV9jYWNoZV9tYXAKKy8qIDc0Sy9wcm9BcHRpdiBjb3JlIGhhcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBjYWNoZSBldmVudCBtYXAuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHhjb3JlX2NhY2hlX21hcDIKIAkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCiAJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQogCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdID0gewpAQCAtOTc4LDYgKzk3OCwxMSBAQAogCQlbQyhSRVNVTFRfTUlTUyldCT0geyAweDFkLCBDTlRSX0VWRU4sIFAgfSwKIAl9LAogfSwKKy8qCisgKiA3NEsgY29yZSBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIERUTEIgZXZlbnRzLiBwcm9BcHRpdiBjb3JlIGhhcworICogInNwZWN1bGF0aXZlIiBEVExCIGV2ZW50cyB3aGljaCBhcmUgbnVtYmVyZWQgMHg2MyAoZXZlbi9vZGQpIGFuZAorICogbm90IGluY2x1ZGVkIGhlcmUuIE9uZSBjYW4gdXNlIHJhdyBldmVudHMgaWYgcmVhbGx5IG5lZWRlZC4KKyAqLwogW0MoSVRMQildID0gewogCVtDKE9QX1JFQUQpXSA9IHsKIAkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyAweDA0LCBDTlRSX0VWRU4sIFQgfSwKQEAgLTEzNzgsNiArMTM4MywxMCBAQAogI2RlZmluZSBJU19CT1RIX0NPVU5URVJTXzc0S19FVkVOVChiKQkJCQkJXAogCSgoYikgPT0gMCB8fCAoYikgPT0gMSkKIAorLyogcHJvQXB0aXYgKi8KKyNkZWZpbmUgSVNfQk9USF9DT1VOVEVSU19QUk9BUFRJVl9FVkVOVChiKQkJCQlcCisJKChiKSA9PSAwIHx8IChiKSA9PSAxKQorCiAvKiAxMDA0SyAqLwogI2RlZmluZSBJU19CT1RIX0NPVU5URVJTXzEwMDRLX0VWRU5UKGIpCQkJCQlcCiAJKChiKSA9PSAwIHx8IChiKSA9PSAxIHx8IChiKSA9PSAxMSkKQEAgLTEzOTEsNiArMTQwMCwyMCBAQAogI2RlZmluZSBJU19SQU5HRV9WXzEwMDRLX0VWRU5UKHIpCSgocikgPT0gNDcpCiAjZW5kaWYKIAorLyogaW50ZXJBcHRpdiAqLworI2RlZmluZSBJU19CT1RIX0NPVU5URVJTX0lOVEVSQVBUSVZfRVZFTlQoYikJCQkJXAorCSgoYikgPT0gMCB8fCAoYikgPT0gMSB8fCAoYikgPT0gMTEpCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCisvKiBUaGUgUC9WL1QgaW5mbyBpcyBub3QgcHJvdmlkZWQgZm9yICIoYikgPT0gMzgiIGluIFNVTSwgYXNzdW1lIFAuICovCisjZGVmaW5lIElTX1JBTkdFX1BfSU5URVJBUFRJVl9FVkVOVChyLCBiKQkJCQlcCisJKChiKSA9PSAwIHx8IChyKSA9PSAxOCB8fCAoYikgPT0gMjEgfHwgKGIpID09IDIyIHx8CQlcCisJIChiKSA9PSAyNSB8fCAoYikgPT0gMzYgfHwgKGIpID09IDM4IHx8IChiKSA9PSAzOSB8fAkJXAorCSAocikgPT0gNDQgfHwgKHIpID09IDE3NCB8fCAocikgPT0gMTc2IHx8ICgoYikgPj0gNTAgJiYJCVwKKwkgKGIpIDw9IDU5KSB8fCAocikgPT0gMTg4IHx8IChiKSA9PSA2MSB8fCAoYikgPT0gNjIgfHwJCVwKKwkgKChiKSA+PSA2NCAmJiAoYikgPD0gNjcpKQorI2RlZmluZSBJU19SQU5HRV9WX0lOVEVSQVBUSVZfRVZFTlQocikJKChyKSA9PSA0NyB8fCAocikgPT0gMTc1KQorI2VuZGlmCisKIC8qIEJNSVBTNTAwMCAqLwogI2RlZmluZSBJU19CT1RIX0NPVU5URVJTX0JNSVBTNTAwMF9FVkVOVChiKQkJCQlcCiAJKChiKSA9PSAwIHx8IChiKSA9PSAxKQpAQCAtMTQ0Miw2ICsxNDY1LDcgQEAKICNlbmRpZgogCQlicmVhazsKIAljYXNlIENQVV83NEs6CisJY2FzZSBDUFVfMTA3NEs6CiAJCWlmIChJU19CT1RIX0NPVU5URVJTXzc0S19FVkVOVChiYXNlX2lkKSkKIAkJCXJhd19ldmVudC5jbnRyX21hc2sgPSBDTlRSX0VWRU4gfCBDTlRSX09ERDsKIAkJZWxzZQpAQCAtMTQ1MSw2ICsxNDc1LDE2IEBACiAJCXJhd19ldmVudC5yYW5nZSA9IFA7CiAjZW5kaWYKIAkJYnJlYWs7CisJY2FzZSBDUFVfUFJPQVBUSVY6CisJCWlmIChJU19CT1RIX0NPVU5URVJTX1BST0FQVElWX0VWRU5UKGJhc2VfaWQpKQorCQkJcmF3X2V2ZW50LmNudHJfbWFzayA9IENOVFJfRVZFTiB8IENOVFJfT0REOworCQllbHNlCisJCQlyYXdfZXZlbnQuY250cl9tYXNrID0KKwkJCQlyYXdfaWQgPiAxMjcgPyBDTlRSX09ERCA6IENOVFJfRVZFTjsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwkJcmF3X2V2ZW50LnJhbmdlID0gUDsKKyNlbmRpZgorCQlicmVhazsKIAljYXNlIENQVV8xMDA0SzoKIAkJaWYgKElTX0JPVEhfQ09VTlRFUlNfMTAwNEtfRVZFTlQoYmFzZV9pZCkpCiAJCQlyYXdfZXZlbnQuY250cl9tYXNrID0gQ05UUl9FVkVOIHwgQ05UUl9PREQ7CkBAIC0xNDY2LDYgKzE1MDAsMjEgQEAKIAkJCXJhd19ldmVudC5yYW5nZSA9IFQ7CiAjZW5kaWYKIAkJYnJlYWs7CisJY2FzZSBDUFVfSU5URVJBUFRJVjoKKwkJaWYgKElTX0JPVEhfQ09VTlRFUlNfSU5URVJBUFRJVl9FVkVOVChiYXNlX2lkKSkKKwkJCXJhd19ldmVudC5jbnRyX21hc2sgPSBDTlRSX0VWRU4gfCBDTlRSX09ERDsKKwkJZWxzZQorCQkJcmF3X2V2ZW50LmNudHJfbWFzayA9CisJCQkJcmF3X2lkID4gMTI3ID8gQ05UUl9PREQgOiBDTlRSX0VWRU47CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCisJCWlmIChJU19SQU5HRV9QX0lOVEVSQVBUSVZfRVZFTlQocmF3X2lkLCBiYXNlX2lkKSkKKwkJCXJhd19ldmVudC5yYW5nZSA9IFA7CisJCWVsc2UgaWYgKHVubGlrZWx5KElTX1JBTkdFX1ZfSU5URVJBUFRJVl9FVkVOVChyYXdfaWQpKSkKKwkJCXJhd19ldmVudC5yYW5nZSA9IFY7CisJCWVsc2UKKwkJCXJhd19ldmVudC5yYW5nZSA9IFQ7CisjZW5kaWYKKwkJYnJlYWs7CiAJY2FzZSBDUFVfQk1JUFM1MDAwOgogCQlpZiAoSVNfQk9USF9DT1VOVEVSU19CTUlQUzUwMDBfRVZFTlQoYmFzZV9pZCkpCiAJCQlyYXdfZXZlbnQuY250cl9tYXNrID0gQ05UUl9FVkVOIHwgQ05UUl9PREQ7CkBAIC0xNTc2LDE0ICsxNjI1LDI5IEBACiAJCWJyZWFrOwogCWNhc2UgQ1BVXzc0SzoKIAkJbWlwc3BtdS5uYW1lID0gIm1pcHMvNzRLIjsKLQkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHg3NEtjb3JlX2V2ZW50X21hcDsKLQkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4NzRLY29yZV9jYWNoZV9tYXA7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXAyOworCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2NhY2hlX21hcDI7CisJCWJyZWFrOworCWNhc2UgQ1BVX1BST0FQVElWOgorCQltaXBzcG11Lm5hbWUgPSAibWlwcy9wcm9BcHRpdiI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXAyOworCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2NhY2hlX21hcDI7CiAJCWJyZWFrOwogCWNhc2UgQ1BVXzEwMDRLOgogCQltaXBzcG11Lm5hbWUgPSAibWlwcy8xMDA0SyI7CiAJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CiAJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwOwogCQlicmVhazsKKwljYXNlIENQVV8xMDc0SzoKKwkJbWlwc3BtdS5uYW1lID0gIm1pcHMvMTA3NEsiOworCQltaXBzcG11LmdlbmVyYWxfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfZXZlbnRfbWFwOworCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2NhY2hlX21hcDsKKwkJYnJlYWs7CisJY2FzZSBDUFVfSU5URVJBUFRJVjoKKwkJbWlwc3BtdS5uYW1lID0gIm1pcHMvaW50ZXJBcHRpdiI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwOworCQlicmVhazsKIAljYXNlIENQVV9MT09OR1NPTjE6CiAJCW1pcHNwbXUubmFtZSA9ICJtaXBzL2xvb25nc29uMSI7CiAJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Byb2MuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvYy5jCmluZGV4IDAwZDIwOTcuLmU0MDk3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvYy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvYy5jCkBAIC0xNyw4ICsxNywyNCBAQAogCiB1bnNpZ25lZCBpbnQgdmNlZF9jb3VudCwgdmNlaV9jb3VudDsKIAorLyoKKyAqICAqIE5vIGxvY2s7IG9ubHkgd3JpdHRlbiBkdXJpbmcgZWFybHkgYm9vdHVwIGJ5IENQVSAwLgorICogICAqLworc3RhdGljIFJBV19OT1RJRklFUl9IRUFEKHByb2NfY3B1aW5mb19jaGFpbik7CisKK2ludCBfX3JlZiByZWdpc3Rlcl9wcm9jX2NwdWluZm9fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gcmF3X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwcm9jX2NwdWluZm9fY2hhaW4sIG5iKTsKK30KKworaW50IHByb2NfY3B1aW5mb19ub3RpZmllcl9jYWxsX2NoYWluKHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQoreworCXJldHVybiByYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmcHJvY19jcHVpbmZvX2NoYWluLCB2YWwsIHYpOworfQorCiBzdGF0aWMgaW50IHNob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CisJc3RydWN0IHByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzIHByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzOwogCXVuc2lnbmVkIGxvbmcgbiA9ICh1bnNpZ25lZCBsb25nKSB2IC0gMTsKIAl1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IGNwdV9kYXRhW25dLnByb2Nlc3Nvcl9pZDsKIAl1bnNpZ25lZCBpbnQgZnBfdmVycyA9IGNwdV9kYXRhW25dLmZwdV9pZDsKQEAgLTk1LDYgKzExMSw4IEBACiAJaWYgKGNwdV9oYXNfbWlwc210KQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbXQiKTsKIAlpZiAoY3B1X2hhc19tbWlwcykJc2VxX3ByaW50ZihtLCAiJXMiLCAiIG1pY3JvbWlwcyIpOwogCWlmIChjcHVfaGFzX3Z6KQkJc2VxX3ByaW50ZihtLCAiJXMiLCAiIHZ6Iik7CisJaWYgKGNwdV9oYXNfbXNhKQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbXNhIik7CisJaWYgKGNwdV9oYXNfZXZhKQlzZXFfcHJpbnRmKG0sICIlcyIsICIgZXZhIik7CiAJc2VxX3ByaW50ZihtLCAiXG4iKTsKIAogCWlmIChjcHVfaGFzX21taXBzKSB7CkBAIC0xMTgsNiArMTM2LDEzIEBACiAJCSAgICAgIGNwdV9oYXNfdmNlID8gIiV1IiA6ICJub3QgYXZhaWxhYmxlIik7CiAJc2VxX3ByaW50ZihtLCBmbXQsICdEJywgdmNlZF9jb3VudCk7CiAJc2VxX3ByaW50ZihtLCBmbXQsICdJJywgdmNlaV9jb3VudCk7CisKKwlwcm9jX2NwdWluZm9fbm90aWZpZXJfYXJncy5tID0gbTsKKwlwcm9jX2NwdWluZm9fbm90aWZpZXJfYXJncy5uID0gbjsKKworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZwcm9jX2NwdWluZm9fY2hhaW4sIDAsCisJCQkJJnByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzKTsKKwogCXNlcV9wcmludGYobSwgIlxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNmFlNTQwZS4uNjBlMzlkYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2RzcC5oPgogI2luY2x1ZGUgPGFzbS9mcHUuaD4KKyNpbmNsdWRlIDxhc20vbXNhLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC02NSw2ICs2Niw4IEBACiAJY2xlYXJfdXNlZF9tYXRoKCk7CiAJY2xlYXJfZnB1X293bmVyKCk7CiAJaW5pdF9kc3AoKTsKKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfTVNBX0NUWF9MSVZFKTsKKwlkaXNhYmxlX21zYSgpOwogCXJlZ3MtPmNwMF9lcGMgPSBwYzsKIAlyZWdzLT5yZWdzWzI5XSA9IHNwOwogfQpAQCAtODksNyArOTIsOSBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKLQlpZiAoaXNfZnB1X293bmVyKCkpCisJaWYgKGlzX21zYV9lbmFibGVkKCkpCisJCXNhdmVfbXNhKHApOworCWVsc2UgaWYgKGlzX2ZwdV9vd25lcigpKQogCQlzYXZlX2ZwKHApOwogCiAJaWYgKGNwdV9oYXNfZHNwKQpAQCAtMTU3LDcgKzE2MiwxMyBAQAogLyogRmlsbCBpbiB0aGUgZnB1IHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLiAqLwogaW50IGR1bXBfZnB1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBlbGZfZnByZWdzZXRfdCAqcikKIHsKLQltZW1jcHkociwgJmN1cnJlbnQtPnRocmVhZC5mcHUsIHNpemVvZihjdXJyZW50LT50aHJlYWQuZnB1KSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspCisJCW1lbWNweSgmcltpXSwgJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCBzaXplb2YoKnIpKTsKKworCW1lbWNweSgmcltOVU1fRlBVX1JFR1NdLCAmY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwKKwkgICAgICAgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEpKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTkyLDcgKzIwMywxMyBAQAogCiBpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGVsZl9mcHJlZ3NldF90ICpmcHIpCiB7Ci0JbWVtY3B5KGZwciwgJnQtPnRocmVhZC5mcHUsIHNpemVvZihjdXJyZW50LT50aHJlYWQuZnB1KSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspCisJCW1lbWNweSgmZnByW2ldLCAmdC0+dGhyZWFkLmZwdS5mcHJbaV0sIHNpemVvZigqZnByKSk7CisKKwltZW1jcHkoJmZwcltOVU1fRlBVX1JFR1NdLCAmdC0+dGhyZWFkLmZwdS5mY3IzMSwKKwkgICAgICAgc2l6ZW9mKHQtPnRocmVhZC5mcHUuZmNyMzEpKTsKIAogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggN2RhOWI3Ni4uNzI3MWU1YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC0xMTQsNTEgKzExNCwzMCBAQAogaW50IHB0cmFjZV9nZXRmcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgX191MzIgX191c2VyICpkYXRhKQogewogCWludCBpOwotCXVuc2lnbmVkIGludCB0bXA7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRhdGEsIDMzICogOCkpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKHRza191c2VkX21hdGgoY2hpbGQpKSB7Ci0JCWZwdXJlZ190ICpmcmVncyA9IGdldF9mcHVfcmVncyhjaGlsZCk7CisJCXVuaW9uIGZwdXJlZyAqZnJlZ3MgPSBnZXRfZnB1X3JlZ3MoY2hpbGQpOwogCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJCV9fcHV0X3VzZXIoZnJlZ3NbaV0sIGkgKyAoX191NjQgX191c2VyICopIGRhdGEpOworCQkJX19wdXRfdXNlcihnZXRfZnByNjQoJmZyZWdzW2ldLCAwKSwKKwkJCQkgICBpICsgKF9fdTY0IF9fdXNlciAqKWRhdGEpOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQogCQkJX19wdXRfdXNlcigoX191NjQpIC0xLCBpICsgKF9fdTY0IF9fdXNlciAqKSBkYXRhKTsKIAl9CiAKIAlfX3B1dF91c2VyKGNoaWxkLT50aHJlYWQuZnB1LmZjcjMxLCBkYXRhICsgNjQpOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKGNwdV9oYXNfZnB1KSB7Ci0JCXVuc2lnbmVkIGludCBmbGFnczsKLQotCQlpZiAoY3B1X2hhc19taXBzbXQpIHsKLQkJCXVuc2lnbmVkIGludCB2cGZsYWdzID0gZHZwZSgpOwotCQkJZmxhZ3MgPSByZWFkX2MwX3N0YXR1cygpOwotCQkJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiIDogIj1yIiAodG1wKSk7Ci0JCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwotCQkJZXZwZSh2cGZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCV9fZW5hYmxlX2ZwdShGUFVfQVNfSVMpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIiA6ICI9ciIgKHRtcCkpOwotCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXRtcCA9IDA7Ci0JfQotCXByZWVtcHRfZW5hYmxlKCk7Ci0JX19wdXRfdXNlcih0bXAsIGRhdGEgKyA2NSk7CisJX19wdXRfdXNlcihjdXJyZW50X2NwdV9kYXRhLmZwdV9pZCwgZGF0YSArIDY1KTsKIAogCXJldHVybiAwOwogfQogCiBpbnQgcHRyYWNlX3NldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBfX3UzMiBfX3VzZXIgKmRhdGEpCiB7Ci0JZnB1cmVnX3QgKmZyZWdzOworCXVuaW9uIGZwdXJlZyAqZnJlZ3M7CisJdTY0IGZwcl92YWw7CiAJaW50IGk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YSwgMzMgKiA4KSkKQEAgLTE2Niw4ICsxNDUsMTAgQEAKIAogCWZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKIAotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlfX2dldF91c2VyKGZyZWdzW2ldLCBpICsgKF9fdTY0IF9fdXNlciAqKSBkYXRhKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlfX2dldF91c2VyKGZwcl92YWwsIGkgKyAoX191NjQgX191c2VyICopZGF0YSk7CisJCXNldF9mcHI2NCgmZnJlZ3NbaV0sIDAsIGZwcl92YWwpOworCX0KIAogCV9fZ2V0X3VzZXIoY2hpbGQtPnRocmVhZC5mcHUuZmNyMzEsIGRhdGEgKyA2NCk7CiAKQEAgLTMwMCwxMCArMjgxLDI3IEBACiAJCSAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKIAkJICAgdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKnVidWYpCiB7Ci0JcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCi0JCQkJICAgJnRhcmdldC0+dGhyZWFkLmZwdSwKLQkJCQkgICAwLCBzaXplb2YoZWxmX2ZwcmVnc2V0X3QpKTsKKwl1bnNpZ25lZCBpOworCWludCBlcnI7CisJdTY0IGZwcl92YWw7CisKIAkvKiBYWFggZmNyMzEgICovCisKKwlpZiAoc2l6ZW9mKHRhcmdldC0+dGhyZWFkLmZwdS5mcHJbaV0pID09IHNpemVvZihlbGZfZnByZWdfdCkpCisJCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICAmdGFyZ2V0LT50aHJlYWQuZnB1LAorCQkJCQkgICAwLCBzaXplb2YoZWxmX2ZwcmVnc2V0X3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykgeworCQlmcHJfdmFsID0gZ2V0X2ZwcjY0KCZ0YXJnZXQtPnRocmVhZC5mcHUuZnByW2ldLCAwKTsKKwkJZXJyID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAmZnByX3ZhbCwgaSAqIHNpemVvZihlbGZfZnByZWdfdCksCisJCQkJCSAgKGkgKyAxKSAqIHNpemVvZihlbGZfZnByZWdfdCkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmcHJfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LApAQCAtMzExLDEwICszMDksMjcgQEAKIAkJICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKLQlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAotCQkJCSAgJnRhcmdldC0+dGhyZWFkLmZwdSwKLQkJCQkgIDAsIHNpemVvZihlbGZfZnByZWdzZXRfdCkpOworCXVuc2lnbmVkIGk7CisJaW50IGVycjsKKwl1NjQgZnByX3ZhbDsKKwogCS8qIFhYWCBmY3IzMSAgKi8KKworCWlmIChzaXplb2YodGFyZ2V0LT50aHJlYWQuZnB1LmZwcltpXSkgPT0gc2l6ZW9mKGVsZl9mcHJlZ190KSkKKwkJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAmdGFyZ2V0LT50aHJlYWQuZnB1LAorCQkJCQkgIDAsIHNpemVvZihlbGZfZnByZWdzZXRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSsrKSB7CisJCWVyciA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICZmcHJfdmFsLCBpICogc2l6ZW9mKGVsZl9mcHJlZ190KSwKKwkJCQkJIChpICsgMSkgKiBzaXplb2YoZWxmX2ZwcmVnX3QpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXNldF9mcHI2NCgmdGFyZ2V0LT50aHJlYWQuZnB1LmZwcltpXSwgMCwgZnByX3ZhbCk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIGVudW0gbWlwc19yZWdzZXQgewpAQCAtNDA4LDcgKzQyMyw3IEBACiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewogCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKLQkJZnB1cmVnX3QgKmZyZWdzOworCQl1bmlvbiBmcHVyZWcgKmZyZWdzOwogCQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7CiAKIAkJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CkBAIC00MzMsMTQgKzQ0OCwxMiBAQAogCQkJCSAqIG9yZGVyIGJpdHMgb2YgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGV2ZW4KIAkJCQkgKiByZWdpc3RlcnMgLSB1bmxlc3Mgd2UncmUgdXNpbmcgcjJrX3N3aXRjaC5TLgogCQkJCSAqLwotCQkJCWlmIChhZGRyICYgMSkKLQkJCQkJdG1wID0gZnJlZ3NbKGFkZHIgJiB+MSkgLSAzMl0gPj4gMzI7Ci0JCQkJZWxzZQotCQkJCQl0bXAgPSBmcmVnc1thZGRyIC0gMzJdOworCQkJCXRtcCA9IGdldF9mcHIzMigmZnJlZ3NbKGFkZHIgJiB+MSkgLSBGUFJfQkFTRV0sCisJCQkJCQlhZGRyICYgMSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAjZW5kaWYKLQkJCXRtcCA9IGZyZWdzW2FkZHIgLSBGUFJfQkFTRV07CisJCQl0bXAgPSBnZXRfZnByMzIoJmZyZWdzW2FkZHIgLSBGUFJfQkFTRV0sIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUEM6CiAJCQl0bXAgPSByZWdzLT5jcDBfZXBjOwpAQCAtNDY1LDQ0ICs0NzgsMTAgQEAKIAkJY2FzZSBGUENfQ1NSOgogCQkJdG1wID0gY2hpbGQtPnRocmVhZC5mcHUuZmNyMzE7CiAJCQlicmVhazsKLQkJY2FzZSBGUENfRUlSOiB7IC8qIGltcGxlbWVudGF0aW9uIC8gdmVyc2lvbiByZWdpc3RlciAqLwotCQkJdW5zaWduZWQgaW50IGZsYWdzOwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JCQl1bnNpZ25lZCBpbnQgbXRmbGFnczsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0KLQkJCXByZWVtcHRfZGlzYWJsZSgpOwotCQkJaWYgKCFjcHVfaGFzX2ZwdSkgewotCQkJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCQkvKiBSZWFkLW1vZGlmeS13cml0ZSBvZiBTdGF0dXMgbXVzdCBiZSBhdG9taWMgKi8KLQkJCWxvY2FsX2lycV9zYXZlKGlycWZsYWdzKTsKLQkJCW10ZmxhZ3MgPSBkbXQoKTsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JCQlpZiAoY3B1X2hhc19taXBzbXQpIHsKLQkJCQl1bnNpZ25lZCBpbnQgdnBmbGFncyA9IGR2cGUoKTsKLQkJCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQkJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIjogIj1yIiAodG1wKSk7Ci0JCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKLQkJCQlldnBlKHZwZmxhZ3MpOwotCQkJfSBlbHNlIHsKLQkJCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQkJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIjogIj1yIiAodG1wKSk7Ci0JCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKLQkJCX0KLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCQllbXQobXRmbGFncyk7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShpcnFmbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJY2FzZSBGUENfRUlSOgorCQkJLyogaW1wbGVtZW50YXRpb24gLyB2ZXJzaW9uIHJlZ2lzdGVyICovCisJCQl0bXAgPSBjdXJyZW50X2NwdV9kYXRhLmZwdV9pZDsKIAkJCWJyZWFrOwotCQl9CiAJCWNhc2UgRFNQX0JBU0UgLi4uIERTUF9CQVNFICsgNTogewogCQkJZHNwcmVnX3QgKmRyZWdzOwogCkBAIC01NDgsNyArNTI3LDcgQEAKIAkJCXJlZ3MtPnJlZ3NbYWRkcl0gPSBkYXRhOwogCQkJYnJlYWs7CiAJCWNhc2UgRlBSX0JBU0UgLi4uIEZQUl9CQVNFICsgMzE6IHsKLQkJCWZwdXJlZ190ICpmcmVncyA9IGdldF9mcHVfcmVncyhjaGlsZCk7CisJCQl1bmlvbiBmcHVyZWcgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKIAogCQkJaWYgKCF0c2tfdXNlZF9tYXRoKGNoaWxkKSkgewogCQkJCS8qIEZQIG5vdCB5ZXQgdXNlZCAgKi8KQEAgLTU2MywxOSArNTQyLDEyIEBACiAJCQkJICogb3JkZXIgYml0cyBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZXZlbgogCQkJCSAqIHJlZ2lzdGVycyAtIHVubGVzcyB3ZSdyZSB1c2luZyByMmtfc3dpdGNoLlMuCiAJCQkJICovCi0JCQkJaWYgKGFkZHIgJiAxKSB7Ci0JCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdICY9Ci0JCQkJCQkweGZmZmZmZmZmOwotCQkJCQlmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSB8PQotCQkJCQkJKCh1NjQpZGF0YSkgPDwgMzI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSAmPSB+MHhmZmZmZmZmZkxMOwotCQkJCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdIHw9IGRhdGE7Ci0JCQkJfQorCQkJCXNldF9mcHIzMigmZnJlZ3NbKGFkZHIgJiB+MSkgLSBGUFJfQkFTRV0sCisJCQkJCSAgYWRkciAmIDEsIGRhdGEpOwogCQkJCWJyZWFrOwogCQkJfQogI2VuZGlmCi0JCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdID0gZGF0YTsKKwkJCXNldF9mcHI2NCgmZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSwgMCwgZGF0YSk7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIFBDOgpAQCAtNjYyLDEzICs2MzQsMTMgQEAKICAqIE5vdGlmaWNhdGlvbiBvZiBzeXN0ZW0gY2FsbCBlbnRyeS9leGl0CiAgKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLnN5c2NhbGxfdHJhY2UKICAqLwotYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2VfZW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBzeXNjYWxsKQogewogCWxvbmcgcmV0ID0gMDsKIAl1c2VyX2V4aXQoKTsKIAotCS8qIGRvIHRoZSBzZWN1cmUgY29tcHV0aW5nIGNoZWNrIGZpcnN0ICovCi0Jc2VjdXJlX2NvbXB1dGluZ19zdHJpY3QocmVncy0+cmVnc1syXSk7CisJaWYgKHNlY3VyZV9jb21wdXRpbmcoc3lzY2FsbCkgPT0gLTEpCisJCXJldHVybiAtMTsKIAogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSAmJgogCSAgICB0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZW50cnkocmVncykpCkBAIC02NzcsMTAgKzY0OSwxMSBAQAogCWlmICh1bmxpa2VseSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFUE9JTlQpKSkKIAkJdHJhY2Vfc3lzX2VudGVyKHJlZ3MsIHJlZ3MtPnJlZ3NbMl0pOwogCi0JYXVkaXRfc3lzY2FsbF9lbnRyeShfX3N5c2NhbGxfZ2V0X2FyY2goKSwKLQkJCSAgICByZWdzLT5yZWdzWzJdLAorCWF1ZGl0X3N5c2NhbGxfZW50cnkoc3lzY2FsbF9nZXRfYXJjaChjdXJyZW50LCByZWdzKSwKKwkJCSAgICBzeXNjYWxsLAogCQkJICAgIHJlZ3MtPnJlZ3NbNF0sIHJlZ3MtPnJlZ3NbNV0sCiAJCQkgICAgcmVncy0+cmVnc1s2XSwgcmVncy0+cmVnc1s3XSk7CisJcmV0dXJuIHN5c2NhbGw7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggYjhhYTJkZC4uYjQwYzNjYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtODAsNyArODAsNyBAQAogCS8qIFJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7Ci0JCWZwdXJlZ190ICpmcmVnczsKKwkJdW5pb24gZnB1cmVnICpmcmVnczsKIAkJdW5zaWduZWQgaW50IHRtcDsKIAogCQlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKQEAgLTEwMywxMyArMTAzLDExIEBACiAJCQkJICogb3JkZXIgYml0cyBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZXZlbgogCQkJCSAqIHJlZ2lzdGVycyAtIHVubGVzcyB3ZSdyZSB1c2luZyByMmtfc3dpdGNoLlMuCiAJCQkJICovCi0JCQkJaWYgKGFkZHIgJiAxKQotCQkJCQl0bXAgPSBmcmVnc1soYWRkciAmIH4xKSAtIDMyXSA+PiAzMjsKLQkJCQllbHNlCi0JCQkJCXRtcCA9IGZyZWdzW2FkZHIgLSAzMl07CisJCQkJdG1wID0gZ2V0X2ZwcjMyKCZmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSwKKwkJCQkJCWFkZHIgJiAxKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXRtcCA9IGZyZWdzW2FkZHIgLSBGUFJfQkFTRV07CisJCQl0bXAgPSBnZXRfZnByMzIoJmZyZWdzW2FkZHIgLSBGUFJfQkFTRV0sIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUEM6CiAJCQl0bXAgPSByZWdzLT5jcDBfZXBjOwpAQCAtMTI5LDQ2ICsxMjcsMTAgQEAKIAkJY2FzZSBGUENfQ1NSOgogCQkJdG1wID0gY2hpbGQtPnRocmVhZC5mcHUuZmNyMzE7CiAJCQlicmVhazsKLQkJY2FzZSBGUENfRUlSOiB7IC8qIGltcGxlbWVudGF0aW9uIC8gdmVyc2lvbiByZWdpc3RlciAqLwotCQkJdW5zaWduZWQgaW50IGZsYWdzOwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJCXVuc2lnbmVkIGludCBpcnFmbGFnczsKLQkJCXVuc2lnbmVkIGludCBtdGZsYWdzOwotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQotCQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCQlpZiAoIWNwdV9oYXNfZnB1KSB7Ci0JCQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJCQl0bXAgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkJLyogUmVhZC1tb2RpZnktd3JpdGUgb2YgU3RhdHVzIG11c3QgYmUgYXRvbWljICovCi0JCQlsb2NhbF9pcnFfc2F2ZShpcnFmbGFncyk7Ci0JCQltdGZsYWdzID0gZG10KCk7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0JCQlpZiAoY3B1X2hhc19taXBzbXQpIHsKLQkJCQl1bnNpZ25lZCBpbnQgdnBmbGFncyA9IGR2cGUoKTsKLQkJCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQkJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIjogIj1yIiAodG1wKSk7Ci0JCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKLQkJCQlldnBlKHZwZmxhZ3MpOwotCQkJfSBlbHNlIHsKLQkJCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQkJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIjogIj1yIiAodG1wKSk7Ci0JCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKLQkJCX0KLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCQllbXQobXRmbGFncyk7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShpcnFmbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJY2FzZSBGUENfRUlSOgorCQkJLyogaW1wbGVtZW50YXRpb24gLyB2ZXJzaW9uIHJlZ2lzdGVyICovCisJCQl0bXAgPSBjdXJyZW50X2NwdV9kYXRhLmZwdV9pZDsKIAkJCWJyZWFrOwotCQl9CiAJCWNhc2UgRFNQX0JBU0UgLi4uIERTUF9CQVNFICsgNTogewogCQkJZHNwcmVnX3QgKmRyZWdzOwogCkBAIC0yMzMsNyArMTk1LDcgQEAKIAkJCXJlZ3MtPnJlZ3NbYWRkcl0gPSBkYXRhOwogCQkJYnJlYWs7CiAJCWNhc2UgRlBSX0JBU0UgLi4uIEZQUl9CQVNFICsgMzE6IHsKLQkJCWZwdXJlZ190ICpmcmVncyA9IGdldF9mcHVfcmVncyhjaGlsZCk7CisJCQl1bmlvbiBmcHVyZWcgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKIAogCQkJaWYgKCF0c2tfdXNlZF9tYXRoKGNoaWxkKSkgewogCQkJCS8qIEZQIG5vdCB5ZXQgdXNlZCAgKi8KQEAgLTI0NywxOCArMjA5LDExIEBACiAJCQkJICogb3JkZXIgYml0cyBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZXZlbgogCQkJCSAqIHJlZ2lzdGVycyAtIHVubGVzcyB3ZSdyZSB1c2luZyByMmtfc3dpdGNoLlMuCiAJCQkJICovCi0JCQkJaWYgKGFkZHIgJiAxKSB7Ci0JCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdICY9Ci0JCQkJCQkweGZmZmZmZmZmOwotCQkJCQlmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSB8PQotCQkJCQkJKCh1NjQpZGF0YSkgPDwgMzI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSAmPSB+MHhmZmZmZmZmZkxMOwotCQkJCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdIHw9IGRhdGE7Ci0JCQkJfQorCQkJCXNldF9mcHIzMigmZnJlZ3NbKGFkZHIgJiB+MSkgLSBGUFJfQkFTRV0sCisJCQkJCSAgYWRkciAmIDEsIGRhdGEpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSA9IGRhdGE7CisJCQlzZXRfZnByNjQoJmZyZWdzW2FkZHIgLSBGUFJfQkFTRV0sIDAsIGRhdGEpOwogCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSBQQzoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TIGIvYXJjaC9taXBzL2tlcm5lbC9yNGtfZnB1LlMKaW5kZXggMjUzYjJmYi4uNzE4MTQyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfZnB1LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9yNGtfZnB1LlMKQEAgLTEzLDYgKzEzLDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KICNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CkBAIC0zMCwxNCArMzEsMTQgQEAKIAkuZW5kbQogCiAJLnNldAlub3Jlb3JkZXIKLQkuc2V0CW1pcHMzCisJLnNldAlhcmNoPXI0MDAwCiAKIExFQUYoX3NhdmVfZnBfY29udGV4dCkKIAljZmMxCXQxLCBmY3IzMQogCi0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQ09ORklHX01JUFMzMl9SMikKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKIAkuc2V0CXB1c2gKLSNpZmRlZiBDT05GSUdfTUlQUzMyX1IyCisjaWZkZWYgQ09ORklHX0NQVV9NSVBTMzJfUjIKIAkuc2V0CW1pcHM2NHIyCiAJbWZjMAl0MCwgQ1AwX1NUQVRVUwogCXNsbAl0MCwgdDAsIDUKQEAgLTE0NiwxMSArMTQ3LDExIEBACiAgKiAgLSBjcDEgc3RhdHVzL2NvbnRyb2wgcmVnaXN0ZXIKICAqLwogTEVBRihfcmVzdG9yZV9mcF9jb250ZXh0KQotCUVYCWx3IHQwLCBTQ19GUENfQ1NSKGEwKQorCUVYCWx3IHQxLCBTQ19GUENfQ1NSKGEwKQogCi0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQ09ORklHX01JUFMzMl9SMikKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKIAkuc2V0CXB1c2gKLSNpZmRlZiBDT05GSUdfTUlQUzMyX1IyCisjaWZkZWYgQ09ORklHX0NQVV9NSVBTMzJfUjIKIAkuc2V0CW1pcHM2NHIyCiAJbWZjMAl0MCwgQ1AwX1NUQVRVUwogCXNsbAl0MCwgdDAsIDUKQEAgLTE5MSw3ICsxOTIsNyBAQAogCUVYCWxkYzEgJGYyNiwgU0NfRlBSRUdTKzIwOChhMCkKIAlFWAlsZGMxICRmMjgsIFNDX0ZQUkVHUysyMjQoYTApCiAJRVgJbGRjMSAkZjMwLCBTQ19GUFJFR1MrMjQwKGEwKQotCWN0YzEJdDAsIGZjcjMxCisJY3RjMQl0MSwgZmNyMzEKIAlqcglyYQogCSBsaQl2MCwgMAkJCQkJIyBzdWNjZXNzCiAJRU5EKF9yZXN0b3JlX2ZwX2NvbnRleHQpCkBAIC0xOTksNyArMjAwLDcgQEAKICNpZmRlZiBDT05GSUdfTUlQUzMyX0NPTVBBVAogTEVBRihfcmVzdG9yZV9mcF9jb250ZXh0MzIpCiAJLyogUmVzdG9yZSBhbiBvMzIgc2lnY29udGV4dC4gICovCi0JRVgJbHcgdDAsIFNDMzJfRlBDX0NTUihhMCkKKwlFWAlsdyB0MSwgU0MzMl9GUENfQ1NSKGEwKQogCiAJbWZjMAl0MCwgQ1AwX1NUQVRVUwogCXNsbAl0MCwgdDAsIDUKQEAgLTIzOSwxMiArMjQwLDIyNCBAQAogCUVYCWxkYzEgJGYyNiwgU0MzMl9GUFJFR1MrMjA4KGEwKQogCUVYCWxkYzEgJGYyOCwgU0MzMl9GUFJFR1MrMjI0KGEwKQogCUVYCWxkYzEgJGYzMCwgU0MzMl9GUFJFR1MrMjQwKGEwKQotCWN0YzEJdDAsIGZjcjMxCisJY3RjMQl0MSwgZmNyMzEKIAlqcglyYQogCSBsaQl2MCwgMAkJCQkJIyBzdWNjZXNzCiAJRU5EKF9yZXN0b3JlX2ZwX2NvbnRleHQzMikKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfTVNBCisKKwkubWFjcm8Jc2F2ZV9zY19tc2FyZWcJd3IsIG9mZiwgc2MsIHRtcAorI2lmZGVmIENPTkZJR182NEJJVAorCWNvcHlfdV9kIFx0bXAsIFx3ciwgMQorCUVYIHNkCVx0bXAsIChcb2ZmKyhcd3IqOCkpKFxzYykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQorCWNvcHlfdV93IFx0bXAsIFx3ciwgMgorCUVYIHN3CVx0bXAsIChcb2ZmKyhcd3IqOCkrMCkoXHNjKQorCWNvcHlfdV93IFx0bXAsIFx3ciwgMworCUVYIHN3CVx0bXAsIChcb2ZmKyhcd3IqOCkrNCkoXHNjKQorI2Vsc2UgLyogQ09ORklHX0NQVV9CSUdfRU5ESUFOICovCisJY29weV91X3cgXHRtcCwgXHdyLCAyCisJRVggc3cJXHRtcCwgKFxvZmYrKFx3cio4KSs0KShcc2MpCisJY29weV91X3cgXHRtcCwgXHdyLCAzCisJRVggc3cJXHRtcCwgKFxvZmYrKFx3cio4KSswKShcc2MpCisjZW5kaWYKKwkuZW5kbQorCisvKgorICogaW50IF9zYXZlX21zYV9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0ICpzYykKKyAqCisgKiBTYXZlIHRoZSB1cHBlciA2NCBiaXRzIG9mIGVhY2ggdmVjdG9yIHJlZ2lzdGVyIGFsb25nIHdpdGggdGhlIE1TQV9DU1IKKyAqIHJlZ2lzdGVyIGludG8gc2MuIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBlbHNlIG5vbi16ZXJvLgorICovCitMRUFGKF9zYXZlX21zYV9jb250ZXh0KQorCXNhdmVfc2NfbXNhcmVnCTAsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTMsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTQsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTUsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTYsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTcsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTgsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTksIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEwLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxMSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTIsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEzLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTUsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE2LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNywgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTgsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE5LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMjEsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIyLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMywgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMjQsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI1LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNiwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMjcsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI4LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyOSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMzAsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTMxLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlqcglyYQorCSBsaQl2MCwgMAorCUVORChfc2F2ZV9tc2FfY29udGV4dCkKKworI2lmZGVmIENPTkZJR19NSVBTMzJfQ09NUEFUCisKKy8qCisgKiBpbnQgX3NhdmVfbXNhX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyICpzYykKKyAqCisgKiBTYXZlIHRoZSB1cHBlciA2NCBiaXRzIG9mIGVhY2ggdmVjdG9yIHJlZ2lzdGVyIGFsb25nIHdpdGggdGhlIE1TQV9DU1IKKyAqIHJlZ2lzdGVyIGludG8gc2MuIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBlbHNlIG5vbi16ZXJvLgorICovCitMRUFGKF9zYXZlX21zYV9jb250ZXh0MzIpCisJc2F2ZV9zY19tc2FyZWcJMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwk0LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTUsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJNiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwk3LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTgsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJOSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxMiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxMywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxOCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxOSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyOCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyOSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkzMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkzMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlqcglyYQorCSBsaQl2MCwgMAorCUVORChfc2F2ZV9tc2FfY29udGV4dDMyKQorCisjZW5kaWYgLyogQ09ORklHX01JUFMzMl9DT01QQVQgKi8KKworCS5tYWNybyByZXN0b3JlX3NjX21zYXJlZwl3ciwgb2ZmLCBzYywgdG1wCisjaWZkZWYgQ09ORklHXzY0QklUCisJRVggbGQJXHRtcCwgKFxvZmYrKFx3cio4KSkoXHNjKQorCWluc2VydF9kIFx3ciwgMSwgXHRtcAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCisJRVggbHcJXHRtcCwgKFxvZmYrKFx3cio4KSswKShcc2MpCisJaW5zZXJ0X3cgXHdyLCAyLCBcdG1wCisJRVggbHcJXHRtcCwgKFxvZmYrKFx3cio4KSs0KShcc2MpCisJaW5zZXJ0X3cgXHdyLCAzLCBcdG1wCisjZWxzZSAvKiBDT05GSUdfQ1BVX0JJR19FTkRJQU4gKi8KKwlFWCBsdwlcdG1wLCAoXG9mZisoXHdyKjgpKzQpKFxzYykKKwlpbnNlcnRfdyBcd3IsIDIsIFx0bXAKKwlFWCBsdwlcdG1wLCAoXG9mZisoXHdyKjgpKzApKFxzYykKKwlpbnNlcnRfdyBcd3IsIDMsIFx0bXAKKyNlbmRpZgorCS5lbmRtCisKKy8qCisgKiBpbnQgX3Jlc3RvcmVfbXNhX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgKnNjKQorICovCitMRUFGKF9yZXN0b3JlX21zYV9jb250ZXh0KQorCXJlc3RvcmVfc2NfbXNhcmVnCTAsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTEsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTIsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTMsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTQsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTUsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTYsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTcsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTgsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTksIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTEwLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxMSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTIsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTEzLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTUsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTE2LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNywgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTgsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTE5LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjEsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTIyLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMywgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjQsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTI1LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNiwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjcsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTI4LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyOSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMzAsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTMxLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlqcglyYQorCSBsaQl2MCwgMAorCUVORChfcmVzdG9yZV9tc2FfY29udGV4dCkKKworI2lmZGVmIENPTkZJR19NSVBTMzJfQ09NUEFUCisKKy8qCisgKiBpbnQgX3Jlc3RvcmVfbXNhX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyICpzYykKKyAqLworTEVBRihfcmVzdG9yZV9tc2FfY29udGV4dDMyKQorCXJlc3RvcmVfc2NfbXNhcmVnCTAsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTMsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwk1LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTYsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwk4LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTksIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTAsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTEsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTIsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTMsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTQsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTUsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTYsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTcsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTgsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTksIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjAsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjEsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjIsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjMsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjQsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjUsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjYsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjcsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjgsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjksIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMzAsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMzEsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJanIJcmEKKwkgbGkJdjAsIDAKKwlFTkQoX3Jlc3RvcmVfbXNhX2NvbnRleHQzMikKKworI2VuZGlmIC8qIENPTkZJR19NSVBTMzJfQ09NUEFUICovCisKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0hBU19NU0EgKi8KKwogCS5zZXQJcmVvcmRlcgogCiAJLnR5cGUJZmF1bHRAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcjRrX3N3aXRjaC5TIGIvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMKaW5kZXggY2M3OGRkOS4uYWJhY2FjNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMKQEAgLTI5LDE4ICsyOSw4IEBACiAjZGVmaW5lIFNUX09GRiAoX1RIUkVBRF9TSVpFIC0gMzIgLSBQVF9TSVpFICsgUFRfU1RBVFVTKQogCiAvKgotICogRlBVIGNvbnRleHQgaXMgc2F2ZWQgaWZmIHRoZSBwcm9jZXNzIGhhcyB1c2VkIGl0J3MgRlBVIGluIHRoZSBjdXJyZW50Ci0gKiB0aW1lIHNsaWNlIGFzIGluZGljYXRlZCBieSBfVElGX1VTRURGUFUuICBJbiBhbnkgY2FzZSwgdGhlIENVMSBiaXQgZm9yIHVzZXIKLSAqIHNwYWNlIFNUQVRVUyByZWdpc3RlciBzaG91bGQgYmUgMCwgc28gdGhhdCBhIHByb2Nlc3MgKmFsd2F5cyogc3RhcnRzIGl0cwotICogdXNlcmxhbmQgd2l0aCBGUFUgZGlzYWJsZWQgYWZ0ZXIgZWFjaCBjb250ZXh0IHN3aXRjaC4KLSAqCi0gKiBGUFUgd2lsbCBiZSBlbmFibGVkIGFzIHNvb24gYXMgdGhlIHByb2Nlc3MgYWNjZXNzZXMgRlBVIGFnYWluLCB0aHJvdWdoCi0gKiBkb19jcHUoKSB0cmFwLgotICovCi0KLS8qCiAgKiB0YXNrX3N0cnVjdCAqcmVzdW1lKHRhc2tfc3RydWN0ICpwcmV2LCB0YXNrX3N0cnVjdCAqbmV4dCwKLSAqCQkgICAgICAgc3RydWN0IHRocmVhZF9pbmZvICpuZXh0X3RpLCBpbnQgdXNlZGZwdSkKKyAqCQkgICAgICAgc3RydWN0IHRocmVhZF9pbmZvICpuZXh0X3RpLCBzMzIgZnBfc2F2ZSkKICAqLwogCS5hbGlnbgk1CiAJTEVBRihyZXN1bWUpCkBAIC01MCwyMyArNDAsMzcgQEAKIAlMT05HX1MJcmEsIFRIUkVBRF9SRUczMShhMCkKIAogCS8qCi0JICogY2hlY2sgaWYgd2UgbmVlZCB0byBzYXZlIEZQVSByZWdpc3RlcnMKKwkgKiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gc2F2ZSBhbnkgRlAgY29udGV4dC4gRlAgY29udGV4dCBpcyBzYXZlZAorCSAqIGlmZiB0aGUgcHJvY2VzcyBoYXMgdXNlZCB0aGUgY29udGV4dCB3aXRoIHRoZSBzY2FsYXIgRlBVIG9yIHRoZSBNU0EKKwkgKiBBU0UgaW4gdGhlIGN1cnJlbnQgdGltZSBzbGljZSwgYXMgaW5kaWNhdGVkIGJ5IF9USUZfVVNFREZQVSBhbmQKKwkgKiBfVElGX1VTRURNU0EgcmVzcGVjdGl2ZWx5LiBzd2l0Y2hfdG8gd2lsbCBoYXZlIHNldCBmcF9zYXZlCisJICogYWNjb3JkaW5nbHkgdG8gYW4gRlBfU0FWRV8gZW51bSB2YWx1ZS4KIAkgKi8KKwliZXF6CWEzLCAyZgogCi0JYmVxeglhMywgMWYKLQotCVBUUl9MCXQzLCBUQVNLX1RIUkVBRF9JTkZPKGEwKQogCS8qCi0JICogY2xlYXIgc2F2ZWQgdXNlciBzdGFjayBDVTEgYml0CisJICogV2UgZG8uIENsZWFyIHRoZSBzYXZlZCBDVTEgYml0IGZvciBwcmV2LCBzdWNoIHRoYXQgbmV4dCB0aW1lIGl0IGlzCisJICogc2NoZWR1bGVkIGl0IHdpbGwgc3RhcnQgaW4gdXNlcmxhbmQgd2l0aCB0aGUgRlBVIGRpc2FibGVkLiBJZiB0aGUKKwkgKiB0YXNrIHVzZXMgdGhlIEZQVSB0aGVuIGl0IHdpbGwgYmUgZW5hYmxlZCBhZ2FpbiB2aWEgdGhlIGRvX2NwdSB0cmFwLgorCSAqIFRoaXMgYWxsb3dzIHVzIHRvIGxhemlseSByZXN0b3JlIHRoZSBGUCBjb250ZXh0LgogCSAqLworCVBUUl9MCXQzLCBUQVNLX1RIUkVBRF9JTkZPKGEwKQogCUxPTkdfTAl0MCwgU1RfT0ZGKHQzKQogCWxpCXQxLCB+U1QwX0NVMQogCWFuZAl0MCwgdDAsIHQxCiAJTE9OR19TCXQwLCBTVF9PRkYodDMpCiAKKwkvKiBDaGVjayB3aGV0aGVyIHdlJ3JlIHNhdmluZyBzY2FsYXIgb3IgdmVjdG9yIGNvbnRleHQuICovCisJYmd0eglhMywgMWYKKworCS8qIFNhdmUgMTI4YiBNU0EgdmVjdG9yIGNvbnRleHQuICovCisJbXNhX3NhdmVfYWxsCWEwCisJYgkyZgorCisxOgkvKiBTYXZlIDMyYi82NGIgc2NhbGFyIEZQIGNvbnRleHQuICovCiAJZnB1X3NhdmVfZG91YmxlIGEwIHQwIHQxCQkjIGMwX3N0YXR1cyBwYXNzZWQgaW4gdDAKIAkJCQkJCSMgY2xvYmJlcnMgdDEKLTE6CisyOgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IpICYmICFkZWZpbmVkKENPTkZJR19TTVApCiAJUFRSX0xBCXQ4LCBfX3N0YWNrX2Noa19ndWFyZApAQCAtMTQxLDYgKzE0NSwyNiBAQAogCWpyCXJhCiAJRU5EKF9yZXN0b3JlX2ZwKQogCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfTVNBCisKKy8qCisgKiBTYXZlIGEgdGhyZWFkJ3MgTVNBIHZlY3RvciBjb250ZXh0LgorICovCitMRUFGKF9zYXZlX21zYSkKKwltc2Ffc2F2ZV9hbGwJYTAKKwlqcglyYQorCUVORChfc2F2ZV9tc2EpCisKKy8qCisgKiBSZXN0b3JlIGEgdGhyZWFkJ3MgTVNBIHZlY3RvciBjb250ZXh0LgorICovCitMRUFGKF9yZXN0b3JlX21zYSkKKwltc2FfcmVzdG9yZV9hbGwJYTAKKwlqcglyYQorCUVORChfcmVzdG9yZV9tc2EpCisKKyNlbmRpZgorCiAvKgogICogTG9hZCB0aGUgRlBVIHdpdGggc2lnbmFsbGluZyBOQU5TLiAgVGhpcyBiaXQgcGF0dGVybiB3ZSdyZSB1c2luZyBoYXMKICAqIHRoZSBwcm9wZXJ0eSB0aGF0IG5vIG1hdHRlciB3aGV0aGVyIGNvbnNpZGVyZWQgYXMgc2luZ2xlIG9yIGFzIGRvdWJsZQpAQCAtMjcwLDcgKzI5NCw3IEBACiAxOgkuc2V0ICAgIHBvcAogI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQUzMyX1IyICovCiAjZWxzZQotCS5zZXQJbWlwczMKKwkuc2V0CWFyY2g9cjQwMDAKIAlkbXRjMQl0MSwgJGYwCiAJZG10YzEJdDEsICRmMgogCWRtdGMxCXQxLCAkZjQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1jbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1jbXAuYwppbmRleCA1NmRjNjk2Li43NThmYjNjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3J0bHgtY21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LWNtcC5jCkBAIC0xMTIsNSArMTEyLDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBSVExYX0NIQU5ORUxTOyBpKyspCiAJCWRldmljZV9kZXN0cm95KG10X2NsYXNzLCBNS0RFVihtYWpvciwgaSkpOworCiAJdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3IsIFJUTFhfTU9EVUxFX05BTUUpOworCisJYXBycF9ob29rID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1tdC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LW10LmMKaW5kZXggOTFkNjFiYS4uOWMxYWNhMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LW10LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LW10LmMKQEAgLTE0NCw1ICsxNDQsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IFJUTFhfQ0hBTk5FTFM7IGkrKykKIAkJZGV2aWNlX2Rlc3Ryb3kobXRfY2xhc3MsIE1LREVWKG1ham9yLCBpKSk7CisKIAl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgUlRMWF9NT0RVTEVfTkFNRSk7CisKKwlhcHJwX2hvb2sgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCmluZGV4IGE1YjE0ZjQuLmZkYzcwYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKQEAgLTYsNiArNiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUtOTksIDIwMDAtIDAyLCAwNiBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwNCBUaGllbW8gU2V1ZmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS5oPgpAQCAtNzQsMTAgKzc1LDEwIEBACiAJLnNldCAgICBub3Jlb3JkZXIKIAkuc2V0CW5vbWFjcm8KIAotMToJbHcJdDUsIDE2KHQwKQkJIyBhcmd1bWVudCAjNSBmcm9tIHVzcAotNDoJbHcJdDYsIDIwKHQwKQkJIyBhcmd1bWVudCAjNiBmcm9tIHVzcAotMzoJbHcJdDcsIDI0KHQwKQkJIyBhcmd1bWVudCAjNyBmcm9tIHVzcAotMjoJbHcJdDgsIDI4KHQwKQkJIyBhcmd1bWVudCAjOCBmcm9tIHVzcAorMToJdXNlcl9sdyh0NSwgMTYodDApKQkJIyBhcmd1bWVudCAjNSBmcm9tIHVzcAorNDoJdXNlcl9sdyh0NiwgMjAodDApKQkJIyBhcmd1bWVudCAjNiBmcm9tIHVzcAorMzoJdXNlcl9sdyh0NywgMjQodDApKQkJIyBhcmd1bWVudCAjNyBmcm9tIHVzcAorMjoJdXNlcl9sdyh0OCwgMjgodDApKQkJIyBhcmd1bWVudCAjOCBmcm9tIHVzcAogCiAJc3cJdDUsIDE2KHNwKQkJIyBhcmd1bWVudCAjNSB0byBrc3AKIAlzdwl0NiwgMjAoc3ApCQkjIGFyZ3VtZW50ICM2IHRvIGtzcApAQCAtMTE4LDcgKzExOSwxOCBAQAogCVNBVkVfU1RBVElDCiAJbW92ZQlzMCwgdDIKIAltb3ZlCWEwLCBzcAotCWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCisKKwkvKgorCSAqIHN5c2NhbGwgbnVtYmVyIGlzIGluIHYwIHVubGVzcyB3ZSBjYWxsZWQgc3lzY2FsbChfX05SXyMjIykKKwkgKiB3aGVyZSB0aGUgcmVhbCBzeXNjYWxsIG51bWJlciBpcyBpbiBhMAorCSAqLworCWFkZGl1CWExLCB2MCwgIF9fTlJfTzMyX0xpbnV4CisJYm5legl2MCwgMWYgLyogX19OUl9zeXNjYWxsIGF0IG9mZnNldCAwICovCisJbHcJYTEsIFBUX1I0KHNwKQorCisxOglqYWwJc3lzY2FsbF90cmFjZV9lbnRlcgorCisJYmx0egl2MCwgMmYJCQkjIHNlY2NvbXAgZmFpbGVkPyBTa2lwIHN5c2NhbGwKIAogCW1vdmUJdDAsIHMwCiAJUkVTVE9SRV9TVEFUSUMKQEAgLTEzOCw3ICsxNTAsNyBAQAogCXN3CXQxLCBQVF9SMChzcCkJCSMgc2F2ZSBpdCBmb3Igc3lzY2FsbCByZXN0YXJ0aW5nCiAxOglzdwl2MCwgUFRfUjIoc3ApCQkjIHJlc3VsdAogCi0JaglzeXNjYWxsX2V4aXQKKzI6CWoJc3lzY2FsbF9leGl0CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCmluZGV4IGI1NmUyNTQuLmRkOTljMzI4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUwpAQCAtODAsOCArODAsMTEgQEAKIAlTQVZFX1NUQVRJQwogCW1vdmUJczAsIHQyCiAJbW92ZQlhMCwgc3AKKwlkYWRkaXUJYTEsIHYwLCBfX05SXzY0X0xpbnV4CiAJamFsCXN5c2NhbGxfdHJhY2VfZW50ZXIKIAorCWJsdHoJdjAsIDJmCQkJIyBzZWNjb21wIGZhaWxlZD8gU2tpcCBzeXNjYWxsCisKIAltb3ZlCXQwLCBzMAogCVJFU1RPUkVfU1RBVElDCiAJbGQJYTAsIFBUX1I0KHNwKQkJIyBSZXN0b3JlIGFyZ3VtZW50IHJlZ2lzdGVycwpAQCAtMTAyLDcgKzEwNSw3IEBACiAJc2QJdDEsIFBUX1IwKHNwKQkJIyBzYXZlIGl0IGZvciBzeXNjYWxsIHJlc3RhcnRpbmcKIDE6CXNkCXYwLCBQVF9SMihzcCkJCSMgcmVzdWx0CiAKLQlqCXN5c2NhbGxfZXhpdAorMjoJaglzeXNjYWxsX2V4aXQKIAogaWxsZWdhbF9zeXNjYWxsOgogCS8qIFRoaXMgYWxzbyBpc24ndCBhIDY0LWJpdCBzeXNjYWxsLCB0aHJvdyBhbiBlcnJvci4gICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKaW5kZXggZjdlNWI3Mi4uZjY4ZDJmNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwpAQCAtNzIsOCArNzIsMTEgQEAKIAlTQVZFX1NUQVRJQwogCW1vdmUJczAsIHQyCiAJbW92ZQlhMCwgc3AKKwlkYWRkaXUJYTEsIHYwLCBfX05SX04zMl9MaW51eAogCWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCiAKKwlibHR6CXYwLCAyZgkJCSMgc2VjY29tcCBmYWlsZWQ/IFNraXAgc3lzY2FsbAorCiAJbW92ZQl0MCwgczAKIAlSRVNUT1JFX1NUQVRJQwogCWxkCWEwLCBQVF9SNChzcCkJCSMgUmVzdG9yZSBhcmd1bWVudCByZWdpc3RlcnMKQEAgLTk0LDcgKzk3LDcgQEAKIAlzZAl0MSwgUFRfUjAoc3ApCQkjIHNhdmUgaXQgZm9yIHN5c2NhbGwgcmVzdGFydGluZwogMToJc2QJdjAsIFBUX1IyKHNwKQkJIyByZXN1bHQKIAotCWoJc3lzY2FsbF9leGl0CisyOglqCXN5c2NhbGxfZXhpdAogCiBub3RfbjMyX3NjYWxsOgogCS8qIFRoaXMgaXMgbm90IGFuIG4zMiBjb21wYXRpYmlsaXR5IHN5c2NhbGwsIHBhc3MgaXQgb24gdG8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwppbmRleCA2Nzg4NzI3ZC4uNzBmNmFjZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwpAQCAtMTEyLDcgKzExMiwyMCBAQAogCiAJbW92ZQlzMCwgdDIJCQkjIFNhdmUgc3lzY2FsbCBwb2ludGVyCiAJbW92ZQlhMCwgc3AKLQlqYWwJc3lzY2FsbF90cmFjZV9lbnRlcgorCS8qCisJICogc3lzY2FsbCBudW1iZXIgaXMgaW4gdjAgdW5sZXNzIHdlIGNhbGxlZCBzeXNjYWxsKF9fTlJfIyMjKQorCSAqIHdoZXJlIHRoZSByZWFsIHN5c2NhbGwgbnVtYmVyIGlzIGluIGEwCisJICogbm90ZTogTlJfc3lzY2FsbCBpcyB0aGUgZmlyc3QgTzMyIHN5c2NhbGwgYnV0IHRoZSBtYWNybyBpcworCSAqIG9ubHkgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIC1tYWJpPTMyIChDT05GSUdfMzJCSVQpCisJICogdGhlcmVmb3JlIF9fTlJfTzMyX0xpbnV4IGlzIHVzZWQgKDQwMDApCisJICovCisJYWRkaXUJYTEsIHYwLCAgX19OUl9PMzJfTGludXgKKwlibmV6CXYwLCAxZiAvKiBfX05SX3N5c2NhbGwgYXQgb2Zmc2V0IDAgKi8KKwlsdwlhMSwgUFRfUjQoc3ApCisKKzE6CWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCisKKwlibHR6CXYwLCAyZgkJCSMgc2VjY29tcCBmYWlsZWQ/IFNraXAgc3lzY2FsbAogCiAJbW92ZQl0MCwgczAKIAlSRVNUT1JFX1NUQVRJQwpAQCAtMTM2LDcgKzE0OSw3IEBACiAJc2QJdDEsIFBUX1IwKHNwKQkJIyBzYXZlIGl0IGZvciBzeXNjYWxsIHJlc3RhcnRpbmcKIDE6CXNkCXYwLCBQVF9SMihzcCkJCSMgcmVzdWx0CiAKLQlqCXN5c2NhbGxfZXhpdAorMjoJaglzeXNjYWxsX2V4aXQKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jCmluZGV4IDUxOTk1NjMuLjMzMTMzZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKICAqIENvcHlyaWdodCAoQykgMTk5NCAtIDIwMDAgIFJhbGYgQmFlY2hsZQogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNCwgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvY29udGV4dF90cmFja2luZy5oPgpAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgorI2luY2x1ZGUgPGFzbS9tc2EuaD4KICNpbmNsdWRlIDxhc20vc2ltLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgpAQCAtNDYsOCArNDgsOCBAQAogZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9zYXZlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYyk7CiBleHRlcm4gYXNtbGlua2FnZSBpbnQgX3Jlc3RvcmVfZnBfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKIAotZXh0ZXJuIGFzbWxpbmthZ2UgaW50IGZwdV9lbXVsYXRvcl9zYXZlX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYyk7Ci1leHRlcm4gYXNtbGlua2FnZSBpbnQgZnB1X2VtdWxhdG9yX3Jlc3RvcmVfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKK2V4dGVybiBhc21saW5rYWdlIGludCBfc2F2ZV9tc2FfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKK2V4dGVybiBhc21saW5rYWdlIGludCBfcmVzdG9yZV9tc2FfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKIAogc3RydWN0IHNpZ2ZyYW1lIHsKIAl1MzIgc2ZfYXNzWzRdOwkJLyogYXJndW1lbnQgc2F2ZSBzcGFjZSBmb3IgbzMyICovCkBAIC02NCwxNyArNjYsOTUgQEAKIH07CiAKIC8qCisgKiBUaHJlYWQgc2F2ZWQgY29udGV4dCBjb3B5IHRvL2Zyb20gYSBzaWduYWwgY29udGV4dCBwcmVzdW1lZCB0byBiZSBvbiB0aGUKKyAqIHVzZXIgc3RhY2ssIGFuZCB0aGVyZWZvcmUgYWNjZXNzZWQgd2l0aCBhcHByb3ByaWF0ZSBtYWNyb3MgZnJvbSB1YWNjZXNzLmguCisgKi8KK3N0YXRpYyBpbnQgY29weV9mcF90b19zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCit7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspIHsKKwkJZXJyIHw9CisJCSAgICBfX3B1dF91c2VyKGdldF9mcHI2NCgmY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sIDApLAorCQkJICAgICAgICZzYy0+c2NfZnByZWdzW2ldKTsKKwl9CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwgJnNjLT5zY19mcGNfY3NyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY29weV9mcF9mcm9tX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwl1NjQgZnByX3ZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykgeworCQllcnIgfD0gX19nZXRfdXNlcihmcHJfdmFsLCAmc2MtPnNjX2ZwcmVnc1tpXSk7CisJCXNldF9mcHI2NCgmY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sIDAsIGZwcl92YWwpOworCX0KKwllcnIgfD0gX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLCAmc2MtPnNjX2ZwY19jc3IpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIHNhdmUgb25seSB0aGUgdXBwZXIgNjQgYml0cyBvZiB0aGUgdmVjdG9yIHJlZ2lzdGVycywKKyAqIHNpbmNlIHRoZSBsb3dlciA2NCBiaXRzIGhhdmUgYWxyZWFkeSBiZWVuIHNhdmVkIGFzIHRoZSBzY2FsYXIgRlAgY29udGV4dC4KKyAqLworc3RhdGljIGludCBjb3B5X21zYV90b19zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCit7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspIHsKKwkJZXJyIHw9CisJCSAgICBfX3B1dF91c2VyKGdldF9mcHI2NCgmY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sIDEpLAorCQkJICAgICAgICZzYy0+c2NfbXNhcmVnc1tpXSk7CisJfQorCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUubXNhY3NyLCAmc2MtPnNjX21zYV9jc3IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb3B5X21zYV9mcm9tX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwl1NjQgdmFsOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSsrKSB7CisJCWVyciB8PSBfX2dldF91c2VyKHZhbCwgJnNjLT5zY19tc2FyZWdzW2ldKTsKKwkJc2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMSwgdmFsKTsKKwl9CisJZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5tc2Fjc3IsICZzYy0+c2NfbXNhX2Nzcik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgogICogSGVscGVyIHJvdXRpbmVzCiAgKi8KLXN0YXRpYyBpbnQgcHJvdGVjdGVkX3NhdmVfZnBfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQorc3RhdGljIGludCBwcm90ZWN0ZWRfc2F2ZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsCisJCQkJICAgICB1bnNpZ25lZCB1c2VkX21hdGgpCiB7CiAJaW50IGVycjsKKwlib29sIHNhdmVfbXNhID0gY3B1X2hhc19tc2EgJiYgKHVzZWRfbWF0aCAmIFVTRURNQVRIX01TQSk7CisjaWZuZGVmIENPTkZJR19FVkEKIAl3aGlsZSAoMSkgewogCQlsb2NrX2ZwdV9vd25lcigpOwotCQllcnIgPSBvd25fZnB1X2luYXRvbWljKDEpOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHNhdmVfZnBfY29udGV4dChzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLwotCQl1bmxvY2tfZnB1X293bmVyKCk7CisJCWlmIChpc19mcHVfb3duZXIoKSkgeworCQkJZXJyID0gc2F2ZV9mcF9jb250ZXh0KHNjKTsKKwkJCWlmIChzYXZlX21zYSAmJiAhZXJyKQorCQkJCWVyciA9IF9zYXZlX21zYV9jb250ZXh0KHNjKTsKKwkJCXVubG9ja19mcHVfb3duZXIoKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19mcHVfb3duZXIoKTsKKwkJCWVyciA9IGNvcHlfZnBfdG9fc2lnY29udGV4dChzYyk7CisJCQlpZiAoc2F2ZV9tc2EgJiYgIWVycikKKwkJCQllcnIgPSBjb3B5X21zYV90b19zaWdjb250ZXh0KHNjKTsKKwkJfQogCQlpZiAobGlrZWx5KCFlcnIpKQogCQkJYnJlYWs7CiAJCS8qIHRvdWNoIHRoZSBzaWdjb250ZXh0IGFuZCB0cnkgYWdhaW4gKi8KQEAgLTg0LDE4ICsxNjQsNDQgQEAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwkvKiByZWFsbHkgYmFkIHNpZ2NvbnRleHQgKi8KIAl9CisjZWxzZQorCS8qCisJICogRVZBIGRvZXMgbm90IGhhdmUgRlBVIEVWQSBpbnN0cnVjdGlvbnMgc28gc2F2aW5nIGZwdSBjb250ZXh0IGRpcmVjdGx5CisJICogZG9lcyBub3Qgd29yay4KKwkgKi8KKwlkaXNhYmxlX21zYSgpOworCWxvc2VfZnB1KDEpOworCWVyciA9IHNhdmVfZnBfY29udGV4dChzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLworCWlmIChzYXZlX21zYSAmJiAhZXJyKQorCQllcnIgPSBjb3B5X21zYV90b19zaWdjb250ZXh0KHNjKTsKKyNlbmRpZgogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcHJvdGVjdGVkX3Jlc3RvcmVfZnBfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQorc3RhdGljIGludCBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsCisJCQkJCXVuc2lnbmVkIHVzZWRfbWF0aCkKIHsKIAlpbnQgZXJyLCB0bXAgX19tYXliZV91bnVzZWQ7CisJYm9vbCByZXN0b3JlX21zYSA9IGNwdV9oYXNfbXNhICYmICh1c2VkX21hdGggJiBVU0VETUFUSF9NU0EpOworI2lmbmRlZiBDT05GSUdfRVZBCiAJd2hpbGUgKDEpIHsKIAkJbG9ja19mcHVfb3duZXIoKTsKLQkJZXJyID0gb3duX2ZwdV9pbmF0b21pYygwKTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSByZXN0b3JlX2ZwX2NvbnRleHQoc2MpOyAvKiB0aGlzIG1pZ2h0IGZhaWwgKi8KLQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQlpZiAoaXNfZnB1X293bmVyKCkpIHsKKwkJCWVyciA9IHJlc3RvcmVfZnBfY29udGV4dChzYyk7CisJCQlpZiAocmVzdG9yZV9tc2EgJiYgIWVycikgeworCQkJCWVuYWJsZV9tc2EoKTsKKwkJCQllcnIgPSBfcmVzdG9yZV9tc2FfY29udGV4dChzYyk7CisJCQl9IGVsc2UgeworCQkJCS8qIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlIHVzZWQgTVNBICovCisJCQkJZGlzYWJsZV9tc2EoKTsKKwkJCX0KKwkJCXVubG9ja19mcHVfb3duZXIoKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19mcHVfb3duZXIoKTsKKwkJCWVyciA9IGNvcHlfZnBfZnJvbV9zaWdjb250ZXh0KHNjKTsKKwkJCWlmICghZXJyICYmICh1c2VkX21hdGggJiBVU0VETUFUSF9NU0EpKQorCQkJCWVyciA9IGNvcHlfbXNhX2Zyb21fc2lnY29udGV4dChzYyk7CisJCX0KIAkJaWYgKGxpa2VseSghZXJyKSkKIAkJCWJyZWFrOwogCQkvKiB0b3VjaCB0aGUgc2lnY29udGV4dCBhbmQgdHJ5IGFnYWluICovCkBAIC0xMDUsNiArMjExLDE3IEBACiAJCWlmIChlcnIpCiAJCQlicmVhazsJLyogcmVhbGx5IGJhZCBzaWdjb250ZXh0ICovCiAJfQorI2Vsc2UKKwkvKgorCSAqIEVWQSBkb2VzIG5vdCBoYXZlIEZQVSBFVkEgaW5zdHJ1Y3Rpb25zIHNvIHJlc3RvcmluZyBmcHUgY29udGV4dAorCSAqIGRpcmVjdGx5IGRvZXMgbm90IHdvcmsuCisJICovCisJZW5hYmxlX21zYSgpOworCWxvc2VfZnB1KDApOworCWVyciA9IHJlc3RvcmVfZnBfY29udGV4dChzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLworCWlmIChyZXN0b3JlX21zYSAmJiAhZXJyKQorCQllcnIgPSBjb3B5X21zYV9mcm9tX3NpZ2NvbnRleHQoc2MpOworI2VuZGlmCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTM1LDcgKzI1Miw4IEBACiAJCWVyciB8PSBfX3B1dF91c2VyKHJkZHNwKERTUF9NQVNLKSwgJnNjLT5zY19kc3ApOwogCX0KIAotCXVzZWRfbWF0aCA9ICEhdXNlZF9tYXRoKCk7CisJdXNlZF9tYXRoID0gdXNlZF9tYXRoKCkgPyBVU0VETUFUSF9GUCA6IDA7CisJdXNlZF9tYXRoIHw9IHRocmVhZF9tc2FfY29udGV4dF9saXZlKCkgPyBVU0VETUFUSF9NU0EgOiAwOwogCWVyciB8PSBfX3B1dF91c2VyKHVzZWRfbWF0aCwgJnNjLT5zY191c2VkX21hdGgpOwogCiAJaWYgKHVzZWRfbWF0aCkgewpAQCAtMTQzLDcgKzI2MSw3IEBACiAJCSAqIFNhdmUgRlBVIHN0YXRlIHRvIHNpZ25hbCBjb250ZXh0LiBTaWduYWwgaGFuZGxlcgogCQkgKiB3aWxsICJpbmhlcml0IiBjdXJyZW50IEZQVSBzdGF0ZS4KIAkJICovCi0JCWVyciB8PSBwcm90ZWN0ZWRfc2F2ZV9mcF9jb250ZXh0KHNjKTsKKwkJZXJyIHw9IHByb3RlY3RlZF9zYXZlX2ZwX2NvbnRleHQoc2MsIHVzZWRfbWF0aCk7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0xNjgsMTQgKzI4NiwxNCBAQAogfQogCiBzdGF0aWMgaW50Ci1jaGVja19hbmRfcmVzdG9yZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCitjaGVja19hbmRfcmVzdG9yZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsIHVuc2lnbmVkIHVzZWRfbWF0aCkKIHsKIAlpbnQgZXJyLCBzaWc7CiAKIAllcnIgPSBzaWcgPSBmcGNzcl9wZW5kaW5nKCZzYy0+c2NfZnBjX2Nzcik7CiAJaWYgKGVyciA+IDApCiAJCWVyciA9IDA7Ci0JZXJyIHw9IHByb3RlY3RlZF9yZXN0b3JlX2ZwX2NvbnRleHQoc2MpOworCWVyciB8PSBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0KHNjLCB1c2VkX21hdGgpOwogCXJldHVybiBlcnIgPzogc2lnOwogfQogCkBAIC0yMTUsOSArMzMzLDEwIEBACiAJaWYgKHVzZWRfbWF0aCkgewogCQkvKiByZXN0b3JlIGZwdSBjb250ZXh0IGlmIHdlIGhhdmUgdXNlZCBpdCBiZWZvcmUgKi8KIAkJaWYgKCFlcnIpCi0JCQllcnIgPSBjaGVja19hbmRfcmVzdG9yZV9mcF9jb250ZXh0KHNjKTsKKwkJCWVyciA9IGNoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQoc2MsIHVzZWRfbWF0aCk7CiAJfSBlbHNlIHsKLQkJLyogc2lnbmFsIGhhbmRsZXIgbWF5IGhhdmUgdXNlZCBGUFUuICBHaXZlIGl0IHVwLiAqLworCQkvKiBzaWduYWwgaGFuZGxlciBtYXkgaGF2ZSB1c2VkIEZQVSBvciBNU0EuIERpc2FibGUgdGhlbS4gKi8KKwkJZGlzYWJsZV9tc2EoKTsKIAkJbG9zZV9mcHUoMCk7CiAJfQogCkBAIC01OTEsMjMgKzcxMCwyNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAorI2lmbmRlZiBDT05GSUdfRVZBCiBzdGF0aWMgaW50IHNtcF9zYXZlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKIHsKIAlyZXR1cm4gcmF3X2NwdV9oYXNfZnB1CiAJICAgICAgID8gX3NhdmVfZnBfY29udGV4dChzYykKLQkgICAgICAgOiBmcHVfZW11bGF0b3Jfc2F2ZV9jb250ZXh0KHNjKTsKKwkgICAgICAgOiBjb3B5X2ZwX3RvX3NpZ2NvbnRleHQoc2MpOwogfQogCiBzdGF0aWMgaW50IHNtcF9yZXN0b3JlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKIHsKIAlyZXR1cm4gcmF3X2NwdV9oYXNfZnB1CiAJICAgICAgID8gX3Jlc3RvcmVfZnBfY29udGV4dChzYykKLQkgICAgICAgOiBmcHVfZW11bGF0b3JfcmVzdG9yZV9jb250ZXh0KHNjKTsKKwkgICAgICAgOiBjb3B5X2ZwX2Zyb21fc2lnY29udGV4dChzYyk7CiB9CisjZW5kaWYgLyogQ09ORklHX0VWQSAqLwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgc2lnbmFsX3NldHVwKHZvaWQpCiB7CisjaWZuZGVmIENPTkZJR19FVkEKICNpZmRlZiBDT05GSUdfU01QCiAJLyogRm9yIG5vdyBqdXN0IGRvIHRoZSBjcHVfaGFzX2ZwdSBjaGVjayB3aGVuIHRoZSBmdW5jdGlvbnMgYXJlIGludm9rZWQgKi8KIAlzYXZlX2ZwX2NvbnRleHQgPSBzbXBfc2F2ZV9mcF9jb250ZXh0OwpAQCAtNjE3LDkgKzczOSwxMyBAQAogCQlzYXZlX2ZwX2NvbnRleHQgPSBfc2F2ZV9mcF9jb250ZXh0OwogCQlyZXN0b3JlX2ZwX2NvbnRleHQgPSBfcmVzdG9yZV9mcF9jb250ZXh0OwogCX0gZWxzZSB7Ci0JCXNhdmVfZnBfY29udGV4dCA9IGZwdV9lbXVsYXRvcl9zYXZlX2NvbnRleHQ7Ci0JCXJlc3RvcmVfZnBfY29udGV4dCA9IGZwdV9lbXVsYXRvcl9yZXN0b3JlX2NvbnRleHQ7CisJCXNhdmVfZnBfY29udGV4dCA9IGNvcHlfZnBfZnJvbV9zaWdjb250ZXh0OworCQlyZXN0b3JlX2ZwX2NvbnRleHQgPSBjb3B5X2ZwX3RvX3NpZ2NvbnRleHQ7CiAJfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKyNlbHNlCisJc2F2ZV9mcF9jb250ZXh0ID0gY29weV9mcF9mcm9tX3NpZ2NvbnRleHQ7OworCXJlc3RvcmVfZnBfY29udGV4dCA9IGNvcHlfZnBfdG9fc2lnY29udGV4dDsKICNlbmRpZgogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKaW5kZXggM2Q2MGY3Ny4uMjk5Zjk1NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9zaW0uaD4KICNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vZnB1Lmg+CisjaW5jbHVkZSA8YXNtL21zYS5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9kc3AuaD4KQEAgLTQyLDggKzQzLDggQEAKIGV4dGVybiBhc21saW5rYWdlIGludCBfc2F2ZV9mcF9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKTsKIGV4dGVybiBhc21saW5rYWdlIGludCBfcmVzdG9yZV9mcF9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKTsKIAotZXh0ZXJuIGFzbWxpbmthZ2UgaW50IGZwdV9lbXVsYXRvcl9zYXZlX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpOwotZXh0ZXJuIGFzbWxpbmthZ2UgaW50IGZwdV9lbXVsYXRvcl9yZXN0b3JlX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9zYXZlX21zYV9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKTsKK2V4dGVybiBhc21saW5rYWdlIGludCBfcmVzdG9yZV9tc2FfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYyk7CiAKIC8qCiAgKiBJbmNsdWRpbmcgPGFzbS91bmlzdGQuaD4gd291bGQgZ2l2ZSB1c2UgdGhlIDY0LWJpdCBzeXNjYWxsIG51bWJlcnMgLi4uCkBAIC03OCwxNyArNzksOTYgQEAKIH07CiAKIC8qCisgKiBUaHJlYWQgc2F2ZWQgY29udGV4dCBjb3B5IHRvL2Zyb20gYSBzaWduYWwgY29udGV4dCBwcmVzdW1lZCB0byBiZSBvbiB0aGUKKyAqIHVzZXIgc3RhY2ssIGFuZCB0aGVyZWZvcmUgYWNjZXNzZWQgd2l0aCBhcHByb3ByaWF0ZSBtYWNyb3MgZnJvbSB1YWNjZXNzLmguCisgKi8KK3N0YXRpYyBpbnQgY29weV9mcF90b19zaWdjb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCWludCBpbmMgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpID8gMiA6IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpICs9IGluYykgeworCQllcnIgfD0KKwkJICAgIF9fcHV0X3VzZXIoZ2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMCksCisJCQkgICAgICAgJnNjLT5zY19mcHJlZ3NbaV0pOworCX0KKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLCAmc2MtPnNjX2ZwY19jc3IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb3B5X2ZwX2Zyb21fc2lnY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaW5jID0gdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfRlBSRUdTKSA/IDIgOiAxOworCXU2NCBmcHJfdmFsOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSArPSBpbmMpIHsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoZnByX3ZhbCwgJnNjLT5zY19mcHJlZ3NbaV0pOworCQlzZXRfZnByNjQoJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAwLCBmcHJfdmFsKTsKKwl9CisJZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwgJnNjLT5zY19mcGNfY3NyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgd2lsbCBzYXZlIG9ubHkgdGhlIHVwcGVyIDY0IGJpdHMgb2YgdGhlIHZlY3RvciByZWdpc3RlcnMsCisgKiBzaW5jZSB0aGUgbG93ZXIgNjQgYml0cyBoYXZlIGFscmVhZHkgYmVlbiBzYXZlZCBhcyB0aGUgc2NhbGFyIEZQIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQgY29weV9tc2FfdG9fc2lnY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykgeworCQllcnIgfD0KKwkJICAgIF9fcHV0X3VzZXIoZ2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMSksCisJCQkgICAgICAgJnNjLT5zY19tc2FyZWdzW2ldKTsKKwl9CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5tc2Fjc3IsICZzYy0+c2NfbXNhX2Nzcik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNvcHlfbXNhX2Zyb21fc2lnY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwl1NjQgdmFsOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSsrKSB7CisJCWVyciB8PSBfX2dldF91c2VyKHZhbCwgJnNjLT5zY19tc2FyZWdzW2ldKTsKKwkJc2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMSwgdmFsKTsKKwl9CisJZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5tc2Fjc3IsICZzYy0+c2NfbXNhX2Nzcik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgogICogc2lnY29udGV4dCBoYW5kbGVycwogICovCi1zdGF0aWMgaW50IHByb3RlY3RlZF9zYXZlX2ZwX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpCitzdGF0aWMgaW50IHByb3RlY3RlZF9zYXZlX2ZwX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MsCisJCQkJICAgICAgIHVuc2lnbmVkIHVzZWRfbWF0aCkKIHsKIAlpbnQgZXJyOworCWJvb2wgc2F2ZV9tc2EgPSBjcHVfaGFzX21zYSAmJiAodXNlZF9tYXRoICYgVVNFRE1BVEhfTVNBKTsKIAl3aGlsZSAoMSkgewogCQlsb2NrX2ZwdV9vd25lcigpOwotCQllcnIgPSBvd25fZnB1X2luYXRvbWljKDEpOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHNhdmVfZnBfY29udGV4dDMyKHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCi0JCXVubG9ja19mcHVfb3duZXIoKTsKKwkJaWYgKGlzX2ZwdV9vd25lcigpKSB7CisJCQllcnIgPSBzYXZlX2ZwX2NvbnRleHQzMihzYyk7CisJCQlpZiAoc2F2ZV9tc2EgJiYgIWVycikKKwkJCQllcnIgPSBfc2F2ZV9tc2FfY29udGV4dDMyKHNjKTsKKwkJCXVubG9ja19mcHVfb3duZXIoKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19mcHVfb3duZXIoKTsKKwkJCWVyciA9IGNvcHlfZnBfdG9fc2lnY29udGV4dDMyKHNjKTsKKwkJCWlmIChzYXZlX21zYSAmJiAhZXJyKQorCQkJCWVyciA9IGNvcHlfbXNhX3RvX3NpZ2NvbnRleHQzMihzYyk7CisJCX0KIAkJaWYgKGxpa2VseSghZXJyKSkKIAkJCWJyZWFrOwogCQkvKiB0b3VjaCB0aGUgc2lnY29udGV4dCBhbmQgdHJ5IGFnYWluICovCkBAIC0xMDEsMTUgKzE4MSwyOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcHJvdGVjdGVkX3Jlc3RvcmVfZnBfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYykKK3N0YXRpYyBpbnQgcHJvdGVjdGVkX3Jlc3RvcmVfZnBfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYywKKwkJCQkJICB1bnNpZ25lZCB1c2VkX21hdGgpCiB7CiAJaW50IGVyciwgdG1wIF9fbWF5YmVfdW51c2VkOworCWJvb2wgcmVzdG9yZV9tc2EgPSBjcHVfaGFzX21zYSAmJiAodXNlZF9tYXRoICYgVVNFRE1BVEhfTVNBKTsKIAl3aGlsZSAoMSkgewogCQlsb2NrX2ZwdV9vd25lcigpOwotCQllcnIgPSBvd25fZnB1X2luYXRvbWljKDApOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHJlc3RvcmVfZnBfY29udGV4dDMyKHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCi0JCXVubG9ja19mcHVfb3duZXIoKTsKKwkJaWYgKGlzX2ZwdV9vd25lcigpKSB7CisJCQllcnIgPSByZXN0b3JlX2ZwX2NvbnRleHQzMihzYyk7CisJCQlpZiAocmVzdG9yZV9tc2EgJiYgIWVycikgeworCQkJCWVuYWJsZV9tc2EoKTsKKwkJCQllcnIgPSBfcmVzdG9yZV9tc2FfY29udGV4dDMyKHNjKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2lnbmFsIGhhbmRsZXIgbWF5IGhhdmUgdXNlZCBNU0EgKi8KKwkJCQlkaXNhYmxlX21zYSgpOworCQkJfQorCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQkJZXJyID0gY29weV9mcF9mcm9tX3NpZ2NvbnRleHQzMihzYyk7CisJCQlpZiAocmVzdG9yZV9tc2EgJiYgIWVycikKKwkJCQllcnIgPSBjb3B5X21zYV9mcm9tX3NpZ2NvbnRleHQzMihzYyk7CisJCX0KIAkJaWYgKGxpa2VseSghZXJyKSkKIAkJCWJyZWFrOwogCQkvKiB0b3VjaCB0aGUgc2lnY29udGV4dCBhbmQgdHJ5IGFnYWluICovCkBAIC0xNDcsNyArMjQxLDggQEAKIAkJZXJyIHw9IF9fcHV0X3VzZXIobWZsbzMoKSwgJnNjLT5zY19sbzMpOwogCX0KIAotCXVzZWRfbWF0aCA9ICEhdXNlZF9tYXRoKCk7CisJdXNlZF9tYXRoID0gdXNlZF9tYXRoKCkgPyBVU0VETUFUSF9GUCA6IDA7CisJdXNlZF9tYXRoIHw9IHRocmVhZF9tc2FfY29udGV4dF9saXZlKCkgPyBVU0VETUFUSF9NU0EgOiAwOwogCWVyciB8PSBfX3B1dF91c2VyKHVzZWRfbWF0aCwgJnNjLT5zY191c2VkX21hdGgpOwogCiAJaWYgKHVzZWRfbWF0aCkgewpAQCAtMTU1LDIwICsyNTAsMjEgQEAKIAkJICogU2F2ZSBGUFUgc3RhdGUgdG8gc2lnbmFsIGNvbnRleHQuICBTaWduYWwgaGFuZGxlcgogCQkgKiB3aWxsICJpbmhlcml0IiBjdXJyZW50IEZQVSBzdGF0ZS4KIAkJICovCi0JCWVyciB8PSBwcm90ZWN0ZWRfc2F2ZV9mcF9jb250ZXh0MzIoc2MpOworCQllcnIgfD0gcHJvdGVjdGVkX3NhdmVfZnBfY29udGV4dDMyKHNjLCB1c2VkX21hdGgpOwogCX0KIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50Ci1jaGVja19hbmRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQorY2hlY2tfYW5kX3Jlc3RvcmVfZnBfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYywKKwkJCSAgICAgICB1bnNpZ25lZCB1c2VkX21hdGgpCiB7CiAJaW50IGVyciwgc2lnOwogCiAJZXJyID0gc2lnID0gZnBjc3JfcGVuZGluZygmc2MtPnNjX2ZwY19jc3IpOwogCWlmIChlcnIgPiAwKQogCQllcnIgPSAwOwotCWVyciB8PSBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc2MpOworCWVyciB8PSBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc2MsIHVzZWRfbWF0aCk7CiAJcmV0dXJuIGVyciA/OiBzaWc7CiB9CiAKQEAgLTIwNSw5ICszMDEsMTAgQEAKIAlpZiAodXNlZF9tYXRoKSB7CiAJCS8qIHJlc3RvcmUgZnB1IGNvbnRleHQgaWYgd2UgaGF2ZSB1c2VkIGl0IGJlZm9yZSAqLwogCQlpZiAoIWVycikKLQkJCWVyciA9IGNoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQzMihzYyk7CisJCQllcnIgPSBjaGVja19hbmRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc2MsIHVzZWRfbWF0aCk7CiAJfSBlbHNlIHsKLQkJLyogc2lnbmFsIGhhbmRsZXIgbWF5IGhhdmUgdXNlZCBGUFUuICBHaXZlIGl0IHVwLiAqLworCQkvKiBzaWduYWwgaGFuZGxlciBtYXkgaGF2ZSB1c2VkIEZQVSBvciBNU0EuIERpc2FibGUgdGhlbS4gKi8KKwkJZGlzYWJsZV9tc2EoKTsKIAkJbG9zZV9mcHUoMCk7CiAJfQogCkBAIC01NjYsOCArNjYzLDggQEAKIAkJc2F2ZV9mcF9jb250ZXh0MzIgPSBfc2F2ZV9mcF9jb250ZXh0MzI7CiAJCXJlc3RvcmVfZnBfY29udGV4dDMyID0gX3Jlc3RvcmVfZnBfY29udGV4dDMyOwogCX0gZWxzZSB7Ci0JCXNhdmVfZnBfY29udGV4dDMyID0gZnB1X2VtdWxhdG9yX3NhdmVfY29udGV4dDMyOwotCQlyZXN0b3JlX2ZwX2NvbnRleHQzMiA9IGZwdV9lbXVsYXRvcl9yZXN0b3JlX2NvbnRleHQzMjsKKwkJc2F2ZV9mcF9jb250ZXh0MzIgPSBjb3B5X2ZwX3RvX3NpZ2NvbnRleHQzMjsKKwkJcmVzdG9yZV9mcF9jb250ZXh0MzIgPSBjb3B5X2ZwX2Zyb21fc2lnY29udGV4dDMyOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYwppbmRleCAxYjkyNWQ4Li4zZWY1NWZiNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMKQEAgLTM5LDU3ICszOSw5IEBACiAjaW5jbHVkZSA8YXNtL2Ftb24uaD4KICNpbmNsdWRlIDxhc20vZ2ljLmg+CiAKLXN0YXRpYyB2b2lkIGlwaV9jYWxsX2Z1bmN0aW9uKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JcHJfZGVidWcoIkNQVSVkOiAlcyBjcHUgJWQgc3RhdHVzICUwOHhcbiIsCi0JCSBzbXBfcHJvY2Vzc29yX2lkKCksIF9fZnVuY19fLCBjcHUsIHJlYWRfYzBfc3RhdHVzKCkpOwotCi0JZ2ljX3NlbmRfaXBpKHBsYXRfaXBpX2NhbGxfaW50X3hsYXRlKGNwdSkpOwotfQotCi0KLXN0YXRpYyB2b2lkIGlwaV9yZXNjaGVkKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JcHJfZGVidWcoIkNQVSVkOiAlcyBjcHUgJWQgc3RhdHVzICUwOHhcbiIsCi0JCSBzbXBfcHJvY2Vzc29yX2lkKCksIF9fZnVuY19fLCBjcHUsIHJlYWRfYzBfc3RhdHVzKCkpOwotCi0JZ2ljX3NlbmRfaXBpKHBsYXRfaXBpX3Jlc2NoZWRfaW50X3hsYXRlKGNwdSkpOwotfQotCi0vKgotICogRklYTUU6IFRoaXMgaXNuJ3QgcmVzdHJpY3RlZCB0byBDTVAKLSAqIFRoZSBTTVZQIGtlcm5lbCBjb3VsZCB1c2UgR0lDIGludGVycnVwdHMgaWYgYXZhaWxhYmxlCi0gKi8KLXZvaWQgY21wX3NlbmRfaXBpX3NpbmdsZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgU01QX0NBTExfRlVOQ1RJT046Ci0JCWlwaV9jYWxsX2Z1bmN0aW9uKGNwdSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTVBfUkVTQ0hFRFVMRV9ZT1VSU0VMRjoKLQkJaXBpX3Jlc2NoZWQoY3B1KTsKLQkJYnJlYWs7Ci0JfQotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBjbXBfc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvcl9lYWNoX2NwdShpLCBtYXNrKQotCQljbXBfc2VuZF9pcGlfc2luZ2xlKGksIGFjdGlvbik7Ci19Ci0KIHN0YXRpYyB2b2lkIGNtcF9pbml0X3NlY29uZGFyeSh2b2lkKQogewotCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKKwlzdHJ1Y3QgY3B1aW5mb19taXBzICpjIF9fbWF5YmVfdW51c2VkID0gJmN1cnJlbnRfY3B1X2RhdGE7CiAKIAkvKiBBc3N1bWUgR0lDIGlzIHByZXNlbnQgKi8KIAljaGFuZ2VfYzBfc3RhdHVzKFNUMF9JTSwgU1RBVFVTRl9JUDMgfCBTVEFUVVNGX0lQNCB8IFNUQVRVU0ZfSVA2IHwKQEAgLTk3LDcgKzQ5LDYgQEAKIAogCS8qIEVuYWJsZSBwZXItY3B1IGludGVycnVwdHM6IHBsYXRmb3JtIHNwZWNpZmljICovCiAKLQljLT5jb3JlID0gKHJlYWRfYzBfZWJhc2UoKSA+PiAxKSAmIDB4MWZmOwogI2lmIGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01QKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCiAJaWYgKGNwdV9oYXNfbWlwc210KQogCQljLT52cGVfaWQgPSAocmVhZF9jMF90Y2JpbmQoKSA+PiBUQ0JJTkRfQ1VSVlBFX1NISUZUKSAmCkBAIC0yMTAsOCArMTYxLDggQEAKIH0KIAogc3RydWN0IHBsYXRfc21wX29wcyBjbXBfc21wX29wcyA9IHsKLQkuc2VuZF9pcGlfc2luZ2xlCT0gY21wX3NlbmRfaXBpX3NpbmdsZSwKLQkuc2VuZF9pcGlfbWFzawkJPSBjbXBfc2VuZF9pcGlfbWFzaywKKwkuc2VuZF9pcGlfc2luZ2xlCT0gZ2ljX3NlbmRfaXBpX3NpbmdsZSwKKwkuc2VuZF9pcGlfbWFzawkJPSBnaWNfc2VuZF9pcGlfbWFzaywKIAkuaW5pdF9zZWNvbmRhcnkJCT0gY21wX2luaXRfc2Vjb25kYXJ5LAogCS5zbXBfZmluaXNoCQk9IGNtcF9zbXBfZmluaXNoLAogCS5jcHVzX2RvbmUJCT0gY21wX2NwdXNfZG9uZSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2ZWVjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNwcy5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBQYXVsIEJ1cnRvbiA8cGF1bC5idXJ0b25AaW1ndGVjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9taXBzLWNtLmg+CisjaW5jbHVkZSA8YXNtL21pcHMtY3BjLmg+CisjaW5jbHVkZSA8YXNtL21pcHNfbXQuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc21wLWNwcy5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3Vhc20uaD4KKworc3RhdGljIERFQ0xBUkVfQklUTUFQKGNvcmVfcG93ZXIsIE5SX0NQVVMpOworCitzdHJ1Y3QgYm9vdF9jb25maWcgbWlwc19jcHNfYm9vdGNmZzsKKworc3RhdGljIHZvaWQgaW5pdF9jb3JlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG52cGVzLCB0OworCXUzMiBtdnBjb25mMCwgdnBlY29uZjAsIHZwZWNvbnRyb2wsIHRjc3RhdHVzLCB0Y2JpbmQsIHN0YXR1czsKKworCWlmICghY3B1X2hhc19taXBzbXQpCisJCXJldHVybjsKKworCS8qIEVudGVyIFZQRSBjb25maWd1cmF0aW9uIHN0YXRlICovCisJZHZwZSgpOworCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKworCS8qIFJldHJpZXZlIHRoZSBjb3VudCBvZiBWUEVzIGluIHRoaXMgY29yZSAqLworCW12cGNvbmYwID0gcmVhZF9jMF9tdnBjb25mMCgpOworCW52cGVzID0gKChtdnBjb25mMCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQpICsgMTsKKwlzbXBfbnVtX3NpYmxpbmdzID0gbnZwZXM7CisKKwlmb3IgKHQgPSAxOyB0IDwgbnZwZXM7IHQrKykgeworCQkvKiBVc2UgYSAxOjEgbWFwcGluZyBvZiBUQyBpbmRleCB0byBWUEUgaW5kZXggKi8KKwkJc2V0dGModCk7CisKKwkJLyogQmluZCAxIFRDIHRvIHRoaXMgVlBFICovCisJCXRjYmluZCA9IHJlYWRfdGNfYzBfdGNiaW5kKCk7CisJCXRjYmluZCAmPSB+VENCSU5EX0NVUlZQRTsKKwkJdGNiaW5kIHw9IHQgPDwgVENCSU5EX0NVUlZQRV9TSElGVDsKKwkJd3JpdGVfdGNfYzBfdGNiaW5kKHRjYmluZCk7CisKKwkJLyogU2V0IGV4Y2x1c2l2ZSBUQywgbm9uLWFjdGl2ZSwgbWFzdGVyICovCisJCXZwZWNvbmYwID0gcmVhZF92cGVfYzBfdnBlY29uZjAoKTsKKwkJdnBlY29uZjAgJj0gfihWUEVDT05GMF9YVEMgfCBWUEVDT05GMF9WUEEpOworCQl2cGVjb25mMCB8PSB0IDw8IFZQRUNPTkYwX1hUQ19TSElGVDsKKwkJdnBlY29uZjAgfD0gVlBFQ09ORjBfTVZQOworCQl3cml0ZV92cGVfYzBfdnBlY29uZjAodnBlY29uZjApOworCisJCS8qIERlY2xhcmUgVEMgbm9uLWFjdGl2ZSwgbm9uLWFsbG9jYXRhYmxlICYgaW50ZXJydXB0IGV4ZW1wdCAqLworCQl0Y3N0YXR1cyA9IHJlYWRfdGNfYzBfdGNzdGF0dXMoKTsKKwkJdGNzdGF0dXMgJj0gfihUQ1NUQVRVU19BIHwgVENTVEFUVVNfREEpOworCQl0Y3N0YXR1cyB8PSBUQ1NUQVRVU19JWE1UOworCQl3cml0ZV90Y19jMF90Y3N0YXR1cyh0Y3N0YXR1cyk7CisKKwkJLyogSGFsdCB0aGUgVEMgKi8KKwkJd3JpdGVfdGNfYzBfdGNoYWx0KFRDSEFMVF9IKTsKKworCQkvKiBBbGxvdyBvbmx5IDEgVEMgdG8gZXhlY3V0ZSAqLworCQl2cGVjb250cm9sID0gcmVhZF92cGVfYzBfdnBlY29udHJvbCgpOworCQl2cGVjb250cm9sICY9IH5WUEVDT05UUk9MX1RFOworCQl3cml0ZV92cGVfYzBfdnBlY29udHJvbCh2cGVjb250cm9sKTsKKworCQkvKiBDb3B5IChtb3N0IG9mKSBTdGF0dXMgZnJvbSBWUEUgMCAqLworCQlzdGF0dXMgPSByZWFkX2MwX3N0YXR1cygpOworCQlzdGF0dXMgJj0gfihTVDBfSU0gfCBTVDBfSUUgfCBTVDBfS1NVKTsKKwkJc3RhdHVzIHw9IFNUMF9DVTA7CisJCXdyaXRlX3ZwZV9jMF9zdGF0dXMoc3RhdHVzKTsKKworCQkvKiBDb3B5IENvbmZpZyBmcm9tIFZQRSAwICovCisJCXdyaXRlX3ZwZV9jMF9jb25maWcocmVhZF9jMF9jb25maWcoKSk7CisJCXdyaXRlX3ZwZV9jMF9jb25maWc3KHJlYWRfYzBfY29uZmlnNygpKTsKKworCQkvKiBFbnN1cmUgbm8gc29mdHdhcmUgaW50ZXJydXB0cyBhcmUgcGVuZGluZyAqLworCQl3cml0ZV92cGVfYzBfY2F1c2UoMCk7CisKKwkJLyogU3luYyBDb3VudCAqLworCQl3cml0ZV92cGVfYzBfY291bnQocmVhZF9jMF9jb3VudCgpKTsKKwl9CisKKwkvKiBMZWF2ZSBWUEUgY29uZmlndXJhdGlvbiBzdGF0ZSAqLworCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY3BzX3NtcF9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGludCBuY29yZXMsIG52cGVzLCBjb3JlX3ZwZXM7CisJaW50IGMsIHY7CisJdTMyIGNvcmVfY2ZnLCAqZW50cnlfY29kZTsKKworCS8qIERldGVjdCAmIHJlY29yZCBWUEUgdG9wb2xvZ3kgKi8KKwluY29yZXMgPSBtaXBzX2NtX251bWNvcmVzKCk7CisJcHJfaW5mbygiVlBFIHRvcG9sb2d5ICIpOworCWZvciAoYyA9IG52cGVzID0gMDsgYyA8IG5jb3JlczsgYysrKSB7CisJCWlmIChjcHVfaGFzX21pcHNtdCAmJiBjb25maWdfZW5hYmxlZChDT05GSUdfTUlQU19NVF9TTVApKSB7CisJCQl3cml0ZV9nY3JfY2xfb3RoZXIoYyA8PCBDTV9HQ1JfQ3hfT1RIRVJfQ09SRU5VTV9TSEYpOworCQkJY29yZV9jZmcgPSByZWFkX2djcl9jb19jb25maWcoKTsKKwkJCWNvcmVfdnBlcyA9ICgoY29yZV9jZmcgJiBDTV9HQ1JfQ3hfQ09ORklHX1BWUEVfTVNLKSA+PgorCQkJCSAgICAgQ01fR0NSX0N4X0NPTkZJR19QVlBFX1NIRikgKyAxOworCQl9IGVsc2UgeworCQkJY29yZV92cGVzID0gMTsKKwkJfQorCisJCXByX2NvbnQoIiVjJXUiLCBjID8gJywnIDogJ3snLCBjb3JlX3ZwZXMpOworCisJCWZvciAodiA9IDA7IHYgPCBtaW5fdChpbnQsIGNvcmVfdnBlcywgTlJfQ1BVUyAtIG52cGVzKTsgdisrKSB7CisJCQljcHVfZGF0YVtudnBlcyArIHZdLmNvcmUgPSBjOworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAorCQkJY3B1X2RhdGFbbnZwZXMgKyB2XS52cGVfaWQgPSB2OworI2VuZGlmCisJCX0KKworCQludnBlcyArPSBjb3JlX3ZwZXM7CisJfQorCXByX2NvbnQoIn0gdG90YWwgJXVcbiIsIG52cGVzKTsKKworCS8qIEluZGljYXRlIHByZXNlbnQgQ1BVcyAoQ1BVIGJlaW5nIHN5bm9ueW1vdXMgd2l0aCBWUEUpICovCisJZm9yICh2ID0gMDsgdiA8IG1pbl90KHVuc2lnbmVkLCBudnBlcywgTlJfQ1BVUyk7IHYrKykgeworCQlzZXRfY3B1X3Bvc3NpYmxlKHYsIHRydWUpOworCQlzZXRfY3B1X3ByZXNlbnQodiwgdHJ1ZSk7CisJCV9fY3B1X251bWJlcl9tYXBbdl0gPSB2OworCQlfX2NwdV9sb2dpY2FsX21hcFt2XSA9IHY7CisJfQorCisJLyogQ29yZSAwIGlzIHBvd2VyZWQgdXAgKHdlJ3JlIHJ1bm5pbmcgb24gaXQpICovCisJYml0bWFwX3NldChjb3JlX3Bvd2VyLCAwLCAxKTsKKworCS8qIERpc2FibGUgTVQgLSB3ZSBvbmx5IHdhbnQgdG8gcnVuIDEgVEMgcGVyIFZQRSAqLworCWlmIChjcHVfaGFzX21pcHNtdCkKKwkJZG10KCk7CisKKwkvKiBJbml0aWFsaXNlIGNvcmUgMCAqLworCWluaXRfY29yZSgpOworCisJLyogUGF0Y2ggdGhlIHN0YXJ0IG9mIG1pcHNfY3BzX2NvcmVfZW50cnkgdG8gcHJvdmlkZSB0aGUgQ00gYmFzZSAqLworCWVudHJ5X2NvZGUgPSAodTMyICopJm1pcHNfY3BzX2NvcmVfZW50cnk7CisJVUFTTV9pX0xBKCZlbnRyeV9jb2RlLCAzLCAobG9uZyltaXBzX2NtX2Jhc2UpOworCisJLyogTWFrZSBjb3JlIDAgY29oZXJlbnQgd2l0aCBldmVyeXRoaW5nICovCisJd3JpdGVfZ2NyX2NsX2NvaGVyZW5jZSgweGZmKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNwc19wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCW1pcHNfbXRfc2V0X2NwdW9wdGlvbnMoKTsKK30KKworc3RhdGljIHZvaWQgYm9vdF9jb3JlKHN0cnVjdCBib290X2NvbmZpZyAqY2ZnKQoreworCXUzMiBhY2Nlc3M7CisKKwkvKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNvcmUgKi8KKwl3cml0ZV9nY3JfY2xfb3RoZXIoY2ZnLT5jb3JlIDw8IENNX0dDUl9DeF9PVEhFUl9DT1JFTlVNX1NIRik7CisKKwkvKiBTZXQgaXRzIHJlc2V0IHZlY3RvciAqLworCXdyaXRlX2djcl9jb19yZXNldF9iYXNlKENLU0VHMUFERFIoKHVuc2lnbmVkIGxvbmcpbWlwc19jcHNfY29yZV9lbnRyeSkpOworCisJLyogRW5zdXJlIGl0cyBjb2hlcmVuY3kgaXMgZGlzYWJsZWQgKi8KKwl3cml0ZV9nY3JfY29fY29oZXJlbmNlKDApOworCisJLyogRW5zdXJlIHRoZSBjb3JlIGNhbiBhY2Nlc3MgdGhlIEdDUnMgKi8KKwlhY2Nlc3MgPSByZWFkX2djcl9hY2Nlc3MoKTsKKwlhY2Nlc3MgfD0gMSA8PCAoQ01fR0NSX0FDQ0VTU19BQ0NFU1NFTl9TSEYgKyBjZmctPmNvcmUpOworCXdyaXRlX2djcl9hY2Nlc3MoYWNjZXNzKTsKKworCS8qIENvcHkgY2ZnICovCisJbWlwc19jcHNfYm9vdGNmZyA9ICpjZmc7CisKKwlpZiAobWlwc19jcGNfcHJlc2VudCgpKSB7CisJCS8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY29yZSAqLworCQl3cml0ZV9jcGNfY2xfb3RoZXIoY2ZnLT5jb3JlIDw8IENQQ19DeF9PVEhFUl9DT1JFTlVNX1NIRik7CisKKwkJLyogUmVzZXQgdGhlIGNvcmUgKi8KKwkJd3JpdGVfY3BjX2NvX2NtZChDUENfQ3hfQ01EX1JFU0VUKTsKKwl9IGVsc2UgeworCQkvKiBUYWtlIHRoZSBjb3JlIG91dCBvZiByZXNldCAqLworCQl3cml0ZV9nY3JfY29fcmVzZXRfcmVsZWFzZSgwKTsKKwl9CisKKwkvKiBUaGUgY29yZSBpcyBub3cgcG93ZXJlZCB1cCAqLworCWJpdG1hcF9zZXQoY29yZV9wb3dlciwgY2ZnLT5jb3JlLCAxKTsKK30KKworc3RhdGljIHZvaWQgYm9vdF92cGUodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgYm9vdF9jb25maWcgKmNmZyA9IGluZm87CisJdTMyIHRjc3RhdHVzLCB2cGVjb25mMDsKKworCS8qIEVudGVyIFZQRSBjb25maWd1cmF0aW9uIHN0YXRlICovCisJZHZwZSgpOworCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKworCXNldHRjKGNmZy0+dnBlKTsKKworCS8qIFNldCB0aGUgVEMgcmVzdGFydCBQQyAqLworCXdyaXRlX3RjX2MwX3RjcmVzdGFydCgodW5zaWduZWQgbG9uZykmc21wX2Jvb3RzdHJhcCk7CisKKwkvKiBBY3RpdmF0ZSB0aGUgVEMsIGFsbG93IGludGVycnVwdHMgKi8KKwl0Y3N0YXR1cyA9IHJlYWRfdGNfYzBfdGNzdGF0dXMoKTsKKwl0Y3N0YXR1cyAmPSB+VENTVEFUVVNfSVhNVDsKKwl0Y3N0YXR1cyB8PSBUQ1NUQVRVU19BOworCXdyaXRlX3RjX2MwX3Rjc3RhdHVzKHRjc3RhdHVzKTsKKworCS8qIENsZWFyIHRoZSBUQyBoYWx0IGJpdCAqLworCXdyaXRlX3RjX2MwX3RjaGFsdCgwKTsKKworCS8qIEFjdGl2YXRlIHRoZSBWUEUgKi8KKwl2cGVjb25mMCA9IHJlYWRfdnBlX2MwX3ZwZWNvbmYwKCk7CisJdnBlY29uZjAgfD0gVlBFQ09ORjBfVlBBOworCXdyaXRlX3ZwZV9jMF92cGVjb25mMCh2cGVjb25mMCk7CisKKwkvKiBTZXQgdGhlIHN0YWNrICYgZ2xvYmFsIHBvaW50ZXIgcmVnaXN0ZXJzICovCisJd3JpdGVfdGNfZ3ByX3NwKGNmZy0+c3ApOworCXdyaXRlX3RjX2dwcl9ncChjZmctPmdwKTsKKworCS8qIExlYXZlIFZQRSBjb25maWd1cmF0aW9uIHN0YXRlICovCisJY2xlYXJfYzBfbXZwY29udHJvbChNVlBDT05UUk9MX1ZQQyk7CisKKwkvKiBFbmFibGUgb3RoZXIgVlBFcyB0byBleGVjdXRlICovCisJZXZwZShFVlBFX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwc19ib290X3NlY29uZGFyeShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJc3RydWN0IGJvb3RfY29uZmlnIGNmZzsKKwl1bnNpZ25lZCBpbnQgcmVtb3RlOworCWludCBlcnI7CisKKwljZmcuY29yZSA9IGNwdV9kYXRhW2NwdV0uY29yZTsKKwljZmcudnBlID0gY3B1X3ZwZV9pZCgmY3B1X2RhdGFbY3B1XSk7CisJY2ZnLnBjID0gKHVuc2lnbmVkIGxvbmcpJnNtcF9ib290c3RyYXA7CisJY2ZnLnNwID0gX19LU1RLX1RPUyhpZGxlKTsKKwljZmcuZ3AgPSAodW5zaWduZWQgbG9uZyl0YXNrX3RocmVhZF9pbmZvKGlkbGUpOworCisJaWYgKCF0ZXN0X2JpdChjZmcuY29yZSwgY29yZV9wb3dlcikpIHsKKwkJLyogQm9vdCBhIFZQRSBvbiBhIHBvd2VyZWQgZG93biBjb3JlICovCisJCWJvb3RfY29yZSgmY2ZnKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjZmcuY29yZSAhPSBjdXJyZW50X2NwdV9kYXRhLmNvcmUpIHsKKwkJLyogQm9vdCBhIFZQRSBvbiBhbm90aGVyIHBvd2VyZWQgdXAgY29yZSAqLworCQlmb3IgKHJlbW90ZSA9IDA7IHJlbW90ZSA8IE5SX0NQVVM7IHJlbW90ZSsrKSB7CisJCQlpZiAoY3B1X2RhdGFbcmVtb3RlXS5jb3JlICE9IGNmZy5jb3JlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNwdV9vbmxpbmUocmVtb3RlKSkKKwkJCQlicmVhazsKKwkJfQorCQlCVUdfT04ocmVtb3RlID49IE5SX0NQVVMpOworCisJCWVyciA9IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShyZW1vdGUsIGJvb3RfdnBlLCAmY2ZnLCAxKTsKKwkJaWYgKGVycikKKwkJCXBhbmljKCJGYWlsZWQgdG8gY2FsbCByZW1vdGUgQ1BVXG4iKTsKKwkJcmV0dXJuOworCX0KKworCUJVR19PTighY3B1X2hhc19taXBzbXQpOworCisJLyogQm9vdCBhIFZQRSBvbiB0aGlzIGNvcmUgKi8KKwlib290X3ZwZSgmY2ZnKTsKK30KKworc3RhdGljIHZvaWQgY3BzX2luaXRfc2Vjb25kYXJ5KHZvaWQpCit7CisJLyogRGlzYWJsZSBNVCAtIHdlIG9ubHkgd2FudCB0byBydW4gMSBUQyBwZXIgVlBFICovCisJaWYgKGNwdV9oYXNfbWlwc210KQorCQlkbXQoKTsKKworCS8qIFRPRE86IHJldmlzaXQgdGhpcyBhc3N1bXB0aW9uIG9uY2UgaG90cGx1ZyBpcyBpbXBsZW1lbnRlZCAqLworCWlmIChjcHVfdnBlX2lkKCZjdXJyZW50X2NwdV9kYXRhKSA9PSAwKQorCQlpbml0X2NvcmUoKTsKKworCWNoYW5nZV9jMF9zdGF0dXMoU1QwX0lNLCBTVEFUVVNGX0lQMyB8IFNUQVRVU0ZfSVA0IHwKKwkJCQkgU1RBVFVTRl9JUDYgfCBTVEFUVVNGX0lQNyk7Cit9CisKK3N0YXRpYyB2b2lkIGNwc19zbXBfZmluaXNoKHZvaWQpCit7CisJd3JpdGVfYzBfY29tcGFyZShyZWFkX2MwX2NvdW50KCkgKyAoOCAqIG1pcHNfaHB0X2ZyZXF1ZW5jeSAvIEhaKSk7CisKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9GUEFGRgorCS8qIElmIHdlIGhhdmUgYW4gRlBVLCBlbnJvbGwgb3Vyc2VsdmVzIGluIHRoZSBGUFUtZnVsbCBtYXNrICovCisJaWYgKGNwdV9oYXNfZnB1KQorCQljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbXRfZnB1X2NwdW1hc2spOworI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX0ZQQUZGICovCisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwc19jcHVzX2RvbmUodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBwbGF0X3NtcF9vcHMgY3BzX3NtcF9vcHMgPSB7CisJLnNtcF9zZXR1cAkJPSBjcHNfc21wX3NldHVwLAorCS5wcmVwYXJlX2NwdXMJCT0gY3BzX3ByZXBhcmVfY3B1cywKKwkuYm9vdF9zZWNvbmRhcnkJCT0gY3BzX2Jvb3Rfc2Vjb25kYXJ5LAorCS5pbml0X3NlY29uZGFyeQkJPSBjcHNfaW5pdF9zZWNvbmRhcnksCisJLnNtcF9maW5pc2gJCT0gY3BzX3NtcF9maW5pc2gsCisJLnNlbmRfaXBpX3NpbmdsZQk9IGdpY19zZW5kX2lwaV9zaW5nbGUsCisJLnNlbmRfaXBpX21hc2sJCT0gZ2ljX3NlbmRfaXBpX21hc2ssCisJLmNwdXNfZG9uZQkJPSBjcHNfY3B1c19kb25lLAorfTsKKworaW50IHJlZ2lzdGVyX2Nwc19zbXBfb3BzKHZvaWQpCit7CisJaWYgKCFtaXBzX2NtX3ByZXNlbnQoKSkgeworCQlwcl93YXJuKCJNSVBTIENQUyBTTVAgdW5hYmxlIHRvIHByb2NlZWQgd2l0aG91dCBhIENNXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogY2hlY2sgd2UgaGF2ZSBhIEdJQyAtIHdlIG5lZWQgb25lIGZvciBJUElzICovCisJaWYgKCEocmVhZF9nY3JfZ2ljX3N0YXR1cygpICYgQ01fR0NSX0dJQ19TVEFUVVNfRVhfTVNLKSkgeworCQlwcl93YXJuKCJNSVBTIENQUyBTTVAgdW5hYmxlIHRvIHByb2NlZWQgd2l0aG91dCBhIEdJQ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZ2lzdGVyX3NtcF9vcHMoJmNwc19zbXBfb3BzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWdpYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtZ2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiMWY5MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLWdpYy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IFBhdWwgQnVydG9uIDxwYXVsLmJ1cnRvbkBpbWd0ZWMuY29tPgorICoKKyAqIEJhc2VkIG9uIHNtcC1jbXAuYzoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KKyAqICBBdXRob3I6IENocmlzIERlYXJtYW4gKGNocmlzQG1pcHMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisKKyNpbmNsdWRlIDxhc20vZ2ljLmg+CisjaW5jbHVkZSA8YXNtL3NtcC1vcHMuaD4KKwordm9pZCBnaWNfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaW50cjsKKworCXByX2RlYnVnKCJDUFUlZDogJXMgY3B1ICVkIGFjdGlvbiAldSBzdGF0dXMgJTA4eFxuIiwKKwkJIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGNwdSwgYWN0aW9uLCByZWFkX2MwX3N0YXR1cygpKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBTTVBfQ0FMTF9GVU5DVElPTjoKKwkJaW50ciA9IHBsYXRfaXBpX2NhbGxfaW50X3hsYXRlKGNwdSk7CisJCWJyZWFrOworCisJY2FzZSBTTVBfUkVTQ0hFRFVMRV9ZT1VSU0VMRjoKKwkJaW50ciA9IHBsYXRfaXBpX3Jlc2NoZWRfaW50X3hsYXRlKGNwdSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJZ2ljX3NlbmRfaXBpKGludHIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwordm9pZCBnaWNfc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvcl9lYWNoX2NwdShpLCBtYXNrKQorCQlnaWNfc2VuZF9pcGlfc2luZ2xlKGksIGFjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYwppbmRleCAwZmI4Y2VmLi5mOGUxMzE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKQEAgLTExMywyNyArMTEzLDYgQEAKIAl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOwogfQogCi0jaWZkZWYgQ09ORklHX0lSUV9HSUMKLXN0YXRpYyB2b2lkIG1wX3NlbmRfaXBpX3NpbmdsZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgU01QX0NBTExfRlVOQ1RJT046Ci0JCWdpY19zZW5kX2lwaShwbGF0X2lwaV9jYWxsX2ludF94bGF0ZShjcHUpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGOgotCQlnaWNfc2VuZF9pcGkocGxhdF9pcGlfcmVzY2hlZF9pbnRfeGxhdGUoY3B1KSk7Ci0JCWJyZWFrOwotCX0KLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgdm9pZCB2c21wX3NlbmRfaXBpX3NpbmdsZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCWludCBpOwpAQCAtMTQyLDcgKzEyMSw3IEBACiAKICNpZmRlZiBDT05GSUdfSVJRX0dJQwogCWlmIChnaWNfcHJlc2VudCkgewotCQltcF9zZW5kX2lwaV9zaW5nbGUoY3B1LCBhY3Rpb24pOworCQlnaWNfc2VuZF9pcGlfc2luZ2xlKGNwdSwgYWN0aW9uKTsKIAkJcmV0dXJuOwogCX0KICNlbmRpZgpAQCAtMzEzLDMgKzI5MiwyNSBAQAogCS5zbXBfc2V0dXAJCT0gdnNtcF9zbXBfc2V0dXAsCiAJLnByZXBhcmVfY3B1cwkJPSB2c21wX3ByZXBhcmVfY3B1cywKIH07CisKK3N0YXRpYyBpbnQgcHJvY19jcHVpbmZvX2NoYWluX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCisJdW5zaWduZWQgbG9uZyBhY3Rpb25fdW51c2VkLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcm9jX2NwdWluZm9fbm90aWZpZXJfYXJncyAqcGNuID0gZGF0YTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBwY24tPm07CisJdW5zaWduZWQgbG9uZyBuID0gcGNuLT5uOworCisJaWYgKCFjcHVfaGFzX21pcHNtdCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCXNlcV9wcmludGYobSwgIlZQRVx0XHRcdDogJWRcbiIsIGNwdV9kYXRhW25dLnZwZV9pZCk7CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX2NwdWluZm9fbm90aWZpZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBwcm9jX2NwdWluZm9fbm90aWZpZXIocHJvY19jcHVpbmZvX2NoYWluX2NhbGwsIDApOworfQorCitzdWJzeXNfaW5pdGNhbGwocHJvY19jcHVpbmZvX25vdGlmaWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLXByb2MuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1wcm9jLmMKaW5kZXggYzEwYWE4NC4uMzg2MzVhOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLXByb2MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtdGMtcHJvYy5jCkBAIC03NywzICs3NywyNiBAQAogCiAJcHJvY19jcmVhdGUoInNtdGMiLCAwNDQ0LCBOVUxMLCAmc210Y19wcm9jX2ZvcHMpOwogfQorCitzdGF0aWMgaW50IHByb2NfY3B1aW5mb19jaGFpbl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCXVuc2lnbmVkIGxvbmcgYWN0aW9uX3VudXNlZCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19jcHVpbmZvX25vdGlmaWVyX2FyZ3MgKnBjbiA9IGRhdGE7CisJc3RydWN0IHNlcV9maWxlICptID0gcGNuLT5tOworCXVuc2lnbmVkIGxvbmcgbiA9IHBjbi0+bjsKKworCWlmICghY3B1X2hhc19taXBzbXQpCisJCXJldHVybiBOT1RJRllfT0s7CisKKwlzZXFfcHJpbnRmKG0sICJWUEVcdFx0XHQ6ICVkXG4iLCBjcHVfZGF0YVtuXS52cGVfaWQpOworCXNlcV9wcmludGYobSwgIlRDXHRcdFx0OiAlZFxuIiwgY3B1X2RhdGFbbl0udGNfaWQpOworCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvY19jcHVpbmZvX25vdGlmaWVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcHJvY19jcHVpbmZvX25vdGlmaWVyKHByb2NfY3B1aW5mb19jaGFpbl9jYWxsLCAwKTsKK30KKworc3Vic3lzX2luaXRjYWxsKHByb2NfY3B1aW5mb19ub3RpZmllcl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKaW5kZXggZGZjMWI5MS4uYzE2ODFkNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJaW50IGlycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgMTsKIAogCWlycV9lbnRlcigpOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJY2QgPSAmcGVyX2NwdShtaXBzX2Nsb2NrZXZlbnRfZGV2aWNlLCBjcHUpOwogCWNkLT5ldmVudF9oYW5kbGVyKGNkKTsKIAlpcnFfZXhpdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zcHJhbS5jIGIvYXJjaC9taXBzL2tlcm5lbC9zcHJhbS5jCmluZGV4IGIyNDJlMmMuLjY3ZjI0OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3ByYW0uYworKysgYi9hcmNoL21pcHMva2VybmVsL3NwcmFtLmMKQEAgLTE5NywxNiArMTk3LDE3IEBACiB9CiB2b2lkIHNwcmFtX2NvbmZpZyh2b2lkKQogewotCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgY29uZmlnMDsKIAotCXN3aXRjaCAoYy0+Y3B1dHlwZSkgeworCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CiAJY2FzZSBDUFVfMjRLOgogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV83NEs6CiAJY2FzZSBDUFVfMTAwNEs6CisJY2FzZSBDUFVfMTA3NEs6CiAJY2FzZSBDUFVfSU5URVJBUFRJVjoKIAljYXNlIENQVV9QUk9BUFRJVjoKKwljYXNlIENQVV9QNTYwMDoKIAkJY29uZmlnMCA9IHJlYWRfYzBfY29uZmlnKCk7CiAJCS8qIEZJWE1FOiBhZGRyZXNzZXMgYXJlIE1hbHRhIHNwZWNpZmljICovCiAJCWlmIChjb25maWcwICYgKDE8PDI0KSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCBiNzlkMTNmLi40YTRmOWRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiCWxpCSVbZXJyXSwgMAkJCQlcbiIKIAkJIjE6CWxsCSVbb2xkXSwgKCVbYWRkcl0pCQkJXG4iCiAJCSIJbW92ZQklW3RtcF0sICVbbmV3XQkJCQlcbiIKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQk6ICJtZW1vcnkiKTsKIAl9IGVsc2UgaWYgKGNwdV9oYXNfbGxzYykgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiCWxpCSVbZXJyXSwgMAkJCQlcbiIKIAkJIjE6CWxsCSVbb2xkXSwgKCVbYWRkcl0pCQkJXG4iCiAJCSIJbW92ZQklW3RtcF0sICVbbmV3XQkJCQlcbiIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCBlMGI0OTk2Li4wNzRlODU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBLZXZpbiBELiBLaXNzZWxsLCBrZXZpbmtAbWlwcy5jb20gYW5kIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQogICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3ICBNYWNpZWogVy4gUm96eWNraQogICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDEyIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KQEAgLTQ3LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgogI2luY2x1ZGUgPGFzbS9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vbXNhLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CkBAIC03Nyw4ICs3OSwxMCBAQAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfY3B1KHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfb3Yodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV90cih2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX21zYV9mcGUodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9mcGUodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9mdGxiKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfbXNhKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfbWRteCh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX3dhdGNoKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfbXQodm9pZCk7CkBAIC04NjEsNiArODY1LDExIEBACiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGVwYzsKIAl1MTYgaW5zdHJbMl07CisJbW1fc2VnbWVudF90IHNlZzsKKworCXNlZyA9IGdldF9mcygpOworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlzZXRfZnMoS0VSTkVMX0RTKTsKIAogCXByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKIAlpZiAoZ2V0X2lzYTE2X21vZGUocmVncy0+Y3AwX2VwYykpIHsKQEAgLTg3MCwxNyArODc5LDE5IEBACiAJCQlpZiAoKF9fZ2V0X3VzZXIoaW5zdHJbMF0sICh1MTYgX191c2VyICopbXNrX2lzYTE2X21vZGUoZXBjKSkgfHwKIAkJCSAgICAoX19nZXRfdXNlcihpbnN0clsxXSwgKHUxNiBfX3VzZXIgKiltc2tfaXNhMTZfbW9kZShlcGMgKyAyKSkpKSkKIAkJCQlnb3RvIG91dF9zaWdzZWd2OwotCQkgICAgb3Bjb2RlID0gKGluc3RyWzBdIDw8IDE2KSB8IGluc3RyWzFdOworCQkJb3Bjb2RlID0gKGluc3RyWzBdIDw8IDE2KSB8IGluc3RyWzFdOwogCQl9IGVsc2UgewotCQkgICAgLyogTUlQUzE2ZSBtb2RlICovCi0JCSAgICBpZiAoX19nZXRfdXNlcihpbnN0clswXSwgKHUxNiBfX3VzZXIgKiltc2tfaXNhMTZfbW9kZShlcGMpKSkKKwkJCS8qIE1JUFMxNmUgbW9kZSAqLworCQkJaWYgKF9fZ2V0X3VzZXIoaW5zdHJbMF0sCisJCQkJICAgICAgICh1MTYgX191c2VyICopbXNrX2lzYTE2X21vZGUoZXBjKSkpCiAJCQkJZ290byBvdXRfc2lnc2VndjsKLQkJICAgIGJjb2RlID0gKGluc3RyWzBdID4+IDYpICYgMHgzZjsKLQkJICAgIGRvX3RyYXBfb3JfYnAocmVncywgYmNvZGUsICJCcmVhayIpOwotCQkgICAgZ290byBvdXQ7CisJCQliY29kZSA9IChpbnN0clswXSA+PiA2KSAmIDB4M2Y7CisJCQlkb190cmFwX29yX2JwKHJlZ3MsIGJjb2RlLCAiQnJlYWsiKTsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBleGNlcHRpb25fZXBjKHJlZ3MpKSkKKwkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopIGV4Y2VwdGlvbl9lcGMocmVncykpKQogCQkJZ290byBvdXRfc2lnc2VndjsKIAl9CiAKQEAgLTkxOCw2ICs5MjksNyBAQAogCWRvX3RyYXBfb3JfYnAocmVncywgYmNvZGUsICJCcmVhayIpOwogCiBvdXQ6CisJc2V0X2ZzKHNlZyk7CiAJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiAJcmV0dXJuOwogCkBAIC05MzEsOCArOTQzLDEzIEBACiAJdTMyIG9wY29kZSwgdGNvZGUgPSAwOwogCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGU7CiAJdTE2IGluc3RyWzJdOworCW1tX3NlZ21lbnRfdCBzZWc7CiAJdW5zaWduZWQgbG9uZyBlcGMgPSBtc2tfaXNhMTZfbW9kZShleGNlcHRpb25fZXBjKHJlZ3MpKTsKIAorCXNlZyA9IGdldF9mcygpOworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlzZXRfZnMoZ2V0X2RzKCkpOworCiAJcHJldl9zdGF0ZSA9IGV4Y2VwdGlvbl9lbnRlcigpOwogCWlmIChnZXRfaXNhMTZfbW9kZShyZWdzLT5jcDBfZXBjKSkgewogCQlpZiAoX19nZXRfdXNlcihpbnN0clswXSwgKHUxNiBfX3VzZXIgKikoZXBjICsgMCkpIHx8CkBAIC05NTMsNiArOTcwLDcgQEAKIAlkb190cmFwX29yX2JwKHJlZ3MsIHRjb2RlLCAiVHJhcCIpOwogCiBvdXQ6CisJc2V0X2ZzKHNlZyk7CiAJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiAJcmV0dXJuOwogCkBAIC0xMDc0LDYgKzEwOTIsNzYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCitzdGF0aWMgaW50IGVuYWJsZV9yZXN0b3JlX2ZwX2NvbnRleHQoaW50IG1zYSkKK3sKKwlpbnQgZXJyLCB3YXNfZnB1X293bmVyOworCisJaWYgKCF1c2VkX21hdGgoKSkgeworCQkvKiBGaXJzdCB0aW1lIEZQIGNvbnRleHQgdXNlci4gKi8KKwkJZXJyID0gaW5pdF9mcHUoKTsKKwkJaWYgKG1zYSAmJiAhZXJyKQorCQkJZW5hYmxlX21zYSgpOworCQlpZiAoIWVycikKKwkJCXNldF91c2VkX21hdGgoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIFRoaXMgdGFzayBoYXMgZm9ybWVybHkgdXNlZCB0aGUgRlAgY29udGV4dC4KKwkgKgorCSAqIElmIHRoaXMgdGhyZWFkIGhhcyBubyBsaXZlIE1TQSB2ZWN0b3IgY29udGV4dCB0aGVuIHdlIGNhbiBzaW1wbHkKKwkgKiByZXN0b3JlIHRoZSBzY2FsYXIgRlAgY29udGV4dC4gSWYgaXQgaGFzIGxpdmUgTVNBIHZlY3RvciBjb250ZXh0CisJICogKHRoYXQgaXMsIGl0IGhhcyBvciBtYXkgaGF2ZSB1c2VkIE1TQSBzaW5jZSBsYXN0IHBlcmZvcm1pbmcgYQorCSAqIGZ1bmN0aW9uIGNhbGwpIHRoZW4gd2UnbGwgbmVlZCB0byByZXN0b3JlIHRoZSB2ZWN0b3IgY29udGV4dC4gVGhpcworCSAqIGFwcGxpZXMgZXZlbiBpZiB3ZSdyZSBjdXJyZW50bHkgb25seSBleGVjdXRpbmcgYSBzY2FsYXIgRlAKKwkgKiBpbnN0cnVjdGlvbi4gVGhpcyBpcyBiZWNhdXNlIGlmIHdlIHdlcmUgdG8gbGF0ZXIgZXhlY3V0ZSBhbiBNU0EKKwkgKiBpbnN0cnVjdGlvbiB0aGVuIHdlJ2QgZWl0aGVyIGhhdmUgdG86CisJICoKKwkgKiAgLSBSZXN0b3JlIHRoZSB2ZWN0b3IgY29udGV4dCAmIGNsb2JiZXIgYW55IHJlZ2lzdGVycyBtb2RpZmllZCBieQorCSAqICAgIHNjYWxhciBGUCBpbnN0cnVjdGlvbnMgYmV0d2VlbiBub3cgJiB0aGVuLgorCSAqCisJICogb3IKKwkgKgorCSAqICAtIE5vdCByZXN0b3JlIHRoZSB2ZWN0b3IgY29udGV4dCAmIGxvc2UgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cworCSAqICAgIG9mIGFsbCB2ZWN0b3IgcmVnaXN0ZXJzLgorCSAqCisJICogTmVpdGhlciBvZiB0aG9zZSBvcHRpb25zIGlzIGFjY2VwdGFibGUuIFdlIGNhbm5vdCByZXN0b3JlIHRoZSBsZWFzdAorCSAqIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHJlZ2lzdGVycyBub3cgJiBvbmx5IHJlc3RvcmUgdGhlIG1vc3QKKwkgKiBzaWduaWZpY2FudCBiaXRzIGxhdGVyIGJlY2F1c2UgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBhbnkKKwkgKiB2ZWN0b3IgcmVnaXN0ZXJzIHdob3NlIGFsaWFzZWQgRlAgcmVnaXN0ZXIgaXMgbW9kaWZpZWQgbm93IHdpbGwgaGF2ZQorCSAqIGJlZW4gemVyb2VkLiBXZSdkIGhhdmUgbm8gd2F5IHRvIGtub3cgdGhhdCB3aGVuIHJlc3RvcmluZyB0aGUgdmVjdG9yCisJICogY29udGV4dCAmIHRodXMgbWF5IGxvYWQgYW4gb3V0ZGF0ZWQgdmFsdWUgZm9yIHRoZSBtb3N0IHNpZ25pZmljYW50CisJICogYml0cyBvZiBhIHZlY3RvciByZWdpc3Rlci4KKwkgKi8KKwlpZiAoIW1zYSAmJiAhdGhyZWFkX21zYV9jb250ZXh0X2xpdmUoKSkKKwkJcmV0dXJuIG93bl9mcHUoMSk7CisKKwkvKgorCSAqIFRoaXMgdGFzayBpcyB1c2luZyBvciBoYXMgcHJldmlvdXNseSB1c2VkIE1TQS4gVGh1cyB3ZSByZXF1aXJlCisJICogdGhhdCBTdGF0dXMuRlIgPT0gMS4KKwkgKi8KKwl3YXNfZnB1X293bmVyID0gaXNfZnB1X293bmVyKCk7CisJZXJyID0gb3duX2ZwdSgwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZW5hYmxlX21zYSgpOworCXdyaXRlX21zYV9jc3IoY3VycmVudC0+dGhyZWFkLmZwdS5tc2Fjc3IpOworCXNldF90aHJlYWRfZmxhZyhUSUZfVVNFRE1TQSk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhhdCB0aGUgdGFzayBpcyB1c2luZyBNU0EgYW5kIGl0IGhhcworCSAqIHByZXZpb3VzbHkgdXNlZCBzY2FsYXIgRlAgaW4gdGhpcyB0aW1lIHNsaWNlIHRoZW4gd2UgYWxyZWFkeSBuYXZlCisJICogRlAgY29udGV4dCB3aGljaCB3ZSBzaG91bGRuJ3QgY2xvYmJlci4KKwkgKi8KKwlpZiAoIXRlc3RfYW5kX3NldF90aHJlYWRfZmxhZyhUSUZfTVNBX0NUWF9MSVZFKSAmJiB3YXNfZnB1X293bmVyKQorCQlyZXR1cm4gMDsKKworCS8qIFdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgdmVjdG9yIGNvbnRleHQuICovCisJcmVzdG9yZV9tc2EoY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKIGFzbWxpbmthZ2Ugdm9pZCBkb19jcHUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKQEAgLTExNTMsMTIgKzEyNDEsNyBAQAogCQkvKiBGYWxsIHRocm91Z2guICAqLwogCiAJY2FzZSAxOgotCQlpZiAodXNlZF9tYXRoKCkpCS8qIFVzaW5nIHRoZSBGUFUgYWdhaW4uCSAqLwotCQkJZXJyID0gb3duX2ZwdSgxKTsKLQkJZWxzZSB7CQkJLyogRmlyc3QgdGltZSBGUFUgdXNlci4JICovCi0JCQllcnIgPSBpbml0X2ZwdSgpOwotCQkJc2V0X3VzZWRfbWF0aCgpOwotCQl9CisJCWVyciA9IGVuYWJsZV9yZXN0b3JlX2ZwX2NvbnRleHQoMCk7CiAKIAkJaWYgKCFyYXdfY3B1X2hhc19mcHUgfHwgZXJyKSB7CiAJCQlpbnQgc2lnOwpAQCAtMTE4Myw2ICsxMjY2LDM3IEBACiAJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiB9CiAKK2FzbWxpbmthZ2Ugdm9pZCBkb19tc2FfZnBlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGU7CisKKwlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CisJZGllX2lmX2tlcm5lbCgiZG9fbXNhX2ZwZSBpbnZva2VkIGZyb20ga2VybmVsIGNvbnRleHQhIiwgcmVncyk7CisJZm9yY2Vfc2lnKFNJR0ZQRSwgY3VycmVudCk7CisJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19tc2Eoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKKwlpbnQgZXJyOworCisJcHJldl9zdGF0ZSA9IGV4Y2VwdGlvbl9lbnRlcigpOworCisJaWYgKCFjcHVfaGFzX21zYSB8fCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpKSB7CisJCWZvcmNlX3NpZyhTSUdJTEwsIGN1cnJlbnQpOworCQlnb3RvIG91dDsKKwl9CisKKwlkaWVfaWZfa2VybmVsKCJkb19tc2EgaW52b2tlZCBmcm9tIGtlcm5lbCBjb250ZXh0ISIsIHJlZ3MpOworCisJZXJyID0gZW5hYmxlX3Jlc3RvcmVfZnBfY29udGV4dCgxKTsKKwlpZiAoZXJyKQorCQlmb3JjZV9zaWcoU0lHSUxMLCBjdXJyZW50KTsKK291dDoKKwlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKK30KKwogYXNtbGlua2FnZSB2b2lkIGRvX21kbXgoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKQEAgLTEzMzcsOCArMTQ1MSwxMCBAQAogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV83NEs6CiAJY2FzZSBDUFVfMTAwNEs6CisJY2FzZSBDUFVfMTA3NEs6CiAJY2FzZSBDUFVfSU5URVJBUFRJVjoKIAljYXNlIENQVV9QUk9BUFRJVjoKKwljYXNlIENQVV9QNTYwMDoKIAkJewogI2RlZmluZSBFUlJDVExfUEUJMHg4MDAwMDAwMAogI2RlZmluZSBFUlJDVExfTDJQCTB4MDA4MDAwMDAKQEAgLTIwMTcsNiArMjEzMyw3IEBACiAJc2V0X2V4Y2VwdF92ZWN0b3IoMTEsIGhhbmRsZV9jcHUpOwogCXNldF9leGNlcHRfdmVjdG9yKDEyLCBoYW5kbGVfb3YpOwogCXNldF9leGNlcHRfdmVjdG9yKDEzLCBoYW5kbGVfdHIpOworCXNldF9leGNlcHRfdmVjdG9yKDE0LCBoYW5kbGVfbXNhX2ZwZSk7CiAKIAlpZiAoY3VycmVudF9jcHVfdHlwZSgpID09IENQVV9SNjAwMCB8fAogCSAgICBjdXJyZW50X2NwdV90eXBlKCkgPT0gQ1BVX1I2MDAwQSkgewpAQCAtMjA0MCw2ICsyMTU3LDcgQEAKIAkJc2V0X2V4Y2VwdF92ZWN0b3IoMTUsIGhhbmRsZV9mcGUpOwogCiAJc2V0X2V4Y2VwdF92ZWN0b3IoMTYsIGhhbmRsZV9mdGxiKTsKKwlzZXRfZXhjZXB0X3ZlY3RvcigyMSwgaGFuZGxlX21zYSk7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoMjIsIGhhbmRsZV9tZG14KTsKIAogCWlmIChjcHVfaGFzX21jaGVjaykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMgYi9hcmNoL21pcHMva2VybmVsL3VuYWxpZ25lZC5jCmluZGV4IGMzNjlhNWQuLjJiMzUxNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYwpAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTksIDIwMDIgYnkgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE0IEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhZGRyZXNzIGVycm9yIGV4Y2VwdGlvbiB3aXRoIHRoZQogICogc3BlY2lhbCBjYXBhYmlsaXR5IHRvIGV4ZWN1dGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb25zIGluIHNvZnR3YXJlLiAgVGhlCkBAIC0xMTAsOCArMTExLDggQEAKICNpZmRlZiBfX0JJR19FTkRJQU4KICNkZWZpbmUgICAgIExvYWRIVyhhZGRyLCB2YWx1ZSwgcmVzKSAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIi5zZXRcdG5vYXRcbiIgICAgICAgIFwKLQkJCSIxOlx0bGJcdCUwLCAwKCUyKVxuIiAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bGJ1XHQkMSwgMSglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbGIoIiUwIiwgIjAoJTIpIikiXG4iICAgIFwKKwkJCSIyOlx0InVzZXJfbGJ1KCIkMSIsICIxKCUyKSIpIlxuXHQiIFwKIAkJCSJzbGxcdCUwLCAweDhcblx0IiAgICAgICAgICAgICAgICAgIFwKIAkJCSJvclx0JTAsICQxXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEzMCw4ICsxMzEsOCBAQAogCiAjZGVmaW5lICAgICBMb2FkVyhhZGRyLCB2YWx1ZSwgcmVzKSAgIFwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkiMTpcdGx3bFx0JTAsICglMilcbiIgICAgICAgICAgICAgICBcCi0JCQkiMjpcdGx3clx0JTAsIDMoJTIpXG5cdCIgICAgICAgICAgICBcCisJCQkiMTpcdCJ1c2VyX2x3bCgiJTAiLCAiKCUyKSIpIlxuIiAgICBcCisJCQkiMjpcdCJ1c2VyX2x3cigiJTAiLCAiMyglMikiKSJcblx0IiBcCiAJCQkibGlcdCUxLCAwXG4iICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiMzpcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiLmluc25cblx0IiAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNDksOCArMTUwLDggQEAKICNkZWZpbmUgICAgIExvYWRIV1UoYWRkciwgdmFsdWUsIHJlcykgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuc2V0XHRub2F0XG4iICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0bGJ1XHQlMCwgMCglMilcbiIgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bGJ1XHQkMSwgMSglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbGJ1KCIlMCIsICIwKCUyKSIpIlxuIiAgIFwKKwkJCSIyOlx0InVzZXJfbGJ1KCIkMSIsICIxKCUyKSIpIlxuXHQiIFwKIAkJCSJzbGxcdCUwLCAweDhcblx0IiAgICAgICAgICAgICAgICAgIFwKIAkJCSJvclx0JTAsICQxXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE3MCw4ICsxNzEsOCBAQAogCiAjZGVmaW5lICAgICBMb2FkV1UoYWRkciwgdmFsdWUsIHJlcykgIFwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkiMTpcdGx3bFx0JTAsICglMilcbiIgICAgICAgICAgICAgICBcCi0JCQkiMjpcdGx3clx0JTAsIDMoJTIpXG5cdCIgICAgICAgICAgICBcCisJCQkiMTpcdCJ1c2VyX2x3bCgiJTAiLCAiKCUyKSIpIlxuIiAgICBcCisJCQkiMjpcdCJ1c2VyX2x3cigiJTAiLCAiMyglMikiKSJcblx0IiBcCiAJCQkiZHNsbFx0JTAsICUwLCAzMlxuXHQiICAgICAgICAgICAgICBcCiAJCQkiZHNybFx0JTAsICUwLCAzMlxuXHQiICAgICAgICAgICAgICBcCiAJCQkibGlcdCUxLCAwXG4iICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMDksOSArMjEwLDkgQEAKICNkZWZpbmUgICAgIFN0b3JlSFcoYWRkciwgdmFsdWUsIHJlcykgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuc2V0XHRub2F0XG4iICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0c2JcdCUxLCAxKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfc2IoIiUxIiwgIjEoJTIpIikiXG4iICAgIFwKIAkJCSJzcmxcdCQxLCAlMSwgMHg4XG4iICAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0c2JcdCQxLCAwKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIyOlx0InVzZXJfc2IoIiQxIiwgIjAoJTIpIikiXG4iICAgIFwKIAkJCSIuc2V0XHRhdFxuXHQiICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTAsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIzOlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyOSw4ICsyMzAsOCBAQAogCiAjZGVmaW5lICAgICBTdG9yZVcoYWRkciwgdmFsdWUsIHJlcykgIFwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkiMTpcdHN3bFx0JTEsKCUyKVxuIiAgICAgICAgICAgICAgICBcCi0JCQkiMjpcdHN3clx0JTEsIDMoJTIpXG5cdCIgICAgICAgICAgICBcCisJCQkiMTpcdCJ1c2VyX3N3bCgiJTEiLCAiKCUyKSIpIlxuIiAgICBcCisJCQkiMjpcdCJ1c2VyX3N3cigiJTEiLCAiMyglMikiKSJcblx0IiBcCiAJCQkibGlcdCUwLCAwXG4iICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiMzpcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiLmluc25cblx0IiAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNjcsOCArMjY4LDggQEAKICNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KICNkZWZpbmUgICAgIExvYWRIVyhhZGRyLCB2YWx1ZSwgcmVzKSAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIi5zZXRcdG5vYXRcbiIgICAgICAgIFwKLQkJCSIxOlx0bGJcdCUwLCAxKCUyKVxuIiAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bGJ1XHQkMSwgMCglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbGIoIiUwIiwgIjEoJTIpIikiXG4iICAgIFwKKwkJCSIyOlx0InVzZXJfbGJ1KCIkMSIsICIwKCUyKSIpIlxuXHQiIFwKIAkJCSJzbGxcdCUwLCAweDhcblx0IiAgICAgICAgICAgICAgICAgIFwKIAkJCSJvclx0JTAsICQxXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI4Nyw4ICsyODgsOCBAQAogCiAjZGVmaW5lICAgICBMb2FkVyhhZGRyLCB2YWx1ZSwgcmVzKSAgIFwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkiMTpcdGx3bFx0JTAsIDMoJTIpXG4iICAgICAgICAgICAgICBcCi0JCQkiMjpcdGx3clx0JTAsICglMilcblx0IiAgICAgICAgICAgICBcCisJCQkiMTpcdCJ1c2VyX2x3bCgiJTAiLCAiMyglMikiKSJcbiIgICBcCisJCQkiMjpcdCJ1c2VyX2x3cigiJTAiLCAiKCUyKSIpIlxuXHQiICBcCiAJCQkibGlcdCUxLCAwXG4iICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiMzpcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiLmluc25cblx0IiAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMDYsOCArMzA3LDggQEAKICNkZWZpbmUgICAgIExvYWRIV1UoYWRkciwgdmFsdWUsIHJlcykgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuc2V0XHRub2F0XG4iICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0bGJ1XHQlMCwgMSglMilcbiIgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bGJ1XHQkMSwgMCglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbGJ1KCIlMCIsICIxKCUyKSIpIlxuIiAgIFwKKwkJCSIyOlx0InVzZXJfbGJ1KCIkMSIsICIwKCUyKSIpIlxuXHQiIFwKIAkJCSJzbGxcdCUwLCAweDhcblx0IiAgICAgICAgICAgICAgICAgIFwKIAkJCSJvclx0JTAsICQxXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMyNyw4ICszMjgsOCBAQAogCiAjZGVmaW5lICAgICBMb2FkV1UoYWRkciwgdmFsdWUsIHJlcykgIFwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkiMTpcdGx3bFx0JTAsIDMoJTIpXG4iICAgICAgICAgICAgICBcCi0JCQkiMjpcdGx3clx0JTAsICglMilcblx0IiAgICAgICAgICAgICBcCisJCQkiMTpcdCJ1c2VyX2x3bCgiJTAiLCAiMyglMikiKSJcbiIgICBcCisJCQkiMjpcdCJ1c2VyX2x3cigiJTAiLCAiKCUyKSIpIlxuXHQiICBcCiAJCQkiZHNsbFx0JTAsICUwLCAzMlxuXHQiICAgICAgICAgICAgICBcCiAJCQkiZHNybFx0JTAsICUwLCAzMlxuXHQiICAgICAgICAgICAgICBcCiAJCQkibGlcdCUxLCAwXG4iICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zNjYsOSArMzY3LDkgQEAKICNkZWZpbmUgICAgIFN0b3JlSFcoYWRkciwgdmFsdWUsIHJlcykgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuc2V0XHRub2F0XG4iICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0c2JcdCUxLCAwKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfc2IoIiUxIiwgIjAoJTIpIikiXG4iICAgIFwKIAkJCSJzcmxcdCQxLCUxLCAweDhcbiIgICAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0c2JcdCQxLCAxKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIyOlx0InVzZXJfc2IoIiQxIiwgIjEoJTIpIikiXG4iICAgIFwKIAkJCSIuc2V0XHRhdFxuXHQiICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTAsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIzOlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM4Niw4ICszODcsOCBAQAogCiAjZGVmaW5lICAgICBTdG9yZVcoYWRkciwgdmFsdWUsIHJlcykgIFwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkiMTpcdHN3bFx0JTEsIDMoJTIpXG4iICAgICAgICAgICAgICBcCi0JCQkiMjpcdHN3clx0JTEsICglMilcblx0IiAgICAgICAgICAgICBcCisJCQkiMTpcdCJ1c2VyX3N3bCgiJTEiLCAiMyglMikiKSJcbiIgICBcCisJCQkiMjpcdCJ1c2VyX3N3cigiJTEiLCAiKCUyKSIpIlxuXHQiICBcCiAJCQkibGlcdCUwLCAwXG4iICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiMzpcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkiLmluc25cblx0IiAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00MzAsNyArNDMxLDkgQEAKIAl1bnNpZ25lZCBsb25nIG9yaWdwYzsKIAl1bnNpZ25lZCBsb25nIG9yaWczMTsKIAl2b2lkIF9fdXNlciAqZmF1bHRfYWRkciA9IE5VTEw7Ci0KKyNpZmRlZglDT05GSUdfRVZBCisJbW1fc2VnbWVudF90IHNlZzsKKyNlbmRpZgogCW9yaWdwYyA9ICh1bnNpZ25lZCBsb25nKXBjOwogCW9yaWczMSA9IHJlZ3MtPnJlZ3NbMzFdOwogCkBAIC00NzUsNiArNDc4LDg4IEBACiAJCSAqIFRoZSByZW1haW5pbmcgb3Bjb2RlcyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgcmVhbGx5IG9mCiAJCSAqIGludGVyZXN0LgogCQkgKi8KKyNpZmRlZiBDT05GSUdfRVZBCisJY2FzZSBzcGVjM19vcDoKKwkJLyoKKwkJICogd2UgY2FuIGxhbmQgaGVyZSBvbmx5IGZyb20ga2VybmVsIGFjY2Vzc2luZyB1c2VyIG1lbW9yeSwKKwkJICogc28gd2UgbmVlZCB0byAic3dpdGNoIiB0aGUgYWRkcmVzcyBsaW1pdCB0byB1c2VyIHNwYWNlLCBzbworCQkgKiBhZGRyZXNzIGNoZWNrIGNhbiB3b3JrIHByb3Blcmx5LgorCQkgKi8KKwkJc2VnID0gZ2V0X2ZzKCk7CisJCXNldF9mcyhVU0VSX0RTKTsKKwkJc3dpdGNoIChpbnNuLnNwZWMzX2Zvcm1hdC5mdW5jKSB7CisJCWNhc2UgbGhlX29wOgorCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFkZHIsIDIpKSB7CisJCQkJc2V0X2ZzKHNlZyk7CisJCQkJZ290byBzaWdidXM7CisJCQl9CisJCQlMb2FkSFcoYWRkciwgdmFsdWUsIHJlcyk7CisJCQlpZiAocmVzKSB7CisJCQkJc2V0X2ZzKHNlZyk7CisJCQkJZ290byBmYXVsdDsKKwkJCX0KKwkJCWNvbXB1dGVfcmV0dXJuX2VwYyhyZWdzKTsKKwkJCXJlZ3MtPnJlZ3NbaW5zbi5zcGVjM19mb3JtYXQucnRdID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBsd2Vfb3A6CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWRkciwgNCkpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIHNpZ2J1czsKKwkJCX0KKwkJCQlMb2FkVyhhZGRyLCB2YWx1ZSwgcmVzKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIGZhdWx0OworCQkJfQorCQkJY29tcHV0ZV9yZXR1cm5fZXBjKHJlZ3MpOworCQkJcmVncy0+cmVnc1tpbnNuLnNwZWMzX2Zvcm1hdC5ydF0gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIGxodWVfb3A6CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWRkciwgMikpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIHNpZ2J1czsKKwkJCX0KKwkJCUxvYWRIV1UoYWRkciwgdmFsdWUsIHJlcyk7CisJCQlpZiAocmVzKSB7CisJCQkJc2V0X2ZzKHNlZyk7CisJCQkJZ290byBmYXVsdDsKKwkJCX0KKwkJCWNvbXB1dGVfcmV0dXJuX2VwYyhyZWdzKTsKKwkJCXJlZ3MtPnJlZ3NbaW5zbi5zcGVjM19mb3JtYXQucnRdID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBzaGVfb3A6CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFkZHIsIDIpKSB7CisJCQkJc2V0X2ZzKHNlZyk7CisJCQkJZ290byBzaWdidXM7CisJCQl9CisJCQljb21wdXRlX3JldHVybl9lcGMocmVncyk7CisJCQl2YWx1ZSA9IHJlZ3MtPnJlZ3NbaW5zbi5zcGVjM19mb3JtYXQucnRdOworCQkJU3RvcmVIVyhhZGRyLCB2YWx1ZSwgcmVzKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIGZhdWx0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugc3dlX29wOgorCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhZGRyLCA0KSkgeworCQkJCXNldF9mcyhzZWcpOworCQkJCWdvdG8gc2lnYnVzOworCQkJfQorCQkJY29tcHV0ZV9yZXR1cm5fZXBjKHJlZ3MpOworCQkJdmFsdWUgPSByZWdzLT5yZWdzW2luc24uc3BlYzNfZm9ybWF0LnJ0XTsKKwkJCVN0b3JlVyhhZGRyLCB2YWx1ZSwgcmVzKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIGZhdWx0OworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXRfZnMoc2VnKTsKKwkJCWdvdG8gc2lnaWxsOworCQl9CisJCXNldF9mcyhzZWcpOworCQlicmVhazsKKyNlbmRpZgogCWNhc2UgbGhfb3A6CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhZGRyLCAyKSkKIAkJCWdvdG8gc2lnYnVzOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L3BpY3Z1ZV9wcm9jLmMgYi9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYwppbmRleCA2MzhjNWRiLi4yYmNkODM5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYworKysgYi9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJcmVtb3ZlX3Byb2NfZW50cnkoInNjcm9sbCIsIHB2Y19kaXNwbGF5X2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoRElTUExBWV9ESVJfTkFNRSwgTlVMTCk7CiAKLQlkZWxfdGltZXIoJnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmdGltZXIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwdmNfcHJvY19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL2NzdW1fcGFydGlhbC5TIGIvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWwuUwppbmRleCBhNmFkZmZiLi4yZTQ4MjVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL2NzdW1fcGFydGlhbC5TCisrKyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKQEAgLTgsNiArOCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA3ICBNYWNpZWogVy4gUm96eWNraQorICogQ29weXJpZ2h0IChDKSAyMDE0IEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9hc20uaD4KQEAgLTI5Niw3ICsyOTcsNyBAQAogICogY2hlY2tzdW0gYW5kIGNvcHkgcm91dGluZXMgYmFzZWQgb24gbWVtY3B5LlMKICAqCiAgKgljc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkKLSAqCV9fY3N1bV9wYXJ0aWFsX2NvcHlfdXNlcihzcmMsIGRzdCwgbGVuLCBzdW0sIGVycnApCisgKglfX2NzdW1fcGFydGlhbF9jb3B5X2tlcm5lbChzcmMsIGRzdCwgbGVuLCBzdW0sIGVycnApCiAgKgogICogU2VlICJTcGVjIiBpbiBtZW1jcHkuUyBmb3IgZGV0YWlscy4JVW5saWtlIF9fY29weV91c2VyLCBhbGwKICAqIGZ1bmN0aW9uIGluIHRoaXMgZmlsZSB1c2UgdGhlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbi4KQEAgLTMyNywyMCArMzI4LDU4IEBACiAgKiBUaGVzZSBoYW5kbGVycyBkbyBub3QgbmVlZCB0byBvdmVyd3JpdGUgYW55IGRhdGEuCiAgKi8KIAotI2RlZmluZSBFWEMoaW5zdF9yZWcsYWRkcixoYW5kbGVyKQkJXAotOToJaW5zdF9yZWcsIGFkZHI7CQkJCVwKLQkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIjsJCVwKLQlQVFIJOWIsIGhhbmRsZXI7CQkJXAotCS5wcmV2aW91cworLyogSW5zdHJ1Y3Rpb24gdHlwZSAqLworI2RlZmluZSBMRF9JTlNOIDEKKyNkZWZpbmUgU1RfSU5TTiAyCisjZGVmaW5lIExFR0FDWV9NT0RFIDEKKyNkZWZpbmUgRVZBX01PREUgICAgMgorI2RlZmluZSBVU0VST1AgICAxCisjZGVmaW5lIEtFUk5FTE9QIDIKKworLyoKKyAqIFdyYXBwZXIgdG8gYWRkIGFuIGVudHJ5IGluIHRoZSBleGNlcHRpb24gdGFibGUKKyAqIGluIGNhc2UgdGhlIGluc24gY2F1c2VzIGEgbWVtb3J5IGV4Y2VwdGlvbi4KKyAqIEFyZ3VtZW50czoKKyAqIGluc24gICAgOiBMb2FkL3N0b3JlIGluc3RydWN0aW9uCisgKiB0eXBlICAgIDogSW5zdHJ1Y3Rpb24gdHlwZQorICogcmVnICAgICA6IFJlZ2lzdGVyCisgKiBhZGRyICAgIDogQWRkcmVzcworICogaGFuZGxlciA6IEV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyNkZWZpbmUgRVhDKGluc24sIHR5cGUsIHJlZywgYWRkciwgaGFuZGxlcikJXAorCS5pZiBcbW9kZSA9PSBMRUdBQ1lfTU9ERTsJCVwKKzk6CQlpbnNuIHJlZywgYWRkcjsJCQlcCisJCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiOwlcCisJCVBUUgk5YiwgaGFuZGxlcjsJCVwKKwkJLnByZXZpb3VzOwkJCVwKKwkvKiBUaGlzIGlzIGVuYWJsZWQgaW4gRVZBIG1vZGUgKi8JXAorCS5lbHNlOwkJCQkJXAorCQkvKiBJZiBsb2FkaW5nIGZyb20gdXNlciBvciBzdG9yaW5nIHRvIHVzZXIgKi8JXAorCQkuaWYgKChcZnJvbSA9PSBVU0VST1ApICYmICh0eXBlID09IExEX0lOU04pKSB8fCBcCisJCSAgICAoKFx0byA9PSBVU0VST1ApICYmICh0eXBlID09IFNUX0lOU04pKTsJXAorOToJCQlfX0JVSUxEX0VWQV9JTlNOKGluc24jI2UsIHJlZywgYWRkcik7CVwKKwkJCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiOwkJXAorCQkJUFRSCTliLCBoYW5kbGVyOwkJCVwKKwkJCS5wcmV2aW91czsJCQkJXAorCQkuZWxzZTsJCQkJCQlcCisJCQkvKiBFVkEgd2l0aG91dCBleGNlcHRpb24gKi8JCVwKKwkJCWluc24gcmVnLCBhZGRyOwkJCQlcCisJCS5lbmRpZjsJCQkJCQlcCisJLmVuZGlmCisKKyN1bmRlZiBMT0FECiAKICNpZmRlZiBVU0VfRE9VQkxFCiAKLSNkZWZpbmUgTE9BRCAgIGxkCi0jZGVmaW5lIExPQURMICBsZGwKLSNkZWZpbmUgTE9BRFIgIGxkcgotI2RlZmluZSBTVE9SRUwgc2RsCi0jZGVmaW5lIFNUT1JFUiBzZHIKLSNkZWZpbmUgU1RPUkUgIHNkCisjZGVmaW5lIExPQURLCWxkIC8qIE5vIGV4Y2VwdGlvbiAqLworI2RlZmluZSBMT0FEKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxkLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURCVShyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsYnUsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BREwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobGRsLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURSKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxkciwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2IsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkVMKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHNkbCwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRVIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2RyLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHNkLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCiAjZGVmaW5lIEFERCAgICBkYWRkdQogI2RlZmluZSBTVUIgICAgZHN1YnUKICNkZWZpbmUgU1JMICAgIGRzcmwKQEAgLTM1MiwxMiArMzkxLDE1IEBACiAKICNlbHNlCiAKLSNkZWZpbmUgTE9BRCAgIGx3Ci0jZGVmaW5lIExPQURMICBsd2wKLSNkZWZpbmUgTE9BRFIgIGx3cgotI2RlZmluZSBTVE9SRUwgc3dsCi0jZGVmaW5lIFNUT1JFUiBzd3IKLSNkZWZpbmUgU1RPUkUgIHN3CisjZGVmaW5lIExPQURLCWx3IC8qIE5vIGV4Y2VwdGlvbiAqLworI2RlZmluZSBMT0FEKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGx3LCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURCVShyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsYnUsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BREwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobHdsLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURSKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGx3ciwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2IsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkVMKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHN3bCwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRVIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc3dyLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHN3LCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCiAjZGVmaW5lIEFERCAgICBhZGR1CiAjZGVmaW5lIFNVQiAgICBzdWJ1CiAjZGVmaW5lIFNSTCAgICBzcmwKQEAgLTM5NiwxNCArNDM4LDIwIEBACiAJLnNldAlhdD12MQogI2VuZGlmCiAKLUxFQUYoX19jc3VtX3BhcnRpYWxfY29weV91c2VyKQorCS5tYWNybyBfX0JVSUxEX0NTVU1fUEFSVElBTF9DT1BZX1VTRVIgbW9kZSwgZnJvbSwgdG8sIF9fbm9jaGVjaworCiAJUFRSX0FERFUJQVQsIHNyYywgbGVuCS8qIFNlZSAoMSkgYWJvdmUuICovCisJLyogaW5pdGlhbGl6ZSBfX25vY2hlY2sgaWYgdGhpcyB0aGUgZmlyc3QgdGltZSB3ZSBleGVjdXRlIHRoaXMKKwkgKiBtYWNybworCSAqLwogI2lmZGVmIENPTkZJR182NEJJVAogCW1vdmUJZXJycHRyLCBhNAogI2Vsc2UKIAlsdwllcnJwdHIsIDE2KHNwKQogI2VuZGlmCi1GRVhQT1JUKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spCisJLmlmIFxfX25vY2hlY2sgPT0gMQorCUZFWFBPUlQoY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaykKKwkuZW5kaWYKIAltb3ZlCXN1bSwgemVybwogCW1vdmUJb2RkLCB6ZXJvCiAJLyoKQEAgLTQxOSw0OCArNDY3LDQ4IEBACiAJICovCiAJc2x0dQl0MiwgbGVuLCBOQllURVMKIAlhbmQJdDEsIGRzdCwgQUREUk1BU0sKLQlibmV6CXQyLCAuTGNvcHlfYnl0ZXNfY2hlY2tsZW4KKwlibmV6CXQyLCAuTGNvcHlfYnl0ZXNfY2hlY2tsZW5cQAogCSBhbmQJdDAsIHNyYywgQUREUk1BU0sKIAlhbmRpCW9kZCwgZHN0LCAweDEJCQkvKiBvZGQgYnVmZmVyPyAqLwotCWJuZXoJdDEsIC5MZHN0X3VuYWxpZ25lZAorCWJuZXoJdDEsIC5MZHN0X3VuYWxpZ25lZFxACiAJIG5vcAotCWJuZXoJdDAsIC5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZAorCWJuZXoJdDAsIC5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZFxACiAJLyoKIAkgKiB1c2UgZGVsYXkgc2xvdCBmb3IgZmFsbC10aHJvdWdoCiAJICogc3JjIGFuZCBkc3QgYXJlIGFsaWduZWQ7IG5lZWQgdG8gY29tcHV0ZSByZW0KIAkgKi8KLS5MYm90aF9hbGlnbmVkOgorLkxib3RoX2FsaWduZWRcQDoKIAkgU1JMCXQwLCBsZW4sIExPR19OQllURVMrMwkgIyArMyBmb3IgOCB1bml0cy9pdGVyCi0JYmVxegl0MCwgLkxjbGVhbnVwX2JvdGhfYWxpZ25lZCAjIGxlbiA8IDgqTkJZVEVTCisJYmVxegl0MCwgLkxjbGVhbnVwX2JvdGhfYWxpZ25lZFxAICMgbGVuIDwgOCpOQllURVMKIAkgbm9wCiAJU1VCCWxlbiwgOCpOQllURVMJCSMgc3VidHJhY3QgaGVyZSBmb3IgYmdleiBsb29wCiAJLmFsaWduCTQKIDE6Ci1FWEMoCUxPQUQJdDAsIFVOSVQoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTE9BRAl0MSwgVU5JVCgxKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDIsIFVOSVQoMikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQzLCBVTklUKDMpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0NCwgVU5JVCg0KShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDUsIFVOSVQoNSkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQ2LCBVTklUKDYpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0NywgVU5JVCg3KShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTE9BRCh0MCwgVU5JVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTE9BRCh0MSwgVU5JVCgxKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQyLCBVTklUKDIpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDMsIFVOSVQoMykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0NCwgVU5JVCg0KShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQ1LCBVTklUKDUpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDYsIFVOSVQoNikoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0NywgVU5JVCg3KShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKIAlTVUIJbGVuLCBsZW4sIDgqTkJZVEVTCiAJQURECXNyYywgc3JjLCA4Kk5CWVRFUwotRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQwLCBVTklUKDApKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDApCi1FWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MSkKLUVYQygJU1RPUkUJdDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MiwgVU5JVCgyKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQyKQotRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQzLCBVTklUKDMpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDMpCi1FWEMoCVNUT1JFCXQ0LCBVTklUKDQpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDQsIFVOSVQoNCkoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0NCkKLUVYQygJU1RPUkUJdDUsIFVOSVQoNSkoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0NSwgVU5JVCg1KShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQ1KQotRVhDKAlTVE9SRQl0NiwgVU5JVCg2KShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQ2LCBVTklUKDYpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDYpCi1FWEMoCVNUT1JFCXQ3LCBVTklUKDcpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDcsIFVOSVQoNykoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0NykKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJQURECWRzdCwgZHN0LCA4Kk5CWVRFUwpAQCAtNDcxLDQ0ICs1MTksNDQgQEAKIAkvKgogCSAqIGxlbiA9PSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gY29weSA8IDgqTkJZVEVTCiAJICovCi0uTGNsZWFudXBfYm90aF9hbGlnbmVkOgorLkxjbGVhbnVwX2JvdGhfYWxpZ25lZFxAOgogI2RlZmluZSByZW0gdDcKLQliZXF6CWxlbiwgLkxkb25lCisJYmVxeglsZW4sIC5MZG9uZVxACiAJIHNsdHUJdDAsIGxlbiwgNCpOQllURVMKLQlibmV6CXQwLCAuTGxlc3NfdGhhbl80dW5pdHMKKwlibmV6CXQwLCAuTGxlc3NfdGhhbl80dW5pdHNcQAogCSBhbmQJcmVtLCBsZW4sIChOQllURVMtMSkJIyByZW0gPSBsZW4gJSBOQllURVMKIAkvKgogCSAqIGxlbiA+PSA0Kk5CWVRFUwogCSAqLwotRVhDKAlMT0FECXQwLCBVTklUKDApKHNyYyksCS5MbF9leGMpCi1FWEMoCUxPQUQJdDEsIFVOSVQoMSkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQyLCBVTklUKDIpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0MywgVU5JVCgzKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTE9BRCh0MCwgVU5JVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTE9BRCh0MSwgVU5JVCgxKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQyLCBVTklUKDIpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDMsIFVOSVQoMykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJU1VCCWxlbiwgbGVuLCA0Kk5CWVRFUwogCUFERAlzcmMsIHNyYywgNCpOQllURVMKLUVYQygJU1RPUkUJdDAsIFVOSVQoMCkoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQwKQotRVhDKAlTVE9SRQl0MSwgVU5JVCgxKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDEpCi1FWEMoCVNUT1JFCXQyLCBVTklUKDIpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MikKLUVYQygJU1RPUkUJdDMsIFVOSVQoMykoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQzKQogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIDQqTkJZVEVTCi0JYmVxeglsZW4sIC5MZG9uZQorCWJlcXoJbGVuLCAuTGRvbmVcQAogCS5zZXQJbm9yZW9yZGVyCi0uTGxlc3NfdGhhbl80dW5pdHM6CisuTGxlc3NfdGhhbl80dW5pdHNcQDoKIAkvKgogCSAqIHJlbSA9IGxlbiAlIE5CWVRFUwogCSAqLwotCWJlcQlyZW0sIGxlbiwgLkxjb3B5X2J5dGVzCisJYmVxCXJlbSwgbGVuLCAuTGNvcHlfYnl0ZXNcQAogCSBub3AKIDE6Ci1FWEMoCUxPQUQJdDAsIDAoc3JjKSwJCS5MbF9leGMpCisJTE9BRCh0MCwgMChzcmMpLCAuTGxfZXhjXEApCiAJQURECXNyYywgc3JjLCBOQllURVMKIAlTVUIJbGVuLCBsZW4sIE5CWVRFUwotRVhDKAlTVE9SRQl0MCwgMChkc3QpLAkJLkxzX2V4YykKKwlTVE9SRSh0MCwgMChkc3QpLCAuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQwKQogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIE5CWVRFUwpAQCAtNTI3LDIwICs1NzUsMjAgQEAKIAkgKiBtb3JlIGluc3RydWN0aW9uLWxldmVsIHBhcmFsbGVsaXNtLgogCSAqLwogI2RlZmluZSBiaXRzIHQyCi0JYmVxeglsZW4sIC5MZG9uZQorCWJlcXoJbGVuLCAuTGRvbmVcQAogCSBBREQJdDEsIGRzdCwgbGVuCSMgdDEgaXMganVzdCBwYXN0IGxhc3QgYnl0ZSBvZiBkc3QKIAlsaQliaXRzLCA4Kk5CWVRFUwogCVNMTAlyZW0sIGxlbiwgMwkjIHJlbSA9IG51bWJlciBvZiBiaXRzIHRvIGtlZXAKLUVYQygJTE9BRAl0MCwgMChzcmMpLAkJLkxsX2V4YykKKwlMT0FEKHQwLCAwKHNyYyksIC5MbF9leGNcQCkKIAlTVUIJYml0cywgYml0cywgcmVtICMgYml0cyA9IG51bWJlciBvZiBiaXRzIHRvIGRpc2NhcmQKIAlTSElGVF9ESVNDQVJEIHQwLCB0MCwgYml0cwotRVhDKAlTVFJFU1QJdDAsIC0xKHQxKSwJCS5Mc19leGMpCisJU1RSRVNUKHQwLCAtMSh0MSksIC5Mc19leGNcQCkKIAlTSElGVF9ESVNDQVJEX1JFVkVSVCB0MCwgdDAsIGJpdHMKIAkuc2V0IHJlb3JkZXIKIAlBRERDKHN1bSwgdDApCi0JYgkuTGRvbmUKKwliCS5MZG9uZVxACiAJLnNldCBub3Jlb3JkZXIKLS5MZHN0X3VuYWxpZ25lZDoKKy5MZHN0X3VuYWxpZ25lZFxAOgogCS8qCiAJICogZHN0IGlzIHVuYWxpZ25lZAogCSAqIHQwID0gc3JjICYgQUREUk1BU0sKQEAgLTU1MSwyNSArNTk5LDI1IEBACiAJICogU2V0IG1hdGNoID0gKHNyYyBhbmQgZHN0IGhhdmUgc2FtZSBhbGlnbm1lbnQpCiAJICovCiAjZGVmaW5lIG1hdGNoIHJlbQotRVhDKAlMREZJUlNUIHQzLCBGSVJTVCgwKShzcmMpLAkuTGxfZXhjKQorCUxERklSU1QodDMsIEZJUlNUKDApKHNyYyksIC5MbF9leGNcQCkKIAlBREQJdDIsIHplcm8sIE5CWVRFUwotRVhDKAlMRFJFU1QJdDMsIFJFU1QoMCkoc3JjKSwJLkxsX2V4Y19jb3B5KQorCUxEUkVTVCh0MywgUkVTVCgwKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKIAlTVUIJdDIsIHQyLCB0MQkjIHQyID0gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZAogCXhvcgltYXRjaCwgdDAsIHQxCi1FWEMoCVNURklSU1QgdDMsIEZJUlNUKDApKGRzdCksCS5Mc19leGMpCisJU1RGSVJTVCh0MywgRklSU1QoMCkoZHN0KSwgLkxzX2V4Y1xAKQogCVNMTAl0NCwgdDEsIDMJCSMgdDQgPSBudW1iZXIgb2YgYml0cyB0byBkaXNjYXJkCiAJU0hJRlRfRElTQ0FSRCB0MywgdDMsIHQ0CiAJLyogbm8gU0hJRlRfRElTQ0FSRF9SRVZFUlQgdG8gaGFuZGxlIG9kZCBidWZmZXIgcHJvcGVybHkgKi8KIAlBRERDKHN1bSwgdDMpCi0JYmVxCWxlbiwgdDIsIC5MZG9uZQorCWJlcQlsZW4sIHQyLCAuTGRvbmVcQAogCSBTVUIJbGVuLCBsZW4sIHQyCiAJQURECWRzdCwgZHN0LCB0MgotCWJlcXoJbWF0Y2gsIC5MYm90aF9hbGlnbmVkCisJYmVxegltYXRjaCwgLkxib3RoX2FsaWduZWRcQAogCSBBREQJc3JjLCBzcmMsIHQyCiAKLS5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZDoKKy5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZFxAOgogCVNSTAl0MCwgbGVuLCBMT0dfTkJZVEVTKzIJICMgKzIgZm9yIDQgdW5pdHMvaXRlcgotCWJlcXoJdDAsIC5MY2xlYW51cF9zcmNfdW5hbGlnbmVkCisJYmVxegl0MCwgLkxjbGVhbnVwX3NyY191bmFsaWduZWRcQAogCSBhbmQJcmVtLCBsZW4sICg0Kk5CWVRFUy0xKQkgIyByZW0gPSBsZW4gJSA0Kk5CWVRFUwogMToKIC8qCkBAIC01NzgsNTMgKzYyNiw1MyBAQAogICogSXQncyBPSyB0byBsb2FkIEZJUlNUKE4rMSkgYmVmb3JlIFJFU1QoTikgYmVjYXVzZSB0aGUgdHdvIGFkZHJlc3NlcwogICogYXJlIHRvIHRoZSBzYW1lIHVuaXQgKHVubGVzcyBzcmMgaXMgYWxpZ25lZCwgYnV0IGl0J3Mgbm90KS4KICAqLwotRVhDKAlMREZJUlNUIHQwLCBGSVJTVCgwKShzcmMpLAkuTGxfZXhjKQotRVhDKAlMREZJUlNUIHQxLCBGSVJTVCgxKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTERGSVJTVCh0MCwgRklSU1QoMCkoc3JjKSwgLkxsX2V4Y1xAKQorCUxERklSU1QodDEsIEZJUlNUKDEpKHNyYyksIC5MbF9leGNfY29weVxAKQogCVNVQglsZW4sIGxlbiwgNCpOQllURVMKLUVYQygJTERSRVNUCXQwLCBSRVNUKDApKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERSRVNUCXQxLCBSRVNUKDEpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERGSVJTVCB0MiwgRklSU1QoMikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMREZJUlNUIHQzLCBGSVJTVCgzKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxEUkVTVAl0MiwgUkVTVCgyKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxEUkVTVAl0MywgUkVTVCgzKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTERSRVNUKHQwLCBSRVNUKDApKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxEUkVTVCh0MSwgUkVTVCgxKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMREZJUlNUKHQyLCBGSVJTVCgyKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMREZJUlNUKHQzLCBGSVJTVCgzKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMRFJFU1QodDIsIFJFU1QoMikoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTERSRVNUKHQzLCBSRVNUKDMpKHNyYyksIC5MbF9leGNfY29weVxAKQogCUFERAlzcmMsIHNyYywgNCpOQllURVMKICNpZmRlZiBDT05GSUdfQ1BVX1NCMQogCW5vcAkJCQkjIGltcHJvdmVzIHNsb3R0aW5nCiAjZW5kaWYKLUVYQygJU1RPUkUJdDAsIFVOSVQoMCkoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQwKQotRVhDKAlTVE9SRQl0MSwgVU5JVCgxKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDEpCi1FWEMoCVNUT1JFCXQyLCBVTklUKDIpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MikKLUVYQygJU1RPUkUJdDMsIFVOSVQoMykoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQzKQogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIDQqTkJZVEVTCiAJYm5lCWxlbiwgcmVtLCAxYgogCS5zZXQJbm9yZW9yZGVyCiAKLS5MY2xlYW51cF9zcmNfdW5hbGlnbmVkOgotCWJlcXoJbGVuLCAuTGRvbmUKKy5MY2xlYW51cF9zcmNfdW5hbGlnbmVkXEA6CisJYmVxeglsZW4sIC5MZG9uZVxACiAJIGFuZAlyZW0sIGxlbiwgTkJZVEVTLTEgICMgcmVtID0gbGVuICUgTkJZVEVTCi0JYmVxCXJlbSwgbGVuLCAuTGNvcHlfYnl0ZXMKKwliZXEJcmVtLCBsZW4sIC5MY29weV9ieXRlc1xACiAJIG5vcAogMToKLUVYQygJTERGSVJTVCB0MCwgRklSU1QoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTERSRVNUCXQwLCBSRVNUKDApKHNyYyksCS5MbF9leGNfY29weSkKKwlMREZJUlNUKHQwLCBGSVJTVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTERSRVNUKHQwLCBSRVNUKDApKHNyYyksIC5MbF9leGNfY29weVxAKQogCUFERAlzcmMsIHNyYywgTkJZVEVTCiAJU1VCCWxlbiwgbGVuLCBOQllURVMKLUVYQygJU1RPUkUJdDAsIDAoZHN0KSwJCS5Mc19leGMpCisJU1RPUkUodDAsIDAoZHN0KSwgLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MCkKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJQURECWRzdCwgZHN0LCBOQllURVMKIAlibmUJbGVuLCByZW0sIDFiCiAJLnNldAlub3Jlb3JkZXIKIAotLkxjb3B5X2J5dGVzX2NoZWNrbGVuOgotCWJlcXoJbGVuLCAuTGRvbmUKKy5MY29weV9ieXRlc19jaGVja2xlblxAOgorCWJlcXoJbGVuLCAuTGRvbmVcQAogCSBub3AKLS5MY29weV9ieXRlczoKKy5MY29weV9ieXRlc1xAOgogCS8qIDAgPCBsZW4gPCBOQllURVMgICovCiAjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCiAjZGVmaW5lIFNISUZUX1NUQVJUIDAKQEAgLTYzNywxMiArNjg1LDEyIEBACiAJbGkJdDMsIFNISUZUX1NUQVJUICMgc2hpZnQKIC8qIHVzZSAuTGxfZXhjX2NvcHkgaGVyZSB0byByZXR1cm4gY29ycmVjdCBzdW0gb24gZmF1bHQgKi8KICNkZWZpbmUgQ09QWV9CWVRFKE4pCQkJXAotRVhDKAlsYnUJdDAsIE4oc3JjKSwgLkxsX2V4Y19jb3B5KTsJXAorCUxPQURCVSh0MCwgTihzcmMpLCAuTGxfZXhjX2NvcHlcQCk7CVwKIAlTVUIJbGVuLCBsZW4sIDE7CQlcCi1FWEMoCXNiCXQwLCBOKGRzdCksIC5Mc19leGMpOwlcCisJU1RPUkVCKHQwLCBOKGRzdCksIC5Mc19leGNcQCk7CVwKIAlTTExWCXQwLCB0MCwgdDM7CQlcCiAJYWRkdQl0MywgU0hJRlRfSU5DOwkJXAotCWJlcXoJbGVuLCAuTGNvcHlfYnl0ZXNfZG9uZTsgXAorCWJlcXoJbGVuLCAuTGNvcHlfYnl0ZXNfZG9uZVxAOyBcCiAJIG9yCXQyLCB0MAogCiAJQ09QWV9CWVRFKDApCkBAIC02NTMsMTQgKzcwMSwxNCBAQAogCUNPUFlfQllURSg0KQogCUNPUFlfQllURSg1KQogI2VuZGlmCi1FWEMoCWxidQl0MCwgTkJZVEVTLTIoc3JjKSwgLkxsX2V4Y19jb3B5KQorCUxPQURCVSh0MCwgTkJZVEVTLTIoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJU1VCCWxlbiwgbGVuLCAxCi1FWEMoCXNiCXQwLCBOQllURVMtMihkc3QpLCAuTHNfZXhjKQorCVNUT1JFQih0MCwgTkJZVEVTLTIoZHN0KSwgLkxzX2V4Y1xAKQogCVNMTFYJdDAsIHQwLCB0MwogCW9yCXQyLCB0MAotLkxjb3B5X2J5dGVzX2RvbmU6CisuTGNvcHlfYnl0ZXNfZG9uZVxAOgogCUFEREMoc3VtLCB0MikKLS5MZG9uZToKKy5MZG9uZVxAOgogCS8qIGZvbGQgY2hlY2tzdW0gKi8KICNpZmRlZiBVU0VfRE9VQkxFCiAJZHNsbDMyCXYxLCBzdW0sIDAKQEAgLTY4OSw3ICs3MzcsNyBAQAogCWpyCXJhCiAJLnNldCBub3Jlb3JkZXIKIAotLkxsX2V4Y19jb3B5OgorLkxsX2V4Y19jb3B5XEA6CiAJLyoKIAkgKiBDb3B5IGJ5dGVzIGZyb20gc3JjIHVudGlsIGZhdWx0aW5nIGxvYWQgYWRkcmVzcyAob3IgdW50aWwgYQogCSAqIGxiIGZhdWx0cykKQEAgLTcwMCwxMSArNzQ4LDExIEBACiAJICoKIAkgKiBBc3N1bWVzIHNyYyA8IFRIUkVBRF9CVUFERFIoJDI4KQogCSAqLwotCUxPQUQJdDAsIFRJX1RBU0soJDI4KQorCUxPQURLCXQwLCBUSV9UQVNLKCQyOCkKIAkgbGkJdDIsIFNISUZUX1NUQVJUCi0JTE9BRAl0MCwgVEhSRUFEX0JVQUREUih0MCkKKwlMT0FESwl0MCwgVEhSRUFEX0JVQUREUih0MCkKIDE6Ci1FWEMoCWxidQl0MSwgMChzcmMpLAkuTGxfZXhjKQorCUxPQURCVSh0MSwgMChzcmMpLCAuTGxfZXhjXEApCiAJQURECXNyYywgc3JjLCAxCiAJc2IJdDEsIDAoZHN0KQkjIGNhbid0IGZhdWx0IC0tIHdlJ3JlIGNvcHlfZnJvbV91c2VyCiAJU0xMVgl0MSwgdDEsIHQyCkBAIC03MTQsMTAgKzc2MiwxMCBAQAogCUFERAlkc3QsIGRzdCwgMQogCWJuZQlzcmMsIHQwLCAxYgogCS5zZXQJbm9yZW9yZGVyCi0uTGxfZXhjOgotCUxPQUQJdDAsIFRJX1RBU0soJDI4KQorLkxsX2V4Y1xAOgorCUxPQURLCXQwLCBUSV9UQVNLKCQyOCkKIAkgbm9wCi0JTE9BRAl0MCwgVEhSRUFEX0JVQUREUih0MCkJIyB0MCBpcyBqdXN0IHBhc3QgbGFzdCBnb29kIGFkZHJlc3MKKwlMT0FESwl0MCwgVEhSRUFEX0JVQUREUih0MCkJIyB0MCBpcyBqdXN0IHBhc3QgbGFzdCBnb29kIGFkZHJlc3MKIAkgbm9wCiAJU1VCCWxlbiwgQVQsIHQwCQkjIGxlbiBudW1iZXIgb2YgdW5jb3BpZWQgYnl0ZXMKIAkvKgpAQCAtNzMzLDcgKzc4MSw3IEBACiAJICovCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCVNVQglzcmMsIGxlbiwgMQotCWJlcXoJbGVuLCAuTGRvbmUKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkuc2V0CW5vcmVvcmRlcgogMToJc2IJemVybywgMChkc3QpCiAJQURECWRzdCwgZHN0LCAxCkBAIC03NDgsMTMgKzc5NiwzMSBAQAogCSBTVUIJc3JjLCBzcmMsIHYxCiAjZW5kaWYKIAlsaQl2MSwgLUVGQVVMVAotCWIJLkxkb25lCisJYgkuTGRvbmVcQAogCSBzdwl2MSwgKGVycnB0cikKIAotLkxzX2V4YzoKKy5Mc19leGNcQDoKIAlsaQl2MCwgLTEgLyogaW52YWxpZCBjaGVja3N1bSAqLwogCWxpCXYxLCAtRUZBVUxUCiAJanIJcmEKIAkgc3cJdjEsIChlcnJwdHIpCiAJLnNldAlwb3AKLQlFTkQoX19jc3VtX3BhcnRpYWxfY29weV91c2VyKQorCS5lbmRtCisKK0xFQUYoX19jc3VtX3BhcnRpYWxfY29weV9rZXJuZWwpCisjaWZuZGVmIENPTkZJR19FVkEKK0ZFWFBPUlQoX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKQorRkVYUE9SVChfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcikKKyNlbmRpZgorX19CVUlMRF9DU1VNX1BBUlRJQUxfQ09QWV9VU0VSIExFR0FDWV9NT0RFIFVTRVJPUCBVU0VST1AgMQorRU5EKF9fY3N1bV9wYXJ0aWFsX2NvcHlfa2VybmVsKQorCisjaWZkZWYgQ09ORklHX0VWQQorTEVBRihfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIpCitfX0JVSUxEX0NTVU1fUEFSVElBTF9DT1BZX1VTRVIgRVZBX01PREUgS0VSTkVMT1AgVVNFUk9QIDAKK0VORChfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIpCisKK0xFQUYoX19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpCitfX0JVSUxEX0NTVU1fUEFSVElBTF9DT1BZX1VTRVIgRVZBX01PREUgVVNFUk9QIEtFUk5FTE9QIDAKK0VORChfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9tZW1jcHkuUyBiL2FyY2gvbWlwcy9saWIvbWVtY3B5LlMKaW5kZXggYzVjNDBkYS4uYzE3ZWY4MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9tZW1jcHkuUworKysgYi9hcmNoL21pcHMvbGliL21lbWNweS5TCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgQnJvYWRjb20sIEluYy4KICAqICAgbWVtY3B5L2NvcHlfdXNlciBhdXRob3I6IE1hcmsgVmFuZGV2b29yZGUKICAqIENvcHlyaWdodCAoQykgMjAwNyAgTWFjaWVqIFcuIFJvenlja2kKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICoKICAqIE1uZW1vbmljIG5hbWVzIGZvciBhcmd1bWVudHMgdG8gbWVtY3B5L19fY29weV91c2VyCiAgKi8KQEAgLTg1LDExICs4Niw1MSBAQAogICogdGhleSdyZSBub3QgcHJvdGVjdGVkLgogICovCiAKLSNkZWZpbmUgRVhDKGluc3RfcmVnLGFkZHIsaGFuZGxlcikJCVwKLTk6CWluc3RfcmVnLCBhZGRyOwkJCQlcCi0JLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CQlcCi0JUFRSCTliLCBoYW5kbGVyOwkJCVwKLQkucHJldmlvdXMKKy8qIEluc3RydWN0aW9uIHR5cGUgKi8KKyNkZWZpbmUgTERfSU5TTiAxCisjZGVmaW5lIFNUX0lOU04gMgorLyogUHJldGVjaCB0eXBlICovCisjZGVmaW5lIFNSQ19QUkVGRVRDSCAxCisjZGVmaW5lIERTVF9QUkVGRVRDSCAyCisjZGVmaW5lIExFR0FDWV9NT0RFIDEKKyNkZWZpbmUgRVZBX01PREUgICAgMgorI2RlZmluZSBVU0VST1AgICAxCisjZGVmaW5lIEtFUk5FTE9QIDIKKworLyoKKyAqIFdyYXBwZXIgdG8gYWRkIGFuIGVudHJ5IGluIHRoZSBleGNlcHRpb24gdGFibGUKKyAqIGluIGNhc2UgdGhlIGluc24gY2F1c2VzIGEgbWVtb3J5IGV4Y2VwdGlvbi4KKyAqIEFyZ3VtZW50czoKKyAqIGluc24gICAgOiBMb2FkL3N0b3JlIGluc3RydWN0aW9uCisgKiB0eXBlICAgIDogSW5zdHJ1Y3Rpb24gdHlwZQorICogcmVnICAgICA6IFJlZ2lzdGVyCisgKiBhZGRyICAgIDogQWRkcmVzcworICogaGFuZGxlciA6IEV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKworI2RlZmluZSBFWEMoaW5zbiwgdHlwZSwgcmVnLCBhZGRyLCBoYW5kbGVyKQkJCVwKKwkuaWYgXG1vZGUgPT0gTEVHQUNZX01PREU7CQkJCVwKKzk6CQlpbnNuIHJlZywgYWRkcjsJCQkJCVwKKwkJLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CQkJXAorCQlQVFIJOWIsIGhhbmRsZXI7CQkJCVwKKwkJLnByZXZpb3VzOwkJCQkJXAorCS8qIFRoaXMgaXMgYXNzZW1ibGVkIGluIEVWQSBtb2RlICovCQkJXAorCS5lbHNlOwkJCQkJCQlcCisJCS8qIElmIGxvYWRpbmcgZnJvbSB1c2VyIG9yIHN0b3JpbmcgdG8gdXNlciAqLwlcCisJCS5pZiAoKFxmcm9tID09IFVTRVJPUCkgJiYgKHR5cGUgPT0gTERfSU5TTikpIHx8IFwKKwkJICAgICgoXHRvID09IFVTRVJPUCkgJiYgKHR5cGUgPT0gU1RfSU5TTikpOwlcCis5OgkJCV9fQlVJTERfRVZBX0lOU04oaW5zbiMjZSwgcmVnLCBhZGRyKTsJXAorCQkJLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CQlcCisJCQlQVFIJOWIsIGhhbmRsZXI7CQkJXAorCQkJLnByZXZpb3VzOwkJCQlcCisJCS5lbHNlOwkJCQkJCVwKKwkJCS8qCQkJCQlcCisJCQkgKiAgU3RpbGwgaW4gRVZBLCBidXQgbm8gbmVlZCBmb3IJXAorCQkJICogZXhjZXB0aW9uIGhhbmRsZXIgb3IgRVZBIGluc24JXAorCQkJICovCQkJCQlcCisJCQlpbnNuIHJlZywgYWRkcjsJCQkJXAorCQkuZW5kaWY7CQkJCQkJXAorCS5lbmRpZgogCiAvKgogICogT25seSBvbiB0aGUgNjQtYml0IGtlcm5lbCB3ZSBjYW4gbWFkZSB1c2Ugb2YgNjQtYml0IHJlZ2lzdGVycy4KQEAgLTEwMCwxMiArMTQxLDEzIEBACiAKICNpZmRlZiBVU0VfRE9VQkxFCiAKLSNkZWZpbmUgTE9BRCAgIGxkCi0jZGVmaW5lIExPQURMICBsZGwKLSNkZWZpbmUgTE9BRFIgIGxkcgotI2RlZmluZSBTVE9SRUwgc2RsCi0jZGVmaW5lIFNUT1JFUiBzZHIKLSNkZWZpbmUgU1RPUkUgIHNkCisjZGVmaW5lIExPQURLIGxkIC8qIE5vIGV4Y2VwdGlvbiAqLworI2RlZmluZSBMT0FEKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxkLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURMKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxkbCwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBMT0FEUihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsZHIsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkVMKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHNkbCwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRVIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2RyLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHNkLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCiAjZGVmaW5lIEFERCAgICBkYWRkdQogI2RlZmluZSBTVUIgICAgZHN1YnUKICNkZWZpbmUgU1JMICAgIGRzcmwKQEAgLTEzNiwxMiArMTc4LDEzIEBACiAKICNlbHNlCiAKLSNkZWZpbmUgTE9BRCAgIGx3Ci0jZGVmaW5lIExPQURMICBsd2wKLSNkZWZpbmUgTE9BRFIgIGx3cgotI2RlZmluZSBTVE9SRUwgc3dsCi0jZGVmaW5lIFNUT1JFUiBzd3IKLSNkZWZpbmUgU1RPUkUgIHN3CisjZGVmaW5lIExPQURLIGx3IC8qIE5vIGV4Y2VwdGlvbiAqLworI2RlZmluZSBMT0FEKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGx3LCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURMKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGx3bCwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBMT0FEUihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsd3IsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkVMKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHN3bCwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRVIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc3dyLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKHN3LCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCiAjZGVmaW5lIEFERCAgICBhZGR1CiAjZGVmaW5lIFNVQiAgICBzdWJ1CiAjZGVmaW5lIFNSTCAgICBzcmwKQEAgLTE1NCw2ICsxOTcsMzMgQEAKIAogI2VuZGlmIC8qIFVTRV9ET1VCTEUgKi8KIAorI2RlZmluZSBMT0FEQihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsYiwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2IsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKworI2RlZmluZSBfUFJFRihoaW50LCBhZGRyLCB0eXBlKQkJCQkJCVwKKwkuaWYgXG1vZGUgPT0gTEVHQUNZX01PREU7CQkJCQlcCisJCVBSRUYoaGludCwgYWRkcik7CQkJCQlcCisJLmVsc2U7CQkJCQkJCQlcCisJCS5pZiAoKFxmcm9tID09IFVTRVJPUCkgJiYgKHR5cGUgPT0gU1JDX1BSRUZFVENIKSkgfHwJXAorCQkgICAgKChcdG8gPT0gVVNFUk9QKSAmJiAodHlwZSA9PSBEU1RfUFJFRkVUQ0gpKTsJXAorCQkJLyoJCQkJCQlcCisJCQkgKiBQUkVGRSBoYXMgb25seSA5IGJpdHMgZm9yIHRoZSBvZmZzZXQJCVwKKwkJCSAqIGNvbXBhcmVkIHRvIFBSRUYgd2hpY2ggaGFzIDE2LCBzbyBpdCBtYXkJXAorCQkJICogbmVlZCB0byB1c2UgdGhlICRhdCByZWdpc3RlciBidXQgdGhpcwlcCisJCQkgKiByZWdpc3RlciBzaG91bGQgcmVtYWluIGludGFjdCBiZWNhdXNlIGl0J3MJXAorCQkJICogdXNlZCBsYXRlciBvbi4gVGhlcmVmb3JlIHVzZSAkdjEuCQlcCisJCQkgKi8JCQkJCQlcCisJCQkuc2V0IGF0PXYxOwkJCQkJXAorCQkJUFJFRkUoaGludCwgYWRkcik7CQkJCVwKKwkJCS5zZXQgbm9hdDsJCQkJCVwKKwkJLmVsc2U7CQkJCQkJCVwKKwkJCVBSRUYoaGludCwgYWRkcik7CQkJCVwKKwkJLmVuZGlmOwkJCQkJCQlcCisJLmVuZGlmCisKKyNkZWZpbmUgUFJFRlMoaGludCwgYWRkcikgX1BSRUYoaGludCwgYWRkciwgU1JDX1BSRUZFVENIKQorI2RlZmluZSBQUkVGRChoaW50LCBhZGRyKSBfUFJFRihoaW50LCBhZGRyLCBEU1RfUFJFRkVUQ0gpCisKICNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KICNkZWZpbmUgTERGSVJTVCBMT0FEUgogI2RlZmluZSBMRFJFU1QJTE9BREwKQEAgLTE4MiwyNyArMjUyLDIzIEBACiAJLnNldAlhdD12MQogI2VuZGlmCiAKLS8qCi0gKiB0NiBpcyB1c2VkIGFzIGEgZmxhZyB0byBub3RlIGluYXRvbWljIG1vZGUuCi0gKi8KLUxFQUYoX19jb3B5X3VzZXJfaW5hdG9taWMpCi0JYglfX2NvcHlfdXNlcl9jb21tb24KLQkgbGkJdDYsIDEKLQlFTkQoX19jb3B5X3VzZXJfaW5hdG9taWMpCi0KLS8qCi0gKiBBIGNvbWJpbmVkIG1lbWNweS9fX2NvcHlfdXNlcgotICogX19jb3B5X3VzZXIgc2V0cyBsZW4gdG8gMCBmb3Igc3VjY2VzczsgZWxzZSB0byBhbiB1cHBlciBib3VuZCBvZgotICogdGhlIG51bWJlciBvZiB1bmNvcGllZCBieXRlcy4KLSAqIG1lbWNweSBzZXRzIHYwIHRvIGRzdC4KLSAqLwogCS5hbGlnbgk1Ci1MRUFGKG1lbWNweSkJCQkJCS8qIGEwPWRzdCBhMT1zcmMgYTI9bGVuICovCi0JbW92ZQl2MCwgZHN0CQkJCS8qIHJldHVybiB2YWx1ZSAqLwotLkxfX21lbWNweToKLUZFWFBPUlQoX19jb3B5X3VzZXIpCi0JbGkJdDYsIDAJLyogbm90IGluYXRvbWljICovCi1fX2NvcHlfdXNlcl9jb21tb246CisKKwkvKgorCSAqIE1hY3JvIHRvIGJ1aWxkIHRoZSBfX2NvcHlfdXNlciBjb21tb24gY29kZQorCSAqIEFyZ3VlbWVudHM6CisJICogbW9kZSA6IExFR0FDWV9NT0RFIG9yIEVWQV9NT0RFCisJICogZnJvbSA6IFNvdXJjZSBvcGVyYW5kLiBVU0VST1Agb3IgS0VSTkVMT1AKKwkgKiB0byAgIDogRGVzdGluYXRpb24gb3BlcmFuZC4gVVNFUk9QIG9yIEtFUk5FTE9QCisJICovCisJLm1hY3JvIF9fQlVJTERfQ09QWV9VU0VSIG1vZGUsIGZyb20sIHRvCisKKwkvKiBpbml0aWFsaXplIF9fbWVtY3B5IGlmIHRoaXMgdGhlIGZpcnN0IHRpbWUgd2UgZXhlY3V0ZSB0aGlzIG1hY3JvICovCisJLmlmbm90ZGVmIF9fbWVtY3B5CisJLnNldCBfX21lbWNweSwgMQorCS5oaWRkZW4gX19tZW1jcHkgLyogbWFrZSBzdXJlIGl0IGRvZXMgbm90IGxlYWsgKi8KKwkuZW5kaWYKKwogCS8qCiAJICogTm90ZTogZHN0ICYgc3JjIG1heSBiZSB1bmFsaWduZWQsIGxlbiBtYXkgYmUgMAogCSAqIFRlbXBzCkBAIC0yMTcsOTQgKzI4Myw5NCBAQAogCSAqCiAJICogSWYgbGVuIDwgTkJZVEVTIHVzZSBieXRlIG9wZXJhdGlvbnMuCiAJICovCi0JUFJFRigJMCwgMChzcmMpICkKLQlQUkVGKAkxLCAwKGRzdCkgKQorCVBSRUZTKAkwLCAwKHNyYykgKQorCVBSRUZEKAkxLCAwKGRzdCkgKQogCXNsdHUJdDIsIGxlbiwgTkJZVEVTCiAJYW5kCXQxLCBkc3QsIEFERFJNQVNLCi0JUFJFRigJMCwgMSozMihzcmMpICkKLQlQUkVGKAkxLCAxKjMyKGRzdCkgKQotCWJuZXoJdDIsIC5MY29weV9ieXRlc19jaGVja2xlbgorCVBSRUZTKAkwLCAxKjMyKHNyYykgKQorCVBSRUZEKAkxLCAxKjMyKGRzdCkgKQorCWJuZXoJdDIsIC5MY29weV9ieXRlc19jaGVja2xlblxACiAJIGFuZAl0MCwgc3JjLCBBRERSTUFTSwotCVBSRUYoCTAsIDIqMzIoc3JjKSApCi0JUFJFRigJMSwgMiozMihkc3QpICkKLQlibmV6CXQxLCAuTGRzdF91bmFsaWduZWQKKwlQUkVGUygJMCwgMiozMihzcmMpICkKKwlQUkVGRCgJMSwgMiozMihkc3QpICkKKwlibmV6CXQxLCAuTGRzdF91bmFsaWduZWRcQAogCSBub3AKLQlibmV6CXQwLCAuTHNyY191bmFsaWduZWRfZHN0X2FsaWduZWQKKwlibmV6CXQwLCAuTHNyY191bmFsaWduZWRfZHN0X2FsaWduZWRcQAogCS8qCiAJICogdXNlIGRlbGF5IHNsb3QgZm9yIGZhbGwtdGhyb3VnaAogCSAqIHNyYyBhbmQgZHN0IGFyZSBhbGlnbmVkOyBuZWVkIHRvIGNvbXB1dGUgcmVtCiAJICovCi0uTGJvdGhfYWxpZ25lZDoKKy5MYm90aF9hbGlnbmVkXEA6CiAJIFNSTAl0MCwgbGVuLCBMT0dfTkJZVEVTKzMJICMgKzMgZm9yIDggdW5pdHMvaXRlcgotCWJlcXoJdDAsIC5MY2xlYW51cF9ib3RoX2FsaWduZWQgIyBsZW4gPCA4Kk5CWVRFUworCWJlcXoJdDAsIC5MY2xlYW51cF9ib3RoX2FsaWduZWRcQCAjIGxlbiA8IDgqTkJZVEVTCiAJIGFuZAlyZW0sIGxlbiwgKDgqTkJZVEVTLTEpCSAjIHJlbSA9IGxlbiAlICg4Kk5CWVRFUykKLQlQUkVGKAkwLCAzKjMyKHNyYykgKQotCVBSRUYoCTEsIDMqMzIoZHN0KSApCisJUFJFRlMoCTAsIDMqMzIoc3JjKSApCisJUFJFRkQoCTEsIDMqMzIoZHN0KSApCiAJLmFsaWduCTQKIDE6CiAJUjEwS0NCQVJSSUVSKDAocmEpKQotRVhDKAlMT0FECXQwLCBVTklUKDApKHNyYyksCS5MbF9leGMpCi1FWEMoCUxPQUQJdDEsIFVOSVQoMSkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQyLCBVTklUKDIpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0MywgVU5JVCgzKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTE9BRCh0MCwgVU5JVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTE9BRCh0MSwgVU5JVCgxKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQyLCBVTklUKDIpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDMsIFVOSVQoMykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJU1VCCWxlbiwgbGVuLCA4Kk5CWVRFUwotRVhDKAlMT0FECXQ0LCBVTklUKDQpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0NywgVU5JVCg1KShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCVNUT1JFCXQwLCBVTklUKDApKGRzdCksCS5Mc19leGNfcDh1KQotRVhDKAlTVE9SRQl0MSwgVU5JVCgxKShkc3QpLAkuTHNfZXhjX3A3dSkKLUVYQygJTE9BRAl0MCwgVU5JVCg2KShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDEsIFVOSVQoNykoc3JjKSwJLkxsX2V4Y19jb3B5KQorCUxPQUQodDQsIFVOSVQoNCkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0NywgVU5JVCg1KShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlTVE9SRSh0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjX3A4dVxAKQorCVNUT1JFKHQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNfcDd1XEApCisJTE9BRCh0MCwgVU5JVCg2KShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQxLCBVTklUKDcpKHNyYyksIC5MbF9leGNfY29weVxAKQogCUFERAlzcmMsIHNyYywgOCpOQllURVMKIAlBREQJZHN0LCBkc3QsIDgqTkJZVEVTCi1FWEMoCVNUT1JFCXQyLCBVTklUKC02KShkc3QpLAkuTHNfZXhjX3A2dSkKLUVYQygJU1RPUkUJdDMsIFVOSVQoLTUpKGRzdCksCS5Mc19leGNfcDV1KQotRVhDKAlTVE9SRQl0NCwgVU5JVCgtNCkoZHN0KSwJLkxzX2V4Y19wNHUpCi1FWEMoCVNUT1JFCXQ3LCBVTklUKC0zKShkc3QpLAkuTHNfZXhjX3AzdSkKLUVYQygJU1RPUkUJdDAsIFVOSVQoLTIpKGRzdCksCS5Mc19leGNfcDJ1KQotRVhDKAlTVE9SRQl0MSwgVU5JVCgtMSkoZHN0KSwJLkxzX2V4Y19wMXUpCi0JUFJFRigJMCwgOCozMihzcmMpICkKLQlQUkVGKAkxLCA4KjMyKGRzdCkgKQorCVNUT1JFKHQyLCBVTklUKC02KShkc3QpLCAuTHNfZXhjX3A2dVxAKQorCVNUT1JFKHQzLCBVTklUKC01KShkc3QpLCAuTHNfZXhjX3A1dVxAKQorCVNUT1JFKHQ0LCBVTklUKC00KShkc3QpLCAuTHNfZXhjX3A0dVxAKQorCVNUT1JFKHQ3LCBVTklUKC0zKShkc3QpLCAuTHNfZXhjX3AzdVxAKQorCVNUT1JFKHQwLCBVTklUKC0yKShkc3QpLCAuTHNfZXhjX3AydVxAKQorCVNUT1JFKHQxLCBVTklUKC0xKShkc3QpLCAuTHNfZXhjX3AxdVxAKQorCVBSRUZTKAkwLCA4KjMyKHNyYykgKQorCVBSRUZEKAkxLCA4KjMyKGRzdCkgKQogCWJuZQlsZW4sIHJlbSwgMWIKIAkgbm9wCiAKIAkvKgogCSAqIGxlbiA9PSByZW0gPT0gdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGNvcHkgPCA4Kk5CWVRFUwogCSAqLwotLkxjbGVhbnVwX2JvdGhfYWxpZ25lZDoKLQliZXF6CWxlbiwgLkxkb25lCisuTGNsZWFudXBfYm90aF9hbGlnbmVkXEA6CisJYmVxeglsZW4sIC5MZG9uZVxACiAJIHNsdHUJdDAsIGxlbiwgNCpOQllURVMKLQlibmV6CXQwLCAuTGxlc3NfdGhhbl80dW5pdHMKKwlibmV6CXQwLCAuTGxlc3NfdGhhbl80dW5pdHNcQAogCSBhbmQJcmVtLCBsZW4sIChOQllURVMtMSkJIyByZW0gPSBsZW4gJSBOQllURVMKIAkvKgogCSAqIGxlbiA+PSA0Kk5CWVRFUwogCSAqLwotRVhDKAlMT0FECXQwLCBVTklUKDApKHNyYyksCS5MbF9leGMpCi1FWEMoCUxPQUQJdDEsIFVOSVQoMSkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQyLCBVTklUKDIpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0MywgVU5JVCgzKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTE9BRCggdDAsIFVOSVQoMCkoc3JjKSwJLkxsX2V4Y1xAKQorCUxPQUQoIHQxLCBVTklUKDEpKHNyYyksCS5MbF9leGNfY29weVxAKQorCUxPQUQoIHQyLCBVTklUKDIpKHNyYyksCS5MbF9leGNfY29weVxAKQorCUxPQUQoIHQzLCBVTklUKDMpKHNyYyksCS5MbF9leGNfY29weVxAKQogCVNVQglsZW4sIGxlbiwgNCpOQllURVMKIAlBREQJc3JjLCBzcmMsIDQqTkJZVEVTCiAJUjEwS0NCQVJSSUVSKDAocmEpKQotRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjX3A0dSkKLUVYQygJU1RPUkUJdDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y19wM3UpCi1FWEMoCVNUT1JFCXQyLCBVTklUKDIpKGRzdCksCS5Mc19leGNfcDJ1KQotRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjX3AxdSkKKwlTVE9SRSh0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjX3A0dVxAKQorCVNUT1JFKHQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNfcDN1XEApCisJU1RPUkUodDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4Y19wMnVcQCkKKwlTVE9SRSh0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjX3AxdVxAKQogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIDQqTkJZVEVTCi0JYmVxeglsZW4sIC5MZG9uZQorCWJlcXoJbGVuLCAuTGRvbmVcQAogCS5zZXQJbm9yZW9yZGVyCi0uTGxlc3NfdGhhbl80dW5pdHM6CisuTGxlc3NfdGhhbl80dW5pdHNcQDoKIAkvKgogCSAqIHJlbSA9IGxlbiAlIE5CWVRFUwogCSAqLwotCWJlcQlyZW0sIGxlbiwgLkxjb3B5X2J5dGVzCisJYmVxCXJlbSwgbGVuLCAuTGNvcHlfYnl0ZXNcQAogCSBub3AKIDE6CiAJUjEwS0NCQVJSSUVSKDAocmEpKQotRVhDKAlMT0FECXQwLCAwKHNyYyksCQkuTGxfZXhjKQorCUxPQUQodDAsIDAoc3JjKSwgLkxsX2V4Y1xAKQogCUFERAlzcmMsIHNyYywgTkJZVEVTCiAJU1VCCWxlbiwgbGVuLCBOQllURVMKLUVYQygJU1RPUkUJdDAsIDAoZHN0KSwJCS5Mc19leGNfcDF1KQorCVNUT1JFKHQwLCAwKGRzdCksIC5Mc19leGNfcDF1XEApCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgTkJZVEVTCiAJYm5lCXJlbSwgbGVuLCAxYgpAQCAtMzIyLDE3ICszODgsMTcgQEAKIAkgKiBtb3JlIGluc3RydWN0aW9uLWxldmVsIHBhcmFsbGVsaXNtLgogCSAqLwogI2RlZmluZSBiaXRzIHQyCi0JYmVxeglsZW4sIC5MZG9uZQorCWJlcXoJbGVuLCAuTGRvbmVcQAogCSBBREQJdDEsIGRzdCwgbGVuCSMgdDEgaXMganVzdCBwYXN0IGxhc3QgYnl0ZSBvZiBkc3QKIAlsaQliaXRzLCA4Kk5CWVRFUwogCVNMTAlyZW0sIGxlbiwgMwkjIHJlbSA9IG51bWJlciBvZiBiaXRzIHRvIGtlZXAKLUVYQygJTE9BRAl0MCwgMChzcmMpLAkJLkxsX2V4YykKKwlMT0FEKHQwLCAwKHNyYyksIC5MbF9leGNcQCkKIAlTVUIJYml0cywgYml0cywgcmVtICMgYml0cyA9IG51bWJlciBvZiBiaXRzIHRvIGRpc2NhcmQKIAlTSElGVF9ESVNDQVJEIHQwLCB0MCwgYml0cwotRVhDKAlTVFJFU1QJdDAsIC0xKHQxKSwJCS5Mc19leGMpCisJU1RSRVNUKHQwLCAtMSh0MSksIC5Mc19leGNcQCkKIAlqcglyYQogCSBtb3ZlCWxlbiwgemVybwotLkxkc3RfdW5hbGlnbmVkOgorLkxkc3RfdW5hbGlnbmVkXEA6CiAJLyoKIAkgKiBkc3QgaXMgdW5hbGlnbmVkCiAJICogdDAgPSBzcmMgJiBBRERSTUFTSwpAQCAtMzQzLDI1ICs0MDksMjUgQEAKIAkgKiBTZXQgbWF0Y2ggPSAoc3JjIGFuZCBkc3QgaGF2ZSBzYW1lIGFsaWdubWVudCkKIAkgKi8KICNkZWZpbmUgbWF0Y2ggcmVtCi1FWEMoCUxERklSU1QgdDMsIEZJUlNUKDApKHNyYyksCS5MbF9leGMpCisJTERGSVJTVCh0MywgRklSU1QoMCkoc3JjKSwgLkxsX2V4Y1xAKQogCUFERAl0MiwgemVybywgTkJZVEVTCi1FWEMoCUxEUkVTVAl0MywgUkVTVCgwKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTERSRVNUKHQzLCBSRVNUKDApKHNyYyksIC5MbF9leGNfY29weVxAKQogCVNVQgl0MiwgdDIsIHQxCSMgdDIgPSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCiAJeG9yCW1hdGNoLCB0MCwgdDEKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCi1FWEMoCVNURklSU1QgdDMsIEZJUlNUKDApKGRzdCksCS5Mc19leGMpCi0JYmVxCWxlbiwgdDIsIC5MZG9uZQorCVNURklSU1QodDMsIEZJUlNUKDApKGRzdCksIC5Mc19leGNcQCkKKwliZXEJbGVuLCB0MiwgLkxkb25lXEAKIAkgU1VCCWxlbiwgbGVuLCB0MgogCUFERAlkc3QsIGRzdCwgdDIKLQliZXF6CW1hdGNoLCAuTGJvdGhfYWxpZ25lZAorCWJlcXoJbWF0Y2gsIC5MYm90aF9hbGlnbmVkXEAKIAkgQURECXNyYywgc3JjLCB0MgogCi0uTHNyY191bmFsaWduZWRfZHN0X2FsaWduZWQ6CisuTHNyY191bmFsaWduZWRfZHN0X2FsaWduZWRcQDoKIAlTUkwJdDAsIGxlbiwgTE9HX05CWVRFUysyCSAjICsyIGZvciA0IHVuaXRzL2l0ZXIKLQlQUkVGKAkwLCAzKjMyKHNyYykgKQotCWJlcXoJdDAsIC5MY2xlYW51cF9zcmNfdW5hbGlnbmVkCisJUFJFRlMoCTAsIDMqMzIoc3JjKSApCisJYmVxegl0MCwgLkxjbGVhbnVwX3NyY191bmFsaWduZWRcQAogCSBhbmQJcmVtLCBsZW4sICg0Kk5CWVRFUy0xKQkgIyByZW0gPSBsZW4gJSA0Kk5CWVRFUwotCVBSRUYoCTEsIDMqMzIoZHN0KSApCisJUFJFRkQoCTEsIDMqMzIoZHN0KSApCiAxOgogLyoKICAqIEF2b2lkIGNvbnNlY3V0aXZlIExEKidzIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIHNpbmNlIHNvbWUgbWlwcwpAQCAtMzcwLDU4ICs0MzYsNTggQEAKICAqIGFyZSB0byB0aGUgc2FtZSB1bml0ICh1bmxlc3Mgc3JjIGlzIGFsaWduZWQsIGJ1dCBpdCdzIG5vdCkuCiAgKi8KIAlSMTBLQ0JBUlJJRVIoMChyYSkpCi1FWEMoCUxERklSU1QgdDAsIEZJUlNUKDApKHNyYyksCS5MbF9leGMpCi1FWEMoCUxERklSU1QgdDEsIEZJUlNUKDEpKHNyYyksCS5MbF9leGNfY29weSkKKwlMREZJUlNUKHQwLCBGSVJTVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTERGSVJTVCh0MSwgRklSU1QoMSkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJU1VCCWxlbiwgbGVuLCA0Kk5CWVRFUwotRVhDKAlMRFJFU1QJdDAsIFJFU1QoMCkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMRFJFU1QJdDEsIFJFU1QoMSkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMREZJUlNUIHQyLCBGSVJTVCgyKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxERklSU1QgdDMsIEZJUlNUKDMpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERSRVNUCXQyLCBSRVNUKDIpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERSRVNUCXQzLCBSRVNUKDMpKHNyYyksCS5MbF9leGNfY29weSkKLQlQUkVGKAkwLCA5KjMyKHNyYykgKQkJIyAwIGlzIFBSRUZfTE9BRCAgKG5vdCBzdHJlYW1lZCkKKwlMRFJFU1QodDAsIFJFU1QoMCkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTERSRVNUKHQxLCBSRVNUKDEpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxERklSU1QodDIsIEZJUlNUKDIpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxERklSU1QodDMsIEZJUlNUKDMpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxEUkVTVCh0MiwgUkVTVCgyKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMRFJFU1QodDMsIFJFU1QoMykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJUFJFRlMoCTAsIDkqMzIoc3JjKSApCQkjIDAgaXMgUFJFRl9MT0FEICAobm90IHN0cmVhbWVkKQogCUFERAlzcmMsIHNyYywgNCpOQllURVMKICNpZmRlZiBDT05GSUdfQ1BVX1NCMQogCW5vcAkJCQkjIGltcHJvdmVzIHNsb3R0aW5nCiAjZW5kaWYKLUVYQygJU1RPUkUJdDAsIFVOSVQoMCkoZHN0KSwJLkxzX2V4Y19wNHUpCi1FWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNfcDN1KQotRVhDKAlTVE9SRQl0MiwgVU5JVCgyKShkc3QpLAkuTHNfZXhjX3AydSkKLUVYQygJU1RPUkUJdDMsIFVOSVQoMykoZHN0KSwJLkxzX2V4Y19wMXUpCi0JUFJFRigJMSwgOSozMihkc3QpICkJCSMgMSBpcyBQUkVGX1NUT1JFIChub3Qgc3RyZWFtZWQpCisJU1RPUkUodDAsIFVOSVQoMCkoZHN0KSwJLkxzX2V4Y19wNHVcQCkKKwlTVE9SRSh0MSwgVU5JVCgxKShkc3QpLAkuTHNfZXhjX3AzdVxAKQorCVNUT1JFKHQyLCBVTklUKDIpKGRzdCksCS5Mc19leGNfcDJ1XEApCisJU1RPUkUodDMsIFVOSVQoMykoZHN0KSwJLkxzX2V4Y19wMXVcQCkKKwlQUkVGRCgJMSwgOSozMihkc3QpICkJCSMgMSBpcyBQUkVGX1NUT1JFIChub3Qgc3RyZWFtZWQpCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgNCpOQllURVMKIAlibmUJbGVuLCByZW0sIDFiCiAJLnNldAlub3Jlb3JkZXIKIAotLkxjbGVhbnVwX3NyY191bmFsaWduZWQ6Ci0JYmVxeglsZW4sIC5MZG9uZQorLkxjbGVhbnVwX3NyY191bmFsaWduZWRcQDoKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkgYW5kCXJlbSwgbGVuLCBOQllURVMtMSAgIyByZW0gPSBsZW4gJSBOQllURVMKLQliZXEJcmVtLCBsZW4sIC5MY29weV9ieXRlcworCWJlcQlyZW0sIGxlbiwgLkxjb3B5X2J5dGVzXEAKIAkgbm9wCiAxOgogCVIxMEtDQkFSUklFUigwKHJhKSkKLUVYQygJTERGSVJTVCB0MCwgRklSU1QoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTERSRVNUCXQwLCBSRVNUKDApKHNyYyksCS5MbF9leGNfY29weSkKKwlMREZJUlNUKHQwLCBGSVJTVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTERSRVNUKHQwLCBSRVNUKDApKHNyYyksIC5MbF9leGNfY29weVxAKQogCUFERAlzcmMsIHNyYywgTkJZVEVTCiAJU1VCCWxlbiwgbGVuLCBOQllURVMKLUVYQygJU1RPUkUJdDAsIDAoZHN0KSwJCS5Mc19leGNfcDF1KQorCVNUT1JFKHQwLCAwKGRzdCksIC5Mc19leGNfcDF1XEApCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgTkJZVEVTCiAJYm5lCWxlbiwgcmVtLCAxYgogCS5zZXQJbm9yZW9yZGVyCiAKLS5MY29weV9ieXRlc19jaGVja2xlbjoKLQliZXF6CWxlbiwgLkxkb25lCisuTGNvcHlfYnl0ZXNfY2hlY2tsZW5cQDoKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkgbm9wCi0uTGNvcHlfYnl0ZXM6CisuTGNvcHlfYnl0ZXNcQDoKIAkvKiAwIDwgbGVuIDwgTkJZVEVTICAqLwogCVIxMEtDQkFSUklFUigwKHJhKSkKICNkZWZpbmUgQ09QWV9CWVRFKE4pCQkJXAotRVhDKAlsYgl0MCwgTihzcmMpLCAuTGxfZXhjKTsJXAorCUxPQURCKHQwLCBOKHNyYyksIC5MbF9leGNcQCk7CVwKIAlTVUIJbGVuLCBsZW4sIDE7CQlcCi0JYmVxeglsZW4sIC5MZG9uZTsJCVwKLUVYQygJIHNiCXQwLCBOKGRzdCksIC5Mc19leGNfcDEpCisJYmVxeglsZW4sIC5MZG9uZVxAOwkJXAorCVNUT1JFQih0MCwgTihkc3QpLCAuTHNfZXhjX3AxXEApCiAKIAlDT1BZX0JZVEUoMCkKIAlDT1BZX0JZVEUoMSkKQEAgLTQzMSwxNiArNDk3LDE5IEBACiAJQ09QWV9CWVRFKDQpCiAJQ09QWV9CWVRFKDUpCiAjZW5kaWYKLUVYQygJbGIJdDAsIE5CWVRFUy0yKHNyYyksIC5MbF9leGMpCisJTE9BREIodDAsIE5CWVRFUy0yKHNyYyksIC5MbF9leGNcQCkKIAlTVUIJbGVuLCBsZW4sIDEKIAlqcglyYQotRVhDKAkgc2IJdDAsIE5CWVRFUy0yKGRzdCksIC5Mc19leGNfcDEpCi0uTGRvbmU6CisJU1RPUkVCKHQwLCBOQllURVMtMihkc3QpLCAuTHNfZXhjX3AxXEApCisuTGRvbmVcQDoKIAlqcglyYQotCSBub3AKKwkuaWYgX19tZW1jcHkgPT0gMQogCUVORChtZW1jcHkpCisJLnNldCBfX21lbWNweSwgMAorCS5oaWRkZW4gX19tZW1jcHkKKwkuZW5kaWYKIAotLkxsX2V4Y19jb3B5OgorLkxsX2V4Y19jb3B5XEA6CiAJLyoKIAkgKiBDb3B5IGJ5dGVzIGZyb20gc3JjIHVudGlsIGZhdWx0aW5nIGxvYWQgYWRkcmVzcyAob3IgdW50aWwgYQogCSAqIGxiIGZhdWx0cykKQEAgLTQ1MSwyNCArNTIwLDI0IEBACiAJICoKIAkgKiBBc3N1bWVzIHNyYyA8IFRIUkVBRF9CVUFERFIoJDI4KQogCSAqLwotCUxPQUQJdDAsIFRJX1RBU0soJDI4KQorCUxPQURLCXQwLCBUSV9UQVNLKCQyOCkKIAkgbm9wCi0JTE9BRAl0MCwgVEhSRUFEX0JVQUREUih0MCkKKwlMT0FESwl0MCwgVEhSRUFEX0JVQUREUih0MCkKIDE6Ci1FWEMoCWxiCXQxLCAwKHNyYyksCS5MbF9leGMpCisJTE9BREIodDEsIDAoc3JjKSwgLkxsX2V4Y1xAKQogCUFERAlzcmMsIHNyYywgMQogCXNiCXQxLCAwKGRzdCkJIyBjYW4ndCBmYXVsdCAtLSB3ZSdyZSBjb3B5X2Zyb21fdXNlcgogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIDEKIAlibmUJc3JjLCB0MCwgMWIKIAkuc2V0CW5vcmVvcmRlcgotLkxsX2V4YzoKLQlMT0FECXQwLCBUSV9UQVNLKCQyOCkKKy5MbF9leGNcQDoKKwlMT0FESwl0MCwgVElfVEFTSygkMjgpCiAJIG5vcAotCUxPQUQJdDAsIFRIUkVBRF9CVUFERFIodDApCSMgdDAgaXMganVzdCBwYXN0IGxhc3QgZ29vZCBhZGRyZXNzCisJTE9BREsJdDAsIFRIUkVBRF9CVUFERFIodDApCSMgdDAgaXMganVzdCBwYXN0IGxhc3QgZ29vZCBhZGRyZXNzCiAJIG5vcAogCVNVQglsZW4sIEFULCB0MAkJIyBsZW4gbnVtYmVyIG9mIHVuY29waWVkIGJ5dGVzCi0JYm5legl0NiwgLkxkb25lCS8qIFNraXAgdGhlIHplcm9pbmcgcGFydCBpZiBpbmF0b21pYyAqLworCWJuZXoJdDYsIC5MZG9uZVxACS8qIFNraXAgdGhlIHplcm9pbmcgcGFydCBpZiBpbmF0b21pYyAqLwogCS8qCiAJICogSGVyZSdzIHdoZXJlIHdlIHJlbHkgb24gc3JjIGFuZCBkc3QgYmVpbmcgaW5jcmVtZW50ZWQgaW4gdGFuZGVtLAogCSAqICAgU2VlICgzKSBhYm92ZS4KQEAgLTQ4Miw3ICs1NTEsNyBAQAogCSAqLwogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlTVUIJc3JjLCBsZW4sIDEKLQliZXF6CWxlbiwgLkxkb25lCisJYmVxeglsZW4sIC5MZG9uZVxACiAJLnNldAlub3Jlb3JkZXIKIDE6CXNiCXplcm8sIDAoZHN0KQogCUFERAlkc3QsIGRzdCwgMQpAQCAtNTAzLDcgKzU3Miw3IEBACiAKICNkZWZpbmUgU0VYQyhuKQkJCQkJCQlcCiAJLnNldAlyZW9yZGVyOwkJCS8qIERBRERJX1dBUiAqLyBcCi0uTHNfZXhjX3AgIyMgbiAjIyB1OgkJCQkJCVwKKy5Mc19leGNfcCAjIyBuICMjIHVcQDoJCQkJCQlcCiAJQURECWxlbiwgbGVuLCBuKk5CWVRFUzsJCQkJXAogCWpyCXJhOwkJCQkJCVwKIAkuc2V0CW5vcmVvcmRlcgpAQCAtNTE3LDE0ICs1ODYsMTUgQEAKIFNFWEMoMikKIFNFWEMoMSkKIAotLkxzX2V4Y19wMToKKy5Mc19leGNfcDFcQDoKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJQURECWxlbiwgbGVuLCAxCiAJanIJcmEKIAkuc2V0CW5vcmVvcmRlcgotLkxzX2V4YzoKKy5Mc19leGNcQDoKIAlqcglyYQogCSBub3AKKwkuZW5kbQogCiAJLmFsaWduCTUKIExFQUYobWVtbW92ZSkKQEAgLTU3NSwzICs2NDUsNzEgQEAKIAlqcglyYQogCSBtb3ZlCWEyLCB6ZXJvCiAJRU5EKF9fcm1lbWNweSkKKworLyoKKyAqIHQ2IGlzIHVzZWQgYXMgYSBmbGFnIHRvIG5vdGUgaW5hdG9taWMgbW9kZS4KKyAqLworTEVBRihfX2NvcHlfdXNlcl9pbmF0b21pYykKKwliCV9fY29weV91c2VyX2NvbW1vbgorCWxpCXQ2LCAxCisJRU5EKF9fY29weV91c2VyX2luYXRvbWljKQorCisvKgorICogQSBjb21iaW5lZCBtZW1jcHkvX19jb3B5X3VzZXIKKyAqIF9fY29weV91c2VyIHNldHMgbGVuIHRvIDAgZm9yIHN1Y2Nlc3M7IGVsc2UgdG8gYW4gdXBwZXIgYm91bmQgb2YKKyAqIHRoZSBudW1iZXIgb2YgdW5jb3BpZWQgYnl0ZXMuCisgKiBtZW1jcHkgc2V0cyB2MCB0byBkc3QuCisgKi8KKwkuYWxpZ24JNQorTEVBRihtZW1jcHkpCQkJCQkvKiBhMD1kc3QgYTE9c3JjIGEyPWxlbiAqLworCW1vdmUJdjAsIGRzdAkJCQkvKiByZXR1cm4gdmFsdWUgKi8KKy5MX19tZW1jcHk6CitGRVhQT1JUKF9fY29weV91c2VyKQorCWxpCXQ2LCAwCS8qIG5vdCBpbmF0b21pYyAqLworX19jb3B5X3VzZXJfY29tbW9uOgorCS8qIExlZ2FjeSBNb2RlLCB1c2VyIDwtPiB1c2VyICovCisJX19CVUlMRF9DT1BZX1VTRVIgTEVHQUNZX01PREUgVVNFUk9QIFVTRVJPUAorCisjaWZkZWYgQ09ORklHX0VWQQorCisvKgorICogRm9yIEVWQSB3ZSBuZWVkIGRpc3RpbmN0IHN5bWJvbHMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gdXNlciBzcGFjZS4KKyAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBzcGVjaWZpYyBFVkEgaW5zdHJ1Y3Rpb25zIHRvIHBlcmZvcm0gdGhlCisgKiB2aXJ0dWFsIDwtPiBwaHlzaWNhbCB0cmFuc2xhdGlvbiB3aGVuIGEgdmlydHVhbCBhZGRyZXNzIGlzIGFjdHVhbGx5IGluIHVzZXIKKyAqIHNwYWNlCisgKi8KKworTEVBRihfX2NvcHlfdXNlcl9pbmF0b21pY19ldmEpCisJYiAgICAgICBfX2NvcHlfZnJvbV91c2VyX2NvbW1vbgorCWxpCXQ2LCAxCisJRU5EKF9fY29weV91c2VyX2luYXRvbWljX2V2YSkKKworLyoKKyAqIF9fY29weV9mcm9tX3VzZXIgKEVWQSkKKyAqLworCitMRUFGKF9fY29weV9mcm9tX3VzZXJfZXZhKQorCWxpCXQ2LCAwCS8qIG5vdCBpbmF0b21pYyAqLworX19jb3B5X2Zyb21fdXNlcl9jb21tb246CisJX19CVUlMRF9DT1BZX1VTRVIgRVZBX01PREUgVVNFUk9QIEtFUk5FTE9QCitFTkQoX19jb3B5X2Zyb21fdXNlcl9ldmEpCisKKworCisvKgorICogX19jb3B5X3RvX3VzZXIgKEVWQSkKKyAqLworCitMRUFGKF9fY29weV90b191c2VyX2V2YSkKK19fQlVJTERfQ09QWV9VU0VSIEVWQV9NT0RFIEtFUk5FTE9QIFVTRVJPUAorRU5EKF9fY29weV90b191c2VyX2V2YSkKKworLyoKKyAqIF9fY29weV9pbl91c2VyIChFVkEpCisgKi8KKworTEVBRihfX2NvcHlfaW5fdXNlcl9ldmEpCitfX0JVSUxEX0NPUFlfVVNFUiBFVkFfTU9ERSBVU0VST1AgVVNFUk9QCitFTkQoX19jb3B5X2luX3VzZXJfZXZhKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvbWVtc2V0LlMgYi9hcmNoL21pcHMvbGliL21lbXNldC5TCmluZGV4IDA1ODAxOTQuLjdiMGU1NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvbWVtc2V0LlMKKysrIGIvYXJjaC9taXBzL2xpYi9tZW1zZXQuUwpAQCAtMzQsMTMgKzM0LDI3IEBACiAjZGVmaW5lIEZJTExQVFJHIHQwCiAjZW5kaWYKIAorI2RlZmluZSBMRUdBQ1lfTU9ERSAxCisjZGVmaW5lIEVWQV9NT0RFICAgIDIKKworLyoKKyAqIE5vIG5lZWQgdG8gcHJvdGVjdCBpdCB3aXRoIEVWQSAjaWZkZWZlcnkuIFRoZSBnZW5lcmF0ZWQgYmxvY2sgb2YgY29kZQorICogd2lsbCBuZXZlciBiZSBhc3NlbWJsZWQgaWYgRVZBIGlzIG5vdCBlbmFibGVkLgorICovCisjZGVmaW5lIF9fRVZBRlkoaW5zbiwgcmVnLCBhZGRyKSBfX0JVSUxEX0VWQV9JTlNOKGluc24jI2UsIHJlZywgYWRkcikKKyNkZWZpbmUgX19fQlVJTERfRVZBX0lOU04oaW5zbiwgcmVnLCBhZGRyKSBfX0VWQUZZKGluc24sIHJlZywgYWRkcikKKwogI2RlZmluZSBFWChpbnNuLHJlZyxhZGRyLGhhbmRsZXIpCQkJXAotOToJaW5zbglyZWcsIGFkZHI7CQkJCVwKKwkuaWYgXG1vZGUgPT0gTEVHQUNZX01PREU7CQkJXAorOToJCWluc24JcmVnLCBhZGRyOwkJCVwKKwkuZWxzZTsJCQkJCQlcCis5OgkJX19fQlVJTERfRVZBX0lOU04oaW5zbiwgcmVnLCBhZGRyKTsJXAorCS5lbmRpZjsJCQkJCQlcCiAJLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CQkJXAogCVBUUgk5YiwgaGFuZGxlcjsJCQkJXAogCS5wcmV2aW91cwogCi0JLm1hY3JvCWZfZmlsbDY0IGRzdCwgb2Zmc2V0LCB2YWwsIGZpeHVwCisJLm1hY3JvCWZfZmlsbDY0IGRzdCwgb2Zmc2V0LCB2YWwsIGZpeHVwLCBtb2RlCiAJRVgoTE9OR19TLCBcdmFsLCAoXG9mZnNldCArICAwICogU1RPUlNJWkUpKFxkc3QpLCBcZml4dXApCiAJRVgoTE9OR19TLCBcdmFsLCAoXG9mZnNldCArICAxICogU1RPUlNJWkUpKFxkc3QpLCBcZml4dXApCiAJRVgoTE9OR19TLCBcdmFsLCAoXG9mZnNldCArICAyICogU1RPUlNJWkUpKFxkc3QpLCBcZml4dXApCkBAIC02MywzNCArNzcsMjQgQEAKICNlbmRpZgogCS5lbmRtCiAKLS8qCi0gKiBtZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQotICoKLSAqIGEwOiBzdGFydCBvZiBhcmVhIHRvIGNsZWFyCi0gKiBhMTogY2hhciB0byBmaWxsIHdpdGgKLSAqIGEyOiBzaXplIG9mIGFyZWEgdG8gY2xlYXIKLSAqLwogCS5zZXQJbm9yZW9yZGVyCiAJLmFsaWduCTUKLUxFQUYobWVtc2V0KQotCWJlcXoJCWExLCAxZgotCSBtb3ZlCQl2MCwgYTAJCQkvKiByZXN1bHQgKi8KIAotCWFuZGkJCWExLCAweGZmCQkvKiBzcHJlYWQgZmlsbHdvcmQgKi8KLQlMT05HX1NMTAkJdDEsIGExLCA4Ci0Jb3IJCWExLCB0MQotCUxPTkdfU0xMCQl0MSwgYTEsIDE2Ci0jaWYgTE9OR1NJWkUgPT0gOAotCW9yCQlhMSwgdDEKLQlMT05HX1NMTAkJdDEsIGExLCAzMgotI2VuZGlmCi0Jb3IJCWExLCB0MQotMToKKwkvKgorCSAqIE1hY3JvIHRvIGdlbmVyYXRlIHRoZSBfX2J6ZXJveyxfdXNlcn0gc3ltYm9sCisJICogQXJndW1lbnRzOgorCSAqIG1vZGU6IExFR0FDWV9NT0RFIG9yIEVWQV9NT0RFCisJICovCisJLm1hY3JvIF9fQlVJTERfQlpFUk8gbW9kZQorCS8qIEluaXRpYWxpemUgX19tZW1zZXQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBjYWxsIHRoaXMgbWFjcm8gKi8KKwkuaWZub3RkZWYgX19tZW1zZXQKKwkuc2V0IF9fbWVtc2V0LCAxCisJLmhpZGRlbiBfX21lbXNldCAvKiBNYWtlIHN1cmUgaXQgZG9lcyBub3QgbGVhayAqLworCS5lbmRpZgogCi1GRVhQT1JUKF9fYnplcm8pCiAJc2x0aXUJCXQwLCBhMiwgU1RPUlNJWkUJLyogdmVyeSBzbWFsbCByZWdpb24/ICovCi0JYm5legkJdDAsIC5Mc21hbGxfbWVtc2V0Ci0JIGFuZGkJCXQwLCBhMCwgU1RPUk1BU0sJLyogYWxpZ25lZD8gKi8KKwlibmV6CQl0MCwgLkxzbWFsbF9tZW1zZXRcQAorCWFuZGkJCXQwLCBhMCwgU1RPUk1BU0sJLyogYWxpZ25lZD8gKi8KIAogI2lmZGVmIENPTkZJR19DUFVfTUlDUk9NSVBTCiAJbW92ZQkJdDgsIGExCQkJLyogdXNlZCBieSAnc3dwJyBpbnN0cnVjdGlvbiAqLwpAQCAtOTgsMzkgKzEwMiwzOSBAQAogI2VuZGlmCiAjaWZuZGVmIENPTkZJR19DUFVfREFERElfV09SS0FST1VORFMKIAliZXF6CQl0MCwgMWYKLQkgUFRSX1NVQlUJdDAsIFNUT1JTSVpFCQkvKiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KKwlQVFJfU1VCVQl0MCwgU1RPUlNJWkUJCS8qIGFsaWdubWVudCBpbiBieXRlcyAqLwogI2Vsc2UKIAkuc2V0CQlub2F0CiAJbGkJCUFULCBTVE9SU0laRQogCWJlcXoJCXQwLCAxZgotCSBQVFJfU1VCVQl0MCwgQVQJCQkvKiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KKwlQVFJfU1VCVQl0MCwgQVQJCQkvKiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KIAkuc2V0CQlhdAogI2VuZGlmCiAKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCiAjaWZkZWYgX19NSVBTRUJfXwotCUVYKExPTkdfU19MLCBhMSwgKGEwKSwgLkxmaXJzdF9maXh1cCkJLyogbWFrZSB3b3JkL2R3b3JkIGFsaWduZWQgKi8KKwlFWChMT05HX1NfTCwgYTEsIChhMCksIC5MZmlyc3RfZml4dXBcQCkJLyogbWFrZSB3b3JkL2R3b3JkIGFsaWduZWQgKi8KICNlbmRpZgogI2lmZGVmIF9fTUlQU0VMX18KLQlFWChMT05HX1NfUiwgYTEsIChhMCksIC5MZmlyc3RfZml4dXApCS8qIG1ha2Ugd29yZC9kd29yZCBhbGlnbmVkICovCisJRVgoTE9OR19TX1IsIGExLCAoYTApLCAuTGZpcnN0X2ZpeHVwXEApCS8qIG1ha2Ugd29yZC9kd29yZCBhbGlnbmVkICovCiAjZW5kaWYKIAlQVFJfU1VCVQlhMCwgdDAJCQkvKiBsb25nIGFsaWduIHB0ciAqLwogCVBUUl9BRERVCWEyLCB0MAkJCS8qIGNvcnJlY3Qgc2l6ZSAqLwogCiAxOglvcmkJCXQxLCBhMiwgMHgzZgkJLyogIyBvZiBmdWxsIGJsb2NrcyAqLwogCXhvcmkJCXQxLCAweDNmCi0JYmVxegkJdDEsIC5MbWVtc2V0X3BhcnRpYWwJLyogbm8gYmxvY2sgdG8gZmlsbCAqLwotCSBhbmRpCQl0MCwgYTIsIDB4NDAtU1RPUlNJWkUKKwliZXF6CQl0MSwgLkxtZW1zZXRfcGFydGlhbFxACS8qIG5vIGJsb2NrIHRvIGZpbGwgKi8KKwlhbmRpCQl0MCwgYTIsIDB4NDAtU1RPUlNJWkUKIAogCVBUUl9BRERVCXQxLCBhMAkJCS8qIGVuZCBhZGRyZXNzICovCiAJLnNldAkJcmVvcmRlcgogMToJUFRSX0FERElVCWEwLCA2NAogCVIxMEtDQkFSUklFUigwKHJhKSkKLQlmX2ZpbGw2NCBhMCwgLTY0LCBGSUxMNjRSRywgLkxmd2RfZml4dXAKKwlmX2ZpbGw2NCBhMCwgLTY0LCBGSUxMNjRSRywgLkxmd2RfZml4dXBcQCwgXG1vZGUKIAlibmUJCXQxLCBhMCwgMWIKIAkuc2V0CQlub3Jlb3JkZXIKIAotLkxtZW1zZXRfcGFydGlhbDoKKy5MbWVtc2V0X3BhcnRpYWxcQDoKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCiAJUFRSX0xBCQl0MSwgMmYJCQkvKiB3aGVyZSB0byBzdGFydCAqLwogI2lmZGVmIENPTkZJR19DUFVfTUlDUk9NSVBTCkBAIC0xNDUsNjAgKzE0OSwxMDAgQEAKIAkuc2V0CQlhdAogI2VuZGlmCiAJanIJCXQxCi0JIFBUUl9BRERVCWEwLCB0MAkJCS8qIGRlc3QgcHRyICovCisJUFRSX0FERFUJYTAsIHQwCQkJLyogZGVzdCBwdHIgKi8KIAogCS5zZXQJCXB1c2gKIAkuc2V0CQlub3Jlb3JkZXIKIAkuc2V0CQlub21hY3JvCi0JZl9maWxsNjQgYTAsIC02NCwgRklMTDY0UkcsIC5McGFydGlhbF9maXh1cAkvKiAuLi4gYnV0IGZpcnN0IGRvIGxvbmdzIC4uLiAqLworCS8qIC4uLiBidXQgZmlyc3QgZG8gbG9uZ3MgLi4uICovCisJZl9maWxsNjQgYTAsIC02NCwgRklMTDY0UkcsIC5McGFydGlhbF9maXh1cFxALCBcbW9kZQogMjoJLnNldAkJcG9wCiAJYW5kaQkJYTIsIFNUT1JNQVNLCQkvKiBBdCBtb3N0IG9uZSBsb25nIHRvIGdvICovCiAKIAliZXF6CQlhMiwgMWYKLQkgUFRSX0FERFUJYTAsIGEyCQkJLyogV2hhdCdzIGxlZnQgKi8KKwlQVFJfQUREVQlhMCwgYTIJCQkvKiBXaGF0J3MgbGVmdCAqLwogCVIxMEtDQkFSUklFUigwKHJhKSkKICNpZmRlZiBfX01JUFNFQl9fCi0JRVgoTE9OR19TX1IsIGExLCAtMShhMCksIC5MbGFzdF9maXh1cCkKKwlFWChMT05HX1NfUiwgYTEsIC0xKGEwKSwgLkxsYXN0X2ZpeHVwXEApCiAjZW5kaWYKICNpZmRlZiBfX01JUFNFTF9fCi0JRVgoTE9OR19TX0wsIGExLCAtMShhMCksIC5MbGFzdF9maXh1cCkKKwlFWChMT05HX1NfTCwgYTEsIC0xKGEwKSwgLkxsYXN0X2ZpeHVwXEApCiAjZW5kaWYKIDE6CWpyCQlyYQotCSBtb3ZlCQlhMiwgemVybworCW1vdmUJCWEyLCB6ZXJvCiAKLS5Mc21hbGxfbWVtc2V0OgorLkxzbWFsbF9tZW1zZXRcQDoKIAliZXF6CQlhMiwgMmYKLQkgUFRSX0FERFUJdDEsIGEwLCBhMgorCVBUUl9BRERVCXQxLCBhMCwgYTIKIAogMToJUFRSX0FERElVCWEwLCAxCQkJLyogZmlsbCBieXRld2lzZSAqLwogCVIxMEtDQkFSUklFUigwKHJhKSkKIAlibmUJCXQxLCBhMCwgMWIKLQkgc2IJCWExLCAtMShhMCkKKwlzYgkJYTEsIC0xKGEwKQogCiAyOglqcgkJcmEJCQkvKiBkb25lICovCi0JIG1vdmUJCWEyLCB6ZXJvCisJbW92ZQkJYTIsIHplcm8KKwkuaWYgX19tZW1zZXQgPT0gMQogCUVORChtZW1zZXQpCisJLnNldCBfX21lbXNldCwgMAorCS5oaWRkZW4gX19tZW1zZXQKKwkuZW5kaWYKIAotLkxmaXJzdF9maXh1cDoKKy5MZmlyc3RfZml4dXBcQDoKIAlqcglyYQotCSBub3AKKwlub3AKIAotLkxmd2RfZml4dXA6CisuTGZ3ZF9maXh1cFxAOgogCVBUUl9MCQl0MCwgVElfVEFTSygkMjgpCiAJYW5kaQkJYTIsIDB4M2YKIAlMT05HX0wJCXQwLCBUSFJFQURfQlVBRERSKHQwKQogCUxPTkdfQUREVQlhMiwgdDEKIAlqcgkJcmEKLQkgTE9OR19TVUJVCWEyLCB0MAorCUxPTkdfU1VCVQlhMiwgdDAKIAotLkxwYXJ0aWFsX2ZpeHVwOgorLkxwYXJ0aWFsX2ZpeHVwXEA6CiAJUFRSX0wJCXQwLCBUSV9UQVNLKCQyOCkKIAlhbmRpCQlhMiwgU1RPUk1BU0sKIAlMT05HX0wJCXQwLCBUSFJFQURfQlVBRERSKHQwKQogCUxPTkdfQUREVQlhMiwgdDEKIAlqcgkJcmEKLQkgTE9OR19TVUJVCWEyLCB0MAorCUxPTkdfU1VCVQlhMiwgdDAKIAotLkxsYXN0X2ZpeHVwOgorLkxsYXN0X2ZpeHVwXEA6CiAJanIJCXJhCi0JIGFuZGkJCXYxLCBhMiwgU1RPUk1BU0sKKwlhbmRpCQl2MSwgYTIsIFNUT1JNQVNLCisKKwkuZW5kbQorCisvKgorICogbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikKKyAqCisgKiBhMDogc3RhcnQgb2YgYXJlYSB0byBjbGVhcgorICogYTE6IGNoYXIgdG8gZmlsbCB3aXRoCisgKiBhMjogc2l6ZSBvZiBhcmVhIHRvIGNsZWFyCisgKi8KKworTEVBRihtZW1zZXQpCisJYmVxegkJYTEsIDFmCisJbW92ZQkJdjAsIGEwCQkJLyogcmVzdWx0ICovCisKKwlhbmRpCQlhMSwgMHhmZgkJLyogc3ByZWFkIGZpbGx3b3JkICovCisJTE9OR19TTEwJCXQxLCBhMSwgOAorCW9yCQlhMSwgdDEKKwlMT05HX1NMTAkJdDEsIGExLCAxNgorI2lmIExPTkdTSVpFID09IDgKKwlvcgkJYTEsIHQxCisJTE9OR19TTEwJCXQxLCBhMSwgMzIKKyNlbmRpZgorCW9yCQlhMSwgdDEKKzE6CisjaWZuZGVmIENPTkZJR19FVkEKK0ZFWFBPUlQoX19iemVybykKKyNlbmRpZgorCV9fQlVJTERfQlpFUk8gTEVHQUNZX01PREUKKworI2lmZGVmIENPTkZJR19FVkEKK0xFQUYoX19iemVybykKKwlfX0JVSUxEX0JaRVJPIEVWQV9NT0RFCitFTkQoX19iemVybykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9zdHJsZW5fdXNlci5TIGIvYXJjaC9taXBzL2xpYi9zdHJsZW5fdXNlci5TCmluZGV4IGUzNjJkY2QuLmJlZjY1YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvc3RybGVuX3VzZXIuUworKysgYi9hcmNoL21pcHMvbGliL3N0cmxlbl91c2VyLlMKQEAgLTIyLDE5ICsyMiw0MyBAQAogICoKICAqIFJldHVybiAwIGZvciBlcnJvcgogICovCi1MRUFGKF9fc3RybGVuX3VzZXJfYXNtKQorCS5tYWNybyBfX0JVSUxEX1NUUkxFTl9BU00gZnVuYworTEVBRihfX3N0cmxlbl9cZnVuY1woKV9hc20pCiAJTE9OR19MCQl2MCwgVElfQUREUl9MSU1JVCgkMjgpCSMgcG9pbnRlciBvaz8KIAlhbmQJCXYwLCBhMAotCWJuZXoJCXYwLCAuTGZhdWx0CisJYm5legkJdjAsIC5MZmF1bHRcQAogCi1GRVhQT1JUKF9fc3RybGVuX3VzZXJfbm9jaGVja19hc20pCitGRVhQT1JUKF9fc3RybGVuX1xmdW5jXCgpX25vY2hlY2tfYXNtKQogCW1vdmUJCXYwLCBhMAotMToJRVgobGJ1LCB2MSwgKHYwKSwgLkxmYXVsdCkKKy5pZmVxcyAiXGZ1bmMiLCAia2VybmVsIgorMToJRVgobGJ1LCB2MSwgKHYwKSwgLkxmYXVsdFxAKQorLmVsc2UKKzE6CUVYKGxidWUsIHYxLCAodjApLCAuTGZhdWx0XEApCisuZW5kaWYKIAlQVFJfQURESVUJdjAsIDEKIAlibmV6CQl2MSwgMWIKIAlQVFJfU1VCVQl2MCwgYTAKIAlqcgkJcmEKLQlFTkQoX19zdHJsZW5fdXNlcl9hc20pCisJRU5EKF9fc3RybGVuX1xmdW5jXCgpX2FzbSkKIAotLkxmYXVsdDoJbW92ZQkJdjAsIHplcm8KKy5MZmF1bHRcQDoJbW92ZQkJdjAsIHplcm8KIAlqcgkJcmEKKwkuZW5kbQorCisjaWZuZGVmIENPTkZJR19FVkEKKwkvKiBTZXQgYWxpYXNlcyAqLworCS5nbG9iYWwgX19zdHJsZW5fdXNlcl9hc20KKwkuZ2xvYmFsIF9fc3RybGVuX3VzZXJfbm9jaGVja19hc20KKwkuc2V0IF9fc3RybGVuX3VzZXJfYXNtLCBfX3N0cmxlbl9rZXJuZWxfYXNtCisJLnNldCBfX3N0cmxlbl91c2VyX25vY2hlY2tfYXNtLCBfX3N0cmxlbl9rZXJuZWxfbm9jaGVja19hc20KKyNlbmRpZgorCitfX0JVSUxEX1NUUkxFTl9BU00ga2VybmVsCisKKyNpZmRlZiBDT05GSUdfRVZBCisKKwkuc2V0IHB1c2gKKwkuc2V0IGV2YQorX19CVUlMRF9TVFJMRU5fQVNNIHVzZXIKKwkuc2V0IHBvcAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TIGIvYXJjaC9taXBzL2xpYi9zdHJuY3B5X3VzZXIuUwppbmRleCA5Mjg3MGI2Li5kMzMwMWNkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TCisrKyBiL2FyY2gvbWlwcy9saWIvc3RybmNweV91c2VyLlMKQEAgLTI4LDE2ICsyOCwyMSBAQAogICogaXQgaGFwcGVucyBhdCBtb3N0IHNvbWUgYnl0ZXMgb2YgdGhlIGV4Y2VwdGlvbnMgaGFuZGxlcnMgd2lsbCBiZSBjb3BpZWQuCiAgKi8KIAotTEVBRihfX3N0cm5jcHlfZnJvbV91c2VyX2FzbSkKKwkubWFjcm8gX19CVUlMRF9TVFJOQ1BZX0FTTSBmdW5jCitMRUFGKF9fc3RybmNweV9mcm9tX1xmdW5jXCgpX2FzbSkKIAlMT05HX0wJCXYwLCBUSV9BRERSX0xJTUlUKCQyOCkJIyBwb2ludGVyIG9rPwogCWFuZAkJdjAsIGExCi0JYm5legkJdjAsIC5MZmF1bHQKKwlibmV6CQl2MCwgLkxmYXVsdFxACiAKLUZFWFBPUlQoX19zdHJuY3B5X2Zyb21fdXNlcl9ub2NoZWNrX2FzbSkKK0ZFWFBPUlQoX19zdHJuY3B5X2Zyb21fXGZ1bmNcKClfbm9jaGVja19hc20pCiAJLnNldAkJbm9yZW9yZGVyCiAJbW92ZQkJdDAsIHplcm8KIAltb3ZlCQl2MSwgYTEKLTE6CUVYKGxidSwgdjAsICh2MSksIC5MZmF1bHQpCisuaWZlcXMgIlxmdW5jIiwia2VybmVsIgorMToJRVgobGJ1LCB2MCwgKHYxKSwgLkxmYXVsdFxAKQorLmVsc2UKKzE6CUVYKGxidWUsIHYwLCAodjEpLCAuTGZhdWx0XEApCisuZW5kaWYKIAlQVFJfQURESVUJdjEsIDEKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCiAJYmVxegkJdjAsIDJmCkBAIC00NywxNSArNTIsMzQgQEAKIAkgUFRSX0FERElVCWEwLCAxCiAyOglQVFJfQUREVQl2MCwgYTEsIHQwCiAJeG9yCQl2MCwgYTEKLQlibHR6CQl2MCwgLkxmYXVsdAorCWJsdHoJCXYwLCAuTGZhdWx0XEAKIAkgbm9wCiAJanIJCXJhCQkJIyByZXR1cm4gbgogCSBtb3ZlCQl2MCwgdDAKLQlFTkQoX19zdHJuY3B5X2Zyb21fdXNlcl9hc20pCisJRU5EKF9fc3RybmNweV9mcm9tX1xmdW5jXCgpX2FzbSkKIAotLkxmYXVsdDoganIJCXJhCisuTGZhdWx0XEA6IGpyCQlyYQogCSAgbGkJCXYwLCAtRUZBVUxUCiAKIAkuc2VjdGlvbglfX2V4X3RhYmxlLCJhIgotCVBUUgkJMWIsIC5MZmF1bHQKKwlQVFIJCTFiLCAuTGZhdWx0XEAKIAkucHJldmlvdXMKKworCS5lbmRtCisKKyNpZm5kZWYgQ09ORklHX0VWQQorCS8qIFNldCBhbGlhc2VzICovCisJLmdsb2JhbCBfX3N0cm5jcHlfZnJvbV91c2VyX2FzbQorCS5nbG9iYWwgX19zdHJuY3B5X2Zyb21fdXNlcl9ub2NoZWNrX2FzbQorCS5zZXQgX19zdHJuY3B5X2Zyb21fdXNlcl9hc20sIF9fc3RybmNweV9mcm9tX2tlcm5lbF9hc20KKwkuc2V0IF9fc3RybmNweV9mcm9tX3VzZXJfbm9jaGVja19hc20sIF9fc3RybmNweV9mcm9tX2tlcm5lbF9ub2NoZWNrX2FzbQorI2VuZGlmCisKK19fQlVJTERfU1RSTkNQWV9BU00ga2VybmVsCisKKyNpZmRlZiBDT05GSUdfRVZBCisJLnNldCBwdXNoCisJLnNldCBldmEKK19fQlVJTERfU1RSTkNQWV9BU00gdXNlcgorCS5zZXQgcG9wCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvc3Rybmxlbl91c2VyLlMgYi9hcmNoL21pcHMvbGliL3N0cm5sZW5fdXNlci5TCmluZGV4IGZjYWNlYTUuLmYzYWY2OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvc3Rybmxlbl91c2VyLlMKKysrIGIvYXJjaC9taXBzL2xpYi9zdHJubGVuX3VzZXIuUwpAQCAtMjUsMjIgKzI1LDQ2IEBACiAgKgkgYnl0ZXMuCSBUaGVyZSdzIG5vdGhpbmcgc2VjcmV0IHRoZXJlLglPbiA2NC1iaXQgYWNjZXNzaW5nIGJleW9uZAogICoJIHRoZSBtYXhpbXVtIGlzIGEgdGFkIGhhaXJpZXIgLi4uCiAgKi8KLUxFQUYoX19zdHJubGVuX3VzZXJfYXNtKQorCS5tYWNybyBfX0JVSUxEX1NUUk5MRU5fQVNNIGZ1bmMKK0xFQUYoX19zdHJubGVuX1xmdW5jXCgpX2FzbSkKIAlMT05HX0wJCXYwLCBUSV9BRERSX0xJTUlUKCQyOCkJIyBwb2ludGVyIG9rPwogCWFuZAkJdjAsIGEwCi0JYm5legkJdjAsIC5MZmF1bHQKKwlibmV6CQl2MCwgLkxmYXVsdFxACiAKLUZFWFBPUlQoX19zdHJubGVuX3VzZXJfbm9jaGVja19hc20pCitGRVhQT1JUKF9fc3Rybmxlbl9cZnVuY1woKV9ub2NoZWNrX2FzbSkKIAltb3ZlCQl2MCwgYTAKIAlQVFJfQUREVQlhMSwgYTAJCQkjIHN0b3AgcG9pbnRlcgogMToJYmVxCQl2MCwgYTEsIDFmCQkjIGxpbWl0IHJlYWNoZWQ/Ci0JRVgobGIsIHQwLCAodjApLCAuTGZhdWx0KQorLmlmZXFzICJcZnVuYyIsICJrZXJuZWwiCisJRVgobGIsIHQwLCAodjApLCAuTGZhdWx0XEApCisuZWxzZQorCUVYKGxiZSwgdDAsICh2MCksIC5MZmF1bHRcQCkKKy5lbmRpZgogCVBUUl9BRERJVQl2MCwgMQogCWJuZXoJCXQwLCAxYgogMToJUFRSX1NVQlUJdjAsIGEwCiAJanIJCXJhCi0JRU5EKF9fc3Rybmxlbl91c2VyX2FzbSkKKwlFTkQoX19zdHJubGVuX1xmdW5jXCgpX2FzbSkKIAotLkxmYXVsdDoKKy5MZmF1bHRcQDoKIAltb3ZlCQl2MCwgemVybwogCWpyCQlyYQorCS5lbmRtCisKKyNpZm5kZWYgQ09ORklHX0VWQQorCS8qIFNldCBhbGlhc2VzICovCisJLmdsb2JhbCBfX3N0cm5sZW5fdXNlcl9hc20KKwkuZ2xvYmFsIF9fc3Rybmxlbl91c2VyX25vY2hlY2tfYXNtCisJLnNldCBfX3N0cm5sZW5fdXNlcl9hc20sIF9fc3Rybmxlbl9rZXJuZWxfYXNtCisJLnNldCBfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbSwgX19zdHJubGVuX2tlcm5lbF9ub2NoZWNrX2FzbQorI2VuZGlmCisKK19fQlVJTERfU1RSTkxFTl9BU00ga2VybmVsCisKKyNpZmRlZiBDT05GSUdfRVZBCisKKwkuc2V0IHB1c2gKKwkuc2V0IGV2YQorX19CVUlMRF9TVFJOTEVOX0FTTSB1c2VyCisJLnNldCBwb3AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL0tjb25maWcgYi9hcmNoL21pcHMvbG9vbmdzb24vS2NvbmZpZwppbmRleCAyNjNiZWI5Li43Mzk3YmUyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vS2NvbmZpZworKysgYi9hcmNoL21pcHMvbG9vbmdzb24vS2NvbmZpZwpAQCAtNTksNiArNTksMzYgQEAKIAogCSAgVGhlc2UgZmFtaWx5IG1hY2hpbmVzIGluY2x1ZGUgZnVsb29uZzJmIG1pbmkgUEMsIHllZWxvb25nMmYgbm90ZWJvb2ssCiAJICBMaW5nTG9vbmcgYWxsaW5vbmUgUEMgYW5kIHNvIGZvcnRoLgorCitjb25maWcgTEVNT1RFX01BQ0gzQQorCWJvb2wgIkxlbW90ZSBMb29uZ3NvbiAzQSBmYW1pbHkgbWFjaGluZXMiCisJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCXNlbGVjdCBHRU5FUklDX0lTQV9ETUFfU1VQUE9SVF9CUk9LRU4KKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCisJc2VsZWN0IEJPT1RfRUxGMzIKKwlzZWxlY3QgQk9BUkRfU0NBQ0hFCisJc2VsZWN0IENTUkNfUjRLCisJc2VsZWN0IENFVlRfUjRLCisJc2VsZWN0IENQVV9IQVNfV0IKKwlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBJU0EKKwlzZWxlY3QgSFRfUENJCisJc2VsZWN0IEk4MjU5CisJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgTlJfQ1BVU19ERUZBVUxUXzQKKwlzZWxlY3QgU1lTX0hBU19DUFVfTE9PTkdTT04zCisJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCisJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0hPVFBMVUdfQ1BVCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0hJR0hNRU0KKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KKwlzZWxlY3QgTE9PTkdTT05fTUMxNDY4MTgKKwlzZWxlY3QgWk9ORV9ETUEzMgorCXNlbGVjdCBMRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRQorCWhlbHAKKwkJTGVtb3RlIExvb25nc29uIDNBIGZhbWlseSBtYWNoaW5lcyB1dGlsaXplIHRoZSAzQSByZXZpc2lvbiBvZgorCQlMb29uZ3NvbiBwcm9jZXNzb3IgYW5kIFJTNzgwL1NCWDAwIGNoaXBzZXQuCiBlbmRjaG9pY2UKIAogY29uZmlnIENTNTUzNgpAQCAtODYsOCArMTE2LDI1IEBACiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBFQVJMWV9QUklOVEsgfHwgU0VSSUFMXzgyNTAKIAorY29uZmlnIElPTU1VX0hFTFBFUgorCWJvb2wKKworY29uZmlnIE5FRURfU0dfRE1BX0xFTkdUSAorCWJvb2wKKworY29uZmlnIFNXSU9UTEIKKwlib29sICJTb2Z0IElPTU1VIFN1cHBvcnQgZm9yIEFsbC1NZW1vcnkgRE1BIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ1BVX0xPT05HU09OMworCXNlbGVjdCBJT01NVV9IRUxQRVIKKwlzZWxlY3QgTkVFRF9TR19ETUFfTEVOR1RICisJc2VsZWN0IE5FRURfRE1BX01BUF9TVEFURQorCiBjb25maWcgTE9PTkdTT05fTUMxNDY4MTgKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBMRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRQorCWJvb2wKKwogZW5kaWYgIyBNQUNIX0xPT05HU09OCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vTWFrZWZpbGUgYi9hcmNoL21pcHMvbG9vbmdzb24vTWFrZWZpbGUKaW5kZXggMGRjMDA1NS4uNzQyOTk5NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9NYWtlZmlsZQpAQCAtMTUsMyArMTUsOSBAQAogIwogCiBvYmotJChDT05GSUdfTEVNT1RFX01BQ0gyRikgICs9IGxlbW90ZS0yZi8KKworIworIyBBbGwgTG9vbmdzb24tMyBmYW1pbHkgbWFjaGluZXMKKyMKKworb2JqLSQoQ09ORklHX0NQVV9MT09OR1NPTjMpICArPSBsb29uZ3Nvbi0zLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL1BsYXRmb3JtIGIvYXJjaC9taXBzL2xvb25nc29uL1BsYXRmb3JtCmluZGV4IDI5NjkyZTUuLjYyMDUzNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9QbGF0Zm9ybQorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vUGxhdGZvcm0KQEAgLTMwLDMgKzMwLDQgQEAKIGNmbGFncy0kKENPTkZJR19NQUNIX0xPT05HU09OKSArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24gLW1uby1icmFuY2gtbGlrZWx5CiBsb2FkLSQoQ09ORklHX0xFTU9URV9GVUxPT05HMkUpICs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogbG9hZC0kKENPTkZJR19MRU1PVEVfTUFDSDJGKSArPSAweGZmZmZmZmZmODAyMDAwMDAKK2xvYWQtJChDT05GSUdfQ1BVX0xPT05HU09OMykgKz0gMHhmZmZmZmZmZjgwMjAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9NYWtlZmlsZQppbmRleCA5ZTQ0ODRjLi4wYmI5Y2M5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vTWFrZWZpbGUKQEAgLTI2LDMgKzI2LDggQEAKICMKIAogb2JqLSQoQ09ORklHX0xPT05HU09OX1NVU1BFTkQpICs9IHBtLm8KKworIworIyBCaWcgTWVtb3J5IChTV0lPVExCKSBTdXBwb3J0CisjCitvYmotJChDT05GSUdfU1dJT1RMQikgKz0gZG1hLXN3aW90bGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9kbWEtc3dpb3RsYi5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9kbWEtc3dpb3RsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYmUwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2RtYS1zd2lvdGxiLmMKQEAgLTAsMCArMSwxMzYgQEAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGJvb3RfcGFyYW0uaD4KKyNpbmNsdWRlIDxkbWEtY29oZXJlbmNlLmg+CisKK3N0YXRpYyB2b2lkICpsb29uZ3Nvbl9kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwl2b2lkICpyZXQ7CisKKwlpZiAoZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCAmcmV0KSkKKwkJcmV0dXJuIHJldDsKKworCS8qIGlnbm9yZSByZWdpb24gc3BlY2lmaWVycyAqLworCWdmcCAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0RNQTMyIHwgX19HRlBfSElHSE1FTSk7CisKKyNpZmRlZiBDT05GSUdfSVNBCisJaWYgKGRldiA9PSBOVUxMKQorCQlnZnAgfD0gX19HRlBfRE1BOworCWVsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR19aT05FX0RNQQorCWlmIChkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgRE1BX0JJVF9NQVNLKDMyKSkKKwkJZ2ZwIHw9IF9fR0ZQX0RNQTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEzMgorCWlmIChkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgRE1BX0JJVF9NQVNLKDQwKSkKKwkJZ2ZwIHw9IF9fR0ZQX0RNQTMyOworCWVsc2UKKyNlbmRpZgorCTsKKwlnZnAgfD0gX19HRlBfTk9SRVRSWTsKKworCXJldCA9IHN3aW90bGJfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBnZnApOworCW1iKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbG9vbmdzb25fZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCisJaWYgKGRtYV9yZWxlYXNlX2Zyb21fY29oZXJlbnQoZGV2LCBvcmRlciwgdmFkZHIpKQorCQlyZXR1cm47CisKKwlzd2lvdGxiX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IGxvb25nc29uX2RtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJZG1hX2FkZHJfdCBkYWRkciA9IHN3aW90bGJfbWFwX3BhZ2UoZGV2LCBwYWdlLCBvZmZzZXQsIHNpemUsCisJCQkJCWRpciwgYXR0cnMpOworCW1iKCk7CisJcmV0dXJuIGRhZGRyOworfQorCitzdGF0aWMgaW50IGxvb25nc29uX2RtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCXN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCWludCByID0gc3dpb3RsYl9tYXBfc2dfYXR0cnMoZGV2LCBzZywgbmVudHMsIGRpciwgTlVMTCk7CisJbWIoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBsb29uZ3Nvbl9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyKTsKKwltYigpOworfQorCitzdGF0aWMgdm9pZCBsb29uZ3Nvbl9kbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKGRldiwgc2csIG5lbnRzLCBkaXIpOworCW1iKCk7Cit9CisKK3N0YXRpYyBpbnQgbG9vbmdzb25fZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJaWYgKG1hc2sgPiBETUFfQklUX01BU0sobG9vbmdzb25fc3lzY29uZi5kbWFfbWFza19iaXRzKSkgeworCQkqZGV2LT5kbWFfbWFzayA9IERNQV9CSVRfTUFTSyhsb29uZ3Nvbl9zeXNjb25mLmRtYV9tYXNrX2JpdHMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkqZGV2LT5kbWFfbWFzayA9IG1hc2s7CisKKwlyZXR1cm4gMDsKK30KKworZG1hX2FkZHJfdCBwaHlzX3RvX2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBhZGRyKQoreworCXJldHVybiBwYWRkcjsKK30KKworcGh5c19hZGRyX3QgZG1hX3RvX3BoeXMoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRhZGRyKQoreworCXJldHVybiBkYWRkcjsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfbWFwX29wcyBsb29uZ3Nvbl9kbWFfbWFwX29wcyA9IHsKKwkuYWxsb2MgPSBsb29uZ3Nvbl9kbWFfYWxsb2NfY29oZXJlbnQsCisJLmZyZWUgPSBsb29uZ3Nvbl9kbWFfZnJlZV9jb2hlcmVudCwKKwkubWFwX3BhZ2UgPSBsb29uZ3Nvbl9kbWFfbWFwX3BhZ2UsCisJLnVubWFwX3BhZ2UgPSBzd2lvdGxiX3VubWFwX3BhZ2UsCisJLm1hcF9zZyA9IGxvb25nc29uX2RtYV9tYXBfc2csCisJLnVubWFwX3NnID0gc3dpb3RsYl91bm1hcF9zZ19hdHRycywKKwkuc3luY19zaW5nbGVfZm9yX2NwdSA9IHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2NwdSwKKwkuc3luY19zaW5nbGVfZm9yX2RldmljZSA9IGxvb25nc29uX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlLAorCS5zeW5jX3NnX2Zvcl9jcHUgPSBzd2lvdGxiX3N5bmNfc2dfZm9yX2NwdSwKKwkuc3luY19zZ19mb3JfZGV2aWNlID0gbG9vbmdzb25fZG1hX3N5bmNfc2dfZm9yX2RldmljZSwKKwkubWFwcGluZ19lcnJvciA9IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IsCisJLmRtYV9zdXBwb3J0ZWQgPSBzd2lvdGxiX2RtYV9zdXBwb3J0ZWQsCisJLnNldF9kbWFfbWFzayA9IGxvb25nc29uX2RtYV9zZXRfbWFzaworfTsKKwordm9pZCBfX2luaXQgcGxhdF9zd2lvdGxiX3NldHVwKHZvaWQpCit7CisJc3dpb3RsYl9pbml0KDEpOworCW1pcHNfZG1hX21hcF9vcHMgPSAmbG9vbmdzb25fZG1hX21hcF9vcHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2Vudi5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9lbnYuYwppbmRleCAwYTE4ZmNmLi4wYzU0M2VhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2Vudi5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vZW52LmMKQEAgLTE4LDI5ICsxOCwzMCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0KICNpbmNsdWRlIDxsb29uZ3Nvbi5oPgorI2luY2x1ZGUgPGJvb3RfcGFyYW0uaD4KIAotdW5zaWduZWQgbG9uZyBjcHVfY2xvY2tfZnJlcTsKK3UzMiBjcHVfY2xvY2tfZnJlcTsKIEVYUE9SVF9TWU1CT0woY3B1X2Nsb2NrX2ZyZXEpOwotdW5zaWduZWQgbG9uZyBtZW1zaXplLCBoaWdobWVtc2l6ZTsKK3N0cnVjdCBlZmlfbWVtb3J5X21hcF9sb29uZ3NvbiAqbG9vbmdzb25fbWVtbWFwOworc3RydWN0IGxvb25nc29uX3N5c3RlbV9jb25maWd1cmF0aW9uIGxvb25nc29uX3N5c2NvbmY7CiAKICNkZWZpbmUgcGFyc2VfZXZlbl9lYXJsaWVyKHJlcywgb3B0aW9uLCBwKQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCXVuc2lnbmVkIGludCB0bXAgX19tYXliZV91bnVzZWQ7CQkJCVwKIAkJCQkJCQkJCVwKIAlpZiAoc3RybmNtcChvcHRpb24sIChjaGFyICopcCwgc3RybGVuKG9wdGlvbikpID09IDApCQlcCi0JCXRtcCA9IHN0cmljdF9zdHJ0b2woKGNoYXIgKilwICsgc3RybGVuKG9wdGlvbiI9IiksIDEwLCAmcmVzKTsgXAorCQl0bXAgPSBrc3RydG91MzIoKGNoYXIgKilwICsgc3RybGVuKG9wdGlvbiI9IiksIDEwLCAmcmVzKTsgXAogfSB3aGlsZSAoMCkKIAogdm9pZCBfX2luaXQgcHJvbV9pbml0X2Vudih2b2lkKQogewogCS8qIHBtb24gcGFzc2VzIGFyZ3VtZW50cyBpbiAzMmJpdCBwb2ludGVycyAqLwotCWludCAqX3Byb21fZW52cDsKLQl1bnNpZ25lZCBsb25nIGJ1c19jbG9jazsKIAl1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOworCisjaWZuZGVmIENPTkZJR19MRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRQorCWludCAqX3Byb21fZW52cDsKIAlsb25nIGw7CiAKIAkvKiBmaXJtd2FyZSBhcmd1bWVudHMgYXJlIGluaXRpYWxpemVkIGluIGhlYWQuUyAqLwpAQCAtNDgsNyArNDksNiBAQAogCiAJbCA9IChsb25nKSpfcHJvbV9lbnZwOwogCXdoaWxlIChsICE9IDApIHsKLQkJcGFyc2VfZXZlbl9lYXJsaWVyKGJ1c19jbG9jaywgImJ1c2Nsb2NrIiwgbCk7CiAJCXBhcnNlX2V2ZW5fZWFybGllcihjcHVfY2xvY2tfZnJlcSwgImNwdWNsb2NrIiwgbCk7CiAJCXBhcnNlX2V2ZW5fZWFybGllcihtZW1zaXplLCAibWVtc2l6ZSIsIGwpOwogCQlwYXJzZV9ldmVuX2VhcmxpZXIoaGlnaG1lbXNpemUsICJoaWdobWVtc2l6ZSIsIGwpOwpAQCAtNTcsOCArNTcsNDggQEAKIAl9CiAJaWYgKG1lbXNpemUgPT0gMCkKIAkJbWVtc2l6ZSA9IDI1NjsKLQlpZiAoYnVzX2Nsb2NrID09IDApCi0JCWJ1c19jbG9jayA9IDY2MDAwMDAwOworCXByX2luZm8oIm1lbXNpemU9JXUsIGhpZ2htZW1zaXplPSV1XG4iLCBtZW1zaXplLCBoaWdobWVtc2l6ZSk7CisjZWxzZQorCXN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wOworCXN0cnVjdCBsb29uZ3Nvbl9wYXJhbXMgKmxvb25nc29uX3A7CisJc3RydWN0IGVmaV9jcHVpbmZvX2xvb25nc29uICplY3B1OworCXN0cnVjdCBpcnFfc291cmNlX3JvdXRpbmdfdGFibGUgKmVpcnFfc291cmNlOworCisJLyogZmlybXdhcmUgYXJndW1lbnRzIGFyZSBpbml0aWFsaXplZCBpbiBoZWFkLlMgKi8KKwlib290X3AgPSAoc3RydWN0IGJvb3RfcGFyYW1zICopZndfYXJnMjsKKwlsb29uZ3Nvbl9wID0gJihib290X3AtPmVmaS5zbWJpb3MubHApOworCisJZWNwdSA9IChzdHJ1Y3QgZWZpX2NwdWluZm9fbG9vbmdzb24gKikKKwkJKCh1NjQpbG9vbmdzb25fcCArIGxvb25nc29uX3AtPmNwdV9vZmZzZXQpOworCWVpcnFfc291cmNlID0gKHN0cnVjdCBpcnFfc291cmNlX3JvdXRpbmdfdGFibGUgKikKKwkJKCh1NjQpbG9vbmdzb25fcCArIGxvb25nc29uX3AtPmlycV9vZmZzZXQpOworCWxvb25nc29uX21lbW1hcCA9IChzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfbG9vbmdzb24gKikKKwkJKCh1NjQpbG9vbmdzb25fcCArIGxvb25nc29uX3AtPm1lbW9yeV9vZmZzZXQpOworCisJY3B1X2Nsb2NrX2ZyZXEgPSBlY3B1LT5jcHVfY2xvY2tfZnJlcTsKKwlsb29uZ3Nvbl9zeXNjb25mLmNwdXR5cGUgPSBlY3B1LT5jcHV0eXBlOworCWxvb25nc29uX3N5c2NvbmYubnJfY3B1cyA9IGVjcHUtPm5yX2NwdXM7CisJaWYgKGVjcHUtPm5yX2NwdXMgPiBOUl9DUFVTIHx8IGVjcHUtPm5yX2NwdXMgPT0gMCkKKwkJbG9vbmdzb25fc3lzY29uZi5ucl9jcHVzID0gTlJfQ1BVUzsKKworCWxvb25nc29uX3N5c2NvbmYucGNpX21lbV9zdGFydF9hZGRyID0gZWlycV9zb3VyY2UtPnBjaV9tZW1fc3RhcnRfYWRkcjsKKwlsb29uZ3Nvbl9zeXNjb25mLnBjaV9tZW1fZW5kX2FkZHIgPSBlaXJxX3NvdXJjZS0+cGNpX21lbV9lbmRfYWRkcjsKKwlsb29uZ3Nvbl9zeXNjb25mLnBjaV9pb19iYXNlID0gZWlycV9zb3VyY2UtPnBjaV9pb19zdGFydF9hZGRyOworCWxvb25nc29uX3N5c2NvbmYuZG1hX21hc2tfYml0cyA9IGVpcnFfc291cmNlLT5kbWFfbWFza19iaXRzOworCWlmIChsb29uZ3Nvbl9zeXNjb25mLmRtYV9tYXNrX2JpdHMgPCAzMiB8fAorCQlsb29uZ3Nvbl9zeXNjb25mLmRtYV9tYXNrX2JpdHMgPiA2NCkKKwkJbG9vbmdzb25fc3lzY29uZi5kbWFfbWFza19iaXRzID0gMzI7CisKKwlsb29uZ3Nvbl9zeXNjb25mLnJlc3RhcnRfYWRkciA9IGJvb3RfcC0+cmVzZXRfc3lzdGVtLlJlc2V0V2FybTsKKwlsb29uZ3Nvbl9zeXNjb25mLnBvd2Vyb2ZmX2FkZHIgPSBib290X3AtPnJlc2V0X3N5c3RlbS5TaHV0ZG93bjsKKwlsb29uZ3Nvbl9zeXNjb25mLnN1c3BlbmRfYWRkciA9IGJvb3RfcC0+cmVzZXRfc3lzdGVtLkRvU3VzcGVuZDsKKworCWxvb25nc29uX3N5c2NvbmYuaHRfY29udHJvbF9iYXNlID0gMHg5MDAwMEVGREZCMDAwMDAwOworCWxvb25nc29uX3N5c2NvbmYudmdhYmlvc19hZGRyID0gYm9vdF9wLT5lZmkuc21iaW9zLnZnYV9iaW9zOworCXByX2RlYnVnKCJTaHV0ZG93biBBZGRyOiAlbGx4LCBSZXN0YXJ0IEFkZHI6ICVsbHgsIFZCSU9TIEFkZHI6ICVsbHhcbiIsCisJCWxvb25nc29uX3N5c2NvbmYucG93ZXJvZmZfYWRkciwgbG9vbmdzb25fc3lzY29uZi5yZXN0YXJ0X2FkZHIsCisJCWxvb25nc29uX3N5c2NvbmYudmdhYmlvc19hZGRyKTsKKyNlbmRpZgogCWlmIChjcHVfY2xvY2tfZnJlcSA9PSAwKSB7CiAJCXByb2Nlc3Nvcl9pZCA9ICgmY3VycmVudF9jcHVfZGF0YSktPnByb2Nlc3Nvcl9pZDsKIAkJc3dpdGNoIChwcm9jZXNzb3JfaWQgJiBQUklEX1JFVl9NQVNLKSB7CkBAIC02OCwxMiArMTA4LDEzIEBACiAJCWNhc2UgUFJJRF9SRVZfTE9PTkdTT04yRjoKIAkJCWNwdV9jbG9ja19mcmVxID0gNzk3MDAwMDAwOwogCQkJYnJlYWs7CisJCWNhc2UgUFJJRF9SRVZfTE9PTkdTT04zQToKKwkJCWNwdV9jbG9ja19mcmVxID0gOTAwMDAwMDAwOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQljcHVfY2xvY2tfZnJlcSA9IDEwMDAwMDAwMDsKIAkJCWJyZWFrOwogCQl9CiAJfQotCi0JcHJfaW5mbygiYnVzY2xvY2s9JWxkLCBjcHVjbG9jaz0lbGQsIG1lbXNpemU9JWxkLCBoaWdobWVtc2l6ZT0lbGRcbiIsCi0JCWJ1c19jbG9jaywgY3B1X2Nsb2NrX2ZyZXEsIG1lbXNpemUsIGhpZ2htZW1zaXplKTsKKwlwcl9pbmZvKCJDcHVDbG9jayA9ICV1XG4iLCBjcHVfY2xvY2tfZnJlcSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2luaXQuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaW5pdC5jCmluZGV4IGFlN2FmMWYuLmYzN2ZlNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaW5pdC5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8YXNtL3NtcC1vcHMuaD4KIAogI2luY2x1ZGUgPGxvb25nc29uLmg+CiAKQEAgLTE3LDEwICsxOCw2IEBACiAKIHZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQogewotCS8qIGluaXQgYmFzZSBhZGRyZXNzIG9mIGlvIHNwYWNlICovCi0Jc2V0X2lvX3BvcnRfYmFzZSgodW5zaWduZWQgbG9uZykKLQkJaW9yZW1hcChMT09OR1NPTl9QQ0lJT19CQVNFLCBMT09OR1NPTl9QQ0lJT19TSVpFKSk7Ci0KICNpZmRlZiBDT05GSUdfQ1BVX1NVUFBPUlRTX0FERFJXSU5DRkcKIAlfbG9vbmdzb25fYWRkcndpbmNmZ19iYXNlID0gKHVuc2lnbmVkIGxvbmcpCiAJCWlvcmVtYXAoTE9PTkdTT05fQUREUldJTkNGR19CQVNFLCBMT09OR1NPTl9BRERSV0lOQ0ZHX1NJWkUpOwpAQCAtMjgsMTAgKzI1LDE2IEBACiAKIAlwcm9tX2luaXRfY21kbGluZSgpOwogCXByb21faW5pdF9lbnYoKTsKKworCS8qIGluaXQgYmFzZSBhZGRyZXNzIG9mIGlvIHNwYWNlICovCisJc2V0X2lvX3BvcnRfYmFzZSgodW5zaWduZWQgbG9uZykKKwkJaW9yZW1hcChMT09OR1NPTl9QQ0lJT19CQVNFLCBMT09OR1NPTl9QQ0lJT19TSVpFKSk7CisKIAlwcm9tX2luaXRfbWVtb3J5KCk7CiAKIAkvKmluaXQgdGhlIHVhcnQgYmFzZSBhZGRyZXNzICovCiAJcHJvbV9pbml0X3VhcnRfYmFzZSgpOworCXJlZ2lzdGVyX3NtcF9vcHMoJmxvb25nc29uM19zbXBfb3BzKTsKIH0KIAogdm9pZCBfX2luaXQgcHJvbV9mcmVlX3Byb21fbWVtb3J5KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21hY2h0eXBlLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21hY2h0eXBlLmMKaW5kZXggNGJlY2Q0Zi4uMWE0Nzk3OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tYWNodHlwZS5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWFjaHR5cGUuYwpAQCAtMjcsNiArMjcsMTAgQEAKIAlbTUFDSF9ERVhYT05fR0RJVU0yRjEwXQkJImRleHhvbi1nZGl1bS0yZiIsCiAJW01BQ0hfTEVNT1RFX05BU10JCSJsZW1vdGUtbmFzLTJmIiwKIAlbTUFDSF9MRU1PVEVfTEwyRl0JCSJsZW1vdGUtbHlubG9vbmctMmYiLAorCVtNQUNIX0xFTU9URV9BMTAwNF0JCSJsZW1vdGUtM2Etbm90ZWJvb2stYTEwMDQiLAorCVtNQUNIX0xFTU9URV9BMTEwMV0JCSJsZW1vdGUtM2EtaXR4LWExMTAxIiwKKwlbTUFDSF9MRU1PVEVfQTEyMDFdCQkibGVtb3RlLTJncS1ub3RlYm9vay1hMTIwMSIsCisJW01BQ0hfTEVNT1RFX0ExMjA1XQkJImxlbW90ZS0yZ3EtYWlvLWExMjA1IiwKIAlbTUFDSF9MT09OR1NPTl9FTkRdCQlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tZW0uYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWVtLmMKaW5kZXggODYyNmE0Mi4uYjAxZDUyNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tZW0uYworKysgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21lbS5jCkBAIC0xMSw5ICsxMSwxNCBAQAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogCiAjaW5jbHVkZSA8bG9vbmdzb24uaD4KKyNpbmNsdWRlIDxib290X3BhcmFtLmg+CiAjaW5jbHVkZSA8bWVtLmg+CiAjaW5jbHVkZSA8cGNpLmg+CiAKKyNpZm5kZWYgQ09ORklHX0xFRklfRklSTVdBUkVfSU5URVJGQUNFCisKK3UzMiBtZW1zaXplLCBoaWdobWVtc2l6ZTsKKwogdm9pZCBfX2luaXQgcHJvbV9pbml0X21lbW9yeSh2b2lkKQogewogCWFkZF9tZW1vcnlfcmVnaW9uKDB4MCwgKG1lbXNpemUgPDwgMjApLCBCT09UX01FTV9SQU0pOwpAQCAtNDksNiArNTQsNDMgQEAKICNlbmRpZiAvKiAhQ09ORklHXzY0QklUICovCiB9CiAKKyNlbHNlIC8qIENPTkZJR19MRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRSAqLworCit2b2lkIF9faW5pdCBwcm9tX2luaXRfbWVtb3J5KHZvaWQpCit7CisJaW50IGk7CisJdTMyIG5vZGVfaWQ7CisJdTMyIG1lbV90eXBlOworCisJLyogcGFyc2UgbWVtb3J5IGluZm9ybWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGxvb25nc29uX21lbW1hcC0+bnJfbWFwOyBpKyspIHsKKwkJbm9kZV9pZCA9IGxvb25nc29uX21lbW1hcC0+bWFwW2ldLm5vZGVfaWQ7CisJCW1lbV90eXBlID0gbG9vbmdzb25fbWVtbWFwLT5tYXBbaV0ubWVtX3R5cGU7CisKKwkJaWYgKG5vZGVfaWQgPT0gMCkgeworCQkJc3dpdGNoIChtZW1fdHlwZSkgeworCQkJY2FzZSBTWVNURU1fUkFNX0xPVzoKKwkJCQlhZGRfbWVtb3J5X3JlZ2lvbihsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fc3RhcnQsCisJCQkJCSh1NjQpbG9vbmdzb25fbWVtbWFwLT5tYXBbaV0ubWVtX3NpemUgPDwgMjAsCisJCQkJCUJPT1RfTUVNX1JBTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNZU1RFTV9SQU1fSElHSDoKKwkJCQlhZGRfbWVtb3J5X3JlZ2lvbihsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fc3RhcnQsCisJCQkJCSh1NjQpbG9vbmdzb25fbWVtbWFwLT5tYXBbaV0ubWVtX3NpemUgPDwgMjAsCisJCQkJCUJPT1RfTUVNX1JBTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1FTV9SRVNFUlZFRDoKKwkJCQlhZGRfbWVtb3J5X3JlZ2lvbihsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fc3RhcnQsCisJCQkJCSh1NjQpbG9vbmdzb25fbWVtbWFwLT5tYXBbaV0ubWVtX3NpemUgPDwgMjAsCisJCQkJCUJPT1RfTUVNX1JFU0VSVkVEKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19MRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRSAqLworCiAvKiBvdmVycmlkZSBvZiBhcmNoL21pcHMvbW0vY2FjaGUuYzogX191bmNhY2hlZF9hY2Nlc3MgKi8KIGludCBfX3VuY2FjaGVkX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wY2kuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcGNpLmMKaW5kZXggZmE3Nzg0NC4uMDAzYWI0ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wY2kuYworKysgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BjaS5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxwY2kuaD4KICNpbmNsdWRlIDxsb29uZ3Nvbi5oPgorI2luY2x1ZGUgPGJvb3RfcGFyYW0uaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsb29uZ3Nvbl9wY2lfbWVtX3Jlc291cmNlID0gewogCS5uYW1lCT0gInBjaSBtZW1vcnkgc3BhY2UiLApAQCAtODIsNyArODMsMTAgQEAKIAlzZXR1cF9wY2ltYXAoKTsKIAogCWxvb25nc29uX3BjaV9jb250cm9sbGVyLmlvX21hcF9iYXNlID0gbWlwc19pb19wb3J0X2Jhc2U7Ci0KKyNpZmRlZiBDT05GSUdfTEVGSV9GSVJNV0FSRV9JTlRFUkZBQ0UKKwlsb29uZ3Nvbl9wY2lfbWVtX3Jlc291cmNlLnN0YXJ0ID0gbG9vbmdzb25fc3lzY29uZi5wY2lfbWVtX3N0YXJ0X2FkZHI7CisJbG9vbmdzb25fcGNpX21lbV9yZXNvdXJjZS5lbmQgPSBsb29uZ3Nvbl9zeXNjb25mLnBjaV9tZW1fZW5kX2FkZHI7CisjZW5kaWYKIAlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmbG9vbmdzb25fcGNpX2NvbnRyb2xsZXIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3Jlc2V0LmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3Jlc2V0LmMKaW5kZXggNjViZmJiNS4uYTYwNzE1ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcmVzZXQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KIAogI2luY2x1ZGUgPGxvb25nc29uLmg+CisjaW5jbHVkZSA8Ym9vdF9wYXJhbS5oPgogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9vbmdzb25fcmVib290KHZvaWQpCiB7CkBAIC0zNywxNyArMzgsMzcgQEAKIAogc3RhdGljIHZvaWQgbG9vbmdzb25fcmVzdGFydChjaGFyICpjb21tYW5kKQogeworI2lmbmRlZiBDT05GSUdfTEVGSV9GSVJNV0FSRV9JTlRFUkZBQ0UKIAkvKiBkbyBwcmVwYXJhdGlvbiBmb3IgcmVib290ICovCiAJbWFjaF9wcmVwYXJlX3JlYm9vdCgpOwogCiAJLyogcmVib290IHZpYSBqdW1waW5nIHRvIGJvb3QgYmFzZSBhZGRyZXNzICovCiAJbG9vbmdzb25fcmVib290KCk7CisjZWxzZQorCXZvaWQgKCpmd19yZXN0YXJ0KSh2b2lkKSA9ICh2b2lkICopbG9vbmdzb25fc3lzY29uZi5yZXN0YXJ0X2FkZHI7CisKKwlmd19yZXN0YXJ0KCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGNwdV93YWl0KQorCQkJY3B1X3dhaXQoKTsKKwl9CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgbG9vbmdzb25fcG93ZXJvZmYodm9pZCkKIHsKKyNpZm5kZWYgQ09ORklHX0xFRklfRklSTVdBUkVfSU5URVJGQUNFCiAJbWFjaF9wcmVwYXJlX3NodXRkb3duKCk7CiAJdW5yZWFjaGFibGUoKTsKKyNlbHNlCisJdm9pZCAoKmZ3X3Bvd2Vyb2ZmKSh2b2lkKSA9ICh2b2lkICopbG9vbmdzb25fc3lzY29uZi5wb3dlcm9mZl9hZGRyOworCisJZndfcG93ZXJvZmYoKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoY3B1X3dhaXQpCisJCQljcHVfd2FpdCgpOworCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBsb29uZ3Nvbl9oYWx0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3NlcmlhbC5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9zZXJpYWwuYwppbmRleCA1ZjJiNzhhLi5iZDJiNzA5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3NlcmlhbC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vc2VyaWFsLmMKQEAgLTE5LDE5ICsxOSwxOSBAQAogI2luY2x1ZGUgPGxvb25nc29uLmg+CiAjaW5jbHVkZSA8bWFjaGluZS5oPgogCi0jZGVmaW5lIFBPUlQoaW50KQkJCVwKKyNkZWZpbmUgUE9SVChpbnQsIGNsaykJCQlcCiB7CQkJCQkJCQlcCiAJLmlycQkJPSBpbnQsCQkJCQlcCi0JLnVhcnRjbGsJPSAxODQzMjAwLAkJCQlcCisJLnVhcnRjbGsJPSBjbGssCQkJCQlcCiAJLmlvdHlwZQkJPSBVUElPX1BPUlQsCQkJCVwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAlcCiAJLnJlZ3NoaWZ0CT0gMCwJCQkJCVwKIH0KIAotI2RlZmluZSBQT1JUX00oaW50KQkJCQlcCisjZGVmaW5lIFBPUlRfTShpbnQsIGNsaykJCQkJXAogewkJCQkJCQkJXAogCS5pcnEJCT0gTUlQU19DUFVfSVJRX0JBU0UgKyAoaW50KSwJCVwKLQkudWFydGNsawk9IDM2ODY0MDAsCQkJCVwKKwkudWFydGNsawk9IGNsaywJCQkJCVwKIAkuaW90eXBlCQk9IFVQSU9fTUVNLAkJCQlcCiAJLm1lbWJhc2UJPSAodm9pZCBfX2lvbWVtICopTlVMTCwJCQlcCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwJXApAQCAtNDAsMTMgKzQwLDE3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdWFydDgyNTBfZGF0YVtdWzJdID0gewogCVtNQUNIX0xPT05HU09OX1VOS05PV05dCQl7fSwKLQlbTUFDSF9MRU1PVEVfRkwyRV0JCXtQT1JUKDQpLCB7fSB9LAotCVtNQUNIX0xFTU9URV9GTDJGXQkJe1BPUlQoMyksIHt9IH0sCi0JW01BQ0hfTEVNT1RFX01MMkY3XQkJe1BPUlRfTSgzKSwge30gfSwKLQlbTUFDSF9MRU1PVEVfWUwyRjg5XQkJe1BPUlRfTSgzKSwge30gfSwKLQlbTUFDSF9ERVhYT05fR0RJVU0yRjEwXQkJe1BPUlRfTSgzKSwge30gfSwKLQlbTUFDSF9MRU1PVEVfTkFTXQkJe1BPUlRfTSgzKSwge30gfSwKLQlbTUFDSF9MRU1PVEVfTEwyRl0JCXtQT1JUKDMpLCB7fSB9LAorCVtNQUNIX0xFTU9URV9GTDJFXSAgICAgICAgICAgICAge1BPUlQoNCwgMTg0MzIwMCksIHt9IH0sCisJW01BQ0hfTEVNT1RFX0ZMMkZdICAgICAgICAgICAgICB7UE9SVCgzLCAxODQzMjAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfTUwyRjddICAgICAgICAgICAgIHtQT1JUX00oMywgMzY4NjQwMCksIHt9IH0sCisJW01BQ0hfTEVNT1RFX1lMMkY4OV0gICAgICAgICAgICB7UE9SVF9NKDMsIDM2ODY0MDApLCB7fSB9LAorCVtNQUNIX0RFWFhPTl9HRElVTTJGMTBdICAgICAgICAge1BPUlRfTSgzLCAzNjg2NDAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfTkFTXSAgICAgICAgICAgICAgIHtQT1JUX00oMywgMzY4NjQwMCksIHt9IH0sCisJW01BQ0hfTEVNT1RFX0xMMkZdICAgICAgICAgICAgICB7UE9SVCgzLCAxODQzMjAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfQTEwMDRdICAgICAgICAgICAgIHtQT1JUX00oMiwgMzMxNzc2MDApLCB7fSB9LAorCVtNQUNIX0xFTU9URV9BMTEwMV0gICAgICAgICAgICAge1BPUlRfTSgyLCAyNTAwMDAwMCksIHt9IH0sCisJW01BQ0hfTEVNT1RFX0ExMjAxXSAgICAgICAgICAgICB7UE9SVF9NKDIsIDI1MDAwMDAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfQTEyMDVdICAgICAgICAgICAgIHtQT1JUX00oMiwgMjUwMDAwMDApLCB7fSB9LAogCVtNQUNIX0xPT05HU09OX0VORF0JCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9zZXR1cC5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9zZXR1cC5jCmluZGV4IDgyMjNmOGEuLmJiNGFjOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vc2V0dXAuYworKysgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3NldHVwLmMKQEAgLTE4LDkgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgogI2VuZGlmCiAKLXZvaWQgKCpfX3diZmx1c2gpKHZvaWQpOwotRVhQT1JUX1NZTUJPTChfX3diZmx1c2gpOwotCiBzdGF0aWMgdm9pZCB3YmZsdXNoX2xvb25nc29uKHZvaWQpCiB7CiAJYXNtKCIuc2V0XHRwdXNoXG5cdCIKQEAgLTMyLDEwICsyOSwxMSBAQAogCSAgICAiLnNldCBtaXBzMFxuXHQiKTsKIH0KIAordm9pZCAoKl9fd2JmbHVzaCkodm9pZCkgPSB3YmZsdXNoX2xvb25nc29uOworRVhQT1JUX1NZTUJPTChfX3diZmx1c2gpOworCiB2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQogewotCV9fd2JmbHVzaCA9IHdiZmx1c2hfbG9vbmdzb247Ci0KICNpZmRlZiBDT05GSUdfVlQKICNpZiBkZWZpbmVkKENPTkZJR19WR0FfQ09OU09MRSkKIAljb25zd2l0Y2hwID0gJnZnYV9jb247CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3VhcnRfYmFzZS5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi91YXJ0X2Jhc2UuYwppbmRleCBlMTkyYWQwLi4xZTFlZWVhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3VhcnRfYmFzZS5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vdWFydF9iYXNlLmMKQEAgLTM1LDkgKzM1LDE2IEBACiAJY2FzZSBNQUNIX0RFWFhPTl9HRElVTTJGMTA6CiAJY2FzZSBNQUNIX0xFTU9URV9OQVM6CiAJZGVmYXVsdDoKLQkJLyogVGhlIENQVSBwcm92aWRlZCBzZXJpYWwgcG9ydCAqLworCQkvKiBUaGUgQ1BVIHByb3ZpZGVkIHNlcmlhbCBwb3J0IChMUEMpICovCiAJCWxvb25nc29uX3VhcnRfYmFzZSA9IExPT05HU09OX0xJTzFfQkFTRSArIDB4M2Y4OwogCQlicmVhazsKKwljYXNlIE1BQ0hfTEVNT1RFX0ExMDA0OgorCWNhc2UgTUFDSF9MRU1PVEVfQTExMDE6CisJY2FzZSBNQUNIX0xFTU9URV9BMTIwMToKKwljYXNlIE1BQ0hfTEVNT1RFX0ExMjA1OgorCQkvKiBUaGUgQ1BVIHByb3ZpZGVkIHNlcmlhbCBwb3J0IChDUFUpICovCisJCWxvb25nc29uX3VhcnRfYmFzZSA9IExPT05HU09OX1JFR19CQVNFICsgMHgxZTA7CisJCWJyZWFrOwogCX0KIAogCV9sb29uZ3Nvbl91YXJ0X2Jhc2UgPQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvTWFrZWZpbGUgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDE1MmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciBMb29uZ3Nvbi0zIGZhbWlseSBtYWNoaW5lcworIworb2JqLXkJCQkrPSBpcnEubworCitvYmotJChDT05GSUdfU01QKQkrPSBzbXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvaXJxLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQwODI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvaXJxLmMKQEAgLTAsMCArMSwxMjYgQEAKKyNpbmNsdWRlIDxsb29uZ3Nvbi5oPgorI2luY2x1ZGUgPGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2lycV9jcHUuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKwordW5zaWduZWQgaW50IGh0X2lycVtdID0gezEsIDMsIDQsIDUsIDYsIDcsIDgsIDEyLCAxNCwgMTV9OworCitzdGF0aWMgdm9pZCBodF9pcnFkaXNwYXRjaCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBpcnE7CisKKwlpcnEgPSBMT09OR1NPTl9IVDFfSU5UX1ZFQ1RPUigwKTsKKwlMT09OR1NPTl9IVDFfSU5UX1ZFQ1RPUigwKSA9IGlycTsgLyogQWNrbm93bGVkZ2UgdGhlIElSUXMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh0X2lycSk7IGkrKykgeworCQlpZiAoaXJxICYgKDB4MSA8PCBodF9pcnFbaV0pKQorCQkJZG9fSVJRKGh0X2lycVtpXSk7CisJfQorfQorCit2b2lkIG1hY2hfaXJxX2Rpc3BhdGNoKHVuc2lnbmVkIGludCBwZW5kaW5nKQoreworCWlmIChwZW5kaW5nICYgQ0FVU0VGX0lQNykKKwkJZG9fSVJRKExPT05HU09OX1RJTUVSX0lSUSk7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKQorCWVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVA2KQorCQlsb29uZ3NvbjNfaXBpX2ludGVycnVwdChOVUxMKTsKKyNlbmRpZgorCWVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVAzKQorCQlodF9pcnFkaXNwYXRjaCgpOworCWVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVAyKQorCQlkb19JUlEoTE9PTkdTT05fVUFSVF9JUlEpOworCWVsc2UgeworCQlwcl9lcnIoIiVzIDogc3B1cmlvdXMgaW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7CisJCXNwdXJpb3VzX2ludGVycnVwdCgpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2FzY2FkZV9pcnFhY3Rpb24gPSB7CisJLmhhbmRsZXIgPSBub19hY3Rpb24sCisJLm5hbWUgPSAiY2FzY2FkZSIsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFza19sb29uZ3Nvbl9pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCWNsZWFyX2MwX3N0YXR1cygweDEwMCA8PCAoZC0+aXJxIC0gTUlQU19DUFVfSVJRX0JBU0UpKTsKKwlpcnFfZGlzYWJsZV9oYXphcmQoKTsKKworCS8qIFdvcmthcm91bmQ6IFVBUlQgSVJRIG1heSBkZWxpdmVyIHRvIGFueSBjb3JlICovCisJaWYgKGQtPmlycSA9PSBMT09OR1NPTl9VQVJUX0lSUSkgeworCQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJCUxPT05HU09OX0lOVF9ST1VURVJfSU5URU5DTFIgPSAxIDw8IDEwOworCQlMT09OR1NPTl9JTlRfUk9VVEVSX0xQQyA9IDB4MTAgKyAoMTw8Y3B1KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hc2tfbG9vbmdzb25faXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwkvKiBXb3JrYXJvdW5kOiBVQVJUIElSUSBtYXkgZGVsaXZlciB0byBhbnkgY29yZSAqLworCWlmIChkLT5pcnEgPT0gTE9PTkdTT05fVUFSVF9JUlEpIHsKKwkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCQlMT09OR1NPTl9JTlRfUk9VVEVSX0lOVEVOU0VUID0gMSA8PCAxMDsKKwkJTE9PTkdTT05fSU5UX1JPVVRFUl9MUEMgPSAweDEwICsgKDE8PGNwdSk7CisJfQorCisJc2V0X2MwX3N0YXR1cygweDEwMCA8PCAoZC0+aXJxIC0gTUlQU19DUFVfSVJRX0JBU0UpKTsKKwlpcnFfZW5hYmxlX2hhemFyZCgpOworfQorCisgLyogRm9yIE1JUFMgSVJRcyB3aGljaCBzaGFyZWQgYnkgYWxsIGNvcmVzICovCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGxvb25nc29uX2lycV9jaGlwID0geworCS5uYW1lCQk9ICJMb29uZ3NvbiIsCisJLmlycV9hY2sJPSBtYXNrX2xvb25nc29uX2lycSwKKwkuaXJxX21hc2sJPSBtYXNrX2xvb25nc29uX2lycSwKKwkuaXJxX21hc2tfYWNrCT0gbWFza19sb29uZ3Nvbl9pcnEsCisJLmlycV91bm1hc2sJPSB1bm1hc2tfbG9vbmdzb25faXJxLAorCS5pcnFfZW9pCT0gdW5tYXNrX2xvb25nc29uX2lycSwKK307CisKK3ZvaWQgaXJxX3JvdXRlcl9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiByb3V0ZSBMUEMgaW50IHRvIGNwdSBjb3JlMCBpbnQgMCAqLworCUxPT05HU09OX0lOVF9ST1VURVJfTFBDID0gTE9PTkdTT05fSU5UX0NPUkUwX0lOVDA7CisJLyogcm91dGUgSFQxIGludDAgfiBpbnQ3IHRvIGNwdSBjb3JlMCBJTlQxKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlMT09OR1NPTl9JTlRfUk9VVEVSX0hUMShpKSA9IExPT05HU09OX0lOVF9DT1JFMF9JTlQxOworCS8qIGVuYWJsZSBIVDEgaW50ZXJydXB0ICovCisJTE9PTkdTT05fSFQxX0lOVE5fRU4oMCkgPSAweGZmZmZmZmZmOworCS8qIGVuYWJsZSByb3V0ZXIgaW50ZXJydXB0IGludGVuc2V0ICovCisJTE9PTkdTT05fSU5UX1JPVVRFUl9JTlRFTlNFVCA9CisJCUxPT05HU09OX0lOVF9ST1VURVJfSU5URU4gfCAoMHhmZmZmIDw8IDE2KSB8IDB4MSA8PCAxMDsKK30KKwordm9pZCBfX2luaXQgbWFjaF9pbml0X2lycSh2b2lkKQoreworCWNsZWFyX2MwX3N0YXR1cyhTVDBfSU0gfCBTVDBfQkVWKTsKKworCWlycV9yb3V0ZXJfaW5pdCgpOworCW1pcHNfY3B1X2lycV9pbml0KCk7CisJaW5pdF9pODI1OV9pcnFzKCk7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKExPT05HU09OX1VBUlRfSVJRLAorCQkJJmxvb25nc29uX2lycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCS8qIHNldHVwIEhUMSBpcnEgKi8KKwlzZXR1cF9pcnEoTE9PTkdTT05fSFQxX0lSUSwgJmNhc2NhZGVfaXJxYWN0aW9uKTsKKworCXNldF9jMF9zdGF0dXMoU1RBVFVTRl9JUDIgfCBTVEFUVVNGX0lQNik7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwordm9pZCBmaXh1cF9pcnFzKHZvaWQpCit7CisJaXJxX2NwdV9vZmZsaW5lKCk7CisJY2xlYXJfYzBfc3RhdHVzKFNUMF9JTSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvc21wLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY1ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvc21wLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIsIExlbW90ZSwgSW5jLgorICogQXV0aG9yOiBDaGVuIEh1YWNhaSwgY2hlbmhjQGxlbW90ZS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsb29uZ3Nvbi5oPgorCisjaW5jbHVkZSAic21wLmgiCisKK0RFRklORV9QRVJfQ1BVKGludCwgY3B1X3N0YXRlKTsKK0RFRklORV9QRVJfQ1BVKHVpbnQzMl90LCBjb3JlMF9jMGNvdW50KTsKKworLyogcmVhZCBhIDMyYml0IHZhbHVlIGZyb20gaXBpIHJlZ2lzdGVyICovCisjZGVmaW5lIGxvb25nc29uM19pcGlfcmVhZDMyKGFkZHIpIHJlYWRsKGFkZHIpCisvKiByZWFkIGEgNjRiaXQgdmFsdWUgZnJvbSBpcGkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgbG9vbmdzb24zX2lwaV9yZWFkNjQoYWRkcikgcmVhZHEoYWRkcikKKy8qIHdyaXRlIGEgMzJiaXQgdmFsdWUgdG8gaXBpIHJlZ2lzdGVyICovCisjZGVmaW5lIGxvb25nc29uM19pcGlfd3JpdGUzMihhY3Rpb24sIGFkZHIpCVwKKwlkbyB7CQkJCQlcCisJCXdyaXRlbChhY3Rpb24sIGFkZHIpOwkJXAorCQlfX3diZmx1c2goKTsJCQlcCisJfSB3aGlsZSAoMCkKKy8qIHdyaXRlIGEgNjRiaXQgdmFsdWUgdG8gaXBpIHJlZ2lzdGVyICovCisjZGVmaW5lIGxvb25nc29uM19pcGlfd3JpdGU2NChhY3Rpb24sIGFkZHIpCVwKKwlkbyB7CQkJCQlcCisJCXdyaXRlcShhY3Rpb24sIGFkZHIpOwkJXAorCQlfX3diZmx1c2goKTsJCQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgKmlwaV9zZXQwX3JlZ3NbXSA9IHsKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTRVQwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTRVQwKSwKK307CisKK3N0YXRpYyB2b2lkICppcGlfY2xlYXIwX3JlZ3NbXSA9IHsKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBDTEVBUjApLAorfTsKKworc3RhdGljIHZvaWQgKmlwaV9zdGF0dXMwX3JlZ3NbXSA9IHsKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBTVEFUVVMwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBTVEFUVVMwKSwKK307CisKK3N0YXRpYyB2b2lkICppcGlfZW4wX3JlZ3NbXSA9IHsKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBFTjApLAorfTsKKworc3RhdGljIHZvaWQgKmlwaV9tYWlsYm94X2J1ZltdID0geworCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIEJVRiksCit9OworCisvKgorICogU2ltcGxlIGVub3VnaCwganVzdCBwb2tlIHRoZSBhcHByb3ByaWF0ZSBpcGkgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgbG9vbmdzb24zX3NlbmRfaXBpX3NpbmdsZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKQoreworCWxvb25nc29uM19pcGlfd3JpdGUzMigodTMyKWFjdGlvbiwgaXBpX3NldDBfcmVnc1tjcHVdKTsKK30KKworc3RhdGljIHZvaWQKK2xvb25nc29uM19zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yX2VhY2hfY3B1KGksIG1hc2spCisJCWxvb25nc29uM19pcGlfd3JpdGUzMigodTMyKWFjdGlvbiwgaXBpX3NldDBfcmVnc1tpXSk7Cit9CisKK3ZvaWQgbG9vbmdzb24zX2lwaV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGksIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBpbnQgYWN0aW9uLCBjMGNvdW50OworCisJLyogTG9hZCB0aGUgaXBpIHJlZ2lzdGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSdyZSBzdXBwb3NlZCB0byBkbyAqLworCWFjdGlvbiA9IGxvb25nc29uM19pcGlfcmVhZDMyKGlwaV9zdGF0dXMwX3JlZ3NbY3B1XSk7CisKKwkvKiBDbGVhciB0aGUgaXBpIHJlZ2lzdGVyIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlsb29uZ3NvbjNfaXBpX3dyaXRlMzIoKHUzMilhY3Rpb24sIGlwaV9jbGVhcjBfcmVnc1tjcHVdKTsKKworCWlmIChhY3Rpb24gJiBTTVBfUkVTQ0hFRFVMRV9ZT1VSU0VMRikKKwkJc2NoZWR1bGVyX2lwaSgpOworCisJaWYgKGFjdGlvbiAmIFNNUF9DQUxMX0ZVTkNUSU9OKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQoKTsKKworCWlmIChhY3Rpb24gJiBTTVBfQVNLX0MwQ09VTlQpIHsKKwkJQlVHX09OKGNwdSAhPSAwKTsKKwkJYzBjb3VudCA9IHJlYWRfYzBfY291bnQoKTsKKwkJZm9yIChpID0gMTsgaSA8IGxvb25nc29uX3N5c2NvbmYubnJfY3B1czsgaSsrKQorCQkJcGVyX2NwdShjb3JlMF9jMGNvdW50LCBpKSA9IGMwY291bnQ7CisJfQorfQorCisjZGVmaW5lIE1BWF9MT09QUyAxMTExCisvKgorICogU01QIGluaXQgYW5kIGZpbmlzaCBvbiBzZWNvbmRhcnkgQ1BVcworICovCitzdGF0aWMgdm9pZCBsb29uZ3NvbjNfaW5pdF9zZWNvbmRhcnkodm9pZCkKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCBpbml0Y291bnQ7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBpbnQgaW1hc2sgPSBTVEFUVVNGX0lQNyB8IFNUQVRVU0ZfSVA2IHwKKwkJCSAgICAgU1RBVFVTRl9JUDMgfCBTVEFUVVNGX0lQMjsKKworCS8qIFNldCBpbnRlcnJ1cHQgbWFzaywgYnV0IGRvbid0IGVuYWJsZSAqLworCWNoYW5nZV9jMF9zdGF0dXMoU1QwX0lNLCBpbWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vbmdzb25fc3lzY29uZi5ucl9jcHVzOyBpKyspCisJCWxvb25nc29uM19pcGlfd3JpdGUzMigweGZmZmZmZmZmLCBpcGlfZW4wX3JlZ3NbaV0pOworCisJcGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPSBDUFVfT05MSU5FOworCisJaSA9IDA7CisJX19nZXRfY3B1X3Zhcihjb3JlMF9jMGNvdW50KSA9IDA7CisJbG9vbmdzb24zX3NlbmRfaXBpX3NpbmdsZSgwLCBTTVBfQVNLX0MwQ09VTlQpOworCXdoaWxlICghX19nZXRfY3B1X3Zhcihjb3JlMF9jMGNvdW50KSkgeworCQlpKys7CisJCWNwdV9yZWxheCgpOworCX0KKworCWlmIChpID4gTUFYX0xPT1BTKQorCQlpID0gTUFYX0xPT1BTOworCWluaXRjb3VudCA9IF9fZ2V0X2NwdV92YXIoY29yZTBfYzBjb3VudCkgKyBpOworCXdyaXRlX2MwX2NvdW50KGluaXRjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvb25nc29uM19zbXBfZmluaXNoKHZvaWQpCit7CisJd3JpdGVfYzBfY29tcGFyZShyZWFkX2MwX2NvdW50KCkgKyBtaXBzX2hwdF9mcmVxdWVuY3kvSFopOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlsb29uZ3NvbjNfaXBpX3dyaXRlNjQoMCwKKwkJCSh2b2lkICopKGlwaV9tYWlsYm94X2J1ZltzbXBfcHJvY2Vzc29yX2lkKCldKzB4MCkpOworCXByX2luZm8oIkNQVSMlZCBmaW5pc2hlZCwgQ1AwX1NUPSV4XG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWFkX2MwX3N0YXR1cygpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxvb25nc29uM19zbXBfc2V0dXAodm9pZCkKK3sKKwlpbnQgaSwgbnVtOworCisJaW5pdF9jcHVfcG9zc2libGUoY3B1X25vbmVfbWFzayk7CisJc2V0X2NwdV9wb3NzaWJsZSgwLCB0cnVlKTsKKworCV9fY3B1X251bWJlcl9tYXBbMF0gPSAwOworCV9fY3B1X2xvZ2ljYWxfbWFwWzBdID0gMDsKKworCS8qIEZvciB1bmlmaWVkIGtlcm5lbCwgTlJfQ1BVUyBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSwKKwkgKiBsb29uZ3Nvbl9zeXNjb25mLm5yX2NwdXMgaXMgdGhlIHJlYWxseSBwcmVzZW50IHZhbHVlICovCisJZm9yIChpID0gMSwgbnVtID0gMDsgaSA8IGxvb25nc29uX3N5c2NvbmYubnJfY3B1czsgaSsrKSB7CisJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7CisJCV9fY3B1X251bWJlcl9tYXBbaV0gPSArK251bTsKKwkJX19jcHVfbG9naWNhbF9tYXBbbnVtXSA9IGk7CisJfQorCXByX2luZm8oIkRldGVjdGVkICVpIGF2YWlsYWJsZSBzZWNvbmRhcnkgQ1BVKHMpXG4iLCBudW0pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbG9vbmdzb24zX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJaW5pdF9jcHVfcHJlc2VudChjcHVfcG9zc2libGVfbWFzayk7CisJcGVyX2NwdShjcHVfc3RhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBDUFVfT05MSU5FOworfQorCisvKgorICogU2V0dXAgdGhlIFBDLCBTUCwgYW5kIEdQIG9mIGEgc2Vjb25kYXJ5IHByb2Nlc3NvciBhbmQgc3RhcnQgaXQgcnVuaW5nIQorICovCitzdGF0aWMgdm9pZCBsb29uZ3NvbjNfYm9vdF9zZWNvbmRhcnkoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRhcmdzWzRdOworCisJcHJfaW5mbygiQm9vdGluZyBDUFUjJWQuLi5cbiIsIGNwdSk7CisKKwkvKiBzdGFydGFyZ3NbXSBhcmUgaW5pdGlhbCBQQywgU1AgYW5kIEdQIGZvciBzZWNvbmRhcnkgQ1BVICovCisJc3RhcnRhcmdzWzBdID0gKHVuc2lnbmVkIGxvbmcpJnNtcF9ib290c3RyYXA7CisJc3RhcnRhcmdzWzFdID0gKHVuc2lnbmVkIGxvbmcpX19LU1RLX1RPUyhpZGxlKTsKKwlzdGFydGFyZ3NbMl0gPSAodW5zaWduZWQgbG9uZyl0YXNrX3RocmVhZF9pbmZvKGlkbGUpOworCXN0YXJ0YXJnc1szXSA9IDA7CisKKwlwcl9kZWJ1ZygiQ1BVIyVkLCBmdW5jX3BjPSVseCwgc3A9JWx4LCBncD0lbHhcbiIsCisJCQljcHUsIHN0YXJ0YXJnc1swXSwgc3RhcnRhcmdzWzFdLCBzdGFydGFyZ3NbMl0pOworCisJbG9vbmdzb24zX2lwaV93cml0ZTY0KHN0YXJ0YXJnc1szXSwgKHZvaWQgKikoaXBpX21haWxib3hfYnVmW2NwdV0rMHgxOCkpOworCWxvb25nc29uM19pcGlfd3JpdGU2NChzdGFydGFyZ3NbMl0sICh2b2lkICopKGlwaV9tYWlsYm94X2J1ZltjcHVdKzB4MTApKTsKKwlsb29uZ3NvbjNfaXBpX3dyaXRlNjQoc3RhcnRhcmdzWzFdLCAodm9pZCAqKShpcGlfbWFpbGJveF9idWZbY3B1XSsweDgpKTsKKwlsb29uZ3NvbjNfaXBpX3dyaXRlNjQoc3RhcnRhcmdzWzBdLCAodm9pZCAqKShpcGlfbWFpbGJveF9idWZbY3B1XSsweDApKTsKK30KKworLyoKKyAqIEZpbmFsIGNsZWFudXAgYWZ0ZXIgYWxsIHNlY29uZGFyaWVzIGJvb3RlZAorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbG9vbmdzb24zX2NwdXNfZG9uZSh2b2lkKQoreworfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisKK3N0YXRpYyBpbnQgbG9vbmdzb24zX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKGNwdSA9PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJc2V0X2NwdV9vbmxpbmUoY3B1LCBmYWxzZSk7CisJY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxpbl9tYXApOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlmaXh1cF9pcnFzKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWZsdXNoX2NhY2hlX2FsbCgpOworCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGxvb25nc29uM19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJd2hpbGUgKHBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpICE9IENQVV9ERUFEKQorCQljcHVfcmVsYXgoKTsKKworCW1iKCk7Cit9CisKKy8qIFRvIHNodXRkb3duIGEgY29yZSBpbiBMb29uZ3NvbiAzLCB0aGUgdGFyZ2V0IGNvcmUgc2hvdWxkIGdvIHRvIENLU0VHMSBhbmQKKyAqIGZsdXNoIGFsbCBMMSBlbnRyaWVzIGF0IGZpcnN0LiBUaGVuLCBhbm90aGVyIGNvcmUgKHVzdWFsbHkgQ29yZSAwKSBjYW4KKyAqIHNhZmVseSBkaXNhYmxlIHRoZSBjbG9jayBvZiB0aGUgdGFyZ2V0IGNvcmUuIGxvb25nc29uM19wbGF5X2RlYWQoKSBpcworICogY2FsbGVkIHZpYSBDS1NFRzEgKHVuY2FjaGVkIGFuZCB1bm1tYXBlZCkgKi8KK3N0YXRpYyB2b2lkIGxvb25nc29uM19wbGF5X2RlYWQoaW50ICpzdGF0ZV9hZGRyKQoreworCXJlZ2lzdGVyIGludCB2YWw7CisJcmVnaXN0ZXIgbG9uZyBjcHVpZCwgY29yZSwgbm9kZSwgY291bnQ7CisJcmVnaXN0ZXIgdm9pZCAqYWRkciwgKmJhc2UsICppbml0ZnVuYzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiICAgLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICBcbiIKKwkJIiAgIGxpICVbYWRkcl0sIDB4ODAwMDAwMDAgICAgICAgIFxuIiAvKiBLU0VHMCAqLworCQkiMTogY2FjaGUgMCwgMCglW2FkZHJdKSAgICAgICAgICAgXG4iIC8qIGZsdXNoIEwxIElDYWNoZSAqLworCQkiICAgY2FjaGUgMCwgMSglW2FkZHJdKSAgICAgICAgICAgXG4iCisJCSIgICBjYWNoZSAwLCAyKCVbYWRkcl0pICAgICAgICAgICBcbiIKKwkJIiAgIGNhY2hlIDAsIDMoJVthZGRyXSkgICAgICAgICAgIFxuIgorCQkiICAgY2FjaGUgMSwgMCglW2FkZHJdKSAgICAgICAgICAgXG4iIC8qIGZsdXNoIEwxIERDYWNoZSAqLworCQkiICAgY2FjaGUgMSwgMSglW2FkZHJdKSAgICAgICAgICAgXG4iCisJCSIgICBjYWNoZSAxLCAyKCVbYWRkcl0pICAgICAgICAgICBcbiIKKwkJIiAgIGNhY2hlIDEsIDMoJVthZGRyXSkgICAgICAgICAgIFxuIgorCQkiICAgYWRkaXUgJVtzZXRzXSwgJVtzZXRzXSwgLTEgICAgXG4iCisJCSIgICBibmV6ICAlW3NldHNdLCAxYiAgICAgICAgICAgICBcbiIKKwkJIiAgIGFkZGl1ICVbYWRkcl0sICVbYWRkcl0sIDB4MjAgIFxuIgorCQkiICAgbGkgICAgJVt2YWxdLCAweDcgICAgICAgICAgICAgXG4iIC8qICpzdGF0ZV9hZGRyID0gQ1BVX0RFQUQ7ICovCisJCSIgICBzdyAgICAlW3ZhbF0sICglW3N0YXRlX2FkZHJdKSBcbiIKKwkJIiAgIHN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgY2FjaGUgMjEsICglW3N0YXRlX2FkZHJdKSAgICAgXG4iIC8qIGZsdXNoIGVudHJ5IG9mICpzdGF0ZV9hZGRyICovCisJCSIgICAuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiBbYWRkcl0gIj0mciIgKGFkZHIpLCBbdmFsXSAiPSZyIiAodmFsKQorCQk6IFtzdGF0ZV9hZGRyXSAiciIgKHN0YXRlX2FkZHIpLAorCQkgIFtzZXRzXSAiciIgKGNwdV9kYXRhW3NtcF9wcm9jZXNzb3JfaWQoKV0uZGNhY2hlLnNldHMpKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiICAgLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgLnNldCBtaXBzNjQgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgbWZjMCAgJVtjcHVpZF0sICQxNSwgMSAgICAgICAgICAgIFxuIgorCQkiICAgYW5kaSAgJVtjcHVpZF0sIDB4M2ZmICAgICAgICAgICAgIFxuIgorCQkiICAgZGxpICAgJVtiYXNlXSwgMHg5MDAwMDAwMDNmZjAxMDAwIFxuIgorCQkiICAgYW5kaSAgJVtjb3JlXSwgJVtjcHVpZF0sIDB4MyAgICAgIFxuIgorCQkiICAgc2xsICAgJVtjb3JlXSwgOCAgICAgICAgICAgICAgICAgIFxuIiAvKiBnZXQgY29yZSBpZCAqLworCQkiICAgb3IgICAgJVtiYXNlXSwgJVtiYXNlXSwgJVtjb3JlXSAgIFxuIgorCQkiICAgYW5kaSAgJVtub2RlXSwgJVtjcHVpZF0sIDB4YyAgICAgIFxuIgorCQkiICAgZHNsbCAgJVtub2RlXSwgNDIgICAgICAgICAgICAgICAgIFxuIiAvKiBnZXQgbm9kZSBpZCAqLworCQkiICAgb3IgICAgJVtiYXNlXSwgJVtiYXNlXSwgJVtub2RlXSAgIFxuIgorCQkiMTogbGkgICAgJVtjb3VudF0sIDB4MTAwICAgICAgICAgICAgIFxuIiAvKiB3YWl0IGZvciBpbml0IGxvb3AgKi8KKwkJIjI6IGJuZXogICVbY291bnRdLCAyYiAgICAgICAgICAgICAgICBcbiIgLyogbGltaXQgbWFpbGJveCBhY2Nlc3MgKi8KKwkJIiAgIGFkZGl1ICVbY291bnRdLCAtMSAgICAgICAgICAgICAgICBcbiIKKwkJIiAgIGxkICAgICVbaW5pdGZ1bmNdLCAweDIwKCVbYmFzZV0pICBcbiIgLyogZ2V0IFBDIHZpYSBtYWlsYm94ICovCisJCSIgICBiZXF6ICAlW2luaXRmdW5jXSwgMWIgICAgICAgICAgICAgXG4iCisJCSIgICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICBsZCAgICAkc3AsIDB4MjgoJVtiYXNlXSkgICAgICAgICAgXG4iIC8qIGdldCBTUCB2aWEgbWFpbGJveCAqLworCQkiICAgbGQgICAgJGdwLCAweDMwKCVbYmFzZV0pICAgICAgICAgIFxuIiAvKiBnZXQgR1AgdmlhIG1haWxib3ggKi8KKwkJIiAgIGxkICAgICRhMSwgMHgzOCglW2Jhc2VdKSAgICAgICAgICBcbiIKKwkJIiAgIGpyICAgICVbaW5pdGZ1bmNdICAgICAgICAgICAgICAgICBcbiIgLyoganVtcCB0byBpbml0aWFsIFBDICovCisJCSIgICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCTogW2NvcmVdICI9JnIiIChjb3JlKSwgW25vZGVdICI9JnIiIChub2RlKSwKKwkJICBbYmFzZV0gIj0mciIgKGJhc2UpLCBbY3B1aWRdICI9JnIiIChjcHVpZCksCisJCSAgW2NvdW50XSAiPSZyIiAoY291bnQpLCBbaW5pdGZ1bmNdICI9JnIiIChpbml0ZnVuYykKKwkJOiAvKiBObyBJbnB1dCAqLworCQk6ICJhMSIpOworfQorCit2b2lkIHBsYXlfZGVhZCh2b2lkKQoreworCWludCAqc3RhdGVfYWRkcjsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXZvaWQgKCpwbGF5X2RlYWRfYXRfY2tzZWcxKShpbnQgKik7CisKKwlpZGxlX3Rhc2tfZXhpdCgpOworCXBsYXlfZGVhZF9hdF9ja3NlZzEgPQorCQkodm9pZCAqKUNLU0VHMUFERFIoKHVuc2lnbmVkIGxvbmcpbG9vbmdzb24zX3BsYXlfZGVhZCk7CisJc3RhdGVfYWRkciA9ICZwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KTsKKwltYigpOworCXBsYXlfZGVhZF9hdF9ja3NlZzEoc3RhdGVfYWRkcik7Cit9CisKKyNkZWZpbmUgQ1BVX1BPU1RfREVBRF9GUk9aRU4JKENQVV9QT1NUX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQorc3RhdGljIGludCBsb29uZ3NvbjNfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9QT1NUX0RFQUQ6CisJY2FzZSBDUFVfUE9TVF9ERUFEX0ZST1pFTjoKKwkJcHJfaW5mbygiRGlzYWJsZSBjbG9jayBmb3IgQ1BVIyVkXG4iLCBjcHUpOworCQlMT09OR1NPTl9DSElQQ0ZHMCAmPSB+KDEgPDwgKDEyICsgY3B1KSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46CisJCXByX2luZm8oIkVuYWJsZSBjbG9jayBmb3IgQ1BVIyVkXG4iLCBjcHUpOworCQlMT09OR1NPTl9DSElQQ0ZHMCB8PSAxIDw8ICgxMiArIGNwdSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbG9vbmdzb24zX25vdGlmaWVyKHZvaWQpCit7CisJaG90Y3B1X25vdGlmaWVyKGxvb25nc29uM19jcHVfY2FsbGJhY2ssIDApOworCXJldHVybiAwOworfQorZWFybHlfaW5pdGNhbGwocmVnaXN0ZXJfbG9vbmdzb24zX25vdGlmaWVyKTsKKworI2VuZGlmCisKK3N0cnVjdCBwbGF0X3NtcF9vcHMgbG9vbmdzb24zX3NtcF9vcHMgPSB7CisJLnNlbmRfaXBpX3NpbmdsZSA9IGxvb25nc29uM19zZW5kX2lwaV9zaW5nbGUsCisJLnNlbmRfaXBpX21hc2sgPSBsb29uZ3NvbjNfc2VuZF9pcGlfbWFzaywKKwkuaW5pdF9zZWNvbmRhcnkgPSBsb29uZ3NvbjNfaW5pdF9zZWNvbmRhcnksCisJLnNtcF9maW5pc2ggPSBsb29uZ3NvbjNfc21wX2ZpbmlzaCwKKwkuY3B1c19kb25lID0gbG9vbmdzb24zX2NwdXNfZG9uZSwKKwkuYm9vdF9zZWNvbmRhcnkgPSBsb29uZ3NvbjNfYm9vdF9zZWNvbmRhcnksCisJLnNtcF9zZXR1cCA9IGxvb25nc29uM19zbXBfc2V0dXAsCisJLnByZXBhcmVfY3B1cyA9IGxvb25nc29uM19wcmVwYXJlX2NwdXMsCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJLmNwdV9kaXNhYmxlID0gbG9vbmdzb24zX2NwdV9kaXNhYmxlLAorCS5jcHVfZGllID0gbG9vbmdzb24zX2NwdV9kaWUsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9zbXAuaCBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL3NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTNlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9zbXAuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9fTE9PTkdTT05fU01QX0hfCisjZGVmaW5lIF9fTE9PTkdTT05fU01QX0hfCisKKy8qIGZvciBMb29uZ3Nvbi0zQSBzbXAgc3VwcG9ydCAqLworCisvKiA0IGdyb3Vwcyhub2RlcykgaW4gbWF4aW11bSBpbiBudW1hIGNhc2UgKi8KKyNkZWZpbmUgIFNNUF9DT1JFX0dST1VQMF9CQVNFICAgIDB4OTAwMDAwMDAzZmYwMTAwMAorI2RlZmluZSAgU01QX0NPUkVfR1JPVVAxX0JBU0UgICAgMHg5MDAwMTAwMDNmZjAxMDAwCisjZGVmaW5lICBTTVBfQ09SRV9HUk9VUDJfQkFTRSAgICAweDkwMDAyMDAwM2ZmMDEwMDAKKyNkZWZpbmUgIFNNUF9DT1JFX0dST1VQM19CQVNFICAgIDB4OTAwMDMwMDAzZmYwMTAwMAorCisvKiA0IGNvcmVzIGluIGVhY2ggZ3JvdXAobm9kZSkgKi8KKyNkZWZpbmUgIFNNUF9DT1JFMF9PRkZTRVQgIDB4MDAwCisjZGVmaW5lICBTTVBfQ09SRTFfT0ZGU0VUICAweDEwMAorI2RlZmluZSAgU01QX0NPUkUyX09GRlNFVCAgMHgyMDAKKyNkZWZpbmUgIFNNUF9DT1JFM19PRkZTRVQgIDB4MzAwCisKKy8qIGlwaSByZWdpc3RlcnMgb2Zmc2V0cyAqLworI2RlZmluZSAgU1RBVFVTMCAgMHgwMAorI2RlZmluZSAgRU4wICAgICAgMHgwNAorI2RlZmluZSAgU0VUMCAgICAgMHgwOAorI2RlZmluZSAgQ0xFQVIwICAgMHgwYworI2RlZmluZSAgU1RBVFVTMSAgMHgxMAorI2RlZmluZSAgTUFTSzEgICAgMHgxNAorI2RlZmluZSAgU0VUMSAgICAgMHgxOAorI2RlZmluZSAgQ0xFQVIxICAgMHgxYworI2RlZmluZSAgQlVGICAgICAgMHgyMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYwppbmRleCA1MDY5MjViLi43YjNjOWFjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvY3AxZW11LmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2NwMWVtdS5jCkBAIC04NzYsMjAgKzg3Niw0MyBAQAogI2VuZGlmCiB9CiAKLSNkZWZpbmUgU0lGUk9NUkVHKHNpLCB4KSAoKHNpKSA9IGNvcDFfNjRiaXQoeGNwKSB8fCAhKHggJiAxKSA/IFwKLQkJCShpbnQpY3R4LT5mcHJbeF0gOiAoaW50KShjdHgtPmZwclt4ICYgfjFdID4+IDMyKSkKKyNkZWZpbmUgU0lGUk9NUkVHKHNpLCB4KSBkbyB7CQkJCQkJXAorCWlmIChjb3AxXzY0Yml0KHhjcCkpCQkJCQkJXAorCQkoc2kpID0gZ2V0X2ZwcjMyKCZjdHgtPmZwclt4XSwgMCk7CQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKHNpKSA9IGdldF9mcHIzMigmY3R4LT5mcHJbKHgpICYgfjFdLCAoeCkgJiAxKTsJCVwKK30gd2hpbGUgKDApCiAKLSNkZWZpbmUgU0lUT1JFRyhzaSwgeCkJKGN0eC0+ZnByW3ggJiB+KGNvcDFfNjRiaXQoeGNwKSA9PSAwKV0gPSBcCi0JCQljb3AxXzY0Yml0KHhjcCkgfHwgISh4ICYgMSkgPyBcCi0JCQljdHgtPmZwclt4ICYgfjFdID4+IDMyIDw8IDMyIHwgKHUzMikoc2kpIDogXAotCQkJY3R4LT5mcHJbeCAmIH4xXSA8PCAzMiA+PiAzMiB8ICh1NjQpKHNpKSA8PCAzMikKKyNkZWZpbmUgU0lUT1JFRyhzaSwgeCkgZG8gewkJCQkJCVwKKwlpZiAoY29wMV82NGJpdCh4Y3ApKSB7CQkJCQkJXAorCQl1bnNpZ25lZCBpOwkJCQkJCVwKKwkJc2V0X2ZwcjMyKCZjdHgtPmZwclt4XSwgMCwgc2kpOwkJCQlcCisJCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKGN0eC0+ZnByW3hdLnZhbDMyKTsgaSsrKQlcCisJCQlzZXRfZnByMzIoJmN0eC0+ZnByW3hdLCBpLCAwKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlzZXRfZnByMzIoJmN0eC0+ZnByWyh4KSAmIH4xXSwgKHgpICYgMSwgc2kpOwkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCiAKLSNkZWZpbmUgU0lGUk9NSFJFRyhzaSwgeCkJKChzaSkgPSAoaW50KShjdHgtPmZwclt4XSA+PiAzMikpCi0jZGVmaW5lIFNJVE9IUkVHKHNpLCB4KQkJKGN0eC0+ZnByW3hdID0gXAotCQkJCWN0eC0+ZnByW3hdIDw8IDMyID4+IDMyIHwgKHU2NCkoc2kpIDw8IDMyKQorI2RlZmluZSBTSUZST01IUkVHKHNpLCB4KQkoKHNpKSA9IGdldF9mcHIzMigmY3R4LT5mcHJbeF0sIDEpKQogCi0jZGVmaW5lIERJRlJPTVJFRyhkaSwgeCkgKChkaSkgPSBjdHgtPmZwclt4ICYgfihjb3AxXzY0Yml0KHhjcCkgPT0gMCldKQotI2RlZmluZSBESVRPUkVHKGRpLCB4KQkoY3R4LT5mcHJbeCAmIH4oY29wMV82NGJpdCh4Y3ApID09IDApXSA9IChkaSkpCisjZGVmaW5lIFNJVE9IUkVHKHNpLCB4KSBkbyB7CQkJCQkJXAorCXVuc2lnbmVkIGk7CQkJCQkJCVwKKwlzZXRfZnByMzIoJmN0eC0+ZnByW3hdLCAxLCBzaSk7CQkJCQlcCisJZm9yIChpID0gMjsgaSA8IEFSUkFZX1NJWkUoY3R4LT5mcHJbeF0udmFsMzIpOyBpKyspCQlcCisJCXNldF9mcHIzMigmY3R4LT5mcHJbeF0sIGksIDApOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERJRlJPTVJFRyhkaSwgeCkgXAorCSgoZGkpID0gZ2V0X2ZwcjY0KCZjdHgtPmZwclsoeCkgJiB+KGNvcDFfNjRiaXQoeGNwKSA9PSAwKV0sIDApKQorCisjZGVmaW5lIERJVE9SRUcoZGksIHgpIGRvIHsJCQkJCQlcCisJdW5zaWduZWQgZnByLCBpOwkJCQkJCVwKKwlmcHIgPSAoeCkgJiB+KGNvcDFfNjRiaXQoeGNwKSA9PSAwKTsJCQkJXAorCXNldF9mcHI2NCgmY3R4LT5mcHJbZnByXSwgMCwgZGkpOwkJCQlcCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUoY3R4LT5mcHJbeF0udmFsNjQpOyBpKyspCQlcCisJCXNldF9mcHI2NCgmY3R4LT5mcHJbZnByXSwgaSwgMCk7CQkJXAorfSB3aGlsZSAoMCkKIAogI2RlZmluZSBTUEZST01SRUcoc3AsIHgpIFNJRlJPTVJFRygoc3ApLmJpdHMsIHgpCiAjZGVmaW5lIFNQVE9SRUcoc3AsIHgpCVNJVE9SRUcoKHNwKS5iaXRzLCB4KQpAQCAtMTUzOCwxMCArMTU2MSwxMCBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIDB4NzoJCS8qIDcgKi8KLQkJaWYgKE1JUFNJbnN0X0ZVTkMoaXIpICE9IHBmZXRjaF9vcCkgeworCWNhc2UgMHgzOgorCQlpZiAoTUlQU0luc3RfRlVOQyhpcikgIT0gcGZldGNoX29wKQogCQkJcmV0dXJuIFNJR0lMTDsKLQkJfQorCiAJCS8qIGlnbm9yZSBwcmVmeCBvcGVyYXRpb24gKi8KIAkJYnJlYWs7CiAKQEAgLTE5NjAsMTUgKzE5ODMsMTggQEAKIAogI2lmIGRlZmluZWQoX19taXBzNjQpCiAJY2FzZSBsX2ZtdDp7CisJCXU2NCBiaXRzOworCQlESUZST01SRUcoYml0cywgTUlQU0luc3RfRlMoaXIpKTsKKwogCQlzd2l0Y2ggKE1JUFNJbnN0X0ZVTkMoaXIpKSB7CiAJCWNhc2UgZmN2dHNfb3A6CiAJCQkvKiBjb252ZXJ0IGxvbmcgdG8gc2luZ2xlIHByZWNpc2lvbiByZWFsICovCi0JCQlydi5zID0gaWVlZTc1NHNwX2Zsb25nKGN0eC0+ZnByW01JUFNJbnN0X0ZTKGlyKV0pOworCQkJcnYucyA9IGllZWU3NTRzcF9mbG9uZyhiaXRzKTsKIAkJCXJmbXQgPSBzX2ZtdDsKIAkJCWdvdG8gY29wY3NyOwogCQljYXNlIGZjdnRkX29wOgogCQkJLyogY29udmVydCBsb25nIHRvIGRvdWJsZSBwcmVjaXNpb24gcmVhbCAqLwotCQkJcnYuZCA9IGllZWU3NTRkcF9mbG9uZyhjdHgtPmZwcltNSVBTSW5zdF9GUyhpcildKTsKKwkJCXJ2LmQgPSBpZWVlNzU0ZHBfZmxvbmcoYml0cyk7CiAJCQlyZm10ID0gZF9mbXQ7CiAJCQlnb3RvIGNvcGNzcjsKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9rZXJuZWxfbGlua2FnZS5jIGIvYXJjaC9taXBzL21hdGgtZW11L2tlcm5lbF9saW5rYWdlLmMKaW5kZXggM2FlYWUwNy4uZWI1OGE4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2tlcm5lbF9saW5rYWdlLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2tlcm5lbF9saW5rYWdlLmMKQEAgLTQwLDc4ICs0MCw2IEBACiAJfQogCiAJY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0gPSBTSUdOQUxMSU5HX05BTjsKLQl9CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCXNldF9mcHI2NCgmY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sIDAsIFNJR05BTExJTkdfTkFOKTsKIH0KLQotCi0vKgotICogRW11bGF0b3IgY29udGV4dCBzYXZlL3Jlc3RvcmUgdG8vZnJvbSBhIHNpZ25hbCBjb250ZXh0Ci0gKiBwcmVzdW1lZCB0byBiZSBvbiB0aGUgdXNlciBzdGFjaywgYW5kIHRoZXJlZm9yZSBhY2Nlc3NlZAotICogd2l0aCBhcHByb3ByaWF0ZSBtYWNyb3MgZnJvbSB1YWNjZXNzLmgKLSAqLwotCi1pbnQgZnB1X2VtdWxhdG9yX3NhdmVfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQotewotCWludCBpOwotCWludCBlcnIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJZXJyIHw9Ci0JCSAgICBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAmc2MtPnNjX2ZwcmVnc1tpXSk7Ci0JfQotCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEsICZzYy0+c2NfZnBjX2Nzcik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgZnB1X2VtdWxhdG9yX3Jlc3RvcmVfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQotewotCWludCBpOwotCWludCBlcnIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJZXJyIHw9Ci0JCSAgICBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAmc2MtPnNjX2ZwcmVnc1tpXSk7Ci0JfQotCWVyciB8PSBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEsICZzYy0+c2NfZnBjX2Nzcik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0jaWZkZWYgQ09ORklHXzY0QklUCi0vKgotICogVGhpcyBpcyB0aGUgbzMyIHZlcnNpb24KLSAqLwotCi1pbnQgZnB1X2VtdWxhdG9yX3NhdmVfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYykKLXsKLQlpbnQgaTsKLQlpbnQgZXJyID0gMDsKLQlpbnQgaW5jID0gdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfRlBSRUdTKSA/IDIgOiAxOwotCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IGluYykgewotCQllcnIgfD0KLQkJICAgIF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sICZzYy0+c2NfZnByZWdzW2ldKTsKLQl9Ci0JZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwgJnNjLT5zY19mcGNfY3NyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLWludCBmcHVfZW11bGF0b3JfcmVzdG9yZV9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQotewotCWludCBpOwotCWludCBlcnIgPSAwOwotCWludCBpbmMgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpID8gMiA6IDE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gaW5jKSB7Ci0JCWVyciB8PQotCQkgICAgX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgJnNjLT5zY19mcHJlZ3NbaV0pOwotCX0KLQllcnIgfD0gX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLCAmc2MtPnNjX2ZwY19jc3IpOwotCi0JcmV0dXJuIGVycjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjRrLmMgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwppbmRleCBjMTQyNTllLi4xYzc0YTZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwpAQCAtNTcsNyArNTcsNyBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0NNUCkKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0NNUCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19DUFMpCiAjZGVmaW5lIGNwdV9oYXNfc2FmZV9pbmRleF9jYWNoZW9wcyAwCiAjZWxzZQogI2RlZmluZSBjcHVfaGFzX3NhZmVfaW5kZXhfY2FjaGVvcHMgMQpAQCAtMTIzLDYgKzEyMywyOCBAQAogCQlyNGtfYmxhc3RfZGNhY2hlX3BhZ2UgPSByNGtfYmxhc3RfZGNhY2hlX3BhZ2VfZGM2NDsKIH0KIAorI2lmbmRlZiBDT05GSUdfRVZBCisjZGVmaW5lIHI0a19ibGFzdF9kY2FjaGVfdXNlcl9wYWdlICByNGtfYmxhc3RfZGNhY2hlX3BhZ2UKKyNlbHNlCisKK3N0YXRpYyB2b2lkICgqcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYWRkcik7CisKK3N0YXRpYyB2b2lkIHI0a19ibGFzdF9kY2FjaGVfdXNlcl9wYWdlX3NldHVwKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyAgZGNfbHNpemUgPSBjcHVfZGNhY2hlX2xpbmVfc2l6ZSgpOworCisJaWYgKGRjX2xzaXplID09IDApCisJCXI0a19ibGFzdF9kY2FjaGVfdXNlcl9wYWdlID0gKHZvaWQgKiljYWNoZV9ub29wOworCWVsc2UgaWYgKGRjX2xzaXplID09IDE2KQorCQlyNGtfYmxhc3RfZGNhY2hlX3VzZXJfcGFnZSA9IGJsYXN0X2RjYWNoZTE2X3VzZXJfcGFnZTsKKwllbHNlIGlmIChkY19sc2l6ZSA9PSAzMikKKwkJcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2UgPSBibGFzdF9kY2FjaGUzMl91c2VyX3BhZ2U7CisJZWxzZSBpZiAoZGNfbHNpemUgPT0gNjQpCisJCXI0a19ibGFzdF9kY2FjaGVfdXNlcl9wYWdlID0gYmxhc3RfZGNhY2hlNjRfdXNlcl9wYWdlOworfQorCisjZW5kaWYKKwogc3RhdGljIHZvaWQgKCogcjRrX2JsYXN0X2RjYWNoZV9wYWdlX2luZGV4ZWQpKHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKIHN0YXRpYyB2b2lkIHI0a19ibGFzdF9kY2FjaGVfcGFnZV9pbmRleGVkX3NldHVwKHZvaWQpCkBAIC0yNDUsNiArMjY3LDI3IEBACiAJCXI0a19ibGFzdF9pY2FjaGVfcGFnZSA9IGJsYXN0X2ljYWNoZTY0X3BhZ2U7CiB9CiAKKyNpZm5kZWYgQ09ORklHX0VWQQorI2RlZmluZSByNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZSAgcjRrX2JsYXN0X2ljYWNoZV9wYWdlCisjZWxzZQorCitzdGF0aWMgdm9pZCAoKnI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlKSh1bnNpZ25lZCBsb25nIGFkZHIpOworCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgcjRrX2JsYXN0X2ljYWNoZV91c2VyX3BhZ2Vfc2V0dXAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGljX2xzaXplID0gY3B1X2ljYWNoZV9saW5lX3NpemUoKTsKKworCWlmIChpY19sc2l6ZSA9PSAwKQorCQlyNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZSA9ICh2b2lkICopY2FjaGVfbm9vcDsKKwllbHNlIGlmIChpY19sc2l6ZSA9PSAxNikKKwkJcjRrX2JsYXN0X2ljYWNoZV91c2VyX3BhZ2UgPSBibGFzdF9pY2FjaGUxNl91c2VyX3BhZ2U7CisJZWxzZSBpZiAoaWNfbHNpemUgPT0gMzIpCisJCXI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlID0gYmxhc3RfaWNhY2hlMzJfdXNlcl9wYWdlOworCWVsc2UgaWYgKGljX2xzaXplID09IDY0KQorCQlyNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZSA9IGJsYXN0X2ljYWNoZTY0X3VzZXJfcGFnZTsKK30KKworI2VuZGlmCiAKIHN0YXRpYyB2b2lkICgqIHI0a19ibGFzdF9pY2FjaGVfcGFnZV9pbmRleGVkKSh1bnNpZ25lZCBsb25nIGFkZHIpOwogCkBAIC0zNTUsNiArMzk4LDcgQEAKIHsKIAlzd2l0Y2ggKGN1cnJlbnRfY3B1X3R5cGUoKSkgewogCWNhc2UgQ1BVX0xPT05HU09OMjoKKwljYXNlIENQVV9MT09OR1NPTjM6CiAJY2FzZSBDUFVfUjQwMDBTQzoKIAljYXNlIENQVV9SNDAwME1DOgogCWNhc2UgQ1BVX1I0NDAwU0M6CkBAIC01MTksNyArNTYzLDggQEAKIAl9CiAKIAlpZiAoY3B1X2hhc19kY19hbGlhc2VzIHx8IChleGVjICYmICFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMpKSB7Ci0JCXI0a19ibGFzdF9kY2FjaGVfcGFnZShhZGRyKTsKKwkJdmFkZHIgPyByNGtfYmxhc3RfZGNhY2hlX3BhZ2UoYWRkcikgOgorCQkJcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2UoYWRkcik7CiAJCWlmIChleGVjICYmICFjcHVfaWNhY2hlX3Nub29wc19yZW1vdGVfc3RvcmUpCiAJCQlyNGtfYmxhc3Rfc2NhY2hlX3BhZ2UoYWRkcik7CiAJfQpAQCAtNTMwLDcgKzU3NSw4IEBACiAJCQlpZiAoY3B1X2NvbnRleHQoY3B1LCBtbSkgIT0gMCkKIAkJCQlkcm9wX21tdV9jb250ZXh0KG1tLCBjcHUpOwogCQl9IGVsc2UKLQkJCXI0a19ibGFzdF9pY2FjaGVfcGFnZShhZGRyKTsKKwkJCXZhZGRyID8gcjRrX2JsYXN0X2ljYWNoZV9wYWdlKGFkZHIpIDoKKwkJCQlyNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZShhZGRyKTsKIAl9CiAKIAlpZiAodmFkZHIpIHsKQEAgLTU5NSw2ICs2NDEsMTcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorI2lmZGVmIENPTkZJR19FVkEKKwkvKgorCSAqIER1ZSB0byBhbGwgcG9zc2libGUgc2VnbWVudCBtYXBwaW5ncywgdGhlcmUgbWlnaHQgY2FjaGUgYWxpYXNlcworCSAqIGNhdXNlZCBieSB0aGUgYm9vdGxvYWRlciBiZWluZyBpbiBub24tRVZBIG1vZGUsIGFuZCB0aGUgQ1BVIHN3aXRjaGluZworCSAqIHRvIEVWQSBkdXJpbmcgZWFybHkga2VybmVsIGluaXQuIEl0J3MgYmVzdCB0byBmbHVzaCB0aGUgc2NhY2hlCisJICogdG8gYXZvaWQgaGF2aW5nIHNlY29uZGFyeSBjb3JlcyBmZXRjaGluZyBzdGFsZSBkYXRhIGFuZCBsZWFkIHRvCisJICoga2VybmVsIGNyYXNoZXMuCisJICovCisJYmNfd2JhY2tfaW52KHN0YXJ0LCAoZW5kIC0gc3RhcnQpKTsKKwlfX3N5bmMoKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfcjRrX2ZsdXNoX2ljYWNoZV9yYW5nZV9pcGkodm9pZCAqYXJncykKQEAgLTYxNyw3ICs2NzQsNyBAQAogCWluc3RydWN0aW9uX2hhemFyZCgpOwogfQogCi0jaWZkZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAorI2lmIGRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkgfHwgZGVmaW5lZChDT05GSUdfRE1BX01BWUJFX0NPSEVSRU5UKQogCiBzdGF0aWMgdm9pZCByNGtfZG1hX2NhY2hlX3diYWNrX2ludih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKQEAgLTY4OCw3ICs3NDUsNyBAQAogCWJjX2ludihhZGRyLCBzaXplKTsKIAlfX3N5bmMoKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfRE1BX05PTkNPSEVSRU5UICovCisjZW5kaWYgLyogQ09ORklHX0RNQV9OT05DT0hFUkVOVCB8fCBDT05GSUdfRE1BX01BWUJFX0NPSEVSRU5UICovCiAKIC8qCiAgKiBXaGlsZSB3ZSdyZSBwcm90ZWN0ZWQgYWdhaW5zdCBiYWQgdXNlcmxhbmQgYWRkcmVzc2VzIHdlIGRvbid0IGNhcmUKQEAgLTEwMTAsNiArMTA2NywzMyBAQAogCQljLT5kY2FjaGUud2F5Yml0ID0gMDsKIAkJYnJlYWs7CiAKKwljYXNlIENQVV9MT09OR1NPTjM6CisJCWNvbmZpZzEgPSByZWFkX2MwX2NvbmZpZzEoKTsKKwkJbHNpemUgPSAoY29uZmlnMSA+PiAxOSkgJiA3OworCQlpZiAobHNpemUpCisJCQljLT5pY2FjaGUubGluZXN6ID0gMiA8PCBsc2l6ZTsKKwkJZWxzZQorCQkJYy0+aWNhY2hlLmxpbmVzeiA9IDA7CisJCWMtPmljYWNoZS5zZXRzID0gNjQgPDwgKChjb25maWcxID4+IDIyKSAmIDcpOworCQljLT5pY2FjaGUud2F5cyA9IDEgKyAoKGNvbmZpZzEgPj4gMTYpICYgNyk7CisJCWljYWNoZV9zaXplID0gYy0+aWNhY2hlLnNldHMgKgorCQkJCQkgIGMtPmljYWNoZS53YXlzICoKKwkJCQkJICBjLT5pY2FjaGUubGluZXN6OworCQljLT5pY2FjaGUud2F5Yml0ID0gMDsKKworCQlsc2l6ZSA9IChjb25maWcxID4+IDEwKSAmIDc7CisJCWlmIChsc2l6ZSkKKwkJCWMtPmRjYWNoZS5saW5lc3ogPSAyIDw8IGxzaXplOworCQllbHNlCisJCQljLT5kY2FjaGUubGluZXN6ID0gMDsKKwkJYy0+ZGNhY2hlLnNldHMgPSA2NCA8PCAoKGNvbmZpZzEgPj4gMTMpICYgNyk7CisJCWMtPmRjYWNoZS53YXlzID0gMSArICgoY29uZmlnMSA+PiA3KSAmIDcpOworCQlkY2FjaGVfc2l6ZSA9IGMtPmRjYWNoZS5zZXRzICoKKwkJCQkJICBjLT5kY2FjaGUud2F5cyAqCisJCQkJCSAgYy0+ZGNhY2hlLmxpbmVzejsKKwkJYy0+ZGNhY2hlLndheWJpdCA9IDA7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJaWYgKCEoY29uZmlnICYgTUlQU19DT05GX00pKQogCQkJcGFuaWMoIkRvbid0IGtub3cgaG93IHRvIHByb2JlIFAtY2FjaGVzIG9uIHRoaXMgY3B1LiIpOwpAQCAtMTExMywxMyArMTE5NywyMSBAQAogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV83NEs6CiAJY2FzZSBDUFVfMTAwNEs6CisJY2FzZSBDUFVfMTA3NEs6CiAJY2FzZSBDUFVfSU5URVJBUFRJVjoKKwljYXNlIENQVV9QNTYwMDoKIAljYXNlIENQVV9QUk9BUFRJVjoKLQkJaWYgKGN1cnJlbnRfY3B1X3R5cGUoKSA9PSBDUFVfNzRLKQorCWNhc2UgQ1BVX001MTUwOgorCQlpZiAoKGMtPmNwdXR5cGUgPT0gQ1BVXzc0SykgfHwgKGMtPmNwdXR5cGUgPT0gQ1BVXzEwNzRLKSkKIAkJCWFsaWFzXzc0a19lcnJhdHVtKGMpOwotCQlpZiAoKHJlYWRfYzBfY29uZmlnNygpICYgKDEgPDwgMTYpKSkgewotCQkJLyogZWZmZWN0aXZlbHkgcGh5c2ljYWxseSBpbmRleGVkIGRjYWNoZSwKLQkJCSAgIHRodXMgbm8gdmlydHVhbCBhbGlhc2VzLiAqLworCQlpZiAoIShyZWFkX2MwX2NvbmZpZzcoKSAmIE1JUFNfQ09ORjdfSUFSKSAmJgorCQkgICAgKGMtPmljYWNoZS53YXlzaXplID4gUEFHRV9TSVpFKSkKKwkJCWMtPmljYWNoZS5mbGFncyB8PSBNSVBTX0NBQ0hFX0FMSUFTRVM7CisJCWlmIChyZWFkX2MwX2NvbmZpZzcoKSAmIE1JUFNfQ09ORjdfQVIpIHsKKwkJCS8qCisJCQkgKiBFZmZlY3RpdmVseSBwaHlzaWNhbGx5IGluZGV4ZWQgZGNhY2hlLAorCQkJICogdGh1cyBubyB2aXJ0dWFsIGFsaWFzZXMuCisJCQkqLwogCQkJYy0+ZGNhY2hlLmZsYWdzIHw9IE1JUFNfQ0FDSEVfUElOREVYOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEyMzksNiArMTMzMSwzMyBAQAogCWMtPm9wdGlvbnMgfD0gTUlQU19DUFVfSU5DTFVTSVZFX0NBQ0hFUzsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGxvb25nc29uM19zY19pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOworCXVuc2lnbmVkIGludCBjb25maWcyLCBsc2l6ZTsKKworCWNvbmZpZzIgPSByZWFkX2MwX2NvbmZpZzIoKTsKKwlsc2l6ZSA9IChjb25maWcyID4+IDQpICYgMTU7CisJaWYgKGxzaXplKQorCQljLT5zY2FjaGUubGluZXN6ID0gMiA8PCBsc2l6ZTsKKwllbHNlCisJCWMtPnNjYWNoZS5saW5lc3ogPSAwOworCWMtPnNjYWNoZS5zZXRzID0gNjQgPDwgKChjb25maWcyID4+IDgpICYgMTUpOworCWMtPnNjYWNoZS53YXlzID0gMSArIChjb25maWcyICYgMTUpOworCisJc2NhY2hlX3NpemUgPSBjLT5zY2FjaGUuc2V0cyAqCisJCQkJICBjLT5zY2FjaGUud2F5cyAqCisJCQkJICBjLT5zY2FjaGUubGluZXN6OworCS8qIExvb25nc29uLTMgaGFzIDQgY29yZXMsIDFNQiBzY2FjaGUgZm9yIGVhY2guIHNjYWNoZXMgYXJlIHNoYXJlZCAqLworCXNjYWNoZV9zaXplICo9IDQ7CisJYy0+c2NhY2hlLndheWJpdCA9IDA7CisJcHJfaW5mbygiVW5pZmllZCBzZWNvbmRhcnkgY2FjaGUgJWxka0IgJXMsIGxpbmVzaXplICVkIGJ5dGVzLlxuIiwKKwkgICAgICAgc2NhY2hlX3NpemUgPj4gMTAsIHdheV9zdHJpbmdbYy0+c2NhY2hlLndheXNdLCBjLT5zY2FjaGUubGluZXN6KTsKKwlpZiAoc2NhY2hlX3NpemUpCisJCWMtPm9wdGlvbnMgfD0gTUlQU19DUFVfSU5DTFVTSVZFX0NBQ0hFUzsKKwlyZXR1cm47Cit9CisKIGV4dGVybiBpbnQgcjVrX3NjX2luaXQodm9pZCk7CiBleHRlcm4gaW50IHJtN2tfc2NfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgbWlwc19zY19pbml0KHZvaWQpOwpAQCAtMTI5MSw2ICsxNDEwLDEwIEBACiAJCWxvb25nc29uMl9zY19pbml0KCk7CiAJCXJldHVybjsKIAorCWNhc2UgQ1BVX0xPT05HU09OMzoKKwkJbG9vbmdzb24zX3NjX2luaXQoKTsKKwkJcmV0dXJuOworCiAJY2FzZSBDUFVfWExQOgogCQkvKiBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IEwyLCBmdWxseSBjb2hlcmVudCAqLwogCQlyZXR1cm47CkBAIC0xNDYxLDYgKzE1ODQsMTAgQEAKIAlyNGtfYmxhc3Rfc2NhY2hlX3BhZ2Vfc2V0dXAoKTsKIAlyNGtfYmxhc3Rfc2NhY2hlX3BhZ2VfaW5kZXhlZF9zZXR1cCgpOwogCXI0a19ibGFzdF9zY2FjaGVfc2V0dXAoKTsKKyNpZmRlZiBDT05GSUdfRVZBCisJcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2Vfc2V0dXAoKTsKKwlyNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZV9zZXR1cCgpOworI2VuZGlmCiAKIAkvKgogCSAqIFNvbWUgTUlQUzMyIGFuZCBNSVBTNjQgcHJvY2Vzc29ycyBoYXZlIHBoeXNpY2FsbHkgaW5kZXhlZCBjYWNoZXMuCkBAIC0xNDkyLDcgKzE2MTksNyBAQAogCWZsdXNoX2ljYWNoZV9yYW5nZQk9IHI0a19mbHVzaF9pY2FjaGVfcmFuZ2U7CiAJbG9jYWxfZmx1c2hfaWNhY2hlX3JhbmdlCT0gbG9jYWxfcjRrX2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkKKyNpZiBkZWZpbmVkKENPTkZJR19ETUFfTk9OQ09IRVJFTlQpIHx8IGRlZmluZWQoQ09ORklHX0RNQV9NQVlCRV9DT0hFUkVOVCkKIAlpZiAoY29oZXJlbnRpbykgewogCQlfZG1hX2NhY2hlX3diYWNrX2ludgk9ICh2b2lkICopY2FjaGVfbm9vcDsKIAkJX2RtYV9jYWNoZV93YmFjawk9ICh2b2lkICopY2FjaGVfbm9vcDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggZmRlN2U1Ni4uZTQyMmIzOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIEVYUE9SVF9TWU1CT0woZmx1c2hfZGF0YV9jYWNoZV9wYWdlKTsKIEVYUE9SVF9TWU1CT0woZmx1c2hfaWNhY2hlX2FsbCk7CiAKLSNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCisjaWYgZGVmaW5lZChDT05GSUdfRE1BX05PTkNPSEVSRU5UKSB8fCBkZWZpbmVkKENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQpCiAKIC8qIERNQSBjYWNoZSBvcGVyYXRpb25zLiAqLwogdm9pZCAoKl9kbWFfY2FjaGVfd2JhY2tfaW52KSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwpAQCAtNTgsNyArNTgsNyBAQAogCiBFWFBPUlRfU1lNQk9MKF9kbWFfY2FjaGVfd2JhY2tfaW52KTsKIAotI2VuZGlmIC8qIENPTkZJR19ETUFfTk9OQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfRE1BX05PTkNPSEVSRU5UIHx8IENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQgKi8KIAogLyoKICAqIFdlIGNvdWxkIG9wdGltaXplIHRoZSBjYXNlIHdoZXJlIHRoZSBjYWNoZSBhcmd1bWVudCBpcyBub3QgQkNBQ0hFIGJ1dApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2luaXQuYyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKaW5kZXggNmI1OTYxNy4uNGZjNzRjNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2luaXQuYworKysgYi9hcmNoL21pcHMvbW0vaW5pdC5jCkBAIC00MjIsMTAgKzQyMiwyMCBAQAogfQogI2VuZGlmCiAKK3ZvaWQgKCpmcmVlX2luaXRfcGFnZXNfZXZhKSh2b2lkICpiZWdpbiwgdm9pZCAqZW5kKSA9IE5VTEw7CisKIHZvaWQgX19pbml0X3JlZm9rIGZyZWVfaW5pdG1lbSh2b2lkKQogewogCXByb21fZnJlZV9wcm9tX21lbW9yeSgpOwotCWZyZWVfaW5pdG1lbV9kZWZhdWx0KFBPSVNPTl9GUkVFX0lOSVRNRU0pOworCS8qCisJICogTGV0IHRoZSBwbGF0Zm9ybSBkZWZpbmUgYSBzcGVjaWZpYyBmdW5jdGlvbiB0byBmcmVlIHRoZQorCSAqIGluaXQgc2VjdGlvbiBzaW5jZSBFVkEgbWF5IGhhdmUgdXNlZCBhbnkgcG9zc2libGUgbWFwcGluZworCSAqIGJldHdlZW4gdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzLgorCSAqLworCWlmIChmcmVlX2luaXRfcGFnZXNfZXZhKQorCQlmcmVlX2luaXRfcGFnZXNfZXZhKCh2b2lkICopJl9faW5pdF9iZWdpbiwgKHZvaWQgKikmX19pbml0X2VuZCk7CisJZWxzZQorCQlmcmVlX2luaXRtZW1fZGVmYXVsdChQT0lTT05fRlJFRV9JTklUTUVNKTsKIH0KIAogI2lmbmRlZiBDT05GSUdfTUlQU19QR0RfQzBfQ09OVEVYVApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3NjLW1pcHMuYyBiL2FyY2gvbWlwcy9tbS9zYy1taXBzLmMKaW5kZXggN2E1NmFlZS4uOTllYjhmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3NjLW1pcHMuYworKysgYi9hcmNoL21pcHMvbW0vc2MtbWlwcy5jCkBAIC03Niw4ICs3NiwxMCBAQAogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV83NEs6CiAJY2FzZSBDUFVfMTAwNEs6CisJY2FzZSBDUFVfMTA3NEs6CiAJY2FzZSBDUFVfSU5URVJBUFRJVjoKIAljYXNlIENQVV9QUk9BUFRJVjoKKwljYXNlIENQVV9QNTYwMDoKIAljYXNlIENQVV9CTUlQUzUwMDA6CiAJCWlmIChjb25maWcyICYgKDEgPDwgMTIpKQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdGxiLXI0ay5jIGIvYXJjaC9taXBzL21tL3RsYi1yNGsuYwppbmRleCBhZTRjYTI0Li5lZWFmNTBmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKQEAgLTQ4LDEzICs0OCwxNCBAQAogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAogLyoKLSAqIExPT05HU09OMiBoYXMgYSA0IGVudHJ5IGl0bGIgd2hpY2ggaXMgYSBzdWJzZXQgb2YgZHRsYiwKLSAqIHVuZm9ydHJ1bmF0ZWx5LCBpdGxiIGlzIG5vdCB0b3RhbGx5IHRyYW5zcGFyZW50IHRvIHNvZnR3YXJlLgorICogTE9PTkdTT04yLzMgaGFzIGEgNCBlbnRyeSBpdGxiIHdoaWNoIGlzIGEgc3Vic2V0IG9mIGR0bGIsCisgKiB1bmZvcnR1bmF0ZWx5LCBpdGxiIGlzIG5vdCB0b3RhbGx5IHRyYW5zcGFyZW50IHRvIHNvZnR3YXJlLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfaXRsYih2b2lkKQogewogCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CiAJY2FzZSBDUFVfTE9PTkdTT04yOgorCWNhc2UgQ1BVX0xPT05HU09OMzoKIAkJd3JpdGVfYzBfZGlhZyg0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGJleC5jIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKaW5kZXggYjIzNGIxYi4uZWU4ODM2NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYmV4LmMKKysrIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKQEAgLTUwOSw3ICs1MDksMTAgQEAKIAkJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKIAkJY2FzZSBDUFVfTTE0S0M6CiAJCWNhc2UgQ1BVXzc0SzoKKwkJY2FzZSBDUFVfMTA3NEs6CiAJCWNhc2UgQ1BVX1BST0FQVElWOgorCQljYXNlIENQVV9QNTYwMDoKKwkJY2FzZSBDUFVfTTUxNTA6CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtNTc5LDYgKzU4Miw3IEBACiAJY2FzZSBDUFVfQk1JUFM0MzgwOgogCWNhc2UgQ1BVX0JNSVBTNTAwMDoKIAljYXNlIENQVV9MT09OR1NPTjI6CisJY2FzZSBDUFVfTE9PTkdTT04zOgogCWNhc2UgQ1BVX1I1NTAwOgogCQlpZiAobTRrY190bGJwX3dhcigpKQogCQkJdWFzbV9pX25vcChwKTsKQEAgLTYyMSw3ICs2MjUsNyBAQAogCiAJZGVmYXVsdDoKIAkJcGFuaWMoIk5vIFRMQiByZWZpbGwgaGFuZGxlciB5ZXQgKENQVSB0eXBlOiAlZCkiLAotCQkgICAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUpOworCQkgICAgICBjdXJyZW50X2NwdV90eXBlKCkpOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWFtb24uYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jCmluZGV4IDU5MmFjMDQuLjg0YWM1MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jCkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfTUlQU19WUEVfTE9BREVSCisjaWZkZWYgQ09ORklHX01JUFNfVlBFX0xPQURFUl9DTVAKIGludCB2cGVfcnVuKHN0cnVjdCB2cGUgKnYpCiB7CiAJc3RydWN0IHZwZV9ub3RpZmljYXRpb25zICpuOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbml0LmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYwppbmRleCBmY2ViZmNlLi40ZjllNDRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYwpAQCAtMjAsNyArMjAsOCBAQAogI2luY2x1ZGUgPGFzbS9zbXAtb3BzLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2Z3L2Z3Lmg+Ci0jaW5jbHVkZSA8YXNtL2djbXByZWdzLmg+CisjaW5jbHVkZSA8YXNtL21pcHMtY20uaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1jcGMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tYWx0YS5oPgogCkBAIC0xMTAsNiArMTExLDExIEBACiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWJhc2UsICh1bnNpZ25lZCBsb25nKWJhc2UgKyAweDgwKTsKIH0KIAorcGh5c190IG1pcHNfY3BjX2RlZmF1bHRfcGh5c19iYXNlKHZvaWQpCit7CisJcmV0dXJuIENQQ19CQVNFX0FERFI7Cit9CisKIGV4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIG1zbXRjX3NtcF9vcHM7CiAKIHZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQpAQCAtMjM4LDEwICsyNDQsMjMgQEAKIAkJCSAgTVNDMDFfUENJX1NXQVBfQllURVNXQVAgPDwgTVNDMDFfUENJX1NXQVBfTUVNX1NIRiB8CiAJCQkgIE1TQzAxX1BDSV9TV0FQX0JZVEVTV0FQIDw8IE1TQzAxX1BDSV9TV0FQX0JBUjBfU0hGKTsKICNlbmRpZgorI2lmbmRlZiBDT05GSUdfRVZBCiAJCS8qIEZpeCB1cCB0YXJnZXQgbWVtb3J5IG1hcHBpbmcuICAqLwogCQlNU0NfUkVBRChNU0MwMV9QQ0lfQkFSMCwgbWFzayk7CiAJCU1TQ19XUklURShNU0MwMV9QQ0lfUDJTQ01TS0wsIG1hc2sgJiBNU0MwMV9QQ0lfQkFSMF9TSVpFX01TSyk7CisjZWxzZQorCQkvKgorCQkgKiBTZXR1cCB0aGUgTWFsdGEgbWF4ICgyR0IpIG1lbW9yeSBmb3IgUENJIERNQSBpbiBob3N0IGJyaWRnZQorCQkgKiBpbiB0cmFuc3BhcmVudCBhZGRyZXNzaW5nIG1vZGUsIHN0YXJ0aW5nIGZyb20gMHg4MDAwMDAwMC4KKwkJICovCisJCW1hc2sgPSBQSFlTX09GRlNFVCB8ICgxPDwzKTsKKwkJTVNDX1dSSVRFKE1TQzAxX1BDSV9CQVIwLCBtYXNrKTsKIAorCQltYXNrID0gUEhZU19PRkZTRVQ7CisJCU1TQ19XUklURShNU0MwMV9QQ0lfSEVBRDQsIG1hc2spOworCQlNU0NfV1JJVEUoTVNDMDFfUENJX1AyU0NNU0tMLCBtYXNrKTsKKwkJTVNDX1dSSVRFKE1TQzAxX1BDSV9QMlNDTUFQTCwgbWFzayk7CisjZW5kaWYKIAkJLyogRG9uJ3QgaGFuZGxlIHRhcmdldCByZXRyaWVzIGluZGVmaW5pdGVseS4gICovCiAJCWlmICgoZGF0YSAmIE1TQzAxX1BDSV9DRkdfTUFYUlRSWV9NU0spID09CiAJCSAgICBNU0MwMV9QQ0lfQ0ZHX01BWFJUUllfTVNLKQpAQCAtMjc2LDEwICsyOTUsMTMgQEAKIAljb25zb2xlX2NvbmZpZygpOwogI2VuZGlmCiAJLyogRWFybHkgZGV0ZWN0aW9uIG9mIENNUCBzdXBwb3J0ICovCi0JaWYgKGdjbXBfcHJvYmUoR0NNUF9CQVNFX0FERFIsIEdDTVBfQUREUlNQQUNFX1NaKSkKLQkJaWYgKCFyZWdpc3Rlcl9jbXBfc21wX29wcygpKQotCQkJcmV0dXJuOworCW1pcHNfY21fcHJvYmUoKTsKKwltaXBzX2NwY19wcm9iZSgpOwogCisJaWYgKCFyZWdpc3Rlcl9jcHNfc21wX29wcygpKQorCQlyZXR1cm47CisJaWYgKCFyZWdpc3Rlcl9jbXBfc21wX29wcygpKQorCQlyZXR1cm47CiAJaWYgKCFyZWdpc3Rlcl92c21wX3NtcF9vcHMoKSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYwppbmRleCBjYTNlM2E0Li5iNzFlZTgwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW50LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9taXBzLWNtLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21hbHRhLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21hbHRhaW50Lmg+CiAjaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KQEAgLTMzLDEzICszNCwxMCBAQAogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaD4KICNpbmNsdWRlIDxhc20vbXNjMDFfaWMuaD4KICNpbmNsdWRlIDxhc20vZ2ljLmg+Ci0jaW5jbHVkZSA8YXNtL2djbXByZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3J0bHguaD4KIAotaW50IGdjbXBfcHJlc2VudCA9IC0xOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX21zYzAxX2JpdV9iYXNlOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX2djbXBfYmFzZTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXBpX21hcFtOUl9DUFVTXTsKIAogc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sobWlwc19pcnFfbG9jayk7CkBAIC0xMTksNyArMTE3LDcgQEAKIAogCWRvX0lSUShNQUxUQV9JTlRfQkFTRSArIGlycSk7CiAKLSNpZmRlZiBNSVBTX1ZQRV9BUFNQX0FQSQorI2lmZGVmIENPTkZJR19NSVBTX1ZQRV9BUFNQX0FQSV9NVAogCWlmIChhcHJwX2hvb2spCiAJCWFwcnBfaG9vaygpOwogI2VuZGlmCkBAIC0yODgsMTAgKzI4Niw2IEBACiAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKIAotCi0jZGVmaW5lIEdJQ19NSVBTX0NQVV9JUElfUkVTQ0hFRF9JUlEJMwotI2RlZmluZSBHSUNfTUlQU19DUFVfSVBJX0NBTExfSVJRCTQKLQogI2RlZmluZSBNSVBTX0NQVV9JUElfUkVTQ0hFRF9JUlEgMAkvKiBTVyBpbnQgMCBmb3IgcmVzY2hlZCAqLwogI2RlZmluZSBDX1JFU0NIRUQgQ19TVzAKICNkZWZpbmUgTUlQU19DUFVfSVBJX0NBTExfSVJRIDEJCS8qIFNXIGludCAxIGZvciByZXNjaGVkICovCkBAIC0zMDgsOSArMzAyLDE2IEBACiAJZG9fSVJRKE1JUFNfQ1BVX0lSUV9CQVNFICsgTUlQU19DUFVfSVBJX0NBTExfSVJRKTsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNUCAqLworCisjaWZkZWYgQ09ORklHX01JUFNfR0lDX0lQSQorCisjZGVmaW5lIEdJQ19NSVBTX0NQVV9JUElfUkVTQ0hFRF9JUlEJMworI2RlZmluZSBHSUNfTUlQU19DUFVfSVBJX0NBTExfSVJRCTQKKwogc3RhdGljIGlycXJldHVybl90IGlwaV9yZXNjaGVkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0jaWZkZWYgTUlQU19WUEVfQVBTUF9BUEkKKyNpZmRlZiBDT05GSUdfTUlQU19WUEVfQVBTUF9BUElfQ01QCiAJaWYgKGFwcnBfaG9vaykKIAkJYXBycF9ob29rKCk7CiAjZW5kaWYKQEAgLTMzOCw3ICszMzksNyBAQAogCS5mbGFncwkJPSBJUlFGX1BFUkNQVSwKIAkubmFtZQkJPSAiSVBJX2NhbGwiCiB9OwotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNUCAqLworI2VuZGlmIC8qIENPTkZJR19NSVBTX0dJQ19JUEkgKi8KIAogc3RhdGljIGludCBnaWNfcmVzY2hlZF9pbnRfYmFzZTsKIHN0YXRpYyBpbnQgZ2ljX2NhbGxfaW50X2Jhc2U7CkBAIC00MTgsNDkgKzQxOSw3IEBACiB9OwogI3VuZGVmIFgKIAotLyoKLSAqIEdDTVAgbmVlZHMgdG8gYmUgZGV0ZWN0ZWQgYmVmb3JlIGFueSBTTVAgaW5pdGlhbGlzYXRpb24KLSAqLwotaW50IF9faW5pdCBnY21wX3Byb2JlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmICgobWlwc19yZXZpc2lvbl9zY29uaWQgIT0gTUlQU19SRVZJU0lPTl9TQ09OX1JPQ0lUKSAgJiYKLQkgICAgKG1pcHNfcmV2aXNpb25fc2NvbmlkICE9IE1JUFNfUkVWSVNJT05fU0NPTl9HVDY0MTIwKSkgewotCQlnY21wX3ByZXNlbnQgPSAwOwotCQlwcl9kZWJ1ZygiR0NNUCBOT1QgcHJlc2VudFxuIik7Ci0JCXJldHVybiBnY21wX3ByZXNlbnQ7Ci0JfQotCi0JaWYgKGdjbXBfcHJlc2VudCA+PSAwKQotCQlyZXR1cm4gZ2NtcF9wcmVzZW50OwotCi0JX2djbXBfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwX25vY2FjaGUoR0NNUF9CQVNFX0FERFIsCi0JCUdDTVBfQUREUlNQQUNFX1NaKTsKLQlfbXNjMDFfYml1X2Jhc2UgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcF9ub2NhY2hlKE1TQzAxX0JJVV9SRUdfQkFTRSwKLQkJTVNDMDFfQklVX0FERFJTUEFDRV9TWik7Ci0JZ2NtcF9wcmVzZW50ID0gKChHQ01QR0NCKEdDTVBCKSAmIEdDTVBfR0NCX0dDTVBCX0dDTVBCQVNFX01TSykgPT0KLQkJR0NNUF9CQVNFX0FERFIpOwotCi0JaWYgKGdjbXBfcHJlc2VudCkKLQkJcHJfZGVidWcoIkdDTVAgcHJlc2VudFxuIik7Ci0JcmV0dXJuIGdjbXBfcHJlc2VudDsKLX0KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgSU9DVSdzIHByZXNlbnQgKi8KLWludCBfX2luaXQgZ2NtcF9uaW9jdSh2b2lkKQotewotCXJldHVybiBnY21wX3ByZXNlbnQgPyAoKEdDTVBHQ0IoR0MpICYgR0NNUF9HQ0JfR0NfTlVNSU9DVV9NU0spID4+Ci0JCUdDTVBfR0NCX0dDX05VTUlPQ1VfU0hGKSA6IDA7Ci19Ci0KLS8qIFNldCBHQ01QIHJlZ2lvbiBhdHRyaWJ1dGVzICovCi12b2lkIF9faW5pdCBnY21wX3NldHJlZ2lvbihpbnQgcmVnaW9uLCB1bnNpZ25lZCBsb25nIGJhc2UsCi0JCQkgICB1bnNpZ25lZCBsb25nIG1hc2ssIGludCB0eXBlKQotewotCUdDTVBHQ0JuKENNeEJBU0UsIHJlZ2lvbikgPSBiYXNlOwotCUdDTVBHQ0JuKENNeE1BU0ssIHJlZ2lvbikgPSBtYXNrIHwgdHlwZTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01QKQorI2lmZGVmIENPTkZJR19NSVBTX0dJQ19JUEkKIHN0YXRpYyB2b2lkIF9faW5pdCBmaWxsX2lwaV9tYXAxKGludCBiYXNlaW50ciwgaW50IGNwdSwgaW50IGNwdXBpbikKIHsKIAlpbnQgaW50ciA9IGJhc2VpbnRyICsgY3B1OwpAQCAtNDk2LDggKzQ1NSw4IEBACiAJaWYgKCFjcHVfaGFzX3ZlaWMpCiAJCW1pcHNfY3B1X2lycV9pbml0KCk7CiAKLQlpZiAoZ2NtcF9wcmVzZW50KSAgewotCQlHQ01QR0NCKEdJQ0JBKSA9IEdJQ19CQVNFX0FERFIgfCBHQ01QX0dDQl9HSUNCQV9FTl9NU0s7CisJaWYgKG1pcHNfY21fcHJlc2VudCgpKSB7CisJCXdyaXRlX2djcl9naWNfYmFzZShHSUNfQkFTRV9BRERSIHwgQ01fR0NSX0dJQ19CQVNFX0dJQ0VOX01TSyk7CiAJCWdpY19wcmVzZW50ID0gMTsKIAl9IGVsc2UgewogCQlpZiAobWlwc19yZXZpc2lvbl9zY29uaWQgPT0gTUlQU19SRVZJU0lPTl9TQ09OX1JPQ0lUKSB7CkBAIC01NzYsNyArNTM1LDcgQEAKIAlpZiAoZ2ljX3ByZXNlbnQpIHsKIAkJLyogRklYTUUgKi8KIAkJaW50IGk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApCisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19HSUNfSVBJKQogCQlnaWNfY2FsbF9pbnRfYmFzZSA9IEdJQ19OVU1fSU5UUlMgLQogCQkJKE5SX0NQVVMgLSBucl9jcHVfaWRzKSAqIDIgLSBucl9jcHVfaWRzOwogCQlnaWNfcmVzY2hlZF9pbnRfYmFzZSA9IGdpY19jYWxsX2ludF9iYXNlIC0gbnJfY3B1X2lkczsKQEAgLTU4NCwxNCArNTQzLDE0IEBACiAjZW5kaWYKIAkJZ2ljX2luaXQoR0lDX0JBU0VfQUREUiwgR0lDX0FERFJTUEFDRV9TWiwgZ2ljX2ludHJfbWFwLAogCQkJCUFSUkFZX1NJWkUoZ2ljX2ludHJfbWFwKSwgTUlQU19HSUNfSVJRX0JBU0UpOwotCQlpZiAoIWdjbXBfcHJlc2VudCkgeworCQlpZiAoIW1pcHNfY21fcHJlc2VudCgpKSB7CiAJCQkvKiBFbmFibGUgdGhlIEdJQyAqLwogCQkJaSA9IFJFRyhfbXNjMDFfYml1X2Jhc2UsIE1TQzAxX1NDX0NGRyk7CiAJCQlSRUcoX21zYzAxX2JpdV9iYXNlLCBNU0MwMV9TQ19DRkcpID0KIAkJCQkoaSB8ICgweDEgPDwgTVNDMDFfU0NfQ0ZHX0dJQ0VOQV9TSEYpKTsKIAkJCXByX2RlYnVnKCJHSUMgRW5hYmxlZFxuIik7CiAJCX0KLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0dJQ19JUEkpCiAJCS8qIHNldCB1cCBpcGkgaW50ZXJydXB0cyAqLwogCQlpZiAoY3B1X2hhc192aW50KSB7CiAJCQlzZXRfdmlfaGFuZGxlcihNSVBTQ1BVX0lOVF9JUEkwLCBtYWx0YV9pcGlfaXJxZGlzcGF0Y2gpOwpAQCAtNzA4LDE2ICs2NjcsMTYgQEAKIAkvKiBUaGlzIGR1cGxpY2F0ZXMgdGhlIGhhbmRsaW5nIGluIGRvX2JlIHdoaWNoIHNlZW1zIHdyb25nICovCiAJaW50IHJldHZhbCA9IGlzX2ZpeHVwID8gTUlQU19CRV9GSVhVUCA6IE1JUFNfQkVfRkFUQUw7CiAKLQlpZiAoZ2NtcF9wcmVzZW50KSB7Ci0JCXVuc2lnbmVkIGxvbmcgY21fZXJyb3IgPSBHQ01QR0NCKEdDTUVDKTsKLQkJdW5zaWduZWQgbG9uZyBjbV9hZGRyID0gR0NNUEdDQihHQ01FQSk7Ci0JCXVuc2lnbmVkIGxvbmcgY21fb3RoZXIgPSBHQ01QR0NCKEdDTUVPKTsKKwlpZiAobWlwc19jbV9wcmVzZW50KCkpIHsKKwkJdW5zaWduZWQgbG9uZyBjbV9lcnJvciA9IHJlYWRfZ2NyX2Vycm9yX2NhdXNlKCk7CisJCXVuc2lnbmVkIGxvbmcgY21fYWRkciA9IHJlYWRfZ2NyX2Vycm9yX2FkZHIoKTsKKwkJdW5zaWduZWQgbG9uZyBjbV9vdGhlciA9IHJlYWRfZ2NyX2Vycm9yX211bHQoKTsKIAkJdW5zaWduZWQgbG9uZyBjYXVzZSwgb2NhdXNlOwogCQljaGFyIGJ1ZlsyNTZdOwogCi0JCWNhdXNlID0gKGNtX2Vycm9yICYgR0NNUF9HQ0JfR01FQ19FUlJPUl9UWVBFX01TSyk7CisJCWNhdXNlID0gY21fZXJyb3IgJiBDTV9HQ1JfRVJST1JfQ0FVU0VfRVJSVFlQRV9NU0s7CiAJCWlmIChjYXVzZSAhPSAwKSB7Ci0JCQljYXVzZSA+Pj0gR0NNUF9HQ0JfR01FQ19FUlJPUl9UWVBFX1NIRjsKKwkJCWNhdXNlID4+PSBDTV9HQ1JfRVJST1JfQ0FVU0VfRVJSVFlQRV9TSEY7CiAJCQlpZiAoY2F1c2UgPCAxNikgewogCQkJCXVuc2lnbmVkIGxvbmcgY2NhX2JpdHMgPSAoY21fZXJyb3IgPj4gMTUpICYgNzsKIAkJCQl1bnNpZ25lZCBsb25nIHRyX2JpdHMgPSAoY21fZXJyb3IgPj4gMTIpICYgNzsKQEAgLTc0OCw4ICs3MDcsOCBAQAogCQkJCQkgbWNtZFtjbWRfYml0c10sIHNwb3J0X2JpdHMpOwogCQkJfQogCi0JCQlvY2F1c2UgPSAoY21fb3RoZXIgJiBHQ01QX0dDQl9HTUVPX0VSUk9SXzJORF9NU0spID4+Ci0JCQkJIEdDTVBfR0NCX0dNRU9fRVJST1JfMk5EX1NIRjsKKwkJCW9jYXVzZSA9IChjbV9vdGhlciAmIENNX0dDUl9FUlJPUl9NVUxUX0VSUjJORF9NU0spID4+CisJCQkJIENNX0dDUl9FUlJPUl9NVUxUX0VSUjJORF9TSEY7CiAKIAkJCXByX2VycigiQ01fRVJST1I9JTA4bHggJXMgPCVzPlxuIiwgY21fZXJyb3IsCiAJCQkgICAgICAgY2F1c2VzW2NhdXNlXSwgYnVmKTsKQEAgLTc1Nyw3ICs3MTYsNyBAQAogCQkJcHJfZXJyKCJDTV9PVEhFUj0lMDhseCAlc1xuIiwgY21fb3RoZXIsIGNhdXNlc1tvY2F1c2VdKTsKIAogCQkJLyogcmVwcmltZSBjYXVzZSByZWdpc3RlciAqLwotCQkJR0NNUEdDQihHQ01FQykgPSAwOworCQkJd3JpdGVfZ2NyX2Vycm9yX2NhdXNlKDApOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLW1lbW9yeS5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1tZW1vcnkuYwppbmRleCAxZjczZDYzLi42ZDBmNGFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLW1lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtbWVtb3J5LmMKQEAgLTI0LDIyICsyNCwzMCBAQAogLyogZGV0ZXJtaW5lZCBwaHlzaWNhbCBtZW1vcnkgc2l6ZSwgbm90IG92ZXJyaWRkZW4gYnkgY29tbWFuZCBsaW5lIGFyZ3MJICovCiB1bnNpZ25lZCBsb25nIHBoeXNpY2FsX21lbXNpemUgPSAwTDsKIAotZndfbWVtYmxvY2tfdCAqIF9faW5pdCBmd19nZXRtZGVzYyh2b2lkKQorZndfbWVtYmxvY2tfdCAqIF9faW5pdCBmd19nZXRtZGVzYyhpbnQgZXZhKQogewotCWNoYXIgKm1lbXNpemVfc3RyLCAqcHRyOwotCXVuc2lnbmVkIGludCBtZW1zaXplOworCWNoYXIgKm1lbXNpemVfc3RyLCAqZW1lbXNpemVfc3RyIF9fbWF5YmVfdW51c2VkID0gTlVMTCwgKnB0cjsKKwl1bnNpZ25lZCBsb25nIG1lbXNpemUsIGVtZW1zaXplIF9fbWF5YmVfdW51c2VkID0gMDsKIAlzdGF0aWMgY2hhciBjbWRsaW5lW0NPTU1BTkRfTElORV9TSVpFXSBfX2luaXRkYXRhOwotCWxvbmcgdmFsOwogCWludCB0bXA7CiAKIAkvKiBvdGhlcndpc2UgbG9vayBpbiB0aGUgZW52aXJvbm1lbnQgKi8KKwogCW1lbXNpemVfc3RyID0gZndfZ2V0ZW52KCJtZW1zaXplIik7Ci0JaWYgKCFtZW1zaXplX3N0cikgeworCWlmIChtZW1zaXplX3N0cikKKwkJdG1wID0ga3N0cnRvbChtZW1zaXplX3N0ciwgMCwgJm1lbXNpemUpOworCWlmIChldmEpIHsKKwkvKiBMb29rIGZvciBlbWVtc2l6ZSBmb3IgRVZBICovCisJCWVtZW1zaXplX3N0ciA9IGZ3X2dldGVudigiZW1lbXNpemUiKTsKKwkJaWYgKGVtZW1zaXplX3N0cikKKwkJCXRtcCA9IGtzdHJ0b2woZW1lbXNpemVfc3RyLCAwLCAmZW1lbXNpemUpOworCX0KKwlpZiAoIW1lbXNpemUgJiYgIWVtZW1zaXplKSB7CiAJCXByX3dhcm4oIm1lbXNpemUgbm90IHNldCBpbiBZQU1PTiwgc2V0IHRvIGRlZmF1bHQgKDMyTWIpXG4iKTsKIAkJcGh5c2ljYWxfbWVtc2l6ZSA9IDB4MDIwMDAwMDA7CiAJfSBlbHNlIHsKLQkJdG1wID0ga3N0cnRvbChtZW1zaXplX3N0ciwgMCwgJnZhbCk7Ci0JCXBoeXNpY2FsX21lbXNpemUgPSAodW5zaWduZWQgbG9uZyl2YWw7CisJCS8qIElmIGVtZW1zaXplIGlzIHNldCwgdGhlbiBzZXQgcGh5c2ljYWxfbWVtc2l6ZSB0byB0aGF0ICovCisJCXBoeXNpY2FsX21lbXNpemUgPSBlbWVtc2l6ZSA/IDogbWVtc2l6ZTsKIAl9CiAKICNpZmRlZiBDT05GSUdfQ1BVX0JJR19FTkRJQU4KQEAgLTU0LDIwICs2MiwzMCBAQAogCXB0ciA9IHN0cnN0cihjbWRsaW5lLCAibWVtc2l6ZT0iKTsKIAlpZiAocHRyICYmIChwdHIgIT0gY21kbGluZSkgJiYgKCoocHRyIC0gMSkgIT0gJyAnKSkKIAkJcHRyID0gc3Ryc3RyKHB0ciwgIiBtZW1zaXplPSIpOworCS8qIEFuZCBub3cgbG9vayBmb3IgZW1lbXNpemUgKi8KKwlpZiAoZXZhKSB7CisJCXB0ciA9IHN0cnN0cihjbWRsaW5lLCAiZW1lbXNpemU9Iik7CisJCWlmIChwdHIgJiYgKHB0ciAhPSBjbWRsaW5lKSAmJiAoKihwdHIgLSAxKSAhPSAnICcpKQorCQkJcHRyID0gc3Ryc3RyKHB0ciwgIiBlbWVtc2l6ZT0iKTsKKwl9CiAKIAlpZiAocHRyKQotCQltZW1zaXplID0gbWVtcGFyc2UocHRyICsgOCwgJnB0cik7CisJCW1lbXNpemUgPSBtZW1wYXJzZShwdHIgKyA4ICsgKGV2YSA/IDEgOiAwKSwgJnB0cik7CiAJZWxzZQogCQltZW1zaXplID0gcGh5c2ljYWxfbWVtc2l6ZTsKIAorCS8qIExhc3QgNjRLIGZvciBISUdITUVNIGFyaXRobWV0aWNzICovCisJaWYgKG1lbXNpemUgPiAweDdmZmYwMDAwKQorCQltZW1zaXplID0gMHg3ZmZmMDAwMDsKKwogCW1lbXNldChtZGVzYywgMCwgc2l6ZW9mKG1kZXNjKSk7CiAKIAltZGVzY1swXS50eXBlID0gZndfZG9udHVzZTsKLQltZGVzY1swXS5iYXNlID0gMHgwMDAwMDAwMDsKKwltZGVzY1swXS5iYXNlID0gUEhZU19PRkZTRVQ7CiAJbWRlc2NbMF0uc2l6ZSA9IDB4MDAwMDEwMDA7CiAKIAltZGVzY1sxXS50eXBlID0gZndfY29kZTsKLQltZGVzY1sxXS5iYXNlID0gMHgwMDAwMTAwMDsKKwltZGVzY1sxXS5iYXNlID0gbWRlc2NbMF0uYmFzZSArIDB4MDAwMDEwMDBVTDsKIAltZGVzY1sxXS5zaXplID0gMHgwMDBlZjAwMDsKIAogCS8qCkBAIC03OCwyMSArOTYsMjcgQEAKIAkgKiBkZXZpY2VzLgogCSAqLwogCW1kZXNjWzJdLnR5cGUgPSBmd19kb250dXNlOwotCW1kZXNjWzJdLmJhc2UgPSAweDAwMGYwMDAwOworCW1kZXNjWzJdLmJhc2UgPSBtZGVzY1swXS5iYXNlICsgMHgwMDBmMDAwMFVMOwogCW1kZXNjWzJdLnNpemUgPSAweDAwMDEwMDAwOwogCiAJbWRlc2NbM10udHlwZSA9IGZ3X2RvbnR1c2U7Ci0JbWRlc2NbM10uYmFzZSA9IDB4MDAxMDAwMDA7CisJbWRlc2NbM10uYmFzZSA9IG1kZXNjWzBdLmJhc2UgKyAweDAwMTAwMDAwVUw7CiAJbWRlc2NbM10uc2l6ZSA9IENQSFlTQUREUihQRk5fQUxJR04oKHVuc2lnbmVkIGxvbmcpJl9lbmQpKSAtCi0JCW1kZXNjWzNdLmJhc2U7CisJCTB4MDAxMDAwMDBVTDsKIAogCW1kZXNjWzRdLnR5cGUgPSBmd19mcmVlOwotCW1kZXNjWzRdLmJhc2UgPSBDUEhZU0FERFIoUEZOX0FMSUdOKCZfZW5kKSk7Ci0JbWRlc2NbNF0uc2l6ZSA9IG1lbXNpemUgLSBtZGVzY1s0XS5iYXNlOworCW1kZXNjWzRdLmJhc2UgPSBtZGVzY1swXS5iYXNlICsgQ1BIWVNBRERSKFBGTl9BTElHTigmX2VuZCkpOworCW1kZXNjWzRdLnNpemUgPSBtZW1zaXplIC0gQ1BIWVNBRERSKG1kZXNjWzRdLmJhc2UpOwogCiAJcmV0dXJuICZtZGVzY1swXTsKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9pbml0X3BhZ2VzX2V2YV9tYWx0YSh2b2lkICpiZWdpbiwgdm9pZCAqZW5kKQoreworCWZyZWVfaW5pdF9wYWdlcygidW51c2VkIGtlcm5lbCIsIF9fcGFfc3ltYm9sKCh1bnNpZ25lZCBsb25nICopYmVnaW4pLAorCQkJX19wYV9zeW1ib2woKHVuc2lnbmVkIGxvbmcgKillbmQpKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZndfbWVtdHlwZV9jbGFzc2lmeSh1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTEwOSw3ICsxMzMsOSBAQAogewogCWZ3X21lbWJsb2NrX3QgKnA7CiAKLQlwID0gZndfZ2V0bWRlc2MoKTsKKwlwID0gZndfZ2V0bWRlc2MoY29uZmlnX2VuYWJsZWQoQ09ORklHX0VWQSkpOworCWZyZWVfaW5pdF9wYWdlc19ldmEgPSAoY29uZmlnX2VuYWJsZWQoQ09ORklHX0VWQSkgPworCQkJICAgICAgIGZyZWVfaW5pdF9wYWdlc19ldmFfbWFsdGEgOiBOVUxMKTsKIAogCXdoaWxlIChwLT5zaXplKSB7CiAJCWxvbmcgdHlwZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYwppbmRleCBjNzJhMDY5Li5iZjYyMTUxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNldHVwLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jCkBAIC0yNiwxMiArMjYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNpbmNsdWRlIDxhc20vZncvZncuaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1jbS5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9nZW5lcmljLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21hbHRhLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21hbHRhaW50Lmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9nY21wcmVncy5oPgogI2lmZGVmIENPTkZJR19WVAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNlbmRpZgpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCQkJIEJPTklUT19QQ0lNRU1CQVNFQ0ZHX01FTUJBU0UxX0NBQ0hFRCk7CiAJCQlwcl9pbmZvKCJFbmFibGVkIEJvbml0byBJT0JDIGNvaGVyZW5jeVxuIik7CiAJCX0KLQl9IGVsc2UgaWYgKGdjbXBfbmlvY3UoKSAhPSAwKSB7CisJfSBlbHNlIGlmIChtaXBzX2NtX251bWlvY3UoKSAhPSAwKSB7CiAJCS8qIE5vdGhpbmcgc3BlY2lhbCBuZWVkcyB0byBiZSBkb25lIHRvIGVuYWJsZSBjb2hlcmVuY3kgKi8KIAkJcHJfaW5mbygiQ01QIElPQ1UgZGV0ZWN0ZWRcbiIpOwogCQlpZiAoKCoodW5zaWduZWQgaW50ICopMHhiZjQwMzAwMCAmIDB4ODEpICE9IDB4ODEpIHsKQEAgLTE2NSw3ICsxNjUsNiBAQAogI2VuZGlmCiB9CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREUKIHN0YXRpYyB2b2lkIF9faW5pdCBwY2lfY2xvY2tfY2hlY2sodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgX19pb21lbSAqam1wcl9wID0KQEAgLTE3NSwxOCArMTc0LDI1IEBACiAJCTMzLCAyMCwgMjUsIDMwLCAxMiwgMTYsIDM3LCAxMAogCX07CiAJaW50IHBjaWNsb2NrID0gcGNpY2xvY2tzW2ptcHJdOwotCWNoYXIgKmFyZ3B0ciA9IGZ3X2dldGNtZGxpbmUoKTsKKwljaGFyICpvcHRwdHIsICphcmdwdHIgPSBmd19nZXRjbWRsaW5lKCk7CiAKLQlpZiAocGNpY2xvY2sgIT0gMzMgJiYgIXN0cnN0cihhcmdwdHIsICJpZGVidXM9IikpIHsKLQkJcHJfd2FybigiV0FSTklORzogUENJIGNsb2NrIGlzICVkTUh6LCBzZXR0aW5nIGlkZWJ1c1xuIiwKKwkvKgorCSAqIElmIHVzZXIgcGFzc2VkIGEgcGNpX2Nsb2NrPSBvcHRpb24sIGRvbid0IHRhY2sgb24gYW5vdGhlciBvbmUKKwkgKi8KKwlvcHRwdHIgPSBzdHJzdHIoYXJncHRyLCAicGNpX2Nsb2NrPSIpOworCWlmIChvcHRwdHIgJiYgKG9wdHB0ciA9PSBhcmdwdHIgfHwgb3B0cHRyWy0xXSA9PSAnICcpKQorCQlyZXR1cm47CisKKwlpZiAocGNpY2xvY2sgIT0gMzMpIHsKKwkJcHJfd2FybigiV0FSTklORzogUENJIGNsb2NrIGlzICVkTUh6LCBzZXR0aW5nIHBjaV9jbG9ja1xuIiwKIAkJCXBjaWNsb2NrKTsKIAkJYXJncHRyICs9IHN0cmxlbihhcmdwdHIpOwotCQlzcHJpbnRmKGFyZ3B0ciwgIiBpZGVidXM9JWQiLCBwY2ljbG9jayk7CisJCXNwcmludGYoYXJncHRyLCAiIHBjaV9jbG9jaz0lZCIsIHBjaWNsb2NrKTsKIAkJaWYgKHBjaWNsb2NrIDwgMjAgfHwgcGNpY2xvY2sgPiA2NikKLQkJCXByX3dhcm4oIldBUk5JTkc6IElERSB0aW1pbmcgY2FsY3VsYXRpb25zIHdpbGwgYmUgaW5jb3JyZWN0XG4iKTsKKwkJCXByX3dhcm4oIldBUk5JTkc6IElERSB0aW1pbmcgY2FsY3VsYXRpb25zIHdpbGwgYmUgIgorCQkJICAgICAgICAiaW5jb3JyZWN0XG4iKTsKIAl9CiB9Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19WR0FfQ09OU09MRSkKIHN0YXRpYyB2b2lkIF9faW5pdCBzY3JlZW5faW5mb19zZXR1cCh2b2lkKQpAQCAtMjQ3LDYgKzI1MywxMCBAQAogewogCXVuc2lnbmVkIGludCBpOwogCisJaWYgKGNvbmZpZ19lbmFibGVkKENPTkZJR19FVkEpKQorCQkvKiBFVkEgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkIGluIG1hY2gtbWFsdGEva2VybmVsLWluaXQuaCAqLworCQlwcl9pbmZvKCJFbmhhbmNlZCBWaXJ0dWFsIEFkZHJlc3NpbmcgKEVWQSkgYWN0aXZhdGVkXG4iKTsKKwogCW1pcHNfcGNpYmlvc19pbml0KCk7CiAKIAkvKiBSZXF1ZXN0IEkvTyBzcGFjZSBmb3IgZGV2aWNlcyB1c2VkIG9uIHRoZSBNYWx0YSBib2FyZC4gKi8KQEAgLTI2OCw5ICsyNzgsNyBAQAogCiAJcGxhdF9zZXR1cF9pb2NvaGVyZW5jeSgpOwogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSURFCiAJcGNpX2Nsb2NrX2NoZWNrKCk7Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0ZECiAJZmRfYWN0aXZhdGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktc2VhZDMvc2VhZDMtbXRkLmMgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLW10ZC5jCmluZGV4IGZmYTM1ZjUuLmY5Yzg5MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktc2VhZDMvc2VhZDMtbXRkLmMKKysrIGIvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy1tdGQuYwpAQCAtNTAsNSArNTAsNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLW1vZHVsZV9pbml0KHNlYWQzX210ZF9pbml0KQorZGV2aWNlX2luaXRjYWxsKHNlYWQzX210ZF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYwppbmRleCAyYTg2ZTM4Li5lNzQ3MzI0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCkBAIC04Niw4ICs4NiwxMSBAQAogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV8xMDA0SzoKIAljYXNlIENQVV83NEs6CisJY2FzZSBDUFVfMTA3NEs6CiAJY2FzZSBDUFVfSU5URVJBUFRJVjoKIAljYXNlIENQVV9QUk9BUFRJVjoKKwljYXNlIENQVV9QNTYwMDoKKwljYXNlIENQVV9NNTE1MDoKIAljYXNlIENQVV9MT09OR1NPTjE6CiAJY2FzZSBDUFVfU0IxOgogCWNhc2UgQ1BVX1NCMUE6CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKaW5kZXggNGQ5NGQ3NS4uNDI4MjFhZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwpAQCAtMzcyLDYgKzM3Miw3IEBACiAJCW9wX21vZGVsX21pcHN4eF9vcHMuY3B1X3R5cGUgPSAibWlwcy8zNEsiOwogCQlicmVhazsKIAorCWNhc2UgQ1BVXzEwNzRLOgogCWNhc2UgQ1BVXzc0SzoKIAkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzLzc0SyI7CiAJCWJyZWFrOwpAQCAtMzg0LDYgKzM4NSwxNCBAQAogCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvcHJvQXB0aXYiOwogCQlicmVhazsKIAorCWNhc2UgQ1BVX1A1NjAwOgorCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvUDU2MDAiOworCQlicmVhazsKKworCWNhc2UgQ1BVX001MTUwOgorCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvTTUxNTAiOworCQlicmVhazsKKwogCWNhc2UgQ1BVXzVLQzoKIAkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzLzVLIjsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQppbmRleCAxMzdmMmE2Li5kNjExMzhhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDcgQEAKIG9iai0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gZml4dXAtY29iYWx0Lm8KIG9iai0kKENPTkZJR19MRU1PVEVfRlVMT09ORzJFKQkrPSBmaXh1cC1mdWxvb25nMmUubyBvcHMtbG9vbmdzb24yLm8KIG9iai0kKENPTkZJR19MRU1PVEVfTUFDSDJGKQkrPSBmaXh1cC1sZW1vdGUyZi5vIG9wcy1sb29uZ3NvbjIubworb2JqLSQoQ09ORklHX0xFTU9URV9NQUNIM0EpCSs9IGZpeHVwLWxvb25nc29uMy5vIG9wcy1sb29uZ3NvbjMubwogb2JqLSQoQ09ORklHX01JUFNfTUFMVEEpCSs9IGZpeHVwLW1hbHRhLm8gcGNpLW1hbHRhLm8KIG9iai0kKENPTkZJR19QTUNfTVNQNzEyMF9HVykJKz0gZml4dXAtcG1jbXNwLm8gb3BzLXBtY21zcC5vCiBvYmotJChDT05GSUdfUE1DX01TUDcxMjBfRVZBTCkJKz0gZml4dXAtcG1jbXNwLm8gb3BzLXBtY21zcC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWxvb25nc29uMy5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1sb29uZ3NvbjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA4YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1sb29uZ3NvbjMuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogZml4dXAtbG9vbmdzb24zLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTGVtb3RlLCBJbmMuCisgKiBBdXRob3I6IFhpYW5nIFl1LCB4aWFuZ3lAbGVtb3RlLmNvbQorICogICAgICAgICBDaGVuIEh1YWNhaSwgY2hlbmhjQGxlbW90ZS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxib290X3BhcmFtLmg+CisKK3N0YXRpYyB2b2lkIHByaW50X2ZpeHVwX2luZm8oY29uc3Qgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkRldmljZSAleDoleCwgaXJxICVkXG4iLAorCQkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPmlycSk7Cit9CisKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlwcmludF9maXh1cF9pbmZvKGRldik7CisJcmV0dXJuIGRldi0+aXJxOworfQorCitzdGF0aWMgdm9pZCBwY2lfZml4dXBfcmFkZW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkKKwkJcmV0dXJuOworCisJaWYgKCFsb29uZ3Nvbl9zeXNjb25mLnZnYWJpb3NfYWRkcikKKwkJcmV0dXJuOworCisJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQgPQorCQlsb29uZ3Nvbl9zeXNjb25mLnZnYWJpb3NfYWRkcjsKKwlwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5lbmQgICA9CisJCWxvb25nc29uX3N5c2NvbmYudmdhYmlvc19hZGRyICsgMjU2KjEwMjQgLSAxOworCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX0NPUFk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQkFSICVkOiBhc3NpZ25lZCAlcFIgZm9yIFJhZGVvbiBST01cbiIsCisJCQlQQ0lfUk9NX1JFU09VUkNFLCAmcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0pOworfQorCitERUNMQVJFX1BDSV9GSVhVUF9DTEFTU19GSU5BTChQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0FOWV9JRCwKKwkJCQlQQ0lfQ0xBU1NfRElTUExBWV9WR0EsIDgsIHBjaV9maXh1cF9yYWRlb24pOworCisvKiBEbyBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYXQgcGNpX2VuYWJsZV9kZXZpY2UoKSB0aW1lICovCitpbnQgcGNpYmlvc19wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLW1hbHRhLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLW1hbHRhLmMKaW5kZXggN2EwZWRhNy4uMmY5ZTUyYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1tYWx0YS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtbWFsdGEuYwpAQCAtNTEsNiArNTEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWFsdGFfcGlpeF9mdW5jM19iYXNlX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogU2V0IGEgc2FuZSBQTSBJL08gYmFzZSBhZGRyZXNzICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUElJWDRfRlVOQzNfUE1CQSwgMHgxMDAwKTsKKworCS8qIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIFBNIEkvTyByZWdpb24gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQSUlYNF9GVU5DM19QTVJFR01JU0MsCisJCQkgICAgICBQSUlYNF9GVU5DM19QTVJFR01JU0NfRU4pOworfQorCitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywKKwkJCW1hbHRhX3BpaXhfZnVuYzNfYmFzZV9maXh1cCk7CisKIHN0YXRpYyB2b2lkIG1hbHRhX3BpaXhfZnVuYzBfZml4dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdW5zaWduZWQgY2hhciByZWdfdmFsOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9tc2ktb2N0ZW9uLmMgYi9hcmNoL21pcHMvcGNpL21zaS1vY3Rlb24uYwppbmRleCBkMzdiZTM2Li4yYjkxYjBlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL21zaS1vY3Rlb24uYworKysgYi9hcmNoL21pcHMvcGNpL21zaS1vY3Rlb24uYwpAQCAtMTUwLDYgKzE1MCw3IEBACiAJCW1zZy5hZGRyZXNzX2xvID0KIAkJCSgoMTI4dWwgPDwgMjApICsgQ1ZNWF9QQ0lfTVNJX1JDVikgJiAweGZmZmZmZmZmOwogCQltc2cuYWRkcmVzc19oaSA9ICgoMTI4dWwgPDwgMjApICsgQ1ZNWF9QQ0lfTVNJX1JDVikgPj4gMzI7CisJCWJyZWFrOwogCWNhc2UgT0NURU9OX0RNQV9CQVJfVFlQRV9CSUc6CiAJCS8qIFdoZW4gdXNpbmcgYmlnIGJhciwgQmFyIDAgaXMgYmFzZWQgYXQgMCAqLwogCQltc2cuYWRkcmVzc19sbyA9ICgwICsgQ1ZNWF9QQ0lfTVNJX1JDVikgJiAweGZmZmZmZmZmOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtbG9vbmdzb24zLmMgYi9hcmNoL21pcHMvcGNpL29wcy1sb29uZ3NvbjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmVkNTQxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWxvb25nc29uMy5jCkBAIC0wLDAgKzEsMTAxIEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9ib25pdG82NC5oPgorCisjaW5jbHVkZSA8bG9vbmdzb24uaD4KKworI2RlZmluZSBQQ0lfQUNDRVNTX1JFQUQgIDAKKyNkZWZpbmUgUENJX0FDQ0VTU19XUklURSAxCisKKyNkZWZpbmUgSFQxTE9fUENJQ0ZHX0JBU0UgICAgICAweDFhMDAwMDAwCisjZGVmaW5lIEhUMUxPX1BDSUNGR19CQVNFX1RQMSAgMHgxYjAwMDAwMAorCitzdGF0aWMgaW50IGxvb25nc29uM19wY2lfY29uZmlnX2FjY2Vzcyh1bnNpZ25lZCBjaGFyIGFjY2Vzc190eXBlLAorCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCWludCB3aGVyZSwgdTMyICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgYnVzbnVtID0gYnVzLT5udW1iZXI7CisJdV9pbnQ2NF90IGFkZHIsIHR5cGU7CisJdm9pZCAqYWRkcnA7CisJaW50IGRldmljZSA9IFBDSV9TTE9UKGRldmZuKTsKKwlpbnQgZnVuY3Rpb24gPSBQQ0lfRlVOQyhkZXZmbik7CisJaW50IHJlZyA9IHdoZXJlICYgfjM7CisKKwlhZGRyID0gKGJ1c251bSA8PCAxNikgfCAoZGV2aWNlIDw8IDExKSB8IChmdW5jdGlvbiA8PCA4KSB8IHJlZzsKKwlpZiAoYnVzbnVtID09IDApIHsKKwkJaWYgKGRldmljZSA+IDMxKQorCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwkJYWRkcnAgPSAodm9pZCAqKShUT19VTkNBQyhIVDFMT19QQ0lDRkdfQkFTRSkgfCAoYWRkciAmIDB4ZmZmZikpOworCQl0eXBlID0gMDsKKworCX0gZWxzZSB7CisJCWFkZHJwID0gKHZvaWQgKikoVE9fVU5DQUMoSFQxTE9fUENJQ0ZHX0JBU0VfVFAxKSB8IChhZGRyKSk7CisJCXR5cGUgPSAweDEwMDAwOworCX0KKworCWlmIChhY2Nlc3NfdHlwZSA9PSBQQ0lfQUNDRVNTX1dSSVRFKQorCQl3cml0ZWwoKmRhdGEsIGFkZHJwKTsKKwllbHNlIHsKKwkJKmRhdGEgPSByZWFkbChhZGRycCk7CisJCWlmICgqZGF0YSA9PSAweGZmZmZmZmZmKSB7CisJCQkqZGF0YSA9IC0xOworCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwkJfQorCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IGxvb25nc29uM19wY2lfcGNpYmlvc19yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWwpCit7CisJdTMyIGRhdGEgPSAwOworCWludCByZXQgPSBsb29uZ3NvbjNfcGNpX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELAorCQkJYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKTsKKworCWlmIChyZXQgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHNpemUgPT0gMSkKKwkJKnZhbCA9IChkYXRhID4+ICgod2hlcmUgJiAzKSA8PCAzKSkgJiAweGZmOworCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJKnZhbCA9IChkYXRhID4+ICgod2hlcmUgJiAzKSA8PCAzKSkgJiAweGZmZmY7CisJZWxzZQorCQkqdmFsID0gZGF0YTsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgbG9vbmdzb24zX3BjaV9wY2liaW9zX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCit7CisJdTMyIGRhdGEgPSAwOworCWludCByZXQ7CisKKwlpZiAoc2l6ZSA9PSA0KQorCQlkYXRhID0gdmFsOworCWVsc2UgeworCQlyZXQgPSBsb29uZ3NvbjNfcGNpX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELAorCQkJCWJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSk7CisJCWlmIChyZXQgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoc2l6ZSA9PSAxKQorCQkJZGF0YSA9IChkYXRhICYgfigweGZmIDw8ICgod2hlcmUgJiAzKSA8PCAzKSkpIHwKKwkJCSAgICAodmFsIDw8ICgod2hlcmUgJiAzKSA8PCAzKSk7CisJCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJCWRhdGEgPSAoZGF0YSAmIH4oMHhmZmZmIDw8ICgod2hlcmUgJiAzKSA8PCAzKSkpIHwKKwkJCSAgICAodmFsIDw8ICgod2hlcmUgJiAzKSA8PCAzKSk7CisJfQorCisJcmV0ID0gbG9vbmdzb24zX3BjaV9jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsCisJCQlidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHBjaV9vcHMgbG9vbmdzb25fcGNpX29wcyA9IHsKKwkucmVhZCA9IGxvb25nc29uM19wY2lfcGNpYmlvc19yZWFkLAorCS53cml0ZSA9IGxvb25nc29uM19wY2lfcGNpYmlvc193cml0ZQorfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWFsY2hlbXkuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWFsY2hlbXkuYwppbmRleCBkMWZhZWNlLi41NjNkMWY2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1hbGNoZW15LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktYWxjaGVteS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKKyNpbmNsdWRlIDxhc20vZG1hLWNvaGVyZW5jZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vdGxibWlzYy5oPgogCkBAIC00MTEsMTcgKzQxMiwxNSBAQAogCX0KIAljdHgtPmFsY2hlbXlfcGNpX2N0cmwuaW9fbWFwX2Jhc2UgPSAodW5zaWduZWQgbG9uZyl2aXJ0X2lvOwogCi0jaWZkZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAogCS8qIEF1MTUwMCByZXZpc2lvbnMgb2xkZXIgdGhhbiBBRCBoYXZlIGJvcmtlZCBjb2hlcmVudCBQQ0kgKi8KIAlpZiAoKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSA9PSBBTENIRU1ZX0NQVV9BVTE1MDApICYmCi0JICAgIChyZWFkX2MwX3ByaWQoKSA8IDB4MDEwMzAyMDIpKSB7CisJICAgIChyZWFkX2MwX3ByaWQoKSA8IDB4MDEwMzAyMDIpICYmICFjb2hlcmVudGlvKSB7CiAJCXZhbCA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfQ09ORklHKTsKIAkJdmFsIHw9IFBDSV9DT05GSUdfTkM7CiAJCV9fcmF3X3dyaXRlbCh2YWwsIGN0eC0+cmVncyArIFBDSV9SRUdfQ09ORklHKTsKIAkJd21iKCk7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJub24tY29oZXJlbnQgUENJIG9uIEF1MTUwMCBBQS9BQi9BQ1xuIik7CiAJfQotI2VuZGlmCiAKIAlpZiAocGQtPmJvYXJkX21hcF9pcnEpCiAJCWN0eC0+Ym9hcmRfbWFwX2lycSA9IHBkLT5ib2FyZF9tYXBfaXJxOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktbWFsdGEuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLW1hbHRhLmMKaW5kZXggZjFhNzM4OS4uY2ZiYmMzZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2ktbWFsdGEuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1tYWx0YS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KLSNpbmNsdWRlIDxhc20vZ2NtcHJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1jbS5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9nZW5lcmljLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2Jvbml0bzY0Lmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21zYzAxX3BjaS5oPgpAQCAtMjAxLDExICsyMDEsMTEgQEAKIAkJbXNjX21lbV9yZXNvdXJjZS5zdGFydCA9IHN0YXJ0ICYgbWFzazsKIAkJbXNjX21lbV9yZXNvdXJjZS5lbmQgPSAoc3RhcnQgJiBtYXNrKSB8IH5tYXNrOwogCQltc2NfY29udHJvbGxlci5tZW1fb2Zmc2V0ID0gKHN0YXJ0ICYgbWFzaykgLSAobWFwICYgbWFzayk7Ci0jaWZkZWYgQ09ORklHX01JUFNfQ01QCi0JCWlmIChnY21wX25pb2N1KCkpCi0JCQlnY21wX3NldHJlZ2lvbigwLCBzdGFydCwgbWFzaywKLQkJCQlHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9JT0NVMSk7Ci0jZW5kaWYKKwkJaWYgKG1pcHNfY21fbnVtaW9jdSgpKSB7CisJCQl3cml0ZV9nY3JfcmVnMF9iYXNlKHN0YXJ0KTsKKwkJCXdyaXRlX2djcl9yZWcwX21hc2sobWFzayB8CisJCQkJCSAgICBDTV9HQ1JfUkVHbl9NQVNLX0NNVEdUX0lPQ1UwKTsKKwkJfQogCQlNU0NfUkVBRChNU0MwMV9QQ0lfU0MyUElPQkFTTCwgc3RhcnQpOwogCQlNU0NfUkVBRChNU0MwMV9QQ0lfU0MyUElPTVNLTCwgbWFzayk7CiAJCU1TQ19SRUFEKE1TQzAxX1BDSV9TQzJQSU9NQVBMLCBtYXApOwpAQCAtMjEzLDExICsyMTMsMTEgQEAKIAkJbXNjX2lvX3Jlc291cmNlLmVuZCA9IChtYXAgJiBtYXNrKSB8IH5tYXNrOwogCQltc2NfY29udHJvbGxlci5pb19vZmZzZXQgPSAwOwogCQlpb3BvcnRfcmVzb3VyY2UuZW5kID0gfm1hc2s7Ci0jaWZkZWYgQ09ORklHX01JUFNfQ01QCi0JCWlmIChnY21wX25pb2N1KCkpCi0JCQlnY21wX3NldHJlZ2lvbigxLCBzdGFydCwgbWFzaywKLQkJCQlHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9JT0NVMSk7Ci0jZW5kaWYKKwkJaWYgKG1pcHNfY21fbnVtaW9jdSgpKSB7CisJCQl3cml0ZV9nY3JfcmVnMV9iYXNlKHN0YXJ0KTsKKwkJCXdyaXRlX2djcl9yZWcxX21hc2sobWFzayB8CisJCQkJCSAgICBDTV9HQ1JfUkVHbl9NQVNLX0NNVEdUX0lPQ1UwKTsKKwkJfQogCQkvKiBJZiByYW5nZXMgb3ZlcmxhcCBJL08gdGFrZXMgcHJlY2VkZW5jZS4gICovCiAJCXN0YXJ0ID0gc3RhcnQgJiBtYXNrOwogCQllbmQgPSBzdGFydCB8IH5tYXNrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BtY3MtbXNwNzF4eC9tc3Bfc2V0dXAuYyBiL2FyY2gvbWlwcy9wbWNzLW1zcDcxeHgvbXNwX3NldHVwLmMKaW5kZXggMzk2YjI5Ni4uN2U5ODA3NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtY3MtbXNwNzF4eC9tc3Bfc2V0dXAuYworKysgYi9hcmNoL21pcHMvcG1jcy1tc3A3MXh4L21zcF9zZXR1cC5jCkBAIC00OSw3ICs0OSw3IEBACiAJLyogQ2FjaGUgdGhlIHJlc2V0IGNvZGUgb2YgdGhpcyBmdW5jdGlvbiAqLwogCV9fYXNtX18gX192b2xhdGlsZV9fICgKIAkJIgkuc2V0CXB1c2gJCQkJXG4iCi0JCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJIglsYQklMCxzdGFydHBvaW50CQkJXG4iCiAJCSIJbGEJJTEsZW5kcG9pbnQJCQlcbiIKIAkJIgkuc2V0CXBvcAkJCQlcbiIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlci9oaWJlcm5hdGUuUyBiL2FyY2gvbWlwcy9wb3dlci9oaWJlcm5hdGUuUwppbmRleCA3ZTAyNzdhLi4zMmE3YzgyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXIvaGliZXJuYXRlLlMKKysrIGIvYXJjaC9taXBzL3Bvd2VyL2hpYmVybmF0ZS5TCkBAIC00Myw2ICs0Myw3IEBACiAJYm5lIHQxLCB0MywgMWIKIAlQVFJfTCB0MCwgUEJFX05FWFQodDApCiAJYm5leiB0MCwgMGIKKwlqYWwgbG9jYWxfZmx1c2hfdGxiX2FsbCAvKiBBdm9pZCBUTEIgbWlzbWF0Y2ggYWZ0ZXIga2VybmVsIHJlc3VtZSAqLwogCVBUUl9MQSB0MCwgc2F2ZWRfcmVncwogCVBUUl9MIHJhLCBQVF9SMzEodDApCiAJUFRSX0wgc3AsIFBUX1IyOSh0MCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYWxpbmsvS2NvbmZpZyBiL2FyY2gvbWlwcy9yYWxpbmsvS2NvbmZpZwppbmRleCAxYmZkMWMxLi40YTI5NjY1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmFsaW5rL0tjb25maWcKKysrIGIvYXJjaC9taXBzL3JhbGluay9LY29uZmlnCkBAIC0yMCwxOSArMjAsMTMgQEAKIAljb25maWcgU09DX1JUMzA1WAogCQlib29sICJSVDMwNXgiCiAJCXNlbGVjdCBVU0JfQVJDSF9IQVNfSENECi0JCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAogCWNvbmZpZyBTT0NfUlQzODgzCiAJCWJvb2wgIlJUMzg4MyIKLQkJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0JCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCQlzZWxlY3QgSFdfSEFTX1BDSQogCiAJY29uZmlnIFNPQ19NVDc2MjAKIAkJYm9vbCAiTVQ3NjIwIgotCQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKLQkJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAKIGVuZGNob2ljZQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1pbnQuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCmluZGV4IDNkYjY0ZDUuLjU4YjQwYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlpbnQgaXJxID0gU0dJX0JVU0VSUl9JUlE7CiAKIAlpcnFfZW50ZXIoKTsKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCWlwMjJfYmVfaW50ZXJydXB0KGlycSk7CiAJaXJxX2V4aXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYwppbmRleCA2MDcxOTI0Li4wNDVhYTg5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAljaGFyIGM7CiAKIAlpcnFfZW50ZXIoKTsKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCXByaW50ayhLRVJOX0FMRVJUICJPb3BzLCBnb3QgODI1NCBpbnRlcnJ1cHQuXG4iKTsKIAlBcmNSZWFkKDAsICZjLCAxLCAmY250KTsKIAlBcmNFbnRlckludGVyYWN0aXZlTW9kZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCmluZGV4IDA5ZDZlMTYuLjU5Y2ZlMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAl1NjQgY3VyX2ludHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWkgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOworCWkgPSBjcHVtYXNrX2ZpcnN0X2FuZChtYXNrLCBjcHVfb25saW5lX21hc2spOwogCiAJLyogQ29udmVydCBsb2dpY2FsIENQVSB0byBwaHlzaWNhbCBDUFUgKi8KIAljcHUgPSBjcHVfbG9naWNhbF9tYXAoaSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMKaW5kZXggNTRlMmM0ZC4uNzBkOTE4MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJaW50IGlycSA9IEtfQkNNMTQ4MF9JTlRfTUJPWF8wXzA7CiAJdW5zaWduZWQgaW50IGFjdGlvbjsKIAotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJLyogTG9hZCB0aGUgbWFpbGJveCByZWdpc3RlciB0byBmaWd1cmUgb3V0IHdoYXQgd2UncmUgc3VwcG9zZWQgdG8gZG8gKi8KIAlhY3Rpb24gPSAoX19yYXdfcmVhZHEobWFpbGJveF8wX3JlZ3NbY3B1XSkgPj4gNDgpICYgMHhmZmZmOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9pcnEuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCmluZGV4IGZjYTBjZGIuLjZkOGRiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCkBAIC04OCw3ICs4OCw3IEBACiAJdTY0IGN1cl9pbnRzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpID0gY3B1bWFza19maXJzdChtYXNrKTsKKwlpID0gY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKTsKIAogCS8qIENvbnZlcnQgbG9naWNhbCBDUFUgdG8gcGh5c2ljYWwgQ1BVICovCiAJY3B1ID0gY3B1X2xvZ2ljYWxfbWFwKGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc21wLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYwppbmRleCBkN2I5NDJkLi5kYjk3NjExIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJaW50IGlycSA9IEtfSU5UX01CT1hfMDsKIAl1bnNpZ25lZCBpbnQgYWN0aW9uOwogCi0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAkvKiBMb2FkIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSdyZSBzdXBwb3NlZCB0byBkbyAqLwogCWFjdGlvbiA9IChfX19fcmF3X3JlYWRxKG1haWxib3hfcmVnc1tjcHVdKSA+PiA0OCkgJiAweGZmZmY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDk5MmU5ODkuLjY1NGQ1YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw3ICsxLDkgQEAKIAogZ2VuZXJpYy15ICs9IGJhcnJpZXIuaAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjhhZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2NldnQtbW4xMDMwMC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9jZXZ0LW1uMTAzMDAuYwppbmRleCBjY2NlMzVlLi42MGY2NGNhIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL2NldnQtbW4xMDMwMC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvY2V2dC1tbjEwMzAwLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCWNkLT5zZXRfbmV4dF9ldmVudAk9IG5leHRfZXZlbnQ7CiAKIAlpYWN0ID0gJnBlcl9jcHUodGltZXJfaXJxLCBjcHUpOwotCWlhY3QtPmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9USU1FUjsKKwlpYWN0LT5mbGFncyA9IElSUUZfU0hBUkVEIHwgSVJRRl9USU1FUjsKIAlpYWN0LT5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0OwogCiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGNkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYwppbmRleCBiZjZlOTQ5Li43ZWNmNjk4IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC5jCkBAIC05ODUsMTcgKzk4NSwxNyBAQAogCWlycV9zZXRfY2hpcChwb3J0LT50bV9pcnEsICZtbjEwMzAwX3NlcmlhbF9waWMpOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBvcnQtPnJ4X2lycSwgbW4xMDMwMF9zZXJpYWxfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX05PQkFMQU5DSU5HLAogCQkJcG9ydC0+cnhfbmFtZSwgcG9ydCkgPCAwKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBvcnQtPnR4X2lycSwgbW4xMDMwMF9zZXJpYWxfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX05PQkFMQU5DSU5HLAogCQkJcG9ydC0+dHhfbmFtZSwgcG9ydCkgPCAwKQogCQlnb3RvIGVycm9yMjsKIAogCWlmIChyZXF1ZXN0X2lycShwb3J0LT50bV9pcnEsIG1uMTAzMDBfc2VyaWFsX2ludGVycnVwdCwKLQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCQkJSVJRRl9OT0JBTEFOQ0lORywKIAkJCXBvcnQtPnRtX25hbWUsIHBvcnQpIDwgMCkKIAkJZ290byBlcnJvcjM7CiAJbW4xMDMwMF9zZXJpYWxfbWFza19hY2socG9ydC0+dG1faXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC13YXRjaGRvZy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMKaW5kZXggZGI2NGE3MS4uYTJkOGU2OSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCU5NSUNSID0gTk1JQ1JfV0RJRjsKIAogCW5taV9jb3VudChzbXBfcHJvY2Vzc29yX2lkKCkpKys7Ci0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc21wLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL3NtcC5jCmluZGV4IGExN2Y5YzkuLmY5ODQxOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zbXAuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc21wX2lwaV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGxvY2FsX3RpbWVyX2lwaSA9IHsKIAkuaGFuZGxlcgk9IHNtcF9pcGlfdGltZXJfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkuZmxhZ3MJCT0gSVJRRl9OT0JBTEFOQ0lORywKIAkubmFtZQkJPSAic21wIGxvY2FsIHRpbWVyIElQSSIKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzNjQvaXJxLWZwZ2EuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzNjQvaXJxLWZwZ2EuYwppbmRleCBlMTZjMjE2Li4wNzNlMmNjIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzY0L2lycS1mcGdhLmMKKysrIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjM2NC9pcnEtZnBnYS5jCkBAIC03Niw3ICs3Niw3IEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBmcGdhX2lycVtdICA9IHsKIAlbMF0gPSB7CiAJCS5oYW5kbGVyCT0gZnBnYV9pbnRlcnJ1cHQsCi0JCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJCS5mbGFncwkJPSBJUlFGX1NIQVJFRCwKIAkJLm5hbWUJCT0gImZwZ2EiLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAyZTQwZjFjLi40ODBhZjBkIDEwMDY0NAotLS0gYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTAsOCArMTAsOCBAQAogZ2VuZXJpYy15ICs9IGNhY2hlZmx1c2guaAogZ2VuZXJpYy15ICs9IGNoZWNrc3VtLmgKIGdlbmVyaWMteSArPSBjbGtkZXYuaAotZ2VuZXJpYy15ICs9IGNtcHhjaGcuaAogZ2VuZXJpYy15ICs9IGNtcHhjaGctbG9jYWwuaAorZ2VuZXJpYy15ICs9IGNtcHhjaGcuaAogZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAogZ2VuZXJpYy15ICs9IGRldmljZS5oCkBAIC0yNSw2ICsyNSw3IEBACiBnZW5lcmljLXkgKz0gZnRyYWNlLmgKIGdlbmVyaWMteSArPSBmdXRleC5oCiBnZW5lcmljLXkgKz0gaGFyZGlycS5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaHdfaXJxLmgKIGdlbmVyaWMteSArPSBpb2N0bC5oCiBnZW5lcmljLXkgKz0gaW9jdGxzLmgKQEAgLTM0LDYgKzM1LDcgQEAKIGdlbmVyaWMteSArPSBrbWFwX3R5cGVzLmgKIGdlbmVyaWMteSArPSBrdm1fcGFyYS5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbW1hbi5oCiBnZW5lcmljLXkgKz0gbW9kdWxlLmgKIGdlbmVyaWMteSArPSBtc2didWYuaApAQCAtNDEsNiArNDMsNyBAQAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCiBnZW5lcmljLXkgKz0gc2VjdGlvbnMuaApAQCAtNTMsMTEgKzU2LDExIEBACiBnZW5lcmljLXkgKz0gc2lnbmFsLmgKIGdlbmVyaWMteSArPSBzb2NrZXQuaAogZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAotZ2VuZXJpYy15ICs9IHN0YXRmcy5oCiBnZW5lcmljLXkgKz0gc3RhdC5oCitnZW5lcmljLXkgKz0gc3RhdGZzLmgKIGdlbmVyaWMteSArPSBzdHJpbmcuaAotZ2VuZXJpYy15ICs9IHN3aXRjaF90by5oCiBnZW5lcmljLXkgKz0gc3dhYi5oCitnZW5lcmljLXkgKz0gc3dpdGNoX3RvLmgKIGdlbmVyaWMteSArPSB0ZXJtYml0cy5oCiBnZW5lcmljLXkgKz0gdGVybWlvcy5oCiBnZW5lcmljLXkgKz0gdG9wb2xvZ3kuaApAQCAtNjgsNSArNzEsMyBAQAogZ2VuZXJpYy15ICs9IHZnYS5oCiBnZW5lcmljLXkgKz0gd29yZC1hdC1hLXRpbWUuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNzUyYzk4MS4uZWNmMjVlNiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw5ICsxLDI5IEBACiAKK2dlbmVyaWMteSArPSBhdXh2ZWMuaAogZ2VuZXJpYy15ICs9IGJhcnJpZXIuaAotZ2VuZXJpYy15ICs9IHdvcmQtYXQtYS10aW1lLmggYXV4dmVjLmggdXNlci5oIGNwdXRpbWUuaCBlbWVyZ2VuY3ktcmVzdGFydC5oIFwKLQkgIHNlZ21lbnQuaCB0b3BvbG9neS5oIHZnYS5oIGRldmljZS5oIHBlcmNwdS5oIGh3X2lycS5oIG11dGV4LmggXAotCSAgZGl2NjQuaCBpcnFfcmVncy5oIGtkZWJ1Zy5oIGt2bV9wYXJhLmggbG9jYWw2NC5oIGxvY2FsLmggcGFyYW0uaCBcCi0JICBwb2xsLmggeG9yLmggY2xrZGV2LmggZXhlYy5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCitnZW5lcmljLXkgKz0gZGV2aWNlLmgKK2dlbmVyaWMteSArPSBkaXY2NC5oCitnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAorZ2VuZXJpYy15ICs9IGV4ZWMuaAogZ2VuZXJpYy15ICs9IGhhc2guaAorZ2VuZXJpYy15ICs9IGh3X2lycS5oCitnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAorZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCitnZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAorZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IG11dGV4LmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwb2xsLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKK2dlbmVyaWMteSArPSBzZWdtZW50LmgKK2dlbmVyaWMteSArPSB0b3BvbG9neS5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAorZ2VuZXJpYy15ICs9IHVzZXIuaAorZ2VuZXJpYy15ICs9IHZnYS5oCitnZW5lcmljLXkgKz0gd29yZC1hdC1hLXRpbWUuaAorZ2VuZXJpYy15ICs9IHhvci5oCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggNjM3ZmUwMy4uNjBkNWQxNyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMzIsMTcgKzMyLDYgQEAKIHZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdnRvLCB2b2lkICp2ZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkciwKIAkJCXN0cnVjdCBwYWdlICpwZyk7CiAKLS8qICNkZWZpbmUgQ09ORklHX1BBUklTQ19UTVBBTElBUyAqLwotCi0jaWZkZWYgQ09ORklHX1BBUklTQ19UTVBBTElBUwotdm9pZCBjbGVhcl91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyKTsKLSNkZWZpbmUgY2xlYXJfdXNlcl9oaWdocGFnZSBjbGVhcl91c2VyX2hpZ2hwYWdlCi1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7Ci12b2lkIGNvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAotCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLSNkZWZpbmUgX19IQVZFX0FSQ0hfQ09QWV9VU0VSX0hJR0hQQUdFCi0jZW5kaWYKLQogLyoKICAqIFRoZXNlIGFyZSB1c2VkIHRvIG1ha2UgdXNlIG9mIEMgdHlwZS1jaGVja2luZy4uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmluZGV4IDM1MTZlMGIuLjY0ZjI5OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMTkxLDggKzE5MSw0IEBACiAjZGVmaW5lIGFyY2hfcmVhZF9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBhcmNoX3JlYWRfbG9jayhsb2NrKQogI2RlZmluZSBhcmNoX3dyaXRlX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfd3JpdGVfbG9jayhsb2NrKQogCi0jZGVmaW5lIGFyY2hfc3Bpbl9yZWxheChsb2NrKQljcHVfcmVsYXgoKQotI2RlZmluZSBhcmNoX3JlYWRfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKLSNkZWZpbmUgYXJjaF93cml0ZV9yZWxheChsb2NrKQljcHVfcmVsYXgoKQotCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKaW5kZXggNDI3MDY3OS4uMjY1YWU1MSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oCkBAIC04MjgsMTMgKzgyOCwxMyBAQAogI2RlZmluZSBfX05SX2Zpbml0X21vZHVsZQkoX19OUl9MaW51eCArIDMzMykKICNkZWZpbmUgX19OUl9zY2hlZF9zZXRhdHRyCShfX05SX0xpbnV4ICsgMzM0KQogI2RlZmluZSBfX05SX3NjaGVkX2dldGF0dHIJKF9fTlJfTGludXggKyAzMzUpCisjZGVmaW5lIF9fTlJfdXRpbWVzCQkoX19OUl9MaW51eCArIDMzNikKIAotI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCShfX05SX3NjaGVkX2dldGF0dHIgKyAxKQorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCShfX05SX3V0aW1lcyArIDEpCiAKIAogI2RlZmluZSBfX0lHTk9SRV9zZWxlY3QJCS8qIG5ld3NlbGVjdCAqLwogI2RlZmluZSBfX0lHTk9SRV9mYWR2aXNlNjQJLyogZmFkdmlzZTY0XzY0ICovCi0jZGVmaW5lIF9fSUdOT1JFX3V0aW1lcwkJLyogdXRpbWUgKi8KIAogCiAjZGVmaW5lIEhQVVhfR0FURVdBWV9BRERSICAgICAgIDB4QzAwMDAwMDQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9jYWNoZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMKaW5kZXggYWM4N2E0MC4uYTZmZmM3NyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMKQEAgLTU4MSw2NyArNTgxLDMgQEAKIAkJX19mbHVzaF9jYWNoZV9wYWdlKHZtYSwgdm1hZGRyLCBQRk5fUEhZUyhwZm4pKTsKIAl9CiB9Ci0KLSNpZmRlZiBDT05GSUdfUEFSSVNDX1RNUEFMSUFTCi0KLXZvaWQgY2xlYXJfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkcikKLXsKLQl2b2lkICp2dG87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIENsZWFyIHVzaW5nIFRNUEFMSUFTIHJlZ2lvbi4gIFRoZSBwYWdlIGRvZXNuJ3QgbmVlZCB0bwotCSAgIGJlIGZsdXNoZWQgYnV0IHRoZSBrZXJuZWwgbWFwcGluZyBuZWVkcyB0byBiZSBwdXJnZWQuICAqLwotCi0JdnRvID0ga21hcF9hdG9taWMocGFnZSk7Ci0KLQkvKiBUaGUgUEEtUklTQyAyLjAgQXJjaGl0ZWN0dXJlIGJvb2sgc3RhdGVzIG9uIHBhZ2UgRi02OgotCSAgICJCZWZvcmUgYSB3cml0ZS1jYXBhYmxlIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQsICphbGwqCi0JICAgbm9uLWVxdWl2YWxlbnRseS1hbGlhc2VkIHRyYW5zbGF0aW9ucyBtdXN0IGJlIHJlbW92ZWQKLQkgICBmcm9tIHRoZSBwYWdlIHRhYmxlIGFuZCBwdXJnZWQgZnJvbSB0aGUgVExCLiAgKE5vdGUKLQkgICB0aGF0IHRoZSBjYWNoZXMgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBmbHVzaGVkIGF0IHRoaXMKLQkgICB0aW1lLikgIEJlZm9yZSBhbnkgbm9uLWVxdWl2YWxlbnQgYWxpYXNlZCB0cmFuc2xhdGlvbgotCSAgIGlzIHJlLWVuYWJsZWQsIHRoZSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgZm9yIHRoZSB3cml0ZWFibGUKLQkgICBwYWdlICh0aGUgZW50aXJlIHBhZ2UpIG11c3QgYmUgZmx1c2hlZCBmcm9tIHRoZSBjYWNoZSwKLQkgICBhbmQgdGhlIHdyaXRlLWNhcGFibGUgdHJhbnNsYXRpb24gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlCi0JICAgdGFibGUgYW5kIHB1cmdlZCBmcm9tIHRoZSBUTEIuIiAgKi8KLQotCXB1cmdlX2tlcm5lbF9kY2FjaGVfcGFnZV9hc20oKHVuc2lnbmVkIGxvbmcpdnRvKTsKLQlwdXJnZV90bGJfc3RhcnQoZmxhZ3MpOwotCXBkdGxiX2tlcm5lbCh2dG8pOwotCXB1cmdlX3RsYl9lbmQoZmxhZ3MpOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCWNsZWFyX3VzZXJfcGFnZV9hc20odnRvLCB2YWRkcik7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQotCXBhZ2VmYXVsdF9lbmFibGUoKTsJCS8qIGt1bm1hcF9hdG9taWMoYWRkciwgS01fVVNFUjApOyAqLwotfQotCi12b2lkIGNvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAotCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXZvaWQgKnZmcm9tLCAqdnRvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBDb3B5IHVzaW5nIFRNUEFMSUFTIHJlZ2lvbi4gIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UKLQkgICB0aGF0IHRoZSBgZnJvbScgcGFnZSBkb2Vzbid0IG5lZWQgdG8gYmUgZmx1c2hlZC4gIEhvd2V2ZXIsCi0JICAgdGhlIGB0bycgcGFnZSBtdXN0IGJlIGZsdXNoZWQgaW4gY29weV91c2VyX3BhZ2VfYXNtIHNpbmNlCi0JICAgaXQgY2FuIGJlIHVzZWQgdG8gYnJpbmcgaW4gZXhlY3V0YWJsZSBjb2RlLiAgKi8KLQotCXZmcm9tID0ga21hcF9hdG9taWMoZnJvbSk7Ci0JdnRvID0ga21hcF9hdG9taWModG8pOwotCi0JcHVyZ2Vfa2VybmVsX2RjYWNoZV9wYWdlX2FzbSgodW5zaWduZWQgbG9uZyl2dG8pOwotCXB1cmdlX3RsYl9zdGFydChmbGFncyk7Ci0JcGR0bGJfa2VybmVsKHZ0byk7Ci0JcGR0bGJfa2VybmVsKHZmcm9tKTsKLQlwdXJnZV90bGJfZW5kKGZsYWdzKTsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQljb3B5X3VzZXJfcGFnZV9hc20odnRvLCB2ZnJvbSwgdmFkZHIpOwotCWZsdXNoX2RjYWNoZV9wYWdlX2FzbShfX3BhKHZ0byksIHZhZGRyKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCi0JcGFnZWZhdWx0X2VuYWJsZSgpOwkJLyoga3VubWFwX2F0b21pYyhhZGRyLCBLTV9VU0VSMSk7ICovCi0JcGFnZWZhdWx0X2VuYWJsZSgpOwkJLyoga3VubWFwX2F0b21pYyhhZGRyLCBLTV9VU0VSMCk7ICovCi19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUEFSSVNDX1RNUEFMSUFTICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKaW5kZXggOGNlYWM0Ny4uY2ZlMDU2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogd2hhdGV2ZXIgbWFzayB0aGV5IHNldCwgd2UganVzdCBhbGxvdyBvbmUgQ1BVICovCi0JY3B1X2Rlc3QgPSBmaXJzdF9jcHUoKmRlc3QpOworCWNwdV9kZXN0ID0gY3B1bWFza19maXJzdF9hbmQoZGVzdCwgY3B1X29ubGluZV9tYXNrKTsKIAogCXJldHVybiBjcHVfZGVzdDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDhmYTNmYmIuLjgwZTVkZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtNDMxLDYgKzQzMSw3IEBACiAJRU5UUllfU0FNRShmaW5pdF9tb2R1bGUpCiAJRU5UUllfU0FNRShzY2hlZF9zZXRhdHRyKQogCUVOVFJZX1NBTUUoc2NoZWRfZ2V0YXR0cikJLyogMzM1ICovCisJRU5UUllfQ09NUCh1dGltZXMpCiAKIAkvKiBOb3RoaW5nIHlldCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDk1N2JmMzQuLmYzZDc4NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0xMzAsNiArMTMwLDggQEAKIAlzZWxlY3QgR0VORVJJQ19DTU9TX1VQREFURQogCXNlbGVjdCBHRU5FUklDX1RJTUVfVlNZU0NBTExfT0xECiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QgaWYgU01QCisJc2VsZWN0IEFSQ0hfSEFTX1RJQ0tfQlJPQURDQVNUIGlmIEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCiAJc2VsZWN0IEdFTkVSSUNfU1RSTkNQWV9GUk9NX1VTRVIKIAlzZWxlY3QgR0VORVJJQ19TVFJOTEVOX1VTRVIKIAlzZWxlY3QgSEFWRV9NT0RfQVJDSF9TUEVDSUZJQwpAQCAtNjE4LDYgKzYyMCwxNSBAQAogCSAgc29tZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhdCBidWlsZCB0aW1lIGJ5IGVudGVyaW5nIHRoZW0gaGVyZS4gIEluCiAJICBtb3N0IGNhc2VzIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB0aGUgcm9vdCBkZXZpY2UgaGVyZS4KIAorY29uZmlnIENNRExJTkVfRk9SQ0UKKwlib29sICJBbHdheXMgdXNlIHRoZSBkZWZhdWx0IGtlcm5lbCBjb21tYW5kIHN0cmluZyIKKwlkZXBlbmRzIG9uIENNRExJTkVfQk9PTAorCWhlbHAKKwkgIEFsd2F5cyB1c2UgdGhlIGRlZmF1bHQga2VybmVsIGNvbW1hbmQgc3RyaW5nLCBldmVuIGlmIHRoZSBib290CisJICBsb2FkZXIgcGFzc2VzIG90aGVyIGFyZ3VtZW50cyB0byB0aGUga2VybmVsLgorCSAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGNhbm5vdCBvciBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUKKwkgIGNvbW1hbmQtbGluZSBvcHRpb25zIHlvdXIgYm9vdCBsb2FkZXIgcGFzc2VzIHRvIHRoZSBrZXJuZWwuCisKIGNvbmZpZyBFWFRSQV9UQVJHRVRTCiAJc3RyaW5nICJBZGRpdGlvbmFsIGRlZmF1bHQgaW1hZ2UgdHlwZXMiCiAJaGVscApAQCAtNzM2LDEwICs3NDcsNiBAQAogCSAgY29udHJvbGxlci4gIEFsc28gY29udGFpbnMgc29tZSBjb21tb24gY29kZSB1c2VkIGJ5CiAJICBkcml2ZXJzIGZvciBzcGVjaWZpYyBsb2NhbCBidXMgcGVyaXBoZXJhbHMuCiAKLWNvbmZpZyBGU0xfSUZDCi0JYm9vbAotICAgICAgICBkZXBlbmRzIG9uIEZTTF9TT0MKLQogY29uZmlnIEZTTF9HVE0KIAlib29sCiAJZGVwZW5kcyBvbiBQUENfODN4eCB8fCBRVUlDQ19FTkdJTkUgfHwgQ1BNMgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQppbmRleCA5MGU5ZDk1Li5hMWY4YzdmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQpAQCAtNTQsNyArNTQsNyBAQAogemxpYmhlYWRlciA6PSBpbmZmYXN0LmggaW5mZml4ZWQuaCBpbmZsYXRlLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmgKIHpsaWJsaW51eGhlYWRlciA6PSB6bGliLmggemNvbmYuaCB6dXRpbC5oCiAKLSQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBjdWJvb3QtYzJrLm8gZ3VuemlwX3V0aWwubyBtYWluLm8gcHJwbWMyODAwLm8pOiBcCiskKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYikgY3Vib290LWMyay5vIGd1bnppcF91dGlsLm8gbWFpbi5vKTogXAogCSQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGlibGludXhoZWFkZXIpKSAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmhlYWRlcikpCiAKIGxpYmZkdCAgICAgICA6PSBmZHQuYyBmZHRfcm8uYyBmZHRfd2lwLmMgZmR0X3N3LmMgZmR0X3J3LmMgZmR0X3N0cmVycm9yLmMKQEAgLTk1LDcgKzk1LDcgQEAKIHNyYy1wbGF0LSQoQ09ORklHX0VNQkVEREVENnh4KSArPSBjdWJvb3QtcHEyLmMgY3Vib290LW1wYzc0NDhocGMyLmMgXAogCQkJCQljdWJvb3QtYzJrLmMgZ2FtZWN1YmUtaGVhZC5TIFwKIAkJCQkJZ2FtZWN1YmUuYyB3aWktaGVhZC5TIHdpaS5jIGhvbGx5LmMgXAotCQkJCQlwcnBtYzI4MDAuYyBmaXhlZC1oZWFkLlMgbXZtZTUxMDAuYworCQkJCQlmaXhlZC1oZWFkLlMgbXZtZTUxMDAuYwogc3JjLXBsYXQtJChDT05GSUdfQU1JR0FPTkUpICs9IGN1Ym9vdC1hbWlnYW9uZS5jCiBzcmMtcGxhdC0kKENPTkZJR19QUENfUFMzKSArPSBwczMtaGVhZC5TIHBzMy1odmNhbGwuUyBwczMuYwogc3JjLXBsYXQtJChDT05GSUdfRVBBUFJfQk9PVCkgKz0gZXBhcHIuYyBlcGFwci13cmFwcGVyLmMKQEAgLTIwNCw3ICsyMDQsNiBAQAogaW1hZ2UtJChDT05GSUdfUFBDX0VGSUtBKQkJKz0gekltYWdlLmNocnAKIGltYWdlLSQoQ09ORklHX1BQQ19QTUFDKQkJKz0gekltYWdlLnBtYWMKIGltYWdlLSQoQ09ORklHX1BQQ19IT0xMWSkJCSs9IGR0YkltYWdlLmhvbGx5Ci1pbWFnZS0kKENPTkZJR19QUENfUFJQTUMyODAwKQkJKz0gZHRiSW1hZ2UucHJwbWMyODAwCiBpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkJCSs9IHVJbWFnZQogaW1hZ2UtJChDT05GSUdfRVBBUFJfQk9PVCkJCSs9IHpJbWFnZS5lcGFwcgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDQyMHNpLXBvc3QuZHRzaQppbmRleCA1YTY2MTVkLi42MDU2NmY5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDQyMHNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcG9zdC5kdHNpCkBAIC04Niw2ICs4Niw0MiBAQAogCiAJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxiNDQyMC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMi4wIjsKKwkJcmFuZ2VzID0gPDB4MCAweGUxMDAwIDB4MTAwMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMi4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9OworCisJCXBsbDA6IHBsbDBAODAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgwMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMi4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwwLWRpdjQiOworCQl9OworCisJCXBsbDE6IHBsbDFAODIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMi4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwxIiwgInBsbDEtZGl2MiIsICJwbGwxLWRpdjQiOworCQl9OworCisJCW11eDA6IG11eDBAMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0yLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMCAyPiwKKwkJCQk8JnBsbDEgMD4sIDwmcGxsMSAxPiwgPCZwbGwxIDI+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMC1kaXY0IiwKKwkJCQkicGxsMSIsICJwbGwxLWRpdjIiLCAicGxsMS1kaXY0IjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CiAJfTsKIAogCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDQyMHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDQyMHNpLXByZS5kdHNpCmluZGV4IGM2ZTQ1MWEuLjI0MTk3MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ0MjBzaS1wcmUuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcHJlLmR0c2kKQEAgLTY0LDExICs2NCwxMyBAQAogCQljcHUwOiBQb3dlclBDLGU2NTAwQDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwIDE+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKIAkJfTsKIAkJY3B1MTogUG93ZXJQQyxlNjUwMEAyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MiAzPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ4NjBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0ODYwc2ktcG9zdC5kdHNpCmluZGV4IDk4MTM5NzUuLmNiYzM1NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ4NjBzaS1wb3N0LmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDg2MHNpLXBvc3QuZHRzaQpAQCAtMTMwLDYgKzEzMCw0MiBAQAogCiAJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxiNDg2MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMi4wIjsKKwkJcmFuZ2VzID0gPDB4MCAweGUxMDAwIDB4MTAwMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMi4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9OworCisJCXBsbDA6IHBsbDBAODAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgwMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMi4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwwLWRpdjQiOworCQl9OworCisJCXBsbDE6IHBsbDFAODIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMi4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwxIiwgInBsbDEtZGl2MiIsICJwbGwxLWRpdjQiOworCQl9OworCisJCW11eDA6IG11eDBAMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0yLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMCAyPiwKKwkJCQk8JnBsbDEgMD4sIDwmcGxsMSAxPiwgPCZwbGwxIDI+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMC1kaXY0IiwKKwkJCQkicGxsMSIsICJwbGwxLWRpdjIiLCAicGxsMS1kaXY0IjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CiAJfTsKIAogCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDg2MHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDg2MHNpLXByZS5kdHNpCmluZGV4IDliYzI2YjEuLjE0MmFjODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ4NjBzaS1wcmUuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0ODYwc2ktcHJlLmR0c2kKQEAgLTY0LDIxICs2NCwyNSBAQAogCQljcHUwOiBQb3dlclBDLGU2NTAwQDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwIDE+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKIAkJfTsKIAkJY3B1MTogUG93ZXJQQyxlNjUwMEAyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MiAzPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CiAJCX07CiAJCWNwdTI6IFBvd2VyUEMsZTY1MDBANCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDQgNT47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwogCQl9OwogCQljcHUzOiBQb3dlclBDLGU2NTAwQDYgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw2IDc+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwNDFzaS1wb3N0LmR0c2kKaW5kZXggZGM2Y2M1YS4uZTI5ODdhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcG9zdC5kdHNpCkBAIC0zMDYsOCArMzA2LDY4IEBACiAKIAljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKIAkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJc3lzY2xrOiBzeXNjbGsgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtc3lzY2xrLTEuMCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic3lzY2xrIjsKKwkJfTsKKworCQlwbGwwOiBwbGwwQDgwMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiOworCQl9OworCisJCXBsbDE6IHBsbDFAODIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDAiOworCQl9OworCisJCW11eDE6IG11eDFAMjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDEiOworCQl9OworCisJCW11eDI6IG11eDJANDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4NDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCX07CisKKwkJbXV4MzogbXV4M0A2MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg2MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MyI7CisJCX07CiAJfTsKIAogCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXByZS5kdHNpCmluZGV4IDdhMjY5N2QuLjIyZjNiMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwNDFzaS1wcmUuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcHJlLmR0c2kKQEAgLTgxLDYgKzgxLDcgQEAKIAkJY3B1MDogUG93ZXJQQyxlNTAwbWNAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDA+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OwogCQkJTDJfMDogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC04OSw2ICs5MCw3IEBACiAJCWNwdTE6IFBvd2VyUEMsZTUwMG1jQDEgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxPjsKKwkJCWNsb2NrcyA9IDwmbXV4MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKIAkJCUwyXzE6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtOTcsNiArOTksNyBAQAogCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Mj47CisJCQljbG9ja3MgPSA8Jm11eDI+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCQlMMl8yOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTEwNSw2ICsxMDgsNyBAQAogCQljcHUzOiBQb3dlclBDLGU1MDBtY0AzIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Mz47CisJCQljbG9ja3MgPSA8Jm11eDM+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CiAJCQlMMl8zOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDQxc2ktcG9zdC5kdHNpCmluZGV4IDNmYTFlMjIuLjdhZjZkNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wb3N0LmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXBvc3QuZHRzaQpAQCAtMzMzLDggKzMzMyw2OSBAQAogCiAJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKKwkJcmFuZ2VzID0gPDB4MCAweGUxMDAwIDB4MTAwMD47CiAJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXN5c2Nsazogc3lzY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXN5c2Nsay0xLjAiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInN5c2NsayI7CisJCX07CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIjsKKwkJfTsKKworCQlwbGwxOiBwbGwxQDgyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMSIsICJwbGwxLWRpdjIiOworCQl9OworCisJCW11eDA6IG11eDBAMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgwIjsKKwkJfTsKKworCQltdXgxOiBtdXgxQDIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgxIjsKKwkJfTsKKworCQltdXgyOiBtdXgyQDQwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDQwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgyIjsKKwkJfTsKKworCQltdXgzOiBtdXgzQDYwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDYwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgzIjsKKwkJfTsKIAl9OwogCiAJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDQxc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDQxc2ktcHJlLmR0c2kKaW5kZXggYzljYTJjMy4uNDY4ZThiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wcmUuZHRzaQpAQCAtODIsNiArODIsNyBAQAogCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CiAJCQlMMl8wOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTkwLDYgKzkxLDcgQEAKIAkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE+OworCQkJY2xvY2tzID0gPCZtdXgxPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwogCQkJTDJfMTogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC05OCw2ICsxMDAsNyBAQAogCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Mj47CisJCQljbG9ja3MgPSA8Jm11eDI+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCQlMMl8yOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTEwNiw2ICsxMDksNyBAQAogCQljcHUzOiBQb3dlclBDLGU1MDBtY0AzIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Mz47CisJCQljbG9ja3MgPSA8Jm11eDM+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CiAJCQlMMl8zOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A0MDgwc2ktcG9zdC5kdHNpCmluZGV4IDM0NzY5YTcuLjI0MTVlMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wb3N0LmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXBvc3QuZHRzaQpAQCAtMzUzLDggKzM1MywxMjEgQEAKIAogCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJhbmdlcyA9IDwweDAgMHhlMTAwMCAweDEwMDA+OwogCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMS4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9OworCisJCXBsbDA6IHBsbDBAODAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgwMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJfTsKKworCQlwbGwyOiBwbGwyQDg0MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4NDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMiIsICJwbGwyLWRpdjIiOworCQl9OworCisJCXBsbDM6IHBsbDNAODYwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDg2MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwzIiwgInBsbDMtZGl2MiI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDAiOworCQl9OworCisJCW11eDE6IG11eDFAMjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDEiOworCQl9OworCisJCW11eDI6IG11eDJANDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4NDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDIiOworCQl9OworCisJCW11eDM6IG11eDNANjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4NjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDMiOworCQl9OworCisJCW11eDQ6IG11eDRAODAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4ODAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDIgMD4sIDwmcGxsMiAxPiwgPCZwbGwzIDA+LCA8JnBsbDMgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwyIiwgInBsbDItZGl2MiIsICJwbGwzIiwgInBsbDMtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDQiOworCQl9OworCisJCW11eDU6IG11eDVAYTAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4YTAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDIgMD4sIDwmcGxsMiAxPiwgPCZwbGwzIDA+LCA8JnBsbDMgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwyIiwgInBsbDItZGl2MiIsICJwbGwzIiwgInBsbDMtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDUiOworCQl9OworCisJCW11eDY6IG11eDZAYzAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4YzAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDIgMD4sIDwmcGxsMiAxPiwgPCZwbGwzIDA+LCA8JnBsbDMgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwyIiwgInBsbDItZGl2MiIsICJwbGwzIiwgInBsbDMtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDYiOworCQl9OworCisJCW11eDc6IG11eDdAZTAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4ZTAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDIgMD4sIDwmcGxsMiAxPiwgPCZwbGwzIDA+LCA8JnBsbDMgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwyIiwgInBsbDItZGl2MiIsICJwbGwzIiwgInBsbDMtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDciOworCQl9OwogCX07CiAKIAlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wcmUuZHRzaQppbmRleCA0OTNkOWEwLi4wMDQwYjVhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wcmUuZHRzaQpAQCAtODEsNiArODEsNyBAQAogCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CiAJCQlMMl8wOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTg5LDYgKzkwLDcgQEAKIAkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE+OworCQkJY2xvY2tzID0gPCZtdXgxPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwogCQkJTDJfMTogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC05Nyw2ICs5OSw3IEBACiAJCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJCUwyXzI6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTA1LDYgKzEwOCw3IEBACiAJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwzPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mz47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJCUwyXzM6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTEzLDYgKzExNyw3IEBACiAJCWNwdTQ6IFBvd2VyUEMsZTUwMG1jQDQgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw0PjsKKwkJCWNsb2NrcyA9IDwmbXV4ND47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl80PjsKIAkJCUwyXzQ6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTIxLDYgKzEyNiw3IEBACiAJCWNwdTU6IFBvd2VyUEMsZTUwMG1jQDUgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw1PjsKKwkJCWNsb2NrcyA9IDwmbXV4NT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl81PjsKIAkJCUwyXzU6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTI5LDYgKzEzNSw3IEBACiAJCWNwdTY6IFBvd2VyUEMsZTUwMG1jQDYgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw2PjsKKwkJCWNsb2NrcyA9IDwmbXV4Nj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl82PjsKIAkJCUwyXzY6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTM3LDYgKzE0NCw3IEBACiAJCWNwdTc6IFBvd2VyUEMsZTUwMG1jQDcgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw3PjsKKwkJCWNsb2NrcyA9IDwmbXV4Nz47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl83PjsKIAkJCUwyXzc6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wb3N0LmR0c2kKaW5kZXggYmMzYWU1YS4uMjk4NWRlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcG9zdC5kdHNpCkBAIC0zMzgsOCArMzM4LDUxIEBACiAKIAljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKIAkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJc3lzY2xrOiBzeXNjbGsgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtc3lzY2xrLTEuMCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic3lzY2xrIjsKKwkJfTsKKworCQlwbGwwOiBwbGwwQDgwMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiOworCQl9OworCisJCXBsbDE6IHBsbDFAODIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDAiOworCQl9OworCisJCW11eDE6IG11eDFAMjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDEiOworCQl9OwogCX07CiAKIAlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wcmUuZHRzaQppbmRleCA4ZGY0N2ZjLi5mZTFhMmU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcHJlLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXByZS5kdHNpCkBAIC04OCw2ICs4OCw3IEBACiAJCWNwdTA6IFBvd2VyUEMsZTU1MDBAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDA+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OwogCQkJTDJfMDogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC05Niw2ICs5Nyw3IEBACiAJCWNwdTE6IFBvd2VyUEMsZTU1MDBAMSB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE+OworCQkJY2xvY2tzID0gPCZtdXgxPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwogCQkJTDJfMTogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDQwc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTA0MHNpLXBvc3QuZHRzaQppbmRleCBhOTE4OTdmLi41NDZhODk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDQwc2ktcG9zdC5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwNDBzaS1wb3N0LmR0c2kKQEAgLTI5OCw4ICsyOTgsNjkgQEAKIAogCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wscDUwNDAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJhbmdlcyA9IDwweDAgMHhlMTAwMCAweDEwMDA+OwogCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMS4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9OworCisJCXBsbDA6IHBsbDBAODAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgwMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJfTsKKworCQltdXgwOiBtdXgwQDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CisKKwkJbXV4MTogbXV4MUAyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MSI7CisJCX07CisKKwkJbXV4MjogbXV4MkA0MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg0MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MiI7CisJCX07CisKKwkJbXV4MzogbXV4M0A2MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg2MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MyI7CisJCX07CiAJfTsKIAogCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTA0MHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTA0MHNpLXByZS5kdHNpCmluZGV4IDQwY2E5NDMuLjM2NzQ2ODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwNDBzaS1wcmUuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDQwc2ktcHJlLmR0c2kKQEAgLTgxLDYgKzgxLDcgQEAKIAkJY3B1MDogUG93ZXJQQyxlNTUwMEAwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CiAJCQlMMl8wOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTg5LDYgKzkwLDcgQEAKIAkJY3B1MTogUG93ZXJQQyxlNTUwMEAxIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCQlMMl8xOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTk3LDYgKzk5LDcgQEAKIAkJY3B1MjogUG93ZXJQQyxlNTUwMEAyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Mj47CisJCQljbG9ja3MgPSA8Jm11eDI+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCQlMMl8yOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTEwNSw2ICsxMDgsNyBAQAogCQljcHUzOiBQb3dlclBDLGU1NTAwQDMgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwzPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mz47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJCUwyXzM6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC90NDI0MHNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvdDQyNDBzaS1wb3N0LmR0c2kKaW5kZXggNDE0M2E5Ny4uZjk5ZDc0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC90NDI0MHNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3Q0MjQwc2ktcG9zdC5kdHNpCkBAIC0zNjksNyArMzY5LDkzIEBACiAKIAljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLHQ0MjQwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0yLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKIAkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXN5c2Nsazogc3lzY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXN5c2Nsay0yLjAiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInN5c2NsayI7CisJCX07CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDAtZGl2NCI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIiwgInBsbDEtZGl2NCI7CisJCX07CisKKwkJcGxsMjogcGxsMkA4NDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODQwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDItZGl2NCI7CisJCX07CisKKwkJcGxsMzogcGxsM0A4NjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODYwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDMiLCAicGxsMy1kaXYyIiwgInBsbDMtZGl2NCI7CisJCX07CisKKwkJcGxsNDogcGxsNEA4ODAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODgwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDQiLCAicGxsNC1kaXYyIiwgInBsbDQtZGl2NCI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTIuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwwIDI+LAorCQkJCTwmcGxsMSAwPiwgPCZwbGwxIDE+LCA8JnBsbDEgMj4sCisJCQkJPCZwbGwyIDA+LCA8JnBsbDIgMT4sIDwmcGxsMiAyPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDAtZGl2NCIsCisJCQkJInBsbDEiLCAicGxsMS1kaXYyIiwgInBsbDEtZGl2NCIsCisJCQkJInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDItZGl2NCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDAiOworCQl9OworCisJCW11eDE6IG11eDFAMjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTIuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwwIDI+LAorCQkJCTwmcGxsMSAwPiwgPCZwbGwxIDE+LCA8JnBsbDEgMj4sCisJCQkJPCZwbGwyIDA+LCA8JnBsbDIgMT4sIDwmcGxsMiAyPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDAtZGl2NCIsCisJCQkJInBsbDEiLCAicGxsMS1kaXYyIiwgInBsbDEtZGl2NCIsCisJCQkJInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDItZGl2NCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDEiOworCQl9OworCisJCW11eDI6IG11eDJANDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4NDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTIuMCI7CisJCQljbG9ja3MgPSA8JnBsbDMgMD4sIDwmcGxsMyAxPiwgPCZwbGwzIDI+LAorCQkJCTwmcGxsNCAwPiwgPCZwbGw0IDE+LCA8JnBsbDQgMj47CisJCQljbG9jay1uYW1lcyA9ICJwbGwzIiwgInBsbDMtZGl2MiIsICJwbGwzLWRpdjQiLAorCQkJCSJwbGw0IiwgInBsbDQtZGl2MiIsICJwbGw0LWRpdjQiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgyIjsKKwkJfTsKIAl9OwogCiAJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3Q0MjQwc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3Q0MjQwc2ktcHJlLmR0c2kKaW5kZXggYTkzYzU1YS4uMGI4Y2NjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC90NDI0MHNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvdDQyNDBzaS1wcmUuZHRzaQpAQCAtNjcsNjEgKzY3LDczIEBACiAJCWNwdTA6IFBvd2VyUEMsZTY1MDBAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDAgMT47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCX07CiAJCWNwdTE6IFBvd2VyUEMsZTY1MDBAMiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDIgMz47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCX07CiAJCWNwdTI6IFBvd2VyUEMsZTY1MDBANCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDQgNT47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCX07CiAJCWNwdTM6IFBvd2VyUEMsZTY1MDBANiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDYgNz47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCX07CiAJCWNwdTQ6IFBvd2VyUEMsZTY1MDBAOCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDggOT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCX07CiAJCWNwdTU6IFBvd2VyUEMsZTY1MDBAMTAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxMCAxMT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCX07CiAJCWNwdTY6IFBvd2VyUEMsZTY1MDBAMTIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxMiAxMz47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCX07CiAJCWNwdTc6IFBvd2VyUEMsZTY1MDBAMTQgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxNCAxNT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CiAJCX07CiAJCWNwdTg6IFBvd2VyUEMsZTY1MDBAMTYgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxNiAxNz47CisJCQljbG9ja3MgPSA8Jm11eDI+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CiAJCX07CiAJCWNwdTk6IFBvd2VyUEMsZTY1MDBAMTggewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxOCAxOT47CisJCQljbG9ja3MgPSA8Jm11eDI+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CiAJCX07CiAJCWNwdTEwOiBQb3dlclBDLGU2NTAwQDIwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MjAgMjE+OworCQkJY2xvY2tzID0gPCZtdXgyPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OwogCQl9OwogCQljcHUxMTogUG93ZXJQQyxlNjUwMEAyMiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDIyIDIzPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3Q0MjQwcWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90NDI0MHFkcy5kdHMKaW5kZXggNjNlODFiMC4uOTc2ODNmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3Q0MjQwcWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdDQyNDBxZHMuZHRzCkBAIC0xNTksNiArMTU5LDQ4IEBACiAJCQkJCQlpbnRlcnJ1cHRzID0gPDB4MSAweDEgMCAwPjsKIAkJCQkJfTsKIAkJCQl9OworCisJCQkJaTJjQDIgeworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCXJlZyA9IDwweDI+OworCisJCQkJCWluYTIyMEA0MCB7CisJCQkJCQljb21wYXRpYmxlID0gInRpLGluYTIyMCI7CisJCQkJCQlyZWcgPSA8MHg0MD47CisJCQkJCQlzaHVudC1yZXNpc3RvciA9IDwxMDAwPjsKKwkJCQkJfTsKKworCQkJCQlpbmEyMjBANDEgeworCQkJCQkJY29tcGF0aWJsZSA9ICJ0aSxpbmEyMjAiOworCQkJCQkJcmVnID0gPDB4NDE+OworCQkJCQkJc2h1bnQtcmVzaXN0b3IgPSA8MTAwMD47CisJCQkJCX07CisKKwkJCQkJaW5hMjIwQDQ0IHsKKwkJCQkJCWNvbXBhdGlibGUgPSAidGksaW5hMjIwIjsKKwkJCQkJCXJlZyA9IDwweDQ0PjsKKwkJCQkJCXNodW50LXJlc2lzdG9yID0gPDEwMDA+OworCQkJCQl9OworCisJCQkJCWluYTIyMEA0NSB7CisJCQkJCQljb21wYXRpYmxlID0gInRpLGluYTIyMCI7CisJCQkJCQlyZWcgPSA8MHg0NT47CisJCQkJCQlzaHVudC1yZXNpc3RvciA9IDwxMDAwPjsKKwkJCQkJfTsKKworCQkJCQlpbmEyMjBANDYgeworCQkJCQkJY29tcGF0aWJsZSA9ICJ0aSxpbmEyMjAiOworCQkJCQkJcmVnID0gPDB4NDY+OworCQkJCQkJc2h1bnQtcmVzaXN0b3IgPSA8MTAwMD47CisJCQkJCX07CisKKwkJCQkJaW5hMjIwQDQ3IHsKKwkJCQkJCWNvbXBhdGlibGUgPSAidGksaW5hMjIwIjsKKwkJCQkJCXJlZyA9IDwweDQ3PjsKKwkJCQkJCXNodW50LXJlc2lzdG9yID0gPDEwMDA+OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvYWNhZGlhX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9hY2FkaWFfZGVmY29uZmlnCmluZGV4IGVkM2JhYjcuLjY5ZTA2ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9hY2FkaWFfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9hY2FkaWFfZGVmY29uZmlnCkBAIC0zMCw3ICszMCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2VwNDA1X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9lcDQwNV9kZWZjb25maWcKaW5kZXggMTc1ODJhMy4uY2YwNmQ0MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2VwNDA1X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvZXA0MDVfZGVmY29uZmlnCkBAIC0yOSw3ICsyOSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnCmluZGV4IGYyZDRiZTkuLjVmZjMzOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9raWxhdWVhX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgva2lsYXVlYV9kZWZjb25maWcKQEAgLTMyLDcgKzMyLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvbWFrYWx1X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9tYWthbHVfZGVmY29uZmlnCmluZGV4IDQyYjk3OTMuLjg0NTA1ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9tYWthbHVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9tYWthbHVfZGVmY29uZmlnCkBAIC0yOSw3ICsyOSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L3dhbG51dF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvd2FsbnV0X2RlZmNvbmZpZwppbmRleCBhYTFhNGNhLi4wYTE5ZjQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvd2FsbnV0X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvd2FsbnV0X2RlZmNvbmZpZwpAQCAtMjcsNyArMjcsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9hcmNoZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2FyY2hlc19kZWZjb25maWcKaW5kZXggMzI5ZjlhMy4uNDQzNTVjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2FyY2hlc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2FyY2hlc19kZWZjb25maWcKQEAgLTMxLDcgKzMxLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvYmx1ZXN0b25lX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9ibHVlc3RvbmVfZGVmY29uZmlnCmluZGV4IDIwYzhkMjYuLmNhN2YxZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9ibHVlc3RvbmVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9ibHVlc3RvbmVfZGVmY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2NhbnlvbmxhbmRzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9jYW55b25sYW5kc19kZWZjb25maWcKaW5kZXggZDViZTkzZS4uN2I4YWJkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2NhbnlvbmxhbmRzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnCkBAIC0zMSw3ICszMSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2Vib255X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9lYm9ueV9kZWZjb25maWcKaW5kZXggZjkyNjlmYy4uMzFiNThiMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2Vib255X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvZWJvbnlfZGVmY29uZmlnCkBAIC0yOCw3ICsyOCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9laWdlcl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvZWlnZXJfZGVmY29uZmlnCmluZGV4IDliZTA4OTAuLmZhY2NhZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9laWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2VpZ2VyX2RlZmNvbmZpZwpAQCAtMzQsNyArMzQsNiBAQAogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2ljb25fZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2ljb25fZGVmY29uZmlnCmluZGV4IDgyZjczMDMuLjA1NzgyYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pY29uX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaWNvbl9kZWZjb25maWcKQEAgLTMzLDcgKzMzLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaXNzNDc2LXNtcF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaXNzNDc2LXNtcF9kZWZjb25maWcKaW5kZXggY2EwMGNmNy4uNDlhMTUxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2lzczQ3Ni1zbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pc3M0NzYtc21wX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgva2F0bWFpX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9rYXRtYWlfZGVmY29uZmlnCmluZGV4IDEwOTU2MmMuLmYxMTM3OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9rYXRtYWlfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9rYXRtYWlfZGVmY29uZmlnCkBAIC0yOSw3ICsyOSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3JhaW5pZXJfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3JhaW5pZXJfZGVmY29uZmlnCmluZGV4IDIxYzMzZmEuLjRiOTFhNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9yYWluaWVyX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvcmFpbmllcl9kZWZjb25maWcKQEAgLTMwLDcgKzMwLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvcmVkd29vZF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvcmVkd29vZF9kZWZjb25maWcKaW5kZXggNDg4MDI4MS4uYjcxMTNlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3JlZHdvb2RfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9yZWR3b29kX2RlZmNvbmZpZwpAQCAtMzQsNyArMzQsNiBAQAogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3NlcXVvaWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3NlcXVvaWFfZGVmY29uZmlnCmluZGV4IGI3YTY1M2IuLjk2NDJkOTliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvc2VxdW9pYV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3NlcXVvaWFfZGVmY29uZmlnCkBAIC0zMSw3ICszMSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3RhaXNoYW5fZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3RhaXNoYW5fZGVmY29uZmlnCmluZGV4IDMwZGU5N2YuLjA5ZTMwNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC90YWlzaGFuX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvdGFpc2hhbl9kZWZjb25maWcKQEAgLTI5LDcgKzI5LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9DRkk9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3dhcnBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3dhcnBfZGVmY29uZmlnCmluZGV4IDEwNWJjNTYuLjU1MWU1MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC93YXJwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvd2FycF9kZWZjb25maWcKQEAgLTM0LDcgKzM0LDYgQEAKICMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAogIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L2NtNTIwMF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L2NtNTIwMF9kZWZjb25maWcKaW5kZXggMGI4OGM3Yi4uNGY4NGEwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9jbTUyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvY201MjAwX2RlZmNvbmZpZwpAQCAtMzAsNyArMzAsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9tb3Rpb25wcm9fZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9tb3Rpb25wcm9fZGVmY29uZmlnCmluZGV4IDBkMTNhZDcuLmMwNTMxMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvbW90aW9ucHJvX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L21vdGlvbnByb19kZWZjb25maWcKQEAgLTMxLDcgKzMxLDYgQEAKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnCmluZGV4IDQzMGFhMTguLjI0MDFlMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcKQEAgLTQ0LDcgKzQ0LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnCmluZGV4IDdhZjRjNWIuLjIxYzg0MWUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcKQEAgLTM1LDcgKzM1LDYgQEAKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9hc3A4MzQ3X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvYXNwODM0N19kZWZjb25maWcKaW5kZXggZDI3NjJkOS4uOTg1Zjk1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9hc3A4MzQ3X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L2FzcDgzNDdfZGVmY29uZmlnCkBAIC0zMiw3ICszMiw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CiBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQogQ09ORklHX01URF9PRl9QQVJUUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTNfcmRiX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxM19yZGJfZGVmY29uZmlnCmluZGV4IGU0YWQyZTIuLjBiNzNiN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxM19yZGJfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxM19yZGJfZGVmY29uZmlnCkBAIC0zMCw3ICszMCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzE1X3JkYl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTVfcmRiX2RlZmNvbmZpZwppbmRleCAzNGZmNTY4Li45N2FjM2I5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTVfcmRiX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTVfcmRiX2RlZmNvbmZpZwpAQCAtMzAsNyArMzAsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0NGST15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNnhfbWRzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnCmluZGV4IDEwYjVjNGMuLjA1NzEwYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnCkBAIC0zMSw3ICszMSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNnhfcmRrX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnCmluZGV4IDQ1OTI1ZDcuLjA1NDBkNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnCkBAIC0yOSw3ICsyOSw2IEBACiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9zYmM4MzR4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvc2JjODM0eF9kZWZjb25maWcKaW5kZXggNmQ2NDYzZi4uYTNiY2RhNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9zYmM4MzR4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L3NiYzgzNHhfZGVmY29uZmlnCkBAIC0zMSw3ICszMSw2IEBACiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgva3NpODU2MF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L2tzaTg1NjBfZGVmY29uZmlnCmluZGV4IDhmN2MxMDYuLmFlZTBkMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgva3NpODU2MF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9rc2k4NTYwX2RlZmNvbmZpZwpAQCAtMjgsNyArMjgsNiBAQAogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcHBhODU0OF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3BwYTg1NDhfZGVmY29uZmlnCmluZGV4IGExMTMzN2QuLmU4MGJiOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcHBhODU0OF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9wcGE4NTQ4X2RlZmNvbmZpZwpAQCAtNDQsNyArNDQsNiBAQAogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9QSFlTTUFQX09GPXkKIAogQ09ORklHX0kyQz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3NvY3JhdGVzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvc29jcmF0ZXNfZGVmY29uZmlnCmluZGV4IDc3NTA2YjUuLmU1MTQ3NDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvc29jcmF0ZXNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvc29jcmF0ZXNfZGVmY29uZmlnCkBAIC0zMiw3ICszMiw2IEBACiBDT05GSUdfQ0FOX0JDTT15CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0MF9kZWZjb25maWcKaW5kZXggZGRjYjlmMy4uNWE4MDBlNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDBfZGVmY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQxX2RlZmNvbmZpZwppbmRleCA5ODFhYmQ2Li4yZDkzNjY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDFfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0MV9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0OF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDhfZGVmY29uZmlnCmluZGV4IDM3YjNkNzIuLmNlOGE2N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0OF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQ4X2RlZmNvbmZpZwpAQCAtMzQsNyArMzQsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMS0RFVlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTU1X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU1NV9kZWZjb25maWcKaW5kZXggMzU5M2IzMi4uYTRlMTI5NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTU1X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NTVfZGVmY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NjBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTYwX2RlZmNvbmZpZwppbmRleCBkZTQxM2FjLi4zNDFhYmUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NjBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU2MF9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgveGVzX21wYzg1eHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC94ZXNfbXBjODV4eF9kZWZjb25maWcKaW5kZXggMWNkNmZjYi4uMDdiYjgxZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC94ZXNfbXBjODV4eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC94ZXNfbXBjODV4eF9kZWZjb25maWcKQEAgLTY1LDcgKzY1LDYgQEAKIENPTkZJR19JUFY2PXkKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfcHBjOWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfcHBjOWFfZGVmY29uZmlnCmluZGV4IGYyZjY3MzQuLmU1YTY0ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3BwYzlhX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9wcGM5YV9kZWZjb25maWcKQEAgLTcwLDcgKzcwLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzMxMF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmMzMTBfZGVmY29uZmlnCmluZGV4IGJlNzMyMTkuLjgzMTdiNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzMxMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjMzEwX2RlZmNvbmZpZwpAQCAtNzAsNyArNzAsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKaW5kZXggYjNlMmIxMC4uMTI0ZDY2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmM2MTBfZGVmY29uZmlnCkBAIC0xMjMsNyArMTIzLDYgQEAKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODYxMF9ocGNkX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODYxMF9ocGNkX2RlZmNvbmZpZwppbmRleCBjMDk1OThiLi5iY2JlNzQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L21wYzg2MTBfaHBjZF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9tcGM4NjEwX2hwY2RfZGVmY29uZmlnCkBAIC00MSw3ICs0MSw2IEBACiBDT05GSUdfSVBWNj15CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvc2JjODY0MWRfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9zYmM4NjQxZF9kZWZjb25maWcKaW5kZXggMWE2MmJhZi4uMWUxNTE1OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9zYmM4NjQxZF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9zYmM4NjQxZF9kZWZjb25maWcKQEAgLTEyMCw3ICsxMjAsNiBAQAogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2Mya19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jMmtfZGVmY29uZmlnCmluZGV4IDY3MWE4ZjkuLmM2OWY2MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2Mya19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvYzJrX2RlZmNvbmZpZwpAQCAtMTQ5LDcgKzE0OSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD1tCi1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9bQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0NjRfc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCmluZGV4IDYzNTA4ZGQuLjVjN2ZhMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiBDT05GSUdfQklORk1UX01JU0M9bQogQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKIENPTkZJR19NQVRIX0VNVUxBVElPTl9IV19VTklNUExFTUVOVEVEPXkKLUNPTkZJR19GU0xfSUZDPXkKIENPTkZJR19QQ0lFUE9SVEJVUz15CiBDT05GSUdfUENJX01TST15CiBDT05GSUdfUkFQSURJTz15CkBAIC02MCw3ICs1OSw2IEBACiBDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0RFVlRNUEZTX01PVU5UPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9saW5rc3RhdGlvbl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9saW5rc3RhdGlvbl9kZWZjb25maWcKaW5kZXggOGE4NzRiOS4uMzUzNDM1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGlua3N0YXRpb25fZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpbmtzdGF0aW9uX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCmluZGV4IDgzZDM1NTAuLjE5ZjBmYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCkBAIC00OSw3ICs0OSw2IEBACiBDT05GSUdfQklORk1UX01JU0M9bQogQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEyCi1DT05GSUdfRlNMX0lGQz15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfTVNJPXkKIENPTkZJR19SQVBJRElPPXkKQEAgLTgyLDcgKzgxLDYgQEAKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZwppbmRleCA0YjY4NjI5Li4wNjIzMTJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCkBAIC01Miw3ICs1Miw2IEBACiBDT05GSUdfQklORk1UX01JU0M9bQogQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEyCi1DT05GSUdfRlNMX0lGQz15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfTVNJPXkKIENPTkZJR19SQVBJRElPPXkKQEAgLTg1LDcgKzg0LDYgQEAKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQweF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0MHhfZGVmY29uZmlnCmluZGV4IDFlYjE5YWMuLjUyOTA4YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQweF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDB4X2RlZmNvbmZpZwpAQCAtMzMsNyArMzMsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQ0eF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0NHhfZGVmY29uZmlnCmluZGV4IDNiOThkNzMuLmNjZjY2YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQ0eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDR4X2RlZmNvbmZpZwpAQCAtNDQsNyArNDQsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKaW5kZXggZTAxNTg5Ni4uZjI2YjI2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwpAQCAtNzMsNzQgKzczLDggQEAKIENPTkZJR19JTkVUX0lQQ09NUD1tCiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVI9eQotQ09ORklHX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fU0NUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9bQotQ09ORklHX05GX0NPTk5UUkFDS19JUkM9bQotQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQotQ09ORklHX05GX0NUX05FVExJTks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfRFNDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFBST1hZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BPUFRTVFJJUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NPQ0tFVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX0FIPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9FQ049bQotQ09ORklHX0lQX05GX01BVENIX1RUTD1tCi1DT05GSUdfSVBfTkZfRklMVEVSPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCi1DT05GSUdfSVBfTkZfTUFOR0xFPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfVFRMPW0KLUNPTkZJR19JUF9ORl9SQVc9bQotQ09ORklHX0lQX05GX0FSUFRBQkxFUz1tCi1DT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KLUNPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KKyMgQ09ORklHX05FVEZJTFRFUl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfQlJJREdFPW0KIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfREVWVE1QRlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRlX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0ZV9kZWZjb25maWcKaW5kZXggZjYyN2ZkYS4uNDM4ZTgxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRlX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NGVfZGVmY29uZmlnCkBAIC00OCw3NCArNDgsOCBAQAogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkZfQ09OTlRSQUNLPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DVF9QUk9UT19TQ1RQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSDMyMz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX05FVEJJT1NfTlM9bQotQ09ORklHX05GX0NPTk5UUkFDS19QUFRQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCi1DT05GSUdfTkZfQ1RfTkVUTElOSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUFJPWFk9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0U9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1dORVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU09DS0VUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzI9bQotQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19JUF9ORl9JUFRBQkxFUz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQotQ09ORklHX0lQX05GX01BVENIX0VDTj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KLUNPTkZJR19JUF9ORl9GSUxURVI9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQotQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KLUNPTkZJR19JUF9ORl9NQU5HTEU9bQotQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQotQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQotQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQotQ09ORklHX0lQX05GX1JBVz1tCi1DT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9BUlBGSUxURVI9bQotQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorIyBDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHJwbWMyODAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BycG1jMjgwMF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODBmYjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHJwbWMyODAwX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1DT05GSUdfQUxUSVZFQz15Ci1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKLUNPTkZJR19FTUJFRERFRDZ4eD15Ci1DT05GSUdfUFBDX1BSUE1DMjgwMD15Ci1DT05GSUdfSElHSE1FTT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfQklORk1UX01JU0M9eQotQ09ORklHX1NQQVJTRV9JUlE9eQotIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk1fVVNFUj15Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotQ09ORklHX1NZTl9DT09LSUVTPXkKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfSkVERUNQUk9CRT15Ci1DT05GSUdfTVREX0NGSV9JTlRFTEVYVD15Ci1DT05GSUdfTVREX1BIWVNNQVBfT0Y9eQotQ09ORklHX1BST0NfREVWSUNFVFJFRT15Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xMzEwNzIKLUNPTkZJR19JREU9eQotQ09ORklHX0JMS19ERVZfR0VORVJJQz15Ci1DT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVc9eQotQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0FUQT15Ci1DT05GSUdfU0FUQV9NVj15Ci1DT05GSUdfTUFDSU5UT1NIX0RSSVZFUlM9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTkVUX1BDST15Ci1DT05GSUdfRTEwMD15Ci1DT05GSUdfODEzOVRPTz15Ci0jIENPTkZJR184MTM5VE9PX1BJTyBpcyBub3Qgc2V0Ci1DT05GSUdfRTEwMDA9eQotQ09ORklHX01WNjQzWFhfRVRIPXkKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfTVBTQz15Ci1DT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRT15Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotQ09ORklHX0kyQ19NVjY0WFhYPXkKLUNPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15Ci1DT05GSUdfSElEX0RSQUdPTlJJU0U9eQotQ09ORklHX0hJRF9HWVJBVElPTj15Ci1DT05GSUdfSElEX1RXSU5IQU49eQotQ09ORklHX0hJRF9OVFJJRz15Ci1DT05GSUdfSElEX09SVEVLPXkKLUNPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQotQ09ORklHX0hJRF9QRVRBTFlOWD15Ci1DT05GSUdfSElEX1NBTVNVTkc9eQotQ09ORklHX0hJRF9TT05ZPXkKLUNPTkZJR19ISURfU1VOUExVUz15Ci1DT05GSUdfSElEX0dSRUVOQVNJQT15Ci1DT05GSUdfSElEX1NNQVJUSk9ZUExVUz15Ci1DT05GSUdfSElEX1RPUFNFRUQ9eQotQ09ORklHX0hJRF9USFJVU1RNQVNURVI9eQotQ09ORklHX1RIUlVTVE1BU1RFUl9GRj15Ci1DT05GSUdfSElEX1pFUk9QTFVTPXkKLUNPTkZJR19aRVJPUExVU19GRj15Ci1DT05GSUdfVVNCPXkKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0RFVklDRV9DTEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX01PTj15Ci1DT05GSUdfVVNCX0VIQ0lfSENEPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0Q9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0RSVl9NQVg2OTAwPXkKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQzX0ZTPXkKLSMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci1DT05GSUdfQ1JDX1QxMERJRj15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15Ci0jIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCmluZGV4IGU5YThiNGUuLjllYTgzNDJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwpAQCAtNjUsNTcgKzY1LDggQEAKIENPTkZJR19JTkVUX0lQQ09NUD1tCiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVI9eQotQ09ORklHX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQotQ09ORklHX05GX0NUX05FVExJTks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQorIyBDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQpAQCAtMzUzLDMgKzMwNCw1IEBACiBDT05GSUdfVklSVFVBTElaQVRJT049eQogQ09ORklHX0tWTV9CT09LM1NfNjQ9bQogQ09ORklHX0tWTV9CT09LM1NfNjRfSFY9eQorQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFPXkKK0NPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19sZV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2xlX2RlZmNvbmZpZwppbmRleCA2Mjc3MWUwLi4zYzg0ZjlkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2xlX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2xlX2RlZmNvbmZpZwpAQCAtNjcsNTcgKzY3LDggQEAKIENPTkZJR19JTkVUX0lQQ09NUD1tCiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVI9eQotQ09ORklHX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQotQ09ORklHX05GX0NUX05FVExJTks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQorIyBDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3Mvc3RvcmNlbnRlcl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9zdG9yY2VudGVyX2RlZmNvbmZpZwppbmRleCBlYmIyYTY2Li5iYTM5Yzc4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9zdG9yY2VudGVyX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9zdG9yY2VudGVyX2RlZmNvbmZpZwpAQCAtMzEsNyArMzEsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvdHFtOHh4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3RxbTh4eF9kZWZjb25maWcKaW5kZXggNGI2ZjhiZi4uN2ZlMjc3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvdHFtOHh4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy90cW04eHhfZGVmY29uZmlnCkBAIC00MSw3ICs0MSw2IEBACiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDZjMGE5NTUuLjNmYjFiYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw3ICsxLDggQEAKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByd3NlbS5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHZ0aW1lLmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCBhNjEzZDJjLi5iMTQyYjhlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC04LDcgKzgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjZGVmaW5lIENPTVBBVF9VU0VSX0haCQkxMDAKKyNpZmRlZiBfX0JJR19FTkRJQU5fXwogI2RlZmluZSBDT01QQVRfVVRTX01BQ0hJTkUJInBwY1wwXDAiCisjZWxzZQorI2RlZmluZSBDT01QQVRfVVRTX01BQ0hJTkUJInBwY2xlXDBcMCIKKyNlbmRpZgogCiB0eXBlZGVmIHUzMgkJY29tcGF0X3NpemVfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfc3NpemVfdDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKaW5kZXggNjE3Y2M3Ni4uYmMyMzQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKQEAgLTE4OSw2ICsxODksNyBAQAogI2RlZmluZQlDUFVfRlRSX0hBU19QUFIJCQlMT05HX0FTTV9DT05TVCgweDAyMDAwMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfREFXUgkJCUxPTkdfQVNNX0NPTlNUKDB4MDQwMDAwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9EQUJSWAkJCUxPTkdfQVNNX0NPTlNUKDB4MDgwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9QTUFPX0JVRwkJTE9OR19BU01fQ09OU1QoMHgxMDAwMDAwMDAwMDAwMDAwKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC00NDUsNiArNDQ2LDcgQEAKIAkgICAgQ1BVX0ZUUl9JQ1NXWCB8IENQVV9GVFJfQ0ZBUiB8IENQVV9GVFJfSFZNT0RFIHwgQ1BVX0ZUUl9WTVhfQ09QWSB8IFwKIAkgICAgQ1BVX0ZUUl9EQkVMTCB8IENQVV9GVFJfSEFTX1BQUiB8IENQVV9GVFJfREFXUiB8IFwKIAkgICAgQ1BVX0ZUUl9BUkNIXzIwN1MgfCBDUFVfRlRSX1RNX0NPTVApCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSOEUgKENQVV9GVFJTX1BPV0VSOCB8IENQVV9GVFJfUE1BT19CVUcpCiAjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MV1NZTkMgfCBcCiAJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCkBAIC00NjYsOCArNDY4LDggQEAKICNkZWZpbmUgQ1BVX0ZUUlNfUE9TU0lCTEUJXAogCSAgICAoQ1BVX0ZUUlNfUE9XRVIzIHwgQ1BVX0ZUUlNfUlM2NCB8IENQVV9GVFJTX1BPV0VSNCB8CVwKIAkgICAgQ1BVX0ZUUlNfUFBDOTcwIHwgQ1BVX0ZUUlNfUE9XRVI1IHwgQ1BVX0ZUUlNfUE9XRVI2IHwJXAotCSAgICBDUFVfRlRSU19QT1dFUjcgfCBDUFVfRlRSU19QT1dFUjggfCBDUFVfRlRSU19DRUxMIHwJCVwKLQkgICAgQ1BVX0ZUUlNfUEE2VCB8IENQVV9GVFJfVlNYKQorCSAgICBDUFVfRlRSU19QT1dFUjcgfCBDUFVfRlRSU19QT1dFUjhFIHwgQ1BVX0ZUUlNfUE9XRVI4IHwJXAorCSAgICBDUFVfRlRSU19DRUxMIHwgQ1BVX0ZUUlNfUEE2VCB8IENQVV9GVFJfVlNYKQogI2VuZGlmCiAjZWxzZQogZW51bSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0ZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NGUuaAppbmRleCA1MWZhNDNlLi5hNTYzZDlhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0ZS5oCkBAIC00Niw5ICs0Niw4IEBACiAjZGVmaW5lIEVYX0NSCQkoMSAqIDgpCiAjZGVmaW5lIEVYX1IxMAkJKDIgKiA4KQogI2RlZmluZSBFWF9SMTEJCSgzICogOCkKLSNkZWZpbmUgRVhfUjEzCQkoNCAqIDgpCi0jZGVmaW5lIEVYX1IxNAkJKDUgKiA4KQotI2RlZmluZSBFWF9SMTUJCSg2ICogOCkKKyNkZWZpbmUgRVhfUjE0CQkoNCAqIDgpCisjZGVmaW5lIEVYX1IxNQkJKDUgKiA4KQogCiAvKgogICogVGhlIFRMQiBtaXNzIGV4Y2VwdGlvbiB1c2VzIGRpZmZlcmVudCBzbG90cy4KQEAgLTE3MywxNiArMTcyLDYgQEAKIAlsZAlyOSxFWF9UTEJfUjkocjEyKTsJCQkJCSAgICBcCiAJbGQJcjgsRVhfVExCX1I4KHIxMik7CQkJCQkgICAgXAogCW10bHIJcjE2OwotI2RlZmluZSBUTEJfTUlTU19QUk9MT0dfU1RBVFNfQk9MVEVECQkJCQkJICAgIFwKLQltZmxyCXIxMDsJCQkJCQkJICAgIFwKLQlzdGQJcjgsUEFDQV9FWFRMQitFWF9UTEJfUjgocjEzKTsJCQkJICAgIFwKLQlzdGQJcjksUEFDQV9FWFRMQitFWF9UTEJfUjkocjEzKTsJCQkJICAgIFwKLQlzdGQJcjEwLFBBQ0FfRVhUTEIrRVhfVExCX0xSKHIxMyk7Ci0jZGVmaW5lIFRMQl9NSVNTX1JFU1RPUkVfU1RBVFNfQk9MVEVECQkJCQkgICAgICAgICAgICBcCi0JbGQJcjE2LFBBQ0FfRVhUTEIrRVhfVExCX0xSKHIxMyk7CQkJCSAgICBcCi0JbGQJcjksUEFDQV9FWFRMQitFWF9UTEJfUjkocjEzKTsJCQkJICAgIFwKLQlsZAlyOCxQQUNBX0VYVExCK0VYX1RMQl9SOChyMTMpOwkJCQkgICAgXAotCW10bHIJcjE2OwogI2RlZmluZSBUTEJfTUlTU19TVEFUU19EKG5hbWUpCQkJCQkJICAgIFwKIAlhZGRpCXI5LHIxMyxNTVNUQVRfRFNUQVRTK25hbWU7CQkJCSAgICBcCiAJYmwJLnRsYl9zdGF0X2luYzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0cy5oCmluZGV4IDY2ODMwNjEuLmFlYWE1NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaApAQCAtMTQ3LDYgKzE0NywxNCBAQAogRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChmdHIsZnRyLDk0MykKIAogLyoKKyAqIFNldCBhbiBTUFIgZnJvbSBhIHJlZ2lzdGVyIGlmIHRoZSBDUFUgaGFzIHRoZSBnaXZlbiBmZWF0dXJlCisgKi8KKyNkZWZpbmUgT1BUX1NFVF9TUFIocmEsIHNwciwgZnRyKQkJCQkJXAorQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDk0MykJCQkJCQlcCisJbXRzcHIJc3ByLHJhOwkJCQkJCQlcCitFTkRfRlRSX1NFQ1RJT05fTkVTVEVEKGZ0cixmdHIsOTQzKQorCisvKgogICogU2F2ZSBhIHJlZ2lzdGVyIHRvIHRoZSBQQUNBIGlmIHRoZSBDUFUgaGFzIHRoZSBnaXZlbiBmZWF0dXJlCiAgKi8KICNkZWZpbmUgT1BUX1NBVkVfUkVHX1RPX1BBQ0Eob2Zmc2V0LCByYSwgZnRyKQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKaW5kZXggZDhiNjAwYi4uNWRiYmIyOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaApAQCAtMjc0LDYgKzI3NCwxMSBAQAogLyogUGxhdGZvcm0gc3BlY2lmaWMgaGNhbGxzLCB1c2VkIGJ5IEtWTSAqLwogI2RlZmluZSBIX1JUQVMJCQkweGYwMDAKIAorLyogIlBsYXRmb3JtIHNwZWNpZmljIGhjYWxscyIsIHByb3ZpZGVkIGJ5IFBIWVAgKi8KKyNkZWZpbmUgSF9HRVRfMjRYN19DQVRBTE9HX1BBR0UJMHhGMDc4CisjZGVmaW5lIEhfR0VUXzI0WDdfREFUQQkJMHhGMDdDCisjZGVmaW5lIEhfR0VUX1BFUkZfQ09VTlRFUl9JTkZPCTB4RjA4MAorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2VfaHZfYXNtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2tlX2h2X2FzbS5oCmluZGV4IDNhNzlmNTMuLmU1ZjA0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2VfaHZfYXNtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rZV9odl9hc20uaApAQCAtMzYsMjYgKzM2LDIxIEBACiAgKiAgICoocjggKyBHUFIxMSkgPSBzYXZlZCByMTEKICAqCiAgKiA2NC1iaXQgaG9zdAotICogRXhwZWN0ZWQgaW5wdXRzIChHRU4vR0RCRUxML0RCRy9NQyBleGNlcHRpb24gdHlwZXMpOgorICogRXhwZWN0ZWQgaW5wdXRzIChHRU4vR0RCRUxML0RCRy9DUklUL01DIGV4Y2VwdGlvbiB0eXBlcyk6CiAgKiAgcjEwID0gc2F2ZWQgQ1IKICAqICByMTMgPSBQQUNBX1BPSU5URVIKICAqICAqKHIxMyArIFBBQ0FfRVgjI3R5cGUgKyBFWF9SMTApID0gc2F2ZWQgcjEwCiAgKiAgKihyMTMgKyBQQUNBX0VYIyN0eXBlICsgRVhfUjExKSA9IHNhdmVkIHIxMQogICogIFNQUk5fU1BSR18jI3R5cGUjI19TQ1JBVENIID0gc2F2ZWQgcjEzCiAgKgotICAqIEV4cGVjdGVkIGlucHV0cyAoQ1JJVCBleGNlcHRpb24gdHlwZSk6Ci0gKiAgcjEwID0gc2F2ZWQgQ1IKLSAqICByMTMgPSBQQUNBX1BPSU5URVIKLSAqICAqKHIxMyArIFBBQ0FfRVgjI3R5cGUgKyBFWF9SMTApID0gc2F2ZWQgcjEwCi0gKiAgKihyMTMgKyBQQUNBX0VYIyN0eXBlICsgRVhfUjExKSA9IHNhdmVkIHIxMQotICogICoocjEzICsgUEFDQV9FWCMjdHlwZSArIEVYX1IxMykgPSBzYXZlZCByMTMKLSAqCiAgKiBFeHBlY3RlZCBpbnB1dHMgKFRMQiBleGNlcHRpb24gdHlwZSk6CiAgKiAgcjEwID0gc2F2ZWQgQ1IKKyAqICByMTIgPSBleHRsYiBwb2ludGVyCiAgKiAgcjEzID0gUEFDQV9QT0lOVEVSCi0gKiAgKihyMTMgKyBQQUNBX0VYIyN0eXBlICsgRVhfVExCX1IxMCkgPSBzYXZlZCByMTAKLSAqICAqKHIxMyArIFBBQ0FfRVgjI3R5cGUgKyBFWF9UTEJfUjExKSA9IHNhdmVkIHIxMQotICogIFNQUk5fU1BSR19HRU5fU0NSQVRDSCA9IHNhdmVkIHIxMworICogICoocjEyICsgRVhfVExCX1IxMCkgPSBzYXZlZCByMTAKKyAqICAqKHIxMiArIEVYX1RMQl9SMTEpID0gc2F2ZWQgcjExCisgKiAgKihyMTIgKyBFWF9UTEJfUjEzKSA9IHNhdmVkIHIxMworICogIFNQUk5fU1BSR19HRU5fU0NSQVRDSCA9IHNhdmVkIHIxMgogICoKICAqIE9ubHkgdGhlIGJvbHRlZCB2ZXJzaW9uIG9mIFRMQiBtaXNzIGV4Y2VwdGlvbiBoYW5kbGVycyBpcyBzdXBwb3J0ZWQgbm93LgogICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaAppbmRleCBhZDMwMjVkLi41YjZjMDNmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKQEAgLTE3MCw2ICsxNzAsOSBAQAogCWludAkJKCpzeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAJaW50IAkJKCptYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbikoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCisJLyogQ2FsbGVkIGR1cmluZyBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiB0byByZXRyaXZlIGZpeHVwIGFkZHJlc3MuICovCisJYm9vbAkJKCptY2VfY2hlY2tfZWFybHlfcmVjb3ZlcnkpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwogCS8qIE1vdGhlcmJvYXJkL2NoaXBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgYSBraW5kIG9mIGdlbmVyYWwgcHVycG9zZQogCSAqIGhvb2sgdXNlZCB0byBjb250cm9sIHNvbWUgbWFjaGluZSBzcGVjaWZpYyBmZWF0dXJlcyAobGlrZSByZXNldAogCSAqIGxpbmVzLCBjaGlwIHBvd2VyIGNvbnRyb2wsIGV0Yy4uLikuCkBAIC0yNzksNiArMjgyLDEwIEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCiAJaW50ICgqZ2V0X3JhbmRvbV9sb25nKSh1bnNpZ25lZCBsb25nICp2KTsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkUKKwlpbnQgKCpyZW1vdmVfbWVtb3J5KSh1NjQsIHU2NCk7CisjZW5kaWYKIH07CiAKIGV4dGVybiB2b2lkIGU1MDBfaWRsZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tY2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tY2UuaAppbmRleCA4ZTk5ZWRmLi5mOTdkOGNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21jZS5oCkBAIC0xODcsNyArMTg3LDggQEAKICNkZWZpbmUgTUNFX0VWRU5UX0RPTlRSRUxFQVNFCWZhbHNlCiAKIGV4dGVybiB2b2lkIHNhdmVfbWNlX2V2ZW50KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGhhbmRsZWQsCi0JCQkgICBzdHJ1Y3QgbWNlX2Vycm9yX2luZm8gKm1jZV9lcnIsIHVpbnQ2NF90IGFkZHIpOworCQkJICAgc3RydWN0IG1jZV9lcnJvcl9pbmZvICptY2VfZXJyLCB1aW50NjRfdCBuaXAsCisJCQkgICB1aW50NjRfdCBhZGRyKTsKIGV4dGVybiBpbnQgZ2V0X21jZV9ldmVudChzdHJ1Y3QgbWFjaGluZV9jaGVja19ldmVudCAqbWNlLCBib29sIHJlbGVhc2UpOwogZXh0ZXJuIHZvaWQgcmVsZWFzZV9tY2VfZXZlbnQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX2NoZWNrX3F1ZXVlX2V2ZW50KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKaW5kZXggODliNzg1ZC4uOTAxZGFjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCkBAIC0yODcsMTEgKzI4NywxNCBAQAogZXh0ZXJuIGludCBtbXVfdm1lbW1hcF9wc2l6ZTsKIAogc3RydWN0IHRsYl9jb3JlX2RhdGEgeworCS8qCisJICogUGVyLWNvcmUgc3BpbmxvY2sgZm9yIGU2NTAwIFRMQiBoYW5kbGVycyAobm8gdGxic3J4LikKKwkgKiBNdXN0IGJlIHRoZSBmaXJzdCBzdHJ1Y3QgZWxlbWVudC4KKwkgKi8KKwl1OCBsb2NrOworCiAJLyogRm9yIHNvZnR3YXJlIHdheSBzZWxlY3Rpb24sIGFzIG9uIEZyZWVzY2FsZSBUTEIxICovCiAJdTggZXNlbF9uZXh0LCBlc2VsX21heCwgZXNlbF9maXJzdDsKLQotCS8qIFBlci1jb3JlIHNwaW5sb2NrIGZvciBlNjUwMCBUTEIgaGFuZGxlcnMgKG5vIHRsYnNyeC4pICovCi0JdTggbG9jazsKIH07CiAKICNpZmRlZiBDT05GSUdfUFBDNjQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oCmluZGV4IGVkODIxNDIuLmZlMmFhMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaApAQCAtODMsNiArODMsOCBAQAogI2RlZmluZSBPUEFMX0lOVEVSTkFMX0VSUk9SCS0xMQogI2RlZmluZSBPUEFMX0JVU1lfRVZFTlQJCS0xMgogI2RlZmluZSBPUEFMX0hBUkRXQVJFX0ZST1pFTgktMTMKKyNkZWZpbmUgT1BBTF9XUk9OR19TVEFURQktMTQKKyNkZWZpbmUgT1BBTF9BU1lOQ19DT01QTEVUSU9OCS0xNQogCiAvKiBBUEkgVG9rZW5zIChpbiByMCkgKi8KICNkZWZpbmUgT1BBTF9DT05TT0xFX1dSSVRFCQkJMQpAQCAtMTUxLDEyICsxNTMsMjcgQEAKICNkZWZpbmUgT1BBTF9MUENfUkVBRAkJCQk2NwogI2RlZmluZSBPUEFMX0xQQ19XUklURQkJCQk2OAogI2RlZmluZSBPUEFMX1JFVFVSTl9DUFUJCQkJNjkKKyNkZWZpbmUgT1BBTF9FTE9HX1JFQUQJCQkJNzEKKyNkZWZpbmUgT1BBTF9FTE9HX1dSSVRFCQkJCTcyCisjZGVmaW5lIE9QQUxfRUxPR19BQ0sJCQkJNzMKKyNkZWZpbmUgT1BBTF9FTE9HX1JFU0VORAkJCTc0CisjZGVmaW5lIE9QQUxfRUxPR19TSVpFCQkJCTc1CiAjZGVmaW5lIE9QQUxfRkxBU0hfVkFMSURBVEUJCQk3NgogI2RlZmluZSBPUEFMX0ZMQVNIX01BTkFHRQkJCTc3CiAjZGVmaW5lIE9QQUxfRkxBU0hfVVBEQVRFCQkJNzgKKyNkZWZpbmUgT1BBTF9SRVNZTkNfVElNRUJBU0UJCQk3OQorI2RlZmluZSBPUEFMX0RVTVBfSU5JVAkJCQk4MQorI2RlZmluZSBPUEFMX0RVTVBfSU5GTwkJCQk4MgorI2RlZmluZSBPUEFMX0RVTVBfUkVBRAkJCQk4MworI2RlZmluZSBPUEFMX0RVTVBfQUNLCQkJCTg0CiAjZGVmaW5lIE9QQUxfR0VUX01TRwkJCQk4NQogI2RlZmluZSBPUEFMX0NIRUNLX0FTWU5DX0NPTVBMRVRJT04JCTg2CiAjZGVmaW5lIE9QQUxfU1lOQ19IT1NUX1JFQk9PVAkJCTg3CisjZGVmaW5lIE9QQUxfU0VOU09SX1JFQUQJCQk4OAorI2RlZmluZSBPUEFMX0dFVF9QQVJBTQkJCQk4OQorI2RlZmluZSBPUEFMX1NFVF9QQVJBTQkJCQk5MAorI2RlZmluZSBPUEFMX0RVTVBfUkVTRU5ECQkJOTEKKyNkZWZpbmUgT1BBTF9EVU1QX0lORk8yCQkJCTk0CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTIzNywxMSArMjU0LDE0IEBACiAJT1BBTF9FVkVOVF9FUE9XCQkJPSAweDgwLAogCU9QQUxfRVZFTlRfTEVEX1NUQVRVUwkJPSAweDEwMCwKIAlPUEFMX0VWRU5UX1BDSV9FUlJPUgkJPSAweDIwMCwKKwlPUEFMX0VWRU5UX0RVTVBfQVZBSUwJCT0gMHg0MDAsCiAJT1BBTF9FVkVOVF9NU0dfUEVORElORwkJPSAweDgwMCwKIH07CiAKIGVudW0gT3BhbE1lc3NhZ2VUeXBlIHsKLQlPUEFMX01TR19BU1lOQ19DT01QCQk9IDAsCisJT1BBTF9NU0dfQVNZTkNfQ09NUCA9IDAsCS8qIHBhcmFtc1swXSA9IHRva2VuLCBwYXJhbXNbMV0gPSByYywKKwkJCQkJICogYWRkaXRpb25hbCBwYXJhbXMgZnVuY3Rpb24tc3BlY2lmaWMKKwkJCQkJICovCiAJT1BBTF9NU0dfTUVNX0VSUiwKIAlPUEFMX01TR19FUE9XLAogCU9QQUxfTVNHX1NIVVRET1dOLApAQCAtMzk0LDYgKzQxNCwxMyBAQAogCU9QQUxfTFBDX0ZXCT0gMiwKIH07CiAKKy8qIFN5c3RlbSBwYXJhbWV0ZXIgcGVybWlzc2lvbiAqLworZW51bSBPcGFsU3lzcGFyYW1QZXJtIHsKKwlPUEFMX1NZU1BBUkFNX1JFQUQgICAgICA9IDB4MSwKKwlPUEFMX1NZU1BBUkFNX1dSSVRFICAgICA9IDB4MiwKKwlPUEFMX1NZU1BBUkFNX1JXICAgICAgICA9IChPUEFMX1NZU1BBUkFNX1JFQUQgfCBPUEFMX1NZU1BBUkFNX1dSSVRFKSwKK307CisKIHN0cnVjdCBvcGFsX21zZyB7CiAJdWludDMyX3QgbXNnX3R5cGU7CiAJdWludDMyX3QgcmVzZXJ2ZWQ7CkBAIC04MjMsMTYgKzg1MCwzNyBAQAogCQkgICAgICAgdWludDMyX3QgYWRkciwgdWludDMyX3QgZGF0YSwgdWludDMyX3Qgc3opOwogaW50NjRfdCBvcGFsX2xwY19yZWFkKHVpbnQzMl90IGNoaXBfaWQsIGVudW0gT3BhbExQQ0FkZHJlc3NUeXBlIGFkZHJfdHlwZSwKIAkJICAgICAgdWludDMyX3QgYWRkciwgX19iZTMyICpkYXRhLCB1aW50MzJfdCBzeik7CisKK2ludDY0X3Qgb3BhbF9yZWFkX2Vsb2codWludDY0X3QgYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgbG9nX2lkKTsKK2ludDY0X3Qgb3BhbF9nZXRfZWxvZ19zaXplKHVpbnQ2NF90ICpsb2dfaWQsIHNpemVfdCAqc2l6ZSwgdWludDY0X3QgKmVsb2dfdHlwZSk7CitpbnQ2NF90IG9wYWxfd3JpdGVfZWxvZyh1aW50NjRfdCBidWZmZXIsIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCk7CitpbnQ2NF90IG9wYWxfc2VuZF9hY2tfZWxvZyh1aW50NjRfdCBsb2dfaWQpOwordm9pZCBvcGFsX3Jlc2VuZF9wZW5kaW5nX2xvZ3Modm9pZCk7CisKIGludDY0X3Qgb3BhbF92YWxpZGF0ZV9mbGFzaCh1aW50NjRfdCBidWZmZXIsIHVpbnQzMl90ICpzaXplLCB1aW50MzJfdCAqcmVzdWx0KTsKIGludDY0X3Qgb3BhbF9tYW5hZ2VfZmxhc2godWludDhfdCBvcCk7CiBpbnQ2NF90IG9wYWxfdXBkYXRlX2ZsYXNoKHVpbnQ2NF90IGJsa19saXN0KTsKK2ludDY0X3Qgb3BhbF9kdW1wX2luaXQodWludDhfdCBkdW1wX3R5cGUpOworaW50NjRfdCBvcGFsX2R1bXBfaW5mbyh1aW50MzJfdCAqZHVtcF9pZCwgdWludDMyX3QgKmR1bXBfc2l6ZSk7CitpbnQ2NF90IG9wYWxfZHVtcF9pbmZvMih1aW50MzJfdCAqZHVtcF9pZCwgdWludDMyX3QgKmR1bXBfc2l6ZSwgdWludDMyX3QgKmR1bXBfdHlwZSk7CitpbnQ2NF90IG9wYWxfZHVtcF9yZWFkKHVpbnQzMl90IGR1bXBfaWQsIHVpbnQ2NF90IGJ1ZmZlcik7CitpbnQ2NF90IG9wYWxfZHVtcF9hY2sodWludDMyX3QgZHVtcF9pZCk7CitpbnQ2NF90IG9wYWxfZHVtcF9yZXNlbmRfbm90aWZpY2F0aW9uKHZvaWQpOwogCiBpbnQ2NF90IG9wYWxfZ2V0X21zZyh1aW50NjRfdCBidWZmZXIsIHNpemVfdCBzaXplKTsKIGludDY0X3Qgb3BhbF9jaGVja19jb21wbGV0aW9uKHVpbnQ2NF90IGJ1ZmZlciwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRva2VuKTsKIGludDY0X3Qgb3BhbF9zeW5jX2hvc3RfcmVib290KHZvaWQpOworaW50NjRfdCBvcGFsX2dldF9wYXJhbSh1aW50NjRfdCB0b2tlbiwgdWludDMyX3QgcGFyYW1faWQsIHVpbnQ2NF90IGJ1ZmZlciwKKwkJc2l6ZV90IGxlbmd0aCk7CitpbnQ2NF90IG9wYWxfc2V0X3BhcmFtKHVpbnQ2NF90IHRva2VuLCB1aW50MzJfdCBwYXJhbV9pZCwgdWludDY0X3QgYnVmZmVyLAorCQlzaXplX3QgbGVuZ3RoKTsKK2ludDY0X3Qgb3BhbF9zZW5zb3JfcmVhZCh1aW50MzJfdCBzZW5zb3JfaG5kbCwgaW50IHRva2VuLAorCQl1aW50MzJfdCAqc2Vuc29yX2RhdGEpOwogCiAvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX29wYWwodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLCB2b2lkICpkYXRhKTsKK2V4dGVybiBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX3JlY292ZXJhYmxlX3Jhbmdlcyh1bnNpZ25lZCBsb25nIG5vZGUsCisJCQkJIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOwogCiBleHRlcm4gaW50IG9wYWxfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIGV4dGVybiBpbnQgb3BhbF9wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgdG90YWxfbGVuKTsKQEAgLTg1Myw2ICs5MDEsMTMgQEAKIGV4dGVybiBpbnQgb3BhbF9nZXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpOwogZXh0ZXJuIGludCBvcGFsX3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCB0b3RhbF9sZW4pOwogCitleHRlcm4gaW50IF9fb3BhbF9hc3luY19nZXRfdG9rZW4odm9pZCk7CitleHRlcm4gaW50IG9wYWxfYXN5bmNfZ2V0X3Rva2VuX2ludGVycnVwdGlibGUodm9pZCk7CitleHRlcm4gaW50IF9fb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKGludCB0b2tlbik7CitleHRlcm4gaW50IG9wYWxfYXN5bmNfcmVsZWFzZV90b2tlbihpbnQgdG9rZW4pOworZXh0ZXJuIGludCBvcGFsX2FzeW5jX3dhaXRfcmVzcG9uc2UodWludDY0X3QgdG9rZW4sIHN0cnVjdCBvcGFsX21zZyAqbXNnKTsKK2V4dGVybiBpbnQgb3BhbF9nZXRfc2Vuc29yX2RhdGEodTMyIHNlbnNvcl9obmRsLCB1MzIgKnNlbnNvcl9kYXRhKTsKKwogZXh0ZXJuIHZvaWQgaHZjX29wYWxfaW5pdF9lYXJseSh2b2lkKTsKIAogc3RydWN0IHJ0Y190aW1lOwpAQCAtODYxLDEwICs5MTYsMTUgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG9wYWxfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIG9wYWxfbnZyYW1faW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG9wYWxfZmxhc2hfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgb3BhbF9lbG9nX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvcGFsX3BsYXRmb3JtX2R1bXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9wYWxfc3lzX3BhcmFtX2luaXQodm9pZCk7CiAKIGV4dGVybiBpbnQgb3BhbF9tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBib29sIG9wYWxfbWNlX2NoZWNrX2Vhcmx5X3JlY292ZXJ5KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogZXh0ZXJuIHZvaWQgb3BhbF9zaHV0ZG93bih2b2lkKTsKK2V4dGVybiBpbnQgb3BhbF9yZXN5bmNfdGltZWJhc2Uodm9pZCk7CiAKIGV4dGVybiB2b2lkIG9wYWxfbHBjX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCmluZGV4IDljNWRiYzMuLjhlOTU2YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaApAQCAtMTE2LDggKzExNiwxMSBAQAogCS8qIFNoYXJlZCBieSBhbGwgdGhyZWFkcyBvZiBhIGNvcmUgLS0gcG9pbnRzIHRvIHRjZCBvZiBmaXJzdCB0aHJlYWQgKi8KIAlzdHJ1Y3QgdGxiX2NvcmVfZGF0YSAqdGNkX3B0cjsKIAotCS8qIFdlIGNhbiBoYXZlIHVwIHRvIDMgbGV2ZWxzIG9mIHJlZW50cmFuY3kgaW4gdGhlIFRMQiBtaXNzIGhhbmRsZXIgKi8KLQl1NjQgZXh0bGJbM11bRVhfVExCX1NJWkUgLyBzaXplb2YodTY0KV07CisJLyoKKwkgKiBXZSBjYW4gaGF2ZSB1cCB0byAzIGxldmVscyBvZiByZWVudHJhbmN5IGluIHRoZSBUTEIgbWlzcyBoYW5kbGVyLAorCSAqIGluIGVhY2ggb2YgZm91ciBleGNlcHRpb24gbGV2ZWxzIChub3JtYWwsIGNyaXQsIG1jaGVjaywgZGVidWcpLgorCSAqLworCXU2NCBleHRsYlsxMl1bRVhfVExCX1NJWkUgLyBzaXplb2YodTY0KV07CiAJdTY0IGV4bWNbOF07CQkvKiB1c2VkIGZvciBtYWNoaW5lIGNoZWNrcyAqLwogCXU2NCBleGNyaXRbOF07CQkvKiB1c2VkIGZvciBjcml0IGludGVycnVwdHMgKi8KIAl1NjQgZXhkYmdbOF07CQkvKiB1c2VkIGZvciBkZWJ1ZyBpbnRlcnJ1cHRzICovCkBAIC0xNDYsNyArMTQ5LDcgQEAKIAl1OCBpb19zeW5jOwkJCS8qIHdyaXRlbCgpIG5lZWRzIHNwaW5fdW5sb2NrIHN5bmMgKi8KIAl1OCBpcnFfd29ya19wZW5kaW5nOwkJLyogSVJRX1dPUksgaW50ZXJydXB0IHdoaWxlIHNvZnQtZGlzYWJsZSAqLwogCXU4IG5hcF9zdGF0ZV9sb3N0OwkJLyogTlYgR1BSIHZhbHVlcyBsb3N0IGluIHBvd2VyN19pZGxlICovCi0JdTY0IHNwcmczOwkJCS8qIFNhdmVkIHVzZXItdmlzaWJsZSBzcHJnICovCisJdTY0IHNwcmdfdmRzbzsJCQkvKiBTYXZlZCB1c2VyLXZpc2libGUgc3ByZyAqLwogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KIAl1NjQgdG1fc2NyYXRjaDsgICAgICAgICAgICAgICAgIC8qIFRNIHNjcmF0Y2ggYXJlYSBmb3IgcmVjbGFpbSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9zZXJ2ZXIuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3NlcnZlci5oCmluZGV4IDNmZDJmMWI2Li45ZWQ3MzcxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfc2VydmVyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfc2VydmVyLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDx1YXBpL2FzbS9wZXJmX2V2ZW50Lmg+CiAKKy8qIFVwZGF0ZSBwZXJmX2V2ZW50X3ByaW50X2RlYnVnKCkgaWYgdGhpcyBjaGFuZ2VzICovCiAjZGVmaW5lIE1BWF9IV0VWRU5UUwkJOAogI2RlZmluZSBNQVhfRVZFTlRfQUxURVJOQVRJVkVTCTgKICNkZWZpbmUgTUFYX0xJTUlURURfSFdDT1VOVEVSUwkyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYjYyZGU0My4uZDY2MGRjMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtNDUwLDYgKzQ1MCw3IEBACiAKIGV4dGVybiBpbnQgcG93ZXJzYXZlX25hcDsJLyogc2V0IGlmIG5hcCBtb2RlIGNhbiBiZSB1c2VkIGluIGlkbGUgbG9vcCAqLwogZXh0ZXJuIHZvaWQgcG93ZXI3X25hcCh2b2lkKTsKK2V4dGVybiB2b2lkIHBvd2VyN19zbGVlcCh2b2lkKTsKIGV4dGVybiB2b2lkIGZsdXNoX2luc3RydWN0aW9uX2NhY2hlKHZvaWQpOwogZXh0ZXJuIHZvaWQgaGFyZF9yZXNldF9ub3codm9pZCk7CiBleHRlcm4gdm9pZCBwb3dlcm9mZl9ub3codm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKaW5kZXggOTBjMDZlYy4uMWEzNmI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaApAQCAtNTc3LDkgKzU3NywxMyBAQAogI2RlZmluZSBTUFJOX1NQUkczCTB4MTEzCS8qIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBHZW5lcmFsIDMgKi8KICNkZWZpbmUgU1BSTl9VU1BSRzMJMHgxMDMJLyogU1BSRzMgdXNlcnNwYWNlIHJlYWQgKi8KICNkZWZpbmUgU1BSTl9TUFJHNAkweDExNAkvKiBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXIgR2VuZXJhbCA0ICovCisjZGVmaW5lIFNQUk5fVVNQUkc0CTB4MTA0CS8qIFNQUkc0IHVzZXJzcGFjZSByZWFkICovCiAjZGVmaW5lIFNQUk5fU1BSRzUJMHgxMTUJLyogU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyIEdlbmVyYWwgNSAqLworI2RlZmluZSBTUFJOX1VTUFJHNQkweDEwNQkvKiBTUFJHNSB1c2Vyc3BhY2UgcmVhZCAqLwogI2RlZmluZSBTUFJOX1NQUkc2CTB4MTE2CS8qIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBHZW5lcmFsIDYgKi8KKyNkZWZpbmUgU1BSTl9VU1BSRzYJMHgxMDYJLyogU1BSRzYgdXNlcnNwYWNlIHJlYWQgKi8KICNkZWZpbmUgU1BSTl9TUFJHNwkweDExNwkvKiBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXIgR2VuZXJhbCA3ICovCisjZGVmaW5lIFNQUk5fVVNQUkc3CTB4MTA3CS8qIFNQUkc3IHVzZXJzcGFjZSByZWFkICovCiAjZGVmaW5lIFNQUk5fU1JSMAkweDAxQQkvKiBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBTUFJOX1NSUjEJMHgwMUIJLyogU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgICBTUlIxX0lTSV9OT1BUCQkweDQwMDAwMDAwIC8qIElTSTogTm90IGZvdW5kIGluIGhhc2ggKi8KQEAgLTY2NCwxMiArNjY4LDE0IEBACiAjZGVmaW5lICAgTU1DUjBfUE1YRQkweDA0MDAwMDAwVUwgLyogcGVyZm9ybWFuY2UgbW9uaXRvciBleGNlcHRpb24gZW5hYmxlICovCiAjZGVmaW5lICAgTU1DUjBfRkNFQ0UJMHgwMjAwMDAwMFVMIC8qIGZyZWV6ZSBjdHJzIG9uIGVuYWJsZWQgY29uZCBvciBldmVudCAqLwogI2RlZmluZSAgIE1NQ1IwX1RCRUUJMHgwMDQwMDAwMFVMIC8qIHRpbWUgYmFzZSBleGNlcHRpb24gZW5hYmxlICovCisjZGVmaW5lICAgTU1DUjBfQkhSQkEJMHgwMDIwMDAwMFVMIC8qIEJIUkIgQWNjZXNzIGFsbG93ZWQgaW4gdXNlcnNwYWNlICovCiAjZGVmaW5lICAgTU1DUjBfRUJFCTB4MDAxMDAwMDBVTCAvKiBFdmVudCBiYXNlZCBicmFuY2ggZW5hYmxlICovCiAjZGVmaW5lICAgTU1DUjBfUE1DQwkweDAwMGMwMDAwVUwgLyogUE1DIGNvbnRyb2wgKi8KICNkZWZpbmUgICBNTUNSMF9QTUNDX1U2CTB4MDAwODAwMDBVTCAvKiBQTUMxLTYgYXJlIFIvVyBieSB1c2VyIChQUikgKi8KICNkZWZpbmUgICBNTUNSMF9QTUMxQ0UJMHgwMDAwODAwMFVMIC8qIFBNQzEgY291bnQgZW5hYmxlKi8KICNkZWZpbmUgICBNTUNSMF9QTUNqQ0UJMHgwMDAwNDAwMFVMIC8qIFBNQ2ogY291bnQgZW5hYmxlKi8KICNkZWZpbmUgICBNTUNSMF9UUklHR0VSCTB4MDAwMDIwMDBVTCAvKiBUUklHR0VSIGVuYWJsZSAqLworI2RlZmluZSAgIE1NQ1IwX1BNQU9fU1lOQyAweDAwMDAwODAwVUwgLyogUE1VIGludGVycnVwdCBpcyBzeW5jaHJvbm91cyAqLwogI2RlZmluZSAgIE1NQ1IwX1BNQU8JMHgwMDAwMDA4MFVMIC8qIHBlcmZvcm1hbmNlIG1vbml0b3IgYWxlcnQgaGFzIG9jY3VycmVkLCBzZXQgdG8gMCBhZnRlciBoYW5kbGluZyBleGNlcHRpb24gKi8KICNkZWZpbmUgICBNTUNSMF9TSFJGQwkweDAwMDAwMDQwVUwgLyogU0hScmUgZnJlZXplIGNvbmRpdGlvbnMgYmV0d2VlbiB0aHJlYWRzICovCiAjZGVmaW5lICAgTU1DUjBfRkM1NgkweDAwMDAwMDEwVUwgLyogZnJlZXplIGNvdW50ZXJzIDUgYW5kIDYgKi8KQEAgLTcwMyw2ICs3MDksNyBAQAogI2RlZmluZSBTUFJOX0VCQkhSCTgwNAkvKiBFdmVudCBiYXNlZCBicmFuY2ggaGFuZGxlciByZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX0VCQlJSCTgwNQkvKiBFdmVudCBiYXNlZCBicmFuY2ggcmV0dXJuIHJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fQkVTQ1IJODA2CS8qIEJyYW5jaCBldmVudCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBCRVNDUl9HRQkweDgwMDAwMDAwMDAwMDAwMDBVTEwgLyogR2xvYmFsIEVuYWJsZSAqLwogI2RlZmluZSBTUFJOX1dPUlQJODk1CS8qIFdvcmtsb2FkIG9wdGltaXphdGlvbiByZWdpc3RlciAtIHRocmVhZCAqLwogCiAjZGVmaW5lIFNQUk5fUE1DMQk3ODcKQEAgLTg3OSwxMSArODg2LDEwIEBACiAgKiA2NC1iaXQgZW1iZWRkZWQKICAqCS0gU1BSRzAgZ2VuZXJpYyBleGNlcHRpb24gc2NyYXRjaAogICoJLSBTUFJHMiBUTEIgZXhjZXB0aW9uIHN0YWNrCi0gKgktIFNQUkczIGNyaXRpY2FsIGV4Y2VwdGlvbiBzY3JhdGNoIGFuZAotICogICAgICAgIENQVSBhbmQgTlVNQSBub2RlIGZvciBWRFNPIGdldGNwdSAodXNlciB2aXNpYmxlKQorICoJLSBTUFJHMyBjcml0aWNhbCBleGNlcHRpb24gc2NyYXRjaCAodXNlciB2aXNpYmxlLCBzb3JyeSEpCiAgKgktIFNQUkc0IHVudXNlZCAodXNlciB2aXNpYmxlKQogICoJLSBTUFJHNiBUTEIgbWlzcyBzY3JhdGNoICh1c2VyIHZpc2libGUsIHNvcnJ5ICEpCi0gKgktIFNQUkc3IGNyaXRpY2FsIGV4Y2VwdGlvbiBzY3JhdGNoCisgKgktIFNQUkc3IENQVSBhbmQgTlVNQSBub2RlIGZvciBWRFNPIGdldGNwdSAodXNlciB2aXNpYmxlKQogICoJLSBTUFJHOCBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBzY3JhdGNoCiAgKgktIFNQUkc5IGRlYnVnIGV4Y2VwdGlvbiBzY3JhdGNoCiAgKgpAQCAtOTQwLDYgKzk0Niw4IEBACiAjZGVmaW5lIFNQUk5fU1BSR19TQ1JBVENIMAlTUFJOX1NQUkcyCiAjZGVmaW5lIFNQUk5fU1BSR19IUEFDQQkJU1BSTl9IU1BSRzAKICNkZWZpbmUgU1BSTl9TUFJHX0hTQ1JBVENIMAlTUFJOX0hTUFJHMQorI2RlZmluZSBTUFJOX1NQUkdfVkRTT19SRUFECVNQUk5fVVNQUkczCisjZGVmaW5lIFNQUk5fU1BSR19WRFNPX1dSSVRFCVNQUk5fU1BSRzMKIAogI2RlZmluZSBHRVRfUEFDQShyWCkJCQkJCVwKIAlCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoNjYpOwkJCVwKQEAgLTk4Myw2ICs5OTEsOCBAQAogI2RlZmluZSBTUFJOX1NQUkdfVExCX1NDUkFUQ0gJU1BSTl9TUFJHNgogI2RlZmluZSBTUFJOX1NQUkdfR0VOX1NDUkFUQ0gJU1BSTl9TUFJHMAogI2RlZmluZSBTUFJOX1NQUkdfR0RCRUxMX1NDUkFUQ0ggU1BSTl9TUFJHX0dFTl9TQ1JBVENICisjZGVmaW5lIFNQUk5fU1BSR19WRFNPX1JFQUQJU1BSTl9VU1BSRzcKKyNkZWZpbmUgU1BSTl9TUFJHX1ZEU09fV1JJVEUJU1BSTl9TUFJHNwogCiAjZGVmaW5lIFNFVF9QQUNBKHJYKQltdHNwcglTUFJOX1NQUkdfUEFDQSxyWAogI2RlZmluZSBHRVRfUEFDQShyWCkJbWZzcHIJclgsU1BSTl9TUFJHX1BBQ0EKQEAgLTExMDIsNiArMTExMiw4IEBACiAjZGVmaW5lIFBWUl84NTYwCTB4ODAyMDAwMDAKICNkZWZpbmUgUFZSX1ZFUl9FNTAwVjEJMHg4MDIwCiAjZGVmaW5lIFBWUl9WRVJfRTUwMFYyCTB4ODAyMQorI2RlZmluZSBQVlJfVkVSX0U1MDBNQwkweDgwMjMKKyNkZWZpbmUgUFZSX1ZFUl9FNTUwMAkweDgwMjQKICNkZWZpbmUgUFZSX1ZFUl9FNjUwMAkweDgwNDAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCmluZGV4IDliZDUyYzYuLmEwZTFhZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaApAQCAtMjgzLDYgKzI4Myw3IEBACiAKICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKIGV4dGVybiBpbnQgcHNlcmllc19kZXZpY2V0cmVlX3VwZGF0ZShzMzIgc2NvcGUpOworZXh0ZXJuIHZvaWQgcG9zdF9tb2JpbGl0eV9maXh1cCh2b2lkKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19SVEFTX0RBRU1PTgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IDA4NGUwODAuLmZmNTEwNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKQEAgLTEyMCw3ICsxMjAsNyBAQAogICogaW4gL3Byb2MvaW50ZXJydXB0cyB3aWxsIGJlIHdyb25nISEhIC0tVHJveSAqLwogI2RlZmluZSBQUENfTVNHX0NBTExfRlVOQ1RJT04gICAwCiAjZGVmaW5lIFBQQ19NU0dfUkVTQ0hFRFVMRSAgICAgIDEKLSNkZWZpbmUgUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFCTIKKyNkZWZpbmUgUFBDX01TR19USUNLX0JST0FEQ0FTVAkyCiAjZGVmaW5lIFBQQ19NU0dfREVCVUdHRVJfQlJFQUsgIDMKIAogLyogZm9yIGlycSBjb250cm9sbGVycyB0aGF0IGhhdmUgZGVkaWNhdGVkIGlwaXMgcGVyIG1lc3NhZ2UgKDQpICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGltZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RpbWUuaAppbmRleCBjMWYyNjc2Li4xZDQyOGU2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RpbWUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGltZS5oCkBAIC0yOCw2ICsyOCw3IEBACiBzdHJ1Y3QgcnRjX3RpbWU7CiBleHRlcm4gdm9pZCB0b190bShpbnQgdGltLCBzdHJ1Y3QgcnRjX3RpbWUgKiB0bSk7CiBleHRlcm4gdm9pZCBHcmVnb3JpYW5EYXkoc3RydWN0IHJ0Y190aW1lICp0bSk7CitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9pcGlfaGFuZGxlcih2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZ2VuZXJpY19jYWxpYnJhdGVfZGVjcih2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCBkMGI1ZmNhLi5jOTIwMjE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtOTksNyArOTksNiBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotI2RlZmluZSBzbXRfY2FwYWJsZSgpCQkoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKIAogI2lmZGVmIENPTkZJR19QUEM2NAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBiNWFhY2Y3Li5kYmE4MTQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIAlERUZJTkUoUEFDQV9TWVNURU1fVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzeXN0ZW1fdGltZSkpOwogCURFRklORShQQUNBX1RSQVBfU0FWRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB0cmFwX3NhdmUpKTsKIAlERUZJTkUoUEFDQV9OQVBTVEFURUxPU1QsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgbmFwX3N0YXRlX2xvc3QpKTsKLQlERUZJTkUoUEFDQV9TUFJHMywgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzcHJnMykpOworCURFRklORShQQUNBX1NQUkdfVkRTTywgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzcHJnX3Zkc28pKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCS8qIFJUQVMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5jCmluZGV4IDI5MTJiODcuLjQwMTk4ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYwpAQCAtNzU2LDcgKzc1NiwxMCBAQAogCWNhY2hlaW5mb19zeXNmc19wb3B1bGF0ZShjcHVfaWQsIGNhY2hlKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAvKiBmdW5jdGlvbnMgbmVlZGVkIGZvciBjcHUgb2ZmbGluZSAqLworLyogZnVuY3Rpb25zIG5lZWRlZCB0byByZW1vdmUgY2FjaGUgZW50cnkgZm9yIGNwdSBvZmZsaW5lIG9yIHN1c3BlbmQvcmVzdW1lICovCisKKyNpZiAoZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpICYmIGRlZmluZWQoQ09ORklHX1NVU1BFTkQpKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCiAKIHN0YXRpYyBzdHJ1Y3QgY2FjaGUgKmNhY2hlX2xvb2t1cF9ieV9jcHUodW5zaWduZWQgaW50IGNwdV9pZCkKIHsKQEAgLTg0Myw0ICs4NDYsNCBAQAogCWlmIChjYWNoZSkKIAkJY2FjaGVfY3B1X2NsZWFyKGNhY2hlLCBjcHVfaWQpOwogfQotI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworI2VuZGlmIC8qIChDT05GSUdfUFBDX1BTRVJJRVMgJiYgQ09ORklHX1NVU1BFTkQpIHx8IENPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDZjOGRkNWQuLmMxZmFhZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTUxMCw3ICs1MTAsNyBAQAogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwNGIwMDAwLAogCQkuY3B1X25hbWUJCT0gIlBPV0VSOEUgKHJhdykiLAotCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSOCwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QT1dFUjhFLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QT1dFUjgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlczIJPSBDT01NT05fVVNFUjJfUE9XRVI4LAogCQkubW11X2ZlYXR1cmVzCQk9IE1NVV9GVFJTX1BPV0VSOCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX2RyaXZlci5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZHJpdmVyLmMKaW5kZXggZmRjNjc5ZC4uYmI2MWNhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZHJpdmVyLmMKQEAgLTE0MywxMyArMTQzLDMwIEBACiBzdGF0aWMgdm9pZCBlZWhfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBlZWhfZGV2ICplZGV2ID0gcGNpX2Rldl90b19lZWhfZGV2KGRldik7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJaWYgKChlZGV2LT5tb2RlKSAmIEVFSF9ERVZfSVJRX0RJU0FCTEVEKSB7CiAJCWVkZXYtPm1vZGUgJj0gfkVFSF9ERVZfSVJRX0RJU0FCTEVEOwotCi0JCWRlc2MgPSBpcnFfdG9fZGVzYyhkZXYtPmlycSk7Ci0JCWlmIChkZXNjICYmIGRlc2MtPmRlcHRoID4gMCkKKwkJLyoKKwkJICogRklYTUUgISEhISEKKwkJICoKKwkJICogVGhpcyBpcyBqdXN0IGFzcyBiYWNrd2FyZHMuIFRoaXMgbWF6ZSBoYXMKKwkJICogdW5iYWxhbmNlZCBpcnFfZW5hYmxlL2Rpc2FibGUgY2FsbHMuIFNvIGluc3RlYWQgb2YKKwkJICogZmluZGluZyB0aGUgcm9vdCBjYXVzZSBpdCB3b3JrcyBhcm91bmQgdGhlIHdhcm5pbmcKKwkJICogaW4gdGhlIGlycV9lbmFibGUgY29kZSBieSBjb25kaXRpb25hbGx5IGNhbGxpbmcKKwkJICogaW50byBpdC4KKwkJICoKKwkJICogVGhhdCdzIGp1c3Qgd3JvbmcuVGhlIHdhcm5pbmcgaW4gdGhlIGNvcmUgY29kZSBpcworCQkgKiB0aGVyZSB0byB0ZWxsIHBlb3BsZSB0byBmaXggdGhlaXIgYXNzeW1ldHJpZXMgaW4KKwkJICogdGhlaXIgb3duIGNvZGUsIG5vdCBieSBhYnVzaW5nIHRoZSBjb3JlIGluZm9ybWF0aW9uCisJCSAqIHRvIGF2b2lkIGl0LgorCQkgKgorCQkgKiBJIHNvIHdpc2ggdGhhdCB0aGUgYXNzeW1ldHJ5IHdvdWxkIGJlIHRoZSBvdGhlciB3YXkKKwkJICogcm91bmQgYW5kIGEgZmV3IG1vcmUgaXJxX2Rpc2FibGUgY2FsbHMgcmVuZGVyIHRoYXQKKwkJICogc2hpdCB1bnVzYWJsZSBmb3JldmVyLgorCQkgKgorCQkgKgl0Z2x4CisJCSAqLworCQlpZiAoaXJxZF9pcnFfZGlzYWJsZWQoaXJxX2dldF9pcnFfZGF0YShkZXYtPmlycSkpKQogCQkJZW5hYmxlX2lycShkZXYtPmlycSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TCmluZGV4IDA2M2I2NWQuLmMxYmVlM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMKQEAgLTM0LDcgKzM0LDI1MCBAQAogICogICAgIHNwZWNpYWwgaW50ZXJydXB0cyBmcm9tIHdpdGhpbiBhIG5vbi1zdGFuZGFyZCBsZXZlbCB3aWxsIHByb2JhYmx5CiAgKiAgICAgYmxvdyB5b3UgdXAKICAqLwotI2RlZmluZQlTUEVDSUFMX0VYQ19GUkFNRV9TSVpFCUlOVF9GUkFNRV9TSVpFCisjZGVmaW5lIFNQRUNJQUxfRVhDX1NSUjAJMAorI2RlZmluZSBTUEVDSUFMX0VYQ19TUlIxCTEKKyNkZWZpbmUgU1BFQ0lBTF9FWENfU1BSR19HRU4JMgorI2RlZmluZSBTUEVDSUFMX0VYQ19TUFJHX1RMQgkzCisjZGVmaW5lIFNQRUNJQUxfRVhDX01BUzAJNAorI2RlZmluZSBTUEVDSUFMX0VYQ19NQVMxCTUKKyNkZWZpbmUgU1BFQ0lBTF9FWENfTUFTMgk2CisjZGVmaW5lIFNQRUNJQUxfRVhDX01BUzMJNworI2RlZmluZSBTUEVDSUFMX0VYQ19NQVM2CTgKKyNkZWZpbmUgU1BFQ0lBTF9FWENfTUFTNwk5CisjZGVmaW5lIFNQRUNJQUxfRVhDX01BUzUJMTAJLyogRS5IViBvbmx5ICovCisjZGVmaW5lIFNQRUNJQUxfRVhDX01BUzgJMTEJLyogRS5IViBvbmx5ICovCisjZGVmaW5lIFNQRUNJQUxfRVhDX0lSUUhBUFBFTkVECTEyCisjZGVmaW5lIFNQRUNJQUxfRVhDX0RFQVIJMTMKKyNkZWZpbmUgU1BFQ0lBTF9FWENfRVNSCQkxNAorI2RlZmluZSBTUEVDSUFMX0VYQ19TT0ZURQkxNQorI2RlZmluZSBTUEVDSUFMX0VYQ19DU1JSMAkxNgorI2RlZmluZSBTUEVDSUFMX0VYQ19DU1JSMQkxNworLyogbXVzdCBiZSBldmVuIHRvIGtlZXAgMTYtYnl0ZSBzdGFjayBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgU1BFQ0lBTF9FWENfRU5ECQkxOAorCisjZGVmaW5lIFNQRUNJQUxfRVhDX0ZSQU1FX1NJWkUJKElOVF9GUkFNRV9TSVpFICsgU1BFQ0lBTF9FWENfRU5EICogOCkKKyNkZWZpbmUgU1BFQ0lBTF9FWENfRlJBTUVfT0ZGUyAgKElOVF9GUkFNRV9TSVpFIC0gMjg4KQorCisjZGVmaW5lIFNQRUNJQUxfRVhDX1NUT1JFKHJlZywgbmFtZSkgXAorCXN0ZAlyZWcsIChTUEVDSUFMX0VYQ18jI25hbWUgKiA4ICsgU1BFQ0lBTF9FWENfRlJBTUVfT0ZGUykocjEpCisKKyNkZWZpbmUgU1BFQ0lBTF9FWENfTE9BRChyZWcsIG5hbWUpIFwKKwlsZAlyZWcsIChTUEVDSUFMX0VYQ18jI25hbWUgKiA4ICsgU1BFQ0lBTF9FWENfRlJBTUVfT0ZGUykocjEpCisKK3NwZWNpYWxfcmVnX3NhdmU6CisJbGJ6CXI5LFBBQ0FJUlFIQVBQRU5FRChyMTMpCisJUkVDT05DSUxFX0lSUV9TVEFURShyMyxyNCkKKworCS8qCisJICogV2Ugb25seSBuZWVkIChvciBoYXZlIHN0YWNrIHNwYWNlKSB0byBzYXZlIHRoaXMgc3R1ZmYgaWYKKwkgKiB3ZSBpbnRlcnJ1cHRlZCB0aGUga2VybmVsLgorCSAqLworCWxkCXIzLF9NU1IocjEpCisJYW5kaS4JcjMscjMsTVNSX1BSCisJYm5lbHIKKworCS8qIENvcHkgaW5mbyBpbnRvIHRlbXBvcmFyeSBleGNlcHRpb24gdGhyZWFkIGluZm8gKi8KKwlsZAlyMTEsUEFDQUtTQVZFKHIxMykKKwlDVVJSRU5UX1RIUkVBRF9JTkZPKHIxMSwgcjExKQorCUNVUlJFTlRfVEhSRUFEX0lORk8ocjEyLCByMSkKKwlsZAlyMTAsVElfRkxBR1MocjExKQorCXN0ZAlyMTAsVElfRkxBR1MocjEyKQorCWxkCXIxMCxUSV9QUkVFTVBUKHIxMSkKKwlzdGQJcjEwLFRJX1BSRUVNUFQocjEyKQorCWxkCXIxMCxUSV9UQVNLKHIxMSkKKwlzdGQJcjEwLFRJX1RBU0socjEyKQorCisJLyoKKwkgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IFRMQiBleGNlcHRpb24gZnJhbWUgZm9yIGhhbmRsZXIKKwkgKiB0eXBlcyB0aGF0IGRvbid0IGRvIGl0IGF1dG9tYXRpY2FsbHkuCisJICovCisJTE9BRF9SRUdfQUREUihyMTEsZXh0bGJfbGV2ZWxfZXhjKQorCWx3eglyMTIsMChyMTEpCisJbWZzcHIJcjEwLFNQUk5fU1BSR19UTEJfRVhGUkFNRQorCWFkZAlyMTAscjEwLHIxMgorCW10c3ByCVNQUk5fU1BSR19UTEJfRVhGUkFNRSxyMTAKKworCS8qCisJICogU2F2ZSByZWdpc3RlcnMgbmVlZGVkIHRvIGFsbG93IG5lc3Rpbmcgb2YgY2VydGFpbiBleGNlcHRpb25zCisJICogKHN1Y2ggYXMgVExCIG1pc3NlcykgaW5zaWRlIHNwZWNpYWwgZXhjZXB0aW9uIGxldmVscworCSAqLworCW1mc3ByCXIxMCxTUFJOX1NSUjAKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsU1JSMCkKKwltZnNwcglyMTAsU1BSTl9TUlIxCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLFNSUjEpCisJbWZzcHIJcjEwLFNQUk5fU1BSR19HRU5fU0NSQVRDSAorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxTUFJHX0dFTikKKwltZnNwcglyMTAsU1BSTl9TUFJHX1RMQl9TQ1JBVENICisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLFNQUkdfVExCKQorCW1mc3ByCXIxMCxTUFJOX01BUzAKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsTUFTMCkKKwltZnNwcglyMTAsU1BSTl9NQVMxCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLE1BUzEpCisJbWZzcHIJcjEwLFNQUk5fTUFTMgorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxNQVMyKQorCW1mc3ByCXIxMCxTUFJOX01BUzMKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsTUFTMykKKwltZnNwcglyMTAsU1BSTl9NQVM2CisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLE1BUzYpCisJbWZzcHIJcjEwLFNQUk5fTUFTNworCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxNQVM3KQorQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyMTAsU1BSTl9NQVM1CisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLE1BUzUpCisJbWZzcHIJcjEwLFNQUk5fTUFTOAorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxNQVM4KQorCisJLyogTUFTNS84IGNvdWxkIGhhdmUgaW5hcHByb3ByaWF0ZSB2YWx1ZXMgaWYgd2UgaW50ZXJydXB0ZWQgS1ZNIGNvZGUgKi8KKwlsaQlyMTAsMAorCW10c3ByCVNQUk5fTUFTNSxyMTAKKwltdHNwcglTUFJOX01BUzgscjEwCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9FTUJfSFYpCisJU1BFQ0lBTF9FWENfU1RPUkUocjksSVJRSEFQUEVORUQpCisKKwltZnNwcglyMTAsU1BSTl9ERUFSCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLERFQVIpCisJbWZzcHIJcjEwLFNQUk5fRVNSCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLEVTUikKKworCWxieglyMTAsUEFDQVNPRlRJUlFFTihyMTMpCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLFNPRlRFKQorCWxkCXIxMCxfTklQKHIxKQorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxDU1JSMCkKKwlsZAlyMTAsX01TUihyMSkKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsQ1NSUjEpCisKKwlibHIKKworcmV0X2Zyb21fbGV2ZWxfZXhjZXB0OgorCWxkCXIzLF9NU1IocjEpCisJYW5kaS4JcjMscjMsTVNSX1BSCisJYmVxCTFmCisJYglyZXRfZnJvbV9leGNlcHQKKzE6CisKKwlMT0FEX1JFR19BRERSKHIxMSxleHRsYl9sZXZlbF9leGMpCisJbHd6CXIxMiwwKHIxMSkKKwltZnNwcglyMTAsU1BSTl9TUFJHX1RMQl9FWEZSQU1FCisJc3ViCXIxMCxyMTAscjEyCisJbXRzcHIJU1BSTl9TUFJHX1RMQl9FWEZSQU1FLHIxMAorCisJLyoKKwkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNwZWNpYWwgbGV2ZWwgZXhjZXB0aW9uIGludGVycnVwdGVkIGEKKwkgKiBUTEIgbWlzcyBoYW5kbGVyLCBhbmQgaW5zZXJ0ZWQgdGhlIHNhbWUgZW50cnkgdGhhdCB0aGUKKwkgKiBpbnRlcnJ1cHRlZCBoYW5kbGVyIHdhcyBhYm91dCB0byBpbnNlcnQuICBPbiBDUFVzIHdpdGhvdXQgVExCCisJICogd3JpdGUgY29uZGl0aW9uYWwsIHRoaXMgY2FuIHJlc3VsdCBpbiBhIGR1cGxpY2F0ZSBUTEIgZW50cnkuCisJICogV2lwZSBhbGwgbm9uLWJvbHRlZCBlbnRyaWVzIHRvIGJlIHNhZmUuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHByb3RlY3QgYWdhaW5zdCBhbnkgVExCIG1pc3NlcworCSAqIHdlIG1heSB0YWtlIGFjY2Vzc2luZyB0aGUgc3RhY2sgZnJvbSBoZXJlIHRvIHRoZSBlbmQgb2YKKwkgKiB0aGUgc3BlY2lhbCBsZXZlbCBleGNlcHRpb24uICBJdCdzIG5vdCBjbGVhciBob3cgd2UgY2FuCisJICogcmVhc29uYWJseSBwcm90ZWN0IGFnYWluc3QgdGhhdCwgYnV0IG9ubHkgQ1BVcyB3aXRoCisJICogbmVpdGhlciBUTEIgd3JpdGUgY29uZGl0aW9uYWwgbm9yIGJvbHRlZCBrZXJuZWwgbWVtb3J5CisJICogYXJlIGFmZmVjdGVkLiAgRG8gYW55IHN1Y2ggQ1BVcyBldmVuIGV4aXN0PworCSAqLworCVBQQ19UTEJJTFhfQUxMKDAsUjApCisKKwlSRVNUX05WR1BSUyhyMSkKKworCVNQRUNJQUxfRVhDX0xPQUQocjEwLFNSUjApCisJbXRzcHIJU1BSTl9TUlIwLHIxMAorCVNQRUNJQUxfRVhDX0xPQUQocjEwLFNSUjEpCisJbXRzcHIJU1BSTl9TUlIxLHIxMAorCVNQRUNJQUxfRVhDX0xPQUQocjEwLFNQUkdfR0VOKQorCW10c3ByCVNQUk5fU1BSR19HRU5fU0NSQVRDSCxyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxTUFJHX1RMQikKKwltdHNwcglTUFJOX1NQUkdfVExCX1NDUkFUQ0gscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTMCkKKwltdHNwcglTUFJOX01BUzAscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTMSkKKwltdHNwcglTUFJOX01BUzEscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTMikKKwltdHNwcglTUFJOX01BUzIscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTMykKKwltdHNwcglTUFJOX01BUzMscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTNikKKwltdHNwcglTUFJOX01BUzYscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTNykKKwltdHNwcglTUFJOX01BUzcscjEwCitCRUdJTl9GVFJfU0VDVElPTgorCVNQRUNJQUxfRVhDX0xPQUQocjEwLE1BUzUpCisJbXRzcHIJU1BSTl9NQVM1LHIxMAorCVNQRUNJQUxfRVhDX0xPQUQocjEwLE1BUzgpCisJbXRzcHIJU1BSTl9NQVM4LHIxMAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfRU1CX0hWKQorCisJbGJ6CXI2LFBBQ0FTT0ZUSVJRRU4ocjEzKQorCWxkCXI1LFNPRlRFKHIxKQorCisJLyogSW50ZXJydXB0cyBoYWQgYmV0dGVyIG5vdCBhbHJlYWR5IGJlIGVuYWJsZWQuLi4gKi8KKwl0d25laQlyNiwwCisKKwljbXB3aQljcjAscjUsMAorCWJlcQkxZgorCisJVFJBQ0VfRU5BQkxFX0lOVFMKKwlzdGIJcjUsUEFDQVNPRlRJUlFFTihyMTMpCisxOgorCS8qCisJICogUmVzdG9yZSBQQUNBSVJRSEFQUEVORUQgcmF0aGVyIHRoYW4gc2V0dGluZyBpdCBiYXNlZCBvbgorCSAqIHRoZSByZXR1cm4gTVNSW0VFXSwgc2luY2Ugd2UgY291bGQgaGF2ZSBpbnRlcnJ1cHRlZAorCSAqIF9fY2hlY2tfaXJxX3JlcGxheSgpIG9yIG90aGVyIGluY29uc2lzdGVudCB0cmFuc2l0b3J5CisJICogc3RhdGVzIHRoYXQgbXVzdCByZW1haW4gdGhhdCB3YXkuCisJICovCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsSVJRSEFQUEVORUQpCisJc3RiCXIxMCxQQUNBSVJRSEFQUEVORUQocjEzKQorCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsREVBUikKKwltdHNwcglTUFJOX0RFQVIscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsRVNSKQorCW10c3ByCVNQUk5fRVNSLHIxMAorCisJc3RkY3guCXIwLDAscjEJCS8qIHRvIGNsZWFyIHRoZSByZXNlcnZhdGlvbiAqLworCisJUkVTVF80R1BSUygyLCByMSkKKwlSRVNUXzRHUFJTKDYsIHIxKQorCisJbGQJcjEwLF9DVFIocjEpCisJbGQJcjExLF9YRVIocjEpCisJbXRjdHIJcjEwCisJbXR4ZXIJcjExCisKKwlibHIKKworLm1hY3JvIHJldF9mcm9tX2xldmVsIHNycjAgc3JyMSBwYWNhX2V4IHNjcmF0Y2gKKwlibAlyZXRfZnJvbV9sZXZlbF9leGNlcHQKKworCWxkCXIxMCxfTElOSyhyMSkKKwlsZAlyMTEsX0NDUihyMSkKKwlsZAlyMCxHUFIxMyhyMSkKKwltdGxyCXIxMAorCW10Y3IJcjExCisKKwlsZAlyMTAsR1BSMTAocjEpCisJbGQJcjExLEdQUjExKHIxKQorCWxkCXIxMixHUFIxMihyMSkKKwltdHNwcglcc2NyYXRjaCxyMAorCisJc3RkCXIxMCxccGFjYV9leCtFWF9SMTAocjEzKTsKKwlzdGQJcjExLFxwYWNhX2V4K0VYX1IxMShyMTMpOworCWxkCXIxMCxfTklQKHIxKQorCWxkCXIxMSxfTVNSKHIxKQorCWxkCXIwLEdQUjAocjEpCisJbGQJcjEsR1BSMShyMSkKKwltdHNwcglcc3JyMCxyMTAKKwltdHNwcglcc3JyMSxyMTEKKwlsZAlyMTAsXHBhY2FfZXgrRVhfUjEwKHIxMykKKwlsZAlyMTEsXHBhY2FfZXgrRVhfUjExKHIxMykKKwltZnNwcglyMTMsXHNjcmF0Y2gKKy5lbmRtCisKK3JldF9mcm9tX2NyaXRfZXhjZXB0OgorCXJldF9mcm9tX2xldmVsIFNQUk5fQ1NSUjAgU1BSTl9DU1JSMSBQQUNBX0VYQ1JJVCBTUFJOX1NQUkdfQ1JJVF9TQ1JBVENICisJcmZjaQorCityZXRfZnJvbV9tY19leGNlcHQ6CisJcmV0X2Zyb21fbGV2ZWwgU1BSTl9NQ1NSUjAgU1BSTl9NQ1NSUjEgUEFDQV9FWE1DIFNQUk5fU1BSR19NQ19TQ1JBVENICisJcmZtY2kKIAogLyogRXhjZXB0aW9uIHByb2xvZyBjb2RlIGZvciBhbGwgZXhjZXB0aW9ucyAqLwogI2RlZmluZSBFWENFUFRJT05fUFJPTE9HKG4sIGludG51bSwgdHlwZSwgYWRkaXRpb24pCSAgICAJCSAgICBcCkBAIC00Miw3ICsyODUsNiBAQAogCW1mc3ByCXIxMyxTUFJOX1NQUkdfUEFDQTsJLyogZ2V0IFBBQ0EgKi8JCQkgICAgXAogCXN0ZAlyMTAsUEFDQV9FWCMjdHlwZStFWF9SMTAocjEzKTsJCQkJICAgIFwKIAlzdGQJcjExLFBBQ0FfRVgjI3R5cGUrRVhfUjExKHIxMyk7CQkJCSAgICBcCi0JUFJPTE9HX1NUT1JFX1JFU1RPUkVfU0NSQVRDSF8jI3R5cGU7CQkJCSAgICBcCiAJbWZjcglyMTA7CQkJLyogc2F2ZSBDUiAqLwkJCSAgICBcCiAJbWZzcHIJcjExLFNQUk5fIyN0eXBlIyNfU1JSMTsvKiB3aGF0IGFyZSB3ZSBjb21pbmcgZnJvbSAqLwkgICAgXAogCURPX0tWTQlpbnRudW0sU1BSTl8jI3R5cGUjI19TUlIxOyAgICAvKiBLVk0gaG9vayAqLwkJICAgIFwKQEAgLTY5LDE5ICszMTEsMTkgQEAKIAogI2RlZmluZSBDUklUX1NFVF9LU1RBQ0sJCQkJCQkgICAgICAgICAgICBcCiAJbGQJcjEsUEFDQV9DUklUX1NUQUNLKHIxMyk7CQkJCSAgICBcCi0Jc3ViaQlyMSxyMSxTUEVDSUFMX0VYQ19GUkFNRV9TSVpFOworCXN1YmkJcjEscjEsU1BFQ0lBTF9FWENfRlJBTUVfU0laRQogI2RlZmluZSBTUFJOX0NSSVRfU1JSMAlTUFJOX0NTUlIwCiAjZGVmaW5lIFNQUk5fQ1JJVF9TUlIxCVNQUk5fQ1NSUjEKIAogI2RlZmluZSBEQkdfU0VUX0tTVEFDSwkJCQkJCSAgICAgICAgICAgIFwKIAlsZAlyMSxQQUNBX0RCR19TVEFDSyhyMTMpOwkJCQkJICAgIFwKLQlzdWJpCXIxLHIxLFNQRUNJQUxfRVhDX0ZSQU1FX1NJWkU7CisJc3ViaQlyMSxyMSxTUEVDSUFMX0VYQ19GUkFNRV9TSVpFCiAjZGVmaW5lIFNQUk5fREJHX1NSUjAJU1BSTl9EU1JSMAogI2RlZmluZSBTUFJOX0RCR19TUlIxCVNQUk5fRFNSUjEKIAogI2RlZmluZSBNQ19TRVRfS1NUQUNLCQkJCQkJICAgICAgICAgICAgXAogCWxkCXIxLFBBQ0FfTUNfU1RBQ0socjEzKTsJCQkJCSAgICBcCi0Jc3ViaQlyMSxyMSxTUEVDSUFMX0VYQ19GUkFNRV9TSVpFOworCXN1YmkJcjEscjEsU1BFQ0lBTF9FWENfRlJBTUVfU0laRQogI2RlZmluZSBTUFJOX01DX1NSUjAJU1BSTl9NQ1NSUjAKICNkZWZpbmUgU1BSTl9NQ19TUlIxCVNQUk5fTUNTUlIxCiAKQEAgLTEwMCwyMCArMzQyLDYgQEAKICNkZWZpbmUgR0RCRUxMX0VYQ0VQVElPTl9QUk9MT0cobiwgaW50bnVtLCBhZGRpdGlvbikJCQkgICAgXAogCUVYQ0VQVElPTl9QUk9MT0cobiwgaW50bnVtLCBHREJFTEwsIGFkZGl0aW9uIyNfR0RCRUxMKG4pKQogCi0vKgotICogU3RvcmUgdXNlci12aXNpYmxlIHNjcmF0Y2ggaW4gUEFDQSBleGNlcHRpb24gc2xvdHMgYW5kIHJlc3RvcmUgcHJvcGVyIHZhbHVlCi0gKi8KLSNkZWZpbmUgUFJPTE9HX1NUT1JFX1JFU1RPUkVfU0NSQVRDSF9HRU4KLSNkZWZpbmUgUFJPTE9HX1NUT1JFX1JFU1RPUkVfU0NSQVRDSF9HREJFTEwKLSNkZWZpbmUgUFJPTE9HX1NUT1JFX1JFU1RPUkVfU0NSQVRDSF9EQkcKLSNkZWZpbmUgUFJPTE9HX1NUT1JFX1JFU1RPUkVfU0NSQVRDSF9NQwotCi0jZGVmaW5lIFBST0xPR19TVE9SRV9SRVNUT1JFX1NDUkFUQ0hfQ1JJVAkJCQkgICAgXAotCW1mc3ByCXIxMCxTUFJOX1NQUkdfQ1JJVF9TQ1JBVENIOwkvKiBnZXQgcjEzICovCQkgICAgXAotCXN0ZAlyMTAsUEFDQV9FWENSSVQrRVhfUjEzKHIxMyk7CQkJCSAgICBcCi0JbGQJcjExLFBBQ0FfU1BSRzMocjEzKTsJCQkJCSAgICBcCi0JbXRzcHIJU1BSTl9TUFJHX0NSSVRfU0NSQVRDSCxyMTE7Ci0KIC8qIFZhcmlhbnRzIG9mIHRoZSAiYWRkaXRpb24iIGFyZ3VtZW50IGZvciB0aGUgcHJvbG9nCiAgKi8KICNkZWZpbmUgUFJPTE9HX0FERElUSU9OX05PTkVfR0VOKG4pCkBAIC0xNDcsMTAgKzM3NSw4IEBACiAJc3RkCXIxNSxQQUNBX0VYTUMrRVhfUjE1KHIxMykKIAogCi0vKiBDb3JlIGV4Y2VwdGlvbiBjb2RlIGZvciBhbGwgZXhjZXB0aW9ucyBleGNlcHQgVExCIG1pc3Nlcy4KLSAqIFhYWDogTmVlZHMgdG8gbWFrZSBTUFJOX1NQUkdfR0VOIGRlcGVuZCBvbiBleGNlcHRpb24gdHlwZQotICovCi0jZGVmaW5lIEVYQ0VQVElPTl9DT01NT04obiwgZXhjZiwgaW50cykJCQkJCSAgICBcCisvKiBDb3JlIGV4Y2VwdGlvbiBjb2RlIGZvciBhbGwgZXhjZXB0aW9ucyBleGNlcHQgVExCIG1pc3Nlcy4gKi8KKyNkZWZpbmUgRVhDRVBUSU9OX0NPTU1PTl9MVkwobiwgc2NyYXRjaCwgZXhjZikJCQkJICAgIFwKIGV4Y18jI24jI19jb21tb246CQkJCQkJCSAgICBcCiAJc3RkCXIwLEdQUjAocjEpOwkJLyogc2F2ZSByMCBpbiBzdGFja2ZyYW1lICovCSAgICBcCiAJc3RkCXIyLEdQUjIocjEpOwkJLyogc2F2ZSByMiBpbiBzdGFja2ZyYW1lICovCSAgICBcCkBAIC0xNjMsNyArMzg5LDcgQEAKIAlBQ0NPVU5UX0NQVV9VU0VSX0VOVFJZKHIxMCxyMTEpOy8qIGFjY291bnRpbmcgKHVzZXMgY3IwK2VxKSAqLwkgICAgXAogMjoJbGQJcjMsZXhjZitFWF9SMTAocjEzKTsJLyogZ2V0IGJhY2sgcjEwICovCQkgICAgXAogCWxkCXI0LGV4Y2YrRVhfUjExKHIxMyk7CS8qIGdldCBiYWNrIHIxMSAqLwkJICAgIFwKLQltZnNwcglyNSxTUFJOX1NQUkdfR0VOX1NDUkFUQ0g7LyogZ2V0IGJhY2sgcjEzICovCQkgICAgXAorCW1mc3ByCXI1LHNjcmF0Y2g7CQkvKiBnZXQgYmFjayByMTMgKi8JCSAgICBcCiAJc3RkCXIxMixHUFIxMihyMSk7CQkvKiBzYXZlIHIxMiBpbiBzdGFja2ZyYW1lICovCSAgICBcCiAJbGQJcjIsUEFDQVRPQyhyMTMpOwkvKiBnZXQga2VybmVsIFRPQyBpbnRvIHIyICovCSAgICBcCiAJbWZscglyNjsJCQkvKiBzYXZlIExSIGluIHN0YWNrZnJhbWUgKi8JICAgIFwKQEAgLTE4NywyNCArNDEzLDI5IEBACiAJc3RkCXIxMSxTT0ZURShyMSk7CQkvKiBhbmQgc2F2ZSBpdCB0byBzdGFja2ZyYW1lICovICAgICBcCiAJc3RkCXIxMixTVEFDS19GUkFNRV9PVkVSSEVBRC0xNihyMSk7IC8qIG1hcmsgdGhlIGZyYW1lICovCSAgICBcCiAJc3RkCXIzLF9UUkFQKHIxKTsJCS8qIHNldCB0cmFwIG51bWJlcgkJKi8gIFwKLQlzdGQJcjAsUkVTVUxUKHIxKTsJCS8qIGNsZWFyIHJlZ3MtPnJlc3VsdCAqLwkgICAgXAotCWludHM7CisJc3RkCXIwLFJFU1VMVChyMSk7CQkvKiBjbGVhciByZWdzLT5yZXN1bHQgKi8KIAotLyogVmFyaWFudHMgZm9yIHRoZSAiaW50cyIgYXJndW1lbnQuIFRoaXMgb25lIGRvZXMgbm90aGluZyB3aGVuIHdlIHdhbnQKLSAqIHRvIGtlZXAgaW50ZXJydXB0cyBpbiB0aGVpciBvcmlnaW5hbCBzdGF0ZQotICovCi0jZGVmaW5lIElOVFNfS0VFUAorI2RlZmluZSBFWENFUFRJT05fQ09NTU9OKG4pIFwKKwlFWENFUFRJT05fQ09NTU9OX0xWTChuLCBTUFJOX1NQUkdfR0VOX1NDUkFUQ0gsIFBBQ0FfRVhHRU4pCisjZGVmaW5lIEVYQ0VQVElPTl9DT01NT05fQ1JJVChuKSBcCisJRVhDRVBUSU9OX0NPTU1PTl9MVkwobiwgU1BSTl9TUFJHX0NSSVRfU0NSQVRDSCwgUEFDQV9FWENSSVQpCisjZGVmaW5lIEVYQ0VQVElPTl9DT01NT05fTUMobikgXAorCUVYQ0VQVElPTl9DT01NT05fTFZMKG4sIFNQUk5fU1BSR19NQ19TQ1JBVENILCBQQUNBX0VYTUMpCisjZGVmaW5lIEVYQ0VQVElPTl9DT01NT05fREJHKG4pIFwKKwlFWENFUFRJT05fQ09NTU9OX0xWTChuLCBTUFJOX1NQUkdfREJHX1NDUkFUQ0gsIFBBQ0FfRVhEQkcpCiAKLS8qIFRoaXMgc2Vjb25kIHZlcnNpb24gaXMgbWVhbnQgZm9yIGV4Y2VwdGlvbnMgdGhhdCBkb24ndCBpbW1lZGlhdGVseQotICogaGFyZC1lbmFibGUuIFdlIHNldCBhIGJpdCBpbiBwYWNhLT5pcnFfaGFwcGVuZWQgdG8gZW5zdXJlIHRoYXQKLSAqIGEgc3Vic2VxdWVudCBjYWxsIHRvIGFyY2hfbG9jYWxfaXJxX3Jlc3RvcmUoKSB3aWxsIHByb3Blcmx5Ci0gKiBoYXJkLWVuYWJsZSBhbmQgYXZvaWQgdGhlIGZhc3QtcGF0aCwgYW5kIHRoZW4gcmVjb25jaWxlIGlycSBzdGF0ZS4KKy8qCisgKiBUaGlzIGlzIG1lYW50IGZvciBleGNlcHRpb25zIHRoYXQgZG9uJ3QgaW1tZWRpYXRlbHkgaGFyZC1lbmFibGUuICBXZQorICogc2V0IGEgYml0IGluIHBhY2EtPmlycV9oYXBwZW5lZCB0byBlbnN1cmUgdGhhdCBhIHN1YnNlcXVlbnQgY2FsbCB0bworICogYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSgpIHdpbGwgcHJvcGVybHkgaGFyZC1lbmFibGUgYW5kIGF2b2lkIHRoZQorICogZmFzdC1wYXRoLCBhbmQgdGhlbiByZWNvbmNpbGUgaXJxIHN0YXRlLgogICovCiAjZGVmaW5lIElOVFNfRElTQUJMRQlSRUNPTkNJTEVfSVJRX1NUQVRFKHIzLHI0KQogCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBleGNlcHRpb25zIHRoYXQgdXNlZCBJTlRTX0tFRVAgKHRoYXQgZGlkIG5vdCB0b3VjaAotICogaXJxIGluZGljYXRvcnMgaW4gdGhlIFBBQ0EpLiBUaGlzIHdpbGwgcmVzdG9yZSBNU1I6RUUgdG8gaXQncyBwcmV2aW91cwotICogdmFsdWUKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSBleGNlcHRpb25zIHRoYXQgZG9uJ3QgdXNlIElOVFNfRElTQUJMRSAodGhhdCBkaWQgbm90CisgKiB0b3VjaCBpcnEgaW5kaWNhdG9ycyBpbiB0aGUgUEFDQSkuICBUaGlzIHdpbGwgcmVzdG9yZSBNU1I6RUUgdG8gaXQncworICogcHJldmlvdXMgdmFsdWUKICAqCiAgKiBYWFggSW4gdGhlIGxvbmcgcnVuLCB3ZSBtYXkgd2FudCB0byBvcGVuLWNvZGUgaXQgaW4gb3JkZXIgdG8gc2VwYXJhdGUgdGhlCiAgKiAgICAgbG9hZCBmcm9tIHRoZSB3cnRlZSwgdGh1cyBsaW1pdGluZyB0aGUgbGF0ZW5jeSBjYXVzZWQgYnkgdGhlIGRlcGVuZGVuY3kKQEAgLTI2Miw3ICs0OTMsOCBAQAogI2RlZmluZSBNQVNLQUJMRV9FWENFUFRJT04odHJhcG51bSwgaW50bnVtLCBsYWJlbCwgaGRsciwgYWNrKQkJXAogCVNUQVJUX0VYQ0VQVElPTihsYWJlbCk7CQkJCQkJXAogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKHRyYXBudW0sIGludG51bSwgUFJPTE9HX0FERElUSU9OX01BU0tBQkxFKVwKLQlFWENFUFRJT05fQ09NTU9OKHRyYXBudW0sIFBBQ0FfRVhHRU4sIElOVFNfRElTQUJMRSkJCVwKKwlFWENFUFRJT05fQ09NTU9OKHRyYXBudW0pCQkJCQlcCisJSU5UU19ESVNBQkxFOwkJCQkJCQlcCiAJYWNrKHI4KTsJCQkJCQkJXAogCUNIRUNLX05BUFBJTkcoKTsJCQkJCQlcCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRDsJCQkJXApAQCAtMjgzLDggKzUxNSw4IEBACiAJLmJhbGlnbgkweDEwMDAKIAkuZ2xvYmwgaW50ZXJydXB0X2Jhc2VfYm9vazNlCiBpbnRlcnJ1cHRfYmFzZV9ib29rM2U6CQkJCQkvKiBmYWtlIHRyYXAgKi8KLQlFWENFUFRJT05fU1RVQigweDAwMCwgbWFjaGluZV9jaGVjaykJCS8qIDB4MDIwMCAqLwotCUVYQ0VQVElPTl9TVFVCKDB4MDIwLCBjcml0aWNhbF9pbnB1dCkJCS8qIDB4MDU4MCAqLworCUVYQ0VQVElPTl9TVFVCKDB4MDAwLCBtYWNoaW5lX2NoZWNrKQorCUVYQ0VQVElPTl9TVFVCKDB4MDIwLCBjcml0aWNhbF9pbnB1dCkJCS8qIDB4MDEwMCAqLwogCUVYQ0VQVElPTl9TVFVCKDB4MDQwLCBkZWJ1Z19jcml0KQkJLyogMHgwZDAwICovCiAJRVhDRVBUSU9OX1NUVUIoMHgwNjAsIGRhdGFfc3RvcmFnZSkJCS8qIDB4MDMwMCAqLwogCUVYQ0VQVElPTl9TVFVCKDB4MDgwLCBpbnN0cnVjdGlvbl9zdG9yYWdlKQkvKiAweDA0MDAgKi8KQEAgLTI5OSw4ICs1MzEsOCBAQAogCUVYQ0VQVElPTl9TVFVCKDB4MWEwLCB3YXRjaGRvZykJCQkvKiAweDA5ZjAgKi8KIAlFWENFUFRJT05fU1RVQigweDFjMCwgZGF0YV90bGJfbWlzcykKIAlFWENFUFRJT05fU1RVQigweDFlMCwgaW5zdHJ1Y3Rpb25fdGxiX21pc3MpCi0JRVhDRVBUSU9OX1NUVUIoMHgyMDAsIGFsdGl2ZWNfdW5hdmFpbGFibGUpCS8qIDB4MGYyMCAqLwotCUVYQ0VQVElPTl9TVFVCKDB4MjIwLCBhbHRpdmVjX2Fzc2lzdCkJCS8qIDB4MTcwMCAqLworCUVYQ0VQVElPTl9TVFVCKDB4MjAwLCBhbHRpdmVjX3VuYXZhaWxhYmxlKQorCUVYQ0VQVElPTl9TVFVCKDB4MjIwLCBhbHRpdmVjX2Fzc2lzdCkKIAlFWENFUFRJT05fU1RVQigweDI2MCwgcGVyZm1vbikKIAlFWENFUFRJT05fU1RVQigweDI4MCwgZG9vcmJlbGwpCiAJRVhDRVBUSU9OX1NUVUIoMHgyYTAsIGRvb3JiZWxsX2NyaXQpCkBAIC0zMTcsMjUgKzU0OSwyNSBAQAogCVNUQVJUX0VYQ0VQVElPTihjcml0aWNhbF9pbnB1dCk7CiAJQ1JJVF9FWENFUFRJT05fUFJPTE9HKDB4MTAwLCBCT09LRV9JTlRFUlJVUFRfQ1JJVElDQUwsCiAJCQkgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLS8vCUVYQ0VQVElPTl9DT01NT04oMHgxMDAsIFBBQ0FfRVhDUklULCBJTlRTX0RJU0FCTEUpCi0vLwlibAlzcGVjaWFsX3JlZ19zYXZlX2NyaXQKLS8vCUNIRUNLX05BUFBJTkcoKTsKLS8vCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLS8vCWJsCS5jcml0aWNhbF9leGNlcHRpb24KLS8vCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKLQliCS4KKwlFWENFUFRJT05fQ09NTU9OX0NSSVQoMHgxMDApCisJYmwJLnNhdmVfbnZncHJzCisJYmwJc3BlY2lhbF9yZWdfc2F2ZQorCUNIRUNLX05BUFBJTkcoKTsKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJYmwJLnVua25vd25fZXhjZXB0aW9uCisJYglyZXRfZnJvbV9jcml0X2V4Y2VwdAogCiAvKiBNYWNoaW5lIENoZWNrIEludGVycnVwdCAqLwogCVNUQVJUX0VYQ0VQVElPTihtYWNoaW5lX2NoZWNrKTsKLQlNQ19FWENFUFRJT05fUFJPTE9HKDB4MjAwLCBCT09LRV9JTlRFUlJVUFRfTUFDSElORV9DSEVDSywKKwlNQ19FWENFUFRJT05fUFJPTE9HKDB4MDAwLCBCT09LRV9JTlRFUlJVUFRfTUFDSElORV9DSEVDSywKIAkJCSAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLS8vCUVYQ0VQVElPTl9DT01NT04oMHgyMDAsIFBBQ0FfRVhNQywgSU5UU19ESVNBQkxFKQotLy8JYmwJc3BlY2lhbF9yZWdfc2F2ZV9tYwotLy8JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotLy8JQ0hFQ0tfTkFQUElORygpOwotLy8JYmwJLm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uCi0vLwliCXJldF9mcm9tX21jX2V4Y2VwdAotCWIJLgorCUVYQ0VQVElPTl9DT01NT05fTUMoMHgwMDApCisJYmwJLnNhdmVfbnZncHJzCisJYmwJc3BlY2lhbF9yZWdfc2F2ZQorCUNIRUNLX05BUFBJTkcoKTsKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJYmwJLm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uCisJYglyZXRfZnJvbV9tY19leGNlcHQKIAogLyogRGF0YSBTdG9yYWdlIEludGVycnVwdCAqLwogCVNUQVJUX0VYQ0VQVElPTihkYXRhX3N0b3JhZ2UpCkBAIC0zNDMsNyArNTc1LDggQEAKIAkJCQlQUk9MT0dfQURESVRJT05fMlJFR1MpCiAJbWZzcHIJcjE0LFNQUk5fREVBUgogCW1mc3ByCXIxNSxTUFJOX0VTUgotCUVYQ0VQVElPTl9DT01NT04oMHgzMDAsIFBBQ0FfRVhHRU4sIElOVFNfRElTQUJMRSkKKwlFWENFUFRJT05fQ09NTU9OKDB4MzAwKQorCUlOVFNfRElTQUJMRQogCWIJc3RvcmFnZV9mYXVsdF9jb21tb24KIAogLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBJbnRlcnJ1cHQgKi8KQEAgLTM1Miw3ICs1ODUsOCBAQAogCQkJCVBST0xPR19BRERJVElPTl8yUkVHUykKIAlsaQlyMTUsMAogCW1yCXIxNCxyMTAKLQlFWENFUFRJT05fQ09NTU9OKDB4NDAwLCBQQUNBX0VYR0VOLCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTigweDQwMCkKKwlJTlRTX0RJU0FCTEUKIAliCXN0b3JhZ2VfZmF1bHRfY29tbW9uCiAKIC8qIEV4dGVybmFsIElucHV0IEludGVycnVwdCAqLwpAQCAtMzY1LDcgKzU5OSw3IEBACiAJCQkJUFJPTE9HX0FERElUSU9OXzJSRUdTKQogCW1mc3ByCXIxNCxTUFJOX0RFQVIKIAltZnNwcglyMTUsU1BSTl9FU1IKLQlFWENFUFRJT05fQ09NTU9OKDB4NjAwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDYwMCkKIAliCWFsaWdubWVudF9tb3JlCS8qIG5vIHJvb20sIGdvIG91dCBvZiBsaW5lICovCiAKIC8qIFByb2dyYW0gSW50ZXJydXB0ICovCkBAIC0zNzMsNyArNjA3LDggQEAKIAlOT1JNQUxfRVhDRVBUSU9OX1BST0xPRygweDcwMCwgQk9PS0VfSU5URVJSVVBUX1BST0dSQU0sCiAJCQkJUFJPTE9HX0FERElUSU9OXzFSRUcpCiAJbWZzcHIJcjE0LFNQUk5fRVNSCi0JRVhDRVBUSU9OX0NPTU1PTigweDcwMCwgUEFDQV9FWEdFTiwgSU5UU19ESVNBQkxFKQorCUVYQ0VQVElPTl9DT01NT04oMHg3MDApCisJSU5UU19ESVNBQkxFCiAJc3RkCXIxNCxfRFNJU1IocjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWxkCXIxNCxQQUNBX0VYR0VOK0VYX1IxNChyMTMpCkBAIC0zODYsNyArNjIxLDcgQEAKIAlOT1JNQUxfRVhDRVBUSU9OX1BST0xPRygweDgwMCwgQk9PS0VfSU5URVJSVVBUX0ZQX1VOQVZBSUwsCiAJCQkJUFJPTE9HX0FERElUSU9OX05PTkUpCiAJLyogd2UgY2FuIHByb2JhYmx5IGRvIGEgc2hvcnRlciBleGNlcHRpb24gZW50cnkgZm9yIHRoYXQgb25lLi4uICovCi0JRVhDRVBUSU9OX0NPTU1PTigweDgwMCwgUEFDQV9FWEdFTiwgSU5UU19LRUVQKQorCUVYQ0VQVElPTl9DT01NT04oMHg4MDApCiAJbGQJcjEyLF9NU1IocjEpCiAJYW5kaS4JcjAscjEyLE1TUl9QUjsKIAliZXEtCTFmCkBAIC00MDMsNyArNjM4LDcgQEAKIAlOT1JNQUxfRVhDRVBUSU9OX1BST0xPRygweDIwMCwgQk9PS0VfSU5URVJSVVBUX1NQRV9BTFRJVkVDX1VOQVZBSUwsCiAJCQkJUFJPTE9HX0FERElUSU9OX05PTkUpCiAJLyogd2UgY2FuIHByb2JhYmx5IGRvIGEgc2hvcnRlciBleGNlcHRpb24gZW50cnkgZm9yIHRoYXQgb25lLi4uICovCi0JRVhDRVBUSU9OX0NPTU1PTigweDIwMCwgUEFDQV9FWEdFTiwgSU5UU19LRUVQKQorCUVYQ0VQVElPTl9DT01NT04oMHgyMDApCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJbGQJcjEyLF9NU1IocjEpCkBAIC00MjUsNyArNjYwLDggQEAKIAlOT1JNQUxfRVhDRVBUSU9OX1BST0xPRygweDIyMCwKIAkJCQlCT09LRV9JTlRFUlJVUFRfU1BFX0ZQX0RBVEFfQUxUSVZFQ19BU1NJU1QsCiAJCQkJUFJPTE9HX0FERElUSU9OX05PTkUpCi0JRVhDRVBUSU9OX0NPTU1PTigweDIyMCwgUEFDQV9FWEdFTiwgSU5UU19ESVNBQkxFKQorCUVYQ0VQVElPTl9DT01NT04oMHgyMjApCisJSU5UU19ESVNBQkxFCiAJYmwJLnNhdmVfbnZncHJzCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogI2lmZGVmIENPTkZJR19BTFRJVkVDCkBAIC00NTAsMTMgKzY4NiwxNyBAQAogCVNUQVJUX0VYQ0VQVElPTih3YXRjaGRvZyk7CiAJQ1JJVF9FWENFUFRJT05fUFJPTE9HKDB4OWYwLCBCT09LRV9JTlRFUlJVUFRfV0FUQ0hET0csCiAJCQkgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLS8vCUVYQ0VQVElPTl9DT01NT04oMHg5ZjAsIFBBQ0FfRVhDUklULCBJTlRTX0RJU0FCTEUpCi0vLwlibAlzcGVjaWFsX3JlZ19zYXZlX2NyaXQKLS8vCUNIRUNLX05BUFBJTkcoKTsKLS8vCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLS8vCWJsCS51bmtub3duX2V4Y2VwdGlvbgotLy8JYglyZXRfZnJvbV9jcml0X2V4Y2VwdAotCWIJLgorCUVYQ0VQVElPTl9DT01NT05fQ1JJVCgweDlmMCkKKwlibAkuc2F2ZV9udmdwcnMKKwlibAlzcGVjaWFsX3JlZ19zYXZlCisJQ0hFQ0tfTkFQUElORygpOworCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKyNpZmRlZiBDT05GSUdfQk9PS0VfV0RUCisJYmwJLldhdGNoZG9nRXhjZXB0aW9uCisjZWxzZQorCWJsCS51bmtub3duX2V4Y2VwdGlvbgorI2VuZGlmCisJYglyZXRfZnJvbV9jcml0X2V4Y2VwdAogCiAvKiBTeXN0ZW0gQ2FsbCBJbnRlcnJ1cHQgKi8KIAlTVEFSVF9FWENFUFRJT04oc3lzdGVtX2NhbGwpCkBAIC00NzAsNyArNzEwLDggQEAKIAlTVEFSVF9FWENFUFRJT04oYXBfdW5hdmFpbGFibGUpOwogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4ZjIwLCBCT09LRV9JTlRFUlJVUFRfQVBfVU5BVkFJTCwKIAkJCQlQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4ZjIwLCBQQUNBX0VYR0VOLCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTigweGYyMCkKKwlJTlRTX0RJU0FCTEUKIAlibAkuc2F2ZV9udmdwcnMKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLnVua25vd25fZXhjZXB0aW9uCkBAIC01MTMsNyArNzU0LDcgQEAKIAltdGNyCXIxMAogCWxkCXIxMCxQQUNBX0VYQ1JJVCtFWF9SMTAocjEzKQkvKiByZXN0b3JlIHJlZ2lzdGVycyAqLwogCWxkCXIxMSxQQUNBX0VYQ1JJVCtFWF9SMTEocjEzKQotCWxkCXIxMyxQQUNBX0VYQ1JJVCtFWF9SMTMocjEzKQorCW1mc3ByCXIxMyxTUFJOX1NQUkdfQ1JJVF9TQ1JBVENICiAJcmZjaQogCiAJLyogTm9ybWFsIGRlYnVnIGV4Y2VwdGlvbiAqLwpAQCAtNTI2LDEwICs3NjcsOCBAQAogCS8qIE5vdyB3ZSBtYXNoIHVwIHRoaW5ncyB0byBtYWtlIGl0IGxvb2sgbGlrZSB3ZSBhcmUgY29taW5nIG9uIGEKIAkgKiBub3JtYWwgZXhjZXB0aW9uCiAJICovCi0JbGQJcjE1LFBBQ0FfRVhDUklUK0VYX1IxMyhyMTMpCi0JbXRzcHIJU1BSTl9TUFJHX0dFTl9TQ1JBVENILHIxNQogCW1mc3ByCXIxNCxTUFJOX0RCU1IKLQlFWENFUFRJT05fQ09NTU9OKDB4ZDAwLCBQQUNBX0VYQ1JJVCwgSU5UU19ESVNBQkxFKQorCUVYQ0VQVElPTl9DT01NT05fQ1JJVCgweGQwMCkKIAlzdGQJcjE0LF9EU0lTUihyMSkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJbXIJcjQscjE0CkBAIC01OTIsMTAgKzgzMSw5IEBACiAJLyogTm93IHdlIG1hc2ggdXAgdGhpbmdzIHRvIG1ha2UgaXQgbG9vayBsaWtlIHdlIGFyZSBjb21pbmcgb24gYQogCSAqIG5vcm1hbCBleGNlcHRpb24KIAkgKi8KLQltZnNwcglyMTUsU1BSTl9TUFJHX0RCR19TQ1JBVENICi0JbXRzcHIJU1BSTl9TUFJHX0dFTl9TQ1JBVENILHIxNQogCW1mc3ByCXIxNCxTUFJOX0RCU1IKLQlFWENFUFRJT05fQ09NTU9OKDB4ZDA4LCBQQUNBX0VYREJHLCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTl9EQkcoMHhkMDgpCisJSU5UU19ESVNBQkxFCiAJc3RkCXIxNCxfRFNJU1IocjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCW1yCXI0LHIxNApAQCAtNjA4LDcgKzg0Niw4IEBACiAJU1RBUlRfRVhDRVBUSU9OKHBlcmZtb24pOwogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4MjYwLCBCT09LRV9JTlRFUlJVUFRfUEVSRk9STUFOQ0VfTU9OSVRPUiwKIAkJCQlQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4MjYwLCBQQUNBX0VYR0VOLCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTigweDI2MCkKKwlJTlRTX0RJU0FCTEUKIAlDSEVDS19OQVBQSU5HKCkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLnBlcmZvcm1hbmNlX21vbml0b3JfZXhjZXB0aW9uCkBAIC02MjIsMTMgKzg2MSwxMyBAQAogCVNUQVJUX0VYQ0VQVElPTihkb29yYmVsbF9jcml0KTsKIAlDUklUX0VYQ0VQVElPTl9QUk9MT0coMHgyYTAsIEJPT0tFX0lOVEVSUlVQVF9ET09SQkVMTF9DUklUSUNBTCwKIAkJCSAgICAgIFBST0xPR19BRERJVElPTl9OT05FKQotLy8JRVhDRVBUSU9OX0NPTU1PTigweDJhMCwgUEFDQV9FWENSSVQsIElOVFNfRElTQUJMRSkKLS8vCWJsCXNwZWNpYWxfcmVnX3NhdmVfY3JpdAotLy8JQ0hFQ0tfTkFQUElORygpOwotLy8JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotLy8JYmwJLmRvb3JiZWxsX2NyaXRpY2FsX2V4Y2VwdGlvbgotLy8JYglyZXRfZnJvbV9jcml0X2V4Y2VwdAotCWIJLgorCUVYQ0VQVElPTl9DT01NT05fQ1JJVCgweDJhMCkKKwlibAkuc2F2ZV9udmdwcnMKKwlibAlzcGVjaWFsX3JlZ19zYXZlCisJQ0hFQ0tfTkFQUElORygpOworCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAkudW5rbm93bl9leGNlcHRpb24KKwliCXJldF9mcm9tX2NyaXRfZXhjZXB0CiAKIC8qCiAgKglHdWVzdCBkb29yYmVsbCBpbnRlcnJ1cHQKQEAgLTYzNyw3ICs4NzYsNyBAQAogCVNUQVJUX0VYQ0VQVElPTihndWVzdF9kb29yYmVsbCk7CiAJR0RCRUxMX0VYQ0VQVElPTl9QUk9MT0coMHgyYzAsIEJPT0tFX0lOVEVSUlVQVF9HVUVTVF9EQkVMTCwKIAkJCSAgICAgICAgUFJPTE9HX0FERElUSU9OX05PTkUpCi0JRVhDRVBUSU9OX0NPTU1PTigweDJjMCwgUEFDQV9FWEdFTiwgSU5UU19LRUVQKQorCUVYQ0VQVElPTl9DT01NT04oMHgyYzApCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCS5zYXZlX252Z3BycwogCUlOVFNfUkVTVE9SRV9IQVJECkBAIC02NDgsMTkgKzg4NywxOSBAQAogCVNUQVJUX0VYQ0VQVElPTihndWVzdF9kb29yYmVsbF9jcml0KTsKIAlDUklUX0VYQ0VQVElPTl9QUk9MT0coMHgyZTAsIEJPT0tFX0lOVEVSUlVQVF9HVUVTVF9EQkVMTF9DUklULAogCQkJICAgICAgUFJPTE9HX0FERElUSU9OX05PTkUpCi0vLwlFWENFUFRJT05fQ09NTU9OKDB4MmUwLCBQQUNBX0VYQ1JJVCwgSU5UU19ESVNBQkxFKQotLy8JYmwJc3BlY2lhbF9yZWdfc2F2ZV9jcml0Ci0vLwlDSEVDS19OQVBQSU5HKCk7Ci0vLwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0vLwlibAkuZ3Vlc3RfZG9vcmJlbGxfY3JpdGljYWxfZXhjZXB0aW9uCi0vLwliCXJldF9mcm9tX2NyaXRfZXhjZXB0Ci0JYgkuCisJRVhDRVBUSU9OX0NPTU1PTl9DUklUKDB4MmUwKQorCWJsCS5zYXZlX252Z3BycworCWJsCXNwZWNpYWxfcmVnX3NhdmUKKwlDSEVDS19OQVBQSU5HKCk7CisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCS51bmtub3duX2V4Y2VwdGlvbgorCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKIAogLyogSHlwZXJ2aXNvciBjYWxsICovCiAJU1RBUlRfRVhDRVBUSU9OKGh5cGVyY2FsbCk7CiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0coMHgzMTAsIEJPT0tFX0lOVEVSUlVQVF9IVl9TWVNDQUxMLAogCQkJICAgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4MzEwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDMxMCkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLnNhdmVfbnZncHJzCiAJSU5UU19SRVNUT1JFX0hBUkQKQEAgLTY3MSw3ICs5MTAsNyBAQAogCVNUQVJUX0VYQ0VQVElPTihlaHByaXYpOwogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4MzIwLCBCT09LRV9JTlRFUlJVUFRfSFZfUFJJViwKIAkJCSAgICAgICAgUFJPTE9HX0FERElUSU9OX05PTkUpCi0JRVhDRVBUSU9OX0NPTU1PTigweDMyMCwgUEFDQV9FWEdFTiwgSU5UU19LRUVQKQorCUVYQ0VQVElPTl9DT01NT04oMHgzMjApCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCS5zYXZlX252Z3BycwogCUlOVFNfUkVTVE9SRV9IQVJECkBAIC02ODIsNyArOTIxLDcgQEAKIAlTVEFSVF9FWENFUFRJT04obHJhdF9lcnJvcik7CiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0coMHgzNDAsIEJPT0tFX0lOVEVSUlVQVF9MUkFUX0VSUk9SLAogCQkJICAgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4MzQwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDM0MCkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLnNhdmVfbnZncHJzCiAJSU5UU19SRVNUT1JFX0hBUkQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwppbmRleCAzOGQ1MDczLi5kOWM2NTBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCkBAIC0xMjEsOSArMTIxLDEwIEBACiAJY21wd2kJY3IxLHIxMywyCiAJLyogVG90YWwgbG9zcyBvZiBIViBzdGF0ZSBpcyBmYXRhbCwgd2UgY291bGQgdHJ5IHRvIHVzZSB0aGUKIAkgKiBQSVIgdG8gbG9jYXRlIGEgUEFDQSwgdGhlbiB1c2UgYW4gZW1lcmdlbmN5IHN0YWNrIGV0Yy4uLgotCSAqIGJ1dCBmb3Igbm93LCBsZXQncyBqdXN0IHN0YXkgc3R1Y2sgaGVyZQorCSAqIE9QQUwgdjMgYmFzZWQgcG93ZXJudiBwbGF0Zm9ybXMgaGF2ZSBuZXcgaWRsZSBzdGF0ZXMKKwkgKiB3aGljaCBmYWxsIGluIHRoaXMgY2F0YWdvcnkuCiAJICovCi0JYmd0CWNyMSwuCisJYmd0CWNyMSw4ZgogCUdFVF9QQUNBKHIxMykKIAogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX0hWX1BPU1NJQkxFCkBAIC0xNDEsNiArMTQyLDExIEBACiAJYmVxCWNyMSwyZgogCWIJLnBvd2VyN193YWtldXBfbm9sb3NzCiAyOgliCS5wb3dlcjdfd2FrZXVwX2xvc3MKKworCS8qIEZhc3QgU2xlZXAgd2FrZXVwIG9uIFBvd2VyTlYgKi8KKzg6CUdFVF9QQUNBKHIxMykKKwliIAkucG93ZXI3X3dha2V1cF90Yl9sb3NzCisKIDk6CiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9IVk1PREUgfCBDUFVfRlRSX0FSQ0hfMjA2KQogI2VuZGlmIC8qIENPTkZJR19QUENfUDdfTkFQICovCkBAIC0xNjQsMTMgKzE3MCwxOCBAQAogCSAqLwogCW1mc3ByCXIxMyxTUFJOX1NSUjEKIAlybHdpbm0uCXIxMyxyMTMsNDctMzEsMzAsMzEKKwlPUFRfR0VUX1NQUihyMTMsIFNQUk5fQ0ZBUiwgQ1BVX0ZUUl9DRkFSKQogCWJlcQk5ZgogCisJbWZzcHIJcjEzLFNQUk5fU1JSMQorCXJsd2lubS4JcjEzLHIxMyw0Ny0zMSwzMCwzMQogCS8qIHdha2luZyB1cCBmcm9tIHBvd2Vyc2F2ZSAobmFwKSBzdGF0ZSAqLwogCWNtcHdpCWNyMSxyMTMsMgogCS8qIFRvdGFsIGxvc3Mgb2YgSFYgc3RhdGUgaXMgZmF0YWwuIGxldCdzIGp1c3Qgc3RheSBzdHVjayBoZXJlICovCisJT1BUX0dFVF9TUFIocjEzLCBTUFJOX0NGQVIsIENQVV9GVFJfQ0ZBUikKIAliZ3QJY3IxLC4KIDk6CisJT1BUX1NFVF9TUFIocjEzLCBTUFJOX0NGQVIsIENQVV9GVFJfQ0ZBUikKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0hWTU9ERSB8IENQVV9GVFJfQVJDSF8yMDYpCiAjZW5kaWYgLyogQ09ORklHX1BQQ19QN19OQVAgKi8KIAlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWE1DKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNy5TCmluZGV4IDNmZGVmMGYuLmMzYWI4NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjcuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI3LlMKQEAgLTE3LDIwICsxNywzMSBAQAogI2luY2x1ZGUgPGFzbS9wcGMtb3Bjb2RlLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CiAKICN1bmRlZiBERUJVRwogCisvKiBJZGxlIHN0YXRlIGVudHJ5IHJvdXRpbmVzICovCisKKyNkZWZpbmUJSURMRV9TVEFURV9FTlRFUl9TRVEoSURMRV9JTlNUKQkJCQlcCisJLyogTWFnaWMgTkFQL1NMRUVQL1dJTktMRSBtb2RlIGVudGVyIHNlcXVlbmNlICovCVwKKwlzdGQJcjAsMChyMSk7CQkJCQlcCisJcHRlc3luYzsJCQkJCQlcCisJbGQJcjAsMChyMSk7CQkJCQlcCisxOgljbXAJY3IwLHIwLHIwOwkJCQkJXAorCWJuZQkxYjsJCQkJCQlcCisJSURMRV9JTlNUOwkJCQkJCVwKKwliCS4KKwogCS50ZXh0CiAKLV9HTE9CQUwocG93ZXI3X2lkbGUpCi0JLyogTm93IGNoZWNrIGlmIHVzZXIgb3IgYXJjaCBlbmFibGVkIE5BUCBtb2RlICovCi0JTE9BRF9SRUdfQUREUkJBU0UocjMscG93ZXJzYXZlX25hcCkKLQlsd3oJcjQsQUREUk9GRihwb3dlcnNhdmVfbmFwKShyMykKLQljbXB3aQkwLHI0LDAKLQliZXFscgotCS8qIGZhbGwgdGhyb3VnaCAqLwotCi1fR0xPQkFMKHBvd2VyN19uYXApCisvKgorICogUGFzcyByZXF1ZXN0ZWQgc3RhdGUgaW4gcjM6CisgKiAJMCAtIG5hcAorICogCTEgLSBzbGVlcAorICovCitfR0xPQkFMKHBvd2VyN19wb3dlcnNhdmVfY29tbW9uKQorCS8qIFVzZSByMyB0byBwYXNzIHN0YXRlIG5hcC9zbGVlcC93aW5rbGUgKi8KIAkvKiBOQVAgaXMgYSBzdGF0ZSBsb3NzLCB3ZSBjcmVhdGUgYSByZWdzIGZyYW1lIG9uIHRoZQogCSAqIHN0YWNrLCBmaWxsIGl0IHVwIHdpdGggdGhlIHN0YXRlIHdlIGNhcmUgYWJvdXQgYW5kCiAJICogc3RpY2sgYSBwb2ludGVyIHRvIGl0IGluIFBBQ0FSMS4gV2UgcmVhbGx5IG9ubHkKQEAgLTc5LDggKzkwLDggQEAKIAkvKiBDb250aW51ZSBzYXZpbmcgc3RhdGUgKi8KIAlTQVZFX0dQUigyLCByMSkKIAlTQVZFX05WR1BSUyhyMSkKLQltZmNyCXIzCi0Jc3RkCXIzLF9DQ1IocjEpCisJbWZjcglyNAorCXN0ZAlyNCxfQ0NSKHIxKQogCXN0ZAlyOSxfTVNSKHIxKQogCXN0ZAlyMSxQQUNBUjEocjEzKQogCkBAIC05MCwxNSArMTAxLDU2IEBACiAJbGkJcjQsS1ZNX0hXVEhSRUFEX0lOX05BUAogCXN0YglyNCxIU1RBVEVfSFdUSFJFQURfU1RBVEUocjEzKQogI2VuZGlmCisJY21wd2kJY3IwLHIzLDEKKwliZXEJMmYKKwlJRExFX1NUQVRFX0VOVEVSX1NFUShQUENfTkFQKQorCS8qIE5vIHJldHVybiAqLworMjoJSURMRV9TVEFURV9FTlRFUl9TRVEoUFBDX1NMRUVQKQorCS8qIE5vIHJldHVybiAqLwogCi0JLyogTWFnaWMgTkFQIG1vZGUgZW50ZXIgc2VxdWVuY2UgKi8KLQlzdGQJcjAsMChyMSkKLQlwdGVzeW5jCi0JbGQJcjAsMChyMSkKLTE6CWNtcAljcjAscjAscjAKLQlibmUJMWIKLQlQUENfTkFQCi0JYgkuCitfR0xPQkFMKHBvd2VyN19pZGxlKQorCS8qIE5vdyBjaGVjayBpZiB1c2VyIG9yIGFyY2ggZW5hYmxlZCBOQVAgbW9kZSAqLworCUxPQURfUkVHX0FERFJCQVNFKHIzLHBvd2Vyc2F2ZV9uYXApCisJbHd6CXI0LEFERFJPRkYocG93ZXJzYXZlX25hcCkocjMpCisJY21wd2kJMCxyNCwwCisJYmVxbHIKKwkvKiBmYWxsIHRocm91Z2ggKi8KKworX0dMT0JBTChwb3dlcjdfbmFwKQorCWxpCXIzLDAKKwliCXBvd2VyN19wb3dlcnNhdmVfY29tbW9uCisJLyogTm8gcmV0dXJuICovCisKK19HTE9CQUwocG93ZXI3X3NsZWVwKQorCWxpCXIzLDEKKwliCXBvd2VyN19wb3dlcnNhdmVfY29tbW9uCisJLyogTm8gcmV0dXJuICovCisKK19HTE9CQUwocG93ZXI3X3dha2V1cF90Yl9sb3NzKQorCWxkCXIyLFBBQ0FUT0MocjEzKTsKKwlsZAlyMSxQQUNBUjEocjEzKQorCisJLyogVGltZSBiYXNlIHJlLXN5bmMgKi8KKwlsaQlyMCxPUEFMX1JFU1lOQ19USU1FQkFTRQorCUxPQURfUkVHX0FERFIocjExLG9wYWwpOworCWxkCXIxMiw4KHIxMSk7CisJbGQJcjIsMChyMTEpOworCW10Y3RyCXIxMgorCWJjdHJsCisKKwkvKiBUT0RPOiBDaGVjayByMyBmb3IgZmFpbHVyZSAqLworCisJUkVTVF9OVkdQUlMocjEpCisJUkVTVF9HUFIoMiwgcjEpCisJbGQJcjMsX0NDUihyMSkKKwlsZAlyNCxfTVNSKHIxKQorCWxkCXI1LF9OSVAocjEpCisJYWRkaQlyMSxyMSxJTlRfRlJBTUVfU0laRQorCW10Y3IJcjMKKwltZnNwcglyMyxTUFJOX1NSUjEJCS8qIFJldHVybiBTUlIxICovCisJbXRzcHIJU1BSTl9TUlIxLHI0CisJbXRzcHIJU1BSTl9TUlIwLHI1CisJcmZpZAogCiBfR0xPQkFMKHBvd2VyN193YWtldXBfbG9zcykKIAlsZAlyMSxQQUNBUjEocjEzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggMWQwODQ4Yi4uY2ExY2Q3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC00NjUsNyArNDY1LDYgQEAKIAogdm9pZCBfX2RvX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgaW50IGlycTsKIAogCWlycV9lbnRlcigpOwpAQCAtNDg3LDExICs0ODYsOCBAQAogCS8qIEFuZCBmaW5hbGx5IHByb2Nlc3MgaXQgKi8KIAlpZiAodW5saWtlbHkoaXJxID09IE5PX0lSUSkpCiAJCV9fZ2V0X2NwdV92YXIoaXJxX3N0YXQpLnNwdXJpb3VzX2lycXMrKzsKLQllbHNlIHsKLQkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JCWlmIChsaWtlbHkoZGVzYykpCi0JCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JfQorCWVsc2UKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAKIAl0cmFjZV9pcnFfZXhpdChyZWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWNlLmMKaW5kZXggY2FkZWY3ZS4uYTdmZDRjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21jZS5jCkBAIC03MCw3ICs3MCw3IEBACiAgKi8KIHZvaWQgc2F2ZV9tY2VfZXZlbnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaGFuZGxlZCwKIAkJICAgIHN0cnVjdCBtY2VfZXJyb3JfaW5mbyAqbWNlX2VyciwKLQkJICAgIHVpbnQ2NF90IGFkZHIpCisJCSAgICB1aW50NjRfdCBuaXAsIHVpbnQ2NF90IGFkZHIpCiB7CiAJdWludDY0X3Qgc3JyMTsKIAlpbnQgaW5kZXggPSBfX2dldF9jcHVfdmFyKG1jZV9uZXN0X2NvdW50KSsrOwpAQCAtODYsNyArODYsNyBAQAogCiAJLyogUG9wdWxhdGUgZ2VuZXJpYyBtYWNoaW5lIGNoZWNrIGluZm8gKi8KIAltY2UtPnZlcnNpb24gPSBNQ0VfVjE7Ci0JbWNlLT5zcnIwID0gcmVncy0+bmlwOworCW1jZS0+c3JyMCA9IG5pcDsKIAltY2UtPnNycjEgPSByZWdzLT5tc3I7CiAJbWNlLT5ncHIzID0gcmVncy0+Z3ByWzNdOwogCW1jZS0+aW5fdXNlID0gMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWNlX3Bvd2VyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21jZV9wb3dlci5jCmluZGV4IDI3YzkzZjQuLmFhOWFmZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWNlX3Bvd2VyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tY2VfcG93ZXIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KIAogLyogZmx1c2ggU0xCcyBhbmQgcmVsb2FkICovCiBzdGF0aWMgdm9pZCBmbHVzaF9hbmRfcmVsb2FkX3NsYih2b2lkKQpAQCAtMTk3LDEzICsxOTgsMzIgQEAKIAl9CiB9CiAKK3N0YXRpYyBsb25nIG1jZV9oYW5kbGVfdWVfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJbG9uZyBoYW5kbGVkID0gMDsKKworCS8qCisJICogT24gc3BlY2lmaWMgU0NPTSByZWFkIHZpYSBNTUlPIHdlIG1heSBnZXQgYSBtYWNoaW5lIGNoZWNrCisJICogZXhjZXB0aW9uIHdpdGggU1JSMCBwb2ludGluZyBpbnNpZGUgb3BhbC4gSWYgdGhhdCBpcyB0aGUKKwkgKiBjYXNlIE9QQUwgbWF5IGhhdmUgcmVjb3ZlcnkgYWRkcmVzcyB0byByZS1yZWFkIFNDT00gZGF0YSBpbgorCSAqIGRpZmZlcmVudCB3YXkgYW5kIGhlbmNlIHdlIGNhbiByZWNvdmVyIGZyb20gdGhpcyBNQy4KKwkgKi8KKworCWlmIChwcGNfbWQubWNlX2NoZWNrX2Vhcmx5X3JlY292ZXJ5KSB7CisJCWlmIChwcGNfbWQubWNlX2NoZWNrX2Vhcmx5X3JlY292ZXJ5KHJlZ3MpKQorCQkJaGFuZGxlZCA9IDE7CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCiBsb25nIF9fbWFjaGluZV9jaGVja19lYXJseV9yZWFsbW9kZV9wNyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1aW50NjRfdCBzcnIxLCBhZGRyOworCXVpbnQ2NF90IHNycjEsIG5pcCwgYWRkcjsKIAlsb25nIGhhbmRsZWQgPSAxOwogCXN0cnVjdCBtY2VfZXJyb3JfaW5mbyBtY2VfZXJyb3JfaW5mbyA9IHsgMCB9OwogCiAJc3JyMSA9IHJlZ3MtPm1zcjsKKwluaXAgPSByZWdzLT5uaXA7CiAKIAkvKgogCSAqIEhhbmRsZSBtZW1vcnkgZXJyb3JzIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMgd2FzIGEgbG9hZC9zdG9yZSBvcgpAQCAtMjIxLDcgKzI0MSwxMSBAQAogCQlhZGRyID0gcmVncy0+bmlwOwogCX0KIAotCXNhdmVfbWNlX2V2ZW50KHJlZ3MsIGhhbmRsZWQsICZtY2VfZXJyb3JfaW5mbywgYWRkcik7CisJLyogSGFuZGxlIFVFIGVycm9yLiAqLworCWlmIChtY2VfZXJyb3JfaW5mby5lcnJvcl90eXBlID09IE1DRV9FUlJPUl9UWVBFX1VFKQorCQloYW5kbGVkID0gbWNlX2hhbmRsZV91ZV9lcnJvcihyZWdzKTsKKworCXNhdmVfbWNlX2V2ZW50KHJlZ3MsIGhhbmRsZWQsICZtY2VfZXJyb3JfaW5mbywgbmlwLCBhZGRyKTsKIAlyZXR1cm4gaGFuZGxlZDsKIH0KIApAQCAtMjYzLDExICsyODcsMTIgQEAKIAogbG9uZyBfX21hY2hpbmVfY2hlY2tfZWFybHlfcmVhbG1vZGVfcDgoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdWludDY0X3Qgc3JyMSwgYWRkcjsKKwl1aW50NjRfdCBzcnIxLCBuaXAsIGFkZHI7CiAJbG9uZyBoYW5kbGVkID0gMTsKIAlzdHJ1Y3QgbWNlX2Vycm9yX2luZm8gbWNlX2Vycm9yX2luZm8gPSB7IDAgfTsKIAogCXNycjEgPSByZWdzLT5tc3I7CisJbmlwID0gcmVncy0+bmlwOwogCiAJaWYgKFA3X1NSUjFfTUNfTE9BRFNUT1JFKHNycjEpKSB7CiAJCWhhbmRsZWQgPSBtY2VfaGFuZGxlX2RlcnJvcl9wOChyZWdzLT5kc2lzcik7CkBAIC0yNzksNiArMzA0LDEwIEBACiAJCWFkZHIgPSByZWdzLT5uaXA7CiAJfQogCi0Jc2F2ZV9tY2VfZXZlbnQocmVncywgaGFuZGxlZCwgJm1jZV9lcnJvcl9pbmZvLCBhZGRyKTsKKwkvKiBIYW5kbGUgVUUgZXJyb3IuICovCisJaWYgKG1jZV9lcnJvcl9pbmZvLmVycm9yX3R5cGUgPT0gTUNFX0VSUk9SX1RZUEVfVUUpCisJCWhhbmRsZWQgPSBtY2VfaGFuZGxlX3VlX2Vycm9yKHJlZ3MpOworCisJc2F2ZV9tY2VfZXZlbnQocmVncywgaGFuZGxlZCwgJm1jZV9lcnJvcl9pbmZvLCBuaXAsIGFkZHIpOwogCXJldHVybiBoYW5kbGVkOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggYTllMzExZi4uMmE0Nzc5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0yMDgsNyArMjA4LDYgQEAKIAkJCSAgdW5zaWduZWQgbG9uZyBpbl9kZXZmbikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2U7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbG47CiAJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICpob3NlX25vZGU7CiAKQEAgLTIzMCw4ICsyMjksNyBAQAogCSAqIHVzZWQgb24gcHJlLWRvbWFpbnMgc2V0dXAuIFdlIHJldHVybiB0aGUgZmlyc3QgbWF0Y2gKIAkgKi8KIAotCWZvciAobG4gPSBwY2lfcm9vdF9idXNlcy5uZXh0OyBsbiAhPSAmcGNpX3Jvb3RfYnVzZXM7IGxuID0gbG4tPm5leHQpIHsKLQkJYnVzID0gcGNpX2J1c19iKGxuKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnBjaV9yb290X2J1c2VzLCBub2RlKSB7CiAJCWlmIChpbl9idXMgPj0gYnVzLT5udW1iZXIgJiYgaW5fYnVzIDw9IGJ1cy0+YnVzbl9yZXMuZW5kKQogCQkJYnJlYWs7CiAJCWJ1cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IGY1OGMwZDMuLmQ3MTFiN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC03NTIsNiArNzUyLDExIEBACiAJc3Bpbm5pbmdfc2Vjb25kYXJpZXMgPSBib290X2NwdV9jb3VudCAtIDE7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCS8qIFNjYW4gYW5kIGJ1aWxkIHRoZSBsaXN0IG9mIG1hY2hpbmUgY2hlY2sgcmVjb3ZlcmFibGUgcmFuZ2VzICovCisJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9yZWNvdmVyYWJsZV9yYW5nZXMsIE5VTEwpOworI2VuZGlmCisKIAlEQkcoIiA8LSBlYXJseV9pbml0X2RldnRyZWUoKVxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKaW5kZXggNGNmNjc0ZC4uZjM4NjI5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKQEAgLTEwMTMsMTIgKzEwMTMsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyogV2UgYXNzdW1lIHRvIGJlIHBhc3NlZCBiaWcgZW5kaWFuIGFyZ3VtZW50cyAqLwogYXNtbGlua2FnZSBpbnQgcHBjX3J0YXMoc3RydWN0IHJ0YXNfYXJncyBfX3VzZXIgKnVhcmdzKQogewogCXN0cnVjdCBydGFzX2FyZ3MgYXJnczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgKmJ1ZmZfY29weSwgKmVycmJ1ZiA9IE5VTEw7Ci0JaW50IG5hcmdzOworCWludCBuYXJncywgbnJldCwgdG9rZW47CiAJaW50IHJjOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtMTAyNywxMCArMTAyOCwxMyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmYXJncywgdWFyZ3MsIDMgKiBzaXplb2YodTMyKSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQluYXJncyA9IGFyZ3MubmFyZ3M7CisJbmFyZ3MgPSBiZTMyX3RvX2NwdShhcmdzLm5hcmdzKTsKKwlucmV0ICA9IGJlMzJfdG9fY3B1KGFyZ3MubnJldCk7CisJdG9rZW4gPSBiZTMyX3RvX2NwdShhcmdzLnRva2VuKTsKKwogCWlmIChuYXJncyA+IEFSUkFZX1NJWkUoYXJncy5hcmdzKQotCSAgICB8fCBhcmdzLm5yZXQgPiBBUlJBWV9TSVpFKGFyZ3MuYXJncykKLQkgICAgfHwgbmFyZ3MgKyBhcmdzLm5yZXQgPiBBUlJBWV9TSVpFKGFyZ3MuYXJncykpCisJICAgIHx8IG5yZXQgPiBBUlJBWV9TSVpFKGFyZ3MuYXJncykKKwkgICAgfHwgbmFyZ3MgKyBucmV0ID4gQVJSQVlfU0laRShhcmdzLmFyZ3MpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIENvcHkgaW4gYXJncy4gKi8KQEAgLTEwMzgsMTQgKzEwNDIsMTQgQEAKIAkJCSAgIG5hcmdzICogc2l6ZW9mKHJ0YXNfYXJnX3QpKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChhcmdzLnRva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQorCWlmICh0b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlhcmdzLnJldHMgPSAmYXJncy5hcmdzW25hcmdzXTsKLQltZW1zZXQoYXJncy5yZXRzLCAwLCBhcmdzLm5yZXQgKiBzaXplb2YocnRhc19hcmdfdCkpOworCW1lbXNldChhcmdzLnJldHMsIDAsIG5yZXQgKiBzaXplb2YocnRhc19hcmdfdCkpOwogCiAJLyogTmVlZCB0byBoYW5kbGUgaWJtLHN1c3BlbmRfbWUgY2FsbCBzcGVjaWFsbHkgKi8KLQlpZiAoYXJncy50b2tlbiA9PSBpYm1fc3VzcGVuZF9tZV90b2tlbikgeworCWlmICh0b2tlbiA9PSBpYm1fc3VzcGVuZF9tZV90b2tlbikgewogCQlyYyA9IHJ0YXNfaWJtX3N1c3BlbmRfbWUoJmFyZ3MpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CkBAIC0xMDYyLDcgKzEwNjYsNyBAQAogCiAJLyogQSAtMSByZXR1cm4gY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbGFzdCBjb21tYW5kIGNvdWxkbid0CiAJICAgYmUgY29tcGxldGVkIGR1ZSB0byBhIGhhcmR3YXJlIGVycm9yLiAqLwotCWlmIChhcmdzLnJldHNbMF0gPT0gLTEpCisJaWYgKGJlMzJfdG9fY3B1KGFyZ3MucmV0c1swXSkgPT0gLTEpCiAJCWVycmJ1ZiA9IF9fZmV0Y2hfcnRhc19sYXN0X2Vycm9yKGJ1ZmZfY29weSk7CiAKIAl1bmxvY2tfcnRhcyhmbGFncyk7CkBAIC0xMDc3LDcgKzEwODEsNyBAQAogCS8qIENvcHkgb3V0IGFyZ3MuICovCiAJaWYgKGNvcHlfdG9fdXNlcih1YXJncy0+YXJncyArIG5hcmdzLAogCQkJIGFyZ3MuYXJncyArIG5hcmdzLAotCQkJIGFyZ3MubnJldCAqIHNpemVvZihydGFzX2FyZ190KSkgIT0gMCkKKwkJCSBucmV0ICogc2l6ZW9mKHJ0YXNfYXJnX3QpKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IGY1ZjExYTcuLjQ5MzM5MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTEwMiw2ICsxMDIsOCBAQAogewogCWludCBjcHU7CiAKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHRsYl9jb3JlX2RhdGEsIGxvY2spICE9IDApOworCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlpbnQgZmlyc3QgPSBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KTsKIApAQCAtNTUyLDE0ICs1NTQsMjAgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBleGNfbHZsX2Vhcmx5X2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNwOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJY3JpdGlycV9jdHhbaV0gPSAoc3RydWN0IHRocmVhZF9pbmZvICopCi0JCQlfX3ZhKG1lbWJsb2NrX2FsbG9jKFRIUkVBRF9TSVpFLCBUSFJFQURfU0laRSkpOwotCQlkYmdpcnFfY3R4W2ldID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQotCQkJX192YShtZW1ibG9ja19hbGxvYyhUSFJFQURfU0laRSwgVEhSRUFEX1NJWkUpKTsKLQkJbWNoZWNraXJxX2N0eFtpXSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKLQkJCV9fdmEobWVtYmxvY2tfYWxsb2MoVEhSRUFEX1NJWkUsIFRIUkVBRF9TSVpFKSk7CisJCXNwID0gbWVtYmxvY2tfYWxsb2MoVEhSRUFEX1NJWkUsIFRIUkVBRF9TSVpFKTsKKwkJY3JpdGlycV9jdHhbaV0gPSAoc3RydWN0IHRocmVhZF9pbmZvICopX192YShzcCk7CisJCXBhY2FbaV0uY3JpdF9rc3RhY2sgPSBfX3ZhKHNwICsgVEhSRUFEX1NJWkUpOworCisJCXNwID0gbWVtYmxvY2tfYWxsb2MoVEhSRUFEX1NJWkUsIFRIUkVBRF9TSVpFKTsKKwkJZGJnaXJxX2N0eFtpXSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKilfX3ZhKHNwKTsKKwkJcGFjYVtpXS5kYmdfa3N0YWNrID0gX192YShzcCArIFRIUkVBRF9TSVpFKTsKKworCQlzcCA9IG1lbWJsb2NrX2FsbG9jKFRIUkVBRF9TSVpFLCBUSFJFQURfU0laRSk7CisJCW1jaGVja2lycV9jdHhbaV0gPSAoc3RydWN0IHRocmVhZF9pbmZvICopX192YShzcCk7CisJCXBhY2FbaV0ubWNfa3N0YWNrID0gX192YShzcCArIFRIUkVBRF9TSVpFKTsKIAl9CiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfREVCVUdfTFZMX0VYQykpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCBhYzI2MjFhLi5lMmE0MjMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTE0NSw5ICsxNDYsOSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGNhbGxfZnVuY3Rpb25fc2luZ2xlX2FjdGlvbihpbnQgaXJxLCB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IHRpY2tfYnJvYWRjYXN0X2lwaV9hY3Rpb24oaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKLQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQoKTsKKwl0aWNrX2Jyb2FkY2FzdF9pcGlfaGFuZGxlcigpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTY4LDE0ICsxNjksMTQgQEAKIHN0YXRpYyBpcnFfaGFuZGxlcl90IHNtcF9pcGlfYWN0aW9uW10gPSB7CiAJW1BQQ19NU0dfQ0FMTF9GVU5DVElPTl0gPSAgY2FsbF9mdW5jdGlvbl9hY3Rpb24sCiAJW1BQQ19NU0dfUkVTQ0hFRFVMRV0gPSByZXNjaGVkdWxlX2FjdGlvbiwKLQlbUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFXSA9IGNhbGxfZnVuY3Rpb25fc2luZ2xlX2FjdGlvbiwKKwlbUFBDX01TR19USUNLX0JST0FEQ0FTVF0gPSB0aWNrX2Jyb2FkY2FzdF9pcGlfYWN0aW9uLAogCVtQUENfTVNHX0RFQlVHR0VSX0JSRUFLXSA9IGRlYnVnX2lwaV9hY3Rpb24sCiB9OwogCiBjb25zdCBjaGFyICpzbXBfaXBpX25hbWVbXSA9IHsKIAlbUFBDX01TR19DQUxMX0ZVTkNUSU9OXSA9ICAiaXBpIGNhbGwgZnVuY3Rpb24iLAogCVtQUENfTVNHX1JFU0NIRURVTEVdID0gImlwaSByZXNjaGVkdWxlIiwKLQlbUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFXSA9ICJpcGkgY2FsbCBmdW5jdGlvbiBzaW5nbGUiLAorCVtQUENfTVNHX1RJQ0tfQlJPQURDQVNUXSA9ICJpcGkgdGljay1icm9hZGNhc3QiLAogCVtQUENfTVNHX0RFQlVHR0VSX0JSRUFLXSA9ICJpcGkgZGVidWdnZXIiLAogfTsKIApAQCAtMjUxLDggKzI1Miw4IEBACiAJCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwogCQlpZiAoYWxsICYgSVBJX01FU1NBR0UoUFBDX01TR19SRVNDSEVEVUxFKSkKIAkJCXNjaGVkdWxlcl9pcGkoKTsKLQkJaWYgKGFsbCAmIElQSV9NRVNTQUdFKFBQQ19NU0dfQ0FMTF9GVU5DX1NJTkdMRSkpCi0JCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQoKTsKKwkJaWYgKGFsbCAmIElQSV9NRVNTQUdFKFBQQ19NU0dfVElDS19CUk9BRENBU1QpKQorCQkJdGlja19icm9hZGNhc3RfaXBpX2hhbmRsZXIoKTsKIAkJaWYgKGFsbCAmIElQSV9NRVNTQUdFKFBQQ19NU0dfREVCVUdHRVJfQlJFQUspKQogCQkJZGVidWdfaXBpX2FjdGlvbigwLCBOVUxMKTsKIAl9IHdoaWxlIChpbmZvLT5tZXNzYWdlcyk7CkBAIC0yODAsNyArMjgxLDcgQEAKIAogdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpCiB7Ci0JZG9fbWVzc2FnZV9wYXNzKGNwdSwgUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFKTsKKwlkb19tZXNzYWdlX3Bhc3MoY3B1LCBQUENfTVNHX0NBTExfRlVOQ1RJT04pOwogfQogCiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQpAQCAtMjkxLDYgKzI5MiwxNiBAQAogCQlkb19tZXNzYWdlX3Bhc3MoY3B1LCBQUENfTVNHX0NBTExfRlVOQ1RJT04pOwogfQogCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCit2b2lkIHRpY2tfYnJvYWRjYXN0KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKQorCQlkb19tZXNzYWdlX3Bhc3MoY3B1LCBQUENfTVNHX1RJQ0tfQlJPQURDQVNUKTsKK30KKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdHRVIpIHx8IGRlZmluZWQoQ09ORklHX0tFWEVDKQogdm9pZCBzbXBfc2VuZF9kZWJ1Z2dlcl9icmVhayh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwppbmRleCBiM2RhYjIwLi4xMjJhNTgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CkBAIC0xMDYsNyArMTA3LDcgQEAKIAkuaXJxICAgICAgICAgICAgPSAwLAogCS5zZXRfbmV4dF9ldmVudCA9IGRlY3JlbWVudGVyX3NldF9uZXh0X2V2ZW50LAogCS5zZXRfbW9kZSAgICAgICA9IGRlY3JlbWVudGVyX3NldF9tb2RlLAotCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCisJLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCB8IENMT0NLX0VWVF9GRUFUX0MzU1RPUCwKIH07CiBFWFBPUlRfU1lNQk9MKGRlY3JlbWVudGVyX2Nsb2NrZXZlbnQpOwogCkBAIC00NzgsNDcgKzQ3OSwxMyBAQAogCiAjZW5kaWYgLyogQ09ORklHX0lSUV9XT1JLICovCiAKLS8qCi0gKiB0aW1lcl9pbnRlcnJ1cHQgLSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBkZWNyZW1lbnRlciBvdmVyZmxvd3MsCi0gKiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCi0gKi8KLXZvaWQgdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICogcmVncykKK3ZvaWQgX190aW1lcl9pbnRlcnJ1cHQodm9pZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAl1NjQgKm5leHRfdGIgPSAmX19nZXRfY3B1X3ZhcihkZWNyZW1lbnRlcnNfbmV4dF90Yik7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gJl9fZ2V0X2NwdV92YXIoZGVjcmVtZW50ZXJzKTsKIAl1NjQgbm93OwogCi0JLyogRW5zdXJlIGEgcG9zaXRpdmUgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGUgZGVjcmVtZW50ZXIsIG9yIGVsc2UKLQkgKiBzb21lIENQVXMgd2lsbCBjb250aW51ZSB0byB0YWtlIGRlY3JlbWVudGVyIGV4Y2VwdGlvbnMuCi0JICovCi0Jc2V0X2RlYyhERUNSRU1FTlRFUl9NQVgpOwotCi0JLyogU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgaG90cGx1ZyB3aWxsIGdldCB0aW1lciBpbnRlcnJ1cHRzIHdoaWxlCi0JICogb2ZmbGluZSwganVzdCBpZ25vcmUgdGhlc2UgYW5kIHdlIGFsc28gbmVlZCB0byBzZXQKLQkgKiBkZWNyZW1lbnRlcnNfbmV4dF90YiBhcyBNQVggdG8gbWFrZSBzdXJlIF9fY2hlY2tfaXJxX3JlcGxheQotCSAqIGRvbid0IHJlcGxheSB0aW1lciBpbnRlcnJ1cHQgd2hlbiByZXR1cm4sIG90aGVyd2lzZSB3ZSdsbCB0cmFwCi0JICogaGVyZSBpbmZpbml0ZWx5IDooCi0JICovCi0JaWYgKCFjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpIHsKLQkJKm5leHRfdGIgPSB+KHU2NCkwOwotCQlyZXR1cm47Ci0JfQotCi0JLyogQ29uZGl0aW9uYWxseSBoYXJkLWVuYWJsZSBpbnRlcnJ1cHRzIG5vdyB0aGF0IHRoZSBERUMgaGFzIGJlZW4KLQkgKiBidW1wZWQgdG8gaXRzIG1heGltdW0gdmFsdWUKLQkgKi8KLQltYXlfaGFyZF9pcnFfZW5hYmxlKCk7Ci0KLQotI2lmIGRlZmluZWQoQ09ORklHX1BQQzMyKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDKQotCWlmIChhdG9taWNfcmVhZCgmcHBjX25fbG9zdF9pbnRlcnJ1cHRzKSAhPSAwKQotCQlkb19JUlEocmVncyk7Ci0jZW5kaWYKLQotCW9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCWlycV9lbnRlcigpOwotCiAJdHJhY2VfdGltZXJfaW50ZXJydXB0X2VudHJ5KHJlZ3MpOwogCiAJaWYgKHRlc3RfaXJxX3dvcmtfcGVuZGluZygpKSB7CkBAIC01NTEsNyArNTE4LDQ4IEBACiAjZW5kaWYKIAogCXRyYWNlX3RpbWVyX2ludGVycnVwdF9leGl0KHJlZ3MpOworfQogCisvKgorICogdGltZXJfaW50ZXJydXB0IC0gZ2V0cyBjYWxsZWQgd2hlbiB0aGUgZGVjcmVtZW50ZXIgb3ZlcmZsb3dzLAorICogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCit2b2lkIHRpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzOworCXU2NCAqbmV4dF90YiA9ICZfX2dldF9jcHVfdmFyKGRlY3JlbWVudGVyc19uZXh0X3RiKTsKKworCS8qIEVuc3VyZSBhIHBvc2l0aXZlIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhlIGRlY3JlbWVudGVyLCBvciBlbHNlCisJICogc29tZSBDUFVzIHdpbGwgY29udGludWUgdG8gdGFrZSBkZWNyZW1lbnRlciBleGNlcHRpb25zLgorCSAqLworCXNldF9kZWMoREVDUkVNRU5URVJfTUFYKTsKKworCS8qIFNvbWUgaW1wbGVtZW50YXRpb25zIG9mIGhvdHBsdWcgd2lsbCBnZXQgdGltZXIgaW50ZXJydXB0cyB3aGlsZQorCSAqIG9mZmxpbmUsIGp1c3QgaWdub3JlIHRoZXNlIGFuZCB3ZSBhbHNvIG5lZWQgdG8gc2V0CisJICogZGVjcmVtZW50ZXJzX25leHRfdGIgYXMgTUFYIHRvIG1ha2Ugc3VyZSBfX2NoZWNrX2lycV9yZXBsYXkKKwkgKiBkb24ndCByZXBsYXkgdGltZXIgaW50ZXJydXB0IHdoZW4gcmV0dXJuLCBvdGhlcndpc2Ugd2UnbGwgdHJhcAorCSAqIGhlcmUgaW5maW5pdGVseSA6KAorCSAqLworCWlmICghY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKSB7CisJCSpuZXh0X3RiID0gfih1NjQpMDsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbmRpdGlvbmFsbHkgaGFyZC1lbmFibGUgaW50ZXJydXB0cyBub3cgdGhhdCB0aGUgREVDIGhhcyBiZWVuCisJICogYnVtcGVkIHRvIGl0cyBtYXhpbXVtIHZhbHVlCisJICovCisJbWF5X2hhcmRfaXJxX2VuYWJsZSgpOworCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEMzMikgJiYgZGVmaW5lZChDT05GSUdfUE1BQykKKwlpZiAoYXRvbWljX3JlYWQoJnBwY19uX2xvc3RfaW50ZXJydXB0cykgIT0gMCkKKwkJZG9fSVJRKHJlZ3MpOworI2VuZGlmCisKKwlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKwlpcnFfZW50ZXIoKTsKKworCV9fdGltZXJfaW50ZXJydXB0KCk7CiAJaXJxX2V4aXQoKTsKIAlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQpAQCAtODI1LDYgKzgzMywxNSBAQAogCQlkZWNyZW1lbnRlcl9zZXRfbmV4dF9ldmVudChERUNSRU1FTlRFUl9NQVgsIGRldik7CiB9CiAKKy8qIEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgYnJvYWRjYXN0IElQSSAqLwordm9pZCB0aWNrX2Jyb2FkY2FzdF9pcGlfaGFuZGxlcih2b2lkKQoreworCXU2NCAqbmV4dF90YiA9ICZfX2dldF9jcHVfdmFyKGRlY3JlbWVudGVyc19uZXh0X3RiKTsKKworCSpuZXh0X3RiID0gZ2V0X3RiX29yX3J0YygpOworCV9fdGltZXJfaW50ZXJydXB0KCk7Cit9CisKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2RlY3JlbWVudGVyX2Nsb2NrZXZlbnQoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZWMgPSAmcGVyX2NwdShkZWNyZW1lbnRlcnMsIGNwdSk7CkBAIC05MjgsNiArOTQ1LDcgQEAKIAljbG9ja3NvdXJjZV9pbml0KCk7CiAKIAlpbml0X2RlY3JlbWVudGVyX2Nsb2NrZXZlbnQoKTsKKwl0aWNrX3NldHVwX2hydGltZXJfYnJvYWRjYXN0KCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDMzY2Q3YTAuLmRmODZmMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTEzNzksOCArMTM3OSw5IEBACiAJaWYgKCFhcmNoX2lycV9kaXNhYmxlZF9yZWdzKHJlZ3MpKQogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQlwcl9lcnIoIiVzRmFjaWxpdHkgJyVzJyB1bmF2YWlsYWJsZSwgZXhjZXB0aW9uIGF0IDB4JWx4LCBNU1I9JWx4XG4iLAotCSAgICAgICBodiA/ICJIeXBlcnZpc29yICIgOiAiIiwgZmFjaWxpdHksIHJlZ3MtPm5pcCwgcmVncy0+bXNyKTsKKwlwcl9lcnJfcmF0ZWxpbWl0ZWQoCisJCSIlc0ZhY2lsaXR5ICclcycgdW5hdmFpbGFibGUsIGV4Y2VwdGlvbiBhdCAweCVseCwgTVNSPSVseFxuIiwKKwkJaHYgPyAiSHlwZXJ2aXNvciAiIDogIiIsIGZhY2lsaXR5LCByZWdzLT5uaXAsIHJlZ3MtPm1zcik7CiAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCV9leGNlcHRpb24oU0lHSUxMLCByZWdzLCBJTExfSUxMT1BDLCByZWdzLT5uaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwppbmRleCAwOTRlNDVjLi5jZTc0YzMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtNzE1LDggKzcxNSw4IEBACiAJdW5zaWduZWQgbG9uZyBjcHUsIG5vZGUsIHZhbDsKIAogCS8qCi0JICogU1BSRzMgY29udGFpbnMgdGhlIENQVSBpbiB0aGUgYm90dG9tIDE2IGJpdHMgYW5kIHRoZSBOVU1BIG5vZGUgaW4KLQkgKiB0aGUgbmV4dCAxNiBiaXRzLiBUaGUgVkRTTyB1c2VzIHRoaXMgdG8gaW1wbGVtZW50IGdldGNwdSgpLgorCSAqIFNQUkdfVkRTTyBjb250YWlucyB0aGUgQ1BVIGluIHRoZSBib3R0b20gMTYgYml0cyBhbmQgdGhlIE5VTUEgbm9kZQorCSAqIGluIHRoZSBuZXh0IDE2IGJpdHMuICBUaGUgVkRTTyB1c2VzIHRoaXMgdG8gaW1wbGVtZW50IGdldGNwdSgpLgogCSAqLwogCWNwdSA9IGdldF9jcHUoKTsKIAlXQVJOX09OX09OQ0UoY3B1ID4gMHhmZmZmKTsKQEAgLTcyNSw4ICs3MjUsOCBAQAogCVdBUk5fT05fT05DRShub2RlID4gMHhmZmZmKTsKIAogCXZhbCA9IChjcHUgJiAweGZmZikgfCAoKG5vZGUgJiAweGZmZmYpIDw8IDE2KTsKLQltdHNwcihTUFJOX1NQUkczLCB2YWwpOwotCWdldF9wYWNhKCktPnNwcmczID0gdmFsOworCW10c3ByKFNQUk5fU1BSR19WRFNPX1dSSVRFLCB2YWwpOworCWdldF9wYWNhKCktPnNwcmdfdmRzbyA9IHZhbDsKIAogCXB1dF9jcHUoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvZ2V0Y3B1LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi9nZXRjcHUuUwppbmRleCA0N2FmZDA4Li4yM2ViOWE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi9nZXRjcHUuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi9nZXRjcHUuUwpAQCAtMjksNyArMjksNyBAQAogICovCiBWX0ZVTkNUSU9OX0JFR0lOKF9fa2VybmVsX2dldGNwdSkKICAgLmNmaV9zdGFydHByb2MKLQltZnNwcglyNSxTUFJOX1VTUFJHMworCW1mc3ByCXI1LFNQUk5fU1BSR19WRFNPX1JFQUQKIAljbXBkaQljcjAscjMsMAogCWNtcGRpCWNyMSxyNCwwCiAJY2xybHdpICByNixyNSwxNgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0Y3B1LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXRjcHUuUwppbmRleCA0N2FmZDA4Li4yM2ViOWE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXRjcHUuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXRjcHUuUwpAQCAtMjksNyArMjksNyBAQAogICovCiBWX0ZVTkNUSU9OX0JFR0lOKF9fa2VybmVsX2dldGNwdSkKICAgLmNmaV9zdGFydHByb2MKLQltZnNwcglyNSxTUFJOX1VTUFJHMworCW1mc3ByCXI1LFNQUk5fU1BSR19WRFNPX1JFQUQKIAljbXBkaQljcjAscjMsMAogCWNtcGRpCWNyMSxyNCwwCiAJY2xybHdpICByNixyNSwxNgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKaW5kZXggODI2ZDhiZDkuLjkwNGM2NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtMTQzMiw3ICsxNDMyLDggQEAKIAogCQkvKiBuZWVkZWQgdG8gZW5zdXJlIHByb3BlciBvcGVyYXRpb24gb2YgY29oZXJlbnQgYWxsb2NhdGlvbnMKIAkJICogbGF0ZXIsIGluIGNhc2UgZHJpdmVyIGRvZXNuJ3Qgc2V0IGl0IGV4cGxpY2l0bHkgKi8KLQkJZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmdmlvZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCQl2aW9kZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSyg2NCk7CisJCXZpb2Rldi0+ZGV2LmRtYV9tYXNrID0gJnZpb2Rldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrOwogCX0KIAogCS8qIHJlZ2lzdGVyIHdpdGggZ2VuZXJpYyBkZXZpY2UgZnJhbWV3b3JrICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKaW5kZXggZTY2ZDRlYy4uNTNkNjQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwpAQCAtNzUsOCArNzUsOCBAQAogRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfQVJDSF8yMDdTKQogCiAJLyogUmVzdG9yZSBTUFJHMyAqLwotCWxkCXIzLFBBQ0FfU1BSRzMocjEzKQotCW10c3ByCVNQUk5fU1BSRzMscjMKKwlsZAlyMyxQQUNBX1NQUkdfVkRTTyhyMTMpCisJbXRzcHIJU1BSTl9TUFJHX1ZEU09fV1JJVEUscjMKIAogCS8qIFJlbG9hZCB0aGUgaG9zdCdzIFBNVSByZWdpc3RlcnMgKi8KIAlsZAlyMywgUEFDQUxQUEFDQVBUUihyMTMpCS8qIGlzIHRoZSBob3N0IHVzaW5nIHRoZSBQTVU/ICovCkBAIC0xNTA0LDczICsxNTA0LDYgQEAKIDE6CWFkZGkJcjgscjgsMTYKIAkuZW5kcgogCi0JLyogU2F2ZSBERUMgKi8KLQltZnNwcglyNSxTUFJOX0RFQwotCW1mdGIJcjYKLQlleHRzdwlyNSxyNQotCWFkZAlyNSxyNSxyNgotCXN0ZAlyNSxWQ1BVX0RFQ19FWFBJUkVTKHI5KQotCi1CRUdJTl9GVFJfU0VDVElPTgotCWIJOGYKLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX0FSQ0hfMjA3UykKLQkvKiBUdXJuIG9uIFRNIHNvIHdlIGNhbiBhY2Nlc3MgVEZIQVIvVEZJQVIvVEVYQVNSICovCi0JbWZtc3IJcjgKLQlsaQlyMCwgMQotCXJsZGltaQlyOCwgcjAsIE1TUl9UTV9MRywgNjMtTVNSX1RNX0xHCi0JbXRtc3JkCXI4Ci0KLQkvKiBTYXZlIFBPV0VSOC1zcGVjaWZpYyByZWdpc3RlcnMgKi8KLQltZnNwcglyNSwgU1BSTl9JQU1SCi0JbWZzcHIJcjYsIFNQUk5fUFNQQgotCW1mc3ByCXI3LCBTUFJOX0ZTQ1IKLQlzdGQJcjUsIFZDUFVfSUFNUihyOSkKLQlzdHcJcjYsIFZDUFVfUFNQQihyOSkKLQlzdGQJcjcsIFZDUFVfRlNDUihyOSkKLQltZnNwcglyNSwgU1BSTl9JQwotCW1mc3ByCXI2LCBTUFJOX1ZUQgotCW1mc3ByCXI3LCBTUFJOX1RBUgotCXN0ZAlyNSwgVkNQVV9JQyhyOSkKLQlzdGQJcjYsIFZDUFVfVlRCKHI5KQotCXN0ZAlyNywgVkNQVV9UQVIocjkpCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCW1mc3ByCXI1LCBTUFJOX1RGSEFSCi0JbWZzcHIJcjYsIFNQUk5fVEZJQVIKLQltZnNwcglyNywgU1BSTl9URVhBU1IKLQlzdGQJcjUsIFZDUFVfVEZIQVIocjkpCi0Jc3RkCXI2LCBWQ1BVX1RGSUFSKHI5KQotCXN0ZAlyNywgVkNQVV9URVhBU1IocjkpCi0jZW5kaWYKLQltZnNwcglyOCwgU1BSTl9FQkJIUgotCXN0ZAlyOCwgVkNQVV9FQkJIUihyOSkKLQltZnNwcglyNSwgU1BSTl9FQkJSUgotCW1mc3ByCXI2LCBTUFJOX0JFU0NSCi0JbWZzcHIJcjcsIFNQUk5fQ1NJR1IKLQltZnNwcglyOCwgU1BSTl9UQUNSCi0Jc3RkCXI1LCBWQ1BVX0VCQlJSKHI5KQotCXN0ZAlyNiwgVkNQVV9CRVNDUihyOSkKLQlzdGQJcjcsIFZDUFVfQ1NJR1IocjkpCi0Jc3RkCXI4LCBWQ1BVX1RBQ1IocjkpCi0JbWZzcHIJcjUsIFNQUk5fVENTQ1IKLQltZnNwcglyNiwgU1BSTl9BQ09QCi0JbWZzcHIJcjcsIFNQUk5fUElECi0JbWZzcHIJcjgsIFNQUk5fV09SVAotCXN0ZAlyNSwgVkNQVV9UQ1NDUihyOSkKLQlzdGQJcjYsIFZDUFVfQUNPUChyOSkKLQlzdHcJcjcsIFZDUFVfR1VFU1RfUElEKHI5KQotCXN0ZAlyOCwgVkNQVV9XT1JUKHI5KQotODoKLQotCS8qIFNhdmUgYW5kIHJlc2V0IEFNUiBhbmQgVUFNT1IgYmVmb3JlIHR1cm5pbmcgb24gdGhlIE1NVSAqLwotQkVHSU5fRlRSX1NFQ1RJT04KLQltZnNwcglyNSxTUFJOX0FNUgotCW1mc3ByCXI2LFNQUk5fVUFNT1IKLQlzdGQJcjUsVkNQVV9BTVIocjkpCi0Jc3RkCXI2LFZDUFVfVUFNT1IocjkpCi0JbGkJcjYsMAotCW10c3ByCVNQUk5fQU1SLHI2Ci1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKLQogCS8qIFVuc2V0IGd1ZXN0IG1vZGUgKi8KIAlsaQlyMCwgS1ZNX0dVRVNUX01PREVfTk9ORQogCXN0YglyMCwgSFNUQVRFX0lOX0dVRVNUKHIxMykKQEAgLTIyMDMsNyArMjEzNiw3IEBACiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQogI2VuZGlmCiAJbWZzcHIJcjYsU1BSTl9WUlNBVkUKLQlzdHcJcjYsVkNQVV9WUlNBVkUocjMpCisJc3R3CXI2LFZDUFVfVlJTQVZFKHIzMSkKIAltdGxyCXIzMAogCW10bXNyZAlyNQogCWlzeW5jCkBAIC0yMjQwLDcgKzIxNzMsNyBAQAogCWJsCS5sb2FkX3ZyX3N0YXRlCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQogI2VuZGlmCi0JbHd6CXI3LFZDUFVfVlJTQVZFKHI0KQorCWx3eglyNyxWQ1BVX1ZSU0FWRShyMzEpCiAJbXRzcHIJU1BSTl9WUlNBVkUscjcKIAltdGxyCXIzMAogCW1yCXI0LHIzMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaW50ZXJydXB0cy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaW50ZXJydXB0cy5TCmluZGV4IGY3Nzk0NTAuLjM1MzNjOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2ludGVycnVwdHMuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMKQEAgLTE1Myw4ICsxNTMsOCBAQAogCSAqIFJlbG9hZCBrZXJuZWwgU1BSRzMgdmFsdWUuCiAJICogTm8gbmVlZCB0byBzYXZlIGd1ZXN0IHZhbHVlIGFzIHVzZXJtb2RlIGNhbid0IG1vZGlmeSBTUFJHMy4KIAkgKi8KLQlsZAlyMywgUEFDQV9TUFJHMyhyMTMpCi0JbXRzcHIJU1BSTl9TUFJHMywgcjMKKwlsZAlyMywgUEFDQV9TUFJHX1ZEU08ocjEzKQorCW10c3ByCVNQUk5fU1BSR19WRFNPX1dSSVRFLCByMwogI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNTXzY0ICovCiAKIAkvKiBSNyA9IHZjcHUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2Vodl9pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlaHZfaW50ZXJydXB0cy5TCmluZGV4IGU0MTg1ZjYuLmExNzEyYjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2Vodl9pbnRlcnJ1cHRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZWh2X2ludGVycnVwdHMuUwpAQCAtMjI5LDE3ICsyMjksMjAgQEAKIAlzdHcJcjEwLCBWQ1BVX0NSKHI0KQogCVBQQ19TVEwgcjExLCBWQ1BVX0dQUihSNCkocjQpCiAJUFBDX1NUTAlyNSwgVkNQVV9HUFIoUjUpKHI0KQotCS5pZiBcdHlwZSA9PSBFWF9DUklUCi0JUFBDX0xMCXI1LCAoXHBhY2FfZXggKyBFWF9SMTMpKHIxMykKLQkuZWxzZQotCW1mc3ByCXI1LCBcc2NyYXRjaAotCS5lbmRpZgogCVBQQ19TVEwJcjYsIFZDUFVfR1BSKFI2KShyNCkKIAlQUENfU1RMCXI4LCBWQ1BVX0dQUihSOCkocjQpCiAJUFBDX1NUTAlyOSwgVkNQVV9HUFIoUjkpKHI0KQotCVBQQ19TVEwgcjUsIFZDUFVfR1BSKFIxMykocjQpCisJLmlmIFx0eXBlID09IEVYX1RMQgorCVBQQ19MTAlyNSwgRVhfVExCX1IxMyhyMTIpCisJUFBDX0xMCXI2LCBFWF9UTEJfUjEwKHIxMikKKwlQUENfTEwJcjgsIEVYX1RMQl9SMTEocjEyKQorCW1mc3ByCXIxMiwgXHNjcmF0Y2gKKwkuZWxzZQorCW1mc3ByCXI1LCBcc2NyYXRjaAogCVBQQ19MTAlyNiwgKFxwYWNhX2V4ICsgXGV4X3IxMCkocjEzKQogCVBQQ19MTAlyOCwgKFxwYWNhX2V4ICsgXGV4X3IxMSkocjEzKQorCS5lbmRpZgorCVBQQ19TVEwgcjUsIFZDUFVfR1BSKFIxMykocjQpCiAJUFBDX1NUTCByMywgVkNQVV9HUFIoUjMpKHI0KQogCVBQQ19TVEwgcjcsIFZDUFVfR1BSKFI3KShyNCkKIAlQUENfU1RMIHIxMiwgVkNQVV9HUFIoUjEyKShyNCkKQEAgLTQzNSwxMCArNDM4LDE2IEBACiAJUFBDX1NUTAlyNSwgVkNQVV9MUihyNCkKIAltZnNwcglyNywgU1BSTl9TUFJHNQogCXN0dwlyMywgVkNQVV9WUlNBVkUocjQpCisjaWZkZWYgQ09ORklHXzY0QklUCisJUFBDX0xMCXIzLCBQQUNBX1NQUkdfVkRTTyhyMTMpCisjZW5kaWYKIAlQUENfU1REKHI2LCBWQ1BVX1NIQVJFRF9TUFJHNCwgcjExKQogCW1mc3ByCXI4LCBTUFJOX1NQUkc2CiAJUFBDX1NURChyNywgVkNQVV9TSEFSRURfU1BSRzUsIHIxMSkKIAltZnNwcglyOSwgU1BSTl9TUFJHNworI2lmZGVmIENPTkZJR182NEJJVAorCW10c3ByCVNQUk5fU1BSR19WRFNPX1dSSVRFLCByMworI2VuZGlmCiAJUFBDX1NURChyOCwgVkNQVV9TSEFSRURfU1BSRzYsIHIxMSkKIAltZnhlcglyMwogCVBQQ19TVEQocjksIFZDUFVfU0hBUkVEX1NQUkc3LCByMTEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL21lbWNweV82NC5TIGIvYXJjaC9wb3dlcnBjL2xpYi9tZW1jcHlfNjQuUwppbmRleCBkMmJiYmM4Li43MmFkMDU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL21lbWNweV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMKQEAgLTE0LDcgKzE0LDkgQEAKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJc3RkCXIzLDQ4KHIxKQkvKiBzYXZlIGRlc3RpbmF0aW9uIHBvaW50ZXIgZm9yIHJldHVybiB2YWx1ZSAqLwogRlRSX1NFQ1RJT05fRUxTRQorI2lmbmRlZiBTRUxGVEVTVAogCWIJbWVtY3B5X3Bvd2VyNworI2VuZGlmCiBBTFRfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKENQVV9GVFJfVk1YX0NPUFkpCiAJUFBDX01UT0NSRigweDAxLHI1KQogCWNtcGxkaQljcjEscjUsMTYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCA0YjVjZDVjLi4yYzhlOTBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCkBAIC0xMzksOSArMTM5LDE0IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CiAJc3RydWN0IHpvbmUgKnpvbmU7CisJaW50IHJldDsKIAogCXpvbmUgPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSk7Ci0JcmV0dXJuIF9fcmVtb3ZlX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldCA9IF9fcmVtb3ZlX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCWlmICghcmV0ICYmIChwcGNfbWQucmVtb3ZlX21lbW9yeSkpCisJCXJldCA9IHBwY19tZC5yZW1vdmVfbWVtb3J5KHN0YXJ0LCBzaXplKTsKKworCXJldHVybiByZXQ7CiB9CiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCmluZGV4IDYyYmY1ZTguLmY2Y2UxZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwpAQCAtNjQ3LDYgKzY0NywxMSBAQAogCQlpZiAob2xkICYgX1BBR0VfSEFTSFBURSkKIAkJCWhwdGVfZG9faHVnZXBhZ2VfZmx1c2godm1hLT52bV9tbSwgYWRkcmVzcywgcG1kcCk7CiAJfQorCS8qCisJICogVGhpcyBlbnN1cmVzIHRoYXQgZ2VuZXJpYyBjb2RlIHRoYXQgcmVseSBvbiBJUlEgZGlzYWJsaW5nCisJICogdG8gcHJldmVudCBhIHBhcmFsbGVsIFRIUCBzcGxpdCB3b3JrIGFzIGV4cGVjdGVkLgorCSAqLworCWtpY2tfYWxsX2NwdXNfc3luYygpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3RsYl9sb3dfNjRlLlMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUwppbmRleCBjOTVlYjMyLi4zNTZlOGI0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUworKysgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUwpAQCAtMzksMzcgKzM5LDQ5IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qCisgKiBOb3RlIHRoYXQsIHVubGlrZSBub24tYm9sdGVkIGhhbmRsZXJzLCBUTEJfRVhGUkFNRSBpcyBub3QKKyAqIG1vZGlmaWVkIGJ5IHRoZSBUTEIgbWlzcyBoYW5kbGVycyB0aGVtc2VsdmVzLCBzaW5jZSB0aGUgVExCIG1pc3MKKyAqIGhhbmRsZXIgY29kZSB3aWxsIG5vdCBpdHNlbGYgY2F1c2UgYSByZWN1cnNpdmUgVExCIG1pc3MuCisgKgorICogVExCX0VYRlJBTUUgd2lsbCBiZSBtb2RpZmllZCB3aGVuIGNyaXQvbWMvZGVidWcgZXhjZXB0aW9ucyBhcmUKKyAqIGVudGVyZWQvZXhpdGVkLgorICovCiAubWFjcm8gdGxiX3Byb2xvZ19ib2x0ZWQgaW50bnVtIGFkZHIKLQltdHNwcglTUFJOX1NQUkdfR0VOX1NDUkFUQ0gscjEzCisJbXRzcHIJU1BSTl9TUFJHX0dFTl9TQ1JBVENILHIxMgorCW1mc3ByCXIxMixTUFJOX1NQUkdfVExCX0VYRlJBTUUKKwlzdGQJcjEzLEVYX1RMQl9SMTMocjEyKQorCXN0ZAlyMTAsRVhfVExCX1IxMChyMTIpCiAJbWZzcHIJcjEzLFNQUk5fU1BSR19QQUNBCi0Jc3RkCXIxMCxQQUNBX0VYVExCK0VYX1RMQl9SMTAocjEzKQorCiAJbWZjcglyMTAKLQlzdGQJcjExLFBBQ0FfRVhUTEIrRVhfVExCX1IxMShyMTMpCisJc3RkCXIxMSxFWF9UTEJfUjExKHIxMikKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0tFX0hWCiBCRUdJTl9GVFJfU0VDVElPTgogCW1mc3ByCXIxMSwgU1BSTl9TUlIxCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9FTUJfSFYpCiAjZW5kaWYKIAlET19LVk0JXGludG51bSwgU1BSTl9TUlIxCi0Jc3RkCXIxNixQQUNBX0VYVExCK0VYX1RMQl9SMTYocjEzKQorCXN0ZAlyMTYsRVhfVExCX1IxNihyMTIpCiAJbWZzcHIJcjE2LFxhZGRyCQkvKiBnZXQgZmF1bHRpbmcgYWRkcmVzcyAqLwotCXN0ZAlyMTQsUEFDQV9FWFRMQitFWF9UTEJfUjE0KHIxMykKKwlzdGQJcjE0LEVYX1RMQl9SMTQocjEyKQogCWxkCXIxNCxQQUNBUEdEKHIxMykKLQlzdGQJcjE1LFBBQ0FfRVhUTEIrRVhfVExCX1IxNShyMTMpCi0Jc3RkCXIxMCxQQUNBX0VYVExCK0VYX1RMQl9DUihyMTMpCi0JVExCX01JU1NfUFJPTE9HX1NUQVRTX0JPTFRFRAorCXN0ZAlyMTUsRVhfVExCX1IxNShyMTIpCisJc3RkCXIxMCxFWF9UTEJfQ1IocjEyKQorCVRMQl9NSVNTX1BST0xPR19TVEFUUwogLmVuZG0KIAogLm1hY3JvIHRsYl9lcGlsb2dfYm9sdGVkCi0JbGQJcjE0LFBBQ0FfRVhUTEIrRVhfVExCX0NSKHIxMykKLQlsZAlyMTAsUEFDQV9FWFRMQitFWF9UTEJfUjEwKHIxMykKLQlsZAlyMTEsUEFDQV9FWFRMQitFWF9UTEJfUjExKHIxMykKKwlsZAlyMTQsRVhfVExCX0NSKHIxMikKKwlsZAlyMTAsRVhfVExCX1IxMChyMTIpCisJbGQJcjExLEVYX1RMQl9SMTEocjEyKQorCWxkCXIxMyxFWF9UTEJfUjEzKHIxMikKIAltdGNyCXIxNAotCWxkCXIxNCxQQUNBX0VYVExCK0VYX1RMQl9SMTQocjEzKQotCWxkCXIxNSxQQUNBX0VYVExCK0VYX1RMQl9SMTUocjEzKQotCVRMQl9NSVNTX1JFU1RPUkVfU1RBVFNfQk9MVEVECi0JbGQJcjE2LFBBQ0FfRVhUTEIrRVhfVExCX1IxNihyMTMpCi0JbWZzcHIJcjEzLFNQUk5fU1BSR19HRU5fU0NSQVRDSAorCWxkCXIxNCxFWF9UTEJfUjE0KHIxMikKKwlsZAlyMTUsRVhfVExCX1IxNShyMTIpCisJVExCX01JU1NfUkVTVE9SRV9TVEFUUworCWxkCXIxNixFWF9UTEJfUjE2KHIxMikKKwltZnNwcglyMTIsU1BSTl9TUFJHX0dFTl9TQ1JBVENICiAuZW5kbQogCiAvKiBEYXRhIFRMQiBtaXNzICovCkBAIC0yODQsNyArMjk2LDcgQEAKICAqIHIxNCA9IHBhZ2UgdGFibGUgYmFzZQogICogcjEzID0gUEFDQQogICogcjExID0gdGxiX3Blcl9jb3JlIHB0cgotICogcjEwID0gY3JhcCAoZnJlZSB0byB1c2UpCisgKiByMTAgPSBjcHUgbnVtYmVyCiAgKi8KIHRsYl9taXNzX2NvbW1vbl9lNjUwMDoKIAkvKgpAQCAtMjkzLDE1ICszMDUsMTggQEAKIAkgKgogCSAqIE1BUzY6SU5EIHNob3VsZCBiZSBhbHJlYWR5IHNldCBiYXNlZCBvbiBNQVM0CiAJICovCi0JYWRkaQlyMTAscjExLFRDRF9MT0NLCi0xOglsYmFyeAlyMTUsMCxyMTAKKzE6CWxiYXJ4CXIxNSwwLHIxMQorCWxoeglyMTAsUEFDQVBBQ0FJTkRFWChyMTMpCiAJY21wZGkJcjE1LDAKKwljbXBkaQljcjEscjE1LDEJLyogc2V0IGNyMS5lcSA9IDAgZm9yIG5vbi1yZWN1cnNpdmUgKi8KIAlibmUJMmYKLQlsaQlyMTUsMQotCXN0YmN4LglyMTUsMCxyMTAKKwlzdGJjeC4JcjEwLDAscjExCiAJYm5lCTFiCiszOgogCS5zdWJzZWN0aW9uIDEKLTI6CWxieglyMTUsMChyMTApCisyOgljbXBkCWNyMSxyMTUscjEwCS8qIHJlY3Vyc2l2ZSBsb2NrIGR1ZSB0byBtY2hlY2svY3JpdC9ldGM/ICovCisJYmVxCWNyMSwzYgkJLyogdW5sb2NrIHdpbGwgaGFwcGVuIGlmIGNyMS5lcSA9IDAgKi8KKwlsYnoJcjE1LDAocjExKQogCWNtcGRpCXIxNSwwCiAJYm5lCTJiCiAJYgkxYgpAQCAtMzc5LDkgKzM5NCwxMSBAQAogCiB0bGJfbWlzc19kb25lX2U2NTAwOgogCS5tYWNybwl0bGJfdW5sb2NrX2U2NTAwCisJYmVxCWNyMSwxZgkJLyogbm8gdW5sb2NrIGlmIGxvY2sgd2FzIHJlY3Vyc2l2ZWx5IGdyYWJiZWQgKi8KIAlsaQlyMTUsMAogCWlzeW5jCi0Jc3RiCXIxNSxUQ0RfTE9DSyhyMTEpCisJc3RiCXIxNSwwKHIxMSkKKzE6CiAJLmVuZG0KIAogCXRsYl91bmxvY2tfZTY1MDAKQEAgLTEwOTEsNyArMTEwOCw4IEBACiAJbGQJcjExLFBBQ0FUT0MocjEzKQogCWxkCXIxMSxsaW5lYXJfbWFwX3RvcEBnb3QocjExKQogCWxkCXIxMCwwKHIxMSkKLQljbXBsZAljcjAscjEwLHIxNgorCXRvdmlydCgxMCwxMCkKKwljbXBsZAljcjAscjE2LHIxMAogCWJnZQl0bGJfbG9hZF9saW5lYXJfZmF1bHQKIAogCS8qIE1BUzEgbmVlZCB3aG9sZSBuZXcgc2V0dXAuICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwppbmRleCBiMzdhNThlLi5hZTNkNWI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKQEAgLTE0NCw2ICsxNDQsMTUgQEAKIGludCBib29rM2VfaHR3X21vZGU7CQkvKiBIVyB0YWJsZXdhbGs/ICBWYWx1ZSBpcyBQUENfSFRXXyogKi8KIHVuc2lnbmVkIGxvbmcgbGluZWFyX21hcF90b3A7CS8qIFRvcCBvZiBsaW5lYXIgbWFwcGluZyAqLwogCisKKy8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHRvIFNQUk5fU1BSR19UTEJfRVhGUkFNRSBvbiBjcml0L21jaGVjay9kZWJ1ZworICogZXhjZXB0aW9ucy4gIFRoaXMgaXMgdXNlZCBmb3IgYm9sdGVkIGFuZCBlNjUwMCBUTEIgbWlzcyBoYW5kbGVycyB3aGljaAorICogZG8gbm90IG1vZGlmeSB0aGlzIFNQUkcgaW4gdGhlIFRMQiBtaXNzIGNvZGU7IGZvciBvdGhlciBUTEIgbWlzcyBoYW5kbGVycywKKyAqIHRoaXMgaXMgc2V0IHRvIHplcm8uCisgKi8KK2ludCBleHRsYl9sZXZlbF9leGM7CisKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQpAQCAtNTU5LDYgKzU2OCw3IEBACiAJCWJyZWFrOwogI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQogCWNhc2UgUFBDX0hUV19FNjUwMDoKKwkJZXh0bGJfbGV2ZWxfZXhjID0gRVhfVExCX1NJWkU7CiAJCXBhdGNoX2V4Y2VwdGlvbigweDFjMCwgZXhjX2RhdGFfdGxiX21pc3NfZTY1MDBfYm9vazNlKTsKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWUwLCBleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfZTY1MDBfYm9vazNlKTsKIAkJYnJlYWs7CkBAIC02NTIsNiArNjYyLDcgQEAKIAkJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQobGluZWFyX21hcF90b3ApOwogCiAJCWlmIChib29rM2VfaHR3X21vZGUgPT0gUFBDX0hUV19OT05FKSB7CisJCQlleHRsYl9sZXZlbF9leGMgPSBFWF9UTEJfU0laRTsKIAkJCXBhdGNoX2V4Y2VwdGlvbigweDFjMCwgZXhjX2RhdGFfdGxiX21pc3NfYm9sdGVkX2Jvb2szZSk7CiAJCQlwYXRjaF9leGNlcHRpb24oMHgxZTAsCiAJCQkJZXhjX2luc3RydWN0aW9uX3RsYl9taXNzX2JvbHRlZF9ib29rM2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGVyZi9NYWtlZmlsZQppbmRleCA2MGQ3MWVlLi5mOWMwODNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9NYWtlZmlsZQpAQCAtMTEsNSArMTEsNyBAQAogb2JqLSQoQ09ORklHX0ZTTF9FTUJfUEVSRl9FVkVOVCkgKz0gY29yZS1mc2wtZW1iLm8KIG9iai0kKENPTkZJR19GU0xfRU1CX1BFUkZfRVZFTlRfRTUwMCkgKz0gZTUwMC1wbXUubyBlNjUwMC1wbXUubwogCitvYmotJChDT05GSUdfSFZfUEVSRl9DVFJTKSArPSBodi0yNHg3Lm8gaHYtZ3BjaS5vIGh2LWNvbW1vbi5vCisKIG9iai0kKENPTkZJR19QUEM2NCkJCSs9ICQob2JqNjQteSkKIG9iai0kKENPTkZJR19QUEMzMikJCSs9ICQob2JqMzIteSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL2NvcmUtYm9vazNzLmMgYi9hcmNoL3Bvd2VycGMvcGVyZi9jb3JlLWJvb2szcy5jCmluZGV4IDY3Y2YyMjAuLjQ1MjBjOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wZXJmL2NvcmUtYm9vazNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvY29yZS1ib29rM3MuYwpAQCAtNzgsNiArNzgsNyBAQAogI2RlZmluZSBNTUNSMF9GQzU2CQkwCiAjZGVmaW5lIE1NQ1IwX1BNQU8JCTAKICNkZWZpbmUgTU1DUjBfRUJFCQkwCisjZGVmaW5lIE1NQ1IwX0JIUkJBCQkwCiAjZGVmaW5lIE1NQ1IwX1BNQ0MJCTAKICNkZWZpbmUgTU1DUjBfUE1DQ19VNgkJMAogCkBAIC0xMjAsNiArMTIxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwb3dlcl9wbXVfYmhyYl9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkge30KIHZvaWQgcG93ZXJfcG11X2ZsdXNoX2JyYW5jaF9zdGFjayh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHBvd2VyX3BtdV9iaHJiX3JlYWQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWh3KSB7fQorc3RhdGljIHZvaWQgcG1hb19yZXN0b3JlX3dvcmthcm91bmQoYm9vbCBlYmIpIHsgfQogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogCiBzdGF0aWMgYm9vbCByZWdzX3VzZV9zaWFyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNTAyLDggKzUwNCwxMSBAQAogCQlpZiAoIWxlYWRlci0+YXR0ci5waW5uZWQgfHwgIWxlYWRlci0+YXR0ci5leGNsdXNpdmUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoZXZlbnQtPmF0dHIuaW5oZXJpdCB8fCBldmVudC0+YXR0ci5zYW1wbGVfcGVyaW9kIHx8Ci0JCSAgICBldmVudC0+YXR0ci5lbmFibGVfb25fZXhlYyB8fCBldmVudC0+YXR0ci5mcmVxKQorCQlpZiAoZXZlbnQtPmF0dHIuZnJlcSB8fAorCQkgICAgZXZlbnQtPmF0dHIuaW5oZXJpdCB8fAorCQkgICAgZXZlbnQtPmF0dHIuc2FtcGxlX3R5cGUgfHwKKwkJICAgIGV2ZW50LT5hdHRyLnNhbXBsZV9wZXJpb2QgfHwKKwkJICAgIGV2ZW50LT5hdHRyLmVuYWJsZV9vbl9leGVjKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01NDIsMTMgKzU0NywyMSBAQAogCWlmICghZWJiKQogCQlnb3RvIG91dDsKIAotCS8qIEVuYWJsZSBFQkIgYW5kIHJlYWQvd3JpdGUgdG8gYWxsIDYgUE1DcyBmb3IgdXNlcnNwYWNlICovCi0JbW1jcjAgfD0gTU1DUjBfRUJFIHwgTU1DUjBfUE1DQ19VNjsKKwkvKiBFbmFibGUgRUJCIGFuZCByZWFkL3dyaXRlIHRvIGFsbCA2IFBNQ3MgYW5kIEJIUkIgZm9yIHVzZXJzcGFjZSAqLworCW1tY3IwIHw9IE1NQ1IwX0VCRSB8IE1NQ1IwX0JIUkJBIHwgTU1DUjBfUE1DQ19VNjsKIAotCS8qIEFkZCBhbnkgYml0cyBmcm9tIHRoZSB1c2VyIHJlZywgRkMgb3IgUE1BTyAqLworCS8qCisJICogQWRkIGFueSBiaXRzIGZyb20gdGhlIHVzZXIgTU1DUjAsIEZDIG9yIFBNQU8uIFRoaXMgaXMgY29tcGF0aWJsZQorCSAqIHdpdGggcG1hb19yZXN0b3JlX3dvcmthcm91bmQoKSBiZWNhdXNlIHdlIG1heSBhZGQgUE1BTyBidXQgd2UgbmV2ZXIKKwkgKiBjbGVhciBpdCBoZXJlLgorCSAqLwogCW1tY3IwIHw9IGN1cnJlbnQtPnRocmVhZC5tbWNyMDsKIAotCS8qIEJlIGNhcmVmdWwgbm90IHRvIHNldCBQTVhFIGlmIHVzZXJzcGFjZSBoYWQgaXQgY2xlYXJlZCAqLworCS8qCisJICogQmUgY2FyZWZ1bCBub3QgdG8gc2V0IFBNWEUgaWYgdXNlcnNwYWNlIGhhZCBpdCBjbGVhcmVkLiBUaGlzIGlzIGFsc28KKwkgKiBjb21wYXRpYmxlIHdpdGggcG1hb19yZXN0b3JlX3dvcmthcm91bmQoKSBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5CisJICogY2xlYXJlZCBQTVhFIGFuZCB3ZSBsZWF2ZSBQTUFPIGFsb25lLgorCSAqLwogCWlmICghKGN1cnJlbnQtPnRocmVhZC5tbWNyMCAmIE1NQ1IwX1BNWEUpKQogCQltbWNyMCAmPSB+TU1DUjBfUE1YRTsKIApAQCAtNTU5LDE0ICs1NzIsOTUgQEAKIG91dDoKIAlyZXR1cm4gbW1jcjA7CiB9CisKK3N0YXRpYyB2b2lkIHBtYW9fcmVzdG9yZV93b3JrYXJvdW5kKGJvb2wgZWJiKQoreworCXVuc2lnbmVkIHBtY3NbNl07CisKKwlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BNQU9fQlVHKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBPbiBQT1dFUjhFIHRoZXJlIGlzIGEgaGFyZHdhcmUgZGVmZWN0IHdoaWNoIGFmZmVjdHMgdGhlIFBNVSBjb250ZXh0CisJICogc3dpdGNoIGxvZ2ljLCBpZS4gcG93ZXJfcG11X2Rpc2FibGUvZW5hYmxlKCkuCisJICoKKwkgKiBXaGVuIGEgY291bnRlciBvdmVyZmxvd3MgUE1YRSBpcyBjbGVhcmVkIGFuZCBGQy9QTUFPIGlzIHNldCBpbiBNTUNSMAorCSAqIGJ5IHRoZSBoYXJkd2FyZS4gU29tZXRpbWUgbGF0ZXIgdGhlIGFjdHVhbCBQTVUgZXhjZXB0aW9uIGlzCisJICogZGVsaXZlcmVkLgorCSAqCisJICogSWYgd2UgY29udGV4dCBzd2l0Y2gsIG9yIHNpbXBseSBkaXNhYmxlL2VuYWJsZSwgdGhlIFBNVSBwcmlvciB0byB0aGUKKwkgKiBleGNlcHRpb24gYXJyaXZpbmcsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBsb3N0IHdoZW4gd2UgY2xlYXIgUE1BTy4KKwkgKgorCSAqIFdoZW4gd2UgcmVlbmFibGUgdGhlIFBNVSwgd2Ugd2lsbCB3cml0ZSB0aGUgc2F2ZWQgTU1DUjAgd2l0aCBQTUFPCisJICogc2V0LCBhbmQgdGhpcyBfc2hvdWxkXyBnZW5lcmF0ZSBhbiBleGNlcHRpb24uIEhvd2V2ZXIgYmVjYXVzZSBvZiB0aGUKKwkgKiBkZWZlY3Qgbm8gZXhjZXB0aW9uIGlzIGdlbmVyYXRlZCB3aGVuIHdlIHdyaXRlIFBNQU8sIGFuZCB3ZSBnZXQKKwkgKiBzdHVjayB3aXRoIG5vIGNvdW50ZXJzIGNvdW50aW5nIGJ1dCBubyBleGNlcHRpb24gZGVsaXZlcmVkLgorCSAqCisJICogVGhlIHdvcmthcm91bmQgaXMgdG8gZGV0ZWN0IHRoaXMgY2FzZSBhbmQgdHdlYWsgdGhlIGhhcmR3YXJlIHRvCisJICogY3JlYXRlIGFub3RoZXIgcGVuZGluZyBQTVUgZXhjZXB0aW9uLgorCSAqCisJICogV2UgZG8gdGhhdCBieSBzZXR0aW5nIHVwIFBNQzYgKGN5Y2xlcykgZm9yIGFuIGltbWluZW50IG92ZXJmbG93IGFuZAorCSAqIGVuYWJsaW5nIHRoZSBQTVUuIFRoYXQgY2F1c2VzIGEgbmV3IGV4Y2VwdGlvbiB0byBiZSBnZW5lcmF0ZWQgaW4gdGhlCisJICogY2hpcCwgYnV0IHdlIGRvbid0IHRha2UgaXQgeWV0IGJlY2F1c2Ugd2UgaGF2ZSBpbnRlcnJ1cHRzIGhhcmQKKwkgKiBkaXNhYmxlZC4gV2UgdGhlbiB3cml0ZSBiYWNrIHRoZSBQTVUgc3RhdGUgYXMgd2Ugd2FudCBpdCB0byBiZSBzZWVuCisJICogYnkgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyLiBXaGVuIHdlIHJlZW5hYmxlIGludGVycnVwdHMgdGhlIGV4Y2VwdGlvbgorCSAqIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgYW5kIHNlZSB0aGUgY29ycmVjdCBzdGF0ZS4KKwkgKgorCSAqIFRoZSBsb2dpYyBpcyB0aGUgc2FtZSBmb3IgRUJCLCBleGNlcHQgdGhhdCB0aGUgZXhjZXB0aW9uIGlzIGdhdGVkIGJ5CisJICogdXMgaGF2aW5nIGludGVycnVwdHMgaGFyZCBkaXNhYmxlZCBhcyB3ZWxsIGFzIHRoZSBmYWN0IHRoYXQgd2UgYXJlCisJICogbm90IGluIHVzZXJzcGFjZS4gVGhlIGV4Y2VwdGlvbiBpcyBmaW5hbGx5IGRlbGl2ZXJlZCB3aGVuIHdlIHJldHVybgorCSAqIHRvIHVzZXJzcGFjZS4KKwkgKi8KKworCS8qIE9ubHkgaWYgUE1BTyBpcyBzZXQgYW5kIFBNQU9fU1lOQyBpcyBjbGVhciAqLworCWlmICgoY3VycmVudC0+dGhyZWFkLm1tY3IwICYgKE1NQ1IwX1BNQU8gfCBNTUNSMF9QTUFPX1NZTkMpKSAhPSBNTUNSMF9QTUFPKQorCQlyZXR1cm47CisKKwkvKiBJZiB3ZSdyZSBkb2luZyBFQkIsIG9ubHkgaWYgQkVTQ1JbR0VdIGlzIHNldCAqLworCWlmIChlYmIgJiYgIShjdXJyZW50LT50aHJlYWQuYmVzY3IgJiBCRVNDUl9HRSkpCisJCXJldHVybjsKKworCS8qCisJICogV2UgYXJlIGFscmVhZHkgc29mdC1kaXNhYmxlZCBpbiBwb3dlcl9wbXVfZW5hYmxlKCkuIFdlIG5lZWQgdG8gaGFyZAorCSAqIGVuYWJsZSB0byBhY3R1YWxseSBwcmV2ZW50IHRoZSBQTVUgZXhjZXB0aW9uIGZyb20gZmlyaW5nLgorCSAqLworCWhhcmRfaXJxX2Rpc2FibGUoKTsKKworCS8qCisJICogVGhpcyBpcyBhIGJpdCBncm9zcywgYnV0IHdlIGtub3cgd2UncmUgb24gUE9XRVI4RSBhbmQgaGF2ZSA2IFBNQ3MuCisJICogVXNpbmcgcmVhZC93cml0ZV9wbWMoKSBpbiBhIGZvciBsb29wIGFkZHMgMTIgZnVuY3Rpb24gY2FsbHMgYW5kCisJICogYWxtb3N0IGRvdWJsZXMgb3VyIGNvZGUgc2l6ZS4KKwkgKi8KKwlwbWNzWzBdID0gbWZzcHIoU1BSTl9QTUMxKTsKKwlwbWNzWzFdID0gbWZzcHIoU1BSTl9QTUMyKTsKKwlwbWNzWzJdID0gbWZzcHIoU1BSTl9QTUMzKTsKKwlwbWNzWzNdID0gbWZzcHIoU1BSTl9QTUM0KTsKKwlwbWNzWzRdID0gbWZzcHIoU1BSTl9QTUM1KTsKKwlwbWNzWzVdID0gbWZzcHIoU1BSTl9QTUM2KTsKKworCS8qIEVuc3VyZSBhbGwgZnJlZXplIGJpdHMgYXJlIHVuc2V0ICovCisJbXRzcHIoU1BSTl9NTUNSMiwgMCk7CisKKwkvKiBTZXQgdXAgUE1DNiB0byBvdmVyZmxvdyBpbiBvbmUgY3ljbGUgKi8KKwltdHNwcihTUFJOX1BNQzYsIDB4N0ZGRkZGRkUpOworCisJLyogRW5hYmxlIGV4Y2VwdGlvbnMgYW5kIHVuZnJlZXplIFBNQzYgKi8KKwltdHNwcihTUFJOX01NQ1IwLCBNTUNSMF9QTVhFIHwgTU1DUjBfUE1DakNFIHwgTU1DUjBfUE1BTyk7CisKKwkvKiBOb3cgd2UgbmVlZCB0byByZWZyZWV6ZSBhbmQgcmVzdG9yZSB0aGUgUE1DcyAqLworCW10c3ByKFNQUk5fTU1DUjAsIE1NQ1IwX0ZDIHwgTU1DUjBfUE1BTyk7CisKKwltdHNwcihTUFJOX1BNQzEsIHBtY3NbMF0pOworCW10c3ByKFNQUk5fUE1DMiwgcG1jc1sxXSk7CisJbXRzcHIoU1BSTl9QTUMzLCBwbWNzWzJdKTsKKwltdHNwcihTUFJOX1BNQzQsIHBtY3NbM10pOworCW10c3ByKFNQUk5fUE1DNSwgcG1jc1s0XSk7CisJbXRzcHIoU1BSTl9QTUM2LCBwbWNzWzVdKTsKK30KICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogc3RhdGljIHZvaWQgcGVyZl9ldmVudF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCi12b2lkIHBlcmZfZXZlbnRfcHJpbnRfZGVidWcodm9pZCkKLXsKLX0KLQogLyoKICAqIFJlYWQgb25lIHBlcmZvcm1hbmNlIG1vbml0b3IgY291bnRlciAoUE1DKS4KICAqLwpAQCAtNjQ1LDYgKzczOSw1NyBAQAogCX0KIH0KIAorLyogQ2FsbGVkIGZyb20gc3lzcnFfaGFuZGxlX3Nob3dyZWdzKCkgKi8KK3ZvaWQgcGVyZl9ldmVudF9wcmludF9kZWJ1Zyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2Rhciwgc2llciwgZmxhZ3M7CisJdTMyIHBtY3NbTUFYX0hXRVZFTlRTXTsKKwlpbnQgaTsKKworCWlmICghcHBtdS0+bl9jb3VudGVyKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlwcl9pbmZvKCJDUFU6ICVkIFBNVSByZWdpc3RlcnMsIHBwbXUgPSAlcyBuX2NvdW50ZXJzID0gJWQiLAorCQkgc21wX3Byb2Nlc3Nvcl9pZCgpLCBwcG11LT5uYW1lLCBwcG11LT5uX2NvdW50ZXIpOworCisJZm9yIChpID0gMDsgaSA8IHBwbXUtPm5fY291bnRlcjsgaSsrKQorCQlwbWNzW2ldID0gcmVhZF9wbWMoaSArIDEpOworCisJZm9yICg7IGkgPCBNQVhfSFdFVkVOVFM7IGkrKykKKwkJcG1jc1tpXSA9IDB4ZGVhZGJlZWY7CisKKwlwcl9pbmZvKCJQTUMxOiAgJTA4eCBQTUMyOiAlMDh4IFBNQzM6ICUwOHggUE1DNDogJTA4eFxuIiwKKwkJIHBtY3NbMF0sIHBtY3NbMV0sIHBtY3NbMl0sIHBtY3NbM10pOworCisJaWYgKHBwbXUtPm5fY291bnRlciA+IDQpCisJCXByX2luZm8oIlBNQzU6ICAlMDh4IFBNQzY6ICUwOHggUE1DNzogJTA4eCBQTUM4OiAlMDh4XG4iLAorCQkJIHBtY3NbNF0sIHBtY3NbNV0sIHBtY3NbNl0sIHBtY3NbN10pOworCisJcHJfaW5mbygiTU1DUjA6ICUwMTZseCBNTUNSMTogJTAxNmx4IE1NQ1JBOiAlMDE2bHhcbiIsCisJCW1mc3ByKFNQUk5fTU1DUjApLCBtZnNwcihTUFJOX01NQ1IxKSwgbWZzcHIoU1BSTl9NTUNSQSkpOworCisJc2RhciA9IHNpZXIgPSAwOworI2lmZGVmIENPTkZJR19QUEM2NAorCXNkYXIgPSBtZnNwcihTUFJOX1NEQVIpOworCisJaWYgKHBwbXUtPmZsYWdzICYgUFBNVV9IQVNfU0lFUikKKwkJc2llciA9IG1mc3ByKFNQUk5fU0lFUik7CisKKwlpZiAocHBtdS0+ZmxhZ3MgJiBQUE1VX0VCQikgeworCQlwcl9pbmZvKCJNTUNSMjogJTAxNmx4IEVCQkhSOiAlMDE2bHhcbiIsCisJCQltZnNwcihTUFJOX01NQ1IyKSwgbWZzcHIoU1BSTl9FQkJIUikpOworCQlwcl9pbmZvKCJFQkJSUjogJTAxNmx4IEJFU0NSOiAlMDE2bHhcbiIsCisJCQltZnNwcihTUFJOX0VCQlJSKSwgbWZzcHIoU1BSTl9CRVNDUikpOworCX0KKyNlbmRpZgorCXByX2luZm8oIlNJQVI6ICAlMDE2bHggU0RBUjogICUwMTZseCBTSUVSOiAgJTAxNmx4XG4iLAorCQltZnNwcihTUFJOX1NJQVIpLCBzZGFyLCBzaWVyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwogLyoKICAqIENoZWNrIGlmIGEgc2V0IG9mIGV2ZW50cyBjYW4gYWxsIGdvIG9uIHRoZSBQTVUgYXQgb25jZS4KICAqIElmIHRoZXkgY2FuJ3QsIHRoaXMgd2lsbCBsb29rIGF0IGFsdGVybmF0aXZlIGNvZGVzIGZvciB0aGUgZXZlbnRzCkBAIC05NzMsMTEgKzExMTgsMTIgQEAKIAkJfQogCiAJCS8qCi0JCSAqIFNldCB0aGUgJ2ZyZWV6ZSBjb3VudGVycycgYml0LCBjbGVhciBFQkUvUE1DQy9QTUFPL0ZDNTYuCisJCSAqIFNldCB0aGUgJ2ZyZWV6ZSBjb3VudGVycycgYml0LCBjbGVhciBFQkUvQkhSQkEvUE1DQy9QTUFPL0ZDNTYKIAkJICovCiAJCXZhbCAgPSBtbWNyMCA9IG1mc3ByKFNQUk5fTU1DUjApOwogCQl2YWwgfD0gTU1DUjBfRkM7Ci0JCXZhbCAmPSB+KE1NQ1IwX0VCRSB8IE1NQ1IwX1BNQ0MgfCBNTUNSMF9QTUFPIHwgTU1DUjBfRkM1Nik7CisJCXZhbCAmPSB+KE1NQ1IwX0VCRSB8IE1NQ1IwX0JIUkJBIHwgTU1DUjBfUE1DQyB8IE1NQ1IwX1BNQU8gfAorCQkJIE1NQ1IwX0ZDNTYpOwogCiAJCS8qCiAJCSAqIFRoZSBiYXJyaWVyIGlzIHRvIG1ha2Ugc3VyZSB0aGUgbXRzcHIgaGFzIGJlZW4KQEAgLTExNDQsNiArMTI5MCw4IEBACiAJY3B1aHctPm1tY3JbMF0gfD0gTU1DUjBfUE1YRSB8IE1NQ1IwX0ZDRUNFOwogCiAgb3V0X2VuYWJsZToKKwlwbWFvX3Jlc3RvcmVfd29ya2Fyb3VuZChlYmIpOworCiAJbW1jcjAgPSBlYmJfc3dpdGNoX2luKGViYiwgY3B1aHctPm1tY3JbMF0pOwogCiAJbWIoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDctY2F0YWxvZy5oIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny1jYXRhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiMTlkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDctY2F0YWxvZy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgTElOVVhfUE9XRVJQQ19QRVJGX0hWXzI0WDdfQ0FUQUxPR19IXworI2RlZmluZSBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfMjRYN19DQVRBTE9HX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBGcm9tIGRvY3VtZW50ICIyNHg3IEV2ZW50IGFuZCBHcm91cCBDYXRhbG9nIEZvcm1hdHMgUHJvcG9zYWwiIHYwLjE1ICovCisKK3N0cnVjdCBodl8yNHg3X2NhdGFsb2dfcGFnZV8wIHsKKyNkZWZpbmUgSFZfMjRYN19DQVRBTE9HX01BR0lDIDB4MzIzNDc4MzcgLyogIjI0eDciIGluIEFTQ0lJICovCisJX19iZTMyIG1hZ2ljOworCV9fYmUzMiBsZW5ndGg7IC8qIEluIDQwOTYgYnl0ZSBwYWdlcyAqLworCV9fYmU2NCB2ZXJzaW9uOyAvKiBYWFg6IGFyYml0cmFyeT8gd2hhdCdzIHRoZSBtZWFuaW5nL3VzZWFnZS9wdXJwb3NlPyAqLworCV9fdTggYnVpbGRfdGltZV9zdGFtcFsxNl07IC8qICJZWVlZTU1EREhITU1TU1wwXDAiICovCisJX191OCByZXNlcnZlZDJbMzJdOworCV9fYmUxNiBzY2hlbWFfZGF0YV9vZmZzOyAvKiBpbiA0MDk2IGJ5dGUgcGFnZXMgKi8KKwlfX2JlMTYgc2NoZW1hX2RhdGFfbGVuOyAgLyogaW4gNDA5NiBieXRlIHBhZ2VzICovCisJX19iZTE2IHNjaGVtYV9lbnRyeV9jb3VudDsKKwlfX3U4IHJlc2VydmVkM1syXTsKKwlfX2JlMTYgZXZlbnRfZGF0YV9vZmZzOworCV9fYmUxNiBldmVudF9kYXRhX2xlbjsKKwlfX2JlMTYgZXZlbnRfZW50cnlfY291bnQ7CisJX191OCByZXNlcnZlZDRbMl07CisJX19iZTE2IGdyb3VwX2RhdGFfb2ZmczsgLyogaW4gNDA5NiBieXRlIHBhZ2VzICovCisJX19iZTE2IGdyb3VwX2RhdGFfbGVuOyAgLyogaW4gNDA5NiBieXRlIHBhZ2VzICovCisJX19iZTE2IGdyb3VwX2VudHJ5X2NvdW50OworCV9fdTggcmVzZXJ2ZWQ1WzJdOworCV9fYmUxNiBmb3JtdWxhX2RhdGFfb2ZmczsgLyogaW4gNDA5NiBieXRlIHBhZ2VzICovCisJX19iZTE2IGZvcm11bGFfZGF0YV9sZW47ICAvKiBpbiA0MDk2IGJ5dGUgcGFnZXMgKi8KKwlfX2JlMTYgZm9ybXVsYV9lbnRyeV9jb3VudDsKKwlfX3U4IHJlc2VydmVkNlsyXTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5N2M5MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogSHlwZXJ2aXNvciBzdXBwbGllZCAiMjR4NyIgcGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0CisgKgorICogQXV0aG9yOiBDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CisgKiBDb3B5cmlnaHQgMjAxNCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJodi0yNHg3OiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJodi0yNHg3LmgiCisjaW5jbHVkZSAiaHYtMjR4Ny1jYXRhbG9nLmgiCisjaW5jbHVkZSAiaHYtY29tbW9uLmgiCisKKy8qCisgKiBUT0RPOiBNZXJnaW5nIGV2ZW50czoKKyAqIC0gVGhpbmsgb2YgdGhlIGhjYWxsIGFzIGFuIGludGVyZmFjZSB0byBhIDRkIGFycmF5IG9mIGNvdW50ZXJzOgorICogICAtIHggPSBkb21haW5zCisgKiAgIC0geSA9IGluZGV4ZXMgaW4gdGhlIGRvbWFpbiAoY29yZSwgY2hpcCwgdmNwdSwgbm9kZSwgZXRjKQorICogICAtIHogPSBvZmZzZXQgaW50byB0aGUgY291bnRlciBzcGFjZQorICogICAtIHcgPSBscGFycyAoZ3Vlc3Qgdm1zLCAibG9naWNhbCBwYXJ0aXRpb25zIikKKyAqIC0gQSBzaW5nbGUgcmVxdWVzdCBpczogeCx5LHlfbGFzdCx6LHpfbGFzdCx3LHdfbGFzdAorICogICAtIHRoaXMgbWVhbnMgd2UgY2FuIHJldHJpZXZlIGEgcmVjdGFuZ2xlIG9mIGNvdW50ZXJzIGluIHkseiBmb3IgYSBzaW5nbGUgeC4KKyAqCisgKiAtIFRoaW5ncyB0byBjb25zaWRlciAoaWdub3Jpbmcgdyk6CisgKiAgIC0gaW5wdXQgIGNvc3RfcGVyX3JlcXVlc3QgPSAxNgorICogICAtIG91dHB1dCBjb3N0X3Blcl9yZXN1bHQoeXMsenMpICA9IDggKyA4ICogeXMgKyB5cyAqIHpzCisgKiAgIC0gbGltaXRlZCBudW1iZXIgb2YgcmVxdWVzdHMgcGVyIGhjYWxsIChtdXN0IGZpdCBpbnRvIDRLIGJ5dGVzKQorICogICAgIC0gNGsgPSAxNiBbYnVmZmVyIGhlYWRlcl0gLSAxNiBbcmVxdWVzdCBzaXplXSAqIHJlcXVlc3RfY291bnQKKyAqICAgICAtIDI1NSByZXF1ZXN0cyBwZXIgaGNhbGwKKyAqICAgLSBzb21ldGltZXMgaXQgd2lsbCBiZSBtb3JlIGVmZmljaWVudCB0byByZWFkIGV4dHJhIGRhdGEgYW5kIGRpc2NhcmQKKyAqLworCisvKgorICogRXhhbXBsZSB1c2FnZToKKyAqICBwZXJmIHN0YXQgLWUgJ2h2XzI0eDcvZG9tYWluPTIsb2Zmc2V0PTgsc3RhcnRpbmdfaW5kZXg9MCxscGFyPTB4ZmZmZmZmZmYvJworICovCisKKy8qIHUzIDAtNiwgb25lIG9mIEhWXzI0WDdfUEVSRl9ET01BSU4gKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQoZG9tYWluLCBjb25maWcsIDAsIDMpOworLyogdTE2ICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKHN0YXJ0aW5nX2luZGV4LCBjb25maWcsIDE2LCAzMSk7CisvKiB1MzIsIHNlZSAiZGF0YV9vZmZzZXQiICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKG9mZnNldCwgY29uZmlnLCAzMiwgNjMpOworLyogdTE2ICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKGxwYXIsIGNvbmZpZzEsIDAsIDE1KTsKKworRVZFTlRfREVGSU5FX1JBTkdFKHJlc2VydmVkMSwgY29uZmlnLCAgIDQsIDE1KTsKK0VWRU5UX0RFRklORV9SQU5HRShyZXNlcnZlZDIsIGNvbmZpZzEsIDE2LCA2Myk7CitFVkVOVF9ERUZJTkVfUkFOR0UocmVzZXJ2ZWQzLCBjb25maWcyLCAgMCwgNjMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZm9ybWF0X2F0dHJzW10gPSB7CisJJmZvcm1hdF9hdHRyX2RvbWFpbi5hdHRyLAorCSZmb3JtYXRfYXR0cl9vZmZzZXQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfc3RhcnRpbmdfaW5kZXguYXR0ciwKKwkmZm9ybWF0X2F0dHJfbHBhci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBmb3JtYXRfYXR0cnMsCit9OworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmh2X3BhZ2VfY2FjaGU7CisKKy8qCisgKiByZWFkX29mZnNldF9kYXRhIC0gY29weSBkYXRhIGZyb20gb25lIGJ1ZmZlciB0byBhbm90aGVyIHdoaWxlIHRyZWF0aW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgIHNvdXJjZSBidWZmZXIgYXMgYSBzbWFsbCB2aWV3IG9uIHRoZSB0b3RhbCBhdmFsaWFibGUKKyAqICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZGF0YS4KKyAqCisgKiBAZGVzdDogYnVmZmVyIHRvIGNvcHkgaW50bworICogQGRlc3RfbGVuOiBsZW5ndGggb2YgQGRlc3QgaW4gYnl0ZXMKKyAqIEByZXF1ZXN0ZWRfb2Zmc2V0OiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgc291cmNlIGRhdGEgd2Ugd2FudC4gTXVzdCBiZSA+IDAKKyAqIEBzcmM6IGJ1ZmZlciB0byBjb3B5IGRhdGEgZnJvbQorICogQHNyY19sZW46IGxlbmd0aCBvZiBAc3JjIGluIGJ5dGVzCisgKiBAc291cmNlX29mZnNldDogdGhlIG9mZnNldCBpbiB0aGUgc29yY2UgZGF0YSB0aGF0IChzcmMsc3JjX2xlbikgcmVmZXJzIHRvLgorICogICAgICAgICAgICAgICAgIE11c3QgYmUgPiAwCisgKgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGFzY2lpIGFydCBzaG93cyB0aGUgdmFyaW91cyBidWZmZXIgcG9zc2l0aW9uaW5nIHdlIG5lZWQgdG8KKyAqIGhhbmRsZSwgYXNzaWducyBzb21lIGFyYml0cmFyeSB2YXJpYmxlcyB0byBwb2ludHMgb24gdGhlIGJ1ZmZlciwgYW5kIHRoZW4KKyAqIHNob3dzIGhvdyB3ZSBmaWRkbGUgd2l0aCB0aG9zZSB2YWx1ZXMgdG8gZ2V0IHRoaW5ncyB3ZSBjYXJlIGFib3V0IChjb3B5CisgKiBzdGFydCBpbiBzcmMgYW5kIGNvcHkgbGVuKQorICoKKyAqIHMgPSBAc3JjIGJ1ZmZlcgorICogZCA9IEBkZXN0IGJ1ZmZlcgorICogJy4nIGFyZWFzIGluIGQgYXJlIHdyaXR0ZW4gdG8uCisgKgorICogICAgICAgICAgICAgICAgICAgICAgIHUKKyAqICAgeCAgICAgICAgIHcJIHYgIHoKKyAqIGQgICAgICAgICAgIHwuLi4uLi4uLi58CisgKiBzIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqICAgICAgICAgICAgICAgICAgICAgIHUKKyAqICAgeCAgICAgICAgIHcJeiAgICAgdgorICogZCAgICAgICAgICAgfC4uLi4uLi4uLS0tLS0tfAorICogcyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqICAgeCAgICAgICAgIHcgICAgICAgIHUseix2CisgKiBkICAgICAgICAgICB8Li4uLi4uLi58CisgKiBzIHwtLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogICB4LHcgICAgICAgICAgICAgICAgdSx2LHoKKyAqIGQgfC4uLi4uLi4uLi4uLi4uLi4uLnwKKyAqIHMgfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiAgIHggICAgICAgIHUKKyAqICAgdyAgICAgICAgdgkJegorICogZCB8Li4uLi4uLi58CisgKiBzIHwtLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogICB4ICAgICAgeiAgIHcgICAgICB2CisgKiBkICAgICAgICAgICAgfC0tLS0tLXwKKyAqIHMgfC0tLS0tLXwKKyAqCisgKiB4ID0gc291cmNlX29mZnNldAorICogdyA9IHJlcXVlc3RlZF9vZmZzZXQKKyAqIHogPSBzb3VyY2Vfb2Zmc2V0ICsgc3JjX2xlbgorICogdiA9IHJlcXVlc3RlZF9vZmZzZXQgKyBkZXN0X2xlbgorICoKKyAqIHdfb2Zmc2V0X2luX3MgPSB3IC0geCA9IHJlcXVlc3RlZF9vZmZzZXQgLSBzb3VyY2Vfb2Zmc2V0CisgKiB6X29mZnNldF9pbl9zID0geiAtIHggPSBzcmNfbGVuCisgKiB2X29mZnNldF9pbl9zID0gdiAtIHggPSByZXF1ZXN0X29mZnNldCArIGRlc3RfbGVuIC0gc3JjX2xlbgorICovCitzdGF0aWMgc3NpemVfdCByZWFkX29mZnNldF9kYXRhKHZvaWQgKmRlc3QsIHNpemVfdCBkZXN0X2xlbiwKKwkJCQlsb2ZmX3QgcmVxdWVzdGVkX29mZnNldCwgdm9pZCAqc3JjLAorCQkJCXNpemVfdCBzcmNfbGVuLCBsb2ZmX3Qgc291cmNlX29mZnNldCkKK3sKKwlzaXplX3Qgd19vZmZzZXRfaW5fcyA9IHJlcXVlc3RlZF9vZmZzZXQgLSBzb3VyY2Vfb2Zmc2V0OworCXNpemVfdCB6X29mZnNldF9pbl9zID0gc3JjX2xlbjsKKwlzaXplX3Qgdl9vZmZzZXRfaW5fcyA9IHJlcXVlc3RlZF9vZmZzZXQgKyBkZXN0X2xlbiAtIHNyY19sZW47CisJc2l6ZV90IHVfb2Zmc2V0X2luX3MgPSBtaW4oel9vZmZzZXRfaW5fcywgdl9vZmZzZXRfaW5fcyk7CisJc2l6ZV90IGNvcHlfbGVuID0gdV9vZmZzZXRfaW5fcyAtIHdfb2Zmc2V0X2luX3M7CisKKwlpZiAocmVxdWVzdGVkX29mZnNldCA8IDAgfHwgc291cmNlX29mZnNldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHpfb2Zmc2V0X2luX3MgPD0gd19vZmZzZXRfaW5fcykKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoZGVzdCwgc3JjICsgd19vZmZzZXRfaW5fcywgY29weV9sZW4pOworCXJldHVybiBjb3B5X2xlbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaF9nZXRfMjR4N19jYXRhbG9nX3BhZ2UoY2hhciBwYWdlW3N0YXRpYyA0MDk2XSwKKwkJCQkJICAgICB1MzIgdmVyc2lvbiwgdTMyIGluZGV4KQoreworCVdBUk5fT04oIUlTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpcGFnZSwgNDA5NikpOworCXJldHVybiBwbHBhcl9oY2FsbF9ub3JldHMoSF9HRVRfMjRYN19DQVRBTE9HX1BBR0UsCisJCQl2aXJ0X3RvX3BoeXMocGFnZSksCisJCQl2ZXJzaW9uLAorCQkJaW5kZXgpOworfQorCitzdGF0aWMgc3NpemVfdCBjYXRhbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwgY2hhciAqYnVmLAorCQkJICAgIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGhyZXQ7CisJc3NpemVfdCByZXQgPSAwOworCXNpemVfdCBjYXRhbG9nX2xlbiA9IDAsIGNhdGFsb2dfcGFnZV9sZW4gPSAwLCBwYWdlX2NvdW50ID0gMDsKKwlsb2ZmX3QgcGFnZV9vZmZzZXQgPSAwOworCXVpbnQzMl90IGNhdGFsb2dfdmVyc2lvbl9udW0gPSAwOworCXZvaWQgKnBhZ2UgPSBrbWVtX2NhY2hlX2FsbG9jKGh2X3BhZ2VfY2FjaGUsIEdGUF9VU0VSKTsKKwlzdHJ1Y3QgaHZfMjR4N19jYXRhbG9nX3BhZ2VfMCAqcGFnZV8wID0gcGFnZTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJaHJldCA9IGhfZ2V0XzI0eDdfY2F0YWxvZ19wYWdlKHBhZ2UsIDAsIDApOworCWlmIChocmV0KSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZV9mcmVlOworCX0KKworCWNhdGFsb2dfdmVyc2lvbl9udW0gPSBiZTMyX3RvX2NwdShwYWdlXzAtPnZlcnNpb24pOworCWNhdGFsb2dfcGFnZV9sZW4gPSBiZTMyX3RvX2NwdShwYWdlXzAtPmxlbmd0aCk7CisJY2F0YWxvZ19sZW4gPSBjYXRhbG9nX3BhZ2VfbGVuICogNDA5NjsKKworCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IC8gNDA5NjsKKwlwYWdlX2NvdW50ICA9IGNvdW50ICAvIDQwOTY7CisKKwlpZiAocGFnZV9vZmZzZXQgPj0gY2F0YWxvZ19wYWdlX2xlbikKKwkJZ290byBlX2ZyZWU7CisKKwlpZiAocGFnZV9vZmZzZXQgIT0gMCkgeworCQlocmV0ID0gaF9nZXRfMjR4N19jYXRhbG9nX3BhZ2UocGFnZSwgY2F0YWxvZ192ZXJzaW9uX251bSwKKwkJCQkJICAgICAgIHBhZ2Vfb2Zmc2V0KTsKKwkJaWYgKGhyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVfZnJlZTsKKwkJfQorCX0KKworCXJldCA9IHJlYWRfb2Zmc2V0X2RhdGEoYnVmLCBjb3VudCwgb2Zmc2V0LAorCQkJCXBhZ2UsIDQwOTYsIHBhZ2Vfb2Zmc2V0ICogNDA5Nik7CitlX2ZyZWU6CisJaWYgKGhyZXQpCisJCXByX2VycigiaF9nZXRfMjR4N19jYXRhbG9nX3BhZ2UodmVyPSVkLCBwYWdlPSVsbGQpIGZhaWxlZDogcmM9JWxkXG4iLAorCQkJCWNhdGFsb2dfdmVyc2lvbl9udW0sIHBhZ2Vfb2Zmc2V0LCBocmV0KTsKKwlrZnJlZShwYWdlKTsKKworCXByX2RldmVsKCJjYXRhbG9nX3JlYWQ6IG9mZnNldD0lbGxkKCVsbGQpIGNvdW50PSV6dSglenUpIGNhdGFsb2dfbGVuPSV6dSglenUpID0+ICV6ZFxuIiwKKwkJCW9mZnNldCwgcGFnZV9vZmZzZXQsIGNvdW50LCBwYWdlX2NvdW50LCBjYXRhbG9nX2xlbiwKKwkJCWNhdGFsb2dfcGFnZV9sZW4sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFBBR0VfMF9BVFRSKF9uYW1lLCBfZm10LCBfZXhwcikJCQkJXAorc3RhdGljIHNzaXplX3QgX25hbWUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAlcCisJCQkgICAgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBocmV0OwkJCQkJXAorCXNzaXplX3QgcmV0ID0gMDsJCQkJCVwKKwl2b2lkICpwYWdlID0ga21lbV9jYWNoZV9hbGxvYyhodl9wYWdlX2NhY2hlLCBHRlBfVVNFUik7CVwKKwlzdHJ1Y3QgaHZfMjR4N19jYXRhbG9nX3BhZ2VfMCAqcGFnZV8wID0gcGFnZTsJCVwKKwlpZiAoIXBhZ2UpCQkJCQkJXAorCQlyZXR1cm4gLUVOT01FTTsJCQkJCVwKKwlocmV0ID0gaF9nZXRfMjR4N19jYXRhbG9nX3BhZ2UocGFnZSwgMCwgMCk7CQlcCisJaWYgKGhyZXQpIHsJCQkJCQlcCisJCXJldCA9IC1FSU87CQkJCQlcCisJCWdvdG8gZV9mcmVlOwkJCQkJXAorCX0JCQkJCQkJXAorCXJldCA9IHNwcmludGYoYnVmLCBfZm10LCBfZXhwcik7CQkJXAorZV9mcmVlOgkJCQkJCQkJXAorCWtmcmVlKHBhZ2UpOwkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhfbmFtZSkKKworUEFHRV8wX0FUVFIoY2F0YWxvZ192ZXJzaW9uLCAiJWxsZFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliZTMyX3RvX2NwdShwYWdlXzAtPnZlcnNpb24pKTsKK1BBR0VfMF9BVFRSKGNhdGFsb2dfbGVuLCAiJWxsZFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliZTMyX3RvX2NwdShwYWdlXzAtPmxlbmd0aCkgKiA0MDk2KTsKK3N0YXRpYyBCSU5fQVRUUl9STyhjYXRhbG9nLCAwLyogcmVhbCBsZW5ndGggdmFyaWVzICovKTsKKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlICppZl9iaW5fYXR0cnNbXSA9IHsKKwkmYmluX2F0dHJfY2F0YWxvZywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlmX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2NhdGFsb2dfbGVuLmF0dHIsCisJJmRldl9hdHRyX2NhdGFsb2dfdmVyc2lvbi5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpZl9ncm91cCA9IHsKKwkubmFtZSA9ICJpbnRlcmZhY2UiLAorCS5iaW5fYXR0cnMgPSBpZl9iaW5fYXR0cnMsCisJLmF0dHJzID0gaWZfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cHNbXSA9IHsKKwkmZm9ybWF0X2dyb3VwLAorCSZpZl9ncm91cCwKKwlOVUxMLAorfTsKKworc3RhdGljIGJvb2wgaXNfcGh5c2ljYWxfZG9tYWluKGludCBkb21haW4pCit7CisJcmV0dXJuICBkb21haW4gPT0gSFZfMjRYN19QRVJGX0RPTUFJTl9QSFlTSUNBTF9DSElQIHx8CisJCWRvbWFpbiA9PSBIVl8yNFg3X1BFUkZfRE9NQUlOX1BIWVNJQ0FMX0NPUkU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNpbmdsZV8yNHg3X3JlcXVlc3QodTggZG9tYWluLCB1MzIgb2Zmc2V0LCB1MTYgaXgsCisJCQkJCSB1MTYgbHBhciwgdTY0ICpyZXMsCisJCQkJCSBib29sIHN1Y2Nlc3NfZXhwZWN0ZWQpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwkvKgorCSAqIHJlcXVlc3RfYnVmZmVyIGFuZCByZXN1bHRfYnVmZmVyIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgNGsgYWxpZ25lZCwKKwkgKiBidXQgYXJlIG5vdCBhbGxvd2VkIHRvIGNyb3NzIGFueSA0ayBib3VuZGFyeS4gQWxpZ25pbmcgdGhlbSB0byA0ayBpcworCSAqIHRoZSBzaW1wbGVzdCB3YXkgdG8gZW5zdXJlIHRoYXQuCisJICovCisJc3RydWN0IHJlcWIgeworCQlzdHJ1Y3QgaHZfMjR4N19yZXF1ZXN0X2J1ZmZlciBidWY7CisJCXN0cnVjdCBodl8yNHg3X3JlcXVlc3QgcmVxOworCX0gX19wYWNrZWQgX19hbGlnbmVkKDQwOTYpIHJlcXVlc3RfYnVmZmVyID0geworCQkuYnVmID0geworCQkJLmludGVyZmFjZV92ZXJzaW9uID0gSFZfMjRYN19JRl9WRVJTSU9OX0NVUlJFTlQsCisJCQkubnVtX3JlcXVlc3RzID0gMSwKKwkJfSwKKwkJLnJlcSA9IHsKKwkJCS5wZXJmb3JtYW5jZV9kb21haW4gPSBkb21haW4sCisJCQkuZGF0YV9zaXplID0gY3B1X3RvX2JlMTYoOCksCisJCQkuZGF0YV9vZmZzZXQgPSBjcHVfdG9fYmUzMihvZmZzZXQpLAorCQkJLnN0YXJ0aW5nX2xwYXJfaXggPSBjcHVfdG9fYmUxNihscGFyKSwKKwkJCS5tYXhfbnVtX2xwYXJzID0gY3B1X3RvX2JlMTYoMSksCisJCQkuc3RhcnRpbmdfaXggPSBjcHVfdG9fYmUxNihpeCksCisJCQkubWF4X2l4ID0gY3B1X3RvX2JlMTYoMSksCisJCX0KKwl9OworCisJc3RydWN0IHJlc2IgeworCQlzdHJ1Y3QgaHZfMjR4N19kYXRhX3Jlc3VsdF9idWZmZXIgYnVmOworCQlzdHJ1Y3QgaHZfMjR4N19yZXN1bHQgcmVzOworCQlzdHJ1Y3QgaHZfMjR4N19yZXN1bHRfZWxlbWVudCBlbGVtOworCQlfX2JlNjQgcmVzdWx0OworCX0gX19wYWNrZWQgX19hbGlnbmVkKDQwOTYpIHJlc3VsdF9idWZmZXIgPSB7fTsKKworCXJldCA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0dFVF8yNFg3X0RBVEEsCisJCQl2aXJ0X3RvX3BoeXMoJnJlcXVlc3RfYnVmZmVyKSwgc2l6ZW9mKHJlcXVlc3RfYnVmZmVyKSwKKwkJCXZpcnRfdG9fcGh5cygmcmVzdWx0X2J1ZmZlciksICBzaXplb2YocmVzdWx0X2J1ZmZlcikpOworCisJaWYgKHJldCkgeworCQlpZiAoc3VjY2Vzc19leHBlY3RlZCkKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgiaGNhbGwgZmFpbGVkOiAlZCAlI3ggJSN4ICVkID0+IDB4JWx4ICglbGQpIGRldGFpbD0weCV4IGZhaWxpbmcgaXg9JXhcbiIsCisJCQkJCWRvbWFpbiwgb2Zmc2V0LCBpeCwgbHBhciwKKwkJCQkJcmV0LCByZXQsCisJCQkJCXJlc3VsdF9idWZmZXIuYnVmLmRldGFpbGVkX3JjLAorCQkJCQlyZXN1bHRfYnVmZmVyLmJ1Zi5mYWlsaW5nX3JlcXVlc3RfaXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpyZXMgPSBiZTY0X3RvX2NwdShyZXN1bHRfYnVmZmVyLnJlc3VsdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXZlbnRfMjR4N19yZXF1ZXN0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTY0ICpyZXMsCisJCWJvb2wgc3VjY2Vzc19leHBlY3RlZCkKK3sKKwlyZXR1cm4gc2luZ2xlXzI0eDdfcmVxdWVzdChldmVudF9nZXRfZG9tYWluKGV2ZW50KSwKKwkJCQlldmVudF9nZXRfb2Zmc2V0KGV2ZW50KSwKKwkJCQlldmVudF9nZXRfc3RhcnRpbmdfaW5kZXgoZXZlbnQpLAorCQkJCWV2ZW50X2dldF9scGFyKGV2ZW50KSwKKwkJCQlyZXMsCisJCQkJc3VjY2Vzc19leHBlY3RlZCk7Cit9CisKK3N0YXRpYyBpbnQgaF8yNHg3X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBodl9wZXJmX2NhcHMgY2FwczsKKwl1bnNpZ25lZCBkb21haW47CisJdW5zaWduZWQgbG9uZyBocmV0OworCXU2NCBjdDsKKworCS8qIE5vdCBvdXIgZXZlbnQgKi8KKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBldmVudC0+cG11LT50eXBlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIFVudXNlZCBhcmVhcyBtdXN0IGJlIDAgKi8KKwlpZiAoZXZlbnRfZ2V0X3Jlc2VydmVkMShldmVudCkgfHwKKwkgICAgZXZlbnRfZ2V0X3Jlc2VydmVkMihldmVudCkgfHwKKwkgICAgZXZlbnRfZ2V0X3Jlc2VydmVkMyhldmVudCkpIHsKKwkJcHJfZGV2ZWwoInJlc2VydmVkIHNldCB3aGVuIGZvcmJpZGRlbiAweCVsbHgoMHglbGx4KSAweCVsbHgoMHglbGx4KSAweCVsbHgoMHglbGx4KVxuIiwKKwkJCQlldmVudC0+YXR0ci5jb25maWcsCisJCQkJZXZlbnRfZ2V0X3Jlc2VydmVkMShldmVudCksCisJCQkJZXZlbnQtPmF0dHIuY29uZmlnMSwKKwkJCQlldmVudF9nZXRfcmVzZXJ2ZWQyKGV2ZW50KSwKKwkJCQlldmVudC0+YXR0ci5jb25maWcyLAorCQkJCWV2ZW50X2dldF9yZXNlcnZlZDMoZXZlbnQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdW5zdXBwb3J0ZWQgbW9kZXMgYW5kIGZpbHRlcnMgKi8KKwlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiAgICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0ICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ndWVzdCAgfHwKKwkgICAgaXNfc2FtcGxpbmdfZXZlbnQoZXZlbnQpKSAvKiBubyBzYW1wbGluZyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG5vIGJyYW5jaCBzYW1wbGluZyAqLworCWlmIChoYXNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogb2Zmc2V0IG11c3QgYmUgOCBieXRlIGFsaWduZWQgKi8KKwlpZiAoZXZlbnRfZ2V0X29mZnNldChldmVudCkgJSA4KSB7CisJCXByX2RldmVsKCJiYWQgYWxpZ25tZW50XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRG9tYWlucyBhYm92ZSA2IGFyZSBpbnZhbGlkICovCisJZG9tYWluID0gZXZlbnRfZ2V0X2RvbWFpbihldmVudCk7CisJaWYgKGRvbWFpbiA+IDYpIHsKKwkJcHJfZGV2ZWwoImludmFsaWQgZG9tYWluICVkXG4iLCBkb21haW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlocmV0ID0gaHZfcGVyZl9jYXBzX2dldCgmY2Fwcyk7CisJaWYgKGhyZXQpIHsKKwkJcHJfZGV2ZWwoImNvdWxkIG5vdCBnZXQgY2FwYWJpbGl0aWVzOiByYz0lbGRcbiIsIGhyZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBQSFlTSUNBTCBkb21haW5zICYgb3RoZXIgbHBhcnMgcmVxdWlyZSBleHRyYSBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoIWNhcHMuY29sbGVjdF9wcml2aWxlZ2VkICYmIChpc19waHlzaWNhbF9kb21haW4oZG9tYWluKSB8fAorCQkoZXZlbnRfZ2V0X2xwYXIoZXZlbnQpICE9IGV2ZW50X2dldF9scGFyX21heCgpKSkpIHsKKwkJcHJfZGV2ZWwoImh2IHBlcm1pc2lvbnMgZGlzYWxsb3c6IGlzX3BoeXNpY2FsX2RvbWFpbjolZCwgbHBhcj0weCVsbHhcbiIsCisJCQkJaXNfcGh5c2ljYWxfZG9tYWluKGRvbWFpbiksCisJCQkJZXZlbnRfZ2V0X2xwYXIoZXZlbnQpKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogc2VlIGlmIHRoZSBldmVudCBjb21wbGFpbnMgKi8KKwlpZiAoZXZlbnRfMjR4N19yZXF1ZXN0KGV2ZW50LCAmY3QsIGZhbHNlKSkgeworCQlwcl9kZXZlbCgidGVzdCBoY2FsbCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBoXzI0eDdfZ2V0X3ZhbHVlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwl1NjQgY3Q7CisJcmV0ID0gZXZlbnRfMjR4N19yZXF1ZXN0KGV2ZW50LCAmY3QsIHRydWUpOworCWlmIChyZXQpCisJCS8qIFdlIGNoZWNrZWQgdGhpcyBpbiBldmVudCBpbml0LCBzaG91bGRuJ3QgZmFpbCBoZXJlLi4uICovCisJCXJldHVybiAwOworCisJcmV0dXJuIGN0OworfQorCitzdGF0aWMgdm9pZCBoXzI0eDdfZXZlbnRfdXBkYXRlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzNjQgcHJldjsKKwl1NjQgbm93OworCW5vdyA9IGhfMjR4N19nZXRfdmFsdWUoZXZlbnQpOworCXByZXYgPSBsb2NhbDY0X3hjaGcoJmV2ZW50LT5ody5wcmV2X2NvdW50LCBub3cpOworCWxvY2FsNjRfYWRkKG5vdyAtIHByZXYsICZldmVudC0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZCBoXzI0eDdfZXZlbnRfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgUEVSRl9FRl9SRUxPQUQpCisJCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgaF8yNHg3X2dldF92YWx1ZShldmVudCkpOworfQorCitzdGF0aWMgdm9pZCBoXzI0eDdfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwloXzI0eDdfZXZlbnRfdXBkYXRlKGV2ZW50KTsKK30KKworc3RhdGljIGludCBoXzI0eDdfZXZlbnRfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIFBFUkZfRUZfU1RBUlQpCisJCWhfMjR4N19ldmVudF9zdGFydChldmVudCwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaF8yNHg3X2V2ZW50X2lkeChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG11IGhfMjR4N19wbXUgPSB7CisJLnRhc2tfY3R4X25yID0gcGVyZl9pbnZhbGlkX2NvbnRleHQsCisKKwkubmFtZSA9ICJodl8yNHg3IiwKKwkuYXR0cl9ncm91cHMgPSBhdHRyX2dyb3VwcywKKwkuZXZlbnRfaW5pdCAgPSBoXzI0eDdfZXZlbnRfaW5pdCwKKwkuYWRkICAgICAgICAgPSBoXzI0eDdfZXZlbnRfYWRkLAorCS5kZWwgICAgICAgICA9IGhfMjR4N19ldmVudF9zdG9wLAorCS5zdGFydCAgICAgICA9IGhfMjR4N19ldmVudF9zdGFydCwKKwkuc3RvcCAgICAgICAgPSBoXzI0eDdfZXZlbnRfc3RvcCwKKwkucmVhZCAgICAgICAgPSBoXzI0eDdfZXZlbnRfdXBkYXRlLAorCS5ldmVudF9pZHggICA9IGhfMjR4N19ldmVudF9pZHgsCit9OworCitzdGF0aWMgaW50IGh2XzI0eDdfaW5pdCh2b2lkKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgaHJldDsKKwlzdHJ1Y3QgaHZfcGVyZl9jYXBzIGNhcHM7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpIHsKKwkJcHJfaW5mbygibm90IGEgdmlydHVhbGl6ZWQgc3lzdGVtLCBub3QgZW5hYmxpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlocmV0ID0gaHZfcGVyZl9jYXBzX2dldCgmY2Fwcyk7CisJaWYgKGhyZXQpIHsKKwkJcHJfaW5mbygiY291bGQgbm90IG9idGFpbiBjYXBhYmlsaXRpZXMsIGVycm9yIDB4JTgwbHgsIG5vdCBlbmFibGluZ1xuIiwKKwkJCQlocmV0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaHZfcGFnZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJodi1wYWdlLTQwOTYiLCA0MDk2LCA0MDk2LCAwLCBOVUxMKTsKKwlpZiAoIWh2X3BhZ2VfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJciA9IHBlcmZfcG11X3JlZ2lzdGVyKCZoXzI0eDdfcG11LCBoXzI0eDdfcG11Lm5hbWUsIC0xKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKGh2XzI0eDdfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmggYi9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwZWJjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuaApAQCAtMCwwICsxLDEwOSBAQAorI2lmbmRlZiBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfMjRYN19IXworI2RlZmluZSBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfMjRYN19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGh2XzI0eDdfcmVxdWVzdCB7CisJLyogUEhZU0lDQUwgZG9tYWlucyByZXF1aXJlIGVuYWJsaW5nIHZpYSBwaHlwL2htYy4gKi8KKyNkZWZpbmUgSFZfMjRYN19QRVJGX0RPTUFJTl9QSFlTSUNBTF9DSElQIDB4MDEKKyNkZWZpbmUgSFZfMjRYN19QRVJGX0RPTUFJTl9QSFlTSUNBTF9DT1JFIDB4MDIKKyNkZWZpbmUgSFZfMjRYN19QRVJGX0RPTUFJTl9WSVJUVUFMX1BST0NFU1NPUl9IT01FX0NPUkUgICAweDAzCisjZGVmaW5lIEhWXzI0WDdfUEVSRl9ET01BSU5fVklSVFVBTF9QUk9DRVNTT1JfSE9NRV9DSElQICAgMHgwNAorI2RlZmluZSBIVl8yNFg3X1BFUkZfRE9NQUlOX1ZJUlRVQUxfUFJPQ0VTU09SX0hPTUVfTk9ERSAgIDB4MDUKKyNkZWZpbmUgSFZfMjRYN19QRVJGX0RPTUFJTl9WSVJUVUFMX1BST0NFU1NPUl9SRU1PVEVfTk9ERSAweDA2CisJX191OCBwZXJmb3JtYW5jZV9kb21haW47CisJX191OCByZXNlcnZlZFsweDFdOworCisJLyogYnl0ZXMgdG8gcmVhZCBzdGFydGluZyBhdCBAZGF0YV9vZmZzZXQuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4ICovCisJX19iZTE2IGRhdGFfc2l6ZTsKKworCS8qCisJICogYnl0ZSBvZmZzZXQgd2l0aGluIHRoZSBwZXJmIGRvbWFpbiB0byByZWFkIGZyb20uIG11c3QgYmUgOCBieXRlCisJICogYWxpZ25lZAorCSAqLworCV9fYmUzMiBkYXRhX29mZnNldDsKKworCS8qCisJICogb25seSB2YWxpZCBmb3IgVklSVFVBTF9QUk9DRVNTT1IgZG9tYWlucywgaWdub3JlZCBmb3Igb3RoZXJzLgorCSAqIC0xIG1lYW5zICJjdXJyZW50IHBhcnRpdGlvbiBvbmx5IgorCSAqICBFbmFibGluZyB2aWEgcGh5cC9obWMgcmVxdWlyZWQgZm9yIG5vbi0iLTEiIHZhbHVlcy4gMCBmb3JiaWRkZW4KKwkgKiAgdW5sZXNzIHJlcXVlc3RvciBpcyAwLgorCSAqLworCV9fYmUxNiBzdGFydGluZ19scGFyX2l4OworCisJLyoKKwkgKiBJZ25vcmVkIHdoZW4gQHN0YXJ0aW5nX2xwYXJfaXggPT0gLTEKKwkgKiBJZ25vcmVkIHdoZW4gQHBlcmZvcm1hbmNlX2RvbWFpbiBpcyBub3QgVklSVFVBTF9QUk9DRVNTT1JfKgorCSAqIC0xIG1lYW5zICJpbmZpbml0ZSIgb3IgYWxsCisJICovCisJX19iZTE2IG1heF9udW1fbHBhcnM7CisKKwkvKiBjaGlwLCBjb3JlLCBvciB2aXJ0dWFsIHByb2Nlc3NvciBiYXNlZCBvbiBAcGVyZm9ybWFuY2VfZG9tYWluICovCisJX19iZTE2IHN0YXJ0aW5nX2l4OworCV9fYmUxNiBtYXhfaXg7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaHZfMjR4N19yZXF1ZXN0X2J1ZmZlciB7CisJLyogMCAtID8gKi8KKwkvKiAxIC0gPyAqLworI2RlZmluZSBIVl8yNFg3X0lGX1ZFUlNJT05fQ1VSUkVOVCAweDAxCisJX191OCBpbnRlcmZhY2VfdmVyc2lvbjsKKwlfX3U4IG51bV9yZXF1ZXN0czsKKwlfX3U4IHJlc2VydmVkWzB4RV07CisJc3RydWN0IGh2XzI0eDdfcmVxdWVzdCByZXF1ZXN0c1tdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGh2XzI0eDdfcmVzdWx0X2VsZW1lbnQgeworCV9fYmUxNiBscGFyX2l4OworCisJLyoKKwkgKiByZXByZXNlbnRzIHRoZSBjb3JlLCBjaGlwLCBvciB2aXJ0dWFsIHByb2Nlc3NvciBiYXNlZCBvbiB0aGUKKwkgKiByZXF1ZXN0J3MgQHBlcmZvcm1hbmNlX2RvbWFpbgorCSAqLworCV9fYmUxNiBkb21haW5faXg7CisKKwkvKiAtMSBpZiBAcGVyZm9ybWFuY2VfZG9tYWluIGRvZXMgbm90IHJlZmVyIHRvIGEgdmlydHVhbCBwcm9jZXNzb3IgKi8KKwlfX2JlMzIgbHBhcl9jZmdfaW5zdGFuY2VfaWQ7CisKKwkvKiBzaXplID0gQHJlc3VsdF9lbGVtZW50X2RhdGFfc2l6ZSBvZiBjb2ludGFpbmluZyByZXN1bHQuICovCisJX191OCBlbGVtZW50X2RhdGFbXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBodl8yNHg3X3Jlc3VsdCB7CisJX191OCByZXN1bHRfaXg7CisKKwkvKgorCSAqIDAgPSBub3QgYWxsIHJlc3VsdCBlbGVtZW50cyBmaXQgaW50byB0aGUgYnVmZmVyLCBhZGRpdGlvbmFsIHJlcXVlc3RzCisJICogICAgIHJlcXVpcmVkCisJICogMSA9IGFsbCByZXN1bHQgZWxlbWVudHMgd2VyZSByZXR1cm5lZAorCSAqLworCV9fdTggcmVzdWx0c19jb21wbGV0ZTsKKwlfX2JlMTYgbnVtX2VsZW1lbnRzX3JldHVybmVkOworCisJLyogVGhpcyBpcyBhIGNvcHkgb2YgQGRhdGFfc2l6ZSBmcm9tIHRoZSBjb3Jlc3BvbmRpbmcgaHZfMjR4N19yZXF1ZXN0ICovCisJX19iZTE2IHJlc3VsdF9lbGVtZW50X2RhdGFfc2l6ZTsKKwlfX3U4IHJlc2VydmVkWzB4Ml07CisKKwkvKiBXQVJOSU5HOiBvbmx5IHZhbGlkIGZvciBmaXJzdCByZXN1bHQgZWxlbWVudCBkdWUgdG8gdmFyaWFibGUgc2l6ZXMKKwkgKiAgICAgICAgICBvZiByZXN1bHQgZWxlbWVudHMgKi8KKwkvKiBzdHJ1Y3QgaHZfMjR4N19yZXN1bHRfZWxlbWVudFtAbnVtX2VsZW1lbnRzX3JldHVybmVkXSAqLworCXN0cnVjdCBodl8yNHg3X3Jlc3VsdF9lbGVtZW50IGVsZW1lbnRzW107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaHZfMjR4N19kYXRhX3Jlc3VsdF9idWZmZXIgeworCS8qIFNlZSB2ZXJzaW9uaW5nIGZvciByZXF1ZXN0IGJ1ZmZlciAqLworCV9fdTggaW50ZXJmYWNlX3ZlcnNpb247CisKKwlfX3U4IG51bV9yZXN1bHRzOworCV9fdTggcmVzZXJ2ZWRbMHgxXTsKKwlfX3U4IGZhaWxpbmdfcmVxdWVzdF9peDsKKwlfX2JlMzIgZGV0YWlsZWRfcmM7CisJX19iZTY0IGNlY19jZmdfaW5zdGFuY2VfaWQ7CisJX19iZTY0IGNhdGFsb2dfdmVyc2lvbl9udW07CisJX191OCByZXNlcnZlZDJbMHg4XTsKKwkvKiBXQVJOSU5HOiBvbmx5IHZhbGlkIGZvciB0aGUgZmlyc3QgcmVzdWx0IGR1ZSB0byB2YXJpYWJsZSBzaXplcyBvZgorCSAqCSAgICByZXN1bHRzICovCisJc3RydWN0IGh2XzI0eDdfcmVzdWx0IHJlc3VsdHNbXTsgLyogW0BudW1fcmVzdWx0c10gKi8KK30gX19wYWNrZWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UwMmIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtY29tbW9uLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKworI2luY2x1ZGUgImh2LWdwY2kuaCIKKyNpbmNsdWRlICJodi1jb21tb24uaCIKKwordW5zaWduZWQgbG9uZyBodl9wZXJmX2NhcHNfZ2V0KHN0cnVjdCBodl9wZXJmX2NhcHMgKmNhcHMpCit7CisJdW5zaWduZWQgbG9uZyByOworCXN0cnVjdCBwIHsKKwkJc3RydWN0IGh2X2dldF9wZXJmX2NvdW50ZXJfaW5mb19wYXJhbXMgcGFyYW1zOworCQlzdHJ1Y3QgY3Zfc3lzdGVtX3BlcmZvcm1hbmNlX2NhcGFiaWxpdGllcyBjYXBzOworCX0gX19wYWNrZWQgX19hbGlnbmVkKHNpemVvZih1aW50NjRfdCkpOworCisJc3RydWN0IHAgYXJnID0geworCQkucGFyYW1zID0geworCQkJLmNvdW50ZXJfcmVxdWVzdCA9IGNwdV90b19iZTMyKAorCQkJCQlDSVJfU1lTVEVNX1BFUkZPUk1BTkNFX0NBUEFCSUxJVElFUyksCisJCQkuc3RhcnRpbmdfaW5kZXggPSBjcHVfdG9fYmUzMigtMSksCisJCQkuY291bnRlcl9pbmZvX3ZlcnNpb25faW4gPSAwLAorCQl9CisJfTsKKworCXIgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9HRVRfUEVSRl9DT1VOVEVSX0lORk8sCisJCQkgICAgICAgdmlydF90b19waHlzKCZhcmcpLCBzaXplb2YoYXJnKSk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlwcl9kZXZlbCgiY2FwYWJpbGl0eV9tYXNrOiAweCV4XG4iLCBhcmcuY2Fwcy5jYXBhYmlsaXR5X21hc2spOworCisJY2Fwcy0+dmVyc2lvbiA9IGFyZy5wYXJhbXMuY291bnRlcl9pbmZvX3ZlcnNpb25fb3V0OworCWNhcHMtPmNvbGxlY3RfcHJpdmlsZWdlZCA9ICEhYXJnLmNhcHMucGVyZl9jb2xsZWN0X3ByaXZpbGVnZWQ7CisJY2Fwcy0+Z2EgPSAhIShhcmcuY2Fwcy5jYXBhYmlsaXR5X21hc2sgJiBDVl9DTV9HQSk7CisJY2Fwcy0+ZXhwYW5kZWQgPSAhIShhcmcuY2Fwcy5jYXBhYmlsaXR5X21hc2sgJiBDVl9DTV9FWFBBTkRFRCk7CisJY2Fwcy0+bGFiID0gISEoYXJnLmNhcHMuY2FwYWJpbGl0eV9tYXNrICYgQ1ZfQ01fTEFCKTsKKworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtY29tbW9uLmggYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc5Y2VjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtY29tbW9uLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfQ09NTU9OX0hfCisjZGVmaW5lIExJTlVYX1BPV0VSUENfUEVSRl9IVl9DT01NT05fSF8KKworI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaHZfcGVyZl9jYXBzIHsKKwl1MTYgdmVyc2lvbjsKKwl1MTYgY29sbGVjdF9wcml2aWxlZ2VkOjEsCisJICAgIGdhOjEsCisJICAgIGV4cGFuZGVkOjEsCisJICAgIGxhYjoxLAorCSAgICB1bnVzZWQ6MTI7Cit9OworCit1bnNpZ25lZCBsb25nIGh2X3BlcmZfY2Fwc19nZXQoc3RydWN0IGh2X3BlcmZfY2FwcyAqY2Fwcyk7CisKKworI2RlZmluZSBFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKG5hbWUsIGF0dHJfdmFyLCBiaXRfc3RhcnQsIGJpdF9lbmQpCVwKK1BNVV9GT1JNQVRfQVRUUihuYW1lLCAjYXR0cl92YXIgIjoiICNiaXRfc3RhcnQgIi0iICNiaXRfZW5kKTsJCVwKK0VWRU5UX0RFRklORV9SQU5HRShuYW1lLCBhdHRyX3ZhciwgYml0X3N0YXJ0LCBiaXRfZW5kKQorCisjZGVmaW5lIEVWRU5UX0RFRklORV9SQU5HRShuYW1lLCBhdHRyX3ZhciwgYml0X3N0YXJ0LCBiaXRfZW5kKQlcCitzdGF0aWMgdTY0IGV2ZW50X2dldF8jI25hbWUjI19tYXgodm9pZCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKChiaXRfc3RhcnQgPiBiaXRfZW5kKQkJCQlcCisJCSAgICB8fCAoYml0X2VuZCA+PSAoc2l6ZW9mKDF1bGwpICogOCkpKTsJCVwKKwlyZXR1cm4gKCgoMXVsbCA8PCAoYml0X2VuZCAtIGJpdF9zdGFydCkpIC0gMSkgPDwgMSkgKyAxOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIHU2NCBldmVudF9nZXRfIyNuYW1lKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiAoZXZlbnQtPmF0dHIuYXR0cl92YXIgPj4gKGJpdF9zdGFydCkpICYJCQlcCisJCWV2ZW50X2dldF8jI25hbWUjI19tYXgoKTsJCQkJXAorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL2h2LWdwY2kuYyBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LWdwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhiYTdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogSHlwZXJ2aXNvciBzdXBwbGllZCAiZ3BjaSIgKCJnZXQgcGVyZm9ybWFuY2UgY291bnRlciBpbmZvIikgcGVyZm9ybWFuY2UKKyAqIGNvdW50ZXIgc3VwcG9ydAorICoKKyAqIEF1dGhvcjogQ29keSBQIFNjaGFmZXIgPGNvZHlAbGludXgudm5ldC5pYm0uY29tPgorICogQ29weXJpZ2h0IDIwMTQgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSAiaHYtZ3BjaTogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiaHYtZ3BjaS5oIgorI2luY2x1ZGUgImh2LWNvbW1vbi5oIgorCisvKgorICogRXhhbXBsZSB1c2FnZToKKyAqICBwZXJmIHN0YXQgLWUgJ2h2X2dwY2kvY291bnRlcl9pbmZvX3ZlcnNpb249MyxvZmZzZXQ9MCxsZW5ndGg9OCwKKyAqCQkgIHNlY29uZGFyeV9pbmRleD0wLHN0YXJ0aW5nX2luZGV4PTB4ZmZmZmZmZmYscmVxdWVzdD0weDEwLycgLi4uCisgKi8KKworLyogdTMyICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKHJlcXVlc3QsIGNvbmZpZywgMCwgMzEpOworLyogdTMyICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKHN0YXJ0aW5nX2luZGV4LCBjb25maWcsIDMyLCA2Myk7CisvKiB1MTYgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQoc2Vjb25kYXJ5X2luZGV4LCBjb25maWcxLCAwLCAxNSk7CisvKiB1OCAqLworRVZFTlRfREVGSU5FX1JBTkdFX0ZPUk1BVChjb3VudGVyX2luZm9fdmVyc2lvbiwgY29uZmlnMSwgMTYsIDIzKTsKKy8qIHU4LCBieXRlcyBvZiBkYXRhICgxLTgpICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKGxlbmd0aCwgY29uZmlnMSwgMjQsIDMxKTsKKy8qIHUzMiwgYnl0ZSBvZmZzZXQgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQob2Zmc2V0LCBjb25maWcxLCAzMiwgNjMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZm9ybWF0X2F0dHJzW10gPSB7CisJJmZvcm1hdF9hdHRyX3JlcXVlc3QuYXR0ciwKKwkmZm9ybWF0X2F0dHJfc3RhcnRpbmdfaW5kZXguYXR0ciwKKwkmZm9ybWF0X2F0dHJfc2Vjb25kYXJ5X2luZGV4LmF0dHIsCisJJmZvcm1hdF9hdHRyX2NvdW50ZXJfaW5mb192ZXJzaW9uLmF0dHIsCisKKwkmZm9ybWF0X2F0dHJfb2Zmc2V0LmF0dHIsCisJJmZvcm1hdF9hdHRyX2xlbmd0aC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBmb3JtYXRfYXR0cnMsCit9OworCisjZGVmaW5lIEhWX0NBUFNfQVRUUihfbmFtZSwgX2Zvcm1hdCkJCQkJXAorc3RhdGljIHNzaXplX3QgX25hbWUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCSAgICBjaGFyICpwYWdlKQkJCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGh2X3BlcmZfY2FwcyBjYXBzOwkJCQlcCisJdW5zaWduZWQgbG9uZyBocmV0ID0gaHZfcGVyZl9jYXBzX2dldCgmY2Fwcyk7CQlcCisJaWYgKGhyZXQpCQkJCQkJXAorCQlyZXR1cm4gLUVJTzsJCQkJCVwKKwkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKHBhZ2UsIF9mb3JtYXQsIGNhcHMuX25hbWUpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGh2X2NhcHNfYXR0cl8jI19uYW1lID0gX19BVFRSX1JPKF9uYW1lKQorCitzdGF0aWMgc3NpemVfdCBrZXJuZWxfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIweCV4XG4iLCBDT1VOVEVSX0lORk9fVkVSU0lPTl9DVVJSRU5UKTsKK30KKworREVWSUNFX0FUVFJfUk8oa2VybmVsX3ZlcnNpb24pOworSFZfQ0FQU19BVFRSKHZlcnNpb24sICIweCV4XG4iKTsKK0hWX0NBUFNfQVRUUihnYSwgIiVkXG4iKTsKK0hWX0NBUFNfQVRUUihleHBhbmRlZCwgIiVkXG4iKTsKK0hWX0NBUFNfQVRUUihsYWIsICIlZFxuIik7CitIVl9DQVBTX0FUVFIoY29sbGVjdF9wcml2aWxlZ2VkLCAiJWRcbiIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW50ZXJmYWNlX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2tlcm5lbF92ZXJzaW9uLmF0dHIsCisJJmh2X2NhcHNfYXR0cl92ZXJzaW9uLmF0dHIsCisJJmh2X2NhcHNfYXR0cl9nYS5hdHRyLAorCSZodl9jYXBzX2F0dHJfZXhwYW5kZWQuYXR0ciwKKwkmaHZfY2Fwc19hdHRyX2xhYi5hdHRyLAorCSZodl9jYXBzX2F0dHJfY29sbGVjdF9wcml2aWxlZ2VkLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGludGVyZmFjZV9ncm91cCA9IHsKKwkubmFtZSA9ICJpbnRlcmZhY2UiLAorCS5hdHRycyA9IGludGVyZmFjZV9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyX2dyb3Vwc1tdID0geworCSZmb3JtYXRfZ3JvdXAsCisJJmludGVyZmFjZV9ncm91cCwKKwlOVUxMLAorfTsKKworI2RlZmluZSBHUENJX01BWF9EQVRBX0JZVEVTIFwKKwkoMTAyNCAtIHNpemVvZihzdHJ1Y3QgaHZfZ2V0X3BlcmZfY291bnRlcl9pbmZvX3BhcmFtcykpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNpbmdsZV9ncGNpX3JlcXVlc3QodTMyIHJlcSwgdTMyIHN0YXJ0aW5nX2luZGV4LAorCQl1MTYgc2Vjb25kYXJ5X2luZGV4LCB1OCB2ZXJzaW9uX2luLCB1MzIgb2Zmc2V0LCB1OCBsZW5ndGgsCisJCXU2NCAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJc2l6ZV90IGk7CisJdTY0IGNvdW50OworCisJc3RydWN0IHsKKwkJc3RydWN0IGh2X2dldF9wZXJmX2NvdW50ZXJfaW5mb19wYXJhbXMgcGFyYW1zOworCQl1aW50OF90IGJ5dGVzW0dQQ0lfTUFYX0RBVEFfQllURVNdOworCX0gX19wYWNrZWQgX19hbGlnbmVkKHNpemVvZih1aW50NjRfdCkpIGFyZyA9IHsKKwkJLnBhcmFtcyA9IHsKKwkJCS5jb3VudGVyX3JlcXVlc3QgPSBjcHVfdG9fYmUzMihyZXEpLAorCQkJLnN0YXJ0aW5nX2luZGV4ID0gY3B1X3RvX2JlMzIoc3RhcnRpbmdfaW5kZXgpLAorCQkJLnNlY29uZGFyeV9pbmRleCA9IGNwdV90b19iZTE2KHNlY29uZGFyeV9pbmRleCksCisJCQkuY291bnRlcl9pbmZvX3ZlcnNpb25faW4gPSB2ZXJzaW9uX2luLAorCQl9CisJfTsKKworCXJldCA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0dFVF9QRVJGX0NPVU5URVJfSU5GTywKKwkJCXZpcnRfdG9fcGh5cygmYXJnKSwgc2l6ZW9mKGFyZykpOworCWlmIChyZXQpIHsKKwkJcHJfZGV2ZWwoImhjYWxsIGZhaWxlZDogMHglbHhcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiB3ZSB2ZXJpZnkgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIHdpdGhpbiB0aGUgemVyb2VkIGJ1ZmZlciBhdCBldmVudAorCSAqIGluaXQuCisJICovCisJY291bnQgPSAwOworCWZvciAoaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbmd0aDsgaSsrKQorCQljb3VudCB8PSBhcmcuYnl0ZXNbaV0gPDwgKGkgLSBvZmZzZXQpOworCisJKnZhbHVlID0gY291bnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHU2NCBoX2dwY2lfZ2V0X3ZhbHVlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwl1NjQgY291bnQ7CisJdW5zaWduZWQgbG9uZyByZXQgPSBzaW5nbGVfZ3BjaV9yZXF1ZXN0KGV2ZW50X2dldF9yZXF1ZXN0KGV2ZW50KSwKKwkJCQkJZXZlbnRfZ2V0X3N0YXJ0aW5nX2luZGV4KGV2ZW50KSwKKwkJCQkJZXZlbnRfZ2V0X3NlY29uZGFyeV9pbmRleChldmVudCksCisJCQkJCWV2ZW50X2dldF9jb3VudGVyX2luZm9fdmVyc2lvbihldmVudCksCisJCQkJCWV2ZW50X2dldF9vZmZzZXQoZXZlbnQpLAorCQkJCQlldmVudF9nZXRfbGVuZ3RoKGV2ZW50KSwKKwkJCQkJJmNvdW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGhfZ3BjaV9ldmVudF91cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXM2NCBwcmV2OworCXU2NCBub3cgPSBoX2dwY2lfZ2V0X3ZhbHVlKGV2ZW50KTsKKwlwcmV2ID0gbG9jYWw2NF94Y2hnKCZldmVudC0+aHcucHJldl9jb3VudCwgbm93KTsKKwlsb2NhbDY0X2FkZChub3cgLSBwcmV2LCAmZXZlbnQtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgaF9ncGNpX2V2ZW50X3N0YXJ0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgaF9ncGNpX2dldF92YWx1ZShldmVudCkpOworfQorCitzdGF0aWMgdm9pZCBoX2dwY2lfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwloX2dwY2lfZXZlbnRfdXBkYXRlKGV2ZW50KTsKK30KKworc3RhdGljIGludCBoX2dwY2lfZXZlbnRfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIFBFUkZfRUZfU1RBUlQpCisJCWhfZ3BjaV9ldmVudF9zdGFydChldmVudCwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaF9ncGNpX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXU2NCBjb3VudDsKKwl1OCBsZW5ndGg7CisKKwkvKiBOb3Qgb3VyIGV2ZW50ICovCisJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gZXZlbnQtPnBtdS0+dHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiBjb25maWcyIGlzIHVudXNlZCAqLworCWlmIChldmVudC0+YXR0ci5jb25maWcyKSB7CisJCXByX2RldmVsKCJjb25maWcyIHNldCB3aGVuIHJlc2VydmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdW5zdXBwb3J0ZWQgbW9kZXMgYW5kIGZpbHRlcnMgKi8KKwlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiAgICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0ICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ndWVzdCAgfHwKKwkgICAgaXNfc2FtcGxpbmdfZXZlbnQoZXZlbnQpKSAvKiBubyBzYW1wbGluZyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG5vIGJyYW5jaCBzYW1wbGluZyAqLworCWlmIChoYXNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbGVuZ3RoID0gZXZlbnRfZ2V0X2xlbmd0aChldmVudCk7CisJaWYgKGxlbmd0aCA8IDEgfHwgbGVuZ3RoID4gOCkgeworCQlwcl9kZXZlbCgibGVuZ3RoIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBsYXN0IGJ5dGUgd2l0aGluIHRoZSBidWZmZXI/ICovCisJaWYgKChldmVudF9nZXRfb2Zmc2V0KGV2ZW50KSArIGxlbmd0aCkgPiBHUENJX01BWF9EQVRBX0JZVEVTKSB7CisJCXByX2RldmVsKCJyZXF1ZXN0IG91dHNpZGUgb2YgYnVmZmVyOiAlenUgPiAlenVcbiIsCisJCQkJKHNpemVfdClldmVudF9nZXRfb2Zmc2V0KGV2ZW50KSArIGxlbmd0aCwKKwkJCQlHUENJX01BWF9EQVRBX0JZVEVTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgaWYgdGhlIHJlcXVlc3Qgd29ya3MuLi4gKi8KKwlpZiAoc2luZ2xlX2dwY2lfcmVxdWVzdChldmVudF9nZXRfcmVxdWVzdChldmVudCksCisJCQkJZXZlbnRfZ2V0X3N0YXJ0aW5nX2luZGV4KGV2ZW50KSwKKwkJCQlldmVudF9nZXRfc2Vjb25kYXJ5X2luZGV4KGV2ZW50KSwKKwkJCQlldmVudF9nZXRfY291bnRlcl9pbmZvX3ZlcnNpb24oZXZlbnQpLAorCQkJCWV2ZW50X2dldF9vZmZzZXQoZXZlbnQpLAorCQkJCWxlbmd0aCwKKwkJCQkmY291bnQpKSB7CisJCXByX2RldmVsKCJncGNpIGhjYWxsIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhfZ3BjaV9ldmVudF9pZHgoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBtdSBoX2dwY2lfcG11ID0geworCS50YXNrX2N0eF9uciA9IHBlcmZfaW52YWxpZF9jb250ZXh0LAorCisJLm5hbWUgPSAiaHZfZ3BjaSIsCisJLmF0dHJfZ3JvdXBzID0gYXR0cl9ncm91cHMsCisJLmV2ZW50X2luaXQgID0gaF9ncGNpX2V2ZW50X2luaXQsCisJLmFkZCAgICAgICAgID0gaF9ncGNpX2V2ZW50X2FkZCwKKwkuZGVsICAgICAgICAgPSBoX2dwY2lfZXZlbnRfc3RvcCwKKwkuc3RhcnQgICAgICAgPSBoX2dwY2lfZXZlbnRfc3RhcnQsCisJLnN0b3AgICAgICAgID0gaF9ncGNpX2V2ZW50X3N0b3AsCisJLnJlYWQgICAgICAgID0gaF9ncGNpX2V2ZW50X3VwZGF0ZSwKKwkuZXZlbnRfaWR4ICAgPSBoX2dwY2lfZXZlbnRfaWR4LAorfTsKKworc3RhdGljIGludCBodl9ncGNpX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBsb25nIGhyZXQ7CisJc3RydWN0IGh2X3BlcmZfY2FwcyBjYXBzOworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKSB7CisJCXByX2luZm8oIm5vdCBhIHZpcnR1YWxpemVkIHN5c3RlbSwgbm90IGVuYWJsaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaHJldCA9IGh2X3BlcmZfY2Fwc19nZXQoJmNhcHMpOworCWlmIChocmV0KSB7CisJCXByX2luZm8oImNvdWxkIG5vdCBvYnRhaW4gY2FwYWJpbGl0aWVzLCBlcnJvciAweCU4MGx4LCBub3QgZW5hYmxpbmdcbiIsCisJCQkJaHJldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXIgPSBwZXJmX3BtdV9yZWdpc3RlcigmaF9ncGNpX3BtdSwgaF9ncGNpX3BtdS5uYW1lLCAtMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbChodl9ncGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5oIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWY0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfR1BDSV9IXworI2RlZmluZSBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfR1BDSV9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRnJvbSB0aGUgZG9jdW1lbnQgIkhfR2V0UGVyZm9ybWFuY2VDb3VudGVySW5mbyBJbnRlcmZhY2UiIHYxLjA3ICovCisKKy8qIEhfR0VUX1BFUkZfQ09VTlRFUl9JTkZPIGFyZ3VtZW50ICovCitzdHJ1Y3QgaHZfZ2V0X3BlcmZfY291bnRlcl9pbmZvX3BhcmFtcyB7CisJX19iZTMyIGNvdW50ZXJfcmVxdWVzdDsgLyogSSAqLworCV9fYmUzMiBzdGFydGluZ19pbmRleDsgIC8qIElPICovCisJX19iZTE2IHNlY29uZGFyeV9pbmRleDsgLyogSU8gKi8KKwlfX2JlMTYgcmV0dXJuZWRfdmFsdWVzOyAvKiBPICovCisJX19iZTMyIGRldGFpbF9yYzsgLyogTywgb25seSBuZWVkZWQgd2hlbiBjYWxsZWQgdmlhICpfbm9yZXRzKCkgKi8KKworCS8qCisJICogTywgc2l6ZSBlYWNoIG9mIGNvdW50ZXJfdmFsdWUgZWxlbWVudCBpbiBieXRlcywgb25seSBzZXQgZm9yIHZlcnNpb24KKwkgKiA+PSAweDMKKwkgKi8KKwlfX2JlMTYgY3ZfZWxlbWVudF9zaXplOworCisJLyogSSwgMCAoemVybykgZm9yIHZlcnNpb25zIDwgMHgzICovCisJX191OCBjb3VudGVyX2luZm9fdmVyc2lvbl9pbjsKKworCS8qIE8sIDAgKHplcm8pIGlmIHZlcnNpb24gPCAweDMuIE11c3QgYmUgc2V0IHRvIDAgd2hlbiBtYWtpbmcgaGNhbGwgKi8KKwlfX3U4IGNvdW50ZXJfaW5mb192ZXJzaW9uX291dDsKKwlfX3U4IHJlc2VydmVkWzB4Q107CisJX191OCBjb3VudGVyX3ZhbHVlW107Cit9IF9fcGFja2VkOworCisvKgorICogY291bnRlciBpbmZvIHZlcnNpb24gPT4gZncgdmVyc2lvbi9yZWZlcmVuY2UgKHNwZWMgdmVyc2lvbikKKyAqCisgKiA4ID0+IHBvd2VyOCAoMS4wNykKKyAqIFs3IGlzIHNraXBwZWQgYnkgc3BlYyAxLjA3XQorICogNiA9PiBUTEJJRSAoMS4wNykKKyAqIDUgPT4gdjdyN20wLnBoeXAgKDEuMDUpCisgKiBbNCBza2lwcGVkXQorICogMyA9PiB2N3I2bTAucGh5cCAoPykKKyAqIFsxLDIgc2tpcHBlZF0KKyAqIDAgPT4gdjdyezIsMyw0fW0wLnBoeXAgKD8pCisgKi8KKyNkZWZpbmUgQ09VTlRFUl9JTkZPX1ZFUlNJT05fQ1VSUkVOVCAweDgKKworLyoKKyAqIFRoZXNlIGRldGVybWluZSB0aGUgY291bnRlcl92YWx1ZVtdIGxheW91dCBhbmQgdGhlIG1lYW5pbmcgb2Ygc3RhcnRpbmdfaW5kZXgKKyAqIGFuZCBzZWNvbmRhcnlfaW5kZXguCisgKgorICogVW5sZXNzIG90aGVyd2lzZSBub3RlZCwgQHNlY29uZGFyeV9pbmRleCBpcyB1bnVzZWQgYW5kIGlnbm9yZWQuCisgKi8KK2VudW0gY291bnRlcl9pbmZvX3JlcXVlc3RzIHsKKworCS8qIEdFTkVSQUwgKi8KKworCS8qIEBzdGFydGluZ19pbmRleDogbXVzdCBiZSAtMSAodG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgcGFydGl0aW9uKQorCSAqLworCUNJUl9TWVNURU1fUEVSRk9STUFOQ0VfQ0FQQUJJTElUSUVTID0gMFg0MCwKK307CisKK3N0cnVjdCBjdl9zeXN0ZW1fcGVyZm9ybWFuY2VfY2FwYWJpbGl0aWVzIHsKKwkvKiBJZiAhPSAwLCBhbGxvd2VkIHRvIGNvbGxlY3QgZGF0YSBmcm9tIG90aGVyIHBhcnRpdGlvbnMgKi8KKwlfX3U4IHBlcmZfY29sbGVjdF9wcml2aWxlZ2VkOworCisJLyogVGhlc2UgZm9sbG93aW5nIGFyZSBvbmx5IHZhbGlkIGlmIGNvdW50ZXJfaW5mb192ZXJzaW9uID49IDB4MyAqLworI2RlZmluZSBDVl9DTV9HQSAgICAgICAoMSA8PCA3KQorI2RlZmluZSBDVl9DTV9FWFBBTkRFRCAoMSA8PCA2KQorI2RlZmluZSBDVl9DTV9MQUIgICAgICAoMSA8PCA1KQorCS8qIHJlbWFpbmluZyBiaXRzIGFyZSByZXNlcnZlZCAqLworCV9fdTggY2FwYWJpbGl0eV9tYXNrOworCV9fdTggcmVzZXJ2ZWRbMHhFXTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI3LWV2ZW50cy1saXN0LmggYi9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjctZXZlbnRzLWxpc3QuaAppbmRleCA2ODc3OTBhLi42NGYxM2Q5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjctZXZlbnRzLWxpc3QuaAorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjctZXZlbnRzLWxpc3QuaApAQCAtNTQ2LDMgKzU0NiwxMyBAQAogRVZFTlQoUE1fRFRMQl9NSVNTXzE2TSwgICAgICAgICAgICAgICAgICAgICAgIDB4NGMwNWUpCiBFVkVOVChQTV9MU1UxX0xNUV9MSFJfTUVSR0UsICAgICAgICAgICAgICAgICAgMHgwZDA5YSkKIEVWRU5UKFBNX0lGVV9GSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDY2KQorRVZFTlQoUE1fMVRIUkRfQ09OX1JVTl9JTlNUUiwgICAgICAgICAgICAgICAgIDB4MzAwNjIpCitFVkVOVChQTV9DTVBMVV9TVEFMTF9DT1VOVCwgICAgICAgICAgICAgICAgICAgMHg0MDAwQikKK0VWRU5UKFBNX01FTTBfUEJfUkRfQ0wsICAgICAgICAgICAgICAgICAgICAgICAweDMwMDgzKQorRVZFTlQoUE1fVEhSRF8xX1JVTl9DWUMsICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNjApCitFVkVOVChQTV9USFJEXzJfQ09OQ19SVU5fSU5TVFIsICAgICAgICAgICAgICAgMHg0MDA2MikKK0VWRU5UKFBNX1RIUkRfMl9SVU5fQ1lDLCAgICAgICAgICAgICAgICAgICAgICAweDIwMDYwKQorRVZFTlQoUE1fVEhSRF8zX0NPTkNfUlVOX0lOU1QsICAgICAgICAgICAgICAgIDB4MTAwNjIpCitFVkVOVChQTV9USFJEXzNfUlVOX0NZQywgICAgICAgICAgICAgICAgICAgICAgMHgzMDA2MCkKK0VWRU5UKFBNX1RIUkRfNF9DT05DX1JVTl9JTlNULCAgICAgICAgICAgICAgICAweDIwMDYyKQorRVZFTlQoUE1fVEhSRF80X1JVTl9DWUMsICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNjApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjgtcG11LmMgYi9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjgtcG11LmMKaW5kZXggOTZjZWUyMC4uZmUyNzYzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI4LXBtdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyOC1wbXUuYwpAQCAtMTAsNiArMTAsOCBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpCSJwb3dlcjgtcG11OiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgpAQCAtNjIsOSArNjQsMTEgQEAKICAqCiAgKiAgICAgICAgNjAgICAgICAgIDU2ICAgICAgICA1MiAgICAgICAgNDggICAgICAgIDQ0ICAgICAgICA0MCAgICAgICAgMzYgICAgICAgIDMyCiAgKiB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwKLSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgICAgICB0aHJlc2hfY21wICAgICBdICAgWyAgdGhyZXNoX2N0bCAgIF0KLSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICotIEVCQiAoTGludXgpICAgICAgICAgICAgICAgICAgICAgIHRocmVzaCBzdGFydC9zdG9wIE9SIEZBQiBtYXRjaCAtKgorICogICB8IHwgWyBdICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgICAgIHRocmVzaF9jbXAgICAgIF0gICBbICB0aHJlc2hfY3RsICAgXQorICogICB8IHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgfCB8ICAqLSBJRk0gKExpbnV4KSAgICAgICAgICAgICAgICAgdGhyZXNoIHN0YXJ0L3N0b3AgT1IgRkFCIG1hdGNoIC0qCisgKiAgIHwgKi0gQkhSQiAoTGludXgpCisgKiAgICotIEVCQiAoTGludXgpCiAgKgogICogICAgICAgIDI4ICAgICAgICAyNCAgICAgICAgMjAgICAgICAgIDE2ICAgICAgICAxMiAgICAgICAgIDggICAgICAgICA0ICAgICAgICAgMAogICogfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8CkBAIC0xMTQsOSArMTE4LDE4IEBACiAgKglNTUNSQVs1Nzo1OV0gPSBzYW1wbGVbMDoyXQkoUkFORF9TQU1QX0VMSUcpCiDCoCoJTU1DUkFbNjE6NjJdID0gc2FtcGxlWzM6NF0JKFJBTkRfU0FNUF9NT0RFKQogICoKKyAqIGlmIEVCQiBhbmQgQkhSQjoKKyAqCU1NQ1JBWzMyOjMzXSA9IElGTQorICoKICAqLwogCiAjZGVmaW5lIEVWRU5UX0VCQl9NQVNLCQkxdWxsCisjZGVmaW5lIEVWRU5UX0VCQl9TSElGVAkJUEVSRl9FVkVOVF9DT05GSUdfRUJCX1NISUZUCisjZGVmaW5lIEVWRU5UX0JIUkJfTUFTSwkJMXVsbAorI2RlZmluZSBFVkVOVF9CSFJCX1NISUZUCTYyCisjZGVmaW5lIEVWRU5UX1dBTlRTX0JIUkIJKEVWRU5UX0JIUkJfTUFTSyA8PCBFVkVOVF9CSFJCX1NISUZUKQorI2RlZmluZSBFVkVOVF9JRk1fTUFTSwkJM3VsbAorI2RlZmluZSBFVkVOVF9JRk1fU0hJRlQJCTYwCiAjZGVmaW5lIEVWRU5UX1RIUl9DTVBfU0hJRlQJNDAJLyogVGhyZXNob2xkIENNUCB2YWx1ZSAqLwogI2RlZmluZSBFVkVOVF9USFJfQ01QX01BU0sJMHgzZmYKICNkZWZpbmUgRVZFTlRfVEhSX0NUTF9TSElGVAkzMgkvKiBUaHJlc2hvbGQgY29udHJvbCB2YWx1ZSAoc3RhcnQvc3RvcCkgKi8KQEAgLTE0MSw2ICsxNTQsMTIgQEAKICNkZWZpbmUgRVZFTlRfSVNfTUFSS0VECQkoRVZFTlRfTUFSS0VEX01BU0sgPDwgRVZFTlRfTUFSS0VEX1NISUZUKQogI2RlZmluZSBFVkVOVF9QU0VMX01BU0sJCTB4ZmYJLyogUE1DeFNFTCB2YWx1ZSAqLwogCisvKiBCaXRzIGRlZmluZWQgYnkgTGludXggKi8KKyNkZWZpbmUgRVZFTlRfTElOVVhfTUFTSwlcCisJKChFVkVOVF9FQkJfTUFTSyAgPDwgRVZFTlRfRUJCX1NISUZUKQkJCXwJXAorCSAoRVZFTlRfQkhSQl9NQVNLIDw8IEVWRU5UX0JIUkJfU0hJRlQpCQkJfAlcCisJIChFVkVOVF9JRk1fTUFTSyAgPDwgRVZFTlRfSUZNX1NISUZUKSkKKwogI2RlZmluZSBFVkVOVF9WQUxJRF9NQVNLCVwKIAkoKEVWRU5UX1RIUkVTSF9NQVNLICAgIDw8IEVWRU5UX1RIUkVTSF9TSElGVCkJCXwJXAogCSAoRVZFTlRfU0FNUExFX01BU0sgICAgPDwgRVZFTlRfU0FNUExFX1NISUZUKQkJfAlcCkBAIC0xNDksNyArMTY4LDcgQEAKIAkgKEVWRU5UX1VOSVRfTUFTSyAgICAgIDw8IEVWRU5UX1VOSVRfU0hJRlQpCQl8CVwKIAkgKEVWRU5UX0NPTUJJTkVfTUFTSyAgIDw8IEVWRU5UX0NPTUJJTkVfU0hJRlQpCQl8CVwKIAkgKEVWRU5UX01BUktFRF9NQVNLICAgIDw8IEVWRU5UX01BUktFRF9TSElGVCkJCXwJXAotCSAoRVZFTlRfRUJCX01BU0sgICAgICAgPDwgUEVSRl9FVkVOVF9DT05GSUdfRUJCX1NISUZUKQl8CVwKKwkgIEVWRU5UX0xJTlVYX01BU0sJCQkJCXwJXAogCSAgRVZFTlRfUFNFTF9NQVNLKQogCiAvKiBNTUNSQSBJRk0gYml0cyAtIFBPV0VSOCAqLwpAQCAtMTczLDEwICsxOTIsMTEgQEAKICAqCiAgKiAgICAgICAgMjggICAgICAgIDI0ICAgICAgICAyMCAgICAgICAgMTYgICAgICAgIDEyICAgICAgICAgOCAgICAgICAgIDQgICAgICAgICAwCiAgKiB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwKLSAqICAgICAgICAgICAgICAgICAgIHwgICBbIF0gICBbICBzYW1wbGUgXSAgIFsgICAgIF0gICBbNl0gWzVdICAgWzRdIFszXSAgIFsyXSBbMV0KLSAqICAgICAgICAgICAgICBFQkIgLSogICAgfCAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICBDb3VudCBvZiBldmVudHMgZm9yIGVhY2ggUE1DLgotICogICAgICBMMSBJL0QgcXVhbGlmaWVyIC0qICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgcDEsIHAyLCBwMywgcDQsIHA1LCBwNi4KKyAqICAgICAgICAgICAgICAgWyBdIHwgICBbIF0gICBbICBzYW1wbGUgXSAgIFsgICAgIF0gICBbNl0gWzVdICAgWzRdIFszXSAgIFsyXSBbMV0KKyAqICAgICAgICAgICAgICAgIHwgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgQkhSQiBJRk0gLSogIHwgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICBDb3VudCBvZiBldmVudHMgZm9yIGVhY2ggUE1DLgorICogICAgICAgICAgICAgIEVCQiAtKiAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgcDEsIHAyLCBwMywgcDQsIHA1LCBwNi4KKyAqICAgICAgTDEgSS9EIHF1YWxpZmllciAtKiAgICAgICAgICAgICAgICAgICAgIHwKICAqICAgICAgICAgICAgICAgICAgICAgbmMgLSBudW1iZXIgb2YgY291bnRlcnMgLSoKICAqCiAgKiBUaGUgUE1DIGZpZWxkcyBQMS4uUDYsIGFuZCBOQywgYXJlIGFkZGVyIGZpZWxkcy4gQXMgd2UgYWNjdW11bGF0ZSBjb25zdHJhaW50cwpAQCAtMTk1LDYgKzIxNSw5IEBACiAjZGVmaW5lIENOU1RfRUJCX1ZBTCh2KQkJKCgodikgJiBFVkVOVF9FQkJfTUFTSykgPDwgMjQpCiAjZGVmaW5lIENOU1RfRUJCX01BU0sJCUNOU1RfRUJCX1ZBTChFVkVOVF9FQkJfTUFTSykKIAorI2RlZmluZSBDTlNUX0lGTV9WQUwodikJCSgoKHYpICYgRVZFTlRfSUZNX01BU0spIDw8IDI1KQorI2RlZmluZSBDTlNUX0lGTV9NQVNLCQlDTlNUX0lGTV9WQUwoRVZFTlRfSUZNX01BU0spCisKICNkZWZpbmUgQ05TVF9MMV9RVUFMX1ZBTCh2KQkoKCh2KSAmIDMpIDw8IDIyKQogI2RlZmluZSBDTlNUX0wxX1FVQUxfTUFTSwlDTlNUX0wxX1FVQUxfVkFMKDMpCiAKQEAgLTI0MSw2ICsyNjQsNyBAQAogI2RlZmluZSBNTUNSQV9USFJfU0VMX1NISUZUCQkxNgogI2RlZmluZSBNTUNSQV9USFJfQ01QX1NISUZUCQkzMgogI2RlZmluZSBNTUNSQV9TREFSX01PREVfVExCCQkoMXVsbCA8PCA0MikKKyNkZWZpbmUgTU1DUkFfSUZNX1NISUZUCQkJMzAKIAogCiBzdGF0aWMgaW5saW5lIGJvb2wgZXZlbnRfaXNfZmFiX21hdGNoKHU2NCBldmVudCkKQEAgLTI2NSwyMCArMjg5LDIyIEBACiAJcG1jICAgPSAoZXZlbnQgPj4gRVZFTlRfUE1DX1NISUZUKSAgICAgICAgJiBFVkVOVF9QTUNfTUFTSzsKIAl1bml0ICA9IChldmVudCA+PiBFVkVOVF9VTklUX1NISUZUKSAgICAgICAmIEVWRU5UX1VOSVRfTUFTSzsKIAljYWNoZSA9IChldmVudCA+PiBFVkVOVF9DQUNIRV9TRUxfU0hJRlQpICAmIEVWRU5UX0NBQ0hFX1NFTF9NQVNLOwotCWViYiAgID0gKGV2ZW50ID4+IFBFUkZfRVZFTlRfQ09ORklHX0VCQl9TSElGVCkgJiBFVkVOVF9FQkJfTUFTSzsKLQotCS8qIENsZWFyIHRoZSBFQkIgYml0IGluIHRoZSBldmVudCwgc28gZXZlbnQgY2hlY2tzIHdvcmsgYmVsb3cgKi8KLQlldmVudCAmPSB+KEVWRU5UX0VCQl9NQVNLIDw8IFBFUkZfRVZFTlRfQ09ORklHX0VCQl9TSElGVCk7CisJZWJiICAgPSAoZXZlbnQgPj4gRVZFTlRfRUJCX1NISUZUKSAgICAgICAgJiBFVkVOVF9FQkJfTUFTSzsKIAogCWlmIChwbWMpIHsKKwkJdTY0IGJhc2VfZXZlbnQ7CisKIAkJaWYgKHBtYyA+IDYpCiAJCQlyZXR1cm4gLTE7CiAKKwkJLyogSWdub3JlIExpbnV4IGRlZmluZWQgYml0cyB3aGVuIGNoZWNraW5nIGV2ZW50IGJlbG93ICovCisJCWJhc2VfZXZlbnQgPSBldmVudCAmIH5FVkVOVF9MSU5VWF9NQVNLOworCisJCWlmIChwbWMgPj0gNSAmJiBiYXNlX2V2ZW50ICE9IDB4NTAwZmEgJiYgYmFzZV9ldmVudCAhPSAweDYwMGY0KQorCQkJcmV0dXJuIC0xOworCiAJCW1hc2sgIHw9IENOU1RfUE1DX01BU0socG1jKTsKIAkJdmFsdWUgfD0gQ05TVF9QTUNfVkFMKHBtYyk7Ci0KLQkJaWYgKHBtYyA+PSA1ICYmIGV2ZW50ICE9IDB4NTAwZmEgJiYgZXZlbnQgIT0gMHg2MDBmNCkKLQkJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAocG1jIDw9IDQpIHsKQEAgLTI5OSw5ICszMjUsMTAgQEAKIAkJICogSFYgd3JpdGFibGUsIGFuZCB0aGVyZSBpcyBubyBBUEkgZm9yIGd1ZXN0IGtlcm5lbHMgdG8gbW9kaWZ5CiAJCSAqIGl0LiBUaGUgc29sdXRpb24gaXMgZm9yIHRoZSBoeXBlcnZpc29yIHRvIGluaXRpYWxpc2UgdGhlCiAJCSAqIGZpZWxkIHRvIHplcm9lcywgYW5kIGZvciB1cyB0byBvbmx5IGV2ZXIgYWxsb3cgZXZlbnRzIHRoYXQKLQkJICogaGF2ZSBhIGNhY2hlIHNlbGVjdG9yIG9mIHplcm8uCisJCSAqIGhhdmUgYSBjYWNoZSBzZWxlY3RvciBvZiB6ZXJvLiBUaGUgYmFuayBzZWxlY3RvciAoYml0IDMpIGlzCisJCSAqIGlycmVsZXZhbnQsIGFzIGxvbmcgYXMgdGhlIHJlc3Qgb2YgdGhlIHZhbHVlIGlzIDAuCiAJCSAqLwotCQlpZiAoY2FjaGUpCisJCWlmIChjYWNoZSAmIDB4NykKIAkJCXJldHVybiAtMTsKIAogCX0gZWxzZSBpZiAoZXZlbnQgJiBFVkVOVF9JU19MMSkgewpAQCAtMzQyLDYgKzM2OSwxNSBAQAogCQkvKiBFQkIgZXZlbnRzIG11c3Qgc3BlY2lmeSB0aGUgUE1DICovCiAJCXJldHVybiAtMTsKIAorCWlmIChldmVudCAmIEVWRU5UX1dBTlRTX0JIUkIpIHsKKwkJaWYgKCFlYmIpCisJCQkvKiBPbmx5IEVCQiBldmVudHMgY2FuIHJlcXVlc3QgQkhSQiAqLworCQkJcmV0dXJuIC0xOworCisJCW1hc2sgIHw9IENOU1RfSUZNX01BU0s7CisJCXZhbHVlIHw9IENOU1RfSUZNX1ZBTChldmVudCA+PiBFVkVOVF9JRk1fU0hJRlQpOworCX0KKwogCS8qCiAJICogQWxsIGV2ZW50cyBtdXN0IGFncmVlIG9uIEVCQiwgZWl0aGVyIGFsbCByZXF1ZXN0IGl0IG9yIG5vbmUuCiAJICogRUJCIGV2ZW50cyBhcmUgcGlubmVkICYgZXhjbHVzaXZlLCBzbyB0aGlzIHNob3VsZCBuZXZlciBhY3R1YWxseQpAQCAtNDMxLDYgKzQ2NywxMSBAQAogCQkJbW1jcmEgfD0gdmFsIDw8IE1NQ1JBX1RIUl9DTVBfU0hJRlQ7CiAJCX0KIAorCQlpZiAoZXZlbnRbaV0gJiBFVkVOVF9XQU5UU19CSFJCKSB7CisJCQl2YWwgPSAoZXZlbnRbaV0gPj4gRVZFTlRfSUZNX1NISUZUKSAmIEVWRU5UX0lGTV9NQVNLOworCQkJbW1jcmEgfD0gdmFsIDw8IE1NQ1JBX0lGTV9TSElGVDsKKwkJfQorCiAJCWh3Y1tpXSA9IHBtYyAtIDE7CiAJfQogCkBAIC03NzQsNiArODE1LDkgQEAKIAkvKiBUZWxsIHVzZXJzcGFjZSB0aGF0IEVCQiBpcyBzdXBwb3J0ZWQgKi8KIAljdXJfY3B1X3NwZWMtPmNwdV91c2VyX2ZlYXR1cmVzMiB8PSBQUENfRkVBVFVSRTJfRUJCOwogCisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BNQU9fQlVHKSkKKwkJcHJfaW5mbygiUE1BTyByZXN0b3JlIHdvcmthcm91bmQgYWN0aXZlLlxuIik7CisKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X2luaXRjYWxsKGluaXRfcG93ZXI4X3BtdSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvS2NvbmZpZwppbmRleCBkNmM3NTA2Li5kYzFhMjY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcKQEAgLTI2NSw3ICsyNjUsNiBAQAogCXNlbGVjdCBQUENfRlBVCiAJc2VsZWN0IElCTTQ0MEVQX0VSUjQyCiAJc2VsZWN0IElCTV9FTUFDX1pNSUkKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAogY29uZmlnIDQ0MEVQWAogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jMjkzcGNpZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2MyOTNwY2llLmMKaW5kZXggMjEzZDViOC4uODQ0NzZiNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2MyOTNwY2llLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2MyOTNwY2llLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAkuaW5pdF9JUlEJCT0gYzI5M19wY2llX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMKaW5kZXggM2IwODVjNy4uYjU2NGI1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb21tb24uYwpAQCAtMTA3LDYgKzEwNywxMiBAQAogCXFlX3Jlc2V0KCk7CiAJb2Zfbm9kZV9wdXQobnApOwogCit9CisKK3ZvaWQgX19pbml0IG1wYzg1eHhfcWVfcGFyX2lvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGFyX2lvIik7CiAJaWYgKG5wKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdWNjOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZ2VuZXJpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZ2VuZXJpYy5jCmluZGV4IGZiZDg3MWUuLjhlNGIxZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2dlbmVyaWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29yZW5ldF9nZW5lcmljLmMKQEAgLTI2LDExICsyNiwxMyBAQAogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAjaW5jbHVkZSA8YXNtL21waWMuaD4KICNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgorI2luY2x1ZGUgPGFzbS9xZV9pYy5oPgogCiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAjaW5jbHVkZSAic21wLmgiCisjaW5jbHVkZSAibXBjODV4eC5oIgogCiB2b2lkIF9faW5pdCBjb3JlbmV0X2dlbl9waWNfaW5pdCh2b2lkKQogewpAQCAtMzgsNiArNDAsOCBAQAogCXVuc2lnbmVkIGludCBmbGFncyA9IE1QSUNfQklHX0VORElBTiB8IE1QSUNfU0lOR0xFX0RFU1RfQ1BVIHwKIAkJTVBJQ19OT19SRVNFVDsKIAorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKIAlpZiAocHBjX21kLmdldF9pcnEgPT0gbXBpY19nZXRfY29yZWludF9pcnEpCiAJCWZsYWdzIHw9IE1QSUNfRU5BQkxFX0NPUkVJTlQ7CiAKQEAgLTQ1LDYgKzQ5LDEzIEBACiAJQlVHX09OKG1waWMgPT0gTlVMTCk7CiAKIAltcGljX2luaXQobXBpYyk7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUtaWMiKTsKKwlpZiAobnApIHsKKwkJcWVfaWNfaW5pdChucCwgMCwgcWVfaWNfY2FzY2FkZV9sb3dfbXBpYywKKwkJCQlxZV9pY19jYXNjYWRlX2hpZ2hfbXBpYyk7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CiB9CiAKIC8qCkBAIC01Nyw2ICs2OCw4IEBACiAJc3dpb3RsYl9kZXRlY3RfNGcoKTsKIAogCXByX2luZm8oIiVzIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIsIHBwY19tZC5uYW1lKTsKKworCW1wYzg1eHhfcWVfaW5pdCgpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9kZXZpY2VfaWRzW10gPSB7CkBAIC04MSw2ICs5NCw5IEBACiAJewogCQkuY29tcGF0aWJsZQk9ICJmc2wscW9yaXEtcGNpZS12My4wIiwKIAl9LAorCXsKKwkJLmNvbXBhdGlibGUJPSAiZnNsLHFlIiwKKwl9LAogCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGFyZSBmb3IgdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yICovCiAJewogCQkubmFtZQkJPSAiaHlwZXJ2aXNvciIsCkBAIC0xNjMsNiArMTc5LDcgQEAKIAkuaW5pdF9JUlEJCT0gY29yZW5ldF9nZW5fcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2NvcmVpbnRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2dlX2ltcDNhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvZ2VfaW1wM2EuYwppbmRleCBlNjI4NWFlLi4xMTc5MGUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvZ2VfaW1wM2EuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvZ2VfaW1wM2EuYwpAQCAtMjE1LDYgKzIxNSw3IEBACiAJLnNob3dfY3B1aW5mbwkJPSBnZV9pbXAzYV9zaG93X2NwdWluZm8sCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTM2X2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODUzNl9kcy5jCmluZGV4IDE1Y2U0YjUuLmEzNzhiYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTM2X2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1MzZfZHMuYwpAQCAtNzYsNiArNzYsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NTM2X2RzX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaAppbmRleCBmYzUxZGQ0Li4zOTA1NmY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKQEAgLTEwLDggKzEwLDEwIEBACiAKICNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiBleHRlcm4gdm9pZCBtcGM4NXh4X3FlX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtcGM4NXh4X3FlX3Bhcl9pb19pbml0KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgbXBjODV4eF9xZV9pbml0KHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IG1wYzg1eHhfcWVfcGFyX2lvX2luaXQodm9pZCkge30KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKaW5kZXggN2EzMWEwZS4uYjA3NTNlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKQEAgLTM4NSw2ICszODUsNyBAQAogI2lmZGVmIENPTkZJR19QQ0kKIAkucmVzdGFydAk9IG1wYzg1eHhfY2RzX3Jlc3RhcnQsCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gbXBjODV4eF9jZHNfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2Vsc2UKIAkucmVzdGFydAk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYwppbmRleCA5ZWJiOTFlLi5mZmRmMDIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKQEAgLTIwOSw2ICsyMDksNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X2RzX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0yMjMsNiArMjI0LDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9kc19waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMjM3LDYgKzIzOSw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfZHNfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggMzRmM2M1ZS4uYTM5MmU5NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTIzOSw2ICsyMzksNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAKIAltcGM4NXh4X3FlX2luaXQoKTsKKwltcGM4NXh4X3FlX3Bhcl9pb19pbml0KCk7CiAJbXBjODV4eF9tZHNfcmVzZXRfdWNjX3BoeXMoKTsKIAogCWlmIChtYWNoaW5lX2lzKHAxMDIxX21kcykpIHsKQEAgLTM5MSw2ICszOTIsNyBAQAogCS5wcm9ncmVzcwk9IHVkYmdfcHJvZ3Jlc3MsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogfTsKIApAQCAtNDEyLDYgKzQxNCw3IEBACiAJLnByb2dyZXNzCT0gdWRiZ19wcm9ncmVzcywKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiB9OwogCkBAIC00MzQsNiArNDM3LDcgQEAKIAkucHJvZ3Jlc3MJPSB1ZGJnX3Byb2dyZXNzLAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMKaW5kZXggZTE1YmRkMS4uZTM1OGJlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMKQEAgLTg2LDEwICs4Niw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X3JkYl9zZXR1cF9hcmNoKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0jZW5kaWYKLQogCWlmIChwcGNfbWQucHJvZ3Jlc3MpCiAJCXBwY19tZC5wcm9ncmVzcygibXBjODV4eF9yZGJfc2V0dXBfYXJjaCgpIiwgMCk7CiAKQEAgLTk5LDggKzk1LDEwIEBACiAKICNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiAJbXBjODV4eF9xZV9pbml0KCk7CisJbXBjODV4eF9xZV9wYXJfaW9faW5pdCgpOwogI2lmIGRlZmluZWQoQ09ORklHX1VDQ19HRVRIKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfUUUpCiAJaWYgKG1hY2hpbmVfaXMocDEwMjVfcmRiKSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJCXN0cnVjdCBjY3NyX2d1dHMgX19pb21lbSAqZ3V0czsKIApAQCAtMjMzLDYgKzIzMSw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0yNDcsNiArMjQ2LDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTI2MSw2ICsyNjEsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMjc1LDYgKzI3Niw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0yODksNiArMjkxLDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTMwMyw2ICszMDYsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMzE3LDYgKzMyMSw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0zMzEsNiArMzM2LDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTM0NSw2ICszNTEsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMzU5LDYgKzM2Niw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMTByZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAxMHJkYi5jCmluZGV4IGQ2YTNkZDMuLmFkMWEzZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAxMHJkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAxMHJkYi5jCkBAIC03OCw2ICs3OCw3IEBACiAJLmluaXRfSVJRCQk9IHAxMDEwX3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYwppbmRleCBlNjExZTc5Li42YWM5ODZkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKQEAgLTU2Nyw2ICs1NjcsNyBAQAogCS5pbml0X0lSUQkJPSBwMTAyMl9kc19waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYgk9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9yZGsuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9yZGsuYwppbmRleCA4YzkyOTcxLi43YTE4MGYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfcmRrLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX3Jkay5jCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAkuaW5pdF9JUlEJCT0gcDEwMjJfcmRrX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjNfcmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjNfcmRzLmMKaW5kZXggMmFlOWQ0OS4uMGU2MTQwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIzX3Jkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYwpAQCAtMTI2LDYgKzEyNiw3IEBACiAJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogfTsKIApAQCAtMTQwLDUgKzE0MSw2IEBACiAJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9xZW11X2U1MDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9xZW11X2U1MDAuYwppbmRleCA1Y2VmYzVhLi43ZjI2NzMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcWVtdV9lNTAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3FlbXVfZTUwMC5jCkBAIC02Niw2ICs2Niw3IEBACiAJLmluaXRfSVJRCQk9IHFlbXVfZTUwMF9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfY29yZWludF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU0OC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYwppbmRleCBmNjIxMjE4Li5iMDcyMTQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU0OC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMKQEAgLTEzNSw2ICsxMzUsNyBAQAogCS5yZXN0YXJ0CT0gZnNsX3JzdGNyX3Jlc3RhcnQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5jYWxpYnJhdGVfZGVjciA9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCiAJLnByb2dyZXNzCT0gdWRiZ19wcm9ncmVzcywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90d3JfcDEwMnguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90d3JfcDEwMnguYwppbmRleCBjMjVmZjEwLi4xZWFkYjZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHdyX3AxMDJ4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3R3cl9wMTAyeC5jCkBAIC03Nyw2ICs3Nyw3IEBACiAKICNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiAJbXBjODV4eF9xZV9pbml0KCk7CisJbXBjODV4eF9xZV9wYXJfaW9faW5pdCgpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfVUNDX0dFVEgpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9RRSkKIAlpZiAobWFjaGluZV9pcyh0d3JfcDEwMjUpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgveGVzX21wYzg1eHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC94ZXNfbXBjODV4eC5jCmluZGV4IGRjYmY3ZTQuLjFhOWMxMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC94ZXNfbXBjODV4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC94ZXNfbXBjODV4eC5jCkBAIC0xNzAsNiArMTcwLDcgQEAKIAkuaW5pdF9JUlEJCT0geGVzX21wYzg1eHhfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTE4NCw2ICsxODUsNyBAQAogCS5pbml0X0lSUQkJPSB4ZXNfbXBjODV4eF9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMTk4LDYgKzIwMCw3IEBACiAJLmluaXRfSVJRCQk9IHhlc19tcGM4NXh4X3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKaW5kZXggMmQ0MmYzYi4uOGExMDZiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiB7CiAJaWljX3JlcXVlc3RfaXBpKFBQQ19NU0dfQ0FMTF9GVU5DVElPTik7CiAJaWljX3JlcXVlc3RfaXBpKFBQQ19NU0dfUkVTQ0hFRFVMRSk7Ci0JaWljX3JlcXVlc3RfaXBpKFBQQ19NU0dfQ0FMTF9GVU5DX1NJTkdMRSk7CisJaWljX3JlcXVlc3RfaXBpKFBQQ19NU0dfVElDS19CUk9BRENBU1QpOwogCWlpY19yZXF1ZXN0X2lwaShQUENfTVNHX0RFQlVHR0VSX0JSRUFLKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCA0OTMxODM4Li40YTBhNjRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtODMsNyArODMsNiBAQAogI2RlZmluZSBNSU5fU1BVX1RJTUVTTElDRQltYXgoNSAqIEhaIC8gKDEwMDAgKiBTUFVTQ0hFRF9USUNLKSwgMSkKICNkZWZpbmUgREVGX1NQVV9USU1FU0xJQ0UJKDEwMCAqIEhaIC8gKDEwMDAgKiBTUFVTQ0hFRF9USUNLKSkKIAotI2RlZmluZSBNQVhfVVNFUl9QUklPCQkoTUFYX1BSSU8gLSBNQVhfUlRfUFJJTykKICNkZWZpbmUgU0NBTEVfUFJJTyh4LCBwcmlvKSBcCiAJbWF4KHggKiAoTUFYX1BSSU8gLSBwcmlvKSAvIChNQVhfVVNFUl9QUklPIC8gMiksIE1JTl9TUFVfVElNRVNMSUNFKQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKaW5kZXggNmQzYzdhOS4uMmE3MDI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwpAQCAtMzQsNyArMzQsNiBAQAogCXNlbGVjdCBUU0kxMDhfQlJJREdFCiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCi0Jc2VsZWN0IFRTSTEwOF9CUklER0UKIAloZWxwCiAJICBTZWxlY3QgTVBDNzQ0OEhQQzIgaWYgY29uZmlndXJpbmcgZm9yIEZyZWVzY2FsZSBNUEM3NDQ4SFBDMiAoVGFpZ2EpCiAJICBwbGF0Zm9ybQpAQCAtNDQsMTkgKzQzLDEwIEBACiAJZGVwZW5kcyBvbiBFTUJFRERFRDZ4eAogCXNlbGVjdCBUU0kxMDhfQlJJREdFCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCi0Jc2VsZWN0IFRTSTEwOF9CUklER0UKIAloZWxwCiAJICBTZWxlY3QgUFBDX0hPTExZIGlmIGNvbmZpZ3VyaW5nIGZvciBhbiBJQk0gNzUwR1gvQ0wgRXZhbAogCSAgQm9hcmQgd2l0aCBUU0kxMDgvOSBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpCiAKLWNvbmZpZyBQUENfUFJQTUMyODAwCi0JYm9vbCAiTW90b3JvbGEtUHJQTUMyODAwIgotCWRlcGVuZHMgb24gRU1CRURERUQ2eHgKLQlzZWxlY3QgTVY2NFg2MAotCXNlbGVjdCBOT1RfQ09IRVJFTlRfQ0FDSEUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNb3Rvcm9sYSBQclBNQzI4MDAgYm9hcmQKLQogY29uZmlnIFBQQ19DMksKIAlib29sICJTQlMvR0VGYW51YyBDMksgYm9hcmQiCiAJZGVwZW5kcyBvbiBFTUJFRERFRDZ4eApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvTWFrZWZpbGUKaW5kZXggY2RkNDhkNC4uZjEyNmEyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlCkBAIC01LDcgKzUsNiBAQAogb2JqLSQoQ09ORklHX0xJTktTVEFUSU9OKQkrPSBsaW5rc3RhdGlvbi5vIGxzX3VhcnQubwogb2JqLSQoQ09ORklHX1NUT1JDRU5URVIpCSs9IHN0b3JjZW50ZXIubwogb2JqLSQoQ09ORklHX1BQQ19IT0xMWSkJCSs9IGhvbGx5Lm8KLW9iai0kKENPTkZJR19QUENfUFJQTUMyODAwKQkrPSBwcnBtYzI4MDAubwogb2JqLSQoQ09ORklHX1BQQ19DMkspCQkrPSBjMmsubwogb2JqLSQoQ09ORklHX1VTQkdFQ0tPX1VEQkcpCSs9IHVzYmdlY2tvX3VkYmcubwogb2JqLSQoQ09ORklHX0dBTUVDVUJFX0NPTU1PTikJKz0gZmxpcHBlci1waWMubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9wcnBtYzI4MDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvcHJwbWMyODAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTVmMDguLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9wcnBtYzI4MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogQm9hcmQgc2V0dXAgcm91dGluZXMgZm9yIHRoZSBNb3Rvcm9sYSBQclBNQzI4MDAKLSAqCi0gKiBBdXRob3I6IERhbGUgRmFybnN3b3J0aCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4KLSAqCi0gKiAyMDA3IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQotICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLQotI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+Ci0KLSNpbmNsdWRlIDxzeXNkZXYvbXY2NHg2MC5oPgotCi0jZGVmaW5lIE1WNjR4NjBfTVBQX0NOVExfMAkweDAwMDAKLSNkZWZpbmUgTVY2NHg2MF9NUFBfQ05UTF8yCTB4MDAwOAotCi0jZGVmaW5lIE1WNjR4NjBfR1BQX0lPX0NOVEwJMHgwMDAwCi0jZGVmaW5lIE1WNjR4NjBfR1BQX0xFVkVMX0NOVEwJMHgwMDEwCi0jZGVmaW5lIE1WNjR4NjBfR1BQX1ZBTFVFX1NFVAkweDAwMTgKLQotI2RlZmluZSBQTEFURk9STV9OQU1FX01BWAkzMgotCi1zdGF0aWMgY2hhciBwcnBtYzI4MDBfcGxhdGZvcm1fbmFtZVtQTEFURk9STV9OQU1FX01BWF07Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKm12NjR4NjBfbXBwX3JlZ19iYXNlOwotc3RhdGljIHZvaWQgX19pb21lbSAqbXY2NHg2MF9ncHBfcmVnX2Jhc2U7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwcnBtYzI4MDBfc2V0dXBfYXJjaCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JcGh5c19hZGRyX3QgcGFkZHI7Ci0JY29uc3QgdW5zaWduZWQgaW50ICpyZWc7Ci0KLQkvKgotCSAqIGlvcmVtYXAgbXBwIGFuZCBncHAgcmVnaXN0ZXJzIGluIGNhc2UgdGhleSBhcmUgbGF0ZXIKLQkgKiBuZWVkZWQgYnkgcHJwbWMyODAwX3Jlc2V0X2JvYXJkKCkuCi0JICovCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAibWFydmVsbCxtdjY0MzYwLW1wcCIpOwotCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCXBhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MobnAsIHJlZyk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCW12NjR4NjBfbXBwX3JlZ19iYXNlID0gaW9yZW1hcChwYWRkciwgcmVnWzFdKTsKLQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgIm1hcnZlbGwsbXY2NDM2MC1ncHAiKTsKLQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQlwYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5wLCByZWcpOwotCW9mX25vZGVfcHV0KG5wKTsKLQltdjY0eDYwX2dwcF9yZWdfYmFzZSA9IGlvcmVtYXAocGFkZHIsIHJlZ1sxXSk7Ci0KLSNpZmRlZiBDT05GSUdfUENJCi0JbXY2NHg2MF9wY2lfaW5pdCgpOwotI2VuZGlmCi0KLQlwcmludGsoIk1vdG9yb2xhICVzXG4iLCBwcnBtYzI4MDBfcGxhdGZvcm1fbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBycG1jMjgwMF9yZXNldF9ib2FyZCh2b2lkKQotewotCXUzMiB0ZW1wOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfbXBwX3JlZ19iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8wKTsKLQl0ZW1wICY9IDB4RkZGRjBGRkY7Ci0Jb3V0X2xlMzIobXY2NHg2MF9tcHBfcmVnX2Jhc2UgKyBNVjY0eDYwX01QUF9DTlRMXzAsIHRlbXApOwotCi0JdGVtcCA9IGluX2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMKTsKLQl0ZW1wIHw9IDB4MDAwMDAwMDQ7Ci0Jb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMLCB0ZW1wKTsKLQotCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCk7Ci0JdGVtcCB8PSAweDAwMDAwMDA0OwotCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCwgdGVtcCk7Ci0KLQl0ZW1wID0gaW5fbGUzMihtdjY0eDYwX21wcF9yZWdfYmFzZSArIE1WNjR4NjBfTVBQX0NOVExfMik7Ci0JdGVtcCAmPSAweEZGRkYwRkZGOwotCW91dF9sZTMyKG12NjR4NjBfbXBwX3JlZ19iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8yLCB0ZW1wKTsKLQotCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTCk7Ci0JdGVtcCB8PSAweDAwMDgwMDAwOwotCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTCwgdGVtcCk7Ci0KLQl0ZW1wID0gaW5fbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0lPX0NOVEwpOwotCXRlbXAgfD0gMHgwMDA4MDAwMDsKLQlvdXRfbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0lPX0NOVEwsIHRlbXApOwotCi0Jb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9WQUxVRV9TRVQsIDB4MDAwODAwMDQpOwotfQotCi1zdGF0aWMgdm9pZCBwcnBtYzI4MDBfcmVzdGFydChjaGFyICpjbWQpCi17Ci0Jdm9sYXRpbGUgdWxvbmcgaSA9IDEwMDAwMDAwOwotCi0JcHJwbWMyODAwX3Jlc2V0X2JvYXJkKCk7Ci0KLQl3aGlsZSAoaS0tID4gMCk7Ci0JcGFuaWMoInJlc3RhcnQgZmFpbGVkXG4iKTsKLX0KLQotI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKLSNkZWZpbmUgUFBSUE0yODAwX0NPSEVSRU5DWV9TRVRUSU5HICJvZmYiCi0jZWxzZQotI2RlZmluZSBQUFJQTTI4MDBfQ09IRVJFTkNZX1NFVFRJTkcgIm9uIgotI2VuZGlmCi0KLXZvaWQgcHJwbWMyODAwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCi17Ci0Jc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogTW90b3JvbGFcbiIpOwotCXNlcV9wcmludGYobSwgImNvaGVyZW5jeVx0OiAlc1xuIiwgUFBSUE0yODAwX0NPSEVSRU5DWV9TRVRUSU5HKTsKLX0KLQotLyoKLSAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAotICovCi1zdGF0aWMgaW50IF9faW5pdCBwcnBtYzI4MDBfcHJvYmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JdW5zaWduZWQgbG9uZyBsZW4gPSBQTEFURk9STV9OQU1FX01BWDsKLQl2b2lkICptOwotCi0JaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIm1vdG9yb2xhLFByUE1DMjgwMCIpKQotCQlyZXR1cm4gMDsKLQotCS8qIFVwZGF0ZSBwcGNfbWQubmFtZSB3aXRoIG5hbWUgZnJvbSBkdCAqLwotCW0gPSBvZl9nZXRfZmxhdF9kdF9wcm9wKHJvb3QsICJtb2RlbCIsICZsZW4pOwotCWlmIChtKQotCQlzdHJuY3B5KHBycG1jMjgwMF9wbGF0Zm9ybV9uYW1lLCBtLAotCQkJbWluKChpbnQpbGVuLCBQTEFURk9STV9OQU1FX01BWCAtIDEpKTsKLQotCV9zZXRfTDJDUihfZ2V0X0wyQ1IoKSB8IEwyQ1JfTDJFKTsKLQlyZXR1cm4gMTsKLX0KLQotZGVmaW5lX21hY2hpbmUocHJwbWMyODAwKXsKLQkubmFtZQkJCT0gcHJwbWMyODAwX3BsYXRmb3JtX25hbWUsCi0JLnByb2JlCQkJPSBwcnBtYzI4MDBfcHJvYmUsCi0JLnNldHVwX2FyY2gJCT0gcHJwbWMyODAwX3NldHVwX2FyY2gsCi0JLmluaXRfZWFybHkJCT0gbXY2NHg2MF9pbml0X2Vhcmx5LAotCS5zaG93X2NwdWluZm8JCT0gcHJwbWMyODAwX3Nob3dfY3B1aW5mbywKLQkuaW5pdF9JUlEJCT0gbXY2NHg2MF9pbml0X2lycSwKLQkuZ2V0X2lycQkJPSBtdjY0eDYwX2dldF9pcnEsCi0JLnJlc3RhcnQJCT0gcHJwbWMyODAwX3Jlc3RhcnQsCi0JLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlCmluZGV4IDhkNzY3ZmQuLmYzMjRlYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACi1vYmoteQkJCSs9IHNldHVwLm8gb3BhbC10YWtlb3Zlci5vIG9wYWwtd3JhcHBlcnMubyBvcGFsLm8KK29iai15CQkJKz0gc2V0dXAubyBvcGFsLXRha2VvdmVyLm8gb3BhbC13cmFwcGVycy5vIG9wYWwubyBvcGFsLWFzeW5jLm8KIG9iai15CQkJKz0gb3BhbC1ydGMubyBvcGFsLW52cmFtLm8gb3BhbC1scGMubyBvcGFsLWZsYXNoLm8KLW9iai15CQkJKz0gcm5nLm8KK29iai15CQkJKz0gcm5nLm8gb3BhbC1lbG9nLm8gb3BhbC1kdW1wLm8gb3BhbC1zeXNwYXJhbS5vIG9wYWwtc2Vuc29yLm8KIAogb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KIG9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaS1wNWlvYzIubyBwY2ktaW9kYS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1hc3luYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtYXN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDBjMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtYXN5bmMuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIFBvd2VyTlYgT1BBTCBhc3luY2hyb25vdXMgY29tcGxldGlvbiBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IDIwMTMgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKyNkZWZpbmUgTl9BU1lOQ19DT01QTEVUSU9OUwk2NAorCitzdGF0aWMgREVDTEFSRV9CSVRNQVAob3BhbF9hc3luY19jb21wbGV0ZV9tYXAsIE5fQVNZTkNfQ09NUExFVElPTlMpID0ge34wVUx9Oworc3RhdGljIERFQ0xBUkVfQklUTUFQKG9wYWxfYXN5bmNfdG9rZW5fbWFwLCBOX0FTWU5DX0NPTVBMRVRJT05TKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChvcGFsX2FzeW5jX3dhaXQpOworc3RhdGljIERFRklORV9TUElOTE9DSyhvcGFsX2FzeW5jX2NvbXBfbG9jayk7CitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBvcGFsX2FzeW5jX3NlbTsKK3N0YXRpYyBzdHJ1Y3Qgb3BhbF9tc2cgKm9wYWxfYXN5bmNfcmVzcG9uc2VzOworc3RhdGljIHVuc2lnbmVkIGludCBvcGFsX21heF9hc3luY190b2tlbnM7CisKK2ludCBfX29wYWxfYXN5bmNfZ2V0X3Rva2VuKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdG9rZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3BhbF9hc3luY19jb21wX2xvY2ssIGZsYWdzKTsKKwl0b2tlbiA9IGZpbmRfZmlyc3RfYml0KG9wYWxfYXN5bmNfY29tcGxldGVfbWFwLCBvcGFsX21heF9hc3luY190b2tlbnMpOworCWlmICh0b2tlbiA+PSBvcGFsX21heF9hc3luY190b2tlbnMpIHsKKwkJdG9rZW4gPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQodG9rZW4sIG9wYWxfYXN5bmNfdG9rZW5fbWFwKSkgeworCQl0b2tlbiA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJX19jbGVhcl9iaXQodG9rZW4sIG9wYWxfYXN5bmNfY29tcGxldGVfbWFwKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wYWxfYXN5bmNfY29tcF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHRva2VuOworfQorCitpbnQgb3BhbF9hc3luY19nZXRfdG9rZW5faW50ZXJydXB0aWJsZSh2b2lkKQoreworCWludCB0b2tlbjsKKworCS8qIFdhaXQgdW50aWwgYSB0b2tlbiBpcyBhdmFpbGFibGUgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZvcGFsX2FzeW5jX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwl0b2tlbiA9IF9fb3BhbF9hc3luY19nZXRfdG9rZW4oKTsKKwlpZiAodG9rZW4gPCAwKQorCQl1cCgmb3BhbF9hc3luY19zZW0pOworCisJcmV0dXJuIHRva2VuOworfQorCitpbnQgX19vcGFsX2FzeW5jX3JlbGVhc2VfdG9rZW4oaW50IHRva2VuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodG9rZW4gPCAwIHx8IHRva2VuID49IG9wYWxfbWF4X2FzeW5jX3Rva2VucykgeworCQlwcl9lcnIoIiVzOiBQYXNzZWQgdG9rZW4gaXMgb3V0IG9mIHJhbmdlLCB0b2tlbiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdG9rZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3BhbF9hc3luY19jb21wX2xvY2ssIGZsYWdzKTsKKwlfX3NldF9iaXQodG9rZW4sIG9wYWxfYXN5bmNfY29tcGxldGVfbWFwKTsKKwlfX2NsZWFyX2JpdCh0b2tlbiwgb3BhbF9hc3luY190b2tlbl9tYXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wYWxfYXN5bmNfY29tcF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG9wYWxfYXN5bmNfcmVsZWFzZV90b2tlbihpbnQgdG9rZW4pCit7CisJaW50IHJldDsKKworCXJldCA9IF9fb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKHRva2VuKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdXAoJm9wYWxfYXN5bmNfc2VtKTsKKworCXJldHVybiAwOworfQorCitpbnQgb3BhbF9hc3luY193YWl0X3Jlc3BvbnNlKHVpbnQ2NF90IHRva2VuLCBzdHJ1Y3Qgb3BhbF9tc2cgKm1zZykKK3sKKwlpZiAodG9rZW4gPj0gb3BhbF9tYXhfYXN5bmNfdG9rZW5zKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgdG9rZW4gcGFzc2VkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghbXNnKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgbWVzc2FnZSBwb2ludGVyIHBhc3NlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3YWl0X2V2ZW50KG9wYWxfYXN5bmNfd2FpdCwgdGVzdF9iaXQodG9rZW4sIG9wYWxfYXN5bmNfY29tcGxldGVfbWFwKSk7CisJbWVtY3B5KG1zZywgJm9wYWxfYXN5bmNfcmVzcG9uc2VzW3Rva2VuXSwgc2l6ZW9mKCptc2cpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wYWxfYXN5bmNfY29tcF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQl1bnNpZ25lZCBsb25nIG1zZ190eXBlLCB2b2lkICptc2cpCit7CisJc3RydWN0IG9wYWxfbXNnICpjb21wX21zZyA9IG1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG1zZ190eXBlICE9IE9QQUxfTVNHX0FTWU5DX0NPTVApCisJCXJldHVybiAwOworCisJbWVtY3B5KCZvcGFsX2FzeW5jX3Jlc3BvbnNlc1tjb21wX21zZy0+cGFyYW1zWzBdXSwgY29tcF9tc2csCisJCQlzaXplb2YoKmNvbXBfbXNnKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm9wYWxfYXN5bmNfY29tcF9sb2NrLCBmbGFncyk7CisJX19zZXRfYml0KGNvbXBfbXNnLT5wYXJhbXNbMF0sIG9wYWxfYXN5bmNfY29tcGxldGVfbWFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGFsX2FzeW5jX2NvbXBfbG9jaywgZmxhZ3MpOworCisJd2FrZV91cCgmb3BhbF9hc3luY193YWl0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG9wYWxfYXN5bmNfY29tcF9uYiA9IHsKKwkJLm5vdGlmaWVyX2NhbGwJPSBvcGFsX2FzeW5jX2NvbXBfZXZlbnQsCisJCS5uZXh0CQk9IE5VTEwsCisJCS5wcmlvcml0eQk9IDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvcGFsX2FzeW5jX2NvbXBfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb3BhbF9ub2RlOworCWNvbnN0IF9fYmUzMiAqYXN5bmM7CisJaW50IGVycjsKKworCW9wYWxfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLG9wYWwiKTsKKwlpZiAoIW9wYWxfbm9kZSkgeworCQlwcl9lcnIoIiVzOiBPcGFsIG5vZGUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWFzeW5jID0gb2ZfZ2V0X3Byb3BlcnR5KG9wYWxfbm9kZSwgIm9wYWwtbXNnLWFzeW5jLW51bSIsIE5VTEwpOworCWlmICghYXN5bmMpIHsKKwkJcHJfZXJyKCIlczogJXMgaGFzIG5vIG9wYWwtbXNnLWFzeW5jLW51bVxuIiwKKwkJCQlfX2Z1bmNfXywgb3BhbF9ub2RlLT5mdWxsX25hbWUpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIG91dF9vcGFsX25vZGU7CisJfQorCisJb3BhbF9tYXhfYXN5bmNfdG9rZW5zID0gYmUzMl90b19jcHVwKGFzeW5jKTsKKwlpZiAob3BhbF9tYXhfYXN5bmNfdG9rZW5zID4gTl9BU1lOQ19DT01QTEVUSU9OUykKKwkJb3BhbF9tYXhfYXN5bmNfdG9rZW5zID0gTl9BU1lOQ19DT01QTEVUSU9OUzsKKworCWVyciA9IG9wYWxfbWVzc2FnZV9ub3RpZmllcl9yZWdpc3RlcihPUEFMX01TR19BU1lOQ19DT01QLAorCQkJJm9wYWxfYXN5bmNfY29tcF9uYik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiBDYW4ndCByZWdpc3RlciBPUEFMIGV2ZW50IG5vdGlmaWVyICglZClcbiIsCisJCQkJX19mdW5jX18sIGVycik7CisJCWdvdG8gb3V0X29wYWxfbm9kZTsKKwl9CisKKwlvcGFsX2FzeW5jX3Jlc3BvbnNlcyA9IGt6YWxsb2MoCisJCQlzaXplb2YoKm9wYWxfYXN5bmNfcmVzcG9uc2VzKSAqIG9wYWxfbWF4X2FzeW5jX3Rva2VucywKKwkJCUdGUF9LRVJORUwpOworCWlmICghb3BhbF9hc3luY19yZXNwb25zZXMpIHsKKwkJcHJfZXJyKCIlczogT3V0IG9mIG1lbW9yeSwgZmFpbGVkIHRvIGRvIGFzeW5jaHJvbm91cyAiCisJCQkJImNvbXBsZXRpb24gaW5pdFxuIiwgX19mdW5jX18pOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9vcGFsX25vZGU7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0byAxIGxlc3MgdGhhbiB0aGUgbWF4aW11bSB0b2tlbnMgYXZhaWxhYmxlLCBhcyB3ZSBtYXkKKwkgKiByZXF1aXJlIHRvIHBvcCBvbmUgZHVyaW5nIGVtZXJnZW5jeSB0aHJvdWdoIHN5bmNocm9ub3VzIGNhbGwgdG8KKwkgKiBfX29wYWxfYXN5bmNfZ2V0X3Rva2VuKCkKKwkgKi8KKwlzZW1hX2luaXQoJm9wYWxfYXN5bmNfc2VtLCBvcGFsX21heF9hc3luY190b2tlbnMgLSAxKTsKKworb3V0X29wYWxfbm9kZToKKwlvZl9ub2RlX3B1dChvcGFsX25vZGUpOworb3V0OgorCXJldHVybiBlcnI7Cit9CitzdWJzeXNfaW5pdGNhbGwob3BhbF9hc3luY19jb21wX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzY3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1kdW1wLmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgKiBQb3dlck5WIE9QQUwgRHVtcCBJbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMywyMDE0IElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorCisjZGVmaW5lIERVTVBfVFlQRV9GU1AJMHgwMQorCitzdHJ1Y3QgZHVtcF9vYmogeworCXN0cnVjdCBrb2JqZWN0ICBrb2JqOworCXN0cnVjdCBiaW5fYXR0cmlidXRlIGR1bXBfYXR0cjsKKwl1aW50MzJfdAlpZDsgIC8qIGJlY29tZXMgb2JqZWN0IG5hbWUgKi8KKwl1aW50MzJfdAl0eXBlOworCXVpbnQzMl90CXNpemU7CisJY2hhcgkJKmJ1ZmZlcjsKK307CisjZGVmaW5lIHRvX2R1bXBfb2JqKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHVtcF9vYmosIGtvYmopCisKK3N0cnVjdCBkdW1wX2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZHVtcF9vYmogKmR1bXAsIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgZHVtcF9vYmogKmR1bXAsIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Cit9OworI2RlZmluZSB0b19kdW1wX2F0dHIoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSwgYXR0cikKKworc3RhdGljIHNzaXplX3QgZHVtcF9pZF9zaG93KHN0cnVjdCBkdW1wX29iaiAqZHVtcF9vYmosCisJCQkgICAgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBkdW1wX29iai0+aWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZHVtcF90eXBlX3RvX3N0cmluZyh1aW50MzJfdCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMHgwMTogcmV0dXJuICJTUCBEdW1wIjsKKwljYXNlIDB4MDI6IHJldHVybiAiU3lzdGVtL1BsYXRmb3JtIER1bXAiOworCWNhc2UgMHgwMzogcmV0dXJuICJTTUEgRHVtcCI7CisJZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfdHlwZV9zaG93KHN0cnVjdCBkdW1wX29iaiAqZHVtcF9vYmosCisJCQkgICAgICBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleCAlc1xuIiwgZHVtcF9vYmotPnR5cGUsCisJCSAgICAgICBkdW1wX3R5cGVfdG9fc3RyaW5nKGR1bXBfb2JqLT50eXBlKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfYWNrX3Nob3coc3RydWN0IGR1bXBfb2JqICpkdW1wX29iaiwKKwkJCSAgICAgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiYWNrIC0gYWNrbm93bGVkZ2UgZHVtcFxuIik7Cit9CisKKy8qCisgKiBTZW5kIGFja25vd2xlZGdlbWVudCB0byBPUEFMCisgKi8KK3N0YXRpYyBpbnQ2NF90IGR1bXBfc2VuZF9hY2sodWludDMyX3QgZHVtcF9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IG9wYWxfZHVtcF9hY2soZHVtcF9pZCk7CisJaWYgKHJjKQorCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIHNlbmQgYWNrIHRvIER1bXAgSUQgMHgleCAoJWQpXG4iLAorCQkJX19mdW5jX18sIGR1bXBfaWQsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGF5X3JlbGVhc2Vfa29iaih2b2lkICprb2JqKQoreworCWtvYmplY3RfcHV0KChzdHJ1Y3Qga29iamVjdCAqKWtvYmopOworfQorCitzdGF0aWMgc3NpemVfdCBkdW1wX2Fja19zdG9yZShzdHJ1Y3QgZHVtcF9vYmogKmR1bXBfb2JqLAorCQkJICAgICAgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KQoreworCWR1bXBfc2VuZF9hY2soZHVtcF9vYmotPmlkKTsKKwlzeXNmc19zY2hlZHVsZV9jYWxsYmFjaygmZHVtcF9vYmotPmtvYmosIGRlbGF5X3JlbGVhc2Vfa29iaiwKKwkJCQkmZHVtcF9vYmotPmtvYmosIFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIEF0dHJpYnV0ZXMgb2YgYSBkdW1wCisgKiBUaGUgYmluYXJ5IGF0dHJpYnV0ZSBvZiB0aGUgZHVtcCBpdHNlbGYgaXMgZHluYW1pYworICogZHVlIHRvIHRoZSBkeW5hbWljIHNpemUgb2YgdGhlIGR1bXAKKyAqLworc3RhdGljIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSBpZF9hdHRyaWJ1dGUgPQorCV9fQVRUUihpZCwgMDY2NiwgZHVtcF9pZF9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgdHlwZV9hdHRyaWJ1dGUgPQorCV9fQVRUUih0eXBlLCAwNjY2LCBkdW1wX3R5cGVfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IGR1bXBfYXR0cmlidXRlIGFja19hdHRyaWJ1dGUgPQorCV9fQVRUUihhY2tub3dsZWRnZSwgMDY2MCwgZHVtcF9hY2tfc2hvdywgZHVtcF9hY2tfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBpbml0X2R1bXBfc2hvdyhzdHJ1Y3QgZHVtcF9vYmogKmR1bXBfb2JqLAorCQkJICAgICAgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjEgLSBpbml0aWF0ZSBkdW1wXG4iKTsKK30KKworc3RhdGljIGludDY0X3QgZHVtcF9maXBzX2luaXQodWludDhfdCB0eXBlKQoreworCWludCByYzsKKworCXJjID0gb3BhbF9kdW1wX2luaXQodHlwZSk7CisJaWYgKHJjKQorCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIGluaXRpYXRlIEZpcFMgZHVtcCAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfZHVtcF9zdG9yZShzdHJ1Y3QgZHVtcF9vYmogKmR1bXBfb2JqLAorCQkJICAgICAgIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCWR1bXBfZmlwc19pbml0KERVTVBfVFlQRV9GU1ApOworCXByX2luZm8oIiVzOiBJbml0aWF0ZWQgRlNQIGR1bXBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgaW5pdGlhdGVfYXR0cmlidXRlID0KKwlfX0FUVFIoaW5pdGlhdGVfZHVtcCwgMDYwMCwgaW5pdF9kdW1wX3Nob3csIGluaXRfZHVtcF9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbml0aWF0ZV9hdHRyc1tdID0geworCSZpbml0aWF0ZV9hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW5pdGlhdGVfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBpbml0aWF0ZV9hdHRycywKK307CisKK3N0YXRpYyBzdHJ1Y3Qga3NldCAqZHVtcF9rc2V0OworCitzdGF0aWMgc3NpemVfdCBkdW1wX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyaWJ1dGU7CisJc3RydWN0IGR1bXBfb2JqICpkdW1wOworCisJYXR0cmlidXRlID0gdG9fZHVtcF9hdHRyKGF0dHIpOworCWR1bXAgPSB0b19kdW1wX29iaihrb2JqKTsKKworCWlmICghYXR0cmlidXRlLT5zaG93KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhdHRyaWJ1dGUtPnNob3coZHVtcCwgYXR0cmlidXRlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBkdW1wX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyaWJ1dGU7CisJc3RydWN0IGR1bXBfb2JqICpkdW1wOworCisJYXR0cmlidXRlID0gdG9fZHVtcF9hdHRyKGF0dHIpOworCWR1bXAgPSB0b19kdW1wX29iaihrb2JqKTsKKworCWlmICghYXR0cmlidXRlLT5zdG9yZSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYXR0cmlidXRlLT5zdG9yZShkdW1wLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgZHVtcF9zeXNmc19vcHMgPSB7CisJLnNob3cgPSBkdW1wX2F0dHJfc2hvdywKKwkuc3RvcmUgPSBkdW1wX2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgdm9pZCBkdW1wX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGR1bXBfb2JqICpkdW1wOworCisJZHVtcCA9IHRvX2R1bXBfb2JqKGtvYmopOworCXZmcmVlKGR1bXAtPmJ1ZmZlcik7CisJa2ZyZWUoZHVtcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkdW1wX2RlZmF1bHRfYXR0cnNbXSA9IHsKKwkmaWRfYXR0cmlidXRlLmF0dHIsCisJJnR5cGVfYXR0cmlidXRlLmF0dHIsCisJJmFja19hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZHVtcF9rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmR1bXBfc3lzZnNfb3BzLAorCS5yZWxlYXNlID0gJmR1bXBfcmVsZWFzZSwKKwkuZGVmYXVsdF9hdHRycyA9IGR1bXBfZGVmYXVsdF9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGZyZWVfZHVtcF9zZ19saXN0KHN0cnVjdCBvcGFsX3NnX2xpc3QgKmxpc3QpCit7CisJc3RydWN0IG9wYWxfc2dfbGlzdCAqc2cxOworCXdoaWxlIChsaXN0KSB7CisJCXNnMSA9IGxpc3QtPm5leHQ7CisJCWtmcmVlKGxpc3QpOworCQlsaXN0ID0gc2cxOworCX0KKwlsaXN0ID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBvcGFsX3NnX2xpc3QgKmR1bXBfZGF0YV90b19zZ2xpc3Qoc3RydWN0IGR1bXBfb2JqICpkdW1wKQoreworCXN0cnVjdCBvcGFsX3NnX2xpc3QgKnNnMSwgKmxpc3QgPSBOVUxMOworCXZvaWQgKmFkZHI7CisJaW50NjRfdCBzaXplOworCisJYWRkciA9IGR1bXAtPmJ1ZmZlcjsKKwlzaXplID0gZHVtcC0+c2l6ZTsKKworCXNnMSA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNnMSkKKwkJZ290byBub21lbTsKKworCWxpc3QgPSBzZzE7CisJc2cxLT5udW1fZW50cmllcyA9IDA7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCS8qIFRyYW5zbGF0ZSB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworCQlzZzEtPmVudHJ5W3NnMS0+bnVtX2VudHJpZXNdLmRhdGEgPQorCQkJKHZvaWQgKikodm1hbGxvY190b19wZm4oYWRkcikgPDwgUEFHRV9TSElGVCk7CisKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzZzEtPmVudHJ5W3NnMS0+bnVtX2VudHJpZXNdLmxlbmd0aCA9IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2cxLT5lbnRyeVtzZzEtPm51bV9lbnRyaWVzXS5sZW5ndGggPSBzaXplOworCisJCXNnMS0+bnVtX2VudHJpZXMrKzsKKwkJaWYgKHNnMS0+bnVtX2VudHJpZXMgPj0gU0dfRU5UUklFU19QRVJfTk9ERSkgeworCQkJc2cxLT5uZXh0ID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFzZzEtPm5leHQpCisJCQkJZ290byBub21lbTsKKworCQkJc2cxID0gc2cxLT5uZXh0OworCQkJc2cxLT5udW1fZW50cmllcyA9IDA7CisJCX0KKwkJYWRkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwlyZXR1cm4gbGlzdDsKKworbm9tZW06CisJcHJfZXJyKCIlcyA6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwlmcmVlX2R1bXBfc2dfbGlzdChsaXN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2dsaXN0X3RvX3BoeV9hZGRyKHN0cnVjdCBvcGFsX3NnX2xpc3QgKmxpc3QpCit7CisJc3RydWN0IG9wYWxfc2dfbGlzdCAqc2csICpuZXh0OworCisJZm9yIChzZyA9IGxpc3Q7IHNnOyBzZyA9IG5leHQpIHsKKwkJbmV4dCA9IHNnLT5uZXh0OworCQkvKiBEb24ndCB0cmFuc2xhdGUgTlVMTCBwb2ludGVyIGZvciBsYXN0IGVudHJ5ICovCisJCWlmIChzZy0+bmV4dCkKKwkJCXNnLT5uZXh0ID0gKHN0cnVjdCBvcGFsX3NnX2xpc3QgKilfX3BhKHNnLT5uZXh0KTsKKwkJZWxzZQorCQkJc2ctPm5leHQgPSBOVUxMOworCisJCS8qIENvbnZlcnQgbnVtX2VudHJpZXMgdG8gbGVuZ3RoICovCisJCXNnLT5udW1fZW50cmllcyA9CisJCQlzZy0+bnVtX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IG9wYWxfc2dfZW50cnkpICsgMTY7CisJfQorfQorCitzdGF0aWMgaW50NjRfdCBkdW1wX3JlYWRfaW5mbyh1aW50MzJfdCAqaWQsIHVpbnQzMl90ICpzaXplLCB1aW50MzJfdCAqdHlwZSkKK3sKKwlpbnQgcmM7CisJKnR5cGUgPSAweGZmZmZmZmZmOworCisJcmMgPSBvcGFsX2R1bXBfaW5mbzIoaWQsIHNpemUsIHR5cGUpOworCisJaWYgKHJjID09IE9QQUxfUEFSQU1FVEVSKQorCQlyYyA9IG9wYWxfZHVtcF9pbmZvKGlkLCBzaXplKTsKKworCWlmIChyYykKKwkJcHJfd2FybigiJXM6IEZhaWxlZCB0byBnZXQgZHVtcCBpbmZvICglZClcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludDY0X3QgZHVtcF9yZWFkX2RhdGEoc3RydWN0IGR1bXBfb2JqICpkdW1wKQoreworCXN0cnVjdCBvcGFsX3NnX2xpc3QgKmxpc3Q7CisJdWludDY0X3QgYWRkcjsKKwlpbnQ2NF90IHJjOworCisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJZHVtcC0+YnVmZmVyID0gdnphbGxvYyhQQUdFX0FMSUdOKGR1bXAtPnNpemUpKTsKKwlpZiAoIWR1bXAtPmJ1ZmZlcikgeworCQlwcl9lcnIoIiVzIDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qIEdlbmVyYXRlIFNHIGxpc3QgKi8KKwlsaXN0ID0gZHVtcF9kYXRhX3RvX3NnbGlzdChkdW1wKTsKKwlpZiAoIWxpc3QpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUcmFuc2xhdGUgc2cgbGlzdCBhZGRyIHRvIHJlYWwgYWRkcmVzcyAqLworCXNnbGlzdF90b19waHlfYWRkcihsaXN0KTsKKworCS8qIEZpcnN0IGVudHJ5IGFkZHJlc3MgKi8KKwlhZGRyID0gX19wYShsaXN0KTsKKworCS8qIEZldGNoIGRhdGEgKi8KKwlyYyA9IE9QQUxfQlVTWV9FVkVOVDsKKwl3aGlsZSAocmMgPT0gT1BBTF9CVVNZIHx8IHJjID09IE9QQUxfQlVTWV9FVkVOVCkgeworCQlyYyA9IG9wYWxfZHVtcF9yZWFkKGR1bXAtPmlkLCBhZGRyKTsKKwkJaWYgKHJjID09IE9QQUxfQlVTWV9FVkVOVCkgeworCQkJb3BhbF9wb2xsX2V2ZW50cyhOVUxMKTsKKwkJCW1zbGVlcCgyMCk7CisJCX0KKwl9CisKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTICYmIHJjICE9IE9QQUxfUEFSVElBTCkKKwkJcHJfd2FybigiJXM6IEV4dHJhY3QgZHVtcCBmYWlsZWQgZm9yIElEIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgZHVtcC0+aWQpOworCisJLyogRnJlZSBTRyBsaXN0ICovCisJZnJlZV9kdW1wX3NnX2xpc3QobGlzdCk7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfYXR0cl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkgICAgICBjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IHJjOworCisJc3RydWN0IGR1bXBfb2JqICpkdW1wID0gdG9fZHVtcF9vYmooa29iaik7CisKKwlpZiAoIWR1bXAtPmJ1ZmZlcikgeworCQlyYyA9IGR1bXBfcmVhZF9kYXRhKGR1bXApOworCisJCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MgJiYgcmMgIT0gT1BBTF9QQVJUSUFMKSB7CisJCQl2ZnJlZShkdW1wLT5idWZmZXIpOworCQkJZHVtcC0+YnVmZmVyID0gTlVMTDsKKworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKHJjID09IE9QQUxfUEFSVElBTCkgeworCQkJLyogT24gYSBwYXJ0aWFsIHJlYWQsIHdlIGp1c3QgcmV0dXJuIEVJTworCQkJICogYW5kIHJlbHkgb24gdXNlcnNwYWNlIHRvIGFzayB1cyB0byB0cnkKKwkJCSAqIGFnYWluLgorCQkJICovCisJCQlwcl9pbmZvKCIlczogUGxhdGZvcm0gZHVtcCBwYXJ0aWFsbHkgcmVhZC5JRCA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGR1bXAtPmlkKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJbWVtY3B5KGJ1ZmZlciwgZHVtcC0+YnVmZmVyICsgcG9zLCBjb3VudCk7CisKKwkvKiBZb3UgbWF5IHRoaW5rIHdlIGNvdWxkIGZyZWUgdGhlIGR1bXAgYnVmZmVyIG5vdyBhbmQgcmV0cmlldmUKKwkgKiBpdCBhZ2FpbiBsYXRlciBpZiBuZWVkZWQsIGJ1dCBkdWUgdG8gY3VycmVudCBmaXJtd2FyZSBsaW1pdGF0aW9uLAorCSAqIHRoYXQncyBub3QgdGhlIGNhc2UuIFNvLCBvbmNlIHJlYWQgaW50byB1c2Vyc3BhY2Ugb25jZSwKKwkgKiB3ZSBrZWVwIHRoZSBkdW1wIGFyb3VuZCB1bnRpbCBpdCdzIGFja25vd2xlZGdlZCBieSB1c2Vyc3BhY2UuCisJICovCisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHVtcF9vYmogKmNyZWF0ZV9kdW1wX29iaih1aW50MzJfdCBpZCwgc2l6ZV90IHNpemUsCisJCQkJCXVpbnQzMl90IHR5cGUpCit7CisJc3RydWN0IGR1bXBfb2JqICpkdW1wOworCWludCByYzsKKworCWR1bXAgPSBremFsbG9jKHNpemVvZigqZHVtcCksIEdGUF9LRVJORUwpOworCWlmICghZHVtcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkdW1wLT5rb2JqLmtzZXQgPSBkdW1wX2tzZXQ7CisKKwlrb2JqZWN0X2luaXQoJmR1bXAtPmtvYmosICZkdW1wX2t0eXBlKTsKKworCXN5c2ZzX2Jpbl9hdHRyX2luaXQoJmR1bXAtPmR1bXBfYXR0cik7CisKKwlkdW1wLT5kdW1wX2F0dHIuYXR0ci5uYW1lID0gImR1bXAiOworCWR1bXAtPmR1bXBfYXR0ci5hdHRyLm1vZGUgPSAwNDAwOworCWR1bXAtPmR1bXBfYXR0ci5zaXplID0gc2l6ZTsKKwlkdW1wLT5kdW1wX2F0dHIucmVhZCA9IGR1bXBfYXR0cl9yZWFkOworCisJZHVtcC0+aWQgPSBpZDsKKwlkdW1wLT5zaXplID0gc2l6ZTsKKwlkdW1wLT50eXBlID0gdHlwZTsKKworCXJjID0ga29iamVjdF9hZGQoJmR1bXAtPmtvYmosIE5VTEwsICIweCV4LTB4JXgiLCB0eXBlLCBpZCk7CisJaWYgKHJjKSB7CisJCWtvYmplY3RfcHV0KCZkdW1wLT5rb2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmMgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmR1bXAtPmtvYmosICZkdW1wLT5kdW1wX2F0dHIpOworCWlmIChyYykgeworCQlrb2JqZWN0X3B1dCgmZHVtcC0+a29iaik7CisJCXJldHVybiBOVUxMOworCX0KKworCXByX2luZm8oIiVzOiBOZXcgcGxhdGZvcm0gZHVtcC4gSUQgPSAweCV4IFNpemUgJXVcbiIsCisJCV9fZnVuY19fLCBkdW1wLT5pZCwgZHVtcC0+c2l6ZSk7CisKKwlrb2JqZWN0X3VldmVudCgmZHVtcC0+a29iaiwgS09CSl9BREQpOworCisJcmV0dXJuIGR1bXA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kdW1wKHZvaWQpCit7CisJaW50IHJjOworCXVpbnQzMl90IGR1bXBfaWQsIGR1bXBfc2l6ZSwgZHVtcF90eXBlOworCXN0cnVjdCBkdW1wX29iaiAqZHVtcDsKKwljaGFyIG5hbWVbMjJdOworCisJcmMgPSBkdW1wX3JlYWRfaW5mbygmZHVtcF9pZCwgJmR1bXBfc2l6ZSwgJmR1bXBfdHlwZSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcmV0dXJuIHJjOworCisJc3ByaW50ZihuYW1lLCAiMHgleC0weCV4IiwgZHVtcF90eXBlLCBkdW1wX2lkKTsKKworCS8qIHdlIG1heSBnZXQgbm90aWZpZWQgdHdpY2UsIGxldCdzIGhhbmRsZQorCSAqIHRoYXQgZ3JhY2VmdWxseSBhbmQgbm90IGNyZWF0ZSB0d28gY29uZmxpY3RpbmcKKwkgKiBlbnRyaWVzLgorCSAqLworCWlmIChrc2V0X2ZpbmRfb2JqKGR1bXBfa3NldCwgbmFtZSkpCisJCXJldHVybiAwOworCisJZHVtcCA9IGNyZWF0ZV9kdW1wX29iaihkdW1wX2lkLCBkdW1wX3NpemUsIGR1bXBfdHlwZSk7CisJaWYgKCFkdW1wKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlwcm9jZXNzX2R1bXAoKTsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhkdW1wX3dvcmssIGR1bXBfd29ya19mbik7CisKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3Byb2Nlc3NfZHVtcCh2b2lkKQoreworCXNjaGVkdWxlX3dvcmsoJmR1bXBfd29yayk7Cit9CisKKy8qCisgKiBOZXcgZHVtcCBhdmFpbGFibGUgbm90aWZpY2F0aW9uCisgKgorICogT25jZSB3ZSBnZXQgbm90aWZpY2F0aW9uLCB3ZSBhZGQgc3lzZnMgZW50cmllcyBmb3IgaXQuCisgKiBXZSBvbmx5IGZldGNoIHRoZSBkdW1wIG9uIGRlbWFuZCwgYW5kIGNyZWF0ZSBzeXNmcyBhc3luY2hyb25vdXNseS4KKyAqLworc3RhdGljIGludCBkdW1wX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRzLCB2b2lkICpjaGFuZ2UpCit7CisJaWYgKGV2ZW50cyAmIE9QQUxfRVZFTlRfRFVNUF9BVkFJTCkKKwkJc2NoZWR1bGVfcHJvY2Vzc19kdW1wKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkdW1wX25iID0geworCS5ub3RpZmllcl9jYWxsICA9IGR1bXBfZXZlbnQsCisJLm5leHQgICAgICAgICAgID0gTlVMTCwKKwkucHJpb3JpdHkgICAgICAgPSAwCit9OworCit2b2lkIF9faW5pdCBvcGFsX3BsYXRmb3JtX2R1bXBfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCWR1bXBfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImR1bXAiLCBOVUxMLCBvcGFsX2tvYmopOworCWlmICghZHVtcF9rc2V0KSB7CisJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGR1bXAga3NldFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmR1bXBfa3NldC0+a29iaiwgJmluaXRpYXRlX2F0dHJfZ3JvdXApOworCWlmIChyYykgeworCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBpbml0aWF0ZSBkdW1wIGF0dHIgZ3JvdXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWtvYmplY3RfcHV0KCZkdW1wX2tzZXQtPmtvYmopOworCQlyZXR1cm47CisJfQorCisJcmMgPSBvcGFsX25vdGlmaWVyX3JlZ2lzdGVyKCZkdW1wX25iKTsKKwlpZiAocmMpIHsKKwkJcHJfd2FybigiJXM6IENhbid0IHJlZ2lzdGVyIE9QQUwgZXZlbnQgbm90aWZpZXIgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybjsKKwl9CisKKwlvcGFsX2R1bXBfcmVzZW5kX25vdGlmaWNhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZWxvZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzM1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBFcnJvciBsb2cgc3VwcG9ydCBvbiBQb3dlck5WLgorICoKKyAqIENvcHlyaWdodCAyMDEzLDIwMTQgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKworc3RydWN0IGVsb2dfb2JqIHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCBiaW5fYXR0cmlidXRlIHJhd19hdHRyOworCXVpbnQ2NF90IGlkOworCXVpbnQ2NF90IHR5cGU7CisJc2l6ZV90IHNpemU7CisJY2hhciAqYnVmZmVyOworfTsKKyNkZWZpbmUgdG9fZWxvZ19vYmooeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBlbG9nX29iaiwga29iaikKKworc3RydWN0IGVsb2dfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBlbG9nX29iaiAqZWxvZywgc3RydWN0IGVsb2dfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBlbG9nX29iaiAqZWxvZywgc3RydWN0IGVsb2dfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK307CisjZGVmaW5lIHRvX2Vsb2dfYXR0cih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGVsb2dfYXR0cmlidXRlLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCBlbG9nX2lkX3Nob3coc3RydWN0IGVsb2dfb2JqICplbG9nX29iaiwKKwkJCSAgICBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWxseFxuIiwgZWxvZ19vYmotPmlkKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmVsb2dfdHlwZV90b19zdHJpbmcodWludDY0X3QgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDA6IHJldHVybiAiUEVMIjsKKwlkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIHNzaXplX3QgZWxvZ190eXBlX3Nob3coc3RydWN0IGVsb2dfb2JqICplbG9nX29iaiwKKwkJCSAgICAgIHN0cnVjdCBlbG9nX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCVsbHggJXNcbiIsCisJCSAgICAgICBlbG9nX29iai0+dHlwZSwKKwkJICAgICAgIGVsb2dfdHlwZV90b19zdHJpbmcoZWxvZ19vYmotPnR5cGUpKTsKK30KKworc3RhdGljIHNzaXplX3QgZWxvZ19hY2tfc2hvdyhzdHJ1Y3QgZWxvZ19vYmogKmVsb2dfb2JqLAorCQkJICAgICBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJhY2sgLSBhY2tub3dsZWRnZSBsb2cgbWVzc2FnZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGF5X3JlbGVhc2Vfa29iaih2b2lkICprb2JqKQoreworCWtvYmplY3RfcHV0KChzdHJ1Y3Qga29iamVjdCAqKWtvYmopOworfQorCitzdGF0aWMgc3NpemVfdCBlbG9nX2Fja19zdG9yZShzdHJ1Y3QgZWxvZ19vYmogKmVsb2dfb2JqLAorCQkJICAgICAgc3RydWN0IGVsb2dfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KQoreworCW9wYWxfc2VuZF9hY2tfZWxvZyhlbG9nX29iai0+aWQpOworCXN5c2ZzX3NjaGVkdWxlX2NhbGxiYWNrKCZlbG9nX29iai0+a29iaiwgZGVsYXlfcmVsZWFzZV9rb2JqLAorCQkJCSZlbG9nX29iai0+a29iaiwgVEhJU19NT0RVTEUpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBlbG9nX2F0dHJpYnV0ZSBpZF9hdHRyaWJ1dGUgPQorCV9fQVRUUihpZCwgMDY2NiwgZWxvZ19pZF9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgdHlwZV9hdHRyaWJ1dGUgPQorCV9fQVRUUih0eXBlLCAwNjY2LCBlbG9nX3R5cGVfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IGVsb2dfYXR0cmlidXRlIGFja19hdHRyaWJ1dGUgPQorCV9fQVRUUihhY2tub3dsZWRnZSwgMDY2MCwgZWxvZ19hY2tfc2hvdywgZWxvZ19hY2tfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGtzZXQgKmVsb2dfa3NldDsKKworc3RhdGljIHNzaXplX3QgZWxvZ19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBlbG9nX2F0dHJpYnV0ZSAqYXR0cmlidXRlOworCXN0cnVjdCBlbG9nX29iaiAqZWxvZzsKKworCWF0dHJpYnV0ZSA9IHRvX2Vsb2dfYXR0cihhdHRyKTsKKwllbG9nID0gdG9fZWxvZ19vYmooa29iaik7CisKKwlpZiAoIWF0dHJpYnV0ZS0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYXR0cmlidXRlLT5zaG93KGVsb2csIGF0dHJpYnV0ZSwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgZWxvZ19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBlbG9nX2F0dHJpYnV0ZSAqYXR0cmlidXRlOworCXN0cnVjdCBlbG9nX29iaiAqZWxvZzsKKworCWF0dHJpYnV0ZSA9IHRvX2Vsb2dfYXR0cihhdHRyKTsKKwllbG9nID0gdG9fZWxvZ19vYmooa29iaik7CisKKwlpZiAoIWF0dHJpYnV0ZS0+c3RvcmUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGF0dHJpYnV0ZS0+c3RvcmUoZWxvZywgYXR0cmlidXRlLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGVsb2dfc3lzZnNfb3BzID0geworCS5zaG93ID0gZWxvZ19hdHRyX3Nob3csCisJLnN0b3JlID0gZWxvZ19hdHRyX3N0b3JlLAorfTsKKworc3RhdGljIHZvaWQgZWxvZ19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBlbG9nX29iaiAqZWxvZzsKKworCWVsb2cgPSB0b19lbG9nX29iaihrb2JqKTsKKwlrZnJlZShlbG9nLT5idWZmZXIpOworCWtmcmVlKGVsb2cpOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZWxvZ19kZWZhdWx0X2F0dHJzW10gPSB7CisJJmlkX2F0dHJpYnV0ZS5hdHRyLAorCSZ0eXBlX2F0dHJpYnV0ZS5hdHRyLAorCSZhY2tfYXR0cmlidXRlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGVsb2dfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZlbG9nX3N5c2ZzX29wcywKKwkucmVsZWFzZSA9ICZlbG9nX3JlbGVhc2UsCisJLmRlZmF1bHRfYXR0cnMgPSBlbG9nX2RlZmF1bHRfYXR0cnMsCit9OworCisvKiBNYXhpbXVtIHNpemUgb2YgYSBzaW5nbGUgbG9nIG9uIEZTUCBpcyAxNktCICovCisjZGVmaW5lIE9QQUxfTUFYX0VSUkxPR19TSVpFCTE2Mzg0CisKK3N0YXRpYyBzc2l6ZV90IHJhd19hdHRyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJICAgICBjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgb3BhbF9yYzsKKworCXN0cnVjdCBlbG9nX29iaiAqZWxvZyA9IHRvX2Vsb2dfb2JqKGtvYmopOworCisJLyogV2UgbWF5IGhhdmUgaGFkIGFuIGVycm9yIHJlYWRpbmcgYmVmb3JlLCBzbyBsZXQncyByZXRyeSAqLworCWlmICghZWxvZy0+YnVmZmVyKSB7CisJCWVsb2ctPmJ1ZmZlciA9IGt6YWxsb2MoZWxvZy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZWxvZy0+YnVmZmVyKQorCQkJcmV0dXJuIC1FSU87CisKKwkJb3BhbF9yYyA9IG9wYWxfcmVhZF9lbG9nKF9fcGEoZWxvZy0+YnVmZmVyKSwKKwkJCQkJIGVsb2ctPnNpemUsIGVsb2ctPmlkKTsKKwkJaWYgKG9wYWxfcmMgIT0gT1BBTF9TVUNDRVNTKSB7CisJCQlwcl9lcnIoIkVMT0c6IGxvZyByZWFkIGZhaWxlZCBmb3IgbG9nLWlkPSVsbHhcbiIsCisJCQkgICAgICAgZWxvZy0+aWQpOworCQkJa2ZyZWUoZWxvZy0+YnVmZmVyKTsKKwkJCWVsb2ctPmJ1ZmZlciA9IE5VTEw7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCW1lbWNweShidWZmZXIsIGVsb2ctPmJ1ZmZlciArIHBvcywgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGVsb2dfb2JqICpjcmVhdGVfZWxvZ19vYmoodWludDY0X3QgaWQsIHNpemVfdCBzaXplLCB1aW50NjRfdCB0eXBlKQoreworCXN0cnVjdCBlbG9nX29iaiAqZWxvZzsKKwlpbnQgcmM7CisKKwllbG9nID0ga3phbGxvYyhzaXplb2YoKmVsb2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsb2cpCisJCXJldHVybiBOVUxMOworCisJZWxvZy0+a29iai5rc2V0ID0gZWxvZ19rc2V0OworCisJa29iamVjdF9pbml0KCZlbG9nLT5rb2JqLCAmZWxvZ19rdHlwZSk7CisKKwlzeXNmc19iaW5fYXR0cl9pbml0KCZlbG9nLT5yYXdfYXR0cik7CisKKwllbG9nLT5yYXdfYXR0ci5hdHRyLm5hbWUgPSAicmF3IjsKKwllbG9nLT5yYXdfYXR0ci5hdHRyLm1vZGUgPSAwNDAwOworCWVsb2ctPnJhd19hdHRyLnNpemUgPSBzaXplOworCWVsb2ctPnJhd19hdHRyLnJlYWQgPSByYXdfYXR0cl9yZWFkOworCisJZWxvZy0+aWQgPSBpZDsKKwllbG9nLT5zaXplID0gc2l6ZTsKKwllbG9nLT50eXBlID0gdHlwZTsKKworCWVsb2ctPmJ1ZmZlciA9IGt6YWxsb2MoZWxvZy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoZWxvZy0+YnVmZmVyKSB7CisJCXJjID0gb3BhbF9yZWFkX2Vsb2coX19wYShlbG9nLT5idWZmZXIpLAorCQkJCQkgZWxvZy0+c2l6ZSwgZWxvZy0+aWQpOworCQlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKSB7CisJCQlwcl9lcnIoIkVMT0c6IGxvZyByZWFkIGZhaWxlZCBmb3IgbG9nLWlkPSVsbHhcbiIsCisJCQkgICAgICAgZWxvZy0+aWQpOworCQkJa2ZyZWUoZWxvZy0+YnVmZmVyKTsKKwkJCWVsb2ctPmJ1ZmZlciA9IE5VTEw7CisJCX0KKwl9CisKKwlyYyA9IGtvYmplY3RfYWRkKCZlbG9nLT5rb2JqLCBOVUxMLCAiMHglbGx4IiwgaWQpOworCWlmIChyYykgeworCQlrb2JqZWN0X3B1dCgmZWxvZy0+a29iaik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJjID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZlbG9nLT5rb2JqLCAmZWxvZy0+cmF3X2F0dHIpOworCWlmIChyYykgeworCQlrb2JqZWN0X3B1dCgmZWxvZy0+a29iaik7CisJCXJldHVybiBOVUxMOworCX0KKworCWtvYmplY3RfdWV2ZW50KCZlbG9nLT5rb2JqLCBLT0JKX0FERCk7CisKKwlyZXR1cm4gZWxvZzsKK30KKworc3RhdGljIHZvaWQgZWxvZ193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzaXplX3QgZWxvZ19zaXplOworCXVpbnQ2NF90IGxvZ19pZDsKKwl1aW50NjRfdCBlbG9nX3R5cGU7CisJaW50IHJjOworCWNoYXIgbmFtZVsyKzE2KzFdOworCisJcmMgPSBvcGFsX2dldF9lbG9nX3NpemUoJmxvZ19pZCwgJmVsb2dfc2l6ZSwgJmVsb2dfdHlwZSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykgeworCQlwcl9lcnIoIkVMT0c6IE9wYWwgbG9nIHJlYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCUJVR19PTihlbG9nX3NpemUgPiBPUEFMX01BWF9FUlJMT0dfU0laRSk7CisKKwlpZiAoZWxvZ19zaXplID49IE9QQUxfTUFYX0VSUkxPR19TSVpFKQorCQllbG9nX3NpemUgID0gIE9QQUxfTUFYX0VSUkxPR19TSVpFOworCisJc3ByaW50ZihuYW1lLCAiMHglbGx4IiwgbG9nX2lkKTsKKworCS8qIHdlIG1heSBnZXQgbm90aWZpZWQgdHdpY2UsIGxldCdzIGhhbmRsZQorCSAqIHRoYXQgZ3JhY2VmdWxseSBhbmQgbm90IGNyZWF0ZSB0d28gY29uZmxpY3RpbmcKKwkgKiBlbnRyaWVzLgorCSAqLworCWlmIChrc2V0X2ZpbmRfb2JqKGVsb2dfa3NldCwgbmFtZSkpCisJCXJldHVybjsKKworCWNyZWF0ZV9lbG9nX29iaihsb2dfaWQsIGVsb2dfc2l6ZSwgZWxvZ190eXBlKTsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhlbG9nX3dvcmssIGVsb2dfd29ya19mbik7CisKK3N0YXRpYyBpbnQgZWxvZ19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnRzLCB2b2lkICpjaGFuZ2UpCit7CisJLyogY2hlY2sgZm9yIGVycm9yIGxvZyBldmVudCAqLworCWlmIChldmVudHMgJiBPUEFMX0VWRU5UX0VSUk9SX0xPR19BVkFJTCkKKwkJc2NoZWR1bGVfd29yaygmZWxvZ193b3JrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBlbG9nX25iID0geworCS5ub3RpZmllcl9jYWxsICA9IGVsb2dfZXZlbnQsCisJLm5leHQgICAgICAgICAgID0gTlVMTCwKKwkucHJpb3JpdHkgICAgICAgPSAwCit9OworCitpbnQgX19pbml0IG9wYWxfZWxvZ19pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCWVsb2dfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImVsb2ciLCBOVUxMLCBvcGFsX2tvYmopOworCWlmICghZWxvZ19rc2V0KSB7CisJCXByX3dhcm4oIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGVsb2cga3NldFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmMgPSBvcGFsX25vdGlmaWVyX3JlZ2lzdGVyKCZlbG9nX25iKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogQ2FuJ3QgcmVnaXN0ZXIgT1BBTCBldmVudCBub3RpZmllciAoJWQpXG4iLAorCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogV2UgYXJlIG5vdyByZWFkeSB0byBwdWxsIGVycm9yIGxvZ3MgZnJvbSBvcGFsLiAqLworCW9wYWxfcmVzZW5kX3BlbmRpbmdfbG9ncygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1zZW5zb3IuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXNlbnNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2M2NjOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1zZW5zb3IuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogUG93ZXJOViBzZW5zb3IgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJQk0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorCitzdGF0aWMgREVGSU5FX01VVEVYKG9wYWxfc2Vuc29yX211dGV4KTsKKworLyoKKyAqIFRoaXMgd2lsbCByZXR1cm4gc2Vuc29yIGluZm9ybWF0aW9uIHRvIGRyaXZlciBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIHNlbnNvcgorICogaGFuZGxlLiBBIGhhbmRsZSBpcyBhbiBvcGFxdWUgaWQgZm9yIHRoZSBwb3dlcm52LCByZWFkIGJ5IHRoZSBkcml2ZXIgZnJvbSB0aGUKKyAqIGRldmljZSB0cmVlLi4KKyAqLworaW50IG9wYWxfZ2V0X3NlbnNvcl9kYXRhKHUzMiBzZW5zb3JfaG5kbCwgdTMyICpzZW5zb3JfZGF0YSkKK3sKKwlpbnQgcmV0LCB0b2tlbjsKKwlzdHJ1Y3Qgb3BhbF9tc2cgbXNnOworCisJdG9rZW4gPSBvcGFsX2FzeW5jX2dldF90b2tlbl9pbnRlcnJ1cHRpYmxlKCk7CisJaWYgKHRva2VuIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb3VsZG4ndCBnZXQgdGhlIHRva2VuLCByZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gdG9rZW47CisJCWdvdG8gb3V0OworCX0KKworCW11dGV4X2xvY2soJm9wYWxfc2Vuc29yX211dGV4KTsKKwlyZXQgPSBvcGFsX3NlbnNvcl9yZWFkKHNlbnNvcl9obmRsLCB0b2tlbiwgc2Vuc29yX2RhdGEpOworCWlmIChyZXQgIT0gT1BBTF9BU1lOQ19DT01QTEVUSU9OKQorCQlnb3RvIG91dF90b2tlbjsKKworCXJldCA9IG9wYWxfYXN5bmNfd2FpdF9yZXNwb25zZSh0b2tlbiwgJm1zZyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gd2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlLCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBvdXRfdG9rZW47CisJfQorCisJcmV0ID0gbXNnLnBhcmFtc1sxXTsKKworb3V0X3Rva2VuOgorCW11dGV4X3VubG9jaygmb3BhbF9zZW5zb3JfbXV0ZXgpOworCW9wYWxfYXN5bmNfcmVsZWFzZV90b2tlbih0b2tlbik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9wYWxfZ2V0X3NlbnNvcl9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXN5c3BhcmFtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1zeXNwYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1zeXNwYXJhbS5jCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogUG93ZXJOViBzeXN0ZW0gcGFyYW1ldGVyIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSUJNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKworI2RlZmluZSBNQVhfUEFSQU1fREFUQV9MRU4JNjQKKworc3RhdGljIERFRklORV9NVVRFWChvcGFsX3N5c3BhcmFtX211dGV4KTsKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqc3lzcGFyYW1fa29iajsKK3N0YXRpYyB2b2lkICpwYXJhbV9kYXRhX2J1ZjsKKworc3RydWN0IHBhcmFtX2F0dHIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MzIgcGFyYW1faWQ7CisJdTMyIHBhcmFtX3NpemU7CisJc3RydWN0IGtvYmpfYXR0cmlidXRlIGtvYmpfYXR0cjsKK307CisKK3N0YXRpYyBpbnQgb3BhbF9nZXRfc3lzX3BhcmFtKHUzMiBwYXJhbV9pZCwgdTMyIGxlbmd0aCwgdm9pZCAqYnVmZmVyKQoreworCXN0cnVjdCBvcGFsX21zZyBtc2c7CisJaW50IHJldCwgdG9rZW47CisKKwl0b2tlbiA9IG9wYWxfYXN5bmNfZ2V0X3Rva2VuX2ludGVycnVwdGlibGUoKTsKKwlpZiAodG9rZW4gPCAwKSB7CisJCWlmICh0b2tlbiAhPSAtRVJFU1RBUlRTWVMpCisJCQlwcl9lcnIoIiVzOiBDb3VsZG4ndCBnZXQgdGhlIHRva2VuLCByZXR1cm5pbmdcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gdG9rZW47CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9wYWxfZ2V0X3BhcmFtKHRva2VuLCBwYXJhbV9pZCwgKHU2NClidWZmZXIsIGxlbmd0aCk7CisJaWYgKHJldCAhPSBPUEFMX0FTWU5DX0NPTVBMRVRJT04pCisJCWdvdG8gb3V0X3Rva2VuOworCisJcmV0ID0gb3BhbF9hc3luY193YWl0X3Jlc3BvbnNlKHRva2VuLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byB3YWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UsICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIG91dF90b2tlbjsKKwl9CisKKwlyZXQgPSBtc2cucGFyYW1zWzFdOworCitvdXRfdG9rZW46CisJb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKHRva2VuKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wYWxfc2V0X3N5c19wYXJhbSh1MzIgcGFyYW1faWQsIHUzMiBsZW5ndGgsIHZvaWQgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3Qgb3BhbF9tc2cgbXNnOworCWludCByZXQsIHRva2VuOworCisJdG9rZW4gPSBvcGFsX2FzeW5jX2dldF90b2tlbl9pbnRlcnJ1cHRpYmxlKCk7CisJaWYgKHRva2VuIDwgMCkgeworCQlpZiAodG9rZW4gIT0gLUVSRVNUQVJUU1lTKQorCQkJcHJfZXJyKCIlczogQ291bGRuJ3QgZ2V0IHRoZSB0b2tlbiwgcmV0dXJuaW5nXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCXJldCA9IHRva2VuOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvcGFsX3NldF9wYXJhbSh0b2tlbiwgcGFyYW1faWQsICh1NjQpYnVmZmVyLCBsZW5ndGgpOworCisJaWYgKHJldCAhPSBPUEFMX0FTWU5DX0NPTVBMRVRJT04pCisJCWdvdG8gb3V0X3Rva2VuOworCisJcmV0ID0gb3BhbF9hc3luY193YWl0X3Jlc3BvbnNlKHRva2VuLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byB3YWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UsICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIG91dF90b2tlbjsKKwl9CisKKwlyZXQgPSBtc2cucGFyYW1zWzFdOworCitvdXRfdG9rZW46CisJb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKHRva2VuKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzeXNfcGFyYW1fc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGtvYmpfYXR0cmlidXRlICprb2JqX2F0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGFyYW1fYXR0ciAqYXR0ciA9IGNvbnRhaW5lcl9vZihrb2JqX2F0dHIsIHN0cnVjdCBwYXJhbV9hdHRyLAorCQkJa29ial9hdHRyKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmb3BhbF9zeXNwYXJhbV9tdXRleCk7CisJcmV0ID0gb3BhbF9nZXRfc3lzX3BhcmFtKGF0dHItPnBhcmFtX2lkLCBhdHRyLT5wYXJhbV9zaXplLAorCQkJcGFyYW1fZGF0YV9idWYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KGJ1ZiwgcGFyYW1fZGF0YV9idWYsIGF0dHItPnBhcmFtX3NpemUpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZvcGFsX3N5c3BhcmFtX211dGV4KTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogYXR0ci0+cGFyYW1fc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc3lzX3BhcmFtX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmtvYmpfYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBhcmFtX2F0dHIgKmF0dHIgPSBjb250YWluZXJfb2Yoa29ial9hdHRyLCBzdHJ1Y3QgcGFyYW1fYXR0ciwKKwkJCWtvYmpfYXR0cik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm9wYWxfc3lzcGFyYW1fbXV0ZXgpOworCW1lbWNweShwYXJhbV9kYXRhX2J1ZiwgYnVmLCBjb3VudCk7CisJcmV0ID0gb3BhbF9zZXRfc3lzX3BhcmFtKGF0dHItPnBhcmFtX2lkLCBhdHRyLT5wYXJhbV9zaXplLAorCQkJcGFyYW1fZGF0YV9idWYpOworCW11dGV4X3VubG9jaygmb3BhbF9zeXNwYXJhbV9tdXRleCk7CisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OworfQorCit2b2lkIF9faW5pdCBvcGFsX3N5c19wYXJhbV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzeXNwYXJhbTsKKwlzdHJ1Y3QgcGFyYW1fYXR0ciAqYXR0cjsKKwl1MzIgKmlkLCAqc2l6ZTsKKwlpbnQgY291bnQsIGk7CisJdTggKnBlcm07CisKKwlpZiAoIW9wYWxfa29iaikgeworCQlwcl93YXJuKCJTWVNQQVJBTTogb3BhbCBrb2JqZWN0IGlzIG5vdCBhdmFpbGFibGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzeXNwYXJhbV9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgic3lzcGFyYW1zIiwgb3BhbF9rb2JqKTsKKwlpZiAoIXN5c3BhcmFtX2tvYmopIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGNyZWF0ZSBzeXNwYXJhbSBrb2JqZWN0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgYmlnIGVub3VnaCBidWZmZXIgZm9yIGFueSBnZXQvc2V0IHRyYW5zYWN0aW9ucyAqLworCXBhcmFtX2RhdGFfYnVmID0ga3phbGxvYyhNQVhfUEFSQU1fREFUQV9MRU4sIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1fZGF0YV9idWYpIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFyYW0gZGF0YSAiCisJCQkJImJ1ZlxuIik7CisJCWdvdG8gb3V0X2tvYmpfcHV0OworCX0KKworCXN5c3BhcmFtID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbC9zeXNwYXJhbXMiKTsKKwlpZiAoIXN5c3BhcmFtKSB7CisJCXByX2VycigiU1lTUEFSQU06IE9wYWwgc3lzcGFyYW0gbm9kZSBub3QgZm91bmRcbiIpOworCQlnb3RvIG91dF9wYXJhbV9idWY7CisJfQorCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzeXNwYXJhbSwgImlibSxvcGFsLXN5c3BhcmFtcyIpKSB7CisJCXByX2VycigiU1lTUEFSQU06IE9wYWwgc3lzcGFyYW0gbm9kZSBub3QgY29tcGF0aWJsZVxuIik7CisJCWdvdG8gb3V0X25vZGVfcHV0OworCX0KKworCS8qIE51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cG9zZWQgdGhyb3VnaCBEVCAqLworCWNvdW50ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhzeXNwYXJhbSwgInBhcmFtLW5hbWUiKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByX2VycigiU1lTUEFSQU06IE5vIHN0cmluZyBmb3VuZCBvZiBwcm9wZXJ0eSBwYXJhbS1uYW1lIGluICIKKwkJCQkidGhlIG5vZGUgJXNcbiIsIHN5c3BhcmFtLT5uYW1lKTsKKwkJZ290byBvdXRfbm9kZV9wdXQ7CisJfQorCisJaWQgPSBremFsbG9jKHNpemVvZigqaWQpICogY291bnQsIEdGUF9LRVJORUwpOworCWlmICghaWQpIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byByZWFkIHBhcmFtZXRlciAiCisJCQkJImlkXG4iKTsKKwkJZ290byBvdXRfbm9kZV9wdXQ7CisJfQorCisJc2l6ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzaXplKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNpemUpIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byByZWFkIHBhcmFtZXRlciAiCisJCQkJInNpemVcbiIpOworCQlnb3RvIG91dF9mcmVlX2lkOworCX0KKworCXBlcm0gPSBremFsbG9jKHNpemVvZigqcGVybSkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZXJtKSB7CisJCXByX2VycigiU1lTUEFSQU06IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gcmVhZCBzdXBwb3J0ZWQgIgorCQkJCSJhY3Rpb24gb24gdGhlIHBhcmFtZXRlciIpOworCQlnb3RvIG91dF9mcmVlX3NpemU7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHN5c3BhcmFtLCAicGFyYW0taWQiLCBpZCwgY291bnQpKSB7CisJCXByX2VycigiU1lTUEFSQU06IE1pc3NpbmcgcHJvcGVydHkgcGFyYW0taWQgaW4gdGhlIERUXG4iKTsKKwkJZ290byBvdXRfZnJlZV9wZXJtOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShzeXNwYXJhbSwgInBhcmFtLWxlbiIsIHNpemUsIGNvdW50KSkgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBNaXNzaW5nIHByb3BlcnkgcGFyYW0tbGVuIGluIHRoZSBEVFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfcGVybTsKKwl9CisKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KHN5c3BhcmFtLCAicGFyYW0tcGVybSIsIHBlcm0sIGNvdW50KSkgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBNaXNzaW5nIHByb3BlcnkgcGFyYW0tcGVybSBpbiB0aGUgRFRcbiIpOworCQlnb3RvIG91dF9mcmVlX3Blcm07CisJfQorCisJYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCphdHRyKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0dHIpIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFyYW1ldGVyICIKKwkJCQkiYXR0cmlidXRlc1xuIik7CisJCWdvdG8gb3V0X2ZyZWVfcGVybTsKKwl9CisKKwkvKiBGb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycywgcG9wdWxhdGUgdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGVzICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3lzZnNfYXR0cl9pbml0KCZhdHRyW2ldLmtvYmpfYXR0ci5hdHRyKTsKKwkJYXR0cltpXS5wYXJhbV9pZCA9IGlkW2ldOworCQlhdHRyW2ldLnBhcmFtX3NpemUgPSBzaXplW2ldOworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoc3lzcGFyYW0sICJwYXJhbS1uYW1lIiwgaSwKKwkJCQkmYXR0cltpXS5rb2JqX2F0dHIuYXR0ci5uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIHRoZSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUgKi8KKwkJc3dpdGNoIChwZXJtW2ldICYgMykgeworCQljYXNlIE9QQUxfU1lTUEFSQU1fUkVBRDoKKwkJCWF0dHJbaV0ua29ial9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CisJCQlicmVhazsKKwkJY2FzZSBPUEFMX1NZU1BBUkFNX1dSSVRFOgorCQkJYXR0cltpXS5rb2JqX2F0dHIuYXR0ci5tb2RlID0gU19JV1VHTzsKKwkJCWJyZWFrOworCQljYXNlIE9QQUxfU1lTUEFSQU1fUlc6CisJCQlhdHRyW2ldLmtvYmpfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VHTzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlhdHRyW2ldLmtvYmpfYXR0ci5zaG93ID0gc3lzX3BhcmFtX3Nob3c7CisJCWF0dHJbaV0ua29ial9hdHRyLnN0b3JlID0gc3lzX3BhcmFtX3N0b3JlOworCisJCWlmIChzeXNmc19jcmVhdGVfZmlsZShzeXNwYXJhbV9rb2JqLCAmYXR0cltpXS5rb2JqX2F0dHIuYXR0cikpIHsKKwkJCXByX2VycigiU1lTUEFSQU06IEZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSAlc1xuIiwKKwkJCQkJYXR0cltpXS5rb2JqX2F0dHIuYXR0ci5uYW1lKTsKKwkJCWdvdG8gb3V0X2ZyZWVfYXR0cjsKKwkJfQorCX0KKworCWtmcmVlKHBlcm0pOworCWtmcmVlKHNpemUpOworCWtmcmVlKGlkKTsKKwlvZl9ub2RlX3B1dChzeXNwYXJhbSk7CisJcmV0dXJuOworCitvdXRfZnJlZV9hdHRyOgorCWtmcmVlKGF0dHIpOworb3V0X2ZyZWVfcGVybToKKwlrZnJlZShwZXJtKTsKK291dF9mcmVlX3NpemU6CisJa2ZyZWUoc2l6ZSk7CitvdXRfZnJlZV9pZDoKKwlrZnJlZShpZCk7CitvdXRfbm9kZV9wdXQ6CisJb2Zfbm9kZV9wdXQoc3lzcGFyYW0pOworb3V0X3BhcmFtX2J1ZjoKKwlrZnJlZShwYXJhbV9kYXRhX2J1Zik7CitvdXRfa29ial9wdXQ6CisJa29iamVjdF9wdXQoc3lzcGFyYW1fa29iaik7CitvdXQ6CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKaW5kZXggM2U4ODI5Yy4uYmI5MGY5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCkBAIC0xMjMsOSArMTIzLDI0IEBACiBPUEFMX0NBTEwob3BhbF9scGNfcmVhZCwJCQlPUEFMX0xQQ19SRUFEKTsKIE9QQUxfQ0FMTChvcGFsX2xwY193cml0ZSwJCQlPUEFMX0xQQ19XUklURSk7CiBPUEFMX0NBTEwob3BhbF9yZXR1cm5fY3B1LAkJCU9QQUxfUkVUVVJOX0NQVSk7CitPUEFMX0NBTEwob3BhbF9yZWFkX2Vsb2csCQkJT1BBTF9FTE9HX1JFQUQpOworT1BBTF9DQUxMKG9wYWxfc2VuZF9hY2tfZWxvZywJCQlPUEFMX0VMT0dfQUNLKTsKK09QQUxfQ0FMTChvcGFsX2dldF9lbG9nX3NpemUsCQkJT1BBTF9FTE9HX1NJWkUpOworT1BBTF9DQUxMKG9wYWxfcmVzZW5kX3BlbmRpbmdfbG9ncywJCU9QQUxfRUxPR19SRVNFTkQpOworT1BBTF9DQUxMKG9wYWxfd3JpdGVfZWxvZywJCQlPUEFMX0VMT0dfV1JJVEUpOwogT1BBTF9DQUxMKG9wYWxfdmFsaWRhdGVfZmxhc2gsCQkJT1BBTF9GTEFTSF9WQUxJREFURSk7CiBPUEFMX0NBTEwob3BhbF9tYW5hZ2VfZmxhc2gsCQkJT1BBTF9GTEFTSF9NQU5BR0UpOwogT1BBTF9DQUxMKG9wYWxfdXBkYXRlX2ZsYXNoLAkJCU9QQUxfRkxBU0hfVVBEQVRFKTsKK09QQUxfQ0FMTChvcGFsX3Jlc3luY190aW1lYmFzZSwJCQlPUEFMX1JFU1lOQ19USU1FQkFTRSk7CitPUEFMX0NBTEwob3BhbF9kdW1wX2luaXQsCQkJT1BBTF9EVU1QX0lOSVQpOworT1BBTF9DQUxMKG9wYWxfZHVtcF9pbmZvLAkJCU9QQUxfRFVNUF9JTkZPKTsKK09QQUxfQ0FMTChvcGFsX2R1bXBfaW5mbzIsCQkJT1BBTF9EVU1QX0lORk8yKTsKK09QQUxfQ0FMTChvcGFsX2R1bXBfcmVhZCwJCQlPUEFMX0RVTVBfUkVBRCk7CitPUEFMX0NBTEwob3BhbF9kdW1wX2FjaywJCQlPUEFMX0RVTVBfQUNLKTsKIE9QQUxfQ0FMTChvcGFsX2dldF9tc2csCQkJCU9QQUxfR0VUX01TRyk7CiBPUEFMX0NBTEwob3BhbF9jaGVja19jb21wbGV0aW9uLAkJT1BBTF9DSEVDS19BU1lOQ19DT01QTEVUSU9OKTsKK09QQUxfQ0FMTChvcGFsX2R1bXBfcmVzZW5kX25vdGlmaWNhdGlvbiwJT1BBTF9EVU1QX1JFU0VORCk7CiBPUEFMX0NBTEwob3BhbF9zeW5jX2hvc3RfcmVib290LAkJT1BBTF9TWU5DX0hPU1RfUkVCT09UKTsKK09QQUxfQ0FMTChvcGFsX3NlbnNvcl9yZWFkLAkJCU9QQUxfU0VOU09SX1JFQUQpOworT1BBTF9DQUxMKG9wYWxfZ2V0X3BhcmFtLAkJCU9QQUxfR0VUX1BBUkFNKTsKK09QQUxfQ0FMTChvcGFsX3NldF9wYXJhbSwJCQlPUEFMX1NFVF9QQVJBTSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwuYwppbmRleCA2NTQ5OWFkLi5lOTJmMmY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL29wYWwuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CkBAIC0zMyw4ICszNCwxOCBAQAogc3RydWN0IG9wYWwgewogCXU2NCBiYXNlOwogCXU2NCBlbnRyeTsKKwl1NjQgc2l6ZTsKIH0gb3BhbDsKIAorc3RydWN0IG1jaGVja19yZWNvdmVyYWJsZV9yYW5nZSB7CisJdTY0IHN0YXJ0X2FkZHI7CisJdTY0IGVuZF9hZGRyOworCXU2NCByZWNvdmVyX2FkZHI7Cit9OworCitzdGF0aWMgc3RydWN0IG1jaGVja19yZWNvdmVyYWJsZV9yYW5nZSAqbWNfcmVjb3ZlcmFibGVfcmFuZ2U7CitzdGF0aWMgaW50IG1jX3JlY292ZXJhYmxlX3JhbmdlX2xlbjsKKwogc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb3BhbF9ub2RlOwogc3RhdGljIERFRklORV9TUElOTE9DSyhvcGFsX3dyaXRlX2xvY2spOwogZXh0ZXJuIHU2NCBvcGFsX21jX3NlY29uZGFyeV9oYW5kbGVyW107CkBAIC00OSwyNSArNjAsMjkgQEAKIGludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX29wYWwodW5zaWduZWQgbG9uZyBub2RlLAogCQkJCSAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpCiB7Ci0JY29uc3Qgdm9pZCAqYmFzZXAsICplbnRyeXA7Ci0JdW5zaWduZWQgbG9uZyBiYXNlc3osIGVudHJ5c3o7CisJY29uc3Qgdm9pZCAqYmFzZXAsICplbnRyeXAsICpzaXplcDsKKwl1bnNpZ25lZCBsb25nIGJhc2VzeiwgZW50cnlzeiwgcnVudGltZXN6OwogCiAJaWYgKGRlcHRoICE9IDEgfHwgc3RyY21wKHVuYW1lLCAiaWJtLG9wYWwiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAogCWJhc2VwICA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgIm9wYWwtYmFzZS1hZGRyZXNzIiwgJmJhc2Vzeik7CiAJZW50cnlwID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAib3BhbC1lbnRyeS1hZGRyZXNzIiwgJmVudHJ5c3opOworCXNpemVwID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAib3BhbC1ydW50aW1lLXNpemUiLCAmcnVudGltZXN6KTsKIAotCWlmICghYmFzZXAgfHwgIWVudHJ5cCkKKwlpZiAoIWJhc2VwIHx8ICFlbnRyeXAgfHwgIXNpemVwKQogCQlyZXR1cm4gMTsKIAogCW9wYWwuYmFzZSA9IG9mX3JlYWRfbnVtYmVyKGJhc2VwLCBiYXNlc3ovNCk7CiAJb3BhbC5lbnRyeSA9IG9mX3JlYWRfbnVtYmVyKGVudHJ5cCwgZW50cnlzei80KTsKKwlvcGFsLnNpemUgPSBvZl9yZWFkX251bWJlcihzaXplcCwgcnVudGltZXN6LzQpOwogCiAJcHJfZGVidWcoIk9QQUwgQmFzZSAgPSAweCVsbHggKGJhc2VwPSVwIGJhc2Vzej0lbGQpXG4iLAogCQkgb3BhbC5iYXNlLCBiYXNlcCwgYmFzZXN6KTsKIAlwcl9kZWJ1ZygiT1BBTCBFbnRyeSA9IDB4JWxseCAoZW50cnlwPSVwIGJhc2Vzej0lbGQpXG4iLAogCQkgb3BhbC5lbnRyeSwgZW50cnlwLCBlbnRyeXN6KTsKKwlwcl9kZWJ1ZygiT1BBTCBFbnRyeSA9IDB4JWxseCAoc2l6ZXA9JXAgcnVudGltZXN6PSVsZClcbiIsCisJCSBvcGFsLnNpemUsIHNpemVwLCBydW50aW1lc3opOwogCiAJcG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcyB8PSBGV19GRUFUVVJFX09QQUw7CiAJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShub2RlLCAiaWJtLG9wYWwtdjMiKSkgewpAQCAtODQsNiArOTksNTMgQEAKIAlyZXR1cm4gMTsKIH0KIAoraW50IF9faW5pdCBlYXJseV9pbml0X2R0X3NjYW5fcmVjb3ZlcmFibGVfcmFuZ2VzKHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgICBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgaSwgc2l6ZTsKKwljb25zdCBfX2JlMzIgKnByb3A7CisKKwlpZiAoZGVwdGggIT0gMSB8fCBzdHJjbXAodW5hbWUsICJpYm0sb3BhbCIpICE9IDApCisJCXJldHVybiAwOworCisJcHJvcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgIm1jaGVjay1yZWNvdmVyYWJsZS1yYW5nZXMiLCAmc2l6ZSk7CisKKwlpZiAoIXByb3ApCisJCXJldHVybiAxOworCisJcHJfZGVidWcoIkZvdW5kIG1hY2hpbmUgY2hlY2sgcmVjb3ZlcmFibGUgcmFuZ2VzLlxuIik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGhvbGQgdGhlIE1DIHJlY292ZXJhYmxlIHJhbmdlcy4gV2Ugd291bGQgYmUKKwkgKiBhY2Nlc3NpbmcgdGhlbSBpbiByZWFsIG1vZGUsIGhlbmNlIGl0IG5lZWRzIHRvIGJlIHdpdGhpbgorCSAqIFJNTyByZWdpb24uCisJICovCisJbWNfcmVjb3ZlcmFibGVfcmFuZ2UgPV9fdmEobWVtYmxvY2tfYWxsb2NfYmFzZShzaXplLCBfX2FsaWdub2ZfXyh1NjQpLAorCQkJCQkJCXBwYzY0X3JtYV9zaXplKSk7CisJbWVtc2V0KG1jX3JlY292ZXJhYmxlX3JhbmdlLCAwLCBzaXplKTsKKworCS8qCisJICogRWFjaCByZWNvdmVyYWJsZSBhZGRyZXNzIGVudHJ5IGlzIGFuIChzdGFydCBhZGRyZXNzLGxlbiwKKwkgKiByZWNvdmVyIGFkZHJlc3MpIHBhaXIsICogMiBjZWxscyBlYWNoLCB0b3RhbGxpbmcgNCBjZWxscyBwZXIgZW50cnkuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNpemUgLyAoc2l6ZW9mKCpwcm9wKSAqIDUpOyBpKyspIHsKKwkJbWNfcmVjb3ZlcmFibGVfcmFuZ2VbaV0uc3RhcnRfYWRkciA9CisJCQkJCW9mX3JlYWRfbnVtYmVyKHByb3AgKyAoaSAqIDUpICsgMCwgMik7CisJCW1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLmVuZF9hZGRyID0KKwkJCQkJbWNfcmVjb3ZlcmFibGVfcmFuZ2VbaV0uc3RhcnRfYWRkciArCisJCQkJCW9mX3JlYWRfbnVtYmVyKHByb3AgKyAoaSAqIDUpICsgMiwgMSk7CisJCW1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLnJlY292ZXJfYWRkciA9CisJCQkJCW9mX3JlYWRfbnVtYmVyKHByb3AgKyAoaSAqIDUpICsgMywgMik7CisKKwkJcHJfZGVidWcoIk1hY2hpbmUgY2hlY2sgcmVjb3ZlcmFibGUgcmFuZ2U6ICVsbHguLiVsbHg6ICVsbHhcbiIsCisJCQkJbWNfcmVjb3ZlcmFibGVfcmFuZ2VbaV0uc3RhcnRfYWRkciwKKwkJCQltY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5lbmRfYWRkciwKKwkJCQltY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5yZWNvdmVyX2FkZHIpOworCX0KKwltY19yZWNvdmVyYWJsZV9yYW5nZV9sZW4gPSBpOworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVycyh2b2lkKQogewogI2lmZGVmIF9fQklHX0VORElBTl9fCkBAIC00MDEsNiArNDYzLDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1aW50NjRfdCBmaW5kX3JlY292ZXJ5X2FkZHJlc3ModWludDY0X3QgbmlwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1jX3JlY292ZXJhYmxlX3JhbmdlX2xlbjsgaSsrKQorCQlpZiAoKG5pcCA+PSBtY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5zdGFydF9hZGRyKSAmJgorCQkgICAgKG5pcCA8IG1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLmVuZF9hZGRyKSkKKwkJICAgIHJldHVybiBtY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5yZWNvdmVyX2FkZHI7CisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgb3BhbF9tY2VfY2hlY2tfZWFybHlfcmVjb3Zlcnkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdWludDY0X3QgcmVjb3Zlcl9hZGRyID0gMDsKKworCWlmICghb3BhbC5iYXNlIHx8ICFvcGFsLnNpemUpCisJCWdvdG8gb3V0OworCisJaWYgKChyZWdzLT5uaXAgPj0gb3BhbC5iYXNlKSAmJgorCQkJKHJlZ3MtPm5pcCA8PSAob3BhbC5iYXNlICsgb3BhbC5zaXplKSkpCisJCXJlY292ZXJfYWRkciA9IGZpbmRfcmVjb3ZlcnlfYWRkcmVzcyhyZWdzLT5uaXApOworCisJLyoKKwkgKiBTZXR1cCByZWdzLT5uaXAgdG8gcmZpIGludG8gZml4dXAgYWRkcmVzcy4KKwkgKi8KKwlpZiAocmVjb3Zlcl9hZGRyKQorCQlyZWdzLT5uaXAgPSByZWNvdmVyX2FkZHI7CisKK291dDoKKwlyZXR1cm4gISFyZWNvdmVyX2FkZHI7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBvcGFsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCV9fYmU2NCBldmVudHM7CkBAIC00NzIsOCArNTY2LDE0IEBACiAJLyogQ3JlYXRlICJvcGFsIiBrb2JqZWN0IHVuZGVyIC9zeXMvZmlybXdhcmUgKi8KIAlyYyA9IG9wYWxfc3lzZnNfaW5pdCgpOwogCWlmIChyYyA9PSAwKSB7CisJCS8qIFNldHVwIGVycm9yIGxvZyBpbnRlcmZhY2UgKi8KKwkJcmMgPSBvcGFsX2Vsb2dfaW5pdCgpOwogCQkvKiBTZXR1cCBjb2RlIHVwZGF0ZSBpbnRlcmZhY2UgKi8KIAkJb3BhbF9mbGFzaF9pbml0KCk7CisJCS8qIFNldHVwIHBsYXRmb3JtIGR1bXAgZXh0cmFjdCBpbnRlcmZhY2UgKi8KKwkJb3BhbF9wbGF0Zm9ybV9kdW1wX2luaXQoKTsKKwkJLyogU2V0dXAgc3lzdGVtIHBhcmFtZXRlcnMgaW50ZXJmYWNlICovCisJCW9wYWxfc3lzX3BhcmFtX2luaXQoKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKaW5kZXggMTEwZjRmYi4uNjFjZjhmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpAQCAtMTg4LDYgKzE4Nyw3IEBACiAJcHBjX21kLnBvd2VyX29mZiA9IHBudl9wb3dlcl9vZmY7CiAJcHBjX21kLmhhbHQgPSBwbnZfaGFsdDsKIAlwcGNfbWQubWFjaGluZV9jaGVja19leGNlcHRpb24gPSBvcGFsX21hY2hpbmVfY2hlY2s7CisJcHBjX21kLm1jZV9jaGVja19lYXJseV9yZWNvdmVyeSA9IG9wYWxfbWNlX2NoZWNrX2Vhcmx5X3JlY292ZXJ5OwogfQogCiAjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WX1JUQVMKQEAgLTIyNSwxNiArMjI1LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZCBwb3dlcm52X2lkbGUodm9pZCkKLXsKLQkvKiBIb29rIHRvIGNwdWlkbGUgZnJhbWV3b3JrIGlmIGF2YWlsYWJsZSwgZWxzZQotCSAqIGNhbGwgb24gZGVmYXVsdCBwbGF0Zm9ybSBpZGxlIGNvZGUKLQkgKi8KLQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkgewotCQlwb3dlcjdfaWRsZSgpOwotCX0KLX0KLQogZGVmaW5lX21hY2hpbmUocG93ZXJudikgewogCS5uYW1lCQkJPSAiUG93ZXJOViIsCiAJLnByb2JlCQkJPSBwbnZfcHJvYmUsCkBAIC0yNDQsNyArMjM0LDcgQEAKIAkuc2hvd19jcHVpbmZvCQk9IHBudl9zaG93X2NwdWluZm8sCiAJLnByb2dyZXNzCQk9IHBudl9wcm9ncmVzcywKIAkubWFjaGluZV9zaHV0ZG93bgk9IHBudl9zaHV0ZG93biwKLQkucG93ZXJfc2F2ZSAgICAgICAgICAgICA9IHBvd2VybnZfaWRsZSwKKwkucG93ZXJfc2F2ZSAgICAgICAgICAgICA9IHBvd2VyN19pZGxlLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5kbWFfc2V0X21hc2sJCT0gcG52X2RtYV9zZXRfbWFzaywKICNpZmRlZiBDT05GSUdfS0VYRUMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCmluZGV4IGU4N2MxOTQuLjU2ZjI3NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwpAQCAtMiwxMCArMiw4IEBACiAJYm9vbCAiU29ueSBQUzMiCiAJZGVwZW5kcyBvbiBQUEM2NCAmJiBQUENfQk9PSzNTCiAJc2VsZWN0IFBQQ19DRUxMCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IFVTQl9PSENJX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgVVNCX09IQ0lfQklHX0VORElBTl9NTUlPCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTwogCXNlbGVjdCBQUENfUENJX0NIT0lDRQogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKaW5kZXggNGIzNTE2Ni4uYjM1OGJlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAogCQlCVUlMRF9CVUdfT04oUFBDX01TR19DQUxMX0ZVTkNUSU9OICAgICE9IDApOwogCQlCVUlMRF9CVUdfT04oUFBDX01TR19SRVNDSEVEVUxFICAgICAgICE9IDEpOwotCQlCVUlMRF9CVUdfT04oUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFICE9IDIpOworCQlCVUlMRF9CVUdfT04oUFBDX01TR19USUNLX0JST0FEQ0FTVCAgICE9IDIpOwogCQlCVUlMRF9CVUdfT04oUFBDX01TR19ERUJVR0dFUl9CUkVBSyAgICE9IDMpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBNU0dfQ09VTlQ7IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwppbmRleCA4MGIxZDU3Li4yY2I4Yjc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwpAQCAtMTExLDYgKzExMSwxOCBAQAogCSAgd2lsbCBiZSByZXVzZWQgZm9yIG90aGVyIExQQVJzLiBUaGUgaW50ZXJmYWNlIGFsbG93cyBmaXJtd2FyZSB0bwogCSAgYmFsYW5jZSBtZW1vcnkgYWNyb3NzIG1hbnkgTFBBUnMuCiAKK2NvbmZpZyBIVl9QRVJGX0NUUlMKKyAgICAgICBib29sICJIeXBlcnZpc29yIHN1cHBsaWVkIFBNVSBldmVudHMgKDI0eDcgJiBHUENJKSIKKyAgICAgICBkZWZhdWx0IHkKKyAgICAgICBkZXBlbmRzIG9uIFBFUkZfRVZFTlRTICYmIFBQQ19QU0VSSUVTCisgICAgICAgaGVscAorCSAgRW5hYmxlIGFjY2VzcyB0byBoeXBlcnZpc29yIHN1cHBsaWVkIGNvdW50ZXJzIGluIHBlcmYuIEN1cnJlbnRseSwKKwkgIHRoaXMgZW5hYmxlcyBjb2RlIHRoYXQgdXNlcyB0aGUgaGNhbGwgR2V0UGVyZkNvdW50ZXJJbmZvIGFuZCAyNHg3CisJICBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIGNvdW50ZXJzLiBHUENJIGV4aXN0cyBvbiBQb3dlciA2IGFuZCBsYXRlcgorCSAgc3lzdGVtcy4gMjR4NyBpcyBhdmFpbGFibGUgb24gUG93ZXIgOCBzeXN0ZW1zLgorCisgICAgICAgICAgSWYgdW5zdXJlLCBzZWxlY3QgWS4KKwogY29uZmlnIERUTAogCWJvb2wgIkRpc3BhdGNoIFRyYWNlIExvZyIKIAlkZXBlbmRzIG9uIFBQQ19TUExQQVIgJiYgREVCVUdfRlMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKaW5kZXggMGVhOTllMy4uOWI4ZTA1MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKQEAgLTQyMCw0ICs0MjAsNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci1hcmNoX2luaXRjYWxsKHBzZXJpZXNfY3B1X2hvdHBsdWdfaW5pdCk7CittYWNoaW5lX2FyY2hfaW5pdGNhbGwocHNlcmllcywgcHNlcmllc19jcHVfaG90cGx1Z19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMKaW5kZXggOTU5MGRiYi4uNTczYjQ4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTc1LDUwICs3NiwxMyBAQAogfQogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkUKLXN0YXRpYyBpbnQgcHNlcmllc19yZW1vdmVfbWVtYmxvY2sodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBpbnQgbWVtYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgcHNlcmllc19yZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCwgc3RhcnRfcGZuOwotCXN0cnVjdCB6b25lICp6b25lOwogCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBzZWN0aW9uOwotCXVuc2lnbmVkIGxvbmcgc2VjdGlvbnNfdG9fcmVtb3ZlOwogCi0Jc3RhcnRfcGZuID0gYmFzZSA+PiBQQUdFX1NISUZUOwotCi0JaWYgKCFwZm5fdmFsaWQoc3RhcnRfcGZuKSkgewotCQltZW1ibG9ja19yZW1vdmUoYmFzZSwgbWVtYmxvY2tfc2l6ZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXpvbmUgPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSk7Ci0KLQkvKgotCSAqIFJlbW92ZSBzZWN0aW9uIG1hcHBpbmdzIGFuZCBzeXNmcyBlbnRyaWVzIGZvciB0aGUKLQkgKiBzZWN0aW9uIG9mIHRoZSBtZW1vcnkgd2UgYXJlIHJlbW92aW5nLgotCSAqCi0JICogTk9URTogSWRlYWxseSwgdGhpcyBzaG91bGQgYmUgZG9uZSBpbiBnZW5lcmljIGNvZGUgbGlrZQotCSAqIHJlbW92ZV9tZW1vcnkoKS4gQnV0IHJlbW92ZV9tZW1vcnkoKSBnZXRzIGNhbGxlZCBieSB3cml0aW5nCi0JICogdG8gc3lzZnMgInN0YXRlIiBmaWxlIGFuZCB3ZSBjYW4ndCByZW1vdmUgc3lzZnMgZW50cmllcwotCSAqIHdoaWxlIHdyaXRpbmcgdG8gaXQuIFNvIHdlIGhhdmUgdG8gZGVmZXIgaXQgdG8gaGVyZS4KLQkgKi8KLQlzZWN0aW9uc190b19yZW1vdmUgPSAobWVtYmxvY2tfc2l6ZSA+PiBQQUdFX1NISUZUKSAvIFBBR0VTX1BFUl9TRUNUSU9OOwotCWZvciAoc2VjdGlvbiA9IDA7IHNlY3Rpb24gPCBzZWN0aW9uc190b19yZW1vdmU7IHNlY3Rpb24rKykgewotCQl1bnNpZ25lZCBsb25nIHBmbiA9IHN0YXJ0X3BmbiArIHNlY3Rpb24gKiBQQUdFU19QRVJfU0VDVElPTjsKLQkJcmV0ID0gX19yZW1vdmVfcGFnZXMoem9uZSwgcGZuLCBQQUdFU19QRVJfU0VDVElPTik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qCi0JICogVXBkYXRlIG1lbW9yeSByZWdpb25zIGZvciBtZW1vcnkgcmVtb3ZlCi0JICovCi0JbWVtYmxvY2tfcmVtb3ZlKGJhc2UsIG1lbWJsb2NrX3NpemUpOwotCi0JLyoKLQkgKiBSZW1vdmUgaHRhYiBib2x0ZWQgbWFwcGluZ3MgZm9yIHRoaXMgc2VjdGlvbiBvZiBtZW1vcnkKLQkgKi8KLQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoYmFzZSk7Ci0JcmV0ID0gcmVtb3ZlX3NlY3Rpb25fbWFwcGluZyhzdGFydCwgc3RhcnQgKyBtZW1ibG9ja19zaXplKTsKKwkvKiBSZW1vdmUgaHRhYiBib2x0ZWQgbWFwcGluZ3MgZm9yIHRoaXMgc2VjdGlvbiBvZiBtZW1vcnkgKi8KKwlzdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoc3RhcnQpOworCXJldCA9IHJlbW92ZV9zZWN0aW9uX21hcHBpbmcoc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7CiAKIAkvKiBFbnN1cmUgYWxsIHZtYWxsb2MgbWFwcGluZ3MgYXJlIGZsdXNoZWQgaW4gY2FzZSB0aGV5IGFsc28KIAkgKiBoaXQgdGhhdCBzZWN0aW9uIG9mIG1lbW9yeQpAQCAtMTI4LDcgKzkyLDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwc2VyaWVzX3JlbW92ZV9tZW1vcnkoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBpbnQgcHNlcmllc19yZW1vdmVfbWVtYmxvY2sodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBpbnQgbWVtYmxvY2tfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2NrX3N6LCBzdGFydF9wZm47CisJaW50IHNlY3Rpb25zX3Blcl9ibG9jazsKKwlpbnQgaSwgbmlkOworCisJc3RhcnRfcGZuID0gYmFzZSA+PiBQQUdFX1NISUZUOworCisJaWYgKCFwZm5fdmFsaWQoc3RhcnRfcGZuKSkgeworCQltZW1ibG9ja19yZW1vdmUoYmFzZSwgbWVtYmxvY2tfc2l6ZSk7CisJCXJldHVybiAwOworCX0KKworCWJsb2NrX3N6ID0gbWVtb3J5X2Jsb2NrX3NpemVfYnl0ZXMoKTsKKwlzZWN0aW9uc19wZXJfYmxvY2sgPSBibG9ja19zeiAvIE1JTl9NRU1PUllfQkxPQ0tfU0laRTsKKwluaWQgPSBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZChiYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBzZWN0aW9uc19wZXJfYmxvY2s7IGkrKykgeworCQlyZW1vdmVfbWVtb3J5KG5pZCwgYmFzZSwgTUlOX01FTU9SWV9CTE9DS19TSVpFKTsKKwkJYmFzZSArPSBNSU5fTUVNT1JZX0JMT0NLX1NJWkU7CisJfQorCisJLyogVXBkYXRlIG1lbW9yeSByZWdpb25zIGZvciBtZW1vcnkgcmVtb3ZlICovCisJbWVtYmxvY2tfcmVtb3ZlKGJhc2UsIG1lbWJsb2NrX3NpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzZXJpZXNfcmVtb3ZlX21lbV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJY29uc3QgY2hhciAqdHlwZTsKIAljb25zdCB1bnNpZ25lZCBpbnQgKnJlZ3M7CkBAIC0xNTMsOCArMTQ0LDggQEAKIAliYXNlID0gKih1bnNpZ25lZCBsb25nICopcmVnczsKIAlsbWJfc2l6ZSA9IHJlZ3NbM107CiAKLQlyZXQgPSBwc2VyaWVzX3JlbW92ZV9tZW1ibG9jayhiYXNlLCBsbWJfc2l6ZSk7Ci0JcmV0dXJuIHJldDsKKwlwc2VyaWVzX3JlbW92ZV9tZW1ibG9jayhiYXNlLCBsbWJfc2l6ZSk7CisJcmV0dXJuIDA7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgcHNlcmllc19yZW1vdmVfbWVtYmxvY2sodW5zaWduZWQgbG9uZyBiYXNlLApAQCAtMTYyLDEzICsxNTMsMTMgQEAKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBwc2VyaWVzX3JlbW92ZV9tZW1vcnkoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBpbmxpbmUgaW50IHBzZXJpZXNfcmVtb3ZlX21lbV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovCiAKLXN0YXRpYyBpbnQgcHNlcmllc19hZGRfbWVtb3J5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgaW50IHBzZXJpZXNfYWRkX21lbV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJY29uc3QgY2hhciAqdHlwZTsKIAljb25zdCB1bnNpZ25lZCBpbnQgKnJlZ3M7CkBAIC0yNTQsMTAgKzI0NSwxMCBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIE9GX1JFQ09ORklHX0FUVEFDSF9OT0RFOgotCQllcnIgPSBwc2VyaWVzX2FkZF9tZW1vcnkobm9kZSk7CisJCWVyciA9IHBzZXJpZXNfYWRkX21lbV9ub2RlKG5vZGUpOwogCQlicmVhazsKIAljYXNlIE9GX1JFQ09ORklHX0RFVEFDSF9OT0RFOgotCQllcnIgPSBwc2VyaWVzX3JlbW92ZV9tZW1vcnkobm9kZSk7CisJCWVyciA9IHBzZXJpZXNfcmVtb3ZlX21lbV9ub2RlKG5vZGUpOwogCQlicmVhazsKIAljYXNlIE9GX1JFQ09ORklHX1VQREFURV9QUk9QRVJUWToKIAkJcHIgPSAoc3RydWN0IG9mX3Byb3BfcmVjb25maWcgKilub2RlOwpAQCAtMjc3LDYgKzI2OCwxMCBAQAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQogCQlvZl9yZWNvbmZpZ19ub3RpZmllcl9yZWdpc3RlcigmcHNlcmllc19tZW1fbmIpOwogCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkUKKwlwcGNfbWQucmVtb3ZlX21lbW9yeSA9IHBzZXJpZXNfcmVtb3ZlX21lbW9yeTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiBtYWNoaW5lX2RldmljZV9pbml0Y2FsbChwc2VyaWVzLCBwc2VyaWVzX21lbW9yeV9ob3RwbHVnX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21vYmlsaXR5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYwppbmRleCBjZGU0ZTBhLi5iZGU3ZWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYwpAQCAtMjkwLDEzICsyOTAsNiBAQAogCWludCByYzsKIAlpbnQgYWN0aXZhdGVfZndfdG9rZW47CiAKLQlyYyA9IHBzZXJpZXNfZGV2aWNldHJlZV91cGRhdGUoTUlHUkFUSU9OX1NDT1BFKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbml0aWFsIHBvc3QtbW9iaWxpdHkgZGV2aWNlIHRyZWUgdXBkYXRlICIKLQkJICAgICAgICJmYWlsZWQ6ICVkXG4iLCByYyk7Ci0JCXJldHVybjsKLQl9Ci0KIAlhY3RpdmF0ZV9md190b2tlbiA9IHJ0YXNfdG9rZW4oImlibSxhY3RpdmF0ZS1maXJtd2FyZSIpOwogCWlmIChhY3RpdmF0ZV9md190b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBtYWtlIHBvc3QtbW9iaWxpdHkgIgpAQCAtMzA0LDE2ICsyOTcsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJjID0gcnRhc19jYWxsKGFjdGl2YXRlX2Z3X3Rva2VuLCAwLCAxLCBOVUxMKTsKLQlpZiAoIXJjKSB7Ci0JCXJjID0gcHNlcmllc19kZXZpY2V0cmVlX3VwZGF0ZShNSUdSQVRJT05fU0NPUEUpOwotCQlpZiAocmMpCi0JCQlwcmludGsoS0VSTl9FUlIgIlNlY29uZGFyeSBwb3N0LW1vYmlsaXR5IGRldmljZSB0cmVlICIKLQkJCSAgICAgICAidXBkYXRlIGZhaWxlZDogJWRcbiIsIHJjKTsKLQl9IGVsc2UgeworCWRvIHsKKwkJcmMgPSBydGFzX2NhbGwoYWN0aXZhdGVfZndfdG9rZW4sIDAsIDEsIE5VTEwpOworCX0gd2hpbGUgKHJ0YXNfYnVzeV9kZWxheShyYykpOworCisJaWYgKHJjKQogCQlwcmludGsoS0VSTl9FUlIgIlBvc3QtbW9iaWxpdHkgYWN0aXZhdGUtZncgZmFpbGVkOiAlZFxuIiwgcmMpOwotCQlyZXR1cm47Ci0JfQorCisJcmMgPSBwc2VyaWVzX2RldmljZXRyZWVfdXBkYXRlKE1JR1JBVElPTl9TQ09QRSk7CisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9FUlIgIlBvc3QtbW9iaWxpdHkgZGV2aWNlIHRyZWUgdXBkYXRlICIKKwkJCSJmYWlsZWQ6ICVkXG4iLCByYyk7CiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKaW5kZXggZWZlNjEzNy4uMjAzY2JmMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwpAQCAtMzcsMTUgKzM3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBwY2lfYnVzICpjaGlsZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBwY2lfYnVzICp0bXA7CiAJc3RydWN0IGRldmljZV9ub2RlICpidXNkbjsKIAogCWJ1c2RuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CiAJaWYgKGJ1c2RuID09IGRuKQogCQlyZXR1cm4gYnVzOwogCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7Ci0JCWNoaWxkID0gZmluZF9idXNfYW1vbmdfY2hpbGRyZW4ocGNpX2J1c19iKHRtcCksIGRuKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJ1cy0+Y2hpbGRyZW4sIG5vZGUpIHsKKwkJY2hpbGQgPSBmaW5kX2J1c19hbW9uZ19jaGlsZHJlbih0bXAsIGRuKTsKIAkJaWYgKGNoaWxkKQogCQkJYnJlYWs7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKaW5kZXggOTcyZGYwZmYuLjJkYjhjYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKQEAgLTM1NiwyOSArMzU1LDI0IEBACiAKIHN0YXRpYyB2b2lkIHBzZXJpZXNfbHBhcl9pZGxlKHZvaWQpCiB7Ci0JLyogVGhpcyB3b3VsZCBjYWxsIG9uIHRoZSBjcHVpZGxlIGZyYW1ld29yaywgYW5kIHRoZSBiYWNrLWVuZCBwc2VyaWVzCi0JICogZHJpdmVyIHRvICBnbyB0byBpZGxlIHN0YXRlcworCS8qCisJICogRGVmYXVsdCBoYW5kbGVyIHRvIGdvIGludG8gbG93IHRocmVhZCBwcmlvcml0eSBhbmQgcG9zc2libHkKKwkgKiBsb3cgcG93ZXIgbW9kZSBieSBjZWRlaW5nIHByb2Nlc3NvciB0byBoeXBlcnZpc29yCiAJICovCi0JaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpIHsKLQkJLyogT24gZXJyb3IsIGV4ZWN1dGUgZGVmYXVsdCBoYW5kbGVyCi0JCSAqIHRvIGdvIGludG8gbG93IHRocmVhZCBwcmlvcml0eSBhbmQgcG9zc2libHkKLQkJICogbG93IHBvd2VyIG1vZGUgYnkgY2VkZWluZyBwcm9jZXNzb3IgdG8gaHlwZXJ2aXNvcgotCQkgKi8KIAotCQkvKiBJbmRpY2F0ZSB0byBoeXBlcnZpc29yIHRoYXQgd2UgYXJlIGlkbGUuICovCi0JCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CisJLyogSW5kaWNhdGUgdG8gaHlwZXJ2aXNvciB0aGF0IHdlIGFyZSBpZGxlLiAqLworCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CiAKLQkJLyoKLQkJICogWWllbGQgdGhlIHByb2Nlc3NvciB0byB0aGUgaHlwZXJ2aXNvci4gIFdlIHJldHVybiBpZgotCQkgKiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgb2NjdXJzICh3aGljaCBhcmUgZHJpdmVuIHByaW9yCi0JCSAqIHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlcgotCQkgKiBwcm9jZXNzb3IuIFdoZW4gcmV0dXJuaW5nIGhlcmUsIGV4dGVybmFsIGludGVycnVwdHMKLQkJICogYXJlIGVuYWJsZWQuCi0JCSAqLwotCQljZWRlX3Byb2Nlc3NvcigpOworCS8qCisJICogWWllbGQgdGhlIHByb2Nlc3NvciB0byB0aGUgaHlwZXJ2aXNvci4gIFdlIHJldHVybiBpZgorCSAqIGFuIGV4dGVybmFsIGludGVycnVwdCBvY2N1cnMgKHdoaWNoIGFyZSBkcml2ZW4gcHJpb3IKKwkgKiB0byByZXR1cm5pbmcgaGVyZSkgb3IgaWYgYSBwcm9kIG9jY3VycyBmcm9tIGFub3RoZXIKKwkgKiBwcm9jZXNzb3IuIFdoZW4gcmV0dXJuaW5nIGhlcmUsIGV4dGVybmFsIGludGVycnVwdHMKKwkgKiBhcmUgZW5hYmxlZC4KKwkgKi8KKwljZWRlX3Byb2Nlc3NvcigpOwogCi0JCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7Ci0JfQorCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYwppbmRleCAxNmEyNTUyLi5iODdiOTc4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zdXNwZW5kLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KICNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KKyNpbmNsdWRlICIuLi8uLi9rZXJuZWwvY2FjaGVpbmZvLmgiCiAKIHN0YXRpYyB1NjQgc3RyZWFtX2lkOwogc3RhdGljIHN0cnVjdCBkZXZpY2Ugc3VzcGVuZF9kZXY7CkBAIC03OSw2ICs4MCwyMyBAQAogfQogCiAvKioKKyAqIHBzZXJpZXNfc3VzcGVuZF9lbmFibGVfaXJxcworICoKKyAqIFBvc3Qgc3VzcGVuZCBjb25maWd1cmF0aW9uIHVwZGF0ZXMKKyAqCisgKiovCitzdGF0aWMgdm9pZCBwc2VyaWVzX3N1c3BlbmRfZW5hYmxlX2lycXModm9pZCkKK3sKKwkvKgorCSAqIFVwZGF0ZSBjb25maWd1cmF0aW9uIHdoaWNoIGNhbiBiZSBtb2RpZmllZCBiYXNlZCBvbiBkZXZpY2UgdHJlZQorCSAqIGNoYW5nZXMgZHVyaW5nIHJlc3VtZS4KKwkgKi8KKwljYWNoZWluZm9fY3B1X29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwb3N0X21vYmlsaXR5X2ZpeHVwKCk7CisJY2FjaGVpbmZvX2NwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworLyoqCiAgKiBwc2VyaWVzX3N1c3BlbmRfZW50ZXIgLSBGaW5hbCBwaGFzZSBvZiBoaWJlcm5hdGlvbgogICoKICAqIFJldHVybiB2YWx1ZToKQEAgLTE3NCw3ICsxOTIsMzAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihoaWJlcm5hdGUsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2hpYmVybmF0ZSk7CisjZGVmaW5lIFVTRVJfRFRfVVBEQVRFCTAKKyNkZWZpbmUgS0VSTl9EVF9VUERBVEUJMQorCisvKioKKyAqIHNob3dfaGliZXJuYXRlIC0gUmVwb3J0IGRldmljZSB0cmVlIHVwZGF0ZSByZXNwb25zaWJpbHR5CisgKiBAZGV2OgkJc3Vic3lzIHJvb3QgZGV2aWNlCisgKiBAYXR0cjoJCWRldmljZSBhdHRyaWJ1dGUgc3RydWN0CisgKiBAYnVmOgkJYnVmZmVyCisgKgorICogUmVwb3J0IHdoZXRoZXIgYSBkZXZpY2UgdHJlZSB1cGRhdGUgaXMgcGVyZm9ybWVkIGJ5IHRoZSBrZXJuZWwgYWZ0ZXIgYQorICogcmVzdW1lLCBvciBpZiBkcm1nciBtdXN0IGNvb3JkaW5hdGUgdGhlIHVwZGF0ZSBmcm9tIHVzZXIgc3BhY2UuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCBpZiBkcm1nciBpcyB0byBpbml0aWF0ZSB1cGRhdGUsIGFuZCAxIG90aGVyd2lzZQorICoqLworc3RhdGljIHNzaXplX3Qgc2hvd19oaWJlcm5hdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEtFUk5fRFRfVVBEQVRFKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGhpYmVybmF0ZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfaGliZXJuYXRlLCBzdG9yZV9oaWJlcm5hdGUpOwogCiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIHN1c3BlbmRfc3Vic3lzID0gewogCS5uYW1lID0gInBvd2VyIiwKQEAgLTIzNSw2ICsyNzYsNyBAQAogCQlyZXR1cm4gcmM7CiAKIAlwcGNfbWQuc3VzcGVuZF9kaXNhYmxlX2NwdSA9IHBzZXJpZXNfc3VzcGVuZF9jcHU7CisJcHBjX21kLnN1c3BlbmRfZW5hYmxlX2lycXMgPSBwc2VyaWVzX3N1c3BlbmRfZW5hYmxlX2lycXM7CiAJc3VzcGVuZF9zZXRfb3BzKCZwc2VyaWVzX3N1c3BlbmRfb3BzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IGY2N2FjOTAuLmFmYmNjMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtMjEsNyArMjEsNiBAQAogb2JqLSQoQ09ORklHX0ZTTF9QQ0kpCQkrPSBmc2xfcGNpLm8gJChmc2wtbXNpLW9iai15KQogb2JqLSQoQ09ORklHX0ZTTF9QTUMpCQkrPSBmc2xfcG1jLm8KIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCi1vYmotJChDT05GSUdfRlNMX0lGQykJCSs9IGZzbF9pZmMubwogb2JqLSQoQ09ORklHX0ZTTF9HVE0pCQkrPSBmc2xfZ3RtLm8KIG9iai0kKENPTkZJR19GU0xfODVYWF9DQUNIRV9TUkFNKQkrPSBmc2xfODV4eF9sMmN0bHIubyBmc2xfODV4eF9jYWNoZV9zcmFtLm8KIG9iai0kKENPTkZJR19TSU1QTEVfR1BJTykJKz0gc2ltcGxlX2dwaW8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9laHZfcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Vodl9waWMuYwppbmRleCBiNzQwODVjLi4yZDIwZjEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2Vodl9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Vodl9waWMuYwpAQCAtMjgsOCArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9laHZfcGljLmg+CiAjaW5jbHVkZSA8YXNtL2ZzbF9oY2FsbHMuaD4KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2tlcm5lbC9pcnEvc2V0dGluZ3MuaCIKLQogc3RhdGljIHN0cnVjdCBlaHZfcGljICpnbG9iYWxfZWh2X3BpYzsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWh2X3BpY19sb2NrKTsKIApAQCAtMTEzLDE3ICsxMTEsMTMgQEAKIGludCBlaHZfcGljX3NldF9pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCiB7CiAJdW5zaWduZWQgaW50IHNyYyA9IHZpcnFfdG9faHcoZC0+aXJxKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhkLT5pcnEpOwogCXVuc2lnbmVkIGludCB2ZWNwcmksIHZvbGQsIHZuZXcsIHByaW8sIGNwdV9kZXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoZmxvd190eXBlID09IElSUV9UWVBFX05PTkUpCiAJCWZsb3dfdHlwZSA9IElSUV9UWVBFX0xFVkVMX0xPVzsKIAotCWlycV9zZXR0aW5nc19jbHJfbGV2ZWwoZGVzYyk7Ci0JaXJxX3NldHRpbmdzX3NldF90cmlnZ2VyX21hc2soZGVzYywgZmxvd190eXBlKTsKLQlpZiAoZmxvd190eXBlICYgKElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKQotCQlpcnFfc2V0dGluZ3Nfc2V0X2xldmVsKGRlc2MpOworCWlycWRfc2V0X3RyaWdnZXJfdHlwZShkLCBmbG93X3R5cGUpOwogCiAJdmVjcHJpID0gZWh2X3BpY190eXBlX3RvX3ZlY3ByaShmbG93X3R5cGUpOwogCkBAIC0xNDQsNyArMTM4LDcgQEAKIAlldl9pbnRfc2V0X2NvbmZpZyhzcmMsIHZlY3ByaSwgcHJpbywgY3B1X2Rlc3QpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWh2X3BpY19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIElSUV9TRVRfTUFTS19PS19OT0NPUFk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZWh2X3BpY19pcnFfY2hpcCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2lmYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfaWZjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzg4NWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfaWZjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKLSAqCi0gKiBGcmVlc2NhbGUgSW50ZWdyYXRlZCBGbGFzaCBDb250cm9sbGVyCi0gKgotICogQXV0aG9yOiBEaXBlbiBEdWRoYXQgPERpcGVuLkR1ZGhhdEBmcmVlc2NhbGUuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2ZzbF9pZmMuaD4KLQotc3RydWN0IGZzbF9pZmNfY3RybCAqZnNsX2lmY19jdHJsX2RldjsKLUVYUE9SVF9TWU1CT0woZnNsX2lmY19jdHJsX2Rldik7Ci0KLS8qCi0gKiBjb252ZXJ0X2lmY19hZGRyZXNzIC0gY29udmVydCB0aGUgYmFzZSBhZGRyZXNzCi0gKiBAYWRkcl9iYXNlOgliYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBiYW5rCi0gKi8KLXVuc2lnbmVkIGludCBjb252ZXJ0X2lmY19hZGRyZXNzKHBoeXNfYWRkcl90IGFkZHJfYmFzZSkKLXsKLQlyZXR1cm4gYWRkcl9iYXNlICYgQ1NQUl9CQTsKLX0KLUVYUE9SVF9TWU1CT0woY29udmVydF9pZmNfYWRkcmVzcyk7Ci0KLS8qCi0gKiBmc2xfaWZjX2ZpbmQgLSBmaW5kIElGQyBiYW5rCi0gKiBAYWRkcl9iYXNlOgliYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBiYW5rCi0gKgotICogVGhpcyBmdW5jdGlvbiB3YWxrcyBJRkMgYmFua3MgY29tcGFyaW5nICJCYXNlIGFkZHJlc3MiIGZpZWxkIG9mIHRoZSBDU1BSCi0gKiByZWdpc3RlcnMgd2l0aCB0aGUgc3VwcGxpZWQgYWRkcl9iYXNlIGFyZ3VtZW50LiBXaGVuIGJhc2VzIG1hdGNoIHRoaXMKLSAqIGZ1bmN0aW9uIHJldHVybnMgYmFuayBudW1iZXIgKHN0YXJ0aW5nIHdpdGggMCksIG90aGVyd2lzZSBpdCByZXR1cm5zCi0gKiBhcHByb3ByaWF0ZSBlcnJubyB2YWx1ZS4KLSAqLwotaW50IGZzbF9pZmNfZmluZChwaHlzX2FkZHJfdCBhZGRyX2Jhc2UpCi17Ci0JaW50IGkgPSAwOwotCi0JaWYgKCFmc2xfaWZjX2N0cmxfZGV2IHx8ICFmc2xfaWZjX2N0cmxfZGV2LT5yZWdzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzbF9pZmNfY3RybF9kZXYtPnJlZ3MtPmNzcHJfY3MpOyBpKyspIHsKLQkJdTMyIGNzcHIgPSBpbl9iZTMyKCZmc2xfaWZjX2N0cmxfZGV2LT5yZWdzLT5jc3ByX2NzW2ldLmNzcHIpOwotCQlpZiAoY3NwciAmIENTUFJfViAmJiAoY3NwciAmIENTUFJfQkEpID09Ci0JCQkJY29udmVydF9pZmNfYWRkcmVzcyhhZGRyX2Jhc2UpKQotCQkJcmV0dXJuIGk7Ci0JfQotCi0JcmV0dXJuIC1FTk9FTlQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGZzbF9pZmNfZmluZCk7Ci0KLXN0YXRpYyBpbnQgZnNsX2lmY19jdHJsX2luaXQoc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCkKLXsKLQlzdHJ1Y3QgZnNsX2lmY19yZWdzIF9faW9tZW0gKmlmYyA9IGN0cmwtPnJlZ3M7Ci0KLQkvKgotCSAqIENsZWFyIGFsbCB0aGUgY29tbW9uIHN0YXR1cyBhbmQgZXZlbnQgcmVnaXN0ZXJzCi0JICovCi0JaWYgKGluX2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCkgJiBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKQotCQlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0LCBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKTsKLQotCS8qIGVuYWJsZSBhbGwgZXJyb3IgYW5kIGV2ZW50cyAqLwotCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX2VuLCBJRkNfQ01fRVZURVJfRU5fQ1NFUkVOKTsKLQotCS8qIGVuYWJsZSBhbGwgZXJyb3IgYW5kIGV2ZW50IGludGVycnVwdHMgKi8KLQlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9pbnRyX2VuLCBJRkNfQ01fRVZURVJfSU5UUl9FTl9DU0VSSVJFTik7Ci0Jb3V0X2JlMzIoJmlmYy0+Y21fZXJhdHRyMCwgMHgwKTsKLQlvdXRfYmUzMigmaWZjLT5jbV9lcmF0dHIxLCAweDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2lmY19jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOwotCi0JZnJlZV9pcnEoY3RybC0+bmFuZF9pcnEsIGN0cmwpOwotCWZyZWVfaXJxKGN0cmwtPmlycSwgY3RybCk7Ci0KLQlpcnFfZGlzcG9zZV9tYXBwaW5nKGN0cmwtPm5hbmRfaXJxKTsKLQlpcnFfZGlzcG9zZV9tYXBwaW5nKGN0cmwtPmlycSk7Ci0KLQlpb3VubWFwKGN0cmwtPnJlZ3MpOwotCi0JZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7Ci0Ja2ZyZWUoY3RybCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIE5BTkQgZXZlbnRzIGFyZSBzcGxpdCBiZXR3ZWVuIGFuIG9wZXJhdGlvbmFsIGludGVycnVwdCB3aGljaCBvbmx5Ci0gKiByZWNlaXZlcyBPUEMsIGFuZCBhbiBlcnJvciBpbnRlcnJ1cHQgdGhhdCByZWNlaXZlcyBldmVyeXRoaW5nIGVsc2UsCi0gKiBpbmNsdWRpbmcgbm9uLU5BTkQgZXJyb3JzLiAgV2hpY2hldmVyIGludGVycnVwdCBnZXRzIHRvIGl0IGZpcnN0Ci0gKiByZWNvcmRzIHRoZSBzdGF0dXMgYW5kIHdha2VzIHRoZSB3YWl0IHF1ZXVlLgotICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5hbmRfaXJxX2xvY2spOwotCi1zdGF0aWMgdTMyIGNoZWNrX25hbmRfc3RhdChzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsKQotewotCXN0cnVjdCBmc2xfaWZjX3JlZ3MgX19pb21lbSAqaWZjID0gY3RybC0+cmVnczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBzdGF0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5hbmRfaXJxX2xvY2ssIGZsYWdzKTsKLQotCXN0YXQgPSBpbl9iZTMyKCZpZmMtPmlmY19uYW5kLm5hbmRfZXZ0ZXJfc3RhdCk7Ci0JaWYgKHN0YXQpIHsKLQkJb3V0X2JlMzIoJmlmYy0+aWZjX25hbmQubmFuZF9ldnRlcl9zdGF0LCBzdGF0KTsKLQkJY3RybC0+bmFuZF9zdGF0ID0gc3RhdDsKLQkJd2FrZV91cCgmY3RybC0+bmFuZF93YWl0KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYW5kX2lycV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gc3RhdDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGZzbF9pZmNfbmFuZF9pcnEoaW50IGlycW5vLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBmc2xfaWZjX2N0cmwgKmN0cmwgPSBkYXRhOwotCi0JaWYgKGNoZWNrX25hbmRfc3RhdChjdHJsKSkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JcmV0dXJuIElSUV9OT05FOwotfQotCi0vKgotICogTk9URTogVGhpcyBpbnRlcnJ1cHQgaXMgdXNlZCB0byByZXBvcnQgaWZjIGV2ZW50cyBvZiB2YXJpb3VzIGtpbmRzLAotICogc3VjaCBhcyB0cmFuc2FjdGlvbiBlcnJvcnMgb24gdGhlIGNoaXBzZWxlY3RzLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2lmY19jdHJsX2lycShpbnQgaXJxbm8sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRhdGE7Ci0Jc3RydWN0IGZzbF9pZmNfcmVncyBfX2lvbWVtICppZmMgPSBjdHJsLT5yZWdzOwotCXUzMiBlcnJfYXhpaWQsIGVycl9zcmNpZCwgc3RhdHVzLCBjc19lcnIsIGVycl9hZGRyOwotCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwotCi0JLyogcmVhZCBmb3IgY2hpcCBzZWxlY3QgZXJyb3IgKi8KLQljc19lcnIgPSBpbl9iZTMyKCZpZmMtPmNtX2V2dGVyX3N0YXQpOwotCWlmIChjc19lcnIpIHsKLQkJZGV2X2VycihjdHJsLT5kZXYsICJ0cmFuc2FjdGlvbiBzZW50IHRvIElGQyBpcyBub3QgbWFwcGVkIHRvIgotCQkJCSJhbnkgbWVtb3J5IGJhbmsgMHglMDhYXG4iLCBjc19lcnIpOwotCQkvKiBjbGVhciB0aGUgY2hpcCBzZWxlY3QgZXJyb3IgKi8KLQkJb3V0X2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCwgSUZDX0NNX0VWVEVSX1NUQVRfQ1NFUik7Ci0KLQkJLyogcmVhZCBlcnJvciBhdHRyaWJ1dGUgcmVnaXN0ZXJzIHByaW50IHRoZSBlcnJvciBpbmZvcm1hdGlvbiAqLwotCQlzdGF0dXMgPSBpbl9iZTMyKCZpZmMtPmNtX2VyYXR0cjApOwotCQllcnJfYWRkciA9IGluX2JlMzIoJmlmYy0+Y21fZXJhdHRyMSk7Ci0KLQkJaWYgKHN0YXR1cyAmIElGQ19DTV9FUkFUVFIwX0VSVFlQX1JFQUQpCi0JCQlkZXZfZXJyKGN0cmwtPmRldiwgIlJlYWQgdHJhbnNhY3Rpb24gZXJyb3IiCi0JCQkJIkNNX0VSQVRUUjAgMHglMDhYXG4iLCBzdGF0dXMpOwotCQllbHNlCi0JCQlkZXZfZXJyKGN0cmwtPmRldiwgIldyaXRlIHRyYW5zYWN0aW9uIGVycm9yIgotCQkJCSJDTV9FUkFUVFIwIDB4JTA4WFxuIiwgc3RhdHVzKTsKLQotCQllcnJfYXhpaWQgPSAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVJBSUQpID4+Ci0JCQkJCUlGQ19DTV9FUkFUVFIwX0VSQUlEX1NISUZUOwotCQlkZXZfZXJyKGN0cmwtPmRldiwgIkFYSSBJRCBvZiB0aGUgZXJyb3IiCi0JCQkJCSJ0cmFuc2FjdGlvbiAweCUwOFhcbiIsIGVycl9heGlpZCk7Ci0KLQkJZXJyX3NyY2lkID0gKHN0YXR1cyAmIElGQ19DTV9FUkFUVFIwX0VTUkNJRCkgPj4KLQkJCQkJSUZDX0NNX0VSQVRUUjBfRVNSQ0lEX1NISUZUOwotCQlkZXZfZXJyKGN0cmwtPmRldiwgIlNSQyBJRCBvZiB0aGUgZXJyb3IiCi0JCQkJCSJ0cmFuc2FjdGlvbiAweCUwOFhcbiIsIGVycl9zcmNpZCk7Ci0KLQkJZGV2X2VycihjdHJsLT5kZXYsICJUcmFuc2FjdGlvbiBBZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gZXJyb3IiCi0JCQkJCSJFUkFERFIgMHglMDhYXG4iLCBlcnJfYWRkcik7Ci0KLQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGNoZWNrX25hbmRfc3RhdChjdHJsKSkKLQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogZnNsX2lmY19jdHJsX3Byb2JlCi0gKgotICogY2FsbGVkIGJ5IGRldmljZSBsYXllciB3aGVuIGl0IGZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nCi0gKiBvbmUgb3VyIGRyaXZlciBjYW4gaGFuZGxlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcyBhbGwgb2YKLSAqIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUgY29udHJvbGxlciBvbmx5LiAgVGhlCi0gKiByZXNvdXJjZXMgZm9yIHRoZSBOQU5EIGJhbmtzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZAotICogaW4gdGhlIGNoaXAgcHJvYmUgZnVuY3Rpb24uCi0qLwotc3RhdGljIGludCBmc2xfaWZjX2N0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWludCByZXQgPSAwOwotCi0KLQlkZXZfaW5mbygmZGV2LT5kZXYsICJGcmVlc2NhbGUgSW50ZWdyYXRlZCBGbGFzaCBDb250cm9sbGVyXG4iKTsKLQotCWZzbF9pZmNfY3RybF9kZXYgPSBremFsbG9jKHNpemVvZigqZnNsX2lmY19jdHJsX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghZnNsX2lmY19jdHJsX2RldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBmc2xfaWZjX2N0cmxfZGV2KTsKLQotCS8qIElPTUFQIHRoZSBlbnRpcmUgSUZDIHJlZ2lvbiAqLwotCWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MgPSBvZl9pb21hcChkZXYtPmRldi5vZl9ub2RlLCAwKTsKLQlpZiAoIWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb25cbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBnZXQgdGhlIENvbnRyb2xsZXIgbGV2ZWwgaXJxICovCi0JZnNsX2lmY19jdHJsX2Rldi0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgMCk7Ci0JaWYgKGZzbF9pZmNfY3RybF9kZXYtPmlycSA9PSBOT19JUlEpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycSByZXNvdXJjZSAiCi0JCQkJCQkJImZvciBJRkNcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBnZXQgdGhlIG5hbmQgbWFjaGluZSBpcnEgKi8KLQlmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSA9Ci0JCQlpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPmRldi5vZl9ub2RlLCAxKTsKLQotCWZzbF9pZmNfY3RybF9kZXYtPmRldiA9ICZkZXYtPmRldjsKLQotCXJldCA9IGZzbF9pZmNfY3RybF9pbml0KGZzbF9pZmNfY3RybF9kZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzbF9pZmNfY3RybF9kZXYtPm5hbmRfd2FpdCk7Ci0KLQlyZXQgPSByZXF1ZXN0X2lycShmc2xfaWZjX2N0cmxfZGV2LT5pcnEsIGZzbF9pZmNfY3RybF9pcnEsIElSUUZfU0hBUkVELAotCQkJICAiZnNsLWlmYyIsIGZzbF9pZmNfY3RybF9kZXYpOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLAotCQkJZnNsX2lmY19jdHJsX2Rldi0+aXJxKTsKLQkJZ290byBlcnJfaXJxOwotCX0KLQotCWlmIChmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSkgewotCQlyZXQgPSByZXF1ZXN0X2lycShmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSwgZnNsX2lmY19uYW5kX2lycSwKLQkJCQkwLCAiZnNsLWlmYy1uYW5kIiwgZnNsX2lmY19jdHJsX2Rldik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5zdGFsbCBpcnEgKCVkKVxuIiwKLQkJCQlmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSk7Ci0JCQlnb3RvIGVycl9uYW5kaXJxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9uYW5kaXJxOgotCWZyZWVfaXJxKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxLCBmc2xfaWZjX2N0cmxfZGV2KTsKLQlpcnFfZGlzcG9zZV9tYXBwaW5nKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKTsKLWVycl9pcnE6Ci0JZnJlZV9pcnEoZnNsX2lmY19jdHJsX2Rldi0+aXJxLCBmc2xfaWZjX2N0cmxfZGV2KTsKLQlpcnFfZGlzcG9zZV9tYXBwaW5nKGZzbF9pZmNfY3RybF9kZXYtPmlycSk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX2lmY19tYXRjaFtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAiZnNsLGlmYyIsCi0JfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzbF9pZmNfY3RybF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiZnNsLWlmYyIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IGZzbF9pZmNfbWF0Y2gsCi0JfSwKLQkucHJvYmUgICAgICAgPSBmc2xfaWZjX2N0cmxfcHJvYmUsCi0JLnJlbW92ZSAgICAgID0gZnNsX2lmY19jdHJsX3JlbW92ZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZnNsX2lmY19jdHJsX2RyaXZlcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBJbnRlZ3JhdGVkIEZsYXNoIENvbnRyb2xsZXIgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCmluZGV4IGE2MjVkY2YuLjNmNDE1ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCkBAIC0yMiwxMCArMjIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtODY4LDYgKzg3MSwxNCBAQAogCiAJCXBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQoaG9zZS0+YnVzLAogCQkJUENJX0RFVkZOKDAsIDApLCBQQ0lfQkFTRV9BRERSRVNTXzAsICZiYXNlKTsKKworCQkvKgorCQkgKiBGb3IgUEVYQ1NSQkFSLCBiaXQgMy0wIGluZGljYXRlIHByZWZldGNoYWJsZSBhbmQKKwkJICogYWRkcmVzcyB0eXBlLiBTbyB3aGVuIGdldHRpbmcgYmFzZSBhZGRyZXNzLCB0aGVzZQorCQkgKiBiaXRzIHNob3VsZCBiZSBtYXNrZWQKKwkJICovCisJCWJhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwogCQlyZXR1cm4gYmFzZTsKIAl9CiAjZW5kaWYKQEAgLTEwODYsMTAgKzEwOTcsMTU5IEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX3BjaV9wbWVfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBkZXZfaWQ7CisJc3RydWN0IGNjc3JfcGNpIF9faW9tZW0gKnBjaSA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKwl1MzIgZHI7CisKKwlkciA9IGluX2JlMzIoJnBjaS0+cGV4X3BtZV9tZXNfZHIpOworCWlmICghZHIpCisJCXJldHVybiBJUlFfTk9ORTsKKworCW91dF9iZTMyKCZwY2ktPnBleF9wbWVfbWVzX2RyLCBkcik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3BjaV9wbWVfcHJvYmUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2k7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgcG1lX2lycTsKKwlpbnQgcmVzOworCXUxNiBwbXM7CisKKwkvKiBHZXQgaG9zZSdzIHBjaV9kZXYgKi8KKwlkZXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZob3NlLT5idXMtPmRldmljZXMsIHR5cGVvZigqZGV2KSwgYnVzX2xpc3QpOworCisJLyogUE1FIERpc2FibGUgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZwbXMpOworCXBtcyAmPSB+UENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBkZXYtPnBtX2NhcCArIFBDSV9QTV9DVFJMLCBwbXMpOworCisJcG1lX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGhvc2UtPmRuLCAwKTsKKwlpZiAoIXBtZV9pcnEpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIFBNRSBpbnRlcnJ1cHQuXG4iKTsKKworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoaG9zZS0+cGFyZW50LCBwbWVfaXJxLAorCQkJZnNsX3BjaV9wbWVfaGFuZGxlLAorCQkJSVJRRl9TSEFSRUQsCisJCQkiW1BDSV0gUE1FIiwgaG9zZSk7CisJaWYgKHJlcyA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWllc3QgaXJxICVkIGZvciBQTUVcbiIsIHBtZV9pcnEpOworCQlpcnFfZGlzcG9zZV9tYXBwaW5nKHBtZV9pcnEpOworCisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBjaSA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKworCS8qIEVuYWJsZSBQVE9ELCBFTkwyM0QgJiBFWEwyM0QgKi8KKwlvdXRfYmUzMigmcGNpLT5wZXhfcG1lX21lc19kaXNyLCAwKTsKKwlzZXRiaXRzMzIoJnBjaS0+cGV4X3BtZV9tZXNfZGlzciwKKwkJICBQTUVfRElTUl9FTl9QVE9EIHwgUE1FX0RJU1JfRU5fRU5MMjNEIHwgUE1FX0RJU1JfRU5fRVhMMjNEKTsKKworCW91dF9iZTMyKCZwY2ktPnBleF9wbWVfbWVzX2llciwgMCk7CisJc2V0Yml0czMyKCZwY2ktPnBleF9wbWVfbWVzX2llciwKKwkJICBQTUVfRElTUl9FTl9QVE9EIHwgUE1FX0RJU1JfRU5fRU5MMjNEIHwgUE1FX0RJU1JfRU5fRVhMMjNEKTsKKworCS8qIFBNRSBFbmFibGUgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZwbXMpOworCXBtcyB8PSBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsIHBtcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VuZF9wbWVfdHVybm9mZl9tZXNzYWdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlzdHJ1Y3QgY2Nzcl9wY2kgX19pb21lbSAqcGNpID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBkcjsKKwlpbnQgaTsKKworCS8qIFNlbmQgUE1FX1R1cm5fT2ZmIE1lc3NhZ2UgUmVxdWVzdCAqLworCXNldGJpdHMzMigmcGNpLT5wZXhfcG1jciwgUEVYX1BNQ1JfUFRPTVIpOworCisJLyogV2FpdCB0cnVuIG9mZiBkb25lICovCisJZm9yIChpID0gMDsgaSA8IDE1MDsgaSsrKSB7CisJCWRyID0gaW5fYmUzMigmcGNpLT5wZXhfcG1lX21lc19kcik7CisJCWlmIChkcikgeworCQkJb3V0X2JlMzIoJnBjaS0+cGV4X3BtZV9tZXNfZHIsIGRyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdWRlbGF5KDEwMDApOworCX0KK30KKworc3RhdGljIHZvaWQgZnNsX3BjaV9zeXNjb3JlX2RvX3N1c3BlbmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXNlbmRfcG1lX3R1cm5vZmZfbWVzc2FnZShob3NlKTsKK30KKworc3RhdGljIGludCBmc2xfcGNpX3N5c2NvcmVfc3VzcGVuZCh2b2lkKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKKwkJZnNsX3BjaV9zeXNjb3JlX2RvX3N1c3BlbmQoaG9zZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX3BjaV9zeXNjb3JlX2RvX3Jlc3VtZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IGNjc3JfcGNpIF9faW9tZW0gKnBjaSA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKwl1MzIgZHI7CisJaW50IGk7CisKKwkvKiBTZW5kIEV4aXQgTDIgU3RhdGUgTWVzc2FnZSAqLworCXNldGJpdHMzMigmcGNpLT5wZXhfcG1jciwgUEVYX1BNQ1JfRVhMMlMpOworCisJLyogV2FpdCBleGl0IGRvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTUwOyBpKyspIHsKKwkJZHIgPSBpbl9iZTMyKCZwY2ktPnBleF9wbWVfbWVzX2RyKTsKKwkJaWYgKGRyKSB7CisJCQlvdXRfYmUzMigmcGNpLT5wZXhfcG1lX21lc19kciwgZHIpOworCQkJYnJlYWs7CisJCX0KKworCQl1ZGVsYXkoMTAwMCk7CisJfQorCisJc2V0dXBfcGNpX2F0bXUoaG9zZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9wY2lfc3lzY29yZV9yZXN1bWUodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpCisJCWZzbF9wY2lfc3lzY29yZV9kb19yZXN1bWUoaG9zZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgcGNpX3N5c2NvcmVfcG1fb3BzID0geworCS5zdXNwZW5kID0gZnNsX3BjaV9zeXNjb3JlX3N1c3BlbmQsCisJLnJlc3VtZSA9IGZzbF9wY2lfc3lzY29yZV9yZXN1bWUsCit9OworI2VuZGlmCisKK3ZvaWQgZnNsX3BjaWJpb3NfZml4dXBfcGhiKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQoreworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCWZzbF9wY2lfcG1lX3Byb2JlKHBoYik7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBmc2xfcGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IHJldDsKIAogCW5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlyZXQgPSBmc2xfYWRkX2JyaWRnZShwZGV2LCBmc2xfcGNpX3ByaW1hcnkgPT0gbm9kZSk7CkBAIC0xMDk5LDQyICsxMjU5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBmc2xfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCXN0cnVjdCByZXNvdXJjZSBwY2lfcnNyYzsKLQotCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UoZGV2LT5vZl9ub2RlKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LT5vZl9ub2RlLCAwLCAmcGNpX3JzcmMpKSB7Ci0JCWRldl9lcnIoZGV2LCAiR2V0IHBjaSByZWdpc3RlciBiYXNlIGZhaWxlZC4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jc2V0dXBfcGNpX2F0bXUoaG9zZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBjaV9wbV9vcHMgPSB7Ci0JLnJlc3VtZSA9IGZzbF9wY2lfcmVzdW1lLAotfTsKLQotI2RlZmluZSBQQ0lfUE1fT1BTICgmcGNpX3BtX29wcykKLQotI2Vsc2UKLQotI2RlZmluZSBQQ0lfUE1fT1BTIE5VTEwKLQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzbF9wY2lfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImZzbC1wY2kiLAotCQkucG0gPSBQQ0lfUE1fT1BTLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBwY2lfaWRzLAogCX0sCiAJLnByb2JlID0gZnNsX3BjaV9wcm9iZSwKQEAgLTExNDIsNiArMTI2OSw5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGZzbF9wY2lfaW5pdCh2b2lkKQogeworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZwY2lfc3lzY29yZV9wbV9vcHMpOworI2VuZGlmCiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX3BjaV9kcml2ZXIpOwogfQogYXJjaF9pbml0Y2FsbChmc2xfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuaAppbmRleCA4ZDQ1NWRmLi5jMWNlYzc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuaAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuaApAQCAtMzIsNiArMzIsMTMgQEAKICNkZWZpbmUgUElXQVJfV1JJVEVfU05PT1AJMHgwMDAwNTAwMAogI2RlZmluZSBQSVdBUl9TWl9NQVNLICAgICAgICAgIDB4MDAwMDAwM2YKIAorI2RlZmluZSBQRVhfUE1DUl9QVE9NUgkJMHgxCisjZGVmaW5lIFBFWF9QTUNSX0VYTDJTCQkweDIKKworI2RlZmluZSBQTUVfRElTUl9FTl9QVE9ECTB4MDAwMDgwMDAKKyNkZWZpbmUgUE1FX0RJU1JfRU5fRU5MMjNECTB4MDAwMDIwMDAKKyNkZWZpbmUgUE1FX0RJU1JfRU5fRVhMMjNECTB4MDAwMDEwMDAKKwogLyogUENJL1BDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyByZWcgKi8KIHN0cnVjdCBwY2lfb3V0Ym91bmRfd2luZG93X3JlZ3MgewogCV9fYmUzMglwb3RhcjsJLyogMHguMCAtIE91dGJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgKi8KQEAgLTExMSw2ICsxMTgsNyBAQAogCiBleHRlcm4gaW50IGZzbF9hZGRfYnJpZGdlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBpc19wcmltYXJ5KTsKIGV4dGVybiB2b2lkIGZzbF9wY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK2V4dGVybiB2b2lkIGZzbF9wY2liaW9zX2ZpeHVwX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CiBleHRlcm4gaW50IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiB1NjQgZnNsX3BjaV9pbW1yYmFyX2Jhc2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCmluZGV4IGIwNzkwOTguLjA4NTA0ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKQEAgLTE3MSw3ICsxNzEsMTEgQEAKICNkZWZpbmUgUkVHCQkiJS44bHgiCiAjZW5kaWYKIAorI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisjZGVmaW5lIEdFVFdPUkQodikJKCgodilbM10gPDwgMjQpICsgKCh2KVsyXSA8PCAxNikgKyAoKHYpWzFdIDw8IDgpICsgKHYpWzBdKQorI2Vsc2UKICNkZWZpbmUgR0VUV09SRCh2KQkoKCh2KVswXSA8PCAyNCkgKyAoKHYpWzFdIDw8IDE2KSArICgodilbMl0gPDwgOCkgKyAodilbM10pCisjZW5kaWYKIAogI2RlZmluZSBpc3hkaWdpdChjKQkoKCcwJyA8PSAoYykgJiYgKGMpIDw9ICc5JykgXAogCQkJIHx8ICgnYScgPD0gKGMpICYmIChjKSA8PSAnZicpIFwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggNjVhMDc3NS4uOTUzZjE3YzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC0xMTcsNiArMTE3LDcgQEAKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAorCXNlbGVjdCBIQVZFX0ZVVEVYX0NNUFhDSEcgaWYgRlVURVgKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKIAlzZWxlY3QgSEFWRV9LRVJORUxfR1pJUAogCXNlbGVjdCBIQVZFX0tFUk5FTF9MWjQKQEAgLTE0MCw2ICsxNDEsNyBAQAogCXNlbGVjdCBPTERfU0lHQUNUSU9OCiAJc2VsZWN0IE9MRF9TSUdTVVNQRU5EMwogCXNlbGVjdCBTWVNDVExfRVhDRVBUSU9OX1RSQUNFCisJc2VsZWN0IFRUWQogCXNlbGVjdCBWSVJUX0NQVV9BQ0NPVU5USU5HCiAJc2VsZWN0IFZJUlRfVE9fQlVTCiAKQEAgLTQxNSw2ICs0MTcsMTAgQEAKIGNvbmZpZyBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFCiAJZGVmX2Jvb2wgeQogCitjb25maWcgQVJDSF9FTkFCTEVfU1BMSVRfUE1EX1BUTE9DSworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIDY0QklUCisKIGNvbmZpZyBGT1JDRV9NQVhfWk9ORU9SREVSCiAJaW50CiAJZGVmYXVsdCAiOSIKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9vcy5jIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX29zLmMKaW5kZXggZGU4ZTJiMy4uNjliMjNiMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX29zLmMKKysrIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX29zLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCWludCByYywgbWF4X3NpemU7CiAKIAltYXhfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXBwbGRhdGFfb3NfZGF0YSkgKwotCQkgICAoTlJfQ1BVUyAqIHNpemVvZihzdHJ1Y3QgYXBwbGRhdGFfb3NfcGVyX2NwdSkpOworCQkgICAobnVtX3Bvc3NpYmxlX2NwdXMoKSAqIHNpemVvZihzdHJ1Y3QgYXBwbGRhdGFfb3NfcGVyX2NwdSkpOwogCWlmIChtYXhfc2l6ZSA+IEFQUExEQVRBX01BWF9SRUNfU0laRSkgewogCQlwcl9lcnIoIk1heGltdW0gT1MgcmVjb3JkIHNpemUgJWkgZXhjZWVkcyB0aGUgbWF4aW11bSAiCiAJCSAgICAgICAicmVjb3JkIHNpemUgJWlcbiIsIG1heF9zaXplLCBBUFBMREFUQV9NQVhfUkVDX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZhdWx0X2RlZmNvbmZpZwppbmRleCBlMGFmMmVlLi5kZGFhZTJmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWZhdWx0X2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZhdWx0X2RlZmNvbmZpZwpAQCAtNDYsNiArNDYsNyBAQAogQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVEPXkKIENPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKIENPTkZJR19NQVJDSF9aOV8xMDk9eQorQ09ORklHX05SX0NQVVM9MjU2CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfSFpfMTAwPXkKIENPTkZJR19NRU1PUllfSE9UUExVRz15CkBAIC01OCw3ICs1OSw2IEBACiBDT05GSUdfSE9UUExVR19QQ0lfUzM5MD15CiBDT05GSUdfQ0hTQ19TQ0g9eQogQ09ORklHX0NSQVNIX0RVTVA9eQotQ09ORklHX1pGQ1BEVU1QPXkKICMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfSElCRVJOQVRJT049eQpAQCAtMTAxLDcgKzEwMSw2IEBACiBDT05GSUdfVENQX0NPTkdfWUVBSD1tCiBDT05GSUdfVENQX0NPTkdfSUxMSU5PSVM9bQogQ09ORklHX0lQVjY9eQotQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSVBWNl9ST1VURVJfUFJFRj15CiBDT05GSUdfSU5FVDZfQUg9bQogQ09ORklHX0lORVQ2X0VTUD1tCkBAIC0xMTEsNiArMTEwLDcgQEAKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD1tCiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OPW0KK0NPTkZJR19JUFY2X1ZUST1tCiBDT05GSUdfSVBWNl9TSVQ9bQogQ09ORklHX0lQVjZfR1JFPW0KIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CkBAIC0xMzUsNyArMTM1LDE3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX0NUX05FVExJTks9bQogQ09ORklHX05GX0NUX05FVExJTktfVElNRU9VVD1tCi1DT05GSUdfTkVURklMVEVSX1RQUk9YWT1tCitDT05GSUdfTkZfVEFCTEVTPW0KK0NPTkZJR19ORlRfRVhUSERSPW0KK0NPTkZJR19ORlRfTUVUQT1tCitDT05GSUdfTkZUX0NUPW0KK0NPTkZJR19ORlRfUkJUUkVFPW0KK0NPTkZJR19ORlRfSEFTSD1tCitDT05GSUdfTkZUX0NPVU5URVI9bQorQ09ORklHX05GVF9MT0c9bQorQ09ORklHX05GVF9MSU1JVD1tCitDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9BVURJVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0yMDQsNyArMjE0LDkgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVElQPW0KIENPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlRORVQ9bQorQ09ORklHX0lQX1NFVF9IQVNIX05FVFBPUlRORVQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVD1tCitDT05GSUdfSVBfU0VUX0hBU0hfTkVUTkVUPW0KIENPTkZJR19JUF9TRVRfSEFTSF9ORVRQT1JUPW0KIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KQEAgLTIyNyw2ICsyMzksMTEgQEAKIENPTkZJR19JUF9WU19QRV9TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KICMgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQorQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCitDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQorQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCitDT05GSUdfTkZfVEFCTEVTX0FSUD1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KIENPTkZJR19JUF9ORl9NQVRDSF9FQ049bQpAQCAtMjQ5LDYgKzI2Niw5IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCitDT05GSUdfTkZfVEFCTEVTX0lQVjY9bQorQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KK0NPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVA2X05GX01BVENIX0FIPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQ9bQpAQCAtMjY4LDYgKzI4OCw3IEBACiBDT05GSUdfTkZfTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCiBDT05GSUdfSVA2X05GX1RBUkdFVF9OUFQ9bQorQ09ORklHX05GX1RBQkxFU19CUklER0U9bQogQ09ORklHX05FVF9TQ1RQUFJPQkU9bQogQ09ORklHX1JEUz1tCiBDT05GSUdfUkRTX1JETUE9bQpAQCAtMzE0LDYgKzMzNSw3IEBACiBDT05GSUdfTkVUX0NMU19SU1ZQNj1tCiBDT05GSUdfTkVUX0NMU19GTE9XPW0KIENPTkZJR19ORVRfQ0xTX0NHUk9VUD15CitDT05GSUdfTkVUX0NMU19CUEY9bQogQ09ORklHX05FVF9DTFNfQUNUPXkKIENPTkZJR19ORVRfQUNUX1BPTElDRT1tCiBDT05GSUdfTkVUX0FDVF9HQUNUPW0KQEAgLTM4MSw4ICs0MDMsOCBAQAogQ09ORklHX0RNX0NSWVBUPW0KIENPTkZJR19ETV9TTkFQU0hPVD1tCiBDT05GSUdfRE1fTUlSUk9SPW0KLUNPTkZJR19ETV9SQUlEPW0KIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFPW0KK0NPTkZJR19ETV9SQUlEPW0KIENPTkZJR19ETV9aRVJPPW0KIENPTkZJR19ETV9NVUxUSVBBVEg9bQogQ09ORklHX0RNX01VTFRJUEFUSF9RTD1tCkBAIC00MzQsNyArNDU2LDYgQEAKIENPTkZJR19XQVRDSERPRz15CiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQogQ09ORklHX1NPRlRfV0FUQ0hET0c9bQotQ09ORklHX1pWTV9XQVRDSERPRz1tCiAjIENPTkZJR19ISUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0lORklOSUJBTkQ9bQpAQCAtNTM0LDEzICs1NTUsMjMgQEAKIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERUJVR19QQUdFQUxMT0M9eQorQ09ORklHX0RFQlVHX09CSkVDVFM9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfU0VMRlRFU1Q9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfRlJFRT15CitDT05GSUdfREVCVUdfT0JKRUNUU19USU1FUlM9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfV09SSz15CitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15CitDT05GSUdfREVCVUdfT0JKRUNUU19QRVJDUFVfQ09VTlRFUj15CiBDT05GSUdfU0xVQl9ERUJVR19PTj15CiBDT05GSUdfU0xVQl9TVEFUUz15CitDT05GSUdfREVCVUdfS01FTUxFQUs9eQogQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFPXkKIENPTkZJR19ERUJVR19WTT15CiBDT05GSUdfREVCVUdfVk1fUkI9eQogQ09ORklHX01FTU9SWV9OT1RJRklFUl9FUlJPUl9JTkpFQ1Q9bQogQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUz15CitDT05GSUdfREVCVUdfU0hJUlE9eQorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX1RJTUVSX1NUQVRTPXkKIENPTkZJR19ERUJVR19SVF9NVVRFWEVTPXkKIENPTkZJR19SVF9NVVRFWF9URVNURVI9eQpAQCAtNTczLDkgKzYwNCwxMSBAQAogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogIyBDT05GSUdfS1BST0JFX0VWRU5UIGlzIG5vdCBzZXQKIENPTkZJR19MS0RUTT1tCitDT05GSUdfVEVTVF9MSVNUX1NPUlQ9eQogQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1Q9eQotQ09ORklHX1JCVFJFRV9URVNUPW0KK0NPTkZJR19SQlRSRUVfVEVTVD15CiBDT05GSUdfSU5URVJWQUxfVFJFRV9URVNUPW0KK0NPTkZJR19QRVJDUFVfVEVTVD1tCiBDT05GSUdfQVRPTUlDNjRfU0VMRlRFU1Q9eQogQ09ORklHX0RNQV9BUElfREVCVUc9eQogIyBDT05GSUdfU1RSSUNUX0RFVk1FTSBpcyBub3Qgc2V0CkBAIC02MzgsNyArNjcxLDYgQEAKIENPTkZJR19DUllQVE9fR0hBU0hfUzM5MD1tCiBDT05GSUdfQVNZTU1FVFJJQ19LRVlfVFlQRT1tCiBDT05GSUdfQVNZTU1FVFJJQ19QVUJMSUNfS0VZX1NVQlRZUEU9bQotQ09ORklHX1BVQkxJQ19LRVlfQUxHT19SU0E9bQogQ09ORklHX1g1MDlfQ0VSVElGSUNBVEVfUEFSU0VSPW0KIENPTkZJR19DUkM3PW0KIENPTkZJR19DUkM4PW0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2djb3ZfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZ2Nvdl9kZWZjb25maWcKaW5kZXggYjlmNmI0Yy4uYzgxYTc0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZ2Nvdl9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZ2Nvdl9kZWZjb25maWcKQEAgLTQ2LDYgKzQ2LDcgQEAKIENPTkZJR19DRlFfR1JPVVBfSU9TQ0hFRD15CiBDT05GSUdfREVGQVVMVF9ERUFETElORT15CiBDT05GSUdfTUFSQ0hfWjlfMTA5PXkKK0NPTkZJR19OUl9DUFVTPTI1NgogQ09ORklHX0haXzEwMD15CiBDT05GSUdfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX01FTU9SWV9IT1RSRU1PVkU9eQpAQCAtNTYsNyArNTcsNiBAQAogQ09ORklHX0hPVFBMVUdfUENJX1MzOTA9eQogQ09ORklHX0NIU0NfU0NIPXkKIENPTkZJR19DUkFTSF9EVU1QPXkKLUNPTkZJR19aRkNQRFVNUD15CiAjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CiBDT05GSUdfQklORk1UX01JU0M9bQogQ09ORklHX0hJQkVSTkFUSU9OPXkKQEAgLTk5LDcgKzk5LDYgQEAKIENPTkZJR19UQ1BfQ09OR19ZRUFIPW0KIENPTkZJR19UQ1BfQ09OR19JTExJTk9JUz1tCiBDT05GSUdfSVBWNj15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKIENPTkZJR19JTkVUNl9BSD1tCiBDT05GSUdfSU5FVDZfRVNQPW0KQEAgLTEwOSw2ICsxMDgsNyBAQAogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049bQorQ09ORklHX0lQVjZfVlRJPW0KIENPTkZJR19JUFY2X1NJVD1tCiBDT05GSUdfSVBWNl9HUkU9bQogQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTPXkKQEAgLTEzMyw3ICsxMzMsMTcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfQ1RfTkVUTElOSz1tCiBDT05GSUdfTkZfQ1RfTkVUTElOS19USU1FT1VUPW0KLUNPTkZJR19ORVRGSUxURVJfVFBST1hZPW0KK0NPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GVF9FWFRIRFI9bQorQ09ORklHX05GVF9NRVRBPW0KK0NPTkZJR19ORlRfQ1Q9bQorQ09ORklHX05GVF9SQlRSRUU9bQorQ09ORklHX05GVF9IQVNIPW0KK0NPTkZJR19ORlRfQ09VTlRFUj1tCitDT05GSUdfTkZUX0xPRz1tCitDT05GSUdfTkZUX0xJTUlUPW0KK0NPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0FVRElUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTIwMiw3ICsyMTIsOSBAQAogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUSVA9bQogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVE5FVD1tCitDT05GSUdfSVBfU0VUX0hBU0hfTkVUUE9SVE5FVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUPW0KK0NPTkZJR19JUF9TRVRfSEFTSF9ORVRORVQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVFBPUlQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQpAQCAtMjI1LDYgKzIzNywxMSBAQAogQ09ORklHX0lQX1ZTX1BFX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQogIyBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9UQUJMRVNfSVBWND1tCitDT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KK0NPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCitDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KK0NPTkZJR19ORl9UQUJMRVNfQVJQPW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCkBAIC0yNDcsNiArMjY0LDkgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KK0NPTkZJR19ORl9UQUJMRVNfSVBWNj1tCitDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQorQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND1tCkBAIC0yNjYsNiArMjg2LDcgQEAKIENPTkZJR19ORl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUDZfTkZfVEFSR0VUX05QVD1tCitDT05GSUdfTkZfVEFCTEVTX0JSSURHRT1tCiBDT05GSUdfTkVUX1NDVFBQUk9CRT1tCiBDT05GSUdfUkRTPW0KIENPTkZJR19SRFNfUkRNQT1tCkBAIC0zMTEsNiArMzMyLDcgQEAKIENPTkZJR19ORVRfQ0xTX1JTVlA2PW0KIENPTkZJR19ORVRfQ0xTX0ZMT1c9bQogQ09ORklHX05FVF9DTFNfQ0dST1VQPXkKK0NPTkZJR19ORVRfQ0xTX0JQRj1tCiBDT05GSUdfTkVUX0NMU19BQ1Q9eQogQ09ORklHX05FVF9BQ1RfUE9MSUNFPW0KIENPTkZJR19ORVRfQUNUX0dBQ1Q9bQpAQCAtMzc4LDggKzQwMCw4IEBACiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KIENPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1JBSUQ9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQorQ09ORklHX0RNX1JBSUQ9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCiBDT05GSUdfRE1fTVVMVElQQVRIX1FMPW0KQEAgLTQzMSw3ICs0NTMsNiBAQAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CiBDT05GSUdfU09GVF9XQVRDSERPRz1tCi1DT05GSUdfWlZNX1dBVENIRE9HPW0KICMgQ09ORklHX0hJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfSU5GSU5JQkFORD1tCkBAIC01NDAsNiArNTYxLDcgQEAKIENPTkZJR19MS0RUTT1tCiBDT05GSUdfUkJUUkVFX1RFU1Q9bQogQ09ORklHX0lOVEVSVkFMX1RSRUVfVEVTVD1tCitDT05GSUdfUEVSQ1BVX1RFU1Q9bQogQ09ORklHX0FUT01JQzY0X1NFTEZURVNUPXkKICMgQ09ORklHX1NUUklDVF9ERVZNRU0gaXMgbm90IHNldAogQ09ORklHX1MzOTBfUFREVU1QPXkKQEAgLTYwMSw3ICs2MjMsNiBAQAogQ09ORklHX0NSWVBUT19HSEFTSF9TMzkwPW0KIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFPW0KIENPTkZJR19BU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRT1tCi1DT05GSUdfUFVCTElDX0tFWV9BTEdPX1JTQT1tCiBDT05GSUdfWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVI9bQogQ09ORklHX0NSQzc9bQogQ09ORklHX0NSQzg9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnCmluZGV4IDkxMDg3YjQuLmI1YmE4ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL3BlcmZvcm1hbmNlX2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcKQEAgLTQ0LDYgKzQ0LDcgQEAKIENPTkZJR19DRlFfR1JPVVBfSU9TQ0hFRD15CiBDT05GSUdfREVGQVVMVF9ERUFETElORT15CiBDT05GSUdfTUFSQ0hfWjlfMTA5PXkKK0NPTkZJR19OUl9DUFVTPTI1NgogQ09ORklHX0haXzEwMD15CiBDT05GSUdfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX01FTU9SWV9IT1RSRU1PVkU9eQpAQCAtNTQsNyArNTUsNiBAQAogQ09ORklHX0hPVFBMVUdfUENJX1MzOTA9eQogQ09ORklHX0NIU0NfU0NIPXkKIENPTkZJR19DUkFTSF9EVU1QPXkKLUNPTkZJR19aRkNQRFVNUD15CiAjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CiBDT05GSUdfQklORk1UX01JU0M9bQogQ09ORklHX0hJQkVSTkFUSU9OPXkKQEAgLTk3LDcgKzk3LDYgQEAKIENPTkZJR19UQ1BfQ09OR19ZRUFIPW0KIENPTkZJR19UQ1BfQ09OR19JTExJTk9JUz1tCiBDT05GSUdfSVBWNj15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKIENPTkZJR19JTkVUNl9BSD1tCiBDT05GSUdfSU5FVDZfRVNQPW0KQEAgLTEwNyw2ICsxMDYsNyBAQAogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049bQorQ09ORklHX0lQVjZfVlRJPW0KIENPTkZJR19JUFY2X1NJVD1tCiBDT05GSUdfSVBWNl9HUkU9bQogQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTPXkKQEAgLTEzMSw3ICsxMzEsMTcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfQ1RfTkVUTElOSz1tCiBDT05GSUdfTkZfQ1RfTkVUTElOS19USU1FT1VUPW0KLUNPTkZJR19ORVRGSUxURVJfVFBST1hZPW0KK0NPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GVF9FWFRIRFI9bQorQ09ORklHX05GVF9NRVRBPW0KK0NPTkZJR19ORlRfQ1Q9bQorQ09ORklHX05GVF9SQlRSRUU9bQorQ09ORklHX05GVF9IQVNIPW0KK0NPTkZJR19ORlRfQ09VTlRFUj1tCitDT05GSUdfTkZUX0xPRz1tCitDT05GSUdfTkZUX0xJTUlUPW0KK0NPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0FVRElUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTIwMCw3ICsyMTAsOSBAQAogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUSVA9bQogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVE5FVD1tCitDT05GSUdfSVBfU0VUX0hBU0hfTkVUUE9SVE5FVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUPW0KK0NPTkZJR19JUF9TRVRfSEFTSF9ORVRORVQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVFBPUlQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQpAQCAtMjIzLDYgKzIzNSwxMSBAQAogQ09ORklHX0lQX1ZTX1BFX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQogIyBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9UQUJMRVNfSVBWND1tCitDT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KK0NPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCitDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KK0NPTkZJR19ORl9UQUJMRVNfQVJQPW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCkBAIC0yNDUsNiArMjYyLDkgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KK0NPTkZJR19ORl9UQUJMRVNfSVBWNj1tCitDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQorQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND1tCkBAIC0yNjQsNiArMjg0LDcgQEAKIENPTkZJR19ORl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUDZfTkZfVEFSR0VUX05QVD1tCitDT05GSUdfTkZfVEFCTEVTX0JSSURHRT1tCiBDT05GSUdfTkVUX1NDVFBQUk9CRT1tCiBDT05GSUdfUkRTPW0KIENPTkZJR19SRFNfUkRNQT1tCkBAIC0zMDksNiArMzMwLDcgQEAKIENPTkZJR19ORVRfQ0xTX1JTVlA2PW0KIENPTkZJR19ORVRfQ0xTX0ZMT1c9bQogQ09ORklHX05FVF9DTFNfQ0dST1VQPXkKK0NPTkZJR19ORVRfQ0xTX0JQRj1tCiBDT05GSUdfTkVUX0NMU19BQ1Q9eQogQ09ORklHX05FVF9BQ1RfUE9MSUNFPW0KIENPTkZJR19ORVRfQUNUX0dBQ1Q9bQpAQCAtMzc2LDggKzM5OCw4IEBACiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KIENPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1JBSUQ9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQorQ09ORklHX0RNX1JBSUQ9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCiBDT05GSUdfRE1fTVVMVElQQVRIX1FMPW0KQEAgLTQyOSw3ICs0NTEsNiBAQAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CiBDT05GSUdfU09GVF9XQVRDSERPRz1tCi1DT05GSUdfWlZNX1dBVENIRE9HPW0KICMgQ09ORklHX0hJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfSU5GSU5JQkFORD1tCkBAIC01MzIsNiArNTUzLDcgQEAKIENPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKICMgQ09ORklHX0tQUk9CRV9FVkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfTEtEVE09bQorQ09ORklHX1BFUkNQVV9URVNUPW0KIENPTkZJR19BVE9NSUM2NF9TRUxGVEVTVD15CiAjIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKIENPTkZJR19TMzkwX1BURFVNUD15CkBAIC01OTMsNyArNjE1LDYgQEAKIENPTkZJR19DUllQVE9fR0hBU0hfUzM5MD1tCiBDT05GSUdfQVNZTU1FVFJJQ19LRVlfVFlQRT1tCiBDT05GSUdfQVNZTU1FVFJJQ19QVUJMSUNfS0VZX1NVQlRZUEU9bQotQ09ORklHX1BVQkxJQ19LRVlfQUxHT19SU0E9bQogQ09ORklHX1g1MDlfQ0VSVElGSUNBVEVfUEFSU0VSPW0KIENPTkZJR19DUkM3PW0KIENPTkZJR19DUkM4PW0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL3pmY3BkdW1wX2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL3pmY3BkdW1wX2RlZmNvbmZpZwppbmRleCBkNzI1YzRkLi5jZWYwNzNjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy96ZmNwZHVtcF9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvemZjcGR1bXBfZGVmY29uZmlnCkBAIC0xOSw3ICsxOSw2IEBACiAjIENPTkZJR19DSFNDX1NDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ01fQlVTIGlzIG5vdCBzZXQKIENPTkZJR19DUkFTSF9EVU1QPXkKLUNPTkZJR19aRkNQRFVNUD15CiAjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lVQ1YgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9kZWZjb25maWcKaW5kZXggMzNmNTc1MS4uNDU1N2NiNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvZGVmY29uZmlnCkBAIC00MCw2ICs0MCw3IEBACiBDT05GSUdfSUJNX1BBUlRJVElPTj15CiBDT05GSUdfREVGQVVMVF9ERUFETElORT15CiBDT05GSUdfTUFSQ0hfWjE5Nj15CitDT05GSUdfTlJfQ1BVUz0yNTYKIENPTkZJR19IWl8xMDA9eQogQ09ORklHX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFPXkKQEAgLTEyMiwyMiArMTIzLDMxIEBACiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKIENPTkZJR19IVUdFVExCRlM9eQogIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfVU5VU0VEX1NZTUJPTFM9eQorQ09ORklHX0RFQlVHX1NFQ1RJT05fTUlTTUFUQ0g9eQogQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVT15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0RFQlVHX1BBR0VBTExPQz15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfVElNRVJfU1RBVFM9eQorQ09ORklHX0RFQlVHX1JUX01VVEVYRVM9eQogQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQogQ09ORklHX0xPQ0tfU1RBVD15CiBDT05GSUdfREVCVUdfTE9DS0RFUD15CitDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQPXkKK0NPTkZJR19ERUJVR19XUklURUNPVU5UPXkKIENPTkZJR19ERUJVR19MSVNUPXkKK0NPTkZJR19ERUJVR19TRz15CiBDT05GSUdfREVCVUdfTk9USUZJRVJTPXkKIENPTkZJR19QUk9WRV9SQ1U9eQogQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAogQ09ORklHX1JDVV9UUkFDRT15CiBDT05GSUdfTEFURU5DWVRPUD15CitDT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1Q9eQogIyBDT05GSUdfU1RSSUNUX0RFVk1FTSBpcyBub3Qgc2V0CitDT05GSUdfUzM5MF9QVERVTVA9eQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19BVVRIRU5DPW0KIENPTkZJR19DUllQVE9fVEVTVD1tCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfdm0uYyBiL2FyY2gvczM5MC9oeXBmcy9oeXBmc192bS5jCmluZGV4IDI0OTA4Y2UuLjMyMDQwYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9oeXBmcy9oeXBmc192bS5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9oeXBmc192bS5jCkBAIC0zMiw3ICszMiw3IEBACiAJX191MzIgcGNwdXM7CiAJX191MzIgbGNwdXM7CiAJX191MzIgdmNwdXM7Ci0JX191MzIgY3B1X21pbjsKKwlfX3UzMiBvY3B1czsKIAlfX3UzMiBjcHVfbWF4OwogCV9fdTMyIGNwdV9zaGFyZXM7CiAJX191MzIgY3B1X3VzZV9zYW1wOwpAQCAtMTQyLDcgKzE0MiwxMiBAQAogCUFUVFJJQlVURShjcHVzX2RpciwgImNhcHBlZCIsIGNhcHBlZF92YWx1ZSk7CiAJQVRUUklCVVRFKGNwdXNfZGlyLCAiZGVkaWNhdGVkIiwgZGVkaWNhdGVkX2ZsYWcpOwogCUFUVFJJQlVURShjcHVzX2RpciwgImNvdW50IiwgZGF0YS0+dmNwdXMpOwotCUFUVFJJQlVURShjcHVzX2RpciwgIndlaWdodF9taW4iLCBkYXRhLT5jcHVfbWluKTsKKwkvKgorCSAqIE5vdGU6IFRoZSAid2VpZ2h0X21pbiIgYXR0cmlidXRlIGdvdCB0aGUgd3JvbmcgbmFtZS4KKwkgKiBUaGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG5vbi1zdG9wcGVkIChvcGVyYXRpbmcpCisJICogQ1BVUy4KKwkgKi8KKwlBVFRSSUJVVEUoY3B1c19kaXIsICJ3ZWlnaHRfbWluIiwgZGF0YS0+b2NwdXMpOwogCUFUVFJJQlVURShjcHVzX2RpciwgIndlaWdodF9tYXgiLCBkYXRhLT5jcHVfbWF4KTsKIAlBVFRSSUJVVEUoY3B1c19kaXIsICJ3ZWlnaHRfY3VyIiwgZGF0YS0+Y3B1X3NoYXJlcyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDgzODZhNGEuLjU3ODkyYTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw2ICsxLDcgQEAKIAogCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKLWdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYWlycS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2FpcnEuaAppbmRleCA0YmJiNTk1Li5iZDkzZmY2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYWlycS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9haXJxLmgKQEAgLTQ0LDExICs0NCwyMSBAQAogCiBzdHJ1Y3QgYWlycV9pdiAqYWlycV9pdl9jcmVhdGUodW5zaWduZWQgbG9uZyBiaXRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgYWlycV9pdl9yZWxlYXNlKHN0cnVjdCBhaXJxX2l2ICppdik7Ci11bnNpZ25lZCBsb25nIGFpcnFfaXZfYWxsb2NfYml0KHN0cnVjdCBhaXJxX2l2ICppdik7Ci12b2lkIGFpcnFfaXZfZnJlZV9iaXQoc3RydWN0IGFpcnFfaXYgKml2LCB1bnNpZ25lZCBsb25nIGJpdCk7Cit1bnNpZ25lZCBsb25nIGFpcnFfaXZfYWxsb2Moc3RydWN0IGFpcnFfaXYgKml2LCB1bnNpZ25lZCBsb25nIG51bSk7Cit2b2lkIGFpcnFfaXZfZnJlZShzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgYml0LCB1bnNpZ25lZCBsb25nIG51bSk7CiB1bnNpZ25lZCBsb25nIGFpcnFfaXZfc2NhbihzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkgICB1bnNpZ25lZCBsb25nIGVuZCk7CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhaXJxX2l2X2FsbG9jX2JpdChzdHJ1Y3QgYWlycV9pdiAqaXYpCit7CisJcmV0dXJuIGFpcnFfaXZfYWxsb2MoaXYsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWlycV9pdl9mcmVlX2JpdChzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgYml0KQoreworCWFpcnFfaXZfZnJlZShpdiwgYml0LCAxKTsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFpcnFfaXZfZW5kKHN0cnVjdCBhaXJxX2l2ICppdikKIHsKIAlyZXR1cm4gaXYtPmVuZDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCA2ZTZhZDA2Li5lYzVlZjg5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC0xMyw5ICsxMyw5IEBACiAgKgogICogVGhlIGJpdG9wIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB0byB3b3JrIG9uIHVuc2lnbmVkIGxvbmdzLCBzbyBmb3IgYW4KICAqIHMzOTB4IHN5c3RlbSB0aGUgYml0cyBlbmQgdXAgbnVtYmVyZWQ6Ci0gKiAgIHw2My4uLi4uLi4uLi4uLi4uMHwxMjcuLi4uLi4uLi4uLi42NHwxOTEuLi4uLi4uLi4uLjEyOHwyNTUuLi4uLi4uLi4uLjE5NnwKKyAqICAgfDYzLi4uLi4uLi4uLi4uLi4wfDEyNy4uLi4uLi4uLi4uLjY0fDE5MS4uLi4uLi4uLi4uMTI4fDI1NS4uLi4uLi4uLi4uMTkyfAogICogYW5kIG9uIHMzOTA6Ci0gKiAgIHwzMS4uLi4uMHw2My4uLi4zMXw5NS4uLi42NHwxMjcuLi45NnwxNTkuLjEyOHwxOTEuLjE2MHwyMjMuLjE5MnwyNTUuLjIyNHwKKyAqICAgfDMxLi4uLi4wfDYzLi4uLjMyfDk1Li4uLjY0fDEyNy4uLjk2fDE1OS4uMTI4fDE5MS4uMTYwfDIyMy4uMTkyfDI1NS4uMjI0fAogICoKICAqIFRoZXJlIGFyZSBhIGZldyBsaXR0bGUtZW5kaWFuIG1hY3JvcyB1c2VkIG1vc3RseSBmb3IgZmlsZXN5c3RlbQogICogYml0bWFwcywgdGhlc2Ugd29yayBvbiBzaW1pbGFyIGJpdCBhcnJheXMgbGF5b3V0cywgYnV0CkBAIC0zMCw3ICszMCw3IEBACiAgKiBvbiBhbiBzMzkweCBzeXN0ZW0gdGhlIGJpdHMgYXJlIG51bWJlcmVkOgogICogICB8MC4uLi4uLi4uLi4uLi4uNjN8NjQuLi4uLi4uLi4uLi4xMjd8MTI4Li4uLi4uLi4uLi4xOTF8MTkyLi4uLi4uLi4uLi4yNTV8CiAgKiBhbmQgb24gczM5MDoKLSAqICAgfDAuLi4uLjMxfDMxLi4uLjYzfDY0Li4uLjk1fDk2Li4uMTI3fDEyOC4uMTU5fDE2MC4uMTkxfDE5Mi4uMjIzfDIyNC4uMjU1fAorICogICB8MC4uLi4uMzF8MzIuLi4uNjN8NjQuLi4uOTV8OTYuLi4xMjd8MTI4Li4xNTl8MTYwLi4xOTF8MTkyLi4yMjN8MjI0Li4yNTV8CiAgKgogICogVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IGJpdCAwLTYzICg2NGIpIG9yIDAtMzEgKDMyYikgaW4gdGhlIGJpdAogICogbnVtYmVyIGZpZWxkIG5lZWRzIHRvIGJlIHJldmVyc2VkIGNvbXBhcmVkIHRvIHRoZSBMU0IwIGVuY29kZWQgYml0CkBAIC0zMDQsNyArMzA0LDcgQEAKICAqIE9uIGFuIHMzOTB4IHN5c3RlbSB0aGUgYml0cyBhcmUgbnVtYmVyZWQ6CiAgKiAgIHwwLi4uLi4uLi4uLi4uLi42M3w2NC4uLi4uLi4uLi4uLjEyN3wxMjguLi4uLi4uLi4uLjE5MXwxOTIuLi4uLi4uLi4uLjI1NXwKICAqIGFuZCBvbiBzMzkwOgotICogICB8MC4uLi4uMzF8MzEuLi4uNjN8NjQuLi4uOTV8OTYuLi4xMjd8MTI4Li4xNTl8MTYwLi4xOTF8MTkyLi4yMjN8MjI0Li4yNTV8CisgKiAgIHwwLi4uLi4zMXwzMi4uLi42M3w2NC4uLi45NXw5Ni4uLjEyN3wxMjguLjE1OXwxNjAuLjE5MXwxOTIuLjIyM3wyMjQuLjI1NXwKICAqLwogdW5zaWduZWQgbG9uZyBmaW5kX2ZpcnN0X2JpdF9pbnYoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIHVuc2lnbmVkIGxvbmcgZmluZF9uZXh0X2JpdF9pbnYoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oCmluZGV4IGYyMDFhZjguLmE5YzJjMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dkZXYuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmgKQEAgLTIxOSw3ICsyMTksOSBAQAogI2RlZmluZSB0b19jY3dkZXYobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBjY3dfZGV2aWNlLCBkZXYpCiAjZGVmaW5lIHRvX2Njd2RydihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IGNjd19kcml2ZXIsIGRyaXZlcikKIAotZXh0ZXJuIHN0cnVjdCBjY3dfZGV2aWNlICpjY3dfZGV2aWNlX3Byb2JlX2NvbnNvbGUodm9pZCk7CitleHRlcm4gc3RydWN0IGNjd19kZXZpY2UgKmNjd19kZXZpY2VfY3JlYXRlX2NvbnNvbGUoc3RydWN0IGNjd19kcml2ZXIgKik7CitleHRlcm4gdm9pZCBjY3dfZGV2aWNlX2Rlc3Ryb3lfY29uc29sZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKK2V4dGVybiBpbnQgY2N3X2RldmljZV9lbmFibGVfY29uc29sZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIGV4dGVybiB2b2lkIGNjd19kZXZpY2Vfd2FpdF9pZGxlKHN0cnVjdCBjY3dfZGV2aWNlICopOwogZXh0ZXJuIGludCBjY3dfZGV2aWNlX2ZvcmNlX2NvbnNvbGUoc3RydWN0IGNjd19kZXZpY2UgKik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dncm91cC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2dyb3VwLmgKaW5kZXggMjM3MjNjZS4uNmU2NzBmOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2dyb3VwLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2dyb3VwLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAJc3RydWN0IGRldmljZQlkZXY7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXZbMF07CisJc3RydWN0IHdvcmtfc3RydWN0IHVuZ3JvdXBfd29yazsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAppbmRleCA0ZjU3YTRmLi43NDAzNjQ4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hlY2tzdW0uaApAQCAtNDQsMjIgKzQ0LDE1IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKgotICogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgotICogdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCisgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLgogICovCiBzdGF0aWMgaW5saW5lIF9fd3N1bQogY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVycl9wdHIpCiB7Ci0JaW50IG1pc3Npbmc7Ci0KLQltaXNzaW5nID0gY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGxlbik7Ci0JaWYgKG1pc3NpbmcpIHsKLQkJbWVtc2V0KGRzdCArIGxlbiAtIG1pc3NpbmcsIDAsIG1pc3NpbmcpOworCWlmICh1bmxpa2VseShjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKSkpCiAJCSplcnJfcHRyID0gLUVGQVVMVDsKLQl9Ci0JCQogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCA1ZDdlOGNmLi5kMzUwZWQ5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC04LDcgKzgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogCiAjZGVmaW5lIF9fVFlQRV9JU19QVFIodCkgKCFfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wKHR5cGVvZigwPyh0KTA6MFVMTCksIHU2NCkpCi0jZGVmaW5lIF9fU0NfREVMT1VTRSh0LHYpICh0KShfX1RZUEVfSVNfUFRSKHQpID8gKCh2KSAmIDB4N2ZmZmZmZmYpIDogKHYpKQorCisjZGVmaW5lIF9fU0NfREVMT1VTRSh0LHYpICh7IFwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHQpID4gNCAmJiAhX19UWVBFX0lTX1BUUih0KSk7IFwKKwkodCkoX19UWVBFX0lTX1BUUih0KSA/ICgodikgJiAweDdmZmZmZmZmKSA6ICh2KSk7IFwKK30pCiAKICNkZWZpbmUgUFNXMzJfTUFTS19QRVIJCTB4NDAwMDAwMDBVTAogI2RlZmluZSBQU1czMl9NQVNLX0RBVAkJMHgwNDAwMDAwMFVMCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnV0ZXguaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mdXRleC5oCmluZGV4IDUxYmNhYTAuLmZkYTQ2YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mdXRleC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mdXRleC5oCkBAIC01LDcgKzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZ1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCB1MzIgX191c2VyICp1YWRkcikKK2ludCBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1MzIgKnV2YWwsIHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgb2xkdmFsLCB1MzIgbmV3dmFsKTsKK2ludCBfX2Z1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IG9wLCB1MzIgX191c2VyICp1YWRkciwgaW50IG9wYXJnLCBpbnQgKm9sZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGZ1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IGVuY29kZWRfb3AsIHUzMiBfX3VzZXIgKnVhZGRyKQogewogCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CiAJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OwpAQCAtMTcsNyArMjAsNyBAQAogCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CiAKIAlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCXJldCA9IHVhY2Nlc3MuZnV0ZXhfYXRvbWljX29wKG9wLCB1YWRkciwgb3BhcmcsICZvbGR2YWwpOworCXJldCA9IF9fZnV0ZXhfYXRvbWljX29wX2ludXNlcihvcCwgdWFkZHIsIG9wYXJnLCAmb2xkdmFsKTsKIAlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewpAQCAtMzQsMTAgKzM3LDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1MzIgKnV2YWwsIHUzMiBfX3VzZXIgKnVhZGRyLAotCQkJCQkJdTMyIG9sZHZhbCwgdTMyIG5ld3ZhbCkKLXsKLQlyZXR1cm4gdWFjY2Vzcy5mdXRleF9hdG9taWNfY21weGNoZyh1dmFsLCB1YWRkciwgb2xkdmFsLCBuZXd2YWwpOwotfQotCiAjZW5kaWYgLyogX0FTTV9TMzkwX0ZVVEVYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggZWVmM2RkMy4uOWJmOTViYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTEwNiw3ICsxMDYsOSBAQAogCV9fdTY0CWdiZWE7CQkJLyogMHgwMTgwICovCiAJX191OAlyZXNlcnZlZDE4OFsyNF07CS8qIDB4MDE4OCAqLwogCV9fdTMyCWZhYzsJCQkvKiAweDAxYTAgKi8KLQlfX3U4CXJlc2VydmVkMWE0WzY4XTsJLyogMHgwMWE0ICovCisJX191OAlyZXNlcnZlZDFhNFsyMF07CS8qIDB4MDFhNCAqLworCV9fdTY0CWNicmxvOwkJCS8qIDB4MDFiOCAqLworCV9fdTgJcmVzZXJ2ZWQxYzBbNDBdOwkvKiAweDAxYzAgKi8KIAlfX3U2NAlpdGRiYTsJCQkvKiAweDAxZTggKi8KIAlfX3U4CXJlc2VydmVkMWYwWzE2XTsJLyogMHgwMWYwICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpAQCAtMTU1LDYgKzE1Nyw3IEBACiAJdTMyIGluc3RydWN0aW9uX3N0c2k7CiAJdTMyIGluc3RydWN0aW9uX3N0Zmw7CiAJdTMyIGluc3RydWN0aW9uX3Rwcm90OworCXUzMiBpbnN0cnVjdGlvbl9lc3NhOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlX3J1bm5pbmc7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3BfZXh0ZXJuYWxfY2FsbDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggNWQxZjk1MC4uMzgxNDliNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTQ4LDEzICs0OCw0MiBAQAogc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAogCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQljcHVtYXNrX3NldF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbV9jcHVtYXNrKG5leHQpKTsKLQl1cGRhdGVfbW0obmV4dCwgdHNrKTsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKHByZXYgPT0gbmV4dCkKKwkJcmV0dXJuOworCWlmIChhdG9taWNfaW5jX3JldHVybigmbmV4dC0+Y29udGV4dC5hdHRhY2hfY291bnQpID4+IDE2KSB7CisJCS8qIERlbGF5IHVwZGF0ZV9tbSB1bnRpbCBhbGwgVExCIGZsdXNoZXMgYXJlIGRvbmUuICovCisJCXNldF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfVExCX1dBSVQpOworCX0gZWxzZSB7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpOworCQl1cGRhdGVfbW0obmV4dCwgdHNrKTsKKwkJaWYgKG5leHQtPmNvbnRleHQuZmx1c2hfbW0pCisJCQkvKiBGbHVzaCBwZW5kaW5nIFRMQnMgKi8KKwkJCV9fdGxiX2ZsdXNoX21tKG5leHQpOworCX0KIAlhdG9taWNfZGVjKCZwcmV2LT5jb250ZXh0LmF0dGFjaF9jb3VudCk7CiAJV0FSTl9PTihhdG9taWNfcmVhZCgmcHJldi0+Y29udGV4dC5hdHRhY2hfY291bnQpIDwgMCk7Ci0JYXRvbWljX2luYygmbmV4dC0+Y29udGV4dC5hdHRhY2hfY291bnQpOwotCS8qIENoZWNrIGZvciBUTEJzIG5vdCBmbHVzaGVkIHlldCAqLwotCV9fdGxiX2ZsdXNoX21tX2xhenkobmV4dCk7Cit9CisKKyNkZWZpbmUgZmluaXNoX2FyY2hfcG9zdF9sb2NrX3N3aXRjaCBmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoCitzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2FyY2hfcG9zdF9sb2NrX3N3aXRjaCh2b2lkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHRzay0+bW07CisKKwlpZiAoIXRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1RMQl9XQUlUKSkKKwkJcmV0dXJuOworCXByZWVtcHRfZGlzYWJsZSgpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9UTEJfV0FJVCk7CisJd2hpbGUgKGF0b21pY19yZWFkKCZtbS0+Y29udGV4dC5hdHRhY2hfY291bnQpID4+IDE2KQorCQljcHVfcmVsYXgoKTsKKworCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobW0pKTsKKwl1cGRhdGVfbW0obW0sIHRzayk7CisJaWYgKG1tLT5jb250ZXh0LmZsdXNoX21tKQorCQlfX3RsYl9mbHVzaF9tbShtbSk7CisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogI2RlZmluZSBlbnRlcl9sYXp5X3RsYihtbSx0c2spCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCmluZGV4IGUxNDA4ZGQuLjg4NDAxN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApAQCAtMjIsNiArMjIsNyBAQAogdm9pZCBwYWdlX3RhYmxlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nICopOwogdm9pZCBwYWdlX3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCBtbXVfZ2F0aGVyICosIHVuc2lnbmVkIGxvbmcgKik7CiAKK3ZvaWQgcGFnZV90YWJsZV9yZXNldF9wZ3N0ZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogaW50IHNldF9ndWVzdF9zdG9yYWdlX2tleShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICB1bnNpZ25lZCBsb25nIGtleSwgYm9vbCBucSk7CiAKQEAgLTkxLDExICs5MiwyMiBAQAogc3RhdGljIGlubGluZSBwbWRfdCAqcG1kX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2bWFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyAqdGFibGUgPSBjcnN0X3RhYmxlX2FsbG9jKG1tKTsKLQlpZiAodGFibGUpCi0JCWNyc3RfdGFibGVfaW5pdCh0YWJsZSwgX1NFR01FTlRfRU5UUllfRU1QVFkpOworCisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisJY3JzdF90YWJsZV9pbml0KHRhYmxlLCBfU0VHTUVOVF9FTlRSWV9FTVBUWSk7CisJaWYgKCFwZ3RhYmxlX3BtZF9wYWdlX2N0b3IodmlydF90b19wYWdlKHRhYmxlKSkpIHsKKwkJY3JzdF90YWJsZV9mcmVlKG1tLCB0YWJsZSk7CisJCXJldHVybiBOVUxMOworCX0KIAlyZXR1cm4gKHBtZF90ICopIHRhYmxlOwogfQotI2RlZmluZSBwbWRfZnJlZShtbSwgcG1kKSBjcnN0X3RhYmxlX2ZyZWUobW0sICh1bnNpZ25lZCBsb25nICopIHBtZCkKKworc3RhdGljIGlubGluZSB2b2lkIHBtZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKQoreworCXBndGFibGVfcG1kX3BhZ2VfZHRvcih2aXJ0X3RvX3BhZ2UocG1kKSk7CisJY3JzdF90YWJsZV9mcmVlKG1tLCAodW5zaWduZWQgbG9uZyAqKSBwbWQpOworfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGdkX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkLCBwdWRfdCAqcHVkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggMjIwNDQwMC4uMWFiNzVlYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yMjksNiArMjI5LDcgQEAKICNkZWZpbmUgX1BBR0VfUkVBRAkweDAxMAkJLyogU1cgcHRlIHJlYWQgYml0ICovCiAjZGVmaW5lIF9QQUdFX1dSSVRFCTB4MDIwCQkvKiBTVyBwdGUgd3JpdGUgYml0ICovCiAjZGVmaW5lIF9QQUdFX1NQRUNJQUwJMHgwNDAJCS8qIFNXIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWFsIHBhZ2UgKi8KKyNkZWZpbmUgX1BBR0VfVU5VU0VECTB4MDgwCQkvKiBTVyBiaXQgZm9yIHBnc3RlIHVzYWdlIHN0YXRlICovCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TUEVDSUFMCiAKIC8qIFNldCBvZiBiaXRzIG5vdCBjaGFuZ2VkIGluIHB0ZV9tb2RpZnkgKi8KQEAgLTM5NCw2ICszOTUsMTIgQEAKIAogI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCisvKiBHdWVzdCBQYWdlIFN0YXRlIHVzZWQgZm9yIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIF9QR1NURV9HUFNfWkVSTwkJMHgwMDAwMDAwMDgwMDAwMDAwVUwKKyNkZWZpbmUgX1BHU1RFX0dQU19VU0FHRV9NQVNLCTB4MDAwMDAwMDAwMzAwMDAwMFVMCisjZGVmaW5lIF9QR1NURV9HUFNfVVNBR0VfU1RBQkxFIDB4MDAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIF9QR1NURV9HUFNfVVNBR0VfVU5VU0VEIDB4MDAwMDAwMDAwMTAwMDAwMFVMCisKIC8qCiAgKiBBIHVzZXIgcGFnZSB0YWJsZSBwb2ludGVyIGhhcyB0aGUgc3BhY2Utc3dpdGNoLWV2ZW50IGJpdCwgdGhlCiAgKiBwcml2YXRlLXNwYWNlLWNvbnRyb2wgYml0IGFuZCB0aGUgc3RvcmFnZS1hbHRlcmF0aW9uLWV2ZW50LWNvbnRyb2wKQEAgLTYxNyw2ICs2MjQsMTQgQEAKIAlyZXR1cm4gcHRlX3ZhbChwdGUpID09IF9QQUdFX0lOVkFMSUQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9zd2FwKHB0ZV90IHB0ZSkKK3sKKwkvKiBCaXQgcGF0dGVybjogKHB0ZSAmIDB4NjAzKSA9PSAweDQwMiAqLworCXJldHVybiAocHRlX3ZhbChwdGUpICYgKF9QQUdFX0lOVkFMSUQgfCBfUEFHRV9QUk9URUNUIHwKKwkJCQlfUEFHRV9UWVBFIHwgX1BBR0VfUFJFU0VOVCkpCisJCT09IChfUEFHRV9JTlZBTElEIHwgX1BBR0VfVFlQRSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkKIHsKIAkvKiBCaXQgcGF0dGVybjogKHB0ZSAmIDB4NjAxKSA9PSAweDYwMCAqLwpAQCAtODIxLDIwICs4MzYsMjAgQEAKIHVuc2lnbmVkIGxvbmcgX19nbWFwX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGdtYXAgKik7CiB1bnNpZ25lZCBsb25nIGdtYXBfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqKTsKIHZvaWQgZ21hcF9kaXNjYXJkKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyB0bywgc3RydWN0IGdtYXAgKik7Cit2b2lkIF9fZ21hcF96YXAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqKTsKIAogdm9pZCBnbWFwX3JlZ2lzdGVyX2lwdGVfbm90aWZpZXIoc3RydWN0IGdtYXBfbm90aWZpZXIgKik7CiB2b2lkIGdtYXBfdW5yZWdpc3Rlcl9pcHRlX25vdGlmaWVyKHN0cnVjdCBnbWFwX25vdGlmaWVyICopOwogaW50IGdtYXBfaXB0ZV9ub3RpZnkoc3RydWN0IGdtYXAgKiwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pOwotdm9pZCBnbWFwX2RvX2lwdGVfbm90aWZ5KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqKTsKK3ZvaWQgZ21hcF9kb19pcHRlX25vdGlmeShzdHJ1Y3QgbW1fc3RydWN0ICosIHB0ZV90ICopOwogCiBzdGF0aWMgaW5saW5lIHBnc3RlX3QgcGdzdGVfaXB0ZV9ub3RpZnkoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkJcHRlX3QgKnB0ZXAsIHBnc3RlX3QgcGdzdGUpCiB7CiAjaWZkZWYgQ09ORklHX1BHU1RFCiAJaWYgKHBnc3RlX3ZhbChwZ3N0ZSkgJiBQR1NURV9JTl9CSVQpIHsKIAkJcGdzdGVfdmFsKHBnc3RlKSAmPSB+UEdTVEVfSU5fQklUOwotCQlnbWFwX2RvX2lwdGVfbm90aWZ5KG1tLCBhZGRyLCBwdGVwKTsKKwkJZ21hcF9kb19pcHRlX25vdGlmeShtbSwgcHRlcCk7CiAJfQogI2VuZGlmCiAJcmV0dXJuIHBnc3RlOwpAQCAtODUyLDYgKzg2Nyw3IEBACiAKIAlpZiAobW1faGFzX3Bnc3RlKG1tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOworCQlwZ3N0ZV92YWwocGdzdGUpICY9IH5fUEdTVEVfR1BTX1pFUk87CiAJCXBnc3RlX3NldF9rZXkocHRlcCwgcGdzdGUsIGVudHJ5KTsKIAkJcGdzdGVfc2V0X3B0ZShwdGVwLCBlbnRyeSk7CiAJCXBnc3RlX3NldF91bmxvY2socHRlcCwgcGdzdGUpOwpAQCAtODgxLDYgKzg5NywxMiBAQAogCXJldHVybiAocHRlX3ZhbChwdGUpICYgX1BBR0VfWU9VTkcpICE9IDA7CiB9CiAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1VOVVNFRAorc3RhdGljIGlubGluZSBpbnQgcHRlX3VudXNlZChwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VOVVNFRDsKK30KKwogLyoKICAqIHBnZC9wbWQvcHRlIG1vZGlmaWNhdGlvbiBmdW5jdGlvbnMKICAqLwpAQCAtMTAzNCwzMCArMTA1Niw0MSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19wdGVwX2lwdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKIHsKLQlpZiAoIShwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX0lOVkFMSUQpKSB7CisJdW5zaWduZWQgbG9uZyBwdG8gPSAodW5zaWduZWQgbG9uZykgcHRlcDsKKwogI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkJLyogcHRvIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50IHRhYmxlICovCi0JCXB0ZV90ICpwdG8gPSAocHRlX3QgKikgKCgodW5zaWduZWQgbG9uZykgcHRlcCkgJiAweDdmZmZmYzAwKTsKLSNlbHNlCi0JCS8qIGlwdGUgaW4gemFyY2ggbW9kZSBjYW4gZG8gdGhlIG1hdGggKi8KLQkJcHRlX3QgKnB0byA9IHB0ZXA7CisJLyogcHRvIGluIEVTQSBtb2RlIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50IHRhYmxlICovCisJcHRvICY9IDB4N2ZmZmZjMDA7CiAjZW5kaWYKLQkJYXNtIHZvbGF0aWxlKAotCQkJIglpcHRlCSUyLCUzIgotCQkJOiAiPW0iICgqcHRlcCkgOiAibSIgKCpwdGVwKSwKLQkJCSAgImEiIChwdG8pLCAiYSIgKGFkZHJlc3MpKTsKLQl9CisJLyogSW52YWxpZGF0aW9uICsgZ2xvYmFsIFRMQiBmbHVzaCBmb3IgdGhlIHB0ZSAqLworCWFzbSB2b2xhdGlsZSgKKwkJIglpcHRlCSUyLCUzIgorCQk6ICI9bSIgKCpwdGVwKSA6ICJtIiAoKnB0ZXApLCAiYSIgKHB0byksICJhIiAoYWRkcmVzcykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlcF9mbHVzaF9kaXJlY3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQoreworCWlmIChwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX0lOVkFMSUQpCisJCXJldHVybjsKKwlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB0ZXBfZmx1c2hfbGF6eShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQogewotCWludCBhY3RpdmUgPSAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKSA/IDEgOiAwOworCWludCBhY3RpdmUsIGNvdW50OwogCi0JaWYgKGF0b21pY19yZWFkKCZtbS0+Y29udGV4dC5hdHRhY2hfY291bnQpID4gYWN0aXZlKQotCQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKLQllbHNlCisJaWYgKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfSU5WQUxJRCkKKwkJcmV0dXJuOworCWFjdGl2ZSA9IChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pID8gMSA6IDA7CisJY291bnQgPSBhdG9taWNfYWRkX3JldHVybigweDEwMDAwLCAmbW0tPmNvbnRleHQuYXR0YWNoX2NvdW50KTsKKwlpZiAoKGNvdW50ICYgMHhmZmZmKSA8PSBhY3RpdmUpIHsKKwkJcHRlX3ZhbCgqcHRlcCkgfD0gX1BBR0VfSU5WQUxJRDsKIAkJbW0tPmNvbnRleHQuZmx1c2hfbW0gPSAxOworCX0gZWxzZQorCQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKKwlhdG9taWNfc3ViKDB4MTAwMDAsICZtbS0+Y29udGV4dC5hdHRhY2hfY291bnQpOwogfQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKQEAgLTEwNzAsMTEgKzExMDMsMTEgQEAKIAogCWlmIChtbV9oYXNfcGdzdGUodm1hLT52bV9tbSkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV9nZXRfbG9jayhwdGVwKTsKLQkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeSh2bWEtPnZtX21tLCBhZGRyLCBwdGVwLCBwZ3N0ZSk7CisJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkodm1hLT52bV9tbSwgcHRlcCwgcGdzdGUpOwogCX0KIAogCXB0ZSA9ICpwdGVwOwotCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXApOworCXB0ZXBfZmx1c2hfZGlyZWN0KHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXApOwogCXlvdW5nID0gcHRlX3lvdW5nKHB0ZSk7CiAJcHRlID0gcHRlX21rb2xkKHB0ZSk7CiAKQEAgLTExMTYsNyArMTE0OSw3IEBACiAKIAlpZiAobW1faGFzX3Bnc3RlKG1tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOwotCQlwZ3N0ZSA9IHBnc3RlX2lwdGVfbm90aWZ5KG1tLCBhZGRyZXNzLCBwdGVwLCBwZ3N0ZSk7CisJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkobW0sIHB0ZXAsIHBnc3RlKTsKIAl9CiAKIAlwdGUgPSAqcHRlcDsKQEAgLTExNDAsMTIgKzExNzMsMTEgQEAKIAogCWlmIChtbV9oYXNfcGdzdGUobW0pKSB7CiAJCXBnc3RlID0gcGdzdGVfZ2V0X2xvY2socHRlcCk7Ci0JCXBnc3RlX2lwdGVfbm90aWZ5KG1tLCBhZGRyZXNzLCBwdGVwLCBwZ3N0ZSk7CisJCXBnc3RlX2lwdGVfbm90aWZ5KG1tLCBwdGVwLCBwZ3N0ZSk7CiAJfQogCiAJcHRlID0gKnB0ZXA7CiAJcHRlcF9mbHVzaF9sYXp5KG1tLCBhZGRyZXNzLCBwdGVwKTsKLQlwdGVfdmFsKCpwdGVwKSB8PSBfUEFHRV9JTlZBTElEOwogCiAJaWYgKG1tX2hhc19wZ3N0ZShtbSkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV91cGRhdGVfYWxsKCZwdGUsIHBnc3RlKTsKQEAgLTExNzgsMTQgKzEyMTAsMTcgQEAKIAogCWlmIChtbV9oYXNfcGdzdGUodm1hLT52bV9tbSkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV9nZXRfbG9jayhwdGVwKTsKLQkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeSh2bWEtPnZtX21tLCBhZGRyZXNzLCBwdGVwLCBwZ3N0ZSk7CisJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkodm1hLT52bV9tbSwgcHRlcCwgcGdzdGUpOwogCX0KIAogCXB0ZSA9ICpwdGVwOwotCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworCXB0ZXBfZmx1c2hfZGlyZWN0KHZtYS0+dm1fbW0sIGFkZHJlc3MsIHB0ZXApOwogCXB0ZV92YWwoKnB0ZXApID0gX1BBR0VfSU5WQUxJRDsKIAogCWlmIChtbV9oYXNfcGdzdGUodm1hLT52bV9tbSkpIHsKKwkJaWYgKChwZ3N0ZV92YWwocGdzdGUpICYgX1BHU1RFX0dQU19VU0FHRV9NQVNLKSA9PQorCQkgICAgX1BHU1RFX0dQU19VU0FHRV9VTlVTRUQpCisJCQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVU5VU0VEOwogCQlwZ3N0ZSA9IHBnc3RlX3VwZGF0ZV9hbGwoJnB0ZSwgcGdzdGUpOwogCQlwZ3N0ZV9zZXRfdW5sb2NrKHB0ZXAsIHBnc3RlKTsKIAl9CkBAIC0xMjA5LDcgKzEyNDQsNyBAQAogCiAJaWYgKCFmdWxsICYmIG1tX2hhc19wZ3N0ZShtbSkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV9nZXRfbG9jayhwdGVwKTsKLQkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeShtbSwgYWRkcmVzcywgcHRlcCwgcGdzdGUpOworCQlwZ3N0ZSA9IHBnc3RlX2lwdGVfbm90aWZ5KG1tLCBwdGVwLCBwZ3N0ZSk7CiAJfQogCiAJcHRlID0gKnB0ZXA7CkBAIC0xMjM0LDcgKzEyNjksNyBAQAogCWlmIChwdGVfd3JpdGUocHRlKSkgewogCQlpZiAobW1faGFzX3Bnc3RlKG1tKSkgewogCQkJcGdzdGUgPSBwZ3N0ZV9nZXRfbG9jayhwdGVwKTsKLQkJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkobW0sIGFkZHJlc3MsIHB0ZXAsIHBnc3RlKTsKKwkJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkobW0sIHB0ZXAsIHBnc3RlKTsKIAkJfQogCiAJCXB0ZXBfZmx1c2hfbGF6eShtbSwgYWRkcmVzcywgcHRlcCk7CkBAIC0xMjYwLDEwICsxMjk1LDEwIEBACiAJCXJldHVybiAwOwogCWlmIChtbV9oYXNfcGdzdGUodm1hLT52bV9tbSkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV9nZXRfbG9jayhwdGVwKTsKLQkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeSh2bWEtPnZtX21tLCBhZGRyZXNzLCBwdGVwLCBwZ3N0ZSk7CisJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkodm1hLT52bV9tbSwgcHRlcCwgcGdzdGUpOwogCX0KIAotCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworCXB0ZXBfZmx1c2hfZGlyZWN0KHZtYS0+dm1fbW0sIGFkZHJlc3MsIHB0ZXApOwogCiAJaWYgKG1tX2hhc19wZ3N0ZSh2bWEtPnZtX21tKSkgewogCQlwZ3N0ZV9zZXRfcHRlKHB0ZXAsIGVudHJ5KTsKQEAgLTE0NDcsMTIgKzE0ODIsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWRwX2ZsdXNoX2xhenkoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCkKIHsKLQlpbnQgYWN0aXZlID0gKG1tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkgPyAxIDogMDsKKwlpbnQgYWN0aXZlLCBjb3VudDsKIAotCWlmICgoYXRvbWljX3JlYWQoJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCkgJiAweGZmZmYpID4gYWN0aXZlKQotCQlfX3BtZF9pZHRlKGFkZHJlc3MsIHBtZHApOwotCWVsc2UKKwlhY3RpdmUgPSAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKSA/IDEgOiAwOworCWNvdW50ID0gYXRvbWljX2FkZF9yZXR1cm4oMHgxMDAwMCwgJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCk7CisJaWYgKChjb3VudCAmIDB4ZmZmZikgPD0gYWN0aXZlKSB7CisJCXBtZF92YWwoKnBtZHApIHw9IF9TRUdNRU5UX0VOVFJZX0lOVkFMSUQ7CiAJCW1tLT5jb250ZXh0LmZsdXNoX21tID0gMTsKKwl9IGVsc2UKKwkJX19wbWRfaWR0ZShhZGRyZXNzLCBwbWRwKTsKKwlhdG9taWNfc3ViKDB4MTAwMDAsICZtbS0+Y29udGV4dC5hdHRhY2hfY291bnQpOwogfQogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggOWM4MmNlYi4uZjQ3ODNjMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtODMsNiArODMsNyBAQAogICogVGhlc2UgYXJlIGRlZmluZWQgYXMgcGVyIGxpbnV4L3B0cmFjZS5oLCB3aGljaCBzZWUuCiAgKi8KICNkZWZpbmUgYXJjaF9oYXNfc2luZ2xlX3N0ZXAoKQkoMSkKKyNkZWZpbmUgYXJjaF9oYXNfYmxvY2tfc3RlcCgpCSgxKQogCiAjZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoKChyZWdzKS0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpICE9IDApCiAjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NjbHAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zY2xwLmgKaW5kZXggYWJhY2EyMi4uMmY1ZTk5MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NjbHAuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2NscC5oCkBAIC00Niw2ICs0Niw3IEBACiBpbnQgc2NscF9jcHVfZGVjb25maWd1cmUodTggY3B1KTsKIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2xwX2dldF9ybm1heCh2b2lkKTsKIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2xwX2dldF9yem0odm9pZCk7Cit1bnNpZ25lZCBpbnQgc2NscF9nZXRfbWF4X2NwdSh2b2lkKTsKIGludCBzY2xwX3NkaWFzX2Jsa19jb3VudCh2b2lkKTsKIGludCBzY2xwX3NkaWFzX2NvcHkodm9pZCAqZGVzdCwgaW50IGJsa19udW0sIGludCBucl9ibGtzKTsKIGludCBzY2xwX2NocF9jb25maWd1cmUoc3RydWN0IGNocF9pZCBjaHBpZCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IDk0Y2ZiZTQuLjQwNmYzYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC01OSw3ICs1OSw2IEBACiAjZGVmaW5lIE1BQ0hJTkVfRkxBR19ESUFHNDQJKDFVTCA8PCA0KQogI2RlZmluZSBNQUNISU5FX0ZMQUdfSURURQkoMVVMIDw8IDUpCiAjZGVmaW5lIE1BQ0hJTkVfRkxBR19ESUFHOUMJKDFVTCA8PCA2KQotI2RlZmluZSBNQUNISU5FX0ZMQUdfTVZDT1MJKDFVTCA8PCA3KQogI2RlZmluZSBNQUNISU5FX0ZMQUdfS1ZNCSgxVUwgPDwgOCkKICNkZWZpbmUgTUFDSElORV9GTEFHX0VTT1AJKDFVTCA8PCA5KQogI2RlZmluZSBNQUNISU5FX0ZMQUdfRURBVDEJKDFVTCA8PCAxMCkKQEAgLTg1LDcgKzg0LDYgQEAKICNkZWZpbmUgTUFDSElORV9IQVNfSURURQkoMCkKICNkZWZpbmUgTUFDSElORV9IQVNfRElBRzQ0CSgxKQogI2RlZmluZSBNQUNISU5FX0hBU19NVlBHCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19NVlBHKQotI2RlZmluZSBNQUNISU5FX0hBU19NVkNPUwkoMCkKICNkZWZpbmUgTUFDSElORV9IQVNfRURBVDEJKDApCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0VEQVQyCSgwKQogI2RlZmluZSBNQUNISU5FX0hBU19MUFAJCSgwKQpAQCAtOTgsNyArOTYsNiBAQAogI2RlZmluZSBNQUNISU5FX0hBU19JRFRFCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19JRFRFKQogI2RlZmluZSBNQUNISU5FX0hBU19ESUFHNDQJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX0RJQUc0NCkKICNkZWZpbmUgTUFDSElORV9IQVNfTVZQRwkoMSkKLSNkZWZpbmUgTUFDSElORV9IQVNfTVZDT1MJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX01WQ09TKQogI2RlZmluZSBNQUNISU5FX0hBU19FREFUMQkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfRURBVDEpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0VEQVQyCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19FREFUMikKICNkZWZpbmUgTUFDSElORV9IQVNfTFBQCQkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfTFBQKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAxMGUwZmNkLi4zY2NkNzFiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtODEsNiArODEsNyBAQAogI2RlZmluZSBUSUZfTk9USUZZX1JFU1VNRQkxCS8qIGNhbGxiYWNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdXNlciAqLwogI2RlZmluZSBUSUZfU0lHUEVORElORwkJMgkvKiBzaWduYWwgcGVuZGluZyAqLwogI2RlZmluZSBUSUZfTkVFRF9SRVNDSEVECTMJLyogcmVzY2hlZHVsaW5nIG5lY2Vzc2FyeSAqLworI2RlZmluZSBUSUZfVExCX1dBSVQJCTQJLyogd2FpdCBmb3IgVExCIGZsdXNoIGNvbXBsZXRpb24gKi8KICNkZWZpbmUgVElGX1BFUl9UUkFQCQk2CS8qIGRlbGl2ZXIgc2lndHJhcCBvbiByZXR1cm4gdG8gdXNlciAqLwogI2RlZmluZSBUSUZfTUNDS19QRU5ESU5HCTcJLyogbWFjaGluZSBjaGVjayBoYW5kbGluZyBpcyBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTgJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KQEAgLTkxLDExICs5MiwxMyBAQAogI2RlZmluZSBUSUZfTUVNRElFCQkxOAkvKiBpcyB0ZXJtaW5hdGluZyBkdWUgdG8gT09NIGtpbGxlciAqLwogI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTE5CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KICNkZWZpbmUgVElGX1NJTkdMRV9TVEVQCQkyMAkvKiBUaGlzIHRhc2sgaXMgc2luZ2xlIHN0ZXBwZWQgKi8KKyNkZWZpbmUgVElGX0JMT0NLX1NURVAJCTIxCS8qIFRoaXMgdGFzayBpcyBibG9jayBzdGVwcGVkICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMCQkoMTw8VElGX1NZU0NBTEwpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDE8PFRJRl9TSUdQRU5ESU5HKQogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKKyNkZWZpbmUgX1RJRl9UTEJfV0FJVAkJKDE8PFRJRl9UTEJfV0FJVCkKICNkZWZpbmUgX1RJRl9QRVJfVFJBUAkJKDE8PFRJRl9QRVJfVFJBUCkKICNkZWZpbmUgX1RJRl9NQ0NLX1BFTkRJTkcJKDE8PFRJRl9NQ0NLX1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA3OTMzMGFmLi40MTMzYjNmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTkyLDMzICs5Miw1OCBAQAogI2RlZmluZSBBUkNIX0hBU19TT1JUX0VYVEFCTEUKICNkZWZpbmUgQVJDSF9IQVNfU0VBUkNIX0VYVEFCTEUKIAotc3RydWN0IHVhY2Nlc3Nfb3BzIHsKLQlzaXplX3QgKCpjb3B5X2Zyb21fdXNlcikoc2l6ZV90LCBjb25zdCB2b2lkIF9fdXNlciAqLCB2b2lkICopOwotCXNpemVfdCAoKmNvcHlfdG9fdXNlcikoc2l6ZV90LCB2b2lkIF9fdXNlciAqLCBjb25zdCB2b2lkICopOwotCXNpemVfdCAoKmNvcHlfaW5fdXNlcikoc2l6ZV90LCB2b2lkIF9fdXNlciAqLCBjb25zdCB2b2lkIF9fdXNlciAqKTsKLQlzaXplX3QgKCpjbGVhcl91c2VyKShzaXplX3QsIHZvaWQgX191c2VyICopOwotCXNpemVfdCAoKnN0cm5sZW5fdXNlcikoc2l6ZV90LCBjb25zdCBjaGFyIF9fdXNlciAqKTsKLQlzaXplX3QgKCpzdHJuY3B5X2Zyb21fdXNlcikoc2l6ZV90LCBjb25zdCBjaGFyIF9fdXNlciAqLCBjaGFyICopOwotCWludCAoKmZ1dGV4X2F0b21pY19vcCkoaW50IG9wLCB1MzIgX191c2VyICosIGludCBvcGFyZywgaW50ICpvbGQpOwotCWludCAoKmZ1dGV4X2F0b21pY19jbXB4Y2hnKSh1MzIgKiwgdTMyIF9fdXNlciAqLCB1MzIgb2xkLCB1MzIgbmV3KTsKLX07CitpbnQgX19oYW5kbGVfZmF1bHQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKIAotZXh0ZXJuIHN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzOwotZXh0ZXJuIHN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzX212Y29zOwotZXh0ZXJuIHN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzX3B0OworLyoqCisgKiBfX2NvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KKyAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBuOgkgIE51bWJlciBvZiBieXRlcyB0byBjb3B5LgorICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LglUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCisgKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqCisgKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCisgKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgorICovCit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgbik7CiAKLWV4dGVybiBpbnQgX19oYW5kbGVfZmF1bHQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKKy8qKgorICogX19jb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCisgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgorICogQG46CSAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuCVRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENvcHkgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKKyAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICovCit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBuKTsKIAotc3RhdGljIGlubGluZSBpbnQgX19wdXRfdXNlcl9mbihzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcHV0X3VzZXJfZm4odm9pZCAqeCwgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXNpemUgPSB1YWNjZXNzLmNvcHlfdG9fdXNlcihzaXplLCBwdHIsIHgpOwotCXJldHVybiBzaXplID8gLUVGQVVMVCA6IHNpemU7CisJc2l6ZSA9IF9fY29weV90b191c2VyKHB0ciwgeCwgc2l6ZSk7CisJcmV0dXJuIHNpemUgPyAtRUZBVUxUIDogMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19nZXRfdXNlcl9mbihzaXplX3Qgc2l6ZSwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKK3N0YXRpYyBpbmxpbmUgaW50IF9fZ2V0X3VzZXJfZm4odm9pZCAqeCwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXNpemUgPSB1YWNjZXNzLmNvcHlfZnJvbV91c2VyKHNpemUsIHB0ciwgeCk7Ci0JcmV0dXJuIHNpemUgPyAtRUZBVUxUIDogc2l6ZTsKKwlzaXplID0gX19jb3B5X2Zyb21fdXNlcih4LCBwdHIsIHNpemUpOworCXJldHVybiBzaXplID8gLUVGQVVMVCA6IDA7CiB9CiAKIC8qCkBAIC0xMzUsOCArMTYwLDggQEAKIAljYXNlIDI6CQkJCQkJCVwKIAljYXNlIDQ6CQkJCQkJCVwKIAljYXNlIDg6CQkJCQkJCVwKLQkJX19wdV9lcnIgPSBfX3B1dF91c2VyX2ZuKHNpemVvZiAoKihwdHIpKSwJXAotCQkJCQkgcHRyLCAmX194KTsJCVwKKwkJX19wdV9lcnIgPSBfX3B1dF91c2VyX2ZuKCZfX3gsIHB0ciwJCVwKKwkJCQkJIHNpemVvZigqKHB0cikpKTsJXAogCQlicmVhazsJCQkJCQlcCiAJZGVmYXVsdDoJCQkJCQlcCiAJCV9fcHV0X3VzZXJfYmFkKCk7CQkJCVwKQEAgLTE1Miw3ICsxNzcsNyBAQAogfSkKIAogCi1leHRlcm4gaW50IF9fcHV0X3VzZXJfYmFkKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitpbnQgX19wdXRfdXNlcl9iYWQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKIAogI2RlZmluZSBfX2dldF91c2VyKHgsIHB0cikJCQkJCVwKICh7CQkJCQkJCQlcCkBAIC0xNjEsMjkgKzE4NiwyOSBAQAogCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAogCWNhc2UgMTogewkJCQkJCVwKIAkJdW5zaWduZWQgY2hhciBfX3g7CQkJCVwKLQkJX19ndV9lcnIgPSBfX2dldF91c2VyX2ZuKHNpemVvZiAoKihwdHIpKSwJXAotCQkJCQkgcHRyLCAmX194KTsJCVwKKwkJX19ndV9lcnIgPSBfX2dldF91c2VyX2ZuKCZfX3gsIHB0ciwJCVwKKwkJCQkJIHNpemVvZigqKHB0cikpKTsJXAogCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX3g7CVwKIAkJYnJlYWs7CQkJCQkJXAogCX07CQkJCQkJCVwKIAljYXNlIDI6IHsJCQkJCQlcCiAJCXVuc2lnbmVkIHNob3J0IF9feDsJCQkJXAotCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oc2l6ZW9mICgqKHB0cikpLAlcCi0JCQkJCSBwdHIsICZfX3gpOwkJXAorCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAorCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgNDogewkJCQkJCVwKIAkJdW5zaWduZWQgaW50IF9feDsJCQkJXAotCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oc2l6ZW9mICgqKHB0cikpLAlcCi0JCQkJCSBwdHIsICZfX3gpOwkJXAorCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAorCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgODogewkJCQkJCVwKIAkJdW5zaWduZWQgbG9uZyBsb25nIF9feDsJCQkJXAotCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oc2l6ZW9mICgqKHB0cikpLAlcCi0JCQkJCSBwdHIsICZfX3gpOwkJXAorCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAorCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXApAQCAtMjAwLDM1ICsyMjUsMTIgQEAKIAlfX2dldF91c2VyKHgsIHB0cik7CQkJCQlcCiB9KQogCi1leHRlcm4gaW50IF9fZ2V0X3VzZXJfYmFkKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitpbnQgX19nZXRfdXNlcl9iYWQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKIAogI2RlZmluZSBfX3B1dF91c2VyX3VuYWxpZ25lZCBfX3B1dF91c2VyCiAjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkIF9fZ2V0X3VzZXIKIAogLyoqCi0gKiBfX2NvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KLSAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCi0gKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCi0gKgotICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KLSAqCi0gKiBDb3B5IGRhdGEgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCi0gKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCi0gKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawotX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JcmV0dXJuIHVhY2Nlc3MuY29weV90b191c2VyKG4sIHRvLCBmcm9tKTsKLX0KLQotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKLQotLyoqCiAgKiBjb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLgogICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCiAgKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KQEAgLTI0OCwzMCArMjUwLDcgQEAKIAlyZXR1cm4gX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOwogfQogCi0vKioKLSAqIF9fY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCi0gKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgotICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5LgotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UuICBDYWxsZXIgbXVzdCBjaGVjawotICogdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIGFjY2Vzc19vaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgotICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCi0gKgotICogSWYgc29tZSBkYXRhIGNvdWxkIG5vdCBiZSBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBwYWQgdGhlIGNvcGllZAotICogZGF0YSB0byB0aGUgcmVxdWVzdGVkIHNpemUgdXNpbmcgemVybyBieXRlcy4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawotX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlyZXR1cm4gdWFjY2Vzcy5jb3B5X2Zyb21fdXNlcihuLCBmcm9tLCB0byk7Ci19Ci0KLWV4dGVybiB2b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCit2b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCiAjaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCiBfX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQogI2VuZGlmCkBAIC0zMDYsMTEgKzI4NSw4IEBACiAJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCi1fX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JcmV0dXJuIHVhY2Nlc3MuY29weV9pbl91c2VyKG4sIHRvLCBmcm9tKTsKLX0KK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitfX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQpAQCAtMzIyLDE4ICsyOTgsMjIgQEAKIC8qCiAgKiBDb3B5IGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KICAqLworCitsb25nIF9fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKKwogc3RhdGljIGlubGluZSBsb25nIF9fbXVzdF9jaGVjawogc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQogewogCW1pZ2h0X2ZhdWx0KCk7Ci0JcmV0dXJuIHVhY2Nlc3Muc3RybmNweV9mcm9tX3VzZXIoY291bnQsIHNyYywgZHN0KTsKKwlyZXR1cm4gX19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqIHNyYywgdW5zaWduZWQgbG9uZyBuKQordW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgbG9uZyBuKQogewogCW1pZ2h0X2ZhdWx0KCk7Ci0JcmV0dXJuIHVhY2Nlc3Muc3Rybmxlbl91c2VyKG4sIHNyYyk7CisJcmV0dXJuIF9fc3Rybmxlbl91c2VyKHNyYywgbik7CiB9CiAKIC8qKgpAQCAtMzU1LDIxICszMzUsMTQgQEAKIC8qCiAgKiBaZXJvIFVzZXJzcGFjZQogICovCit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCi1fX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JcmV0dXJuIHVhY2Nlc3MuY2xlYXJfdXNlcihuLCB0byk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKLWNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJbWlnaHRfZmF1bHQoKTsKLQlyZXR1cm4gdWFjY2Vzcy5jbGVhcl91c2VyKG4sIHRvKTsKKwlyZXR1cm4gX19jbGVhcl91c2VyKHRvLCBuKTsKIH0KIAotZXh0ZXJuIGludCBjb3B5X3RvX3VzZXJfcmVhbCh2b2lkIF9fdXNlciAqZGVzdCwgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpOwotZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcl9yZWFsKHZvaWQgKmRlc3QsIHZvaWQgX191c2VyICpzcmMsIHNpemVfdCBjb3VudCk7CitpbnQgY29weV90b191c2VyX3JlYWwodm9pZCBfX3VzZXIgKmRlc3QsIHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKICNlbmRpZiAvKiBfX1MzOTBfVUFDQ0VTU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9wdHJhY2UuaCBiL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oCmluZGV4IDdlMGI0OTguLmExNTBmNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oCkBAIC00MDMsNiArNDAzLDEyIEBACiAjZGVmaW5lIFBUUkFDRV9URV9BQk9SVF9SQU5ECSAgICAgIDB4NTAxMQogCiAvKgorICogVGhlIG51bWJlcnMgY2hvc2VuIGhlcmUgYXJlIHNvbWV3aGF0IGFyYml0cmFyeSBidXQgYWJzb2x1dGVseSBNVVNUCisgKiBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgbnVtYmVyIGFzc2lnbmVkIGluIDxsaW51eC9wdHJhY2UuaD4uCisgKi8KKyNkZWZpbmUgUFRSQUNFX1NJTkdMRUJMT0NLCTEyCS8qIHJlc3VtZSBleGVjdXRpb24gdW50aWwgbmV4dCBicmFuY2ggKi8KKworLyoKICAqIFBUX1BST1QgZGVmaW5pdGlvbiBpcyBsb29zZWx5IGJhc2VkIG9uIGhwcGEgYnNkIGRlZmluaXRpb24gaW4KICAqIGdkYi9ocHBhYi1uYXQuYwogICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQppbmRleCAxYjNhYzA5Li5hOTVjNGNhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKQEAgLTQ3LDkgKzQ3LDggQEAKIG9iai0kKENPTkZJR19ISUJFUk5BVElPTikJKz0gc3VzcGVuZC5vIHN3c3VzcF9hc202NC5vCiBvYmotJChDT05GSUdfQVVESVQpCQkrPSBhdWRpdC5vCiBjb21wYXQtb2JqLSQoQ09ORklHX0FVRElUKQkrPSBjb21wYXRfYXVkaXQubwotb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdF9saW51eC5vIGNvbXBhdF9zaWduYWwubyBcCi0JCQkJCWNvbXBhdF93cmFwcGVyLm8gY29tcGF0X2V4ZWNfZG9tYWluLm8gXAotCQkJCQkkKGNvbXBhdC1vYmoteSkKK29iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXRfbGludXgubyBjb21wYXRfc2lnbmFsLm8KK29iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXRfd3JhcHBlci5vICQoY29tcGF0LW9iai15KQogCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkJKz0gc3RhY2t0cmFjZS5vCiBvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMubwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfZXhlY19kb21haW4uYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2V4ZWNfZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWZhYmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfZXhlY19kb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciAzMi1iaXQgTGludXggZm9yIFMzOTAgcGVyc29uYWxpdHkuCi0gKgotICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwCi0gKiBBdXRob3Iocyk6IEdlcmhhcmQgVG9ubiAodG9uQGRlLmlibS5jb20pCi0gKgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotc3RhdGljIHN0cnVjdCBleGVjX2RvbWFpbiBzMzkwX2V4ZWNfZG9tYWluOwotCi1zdGF0aWMgaW50IF9faW5pdCBzMzkwX2luaXQgKHZvaWQpCi17Ci0JczM5MF9leGVjX2RvbWFpbi5uYW1lID0gIkxpbnV4L3MzOTAiOwotCXMzOTBfZXhlY19kb21haW4uaGFuZGxlciA9IE5VTEw7Ci0JczM5MF9leGVjX2RvbWFpbi5wZXJzX2xvdyA9IFBFUl9MSU5VWDMyOwotCXMzOTBfZXhlY19kb21haW4ucGVyc19oaWdoID0gUEVSX0xJTlVYMzI7Ci0JczM5MF9leGVjX2RvbWFpbi5zaWduYWxfbWFwID0gZGVmYXVsdF9leGVjX2RvbWFpbi5zaWduYWxfbWFwOwotCXMzOTBfZXhlY19kb21haW4uc2lnbmFsX2ludm1hcCA9IGRlZmF1bHRfZXhlY19kb21haW4uc2lnbmFsX2ludm1hcDsKLQlyZWdpc3Rlcl9leGVjX2RvbWFpbigmczM5MF9leGVjX2RvbWFpbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLV9faW5pdGNhbGwoczM5MF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IGRiMDIwNTIuLmNhMzgxMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtODYsNDggKzg2LDUxIEBACiAjZGVmaW5lIFNFVF9TVEFUX1VJRChzdGF0LCB1aWQpCQkoc3RhdCkuc3RfdWlkID0gaGlnaDJsb3d1aWQodWlkKQogI2RlZmluZSBTRVRfU1RBVF9HSUQoc3RhdCwgZ2lkKQkJKHN0YXQpLnN0X2dpZCA9IGhpZ2gybG93Z2lkKGdpZCkKIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2Nob3duMTYoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdTE2IHVzZXIsIHUxNiBncm91cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoczM5MF9jaG93bjE2LCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwKKwkJICAgICAgIHUxNiwgdXNlciwgdTE2LCBncm91cCkKIHsKIAlyZXR1cm4gc3lzX2Nob3duKGZpbGVuYW1lLCBsb3cyaGlnaHVpZCh1c2VyKSwgbG93MmhpZ2hnaWQoZ3JvdXApKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2xjaG93bjE2KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIHUxNiB1c2VyLCB1MTYgZ3JvdXApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfbGNob3duMTYsIGNvbnN0IGNoYXIgX191c2VyICosCisJCSAgICAgICBmaWxlbmFtZSwgdTE2LCB1c2VyLCB1MTYsIGdyb3VwKQogewogCXJldHVybiBzeXNfbGNob3duKGZpbGVuYW1lLCBsb3cyaGlnaHVpZCh1c2VyKSwgbG93MmhpZ2hnaWQoZ3JvdXApKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2ZjaG93bjE2KHVuc2lnbmVkIGludCBmZCwgdTE2IHVzZXIsIHUxNiBncm91cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoczM5MF9mY2hvd24xNiwgdW5zaWduZWQgaW50LCBmZCwgdTE2LCB1c2VyLCB1MTYsIGdyb3VwKQogewogCXJldHVybiBzeXNfZmNob3duKGZkLCBsb3cyaGlnaHVpZCh1c2VyKSwgbG93MmhpZ2hnaWQoZ3JvdXApKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldHJlZ2lkMTYodTE2IHJnaWQsIHUxNiBlZ2lkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihzMzkwX3NldHJlZ2lkMTYsIHUxNiwgcmdpZCwgdTE2LCBlZ2lkKQogewogCXJldHVybiBzeXNfc2V0cmVnaWQobG93MmhpZ2hnaWQocmdpZCksIGxvdzJoaWdoZ2lkKGVnaWQpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGdpZDE2KHUxNiBnaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKHMzOTBfc2V0Z2lkMTYsIHUxNiwgZ2lkKQogewogCXJldHVybiBzeXNfc2V0Z2lkKChnaWRfdClnaWQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0cmV1aWQxNih1MTYgcnVpZCwgdTE2IGV1aWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHMzOTBfc2V0cmV1aWQxNiwgdTE2LCBydWlkLCB1MTYsIGV1aWQpCiB7CiAJcmV0dXJuIHN5c19zZXRyZXVpZChsb3cyaGlnaHVpZChydWlkKSwgbG93MmhpZ2h1aWQoZXVpZCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0dWlkMTYodTE2IHVpZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoczM5MF9zZXR1aWQxNiwgdTE2LCB1aWQpCiB7CiAJcmV0dXJuIHN5c19zZXR1aWQoKHVpZF90KXVpZCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXRyZXN1aWQxNih1MTYgcnVpZCwgdTE2IGV1aWQsIHUxNiBzdWlkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX3NldHJlc3VpZDE2LCB1MTYsIHJ1aWQsIHUxNiwgZXVpZCwgdTE2LCBzdWlkKQogewogCXJldHVybiBzeXNfc2V0cmVzdWlkKGxvdzJoaWdodWlkKHJ1aWQpLCBsb3cyaGlnaHVpZChldWlkKSwKLQkJbG93MmhpZ2h1aWQoc3VpZCkpOworCQkJICAgICBsb3cyaGlnaHVpZChzdWlkKSk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9nZXRyZXN1aWQxNih1MTYgX191c2VyICpydWlkcCwgdTE2IF9fdXNlciAqZXVpZHAsIHUxNiBfX3VzZXIgKnN1aWRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX2dldHJlc3VpZDE2LCB1MTYgX191c2VyICosIHJ1aWRwLAorCQkgICAgICAgdTE2IF9fdXNlciAqLCBldWlkcCwgdTE2IF9fdXNlciAqLCBzdWlkcCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpOwogCWludCByZXR2YWw7CkBAIC0xNDQsMTMgKzE0NywxNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXRyZXNnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQsIHUxNiBzZ2lkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX3NldHJlc2dpZDE2LCB1MTYsIHJnaWQsIHUxNiwgZWdpZCwgdTE2LCBzZ2lkKQogewogCXJldHVybiBzeXNfc2V0cmVzZ2lkKGxvdzJoaWdoZ2lkKHJnaWQpLCBsb3cyaGlnaGdpZChlZ2lkKSwKLQkJbG93MmhpZ2hnaWQoc2dpZCkpOworCQkJICAgICBsb3cyaGlnaGdpZChzZ2lkKSk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9nZXRyZXNnaWQxNih1MTYgX191c2VyICpyZ2lkcCwgdTE2IF9fdXNlciAqZWdpZHAsIHUxNiBfX3VzZXIgKnNnaWRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX2dldHJlc2dpZDE2LCB1MTYgX191c2VyICosIHJnaWRwLAorCQkgICAgICAgdTE2IF9fdXNlciAqLCBlZ2lkcCwgdTE2IF9fdXNlciAqLCBzZ2lkcCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpOwogCWludCByZXR2YWw7CkBAIC0xNjcsMTIgKzE3MSwxMiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXRmc3VpZDE2KHUxNiB1aWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKHMzOTBfc2V0ZnN1aWQxNiwgdTE2LCB1aWQpCiB7CiAJcmV0dXJuIHN5c19zZXRmc3VpZCgodWlkX3QpdWlkKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGZzZ2lkMTYodTE2IGdpZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoczM5MF9zZXRmc2dpZDE2LCB1MTYsIGdpZCkKIHsKIAlyZXR1cm4gc3lzX3NldGZzZ2lkKChnaWRfdClnaWQpOwogfQpAQCAtMjE1LDcgKzIxOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9nZXRncm91cHMxNihpbnQgZ2lkc2V0c2l6ZSwgdTE2IF9fdXNlciAqZ3JvdXBsaXN0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihzMzkwX2dldGdyb3VwczE2LCBpbnQsIGdpZHNldHNpemUsIHUxNiBfX3VzZXIgKiwgZ3JvdXBsaXN0KQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CiAJaW50IGk7CkBAIC0yNDAsNyArMjQ0LDcgQEAKIAlyZXR1cm4gaTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgX191c2VyICpncm91cGxpc3QpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHMzOTBfc2V0Z3JvdXBzMTYsIGludCwgZ2lkc2V0c2l6ZSwgdTE2IF9fdXNlciAqLCBncm91cGxpc3QpCiB7CiAJc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm87CiAJaW50IHJldHZhbDsKQEAgLTI2NSwyMiArMjY5LDIyIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHVpZDE2KHZvaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKHMzOTBfZ2V0dWlkMTYpCiB7CiAJcmV0dXJuIGhpZ2gybG93dWlkKGZyb21fa3VpZF9tdW5nZWQoY3VycmVudF91c2VyX25zKCksIGN1cnJlbnRfdWlkKCkpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldGV1aWQxNih2b2lkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMChzMzkwX2dldGV1aWQxNikKIHsKIAlyZXR1cm4gaGlnaDJsb3d1aWQoZnJvbV9rdWlkX211bmdlZChjdXJyZW50X3VzZXJfbnMoKSwgY3VycmVudF9ldWlkKCkpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldGdpZDE2KHZvaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKHMzOTBfZ2V0Z2lkMTYpCiB7CiAJcmV0dXJuIGhpZ2gybG93Z2lkKGZyb21fa2dpZF9tdW5nZWQoY3VycmVudF91c2VyX25zKCksIGN1cnJlbnRfZ2lkKCkpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldGVnaWQxNih2b2lkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMChzMzkwX2dldGVnaWQxNikKIHsKIAlyZXR1cm4gaGlnaDJsb3dnaWQoZnJvbV9rZ2lkX211bmdlZChjdXJyZW50X3VzZXJfbnMoKSwgY3VycmVudF9lZ2lkKCkpKTsKIH0KQEAgLTI5NSw0MSArMjk5LDM1IEBACiB9CiAjZW5kaWYKIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3RydW5jYXRlNjQoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRoLCB1bnNpZ25lZCBsb25nIGhpZ2gsIHVuc2lnbmVkIGxvbmcgbG93KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX3RydW5jYXRlNjQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIHUzMiwgaGlnaCwgdTMyLCBsb3cpCiB7Ci0JaWYgKChpbnQpaGlnaCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UKLQkJcmV0dXJuIHN5c190cnVuY2F0ZShwYXRoLCAoaGlnaCA8PCAzMikgfCBsb3cpOworCXJldHVybiBzeXNfdHJ1bmNhdGUocGF0aCwgKHVuc2lnbmVkIGxvbmcpaGlnaCA8PCAzMiB8IGxvdyk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9mdHJ1bmNhdGU2NCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGxvbmcgaGlnaCwgdW5zaWduZWQgbG9uZyBsb3cpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfZnRydW5jYXRlNjQsIHVuc2lnbmVkIGludCwgZmQsIHUzMiwgaGlnaCwgdTMyLCBsb3cpCiB7Ci0JaWYgKChpbnQpaGlnaCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UKLQkJcmV0dXJuIHN5c19mdHJ1bmNhdGUoZmQsIChoaWdoIDw8IDMyKSB8IGxvdyk7CisJcmV0dXJuIHN5c19mdHJ1bmNhdGUoZmQsICh1bnNpZ25lZCBsb25nKWhpZ2ggPDwgMzIgfCBsb3cpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfcHJlYWQ2NCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICp1YnVmLAotCQkJCXNpemVfdCBjb3VudCwgdTMyIHBvc2hpLCB1MzIgcG9zbG8pCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHMzOTBfcHJlYWQ2NCwgdW5zaWduZWQgaW50LCBmZCwgY2hhciBfX3VzZXIgKiwgdWJ1ZiwKKwkJICAgICAgIGNvbXBhdF9zaXplX3QsIGNvdW50LCB1MzIsIGhpZ2gsIHUzMiwgbG93KQogewogCWlmICgoY29tcGF0X3NzaXplX3QpIGNvdW50IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHN5c19wcmVhZDY0KGZkLCB1YnVmLCBjb3VudCwgKChsb2ZmX3QpQUEocG9zaGkpIDw8IDMyKSB8IEFBKHBvc2xvKSk7CisJcmV0dXJuIHN5c19wcmVhZDY0KGZkLCB1YnVmLCBjb3VudCwgKHVuc2lnbmVkIGxvbmcpaGlnaCA8PCAzMiB8IGxvdyk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9wd3JpdGU2NCh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAotCQkJCXNpemVfdCBjb3VudCwgdTMyIHBvc2hpLCB1MzIgcG9zbG8pCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHMzOTBfcHdyaXRlNjQsIHVuc2lnbmVkIGludCwgZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHVidWYsCisJCSAgICAgICBjb21wYXRfc2l6ZV90LCBjb3VudCwgdTMyLCBoaWdoLCB1MzIsIGxvdykKIHsKIAlpZiAoKGNvbXBhdF9zc2l6ZV90KSBjb3VudCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBzeXNfcHdyaXRlNjQoZmQsIHVidWYsIGNvdW50LCAoKGxvZmZfdClBQShwb3NoaSkgPDwgMzIpIHwgQUEocG9zbG8pKTsKKwlyZXR1cm4gc3lzX3B3cml0ZTY0KGZkLCB1YnVmLCBjb3VudCwgKHVuc2lnbmVkIGxvbmcpaGlnaCA8PCAzMiB8IGxvdyk7CiB9CiAKLWFzbWxpbmthZ2UgY29tcGF0X3NzaXplX3Qgc3lzMzJfcmVhZGFoZWFkKGludCBmZCwgdTMyIG9mZmhpLCB1MzIgb2ZmbG8sIHMzMiBjb3VudCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQoczM5MF9yZWFkYWhlYWQsIGludCwgZmQsIHUzMiwgaGlnaCwgdTMyLCBsb3csIHMzMiwgY291bnQpCiB7Ci0JcmV0dXJuIHN5c19yZWFkYWhlYWQoZmQsICgobG9mZl90KUFBKG9mZmhpKSA8PCAzMikgfCBBQShvZmZsbyksIGNvdW50KTsKKwlyZXR1cm4gc3lzX3JlYWRhaGVhZChmZCwgKHVuc2lnbmVkIGxvbmcpaGlnaCA8PCAzMiB8IGxvdywgY291bnQpOwogfQogCiBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIHsKQEAgLTM4MSw3ICszNzksNyBAQAogCXJldHVybiBjb3B5X3RvX3VzZXIodWJ1ZiwmdG1wLHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOyAKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3N0YXQ2NChjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqIHN0YXRidWYpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHMzOTBfc3RhdDY0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKiwgc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgcmV0ID0gdmZzX3N0YXQoZmlsZW5hbWUsICZzdGF0KTsKQEAgLTM5MCw3ICszODgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9sc3RhdDY0KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICogc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoczM5MF9sc3RhdDY0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKiwgc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgcmV0ID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CkBAIC0zOTksNyArMzk3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZnN0YXQ2NCh1bnNpZ25lZCBsb25nIGZkLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqIHN0YXRidWYpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHMzOTBfZnN0YXQ2NCwgdW5zaWduZWQgaW50LCBmZCwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKiwgc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgcmV0ID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CkBAIC00MDgsOCArNDA2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZnN0YXRhdDY0KHVuc2lnbmVkIGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwKLQkJCQlzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciogc3RhdGJ1ZiwgaW50IGZsYWcpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KHMzOTBfZnN0YXRhdDY0LCB1bnNpZ25lZCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsCisJCSAgICAgICBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqLCBzdGF0YnVmLCBpbnQsIGZsYWcpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yOwpAQCAtNDM1LDcgKzQzMyw3IEBACiAJY29tcGF0X3Vsb25nX3Qgb2Zmc2V0OwogfTsKIAotYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIG9sZDMyX21tYXAoc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKmFyZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoczM5MF9vbGRfbW1hcCwgc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKiwgYXJnKQogewogCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgYTsKIApAQCAtNDQ3LDcgKzQ0NSw3IEBACiAJCQkgICAgICBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX21tYXAyKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgX191c2VyICphcmcpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKHMzOTBfbW1hcDIsIHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgX191c2VyICosIGFyZykKIHsKIAlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIGE7CiAKQEAgLTQ1Niw3ICs0NTQsNyBAQAogCXJldHVybiBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0KTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3JlYWQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX3JlYWQsIHVuc2lnbmVkIGludCwgZmQsIGNoYXIgX191c2VyICosIGJ1ZiwgY29tcGF0X3NpemVfdCwgY291bnQpCiB7CiAJaWYgKChjb21wYXRfc3NpemVfdCkgY291bnQgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsgCkBAIC00NjQsNyArNDYyLDcgQEAKIAlyZXR1cm4gc3lzX3JlYWQoZmQsIGJ1ZiwgY291bnQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfd3JpdGUodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX3dyaXRlLCB1bnNpZ25lZCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBidWYsIGNvbXBhdF9zaXplX3QsIGNvdW50KQogewogCWlmICgoY29tcGF0X3NzaXplX3QpIGNvdW50IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7IApAQCAtNDc4LDE0ICs0NzYsMTMgQEAKICAqIGJlY2F1c2UgdGhlIDMxIGJpdCB2YWx1ZXMgZGlmZmVyIGZyb20gdGhlIDY0IGJpdCB2YWx1ZXMuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nCi1zeXMzMl9mYWR2aXNlNjQoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbGVuLCBpbnQgYWR2aXNlKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShzMzkwX2ZhZHZpc2U2NCwgaW50LCBmZCwgdTMyLCBoaWdoLCB1MzIsIGxvdywgY29tcGF0X3NpemVfdCwgbGVuLCBpbnQsIGFkdmlzZSkKIHsKIAlpZiAoYWR2aXNlID09IDQpCiAJCWFkdmlzZSA9IFBPU0lYX0ZBRFZfRE9OVE5FRUQ7CiAJZWxzZSBpZiAoYWR2aXNlID09IDUpCiAJCWFkdmlzZSA9IFBPU0lYX0ZBRFZfTk9SRVVTRTsKLQlyZXR1cm4gc3lzX2ZhZHZpc2U2NChmZCwgb2Zmc2V0LCBsZW4sIGFkdmlzZSk7CisJcmV0dXJuIHN5c19mYWR2aXNlNjQoZmQsICh1bnNpZ25lZCBsb25nKWhpZ2ggPDwgMzIgfCBsb3csIGxlbiwgYWR2aXNlKTsKIH0KIAogc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIHsKQEAgLTQ5NSw4ICs0OTIsNyBAQAogCWludCBhZHZpY2U7CiB9OwogCi1hc21saW5rYWdlIGxvbmcKLXN5czMyX2ZhZHZpc2U2NF82NChzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICphcmdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShzMzkwX2ZhZHZpc2U2NF82NCwgc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIF9fdXNlciAqLCBhcmdzKQogewogCXN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBhOwogCkBAIC01MDgsMyArNTA0LDE3IEBACiAJCWEuYWR2aWNlID0gUE9TSVhfRkFEVl9OT1JFVVNFOwogCXJldHVybiBzeXNfZmFkdmlzZTY0XzY0KGEuZmQsIGEub2Zmc2V0LCBhLmxlbiwgYS5hZHZpY2UpOwogfQorCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHMzOTBfc3luY19maWxlX3JhbmdlLCBpbnQsIGZkLCB1MzIsIG9mZmhpZ2gsIHUzMiwgb2ZmbG93LAorCQkgICAgICAgdTMyLCBuaGlnaCwgdTMyLCBubG93LCB1bnNpZ25lZCBpbnQsIGZsYWdzKQoreworCXJldHVybiBzeXNfc3luY19maWxlX3JhbmdlKGZkLCAoKGxvZmZfdClvZmZoaWdoIDw8IDMyKSArIG9mZmxvdywKKwkJCQkgICAoKHU2NCluaGlnaCA8PCAzMikgKyBubG93LCBmbGFncyk7Cit9CisKK0NPTVBBVF9TWVNDQUxMX0RFRklORTYoczM5MF9mYWxsb2NhdGUsIGludCwgZmQsIGludCwgbW9kZSwgdTMyLCBvZmZoaWdoLCB1MzIsIG9mZmxvdywKKwkJICAgICAgIHUzMiwgbGVuaGlnaCwgdTMyLCBsZW5sb3cpCit7CisJcmV0dXJuIHN5c19mYWxsb2NhdGUoZmQsIG1vZGUsICgobG9mZl90KW9mZmhpZ2ggPDwgMzIpICsgb2ZmbG93LAorCQkJICAgICAoKHU2NClsZW5oaWdoIDw8IDMyKSArIGxlbmxvdyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5oIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaAppbmRleCAxYmZkYTNlLi4zOWRkZmRiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5oCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmgKQEAgLTc2LDQ2ICs3Niw0MyBAQAogc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMTsKIHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJnczsKIAotbG9uZyBzeXMzMl9jaG93bjE2KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIHUxNiB1c2VyLCB1MTYgZ3JvdXApOwotbG9uZyBzeXMzMl9sY2hvd24xNihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCB1MTYgdXNlciwgdTE2IGdyb3VwKTsKLWxvbmcgc3lzMzJfZmNob3duMTYodW5zaWduZWQgaW50IGZkLCB1MTYgdXNlciwgdTE2IGdyb3VwKTsKLWxvbmcgc3lzMzJfc2V0cmVnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQpOwotbG9uZyBzeXMzMl9zZXRnaWQxNih1MTYgZ2lkKTsKLWxvbmcgc3lzMzJfc2V0cmV1aWQxNih1MTYgcnVpZCwgdTE2IGV1aWQpOwotbG9uZyBzeXMzMl9zZXR1aWQxNih1MTYgdWlkKTsKLWxvbmcgc3lzMzJfc2V0cmVzdWlkMTYodTE2IHJ1aWQsIHUxNiBldWlkLCB1MTYgc3VpZCk7Ci1sb25nIHN5czMyX2dldHJlc3VpZDE2KHUxNiBfX3VzZXIgKnJ1aWQsIHUxNiBfX3VzZXIgKmV1aWQsIHUxNiBfX3VzZXIgKnN1aWQpOwotbG9uZyBzeXMzMl9zZXRyZXNnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQsIHUxNiBzZ2lkKTsKLWxvbmcgc3lzMzJfZ2V0cmVzZ2lkMTYodTE2IF9fdXNlciAqcmdpZCwgdTE2IF9fdXNlciAqZWdpZCwgdTE2IF9fdXNlciAqc2dpZCk7Ci1sb25nIHN5czMyX3NldGZzdWlkMTYodTE2IHVpZCk7Ci1sb25nIHN5czMyX3NldGZzZ2lkMTYodTE2IGdpZCk7Ci1sb25nIHN5czMyX2dldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgX191c2VyICpncm91cGxpc3QpOwotbG9uZyBzeXMzMl9zZXRncm91cHMxNihpbnQgZ2lkc2V0c2l6ZSwgdTE2IF9fdXNlciAqZ3JvdXBsaXN0KTsKLWxvbmcgc3lzMzJfZ2V0dWlkMTYodm9pZCk7Ci1sb25nIHN5czMyX2dldGV1aWQxNih2b2lkKTsKLWxvbmcgc3lzMzJfZ2V0Z2lkMTYodm9pZCk7Ci1sb25nIHN5czMyX2dldGVnaWQxNih2b2lkKTsKLWxvbmcgc3lzMzJfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIHVuc2lnbmVkIGxvbmcgaGlnaCwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBsb3cpOwotbG9uZyBzeXMzMl9mdHJ1bmNhdGU2NCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGxvbmcgaGlnaCwgdW5zaWduZWQgbG9uZyBsb3cpOwotbG9uZyBzeXMzMl9pbml0X21vZHVsZSh2b2lkIF9fdXNlciAqdW1vZCwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MpOwotbG9uZyBzeXMzMl9kZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgX191c2VyICpuYW1lX3VzZXIsIHVuc2lnbmVkIGludCBmbGFncyk7Ci1sb25nIHN5czMyX3ByZWFkNjQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50LAotCQkgICB1MzIgcG9zaGksIHUzMiBwb3Nsbyk7Ci1sb25nIHN5czMyX3B3cml0ZTY0KHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCi0JCSAgICBzaXplX3QgY291bnQsIHUzMiBwb3NoaSwgdTMyIHBvc2xvKTsKLWNvbXBhdF9zc2l6ZV90IHN5czMyX3JlYWRhaGVhZChpbnQgZmQsIHUzMiBvZmZoaSwgdTMyIG9mZmxvLCBzMzIgY291bnQpOwotbG9uZyBzeXMzMl9zdGF0NjQoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKiBzdGF0YnVmKTsKLWxvbmcgc3lzMzJfbHN0YXQ2NChjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLAotCQkgICBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqIHN0YXRidWYpOwotbG9uZyBzeXMzMl9mc3RhdDY0KHVuc2lnbmVkIGxvbmcgZmQsIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICogc3RhdGJ1Zik7Ci1sb25nIHN5czMyX2ZzdGF0YXQ2NCh1bnNpZ25lZCBpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCi0JCSAgICAgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIqIHN0YXRidWYsIGludCBmbGFnKTsKLXVuc2lnbmVkIGxvbmcgb2xkMzJfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIF9fdXNlciAqYXJnKTsKLWxvbmcgc3lzMzJfbW1hcDIoc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKmFyZyk7Ci1sb25nIHN5czMyX3JlYWQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KTsKLWxvbmcgc3lzMzJfd3JpdGUodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KTsKLWxvbmcgc3lzMzJfZmFkdmlzZTY0KGludCBmZCwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGxlbiwgaW50IGFkdmlzZSk7Ci1sb25nIHN5czMyX2ZhZHZpc2U2NF82NChzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICphcmdzKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2Nob3duMTYoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCB1MTYgdXNlciwgdTE2IGdyb3VwKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2xjaG93bjE2KGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgdTE2IHVzZXIsIHUxNiBncm91cCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9mY2hvd24xNih1bnNpZ25lZCBpbnQgZmQsIHUxNiB1c2VyLCB1MTYgZ3JvdXApOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc2V0cmVnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc2V0Z2lkMTYodTE2IGdpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zZXRyZXVpZDE2KHUxNiBydWlkLCB1MTYgZXVpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zZXR1aWQxNih1MTYgdWlkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3NldHJlc3VpZDE2KHUxNiBydWlkLCB1MTYgZXVpZCwgdTE2IHN1aWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZ2V0cmVzdWlkMTYodTE2IF9fdXNlciAqcnVpZCwgdTE2IF9fdXNlciAqZXVpZCwgdTE2IF9fdXNlciAqc3VpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zZXRyZXNnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQsIHUxNiBzZ2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2dldHJlc2dpZDE2KHUxNiBfX3VzZXIgKnJnaWQsIHUxNiBfX3VzZXIgKmVnaWQsIHUxNiBfX3VzZXIgKnNnaWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc2V0ZnN1aWQxNih1MTYgdWlkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3NldGZzZ2lkMTYodTE2IGdpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9nZXRncm91cHMxNihpbnQgZ2lkc2V0c2l6ZSwgdTE2IF9fdXNlciAqZ3JvdXBsaXN0KTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3NldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgX191c2VyICpncm91cGxpc3QpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZ2V0dWlkMTYodm9pZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9nZXRldWlkMTYodm9pZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9nZXRnaWQxNih2b2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2dldGVnaWQxNih2b2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3RydW5jYXRlNjQoY29uc3QgY2hhciBfX3VzZXIgKnBhdGgsIHUzMiBoaWdoLCB1MzIgbG93KTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2Z0cnVuY2F0ZTY0KHVuc2lnbmVkIGludCBmZCwgdTMyIGhpZ2gsIHUzMiBsb3cpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfcHJlYWQ2NCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICp1YnVmLCBjb21wYXRfc2l6ZV90IGNvdW50LCB1MzIgaGlnaCwgdTMyIGxvdyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9wd3JpdGU2NCh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBjb21wYXRfc2l6ZV90IGNvdW50LCB1MzIgaGlnaCwgdTMyIGxvdyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9yZWFkYWhlYWQoaW50IGZkLCB1MzIgaGlnaCwgdTMyIGxvdywgczMyIGNvdW50KTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3N0YXQ2NChjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICpzdGF0YnVmKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2xzdGF0NjQoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqc3RhdGJ1Zik7Citsb25nIGNvbXBhdF9zeXNfczM5MF9mc3RhdDY0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKnN0YXRidWYpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZnN0YXRhdDY0KHVuc2lnbmVkIGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKnN0YXRidWYsIGludCBmbGFnKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX29sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgX191c2VyICphcmcpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfbW1hcDIoc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKmFyZyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9yZWFkKHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKiBidWYsIGNvbXBhdF9zaXplX3QgY291bnQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfd3JpdGUodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwgY29tcGF0X3NpemVfdCBjb3VudCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9mYWR2aXNlNjQoaW50IGZkLCB1MzIgaGlnaCwgdTMyIGxvdywgY29tcGF0X3NpemVfdCBsZW4sIGludCBhZHZpc2UpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZmFkdmlzZTY0XzY0KHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBfX3VzZXIgKmFyZ3MpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc3luY19maWxlX3JhbmdlKGludCBmZCwgdTMyIG9mZmhpZ2gsIHUzMiBvZmZsb3csIHUzMiBuaGlnaCwgdTMyIG5sb3csIHVuc2lnbmVkIGludCBmbGFncyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9mYWxsb2NhdGUoaW50IGZkLCBpbnQgbW9kZSwgdTMyIG9mZmhpZ2gsIHUzMiBvZmZsb3csIHUzMiBsZW5oaWdoLCB1MzIgbGVubG93KTsKK2xvbmcgY29tcGF0X3N5c19zaWdyZXR1cm4odm9pZCk7Citsb25nIGNvbXBhdF9zeXNfcnRfc2lncmV0dXJuKHZvaWQpOworCiAjZW5kaWYgLyogX0FTTV9TMzkwWF9TMzkwX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKaW5kZXggOGI4NGJjMy4uN2RmNWVkOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKQEAgLTI0MSw3ICsyNDEsNyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2lncmV0dXJuKHZvaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKHNpZ3JldHVybikKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlzaWdmcmFtZTMyIF9fdXNlciAqZnJhbWUgPSAoc2lnZnJhbWUzMiBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKQEAgLTI2MCw3ICsyNjAsNyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfcnRfc2lncmV0dXJuKHZvaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKHJ0X3NpZ3JldHVybikKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlydF9zaWdmcmFtZTMyIF9fdXNlciAqZnJhbWUgPSAocnRfc2lnZnJhbWUzMiBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0ODk0OS4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDI1ICswLDAgQEAKLS8qCi0qICAgIHdyYXBwZXIgZm9yIDMxIGJpdCBjb21wYXRpYmxlIHN5c3RlbSBjYWxscy4KLSoKLSogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDA2Ci0qICAgIEF1dGhvcihzKTogR2VyaGFyZCBUb25uICh0b25AZGUuaWJtLmNvbSksCi0qCQlUaG9tYXMgU3BhdHppZXIgKHRzcGF0QGRlLmlibS5jb20pCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotCi1FTlRSWShzeXMzMl9leGl0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlqZwlzeXNfZXhpdAkJIyBicmFuY2ggdG8gc3lzX2V4aXQKLQotRU5UUlkoc3lzMzJfcmVhZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAotCWpnCXN5czMyX3JlYWQJCSMgYnJhbmNoIHRvIHN5c19yZWFkCi0KLUVOVFJZKHN5czMyX3dyaXRlX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JamcJc3lzMzJfd3JpdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2Nsb3NlX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2Nsb3NlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9jcmVhdF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX2NyZWF0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9saW5rX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX2xpbmsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3VubGlua193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c191bmxpbmsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2NoZGlyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX2NoZGlyCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl90aW1lX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgaW50ICoKLQlqZwljb21wYXRfc3lzX3RpbWUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX21rbm9kX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGdmcgklcjQsJXI0CQkJIyBkZXYKLQlqZwlzeXNfbWtub2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2NobW9kX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgbW9kZV90Ci0JamcJc3lzX2NobW9kCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9sY2hvd24xNl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWpnCXN5czMyX2xjaG93bjE2CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfZ2V0cGlkX3dyYXBwZXIJCQkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX21vdW50X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgY2hhciAqCi0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ3RyCSVyNiwlcjYJCQkjIHZvaWQgKgotCWpnCWNvbXBhdF9zeXNfbW91bnQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfb2xkdW1vdW50X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JamcJc3lzX29sZHVtb3VudAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0dWlkMTZfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlqZwlzeXMzMl9zZXR1aWQxNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotI3N5czMyX2dldHVpZDE2X3dyYXBwZXIJCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfcHRyYWNlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBsb25nCi0JbGdmcgklcjMsJXIzCQkJIyBsb25nCi0JbGxndHIJJXI0LCVyNAkJCSMgbG9uZwotCWxsZ2ZyCSVyNSwlcjUJCQkjIGxvbmcKLQlqZwljb21wYXRfc3lzX3B0cmFjZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9hbGFybV93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19hbGFybQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c191dGltZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdXRpbWJ1ZiAqCi0JamcJY29tcGF0X3N5c191dGltZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9hY2Nlc3Nfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19hY2Nlc3MJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX25pY2Vfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19uaWNlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfc3luY193cmFwcGVyCQkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX2tpbGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX2tpbGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3JlbmFtZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19yZW5hbWUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX21rZGlyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfbWtkaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3JtZGlyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX3JtZGlyCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9kdXBfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfZHVwCQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcGlwZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHUzMiAqCi0JamcJc3lzX3BpcGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfdGltZXNfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgY29tcGF0X3RtcyAqCi0JamcJY29tcGF0X3N5c190aW1lcwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9icmtfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzX2JyawkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldGdpZDE2X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90Ci0JamcJc3lzMzJfc2V0Z2lkMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9nZXRnaWQxNl93cmFwcGVyCQkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX3NpZ25hbF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgX19zaWdoYW5kbGVyX3QKLQlqZwlzeXNfc2lnbmFsCi0KLSNzeXMzMl9nZXRldWlkMTZfd3JhcHBlcgkJIyB2b2lkCi0KLSNzeXMzMl9nZXRlZ2lkMTZfd3JhcHBlcgkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX2FjY3Rfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlqZwlzeXNfYWNjdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfdW1vdW50X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfdW1vdW50CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX2lvY3RsX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50Ci0JamcJY29tcGF0X3N5c19pb2N0bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX2ZjbnRsX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCWNvbXBhdF9zeXNfZmNudGwJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cGdpZF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlsZ2ZyCSVyMywlcjMJCQkjIHBpZF90Ci0JamcJc3lzX3NldHBnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3VtYXNrX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlqZwlzeXNfdW1hc2sJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2Nocm9vdF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWpnCXN5c19jaHJvb3QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3VzdGF0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgZGV2X3QKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgdXN0YXQgKgotCWpnCWNvbXBhdF9zeXNfdXN0YXQKLQotRU5UUlkoc3lzMzJfZHVwMl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19kdXAyCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfZ2V0cHBpZF93cmFwcGVyCQkJIyB2b2lkCi0KLSNzeXMzMl9nZXRwZ3JwX3dyYXBwZXIJCQkjIHZvaWQKLQotI3N5czMyX3NldHNpZF93cmFwcGVyCQkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX3NldHJldWlkMTZfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlqZwlzeXMzMl9zZXRyZXVpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldHJlZ2lkMTZfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QKLQlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QKLQlqZwlzeXMzMl9zZXRyZWdpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19zaWdzdXNwZW5kX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxsZ2ZyCSVyNCwlcjQJCQkjIG9sZF9zaWdzZXRfdAotCWpnCXN5c19zaWdzdXNwZW5kCi0KLUVOVFJZKGNvbXBhdF9zeXNfc2lncGVuZGluZ193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbXBhdF9vbGRfc2lnc2V0X3QgKgotCWpnCWNvbXBhdF9zeXNfc2lncGVuZGluZwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRob3N0bmFtZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3NldGhvc3RuYW1lCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX3NldHJsaW1pdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBybGltaXRfZW11MzEgKgotCWpnCWNvbXBhdF9zeXNfc2V0cmxpbWl0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBybGltaXRfZW11MzEgKgotCWpnCWNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdCAjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX2dldHJsaW1pdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBybGltaXRfZW11MzEgKgotCWpnCWNvbXBhdF9zeXNfZ2V0cmxpbWl0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX21tYXAyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSAqCi0JamcJc3lzMzJfbW1hcDIJCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX2dldHRpbWVvZmRheV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCB0aW1ldmFsX2VtdTMxICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgdGltZXpvbmUgKgotCWpnCWNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHRpbWV2YWxfZW11MzEgKgotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCB0aW1lem9uZSAqCi0JamcJY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0Z3JvdXBzMTZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCi0JamcJc3lzMzJfZ2V0Z3JvdXBzMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0Z3JvdXBzMTZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCi0JamcJc3lzMzJfc2V0Z3JvdXBzMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc3ltbGlua193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19zeW1saW5rCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9yZWFkbGlua193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX3JlYWRsaW5rCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl91c2VsaWJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfdXNlbGliCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zd2Fwb25fd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19zd2Fwb24JCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3JlYm9vdF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjUsJXI1CQkJIyB2b2lkICoKLQlqZwlzeXNfcmVib290CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShvbGQzMl9yZWFkZGlyX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgdm9pZCAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50Ci0JamcJY29tcGF0X3N5c19vbGRfcmVhZGRpcgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShvbGQzMl9tbWFwX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSAqCi0JamcJb2xkMzJfbW1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbXVubWFwX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAotCWpnCXN5c19tdW5tYXAJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2ZjaG1vZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIG1vZGVfdAotCWpnCXN5c19mY2htb2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2ZjaG93bjE2X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgY29tcGF0X3VpZF90Ci0JbGxnZnIJJXI0LCVyNAkJCSMgY29tcGF0X3VpZF90Ci0JamcJc3lzMzJfZmNob3duMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldHByaW9yaXR5X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19nZXRwcmlvcml0eQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cHJpb3JpdHlfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfc2V0cHJpb3JpdHkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfc3RhdGZzX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnMgKgotCWpnCWNvbXBhdF9zeXNfc3RhdGZzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfZnN0YXRmc193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfc3RhdGZzICoKLQlqZwljb21wYXRfc3lzX2ZzdGF0ZnMJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19zb2NrZXRjYWxsX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyB1MzIgKgotCWpnCWNvbXBhdF9zeXNfc29ja2V0Y2FsbAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zeXNsb2dfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX3N5c2xvZwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19uZXdzdGF0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgotCWpnCWNvbXBhdF9zeXNfbmV3c3RhdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX25ld2xzdGF0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgotCWpnCWNvbXBhdF9zeXNfbmV3bHN0YXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19uZXdmc3RhdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0X2VtdTMxICoKLQlqZwljb21wYXRfc3lzX25ld2ZzdGF0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl92aGFuZ3VwX3dyYXBwZXIJCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfc3dhcG9mZl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19zd2Fwb2ZmCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX3N5c2luZm9fd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3Qgc3lzaW5mb19lbXUzMSAqCi0JamcJY29tcGF0X3N5c19zeXNpbmZvCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2ZzeW5jX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2ZzeW5jCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfc2lncmV0dXJuX3dyYXBwZXIJCSMgZG9uZSBpbiBzaWdyZXR1cm5fZ2x1ZQotCi0jc3lzMzJfY2xvbmVfd3JhcHBlcgkJCSMgZG9uZSBpbiBjbG9uZV9nbHVlCi0KLUVOVFJZKHN5czMyX3NldGRvbWFpbm5hbWVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19zZXRkb21haW5uYW1lCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX25ld3VuYW1lX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IG5ld191dHNuYW1lICoKLQlqZwlzeXNfbmV3dW5hbWUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfYWRqdGltZXhfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWV4ICoKLQlqZwljb21wYXRfc3lzX2FkanRpbWV4CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX21wcm90ZWN0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZyAoYWN0dWFsbHkgcG9pbnRlcgotCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfbXByb3RlY3QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19pbml0X21vZHVsZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHZvaWQgKgotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGd0cgklcjQsJXI0CQkJIyBjaGFyICoKLQlqZwlzeXNfaW5pdF9tb2R1bGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19kZWxldGVfbW9kdWxlX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2RlbGV0ZV9tb2R1bGUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcXVvdGFjdGxfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBxaWRfdAotCWxsZ3RyCSVyNSwlcjUJCQkjIGNhZGRyX3QKLQlqZwlzeXNfcXVvdGFjdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldHBnaWRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JamcJc3lzX2dldHBnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2ZjaGRpcl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19mY2hkaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2JkZmx1c2hfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgbG9uZwotCWpnCXN5c19iZGZsdXNoCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zeXNmc193cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfc3lzZnMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX3MzOTBfcGVyc29uYWxpdHkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0ZnN1aWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWpnCXN5czMyX3NldGZzdWlkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAotCWpnCXN5czMyX3NldGZzZ2lkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbGxzZWVrX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGd0cgklcjUsJXI1CQkJIyBsb2ZmX3QgKgotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19sbHNlZWsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldGRlbnRzX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgdm9pZCAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50Ci0JamcJY29tcGF0X3N5c19nZXRkZW50cwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX3NlbGVjdF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29tcGF0X2ZkX3NldCAqCi0JbGxndHIJJXI0LCVyNAkJCSMgY29tcGF0X2ZkX3NldCAqCi0JbGxndHIJJXI1LCVyNQkJCSMgY29tcGF0X2ZkX3NldCAqCi0JbGxndHIJJXI2LCVyNgkJCSMgc3RydWN0IGNvbXBhdF90aW1ldmFsICoKLQlqZwljb21wYXRfc3lzX3NlbGVjdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9mbG9ja193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19mbG9jawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbXN5bmNfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90Ci0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfbXN5bmMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfcmVhZHZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwljb21wYXRfc3lzX3JlYWR2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfd3JpdGV2X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJY29tcGF0X3N5c193cml0ZXYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0c2lkX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWpnCXN5c19nZXRzaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2ZkYXRhc3luY193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19mZGF0YXN5bmMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX21sb2NrX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAotCWpnCXN5c19tbG9jawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbXVubG9ja193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKLQlqZwlzeXNfbXVubG9jawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbWxvY2thbGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19tbG9ja2FsbAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotI3N5czMyX211bmxvY2thbGxfd3JhcHBlcgkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX3NjaGVkX3NldHBhcmFtX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzY2hlZF9wYXJhbSAqCi0JamcJc3lzX3NjaGVkX3NldHBhcmFtCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NjaGVkX2dldHBhcmFtX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzY2hlZF9wYXJhbSAqCi0JamcJc3lzX3NjaGVkX2dldHBhcmFtCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NjaGVkX3NldHNjaGVkdWxlcl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBzY2hlZF9wYXJhbSAqCi0JamcJc3lzX3NjaGVkX3NldHNjaGVkdWxlcgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zY2hlZF9nZXRzY2hlZHVsZXJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JamcJc3lzX3NjaGVkX2dldHNjaGVkdWxlcgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfc2NoZWRfeWllbGRfd3JhcHBlcgkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9tYXhfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9taW5fd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfbmFub3NsZWVwX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JamcJY29tcGF0X3N5c19uYW5vc2xlZXAJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX21yZW1hcF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzX21yZW1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cmVzdWlkMTZfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlqZwlzeXMzMl9zZXRyZXN1aWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9nZXRyZXN1aWQxNl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAqCi0JbGxndHIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90ICoKLQlsbGd0cgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgKgotCWpnCXN5czMyX2dldHJlc3VpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3BvbGxfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgcG9sbGZkICoKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19wb2xsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRyZXNnaWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAotCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAotCWpnCXN5czMyX3NldHJlc2dpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldHJlc2dpZDE2X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKLQlsbGd0cgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCi0JamcJc3lzMzJfZ2V0cmVzZ2lkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcHJjdGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfcHJjdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9ydF9zaWdyZXR1cm5fd3JhcHBlcgkJIyBkb25lIGluIHJ0X3NpZ3JldHVybl9nbHVlCi0KLUVOVFJZKHN5czMyX3ByZWFkNjRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKLQlsbGdmcgklcjUsJXI1CQkJIyB1MzIKLQlsbGdmcgklcjYsJXI2CQkJIyB1MzIKLQlqZwlzeXMzMl9wcmVhZDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9wd3JpdGU2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAotCWxsZ2ZyCSVyNSwlcjUJCQkjIHUzMgotCWxsZ2ZyCSVyNiwlcjYJCQkjIHUzMgotCWpnCXN5czMyX3B3cml0ZTY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9jaG93bjE2X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90Ci0JbGxnZnIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90Ci0JamcJc3lzMzJfY2hvd24xNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0Y3dkX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19nZXRjd2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2NhcGdldF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNhcF91c2VyX2hlYWRlcl90Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2FwX3VzZXJfZGF0YV90Ci0JamcJc3lzX2NhcGdldAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2Fwc2V0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2FwX3VzZXJfaGVhZGVyX3QKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjYXBfdXNlcl9kYXRhX3QKLQlqZwlzeXNfY2Fwc2V0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfdmZvcmtfd3JhcHBlcgkJCSMgZG9uZSBpbiB2Zm9ya19nbHVlCi0KLUVOVFJZKHN5czMyX3RydW5jYXRlNjRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5czMyX3RydW5jYXRlNjQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZnRydW5jYXRlNjRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5czMyX2Z0cnVuY2F0ZTY0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2xjaG93bl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyMywlcjMJCQkjIHVpZF90Ci0JbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKLQlqZwlzeXNfbGNob3duCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfZ2V0dWlkX3dyYXBwZXIJCQkjIHZvaWQKLSNzeXMzMl9nZXRnaWRfd3JhcHBlcgkJCSMgdm9pZAotI3N5czMyX2dldGV1aWRfd3JhcHBlcgkJCSMgdm9pZAotI3N5czMyX2dldGVnaWRfd3JhcHBlcgkJCSMgdm9pZAotCi1FTlRSWShzeXMzMl9zZXRyZXVpZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVpZF90Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKLQlqZwlzeXNfc2V0cmV1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldHJlZ2lkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgZ2lkX3QKLQlsbGdmcgklcjMsJXIzCQkJIyBnaWRfdAotCWpnCXN5c19zZXRyZWdpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0Z3JvdXBzX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBnaWRfdCAqCi0JamcJc3lzX2dldGdyb3VwcwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0Z3JvdXBzX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBnaWRfdCAqCi0JamcJc3lzX3NldGdyb3VwcwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZmNob3duX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBnaWRfdAotCWpnCXN5c19mY2hvd24JCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldHJlc3VpZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVpZF90Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKLQlsbGdmcgklcjQsJXI0CQkJIyB1aWRfdAotCWpnCXN5c19zZXRyZXN1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldHJlc3VpZF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHVpZF90ICoKLQlsbGd0cgklcjMsJXIzCQkJIyB1aWRfdCAqCi0JbGxndHIJJXI0LCVyNAkJCSMgdWlkX3QgKgotCWpnCXN5c19nZXRyZXN1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldHJlc2dpZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIGdpZF90Ci0JbGxnZnIJJXIzLCVyMwkJCSMgZ2lkX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBnaWRfdAotCWpnCXN5c19zZXRyZXNnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldHJlc2dpZF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGdpZF90ICoKLQlsbGd0cgklcjMsJXIzCQkJIyBnaWRfdCAqCi0JbGxndHIJJXI0LCVyNAkJCSMgZ2lkX3QgKgotCWpnCXN5c19nZXRyZXNnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2Nob3duX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBnaWRfdAotCWpnCXN5c19jaG93bgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0dWlkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdWlkX3QKLQlqZwlzeXNfc2V0dWlkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRnaWRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBnaWRfdAotCWpnCXN5c19zZXRnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldGZzdWlkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdWlkX3QKLQlqZwlzeXNfc2V0ZnN1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldGZzZ2lkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgZ2lkX3QKLQlqZwlzeXNfc2V0ZnNnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3Bpdm90X3Jvb3Rfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfcGl2b3Rfcm9vdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbWluY29yZV93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKLQlsbGd0cgklcjQsJXI0CQkJIyB1bnNpZ25lZCBjaGFyICoKLQlqZwlzeXNfbWluY29yZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbWFkdmlzZV93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19tYWR2aXNlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9nZXRkZW50czY0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgdm9pZCAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2dldGRlbnRzNjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfZmNudGw2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwljb21wYXRfc3lzX2ZjbnRsNjQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc3RhdDY0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXQ2NCAqCi0JamcJc3lzMzJfc3RhdDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9sc3RhdDY0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXQ2NCAqCi0JamcJc3lzMzJfbHN0YXQ2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc3RpbWVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBsb25nICoKLQlqZwljb21wYXRfc3lzX3N0aW1lCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2ZzdGF0NjRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXQ2NCAqCi0JamcJc3lzMzJfZnN0YXQ2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0eGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKLQlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKLQlsZ2ZyCSVyNiwlcjYJCQkjIGludAotCWpnCXN5c19zZXR4YXR0cgotCi1FTlRSWShzeXMzMl9sc2V0eGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKLQlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKLQlsZ2ZyCSVyNiwlcjYJCQkjIGludAotCWpnCXN5c19sc2V0eGF0dHIKLQotRU5UUlkoc3lzMzJfZnNldHhhdHRyX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKLQlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKLQlsZ2ZyCSVyNiwlcjYJCQkjIGludAotCWpnCXN5c19mc2V0eGF0dHIKLQotRU5UUlkoc3lzMzJfZ2V0eGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKLQlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKLQlqZwlzeXNfZ2V0eGF0dHIKLQotRU5UUlkoc3lzMzJfbGdldHhhdHRyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCi0JbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90Ci0JamcJc3lzX2xnZXR4YXR0cgotCi1FTlRSWShzeXMzMl9mZ2V0eGF0dHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAotCWpnCXN5c19mZ2V0eGF0dHIKLQotRU5UUlkoc3lzMzJfbGlzdHhhdHRyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JamcJc3lzX2xpc3R4YXR0cgotCi1FTlRSWShzeXMzMl9sbGlzdHhhdHRyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JamcJc3lzX2xsaXN0eGF0dHIKLQotRU5UUlkoc3lzMzJfZmxpc3R4YXR0cl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JamcJc3lzX2ZsaXN0eGF0dHIKLQotRU5UUlkoc3lzMzJfcmVtb3ZleGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlqZwlzeXNfcmVtb3ZleGF0dHIKLQotRU5UUlkoc3lzMzJfbHJlbW92ZXhhdHRyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JamcJc3lzX2xyZW1vdmV4YXR0cgotCi1FTlRSWShzeXMzMl9mcmVtb3ZleGF0dHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWpnCXN5c19mcmVtb3ZleGF0dHIKLQotRU5UUlkoc3lzMzJfc2NoZWRfc2V0YWZmaW5pdHlfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcgKgotCWpnCWNvbXBhdF9zeXNfc2NoZWRfc2V0YWZmaW5pdHkKLQotRU5UUlkoc3lzMzJfc2NoZWRfZ2V0YWZmaW5pdHlfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcgKgotCWpnCWNvbXBhdF9zeXNfc2NoZWRfZ2V0YWZmaW5pdHkKLQotRU5UUlkoc3lzMzJfZXhpdF9ncm91cF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX2V4aXRfZ3JvdXAJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldF90aWRfYWRkcmVzc193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGludCAqCi0JamcJc3lzX3NldF90aWRfYWRkcmVzcwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfZXBvbGxfY3JlYXRlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlqZwlzeXNfZXBvbGxfY3JlYXRlCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19lcG9sbF9jdGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgZXBvbGxfZXZlbnQgKgotCWpnCXN5c19lcG9sbF9jdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19lcG9sbF93YWl0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgZXBvbGxfZXZlbnQgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGdmcgklcjUsJXI1CQkJIyBpbnQKLQlqZwlzeXNfZXBvbGxfd2FpdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZmFkdmlzZTY0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlzbGxnCSVyMywlcjMsMzIJCSMgZ2V0IGhpZ2ggd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlvcgklcjMsJXI0CQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgbG9mZl90Ci0JbGxnZnIJJXI0LCVyNQkJCSMgc2l6ZV90ICh1bnNpZ25lZCBsb25nKQotCWxnZnIJJXI1LCVyNgkJCSMgaW50Ci0JamcJc3lzMzJfZmFkdmlzZTY0Ci0KLUVOVFJZKHN5czMyX2ZhZHZpc2U2NF82NF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyAqCi0JamcJc3lzMzJfZmFkdmlzZTY0XzY0Ci0KLUVOVFJZKHN5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgotCWpnCWNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZQotCi1FTlRSWShzeXMzMl9jbG9ja19nZXR0aW1lX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBjbG9ja2lkX3QgKGludCkKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlqZwljb21wYXRfc3lzX2Nsb2NrX2dldHRpbWUKLQotRU5UUlkoc3lzMzJfY2xvY2tfZ2V0cmVzX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBjbG9ja2lkX3QgKGludCkKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlqZwljb21wYXRfc3lzX2Nsb2NrX2dldHJlcwotCi1FTlRSWShzeXMzMl9jbG9ja19uYW5vc2xlZXBfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JamcJY29tcGF0X3N5c19jbG9ja19uYW5vc2xlZXAKLQotRU5UUlkoc3lzMzJfdGltZXJfY3JlYXRlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zaWdldmVudCAqCi0JbGxndHIJJXI0LCVyNAkJCSMgdGltZXJfdCAqCi0JamcJY29tcGF0X3N5c190aW1lcl9jcmVhdGUKLQotRU5UUlkoc3lzMzJfdGltZXJfc2V0dGltZV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjICoKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgKgotCWpnCWNvbXBhdF9zeXNfdGltZXJfc2V0dGltZQotCi1FTlRSWShzeXMzMl90aW1lcl9nZXR0aW1lX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjICoKLQlqZwljb21wYXRfc3lzX3RpbWVyX2dldHRpbWUKLQotRU5UUlkoc3lzMzJfdGltZXJfZ2V0b3ZlcnJ1bl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQotCWpnCXN5c190aW1lcl9nZXRvdmVycnVuCi0KLUVOVFJZKHN5czMyX3RpbWVyX2RlbGV0ZV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQotCWpnCXN5c190aW1lcl9kZWxldGUKLQotRU5UUlkoc3lzMzJfaW9fc2V0dXBfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyB1MzIgKgotCWpnCWNvbXBhdF9zeXNfaW9fc2V0dXAKLQotRU5UUlkoc3lzMzJfaW9fZGVzdHJveV93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKLQlqZwlzeXNfaW9fZGVzdHJveQotCi1FTlRSWShzeXMzMl9pb19nZXRldmVudHNfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyAoYWlvX2NvbnRleHRfdCkgdTMyCi0JbGdmcgklcjMsJXIzCQkJIyBsb25nCi0JbGdmcgklcjQsJXI0CQkJIyBsb25nCi0JbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IGlvX2V2ZW50ICoKLQlsbGd0cgklcjYsJXI2CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlqZwljb21wYXRfc3lzX2lvX2dldGV2ZW50cwotCi1FTlRSWShzeXMzMl9pb19zdWJtaXRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyAoYWlvX2NvbnRleHRfdCkgdTMyCi0JbGdmcgklcjMsJXIzCQkJIyBsb25nCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGlvY2IgKioKLQlqZwljb21wYXRfc3lzX2lvX3N1Ym1pdAotCi1FTlRSWShzeXMzMl9pb19jYW5jZWxfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyAoYWlvX2NvbnRleHRfdCkgdTMyCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGlvY2IgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBpb19ldmVudCAqCi0JamcJc3lzX2lvX2NhbmNlbAotCi1FTlRSWShjb21wYXRfc3lzX3N0YXRmczY0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgY29tcGF0X3NpemVfdAotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfc3RhdGZzNjQgKgotCWpnCWNvbXBhdF9zeXNfc3RhdGZzNjQKLQotRU5UUlkoY29tcGF0X3N5c19mc3RhdGZzNjRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQgZmQKLQlsbGdmcgklcjMsJXIzCQkJIyBjb21wYXRfc2l6ZV90Ci0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCAqCi0JamcJY29tcGF0X3N5c19mc3RhdGZzNjQKLQotRU5UUlkoY29tcGF0X3N5c19tcV9vcGVuX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGdmcgklcjQsJXI0CQkJIyBtb2RlX3QKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgKgotCWpnCWNvbXBhdF9zeXNfbXFfb3BlbgotCi1FTlRSWShzeXMzMl9tcV91bmxpbmtfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfbXFfdW5saW5rCi0KLUVOVFJZKGNvbXBhdF9zeXNfbXFfdGltZWRzZW5kX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBtcWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAotCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyNiwlcjYJCQkjIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgotCWpnCWNvbXBhdF9zeXNfbXFfdGltZWRzZW5kCi0KLUVOVFJZKGNvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBtcWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAotCWxsZ3RyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGludCAqCi0JbGxndHIJJXI2LCVyNgkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JamcJY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUKLQotRU5UUlkoY29tcGF0X3N5c19tcV9ub3RpZnlfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zaWdldmVudCAqCi0JamcJY29tcGF0X3N5c19tcV9ub3RpZnkKLQotRU5UUlkoY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBtcWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfbXFfYXR0ciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF9tcV9hdHRyICoKLQlqZwljb21wYXRfc3lzX21xX2dldHNldGF0dHIKLQotRU5UUlkoY29tcGF0X3N5c19hZGRfa2V5X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgdm9pZCAqCi0JbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90Ci0JbGxnZnIJJXI2LCVyNgkJCSMgKGtleV9zZXJpYWxfdCkgdTMyCi0JamcJc3lzX2FkZF9rZXkKLQotRU5UUlkoY29tcGF0X3N5c19yZXF1ZXN0X2tleV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbnN0IHZvaWQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIChrZXlfc2VyaWFsX3QpIHUzMgotCWpnCXN5c19yZXF1ZXN0X2tleQotCi1FTlRSWShzeXMzMl9yZW1hcF9maWxlX3BhZ2VzX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfcmVtYXBfZmlsZV9wYWdlcwotCi1FTlRSWShjb21wYXRfc3lzX2tleGVjX2xvYWRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBrZXhlY19zZWdtZW50ICoKLQlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJY29tcGF0X3N5c19rZXhlY19sb2FkCi0KLUVOVFJZKHN5c19pb3ByaW9fc2V0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX2lvcHJpb19zZXQKLQotRU5UUlkoc3lzX2lvcHJpb19nZXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX2lvcHJpb19nZXQKLQotRU5UUlkoc3lzX2lub3RpZnlfYWRkX3dhdGNoX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1MzIKLQlqZwlzeXNfaW5vdGlmeV9hZGRfd2F0Y2gKLQotRU5UUlkoc3lzX2lub3RpZnlfcm1fd2F0Y2hfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHUzMgotCWpnCXN5c19pbm90aWZ5X3JtX3dhdGNoCi0KLUVOVFJZKHN5c19ta2RpcmF0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19ta2RpcmF0Ci0KLUVOVFJZKHN5c19ta25vZGF0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19ta25vZGF0Ci0KLUVOVFJZKHN5c19mY2hvd25hdF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgdWlkX3QKLQlsbGdmcgklcjUsJXI1CQkJIyBnaWRfdAotCWxnZnIJJXI2LCVyNgkJCSMgaW50Ci0JamcJc3lzX2ZjaG93bmF0Ci0KLUVOVFJZKGNvbXBhdF9zeXNfZnV0aW1lc2F0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHRpbWV2YWwgKgotCWpnCWNvbXBhdF9zeXNfZnV0aW1lc2F0Ci0KLUVOVFJZKHN5czMyX2ZzdGF0YXQ2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBzdGF0NjQgKgotCWxnZnIJJXI1LCVyNQkJCSMgaW50Ci0JamcJc3lzMzJfZnN0YXRhdDY0Ci0KLUVOVFJZKHN5c191bmxpbmthdF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfdW5saW5rYXQKLQotRU5UUlkoc3lzX3JlbmFtZWF0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWxsZ3RyCSVyNSwlcjUJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19yZW5hbWVhdAotCi1FTlRSWShzeXNfbGlua2F0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWxsZ3RyCSVyNSwlcjUJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXI2LCVyNgkJCSMgaW50Ci0JamcJc3lzX2xpbmthdAotCi1FTlRSWShzeXNfc3ltbGlua2F0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGd0cgklcjQsJXI0CQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfc3ltbGlua2F0Ci0KLUVOVFJZKHN5c19yZWFkbGlua2F0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyBjaGFyICoKLQlsZ2ZyCSVyNSwlcjUJCQkjIGludAotCWpnCXN5c19yZWFkbGlua2F0Ci0KLUVOVFJZKHN5c19mY2htb2RhdF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgbW9kZV90Ci0JamcJc3lzX2ZjaG1vZGF0Ci0KLUVOVFJZKHN5c19mYWNjZXNzYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX2ZhY2Nlc3NhdAotCi1FTlRSWShjb21wYXRfc3lzX3BzZWxlY3Q2X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBmZF9zZXQgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIGZkX3NldCAqCi0JbGxndHIJJXI1LCVyNQkJCSMgZmRfc2V0ICoKLQlsbGd0cgklcjYsJXI2CQkJIyBzdHJ1Y3QgdGltZXNwZWMgKgotCWxsZ3QJJXIwLDE2NCglcjE1KQkJIyB2b2lkICoKLQlzdGcJJXIwLDE2MCglcjE1KQotCWpnCWNvbXBhdF9zeXNfcHNlbGVjdDYKLQotRU5UUlkoY29tcGF0X3N5c19wcG9sbF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBwb2xsZmQgKgotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCB0aW1lc3BlYyAqCi0JbGxndHIJJXI1LCVyNQkJCSMgY29uc3Qgc2lnc2V0X3QgKgotCWxsZ2ZyCSVyNiwlcjYJCQkjIHNpemVfdAotCWpnCWNvbXBhdF9zeXNfcHBvbGwKLQotRU5UUlkoc3lzX3Vuc2hhcmVfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzX3Vuc2hhcmUKLQotRU5UUlkoc3lzX3NwbGljZV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgbG9mZl90ICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWxsZ3RyCSVyNSwlcjUJCQkjIGxvZmZfdCAqCi0JbGxnZnIJJXI2LCVyNgkJCSMgc2l6ZV90Ci0JbGxnZgklcjAsMTY0KCVyMTUpCQkjIHVuc2lnbmVkIGludAotCXN0ZwklcjAsMTYwKCVyMTUpCi0JamcJc3lzX3NwbGljZQotCi1FTlRSWShzeXNfc3luY19maWxlX3JhbmdlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlzbGxnCSVyMywlcjMsMzIJCSMgZ2V0IGhpZ2ggd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlvcgklcjMsJXI0CQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgbG9mZl90Ci0Jc2xsZwklcjQsJXI1LDMyCQkjIGdldCBoaWdoIHdvcmQgb2YgNjRiaXQgbG9mZl90Ci0Jb3IJJXI0LCVyNgkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCWxsZ2YJJXI1LDE2NCglcjE1KQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfc3luY19maWxlX3JhbmdlCi0KLUVOVFJZKHN5c190ZWVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX3RlZQotCi1FTlRSWShzeXNfZ2V0Y3B1X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgdW5zaWduZWQgKgotCWxsZ3RyCSVyMywlcjMJCQkjIHVuc2lnbmVkICoKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgZ2V0Y3B1X2NhY2hlICoKLQlqZwlzeXNfZ2V0Y3B1Ci0KLUVOVFJZKGNvbXBhdF9zeXNfdXRpbWVzX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1ldmFsICoKLQlqZwljb21wYXRfc3lzX3V0aW1lcwotCi1FTlRSWShjb21wYXRfc3lzX3V0aW1lbnNhdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgotCWxnZnIJJXI1LCVyNQkJCSMgaW50Ci0JamcJY29tcGF0X3N5c191dGltZW5zYXQKLQotRU5UUlkoc3lzX2V2ZW50ZmRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfZXZlbnRmZAotCi1FTlRSWShzeXNfZmFsbG9jYXRlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCXNsbGcJJXI0LCVyNCwzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCWxyCSVyNCwlcjUJCQkjIGdldCBsb3cgd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlzbGxnCSVyNSwlcjYsMzIJCSMgZ2V0IGhpZ2ggd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlsCSVyNSwxNjQoJXIxNSkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCWpnCXN5c19mYWxsb2NhdGUKLQotRU5UUlkoc3lzX3RpbWVyZmRfY3JlYXRlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c190aW1lcmZkX2NyZWF0ZQotCi1FTlRSWShzeXNfZXZlbnRmZDJfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19ldmVudGZkMgotCi1FTlRSWShzeXNfaW5vdGlmeV9pbml0MV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX2lub3RpZnlfaW5pdDEKLQotRU5UUlkoc3lzX3BpcGUyX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgdTMyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19waXBlMgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX2R1cDNfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19kdXAzCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfZXBvbGxfY3JlYXRlMV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX2Vwb2xsX2NyZWF0ZTEJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcmVhZGFoZWFkX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1MzIKLQlsbGdmcgklcjQsJXI0CQkJIyB1MzIKLQlsZ2ZyCSVyNSwlcjUJCQkjIHMzMgotCWpnCXN5czMyX3JlYWRhaGVhZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX3RraWxsX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3RraWxsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfdGdraWxsX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxnZnIJJXIzLCVyMwkJCSMgcGlkX3QKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c190Z2tpbGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfa2V5Y3RsX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdTMyCi0JbGxnZnIJJXIzLCVyMwkJCSMgdTMyCi0JbGxnZnIJJXI0LCVyNAkJCSMgdTMyCi0JbGxnZnIJJXI1LCVyNQkJCSMgdTMyCi0JbGxnZnIJJXI2LCVyNgkJCSMgdTMyCi0JamcJY29tcGF0X3N5c19rZXljdGwJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX3BlcmZfZXZlbnRfb3Blbl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKgotCWxnZnIJJXIzLCVyMwkJCSMgcGlkX3QKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWxnZnIJJXI1LCVyNQkJCSMgaW50Ci0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19wZXJmX2V2ZW50X29wZW4JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX2Nsb25lX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGd0cgklcjQsJXI0CQkJIyBpbnQgKgotCWxsZ3RyCSVyNSwlcjUJCQkjIGludCAqCi0JamcJc3lzX2Nsb25lCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9leGVjdmVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjb21wYXRfdXB0cl90ICoKLQlsbGd0cgklcjQsJXI0CQkJIyBjb21wYXRfdXB0cl90ICoKLQlqZwljb21wYXRfc3lzX2V4ZWN2ZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfZmFub3RpZnlfaW5pdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19mYW5vdGlmeV9pbml0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19wcmxpbWl0NjRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgc3RydWN0IHJsaW1pdDY0IF9fdXNlciAqCi0JbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IHJsaW1pdDY0IF9fdXNlciAqCi0JamcJc3lzX3BybGltaXQ2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX25hbWVfdG9faGFuZGxlX2F0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyIF9fdXNlciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGZpbGVfaGFuZGxlIF9fdXNlciAqCi0JbGxndHIJJXI1LCVyNQkJCSMgaW50IF9fdXNlciAqCi0JbGdmcgklcjYsJXI2CQkJIyBpbnQKLQlqZwlzeXNfbmFtZV90b19oYW5kbGVfYXQKLQotRU5UUlkoY29tcGF0X3N5c19jbG9ja19hZGp0aW1lX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBjbG9ja2lkX3QgKGludCkKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqCi0JamcJY29tcGF0X3N5c19jbG9ja19hZGp0aW1lCi0KLUVOVFJZKHN5c19zeW5jZnNfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19zeW5jZnMKLQotRU5UUlkoc3lzX3NldG5zX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19zZXRucwotCi1FTlRSWShjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNvbXBhdF9waWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKgotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmCSVyMCwxNjQoJXIxNSkJCSMgdW5zaWduZWQgbG9uZwotCXN0ZwklcjAsMTYwKCVyMTUpCi0JamcJY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2Ci0KLUVOVFJZKGNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNvbXBhdF9waWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKgotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmCSVyMCwxNjQoJXIxNSkJCSMgdW5zaWduZWQgbG9uZwotCXN0ZwklcjAsMTYwKCVyMTUpCi0JamcJY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldgotCi1FTlRSWShzeXNfczM5MF9ydW50aW1lX2luc3RyX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19zMzkwX3J1bnRpbWVfaW5zdHIKLQotRU5UUlkoc3lzX2tjbXBfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGdmcgklcjMsJXIzCQkJIyBwaWRfdAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfa2NtcAotCi1FTlRSWShzeXNfZmluaXRfbW9kdWxlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyIF9fdXNlciAqCi0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfZmluaXRfbW9kdWxlCi0KLUVOVFJZKHN5c19zY2hlZF9zZXRhdHRyX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzY2hlZF9hdHRyIF9fdXNlciAqCi0JamcJc3lzX3NjaGVkX3NldGF0dHIKLQotRU5UUlkoc3lzX3NjaGVkX2dldGF0dHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciBfX3VzZXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19zY2hlZF9nZXRhdHRyCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0YzM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqICBDb21wYXQgc3l0ZW0gY2FsbCB3cmFwcGVycy4KKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTQKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlICJlbnRyeS5oIgorCisjZGVmaW5lIENPTVBBVF9TWVNDQUxMX1dSQVAxKG5hbWUsIC4uLikgXAorCUNPTVBBVF9TWVNDQUxMX1dSQVB4KDEsIF8jI25hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9XUkFQMihuYW1lLCAuLi4pIFwKKwlDT01QQVRfU1lTQ0FMTF9XUkFQeCgyLCBfIyNuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09NUEFUX1NZU0NBTExfV1JBUDMobmFtZSwgLi4uKSBcCisJQ09NUEFUX1NZU0NBTExfV1JBUHgoMywgXyMjbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIENPTVBBVF9TWVNDQUxMX1dSQVA0KG5hbWUsIC4uLikgXAorCUNPTVBBVF9TWVNDQUxMX1dSQVB4KDQsIF8jI25hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9XUkFQNShuYW1lLCAuLi4pIFwKKwlDT01QQVRfU1lTQ0FMTF9XUkFQeCg1LCBfIyNuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09NUEFUX1NZU0NBTExfV1JBUDYobmFtZSwgLi4uKSBcCisJQ09NUEFUX1NZU0NBTExfV1JBUHgoNiwgXyMjbmFtZSwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgX19TQ19DT01QQVRfVFlQRSh0LCBhKSBcCisJX190eXBlb2YoX19idWlsdGluX2Nob29zZV9leHByKHNpemVvZih0KSA+IDQsIDBMLCAodCkwKSkgYQorCisjZGVmaW5lIF9fU0NfQ09NUEFUX0NBU1QodCwgYSkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlsb25nIF9fUmVTID0gYTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTigoc2l6ZW9mKHQpID4gNCkgJiYgIV9fVFlQRV9JU19MKHQpICYmCQlcCisJCSAgICAgIV9fVFlQRV9JU19VTCh0KSAmJiAhX19UWVBFX0lTX1BUUih0KSk7CQlcCisJaWYgKF9fVFlQRV9JU19MKHQpKQkJCQkJCVwKKwkJX19SZVMgPSAoczMyKWE7CQkJCQkJXAorCWlmIChfX1RZUEVfSVNfVUwodCkpCQkJCQkJXAorCQlfX1JlUyA9ICh1MzIpYTsJCQkJCQlcCisJaWYgKF9fVFlQRV9JU19QVFIodCkpCQkJCQkJXAorCQlfX1JlUyA9IGEgJiAweDdmZmZmZmZmOwkJCQkJXAorCSh0KV9fUmVTOwkJCQkJCQlcCit9KQorCisvKgorICogVGhlIENPTVBBVF9TWVNDQUxMX1dSQVAgbWFjcm8gZ2VuZXJhdGVzIHN5c3RlbSBjYWxsIHdyYXBwZXJzIHRvIGJlIHVzZWQgYnkKKyAqIGNvbXBhdCB0YXNrcy4gVGhlc2Ugd3JhcHBlcnMgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHN5c3RlbSBjYWxscyB3aGVyZSBvbmx5CisgKiB0aGUgc3lzdGVtIGNhbGwgYXJndW1lbnRzIG5lZWQgc2lnbiBvciB6ZXJvIGV4dGVuc2lvbiBvciB6ZXJvaW5nIG9mIHRoZSB1cHBlcgorICogMzMgYml0cyBvZiBwb2ludGVycy4KKyAqIE5vdGU6IHNpbmNlIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIHdpbGwgYWZ0ZXJ3YXJkcyBjYWxsIGEgc3lzdGVtIGNhbGwgd2hpY2gKKyAqIGFnYWluIHBlcmZvcm1zIHplcm8gYW5kIHNpZ24gZXh0ZW5zaW9uIGZvciBhbGwgc3lzdGVtIGNhbGwgYXJndW1lbnRzIHdpdGgKKyAqIGEgc2l6ZSBvZiBsZXNzIHRoYW4gZWlnaHQgYnl0ZXMsIHRoZXNlIGNvbXBhdCB3cmFwcGVycyBvbmx5IHRvdWNoIHRob3NlCisgKiBzeXN0ZW0gY2FsbCBhcmd1bWVudHMgd2l0aCBhIHNpemUgb2YgZWlnaHQgYnl0ZXMgKCh1bnNpZ25lZCkgbG9uZyBhbmQKKyAqIHBvaW50ZXJzKS4gWmVybyBhbmQgc2lnbiBleHRlbnNpb24gZm9yIGUuZy4gaW50IHBhcmFtZXRlcnMgd2lsbCBiZSBkb25lIGJ5CisgKiB0aGUgcmVndWxhciBzeXN0ZW0gY2FsbCB3cmFwcGVycy4KKyAqLworI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9XUkFQeCh4LCBuYW1lLCAuLi4pCQkJCQlcCisJYXNtbGlua2FnZSBsb25nIHN5cyMjbmFtZShfX01BUCh4LF9fU0NfREVDTCxfX1ZBX0FSR1NfXykpOwkJXAorCWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzIyNuYW1lKF9fTUFQKHgsX19TQ19DT01QQVRfVFlQRSxfX1ZBX0FSR1NfXykpO1wKKwlhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5cyMjbmFtZShfX01BUCh4LF9fU0NfQ09NUEFUX1RZUEUsX19WQV9BUkdTX18pKQlcCisJewkJCQkJCQkJCVwKKwkJcmV0dXJuIHN5cyMjbmFtZShfX01BUCh4LF9fU0NfQ09NUEFUX0NBU1QsX19WQV9BUkdTX18pKTsJXAorCX0KKworQ09NUEFUX1NZU0NBTExfV1JBUDEoZXhpdCwgaW50LCBlcnJvcl9jb2RlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihsaW5rLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHVubGluaywgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoY2hkaXIsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKG1rbm9kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdW1vZGVfdCwgbW9kZSwgdW5zaWduZWQsIGRldik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihjaG1vZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHVtb2RlX3QsIG1vZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEob2xkdW1vdW50LCBjaGFyIF9fdXNlciAqLCBuYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGFsYXJtLCB1bnNpZ25lZCBpbnQsIHNlY29uZHMpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoYWNjZXNzLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgaW50LCBtb2RlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKG5pY2UsIGludCwgaW5jcmVtZW50KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGtpbGwsIGludCwgcGlkLCBpbnQsIHNpZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihyZW5hbWUsIGNvbnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICosIG5ld25hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIobWtkaXIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHJtZGlyLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShkdXAsIHVuc2lnbmVkIGludCwgZmlsZGVzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHBpcGUsIGludCBfX3VzZXIgKiwgZmlsZGVzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGJyaywgdW5zaWduZWQgbG9uZywgYnJrKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNpZ25hbCwgaW50LCBzaWcsIF9fc2lnaGFuZGxlcl90LCBoYW5kbGVyKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGFjY3QsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIodW1vdW50LCBjaGFyIF9fdXNlciAqLCBuYW1lLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNldHBnaWQsIHBpZF90LCBwaWQsIHBpZF90LCBwZ2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHVtYXNrLCBpbnQsIG1hc2spOworQ09NUEFUX1NZU0NBTExfV1JBUDEoY2hyb290LCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihkdXAyLCB1bnNpZ25lZCBpbnQsIG9sZGZkLCB1bnNpZ25lZCBpbnQsIG5ld2ZkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHNpZ3N1c3BlbmQsIGludCwgdW51c2VkMSwgaW50LCB1bnVzZWQyLCBvbGRfc2lnc2V0X3QsIG1hc2spOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2V0aG9zdG5hbWUsIGNoYXIgX191c2VyICosIG5hbWUsIGludCwgbGVuKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHN5bWxpbmssIGNvbnN0IGNoYXIgX191c2VyICosIG9sZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHJlYWRsaW5rLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCBjaGFyIF9fdXNlciAqLCBidWYsIGludCwgYnVmc2l6KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHVzZWxpYiwgY29uc3QgY2hhciBfX3VzZXIgKiwgbGlicmFyeSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDQocmVib290LCBpbnQsIG1hZ2ljMSwgaW50LCBtYWdpYzIsIHVuc2lnbmVkIGludCwgY21kLCB2b2lkIF9fdXNlciAqLCBhcmcpOworQ09NUEFUX1NZU0NBTExfV1JBUDIobXVubWFwLCB1bnNpZ25lZCBsb25nLCBhZGRyLCBzaXplX3QsIGxlbik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihmY2htb2QsIHVuc2lnbmVkIGludCwgZmQsIHVtb2RlX3QsIG1vZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoZ2V0cHJpb3JpdHksIGludCwgd2hpY2gsIGludCwgd2hvKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHNldHByaW9yaXR5LCBpbnQsIHdoaWNoLCBpbnQsIHdobywgaW50LCBuaWNldmFsKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHN5c2xvZywgaW50LCB0eXBlLCBjaGFyIF9fdXNlciAqLCBidWYsIGludCwgbGVuKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGZzeW5jLCB1bnNpZ25lZCBpbnQsIGZkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNldGRvbWFpbm5hbWUsIGNoYXIgX191c2VyICosIG5hbWUsIGludCwgbGVuKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKG5ld3VuYW1lLCBzdHJ1Y3QgbmV3X3V0c25hbWUgX191c2VyICosIG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDMobXByb3RlY3QsIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbiwgdW5zaWduZWQgbG9uZywgcHJvdCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhpbml0X21vZHVsZSwgdm9pZCBfX3VzZXIgKiwgdW1vZCwgdW5zaWduZWQgbG9uZywgbGVuLCBjb25zdCBjaGFyIF9fdXNlciAqLCB1YXJncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihkZWxldGVfbW9kdWxlLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lX3VzZXIsIHVuc2lnbmVkIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDQocXVvdGFjdGwsIHVuc2lnbmVkIGludCwgY21kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsLCBxaWRfdCwgaWQsIHZvaWQgX191c2VyICosIGFkZHIpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoZ2V0cGdpZCwgcGlkX3QsIHBpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShmY2hkaXIsIHVuc2lnbmVkIGludCwgZmQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoYmRmbHVzaCwgaW50LCBmdW5jLCBsb25nLCBkYXRhKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHN5c2ZzLCBpbnQsIG9wdGlvbiwgdW5zaWduZWQgbG9uZywgYXJnMSwgdW5zaWduZWQgbG9uZywgYXJnMik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzMzkwX3BlcnNvbmFsaXR5LCB1bnNpZ25lZCBpbnQsIHBlcnNvbmFsaXR5KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KGxsc2VlaywgdW5zaWduZWQgaW50LCBmZCwgdW5zaWduZWQgbG9uZywgaGlnaCwgdW5zaWduZWQgbG9uZywgbG93LCBsb2ZmX3QgX191c2VyICosIHJlc3VsdCwgdW5zaWduZWQgaW50LCB3aGVuY2UpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoZmxvY2ssIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGludCwgY21kKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKG1zeW5jLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4sIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoZ2V0c2lkLCBwaWRfdCwgcGlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGZkYXRhc3luYywgdW5zaWduZWQgaW50LCBmZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihtbG9jaywgdW5zaWduZWQgbG9uZywgc3RhcnQsIHNpemVfdCwgbGVuKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKG11bmxvY2ssIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShtbG9ja2FsbCwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzY2hlZF9zZXRwYXJhbSwgcGlkX3QsIHBpZCwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqLCBwYXJhbSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzY2hlZF9nZXRwYXJhbSwgcGlkX3QsIHBpZCwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqLCBwYXJhbSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhzY2hlZF9zZXRzY2hlZHVsZXIsIHBpZF90LCBwaWQsIGludCwgcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICosIHBhcmFtKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHNjaGVkX2dldHNjaGVkdWxlciwgcGlkX3QsIHBpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzY2hlZF9nZXRfcHJpb3JpdHlfbWF4LCBpbnQsIHBvbGljeSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzY2hlZF9nZXRfcHJpb3JpdHlfbWluLCBpbnQsIHBvbGljeSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShtcmVtYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHVuc2lnbmVkIGxvbmcsIG9sZF9sZW4sIHVuc2lnbmVkIGxvbmcsIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcsIGZsYWdzLCB1bnNpZ25lZCBsb25nLCBuZXdfYWRkcik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhwb2xsLCBzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqLCB1ZmRzLCB1bnNpZ25lZCBpbnQsIG5mZHMsIGludCwgdGltZW91dCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShwcmN0bCwgaW50LCBvcHRpb24sIHVuc2lnbmVkIGxvbmcsIGFyZzIsIHVuc2lnbmVkIGxvbmcsIGFyZzMsIHVuc2lnbmVkIGxvbmcsIGFyZzQsIHVuc2lnbmVkIGxvbmcsIGFyZzUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoZ2V0Y3dkLCBjaGFyIF9fdXNlciAqLCBidWYsIHVuc2lnbmVkIGxvbmcsIHNpemUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoY2FwZ2V0LCBjYXBfdXNlcl9oZWFkZXJfdCwgaGVhZGVyLCBjYXBfdXNlcl9kYXRhX3QsIGRhdGFwdHIpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoY2Fwc2V0LCBjYXBfdXNlcl9oZWFkZXJfdCwgaGVhZGVyLCBjb25zdCBjYXBfdXNlcl9kYXRhX3QsIGRhdGEpOworQ09NUEFUX1NZU0NBTExfV1JBUDMobGNob3duLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdWlkX3QsIHVzZXIsIGdpZF90LCBncm91cCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzZXRyZXVpZCwgdWlkX3QsIHJ1aWQsIHVpZF90LCBldWlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNldHJlZ2lkLCBnaWRfdCwgcmdpZCwgZ2lkX3QsIGVnaWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoZ2V0Z3JvdXBzLCBpbnQsIGdpZHNldHNpemUsIGdpZF90IF9fdXNlciAqLCBncm91cGxpc3QpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2V0Z3JvdXBzLCBpbnQsIGdpZHNldHNpemUsIGdpZF90IF9fdXNlciAqLCBncm91cGxpc3QpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoZmNob3duLCB1bnNpZ25lZCBpbnQsIGZkLCB1aWRfdCwgdXNlciwgZ2lkX3QsIGdyb3VwKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHNldHJlc3VpZCwgdWlkX3QsIHJ1aWQsIHVpZF90LCBldWlkLCB1aWRfdCwgc3VpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhnZXRyZXN1aWQsIHVpZF90IF9fdXNlciAqLCBydWlkLCB1aWRfdCBfX3VzZXIgKiwgZXVpZCwgdWlkX3QgX191c2VyICosIHN1aWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoc2V0cmVzZ2lkLCBnaWRfdCwgcmdpZCwgZ2lkX3QsIGVnaWQsIGdpZF90LCBzZ2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGdldHJlc2dpZCwgZ2lkX3QgX191c2VyICosIHJnaWQsIGdpZF90IF9fdXNlciAqLCBlZ2lkLCBnaWRfdCBfX3VzZXIgKiwgc2dpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhjaG93biwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHVpZF90LCB1c2VyLCBnaWRfdCwgZ3JvdXApOworQ09NUEFUX1NZU0NBTExfV1JBUDEoc2V0dWlkLCB1aWRfdCwgdWlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHNldGdpZCwgZ2lkX3QsIGdpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzZXRmc3VpZCwgdWlkX3QsIHVpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzZXRmc2dpZCwgZ2lkX3QsIGdpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihwaXZvdF9yb290LCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXdfcm9vdCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcHV0X29sZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhtaW5jb3JlLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4sIHVuc2lnbmVkIGNoYXIgX191c2VyICosIHZlYyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhtYWR2aXNlLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4sIGludCwgYmVoYXZpb3IpOworQ09NUEFUX1NZU0NBTExfV1JBUDUoc2V0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUsIGNvbnN0IHZvaWQgX191c2VyICosIHZhbHVlLCBzaXplX3QsIHNpemUsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDUobHNldHhhdHRyLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCBjb25zdCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KGZzZXR4YXR0ciwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiwgdmFsdWUsIHNpemVfdCwgc2l6ZSwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhnZXRkZW50czY0LCB1bnNpZ25lZCBpbnQsIGZkLCBzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICosIGRpcmVudCwgdW5zaWduZWQgaW50LCBjb3VudCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChnZXR4YXR0ciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwgdm9pZCBfX3VzZXIgKiwgdmFsdWUsIHNpemVfdCwgc2l6ZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChsZ2V0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUsIHZvaWQgX191c2VyICosIHZhbHVlLCBzaXplX3QsIHNpemUpOworQ09NUEFUX1NZU0NBTExfV1JBUDQoZmdldHhhdHRyLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGxpc3R4YXR0ciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgY2hhciBfX3VzZXIgKiwgbGlzdCwgc2l6ZV90LCBzaXplKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGxsaXN0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNoYXIgX191c2VyICosIGxpc3QsIHNpemVfdCwgc2l6ZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhmbGlzdHhhdHRyLCBpbnQsIGZkLCBjaGFyIF9fdXNlciAqLCBsaXN0LCBzaXplX3QsIHNpemUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIocmVtb3ZleGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIobHJlbW92ZXhhdHRyLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGZyZW1vdmV4YXR0ciwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShleGl0X2dyb3VwLCBpbnQsIGVycm9yX2NvZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoc2V0X3RpZF9hZGRyZXNzLCBpbnQgX191c2VyICosIHRpZHB0cik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShlcG9sbF9jcmVhdGUsIGludCwgc2l6ZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChlcG9sbF9jdGwsIGludCwgZXBmZCwgaW50LCBvcCwgaW50LCBmZCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqLCBldmVudCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChlcG9sbF93YWl0LCBpbnQsIGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKiwgZXZlbnRzLCBpbnQsIG1heGV2ZW50cywgaW50LCB0aW1lb3V0KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHRpbWVyX2dldG92ZXJydW4sIHRpbWVyX3QsIHRpbWVyX2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHRpbWVyX2RlbGV0ZSwgY29tcGF0X3RpbWVyX3QsIGNvbXBhdF90aW1lcl9pZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShpb19kZXN0cm95LCBhaW9fY29udGV4dF90LCBjdHgpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoaW9fY2FuY2VsLCBhaW9fY29udGV4dF90LCBjdHhfaWQsIHN0cnVjdCBpb2NiIF9fdXNlciAqLCBpb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICosIHJlc3VsdCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShtcV91bmxpbmssIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDUoYWRkX2tleSwgY29uc3QgY2hhciBfX3VzZXIgKiwgdHAsIGNvbnN0IGNoYXIgX191c2VyICosIGRzYywgY29uc3Qgdm9pZCBfX3VzZXIgKiwgcGxkLCBzaXplX3QsIGxlbiwga2V5X3NlcmlhbF90LCBpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChyZXF1ZXN0X2tleSwgY29uc3QgY2hhciBfX3VzZXIgKiwgdHAsIGNvbnN0IGNoYXIgX191c2VyICosIGRzYywgY29uc3QgY2hhciBfX3VzZXIgKiwgaW5mbywga2V5X3NlcmlhbF90LCBpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShyZW1hcF9maWxlX3BhZ2VzLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgdW5zaWduZWQgbG9uZywgc2l6ZSwgdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgcGdvZmYsIHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGlvcHJpb19zZXQsIGludCwgd2hpY2gsIGludCwgd2hvLCBpbnQsIGlvcHJpbyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihpb3ByaW9fZ2V0LCBpbnQsIHdoaWNoLCBpbnQsIHdobyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhpbm90aWZ5X2FkZF93YXRjaCwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgdTMyLCBtYXNrKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGlub3RpZnlfcm1fd2F0Y2gsIGludCwgZmQsIF9fczMyLCB3ZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhta2RpcmF0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIHVtb2RlX3QsIG1vZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDQobWtub2RhdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCB1bW9kZV90LCBtb2RlLCB1bnNpZ25lZCwgZGV2KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KGZjaG93bmF0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHVpZF90LCB1c2VyLCBnaWRfdCwgZ3JvdXAsIGludCwgZmxhZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyh1bmxpbmthdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCBpbnQsIGZsYWcpOworQ09NUEFUX1NZU0NBTExfV1JBUDQocmVuYW1lYXQsIGludCwgb2xkZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLCBpbnQsIG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3bmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShsaW5rYXQsIGludCwgb2xkZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLCBpbnQsIG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3bmFtZSwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhzeW1saW5rYXQsIGNvbnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsIGludCwgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KHJlYWRsaW5rYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCBjaGFyIF9fdXNlciAqLCBidWYsIGludCwgYnVmc2l6KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGZjaG1vZGF0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHVtb2RlX3QsIG1vZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoZmFjY2Vzc2F0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIGludCwgbW9kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMSh1bnNoYXJlLCB1bnNpZ25lZCBsb25nLCB1bnNoYXJlX2ZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA2KHNwbGljZSwgaW50LCBmZF9pbiwgbG9mZl90IF9fdXNlciAqLCBvZmZfaW4sIGludCwgZmRfb3V0LCBsb2ZmX3QgX191c2VyICosIG9mZl9vdXQsIHNpemVfdCwgbGVuLCB1bnNpZ25lZCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KHRlZSwgaW50LCBmZGluLCBpbnQsIGZkb3V0LCBzaXplX3QsIGxlbiwgdW5zaWduZWQgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhnZXRjcHUsIHVuc2lnbmVkIF9fdXNlciAqLCBjcHUsIHVuc2lnbmVkIF9fdXNlciAqLCBub2RlLCBzdHJ1Y3QgZ2V0Y3B1X2NhY2hlIF9fdXNlciAqLCBjYWNoZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShldmVudGZkLCB1bnNpZ25lZCBpbnQsIGNvdW50KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHRpbWVyZmRfY3JlYXRlLCBpbnQsIGNsb2NraWQsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoZXZlbnRmZDIsIHVuc2lnbmVkIGludCwgY291bnQsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoaW5vdGlmeV9pbml0MSwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihwaXBlMiwgaW50IF9fdXNlciAqLCBmaWxkZXMsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoZHVwMywgdW5zaWduZWQgaW50LCBvbGRmZCwgdW5zaWduZWQgaW50LCBuZXdmZCwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShlcG9sbF9jcmVhdGUxLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHRraWxsLCBpbnQsIHBpZCwgaW50LCBzaWcpOworQ09NUEFUX1NZU0NBTExfV1JBUDModGdraWxsLCBpbnQsIHRnaWQsIGludCwgcGlkLCBpbnQsIHNpZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShwZXJmX2V2ZW50X29wZW4sIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgX191c2VyICosIGF0dHJfdXB0ciwgcGlkX3QsIHBpZCwgaW50LCBjcHUsIGludCwgZ3JvdXBfZmQsIHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KGNsb25lLCB1bnNpZ25lZCBsb25nLCBuZXdzcCwgdW5zaWduZWQgbG9uZywgY2xvbmVfZmxhZ3MsIGludCBfX3VzZXIgKiwgcGFyZW50X3RpZHB0ciwgaW50IF9fdXNlciAqLCBjaGlsZF90aWRwdHIsIGludCwgdGxzX3ZhbCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihmYW5vdGlmeV9pbml0LCB1bnNpZ25lZCBpbnQsIGZsYWdzLCB1bnNpZ25lZCBpbnQsIGV2ZW50X2ZfZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDQocHJsaW1pdDY0LCBwaWRfdCwgcGlkLCB1bnNpZ25lZCBpbnQsIHJlc291cmNlLCBjb25zdCBzdHJ1Y3QgcmxpbWl0NjQgX191c2VyICosIG5ld19ybGltLCBzdHJ1Y3QgcmxpbWl0NjQgX191c2VyICosIG9sZF9ybGltKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KG5hbWVfdG9faGFuZGxlX2F0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwgc3RydWN0IGZpbGVfaGFuZGxlIF9fdXNlciAqLCBoYW5kbGUsIGludCBfX3VzZXIgKiwgbW50X2lkLCBpbnQsIGZsYWcpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoc3luY2ZzLCBpbnQsIGZkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNldG5zLCBpbnQsIGZkLCBpbnQsIG5zdHlwZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzMzkwX3J1bnRpbWVfaW5zdHIsIGludCwgY29tbWFuZCwgaW50LCBzaWdudW0pOworQ09NUEFUX1NZU0NBTExfV1JBUDUoa2NtcCwgcGlkX3QsIHBpZDEsIHBpZF90LCBwaWQyLCBpbnQsIHR5cGUsIHVuc2lnbmVkIGxvbmcsIGlkeDEsIHVuc2lnbmVkIGxvbmcsIGlkeDIpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoZmluaXRfbW9kdWxlLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCB1YXJncywgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhzY2hlZF9zZXRhdHRyLCBwaWRfdCwgcGlkLCBzdHJ1Y3Qgc2NoZWRfYXR0ciBfX3VzZXIgKiwgYXR0ciwgdW5zaWduZWQgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChzY2hlZF9nZXRhdHRyLCBwaWRfdCwgcGlkLCBzdHJ1Y3Qgc2NoZWRfYXR0ciBfX3VzZXIgKiwgYXR0ciwgdW5zaWduZWQgaW50LCBzaXplLCB1bnNpZ25lZCBpbnQsIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYyBiL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYwppbmRleCBmY2EyMGI1Li42YjU5NDQzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCkBAIC0zODAsOCArMzgwLDYgQEAKIAkJUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgfD0gTUFDSElORV9GTEFHX0VEQVQyOwogCWlmICh0ZXN0X2ZhY2lsaXR5KDMpKQogCQlTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyB8PSBNQUNISU5FX0ZMQUdfSURURTsKLQlpZiAodGVzdF9mYWNpbGl0eSgyNykpCi0JCVMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzIHw9IE1BQ0hJTkVfRkxBR19NVkNPUzsKIAlpZiAodGVzdF9mYWNpbGl0eSg0MCkpCiAJCVMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzIHw9IE1BQ0hJTkVfRkxBR19MUFA7CiAJaWYgKHRlc3RfZmFjaWxpdHkoNTApICYmIHRlc3RfZmFjaWxpdHkoNzMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDBkYzJiNmQuLjUyNmQzNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTQzLDYgKzQzLDcgQEAKIAkJIF9USUZfTUNDS19QRU5ESU5HKQogX1RJRl9UUkFDRSAgICA9IChfVElGX1NZU0NBTExfVFJBQ0UgfCBfVElGX1NZU0NBTExfQVVESVQgfCBfVElGX1NFQ0NPTVAgfCBcCiAJCSBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVCkKK19USUZfVFJBTlNGRVIgPSAoX1RJRl9NQ0NLX1BFTkRJTkcgfCBfVElGX1RMQl9XQUlUKQogCiBTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKIFNUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVApAQCAtMTU5LDEwICsxNjAsMTIgQEAKIAlsY3RsCSVjNCwlYzQsX19UQVNLX3BpZCglcjMpCQkjIGxvYWQgcGlkIHRvIGNvbnRyb2wgcmVnLiA0CiAJbXZjCV9fTENfQ1VSUkVOVF9QSUQoNCwlcjApLF9fVEFTS19waWQoJXIzKQkjIHN0b3JlIHBpZCBvZiBuZXh0CiAJbAklcjE1LF9fVEhSRUFEX2tzcCglcjMpCQkjIGxvYWQga2VybmVsIHN0YWNrIG9mIG5leHQKLQl0bQlfX1RJX2ZsYWdzKzMoJXI0KSxfVElGX01DQ0tfUEVORElORyAjIG1hY2hpbmUgY2hlY2sgcGVuZGluZz8KKwlsaGkJJXI2LF9USUZfVFJBTlNGRVIJCSMgdHJhbnNmZXIgVElGIGJpdHMKKwluCSVyNixfX1RJX2ZsYWdzKCVyNCkJCSMgaXNvbGF0ZSBUSUYgYml0cwogCWp6CTBmCi0JbmkJX19USV9mbGFncyszKCVyNCksMjU1LV9USUZfTUNDS19QRU5ESU5HCSMgY2xlYXIgZmxhZyBpbiBwcmV2Ci0Jb2kJX19USV9mbGFncyszKCVyNSksX1RJRl9NQ0NLX1BFTkRJTkcJIyBzZXQgaXQgaW4gbmV4dAorCW8JJXI2LF9fVElfZmxhZ3MoJXI1KQkJIyBzZXQgVElGIGJpdHMgb2YgbmV4dAorCXN0CSVyNixfX1RJX2ZsYWdzKCVyNSkKKwluaQlfX1RJX2ZsYWdzKzMoJXI0KSwyNTUtX1RJRl9UUkFOU0ZFUiAjIGNsZWFyIFRJRiBiaXRzIG9mIHByZXYKIDA6CWxtCSVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KQkjIGxvYWQgZ3BycyBvZiBuZXh0IHRhc2sKIAlicgklcjE0CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaCBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaAppbmRleCBjYjUzM2Y3Li42YWM3ODE5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmgKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oCkBAIC02Nyw5ICs2Nyw3IEBACiBzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3M7CiBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbjsKIAotbG9uZyBzeXNfc2lncmV0dXJuKHZvaWQpOwotbG9uZyBzeXNfcnRfc2lncmV0dXJuKHZvaWQpOwotbG9uZyBzeXMzMl9zaWdyZXR1cm4odm9pZCk7Ci1sb25nIHN5czMyX3J0X3NpZ3JldHVybih2b2lkKTsKK2xvbmcgc3lzX3MzOTBfcGVyc29uYWxpdHkodW5zaWduZWQgaW50IHBlcnNvbmFsaXR5KTsKK2xvbmcgc3lzX3MzOTBfcnVudGltZV9pbnN0cihpbnQgY29tbWFuZCwgaW50IHNpZ251bSk7CiAKICNlbmRpZiAvKiBfRU5UUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwppbmRleCAzODRlNjA5Li5lMDlkYmU1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwpAQCAtNDgsNiArNDgsNyBAQAogCQkgX1RJRl9NQ0NLX1BFTkRJTkcpCiBfVElGX1RSQUNFICAgID0gKF9USUZfU1lTQ0FMTF9UUkFDRSB8IF9USUZfU1lTQ0FMTF9BVURJVCB8IF9USUZfU0VDQ09NUCB8IFwKIAkJIF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQorX1RJRl9UUkFOU0ZFUiA9IChfVElGX01DQ0tfUEVORElORyB8IF9USUZfVExCX1dBSVQpCiAKICNkZWZpbmUgQkFTRUQobmFtZSkgbmFtZS1zeXN0ZW1fY2FsbCglcjEzKQogCkBAIC0xODksMTAgKzE5MCwxMiBAQAogCWxjdGwJJWM0LCVjNCxfX1RBU0tfcGlkKCVyMykJCSMgbG9hZCBwaWQgdG8gY29udHJvbCByZWcuIDQKIAltdmMJX19MQ19DVVJSRU5UX1BJRCs0KDQsJXIwKSxfX1RBU0tfcGlkKCVyMykgIyBzdG9yZSBwaWQgb2YgbmV4dAogCWxnCSVyMTUsX19USFJFQURfa3NwKCVyMykJCSMgbG9hZCBrZXJuZWwgc3RhY2sgb2YgbmV4dAotCXRtCV9fVElfZmxhZ3MrNyglcjQpLF9USUZfTUNDS19QRU5ESU5HICMgbWFjaGluZSBjaGVjayBwZW5kaW5nPworCWxsaWxsCSVyNixfVElGX1RSQU5TRkVSCQkjIHRyYW5zZmVyIFRJRiBiaXRzCisJbmcJJXI2LF9fVElfZmxhZ3MoJXI0KQkJIyBpc29sYXRlIFRJRiBiaXRzCiAJanoJMGYKLQluaQlfX1RJX2ZsYWdzKzcoJXI0KSwyNTUtX1RJRl9NQ0NLX1BFTkRJTkcJIyBjbGVhciBmbGFnIGluIHByZXYKLQlvaQlfX1RJX2ZsYWdzKzcoJXI1KSxfVElGX01DQ0tfUEVORElORwkjIHNldCBpdCBpbiBuZXh0CisJb2cJJXI2LF9fVElfZmxhZ3MoJXI1KQkJIyBzZXQgVElGIGJpdHMgb2YgbmV4dAorCXN0ZwklcjYsX19USV9mbGFncyglcjUpCisJbmkJX19USV9mbGFncys3KCVyNCksMjU1LV9USUZfVFJBTlNGRVIgIyBjbGVhciBUSUYgYml0cyBvZiBwcmV2CiAwOglsbWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCSMgbG9hZCBncHJzIG9mIG5leHQgdGFzawogCWJyCSVyMTQKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYyBiL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKaW5kZXggYmIyN2EyNi4uYTc3MGJlOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2lycS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL3MzOTAva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA1ZDJkZmEzLi42MTU5NWMxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQkgICAgICAgOiBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTDsKIH0KIAotdm9pZCBwcmludF9kZWJ1Z19jZih2b2lkKQorc3RhdGljIHZvaWQgcHJpbnRfZGVidWdfY2Yodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1bWZfY3RyX2luZm8gY2ZfaW5mbzsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZjZiZTYwOC4uNGFjOGZhZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC04NSw3ICs4NSwxMCBAQAogCiAJLyogbWVyZ2UgVElGX1NJTkdMRV9TVEVQIGludG8gdXNlciBzcGVjaWZpZWQgUEVSIHJlZ2lzdGVycy4gKi8KIAlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRV9TVEVQKSkgewotCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfSUZFVENIOworCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0JMT0NLX1NURVApKQorCQkJbmV3LmNvbnRyb2wgfD0gUEVSX0VWRU5UX0JSQU5DSDsKKwkJZWxzZQorCQkJbmV3LmNvbnRyb2wgfD0gUEVSX0VWRU5UX0lGRVRDSDsKICNpZmRlZiBDT05GSUdfNjRCSVQKIAkJbmV3LmNvbnRyb2wgfD0gUEVSX0NPTlRST0xfU1VTUEVOU0lPTjsKIAkJbmV3LmNvbnRyb2wgfD0gUEVSX0VWRU5UX1RSQU5TQUNUSU9OX0VORDsKQEAgLTEwNywxNCArMTEwLDIyIEBACiAKIHZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogeworCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfQkxPQ0tfU1RFUCk7CiAJc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFX1NURVApOwogfQogCiB2b2lkIHVzZXJfZGlzYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9CTE9DS19TVEVQKTsKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRV9TVEVQKTsKIH0KIAordm9pZCB1c2VyX2VuYWJsZV9ibG9ja19zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVfU1RFUCk7CisJc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfQkxPQ0tfU1RFUCk7Cit9CisKIC8qCiAgKiBDYWxsZWQgYnkga2VybmVsL3B0cmFjZS5jIHdoZW4gZGV0YWNoaW5nLi4KICAqCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggMDllMmY0Ni4uZjcwZjI0OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogCiAjaW5jbHVkZSA8YXNtL2lwbC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2ZhY2lsaXR5Lmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpAQCAtNjUsMTIgKzY0LDYgQEAKICNpbmNsdWRlICJlbnRyeS5oIgogCiAvKgotICogVXNlciBjb3B5IG9wZXJhdGlvbnMuCi0gKi8KLXN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzOwotRVhQT1JUX1NZTUJPTCh1YWNjZXNzKTsKLQotLyoKICAqIE1hY2hpbmUgc2V0dXAuLgogICovCiB1bnNpZ25lZCBpbnQgY29uc29sZV9tb2RlID0gMDsKQEAgLTI5NCwxNCArMjg3LDYgQEAKIH0KIGVhcmx5X3BhcmFtKCJ2bWFsbG9jIiwgcGFyc2Vfdm1hbGxvYyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3VzZXJfbW9kZShjaGFyICpwKQotewotCWlmICghcCB8fCBzdHJjbXAocCwgInByaW1hcnkiKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLWVhcmx5X3BhcmFtKCJ1c2VyX21vZGUiLCBlYXJseV9wYXJzZV91c2VyX21vZGUpOwotCiB2b2lkICpyZXN0YXJ0X3N0YWNrIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9sb3djb3JlKHZvaWQpCkBAIC0xMDA5LDggKzk5NCw2IEBACiAJaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmX2VkYXRhOwogCWluaXRfbW0uYnJrID0gKHVuc2lnbmVkIGxvbmcpICZfZW5kOwogCi0JdWFjY2VzcyA9IE1BQ0hJTkVfSEFTX01WQ09TID8gdWFjY2Vzc19tdmNvcyA6IHVhY2Nlc3NfcHQ7Ci0KIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCWRldGVjdF9tZW1vcnlfbGF5b3V0KG1lbW9yeV9jaHVuaywgbWVtb3J5X2VuZCk7CiAJb3NfaW5mb19pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCBhNzEyNWI2Li44ODI3ODgzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTc3MywxMSArNzczLDExIEBACiAKIHZvaWQgX19pbml0IHNtcF9maWxsX3Bvc3NpYmxlX21hc2sodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgcG9zc2libGUsIGNwdTsKKwl1bnNpZ25lZCBpbnQgcG9zc2libGUsIHNjbHAsIGNwdTsKIAotCXBvc3NpYmxlID0gc2V0dXBfcG9zc2libGVfY3B1czsKLQlpZiAoIXBvc3NpYmxlKQotCQlwb3NzaWJsZSA9IE1BQ0hJTkVfSVNfVk0gPyA2NCA6IG5yX2NwdV9pZHM7CisJc2NscCA9IHNjbHBfZ2V0X21heF9jcHUoKSA/OiBucl9jcHVfaWRzOworCXBvc3NpYmxlID0gc2V0dXBfcG9zc2libGVfY3B1cyA/OiBucl9jcHVfaWRzOworCXBvc3NpYmxlID0gbWluKHBvc3NpYmxlLCBzY2xwKTsKIAlmb3IgKGNwdSA9IDA7IGNwdSA8IHBvc3NpYmxlICYmIGNwdSA8IG5yX2NwdV9pZHM7IGNwdSsrKQogCQlzZXRfY3B1X3Bvc3NpYmxlKGNwdSwgdHJ1ZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggMTQzOTkyMS4uNTQyZWY0OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtOSwzNDkgKzksMzQ5IEBACiAjZGVmaW5lIE5JX1NZU0NBTEwgU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCkKIAogTklfU1lTQ0FMTAkJCQkJCQkvKiAwICovCi1TWVNDQUxMKHN5c19leGl0LHN5c19leGl0LHN5czMyX2V4aXRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2V4aXQsc3lzX2V4aXQsY29tcGF0X3N5c19leGl0KQogU1lTQ0FMTChzeXNfZm9yayxzeXNfZm9yayxzeXNfZm9yaykKLVNZU0NBTEwoc3lzX3JlYWQsc3lzX3JlYWQsc3lzMzJfcmVhZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfd3JpdGUsc3lzX3dyaXRlLHN5czMyX3dyaXRlX3dyYXBwZXIpCitTWVNDQUxMKHN5c19yZWFkLHN5c19yZWFkLGNvbXBhdF9zeXNfczM5MF9yZWFkKQorU1lTQ0FMTChzeXNfd3JpdGUsc3lzX3dyaXRlLGNvbXBhdF9zeXNfczM5MF93cml0ZSkKIFNZU0NBTEwoc3lzX29wZW4sc3lzX29wZW4sY29tcGF0X3N5c19vcGVuKQkJCS8qIDUgKi8KLVNZU0NBTEwoc3lzX2Nsb3NlLHN5c19jbG9zZSxzeXMzMl9jbG9zZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfY2xvc2Usc3lzX2Nsb3NlLGNvbXBhdF9zeXNfY2xvc2UpCiBTWVNDQUxMKHN5c19yZXN0YXJ0X3N5c2NhbGwsc3lzX3Jlc3RhcnRfc3lzY2FsbCxzeXNfcmVzdGFydF9zeXNjYWxsKQotU1lTQ0FMTChzeXNfY3JlYXQsc3lzX2NyZWF0LHN5czMyX2NyZWF0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19saW5rLHN5c19saW5rLHN5czMyX2xpbmtfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3VubGluayxzeXNfdW5saW5rLHN5czMyX3VubGlua193cmFwcGVyKQkJLyogMTAgKi8KLVNZU0NBTEwoc3lzX2V4ZWN2ZSxzeXNfZXhlY3ZlLHN5czMyX2V4ZWN2ZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfY2hkaXIsc3lzX2NoZGlyLHN5czMyX2NoZGlyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c190aW1lLHN5c19uaV9zeXNjYWxsLHN5czMyX3RpbWVfd3JhcHBlcikJCS8qIG9sZCB0aW1lIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX21rbm9kLHN5c19ta25vZCxzeXMzMl9ta25vZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfY2htb2Qsc3lzX2NobW9kLHN5czMyX2NobW9kX3dyYXBwZXIpCQkvKiAxNSAqLwotU1lTQ0FMTChzeXNfbGNob3duMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfbGNob3duMTZfd3JhcHBlcikJLyogb2xkIGxjaG93bjE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfY3JlYXQsc3lzX2NyZWF0LGNvbXBhdF9zeXNfY3JlYXQpCitTWVNDQUxMKHN5c19saW5rLHN5c19saW5rLGNvbXBhdF9zeXNfbGluaykKK1NZU0NBTEwoc3lzX3VubGluayxzeXNfdW5saW5rLGNvbXBhdF9zeXNfdW5saW5rKQkJLyogMTAgKi8KK1NZU0NBTEwoc3lzX2V4ZWN2ZSxzeXNfZXhlY3ZlLGNvbXBhdF9zeXNfZXhlY3ZlKQorU1lTQ0FMTChzeXNfY2hkaXIsc3lzX2NoZGlyLGNvbXBhdF9zeXNfY2hkaXIpCitTWVNDQUxMKHN5c190aW1lLHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfdGltZSkJCS8qIG9sZCB0aW1lIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX21rbm9kLHN5c19ta25vZCxjb21wYXRfc3lzX21rbm9kKQorU1lTQ0FMTChzeXNfY2htb2Qsc3lzX2NobW9kLGNvbXBhdF9zeXNfY2htb2QpCQkJLyogMTUgKi8KK1NZU0NBTEwoc3lzX2xjaG93bjE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9sY2hvd24xNikJLyogb2xkIGxjaG93bjE2IHN5c2NhbGwqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgYnJlYWsgc3lzY2FsbCBob2xkZXIgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHN0YXQgc3lzY2FsbCBob2xkZXIgKi8KIFNZU0NBTEwoc3lzX2xzZWVrLHN5c19sc2Vlayxjb21wYXRfc3lzX2xzZWVrKQogU1lTQ0FMTChzeXNfZ2V0cGlkLHN5c19nZXRwaWQsc3lzX2dldHBpZCkJCQkvKiAyMCAqLwotU1lTQ0FMTChzeXNfbW91bnQsc3lzX21vdW50LHN5czMyX21vdW50X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19vbGR1bW91bnQsc3lzX29sZHVtb3VudCxzeXMzMl9vbGR1bW91bnRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldHVpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHVpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXR1aWQxNiBzeXNjYWxsKi8KLVNZU0NBTEwoc3lzX2dldHVpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2dldHVpZDE2KQkJLyogb2xkIGdldHVpZDE2IHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfc3RpbWUsc3lzX25pX3N5c2NhbGwsc3lzMzJfc3RpbWVfd3JhcHBlcikJCS8qIDI1IG9sZCBzdGltZSBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19wdHJhY2Usc3lzX3B0cmFjZSxzeXMzMl9wdHJhY2Vfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2FsYXJtLHN5c19hbGFybSxzeXMzMl9hbGFybV93cmFwcGVyKQorU1lTQ0FMTChzeXNfbW91bnQsc3lzX21vdW50LGNvbXBhdF9zeXNfbW91bnQpCitTWVNDQUxMKHN5c19vbGR1bW91bnQsc3lzX29sZHVtb3VudCxjb21wYXRfc3lzX29sZHVtb3VudCkKK1NZU0NBTEwoc3lzX3NldHVpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXR1aWQxNikJLyogb2xkIHNldHVpZDE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfZ2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldHVpZDE2KQkvKiBvbGQgZ2V0dWlkMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19zdGltZSxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3N0aW1lKQkJLyogMjUgb2xkIHN0aW1lIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3B0cmFjZSxzeXNfcHRyYWNlLGNvbXBhdF9zeXNfcHRyYWNlKQorU1lTQ0FMTChzeXNfYWxhcm0sc3lzX2FsYXJtLGNvbXBhdF9zeXNfYWxhcm0pCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBmc3RhdCBzeXNjYWxsICovCiBTWVNDQUxMKHN5c19wYXVzZSxzeXNfcGF1c2Usc3lzX3BhdXNlKQotU1lTQ0FMTChzeXNfdXRpbWUsc3lzX3V0aW1lLGNvbXBhdF9zeXNfdXRpbWVfd3JhcHBlcikJCS8qIDMwICovCitTWVNDQUxMKHN5c191dGltZSxzeXNfdXRpbWUsY29tcGF0X3N5c191dGltZSkJCS8qIDMwICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzdHR5IHN5c2NhbGwgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIGd0dHkgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfYWNjZXNzLHN5c19hY2Nlc3Msc3lzMzJfYWNjZXNzX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19uaWNlLHN5c19uaWNlLHN5czMyX25pY2Vfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2FjY2VzcyxzeXNfYWNjZXNzLGNvbXBhdF9zeXNfYWNjZXNzKQorU1lTQ0FMTChzeXNfbmljZSxzeXNfbmljZSxjb21wYXRfc3lzX25pY2UpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIDM1IG9sZCBmdGltZSBzeXNjYWxsICovCiBTWVNDQUxMKHN5c19zeW5jLHN5c19zeW5jLHN5c19zeW5jKQotU1lTQ0FMTChzeXNfa2lsbCxzeXNfa2lsbCxzeXMzMl9raWxsX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19yZW5hbWUsc3lzX3JlbmFtZSxzeXMzMl9yZW5hbWVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21rZGlyLHN5c19ta2RpcixzeXMzMl9ta2Rpcl93cmFwcGVyKQotU1lTQ0FMTChzeXNfcm1kaXIsc3lzX3JtZGlyLHN5czMyX3JtZGlyX3dyYXBwZXIpCQkvKiA0MCAqLwotU1lTQ0FMTChzeXNfZHVwLHN5c19kdXAsc3lzMzJfZHVwX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19waXBlLHN5c19waXBlLHN5czMyX3BpcGVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RpbWVzLHN5c190aW1lcyxjb21wYXRfc3lzX3RpbWVzX3dyYXBwZXIpCitTWVNDQUxMKHN5c19raWxsLHN5c19raWxsLGNvbXBhdF9zeXNfa2lsbCkKK1NZU0NBTEwoc3lzX3JlbmFtZSxzeXNfcmVuYW1lLGNvbXBhdF9zeXNfcmVuYW1lKQorU1lTQ0FMTChzeXNfbWtkaXIsc3lzX21rZGlyLGNvbXBhdF9zeXNfbWtkaXIpCitTWVNDQUxMKHN5c19ybWRpcixzeXNfcm1kaXIsY29tcGF0X3N5c19ybWRpcikJCS8qIDQwICovCitTWVNDQUxMKHN5c19kdXAsc3lzX2R1cCxjb21wYXRfc3lzX2R1cCkKK1NZU0NBTEwoc3lzX3BpcGUsc3lzX3BpcGUsY29tcGF0X3N5c19waXBlKQorU1lTQ0FMTChzeXNfdGltZXMsc3lzX3RpbWVzLGNvbXBhdF9zeXNfdGltZXMpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBwcm9mIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2JyayxzeXNfYnJrLHN5czMyX2Jya193cmFwcGVyKQkJCS8qIDQ1ICovCi1TWVNDQUxMKHN5c19zZXRnaWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRnaWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0Z2lkMTYgc3lzY2FsbCovCi1TWVNDQUxMKHN5c19nZXRnaWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRnaWQxNikJCS8qIG9sZCBnZXRnaWQxNiBzeXNjYWxsKi8KLVNZU0NBTEwoc3lzX3NpZ25hbCxzeXNfc2lnbmFsLHN5czMyX3NpZ25hbF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0ZXVpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2dldGV1aWQxNikJCS8qIG9sZCBnZXRldWlkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfZ2V0ZWdpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2dldGVnaWQxNikJCS8qIDUwIG9sZCBnZXRlZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfYWNjdCxzeXNfYWNjdCxzeXMzMl9hY2N0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c191bW91bnQsc3lzX3Vtb3VudCxzeXMzMl91bW91bnRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2JyayxzeXNfYnJrLGNvbXBhdF9zeXNfYnJrKQkJCQkvKiA0NSAqLworU1lTQ0FMTChzeXNfc2V0Z2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGdpZDE2KQkvKiBvbGQgc2V0Z2lkMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19nZXRnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0Z2lkMTYpCS8qIG9sZCBnZXRnaWQxNiBzeXNjYWxsKi8KK1NZU0NBTEwoc3lzX3NpZ25hbCxzeXNfc2lnbmFsLGNvbXBhdF9zeXNfc2lnbmFsKQorU1lTQ0FMTChzeXNfZ2V0ZXVpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRldWlkMTYpCS8qIG9sZCBnZXRldWlkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfZ2V0ZWdpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRlZ2lkMTYpCS8qIDUwIG9sZCBnZXRlZ2lkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfYWNjdCxzeXNfYWNjdCxjb21wYXRfc3lzX2FjY3QpCitTWVNDQUxMKHN5c191bW91bnQsc3lzX3Vtb3VudCxjb21wYXRfc3lzX3Vtb3VudCkKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIGxvY2sgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfaW9jdGwsc3lzX2lvY3RsLGNvbXBhdF9zeXNfaW9jdGxfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZjbnRsLHN5c19mY250bCxjb21wYXRfc3lzX2ZjbnRsX3dyYXBwZXIpCQkvKiA1NSAqLworU1lTQ0FMTChzeXNfaW9jdGwsc3lzX2lvY3RsLGNvbXBhdF9zeXNfaW9jdGwpCitTWVNDQUxMKHN5c19mY250bCxzeXNfZmNudGwsY29tcGF0X3N5c19mY250bCkJCS8qIDU1ICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIGludGVsIG1weCBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zZXRwZ2lkLHN5c19zZXRwZ2lkLHN5czMyX3NldHBnaWRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHBnaWQsc3lzX3NldHBnaWQsY29tcGF0X3N5c19zZXRwZ2lkKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgdWxpbWl0IHN5c2NhbGwgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHVuYW1lIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3VtYXNrLHN5c191bWFzayxzeXMzMl91bWFza193cmFwcGVyKQkJLyogNjAgKi8KLVNZU0NBTEwoc3lzX2Nocm9vdCxzeXNfY2hyb290LHN5czMyX2Nocm9vdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfdXN0YXQsc3lzX3VzdGF0LHN5czMyX3VzdGF0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19kdXAyLHN5c19kdXAyLHN5czMyX2R1cDJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3VtYXNrLHN5c191bWFzayxjb21wYXRfc3lzX3VtYXNrKQkJCS8qIDYwICovCitTWVNDQUxMKHN5c19jaHJvb3Qsc3lzX2Nocm9vdCxjb21wYXRfc3lzX2Nocm9vdCkKK1NZU0NBTEwoc3lzX3VzdGF0LHN5c191c3RhdCxjb21wYXRfc3lzX3VzdGF0KQorU1lTQ0FMTChzeXNfZHVwMixzeXNfZHVwMixjb21wYXRfc3lzX2R1cDIpCiBTWVNDQUxMKHN5c19nZXRwcGlkLHN5c19nZXRwcGlkLHN5c19nZXRwcGlkKQogU1lTQ0FMTChzeXNfZ2V0cGdycCxzeXNfZ2V0cGdycCxzeXNfZ2V0cGdycCkJCQkvKiA2NSAqLwogU1lTQ0FMTChzeXNfc2V0c2lkLHN5c19zZXRzaWQsc3lzX3NldHNpZCkKIFNZU0NBTEwoc3lzX3NpZ2FjdGlvbixzeXNfc2lnYWN0aW9uLGNvbXBhdF9zeXNfc2lnYWN0aW9uKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc2dldG1hc2sgc3lzY2FsbCovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzc2V0bWFzayBzeXNjYWxsKi8KLVNZU0NBTEwoc3lzX3NldHJldWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0cmV1aWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0cmV1aWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zZXRyZWdpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHJlZ2lkMTZfd3JhcHBlcikJLyogb2xkIHNldHJlZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2lnc3VzcGVuZCxzeXNfc2lnc3VzcGVuZCxzeXNfc2lnc3VzcGVuZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2lncGVuZGluZyxzeXNfc2lncGVuZGluZyxjb21wYXRfc3lzX3NpZ3BlbmRpbmdfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldGhvc3RuYW1lLHN5c19zZXRob3N0bmFtZSxzeXMzMl9zZXRob3N0bmFtZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0cmxpbWl0LHN5c19zZXRybGltaXQsY29tcGF0X3N5c19zZXRybGltaXRfd3JhcHBlcikJLyogNzUgKi8KLVNZU0NBTEwoc3lzX29sZF9nZXRybGltaXQsc3lzX2dldHJsaW1pdCxjb21wYXRfc3lzX29sZF9nZXRybGltaXRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHJldWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldHJldWlkMTYpIC8qIG9sZCBzZXRyZXVpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NldHJlZ2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldHJlZ2lkMTYpIC8qIG9sZCBzZXRyZWdpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NpZ3N1c3BlbmQsc3lzX3NpZ3N1c3BlbmQsY29tcGF0X3N5c19zaWdzdXNwZW5kKQorU1lTQ0FMTChzeXNfc2lncGVuZGluZyxzeXNfc2lncGVuZGluZyxjb21wYXRfc3lzX3NpZ3BlbmRpbmcpCitTWVNDQUxMKHN5c19zZXRob3N0bmFtZSxzeXNfc2V0aG9zdG5hbWUsY29tcGF0X3N5c19zZXRob3N0bmFtZSkKK1NZU0NBTEwoc3lzX3NldHJsaW1pdCxzeXNfc2V0cmxpbWl0LGNvbXBhdF9zeXNfc2V0cmxpbWl0KQkvKiA3NSAqLworU1lTQ0FMTChzeXNfb2xkX2dldHJsaW1pdCxzeXNfZ2V0cmxpbWl0LGNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdCkKIFNZU0NBTEwoc3lzX2dldHJ1c2FnZSxzeXNfZ2V0cnVzYWdlLGNvbXBhdF9zeXNfZ2V0cnVzYWdlKQotU1lTQ0FMTChzeXNfZ2V0dGltZW9mZGF5LHN5c19nZXR0aW1lb2ZkYXksY29tcGF0X3N5c19nZXR0aW1lb2ZkYXlfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldHRpbWVvZmRheSxzeXNfc2V0dGltZW9mZGF5LGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19nZXRncm91cHMxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRncm91cHMxNl93cmFwcGVyKQkvKiA4MCBvbGQgZ2V0Z3JvdXBzMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2V0Z3JvdXBzMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0Z3JvdXBzMTZfd3JhcHBlcikJLyogb2xkIHNldGdyb3VwczE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2dldHRpbWVvZmRheSxzeXNfZ2V0dGltZW9mZGF5LGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5KQorU1lTQ0FMTChzeXNfc2V0dGltZW9mZGF5LHN5c19zZXR0aW1lb2ZkYXksY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkpCitTWVNDQUxMKHN5c19nZXRncm91cHMxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0Z3JvdXBzMTYpCS8qIDgwIG9sZCBnZXRncm91cHMxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19zZXRncm91cHMxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0Z3JvdXBzMTYpCS8qIG9sZCBzZXRncm91cHMxNiBzeXNjYWxsICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzZWxlY3Qgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc3ltbGluayxzeXNfc3ltbGluayxzeXMzMl9zeW1saW5rX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zeW1saW5rLHN5c19zeW1saW5rLGNvbXBhdF9zeXNfc3ltbGluaykKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIGxzdGF0IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3JlYWRsaW5rLHN5c19yZWFkbGluayxzeXMzMl9yZWFkbGlua193cmFwcGVyKQkvKiA4NSAqLwotU1lTQ0FMTChzeXNfdXNlbGliLHN5c191c2VsaWIsc3lzMzJfdXNlbGliX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zd2Fwb24sc3lzX3N3YXBvbixzeXMzMl9zd2Fwb25fd3JhcHBlcikKLVNZU0NBTEwoc3lzX3JlYm9vdCxzeXNfcmVib290LHN5czMyX3JlYm9vdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCxvbGQzMl9yZWFkZGlyX3dyYXBwZXIpCS8qIG9sZCByZWFkZGlyIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX29sZF9tbWFwLHN5c19vbGRfbW1hcCxvbGQzMl9tbWFwX3dyYXBwZXIpCQkvKiA5MCAqLwotU1lTQ0FMTChzeXNfbXVubWFwLHN5c19tdW5tYXAsc3lzMzJfbXVubWFwX3dyYXBwZXIpCitTWVNDQUxMKHN5c19yZWFkbGluayxzeXNfcmVhZGxpbmssY29tcGF0X3N5c19yZWFkbGluaykJCS8qIDg1ICovCitTWVNDQUxMKHN5c191c2VsaWIsc3lzX3VzZWxpYixjb21wYXRfc3lzX3VzZWxpYikKK1NZU0NBTEwoc3lzX3N3YXBvbixzeXNfc3dhcG9uLGNvbXBhdF9zeXNfc3dhcG9uKQorU1lTQ0FMTChzeXNfcmVib290LHN5c19yZWJvb3QsY29tcGF0X3N5c19yZWJvb3QpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfb2xkX3JlYWRkaXIpCS8qIG9sZCByZWFkZGlyIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX29sZF9tbWFwLHN5c19vbGRfbW1hcCxjb21wYXRfc3lzX3MzOTBfb2xkX21tYXApCS8qIDkwICovCitTWVNDQUxMKHN5c19tdW5tYXAsc3lzX211bm1hcCxjb21wYXRfc3lzX211bm1hcCkKIFNZU0NBTEwoc3lzX3RydW5jYXRlLHN5c190cnVuY2F0ZSxjb21wYXRfc3lzX3RydW5jYXRlKQogU1lTQ0FMTChzeXNfZnRydW5jYXRlLHN5c19mdHJ1bmNhdGUsY29tcGF0X3N5c19mdHJ1bmNhdGUpCi1TWVNDQUxMKHN5c19mY2htb2Qsc3lzX2ZjaG1vZCxzeXMzMl9mY2htb2Rfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZjaG93bjE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2ZjaG93bjE2X3dyYXBwZXIpCS8qIDk1IG9sZCBmY2hvd24xNiBzeXNjYWxsKi8KLVNZU0NBTEwoc3lzX2dldHByaW9yaXR5LHN5c19nZXRwcmlvcml0eSxzeXMzMl9nZXRwcmlvcml0eV93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0cHJpb3JpdHksc3lzX3NldHByaW9yaXR5LHN5czMyX3NldHByaW9yaXR5X3dyYXBwZXIpCitTWVNDQUxMKHN5c19mY2htb2Qsc3lzX2ZjaG1vZCxjb21wYXRfc3lzX2ZjaG1vZCkKK1NZU0NBTEwoc3lzX2ZjaG93bjE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9mY2hvd24xNikJLyogOTUgb2xkIGZjaG93bjE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfZ2V0cHJpb3JpdHksc3lzX2dldHByaW9yaXR5LGNvbXBhdF9zeXNfZ2V0cHJpb3JpdHkpCitTWVNDQUxMKHN5c19zZXRwcmlvcml0eSxzeXNfc2V0cHJpb3JpdHksY29tcGF0X3N5c19zZXRwcmlvcml0eSkKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHByb2ZpbCBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zdGF0ZnMsc3lzX3N0YXRmcyxjb21wYXRfc3lzX3N0YXRmc193cmFwcGVyKQotU1lTQ0FMTChzeXNfZnN0YXRmcyxzeXNfZnN0YXRmcyxjb21wYXRfc3lzX2ZzdGF0ZnNfd3JhcHBlcikJLyogMTAwICovCitTWVNDQUxMKHN5c19zdGF0ZnMsc3lzX3N0YXRmcyxjb21wYXRfc3lzX3N0YXRmcykKK1NZU0NBTEwoc3lzX2ZzdGF0ZnMsc3lzX2ZzdGF0ZnMsY29tcGF0X3N5c19mc3RhdGZzKQkvKiAxMDAgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogaW9wZXJtIGZvciBpMzg2ICovCi1TWVNDQUxMKHN5c19zb2NrZXRjYWxsLHN5c19zb2NrZXRjYWxsLGNvbXBhdF9zeXNfc29ja2V0Y2FsbF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc3lzbG9nLHN5c19zeXNsb2csc3lzMzJfc3lzbG9nX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zb2NrZXRjYWxsLHN5c19zb2NrZXRjYWxsLGNvbXBhdF9zeXNfc29ja2V0Y2FsbCkKK1NZU0NBTEwoc3lzX3N5c2xvZyxzeXNfc3lzbG9nLGNvbXBhdF9zeXNfc3lzbG9nKQogU1lTQ0FMTChzeXNfc2V0aXRpbWVyLHN5c19zZXRpdGltZXIsY29tcGF0X3N5c19zZXRpdGltZXIpCiBTWVNDQUxMKHN5c19nZXRpdGltZXIsc3lzX2dldGl0aW1lcixjb21wYXRfc3lzX2dldGl0aW1lcikJLyogMTA1ICovCi1TWVNDQUxMKHN5c19uZXdzdGF0LHN5c19uZXdzdGF0LGNvbXBhdF9zeXNfbmV3c3RhdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbmV3bHN0YXQsc3lzX25ld2xzdGF0LGNvbXBhdF9zeXNfbmV3bHN0YXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX25ld2ZzdGF0LHN5c19uZXdmc3RhdCxjb21wYXRfc3lzX25ld2ZzdGF0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19uZXdzdGF0LHN5c19uZXdzdGF0LGNvbXBhdF9zeXNfbmV3c3RhdCkKK1NZU0NBTEwoc3lzX25ld2xzdGF0LHN5c19uZXdsc3RhdCxjb21wYXRfc3lzX25ld2xzdGF0KQorU1lTQ0FMTChzeXNfbmV3ZnN0YXQsc3lzX25ld2ZzdGF0LGNvbXBhdF9zeXNfbmV3ZnN0YXQpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCB1bmFtZSBzeXNjYWxsICovCiBTWVNDQUxMKHN5c19sb29rdXBfZGNvb2tpZSxzeXNfbG9va3VwX2Rjb29raWUsY29tcGF0X3N5c19sb29rdXBfZGNvb2tpZSkJLyogMTEwICovCiBTWVNDQUxMKHN5c192aGFuZ3VwLHN5c192aGFuZ3VwLHN5c192aGFuZ3VwKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgImlkbGUiIHN5c3RlbSBjYWxsICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIHZtODZvbGQgZm9yIGkzODYgKi8KIFNZU0NBTEwoc3lzX3dhaXQ0LHN5c193YWl0NCxjb21wYXRfc3lzX3dhaXQ0KQotU1lTQ0FMTChzeXNfc3dhcG9mZixzeXNfc3dhcG9mZixzeXMzMl9zd2Fwb2ZmX3dyYXBwZXIpCQkvKiAxMTUgKi8KLVNZU0NBTEwoc3lzX3N5c2luZm8sc3lzX3N5c2luZm8sY29tcGF0X3N5c19zeXNpbmZvX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zd2Fwb2ZmLHN5c19zd2Fwb2ZmLGNvbXBhdF9zeXNfc3dhcG9mZikJCS8qIDExNSAqLworU1lTQ0FMTChzeXNfc3lzaW5mbyxzeXNfc3lzaW5mbyxjb21wYXRfc3lzX3N5c2luZm8pCiBTWVNDQUxMKHN5c19zMzkwX2lwYyxzeXNfczM5MF9pcGMsY29tcGF0X3N5c19zMzkwX2lwYykKLVNZU0NBTEwoc3lzX2ZzeW5jLHN5c19mc3luYyxzeXMzMl9mc3luY193cmFwcGVyKQotU1lTQ0FMTChzeXNfc2lncmV0dXJuLHN5c19zaWdyZXR1cm4sc3lzMzJfc2lncmV0dXJuKQotU1lTQ0FMTChzeXNfY2xvbmUsc3lzX2Nsb25lLHN5c19jbG9uZV93cmFwcGVyKQkJCS8qIDEyMCAqLwotU1lTQ0FMTChzeXNfc2V0ZG9tYWlubmFtZSxzeXNfc2V0ZG9tYWlubmFtZSxzeXMzMl9zZXRkb21haW5uYW1lX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19uZXd1bmFtZSxzeXNfbmV3dW5hbWUsc3lzMzJfbmV3dW5hbWVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZzeW5jLHN5c19mc3luYyxjb21wYXRfc3lzX2ZzeW5jKQorU1lTQ0FMTChzeXNfc2lncmV0dXJuLHN5c19zaWdyZXR1cm4sY29tcGF0X3N5c19zaWdyZXR1cm4pCitTWVNDQUxMKHN5c19jbG9uZSxzeXNfY2xvbmUsY29tcGF0X3N5c19jbG9uZSkJCQkvKiAxMjAgKi8KK1NZU0NBTEwoc3lzX3NldGRvbWFpbm5hbWUsc3lzX3NldGRvbWFpbm5hbWUsY29tcGF0X3N5c19zZXRkb21haW5uYW1lKQorU1lTQ0FMTChzeXNfbmV3dW5hbWUsc3lzX25ld3VuYW1lLGNvbXBhdF9zeXNfbmV3dW5hbWUpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG1vZGlmeV9sZHQgZm9yIGkzODYgKi8KLVNZU0NBTEwoc3lzX2FkanRpbWV4LHN5c19hZGp0aW1leCxjb21wYXRfc3lzX2FkanRpbWV4X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tcHJvdGVjdCxzeXNfbXByb3RlY3Qsc3lzMzJfbXByb3RlY3Rfd3JhcHBlcikJLyogMTI1ICovCitTWVNDQUxMKHN5c19hZGp0aW1leCxzeXNfYWRqdGltZXgsY29tcGF0X3N5c19hZGp0aW1leCkKK1NZU0NBTEwoc3lzX21wcm90ZWN0LHN5c19tcHJvdGVjdCxjb21wYXRfc3lzX21wcm90ZWN0KQkJLyogMTI1ICovCiBTWVNDQUxMKHN5c19zaWdwcm9jbWFzayxzeXNfc2lncHJvY21hc2ssY29tcGF0X3N5c19zaWdwcm9jbWFzaykKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkICJjcmVhdGUgbW9kdWxlIiAqLwotU1lTQ0FMTChzeXNfaW5pdF9tb2R1bGUsc3lzX2luaXRfbW9kdWxlLHN5c19pbml0X21vZHVsZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfZGVsZXRlX21vZHVsZSxzeXNfZGVsZXRlX21vZHVsZSxzeXNfZGVsZXRlX21vZHVsZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfaW5pdF9tb2R1bGUsc3lzX2luaXRfbW9kdWxlLGNvbXBhdF9zeXNfaW5pdF9tb2R1bGUpCitTWVNDQUxMKHN5c19kZWxldGVfbW9kdWxlLHN5c19kZWxldGVfbW9kdWxlLGNvbXBhdF9zeXNfZGVsZXRlX21vZHVsZSkKIE5JX1NZU0NBTEwJCQkJCQkJLyogMTMwOiBvbGQgZ2V0X2tlcm5lbF9zeW1zICovCi1TWVNDQUxMKHN5c19xdW90YWN0bCxzeXNfcXVvdGFjdGwsc3lzMzJfcXVvdGFjdGxfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2dldHBnaWQsc3lzX2dldHBnaWQsc3lzMzJfZ2V0cGdpZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmNoZGlyLHN5c19mY2hkaXIsc3lzMzJfZmNoZGlyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19iZGZsdXNoLHN5c19iZGZsdXNoLHN5czMyX2JkZmx1c2hfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3N5c2ZzLHN5c19zeXNmcyxzeXMzMl9zeXNmc193cmFwcGVyKQkJLyogMTM1ICovCi1TWVNDQUxMKHN5c19wZXJzb25hbGl0eSxzeXNfczM5MF9wZXJzb25hbGl0eSxzeXMzMl9wZXJzb25hbGl0eV93cmFwcGVyKQorU1lTQ0FMTChzeXNfcXVvdGFjdGwsc3lzX3F1b3RhY3RsLGNvbXBhdF9zeXNfcXVvdGFjdGwpCitTWVNDQUxMKHN5c19nZXRwZ2lkLHN5c19nZXRwZ2lkLGNvbXBhdF9zeXNfZ2V0cGdpZCkKK1NZU0NBTEwoc3lzX2ZjaGRpcixzeXNfZmNoZGlyLGNvbXBhdF9zeXNfZmNoZGlyKQorU1lTQ0FMTChzeXNfYmRmbHVzaCxzeXNfYmRmbHVzaCxjb21wYXRfc3lzX2JkZmx1c2gpCitTWVNDQUxMKHN5c19zeXNmcyxzeXNfc3lzZnMsY29tcGF0X3N5c19zeXNmcykJCS8qIDEzNSAqLworU1lTQ0FMTChzeXNfcGVyc29uYWxpdHksc3lzX3MzOTBfcGVyc29uYWxpdHksY29tcGF0X3N5c19zMzkwX3BlcnNvbmFsaXR5KQogTklfU1lTQ0FMTAkJCQkJCQkvKiBmb3IgYWZzX3N5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3NldGZzdWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0ZnN1aWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0ZnN1aWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zZXRmc2dpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldGZzZ2lkMTZfd3JhcHBlcikJLyogb2xkIHNldGZzZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfbGxzZWVrLHN5c19sbHNlZWssc3lzMzJfbGxzZWVrX3dyYXBwZXIpCQkvKiAxNDAgKi8KLVNZU0NBTEwoc3lzX2dldGRlbnRzLHN5c19nZXRkZW50cyxzeXMzMl9nZXRkZW50c193cmFwcGVyKQotU1lTQ0FMTChzeXNfc2VsZWN0LHN5c19zZWxlY3QsY29tcGF0X3N5c19zZWxlY3Rfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Zsb2NrLHN5c19mbG9jayxzeXMzMl9mbG9ja193cmFwcGVyKQotU1lTQ0FMTChzeXNfbXN5bmMsc3lzX21zeW5jLHN5czMyX21zeW5jX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19yZWFkdixzeXNfcmVhZHYsY29tcGF0X3N5c19yZWFkdl93cmFwcGVyKQkJLyogMTQ1ICovCi1TWVNDQUxMKHN5c193cml0ZXYsc3lzX3dyaXRldixjb21wYXRfc3lzX3dyaXRldl93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0c2lkLHN5c19nZXRzaWQsc3lzMzJfZ2V0c2lkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mZGF0YXN5bmMsc3lzX2ZkYXRhc3luYyxzeXMzMl9mZGF0YXN5bmNfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldGZzdWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGZzdWlkMTYpCS8qIG9sZCBzZXRmc3VpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NldGZzZ2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGZzZ2lkMTYpCS8qIG9sZCBzZXRmc2dpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2xsc2VlayxzeXNfbGxzZWVrLGNvbXBhdF9zeXNfbGxzZWVrKQkJLyogMTQwICovCitTWVNDQUxMKHN5c19nZXRkZW50cyxzeXNfZ2V0ZGVudHMsY29tcGF0X3N5c19nZXRkZW50cykKK1NZU0NBTEwoc3lzX3NlbGVjdCxzeXNfc2VsZWN0LGNvbXBhdF9zeXNfc2VsZWN0KQorU1lTQ0FMTChzeXNfZmxvY2ssc3lzX2Zsb2NrLGNvbXBhdF9zeXNfZmxvY2spCitTWVNDQUxMKHN5c19tc3luYyxzeXNfbXN5bmMsY29tcGF0X3N5c19tc3luYykKK1NZU0NBTEwoc3lzX3JlYWR2LHN5c19yZWFkdixjb21wYXRfc3lzX3JlYWR2KQkJLyogMTQ1ICovCitTWVNDQUxMKHN5c193cml0ZXYsc3lzX3dyaXRldixjb21wYXRfc3lzX3dyaXRldikKK1NZU0NBTEwoc3lzX2dldHNpZCxzeXNfZ2V0c2lkLGNvbXBhdF9zeXNfZ2V0c2lkKQorU1lTQ0FMTChzeXNfZmRhdGFzeW5jLHN5c19mZGF0YXN5bmMsY29tcGF0X3N5c19mZGF0YXN5bmMpCiBTWVNDQUxMKHN5c19zeXNjdGwsc3lzX3N5c2N0bCxjb21wYXRfc3lzX3N5c2N0bCkKLVNZU0NBTEwoc3lzX21sb2NrLHN5c19tbG9jayxzeXMzMl9tbG9ja193cmFwcGVyKQkJLyogMTUwICovCi1TWVNDQUxMKHN5c19tdW5sb2NrLHN5c19tdW5sb2NrLHN5czMyX211bmxvY2tfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21sb2NrYWxsLHN5c19tbG9ja2FsbCxzeXMzMl9tbG9ja2FsbF93cmFwcGVyKQorU1lTQ0FMTChzeXNfbWxvY2ssc3lzX21sb2NrLGNvbXBhdF9zeXNfbWxvY2spCQkJLyogMTUwICovCitTWVNDQUxMKHN5c19tdW5sb2NrLHN5c19tdW5sb2NrLGNvbXBhdF9zeXNfbXVubG9jaykKK1NZU0NBTEwoc3lzX21sb2NrYWxsLHN5c19tbG9ja2FsbCxjb21wYXRfc3lzX21sb2NrYWxsKQogU1lTQ0FMTChzeXNfbXVubG9ja2FsbCxzeXNfbXVubG9ja2FsbCxzeXNfbXVubG9ja2FsbCkKLVNZU0NBTEwoc3lzX3NjaGVkX3NldHBhcmFtLHN5c19zY2hlZF9zZXRwYXJhbSxzeXMzMl9zY2hlZF9zZXRwYXJhbV93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0cGFyYW0sc3lzX3NjaGVkX2dldHBhcmFtLHN5czMyX3NjaGVkX2dldHBhcmFtX3dyYXBwZXIpCS8qIDE1NSAqLwotU1lTQ0FMTChzeXNfc2NoZWRfc2V0c2NoZWR1bGVyLHN5c19zY2hlZF9zZXRzY2hlZHVsZXIsc3lzMzJfc2NoZWRfc2V0c2NoZWR1bGVyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRzY2hlZHVsZXIsc3lzX3NjaGVkX2dldHNjaGVkdWxlcixzeXMzMl9zY2hlZF9nZXRzY2hlZHVsZXJfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NjaGVkX3NldHBhcmFtLHN5c19zY2hlZF9zZXRwYXJhbSxjb21wYXRfc3lzX3NjaGVkX3NldHBhcmFtKQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0cGFyYW0sc3lzX3NjaGVkX2dldHBhcmFtLGNvbXBhdF9zeXNfc2NoZWRfZ2V0cGFyYW0pCS8qIDE1NSAqLworU1lTQ0FMTChzeXNfc2NoZWRfc2V0c2NoZWR1bGVyLHN5c19zY2hlZF9zZXRzY2hlZHVsZXIsY29tcGF0X3N5c19zY2hlZF9zZXRzY2hlZHVsZXIpCitTWVNDQUxMKHN5c19zY2hlZF9nZXRzY2hlZHVsZXIsc3lzX3NjaGVkX2dldHNjaGVkdWxlcixjb21wYXRfc3lzX3NjaGVkX2dldHNjaGVkdWxlcikKIFNZU0NBTEwoc3lzX3NjaGVkX3lpZWxkLHN5c19zY2hlZF95aWVsZCxzeXNfc2NoZWRfeWllbGQpCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4LHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4LHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9tYXhfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4sc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4sc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl93cmFwcGVyKQkvKiAxNjAgKi8KK1NZU0NBTEwoc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsY29tcGF0X3N5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbixzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbixjb21wYXRfc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4pCS8qIDE2MCAqLwogU1lTQ0FMTChzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwsY29tcGF0X3N5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCi1TWVNDQUxMKHN5c19uYW5vc2xlZXAsc3lzX25hbm9zbGVlcCxjb21wYXRfc3lzX25hbm9zbGVlcF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbXJlbWFwLHN5c19tcmVtYXAsc3lzMzJfbXJlbWFwX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRyZXN1aWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0cmVzdWlkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfZ2V0cmVzdWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0cmVzdWlkMTZfd3JhcHBlcikJLyogMTY1IG9sZCBnZXRyZXN1aWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19uYW5vc2xlZXAsc3lzX25hbm9zbGVlcCxjb21wYXRfc3lzX25hbm9zbGVlcCkKK1NZU0NBTEwoc3lzX21yZW1hcCxzeXNfbXJlbWFwLGNvbXBhdF9zeXNfbXJlbWFwKQorU1lTQ0FMTChzeXNfc2V0cmVzdWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldHJlc3VpZDE2KQkvKiBvbGQgc2V0cmVzdWlkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfZ2V0cmVzdWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldHJlc3VpZDE2KQkvKiAxNjUgb2xkIGdldHJlc3VpZDE2IHN5c2NhbGwgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogZm9yIHZtODYgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHN5c19xdWVyeV9tb2R1bGUgKi8KLVNZU0NBTEwoc3lzX3BvbGwsc3lzX3BvbGwsc3lzMzJfcG9sbF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcG9sbCxzeXNfcG9sbCxjb21wYXRfc3lzX3BvbGwpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBuZnNzZXJ2Y3RsICovCi1TWVNDQUxMKHN5c19zZXRyZXNnaWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRyZXNnaWQxNl93cmFwcGVyKQkvKiAxNzAgb2xkIHNldHJlc2dpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2dldHJlc2dpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2dldHJlc2dpZDE2X3dyYXBwZXIpCS8qIG9sZCBnZXRyZXNnaWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19wcmN0bCxzeXNfcHJjdGwsc3lzMzJfcHJjdGxfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3J0X3NpZ3JldHVybixzeXNfcnRfc2lncmV0dXJuLHN5czMyX3J0X3NpZ3JldHVybikKK1NZU0NBTEwoc3lzX3NldHJlc2dpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXRyZXNnaWQxNikJLyogMTcwIG9sZCBzZXRyZXNnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRyZXNnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0cmVzZ2lkMTYpCS8qIG9sZCBnZXRyZXNnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19wcmN0bCxzeXNfcHJjdGwsY29tcGF0X3N5c19wcmN0bCkKK1NZU0NBTEwoc3lzX3J0X3NpZ3JldHVybixzeXNfcnRfc2lncmV0dXJuLGNvbXBhdF9zeXNfcnRfc2lncmV0dXJuKQogU1lTQ0FMTChzeXNfcnRfc2lnYWN0aW9uLHN5c19ydF9zaWdhY3Rpb24sY29tcGF0X3N5c19ydF9zaWdhY3Rpb24pCiBTWVNDQUxMKHN5c19ydF9zaWdwcm9jbWFzayxzeXNfcnRfc2lncHJvY21hc2ssY29tcGF0X3N5c19ydF9zaWdwcm9jbWFzaykgLyogMTc1ICovCiBTWVNDQUxMKHN5c19ydF9zaWdwZW5kaW5nLHN5c19ydF9zaWdwZW5kaW5nLGNvbXBhdF9zeXNfcnRfc2lncGVuZGluZykKIFNZU0NBTEwoc3lzX3J0X3NpZ3RpbWVkd2FpdCxzeXNfcnRfc2lndGltZWR3YWl0LGNvbXBhdF9zeXNfcnRfc2lndGltZWR3YWl0KQogU1lTQ0FMTChzeXNfcnRfc2lncXVldWVpbmZvLHN5c19ydF9zaWdxdWV1ZWluZm8sY29tcGF0X3N5c19ydF9zaWdxdWV1ZWluZm8pCiBTWVNDQUxMKHN5c19ydF9zaWdzdXNwZW5kLHN5c19ydF9zaWdzdXNwZW5kLGNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZCkKLVNZU0NBTEwoc3lzX3ByZWFkNjQsc3lzX3ByZWFkNjQsc3lzMzJfcHJlYWQ2NF93cmFwcGVyKQkJLyogMTgwICovCi1TWVNDQUxMKHN5c19wd3JpdGU2NCxzeXNfcHdyaXRlNjQsc3lzMzJfcHdyaXRlNjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Nob3duMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfY2hvd24xNl93cmFwcGVyKQkvKiBvbGQgY2hvd24xNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19nZXRjd2Qsc3lzX2dldGN3ZCxzeXMzMl9nZXRjd2Rfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2NhcGdldCxzeXNfY2FwZ2V0LHN5czMyX2NhcGdldF93cmFwcGVyKQotU1lTQ0FMTChzeXNfY2Fwc2V0LHN5c19jYXBzZXQsc3lzMzJfY2Fwc2V0X3dyYXBwZXIpCQkvKiAxODUgKi8KK1NZU0NBTEwoc3lzX3ByZWFkNjQsc3lzX3ByZWFkNjQsY29tcGF0X3N5c19zMzkwX3ByZWFkNjQpCQkvKiAxODAgKi8KK1NZU0NBTEwoc3lzX3B3cml0ZTY0LHN5c19wd3JpdGU2NCxjb21wYXRfc3lzX3MzOTBfcHdyaXRlNjQpCitTWVNDQUxMKHN5c19jaG93bjE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9jaG93bjE2KQkvKiBvbGQgY2hvd24xNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRjd2Qsc3lzX2dldGN3ZCxjb21wYXRfc3lzX2dldGN3ZCkKK1NZU0NBTEwoc3lzX2NhcGdldCxzeXNfY2FwZ2V0LGNvbXBhdF9zeXNfY2FwZ2V0KQorU1lTQ0FMTChzeXNfY2Fwc2V0LHN5c19jYXBzZXQsY29tcGF0X3N5c19jYXBzZXQpCQkvKiAxODUgKi8KIFNZU0NBTEwoc3lzX3NpZ2FsdHN0YWNrLHN5c19zaWdhbHRzdGFjayxjb21wYXRfc3lzX3NpZ2FsdHN0YWNrKQogU1lTQ0FMTChzeXNfc2VuZGZpbGUsc3lzX3NlbmRmaWxlNjQsY29tcGF0X3N5c19zZW5kZmlsZSkKIE5JX1NZU0NBTEwJCQkJCQkJLyogc3RyZWFtczEgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogc3RyZWFtczIgKi8KIFNZU0NBTEwoc3lzX3Zmb3JrLHN5c192Zm9yayxzeXNfdmZvcmspCQkJCS8qIDE5MCAqLwotU1lTQ0FMTChzeXNfZ2V0cmxpbWl0LHN5c19nZXRybGltaXQsY29tcGF0X3N5c19nZXRybGltaXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21tYXAyLHN5c19tbWFwMixzeXMzMl9tbWFwMl93cmFwcGVyKQotU1lTQ0FMTChzeXNfdHJ1bmNhdGU2NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl90cnVuY2F0ZTY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mdHJ1bmNhdGU2NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl9mdHJ1bmNhdGU2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc3RhdDY0LHN5c19uaV9zeXNjYWxsLHN5czMyX3N0YXQ2NF93cmFwcGVyKQkJLyogMTk1ICovCi1TWVNDQUxMKHN5c19sc3RhdDY0LHN5c19uaV9zeXNjYWxsLHN5czMyX2xzdGF0NjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZzdGF0NjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfZnN0YXQ2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbGNob3duLHN5c19sY2hvd24sc3lzMzJfbGNob3duX3dyYXBwZXIpCitTWVNDQUxMKHN5c19nZXRybGltaXQsc3lzX2dldHJsaW1pdCxjb21wYXRfc3lzX2dldHJsaW1pdCkKK1NZU0NBTEwoc3lzX21tYXAyLHN5c19tbWFwMixjb21wYXRfc3lzX3MzOTBfbW1hcDIpCitTWVNDQUxMKHN5c190cnVuY2F0ZTY0LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF90cnVuY2F0ZTY0KQorU1lTQ0FMTChzeXNfZnRydW5jYXRlNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2Z0cnVuY2F0ZTY0KQorU1lTQ0FMTChzeXNfc3RhdDY0LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zdGF0NjQpCQkvKiAxOTUgKi8KK1NZU0NBTEwoc3lzX2xzdGF0NjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2xzdGF0NjQpCitTWVNDQUxMKHN5c19mc3RhdDY0LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9mc3RhdDY0KQorU1lTQ0FMTChzeXNfbGNob3duLHN5c19sY2hvd24sY29tcGF0X3N5c19sY2hvd24pCiBTWVNDQUxMKHN5c19nZXR1aWQsc3lzX2dldHVpZCxzeXNfZ2V0dWlkKQogU1lTQ0FMTChzeXNfZ2V0Z2lkLHN5c19nZXRnaWQsc3lzX2dldGdpZCkJCQkvKiAyMDAgKi8KIFNZU0NBTEwoc3lzX2dldGV1aWQsc3lzX2dldGV1aWQsc3lzX2dldGV1aWQpCiBTWVNDQUxMKHN5c19nZXRlZ2lkLHN5c19nZXRlZ2lkLHN5c19nZXRlZ2lkKQotU1lTQ0FMTChzeXNfc2V0cmV1aWQsc3lzX3NldHJldWlkLHN5czMyX3NldHJldWlkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRyZWdpZCxzeXNfc2V0cmVnaWQsc3lzMzJfc2V0cmVnaWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2dldGdyb3VwcyxzeXNfZ2V0Z3JvdXBzLHN5czMyX2dldGdyb3Vwc193cmFwcGVyKQkvKiAyMDUgKi8KLVNZU0NBTEwoc3lzX3NldGdyb3VwcyxzeXNfc2V0Z3JvdXBzLHN5czMyX3NldGdyb3Vwc193cmFwcGVyKQotU1lTQ0FMTChzeXNfZmNob3duLHN5c19mY2hvd24sc3lzMzJfZmNob3duX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRyZXN1aWQsc3lzX3NldHJlc3VpZCxzeXMzMl9zZXRyZXN1aWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2dldHJlc3VpZCxzeXNfZ2V0cmVzdWlkLHN5czMyX2dldHJlc3VpZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0cmVzZ2lkLHN5c19zZXRyZXNnaWQsc3lzMzJfc2V0cmVzZ2lkX3dyYXBwZXIpCS8qIDIxMCAqLwotU1lTQ0FMTChzeXNfZ2V0cmVzZ2lkLHN5c19nZXRyZXNnaWQsc3lzMzJfZ2V0cmVzZ2lkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19jaG93bixzeXNfY2hvd24sc3lzMzJfY2hvd25fd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldHVpZCxzeXNfc2V0dWlkLHN5czMyX3NldHVpZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0Z2lkLHN5c19zZXRnaWQsc3lzMzJfc2V0Z2lkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRmc3VpZCxzeXNfc2V0ZnN1aWQsc3lzMzJfc2V0ZnN1aWRfd3JhcHBlcikJLyogMjE1ICovCi1TWVNDQUxMKHN5c19zZXRmc2dpZCxzeXNfc2V0ZnNnaWQsc3lzMzJfc2V0ZnNnaWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3Bpdm90X3Jvb3Qsc3lzX3Bpdm90X3Jvb3Qsc3lzMzJfcGl2b3Rfcm9vdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbWluY29yZSxzeXNfbWluY29yZSxzeXMzMl9taW5jb3JlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tYWR2aXNlLHN5c19tYWR2aXNlLHN5czMyX21hZHZpc2Vfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2dldGRlbnRzNjQsc3lzX2dldGRlbnRzNjQsc3lzMzJfZ2V0ZGVudHM2NF93cmFwcGVyKQkvKiAyMjAgKi8KLVNZU0NBTEwoc3lzX2ZjbnRsNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19mY250bDY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19yZWFkYWhlYWQsc3lzX3JlYWRhaGVhZCxzeXMzMl9yZWFkYWhlYWRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NldHJldWlkLHN5c19zZXRyZXVpZCxjb21wYXRfc3lzX3NldHJldWlkKQorU1lTQ0FMTChzeXNfc2V0cmVnaWQsc3lzX3NldHJlZ2lkLGNvbXBhdF9zeXNfc2V0cmVnaWQpCitTWVNDQUxMKHN5c19nZXRncm91cHMsc3lzX2dldGdyb3Vwcyxjb21wYXRfc3lzX2dldGdyb3VwcykJLyogMjA1ICovCitTWVNDQUxMKHN5c19zZXRncm91cHMsc3lzX3NldGdyb3Vwcyxjb21wYXRfc3lzX3NldGdyb3VwcykKK1NZU0NBTEwoc3lzX2ZjaG93bixzeXNfZmNob3duLGNvbXBhdF9zeXNfZmNob3duKQorU1lTQ0FMTChzeXNfc2V0cmVzdWlkLHN5c19zZXRyZXN1aWQsY29tcGF0X3N5c19zZXRyZXN1aWQpCitTWVNDQUxMKHN5c19nZXRyZXN1aWQsc3lzX2dldHJlc3VpZCxjb21wYXRfc3lzX2dldHJlc3VpZCkKK1NZU0NBTEwoc3lzX3NldHJlc2dpZCxzeXNfc2V0cmVzZ2lkLGNvbXBhdF9zeXNfc2V0cmVzZ2lkKQkvKiAyMTAgKi8KK1NZU0NBTEwoc3lzX2dldHJlc2dpZCxzeXNfZ2V0cmVzZ2lkLGNvbXBhdF9zeXNfZ2V0cmVzZ2lkKQorU1lTQ0FMTChzeXNfY2hvd24sc3lzX2Nob3duLGNvbXBhdF9zeXNfY2hvd24pCitTWVNDQUxMKHN5c19zZXR1aWQsc3lzX3NldHVpZCxjb21wYXRfc3lzX3NldHVpZCkKK1NZU0NBTEwoc3lzX3NldGdpZCxzeXNfc2V0Z2lkLGNvbXBhdF9zeXNfc2V0Z2lkKQorU1lTQ0FMTChzeXNfc2V0ZnN1aWQsc3lzX3NldGZzdWlkLGNvbXBhdF9zeXNfc2V0ZnN1aWQpCS8qIDIxNSAqLworU1lTQ0FMTChzeXNfc2V0ZnNnaWQsc3lzX3NldGZzZ2lkLGNvbXBhdF9zeXNfc2V0ZnNnaWQpCitTWVNDQUxMKHN5c19waXZvdF9yb290LHN5c19waXZvdF9yb290LGNvbXBhdF9zeXNfcGl2b3Rfcm9vdCkKK1NZU0NBTEwoc3lzX21pbmNvcmUsc3lzX21pbmNvcmUsY29tcGF0X3N5c19taW5jb3JlKQorU1lTQ0FMTChzeXNfbWFkdmlzZSxzeXNfbWFkdmlzZSxjb21wYXRfc3lzX21hZHZpc2UpCitTWVNDQUxMKHN5c19nZXRkZW50czY0LHN5c19nZXRkZW50czY0LGNvbXBhdF9zeXNfZ2V0ZGVudHM2NCkJLyogMjIwICovCitTWVNDQUxMKHN5c19mY250bDY0LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfZmNudGw2NCkKK1NZU0NBTEwoc3lzX3JlYWRhaGVhZCxzeXNfcmVhZGFoZWFkLGNvbXBhdF9zeXNfczM5MF9yZWFkYWhlYWQpCiBTWVNDQUxMKHN5c19zZW5kZmlsZTY0LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfc2VuZGZpbGU2NCkKLVNZU0NBTEwoc3lzX3NldHhhdHRyLHN5c19zZXR4YXR0cixzeXMzMl9zZXR4YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfbHNldHhhdHRyLHN5c19sc2V0eGF0dHIsc3lzMzJfbHNldHhhdHRyX3dyYXBwZXIpCS8qIDIyNSAqLwotU1lTQ0FMTChzeXNfZnNldHhhdHRyLHN5c19mc2V0eGF0dHIsc3lzMzJfZnNldHhhdHRyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19nZXR4YXR0cixzeXNfZ2V0eGF0dHIsc3lzMzJfZ2V0eGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2xnZXR4YXR0cixzeXNfbGdldHhhdHRyLHN5czMyX2xnZXR4YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmdldHhhdHRyLHN5c19mZ2V0eGF0dHIsc3lzMzJfZmdldHhhdHRyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19saXN0eGF0dHIsc3lzX2xpc3R4YXR0cixzeXMzMl9saXN0eGF0dHJfd3JhcHBlcikJLyogMjMwICovCi1TWVNDQUxMKHN5c19sbGlzdHhhdHRyLHN5c19sbGlzdHhhdHRyLHN5czMyX2xsaXN0eGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZsaXN0eGF0dHIsc3lzX2ZsaXN0eGF0dHIsc3lzMzJfZmxpc3R4YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfcmVtb3ZleGF0dHIsc3lzX3JlbW92ZXhhdHRyLHN5czMyX3JlbW92ZXhhdHRyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19scmVtb3ZleGF0dHIsc3lzX2xyZW1vdmV4YXR0cixzeXMzMl9scmVtb3ZleGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZyZW1vdmV4YXR0cixzeXNfZnJlbW92ZXhhdHRyLHN5czMyX2ZyZW1vdmV4YXR0cl93cmFwcGVyKQkvKiAyMzUgKi8KK1NZU0NBTEwoc3lzX3NldHhhdHRyLHN5c19zZXR4YXR0cixjb21wYXRfc3lzX3NldHhhdHRyKQorU1lTQ0FMTChzeXNfbHNldHhhdHRyLHN5c19sc2V0eGF0dHIsY29tcGF0X3N5c19sc2V0eGF0dHIpCS8qIDIyNSAqLworU1lTQ0FMTChzeXNfZnNldHhhdHRyLHN5c19mc2V0eGF0dHIsY29tcGF0X3N5c19mc2V0eGF0dHIpCitTWVNDQUxMKHN5c19nZXR4YXR0cixzeXNfZ2V0eGF0dHIsY29tcGF0X3N5c19nZXR4YXR0cikKK1NZU0NBTEwoc3lzX2xnZXR4YXR0cixzeXNfbGdldHhhdHRyLGNvbXBhdF9zeXNfbGdldHhhdHRyKQorU1lTQ0FMTChzeXNfZmdldHhhdHRyLHN5c19mZ2V0eGF0dHIsY29tcGF0X3N5c19mZ2V0eGF0dHIpCitTWVNDQUxMKHN5c19saXN0eGF0dHIsc3lzX2xpc3R4YXR0cixjb21wYXRfc3lzX2xpc3R4YXR0cikJLyogMjMwICovCitTWVNDQUxMKHN5c19sbGlzdHhhdHRyLHN5c19sbGlzdHhhdHRyLGNvbXBhdF9zeXNfbGxpc3R4YXR0cikKK1NZU0NBTEwoc3lzX2ZsaXN0eGF0dHIsc3lzX2ZsaXN0eGF0dHIsY29tcGF0X3N5c19mbGlzdHhhdHRyKQorU1lTQ0FMTChzeXNfcmVtb3ZleGF0dHIsc3lzX3JlbW92ZXhhdHRyLGNvbXBhdF9zeXNfcmVtb3ZleGF0dHIpCitTWVNDQUxMKHN5c19scmVtb3ZleGF0dHIsc3lzX2xyZW1vdmV4YXR0cixjb21wYXRfc3lzX2xyZW1vdmV4YXR0cikKK1NZU0NBTEwoc3lzX2ZyZW1vdmV4YXR0cixzeXNfZnJlbW92ZXhhdHRyLGNvbXBhdF9zeXNfZnJlbW92ZXhhdHRyKQkvKiAyMzUgKi8KIFNZU0NBTEwoc3lzX2dldHRpZCxzeXNfZ2V0dGlkLHN5c19nZXR0aWQpCi1TWVNDQUxMKHN5c190a2lsbCxzeXNfdGtpbGwsc3lzX3RraWxsX3dyYXBwZXIpCitTWVNDQUxMKHN5c190a2lsbCxzeXNfdGtpbGwsY29tcGF0X3N5c190a2lsbCkKIFNZU0NBTEwoc3lzX2Z1dGV4LHN5c19mdXRleCxjb21wYXRfc3lzX2Z1dGV4KQotU1lTQ0FMTChzeXNfc2NoZWRfc2V0YWZmaW5pdHksc3lzX3NjaGVkX3NldGFmZmluaXR5LHN5czMyX3NjaGVkX3NldGFmZmluaXR5X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRhZmZpbml0eSxzeXNfc2NoZWRfZ2V0YWZmaW5pdHksc3lzMzJfc2NoZWRfZ2V0YWZmaW5pdHlfd3JhcHBlcikJLyogMjQwICovCi1TWVNDQUxMKHN5c190Z2tpbGwsc3lzX3Rna2lsbCxzeXNfdGdraWxsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zY2hlZF9zZXRhZmZpbml0eSxzeXNfc2NoZWRfc2V0YWZmaW5pdHksY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eSkKK1NZU0NBTEwoc3lzX3NjaGVkX2dldGFmZmluaXR5LHN5c19zY2hlZF9nZXRhZmZpbml0eSxjb21wYXRfc3lzX3NjaGVkX2dldGFmZmluaXR5KQkvKiAyNDAgKi8KK1NZU0NBTEwoc3lzX3Rna2lsbCxzeXNfdGdraWxsLGNvbXBhdF9zeXNfdGdraWxsKQogTklfU1lTQ0FMTAkJCQkJCQkvKiByZXNlcnZlZCBmb3IgVFVYICovCi1TWVNDQUxMKHN5c19pb19zZXR1cCxzeXNfaW9fc2V0dXAsc3lzMzJfaW9fc2V0dXBfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2lvX2Rlc3Ryb3ksc3lzX2lvX2Rlc3Ryb3ksc3lzMzJfaW9fZGVzdHJveV93cmFwcGVyKQotU1lTQ0FMTChzeXNfaW9fZ2V0ZXZlbnRzLHN5c19pb19nZXRldmVudHMsc3lzMzJfaW9fZ2V0ZXZlbnRzX3dyYXBwZXIpCS8qIDI0NSAqLwotU1lTQ0FMTChzeXNfaW9fc3VibWl0LHN5c19pb19zdWJtaXQsc3lzMzJfaW9fc3VibWl0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19pb19jYW5jZWwsc3lzX2lvX2NhbmNlbCxzeXMzMl9pb19jYW5jZWxfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2V4aXRfZ3JvdXAsc3lzX2V4aXRfZ3JvdXAsc3lzMzJfZXhpdF9ncm91cF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZXBvbGxfY3JlYXRlLHN5c19lcG9sbF9jcmVhdGUsc3lzX2Vwb2xsX2NyZWF0ZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfZXBvbGxfY3RsLHN5c19lcG9sbF9jdGwsc3lzX2Vwb2xsX2N0bF93cmFwcGVyKQkvKiAyNTAgKi8KLVNZU0NBTEwoc3lzX2Vwb2xsX3dhaXQsc3lzX2Vwb2xsX3dhaXQsc3lzX2Vwb2xsX3dhaXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldF90aWRfYWRkcmVzcyxzeXNfc2V0X3RpZF9hZGRyZXNzLHN5czMyX3NldF90aWRfYWRkcmVzc193cmFwcGVyKQotU1lTQ0FMTChzeXNfczM5MF9mYWR2aXNlNjQsc3lzX2ZhZHZpc2U2NF82NCxzeXMzMl9mYWR2aXNlNjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RpbWVyX2NyZWF0ZSxzeXNfdGltZXJfY3JlYXRlLHN5czMyX3RpbWVyX2NyZWF0ZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfdGltZXJfc2V0dGltZSxzeXNfdGltZXJfc2V0dGltZSxzeXMzMl90aW1lcl9zZXR0aW1lX3dyYXBwZXIpCS8qIDI1NSAqLwotU1lTQ0FMTChzeXNfdGltZXJfZ2V0dGltZSxzeXNfdGltZXJfZ2V0dGltZSxzeXMzMl90aW1lcl9nZXR0aW1lX3dyYXBwZXIpCi1TWVNDQUxMKHN5c190aW1lcl9nZXRvdmVycnVuLHN5c190aW1lcl9nZXRvdmVycnVuLHN5czMyX3RpbWVyX2dldG92ZXJydW5fd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RpbWVyX2RlbGV0ZSxzeXNfdGltZXJfZGVsZXRlLHN5czMyX3RpbWVyX2RlbGV0ZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfY2xvY2tfc2V0dGltZSxzeXNfY2xvY2tfc2V0dGltZSxzeXMzMl9jbG9ja19zZXR0aW1lX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19jbG9ja19nZXR0aW1lLHN5c19jbG9ja19nZXR0aW1lLHN5czMyX2Nsb2NrX2dldHRpbWVfd3JhcHBlcikJLyogMjYwICovCi1TWVNDQUxMKHN5c19jbG9ja19nZXRyZXMsc3lzX2Nsb2NrX2dldHJlcyxzeXMzMl9jbG9ja19nZXRyZXNfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Nsb2NrX25hbm9zbGVlcCxzeXNfY2xvY2tfbmFub3NsZWVwLHN5czMyX2Nsb2NrX25hbm9zbGVlcF93cmFwcGVyKQorU1lTQ0FMTChzeXNfaW9fc2V0dXAsc3lzX2lvX3NldHVwLGNvbXBhdF9zeXNfaW9fc2V0dXApCitTWVNDQUxMKHN5c19pb19kZXN0cm95LHN5c19pb19kZXN0cm95LGNvbXBhdF9zeXNfaW9fZGVzdHJveSkKK1NZU0NBTEwoc3lzX2lvX2dldGV2ZW50cyxzeXNfaW9fZ2V0ZXZlbnRzLGNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzKQkvKiAyNDUgKi8KK1NZU0NBTEwoc3lzX2lvX3N1Ym1pdCxzeXNfaW9fc3VibWl0LGNvbXBhdF9zeXNfaW9fc3VibWl0KQorU1lTQ0FMTChzeXNfaW9fY2FuY2VsLHN5c19pb19jYW5jZWwsY29tcGF0X3N5c19pb19jYW5jZWwpCitTWVNDQUxMKHN5c19leGl0X2dyb3VwLHN5c19leGl0X2dyb3VwLGNvbXBhdF9zeXNfZXhpdF9ncm91cCkKK1NZU0NBTEwoc3lzX2Vwb2xsX2NyZWF0ZSxzeXNfZXBvbGxfY3JlYXRlLGNvbXBhdF9zeXNfZXBvbGxfY3JlYXRlKQorU1lTQ0FMTChzeXNfZXBvbGxfY3RsLHN5c19lcG9sbF9jdGwsY29tcGF0X3N5c19lcG9sbF9jdGwpCS8qIDI1MCAqLworU1lTQ0FMTChzeXNfZXBvbGxfd2FpdCxzeXNfZXBvbGxfd2FpdCxjb21wYXRfc3lzX2Vwb2xsX3dhaXQpCitTWVNDQUxMKHN5c19zZXRfdGlkX2FkZHJlc3Msc3lzX3NldF90aWRfYWRkcmVzcyxjb21wYXRfc3lzX3NldF90aWRfYWRkcmVzcykKK1NZU0NBTEwoc3lzX3MzOTBfZmFkdmlzZTY0LHN5c19mYWR2aXNlNjRfNjQsY29tcGF0X3N5c19zMzkwX2ZhZHZpc2U2NCkKK1NZU0NBTEwoc3lzX3RpbWVyX2NyZWF0ZSxzeXNfdGltZXJfY3JlYXRlLGNvbXBhdF9zeXNfdGltZXJfY3JlYXRlKQorU1lTQ0FMTChzeXNfdGltZXJfc2V0dGltZSxzeXNfdGltZXJfc2V0dGltZSxjb21wYXRfc3lzX3RpbWVyX3NldHRpbWUpCS8qIDI1NSAqLworU1lTQ0FMTChzeXNfdGltZXJfZ2V0dGltZSxzeXNfdGltZXJfZ2V0dGltZSxjb21wYXRfc3lzX3RpbWVyX2dldHRpbWUpCitTWVNDQUxMKHN5c190aW1lcl9nZXRvdmVycnVuLHN5c190aW1lcl9nZXRvdmVycnVuLGNvbXBhdF9zeXNfdGltZXJfZ2V0b3ZlcnJ1bikKK1NZU0NBTEwoc3lzX3RpbWVyX2RlbGV0ZSxzeXNfdGltZXJfZGVsZXRlLGNvbXBhdF9zeXNfdGltZXJfZGVsZXRlKQorU1lTQ0FMTChzeXNfY2xvY2tfc2V0dGltZSxzeXNfY2xvY2tfc2V0dGltZSxjb21wYXRfc3lzX2Nsb2NrX3NldHRpbWUpCitTWVNDQUxMKHN5c19jbG9ja19nZXR0aW1lLHN5c19jbG9ja19nZXR0aW1lLGNvbXBhdF9zeXNfY2xvY2tfZ2V0dGltZSkJLyogMjYwICovCitTWVNDQUxMKHN5c19jbG9ja19nZXRyZXMsc3lzX2Nsb2NrX2dldHJlcyxjb21wYXRfc3lzX2Nsb2NrX2dldHJlcykKK1NZU0NBTEwoc3lzX2Nsb2NrX25hbm9zbGVlcCxzeXNfY2xvY2tfbmFub3NsZWVwLGNvbXBhdF9zeXNfY2xvY2tfbmFub3NsZWVwKQogTklfU1lTQ0FMTAkJCQkJCQkvKiByZXNlcnZlZCBmb3IgdnNlcnZlciAqLwotU1lTQ0FMTChzeXNfczM5MF9mYWR2aXNlNjRfNjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zdGF0ZnM2NCxzeXNfc3RhdGZzNjQsY29tcGF0X3N5c19zdGF0ZnM2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZnN0YXRmczY0LHN5c19mc3RhdGZzNjQsY29tcGF0X3N5c19mc3RhdGZzNjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3JlbWFwX2ZpbGVfcGFnZXMsc3lzX3JlbWFwX2ZpbGVfcGFnZXMsc3lzMzJfcmVtYXBfZmlsZV9wYWdlc193cmFwcGVyKQorU1lTQ0FMTChzeXNfczM5MF9mYWR2aXNlNjRfNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2ZhZHZpc2U2NF82NCkKK1NZU0NBTEwoc3lzX3N0YXRmczY0LHN5c19zdGF0ZnM2NCxjb21wYXRfc3lzX3N0YXRmczY0KQorU1lTQ0FMTChzeXNfZnN0YXRmczY0LHN5c19mc3RhdGZzNjQsY29tcGF0X3N5c19mc3RhdGZzNjQpCitTWVNDQUxMKHN5c19yZW1hcF9maWxlX3BhZ2VzLHN5c19yZW1hcF9maWxlX3BhZ2VzLGNvbXBhdF9zeXNfcmVtYXBfZmlsZV9wYWdlcykKIE5JX1NZU0NBTEwJCQkJCQkJLyogMjY4IHN5c19tYmluZCAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiAyNjkgc3lzX2dldF9tZW1wb2xpY3kgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogMjcwIHN5c19zZXRfbWVtcG9saWN5ICovCi1TWVNDQUxMKHN5c19tcV9vcGVuLHN5c19tcV9vcGVuLGNvbXBhdF9zeXNfbXFfb3Blbl93cmFwcGVyKQotU1lTQ0FMTChzeXNfbXFfdW5saW5rLHN5c19tcV91bmxpbmssc3lzMzJfbXFfdW5saW5rX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tcV90aW1lZHNlbmQsc3lzX21xX3RpbWVkc2VuZCxjb21wYXRfc3lzX21xX3RpbWVkc2VuZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbXFfdGltZWRyZWNlaXZlLHN5c19tcV90aW1lZHJlY2VpdmUsY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21xX25vdGlmeSxzeXNfbXFfbm90aWZ5LGNvbXBhdF9zeXNfbXFfbm90aWZ5X3dyYXBwZXIpIC8qIDI3NSAqLwotU1lTQ0FMTChzeXNfbXFfZ2V0c2V0YXR0cixzeXNfbXFfZ2V0c2V0YXR0cixjb21wYXRfc3lzX21xX2dldHNldGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2tleGVjX2xvYWQsc3lzX2tleGVjX2xvYWQsY29tcGF0X3N5c19rZXhlY19sb2FkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19hZGRfa2V5LHN5c19hZGRfa2V5LGNvbXBhdF9zeXNfYWRkX2tleV93cmFwcGVyKQotU1lTQ0FMTChzeXNfcmVxdWVzdF9rZXksc3lzX3JlcXVlc3Rfa2V5LGNvbXBhdF9zeXNfcmVxdWVzdF9rZXlfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2tleWN0bCxzeXNfa2V5Y3RsLGNvbXBhdF9zeXNfa2V5Y3RsX3dyYXBwZXIpCQkvKiAyODAgKi8KK1NZU0NBTEwoc3lzX21xX29wZW4sc3lzX21xX29wZW4sY29tcGF0X3N5c19tcV9vcGVuKQorU1lTQ0FMTChzeXNfbXFfdW5saW5rLHN5c19tcV91bmxpbmssY29tcGF0X3N5c19tcV91bmxpbmspCitTWVNDQUxMKHN5c19tcV90aW1lZHNlbmQsc3lzX21xX3RpbWVkc2VuZCxjb21wYXRfc3lzX21xX3RpbWVkc2VuZCkKK1NZU0NBTEwoc3lzX21xX3RpbWVkcmVjZWl2ZSxzeXNfbXFfdGltZWRyZWNlaXZlLGNvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlKQorU1lTQ0FMTChzeXNfbXFfbm90aWZ5LHN5c19tcV9ub3RpZnksY29tcGF0X3N5c19tcV9ub3RpZnkpIC8qIDI3NSAqLworU1lTQ0FMTChzeXNfbXFfZ2V0c2V0YXR0cixzeXNfbXFfZ2V0c2V0YXR0cixjb21wYXRfc3lzX21xX2dldHNldGF0dHIpCitTWVNDQUxMKHN5c19rZXhlY19sb2FkLHN5c19rZXhlY19sb2FkLGNvbXBhdF9zeXNfa2V4ZWNfbG9hZCkKK1NZU0NBTEwoc3lzX2FkZF9rZXksc3lzX2FkZF9rZXksY29tcGF0X3N5c19hZGRfa2V5KQorU1lTQ0FMTChzeXNfcmVxdWVzdF9rZXksc3lzX3JlcXVlc3Rfa2V5LGNvbXBhdF9zeXNfcmVxdWVzdF9rZXkpCitTWVNDQUxMKHN5c19rZXljdGwsc3lzX2tleWN0bCxjb21wYXRfc3lzX2tleWN0bCkJCS8qIDI4MCAqLwogU1lTQ0FMTChzeXNfd2FpdGlkLHN5c193YWl0aWQsY29tcGF0X3N5c193YWl0aWQpCi1TWVNDQUxMKHN5c19pb3ByaW9fc2V0LHN5c19pb3ByaW9fc2V0LHN5c19pb3ByaW9fc2V0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19pb3ByaW9fZ2V0LHN5c19pb3ByaW9fZ2V0LHN5c19pb3ByaW9fZ2V0X3dyYXBwZXIpCitTWVNDQUxMKHN5c19pb3ByaW9fc2V0LHN5c19pb3ByaW9fc2V0LGNvbXBhdF9zeXNfaW9wcmlvX3NldCkKK1NZU0NBTEwoc3lzX2lvcHJpb19nZXQsc3lzX2lvcHJpb19nZXQsY29tcGF0X3N5c19pb3ByaW9fZ2V0KQogU1lTQ0FMTChzeXNfaW5vdGlmeV9pbml0LHN5c19pbm90aWZ5X2luaXQsc3lzX2lub3RpZnlfaW5pdCkKLVNZU0NBTEwoc3lzX2lub3RpZnlfYWRkX3dhdGNoLHN5c19pbm90aWZ5X2FkZF93YXRjaCxzeXNfaW5vdGlmeV9hZGRfd2F0Y2hfd3JhcHBlcikJLyogMjg1ICovCi1TWVNDQUxMKHN5c19pbm90aWZ5X3JtX3dhdGNoLHN5c19pbm90aWZ5X3JtX3dhdGNoLHN5c19pbm90aWZ5X3JtX3dhdGNoX3dyYXBwZXIpCitTWVNDQUxMKHN5c19pbm90aWZ5X2FkZF93YXRjaCxzeXNfaW5vdGlmeV9hZGRfd2F0Y2gsY29tcGF0X3N5c19pbm90aWZ5X2FkZF93YXRjaCkJLyogMjg1ICovCitTWVNDQUxMKHN5c19pbm90aWZ5X3JtX3dhdGNoLHN5c19pbm90aWZ5X3JtX3dhdGNoLGNvbXBhdF9zeXNfaW5vdGlmeV9ybV93YXRjaCkKIE5JX1NZU0NBTEwJCQkJCQkJLyogMjg3IHN5c19taWdyYXRlX3BhZ2VzICovCiBTWVNDQUxMKHN5c19vcGVuYXQsc3lzX29wZW5hdCxjb21wYXRfc3lzX29wZW5hdCkKLVNZU0NBTEwoc3lzX21rZGlyYXQsc3lzX21rZGlyYXQsc3lzX21rZGlyYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21rbm9kYXQsc3lzX21rbm9kYXQsc3lzX21rbm9kYXRfd3JhcHBlcikJLyogMjkwICovCi1TWVNDQUxMKHN5c19mY2hvd25hdCxzeXNfZmNob3duYXQsc3lzX2ZjaG93bmF0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mdXRpbWVzYXQsc3lzX2Z1dGltZXNhdCxjb21wYXRfc3lzX2Z1dGltZXNhdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZnN0YXRhdDY0LHN5c19uZXdmc3RhdGF0LHN5czMyX2ZzdGF0YXQ2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfdW5saW5rYXQsc3lzX3VubGlua2F0LHN5c191bmxpbmthdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfcmVuYW1lYXQsc3lzX3JlbmFtZWF0LHN5c19yZW5hbWVhdF93cmFwcGVyKQkvKiAyOTUgKi8KLVNZU0NBTEwoc3lzX2xpbmthdCxzeXNfbGlua2F0LHN5c19saW5rYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3N5bWxpbmthdCxzeXNfc3ltbGlua2F0LHN5c19zeW1saW5rYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3JlYWRsaW5rYXQsc3lzX3JlYWRsaW5rYXQsc3lzX3JlYWRsaW5rYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZjaG1vZGF0LHN5c19mY2htb2RhdCxzeXNfZmNobW9kYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZhY2Nlc3NhdCxzeXNfZmFjY2Vzc2F0LHN5c19mYWNjZXNzYXRfd3JhcHBlcikJLyogMzAwICovCi1TWVNDQUxMKHN5c19wc2VsZWN0NixzeXNfcHNlbGVjdDYsY29tcGF0X3N5c19wc2VsZWN0Nl93cmFwcGVyKQotU1lTQ0FMTChzeXNfcHBvbGwsc3lzX3Bwb2xsLGNvbXBhdF9zeXNfcHBvbGxfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3Vuc2hhcmUsc3lzX3Vuc2hhcmUsc3lzX3Vuc2hhcmVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX21rZGlyYXQsc3lzX21rZGlyYXQsY29tcGF0X3N5c19ta2RpcmF0KQorU1lTQ0FMTChzeXNfbWtub2RhdCxzeXNfbWtub2RhdCxjb21wYXRfc3lzX21rbm9kYXQpCS8qIDI5MCAqLworU1lTQ0FMTChzeXNfZmNob3duYXQsc3lzX2ZjaG93bmF0LGNvbXBhdF9zeXNfZmNob3duYXQpCitTWVNDQUxMKHN5c19mdXRpbWVzYXQsc3lzX2Z1dGltZXNhdCxjb21wYXRfc3lzX2Z1dGltZXNhdCkKK1NZU0NBTEwoc3lzX2ZzdGF0YXQ2NCxzeXNfbmV3ZnN0YXRhdCxjb21wYXRfc3lzX3MzOTBfZnN0YXRhdDY0KQorU1lTQ0FMTChzeXNfdW5saW5rYXQsc3lzX3VubGlua2F0LGNvbXBhdF9zeXNfdW5saW5rYXQpCitTWVNDQUxMKHN5c19yZW5hbWVhdCxzeXNfcmVuYW1lYXQsY29tcGF0X3N5c19yZW5hbWVhdCkJLyogMjk1ICovCitTWVNDQUxMKHN5c19saW5rYXQsc3lzX2xpbmthdCxjb21wYXRfc3lzX2xpbmthdCkKK1NZU0NBTEwoc3lzX3N5bWxpbmthdCxzeXNfc3ltbGlua2F0LGNvbXBhdF9zeXNfc3ltbGlua2F0KQorU1lTQ0FMTChzeXNfcmVhZGxpbmthdCxzeXNfcmVhZGxpbmthdCxjb21wYXRfc3lzX3JlYWRsaW5rYXQpCitTWVNDQUxMKHN5c19mY2htb2RhdCxzeXNfZmNobW9kYXQsY29tcGF0X3N5c19mY2htb2RhdCkKK1NZU0NBTEwoc3lzX2ZhY2Nlc3NhdCxzeXNfZmFjY2Vzc2F0LGNvbXBhdF9zeXNfZmFjY2Vzc2F0KQkvKiAzMDAgKi8KK1NZU0NBTEwoc3lzX3BzZWxlY3Q2LHN5c19wc2VsZWN0Nixjb21wYXRfc3lzX3BzZWxlY3Q2KQorU1lTQ0FMTChzeXNfcHBvbGwsc3lzX3Bwb2xsLGNvbXBhdF9zeXNfcHBvbGwpCitTWVNDQUxMKHN5c191bnNoYXJlLHN5c191bnNoYXJlLGNvbXBhdF9zeXNfdW5zaGFyZSkKIFNZU0NBTEwoc3lzX3NldF9yb2J1c3RfbGlzdCxzeXNfc2V0X3JvYnVzdF9saXN0LGNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0KQogU1lTQ0FMTChzeXNfZ2V0X3JvYnVzdF9saXN0LHN5c19nZXRfcm9idXN0X2xpc3QsY29tcGF0X3N5c19nZXRfcm9idXN0X2xpc3QpCi1TWVNDQUxMKHN5c19zcGxpY2Usc3lzX3NwbGljZSxzeXNfc3BsaWNlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zeW5jX2ZpbGVfcmFuZ2Usc3lzX3N5bmNfZmlsZV9yYW5nZSxzeXNfc3luY19maWxlX3JhbmdlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c190ZWUsc3lzX3RlZSxzeXNfdGVlX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zcGxpY2Usc3lzX3NwbGljZSxjb21wYXRfc3lzX3NwbGljZSkKK1NZU0NBTEwoc3lzX3N5bmNfZmlsZV9yYW5nZSxzeXNfc3luY19maWxlX3JhbmdlLGNvbXBhdF9zeXNfczM5MF9zeW5jX2ZpbGVfcmFuZ2UpCitTWVNDQUxMKHN5c190ZWUsc3lzX3RlZSxjb21wYXRfc3lzX3RlZSkKIFNZU0NBTEwoc3lzX3Ztc3BsaWNlLHN5c192bXNwbGljZSxjb21wYXRfc3lzX3Ztc3BsaWNlKQogTklfU1lTQ0FMTAkJCQkJCQkvKiAzMTAgc3lzX21vdmVfcGFnZXMgKi8KLVNZU0NBTEwoc3lzX2dldGNwdSxzeXNfZ2V0Y3B1LHN5c19nZXRjcHVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldGNwdSxzeXNfZ2V0Y3B1LGNvbXBhdF9zeXNfZ2V0Y3B1KQogU1lTQ0FMTChzeXNfZXBvbGxfcHdhaXQsc3lzX2Vwb2xsX3B3YWl0LGNvbXBhdF9zeXNfZXBvbGxfcHdhaXQpCi1TWVNDQUxMKHN5c191dGltZXMsc3lzX3V0aW1lcyxjb21wYXRfc3lzX3V0aW1lc193cmFwcGVyKQotU1lTQ0FMTChzeXNfczM5MF9mYWxsb2NhdGUsc3lzX2ZhbGxvY2F0ZSxzeXNfZmFsbG9jYXRlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c191dGltZW5zYXQsc3lzX3V0aW1lbnNhdCxjb21wYXRfc3lzX3V0aW1lbnNhdF93cmFwcGVyKQkvKiAzMTUgKi8KK1NZU0NBTEwoc3lzX3V0aW1lcyxzeXNfdXRpbWVzLGNvbXBhdF9zeXNfdXRpbWVzKQorU1lTQ0FMTChzeXNfczM5MF9mYWxsb2NhdGUsc3lzX2ZhbGxvY2F0ZSxjb21wYXRfc3lzX3MzOTBfZmFsbG9jYXRlKQorU1lTQ0FMTChzeXNfdXRpbWVuc2F0LHN5c191dGltZW5zYXQsY29tcGF0X3N5c191dGltZW5zYXQpCS8qIDMxNSAqLwogU1lTQ0FMTChzeXNfc2lnbmFsZmQsc3lzX3NpZ25hbGZkLGNvbXBhdF9zeXNfc2lnbmFsZmQpCiBOSV9TWVNDQUxMCQkJCQkJLyogMzE3IG9sZCBzeXNfdGltZXJfZmQgKi8KLVNZU0NBTEwoc3lzX2V2ZW50ZmQsc3lzX2V2ZW50ZmQsc3lzX2V2ZW50ZmRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RpbWVyZmRfY3JlYXRlLHN5c190aW1lcmZkX2NyZWF0ZSxzeXNfdGltZXJmZF9jcmVhdGVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2V2ZW50ZmQsc3lzX2V2ZW50ZmQsY29tcGF0X3N5c19ldmVudGZkKQorU1lTQ0FMTChzeXNfdGltZXJmZF9jcmVhdGUsc3lzX3RpbWVyZmRfY3JlYXRlLGNvbXBhdF9zeXNfdGltZXJmZF9jcmVhdGUpCiBTWVNDQUxMKHN5c190aW1lcmZkX3NldHRpbWUsc3lzX3RpbWVyZmRfc2V0dGltZSxjb21wYXRfc3lzX3RpbWVyZmRfc2V0dGltZSkgLyogMzIwICovCiBTWVNDQUxMKHN5c190aW1lcmZkX2dldHRpbWUsc3lzX3RpbWVyZmRfZ2V0dGltZSxjb21wYXRfc3lzX3RpbWVyZmRfZ2V0dGltZSkKIFNZU0NBTEwoc3lzX3NpZ25hbGZkNCxzeXNfc2lnbmFsZmQ0LGNvbXBhdF9zeXNfc2lnbmFsZmQ0KQotU1lTQ0FMTChzeXNfZXZlbnRmZDIsc3lzX2V2ZW50ZmQyLHN5c19ldmVudGZkMl93cmFwcGVyKQotU1lTQ0FMTChzeXNfaW5vdGlmeV9pbml0MSxzeXNfaW5vdGlmeV9pbml0MSxzeXNfaW5vdGlmeV9pbml0MV93cmFwcGVyKQotU1lTQ0FMTChzeXNfcGlwZTIsc3lzX3BpcGUyLHN5c19waXBlMl93cmFwcGVyKSAvKiAzMjUgKi8KLVNZU0NBTEwoc3lzX2R1cDMsc3lzX2R1cDMsc3lzX2R1cDNfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Vwb2xsX2NyZWF0ZTEsc3lzX2Vwb2xsX2NyZWF0ZTEsc3lzX2Vwb2xsX2NyZWF0ZTFfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2V2ZW50ZmQyLHN5c19ldmVudGZkMixjb21wYXRfc3lzX2V2ZW50ZmQyKQorU1lTQ0FMTChzeXNfaW5vdGlmeV9pbml0MSxzeXNfaW5vdGlmeV9pbml0MSxjb21wYXRfc3lzX2lub3RpZnlfaW5pdDEpCitTWVNDQUxMKHN5c19waXBlMixzeXNfcGlwZTIsY29tcGF0X3N5c19waXBlMikgLyogMzI1ICovCitTWVNDQUxMKHN5c19kdXAzLHN5c19kdXAzLGNvbXBhdF9zeXNfZHVwMykKK1NZU0NBTEwoc3lzX2Vwb2xsX2NyZWF0ZTEsc3lzX2Vwb2xsX2NyZWF0ZTEsY29tcGF0X3N5c19lcG9sbF9jcmVhdGUxKQogU1lTQ0FMTChzeXNfcHJlYWR2LHN5c19wcmVhZHYsY29tcGF0X3N5c19wcmVhZHYpCiBTWVNDQUxMKHN5c19wd3JpdGV2LHN5c19wd3JpdGV2LGNvbXBhdF9zeXNfcHdyaXRldikKIFNZU0NBTEwoc3lzX3J0X3Rnc2lncXVldWVpbmZvLHN5c19ydF90Z3NpZ3F1ZXVlaW5mbyxjb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvKSAvKiAzMzAgKi8KLVNZU0NBTEwoc3lzX3BlcmZfZXZlbnRfb3BlbixzeXNfcGVyZl9ldmVudF9vcGVuLHN5c19wZXJmX2V2ZW50X29wZW5fd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Zhbm90aWZ5X2luaXQsc3lzX2Zhbm90aWZ5X2luaXQsc3lzX2Zhbm90aWZ5X2luaXRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3BlcmZfZXZlbnRfb3BlbixzeXNfcGVyZl9ldmVudF9vcGVuLGNvbXBhdF9zeXNfcGVyZl9ldmVudF9vcGVuKQorU1lTQ0FMTChzeXNfZmFub3RpZnlfaW5pdCxzeXNfZmFub3RpZnlfaW5pdCxjb21wYXRfc3lzX2Zhbm90aWZ5X2luaXQpCiBTWVNDQUxMKHN5c19mYW5vdGlmeV9tYXJrLHN5c19mYW5vdGlmeV9tYXJrLGNvbXBhdF9zeXNfZmFub3RpZnlfbWFyaykKLVNZU0NBTEwoc3lzX3BybGltaXQ2NCxzeXNfcHJsaW1pdDY0LHN5c19wcmxpbWl0NjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX25hbWVfdG9faGFuZGxlX2F0LHN5c19uYW1lX3RvX2hhbmRsZV9hdCxzeXNfbmFtZV90b19oYW5kbGVfYXRfd3JhcHBlcikgLyogMzM1ICovCitTWVNDQUxMKHN5c19wcmxpbWl0NjQsc3lzX3BybGltaXQ2NCxjb21wYXRfc3lzX3BybGltaXQ2NCkKK1NZU0NBTEwoc3lzX25hbWVfdG9faGFuZGxlX2F0LHN5c19uYW1lX3RvX2hhbmRsZV9hdCxjb21wYXRfc3lzX25hbWVfdG9faGFuZGxlX2F0KSAvKiAzMzUgKi8KIFNZU0NBTEwoc3lzX29wZW5fYnlfaGFuZGxlX2F0LHN5c19vcGVuX2J5X2hhbmRsZV9hdCxjb21wYXRfc3lzX29wZW5fYnlfaGFuZGxlX2F0KQotU1lTQ0FMTChzeXNfY2xvY2tfYWRqdGltZSxzeXNfY2xvY2tfYWRqdGltZSxjb21wYXRfc3lzX2Nsb2NrX2FkanRpbWVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3N5bmNmcyxzeXNfc3luY2ZzLHN5c19zeW5jZnNfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldG5zLHN5c19zZXRucyxzeXNfc2V0bnNfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3Byb2Nlc3Nfdm1fcmVhZHYsc3lzX3Byb2Nlc3Nfdm1fcmVhZHYsY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2X3dyYXBwZXIpIC8qIDM0MCAqLwotU1lTQ0FMTChzeXNfcHJvY2Vzc192bV93cml0ZXYsc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2LGNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXZfd3JhcHBlcikKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsc3lzX3MzOTBfcnVudGltZV9pbnN0cixzeXNfczM5MF9ydW50aW1lX2luc3RyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19rY21wLHN5c19rY21wLHN5c19rY21wX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19maW5pdF9tb2R1bGUsc3lzX2Zpbml0X21vZHVsZSxzeXNfZmluaXRfbW9kdWxlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zY2hlZF9zZXRhdHRyLHN5c19zY2hlZF9zZXRhdHRyLHN5c19zY2hlZF9zZXRhdHRyX3dyYXBwZXIpIC8qIDM0NSAqLwotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YXR0cixzeXNfc2NoZWRfZ2V0YXR0cixzeXNfc2NoZWRfZ2V0YXR0cl93cmFwcGVyKQorU1lTQ0FMTChzeXNfY2xvY2tfYWRqdGltZSxzeXNfY2xvY2tfYWRqdGltZSxjb21wYXRfc3lzX2Nsb2NrX2FkanRpbWUpCitTWVNDQUxMKHN5c19zeW5jZnMsc3lzX3N5bmNmcyxjb21wYXRfc3lzX3N5bmNmcykKK1NZU0NBTEwoc3lzX3NldG5zLHN5c19zZXRucyxjb21wYXRfc3lzX3NldG5zKQorU1lTQ0FMTChzeXNfcHJvY2Vzc192bV9yZWFkdixzeXNfcHJvY2Vzc192bV9yZWFkdixjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpIC8qIDM0MCAqLworU1lTQ0FMTChzeXNfcHJvY2Vzc192bV93cml0ZXYsc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2LGNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXYpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLHN5c19zMzkwX3J1bnRpbWVfaW5zdHIsY29tcGF0X3N5c19zMzkwX3J1bnRpbWVfaW5zdHIpCitTWVNDQUxMKHN5c19rY21wLHN5c19rY21wLGNvbXBhdF9zeXNfa2NtcCkKK1NZU0NBTEwoc3lzX2Zpbml0X21vZHVsZSxzeXNfZmluaXRfbW9kdWxlLGNvbXBhdF9zeXNfZmluaXRfbW9kdWxlKQorU1lTQ0FMTChzeXNfc2NoZWRfc2V0YXR0cixzeXNfc2NoZWRfc2V0YXR0cixjb21wYXRfc3lzX3NjaGVkX3NldGF0dHIpIC8qIDM0NSAqLworU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YXR0cixzeXNfc2NoZWRfZ2V0YXR0cixjb21wYXRfc3lzX3NjaGVkX2dldGF0dHIpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL3MzOTAva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggNGIyZTNlMy4uNjI5OGZlZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtNDUxLDcgKzQ1MSw2IEBACiAJfQogCXNldF90b3BvbG9neV90aW1lcigpOwogb3V0OgotCXVwZGF0ZV9jcHVfbWFza3MoKTsKIAlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGNwdV9zdWJzeXMuZGV2X3Jvb3QsICZkZXZfYXR0cl9kaXNwYXRjaGluZyk7CiB9CiBkZXZpY2VfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2RpYWcuYyBiL2FyY2gvczM5MC9rdm0vZGlhZy5jCmluZGV4IDgyMTZjMGUuLjZmOWNmYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vZGlhZy5jCisrKyBiL2FyY2gvczM5MC9rdm0vZGlhZy5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3ZpcnRpby1jY3cuaD4KICNpbmNsdWRlICJrdm0tczM5MC5oIgogI2luY2x1ZGUgInRyYWNlLmgiCkBAIC04Niw5ICs4NywxMSBAQAogCXN3aXRjaCAoc3ViY29kZSkgewogCWNhc2UgMzoKIAkJdmNwdS0+cnVuLT5zMzkwX3Jlc2V0X2ZsYWdzID0gS1ZNX1MzOTBfUkVTRVRfQ0xFQVI7CisJCXBhZ2VfdGFibGVfcmVzZXRfcGdzdGUoY3VycmVudC0+bW0sIDAsIFRBU0tfU0laRSk7CiAJCWJyZWFrOwogCWNhc2UgNDoKIAkJdmNwdS0+cnVuLT5zMzkwX3Jlc2V0X2ZsYWdzID0gMDsKKwkJcGFnZV90YWJsZV9yZXNldF9wZ3N0ZShjdXJyZW50LT5tbSwgMCwgVEFTS19TSVpFKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCmluZGV4IGUwNjc2ZjMuLjEwYjVkYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYworKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAl7ICJpbnN0cnVjdGlvbl9zdG9yYWdlX2tleSIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zdG9yYWdlX2tleSkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zdHNjaCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zdHNjaCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9jaHNjIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX2Noc2MpIH0sCisJeyAiaW5zdHJ1Y3Rpb25fZXNzYSIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9lc3NhKSB9LAogCXsgImluc3RydWN0aW9uX3N0c2kiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc3RzaSkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zdGZsIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3N0ZmwpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fdHByb3QiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fdHByb3QpIH0sCkBAIC0yODMsNyArMjg0LDExIEBACiAJaWYgKGt2bV9pc191Y29udHJvbCh2Y3B1LT5rdm0pKQogCQlnbWFwX2ZyZWUodmNwdS0+YXJjaC5nbWFwKTsKIAorCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2JybG8pCisJCV9fZnJlZV9wYWdlKF9fcGZuX3RvX3BhZ2UoCisJCQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmNicmxvID4+IFBBR0VfU0hJRlQpKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHZjcHUtPmFyY2guc2llX2Jsb2NrKSk7CisKIAlrdm1fdmNwdV91bmluaXQodmNwdSk7CiAJa21lbV9jYWNoZV9mcmVlKGt2bV92Y3B1X2NhY2hlLCB2Y3B1KTsKIH0KQEAgLTM5MCw2ICszOTUsOCBAQAogCiBpbnQga3ZtX2FyY2hfdmNwdV9zZXR1cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJc3RydWN0IHBhZ2UgKmNicmw7CisKIAlhdG9taWNfc2V0KCZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y3B1ZmxhZ3MsIENQVVNUQVRfWkFSQ0ggfAogCQkJCQkJICAgIENQVVNUQVRfU00gfAogCQkJCQkJICAgIENQVVNUQVRfU1RPUFBFRCB8CkBAIC00MDEsNiArNDA4LDE0IEBACiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYjIgID0gODsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhICAgPSAweEMxMDAyMDAxVTsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZmFjICAgPSAoaW50KSAobG9uZykgdmZhY2lsaXRpZXM7CisJaWYgKGt2bV9lbmFibGVkX2NtbWEoKSkgeworCQljYnJsID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmIChjYnJsKSB7CisJCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiMiB8PSAweDgwOworCQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYjIgJj0gfjB4MDg7CisJCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2JybG8gPSBwYWdlX3RvX3BoeXMoY2JybCk7CisJCX0KKwl9CiAJaHJ0aW1lcl9pbml0KCZ2Y3B1LT5hcmNoLmNrY190aW1lciwgQ0xPQ0tfUkVBTFRJTUUsIEhSVElNRVJfTU9ERV9BQlMpOwogCXRhc2tsZXRfaW5pdCgmdmNwdS0+YXJjaC50YXNrbGV0LCBrdm1fczM5MF90YXNrbGV0LAogCQkgICAgICh1bnNpZ25lZCBsb25nKSB2Y3B1KTsKQEAgLTc2MSw2ICs3NzYsMTYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2Jvb2wga3ZtX2VuYWJsZWRfY21tYSh2b2lkKQoreworCWlmICghTUFDSElORV9JU19MUEFSKQorCQlyZXR1cm4gZmFsc2U7CisJLyogb25seSBlbmFibGUgZm9yIHoxMCBhbmQgbGF0ZXIgKi8KKwlpZiAoIU1BQ0hJTkVfSEFTX0VEQVQxKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBpbnQgX192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJaW50IHJjLCBleGl0X3JlYXNvbjsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaCBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAppbmRleCBmOTU1OWIwLi41NjQ1MTRmNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCisrKyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaApAQCAtMTU2LDYgKzE1Niw4IEBACiB2b2lkIHMzOTBfdmNwdV91bmJsb2NrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGV4aXRfc2llKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGV4aXRfc2llX3N5bmMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKy8qIGFyZSB3ZSBnb2luZyB0byBzdXBwb3J0IGNtbWE/ICovCitib29sIGt2bV9lbmFibGVkX2NtbWEodm9pZCk7CiAvKiBpbXBsZW1lbnRlZCBpbiBkaWFnLmMgKi8KIGludCBrdm1fczM5MF9oYW5kbGVfZGlhZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3ByaXYuYyBiL2FyY2gvczM5MC9rdm0vcHJpdi5jCmluZGV4IDc1YmVlYTYuLmFhY2I2YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vcHJpdi5jCisrKyBiL2FyY2gvczM5MC9rdm0vcHJpdi5jCkBAIC02MzYsOCArNjM2LDQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaGFuZGxlX2Vzc2Eoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIGVudHJpZXMgZXhwZWN0ZWQgdG8gYmUgMUZGICovCisJaW50IGVudHJpZXMgPSAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmNicmxvICYgflBBR0VfTUFTSykgPj4gMzsKKwl1bnNpZ25lZCBsb25nICpjYnJsbywgY2JybGU7CisJc3RydWN0IGdtYXAgKmdtYXA7CisJaW50IGk7CisKKwlWQ1BVX0VWRU5UKHZjcHUsIDUsICJjbW1hIHJlbGVhc2UgJWQgcGFnZXMiLCBlbnRyaWVzKTsKKwlnbWFwID0gdmNwdS0+YXJjaC5nbWFwOworCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fZXNzYSsrOworCWlmICgha3ZtX2VuYWJsZWRfY21tYSgpIHx8ICF2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2JybG8pCisJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX09QRVJBVElPTik7CisKKwlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CisKKwlpZiAoKCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiICYgMHhmMDAwMDAwMCkgPj4gMjgpID4gNikKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CisKKwkvKiBSZXdpbmQgUFNXIHRvIHJlcGVhdCB0aGUgRVNTQSBpbnN0cnVjdGlvbiAqLworCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LmFkZHIgPQorCQlfX3Jld2luZF9wc3codmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csIDQpOworCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5jYnJsbyAmPSBQQUdFX01BU0s7CS8qIHJlc2V0IG5jZW8gKi8KKwljYnJsbyA9IHBoeXNfdG9fdmlydCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2JybG8pOworCWRvd25fcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgKytpKSB7CisJCWNicmxlID0gY2JybG9baV07CisJCWlmICh1bmxpa2VseShjYnJsZSAmIH5QQUdFX01BU0sgfHwgY2JybGUgPCAyICogUEFHRV9TSVpFKSkKKwkJCS8qIGludmFsaWQgZW50cnkgKi8KKwkJCWJyZWFrOworCQkvKiB0cnkgdG8gZnJlZSBiYWNraW5nICovCisJCV9fZ21hcF96YXAoY2JybGUsIGdtYXApOworCX0KKwl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCWlmIChpIDwgZW50cmllcykKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBpbnRlcmNlcHRfaGFuZGxlcl90IGI5X2hhbmRsZXJzWzI1Nl0gPSB7CiAJWzB4OGRdID0gaGFuZGxlX2Vwc3csCisJWzB4YWJdID0gaGFuZGxlX2Vzc2EsCiAJWzB4YWZdID0gaGFuZGxlX3BmbWYsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlIGIvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQppbmRleCBiMDY4NzI5Li5lM2ZmZmUxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKQEAgLTIsOCArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBzMzkwLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgogIwogCi1saWIteSArPSBkZWxheS5vIHN0cmluZy5vIHVhY2Nlc3NfcHQubyBmaW5kLm8KK2xpYi15ICs9IGRlbGF5Lm8gc3RyaW5nLm8gdWFjY2Vzc19wdC5vIHVhY2Nlc3NfbXZjb3MubyBmaW5kLm8KIG9iai0kKENPTkZJR18zMkJJVCkgKz0gZGl2NjQubyBxcm5uZC5vIHVjbXBkaTIubyBtZW0zMi5vCiBvYmotJChDT05GSUdfNjRCSVQpICs9IG1lbTY0Lm8KLWxpYi0kKENPTkZJR182NEJJVCkgKz0gdWFjY2Vzc19tdmNvcy5vCiBsaWItJChDT05GSUdfU01QKSArPSBzcGlubG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL2ZpbmQuYyBiL2FyY2gvczM5MC9saWIvZmluZC5jCmluZGV4IDYyMGQzNGQuLjkyMjAwM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvZmluZC5jCisrKyBiL2FyY2gvczM5MC9saWIvZmluZC5jCkBAIC00LDcgKzQsNyBAQAogICogT24gczM5MHggdGhlIGJpdHMgYXJlIG51bWJlcmVkOgogICogICB8MC4uLi4uLi4uLi4uLi4uNjN8NjQuLi4uLi4uLi4uLi4xMjd8MTI4Li4uLi4uLi4uLi4xOTF8MTkyLi4uLi4uLi4uLi4yNTV8CiAgKiBhbmQgb24gczM5MDoKLSAqICAgfDAuLi4uLjMxfDMxLi4uLjYzfDY0Li4uLjk1fDk2Li4uMTI3fDEyOC4uMTU5fDE2MC4uMTkxfDE5Mi4uMjIzfDIyNC4uMjU1fAorICogICB8MC4uLi4uMzF8MzIuLi4uNjN8NjQuLi4uOTV8OTYuLi4xMjd8MTI4Li4xNTl8MTYwLi4xOTF8MTkyLi4yMjN8MjI0Li4yNTV8CiAgKgogICogVGhlIHJlYXNvbiBmb3IgdGhpcyBiaXQgbnVtYmVyaW5nIGlzIHRoZSBmYWN0IHRoYXQgdGhlIGhhcmR3YXJlIHNldHMgYml0cwogICogaW4gYSBiaXRtYXAgc3RhcnRpbmcgYXQgYml0IDAgKE1TQikgYW5kIHdlIGRvbid0IHdhbnQgdG8gc2NhbiB0aGUgYml0bWFwCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3MuaCBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5oCmluZGV4IGIxYTIyMTcuLmM3ZTBlODFmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3MuaAorKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3MuaApAQCAtNiw3ICs2LDExIEBACiAjaWZuZGVmIF9fQVJDSF9TMzkwX0xJQl9VQUNDRVNTX0gKICNkZWZpbmUgX19BUkNIX1MzOTBfTElCX1VBQ0NFU1NfSAogCi1leHRlcm4gaW50IGZ1dGV4X2F0b21pY19vcF9wdChpbnQsIHUzMiBfX3VzZXIgKiwgaW50LCBpbnQgKik7Ci1leHRlcm4gaW50IGZ1dGV4X2F0b21pY19jbXB4Y2hnX3B0KHUzMiAqLCB1MzIgX191c2VyICosIHUzMiwgdTMyKTsKK3Vuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXJfcHQodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwordW5zaWduZWQgbG9uZyBjb3B5X3RvX3VzZXJfcHQodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwordW5zaWduZWQgbG9uZyBjb3B5X2luX3VzZXJfcHQodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKK3Vuc2lnbmVkIGxvbmcgY2xlYXJfdXNlcl9wdCh2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIHN0cm5sZW5fdXNlcl9wdChjb25zdCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2xvbmcgc3RybmNweV9mcm9tX3VzZXJfcHQoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKIAogI2VuZGlmIC8qIF9fQVJDSF9TMzkwX0xJQl9VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvdWFjY2Vzc19tdmNvcy5jIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMKaW5kZXggNGI3OTkzYi4uYWU5N2I4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMKKysrIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMKQEAgLTYsOCArNiwxMSBAQAogICoJCSBHZXJhbGQgU2NoYWVmZXIgKGdlcmFsZC5zY2hhZWZlckBkZS5pYm0uY29tKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vZmFjaWxpdHkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9mdXRleC5oPgogI2luY2x1ZGUgInVhY2Nlc3MuaCIKQEAgLTI2LDcgKzI5LDEwIEBACiAjZGVmaW5lIFNMUgkic2xnciIKICNlbmRpZgogCi1zdGF0aWMgc2l6ZV90IGNvcHlfZnJvbV91c2VyX212Y29zKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQorc3RhdGljIHN0cnVjdCBzdGF0aWNfa2V5IGhhdmVfbXZjb3MgPSBTVEFUSUNfS0VZX0lOSVRfVFJVRTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfZnJvbV91c2VyX212Y29zKHZvaWQgKngsIGNvbnN0IHZvaWQgX191c2VyICpwdHIsCisJCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDB4ODFVTDsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CkBAIC02NSw3ICs3MSwxNiBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgc2l6ZV90IGNvcHlfdG9fdXNlcl9tdmNvcyhzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgY29uc3Qgdm9pZCAqeCkKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAoc3RhdGljX2tleV90cnVlKCZoYXZlX212Y29zKSkKKwkJcmV0dXJuIGNvcHlfZnJvbV91c2VyX212Y29zKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXJfcHQodG8sIGZyb20sIG4pOworfQorRVhQT1JUX1NZTUJPTChfX2NvcHlfZnJvbV91c2VyKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcl9tdmNvcyh2b2lkIF9fdXNlciAqcHRyLCBjb25zdCB2b2lkICp4LAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDB4ODEwMDAwVUw7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwpAQCAtOTQsOCArMTA5LDE2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBzaXplX3QgY29weV9pbl91c2VyX212Y29zKHNpemVfdCBzaXplLCB2b2lkIF9fdXNlciAqdG8sCi0JCQkJIGNvbnN0IHZvaWQgX191c2VyICpmcm9tKQordW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAoc3RhdGljX2tleV90cnVlKCZoYXZlX212Y29zKSkKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcl9tdmNvcyh0bywgZnJvbSwgbik7CisJcmV0dXJuIGNvcHlfdG9fdXNlcl9wdCh0bywgZnJvbSwgbik7Cit9CitFWFBPUlRfU1lNQk9MKF9fY29weV90b191c2VyKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfaW5fdXNlcl9tdmNvcyh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDB4ODEwMDgxVUw7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwpAQCAtMTE3LDcgKzE0MCwxNSBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgc2l6ZV90IGNsZWFyX3VzZXJfbXZjb3Moc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICp0bykKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWlmIChzdGF0aWNfa2V5X3RydWUoJmhhdmVfbXZjb3MpKQorCQlyZXR1cm4gY29weV9pbl91c2VyX212Y29zKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gY29weV9pbl91c2VyX3B0KHRvLCBmcm9tLCBuKTsKK30KK0VYUE9SVF9TWU1CT0woX19jb3B5X2luX3VzZXIpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2xlYXJfdXNlcl9tdmNvcyh2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtKCIwIikgPSAweDgxMDAwMFVMOwogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKQEAgLTE0NSwxNyArMTc2LDI2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBzaXplX3Qgc3Rybmxlbl91c2VyX212Y29zKHNpemVfdCBjb3VudCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYykKK3Vuc2lnbmVkIGxvbmcgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXNpemVfdCBkb25lLCBsZW4sIG9mZnNldCwgbGVuX3N0cjsKKwlpZiAoc3RhdGljX2tleV90cnVlKCZoYXZlX212Y29zKSkKKwkJcmV0dXJuIGNsZWFyX3VzZXJfbXZjb3ModG8sIHNpemUpOworCXJldHVybiBjbGVhcl91c2VyX3B0KHRvLCBzaXplKTsKK30KK0VYUE9SVF9TWU1CT0woX19jbGVhcl91c2VyKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN0cm5sZW5fdXNlcl9tdmNvcyhjb25zdCBjaGFyIF9fdXNlciAqc3JjLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGRvbmUsIGxlbiwgb2Zmc2V0LCBsZW5fc3RyOwogCWNoYXIgYnVmWzI1Nl07CiAKIAlkb25lID0gMDsKIAlkbyB7Ci0JCW9mZnNldCA9IChzaXplX3Qpc3JjICYgflBBR0VfTUFTSzsKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc3JjICYgflBBR0VfTUFTSzsKIAkJbGVuID0gbWluKDI1NlVMLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCQlsZW4gPSBtaW4oY291bnQgLSBkb25lLCBsZW4pOwotCQlpZiAoY29weV9mcm9tX3VzZXJfbXZjb3MobGVuLCBzcmMsIGJ1ZikpCisJCWlmIChjb3B5X2Zyb21fdXNlcl9tdmNvcyhidWYsIHNyYywgbGVuKSkKIAkJCXJldHVybiAwOwogCQlsZW5fc3RyID0gc3RybmxlbihidWYsIGxlbik7CiAJCWRvbmUgKz0gbGVuX3N0cjsKQEAgLTE2NCwxOCArMjA0LDI2IEBACiAJcmV0dXJuIGRvbmUgKyAxOwogfQogCi1zdGF0aWMgc2l6ZV90IHN0cm5jcHlfZnJvbV91c2VyX212Y29zKHNpemVfdCBjb3VudCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywKLQkJCQkgICAgICBjaGFyICpkc3QpCit1bnNpZ25lZCBsb25nIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jc2l6ZV90IGRvbmUsIGxlbiwgb2Zmc2V0LCBsZW5fc3RyOworCWlmIChzdGF0aWNfa2V5X3RydWUoJmhhdmVfbXZjb3MpKQorCQlyZXR1cm4gc3Rybmxlbl91c2VyX212Y29zKHNyYywgY291bnQpOworCXJldHVybiBzdHJubGVuX3VzZXJfcHQoc3JjLCBjb3VudCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fc3Rybmxlbl91c2VyKTsKIAotCWlmICh1bmxpa2VseSghY291bnQpKQorc3RhdGljIGlubGluZSBsb25nIHN0cm5jcHlfZnJvbV91c2VyX212Y29zKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywKKwkJCQkJICAgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGRvbmUsIGxlbiwgb2Zmc2V0LCBsZW5fc3RyOworCisJaWYgKHVubGlrZWx5KGNvdW50IDw9IDApKQogCQlyZXR1cm4gMDsKIAlkb25lID0gMDsKIAlkbyB7Ci0JCW9mZnNldCA9IChzaXplX3Qpc3JjICYgflBBR0VfTUFTSzsKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc3JjICYgflBBR0VfTUFTSzsKIAkJbGVuID0gbWluKGNvdW50IC0gZG9uZSwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyX212Y29zKGxlbiwgc3JjLCBkc3QpKQorCQlpZiAoY29weV9mcm9tX3VzZXJfbXZjb3MoZHN0LCBzcmMsIGxlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJbGVuX3N0ciA9IHN0cm5sZW4oZHN0LCBsZW4pOwogCQlkb25lICs9IGxlbl9zdHI7CkBAIC0xODUsMTMgKzIzMywzMSBAQAogCXJldHVybiBkb25lOwogfQogCi1zdHJ1Y3QgdWFjY2Vzc19vcHMgdWFjY2Vzc19tdmNvcyA9IHsKLQkuY29weV9mcm9tX3VzZXIgPSBjb3B5X2Zyb21fdXNlcl9tdmNvcywKLQkuY29weV90b191c2VyID0gY29weV90b191c2VyX212Y29zLAotCS5jb3B5X2luX3VzZXIgPSBjb3B5X2luX3VzZXJfbXZjb3MsCi0JLmNsZWFyX3VzZXIgPSBjbGVhcl91c2VyX212Y29zLAotCS5zdHJubGVuX3VzZXIgPSBzdHJubGVuX3VzZXJfbXZjb3MsCi0JLnN0cm5jcHlfZnJvbV91c2VyID0gc3RybmNweV9mcm9tX3VzZXJfbXZjb3MsCi0JLmZ1dGV4X2F0b21pY19vcCA9IGZ1dGV4X2F0b21pY19vcF9wdCwKLQkuZnV0ZXhfYXRvbWljX2NtcHhjaGcgPSBmdXRleF9hdG9taWNfY21weGNoZ19wdCwKLX07Citsb25nIF9fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQoreworCWlmIChzdGF0aWNfa2V5X3RydWUoJmhhdmVfbXZjb3MpKQorCQlyZXR1cm4gc3RybmNweV9mcm9tX3VzZXJfbXZjb3MoZHN0LCBzcmMsIGNvdW50KTsKKwlyZXR1cm4gc3RybmNweV9mcm9tX3VzZXJfcHQoZHN0LCBzcmMsIGNvdW50KTsKK30KK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcik7CisKKy8qCisgKiBUaGUgdWFjY2VzcyBwYWdlIHRhYmUgd2FsayB2YXJpYW50IGNhbiBiZSBlbmZvcmNlZCB3aXRoIHRoZSAidWFjY2Vzc3B0IgorICoga2VybmVsIHBhcmFtZXRlci4gVGhpcyBpcyBtYWlubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqLworc3RhdGljIGludCBmb3JjZV91YWNjZXNzX3B0IF9faW5pdGRhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3VhY2Nlc3NfcHQoY2hhciAqX191bnVzZWQpCit7CisJZm9yY2VfdWFjY2Vzc19wdCA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgidWFjY2Vzc3B0IiwgcGFyc2VfdWFjY2Vzc19wdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHVhY2Nlc3NfaW5pdCh2b2lkKQoreworCWlmIChJU19FTkFCTEVEKENPTkZJR18zMkJJVCkgfHwgZm9yY2VfdWFjY2Vzc19wdCB8fCAhdGVzdF9mYWNpbGl0eSgyNykpCisJCXN0YXRpY19rZXlfc2xvd19kZWMoJmhhdmVfbXZjb3MpOworCXJldHVybiAwOworfQorZWFybHlfaW5pdGNhbGwodWFjY2Vzc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvdWFjY2Vzc19wdC5jIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKaW5kZXggNjFlYmNjOS4uOGQzOTc2MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKKysrIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgU0xSCSJzbGdyIgogI2VuZGlmCiAKLXN0YXRpYyBzaXplX3Qgc3Rybmxlbl9rZXJuZWwoc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3Rybmxlbl9rZXJuZWwoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtKCIwIikgPSAwVUw7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwpAQCAtNDIsOCArNDIsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNpemVfdCBjb3B5X2luX2tlcm5lbChzaXplX3QgY291bnQsIHZvaWQgX191c2VyICp0bywKLQkJCSAgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20pCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3B5X2luX2tlcm5lbCh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdG1wMTsKIApAQCAtMTQ2LDggKzE0Niw4IEBACiAKICNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAotc3RhdGljIF9fYWx3YXlzX2lubGluZSBzaXplX3QgX191c2VyX2NvcHlfcHQodW5zaWduZWQgbG9uZyB1YWRkciwgdm9pZCAqa3B0ciwKLQkJCQkJICAgICBzaXplX3QgbiwgaW50IHdyaXRlX3VzZXIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191c2VyX2NvcHlfcHQodW5zaWduZWQgbG9uZyB1YWRkciwgdm9pZCAqa3B0ciwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBuLCBpbnQgd3JpdGVfdXNlcikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBkb25lLCBzaXplLCBrYWRkcjsKQEAgLTE4OSw4ICsxODksNyBAQAogICogRG8gREFUIGZvciB1c2VyIGFkZHJlc3MgYnkgcGFnZSB0YWJsZSB3YWxrLCByZXR1cm4ga2VybmVsIGFkZHJlc3MuCiAgKiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGN1cnJlbnQtPm1tLT5wYWdlX3RhYmxlX2xvY2sgaGVsZC4KICAqLwotc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fZGF0X3VzZXJfYWRkcih1bnNpZ25lZCBsb25nIHVhZGRyLAotCQkJCQkJICAgICBpbnQgd3JpdGUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19kYXRfdXNlcl9hZGRyKHVuc2lnbmVkIGxvbmcgdWFkZHIsIGludCB3cml0ZSkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXVuc2lnbmVkIGxvbmcga2FkZHI7CkBAIC0yMTEsMjkgKzIxMCwyOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc2l6ZV90IGNvcHlfZnJvbV91c2VyX3B0KHNpemVfdCBuLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdm9pZCAqdG8pCit1bnNpZ25lZCBsb25nIGNvcHlfZnJvbV91c2VyX3B0KHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCXNpemVfdCByYzsKKwl1bnNpZ25lZCBsb25nIHJjOwogCiAJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpCi0JCXJldHVybiBjb3B5X2luX2tlcm5lbChuLCAodm9pZCBfX3VzZXIgKikgdG8sIGZyb20pOworCQlyZXR1cm4gY29weV9pbl9rZXJuZWwoKHZvaWQgX191c2VyICopIHRvLCBmcm9tLCBuKTsKIAlyYyA9IF9fdXNlcl9jb3B5X3B0KCh1bnNpZ25lZCBsb25nKSBmcm9tLCB0bywgbiwgMCk7CiAJaWYgKHVubGlrZWx5KHJjKSkKIAkJbWVtc2V0KHRvICsgbiAtIHJjLCAwLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc2l6ZV90IGNvcHlfdG9fdXNlcl9wdChzaXplX3Qgbiwgdm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tKQordW5zaWduZWQgbG9uZyBjb3B5X3RvX3VzZXJfcHQodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpCi0JCXJldHVybiBjb3B5X2luX2tlcm5lbChuLCB0bywgKHZvaWQgX191c2VyICopIGZyb20pOworCQlyZXR1cm4gY29weV9pbl9rZXJuZWwodG8sICh2b2lkIF9fdXNlciAqKSBmcm9tLCBuKTsKIAlyZXR1cm4gX191c2VyX2NvcHlfcHQoKHVuc2lnbmVkIGxvbmcpIHRvLCAodm9pZCAqKSBmcm9tLCBuLCAxKTsKIH0KIAotc3RhdGljIHNpemVfdCBjbGVhcl91c2VyX3B0KHNpemVfdCBuLCB2b2lkIF9fdXNlciAqdG8pCit1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXJfcHQodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJdm9pZCAqenBhZ2UgPSAodm9pZCAqKSBlbXB0eV96ZXJvX3BhZ2U7Ci0JbG9uZyBkb25lLCBzaXplLCByZXQ7CisJdW5zaWduZWQgbG9uZyBkb25lLCBzaXplLCByZXQ7CiAKIAlkb25lID0gMDsKIAlkbyB7CkBAIC0yNDIsNyArMjQxLDcgQEAKIAkJZWxzZQogCQkJc2l6ZSA9IG4gLSBkb25lOwogCQlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKLQkJCXJldCA9IGNvcHlfaW5fa2VybmVsKG4sIHRvLCAodm9pZCBfX3VzZXIgKikgenBhZ2UpOworCQkJcmV0ID0gY29weV9pbl9rZXJuZWwodG8sICh2b2lkIF9fdXNlciAqKSB6cGFnZSwgbik7CiAJCWVsc2UKIAkJCXJldCA9IF9fdXNlcl9jb3B5X3B0KCh1bnNpZ25lZCBsb25nKSB0bywgenBhZ2UsIHNpemUsIDEpOwogCQlkb25lICs9IHNpemU7CkBAIC0yNTMsMTcgKzI1MiwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc2l6ZV90IHN0cm5sZW5fdXNlcl9wdChzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgX191c2VyICpzcmMpCit1bnNpZ25lZCBsb25nIHN0cm5sZW5fdXNlcl9wdChjb25zdCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdWFkZHIgPSAodW5zaWduZWQgbG9uZykgc3JjOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGRvbmUsIGxlbiwga2FkZHI7Ci0Jc2l6ZV90IGxlbl9zdHI7CisJdW5zaWduZWQgbG9uZyBsZW5fc3RyOwogCiAJaWYgKHVubGlrZWx5KCFjb3VudCkpCiAJCXJldHVybiAwOwogCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQotCQlyZXR1cm4gc3Rybmxlbl9rZXJuZWwoY291bnQsIHNyYyk7CisJCXJldHVybiBzdHJubGVuX2tlcm5lbChzcmMsIGNvdW50KTsKIAlpZiAoIW1tKQogCQlyZXR1cm4gMDsKIAlkb25lID0gMDsKQEAgLTI4OSwxOSArMjg4LDE4IEBACiAJZ290byByZXRyeTsKIH0KIAotc3RhdGljIHNpemVfdCBzdHJuY3B5X2Zyb21fdXNlcl9wdChzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsCi0JCQkJICAgY2hhciAqZHN0KQorbG9uZyBzdHJuY3B5X2Zyb21fdXNlcl9wdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCiB7Ci0Jc2l6ZV90IGRvbmUsIGxlbiwgb2Zmc2V0LCBsZW5fc3RyOworCXVuc2lnbmVkIGxvbmcgZG9uZSwgbGVuLCBvZmZzZXQsIGxlbl9zdHI7CiAKLQlpZiAodW5saWtlbHkoIWNvdW50KSkKKwlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybiAwOwogCWRvbmUgPSAwOwogCWRvIHsKLQkJb2Zmc2V0ID0gKHNpemVfdClzcmMgJiB+UEFHRV9NQVNLOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylzcmMgJiB+UEFHRV9NQVNLOwogCQlsZW4gPSBtaW4oY291bnQgLSBkb25lLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCQlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgewotCQkJaWYgKGNvcHlfaW5fa2VybmVsKGxlbiwgKHZvaWQgX191c2VyICopIGRzdCwgc3JjKSkKKwkJCWlmIChjb3B5X2luX2tlcm5lbCgodm9pZCBfX3VzZXIgKikgZHN0LCBzcmMsIGxlbikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0gZWxzZSB7CiAJCQlpZiAoX191c2VyX2NvcHlfcHQoKHVuc2lnbmVkIGxvbmcpIHNyYywgZHN0LCBsZW4sIDApKQpAQCAtMzE1LDggKzMxMyw4IEBACiAJcmV0dXJuIGRvbmU7CiB9CiAKLXN0YXRpYyBzaXplX3QgY29weV9pbl91c2VyX3B0KHNpemVfdCBuLCB2b2lkIF9fdXNlciAqdG8sCi0JCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSkKK3Vuc2lnbmVkIGxvbmcgY29weV9pbl91c2VyX3B0KHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG4pCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldF9tYXgsIHVhZGRyLCBkb25lLCBzaXplLCBlcnJvcl9jb2RlOwpAQCAtMzI2LDcgKzMyNCw3IEBACiAJaW50IHdyaXRlX3VzZXI7CiAKIAlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKLQkJcmV0dXJuIGNvcHlfaW5fa2VybmVsKG4sIHRvLCBmcm9tKTsKKwkJcmV0dXJuIGNvcHlfaW5fa2VybmVsKHRvLCBmcm9tLCBuKTsKIAlpZiAoIW1tKQogCQlyZXR1cm4gbjsKIAlkb25lID0gMDsKQEAgLTQxMSw3ICs0MDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBmdXRleF9hdG9taWNfb3BfcHQoaW50IG9wLCB1MzIgX191c2VyICp1YWRkciwgaW50IG9wYXJnLCBpbnQgKm9sZCkKK2ludCBfX2Z1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IG9wLCB1MzIgX191c2VyICp1YWRkciwgaW50IG9wYXJnLCBpbnQgKm9sZCkKIHsKIAlpbnQgcmV0OwogCkBAIC00NDksOCArNDQ3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZnV0ZXhfYXRvbWljX2NtcHhjaGdfcHQodTMyICp1dmFsLCB1MzIgX191c2VyICp1YWRkciwKLQkJCSAgICB1MzIgb2xkdmFsLCB1MzIgbmV3dmFsKQoraW50IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHUzMiAqdXZhbCwgdTMyIF9fdXNlciAqdWFkZHIsCisJCQkJICB1MzIgb2xkdmFsLCB1MzIgbmV3dmFsKQogewogCWludCByZXQ7CiAKQEAgLTQ3MSwxNCArNDY5LDMgQEAKIAlwdXRfcGFnZSh2aXJ0X3RvX3BhZ2UodWFkZHIpKTsKIAlyZXR1cm4gcmV0OwogfQotCi1zdHJ1Y3QgdWFjY2Vzc19vcHMgdWFjY2Vzc19wdCA9IHsKLQkuY29weV9mcm9tX3VzZXIJCT0gY29weV9mcm9tX3VzZXJfcHQsCi0JLmNvcHlfdG9fdXNlcgkJPSBjb3B5X3RvX3VzZXJfcHQsCi0JLmNvcHlfaW5fdXNlcgkJPSBjb3B5X2luX3VzZXJfcHQsCi0JLmNsZWFyX3VzZXIJCT0gY2xlYXJfdXNlcl9wdCwKLQkuc3Rybmxlbl91c2VyCQk9IHN0cm5sZW5fdXNlcl9wdCwKLQkuc3RybmNweV9mcm9tX3VzZXIJPSBzdHJuY3B5X2Zyb21fdXNlcl9wdCwKLQkuZnV0ZXhfYXRvbWljX29wCT0gZnV0ZXhfYXRvbWljX29wX3B0LAotCS5mdXRleF9hdG9taWNfY21weGNoZwk9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX3B0LAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMgYi9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCmluZGV4IGQxZTBlMGMuLjJhMmUzNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKKysrIGIvYXJjaC9zMzkwL21tL21hY2Nlc3MuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAvKgogICogQ29weSBtZW1vcnkgZnJvbSBrZXJuZWwgKHJlYWwpIHRvIHVzZXIgKHZpcnR1YWwpCiAgKi8KLWludCBjb3B5X3RvX3VzZXJfcmVhbCh2b2lkIF9fdXNlciAqZGVzdCwgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpCitpbnQgY29weV90b191c2VyX3JlYWwodm9pZCBfX3VzZXIgKmRlc3QsIHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlpbnQgb2ZmcyA9IDAsIHNpemUsIHJjOwogCWNoYXIgKmJ1ZjsKQEAgLTE1MiwzMiArMTUyLDYgQEAKIH0KIAogLyoKLSAqIENvcHkgbWVtb3J5IGZyb20gdXNlciAodmlydHVhbCkgdG8ga2VybmVsIChyZWFsKQotICovCi1pbnQgY29weV9mcm9tX3VzZXJfcmVhbCh2b2lkICpkZXN0LCB2b2lkIF9fdXNlciAqc3JjLCBzaXplX3QgY291bnQpCi17Ci0JaW50IG9mZnMgPSAwLCBzaXplLCByYzsKLQljaGFyICpidWY7Ci0KLQlidWYgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXJjID0gLUVGQVVMVDsKLQl3aGlsZSAob2ZmcyA8IGNvdW50KSB7Ci0JCXNpemUgPSBtaW4oUEFHRV9TSVpFLCBjb3VudCAtIG9mZnMpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBzcmMgKyBvZmZzLCBzaXplKSkKLQkJCWdvdG8gb3V0OwotCQlpZiAobWVtY3B5X3JlYWwoZGVzdCArIG9mZnMsIGJ1Ziwgc2l6ZSkpCi0JCQlnb3RvIG91dDsKLQkJb2ZmcyArPSBzaXplOwotCX0KLQlyYyA9IDA7Ci1vdXQ6Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOwotCXJldHVybiByYzsKLX0KLQotLyoKICAqIENoZWNrIGlmIHBoeXNpY2FsIGFkZHJlc3MgaXMgd2l0aGluIHByZWZpeCBvciB6ZXJvIHBhZ2UKICAqLwogc3RhdGljIGludCBpc19zd2FwcGVkKHVuc2lnbmVkIGxvbmcgYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IDM1ODRlZDkuLjc5NmM5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3F1aWNrbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KQEAgLTU5NCw2ICs1OTUsODIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdtYXBfZmF1bHQpOwogCitzdGF0aWMgdm9pZCBnbWFwX3phcF9zd2FwX2VudHJ5KHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlpZiAoIW5vbl9zd2FwX2VudHJ5KGVudHJ5KSkKKwkJZGVjX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTsKKwllbHNlIGlmIChpc19taWdyYXRpb25fZW50cnkoZW50cnkpKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gbWlncmF0aW9uX2VudHJ5X3RvX3BhZ2UoZW50cnkpOworCisJCWlmIChQYWdlQW5vbihwYWdlKSkKKwkJCWRlY19tbV9jb3VudGVyKG1tLCBNTV9BTk9OUEFHRVMpOworCQllbHNlCisJCQlkZWNfbW1fY291bnRlcihtbSwgTU1fRklMRVBBR0VTKTsKKwl9CisJZnJlZV9zd2FwX2FuZF9jYWNoZShlbnRyeSk7Cit9CisKKy8qKgorICogVGhlIG1tLT5tbWFwX3NlbSBsb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgdm9pZCBnbWFwX3phcF91bnVzZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBsb25nIHB0ZXYsIHBnc3RldjsKKwlzcGlubG9ja190ICpwdGw7CisJcGdzdGVfdCBwZ3N0ZTsKKwlwdGVfdCAqcHRlcCwgcHRlOworCisJcHRlcCA9IGdldF9sb2NrZWRfcHRlKG1tLCBhZGRyZXNzLCAmcHRsKTsKKwlpZiAodW5saWtlbHkoIXB0ZXApKQorCQlyZXR1cm47CisJcHRlID0gKnB0ZXA7CisJaWYgKCFwdGVfc3dhcChwdGUpKQorCQlnb3RvIG91dF9wdGU7CisJLyogWmFwIHVudXNlZCBhbmQgbG9naWNhbGx5LXplcm8gcGFnZXMgKi8KKwlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOworCXBnc3RldiA9IHBnc3RlX3ZhbChwZ3N0ZSk7CisJcHRldiA9IHB0ZV92YWwocHRlKTsKKwlpZiAoKChwZ3N0ZXYgJiBfUEdTVEVfR1BTX1VTQUdFX01BU0spID09IF9QR1NURV9HUFNfVVNBR0VfVU5VU0VEKSB8fAorCSAgICAoKHBnc3RldiAmIF9QR1NURV9HUFNfWkVSTykgJiYgKHB0ZXYgJiBfUEFHRV9JTlZBTElEKSkpIHsKKwkJZ21hcF96YXBfc3dhcF9lbnRyeShwdGVfdG9fc3dwX2VudHJ5KHB0ZSksIG1tKTsKKwkJcHRlX2NsZWFyKG1tLCBhZGRyZXNzLCBwdGVwKTsKKwl9CisJcGdzdGVfc2V0X3VubG9jayhwdGVwLCBwZ3N0ZSk7CitvdXRfcHRlOgorCXB0ZV91bm1hcF91bmxvY2soKnB0ZXAsIHB0bCk7Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIHdpdGggbW1hcF9zZW0gaGVsZAorICovCit2b2lkIF9fZ21hcF96YXAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqZ21hcCkKK3sKKwl1bnNpZ25lZCBsb25nICp0YWJsZSwgKnNlZ21lbnRfcHRyOworCXVuc2lnbmVkIGxvbmcgc2VnbWVudCwgcGdzdGV2LCBwdGV2OworCXN0cnVjdCBnbWFwX3BndGFibGUgKm1wOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJc2VnbWVudF9wdHIgPSBnbWFwX3RhYmxlX3dhbGsoYWRkcmVzcywgZ21hcCk7CisJaWYgKElTX0VSUihzZWdtZW50X3B0cikpCisJCXJldHVybjsKKwlzZWdtZW50ID0gKnNlZ21lbnRfcHRyOworCWlmIChzZWdtZW50ICYgX1NFR01FTlRfRU5UUllfSU5WQUxJRCkKKwkJcmV0dXJuOworCXBhZ2UgPSBwZm5fdG9fcGFnZShzZWdtZW50ID4+IFBBR0VfU0hJRlQpOworCW1wID0gKHN0cnVjdCBnbWFwX3BndGFibGUgKikgcGFnZS0+aW5kZXg7CisJYWRkcmVzcyA9IG1wLT52bWFkZHIgfCAoYWRkcmVzcyAmIH5QTURfTUFTSyk7CisJLyogUGFnZSB0YWJsZSBpcyBwcmVzZW50ICovCisJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKShzZWdtZW50ICYgX1NFR01FTlRfRU5UUllfT1JJR0lOKTsKKwl0YWJsZSA9IHRhYmxlICsgKChhZGRyZXNzID4+IDEyKSAmIDB4ZmYpOworCXBnc3RldiA9IHRhYmxlW1BUUlNfUEVSX1BURV07CisJcHRldiA9IHRhYmxlWzBdOworCS8qIHF1aWNrIGNoZWNrLCBjaGVja2VkIGFnYWluIHdpdGggbG9ja3MgaGVsZCAqLworCWlmICgoKHBnc3RldiAmIF9QR1NURV9HUFNfVVNBR0VfTUFTSykgPT0gX1BHU1RFX0dQU19VU0FHRV9VTlVTRUQpIHx8CisJICAgICgocGdzdGV2ICYgX1BHU1RFX0dQU19aRVJPKSAmJiAocHRldiAmIF9QQUdFX0lOVkFMSUQpKSkKKwkJZ21hcF96YXBfdW51c2VkKGdtYXAtPm1tLCBhZGRyZXNzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZ21hcF96YXApOworCiB2b2lkIGdtYXBfZGlzY2FyZCh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgdG8sIHN0cnVjdCBnbWFwICpnbWFwKQogewogCkBAIC02NzEsNyArNzQ4LDcgQEAKIC8qKgogICogZ21hcF9pcHRlX25vdGlmeSAtIG1hcmsgYSByYW5nZSBvZiBwdGVzIGZvciBpbnZhbGlkYXRpb24gbm90aWZpY2F0aW9uCiAgKiBAZ21hcDogcG9pbnRlciB0byBndWVzdCBtYXBwaW5nIG1ldGEgZGF0YSBzdHJ1Y3R1cmUKLSAqIEBhZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2UKKyAqIEBzdGFydDogdmlydHVhbCBhZGRyZXNzIGluIHRoZSBndWVzdCBhZGRyZXNzIHNwYWNlCiAgKiBAbGVuOiBzaXplIG9mIGFyZWEKICAqCiAgKiBSZXR1cm5zIDAgaWYgZm9yIGVhY2ggcGFnZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYSBnbWFwIG1hcHBpbmcgZXhpc3RzIGFuZApAQCAtNzI1LDEzICs4MDIsMTIgQEAKIC8qKgogICogZ21hcF9kb19pcHRlX25vdGlmeSAtIGNhbGwgYWxsIGludmFsaWRhdGlvbiBjYWxsYmFja3MgZm9yIGEgc3BlY2lmaWMgcHRlLgogICogQG1tOiBwb2ludGVyIHRvIHRoZSBwcm9jZXNzIG1tX3N0cnVjdAotICogQGFkZHI6IHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlCiAgKiBAcHRlOiBwb2ludGVyIHRvIHRoZSBwYWdlIHRhYmxlIGVudHJ5CiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBwYWdlIHRhYmxlIGxvY2sgaGVsZAogICogZm9yIHRoZSBwdGUgdG8gbm90aWZ5LgogICovCi12b2lkIGdtYXBfZG9faXB0ZV9ub3RpZnkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZSkKK3ZvaWQgZ21hcF9kb19pcHRlX25vdGlmeShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHRlX3QgKnB0ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHNlZ21lbnRfb2Zmc2V0OwogCXN0cnVjdCBnbWFwX25vdGlmaWVyICpuYjsKQEAgLTgwMiw2ICs4NzgsNzggQEAKIAlfX2ZyZWVfcGFnZShwYWdlKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhZ2VfdGFibGVfcmVzZXRfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJcG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlwdGVfdCAqc3RhcnRfcHRlLCAqcHRlOworCXNwaW5sb2NrX3QgKnB0bDsKKwlwZ3N0ZV90IHBnc3RlOworCisJc3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKKwlwdGUgPSBzdGFydF9wdGU7CisJZG8geworCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZSk7CisJCXBnc3RlX3ZhbChwZ3N0ZSkgJj0gfl9QR1NURV9HUFNfVVNBR0VfTUFTSzsKKwkJcGdzdGVfc2V0X3VubG9jayhwdGUsIHBnc3RlKTsKKwl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKKwlwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRsKTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGFnZV90YWJsZV9yZXNldF9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQlwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKwlwbWRfdCAqcG1kOworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCWRvIHsKKwkJbmV4dCA9IHBtZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpCisJCQljb250aW51ZTsKKwkJbmV4dCA9IHBhZ2VfdGFibGVfcmVzZXRfcHRlKG1tLCBwbWQsIGFkZHIsIG5leHQpOworCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX3RhYmxlX3Jlc2V0X3B1ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCXBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCXB1ZF90ICpwdWQ7CisKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJZG8geworCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKKwkJCWNvbnRpbnVlOworCQluZXh0ID0gcGFnZV90YWJsZV9yZXNldF9wbWQobW0sIHB1ZCwgYWRkciwgbmV4dCk7CisJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisKKwlyZXR1cm4gYWRkcjsKK30KKwordm9pZCBwYWdlX3RhYmxlX3Jlc2V0X3Bnc3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBuZXh0OworCXBnZF90ICpwZ2Q7CisKKwlhZGRyID0gc3RhcnQ7CisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOworCWRvIHsKKwkJbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCQlpZiAocGdkX25vbmVfb3JfY2xlYXJfYmFkKHBnZCkpCisJCQljb250aW51ZTsKKwkJbmV4dCA9IHBhZ2VfdGFibGVfcmVzZXRfcHVkKG1tLCBwZ2QsIGFkZHIsIG5leHQpOworCX0gd2hpbGUgKHBnZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cit9CitFWFBPUlRfU1lNQk9MKHBhZ2VfdGFibGVfcmVzZXRfcGdzdGUpOworCiBpbnQgc2V0X2d1ZXN0X3N0b3JhZ2Vfa2V5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgIHVuc2lnbmVkIGxvbmcga2V5LCBib29sIG5xKQogewpAQCAtMTI0OCw3ICsxMzk2LDcgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopIHBndGFibGU7CiAKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWFzc2VydF9zcGluX2xvY2tlZChwbWRfbG9ja3B0cihtbSwgcG1kcCkpOwogCiAJLyogRklGTyAqLwogCWlmICghcG1kX2h1Z2VfcHRlKG1tLCBwbWRwKSkKQEAgLTEyNjQsNyArMTQxMiw3IEBACiAJcGd0YWJsZV90IHBndGFibGU7CiAJcHRlX3QgKnB0ZXA7CiAKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWFzc2VydF9zcGluX2xvY2tlZChwbWRfbG9ja3B0cihtbSwgcG1kcCkpOwogCiAJLyogRklGTyAqLwogCXBndGFibGUgPSBwbWRfaHVnZV9wdGUobW0sIHBtZHApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL3BjaS9wY2kuYyBiL2FyY2gvczM5MC9wY2kvcGNpLmMKaW5kZXggNjY2NzBmZi4uMWRmMWQyOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL3BjaS9wY2kuYworKysgYi9hcmNoL3MzOTAvcGNpL3BjaS5jCkBAIC02ODYsMjcgKzY4NiwxMyBAQAogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG1hc2spCiB7CiAJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gZ2V0X3pkZXYocGRldik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdTE2IGNtZDsKLQlpbnQgaTsKIAogCXpkZXYtPnBkZXYgPSBwZGV2OwogCXpwY2lfZGVidWdfaW5pdF9kZXZpY2UoemRldik7CiAJenBjaV9mbWJfZW5hYmxlX2RldmljZSh6ZGV2KTsKIAl6cGNpX21hcF9yZXNvdXJjZXMoemRldik7CiAKLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JZm9yIChpID0gMDsgaSA8IFBDSV9CQVJfQ09VTlQ7IGkrKykgewotCQlyZXMgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0KLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKLQkJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JfQotCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMocGRldiwgbWFzayk7CiB9CiAKIHZvaWQgcGNpYmlvc19kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9wY2kvcGNpX2RlYnVnLmMgYi9hcmNoL3MzOTAvcGNpL3BjaV9kZWJ1Zy5jCmluZGV4IDc1YzY5YjQuLmM1YzY2ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9wY2kvcGNpX2RlYnVnLmMKKysrIGIvYXJjaC9zMzkwL3BjaS9wY2lfZGVidWcuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiBpbnQgX19pbml0IHpwY2lfZGVidWdfaW5pdCh2b2lkKQogewogCS8qIGV2ZW50IHRyYWNlIGJ1ZmZlciAqLwotCXBjaV9kZWJ1Z19tc2dfaWQgPSBkZWJ1Z19yZWdpc3RlcigicGNpX21zZyIsIDE2LCAxLCAxNiAqIHNpemVvZihsb25nKSk7CisJcGNpX2RlYnVnX21zZ19pZCA9IGRlYnVnX3JlZ2lzdGVyKCJwY2lfbXNnIiwgOCwgMSwgOCAqIHNpemVvZihsb25nKSk7CiAJaWYgKCFwY2lfZGVidWdfbXNnX2lkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3KHBjaV9kZWJ1Z19tc2dfaWQsICZkZWJ1Z19zcHJpbnRmX3ZpZXcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL3BjaS9wY2lfc3lzZnMuYyBiL2FyY2gvczM5MC9wY2kvcGNpX3N5c2ZzLmMKaW5kZXggY2Y4YTEyZi4uYWI0YTkxMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL3BjaS9wY2lfc3lzZnMuYworKysgYi9hcmNoL3MzOTAvcGNpL3BjaV9zeXNmcy5jCkBAIC00OCwyOSArNDgsMjcgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihwZmdpZCwgU19JUlVHTywgc2hvd19wZmdpZCwgTlVMTCk7CiAKLXN0YXRpYyB2b2lkIHJlY292ZXJfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVjb3ZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSBnZXRfemRldihwZGV2KTsKIAlpbnQgcmV0OwogCisJaWYgKCFkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihkZXYsIGF0dHIpKQorCQlyZXR1cm4gY291bnQ7CisKIAlwY2lfc3RvcF9hbmRfcmVtb3ZlX2J1c19kZXZpY2UocGRldik7CiAJcmV0ID0genBjaV9kaXNhYmxlX2RldmljZSh6ZGV2KTsKIAlpZiAocmV0KQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAlyZXQgPSB6cGNpX2VuYWJsZV9kZXZpY2UoemRldik7CiAJaWYgKHJldCkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmV0OwogCiAJcGNpX3Jlc2Nhbl9idXMoemRldi0+YnVzKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVjb3ZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCByZWNvdmVyX2NhbGxiYWNrKTsKLQlyZXR1cm4gcmMgPyByYyA6IGNvdW50OworCXJldHVybiBjb3VudDsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihyZWNvdmVyLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9yZWNvdmVyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAxNDZiOWQ1Li4yZjk0N2FiIDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwxMCArMSwxMiBAQAogCiBoZWFkZXIteSArPQogCisKIGdlbmVyaWMteSArPSBiYXJyaWVyLmgKIGdlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGhhc2guaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2VkOTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9TQ09SRV9DUFVUSU1FX0gKLSNkZWZpbmUgX0FTTV9TQ09SRV9DUFVUSU1FX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KLQotI2VuZGlmIC8qIF9BU01fU0NPUkVfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggNjM1NzcxMC4uMTM5OTM4MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMTIzLDE1ICsxMjMsNiBAQAogY29uZmlnIFNZU19TVVBQT1JUU19QQ0kKIAlib29sCiAKLWNvbmZpZyBTWVNfU1VQUE9SVFNfQ01UCi0JYm9vbAotCi1jb25maWcgU1lTX1NVUFBPUlRTX01UVTIKLQlib29sCi0KLWNvbmZpZyBTWVNfU1VQUE9SVFNfVE1VCi0JYm9vbAotCiBjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCiAJZGVmX2Jvb2wgeQogCkBAIC0xOTEsMTQgKzE4MiwxNCBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfVE1VCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIENQVV9TSDQKIAlib29sCiAJc2VsZWN0IENQVV9IQVNfSU5URVZUCiAJc2VsZWN0IENQVV9IQVNfU1JfUkIKIAlzZWxlY3QgQ1BVX0hBU19GUFUgaWYgIUNQVV9TSDRBTF9EU1AKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1RNVQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAJc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMgaWYgTU1VCiAKIGNvbmZpZyBDUFVfU0g0QQpAQCAtMjEzLDcgKzIwNCw3IEBACiBjb25maWcgQ1BVX1NINQogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19GUFUKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1RNVQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAJc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMgaWYgTU1VCiAKIGNvbmZpZyBDUFVfU0hYMgpAQCAtMjUwLDcgKzI0MSw3IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NjE5CiAJYm9vbCAiU3VwcG9ydCBTSDc2MTkgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiAjIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0CiAKQEAgLTI1OCw1MCArMjQ5LDUwIEBACiAJYm9vbCAiU3VwcG9ydCBTSDcyMDEgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzIwMwogCWJvb2wgIlN1cHBvcnQgU0g3MjAzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKIAlzZWxlY3QgQ1BVX0hBU19GUFUKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IFBJTkNUUkwKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzIwNgogCWJvb2wgIlN1cHBvcnQgU0g3MjA2IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyNjMKIAlib29sICJTdXBwb3J0IFNINzI2MyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjY0CiAJYm9vbCAiU3VwcG9ydCBTSDcyNjQgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAlzZWxlY3QgUElOQ1RSTAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjY5CiAJYm9vbCAiU3VwcG9ydCBTSDcyNjkgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAlzZWxlY3QgUElOQ1RSTAogCiBjb25maWcgQ1BVX1NVQlRZUEVfTVhHCiAJYm9vbCAiU3VwcG9ydCBNWC1HIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAloZWxwCiAJICBTZWxlY3QgTVgtRyBpZiBydW5uaW5nIG9uIGFuIFI4QTAzMDIyQkcgcGFydC4KIApAQCAtMzU0LDkgKzM0NSw4IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3MjAgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gzCiAJc2VsZWN0IENQVV9IQVNfRFNQCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAlzZWxlY3QgUElOQ1RSTAogCWhlbHAKQEAgLTM2Niw4ICszNTYsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g3NzIxIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMwogCXNlbGVjdCBDUFVfSEFTX0RTUAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzcyMSBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzIxIENQVS4KQEAgLTQyMiw3ICs0MTEsNyBAQAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBBUkNIX1NITU9CSUxFCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCWhlbHAKQEAgLTQzNCw3ICs0MjMsNyBAQAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBBUkNIX1NITU9CSUxFCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCWhlbHAKQEAgLTQ0NSw4ICs0MzQsNiBAQAogCXNlbGVjdCBDUFVfU0g0QQogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBQSU5DVFJMCiAJaGVscAogCSAgU2VsZWN0IFNINzczNCBpZiB5b3UgaGF2ZSBhIFNINEEgU0g3NzM0IENQVS4KQEAgLTQ1Niw4ICs0NDMsNiBAQAogCXNlbGVjdCBDUFVfU0g0QQogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBQSU5DVFJMCiAJaGVscAogCSAgU2VsZWN0IFNINzc1NyBpZiB5b3UgaGF2ZSBhIFNINEEgU0g3NzU3IENQVS4KQEAgLTQ2NSw3ICs0NTAsNiBAQAogY29uZmlnIENQVV9TVUJUWVBFX1NINzc2MwogCWJvb2wgIlN1cHBvcnQgU0g3NzYzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINEEKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzc2MyBpZiB5b3UgaGF2ZSBhIFNINEEgU0g3NzYzKFI1Uzc3NjMxKSBDUFUuCkBAIC00OTQsOSArNDc4LDcgQEAKIAlzZWxlY3QgQ1BVX0hBU19QVEVBRVgKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QgaWYgU01QCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IFVTQl9PSENJX1NIIGlmIFVTQl9PSENJX0hDRAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBVU0JfRUhDSV9TSCBpZiBVU0JfRUhDSV9IQ0QKIAlzZWxlY3QgUElOQ1RSTAogCkBAIC01MTQsNyArNDk2LDcgQEAKIAlib29sICJTdXBwb3J0IFNINzM0MyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDRBTF9EU1AKIAlzZWxlY3QgQVJDSF9TSE1PQklMRQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzcyMgogCWJvb2wgIlN1cHBvcnQgU0g3NzIyIHByb2Nlc3NvciIKQEAgLTUyMyw3ICs1MDUsNyBAQAogCXNlbGVjdCBBUkNIX1NITU9CSUxFCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTlVNQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCkBAIC01MzQsNyArNTE2LDcgQEAKIAlzZWxlY3QgQVJDSF9TSE1PQklMRQogCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX05VTUEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKIGVuZGNob2ljZQogCkBAIC01NjcsMjcgKzU0OSw2IEBACiAKIG1lbnUgIlRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uIgogCi1jb25maWcgU0hfVElNRVJfVE1VCi0JYm9vbCAiVE1VIHRpbWVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19UTVUKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIGJ1aWxkIG9mIHRoZSBUTVUgdGltZXIgZHJpdmVyLgotCi1jb25maWcgU0hfVElNRVJfQ01UCi0JYm9vbCAiQ01UIHRpbWVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19DTVQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgdGhlIENNVCB0aW1lciBkcml2ZXIuCi0KLWNvbmZpZyBTSF9USU1FUl9NVFUyCi0JYm9vbCAiTVRVMiB0aW1lciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTVRVMgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiB0aGUgTVRVMiB0aW1lciBkcml2ZXIuCi0KIGNvbmZpZyBTSF9QQ0xLX0ZSRVEKIAlpbnQgIlBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikiCiAJZGVwZW5kcyBvbiBTSF9DTEtfQ1BHX0xFR0FDWQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCmluZGV4IDViYzNhMTUuLjg1ZDUyNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKQEAgLTg2MSwxNCArODYxLDEyIEBACiAJLmNhcmQJCT0gIkZTSUItREE3MjEwIiwKIAkuY29kZWMJCT0gImRhNzIxMC4wLTAwMWEiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kuMCIsCi0JLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9JMlMsCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2liLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJkYTcyMTAtaGlmaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCmluZGV4IDIxZTQyMzAuLjExNjJiYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCkBAIC0zMDQsMTQgKzMwNCwxMiBAQAogCS5jYXJkCQk9ICJGU0lBLUFLNDY0MiIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpLjAiLAotCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KLAorCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkuY3B1X2RhaSA9IHsKIAkJLm5hbWUJPSAiZnNpYS1kYWkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyB8IFNORF9TT0NfREFJRk1UX0lCX05GLAogCX0sCiAJLmNvZGVjX2RhaSA9IHsKIAkJLm5hbWUJPSAiYWs0NjQyLWhpZmkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLnN5c2Nsawk9IDExMjg5NjAwLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggNjBlZDNlMS4uMWJjMDllZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0xODYsMTEgKzE4Niw2IEBACiAJcmV0dXJuIHN0YXJ0OwogfQogCi1pbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQotewotCXJldHVybiBwY2lfZW5hYmxlX3Jlc291cmNlcyhkZXYsIG1hc2spOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQKIHBjaWJpb3NfYnVzX3JlcG9ydF9zdGF0dXNfZWFybHkoc3RydWN0IHBjaV9jaGFubmVsICpob3NlLAogCQkJCWludCB0b3BfYnVzLCBpbnQgY3VycmVudF9idXMsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDBjZDcxOTguLmMxOWU0N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC04LDE4ICs4LDIxIEBACiBnZW5lcmljLXkgKz0gZXJybm8uaAogZ2VuZXJpYy15ICs9IGV4ZWMuaAogZ2VuZXJpYy15ICs9IGZjbnRsLmgKK2dlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBpb2N0bC5oCiBnZW5lcmljLXkgKz0gaXBjYnVmLmgKIGdlbmVyaWMteSArPSBpcnFfcmVncy5oCiBnZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKIGdlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IG1tYW4uaAorZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaAogZ2VuZXJpYy15ICs9IHBhcnBvcnQuaAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCi1nZW5lcmljLXkgKz0gbW1hbi5oCi1nZW5lcmljLXkgKz0gbXNnYnVmLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCkBAIC0zNCw1ICszNywzIEBACiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaWRsZS5jIGIvYXJjaC9zaC9rZXJuZWwvaWRsZS5jCmluZGV4IDJlYTQ0ODMuLmJlNjE2ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pZGxlLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgpAQCAtNDAsOCArMzksNyBAQAogCiB2b2lkIGFyY2hfY3B1X2lkbGUodm9pZCkKIHsKLQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKLQkJc2hfaWRsZSgpOworCXNoX2lkbGUoKTsKIH0KIAogdm9pZCBfX2luaXQgc2VsZWN0X2lkbGVfcm91dGluZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCAwODMzNzM2Li42NWExZWNkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMjE3LDE5ICsyMTcsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCByb3V0ZV9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgY3B1KQotewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGRhdGEpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiSVJRJXU6IG1vdmluZyBmcm9tIGNwdSV1IHRvIGNwdSV1XG4iLAotCSAgICAgICBpcnEsIGRhdGEtPm5vZGUsIGNwdSk7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7Ci0JY2hpcC0+aXJxX3NldF9hZmZpbml0eShkYXRhLCBjcHVtYXNrX29mKGNwdSksIGZhbHNlKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKLX0KLQogLyoKICAqIFRoZSBDUFUgaGFzIGJlZW4gbWFya2VkIG9mZmxpbmUuICBNaWdyYXRlIElSUXMgb2ZmIHRoaXMgQ1BVLiAgSWYKICAqIHRoZSBhZmZpbml0eSBzZXR0aW5ncyBkbyBub3QgYWxsb3cgb3RoZXIgQ1BVcywgZm9yY2UgdGhlbSBvbnRvIGFueQpAQCAtMjUwLDExICsyMzcsOCBAQAogCQkJCQkJICAgIGlycSwgY3B1KTsKIAogCQkJCWNwdW1hc2tfc2V0YWxsKGRhdGEtPmFmZmluaXR5KTsKLQkJCQluZXdjcHUgPSBjcHVtYXNrX2FueV9hbmQoZGF0YS0+YWZmaW5pdHksCi0JCQkJCQkJIGNwdV9vbmxpbmVfbWFzayk7CiAJCQl9Ci0KLQkJCXJvdXRlX2lycShkYXRhLCBpcnEsIG5ld2NwdSk7CisJCQlpcnFfc2V0X2FmZmluaXR5KGlycSwgZGF0YS0+YWZmaW5pdHkpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA0YjYwYTBjLi5hNDU4MjE4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtNiwxNSArNiwxNiBAQAogZ2VuZXJpYy15ICs9IGRpdjY0LmgKIGdlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCi1nZW5lcmljLXkgKz0gbGlua2FnZS5oCi1nZW5lcmljLXkgKz0gbG9jYWw2NC5oCi1nZW5lcmljLXkgKz0gbXV0ZXguaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKK2dlbmVyaWMteSArPSBsaW5rYWdlLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtb2R1bGUuaAorZ2VuZXJpYy15ICs9IG11dGV4LmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSBzZXJpYWwuaAogZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKIGdlbmVyaWMteSArPSB0eXBlcy5oCiBnZW5lcmljLXkgKz0gd29yZC1hdC1hLXRpbWUuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmgKaW5kZXggZGQzYmVmNC4uMDU3MTAzOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oCkBAIC0zMiw3ICszMiw2IEBACiAKIERFQ0xBUkVfUEVSX0NQVShjcHVtYXNrX3QsIGNwdV9zaWJsaW5nX21hcCk7CiBleHRlcm4gY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXTsKLWV4dGVybiBpbnQgc3BhcmM2NF9tdWx0aV9jb3JlOwogCiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90b3BvbG9neV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90b3BvbG9neV82NC5oCmluZGV4IDE3NTQzOTAuLmEyZDEwZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmgKQEAgLTQyLDggKzQyLDYgQEAKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9pZChjcHUpCQkJKGNwdV9kYXRhKGNwdSkuY29yZV9pZCkKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSkJCSgmY3B1X2NvcmVfbWFwW2NwdV0pCiAjZGVmaW5lIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkJCSgmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSkpCi0jZGVmaW5lIG1jX2NhcGFibGUoKQkJCQkoc3BhcmM2NF9tdWx0aV9jb3JlKQotI2RlZmluZSBzbXRfY2FwYWJsZSgpCQkJCShzcGFyYzY0X211bHRpX2NvcmUpCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiBleHRlcm4gY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jCmluZGV4IDg4YWFhYTUuLmUxNmM0MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpAQCAtOTksMTEgKzk5LDYgQEAKIAlyZXR1cm4gcmVzLT5zdGFydDsKIH0KIAotaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQogLyogaW4vb3V0IHJvdXRpbmVzIHRha2VuIGZyb20gcGNpYy5jCiAgKgogICogVGhpcyBwcm9iYWJseSBiZWxvbmdzIGhlcmUgcmF0aGVyIHRoYW4gaW9wb3J0LmMgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKaW5kZXggYjkwYmYyMy4uYTFhNDQwMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCkBAIC04OTYsMTAgKzg5Niw2IEBACiAKIAltZGVzY19pdGVyYXRlX292ZXJfY3B1cyhmaWxsX2luX29uZV9jcHUsIE5VTEwsIG1hc2spOwogCi0jaWZkZWYgQ09ORklHX1NNUAotCXNwYXJjNjRfbXVsdGlfY29yZSA9IDE7Ci0jZW5kaWYKLQogCWhwID0gbWRlc2NfZ3JhYigpOwogCiAJc2V0X2NvcmVfaWRzKGhwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCAzMmEyODBlLi5kN2I0OTY3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC01OCw5ICs1OCwxMiBAQAogewogCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKSB7CiAJCXRvdWNoX25taV93YXRjaGRvZygpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBwc3RhdGU7CiAKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCiAgICAgICAgICAgICAgICAgLyogVGhlIHN1bjR2IHNsZWVwaW5nIGNvZGUgcmVxdWlyZXMgdGhhdCB3ZSBoYXZlIFBTVEFURS5JRSBjbGVhcmVkIG92ZXIKICAgICAgICAgICAgICAgICAgKiB0aGUgY3B1IHNsZWVwIGh5cGVydmlzb3IgY2FsbC4KICAgICAgICAgICAgICAgICAgKi8KQEAgLTgyLDcgKzg1LDYgQEAKIAkJCTogIj0mciIgKHBzdGF0ZSkKIAkJCTogImkiIChQU1RBVEVfSUUpKTsKIAl9Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMKaW5kZXggNmIzOTEyNS4uOWE2OTBkMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYwpAQCAtNTU1LDkgKzU1NSw2IEBACiAKIAkJY3B1X2RhdGEoY3B1aWQpLmNvcmVfaWQgPSBwb3J0aWQgKyAxOwogCQljcHVfZGF0YShjcHVpZCkucHJvY19pZCA9IHBvcnRpZDsKLSNpZmRlZiBDT05GSUdfU01QCi0JCXNwYXJjNjRfbXVsdGlfY29yZSA9IDE7Ci0jZW5kaWYKIAl9IGVsc2UgewogCQljcHVfZGF0YShjcHVpZCkuZGNhY2hlX3NpemUgPQogCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZGNhY2hlLXNpemUiLCAxNiAqIDEwMjQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwppbmRleCBiMDg1MzExLi45NzgxMDQ4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtNTMsOCArNTMsNiBAQAogCiAjaW5jbHVkZSAiY3B1bWFwLmgiCiAKLWludCBzcGFyYzY0X211bHRpX2NvcmUgX19yZWFkX21vc3RseTsKLQogREVGSU5FX1BFUl9DUFUoY3B1bWFza190LCBjcHVfc2libGluZ19tYXApID0gQ1BVX01BU0tfTk9ORTsKIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9CiAJeyBbMCAuLi4gTlJfQ1BVUy0xXSA9IENQVV9NQVNLX05PTkUgfTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IDg3NzI5ZmYuLjMzYTE3ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMTg5LDcgKzE4OSw4IEBACiAJIG1vdgklaTAsICVsNQkJCQkhIElFVTEKIDU6CWNhbGwJJWw3CQkJCQkhIENUSQlHcm91cCBicmsgZm9yY2VkCiAJIHNybAklaTUsIDAsICVvNQkJCQkhIElFVTEKLQliYSxhLHB0CSV4Y2MsIDNmCisJYmEscHQJJXhjYywgM2YKKwkgc3JhCSVvMCwgMCwgJW8wCiAKIAkvKiBMaW51eCBuYXRpdmUgc3lzdGVtIGNhbGxzIGVudGVyIGhlcmUuLi4gKi8KIAkuYWxpZ24JMzIKQEAgLTIxNyw3ICsyMTgsNiBAQAogMzoJc3R4CSVvMCwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9JMF0KIHJldF9zeXNfY2FsbDoKIAlsZHgJWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UU1RBVEVdLCAlZzMKLQlzcmEJJW8wLCAwLCAlbzAKIAltb3YJJXVsbyhUU1RBVEVfWENBUlJZIHwgVFNUQVRFX0lDQVJSWSksICVnMgogCXNsbHgJJWcyLCAzMiwgJWcyCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwppbmRleCBiMzk3ZTA1Li4zZmRkZjY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCkBAIC03MzIsNyArNzMyLDcgQEAKIAlpcnFfZW50ZXIoKTsKIAogCWxvY2FsX2NwdV9kYXRhKCkuaXJxMF9pcnFzKys7Ci0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KDAsIGlycV90b19kZXNjKDApKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdSgwKTsKIAogCWlmICh1bmxpa2VseSghZXZ0LT5ldmVudF9oYW5kbGVyKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3RzYi5jIGIvYXJjaC9zcGFyYy9tbS90c2IuYwppbmRleCAzYjNhMzYwLi5mNWQ1MDZmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3RzYi5jCisrKyBiL2FyY2gvc3BhcmMvbW0vdHNiLmMKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHNiX2NhY2hlX25hbWVzKTsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDgxOTIgPDwgaTsKIAkJY29uc3QgY2hhciAqbmFtZSA9IHRzYl9jYWNoZV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMzc5M2M3NS4uMGFhNTY3NSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xMSw2ICsxMSw3IEBACiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gZmIuaAogZ2VuZXJpYy15ICs9IGZjbnRsLmgKK2dlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpb2N0bHMuaApAQCAtMTgsMTIgKzE5LDE0IEBACiBnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKIGdlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCiBnZW5lcmljLXkgKz0gbXV0ZXguaAogZ2VuZXJpYy15ICs9IHBhcmFtLmgKIGdlbmVyaWMteSArPSBwYXJwb3J0LmgKIGdlbmVyaWMteSArPSBwb2xsLmgKIGdlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZW1idWYuaApAQCAtMzgsNSArNDEsMyBAQAogZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKIGdlbmVyaWMteSArPSB0eXBlcy5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9rZXJuZWwvcGNpX2d4LmMgYi9hcmNoL3RpbGUva2VybmVsL3BjaV9neC5jCmluZGV4IGE5N2E2NDUuLjA3N2I3YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvcGNpX2d4LmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYwpAQCAtMTA2NSwxOCArMTA2NSw2IEBACiB9CiAKIC8qCi0gKiBFbmFibGUgbWVtb3J5IGFkZHJlc3MgZGVjb2RpbmcsIGFzIGFwcHJvcHJpYXRlLCBmb3IgdGhlCi0gKiBkZXZpY2UgZGVzY3JpYmVkIGJ5IHRoZSAnZGV2JyBzdHJ1Y3QuCi0gKgotICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZ2VuZXJpYyBQQ0kgbGF5ZXIsIGFuZCBjYW4gYmUgY2FsbGVkCi0gKiBmb3IgYnJpZGdlcyBvciBlbmRwb2ludHMuCi0gKi8KLWludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCi17Ci0JcmV0dXJuIHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzayk7Ci19Ci0KLS8qCiAgKiBDYWxsZWQgZm9yIGVhY2ggZGV2aWNlIGFmdGVyIFBDSSBzZXR1cCBpcyBkb25lLgogICogV2UgaW5pdGlhbGl6ZSB0aGUgUENJIGRldmljZSBjYXBhYmlsaXRpZXMgY29uc2VydmF0aXZlbHksIGFzc3VtaW5nIHRoYXQKICAqIGFsbCBkZXZpY2VzIGNhbiBvbmx5IGFkZHJlc3MgdGhlIDMyLWJpdCBETUEgc3BhY2UuIFRoZSBleGNlcHRpb24gaGVyZSBpcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA4OGEzMzBkLi5hNWU0YjYwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw4ICsxLDI4IEBACi1nZW5lcmljLXkgKz0gYnVnLmggY3B1dGltZS5oIGRldmljZS5oIGVtZXJnZW5jeS1yZXN0YXJ0LmggZnV0ZXguaCBoYXJkaXJxLmgKLWdlbmVyaWMteSArPSBod19pcnEuaCBpcnFfcmVncy5oIGtkZWJ1Zy5oIHBlcmNwdS5oIHNlY3Rpb25zLmggdG9wb2xvZ3kuaCB4b3IuaAotZ2VuZXJpYy15ICs9IGZ0cmFjZS5oIHBjaS5oIGlvLmggcGFyYW0uaCBkZWxheS5oIG11dGV4LmggY3VycmVudC5oIGV4ZWMuaAotZ2VuZXJpYy15ICs9IHN3aXRjaF90by5oIGNsa2Rldi5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGJhcnJpZXIuaAorZ2VuZXJpYy15ICs9IGJ1Zy5oCitnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKK2dlbmVyaWMteSArPSBjdXJyZW50LmgKK2dlbmVyaWMteSArPSBkZWxheS5oCitnZW5lcmljLXkgKz0gZGV2aWNlLmgKK2dlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCitnZW5lcmljLXkgKz0gZXhlYy5oCitnZW5lcmljLXkgKz0gZnRyYWNlLmgKK2dlbmVyaWMteSArPSBmdXRleC5oCitnZW5lcmljLXkgKz0gaGFyZGlycS5oCitnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0gaHdfaXJxLmgKK2dlbmVyaWMteSArPSBpby5oCitnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAorZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBtdXRleC5oCitnZW5lcmljLXkgKz0gcGFyYW0uaAorZ2VuZXJpYy15ICs9IHBjaS5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKK2dlbmVyaWMteSArPSBzZWN0aW9ucy5oCitnZW5lcmljLXkgKz0gc3dpdGNoX3RvLmgKK2dlbmVyaWMteSArPSB0b3BvbG9neS5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAorZ2VuZXJpYy15ICs9IHhvci5oCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggM2VmNGY5ZC4uMWU1ZmI4NyAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTYsNiArMTYsNyBAQAogZ2VuZXJpYy15ICs9IGZ0cmFjZS5oCiBnZW5lcmljLXkgKz0gZnV0ZXguaAogZ2VuZXJpYy15ICs9IGhhcmRpcnEuaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGh3X2lycS5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaAogZ2VuZXJpYy15ICs9IGlvY3Rscy5oCkBAIC0yNCw2ICsyNSw3IEBACiBnZW5lcmljLXkgKz0ga2RlYnVnLmgKIGdlbmVyaWMteSArPSBrbWFwX3R5cGVzLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtb2R1bGUuaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCkBAIC0zMiw2ICszNCw3IEBACiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKIGdlbmVyaWMteSArPSBwb2xsLmgKIGdlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZWN0aW9ucy5oCkBAIC02MCw1ICs2MywzIEBACiBnZW5lcmljLXkgKz0gdXNlci5oCiBnZW5lcmljLXkgKz0gdmdhLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggMGFmNTI1MC4uZjczMDcxNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC0xMDcsOSArMTA3LDkgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX1NPRlRfRElSVFkKIAlzZWxlY3QgQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwotCXNlbGVjdCBBUkNIX0NMT0NLU09VUkNFX0RBVEEgaWYgWDg2XzY0CisJc2VsZWN0IEFSQ0hfQ0xPQ0tTT1VSQ0VfREFUQQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCBpZiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBYODZfTE9DQUxfQVBJQykKLQlzZWxlY3QgR0VORVJJQ19USU1FX1ZTWVNDQUxMIGlmIFg4Nl82NAorCXNlbGVjdCBHRU5FUklDX1RJTUVfVlNZU0NBTEwKIAlzZWxlY3QgS1RJTUVfU0NBTEFSIGlmIFg4Nl8zMgogCXNlbGVjdCBHRU5FUklDX1NUUk5DUFlfRlJPTV9VU0VSCiAJc2VsZWN0IEdFTkVSSUNfU1RSTkxFTl9VU0VSCkBAIC0xMjcsNiArMTI3LDcgQEAKIAlzZWxlY3QgSEFWRV9ERUJVR19TVEFDS09WRVJGTE9XCiAJc2VsZWN0IEhBVkVfSVJRX0VYSVRfT05fSVJRX1NUQUNLIGlmIFg4Nl82NAogCXNlbGVjdCBIQVZFX0NDX1NUQUNLUFJPVEVDVE9SCisJc2VsZWN0IEdFTkVSSUNfQ1BVX0FVVE9QUk9CRQogCiBjb25maWcgSU5TVFJVQ1RJT05fREVDT0RFUgogCWRlZl9ib29sIHkKQEAgLTE5NSw5ICsxOTYsNiBAQAogY29uZmlnIEFSQ0hfSEFTX0NBQ0hFX0xJTkVfU0laRQogCWRlZl9ib29sIHkKIAotY29uZmlnIEFSQ0hfSEFTX0NQVV9BVVRPUFJPQkUKLQlkZWZfYm9vbCB5Ci0KIGNvbmZpZyBIQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQogCWRlZl9ib29sIHkKIApAQCAtMzQ2LDEyICszNDQsOSBAQAogCSAgZm9yIHRoZSBmb2xsb3dpbmcgKG5vbi1QQykgMzIgYml0IHg4NiBwbGF0Zm9ybXM6CiAJCUdvbGRmaXNoIChBbmRyb2lkIGVtdWxhdG9yKQogCQlBTUQgRWxhbgotCQlOVU1BUSAoSUJNL1NlcXVlbnQpCiAJCVJEQyBSLTMyMXggU29DCiAJCVNHSSAzMjAvNTQwIChWaXN1YWwgV29ya3N0YXRpb24pCiAJCVNUQTJYMTEtYmFzZWQgKGUuZy4gTm9ydGh2aWxsZSkKLQkJU3VtbWl0L0VYQSAoSUJNIHg0NDApCi0JCVVuaXN5cyBFUzcwMDAgSUEzMiBzZXJpZXMKIAkJTW9vcmVzdG93biBNSUQgZGV2aWNlcwogCiAJICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2Ugc3lzdGVtcywgb3IgaWYgeW91IHdhbnQgdG8gYnVpbGQgYQpAQCAtNDg5LDQ5ICs0ODQsMjIgQEAKIAlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBTTVAKIAlkZXBlbmRzIG9uIFg4Nl9FWFRFTkRFRF9QTEFURk9STQogCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGNvbXBpbGVzIGluIHRoZSBOVU1BUSwgU3VtbWl0LCBiaWdzbXAsIEVTNzAwMCwKLQkgIFNUQTJYMTEsIGRlZmF1bHQgc3ViYXJjaGl0ZWN0dXJlcy4gIEl0IGlzIGludGVuZGVkIGZvciBhIGdlbmVyaWMKLQkgIGJpbmFyeSBrZXJuZWwuIElmIHlvdSBzZWxlY3QgdGhlbSBhbGwsIGtlcm5lbCB3aWxsIHByb2JlIGl0Ci0JICBvbmUgYnkgb25lIGFuZCB3aWxsIGZhbGxiYWNrIHRvIGRlZmF1bHQuCisJICBUaGlzIG9wdGlvbiBjb21waWxlcyBpbiB0aGUgYmlnc21wIGFuZCBTVEEyWDExIGRlZmF1bHQKKwkgIHN1YmFyY2hpdGVjdHVyZXMuICBJdCBpcyBpbnRlbmRlZCBmb3IgYSBnZW5lcmljIGJpbmFyeQorCSAga2VybmVsLiBJZiB5b3Ugc2VsZWN0IHRoZW0gYWxsLCBrZXJuZWwgd2lsbCBwcm9iZSBpdCBvbmUgYnkKKwkgIG9uZSBhbmQgd2lsbCBmYWxsYmFjayB0byBkZWZhdWx0LgogCiAjIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBsaXN0IG9mIE5vbiBzdGFuZGFyZCAzMiBiaXQgcGxhdGZvcm1zCiAKLWNvbmZpZyBYODZfTlVNQVEKLQlib29sICJOVU1BUSAoSUJNL1NlcXVlbnQpIgotCWRlcGVuZHMgb24gWDg2XzMyX05PTl9TVEFOREFSRAotCWRlcGVuZHMgb24gUENJCi0Jc2VsZWN0IE5VTUEKLQlzZWxlY3QgWDg2X01QUEFSU0UKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBpcyB1c2VkIGZvciBnZXR0aW5nIExpbnV4IHRvIHJ1biBvbiBhIE5VTUFRIChJQk0vU2VxdWVudCkKLQkgIE5VTUEgbXVsdGlxdWFkIGJveC4gVGhpcyBjaGFuZ2VzIHRoZSB3YXkgdGhhdCBwcm9jZXNzb3JzIGFyZQotCSAgYm9vdHN0cmFwcGVkLCBhbmQgdXNlcyBDbHVzdGVyZWQgTG9naWNhbCBBUElDIGFkZHJlc3NpbmcgbW9kZSBpbnN0ZWFkCi0JICBvZiBGbGF0IExvZ2ljYWwuICBZb3Ugd2lsbCBuZWVkIGEgbmV3IGx5bnhlci5lbGYgZmlsZSB0byBmbGFzaCB5b3VyCi0JICBmaXJtd2FyZSB3aXRoIC0gc2VuZCBlbWFpbCB0byA8TWFydGluLkJsaWdoQHVzLmlibS5jb20+LgotCiBjb25maWcgWDg2X1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFCiAJZGVmX2Jvb2wgeQogCSMgTUNFIGNvZGUgY2FsbHMgbWVtb3J5X2ZhaWx1cmUoKToKIAlkZXBlbmRzIG9uIFg4Nl9NQ0UKIAkjIE9uIDMyLWJpdCB0aGlzIGFkZHMgdG9vIGJpZyBvZiBOT0RFU19TSElGVCBhbmQgd2UgcnVuIG91dCBvZiBwYWdlIGZsYWdzOgotCWRlcGVuZHMgb24gIVg4Nl9OVU1BUQogCSMgT24gMzItYml0IFNQQVJTRU1FTSBhZGRzIHRvbyBiaWcgb2YgU0VDVElPTlNfV0lEVEg6CiAJZGVwZW5kcyBvbiBYODZfNjQgfHwgIVNQQVJTRU1FTQogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFCiAKLWNvbmZpZyBYODZfVklTV1MKLQlib29sICJTR0kgMzIwLzU0MCAoVmlzdWFsIFdvcmtzdGF0aW9uKSIKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBQQ0kgJiYgWDg2X01QUEFSU0UgJiYgUENJX0dPRElSRUNUCi0JZGVwZW5kcyBvbiBYODZfMzJfTk9OX1NUQU5EQVJECi0JLS0taGVscC0tLQotCSAgVGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc2VyaWVzIGlzIGFuIElBMzItYmFzZWQgd29ya3N0YXRpb24KLQkgIGJhc2VkIG9uIFNHSSBzeXN0ZW1zIGNoaXBzIHdpdGggc29tZSBsZWdhY3kgUEMgaGFyZHdhcmUgYXR0YWNoZWQuCi0KLQkgIFNheSBZIGhlcmUgdG8gY3JlYXRlIGEga2VybmVsIHRvIHJ1biBvbiB0aGUgU0dJIDMyMCBvciA1NDAuCi0KLQkgIEEga2VybmVsIGNvbXBpbGVkIGZvciB0aGUgVmlzdWFsIFdvcmtzdGF0aW9uIHdpbGwgcnVuIG9uIGdlbmVyYWwKLQkgIFBDcyBhcyB3ZWxsLiBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zZ2ktdmlzd3MudHh0PiBmb3IgZGV0YWlscy4KLQogY29uZmlnIFNUQTJYMTEKIAlib29sICJTVEEyWDExIENvbXBhbmlvbiBDaGlwIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBYODZfMzJfTk9OX1NUQU5EQVJEICYmIFBDSQpAQCAtNTQ4LDIwICs1MTYsNiBAQAogCSAgb3B0aW9uIGlzIHNlbGVjdGVkIHRoZSBrZXJuZWwgd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGJvb3Qgb24KIAkgIHN0YW5kYXJkIFBDIG1hY2hpbmVzLgogCi1jb25maWcgWDg2X1NVTU1JVAotCWJvb2wgIlN1bW1pdC9FWEEgKElCTSB4NDQwKSIKLQlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBpcyBuZWVkZWQgZm9yIElCTSBzeXN0ZW1zIHRoYXQgdXNlIHRoZSBTdW1taXQvRVhBIGNoaXBzZXQuCi0JICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyBuZWVkZWQgZm9yIHRoZSB4NDQwLgotCi1jb25maWcgWDg2X0VTNzAwMAotCWJvb2wgIlVuaXN5cyBFUzcwMDAgSUEzMiBzZXJpZXMiCi0JZGVwZW5kcyBvbiBYODZfMzJfTk9OX1NUQU5EQVJEICYmIFg4Nl9CSUdTTVAKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGZvciBVbmlzeXMgRVM3MDAwIHN5c3RlbXMuICBTYXkgJ1knIGhlcmUgaWYgdGhpcyBrZXJuZWwgaXMKLQkgIHN1cHBvc2VkIHRvIHJ1biBvbiBhbiBJQTMyLWJhc2VkIFVuaXN5cyBFUzcwMDAgc3lzdGVtLgotCiBjb25maWcgWDg2XzMyX0lSSVMKIAl0cmlzdGF0ZSAiRXVyb2JyYWlsbGUvSXJpcyBwb3dlcm9mZiBtb2R1bGUiCiAJZGVwZW5kcyBvbiBYODZfMzIKQEAgLTY4NCwxNCArNjM4LDYgQEAKIAkgICAgICAgIG1lbXRlc3Q9NCwgbWVhbiBkbyA0IHRlc3QgcGF0dGVybnMuCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgogCi1jb25maWcgWDg2X1NVTU1JVF9OVU1BCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gWDg2XzMyICYmIE5VTUEgJiYgWDg2XzMyX05PTl9TVEFOREFSRAotCi1jb25maWcgWDg2X0NZQ0xPTkVfVElNRVIKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBYODZfU1VNTUlUCi0KIHNvdXJjZSAiYXJjaC94ODYvS2NvbmZpZy5jcHUiCiAKIGNvbmZpZyBIUEVUX1RJTUVSCkBAIC04MjAsNyArNzY2LDcgQEAKIAlyYW5nZSAyIDgxOTIgaWYgU01QICYmICFNQVhTTVAgJiYgQ1BVTUFTS19PRkZTVEFDSyAmJiBYODZfNjQKIAlkZWZhdWx0ICIxIiBpZiAhU01QCiAJZGVmYXVsdCAiODE5MiIgaWYgTUFYU01QCi0JZGVmYXVsdCAiMzIiIGlmIFNNUCAmJiAoWDg2X05VTUFRIHx8IFg4Nl9TVU1NSVQgfHwgWDg2X0JJR1NNUCB8fCBYODZfRVM3MDAwKQorCWRlZmF1bHQgIjMyIiBpZiBTTVAgJiYgWDg2X0JJR1NNUAogCWRlZmF1bHQgIjgiIGlmIFNNUAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKQEAgLTg4NCwxMCArODMwLDYgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBYODZfNjQgfHwgU01QIHx8IFg4Nl8zMl9OT05fU1RBTkRBUkQgfHwgWDg2X1VQX0lPQVBJQyB8fCBQQ0lfTVNJCiAKLWNvbmZpZyBYODZfVklTV1NfQVBJQwotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBYODZfVklTV1MKLQogY29uZmlnIFg4Nl9SRVJPVVRFX0ZPUl9CUk9LRU5fQk9PVF9JUlFTCiAJYm9vbCAiUmVyb3V0ZSBmb3IgYnJva2VuIGJvb3QgSVJRcyIKIAlkZXBlbmRzIG9uIFg4Nl9JT19BUElDCkBAIC0xMTA1LDEzICsxMDQ3LDExIEBACiAKIGNob2ljZQogCXByb21wdCAiSGlnaCBNZW1vcnkgU3VwcG9ydCIKLQlkZWZhdWx0IEhJR0hNRU02NEcgaWYgWDg2X05VTUFRCiAJZGVmYXVsdCBISUdITUVNNEcKIAlkZXBlbmRzIG9uIFg4Nl8zMgogCiBjb25maWcgTk9ISUdITUVNCiAJYm9vbCAib2ZmIgotCWRlcGVuZHMgb24gIVg4Nl9OVU1BUQogCS0tLWhlbHAtLS0KIAkgIExpbnV4IGNhbiB1c2UgdXAgdG8gNjQgR2lnYWJ5dGVzIG9mIHBoeXNpY2FsIG1lbW9yeSBvbiB4ODYgc3lzdGVtcy4KIAkgIEhvd2V2ZXIsIHRoZSBhZGRyZXNzIHNwYWNlIG9mIDMyLWJpdCB4ODYgcHJvY2Vzc29ycyBpcyBvbmx5IDQKQEAgLTExNDgsNyArMTA4OCw2IEBACiAKIGNvbmZpZyBISUdITUVNNEcKIAlib29sICI0R0IiCi0JZGVwZW5kcyBvbiAhWDg2X05VTUFRCiAJLS0taGVscC0tLQogCSAgU2VsZWN0IHRoaXMgaWYgeW91IGhhdmUgYSAzMi1iaXQgcHJvY2Vzc29yIGFuZCBiZXR3ZWVuIDEgYW5kIDQKIAkgIGdpZ2FieXRlcyBvZiBwaHlzaWNhbCBSQU0uCkBAIC0xMjQwLDggKzExNzksOCBAQAogY29uZmlnIE5VTUEKIAlib29sICJOdW1hIE1lbW9yeSBBbGxvY2F0aW9uIGFuZCBTY2hlZHVsZXIgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNNUAotCWRlcGVuZHMgb24gWDg2XzY0IHx8IChYODZfMzIgJiYgSElHSE1FTTY0RyAmJiAoWDg2X05VTUFRIHx8IFg4Nl9CSUdTTVAgfHwgWDg2X1NVTU1JVCAmJiBBQ1BJKSkKLQlkZWZhdWx0IHkgaWYgKFg4Nl9OVU1BUSB8fCBYODZfU1VNTUlUIHx8IFg4Nl9CSUdTTVApCisJZGVwZW5kcyBvbiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBISUdITUVNNjRHICYmIFg4Nl9CSUdTTVApCisJZGVmYXVsdCB5IGlmIFg4Nl9CSUdTTVAKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgTlVNQSAoTm9uIFVuaWZvcm0gTWVtb3J5IEFjY2Vzcykgc3VwcG9ydC4KIApAQCAtMTI1MiwxNSArMTE5MSwxMSBAQAogCSAgRm9yIDY0LWJpdCB0aGlzIGlzIHJlY29tbWVuZGVkIGlmIHRoZSBzeXN0ZW0gaXMgSW50ZWwgQ29yZSBpNwogCSAgKG9yIGxhdGVyKSwgQU1EIE9wdGVyb24sIG9yIEVNNjRUIE5VTUEuCiAKLQkgIEZvciAzMi1iaXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBvbiAocmFyZSkgMzItYml0LW9ubHkgcGxhdGZvcm1zCi0JICB0aGF0IHN1cHBvcnQgTlVNQSB0b3BvbG9naWVzLCBzdWNoIGFzIE5VTUFRIC8gU3VtbWl0LCBvciBpZiB5b3UKLQkgIGJvb3QgYSAzMi1iaXQga2VybmVsIG9uIGEgNjQtYml0IE5VTUEgcGxhdGZvcm0uCisJICBGb3IgMzItYml0IHRoaXMgaXMgb25seSBuZWVkZWQgaWYgeW91IGJvb3QgYSAzMi1iaXQKKwkgIGtlcm5lbCBvbiBhIDY0LWJpdCBOVU1BIHBsYXRmb3JtLgogCiAJICBPdGhlcndpc2UsIHlvdSBzaG91bGQgc2F5IE4uCiAKLWNvbW1lbnQgIk5VTUEgKFN1bW1pdCkgcmVxdWlyZXMgU01QLCA2NEdCIGhpZ2htZW0gc3VwcG9ydCwgQUNQSSIKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBYODZfU1VNTUlUICYmICghSElHSE1FTTY0RyB8fCAhQUNQSSkKLQogY29uZmlnIEFNRF9OVU1BCiAJZGVmX2Jvb2wgeQogCXByb21wdCAiT2xkIHN0eWxlIEFNRCBPcHRlcm9uIE5VTUEgZGV0ZWN0aW9uIgpAQCAtMTMwMiw3ICsxMjM3LDYgQEAKIAlyYW5nZSAxIDEwCiAJZGVmYXVsdCAiMTAiIGlmIE1BWFNNUAogCWRlZmF1bHQgIjYiIGlmIFg4Nl82NAotCWRlZmF1bHQgIjQiIGlmIFg4Nl9OVU1BUQogCWRlZmF1bHQgIjMiCiAJZGVwZW5kcyBvbiBORUVEX01VTFRJUExFX05PREVTCiAJLS0taGVscC0tLQpAQCAtMTU4NSw2ICsxNTE5LDIwIEBACiAKIAkgIFNlZSBEb2N1bWVudGF0aW9uL2VmaS1zdHViLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorY29uZmlnIEVGSV9NSVhFRAorCWJvb2wgIkVGSSBtaXhlZC1tb2RlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFRklfU1RVQiAmJiBYODZfNjQKKwktLS1oZWxwLS0tCisJICAgRW5hYmxpbmcgdGhpcyBmZWF0dXJlIGFsbG93cyBhIDY0LWJpdCBrZXJuZWwgdG8gYmUgYm9vdGVkCisJICAgb24gYSAzMi1iaXQgZmlybXdhcmUsIHByb3ZpZGVkIHRoYXQgeW91ciBDUFUgc3VwcG9ydHMgNjQtYml0CisJICAgbW9kZS4KKworCSAgIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gYm9vdCBhIG1peGVkLW1vZGUgZW5hYmxlZAorCSAgIGtlcm5lbCB2aWEgdGhlIEVGSSBib290IHN0dWIgLSBhIGJvb3Rsb2FkZXIgdGhhdCBzdXBwb3J0cworCSAgIHRoZSBFRkkgaGFuZG92ZXIgcHJvdG9jb2wgbXVzdCBiZSB1c2VkLgorCisJICAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNFQ0NPTVAKIAlkZWZfYm9vbCB5CiAJcHJvbXB0ICJFbmFibGUgc2VjY29tcCB0byBzYWZlbHkgY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUiCkBAIC0xODM2LDE3ICsxNzg0LDI5IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQ09NUEFUX1ZEU08KLQlkZWZfYm9vbCB5Ci0JcHJvbXB0ICJDb21wYXQgVkRTTyBzdXBwb3J0IgorCWRlZl9ib29sIG4KKwlwcm9tcHQgIkRpc2FibGUgdGhlIDMyLWJpdCB2RFNPIChuZWVkZWQgZm9yIGdsaWJjIDIuMy4zKSIKIAlkZXBlbmRzIG9uIFg4Nl8zMiB8fCBJQTMyX0VNVUxBVElPTgogCS0tLWhlbHAtLS0KLQkgIE1hcCB0aGUgMzItYml0IFZEU08gdG8gdGhlIHByZWRpY3RhYmxlIG9sZC1zdHlsZSBhZGRyZXNzIHRvby4KKwkgIENlcnRhaW4gYnVnZ3kgdmVyc2lvbnMgb2YgZ2xpYmMgd2lsbCBjcmFzaCBpZiB0aGV5IGFyZQorCSAgcHJlc2VudGVkIHdpdGggYSAzMi1iaXQgdkRTTyB0aGF0IGlzIG5vdCBtYXBwZWQgYXQgdGhlIGFkZHJlc3MKKwkgIGluZGljYXRlZCBpbiBpdHMgc2VnbWVudCB0YWJsZS4KIAotCSAgU2F5IE4gaGVyZSBpZiB5b3UgYXJlIHJ1bm5pbmcgYSBzdWZmaWNpZW50bHkgcmVjZW50IGdsaWJjCi0JICB2ZXJzaW9uICgyLjMuMyBvciBsYXRlciksIHRvIHJlbW92ZSB0aGUgaGlnaC1tYXBwZWQKLQkgIFZEU08gbWFwcGluZyBhbmQgdG8gZXhjbHVzaXZlbHkgdXNlIHRoZSByYW5kb21pemVkIFZEU08uCisJICBUaGUgYnVnIHdhcyBpbnRyb2R1Y2VkIGJ5IGY4NjYzMTRiODlkNTY4NDVmNTVlNmYzNjVlMThiMzFlYzk3OGVjM2EKKwkgIGFuZCBmaXhlZCBieSAzYjNkZGI0ZjdkYjk4ZWM5ZTkxMmNjZGY1NGQzNWRmNGFhMzBlMDRhIGFuZAorCSAgNDlhZDU3MmE3MGI4YWViOTFlNTc0ODNhMTFkZDFiNzdlMzFjNDQ2OC4gIEdsaWJjIDIuMy4zIGlzCisJICB0aGUgb25seSByZWxlYXNlZCB2ZXJzaW9uIHdpdGggdGhlIGJ1ZywgYnV0IE9wZW5TVVNFIDkKKwkgIGNvbnRhaW5zIGEgYnVnZ3kgImdsaWJjIDIuMy4yIi4KIAotCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwkgIFRoZSBzeW1wdG9tIG9mIHRoZSBidWcgaXMgdGhhdCBldmVyeXRoaW5nIGNyYXNoZXMgb24gc3RhcnR1cCwgc2F5aW5nOgorCSAgZGxfbWFpbjogQXNzZXJ0aW9uIGAodm9pZCAqKSBwaC0+cF92YWRkciA9PSBfcnRsZF9sb2NhbC5fZGxfc3lzaW5mb19kc28nIGZhaWxlZCEKKworCSAgU2F5aW5nIFkgaGVyZSBjaGFuZ2VzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB2ZHNvMzIgYm9vdAorCSAgb3B0aW9uIGZyb20gMSB0byAwLCB3aGljaCB0dXJucyBvZmYgdGhlIDMyLWJpdCB2RFNPIGVudGlyZWx5LgorCSAgVGhpcyB3b3JrcyBhcm91bmQgdGhlIGdsaWJjIGJ1ZyBidXQgaHVydHMgcGVyZm9ybWFuY2UuCisKKwkgIElmIHVuc3VyZSwgc2F5IE46IGlmIHlvdSBhcmUgY29tcGlsaW5nIHlvdXIgb3duIGtlcm5lbCwgeW91CisJICBhcmUgdW5saWtlbHkgdG8gYmUgdXNpbmcgYSBidWdneSB2ZXJzaW9uIG9mIGdsaWJjLgogCiBjb25maWcgQ01ETElORV9CT09MCiAJYm9vbCAiQnVpbHQtaW4ga2VybmVsIGNvbW1hbmQgbGluZSIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuY3B1IGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKaW5kZXggZjNhYWYyMy4uNjk4MzMxNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKQEAgLTM1OSw3ICszNTksNyBAQAogCiBjb25maWcgWDg2X1RTQwogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uICgoTVdJTkNISVAzRCB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs3IHx8IE1LNiB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1WSUFDNyB8fCBNR0VPREVHWDEgfHwgTUdFT0RFX0xYIHx8IE1DT1JFMiB8fCBNQVRPTSkgJiYgIVg4Nl9OVU1BUSkgfHwgWDg2XzY0CisJZGVwZW5kcyBvbiAoTVdJTkNISVAzRCB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs3IHx8IE1LNiB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1WSUFDNyB8fCBNR0VPREVHWDEgfHwgTUdFT0RFX0xYIHx8IE1DT1JFMiB8fCBNQVRPTSkgfHwgWDg2XzY0CiAKIGNvbmZpZyBYODZfQ01QWENIRzY0CiAJZGVmX2Jvb2wgeQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gveDg2L0tjb25maWcuZGVidWcKaW5kZXggMzIxYTUyYy4uNjFiZDJhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCkBAIC04MSw2ICs4MSwxNSBAQAogCSAga2VybmVsLgogCSAgSWYgaW4gZG91YnQsIHNheSAiTiIKIAorY29uZmlnIEVGSV9QR1RfRFVNUAorCWJvb2wgIkR1bXAgdGhlIEVGSSBwYWdldGFibGUiCisJZGVwZW5kcyBvbiBFRkkgJiYgWDg2X1BURFVNUAorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSB0aGlzIGlmIHlvdSB3YW50IHRvIGR1bXAgdGhlIEVGSSBwYWdlIHRhYmxlIGJlZm9yZQorCSAgZW5hYmxpbmcgdmlydHVhbCBtb2RlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlYnVnIG1pc2NlbGxhbmVvdXMKKwkgIGlzc3VlcyB3aXRoIHRoZSBtYXBwaW5nIG9mIHRoZSBFRkkgcnVudGltZSByZWdpb25zIGludG8gdGhhdAorCSAgdGFibGUuCisKIGNvbmZpZyBERUJVR19ST0RBVEEKIAlib29sICJXcml0ZSBwcm90ZWN0IGtlcm5lbCByZWFkLW9ubHkgZGF0YSBzdHJ1Y3R1cmVzIgogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvTWFrZWZpbGUgYi9hcmNoL3g4Ni9NYWtlZmlsZQppbmRleCBlZWRhNDNhLi4zYjkzNDhhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9NYWtlZmlsZQpAQCAtODIsOCArODIsOCBAQAogICAgICAgICBLQlVJTERfQUZMQUdTICs9IC1tNjQKICAgICAgICAgS0JVSUxEX0NGTEFHUyArPSAtbTY0CiAKLSAgICAgICAgIyBEb24ndCBhdXRvZ2VuZXJhdGUgTU1YIG9yIFNTRSBpbnN0cnVjdGlvbnMKLSAgICAgICAgS0JVSUxEX0NGTEFHUyArPSAtbW5vLW1teCAtbW5vLXNzZQorICAgICAgICAjIERvbid0IGF1dG9nZW5lcmF0ZSB0cmFkaXRpb25hbCB4ODcsIE1NWCBvciBTU0UgaW5zdHJ1Y3Rpb25zCisgICAgICAgIEtCVUlMRF9DRkxBR1MgKz0gLW1uby1tbXggLW1uby1zc2UgLW1uby04MDM4NyAtbW5vLWZwLXJldC1pbi0zODcKIAogCSMgVXNlIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTMgaWYgc3VwcG9ydGVkLgogCUtCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0zKQpAQCAtMTUyLDYgKzE1Miw3IEBACiAKICMgZG9lcyBiaW51dGlscyBzdXBwb3J0IHNwZWNpZmljIGluc3RydWN0aW9ucz8KIGFzaW5zdHIgOj0gJChjYWxsIGFzLWluc3RyLGZ4c2F2ZXEgKCVyYXgpLC1EQ09ORklHX0FTX0ZYU0FWRVE9MSkKK2FzaW5zdHIgKz0gJChjYWxsIGFzLWluc3RyLGNyYzMybCAlZWF4JChjb21tYSklZWF4LC1EQ09ORklHX0FTX0NSQzMyPTEpCiBhdnhfaW5zdHIgOj0gJChjYWxsIGFzLWluc3RyLHZ4b3JwcyAleW1tMCQoY29tbWEpJXltbTEkKGNvbW1hKSV5bW0yLC1EQ09ORklHX0FTX0FWWD0xKQogYXZ4Ml9pbnN0ciA6PSQoY2FsbCBhcy1pbnN0cix2cGJyb2FkY2FzdGIgJXhtbTAkKGNvbW1hKSV5bW0xLC1EQ09ORklHX0FTX0FWWDI9MSkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKaW5kZXggODc4ZGY3ZS4uYWJiOWViYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L01ha2VmaWxlCkBAIC04MCw3ICs4MCw3IEBACiAkKG9iaikvdm9mZnNldC5oOiB2bWxpbnV4IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsdm9mZnNldCkKIAotc2VkLXpvZmZzZXQgOj0gLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKHN0YXJ0dXBfMzJcfHN0YXJ0dXBfNjRcfGVmaV9wZV9lbnRyeVx8ZWZpX3N0dWJfZW50cnlcfGlucHV0X2RhdGFcfF9lbmRcfHpfLipcKSQkL1wjZGVmaW5lIFpPX1wyIDB4XDEvcCcKK3NlZC16b2Zmc2V0IDo9IC1lICdzL15cKFswLTlhLWZBLUZdKlwpIC4gXChzdGFydHVwXzMyXHxzdGFydHVwXzY0XHxlZmkzMl9zdHViX2VudHJ5XHxlZmk2NF9zdHViX2VudHJ5XHxlZmlfcGVfZW50cnlcfGlucHV0X2RhdGFcfF9lbmRcfHpfLipcKSQkL1wjZGVmaW5lIFpPX1wyIDB4XDEvcCcKIAogcXVpZXRfY21kX3pvZmZzZXQgPSBaT0ZGU0VUICRACiAgICAgICBjbWRfem9mZnNldCA9ICQoTk0pICQ8IHwgc2VkIC1uICQoc2VkLXpvZmZzZXQpID4gJEAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvYm9vdC5oIGIvYXJjaC94ODYvYm9vdC9ib290LmgKaW5kZXggNTBmOGM1ZS4uYmQ0OWVjNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9ib290LmgKKysrIGIvYXJjaC94ODYvYm9vdC9ib290LmgKQEAgLTE3NywxNCArMTc3LDYgQEAKIH0KIAogLyogTm90ZTogdGhlc2Ugb25seSByZXR1cm4gdHJ1ZS9mYWxzZSwgbm90IGEgc2lnbmVkIHJldHVybiB2YWx1ZSEgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCi17Ci0JdTggZGlmZjsKLQlhc20oInJlcGU7IGNtcHNiOyBzZXRueiAlMCIKLQkgICAgOiAiPXFtIiAoZGlmZiksICIrRCIgKHMxKSwgIitTIiAoczIpLCAiK2MiIChsZW4pKTsKLQlyZXR1cm4gZGlmZjsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgbWVtY21wX2ZzKGNvbnN0IHZvaWQgKnMxLCBhZGRyX3QgczIsIHNpemVfdCBsZW4pCiB7CiAJdTggZGlmZjsKQEAgLTIyOCwxMSArMjIwLDYgQEAKIHZvaWQgKmNvcHlfZnJvbV9mcyh2b2lkICpkc3QsIGFkZHJfdCBzcmMsIHNpemVfdCBsZW4pOwogdm9pZCBjb3B5X3RvX2dzKGFkZHJfdCBkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGxlbik7CiB2b2lkICpjb3B5X2Zyb21fZ3Modm9pZCAqZHN0LCBhZGRyX3Qgc3JjLCBzaXplX3QgbGVuKTsKLXZvaWQgKm1lbWNweSh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGxlbik7Ci12b2lkICptZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IGxlbik7Ci0KLSNkZWZpbmUgbWVtY3B5KGQscyxsKSBfX2J1aWx0aW5fbWVtY3B5KGQscyxsKQotI2RlZmluZSBtZW1zZXQoZCxjLGwpIF9fYnVpbHRpbl9tZW1zZXQoZCxjLGwpCiAKIC8qIGEyMC5jICovCiBpbnQgZW5hYmxlX2EyMCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5jIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmMKaW5kZXggYTc2NzdiYS4uMWU2MTQ2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmMKQEAgLTE5LDExICsxOSwyNzMgQEAKIAogc3RhdGljIGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlOwogCitzdGF0aWMgc3RydWN0IGVmaV9jb25maWcgKmVmaV9lYXJseTsKKworI2RlZmluZSBlZmlfY2FsbF9lYXJseShmLCAuLi4pCQkJCQkJXAorCWVmaV9lYXJseS0+Y2FsbChlZmlfZWFybHktPmYsIF9fVkFfQVJHU19fKTsKKworI2RlZmluZSBCT09UX1NFUlZJQ0VTKGJpdHMpCQkJCQkJXAorc3RhdGljIHZvaWQgc2V0dXBfYm9vdF9zZXJ2aWNlcyMjYml0cyhzdHJ1Y3QgZWZpX2NvbmZpZyAqYykJCVwKK3sJCQkJCQkJCQlcCisJZWZpX3N5c3RlbV90YWJsZV8jI2JpdHMjI190ICp0YWJsZTsJCQkJXAorCWVmaV9ib290X3NlcnZpY2VzXyMjYml0cyMjX3QgKmJ0OwkJCQlcCisJCQkJCQkJCQlcCisJdGFibGUgPSAodHlwZW9mKHRhYmxlKSlzeXNfdGFibGU7CQkJCVwKKwkJCQkJCQkJCVwKKwljLT50ZXh0X291dHB1dCA9IHRhYmxlLT5jb25fb3V0OwkJCQlcCisJCQkJCQkJCQlcCisJYnQgPSAodHlwZW9mKGJ0KSkodW5zaWduZWQgbG9uZykodGFibGUtPmJvb3R0aW1lKTsJCVwKKwkJCQkJCQkJCVwKKwljLT5hbGxvY2F0ZV9wb29sID0gYnQtPmFsbG9jYXRlX3Bvb2w7CQkJCVwKKwljLT5hbGxvY2F0ZV9wYWdlcyA9IGJ0LT5hbGxvY2F0ZV9wYWdlczsJCQkJXAorCWMtPmdldF9tZW1vcnlfbWFwID0gYnQtPmdldF9tZW1vcnlfbWFwOwkJCQlcCisJYy0+ZnJlZV9wb29sID0gYnQtPmZyZWVfcG9vbDsJCQkJCVwKKwljLT5mcmVlX3BhZ2VzID0gYnQtPmZyZWVfcGFnZXM7CQkJCQlcCisJYy0+bG9jYXRlX2hhbmRsZSA9IGJ0LT5sb2NhdGVfaGFuZGxlOwkJCQlcCisJYy0+aGFuZGxlX3Byb3RvY29sID0gYnQtPmhhbmRsZV9wcm90b2NvbDsJCQlcCisJYy0+ZXhpdF9ib290X3NlcnZpY2VzID0gYnQtPmV4aXRfYm9vdF9zZXJ2aWNlczsJCQlcCit9CitCT09UX1NFUlZJQ0VTKDMyKTsKK0JPT1RfU0VSVklDRVMoNjQpOworCitzdGF0aWMgdm9pZCBlZmlfcHJpbnRrKGVmaV9zeXN0ZW1fdGFibGVfdCAqLCBjaGFyICopOworc3RhdGljIHZvaWQgZWZpX2NoYXIxNl9wcmludGsoZWZpX3N5c3RlbV90YWJsZV90ICosIGVmaV9jaGFyMTZfdCAqKTsKKworc3RhdGljIGVmaV9zdGF0dXNfdAorX19maWxlX3NpemUzMih2b2lkICpfX2ZoLCBlZmlfY2hhcjE2X3QgKmZpbGVuYW1lXzE2LAorCSAgICAgIHZvaWQgKipoYW5kbGUsIHU2NCAqZmlsZV9zeikKK3sKKwllZmlfZmlsZV9oYW5kbGVfMzJfdCAqaCwgKmZoID0gX19maDsKKwllZmlfZmlsZV9pbmZvX3QgKmluZm87CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfZ3VpZF90IGluZm9fZ3VpZCA9IEVGSV9GSUxFX0lORk9fSUQ7CisJdTMyIGluZm9fc3o7CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoKHVuc2lnbmVkIGxvbmcpZmgtPm9wZW4sIGZoLCAmaCwgZmlsZW5hbWVfMTYsCisJCQkJIEVGSV9GSUxFX01PREVfUkVBRCwgKHU2NCkwKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIik7CisJCWVmaV9jaGFyMTZfcHJpbnRrKHN5c190YWJsZSwgZmlsZW5hbWVfMTYpOworCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIlxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJKmhhbmRsZSA9IGg7CisKKwlpbmZvX3N6ID0gMDsKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoKHVuc2lnbmVkIGxvbmcpaC0+Z2V0X2luZm8sIGgsICZpbmZvX2d1aWQsCisJCQkJICZpbmZvX3N6LCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGdldCBmaWxlIGluZm8gc2l6ZVxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCitncm93OgorCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwKKwkJCQlpbmZvX3N6LCAodm9pZCAqKikmaW5mbyk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBhbGxvYyBtZW0gZm9yIGZpbGUgaW5mb1xuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKCh1bnNpZ25lZCBsb25nKWgtPmdldF9pbmZvLCBoLCAmaW5mb19ndWlkLAorCQkJCSAmaW5mb19zeiwgaW5mbyk7CisJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgeworCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIGluZm8pOworCQlnb3RvIGdyb3c7CisJfQorCisJKmZpbGVfc3ogPSBpbmZvLT5maWxlX3NpemU7CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBpbmZvKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGdldCBpbml0cmQgaW5mb1xuIik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitfX2ZpbGVfc2l6ZTY0KHZvaWQgKl9fZmgsIGVmaV9jaGFyMTZfdCAqZmlsZW5hbWVfMTYsCisJICAgICAgdm9pZCAqKmhhbmRsZSwgdTY0ICpmaWxlX3N6KQoreworCWVmaV9maWxlX2hhbmRsZV82NF90ICpoLCAqZmggPSBfX2ZoOworCWVmaV9maWxlX2luZm9fdCAqaW5mbzsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9ndWlkX3QgaW5mb19ndWlkID0gRUZJX0ZJTEVfSU5GT19JRDsKKwl1MzIgaW5mb19zejsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZylmaC0+b3BlbiwgZmgsICZoLCBmaWxlbmFtZV8xNiwKKwkJCQkgRUZJX0ZJTEVfTU9ERV9SRUFELCAodTY0KTApOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiKTsKKwkJZWZpX2NoYXIxNl9wcmludGsoc3lzX3RhYmxlLCBmaWxlbmFtZV8xNik7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkqaGFuZGxlID0gaDsKKworCWluZm9fc3ogPSAwOworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZyloLT5nZXRfaW5mbywgaCwgJmluZm9fZ3VpZCwKKwkJCQkgJmluZm9fc3osIE5VTEwpOworCWlmIChzdGF0dXMgIT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gZ2V0IGZpbGUgaW5mbyBzaXplXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKK2dyb3c6CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAorCQkJCWluZm9fc3osICh2b2lkICoqKSZpbmZvKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGFsbG9jIG1lbSBmb3IgZmlsZSBpbmZvXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoKHVuc2lnbmVkIGxvbmcpaC0+Z2V0X2luZm8sIGgsICZpbmZvX2d1aWQsCisJCQkJICZpbmZvX3N6LCBpbmZvKTsKKwlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgaW5mbyk7CisJCWdvdG8gZ3JvdzsKKwl9CisKKwkqZmlsZV9zeiA9IGluZm8tPmZpbGVfc2l6ZTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIGluZm8pOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gZ2V0IGluaXRyZCBpbmZvXG4iKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfZmlsZV9zaXplKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlLCB2b2lkICpfX2ZoLAorCSAgICAgIGVmaV9jaGFyMTZfdCAqZmlsZW5hbWVfMTYsIHZvaWQgKipoYW5kbGUsIHU2NCAqZmlsZV9zeikKK3sKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KQorCQlyZXR1cm4gX19maWxlX3NpemU2NChfX2ZoLCBmaWxlbmFtZV8xNiwgaGFuZGxlLCBmaWxlX3N6KTsKKworCXJldHVybiBfX2ZpbGVfc2l6ZTMyKF9fZmgsIGZpbGVuYW1lXzE2LCBoYW5kbGUsIGZpbGVfc3opOworfQorCitzdGF0aWMgaW5saW5lIGVmaV9zdGF0dXNfdAorZWZpX2ZpbGVfcmVhZCh2b2lkICpfX2ZoLCB2b2lkICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgKnNpemUsIHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmdW5jOworCisJaWYgKGVmaV9lYXJseS0+aXM2NCkgeworCQllZmlfZmlsZV9oYW5kbGVfNjRfdCAqZmggPSBfX2ZoOworCisJCWZ1bmMgPSAodW5zaWduZWQgbG9uZylmaC0+cmVhZDsKKwkJcmV0dXJuIGVmaV9lYXJseS0+Y2FsbChmdW5jLCBoYW5kbGUsIHNpemUsIGFkZHIpOworCX0gZWxzZSB7CisJCWVmaV9maWxlX2hhbmRsZV8zMl90ICpmaCA9IF9fZmg7CisKKwkJZnVuYyA9ICh1bnNpZ25lZCBsb25nKWZoLT5yZWFkOworCQlyZXR1cm4gZWZpX2Vhcmx5LT5jYWxsKGZ1bmMsIGhhbmRsZSwgc2l6ZSwgYWRkcik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGVmaV9zdGF0dXNfdCBlZmlfZmlsZV9jbG9zZSh2b2lkICpfX2ZoLCB2b2lkICpoYW5kbGUpCit7CisJaWYgKGVmaV9lYXJseS0+aXM2NCkgeworCQllZmlfZmlsZV9oYW5kbGVfNjRfdCAqZmggPSBfX2ZoOworCisJCXJldHVybiBlZmlfZWFybHktPmNhbGwoKHVuc2lnbmVkIGxvbmcpZmgtPmNsb3NlLCBoYW5kbGUpOworCX0gZWxzZSB7CisJCWVmaV9maWxlX2hhbmRsZV8zMl90ICpmaCA9IF9fZmg7CisKKwkJcmV0dXJuIGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZylmaC0+Y2xvc2UsIGhhbmRsZSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGVmaV9zdGF0dXNfdCBfX29wZW5fdm9sdW1lMzIodm9pZCAqX19pbWFnZSwgdm9pZCAqKl9fZmgpCit7CisJZWZpX2ZpbGVfaW9faW50ZXJmYWNlX3QgKmlvOworCWVmaV9sb2FkZWRfaW1hZ2VfMzJfdCAqaW1hZ2UgPSBfX2ltYWdlOworCWVmaV9maWxlX2hhbmRsZV8zMl90ICpmaDsKKwllZmlfZ3VpZF90IGZzX3Byb3RvID0gRUZJX0ZJTEVfU1lTVEVNX0dVSUQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl2b2lkICpoYW5kbGUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWltYWdlLT5kZXZpY2VfaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgZnVuYzsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaGFuZGxlLAorCQkJCSZmc19wcm90bywgKHZvaWQgKiopJmlvKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGhhbmRsZSBmc19wcm90b1xuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJZnVuYyA9ICh1bnNpZ25lZCBsb25nKWlvLT5vcGVuX3ZvbHVtZTsKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoZnVuYywgaW8sICZmaCk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gb3BlbiB2b2x1bWVcbiIpOworCisJKl9fZmggPSBmaDsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGVmaV9zdGF0dXNfdCBfX29wZW5fdm9sdW1lNjQodm9pZCAqX19pbWFnZSwgdm9pZCAqKl9fZmgpCit7CisJZWZpX2ZpbGVfaW9faW50ZXJmYWNlX3QgKmlvOworCWVmaV9sb2FkZWRfaW1hZ2VfNjRfdCAqaW1hZ2UgPSBfX2ltYWdlOworCWVmaV9maWxlX2hhbmRsZV82NF90ICpmaDsKKwllZmlfZ3VpZF90IGZzX3Byb3RvID0gRUZJX0ZJTEVfU1lTVEVNX0dVSUQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl2b2lkICpoYW5kbGUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWltYWdlLT5kZXZpY2VfaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgZnVuYzsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaGFuZGxlLAorCQkJCSZmc19wcm90bywgKHZvaWQgKiopJmlvKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGhhbmRsZSBmc19wcm90b1xuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJZnVuYyA9ICh1bnNpZ25lZCBsb25nKWlvLT5vcGVuX3ZvbHVtZTsKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoZnVuYywgaW8sICZmaCk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gb3BlbiB2b2x1bWVcbiIpOworCisJKl9fZmggPSBmaDsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGVmaV9zdGF0dXNfdAorZWZpX29wZW5fdm9sdW1lKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlLCB2b2lkICpfX2ltYWdlLCB2b2lkICoqX19maCkKK3sKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KQorCQlyZXR1cm4gX19vcGVuX3ZvbHVtZTY0KF9faW1hZ2UsIF9fZmgpOworCisJcmV0dXJuIF9fb3Blbl92b2x1bWUzMihfX2ltYWdlLCBfX2ZoKTsKK30KKworc3RhdGljIHZvaWQgZWZpX2NoYXIxNl9wcmludGsoZWZpX3N5c3RlbV90YWJsZV90ICp0YWJsZSwgZWZpX2NoYXIxNl90ICpzdHIpCit7CisJdW5zaWduZWQgbG9uZyBvdXRwdXRfc3RyaW5nOworCXNpemVfdCBvZmZzZXQ7CisKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KSB7CisJCXN0cnVjdCBlZmlfc2ltcGxlX3RleHRfb3V0cHV0X3Byb3RvY29sXzY0ICpvdXQ7CisJCXU2NCAqZnVuYzsKKworCQlvZmZzZXQgPSBvZmZzZXRvZih0eXBlb2YoKm91dCksIG91dHB1dF9zdHJpbmcpOworCQlvdXRwdXRfc3RyaW5nID0gZWZpX2Vhcmx5LT50ZXh0X291dHB1dCArIG9mZnNldDsKKwkJZnVuYyA9ICh1NjQgKilvdXRwdXRfc3RyaW5nOworCisJCWVmaV9lYXJseS0+Y2FsbCgqZnVuYywgZWZpX2Vhcmx5LT50ZXh0X291dHB1dCwgc3RyKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZWZpX3NpbXBsZV90ZXh0X291dHB1dF9wcm90b2NvbF8zMiAqb3V0OworCQl1MzIgKmZ1bmM7CisKKwkJb2Zmc2V0ID0gb2Zmc2V0b2YodHlwZW9mKCpvdXQpLCBvdXRwdXRfc3RyaW5nKTsKKwkJb3V0cHV0X3N0cmluZyA9IGVmaV9lYXJseS0+dGV4dF9vdXRwdXQgKyBvZmZzZXQ7CisJCWZ1bmMgPSAodTMyICopb3V0cHV0X3N0cmluZzsKKworCQllZmlfZWFybHktPmNhbGwoKmZ1bmMsIGVmaV9lYXJseS0+dGV4dF9vdXRwdXQsIHN0cik7CisJfQorfQogCiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLXN0dWItaGVscGVyLmMiCiAKLQotCiBzdGF0aWMgdm9pZCBmaW5kX2JpdHModW5zaWduZWQgbG9uZyBtYXNrLCB1OCAqcG9zLCB1OCAqc2l6ZSkKIHsKIAl1OCBmaXJzdCwgbGVuOwpAQCAtNDcsNDggKzMwOSw4NyBAQAogCSpzaXplID0gbGVuOwogfQogCi1zdGF0aWMgZWZpX3N0YXR1c190IHNldHVwX2VmaV9wY2koc3RydWN0IGJvb3RfcGFyYW1zICpwYXJhbXMpCitzdGF0aWMgZWZpX3N0YXR1c190CitfX3NldHVwX2VmaV9wY2kzMihlZmlfcGNpX2lvX3Byb3RvY29sXzMyICpwY2ksIHN0cnVjdCBwY2lfc2V0dXBfcm9tICoqX19yb20pCiB7Ci0JZWZpX3BjaV9pb19wcm90b2NvbCAqcGNpOworCXN0cnVjdCBwY2lfc2V0dXBfcm9tICpyb20gPSBOVUxMOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7Ci0Jdm9pZCAqKnBjaV9oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVpbnQ2NF90IGF0dHJpYnV0ZXM7CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwocGNpLT5hdHRyaWJ1dGVzLCBwY2ksCisJCQkJIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LCAwLCAwLAorCQkJCSAmYXR0cmlidXRlcyk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICghcGNpLT5yb21pbWFnZSB8fCAhcGNpLT5yb21zaXplKQorCQlyZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOworCisJc2l6ZSA9IHBjaS0+cm9tc2l6ZSArIHNpemVvZigqcm9tKTsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwgc2l6ZSwgJnJvbSk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCW1lbXNldChyb20sIDAsIHNpemVvZigqcm9tKSk7CisKKwlyb20tPmRhdGEudHlwZSA9IFNFVFVQX1BDSTsKKwlyb20tPmRhdGEubGVuID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3Qgc2V0dXBfZGF0YSk7CisJcm9tLT5kYXRhLm5leHQgPSAwOworCXJvbS0+cGNpbGVuID0gcGNpLT5yb21zaXplOworCSpfX3JvbSA9IHJvbTsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChwY2ktPnBjaS5yZWFkLCBwY2ksIEVmaVBjaUlvV2lkdGhVaW50MTYsCisJCQkJIFBDSV9WRU5ET1JfSUQsIDEsICYocm9tLT52ZW5kb3IpKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9zdHJ1Y3Q7CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwocGNpLT5wY2kucmVhZCwgcGNpLCBFZmlQY2lJb1dpZHRoVWludDE2LAorCQkJCSBQQ0lfREVWSUNFX0lELCAxLCAmKHJvbS0+ZGV2aWQpKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9zdHJ1Y3Q7CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwocGNpLT5nZXRfbG9jYXRpb24sIHBjaSwgJihyb20tPnNlZ21lbnQpLAorCQkJCSAmKHJvbS0+YnVzKSwgJihyb20tPmRldmljZSksICYocm9tLT5mdW5jdGlvbikpOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmcmVlX3N0cnVjdDsKKworCW1lbWNweShyb20tPnJvbWRhdGEsIHBjaS0+cm9taW1hZ2UsIHBjaS0+cm9tc2l6ZSk7CisJcmV0dXJuIHN0YXR1czsKKworZnJlZV9zdHJ1Y3Q6CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCByb20pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK3NldHVwX2VmaV9wY2kzMihzdHJ1Y3QgYm9vdF9wYXJhbXMgKnBhcmFtcywgdm9pZCAqKnBjaV9oYW5kbGUsCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwllZmlfcGNpX2lvX3Byb3RvY29sXzMyICpwY2kgPSBOVUxMOwogCWVmaV9ndWlkX3QgcGNpX3Byb3RvID0gRUZJX1BDSV9JT19QUk9UT0NPTF9HVUlEOwotCXVuc2lnbmVkIGxvbmcgbnJfcGNpLCBzaXplID0gMDsKLQlpbnQgaTsKKwl1MzIgKmhhbmRsZXMgPSAodTMyICopKHVuc2lnbmVkIGxvbmcpcGNpX2hhbmRsZTsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgbnJfcGNpOwogCXN0cnVjdCBzZXR1cF9kYXRhICpkYXRhOworCWludCBpOwogCiAJZGF0YSA9IChzdHJ1Y3Qgc2V0dXBfZGF0YSAqKSh1bnNpZ25lZCBsb25nKXBhcmFtcy0+aGRyLnNldHVwX2RhdGE7CiAKIAl3aGlsZSAoZGF0YSAmJiBkYXRhLT5uZXh0KQogCQlkYXRhID0gKHN0cnVjdCBzZXR1cF9kYXRhICopKHVuc2lnbmVkIGxvbmcpZGF0YS0+bmV4dDsKIAotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHN5c190YWJsZS0+Ym9vdHRpbWUtPmxvY2F0ZV9oYW5kbGUsCi0JCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwgJnBjaV9wcm90bywKLQkJCQlOVUxMLCAmc2l6ZSwgcGNpX2hhbmRsZSk7Ci0KLQlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7Ci0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJCUVGSV9MT0FERVJfREFUQSwgc2l6ZSwgJnBjaV9oYW5kbGUpOwotCi0JCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCi0JCQlyZXR1cm4gc3RhdHVzOwotCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHN5c190YWJsZS0+Ym9vdHRpbWUtPmxvY2F0ZV9oYW5kbGUsCi0JCQkJCUVGSV9MT0NBVEVfQllfUFJPVE9DT0wsICZwY2lfcHJvdG8sCi0JCQkJCU5VTEwsICZzaXplLCBwY2lfaGFuZGxlKTsKLQl9Ci0KLQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQlnb3RvIGZyZWVfaGFuZGxlOwotCi0JbnJfcGNpID0gc2l6ZSAvIHNpemVvZih2b2lkICopOworCW5yX3BjaSA9IHNpemUgLyBzaXplb2YodTMyKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGNpOyBpKyspIHsKLQkJdm9pZCAqaCA9IHBjaV9oYW5kbGVbaV07Ci0JCXVpbnQ2NF90IGF0dHJpYnV0ZXM7Ci0JCXN0cnVjdCBwY2lfc2V0dXBfcm9tICpyb207CisJCXN0cnVjdCBwY2lfc2V0dXBfcm9tICpyb20gPSBOVUxMOworCQl1MzIgaCA9IGhhbmRsZXNbaV07CiAKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+aGFuZGxlX3Byb3RvY29sLAotCQkJCQloLCAmcGNpX3Byb3RvLCAmcGNpKTsKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoLAorCQkJCQkmcGNpX3Byb3RvLCAodm9pZCAqKikmcGNpKTsKIAogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJY29udGludWU7CkBAIC05Niw1NyArMzk3LDEwIEBACiAJCWlmICghcGNpKQogCQkJY29udGludWU7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM0KHBjaS0+YXR0cmlidXRlcywgcGNpLAotCQkJCQlFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbkdldCwgMCwKLQkJCQkJJmF0dHJpYnV0ZXMpOwotI2Vsc2UKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUocGNpLT5hdHRyaWJ1dGVzLCBwY2ksCi0JCQkJCUVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LCAwLCAwLAotCQkJCQkmYXR0cmlidXRlcyk7Ci0jZW5kaWYKKwkJc3RhdHVzID0gX19zZXR1cF9lZmlfcGNpMzIocGNpLCAmcm9tKTsKIAkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghcGNpLT5yb21pbWFnZSB8fCAhcGNpLT5yb21zaXplKQotCQkJY29udGludWU7Ci0KLQkJc2l6ZSA9IHBjaS0+cm9tc2l6ZSArIHNpemVvZigqcm9tKTsKLQotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGUtPmJvb3R0aW1lLT5hbGxvY2F0ZV9wb29sLAotCQkJCUVGSV9MT0FERVJfREFUQSwgc2l6ZSwgJnJvbSk7Ci0KLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKLQkJCWNvbnRpbnVlOwotCi0JCXJvbS0+ZGF0YS50eXBlID0gU0VUVVBfUENJOwotCQlyb20tPmRhdGEubGVuID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3Qgc2V0dXBfZGF0YSk7Ci0JCXJvbS0+ZGF0YS5uZXh0ID0gMDsKLQkJcm9tLT5wY2lsZW4gPSBwY2ktPnJvbXNpemU7Ci0KLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUocGNpLT5wY2kucmVhZCwgcGNpLAotCQkJCQlFZmlQY2lJb1dpZHRoVWludDE2LCBQQ0lfVkVORE9SX0lELAotCQkJCQkxLCAmKHJvbS0+dmVuZG9yKSk7Ci0KLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKLQkJCWdvdG8gZnJlZV9zdHJ1Y3Q7Ci0KLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUocGNpLT5wY2kucmVhZCwgcGNpLAotCQkJCQlFZmlQY2lJb1dpZHRoVWludDE2LCBQQ0lfREVWSUNFX0lELAotCQkJCQkxLCAmKHJvbS0+ZGV2aWQpKTsKLQotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQkJZ290byBmcmVlX3N0cnVjdDsKLQotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShwY2ktPmdldF9sb2NhdGlvbiwgcGNpLAotCQkJCQkmKHJvbS0+c2VnbWVudCksICYocm9tLT5idXMpLAotCQkJCQkmKHJvbS0+ZGV2aWNlKSwgJihyb20tPmZ1bmN0aW9uKSk7Ci0KLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKLQkJCWdvdG8gZnJlZV9zdHJ1Y3Q7Ci0KLQkJbWVtY3B5KHJvbS0+cm9tZGF0YSwgcGNpLT5yb21pbWFnZSwgcGNpLT5yb21zaXplKTsKLQogCQlpZiAoZGF0YSkKIAkJCWRhdGEtPm5leHQgPSAodW5zaWduZWQgbG9uZylyb207CiAJCWVsc2UKQEAgLTE1NCwxMDUgKzQwOCwxNTUgQEAKIAogCQlkYXRhID0gKHN0cnVjdCBzZXR1cF9kYXRhICopcm9tOwogCi0JCWNvbnRpbnVlOwotCWZyZWVfc3RydWN0OgotCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIHJvbSk7CiAJfQogCi1mcmVlX2hhbmRsZToKLQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIHBjaV9oYW5kbGUpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBTZWUgaWYgd2UgaGF2ZSBHcmFwaGljcyBPdXRwdXQgUHJvdG9jb2wKLSAqLwotc3RhdGljIGVmaV9zdGF0dXNfdCBzZXR1cF9nb3Aoc3RydWN0IHNjcmVlbl9pbmZvICpzaSwgZWZpX2d1aWRfdCAqcHJvdG8sCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgZWZpX3N0YXR1c190CitfX3NldHVwX2VmaV9wY2k2NChlZmlfcGNpX2lvX3Byb3RvY29sXzY0ICpwY2ksIHN0cnVjdCBwY2lfc2V0dXBfcm9tICoqX19yb20pCiB7Ci0Jc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2wgKmdvcCwgKmZpcnN0X2dvcDsKLQlzdHJ1Y3QgZWZpX3BpeGVsX2JpdG1hc2sgcGl4ZWxfaW5mbzsKLQl1bnNpZ25lZCBsb25nIG5yX2dvcHM7CisJc3RydWN0IHBjaV9zZXR1cF9yb20gKnJvbTsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwotCXZvaWQgKipnb3BfaGFuZGxlOwotCXUxNiB3aWR0aCwgaGVpZ2h0OwotCXUzMiBmYl9iYXNlLCBmYl9zaXplOwotCXUzMiBwaXhlbHNfcGVyX3NjYW5fbGluZTsKLQlpbnQgcGl4ZWxfZm9ybWF0OwotCWludCBpOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1aW50NjRfdCBhdHRyaWJ1dGVzOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQlFRklfTE9BREVSX0RBVEEsIHNpemUsICZnb3BfaGFuZGxlKTsKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwocGNpLT5hdHRyaWJ1dGVzLCBwY2ksCisJCQkJIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LCAwLAorCQkJCSAmYXR0cmlidXRlcyk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJcmV0dXJuIHN0YXR1czsKIAotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHN5c190YWJsZS0+Ym9vdHRpbWUtPmxvY2F0ZV9oYW5kbGUsCi0JCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwgcHJvdG8sCi0JCQkJTlVMTCwgJnNpemUsIGdvcF9oYW5kbGUpOworCWlmICghcGNpLT5yb21pbWFnZSB8fCAhcGNpLT5yb21zaXplKQorCQlyZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOworCisJc2l6ZSA9IHBjaS0+cm9tc2l6ZSArIHNpemVvZigqcm9tKTsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwgc2l6ZSwgJnJvbSk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKLQkJZ290byBmcmVlX2hhbmRsZTsKKwkJcmV0dXJuIHN0YXR1czsKIAotCWZpcnN0X2dvcCA9IE5VTEw7CisJcm9tLT5kYXRhLnR5cGUgPSBTRVRVUF9QQ0k7CisJcm9tLT5kYXRhLmxlbiA9IHNpemUgLSBzaXplb2Yoc3RydWN0IHNldHVwX2RhdGEpOworCXJvbS0+ZGF0YS5uZXh0ID0gMDsKKwlyb20tPnBjaWxlbiA9IHBjaS0+cm9tc2l6ZTsKKwkqX19yb20gPSByb207CiAKLQlucl9nb3BzID0gc2l6ZSAvIHNpemVvZih2b2lkICopOwotCWZvciAoaSA9IDA7IGkgPCBucl9nb3BzOyBpKyspIHsKLQkJc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfbW9kZV9pbmZvICppbmZvOwotCQllZmlfZ3VpZF90IGNvbm91dF9wcm90byA9IEVGSV9DT05TT0xFX09VVF9ERVZJQ0VfR1VJRDsKLQkJYm9vbCBjb25vdXRfZm91bmQgPSBmYWxzZTsKLQkJdm9pZCAqZHVtbXk7Ci0JCXZvaWQgKmggPSBnb3BfaGFuZGxlW2ldOworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChwY2ktPnBjaS5yZWFkLCBwY2ksIEVmaVBjaUlvV2lkdGhVaW50MTYsCisJCQkJIFBDSV9WRU5ET1JfSUQsIDEsICYocm9tLT52ZW5kb3IpKTsKIAotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGUtPmJvb3R0aW1lLT5oYW5kbGVfcHJvdG9jb2wsCi0JCQkJCWgsIHByb3RvLCAmZ29wKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZyZWVfc3RydWN0OworCisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKHBjaS0+cGNpLnJlYWQsIHBjaSwgRWZpUGNpSW9XaWR0aFVpbnQxNiwKKwkJCQkgUENJX0RFVklDRV9JRCwgMSwgJihyb20tPmRldmlkKSk7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZyZWVfc3RydWN0OworCisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKHBjaS0+Z2V0X2xvY2F0aW9uLCBwY2ksICYocm9tLT5zZWdtZW50KSwKKwkJCQkgJihyb20tPmJ1cyksICYocm9tLT5kZXZpY2UpLCAmKHJvbS0+ZnVuY3Rpb24pKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9zdHJ1Y3Q7CisKKwltZW1jcHkocm9tLT5yb21kYXRhLCBwY2ktPnJvbWltYWdlLCBwY2ktPnJvbXNpemUpOworCXJldHVybiBzdGF0dXM7CisKK2ZyZWVfc3RydWN0OgorCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgcm9tKTsKKwlyZXR1cm4gc3RhdHVzOworCit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK3NldHVwX2VmaV9wY2k2NChzdHJ1Y3QgYm9vdF9wYXJhbXMgKnBhcmFtcywgdm9pZCAqKnBjaV9oYW5kbGUsCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwllZmlfcGNpX2lvX3Byb3RvY29sXzY0ICpwY2kgPSBOVUxMOworCWVmaV9ndWlkX3QgcGNpX3Byb3RvID0gRUZJX1BDSV9JT19QUk9UT0NPTF9HVUlEOworCXU2NCAqaGFuZGxlcyA9ICh1NjQgKikodW5zaWduZWQgbG9uZylwY2lfaGFuZGxlOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBucl9wY2k7CisJc3RydWN0IHNldHVwX2RhdGEgKmRhdGE7CisJaW50IGk7CisKKwlkYXRhID0gKHN0cnVjdCBzZXR1cF9kYXRhICopKHVuc2lnbmVkIGxvbmcpcGFyYW1zLT5oZHIuc2V0dXBfZGF0YTsKKworCXdoaWxlIChkYXRhICYmIGRhdGEtPm5leHQpCisJCWRhdGEgPSAoc3RydWN0IHNldHVwX2RhdGEgKikodW5zaWduZWQgbG9uZylkYXRhLT5uZXh0OworCisJbnJfcGNpID0gc2l6ZSAvIHNpemVvZih1NjQpOworCWZvciAoaSA9IDA7IGkgPCBucl9wY2k7IGkrKykgeworCQlzdHJ1Y3QgcGNpX3NldHVwX3JvbSAqcm9tID0gTlVMTDsKKwkJdTY0IGggPSBoYW5kbGVzW2ldOworCisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaCwKKwkJCQkJJnBjaV9wcm90bywgKHZvaWQgKiopJnBjaSk7CisKIAkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJCWNvbnRpbnVlOwogCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmhhbmRsZV9wcm90b2NvbCwKLQkJCQkJaCwgJmNvbm91dF9wcm90bywgJmR1bW15KTsKKwkJaWYgKCFwY2kpCisJCQljb250aW51ZTsKIAotCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTKQotCQkJY29ub3V0X2ZvdW5kID0gdHJ1ZTsKKwkJc3RhdHVzID0gX19zZXR1cF9lZmlfcGNpNjQocGNpLCAmcm9tKTsKKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOwogCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM0KGdvcC0+cXVlcnlfbW9kZSwgZ29wLAotCQkJCQlnb3AtPm1vZGUtPm1vZGUsICZzaXplLCAmaW5mbyk7Ci0JCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgJiYgKCFmaXJzdF9nb3AgfHwgY29ub3V0X2ZvdW5kKSkgewotCQkJLyoKLQkJCSAqIFN5c3RlbXMgdGhhdCB1c2UgdGhlIFVFRkkgQ29uc29sZSBTcGxpdHRlciBtYXkKLQkJCSAqIHByb3ZpZGUgbXVsdGlwbGUgR09QIGRldmljZXMsIG5vdCBhbGwgb2Ygd2hpY2ggYXJlCi0JCQkgKiBiYWNrZWQgYnkgcmVhbCBoYXJkd2FyZS4gVGhlIHdvcmthcm91bmQgaXMgdG8gc2VhcmNoCi0JCQkgKiBmb3IgYSBHT1AgaW1wbGVtZW50aW5nIHRoZSBDb25PdXQgcHJvdG9jb2wsIGFuZCBpZgotCQkJICogb25lIGlzbid0IGZvdW5kLCB0byBqdXN0IGZhbGwgYmFjayB0byB0aGUgZmlyc3QgR09QLgotCQkJICovCi0JCQl3aWR0aCA9IGluZm8tPmhvcml6b250YWxfcmVzb2x1dGlvbjsKLQkJCWhlaWdodCA9IGluZm8tPnZlcnRpY2FsX3Jlc29sdXRpb247Ci0JCQlmYl9iYXNlID0gZ29wLT5tb2RlLT5mcmFtZV9idWZmZXJfYmFzZTsKLQkJCWZiX3NpemUgPSBnb3AtPm1vZGUtPmZyYW1lX2J1ZmZlcl9zaXplOwotCQkJcGl4ZWxfZm9ybWF0ID0gaW5mby0+cGl4ZWxfZm9ybWF0OwotCQkJcGl4ZWxfaW5mbyA9IGluZm8tPnBpeGVsX2luZm9ybWF0aW9uOwotCQkJcGl4ZWxzX3Blcl9zY2FuX2xpbmUgPSBpbmZvLT5waXhlbHNfcGVyX3NjYW5fbGluZTsKKwkJaWYgKGRhdGEpCisJCQlkYXRhLT5uZXh0ID0gKHVuc2lnbmVkIGxvbmcpcm9tOworCQllbHNlCisJCQlwYXJhbXMtPmhkci5zZXR1cF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpcm9tOwogCi0JCQkvKgotCQkJICogT25jZSB3ZSd2ZSBmb3VuZCBhIEdPUCBzdXBwb3J0aW5nIENvbk91dCwKLQkJCSAqIGRvbid0IGJvdGhlciBsb29raW5nIGFueSBmdXJ0aGVyLgotCQkJICovCi0JCQlmaXJzdF9nb3AgPSBnb3A7Ci0JCQlpZiAoY29ub3V0X2ZvdW5kKQotCQkJCWJyZWFrOwotCQl9CisJCWRhdGEgPSAoc3RydWN0IHNldHVwX2RhdGEgKilyb207CisKIAl9CiAKLQkvKiBEaWQgd2UgZmluZCBhbnkgR09Qcz8gKi8KLQlpZiAoIWZpcnN0X2dvcCkKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190IHNldHVwX2VmaV9wY2koc3RydWN0IGJvb3RfcGFyYW1zICpwYXJhbXMpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl2b2lkICoqcGNpX2hhbmRsZSA9IE5VTEw7CisJZWZpX2d1aWRfdCBwY2lfcHJvdG8gPSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGxvY2F0ZV9oYW5kbGUsCisJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwKKwkJCQkmcGNpX3Byb3RvLCBOVUxMLCAmc2l6ZSwgcGNpX2hhbmRsZSk7CisKKwlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsCisJCQkJCUVGSV9MT0FERVJfREFUQSwKKwkJCQkJc2l6ZSwgKHZvaWQgKiopJnBjaV9oYW5kbGUpOworCisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGxvY2F0ZV9oYW5kbGUsCisJCQkJCUVGSV9MT0NBVEVfQllfUFJPVE9DT0wsICZwY2lfcHJvdG8sCisJCQkJCU5VTEwsICZzaXplLCBwY2lfaGFuZGxlKTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlnb3RvIGZyZWVfaGFuZGxlOwogCi0JLyogRUZJIGZyYW1lYnVmZmVyICovCi0Jc2ktPm9yaWdfdmlkZW9faXNWR0EgPSBWSURFT19UWVBFX0VGSTsKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KQorCQlzdGF0dXMgPSBzZXR1cF9lZmlfcGNpNjQocGFyYW1zLCBwY2lfaGFuZGxlLCBzaXplKTsKKwllbHNlCisJCXN0YXR1cyA9IHNldHVwX2VmaV9wY2kzMihwYXJhbXMsIHBjaV9oYW5kbGUsIHNpemUpOwogCi0Jc2ktPmxmYl93aWR0aCA9IHdpZHRoOwotCXNpLT5sZmJfaGVpZ2h0ID0gaGVpZ2h0OwotCXNpLT5sZmJfYmFzZSA9IGZiX2Jhc2U7Ci0Jc2ktPnBhZ2VzID0gMTsKK2ZyZWVfaGFuZGxlOgorCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgcGNpX2hhbmRsZSk7CisJcmV0dXJuIHN0YXR1czsKK30KIAorc3RhdGljIHZvaWQKK3NldHVwX3BpeGVsX2luZm8oc3RydWN0IHNjcmVlbl9pbmZvICpzaSwgdTMyIHBpeGVsc19wZXJfc2Nhbl9saW5lLAorCQkgc3RydWN0IGVmaV9waXhlbF9iaXRtYXNrIHBpeGVsX2luZm8sIGludCBwaXhlbF9mb3JtYXQpCit7CiAJaWYgKHBpeGVsX2Zvcm1hdCA9PSBQSVhFTF9SR0JfUkVTRVJWRURfOEJJVF9QRVJfQ09MT1IpIHsKIAkJc2ktPmxmYl9kZXB0aCA9IDMyOwogCQlzaS0+bGZiX2xpbmVsZW5ndGggPSBwaXhlbHNfcGVyX3NjYW5fbGluZSAqIDQ7CkBAIC0yOTcsNjIgKzYwMSwyNzQgQEAKIAkJc2ktPnJzdmRfc2l6ZSA9IDA7CiAJCXNpLT5yc3ZkX3BvcyA9IDA7CiAJfQorfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitfX2dvcF9xdWVyeTMyKHN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sXzMyICpnb3AzMiwKKwkgICAgICBzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9tb2RlX2luZm8gKippbmZvLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgKnNpemUsIHUzMiAqZmJfYmFzZSkKK3sKKwlzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF9tb2RlXzMyICptb2RlOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBtOworCisJbSA9IGdvcDMyLT5tb2RlOworCW1vZGUgPSAoc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfbW9kZV8zMiAqKW07CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoZ29wMzItPnF1ZXJ5X21vZGUsIGdvcDMyLAorCQkJCSBtb2RlLT5tb2RlLCBzaXplLCBpbmZvKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJKmZiX2Jhc2UgPSBtb2RlLT5mcmFtZV9idWZmZXJfYmFzZTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitzZXR1cF9nb3AzMihzdHJ1Y3Qgc2NyZWVuX2luZm8gKnNpLCBlZmlfZ3VpZF90ICpwcm90bywKKwkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICoqZ29wX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF8zMiAqZ29wMzIsICpmaXJzdF9nb3A7CisJdW5zaWduZWQgbG9uZyBucl9nb3BzOworCXUxNiB3aWR0aCwgaGVpZ2h0OworCXUzMiBwaXhlbHNfcGVyX3NjYW5fbGluZTsKKwl1MzIgZmJfYmFzZTsKKwlzdHJ1Y3QgZWZpX3BpeGVsX2JpdG1hc2sgcGl4ZWxfaW5mbzsKKwlpbnQgcGl4ZWxfZm9ybWF0OworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyICpoYW5kbGVzID0gKHUzMiAqKSh1bnNpZ25lZCBsb25nKWdvcF9oYW5kbGU7CisJaW50IGk7CisKKwlmaXJzdF9nb3AgPSBOVUxMOworCWdvcDMyID0gTlVMTDsKKworCW5yX2dvcHMgPSBzaXplIC8gc2l6ZW9mKHUzMik7CisJZm9yIChpID0gMDsgaSA8IG5yX2dvcHM7IGkrKykgeworCQlzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9tb2RlX2luZm8gKmluZm8gPSBOVUxMOworCQllZmlfZ3VpZF90IGNvbm91dF9wcm90byA9IEVGSV9DT05TT0xFX09VVF9ERVZJQ0VfR1VJRDsKKwkJYm9vbCBjb25vdXRfZm91bmQgPSBmYWxzZTsKKwkJdm9pZCAqZHVtbXkgPSBOVUxMOworCQl1MzIgaCA9IGhhbmRsZXNbaV07CisKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoLAorCQkJCQlwcm90bywgKHZvaWQgKiopJmdvcDMyKTsKKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaCwKKwkJCQkJJmNvbm91dF9wcm90bywgJmR1bW15KTsKKwkJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKKwkJCWNvbm91dF9mb3VuZCA9IHRydWU7CisKKwkJc3RhdHVzID0gX19nb3BfcXVlcnkzMihnb3AzMiwgJmluZm8sICZzaXplLCAmZmJfYmFzZSk7CisJCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgJiYgKCFmaXJzdF9nb3AgfHwgY29ub3V0X2ZvdW5kKSkgeworCQkJLyoKKwkJCSAqIFN5c3RlbXMgdGhhdCB1c2UgdGhlIFVFRkkgQ29uc29sZSBTcGxpdHRlciBtYXkKKwkJCSAqIHByb3ZpZGUgbXVsdGlwbGUgR09QIGRldmljZXMsIG5vdCBhbGwgb2Ygd2hpY2ggYXJlCisJCQkgKiBiYWNrZWQgYnkgcmVhbCBoYXJkd2FyZS4gVGhlIHdvcmthcm91bmQgaXMgdG8gc2VhcmNoCisJCQkgKiBmb3IgYSBHT1AgaW1wbGVtZW50aW5nIHRoZSBDb25PdXQgcHJvdG9jb2wsIGFuZCBpZgorCQkJICogb25lIGlzbid0IGZvdW5kLCB0byBqdXN0IGZhbGwgYmFjayB0byB0aGUgZmlyc3QgR09QLgorCQkJICovCisJCQl3aWR0aCA9IGluZm8tPmhvcml6b250YWxfcmVzb2x1dGlvbjsKKwkJCWhlaWdodCA9IGluZm8tPnZlcnRpY2FsX3Jlc29sdXRpb247CisJCQlwaXhlbF9mb3JtYXQgPSBpbmZvLT5waXhlbF9mb3JtYXQ7CisJCQlwaXhlbF9pbmZvID0gaW5mby0+cGl4ZWxfaW5mb3JtYXRpb247CisJCQlwaXhlbHNfcGVyX3NjYW5fbGluZSA9IGluZm8tPnBpeGVsc19wZXJfc2Nhbl9saW5lOworCisJCQkvKgorCQkJICogT25jZSB3ZSd2ZSBmb3VuZCBhIEdPUCBzdXBwb3J0aW5nIENvbk91dCwKKwkJCSAqIGRvbid0IGJvdGhlciBsb29raW5nIGFueSBmdXJ0aGVyLgorCQkJICovCisJCQlmaXJzdF9nb3AgPSBnb3AzMjsKKwkJCWlmIChjb25vdXRfZm91bmQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBEaWQgd2UgZmluZCBhbnkgR09Qcz8gKi8KKwlpZiAoIWZpcnN0X2dvcCkKKwkJZ290byBvdXQ7CisKKwkvKiBFRkkgZnJhbWVidWZmZXIgKi8KKwlzaS0+b3JpZ192aWRlb19pc1ZHQSA9IFZJREVPX1RZUEVfRUZJOworCisJc2ktPmxmYl93aWR0aCA9IHdpZHRoOworCXNpLT5sZmJfaGVpZ2h0ID0gaGVpZ2h0OworCXNpLT5sZmJfYmFzZSA9IGZiX2Jhc2U7CisJc2ktPnBhZ2VzID0gMTsKKworCXNldHVwX3BpeGVsX2luZm8oc2ksIHBpeGVsc19wZXJfc2Nhbl9saW5lLCBwaXhlbF9pbmZvLCBwaXhlbF9mb3JtYXQpOwogCiAJc2ktPmxmYl9zaXplID0gc2ktPmxmYl9saW5lbGVuZ3RoICogc2ktPmxmYl9oZWlnaHQ7CiAKIAlzaS0+Y2FwYWJpbGl0aWVzIHw9IFZJREVPX0NBUEFCSUxJVFlfU0tJUF9RVUlSS1M7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KIAotZnJlZV9oYW5kbGU6Ci0JZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlLT5ib290dGltZS0+ZnJlZV9wb29sLCBnb3BfaGFuZGxlKTsKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK19fZ29wX3F1ZXJ5NjQoc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfNjQgKmdvcDY0LAorCSAgICAgIHN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X21vZGVfaW5mbyAqKmluZm8sCisJICAgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdTMyICpmYl9iYXNlKQoreworCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sX21vZGVfNjQgKm1vZGU7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG07CisKKwltID0gZ29wNjQtPm1vZGU7CisJbW9kZSA9IChzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF9tb2RlXzY0ICopbTsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChnb3A2NC0+cXVlcnlfbW9kZSwgZ29wNjQsCisJCQkJIG1vZGUtPm1vZGUsIHNpemUsIGluZm8pOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwkqZmJfYmFzZSA9IG1vZGUtPmZyYW1lX2J1ZmZlcl9iYXNlOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK3NldHVwX2dvcDY0KHN0cnVjdCBzY3JlZW5faW5mbyAqc2ksIGVmaV9ndWlkX3QgKnByb3RvLAorCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKipnb3BfaGFuZGxlKQoreworCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sXzY0ICpnb3A2NCwgKmZpcnN0X2dvcDsKKwl1bnNpZ25lZCBsb25nIG5yX2dvcHM7CisJdTE2IHdpZHRoLCBoZWlnaHQ7CisJdTMyIHBpeGVsc19wZXJfc2Nhbl9saW5lOworCXUzMiBmYl9iYXNlOworCXN0cnVjdCBlZmlfcGl4ZWxfYml0bWFzayBwaXhlbF9pbmZvOworCWludCBwaXhlbF9mb3JtYXQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1NjQgKmhhbmRsZXMgPSAodTY0ICopKHVuc2lnbmVkIGxvbmcpZ29wX2hhbmRsZTsKKwlpbnQgaTsKKworCWZpcnN0X2dvcCA9IE5VTEw7CisJZ29wNjQgPSBOVUxMOworCisJbnJfZ29wcyA9IHNpemUgLyBzaXplb2YodTY0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZ29wczsgaSsrKSB7CisJCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X21vZGVfaW5mbyAqaW5mbyA9IE5VTEw7CisJCWVmaV9ndWlkX3QgY29ub3V0X3Byb3RvID0gRUZJX0NPTlNPTEVfT1VUX0RFVklDRV9HVUlEOworCQlib29sIGNvbm91dF9mb3VuZCA9IGZhbHNlOworCQl2b2lkICpkdW1teSA9IE5VTEw7CisJCXU2NCBoID0gaGFuZGxlc1tpXTsKKworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGgsCisJCQkJCXByb3RvLCAodm9pZCAqKikmZ29wNjQpOworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQkJY29udGludWU7CisKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoLAorCQkJCQkmY29ub3V0X3Byb3RvLCAmZHVtbXkpOworCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTKQorCQkJY29ub3V0X2ZvdW5kID0gdHJ1ZTsKKworCQlzdGF0dXMgPSBfX2dvcF9xdWVyeTY0KGdvcDY0LCAmaW5mbywgJnNpemUsICZmYl9iYXNlKTsKKwkJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUyAmJiAoIWZpcnN0X2dvcCB8fCBjb25vdXRfZm91bmQpKSB7CisJCQkvKgorCQkJICogU3lzdGVtcyB0aGF0IHVzZSB0aGUgVUVGSSBDb25zb2xlIFNwbGl0dGVyIG1heQorCQkJICogcHJvdmlkZSBtdWx0aXBsZSBHT1AgZGV2aWNlcywgbm90IGFsbCBvZiB3aGljaCBhcmUKKwkJCSAqIGJhY2tlZCBieSByZWFsIGhhcmR3YXJlLiBUaGUgd29ya2Fyb3VuZCBpcyB0byBzZWFyY2gKKwkJCSAqIGZvciBhIEdPUCBpbXBsZW1lbnRpbmcgdGhlIENvbk91dCBwcm90b2NvbCwgYW5kIGlmCisJCQkgKiBvbmUgaXNuJ3QgZm91bmQsIHRvIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBHT1AuCisJCQkgKi8KKwkJCXdpZHRoID0gaW5mby0+aG9yaXpvbnRhbF9yZXNvbHV0aW9uOworCQkJaGVpZ2h0ID0gaW5mby0+dmVydGljYWxfcmVzb2x1dGlvbjsKKwkJCXBpeGVsX2Zvcm1hdCA9IGluZm8tPnBpeGVsX2Zvcm1hdDsKKwkJCXBpeGVsX2luZm8gPSBpbmZvLT5waXhlbF9pbmZvcm1hdGlvbjsKKwkJCXBpeGVsc19wZXJfc2Nhbl9saW5lID0gaW5mby0+cGl4ZWxzX3Blcl9zY2FuX2xpbmU7CisKKwkJCS8qCisJCQkgKiBPbmNlIHdlJ3ZlIGZvdW5kIGEgR09QIHN1cHBvcnRpbmcgQ29uT3V0LAorCQkJICogZG9uJ3QgYm90aGVyIGxvb2tpbmcgYW55IGZ1cnRoZXIuCisJCQkgKi8KKwkJCWZpcnN0X2dvcCA9IGdvcDY0OworCQkJaWYgKGNvbm91dF9mb3VuZCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qIERpZCB3ZSBmaW5kIGFueSBHT1BzPyAqLworCWlmICghZmlyc3RfZ29wKQorCQlnb3RvIG91dDsKKworCS8qIEVGSSBmcmFtZWJ1ZmZlciAqLworCXNpLT5vcmlnX3ZpZGVvX2lzVkdBID0gVklERU9fVFlQRV9FRkk7CisKKwlzaS0+bGZiX3dpZHRoID0gd2lkdGg7CisJc2ktPmxmYl9oZWlnaHQgPSBoZWlnaHQ7CisJc2ktPmxmYl9iYXNlID0gZmJfYmFzZTsKKwlzaS0+cGFnZXMgPSAxOworCisJc2V0dXBfcGl4ZWxfaW5mbyhzaSwgcGl4ZWxzX3Blcl9zY2FuX2xpbmUsIHBpeGVsX2luZm8sIHBpeGVsX2Zvcm1hdCk7CisKKwlzaS0+bGZiX3NpemUgPSBzaS0+bGZiX2xpbmVsZW5ndGggKiBzaS0+bGZiX2hlaWdodDsKKworCXNpLT5jYXBhYmlsaXRpZXMgfD0gVklERU9fQ0FQQUJJTElUWV9TS0lQX1FVSVJLUzsKK291dDoKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgotICogU2VlIGlmIHdlIGhhdmUgVW5pdmVyc2FsIEdyYXBoaWNzIEFkYXB0ZXIgKFVHQSkgcHJvdG9jb2wKKyAqIFNlZSBpZiB3ZSBoYXZlIEdyYXBoaWNzIE91dHB1dCBQcm90b2NvbAogICovCi1zdGF0aWMgZWZpX3N0YXR1c190IHNldHVwX3VnYShzdHJ1Y3Qgc2NyZWVuX2luZm8gKnNpLCBlZmlfZ3VpZF90ICp1Z2FfcHJvdG8sCitzdGF0aWMgZWZpX3N0YXR1c190IHNldHVwX2dvcChzdHJ1Y3Qgc2NyZWVuX2luZm8gKnNpLCBlZmlfZ3VpZF90ICpwcm90bywKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlzdHJ1Y3QgZWZpX3VnYV9kcmF3X3Byb3RvY29sICp1Z2EsICpmaXJzdF91Z2E7Ci0JdW5zaWduZWQgbG9uZyBucl91Z2FzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7Ci0JdTMyIHdpZHRoLCBoZWlnaHQ7Ci0Jdm9pZCAqKnVnYV9oYW5kbGUgPSBOVUxMOwotCWludCBpOworCXZvaWQgKipnb3BfaGFuZGxlID0gTlVMTDsKIAotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJRUZJX0xPQURFUl9EQVRBLCBzaXplLCAmdWdhX2hhbmRsZSk7CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAorCQkJCXNpemUsICh2b2lkICoqKSZnb3BfaGFuZGxlKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlyZXR1cm4gc3RhdHVzOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoc3lzX3RhYmxlLT5ib290dGltZS0+bG9jYXRlX2hhbmRsZSwKLQkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLCB1Z2FfcHJvdG8sCi0JCQkJTlVMTCwgJnNpemUsIHVnYV9oYW5kbGUpOworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGxvY2F0ZV9oYW5kbGUsCisJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwKKwkJCQlwcm90bywgTlVMTCwgJnNpemUsIGdvcF9oYW5kbGUpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCWdvdG8gZnJlZV9oYW5kbGU7CiAKLQlmaXJzdF91Z2EgPSBOVUxMOworCWlmIChlZmlfZWFybHktPmlzNjQpCisJCXN0YXR1cyA9IHNldHVwX2dvcDY0KHNpLCBwcm90bywgc2l6ZSwgZ29wX2hhbmRsZSk7CisJZWxzZQorCQlzdGF0dXMgPSBzZXR1cF9nb3AzMihzaSwgcHJvdG8sIHNpemUsIGdvcF9oYW5kbGUpOwogCi0JbnJfdWdhcyA9IHNpemUgLyBzaXplb2Yodm9pZCAqKTsKK2ZyZWVfaGFuZGxlOgorCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgZ29wX2hhbmRsZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorc2V0dXBfdWdhMzIodm9pZCAqKnVnYV9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCit7CisJc3RydWN0IGVmaV91Z2FfZHJhd19wcm90b2NvbCAqdWdhID0gTlVMTCwgKmZpcnN0X3VnYTsKKwllZmlfZ3VpZF90IHVnYV9wcm90byA9IEVGSV9VR0FfUFJPVE9DT0xfR1VJRDsKKwl1bnNpZ25lZCBsb25nIG5yX3VnYXM7CisJdTMyICpoYW5kbGVzID0gKHUzMiAqKXVnYV9oYW5kbGU7OworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJaW50IGk7CisKKwlmaXJzdF91Z2EgPSBOVUxMOworCW5yX3VnYXMgPSBzaXplIC8gc2l6ZW9mKHUzMik7CiAJZm9yIChpID0gMDsgaSA8IG5yX3VnYXM7IGkrKykgewogCQllZmlfZ3VpZF90IHBjaWlvX3Byb3RvID0gRUZJX1BDSV9JT19QUk9UT0NPTF9HVUlEOwotCQl2b2lkICpoYW5kbGUgPSB1Z2FfaGFuZGxlW2ldOwogCQl1MzIgdywgaCwgZGVwdGgsIHJlZnJlc2g7CiAJCXZvaWQgKnBjaWlvOworCQl1MzIgaGFuZGxlID0gaGFuZGxlc1tpXTsKIAotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGUtPmJvb3R0aW1lLT5oYW5kbGVfcHJvdG9jb2wsCi0JCQkJCWhhbmRsZSwgdWdhX3Byb3RvLCAmdWdhKTsKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoYW5kbGUsCisJCQkJCSZ1Z2FfcHJvdG8sICh2b2lkICoqKSZ1Z2EpOwogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJY29udGludWU7CiAKLQkJZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+aGFuZGxlX3Byb3RvY29sLAotCQkJICAgICAgIGhhbmRsZSwgJnBjaWlvX3Byb3RvLCAmcGNpaW8pOworCQllZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGhhbmRsZSwgJnBjaWlvX3Byb3RvLCAmcGNpaW8pOwogCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHVnYS0+Z2V0X21vZGUsIHVnYSwgJncsICZoLAotCQkJCQkmZGVwdGgsICZyZWZyZXNoKTsKKwkJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKCh1bnNpZ25lZCBsb25nKXVnYS0+Z2V0X21vZGUsIHVnYSwKKwkJCQkJICZ3LCAmaCwgJmRlcHRoLCAmcmVmcmVzaCk7CiAJCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgJiYgKCFmaXJzdF91Z2EgfHwgcGNpaW8pKSB7Ci0JCQl3aWR0aCA9IHc7Ci0JCQloZWlnaHQgPSBoOworCQkJKndpZHRoID0gdzsKKwkJCSpoZWlnaHQgPSBoOwogCiAJCQkvKgogCQkJICogT25jZSB3ZSd2ZSBmb3VuZCBhIFVHQSBzdXBwb3J0aW5nIFBDSUlPLApAQCAtMzY1LDcgKzg4MSw4NCBAQAogCQl9CiAJfQogCi0JaWYgKCFmaXJzdF91Z2EpCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorc2V0dXBfdWdhNjQodm9pZCAqKnVnYV9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCit7CisJc3RydWN0IGVmaV91Z2FfZHJhd19wcm90b2NvbCAqdWdhID0gTlVMTCwgKmZpcnN0X3VnYTsKKwllZmlfZ3VpZF90IHVnYV9wcm90byA9IEVGSV9VR0FfUFJPVE9DT0xfR1VJRDsKKwl1bnNpZ25lZCBsb25nIG5yX3VnYXM7CisJdTY0ICpoYW5kbGVzID0gKHU2NCAqKXVnYV9oYW5kbGU7OworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJaW50IGk7CisKKwlmaXJzdF91Z2EgPSBOVUxMOworCW5yX3VnYXMgPSBzaXplIC8gc2l6ZW9mKHU2NCk7CisJZm9yIChpID0gMDsgaSA8IG5yX3VnYXM7IGkrKykgeworCQllZmlfZ3VpZF90IHBjaWlvX3Byb3RvID0gRUZJX1BDSV9JT19QUk9UT0NPTF9HVUlEOworCQl1MzIgdywgaCwgZGVwdGgsIHJlZnJlc2g7CisJCXZvaWQgKnBjaWlvOworCQl1NjQgaGFuZGxlID0gaGFuZGxlc1tpXTsKKworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGhhbmRsZSwKKwkJCQkJJnVnYV9wcm90bywgKHZvaWQgKiopJnVnYSk7CisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQljb250aW51ZTsKKworCQllZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGhhbmRsZSwgJnBjaWlvX3Byb3RvLCAmcGNpaW8pOworCisJCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZyl1Z2EtPmdldF9tb2RlLCB1Z2EsCisJCQkJCSAmdywgJmgsICZkZXB0aCwgJnJlZnJlc2gpOworCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTICYmICghZmlyc3RfdWdhIHx8IHBjaWlvKSkgeworCQkJKndpZHRoID0gdzsKKwkJCSpoZWlnaHQgPSBoOworCisJCQkvKgorCQkJICogT25jZSB3ZSd2ZSBmb3VuZCBhIFVHQSBzdXBwb3J0aW5nIFBDSUlPLAorCQkJICogZG9uJ3QgYm90aGVyIGxvb2tpbmcgYW55IGZ1cnRoZXIuCisJCQkgKi8KKwkJCWlmIChwY2lpbykKKwkJCQlicmVhazsKKworCQkJZmlyc3RfdWdhID0gdWdhOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFNlZSBpZiB3ZSBoYXZlIFVuaXZlcnNhbCBHcmFwaGljcyBBZGFwdGVyIChVR0EpIHByb3RvY29sCisgKi8KK3N0YXRpYyBlZmlfc3RhdHVzX3Qgc2V0dXBfdWdhKHN0cnVjdCBzY3JlZW5faW5mbyAqc2ksIGVmaV9ndWlkX3QgKnVnYV9wcm90bywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiB3aWR0aCwgaGVpZ2h0OworCXZvaWQgKip1Z2FfaGFuZGxlID0gTlVMTDsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwKKwkJCQlzaXplLCAodm9pZCAqKikmdWdhX2hhbmRsZSk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGxvY2F0ZV9oYW5kbGUsCisJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwKKwkJCQl1Z2FfcHJvdG8sIE5VTEwsICZzaXplLCB1Z2FfaGFuZGxlKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZyZWVfaGFuZGxlOworCisJaGVpZ2h0ID0gMDsKKwl3aWR0aCA9IDA7CisKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KQorCQlzdGF0dXMgPSBzZXR1cF91Z2E2NCh1Z2FfaGFuZGxlLCBzaXplLCAmd2lkdGgsICZoZWlnaHQpOworCWVsc2UKKwkJc3RhdHVzID0gc2V0dXBfdWdhMzIodWdhX2hhbmRsZSwgc2l6ZSwgJndpZHRoLCAmaGVpZ2h0KTsKKworCWlmICghd2lkdGggJiYgIWhlaWdodCkKIAkJZ290byBmcmVlX2hhbmRsZTsKIAogCS8qIEVGSSBmcmFtZWJ1ZmZlciAqLwpAQCAtMzg0LDkgKzk3Nyw4IEBACiAJc2ktPnJzdmRfc2l6ZSA9IDg7CiAJc2ktPnJzdmRfcG9zID0gMjQ7CiAKLQogZnJlZV9oYW5kbGU6Ci0JZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlLT5ib290dGltZS0+ZnJlZV9wb29sLCB1Z2FfaGFuZGxlKTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIHVnYV9oYW5kbGUpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQwNCwyOSArOTk2LDI4IEBACiAJbWVtc2V0KHNpLCAwLCBzaXplb2YoKnNpKSk7CiAKIAlzaXplID0gMDsKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShzeXNfdGFibGUtPmJvb3R0aW1lLT5sb2NhdGVfaGFuZGxlLAotCQkJCUVGSV9MT0NBVEVfQllfUFJPVE9DT0wsICZncmFwaGljc19wcm90bywKLQkJCQlOVUxMLCAmc2l6ZSwgZ29wX2hhbmRsZSk7CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkobG9jYXRlX2hhbmRsZSwKKwkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLAorCQkJCSZncmFwaGljc19wcm90bywgTlVMTCwgJnNpemUsIGdvcF9oYW5kbGUpOwogCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpCiAJCXN0YXR1cyA9IHNldHVwX2dvcChzaSwgJmdyYXBoaWNzX3Byb3RvLCBzaXplKTsKIAogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJc2l6ZSA9IDA7Ci0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHN5c190YWJsZS0+Ym9vdHRpbWUtPmxvY2F0ZV9oYW5kbGUsCi0JCQkJCUVGSV9MT0NBVEVfQllfUFJPVE9DT0wsICZ1Z2FfcHJvdG8sCi0JCQkJCU5VTEwsICZzaXplLCB1Z2FfaGFuZGxlKTsKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkobG9jYXRlX2hhbmRsZSwKKwkJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwKKwkJCQkJJnVnYV9wcm90bywgTlVMTCwgJnNpemUsIHVnYV9oYW5kbGUpOwogCQlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKQogCQkJc2V0dXBfdWdhKHNpLCAmdWdhX3Byb3RvLCBzaXplKTsKIAl9CiB9CiAKLQogLyoKICAqIEJlY2F1c2UgdGhlIHg4NiBib290IGNvZGUgZXhwZWN0cyB0byBiZSBwYXNzZWQgYSBib290X3BhcmFtcyB3ZQogICogbmVlZCB0byBjcmVhdGUgb25lIG91cnNlbHZlcyAodXN1YWxseSB0aGUgYm9vdGxvYWRlciB3b3VsZCBjcmVhdGUKICAqIG9uZSBmb3IgdXMpLgogICovCi1zdHJ1Y3QgYm9vdF9wYXJhbXMgKm1ha2VfYm9vdF9wYXJhbXModm9pZCAqaGFuZGxlLCBlZmlfc3lzdGVtX3RhYmxlX3QgKl90YWJsZSkKK3N0cnVjdCBib290X3BhcmFtcyAqbWFrZV9ib290X3BhcmFtcyhzdHJ1Y3QgZWZpX2NvbmZpZyAqYykKIHsKIAlzdHJ1Y3QgYm9vdF9wYXJhbXMgKmJvb3RfcGFyYW1zOwogCXN0cnVjdCBzeXNfZGVzY190YWJsZSAqc2R0OwpAQCAtNDM0LDcgKzEwMjUsNyBAQAogCXN0cnVjdCBzZXR1cF9oZWFkZXIgKmhkcjsKIAlzdHJ1Y3QgZWZpX2luZm8gKmVmaTsKIAllZmlfbG9hZGVkX2ltYWdlX3QgKmltYWdlOwotCXZvaWQgKm9wdGlvbnM7CisJdm9pZCAqb3B0aW9ucywgKmhhbmRsZTsKIAllZmlfZ3VpZF90IHByb3RvID0gTE9BREVEX0lNQUdFX1BST1RPQ09MX0dVSUQ7CiAJaW50IG9wdGlvbnNfc2l6ZSA9IDA7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKQEAgLTQ0NSwxNCArMTAzNiwyMSBAQAogCXVuc2lnbmVkIGxvbmcgcmFtZGlza19hZGRyOwogCXVuc2lnbmVkIGxvbmcgcmFtZGlza19zaXplOwogCi0Jc3lzX3RhYmxlID0gX3RhYmxlOworCWVmaV9lYXJseSA9IGM7CisJc3lzX3RhYmxlID0gKGVmaV9zeXN0ZW1fdGFibGVfdCAqKSh1bnNpZ25lZCBsb25nKWVmaV9lYXJseS0+dGFibGU7CisJaGFuZGxlID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyllZmlfZWFybHktPmltYWdlX2hhbmRsZTsKIAogCS8qIENoZWNrIGlmIHdlIHdlcmUgYm9vdGVkIGJ5IHRoZSBFRkkgZmlybXdhcmUgKi8KIAlpZiAoc3lzX3RhYmxlLT5oZHIuc2lnbmF0dXJlICE9IEVGSV9TWVNURU1fVEFCTEVfU0lHTkFUVVJFKQogCQlyZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmhhbmRsZV9wcm90b2NvbCwKLQkJCQloYW5kbGUsICZwcm90bywgKHZvaWQgKikmaW1hZ2UpOworCWlmIChlZmlfZWFybHktPmlzNjQpCisJCXNldHVwX2Jvb3Rfc2VydmljZXM2NChlZmlfZWFybHkpOworCWVsc2UKKwkJc2V0dXBfYm9vdF9zZXJ2aWNlczMyKGVmaV9lYXJseSk7CisKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGhhbmRsZSwKKwkJCQkmcHJvdG8sICh2b2lkICopJmltYWdlKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGdldCBoYW5kbGUgZm9yIExPQURFRF9JTUFHRV9QUk9UT0NPTFxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtNjQxLDE0ICsxMjM5LDEzIEBACiAJCXNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KSAqIG5yX2Rlc2M7CiAKIAlpZiAoKmU4MjBleHQpIHsKLQkJZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlLT5ib290dGltZS0+ZnJlZV9wb29sLCAqZTgyMGV4dCk7CisJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgKmU4MjBleHQpOwogCQkqZTgyMGV4dCA9IE5VTEw7CiAJCSplODIwZXh0X3NpemUgPSAwOwogCX0KIAotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJRUZJX0xPQURFUl9EQVRBLCBzaXplLCBlODIwZXh0KTsKLQorCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwKKwkJCQlzaXplLCAodm9pZCAqKillODIwZXh0KTsKIAlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTKQogCQkqZTgyMGV4dF9zaXplID0gc2l6ZTsKIApAQCAtNjU2LDEyICsxMjUzLDEzIEBACiB9CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgZXhpdF9ib290KHN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXMsCi0JCQkgICAgICB2b2lkICpoYW5kbGUpCisJCQkgICAgICB2b2lkICpoYW5kbGUsIGJvb2wgaXM2NCkKIHsKIAlzdHJ1Y3QgZWZpX2luZm8gKmVmaSA9ICZib290X3BhcmFtcy0+ZWZpX2luZm87CiAJdW5zaWduZWQgbG9uZyBtYXBfc3osIGtleSwgZGVzY19zaXplOwogCWVmaV9tZW1vcnlfZGVzY190ICptZW1fbWFwOwogCXN0cnVjdCBzZXR1cF9kYXRhICplODIwZXh0OworCWNvbnN0IGNoYXIgKnNpZ25hdHVyZTsKIAlfX3UzMiBlODIwZXh0X3NpemU7CiAJX191MzIgbnJfZGVzYywgcHJldl9ucl9kZXNjOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CkBAIC02OTEsMTEgKzEyODksMTMgQEAKIAkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJCWdvdG8gZnJlZV9tZW1fbWFwOwogCi0JCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZS0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgbWVtX21hcCk7CisJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbWVtX21hcCk7CiAJCWdvdG8gZ2V0X21hcDsgLyogQWxsb2NhdGVkIG1lbW9yeSwgZ2V0IG1hcCBhZ2FpbiAqLwogCX0KIAotCW1lbWNweSgmZWZpLT5lZmlfbG9hZGVyX3NpZ25hdHVyZSwgRUZJX0xPQURFUl9TSUdOQVRVUkUsIHNpemVvZihfX3UzMikpOworCXNpZ25hdHVyZSA9IGlzNjQgPyBFRkk2NF9MT0FERVJfU0lHTkFUVVJFIDogRUZJMzJfTE9BREVSX1NJR05BVFVSRTsKKwltZW1jcHkoJmVmaS0+ZWZpX2xvYWRlcl9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKF9fdTMyKSk7CisKIAllZmktPmVmaV9zeXN0YWIgPSAodW5zaWduZWQgbG9uZylzeXNfdGFibGU7CiAJZWZpLT5lZmlfbWVtZGVzY19zaXplID0gZGVzY19zaXplOwogCWVmaS0+ZWZpX21lbWRlc2NfdmVyc2lvbiA9IGRlc2NfdmVyc2lvbjsKQEAgLTcwOCw4ICsxMzA4LDcgQEAKICNlbmRpZgogCiAJLyogTWlnaHQgYXMgd2VsbCBleGl0IGJvb3Qgc2VydmljZXMgbm93ICovCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czIoc3lzX3RhYmxlLT5ib290dGltZS0+ZXhpdF9ib290X3NlcnZpY2VzLAotCQkJCWhhbmRsZSwga2V5KTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShleGl0X2Jvb3Rfc2VydmljZXMsIGhhbmRsZSwga2V5KTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCS8qCiAJCSAqIEV4aXRCb290U2VydmljZXMoKSB3aWxsIGZhaWwgaWYgYW55IG9mIHRoZSBldmVudApAQCAtNzIyLDcgKzEzMjEsNyBAQAogCQkJZ290byBmcmVlX21lbV9tYXA7CiAKIAkJY2FsbGVkX2V4aXQgPSB0cnVlOwotCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIG1lbV9tYXApOworCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG1lbV9tYXApOwogCQlnb3RvIGdldF9tYXA7CiAJfQogCkBAIC03MzYsMjMgKzEzMzUsMzEgQEAKIAlyZXR1cm4gRUZJX1NVQ0NFU1M7CiAKIGZyZWVfbWVtX21hcDoKLQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIG1lbV9tYXApOworCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbWVtX21hcCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCiAvKgogICogT24gc3VjY2VzcyB3ZSByZXR1cm4gYSBwb2ludGVyIHRvIGEgYm9vdF9wYXJhbXMgc3RydWN0dXJlLCBhbmQgTlVMTAogICogb24gZmFpbHVyZS4KICAqLwotc3RydWN0IGJvb3RfcGFyYW1zICplZmlfbWFpbih2b2lkICpoYW5kbGUsIGVmaV9zeXN0ZW1fdGFibGVfdCAqX3RhYmxlLAorc3RydWN0IGJvb3RfcGFyYW1zICplZmlfbWFpbihzdHJ1Y3QgZWZpX2NvbmZpZyAqYywKIAkJCSAgICAgc3RydWN0IGJvb3RfcGFyYW1zICpib290X3BhcmFtcykKIHsKLQlzdHJ1Y3QgZGVzY19wdHIgKmdkdDsKKwlzdHJ1Y3QgZGVzY19wdHIgKmdkdCA9IE5VTEw7CiAJZWZpX2xvYWRlZF9pbWFnZV90ICppbWFnZTsKIAlzdHJ1Y3Qgc2V0dXBfaGVhZGVyICpoZHIgPSAmYm9vdF9wYXJhbXMtPmhkcjsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYzsKKwl2b2lkICpoYW5kbGU7CisJZWZpX3N5c3RlbV90YWJsZV90ICpfdGFibGU7CisJYm9vbCBpczY0OworCisJZWZpX2Vhcmx5ID0gYzsKKworCV90YWJsZSA9IChlZmlfc3lzdGVtX3RhYmxlX3QgKikodW5zaWduZWQgbG9uZyllZmlfZWFybHktPnRhYmxlOworCWhhbmRsZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpZWZpX2Vhcmx5LT5pbWFnZV9oYW5kbGU7CisJaXM2NCA9IGVmaV9lYXJseS0+aXM2NDsKIAogCXN5c190YWJsZSA9IF90YWJsZTsKIApAQCAtNzYwLDEzICsxMzY3LDE3IEBACiAJaWYgKHN5c190YWJsZS0+aGRyLnNpZ25hdHVyZSAhPSBFRklfU1lTVEVNX1RBQkxFX1NJR05BVFVSRSkKIAkJZ290byBmYWlsOwogCisJaWYgKGlzNjQpCisJCXNldHVwX2Jvb3Rfc2VydmljZXM2NChlZmlfZWFybHkpOworCWVsc2UKKwkJc2V0dXBfYm9vdF9zZXJ2aWNlczMyKGVmaV9lYXJseSk7CisKIAlzZXR1cF9ncmFwaGljcyhib290X3BhcmFtcyk7CiAKIAlzZXR1cF9lZmlfcGNpKGJvb3RfcGFyYW1zKTsKIAotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJRUZJX0xPQURFUl9EQVRBLCBzaXplb2YoKmdkdCksCi0JCQkJKHZvaWQgKiopJmdkdCk7CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAorCQkJCXNpemVvZigqZ2R0KSwgKHZvaWQgKiopJmdkdCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBhbGxvYyBtZW0gZm9yIGdkdCBzdHJ1Y3R1cmVcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC03OTcsNyArMTQwOCw3IEBACiAJCWhkci0+Y29kZTMyX3N0YXJ0ID0gYnppbWFnZV9hZGRyOwogCX0KIAotCXN0YXR1cyA9IGV4aXRfYm9vdChib290X3BhcmFtcywgaGFuZGxlKTsKKwlzdGF0dXMgPSBleGl0X2Jvb3QoYm9vdF9wYXJhbXMsIGhhbmRsZSwgaXM2NCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZ290byBmYWlsOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuaCBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5oCmluZGV4IDgxYjZiNjUuLmM4OGMzMWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5oCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5oCkBAIC0zNyw2ICszNywyNCBAQAogCXUzMiBwaXhlbHNfcGVyX3NjYW5fbGluZTsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sX21vZGVfMzIgeworCXUzMiBtYXhfbW9kZTsKKwl1MzIgbW9kZTsKKwl1MzIgaW5mbzsKKwl1MzIgc2l6ZV9vZl9pbmZvOworCXU2NCBmcmFtZV9idWZmZXJfYmFzZTsKKwl1MzIgZnJhbWVfYnVmZmVyX3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF9tb2RlXzY0IHsKKwl1MzIgbWF4X21vZGU7CisJdTMyIG1vZGU7CisJdTY0IGluZm87CisJdTY0IHNpemVfb2ZfaW5mbzsKKwl1NjQgZnJhbWVfYnVmZmVyX2Jhc2U7CisJdTY0IGZyYW1lX2J1ZmZlcl9zaXplOworfSBfX3BhY2tlZDsKKwogc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfbW9kZSB7CiAJdTMyIG1heF9tb2RlOwogCXUzMiBtb2RlOwpAQCAtNDYsNiArNjQsMjAgQEAKIAl1bnNpZ25lZCBsb25nIGZyYW1lX2J1ZmZlcl9zaXplOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfMzIgeworCXUzMiBxdWVyeV9tb2RlOworCXUzMiBzZXRfbW9kZTsKKwl1MzIgYmx0OworCXUzMiBtb2RlOworfTsKKworc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfNjQgeworCXU2NCBxdWVyeV9tb2RlOworCXU2NCBzZXRfbW9kZTsKKwl1NjQgYmx0OworCXU2NCBtb2RlOworfTsKKwogc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2wgewogCXZvaWQgKnF1ZXJ5X21vZGU7CiAJdW5zaWduZWQgbG9uZyBzZXRfbW9kZTsKQEAgLTUzLDEwICs4NSwzOCBAQAogCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sX21vZGUgKm1vZGU7CiB9OwogCitzdHJ1Y3QgZWZpX3VnYV9kcmF3X3Byb3RvY29sXzMyIHsKKwl1MzIgZ2V0X21vZGU7CisJdTMyIHNldF9tb2RlOworCXUzMiBibHQ7Cit9OworCitzdHJ1Y3QgZWZpX3VnYV9kcmF3X3Byb3RvY29sXzY0IHsKKwl1NjQgZ2V0X21vZGU7CisJdTY0IHNldF9tb2RlOworCXU2NCBibHQ7Cit9OworCiBzdHJ1Y3QgZWZpX3VnYV9kcmF3X3Byb3RvY29sIHsKIAl2b2lkICpnZXRfbW9kZTsKIAl2b2lkICpzZXRfbW9kZTsKIAl2b2lkICpibHQ7CiB9OwogCitzdHJ1Y3QgZWZpX2NvbmZpZyB7CisJdTY0IGltYWdlX2hhbmRsZTsKKwl1NjQgdGFibGU7CisJdTY0IGFsbG9jYXRlX3Bvb2w7CisJdTY0IGFsbG9jYXRlX3BhZ2VzOworCXU2NCBnZXRfbWVtb3J5X21hcDsKKwl1NjQgZnJlZV9wb29sOworCXU2NCBmcmVlX3BhZ2VzOworCXU2NCBsb2NhdGVfaGFuZGxlOworCXU2NCBoYW5kbGVfcHJvdG9jb2w7CisJdTY0IGV4aXRfYm9vdF9zZXJ2aWNlczsKKwl1NjQgdGV4dF9vdXRwdXQ7CisJZWZpX3N0YXR1c190ICgqY2FsbCkodW5zaWduZWQgbG9uZywgLi4uKTsKKwlib29sIGlzNjQ7Cit9IF9fcGFja2VkOworCiAjZW5kaWYgLyogQk9PVF9DT01QUkVTU0VEX0VCT09UX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lZmlfc3R1Yl82NC5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2VmaV9zdHViXzY0LlMKaW5kZXggY2VkYzYwZC4uN2ZmMzYzMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2VmaV9zdHViXzY0LlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2VmaV9zdHViXzY0LlMKQEAgLTEgKzEsMzAgQEAKKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CisKICNpbmNsdWRlICIuLi8uLi9wbGF0Zm9ybS9lZmkvZWZpX3N0dWJfNjQuUyIKKworI2lmZGVmIENPTkZJR19FRklfTUlYRUQKKwkuY29kZTY0CisJLnRleHQKK0VOVFJZKGVmaTY0X3RodW5rKQorCXB1c2gJJXJicAorCXB1c2gJJXJieAorCisJc3VicQkkMTYsICVyc3AKKwlsZWFxCWVmaV9leGl0MzIoJXJpcCksICVyYXgKKwltb3ZsCSVlYXgsIDgoJXJzcCkKKwlsZWFxCWVmaV9nZHQ2NCglcmlwKSwgJXJheAorCW1vdmwJJWVheCwgNCglcnNwKQorCW1vdmwJJWVheCwgMiglcmF4KQkJLyogRml4dXAgdGhlIGdkdCBiYXNlIGFkZHJlc3MgKi8KKwlsZWFxCWVmaTMyX2Jvb3RfZ2R0KCVyaXApLCAlcmF4CisJbW92bAklZWF4LCAoJXJzcCkKKworCWNhbGwJX19lZmk2NF90aHVuaworCisJYWRkcQkkMTYsICVyc3AKKwlwb3AJJXJieAorCXBvcAklcmJwCisJcmV0CitFTkRQUk9DKGVmaTY0X3RodW5rKQorI2VuZGlmIC8qIENPTkZJR19FRklfTUlYRUQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCmluZGV4IDkxMTZhYWMuLmRlOWQ0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwpAQCAtNDIsMjYgKzQyLDUzIEBACiBFTlRSWShlZmlfcGVfZW50cnkpCiAJYWRkCSQweDQsICVlc3AKIAorCWNhbGwJMWYKKzE6CXBvcGwJJWVzaQorCXN1YmwJJDFiLCAlZXNpCisKKwlwb3BsCSVlY3gKKwltb3ZsCSVlY3gsIGVmaTMyX2NvbmZpZyglZXNpKQkvKiBIYW5kbGUgKi8KKwlwb3BsCSVlY3gKKwltb3ZsCSVlY3gsIGVmaTMyX2NvbmZpZys4KCVlc2kpCS8qIEVGSSBTeXN0ZW0gdGFibGUgcG9pbnRlciAqLworCisJLyogUmVsb2NhdGUgZWZpX2NvbmZpZy0+Y2FsbCgpICovCisJbGVhbAllZmkzMl9jb25maWcoJWVzaSksICVlYXgKKwlhZGQJJWVzaSwgODgoJWVheCkKKwlwdXNobAklZWF4CisKIAljYWxsCW1ha2VfYm9vdF9wYXJhbXMKIAljbXBsCSQwLCAlZWF4Ci0JamUJMWYKLQltb3ZsCTB4NCglZXNwKSwgJWVzaQotCW1vdmwJKCVlc3ApLCAlZWN4CisJamUJZmFpbAorCXBvcGwJJWVjeAogCXB1c2hsCSVlYXgKLQlwdXNobAklZXNpCiAJcHVzaGwJJWVjeAotCXN1YgkkMHg0LCAlZXNwCisJam1wCTJmCQkvKiBTa2lwIGVmaV9jb25maWcgaW5pdGlhbGl6YXRpb24gKi8KIAotRU5UUlkoZWZpX3N0dWJfZW50cnkpCitFTlRSWShlZmkzMl9zdHViX2VudHJ5KQogCWFkZAkkMHg0LCAlZXNwCisJcG9wbAklZWN4CisJcG9wbAklZWR4CisKKwljYWxsCTFmCisxOglwb3BsCSVlc2kKKwlzdWJsCSQxYiwgJWVzaQorCisJbW92bAklZWN4LCBlZmkzMl9jb25maWcoJWVzaSkJLyogSGFuZGxlICovCisJbW92bAklZWR4LCBlZmkzMl9jb25maWcrOCglZXNpKQkvKiBFRkkgU3lzdGVtIHRhYmxlIHBvaW50ZXIgKi8KKworCS8qIFJlbG9jYXRlIGVmaV9jb25maWctPmNhbGwoKSAqLworCWxlYWwJZWZpMzJfY29uZmlnKCVlc2kpLCAlZWF4CisJYWRkCSVlc2ksIDg4KCVlYXgpCisJcHVzaGwJJWVheAorMjoKIAljYWxsCWVmaV9tYWluCiAJY21wbAkkMCwgJWVheAogCW1vdmwJJWVheCwgJWVzaQogCWpuZQkyZgotMToKK2ZhaWw6CiAJLyogRUZJIGluaXQgZmFpbGVkLCBzbyBoYW5nLiAqLwogCWhsdAotCWptcAkxYgorCWptcAlmYWlsCiAyOgogCWNhbGwJM2YKIDM6CkBAIC0yMDIsNiArMjI5LDE1IEBACiAJeG9ybAklZWJ4LCAlZWJ4CiAJam1wCSolZWF4CiAKKyNpZmRlZiBDT05GSUdfRUZJX1NUVUIKKwkuZGF0YQorZWZpMzJfY29uZmlnOgorCS5maWxsIDExLDgsMAorCS5sb25nIGVmaV9jYWxsX3BoeXMKKwkubG9uZyAwCisJLmJ5dGUgMAorI2VuZGlmCisKIC8qCiAgKiBTdGFjayBhbmQgaGVhcCBmb3IgdW5jb21wcmVzc2lvbgogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwppbmRleCBjNWMxYWUwLi41N2U1OGE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKQEAgLTExMyw3ICsxMTMsOCBAQAogCWxnZHQJZ2R0KCVlYnApCiAKIAkvKiBFbmFibGUgUEFFIG1vZGUgKi8KLQltb3ZsCSQoWDg2X0NSNF9QQUUpLCAlZWF4CisJbW92bAklY3I0LCAlZWF4CisJb3JsCSRYODZfQ1I0X1BBRSwgJWVheAogCW1vdmwJJWVheCwgJWNyNAogCiAgLyoKQEAgLTE3OCw2ICsxNzksMTMgQEAKIAkgKi8KIAlwdXNobAkkX19LRVJORUxfQ1MKIAlsZWFsCXN0YXJ0dXBfNjQoJWVicCksICVlYXgKKyNpZmRlZiBDT05GSUdfRUZJX01JWEVECisJbW92bAllZmkzMl9jb25maWcoJWVicCksICVlYngKKwljbXAJJDAsICVlYngKKwlqegkxZgorCWxlYWwJaGFuZG92ZXJfZW50cnkoJWVicCksICVlYXgKKzE6CisjZW5kaWYKIAlwdXNobAklZWF4CiAKIAkvKiBFbnRlciBwYWdlZCBwcm90ZWN0ZWQgTW9kZSwgYWN0aXZhdGluZyBMb25nIE1vZGUgKi8KQEAgLTE4OCw2ICsxOTYsMzAgQEAKIAlscmV0CiBFTkRQUk9DKHN0YXJ0dXBfMzIpCiAKKyNpZmRlZiBDT05GSUdfRUZJX01JWEVECisJLm9yZyAweDE5MAorRU5UUlkoZWZpMzJfc3R1Yl9lbnRyeSkKKwlhZGQJJDB4NCwgJWVzcAkJLyogRGlzY2FyZCByZXR1cm4gYWRkcmVzcyAqLworCXBvcGwJJWVjeAorCXBvcGwJJWVkeAorCXBvcGwJJWVzaQorCisJbGVhbAkoQlBfc2NyYXRjaCs0KSglZXNpKSwgJWVzcAorCWNhbGwJMWYKKzE6CXBvcAklZWJwCisJc3VibAkkMWIsICVlYnAKKworCW1vdmwJJWVjeCwgZWZpMzJfY29uZmlnKCVlYnApCisJbW92bAklZWR4LCBlZmkzMl9jb25maWcrOCglZWJwKQorCXNnZHRsCWVmaTMyX2Jvb3RfZ2R0KCVlYnApCisKKwlsZWFsCWVmaTMyX2NvbmZpZyglZWJwKSwgJWVheAorCW1vdmwJJWVheCwgZWZpX2NvbmZpZyglZWJwKQorCisJam1wCXN0YXJ0dXBfMzIKK0VORFBST0MoZWZpMzJfc3R1Yl9lbnRyeSkKKyNlbmRpZgorCiAJLmNvZGU2NAogCS5vcmcgMHgyMDAKIEVOVFJZKHN0YXJ0dXBfNjQpCkBAIC0yMDksMjYgKzI0MSw0OCBAQAogCWptcAlwcmVmZXJyZWRfYWRkcgogCiBFTlRSWShlZmlfcGVfZW50cnkpCi0JbW92CSVyY3gsICVyZGkKLQltb3YJJXJkeCwgJXJzaQotCXB1c2hxCSVyZGkKLQlwdXNocQklcnNpCisJbW92cQklcmN4LCBlZmk2NF9jb25maWcoJXJpcCkJLyogSGFuZGxlICovCisJbW92cQklcmR4LCBlZmk2NF9jb25maWcrOCglcmlwKSAvKiBFRkkgU3lzdGVtIHRhYmxlIHBvaW50ZXIgKi8KKworCWxlYXEJZWZpNjRfY29uZmlnKCVyaXApLCAlcmF4CisJbW92cQklcmF4LCBlZmlfY29uZmlnKCVyaXApCisKKwljYWxsCTFmCisxOglwb3BxCSVyYnAKKwlzdWJxCSQxYiwgJXJicAorCisJLyoKKwkgKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkuCisJICovCisJYWRkcQklcmJwLCBlZmk2NF9jb25maWcrODgoJXJpcCkKKworCW1vdnEJJXJheCwgJXJkaQogCWNhbGwJbWFrZV9ib290X3BhcmFtcwogCWNtcHEJJDAsJXJheAotCWplCTFmCi0JbW92CSVyYXgsICVyZHgKLQlwb3BxCSVyc2kKLQlwb3BxCSVyZGkKKwlqZQlmYWlsCisJbW92CSVyYXgsICVyc2kKKwlqbXAJMmYJCS8qIFNraXAgdGhlIHJlbG9jYXRpb24gKi8KIAotRU5UUlkoZWZpX3N0dWJfZW50cnkpCitoYW5kb3Zlcl9lbnRyeToKKwljYWxsCTFmCisxOglwb3BxCSVyYnAKKwlzdWJxCSQxYiwgJXJicAorCisJLyoKKwkgKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkuCisJICovCisJbW92cQllZmlfY29uZmlnKCVyaXApLCAlcmF4CisJYWRkcQklcmJwLCA4OCglcmF4KQorMjoKKwltb3ZxCWVmaV9jb25maWcoJXJpcCksICVyZGkKIAljYWxsCWVmaV9tYWluCiAJbW92cQklcmF4LCVyc2kKIAljbXBxCSQwLCVyYXgKIAlqbmUJMmYKLTE6CitmYWlsOgogCS8qIEVGSSBpbml0IGZhaWxlZCwgc28gaGFuZy4gKi8KIAlobHQKLQlqbXAJMWIKKwlqbXAJZmFpbAogMjoKIAljYWxsCTNmCiAzOgpAQCAtMzA3LDYgKzM2MSwyMCBAQAogCWxlYXEJcmVsb2NhdGVkKCVyYngpLCAlcmF4CiAJam1wCSolcmF4CiAKKyNpZmRlZiBDT05GSUdfRUZJX1NUVUIKKwkub3JnIDB4MzkwCitFTlRSWShlZmk2NF9zdHViX2VudHJ5KQorCW1vdnEJJXJkaSwgZWZpNjRfY29uZmlnKCVyaXApCS8qIEhhbmRsZSAqLworCW1vdnEJJXJzaSwgZWZpNjRfY29uZmlnKzgoJXJpcCkgLyogRUZJIFN5c3RlbSB0YWJsZSBwb2ludGVyICovCisKKwlsZWFxCWVmaTY0X2NvbmZpZyglcmlwKSwgJXJheAorCW1vdnEJJXJheCwgZWZpX2NvbmZpZyglcmlwKQorCisJbW92cQklcmR4LCAlcnNpCisJam1wCWhhbmRvdmVyX2VudHJ5CitFTkRQUk9DKGVmaTY0X3N0dWJfZW50cnkpCisjZW5kaWYKKwogCS50ZXh0CiByZWxvY2F0ZWQ6CiAKQEAgLTM3Miw2ICs0NDAsMjUgQEAKIAkucXVhZCAgIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiBUUyBjb250aW51ZWQgKi8KIGdkdF9lbmQ6CiAKKyNpZmRlZiBDT05GSUdfRUZJX1NUVUIKK2VmaV9jb25maWc6CisJLnF1YWQJMAorCisjaWZkZWYgQ09ORklHX0VGSV9NSVhFRAorCS5nbG9iYWwgZWZpMzJfY29uZmlnCitlZmkzMl9jb25maWc6CisJLmZpbGwJMTEsOCwwCisJLnF1YWQJZWZpNjRfdGh1bmsKKwkuYnl0ZQkwCisjZW5kaWYKKworCS5nbG9iYWwgZWZpNjRfY29uZmlnCitlZmk2NF9jb25maWc6CisJLmZpbGwJMTEsOCwwCisJLnF1YWQJZWZpX2NhbGw2CisJLmJ5dGUJMQorI2VuZGlmIC8qIENPTkZJR19FRklfU1RVQiAqLworCiAvKgogICogU3RhY2sgYW5kIGhlYXAgZm9yIHVuY29tcHJlc3Npb24KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggMTk2ZWFmMy4uMTc2ODQ2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICIuLi9zdHJpbmcuaCIKIAogLyogV0FSTklORyEhCiAgKiBUaGlzIGNvZGUgaXMgY29tcGlsZWQgd2l0aCAtZlBJQyBhbmQgaXQgaXMgcmVsb2NhdGVkIGR5bmFtaWNhbGx5CkBAIC05Nyw4ICs5OCwxNCBAQAogICovCiAjZGVmaW5lIFNUQVRJQwkJc3RhdGljCiAKLSN1bmRlZiBtZW1zZXQKICN1bmRlZiBtZW1jcHkKKworLyoKKyAqIFVzZSBhIG5vcm1hbCBkZWZpbml0aW9uIG9mIG1lbXNldCgpIGZyb20gc3RyaW5nLmMuIFRoZXJlIGFyZSBhbHJlYWR5CisgKiBpbmNsdWRlZCBoZWFkZXIgZmlsZXMgd2hpY2ggZXhwZWN0IGEgZGVmaW5pdGlvbiBvZiBtZW1zZXQoKSBhbmQgYnkKKyAqIHRoZSB0aW1lIHdlIGRlZmluZSBtZW1zZXQgbWFjcm8sIGl0IGlzIHRvbyBsYXRlLgorICovCisjdW5kZWYgbWVtc2V0CiAjZGVmaW5lIG1lbXplcm8ocywgbikJbWVtc2V0KChzKSwgMCwgKG4pKQogCiAKQEAgLTEwOSw5ICsxMTYsNiBAQAogICovCiBzdHJ1Y3QgYm9vdF9wYXJhbXMgKnJlYWxfbW9kZTsJCS8qIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGRhdGEgKi8KIAotdm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7Ci12b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7Ci0KIG1lbXB0ciBmcmVlX21lbV9wdHI7CiBtZW1wdHIgZnJlZV9tZW1fZW5kX3B0cjsKIApAQCAtMjE2LDQ1ICsyMjAsNiBAQAogCW91dGIoMHhmZiAmIChwb3MgPj4gMSksIHZpZHBvcnQrMSk7CiB9CiAKLXZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCi17Ci0JaW50IGk7Ci0JY2hhciAqc3MgPSBzOwotCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJc3NbaV0gPSBjOwotCXJldHVybiBzOwotfQotI2lmZGVmIENPTkZJR19YODZfMzIKLXZvaWQgKm1lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQotewotCWludCBkMCwgZDEsIGQyOwotCWFzbSB2b2xhdGlsZSgKLQkJInJlcCA7IG1vdnNsXG5cdCIKLQkJIm1vdmwgJTQsJSVlY3hcblx0IgotCQkicmVwIDsgbW92c2Jcblx0IgotCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKLQkJOiAiMCIgKG4gPj4gMiksICJnIiAobiAmIDMpLCAiMSIgKGRlc3QpLCAiMiIgKHNyYykKLQkJOiAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gZGVzdDsKLX0KLSNlbHNlCi12b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKLXsKLQlsb25nIGQwLCBkMSwgZDI7Ci0JYXNtIHZvbGF0aWxlKAotCQkicmVwIDsgbW92c3Fcblx0IgotCQkibW92cSAlNCwlJXJjeFxuXHQiCi0JCSJyZXAgOyBtb3ZzYlxuXHQiCi0JCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKQotCQk6ICIwIiAobiA+PiAzKSwgImciIChuICYgNyksICIxIiAoZGVzdCksICIyIiAoc3JjKQotCQk6ICJtZW1vcnkiKTsKLQotCXJldHVybiBkZXN0OwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGVycm9yKGNoYXIgKngpCiB7CiAJZXJyb3JfcHV0c3RyKCJcblxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKaW5kZXggZmZiOWM1Yy4uZjNjNTdlMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYwpAQCAtMSwxMSArMSw0NSBAQAogI2luY2x1ZGUgIm1pc2MuaCIKLQotaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCi17Ci0JdTggZGlmZjsKLQlhc20oInJlcGU7IGNtcHNiOyBzZXRueiAlMCIKLQkgICAgOiAiPXFtIiAoZGlmZiksICIrRCIgKHMxKSwgIitTIiAoczIpLCAiK2MiIChsZW4pKTsKLQlyZXR1cm4gZGlmZjsKLX0KLQogI2luY2x1ZGUgIi4uL3N0cmluZy5jIgorCisvKiBtaXNjLmggbWlnaHQgcHVsbCBpbiBzdHJpbmdfMzIuaCB3aGljaCBoYXMgYSBtYWNybyBmb3IgbWVtY3B5LiB1bmRlZiB0aGF0ICovCisjdW5kZWYgbWVtY3B5CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCit2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwlpbnQgZDAsIGQxLCBkMjsKKwlhc20gdm9sYXRpbGUoCisJCSJyZXAgOyBtb3ZzbFxuXHQiCisJCSJtb3ZsICU0LCUlZWN4XG5cdCIKKwkJInJlcCA7IG1vdnNiXG5cdCIKKwkJOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpCisJCTogIjAiIChuID4+IDIpLCAiZyIgKG4gJiAzKSwgIjEiIChkZXN0KSwgIjIiIChzcmMpCisJCTogIm1lbW9yeSIpOworCisJcmV0dXJuIGRlc3Q7Cit9CisjZWxzZQordm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJbG9uZyBkMCwgZDEsIGQyOworCWFzbSB2b2xhdGlsZSgKKwkJInJlcCA7IG1vdnNxXG5cdCIKKwkJIm1vdnEgJTQsJSVyY3hcblx0IgorCQkicmVwIDsgbW92c2Jcblx0IgorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKKwkJOiAiMCIgKG4gPj4gMyksICJnIiAobiAmIDcpLCAiMSIgKGRlc3QpLCAiMiIgKHNyYykKKwkJOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgorCit2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWludCBpOworCWNoYXIgKnNzID0gczsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXNzW2ldID0gYzsKKwlyZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY3B1Y2hlY2suYyBiL2FyY2gveDg2L2Jvb3QvY3B1Y2hlY2suYwppbmRleCAxMDBhOWExLi4xZmQ3ZDU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NwdWNoZWNrLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jcHVjaGVjay5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgogI2luY2x1ZGUgPGFzbS9yZXF1aXJlZC1mZWF0dXJlcy5oPgogI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogc3RhdGljIHUzMiBlcnJfZmxhZ3NbTkNBUElOVFNdOwogCkBAIC02Nyw2ICs2OCwxMyBAQAogCSAgICAgICBjcHVfdmVuZG9yWzJdID09IEEzMignTScsICd4JywgJzgnLCAnNicpOwogfQogCitzdGF0aWMgaW50IGlzX2ludGVsKHZvaWQpCit7CisJcmV0dXJuIGNwdV92ZW5kb3JbMF0gPT0gQTMyKCdHJywgJ2UnLCAnbicsICd1JykgJiYKKwkgICAgICAgY3B1X3ZlbmRvclsxXSA9PSBBMzIoJ2knLCAnbicsICdlJywgJ0knKSAmJgorCSAgICAgICBjcHVfdmVuZG9yWzJdID09IEEzMignbicsICd0JywgJ2UnLCAnbCcpOworfQorCiAvKiBSZXR1cm5zIGEgYml0bWFzayBvZiB3aGljaCB3b3JkcyB3ZSBoYXZlIGVycm9yIGJpdHMgaW4gKi8KIHN0YXRpYyBpbnQgY2hlY2tfY3B1ZmxhZ3Modm9pZCkKIHsKQEAgLTE1Myw2ICsxNjEsMTkgQEAKIAkJYXNtKCJ3cm1zciIgOiA6ICJhIiAoZWF4KSwgImQiIChlZHgpLCAiYyIgKGVjeCkpOwogCiAJCWVyciA9IGNoZWNrX2NwdWZsYWdzKCk7CisJfSBlbHNlIGlmIChlcnIgPT0gMHgwMSAmJgorCQkgICAhKGVycl9mbGFnc1swXSAmIH4oMSA8PCBYODZfRkVBVFVSRV9QQUUpKSAmJgorCQkgICBpc19pbnRlbCgpICYmIGNwdS5sZXZlbCA9PSA2ICYmCisJCSAgIChjcHUubW9kZWwgPT0gOSB8fCBjcHUubW9kZWwgPT0gMTMpKSB7CisJCS8qIFBBRSBpcyBkaXNhYmxlZCBvbiB0aGlzIFBlbnRpdW0gTSBidXQgY2FuIGJlIGZvcmNlZCAqLworCQlpZiAoY21kbGluZV9maW5kX29wdGlvbl9ib29sKCJmb3JjZXBhZSIpKSB7CisJCQlwdXRzKCJXQVJOSU5HOiBGb3JjaW5nIFBBRSBpbiBDUFUgZmxhZ3NcbiIpOworCQkJc2V0X2JpdChYODZfRkVBVFVSRV9QQUUsIGNwdS5mbGFncyk7CisJCQllcnIgPSBjaGVja19jcHVmbGFncygpOworCQl9CisJCWVsc2UgeworCQkJcHV0cygiV0FSTklORzogUEFFIGRpc2FibGVkLiBVc2UgcGFyYW1ldGVyICdmb3JjZXBhZScgdG8gZW5hYmxlIGF0IHlvdXIgb3duIHJpc2shXG4iKTsKKwkJfQogCX0KIAogCWlmIChlcnJfZmxhZ3NfcHRyKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9lZGQuYyBiL2FyY2gveDg2L2Jvb3QvZWRkLmMKaW5kZXggYzUwMWE1Yi4uMjIzZTQyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9lZGQuYworKysgYi9hcmNoL3g4Ni9ib290L2VkZC5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlICJib290LmgiCiAjaW5jbHVkZSA8bGludXgvZWRkLmg+CisjaW5jbHVkZSAic3RyaW5nLmgiCiAKICNpZiBkZWZpbmVkKENPTkZJR19FREQpIHx8IGRlZmluZWQoQ09ORklHX0VERF9NT0RVTEUpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMgYi9hcmNoL3g4Ni9ib290L2hlYWRlci5TCmluZGV4IGVjM2I4YmEuLjBjYTlhNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9oZWFkZXIuUwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJIyBQYXJ0IDIgb2YgdGhlIGhlYWRlciwgZnJvbSB0aGUgb2xkIHNldHVwLlMKIAogCQkuYXNjaWkJIkhkclMiCQkjIGhlYWRlciBzaWduYXR1cmUKLQkJLndvcmQJMHgwMjBjCQkjIGhlYWRlciB2ZXJzaW9uIG51bWJlciAoPj0gMHgwMTA1KQorCQkud29yZAkweDAyMGQJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCiAJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQogCQkuZ2xvYmwgcmVhbG1vZGVfc3d0Y2gKIHJlYWxtb2RlX3N3dGNoOgkud29yZAkwLCAwCQkjIGRlZmF1bHRfc3dpdGNoLCBTRVRVUFNFRwpAQCAtMzUwLDcgKzM1MCw3IEBACiAJCQkJCSMgY2FuIGJlIGxvY2F0ZWQgYW55d2hlcmUgaW4KIAkJCQkJIyBsb3cgbWVtb3J5IDB4MTAwMDAgb3IgaGlnaGVyLgogCi1yYW1kaXNrX21heDoJLmxvbmcgMHg3ZmZmZmZmZgoraW5pdHJkX2FkZHJfbWF4OiAubG9uZyAweDdmZmZmZmZmCiAJCQkJCSMgKEhlYWRlciB2ZXJzaW9uIDB4MDIwMyBvciBsYXRlcikKIAkJCQkJIyBUaGUgaGlnaGVzdCBzYWZlIGFkZHJlc3MgZm9yCiAJCQkJCSMgdGhlIGNvbnRlbnRzIG9mIGFuIGluaXRyZApAQCAtMzc1LDcgKzM3NSw4IEBACiAjIGRlZmluZSBYTEYwIDAKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUkVMT0NBVEFCTEUpICYmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKKyNpZiBkZWZpbmVkKENPTkZJR19SRUxPQ0FUQUJMRSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBcCisJIWRlZmluZWQoQ09ORklHX0VGSV9NSVhFRCkKICAgIC8qIGtlcm5lbC9ib290X3BhcmFtL3JhbWRpc2sgY291bGQgYmUgbG9hZGVkIGFib3ZlIDRnICovCiAjIGRlZmluZSBYTEYxIFhMRl9DQU5fQkVfTE9BREVEX0FCT1ZFXzRHCiAjZWxzZQpAQCAtMzgzLDEwICszODQsMTQgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0VGSV9TVFVCCi0jIGlmZGVmIENPTkZJR19YODZfNjQKLSMgIGRlZmluZSBYTEYyMyBYTEZfRUZJX0hBTkRPVkVSXzY0CQkvKiA2NC1iaXQgRUZJIGhhbmRvdmVyIG9rICovCisjIGlmZGVmIENPTkZJR19FRklfTUlYRUQKKyMgIGRlZmluZSBYTEYyMyAoWExGX0VGSV9IQU5ET1ZFUl8zMnxYTEZfRUZJX0hBTkRPVkVSXzY0KQogIyBlbHNlCi0jICBkZWZpbmUgWExGMjMgWExGX0VGSV9IQU5ET1ZFUl8zMgkJLyogMzItYml0IEVGSSBoYW5kb3ZlciBvayAqLworIyAgaWZkZWYgQ09ORklHX1g4Nl82NAorIyAgIGRlZmluZSBYTEYyMyBYTEZfRUZJX0hBTkRPVkVSXzY0CQkvKiA2NC1iaXQgRUZJIGhhbmRvdmVyIG9rICovCisjICBlbHNlCisjICAgZGVmaW5lIFhMRjIzIFhMRl9FRklfSEFORE9WRVJfMzIJCS8qIDMyLWJpdCBFRkkgaGFuZG92ZXIgb2sgKi8KKyMgIGVuZGlmCiAjIGVuZGlmCiAjZWxzZQogIyBkZWZpbmUgWExGMjMgMApAQCAtNDI2LDEzICs0MzEsNyBAQAogI2RlZmluZSBJTklUX1NJWkUgVk9fSU5JVF9TSVpFCiAjZW5kaWYKIGluaXRfc2l6ZToJCS5sb25nIElOSVRfU0laRQkJIyBrZXJuZWwgaW5pdGlhbGl6YXRpb24gc2l6ZQotaGFuZG92ZXJfb2Zmc2V0OgotI2lmZGVmIENPTkZJR19FRklfU1RVQgotICAJCQkubG9uZyAweDMwCQkjIG9mZnNldCB0byB0aGUgaGFuZG92ZXIKLQkJCQkJCSMgcHJvdG9jb2wgZW50cnkgcG9pbnQKLSNlbHNlCi0JCQkubG9uZyAwCi0jZW5kaWYKK2hhbmRvdmVyX29mZnNldDoJLmxvbmcgMAkJCSMgRmlsbGVkIGluIGJ5IGJ1aWxkLmMKIAogIyBFbmQgb2Ygc2V0dXAgaGVhZGVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvbWFpbi5jIGIvYXJjaC94ODYvYm9vdC9tYWluLmMKaW5kZXggY2Y2MDgzZC4uZmQ2YzlmMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9tYWluLmMKKysrIGIvYXJjaC94ODYvYm9vdC9tYWluLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYm9vdC5oIgorI2luY2x1ZGUgInN0cmluZy5oIgogCiBzdHJ1Y3QgYm9vdF9wYXJhbXMgYm9vdF9wYXJhbXMgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9yZWdzLmMgYi9hcmNoL3g4Ni9ib290L3JlZ3MuYwppbmRleCA5NTgwMTliLi5jMGZiMzU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3JlZ3MuYworKysgYi9hcmNoL3g4Ni9ib290L3JlZ3MuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlICJib290LmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCiAKIHZvaWQgaW5pdHJlZ3Moc3RydWN0IGJpb3NyZWdzICpyZWcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3N0cmluZy5jIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuYwppbmRleCA1NzRkZWRmLi41MzM5MDQwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3N0cmluZy5jCisrKyBiL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMKQEAgLTE0LDYgKzE0LDIwIEBACiAKICNpbmNsdWRlICJib290LmgiCiAKKy8qCisgKiBUaGlzIGZpbGUgZ2V0cyBpbmNsdWRlZCBpbiBjb21wcmVzc2VkL3N0cmluZy5jIHdoaWNoIG1pZ2h0IHB1bGwgaW4KKyAqIHN0cmluZ18zMi5oIGFuZCB3aGljaCBpbiB0dXJuIG1hcHMgbWVtY21wIHRvIF9fYnVpbHRpbl9tZW1jbXAoKS4gVW5kbworICogdGhhdCBmaXJzdC4KKyAqLworI3VuZGVmIG1lbWNtcAoraW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCit7CisJdTggZGlmZjsKKwlhc20oInJlcGU7IGNtcHNiOyBzZXRueiAlMCIKKwkgICAgOiAiPXFtIiAoZGlmZiksICIrRCIgKHMxKSwgIitTIiAoczIpLCAiK2MiIChsZW4pKTsKKwlyZXR1cm4gZGlmZjsKK30KKwogaW50IHN0cmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKQogewogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzdHIxOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9zdHJpbmcuaCBiL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1ZTgyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBCT09UX1NUUklOR19ICisjZGVmaW5lIEJPT1RfU1RSSU5HX0gKKworLyogVW5kZWYgYW55IG9mIHRoZXNlIG1hY3JvcyBjb21pbmcgZnJvbSBzdHJpbmdfMzIuaC4gKi8KKyN1bmRlZiBtZW1jcHkKKyN1bmRlZiBtZW1zZXQKKyN1bmRlZiBtZW1jbXAKKwordm9pZCAqbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKK3ZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuKTsKK2ludCBtZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3QgbGVuKTsKKworLyoKKyAqIEFjY2VzcyBidWlsdGluIHZlcnNpb24gYnkgZGVmYXVsdC4gSWYgb25lIG5lZWRzIHRvIHVzZSBvcHRpbWl6ZWQgdmVyc2lvbiwKKyAqIGRvICJ1bmRlZiBtZW1jcHkiIGluIC5jIGZpbGUgYW5kIGxpbmsgYWdhaW5zdCByaWdodCBzdHJpbmcuYworICovCisjZGVmaW5lIG1lbWNweShkLHMsbCkgX19idWlsdGluX21lbWNweShkLHMsbCkKKyNkZWZpbmUgbWVtc2V0KGQsYyxsKSBfX2J1aWx0aW5fbWVtc2V0KGQsYyxsKQorI2RlZmluZSBtZW1jbXAJX19idWlsdGluX21lbWNtcAorCisjZW5kaWYgLyogQk9PVF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC94ODYvYm9vdC90b29scy9idWlsZC5jCmluZGV4IDhlMTViMjIuLjFhMmYyMTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdG9vbHMvYnVpbGQuYworKysgYi9hcmNoL3g4Ni9ib290L3Rvb2xzL2J1aWxkLmMKQEAgLTUzLDcgKzUzLDggQEAKIAogI2RlZmluZSBQRUNPRkZfUkVMT0NfUkVTRVJWRSAweDIwCiAKLXVuc2lnbmVkIGxvbmcgZWZpX3N0dWJfZW50cnk7Cit1bnNpZ25lZCBsb25nIGVmaTMyX3N0dWJfZW50cnk7Cit1bnNpZ25lZCBsb25nIGVmaTY0X3N0dWJfZW50cnk7CiB1bnNpZ25lZCBsb25nIGVmaV9wZV9lbnRyeTsKIHVuc2lnbmVkIGxvbmcgc3RhcnR1cF82NDsKIApAQCAtMjE5LDYgKzIyMCw1MiBAQAogCXVwZGF0ZV9wZWNvZmZfc2VjdGlvbl9oZWFkZXIoIi50ZXh0IiwgdGV4dF9zdGFydCwgdGV4dF9zeik7CiB9CiAKK3N0YXRpYyBpbnQgcmVzZXJ2ZV9wZWNvZmZfcmVsb2Nfc2VjdGlvbihpbnQgYykKK3sKKwkvKiBSZXNlcnZlIDB4MjAgYnl0ZXMgZm9yIC5yZWxvYyBzZWN0aW9uICovCisJbWVtc2V0KGJ1ZitjLCAwLCBQRUNPRkZfUkVMT0NfUkVTRVJWRSk7CisJcmV0dXJuIFBFQ09GRl9SRUxPQ19SRVNFUlZFOworfQorCitzdGF0aWMgdm9pZCBlZmlfc3R1Yl9kZWZhdWx0cyh2b2lkKQoreworCS8qIERlZmF1bHRzIGZvciBvbGQga2VybmVsICovCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWVmaV9wZV9lbnRyeSA9IDB4MTA7CisjZWxzZQorCWVmaV9wZV9lbnRyeSA9IDB4MjEwOworCXN0YXJ0dXBfNjQgPSAweDIwMDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBlZmlfc3R1Yl9lbnRyeV91cGRhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBlZmkzMl9zdHViX2VudHJ5OworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS8qIFllcywgdGhpcyBpcyByZWFsbHkgaG93IHdlIGRlZmluZWQgaXQgOiggKi8KKwlhZGRyID0gZWZpNjRfc3R1Yl9lbnRyeSAtIDB4MjAwOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUZJX01JWEVECisJaWYgKGVmaTMyX3N0dWJfZW50cnkgIT0gYWRkcikKKwkJZGllKCIzMi1iaXQgYW5kIDY0LWJpdCBFRkkgZW50cnkgcG9pbnRzIGRvIG5vdCBtYXRjaFxuIik7CisjZW5kaWYKKwlwdXRfdW5hbGlnbmVkX2xlMzIoYWRkciwgJmJ1ZlsweDI2NF0pOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3BlY29mZl9zZXR1cF9hbmRfcmVsb2ModW5zaWduZWQgaW50IHNpemUpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3BlY29mZl90ZXh0KHVuc2lnbmVkIGludCB0ZXh0X3N0YXJ0LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmaWxlX3N6KSB7fQorc3RhdGljIGlubGluZSB2b2lkIGVmaV9zdHViX2RlZmF1bHRzKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZWZpX3N0dWJfZW50cnlfdXBkYXRlKHZvaWQpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc2VydmVfcGVjb2ZmX3JlbG9jX3NlY3Rpb24oaW50IGMpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX0VGSV9TVFVCICovCiAKIApAQCAtMjUwLDcgKzI5Nyw4IEBACiAJcCA9IChjaGFyICopYnVmOwogCiAJd2hpbGUgKHAgJiYgKnApIHsKLQkJUEFSU0VfWk9GUyhwLCBlZmlfc3R1Yl9lbnRyeSk7CisJCVBBUlNFX1pPRlMocCwgZWZpMzJfc3R1Yl9lbnRyeSk7CisJCVBBUlNFX1pPRlMocCwgZWZpNjRfc3R1Yl9lbnRyeSk7CiAJCVBBUlNFX1pPRlMocCwgZWZpX3BlX2VudHJ5KTsKIAkJUEFSU0VfWk9GUyhwLCBzdGFydHVwXzY0KTsKIApAQCAtMjcxLDE1ICszMTksNyBAQAogCXZvaWQgKmtlcm5lbDsKIAl1MzIgY3JjID0gMHhmZmZmZmZmZlVMOwogCi0JLyogRGVmYXVsdHMgZm9yIG9sZCBrZXJuZWwgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JZWZpX3BlX2VudHJ5ID0gMHgxMDsKLQllZmlfc3R1Yl9lbnRyeSA9IDB4MzA7Ci0jZWxzZQotCWVmaV9wZV9lbnRyeSA9IDB4MjEwOwotCWVmaV9zdHViX2VudHJ5ID0gMHgyMzA7Ci0Jc3RhcnR1cF82NCA9IDB4MjAwOwotI2VuZGlmCisJZWZpX3N0dWJfZGVmYXVsdHMoKTsKIAogCWlmIChhcmdjICE9IDUpCiAJCXVzYWdlKCk7CkBAIC0zMDIsMTEgKzM0Miw3IEBACiAJCWRpZSgiQm9vdCBibG9jayBoYXNuJ3QgZ290IGJvb3QgZmxhZyAoMHhBQTU1KSIpOwogCWZjbG9zZShmaWxlKTsKIAotI2lmZGVmIENPTkZJR19FRklfU1RVQgotCS8qIFJlc2VydmUgMHgyMCBieXRlcyBmb3IgLnJlbG9jIHNlY3Rpb24gKi8KLQltZW1zZXQoYnVmK2MsIDAsIFBFQ09GRl9SRUxPQ19SRVNFUlZFKTsKLQljICs9IFBFQ09GRl9SRUxPQ19SRVNFUlZFOwotI2VuZGlmCisJYyArPSByZXNlcnZlX3BlY29mZl9yZWxvY19zZWN0aW9uKGMpOwogCiAJLyogUGFkIHVudXNlZCBzcGFjZSB3aXRoIHplcm9zICovCiAJc2V0dXBfc2VjdG9ycyA9IChjICsgNTExKSAvIDUxMjsKQEAgLTMxNSw5ICszNTEsNyBAQAogCWkgPSBzZXR1cF9zZWN0b3JzKjUxMjsKIAltZW1zZXQoYnVmK2MsIDAsIGktYyk7CiAKLSNpZmRlZiBDT05GSUdfRUZJX1NUVUIKIAl1cGRhdGVfcGVjb2ZmX3NldHVwX2FuZF9yZWxvYyhpKTsKLSNlbmRpZgogCiAJLyogU2V0IHRoZSBkZWZhdWx0IHJvb3QgZGV2aWNlICovCiAJcHV0X3VuYWxpZ25lZF9sZTE2KERFRkFVTFRfUk9PVF9ERVYsICZidWZbNTA4XSk7CkBAIC0zNDIsMTQgKzM3Niw5IEBACiAJYnVmWzB4MWYxXSA9IHNldHVwX3NlY3RvcnMtMTsKIAlwdXRfdW5hbGlnbmVkX2xlMzIoc3lzX3NpemUsICZidWZbMHgxZjRdKTsKIAotI2lmZGVmIENPTkZJR19FRklfU1RVQgogCXVwZGF0ZV9wZWNvZmZfdGV4dChzZXR1cF9zZWN0b3JzICogNTEyLCBzeiArIGkgKyAoKHN5c19zaXplICogMTYpIC0gc3opKTsKIAotI2lmZGVmIENPTkZJR19YODZfNjQgLyogWWVzLCB0aGlzIGlzIHJlYWxseSBob3cgd2UgZGVmaW5lZCBpdCA6KCAqLwotCWVmaV9zdHViX2VudHJ5IC09IDB4MjAwOwotI2VuZGlmCi0JcHV0X3VuYWxpZ25lZF9sZTMyKGVmaV9zdHViX2VudHJ5LCAmYnVmWzB4MjY0XSk7Ci0jZW5kaWYKKwllZmlfc3R1Yl9lbnRyeV91cGRhdGUoKTsKIAogCWNyYyA9IHBhcnRpYWxfY3JjMzIoYnVmLCBpLCBjcmMpOwogCWlmIChmd3JpdGUoYnVmLCAxLCBpLCBkZXN0KSAhPSBpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC92aWRlby12ZXNhLmMgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYwppbmRleCAxMWU4YzZlLi5iYTNlMTAwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYworKysgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgImJvb3QuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogI2luY2x1ZGUgInZlc2EuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogLyogVkVTQSBpbmZvcm1hdGlvbiAqLwogc3RhdGljIHN0cnVjdCB2ZXNhX2dlbmVyYWxfaW5mbyB2Z2luZm87CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggN2Y2Njk4NS4uNGFjZGRjNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtNSwzICs1LDUgQEAKIGdlbmhkci15ICs9IHVuaXN0ZF94MzIuaAogCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCmluZGV4IDFkMjA5MWEuLjE5YjBlYmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKQEAgLTkzLDkgKzkzLDYgQEAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgotZXh0ZXJuIHZvaWQgeGFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKTsKLWV4dGVybiB1MzIgc2FmZV94YXBpY193YWl0X2ljcl9pZGxlKHZvaWQpOwotZXh0ZXJuIHZvaWQgeGFwaWNfaWNyX3dyaXRlKHUzMiwgdTMyKTsKIGV4dGVybiBpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfYXBpY19tZW1fd3JpdGUodTMyIHJlZywgdTMyIHYpCkBAIC0xODQsNyArMTgxLDYgQEAKIGV4dGVybiBpbnQgeDJhcGljX3ByZWVuYWJsZWQ7CiBleHRlcm4gdm9pZCBjaGVja194MmFwaWModm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfeDJhcGljKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDJhcGljX2ljcl93cml0ZSh1MzIgbG93LCB1MzIgaWQpOwogc3RhdGljIGlubGluZSBpbnQgeDJhcGljX2VuYWJsZWQodm9pZCkKIHsKIAl1NjQgbXNyOwpAQCAtMjIxLDcgKzIxNyw2IEBACiB7CiB9CiAKLSNkZWZpbmUJbm94MmFwaWMJMAogI2RlZmluZQl4MmFwaWNfcHJlZW5hYmxlZCAwCiAjZGVmaW5lCXgyYXBpY19zdXBwb3J0ZWQoKQkwCiAjZW5kaWYKQEAgLTM1MSw3ICszNDYsNyBAQAogCWludCB0cmFtcG9saW5lX3BoeXNfbG93OwogCWludCB0cmFtcG9saW5lX3BoeXNfaGlnaDsKIAotCXZvaWQgKCp3YWl0X2Zvcl9pbml0X2RlYXNzZXJ0KShhdG9taWNfdCAqZGVhc3NlcnQpOworCWJvb2wgd2FpdF9mb3JfaW5pdF9kZWFzc2VydDsKIAl2b2lkICgqc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljKSh2b2lkKTsKIAl2b2lkICgqaW5xdWlyZV9yZW1vdGVfYXBpYykoaW50IGFwaWNpZCk7CiAKQEAgLTUxNywxMyArNTEyLDYgQEAKIGV4dGVybiBpbnQgZGVmYXVsdF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBwaHlzX2FwaWNpZCk7CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIGRlZmF1bHRfd2FpdF9mb3JfaW5pdF9kZWFzc2VydChhdG9taWNfdCAqZGVhc3NlcnQpCi17Ci0Jd2hpbGUgKCFhdG9taWNfcmVhZChkZWFzc2VydCkpCi0JCWNwdV9yZWxheCgpOwotCXJldHVybjsKLX0KLQogZXh0ZXJuIHZvaWQgZ2VuZXJpY19iaWdzbXBfcHJvYmUodm9pZCk7CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmgKaW5kZXggMTZhNTdmNC4uZWRhODFkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCkBAIC0zLDggKzMsNiBAQAogI2lmbmRlZiBfQVNNX1g4Nl9DTE9DS1NPVVJDRV9ICiAjZGVmaW5lIF9BU01fWDg2X0NMT0NLU09VUkNFX0gKIAotI2lmZGVmIENPTkZJR19YODZfNjQKLQogI2RlZmluZSBWQ0xPQ0tfTk9ORSAwICAvKiBObyB2RFNPIGNsb2NrIGF2YWlsYWJsZS4JKi8KICNkZWZpbmUgVkNMT0NLX1RTQyAgMSAgLyogdkRTTyBzaG91bGQgdXNlIHZyZWFkX3RzYy4JKi8KICNkZWZpbmUgVkNMT0NLX0hQRVQgMiAgLyogdkRTTyBzaG91bGQgdXNlIHZyZWFkX2hwZXQuCSovCkBAIC0xNCw2ICsxMiw0IEBACiAJaW50IHZjbG9ja19tb2RlOwogfTsKIAotI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KLQogI2VuZGlmIC8qIF9BU01fWDg2X0NMT0NLU09VUkNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAppbmRleCBlMDk5Zjk1Li5lMjY1ZmY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCkBAIC0zNyw3ICszNyw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BBVAkJKDAqMzIrMTYpIC8qIFBhZ2UgQXR0cmlidXRlIFRhYmxlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BTRTM2CSgwKjMyKzE3KSAvKiAzNi1iaXQgUFNFcyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9QTgkJKDAqMzIrMTgpIC8qIFByb2Nlc3NvciBzZXJpYWwgbnVtYmVyICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0NMRkxTSAkoMCozMisxOSkgLyogImNsZmx1c2giIENMRkxVU0ggaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFVTSAkoMCozMisxOSkgLyogQ0xGTFVTSCBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9EUwkJKDAqMzIrMjEpIC8qICJkdHMiIERlYnVnIFN0b3JlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDUEkJKDAqMzIrMjIpIC8qIEFDUEkgdmlhIE1TUiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCSgwKjMyKzIzKSAvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KQEAgLTIxNyw5ICsyMTcsMTQgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfSU5WUENJRAkoOSozMisxMCkgLyogSW52YWxpZGF0ZSBQcm9jZXNzb3IgQ29udGV4dCBJRCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9SVE0JCSg5KjMyKzExKSAvKiBSZXN0cmljdGVkIFRyYW5zYWN0aW9uYWwgTWVtb3J5ICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01QWAkJKDkqMzIrMTQpIC8qIE1lbW9yeSBQcm90ZWN0aW9uIEV4dGVuc2lvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJGCSg5KjMyKzE2KSAvKiBBVlgtNTEyIEZvdW5kYXRpb24gKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUkRTRUVECSg5KjMyKzE4KSAvKiBUaGUgUkRTRUVEIGluc3RydWN0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FEWAkJKDkqMzIrMTkpIC8qIFRoZSBBRENYIGFuZCBBRE9YIGluc3RydWN0aW9ucyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9TTUFQCSg5KjMyKzIwKSAvKiBTdXBlcnZpc29yIE1vZGUgQWNjZXNzIFByZXZlbnRpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFVTSE9QVAkoOSozMisyMykgLyogQ0xGTFVTSE9QVCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJQRgkoOSozMisyNikgLyogQVZYLTUxMiBQcmVmZXRjaCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJFUgkoOSozMisyNykgLyogQVZYLTUxMiBFeHBvbmVudGlhbCBhbmQgUmVjaXByb2NhbCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJDRAkoOSozMisyOCkgLyogQVZYLTUxMiBDb25mbGljdCBEZXRlY3Rpb24gKi8KIAogLyoKICAqIEJVRyB3b3JkKHMpCkBAIC0zMTMsNyArMzE4LDcgQEAKICNkZWZpbmUgY3B1X2hhc19wbW1fZW5hYmxlZAlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfUE1NX0VOKQogI2RlZmluZSBjcHVfaGFzX2RzCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRFMpCiAjZGVmaW5lIGNwdV9oYXNfcGVicwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BFQlMpCi0jZGVmaW5lIGNwdV9oYXNfY2xmbHVzaAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkKKyNkZWZpbmUgY3B1X2hhc19jbGZsdXNoCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFVTSCkKICNkZWZpbmUgY3B1X2hhc19idHMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9CVFMpCiAjZGVmaW5lIGNwdV9oYXNfZ2JwYWdlcwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0dCUEFHRVMpCiAjZGVmaW5lIGNwdV9oYXNfYXJjaF9wZXJmbW9uCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pCkBAIC01NDEsNiArNTQ2LDEzIEBACiAjZGVmaW5lIHN0YXRpY19jcHVfaGFzX2J1ZyhiaXQpCXN0YXRpY19jcHVfaGFzKChiaXQpKQogI2RlZmluZSBib290X2NwdV9oYXNfYnVnKGJpdCkJY3B1X2hhc19idWcoJmJvb3RfY3B1X2RhdGEsIChiaXQpKQogCisjZGVmaW5lIE1BWF9DUFVfRkVBVFVSRVMJKE5DQVBJTlRTICogMzIpCisjZGVmaW5lIGNwdV9oYXZlX2ZlYXR1cmUJYm9vdF9jcHVfaGFzCisKKyNkZWZpbmUgQ1BVX0ZFQVRVUkVfVFlQRUZNVAkieDg2LHZlbiUwNFhmYW0lMDRYbW9kJTA0WCIKKyNkZWZpbmUgQ1BVX0ZFQVRVUkVfVFlQRVZBTAlib290X2NwdV9kYXRhLng4Nl92ZW5kb3IsIGJvb3RfY3B1X2RhdGEueDg2LCBcCisJCQkJYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwKKwogI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAqLwogCiAjZW5kaWYgLyogX0FTTV9YODZfQ1BVRkVBVFVSRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjhhZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKaW5kZXggYWNkODZjOC4uMDg2OTQzNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKQEAgLTE5LDkgKzE5LDExIEBACiAgKi8KICNkZWZpbmUgRUZJX09MRF9NRU1NQVAJCUVGSV9BUkNIXzEKIAorI2RlZmluZSBFRkkzMl9MT0FERVJfU0lHTkFUVVJFCSJFTDMyIgorI2RlZmluZSBFRkk2NF9MT0FERVJfU0lHTkFUVVJFCSJFTDY0IgorCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCi0jZGVmaW5lIEVGSV9MT0FERVJfU0lHTkFUVVJFCSJFTDMyIgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBhc21saW5rYWdlIGVmaV9jYWxsX3BoeXModm9pZCAqLCAuLi4pOwogCkBAIC01Nyw4ICs1OSw2IEBACiAKICNlbHNlIC8qICFDT05GSUdfWDg2XzMyICovCiAKLSNkZWZpbmUgRUZJX0xPQURFUl9TSUdOQVRVUkUJIkVMNjQiCi0KIGV4dGVybiB1NjQgZWZpX2NhbGwwKHZvaWQgKmZwKTsKIGV4dGVybiB1NjQgZWZpX2NhbGwxKHZvaWQgKmZwLCB1NjQgYXJnMSk7CiBleHRlcm4gdTY0IGVmaV9jYWxsMih2b2lkICpmcCwgdTY0IGFyZzEsIHU2NCBhcmcyKTsKQEAgLTExOSw3ICsxMTksNiBAQAogI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KIAogZXh0ZXJuIGludCBhZGRfZWZpX21lbW1hcDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHg4Nl9lZmlfZmFjaWxpdHk7CiBleHRlcm4gc3RydWN0IGVmaV9zY3JhdGNoIGVmaV9zY3JhdGNoOwogZXh0ZXJuIHZvaWQgZWZpX3NldF9leGVjdXRhYmxlKGVmaV9tZW1vcnlfZGVzY190ICptZCwgYm9vbCBleGVjdXRhYmxlKTsKIGV4dGVybiBpbnQgZWZpX21lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHZvaWQpOwpAQCAtMTMwLDEwICsxMjksMTIgQEAKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfbWFwX3JlZ2lvbihlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uX2ZpeGVkKGVmaV9tZW1vcnlfZGVzY190ICptZCk7CiBleHRlcm4gdm9pZCBlZmlfc3luY19sb3dfa2VybmVsX21hcHBpbmdzKHZvaWQpOwotZXh0ZXJuIHZvaWQgZWZpX3NldHVwX3BhZ2VfdGFibGVzKHZvaWQpOworZXh0ZXJuIGludCBlZmlfc2V0dXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcyk7CitleHRlcm4gdm9pZCBlZmlfY2xlYW51cF9wYWdlX3RhYmxlcyh1bnNpZ25lZCBsb25nIHBhX21lbW1hcCwgdW5zaWduZWQgbnVtX3BhZ2VzKTsKIGV4dGVybiB2b2lkIF9faW5pdCBvbGRfbWFwX3JlZ2lvbihlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHJ1bnRpbWVfY29kZV9wYWdlX21rZXhlYyh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfcnVudGltZV9ta2V4ZWModm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgZWZpX2R1bXBfcGFnZXRhYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9hcHBseV9tZW1tYXBfcXVpcmtzKHZvaWQpOwogCiBzdHJ1Y3QgZWZpX3NldHVwX2RhdGEgewpAQCAtMTUzLDggKzE1NCw0MCBAQAogCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19YODZfNjQpID09IGVmaV9lbmFibGVkKEVGSV82NEJJVCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBlZmlfcnVudGltZV9zdXBwb3J0ZWQodm9pZCkKK3sKKwlpZiAoZWZpX2lzX25hdGl2ZSgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpICYmICFlZmlfZW5hYmxlZChFRklfT0xEX01FTU1BUCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiBleHRlcm4gc3RydWN0IGNvbnNvbGUgZWFybHlfZWZpX2NvbnNvbGU7CiBleHRlcm4gdm9pZCBwYXJzZV9lZmlfc2V0dXAodTY0IHBoeXNfYWRkciwgdTMyIGRhdGFfbGVuKTsKKworI2lmZGVmIENPTkZJR19FRklfTUlYRUQKK2V4dGVybiB2b2lkIGVmaV90aHVua19ydW50aW1lX3NldHVwKHZvaWQpOworZXh0ZXJuIGVmaV9zdGF0dXNfdCBlZmlfdGh1bmtfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAoCisJdm9pZCAqcGh5c19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKKwl1bnNpZ25lZCBsb25nIG1lbW9yeV9tYXBfc2l6ZSwKKwl1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3Jfc2l6ZSwKKwl1MzIgZGVzY3JpcHRvcl92ZXJzaW9uLAorCWVmaV9tZW1vcnlfZGVzY190ICp2aXJ0dWFsX21hcCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGVmaV90aHVua19ydW50aW1lX3NldHVwKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIGVmaV9zdGF0dXNfdCBlZmlfdGh1bmtfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAoCisJdm9pZCAqcGh5c19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKKwl1bnNpZ25lZCBsb25nIG1lbW9yeV9tYXBfc2l6ZSwKKwl1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3Jfc2l6ZSwKKwl1MzIgZGVzY3JpcHRvcl92ZXJzaW9uLAorCWVmaV9tZW1vcnlfZGVzY190ICp2aXJ0dWFsX21hcCkKK3sKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogQ09ORklHX0VGSV9NSVhFRCAqLwogI2Vsc2UKIC8qCiAgKiBJRiBFRkkgaXMgbm90IGNvbmZpZ3VyZWQsIGhhdmUgdGhlIEVGSSBjYWxscyByZXR1cm4gLUVOT1NZUy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggOWM5OTljMS4uMmM3MTE4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTI4MSwxNiArMjgxLDEyIEBACiAKICNkZWZpbmUgU1RBQ0tfUk5EX01BU0sgKDB4N2ZmKQogCi0jZGVmaW5lIFZEU09fSElHSF9CQVNFCQkoX19maXhfdG9fdmlydChGSVhfVkRTTykpCi0KICNkZWZpbmUgQVJDSF9ETElORk8JCUFSQ0hfRExJTkZPX0lBMzIodmRzb19lbmFibGVkKQogCiAvKiB1cGRhdGUgQVRfVkVDVE9SX1NJWkVfQVJDSCBpZiB0aGUgbnVtYmVyIG9mIE5FV19BVVhfRU5UIGVudHJpZXMgY2hhbmdlcyAqLwogCiAjZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCiAKLSNkZWZpbmUgVkRTT19ISUdIX0JBU0UJCTB4ZmZmZmUwMDBVIC8qIENPTkZJR19DT01QQVRfVkRTTyBhZGRyZXNzICovCi0KIC8qIDFHQiBmb3IgNjRiaXQsIDhNQiBmb3IgMzJiaXQgKi8KICNkZWZpbmUgU1RBQ0tfUk5EX01BU0sgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0FERFIzMikgPyAweDdmZiA6IDB4M2ZmZmZmKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9maXhtYXAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IDcyNTJjZDMuLjhkY2QzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC00MCwxNSArNDAsOCBAQAogICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX0ZJWEFERFJfVE9QOwogI2RlZmluZSBGSVhBRERSX1RPUAkoKHVuc2lnbmVkIGxvbmcpX19GSVhBRERSX1RPUCkKLQotI2RlZmluZSBGSVhBRERSX1VTRVJfU1RBUlQgICAgIF9fZml4X3RvX3ZpcnQoRklYX1ZEU08pCi0jZGVmaW5lIEZJWEFERFJfVVNFUl9FTkQgICAgICAgX19maXhfdG9fdmlydChGSVhfVkRTTyAtIDEpCiAjZWxzZQogI2RlZmluZSBGSVhBRERSX1RPUAkoVlNZU0NBTExfRU5ELVBBR0VfU0laRSkKLQotLyogT25seSBjb3ZlcnMgMzJiaXQgdnN5c2NhbGxzIGN1cnJlbnRseS4gTmVlZCBhbm90aGVyIHNldCBmb3IgNjRiaXQuICovCi0jZGVmaW5lIEZJWEFERFJfVVNFUl9TVEFSVAkoKHVuc2lnbmVkIGxvbmcpVlNZU0NBTEwzMl9WU1lTQ0FMTCkKLSNkZWZpbmUgRklYQUREUl9VU0VSX0VORAkoRklYQUREUl9VU0VSX1NUQVJUICsgUEFHRV9TSVpFKQogI2VuZGlmCiAKIApAQCAtNzQsNyArNjcsNiBAQAogZW51bSBmaXhlZF9hZGRyZXNzZXMgewogI2lmZGVmIENPTkZJR19YODZfMzIKIAlGSVhfSE9MRSwKLQlGSVhfVkRTTywKICNlbHNlCiAJVlNZU0NBTExfTEFTVF9QQUdFLAogCVZTWVNDQUxMX0ZJUlNUX1BBR0UgPSBWU1lTQ0FMTF9MQVNUX1BBR0UKQEAgLTk4LDEyICs5MCw2IEBACiAJRklYX0lPX0FQSUNfQkFTRV8wLAogCUZJWF9JT19BUElDX0JBU0VfRU5EID0gRklYX0lPX0FQSUNfQkFTRV8wICsgTUFYX0lPX0FQSUNTIC0gMSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfVklTV1NfQVBJQwotCUZJWF9DT19DUFUsCS8qIENvYmFsdCB0aW1lciAqLwotCUZJWF9DT19BUElDLAkvKiBDb2JhbHQgQVBJQyBSZWRpcmVjdGlvbiBUYWJsZSAqLwotCUZJWF9MSV9QQ0lBLAkvKiBMaXRoaXVtIFBDSSBCcmlkZ2UgQSAqLwotCUZJWF9MSV9QQ0lCLAkvKiBMaXRoaXVtIFBDSSBCcmlkZ2UgQiAqLwotI2VuZGlmCiAJRklYX1JPX0lEVCwJLyogVmlydHVhbCBtYXBwaW5nIGZvciByZWFkLW9ubHkgSURUICovCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCUZJWF9LTUFQX0JFR0lOLAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZmxvcHB5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaAppbmRleCBkM2Q3NDY5Li4xYzdlZWZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaApAQCAtMTQ1LDEwICsxNDUsMTAgQEAKIHsKIAlpZiAoY2FuX3VzZV92aXJ0dWFsX2RtYSkKIAkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LAotCQkJCSAgIElSUUZfRElTQUJMRUQsICJmbG9wcHkiLCBOVUxMKTsKKwkJCQkgICAwLCAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkgICBJUlFGX0RJU0FCTEVELCAiZmxvcHB5IiwgTlVMTCk7CisJCQkJICAgMCwgImZsb3BweSIsIE5VTEwpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfbWVtX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCBhYjBhZTFhLi4yMzA4NTNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC0zMyw2ICszMyw5IEBACiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfVEhSRVNIT0xECiAJdW5zaWduZWQgaW50IGlycV90aHJlc2hvbGRfY291bnQ7CiAjZW5kaWYKKyNpZiBJU19FTkFCTEVEKENPTkZJR19IWVBFUlYpIHx8IGRlZmluZWQoQ09ORklHX1hFTikKKwl1bnNpZ25lZCBpbnQgaXJxX2h2X2NhbGxiYWNrX2NvdW50OworI2VuZGlmCiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfY3B1c3RhdF90OwogCiBERUNMQVJFX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaAppbmRleCA2N2Q2OWI4Li5hMzA3Yjc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaApAQCAtOTgsNyArOTgsNiBAQAogI2RlZmluZSBJT19BUElDX0lSUSh4KSAoKCh4KSA+PSBOUl9JUlFTX0xFR0FDWSkgfHwgKCgxPDwoeCkpICYgaW9fYXBpY19pcnFzKSkKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvX2FwaWNfaXJxczsKIAotZXh0ZXJuIHZvaWQgaW5pdF9WSVNXU19BUElDX2lycXModm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9JT19BUElDKHZvaWQpOwogZXh0ZXJuIHZvaWQgZGlzYWJsZV9JT19BUElDKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCmluZGV4IDhhOWIzZTIuLjFlYzk5MGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCkBAIC0xMSw5ICsxMSw2IEBACiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtdOwogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkobm9kZV9kYXRhW25pZF0pCi0KLSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCmluZGV4IDNlNmI0OTIuLmY1YTYxNzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCkBAIC0yNSwxMiArMjUsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IGRlZl90b19iaWdzbXA7CiAKLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi1leHRlcm4gaW50IG1wX2J1c19pZF90b19ub2RlW01BWF9NUF9CVVNTRVNdOwotZXh0ZXJuIGludCBtcF9idXNfaWRfdG9fbG9jYWxbTUFYX01QX0JVU1NFU107Ci1leHRlcm4gaW50IHF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkIFtOUl9DUFVTLzRdWzRdOwotI2VuZGlmCi0KICNlbHNlIC8qIENPTkZJR19YODZfNjQ6ICovCiAKICNkZWZpbmUgTUFYX01QX0JVU1NFUwkJMjU2CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc2h5cGVydi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNoeXBlcnYuaAppbmRleCBjZDljNDE5Li5jMTYzMjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc2h5cGVydi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zaHlwZXJ2LmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X01TSFlQRVJfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CiAKIHN0cnVjdCBtc19oeXBlcnZfaW5mbyB7CkBAIC0xNiw2ICsxNyw3IEBACiAjZGVmaW5lIHRyYWNlX2h5cGVydl9jYWxsYmFja192ZWN0b3IgaHlwZXJ2X2NhbGxiYWNrX3ZlY3RvcgogI2VuZGlmCiB2b2lkIGh5cGVydl92ZWN0b3JfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci12b2lkIGh2X3JlZ2lzdGVyX3ZtYnVzX2hhbmRsZXIoaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKK3ZvaWQgaHZfc2V0dXBfdm1idXNfaXJxKHZvaWQgKCpoYW5kbGVyKSh2b2lkKSk7Cit2b2lkIGh2X3JlbW92ZV92bWJ1c19pcnEodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaAppbmRleCBlMTM5YjEzLi5kZTM2ZjIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaApAQCAtMjE0LDYgKzIxNCw4IEBACiAKIHN0cnVjdCBtc3IgKm1zcnNfYWxsb2Modm9pZCk7CiB2b2lkIG1zcnNfZnJlZShzdHJ1Y3QgbXNyICptc3JzKTsKK2ludCBtc3Jfc2V0X2JpdCh1MzIgbXNyLCB1OCBiaXQpOworaW50IG1zcl9jbGVhcl9iaXQodTMyIG1zciwgdTggYml0KTsKIAogI2lmZGVmIENPTkZJR19TTVAKIGludCByZG1zcl9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyICpsLCB1MzIgKmgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAppbmRleCA4NmY5MzAxLi41ZjJmYzQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0FTTV9YODZfTk1JX0gKICNkZWZpbmUgX0FTTV9YODZfTk1JX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0zOCw2ICszOSw4IEBACiBzdHJ1Y3Qgbm1pYWN0aW9uIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJbm1pX2hhbmRsZXJfdAkJaGFuZGxlcjsKKwl1NjQJCQltYXhfZHVyYXRpb247CisJc3RydWN0IGlycV93b3JrCQlpcnFfd29yazsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAljb25zdCBjaGFyCQkqbmFtZTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hcS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYXEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiM2MzMi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hcS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBXcml0dGVuIGJ5OiBQYXRyaWNpYSBHYXVnaGVuLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byA8Z29uZUB1cy5pYm0uY29tPgotICovCi0KLSNpZm5kZWYgX0FTTV9YODZfTlVNQVFfSAotI2RlZmluZSBfQVNNX1g4Nl9OVU1BUV9ICi0KLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0KLWV4dGVybiBpbnQgZm91bmRfbnVtYXE7Ci1leHRlcm4gaW50IG51bWFxX251bWFfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgcGNpX251bWFxX2luaXQodm9pZCk7Ci0KLWV4dGVybiB2b2lkICp4cXVhZF9wb3J0aW87Ci0KLSNkZWZpbmUgWFFVQURfUE9SVElPX0JBU0UgMHhmZTQwMDAwMAotI2RlZmluZSBYUVVBRF9QT1JUSU9fUVVBRCAweDQwMDAwICAvKiAyNTZrIHBlciBxdWFkLiAqLwotI2RlZmluZSBYUVVBRF9QT1JUX0FERFIocG9ydCwgcXVhZCkgKHhxdWFkX3BvcnRpbyArIChYUVVBRF9QT1JUSU9fUVVBRCpxdWFkKSArIHBvcnQpCi0KLS8qCi0gKiBTWVNfQ0ZHX0RBVEFfUFJJVl9BRERSLCBzdHJ1Y3QgZWFjaHF1YWRtZW0sIGFuZCBzdHJ1Y3Qgc3lzX2NmZ19kYXRhIGFyZSB0aGUKLSAqLwotI2RlZmluZSBTWVNfQ0ZHX0RBVEFfUFJJVl9BRERSCQkweDAwMDlkMDAwIC8qIHBsYWNlIGZvciBzY2QgaW4gcHJpdmF0ZQotCQkJCQkJICAgICAgcXVhZCBzcGFjZSAqLwotCi0vKgotICogQ29tbXVuaWNhdGlvbiBhcmVhIGZvciBlYWNoIHByb2Nlc3NvciBvbiBseW54ZXItcHJvY2Vzc29yIHRlc3RzLgotICoKLSAqIE5PVEU6IElmIHlvdSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhpcyBlYWNocHJvYyBzdHJ1Y3R1cmUgeW91IG5lZWQKLSAqICAgICAgIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBmb3IgRUFDSF9RVUFEX1NJWkUuCi0gKi8KLXN0cnVjdCBlYWNocXVhZG1lbSB7Ci0JdW5zaWduZWQgaW50CXByaXZfbWVtX3N0YXJ0OwkJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgcHJpdmF0ZSBtZW1vcnkuICovCi0JCQkJCQkvKiBUaGlzIGlzIGFsd2F5cyAwLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CXByaXZfbWVtX3NpemU7CQkvKiBTaXplIG9mIHRoaXMgcXVhZCdzICovCi0JCQkJCQkvKiBwcml2YXRlIG1lbW9yeS4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsb3dfc2hyZF9tZW1fc3RycF9zdGFydDsvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBsb3cgc2hhcmVkIGJsb2NrICovCi0JCQkJCQkvKiAodW50cmFuc2xhdGVkKS4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsb3dfc2hyZF9tZW1fc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIGxvdyBzaGFyZWQgbWVtb3J5ICovCi0JCQkJCQkvKiAodW50cmFuc2xhdGVkKS4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsb3dfc2hyZF9tZW1fc2l6ZTsJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBsb3cgKi8KLQkJCQkJCS8qIHNoYXJlZCBtZW1vcnkuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG1taW9fY29wYl9zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbG9jYWwgbWVtb3J5ICovCi0JCQkJCQkvKiBtYXBwZWQgSS9PIGluIHRoZSAqLwotCQkJCQkJLyogY29tcGF0aWJpbGl0eSBPUEIuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG1taW9fY29wYl9zaXplOwkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIGxvY2FsICovCi0JCQkJCQkvKiBtZW1vcnkgbWFwcGVkIEkvTyBpbiB0aGUgKi8KLQkJCQkJCS8qIGNvbXBhdGliaWxpdHkgT1BCLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxtbWlvX25vcGJfc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIGxvY2FsIG1lbW9yeSAqLwotCQkJCQkJLyogbWFwcGVkIEkvTyBpbiB0aGUgKi8KLQkJCQkJCS8qIG5vbi1jb21wYXRpYmlsaXR5IE9QQi4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsbW1pb19ub3BiX3NpemU7CS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgbG9jYWwgKi8KLQkJCQkJCS8qIG1lbW9yeSBtYXBwZWQgSS9PIGluIHRoZSAqLwotCQkJCQkJLyogbm9uLWNvbXBhdGliaWxpdHkgT1BCLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWlvX2FwaWNfMF9zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBJL08gKi8KLQkJCQkJCS8qIEFQSUMgMC4gKi8KLQl1bnNpZ25lZCBpbnQJaW9fYXBpY18wX3N6OwkJLyogU2l6ZSBJL08gQVBJQyAwLiAqLwotCXVuc2lnbmVkIGludAlpb19hcGljXzFfc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgSS9PICovCi0JCQkJCQkvKiBBUElDIDEuICovCi0JdW5zaWduZWQgaW50CWlvX2FwaWNfMV9zejsJCS8qIFNpemUgSS9PIEFQSUMgMS4gKi8KLQl1bnNpZ25lZCBpbnQJaGlfc2hyZF9tZW1fc3RhcnQ7CS8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIGhpZ2ggc2hhcmVkIG1lbW9yeS4qLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWhpX3NocmRfbWVtX3NpemU7CS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgaGlnaCAqLwotCQkJCQkJLyogc2hhcmVkIG1lbW9yeS4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAltcHNfdGFibGVfYWRkcjsJCS8qIEFkZHJlc3Mgb2YgdGhpcyBxdWFkJ3MgKi8KLQkJCQkJCS8qIE1QUyB0YWJsZXMgZnJvbSBCSU9TLCAqLwotCQkJCQkJLyogaW4gc3lzdGVtIHNwYWNlLiovCi0JdW5zaWduZWQgaW50CWxjbF9NRENfcGlvX2FkZHI7CS8qIFBvcnQtSS9PIGFkZHJlc3MgZm9yICovCi0JCQkJCQkvKiBsb2NhbCBhY2Nlc3Mgb2YgTURDLiAqLwotCXVuc2lnbmVkIGludAlybXRfTURDX21tcGlvX2FkZHI7CS8qIE1NLVBvcnQtSS9PIGFkZHJlc3MgZm9yICovCi0JCQkJCQkvKiByZW1vdGUgYWNjZXNzIG9mIE1EQy4gKi8KLQl1bnNpZ25lZCBpbnQJbW1fcG9ydF9pb19zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbWVtb3J5IG1hcHBlZCBQb3J0ICovCi0JCQkJCQkvKiBJL08gc3BhY2UuICovCi0JdW5zaWduZWQgaW50CW1tX3BvcnRfaW9fc2l6ZTsJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBtZW1vcnkqLwotCQkJCQkJLyogbWFwcGVkIFBvcnQgSS9PIHNwYWNlLiAqLwotCXVuc2lnbmVkIGludAltbV9ybXRfaW9fYXBpY19zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbWVtb3J5IG1hcHBlZCAqLwotCQkJCQkJLyogcmVtb3RlIEkvTyBBUElDIHNwYWNlLiAqLwotCXVuc2lnbmVkIGludAltbV9ybXRfaW9fYXBpY19zaXplOwkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIG1lbW9yeSovCi0JCQkJCQkvKiBtYXBwZWQgcmVtb3RlIEkvTyBBUElDICovCi0JCQkJCQkvKiBzcGFjZS4gKi8KLQl1bnNpZ25lZCBpbnQJbW1faXNhX3N0YXJ0OwkJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbWVtb3J5IG1hcHBlZCBJU0EgKi8KLQkJCQkJCS8qIHNwYWNlIChjb250YWlucyBNREMgKi8KLQkJCQkJCS8qIG1lbW9yeSBzcGFjZSkuICovCi0JdW5zaWduZWQgaW50CW1tX2lzYV9zaXplOwkJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBtZW1vcnkqLwotCQkJCQkJLyogbWFwcGVkIElTQSBzcGFjZSAoY29udGFpbnMqLwotCQkJCQkJLyogTURDIG1lbW9yeSBzcGFjZSkuICovCi0JdW5zaWduZWQgaW50CXJtdF9xbWlfYWRkcjsJCS8qIFJlbW90ZSBhZGRyIHRvIGFjY2VzcyBRTUkuKi8KLQl1bnNpZ25lZCBpbnQJbGNsX3FtaV9hZGRyOwkJLyogTG9jYWwgYWRkciB0byBhY2Nlc3MgUU1JLiAqLwotfTsKLQotLyoKLSAqIE5vdGU6IFRoaXMgc3RydWN0dXJlIG11c3QgYmUgTk9UIGJlIGNoYW5nZWQgdW5sZXNzIHRoZSBtdWx0aXByb2MgYW5kCi0gKiBPUyBhcmUgY2hhbmdlZCB0byByZWZsZWN0IHRoZSBuZXcgc3RydWN0dXJlLgotICovCi1zdHJ1Y3Qgc3lzX2NmZ19kYXRhIHsKLQl1bnNpZ25lZCBpbnQJcXVhZF9pZDsKLQl1bnNpZ25lZCBpbnQJYnNwX3Byb2NfaWQ7IC8qIEJvb3QgU3RyYXAgUHJvY2Vzc29yIGluIHRoaXMgcXVhZC4gKi8KLQl1bnNpZ25lZCBpbnQJc2NkX3ZlcnNpb247IC8qIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgdGFibGUuICovCi0JdW5zaWduZWQgaW50CWZpcnN0X3F1YWRfaWQ7Ci0JdW5zaWduZWQgaW50CXF1YWRzX3ByZXNlbnQzMV8wOyAvKiAxIGJpdCBmb3IgZWFjaCBxdWFkICovCi0JdW5zaWduZWQgaW50CXF1YWRzX3ByZXNlbnQ2M18zMjsgLyogMSBiaXQgZm9yIGVhY2ggcXVhZCAqLwotCXVuc2lnbmVkIGludAljb25maWdfZmxhZ3M7Ci0JdW5zaWduZWQgaW50CWJvb3RfZmxhZ3M7Ci0JdW5zaWduZWQgaW50CWNzcl9zdGFydF9hZGRyOyAvKiBBYnNvbHV0ZSB2YWx1ZSAobm90IGluIE1CKSAqLwotCXVuc2lnbmVkIGludAljc3Jfc2l6ZTsgLyogQWJzb2x1dGUgdmFsdWUgKG5vdCBpbiBNQikgKi8KLQl1bnNpZ25lZCBpbnQJbGNsX2FwaWNfc3RhcnRfYWRkcjsgLyogQWJzb2x1dGUgdmFsdWUgKG5vdCBpbiBNQikgKi8KLQl1bnNpZ25lZCBpbnQJbGNsX2FwaWNfc2l6ZTsgLyogQWJzb2x1dGUgdmFsdWUgKG5vdCBpbiBNQikgKi8KLQl1bnNpZ25lZCBpbnQJbG93X3NocmRfbWVtX2Jhc2U7IC8qIDAgb3IgNTEyTUIgb3IgMUdCICovCi0JdW5zaWduZWQgaW50CWxvd19zaHJkX21lbV9xdWFkX29mZnNldDsgLyogMCwxMjhNLDI1Nk0sNTEyTSwxRyAqLwotCQkJCQkvKiBtYXkgbm90IGJlIHRvdGFsbHkgcG9wdWxhdGVkICovCi0JdW5zaWduZWQgaW50CXNwbGl0X21lbV9lbmJsOyAvKiAwIGZvciBubyBsb3cgc2hhcmVkIG1lbW9yeSAqLwotCXVuc2lnbmVkIGludAltbWlvX3N6OyAvKiBTaXplIG9mIHRvdGFsIHN5c3RlbSBtZW1vcnkgbWFwcGVkIEkvTyAqLwotCQkJCSAvKiAoaW4gTUIpLiAqLwotCXVuc2lnbmVkIGludAlxdWFkX3NwaW5fbG9jazsgLyogU3BhcmUgbG9jYXRpb24gdXNlZCBmb3IgcXVhZCAqLwotCQkJCQkvKiBicmluZ3VwLiAqLwotCXVuc2lnbmVkIGludAlub256ZXJvNTU7IC8qIEZvciBjaGVja3N1bW1pbmcuICovCi0JdW5zaWduZWQgaW50CW5vbnplcm9hYTsgLyogRm9yIGNoZWNrc3VtbWluZy4gKi8KLQl1bnNpZ25lZCBpbnQJc2NkX21hZ2ljX251bWJlcjsKLQl1bnNpZ25lZCBpbnQJc3lzdGVtX3R5cGU7Ci0JdW5zaWduZWQgaW50CWNoZWNrc3VtOwotCS8qCi0JICoJbWVtb3J5IGNvbmZpZ3VyYXRpb24gYXJlYSBmb3IgZWFjaCBxdWFkCi0JICovCi0Jc3RydWN0CQllYWNocXVhZG1lbSBlcVtNQVhfTlVNTk9ERVNdOwkvKiBpbmRleGVkIGJ5IHF1YWQgaWQgKi8KLX07Ci0KLXZvaWQgbnVtYXFfdHNjX2Rpc2FibGUodm9pZCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfWDg2X05VTUFRICovCi0jZW5kaWYgLyogX0FTTV9YODZfTlVNQVFfSCAqLwotCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IDFhYzYxMTQuLjk2YWU0ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0yNiwxMSArMjYsNiBAQAogZXh0ZXJuIGludCBub2lvYXBpY3F1aXJrOwogZXh0ZXJuIGludCBub2lvYXBpY3Jlcm91dGU7CiAKLS8qIHNjYW4gYSBidXMgYWZ0ZXIgYWxsb2NhdGluZyBhIHBjaV9zeXNkYXRhIGZvciBpdCAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICpwY2lfc2Nhbl9idXNfb25fbm9kZShpbnQgYnVzbm8sIHN0cnVjdCBwY2lfb3BzICpvcHMsCi0JCQkJCSAgICBpbnQgbm9kZSk7Ci1leHRlcm4gc3RydWN0IHBjaV9idXMgKnBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoaW50IGJ1c25vKTsKLQogI2lmZGVmIENPTkZJR19QQ0kKIAogI2lmZGVmIENPTkZJR19QQ0lfRE9NQUlOUwpAQCAtNzAsNyArNjUsNyBAQAogCiBleHRlcm4gaW50IHBjaWJpb3NfZW5hYmxlZDsKIHZvaWQgcGNpYmlvc19jb25maWdfaW5pdCh2b2lkKTsKLXN0cnVjdCBwY2lfYnVzICpwY2liaW9zX3NjYW5fcm9vdChpbnQgYnVzKTsKK3ZvaWQgcGNpYmlvc19zY2FuX3Jvb3QoaW50IGJ1cyk7CiAKIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggNWFkMzhhZC4uYjQ1OWRkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMTUsOSArMTUsMTAgQEAKIAkgOiAocHJvdCkpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0KICNpbmNsdWRlIDxhc20veDg2X2luaXQuaD4KIAordm9pZCBwdGR1bXBfd2Fsa19wZ2RfbGV2ZWwoc3RydWN0IHNlcV9maWxlICptLCBwZ2RfdCAqcGdkKTsKKwogLyoKICAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCiAgKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCkBAIC00NDUsMjAgKzQ0NiwxMCBAQAogCXJldHVybiBhLnB0ZSA9PSBiLnB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRldmFsX3ByZXNlbnQocHRldmFsX3QgcHRldmFsKQotewotCS8qCi0JICogWWVzIExpbnVzLCBfUEFHRV9QUk9UTk9ORSA9PSBfUEFHRV9OVU1BLiBFeHByZXNzaW5nIGl0IHRoaXMKLQkgKiB3YXkgY2xlYXJseSBzdGF0ZXMgdGhhdCB0aGUgaW50ZW50IGlzIHRoYXQgcHJvdG5vbmUgYW5kIG51bWEKLQkgKiBoaW50aW5nIHB0ZXMgYXJlIGNvbnNpZGVyZWQgcHJlc2VudCBmb3IgdGhlIHB1cnBvc2VzIG9mCi0JICogcGFnZXRhYmxlIG9wZXJhdGlvbnMgbGlrZSB6YXBwaW5nLCBwcm90ZWN0aW9uIGNoYW5nZXMsIGd1cCBldGMuCi0JICovCi0JcmV0dXJuIHB0ZXZhbCAmIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUFJPVE5PTkUgfCBfUEFHRV9OVU1BKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHRlX3ByZXNlbnQocHRlX3QgYSkKIHsKLQlyZXR1cm4gcHRldmFsX3ByZXNlbnQocHRlX2ZsYWdzKGEpKTsKKwlyZXR1cm4gcHRlX2ZsYWdzKGEpICYgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QUk9UTk9ORSB8CisJCQkgICAgICAgX1BBR0VfTlVNQSk7CiB9CiAKICNkZWZpbmUgcHRlX2FjY2Vzc2libGUgcHRlX2FjY2Vzc2libGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAppbmRleCAxYWE5Y2NkLi5lYjNkNDQ5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCkBAIC0yMTQsMTMgKzIxNCw4IEBACiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2RlZmluZSBfX1BBR0VfS0VSTkVMX0lERU5UX0xBUkdFX0VYRUMJX19QQUdFX0tFUk5FTF9MQVJHRV9FWEVDCiAjZWxzZQotLyoKLSAqIEZvciBQREVfSURFTlRfQVRUUiBpbmNsdWRlIFVTRVIgYml0LiBBcyB0aGUgUERFIGFuZCBQVEUgcHJvdGVjdGlvbgotICogYml0cyBhcmUgY29tYmluZWQsIHRoaXMgd2lsbCBhbG93IHVzZXIgdG8gYWNjZXNzIHRoZSBoaWdoIGFkZHJlc3MgbWFwcGVkCi0gKiBWRFNPIGluIHRoZSBwcmVzZW5jZSBvZiBDT05GSUdfQ09NUEFUX1ZEU08KLSAqLwogI2RlZmluZSBQVEVfSURFTlRfQVRUUgkgMHgwMDMJCS8qIFBSRVNFTlQrUlcgKi8KLSNkZWZpbmUgUERFX0lERU5UX0FUVFIJIDB4MDY3CQkvKiBQUkVTRU5UK1JXK1VTRVIrRElSVFkrQUNDRVNTRUQgKi8KKyNkZWZpbmUgUERFX0lERU5UX0FUVFIJIDB4MDYzCQkvKiBQUkVTRU5UK1JXK0RJUlRZK0FDQ0VTU0VEICovCiAjZGVmaW5lIFBHRF9JREVOVF9BVFRSCSAweDAwMQkJLyogUFJFU0VOVCAobm8gb3RoZXIgYXR0cmlidXRlcykgKi8KICNlbmRpZgogCkBAIC0zODIsOSArMzc3LDEzIEBACiAgKiBhcyBhIHB0ZSB0b28uCiAgKi8KIGV4dGVybiBwdGVfdCAqbG9va3VwX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgKmxldmVsKTsKK2V4dGVybiBwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgdW5zaWduZWQgaW50ICpsZXZlbCk7CiBleHRlcm4gcGh5c19hZGRyX3Qgc2xvd192aXJ0X3RvX3BoeXModm9pZCAqX19hZGRyZXNzKTsKIGV4dGVybiBpbnQga2VybmVsX21hcF9wYWdlc19pbl9wZ2QocGdkX3QgKnBnZCwgdTY0IHBmbiwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJCSAgIHVuc2lnbmVkIG51bXBhZ2VzLCB1bnNpZ25lZCBsb25nIHBhZ2VfZmxhZ3MpOwordm9pZCBrZXJuZWxfdW5tYXBfcGFnZXNfaW5fcGdkKHBnZF90ICpyb290LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkgICAgICAgdW5zaWduZWQgbnVtcGFnZXMpOwogI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9BU01fWDg2X1BHVEFCTEVfREVGU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGZkZWRkMzguLmE0ZWEwMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC00NDksNiArNDQ5LDE1IEBACiB9OwogREVDTEFSRV9QRVJfQ1BVX0FMSUdORUQoc3RydWN0IHN0YWNrX2NhbmFyeSwgc3RhY2tfY2FuYXJ5KTsKICNlbmRpZgorLyoKKyAqIHBlci1DUFUgSVJRIGhhbmRsaW5nIHN0YWNrcworICovCitzdHJ1Y3QgaXJxX3N0YWNrIHsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBzdGFja1tUSFJFQURfU0laRS9zaXplb2YodTMyKV07Cit9IF9fYWxpZ25lZChUSFJFQURfU0laRSk7CisKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXJxX3N0YWNrICosIGhhcmRpcnFfc3RhY2spOworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcnFfc3RhY2sgKiwgc29mdGlycV9zdGFjayk7CiAjZW5kaWYJLyogWDg2XzY0ICovCiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgeHN0YXRlX3NpemU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCBkNjJjOWY4Li45MjY0ZjA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTM5LDEyICszOSw2IEBACiAKIHZvaWQgc2V0dXBfYmlvc19jb3JydXB0aW9uX2NoZWNrKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl9WSVNXUwotZXh0ZXJuIHZvaWQgdmlzd3NfZWFybHlfZGV0ZWN0KHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCB2aXN3c19lYXJseV9kZXRlY3Qodm9pZCkgeyB9Ci0jZW5kaWYKLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfdmlkZW9fbW9kZTsKIAogZXh0ZXJuIHZvaWQgcmVzZXJ2ZV9zdGFuZGFyZF9pb19yZXNvdXJjZXModm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmgKaW5kZXggNjQ1Y2FkMi4uZTgyMGMwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaApAQCAtMTkxLDYgKzE5MSwxNCBAQAogCWFzbSB2b2xhdGlsZSgiY2xmbHVzaCAlMCIgOiAiK20iICgqKHZvbGF0aWxlIGNoYXIgX19mb3JjZSAqKV9fcCkpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY2xmbHVzaG9wdCh2b2xhdGlsZSB2b2lkICpfX3ApCit7CisJYWx0ZXJuYXRpdmVfaW8oIi5ieXRlICIgX19zdHJpbmdpZnkoTk9QX0RTX1BSRUZJWCkgIjsgY2xmbHVzaCAlUDAiLAorCQkgICAgICAgIi5ieXRlIDB4NjY7IGNsZmx1c2ggJVAwIiwKKwkJICAgICAgIFg4Nl9GRUFUVVJFX0NMRkxVU0hPUFQsCisJCSAgICAgICAiK20iICgqKHZvbGF0aWxlIGNoYXIgX19mb3JjZSAqKV9fcCkpOworfQorCiAjZGVmaW5lIG5vcCgpIGFzbSB2b2xhdGlsZSAoIm5vcCIpCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggZTE5NDBjMC4uNDdlNWRlMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogLyoKQEAgLTMyLDEyICszMyw2IEBACiAJbW1fc2VnbWVudF90CQlhZGRyX2xpbWl0OwogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICAgIHJlc3RhcnRfYmxvY2s7CiAJdm9pZCBfX3VzZXIJCSpzeXNlbnRlcl9yZXR1cm47Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHByZXZpb3VzX2VzcDsgICAvKiBFU1Agb2YgdGhlIHByZXZpb3VzIHN0YWNrIGluCi0JCQkJCQkgICBjYXNlIG9mIG5lc3RlZCAoSVJRKSBzdGFja3MKLQkJCQkJCSovCi0JX191OAkJCXN1cGVydmlzb3Jfc3RhY2tbMF07Ci0jZW5kaWYKIAl1bnNpZ25lZCBpbnQJCXNpZ19vbl91YWNjZXNzX2Vycm9yOjE7CiAJdW5zaWduZWQgaW50CQl1YWNjZXNzX2VycjoxOwkvKiB1YWNjZXNzIGZhaWxlZCAqLwogfTsKQEAgLTE1Myw5ICsxNDgsOSBAQAogI2RlZmluZSBfVElGX1dPUktfQ1RYU1dfUFJFViAoX1RJRl9XT1JLX0NUWFNXfF9USUZfVVNFUl9SRVRVUk5fTk9USUZZKQogI2RlZmluZSBfVElGX1dPUktfQ1RYU1dfTkVYVCAoX1RJRl9XT1JLX0NUWFNXKQogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgorI2RlZmluZSBTVEFDS19XQVJOCQkoVEhSRUFEX1NJWkUvOCkKKyNkZWZpbmUgS0VSTkVMX1NUQUNLX09GRlNFVAkoNSooQklUU19QRVJfTE9ORy84KSkKIAotI2RlZmluZSBTVEFDS19XQVJOCShUSFJFQURfU0laRS84KQogLyoKICAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCiAgKgpAQCAtMTYzLDQyICsxNTgsNiBAQAogICovCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0jZGVmaW5lIGN1cnJlbnRfc3RhY2tfcG9pbnRlciAoewkJXAotCXVuc2lnbmVkIGxvbmcgc3A7CQkJXAotCWFzbSgibW92ICUlZXNwLCUwIiA6ICI9ZyIgKHNwKSk7CVwKLQlzcDsJCQkJCVwKLX0pCi0KLS8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQotewotCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopCi0JCShjdXJyZW50X3N0YWNrX3BvaW50ZXIgJiB+KFRIUkVBRF9TSVpFIC0gMSkpOwotfQotCi0jZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCi0KLS8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBBU00gKi8KLSNkZWZpbmUgR0VUX1RIUkVBRF9JTkZPKHJlZykJIFwKLQltb3ZsICQtVEhSRUFEX1NJWkUsIHJlZzsgXAotCWFuZGwgJWVzcCwgcmVnCi0KLS8qIHVzZSB0aGlzIG9uZSBpZiByZWcgYWxyZWFkeSBjb250YWlucyAlZXNwICovCi0jZGVmaW5lIEdFVF9USFJFQURfSU5GT19XSVRIX0VTUChyZWcpIFwKLQlhbmRsICQtVEhSRUFEX1NJWkUsIHJlZwotCi0jZW5kaWYKLQotI2Vsc2UgLyogWDg2XzMyICovCi0KLSNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+Ci0jZGVmaW5lIEtFUk5FTF9TVEFDS19PRkZTRVQgKDUqOCkKLQotLyoKLSAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCi0gKiBwcmVlbXB0X2NvdW50IG5lZWRzIHRvIGJlIDEgaW5pdGlhbGx5LCB1bnRpbCB0aGUgc2NoZWR1bGVyIGlzIGZ1bmN0aW9uYWwuCi0gKi8KLSNpZm5kZWYgX19BU1NFTUJMWV9fCiBERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgbG9uZywga2VybmVsX3N0YWNrKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm8odm9pZCkKQEAgLTIxMyw4ICsxNzIsOCBAQAogCiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQVNNICovCiAjZGVmaW5lIEdFVF9USFJFQURfSU5GTyhyZWcpIFwKLQltb3ZxIFBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjaykscmVnIDsgXAotCXN1YnEgJChUSFJFQURfU0laRS1LRVJORUxfU1RBQ0tfT0ZGU0VUKSxyZWcKKwlfQVNNX01PViBQRVJfQ1BVX1ZBUihrZXJuZWxfc3RhY2spLHJlZyA7IFwKKwlfQVNNX1NVQiAkKFRIUkVBRF9TSVpFLUtFUk5FTF9TVEFDS19PRkZTRVQpLHJlZyA7CiAKIC8qCiAgKiBTYW1lIGlmIFBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjaykgaXMsIHBlcmhhcHMgd2l0aCBzb21lIG9mZnNldCwgYWxyZWFkeSBpbgpAQCAtMjI0LDggKzE4Myw2IEBACiAKICNlbmRpZgogCi0jZW5kaWYgLyogIVg4Nl8zMiAqLwotCiAvKgogICogVGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cy4KICAqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCBkMzVmMjRlLi4wZThmMDRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTExOSw5ICsxMTksMTAgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY29yZWdyb3VwX21hc2soaW50IGNwdSk7CiAKLSNpZmRlZiBFTkFCTEVfVE9QT19ERUZJTkVTCiAjZGVmaW5lIHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KQkoY3B1X2RhdGEoY3B1KS5waHlzX3Byb2NfaWQpCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJCShjcHVfZGF0YShjcHUpLmNwdV9jb3JlX2lkKQorCisjaWZkZWYgRU5BQkxFX1RPUE9fREVGSU5FUwogI2RlZmluZSB0b3BvbG9neV9jb3JlX2NwdW1hc2soY3B1KQkJKHBlcl9jcHUoY3B1X2NvcmVfbWFwLCBjcHUpKQogI2RlZmluZSB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpCQkocGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSkpCiAjZW5kaWYKQEAgLTEzMSwyNSArMTMyLDcgQEAKIH0KIAogc3RydWN0IHBjaV9idXM7CitpbnQgeDg2X3BjaV9yb290X2J1c19ub2RlKGludCBidXMpOwogdm9pZCB4ODZfcGNpX3Jvb3RfYnVzX3Jlc291cmNlcyhpbnQgYnVzLCBzdHJ1Y3QgbGlzdF9oZWFkICpyZXNvdXJjZXMpOwogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBtY19jYXBhYmxlKCkJKChib290X2NwdV9kYXRhLng4Nl9tYXhfY29yZXMgPiAxKSAmJiBcCi0JCQkoY3B1bWFza193ZWlnaHQoY3B1X2NvcmVfbWFzaygwKSkgIT0gbnJfY3B1X2lkcykpCi0jZGVmaW5lIHNtdF9jYXBhYmxlKCkJCQkoc21wX251bV9zaWJsaW5ncyA+IDEpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gaW50IGdldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtKTsKLWV4dGVybiB2b2lkIHNldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtLCBpbnQgbm9kZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgZ2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0pCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0sIGludCBub2RlKQotewotfQotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX1g4Nl9UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IGMyYTQ4MTMuLjNmNTU2YzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0yMyw2ICsyMyw5IEBACiAjICBpbmNsdWRlIDxhc20vdW5pc3RkXzY0Lmg+CiAjICBpbmNsdWRlIDxhc20vdW5pc3RkXzY0X3gzMi5oPgogIyAgZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQorIyAgZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfR0VUREVOVFM2NAorIyAgZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFJFQURWNjQKKyMgIGRlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1BXUklURVY2NAogCiAjIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaAppbmRleCBmZGRiNTNkLi5kMWRjNTU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oCkBAIC0xLDggKzEsNDUgQEAKICNpZm5kZWYgX0FTTV9YODZfVkRTT19ICiAjZGVmaW5lIF9BU01fWDg2X1ZEU09fSAogCisjaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpZmRlZiBfX0FTU0VNQkxFUl9fCisKKyNkZWZpbmUgREVGSU5FX1ZEU09fSU1BR0Uoc3ltbmFtZSwgZmlsZW5hbWUpCQkJCVwKK19fUEFHRV9BTElHTkVEX0RBVEEgOwkJCQkJCQlcCisJLmdsb2JsIHN5bW5hbWUjI19zdGFydCwgc3ltbmFtZSMjX2VuZCA7CQkJCVwKKwkuYWxpZ24gUEFHRV9TSVpFIDsJCQkJCQlcCisJc3ltbmFtZSMjX3N0YXJ0OiA7CQkJCQkJXAorCS5pbmNiaW4gZmlsZW5hbWUgOwkJCQkJCVwKKwlzeW1uYW1lIyNfZW5kOiA7CQkJCQkJXAorCS5hbGlnbiBQQUdFX1NJWkUgLyogZXh0cmEgZGF0YSBoZXJlIGxlYWtzIHRvIHVzZXJzcGFjZS4gKi8gOwlcCisJCQkJCQkJCQlcCisucHJldmlvdXMgOwkJCQkJCQkJXAorCQkJCQkJCQkJXAorCS5nbG9ibCBzeW1uYW1lIyNfcGFnZXMgOwkJCQkJXAorCS5ic3MgOwkJCQkJCQkJXAorCS5hbGlnbiA4IDsJCQkJCQkJXAorCS50eXBlIHN5bW5hbWUjI19wYWdlcywgQG9iamVjdCA7CQkJCVwKKwlzeW1uYW1lIyNfcGFnZXM6IDsJCQkJCQlcCisJLnplcm8gKHN5bW5hbWUjI19lbmQgLSBzeW1uYW1lIyNfc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRSAqIChCSVRTX1BFUl9MT05HIC8gOCkgOyBcCisJLnNpemUgc3ltbmFtZSMjX3BhZ2VzLCAuLXN5bW5hbWUjI19wYWdlcworCisjZWxzZQorCisjZGVmaW5lIERFQ0xBUkVfVkRTT19JTUFHRShzeW1uYW1lKQkJCQlcCisJZXh0ZXJuIGNoYXIgc3ltbmFtZSMjX3N0YXJ0W10sIHN5bW5hbWUjI19lbmRbXTsJCVwKKwlleHRlcm4gc3RydWN0IHBhZ2UgKnN5bW5hbWUjI19wYWdlc1tdCisKICNpZiBkZWZpbmVkIENPTkZJR19YODZfMzIgfHwgZGVmaW5lZCBDT05GSUdfQ09NUEFUCi1leHRlcm4gY29uc3QgY2hhciBWRFNPMzJfUFJFTElOS1tdOworCisjaW5jbHVkZSA8YXNtL3Zkc28zMi5oPgorCitERUNMQVJFX1ZEU09fSU1BR0UodmRzbzMyX2ludDgwKTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitERUNMQVJFX1ZEU09fSU1BR0UodmRzbzMyX3N5c2NhbGwpOworI2VuZGlmCitERUNMQVJFX1ZEU09fSU1BR0UodmRzbzMyX3N5c2VudGVyKTsKIAogLyoKICAqIEdpdmVuIGEgcG9pbnRlciB0byB0aGUgdkRTTyBpbWFnZSwgZmluZCB0aGUgcG9pbnRlciB0byBWRFNPMzJfbmFtZQpAQCAtMTEsOCArNDgsNyBAQAogI2RlZmluZSBWRFNPMzJfU1lNQk9MKGJhc2UsIG5hbWUpCQkJCQlcCiAoewkJCQkJCQkJCVwKIAlleHRlcm4gY29uc3QgY2hhciBWRFNPMzJfIyNuYW1lW107CQkJCVwKLQkodm9pZCBfX3VzZXIgKikoVkRTTzMyXyMjbmFtZSAtIFZEU08zMl9QUkVMSU5LICsJCVwKLQkJCSh1bnNpZ25lZCBsb25nKShiYXNlKSk7CQkJCVwKKwkodm9pZCBfX3VzZXIgKikoVkRTTzMyXyMjbmFtZSArICh1bnNpZ25lZCBsb25nKShiYXNlKSk7CQlcCiB9KQogI2VuZGlmCiAKQEAgLTIzLDEyICs1OSw4IEBACiBleHRlcm4gdm9pZCBfX3VzZXIgX19rZXJuZWxfc2lncmV0dXJuOwogZXh0ZXJuIHZvaWQgX191c2VyIF9fa2VybmVsX3J0X3NpZ3JldHVybjsKIAotLyoKLSAqIFRoZXNlIHN5bWJvbHMgYXJlIGRlZmluZWQgYnkgdmRzbzMyLlMgdG8gbWFyayB0aGUgYm91bmRzCi0gKiBvZiB0aGUgRUxGIERTTyBpbWFnZXMgaW5jbHVkZWQgdGhlcmVpbi4KLSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgdmRzbzMyX2ludDgwX3N0YXJ0LCB2ZHNvMzJfaW50ODBfZW5kOwotZXh0ZXJuIGNvbnN0IGNoYXIgdmRzbzMyX3N5c2NhbGxfc3RhcnQsIHZkc28zMl9zeXNjYWxsX2VuZDsKLWV4dGVybiBjb25zdCBjaGFyIHZkc28zMl9zeXNlbnRlcl9zdGFydCwgdmRzbzMyX3N5c2VudGVyX2VuZDsKK3ZvaWQgX19pbml0IHBhdGNoX3Zkc28zMih2b2lkICp2ZHNvLCBzaXplX3QgbGVuKTsKKworI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KIAogI2VuZGlmIC8qIF9BU01fWDg2X1ZEU09fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzbzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZiNzAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzbzMyLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9WRFNPMzJfSAorI2RlZmluZSBfQVNNX1g4Nl9WRFNPMzJfSAorCisjZGVmaW5lIFZEU09fQkFTRV9QQUdFCTAKKyNkZWZpbmUgVkRTT19WVkFSX1BBR0UJMQorI2RlZmluZSBWRFNPX0hQRVRfUEFHRQkyCisjZGVmaW5lIFZEU09fUEFHRVMJMworI2RlZmluZSBWRFNPX1BSRVZfUEFHRVMJMgorI2RlZmluZSBWRFNPX09GRlNFVCh4KQkoKHgpICogUEFHRV9TSVpFKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZndG9kLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92Z3RvZC5oCmluZGV4IDQ2ZTI0ZDMuLjNjMzM2NmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZndG9kLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmd0b2QuaApAQCAtMSwzMCArMSw3MyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9WR1RPRF9ICiAjZGVmaW5lIF9BU01fWDg2X1ZHVE9EX0gKIAotI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KIAorI2lmZGVmIEJVSUxEX1ZEU08zMl82NAordHlwZWRlZiB1NjQgZ3RvZF9sb25nX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGd0b2RfbG9uZ190OworI2VuZGlmCisvKgorICogdnN5c2NhbGxfZ3RvZF9kYXRhIHdpbGwgYmUgYWNjZXNzZWQgYnkgMzIgYW5kIDY0IGJpdCBjb2RlIGF0IHRoZSBzYW1lIHRpbWUKKyAqIHNvIGJlIGNhcmVmdWxsIGJ5IG1vZGlmeWluZyB0aGlzIHN0cnVjdHVyZS4KKyAqLwogc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSB7Ci0Jc2VxY291bnRfdAlzZXE7CisJdW5zaWduZWQgc2VxOwogCi0Jc3RydWN0IHsgLyogZXh0cmFjdCBvZiBhIGNsb2Nrc291cmNlIHN0cnVjdCAqLwotCQlpbnQgdmNsb2NrX21vZGU7Ci0JCWN5Y2xlX3QJY3ljbGVfbGFzdDsKLQkJY3ljbGVfdAltYXNrOwotCQl1MzIJbXVsdDsKLQkJdTMyCXNoaWZ0OwotCX0gY2xvY2s7CisJaW50IHZjbG9ja19tb2RlOworCWN5Y2xlX3QJY3ljbGVfbGFzdDsKKwljeWNsZV90CW1hc2s7CisJdTMyCW11bHQ7CisJdTMyCXNoaWZ0OwogCiAJLyogb3BlbiBjb2RlZCAnc3RydWN0IHRpbWVzcGVjJyAqLwotCXRpbWVfdAkJd2FsbF90aW1lX3NlYzsKIAl1NjQJCXdhbGxfdGltZV9zbnNlYzsKKwlndG9kX2xvbmdfdAl3YWxsX3RpbWVfc2VjOworCWd0b2RfbG9uZ190CW1vbm90b25pY190aW1lX3NlYzsKIAl1NjQJCW1vbm90b25pY190aW1lX3Nuc2VjOwotCXRpbWVfdAkJbW9ub3RvbmljX3RpbWVfc2VjOworCWd0b2RfbG9uZ190CXdhbGxfdGltZV9jb2Fyc2Vfc2VjOworCWd0b2RfbG9uZ190CXdhbGxfdGltZV9jb2Fyc2VfbnNlYzsKKwlndG9kX2xvbmdfdAltb25vdG9uaWNfdGltZV9jb2Fyc2Vfc2VjOworCWd0b2RfbG9uZ190CW1vbm90b25pY190aW1lX2NvYXJzZV9uc2VjOwogCi0Jc3RydWN0IHRpbWV6b25lIHN5c190ejsKLQlzdHJ1Y3QgdGltZXNwZWMgd2FsbF90aW1lX2NvYXJzZTsKLQlzdHJ1Y3QgdGltZXNwZWMgbW9ub3RvbmljX3RpbWVfY29hcnNlOworCWludAkJdHpfbWludXRlc3dlc3Q7CisJaW50CQl0el9kc3R0aW1lOwogfTsKIGV4dGVybiBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhIHZzeXNjYWxsX2d0b2RfZGF0YTsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBndG9kX3JlYWRfYmVnaW4oY29uc3Qgc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqcykKK3sKKwl1bnNpZ25lZCByZXQ7CisKK3JlcGVhdDoKKwlyZXQgPSBBQ0NFU1NfT05DRShzLT5zZXEpOworCWlmICh1bmxpa2VseShyZXQgJiAxKSkgeworCQljcHVfcmVsYXgoKTsKKwkJZ290byByZXBlYXQ7CisJfQorCXNtcF9ybWIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBndG9kX3JlYWRfcmV0cnkoY29uc3Qgc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqcywKKwkJCQkJdW5zaWduZWQgc3RhcnQpCit7CisJc21wX3JtYigpOworCXJldHVybiB1bmxpa2VseShzLT5zZXEgIT0gc3RhcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3RvZF93cml0ZV9iZWdpbihzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhICpzKQoreworCSsrcy0+c2VxOworCXNtcF93bWIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGd0b2Rfd3JpdGVfZW5kKHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgKnMpCit7CisJc21wX3dtYigpOworCSsrcy0+c2VxOworfQorCiAjZW5kaWYgLyogX0FTTV9YODZfVkdUT0RfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvY29iYWx0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9jb2JhbHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYjM3Ni4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9jb2JhbHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1ZJU1dTX0NPQkFMVF9ICi0jZGVmaW5lIF9BU01fWDg2X1ZJU1dTX0NPQkFMVF9ICi0KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0KLS8qCi0gKiBDb2JhbHQgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBzeXN0ZW0gQVNJQwotICovIAotCi0jZGVmaW5lIENPX0NQVV9OVU1fUEhZUyAweDFlMDAKLSNkZWZpbmUgQ09fQ1BVX1RBQl9QSFlTIChDT19DUFVfTlVNX1BIWVMgKyAyKQotCi0jZGVmaW5lIENPX0NQVV9NQVggNAotCi0jZGVmaW5lCUNPX0NQVV9QSFlTCQkweGMyMDAwMDAwCi0jZGVmaW5lCUNPX0FQSUNfUEhZUwkJMHhjNDAwMDAwMAotCi0vKiBzZWUgc2V0X2ZpeG1hcCgpIGFuZCBhc20vZml4bWFwLmggKi8KLSNkZWZpbmUJQ09fQ1BVX1ZBRERSCQkoZml4X3RvX3ZpcnQoRklYX0NPX0NQVSkpCi0jZGVmaW5lCUNPX0FQSUNfVkFERFIJCShmaXhfdG9fdmlydChGSVhfQ09fQVBJQykpCi0KLS8qIENvYmFsdCBDUFUgcmVnaXN0ZXJzIC0tIHJlbGF0aXZlIHRvIENPX0NQVV9WQUREUiwgdXNlIGNvX2NwdV8qKCkgKi8KLSNkZWZpbmUJQ09fQ1BVX1JFVgkJMHgwOAotI2RlZmluZQlDT19DUFVfQ1RSTAkJMHgxMAotI2RlZmluZQlDT19DUFVfU1RBVAkJMHgyMAotI2RlZmluZQlDT19DUFVfVElNRVZBTAkJMHgzMAotCi0vKiBDT19DUFVfQ1RSTCBiaXRzICovCi0jZGVmaW5lCUNPX0NUUkxfVElNRVJVTgkJMHgwNAkJLyogMCA9PSBkaXNhYmxlZCAqLwotI2RlZmluZQlDT19DVFJMX1RJTUVNQVNLCTB4MDgJCS8qIDAgPT0gdW5tYXNrZWQgKi8KLQotLyogQ09fQ1BVX1NUQVRVUyBiaXRzICovCi0jZGVmaW5lCUNPX1NUQVRfVElNRUlOVFIJMHgwMgkvKiAocikgMSA9PSBpbnQgcGVuZCwgKHcpIDAgPT0gY2xlYXIgKi8KLQotLyogQ09fQ1BVX1RJTUVWQUwgdmFsdWUgKi8KLSNkZWZpbmUJQ09fVElNRV9IWgkJMTAwMDAwMDAwCS8qIENvYmFsdCBjb3JlIHJhdGUgKi8KLQotLyogQ29iYWx0IEFQSUMgcmVnaXN0ZXJzIC0tIHJlbGF0aXZlIHRvIENPX0FQSUNfVkFERFIsIHVzZSBjb19hcGljXyooKSAqLwotI2RlZmluZQlDT19BUElDX0hJKG4pCQkoKChuKSAqIDB4MTApICsgNCkKLSNkZWZpbmUJQ09fQVBJQ19MTyhuKQkJKChuKSAqIDB4MTApCi0jZGVmaW5lCUNPX0FQSUNfSUQJCTB4MGZmYwotCi0vKiBDT19BUElDX0lEIGJpdHMgKi8KLSNkZWZpbmUJQ09fQVBJQ19FTkFCTEUJCTB4MDAwMDAxMDAKLQotLyogQ09fQVBJQ19MTyBiaXRzICovCi0jZGVmaW5lCUNPX0FQSUNfTUFTSwkJMHgwMDAxMDAwMAkvKiAwID0gZW5hYmxlZCAqLwotI2RlZmluZQlDT19BUElDX0xFVkVMCQkweDAwMDA4MDAwCS8qIDAgPSBlZGdlICovCi0KLS8qCi0gKiBXaGVyZSB0aGluZ3MgYXJlIHBoeXNpY2FsbHkgd2lyZWQgdG8gQ29iYWx0Ci0gKiAjZGVmaW5lcyB3aXRoIG5vIGJvYXJkIF88dHlwZT5fPHJldj5fIGFyZSBjb21tb24gdG8gYWxsICh0aHVzIGZhcikKLSAqLwotI2RlZmluZQlDT19BUElDX0lERTAJCTQKLSNkZWZpbmUgQ09fQVBJQ19JREUxCQkyCQkvKiBPbmx5IG9uIDMyMCAqLwotCi0jZGVmaW5lCUNPX0FQSUNfODI1OQkJMTIJCS8qIHNlcmlhbCwgZmxvcHB5LCBwYXItbC1sICovCi0KLS8qIExpdGhpdW0gUENJIEJyaWRnZSBBIC0tICJ0aGUgb25lIHdpdGggODI1NTcgRXRoZXJuZXQiICovCi0jZGVmaW5lCUNPX0FQSUNfUENJQV9CQVNFMAkwIC8qIGFuZCAxICovCS8qIHNsb3QgMCwgbGluZSAwICovCi0jZGVmaW5lCUNPX0FQSUNfUENJQV9CQVNFMTIzCTUgLyogYW5kIDYgKi8JLyogc2xvdCAwLCBsaW5lIDEgKi8KLQotI2RlZmluZQlDT19BUElDX1BJSVg0X1VTQgk3CQkvKiB0aGlzIG9uZSBpcyB3ZWlyZCAqLwotCi0vKiBMaXRoaXVtIFBDSSBCcmlkZ2UgQiAtLSAidGhlIG9uZSB3aXRoIFBJSVg0IiAqLwotI2RlZmluZQlDT19BUElDX1BDSUJfQkFTRTAJOCAvKiBhbmQgOS0xMiAqLy8qIHNsb3QgMCwgbGluZSAwICovCi0jZGVmaW5lCUNPX0FQSUNfUENJQl9CQVNFMTIzCTEzIC8qIDE0LjE1ICovCS8qIHNsb3QgMCwgbGluZSAxICovCi0KLSNkZWZpbmUJQ09fQVBJQ19WSURPVVQwCQkxNgotI2RlZmluZQlDT19BUElDX1ZJRE9VVDEJCTE3Ci0jZGVmaW5lCUNPX0FQSUNfVklESU4wCQkxOAotI2RlZmluZQlDT19BUElDX1ZJRElOMQkJMTkKLQotI2RlZmluZQlDT19BUElDX0xJX0FVRElPCTIyCi0KLSNkZWZpbmUJQ09fQVBJQ19BUwkJMjQKLSNkZWZpbmUJQ09fQVBJQ19SRQkJMjUKLQotI2RlZmluZSBDT19BUElDX0NQVQkJMjgJCS8qIFRpbWVyIGFuZCBDYWNoZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUJQ09fQVBJQ19OTUkJCTI5Ci0jZGVmaW5lCUNPX0FQSUNfTEFTVAkJQ09fQVBJQ19OTUkKLQotLyoKLSAqIFRoaXMgaXMgaG93IGlycXMgYXJlIGFzc2lnbmVkIG9uIHRoZSBWaXN1YWwgV29ya3N0YXRpb24uCi0gKiBMZWdhY3kgZGV2aWNlcyBnZXQgaXJxJ3MgMS0xNSAoc3lzdGVtIGNsb2NrIGlzIDAgYW5kIGlzIENPX0FQSUNfQ1BVKS4KLSAqIEFsbCBvdGhlciBkZXZpY2VzIChpbmNsdWRpbmcgUENJKSBnbyB0byBDb2JhbHQgYW5kIGFyZSBpcnEncyAxNiBvbiB1cC4KLSAqLwotI2RlZmluZQlDT19JUlFfQVBJQzAJMTYJCQkvKiBpcnEgb2YgYXBpYyBlbnRyeSAwICovCi0jZGVmaW5lCUlTX0NPX0FQSUMoaXJxKQkoKGlycSkgPj0gQ09fSVJRX0FQSUMwKQotI2RlZmluZQlDT19JUlEoYXBpYykJKENPX0lSUV9BUElDMCArIChhcGljKSkJLyogYXBpYyBlbnQgdG8gaXJxICovCi0jZGVmaW5lCUNPX0FQSUMoaXJxKQkoKGlycSkgLSBDT19JUlFfQVBJQzApCS8qIGlycSB0byBhcGljIGVudCAqLwotI2RlZmluZSBDT19JUlFfSURFMAkxNAkJCS8qIGtub3dsZWRnZSBvZi4uLiAqLwotI2RlZmluZSBDT19JUlFfSURFMQkxNQkJCS8qIC4uLiBpZGUgZHJpdmVyIGRlZmF1bHRzISAqLwotI2RlZmluZQlDT19JUlFfODI1OQlDT19JUlEoQ09fQVBJQ184MjU5KQotCi0jaWZkZWYgQ09ORklHX1g4Nl9WSVNXU19BUElDCi1zdGF0aWMgaW5saW5lIHZvaWQgY29fY3B1X3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHYpCi17Ci0JKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShDT19DUFVfVkFERFIrcmVnKSk9djsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvX2NwdV9yZWFkKHVuc2lnbmVkIGxvbmcgcmVnKQotewotCXJldHVybiAqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKENPX0NQVV9WQUREUityZWcpKTsKLX0gICAgICAgICAgICAKLSAgICAgICAgICAgICAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb19hcGljX3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHYpCi17Ci0JKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShDT19BUElDX1ZBRERSK3JlZykpPXY7Ci19ICAgICAgICAgICAgCi0gICAgICAgICAgICAgCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29fYXBpY19yZWFkKHVuc2lnbmVkIGxvbmcgcmVnKQotewotCXJldHVybiAqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKENPX0FQSUNfVkFERFIrcmVnKSk7Ci19Ci0jZW5kaWYKLQotZXh0ZXJuIGNoYXIgdmlzd3NfYm9hcmRfdHlwZTsKLQotI2RlZmluZQlWSVNXU18zMjAJMAotI2RlZmluZQlWSVNXU181NDAJMQotCi1leHRlcm4gY2hhciB2aXN3c19ib2FyZF9yZXY7Ci0KLWV4dGVybiBpbnQgcGNpX3Zpc3dzX2luaXQodm9pZCk7Ci0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9WSVNXU19DT0JBTFRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvbGl0aGl1bS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvbGl0aGl1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTBkODliLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL2xpdGhpdW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNpZm5kZWYgX0FTTV9YODZfVklTV1NfTElUSElVTV9ICi0jZGVmaW5lIF9BU01fWDg2X1ZJU1dTX0xJVEhJVU1fSAotCi0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotCi0vKgotICogTGl0aGl1bSBpcyB0aGUgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBJL08gQVNJQwotICovCi0KLSNkZWZpbmUJTElfUENJX0FfUEhZUwkJMHhmYzAwMDAwMAkvKiBFbmV0IGlzIGRldiAzICovCi0jZGVmaW5lCUxJX1BDSV9CX1BIWVMJCTB4ZmQwMDAwMDAJLyogUElJWDQgaXMgaGVyZSAqLwotCi0vKiBzZWUgc2V0X2ZpeG1hcCgpIGFuZCBhc20vZml4bWFwLmggKi8KLSNkZWZpbmUgTElfUENJQV9WQUREUiAgIChmaXhfdG9fdmlydChGSVhfTElfUENJQSkpCi0jZGVmaW5lIExJX1BDSUJfVkFERFIgICAoZml4X3RvX3ZpcnQoRklYX0xJX1BDSUIpKQotCi0vKiBOb3QgYSBzdGFuZGFyZCBQQ0k/IChub3QgaW4gbGludXgvcGNpLmgpICovCi0jZGVmaW5lCUxJX1BDSV9CVVNOVU0JMHg0NAkJCS8qIGxvODogcHJpbWFyeSwgaGk4OiBzdWIgKi8KLSNkZWZpbmUgTElfUENJX0lOVEVOICAgIDB4NDYKLQotLyogTElfUENJX0lOVEVOVCBiaXRzICovCi0jZGVmaW5lCUxJX0lOVEFfMAkweDAwMDEKLSNkZWZpbmUJTElfSU5UQV8xCTB4MDAwMgotI2RlZmluZQlMSV9JTlRBXzIJMHgwMDA0Ci0jZGVmaW5lCUxJX0lOVEFfMwkweDAwMDgKLSNkZWZpbmUJTElfSU5UQV80CTB4MDAxMAotI2RlZmluZQlMSV9JTlRCCQkweDAwMjAKLSNkZWZpbmUJTElfSU5UQwkJMHgwMDQwCi0jZGVmaW5lCUxJX0lOVEQJCTB4MDA4MAotCi0vKiBNb3JlIHNwZWNpYWwgcHVycG9zZSBtYWNyb3MuLi4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBsaV9wY2lhX3dyaXRlMTYodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIHNob3J0IHYpCi17Ci0JKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoTElfUENJQV9WQUREUityZWcpKT12OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGxpX3BjaWFfcmVhZDE2KHVuc2lnbmVkIGxvbmcgcmVnKQotewotCSByZXR1cm4gKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoTElfUENJQV9WQUREUityZWcpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxpX3BjaWJfd3JpdGUxNih1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgc2hvcnQgdikKLXsKLQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShMSV9QQ0lCX1ZBRERSK3JlZykpPXY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgbGlfcGNpYl9yZWFkMTYodW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuICooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKExJX1BDSUJfVkFERFIrcmVnKSk7Ci19Ci0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9WSVNXU19MSVRISVVNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvcGlpeDQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL3BpaXg0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWY0ZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvcGlpeDQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1ZJU1dTX1BJSVg0X0gKLSNkZWZpbmUgX0FTTV9YODZfVklTV1NfUElJWDRfSAotCi0vKgotICogUElJWDQgYXMgdXNlZCBvbiBTR0kgVmlzdWFsIFdvcmtzdGF0aW9ucwotICovCi0KLSNkZWZpbmUJUElJWF9QTV9TVEFSVAkJMHgwRjgwCi0KLSNkZWZpbmUJU0lPX0dQSU9fU1RBUlQJCTB4MEZDMAotCi0jZGVmaW5lCVNJT19QTV9TVEFSVAkJMHgwRkM4Ci0KLSNkZWZpbmUJUE1CQVNFCQkJUElJWF9QTV9TVEFSVAotI2RlZmluZQlHUElSRUcwCQkJKFBNQkFTRSsweDMwKQotI2RlZmluZQlHUElSRUcoeCkJCShHUElSRUcwKygoeCkvOCkpCi0jZGVmaW5lCUdQSUJJVCh4KQkJKDEgPDwgKCh4KSU4KSkKLQotI2RlZmluZQlQSUlYX0dQSV9CRF9JRDEJCTE4Ci0jZGVmaW5lCVBJSVhfR1BJX0JEX0lEMgkJMTkKLSNkZWZpbmUJUElJWF9HUElfQkRfSUQzCQkyMAotI2RlZmluZQlQSUlYX0dQSV9CRF9JRDQJCTIxCi0jZGVmaW5lCVBJSVhfR1BJX0JEX1JFRwkJR1BJUkVHKFBJSVhfR1BJX0JEX0lEMSkKLSNkZWZpbmUJUElJWF9HUElfQkRfTUFTSwkoR1BJQklUKFBJSVhfR1BJX0JEX0lEMSkgfCBcCi0JCQkJR1BJQklUKFBJSVhfR1BJX0JEX0lEMikgfCBcCi0JCQkJR1BJQklUKFBJSVhfR1BJX0JEX0lEMykgfCBcCi0JCQkJR1BJQklUKFBJSVhfR1BJX0JEX0lENCkgKQotCi0jZGVmaW5lCVBJSVhfR1BJX0JEX1NISUZUCShQSUlYX0dQSV9CRF9JRDEgJSA4KQotCi0jZGVmaW5lCVNJT19JTkRFWAkJMHgyZQotI2RlZmluZQlTSU9fREFUQQkJMHgyZgotCi0jZGVmaW5lCVNJT19ERVZfU0VMCQkweDcKLSNkZWZpbmUJU0lPX0RFVl9FTkIJCTB4MzAKLSNkZWZpbmUJU0lPX0RFVl9NU0IJCTB4NjAKLSNkZWZpbmUJU0lPX0RFVl9MU0IJCTB4NjEKLQotI2RlZmluZQlTSU9fR1BfREVWCQkweDcKLQotI2RlZmluZQlTSU9fR1BfQkFTRQkJU0lPX0dQSU9fU1RBUlQKLSNkZWZpbmUJU0lPX0dQX01TQgkJKFNJT19HUF9CQVNFPj44KQotI2RlZmluZQlTSU9fR1BfTFNCCQkoU0lPX0dQX0JBU0UmMHhmZikKLQotI2RlZmluZQlTSU9fR1BfREFUQTEJCShTSU9fR1BfQkFTRSswKQotCi0jZGVmaW5lCVNJT19QTV9ERVYJCTB4OAotCi0jZGVmaW5lCVNJT19QTV9CQVNFCQlTSU9fUE1fU1RBUlQKLSNkZWZpbmUJU0lPX1BNX01TQgkJKFNJT19QTV9CQVNFPj44KQotI2RlZmluZQlTSU9fUE1fTFNCCQkoU0lPX1BNX0JBU0UmMHhmZikKLSNkZWZpbmUJU0lPX1BNX0lOREVYCQkoU0lPX1BNX0JBU0UrMCkKLSNkZWZpbmUJU0lPX1BNX0RBVEEJCShTSU9fUE1fQkFTRSsxKQotCi0jZGVmaW5lCVNJT19QTV9GRVIyCQkweDEKLQotI2RlZmluZQlTSU9fUE1fR1BfRU4JCTB4ODAKLQotCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBkZXYvcmVnIHdoZXJlIGdlbmVyYXRpbmcgYSBjb25maWcgY3ljbGUgd2lsbAotICogcmVzdWx0IGluIGEgUENJIHNwZWNpYWwgY3ljbGUuCi0gKi8KLSNkZWZpbmUgU1BFQ0lBTF9ERVYJCTB4ZmYKLSNkZWZpbmUgU1BFQ0lBTF9SRUcJCTB4MDAKLQotLyoKLSAqIFBJSVg0IG5lZWRzIHRvIHNlZSBhIHNwZWNpYWwgY3ljbGUgd2l0aCB0aGUgZm9sbG93aW5nIGRhdGEKLSAqIHRvIGJlIGNvbnZpbmNlZCB0aGUgcHJvY2Vzc29yIGhhcyBnb25lIGludG8gdGhlIHN0b3AgZ3JhbnQKLSAqIHN0YXRlLiAgUElJWDQgaW5zaXN0cyBvbiBzZWVpbmcgdGhpcyBiZWZvcmUgaXQgd2lsbCBwb3dlcgotICogZG93biBhIHN5c3RlbS4KLSAqLwotI2RlZmluZSBQSUlYX1NQRUNJQUxfU1RPUAkJMHgwMDEyMDAwMgotCi0jZGVmaW5lIFBJSVg0X1JFU0VUX1BPUlQJMHhjZjkKLSNkZWZpbmUgUElJWDRfUkVTRVRfVkFMCQkweDYKLQotI2RlZmluZSBQTVNUU19QT1JUCQkweGY4MAkvLyAyIGJ5dGVzCVBNIFN0YXR1cwotI2RlZmluZSBQTUVOX1BPUlQJCTB4ZjgyCS8vIDIgYnl0ZXMJUE0gRW5hYmxlCi0jZGVmaW5lCVBNQ05UUkxfUE9SVAkJMHhmODQJLy8gMiBieXRlcwlQTSBDb250cm9sCi0KLSNkZWZpbmUgUE1fU1VTUEVORF9FTkFCTEUJMHgyMDAwCS8vIHN0YXJ0IHNlcXVlbmNlIHRvIHN1c3BlbmQgc3RhdGUKLQotLyoKLSAqIFBNU1RTIGFuZCBQTUVOIEkvTyBiaXQgZGVmaW5pdGlvbnMuCi0gKiAoQml0cyBhcmUgdGhlIHNhbWUgaW4gYm90aCByZWdpc3RlcnMpCi0gKi8KLSNkZWZpbmUgUE1fU1RTX1JTTQkJKDE8PDE1KQkvLyBSZXN1bWUgU3RhdHVzCi0jZGVmaW5lIFBNX1NUU19QV1JCVE5PUgkJKDE8PDExKQkvLyBQb3dlciBCdXR0b24gT3ZlcnJpZGUKLSNkZWZpbmUgUE1fU1RTX1JUQwkJKDE8PDEwKQkvLyBSVEMgc3RhdHVzCi0jZGVmaW5lIFBNX1NUU19QV1JCVE4JCSgxPDw4KQkvLyBQb3dlciBCdXR0b24gUHJlc3NlZD8KLSNkZWZpbmUgUE1fU1RTX0dCTAkJKDE8PDUpCS8vIEdsb2JhbCBTdGF0dXMKLSNkZWZpbmUgUE1fU1RTX0JNCQkoMTw8NCkJLy8gQnVzIE1hc3RlciBTdGF0dXMKLSNkZWZpbmUgUE1fU1RTX1RNUk9GCQkoMTw8MCkJLy8gVGltZXIgT3ZlcmZsb3cgU3RhdHVzLgotCi0vKgotICogU3RvcCBjbG9jayBHUEkgcmVnaXN0ZXIKLSAqLwotI2RlZmluZSBQSUlYX0dQSVJFRzAJCQkoMHhmODAgKyAweDMwKQotCi0vKgotICogU3RvcCBjbG9jayBHUEkgYml0IGluIEdQSVJFRzAKLSAqLwotI2RlZmluZQlQSUlYX0dQSV9TVFBDTEsJCTB4NAkvLyBTVFBDTEsgc2lnbmFsIHJvdXRlZCBiYWNrIGluCi0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9WSVNXU19QSUlYNF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9zZ2l2dy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3Mvc2dpdncuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiZjYzZS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9zZ2l2dy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKgotICogRnJhbWUgYnVmZmVyIHBvc2l0aW9uIGFuZCBzaXplOgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9waHlzOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Z2YXIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Z2YXIuaAppbmRleCBkNzZhYzQwLi4wODFkOTA5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92dmFyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdnZhci5oCkBAIC0xNiw4ICsxNiw4IEBACiAgKiB5b3UgbWVzcyB1cCwgdGhlIGxpbmtlciB3aWxsIGNhdGNoIGl0LikKICAqLwogCi0vKiBCYXNlIGFkZHJlc3Mgb2YgdnZhcnMuICBUaGlzIGlzIG5vdCBBQkkuICovCi0jZGVmaW5lIFZWQVJfQUREUkVTUyAoLTEwKjEwMjQqMTAyNCAtIDQwOTYpCisjaWZuZGVmIF9BU01fWDg2X1ZWQVJfSAorI2RlZmluZSBfQVNNX1g4Nl9WVkFSX0gKIAogI2lmIGRlZmluZWQoX19WVkFSX0tFUk5FTF9MRFMpCiAKQEAgLTI5LDE2ICsyOSwzNSBAQAogCiAjZWxzZQogCisjaWZkZWYgQlVJTERfVkRTTzMyCisKKyNkZWZpbmUgREVDTEFSRV9WVkFSKG9mZnNldCwgdHlwZSwgbmFtZSkJCQkJXAorCWV4dGVybiB0eXBlIHZ2YXJfICMjIG5hbWUgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKTsKKworI2RlZmluZSBWVkFSKG5hbWUpICh2dmFyXyAjIyBuYW1lKQorCisjZWxzZQorCitleHRlcm4gY2hhciBfX3Z2YXJfcGFnZTsKKworLyogQmFzZSBhZGRyZXNzIG9mIHZ2YXJzLiAgVGhpcyBpcyBub3QgQUJJLiAqLworI2lmZGVmIENPTkZJR19YODZfNjQKKyNkZWZpbmUgVlZBUl9BRERSRVNTICgtMTAqMTAyNCoxMDI0IC0gNDA5NikKKyNlbHNlCisjZGVmaW5lIFZWQVJfQUREUkVTUyAoJl9fdnZhcl9wYWdlKQorI2VuZGlmCisKICNkZWZpbmUgREVDTEFSRV9WVkFSKG9mZnNldCwgdHlwZSwgbmFtZSkJCQkJXAogCXN0YXRpYyB0eXBlIGNvbnN0ICogY29uc3QgdnZhcmFkZHJfICMjIG5hbWUgPQkJCVwKIAkJKHZvaWQgKikoVlZBUl9BRERSRVNTICsgKG9mZnNldCkpOwogCisjZGVmaW5lIFZWQVIobmFtZSkgKCp2dmFyYWRkcl8gIyMgbmFtZSkKKyNlbmRpZgorCiAjZGVmaW5lIERFRklORV9WVkFSKHR5cGUsIG5hbWUpCQkJCQkJXAogCXR5cGUgbmFtZQkJCQkJCQlcCiAJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLnZ2YXJfIiAjbmFtZSksIGFsaWduZWQoMTYpKSkgX192aXNpYmxlCiAKLSNkZWZpbmUgVlZBUihuYW1lKSAoKnZ2YXJhZGRyXyAjIyBuYW1lKQotCiAjZW5kaWYKIAogLyogREVDTEFSRV9WVkFSKG9mZnNldCwgdHlwZSwgbmFtZSkgKi8KQEAgLTQ4LDMgKzY3LDUgQEAKIERFQ0xBUkVfVlZBUigxMjgsIHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEsIHZzeXNjYWxsX2d0b2RfZGF0YSkKIAogI3VuZGVmIERFQ0xBUkVfVlZBUgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hzYXZlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94c2F2ZS5oCmluZGV4IDU1NDczODkuLjZjMWQ3NDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hzYXZlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veHNhdmUuaApAQCAtNiwxMSArNiwxNCBAQAogCiAjZGVmaW5lIFhTVEFURV9DUFVJRAkJMHgwMDAwMDAwZAogCi0jZGVmaW5lIFhTVEFURV9GUAkweDEKLSNkZWZpbmUgWFNUQVRFX1NTRQkweDIKLSNkZWZpbmUgWFNUQVRFX1lNTQkweDQKLSNkZWZpbmUgWFNUQVRFX0JORFJFR1MJMHg4Ci0jZGVmaW5lIFhTVEFURV9CTkRDU1IJMHgxMAorI2RlZmluZSBYU1RBVEVfRlAJCTB4MQorI2RlZmluZSBYU1RBVEVfU1NFCQkweDIKKyNkZWZpbmUgWFNUQVRFX1lNTQkJMHg0CisjZGVmaW5lIFhTVEFURV9CTkRSRUdTCQkweDgKKyNkZWZpbmUgWFNUQVRFX0JORENTUgkJMHgxMAorI2RlZmluZSBYU1RBVEVfT1BNQVNLCQkweDIwCisjZGVmaW5lIFhTVEFURV9aTU1fSGkyNTYJMHg0MAorI2RlZmluZSBYU1RBVEVfSGkxNl9aTU0JCTB4ODAKIAogI2RlZmluZSBYU1RBVEVfRlBTU0UJKFhTVEFURV9GUCB8IFhTVEFURV9TU0UpCiAKQEAgLTIzLDcgKzI2LDggQEAKICNkZWZpbmUgWFNBVkVfWU1NX09GRlNFVCAgICAoWFNBVkVfSERSX1NJWkUgKyBYU0FWRV9IRFJfT0ZGU0VUKQogCiAvKiBTdXBwb3J0ZWQgZmVhdHVyZXMgd2hpY2ggc3VwcG9ydCBsYXp5IHN0YXRlIHNhdmluZyAqLwotI2RlZmluZSBYU1RBVEVfTEFaWQkoWFNUQVRFX0ZQIHwgWFNUQVRFX1NTRSB8IFhTVEFURV9ZTU0pCisjZGVmaW5lIFhTVEFURV9MQVpZCShYU1RBVEVfRlAgfCBYU1RBVEVfU1NFIHwgWFNUQVRFX1lNTQkJICAgICAgXAorCQkJfCBYU1RBVEVfT1BNQVNLIHwgWFNUQVRFX1pNTV9IaTI1NiB8IFhTVEFURV9IaTE2X1pNTSkKIAogLyogU3VwcG9ydGVkIGZlYXR1cmVzIHdoaWNoIHJlcXVpcmUgZWFnZXIgc3RhdGUgc2F2aW5nICovCiAjZGVmaW5lIFhTVEFURV9FQUdFUgkoWFNUQVRFX0JORFJFR1MgfCBYU1RBVEVfQk5EQ1NSKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tc3ItaW5kZXguaCBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbXNyLWluZGV4LmgKaW5kZXggYzE5ZmM2MC4uNDkyNGY0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tc3ItaW5kZXguaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21zci1pbmRleC5oCkBAIC0zNjgsMzMgKzM2OCw1OCBAQAogI2RlZmluZSBUSEVSTV9MT0dfVEhSRVNIT0xEMSAgICAgICAgICAgKDEgPDwgOSkKIAogLyogTUlTQ19FTkFCTEUgYml0czogYXJjaGl0ZWN0dXJhbCAqLwotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklORwkoMVVMTCA8PCAwKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UQ0MJCSgxVUxMIDw8IDEpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VNT04JCSgxVUxMIDw8IDcpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0JUU19VTkFWQUlMCSgxVUxMIDw8IDExKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwJKDFVTEwgPDwgMTIpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VOSEFOQ0VEX1NQRUVEU1RFUAkoMVVMTCA8PCAxNikKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTVdBSVQJCSgxVUxMIDw8IDE4KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MSU1JVF9DUFVJRAkoMVVMTCA8PCAyMikKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFCSgxVUxMIDw8IDIzKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YRF9ESVNBQkxFCQkoMVVMTCA8PCAzNCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkFTVF9TVFJJTkdfQklUCQkwCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklOR19CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQ19CSVQJCQkxCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQwkJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQ19CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VNT05fQklUCQkJNworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTU9OCQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU1PTl9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0JUU19VTkFWQUlMX0JJVAkJMTEKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQlRTX1VOQVZBSUwJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX0JUU19VTkFWQUlMX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMX0JJVAkJMTIKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUxfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTkhBTkNFRF9TUEVFRFNURVBfQklUCTE2CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VOSEFOQ0VEX1NQRUVEU1RFUAkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU5IQU5DRURfU1BFRURTVEVQX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTVdBSVRfQklUCQkJMTgKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTVdBSVQJCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NV0FJVF9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlEX0JJVAkJMjIKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTElNSVRfQ1BVSUQJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlEX0JJVCk7CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hUUFJfRElTQUJMRV9CSVQJCTIzCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hUUFJfRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWERfRElTQUJMRV9CSVQJCTM0CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hEX0RJU0FCTEUJCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YRF9ESVNBQkxFX0JJVCkKIAogLyogTUlTQ19FTkFCTEUgYml0czogbW9kZWwtc3BlY2lmaWMsIG1lYW5pbmcgbWF5IHZhcnkgZnJvbSBjb3JlIHRvIGNvcmUgKi8KLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWDg3X0NPTVBBVAkJKDFVTEwgPDwgMikKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0xCQkoMVVMTCA8PCAzKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9TUExJVF9MT0NLX0RJU0FCTEUJKDFVTEwgPDwgNCkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDNDQUNIRV9ESVNBQkxFCSgxVUxMIDw8IDYpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NVUFBSRVNTX0xPQ0sJKDFVTEwgPDwgOCkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUFJFRkVUQ0hfRElTQUJMRQkoMVVMTCA8PCA5KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSCQkoMVVMTCA8PCAxMCkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkVSUl9NVUxUSVBMRVgJKDFVTEwgPDwgMTApCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMgkJKDFVTEwgPDwgMTMpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0FESl9QUkVGX0RJU0FCTEUJKDFVTEwgPDwgMTkpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQRUVEU1RFUF9MT0NLCSgxVUxMIDw8IDIwKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MMURfQ09OVEVYVAkoMVVMTCA8PCAyNCkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRENVX1BSRUZfRElTQUJMRQkoMVVMTCA8PCAzNykKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVFVSQk9fRElTQUJMRQkoMVVMTCA8PCAzOCkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfSVBfUFJFRl9ESVNBQkxFCSgxVUxMIDw8IDM5KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YODdfQ09NUEFUX0JJVAkJMgorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YODdfQ09NUEFUCQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWDg3X0NPTVBBVF9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMV9CSVQJCQkzCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMQkJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMV9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQTElUX0xPQ0tfRElTQUJMRV9CSVQJNAorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9TUExJVF9MT0NLX0RJU0FCTEUJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQTElUX0xPQ0tfRElTQUJMRV9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wzQ0FDSEVfRElTQUJMRV9CSVQJNgorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MM0NBQ0hFX0RJU0FCTEUJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX0wzQ0FDSEVfRElTQUJMRV9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NVUFBSRVNTX0xPQ0tfQklUCQk4CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NVUFBSRVNTX0xPQ0sJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1NVUFBSRVNTX0xPQ0tfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFX0JJVAk5CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1BSRUZFVENIX0RJU0FCTEUJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1BSRUZFVENIX0RJU0FCTEVfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX0JJVAkJCTEwCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlIJCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkVSUl9NVUxUSVBMRVhfQklUCQkxMAorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX01VTFRJUExFWAkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkVSUl9NVUxUSVBMRVhfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTJfQklUCQkJMTMKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0yCQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0yX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQURKX1BSRUZfRElTQUJMRV9CSVQJMTkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQURKX1BSRUZfRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQURKX1BSRUZfRElTQUJMRV9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQRUVEU1RFUF9MT0NLX0JJVAkJMjAKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BFRURTVEVQX0xPQ0sJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQRUVEU1RFUF9MT0NLX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDFEX0NPTlRFWFRfQklUCQkyNAorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MMURfQ09OVEVYVAkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDFEX0NPTlRFWFRfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9EQ1VfUFJFRl9ESVNBQkxFX0JJVAkzNworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9EQ1VfUFJFRl9ESVNBQkxFCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9EQ1VfUFJFRl9ESVNBQkxFX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVFVSQk9fRElTQUJMRV9CSVQJCTM4CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RVUkJPX0RJU0FCTEUJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1RVUkJPX0RJU0FCTEVfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9JUF9QUkVGX0RJU0FCTEVfQklUCTM5CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0lQX1BSRUZfRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfSVBfUFJFRl9ESVNBQkxFX0JJVCkKIAogI2RlZmluZSBNU1JfSUEzMl9UU0NfREVBRExJTkUJCTB4MDAwMDA2RTAKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCmluZGV4IGNiNjQ4YzguLmY0ZDk2MDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIG9iai15CQkJKz0gcHJvYmVfcm9tcy5vCiBvYmotJChDT05GSUdfWDg2XzMyKQkrPSBpMzg2X2tzeW1zXzMyLm8KIG9iai0kKENPTkZJR19YODZfNjQpCSs9IHN5c194ODZfNjQubyB4ODY2NF9rc3ltc182NC5vCi1vYmoteQkJCSs9IHN5c2NhbGxfJChCSVRTKS5vCitvYmoteQkJCSs9IHN5c2NhbGxfJChCSVRTKS5vIHZzeXNjYWxsX2d0b2Qubwogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gdnN5c2NhbGxfNjQubwogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gdnN5c2NhbGxfZW11XzY0Lm8KIG9iai0kKENPTkZJR19TWVNGUykJKz0ga3N5c2ZzLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCAxMjNmOWUzLi44NjI4MWZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC02MDksMTAgKzYwOSwxMCBAQAogCWludCBuaWQ7CiAKIAluaWQgPSBhY3BpX2dldF9ub2RlKGhhbmRsZSk7Ci0JaWYgKG5pZCA9PSAtMSB8fCAhbm9kZV9vbmxpbmUobmlkKSkKLQkJcmV0dXJuOwotCXNldF9hcGljaWRfdG9fbm9kZShwaHlzaWQsIG5pZCk7Ci0JbnVtYV9zZXRfbm9kZShjcHUsIG5pZCk7CisJaWYgKG5pZCAhPSAtMSkgeworCQlzZXRfYXBpY2lkX3RvX25vZGUocGh5c2lkLCBuaWQpOworCQludW1hX3NldF9ub2RlKGNwdSwgbmlkKTsKKwl9CiAjZW5kaWYKIH0KIApAQCAtOTAzLDEwICs5MDMsNiBAQAogI2lmZGVmCUNPTkZJR19YODZfSU9fQVBJQwogI2RlZmluZSBNUF9JU0FfQlVTCQkwCiAKLSNpZmRlZiBDT05GSUdfWDg2X0VTNzAwMAotZXh0ZXJuIGludCBlczcwMDBfcGxhdDsKLSNlbmRpZgotCiB2b2lkIF9faW5pdCBtcF9vdmVycmlkZV9sZWdhY3lfaXJxKHU4IGJ1c19pcnEsIHU4IHBvbGFyaXR5LCB1OCB0cmlnZ2VyLCB1MzIgZ3NpKQogewogCWludCBpb2FwaWM7CkBAIC05NTYsMTQgKzk1Miw2IEBACiAJc2V0X2JpdChNUF9JU0FfQlVTLCBtcF9idXNfbm90X3BjaSk7CiAJcHJfZGVidWcoIkJ1cyAjJWQgaXMgSVNBXG4iLCBNUF9JU0FfQlVTKTsKIAotI2lmZGVmIENPTkZJR19YODZfRVM3MDAwCi0JLyoKLQkgKiBPbGRlciBnZW5lcmF0aW9ucyBvZiBFUzcwMDAgaGF2ZSBubyBsZWdhY3kgaWRlbnRpdHkgbWFwcGluZ3MKLQkgKi8KLQlpZiAoZXM3MDAwX3BsYXQgPT0gMSkKLQkJcmV0dXJuOwotI2VuZGlmCi0KIAkvKgogCSAqIFVzZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgSVJRcyAwLTE1LiAgVW5sZXNzCiAJICogb3ZlcnJpZGRlbiBieSAoTUFEVCkgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZSBlbnRyaWVzLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCmluZGV4IGRlYzhkZTQuLmYwNGRiYjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9NMTBIX0YzKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX00zMEhfTkJfRjMpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GMykgfSwKIAl7fQogfTsKIEVYUE9SVF9TWU1CT0woYW1kX25iX21pc2NfaWRzKTsKQEAgLTMwLDYgKzMxLDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GNCkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9NMzBIX05CX0Y0KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTZIX05CX0Y0KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjQpIH0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jIGIvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKaW5kZXggZmQ5NzJhMy4uOWZhOGFhMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC01NCwxOCArNTMsNiBAQAogCiBpbnQgZml4X2FwZXJ0dXJlIF9faW5pdGRhdGEgPSAxOwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGdhcnRfcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiR0FSVCIsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5zZXJ0X2FwZXJ0dXJlX3Jlc291cmNlKHUzMiBhcGVyX2Jhc2UsIHUzMiBhcGVyX3NpemUpCi17Ci0JZ2FydF9yZXNvdXJjZS5zdGFydCA9IGFwZXJfYmFzZTsKLQlnYXJ0X3Jlc291cmNlLmVuZCA9IGFwZXJfYmFzZSArIGFwZXJfc2l6ZSAtIDE7Ci0JaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmdhcnRfcmVzb3VyY2UpOwotfQotCiAvKiBUaGlzIGNvZGUgcnVucyBiZWZvcmUgdGhlIFBDSSBzdWJzeXN0ZW0gaXMgaW5pdGlhbGl6ZWQsIHNvIGp1c3QKICAgIGFjY2VzcyB0aGUgbm9ydGhicmlkZ2UgZGlyZWN0bHkuICovCiAKQEAgLTk2LDcgKzgzLDYgQEAKIAltZW1ibG9ja19yZXNlcnZlKGFkZHIsIGFwZXJfc2l6ZSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiTWFwcGluZyBhcGVydHVyZSBvdmVyICVkIEtCIG9mIFJBTSBAICVseFxuIiwKIAkJCWFwZXJfc2l6ZSA+PiAxMCwgYWRkcik7Ci0JaW5zZXJ0X2FwZXJ0dXJlX3Jlc291cmNlKCh1MzIpYWRkciwgYXBlcl9zaXplKTsKIAlyZWdpc3Rlcl9ub3NhdmVfcmVnaW9uKGFkZHIgPj4gUEFHRV9TSElGVCwKIAkJCSAgICAgICAoYWRkcithcGVyX3NpemUpID4+IFBBR0VfU0hJRlQpOwogCkBAIC00NDQsMTIgKzQzMCw4IEBACiAKIG91dDoKIAlpZiAoIWZpeCAmJiAhZmFsbGJhY2tfYXBlcl9mb3JjZSkgewotCQlpZiAobGFzdF9hcGVyX2Jhc2UpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbiA9ICgzMiAqIDEwMjQgKiAxMDI0KSA8PCBsYXN0X2FwZXJfb3JkZXI7Ci0KLQkJCWluc2VydF9hcGVydHVyZV9yZXNvdXJjZSgodTMyKWxhc3RfYXBlcl9iYXNlLCBuKTsKKwkJaWYgKGxhc3RfYXBlcl9iYXNlKQogCQkJcmV0dXJuIDE7Ci0JCX0KIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlCmluZGV4IDBhZTAzMjMuLmRjYjViMTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlCkBAIC0xOCwxMCArMTgsNyBAQAogZW5kaWYKIAogIyBBUElDIHByb2JlIHdpbGwgZGVwZW5kIG9uIHRoZSBsaXN0aW5nIG9yZGVyIGhlcmUKLW9iai0kKENPTkZJR19YODZfTlVNQVEpCQkrPSBudW1hcV8zMi5vCi1vYmotJChDT05GSUdfWDg2X1NVTU1JVCkJKz0gc3VtbWl0XzMyLm8KIG9iai0kKENPTkZJR19YODZfQklHU01QKQkrPSBiaWdzbXBfMzIubwotb2JqLSQoQ09ORklHX1g4Nl9FUzcwMDApCSs9IGVzNzAwMF8zMi5vCiAKICMgRm9yIDMyYml0LCBwcm9iZV8zMiBuZWVkIHRvIGJlIGxpc3RlZCBsYXN0CiBvYmotJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCSs9IHByb2JlXyQoQklUUykubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCmluZGV4IDdmMjZjOWEuLjQ4MWFlMzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKQEAgLTEzMyw2ICsxMzMsMTAgQEAKICAqICsxPWZvcmNlLWVuYWJsZQogICovCiBzdGF0aWMgaW50IGZvcmNlX2VuYWJsZV9sb2NhbF9hcGljIF9faW5pdGRhdGE7CisKKy8qIENvbnRyb2wgd2hldGhlciB4MkFQSUMgbW9kZSBpcyBlbmFibGVkIG9yIG5vdCAqLworc3RhdGljIGJvb2wgbm94MmFwaWMgX19pbml0ZGF0YTsKKwogLyoKICAqIEFQSUMgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKICAqLwpAQCAtMTYyLDggKzE2Niw3IEBACiAvKiB4MmFwaWMgZW5hYmxlZCBiZWZvcmUgT1MgaGFuZG92ZXIgKi8KIGludCB4MmFwaWNfcHJlZW5hYmxlZDsKIHN0YXRpYyBpbnQgeDJhcGljX2Rpc2FibGVkOwotc3RhdGljIGludCBub3gyYXBpYzsKLXN0YXRpYyBfX2luaXQgaW50IHNldHVwX25veDJhcGljKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX25veDJhcGljKGNoYXIgKnN0cikKIHsKIAlpZiAoeDJhcGljX2VuYWJsZWQoKSkgewogCQlpbnQgYXBpY2lkID0gbmF0aXZlX2FwaWNfbXNyX3JlYWQoQVBJQ19JRCk7CkBAIC0xNzgsNyArMTgxLDcgQEAKIAl9IGVsc2UKIAkJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9YMkFQSUMpOwogCi0Jbm94MmFwaWMgPSAxOworCW5veDJhcGljID0gdHJ1ZTsKIAogCXJldHVybiAwOwogfQpAQCAtMjgzLDggKzI4NiwxMiBAQAogCiB2b2lkIG5hdGl2ZV9hcGljX2ljcl93cml0ZSh1MzIgbG93LCB1MzIgaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlhcGljX3dyaXRlKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChpZCkpOwogCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIGxvdyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiB1NjQgbmF0aXZlX2FwaWNfaWNyX3JlYWQodm9pZCkKQEAgLTIxMjksNyArMjEzNiw2IEBACiAJICoKIAkgKiAtIGFyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmM6IE1QX3Byb2Nlc3Nvcl9pbmZvKCkKIAkgKiAtIGFyY2gveDg2L21tL2FtZHRvcG9sb2d5LmM6IGFtZF9udW1hX2luaXQoKQotCSAqIC0gYXJjaC94ODYvcGxhdGZvcm0vdmlzd3Mvdmlzd3NfcXVpcmtzLmM6IE1QX3Byb2Nlc3Nvcl9pbmZvKCkKIAkgKgogCSAqIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2l0aCB0aGUgbW9kaWZpZWQKIAkgKiBib290X2NwdV9waHlzaWNhbF9hcGljaWQuIFNvLCBkaXNhYmxlZF9jcHVfYXBpY2lkIGtlcm5lbApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYwppbmRleCAyYzYyMWE2Li43YzFiMjk0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIAkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCiAJLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gTlVMTCwKKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBmYWxzZSwKIAkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKIAkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCiAKQEAgLTMxNCw3ICszMTQsNyBAQAogCiAJLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAogCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZmFsc2UsCiAJLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCiAJLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gZGVmYXVsdF9pbnF1aXJlX3JlbW90ZV9hcGljLAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCmluZGV4IDE5MWNlNzUuLjhjN2M5ODIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCkBAIC0xNzIsOCArMTcyLDcgQEAKIAkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCiAJLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCiAKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAotCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZmFsc2UsCiAJLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCiAJLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gTlVMTCwKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jCmluZGV4IDNlNjdmOWUuLmE1YjQ1ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogCS53YWtldXBfc2Vjb25kYXJ5X2NwdQkJPSBudW1hY2hpcF93YWtldXBfc2Vjb25kYXJ5LAogCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKIAkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAorCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGZhbHNlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IE5VTEwsIC8qIFJFTVJEIG5vdCBzdXBwb3J0ZWQgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYwppbmRleCBkNTBlMzY0Li5lNDg0MGFhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYwpAQCAtMTk5LDggKzE5OSw3IEBACiAJLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAogCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAogCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZGVmYXVsdF93YWl0X2Zvcl9pbml0X2RlYXNzZXJ0LAotCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gdHJ1ZSwKIAkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKIAkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTIyNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NDYgKzAsMCBAQAotLyoKLSAqIFdyaXR0ZW4gYnk6IEdhcnJ5IEZvcnNncmVuLCBVbmlzeXMgQ29ycG9yYXRpb24KLSAqICAgICAgICAgICAgIE5hdGFsaWUgUHJvdGFzZXZpY2gsIFVuaXN5cyBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBjb25maWd1cmUgYW5kIGludGVyZmFjZQotICogd2l0aCBVbmlzeXMgRVM3MDAwIHNlcmllcyBoYXJkd2FyZSBzeXN0ZW0gbWFuYWdlci4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVW5pc3lzIENvcnBvcmF0aW9uLgotICogQ29weXJpZ2h0IChDKSAyMDA5LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgotICoKLSAqICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogVW5pc3lzIENvcnBvcmF0aW9uLCBUb3duc2hpcCBMaW5lICYgVW5pb24gTWVldGluZwotICogUm9hZHMtQSwgVW5pc3lzIFdheSwgQmx1ZSBCZWxsLCBQZW5uc3lsdmFuaWEsIDE5NDI0LCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnVuaXN5cy5jb20KLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9ubWkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL2lwaS5oPgotCi0vKgotICogRVM3MDAwIGNoaXBzZXRzCi0gKi8KLQotI2RlZmluZSBOT05fVU5JU1lTCQkJMAotI2RlZmluZSBFUzcwMDBfQ0xBU1NJQwkJCTEKLSNkZWZpbmUgRVM3MDAwX1pPUlJPCQkJMgotCi0jZGVmaW5lCU1JUF9SRUcJCQkJMQotI2RlZmluZQlNSVBfUFNBSV9SRUcJCQk0Ci0KLSNkZWZpbmUJTUlQX0JVU1kJCQkxCi0jZGVmaW5lCU1JUF9TUElOCQkJMHhmMDAwMAotI2RlZmluZQlNSVBfVkFMSUQJCQkweDAxMDAwMDAwMDAwMDAwMDBVTEwKLSNkZWZpbmUJTUlQX1NXX0FQSUMJCQkweDEwMjBiCi0KLSNkZWZpbmUJTUlQX1BPUlQodmFsKQkJCSgodmFsID4+IDMyKSAmIDB4ZmZmZikKLQotI2RlZmluZQlNSVBfUkRfTE8odmFsKQkJCSh2YWwgJiAweGZmZmZmZmZmKQotCi1zdHJ1Y3QgbWlwX3JlZyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgwMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDA4OwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4MTA7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgxODsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDIwOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4Mjg7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgzMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDM4OwotfTsKLQotc3RydWN0IG1pcF9yZWdfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQltaXBfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCWRlbGl2ZXJ5X2luZm87Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlob3N0X3JlZzsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW1pcF9yZWc7Ci19OwotCi1zdHJ1Y3QgcHNhaSB7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQllbnRyeV90eXBlOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCWJlcF9hZGRyOwotfTsKLQotI2lmZGVmIENPTkZJR19BQ1BJCi0KLXN0cnVjdCBlczcwMDBfb2VtX3RhYmxlIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIJSGVhZGVyOwotCXUzMgkJCQlPRU1UYWJsZUFkZHI7Ci0JdTMyCQkJCU9FTVRhYmxlU2l6ZTsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCQkJb2VtX2FkZHJYOwotc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlvZW1fc2l6ZTsKLQotI2VuZGlmCi0KLS8qCi0gKiBFUzcwMDAgR2xvYmFscwotICovCi0KLXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nCQkqcHNhaTsKLXN0YXRpYyBzdHJ1Y3QgbWlwX3JlZwkJCSptaXBfcmVnOwotc3RhdGljIHN0cnVjdCBtaXBfcmVnCQkJKmhvc3RfcmVnOwotc3RhdGljIGludCAJCQkJbWlwX3BvcnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZwkJCW1pcF9hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlob3N0X2FkZHI7Ci0KLWludAkJCQkJZXM3MDAwX3BsYXQ7Ci0KLS8qCi0gKiBHU0kgb3ZlcnJpZGUgZm9yIEVTNzAwMCBwbGF0Zm9ybXMuCi0gKi8KLQotCi1zdGF0aWMgaW50IHdha2V1cF9zZWNvbmRhcnlfY3B1X3ZpYV9taXAoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlaXApCi17Ci0JdW5zaWduZWQgbG9uZyB2ZWN0ID0gMCwgcHNhaXZhbCA9IDA7Ci0KLQlpZiAocHNhaSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQl2ZWN0ID0gKCh1bnNpZ25lZCBsb25nKV9fcGEoZWlwKS8weDEwMDApIDw8IDE2OwotCXBzYWl2YWwgPSAoMHgxMDAwMDAwIHwgdmVjdCB8IGNwdSk7Ci0KLQl3aGlsZSAoKnBzYWkgJiAweDEwMDAwMDApCi0JCTsKLQotCSpwc2FpID0gcHNhaXZhbDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hcGljX2lzX2NsdXN0ZXIodm9pZCkKLXsKLQkvKiBNUEVOVElVTUlJSSAqLwotCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2ICYmCi0JICAgIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSA3ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw9IDExKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfdW5pc3lzKHZvaWQpCi17Ci0JLyoKLQkgKiBEZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEVTNzAwMCBjdXJyZW50bHkgcnVubmluZy4KLQkgKgotCSAqIGVzNzAwMF9wbGF0ID0gMSBpZiB0aGUgbWFjaGluZSBpcyBhIDV4eCBFUzcwMDAgYm94Ci0JICogZXM3MDAwX3BsYXQgPSAyIGlmIHRoZSBtYWNoaW5lIGlzIGEgeDg2XzY0IEVTNzAwMCBib3gKLQkgKgotCSAqLwotCWlmICghKGJvb3RfY3B1X2RhdGEueDg2IDw9IDE1ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw9IDIpKQotCQllczcwMDBfcGxhdCA9IEVTNzAwMF9aT1JSTzsKLQllbHNlCi0JCWVzNzAwMF9wbGF0ID0gRVM3MDAwX0NMQVNTSUM7Ci19Ci0KLS8qCi0gKiBQYXJzZSB0aGUgT0VNIFRhYmxlOgotICovCi1zdGF0aWMgaW50IHBhcnNlX3VuaXN5c19vZW0oY2hhciAqb2VtcHRyKQotewotCWludAkJCWk7Ci0JaW50IAkJCXN1Y2Nlc3MgPSAwOwotCXVuc2lnbmVkIGNoYXIJCXR5cGUsIHNpemU7Ci0JdW5zaWduZWQgbG9uZwkJdmFsOwotCWNoYXIJCQkqdHAgPSBOVUxMOwotCXN0cnVjdCBwc2FpCQkqcHNhaXAgPSBOVUxMOwotCXN0cnVjdCBtaXBfcmVnX2luZm8gCSptaTsKLQlzdHJ1Y3QgbWlwX3JlZwkJKmhvc3QsICptaXA7Ci0KLQl0cCA9IG9lbXB0cjsKLQotCXRwICs9IDg7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IDY7IGkrKykgewotCQl0eXBlID0gKnRwKys7Ci0JCXNpemUgPSAqdHArKzsKLQkJdHAgLT0gMjsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgTUlQX1JFRzoKLQkJCW1pID0gKHN0cnVjdCBtaXBfcmVnX2luZm8gKil0cDsKLQkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+aG9zdF9yZWcpOwotCQkJaG9zdF9hZGRyID0gdmFsOwotCQkJaG9zdCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKLQkJCWhvc3RfcmVnID0gX192YShob3N0KTsKLQkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+bWlwX3JlZyk7Ci0JCQltaXBfcG9ydCA9IE1JUF9QT1JUKG1pLT5taXBfaW5mbyk7Ci0JCQltaXBfYWRkciA9IHZhbDsKLQkJCW1pcCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKLQkJCW1pcF9yZWcgPSBfX3ZhKG1pcCk7Ci0JCQlwcl9kZWJ1ZygiaG9zdF9yZWcgPSAweCVseFxuIiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpaG9zdF9yZWcpOwotCQkJcHJfZGVidWcoIm1pcF9yZWcgPSAweCVseFxuIiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpbWlwX3JlZyk7Ci0JCQlzdWNjZXNzKys7Ci0JCQlicmVhazsKLQkJY2FzZSBNSVBfUFNBSV9SRUc6Ci0JCQlwc2FpcCA9IChzdHJ1Y3QgcHNhaSAqKXRwOwotCQkJaWYgKHRwICE9IE5VTEwpIHsKLQkJCQlpZiAocHNhaXAtPmFkZHIpCi0JCQkJCXBzYWkgPSBfX3ZhKHBzYWlwLT5hZGRyKTsKLQkJCQllbHNlCi0JCQkJCXBzYWkgPSBOVUxMOwotCQkJCXN1Y2Nlc3MrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJdHAgKz0gc2l6ZTsKLQl9Ci0KLQlpZiAoc3VjY2VzcyA8IDIpCi0JCWVzNzAwMF9wbGF0ID0gTk9OX1VOSVNZUzsKLQllbHNlCi0JCXNldHVwX3VuaXN5cygpOwotCi0JcmV0dXJuIGVzNzAwMF9wbGF0OwotfQotCi0jaWZkZWYgQ09ORklHX0FDUEkKLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgZXM3MDAwX29lbV90YWJsZSAqdGFibGU7Ci0JYWNwaV9zaXplIHRibF9zaXplOwotCWFjcGlfc3RhdHVzIHJldDsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKDs7KSB7Ci0JCXJldCA9IGFjcGlfZ2V0X3RhYmxlX3dpdGhfc2l6ZSgiT0VNMSIsIGkrKywgJmhlYWRlciwgJnRibF9zaXplKTsKLQkJaWYgKCFBQ1BJX1NVQ0NFU1MocmV0KSkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIW1lbWNtcCgoY2hhciAqKSAmaGVhZGVyLT5vZW1faWQsICJVTklTWVMiLCA2KSkKLQkJCWJyZWFrOwotCi0JCWVhcmx5X2FjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwgdGJsX3NpemUpOwotCX0KLQotCXRhYmxlID0gKHZvaWQgKiloZWFkZXI7Ci0KLQlvZW1fYWRkclgJPSB0YWJsZS0+T0VNVGFibGVBZGRyOwotCW9lbV9zaXplCT0gdGFibGUtPk9FTVRhYmxlU2l6ZTsKLQotCWVhcmx5X2FjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwgdGJsX3NpemUpOwotCi0JKm9lbV9hZGRyCT0gKHVuc2lnbmVkIGxvbmcpX19hY3BpX21hcF90YWJsZShvZW1fYWRkclgsIG9lbV9zaXplKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5tYXBfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgb2VtX2FkZHIpCi17Ci0JaWYgKCFvZW1fYWRkcikKLQkJcmV0dXJuOwotCi0JX19hY3BpX3VubWFwX3RhYmxlKChjaGFyICopb2VtX2FkZHIsIG9lbV9zaXplKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfY2hlY2tfZHNkdCh2b2lkKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X3RhYmxlX2hlYWRlcihBQ1BJX1NJR19EU0RULCAwLCAmaGVhZGVyKSkgJiYKLQkgICAgIXN0cm5jbXAoaGVhZGVyLm9lbV9pZCwgIlVOSVNZUyIsIDYpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlczcwMDBfYWNwaV9yZXQ7Ci0KLS8qIEhvb2sgZnJvbSBnZW5lcmljIEFDUEkgdGFibGVzLmMgKi8KLXN0YXRpYyBpbnQgX19pbml0IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQotewotCXVuc2lnbmVkIGxvbmcgb2VtX2FkZHIgPSAwOwotCWludCBjaGVja19kc2R0OwotCWludCByZXQgPSAwOwotCi0JLyogY2hlY2sgZHNkdCBhdCBmaXJzdCB0byBhdm9pZCBjbGVhciBmaXhfbWFwIGZvciBvZW1fYWRkciAqLwotCWNoZWNrX2RzZHQgPSBlczcwMDBfY2hlY2tfZHNkdCgpOwotCi0JaWYgKCFmaW5kX3VuaXN5c19hY3BpX29lbV90YWJsZSgmb2VtX2FkZHIpKSB7Ci0JCWlmIChjaGVja19kc2R0KSB7Ci0JCQlyZXQgPSBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX2FkZHIpOwotCQl9IGVsc2UgewotCQkJc2V0dXBfdW5pc3lzKCk7Ci0JCQlyZXQgPSAxOwotCQl9Ci0JCS8qCi0JCSAqIHdlIG5lZWQgdG8gdW5tYXAgaXQKLQkJICovCi0JCXVubWFwX3VuaXN5c19hY3BpX29lbV90YWJsZShvZW1fYWRkcik7Ci0JfQotCi0JZXM3MDAwX2FjcGlfcmV0ID0gcmV0OwotCi0JcmV0dXJuIHJldCAmJiAhZXM3MDAwX2FwaWNfaXNfY2x1c3RlcigpOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrX2NsdXN0ZXIoY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JaW50IHJldCA9IGVzNzAwMF9hY3BpX3JldDsKLQotCXJldHVybiByZXQgJiYgZXM3MDAwX2FwaWNfaXNfY2x1c3RlcigpOwotfQotCi0jZWxzZSAvKiAhQ09ORklHX0FDUEk6ICovCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrX2NsdXN0ZXIoY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogIUNPTkZJR19BQ1BJICovCi0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zcGluKGludCBuKQotewotCWludCBpID0gMDsKLQotCXdoaWxlIChpKysgPCBuKQotCQlyZXBfbm9wKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX21pcF93cml0ZShzdHJ1Y3QgbWlwX3JlZyAqbWlwX3JlZykKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQlpbnQgc3BpbjsKLQotCXNwaW4gPSBNSVBfU1BJTjsKLQl3aGlsZSAoKGhvc3RfcmVnLT5vZmZfMHgzOCAmIE1JUF9WQUxJRCkgIT0gMCkgewotCQlpZiAoLS1zcGluIDw9IDApIHsKLQkJCVdBUk4oMSwJIlRpbWVvdXQgd2FpdGluZyBmb3IgSG9zdCBWYWxpZCBGbGFnXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllczcwMDBfc3BpbihNSVBfU1BJTik7Ci0JfQotCi0JbWVtY3B5KGhvc3RfcmVnLCBtaXBfcmVnLCBzaXplb2Yoc3RydWN0IG1pcF9yZWcpKTsKLQlvdXRiKDEsIG1pcF9wb3J0KTsKLQotCXNwaW4gPSBNSVBfU1BJTjsKLQotCXdoaWxlICgobWlwX3JlZy0+b2ZmXzB4MzggJiBNSVBfVkFMSUQpID09IDApIHsKLQkJaWYgKC0tc3BpbiA8PSAwKSB7Ci0JCQlXQVJOKDEsCSJUaW1lb3V0IHdhaXRpbmcgZm9yIE1JUCBWYWxpZCBGbGFnXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllczcwMDBfc3BpbihNSVBfU1BJTik7Ci0JfQotCi0Jc3RhdHVzID0gKG1pcF9yZWctPm9mZl8weDAwICYgMHhmZmZmMDAwMDAwMDAwMFVMTCkgPj4gNDg7Ci0JbWlwX3JlZy0+b2ZmXzB4MzggJj0gfk1JUF9WQUxJRDsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9lbmFibGVfYXBpY19tb2RlKHZvaWQpCi17Ci0Jc3RydWN0IG1pcF9yZWcgZXM3MDAwX21pcF9yZWc7Ci0JaW50IG1pcF9zdGF0dXM7Ci0KLQlpZiAoIWVzNzAwMF9wbGF0KQotCQlyZXR1cm47Ci0KLQlwcl9pbmZvKCJFbmFibGluZyBBUElDIG1vZGUuXG4iKTsKLQltZW1zZXQoJmVzNzAwMF9taXBfcmVnLCAwLCBzaXplb2Yoc3RydWN0IG1pcF9yZWcpKTsKLQllczcwMDBfbWlwX3JlZy5vZmZfMHgwMCA9IE1JUF9TV19BUElDOwotCWVzNzAwMF9taXBfcmVnLm9mZl8weDM4ID0gTUlQX1ZBTElEOwotCi0Jd2hpbGUgKChtaXBfc3RhdHVzID0gZXM3MDAwX21pcF93cml0ZSgmZXM3MDAwX21pcF9yZWcpKSAhPSAwKQotCQlXQVJOKDEsICJDb21tYW5kIGZhaWxlZCwgc3RhdHVzID0gJXhcbiIsIG1pcF9zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBlczcwMDBfd2FpdF9mb3JfaW5pdF9kZWFzc2VydChhdG9taWNfdCAqZGVhc3NlcnQpCi17Ci0Jd2hpbGUgKCFhdG9taWNfcmVhZChkZWFzc2VydCkpCi0JCWNwdV9yZWxheCgpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGVzNzAwMF9nZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCi17Ci0JcmV0dXJuICh4ID4+IDI0KSAmIDB4RkY7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZW5kX0lQSV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBpbnQgdmVjdG9yKQotewotCWRlZmF1bHRfc2VuZF9JUElfbWFza19zZXF1ZW5jZV9waHlzKG1hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGZfcGh5cyhjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKLXsKLQllczcwMDBfc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnRhcmdldF9jcHVzX2NsdXN0ZXIodm9pZCkKLXsKLQlyZXR1cm4gY3B1X2FsbF9tYXNrOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmVzNzAwMF90YXJnZXRfY3B1cyh2b2lkKQotewotCXJldHVybiBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVzNzAwMF9jaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190ICptYXAsIGludCBhcGljaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVzNzAwMF9jaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KQotewotCXJldHVybiBwaHlzaWRfaXNzZXQoYml0LCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkKGludCBjcHUpCi17Ci0JLyogb24gZXM3MDAwLCBsb2dpY2FsIGFwaWNpZCBpcyB0aGUgc2FtZSBhcyBwaHlzaWNhbCAqLwotCXJldHVybiBlYXJseV9wZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIGNwdSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9sZHIoaW50IGNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGlkID0gcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBjcHUpOwotCi0JcmV0dXJuIFNFVF9BUElDX0xPR0lDQUxfSUQoaWQpOwotfQotCi0vKgotICogU2V0IHVwIHRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIElELgotICoKLSAqIEludGVsIHJlY29tbWVuZHMgdG8gc2V0IERGUiwgTGRSIGFuZCBUUFIgYmVmb3JlIGVuYWJsaW5nCi0gKiBhbiBBUElDLiAgU2VlIGUuZy4gIkFQLTM4OCA4MjQ4OURYIFVzZXIncyBNYW51YWwiIChJbnRlbAotICogZG9jdW1lbnQgbnVtYmVyIDI5MjExNikuICBTbyBoZXJlIGl0IGdvZXMuLi4KLSAqLwotc3RhdGljIHZvaWQgZXM3MDAwX2luaXRfYXBpY19sZHJfY2x1c3Rlcih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlhcGljX3dyaXRlKEFQSUNfREZSLCBBUElDX0RGUl9DTFVTVEVSKTsKLQl2YWwgPSBjYWxjdWxhdGVfbGRyKGNwdSk7Ci0JYXBpY193cml0ZShBUElDX0xEUiwgdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX2luaXRfYXBpY19sZHIodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JYXBpY193cml0ZShBUElDX0RGUiwgQVBJQ19ERlJfRkxBVCk7Ci0JdmFsID0gY2FsY3VsYXRlX2xkcihjcHUpOwotCWFwaWNfd3JpdGUoQVBJQ19MRFIsIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9zZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKLXsKLQlpbnQgYXBpYyA9IHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQotCXByX2luZm8oIkVuYWJsaW5nIEFQSUMgbW9kZTogICVzLiBVc2luZyAlZCBJL08gQVBJQ3MsIHRhcmdldCBjcHVzICVseFxuIiwKLQkJKGFwaWNfdmVyc2lvblthcGljXSA9PSAweDE0KSA/Ci0JCQkiUGh5c2ljYWwgQ2x1c3RlciIgOiAiTG9naWNhbCBDbHVzdGVyIiwKLQkJbnJfaW9hcGljcywgY3B1bWFza19iaXRzKGVzNzAwMF90YXJnZXRfY3B1cygpKVswXSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2NwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKLXsKLQlpZiAoIW1wc19jcHUpCi0JCXJldHVybiBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7Ci0JZWxzZSBpZiAobXBzX2NwdSA8IG5yX2NwdV9pZHMpCi0JCXJldHVybiBwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIG1wc19jcHUpOwotCWVsc2UKLQkJcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyBpbnQgY3B1X2lkOwotCi1zdGF0aWMgdm9pZCBlczcwMDBfYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBwaHlzX2FwaWNpZCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCXBoeXNpZF9zZXRfbWFza19vZl9waHlzaWQoY3B1X2lkLCByZXRtYXApOwotCSsrY3B1X2lkOwotfQotCi1zdGF0aWMgdm9pZCBlczcwMDBfaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNpZF9tYXNrX3QgKnBoeXNfbWFwLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JLyogRm9yIGNsdXN0ZXJlZCB3ZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcyB5ZXQgLSBoYWNrICovCi0JcGh5c2lkc19wcm9tb3RlKDB4RkZMLCByZXRtYXApOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBjcHVfcGh5c2ljYWxfYXBpY2lkKQotewotCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IHJlYWRfYXBpY19pZCgpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZXM3MDAwX2NwdV9tYXNrX3RvX2FwaWNpZChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywgdW5zaWduZWQgaW50ICpkZXN0X2lkKQotewotCXVuc2lnbmVkIGludCByb3VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IGNwdSwgdW5pbml0aWFsaXplZF92YXIoYXBpY2lkKTsKLQotCS8qCi0JICogVGhlIGNwdXMgaW4gdGhlIG1hc2sgbXVzdCBhbGwgYmUgb24gdGhlIGFwaWMgY2x1c3Rlci4KLQkgKi8KLQlmb3JfZWFjaF9jcHVfYW5kKGNwdSwgY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKSB7Ci0JCWludCBuZXdfYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBjcHUpOwotCi0JCWlmIChyb3VuZCAmJiBBUElDX0NMVVNURVIoYXBpY2lkKSAhPSBBUElDX0NMVVNURVIobmV3X2FwaWNpZCkpIHsKLQkJCVdBUk4oMSwgIk5vdCBhIHZhbGlkIG1hc2shIik7Ci0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWFwaWNpZCB8PSBuZXdfYXBpY2lkOwotCQlyb3VuZCsrOwotCX0KLQlpZiAoIXJvdW5kKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqZGVzdF9pZCA9IGFwaWNpZDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZXM3MDAwX2NwdV9tYXNrX3RvX2FwaWNpZF9hbmQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmlubWFzaywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphbmRtYXNrLAotCQkJICAgICAgdW5zaWduZWQgaW50ICphcGljaWQpCi17Ci0JY3B1bWFza192YXJfdCBjcHVtYXNrOwotCSphcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIDApOwotCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY3B1bWFzaywgR0ZQX0FUT01JQykpCi0JCXJldHVybiAwOwotCi0JY3B1bWFza19hbmQoY3B1bWFzaywgaW5tYXNrLCBhbmRtYXNrKTsKLQllczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2ssIGFwaWNpZCk7Ci0KLQlmcmVlX2NwdW1hc2tfdmFyKGNwdW1hc2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX3BoeXNfcGtnX2lkKGludCBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQotewotCXJldHVybiBjcHVpZF9hcGljID4+IGluZGV4X21zYjsKLX0KLQotc3RhdGljIGludCBwcm9iZV9lczcwMDAodm9pZCkKLXsKLQkvKiBwcm9iZWQgbGF0ZXIgaW4gbXB0YWJsZS9BQ1BJIGhvb2tzICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX21wc19yZXQ7Ci1zdGF0aWMgaW50IGVzNzAwMF9tcHNfb2VtX2NoZWNrKHN0cnVjdCBtcGNfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQljaGFyICpwcm9kdWN0aWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAobXBjLT5vZW1wdHIpIHsKLQkJc3RydWN0IG1wY19vZW10YWJsZSAqb2VtX3RhYmxlID0KLQkJCShzdHJ1Y3QgbXBjX29lbXRhYmxlICopbXBjLT5vZW1wdHI7Ci0KLQkJaWYgKCFzdHJuY21wKG9lbSwgIlVOSVNZUyIsIDYpKQotCQkJcmV0ID0gcGFyc2VfdW5pc3lzX29lbSgoY2hhciAqKW9lbV90YWJsZSk7Ci0JfQotCi0JZXM3MDAwX21wc19yZXQgPSByZXQ7Ci0KLQlyZXR1cm4gcmV0ICYmICFlczcwMDBfYXBpY19pc19jbHVzdGVyKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX21wc19vZW1fY2hlY2tfY2x1c3RlcihzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJY2hhciAqcHJvZHVjdGlkKQotewotCWludCByZXQgPSBlczcwMDBfbXBzX3JldDsKLQotCXJldHVybiByZXQgJiYgZXM3MDAwX2FwaWNfaXNfY2x1c3RlcigpOwotfQotCi0vKiBXZSd2ZSBiZWVuIHdhcm5lZCBieSBhIGZhbHNlIHBvc2l0aXZlIHdhcm5pbmcuVXNlIF9fcmVmZGF0YSB0byBrZWVwIGNhbG0uICovCi1zdGF0aWMgc3RydWN0IGFwaWMgX19yZWZkYXRhIGFwaWNfZXM3MDAwX2NsdXN0ZXIgPSB7Ci0KLQkubmFtZQkJCQk9ICJlczcwMDAiLAotCS5wcm9iZQkJCQk9IHByb2JlX2VzNzAwMCwKLQkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBlczcwMDBfYWNwaV9tYWR0X29lbV9jaGVja19jbHVzdGVyLAotCS5hcGljX2lkX3ZhbGlkCQkJPSBkZWZhdWx0X2FwaWNfaWRfdmFsaWQsCi0JLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBlczcwMDBfYXBpY19pZF9yZWdpc3RlcmVkLAotCi0JLmlycV9kZWxpdmVyeV9tb2RlCQk9IGRlc3RfTG93ZXN0UHJpbywKLQkvKiBsb2dpY2FsIGRlbGl2ZXJ5IGJyb2FkY2FzdCB0byBhbGwgcHJvY3M6ICovCi0JLmlycV9kZXN0X21vZGUJCQk9IDEsCi0KLQkudGFyZ2V0X2NwdXMJCQk9IHRhcmdldF9jcHVzX2NsdXN0ZXIsCi0JLmRpc2FibGVfZXNyCQkJPSAxLAotCS5kZXN0X2xvZ2ljYWwJCQk9IDAsCi0JLmNoZWNrX2FwaWNpZF91c2VkCQk9IGVzNzAwMF9jaGVja19hcGljaWRfdXNlZCwKLQkuY2hlY2tfYXBpY2lkX3ByZXNlbnQJCT0gZXM3MDAwX2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBlczcwMDBfaW5pdF9hcGljX2xkcl9jbHVzdGVyLAotCi0JLmlvYXBpY19waHlzX2lkX21hcAkJPSBlczcwMDBfaW9hcGljX3BoeXNfaWRfbWFwLAotCS5zZXR1cF9hcGljX3JvdXRpbmcJCT0gZXM3MDAwX3NldHVwX2FwaWNfcm91dGluZywKLQkubXVsdGlfdGltZXJfY2hlY2sJCT0gTlVMTCwKLQkuY3B1X3ByZXNlbnRfdG9fYXBpY2lkCQk9IGVzNzAwMF9jcHVfcHJlc2VudF90b19hcGljaWQsCi0JLmFwaWNpZF90b19jcHVfcHJlc2VudAkJPSBlczcwMDBfYXBpY2lkX3RvX2NwdV9wcmVzZW50LAotCS5zZXR1cF9wb3J0aW9fcmVtYXAJCT0gTlVMTCwKLQkuY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudAk9IGVzNzAwMF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50LAotCS5lbmFibGVfYXBpY19tb2RlCQk9IGVzNzAwMF9lbmFibGVfYXBpY19tb2RlLAotCS5waHlzX3BrZ19pZAkJCT0gZXM3MDAwX3BoeXNfcGtnX2lkLAotCS5tcHNfb2VtX2NoZWNrCQkJPSBlczcwMDBfbXBzX29lbV9jaGVja19jbHVzdGVyLAotCi0JLmdldF9hcGljX2lkCQkJPSBlczcwMDBfZ2V0X2FwaWNfaWQsCi0JLnNldF9hcGljX2lkCQkJPSBOVUxMLAotCS5hcGljX2lkX21hc2sJCQk9IDB4RkYgPDwgMjQsCi0KLQkuY3B1X21hc2tfdG9fYXBpY2lkX2FuZAkJPSBlczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkX2FuZCwKLQotCS5zZW5kX0lQSV9tYXNrCQkJPSBlczcwMDBfc2VuZF9JUElfbWFzaywKLQkuc2VuZF9JUElfbWFza19hbGxidXRzZWxmCT0gTlVMTCwKLQkuc2VuZF9JUElfYWxsYnV0c2VsZgkJPSBlczcwMDBfc2VuZF9JUElfYWxsYnV0c2VsZiwKLQkuc2VuZF9JUElfYWxsCQkJPSBlczcwMDBfc2VuZF9JUElfYWxsLAotCS5zZW5kX0lQSV9zZWxmCQkJPSBkZWZhdWx0X3NlbmRfSVBJX3NlbGYsCi0KLQkud2FrZXVwX3NlY29uZGFyeV9jcHUJCT0gd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX21pcCwKLQotCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IDB4NDY3LAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSAweDQ2OSwKLQotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCi0KLQkvKiBOb3RoaW5nIHRvIGRvIGZvciBtb3N0IHBsYXRmb3Jtcywgc2luY2UgY2xlYXJlZCBieSB0aGUgSU5JVCBjeWNsZTogKi8KLQkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKLQkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCi0KLQkucmVhZAkJCQk9IG5hdGl2ZV9hcGljX21lbV9yZWFkLAotCS53cml0ZQkJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuZW9pX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmljcl9yZWFkCQkJPSBuYXRpdmVfYXBpY19pY3JfcmVhZCwKLQkuaWNyX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19pY3Jfd3JpdGUsCi0JLndhaXRfaWNyX2lkbGUJCQk9IG5hdGl2ZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0JLnNhZmVfd2FpdF9pY3JfaWRsZQkJPSBuYXRpdmVfc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0KLQkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gZXM3MDAwX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkLAotfTsKLQotc3RhdGljIHN0cnVjdCBhcGljIF9fcmVmZGF0YSBhcGljX2VzNzAwMCA9IHsKLQotCS5uYW1lCQkJCT0gImVzNzAwMCIsCi0JLnByb2JlCQkJCT0gcHJvYmVfZXM3MDAwLAotCS5hY3BpX21hZHRfb2VtX2NoZWNrCQk9IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrLAotCS5hcGljX2lkX3ZhbGlkCQkJPSBkZWZhdWx0X2FwaWNfaWRfdmFsaWQsCi0JLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBlczcwMDBfYXBpY19pZF9yZWdpc3RlcmVkLAotCi0JLmlycV9kZWxpdmVyeV9tb2RlCQk9IGRlc3RfRml4ZWQsCi0JLyogcGh5cyBkZWxpdmVyeSB0byB0YXJnZXQgQ1BVczogKi8KLQkuaXJxX2Rlc3RfbW9kZQkJCT0gMCwKLQotCS50YXJnZXRfY3B1cwkJCT0gZXM3MDAwX3RhcmdldF9jcHVzLAotCS5kaXNhYmxlX2VzcgkJCT0gMSwKLQkuZGVzdF9sb2dpY2FsCQkJPSAwLAotCS5jaGVja19hcGljaWRfdXNlZAkJPSBlczcwMDBfY2hlY2tfYXBpY2lkX3VzZWQsCi0JLmNoZWNrX2FwaWNpZF9wcmVzZW50CQk9IGVzNzAwMF9jaGVja19hcGljaWRfcHJlc2VudCwKLQotCS52ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4JPSBmbGF0X3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiwKLQkuaW5pdF9hcGljX2xkcgkJCT0gZXM3MDAwX2luaXRfYXBpY19sZHIsCi0KLQkuaW9hcGljX3BoeXNfaWRfbWFwCQk9IGVzNzAwMF9pb2FwaWNfcGh5c19pZF9tYXAsCi0JLnNldHVwX2FwaWNfcm91dGluZwkJPSBlczcwMDBfc2V0dXBfYXBpY19yb3V0aW5nLAotCS5tdWx0aV90aW1lcl9jaGVjawkJPSBOVUxMLAotCS5jcHVfcHJlc2VudF90b19hcGljaWQJCT0gZXM3MDAwX2NwdV9wcmVzZW50X3RvX2FwaWNpZCwKLQkuYXBpY2lkX3RvX2NwdV9wcmVzZW50CQk9IGVzNzAwMF9hcGljaWRfdG9fY3B1X3ByZXNlbnQsCi0JLnNldHVwX3BvcnRpb19yZW1hcAkJPSBOVUxMLAotCS5jaGVja19waHlzX2FwaWNpZF9wcmVzZW50CT0gZXM3MDAwX2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQsCi0JLmVuYWJsZV9hcGljX21vZGUJCT0gZXM3MDAwX2VuYWJsZV9hcGljX21vZGUsCi0JLnBoeXNfcGtnX2lkCQkJPSBlczcwMDBfcGh5c19wa2dfaWQsCi0JLm1wc19vZW1fY2hlY2sJCQk9IGVzNzAwMF9tcHNfb2VtX2NoZWNrLAotCi0JLmdldF9hcGljX2lkCQkJPSBlczcwMDBfZ2V0X2FwaWNfaWQsCi0JLnNldF9hcGljX2lkCQkJPSBOVUxMLAotCS5hcGljX2lkX21hc2sJCQk9IDB4RkYgPDwgMjQsCi0KLQkuY3B1X21hc2tfdG9fYXBpY2lkX2FuZAkJPSBlczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkX2FuZCwKLQotCS5zZW5kX0lQSV9tYXNrCQkJPSBlczcwMDBfc2VuZF9JUElfbWFzaywKLQkuc2VuZF9JUElfbWFza19hbGxidXRzZWxmCT0gTlVMTCwKLQkuc2VuZF9JUElfYWxsYnV0c2VsZgkJPSBlczcwMDBfc2VuZF9JUElfYWxsYnV0c2VsZiwKLQkuc2VuZF9JUElfYWxsCQkJPSBlczcwMDBfc2VuZF9JUElfYWxsLAotCS5zZW5kX0lQSV9zZWxmCQkJPSBkZWZhdWx0X3NlbmRfSVBJX3NlbGYsCi0KLQkudHJhbXBvbGluZV9waHlzX2xvdwkJPSAweDQ2NywKLQkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gMHg0NjksCi0KLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBlczcwMDBfd2FpdF9mb3JfaW5pdF9kZWFzc2VydCwKLQotCS8qIE5vdGhpbmcgdG8gZG8gZm9yIG1vc3QgcGxhdGZvcm1zLCBzaW5jZSBjbGVhcmVkIGJ5IHRoZSBJTklUIGN5Y2xlOiAqLwotCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAotCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKLQotCS5yZWFkCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3JlYWQsCi0JLndyaXRlCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5lb2lfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuaWNyX3JlYWQJCQk9IG5hdGl2ZV9hcGljX2ljcl9yZWFkLAotCS5pY3Jfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX2ljcl93cml0ZSwKLQkud2FpdF9pY3JfaWRsZQkJCT0gbmF0aXZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQkuc2FmZV93YWl0X2ljcl9pZGxlCQk9IG5hdGl2ZV9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQotCS54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQJPSBlczcwMDBfZWFybHlfbG9naWNhbF9hcGljaWQsCi19OwotCi0vKgotICogTmVlZCB0byBjaGVjayBmb3IgZXM3MDAwIGZvbGxvd2VkIGJ5IGVzNzAwMF9jbHVzdGVyLCBzbyB0aGlzIG9yZGVyCi0gKiBpbiBhcGljX2RyaXZlcnMgaXMgaW1wb3J0YW50LgotICovCi1hcGljX2RyaXZlcnMoYXBpY19lczcwMDAsIGFwaWNfZXM3MDAwX2NsdXN0ZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvbnVtYXFfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL251bWFxXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDJlOGYuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvbnVtYXFfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKgotICogV3JpdHRlbiBieTogUGF0cmljaWEgR2F1Z2hlbiwgSUJNIENvcnBvcmF0aW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyLCBJQk0gQ29ycC4KLSAqIENvcHlyaWdodCAoQykgMjAwOSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGdvbmVAdXMuaWJtLmNvbT4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9udW1hLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vbXBzcGVjLmg+Ci0jaW5jbHVkZSA8YXNtL251bWFxLmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vZTgyMC5oPgotI2luY2x1ZGUgPGFzbS9pcGkuaD4KLQotaW50IGZvdW5kX251bWFxOwotCi0vKgotICogSGF2ZSB0byBtYXRjaCB0cmFuc2xhdGlvbiB0YWJsZSBlbnRyaWVzIHRvIG1haW4gdGFibGUgZW50cmllcyBieSBjb3VudGVyCi0gKiBoZW5jZSB0aGUgbXBjX3JlY29yZCB2YXJpYWJsZSAuLi4uIGNhbid0IHNlZSBhIGxlc3MgZGlzZ3VzdGluZyB3YXkgb2YKLSAqIGRvaW5nIHRoaXMgLi4uLgotICovCi1zdHJ1Y3QgbXBjX3RyYW5zIHsKLQl1bnNpZ25lZCBjaGFyCQkJbXBjX3R5cGU7Ci0JdW5zaWduZWQgY2hhcgkJCXRyYW5zX2xlbjsKLQl1bnNpZ25lZCBjaGFyCQkJdHJhbnNfdHlwZTsKLQl1bnNpZ25lZCBjaGFyCQkJdHJhbnNfcXVhZDsKLQl1bnNpZ25lZCBjaGFyCQkJdHJhbnNfZ2xvYmFsOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc19sb2NhbDsKLQl1bnNpZ25lZCBzaG9ydAkJCXRyYW5zX3Jlc2VydmVkOwotfTsKLQotc3RhdGljIGludAkJCQltcGNfcmVjb3JkOwotCi1zdGF0aWMgc3RydWN0IG1wY190cmFucwkJCSp0cmFuc2xhdGlvbl90YWJsZVtNQVhfTVBDX0VOVFJZXTsKLQotaW50CQkJCQltcF9idXNfaWRfdG9fbm9kZVtNQVhfTVBfQlVTU0VTXTsKLWludAkJCQkJbXBfYnVzX2lkX3RvX2xvY2FsW01BWF9NUF9CVVNTRVNdOwotaW50CQkJCQlxdWFkX2xvY2FsX3RvX21wX2J1c19pZFtOUl9DUFVTLzRdWzRdOwotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9yZWdpc3Rlcl9ub2RlKGludCBub2RlLCBzdHJ1Y3Qgc3lzX2NmZ19kYXRhICpzY2QpCi17Ci0Jc3RydWN0IGVhY2hxdWFkbWVtICplcSA9IHNjZC0+ZXEgKyBub2RlOwotCXU2NCBzdGFydCA9ICh1NjQpKGVxLT5oaV9zaHJkX21lbV9zdGFydCAtIGVxLT5wcml2X21lbV9zaXplKSA8PCAyMDsKLQl1NjQgZW5kID0gKHU2NCkoZXEtPmhpX3NocmRfbWVtX3N0YXJ0ICsgZXEtPmhpX3NocmRfbWVtX3NpemUpIDw8IDIwOwotCWludCByZXQ7Ci0KLQlub2RlX3NldChub2RlLCBudW1hX25vZGVzX3BhcnNlZCk7Ci0JcmV0ID0gbnVtYV9hZGRfbWVtYmxrKG5vZGUsIHN0YXJ0LCBlbmQpOwotCUJVR19PTihyZXQgPCAwKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiBzbXBfZHVtcF9xY3QoKQotICoKLSAqIERlc2NyaXB0aW9uOiBnZXRzIG1lbW9yeSBsYXlvdXQgZnJvbSB0aGUgcXVhZCBjb25maWcgdGFibGUuICBUaGlzCi0gKiBmdW5jdGlvbiBhbHNvIHVwZGF0ZXMgbnVtYV9ub2Rlc19wYXJzZWQgd2l0aCB0aGUgbm9kZXMgKHF1YWRzKSBwcmVzZW50LgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc21wX2R1bXBfcWN0KHZvaWQpCi17Ci0Jc3RydWN0IHN5c19jZmdfZGF0YSAqc2NkOwotCWludCBub2RlOwotCi0Jc2NkID0gKHZvaWQgKilfX3ZhKFNZU19DRkdfREFUQV9QUklWX0FERFIpOwotCi0JZm9yX2VhY2hfbm9kZShub2RlKSB7Ci0JCWlmIChzY2QtPnF1YWRzX3ByZXNlbnQzMV8wICYgKDEgPDwgbm9kZSkpCi0JCQludW1hcV9yZWdpc3Rlcl9ub2RlKG5vZGUsIHNjZCk7Ci0JfQotfQotCi12b2lkIG51bWFxX3RzY19kaXNhYmxlKHZvaWQpCi17Ci0JaWYgKCFmb3VuZF9udW1hcSkKLQkJcmV0dXJuOwotCi0JaWYgKG51bV9vbmxpbmVfbm9kZXMoKSA+IDEpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIk5VTUFROiBkaXNhYmxpbmcgVFNDXG4iKTsKLQkJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9UU0MpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG51bWFxX3RzY19pbml0KHZvaWQpCi17Ci0JbnVtYXFfdHNjX2Rpc2FibGUoKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2VuZXJhdGVfbG9naWNhbF9hcGljaWQoaW50IHF1YWQsIGludCBwaHlzX2FwaWNpZCkKLXsKLQlyZXR1cm4gKHF1YWQgPDwgNCkgKyAocGh5c19hcGljaWQgPyBwaHlzX2FwaWNpZCA8PCAxIDogMSk7Ci19Ci0KLS8qIHg4Nl9xdWlya3MgbWVtYmVyICovCi1zdGF0aWMgaW50IG1wY19hcGljX2lkKHN0cnVjdCBtcGNfY3B1ICptKQotewotCWludCBxdWFkID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX3F1YWQ7Ci0JaW50IGxvZ2ljYWxfYXBpY2lkID0gZ2VuZXJhdGVfbG9naWNhbF9hcGljaWQocXVhZCwgbS0+YXBpY2lkKTsKLQotCXByaW50ayhLRVJOX0RFQlVHCi0JCSJQcm9jZXNzb3IgIyVkICV1OiV1IEFQSUMgdmVyc2lvbiAlZCAocXVhZCAlZCwgYXBpYyAlZClcbiIsCi0JCSBtLT5hcGljaWQsIChtLT5jcHVmZWF0dXJlICYgQ1BVX0ZBTUlMWV9NQVNLKSA+PiA4LAotCQkobS0+Y3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LAotCQkgbS0+YXBpY3ZlciwgcXVhZCwgbG9naWNhbF9hcGljaWQpOwotCi0JcmV0dXJuIGxvZ2ljYWxfYXBpY2lkOwotfQotCi0vKiB4ODZfcXVpcmtzIG1lbWJlciAqLwotc3RhdGljIHZvaWQgbXBjX29lbV9idXNfaW5mbyhzdHJ1Y3QgbXBjX2J1cyAqbSwgY2hhciAqbmFtZSkKLXsKLQlpbnQgcXVhZCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19xdWFkOwotCWludCBsb2NhbCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19sb2NhbDsKLQotCW1wX2J1c19pZF90b19ub2RlW20tPmJ1c2lkXSA9IHF1YWQ7Ci0JbXBfYnVzX2lkX3RvX2xvY2FsW20tPmJ1c2lkXSA9IGxvY2FsOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQnVzICMlZCBpcyAlcyAobm9kZSAlZClcbiIsIG0tPmJ1c2lkLCBuYW1lLCBxdWFkKTsKLX0KLQotLyogeDg2X3F1aXJrcyBtZW1iZXIgKi8KLXN0YXRpYyB2b2lkIG1wY19vZW1fcGNpX2J1cyhzdHJ1Y3QgbXBjX2J1cyAqbSkKLXsKLQlpbnQgcXVhZCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19xdWFkOwotCWludCBsb2NhbCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19sb2NhbDsKLQotCXF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkW3F1YWRdW2xvY2FsXSA9IG0tPmJ1c2lkOwotfQotCi0vKgotICogQ2FsbGVkIGZyb20gbXBwYXJzZSBjb2RlLgotICogbW9kZSA9IDA6IHByZXNjYW4KLSAqIG1vZGUgPSAxOiBvbmUgbXBjIGVudHJ5IHNjYW5uZWQKLSAqLwotc3RhdGljIHZvaWQgbnVtYXFfbXBjX3JlY29yZCh1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQlpZiAoIW1vZGUpCi0JCW1wY19yZWNvcmQgPSAwOwotCWVsc2UKLQkJbXBjX3JlY29yZCsrOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgTVBfdHJhbnNsYXRpb25faW5mbyhzdHJ1Y3QgbXBjX3RyYW5zICptKQotewotCXByaW50ayhLRVJOX0lORk8KLQkgICAgIlRyYW5zbGF0aW9uOiByZWNvcmQgJWQsIHR5cGUgJWQsIHF1YWQgJWQsIGdsb2JhbCAlZCwgbG9jYWwgJWRcbiIsCi0JICAgICAgIG1wY19yZWNvcmQsIG0tPnRyYW5zX3R5cGUsIG0tPnRyYW5zX3F1YWQsIG0tPnRyYW5zX2dsb2JhbCwKLQkgICAgICAgbS0+dHJhbnNfbG9jYWwpOwotCi0JaWYgKG1wY19yZWNvcmQgPj0gTUFYX01QQ19FTlRSWSkKLQkJcHJpbnRrKEtFUk5fRVJSICJNQVhfTVBDX0VOVFJZIGV4Y2VlZGVkIVxuIik7Ci0JZWxzZQotCQl0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSA9IG07IC8qIHN0YXNoIHRoaXMgZm9yIGxhdGVyICovCi0KLQlpZiAobS0+dHJhbnNfcXVhZCA8IE1BWF9OVU1OT0RFUyAmJiAhbm9kZV9vbmxpbmUobS0+dHJhbnNfcXVhZCkpCi0JCW5vZGVfc2V0X29ubGluZShtLT50cmFuc19xdWFkKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXBmX2NoZWNrc3VtKHVuc2lnbmVkIGNoYXIgKm1wLCBpbnQgbGVuKQotewotCWludCBzdW0gPSAwOwotCi0Jd2hpbGUgKGxlbi0tKQotCQlzdW0gKz0gKm1wKys7Ci0KLQlyZXR1cm4gc3VtICYgMHhGRjsKLX0KLQotLyoKLSAqIFJlYWQvcGFyc2UgdGhlIE1QQyBvZW0gdGFibGVzCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfcmVhZF9tcGNfb2VtKHN0cnVjdCBtcGNfdGFibGUgKm1wYykKLXsKLQlzdHJ1Y3QgbXBjX29lbXRhYmxlICpvZW10YWJsZSA9ICh2b2lkICopKGxvbmcpbXBjLT5vZW1wdHI7Ci0JaW50IGNvdW50ID0gc2l6ZW9mKCpvZW10YWJsZSk7CS8qIHRoZSBoZWFkZXIgc2l6ZSAqLwotCXVuc2lnbmVkIGNoYXIgKm9lbXB0ciA9ICgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlKSArIGNvdW50OwotCi0JbXBjX3JlY29yZCA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTwotCQkiRm91bmQgYW4gT0VNIE1QQyB0YWJsZSBhdCAlOHAgLSBwYXJzaW5nIGl0Li4uXG4iLCBvZW10YWJsZSk7Ci0KLQlpZiAobWVtY21wKG9lbXRhYmxlLT5zaWduYXR1cmUsIE1QQ19PRU1fU0lHTkFUVVJFLCA0KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiU01QIG1wYyBvZW10YWJsZTogYmFkIHNpZ25hdHVyZSBbJWMlYyVjJWNdIVxuIiwKLQkJICAgICAgIG9lbXRhYmxlLT5zaWduYXR1cmVbMF0sIG9lbXRhYmxlLT5zaWduYXR1cmVbMV0sCi0JCSAgICAgICBvZW10YWJsZS0+c2lnbmF0dXJlWzJdLCBvZW10YWJsZS0+c2lnbmF0dXJlWzNdKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChtcGZfY2hlY2tzdW0oKHVuc2lnbmVkIGNoYXIgKilvZW10YWJsZSwgb2VtdGFibGUtPmxlbmd0aCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU01QIG9lbSBtcHRhYmxlOiBjaGVja3N1bSBlcnJvciFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jd2hpbGUgKGNvdW50IDwgb2VtdGFibGUtPmxlbmd0aCkgewotCQlzd2l0Y2ggKCpvZW1wdHIpIHsKLQkJY2FzZSBNUF9UUkFOU0xBVElPTjoKLQkJCXsKLQkJCQlzdHJ1Y3QgbXBjX3RyYW5zICptID0gKHZvaWQgKilvZW1wdHI7Ci0KLQkJCQlNUF90cmFuc2xhdGlvbl9pbmZvKG0pOwotCQkJCW9lbXB0ciArPSBzaXplb2YoKm0pOwotCQkJCWNvdW50ICs9IHNpemVvZigqbSk7Ci0JCQkJKyttcGNfcmVjb3JkOwotCQkJCWJyZWFrOwotCQkJfQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJVbnJlY29nbmlzZWQgT0VNIHRhYmxlIGVudHJ5IHR5cGUhIC0gJWRcbiIsCi0JCQkgICAgICAgKGludCkqb2VtcHRyKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIGVhcmx5X2NoZWNrX251bWFxKHZvaWQpCi17Ci0JLyoKLQkgKiBnZXQgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uOgotCSAqLwotCWlmIChzbXBfZm91bmRfY29uZmlnKQotCQllYXJseV9nZXRfc21wX2NvbmZpZygpOwotCi0JaWYgKGZvdW5kX251bWFxKSB7Ci0JCXg4Nl9pbml0Lm1wcGFyc2UubXBjX3JlY29yZCA9IG51bWFxX21wY19yZWNvcmQ7Ci0JCXg4Nl9pbml0Lm1wcGFyc2Uuc2V0dXBfaW9hcGljX2lkcyA9IHg4Nl9pbml0X25vb3A7Ci0JCXg4Nl9pbml0Lm1wcGFyc2UubXBjX2FwaWNfaWQgPSBtcGNfYXBpY19pZDsKLQkJeDg2X2luaXQubXBwYXJzZS5zbXBfcmVhZF9tcGNfb2VtID0gc21wX3JlYWRfbXBjX29lbTsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfb2VtX3BjaV9idXMgPSBtcGNfb2VtX3BjaV9idXM7Ci0JCXg4Nl9pbml0Lm1wcGFyc2UubXBjX29lbV9idXNfaW5mbyA9IG1wY19vZW1fYnVzX2luZm87Ci0JCXg4Nl9pbml0LnRpbWVycy50c2NfcHJlX2luaXQgPSBudW1hcV90c2NfaW5pdDsKLQkJeDg2X2luaXQucGNpLmluaXQgPSBwY2lfbnVtYXFfaW5pdDsKLQl9Ci19Ci0KLWludCBfX2luaXQgbnVtYXFfbnVtYV9pbml0KHZvaWQpCi17Ci0JZWFybHlfY2hlY2tfbnVtYXEoKTsKLQlpZiAoIWZvdW5kX251bWFxKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlzbXBfZHVtcF9xY3QoKTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIE5VTUFRX0FQSUNfREZSX1ZBTFVFCShBUElDX0RGUl9DTFVTVEVSKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBudW1hcV9nZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCi17Ci0JcmV0dXJuICh4ID4+IDI0KSAmIDB4MEY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9zZW5kX0lQSV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBpbnQgdmVjdG9yKQotewotCWRlZmF1bHRfc2VuZF9JUElfbWFza19zZXF1ZW5jZV9sb2dpY2FsKG1hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGZfbG9naWNhbChjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKLXsKLQludW1hcV9zZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotI2RlZmluZSBOVU1BUV9UUkFNUE9MSU5FX1BIWVNfTE9XCSgweDgpCi0jZGVmaW5lIE5VTUFRX1RSQU1QT0xJTkVfUEhZU19ISUdICSgweGEpCi0KLS8qCi0gKiBCZWNhdXNlIHdlIHVzZSBOTUlzIHJhdGhlciB0aGFuIHRoZSBJTklULVNUQVJUVVAgc2VxdWVuY2UgdG8KLSAqIGJvb3RzdHJhcCB0aGUgQ1BVcywgdGhlIEFQSUMgbWF5IGJlIGluIGEgd2VpcmQgc3RhdGUuIEtpY2sgaXQ6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWModm9pZCkKLXsKLQljbGVhcl9sb2NhbF9BUElDKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm51bWFxX3RhcmdldF9jcHVzKHZvaWQpCi17Ci0JcmV0dXJuIGNwdV9hbGxfbWFzazsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbnVtYXFfY2hlY2tfYXBpY2lkX3VzZWQocGh5c2lkX21hc2tfdCAqbWFwLCBpbnQgYXBpY2lkKQotewotCXJldHVybiBwaHlzaWRfaXNzZXQoYXBpY2lkLCAqbWFwKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG51bWFxX2NoZWNrX2FwaWNpZF9wcmVzZW50KGludCBiaXQpCi17Ci0JcmV0dXJuIHBoeXNpZF9pc3NldChiaXQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbnVtYXFfYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9pbml0X2FwaWNfbGRyKHZvaWQpCi17Ci0JLyogQWxyZWFkeSBkb25lIGluIE5VTUEtUSBmaXJtd2FyZSAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnVtYXFfc2V0dXBfYXBpY19yb3V0aW5nKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTwotCQkiRW5hYmxpbmcgQVBJQyBtb2RlOiAgTlVNQS1RLiAgVXNpbmcgJWQgSS9PIEFQSUNzXG4iLAotCQlucl9pb2FwaWNzKTsKLX0KLQotLyoKLSAqIFNraXAgYWRkaW5nIHRoZSB0aW1lciBpbnQgb24gc2Vjb25kYXJ5IG5vZGVzLCB3aGljaCBjYXVzZXMKLSAqIGEgc21hbGwgYnV0IHBhaW5mdWwgcmlmdCBpbiB0aGUgdGltZS1zcGFjZSBjb250aW51dW0uCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG51bWFxX211bHRpX3RpbWVyX2NoZWNrKGludCBhcGljLCBpbnQgaXJxKQotewotCXJldHVybiBhcGljICE9IDAgJiYgaXJxID09IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9pb2FwaWNfcGh5c19pZF9tYXAocGh5c2lkX21hc2tfdCAqcGh5c19tYXAsIHBoeXNpZF9tYXNrX3QgKnJldG1hcCkKLXsKLQkvKiBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcyB5ZXQgLSBoYWNrICovCi0JcmV0dXJuIHBoeXNpZHNfcHJvbW90ZSgweEZVTCwgcmV0bWFwKTsKLX0KLQotLyoKLSAqIFN1cHBvcnRpbmcgb3ZlciA2MCBjcHVzIG9uIE5VTUEtUSByZXF1aXJlcyBhIGxvY2FsaXR5LWRlcGVuZGVudAotICogY3B1IHRvIEFQSUMgSUQgcmVsYXRpb24gdG8gcHJvcGVybHkgaW50ZXJhY3Qgd2l0aCB0aGUgaW50ZWxsaWdlbnQKLSAqIG1vZGUgb2YgdGhlIGNsdXN0ZXIgY29udHJvbGxlci4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgbnVtYXFfY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQotewotCWlmIChtcHNfY3B1IDwgNjApCi0JCXJldHVybiAoKG1wc19jcHUgPj4gMikgPDwgNCkgfCAoMSA8PCAobXBzX2NwdSAmIDB4MykpOwotCWVsc2UKLQkJcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG51bWFxX2FwaWNpZF90b19ub2RlKGludCBsb2dpY2FsX2FwaWNpZCkKLXsKLQlyZXR1cm4gbG9naWNhbF9hcGljaWQgPj4gNDsKLX0KLQotc3RhdGljIGludCBudW1hcV9udW1hX2NwdV9ub2RlKGludCBjcHUpCi17Ci0JaW50IGxvZ2ljYWxfYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBjcHUpOwotCi0JaWYgKGxvZ2ljYWxfYXBpY2lkICE9IEJBRF9BUElDSUQpCi0JCXJldHVybiBudW1hcV9hcGljaWRfdG9fbm9kZShsb2dpY2FsX2FwaWNpZCk7Ci0JcmV0dXJuIE5VTUFfTk9fTk9ERTsKLX0KLQotc3RhdGljIHZvaWQgbnVtYXFfYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBsb2dpY2FsX2FwaWNpZCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCWludCBub2RlID0gbnVtYXFfYXBpY2lkX3RvX25vZGUobG9naWNhbF9hcGljaWQpOwotCWludCBjcHUgPSBfX2Zmcyhsb2dpY2FsX2FwaWNpZCAmIDB4Zik7Ci0KLQlwaHlzaWRfc2V0X21hc2tfb2ZfcGh5c2lkKGNwdSArIDQqbm9kZSwgcmV0bWFwKTsKLX0KLQotLyogV2hlcmUgdGhlIElPIGFyZWEgd2FzIG1hcHBlZCBvbiBtdWx0aXF1YWQsIGFsd2F5cyAwIG90aGVyd2lzZSAqLwotdm9pZCAqeHF1YWRfcG9ydGlvOwotCi1zdGF0aWMgaW5saW5lIGludCBudW1hcV9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBwaHlzX2FwaWNpZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIFdlIHVzZSBwaHlzaWNhbCBhcGljaWRzIGhlcmUsIG5vdCBsb2dpY2FsLCBzbyBqdXN0IHJldHVybiB0aGUgZGVmYXVsdAotICogcGh5c2ljYWwgYnJvYWRjYXN0IHRvIHN0b3AgcGVvcGxlIGZyb20gYnJlYWtpbmcgdXMKLSAqLwotc3RhdGljIGludAotbnVtYXFfY3B1X21hc2tfdG9fYXBpY2lkX2FuZChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywKLQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFuZG1hc2ssCi0JCQkgICAgIHVuc2lnbmVkIGludCAqYXBpY2lkKQotewotCSphcGljaWQgPSAweDBGOwotCXJldHVybiAwOwotfQotCi0vKiBObyBOVU1BLVEgYm94IGhhcyBhIEhUIENQVSwgYnV0IGl0IGNhbid0IGh1cnQgdG8gdXNlIHRoZSBkZWZhdWx0IGNvZGUuICovCi1zdGF0aWMgaW5saW5lIGludCBudW1hcV9waHlzX3BrZ19pZChpbnQgY3B1aWRfYXBpYywgaW50IGluZGV4X21zYikKLXsKLQlyZXR1cm4gY3B1aWRfYXBpYyA+PiBpbmRleF9tc2I7Ci19Ci0KLXN0YXRpYyBpbnQKLW51bWFxX21wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnByb2R1Y3RpZCkKLXsKLQlpZiAoc3RybmNtcChvZW0sICJJQk0gTlVNQSIsIDgpKQotCQlwcmludGsoS0VSTl9FUlIgIldhcm5pbmchIE5vdCBhIE5VTUEtUSBzeXN0ZW0hXG4iKTsKLQllbHNlCi0JCWZvdW5kX251bWFxID0gMTsKLQotCXJldHVybiBmb3VuZF9udW1hcTsKLX0KLQotc3RhdGljIGludCBwcm9iZV9udW1hcSh2b2lkKQotewotCS8qIGFscmVhZHkga25vdyBmcm9tIGdldF9tZW1jZmdfbnVtYXEoKSAqLwotCXJldHVybiBmb3VuZF9udW1hcTsKLX0KLQotc3RhdGljIHZvaWQgbnVtYXFfc2V0dXBfcG9ydGlvX3JlbWFwKHZvaWQpCi17Ci0JaW50IG51bV9xdWFkcyA9IG51bV9vbmxpbmVfbm9kZXMoKTsKLQotCWlmIChudW1fcXVhZHMgPD0gMSkKLQkJcmV0dXJuOwotCi0JcHJpbnRrKEtFUk5fSU5GTwotCQkiUmVtYXBwaW5nIGNyb3NzLXF1YWQgcG9ydCBJL08gZm9yICVkIHF1YWRzXG4iLCBudW1fcXVhZHMpOwotCi0JeHF1YWRfcG9ydGlvID0gaW9yZW1hcChYUVVBRF9QT1JUSU9fQkFTRSwgbnVtX3F1YWRzKlhRVUFEX1BPUlRJT19RVUFEKTsKLQotCXByaW50ayhLRVJOX0lORk8KLQkJInhxdWFkX3BvcnRpbyB2YWRkciAweCUwOGx4LCBsZW4gJTA4bHhcbiIsCi0JCSh1X2xvbmcpIHhxdWFkX3BvcnRpbywgKHVfbG9uZykgbnVtX3F1YWRzKlhRVUFEX1BPUlRJT19RVUFEKTsKLX0KLQotLyogVXNlIF9fcmVmZGF0YSB0byBrZWVwIGZhbHNlIHBvc2l0aXZlIHdhcm5pbmcgY2FsbS4gICovCi1zdGF0aWMgc3RydWN0IGFwaWMgX19yZWZkYXRhIGFwaWNfbnVtYXEgPSB7Ci0KLQkubmFtZQkJCQk9ICJOVU1BUSIsCi0JLnByb2JlCQkJCT0gcHJvYmVfbnVtYXEsCi0JLmFjcGlfbWFkdF9vZW1fY2hlY2sJCT0gTlVMTCwKLQkuYXBpY19pZF92YWxpZAkJCT0gZGVmYXVsdF9hcGljX2lkX3ZhbGlkLAotCS5hcGljX2lkX3JlZ2lzdGVyZWQJCT0gbnVtYXFfYXBpY19pZF9yZWdpc3RlcmVkLAotCi0JLmlycV9kZWxpdmVyeV9tb2RlCQk9IGRlc3RfTG93ZXN0UHJpbywKLQkvKiBwaHlzaWNhbCBkZWxpdmVyeSBvbiBMT0NBTCBxdWFkOiAqLwotCS5pcnFfZGVzdF9tb2RlCQkJPSAwLAotCi0JLnRhcmdldF9jcHVzCQkJPSBudW1hcV90YXJnZXRfY3B1cywKLQkuZGlzYWJsZV9lc3IJCQk9IDEsCi0JLmRlc3RfbG9naWNhbAkJCT0gQVBJQ19ERVNUX0xPR0lDQUwsCi0JLmNoZWNrX2FwaWNpZF91c2VkCQk9IG51bWFxX2NoZWNrX2FwaWNpZF91c2VkLAotCS5jaGVja19hcGljaWRfcHJlc2VudAkJPSBudW1hcV9jaGVja19hcGljaWRfcHJlc2VudCwKLQotCS52ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4JPSBmbGF0X3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiwKLQkuaW5pdF9hcGljX2xkcgkJCT0gbnVtYXFfaW5pdF9hcGljX2xkciwKLQotCS5pb2FwaWNfcGh5c19pZF9tYXAJCT0gbnVtYXFfaW9hcGljX3BoeXNfaWRfbWFwLAotCS5zZXR1cF9hcGljX3JvdXRpbmcJCT0gbnVtYXFfc2V0dXBfYXBpY19yb3V0aW5nLAotCS5tdWx0aV90aW1lcl9jaGVjawkJPSBudW1hcV9tdWx0aV90aW1lcl9jaGVjaywKLQkuY3B1X3ByZXNlbnRfdG9fYXBpY2lkCQk9IG51bWFxX2NwdV9wcmVzZW50X3RvX2FwaWNpZCwKLQkuYXBpY2lkX3RvX2NwdV9wcmVzZW50CQk9IG51bWFxX2FwaWNpZF90b19jcHVfcHJlc2VudCwKLQkuc2V0dXBfcG9ydGlvX3JlbWFwCQk9IG51bWFxX3NldHVwX3BvcnRpb19yZW1hcCwKLQkuY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudAk9IG51bWFxX2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQsCi0JLmVuYWJsZV9hcGljX21vZGUJCT0gTlVMTCwKLQkucGh5c19wa2dfaWQJCQk9IG51bWFxX3BoeXNfcGtnX2lkLAotCS5tcHNfb2VtX2NoZWNrCQkJPSBudW1hcV9tcHNfb2VtX2NoZWNrLAotCi0JLmdldF9hcGljX2lkCQkJPSBudW1hcV9nZXRfYXBpY19pZCwKLQkuc2V0X2FwaWNfaWQJCQk9IE5VTEwsCi0JLmFwaWNfaWRfbWFzawkJCT0gMHgwRiA8PCAyNCwKLQotCS5jcHVfbWFza190b19hcGljaWRfYW5kCQk9IG51bWFxX2NwdV9tYXNrX3RvX2FwaWNpZF9hbmQsCi0KLQkuc2VuZF9JUElfbWFzawkJCT0gbnVtYXFfc2VuZF9JUElfbWFzaywKLQkuc2VuZF9JUElfbWFza19hbGxidXRzZWxmCT0gTlVMTCwKLQkuc2VuZF9JUElfYWxsYnV0c2VsZgkJPSBudW1hcV9zZW5kX0lQSV9hbGxidXRzZWxmLAotCS5zZW5kX0lQSV9hbGwJCQk9IG51bWFxX3NlbmRfSVBJX2FsbCwKLQkuc2VuZF9JUElfc2VsZgkJCT0gZGVmYXVsdF9zZW5kX0lQSV9zZWxmLAotCi0JLndha2V1cF9zZWNvbmRhcnlfY3B1CQk9IHdha2V1cF9zZWNvbmRhcnlfY3B1X3ZpYV9ubWksCi0JLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gTlVNQVFfVFJBTVBPTElORV9QSFlTX0xPVywKLQkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gTlVNQVFfVFJBTVBPTElORV9QSFlTX0hJR0gsCi0KLQkvKiBXZSBkb24ndCBkbyBhbnl0aGluZyBoZXJlIGJlY2F1c2Ugd2UgdXNlIE5NSSdzIHRvIGJvb3QgaW5zdGVhZCAqLwotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCi0KLQkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gbnVtYXFfc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljLAotCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IE5VTEwsCi0KLQkucmVhZAkJCQk9IG5hdGl2ZV9hcGljX21lbV9yZWFkLAotCS53cml0ZQkJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuZW9pX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmljcl9yZWFkCQkJPSBuYXRpdmVfYXBpY19pY3JfcmVhZCwKLQkuaWNyX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19pY3Jfd3JpdGUsCi0JLndhaXRfaWNyX2lkbGUJCQk9IG5hdGl2ZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0JLnNhZmVfd2FpdF9pY3JfaWRsZQkJPSBuYXRpdmVfc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0KLQkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gbm9vcF94ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQsCi0JLng4Nl8zMl9udW1hX2NwdV9ub2RlCQk9IG51bWFxX251bWFfY3B1X25vZGUsCi19OwotCi1hcGljX2RyaXZlcihhcGljX251bWFxKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCmluZGV4IGViMzVlZjkuLmNjZWIzNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYwpAQCAtMTE5LDggKzExOSw3IEBACiAJLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAogCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAogCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZGVmYXVsdF93YWl0X2Zvcl9pbml0X2RlYXNzZXJ0LAotCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gdHJ1ZSwKIAkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKIAkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3N1bW1pdF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTQ2ZjkuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLyoKLSAqIElCTSBTdW1taXQtU3BlY2lmaWMgQ29kZQotICoKLSAqIFdyaXR0ZW4gQnk6IE1hdHRoZXcgRG9ic29uLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnAuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIDxjb2xwYXRjaEB1cy5pYm0uY29tPgotICoKLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpICJzdW1taXQ6ICVzOiAiIGZtdCwgX19mdW5jX18KLQotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2Jpb3NfZWJkYS5oPgotCi0vKgotICogQVBJQyBkcml2ZXIgZm9yIHRoZSBJQk0gIlN1bW1pdCIgY2hpcHNldC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgotI2luY2x1ZGUgPGFzbS9pcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotc3RhdGljIHVuc2lnbmVkIHN1bW1pdF9nZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCi17Ci0JcmV0dXJuICh4ID4+IDI0KSAmIDB4RkY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdW1taXRfc2VuZF9JUElfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgaW50IHZlY3RvcikKLXsKLQlkZWZhdWx0X3NlbmRfSVBJX21hc2tfc2VxdWVuY2VfbG9naWNhbChtYXNrLCB2ZWN0b3IpOwotfQotCi1zdGF0aWMgdm9pZCBzdW1taXRfc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQotewotCWRlZmF1bHRfc2VuZF9JUElfbWFza19hbGxidXRzZWxmX2xvZ2ljYWwoY3B1X29ubGluZV9tYXNrLCB2ZWN0b3IpOwotfQotCi1zdGF0aWMgdm9pZCBzdW1taXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCi17Ci0Jc3VtbWl0X3NlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXNrLCB2ZWN0b3IpOwotfQotCi0jaW5jbHVkZSA8YXNtL3RzYy5oPgotCi1leHRlcm4gaW50IHVzZV9jeWNsb25lOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9TVU1NSVRfTlVNQQotc3RhdGljIHZvaWQgc2V0dXBfc3VtbWl0KHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9zdW1taXQodm9pZCkge30KLSNlbmRpZgotCi1zdGF0aWMgaW50IHN1bW1pdF9tcHNfb2VtX2NoZWNrKHN0cnVjdCBtcGNfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQljaGFyICpwcm9kdWN0aWQpCi17Ci0JaWYgKCFzdHJuY21wKG9lbSwgIklCTSBFTlNXIiwgOCkgJiYKLQkJCSghc3RybmNtcChwcm9kdWN0aWQsICJWSUdJTCBTTVAiLCA5KQotCQkJIHx8ICFzdHJuY21wKHByb2R1Y3RpZCwgIkVYQSIsIDMpCi0JCQkgfHwgIXN0cm5jbXAocHJvZHVjdGlkLCAiUlVUSExFU1MgU01QIiwgMTIpKSl7Ci0JCW1hcmtfdHNjX3Vuc3RhYmxlKCJTdW1taXQgYmFzZWQgc3lzdGVtIik7Ci0JCXVzZV9jeWNsb25lID0gMTsgLyplbmFibGUgY3ljbG9uZS10aW1lciovCi0JCXNldHVwX3N1bW1pdCgpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEhvb2sgZnJvbSBnZW5lcmljIEFDUEkgdGFibGVzLmMgKi8KLXN0YXRpYyBpbnQgc3VtbWl0X2FjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JaWYgKCFzdHJuY21wKG9lbV9pZCwgIklCTSIsIDMpICYmCi0JICAgICghc3RybmNtcChvZW1fdGFibGVfaWQsICJTRVJWSUdJTCIsIDgpCi0JICAgICB8fCAhc3RybmNtcChvZW1fdGFibGVfaWQsICJFWEEiLCAzKSkpewotCQltYXJrX3RzY191bnN0YWJsZSgiU3VtbWl0IGJhc2VkIHN5c3RlbSIpOwotCQl1c2VfY3ljbG9uZSA9IDE7IC8qZW5hYmxlIGN5Y2xvbmUtdGltZXIqLwotCQlzZXR1cF9zdW1taXQoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgcmlvX3RhYmxlX2hkciB7Ci0JdW5zaWduZWQgY2hhciB2ZXJzaW9uOyAgICAgIC8qIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gMyBhZGRzIGNoYXNzaXNfbnVtICYgV1BfaW5kZXggICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBudW1fc2NhbF9kZXY7IC8qICMgb2YgU2NhbGFiaWxpdHkgZGV2aWNlcyAoVHdpc3RlcnMgZm9yIFZpZ2lsKSAgICovCi0JdW5zaWduZWQgY2hhciBudW1fcmlvX2RldjsgIC8qICMgb2YgUklPIEkvTyBkZXZpY2VzIChDeWNsb25lcyBhbmQgV2lubmlwZWdzKSAgICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3Qgc2NhbF9kZXRhaWwgewotCXVuc2lnbmVkIGNoYXIgbm9kZV9pZDsgICAgICAvKiBTY2FsYWJpbGl0eSBOb2RlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcgQ0JBUjsgICAgICAgICAvKiBBZGRyZXNzIG9mIDFNQiByZWdpc3RlciBzcGFjZSAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDBub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGPU5vbmUgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDBwb3J0OyAgICAvKiBQb3J0IG51bSBwb3J0IGNvbm5lY3RlZCB0bzogMCwxLDIsIG9yIDB4RkY9Tm9uZSAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDFub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGID0gTm9uZSAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDFwb3J0OyAgICAvKiBQb3J0IG51bSBwb3J0IGNvbm5lY3RlZCB0bzogMCwxLDIsIG9yIDB4RkY9Tm9uZSAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDJub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGID0gTm9uZSAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDJwb3J0OyAgICAvKiBQb3J0IG51bSBwb3J0IGNvbm5lY3RlZCB0bzogMCwxLDIsIG9yIDB4RkY9Tm9uZSAqLwotCXVuc2lnbmVkIGNoYXIgY2hhc3Npc19udW07ICAvKiAxIGJhc2VkIENoYXNzaXMgbnVtYmVyICgxID0gYm9vdCBub2RlKSAgICAgICAgICAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHJpb19kZXRhaWwgewotCXVuc2lnbmVkIGNoYXIgbm9kZV9pZDsgICAgICAvKiBSSU8gTm9kZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcgQkJBUjsgICAgICAgICAvKiBBZGRyZXNzIG9mIDFNQiByZWdpc3RlciBzcGFjZSAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgdHlwZTsgICAgICAgICAvKiBUeXBlIG9mIGRldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgb3duZXJfaWQ7ICAgICAvKiBGb3IgV1BFRzogTm9kZSBJRCBvZiBDeWNsb25lIHRoYXQgb3ducyB0aGlzIFdQRUcqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgQ1lDOiAgTm9kZSBJRCBvZiBUd2lzdGVyIHRoYXQgb3ducyB0aGlzIENZQyAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDBub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGPU5vbmUgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDBwb3J0OyAgICAvKiBQb3J0IG51bSBwb3J0IGNvbm5lY3RlZCB0bzogMCwxLDIsIG9yIDB4RkY9Tm9uZSAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDFub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGPU5vbmUgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgcG9ydDFwb3J0OyAgICAvKiBQb3J0IG51bSBwb3J0IGNvbm5lY3RlZCB0bzogMCwxLDIsIG9yIDB4RkY9Tm9uZSAqLwotCXVuc2lnbmVkIGNoYXIgZmlyc3Rfc2xvdDsgICAvKiBGb3IgV1BFRzogTG93ZXN0IHNsb3QgbnVtYmVyIGJlbG93IHRoaXMgV1BFRyAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgQ1lDOiAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOyAgICAgICAvKiBGb3IgV1BFRzogQml0IDAgPSAxIDogdGhlIFhBUElDIGlzIHVzZWQgICAgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgPSAwIDogdGhlIFhBUElDIGlzIG5vdCB1c2VkLCBpZToqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgIGludHMgZndkZWQgdG8gYW5vdGhlciBYQVBJQyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgQml0czE6NyBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgQ1lDOiAgQml0czA6NyBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgV1BfaW5kZXg7ICAgICAvKiBGb3IgV1BFRzogV1BFRyBpbnN0YW5jZSBpbmRleCAtIGxvd2VyIG9uZXMgaGF2ZSAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgbG93ZXIgc2xvdCBudW1iZXJzL1BDSSBidXMgbnVtYmVycyAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgQ1lDOiAgTm8gbWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgY2hhc3Npc19udW07ICAvKiAxIGJhc2VkIENoYXNzaXMgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgTG9va091dCBXUEVHcyB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHBhbnNpb24gQ2hhc3NpcyAjLCBlbnVtZXJhdGVkIGZyb20gQm9vdCAgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb2RlIFdQRUcgZXh0ZXJuYWwgcG9ydCwgdGhlbiBCb290IE5vZGUgQ1lDICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRlcm5hbCBwb3J0LCB0aGVuIE5leHQgVmlnaWwgY2hhc3NpcyBXUEVHICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRlcm5hbCBwb3J0LCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGFyZWQgTG9va291dHMgaGF2ZSBvbmx5IDEgY2hhc3NpcyBudW1iZXIgKHRoZSAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBvbmUgYXNzaWduZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotCi10eXBlZGVmIGVudW0gewotCUNvbXBhdFR3aXN0ZXIgPSAwLCAgLyogQ29tcGF0aWJpbGl0eSBUd2lzdGVyICAgICAgICAgICAgICAgKi8KLQlBbHRUd2lzdGVyICAgID0gMSwgIC8qIEFsdGVybmF0ZSBUd2lzdGVyIG9mIGludGVybmFsIDgtd2F5ICovCi0JQ29tcGF0Q3ljbG9uZSA9IDIsICAvKiBDb21wYXRpYmlsaXR5IEN5Y2xvbmUgICAgICAgICAgICAgICAqLwotCUFsdEN5Y2xvbmUgICAgPSAzLCAgLyogQWx0ZXJuYXRlIEN5Y2xvbmUgb2YgaW50ZXJuYWwgOC13YXkgKi8KLQlDb21wYXRXUEVHICAgID0gNCwgIC8qIENvbXBhdGliaWxpdHkgV1BFRyAgICAgICAgICAgICAgICAgICovCi0JQWx0V1BFRyAgICAgICA9IDUsICAvKiBTZWNvbmQgUGxhbmFyIFdQRUcgICAgICAgICAgICAgICAgICAqLwotCUxvb2tPdXRBV1BFRyAgPSA2LCAgLyogTG9va091dCBXUEVHICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlMb29rT3V0QldQRUcgID0gNywgIC8qIExvb2tPdXQgV1BFRyAgICAgICAgICAgICAgICAgICAgICAgICovCi19IG5vZGVfdHlwZTsKLQotc3RhdGljIGlubGluZSBpbnQgaXNfV1BFRyhzdHJ1Y3QgcmlvX2RldGFpbCAqcmlvKXsKLQlyZXR1cm4gKHJpby0+dHlwZSA9PSBDb21wYXRXUEVHIHx8IHJpby0+dHlwZSA9PSBBbHRXUEVHIHx8Ci0JCXJpby0+dHlwZSA9PSBMb29rT3V0QVdQRUcgfHwgcmlvLT50eXBlID09IExvb2tPdXRCV1BFRyk7Ci19Ci0KLSNkZWZpbmUgU1VNTUlUX0FQSUNfREZSX1ZBTFVFCShBUElDX0RGUl9DTFVTVEVSKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnN1bW1pdF90YXJnZXRfY3B1cyh2b2lkKQotewotCS8qIENQVV9NQVNLX0FMTCAoMHhmZikgaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2l0aAotCSAqIGRlc3RfTG93ZXN0UHJpbyBtb2RlIGxvZ2ljYWwgY2x1c3RlcmVkIGFwaWMgaW50ZXJydXB0IHJvdXRpbmcKLQkgKiBKdXN0IHN0YXJ0IG9uIGNwdSAwLiAgSVJRIGJhbGFuY2luZyB3aWxsIHNwcmVhZCBsb2FkCi0JICovCi0JcmV0dXJuIGNwdW1hc2tfb2YoMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN1bW1pdF9jaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190ICptYXAsIGludCBhcGljaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHdlIGRvbid0IHVzZSB0aGUgcGh5c19jcHVfcHJlc2VudF9tYXAgdG8gaW5kaWNhdGUgYXBpY2lkIHByZXNlbmNlICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzdW1taXRfY2hlY2tfYXBpY2lkX3ByZXNlbnQoaW50IGJpdCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBzdW1taXRfZWFybHlfbG9naWNhbF9hcGljaWQoaW50IGNwdSkKLXsKLQlpbnQgY291bnQgPSAwOwotCXU4IG15X2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KTsKLQl1OCBteV9jbHVzdGVyID0gQVBJQ19DTFVTVEVSKG15X2lkKTsKLSNpZmRlZiBDT05GSUdfU01QCi0JdTggbGlkOwotCWludCBpOwotCi0JLyogQ3JlYXRlIGxvZ2ljYWwgQVBJQyBJRHMgYnkgY291bnRpbmcgQ1BVcyBhbHJlYWR5IGluIGNsdXN0ZXIuICovCi0JZm9yIChjb3VudCA9IDAsIGkgPSBucl9jcHVfaWRzOyAtLWkgPj0gMDsgKSB7Ci0JCWxpZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgaSk7Ci0JCWlmIChsaWQgIT0gQkFEX0FQSUNJRCAmJiBBUElDX0NMVVNURVIobGlkKSA9PSBteV9jbHVzdGVyKQotCQkJKytjb3VudDsKLQl9Ci0jZW5kaWYKLQkvKiBXZSBvbmx5IGhhdmUgYSA0IHdpZGUgYml0bWFwIGluIGNsdXN0ZXIgbW9kZS4gIElmIGEgZGVyYW5nZWQKLQkgKiBCSU9TIHB1dHMgNSBDUFVzIGluIG9uZSBBUElDIGNsdXN0ZXIsIHdlJ3JlIGhvc2VkLiAqLwotCUJVR19PTihjb3VudCA+PSBYQVBJQ19ERVNUX0NQVVNfU0hJRlQpOwotCXJldHVybiBteV9jbHVzdGVyIHwgKDFVTCA8PCBjb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bW1pdF9pbml0X2FwaWNfbGRyKHZvaWQpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1bnNpZ25lZCBsb25nIGlkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBjcHUpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JYXBpY193cml0ZShBUElDX0RGUiwgU1VNTUlUX0FQSUNfREZSX1ZBTFVFKTsKLQl2YWwgPSBhcGljX3JlYWQoQVBJQ19MRFIpICYgfkFQSUNfTERSX01BU0s7Ci0JdmFsIHw9IFNFVF9BUElDX0xPR0lDQUxfSUQoaWQpOwotCWFwaWNfd3JpdGUoQVBJQ19MRFIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3VtbWl0X2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBzdW1taXRfc2V0dXBfYXBpY19yb3V0aW5nKHZvaWQpCi17Ci0JcHJfaW5mbygiRW5hYmxpbmcgQVBJQyBtb2RlOiAgU3VtbWl0LiAgVXNpbmcgJWQgSS9PIEFQSUNzXG4iLAotCQlucl9pb2FwaWNzKTsKLX0KLQotc3RhdGljIGludCBzdW1taXRfY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQotewotCWlmIChtcHNfY3B1IDwgbnJfY3B1X2lkcykKLQkJcmV0dXJuIChpbnQpcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBtcHNfY3B1KTsKLQllbHNlCi0JCXJldHVybiBCQURfQVBJQ0lEOwotfQotCi1zdGF0aWMgdm9pZCBzdW1taXRfaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNpZF9tYXNrX3QgKnBoeXNfaWRfbWFwLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JLyogRm9yIGNsdXN0ZXJlZCB3ZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcyB5ZXQgLSBoYWNrICovCi0JcGh5c2lkc19wcm9tb3RlKDB4MEZMLCByZXRtYXApOwotfQotCi1zdGF0aWMgdm9pZCBzdW1taXRfYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBhcGljaWQsIHBoeXNpZF9tYXNrX3QgKnJldG1hcCkKLXsKLQlwaHlzaWRfc2V0X21hc2tfb2ZfcGh5c2lkKDAsIHJldG1hcCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3VtbWl0X2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IHBoeXNpY2FsX2FwaWNpZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXN1bW1pdF9jcHVfbWFza190b19hcGljaWQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssIHVuc2lnbmVkIGludCAqZGVzdF9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgcm91bmQgPSAwOwotCXVuc2lnbmVkIGludCBjcHUsIGFwaWNpZCA9IDA7Ci0KLQkvKgotCSAqIFRoZSBjcHVzIGluIHRoZSBtYXNrIG11c3QgYWxsIGJlIG9uIHRoZSBhcGljIGNsdXN0ZXIuCi0JICovCi0JZm9yX2VhY2hfY3B1X2FuZChjcHUsIGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFzaykgewotCQlpbnQgbmV3X2FwaWNpZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgY3B1KTsKLQotCQlpZiAocm91bmQgJiYgQVBJQ19DTFVTVEVSKGFwaWNpZCkgIT0gQVBJQ19DTFVTVEVSKG5ld19hcGljaWQpKSB7Ci0JCQlwcl9lcnIoIk5vdCBhIHZhbGlkIG1hc2shXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWFwaWNpZCB8PSBuZXdfYXBpY2lkOwotCQlyb3VuZCsrOwotCX0KLQlpZiAoIXJvdW5kKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqZGVzdF9pZCA9IGFwaWNpZDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc3VtbWl0X2NwdV9tYXNrX3RvX2FwaWNpZF9hbmQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmlubWFzaywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphbmRtYXNrLAotCQkJICAgICAgdW5zaWduZWQgaW50ICphcGljaWQpCi17Ci0JY3B1bWFza192YXJfdCBjcHVtYXNrOwotCSphcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIDApOwotCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY3B1bWFzaywgR0ZQX0FUT01JQykpCi0JCXJldHVybiAwOwotCi0JY3B1bWFza19hbmQoY3B1bWFzaywgaW5tYXNrLCBhbmRtYXNrKTsKLQlzdW1taXRfY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2ssIGFwaWNpZCk7Ci0KLQlmcmVlX2NwdW1hc2tfdmFyKGNwdW1hc2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBjcHVpZCByZXR1cm5zIHRoZSB2YWx1ZSBsYXRjaGVkIGluIHRoZSBIVyBhdCByZXNldCwgbm90IHRoZSBBUElDIElECi0gKiByZWdpc3RlcidzIHZhbHVlLiAgRm9yIGFueSBib3ggd2hvc2UgQklPUyBjaGFuZ2VzIEFQSUMgSURzLCBsaWtlCi0gKiBjbHVzdGVyZWQgQVBJQyBzeXN0ZW1zLCB3ZSBtdXN0IHVzZSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQuCi0gKgotICogU2VlIEludGVsJ3MgSUEtMzIgU1cgRGV2J3MgTWFudWFsIFZvbDIgdW5kZXIgQ1BVSUQuCi0gKi8KLXN0YXRpYyBpbnQgc3VtbWl0X3BoeXNfcGtnX2lkKGludCBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQotewotCXJldHVybiBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSA+PiBpbmRleF9tc2I7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvYmVfc3VtbWl0KHZvaWQpCi17Ci0JLyogcHJvYmVkIGxhdGVyIGluIG1wdGFibGUvQUNQSSBob29rcyAqLwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1g4Nl9TVU1NSVRfTlVNQQotc3RhdGljIHN0cnVjdCByaW9fdGFibGVfaGRyICpyaW9fdGFibGVfaGRyOwotc3RhdGljIHN0cnVjdCBzY2FsX2RldGFpbCAgICpzY2FsX2RldnNbTUFYX05VTU5PREVTXTsKLXN0YXRpYyBzdHJ1Y3QgcmlvX2RldGFpbCAgICAqcmlvX2RldnNbTUFYX05VTU5PREVTKjRdOwotCi0jaWZuZGVmIENPTkZJR19YODZfTlVNQVEKLXN0YXRpYyBpbnQgbXBfYnVzX2lkX3RvX25vZGVbTUFYX01QX0JVU1NFU107Ci0jZW5kaWYKLQotc3RhdGljIGludCBzZXR1cF9wY2lfbm9kZV9tYXBfZm9yX3dwZWcoaW50IHdwZWdfbnVtLCBpbnQgbGFzdF9idXMpCi17Ci0JaW50IHR3aXN0ZXIgPSAwLCBub2RlID0gMDsKLQlpbnQgaSwgYnVzLCBudW1fYnVzZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7IGkrKykgewotCQlpZiAocmlvX2RldnNbaV0tPm5vZGVfaWQgPT0gcmlvX2RldnNbd3BlZ19udW1dLT5vd25lcl9pZCkgewotCQkJdHdpc3RlciA9IHJpb19kZXZzW2ldLT5vd25lcl9pZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2KSB7Ci0JCXByX2VycigiQ291bGRuJ3QgZmluZCBvd25lciBDeWNsb25lIGZvciBXaW5uaXBlZyFcbiIpOwotCQlyZXR1cm4gbGFzdF9idXM7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsgaSsrKSB7Ci0JCWlmIChzY2FsX2RldnNbaV0tPm5vZGVfaWQgPT0gdHdpc3RlcikgewotCQkJbm9kZSA9IHNjYWxfZGV2c1tpXS0+bm9kZV9pZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldikgewotCQlwcl9lcnIoIkNvdWxkbid0IGZpbmQgb3duZXIgVHdpc3RlciBmb3IgQ3ljbG9uZSFcbiIpOwotCQlyZXR1cm4gbGFzdF9idXM7Ci0JfQotCi0Jc3dpdGNoIChyaW9fZGV2c1t3cGVnX251bV0tPnR5cGUpIHsKLQljYXNlIENvbXBhdFdQRUc6Ci0JCS8qCi0JCSAqIFRoZSBDb21wYXRpYmlsaXR5IFdpbm5pcGVnIGNvbnRyb2xzIHRoZSAyIGxlZ2FjeSBidXNlcywKLQkJICogdGhlIDY2TUh6IFBDSSBidXMgWzIgc2xvdHNdIGFuZCB0aGUgMiAiZXh0cmEiIGJ1c2VzIGluIGNhc2UKLQkJICogYSBQQ0ktUENJIGJyaWRnZSBjYXJkIGlzIHVzZWQgaW4gZWl0aGVyIHNsb3Q6IHRvdGFsIDUgYnVzZXMuCi0JCSAqLwotCQludW1fYnVzZXMgPSA1OwotCQlicmVhazsKLQljYXNlIEFsdFdQRUc6Ci0JCS8qCi0JCSAqIFRoZSBBbHRlcm5hdGUgV2lubmlwZWcgY29udHJvbHMgdGhlIDIgMTMzTUh6IGJ1c2VzIFsxIHNsb3QKLQkJICogZWFjaF0sIHRoZWlyIDIgImV4dHJhIiBidXNlcywgdGhlIDEwME1IeiBidXMgWzIgc2xvdHNdIGFuZAotCQkgKiB0aGUgImV4dHJhIiBidXNlcyBmb3IgZWFjaCBvZiB0aG9zZSBzbG90czogdG90YWwgNyBidXNlcy4KLQkJICovCi0JCW51bV9idXNlcyA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgTG9va091dEFXUEVHOgotCWNhc2UgTG9va091dEJXUEVHOgotCQkvKgotCQkgKiBBIExvb2tvdXQgV2lubmlwZWcgY29udHJvbHMgMyAxMDBNSHogYnVzZXMgWzIgc2xvdHMgZWFjaF0KLQkJICogJiB0aGUgImV4dHJhIiBidXNlcyBmb3IgZWFjaCBvZiB0aG9zZSBzbG90czogdG90YWwgOSBidXNlcy4KLQkJICovCi0JCW51bV9idXNlcyA9IDk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2luZm8oIlVuc3VwcG9ydGVkIFdpbm5pcGVnIHR5cGUhXG4iKTsKLQkJcmV0dXJuIGxhc3RfYnVzOwotCX0KLQotCWZvciAoYnVzID0gbGFzdF9idXM7IGJ1cyA8IGxhc3RfYnVzICsgbnVtX2J1c2VzOyBidXMrKykKLQkJbXBfYnVzX2lkX3RvX25vZGVbYnVzXSA9IG5vZGU7Ci0JcmV0dXJuIGJ1czsKLX0KLQotc3RhdGljIGludCBidWlsZF9kZXRhaWxfYXJyYXlzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBwdHI7Ci0JaW50IGksIHNjYWxfZGV0YWlsX3NpemUsIHJpb19kZXRhaWxfc2l6ZTsKLQotCWlmIChyaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXYgPiBNQVhfTlVNTk9ERVMpIHsKLQkJcHJfd2FybigiTUFYX05VTU5PREVTIHRvbyBsb3chICBEZWZpbmVkIGFzICVkLCBidXQgc3lzdGVtIGhhcyAlZCBub2Rlc1xuIiwKLQkJCU1BWF9OVU1OT0RFUywgcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3dpdGNoIChyaW9fdGFibGVfaGRyLT52ZXJzaW9uKSB7Ci0JZGVmYXVsdDoKLQkJcHJfd2FybigiSW52YWxpZCBSaW8gR3JhbmRlIFRhYmxlIFZlcnNpb246ICVkXG4iLAotCQkJcmlvX3RhYmxlX2hkci0+dmVyc2lvbik7Ci0JCXJldHVybiAwOwotCWNhc2UgMjoKLQkJc2NhbF9kZXRhaWxfc2l6ZSA9IDExOwotCQlyaW9fZGV0YWlsX3NpemUgPSAxMzsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlzY2FsX2RldGFpbF9zaXplID0gMTI7Ci0JCXJpb19kZXRhaWxfc2l6ZSA9IDE1OwotCQlicmVhazsKLQl9Ci0KLQlwdHIgPSAodW5zaWduZWQgbG9uZylyaW9fdGFibGVfaGRyICsgMzsKLQlmb3IgKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2OyBpKyssIHB0ciArPSBzY2FsX2RldGFpbF9zaXplKQotCQlzY2FsX2RldnNbaV0gPSAoc3RydWN0IHNjYWxfZGV0YWlsICopcHRyOwotCi0JZm9yIChpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyssIHB0ciArPSByaW9fZGV0YWlsX3NpemUpCi0JCXJpb19kZXZzW2ldID0gKHN0cnVjdCByaW9fZGV0YWlsICopcHRyOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgc2V0dXBfc3VtbWl0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZwkJcHRyOwotCXVuc2lnbmVkIHNob3J0CQlvZmZzZXQ7Ci0JaW50CQkJaSwgbmV4dF93cGVnLCBuZXh0X2J1cyA9IDA7Ci0KLQkvKiBUaGUgcG9pbnRlciB0byB0aGUgRUJEQSBpcyBzdG9yZWQgaW4gdGhlIHdvcmQgQCBwaHlzIDB4NDBFKDQwOjBFKSAqLwotCXB0ciA9IGdldF9iaW9zX2ViZGEoKTsKLQlwdHIgPSAodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocHRyKTsKLQotCXJpb190YWJsZV9oZHIgPSBOVUxMOwotCW9mZnNldCA9IDB4MTgwOwotCXdoaWxlIChvZmZzZXQpIHsKLQkJLyogVGhlIGJsb2NrIGlkIGlzIHN0b3JlZCBpbiB0aGUgMm5kIHdvcmQgKi8KLQkJaWYgKCooKHVuc2lnbmVkIHNob3J0ICopKHB0ciArIG9mZnNldCArIDIpKSA9PSAweDQ3NTIpIHsKLQkJCS8qIHNldCB0aGUgcG9pbnRlciBwYXN0IHRoZSBvZmZzZXQgJiBibG9jayBpZCAqLwotCQkJcmlvX3RhYmxlX2hkciA9IChzdHJ1Y3QgcmlvX3RhYmxlX2hkciAqKShwdHIgKyBvZmZzZXQgKyA0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIFRoZSBuZXh0IG9mZnNldCBpcyBzdG9yZWQgaW4gdGhlIDFzdCB3b3JkLiAgMCBtZWFucyBubyBtb3JlICovCi0JCW9mZnNldCA9ICooKHVuc2lnbmVkIHNob3J0ICopKHB0ciArIG9mZnNldCkpOwotCX0KLQlpZiAoIXJpb190YWJsZV9oZHIpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIFJpbyBHcmFuZGUgVGFibGUgaW4gRUJEQSAtIGJhaWxpbmchXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghYnVpbGRfZGV0YWlsX2FycmF5cygpKQotCQlyZXR1cm47Ci0KLQkvKiBUaGUgZmlyc3QgV2lubmlwZWcgd2UncmUgbG9va2luZyBmb3IgaGFzIGFuIGluZGV4IG9mIDAgKi8KLQluZXh0X3dwZWcgPSAwOwotCWRvIHsKLQkJZm9yIChpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyspIHsKLQkJCWlmIChpc19XUEVHKHJpb19kZXZzW2ldKSAmJiByaW9fZGV2c1tpXS0+V1BfaW5kZXggPT0gbmV4dF93cGVnKSB7Ci0JCQkJLyogSXQncyB0aGUgV2lubmlwZWcgd2UncmUgbG9va2luZyBmb3IhICovCi0JCQkJbmV4dF9idXMgPSBzZXR1cF9wY2lfbm9kZV9tYXBfZm9yX3dwZWcoaSwgbmV4dF9idXMpOwotCQkJCW5leHRfd3BlZysrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIElmIHdlIGdvIHRocm91Z2ggYWxsIFJpbyBkZXZpY2VzIGFuZCBkb24ndCBmaW5kIG9uZSB3aXRoCi0JCSAqIHRoZSBuZXh0IGluZGV4LCBpdCBtZWFucyB3ZSd2ZSBmb3VuZCBhbGwgdGhlIFdpbm5pcGVncywKLQkJICogYW5kIHRodXMgYWxsIHRoZSBQQ0kgYnVzZXMuCi0JCSAqLwotCQlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldikKLQkJCW5leHRfd3BlZyA9IDA7Ci0JfSB3aGlsZSAobmV4dF93cGVnICE9IDApOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX3N1bW1pdCA9IHsKLQotCS5uYW1lCQkJCT0gInN1bW1pdCIsCi0JLnByb2JlCQkJCT0gcHJvYmVfc3VtbWl0LAotCS5hY3BpX21hZHRfb2VtX2NoZWNrCQk9IHN1bW1pdF9hY3BpX21hZHRfb2VtX2NoZWNrLAotCS5hcGljX2lkX3ZhbGlkCQkJPSBkZWZhdWx0X2FwaWNfaWRfdmFsaWQsCi0JLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBzdW1taXRfYXBpY19pZF9yZWdpc3RlcmVkLAotCi0JLmlycV9kZWxpdmVyeV9tb2RlCQk9IGRlc3RfTG93ZXN0UHJpbywKLQkvKiBsb2dpY2FsIGRlbGl2ZXJ5IGJyb2FkY2FzdCB0byBhbGwgQ1BVczogKi8KLQkuaXJxX2Rlc3RfbW9kZQkJCT0gMSwKLQotCS50YXJnZXRfY3B1cwkJCT0gc3VtbWl0X3RhcmdldF9jcHVzLAotCS5kaXNhYmxlX2VzcgkJCT0gMSwKLQkuZGVzdF9sb2dpY2FsCQkJPSBBUElDX0RFU1RfTE9HSUNBTCwKLQkuY2hlY2tfYXBpY2lkX3VzZWQJCT0gc3VtbWl0X2NoZWNrX2FwaWNpZF91c2VkLAotCS5jaGVja19hcGljaWRfcHJlc2VudAkJPSBzdW1taXRfY2hlY2tfYXBpY2lkX3ByZXNlbnQsCi0KLQkudmVjdG9yX2FsbG9jYXRpb25fZG9tYWluCT0gZmxhdF92ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4sCi0JLmluaXRfYXBpY19sZHIJCQk9IHN1bW1pdF9pbml0X2FwaWNfbGRyLAotCi0JLmlvYXBpY19waHlzX2lkX21hcAkJPSBzdW1taXRfaW9hcGljX3BoeXNfaWRfbWFwLAotCS5zZXR1cF9hcGljX3JvdXRpbmcJCT0gc3VtbWl0X3NldHVwX2FwaWNfcm91dGluZywKLQkubXVsdGlfdGltZXJfY2hlY2sJCT0gTlVMTCwKLQkuY3B1X3ByZXNlbnRfdG9fYXBpY2lkCQk9IHN1bW1pdF9jcHVfcHJlc2VudF90b19hcGljaWQsCi0JLmFwaWNpZF90b19jcHVfcHJlc2VudAkJPSBzdW1taXRfYXBpY2lkX3RvX2NwdV9wcmVzZW50LAotCS5zZXR1cF9wb3J0aW9fcmVtYXAJCT0gTlVMTCwKLQkuY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudAk9IHN1bW1pdF9jaGVja19waHlzX2FwaWNpZF9wcmVzZW50LAotCS5lbmFibGVfYXBpY19tb2RlCQk9IE5VTEwsCi0JLnBoeXNfcGtnX2lkCQkJPSBzdW1taXRfcGh5c19wa2dfaWQsCi0JLm1wc19vZW1fY2hlY2sJCQk9IHN1bW1pdF9tcHNfb2VtX2NoZWNrLAotCi0JLmdldF9hcGljX2lkCQkJPSBzdW1taXRfZ2V0X2FwaWNfaWQsCi0JLnNldF9hcGljX2lkCQkJPSBOVUxMLAotCS5hcGljX2lkX21hc2sJCQk9IDB4RkYgPDwgMjQsCi0KLQkuY3B1X21hc2tfdG9fYXBpY2lkX2FuZAkJPSBzdW1taXRfY3B1X21hc2tfdG9fYXBpY2lkX2FuZCwKLQotCS5zZW5kX0lQSV9tYXNrCQkJPSBzdW1taXRfc2VuZF9JUElfbWFzaywKLQkuc2VuZF9JUElfbWFza19hbGxidXRzZWxmCT0gTlVMTCwKLQkuc2VuZF9JUElfYWxsYnV0c2VsZgkJPSBzdW1taXRfc2VuZF9JUElfYWxsYnV0c2VsZiwKLQkuc2VuZF9JUElfYWxsCQkJPSBzdW1taXRfc2VuZF9JUElfYWxsLAotCS5zZW5kX0lQSV9zZWxmCQkJPSBkZWZhdWx0X3NlbmRfSVBJX3NlbGYsCi0KLQkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCi0JLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCi0KLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBkZWZhdWx0X3dhaXRfZm9yX2luaXRfZGVhc3NlcnQsCi0KLQkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKLQkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCi0KLQkucmVhZAkJCQk9IG5hdGl2ZV9hcGljX21lbV9yZWFkLAotCS53cml0ZQkJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuZW9pX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmljcl9yZWFkCQkJPSBuYXRpdmVfYXBpY19pY3JfcmVhZCwKLQkuaWNyX3dyaXRlCQkJPSBuYXRpdmVfYXBpY19pY3Jfd3JpdGUsCi0JLndhaXRfaWNyX2lkbGUJCQk9IG5hdGl2ZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0JLnNhZmVfd2FpdF9pY3JfaWRsZQkJPSBuYXRpdmVfc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUsCi0KLQkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gc3VtbWl0X2Vhcmx5X2xvZ2ljYWxfYXBpY2lkLAotfTsKLQotYXBpY19kcml2ZXIoYXBpY19zdW1taXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKaW5kZXggY2FjODVlZS4uZTY2NzY2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAogCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKIAkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAorCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGZhbHNlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IE5VTEwsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19waHlzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jCmluZGV4IGRlMjMxZTMuLjZkNjAwZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19waHlzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAKIAkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCiAJLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gTlVMTCwKKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBmYWxzZSwKIAkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKIAkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBOVUxMLAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwppbmRleCBkMjYzYjEzLi43ODM0Mzg5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKQEAgLTM5Niw3ICszOTYsNyBAQAogCS53YWtldXBfc2Vjb25kYXJ5X2NwdQkJPSB1dl93YWtldXBfc2Vjb25kYXJ5LAogCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKIAkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAorCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGZhbHNlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IE5VTEwsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGM2N2ZmYTYuLmNlOGI4ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJICovCiAJV0FSTl9PTkNFKDEsICJXQVJOSU5HOiBUaGlzIGNvbWJpbmF0aW9uIG9mIEFNRCIKIAkJIiBwcm9jZXNzb3JzIGlzIG5vdCBzdWl0YWJsZSBmb3IgU01QLlxuIik7Ci0JYWRkX3RhaW50KFRBSU5UX1VOU0FGRV9TTVAsIExPQ0tERVBfTk9XX1VOUkVMSUFCTEUpOworCWFkZF90YWludChUQUlOVF9DUFVfT1VUX09GX1NQRUMsIExPQ0tERVBfTk9XX1VOUkVMSUFCTEUpOwogfQogCiBzdGF0aWMgdm9pZCBpbml0X2FtZF9rNyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC0yMzMsOSArMjMzLDcgQEAKIAlpZiAoYy0+eDg2X21vZGVsID49IDYgJiYgYy0+eDg2X21vZGVsIDw9IDEwKSB7CiAJCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9YTU0pKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBkaXNhYmxlZCBLNy9TU0UgU3VwcG9ydC5cbiIpOwotCQkJcmRtc3IoTVNSX0s3X0hXQ1IsIGwsIGgpOwotCQkJbCAmPSB+MHgwMDAwODAwMDsKLQkJCXdybXNyKE1TUl9LN19IV0NSLCBsLCBoKTsKKwkJCW1zcl9jbGVhcl9iaXQoTVNSX0s3X0hXQ1IsIDE1KTsKIAkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1hNTSk7CiAJCX0KIAl9CkBAIC01MDksMTQgKzUwNyw4IEBACiAjZW5kaWYKIAogCS8qIEYxNmggZXJyYXR1bSA3OTMsIENWRS0yMDEzLTY4ODUgKi8KLQlpZiAoYy0+eDg2ID09IDB4MTYgJiYgYy0+eDg2X21vZGVsIDw9IDB4ZikgewotCQl1NjQgdmFsOwotCi0JCXJkbXNybChNU1JfQU1ENjRfTFNfQ0ZHLCB2YWwpOwotCQlpZiAoISh2YWwgJiBCSVQoMTUpKSkKLQkJCXdybXNybChNU1JfQU1ENjRfTFNfQ0ZHLCB2YWwgfCBCSVQoMTUpKTsKLQl9Ci0KKwlpZiAoYy0+eDg2ID09IDB4MTYgJiYgYy0+eDg2X21vZGVsIDw9IDB4ZikKKwkJbXNyX3NldF9iaXQoTVNSX0FNRDY0X0xTX0NGRywgMTUpOwogfQogCiBzdGF0aWMgY29uc3QgaW50IGFtZF9lcnJhdHVtXzM4M1tdOwpAQCAtNTM2LDExICs1MjgsOCBAQAogCSAqIEVycmF0YSA2MyBmb3IgU0gtQjMgc3RlcHBpbmdzCiAJICogRXJyYXRhIDEyMiBmb3IgYWxsIHN0ZXBwaW5ncyAoRisgaGF2ZSBpdCBkaXNhYmxlZCBieSBkZWZhdWx0KQogCSAqLwotCWlmIChjLT54ODYgPT0gMHhmKSB7Ci0JCXJkbXNybChNU1JfSzdfSFdDUiwgdmFsdWUpOwotCQl2YWx1ZSB8PSAxIDw8IDY7Ci0JCXdybXNybChNU1JfSzdfSFdDUiwgdmFsdWUpOwotCX0KKwlpZiAoYy0+eDg2ID09IDB4ZikKKwkJbXNyX3NldF9iaXQoTVNSX0s3X0hXQ1IsIDYpOwogI2VuZGlmCiAKIAllYXJseV9pbml0X2FtZChjKTsKQEAgLTYyMywxNCArNjEyLDExIEBACiAJICAgIChjLT54ODZfbW9kZWwgPj0gMHgxMCkgJiYgKGMtPng4Nl9tb2RlbCA8PSAweDFmKSAmJgogCSAgICAhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9UT1BPRVhUKSkgewogCi0JCWlmICghcmRtc3JsX3NhZmUoMHhjMDAxMTAwNSwgJnZhbHVlKSkgewotCQkJdmFsdWUgfD0gMVVMTCA8PCA1NDsKLQkJCXdybXNybF9zYWZlKDB4YzAwMTEwMDUsIHZhbHVlKTsKKwkJaWYgKG1zcl9zZXRfYml0KDB4YzAwMTEwMDUsIDU0KSA+IDApIHsKIAkJCXJkbXNybCgweGMwMDExMDA1LCB2YWx1ZSk7Ci0JCQlpZiAodmFsdWUgJiAoMVVMTCA8PCA1NCkpIHsKKwkJCWlmICh2YWx1ZSAmIEJJVF82NCg1NCkpIHsKIAkJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9UT1BPRVhUKTsKLQkJCQlwcmludGsoS0VSTl9JTkZPIEZXX0lORk8gIkNQVTogUmUtZW5hYmxpbmcgIgotCQkJCSAgImRpc2FibGVkIFRvcG9sb2d5IEV4dGVuc2lvbnMgU3VwcG9ydFxuIik7CisJCQkJcHJfaW5mbyhGV19JTkZPICJDUFU6IFJlLWVuYWJsaW5nIGRpc2FibGVkIFRvcG9sb2d5IEV4dGVuc2lvbnMgU3VwcG9ydC5cbiIpOwogCQkJfQogCQl9CiAJfQpAQCAtNzA5LDE5ICs2OTUsMTIgQEAKIAkJICogRGlzYWJsZSBHQVJUIFRMQiBXYWxrIEVycm9ycyBvbiBGYW0xMGguIFdlIGRvIHRoaXMgaGVyZQogCQkgKiBiZWNhdXNlIHRoaXMgaXMgYWx3YXlzIG5lZWRlZCB3aGVuIEdBUlQgaXMgZW5hYmxlZCwgZXZlbiBpbiBhCiAJCSAqIGtlcm5lbCB3aGljaCBoYXMgbm8gTUNFIHN1cHBvcnQgYnVpbHQgaW4uCi0JCSAqIEJJT1Mgc2hvdWxkIGRpc2FibGUgR2FydFRsYldsayBFcnJvcnMgdGhlbXNlbGYuIElmCi0JCSAqIGl0IGRvZXNuJ3QgZG8gaXQgaGVyZSBhcyBzdWdnZXN0ZWQgYnkgdGhlIEJLREcuCisJCSAqIEJJT1Mgc2hvdWxkIGRpc2FibGUgR2FydFRsYldsayBFcnJvcnMgYWxyZWFkeS4gSWYKKwkJICogaXQgZG9lc24ndCwgZG8gaXQgaGVyZSBhcyBzdWdnZXN0ZWQgYnkgdGhlIEJLREcuCiAJCSAqCiAJCSAqIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTMzMDEyCiAJCSAqLwotCQl1NjQgbWFzazsKLQkJaW50IGVycjsKLQotCQllcnIgPSByZG1zcmxfc2FmZShNU1JfQU1ENjRfTUN4X01BU0soNCksICZtYXNrKTsKLQkJaWYgKGVyciA9PSAwKSB7Ci0JCQltYXNrIHw9ICgxIDw8IDEwKTsKLQkJCXdybXNybF9zYWZlKE1TUl9BTUQ2NF9NQ3hfTUFTSyg0KSwgbWFzayk7Ci0JCX0KKwkJbXNyX3NldF9iaXQoTVNSX0FNRDY0X01DeF9NQVNLKDQpLCAxMCk7CiAKIAkJLyoKIAkJICogT24gZmFtaWx5IDEwaCBCSU9TIG1heSBub3QgaGF2ZSBwcm9wZXJseSBlbmFibGVkIFdDKyBzdXBwb3J0LApAQCAtNzMzLDEwICs3MTIsNyBAQAogCQkgKiBOT1RFOiB3ZSB3YW50IHRvIHVzZSB0aGUgX3NhZmUgYWNjZXNzb3JzIHNvIGFzIG5vdCB0byAjR1Aga3ZtCiAJCSAqIGd1ZXN0cyBvbiBvbGRlciBrdm0gaG9zdHMuCiAJCSAqLwotCi0JCXJkbXNybF9zYWZlKE1TUl9BTUQ2NF9CVV9DRkcyLCAmdmFsdWUpOwotCQl2YWx1ZSAmPSB+KDFVTEwgPDwgMjQpOwotCQl3cm1zcmxfc2FmZShNU1JfQU1ENjRfQlVfQ0ZHMiwgdmFsdWUpOworCQltc3JfY2xlYXJfYml0KE1TUl9BTUQ2NF9CVV9DRkcyLCAyNCk7CiAKIAkJaWYgKGNwdV9oYXNfYW1kX2VycmF0dW0oYywgYW1kX2VycmF0dW1fMzgzKSkKIAkJCXNldF9jcHVfYnVnKGMsIFg4Nl9CVUdfQU1EX1RMQl9NTUFUQ0gpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggOGUyOGJmMi4uYTEzNTIzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC0xMDI1LDcgKzEwMjUsOCBAQAogCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2NsZmx1c2goY2hhciAqYXJnKQogewotCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfQ0xGTFNIKTsKKwlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX0NMRkxVU0gpOworCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfQ0xGTFVTSE9QVCk7CiAJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJub2NsZmx1c2giLCBzZXR1cF9ub2NsZmx1c2gpOwpAQCAtMTA3OCw2ICsxMDc5LDEwIEBACiB9CiBfX3NldHVwKCJjbGVhcmNwdWlkPSIsIHNldHVwX2Rpc2FibGVjcHVpZCk7CiAKK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGtlcm5lbF9zdGFjaykgPQorCSh1bnNpZ25lZCBsb25nKSZpbml0X3RocmVhZF91bmlvbiAtIEtFUk5FTF9TVEFDS19PRkZTRVQgKyBUSFJFQURfU0laRTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChrZXJuZWxfc3RhY2spOworCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjciA9IHsgTlJfVkVDVE9SUyAqIDE2IC0gMSwgKHVuc2lnbmVkIGxvbmcpIGlkdF90YWJsZSB9Owogc3RydWN0IGRlc2NfcHRyIGRlYnVnX2lkdF9kZXNjciA9IHsgTlJfVkVDVE9SUyAqIDE2IC0gMSwKQEAgLTEwOTQsMTAgKzEwOTksNiBAQAogCSZpbml0X3Rhc2s7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3VycmVudF90YXNrKTsKIAotREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywga2VybmVsX3N0YWNrKSA9Ci0JKHVuc2lnbmVkIGxvbmcpJmluaXRfdGhyZWFkX3VuaW9uIC0gS0VSTkVMX1NUQUNLX09GRlNFVCArIFRIUkVBRF9TSVpFOwotRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGtlcm5lbF9zdGFjayk7Ci0KIERFRklORV9QRVJfQ1BVKGNoYXIgKiwgaXJxX3N0YWNrX3B0cikgPQogCWluaXRfcGVyX2NwdV92YXIoaXJxX3N0YWNrX3VuaW9uLmlycV9zdGFjaykgKyBJUlFfU1RBQ0tfU0laRSAtIDY0OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKaW5kZXggNWNkOWJmYS4uYTgwMDI5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwpAQCAtMzEsMTEgKzMxLDggQEAKIAogCS8qIFVubWFzayBDUFVJRCBsZXZlbHMgaWYgbWFza2VkOiAqLwogCWlmIChjLT54ODYgPiA2IHx8IChjLT54ODYgPT0gNiAmJiBjLT54ODZfbW9kZWwgPj0gMHhkKSkgewotCQlyZG1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKLQotCQlpZiAobWlzY19lbmFibGUgJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MSU1JVF9DUFVJRCkgewotCQkJbWlzY19lbmFibGUgJj0gfk1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlEOwotCQkJd3Jtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSk7CisJCWlmIChtc3JfY2xlYXJfYml0KE1TUl9JQTMyX01JU0NfRU5BQkxFLAorCQkJCSAgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTElNSVRfQ1BVSURfQklUKSA+IDApIHsKIAkJCWMtPmNwdWlkX2xldmVsID0gY3B1aWRfZWF4KDApOwogCQkJZ2V0X2NwdV9jYXAoYyk7CiAJCX0KQEAgLTEyOSwxNiArMTI2LDEwIEBACiAJICogSW5nbyBNb2xuYXIgcmVwb3J0ZWQgYSBQZW50aXVtIEQgKG1vZGVsIDYpIGFuZCBhIFhlb24KIAkgKiAobW9kZWwgMikgd2l0aCB0aGUgc2FtZSBwcm9ibGVtLgogCSAqLwotCWlmIChjLT54ODYgPT0gMTUpIHsKLQkJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSk7Ci0KLQkJaWYgKG1pc2NfZW5hYmxlICYgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkFTVF9TVFJJTkcpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImttZW1jaGVjazogRGlzYWJsaW5nIGZhc3Qgc3RyaW5nIG9wZXJhdGlvbnNcbiIpOwotCi0JCQltaXNjX2VuYWJsZSAmPSB+TVNSX0lBMzJfTUlTQ19FTkFCTEVfRkFTVF9TVFJJTkc7Ci0JCQl3cm1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKLQkJfQotCX0KKwlpZiAoYy0+eDg2ID09IDE1KQorCQlpZiAobXNyX2NsZWFyX2JpdChNU1JfSUEzMl9NSVNDX0VOQUJMRSwKKwkJCQkgIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HX0JJVCkgPiAwKQorCQkJcHJfaW5mbygia21lbWNoZWNrOiBEaXNhYmxpbmcgZmFzdCBzdHJpbmcgb3BlcmF0aW9uc1xuIik7CiAjZW5kaWYKIAogCS8qCkBAIC0xOTUsMTAgKzE4NiwxNiBAQAogCX0KIH0KIAorc3RhdGljIGludCBmb3JjZXBhZTsKK3N0YXRpYyBpbnQgX19pbml0IGZvcmNlcGFlX3NldHVwKGNoYXIgKl9fdW51c2VkKQoreworCWZvcmNlcGFlID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImZvcmNlcGFlIiwgZm9yY2VwYWVfc2V0dXApOworCiBzdGF0aWMgdm9pZCBpbnRlbF93b3JrYXJvdW5kcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0JdW5zaWduZWQgbG9uZyBsbywgaGk7Ci0KICNpZmRlZiBDT05GSUdfWDg2X0YwMEZfQlVHCiAJLyoKIAkgKiBBbGwgY3VycmVudCBtb2RlbHMgb2YgUGVudGl1bSBhbmQgUGVudGl1bSB3aXRoIE1NWCB0ZWNobm9sb2d5IENQVXMKQEAgLTIyNSwxNiArMjIyLDI2IEBACiAJCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfU0VQKTsKIAogCS8qCisJICogUEFFIENQVUlEIGlzc3VlOiBtYW55IFBlbnRpdW0gTSByZXBvcnQgbm8gUEFFIGJ1dCBtYXkgaGF2ZSBhCisJICogZnVuY3Rpb25hbGx5IHVzYWJsZSBQQUUgaW1wbGVtZW50YXRpb24uCisJICogRm9yY2VmdWxseSBlbmFibGUgUEFFIGlmIGtlcm5lbCBwYXJhbWV0ZXIgImZvcmNlcGFlIiBpcyBwcmVzZW50LgorCSAqLworCWlmIChmb3JjZXBhZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQUUgZm9yY2VkIVxuIik7CisJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BBRSk7CisJCWFkZF90YWludChUQUlOVF9DUFVfT1VUX09GX1NQRUMsIExPQ0tERVBfTk9XX1VOUkVMSUFCTEUpOworCX0KKworCS8qCiAJICogUDQgWGVvbiBlcnJhdGEgMDM3IHdvcmthcm91bmQuCiAJICogSGFyZHdhcmUgcHJlZmV0Y2hlciBtYXkgY2F1c2Ugc3RhbGUgZGF0YSB0byBiZSBsb2FkZWQgaW50byB0aGUgY2FjaGUuCiAJICovCiAJaWYgKChjLT54ODYgPT0gMTUpICYmIChjLT54ODZfbW9kZWwgPT0gMSkgJiYgKGMtPng4Nl9tYXNrID09IDEpKSB7Ci0JCXJkbXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsbywgaGkpOwotCQlpZiAoKGxvICYgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUFJFRkVUQ0hfRElTQUJMRSkgPT0gMCkgewotCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogQzAgc3RlcHBpbmcgUDQgWGVvbiBkZXRlY3RlZC5cbiIpOwotCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogRGlzYWJsaW5nIGhhcmR3YXJlIHByZWZldGNoaW5nIChFcnJhdGEgMDM3KVxuIik7Ci0JCQlsbyB8PSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFOwotCQkJd3Jtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvLCBoaSk7CisJCWlmIChtc3Jfc2V0X2JpdChNU1JfSUEzMl9NSVNDX0VOQUJMRSwKKwkJCQlNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFX0JJVCkKKwkJICAgID4gMCkgeworCQkJcHJfaW5mbygiQ1BVOiBDMCBzdGVwcGluZyBQNCBYZW9uIGRldGVjdGVkLlxuIik7CisJCQlwcl9pbmZvKCJDUFU6IERpc2FibGluZyBoYXJkd2FyZSBwcmVmZXRjaGluZyAoRXJyYXRhIDAzNylcbiIpOwogCQl9CiAJfQogCkBAIC0yNjcsMTAgKzI3NCw2IEBACiAJfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0JbnVtYXFfdHNjX2Rpc2FibGUoKTsKLSNlbmRpZgotCiAJaW50ZWxfc21wX2NoZWNrKGMpOwogfQogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWF0Y2guYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWF0Y2guYwppbmRleCAzNjU2NTM3Li5hZmE5ZjBkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21hdGNoLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tYXRjaC5jCkBAIC00Nyw0NSArNDcsMyBAQAogCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTCh4ODZfbWF0Y2hfY3B1KTsKLQotc3NpemVfdCBhcmNoX3ByaW50X2NwdV9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmcHRyKQotewotCWludCBzaXplID0gUEFHRV9TSVpFOwotCWludCBpLCBuOwotCWNoYXIgKmJ1ZiA9IGJ1ZnB0cjsKLQotCW4gPSBzbnByaW50ZihidWYsIHNpemUsICJ4ODZjcHU6dmVuZG9yOiUwNFg6ZmFtaWx5OiUwNFg6IgotCQkgICAgICJtb2RlbDolMDRYOmZlYXR1cmU6IiwKLQkJYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yLAotCQlib290X2NwdV9kYXRhLng4NiwKLQkJYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwpOwotCXNpemUgLT0gbjsKLQlidWYgKz0gbjsKLQlzaXplIC09IDE7Ci0JZm9yIChpID0gMDsgaSA8IE5DQVBJTlRTKjMyOyBpKyspIHsKLQkJaWYgKGJvb3RfY3B1X2hhcyhpKSkgewotCQkJbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiwlMDRYIiwgaSk7Ci0JCQlpZiAobiA+PSBzaXplKSB7Ci0JCQkJV0FSTigxLCAieDg2IGZlYXR1cmVzIG92ZXJmbG93IHBhZ2VcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2l6ZSAtPSBuOwotCQkJYnVmICs9IG47Ci0JCX0KLQl9Ci0JKmJ1ZisrID0gJ1xuJzsKLQlyZXR1cm4gYnVmIC0gYnVmcHRyOwotfQotCi1pbnQgYXJjaF9jcHVfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQotewotCWNoYXIgKmJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmKSB7Ci0JCWFyY2hfcHJpbnRfY3B1X21vZGFsaWFzKE5VTEwsIE5VTEwsIGJ1Zik7Ci0JCWFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSVzIiwgYnVmKTsKLQkJa2ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKaW5kZXggOWY3Y2EyNi4uNzZmOThmZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CkBAIC0yNiwxMCArMjcsNTAgQEAKICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgogCiBzdHJ1Y3QgbXNfaHlwZXJ2X2luZm8gbXNfaHlwZXJ2OwogRVhQT1JUX1NZTUJPTF9HUEwobXNfaHlwZXJ2KTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0hZUEVSVikKK3N0YXRpYyB2b2lkICgqdm1idXNfaGFuZGxlcikodm9pZCk7CisKK3ZvaWQgaHlwZXJ2X3ZlY3Rvcl9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKworCWlycV9lbnRlcigpOworCWV4aXRfaWRsZSgpOworCisJaW5jX2lycV9zdGF0KGlycV9odl9jYWxsYmFja19jb3VudCk7CisJaWYgKHZtYnVzX2hhbmRsZXIpCisJCXZtYnVzX2hhbmRsZXIoKTsKKworCWlycV9leGl0KCk7CisJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKK30KKwordm9pZCBodl9zZXR1cF92bWJ1c19pcnEodm9pZCAoKmhhbmRsZXIpKHZvaWQpKQoreworCXZtYnVzX2hhbmRsZXIgPSBoYW5kbGVyOworCS8qCisJICogU2V0dXAgdGhlIElEVCBmb3IgaHlwZXJ2aXNvciBjYWxsYmFjay4gUHJldmVudCByZWFsbG9jYXRpb24KKwkgKiBhdCBtb2R1bGUgcmVsb2FkLgorCSAqLworCWlmICghdGVzdF9iaXQoSFlQRVJWSVNPUl9DQUxMQkFDS19WRUNUT1IsIHVzZWRfdmVjdG9ycykpCisJCWFsbG9jX2ludHJfZ2F0ZShIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwKKwkJCQloeXBlcnZfY2FsbGJhY2tfdmVjdG9yKTsKK30KKwordm9pZCBodl9yZW1vdmVfdm1idXNfaXJxKHZvaWQpCit7CisJLyogV2UgaGF2ZSBubyB3YXkgdG8gZGVhbGxvY2F0ZSB0aGUgaW50ZXJydXB0IGdhdGUgKi8KKwl2bWJ1c19oYW5kbGVyID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGh2X3NldHVwX3ZtYnVzX2lycSk7CitFWFBPUlRfU1lNQk9MX0dQTChodl9yZW1vdmVfdm1idXNfaXJxKTsKKyNlbmRpZgorCiBzdGF0aWMgdWludDMyX3QgIF9faW5pdCBtc19oeXBlcnZfcGxhdGZvcm0odm9pZCkKIHsKIAl1MzIgZWF4OwpAQCAtMTA1LDYgKzE0NiwxMSBAQAogCiAJaWYgKG1zX2h5cGVydi5mZWF0dXJlcyAmIEhWX1g2NF9NU1JfVElNRV9SRUZfQ09VTlRfQVZBSUxBQkxFKQogCQljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmaHlwZXJ2X2NzLCBOU0VDX1BFUl9TRUMvMTAwKTsKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCW5vX3RpbWVyX2NoZWNrID0gMTsKKyNlbmRpZgorCiB9CiAKIGNvbnN0IF9fcmVmY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2IHg4Nl9oeXBlcl9tc19oeXBlcnYgPSB7CkBAIC0xMTMsNDEgKzE1OSwzIEBACiAJLmluaXRfcGxhdGZvcm0JCT0gbXNfaHlwZXJ2X2luaXRfcGxhdGZvcm0sCiB9OwogRVhQT1JUX1NZTUJPTCh4ODZfaHlwZXJfbXNfaHlwZXJ2KTsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0hZUEVSVikKLXN0YXRpYyBpbnQgdm1idXNfaXJxID0gLTE7Ci1zdGF0aWMgaXJxX2hhbmRsZXJfdCB2bWJ1c19pc3I7Ci0KLXZvaWQgaHZfcmVnaXN0ZXJfdm1idXNfaGFuZGxlcihpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIpCi17Ci0JLyoKLQkgKiBTZXR1cCB0aGUgSURUIGZvciBoeXBlcnZpc29yIGNhbGxiYWNrLgotCSAqLwotCWFsbG9jX2ludHJfZ2F0ZShIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwgaHlwZXJ2X2NhbGxiYWNrX3ZlY3Rvcik7Ci0KLQl2bWJ1c19pcnEgPSBpcnE7Ci0Jdm1idXNfaXNyID0gaGFuZGxlcjsKLX0KLQotdm9pZCBoeXBlcnZfdmVjdG9yX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQotCWlycV9lbnRlcigpOwotCWV4aXRfaWRsZSgpOwotCi0JZGVzYyA9IGlycV90b19kZXNjKHZtYnVzX2lycSk7Ci0KLQlpZiAoZGVzYykKLQkJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2Modm1idXNfaXJxLCBkZXNjKTsKLQotCWlycV9leGl0KCk7Ci0Jc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKLX0KLSNlbHNlCi12b2lkIGh2X3JlZ2lzdGVyX3ZtYnVzX2hhbmRsZXIoaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKQotewotfQotI2VuZGlmCi1FWFBPUlRfU1lNQk9MX0dQTChodl9yZWdpc3Rlcl92bWJ1c19oYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKaW5kZXggNzlmOWY4NC4uYWU0MDdmNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKQEAgLTg5Miw3ICs4OTIsNiBAQAogCQkgKiBod19wZXJmX2dyb3VwX3NjaGVkX2luKCkgb3IgeDg2X3BtdV9lbmFibGUoKQogCQkgKgogCQkgKiBzdGVwMTogc2F2ZSBldmVudHMgbW92aW5nIHRvIG5ldyBjb3VudGVycwotCQkgKiBzdGVwMjogcmVwcm9ncmFtIG1vdmVkIGV2ZW50cyBpbnRvIG5ldyBjb3VudGVycwogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IG5fcnVubmluZzsgaSsrKSB7CiAJCQlldmVudCA9IGNwdWMtPmV2ZW50X2xpc3RbaV07CkBAIC05MTgsNiArOTE3LDkgQEAKIAkJCXg4Nl9wbXVfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwogCQl9CiAKKwkJLyoKKwkJICogc3RlcDI6IHJlcHJvZ3JhbSBtb3ZlZCBldmVudHMgaW50byBuZXcgY291bnRlcnMKKwkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBjcHVjLT5uX2V2ZW50czsgaSsrKSB7CiAJCQlldmVudCA9IGNwdWMtPmV2ZW50X2xpc3RbaV07CiAJCQlod2MgPSAmZXZlbnQtPmh3OwpAQCAtMTA0Myw3ICsxMDQ1LDcgQEAKIAkvKgogCSAqIElmIGdyb3VwIGV2ZW50cyBzY2hlZHVsaW5nIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLAogCSAqIHNraXAgdGhlIHNjaGVkdWxhYmlsaXR5IHRlc3QgaGVyZSwgaXQgd2lsbCBiZSBwZXJmb3JtZWQKLQkgKiBhdCBjb21taXQgdGltZSAoLT5jb21taXRfdHhuKSBhcyBhIHdob2xlCisJICogYXQgY29tbWl0IHRpbWUgKC0+Y29tbWl0X3R4bikgYXMgYSB3aG9sZS4KIAkgKi8KIAlpZiAoY3B1Yy0+Z3JvdXBfZmxhZyAmIFBFUkZfRVZFTlRfVFhOKQogCQlnb3RvIGRvbmVfY29sbGVjdDsKQEAgLTEwNTgsNiArMTA2MCwxMCBAQAogCW1lbWNweShjcHVjLT5hc3NpZ24sIGFzc2lnbiwgbipzaXplb2YoaW50KSk7CiAKIGRvbmVfY29sbGVjdDoKKwkvKgorCSAqIENvbW1pdCB0aGUgY29sbGVjdF9ldmVudHMoKSBzdGF0ZS4gU2VlIHg4Nl9wbXVfZGVsKCkgYW5kCisJICogeDg2X3BtdV8qX3R4bigpLgorCSAqLwogCWNwdWMtPm5fZXZlbnRzID0gbjsKIAljcHVjLT5uX2FkZGVkICs9IG4gLSBuMDsKIAljcHVjLT5uX3R4biArPSBuIC0gbjA7CkBAIC0xMTgzLDI4ICsxMTg5LDM4IEBACiAJICogSWYgd2UncmUgY2FsbGVkIGR1cmluZyBhIHR4biwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KIAkgKiBUaGUgZXZlbnRzIG5ldmVyIGdvdCBzY2hlZHVsZWQgYW5kIC0+Y2FuY2VsX3R4biB3aWxsIHRydW5jYXRlCiAJICogdGhlIGV2ZW50X2xpc3QuCisJICoKKwkgKiBYWFggYXNzdW1lcyBhbnkgLT5kZWwoKSBjYWxsZWQgZHVyaW5nIGEgVFhOIHdpbGwgb25seSBiZSBvbgorCSAqIGFuIGV2ZW50IGFkZGVkIGR1cmluZyB0aGF0IHNhbWUgVFhOLgogCSAqLwogCWlmIChjcHVjLT5ncm91cF9mbGFnICYgUEVSRl9FVkVOVF9UWE4pCiAJCXJldHVybjsKIAorCS8qCisJICogTm90IGEgVFhOLCB0aGVyZWZvcmUgY2xlYW51cCBwcm9wZXJseS4KKwkgKi8KIAl4ODZfcG11X3N0b3AoZXZlbnQsIFBFUkZfRUZfVVBEQVRFKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjcHVjLT5uX2V2ZW50czsgaSsrKSB7Ci0JCWlmIChldmVudCA9PSBjcHVjLT5ldmVudF9saXN0W2ldKSB7Ci0KLQkJCWlmIChpID49IGNwdWMtPm5fZXZlbnRzIC0gY3B1Yy0+bl9hZGRlZCkKLQkJCQktLWNwdWMtPm5fYWRkZWQ7Ci0KLQkJCWlmICh4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cykKLQkJCQl4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cyhjcHVjLCBldmVudCk7Ci0KLQkJCXdoaWxlICgrK2kgPCBjcHVjLT5uX2V2ZW50cykKLQkJCQljcHVjLT5ldmVudF9saXN0W2ktMV0gPSBjcHVjLT5ldmVudF9saXN0W2ldOwotCi0JCQktLWNwdWMtPm5fZXZlbnRzOworCQlpZiAoZXZlbnQgPT0gY3B1Yy0+ZXZlbnRfbGlzdFtpXSkKIAkJCWJyZWFrOwotCQl9CiAJfQorCisJaWYgKFdBUk5fT05fT05DRShpID09IGNwdWMtPm5fZXZlbnRzKSkgLyogY2FsbGVkIC0+ZGVsKCkgd2l0aG91dCAtPmFkZCgpID8gKi8KKwkJcmV0dXJuOworCisJLyogSWYgd2UgaGF2ZSBhIG5ld2x5IGFkZGVkIGV2ZW50OyBtYWtlIHN1cmUgdG8gZGVjcmVhc2Ugbl9hZGRlZC4gKi8KKwlpZiAoaSA+PSBjcHVjLT5uX2V2ZW50cyAtIGNwdWMtPm5fYWRkZWQpCisJCS0tY3B1Yy0+bl9hZGRlZDsKKworCWlmICh4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cykKKwkJeDg2X3BtdS5wdXRfZXZlbnRfY29uc3RyYWludHMoY3B1YywgZXZlbnQpOworCisJLyogRGVsZXRlIHRoZSBhcnJheSBlbnRyeS4gKi8KKwl3aGlsZSAoKytpIDwgY3B1Yy0+bl9ldmVudHMpCisJCWNwdWMtPmV2ZW50X2xpc3RbaS0xXSA9IGNwdWMtPmV2ZW50X2xpc3RbaV07CisJLS1jcHVjLT5uX2V2ZW50czsKKwogCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIH0KIApAQCAtMTU5OCw3ICsxNjE0LDggQEAKIHsKIAlfX3RoaXNfY3B1X2FuZChjcHVfaHdfZXZlbnRzLmdyb3VwX2ZsYWcsIH5QRVJGX0VWRU5UX1RYTik7CiAJLyoKLQkgKiBUcnVuY2F0ZSB0aGUgY29sbGVjdGVkIGV2ZW50cy4KKwkgKiBUcnVuY2F0ZSBjb2xsZWN0ZWQgYXJyYXkgYnkgdGhlIG51bWJlciBvZiBldmVudHMgYWRkZWQgaW4gdGhpcworCSAqIHRyYW5zYWN0aW9uLiBTZWUgeDg2X3BtdV9hZGQoKSBhbmQgeDg2X3BtdV8qX3R4bigpLgogCSAqLwogCV9fdGhpc19jcHVfc3ViKGNwdV9od19ldmVudHMubl9hZGRlZCwgX190aGlzX2NwdV9yZWFkKGNwdV9od19ldmVudHMubl90eG4pKTsKIAlfX3RoaXNfY3B1X3N1YihjcHVfaHdfZXZlbnRzLm5fZXZlbnRzLCBfX3RoaXNfY3B1X3JlYWQoY3B1X2h3X2V2ZW50cy5uX3R4bikpOwpAQCAtMTYwOSw2ICsxNjI2LDggQEAKICAqIENvbW1pdCBncm91cCBldmVudHMgc2NoZWR1bGluZyB0cmFuc2FjdGlvbgogICogUGVyZm9ybSB0aGUgZ3JvdXAgc2NoZWR1bGFiaWxpdHkgdGVzdCBhcyBhIHdob2xlCiAgKiBSZXR1cm4gMCBpZiBzdWNjZXNzCisgKgorICogRG9lcyBub3QgY2FuY2VsIHRoZSB0cmFuc2FjdGlvbiBvbiBmYWlsdXJlOyBleHBlY3RzIHRoZSBjYWxsZXIgdG8gZG8gdGhpcy4KICAqLwogc3RhdGljIGludCB4ODZfcG11X2NvbW1pdF90eG4oc3RydWN0IHBtdSAqcG11KQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuaAppbmRleCA0OTcyYzI0Li4zYjJmOWJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuaApAQCAtMTMwLDkgKzEzMCwxMSBAQAogCXVuc2lnbmVkIGxvbmcJCXJ1bm5pbmdbQklUU19UT19MT05HUyhYODZfUE1DX0lEWF9NQVgpXTsKIAlpbnQJCQllbmFibGVkOwogCi0JaW50CQkJbl9ldmVudHM7Ci0JaW50CQkJbl9hZGRlZDsKLQlpbnQJCQluX3R4bjsKKwlpbnQJCQluX2V2ZW50czsgLyogdGhlICMgb2YgZXZlbnRzIGluIHRoZSBiZWxvdyBhcnJheXMgKi8KKwlpbnQJCQluX2FkZGVkOyAgLyogdGhlICMgbGFzdCBldmVudHMgaW4gdGhlIGJlbG93IGFycmF5czsKKwkJCQkJICAgICB0aGV5J3ZlIG5ldmVyIGJlZW4gZW5hYmxlZCB5ZXQgKi8KKwlpbnQJCQluX3R4bjsgICAgLyogdGhlICMgbGFzdCBldmVudHMgaW4gdGhlIGJlbG93IGFycmF5czsKKwkJCQkJICAgICBhZGRlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwogCWludAkJCWFzc2lnbltYODZfUE1DX0lEWF9NQVhdOyAvKiBldmVudCB0byBjb3VudGVyIGFzc2lnbm1lbnQgKi8KIAl1NjQJCQl0YWdzW1g4Nl9QTUNfSURYX01BWF07CiAJc3RydWN0IHBlcmZfZXZlbnQJKmV2ZW50X2xpc3RbWDg2X1BNQ19JRFhfTUFYXTsgLyogaW4gZW5hYmxlZCBvcmRlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3VuY29yZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3VuY29yZS5jCmluZGV4IDA0N2Y1NDAuLmJkMjI1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLmMKQEAgLTY2LDYgKzY2LDQ3IEBACiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKG1hc2swLCBtYXNrMCwgImNvbmZpZzI6MC0zMSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihtYXNrMSwgbWFzazEsICJjb25maWcyOjMyLTYzIik7CiAKK3N0YXRpYyB2b2lkIHVuY29yZV9wbXVfc3RhcnRfaHJ0aW1lcihzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KTsKK3N0YXRpYyB2b2lkIHVuY29yZV9wbXVfY2FuY2VsX2hydGltZXIoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCk7CitzdGF0aWMgdm9pZCB1bmNvcmVfcGVyZl9ldmVudF91cGRhdGUoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKK3N0YXRpYyB2b2lkIHVuY29yZV9wbXVfZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9wbXUgKnVuY29yZV9ldmVudF90b19wbXUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBjb250YWluZXJfb2YoZXZlbnQtPnBtdSwgc3RydWN0IGludGVsX3VuY29yZV9wbXUsIHBtdSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqCit1bmNvcmVfcG11X3RvX2JveChzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSAqcG11LCBpbnQgY3B1KQoreworCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3g7CisKKwlib3ggPSAqcGVyX2NwdV9wdHIocG11LT5ib3gsIGNwdSk7CisJaWYgKGJveCkKKwkJcmV0dXJuIGJveDsKKworCXJhd19zcGluX2xvY2soJnVuY29yZV9ib3hfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShib3gsICZwbXUtPmJveF9saXN0LCBsaXN0KSB7CisJCWlmIChib3gtPnBoeXNfaWQgPT0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpKSB7CisJCQlhdG9taWNfaW5jKCZib3gtPnJlZmNudCk7CisJCQkqcGVyX2NwdV9wdHIocG11LT5ib3gsIGNwdSkgPSBib3g7CisJCQlicmVhazsKKwkJfQorCX0KKwlyYXdfc3Bpbl91bmxvY2soJnVuY29yZV9ib3hfbG9jayk7CisKKwlyZXR1cm4gKnBlcl9jcHVfcHRyKHBtdS0+Ym94LCBjcHUpOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9ib3ggKnVuY29yZV9ldmVudF90b19ib3goc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCS8qCisJICogcGVyZiBjb3JlIHNjaGVkdWxlcyBldmVudCBvbiB0aGUgYmFzaXMgb2YgY3B1LCB1bmNvcmUgZXZlbnRzIGFyZQorCSAqIGNvbGxlY3RlZCBieSBvbmUgb2YgdGhlIGNwdXMgaW5zaWRlIGEgcGh5c2ljYWwgcGFja2FnZS4KKwkgKi8KKwlyZXR1cm4gdW5jb3JlX3BtdV90b19ib3godW5jb3JlX2V2ZW50X3RvX3BtdShldmVudCksIHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CisKIHN0YXRpYyB1NjQgdW5jb3JlX21zcl9yZWFkX2NvdW50ZXIoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXU2NCBjb3VudDsKQEAgLTE2MzksNiArMTY4MCwzNDkgQEAKIAkmc25iX3VuY29yZV9jYm94LAogCU5VTEwsCiB9OworCitlbnVtIHsKKwlTTkJfUENJX1VOQ09SRV9JTUMsCit9OworCitzdGF0aWMgc3RydWN0IHVuY29yZV9ldmVudF9kZXNjIHNuYl91bmNvcmVfaW1jX2V2ZW50c1tdID0geworCUlOVEVMX1VOQ09SRV9FVkVOVF9ERVNDKGRhdGFfcmVhZHMsICAiZXZlbnQ9MHgwMSIpLAorCUlOVEVMX1VOQ09SRV9FVkVOVF9ERVNDKGRhdGFfcmVhZHMuc2NhbGUsICI2LjEwMzUxNTYyNWUtNSIpLAorCUlOVEVMX1VOQ09SRV9FVkVOVF9ERVNDKGRhdGFfcmVhZHMudW5pdCwgIk1pQiIpLAorCisJSU5URUxfVU5DT1JFX0VWRU5UX0RFU0MoZGF0YV93cml0ZXMsICJldmVudD0weDAyIiksCisJSU5URUxfVU5DT1JFX0VWRU5UX0RFU0MoZGF0YV93cml0ZXMuc2NhbGUsICI2LjEwMzUxNTYyNWUtNSIpLAorCUlOVEVMX1VOQ09SRV9FVkVOVF9ERVNDKGRhdGFfd3JpdGVzLnVuaXQsICJNaUIiKSwKKworCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0sCit9OworCisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19FVkVOVF9NQVNLCQkweGZmCisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19CQVJfT0ZGU0VUCQkweDQ4CisKKy8qIHBhZ2Ugc2l6ZSBtdWx0aXBsZSBjb3ZlcmluZyBhbGwgY29uZmlnIHJlZ3MgKi8KKyNkZWZpbmUgU05CX1VOQ09SRV9QQ0lfSU1DX01BUF9TSVpFCQkweDYwMDAKKworI2RlZmluZSBTTkJfVU5DT1JFX1BDSV9JTUNfREFUQV9SRUFEUwkJMHgxCisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1JFQURTX0JBU0UJMHg1MDUwCisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1dSSVRFUwkJMHgyCisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1dSSVRFU19CQVNFCTB4NTA1NAorI2RlZmluZSBTTkJfVU5DT1JFX1BDSV9JTUNfQ1RSX0JBU0UJCVNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1JFQURTX0JBU0UKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNuYl91bmNvcmVfaW1jX2Zvcm1hdHNfYXR0cltdID0geworCSZmb3JtYXRfYXR0cl9ldmVudC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzbmJfdW5jb3JlX2ltY19mb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBzbmJfdW5jb3JlX2ltY19mb3JtYXRzX2F0dHIsCit9OworCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19pbml0X2JveChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYm94LT5wY2lfZGV2OworCWludCB3aGVyZSA9IFNOQl9VTkNPUkVfUENJX0lNQ19CQVJfT0ZGU0VUOworCXJlc291cmNlX3NpemVfdCBhZGRyOworCXUzMiBwY2lfZHdvcmQ7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgd2hlcmUsICZwY2lfZHdvcmQpOworCWFkZHIgPSBwY2lfZHdvcmQ7CisKKyNpZmRlZiBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgd2hlcmUgKyA0LCAmcGNpX2R3b3JkKTsKKwlhZGRyIHw9ICgocmVzb3VyY2Vfc2l6ZV90KXBjaV9kd29yZCA8PCAzMik7CisjZW5kaWYKKworCWFkZHIgJj0gfihQQUdFX1NJWkUgLSAxKTsKKworCWJveC0+aW9fYWRkciA9IGlvcmVtYXAoYWRkciwgU05CX1VOQ09SRV9QQ0lfSU1DX01BUF9TSVpFKTsKKwlib3gtPmhydGltZXJfZHVyYXRpb24gPSBVTkNPUkVfU05CX0lNQ19IUlRJTUVSX0lOVEVSVkFMOworfQorCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19lbmFibGVfYm94KHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gpCit7fQorCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19kaXNhYmxlX2JveChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KQore30KKworc3RhdGljIHZvaWQgc25iX3VuY29yZV9pbWNfZW5hYmxlX2V2ZW50KHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3t9CisKK3N0YXRpYyB2b2lkIHNuYl91bmNvcmVfaW1jX2Rpc2FibGVfZXZlbnQoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQore30KKworc3RhdGljIHU2NCBzbmJfdW5jb3JlX2ltY19yZWFkX2NvdW50ZXIoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCisJcmV0dXJuICh1NjQpKih1bnNpZ25lZCBpbnQgKikoYm94LT5pb19hZGRyICsgaHdjLT5ldmVudF9iYXNlKTsKK30KKworLyoKKyAqIGN1c3RvbSBldmVudF9pbml0KCkgZnVuY3Rpb24gYmVjYXVzZSB3ZSBkZWZpbmUgb3VyIG93biBmaXhlZCwgZnJlZQorICogcnVubmluZyBjb3VudGVycywgc28gd2UgZG8gbm90IHdhbnQgdG8gY29uZmxpY3Qgd2l0aCBnZW5lcmljIHVuY29yZQorICogbG9naWMuIEFsc28gc2ltcGxpZmllcyBwcm9jZXNzaW5nCisgKi8KK3N0YXRpYyBpbnQgc25iX3VuY29yZV9pbWNfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGludGVsX3VuY29yZV9wbXUgKnBtdTsKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94OworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCXU2NCBjZmcgPSBldmVudC0+YXR0ci5jb25maWcgJiBTTkJfVU5DT1JFX1BDSV9JTUNfRVZFTlRfTUFTSzsKKwlpbnQgaWR4LCBiYXNlOworCisJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gZXZlbnQtPnBtdS0+dHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlwbXUgPSB1bmNvcmVfZXZlbnRfdG9fcG11KGV2ZW50KTsKKwkvKiBubyBkZXZpY2UgZm91bmQgZm9yIHRoaXMgcG11ICovCisJaWYgKHBtdS0+ZnVuY19pZCA8IDApCisJCXJldHVybiAtRU5PRU5UOworCisJLyogU2FtcGxpbmcgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlpZiAoaHdjLT5zYW1wbGVfcGVyaW9kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHVuc3VwcG9ydGVkIG1vZGVzIGFuZCBmaWx0ZXJzICovCisJaWYgKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlciAgIHx8CisJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsIHx8CisJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHYgICAgIHx8CisJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSAgIHx8CisJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaG9zdCAgIHx8CisJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfZ3Vlc3QgIHx8CisJICAgIGV2ZW50LT5hdHRyLnNhbXBsZV9wZXJpb2QpIC8qIG5vIHNhbXBsaW5nICovCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBQbGFjZSBhbGwgdW5jb3JlIGV2ZW50cyBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHBhY2thZ2UKKwkgKiBvbnRvIGEgc2luZ2xlIGNwdQorCSAqLworCWlmIChldmVudC0+Y3B1IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjaGVjayBvbmx5IHN1cHBvcnRlZCBiaXRzIGFyZSBzZXQgKi8KKwlpZiAoZXZlbnQtPmF0dHIuY29uZmlnICYgflNOQl9VTkNPUkVfUENJX0lNQ19FVkVOVF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJveCA9IHVuY29yZV9wbXVfdG9fYm94KHBtdSwgZXZlbnQtPmNwdSk7CisJaWYgKCFib3ggfHwgYm94LT5jcHUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWV2ZW50LT5jcHUgPSBib3gtPmNwdTsKKworCWV2ZW50LT5ody5pZHggPSAtMTsKKwlldmVudC0+aHcubGFzdF90YWcgPSB+MFVMTDsKKwlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19OT05FOworCWV2ZW50LT5ody5icmFuY2hfcmVnLmlkeCA9IEVYVFJBX1JFR19OT05FOworCS8qCisJICogY2hlY2sgZXZlbnQgaXMga25vd24gKHdoaXRlbGlzdCwgZGV0ZXJtaW5lcyBjb3VudGVyKQorCSAqLworCXN3aXRjaCAoY2ZnKSB7CisJY2FzZSBTTkJfVU5DT1JFX1BDSV9JTUNfREFUQV9SRUFEUzoKKwkJYmFzZSA9IFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1JFQURTX0JBU0U7CisJCWlkeCA9IFVOQ09SRV9QTUNfSURYX0ZJWEVEOworCQlicmVhazsKKwljYXNlIFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1dSSVRFUzoKKwkJYmFzZSA9IFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1dSSVRFU19CQVNFOworCQlpZHggPSBVTkNPUkVfUE1DX0lEWF9GSVhFRCArIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIG11c3QgYmUgZG9uZSBiZWZvcmUgdmFsaWRhdGVfZ3JvdXAgKi8KKwlldmVudC0+aHcuZXZlbnRfYmFzZSA9IGJhc2U7CisJZXZlbnQtPmh3LmNvbmZpZyA9IGNmZzsKKwlldmVudC0+aHcuaWR4ID0gaWR4OworCisJLyogbm8gZ3JvdXAgdmFsaWRhdGlvbiBuZWVkZWQsIHdlIGhhdmUgZnJlZSBydW5uaW5nIGNvdW50ZXJzICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmJfdW5jb3JlX2ltY19od19jb25maWcoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19ldmVudF9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94ID0gdW5jb3JlX2V2ZW50X3RvX2JveChldmVudCk7CisJdTY0IGNvdW50OworCisJaWYgKFdBUk5fT05fT05DRSghKGV2ZW50LT5ody5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpKSkKKwkJcmV0dXJuOworCisJZXZlbnQtPmh3LnN0YXRlID0gMDsKKwlib3gtPm5fYWN0aXZlKys7CisKKwlsaXN0X2FkZF90YWlsKCZldmVudC0+YWN0aXZlX2VudHJ5LCAmYm94LT5hY3RpdmVfbGlzdCk7CisKKwljb3VudCA9IHNuYl91bmNvcmVfaW1jX3JlYWRfY291bnRlcihib3gsIGV2ZW50KTsKKwlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnByZXZfY291bnQsIGNvdW50KTsKKworCWlmIChib3gtPm5fYWN0aXZlID09IDEpCisJCXVuY29yZV9wbXVfc3RhcnRfaHJ0aW1lcihib3gpOworfQorCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3ggPSB1bmNvcmVfZXZlbnRfdG9fYm94KGV2ZW50KTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKworCWlmICghKGh3Yy0+c3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKSkgeworCQlib3gtPm5fYWN0aXZlLS07CisKKwkJV0FSTl9PTl9PTkNFKGh3Yy0+c3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKTsKKwkJaHdjLT5zdGF0ZSB8PSBQRVJGX0hFU19TVE9QUEVEOworCisJCWxpc3RfZGVsKCZldmVudC0+YWN0aXZlX2VudHJ5KTsKKworCQlpZiAoYm94LT5uX2FjdGl2ZSA9PSAwKQorCQkJdW5jb3JlX3BtdV9jYW5jZWxfaHJ0aW1lcihib3gpOworCX0KKworCWlmICgoZmxhZ3MgJiBQRVJGX0VGX1VQREFURSkgJiYgIShod2MtPnN0YXRlICYgUEVSRl9IRVNfVVBUT0RBVEUpKSB7CisJCS8qCisJCSAqIERyYWluIHRoZSByZW1haW5pbmcgZGVsdGEgY291bnQgb3V0IG9mIGEgZXZlbnQKKwkJICogdGhhdCB3ZSBhcmUgZGlzYWJsaW5nOgorCQkgKi8KKwkJdW5jb3JlX3BlcmZfZXZlbnRfdXBkYXRlKGJveCwgZXZlbnQpOworCQlod2MtPnN0YXRlIHw9IFBFUkZfSEVTX1VQVE9EQVRFOworCX0KK30KKworc3RhdGljIGludCBzbmJfdW5jb3JlX2ltY19ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCA9IHVuY29yZV9ldmVudF90b19ib3goZXZlbnQpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCisJaWYgKCFib3gpCisJCXJldHVybiAtRU5PREVWOworCisJaHdjLT5zdGF0ZSA9IFBFUkZfSEVTX1VQVE9EQVRFIHwgUEVSRl9IRVNfU1RPUFBFRDsKKwlpZiAoIShmbGFncyAmIFBFUkZfRUZfU1RBUlQpKQorCQlod2MtPnN0YXRlIHw9IFBFUkZfSEVTX0FSQ0g7CisKKwlzbmJfdW5jb3JlX2ltY19ldmVudF9zdGFydChldmVudCwgMCk7CisKKwlib3gtPm5fZXZlbnRzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25iX3VuY29yZV9pbWNfZXZlbnRfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3ggPSB1bmNvcmVfZXZlbnRfdG9fYm94KGV2ZW50KTsKKwlpbnQgaTsKKworCXNuYl91bmNvcmVfaW1jX2V2ZW50X3N0b3AoZXZlbnQsIFBFUkZfRUZfVVBEQVRFKTsKKworCWZvciAoaSA9IDA7IGkgPCBib3gtPm5fZXZlbnRzOyBpKyspIHsKKwkJaWYgKGV2ZW50ID09IGJveC0+ZXZlbnRfbGlzdFtpXSkgeworCQkJLS1ib3gtPm5fZXZlbnRzOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc25iX3BjaTJwaHlfbWFwX2luaXQoaW50IGRldmlkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCBidXM7CisKKwlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZpZCwgZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwlidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOworCisJcGNpYnVzX3RvX3BoeXNpZFtidXNdID0gMDsKKworCXBjaV9kZXZfcHV0KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbXUgc25iX3VuY29yZV9pbWNfcG11ID0geworCS50YXNrX2N0eF9ucgk9IHBlcmZfaW52YWxpZF9jb250ZXh0LAorCS5ldmVudF9pbml0CT0gc25iX3VuY29yZV9pbWNfZXZlbnRfaW5pdCwKKwkuYWRkCQk9IHNuYl91bmNvcmVfaW1jX2V2ZW50X2FkZCwKKwkuZGVsCQk9IHNuYl91bmNvcmVfaW1jX2V2ZW50X2RlbCwKKwkuc3RhcnQJCT0gc25iX3VuY29yZV9pbWNfZXZlbnRfc3RhcnQsCisJLnN0b3AJCT0gc25iX3VuY29yZV9pbWNfZXZlbnRfc3RvcCwKKwkucmVhZAkJPSB1bmNvcmVfcG11X2V2ZW50X3JlYWQsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc25iX3VuY29yZV9pbWNfb3BzID0geworCS5pbml0X2JveAk9IHNuYl91bmNvcmVfaW1jX2luaXRfYm94LAorCS5lbmFibGVfYm94CT0gc25iX3VuY29yZV9pbWNfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ib3gJPSBzbmJfdW5jb3JlX2ltY19kaXNhYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAk9IHNuYl91bmNvcmVfaW1jX2Rpc2FibGVfZXZlbnQsCisJLmVuYWJsZV9ldmVudAk9IHNuYl91bmNvcmVfaW1jX2VuYWJsZV9ldmVudCwKKwkuaHdfY29uZmlnCT0gc25iX3VuY29yZV9pbWNfaHdfY29uZmlnLAorCS5yZWFkX2NvdW50ZXIJPSBzbmJfdW5jb3JlX2ltY19yZWFkX2NvdW50ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNuYl91bmNvcmVfaW1jID0geworCS5uYW1lCQk9ICJpbWMiLAorCS5udW1fY291bnRlcnMgICA9IDIsCisJLm51bV9ib3hlcwk9IDEsCisJLmZpeGVkX2N0cl9iaXRzCT0gMzIsCisJLmZpeGVkX2N0cgk9IFNOQl9VTkNPUkVfUENJX0lNQ19DVFJfQkFTRSwKKwkuZXZlbnRfZGVzY3MJPSBzbmJfdW5jb3JlX2ltY19ldmVudHMsCisJLmZvcm1hdF9ncm91cAk9ICZzbmJfdW5jb3JlX2ltY19mb3JtYXRfZ3JvdXAsCisJLnBlcmZfY3RyCT0gU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfUkVBRFNfQkFTRSwKKwkuZXZlbnRfbWFzawk9IFNOQl9VTkNPUkVfUENJX0lNQ19FVkVOVF9NQVNLLAorCS5vcHMJCT0gJnNuYl91bmNvcmVfaW1jX29wcywKKwkucG11CQk9ICZzbmJfdW5jb3JlX2ltY19wbXUsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlICpzbmJfcGNpX3VuY29yZXNbXSA9IHsKKwlbU05CX1BDSV9VTkNPUkVfSU1DXQk9ICZzbmJfdW5jb3JlX2ltYywKKwlOVUxMLAorfTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHNuYl91bmNvcmVfcGNpX2lkcykgPSB7CisJeyAvKiBJTUMgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NOQl9JTUMpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9EQVRBKFNOQl9QQ0lfVU5DT1JFX0lNQywgMCksCisJfSwKKwl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9LAorfTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGl2Yl91bmNvcmVfcGNpX2lkcykgPSB7CisJeyAvKiBJTUMgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lWQl9JTUMpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9EQVRBKFNOQl9QQ0lfVU5DT1JFX0lNQywgMCksCisJfSwKKwl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9LAorfTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGhzd191bmNvcmVfcGNpX2lkcykgPSB7CisJeyAvKiBJTUMgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0hTV19JTUMpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9EQVRBKFNOQl9QQ0lfVU5DT1JFX0lNQywgMCksCisJfSwKKwl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNuYl91bmNvcmVfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic25iX3VuY29yZSIsCisJLmlkX3RhYmxlCT0gc25iX3VuY29yZV9wY2lfaWRzLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGl2Yl91bmNvcmVfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaXZiX3VuY29yZSIsCisJLmlkX3RhYmxlCT0gaXZiX3VuY29yZV9wY2lfaWRzLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhzd191bmNvcmVfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaHN3X3VuY29yZSIsCisJLmlkX3RhYmxlCT0gaHN3X3VuY29yZV9wY2lfaWRzLAorfTsKKwogLyogZW5kIG9mIFNhbmR5IEJyaWRnZSB1bmNvcmUgc3VwcG9ydCAqLwogCiAvKiBOZWhhbGVtIHVuY29yZSBzdXBwb3J0ICovCkBAIC0yNzg5LDYgKzMxNzMsNyBAQAogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHVuY29yZV9wbXVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKIHsKIAlzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94OworCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBiaXQ7CiAKQEAgLTI4MDEsMTkgKzMxODYsMjcgQEAKIAkgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKKwkvKgorCSAqIGhhbmRsZSBib3hlcyB3aXRoIGFuIGFjdGl2ZSBldmVudCBsaXN0IGFzIG9wcG9zZWQgdG8gYWN0aXZlCisJICogY291bnRlcnMKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCAmYm94LT5hY3RpdmVfbGlzdCwgYWN0aXZlX2VudHJ5KSB7CisJCXVuY29yZV9wZXJmX2V2ZW50X3VwZGF0ZShib3gsIGV2ZW50KTsKKwl9CisKIAlmb3JfZWFjaF9zZXRfYml0KGJpdCwgYm94LT5hY3RpdmVfbWFzaywgVU5DT1JFX1BNQ19JRFhfTUFYKQogCQl1bmNvcmVfcGVyZl9ldmVudF91cGRhdGUoYm94LCBib3gtPmV2ZW50c1tiaXRdKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCWhydGltZXJfZm9yd2FyZF9ub3coaHJ0aW1lciwgbnNfdG9fa3RpbWUoVU5DT1JFX1BNVV9IUlRJTUVSX0lOVEVSVkFMKSk7CisJaHJ0aW1lcl9mb3J3YXJkX25vdyhocnRpbWVyLCBuc190b19rdGltZShib3gtPmhydGltZXJfZHVyYXRpb24pKTsKIAlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOwogfQogCiBzdGF0aWMgdm9pZCB1bmNvcmVfcG11X3N0YXJ0X2hydGltZXIoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCkKIHsKIAlfX2hydGltZXJfc3RhcnRfcmFuZ2VfbnMoJmJveC0+aHJ0aW1lciwKLQkJCW5zX3RvX2t0aW1lKFVOQ09SRV9QTVVfSFJUSU1FUl9JTlRFUlZBTCksIDAsCisJCQluc190b19rdGltZShib3gtPmhydGltZXJfZHVyYXRpb24pLCAwLAogCQkJSFJUSU1FUl9NT0RFX1JFTF9QSU5ORUQsIDApOwogfQogCkBAIC0yODQ3LDQ1ICszMjQwLDE0IEBACiAJYm94LT5jcHUgPSAtMTsKIAlib3gtPnBoeXNfaWQgPSAtMTsKIAorCS8qIHNldCBkZWZhdWx0IGhydGltZXIgdGltZW91dCAqLworCWJveC0+aHJ0aW1lcl9kdXJhdGlvbiA9IFVOQ09SRV9QTVVfSFJUSU1FUl9JTlRFUlZBTDsKKworCUlOSVRfTElTVF9IRUFEKCZib3gtPmFjdGl2ZV9saXN0KTsKKwogCXJldHVybiBib3g7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqCi11bmNvcmVfcG11X3RvX2JveChzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSAqcG11LCBpbnQgY3B1KQotewotCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3g7Ci0KLQlib3ggPSAqcGVyX2NwdV9wdHIocG11LT5ib3gsIGNwdSk7Ci0JaWYgKGJveCkKLQkJcmV0dXJuIGJveDsKLQotCXJhd19zcGluX2xvY2soJnVuY29yZV9ib3hfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShib3gsICZwbXUtPmJveF9saXN0LCBsaXN0KSB7Ci0JCWlmIChib3gtPnBoeXNfaWQgPT0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpKSB7Ci0JCQlhdG9taWNfaW5jKCZib3gtPnJlZmNudCk7Ci0JCQkqcGVyX2NwdV9wdHIocG11LT5ib3gsIGNwdSkgPSBib3g7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyYXdfc3Bpbl91bmxvY2soJnVuY29yZV9ib3hfbG9jayk7Ci0KLQlyZXR1cm4gKnBlcl9jcHVfcHRyKHBtdS0+Ym94LCBjcHUpOwotfQotCi1zdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9wbXUgKnVuY29yZV9ldmVudF90b19wbXUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQotewotCXJldHVybiBjb250YWluZXJfb2YoZXZlbnQtPnBtdSwgc3RydWN0IGludGVsX3VuY29yZV9wbXUsIHBtdSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqdW5jb3JlX2V2ZW50X3RvX2JveChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCi17Ci0JLyoKLQkgKiBwZXJmIGNvcmUgc2NoZWR1bGVzIGV2ZW50IG9uIHRoZSBiYXNpcyBvZiBjcHUsIHVuY29yZSBldmVudHMgYXJlCi0JICogY29sbGVjdGVkIGJ5IG9uZSBvZiB0aGUgY3B1cyBpbnNpZGUgYSBwaHlzaWNhbCBwYWNrYWdlLgotCSAqLwotCXJldHVybiB1bmNvcmVfcG11X3RvX2JveCh1bmNvcmVfZXZlbnRfdG9fcG11KGV2ZW50KSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLX0KLQogc3RhdGljIGludAogdW5jb3JlX2NvbGxlY3RfZXZlbnRzKHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gsIHN0cnVjdCBwZXJmX2V2ZW50ICpsZWFkZXIsIGJvb2wgZG9ncnApCiB7CkBAIC0zMjc5LDE2ICszNjQxLDIxIEBACiB7CiAJaW50IHJldDsKIAotCXBtdS0+cG11ID0gKHN0cnVjdCBwbXUpIHsKLQkJLmF0dHJfZ3JvdXBzCT0gcG11LT50eXBlLT5hdHRyX2dyb3VwcywKLQkJLnRhc2tfY3R4X25yCT0gcGVyZl9pbnZhbGlkX2NvbnRleHQsCi0JCS5ldmVudF9pbml0CT0gdW5jb3JlX3BtdV9ldmVudF9pbml0LAotCQkuYWRkCQk9IHVuY29yZV9wbXVfZXZlbnRfYWRkLAotCQkuZGVsCQk9IHVuY29yZV9wbXVfZXZlbnRfZGVsLAotCQkuc3RhcnQJCT0gdW5jb3JlX3BtdV9ldmVudF9zdGFydCwKLQkJLnN0b3AJCT0gdW5jb3JlX3BtdV9ldmVudF9zdG9wLAotCQkucmVhZAkJPSB1bmNvcmVfcG11X2V2ZW50X3JlYWQsCi0JfTsKKwlpZiAoIXBtdS0+dHlwZS0+cG11KSB7CisJCXBtdS0+cG11ID0gKHN0cnVjdCBwbXUpIHsKKwkJCS5hdHRyX2dyb3Vwcwk9IHBtdS0+dHlwZS0+YXR0cl9ncm91cHMsCisJCQkudGFza19jdHhfbnIJPSBwZXJmX2ludmFsaWRfY29udGV4dCwKKwkJCS5ldmVudF9pbml0CT0gdW5jb3JlX3BtdV9ldmVudF9pbml0LAorCQkJLmFkZAkJPSB1bmNvcmVfcG11X2V2ZW50X2FkZCwKKwkJCS5kZWwJCT0gdW5jb3JlX3BtdV9ldmVudF9kZWwsCisJCQkuc3RhcnQJCT0gdW5jb3JlX3BtdV9ldmVudF9zdGFydCwKKwkJCS5zdG9wCQk9IHVuY29yZV9wbXVfZXZlbnRfc3RvcCwKKwkJCS5yZWFkCQk9IHVuY29yZV9wbXVfZXZlbnRfcmVhZCwKKwkJfTsKKwl9IGVsc2UgeworCQlwbXUtPnBtdSA9ICpwbXUtPnR5cGUtPnBtdTsKKwkJcG11LT5wbXUuYXR0cl9ncm91cHMgPSBwbXUtPnR5cGUtPmF0dHJfZ3JvdXBzOworCX0KIAogCWlmIChwbXUtPnR5cGUtPm51bV9ib3hlcyA9PSAxKSB7CiAJCWlmIChzdHJsZW4ocG11LT50eXBlLT5uYW1lKSA+IDApCkBAIC0zNTAyLDYgKzM4NjksMjggQEAKIAkJcGNpX3VuY29yZXMgPSBpdnRfcGNpX3VuY29yZXM7CiAJCXVuY29yZV9wY2lfZHJpdmVyID0gJml2dF91bmNvcmVfcGNpX2RyaXZlcjsKIAkJYnJlYWs7CisJY2FzZSA0MjogLyogU2FuZHkgQnJpZGdlICovCisJCXJldCA9IHNuYl9wY2kycGh5X21hcF9pbml0KFBDSV9ERVZJQ0VfSURfSU5URUxfU05CX0lNQyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlwY2lfdW5jb3JlcyA9IHNuYl9wY2lfdW5jb3JlczsKKwkJdW5jb3JlX3BjaV9kcml2ZXIgPSAmc25iX3VuY29yZV9wY2lfZHJpdmVyOworCQlicmVhazsKKwljYXNlIDU4OiAvKiBJdnkgQnJpZGdlICovCisJCXJldCA9IHNuYl9wY2kycGh5X21hcF9pbml0KFBDSV9ERVZJQ0VfSURfSU5URUxfSVZCX0lNQyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlwY2lfdW5jb3JlcyA9IHNuYl9wY2lfdW5jb3JlczsKKwkJdW5jb3JlX3BjaV9kcml2ZXIgPSAmaXZiX3VuY29yZV9wY2lfZHJpdmVyOworCQlicmVhazsKKwljYXNlIDYwOiAvKiBIYXN3ZWxsICovCisJY2FzZSA2OTogLyogSGFzd2VsbCBDZWxlcm9uICovCisJCXJldCA9IHNuYl9wY2kycGh5X21hcF9pbml0KFBDSV9ERVZJQ0VfSURfSU5URUxfSFNXX0lNQyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlwY2lfdW5jb3JlcyA9IHNuYl9wY2lfdW5jb3JlczsKKwkJdW5jb3JlX3BjaV9kcml2ZXIgPSAmaHN3X3VuY29yZV9wY2lfZHJpdmVyOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9CkBAIC0zNzczLDcgKzQxNjIsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB1bmNvcmVfY3B1X2luaXQodm9pZCkKIHsKLQlpbnQgcmV0LCBjcHUsIG1heF9jb3JlczsKKwlpbnQgcmV0LCBtYXhfY29yZXM7CiAKIAltYXhfY29yZXMgPSBib290X2NwdV9kYXRhLng4Nl9tYXhfY29yZXM7CiAJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCkgewpAQCAtMzgxNywyOSArNDIwNiw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWdldF9vbmxpbmVfY3B1cygpOwotCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaW50IGksIHBoeXNfaWQgPSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGNwdSk7Ci0KLQkJZm9yX2VhY2hfY3B1KGksICZ1bmNvcmVfY3B1X21hc2spIHsKLQkJCWlmIChwaHlzX2lkID09IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoaSkpIHsKLQkJCQlwaHlzX2lkID0gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBoeXNfaWQgPCAwKQotCQkJY29udGludWU7Ci0KLQkJdW5jb3JlX2NwdV9wcmVwYXJlKGNwdSwgcGh5c19pZCk7Ci0JCXVuY29yZV9ldmVudF9pbml0X2NwdShjcHUpOwotCX0KLQlvbl9lYWNoX2NwdSh1bmNvcmVfY3B1X3NldHVwLCBOVUxMLCAxKTsKLQotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmdW5jb3JlX2NwdV9uYik7Ci0KLQlwdXRfb25saW5lX2NwdXMoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zODY4LDYgKzQyMzQsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHVuY29yZV9jcHVtYXNrX2luaXQodm9pZCkKK3sKKwlpbnQgY3B1OworCisJLyoKKwkgKiBvbnkgaW52b2tlIG9uY2UgZnJvbSBtc3Igb3IgcGNpIGluaXQgY29kZQorCSAqLworCWlmICghY3B1bWFza19lbXB0eSgmdW5jb3JlX2NwdV9tYXNrKSkKKwkJcmV0dXJuOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpbnQgaSwgcGh5c19pZCA9IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KTsKKworCQlmb3JfZWFjaF9jcHUoaSwgJnVuY29yZV9jcHVfbWFzaykgeworCQkJaWYgKHBoeXNfaWQgPT0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChpKSkgeworCQkJCXBoeXNfaWQgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocGh5c19pZCA8IDApCisJCQljb250aW51ZTsKKworCQl1bmNvcmVfY3B1X3ByZXBhcmUoY3B1LCBwaHlzX2lkKTsKKwkJdW5jb3JlX2V2ZW50X2luaXRfY3B1KGNwdSk7CisJfQorCW9uX2VhY2hfY3B1KHVuY29yZV9jcHVfc2V0dXAsIE5VTEwsIDEpOworCisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ1bmNvcmVfY3B1X25iKTsKKworCXB1dF9vbmxpbmVfY3B1cygpOworfQorCisKIHN0YXRpYyBpbnQgX19pbml0IGludGVsX3VuY29yZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTM4ODYsNiArNDI4Nyw3IEBACiAJCXVuY29yZV9wY2lfZXhpdCgpOwogCQlnb3RvIGZhaWw7CiAJfQorCXVuY29yZV9jcHVtYXNrX2luaXQoKTsKIAogCXVuY29yZV9wbXVzX3JlZ2lzdGVyKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLmgKaW5kZXggYTgwYWI3MS4uOTAyMzZmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3VuY29yZS5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmUuaApAQCAtNiw2ICs2LDcgQEAKIAogI2RlZmluZSBVTkNPUkVfUE1VX05BTUVfTEVOCQkzMgogI2RlZmluZSBVTkNPUkVfUE1VX0hSVElNRVJfSU5URVJWQUwJKDYwTEwgKiBOU0VDX1BFUl9TRUMpCisjZGVmaW5lIFVOQ09SRV9TTkJfSU1DX0hSVElNRVJfSU5URVJWQUwgKDVVTEwgKiBOU0VDX1BFUl9TRUMpCiAKICNkZWZpbmUgVU5DT1JFX0ZJWEVEX0VWRU5UCQkweGZmCiAjZGVmaW5lIFVOQ09SRV9QTUNfSURYX01BWF9HRU5FUklDCTgKQEAgLTQ0MCw2ICs0NDEsNyBAQAogCXN0cnVjdCBpbnRlbF91bmNvcmVfb3BzICpvcHM7CiAJc3RydWN0IHVuY29yZV9ldmVudF9kZXNjICpldmVudF9kZXNjczsKIAljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyX2dyb3Vwc1s0XTsKKwlzdHJ1Y3QgcG11ICpwbXU7IC8qIGZvciBjdXN0b20gcG11IG9wcyAqLwogfTsKIAogI2RlZmluZSBwbXVfZ3JvdXAgYXR0cl9ncm91cHNbMF0KQEAgLTQ4OCw4ICs0OTAsMTEgQEAKIAl1NjQgdGFnc1tVTkNPUkVfUE1DX0lEWF9NQVhdOwogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCXN0cnVjdCBpbnRlbF91bmNvcmVfcG11ICpwbXU7CisJdTY0IGhydGltZXJfZHVyYXRpb247IC8qIGhydGltZXIgdGltZW91dCBmb3IgdGhpcyBib3ggKi8KIAlzdHJ1Y3QgaHJ0aW1lciBocnRpbWVyOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9saXN0OworCXZvaWQgKmlvX2FkZHI7CiAJc3RydWN0IGludGVsX3VuY29yZV9leHRyYV9yZWcgc2hhcmVkX3JlZ3NbMF07CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jCmluZGV4IDM0ODZlNjYuLjVkNDY2YjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jCkBAIC0xMjU3LDcgKzEyNTcsMjQgQEAKIAkJCXBhc3MrKzsKIAkJCWdvdG8gYWdhaW47CiAJCX0KLQorCQkvKgorCQkgKiBQZXJmIGRvZXMgdGVzdCBydW5zIHRvIHNlZSBpZiBhIHdob2xlIGdyb3VwIGNhbiBiZSBhc3NpZ25lZAorCQkgKiB0b2dldGhlciBzdWNjZXNmdWxseS4gIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSByb3VuZHMgb2YgdGhpcy4KKwkJICogVW5mb3J0dW5hdGVseSwgcDRfcG11X3N3YXBfY29uZmlnX3RzIHRvdWNoZXMgdGhlIGh3Yy0+Y29uZmlnCisJCSAqIGJpdHMsIHN1Y2ggdGhhdCB0aGUgbmV4dCByb3VuZCBvZiBncm91cCBhc3NpZ25tZW50cyB3aWxsCisJCSAqIGNhdXNlIHRoZSBhYm92ZSBwNF9zaG91bGRfc3dhcF90cyB0byBwYXNzIGluc3RlYWQgb2YgZmFpbC4KKwkJICogVGhpcyBsZWFkcyB0byBjb3VudGVycyBleGNsdXNpdmUgdG8gdGhyZWFkMCBiZWluZyB1c2VkIGJ5CisJCSAqIHRocmVhZDEuCisJCSAqCisJCSAqIFNvbHZlIHRoaXMgd2l0aCBhIGNoZWFwIGhhY2ssIHJlc2V0IHRoZSBpZHggYmFjayB0byAtMSB0bworCQkgKiBmb3JjZSBhIG5ldyBsb29rdXAgKHA0X25leHRfY250cikgdG8gZ2V0IHRoZSByaWdodCBjb3VudGVyCisJCSAqIGZvciB0aGUgcmlnaHQgdGhyZWFkLgorCQkgKgorCQkgKiBUaGlzIHByb2JhYmx5IGRvZXNuJ3QgY29tcGx5IHdpdGggdGhlIGdlbmVyYWwgc3Bpcml0IG9mIGhvdworCQkgKiBwZXJmIHdhbnRzIHRvIHdvcmssIGJ1dCBQNCBpcyBzcGVjaWFsLiA6LSgKKwkJICovCisJCWlmIChwNF9zaG91bGRfc3dhcF90cyhod2MtPmNvbmZpZywgY3B1KSkKKwkJCWh3Yy0+aWR4ID0gLTE7CiAJCXA0X3BtdV9zd2FwX2NvbmZpZ190cyhod2MsIGNwdSk7CiAJCWlmIChhc3NpZ24pCiAJCQlhc3NpZ25baV0gPSBjbnRyX2lkeDsKQEAgLTEzMjIsNiArMTMzOSw3IEBACiBfX2luaXQgaW50IHA0X3BtdV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwlpbnQgaSwgcmVnOwogCiAJLyogSWYgd2UgZ2V0IHN0cmlwcGVkIC0tIGluZGV4aW5nIGZhaWxzICovCiAJQlVJTERfQlVHX09OKEFSQ0hfUDRfTUFYX0NDQ1IgPiBJTlRFTF9QTUNfTUFYX0dFTkVSSUMpOwpAQCAtMTM0MCw1ICsxMzU4LDE5IEBACiAKIAl4ODZfcG11ID0gcDRfcG11OwogCisJLyoKKwkgKiBFdmVuIHRob3VnaCB0aGUgY291bnRlcnMgYXJlIGNvbmZpZ3VyZWQgdG8gaW50ZXJydXB0IGEgcGFydGljdWxhcgorCSAqIGxvZ2ljYWwgcHJvY2Vzc29yIHdoZW4gYW4gb3ZlcmZsb3cgaGFwcGVucywgdGVzdGluZyBoYXMgc2hvd24gdGhhdAorCSAqIG9uIGtkdW1wIGtlcm5lbHMgKHdoaWNoIHVzZXMgYSBzaW5nbGUgY3B1KSwgdGhyZWFkMSdzIGNvdW50ZXIKKwkgKiBjb250aW51ZXMgdG8gcnVuIGFuZCB3aWxsIHJlcG9ydCBhbiBOTUkgb24gdGhyZWFkMC4gIER1ZSB0byB0aGUKKwkgKiBvdmVyZmxvdyBidWcsIHRoaXMgbGVhZHMgdG8gYSBzdHJlYW0gb2YgdW5rbm93biBOTUlzLgorCSAqCisJICogU29sdmUgdGhpcyBieSB6ZXJvJ2luZyBvdXQgdGhlIHJlZ2lzdGVycyB0byBtaW1pYyBhIHJlc2V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCXJlZyA9IHg4Nl9wbXVfY29uZmlnX2FkZHIoaSk7CisJCXdybXNybF9zYWZlKHJlZywgMFVMTCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3Jhc2guYyBiL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCmluZGV4IGE1NzkwMmUuLjUwN2RlODAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCkBAIC01Nyw5ICs1Nyw3IEBACiB7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCXN0cnVjdCBwdF9yZWdzIGZpeGVkX3JlZ3M7Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfMzIKIAlpZiAoIXVzZXJfbW9kZV92bShyZWdzKSkgewogCQljcmFzaF9maXh1cF9zc19lc3AoJmZpeGVkX3JlZ3MsIHJlZ3MpOwogCQlyZWdzID0gJmZpeGVkX3JlZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKaW5kZXggZjJhMTc3MC4uNWFiZDRjZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwpAQCAtMTYsMTIgKzE2LDM1IEBACiAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCitzdGF0aWMgdm9pZCAqaXNfaXJxX3N0YWNrKHZvaWQgKnAsIHZvaWQgKmlycSkKK3sKKwlpZiAocCA8IGlycSB8fCBwID49IChpcnEgKyBUSFJFQURfU0laRSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBpcnEgKyBUSFJFQURfU0laRTsKK30KKworCitzdGF0aWMgdm9pZCAqaXNfaGFyZGlycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgaW50IGNwdSkKK3sKKwl2b2lkICppcnEgPSBwZXJfY3B1KGhhcmRpcnFfc3RhY2ssIGNwdSk7CisKKwlyZXR1cm4gaXNfaXJxX3N0YWNrKHN0YWNrLCBpcnEpOworfQorCitzdGF0aWMgdm9pZCAqaXNfc29mdGlycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgaW50IGNwdSkKK3sKKwl2b2lkICppcnEgPSBwZXJfY3B1KHNvZnRpcnFfc3RhY2ssIGNwdSk7CisKKwlyZXR1cm4gaXNfaXJxX3N0YWNrKHN0YWNrLCBpcnEpOworfQogCiB2b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCiAJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQogeworCWNvbnN0IHVuc2lnbmVkIGNwdSA9IGdldF9jcHUoKTsKIAlpbnQgZ3JhcGggPSAwOworCXUzMiAqcHJldl9lc3A7CiAKIAlpZiAoIXRhc2spCiAJCXRhc2sgPSBjdXJyZW50OwpAQCAtMzAsNyArNTMsNyBAQAogCQl1bnNpZ25lZCBsb25nIGR1bW15OwogCiAJCXN0YWNrID0gJmR1bW15OwotCQlpZiAodGFzayAmJiB0YXNrICE9IGN1cnJlbnQpCisJCWlmICh0YXNrICE9IGN1cnJlbnQpCiAJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOwogCX0KIApAQCAtMzksMTggKzYyLDMxIEBACiAKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCB0aHJlYWRfaW5mbyAqY29udGV4dDsKKwkJdm9pZCAqZW5kX3N0YWNrOwogCi0JCWNvbnRleHQgPSAoc3RydWN0IHRocmVhZF9pbmZvICopCi0JCQkoKHVuc2lnbmVkIGxvbmcpc3RhY2sgJiAofihUSFJFQURfU0laRSAtIDEpKSk7Ci0JCWJwID0gb3BzLT53YWxrX3N0YWNrKGNvbnRleHQsIHN0YWNrLCBicCwgb3BzLCBkYXRhLCBOVUxMLCAmZ3JhcGgpOworCQllbmRfc3RhY2sgPSBpc19oYXJkaXJxX3N0YWNrKHN0YWNrLCBjcHUpOworCQlpZiAoIWVuZF9zdGFjaykKKwkJCWVuZF9zdGFjayA9IGlzX3NvZnRpcnFfc3RhY2soc3RhY2ssIGNwdSk7CiAKLQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKWNvbnRleHQtPnByZXZpb3VzX2VzcDsKKwkJY29udGV4dCA9IHRhc2tfdGhyZWFkX2luZm8odGFzayk7CisJCWJwID0gb3BzLT53YWxrX3N0YWNrKGNvbnRleHQsIHN0YWNrLCBicCwgb3BzLCBkYXRhLAorCQkJCSAgICAgZW5kX3N0YWNrLCAmZ3JhcGgpOworCisJCS8qIFN0b3AgaWYgbm90IG9uIGlycSBzdGFjayAqLworCQlpZiAoIWVuZF9zdGFjaykKKwkJCWJyZWFrOworCisJCS8qIFRoZSBwcmV2aW91cyBlc3AgaXMgc2F2ZWQgb24gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgKi8KKwkJcHJldl9lc3AgPSAodTMyICopKGVuZF9zdGFjayAtIFRIUkVBRF9TSVpFKTsKKwkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSpwcmV2X2VzcDsKIAkJaWYgKCFzdGFjaykKIAkJCWJyZWFrOworCiAJCWlmIChvcHMtPnN0YWNrKGRhdGEsICJJUlEiKSA8IDApCiAJCQlicmVhazsKIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQorCXB1dF9jcHUoKTsKIH0KIEVYUE9SVF9TWU1CT0woZHVtcF90cmFjZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYwppbmRleCBhZGRiMjA3Li4xYWJjYjUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCkBAIC0xMDQsNiArMTA0LDQ0IEBACiAJcmV0dXJuIChzdGFjayA+PSBpcnFfc3RhY2sgJiYgc3RhY2sgPCBpcnFfc3RhY2tfZW5kKTsKIH0KIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgaXJxX3N0YWNrX3NpemUgPQorCShJUlFfU1RBQ0tfU0laRSAtIDY0KSAvIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKworZW51bSBzdGFja190eXBlIHsKKwlTVEFDS19JU19VTktOT1dOLAorCVNUQUNLX0lTX05PUk1BTCwKKwlTVEFDS19JU19FWENFUFRJT04sCisJU1RBQ0tfSVNfSVJRLAorfTsKKworc3RhdGljIGVudW0gc3RhY2tfdHlwZQorYW5hbHl6ZV9zdGFjayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgKipzdGFja19lbmQsIHVuc2lnbmVkIGxvbmcgKmlycV9zdGFjaywKKwkgICAgICB1bnNpZ25lZCAqdXNlZCwgY2hhciAqKmlkKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWFkZHIgPSAoKHVuc2lnbmVkIGxvbmcpc3RhY2sgJiAofihUSFJFQURfU0laRSAtIDEpKSk7CisJaWYgKCh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKSA9PSBhZGRyKQorCQlyZXR1cm4gU1RBQ0tfSVNfTk9STUFMOworCisJKnN0YWNrX2VuZCA9IGluX2V4Y2VwdGlvbl9zdGFjayhjcHUsICh1bnNpZ25lZCBsb25nKXN0YWNrLAorCQkJCQl1c2VkLCBpZCk7CisJaWYgKCpzdGFja19lbmQpCisJCXJldHVybiBTVEFDS19JU19FWENFUFRJT047CisKKwlpZiAoIWlycV9zdGFjaykKKwkJcmV0dXJuIFNUQUNLX0lTX05PUk1BTDsKKworCSpzdGFja19lbmQgPSBpcnFfc3RhY2s7CisJaXJxX3N0YWNrID0gaXJxX3N0YWNrIC0gaXJxX3N0YWNrX3NpemU7CisKKwlpZiAoaW5faXJxX3N0YWNrKHN0YWNrLCBpcnFfc3RhY2ssICpzdGFja19lbmQpKQorCQlyZXR1cm4gU1RBQ0tfSVNfSVJROworCisJcmV0dXJuIFNUQUNLX0lTX1VOS05PV047Cit9CisKIC8qCiAgKiB4ODYtNjQgY2FuIGhhdmUgdXAgdG8gdGhyZWUga2VybmVsIHN0YWNrczoKICAqIHByb2Nlc3Mgc3RhY2sKQEAgLTExNiwxMiArMTU0LDEyIEBACiAJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQogewogCWNvbnN0IHVuc2lnbmVkIGNwdSA9IGdldF9jcHUoKTsKLQl1bnNpZ25lZCBsb25nICppcnFfc3RhY2tfZW5kID0KLQkJKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSk7Ci0JdW5zaWduZWQgdXNlZCA9IDA7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbzsKLQlpbnQgZ3JhcGggPSAwOworCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFjayA9ICh1bnNpZ25lZCBsb25nICopcGVyX2NwdShpcnFfc3RhY2tfcHRyLCBjcHUpOwogCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJdW5zaWduZWQgdXNlZCA9IDA7CisJaW50IGdyYXBoID0gMDsKKwlpbnQgZG9uZSA9IDA7CiAKIAlpZiAoIXRhc2spCiAJCXRhc2sgPSBjdXJyZW50OwpAQCAtMTQzLDQ5ICsxODEsNjEgQEAKIAkgKiBleGNlcHRpb25zCiAJICovCiAJdGluZm8gPSB0YXNrX3RocmVhZF9pbmZvKHRhc2spOwotCWZvciAoOzspIHsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJdW5zaWduZWQgbG9uZyAqc3RhY2tfZW5kOworCQllbnVtIHN0YWNrX3R5cGUgc3R5cGU7CiAJCWNoYXIgKmlkOwotCQl1bnNpZ25lZCBsb25nICplc3RhY2tfZW5kOwotCQllc3RhY2tfZW5kID0gaW5fZXhjZXB0aW9uX3N0YWNrKGNwdSwgKHVuc2lnbmVkIGxvbmcpc3RhY2ssCi0JCQkJCQkmdXNlZCwgJmlkKTsKIAotCQlpZiAoZXN0YWNrX2VuZCkgeworCQlzdHlwZSA9IGFuYWx5emVfc3RhY2soY3B1LCB0YXNrLCBzdGFjaywgJnN0YWNrX2VuZCwKKwkJCQkgICAgICBpcnFfc3RhY2ssICZ1c2VkLCAmaWQpOworCisJCS8qIERlZmF1bHQgZmluaXNoIHVubGVzcyBzcGVjaWZpZWQgdG8gY29udGludWUgKi8KKwkJZG9uZSA9IDE7CisKKwkJc3dpdGNoIChzdHlwZSkgeworCisJCS8qIEJyZWFrIG91dCBlYXJseSBpZiB3ZSBhcmUgb24gdGhlIHRocmVhZCBzdGFjayAqLworCQljYXNlIFNUQUNLX0lTX05PUk1BTDoKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBQ0tfSVNfRVhDRVBUSU9OOgorCiAJCQlpZiAob3BzLT5zdGFjayhkYXRhLCBpZCkgPCAwKQogCQkJCWJyZWFrOwogCiAJCQlicCA9IG9wcy0+d2Fsa19zdGFjayh0aW5mbywgc3RhY2ssIGJwLCBvcHMsCi0JCQkJCSAgICAgZGF0YSwgZXN0YWNrX2VuZCwgJmdyYXBoKTsKKwkJCQkJICAgICBkYXRhLCBzdGFja19lbmQsICZncmFwaCk7CiAJCQlvcHMtPnN0YWNrKGRhdGEsICI8RU9FPiIpOwogCQkJLyoKIAkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgdmlhIHRoZQogCQkJICogc2Vjb25kLXRvLWxhc3QgcG9pbnRlciAoaW5kZXggLTIgdG8gZW5kKSBpbiB0aGUKIAkJCSAqIGV4Y2VwdGlvbiBzdGFjazoKIAkJCSAqLwotCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSBlc3RhY2tfZW5kWy0yXTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpcnFfc3RhY2tfZW5kKSB7Ci0JCQl1bnNpZ25lZCBsb25nICppcnFfc3RhY2s7Ci0JCQlpcnFfc3RhY2sgPSBpcnFfc3RhY2tfZW5kIC0KLQkJCQkoSVJRX1NUQUNLX1NJWkUgLSA2NCkgLyBzaXplb2YoKmlycV9zdGFjayk7CisJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIHN0YWNrX2VuZFstMl07CisJCQlkb25lID0gMDsKKwkJCWJyZWFrOwogCi0JCQlpZiAoaW5faXJxX3N0YWNrKHN0YWNrLCBpcnFfc3RhY2ssIGlycV9zdGFja19lbmQpKSB7Ci0JCQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJYnAgPSBvcHMtPndhbGtfc3RhY2sodGluZm8sIHN0YWNrLCBicCwKLQkJCQkJb3BzLCBkYXRhLCBpcnFfc3RhY2tfZW5kLCAmZ3JhcGgpOwotCQkJCS8qCi0JCQkJICogV2UgbGluayB0byB0aGUgbmV4dCBzdGFjayAod2hpY2ggd291bGQgYmUKLQkJCQkgKiB0aGUgcHJvY2VzcyBzdGFjayBub3JtYWxseSkgdGhlIGxhc3QKLQkJCQkgKiBwb2ludGVyIChpbmRleCAtMSB0byBlbmQpIGluIHRoZSBJUlEgc3RhY2s6Ci0JCQkJICovCi0JCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoaXJxX3N0YWNrX2VuZFstMV0pOwotCQkJCWlycV9zdGFja19lbmQgPSBOVUxMOwotCQkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQorCQljYXNlIFNUQUNLX0lTX0lSUToKKworCQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWJwID0gb3BzLT53YWxrX3N0YWNrKHRpbmZvLCBzdGFjaywgYnAsCisJCQkJICAgICBvcHMsIGRhdGEsIHN0YWNrX2VuZCwgJmdyYXBoKTsKKwkJCS8qCisJCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrICh3aGljaCB3b3VsZCBiZQorCQkJICogdGhlIHByb2Nlc3Mgc3RhY2sgbm9ybWFsbHkpIHRoZSBsYXN0CisJCQkgKiBwb2ludGVyIChpbmRleCAtMSB0byBlbmQpIGluIHRoZSBJUlEgc3RhY2s6CisJCQkgKi8KKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgKHN0YWNrX2VuZFstMV0pOworCQkJaXJxX3N0YWNrID0gTlVMTDsKKwkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOworCQkJZG9uZSA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFNUQUNLX0lTX1VOS05PV046CisJCQlvcHMtPnN0YWNrKGRhdGEsICJVTksiKTsKKwkJCWJyZWFrOwogCQl9Ci0JCWJyZWFrOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKaW5kZXggYmM0YTA4OC4uNmQ3ZDVhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwpAQCAtMjAzLDE4ICsyMDMsMTUgQEAKIAlyZXZpc2lvbiA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKG51bSwgc2xvdCwgZnVuYywgUENJX1JFVklTSU9OX0lEKTsKIAogCS8qCi0gCSAqIFJldmlzaW9uIDEzIG9mIGFsbCB0cmlnZ2VyaW5nIGRldmljZXMgaWQgaW4gdGhpcyBxdWlyayBoYXZlCi0JICogYSBwcm9ibGVtIGRyYWluaW5nIGludGVycnVwdHMgd2hlbiBpcnEgcmVtYXBwaW5nIGlzIGVuYWJsZWQsCi0JICogYW5kIHNob3VsZCBiZSBmbGFnZ2VkIGFzIGJyb2tlbi4gIEFkZGl0aW9uYWxseSByZXZpc2lvbnMgMHgxMgotCSAqIGFuZCAweDIyIG9mIGRldmljZSBpZCAweDM0MDUgaGFzIHRoaXMgcHJvYmxlbS4KKwkgKiBSZXZpc2lvbiA8PSAxMyBvZiBhbGwgdHJpZ2dlcmluZyBkZXZpY2VzIGlkIGluIHRoaXMgcXVpcmsKKwkgKiBoYXZlIGEgcHJvYmxlbSBkcmFpbmluZyBpbnRlcnJ1cHRzIHdoZW4gaXJxIHJlbWFwcGluZyBpcworCSAqIGVuYWJsZWQsIGFuZCBzaG91bGQgYmUgZmxhZ2dlZCBhcyBicm9rZW4uIEFkZGl0aW9uYWxseQorCSAqIHJldmlzaW9uIDB4MjIgb2YgZGV2aWNlIGlkIDB4MzQwNSBoYXMgdGhpcyBwcm9ibGVtLgogCSAqLwotCWlmIChyZXZpc2lvbiA9PSAweDEzKQorCWlmIChyZXZpc2lvbiA8PSAweDEzKQogCQlzZXRfaXJxX3JlbWFwcGluZ19icm9rZW4oKTsKLQllbHNlIGlmICgoZGV2aWNlID09IDB4MzQwNSkgJiYKLQkgICAgKChyZXZpc2lvbiA9PSAweDEyKSB8fAotCSAgICAgKHJldmlzaW9uID09IDB4MjIpKSkKKwllbHNlIGlmIChkZXZpY2UgPT0gMHgzNDA1ICYmIHJldmlzaW9uID09IDB4MjIpCiAJCXNldF9pcnFfcmVtYXBwaW5nX2Jyb2tlbigpOwotCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwppbmRleCBkYTg1YThlLi45M2VlZDE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKQEAgLTUyMSw3ICs1MjEsNyBAQAogewogCiAJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBocGV0X2ludGVycnVwdF9oYW5kbGVyLAotCQkJSVJRRl9USU1FUiB8IElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCQkJSVJRRl9USU1FUiB8IElSUUZfTk9CQUxBTkNJTkcsCiAJCQlkZXYtPm5hbWUsIGRldikpCiAJCXJldHVybiAtMTsKIApAQCAtNjk5LDcgKzY5OSw3IEBACiAJCS8qIEZJWE1FOiBhZGQgc2NoZWR1bGVfd29ya19vbigpICovCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihjcHUsICZ3b3JrLndvcmssIDApOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3b3JrLmNvbXBsZXRlKTsKLQkJZGVzdHJveV90aW1lcl9vbl9zdGFjaygmd29yay53b3JrLnRpbWVyKTsKKwkJZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soJndvcmsud29yayk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0RFQUQ6CiAJCWlmIChoZGV2KSB7CkBAIC03NTIsOSArNzUyLDcgQEAKIAkubWFzawkJPSBIUEVUX01BU0ssCiAJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogCS5yZXN1bWUJCT0gaHBldF9yZXN1bWVfY291bnRlciwKLSNpZmRlZiBDT05GSUdfWDg2XzY0CiAJLmFyY2hkYXRhCT0geyAudmNsb2NrX21vZGUgPSBWQ0xPQ0tfSFBFVCB9LAotI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IGhwZXRfY2xvY2tzb3VyY2VfcmVnaXN0ZXIodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwppbmRleCBkOTlmMzFkLi40MjgwNWZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycS5jCkBAIC0xMjUsNiArMTI1LDEyIEBACiAJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgcGVyX2NwdShtY2VfcG9sbF9jb3VudCwgaikpOwogCXNlcV9wcmludGYocCwgIiAgTWFjaGluZSBjaGVjayBwb2xsc1xuIik7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19IWVBFUlYpIHx8IGRlZmluZWQoQ09ORklHX1hFTikKKwlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJUSFIiKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgaXJxX3N0YXRzKGopLT5pcnFfaHZfY2FsbGJhY2tfY291bnQpOworCXNlcV9wcmludGYocCwgIiAgSHlwZXJ2aXNvciBjYWxsYmFjayBpbnRlcnJ1cHRzXG4iKTsKKyNlbmRpZgogCXNlcV9wcmludGYocCwgIiUqczogJTEwdVxuIiwgcHJlYywgIkVSUiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCiAJc2VxX3ByaW50ZihwLCAiJSpzOiAlMTB1XG4iLCBwcmVjLCAiTUlTIiwgYXRvbWljX3JlYWQoJmlycV9taXNfY291bnQpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYwppbmRleCBkN2ZjYmVkLi42M2NlODM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCkBAIC01NSwxNiArNTUsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHByaW50X3N0YWNrX292ZXJmbG93KHZvaWQpIHsgfQogI2VuZGlmCiAKLS8qCi0gKiBwZXItQ1BVIElSUSBoYW5kbGluZyBjb250ZXh0cyAodGhyZWFkIGluZm9ybWF0aW9uIGFuZCBzdGFjaykKLSAqLwotdW5pb24gaXJxX2N0eCB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICAgICAgdGluZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgc3RhY2tbVEhSRUFEX1NJWkUvc2l6ZW9mKHUzMildOwotfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKFRIUkVBRF9TSVpFKSkpOwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5pb24gaXJxX2N0eCAqLCBoYXJkaXJxX2N0eCk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5pb24gaXJxX2N0eCAqLCBzb2Z0aXJxX2N0eCk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXJxX3N0YWNrICosIGhhcmRpcnFfc3RhY2spOworREVGSU5FX1BFUl9DUFUoc3RydWN0IGlycV9zdGFjayAqLCBzb2Z0aXJxX3N0YWNrKTsKIAogc3RhdGljIHZvaWQgY2FsbF9vbl9zdGFjayh2b2lkICpmdW5jLCB2b2lkICpzdGFjaykKIHsKQEAgLTc3LDE0ICs2OSwyNiBAQAogCQkgICAgIDogIm1lbW9yeSIsICJjYyIsICJlZHgiLCAiZWN4IiwgImVheCIpOwogfQogCisvKiBob3cgdG8gZ2V0IHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgZnJvbSBDICovCisjZGVmaW5lIGN1cnJlbnRfc3RhY2tfcG9pbnRlciAoewkJXAorCXVuc2lnbmVkIGxvbmcgc3A7CQkJXAorCWFzbSgibW92ICUlZXNwLCUwIiA6ICI9ZyIgKHNwKSk7CVwKKwlzcDsJCQkJCVwKK30pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY3VycmVudF9zdGFjayh2b2lkKQoreworCXJldHVybiAodm9pZCAqKShjdXJyZW50X3N0YWNrX3BvaW50ZXIgJiB+KFRIUkVBRF9TSVpFIC0gMSkpOworfQorCiBzdGF0aWMgaW5saW5lIGludAogZXhlY3V0ZV9vbl9pcnFfc3RhY2soaW50IG92ZXJmbG93LCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBpcnEpCiB7Ci0JdW5pb24gaXJxX2N0eCAqY3VyY3R4LCAqaXJxY3R4OwotCXUzMiAqaXNwLCBhcmcxLCBhcmcyOworCXN0cnVjdCBpcnFfc3RhY2sgKmN1cnN0aywgKmlycXN0azsKKwl1MzIgKmlzcCwgKnByZXZfZXNwLCBhcmcxLCBhcmcyOwogCi0JY3VyY3R4ID0gKHVuaW9uIGlycV9jdHggKikgY3VycmVudF90aHJlYWRfaW5mbygpOwotCWlycWN0eCA9IF9fdGhpc19jcHVfcmVhZChoYXJkaXJxX2N0eCk7CisJY3Vyc3RrID0gKHN0cnVjdCBpcnFfc3RhY2sgKikgY3VycmVudF9zdGFjaygpOworCWlycXN0ayA9IF9fdGhpc19jcHVfcmVhZChoYXJkaXJxX3N0YWNrKTsKIAogCS8qCiAJICogdGhpcyBpcyB3aGVyZSB3ZSBzd2l0Y2ggdG8gdGhlIElSUSBzdGFjay4gSG93ZXZlciwgaWYgd2UgYXJlCkBAIC05MiwxMyArOTYsMTQgQEAKIAkgKiBoYW5kbGVyKSB3ZSBjYW4ndCBkbyB0aGF0IGFuZCBqdXN0IGhhdmUgdG8ga2VlcCB1c2luZyB0aGUKIAkgKiBjdXJyZW50IHN0YWNrICh3aGljaCBpcyB0aGUgaXJxIHN0YWNrIGFscmVhZHkgYWZ0ZXIgYWxsKQogCSAqLwotCWlmICh1bmxpa2VseShjdXJjdHggPT0gaXJxY3R4KSkKKwlpZiAodW5saWtlbHkoY3Vyc3RrID09IGlycXN0aykpCiAJCXJldHVybiAwOwogCi0JLyogYnVpbGQgdGhlIHN0YWNrIGZyYW1lIG9uIHRoZSBJUlEgc3RhY2sgKi8KLQlpc3AgPSAodTMyICopICgoY2hhciAqKWlycWN0eCArIHNpemVvZigqaXJxY3R4KSk7Ci0JaXJxY3R4LT50aW5mby50YXNrID0gY3VyY3R4LT50aW5mby50YXNrOwotCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCWlzcCA9ICh1MzIgKikgKChjaGFyICopaXJxc3RrICsgc2l6ZW9mKCppcnFzdGspKTsKKworCS8qIFNhdmUgdGhlIG5leHQgZXNwIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCisJcHJldl9lc3AgPSAodTMyICopaXJxc3RrOworCSpwcmV2X2VzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKIAogCWlmICh1bmxpa2VseShvdmVyZmxvdykpCiAJCWNhbGxfb25fc3RhY2socHJpbnRfc3RhY2tfb3ZlcmZsb3csIGlzcCk7CkBAIC0xMTgsNDYgKzEyMyw0MCBAQAogICovCiB2b2lkIGlycV9jdHhfaW5pdChpbnQgY3B1KQogewotCXVuaW9uIGlycV9jdHggKmlycWN0eDsKKwlzdHJ1Y3QgaXJxX3N0YWNrICppcnFzdGs7CiAKLQlpZiAocGVyX2NwdShoYXJkaXJxX2N0eCwgY3B1KSkKKwlpZiAocGVyX2NwdShoYXJkaXJxX3N0YWNrLCBjcHUpKQogCQlyZXR1cm47CiAKLQlpcnFjdHggPSBwYWdlX2FkZHJlc3MoYWxsb2NfcGFnZXNfbm9kZShjcHVfdG9fbm9kZShjcHUpLAorCWlycXN0ayA9IHBhZ2VfYWRkcmVzcyhhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCiAJCQkJCSAgICAgICBUSFJFQURJTkZPX0dGUCwKIAkJCQkJICAgICAgIFRIUkVBRF9TSVpFX09SREVSKSk7Ci0JbWVtc2V0KCZpcnFjdHgtPnRpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSk7Ci0JaXJxY3R4LT50aW5mby5jcHUJCT0gY3B1OwotCWlycWN0eC0+dGluZm8uYWRkcl9saW1pdAk9IE1BS0VfTU1fU0VHKDApOworCXBlcl9jcHUoaGFyZGlycV9zdGFjaywgY3B1KSA9IGlycXN0azsKIAotCXBlcl9jcHUoaGFyZGlycV9jdHgsIGNwdSkgPSBpcnFjdHg7Ci0KLQlpcnFjdHggPSBwYWdlX2FkZHJlc3MoYWxsb2NfcGFnZXNfbm9kZShjcHVfdG9fbm9kZShjcHUpLAorCWlycXN0ayA9IHBhZ2VfYWRkcmVzcyhhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCiAJCQkJCSAgICAgICBUSFJFQURJTkZPX0dGUCwKIAkJCQkJICAgICAgIFRIUkVBRF9TSVpFX09SREVSKSk7Ci0JbWVtc2V0KCZpcnFjdHgtPnRpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSk7Ci0JaXJxY3R4LT50aW5mby5jcHUJCT0gY3B1OwotCWlycWN0eC0+dGluZm8uYWRkcl9saW1pdAk9IE1BS0VfTU1fU0VHKDApOwotCi0JcGVyX2NwdShzb2Z0aXJxX2N0eCwgY3B1KSA9IGlycWN0eDsKKwlwZXJfY3B1KHNvZnRpcnFfc3RhY2ssIGNwdSkgPSBpcnFzdGs7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiQ1BVICV1IGlycXN0YWNrcywgaGFyZD0lcCBzb2Z0PSVwXG4iLAotCSAgICAgICBjcHUsIHBlcl9jcHUoaGFyZGlycV9jdHgsIGNwdSksICBwZXJfY3B1KHNvZnRpcnFfY3R4LCBjcHUpKTsKKwkgICAgICAgY3B1LCBwZXJfY3B1KGhhcmRpcnFfc3RhY2ssIGNwdSksICBwZXJfY3B1KHNvZnRpcnFfc3RhY2ssIGNwdSkpOwogfQogCiB2b2lkIGRvX3NvZnRpcnFfb3duX3N0YWNrKHZvaWQpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICpjdXJjdHg7Ci0JdW5pb24gaXJxX2N0eCAqaXJxY3R4OwotCXUzMiAqaXNwOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqY3Vyc3RrOworCXN0cnVjdCBpcnFfc3RhY2sgKmlycXN0azsKKwl1MzIgKmlzcCwgKnByZXZfZXNwOwogCi0JY3VyY3R4ID0gY3VycmVudF90aHJlYWRfaW5mbygpOwotCWlycWN0eCA9IF9fdGhpc19jcHVfcmVhZChzb2Z0aXJxX2N0eCk7Ci0JaXJxY3R4LT50aW5mby50YXNrID0gY3VyY3R4LT50YXNrOwotCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCWN1cnN0ayA9IGN1cnJlbnRfc3RhY2soKTsKKwlpcnFzdGsgPSBfX3RoaXNfY3B1X3JlYWQoc29mdGlycV9zdGFjayk7CiAKIAkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIHNvZnRpcnEgc3RhY2sgKi8KLQlpc3AgPSAodTMyICopICgoY2hhciAqKWlycWN0eCArIHNpemVvZigqaXJxY3R4KSk7CisJaXNwID0gKHUzMiAqKSAoKGNoYXIgKilpcnFzdGsgKyBzaXplb2YoKmlycXN0aykpOworCisJLyogUHVzaCB0aGUgcHJldmlvdXMgZXNwIG9udG8gdGhlIHN0YWNrICovCisJcHJldl9lc3AgPSAodTMyICopaXJxc3RrOworCSpwcmV2X2VzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKIAogCWNhbGxfb25fc3RhY2soX19kb19zb2Z0aXJxLCBpc3ApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21vZHVsZS5jIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCmluZGV4IDE4YmUxODkzLi5lNjlmOTg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC00MywxMyArNDQsNTIgQEAKIH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19SQU5ET01JWkVfQkFTRQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kdWxlX2xvYWRfb2Zmc2V0Oworc3RhdGljIGludCByYW5kb21pemVfbW9kdWxlcyA9IDE7CisKKy8qIE11dGV4IHByb3RlY3RzIHRoZSBtb2R1bGVfbG9hZF9vZmZzZXQuICovCitzdGF0aWMgREVGSU5FX01VVEVYKG1vZHVsZV9rYXNscl9tdXRleCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX25va2FzbHIoY2hhciAqcCkKK3sKKwlyYW5kb21pemVfbW9kdWxlcyA9IDA7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibm9rYXNsciIsIHBhcnNlX25va2FzbHIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgZ2V0X21vZHVsZV9sb2FkX29mZnNldCh2b2lkKQoreworCWlmIChyYW5kb21pemVfbW9kdWxlcykgeworCQltdXRleF9sb2NrKCZtb2R1bGVfa2FzbHJfbXV0ZXgpOworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIG1vZHVsZV9sb2FkX29mZnNldCB0aGUgZmlyc3QgdGltZSB0aGlzCisJCSAqIGNvZGUgaXMgY2FsbGVkLiBPbmNlIGNhbGN1bGF0ZWQgaXQgc3RheXMgdGhlIHNhbWUgdW50aWwKKwkJICogcmVib290LgorCQkgKi8KKwkJaWYgKG1vZHVsZV9sb2FkX29mZnNldCA9PSAwKQorCQkJbW9kdWxlX2xvYWRfb2Zmc2V0ID0KKwkJCQkoZ2V0X3JhbmRvbV9pbnQoKSAlIDEwMjQgKyAxKSAqIFBBR0VfU0laRTsKKwkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfa2FzbHJfbXV0ZXgpOworCX0KKwlyZXR1cm4gbW9kdWxlX2xvYWRfb2Zmc2V0OworfQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBnZXRfbW9kdWxlX2xvYWRfb2Zmc2V0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpZiAoUEFHRV9BTElHTihzaXplKSA+IE1PRFVMRVNfTEVOKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gX192bWFsbG9jX25vZGVfcmFuZ2Uoc2l6ZSwgMSwgTU9EVUxFU19WQUREUiwgTU9EVUxFU19FTkQsCi0JCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMX0VYRUMsCi0JCQkJTlVNQV9OT19OT0RFLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXJldHVybiBfX3ZtYWxsb2Nfbm9kZV9yYW5nZShzaXplLCAxLAorCQkJCSAgICBNT0RVTEVTX1ZBRERSICsgZ2V0X21vZHVsZV9sb2FkX29mZnNldCgpLAorCQkJCSAgICBNT0RVTEVTX0VORCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sCisJCQkJICAgIFBBR0VfS0VSTkVMX0VYRUMsIE5VTUFfTk9fTk9ERSwKKwkJCQkgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfMzIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2L2tlcm5lbC9ubWkuYwppbmRleCA2ZmNiNDljLi5iNDg3MmI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL25taS5jCkBAIC04Nyw2ICs4Nyw3IEBACiAjZGVmaW5lIG5taV90b19kZXNjKHR5cGUpICgmbm1pX2Rlc2NbdHlwZV0pCiAKIHN0YXRpYyB1NjQgbm1pX2xvbmdlc3RfbnMgPSAxICogTlNFQ19QRVJfTVNFQzsKKwogc3RhdGljIGludCBfX2luaXQgbm1pX3dhcm5pbmdfZGVidWdmcyh2b2lkKQogewogCWRlYnVnZnNfY3JlYXRlX3U2NCgibm1pX2xvbmdlc3RfbnMiLCAwNjQ0LApAQCAtOTUsNiArOTYsMjAgQEAKIH0KIGZzX2luaXRjYWxsKG5taV93YXJuaW5nX2RlYnVnZnMpOwogCitzdGF0aWMgdm9pZCBubWlfbWF4X2hhbmRsZXIoc3RydWN0IGlycV93b3JrICp3KQoreworCXN0cnVjdCBubWlhY3Rpb24gKmEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IG5taWFjdGlvbiwgaXJxX3dvcmspOworCWludCByZW1haW5kZXJfbnMsIGRlY2ltYWxfbXNlY3M7CisJdTY0IHdob2xlX21zZWNzID0gQUNDRVNTX09OQ0UoYS0+bWF4X2R1cmF0aW9uKTsKKworCXJlbWFpbmRlcl9ucyA9IGRvX2Rpdih3aG9sZV9tc2VjcywgKDEwMDAgKiAxMDAwKSk7CisJZGVjaW1hbF9tc2VjcyA9IHJlbWFpbmRlcl9ucyAvIDEwMDA7CisKKwlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCisJCSJJTkZPOiBOTUkgaGFuZGxlciAoJXBzKSB0b29rIHRvbyBsb25nIHRvIHJ1bjogJWxsZC4lMDNkIG1zZWNzXG4iLAorCQlhLT5oYW5kbGVyLCB3aG9sZV9tc2VjcywgZGVjaW1hbF9tc2Vjcyk7Cit9CisKIHN0YXRpYyBpbnQgX19rcHJvYmVzIG5taV9oYW5kbGUodW5zaWduZWQgaW50IHR5cGUsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBib29sIGIyYikKIHsKIAlzdHJ1Y3Qgbm1pX2Rlc2MgKmRlc2MgPSBubWlfdG9fZGVzYyh0eXBlKTsKQEAgLTExMCwyNiArMTI1LDIwIEBACiAJICogdG8gaGFuZGxlIHRob3NlIHNpdHVhdGlvbnMuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYSwgJmRlc2MtPmhlYWQsIGxpc3QpIHsKLQkJdTY0IGJlZm9yZSwgZGVsdGEsIHdob2xlX21zZWNzOwotCQlpbnQgcmVtYWluZGVyX25zLCBkZWNpbWFsX21zZWNzLCB0aGlzaGFuZGxlZDsKKwkJaW50IHRoaXNoYW5kbGVkOworCQl1NjQgZGVsdGE7CiAKLQkJYmVmb3JlID0gc2NoZWRfY2xvY2soKTsKKwkJZGVsdGEgPSBzY2hlZF9jbG9jaygpOwogCQl0aGlzaGFuZGxlZCA9IGEtPmhhbmRsZXIodHlwZSwgcmVncyk7CiAJCWhhbmRsZWQgKz0gdGhpc2hhbmRsZWQ7Ci0JCWRlbHRhID0gc2NoZWRfY2xvY2soKSAtIGJlZm9yZTsKKwkJZGVsdGEgPSBzY2hlZF9jbG9jaygpIC0gZGVsdGE7CiAJCXRyYWNlX25taV9oYW5kbGVyKGEtPmhhbmRsZXIsIChpbnQpZGVsdGEsIHRoaXNoYW5kbGVkKTsKIAotCQlpZiAoZGVsdGEgPCBubWlfbG9uZ2VzdF9ucykKKwkJaWYgKGRlbHRhIDwgbm1pX2xvbmdlc3RfbnMgfHwgZGVsdGEgPCBhLT5tYXhfZHVyYXRpb24pCiAJCQljb250aW51ZTsKIAotCQlubWlfbG9uZ2VzdF9ucyA9IGRlbHRhOwotCQl3aG9sZV9tc2VjcyA9IGRlbHRhOwotCQlyZW1haW5kZXJfbnMgPSBkb19kaXYod2hvbGVfbXNlY3MsICgxMDAwICogMTAwMCkpOwotCQlkZWNpbWFsX21zZWNzID0gcmVtYWluZGVyX25zIC8gMTAwMDsKLQkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fSU5GTwotCQkJIklORk86IE5NSSBoYW5kbGVyICglcHMpIHRvb2sgdG9vIGxvbmcgdG8gcnVuOiAiCi0JCQkiJWxsZC4lMDNkIG1zZWNzXG4iLCBhLT5oYW5kbGVyLCB3aG9sZV9tc2VjcywKLQkJCWRlY2ltYWxfbXNlY3MpOworCQlhLT5tYXhfZHVyYXRpb24gPSBkZWx0YTsKKwkJaXJxX3dvcmtfcXVldWUoJmEtPmlycV93b3JrKTsKIAl9CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTE0Niw2ICsxNTUsOCBAQAogCWlmICghYWN0aW9uLT5oYW5kbGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWluaXRfaXJxX3dvcmsoJmFjdGlvbi0+aXJxX3dvcmssIG5taV9tYXhfaGFuZGxlcik7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDNmYjhkOTUuLjQ1MDVlMmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjk4LDEwICsyOTgsNyBAQAogICovCiB2b2lkIGFyY2hfY3B1X2lkbGUodm9pZCkKIHsKLQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKLQkJeDg2X2lkbGUoKTsKLQllbHNlCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwl4ODZfaWRsZSgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggMGRlNDNlOS4uN2JjODZiYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC0zMTQsNiArMzE0LDEwIEBACiAJICovCiAJYXJjaF9lbmRfY29udGV4dF9zd2l0Y2gobmV4dF9wKTsKIAorCXRoaXNfY3B1X3dyaXRlKGtlcm5lbF9zdGFjaywKKwkJICAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UobmV4dF9wKSArCisJCSAgVEhSRUFEX1NJWkUgLSBLRVJORUxfU1RBQ0tfT0ZGU0VUKTsKKwogCS8qCiAJICogUmVzdG9yZSAlZ3MgaWYgbmVlZGVkICh3aGljaCBpcyBjb21tb24pCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNzQ2MWY1MC4uNjc4YzBhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYwpAQCAtMTg0LDE0ICsxODQsMTQgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGNvbnRleHQgPSAodW5zaWduZWQgbG9uZylyZWdzICYgfihUSFJFQURfU0laRSAtIDEpOwogCXVuc2lnbmVkIGxvbmcgc3AgPSAodW5zaWduZWQgbG9uZykmcmVncy0+c3A7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbzsKKwl1MzIgKnByZXZfZXNwOwogCiAJaWYgKGNvbnRleHQgPT0gKHNwICYgfihUSFJFQURfU0laRSAtIDEpKSkKIAkJcmV0dXJuIHNwOwogCi0JdGluZm8gPSAoc3RydWN0IHRocmVhZF9pbmZvICopY29udGV4dDsKLQlpZiAodGluZm8tPnByZXZpb3VzX2VzcCkKLQkJcmV0dXJuIHRpbmZvLT5wcmV2aW91c19lc3A7CisJcHJldl9lc3AgPSAodTMyICopKGNvbnRleHQpOworCWlmIChwcmV2X2VzcCkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKXByZXZfZXNwOwogCiAJcmV0dXJuICh1bnNpZ25lZCBsb25nKXJlZ3M7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggYzc1MmNiNC4uNjU0YjQ2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtNDY0LDkgKzQ2NCwxMiBAQAogICogMikgSWYgc3RpbGwgYWxpdmUsIHdyaXRlIHRvIHRoZSBrZXlib2FyZCBjb250cm9sbGVyCiAgKiAzKSBJZiBzdGlsbCBhbGl2ZSwgd3JpdGUgdG8gdGhlIEFDUEkgcmVib290IHJlZ2lzdGVyIGFnYWluCiAgKiA0KSBJZiBzdGlsbCBhbGl2ZSwgd3JpdGUgdG8gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIgYWdhaW4KKyAqIDUpIElmIHN0aWxsIGFsaXZlLCBjYWxsIHRoZSBFRkkgcnVudGltZSBzZXJ2aWNlIHRvIHJlYm9vdAorICogNikgSWYgc3RpbGwgYWxpdmUsIHdyaXRlIHRvIHRoZSBQQ0kgSU8gcG9ydCAweENGOSB0byByZWJvb3QKKyAqIDcpIElmIHN0aWxsIGFsaXZlLCBpbmZvcm0gQklPUyB0byBkbyBhIHByb3BlciByZWJvb3QKICAqCiAgKiBJZiB0aGUgbWFjaGluZSBpcyBzdGlsbCBhbGl2ZSBhdCB0aGlzIHN0YWdlLCBpdCBnaXZlcyB1cC4gV2UgZGVmYXVsdCB0bwotICogZm9sbG93aW5nIHRoZSBzYW1lIHBhdHRlcm4sIGV4Y2VwdCB0aGF0IGlmIHdlJ3JlIHN0aWxsIGFsaXZlIGFmdGVyICg0KSB3ZSdsbAorICogZm9sbG93aW5nIHRoZSBzYW1lIHBhdHRlcm4sIGV4Y2VwdCB0aGF0IGlmIHdlJ3JlIHN0aWxsIGFsaXZlIGFmdGVyICg3KSB3ZSdsbAogICogdHJ5IHRvIGZvcmNlIGEgdHJpcGxlIGZhdWx0IGFuZCB0aGVuIGN5Y2xlIGJldHdlZW4gaGl0dGluZyB0aGUga2V5Ym9hcmQKICAqIGNvbnRyb2xsZXIgYW5kIGRvaW5nIHRoYXQKICAqLwpAQCAtNTAyLDcgKzUwNSw3IEBACiAJCQkJYXR0ZW1wdCA9IDE7CiAJCQkJcmVib290X3R5cGUgPSBCT09UX0FDUEk7CiAJCQl9IGVsc2UgewotCQkJCXJlYm9vdF90eXBlID0gQk9PVF9UUklQTEU7CisJCQkJcmVib290X3R5cGUgPSBCT09UX0VGSTsKIAkJCX0KIAkJCWJyZWFrOwogCkBAIC01MTAsMTMgKzUxMywxNSBAQAogCQkJbG9hZF9pZHQoJm5vX2lkdCk7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50MyIpOwogCisJCQkvKiBXZSdyZSBwcm9iYWJseSBkZWFkIGFmdGVyIHRoaXMsIGJ1dC4uLiAqLwogCQkJcmVib290X3R5cGUgPSBCT09UX0tCRDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQk9PVF9CSU9TOgogCQkJbWFjaGluZV9yZWFsX3Jlc3RhcnQoTVJSX0JJT1MpOwogCi0JCQlyZWJvb3RfdHlwZSA9IEJPT1RfS0JEOworCQkJLyogV2UncmUgcHJvYmFibHkgZGVhZCBhZnRlciB0aGlzLCBidXQuLi4gKi8KKwkJCXJlYm9vdF90eXBlID0gQk9PVF9UUklQTEU7CiAJCQlicmVhazsKIAogCQljYXNlIEJPT1RfQUNQSToKQEAgLTUzMCw3ICs1MzUsNyBAQAogCQkJCQkJIEVGSV9SRVNFVF9XQVJNIDoKIAkJCQkJCSBFRklfUkVTRVRfQ09MRCwKIAkJCQkJCSBFRklfU1VDQ0VTUywgMCwgTlVMTCk7Ci0JCQlyZWJvb3RfdHlwZSA9IEJPT1RfS0JEOworCQkJcmVib290X3R5cGUgPSBCT09UX0NGOV9DT05EOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBCT09UX0NGOToKQEAgLTU0OCw3ICs1NTMsNyBAQAogCQkJCW91dGIoY2Y5fHJlYm9vdF9jb2RlLCAweGNmOSk7CiAJCQkJdWRlbGF5KDUwKTsKIAkJCX0KLQkJCXJlYm9vdF90eXBlID0gQk9PVF9LQkQ7CisJCQlyZWJvb3RfdHlwZSA9IEJPT1RfQklPUzsKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCBjZTcyOTY0Li4wOWM3NmQyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtODY5LDcgKzg2OSw2IEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJbWVtY3B5KCZib290X2NwdV9kYXRhLCAmbmV3X2NwdV9kYXRhLCBzaXplb2YobmV3X2NwdV9kYXRhKSk7Ci0Jdmlzd3NfZWFybHlfZGV0ZWN0KCk7CiAKIAkvKgogCSAqIGNvcHkga2VybmVsIGFkZHJlc3MgcmFuZ2UgZXN0YWJsaXNoZWQgc28gZmFyIGFuZCBzd2l0Y2gKQEAgLTkyNiwxMSArOTI1LDExIEBACiAjaWZkZWYgQ09ORklHX0VGSQogCWlmICghc3RybmNtcCgoY2hhciAqKSZib290X3BhcmFtcy5lZmlfaW5mby5lZmlfbG9hZGVyX3NpZ25hdHVyZSwKIAkJICAgICAiRUwzMiIsIDQpKSB7Ci0JCXNldF9iaXQoRUZJX0JPT1QsICZ4ODZfZWZpX2ZhY2lsaXR5KTsKKwkJc2V0X2JpdChFRklfQk9PVCwgJmVmaS5mbGFncyk7CiAJfSBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKSZib290X3BhcmFtcy5lZmlfaW5mby5lZmlfbG9hZGVyX3NpZ25hdHVyZSwKIAkJICAgICAiRUw2NCIsIDQpKSB7Ci0JCXNldF9iaXQoRUZJX0JPT1QsICZ4ODZfZWZpX2ZhY2lsaXR5KTsKLQkJc2V0X2JpdChFRklfNjRCSVQsICZ4ODZfZWZpX2ZhY2lsaXR5KTsKKwkJc2V0X2JpdChFRklfQk9PVCwgJmVmaS5mbGFncyk7CisJCXNldF9iaXQoRUZJXzY0QklULCAmZWZpLmZsYWdzKTsKIAl9CiAKIAlpZiAoZWZpX2VuYWJsZWQoRUZJX0JPT1QpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggYTMyZGE4MC4uMzQ4MjY5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC0xMjIsOCArMTIyLDkgQEAKIAkgKiBTaW5jZSBDUFUwIGlzIG5vdCB3YWtlbmVkIHVwIGJ5IElOSVQsIGl0IGRvZXNuJ3Qgd2FpdCBmb3IgdGhlIElQSS4KIAkgKi8KIAljcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoYXBpYy0+d2FpdF9mb3JfaW5pdF9kZWFzc2VydCAmJiBjcHVpZCAhPSAwKQotCQlhcGljLT53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0KCZpbml0X2RlYXNzZXJ0ZWQpOworCWlmIChhcGljLT53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0ICYmIGNwdWlkKQorCQl3aGlsZSAoIWF0b21pY19yZWFkKCZpbml0X2RlYXNzZXJ0ZWQpKQorCQkJY3B1X3JlbGF4KCk7CiAKIAkvKgogCSAqIChUaGlzIHdvcmtzIGV2ZW4gaWYgdGhlIEFQSUMgaXMgbm90IGVuYWJsZWQuKQpAQCAtNzAxLDExICs3MDIsMTUgQEAKIAlpbnQgaWQ7CiAJaW50IGJvb3RfZXJyb3I7CiAKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwogCS8qCiAJICogV2FrZSB1cCBBUCBieSBJTklULCBJTklULCBTVEFSVFVQIHNlcXVlbmNlLgogCSAqLwotCWlmIChjcHUpCi0JCXJldHVybiB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfaW5pdChhcGljaWQsIHN0YXJ0X2lwKTsKKwlpZiAoY3B1KSB7CisJCWJvb3RfZXJyb3IgPSB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfaW5pdChhcGljaWQsIHN0YXJ0X2lwKTsKKwkJZ290byBvdXQ7CisJfQogCiAJLyoKIAkgKiBXYWtlIHVwIEJTUCBieSBubWkuCkBAIC03MjUsNiArNzMwLDkgQEAKIAkJYm9vdF9lcnJvciA9IHdha2V1cF9zZWNvbmRhcnlfY3B1X3ZpYV9ubWkoaWQsIHN0YXJ0X2lwKTsKIAl9CiAKK291dDoKKwlwcmVlbXB0X2VuYWJsZSgpOworCiAJcmV0dXJuIGJvb3RfZXJyb3I7CiB9CiAKQEAgLTc1OCwxMCArNzY2LDEwIEBACiAjZWxzZQogCWNsZWFyX3Rza190aHJlYWRfZmxhZyhpZGxlLCBUSUZfRk9SSyk7CiAJaW5pdGlhbF9ncyA9IHBlcl9jcHVfb2Zmc2V0KGNwdSk7CisjZW5kaWYKIAlwZXJfY3B1KGtlcm5lbF9zdGFjaywgY3B1KSA9CiAJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShpZGxlKSAtCiAJCUtFUk5FTF9TVEFDS19PRkZTRVQgKyBUSFJFQURfU0laRTsKLSNlbmRpZgogCWVhcmx5X2dkdF9kZXNjci5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpZ2V0X2NwdV9nZHRfdGFibGUoY3B1KTsKIAlpbml0aWFsX2NvZGUgPSAodW5zaWduZWQgbG9uZylzdGFydF9zZWNvbmRhcnk7CiAJc3RhY2tfc3RhcnQgID0gaWRsZS0+dGhyZWFkLnNwOwpAQCAtMTM3OSw3ICsxMzg3LDcgQEAKIAogCWlmICghdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX01XQUlUKSkKIAkJcmV0dXJuOwotCWlmICghdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkpCisJaWYgKCF0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFVTSCkpCiAJCXJldHVybjsKIAlpZiAoX190aGlzX2NwdV9yZWFkKGNwdV9pbmZvLmNwdWlkX2xldmVsKSA8IENQVUlEX01XQUlUX0xFQUYpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCmluZGV4IDI0ZDNjOTEuLmJmN2VmNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci1ERUZJTkVfVlZBUih2b2xhdGlsZSB1bnNpZ25lZCBsb25nLCBqaWZmaWVzKSA9IElOSVRJQUxfSklGRklFUzsKK19fdmlzaWJsZSBERUZJTkVfVlZBUih2b2xhdGlsZSB1bnNpZ25lZCBsb25nLCBqaWZmaWVzKSA9IElOSVRJQUxfSklGRklFUzsKICNlbmRpZgogCiB1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC02Miw3ICs2Miw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgID0gewogCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAotCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HIHwgSVJRRl9JUlFQT0xMIHwgSVJRRl9USU1FUiwKKwkuZmxhZ3MgPSBJUlFGX05PQkFMQU5DSU5HIHwgSVJRRl9JUlFQT0xMIHwgSVJRRl9USU1FUiwKIAkubmFtZSA9ICJ0aW1lciIKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCA3YTkyOTZhLi41N2U1Y2UxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC05ODQsOSArOTg0LDcgQEAKIAkubWFzayAgICAgICAgICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAogCS5mbGFncyAgICAgICAgICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMgfAogCQkJCSAgQ0xPQ0tfU09VUkNFX01VU1RfVkVSSUZZLAotI2lmZGVmIENPTkZJR19YODZfNjQKIAkuYXJjaGRhdGEgICAgICAgICAgICAgICA9IHsgLnZjbG9ja19tb2RlID0gVkNMT0NLX1RTQyB9LAotI2VuZGlmCiB9OwogCiB2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKGNoYXIgKnJlYXNvbikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZGE2YjM1YS4uNDllZGYyZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE0Nyw3ICsxNDcsNiBAQAogCQlfZWRhdGEgPSAuOwogCX0gOmRhdGEKIAotI2lmZGVmIENPTkZJR19YODZfNjQKIAogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9fdnZhcl9wYWdlID0gLjsKQEAgLTE2NSwxMiArMTY0LDE1IEBACiAjdW5kZWYgX19WVkFSX0tFUk5FTF9MRFMKICN1bmRlZiBFTUlUX1ZWQVIKIAorCQkvKgorCQkgKiBQYWQgdGhlIHJlc3Qgb2YgdGhlIHBhZ2Ugd2l0aCB6ZXJvcy4gIE90aGVyd2lzZSB0aGUgbG9hZGVyCisJCSAqIGNhbiBsZWF2ZSBnYXJiYWdlIGhlcmUuCisJCSAqLworCQkuID0gX192dmFyX2JlZ2lubmluZ19oYWNrICsgUEFHRV9TSVpFOwogCX0gOmRhdGEKIAogICAgICAgIC4gPSBBTElHTihfX3Z2YXJfcGFnZSArIFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKIAotI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KLQogCS8qIEluaXQgY29kZSBhbmQgZGF0YSAtIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgaW5pdCAqLwogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCS5pbml0LmJlZ2luIDogQVQoQUREUiguaW5pdC5iZWdpbikgLSBMT0FEX09GRlNFVCkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCAxZjk2ZjkzLi45ZWEyODc2NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMKQEAgLTQ3LDE0ICs0NywxMiBAQAogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KLSNpbmNsdWRlIDxhc20vdmd0b2QuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAidnN5c2NhbGxfdHJhY2UuaCIKIAogREVGSU5FX1ZWQVIoaW50LCB2Z2V0Y3B1X21vZGUpOwotREVGSU5FX1ZWQVIoc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSwgdnN5c2NhbGxfZ3RvZF9kYXRhKTsKIAogc3RhdGljIGVudW0geyBFTVVMQVRFLCBOQVRJVkUsIE5PTkUgfSB2c3lzY2FsbF9tb2RlID0gRU1VTEFURTsKIApAQCAtNzcsNDggKzc1LDYgQEAKIH0KIGVhcmx5X3BhcmFtKCJ2c3lzY2FsbCIsIHZzeXNjYWxsX3NldHVwKTsKIAotdm9pZCB1cGRhdGVfdnN5c2NhbGxfdHoodm9pZCkKLXsKLQl2c3lzY2FsbF9ndG9kX2RhdGEuc3lzX3R6ID0gc3lzX3R6OwotfQotCi12b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZWtlZXBlciAqdGspCi17Ci0Jc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqdmRhdGEgPSAmdnN5c2NhbGxfZ3RvZF9kYXRhOwotCi0Jd3JpdGVfc2VxY291bnRfYmVnaW4oJnZkYXRhLT5zZXEpOwotCi0JLyogY29weSB2c3lzY2FsbCBkYXRhICovCi0JdmRhdGEtPmNsb2NrLnZjbG9ja19tb2RlCT0gdGstPmNsb2NrLT5hcmNoZGF0YS52Y2xvY2tfbW9kZTsKLQl2ZGF0YS0+Y2xvY2suY3ljbGVfbGFzdAkJPSB0ay0+Y2xvY2stPmN5Y2xlX2xhc3Q7Ci0JdmRhdGEtPmNsb2NrLm1hc2sJCT0gdGstPmNsb2NrLT5tYXNrOwotCXZkYXRhLT5jbG9jay5tdWx0CQk9IHRrLT5tdWx0OwotCXZkYXRhLT5jbG9jay5zaGlmdAkJPSB0ay0+c2hpZnQ7Ci0KLQl2ZGF0YS0+d2FsbF90aW1lX3NlYwkJPSB0ay0+eHRpbWVfc2VjOwotCXZkYXRhLT53YWxsX3RpbWVfc25zZWMJCT0gdGstPnh0aW1lX25zZWM7Ci0KLQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc2VjCT0gdGstPnh0aW1lX3NlYwotCQkJCQkrIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWM7Ci0JdmRhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjCT0gdGstPnh0aW1lX25zZWMKLQkJCQkJKyAodGstPndhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMKLQkJCQkJCTw8IHRrLT5zaGlmdCk7Ci0Jd2hpbGUgKHZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYyA+PQotCQkJCQkoKCh1NjQpTlNFQ19QRVJfU0VDKSA8PCB0ay0+c2hpZnQpKSB7Ci0JCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYyAtPQotCQkJCQkoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT5zaGlmdDsKLQkJdmRhdGEtPm1vbm90b25pY190aW1lX3NlYysrOwotCX0KLQotCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlLnR2X3NlYwk9IHRrLT54dGltZV9zZWM7Ci0JdmRhdGEtPndhbGxfdGltZV9jb2Fyc2UudHZfbnNlYwk9IChsb25nKSh0ay0+eHRpbWVfbnNlYyA+PiB0ay0+c2hpZnQpOwotCi0JdmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZQk9IHRpbWVzcGVjX2FkZCh2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZSwKLQkJCQkJCQl0ay0+d2FsbF90b19tb25vdG9uaWMpOwotCi0Jd3JpdGVfc2VxY291bnRfZW5kKCZ2ZGF0YS0+c2VxKTsKLX0KLQogc3RhdGljIHZvaWQgd2Fybl9iYWRfdnN5c2NhbGwoY29uc3QgY2hhciAqbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKQEAgLTM3NCw3ICszMzAsNiBAQAogewogCWV4dGVybiBjaGFyIF9fdnN5c2NhbGxfcGFnZTsKIAl1bnNpZ25lZCBsb25nIHBoeXNhZGRyX3ZzeXNjYWxsID0gX19wYV9zeW1ib2woJl9fdnN5c2NhbGxfcGFnZSk7Ci0JZXh0ZXJuIGNoYXIgX192dmFyX3BhZ2U7CiAJdW5zaWduZWQgbG9uZyBwaHlzYWRkcl92dmFyX3BhZ2UgPSBfX3BhX3N5bWJvbCgmX192dmFyX3BhZ2UpOwogCiAJX19zZXRfZml4bWFwKFZTWVNDQUxMX0ZJUlNUX1BBR0UsIHBoeXNhZGRyX3ZzeXNjYWxsLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsX2d0b2QuYyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9ndG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljNmU1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9ndG9kLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+IFN1U0UKKyAqICBDb3B5cmlnaHQgMjAwMyBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCisgKgorICogIE1vZGlmaWVkIGZvciB4ODYgMzIgYml0IGFyY2hpdGVjdHVyZSBieQorICogIFN0ZWZhbmkgU2VpYm9sZCA8c3RlZmFuaUBzZWlib2xkLm5ldD4KKyAqICBzcG9uc29yZWQgYnkgUm9oZGUgJiBTY2h3YXJ6IEdtYkggJiBDby4gS0cgTXVuaWNoL0dlcm1hbnkKKyAqCisgKiAgVGhhbmtzIHRvIGhwYUB0cmFuc21ldGEuY29tIGZvciBzb21lIHVzZWZ1bCBoaW50LgorICogIFNwZWNpYWwgdGhhbmtzIHRvIEluZ28gTW9sbmFyIGZvciBoaXMgZWFybHkgZXhwZXJpZW5jZSB3aXRoCisgKiAgYSBkaWZmZXJlbnQgdnN5c2NhbGwgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4L0lBMzIgYW5kIGZvciB0aGUgbmFtZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWVrZWVwZXJfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxhc20vdmd0b2QuaD4KKyNpbmNsdWRlIDxhc20vdnZhci5oPgorCitERUZJTkVfVlZBUihzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhLCB2c3lzY2FsbF9ndG9kX2RhdGEpOworCit2b2lkIHVwZGF0ZV92c3lzY2FsbF90eih2b2lkKQoreworCXZzeXNjYWxsX2d0b2RfZGF0YS50el9taW51dGVzd2VzdCA9IHN5c190ei50el9taW51dGVzd2VzdDsKKwl2c3lzY2FsbF9ndG9kX2RhdGEudHpfZHN0dGltZSA9IHN5c190ei50el9kc3R0aW1lOworfQorCit2b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZWtlZXBlciAqdGspCit7CisJc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqdmRhdGEgPSAmdnN5c2NhbGxfZ3RvZF9kYXRhOworCisJZ3RvZF93cml0ZV9iZWdpbih2ZGF0YSk7CisKKwkvKiBjb3B5IHZzeXNjYWxsIGRhdGEgKi8KKwl2ZGF0YS0+dmNsb2NrX21vZGUJPSB0ay0+Y2xvY2stPmFyY2hkYXRhLnZjbG9ja19tb2RlOworCXZkYXRhLT5jeWNsZV9sYXN0CT0gdGstPmNsb2NrLT5jeWNsZV9sYXN0OworCXZkYXRhLT5tYXNrCQk9IHRrLT5jbG9jay0+bWFzazsKKwl2ZGF0YS0+bXVsdAkJPSB0ay0+bXVsdDsKKwl2ZGF0YS0+c2hpZnQJCT0gdGstPnNoaWZ0OworCisJdmRhdGEtPndhbGxfdGltZV9zZWMJCT0gdGstPnh0aW1lX3NlYzsKKwl2ZGF0YS0+d2FsbF90aW1lX3Nuc2VjCQk9IHRrLT54dGltZV9uc2VjOworCisJdmRhdGEtPm1vbm90b25pY190aW1lX3NlYwk9IHRrLT54dGltZV9zZWMKKwkJCQkJKyB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOworCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYwk9IHRrLT54dGltZV9uc2VjCisJCQkJCSsgKHRrLT53YWxsX3RvX21vbm90b25pYy50dl9uc2VjCisJCQkJCQk8PCB0ay0+c2hpZnQpOworCXdoaWxlICh2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgPj0KKwkJCQkJKCgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnNoaWZ0KSkgeworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgLT0KKwkJCQkJKCh1NjQpTlNFQ19QRVJfU0VDKSA8PCB0ay0+c2hpZnQ7CisJCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zZWMrKzsKKwl9CisKKwl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9zZWMJPSB0ay0+eHRpbWVfc2VjOworCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlX25zZWMJPSAobG9uZykodGstPnh0aW1lX25zZWMgPj4gdGstPnNoaWZ0KTsKKworCXZkYXRhLT5tb25vdG9uaWNfdGltZV9jb2Fyc2Vfc2VjID0KKwkJdmRhdGEtPndhbGxfdGltZV9jb2Fyc2Vfc2VjICsgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKKwl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX25zZWMgPQorCQl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9uc2VjICsgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X25zZWM7CisKKwl3aGlsZSAodmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZV9uc2VjID49IE5TRUNfUEVSX1NFQykgeworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX25zZWMgLT0gTlNFQ19QRVJfU0VDOworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX3NlYysrOworCX0KKworCWd0b2Rfd3JpdGVfZW5kKHZkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9jcHVpZC5jIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKaW5kZXggYzY5NzYyNS4uZTU1MDNkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2NwdWlkLmMKKysrIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQlGKFRTQykgfCBGKE1TUikgfCBGKFBBRSkgfCBGKE1DRSkgfAogCQlGKENYOCkgfCBGKEFQSUMpIHwgMCAvKiBSZXNlcnZlZCAqLyB8IEYoU0VQKSB8CiAJCUYoTVRSUikgfCBGKFBHRSkgfCBGKE1DQSkgfCBGKENNT1YpIHwKLQkJRihQQVQpIHwgRihQU0UzNikgfCAwIC8qIFBTTiAqLyB8IEYoQ0xGTFNIKSB8CisJCUYoUEFUKSB8IEYoUFNFMzYpIHwgMCAvKiBQU04gKi8gfCBGKENMRkxVU0gpIHwKIAkJMCAvKiBSZXNlcnZlZCwgRFMsIEFDUEkgKi8gfCBGKE1NWCkgfAogCQlGKEZYU1IpIHwgRihYTU0pIHwgRihYTU0yKSB8IEYoU0VMRlNOT09QKSB8CiAJCTAgLyogSFRULCBUTSwgUmVzZXJ2ZWQsIFBCRSAqLzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9oYXNoLmMgYi9hcmNoL3g4Ni9saWIvaGFzaC5jCmluZGV4IDMwNTY3MDIuLmZmNGZhNTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9oYXNoLmMKKysrIGIvYXJjaC94ODYvbGliL2hhc2guYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CkBAIC0zOSw3ICs0MCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBjcmMzMl91MzIodTMyIGNyYywgdTMyIHZhbCkKIHsKKyNpZmRlZiBDT05GSUdfQVNfQ1JDMzIKIAlhc20gKCJjcmMzMmwgJTEsJTBcbiIgOiAiK3IiIChjcmMpIDogInJtIiAodmFsKSk7CisjZWxzZQorCWFzbSAoIi5ieXRlIDB4ZjIsIDB4MGYsIDB4MzgsIDB4ZjEsIDB4YzEiIDogIithIiAoY3JjKSA6ICJjIiAodmFsKSk7CisjZW5kaWYKIAlyZXR1cm4gY3JjOwogfQogCkBAIC00OSwxOSArNTQsMTggQEAKIAl1MzIgaSwgdG1wID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpKyspCi0JCXNlZWQgPSBjcmMzMl91MzIoKnAzMisrLCBzZWVkKTsKKwkJc2VlZCA9IGNyYzMyX3UzMihzZWVkLCAqcDMyKyspOwogCi0Jc3dpdGNoICgzIC0gKGxlbiAmIDB4MDMpKSB7Ci0JY2FzZSAwOgorCXN3aXRjaCAobGVuICYgMykgeworCWNhc2UgMzoKIAkJdG1wIHw9ICooKGNvbnN0IHU4ICopIHAzMiArIDIpIDw8IDE2OwogCQkvKiBmYWxsdGhyb3VnaCAqLwotCWNhc2UgMToKKwljYXNlIDI6CiAJCXRtcCB8PSAqKChjb25zdCB1OCAqKSBwMzIgKyAxKSA8PCA4OwogCQkvKiBmYWxsdGhyb3VnaCAqLwotCWNhc2UgMjoKKwljYXNlIDE6CiAJCXRtcCB8PSAqKChjb25zdCB1OCAqKSBwMzIpOwotCQlzZWVkID0gY3JjMzJfdTMyKHRtcCwgc2VlZCk7Ci0JZGVmYXVsdDoKKwkJc2VlZCA9IGNyYzMyX3UzMihzZWVkLCB0bXApOwogCQlicmVhazsKIAl9CiAKQEAgLTc0LDEyICs3OCwxMiBAQAogCXUzMiBpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlzZWVkID0gY3JjMzJfdTMyKCpwMzIrKywgc2VlZCk7CisJCXNlZWQgPSBjcmMzMl91MzIoc2VlZCwgKnAzMisrKTsKIAogCXJldHVybiBzZWVkOwogfQogCi12b2lkIHNldHVwX2FyY2hfZmFzdF9oYXNoKHN0cnVjdCBmYXN0X2hhc2hfb3BzICpvcHMpCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoX2Zhc3RfaGFzaChzdHJ1Y3QgZmFzdF9oYXNoX29wcyAqb3BzKQogewogCWlmIChjcHVfaGFzX3htbTRfMikgewogCQlvcHMtPmhhc2ggID0gaW50ZWxfY3JjNF8yX2hhc2g7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbWVtY3B5XzMyLmMgYi9hcmNoL3g4Ni9saWIvbWVtY3B5XzMyLmMKaW5kZXggZTc4NzYxZC4uYTQwNGI0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL21lbWNweV8zMi5jCisrKyBiL2FyY2gveDg2L2xpYi9tZW1jcHlfMzIuYwpAQCAtNCw3ICs0LDcgQEAKICN1bmRlZiBtZW1jcHkKICN1bmRlZiBtZW1zZXQKIAotdm9pZCAqbWVtY3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKK19fdmlzaWJsZSB2b2lkICptZW1jcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQogewogI2lmZGVmIENPTkZJR19YODZfVVNFXzNETk9XCiAJcmV0dXJuIF9fbWVtY3B5M2QodG8sIGZyb20sIG4pOwpAQCAtMTQsMTMgKzE0LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKG1lbWNweSk7CiAKLXZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IGNvdW50KQorX192aXNpYmxlIHZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IGNvdW50KQogewogCXJldHVybiBfX21lbXNldChzLCBjLCBjb3VudCk7CiB9CiBFWFBPUlRfU1lNQk9MKG1lbXNldCk7CiAKLXZvaWQgKm1lbW1vdmUodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK19fdmlzaWJsZSB2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCiB7CiAJaW50IGQwLGQxLGQyLGQzLGQ0LGQ1OwogCWNoYXIgKnJldCA9IGRlc3Q7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbXNyLmMgYi9hcmNoL3g4Ni9saWIvbXNyLmMKaW5kZXggOGY4ZWViZC4uZGI5ZGI0NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL21zci5jCisrKyBiL2FyY2gveDg2L2xpYi9tc3IuYwpAQCAtOCw3ICs4LDcgQEAKIAogCW1zcnMgPSBhbGxvY19wZXJjcHUoc3RydWN0IG1zcik7CiAJaWYgKCFtc3JzKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBlcnJvciBhbGxvY2F0aW5nIG1zcnNcbiIsIF9fZnVuY19fKTsKKwkJcHJfd2FybigiJXM6IGVycm9yIGFsbG9jYXRpbmcgbXNyc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIxLDMgKzIxLDkwIEBACiAJZnJlZV9wZXJjcHUobXNycyk7CiB9CiBFWFBPUlRfU1lNQk9MKG1zcnNfZnJlZSk7CisKKy8qKgorICogUmVhZCBhbiBNU1Igd2l0aCBlcnJvciBoYW5kbGluZworICoKKyAqIEBtc3I6IE1TUiB0byByZWFkCisgKiBAbTogdmFsdWUgdG8gcmVhZCBpbnRvCisgKgorICogSXQgcmV0dXJucyByZWFkIGRhdGEgb25seSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIG91dHB1dAorICogYXJndW1lbnQgQG0uCisgKgorICovCitpbnQgbXNyX3JlYWQodTMyIG1zciwgc3RydWN0IG1zciAqbSkKK3sKKwlpbnQgZXJyOworCXU2NCB2YWw7CisKKwllcnIgPSByZG1zcmxfc2FmZShtc3IsICZ2YWwpOworCWlmICghZXJyKQorCQltLT5xID0gdmFsOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBXcml0ZSBhbiBNU1Igd2l0aCBlcnJvciBoYW5kbGluZworICoKKyAqIEBtc3I6IE1TUiB0byB3cml0ZQorICogQG06IHZhbHVlIHRvIHdyaXRlCisgKi8KK2ludCBtc3Jfd3JpdGUodTMyIG1zciwgc3RydWN0IG1zciAqbSkKK3sKKwlyZXR1cm4gd3Jtc3JsX3NhZmUobXNyLCBtLT5xKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19mbGlwX2JpdCh1MzIgbXNyLCB1OCBiaXQsIGJvb2wgc2V0KQoreworCXN0cnVjdCBtc3IgbSwgbTE7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAoYml0ID4gNjMpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtc3JfcmVhZChtc3IsICZtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbTEgPSBtOworCWlmIChzZXQpCisJCW0xLnEgfD0gIEJJVF82NChiaXQpOworCWVsc2UKKwkJbTEucSAmPSB+QklUXzY0KGJpdCk7CisKKwlpZiAobTEucSA9PSBtLnEpCisJCXJldHVybiAwOworCisJZXJyID0gbXNyX3dyaXRlKG1zciwgJm0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBTZXQgQGJpdCBpbiBhIE1TUiBAbXNyLgorICoKKyAqIFJldHZhbDoKKyAqIDwgMDogQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkLgorICogPSAwOiBCaXQgd2FzIGFscmVhZHkgc2V0LgorICogPiAwOiBIYXJkd2FyZSBhY2NlcHRlZCB0aGUgTVNSIHdyaXRlLgorICovCitpbnQgbXNyX3NldF9iaXQodTMyIG1zciwgdTggYml0KQoreworCXJldHVybiBfX2ZsaXBfYml0KG1zciwgYml0LCB0cnVlKTsKK30KKworLyoqCisgKiBDbGVhciBAYml0IGluIGEgTVNSIEBtc3IuCisgKgorICogUmV0dmFsOgorICogPCAwOiBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQuCisgKiA9IDA6IEJpdCB3YXMgYWxyZWFkeSBjbGVhcmVkLgorICogPiAwOiBIYXJkd2FyZSBhY2NlcHRlZCB0aGUgTVNSIHdyaXRlLgorICovCitpbnQgbXNyX2NsZWFyX2JpdCh1MzIgbXNyLCB1OCBiaXQpCit7CisJcmV0dXJuIF9fZmxpcF9iaXQobXNyLCBiaXQsIGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jIGIvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMKaW5kZXggMDAwMmEzYS4uMjA2MjFkNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMKKysrIGIvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMKQEAgLTMwLDYgKzMwLDcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBjdXJyZW50X2FkZHJlc3M7CiAJY29uc3Qgc3RydWN0IGFkZHJfbWFya2VyICptYXJrZXI7CisJYm9vbCB0b19kbWVzZzsKIH07CiAKIHN0cnVjdCBhZGRyX21hcmtlciB7CkBAIC04OCwxMCArODksMjggQEAKICNkZWZpbmUgUFVEX0xFVkVMX01VTFQgKFBUUlNfUEVSX1BNRCAqIFBNRF9MRVZFTF9NVUxUKQogI2RlZmluZSBQR0RfTEVWRUxfTVVMVCAoUFRSU19QRVJfUFVEICogUFVEX0xFVkVMX01VTFQpCiAKKyNkZWZpbmUgcHRfZHVtcF9zZXFfcHJpbnRmKG0sIHRvX2RtZXNnLCBmbXQsIGFyZ3MuLi4pCQlcCisoewkJCQkJCQkJXAorCWlmICh0b19kbWVzZykJCQkJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyBmbXQsICMjYXJncyk7CQkJXAorCWVsc2UJCQkJCQkJXAorCQlpZiAobSkJCQkJCQlcCisJCQlzZXFfcHJpbnRmKG0sIGZtdCwgIyNhcmdzKTsJCVwKK30pCisKKyNkZWZpbmUgcHRfZHVtcF9jb250X3ByaW50ZihtLCB0b19kbWVzZywgZm10LCBhcmdzLi4uKQkJXAorKHsJCQkJCQkJCVwKKwlpZiAodG9fZG1lc2cpCQkJCQlcCisJCXByaW50ayhLRVJOX0NPTlQgZm10LCAjI2FyZ3MpOwkJCVwKKwllbHNlCQkJCQkJCVwKKwkJaWYgKG0pCQkJCQkJXAorCQkJc2VxX3ByaW50ZihtLCBmbXQsICMjYXJncyk7CQlcCit9KQorCiAvKgogICogUHJpbnQgYSByZWFkYWJsZSBmb3JtIG9mIGEgcGdwcm90X3QgdG8gdGhlIHNlcV9maWxlCiAgKi8KLXN0YXRpYyB2b2lkIHByaW50a19wcm90KHN0cnVjdCBzZXFfZmlsZSAqbSwgcGdwcm90X3QgcHJvdCwgaW50IGxldmVsKQorc3RhdGljIHZvaWQgcHJpbnRrX3Byb3Qoc3RydWN0IHNlcV9maWxlICptLCBwZ3Byb3RfdCBwcm90LCBpbnQgbGV2ZWwsIGJvb2wgZG1zZykKIHsKIAlwZ3Byb3R2YWxfdCBwciA9IHBncHJvdF92YWwocHJvdCk7CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZXZlbF9uYW1lW10gPQpAQCAtOTksNDcgKzExOCw0NyBAQAogCiAJaWYgKCFwZ3Byb3RfdmFsKHByb3QpKSB7CiAJCS8qIE5vdCBwcmVzZW50ICovCi0JCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CiAJfSBlbHNlIHsKIAkJaWYgKHByICYgX1BBR0VfVVNFUikKLQkJCXNlcV9wcmludGYobSwgIlVTUiAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIlVTUiAiKTsKIAkJZWxzZQotCQkJc2VxX3ByaW50ZihtLCAiICAgICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiICAgICIpOwogCQlpZiAocHIgJiBfUEFHRV9SVykKLQkJCXNlcV9wcmludGYobSwgIlJXICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiUlcgIik7CiAJCWVsc2UKLQkJCXNlcV9wcmludGYobSwgInJvICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAicm8gIik7CiAJCWlmIChwciAmIF9QQUdFX1BXVCkKLQkJCXNlcV9wcmludGYobSwgIlBXVCAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIlBXVCAiKTsKIAkJZWxzZQotCQkJc2VxX3ByaW50ZihtLCAiICAgICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiICAgICIpOwogCQlpZiAocHIgJiBfUEFHRV9QQ0QpCi0JCQlzZXFfcHJpbnRmKG0sICJQQ0QgIik7CisJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICJQQ0QgIik7CiAJCWVsc2UKLQkJCXNlcV9wcmludGYobSwgIiAgICAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiAgICAiKTsKIAogCQkvKiBCaXQgOSBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBvbiBsZXZlbCAzIHZzIDQgKi8KIAkJaWYgKGxldmVsIDw9IDMpIHsKIAkJCWlmIChwciAmIF9QQUdFX1BTRSkKLQkJCQlzZXFfcHJpbnRmKG0sICJQU0UgIik7CisJCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiUFNFICIpOwogCQkJZWxzZQotCQkJCXNlcV9wcmludGYobSwgIiAgICAiKTsKKwkJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICIgICAgIik7CiAJCX0gZWxzZSB7CiAJCQlpZiAocHIgJiBfUEFHRV9QQVQpCi0JCQkJc2VxX3ByaW50ZihtLCAicGF0ICIpOworCQkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgInBhdCAiKTsKIAkJCWVsc2UKLQkJCQlzZXFfcHJpbnRmKG0sICIgICAgIik7CisJCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiICAgICIpOwogCQl9CiAJCWlmIChwciAmIF9QQUdFX0dMT0JBTCkKLQkJCXNlcV9wcmludGYobSwgIkdMQiAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIkdMQiAiKTsKIAkJZWxzZQotCQkJc2VxX3ByaW50ZihtLCAiICAgICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiICAgICIpOwogCQlpZiAocHIgJiBfUEFHRV9OWCkKLQkJCXNlcV9wcmludGYobSwgIk5YICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiTlggIik7CiAJCWVsc2UKLQkJCXNlcV9wcmludGYobSwgInggICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAieCAgIik7CiAJfQotCXNlcV9wcmludGYobSwgIiVzXG4iLCBsZXZlbF9uYW1lW2xldmVsXSk7CisJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiJXNcbiIsIGxldmVsX25hbWVbbGV2ZWxdKTsKIH0KIAogLyoKQEAgLTE3OCw3ICsxOTcsOCBAQAogCQlzdC0+Y3VycmVudF9wcm90ID0gbmV3X3Byb3Q7CiAJCXN0LT5sZXZlbCA9IGxldmVsOwogCQlzdC0+bWFya2VyID0gYWRkcmVzc19tYXJrZXJzOwotCQlzZXFfcHJpbnRmKG0sICItLS1bICVzIF0tLS1cbiIsIHN0LT5tYXJrZXItPm5hbWUpOworCQlwdF9kdW1wX3NlcV9wcmludGYobSwgc3QtPnRvX2RtZXNnLCAiLS0tWyAlcyBdLS0tXG4iLAorCQkJCSAgIHN0LT5tYXJrZXItPm5hbWUpOwogCX0gZWxzZSBpZiAocHJvdCAhPSBjdXIgfHwgbGV2ZWwgIT0gc3QtPmxldmVsIHx8CiAJCSAgIHN0LT5jdXJyZW50X2FkZHJlc3MgPj0gc3QtPm1hcmtlclsxXS5zdGFydF9hZGRyZXNzKSB7CiAJCWNvbnN0IGNoYXIgKnVuaXQgPSB1bml0czsKQEAgLTE4OCwxNyArMjA4LDE3IEBACiAJCS8qCiAJCSAqIE5vdyBwcmludCB0aGUgYWN0dWFsIGZpbmlzaGVkIHNlcmllcwogCQkgKi8KLQkJc2VxX3ByaW50ZihtLCAiMHglMCpseC0weCUwKmx4ICAgIiwKLQkJCSAgIHdpZHRoLCBzdC0+c3RhcnRfYWRkcmVzcywKLQkJCSAgIHdpZHRoLCBzdC0+Y3VycmVudF9hZGRyZXNzKTsKKwkJcHRfZHVtcF9zZXFfcHJpbnRmKG0sIHN0LT50b19kbWVzZywgICIweCUwKmx4LTB4JTAqbHggICAiLAorCQkJCSAgIHdpZHRoLCBzdC0+c3RhcnRfYWRkcmVzcywKKwkJCQkgICB3aWR0aCwgc3QtPmN1cnJlbnRfYWRkcmVzcyk7CiAKIAkJZGVsdGEgPSAoc3QtPmN1cnJlbnRfYWRkcmVzcyAtIHN0LT5zdGFydF9hZGRyZXNzKSA+PiAxMDsKIAkJd2hpbGUgKCEoZGVsdGEgJiAxMDIzKSAmJiB1bml0WzFdKSB7CiAJCQlkZWx0YSA+Pj0gMTA7CiAJCQl1bml0Kys7CiAJCX0KLQkJc2VxX3ByaW50ZihtLCAiJTlsdSVjICIsIGRlbHRhLCAqdW5pdCk7Ci0JCXByaW50a19wcm90KG0sIHN0LT5jdXJyZW50X3Byb3QsIHN0LT5sZXZlbCk7CisJCXB0X2R1bXBfY29udF9wcmludGYobSwgc3QtPnRvX2RtZXNnLCAiJTlsdSVjICIsIGRlbHRhLCAqdW5pdCk7CisJCXByaW50a19wcm90KG0sIHN0LT5jdXJyZW50X3Byb3QsIHN0LT5sZXZlbCwgc3QtPnRvX2RtZXNnKTsKIAogCQkvKgogCQkgKiBXZSBwcmludCBtYXJrZXJzIGZvciBzcGVjaWFsIGFyZWFzIG9mIGFkZHJlc3Mgc3BhY2UsCkBAIC0yMDcsNyArMjI3LDggQEAKIAkJICovCiAJCWlmIChzdC0+Y3VycmVudF9hZGRyZXNzID49IHN0LT5tYXJrZXJbMV0uc3RhcnRfYWRkcmVzcykgewogCQkJc3QtPm1hcmtlcisrOwotCQkJc2VxX3ByaW50ZihtLCAiLS0tWyAlcyBdLS0tXG4iLCBzdC0+bWFya2VyLT5uYW1lKTsKKwkJCXB0X2R1bXBfc2VxX3ByaW50ZihtLCBzdC0+dG9fZG1lc2csICItLS1bICVzIF0tLS1cbiIsCisJCQkJCSAgIHN0LT5tYXJrZXItPm5hbWUpOwogCQl9CiAKIAkJc3QtPnN0YXJ0X2FkZHJlc3MgPSBzdC0+Y3VycmVudF9hZGRyZXNzOwpAQCAtMjk2LDcgKzMxNyw3IEBACiAjZGVmaW5lIHBnZF9ub25lKGEpICBwdWRfbm9uZShfX3B1ZChwZ2RfdmFsKGEpKSkKICNlbmRpZgogCi1zdGF0aWMgdm9pZCB3YWxrX3BnZF9sZXZlbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit2b2lkIHB0ZHVtcF93YWxrX3BnZF9sZXZlbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHBnZF90ICpwZ2QpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCXBnZF90ICpzdGFydCA9IChwZ2RfdCAqKSAmaW5pdF9sZXZlbDRfcGd0OwpAQCAtMzA0LDkgKzMyNSwxMiBAQAogCXBnZF90ICpzdGFydCA9IHN3YXBwZXJfcGdfZGlyOwogI2VuZGlmCiAJaW50IGk7Ci0Jc3RydWN0IHBnX3N0YXRlIHN0OworCXN0cnVjdCBwZ19zdGF0ZSBzdCA9IHt9OwogCi0JbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CisJaWYgKHBnZCkgeworCQlzdGFydCA9IHBnZDsKKwkJc3QudG9fZG1lc2cgPSB0cnVlOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QR0Q7IGkrKykgewogCQlzdC5jdXJyZW50X2FkZHJlc3MgPSBub3JtYWxpemVfYWRkcihpICogUEdEX0xFVkVMX01VTFQpOwpAQCAtMzMxLDcgKzM1NSw3IEBACiAKIHN0YXRpYyBpbnQgcHRkdW1wX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXdhbGtfcGdkX2xldmVsKG0pOworCXB0ZHVtcF93YWxrX3BnZF9sZXZlbChtLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggYTEwYzhjNy4uOGU1NzIyOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC01ODQsOCArNTg0LDEzIEBACiAKIAlpZiAoZXJyb3JfY29kZSAmIFBGX0lOU1RSKSB7CiAJCXVuc2lnbmVkIGludCBsZXZlbDsKKwkJcGdkX3QgKnBnZDsKKwkJcHRlX3QgKnB0ZTsKIAotCQlwdGVfdCAqcHRlID0gbG9va3VwX2FkZHJlc3MoYWRkcmVzcywgJmxldmVsKTsKKwkJcGdkID0gX192YShyZWFkX2NyMygpICYgUEhZU0lDQUxfUEFHRV9NQVNLKTsKKwkJcGdkICs9IHBnZF9pbmRleChhZGRyZXNzKTsKKworCQlwdGUgPSBsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkLCBhZGRyZXNzLCAmbGV2ZWwpOwogCiAJCWlmIChwdGUgJiYgcHRlX3ByZXNlbnQoKnB0ZSkgJiYgIXB0ZV9leGVjKCpwdGUpKQogCQkJcHJpbnRrKG54X3dhcm5pbmcsIGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X3VpZCgpKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hLmMgYi9hcmNoL3g4Ni9tbS9udW1hLmMKaW5kZXggMjdhYTA0NTUuLjFkMDQ1ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWEuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hLmMKQEAgLTY4NywxMCArNjg3LDYgQEAKIHZvaWQgX19pbml0IHg4Nl9udW1hX2luaXQodm9pZCkKIHsKIAlpZiAoIW51bWFfb2ZmKSB7Ci0jaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQotCQlpZiAoIW51bWFfaW5pdChudW1hcV9udW1hX2luaXQpKQotCQkJcmV0dXJuOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCQlpZiAoIW51bWFfaW5pdCh4ODZfYWNwaV9udW1hX2luaXQpKQogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKaW5kZXggYjNiMTlmNC4uYWUyNDJhNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCkBAIC0xMjYsOCArMTI2LDggQEAKICAqIEB2YWRkcjoJdmlydHVhbCBzdGFydCBhZGRyZXNzCiAgKiBAc2l6ZToJbnVtYmVyIG9mIGJ5dGVzIHRvIGZsdXNoCiAgKgotICogY2xmbHVzaCBpcyBhbiB1bm9yZGVyZWQgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgZmVuY2luZyB3aXRoIG1mZW5jZQotICogdG8gYXZvaWQgb3JkZXJpbmcgaXNzdWVzLgorICogY2xmbHVzaG9wdCBpcyBhbiB1bm9yZGVyZWQgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgZmVuY2luZyB3aXRoIG1mZW5jZSBvcgorICogc2ZlbmNlIHRvIGF2b2lkIG9yZGVyaW5nIGlzc3Vlcy4KICAqLwogdm9pZCBjbGZsdXNoX2NhY2hlX3JhbmdlKHZvaWQgKnZhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKQEAgLTEzNiwxMSArMTM2LDExIEBACiAJbWIoKTsKIAogCWZvciAoOyB2YWRkciA8IHZlbmQ7IHZhZGRyICs9IGJvb3RfY3B1X2RhdGEueDg2X2NsZmx1c2hfc2l6ZSkKLQkJY2xmbHVzaCh2YWRkcik7CisJCWNsZmx1c2hvcHQodmFkZHIpOwogCS8qCiAJICogRmx1c2ggYW55IHBvc3NpYmxlIGZpbmFsIHBhcnRpYWwgY2FjaGVsaW5lOgogCSAqLwotCWNsZmx1c2godmVuZCk7CisJY2xmbHVzaG9wdCh2ZW5kKTsKIAogCW1iKCk7CiB9CkBAIC0zMjMsOCArMzIzLDEyIEBACiAJcmV0dXJuIHByb3Q7CiB9CiAKLXN0YXRpYyBwdGVfdCAqX19sb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCAqbGV2ZWwpCisvKgorICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuCisgKi8KK3B0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKQogewogCXB1ZF90ICpwdWQ7CiAJcG1kX3QgKnBtZDsKQEAgLTM2NSw3ICszNjksNyBAQAogICovCiBwdGVfdCAqbG9va3VwX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgKmxldmVsKQogewotICAgICAgICByZXR1cm4gX19sb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX29mZnNldF9rKGFkZHJlc3MpLCBhZGRyZXNzLCBsZXZlbCk7CisgICAgICAgIHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX29mZnNldF9rKGFkZHJlc3MpLCBhZGRyZXNzLCBsZXZlbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsb29rdXBfYWRkcmVzcyk7CiAKQEAgLTM3Myw3ICszNzcsNyBAQAogCQkJCSAgdW5zaWduZWQgaW50ICpsZXZlbCkKIHsKICAgICAgICAgaWYgKGNwYS0+cGdkKQotCQlyZXR1cm4gX19sb29rdXBfYWRkcmVzc19pbl9wZ2QoY3BhLT5wZ2QgKyBwZ2RfaW5kZXgoYWRkcmVzcyksCisJCXJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2QoY3BhLT5wZ2QgKyBwZ2RfaW5kZXgoYWRkcmVzcyksCiAJCQkJCSAgICAgICBhZGRyZXNzLCBsZXZlbCk7CiAKICAgICAgICAgcmV0dXJuIGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MsIGxldmVsKTsKQEAgLTY5Miw2ICs2OTYsMTggQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgdHJ5X3RvX2ZyZWVfcHVkX3BhZ2UocHVkX3QgKnB1ZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QVUQ7IGkrKykKKwkJaWYgKCFwdWRfbm9uZShwdWRbaV0pKQorCQkJcmV0dXJuIGZhbHNlOworCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB1ZCk7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBib29sIHVubWFwX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlwdGVfdCAqcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBzdGFydCk7CkBAIC04MDUsNiArODIxLDE2IEBACiAJICovCiB9CiAKK3N0YXRpYyB2b2lkIHVubWFwX3BnZF9yYW5nZShwZ2RfdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlwZ2RfdCAqcGdkX2VudHJ5ID0gcm9vdCArIHBnZF9pbmRleChhZGRyKTsKKworCXVubWFwX3B1ZF9yYW5nZShwZ2RfZW50cnksIGFkZHIsIGVuZCk7CisKKwlpZiAodHJ5X3RvX2ZyZWVfcHVkX3BhZ2UoKHB1ZF90ICopcGdkX3BhZ2VfdmFkZHIoKnBnZF9lbnRyeSkpKQorCQlwZ2RfY2xlYXIocGdkX2VudHJ5KTsKK30KKwogc3RhdGljIGludCBhbGxvY19wdGVfcGFnZShwbWRfdCAqcG1kKQogewogCXB0ZV90ICpwdGUgPSAocHRlX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX05PVFJBQ0spOwpAQCAtOTk5LDkgKzEwMjUsOCBAQAogc3RhdGljIGludCBwb3B1bGF0ZV9wZ2Qoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlwZ3Byb3RfdCBwZ3Byb3QgPSBfX3BncHJvdChfS0VSTlBHX1RBQkxFKTsKLQlib29sIGFsbG9jZF9wZ2QgPSBmYWxzZTsKLQlwZ2RfdCAqcGdkX2VudHJ5OwogCXB1ZF90ICpwdWQgPSBOVUxMOwkvKiBzaHV0IHVwIGdjYyAqLworCXBnZF90ICpwZ2RfZW50cnk7CiAJaW50IHJldDsKIAogCXBnZF9lbnRyeSA9IGNwYS0+cGdkICsgcGdkX2luZGV4KGFkZHIpOwpAQCAtMTAxNSw3ICsxMDQwLDYgQEAKIAkJCXJldHVybiAtMTsKIAogCQlzZXRfcGdkKHBnZF9lbnRyeSwgX19wZ2QoX19wYShwdWQpIHwgX0tFUk5QR19UQUJMRSkpOwotCQlhbGxvY2RfcGdkID0gdHJ1ZTsKIAl9CiAKIAlwZ3Byb3RfdmFsKHBncHJvdCkgJj0gfnBncHJvdF92YWwoY3BhLT5tYXNrX2Nscik7CkBAIC0xMDIzLDE5ICsxMDQ3LDExIEBACiAKIAlyZXQgPSBwb3B1bGF0ZV9wdWQoY3BhLCBhZGRyLCBwZ2RfZW50cnksIHBncHJvdCk7CiAJaWYgKHJldCA8IDApIHsKLQkJdW5tYXBfcHVkX3JhbmdlKHBnZF9lbnRyeSwgYWRkciwKKwkJdW5tYXBfcGdkX3JhbmdlKGNwYS0+cGdkLCBhZGRyLAogCQkJCWFkZHIgKyAoY3BhLT5udW1wYWdlcyA8PCBQQUdFX1NISUZUKSk7Ci0KLQkJaWYgKGFsbG9jZF9wZ2QpIHsKLQkJCS8qCi0JCQkgKiBJZiBJIGFsbG9jYXRlZCB0aGlzIFBVRCBwYWdlLCBJIGNhbiBqdXN0IGFzIHdlbGwKLQkJCSAqIGZyZWUgaXQgaW4gdGhpcyBlcnJvciBwYXRoLgotCQkJICovCi0JCQlwZ2RfY2xlYXIocGdkX2VudHJ5KTsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdWQpOwotCQl9CiAJCXJldHVybiByZXQ7CiAJfQorCiAJY3BhLT5udW1wYWdlcyA9IHJldDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNzcsMTAgKzEzOTMsMTAgQEAKIAljYWNoZSA9IGNhY2hlX2F0dHIobWFza19zZXQpOwogCiAJLyoKLQkgKiBPbiBzdWNjZXNzIHdlIHVzZSBjbGZsdXNoLCB3aGVuIHRoZSBDUFUgc3VwcG9ydHMgaXQgdG8KLQkgKiBhdm9pZCB0aGUgd2JpbmR2LiBJZiB0aGUgQ1BVIGRvZXMgbm90IHN1cHBvcnQgaXQgYW5kIGluIHRoZQorCSAqIE9uIHN1Y2Nlc3Mgd2UgdXNlIENMRkxVU0gsIHdoZW4gdGhlIENQVSBzdXBwb3J0cyBpdCB0bworCSAqIGF2b2lkIHRoZSBXQklOVkQuIElmIHRoZSBDUFUgZG9lcyBub3Qgc3VwcG9ydCBpdCBhbmQgaW4gdGhlCiAJICogZXJyb3IgY2FzZSB3ZSBmYWxsIGJhY2sgdG8gY3BhX2ZsdXNoX2FsbCAod2hpY2ggdXNlcwotCSAqIHdiaW5kdik6CisJICogV0JJTlZEKToKIAkgKi8KIAlpZiAoIXJldCAmJiBjcHVfaGFzX2NsZmx1c2gpIHsKIAkJaWYgKGNwYS5mbGFncyAmIChDUEFfUEFHRVNfQVJSQVkgfCBDUEFfQVJSQVkpKSB7CkBAIC0xODYxLDYgKzE4NzcsMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCit2b2lkIGtlcm5lbF91bm1hcF9wYWdlc19pbl9wZ2QocGdkX3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgICAgICB1bnNpZ25lZCBudW1wYWdlcykKK3sKKwl1bm1hcF9wZ2RfcmFuZ2Uocm9vdCwgYWRkcmVzcywgYWRkcmVzcyArIChudW1wYWdlcyA8PCBQQUdFX1NISUZUKSk7Cit9CisKIC8qCiAgKiBUaGUgdGVzdGNhc2VzIHVzZSBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkbid0CiAgKiBiZSBleHBvc2VkIHRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwuIEluY2x1ZGUgdGhlc2UgZGlyZWN0bHkgaGVyZS4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3NyYXQuYyBiL2FyY2gveDg2L21tL3NyYXQuYwppbmRleCAxOTUzZTljLi42NjMzOGE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9zcmF0LmMKKysrIGIvYXJjaC94ODYvbW0vc3JhdC5jCkBAIC01MiwxMiArNTIsMTggQEAKIAlpbnQgaSwgajsKIAogCWZvciAoaSA9IDA7IGkgPCBzbGl0LT5sb2NhbGl0eV9jb3VudDsgaSsrKSB7Ci0JCWlmIChweG1fdG9fbm9kZShpKSA9PSBOVU1BX05PX05PREUpCisJCWNvbnN0IGludCBmcm9tX25vZGUgPSBweG1fdG9fbm9kZShpKTsKKworCQlpZiAoZnJvbV9ub2RlID09IE5VTUFfTk9fTk9ERSkKIAkJCWNvbnRpbnVlOworCiAJCWZvciAoaiA9IDA7IGogPCBzbGl0LT5sb2NhbGl0eV9jb3VudDsgaisrKSB7Ci0JCQlpZiAocHhtX3RvX25vZGUoaikgPT0gTlVNQV9OT19OT0RFKQorCQkJY29uc3QgaW50IHRvX25vZGUgPSBweG1fdG9fbm9kZShqKTsKKworCQkJaWYgKHRvX25vZGUgPT0gTlVNQV9OT19OT0RFKQogCQkJCWNvbnRpbnVlOwotCQkJbnVtYV9zZXRfZGlzdGFuY2UocHhtX3RvX25vZGUoaSksIHB4bV90b19ub2RlKGopLAorCisJCQludW1hX3NldF9kaXN0YW5jZShmcm9tX25vZGUsIHRvX25vZGUsCiAJCQkJc2xpdC0+ZW50cnlbc2xpdC0+bG9jYWxpdHlfY291bnQgKiBpICsgal0pOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL01ha2VmaWxlIGIvYXJjaC94ODYvcGNpL01ha2VmaWxlCmluZGV4IGUwNjNlZWQuLjVjNmZjMzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wY2kvTWFrZWZpbGUKQEAgLTEzLDkgKzEzLDYgQEAKIAogb2JqLSQoQ09ORklHX1NUQTJYMTEpICAgICAgICAgICArPSBzdGEyeDExLWZpeHVwLm8KIAotb2JqLSQoQ09ORklHX1g4Nl9WSVNXUykJCSs9IHZpc3dzLm8KLQotb2JqLSQoQ09ORklHX1g4Nl9OVU1BUSkJCSs9IG51bWFxXzMyLm8KIG9iai0kKENPTkZJR19YODZfTlVNQUNISVApCSs9IG51bWFjaGlwLm8KIAogb2JqLSQoQ09ORklHX1g4Nl9JTlRFTF9NSUQpCSs9IGludGVsX21pZF9wY2kubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2FjcGkuYyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKaW5kZXggNGYyNWVjMC4uMDFlZGFjNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2FjcGkuYworKysgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCkBAIC0yMTgsOSArMjE4LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLXJlc291cmNlX3RvX2FkZHIoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICphZGRyKQorc3RhdGljIGFjcGlfc3RhdHVzIHJlc291cmNlX3RvX2FkZHIoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJCSAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgKmFkZHIpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTI0ICptZW1vcnkyNDsKQEAgLTI2NSw4ICsyNjQsNyBAQAogCXJldHVybiBBRV9FUlJPUjsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1jb3VudF9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYWNwaV9yZXMsIHZvaWQgKmRhdGEpCitzdGF0aWMgYWNwaV9zdGF0dXMgY291bnRfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvID0gZGF0YTsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcjsKQEAgLTI3OCw4ICsyNzYsNyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1zZXR1cF9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYWNwaV9yZXMsIHZvaWQgKmRhdGEpCitzdGF0aWMgYWNwaV9zdGF0dXMgc2V0dXBfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvID0gZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTQzNSw5ICs0MzIsOSBAQAogCV9fcmVsZWFzZV9wY2lfcm9vdF9pbmZvKGluZm8pOwogfQogCi1zdGF0aWMgdm9pZAotcHJvYmVfcGNpX3Jvb3RfaW5mbyhzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbywgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCi0JCSAgICBpbnQgYnVzbnVtLCBpbnQgZG9tYWluKQorc3RhdGljIHZvaWQgcHJvYmVfcGNpX3Jvb3RfaW5mbyhzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCQlpbnQgYnVzbnVtLCBpbnQgZG9tYWluKQogewogCXNpemVfdCBzaXplOwogCkBAIC00NzMsMTYgKzQ3MCwxMyBAQAogc3RydWN0IHBjaV9idXMgKnBjaV9hY3BpX3NjYW5fcm9vdChzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IHJvb3QtPmRldmljZTsKLQlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHBjaV9yb290X2luZm8gKmluZm87CiAJaW50IGRvbWFpbiA9IHJvb3QtPnNlZ21lbnQ7CiAJaW50IGJ1c251bSA9IHJvb3QtPnNlY29uZGFyeS5zdGFydDsKIAlMSVNUX0hFQUQocmVzb3VyY2VzKTsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCXN0cnVjdCBwY2lfc3lzZGF0YSAqc2Q7CiAJaW50IG5vZGU7Ci0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCWludCBweG07Ci0jZW5kaWYKIAogCWlmIChwY2lfaWdub3JlX3NlZykKIAkJZG9tYWluID0gMDsKQEAgLTQ5NCwxOSArNDg4LDEyIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCW5vZGUgPSAtMTsKLSNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JcHhtID0gYWNwaV9nZXRfcHhtKGRldmljZS0+aGFuZGxlKTsKLQlpZiAocHhtID49IDApCi0JCW5vZGUgPSBweG1fdG9fbm9kZShweG0pOwotCWlmIChub2RlICE9IC0xKQotCQlzZXRfbXBfYnVzX3RvX25vZGUoYnVzbnVtLCBub2RlKTsKLQllbHNlCi0jZW5kaWYKLQkJbm9kZSA9IGdldF9tcF9idXNfdG9fbm9kZShidXNudW0pOworCW5vZGUgPSBhY3BpX2dldF9ub2RlKGRldmljZS0+aGFuZGxlKTsKKwlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCisJCW5vZGUgPSB4ODZfcGNpX3Jvb3RfYnVzX25vZGUoYnVzbnVtKTsKIAotCWlmIChub2RlICE9IC0xICYmICFub2RlX29ubGluZShub2RlKSkKLQkJbm9kZSA9IC0xOworCWlmIChub2RlICE9IE5VTUFfTk9fTk9ERSAmJiAhbm9kZV9vbmxpbmUobm9kZSkpCisJCW5vZGUgPSBOVU1BX05PX05PREU7CiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pIHsKQEAgLTUxOSwxNSArNTA2LDEyIEBACiAJc2QtPmRvbWFpbiA9IGRvbWFpbjsKIAlzZC0+bm9kZSA9IG5vZGU7CiAJc2QtPmNvbXBhbmlvbiA9IGRldmljZTsKLQkvKgotCSAqIE1heWJlIHRoZSBkZXNpcmVkIHBjaSBidXMgaGFzIGJlZW4gYWxyZWFkeSBzY2FubmVkLiBJbiBzdWNoIGNhc2UKLQkgKiBpdCBpcyB1bm5lY2Vzc2FyeSB0byBzY2FuIHRoZSBwY2kgYnVzIHdpdGggdGhlIGdpdmVuIGRvbWFpbixidXNudW0uCi0JICovCisKIAlidXMgPSBwY2lfZmluZF9idXMoZG9tYWluLCBidXNudW0pOwogCWlmIChidXMpIHsKIAkJLyoKLQkJICogSWYgdGhlIGRlc2lyZWQgYnVzIGV4aXRzLCB0aGUgY29udGVudCBvZiBidXMtPnN5c2RhdGEgd2lsbAotCQkgKiBiZSByZXBsYWNlZCBieSBzZC4KKwkJICogSWYgdGhlIGRlc2lyZWQgYnVzIGhhcyBiZWVuIHNjYW5uZWQgYWxyZWFkeSwgcmVwbGFjZQorCQkgKiBpdHMgYnVzLT5zeXNkYXRhLgogCQkgKi8KIAkJbWVtY3B5KGJ1cy0+c3lzZGF0YSwgc2QsIHNpemVvZigqc2QpKTsKIAkJa2ZyZWUoaW5mbyk7CkBAIC01NzIsMTUgKzU1Niw4IEBACiAJCQlwY2llX2J1c19jb25maWd1cmVfc2V0dGluZ3MoY2hpbGQpOwogCX0KIAotCWlmIChidXMgJiYgbm9kZSAhPSAtMSkgewotI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLQkJaWYgKHB4bSA+PSAwKQotCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnVzLT5kZXYsCi0JCQkJICAgIm9uIE5VTUEgbm9kZSAlZCAocHhtICVkKVxuIiwgbm9kZSwgcHhtKTsKLSNlbHNlCisJaWYgKGJ1cyAmJiBub2RlICE9IE5VTUFfTk9fTk9ERSkKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnVzLT5kZXYsICJvbiBOVU1BIG5vZGUgJWRcbiIsIG5vZGUpOwotI2VuZGlmCi0JfQogCiAJcmV0dXJuIGJ1czsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMgYi9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCmluZGV4IGE0OGJlOTguLmEzMTNhN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKKysrIGIvYXJjaC94ODYvcGNpL2FtZF9idXMuYwpAQCAtNDQsMTUgKzQ0LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNldF9tcF9idXNfcmFuZ2VfdG9fbm9kZShpbnQgbWluX2J1cywgaW50IG1heF9idXMsIGludCBub2RlKQotewotI2lmZGVmIENPTkZJR19OVU1BCi0JaW50IGo7Ci0KLQlmb3IgKGogPSBtaW5fYnVzOyBqIDw9IG1heF9idXM7IGorKykKLQkJc2V0X21wX2J1c190b19ub2RlKGosIG5vZGUpOwotI2VuZGlmCi19CiAvKioKICAqIGVhcmx5X2ZpbGxfbXBfYnVzX3RvX25vZGUoKQogICogY2FsbGVkIGJlZm9yZSBwY2liaW9zX3NjYW5fcm9vdCBhbmQgcGNpX3NjYW5fYnVzCkBAIC0xMTcsNyArMTA4LDYgQEAKIAkJbWluX2J1cyA9IChyZWcgPj4gMTYpICYgMHhmZjsKIAkJbWF4X2J1cyA9IChyZWcgPj4gMjQpICYgMHhmZjsKIAkJbm9kZSA9IChyZWcgPj4gNCkgJiAweDA3OwotCQlzZXRfbXBfYnVzX3JhbmdlX3RvX25vZGUobWluX2J1cywgbWF4X2J1cywgbm9kZSk7CiAJCWxpbmsgPSAocmVnID4+IDgpICYgMHgwMzsKIAogCQlpbmZvID0gYWxsb2NfcGNpX3Jvb3RfaW5mbyhtaW5fYnVzLCBtYXhfYnVzLCBub2RlLCBsaW5rKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jIGIvYXJjaC94ODYvcGNpL2J1c19udW1hLmMKaW5kZXggYzI3MzVmZS4uZjNhMmNmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2J1c19udW1hLmMKKysrIGIvYXJjaC94ODYvcGNpL2J1c19udW1hLmMKQEAgLTEwLDkgKzEwLDYgQEAKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbzsKIAotCWlmIChsaXN0X2VtcHR5KCZwY2lfcm9vdF9pbmZvcykpCi0JCXJldHVybiBOVUxMOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmcGNpX3Jvb3RfaW5mb3MsIGxpc3QpCiAJCWlmIChpbmZvLT5idXNuLnN0YXJ0ID09IGJ1cykKIAkJCXJldHVybiBpbmZvOwpAQCAtMjAsNiArMTcsMTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAoraW50IHg4Nl9wY2lfcm9vdF9idXNfbm9kZShpbnQgYnVzKQoreworCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvID0geDg2X2ZpbmRfcGNpX3Jvb3RfaW5mbyhidXMpOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gTlVNQV9OT19OT0RFOworCisJcmV0dXJuIGluZm8tPm5vZGU7Cit9CisKIHZvaWQgeDg2X3BjaV9yb290X2J1c19yZXNvdXJjZXMoaW50IGJ1cywgc3RydWN0IGxpc3RfaGVhZCAqcmVzb3VyY2VzKQogewogCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvID0geDg2X2ZpbmRfcGNpX3Jvb3RfaW5mbyhidXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCmluZGV4IDk4MWMyZGIuLjA1OWE3NmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKQEAgLTQ1NiwxOSArNDU2LDI1IEBACiAJZG1pX2NoZWNrX3N5c3RlbShwY2lwcm9iZV9kbWlfdGFibGUpOwogfQogCi1zdHJ1Y3QgcGNpX2J1cyAqcGNpYmlvc19zY2FuX3Jvb3QoaW50IGJ1c251bSkKK3ZvaWQgcGNpYmlvc19zY2FuX3Jvb3QoaW50IGJ1c251bSkKIHsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lfc3lzZGF0YSAqc2Q7CisJTElTVF9IRUFEKHJlc291cmNlcyk7CiAKLQl3aGlsZSAoKGJ1cyA9IHBjaV9maW5kX25leHRfYnVzKGJ1cykpICE9IE5VTEwpIHsKLQkJaWYgKGJ1cy0+bnVtYmVyID09IGJ1c251bSkgewotCQkJLyogQWxyZWFkeSBzY2FubmVkICovCi0JCQlyZXR1cm4gYnVzOwotCQl9CisJc2QgPSBremFsbG9jKHNpemVvZigqc2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUENJOiBPT00sIHNraXBwaW5nIFBDSSBidXMgJTAyeFxuIiwgYnVzbnVtKTsKKwkJcmV0dXJuOwogCX0KLQotCXJldHVybiBwY2lfc2Nhbl9idXNfb25fbm9kZShidXNudW0sICZwY2lfcm9vdF9vcHMsCi0JCQkJCWdldF9tcF9idXNfdG9fbm9kZShidXNudW0pKTsKKwlzZC0+bm9kZSA9IHg4Nl9wY2lfcm9vdF9idXNfbm9kZShidXNudW0pOworCXg4Nl9wY2lfcm9vdF9idXNfcmVzb3VyY2VzKGJ1c251bSwgJnJlc291cmNlcyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgKGJ1cyAlMDJ4KVxuIiwgYnVzbnVtKTsKKwlidXMgPSBwY2lfc2Nhbl9yb290X2J1cyhOVUxMLCBidXNudW0sICZwY2lfcm9vdF9vcHMsIHNkLCAmcmVzb3VyY2VzKTsKKwlpZiAoIWJ1cykgeworCQlwY2lfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOworCQlrZnJlZShzZCk7CisJfQogfQogCiB2b2lkIF9faW5pdCBwY2liaW9zX3NldF9jYWNoZV9saW5lX3NpemUodm9pZCkKQEAgLTU2MSw3ICs1NjcsNiBAQAogCQlwY2lfcHJvYmUgfD0gUENJX1BST0JFX05PRUFSTFk7CiAJCXJldHVybiBOVUxMOwogCX0KLSNpZm5kZWYgQ09ORklHX1g4Nl9WSVNXUwogCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAidXNlcGlycW1hc2siKSkgewogCQlwY2lfcHJvYmUgfD0gUENJX1VTRV9QSVJRX01BU0s7CiAJCXJldHVybiBOVUxMOwpAQCAtNTcxLDkgKzU3Niw3IEBACiAJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJsYXN0YnVzPSIsIDgpKSB7CiAJCXBjaWJpb3NfbGFzdF9idXMgPSBzaW1wbGVfc3RydG9sKHN0cis4LCBOVUxMLCAwKTsKIAkJcmV0dXJuIE5VTEw7Ci0JfQotI2VuZGlmCi0JZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyb20iKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyb20iKSkgewogCQlwY2lfcHJvYmUgfD0gUENJX0FTU0lHTl9ST01TOwogCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9yb20iKSkgewpAQCAtNjc3LDEwNSArNjgwLDMgQEAKIAllbHNlCiAJCXJldHVybiAwOwogfQotCi1zdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzX29uX25vZGUoaW50IGJ1c25vLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLCBpbnQgbm9kZSkKLXsKLQlMSVNUX0hFQUQocmVzb3VyY2VzKTsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKLQlzdHJ1Y3QgcGNpX3N5c2RhdGEgKnNkOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBwZXItcm9vdC1idXMgKG5vdCBwZXIgYnVzKSBhcmNoLXNwZWNpZmljIGRhdGEuCi0JICogVE9ETzogbGVhazsgdGhpcyBtZW1vcnkgaXMgbmV2ZXIgZnJlZWQuCi0JICogSXQncyBhcmd1YWJsZSB3aGV0aGVyIGl0J3Mgd29ydGggdGhlIHRyb3VibGUgdG8gY2FyZS4KLQkgKi8KLQlzZCA9IGt6YWxsb2Moc2l6ZW9mKCpzZCksIEdGUF9LRVJORUwpOwotCWlmICghc2QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IE9PTSwgc2tpcHBpbmcgUENJIGJ1cyAlMDJ4XG4iLCBidXNubyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZC0+bm9kZSA9IG5vZGU7Ci0JeDg2X3BjaV9yb290X2J1c19yZXNvdXJjZXMoYnVzbm8sICZyZXNvdXJjZXMpOwotCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMgJTAyeClcbiIsIGJ1c25vKTsKLQlidXMgPSBwY2lfc2Nhbl9yb290X2J1cyhOVUxMLCBidXNubywgb3BzLCBzZCwgJnJlc291cmNlcyk7Ci0JaWYgKCFidXMpIHsKLQkJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKLQkJa2ZyZWUoc2QpOwotCX0KLQotCXJldHVybiBidXM7Ci19Ci0KLXN0cnVjdCBwY2lfYnVzICpwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKGludCBidXNubykKLXsKLQlyZXR1cm4gcGNpX3NjYW5fYnVzX29uX25vZGUoYnVzbm8sICZwY2lfcm9vdF9vcHMsIC0xKTsKLX0KLQotLyoKLSAqIE5VTUEgaW5mbyBmb3IgUENJIGJ1c3NlcwotICoKLSAqIEVhcmx5IGFyY2ggY29kZSBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiByZWFzb25hYmxlIHZhbHVlcyBoZXJlLgotICogQSBub2RlIGlkIG9mICItMSIgbWVhbnMgInVzZSBjdXJyZW50IG5vZGUiLiAgSW4gb3RoZXIgd29yZHMsIGlmIGEgYnVzCi0gKiBoYXMgYSAtMSBub2RlIGlkLCBpdCdzIG5vdCB0aWdodGx5IGNvdXBsZWQgdG8gYW55IHBhcnRpY3VsYXIgY2h1bmsKLSAqIG9mIG1lbW9yeSAoYXMgaXMgdGhlIGNhc2Ugb24gc29tZSBOZWhhbGVtIHN5c3RlbXMpLgotICovCi0jaWZkZWYgQ09ORklHX05VTUEKLQotI2RlZmluZSBCVVNfTlIgMjU2Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0KLXN0YXRpYyBpbnQgbXBfYnVzX3RvX25vZGVbQlVTX05SXSA9IHsKLQlbMCAuLi4gQlVTX05SIC0gMV0gPSAtMQotfTsKLQotdm9pZCBzZXRfbXBfYnVzX3RvX25vZGUoaW50IGJ1c251bSwgaW50IG5vZGUpCi17Ci0JaWYgKGJ1c251bSA+PSAwICYmICBidXNudW0gPCBCVVNfTlIpCi0JCW1wX2J1c190b19ub2RlW2J1c251bV0gPSBub2RlOwotfQotCi1pbnQgZ2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0pCi17Ci0JaW50IG5vZGUgPSAtMTsKLQotCWlmIChidXNudW0gPCAwIHx8IGJ1c251bSA+IChCVVNfTlIgLSAxKSkKLQkJcmV0dXJuIG5vZGU7Ci0KLQlub2RlID0gbXBfYnVzX3RvX25vZGVbYnVzbnVtXTsKLQotCS8qCi0JICogbGV0IG51bWFfbm9kZV9pZCB0byBkZWNpZGUgaXQgbGF0ZXIgaW4gZG1hX2FsbG9jX3BhZ2VzCi0JICogaWYgdGhlcmUgaXMgbm8gcmFtIG9uIHRoYXQgbm9kZQotCSAqLwotCWlmIChub2RlICE9IC0xICYmICFub2RlX29ubGluZShub2RlKSkKLQkJbm9kZSA9IC0xOwotCi0JcmV0dXJuIG5vZGU7Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KLQotc3RhdGljIGludCBtcF9idXNfdG9fbm9kZVtCVVNfTlJdID0gewotCVswIC4uLiBCVVNfTlIgLSAxXSA9IC0xCi19OwotCi12b2lkIHNldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtLCBpbnQgbm9kZSkKLXsKLQlpZiAoYnVzbnVtID49IDAgJiYgIGJ1c251bSA8IEJVU19OUikKLQltcF9idXNfdG9fbm9kZVtidXNudW1dID0gKHVuc2lnbmVkIGNoYXIpIG5vZGU7Ci19Ci0KLWludCBnZXRfbXBfYnVzX3RvX25vZGUoaW50IGJ1c251bSkKLXsKLQlpbnQgbm9kZTsKLQotCWlmIChidXNudW0gPCAwIHx8IGJ1c251bSA+IChCVVNfTlIgLSAxKSkKLQkJcmV0dXJuIDA7Ci0Jbm9kZSA9IG1wX2J1c190b19ub2RlW2J1c251bV07Ci0JcmV0dXJuIG5vZGU7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCi0KLSNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMgYi9hcmNoL3g4Ni9wY2kvZml4dXAuYwppbmRleCBiY2E5ZTg1Li45NGFlOWFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvZml4dXAuYworKysgYi9hcmNoL3g4Ni9wY2kvZml4dXAuYwpAQCAtMjUsOSArMjUsOSBAQAogCQlkZXZfZGJnKCZkLT5kZXYsICJpNDUwTlggUFhCICVkOiAlMDJ4LyUwMngvJTAyeFxuIiwgcHhiLCBidXNubywKIAkJCXN1YmEsIHN1YmIpOwogCQlpZiAoYnVzbm8pCi0JCQlwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKGJ1c25vKTsJLyogQnVzIEEgKi8KKwkJCXBjaWJpb3Nfc2Nhbl9yb290KGJ1c25vKTsJLyogQnVzIEEgKi8KIAkJaWYgKHN1YmEgPCBzdWJiKQotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShzdWJhKzEpOwkvKiBCdXMgQiAqLworCQkJcGNpYmlvc19zY2FuX3Jvb3Qoc3ViYSsxKTsJLyogQnVzIEIgKi8KIAl9CiAJcGNpYmlvc19sYXN0X2J1cyA9IC0xOwogfQpAQCAtNDIsNyArNDIsNyBAQAogCXU4IGJ1c25vOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIDB4NGEsICZidXNubyk7CiAJZGV2X2luZm8oJmQtPmRldiwgImk0NDBLWC9HWCBob3N0IGJyaWRnZTsgc2Vjb25kYXJ5IGJ1cyAlMDJ4XG4iLCBidXNubyk7Ci0JcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShidXNubyk7CisJcGNpYmlvc19zY2FuX3Jvb3QoYnVzbm8pOwogCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDU0R1gsIHBjaV9maXh1cF9pNDUwZ3gpOwpAQCAtMzEzLDkgKzMxMywxMCBAQAogICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBib290IHZpZGVvCiAgKiBjYXJkIHdpdGggdGhpcyBjb3B5LiBPbiBsYXB0b3BzIHRoaXMgY29weSBoYXMgdG8gYmUgdXNlZCBzaW5jZQogICogdGhlIG1haW4gUk9NIG1heSBiZSBjb21wcmVzc2VkIG9yIGNvbWJpbmVkIHdpdGggYW5vdGhlciBpbWFnZS4KLSAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBJT1JFU09VUkNFX1JPTV9TSEFET1cKLSAqIGlzIG1hcmtlZCBoZXJlIHNpbmNlIHRoZSBib290IHZpZGVvIGRldmljZSB3aWxsIGJlIHRoZSBvbmx5IGVuYWJsZWQKLSAqIHZpZGVvIGRldmljZSBhdCB0aGlzIHBvaW50LgorICogU2VlIHBjaV9tYXBfcm9tKCkgZm9yIHVzZSBvZiB0aGlzIGZsYWcuIEJlZm9yZSBtYXJraW5nIHRoZSBkZXZpY2UKKyAqIHdpdGggSU9SRVNPVVJDRV9ST01fU0hBRE9XIGNoZWNrIGlmIGEgdmdhX2RlZmF1bHRfZGV2aWNlIGlzIGFscmVhZHkgc2V0CisgKiBieSBlaXRoZXIgYXJjaCBjZGUgb3IgdmdhLWFyYml0cmF0aW9uLCBpZiBzbyBvbmx5IGFwcGx5IHRoZSBmaXh1cCB0byB0aGlzCisgKiBhbHJlYWR5IGRldGVybWluZWQgcHJpbWFyeSB2aWRlbyBjYXJkLgogICovCiAKIHN0YXRpYyB2b2lkIHBjaV9maXh1cF92aWRlbyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTM0NiwxMiArMzQ3LDEzIEBACiAJCX0KIAkJYnVzID0gYnVzLT5wYXJlbnQ7CiAJfQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKLQlpZiAoY29uZmlnICYgKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgewotCQlwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9TSEFET1c7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgIkJvb3QgdmlkZW8gZGV2aWNlXG4iKTsKLQkJaWYgKCF2Z2FfZGVmYXVsdF9kZXZpY2UoKSkKKwlpZiAoIXZnYV9kZWZhdWx0X2RldmljZSgpIHx8IHBkZXYgPT0gdmdhX2RlZmF1bHRfZGV2aWNlKCkpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjb25maWcpOworCQlpZiAoY29uZmlnICYgKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAiQm9vdCB2aWRlbyBkZXZpY2VcbiIpOwogCQkJdmdhX3NldF9kZWZhdWx0X2RldmljZShwZGV2KTsKKwkJfQogCX0KIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0NMQVNTX0ZJTkFMKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaXJxLmMgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKaW5kZXggMzcyZTliOC4uODQxMTJmNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2lycS5jCisrKyBiL2FyY2gveDg2L3BjaS9pcnEuYwpAQCAtMTM2LDEzICsxMzYsOSBAQAogCQlidXNtYXBbZS0+YnVzXSA9IDE7CiAJfQogCWZvciAoaSA9IDE7IGkgPCAyNTY7IGkrKykgewotCQlpbnQgbm9kZTsKIAkJaWYgKCFidXNtYXBbaV0gfHwgcGNpX2ZpbmRfYnVzKDAsIGkpKQogCQkJY29udGludWU7Ci0JCW5vZGUgPSBnZXRfbXBfYnVzX3RvX25vZGUoaSk7Ci0JCWlmIChwY2lfc2Nhbl9idXNfb25fbm9kZShpLCAmcGNpX3Jvb3Rfb3BzLCBub2RlKSkKLQkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogRGlzY292ZXJlZCBwcmltYXJ5IHBlZXIgIgotCQkJICAgICAgICJidXMgJTAyeCBbSVJRXVxuIiwgaSk7CisJCXBjaWJpb3Nfc2Nhbl9yb290KGkpOwogCX0KIAlwY2liaW9zX2xhc3RfYnVzID0gLTE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMgYi9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMKaW5kZXggNGRiOTZmYi4uNWI2NjJjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2xlZ2FjeS5jCisrKyBiL2FyY2gveDg2L3BjaS9sZWdhY3kuYwpAQCAtMzcsMTkgKzM3LDE3IEBACiB2b2lkIHBjaWJpb3Nfc2Nhbl9zcGVjaWZpY19idXMoaW50IGJ1c24pCiB7CiAJaW50IGRldmZuOwotCWxvbmcgbm9kZTsKIAl1MzIgbDsKIAogCWlmIChwY2lfZmluZF9idXMoMCwgYnVzbikpCiAJCXJldHVybjsKIAotCW5vZGUgPSBnZXRfbXBfYnVzX3RvX25vZGUoYnVzbik7CiAJZm9yIChkZXZmbiA9IDA7IGRldmZuIDwgMjU2OyBkZXZmbiArPSA4KSB7CiAJCWlmICghcmF3X3BjaV9yZWFkKDAsIGJ1c24sIGRldmZuLCBQQ0lfVkVORE9SX0lELCAyLCAmbCkgJiYKIAkJICAgIGwgIT0gMHgwMDAwICYmIGwgIT0gMHhmZmZmKSB7CiAJCQlEQkcoIkZvdW5kIGRldmljZSBhdCAlMDJ4OiUwMnggWyUwNHhdXG4iLCBidXNuLCBkZXZmbiwgbCk7CiAJCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IERpc2NvdmVyZWQgcGVlciBidXMgJTAyeFxuIiwgYnVzbik7Ci0JCQlwY2lfc2Nhbl9idXNfb25fbm9kZShidXNuLCAmcGNpX3Jvb3Rfb3BzLCBub2RlKTsKKwkJCXBjaWJpb3Nfc2Nhbl9yb290KGJ1c24pOwogCQkJcmV0dXJuOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMgYi9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjMjI5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogbnVtYXFfMzIuYyAtIExvdy1sZXZlbCBQQ0kgYWNjZXNzIGZvciBOVU1BLVEgbWFjaGluZXMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vbXBzcGVjLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KLSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLQotI2RlZmluZSBCVVMyUVVBRChnbG9iYWwpIChtcF9idXNfaWRfdG9fbm9kZVtnbG9iYWxdKQotCi0jZGVmaW5lIEJVUzJMT0NBTChnbG9iYWwpIChtcF9idXNfaWRfdG9fbG9jYWxbZ2xvYmFsXSkKLQotI2RlZmluZSBRVUFETE9DQUwyQlVTKHF1YWQsbG9jYWwpIChxdWFkX2xvY2FsX3RvX21wX2J1c19pZFtxdWFkXVtsb2NhbF0pCi0KLSNkZWZpbmUgUENJX0NPTkYxX01RX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSBcCi0JKDB4ODAwMDAwMDAgfCAoQlVTMkxPQ0FMKGJ1cykgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgKHJlZyAmIH4zKSkKLQotc3RhdGljIHZvaWQgd3JpdGVfY2Y4KHVuc2lnbmVkIGJ1cywgdW5zaWduZWQgZGV2Zm4sIHVuc2lnbmVkIHJlZykKLXsKLQl1bnNpZ25lZCB2YWwgPSBQQ0lfQ09ORjFfTVFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpOwotCWlmICh4cXVhZF9wb3J0aW8pCi0JCXdyaXRlbCh2YWwsIFhRVUFEX1BPUlRfQUREUigweGNmOCwgQlVTMlFVQUQoYnVzKSkpOwotCWVsc2UKLQkJb3V0bCh2YWwsIDB4Q0Y4KTsKLX0KLQotc3RhdGljIGludCBwY2lfY29uZjFfbXFfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiAqdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2lkICphZHIgX19pb21lbSA9IFhRVUFEX1BPUlRfQUREUigweGNmYywgQlVTMlFVQUQoYnVzKSk7Ci0KLQlXQVJOX09OKHNlZyk7Ci0JaWYgKCF2YWx1ZSB8fCAoYnVzID49IE1BWF9NUF9CVVNTRVMpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKLQotCXdyaXRlX2NmOChidXMsIGRldmZuLCByZWcpOwotCi0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCWlmICh4cXVhZF9wb3J0aW8pCi0JCQkqdmFsdWUgPSByZWFkYihhZHIgKyAocmVnICYgMykpOwotCQllbHNlCi0JCQkqdmFsdWUgPSBpbmIoMHhDRkMgKyAocmVnICYgMykpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmICh4cXVhZF9wb3J0aW8pCi0JCQkqdmFsdWUgPSByZWFkdyhhZHIgKyAocmVnICYgMikpOwotCQllbHNlCi0JCQkqdmFsdWUgPSBpbncoMHhDRkMgKyAocmVnICYgMikpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlmICh4cXVhZF9wb3J0aW8pCi0JCQkqdmFsdWUgPSByZWFkbChhZHIpOwotCQllbHNlCi0JCQkqdmFsdWUgPSBpbmwoMHhDRkMpOwotCQlicmVhazsKLQl9Ci0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwY2lfY29uZjFfbXFfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKLQkJCSAgICAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwotCi0JV0FSTl9PTihzZWcpOwotCWlmICgoYnVzID49IE1BWF9NUF9CVVNTRVMpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpIAotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7Ci0KLQl3cml0ZV9jZjgoYnVzLCBkZXZmbiwgcmVnKTsKLQotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJd3JpdGViKHZhbHVlLCBhZHIgKyAocmVnICYgMykpOwotCQllbHNlCi0JCQlvdXRiKCh1OCl2YWx1ZSwgMHhDRkMgKyAocmVnICYgMykpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmICh4cXVhZF9wb3J0aW8pCi0JCQl3cml0ZXcodmFsdWUsIGFkciArIChyZWcgJiAyKSk7Ci0JCWVsc2UKLQkJCW91dHcoKHUxNil2YWx1ZSwgMHhDRkMgKyAocmVnICYgMikpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlmICh4cXVhZF9wb3J0aW8pCi0JCQl3cml0ZWwodmFsdWUsIGFkciArIHJlZyk7Ci0JCWVsc2UKLQkJCW91dGwoKHUzMil2YWx1ZSwgMHhDRkMpOwotCQlicmVhazsKLQl9Ci0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI3VuZGVmIFBDSV9DT05GMV9NUV9BRERSRVNTCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMV9tcSA9IHsKLQkucmVhZAk9IHBjaV9jb25mMV9tcV9yZWFkLAotCS53cml0ZQk9IHBjaV9jb25mMV9tcV93cml0ZQotfTsKLQotCi1zdGF0aWMgdm9pZCBwY2lfZml4dXBfaTQ1MG54KHN0cnVjdCBwY2lfZGV2ICpkKQotewotCS8qCi0JICogaTQ1ME5YIC0tIEZpbmQgYW5kIHNjYW4gYWxsIHNlY29uZGFyeSBidXNlcyBvbiBhbGwgUFhCJ3MuCi0JICovCi0JaW50IHB4YiwgcmVnOwotCXU4IGJ1c25vLCBzdWJhLCBzdWJiOwotCWludCBxdWFkID0gQlVTMlFVQUQoZC0+YnVzLT5udW1iZXIpOwotCi0JZGV2X2luZm8oJmQtPmRldiwgInNlYXJjaGluZyBmb3IgaTQ1ME5YIGhvc3QgYnJpZGdlc1xuIik7Ci0JcmVnID0gMHhkMDsKLQlmb3IocHhiPTA7IHB4YjwyOyBweGIrKykgewotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCByZWcrKywgJmJ1c25vKTsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZzdWJhKTsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZzdWJiKTsKLQkJZGV2X2RiZygmZC0+ZGV2LCAiaTQ1ME5YIFBYQiAlZDogJTAyeC8lMDJ4LyUwMnhcbiIsCi0JCQlweGIsIGJ1c25vLCBzdWJhLCBzdWJiKTsKLQkJaWYgKGJ1c25vKSB7Ci0JCQkvKiBCdXMgQSAqLwotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShRVUFETE9DQUwyQlVTKHF1YWQsIGJ1c25vKSk7Ci0JCX0KLQkJaWYgKHN1YmEgPCBzdWJiKSB7Ci0JCQkvKiBCdXMgQiAqLwotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShRVUFETE9DQUwyQlVTKHF1YWQsIHN1YmErMSkpOwotCQl9Ci0JfQotCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDUxTlgsIHBjaV9maXh1cF9pNDUwbngpOwotCi1pbnQgX19pbml0IHBjaV9udW1hcV9pbml0KHZvaWQpCi17Ci0JaW50IHF1YWQ7Ci0KLQlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxX21xOwotCi0JcGNpYmlvc19zY2FuX3Jvb3QoMCk7Ci0JaWYgKG51bV9vbmxpbmVfbm9kZXMoKSA+IDEpCi0JCWZvcl9lYWNoX29ubGluZV9ub2RlKHF1YWQpIHsKLQkJCWlmIChxdWFkID09IDApCi0JCQkJY29udGludWU7Ci0JCQlwcmludGsoIlNjYW5uaW5nIFBDSSBidXMgJWQgZm9yIHF1YWQgJWRcbiIsIAotCQkJCVFVQURMT0NBTDJCVVMocXVhZCwwKSwgcXVhZCk7Ci0JCQlwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKFFVQURMT0NBTDJCVVMocXVhZCwgMCkpOwotCQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvdmlzd3MuYyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZkMmE2Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L3BjaS92aXN3cy5jCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbgotICoKLSAqCShjKSAxOTk5LS0yMDAwIE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vcGNpX3g4Ni5oPgotI2luY2x1ZGUgPGFzbS92aXN3cy9jb2JhbHQuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvbGl0aGl1bS5oPgotCi1zdGF0aWMgaW50IHBjaV92aXN3c19lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyB2b2lkIHBjaV92aXN3c19kaXNhYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLQotLyogaW50ICgqcGNpYmlvc19lbmFibGVfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2KSA9ICZwY2lfdmlzd3NfZW5hYmxlX2lycTsgKi8KLS8qIHZvaWQgKCpwY2liaW9zX2Rpc2FibGVfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2KSA9ICZwY2lfdmlzd3NfZGlzYWJsZV9pcnE7ICovCi0KLS8qIHZvaWQgX19pbml0IHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKSB7fSAqLwotCi0KLXVuc2lnbmVkIGludCBwY2lfYnVzMCwgcGNpX2J1czE7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZpc3dzX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQotewotCWludCBpcnEsIGJ1cyA9IGRldi0+YnVzLT5udW1iZXI7Ci0KLQlwaW4tLTsKLQotCS8qIE5vdGhpbmcgdXNlZnVsIGF0IFBJSVg0IHBpbiAxICovCi0JaWYgKGJ1cyA9PSBwY2lfYnVzMCAmJiBzbG90ID09IDQgJiYgcGluID09IDApCi0JCXJldHVybiAtMTsKLQotCS8qIFBJSVg0IFVTQiBpcyBvbiBCdXMgMCwgU2xvdCA0LCBMaW5lIDMgKi8KLQlpZiAoYnVzID09IHBjaV9idXMwICYmIHNsb3QgPT0gNCAmJiBwaW4gPT0gMykgewotCQlpcnEgPSBDT19JUlEoQ09fQVBJQ19QSUlYNF9VU0IpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBGaXJzdCBwaW4gc3ByZWFkIGRvd24gMSBBUElDIGVudHJ5IHBlciBzbG90ICovCi0JaWYgKHBpbiA9PSAwKSB7Ci0JCWlycSA9IENPX0lSUSgoYnVzID09IHBjaV9idXMwID8gQ09fQVBJQ19QQ0lCX0JBU0UwIDoKLQkJCQkJCUNPX0FQSUNfUENJQV9CQVNFMCkgKyBzbG90KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogbGluZXMgMSwyLDMgZnJvbSBhbnkgc2xvdCBpcyBzaGFyZWQgaW4gdGhpcyB0d2lybHkgcGF0dGVybiAqLwotCWlmIChidXMgPT0gcGNpX2J1czEpIHsKLQkJLyogbGluZXMgMS0zIGZyb20gZGV2aWNlcyAwIDEgcm90YXRlIG92ZXIgMiBhcGljIGVudHJpZXMgKi8KLQkJaXJxID0gQ09fSVJRKENPX0FQSUNfUENJQV9CQVNFMTIzICsgKChzbG90ICsgKHBpbiAtIDEpKSAlIDIpKTsKLQl9IGVsc2UgeyAvKiBidXMgPT0gcGNpX2J1czAgKi8KLQkJLyogbGluZXMgMS0zIGZyb20gZGV2aWNlcyAwLTMgcm90YXRlIG92ZXIgMyBhcGljIGVudHJpZXMgKi8KLQkJaWYgKHNsb3QgPT0gMCkKLQkJCXNsb3QgPSAzOyAvKiBzYW1lIHBhdHRlcm4gKi8KLQkJaXJxID0gQ09fSVJRKENPX0FQSUNfUENJQV9CQVNFMTIzICsgKCgzIC0gc2xvdCkgKyAocGluIC0gMSkgJSAzKSk7Ci0JfQotb3V0OgotCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IEJ1cyAlZCBTbG90ICVkIExpbmUgJWQgLT4gSVJRICVkXG4iLCBidXMsIHNsb3QsIHBpbiwgaXJxKTsKLQlyZXR1cm4gaXJxOwotfQotCi1pbnQgX19pbml0IHBjaV92aXN3c19pbml0KHZvaWQpCi17Ci0JcGNpYmlvc19lbmFibGVfaXJxID0gJnBjaV92aXN3c19lbmFibGVfaXJxOwotCXBjaWJpb3NfZGlzYWJsZV9pcnEgPSAmcGNpX3Zpc3dzX2Rpc2FibGVfaXJxOwotCi0JLyogVGhlIFZJU1dTIHN1cHBvcnRzIGNvbmZpZ3VyYXRpb24gYWNjZXNzIHR5cGUgMSBvbmx5ICovCi0JcGNpX3Byb2JlID0gKHBjaV9wcm9iZSB8IFBDSV9QUk9CRV9DT05GMSkgJgotCQkgICAgfihQQ0lfUFJPQkVfQklPUyB8IFBDSV9QUk9CRV9DT05GMik7Ci0KLQlwY2lfYnVzMCA9IGxpX3BjaWJfcmVhZDE2KExJX1BDSV9CVVNOVU0pICYgMHhmZjsKLQlwY2lfYnVzMSA9IGxpX3BjaWFfcmVhZDE2KExJX1BDSV9CVVNOVU0pICYgMHhmZjsKLQotCXByaW50ayhLRVJOX0lORk8gIlBDSTogTGl0aGl1bSBicmlkZ2UgQSBidXM6ICV1LCAiCi0JCSJicmlkZ2UgQiAoUElJWDQpIGJ1czogJXVcbiIsIHBjaV9idXMxLCBwY2lfYnVzMCk7Ci0KLQlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxOwotCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEocGNpX2J1czApOwotCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEocGNpX2J1czEpOwotCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgdmlzd3NfbWFwX2lycSk7Ci0JcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKLQkvKiBSZXF1ZXN0IGJ1cyBzY2FuICovCi0JcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCmluZGV4IDIwMzQyZDQuLjg1YWZkZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCkBAIC05LDUgKzksNCBAQAogb2JqLXkJKz0gc2N4MjAwLwogb2JqLXkJKz0gc2ZpLwogb2JqLXkJKz0gdHM1NTAwLwotb2JqLXkJKz0gdmlzd3MvCiBvYmoteQkrPSB1di8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9NYWtlZmlsZQppbmRleCBiN2IwYjM1Li5kNTEwNDVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLSQoQ09ORklHX0VGSSkgCQkrPSBlZmkubyBlZmlfJChCSVRTKS5vIGVmaV9zdHViXyQoQklUUykubwogb2JqLSQoQ09ORklHX0FDUElfQkdSVCkgKz0gZWZpLWJncnQubwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5US19FRkkpCSs9IGVhcmx5X3ByaW50ay5vCitvYmotJChDT05GSUdfRUZJX01JWEVEKQkJKz0gZWZpX3RodW5rXyQoQklUUykubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCmluZGV4IGI5N2FjZWMuLjM3ODFkZDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKQEAgLTY4LDkgKzY4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZWZpIGVmaV9waHlzIF9faW5pdGRhdGE7CiBzdGF0aWMgZWZpX3N5c3RlbV90YWJsZV90IGVmaV9zeXN0YWIgX19pbml0ZGF0YTsKIAotdW5zaWduZWQgbG9uZyB4ODZfZWZpX2ZhY2lsaXR5OwotCi1zdGF0aWMgX19pbml0ZGF0YSBlZmlfY29uZmlnX3RhYmxlX3R5cGVfdCBhcmNoX3RhYmxlc1tdID0geworc3RhdGljIGVmaV9jb25maWdfdGFibGVfdHlwZV90IGFyY2hfdGFibGVzW10gX19pbml0ZGF0YSA9IHsKICNpZmRlZiBDT05GSUdfWDg2X1VWCiAJe1VWX1NZU1RFTV9UQUJMRV9HVUlELCAiVVZzeXN0YWIiLCAmZWZpLnV2X3N5c3RhYn0sCiAjZW5kaWYKQEAgLTc5LDE2ICs3Nyw3IEBACiAKIHU2NCBlZmlfc2V0dXA7CQkvKiBlZmkgc2V0dXBfZGF0YSBwaHlzaWNhbCBhZGRyZXNzICovCiAKLS8qCi0gKiBSZXR1cm5zIDEgaWYgJ2ZhY2lsaXR5JyBpcyBlbmFibGVkLCAwIG90aGVyd2lzZS4KLSAqLwotaW50IGVmaV9lbmFibGVkKGludCBmYWNpbGl0eSkKLXsKLQlyZXR1cm4gdGVzdF9iaXQoZmFjaWxpdHksICZ4ODZfZWZpX2ZhY2lsaXR5KSAhPSAwOwotfQotRVhQT1JUX1NZTUJPTChlZmlfZW5hYmxlZCk7Ci0KLXN0YXRpYyBib29sIF9faW5pdGRhdGEgZGlzYWJsZV9ydW50aW1lID0gZmFsc2U7CitzdGF0aWMgYm9vbCBkaXNhYmxlX3J1bnRpbWUgX19pbml0ZGF0YSA9IGZhbHNlOwogc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm9lZmkoY2hhciAqYXJnKQogewogCWRpc2FibGVfcnVudGltZSA9IHRydWU7CkBAIC0yNTcsMjcgKzI0NiwxMiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBlZmlfc3RhdHVzX3QgX19pbml0IHBoeXNfZWZpX2dldF90aW1lKGVmaV90aW1lX3QgKnRtLAotCQkJCQkgICAgIGVmaV90aW1lX2NhcF90ICp0YykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWVmaV9zdGF0dXNfdCBzdGF0dXM7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQllZmlfY2FsbF9waHlzX3ByZWxvZygpOwotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMyKGVmaV9waHlzLmdldF90aW1lLCB2aXJ0X3RvX3BoeXModG0pLAotCQkJCXZpcnRfdG9fcGh5cyh0YykpOwotCWVmaV9jYWxsX3BoeXNfZXBpbG9nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCiBpbnQgZWZpX3NldF9ydGNfbW1zcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKm5vdykKIHsKIAl1bnNpZ25lZCBsb25nIG5vd3RpbWUgPSBub3ctPnR2X3NlYzsKLQllZmlfc3RhdHVzX3QgCXN0YXR1czsKLQllZmlfdGltZV90IAllZnQ7Ci0JZWZpX3RpbWVfY2FwX3QgCWNhcDsKKwllZmlfc3RhdHVzX3QJc3RhdHVzOworCWVmaV90aW1lX3QJZWZ0OworCWVmaV90aW1lX2NhcF90CWNhcDsKIAlzdHJ1Y3QgcnRjX3RpbWUJdG07CiAKIAlzdGF0dXMgPSBlZmkuZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CkBAIC0yOTUsOSArMjY5LDggQEAKIAkJZWZ0LnNlY29uZCA9IHRtLnRtX3NlYzsKIAkJZWZ0Lm5hbm9zZWNvbmQgPSAwOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBJbnZhbGlkIEVGSSBSVEMgdmFsdWU6IHdyaXRlIG9mICVseCB0byBFRkkgUlRDIGZhaWxlZFxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgbm93dGltZSk7CisJCXByX2VycigiJXM6IEludmFsaWQgRUZJIFJUQyB2YWx1ZTogd3JpdGUgb2YgJWx4IHRvIEVGSSBSVEMgZmFpbGVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIG5vd3RpbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC00MTMsOCArMzg2LDcgQEAKIAkgICAgIHAgPCBtZW1tYXAubWFwX2VuZDsKIAkgICAgIHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSwgaSsrKSB7CiAJCW1kID0gcDsKLQkJcHJfaW5mbygibWVtJTAydTogdHlwZT0ldSwgYXR0cj0weCVsbHgsICIKLQkJCSJyYW5nZT1bMHglMDE2bGx4LTB4JTAxNmxseCkgKCVsbHVNQilcbiIsCisJCXByX2luZm8oIm1lbSUwMnU6IHR5cGU9JXUsIGF0dHI9MHglbGx4LCByYW5nZT1bMHglMDE2bGx4LTB4JTAxNmxseCkgKCVsbHVNQilcbiIsCiAJCQlpLCBtZC0+dHlwZSwgbWQtPmF0dHJpYnV0ZSwgbWQtPnBoeXNfYWRkciwKIAkJCW1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCksCiAJCQkobWQtPm51bV9wYWdlcyA+PiAoMjAgLSBFRklfUEFHRV9TSElGVCkpKTsKQEAgLTQ0Niw5ICs0MTgsOCBAQAogCQkJbWVtYmxvY2tfaXNfcmVnaW9uX3Jlc2VydmVkKHN0YXJ0LCBzaXplKSkgewogCQkJLyogQ291bGQgbm90IHJlc2VydmUsIHNraXAgaXQgKi8KIAkJCW1kLT5udW1fcGFnZXMgPSAwOwotCQkJbWVtYmxvY2tfZGJnKCJDb3VsZCBub3QgcmVzZXJ2ZSBib290IHJhbmdlICIKLQkJCQkJIlsweCUwMTBsbHgtMHglMDEwbGx4XVxuIiwKLQkJCQkJCXN0YXJ0LCBzdGFydCtzaXplLTEpOworCQkJbWVtYmxvY2tfZGJnKCJDb3VsZCBub3QgcmVzZXJ2ZSBib290IHJhbmdlIFsweCUwMTBsbHgtMHglMDEwbGx4XVxuIiwKKwkJCQkgICAgIHN0YXJ0LCBzdGFydCtzaXplLTEpOwogCQl9IGVsc2UKIAkJCW1lbWJsb2NrX3Jlc2VydmUoc3RhcnQsIHNpemUpOwogCX0KQEAgLTQ1Niw3ICs0MjcsNyBAQAogCiB2b2lkIF9faW5pdCBlZmlfdW5tYXBfbWVtbWFwKHZvaWQpCiB7Ci0JY2xlYXJfYml0KEVGSV9NRU1NQVAsICZ4ODZfZWZpX2ZhY2lsaXR5KTsKKwljbGVhcl9iaXQoRUZJX01FTU1BUCwgJmVmaS5mbGFncyk7CiAJaWYgKG1lbW1hcC5tYXApIHsKIAkJZWFybHlfaW91bm1hcChtZW1tYXAubWFwLCBtZW1tYXAubnJfbWFwICogbWVtbWFwLmRlc2Nfc2l6ZSk7CiAJCW1lbW1hcC5tYXAgPSBOVUxMOwpAQCAtNDY3LDkgKzQzOCw2IEBACiB7CiAJdm9pZCAqcDsKIAotCWlmICghZWZpX2lzX25hdGl2ZSgpKQotCQlyZXR1cm47Ci0KIAlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgewogCQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQgPSBwOwogCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQgPSBtZC0+cGh5c19hZGRyOwpAQCAtNTg0LDE3ICs1NTIsNjYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICgoZWZpLnN5c3RhYi0+aGRyLnJldmlzaW9uID4+IDE2KSA9PSAwKQotCQlwcl9lcnIoIldhcm5pbmc6IFN5c3RlbSB0YWJsZSB2ZXJzaW9uICIKLQkJICAgICAgICIlZC4lMDJkLCBleHBlY3RlZCAxLjAwIG9yIGdyZWF0ZXIhXG4iLAorCQlwcl9lcnIoIldhcm5pbmc6IFN5c3RlbSB0YWJsZSB2ZXJzaW9uICVkLiUwMmQsIGV4cGVjdGVkIDEuMDAgb3IgZ3JlYXRlciFcbiIsCiAJCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gPj4gMTYsCiAJCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gJiAweGZmZmYpOwogCisJc2V0X2JpdChFRklfU1lTVEVNX1RBQkxFUywgJmVmaS5mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZWZpX3J1bnRpbWVfaW5pdDMyKHZvaWQpCit7CisJZWZpX3J1bnRpbWVfc2VydmljZXNfMzJfdCAqcnVudGltZTsKKworCXJ1bnRpbWUgPSBlYXJseV9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKWVmaS5zeXN0YWItPnJ1bnRpbWUsCisJCQlzaXplb2YoZWZpX3J1bnRpbWVfc2VydmljZXNfMzJfdCkpOworCWlmICghcnVudGltZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgdGhlIHJ1bnRpbWUgc2VydmljZSB0YWJsZSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFdlIHdpbGwgb25seSBuZWVkICplYXJseSogYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgdHdvCisJICogRUZJIHJ1bnRpbWUgc2VydmljZXMgYmVmb3JlIHNldF92aXJ0dWFsX2FkZHJlc3NfbWFwCisJICogaXMgaW52b2tlZC4KKwkgKi8KKwllZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9CisJCQkoZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwX3QgKikKKwkJCSh1bnNpZ25lZCBsb25nKXJ1bnRpbWUtPnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwOworCWVhcmx5X2lvdW5tYXAocnVudGltZSwgc2l6ZW9mKGVmaV9ydW50aW1lX3NlcnZpY2VzXzMyX3QpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZmlfcnVudGltZV9pbml0NjQodm9pZCkKK3sKKwllZmlfcnVudGltZV9zZXJ2aWNlc182NF90ICpydW50aW1lOworCisJcnVudGltZSA9IGVhcmx5X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZWZpLnN5c3RhYi0+cnVudGltZSwKKwkJCXNpemVvZihlZmlfcnVudGltZV9zZXJ2aWNlc182NF90KSk7CisJaWYgKCFydW50aW1lKSB7CisJCXByX2VycigiQ291bGQgbm90IG1hcCB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogV2Ugd2lsbCBvbmx5IG5lZWQgKmVhcmx5KiBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZyB0d28KKwkgKiBFRkkgcnVudGltZSBzZXJ2aWNlcyBiZWZvcmUgc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAKKwkgKiBpcyBpbnZva2VkLgorCSAqLworCWVmaV9waHlzLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwID0KKwkJCShlZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXBfdCAqKQorCQkJKHVuc2lnbmVkIGxvbmcpcnVudGltZS0+c2V0X3ZpcnR1YWxfYWRkcmVzc19tYXA7CisJZWFybHlfaW91bm1hcChydW50aW1lLCBzaXplb2YoZWZpX3J1bnRpbWVfc2VydmljZXNfNjRfdCkpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGVmaV9ydW50aW1lX2luaXQodm9pZCkKIHsKLQllZmlfcnVudGltZV9zZXJ2aWNlc190ICpydW50aW1lOworCWludCBydjsKIAogCS8qCiAJICogQ2hlY2sgb3V0IHRoZSBydW50aW1lIHNlcnZpY2VzIHRhYmxlLiBXZSBuZWVkIHRvIG1hcApAQCAtNjAyLDI3ICs2MTksMTUgQEAKIAkgKiBhZGRyZXNzIG9mIHNldmVyYWwgb2YgdGhlIEVGSSBydW50aW1lIGZ1bmN0aW9ucywgbmVlZGVkIHRvCiAJICogc2V0IHRoZSBmaXJtd2FyZSBpbnRvIHZpcnR1YWwgbW9kZS4KIAkgKi8KLQlydW50aW1lID0gZWFybHlfaW9yZW1hcCgodW5zaWduZWQgbG9uZyllZmkuc3lzdGFiLT5ydW50aW1lLAotCQkJCXNpemVvZihlZmlfcnVudGltZV9zZXJ2aWNlc190KSk7Ci0JaWYgKCFydW50aW1lKSB7Ci0JCXByX2VycigiQ291bGQgbm90IG1hcCB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQkvKgotCSAqIFdlIHdpbGwgb25seSBuZWVkICplYXJseSogYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcKLQkgKiB0d28gRUZJIHJ1bnRpbWUgc2VydmljZXMgYmVmb3JlIHNldF92aXJ0dWFsX2FkZHJlc3NfbWFwCi0JICogaXMgaW52b2tlZC4KLQkgKi8KLQllZmlfcGh5cy5nZXRfdGltZSA9IChlZmlfZ2V0X3RpbWVfdCAqKXJ1bnRpbWUtPmdldF90aW1lOwotCWVmaV9waHlzLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwID0KLQkJKGVmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcF90ICopCi0JCXJ1bnRpbWUtPnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwOwotCS8qCi0JICogTWFrZSBlZmlfZ2V0X3RpbWUgY2FuIGJlIGNhbGxlZCBiZWZvcmUgZW50ZXJpbmcKLQkgKiB2aXJ0dWFsIG1vZGUuCi0JICovCi0JZWZpLmdldF90aW1lID0gcGh5c19lZmlfZ2V0X3RpbWU7Ci0JZWFybHlfaW91bm1hcChydW50aW1lLCBzaXplb2YoZWZpX3J1bnRpbWVfc2VydmljZXNfdCkpOworCWlmIChlZmlfZW5hYmxlZChFRklfNjRCSVQpKQorCQlydiA9IGVmaV9ydW50aW1lX2luaXQ2NCgpOworCWVsc2UKKwkJcnYgPSBlZmlfcnVudGltZV9pbml0MzIoKTsKKworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJc2V0X2JpdChFRklfUlVOVElNRV9TRVJWSUNFUywgJmVmaS5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY0MSw2ICs2NDYsOCBAQAogCWlmIChhZGRfZWZpX21lbW1hcCkKIAkJZG9fYWRkX2VmaV9tZW1tYXAoKTsKIAorCXNldF9iaXQoRUZJX01FTU1BUCwgJmVmaS5mbGFncyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzIzLDcgKzczMCw3IEBACiAJaWYgKGVmaV9zeXN0YWJfaW5pdChlZmlfcGh5cy5zeXN0YWIpKQogCQlyZXR1cm47CiAKLQlzZXRfYml0KEVGSV9TWVNURU1fVEFCTEVTLCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJc2V0X2JpdChFRklfU1lTVEVNX1RBQkxFUywgJmVmaS5mbGFncyk7CiAKIAllZmkuY29uZmlnX3RhYmxlID0gKHVuc2lnbmVkIGxvbmcpZWZpLnN5c3RhYi0+dGFibGVzOwogCWVmaS5md192ZW5kb3IJID0gKHVuc2lnbmVkIGxvbmcpZWZpLnN5c3RhYi0+ZndfdmVuZG9yOwpAQCAtNzUxLDI0ICs3NTgsMjEgQEAKIAlpZiAoZWZpX2NvbmZpZ19pbml0KGFyY2hfdGFibGVzKSkKIAkJcmV0dXJuOwogCi0Jc2V0X2JpdChFRklfQ09ORklHX1RBQkxFUywgJng4Nl9lZmlfZmFjaWxpdHkpOwotCiAJLyoKIAkgKiBOb3RlOiBXZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBydW50aW1lIHNlcnZpY2VzIG9uIGFuIEVGSQogCSAqIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUga2VybmVsIDMyLzY0LWJpdCBtb2RlLgogCSAqLwogCi0JaWYgKCFlZmlfaXNfbmF0aXZlKCkpCisJaWYgKCFlZmlfcnVudGltZV9zdXBwb3J0ZWQoKSkKIAkJcHJfaW5mbygiTm8gRUZJIHJ1bnRpbWUgZHVlIHRvIDMyLzY0LWJpdCBtaXNtYXRjaCB3aXRoIGtlcm5lbFxuIik7CiAJZWxzZSB7CiAJCWlmIChkaXNhYmxlX3J1bnRpbWUgfHwgZWZpX3J1bnRpbWVfaW5pdCgpKQogCQkJcmV0dXJuOwotCQlzZXRfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmeDg2X2VmaV9mYWNpbGl0eSk7CiAJfQogCWlmIChlZmlfbWVtbWFwX2luaXQoKSkKIAkJcmV0dXJuOwogCi0Jc2V0X2JpdChFRklfTUVNTUFQLCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJc2V0X2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKIAogCXByaW50X2VmaV9tZW1tYXAoKTsKIH0KQEAgLTg0NSw2ICs4NDksMjIgQEAKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWQtPnBoeXNfYWRkcik7CiB9CiAKK3N0YXRpYyB2b2lkIG5hdGl2ZV9ydW50aW1lX3NldHVwKHZvaWQpCit7CisJZWZpLmdldF90aW1lID0gdmlydF9lZmlfZ2V0X3RpbWU7CisJZWZpLnNldF90aW1lID0gdmlydF9lZmlfc2V0X3RpbWU7CisJZWZpLmdldF93YWtldXBfdGltZSA9IHZpcnRfZWZpX2dldF93YWtldXBfdGltZTsKKwllZmkuc2V0X3dha2V1cF90aW1lID0gdmlydF9lZmlfc2V0X3dha2V1cF90aW1lOworCWVmaS5nZXRfdmFyaWFibGUgPSB2aXJ0X2VmaV9nZXRfdmFyaWFibGU7CisJZWZpLmdldF9uZXh0X3ZhcmlhYmxlID0gdmlydF9lZmlfZ2V0X25leHRfdmFyaWFibGU7CisJZWZpLnNldF92YXJpYWJsZSA9IHZpcnRfZWZpX3NldF92YXJpYWJsZTsKKwllZmkuZ2V0X25leHRfaGlnaF9tb25vX2NvdW50ID0gdmlydF9lZmlfZ2V0X25leHRfaGlnaF9tb25vX2NvdW50OworCWVmaS5yZXNldF9zeXN0ZW0gPSB2aXJ0X2VmaV9yZXNldF9zeXN0ZW07CisJZWZpLnF1ZXJ5X3ZhcmlhYmxlX2luZm8gPSB2aXJ0X2VmaV9xdWVyeV92YXJpYWJsZV9pbmZvOworCWVmaS51cGRhdGVfY2Fwc3VsZSA9IHZpcnRfZWZpX3VwZGF0ZV9jYXBzdWxlOworCWVmaS5xdWVyeV9jYXBzdWxlX2NhcHMgPSB2aXJ0X2VmaV9xdWVyeV9jYXBzdWxlX2NhcHM7Cit9CisKIC8qIE1lcmdlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhdHRyaWJ1dGUgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBlZmlfbWVyZ2VfcmVnaW9ucyh2b2lkKQogewpAQCAtODkyLDggKzkxMiw5IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzYXZlX3J1bnRpbWVfbWFwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc2F2ZV9ydW50aW1lX21hcCh2b2lkKQogeworI2lmZGVmIENPTkZJR19LRVhFQwogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKIAl2b2lkICp0bXAsICpwLCAqcSA9IE5VTEw7CiAJaW50IGNvdW50ID0gMDsKQEAgLTkxNSw0MSArOTM2LDQ3IEBACiAJfQogCiAJZWZpX3J1bnRpbWVfbWFwX3NldHVwKHEsIGNvdW50LCBtZW1tYXAuZGVzY19zaXplKTsKKwlyZXR1cm47CiAKLQlyZXR1cm4gMDsKIG91dDoKIAlrZnJlZShxKTsKLQlyZXR1cm4gLUVOT01FTTsKKwlwcl9lcnIoIkVycm9yIHNhdmluZyBydW50aW1lIG1hcCwgZWZpIHJ1bnRpbWUgb24ga2V4ZWMgbm9uLWZ1bmN0aW9uYWwhIVxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgKnJlYWxsb2NfcGFnZXModm9pZCAqb2xkX21lbW1hcCwgaW50IG9sZF9zaGlmdCkKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb2xkX3NoaWZ0ICsgMSk7CisJaWYgKCFyZXQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBBIGZpcnN0LXRpbWUgYWxsb2NhdGlvbiBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gY29weS4KKwkgKi8KKwlpZiAoIW9sZF9tZW1tYXApCisJCXJldHVybiByZXQ7CisKKwltZW1jcHkocmV0LCBvbGRfbWVtbWFwLCBQQUdFX1NJWkUgPDwgb2xkX3NoaWZ0KTsKKworb3V0OgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpb2xkX21lbW1hcCwgb2xkX3NoaWZ0KTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgotICogTWFwIGVmaSByZWdpb25zIHdoaWNoIHdlcmUgcGFzc2VkIHZpYSBzZXR1cF9kYXRhLiBUaGUgdmlydF9hZGRyIGlzIGEgZml4ZWQKLSAqIGFkZHIgd2hpY2ggd2FzIHVzZWQgaW4gZmlyc3Qga2VybmVsIG9mIGEga2V4ZWMgYm9vdC4KKyAqIE1hcCB0aGUgZWZpIG1lbW9yeSByYW5nZXMgb2YgdGhlIHJ1bnRpbWUgc2VydmljZXMgYW5kIHVwZGF0ZSBuZXdfbW1hcCB3aXRoCisgKiB2aXJ0dWFsIGFkZHJlc3Nlcy4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uc19maXhlZCh2b2lkKQorc3RhdGljIHZvaWQgKiBfX2luaXQgZWZpX21hcF9yZWdpb25zKGludCAqY291bnQsIGludCAqcGdfc2hpZnQpCiB7Ci0Jdm9pZCAqcDsKKwl2b2lkICpwLCAqbmV3X21lbW1hcCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsZWZ0ID0gMDsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAKIAlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgewogCQltZCA9IHA7Ci0JCWVmaV9tYXBfcmVnaW9uX2ZpeGVkKG1kKTsgLyogRklYTUU6IGFkZCBlcnJvciBoYW5kbGluZyAqLwotCQlnZXRfc3lzdGFiX3ZpcnRfYWRkcihtZCk7Ci0JfQotCi19Ci0KLS8qCi0gKiBNYXAgZWZpIG1lbW9yeSByYW5nZXMgZm9yIHJ1bnRpbWUgc2VyaXZjZSBhbmQgdXBkYXRlIG5ld19tZW1tYXAgd2l0aCB2aXJ0dWFsCi0gKiBhZGRyZXNzZXMuCi0gKi8KLXN0YXRpYyB2b2lkICogX19pbml0IGVmaV9tYXBfcmVnaW9ucyhpbnQgKmNvdW50KQotewotCWVmaV9tZW1vcnlfZGVzY190ICptZDsKLQl2b2lkICpwLCAqdG1wLCAqbmV3X21lbW1hcCA9IE5VTEw7Ci0KLQlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgewotCQltZCA9IHA7CiAJCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpKSB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCQkJaWYgKG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgJiYKQEAgLTk2MSwyMCArOTg4LDgwIEBACiAJCWVmaV9tYXBfcmVnaW9uKG1kKTsKIAkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOwogCi0JCXRtcCA9IGtyZWFsbG9jKG5ld19tZW1tYXAsICgqY291bnQgKyAxKSAqIG1lbW1hcC5kZXNjX3NpemUsCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdG1wKQotCQkJZ290byBvdXQ7Ci0JCW5ld19tZW1tYXAgPSB0bXA7CisJCWlmIChsZWZ0IDwgbWVtbWFwLmRlc2Nfc2l6ZSkgeworCQkJbmV3X21lbW1hcCA9IHJlYWxsb2NfcGFnZXMobmV3X21lbW1hcCwgKnBnX3NoaWZ0KTsKKwkJCWlmICghbmV3X21lbW1hcCkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJbGVmdCArPSBQQUdFX1NJWkUgPDwgKnBnX3NoaWZ0OworCQkJKCpwZ19zaGlmdCkrKzsKKwkJfQorCiAJCW1lbWNweShuZXdfbWVtbWFwICsgKCpjb3VudCAqIG1lbW1hcC5kZXNjX3NpemUpLCBtZCwKIAkJICAgICAgIG1lbW1hcC5kZXNjX3NpemUpOworCisJCWxlZnQgLT0gbWVtbWFwLmRlc2Nfc2l6ZTsKIAkJKCpjb3VudCkrKzsKIAl9CiAKIAlyZXR1cm4gbmV3X21lbW1hcDsKLW91dDoKLQlrZnJlZShuZXdfbWVtbWFwKTsKLQlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGtleGVjX2VudGVyX3ZpcnR1YWxfbW9kZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19LRVhFQworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwl2b2lkICpwOworCisJZWZpLnN5c3RhYiA9IE5VTEw7CisKKwkvKgorCSAqIFdlIGRvbid0IGRvIHZpcnR1YWwgbW9kZSwgc2luY2Ugd2UgZG9uJ3QgZG8gcnVudGltZSBzZXJ2aWNlcywgb24KKwkgKiBub24tbmF0aXZlIEVGSQorCSAqLworCWlmICghZWZpX2lzX25hdGl2ZSgpKSB7CisJCWVmaV91bm1hcF9tZW1tYXAoKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJKiBNYXAgZWZpIHJlZ2lvbnMgd2hpY2ggd2VyZSBwYXNzZWQgdmlhIHNldHVwX2RhdGEuIFRoZSB2aXJ0X2FkZHIgaXMgYQorCSogZml4ZWQgYWRkciB3aGljaCB3YXMgdXNlZCBpbiBmaXJzdCBrZXJuZWwgb2YgYSBrZXhlYyBib290LgorCSovCisJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKKwkJbWQgPSBwOworCQllZmlfbWFwX3JlZ2lvbl9maXhlZChtZCk7IC8qIEZJWE1FOiBhZGQgZXJyb3IgaGFuZGxpbmcgKi8KKwkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOworCX0KKworCXNhdmVfcnVudGltZV9tYXAoKTsKKworCUJVR19PTighZWZpLnN5c3RhYik7CisKKwllZmlfc3luY19sb3dfa2VybmVsX21hcHBpbmdzKCk7CisKKwkvKgorCSAqIE5vdyB0aGF0IEVGSSBpcyBpbiB2aXJ0dWFsIG1vZGUsIHVwZGF0ZSB0aGUgZnVuY3Rpb24KKwkgKiBwb2ludGVycyBpbiB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIHRvIHRoZSBuZXcgdmlydHVhbCBhZGRyZXNzZXMuCisJICoKKwkgKiBDYWxsIEVGSSBzZXJ2aWNlcyB0aHJvdWdoIHdyYXBwZXIgZnVuY3Rpb25zLgorCSAqLworCWVmaS5ydW50aW1lX3ZlcnNpb24gPSBlZmlfc3lzdGFiLmhkci5yZXZpc2lvbjsKKworCW5hdGl2ZV9ydW50aW1lX3NldHVwKCk7CisKKwllZmkuc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAgPSBOVUxMOworCisJaWYgKGVmaV9lbmFibGVkKEVGSV9PTERfTUVNTUFQKSAmJiAoX19zdXBwb3J0ZWRfcHRlX21hc2sgJiBfUEFHRV9OWCkpCisJCXJ1bnRpbWVfY29kZV9wYWdlX21rZXhlYygpOworCisJLyogY2xlYW4gRFVNTVkgb2JqZWN0ICovCisJZWZpLnNldF92YXJpYWJsZShlZmlfZHVtbXlfbmFtZSwgJkVGSV9EVU1NWV9HVUlELAorCQkJIEVGSV9WQVJJQUJMRV9OT05fVk9MQVRJTEUgfAorCQkJIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgfAorCQkJIEVGSV9WQVJJQUJMRV9SVU5USU1FX0FDQ0VTUywKKwkJCSAwLCBOVUxMKTsKKyNlbmRpZgogfQogCiAvKgpAQCAtOTk2LDU3ICsxMDgzLDUzIEBACiAgKgogICogU3BlY2lhbGx5IGZvciBrZXhlYyBib290LCBlZmkgcnVudGltZSBtYXBzIGluIHByZXZpb3VzIGtlcm5lbCBzaG91bGQKICAqIGJlIHBhc3NlZCBpbiB2aWEgc2V0dXBfZGF0YS4gSW4gdGhhdCBjYXNlIHJ1bnRpbWUgcmFuZ2VzIHdpbGwgYmUgbWFwcGVkCi0gKiB0byB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3NlcyBhcyB0aGUgZmlyc3Qga2VybmVsLgorICogdG8gdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzZXMgYXMgdGhlIGZpcnN0IGtlcm5lbCwgc2VlCisgKiBrZXhlY19lbnRlcl92aXJ0dWFsX21vZGUoKS4KICAqLwotdm9pZCBfX2luaXQgZWZpX2VudGVyX3ZpcnR1YWxfbW9kZSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IF9fZWZpX2VudGVyX3ZpcnR1YWxfbW9kZSh2b2lkKQogewotCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJaW50IGNvdW50ID0gMCwgcGdfc2hpZnQgPSAwOwogCXZvaWQgKm5ld19tZW1tYXAgPSBOVUxMOwotCWludCBlcnIsIGNvdW50ID0gMDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCiAJZWZpLnN5c3RhYiA9IE5VTEw7CiAKLQkvKgotCSAqIFdlIGRvbid0IGRvIHZpcnR1YWwgbW9kZSwgc2luY2Ugd2UgZG9uJ3QgZG8gcnVudGltZSBzZXJ2aWNlcywgb24KLQkgKiBub24tbmF0aXZlIEVGSQotCSAqLwotCWlmICghZWZpX2lzX25hdGl2ZSgpKSB7Ci0JCWVmaV91bm1hcF9tZW1tYXAoKTsKKwllZmlfbWVyZ2VfcmVnaW9ucygpOworCW5ld19tZW1tYXAgPSBlZmlfbWFwX3JlZ2lvbnMoJmNvdW50LCAmcGdfc2hpZnQpOworCWlmICghbmV3X21lbW1hcCkgeworCQlwcl9lcnIoIkVycm9yIHJlYWxsb2NhdGluZyBtZW1vcnksIEVGSSBydW50aW1lIG5vbi1mdW5jdGlvbmFsIVxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZWZpX3NldHVwKSB7Ci0JCWVmaV9tYXBfcmVnaW9uc19maXhlZCgpOwotCX0gZWxzZSB7Ci0JCWVmaV9tZXJnZV9yZWdpb25zKCk7Ci0JCW5ld19tZW1tYXAgPSBlZmlfbWFwX3JlZ2lvbnMoJmNvdW50KTsKLQkJaWYgKCFuZXdfbWVtbWFwKSB7Ci0JCQlwcl9lcnIoIkVycm9yIHJlYWxsb2NhdGluZyBtZW1vcnksIEVGSSBydW50aW1lIG5vbi1mdW5jdGlvbmFsIVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllcnIgPSBzYXZlX3J1bnRpbWVfbWFwKCk7Ci0JaWYgKGVycikKLQkJcHJfZXJyKCJFcnJvciBzYXZpbmcgcnVudGltZSBtYXAsIGVmaSBydW50aW1lIG9uIGtleGVjIG5vbi1mdW5jdGlvbmFsISFcbiIpOworCXNhdmVfcnVudGltZV9tYXAoKTsKIAogCUJVR19PTighZWZpLnN5c3RhYik7CiAKLQllZmlfc2V0dXBfcGFnZV90YWJsZXMoKTsKKwlpZiAoZWZpX3NldHVwX3BhZ2VfdGFibGVzKF9fcGEobmV3X21lbW1hcCksIDEgPDwgcGdfc2hpZnQpKQorCQlyZXR1cm47CisKIAllZmlfc3luY19sb3dfa2VybmVsX21hcHBpbmdzKCk7CisJZWZpX2R1bXBfcGFnZXRhYmxlKCk7CiAKLQlpZiAoIWVmaV9zZXR1cCkgeworCWlmIChlZmlfaXNfbmF0aXZlKCkpIHsKIAkJc3RhdHVzID0gcGh5c19lZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAoCi0JCQltZW1tYXAuZGVzY19zaXplICogY291bnQsCi0JCQltZW1tYXAuZGVzY19zaXplLAotCQkJbWVtbWFwLmRlc2NfdmVyc2lvbiwKLQkJCShlZmlfbWVtb3J5X2Rlc2NfdCAqKV9fcGEobmV3X21lbW1hcCkpOworCQkJCW1lbW1hcC5kZXNjX3NpemUgKiBjb3VudCwKKwkJCQltZW1tYXAuZGVzY19zaXplLAorCQkJCW1lbW1hcC5kZXNjX3ZlcnNpb24sCisJCQkJKGVmaV9tZW1vcnlfZGVzY190ICopX19wYShuZXdfbWVtbWFwKSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gZWZpX3RodW5rX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAorCQkJCWVmaV9waHlzLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAorCQkJCW1lbW1hcC5kZXNjX3NpemUgKiBjb3VudCwKKwkJCQltZW1tYXAuZGVzY19zaXplLAorCQkJCW1lbW1hcC5kZXNjX3ZlcnNpb24sCisJCQkJKGVmaV9tZW1vcnlfZGVzY190ICopX19wYShuZXdfbWVtbWFwKSk7CisJfQogCi0JCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJCXByX2FsZXJ0KCJVbmFibGUgdG8gc3dpdGNoIEVGSSBpbnRvIHZpcnR1YWwgbW9kZSAoc3RhdHVzPSVseCkhXG4iLAotCQkJCSBzdGF0dXMpOwotCQkJcGFuaWMoIkVGSSBjYWxsIHRvIFNldFZpcnR1YWxBZGRyZXNzTWFwKCkgZmFpbGVkISIpOwotCQl9CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcl9hbGVydCgiVW5hYmxlIHRvIHN3aXRjaCBFRkkgaW50byB2aXJ0dWFsIG1vZGUgKHN0YXR1cz0lbHgpIVxuIiwKKwkJCSBzdGF0dXMpOworCQlwYW5pYygiRUZJIGNhbGwgdG8gU2V0VmlydHVhbEFkZHJlc3NNYXAoKSBmYWlsZWQhIik7CiAJfQogCiAJLyoKQEAgLTEwNTYsMjMgKzExMzksNDMgQEAKIAkgKiBDYWxsIEVGSSBzZXJ2aWNlcyB0aHJvdWdoIHdyYXBwZXIgZnVuY3Rpb25zLgogCSAqLwogCWVmaS5ydW50aW1lX3ZlcnNpb24gPSBlZmlfc3lzdGFiLmhkci5yZXZpc2lvbjsKLQllZmkuZ2V0X3RpbWUgPSB2aXJ0X2VmaV9nZXRfdGltZTsKLQllZmkuc2V0X3RpbWUgPSB2aXJ0X2VmaV9zZXRfdGltZTsKLQllZmkuZ2V0X3dha2V1cF90aW1lID0gdmlydF9lZmlfZ2V0X3dha2V1cF90aW1lOwotCWVmaS5zZXRfd2FrZXVwX3RpbWUgPSB2aXJ0X2VmaV9zZXRfd2FrZXVwX3RpbWU7Ci0JZWZpLmdldF92YXJpYWJsZSA9IHZpcnRfZWZpX2dldF92YXJpYWJsZTsKLQllZmkuZ2V0X25leHRfdmFyaWFibGUgPSB2aXJ0X2VmaV9nZXRfbmV4dF92YXJpYWJsZTsKLQllZmkuc2V0X3ZhcmlhYmxlID0gdmlydF9lZmlfc2V0X3ZhcmlhYmxlOwotCWVmaS5nZXRfbmV4dF9oaWdoX21vbm9fY291bnQgPSB2aXJ0X2VmaV9nZXRfbmV4dF9oaWdoX21vbm9fY291bnQ7Ci0JZWZpLnJlc2V0X3N5c3RlbSA9IHZpcnRfZWZpX3Jlc2V0X3N5c3RlbTsKKworCWlmIChlZmlfaXNfbmF0aXZlKCkpCisJCW5hdGl2ZV9ydW50aW1lX3NldHVwKCk7CisJZWxzZQorCQllZmlfdGh1bmtfcnVudGltZV9zZXR1cCgpOworCiAJZWZpLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwID0gTlVMTDsKLQllZmkucXVlcnlfdmFyaWFibGVfaW5mbyA9IHZpcnRfZWZpX3F1ZXJ5X3ZhcmlhYmxlX2luZm87Ci0JZWZpLnVwZGF0ZV9jYXBzdWxlID0gdmlydF9lZmlfdXBkYXRlX2NhcHN1bGU7Ci0JZWZpLnF1ZXJ5X2NhcHN1bGVfY2FwcyA9IHZpcnRfZWZpX3F1ZXJ5X2NhcHN1bGVfY2FwczsKIAogCWVmaV9ydW50aW1lX21rZXhlYygpOwogCi0Ja2ZyZWUobmV3X21lbW1hcCk7CisJLyoKKwkgKiBXZSBtYXBwZWQgdGhlIGRlc2NyaXB0b3IgYXJyYXkgaW50byB0aGUgRUZJIHBhZ2V0YWJsZSBhYm92ZSBidXQgd2UncmUKKwkgKiBub3QgdW5tYXBwaW5nIGl0IGhlcmUuIEhlcmUncyB3aHk6CisJICoKKwkgKiBXZSdyZSBjb3B5aW5nIHNlbGVjdCBQR0RzIGZyb20gdGhlIGtlcm5lbCBwYWdlIHRhYmxlIHRvIHRoZSBFRkkgcGFnZQorCSAqIHRhYmxlIGFuZCB3aGVuIHdlIGRvIHNvIGFuZCBtYWtlIGNoYW5nZXMgdG8gdGhvc2UgUEdEcyBsaWtlIHVubWFwcGluZworCSAqIHN0dWZmIGZyb20gdGhlbSwgdGhvc2UgY2hhbmdlcyBhcHBlYXIgaW4gdGhlIGtlcm5lbCBwYWdlIHRhYmxlIGFuZCB3ZQorCSAqIGdvIGJvb20uCisJICoKKwkgKiBGcm9tIHNldHVwX3JlYWxfbW9kZSgpOgorCSAqCisJICogLi4uCisJICogdHJhbXBvbGluZV9wZ2RbMF0gPSBpbml0X2xldmVsNF9wZ3RbcGdkX2luZGV4KF9fUEFHRV9PRkZTRVQpXS5wZ2Q7CisJICoKKwkgKiBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgb3VyIGFsbG9jYXRpb24gaXMgaW4gUEdEIDAgb2YgdGhlIEVGSSBwYWdlCisJICogdGFibGUgYnV0IHdlJ3ZlIGNvcGllZCB0aGF0IFBHRCBmcm9tIFBHRFsyNzJdIG9mIHRoZSBFRkkgcGFnZSB0YWJsZToKKwkgKgorCSAqCXBnZF9pbmRleChfX1BBR0VfT0ZGU0VUID0gMHhmZmZmODgwMDAwMDAwMDAwKSA9IDI3MgorCSAqCisJICogd2hlcmUgdGhlIGRpcmVjdCBtZW1vcnkgbWFwcGluZyBpbiBrZXJuZWwgc3BhY2UgaXMuCisJICoKKwkgKiBuZXdfbWVtbWFwJ3MgVkEgY29tZXMgZnJvbSB0aGF0IGRpcmVjdCBtYXBwaW5nIGFuZCB0aHVzIGNsZWFyaW5nIGl0LAorCSAqIGl0IHdvdWxkIGdldCBjbGVhcmVkIGluIHRoZSBrZXJuZWwgcGFnZSB0YWJsZSB0b28uCisJICoKKwkgKiBlZmlfY2xlYW51cF9wYWdlX3RhYmxlcyhfX3BhKG5ld19tZW1tYXApLCAxIDw8IHBnX3NoaWZ0KTsKKwkgKi8KKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW5ld19tZW1tYXAsIHBnX3NoaWZ0KTsKIAogCS8qIGNsZWFuIERVTU1ZIG9iamVjdCAqLwogCWVmaS5zZXRfdmFyaWFibGUoZWZpX2R1bW15X25hbWUsICZFRklfRFVNTVlfR1VJRCwKQEAgLTEwODIsNiArMTE4NSwxNCBAQAogCQkJIDAsIE5VTEwpOwogfQogCit2b2lkIF9faW5pdCBlZmlfZW50ZXJfdmlydHVhbF9tb2RlKHZvaWQpCit7CisJaWYgKGVmaV9zZXR1cCkKKwkJa2V4ZWNfZW50ZXJfdmlydHVhbF9tb2RlKCk7CisJZWxzZQorCQlfX2VmaV9lbnRlcl92aXJ0dWFsX21vZGUoKTsKK30KKwogLyoKICAqIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBvYnRhaW4gbWVtb3J5IHR5cGVzIGFuZCBhdHRyaWJ1dGVzCiAgKi8KQEAgLTExMTksOSArMTIzMCw4IEBACiB9CiAKIC8qCi0gKiBTb21lIGZpcm13YXJlIGhhcyBzZXJpb3VzIHByb2JsZW1zIHdoZW4gdXNpbmcgbW9yZSB0aGFuIDUwJSBvZiB0aGUgRUZJCi0gKiB2YXJpYWJsZSBzdG9yZSwgaS5lLiBpdCB0cmlnZ2VycyBidWdzIHRoYXQgY2FuIGJyaWNrIG1hY2hpbmVzLiBFbnN1cmUgdGhhdAotICogd2UgbmV2ZXIgdXNlIG1vcmUgdGhhbiB0aGlzIHNhZmUgbGltaXQuCisgKiBTb21lIGZpcm13YXJlIGltcGxlbWVudGF0aW9ucyByZWZ1c2UgdG8gYm9vdCBpZiB0aGVyZSdzIGluc3VmZmljaWVudCBzcGFjZQorICogaW4gdGhlIHZhcmlhYmxlIHN0b3JlLiBFbnN1cmUgdGhhdCB3ZSBuZXZlciB1c2UgbW9yZSB0aGFuIGEgc2FmZSBsaW1pdC4KICAqCiAgKiBSZXR1cm4gRUZJX1NVQ0NFU1MgaWYgaXQgaXMgc2FmZSB0byB3cml0ZSAnc2l6ZScgYnl0ZXMgdG8gdGhlIHZhcmlhYmxlCiAgKiBzdG9yZS4KQEAgLTExNDAsMTAgKzEyNTAsOSBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJLyoKLQkgKiBTb21lIGZpcm13YXJlIGltcGxlbWVudGF0aW9ucyByZWZ1c2UgdG8gYm9vdCBpZiB0aGVyZSdzIGluc3VmZmljaWVudAotCSAqIHNwYWNlIGluIHRoZSB2YXJpYWJsZSBzdG9yZS4gV2UgYWNjb3VudCBmb3IgdGhhdCBieSByZWZ1c2luZyB0aGUKLQkgKiB3cml0ZSBpZiBwZXJtaXR0aW5nIGl0IHdvdWxkIHJlZHVjZSB0aGUgYXZhaWxhYmxlIHNwYWNlIHRvIHVuZGVyCi0JICogNUtCLiBUaGlzIGZpZ3VyZSB3YXMgcHJvdmlkZWQgYnkgU2Ftc3VuZywgc28gc2hvdWxkIGJlIHNhZmUuCisJICogV2UgYWNjb3VudCBmb3IgdGhhdCBieSByZWZ1c2luZyB0aGUgd3JpdGUgaWYgcGVybWl0dGluZyBpdCB3b3VsZAorCSAqIHJlZHVjZSB0aGUgYXZhaWxhYmxlIHNwYWNlIHRvIHVuZGVyIDVLQi4gVGhpcyBmaWd1cmUgd2FzIHByb3ZpZGVkIGJ5CisJICogU2Ftc3VuZywgc28gc2hvdWxkIGJlIHNhZmUuCiAJICovCiAJaWYgKChyZW1haW5pbmdfc2l6ZSAtIHNpemUgPCBFRklfTUlOX1JFU0VSVkUpICYmCiAJCSFlZmlfbm9fc3RvcmFnZV9wYXJhbm9pYSkgewpAQCAtMTIwNiw3ICsxMzE1LDcgQEAKIAkJc3RyKys7CiAKIAlpZiAoIXN0cm5jbXAoc3RyLCAib2xkX21hcCIsIDcpKQotCQlzZXRfYml0KEVGSV9PTERfTUVNTUFQLCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJCXNldF9iaXQoRUZJX09MRF9NRU1NQVAsICZlZmkuZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjE5LDcgKzEzMjgsNyBAQAogCSAqIGZpcm13YXJlL2tlcm5lbCBhcmNoaXRlY3R1cmVzIHNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHJ1bnRpbWUKIAkgKiBzZXJ2aWNlcy4KIAkgKi8KLQlpZiAoIWVmaV9pc19uYXRpdmUoKSkgeworCWlmICghZWZpX3J1bnRpbWVfc3VwcG9ydGVkKCkpIHsKIAkJcHJfaW5mbygiZWZpOiBTZXR1cCBkb25lLCBkaXNhYmxpbmcgZHVlIHRvIDMyLzY0LWJpdCBtaXNtYXRjaFxuIik7CiAJCWVmaV91bm1hcF9tZW1tYXAoKTsKIAl9CkBAIC0xMjI4LDUgKzEzMzcsNSBAQAogCSAqIFVWIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmV3IEVGSSBwYWdldGFibGUgbWFwcGluZyB5ZXQuCiAJICovCiAJaWYgKGlzX3V2X3N5c3RlbSgpKQotCQlzZXRfYml0KEVGSV9PTERfTUVNTUFQLCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJCXNldF9iaXQoRUZJX09MRF9NRU1NQVAsICZlZmkuZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jCmluZGV4IDBiNzRjZGYuLjllZTM0OTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMKQEAgLTQwLDcgKzQwLDEyIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlfcnRfZWZsYWdzOwogCiB2b2lkIGVmaV9zeW5jX2xvd19rZXJuZWxfbWFwcGluZ3Modm9pZCkge30KLXZvaWQgZWZpX3NldHVwX3BhZ2VfdGFibGVzKHZvaWQpIHt9Cit2b2lkIF9faW5pdCBlZmlfZHVtcF9wYWdldGFibGUodm9pZCkge30KK2ludCBlZmlfc2V0dXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcykKK3sKKwlyZXR1cm4gMDsKK30KK3ZvaWQgZWZpX2NsZWFudXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcykge30KIAogdm9pZCBfX2luaXQgZWZpX21hcF9yZWdpb24oZWZpX21lbW9yeV9kZXNjX3QgKm1kKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jCmluZGV4IDBjMmEyMzQuLjI5MGQzOTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgogCiBzdGF0aWMgcGdkX3QgKnNhdmVfcGdkIF9faW5pdGRhdGE7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlfZmxhZ3MgX19pbml0ZGF0YTsKQEAgLTU4LDcgKzU5LDggQEAKIAl1NjQgcHJldl9jcjM7CiAJcGdkX3QgKmVmaV9wZ3Q7CiAJYm9vbCB1c2VfcGdkOwotfTsKKwl1NjQgcGh5c19zdGFjazsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jb2RlX21hcHBpbmdfc2V0X2V4ZWMoaW50IGV4ZWN1dGFibGUpCiB7CkBAIC0xMzcsMTIgKzEzOSw2NCBAQAogCQlzaXplb2YocGdkX3QpICogbnVtX3BnZHMpOwogfQogCi12b2lkIGVmaV9zZXR1cF9wYWdlX3RhYmxlcyh2b2lkKQoraW50IGVmaV9zZXR1cF9wYWdlX3RhYmxlcyh1bnNpZ25lZCBsb25nIHBhX21lbW1hcCwgdW5zaWduZWQgbnVtX3BhZ2VzKQogewotCWVmaV9zY3JhdGNoLmVmaV9wZ3QgPSAocGdkX3QgKikodW5zaWduZWQgbG9uZylyZWFsX21vZGVfaGVhZGVyLT50cmFtcG9saW5lX3BnZDsKKwl1bnNpZ25lZCBsb25nIHRleHQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbnBhZ2VzOworCXBnZF90ICpwZ2Q7CiAKLQlpZiAoIWVmaV9lbmFibGVkKEVGSV9PTERfTUVNTUFQKSkKLQkJZWZpX3NjcmF0Y2gudXNlX3BnZCA9IHRydWU7CisJaWYgKGVmaV9lbmFibGVkKEVGSV9PTERfTUVNTUFQKSkKKwkJcmV0dXJuIDA7CisKKwllZmlfc2NyYXRjaC5lZmlfcGd0ID0gKHBnZF90ICopKHVuc2lnbmVkIGxvbmcpcmVhbF9tb2RlX2hlYWRlci0+dHJhbXBvbGluZV9wZ2Q7CisJcGdkID0gX192YShlZmlfc2NyYXRjaC5lZmlfcGd0KTsKKworCS8qCisJICogSXQgY2FuIGhhcHBlbiB0aGF0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIG5ld19tZW1tYXAgbGFuZHMgaW4gbWVtb3J5CisJICogd2hpY2ggaXMgbm90IG1hcHBlZCBpbiB0aGUgRUZJIHBhZ2UgdGFibGUuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvCisJICogYW5kIGlkZW50LW1hcCB0aG9zZSBwYWdlcyBjb250YWluaW5nIHRoZSBtYXAgYmVmb3JlIGNhbGxpbmcKKwkgKiBwaHlzX2VmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgpLgorCSAqLworCWlmIChrZXJuZWxfbWFwX3BhZ2VzX2luX3BnZChwZ2QsIHBhX21lbW1hcCwgcGFfbWVtbWFwLCBudW1fcGFnZXMsIF9QQUdFX05YKSkgeworCQlwcl9lcnIoIkVycm9yIGlkZW50LW1hcHBpbmcgbmV3IG1lbW1hcCAoMHglbHgpIVxuIiwgcGFfbWVtbWFwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZWZpX3NjcmF0Y2gudXNlX3BnZCA9IHRydWU7CisKKwkvKgorCSAqIFdoZW4gbWFraW5nIGNhbGxzIHRvIHRoZSBmaXJtd2FyZSBldmVyeXRoaW5nIG5lZWRzIHRvIGJlIDE6MQorCSAqIG1hcHBlZCBhbmQgYWRkcmVzc2FibGUgd2l0aCAzMi1iaXQgcG9pbnRlcnMuIE1hcCB0aGUga2VybmVsCisJICogdGV4dCBhbmQgYWxsb2NhdGUgYSBuZXcgc3RhY2sgYmVjYXVzZSB3ZSBjYW4ndCByZWx5IG9uIHRoZQorCSAqIHN0YWNrIHBvaW50ZXIgYmVpbmcgPCA0R0IuCisJICovCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpKQorCQlyZXR1cm4gMDsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfRE1BMzIpOworCWlmICghcGFnZSkKKwkJcGFuaWMoIlVuYWJsZSB0byBhbGxvY2F0ZSBFRkkgcnVudGltZSBzdGFjayA8IDRHQlxuIik7CisKKwllZmlfc2NyYXRjaC5waHlzX3N0YWNrID0gdmlydF90b19waHlzKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJZWZpX3NjcmF0Y2gucGh5c19zdGFjayArPSBQQUdFX1NJWkU7IC8qIHN0YWNrIGdyb3dzIGRvd24gKi8KKworCW5wYWdlcyA9IChfZW5kIC0gX3RleHQpID4+IFBBR0VfU0hJRlQ7CisJdGV4dCA9IF9fcGEoX3RleHQpOworCisJaWYgKGtlcm5lbF9tYXBfcGFnZXNfaW5fcGdkKHBnZCwgdGV4dCA+PiBQQUdFX1NISUZULCB0ZXh0LCBucGFnZXMsIDApKSB7CisJCXByX2VycigiRmFpbGVkIHRvIG1hcCBrZXJuZWwgdGV4dCAxOjFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlZmlfY2xlYW51cF9wYWdlX3RhYmxlcyh1bnNpZ25lZCBsb25nIHBhX21lbW1hcCwgdW5zaWduZWQgbnVtX3BhZ2VzKQoreworCXBnZF90ICpwZ2QgPSAocGdkX3QgKilfX3ZhKHJlYWxfbW9kZV9oZWFkZXItPnRyYW1wb2xpbmVfcGdkKTsKKworCWtlcm5lbF91bm1hcF9wYWdlc19pbl9wZ2QocGdkLCBwYV9tZW1tYXAsIG51bV9wYWdlcyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBfX21hcF9yZWdpb24oZWZpX21lbW9yeV9kZXNjX3QgKm1kLCB1NjQgdmEpCkBAIC0xNzMsNiArMjI3LDE2IEBACiAJICovCiAJX19tYXBfcmVnaW9uKG1kLCBtZC0+cGh5c19hZGRyKTsKIAorCS8qCisJICogRW5mb3JjZSB0aGUgMToxIG1hcHBpbmcgYXMgdGhlIGRlZmF1bHQgdmlydHVhbCBhZGRyZXNzIHdoZW4KKwkgKiBib290aW5nIGluIEVGSSBtaXhlZCBtb2RlLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIHdlIG1heSBiZQorCSAqIHJ1bm5pbmcgYSA2NC1iaXQga2VybmVsLCB0aGUgZmlybXdhcmUgbWF5IG9ubHkgYmUgMzItYml0LgorCSAqLworCWlmICghZWZpX2lzX25hdGl2ZSAoKSAmJiBJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpKSB7CisJCW1kLT52aXJ0X2FkZHIgPSBtZC0+cGh5c19hZGRyOworCQlyZXR1cm47CisJfQorCiAJZWZpX3ZhIC09IHNpemU7CiAKIAkvKiBJcyBQQSAyTS1hbGlnbmVkPyAqLwpAQCAtMjQyLDMgKzMwNiwyOTkgQEAKIAlpZiAoX19zdXBwb3J0ZWRfcHRlX21hc2sgJiBfUEFHRV9OWCkKIAkJcnVudGltZV9jb2RlX3BhZ2VfbWtleGVjKCk7CiB9CisKK3ZvaWQgX19pbml0IGVmaV9kdW1wX3BhZ2V0YWJsZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19FRklfUEdUX0RVTVAKKwlwZ2RfdCAqcGdkID0gKHBnZF90ICopX192YShyZWFsX21vZGVfaGVhZGVyLT50cmFtcG9saW5lX3BnZCk7CisKKwlwdGR1bXBfd2Fsa19wZ2RfbGV2ZWwoTlVMTCwgcGdkKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX0VGSV9NSVhFRAorZXh0ZXJuIGVmaV9zdGF0dXNfdCBlZmk2NF90aHVuayh1MzIsIC4uLik7CisKKyNkZWZpbmUgcnVudGltZV9zZXJ2aWNlMzIoZnVuYykJCQkJCQkgXAorKHsJCQkJCQkJCQkgXAorCXUzMiB0YWJsZSA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpZWZpLnN5c3RhYjsJCQkgXAorCXUzMiAqcnQsICpfX19mOwkJCQkJCQkgXAorCQkJCQkJCQkJIFwKKwlydCA9ICh1MzIgKikodGFibGUgKyBvZmZzZXRvZihlZmlfc3lzdGVtX3RhYmxlXzMyX3QsIHJ1bnRpbWUpKTsJIFwKKwlfX19mID0gKHUzMiAqKSgqcnQgKyBvZmZzZXRvZihlZmlfcnVudGltZV9zZXJ2aWNlc18zMl90LCBmdW5jKSk7IFwKKwkqX19fZjsJCQkJCQkJCSBcCit9KQorCisvKgorICogU3dpdGNoIHRvIHRoZSBFRkkgcGFnZSB0YWJsZXMgZWFybHkgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZSAxOjEKKyAqIHJ1bnRpbWUgc2VydmljZXMgbWFwcGluZ3Mgd2hpY2ggYXJlIG5vdCBtYXBwZWQgaW4gYW55IG90aGVyIHBhZ2UKKyAqIHRhYmxlcy4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVudGltZV9zZXJ2aWNlMzIoKS4KKyAqCisgKiBBbHNvLCBkaXNhYmxlIGludGVycnVwdHMgYmVjYXVzZSB0aGUgSURUIHBvaW50cyB0byA2NC1iaXQgaGFuZGxlcnMsCisgKiB3aGljaCBhcmVuJ3QgZ29pbmcgdG8gZnVuY3Rpb24gY29ycmVjdGx5IHdoZW4gd2Ugc3dpdGNoIHRvIDMyLWJpdC4KKyAqLworI2RlZmluZSBlZmlfdGh1bmsoZiwgLi4uKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWVmaV9zdGF0dXNfdCBfX3M7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAorCXUzMiBmdW5jOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJZWZpX3N5bmNfbG93X2tlcm5lbF9tYXBwaW5ncygpOwkJCQkJXAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsJCQkJCQlcCisJCQkJCQkJCQlcCisJZWZpX3NjcmF0Y2gucHJldl9jcjMgPSByZWFkX2NyMygpOwkJCQlcCisJd3JpdGVfY3IzKCh1bnNpZ25lZCBsb25nKWVmaV9zY3JhdGNoLmVmaV9wZ3QpOwkJCVwKKwlfX2ZsdXNoX3RsYl9hbGwoKTsJCQkJCQlcCisJCQkJCQkJCQlcCisJZnVuYyA9IHJ1bnRpbWVfc2VydmljZTMyKGYpOwkJCQkJXAorCV9fcyA9IGVmaTY0X3RodW5rKGZ1bmMsIF9fVkFfQVJHU19fKTsJCQlcCisJCQkJCQkJCQlcCisJd3JpdGVfY3IzKGVmaV9zY3JhdGNoLnByZXZfY3IzKTsJCQkJXAorCV9fZmx1c2hfdGxiX2FsbCgpOwkJCQkJCVwKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CQkJCQlcCisJCQkJCQkJCQlcCisJX19zOwkJCQkJCQkJXAorfSkKKworZWZpX3N0YXR1c190IGVmaV90aHVua19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgKKwl2b2lkICpwaHlzX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAorCXVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAorCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLAorCXUzMiBkZXNjcmlwdG9yX3ZlcnNpb24sCisJZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZnVuYzsKKworCWVmaV9zeW5jX2xvd19rZXJuZWxfbWFwcGluZ3MoKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwllZmlfc2NyYXRjaC5wcmV2X2NyMyA9IHJlYWRfY3IzKCk7CisJd3JpdGVfY3IzKCh1bnNpZ25lZCBsb25nKWVmaV9zY3JhdGNoLmVmaV9wZ3QpOworCV9fZmx1c2hfdGxiX2FsbCgpOworCisJZnVuYyA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpcGh5c19zZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKKwlzdGF0dXMgPSBlZmk2NF90aHVuayhmdW5jLCBtZW1vcnlfbWFwX3NpemUsIGRlc2NyaXB0b3Jfc2l6ZSwKKwkJCSAgICAgZGVzY3JpcHRvcl92ZXJzaW9uLCB2aXJ0dWFsX21hcCk7CisKKwl3cml0ZV9jcjMoZWZpX3NjcmF0Y2gucHJldl9jcjMpOworCV9fZmx1c2hfdGxiX2FsbCgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QgZWZpX3RodW5rX2dldF90aW1lKGVmaV90aW1lX3QgKnRtLCBlZmlfdGltZV9jYXBfdCAqdGMpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1MzIgcGh5c190bSwgcGh5c190YzsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJcGh5c190bSA9IHZpcnRfdG9fcGh5cyh0bSk7CisJcGh5c190YyA9IHZpcnRfdG9fcGh5cyh0Yyk7CisKKwlzdGF0dXMgPSBlZmlfdGh1bmsoZ2V0X3RpbWUsIHBoeXNfdG0sIHBoeXNfdGMpOworCisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QgZWZpX3RodW5rX3NldF90aW1lKGVmaV90aW1lX3QgKnRtKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHBoeXNfdG07CisKKwlzcGluX2xvY2soJnJ0Y19sb2NrKTsKKworCXBoeXNfdG0gPSB2aXJ0X3RvX3BoeXModG0pOworCisJc3RhdHVzID0gZWZpX3RodW5rKHNldF90aW1lLCBwaHlzX3RtKTsKKworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfdGh1bmtfZ2V0X3dha2V1cF90aW1lKGVmaV9ib29sX3QgKmVuYWJsZWQsIGVmaV9ib29sX3QgKnBlbmRpbmcsCisJCQkgIGVmaV90aW1lX3QgKnRtKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHBoeXNfZW5hYmxlZCwgcGh5c19wZW5kaW5nLCBwaHlzX3RtOworCisJc3Bpbl9sb2NrKCZydGNfbG9jayk7CisKKwlwaHlzX2VuYWJsZWQgPSB2aXJ0X3RvX3BoeXMoZW5hYmxlZCk7CisJcGh5c19wZW5kaW5nID0gdmlydF90b19waHlzKHBlbmRpbmcpOworCXBoeXNfdG0gPSB2aXJ0X3RvX3BoeXModG0pOworCisJc3RhdHVzID0gZWZpX3RodW5rKGdldF93YWtldXBfdGltZSwgcGh5c19lbmFibGVkLAorCQkJICAgICBwaHlzX3BlbmRpbmcsIHBoeXNfdG0pOworCisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV90aHVua19zZXRfd2FrZXVwX3RpbWUoZWZpX2Jvb2xfdCBlbmFibGVkLCBlZmlfdGltZV90ICp0bSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX3RtOworCisJc3Bpbl9sb2NrKCZydGNfbG9jayk7CisKKwlwaHlzX3RtID0gdmlydF90b19waHlzKHRtKTsKKworCXN0YXR1cyA9IGVmaV90aHVuayhzZXRfd2FrZXVwX3RpbWUsIGVuYWJsZWQsIHBoeXNfdG0pOworCisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGVmaV9zdGF0dXNfdAorZWZpX3RodW5rX2dldF92YXJpYWJsZShlZmlfY2hhcjE2X3QgKm5hbWUsIGVmaV9ndWlkX3QgKnZlbmRvciwKKwkJICAgICAgIHUzMiAqYXR0ciwgdW5zaWduZWQgbG9uZyAqZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHBoeXNfbmFtZSwgcGh5c192ZW5kb3IsIHBoeXNfYXR0cjsKKwl1MzIgcGh5c19kYXRhX3NpemUsIHBoeXNfZGF0YTsKKworCXBoeXNfZGF0YV9zaXplID0gdmlydF90b19waHlzKGRhdGFfc2l6ZSk7CisJcGh5c192ZW5kb3IgPSB2aXJ0X3RvX3BoeXModmVuZG9yKTsKKwlwaHlzX25hbWUgPSB2aXJ0X3RvX3BoeXMobmFtZSk7CisJcGh5c19hdHRyID0gdmlydF90b19waHlzKGF0dHIpOworCXBoeXNfZGF0YSA9IHZpcnRfdG9fcGh5cyhkYXRhKTsKKworCXN0YXR1cyA9IGVmaV90aHVuayhnZXRfdmFyaWFibGUsIHBoeXNfbmFtZSwgcGh5c192ZW5kb3IsCisJCQkgICBwaHlzX2F0dHIsIHBoeXNfZGF0YV9zaXplLCBwaHlzX2RhdGEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorZWZpX3RodW5rX3NldF92YXJpYWJsZShlZmlfY2hhcjE2X3QgKm5hbWUsIGVmaV9ndWlkX3QgKnZlbmRvciwKKwkJICAgICAgIHUzMiBhdHRyLCB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwl1MzIgcGh5c19uYW1lLCBwaHlzX3ZlbmRvciwgcGh5c19kYXRhOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwlwaHlzX25hbWUgPSB2aXJ0X3RvX3BoeXMobmFtZSk7CisJcGh5c192ZW5kb3IgPSB2aXJ0X3RvX3BoeXModmVuZG9yKTsKKwlwaHlzX2RhdGEgPSB2aXJ0X3RvX3BoeXMoZGF0YSk7CisKKwkvKiBJZiBkYXRhX3NpemUgaXMgPiBzaXplb2YodTMyKSB3ZSd2ZSBnb3QgcHJvYmxlbXMgKi8KKwlzdGF0dXMgPSBlZmlfdGh1bmsoc2V0X3ZhcmlhYmxlLCBwaHlzX25hbWUsIHBoeXNfdmVuZG9yLAorCQkJICAgYXR0ciwgZGF0YV9zaXplLCBwaHlzX2RhdGEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorZWZpX3RodW5rX2dldF9uZXh0X3ZhcmlhYmxlKHVuc2lnbmVkIGxvbmcgKm5hbWVfc2l6ZSwKKwkJCSAgICBlZmlfY2hhcjE2X3QgKm5hbWUsCisJCQkgICAgZWZpX2d1aWRfdCAqdmVuZG9yKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHBoeXNfbmFtZV9zaXplLCBwaHlzX25hbWUsIHBoeXNfdmVuZG9yOworCisJcGh5c19uYW1lX3NpemUgPSB2aXJ0X3RvX3BoeXMobmFtZV9zaXplKTsKKwlwaHlzX3ZlbmRvciA9IHZpcnRfdG9fcGh5cyh2ZW5kb3IpOworCXBoeXNfbmFtZSA9IHZpcnRfdG9fcGh5cyhuYW1lKTsKKworCXN0YXR1cyA9IGVmaV90aHVuayhnZXRfbmV4dF92YXJpYWJsZSwgcGh5c19uYW1lX3NpemUsCisJCQkgICBwaHlzX25hbWUsIHBoeXNfdmVuZG9yKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV90aHVua19nZXRfbmV4dF9oaWdoX21vbm9fY291bnQodTMyICpjb3VudCkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX2NvdW50OworCisJcGh5c19jb3VudCA9IHZpcnRfdG9fcGh5cyhjb3VudCk7CisJc3RhdHVzID0gZWZpX3RodW5rKGdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCwgcGh5c19jb3VudCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorZWZpX3RodW5rX3Jlc2V0X3N5c3RlbShpbnQgcmVzZXRfdHlwZSwgZWZpX3N0YXR1c190IHN0YXR1cywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplLCBlZmlfY2hhcjE2X3QgKmRhdGEpCit7CisJdTMyIHBoeXNfZGF0YTsKKworCXBoeXNfZGF0YSA9IHZpcnRfdG9fcGh5cyhkYXRhKTsKKworCWVmaV90aHVuayhyZXNldF9zeXN0ZW0sIHJlc2V0X3R5cGUsIHN0YXR1cywgZGF0YV9zaXplLCBwaHlzX2RhdGEpOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfdGh1bmtfdXBkYXRlX2NhcHN1bGUoZWZpX2NhcHN1bGVfaGVhZGVyX3QgKipjYXBzdWxlcywKKwkJCSB1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHNnX2xpc3QpCit7CisJLyoKKwkgKiBUbyBwcm9wZXJseSBzdXBwb3J0IHRoaXMgZnVuY3Rpb24gd2Ugd291bGQgbmVlZCB0byByZXBhY2thZ2UKKwkgKiAnY2Fwc3VsZXMnIGJlY2F1c2UgdGhlIGZpcm13YXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCA2NC1iaXQKKwkgKiBwb2ludGVycy4KKwkgKi8KKwlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfdGh1bmtfcXVlcnlfdmFyaWFibGVfaW5mbyh1MzIgYXR0ciwgdTY0ICpzdG9yYWdlX3NwYWNlLAorCQkJICAgICAgdTY0ICpyZW1haW5pbmdfc3BhY2UsCisJCQkgICAgICB1NjQgKm1heF92YXJpYWJsZV9zaXplKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHBoeXNfc3RvcmFnZSwgcGh5c19yZW1haW5pbmcsIHBoeXNfbWF4OworCisJaWYgKGVmaS5ydW50aW1lX3ZlcnNpb24gPCBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pCisJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisKKwlwaHlzX3N0b3JhZ2UgPSB2aXJ0X3RvX3BoeXMoc3RvcmFnZV9zcGFjZSk7CisJcGh5c19yZW1haW5pbmcgPSB2aXJ0X3RvX3BoeXMocmVtYWluaW5nX3NwYWNlKTsKKwlwaHlzX21heCA9IHZpcnRfdG9fcGh5cyhtYXhfdmFyaWFibGVfc2l6ZSk7CisKKwlzdGF0dXMgPSBlZmlfdGh1bmsocXVlcnlfdmFyaWFibGVfaW5mbywgYXR0ciwgcGh5c19zdG9yYWdlLAorCQkJICAgcGh5c19yZW1haW5pbmcsIHBoeXNfbWF4KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV90aHVua19xdWVyeV9jYXBzdWxlX2NhcHMoZWZpX2NhcHN1bGVfaGVhZGVyX3QgKipjYXBzdWxlcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdTY0ICptYXhfc2l6ZSwKKwkJCSAgICAgaW50ICpyZXNldF90eXBlKQoreworCS8qCisJICogVG8gcHJvcGVybHkgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uIHdlIHdvdWxkIG5lZWQgdG8gcmVwYWNrYWdlCisJICogJ2NhcHN1bGVzJyBiZWNhdXNlIHRoZSBmaXJtd2FyZSBkb2Vzbid0IHVuZGVyc3RhbmQgNjQtYml0CisJICogcG9pbnRlcnMuCisJICovCisJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKK30KKwordm9pZCBlZmlfdGh1bmtfcnVudGltZV9zZXR1cCh2b2lkKQoreworCWVmaS5nZXRfdGltZSA9IGVmaV90aHVua19nZXRfdGltZTsKKwllZmkuc2V0X3RpbWUgPSBlZmlfdGh1bmtfc2V0X3RpbWU7CisJZWZpLmdldF93YWtldXBfdGltZSA9IGVmaV90aHVua19nZXRfd2FrZXVwX3RpbWU7CisJZWZpLnNldF93YWtldXBfdGltZSA9IGVmaV90aHVua19zZXRfd2FrZXVwX3RpbWU7CisJZWZpLmdldF92YXJpYWJsZSA9IGVmaV90aHVua19nZXRfdmFyaWFibGU7CisJZWZpLmdldF9uZXh0X3ZhcmlhYmxlID0gZWZpX3RodW5rX2dldF9uZXh0X3ZhcmlhYmxlOworCWVmaS5zZXRfdmFyaWFibGUgPSBlZmlfdGh1bmtfc2V0X3ZhcmlhYmxlOworCWVmaS5nZXRfbmV4dF9oaWdoX21vbm9fY291bnQgPSBlZmlfdGh1bmtfZ2V0X25leHRfaGlnaF9tb25vX2NvdW50OworCWVmaS5yZXNldF9zeXN0ZW0gPSBlZmlfdGh1bmtfcmVzZXRfc3lzdGVtOworCWVmaS5xdWVyeV92YXJpYWJsZV9pbmZvID0gZWZpX3RodW5rX3F1ZXJ5X3ZhcmlhYmxlX2luZm87CisJZWZpLnVwZGF0ZV9jYXBzdWxlID0gZWZpX3RodW5rX3VwZGF0ZV9jYXBzdWxlOworCWVmaS5xdWVyeV9jYXBzdWxlX2NhcHMgPSBlZmlfdGh1bmtfcXVlcnlfY2Fwc3VsZV9jYXBzOworfQorI2VuZGlmIC8qIENPTkZJR19FRklfTUlYRUQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfc3R1Yl82NC5TIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV9zdHViXzY0LlMKaW5kZXggODgwNzNiMS4uZTA5ODRlZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV9zdHViXzY0LlMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV9zdHViXzY0LlMKQEAgLTcsNiArNywxMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CiAKICNkZWZpbmUgU0FWRV9YTU0JCQlcCiAJbW92ICVyc3AsICVyYXg7CQkJXApAQCAtMTY0LDcgKzE2OCwxNjkgQEAKIAlyZXQKIEVORFBST0MoZWZpX2NhbGw2KQogCisjaWZkZWYgQ09ORklHX0VGSV9NSVhFRAorCisvKgorICogV2UgcnVuIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgMToxIG1hcHBpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgd2l0aCBhIDE6MSBtYXBwZWQgc3RhY2suCisgKi8KK0VOVFJZKF9fZWZpNjRfdGh1bmspCisJbW92bAklZHMsICVlYXgKKwlwdXNoCSVyYXgKKwltb3ZsCSVlcywgJWVheAorCXB1c2gJJXJheAorCW1vdmwJJXNzLCAlZWF4CisJcHVzaAklcmF4CisKKwlzdWJxCSQzMiwgJXJzcAorCW1vdmwJJWVzaSwgMHgwKCVyc3ApCisJbW92bAklZWR4LCAweDQoJXJzcCkKKwltb3ZsCSVlY3gsIDB4OCglcnNwKQorCW1vdnEJJXI4LCAlcnNpCisJbW92bAklZXNpLCAweGMoJXJzcCkKKwltb3ZxCSVyOSwgJXJzaQorCW1vdmwJJWVzaSwgIDB4MTAoJXJzcCkKKworCXNnZHQJc2F2ZV9nZHQoJXJpcCkKKworCWxlYXEJMWYoJXJpcCksICVyYngKKwltb3ZxCSVyYngsIGZ1bmNfcnRfcHRyKCVyaXApCisKKwkvKiBTd2l0Y2ggdG8gZ2R0IHdpdGggMzItYml0IHNlZ21lbnRzICovCisJbW92bAk2NCglcnNwKSwgJWVheAorCWxnZHQJKCVyYXgpCisKKwlsZWFxCWVmaV9lbnRlcjMyKCVyaXApLCAlcmF4CisJcHVzaHEJJF9fS0VSTkVMX0NTCisJcHVzaHEJJXJheAorCWxyZXRxCisKKzE6CWFkZHEJJDMyLCAlcnNwCisKKwlsZ2R0CXNhdmVfZ2R0KCVyaXApCisKKwlwb3AJJXJieAorCW1vdmwJJWVieCwgJXNzCisJcG9wCSVyYngKKwltb3ZsCSVlYngsICVlcworCXBvcAklcmJ4CisJbW92bAklZWJ4LCAlZHMKKworCS8qCisJICogQ29udmVydCAzMi1iaXQgc3RhdHVzIGNvZGUgaW50byA2NC1iaXQuCisJICovCisJdGVzdAklcmF4LCAlcmF4CisJanoJMWYKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDBmZmZmZmZmLCAlZWN4CisJYW5kbAkkMHhmMDAwMDAwMCwgJWVheAorCXNobAkkMzIsICVyYXgKKwlvcgklcmN4LCAlcmF4CisxOgorCXJldAorRU5EUFJPQyhfX2VmaTY0X3RodW5rKQorCitFTlRSWShlZmlfZXhpdDMyKQorCW1vdnEJZnVuY19ydF9wdHIoJXJpcCksICVyYXgKKwlwdXNoCSVyYXgKKwltb3YJJXJkaSwgJXJheAorCXJldAorRU5EUFJPQyhlZmlfZXhpdDMyKQorCisJLmNvZGUzMgorLyoKKyAqIEVGSSBzZXJ2aWNlIHBvaW50ZXIgbXVzdCBiZSBpbiAlZWRpLgorICoKKyAqIFRoZSBzdGFjayBzaG91bGQgcmVwcmVzZW50IHRoZSAzMi1iaXQgY2FsbGluZyBjb252ZW50aW9uLgorICovCitFTlRSWShlZmlfZW50ZXIzMikKKwltb3ZsCSRfX0tFUk5FTF9EUywgJWVheAorCW1vdmwJJWVheCwgJWRzCisJbW92bAklZWF4LCAlZXMKKwltb3ZsCSVlYXgsICVzcworCisJLyogUmVsb2FkIHBndGFibGVzICovCisJbW92bAklY3IzLCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisKKwkvKiBEaXNhYmxlIHBhZ2luZyAqLworCW1vdmwJJWNyMCwgJWVheAorCWJ0cmwJJFg4Nl9DUjBfUEdfQklULCAlZWF4CisJbW92bAklZWF4LCAlY3IwCisKKwkvKiBEaXNhYmxlIGxvbmcgbW9kZSB2aWEgRUZFUiAqLworCW1vdmwJJE1TUl9FRkVSLCAlZWN4CisJcmRtc3IKKwlidHJsCSRfRUZFUl9MTUUsICVlYXgKKwl3cm1zcgorCisJY2FsbAkqJWVkaQorCisJLyogV2UgbXVzdCBwcmVzZXJ2ZSByZXR1cm4gdmFsdWUgKi8KKwltb3ZsCSVlYXgsICVlZGkKKworCS8qCisJICogU29tZSBmaXJtd2FyZSB3aWxsIHJldHVybiB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4gQmUgc3VyZSB0bworCSAqIGRpc2FibGUgdGhlbSBiZWZvcmUgd2Ugc3dpdGNoIEdEVHMuCisJICovCisJY2xpCisKKwltb3ZsCTY4KCVlc3ApLCAlZWF4CisJbW92bAklZWF4LCAyKCVlYXgpCisJbGdkdGwJKCVlYXgpCisKKwltb3ZsCSVjcjQsICVlYXgKKwlidHNsCSQoWDg2X0NSNF9QQUVfQklUKSwgJWVheAorCW1vdmwJJWVheCwgJWNyNAorCisJbW92bAklY3IzLCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisKKwltb3ZsCSRNU1JfRUZFUiwgJWVjeAorCXJkbXNyCisJYnRzbAkkX0VGRVJfTE1FLCAlZWF4CisJd3Jtc3IKKworCXhvcmwJJWVheCwgJWVheAorCWxsZHQJJWF4CisKKwltb3ZsCTcyKCVlc3ApLCAlZWF4CisJcHVzaGwJJF9fS0VSTkVMX0NTCisJcHVzaGwJJWVheAorCisJLyogRW5hYmxlIHBhZ2luZyAqLworCW1vdmwJJWNyMCwgJWVheAorCWJ0c2wJJFg4Nl9DUjBfUEdfQklULCAlZWF4CisJbW92bAklZWF4LCAlY3IwCisJbHJldAorRU5EUFJPQyhlZmlfZW50ZXIzMikKKworCS5kYXRhCisJLmJhbGlnbgk4CisJLmdsb2JhbAllZmkzMl9ib290X2dkdAorZWZpMzJfYm9vdF9nZHQ6CS53b3JkCTAKKwkJLnF1YWQJMAorCitzYXZlX2dkdDoJLndvcmQJMAorCQkucXVhZAkwCitmdW5jX3J0X3B0cjoJLnF1YWQJMAorCisJLmdsb2JhbCBlZmlfZ2R0NjQKK2VmaV9nZHQ2NDoKKwkud29yZAllZmlfZ2R0NjRfZW5kIC0gZWZpX2dkdDY0CisJLmxvbmcJMAkJCS8qIEZpbGxlZCBvdXQgYnkgdXNlciAqLworCS53b3JkCTAKKwkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAJLyogTlVMTCBkZXNjcmlwdG9yICovCisJLnF1YWQJMHgwMGFmOWEwMDAwMDBmZmZmCS8qIF9fS0VSTkVMX0NTICovCisJLnF1YWQJMHgwMGNmOTIwMDAwMDBmZmZmCS8qIF9fS0VSTkVMX0RTICovCisJLnF1YWQJMHgwMDgwODkwMDAwMDAwMDAwCS8qIFRTIGRlc2NyaXB0b3IgKi8KKwkucXVhZCAgIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiBUUyBjb250aW51ZWQgKi8KK2VmaV9nZHQ2NF9lbmQ6CisjZW5kaWYgLyogQ09ORklHX0VGSV9NSVhFRCAqLworCiAJLmRhdGEKIEVOVFJZKGVmaV9zY3JhdGNoKQogCS5maWxsIDMsOCwwCiAJLmJ5dGUgMAorCS5xdWFkIDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfdGh1bmtfNjQuUyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfdGh1bmtfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA2ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV90aHVua182NC5TCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBNYXR0IEZsZW1pbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CisKKwkudGV4dAorCS5jb2RlNjQKK0VOVFJZKGVmaTY0X3RodW5rKQorCXB1c2gJJXJicAorCXB1c2gJJXJieAorCisJLyoKKwkgKiBTd2l0Y2ggdG8gMToxIG1hcHBlZCAzMi1iaXQgc3RhY2sgcG9pbnRlci4KKwkgKi8KKwltb3ZxCSVyc3AsIGVmaV9zYXZlZF9zcCglcmlwKQorCW1vdnEJZWZpX3NjcmF0Y2grMjUoJXJpcCksICVyc3AKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgdGV4dC4KKwkgKi8KKwltb3ZxCSRfX1NUQVJUX0tFUk5FTF9tYXAsICVyYXgKKwlzdWJxCXBoeXNfYmFzZSglcmlwKSwgJXJheAorCisJLyoKKwkgKiBQdXNoIHNvbWUgcGh5c2ljYWwgYWRkcmVzc2VzIG9udG8gdGhlIHN0YWNrLiBUaGlzIGlzIGVhc2llcgorCSAqIHRvIGRvIG5vdyBpbiBhIGNvZGU2NCBzZWN0aW9uIHdoaWxlIHRoZSBhc3NlbWJsZXIgY2FuIGFkZHJlc3MKKwkgKiA2NC1iaXQgdmFsdWVzLiBOb3RlIHRoYXQgYWxsIHRoZSBhZGRyZXNzZXMgb24gdGhlIHN0YWNrIGFyZQorCSAqIDMyLWJpdC4KKwkgKi8KKwlzdWJxCSQxNiwgJXJzcAorCWxlYXEJZWZpX2V4aXQzMiglcmlwKSwgJXJieAorCXN1YnEJJXJheCwgJXJieAorCW1vdmwJJWVieCwgOCglcnNwKQorCWxlYXEJZWZpX2dkdDY0KCVyaXApLCAlcmJ4CisJc3VicQklcmF4LCAlcmJ4CisJbW92bAklZWJ4LCAyKCVlYngpCisJbW92bAklZWJ4LCA0KCVyc3ApCisJbGVhcQllZmlfZ2R0MzIoJXJpcCksICVyYngKKwlzdWJxCSVyYXgsICVyYngKKwltb3ZsCSVlYngsIDIoJWVieCkKKwltb3ZsCSVlYngsICglcnNwKQorCisJbGVhcQlfX2VmaTY0X3RodW5rKCVyaXApLCAlcmJ4CisJc3VicQklcmF4LCAlcmJ4CisJY2FsbAkqJXJieAorCisJbW92cQllZmlfc2F2ZWRfc3AoJXJpcCksICVyc3AKKwlwb3AJJXJieAorCXBvcAklcmJwCisJcmV0cQorRU5EUFJPQyhlZmk2NF90aHVuaykKKworCS5kYXRhCitlZmlfZ2R0MzI6CisJLndvcmQgCWVmaV9nZHQzMl9lbmQgLSBlZmlfZ2R0MzIKKwkubG9uZwkwCQkJLyogRmlsbGVkIG91dCBhYm92ZSAqLworCS53b3JkCTAKKwkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAJLyogTlVMTCBkZXNjcmlwdG9yICovCisJLnF1YWQJMHgwMGNmOWEwMDAwMDBmZmZmCS8qIF9fS0VSTkVMX0NTICovCisJLnF1YWQJMHgwMGNmOTMwMDAwMDBmZmZmCS8qIF9fS0VSTkVMX0RTICovCitlZmlfZ2R0MzJfZW5kOgorCitlZmlfc2F2ZWRfc3A6CQkucXVhZCAwCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS90czU1MDAvdHM1NTAwLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS90czU1MDAvdHM1NTAwLmMKaW5kZXggMzlmZWJiMi4uOTQ3MWI5NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdHM1NTAwL3RzNTUwMC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL3RzNTUwMC90czU1MDAuYwpAQCAtODgsNyArODgsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZzsKIAljb25zdCBzc2l6ZV90IG9mZnNldDsKLX0gdHM1NTAwX3NpZ25hdHVyZXNbXSBfX2luaXRkYXRhID0geworfSB0czU1MDBfc2lnbmF0dXJlc1tdIF9faW5pdGNvbnN0ID0gewogCXsgIlRTLTV4MDAgQU1EIEVsYW4iLCAweGIxNCB9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vdmlzd3MvTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiYzE3YS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9iai0kKENPTkZJR19YODZfVklTV1MpCSs9IHZpc3dzX3F1aXJrcy5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy92aXN3c19xdWlya3MuYyBiL2FyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL3Zpc3dzX3F1aXJrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4YTM5Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL3Zpc3dzX3F1aXJrcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qCi0gKiAgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBzdXBwb3J0IGFuZCBxdWlya3MsIHVubWFpbnRhaW5lZC4KLSAqCi0gKiAgU3BsaXQgb3V0IGZyb20gc2V0dXAuYyBieSBkYXZlakBzdXNlLmRlCi0gKgotICoJQ29weXJpZ2h0IChDKSAxOTk5IEJlbnQgSGFnZW1hcmssIEluZ28gTW9sbmFyCi0gKgotICogIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAqCi0gKiAgVGhlIENvYmFsdCBzeXN0ZW0gQVNJQyBpbiB0aGUgVmlzdWFsIFdvcmtzdGF0aW9uIGNvbnRhaW5zIGEgIkNvYmFsdCIgQVBJQwotICogIHdoaWNoIHNlcnZlcyBhcyB0aGUgbWFpbiBpbnRlcnJ1cHQgY29udHJvbGxlciBpbiB0aGUgc3lzdGVtLiAgTm9uLWxlZ2FjeQotICogIGhhcmR3YXJlIGluIHRoZSBzeXN0ZW0gdXNlcyB0aGlzIGNvbnRyb2xsZXIgZGlyZWN0bHkuICBMZWdhY3kgZGV2aWNlcwotICogIGFyZSBjb25uZWN0ZWQgdG8gdGhlIFBJSVg0IHdoaWNoIGluIHR1cm4gaGFzIGl0cyA4MjU5KHMpIGNvbm5lY3RlZCB0bwotICogIGEgb2YgdGhlIENvYmFsdCBBUElDIGVudHJ5LgotICoKLSAqICAwOS8wMi8yMDAwIC0gVXBkYXRlZCBmb3IgMi40IGJ5IGpiYXJuZXNAc2dpLmNvbQotICoKLSAqICAyNS8xMS8yMDAyIC0gVXBkYXRlZCBmb3IgMi41IGJ5IEFuZHJleSBQYW5pbiA8cGF6a2VAb3JiaXRhMS5ydT4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS92aXN3cy9jb2JhbHQuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvcGlpeDQuaD4KLSNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vZTgyMC5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotCi0jaW5jbHVkZSA8YXNtL2k4MjU5Lmg+Ci0jaW5jbHVkZSA8YXNtL2lycV92ZWN0b3JzLmg+Ci0jaW5jbHVkZSA8YXNtL3Zpc3dzL2xpdGhpdW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgotCi1leHRlcm4gaW50IG5vX2Jyb2FkY2FzdDsKLQotY2hhciB2aXN3c19ib2FyZF90eXBlCT0gLTE7Ci1jaGFyIHZpc3dzX2JvYXJkX3Jldgk9IC0xOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgdmlzd3NfdGltZV9pbml0KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU3RhcnRpbmcgQ29iYWx0IFRpbWVyIHN5c3RlbSBjbG9ja1xuIik7Ci0KLQkvKiBTZXQgdGhlIGNvdW50ZG93biB2YWx1ZSAqLwotCWNvX2NwdV93cml0ZShDT19DUFVfVElNRVZBTCwgQ09fVElNRV9IWi9IWik7Ci0KLQkvKiBTdGFydCB0aGUgdGltZXIgKi8KLQljb19jcHVfd3JpdGUoQ09fQ1BVX0NUUkwsIGNvX2NwdV9yZWFkKENPX0NQVV9DVFJMKSB8IENPX0NUUkxfVElNRVJVTik7Ci0KLQkvKiBFbmFibGUgKHVubWFzaykgdGhlIHRpbWVyIGludGVycnVwdCAqLwotCWNvX2NwdV93cml0ZShDT19DUFVfQ1RSTCwgY29fY3B1X3JlYWQoQ09fQ1BVX0NUUkwpICYgfkNPX0NUUkxfVElNRU1BU0spOwotCi0Jc2V0dXBfZGVmYXVsdF90aW1lcl9pcnEoKTsKLX0KLQotLyogUmVwbGFjZXMgdGhlIGRlZmF1bHQgaW5pdF9JU0FfaXJxcyBpbiB0aGUgZ2VuZXJpYyBzZXR1cCAqLwotc3RhdGljIHZvaWQgX19pbml0IHZpc3dzX3ByZV9pbnRyX2luaXQodm9pZCk7Ci0KLS8qIFF1aXJrIGZvciBtYWNoaW5lIHNwZWNpZmljIG1lbW9yeSBzZXR1cC4gKi8KLQotI2RlZmluZSBNQiAoMTAyNCAqIDEwMjQpCi0KLXVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fcGh5czsKLXVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fc2l6ZTsKLUVYUE9SVF9TWU1CT0woc2dpdndmYl9tZW1fcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHNnaXZ3ZmJfbWVtX3NpemUpOwotCi1sb25nIGxvbmcgbWVtX3NpemUgX19pbml0ZGF0YSA9IDA7Ci0KLXN0YXRpYyBjaGFyICogX19pbml0IHZpc3dzX21lbW9yeV9zZXR1cCh2b2lkKQotewotCWxvbmcgbG9uZyBnZnhfbWVtX3NpemUgPSA4ICogTUI7Ci0KLQltZW1fc2l6ZSA9IGJvb3RfcGFyYW1zLmFsdF9tZW1fazsKLQotCWlmICghbWVtX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQm9vdGxvYWRlciBkaWRuJ3Qgc2V0IG1lbW9yeSBzaXplLCB1cGdyYWRlIGl0ICFcbiIpOwotCQltZW1fc2l6ZSA9IDEyOCAqIE1COwotCX0KLQotCS8qCi0JICogdGhpcyBoYXJkY29kZXMgdGhlIGdyYXBoaWNzIG1lbW9yeSB0byA4IE1CCi0JICogaXQgcmVhbGx5IHNob3VsZCBiZSBzaXplZCBkeW5hbWljYWxseSAob3IgYXQgbGVhc3QKLQkgKiBzZXQgYXMgYSBib290IHBhcmFtKQotCSAqLwotCWlmICghc2dpdndmYl9tZW1fc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZWZhdWx0aW5nIHRvIDggTUIgZnJhbWVidWZmZXIgc2l6ZVxuIik7Ci0JCXNnaXZ3ZmJfbWVtX3NpemUgPSA4ICogTUI7Ci0JfQotCi0JLyoKLQkgKiBUcmltIHRvIG5lYXJlc3QgTUIKLQkgKi8KLQlzZ2l2d2ZiX21lbV9zaXplICY9IH4oKDEgPDwgMjApIC0gMSk7Ci0Jc2dpdndmYl9tZW1fcGh5cyA9IG1lbV9zaXplIC0gZ2Z4X21lbV9zaXplOwotCi0JZTgyMF9hZGRfcmVnaW9uKDAsIExPV01FTVNJWkUoKSwgRTgyMF9SQU0pOwotCWU4MjBfYWRkX3JlZ2lvbihISUdIX01FTU9SWSwgbWVtX3NpemUgLSBzZ2l2d2ZiX21lbV9zaXplIC0gSElHSF9NRU1PUlksIEU4MjBfUkFNKTsKLQllODIwX2FkZF9yZWdpb24oc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7Ci0KLQlyZXR1cm4gIlBST00iOwotfQotCi1zdGF0aWMgdm9pZCB2aXN3c19tYWNoaW5lX2VtZXJnZW5jeV9yZXN0YXJ0KHZvaWQpCi17Ci0JLyoKLQkgKiBWaXN1YWwgV29ya3N0YXRpb25zIHJlc3RhcnQgYWZ0ZXIgdGhpcwotCSAqIHJlZ2lzdGVyIGlzIHBva2VkIG9uIHRoZSBQSUlYNAotCSAqLwotCW91dGIoUElJWDRfUkVTRVRfVkFMLCBQSUlYNF9SRVNFVF9QT1JUKTsKLX0KLQotc3RhdGljIHZvaWQgdmlzd3NfbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydCBwbV9zdGF0dXM7Ci0vKglleHRlcm4gdW5zaWduZWQgaW50IHBjaV9idXMwOyAqLwotCi0Jd2hpbGUgKChwbV9zdGF0dXMgPSBpbncoUE1TVFNfUE9SVCkpICYgMHgxMDApCi0JCW91dHcocG1fc3RhdHVzLCBQTVNUU19QT1JUKTsKLQotCW91dHcoUE1fU1VTUEVORF9FTkFCTEUsIFBNQ05UUkxfUE9SVCk7Ci0KLQltZGVsYXkoMTApOwotCi0jZGVmaW5lIFBDSV9DT05GMV9BRERSRVNTKGJ1cywgZGV2Zm4sIHJlZykgXAotCSgweDgwMDAwMDAwIHwgKGJ1cyA8PCAxNikgfCAoZGV2Zm4gPDwgOCkgfCAocmVnICYgfjMpKQotCi0vKglvdXRsKFBDSV9DT05GMV9BRERSRVNTKHBjaV9idXMwLCBTUEVDSUFMX0RFViwgU1BFQ0lBTF9SRUcpLCAweENGOCk7ICovCi0Jb3V0bChQSUlYX1NQRUNJQUxfU1RPUCwgMHhDRkMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdmlzd3NfZ2V0X3NtcF9jb25maWcodW5zaWduZWQgaW50IGVhcmx5KQotewotfQotCi0vKgotICogVGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiBpcyBJbnRlbCBNUCBjb21wbGlhbnQgaW4gdGhlIGhhcmR3YXJlCi0gKiBzZW5zZSwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBhIEJJT1MoLWNvbmZpZ3VyYXRpb24gdGFibGUpLgotICogTm8gcHJvYmxlbSBmb3IgTGludXguCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvKHN0cnVjdCBtcGNfY3B1ICptKQotewotCWludCB2ZXIsIGxvZ2ljYWxfYXBpY2lkOwotCXBoeXNpZF9tYXNrX3QgYXBpY19jcHVzOwotCi0JaWYgKCEobS0+Y3B1ZmxhZyAmIENQVV9FTkFCTEVEKSkKLQkJcmV0dXJuOwotCi0JbG9naWNhbF9hcGljaWQgPSBtLT5hcGljaWQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXNDUFUgIyVkICV1OiV1IEFQSUMgdmVyc2lvbiAlZFxuIiwKLQkgICAgICAgbS0+Y3B1ZmxhZyAmIENQVV9CT09UUFJPQ0VTU09SID8gIkJvb3R1cCAiIDogIiIsCi0JICAgICAgIG0tPmFwaWNpZCwgKG0tPmNwdWZlYXR1cmUgJiBDUFVfRkFNSUxZX01BU0spID4+IDgsCi0JICAgICAgIChtLT5jcHVmZWF0dXJlICYgQ1BVX01PREVMX01BU0spID4+IDQsIG0tPmFwaWN2ZXIpOwotCi0JaWYgKG0tPmNwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikKLQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gbS0+YXBpY2lkOwotCi0JdmVyID0gbS0+YXBpY3ZlcjsKLQlpZiAoKHZlciA+PSAweDE0ICYmIG0tPmFwaWNpZCA+PSAweGZmKSB8fCBtLT5hcGljaWQgPj0gMHhmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUHJvY2Vzc29yICMlZCBJTlZBTElELiAoTWF4IElEOiAlZCkuXG4iLAotCQkJbS0+YXBpY2lkLCBNQVhfTE9DQUxfQVBJQyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhcGljLT5hcGljaWRfdG9fY3B1X3ByZXNlbnQobS0+YXBpY2lkLCAmYXBpY19jcHVzKTsKLQlwaHlzaWRzX29yKHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBwaHlzX2NwdV9wcmVzZW50X21hcCwgYXBpY19jcHVzKTsKLQkvKgotCSAqIFZhbGlkYXRlIHZlcnNpb24KLQkgKi8KLQlpZiAodmVyID09IDB4MCkgewotCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBBUElDIHZlcnNpb24gaXMgMCBmb3IgQ1BVIyVkISAiCi0JCQkiZml4aW5nIHVwIHRvIDB4MTAuICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIiwKLQkJCW0tPmFwaWNpZCk7Ci0JCXZlciA9IDB4MTA7Ci0JfQotCWFwaWNfdmVyc2lvblttLT5hcGljaWRdID0gdmVyOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdmlzd3NfZmluZF9zbXBfY29uZmlnKHZvaWQpCi17Ci0Jc3RydWN0IG1wY19jcHUgKm1wID0gcGh5c190b192aXJ0KENPX0NQVV9UQUJfUEhZUyk7Ci0JdW5zaWduZWQgc2hvcnQgbmNwdXMgPSByZWFkdyhwaHlzX3RvX3ZpcnQoQ09fQ1BVX05VTV9QSFlTKSk7Ci0KLQlpZiAobmNwdXMgPiBDT19DUFVfTUFYKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImZpbmRfdmlzd3Nfc21wOiBnb3QgY3B1IGNvdW50IG9mICVkIGF0ICVwXG4iLAotCQkJbmNwdXMsIG1wKTsKLQotCQluY3B1cyA9IENPX0NQVV9NQVg7Ci0JfQotCi0JaWYgKG5jcHVzID4gc2V0dXBfbWF4X2NwdXMpCi0JCW5jcHVzID0gc2V0dXBfbWF4X2NwdXM7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQlzbXBfZm91bmRfY29uZmlnID0gMTsKLSNlbmRpZgotCXdoaWxlIChuY3B1cy0tKQotCQlNUF9wcm9jZXNzb3JfaW5mbyhtcCsrKTsKLQotCW1wX2xhcGljX2FkZHIgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwotfQotCi1zdGF0aWMgdm9pZCB2aXN3c190cmFwX2luaXQodm9pZCk7Ci0KLXZvaWQgX19pbml0IHZpc3dzX2Vhcmx5X2RldGVjdCh2b2lkKQotewotCWludCByYXc7Ci0KLQl2aXN3c19ib2FyZF90eXBlID0gKGNoYXIpKGluYl9wKFBJSVhfR1BJX0JEX1JFRykgJiBQSUlYX0dQSV9CRF9SRUcpCi0JCQkJCQkJID4+IFBJSVhfR1BJX0JEX1NISUZUOwotCi0JaWYgKHZpc3dzX2JvYXJkX3R5cGUgPCAwKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHBsYXRmb3JtIHNldHVwIGZ1bmN0aW9ucwotCSAqLwotCXg4Nl9pbml0LnJlc291cmNlcy5tZW1vcnlfc2V0dXAgPSB2aXN3c19tZW1vcnlfc2V0dXA7Ci0JeDg2X2luaXQubXBwYXJzZS5nZXRfc21wX2NvbmZpZyA9IHZpc3dzX2dldF9zbXBfY29uZmlnOwotCXg4Nl9pbml0Lm1wcGFyc2UuZmluZF9zbXBfY29uZmlnID0gdmlzd3NfZmluZF9zbXBfY29uZmlnOwotCXg4Nl9pbml0LmlycXMucHJlX3ZlY3Rvcl9pbml0ID0gdmlzd3NfcHJlX2ludHJfaW5pdDsKLQl4ODZfaW5pdC5pcnFzLnRyYXBfaW5pdCA9IHZpc3dzX3RyYXBfaW5pdDsKLQl4ODZfaW5pdC50aW1lcnMudGltZXJfaW5pdCA9IHZpc3dzX3RpbWVfaW5pdDsKLQl4ODZfaW5pdC5wY2kuaW5pdCA9IHBjaV92aXN3c19pbml0OwotCXg4Nl9pbml0LnBjaS5pbml0X2lycSA9IHg4Nl9pbml0X25vb3A7Ci0KLQkvKgotCSAqIEluc3RhbGwgcmVib290IHF1aXJrczoKLQkgKi8KLQlwbV9wb3dlcl9vZmYJCQk9IHZpc3dzX21hY2hpbmVfcG93ZXJfb2ZmOwotCW1hY2hpbmVfb3BzLmVtZXJnZW5jeV9yZXN0YXJ0CT0gdmlzd3NfbWFjaGluZV9lbWVyZ2VuY3lfcmVzdGFydDsKLQotCS8qCi0JICogRG8gbm90IHVzZSBicm9hZGNhc3QgSVBJczoKLQkgKi8KLQlub19icm9hZGNhc3QgPSAwOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0JLyoKLQkgKiBUdXJuIG9mZiBJTy1BUElDIGRldGVjdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246Ci0JICovCi0Jc2tpcF9pb2FwaWNfc2V0dXAJCT0gMTsKLSNlbmRpZgotCi0JLyoKLQkgKiBHZXQgQm9hcmQgcmV2LgotCSAqIEZpcnN0LCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIDMwNyBwYXJ0IHRvIGFsbG93IHVzIGFjY2VzcwotCSAqIHRvIHRoZSBHUElPIHJlZ2lzdGVycy4gIExldCdzIG1hcCB0aGVtIGF0IDB4MGZjMCB3aGljaCBpcyByaWdodAotCSAqIGFmdGVyIHRoZSBQSUlYNCBQTSBzZWN0aW9uLgotCSAqLwotCW91dGJfcChTSU9fREVWX1NFTCwgU0lPX0lOREVYKTsKLQlvdXRiX3AoU0lPX0dQX0RFViwgU0lPX0RBVEEpOwkvKiBUYWxrIHRvIEdQSU8gcmVncy4gKi8KLQotCW91dGJfcChTSU9fREVWX01TQiwgU0lPX0lOREVYKTsKLQlvdXRiX3AoU0lPX0dQX01TQiwgU0lPX0RBVEEpOwkvKiBNU0Igb2YgR1BJTyBiYXNlIGFkZHJlc3MgKi8KLQotCW91dGJfcChTSU9fREVWX0xTQiwgU0lPX0lOREVYKTsKLQlvdXRiX3AoU0lPX0dQX0xTQiwgU0lPX0RBVEEpOwkvKiBMU0Igb2YgR1BJTyBiYXNlIGFkZHJlc3MgKi8KLQotCW91dGJfcChTSU9fREVWX0VOQiwgU0lPX0lOREVYKTsKLQlvdXRiX3AoMSwgU0lPX0RBVEEpOwkJLyogRW5hYmxlIEdQSU8gcmVnaXN0ZXJzLiAqLwotCi0JLyoKLQkgKiBOb3csIHdlIGhhdmUgdG8gbWFwIHRoZSBwb3dlciBtYW5hZ2VtZW50IHNlY3Rpb24gdG8gd3JpdGUKLQkgKiBhIGJpdCB3aGljaCBlbmFibGVzIGFjY2VzcyB0byB0aGUgR1BJTyByZWdpc3RlcnMuCi0JICogV2hhdCBsdW5hdGljIGNhbWUgdXAgd2l0aCB0aGlzIHNoaXQ/Ci0JICovCi0Jb3V0Yl9wKFNJT19ERVZfU0VMLCBTSU9fSU5ERVgpOwotCW91dGJfcChTSU9fUE1fREVWLCBTSU9fREFUQSk7CS8qIFRhbGsgdG8gR1BJTyByZWdzLiAqLwotCi0Jb3V0Yl9wKFNJT19ERVZfTVNCLCBTSU9fSU5ERVgpOwotCW91dGJfcChTSU9fUE1fTVNCLCBTSU9fREFUQSk7CS8qIE1TQiBvZiBQTSBiYXNlIGFkZHJlc3MgKi8KLQotCW91dGJfcChTSU9fREVWX0xTQiwgU0lPX0lOREVYKTsKLQlvdXRiX3AoU0lPX1BNX0xTQiwgU0lPX0RBVEEpOwkvKiBMU0Igb2YgUE0gYmFzZSBhZGRyZXNzICovCi0KLQlvdXRiX3AoU0lPX0RFVl9FTkIsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKDEsIFNJT19EQVRBKTsJCS8qIEVuYWJsZSBQTSByZWdpc3RlcnMuICovCi0KLQkvKgotCSAqIE5vdywgd3JpdGUgdGhlIFBNIHJlZ2lzdGVyIHdoaWNoIGVuYWJsZXMgdGhlIEdQSU8gcmVnaXN0ZXJzLgotCSAqLwotCW91dGJfcChTSU9fUE1fRkVSMiwgU0lPX1BNX0lOREVYKTsKLQlvdXRiX3AoU0lPX1BNX0dQX0VOLCBTSU9fUE1fREFUQSk7Ci0KLQkvKgotCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgR1BJTyByZWdpc3RlcnMuCi0JICogV2Ugd2FudCB0aGVtIGFsbCB0byBiZSBpbnB1dHMgd2hpY2ggaXMgdGhlCi0JICogcG93ZXIgb24gZGVmYXVsdCwgc28gbGV0J3MgbGVhdmUgdGhlbSBhbG9uZS4KLQkgKiBTbywgbGV0J3MganVzdCByZWFkIHRoZSBib2FyZCByZXYhCi0JICovCi0JcmF3ID0gaW5iX3AoU0lPX0dQX0RBVEExKTsKLQlyYXcgJj0gMHg3ZjsJLyogNyBiaXRzIG9mIHZhbGlkIGJvYXJkIHJldmlzaW9uIElELiAqLwotCi0JaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwKSB7Ci0JCWlmIChyYXcgPCAweDYpIHsKLQkJCXZpc3dzX2JvYXJkX3JldiA9IDQ7Ci0JCX0gZWxzZSBpZiAocmF3IDwgMHhjKSB7Ci0JCQl2aXN3c19ib2FyZF9yZXYgPSA1OwotCQl9IGVsc2UgewotCQkJdmlzd3NfYm9hcmRfcmV2ID0gNjsKLQkJfQotCX0gZWxzZSBpZiAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU181NDApIHsKLQkJCXZpc3dzX2JvYXJkX3JldiA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQl2aXN3c19ib2FyZF9yZXYgPSByYXc7Ci0JCX0KLQotCXByaW50ayhLRVJOX0lORk8gIlNpbGljb24gR3JhcGhpY3MgVmlzdWFsIFdvcmtzdGF0aW9uICVzIChyZXYgJWQpIGRldGVjdGVkXG4iLAotCSAgICAgICAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU18zMjAgPyAiMzIwIiA6Ci0JICAgICAgICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzU0MCA/ICI1NDAiIDoKLQkJInVua25vd24iKSksIHZpc3dzX2JvYXJkX3Jldik7Ci19Ci0KLSNkZWZpbmUgQTAxMjM0IChMSV9JTlRBXzAgfCBMSV9JTlRBXzEgfCBMSV9JTlRBXzIgfCBMSV9JTlRBXzMgfCBMSV9JTlRBXzQpCi0jZGVmaW5lIEJDRCAoTElfSU5UQiB8IExJX0lOVEMgfCBMSV9JTlREKQotI2RlZmluZSBBTExERVZTIChBMDEyMzQgfCBCQ0QpCi0KLXN0YXRpYyBfX2luaXQgdm9pZCBsaXRoaXVtX2luaXQodm9pZCkKLXsKLQlzZXRfZml4bWFwKEZJWF9MSV9QQ0lBLCBMSV9QQ0lfQV9QSFlTKTsKLQlzZXRfZml4bWFwKEZJWF9MSV9QQ0lCLCBMSV9QQ0lfQl9QSFlTKTsKLQotCWlmICgobGlfcGNpYV9yZWFkMTYoUENJX1ZFTkRPUl9JRCkgIT0gUENJX1ZFTkRPUl9JRF9TR0kpIHx8Ci0JICAgIChsaV9wY2lhX3JlYWQxNihQQ0lfREVWSUNFX0lEKSAhPSBQQ0lfREVWSUNFX0lEX1NHSV9MSVRISVVNKSkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiTGl0aGl1bSBob3N0YnJpZGdlICVjIG5vdCBmb3VuZFxuIiwgJ0EnKTsKLS8qCQlwYW5pYygiVGhpcyBtYWNoaW5lIGlzIG5vdCBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIDMyMC81NDAiKTsgKi8KLQl9Ci0KLQlpZiAoKGxpX3BjaWJfcmVhZDE2KFBDSV9WRU5ET1JfSUQpICE9IFBDSV9WRU5ET1JfSURfU0dJKSB8fAotCSAgICAobGlfcGNpYl9yZWFkMTYoUENJX0RFVklDRV9JRCkgIT0gUENJX0RFVklDRV9JRF9TR0lfTElUSElVTSkpIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkxpdGhpdW0gaG9zdGJyaWRnZSAlYyBub3QgZm91bmRcbiIsICdCJyk7Ci0vKgkJcGFuaWMoIlRoaXMgbWFjaGluZSBpcyBub3QgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiAzMjAvNTQwIik7ICovCi0JfQotCi0JbGlfcGNpYV93cml0ZTE2KExJX1BDSV9JTlRFTiwgQUxMREVWUyk7Ci0JbGlfcGNpYl93cml0ZTE2KExJX1BDSV9JTlRFTiwgQUxMREVWUyk7Ci19Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBjb2JhbHRfaW5pdCh2b2lkKQotewotCS8qCi0JICogT24gbm9ybWFsIFNNUCBQQyB0aGlzIGlzIHVzZWQgb25seSB3aXRoIFNNUCwgYnV0IHdlIGhhdmUgdG8KLQkgKiB1c2UgaXQgYW5kIHNldCBpdCB1cCBoZXJlIHRvIHN0YXJ0IHRoZSBDb2JhbHQgY2xvY2sKLQkgKi8KLQlzZXRfZml4bWFwKEZJWF9BUElDX0JBU0UsIEFQSUNfREVGQVVMVF9QSFlTX0JBU0UpOwotCXNldHVwX2xvY2FsX0FQSUMoKTsKLQlwcmludGsoS0VSTl9JTkZPICJMb2NhbCBBUElDIFZlcnNpb24gJSN4LCBJRCAlI3hcbiIsCi0JCSh1bnNpZ25lZCBpbnQpYXBpY19yZWFkKEFQSUNfTFZSKSwKLQkJKHVuc2lnbmVkIGludClhcGljX3JlYWQoQVBJQ19JRCkpOwotCi0Jc2V0X2ZpeG1hcChGSVhfQ09fQ1BVLCBDT19DUFVfUEhZUyk7Ci0Jc2V0X2ZpeG1hcChGSVhfQ09fQVBJQywgQ09fQVBJQ19QSFlTKTsKLQlwcmludGsoS0VSTl9JTkZPICJDb2JhbHQgUmV2aXNpb24gJSNseCwgQVBJQyBJRCAlI2x4XG4iLAotCQljb19jcHVfcmVhZChDT19DUFVfUkVWKSwgY29fYXBpY19yZWFkKENPX0FQSUNfSUQpKTsKLQotCS8qIEVuYWJsZSBDb2JhbHQgQVBJQyBiZWluZyBjYXJlZnVsIHRvIE5PVCBjaGFuZ2UgdGhlIElEISAqLwotCWNvX2FwaWNfd3JpdGUoQ09fQVBJQ19JRCwgY29fYXBpY19yZWFkKENPX0FQSUNfSUQpIHwgQ09fQVBJQ19FTkFCTEUpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ29iYWx0IEFQSUMgZW5hYmxlZDogSUQgcmVnICUjbHhcbiIsCi0JCWNvX2FwaWNfcmVhZChDT19BUElDX0lEKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2aXN3c190cmFwX2luaXQodm9pZCkKLXsKLQlsaXRoaXVtX2luaXQoKTsKLQljb2JhbHRfaW5pdCgpOwotfQotCi0vKgotICogSVJRIGNvbnRyb2xsZXIgLyBBUElDIHN1cHBvcnQ6Ci0gKi8KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhjb2JhbHRfbG9jayk7Ci0KLS8qCi0gKiBTZXQgdGhlIGdpdmVuIENvYmFsdCBBUElDIFJlZGlyZWN0aW9uIFRhYmxlIGVudHJ5IHRvIHBvaW50Ci0gKiB0byB0aGUgZ2l2ZW4gSURUIHZlY3Rvci9pbmRleC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNvX2FwaWNfc2V0KGludCBlbnRyeSwgaW50IGlycSkKLXsKLQljb19hcGljX3dyaXRlKENPX0FQSUNfTE8oZW50cnkpLCBDT19BUElDX0xFVkVMIHwgKGlycSArIEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUikpOwotCWNvX2FwaWNfd3JpdGUoQ09fQVBJQ19ISShlbnRyeSksIDApOwotfQotCi0vKgotICogQ29iYWx0IChJTyktQVBJQyBmdW5jdGlvbnMgdG8gaGFuZGxlIFBDSSBkZXZpY2VzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBjb19hcGljX2lkZTBfaGFjayh2b2lkKQotewotCWV4dGVybiBjaGFyIHZpc3dzX2JvYXJkX3R5cGU7Ci0JZXh0ZXJuIGNoYXIgdmlzd3NfYm9hcmRfcmV2OwotCi0JaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwICYmIHZpc3dzX2JvYXJkX3JldiA9PSA1KQotCQlyZXR1cm4gNTsKLQlyZXR1cm4gQ09fQVBJQ19JREUwOwotfQotCi1zdGF0aWMgaW50IGlzX2NvX2FwaWModW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoSVNfQ09fQVBJQyhpcnEpKQotCQlyZXR1cm4gQ09fQVBJQyhpcnEpOwotCi0Jc3dpdGNoIChpcnEpIHsKLQkJY2FzZSAwOiByZXR1cm4gQ09fQVBJQ19DUFU7Ci0JCWNhc2UgQ09fSVJRX0lERTA6IHJldHVybiBjb19hcGljX2lkZTBfaGFjaygpOwotCQljYXNlIENPX0lSUV9JREUxOiByZXR1cm4gQ09fQVBJQ19JREUxOwotCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JfQotfQotCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBTR0kgQ29iYWx0IChJTy0pQVBJQzoKLSAqLwotc3RhdGljIHZvaWQgZW5hYmxlX2NvYmFsdF9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCWNvX2FwaWNfc2V0KGlzX2NvX2FwaWMoZGF0YS0+aXJxKSwgZGF0YS0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZGlzYWJsZV9jb2JhbHRfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlpbnQgZW50cnkgPSBpc19jb19hcGljKGRhdGEtPmlycSk7Ci0KLQljb19hcGljX3dyaXRlKENPX0FQSUNfTE8oZW50cnkpLCBDT19BUElDX01BU0spOwotCWNvX2FwaWNfcmVhZChDT19BUElDX0xPKGVudHJ5KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFja19jb2JhbHRfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7Ci0JZGlzYWJsZV9jb2JhbHRfaXJxKGRhdGEpOwotCWFwaWNfd3JpdGUoQVBJQ19FT0ksIEFQSUNfRU9JX0FDSyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjb2JhbHRfaXJxX3R5cGUgPSB7Ci0JLm5hbWUJCT0gIkNvYmFsdC1BUElDIiwKLQkuaXJxX2VuYWJsZQk9IGVuYWJsZV9jb2JhbHRfaXJxLAotCS5pcnFfZGlzYWJsZQk9IGRpc2FibGVfY29iYWx0X2lycSwKLQkuaXJxX2Fjawk9IGFja19jb2JhbHRfaXJxLAotfTsKLQotCi0vKgotICogVGhpcyBpcyB0aGUgUElJWDQtYmFzZWQgODI1OSB0aGF0IGlzIHdpcmVkIHVwIGluZGlyZWN0bHkgdG8gQ29iYWx0Ci0gKiAtLSBub3QgdGhlIG1hbm5lciBleHBlY3RlZCBieSB0aGUgY29kZSBpbiBpODI1OS5jLgotICoKLSAqIHRoZXJlIGlzIGEgJ21hc3RlcicgcGh5c2ljYWwgaW50ZXJydXB0IHNvdXJjZSB0aGF0IGdldHMgc2VudCB0bwotICogdGhlIENQVS4gQnV0IGluIHRoZSBjaGlwc2V0IHRoZXJlIGFyZSB2YXJpb3VzICd2aXJ0dWFsJyBpbnRlcnJ1cHRzCi0gKiB3YWl0aW5nIHRvIGJlIGhhbmRsZWQuIFdlIHJlcHJlc2VudCB0aGlzIHRvIExpbnV4IHRocm91Z2ggYSAnbWFzdGVyJwotICogaW50ZXJydXB0IGNvbnRyb2xsZXIgdHlwZSwgYW5kIHRocm91Z2ggYSBzcGVjaWFsIHZpcnR1YWwgaW50ZXJydXB0LQotICogY29udHJvbGxlci4gRGV2aWNlIGRyaXZlcnMgb25seSBzZWUgdGhlIHZpcnR1YWwgaW50ZXJydXB0IHNvdXJjZXMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9waWl4NF9tYXN0ZXJfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlsZWdhY3lfcGljLT5pbml0KDApOwotCWVuYWJsZV9jb2JhbHRfaXJxKGRhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHBpaXg0X21hc3Rlcl9pcnFfdHlwZSA9IHsKLQkubmFtZQkJPSAiUElJWDQtbWFzdGVyIiwKLQkuaXJxX3N0YXJ0dXAJPSBzdGFydHVwX3BpaXg0X21hc3Rlcl9pcnEsCi0JLmlycV9hY2sJPSBhY2tfY29iYWx0X2lycSwKLX07Ci0KLXN0YXRpYyB2b2lkIHBpaTRfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpIHsgfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHBpaXg0X3ZpcnR1YWxfaXJxX3R5cGUgPSB7Ci0JLm5hbWUJCT0gIlBJSVg0LXZpcnR1YWwiLAotCS5pcnFfbWFzawk9IHBpaTRfbWFzaywKLX07Ci0KLS8qCi0gKiBQSUlYNC04MjU5IG1hc3Rlci92aXJ0dWFsIGZ1bmN0aW9ucyB0byBoYW5kbGUgaW50ZXJydXB0IHJlcXVlc3RzCi0gKiBmcm9tIGxlZ2FjeSBkZXZpY2VzOiBmbG9wcHksIHBhcmFsbGVsLCBzZXJpYWwsIHJ0Yy4KLSAqCi0gKiBOb25lIG9mIHRoZXNlIGdldCBDb2JhbHQgQVBJQyBlbnRyaWVzLCBuZWl0aGVyIGRvIHRoZXkgaGF2ZSBJRFQKLSAqIGVudHJpZXMuIFRoZXNlIGludGVycnVwdHMgYXJlIHB1cmVseSB2aXJ0dWFsIGFuZCBkaXN0cmlidXRlZCBmcm9tCi0gKiB0aGUgJ21hc3RlcicgaW50ZXJydXB0IHNvdXJjZTogQ09fSVJRXzgyNTkuCi0gKgotICogV2hlbiB0aGUgODI1OSBpbnRlcnJ1cHRzIGl0cyBoYW5kbGVyIGZpZ3VyZXMgb3V0IHdoaWNoIG9mIHRoZXNlCi0gKiBkZXZpY2VzIGlzIGludGVycnVwdGluZyBhbmQgZGlzcGF0Y2hlcyB0byBpdHMgaGFuZGxlci4KLSAqCi0gKiBDQVJFRlVMOiBkZXZpY2VzIHNlZSB0aGUgJ3ZpcnR1YWwnIGludGVycnVwdCBvbmx5LiBUaHVzIGRpc2FibGUvCi0gKiBlbmFibGVfaXJxIGdldHMgdGhlIHJpZ2h0IGlycS4gVGhpcyAnbWFzdGVyJyBpcnEgaXMgbmV2ZXIgZGlyZWN0bHkKLSAqIG1hbmlwdWxhdGVkIGJ5IGFueSBkcml2ZXIuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBwaWl4NF9tYXN0ZXJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVhbGlycTsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKLQotCS8qIEZpbmQgb3V0IHdoYXQncyBpbnRlcnJ1cHRpbmcgaW4gdGhlIFBJSVg0IG1hc3RlciA4MjU5ICovCi0Jb3V0YigweDBjLCAweDIwKTsJCS8qIE9DVzMgUG9sbCBjb21tYW5kICovCi0JcmVhbGlycSA9IGluYigweDIwKTsKLQotCS8qCi0JICogQml0IDcgPT0gMCBtZWFucyBpbnZhbGlkL3NwdXJpb3VzCi0JICovCi0JaWYgKHVubGlrZWx5KCEocmVhbGlycSAmIDB4ODApKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JcmVhbGlycSAmPSA3OwotCi0JaWYgKHVubGlrZWx5KHJlYWxpcnEgPT0gMikpIHsKLQkJb3V0YigweDBjLCAweGEwKTsKLQkJcmVhbGlycSA9IGluYigweGEwKTsKLQotCQlpZiAodW5saWtlbHkoIShyZWFsaXJxICYgMHg4MCkpKQotCQkJZ290byBvdXRfdW5sb2NrOwotCi0JCXJlYWxpcnEgPSAocmVhbGlycSAmIDcpICsgODsKLQl9Ci0KLQkvKiBtYXNrIGFuZCBhY2sgaW50ZXJydXB0ICovCi0JY2FjaGVkX2lycV9tYXNrIHw9IDEgPDwgcmVhbGlycTsKLQlpZiAodW5saWtlbHkocmVhbGlycSA+IDcpKSB7Ci0JCWluYigweGExKTsKLQkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgMHhhMSk7Ci0JCW91dGIoMHg2MCArIChyZWFsaXJxICYgNyksIDB4YTApOwotCQlvdXRiKDB4NjAgKyAyLCAweDIwKTsKLQl9IGVsc2UgewotCQlpbmIoMHgyMSk7Ci0JCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCAweDIxKTsKLQkJb3V0YigweDYwICsgcmVhbGlycSwgMHgyMCk7Ci0JfQotCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIGhhbmRsZSB0aGlzICd2aXJ0dWFsIGludGVycnVwdCcgYXMgYSBDb2JhbHQgb25lIG5vdy4KLQkgKi8KLQlnZW5lcmljX2hhbmRsZV9pcnEocmVhbGlycSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLW91dF91bmxvY2s6Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIElSUV9OT05FOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtYXN0ZXJfYWN0aW9uID0gewotCS5oYW5kbGVyID0JcGlpeDRfbWFzdGVyX2ludHIsCi0JLm5hbWUgPQkJIlBJSVg0LTgyNTkiLAotCS5mbGFncyA9CUlSUUZfTk9fVEhSRUFELAotfTsKLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2FzY2FkZV9hY3Rpb24gPSB7Ci0JLmhhbmRsZXIgPSAJbm9fYWN0aW9uLAotCS5uYW1lID0JCSJjYXNjYWRlIiwKLQkuZmxhZ3MgPQlJUlFGX05PX1RIUkVBRCwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGlpeDRfdmlydHVhbF9pcnFfdHlwZSh2b2lkKQotewotCXBpaXg0X3ZpcnR1YWxfaXJxX3R5cGUuaXJxX2VuYWJsZSA9IGk4MjU5QV9jaGlwLmlycV91bm1hc2s7Ci0JcGlpeDRfdmlydHVhbF9pcnFfdHlwZS5pcnFfZGlzYWJsZSA9IGk4MjU5QV9jaGlwLmlycV9tYXNrOwotCXBpaXg0X3ZpcnR1YWxfaXJxX3R5cGUuaXJxX3VubWFzayA9IGk4MjU5QV9jaGlwLmlycV91bm1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2aXN3c19wcmVfaW50cl9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlzZXRfcGlpeDRfdmlydHVhbF9pcnFfdHlwZSgpOwotCi0JZm9yIChpID0gMDsgaSA8IENPX0lSUV9BUElDMCArIENPX0FQSUNfTEFTVCArIDE7IGkrKykgewotCQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBOVUxMOwotCi0JCWlmIChpID09IDApCi0JCQljaGlwID0gJmNvYmFsdF9pcnFfdHlwZTsKLQkJZWxzZSBpZiAoaSA9PSBDT19JUlFfSURFMCkKLQkJCWNoaXAgPSAmY29iYWx0X2lycV90eXBlOwotCQllbHNlIGlmIChpID09IENPX0lSUV9JREUxKQotCQkJY2hpcCA9ICZjb2JhbHRfaXJxX3R5cGU7Ci0JCWVsc2UgaWYgKGkgPT0gQ09fSVJRXzgyNTkpCi0JCQljaGlwID0gJnBpaXg0X21hc3Rlcl9pcnFfdHlwZTsKLQkJZWxzZSBpZiAoaSA8IENPX0lSUV9BUElDMCkKLQkJCWNoaXAgPSAmcGlpeDRfdmlydHVhbF9pcnFfdHlwZTsKLQkJZWxzZSBpZiAoSVNfQ09fQVBJQyhpKSkKLQkJCWNoaXAgPSAmY29iYWx0X2lycV90eXBlOwotCi0JCWlmIChjaGlwKQotCQkJaXJxX3NldF9jaGlwKGksIGNoaXApOwotCX0KLQotCXNldHVwX2lycShDT19JUlFfODI1OSwgJm1hc3Rlcl9hY3Rpb24pOwotCXNldHVwX2lycSgyLCAmY2FzY2FkZV9hY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMgYi9hcmNoL3g4Ni90b29scy9yZWxvY3MuYwppbmRleCBjZmJkYmRiLi5iYmIxZDIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni90b29scy9yZWxvY3MuYworKysgYi9hcmNoL3g4Ni90b29scy9yZWxvY3MuYwpAQCAtNjksOCArNjksOCBAQAogCSJfX3Blcl9jcHVfbG9hZHwiCiAJImluaXRfcGVyX2NwdV9fLip8IgogCSJfX2VuZF9yb2RhdGFfaHBhZ2VfYWxpZ258IgotCSJfX3Z2YXJfcGFnZXwiCiAjZW5kaWYKKwkiX192dmFyX3BhZ2V8IgogCSJfZW5kKSQiCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlIGIvYXJjaC94ODYvdmRzby9NYWtlZmlsZQppbmRleCBmZDE0YmUxLi5jNTgwZDEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKQEAgLTIsNiArMiw4IEBACiAjIEJ1aWxkaW5nIHZEU08gaW1hZ2VzIGZvciB4ODYuCiAjCiAKK0tCVUlMRF9DRkxBR1MgKz0gJChESVNBQkxFX0xUTykKKwogVkRTTzY0LSQoQ09ORklHX1g4Nl82NCkJCTo9IHkKIFZEU09YMzItJChDT05GSUdfWDg2X1gzMl9BQkkpCTo9IHkKIFZEU08zMi0kKENPTkZJR19YODZfMzIpCQk6PSB5CkBAIC0yMSw3ICsyMyw4IEBACiB2b2JqNjRzIDo9ICQoZmlsdGVyLW91dCAkKHZvYmp4MzJzLWNvbXBhdCksJCh2b2Jqcy15KSkKIAogIyBmaWxlcyB0byBsaW5rIGludG8ga2VybmVsCi1vYmotJChWRFNPNjQteSkJCQkrPSB2bWEubyB2ZHNvLm8KK29iai15CQkJCSs9IHZtYS5vCitvYmotJChWRFNPNjQteSkJCQkrPSB2ZHNvLm8KIG9iai0kKFZEU09YMzIteSkJCSs9IHZkc294MzIubwogb2JqLSQoVkRTTzMyLXkpCQkJKz0gdmRzbzMyLm8gdmRzbzMyLXNldHVwLm8KIApAQCAtMzUsNyArMzgsOCBAQAogCiBWRFNPX0xERkxBR1NfdmRzby5sZHMgPSAtbTY0IC1XbCwtc29uYW1lPWxpbnV4LXZkc28uc28uMSBcCiAJCQktV2wsLS1uby11bmRlZmluZWQgXAotCQkgICAgICAJLVdsLC16LG1heC1wYWdlLXNpemU9NDA5NiAtV2wsLXosY29tbW9uLXBhZ2Utc2l6ZT00MDk2CisJCQktV2wsLXosbWF4LXBhZ2Utc2l6ZT00MDk2IC1XbCwteixjb21tb24tcGFnZS1zaXplPTQwOTYgXAorCQkJJChESVNBQkxFX0xUTykKIAogJChvYmopL3Zkc28ubzogJChzcmMpL3Zkc28uUyAkKG9iaikvdmRzby5zbwogCkBAIC0xMjcsNyArMTMxLDcgQEAKIHZkc28zMi1pbWFnZXMJCQk9ICQodmRzbzMyLnNvLXk6JT12ZHNvMzItJS5zbykKIAogQ1BQRkxBR1NfdmRzbzMyLmxkcyA9ICQoQ1BQRkxBR1NfdmRzby5sZHMpCi1WRFNPX0xERkxBR1NfdmRzbzMyLmxkcyA9IC1tMzIgLVdsLC1zb25hbWU9bGludXgtZ2F0ZS5zby4xCitWRFNPX0xERkxBR1NfdmRzbzMyLmxkcyA9IC1tMzIgLVdsLC1tLGVsZl9pMzg2IC1XbCwtc29uYW1lPWxpbnV4LWdhdGUuc28uMQogCiAjIFRoaXMgbWFrZXMgc3VyZSB0aGUgJChvYmopIHN1YmRpcmVjdG9yeSBleGlzdHMgZXZlbiB0aG91Z2ggdmRzbzMyLwogIyBpcyBub3QgYSBrYnVpbGQgc3ViLW1ha2Ugc3ViZGlyZWN0b3J5LgpAQCAtMTM1LDcgKzEzOSw3IEBACiAKIHRhcmdldHMgKz0gdmRzbzMyL3Zkc28zMi5sZHMKIHRhcmdldHMgKz0gJCh2ZHNvMzItaW1hZ2VzKSAkKHZkc28zMi1pbWFnZXM6PS5kYmcpCi10YXJnZXRzICs9IHZkc28zMi9ub3RlLm8gJCh2ZHNvMzIuc28teTolPXZkc28zMi8lLm8pCit0YXJnZXRzICs9IHZkc28zMi9ub3RlLm8gdmRzbzMyL3ZjbG9ja19nZXR0aW1lLm8gJCh2ZHNvMzIuc28teTolPXZkc28zMi8lLm8pCiAKIGV4dHJhLXkJKz0gJCh2ZHNvMzItaW1hZ2VzKQogCkBAIC0xNDUsOCArMTQ5LDE5IEBACiAkKHZkc28zMi1pbWFnZXM6JT0kKG9iaikvJS5kYmcpOiBLQlVJTERfQUZMQUdTID0gJChLQlVJTERfQUZMQUdTXzMyKQogJCh2ZHNvMzItaW1hZ2VzOiU9JChvYmopLyUuZGJnKTogYXNmbGFncy0kKENPTkZJR19YODZfNjQpICs9IC1tMzIKIAorS0JVSUxEX0NGTEFHU18zMiA6PSAkKGZpbHRlci1vdXQgLW02NCwkKEtCVUlMRF9DRkxBR1MpKQorS0JVSUxEX0NGTEFHU18zMiA6PSAkKGZpbHRlci1vdXQgLW1jbW9kZWw9a2VybmVsLCQoS0JVSUxEX0NGTEFHU18zMikpCitLQlVJTERfQ0ZMQUdTXzMyIDo9ICQoZmlsdGVyLW91dCAtZm5vLXBpYywkKEtCVUlMRF9DRkxBR1NfMzIpKQorS0JVSUxEX0NGTEFHU18zMiA6PSAkKGZpbHRlci1vdXQgLW1mZW50cnksJChLQlVJTERfQ0ZMQUdTXzMyKSkKK0tCVUlMRF9DRkxBR1NfMzIgKz0gLW0zMiAtbXNvZnQtZmxvYXQgLW1yZWdwYXJtPTAgLWZwaWMKK0tCVUlMRF9DRkxBR1NfMzIgKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IpCitLQlVJTERfQ0ZMQUdTXzMyICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mb3B0aW1pemUtc2libGluZy1jYWxscykKK0tCVUlMRF9DRkxBR1NfMzIgKz0gLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKyQodmRzbzMyLWltYWdlczolPSQob2JqKS8lLmRiZyk6IEtCVUlMRF9DRkxBR1MgPSAkKEtCVUlMRF9DRkxBR1NfMzIpCisKICQodmRzbzMyLWltYWdlczolPSQob2JqKS8lLmRiZyk6ICQob2JqKS92ZHNvMzItJS5zby5kYmc6IEZPUkNFIFwKIAkJCQkgJChvYmopL3Zkc28zMi92ZHNvMzIubGRzIFwKKwkJCQkgJChvYmopL3Zkc28zMi92Y2xvY2tfZ2V0dGltZS5vIFwKIAkJCQkgJChvYmopL3Zkc28zMi9ub3RlLm8gXAogCQkJCSAkKG9iaikvdmRzbzMyLyUubwogCSQoY2FsbCBpZl9jaGFuZ2VkLHZkc28pCkBAIC0xODEsNyArMTk2LDggQEAKIAkJICAgICAgIC1XbCwtVCwkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKSAmJiBcCiAJCSBzaCAkKHNyY3RyZWUpLyQoc3JjKS9jaGVja3VuZGVmLnNoICckKE5NKScgJyRAJwogCi1WRFNPX0xERkxBR1MgPSAtZlBJQyAtc2hhcmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKK1ZEU09fTERGTEFHUyA9IC1mUElDIC1zaGFyZWQgJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KSBcCisJCSQoTFRPX0NGTEFHUykKIEdDT1ZfUFJPRklMRSA6PSBuCiAKICMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmNsb2NrX2dldHRpbWUuYyBiL2FyY2gveDg2L3Zkc28vdmNsb2NrX2dldHRpbWUuYwppbmRleCBlYjVkN2E1Li4xNmQ2ODYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKKysrIGIvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jCkBAIC00LDYgKzQsOSBAQAogICoKICAqIEZhc3QgdXNlciBjb250ZXh0IGltcGxlbWVudGF0aW9uIG9mIGNsb2NrX2dldHRpbWUsIGdldHRpbWVvZmRheSwgYW5kIHRpbWUuCiAgKgorICogMzIgQml0IGNvbXBhdCBsYXllciBieSBTdGVmYW5pIFNlaWJvbGQgPHN0ZWZhbmlAc2VpYm9sZC5uZXQ+CisgKiAgc3BvbnNvcmVkIGJ5IFJvaGRlICYgU2Nod2FyeiBHbWJIICYgQ28uIEtHIE11bmljaC9HZXJtYW55CisgKgogICogVGhlIGNvZGUgc2hvdWxkIGhhdmUgbm8gaW50ZXJuYWwgdW5yZXNvbHZlZCByZWxvY2F0aW9ucy4KICAqIENoZWNrIHdpdGggcmVhZGVsZiBhZnRlciBjaGFuZ2luZy4KICAqLwpAQCAtMTEsNTYgKzE0LDU1IEBACiAvKiBEaXNhYmxlIHByb2ZpbGluZyBmb3IgdXNlcnNwYWNlIGNvZGU6ICovCiAjZGVmaW5lIERJU0FCTEVfQlJBTkNIX1BST0ZJTElORwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9zaXgtdGltZXJzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxhc20vdmd0b2QuaD4KLSNpbmNsdWRlIDxhc20vdGltZXguaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS92dmFyLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wdmNsb2NrLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2RlZmluZSBndG9kICgmVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpKQogCi1ub3RyYWNlIHN0YXRpYyBjeWNsZV90IHZyZWFkX3RzYyh2b2lkKQorZXh0ZXJuIGludCBfX3Zkc29fY2xvY2tfZ2V0dGltZShjbG9ja2lkX3QgY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHMpOworZXh0ZXJuIGludCBfX3Zkc29fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eik7CitleHRlcm4gdGltZV90IF9fdmRzb190aW1lKHRpbWVfdCAqdCk7CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIGlubGluZSB1MzIgcmVhZF9ocGV0X2NvdW50ZXIoY29uc3Qgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKLQljeWNsZV90IHJldDsKLQl1NjQgbGFzdDsKLQotCS8qCi0JICogRW1waXJpY2FsbHksIGEgZmVuY2UgKG9mIHR5cGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBDUFUpCi0JICogYmVmb3JlIHJkdHNjIGlzIGVub3VnaCB0byBlbnN1cmUgdGhhdCByZHRzYyBpcyBvcmRlcmVkCi0JICogd2l0aCByZXNwZWN0IHRvIGxvYWRzLiAgVGhlIHZhcmlvdXMgQ1BVIG1hbnVhbHMgYXJlIHVuY2xlYXIKLQkgKiBhcyB0byB3aGV0aGVyIHJkdHNjIGNhbiBiZSByZW9yZGVyZWQgd2l0aCBsYXRlciBsb2FkcywKLQkgKiBidXQgbm8gb25lIGhhcyBldmVyIHNlZW4gaXQgaGFwcGVuLgotCSAqLwotCXJkdHNjX2JhcnJpZXIoKTsKLQlyZXQgPSAoY3ljbGVfdCl2Z2V0X2N5Y2xlcygpOwotCi0JbGFzdCA9IFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS5jbG9jay5jeWNsZV9sYXN0OwotCi0JaWYgKGxpa2VseShyZXQgPj0gbGFzdCkpCi0JCXJldHVybiByZXQ7Ci0KLQkvKgotCSAqIEdDQyBsaWtlcyB0byBnZW5lcmF0ZSBjbW92IGhlcmUsIGJ1dCB0aGlzIGJyYW5jaCBpcyBleHRyZW1lbHkKLQkgKiBwcmVkaWN0YWJsZSAoaXQncyBqdXN0IGEgZnVuY2l0b24gb2YgdGltZSBhbmQgdGhlIGxpa2VseSBpcwotCSAqIHZlcnkgbGlrZWx5KSBhbmQgdGhlcmUncyBhIGRhdGEgZGVwZW5kZW5jZSwgc28gZm9yY2UgR0NDCi0JICogdG8gZ2VuZXJhdGUgYSBicmFuY2ggaW5zdGVhZC4gIEkgZG9uJ3QgYmFycmllcigpIGJlY2F1c2UKLQkgKiB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgYmFycmllciwgYW5kIGlmIHRoaXMgZnVuY3Rpb24KLQkgKiBldmVyIGdldHMgaW5saW5lZCBpdCB3aWxsIGdlbmVyYXRlIHdvcnNlIGNvZGUuCi0JICovCi0JYXNtIHZvbGF0aWxlICgiIik7Ci0JcmV0dXJuIGxhc3Q7CisJcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdTMyICopIChhZGRyICsgSFBFVF9DT1VOVEVSKTsKIH0KKyNlbmRpZgorCisjaWZuZGVmIEJVSUxEX1ZEU08zMgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9wdmNsb2NrLmg+CiAKIHN0YXRpYyBub3RyYWNlIGN5Y2xlX3QgdnJlYWRfaHBldCh2b2lkKQogewotCXJldHVybiByZWFkbCgoY29uc3Qgdm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoVlNZU0NBTExfSFBFVCkgKyBIUEVUX0NPVU5URVIpOworCXJldHVybiByZWFkX2hwZXRfY291bnRlcigoY29uc3Qgdm9pZCAqKWZpeF90b192aXJ0KFZTWVNDQUxMX0hQRVQpKTsKK30KKworbm90cmFjZSBzdGF0aWMgbG9uZyB2ZHNvX2ZhbGxiYWNrX2dldHRpbWUobG9uZyBjbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlsb25nIHJldDsKKwlhc20oInN5c2NhbGwiIDogIj1hIiAocmV0KSA6CisJICAgICIwIiAoX19OUl9jbG9ja19nZXR0aW1lKSwgIkQiIChjbG9jayksICJTIiAodHMpIDogIm1lbW9yeSIpOworCXJldHVybiByZXQ7Cit9CisKK25vdHJhY2Ugc3RhdGljIGxvbmcgdmRzb19mYWxsYmFja19ndG9kKHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKK3sKKwlsb25nIHJldDsKKworCWFzbSgic3lzY2FsbCIgOiAiPWEiIChyZXQpIDoKKwkgICAgIjAiIChfX05SX2dldHRpbWVvZmRheSksICJEIiAodHYpLCAiUyIgKHR6KSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmV0OwogfQogCiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUX0NMT0NLCkBAIC0xMjQsNyArMTI2LDcgQEAKIAkJKm1vZGUgPSBWQ0xPQ0tfTk9ORTsKIAogCS8qIHJlZmVyIHRvIHRzYy5jIHJlYWRfdHNjKCkgY29tbWVudCBmb3IgcmF0aW9uYWxlICovCi0JbGFzdCA9IFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS5jbG9jay5jeWNsZV9sYXN0OworCWxhc3QgPSBndG9kLT5jeWNsZV9sYXN0OwogCiAJaWYgKGxpa2VseShyZXQgPj0gbGFzdCkpCiAJCXJldHVybiByZXQ7CkBAIC0xMzMsMTEgKzEzNSwzMCBAQAogfQogI2VuZGlmCiAKKyNlbHNlCisKK2V4dGVybiB1OCBocGV0X3BhZ2UKKwlfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpOworCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKK3N0YXRpYyBub3RyYWNlIGN5Y2xlX3QgdnJlYWRfaHBldCh2b2lkKQoreworCXJldHVybiByZWFkX2hwZXRfY291bnRlcigoY29uc3Qgdm9pZCAqKSgmaHBldF9wYWdlKSk7Cit9CisjZW5kaWYKKwogbm90cmFjZSBzdGF0aWMgbG9uZyB2ZHNvX2ZhbGxiYWNrX2dldHRpbWUobG9uZyBjbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cykKIHsKIAlsb25nIHJldDsKLQlhc20oInN5c2NhbGwiIDogIj1hIiAocmV0KSA6Ci0JICAgICIwIiAoX19OUl9jbG9ja19nZXR0aW1lKSwiRCIgKGNsb2NrKSwgIlMiICh0cykgOiAibWVtb3J5Iik7CisKKwlhc20oCisJCSJtb3YgJSVlYngsICUlZWR4IFxuIgorCQkibW92ICUyLCAlJWVieCBcbiIKKwkJImNhbGwgVkRTTzMyX3ZzeXNjYWxsIFxuIgorCQkibW92ICUlZWR4LCAlJWVieCBcbiIKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChfX05SX2Nsb2NrX2dldHRpbWUpLCAiZyIgKGNsb2NrKSwgImMiICh0cykKKwkJOiAibWVtb3J5IiwgImVkeCIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NSwyOCArMTY2LDc5IEBACiB7CiAJbG9uZyByZXQ7CiAKLQlhc20oInN5c2NhbGwiIDogIj1hIiAocmV0KSA6Ci0JICAgICIwIiAoX19OUl9nZXR0aW1lb2ZkYXkpLCAiRCIgKHR2KSwgIlMiICh0eikgOiAibWVtb3J5Iik7CisJYXNtKAorCQkibW92ICUlZWJ4LCAlJWVkeCBcbiIKKwkJIm1vdiAlMiwgJSVlYnggXG4iCisJCSJjYWxsIFZEU08zMl92c3lzY2FsbCBcbiIKKwkJIm1vdiAlJWVkeCwgJSVlYnggXG4iCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoX19OUl9nZXR0aW1lb2ZkYXkpLCAiZyIgKHR2KSwgImMiICh0eikKKwkJOiAibWVtb3J5IiwgImVkeCIpOwogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlRfQ0xPQ0sKKworc3RhdGljIG5vdHJhY2UgY3ljbGVfdCB2cmVhZF9wdmNsb2NrKGludCAqbW9kZSkKK3sKKwkqbW9kZSA9IFZDTE9DS19OT05FOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNlbmRpZgorCitub3RyYWNlIHN0YXRpYyBjeWNsZV90IHZyZWFkX3RzYyh2b2lkKQoreworCWN5Y2xlX3QgcmV0OworCXU2NCBsYXN0OworCisJLyoKKwkgKiBFbXBpcmljYWxseSwgYSBmZW5jZSAob2YgdHlwZSB0aGF0IGRlcGVuZHMgb24gdGhlIENQVSkKKwkgKiBiZWZvcmUgcmR0c2MgaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGF0IHJkdHNjIGlzIG9yZGVyZWQKKwkgKiB3aXRoIHJlc3BlY3QgdG8gbG9hZHMuICBUaGUgdmFyaW91cyBDUFUgbWFudWFscyBhcmUgdW5jbGVhcgorCSAqIGFzIHRvIHdoZXRoZXIgcmR0c2MgY2FuIGJlIHJlb3JkZXJlZCB3aXRoIGxhdGVyIGxvYWRzLAorCSAqIGJ1dCBubyBvbmUgaGFzIGV2ZXIgc2VlbiBpdCBoYXBwZW4uCisJICovCisJcmR0c2NfYmFycmllcigpOworCXJldCA9IChjeWNsZV90KV9fbmF0aXZlX3JlYWRfdHNjKCk7CisKKwlsYXN0ID0gZ3RvZC0+Y3ljbGVfbGFzdDsKKworCWlmIChsaWtlbHkocmV0ID49IGxhc3QpKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBHQ0MgbGlrZXMgdG8gZ2VuZXJhdGUgY21vdiBoZXJlLCBidXQgdGhpcyBicmFuY2ggaXMgZXh0cmVtZWx5CisJICogcHJlZGljdGFibGUgKGl0J3MganVzdCBhIGZ1bmNpdG9uIG9mIHRpbWUgYW5kIHRoZSBsaWtlbHkgaXMKKwkgKiB2ZXJ5IGxpa2VseSkgYW5kIHRoZXJlJ3MgYSBkYXRhIGRlcGVuZGVuY2UsIHNvIGZvcmNlIEdDQworCSAqIHRvIGdlbmVyYXRlIGEgYnJhbmNoIGluc3RlYWQuICBJIGRvbid0IGJhcnJpZXIoKSBiZWNhdXNlCisJICogd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCBhIGJhcnJpZXIsIGFuZCBpZiB0aGlzIGZ1bmN0aW9uCisJICogZXZlciBnZXRzIGlubGluZWQgaXQgd2lsbCBnZW5lcmF0ZSB3b3JzZSBjb2RlLgorCSAqLworCWFzbSB2b2xhdGlsZSAoIiIpOworCXJldHVybiBsYXN0OworfQogCiBub3RyYWNlIHN0YXRpYyBpbmxpbmUgdTY0IHZnZXRzbnMoaW50ICptb2RlKQogewotCWxvbmcgdjsKKwl1NjQgdjsKIAljeWNsZXNfdCBjeWNsZXM7Ci0JaWYgKGd0b2QtPmNsb2NrLnZjbG9ja19tb2RlID09IFZDTE9DS19UU0MpCisKKwlpZiAoZ3RvZC0+dmNsb2NrX21vZGUgPT0gVkNMT0NLX1RTQykKIAkJY3ljbGVzID0gdnJlYWRfdHNjKCk7Ci0JZWxzZSBpZiAoZ3RvZC0+Y2xvY2sudmNsb2NrX21vZGUgPT0gVkNMT0NLX0hQRVQpCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwllbHNlIGlmIChndG9kLT52Y2xvY2tfbW9kZSA9PSBWQ0xPQ0tfSFBFVCkKIAkJY3ljbGVzID0gdnJlYWRfaHBldCgpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUX0NMT0NLCi0JZWxzZSBpZiAoZ3RvZC0+Y2xvY2sudmNsb2NrX21vZGUgPT0gVkNMT0NLX1BWQ0xPQ0spCisJZWxzZSBpZiAoZ3RvZC0+dmNsb2NrX21vZGUgPT0gVkNMT0NLX1BWQ0xPQ0spCiAJCWN5Y2xlcyA9IHZyZWFkX3B2Y2xvY2sobW9kZSk7CiAjZW5kaWYKIAllbHNlCiAJCXJldHVybiAwOwotCXYgPSAoY3ljbGVzIC0gZ3RvZC0+Y2xvY2suY3ljbGVfbGFzdCkgJiBndG9kLT5jbG9jay5tYXNrOwotCXJldHVybiB2ICogZ3RvZC0+Y2xvY2subXVsdDsKKwl2ID0gKGN5Y2xlcyAtIGd0b2QtPmN5Y2xlX2xhc3QpICYgZ3RvZC0+bWFzazsKKwlyZXR1cm4gdiAqIGd0b2QtPm11bHQ7CiB9CiAKIC8qIENvZGUgc2l6ZSBkb2Vzbid0IG1hdHRlciAodmRzbyBpcyA0ayBhbnl3YXkpIGFuZCB0aGlzIGlzIGZhc3Rlci4gKi8KQEAgLTE3NiwxMDYgKzI0OCwxMDIgQEAKIAl1NjQgbnM7CiAJaW50IG1vZGU7CiAKLQl0cy0+dHZfbnNlYyA9IDA7CiAJZG8gewotCQlzZXEgPSByYXdfcmVhZF9zZXFjb3VudF9iZWdpbigmZ3RvZC0+c2VxKTsKLQkJbW9kZSA9IGd0b2QtPmNsb2NrLnZjbG9ja19tb2RlOworCQlzZXEgPSBndG9kX3JlYWRfYmVnaW4oZ3RvZCk7CisJCW1vZGUgPSBndG9kLT52Y2xvY2tfbW9kZTsKIAkJdHMtPnR2X3NlYyA9IGd0b2QtPndhbGxfdGltZV9zZWM7CiAJCW5zID0gZ3RvZC0+d2FsbF90aW1lX3Nuc2VjOwogCQlucyArPSB2Z2V0c25zKCZtb2RlKTsKLQkJbnMgPj49IGd0b2QtPmNsb2NrLnNoaWZ0OwotCX0gd2hpbGUgKHVubGlrZWx5KHJlYWRfc2VxY291bnRfcmV0cnkoJmd0b2QtPnNlcSwgc2VxKSkpOworCQlucyA+Pj0gZ3RvZC0+c2hpZnQ7CisJfSB3aGlsZSAodW5saWtlbHkoZ3RvZF9yZWFkX3JldHJ5KGd0b2QsIHNlcSkpKTsKIAotCXRpbWVzcGVjX2FkZF9ucyh0cywgbnMpOworCXRzLT50dl9zZWMgKz0gX19pdGVyX2Rpdl91NjRfcmVtKG5zLCBOU0VDX1BFUl9TRUMsICZucyk7CisJdHMtPnR2X25zZWMgPSBuczsKKwogCXJldHVybiBtb2RlOwogfQogCi1ub3RyYWNlIHN0YXRpYyBpbnQgZG9fbW9ub3RvbmljKHN0cnVjdCB0aW1lc3BlYyAqdHMpCitub3RyYWNlIHN0YXRpYyBpbnQgX19hbHdheXNfaW5saW5lIGRvX21vbm90b25pYyhzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewogCXVuc2lnbmVkIGxvbmcgc2VxOwogCXU2NCBuczsKIAlpbnQgbW9kZTsKIAotCXRzLT50dl9uc2VjID0gMDsKIAlkbyB7Ci0JCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50X2JlZ2luKCZndG9kLT5zZXEpOwotCQltb2RlID0gZ3RvZC0+Y2xvY2sudmNsb2NrX21vZGU7CisJCXNlcSA9IGd0b2RfcmVhZF9iZWdpbihndG9kKTsKKwkJbW9kZSA9IGd0b2QtPnZjbG9ja19tb2RlOwogCQl0cy0+dHZfc2VjID0gZ3RvZC0+bW9ub3RvbmljX3RpbWVfc2VjOwogCQlucyA9IGd0b2QtPm1vbm90b25pY190aW1lX3Nuc2VjOwogCQlucyArPSB2Z2V0c25zKCZtb2RlKTsKLQkJbnMgPj49IGd0b2QtPmNsb2NrLnNoaWZ0OwotCX0gd2hpbGUgKHVubGlrZWx5KHJlYWRfc2VxY291bnRfcmV0cnkoJmd0b2QtPnNlcSwgc2VxKSkpOwotCXRpbWVzcGVjX2FkZF9ucyh0cywgbnMpOworCQlucyA+Pj0gZ3RvZC0+c2hpZnQ7CisJfSB3aGlsZSAodW5saWtlbHkoZ3RvZF9yZWFkX3JldHJ5KGd0b2QsIHNlcSkpKTsKKworCXRzLT50dl9zZWMgKz0gX19pdGVyX2Rpdl91NjRfcmVtKG5zLCBOU0VDX1BFUl9TRUMsICZucyk7CisJdHMtPnR2X25zZWMgPSBuczsKIAogCXJldHVybiBtb2RlOwogfQogCi1ub3RyYWNlIHN0YXRpYyBpbnQgZG9fcmVhbHRpbWVfY29hcnNlKHN0cnVjdCB0aW1lc3BlYyAqdHMpCitub3RyYWNlIHN0YXRpYyB2b2lkIGRvX3JlYWx0aW1lX2NvYXJzZShzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewogCXVuc2lnbmVkIGxvbmcgc2VxOwogCWRvIHsKLQkJc2VxID0gcmF3X3JlYWRfc2VxY291bnRfYmVnaW4oJmd0b2QtPnNlcSk7Ci0JCXRzLT50dl9zZWMgPSBndG9kLT53YWxsX3RpbWVfY29hcnNlLnR2X3NlYzsKLQkJdHMtPnR2X25zZWMgPSBndG9kLT53YWxsX3RpbWVfY29hcnNlLnR2X25zZWM7Ci0JfSB3aGlsZSAodW5saWtlbHkocmVhZF9zZXFjb3VudF9yZXRyeSgmZ3RvZC0+c2VxLCBzZXEpKSk7Ci0JcmV0dXJuIDA7CisJCXNlcSA9IGd0b2RfcmVhZF9iZWdpbihndG9kKTsKKwkJdHMtPnR2X3NlYyA9IGd0b2QtPndhbGxfdGltZV9jb2Fyc2Vfc2VjOworCQl0cy0+dHZfbnNlYyA9IGd0b2QtPndhbGxfdGltZV9jb2Fyc2VfbnNlYzsKKwl9IHdoaWxlICh1bmxpa2VseShndG9kX3JlYWRfcmV0cnkoZ3RvZCwgc2VxKSkpOwogfQogCi1ub3RyYWNlIHN0YXRpYyBpbnQgZG9fbW9ub3RvbmljX2NvYXJzZShzdHJ1Y3QgdGltZXNwZWMgKnRzKQorbm90cmFjZSBzdGF0aWMgdm9pZCBkb19tb25vdG9uaWNfY29hcnNlKHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7CiAJdW5zaWduZWQgbG9uZyBzZXE7CiAJZG8gewotCQlzZXEgPSByYXdfcmVhZF9zZXFjb3VudF9iZWdpbigmZ3RvZC0+c2VxKTsKLQkJdHMtPnR2X3NlYyA9IGd0b2QtPm1vbm90b25pY190aW1lX2NvYXJzZS50dl9zZWM7Ci0JCXRzLT50dl9uc2VjID0gZ3RvZC0+bW9ub3RvbmljX3RpbWVfY29hcnNlLnR2X25zZWM7Ci0JfSB3aGlsZSAodW5saWtlbHkocmVhZF9zZXFjb3VudF9yZXRyeSgmZ3RvZC0+c2VxLCBzZXEpKSk7Ci0KLQlyZXR1cm4gMDsKKwkJc2VxID0gZ3RvZF9yZWFkX2JlZ2luKGd0b2QpOworCQl0cy0+dHZfc2VjID0gZ3RvZC0+bW9ub3RvbmljX3RpbWVfY29hcnNlX3NlYzsKKwkJdHMtPnR2X25zZWMgPSBndG9kLT5tb25vdG9uaWNfdGltZV9jb2Fyc2VfbnNlYzsKKwl9IHdoaWxlICh1bmxpa2VseShndG9kX3JlYWRfcmV0cnkoZ3RvZCwgc2VxKSkpOwogfQogCiBub3RyYWNlIGludCBfX3Zkc29fY2xvY2tfZ2V0dGltZShjbG9ja2lkX3QgY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7Ci0JaW50IHJldCA9IFZDTE9DS19OT05FOwotCiAJc3dpdGNoIChjbG9jaykgewogCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6Ci0JCXJldCA9IGRvX3JlYWx0aW1lKHRzKTsKKwkJaWYgKGRvX3JlYWx0aW1lKHRzKSA9PSBWQ0xPQ0tfTk9ORSkKKwkJCWdvdG8gZmFsbGJhY2s7CiAJCWJyZWFrOwogCWNhc2UgQ0xPQ0tfTU9OT1RPTklDOgotCQlyZXQgPSBkb19tb25vdG9uaWModHMpOworCQlpZiAoZG9fbW9ub3RvbmljKHRzKSA9PSBWQ0xPQ0tfTk9ORSkKKwkJCWdvdG8gZmFsbGJhY2s7CiAJCWJyZWFrOwogCWNhc2UgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFOgotCQlyZXR1cm4gZG9fcmVhbHRpbWVfY29hcnNlKHRzKTsKKwkJZG9fcmVhbHRpbWVfY29hcnNlKHRzKTsKKwkJYnJlYWs7CiAJY2FzZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFOgotCQlyZXR1cm4gZG9fbW9ub3RvbmljX2NvYXJzZSh0cyk7CisJCWRvX21vbm90b25pY19jb2Fyc2UodHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGZhbGxiYWNrOwogCX0KIAotCWlmIChyZXQgPT0gVkNMT0NLX05PTkUpCi0JCXJldHVybiB2ZHNvX2ZhbGxiYWNrX2dldHRpbWUoY2xvY2ssIHRzKTsKIAlyZXR1cm4gMDsKK2ZhbGxiYWNrOgorCXJldHVybiB2ZHNvX2ZhbGxiYWNrX2dldHRpbWUoY2xvY2ssIHRzKTsKIH0KIGludCBjbG9ja19nZXR0aW1lKGNsb2NraWRfdCwgc3RydWN0IHRpbWVzcGVjICopCiAJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fdmRzb19jbG9ja19nZXR0aW1lIikpKTsKIAogbm90cmFjZSBpbnQgX192ZHNvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCiB7Ci0JbG9uZyByZXQgPSBWQ0xPQ0tfTk9ORTsKLQogCWlmIChsaWtlbHkodHYgIT0gTlVMTCkpIHsKLQkJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCB0aW1ldmFsLCB0dl91c2VjKSAhPQotCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGltZXNwZWMsIHR2X25zZWMpIHx8Ci0JCQkgICAgIHNpemVvZigqdHYpICE9IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKTsKLQkJcmV0ID0gZG9fcmVhbHRpbWUoKHN0cnVjdCB0aW1lc3BlYyAqKXR2KTsKKwkJaWYgKHVubGlrZWx5KGRvX3JlYWx0aW1lKChzdHJ1Y3QgdGltZXNwZWMgKil0dikgPT0gVkNMT0NLX05PTkUpKQorCQkJcmV0dXJuIHZkc29fZmFsbGJhY2tfZ3RvZCh0diwgdHopOwogCQl0di0+dHZfdXNlYyAvPSAxMDAwOwogCX0KIAlpZiAodW5saWtlbHkodHogIT0gTlVMTCkpIHsKLQkJLyogQXZvaWQgbWVtY3B5LiBTb21lIG9sZCBjb21waWxlcnMgZmFpbCB0byBpbmxpbmUgaXQgKi8KLQkJdHotPnR6X21pbnV0ZXN3ZXN0ID0gZ3RvZC0+c3lzX3R6LnR6X21pbnV0ZXN3ZXN0OwotCQl0ei0+dHpfZHN0dGltZSA9IGd0b2QtPnN5c190ei50el9kc3R0aW1lOworCQl0ei0+dHpfbWludXRlc3dlc3QgPSBndG9kLT50el9taW51dGVzd2VzdDsKKwkJdHotPnR6X2RzdHRpbWUgPSBndG9kLT50el9kc3R0aW1lOwogCX0KIAotCWlmIChyZXQgPT0gVkNMT0NLX05PTkUpCi0JCXJldHVybiB2ZHNvX2ZhbGxiYWNrX2d0b2QodHYsIHR6KTsKIAlyZXR1cm4gMDsKIH0KIGludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICopCkBAIC0yODcsOCArMzU1LDggQEAKICAqLwogbm90cmFjZSB0aW1lX3QgX192ZHNvX3RpbWUodGltZV90ICp0KQogewotCS8qIFRoaXMgaXMgYXRvbWljIG9uIHg4Nl82NCBzbyB3ZSBkb24ndCBuZWVkIGFueSBsb2Nrcy4gKi8KLQl0aW1lX3QgcmVzdWx0ID0gQUNDRVNTX09OQ0UoVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLndhbGxfdGltZV9zZWMpOworCS8qIFRoaXMgaXMgYXRvbWljIG9uIHg4NiBzbyB3ZSBkb24ndCBuZWVkIGFueSBsb2Nrcy4gKi8KKwl0aW1lX3QgcmVzdWx0ID0gQUNDRVNTX09OQ0UoZ3RvZC0+d2FsbF90aW1lX3NlYyk7CiAKIAlpZiAodCkKIAkJKnQgPSByZXN1bHQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28tbGF5b3V0Lmxkcy5TIGIvYXJjaC94ODYvdmRzby92ZHNvLWxheW91dC5sZHMuUwppbmRleCA2MzRhMmNmLi4yZTI2M2YzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28tbGF5b3V0Lmxkcy5TCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzby1sYXlvdXQubGRzLlMKQEAgLTYsNyArNiwyNSBAQAogCiBTRUNUSU9OUwogewotCS4gPSBWRFNPX1BSRUxJTksgKyBTSVpFT0ZfSEVBREVSUzsKKyNpZmRlZiBCVUlMRF9WRFNPMzIKKyNpbmNsdWRlIDxhc20vdmRzbzMyLmg+CisKKwkuaHBldF9zZWN0IDogeworCQlocGV0X3BhZ2UgPSAuIC0gVkRTT19PRkZTRVQoVkRTT19IUEVUX1BBR0UpOworCX0gOnRleHQgOmhwZXRfc2VjdAorCisJLnZ2YXJfc2VjdCA6IHsKKwkJdnZhciA9IC4gLSBWRFNPX09GRlNFVChWRFNPX1ZWQVJfUEFHRSk7CisKKwkvKiBQbGFjZSBhbGwgdnZhcnMgYXQgdGhlIG9mZnNldHMgaW4gYXNtL3Z2YXIuaC4gKi8KKyNkZWZpbmUgRU1JVF9WVkFSKG5hbWUsIG9mZnNldCkgdnZhcl8gIyMgbmFtZSA9IHZ2YXIgKyBvZmZzZXQ7CisjZGVmaW5lIF9fVlZBUl9LRVJORUxfTERTCisjaW5jbHVkZSA8YXNtL3Z2YXIuaD4KKyN1bmRlZiBfX1ZWQVJfS0VSTkVMX0xEUworI3VuZGVmIEVNSVRfVlZBUgorCX0gOnRleHQgOnZ2YXJfc2VjdAorI2VuZGlmCisJLiA9IFNJWkVPRl9IRUFERVJTOwogCiAJLmhhc2gJCTogeyAqKC5oYXNoKSB9CQkJOnRleHQKIAkuZ251Lmhhc2gJOiB7ICooLmdudS5oYXNoKSB9CkBAIC00NCw2ICs2MiwxMSBAQAogCS4gPSBBTElHTigweDEwMCk7CiAKIAkudGV4dAkJOiB7ICooLnRleHQqKSB9CQkJOnRleHQJPTB4OTA5MDkwOTAKKworCS9ESVNDQVJELyA6IHsKKwkJKiguZGlzY2FyZCkKKwkJKiguZGlzY2FyZC4qKQorCX0KIH0KIAogLyoKQEAgLTYxLDQgKzg0LDggQEAKIAlkeW5hbWljCQlQVF9EWU5BTUlDCUZMQUdTKDQpOwkJLyogUEZfUiAqLwogCW5vdGUJCVBUX05PVEUJCUZMQUdTKDQpOwkJLyogUEZfUiAqLwogCWVoX2ZyYW1lX2hkcglQVF9HTlVfRUhfRlJBTUU7CisjaWZkZWYgQlVJTERfVkRTTzMyCisJdnZhcl9zZWN0CVBUX05VTEwJCUZMQUdTKDQpOwkJLyogUEZfUiAqLworCWhwZXRfc2VjdAlQVF9OVUxMCQlGTEFHUyg0KTsJCS8qIFBGX1IgKi8KKyNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28uUwppbmRleCAxZTEzZWI4Li5iZTNmMjNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28uUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28uUwpAQCAtMSwyMSArMSwzIEBACi0jaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAotX19QQUdFX0FMSUdORURfREFUQQotCi0JLmdsb2JsIHZkc29fc3RhcnQsIHZkc29fZW5kCi0JLmFsaWduIFBBR0VfU0laRQotdmRzb19zdGFydDoKLQkuaW5jYmluICJhcmNoL3g4Ni92ZHNvL3Zkc28uc28iCi12ZHNvX2VuZDoKLQkuYWxpZ24gUEFHRV9TSVpFIC8qIGV4dHJhIGRhdGEgaGVyZSBsZWFrcyB0byB1c2Vyc3BhY2UuICovCi0KLS5wcmV2aW91cwotCi0JLmdsb2JsIHZkc29fcGFnZXMKLQkuYnNzCi0JLmFsaWduIDgKLQkudHlwZSB2ZHNvX3BhZ2VzLCBAb2JqZWN0Ci12ZHNvX3BhZ2VzOgotCS56ZXJvICh2ZHNvX2VuZCAtIHZkc29fc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRSAqIDgKLQkuc2l6ZSB2ZHNvX3BhZ2VzLCAuLXZkc29fcGFnZXMKK0RFRklORV9WRFNPX0lNQUdFKHZkc28sICJhcmNoL3g4Ni92ZHNvL3Zkc28uc28iKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMKaW5kZXggZDZiZmI4Ny4uMDAzNDg5OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9tc3IuaD4KQEAgLTI1LDE3ICsyNiwxNCBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+Ci0KLWVudW0gewotCVZEU09fRElTQUJMRUQgPSAwLAotCVZEU09fRU5BQkxFRCA9IDEsCi0JVkRTT19DT01QQVQgPSAyLAotfTsKKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNpbmNsdWRlIDxhc20vdnZhci5oPgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVF9WRFNPCi0jZGVmaW5lIFZEU09fREVGQVVMVAlWRFNPX0NPTVBBVAorI2RlZmluZSBWRFNPX0RFRkFVTFQJMAogI2Vsc2UKLSNkZWZpbmUgVkRTT19ERUZBVUxUCVZEU09fRU5BQkxFRAorI2RlZmluZSBWRFNPX0RFRkFVTFQJMQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC00NCwxMyArNDIsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByZWxpbmtlZCBhZGRyZXNzZXMgaW4gdGhlIHZEU08gaW1hZ2VzCi0gKiBhbmQgdGhlIFZEU09fSElHSF9CQVNFIGFkZHJlc3Mgd2hlcmUgQ09ORklHX0NPTVBBVF9WRFNPIHBsYWNlcyB0aGUgdkRTTwotICogaW4gdGhlIHVzZXIgYWRkcmVzcyBzcGFjZS4KLSAqLwotI2RlZmluZSBWRFNPX0FERFJfQURKVVNUCShWRFNPX0hJR0hfQkFTRSAtICh1bnNpZ25lZCBsb25nKVZEU08zMl9QUkVMSU5LKQotCi0vKgogICogU2hvdWxkIHRoZSBrZXJuZWwgbWFwIGEgVkRTTyBwYWdlIGludG8gcHJvY2Vzc2VzIGFuZCBwYXNzIGl0cwogICogYWRkcmVzcyBkb3duIHRvIGdsaWJjIHVwb24gZXhlYygpPwogICovCkBAIC02MCw2ICs1MSw5IEBACiB7CiAJdmRzb19lbmFibGVkID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7CiAKKwlpZiAodmRzb19lbmFibGVkID4gMSkKKwkJcHJfd2FybigidmRzbzMyIHZhbHVlcyBvdGhlciB0aGFuIDAgYW5kIDEgYXJlIG5vIGxvbmdlciBhbGxvd2VkOyB2ZHNvIGRpc2FibGVkXG4iKTsKKwogCXJldHVybiAxOwogfQogCkBAIC03NiwxMjQgKzcwLDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHZkc29fZW5hYmxlZCk7CiAjZW5kaWYKIAotc3RhdGljIF9faW5pdCB2b2lkIHJlbG9jX3N5bXRhYihFbGYzMl9FaGRyICplaGRyLAotCQkJCXVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgc2l6ZSkKLXsKLQlFbGYzMl9TeW0gKnN5bSA9ICh2b2lkICopZWhkciArIG9mZnNldDsKLQl1bnNpZ25lZCBuc3ltID0gc2l6ZSAvIHNpemVvZigqc3ltKTsKLQl1bnNpZ25lZCBpOwotCi0JZm9yKGkgPSAwOyBpIDwgbnN5bTsgaSsrLCBzeW0rKykgewotCQlpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYgfHwKLQkJICAgIHN5bS0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkJCWNvbnRpbnVlOyAgLyogc2tpcCAqLwotCi0JCWlmIChzeW0tPnN0X3NobmR4ID4gU0hOX0xPUkVTRVJWRSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVkRTTzogdW5leHBlY3RlZCBzdF9zaG5keCAleFxuIiwKLQkJCSAgICAgICBzeW0tPnN0X3NobmR4KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3dpdGNoKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykpIHsKLQkJY2FzZSBTVFRfT0JKRUNUOgotCQljYXNlIFNUVF9GVU5DOgotCQljYXNlIFNUVF9TRUNUSU9OOgotCQljYXNlIFNUVF9GSUxFOgotCQkJc3ltLT5zdF92YWx1ZSArPSBWRFNPX0FERFJfQURKVVNUOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgcmVsb2NfZHluKEVsZjMyX0VoZHIgKmVoZHIsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlFbGYzMl9EeW4gKmR5biA9ICh2b2lkICopZWhkciArIG9mZnNldDsKLQotCWZvcig7IGR5bi0+ZF90YWcgIT0gRFRfTlVMTDsgZHluKyspCi0JCXN3aXRjaChkeW4tPmRfdGFnKSB7Ci0JCWNhc2UgRFRfUExUR09UOgotCQljYXNlIERUX0hBU0g6Ci0JCWNhc2UgRFRfU1RSVEFCOgotCQljYXNlIERUX1NZTVRBQjoKLQkJY2FzZSBEVF9SRUxBOgotCQljYXNlIERUX0lOSVQ6Ci0JCWNhc2UgRFRfRklOSToKLQkJY2FzZSBEVF9SRUw6Ci0JCWNhc2UgRFRfREVCVUc6Ci0JCWNhc2UgRFRfSk1QUkVMOgotCQljYXNlIERUX1ZFUlNZTToKLQkJY2FzZSBEVF9WRVJERUY6Ci0JCWNhc2UgRFRfVkVSTkVFRDoKLQkJY2FzZSBEVF9BRERSUk5HTE8gLi4uIERUX0FERFJSTkdISToKLQkJCS8qIGRlZmluaXRlbHkgcG9pbnRlcnMgbmVlZGluZyByZWxvY2F0aW9uICovCi0JCQlkeW4tPmRfdW4uZF9wdHIgKz0gVkRTT19BRERSX0FESlVTVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRFRfRU5DT0RJTkcgLi4uIE9MRF9EVF9MT09TLTE6Ci0JCWNhc2UgRFRfTE9PUyAuLi4gRFRfSElPUy0xOgotCQkJLyogVGFncyBhYm92ZSBEVF9FTkNPRElORyBhcmUgcG9pbnRlcnMgaWYKLQkJCSAgIHRoZXkncmUgZXZlbiAqLwotCQkJaWYgKGR5bi0+ZF90YWcgPj0gRFRfRU5DT0RJTkcgJiYKLQkJCSAgICAoZHluLT5kX3RhZyAmIDEpID09IDApCi0JCQkJZHluLT5kX3VuLmRfcHRyICs9IFZEU09fQUREUl9BREpVU1Q7Ci0JCQlicmVhazsKLQotCQljYXNlIERUX1ZFUkRFRk5VTToKLQkJY2FzZSBEVF9WRVJORUVETlVNOgotCQljYXNlIERUX0ZMQUdTXzE6Ci0JCWNhc2UgRFRfUkVMQUNPVU5UOgotCQljYXNlIERUX1JFTENPVU5UOgotCQljYXNlIERUX1ZBTFJOR0xPIC4uLiBEVF9WQUxSTkdISToKLQkJCS8qIGRlZmluaXRlbHkgbm90IHBvaW50ZXJzICovCi0JCQlicmVhazsKLQotCQljYXNlIE9MRF9EVF9MT09TIC4uLiBEVF9MT09TLTE6Ci0JCWNhc2UgRFRfSElPUyAuLi4gRFRfVkFMUk5HTE8tMToKLQkJZGVmYXVsdDoKLQkJCWlmIChkeW4tPmRfdGFnID4gRFRfRU5DT0RJTkcpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVkRTTzogdW5leHBlY3RlZCBEVF90YWcgJXhcbiIsCi0JCQkJICAgICAgIGR5bi0+ZF90YWcpOwotCQkJYnJlYWs7Ci0JCX0KLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIHJlbG9jYXRlX3Zkc28oRWxmMzJfRWhkciAqZWhkcikKLXsKLQlFbGYzMl9QaGRyICpwaGRyOwotCUVsZjMyX1NoZHIgKnNoZHI7Ci0JaW50IGk7Ci0KLQlCVUdfT04obWVtY21wKGVoZHItPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCB8fAotCSAgICAgICAhZWxmX2NoZWNrX2FyY2hfaWEzMihlaGRyKSB8fAotCSAgICAgICBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKTsKLQotCWVoZHItPmVfZW50cnkgKz0gVkRTT19BRERSX0FESlVTVDsKLQotCS8qIHJlYmFzZSBwaGRycyAqLwotCXBoZHIgPSAodm9pZCAqKWVoZHIgKyBlaGRyLT5lX3Bob2ZmOwotCWZvciAoaSA9IDA7IGkgPCBlaGRyLT5lX3BobnVtOyBpKyspIHsKLQkJcGhkcltpXS5wX3ZhZGRyICs9IFZEU09fQUREUl9BREpVU1Q7Ci0KLQkJLyogcmVsb2NhdGUgZHluYW1pYyBzdHVmZiAqLwotCQlpZiAocGhkcltpXS5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLQkJCXJlbG9jX2R5bihlaGRyLCBwaGRyW2ldLnBfb2Zmc2V0KTsKLQl9Ci0KLQkvKiByZWJhc2Ugc2VjdGlvbnMgKi8KLQlzaGRyID0gKHZvaWQgKillaGRyICsgZWhkci0+ZV9zaG9mZjsKLQlmb3IoaSA9IDA7IGkgPCBlaGRyLT5lX3NobnVtOyBpKyspIHsKLQkJaWYgKCEoc2hkcltpXS5zaF9mbGFncyAmIFNIRl9BTExPQykpCi0JCQljb250aW51ZTsKLQotCQlzaGRyW2ldLnNoX2FkZHIgKz0gVkRTT19BRERSX0FESlVTVDsKLQotCQlpZiAoc2hkcltpXS5zaF90eXBlID09IFNIVF9TWU1UQUIgfHwKLQkJICAgIHNoZHJbaV0uc2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCQkJcmVsb2Nfc3ltdGFiKGVoZHIsIHNoZHJbaV0uc2hfb2Zmc2V0LAotCQkJCSAgICAgc2hkcltpXS5zaF9zaXplKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqdmRzbzMyX3BhZ2VzWzFdOworc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzbzMyX3BhZ2VzOworc3RhdGljIHVuc2lnbmVkIHZkc28zMl9zaXplOwogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCkBAIC0yMTIsMTIgKzkwLDYgQEAKIAl3cm1zcmwoTVNSX0NTVEFSLCBpYTMyX2NzdGFyX3RhcmdldCk7CiB9CiAKLSNkZWZpbmUgY29tcGF0X3VzZXNfdm1hCQkxCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXBfY29tcGF0X3Zkc28oaW50IG1hcCkKLXsKLX0KLQogI2Vsc2UgIC8qIENPTkZJR19YODZfMzIgKi8KIAogI2RlZmluZSB2ZHNvMzJfc3lzZW50ZXIoKQkoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NFUCkpCkBAIC0yNDEsNjQgKzExMywzNiBAQAogCXB1dF9jcHUoKTsJCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgZ2F0ZV92bWE7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGdhdGVfdm1hX2luaXQodm9pZCkKLXsKLQlnYXRlX3ZtYS52bV9tbSA9IE5VTEw7Ci0JZ2F0ZV92bWEudm1fc3RhcnQgPSBGSVhBRERSX1VTRVJfU1RBUlQ7Ci0JZ2F0ZV92bWEudm1fZW5kID0gRklYQUREUl9VU0VSX0VORDsKLQlnYXRlX3ZtYS52bV9mbGFncyA9IFZNX1JFQUQgfCBWTV9NQVlSRUFEIHwgVk1fRVhFQyB8IFZNX01BWUVYRUM7Ci0JZ2F0ZV92bWEudm1fcGFnZV9wcm90ID0gX19QMTAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgY29tcGF0X3VzZXNfdm1hCQkwCi0KLXN0YXRpYyB2b2lkIG1hcF9jb21wYXRfdmRzbyhpbnQgbWFwKQotewotCXN0YXRpYyBpbnQgdmRzb19tYXBwZWQ7Ci0KLQlpZiAobWFwID09IHZkc29fbWFwcGVkKQotCQlyZXR1cm47Ci0KLQl2ZHNvX21hcHBlZCA9IG1hcDsKLQotCV9fc2V0X2ZpeG1hcChGSVhfVkRTTywgcGFnZV90b19wZm4odmRzbzMyX3BhZ2VzWzBdKSA8PCBQQUdFX1NISUZULAotCQkgICAgIG1hcCA/IFBBR0VfUkVBRE9OTFlfRVhFQyA6IFBBR0VfTk9ORSk7Ci0KLQkvKiBmbHVzaCBzdHJheSB0bGJzICovCi0JZmx1c2hfdGxiX2FsbCgpOwotfQotCiAjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLwogCiBpbnQgX19pbml0IHN5c2VudGVyX3NldHVwKHZvaWQpCiB7Ci0Jdm9pZCAqc3lzY2FsbF9wYWdlID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7Ci0JY29uc3Qgdm9pZCAqdnN5c2NhbGw7Ci0Jc2l6ZV90IHZzeXNjYWxsX2xlbjsKKwljaGFyICp2ZHNvMzJfc3RhcnQsICp2ZHNvMzJfZW5kOworCWludCBucGFnZXMsIGk7CiAKLQl2ZHNvMzJfcGFnZXNbMF0gPSB2aXJ0X3RvX3BhZ2Uoc3lzY2FsbF9wYWdlKTsKLQotI2lmZGVmIENPTkZJR19YODZfMzIKLQlnYXRlX3ZtYV9pbml0KCk7Ci0jZW5kaWYKLQorI2lmZGVmIENPTkZJR19DT01QQVQKIAlpZiAodmRzbzMyX3N5c2NhbGwoKSkgewotCQl2c3lzY2FsbCA9ICZ2ZHNvMzJfc3lzY2FsbF9zdGFydDsKLQkJdnN5c2NhbGxfbGVuID0gJnZkc28zMl9zeXNjYWxsX2VuZCAtICZ2ZHNvMzJfc3lzY2FsbF9zdGFydDsKLQl9IGVsc2UgaWYgKHZkc28zMl9zeXNlbnRlcigpKXsKLQkJdnN5c2NhbGwgPSAmdmRzbzMyX3N5c2VudGVyX3N0YXJ0OwotCQl2c3lzY2FsbF9sZW4gPSAmdmRzbzMyX3N5c2VudGVyX2VuZCAtICZ2ZHNvMzJfc3lzZW50ZXJfc3RhcnQ7CisJCXZkc28zMl9zdGFydCA9IHZkc28zMl9zeXNjYWxsX3N0YXJ0OworCQl2ZHNvMzJfZW5kID0gdmRzbzMyX3N5c2NhbGxfZW5kOworCQl2ZHNvMzJfcGFnZXMgPSB2ZHNvMzJfc3lzY2FsbF9wYWdlczsKKwl9IGVsc2UKKyNlbmRpZgorCWlmICh2ZHNvMzJfc3lzZW50ZXIoKSkgeworCQl2ZHNvMzJfc3RhcnQgPSB2ZHNvMzJfc3lzZW50ZXJfc3RhcnQ7CisJCXZkc28zMl9lbmQgPSB2ZHNvMzJfc3lzZW50ZXJfZW5kOworCQl2ZHNvMzJfcGFnZXMgPSB2ZHNvMzJfc3lzZW50ZXJfcGFnZXM7CiAJfSBlbHNlIHsKLQkJdnN5c2NhbGwgPSAmdmRzbzMyX2ludDgwX3N0YXJ0OwotCQl2c3lzY2FsbF9sZW4gPSAmdmRzbzMyX2ludDgwX2VuZCAtICZ2ZHNvMzJfaW50ODBfc3RhcnQ7CisJCXZkc28zMl9zdGFydCA9IHZkc28zMl9pbnQ4MF9zdGFydDsKKwkJdmRzbzMyX2VuZCA9IHZkc28zMl9pbnQ4MF9lbmQ7CisJCXZkc28zMl9wYWdlcyA9IHZkc28zMl9pbnQ4MF9wYWdlczsKIAl9CiAKLQltZW1jcHkoc3lzY2FsbF9wYWdlLCB2c3lzY2FsbCwgdnN5c2NhbGxfbGVuKTsKLQlyZWxvY2F0ZV92ZHNvKHN5c2NhbGxfcGFnZSk7CisJbnBhZ2VzID0gKCh2ZHNvMzJfZW5kIC0gdmRzbzMyX3N0YXJ0KSArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCXZkc28zMl9zaXplID0gbnBhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQorCQl2ZHNvMzJfcGFnZXNbaV0gPSB2aXJ0X3RvX3BhZ2UodmRzbzMyX3N0YXJ0ICsgaSpQQUdFX1NJWkUpOworCisJcGF0Y2hfdmRzbzMyKHZkc28zMl9zdGFydCwgdmRzbzMyX3NpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMDksNDggKzE1Myw3MyBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCWludCByZXQgPSAwOwotCWJvb2wgY29tcGF0OworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1gzMikpCiAJCXJldHVybiB4MzJfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhicHJtLCB1c2VzX2ludGVycCk7CiAjZW5kaWYKIAotCWlmICh2ZHNvX2VuYWJsZWQgPT0gVkRTT19ESVNBQkxFRCkKKwlpZiAodmRzb19lbmFibGVkICE9IDEpICAvKiBPdGhlciB2YWx1ZXMgYWxsIG1lYW4gImRpc2FibGVkIiAqLwogCQlyZXR1cm4gMDsKIAogCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAKLQkvKiBUZXN0IGNvbXBhdCBtb2RlIG9uY2UgaGVyZSwgaW4gY2FzZSBzb21lb25lCi0JICAgY2hhbmdlcyBpdCB2aWEgc3lzY3RsICovCi0JY29tcGF0ID0gKHZkc29fZW5hYmxlZCA9PSBWRFNPX0NPTVBBVCk7Ci0KLQltYXBfY29tcGF0X3Zkc28oY29tcGF0KTsKLQotCWlmIChjb21wYXQpCi0JCWFkZHIgPSBWRFNPX0hJR0hfQkFTRTsKLQllbHNlIHsKLQkJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIDAsIFBBR0VfU0laRSwgMCwgMCk7Ci0JCWlmIChJU19FUlJfVkFMVUUoYWRkcikpIHsKLQkJCXJldCA9IGFkZHI7Ci0JCQlnb3RvIHVwX2ZhaWw7Ci0JCX0KKwlhZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgMCwgdmRzbzMyX3NpemUgKyBWRFNPX09GRlNFVChWRFNPX1BSRVZfUEFHRVMpLCAwLCAwKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKSB7CisJCXJldCA9IGFkZHI7CisJCWdvdG8gdXBfZmFpbDsKIAl9CiAKKwlhZGRyICs9IFZEU09fT0ZGU0VUKFZEU09fUFJFVl9QQUdFUyk7CisKIAljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gKHZvaWQgKilhZGRyOwogCi0JaWYgKGNvbXBhdF91c2VzX3ZtYSB8fCAhY29tcGF0KSB7Ci0JCS8qCi0JCSAqIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cwotCQkgKi8KLQkJcmV0ID0gaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcobW0sIGFkZHIsIFBBR0VfU0laRSwKLQkJCQkJICAgICAgVk1fUkVBRHxWTV9FWEVDfAotCQkJCQkgICAgICBWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUMsCi0JCQkJCSAgICAgIHZkc28zMl9wYWdlcyk7CisJLyoKKwkgKiBNQVlXUklURSB0byBhbGxvdyBnZGIgdG8gQ09XIGFuZCBzZXQgYnJlYWtwb2ludHMKKwkgKi8KKwlyZXQgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwKKwkJCWFkZHIsCisJCQl2ZHNvMzJfc2l6ZSwKKwkJCVZNX1JFQUR8Vk1fRVhFQ3wKKwkJCVZNX01BWVJFQUR8Vk1fTUFZV1JJVEV8Vk1fTUFZRVhFQywKKwkJCXZkc28zMl9wYWdlcyk7CisKKwlpZiAocmV0KQorCQlnb3RvIHVwX2ZhaWw7CisKKwl2bWEgPSBfaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcobW0sCisJCQlhZGRyIC0gIFZEU09fT0ZGU0VUKFZEU09fUFJFVl9QQUdFUyksCisJCQlWRFNPX09GRlNFVChWRFNPX1BSRVZfUEFHRVMpLAorCQkJVk1fUkVBRCwKKwkJCU5VTEwpOworCisJaWYgKElTX0VSUih2bWEpKSB7CisJCXJldCA9IFBUUl9FUlIodm1hKTsKKwkJZ290byB1cF9mYWlsOworCX0KKworCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsCisJCWFkZHIgLSBWRFNPX09GRlNFVChWRFNPX1ZWQVJfUEFHRSksCisJCV9fcGFfc3ltYm9sKCZfX3Z2YXJfcGFnZSkgPj4gUEFHRV9TSElGVCwKKwkJUEFHRV9TSVpFLAorCQlQQUdFX1JFQURPTkxZKTsKKworCWlmIChyZXQpCisJCWdvdG8gdXBfZmFpbDsKKworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJaWYgKGhwZXRfYWRkcmVzcykgeworCQlyZXQgPSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLAorCQkJYWRkciAtIFZEU09fT0ZGU0VUKFZEU09fSFBFVF9QQUdFKSwKKwkJCWhwZXRfYWRkcmVzcyA+PiBQQUdFX1NISUZULAorCQkJUEFHRV9TSVpFLAorCQkJcGdwcm90X25vbmNhY2hlZChQQUdFX1JFQURPTkxZKSk7CiAKIAkJaWYgKHJldCkKIAkJCWdvdG8gdXBfZmFpbDsKIAl9CisjZW5kaWYKIAogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzZW50ZXJfcmV0dXJuID0KIAkJVkRTTzMyX1NZTUJPTChhZGRyLCBTWVNFTlRFUl9SRVRVUk4pOwpAQCAtNDExLDIwICsyODAsMTIgQEAKIAogc3RydWN0IHZtX2FyZWFfc3RydWN0ICpnZXRfZ2F0ZV92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgdGFzayB3YXMgY3JlYXRlZCBpbiBjb21wYXQgdmRzbwotCSAqIG1vZGUuCi0JICovCi0JaWYgKG1tICYmIG1tLT5jb250ZXh0LnZkc28gPT0gKHZvaWQgKilWRFNPX0hJR0hfQkFTRSkKLQkJcmV0dXJuICZnYXRlX3ZtYTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogaW50IGluX2dhdGVfYXJlYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCWNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gZ2V0X2dhdGVfdm1hKG1tKTsKLQotCXJldHVybiB2bWEgJiYgYWRkciA+PSB2bWEtPnZtX3N0YXJ0ICYmIGFkZHIgPCB2bWEtPnZtX2VuZDsKKwlyZXR1cm4gMDsKIH0KIAogaW50IGluX2dhdGVfYXJlYV9ub19tbSh1bnNpZ25lZCBsb25nIGFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi5TIGIvYXJjaC94ODYvdmRzby92ZHNvMzIuUwppbmRleCAyY2U1ZjgyLi4wMThiY2Q5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi5TCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyLlMKQEAgLTEsMjIgKzEsOSBAQAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdmRzby5oPgogCi1fX0lOSVREQVRBCitERUZJTkVfVkRTT19JTUFHRSh2ZHNvMzJfaW50ODAsICJhcmNoL3g4Ni92ZHNvL3Zkc28zMi1pbnQ4MC5zbyIpCiAKLQkuZ2xvYmwgdmRzbzMyX2ludDgwX3N0YXJ0LCB2ZHNvMzJfaW50ODBfZW5kCi12ZHNvMzJfaW50ODBfc3RhcnQ6Ci0JLmluY2JpbiAiYXJjaC94ODYvdmRzby92ZHNvMzItaW50ODAuc28iCi12ZHNvMzJfaW50ODBfZW5kOgotCi0JLmdsb2JsIHZkc28zMl9zeXNjYWxsX3N0YXJ0LCB2ZHNvMzJfc3lzY2FsbF9lbmQKLXZkc28zMl9zeXNjYWxsX3N0YXJ0OgogI2lmZGVmIENPTkZJR19DT01QQVQKLQkuaW5jYmluICJhcmNoL3g4Ni92ZHNvL3Zkc28zMi1zeXNjYWxsLnNvIgorREVGSU5FX1ZEU09fSU1BR0UodmRzbzMyX3N5c2NhbGwsICJhcmNoL3g4Ni92ZHNvL3Zkc28zMi1zeXNjYWxsLnNvIikKICNlbmRpZgotdmRzbzMyX3N5c2NhbGxfZW5kOgogCi0JLmdsb2JsIHZkc28zMl9zeXNlbnRlcl9zdGFydCwgdmRzbzMyX3N5c2VudGVyX2VuZAotdmRzbzMyX3N5c2VudGVyX3N0YXJ0OgotCS5pbmNiaW4gImFyY2gveDg2L3Zkc28vdmRzbzMyLXN5c2VudGVyLnNvIgotdmRzbzMyX3N5c2VudGVyX2VuZDoKLQotX19GSU5JVAorREVGSU5FX1ZEU09fSU1BR0UodmRzbzMyX3N5c2VudGVyLCAiYXJjaC94ODYvdmRzby92ZHNvMzItc3lzZW50ZXIuc28iKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvMzIvdmNsb2NrX2dldHRpbWUuYyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyL3ZjbG9ja19nZXR0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1Y2M3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyL3ZjbG9ja19nZXR0aW1lLmMKQEAgLTAsMCArMSwzMCBAQAorI2RlZmluZSBCVUlMRF9WRFNPMzIKKworI2lmbmRlZiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUKKyN1bmRlZiBDT05GSUdfT1BUSU1JWkVfSU5MSU5JTkcKKyNlbmRpZgorCisjdW5kZWYgQ09ORklHX1g4Nl9QUFJPX0ZFTkNFCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisKKy8qCisgKiBpbiBjYXNlIG9mIGEgMzIgYml0IFZEU08gZm9yIGEgNjQgYml0IGtlcm5lbCBmYWtlIGEgMzIgYml0IGtlcm5lbAorICogY29uZmlndXJhdGlvbgorICovCisjdW5kZWYgQ09ORklHXzY0QklUCisjdW5kZWYgQ09ORklHX1g4Nl82NAorI3VuZGVmIENPTkZJR19JTExFR0FMX1BPSU5URVJfVkFMVUUKKyN1bmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKKyN1bmRlZiBDT05GSUdfTlJfQ1BVUworCisjZGVmaW5lIENPTkZJR19YODZfMzIgMQorI2RlZmluZSBDT05GSUdfUEFHRV9PRkZTRVQgMAorI2RlZmluZSBDT05GSUdfSUxMRUdBTF9QT0lOVEVSX1ZBTFVFIDAKKyNkZWZpbmUgQ09ORklHX05SX0NQVVMgMQorCisjZGVmaW5lIEJVSUxEX1ZEU08zMl82NAorCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL3ZjbG9ja19nZXR0aW1lLmMiCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92ZHNvMzIubGRzLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92ZHNvMzIubGRzLlMKaW5kZXggOTc2MTI0Yi4uYWFkYjhiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92ZHNvMzIvdmRzbzMyLmxkcy5TCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyL3Zkc28zMi5sZHMuUwpAQCAtOCw3ICs4LDExIEBACiAgKiB2YWx1ZXMgdmlzaWJsZSB1c2luZyB0aGUgYXNtLXg4Ni92ZHNvLmggbWFjcm9zIGZyb20gdGhlIGtlcm5lbCBwcm9wZXIuCiAgKi8KIAorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNkZWZpbmUgQlVJTERfVkRTTzMyCiAjZGVmaW5lIFZEU09fUFJFTElOSyAwCisKICNpbmNsdWRlICIuLi92ZHNvLWxheW91dC5sZHMuUyIKIAogLyogVGhlIEVMRiBlbnRyeSBwb2ludCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIEFUX1NZU0lORk8gdmFsdWUuICAqLwpAQCAtMTksNiArMjMsMTMgQEAKICAqLwogVkVSU0lPTgogeworCUxJTlVYXzIuNiB7CisJZ2xvYmFsOgorCQlfX3Zkc29fY2xvY2tfZ2V0dGltZTsKKwkJX192ZHNvX2dldHRpbWVvZmRheTsKKwkJX192ZHNvX3RpbWU7CisJfTsKKwogCUxJTlVYXzIuNSB7CiAJZ2xvYmFsOgogCQlfX2tlcm5lbF92c3lzY2FsbDsKQEAgLTMxLDcgKzQyLDkgQEAKIC8qCiAgKiBTeW1ib2xzIHdlIGRlZmluZSBoZXJlIGNhbGxlZCBWRFNPKiBnZXQgdGhlaXIgdmFsdWVzIGludG8gdmRzbzMyLXN5bXMuaC4KICAqLwotVkRTTzMyX1BSRUxJTksJCT0gVkRTT19QUkVMSU5LOwogVkRTTzMyX3ZzeXNjYWxsCQk9IF9fa2VybmVsX3ZzeXNjYWxsOwogVkRTTzMyX3NpZ3JldHVybgk9IF9fa2VybmVsX3NpZ3JldHVybjsKIFZEU08zMl9ydF9zaWdyZXR1cm4JPSBfX2tlcm5lbF9ydF9zaWdyZXR1cm47CitWRFNPMzJfY2xvY2tfZ2V0dGltZQk9IGNsb2NrX2dldHRpbWU7CitWRFNPMzJfZ2V0dGltZW9mZGF5CT0gZ2V0dGltZW9mZGF5OworVkRTTzMyX3RpbWUJCT0gdGltZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzb3gzMi5TIGIvYXJjaC94ODYvdmRzby92ZHNveDMyLlMKaW5kZXggMjk1ZjFjNy4uZjRhYTM0ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92ZHNveDMyLlMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNveDMyLlMKQEAgLTEsMjEgKzEsMyBAQAotI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAKLV9fUEFHRV9BTElHTkVEX0RBVEEKLQotCS5nbG9ibCB2ZHNveDMyX3N0YXJ0LCB2ZHNveDMyX2VuZAotCS5hbGlnbiBQQUdFX1NJWkUKLXZkc294MzJfc3RhcnQ6Ci0JLmluY2JpbiAiYXJjaC94ODYvdmRzby92ZHNveDMyLnNvIgotdmRzb3gzMl9lbmQ6Ci0JLmFsaWduIFBBR0VfU0laRSAvKiBleHRyYSBkYXRhIGhlcmUgbGVha3MgdG8gdXNlcnNwYWNlLiAqLwotCi0ucHJldmlvdXMKLQotCS5nbG9ibCB2ZHNveDMyX3BhZ2VzCi0JLmJzcwotCS5hbGlnbiA4Ci0JLnR5cGUgdmRzb3gzMl9wYWdlcywgQG9iamVjdAotdmRzb3gzMl9wYWdlczoKLQkuemVybyAodmRzb3gzMl9lbmQgLSB2ZHNveDMyX3N0YXJ0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUgKiA4Ci0JLnNpemUgdmRzb3gzMl9wYWdlcywgLi12ZHNveDMyX3BhZ2VzCitERUZJTkVfVkRTT19JTUFHRSh2ZHNveDMyLCAiYXJjaC94ODYvdmRzby92ZHNveDMyLnNvIikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdm1hLmMgYi9hcmNoL3g4Ni92ZHNvL3ZtYS5jCmluZGV4IDQzMWU4NzUuLjFhZDEwMjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdm1hLmMKKysrIGIvYXJjaC94ODYvdmRzby92bWEuYwpAQCAtMTYsMjAgKzE2LDIyIEBACiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogdW5zaWduZWQgaW50IF9fcmVhZF9tb3N0bHkgdmRzb19lbmFibGVkID0gMTsKIAotZXh0ZXJuIGNoYXIgdmRzb19zdGFydFtdLCB2ZHNvX2VuZFtdOworREVDTEFSRV9WRFNPX0lNQUdFKHZkc28pOwogZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHZkc29fc3luY19jcHVpZDsKLQotZXh0ZXJuIHN0cnVjdCBwYWdlICp2ZHNvX3BhZ2VzW107CiBzdGF0aWMgdW5zaWduZWQgdmRzb19zaXplOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCi1leHRlcm4gY2hhciB2ZHNveDMyX3N0YXJ0W10sIHZkc294MzJfZW5kW107Ci1leHRlcm4gc3RydWN0IHBhZ2UgKnZkc294MzJfcGFnZXNbXTsKK0RFQ0xBUkVfVkRTT19JTUFHRSh2ZHNveDMyKTsKIHN0YXRpYyB1bnNpZ25lZCB2ZHNveDMyX3NpemU7CisjZW5kaWYKKyNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGF0Y2hfdmRzb3gzMih2b2lkICp2ZHNvLCBzaXplX3QgbGVuKQorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikgfHwgZGVmaW5lZChDT05GSUdfWDg2X1gzMl9BQkkpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19DT01QQVQpCit2b2lkIF9faW5pdCBwYXRjaF92ZHNvMzIodm9pZCAqdmRzbywgc2l6ZV90IGxlbikKIHsKIAlFbGYzMl9FaGRyICpoZHIgPSB2ZHNvOwogCUVsZjMyX1NoZHIgKnNlY2hkcnMsICphbHRfc2VjID0gMDsKQEAgLTUyLDcgKzU0LDcgQEAKIAl9CiAKIAkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQncyBwcm9iYWJseSBhIGJ1Zy4gKi8KLQlwcl93YXJuaW5nKCJwYXRjaF92ZHNveDMyOiAuYWx0aW5zdHJ1Y3Rpb25zIG5vdCBmb3VuZFxuIik7CisJcHJfd2FybmluZygicGF0Y2hfdmRzbzMyOiAuYWx0aW5zdHJ1Y3Rpb25zIG5vdCBmb3VuZFxuIik7CiAJcmV0dXJuOyAgLyogbm90aGluZyB0byBwYXRjaCAqLwogCiBmb3VuZDoKQEAgLTYxLDYgKzYzLDcgQEAKIH0KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogc3RhdGljIHZvaWQgX19pbml0IHBhdGNoX3Zkc282NCh2b2lkICp2ZHNvLCBzaXplX3QgbGVuKQogewogCUVsZjY0X0VoZHIgKmhkciA9IHZkc287CkBAIC0xMDQsNyArMTA3LDcgQEAKIAkJdmRzb19wYWdlc1tpXSA9IHZpcnRfdG9fcGFnZSh2ZHNvX3N0YXJ0ICsgaSpQQUdFX1NJWkUpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCi0JcGF0Y2hfdmRzb3gzMih2ZHNveDMyX3N0YXJ0LCB2ZHNveDMyX2VuZCAtIHZkc294MzJfc3RhcnQpOworCXBhdGNoX3Zkc28zMih2ZHNveDMyX3N0YXJ0LCB2ZHNveDMyX2VuZCAtIHZkc294MzJfc3RhcnQpOwogCW5wYWdlcyA9ICh2ZHNveDMyX2VuZCAtIHZkc294MzJfc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKIAl2ZHNveDMyX3NpemUgPSBucGFnZXMgPDwgUEFHRV9TSElGVDsKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspCkBAIC0yMDQsMyArMjA3LDQgQEAKIAlyZXR1cm4gMDsKIH0KIF9fc2V0dXAoInZkc289IiwgdmRzb19zZXR1cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9LY29uZmlnIGIvYXJjaC94ODYveGVuL0tjb25maWcKaW5kZXggMDFiOTAyNi4uOWM1MGNjMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL0tjb25maWcKKysrIGIvYXJjaC94ODYveGVuL0tjb25maWcKQEAgLTcsNyArNyw3IEBACiAJZGVwZW5kcyBvbiBQQVJBVklSVAogCXNlbGVjdCBQQVJBVklSVF9DTE9DSwogCXNlbGVjdCBYRU5fSEFWRV9QVk1NVQotCWRlcGVuZHMgb24gWDg2XzY0IHx8IChYODZfMzIgJiYgWDg2X1BBRSAmJiAhWDg2X1ZJU1dTKQorCWRlcGVuZHMgb24gWDg2XzY0IHx8IChYODZfMzIgJiYgWDg2X1BBRSkKIAlkZXBlbmRzIG9uIFg4Nl9UU0MKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBMaW51eCBYZW4gcG9ydC4gIEVuYWJsaW5nIHRoaXMgd2lsbCBhbGxvdyB0aGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRleCAyNTYyODJlLi44NmUwMmVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIvYXJjaC94ODYveGVuL21tdS5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIC8qIEFzc3VtZSBwdGV2YWxfdCBpcyBlcXVpdmFsZW50IHRvIGFsbCB0aGUgb3RoZXIgKnZhbF90IHR5cGVzLiAqLwogc3RhdGljIHB0ZXZhbF90IHB0ZV9tZm5fdG9fcGZuKHB0ZXZhbF90IHZhbCkKIHsKLQlpZiAocHRldmFsX3ByZXNlbnQodmFsKSkgeworCWlmICh2YWwgJiBfUEFHRV9QUkVTRU5UKSB7CiAJCXVuc2lnbmVkIGxvbmcgbWZuID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKIAkJdW5zaWduZWQgbG9uZyBwZm4gPSBtZm5fdG9fcGZuKG1mbik7CiAKQEAgLTM4MSw3ICszODEsNyBAQAogCiBzdGF0aWMgcHRldmFsX3QgcHRlX3Bmbl90b19tZm4ocHRldmFsX3QgdmFsKQogewotCWlmIChwdGV2YWxfcHJlc2VudCh2YWwpKSB7CisJaWYgKHZhbCAmIF9QQUdFX1BSRVNFTlQpIHsKIAkJdW5zaWduZWQgbG9uZyBwZm4gPSAodmFsICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdFX1NISUZUOwogCQlwdGV2YWxfdCBmbGFncyA9IHZhbCAmIFBURV9GTEFHU19NQVNLOwogCQl1bnNpZ25lZCBsb25nIG1mbjsKQEAgLTIwNTgsNyArMjA1OCw2IEBACiAJY2FzZSBGSVhfUk9fSURUOgogI2lmZGVmIENPTkZJR19YODZfMzIKIAljYXNlIEZJWF9XUF9URVNUOgotCWNhc2UgRklYX1ZEU086CiAjIGlmZGVmIENPTkZJR19ISUdITUVNCiAJY2FzZSBGSVhfS01BUF9CRUdJTiAuLi4gRklYX0tNQVBfRU5EOgogIyBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMgYi9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYwppbmRleCA1ODE1MjFjLi40ZDNhY2MzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYworKysgYi9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogb3V0OgogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7CiAJdy0+bG9jayA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMGEzMzdlNC4uYzNkMjBiYSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtOSw2ICs5LDcgQEAKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBmY250bC5oCiBnZW5lcmljLXkgKz0gaGFyZGlycS5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaAogZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKIGdlbmVyaWMteSArPSBrZGVidWcuaApAQCAtMTcsNyArMTgsOSBAQAogZ2VuZXJpYy15ICs9IGxpbmthZ2UuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKIGdlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZWN0aW9ucy5oCkBAIC0yNyw1ICszMCwzIEBACiBnZW5lcmljLXkgKz0gdG9wb2xvZ3kuaAogZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2lycS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL2lycS5jCmluZGV4IDQ4Mjg2OGEuLjNlZWU5NGYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMKQEAgLTE1NSwxOCArMTU1LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIHZvaWQgcm91dGVfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkYXRhKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGNoaXAtPmlycV9zZXRfYWZmaW5pdHkpCi0JCWNoaXAtPmlycV9zZXRfYWZmaW5pdHkoZGF0YSwgY3B1bWFza19vZihjcHUpLCBmYWxzZSk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLX0KLQogLyoKICAqIFRoZSBDUFUgaGFzIGJlZW4gbWFya2VkIG9mZmxpbmUuICBNaWdyYXRlIElSUXMgb2ZmIHRoaXMgQ1BVLiAgSWYKICAqIHRoZSBhZmZpbml0eSBzZXR0aW5ncyBkbyBub3QgYWxsb3cgb3RoZXIgQ1BVcywgZm9yY2UgdGhlbSBvbnRvIGFueQpAQCAtMTc1LDEwICsxNjMsOSBAQAogdm9pZCBtaWdyYXRlX2lycXModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAotCWZvcl9lYWNoX2lycV9kZXNjKGksIGRlc2MpIHsKLQkJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2Rlc2NfZ2V0X2lycV9kYXRhKGRlc2MpOworCWZvcl9lYWNoX2FjdGl2ZV9pcnEoaSkgeworCQlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGkpOwogCQl1bnNpZ25lZCBpbnQgbmV3Y3B1OwogCiAJCWlmIChpcnFkX2lzX3Blcl9jcHUoZGF0YSkpCkBAIC0xOTQsMTEgKzE4MSw4IEBACiAJCQkJCSAgICBpLCBjcHUpOwogCiAJCQljcHVtYXNrX3NldGFsbChkYXRhLT5hZmZpbml0eSk7Ci0JCQluZXdjcHUgPSBjcHVtYXNrX2FueV9hbmQoZGF0YS0+YWZmaW5pdHksCi0JCQkJCQkgY3B1X29ubGluZV9tYXNrKTsKIAkJfQotCi0JCXJvdXRlX2lycShkYXRhLCBpLCBuZXdjcHUpOworCQlpcnFfc2V0X2FmZmluaXR5KGksIGRhdGEtPmFmZmluaXR5KTsKIAl9CiB9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmMKaW5kZXggNGU0OTFkOS4uYjZlOTViNSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5jCisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJICogdW5kZXIgcXVldWVfbG9jay4gIElmIGl0J3Mgbm90IHBvaW50aW5nIHRvIEBibGtnIG5vdywgaXQgbmV2ZXIKIAkgKiB3aWxsLiAgSGludCBhc3NpZ25tZW50IGl0c2VsZiBjYW4gcmFjZSBzYWZlbHkuCiAJICovCi0JaWYgKHJjdV9kZXJlZmVyZW5jZV9yYXcoYmxrY2ctPmJsa2dfaGludCkgPT0gYmxrZykKKwlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGJsa2NnLT5ibGtnX2hpbnQpID09IGJsa2cpCiAJCXJjdV9hc3NpZ25fcG9pbnRlcihibGtjZy0+YmxrZ19oaW50LCBOVUxMKTsKIAogCS8qCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCA4NTNmOTI3Li5lNDViMzIxIDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTY5MywyMCArNjkzLDExIEBACiAJaWYgKCF1bmluaXRfcSkKIAkJcmV0dXJuIE5VTEw7CiAKLQl1bmluaXRfcS0+Zmx1c2hfcnEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVxdWVzdCksIEdGUF9LRVJORUwpOwotCWlmICghdW5pbml0X3EtPmZsdXNoX3JxKQotCQlnb3RvIG91dF9jbGVhbnVwX3F1ZXVlOwotCiAJcSA9IGJsa19pbml0X2FsbG9jYXRlZF9xdWV1ZSh1bmluaXRfcSwgcmZuLCBsb2NrKTsKIAlpZiAoIXEpCi0JCWdvdG8gb3V0X2ZyZWVfZmx1c2hfcnE7Ci0JcmV0dXJuIHE7CisJCWJsa19jbGVhbnVwX3F1ZXVlKHVuaW5pdF9xKTsKIAotb3V0X2ZyZWVfZmx1c2hfcnE6Ci0Ja2ZyZWUodW5pbml0X3EtPmZsdXNoX3JxKTsKLW91dF9jbGVhbnVwX3F1ZXVlOgotCWJsa19jbGVhbnVwX3F1ZXVlKHVuaW5pdF9xKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcTsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX2luaXRfcXVldWVfbm9kZSk7CiAKQEAgLTcxNyw5ICs3MDgsMTMgQEAKIAlpZiAoIXEpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGJsa19pbml0X3JsKCZxLT5yb290X3JsLCBxLCBHRlBfS0VSTkVMKSkKKwlxLT5mbHVzaF9ycSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxLT5mbHVzaF9ycSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlpZiAoYmxrX2luaXRfcmwoJnEtPnJvb3RfcmwsIHEsIEdGUF9LRVJORUwpKQorCQlnb3RvIGZhaWw7CisKIAlxLT5yZXF1ZXN0X2ZuCQk9IHJmbjsKIAlxLT5wcmVwX3JxX2ZuCQk9IE5VTEw7CiAJcS0+dW5wcmVwX3JxX2ZuCQk9IE5VTEw7CkBAIC03NDIsMTIgKzczNywxNiBAQAogCS8qIGluaXQgZWxldmF0b3IgKi8KIAlpZiAoZWxldmF0b3JfaW5pdChxLCBOVUxMKSkgewogCQltdXRleF91bmxvY2soJnEtPnN5c2ZzX2xvY2spOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBmYWlsOwogCX0KIAogCW11dGV4X3VubG9jaygmcS0+c3lzZnNfbG9jayk7CiAKIAlyZXR1cm4gcTsKKworZmFpbDoKKwlrZnJlZShxLT5mbHVzaF9ycSk7CisJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19pbml0X2FsbG9jYXRlZF9xdWV1ZSk7CiAKQEAgLTIzNTQsNyArMjM1Myw3IEBACiAJaWYgKCFyZXEtPmJpbykKIAkJcmV0dXJuIGZhbHNlOwogCi0JdHJhY2VfYmxvY2tfcnFfY29tcGxldGUocmVxLT5xLCByZXEpOworCXRyYWNlX2Jsb2NrX3JxX2NvbXBsZXRlKHJlcS0+cSwgcmVxLCBucl9ieXRlcyk7CiAKIAkvKgogCSAqIEZvciBmcyByZXF1ZXN0cywgcnEgaXMganVzdCBjYXJyaWVyIG9mIGluZGVwZW5kZW50IGJpbydzCmRpZmYgLS1naXQgYS9ibG9jay9ibGstZmx1c2guYyBiL2Jsb2NrL2Jsay1mbHVzaC5jCmluZGV4IGY1OThmNzkuLjQzZTZiNDcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1mbHVzaC5jCisrKyBiL2Jsb2NrL2Jsay1mbHVzaC5jCkBAIC0xNDAsMTQgKzE0MCwxNyBAQAogCWJsa19tcV9pbnNlcnRfcmVxdWVzdChycSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKIH0KIAotc3RhdGljIGJvb2wgYmxrX2ZsdXNoX3F1ZXVlX3JxKHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyBib29sIGJsa19mbHVzaF9xdWV1ZV9ycShzdHJ1Y3QgcmVxdWVzdCAqcnEsIGJvb2wgYWRkX2Zyb250KQogewogCWlmIChycS0+cS0+bXFfb3BzKSB7CiAJCUlOSVRfV09SSygmcnEtPm1xX2ZsdXNoX3dvcmssIG1xX2ZsdXNoX3J1bik7CiAJCWtibG9ja2Rfc2NoZWR1bGVfd29yayhycS0+cSwgJnJxLT5tcV9mbHVzaF93b3JrKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0gZWxzZSB7Ci0JCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZycS0+cS0+cXVldWVfaGVhZCk7CisJCWlmIChhZGRfZnJvbnQpCisJCQlsaXN0X2FkZCgmcnEtPnF1ZXVlbGlzdCwgJnJxLT5xLT5xdWV1ZV9oZWFkKTsKKwkJZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmcnEtPnF1ZXVlbGlzdCwgJnJxLT5xLT5xdWV1ZV9oZWFkKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogfQpAQCAtMTkzLDcgKzE5Niw3IEBACiAKIAljYXNlIFJFUV9GU0VRX0RBVEE6CiAJCWxpc3RfbW92ZV90YWlsKCZycS0+Zmx1c2gubGlzdCwgJnEtPmZsdXNoX2RhdGFfaW5fZmxpZ2h0KTsKLQkJcXVldWVkID0gYmxrX2ZsdXNoX3F1ZXVlX3JxKHJxKTsKKwkJcXVldWVkID0gYmxrX2ZsdXNoX3F1ZXVlX3JxKHJxLCB0cnVlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFUV9GU0VRX0RPTkU6CkBAIC0zMjYsNyArMzI5LDcgQEAKIAlxLT5mbHVzaF9ycS0+cnFfZGlzayA9IGZpcnN0X3JxLT5ycV9kaXNrOwogCXEtPmZsdXNoX3JxLT5lbmRfaW8gPSBmbHVzaF9lbmRfaW87CiAKLQlyZXR1cm4gYmxrX2ZsdXNoX3F1ZXVlX3JxKHEtPmZsdXNoX3JxKTsKKwlyZXR1cm4gYmxrX2ZsdXNoX3F1ZXVlX3JxKHEtPmZsdXNoX3JxLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZsdXNoX2RhdGFfZW5kX2lvKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvYy5jIGIvYmxvY2svYmxrLWlvYy5jCmluZGV4IDI0MmRmMDEuLjFhMjdmNDUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1pb2MuYworKysgYi9ibG9jay9ibGstaW9jLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiB1bmRlciBxdWV1ZV9sb2NrLiAgSWYgaXQncyBub3QgcG9pbnRpbmcgdG8gQGljcSBub3csIGl0IG5ldmVyCiAJICogd2lsbC4gIEhpbnQgYXNzaWdubWVudCBpdHNlbGYgY2FuIHJhY2Ugc2FmZWx5LgogCSAqLwotCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KGlvYy0+aWNxX2hpbnQpID09IGljcSkKKwlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvYy0+aWNxX2hpbnQpID09IGljcSkKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKGlvYy0+aWNxX2hpbnQsIE5VTEwpOwogCiAJaW9jX2V4aXRfaWNxKGljcSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9wb2xsLmMgYi9ibG9jay9ibGstaW9wb2xsLmMKaW5kZXggMTg1NWJmNS4uYzExZDI0ZSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWlvcG9sbC5jCisrKyBiL2Jsb2NrL2Jsay1pb3BvbGwuYwpAQCAtMTQsOSArMTQsNiBAQAogCiAjaW5jbHVkZSAiYmxrLmgiCiAKLWludCBibGtfaW9wb2xsX2VuYWJsZWQgPSAxOwotRVhQT1JUX1NZTUJPTChibGtfaW9wb2xsX2VuYWJsZWQpOwotCiBzdGF0aWMgdW5zaWduZWQgaW50IGJsa19pb3BvbGxfYnVkZ2V0IF9fcmVhZF9tb3N0bHkgPSAyNTY7CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbGlzdF9oZWFkLCBibGtfY3B1X2lvcG9sbCk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEtY3B1bWFwLmMgYi9ibG9jay9ibGstbXEtY3B1bWFwLmMKaW5kZXggZjg3MjEyNy4uMDk3OTIxMzIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS1jcHVtYXAuYworKysgYi9ibG9jay9ibGstbXEtY3B1bWFwLmMKQEAgLTksMTUgKzksNiBAQAogI2luY2x1ZGUgImJsay5oIgogI2luY2x1ZGUgImJsay1tcS5oIgogCi1zdGF0aWMgdm9pZCBzaG93X21hcCh1bnNpZ25lZCBpbnQgKm1hcCwgdW5zaWduZWQgaW50IG5yKQotewotCWludCBpOwotCi0JcHJfaW5mbygiYmxrLW1xOiBDUFUgLT4gcXVldWUgbWFwXG4iKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCi0JCXByX2luZm8oIiAgQ1BVJTJ1IC0+IFF1ZXVlICV1XG4iLCBpLCBtYXBbaV0pOwotfQotCiBzdGF0aWMgaW50IGNwdV90b19xdWV1ZV9pbmRleCh1bnNpZ25lZCBpbnQgbnJfY3B1cywgdW5zaWduZWQgaW50IG5yX3F1ZXVlcywKIAkJCSAgICAgIGNvbnN0IGludCBjcHUpCiB7CkBAIC04NSw3ICs3Niw2IEBACiAJCQltYXBbaV0gPSBtYXBbZmlyc3Rfc2libGluZ107CiAJfQogCi0Jc2hvd19tYXAobWFwLCBucl9jcHVzKTsKIAlmcmVlX2NwdW1hc2tfdmFyKGNwdXMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1xLXN5c2ZzLmMgYi9ibG9jay9ibGstbXEtc3lzZnMuYwppbmRleCBiOTFjZTc1Li5iMGJhMjY0IDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEtc3lzZnMuYworKysgYi9ibG9jay9ibGstbXEtc3lzZnMuYwpAQCAtMjQ0LDYgKzI0NCwzMiBAQAogCXJldHVybiBibGtfbXFfdGFnX3N5c2ZzX3Nob3coaGN0eC0+dGFncywgcGFnZSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGJsa19tcV9od19zeXNmc19jcHVzX3Nob3coc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIGNoYXIgKnBhZ2UpCit7CisJdW5zaWduZWQgaW50IGksIHF1ZXVlX251bSwgZmlyc3QgPSAxOworCXNzaXplX3QgcmV0ID0gMDsKKworCWJsa19tcV9kaXNhYmxlX2hvdHBsdWcoKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQlxdWV1ZV9udW0gPSBoY3R4LT5xdWV1ZS0+bXFfbWFwW2ldOworCQlpZiAocXVldWVfbnVtICE9IGhjdHgtPnF1ZXVlX251bSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmaXJzdCkKKwkJCXJldCArPSBzcHJpbnRmKHJldCArIHBhZ2UsICIldSIsIGkpOworCQllbHNlCisJCQlyZXQgKz0gc3ByaW50ZihyZXQgKyBwYWdlLCAiLCAldSIsIGkpOworCisJCWZpcnN0ID0gMDsKKwl9CisKKwlibGtfbXFfZW5hYmxlX2hvdHBsdWcoKTsKKworCXJldCArPSBzcHJpbnRmKHJldCArIHBhZ2UsICJcbiIpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYmxrX21xX2N0eF9zeXNmc19lbnRyeSBibGtfbXFfc3lzZnNfZGlzcGF0Y2hlZCA9IHsKIAkuYXR0ciA9IHsubmFtZSA9ICJkaXNwYXRjaGVkIiwgLm1vZGUgPSBTX0lSVUdPIH0sCiAJLnNob3cgPSBibGtfbXFfc3lzZnNfZGlzcGF0Y2hlZF9zaG93LApAQCAtMjk0LDYgKzMyMCwxMCBAQAogCS5hdHRyID0gey5uYW1lID0gInRhZ3MiLCAubW9kZSA9IFNfSVJVR08gfSwKIAkuc2hvdyA9IGJsa19tcV9od19zeXNmc190YWdzX3Nob3csCiB9Oworc3RhdGljIHN0cnVjdCBibGtfbXFfaHdfY3R4X3N5c2ZzX2VudHJ5IGJsa19tcV9od19zeXNmc19jcHVzID0geworCS5hdHRyID0gey5uYW1lID0gImNwdV9saXN0IiwgLm1vZGUgPSBTX0lSVUdPIH0sCisJLnNob3cgPSBibGtfbXFfaHdfc3lzZnNfY3B1c19zaG93LAorfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlZmF1bHRfaHdfY3R4X2F0dHJzW10gPSB7CiAJJmJsa19tcV9od19zeXNmc19xdWV1ZWQuYXR0ciwKQEAgLTMwMiw2ICszMzIsNyBAQAogCSZibGtfbXFfaHdfc3lzZnNfcGVuZGluZy5hdHRyLAogCSZibGtfbXFfaHdfc3lzZnNfaXBpLmF0dHIsCiAJJmJsa19tcV9od19zeXNmc190YWdzLmF0dHIsCisJJmJsa19tcV9od19zeXNmc19jcHVzLmF0dHIsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5jIGIvYmxvY2svYmxrLW1xLmMKaW5kZXggODgzZjcyMC4uYjFiY2M2MSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmMKKysrIGIvYmxvY2svYmxrLW1xLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogCQlycS0+Y3NkLmZ1bmMgPSBfX2Jsa19tcV9jb21wbGV0ZV9yZXF1ZXN0X3JlbW90ZTsKIAkJcnEtPmNzZC5pbmZvID0gcnE7CiAJCXJxLT5jc2QuZmxhZ3MgPSAwOwotCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjdHgtPmNwdSwgJnJxLT5jc2QsIDApOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoY3R4LT5jcHUsICZycS0+Y3NkKTsKIAl9IGVsc2UgewogCQlycS0+cS0+c29mdGlycV9kb25lX2ZuKHJxKTsKIAl9CkBAIC01MTQsNyArNTE0LDcgQEAKIAlMSVNUX0hFQUQocnFfbGlzdCk7CiAJaW50IGJpdCwgcXVldWVkOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KEJMS19NUV9TX1NUT1BQRUQsICZoY3R4LT5mbGFncykpKQorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+c3RhdGUpKSkKIAkJcmV0dXJuOwogCiAJaGN0eC0+cnVuKys7CkBAIC02MDMsNyArNjAzLDcgQEAKIAogdm9pZCBibGtfbXFfcnVuX2h3X3F1ZXVlKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBib29sIGFzeW5jKQogewotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+ZmxhZ3MpKSkKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPnN0YXRlKSkpCiAJCXJldHVybjsKIAogCWlmICghYXN5bmMpCkBAIC02MjMsNyArNjIzLDcgQEAKIAlxdWV1ZV9mb3JfZWFjaF9od19jdHgocSwgaGN0eCwgaSkgewogCQlpZiAoKCFibGtfbXFfaGN0eF9oYXNfcGVuZGluZyhoY3R4KSAmJgogCQkgICAgbGlzdF9lbXB0eV9jYXJlZnVsKCZoY3R4LT5kaXNwYXRjaCkpIHx8Ci0JCSAgICB0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+ZmxhZ3MpKQorCQkgICAgdGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPnN0YXRlKSkKIAkJCWNvbnRpbnVlOwogCiAJCWJsa19tcV9ydW5faHdfcXVldWUoaGN0eCwgYXN5bmMpOwpAQCAtOTk0LDggKzk5NCw0NiBAQAogCWJsa19tcV9wdXRfY3R4KGN0eCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJsa19tcV9pbml0X2h3X2NvbW1hbmRzKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAotCQkJCSAgICB2b2lkICgqaW5pdCkodm9pZCAqLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLAorc3RhdGljIGludCBibGtfbXFfaW5pdF9od19jb21tYW5kcyhzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKKwkJCQkgICBpbnQgKCppbml0KSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCisJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCisJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBoY3R4LT5xdWV1ZV9kZXB0aDsgaSsrKSB7CisJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGhjdHgtPnJxc1tpXTsKKworCQlyZXQgPSBpbml0KGRhdGEsIGhjdHgsIHJxLCBpKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCSBpbnQgKCppbml0KSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCisJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCisJCQkgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCXF1ZXVlX2Zvcl9lYWNoX2h3X2N0eChxLCBoY3R4LCBpKSB7CisJCXJldCA9IGJsa19tcV9pbml0X2h3X2NvbW1hbmRzKGhjdHgsIGluaXQsIGRhdGEpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYmxrX21xX2luaXRfY29tbWFuZHMpOworCitzdGF0aWMgdm9pZCBibGtfbXFfZnJlZV9od19jb21tYW5kcyhzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKKwkJCQkgICAgdm9pZCAoKmZyZWUpKHZvaWQgKiwgc3RydWN0IGJsa19tcV9od19jdHggKiwKIAkJCQkJc3RydWN0IHJlcXVlc3QgKiwgdW5zaWduZWQgaW50KSwKIAkJCQkgICAgdm9pZCAqZGF0YSkKIHsKQEAgLTEwMDQsMTIgKzEwNDIsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaGN0eC0+cXVldWVfZGVwdGg7IGkrKykgewogCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBoY3R4LT5ycXNbaV07CiAKLQkJaW5pdChkYXRhLCBoY3R4LCBycSwgaSk7CisJCWZyZWUoZGF0YSwgaGN0eCwgcnEsIGkpOwogCX0KIH0KIAotdm9pZCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKLQkJCSAgdm9pZCAoKmluaXQpKHZvaWQgKiwgc3RydWN0IGJsa19tcV9od19jdHggKiwKK3ZvaWQgYmxrX21xX2ZyZWVfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkgIHZvaWQgKCpmcmVlKSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCiAJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCiAJCQkgIHZvaWQgKmRhdGEpCiB7CkBAIC0xMDE3LDkgKzEwNTUsOSBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJcXVldWVfZm9yX2VhY2hfaHdfY3R4KHEsIGhjdHgsIGkpCi0JCWJsa19tcV9pbml0X2h3X2NvbW1hbmRzKGhjdHgsIGluaXQsIGRhdGEpOworCQlibGtfbXFfZnJlZV9od19jb21tYW5kcyhoY3R4LCBmcmVlLCBkYXRhKTsKIH0KLUVYUE9SVF9TWU1CT0woYmxrX21xX2luaXRfY29tbWFuZHMpOworRVhQT1JUX1NZTUJPTChibGtfbXFfZnJlZV9jb21tYW5kcyk7CiAKIHN0YXRpYyB2b2lkIGJsa19tcV9mcmVlX3JxX21hcChzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCkKIHsKQEAgLTE0MzAsNiArMTQ2OCwxNiBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKK3ZvaWQgYmxrX21xX2Rpc2FibGVfaG90cGx1Zyh2b2lkKQoreworCW11dGV4X2xvY2soJmFsbF9xX211dGV4KTsKK30KKwordm9pZCBibGtfbXFfZW5hYmxlX2hvdHBsdWcodm9pZCkKK3sKKwltdXRleF91bmxvY2soJmFsbF9xX211dGV4KTsKK30KKwogc3RhdGljIGludCBfX2luaXQgYmxrX21xX2luaXQodm9pZCkKIHsKIAlibGtfbXFfY3B1X2luaXQoKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5oIGIvYmxvY2svYmxrLW1xLmgKaW5kZXggNzJiZWJhMS4uZWJiZTZiYSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmgKKysrIGIvYmxvY2svYmxrLW1xLmgKQEAgLTM5LDYgKzM5LDggQEAKIHZvaWQgYmxrX21xX3JlZ2lzdGVyX2NwdV9ub3RpZmllcihzdHJ1Y3QgYmxrX21xX2NwdV9ub3RpZmllciAqbm90aWZpZXIpOwogdm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoc3RydWN0IGJsa19tcV9jcHVfbm90aWZpZXIgKm5vdGlmaWVyKTsKIHZvaWQgYmxrX21xX2NwdV9pbml0KHZvaWQpOwordm9pZCBibGtfbXFfZW5hYmxlX2hvdHBsdWcodm9pZCk7Cit2b2lkIGJsa19tcV9kaXNhYmxlX2hvdHBsdWcodm9pZCk7CiAKIC8qCiAgKiBDUFUgLT4gcXVldWUgbWFwcGluZ3MKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMgYi9ibG9jay9ibGstc29mdGlycS5jCmluZGV4IDU3NzkwYzEuLmViZDZiNmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKKysrIGIvYmxvY2svYmxrLXNvZnRpcnEuYwpAQCAtMzAsOCArMzAsOCBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmbG9jYWxfbGlzdCkpIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJxOwogCi0JCXJxID0gbGlzdF9lbnRyeShsb2NhbF9saXN0Lm5leHQsIHN0cnVjdCByZXF1ZXN0LCBjc2QubGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJxLT5jc2QubGlzdCk7CisJCXJxID0gbGlzdF9lbnRyeShsb2NhbF9saXN0Lm5leHQsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZycS0+cXVldWVsaXN0KTsKIAkJcnEtPnEtPnNvZnRpcnFfZG9uZV9mbihycSk7CiAJfQogfQpAQCAtNDUsOSArNDUsMTQgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlsaXN0ID0gdGhpc19jcHVfcHRyKCZibGtfY3B1X2RvbmUpOwotCWxpc3RfYWRkX3RhaWwoJnJxLT5jc2QubGlzdCwgbGlzdCk7CisJLyoKKwkgKiBXZSByZXVzZSBxdWV1ZWxpc3QgZm9yIGEgbGlzdCBvZiByZXF1ZXN0cyB0byBwcm9jZXNzLiBTaW5jZSB0aGUKKwkgKiBxdWV1ZWxpc3QgaXMgdXNlZCBieSB0aGUgYmxvY2sgbGF5ZXIgb25seSBmb3IgcmVxdWVzdHMgd2FpdGluZyB0byBiZQorCSAqIHN1Ym1pdHRlZCB0byB0aGUgZGV2aWNlIGl0IGlzIHVudXNlZCBub3cuCisJICovCisJbGlzdF9hZGRfdGFpbCgmcnEtPnF1ZXVlbGlzdCwgbGlzdCk7CiAKLQlpZiAobGlzdC0+bmV4dCA9PSAmcnEtPmNzZC5saXN0KQorCWlmIChsaXN0LT5uZXh0ID09ICZycS0+cXVldWVsaXN0KQogCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTY1LDcgKzcwLDcgQEAKIAkJZGF0YS0+aW5mbyA9IHJxOwogCQlkYXRhLT5mbGFncyA9IDA7CiAKLQkJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBkYXRhLCAwKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGNwdSwgZGF0YSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTM2LDcgKzE0MSw3IEBACiAJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiBkb19sb2NhbDoKIAkJbGlzdCA9IHRoaXNfY3B1X3B0cigmYmxrX2NwdV9kb25lKTsKLQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5jc2QubGlzdCwgbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWVsaXN0LCBsaXN0KTsKIAogCQkvKgogCQkgKiBpZiB0aGUgbGlzdCBvbmx5IGNvbnRhaW5zIG91ciBqdXN0IGFkZGVkIHJlcXVlc3QsCkBAIC0xNDQsNyArMTQ5LDcgQEAKIAkJICogZW50cmllcyB0aGVyZSwgc29tZW9uZSBhbHJlYWR5IHJhaXNlZCB0aGUgaXJxIGJ1dCBpdAogCQkgKiBoYXNuJ3QgcnVuIHlldC4KIAkJICovCi0JCWlmIChsaXN0LT5uZXh0ID09ICZyZXEtPmNzZC5saXN0KQorCQlpZiAobGlzdC0+bmV4dCA9PSAmcmVxLT5xdWV1ZWxpc3QpCiAJCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKIAl9IGVsc2UgaWYgKHJhaXNlX2Jsa19pcnEoY2NwdSwgcmVxKSkKIAkJZ290byBkb19sb2NhbDsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDc0NDgzM2IuLjU4NzNlNGEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMjM2NywxMCArMjM2NywxMCBAQAogCSAqIHJlcG9zaXRpb24gaW4gZmlmbyBpZiBuZXh0IGlzIG9sZGVyIHRoYW4gcnEKIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJnJxLT5xdWV1ZWxpc3QpICYmICFsaXN0X2VtcHR5KCZuZXh0LT5xdWV1ZWxpc3QpICYmCi0JICAgIHRpbWVfYmVmb3JlKHJxX2ZpZm9fdGltZShuZXh0KSwgcnFfZmlmb190aW1lKHJxKSkgJiYKKwkgICAgdGltZV9iZWZvcmUobmV4dC0+Zmlmb190aW1lLCBycS0+Zmlmb190aW1lKSAmJgogCSAgICBjZnFxID09IFJRX0NGUVEobmV4dCkpIHsKIAkJbGlzdF9tb3ZlKCZycS0+cXVldWVsaXN0LCAmbmV4dC0+cXVldWVsaXN0KTsKLQkJcnFfc2V0X2ZpZm9fdGltZShycSwgcnFfZmlmb190aW1lKG5leHQpKTsKKwkJcnEtPmZpZm9fdGltZSA9IG5leHQtPmZpZm9fdGltZTsKIAl9CiAKIAlpZiAoY2ZxcS0+bmV4dF9ycSA9PSBuZXh0KQpAQCAtMjgxNCw3ICsyODE0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlycSA9IHJxX2VudHJ5X2ZpZm8oY2ZxcS0+Zmlmby5uZXh0KTsKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcnFfZmlmb190aW1lKHJxKSkpCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJxLT5maWZvX3RpbWUpKQogCQlycSA9IE5VTEw7CiAKIAljZnFfbG9nX2NmcXEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgImZpZm89JXAiLCBycSk7CkBAIC0zOTI3LDcgKzM5MjcsNyBAQAogCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiaW5zZXJ0X3JlcXVlc3QiKTsKIAljZnFfaW5pdF9wcmlvX2RhdGEoY2ZxcSwgUlFfQ0lDKHJxKSk7CiAKLQlycV9zZXRfZmlmb190aW1lKHJxLCBqaWZmaWVzICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlW3JxX2lzX3N5bmMocnEpXSk7CisJcnEtPmZpZm9fdGltZSA9IGppZmZpZXMgKyBjZnFkLT5jZnFfZmlmb19leHBpcmVbcnFfaXNfc3luYyhycSldOwogCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZjZnFxLT5maWZvKTsKIAljZnFfYWRkX3JxX3JiKHJxKTsKIAljZnFnX3N0YXRzX3VwZGF0ZV9pb19hZGQoUlFfQ0ZRRyhycSksIGNmcWQtPnNlcnZpbmdfZ3JvdXAsCmRpZmYgLS1naXQgYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggOWVmNjY0MC4uYTc1M2RmMiAxMDA2NDQKLS0tIGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJLyoKIAkgKiBzZXQgZXhwaXJlIHRpbWUgYW5kIGFkZCB0byBmaWZvIGxpc3QKIAkgKi8KLQlycV9zZXRfZmlmb190aW1lKHJxLCBqaWZmaWVzICsgZGQtPmZpZm9fZXhwaXJlW2RhdGFfZGlyXSk7CisJcnEtPmZpZm9fdGltZSA9IGppZmZpZXMgKyBkZC0+Zmlmb19leHBpcmVbZGF0YV9kaXJdOwogCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZkZC0+Zmlmb19saXN0W2RhdGFfZGlyXSk7CiB9CiAKQEAgLTE3NCw5ICsxNzQsOSBAQAogCSAqIGFuZCBtb3ZlIGludG8gbmV4dCBwb3NpdGlvbiAobmV4dCB3aWxsIGJlIGRlbGV0ZWQpIGluIGZpZm8KIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJnJlcS0+cXVldWVsaXN0KSAmJiAhbGlzdF9lbXB0eSgmbmV4dC0+cXVldWVsaXN0KSkgewotCQlpZiAodGltZV9iZWZvcmUocnFfZmlmb190aW1lKG5leHQpLCBycV9maWZvX3RpbWUocmVxKSkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKG5leHQtPmZpZm9fdGltZSwgcmVxLT5maWZvX3RpbWUpKSB7CiAJCQlsaXN0X21vdmUoJnJlcS0+cXVldWVsaXN0LCAmbmV4dC0+cXVldWVsaXN0KTsKLQkJCXJxX3NldF9maWZvX3RpbWUocmVxLCBycV9maWZvX3RpbWUobmV4dCkpOworCQkJcmVxLT5maWZvX3RpbWUgPSBuZXh0LT5maWZvX3RpbWU7CiAJCX0KIAl9CiAKQEAgLTIzMCw3ICsyMzAsNyBAQAogCS8qCiAJICogcnEgaXMgZXhwaXJlZCEKIAkgKi8KLQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBycV9maWZvX3RpbWUocnEpKSkKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBycS0+Zmlmb190aW1lKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2Jsb2NrL3BhcnRpdGlvbnMvYXRhcmkuaCBiL2Jsb2NrL3BhcnRpdGlvbnMvYXRhcmkuaAppbmRleCBmZTJkMzJhLi5mMmVjNDNiIDEwMDY0NAotLS0gYS9ibG9jay9wYXJ0aXRpb25zL2F0YXJpLmgKKysrIGIvYmxvY2svcGFydGl0aW9ucy9hdGFyaS5oCkBAIC0xMSw2ICsxMSw4IEBACiAgKiBieSBHdWVudGhlciBLZWxsZXRlciAoZ3VlbnRoZXJAcG9vbC5pbmZvcm1hdGlrLnJ3dGgtYWFjaGVuLmRlKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiBzdHJ1Y3QgcGFydGl0aW9uX2luZm8KIHsKICAgdTggZmxnOwkJCS8qIGJpdCAwOiBhY3RpdmU7IGJpdCA3OiBib290YWJsZSAqLwpAQCAtMjksNiArMzEsNiBAQAogICB1MzIgYnNsX3N0OwkJCS8qIHN0YXJ0IG9mIGJhZCBzZWN0b3IgbGlzdCAqLwogICB1MzIgYnNsX2NudDsJCQkvKiBsZW5ndGggb2YgYmFkIHNlY3RvciBsaXN0ICovCiAgIHUxNiBjaGVja3N1bTsJCQkvKiBjaGVja3N1bSBmb3IgYm9vdGFibGUgZGlza3MgKi8KLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogaW50IGF0YXJpX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL3BhcnRpdGlvbnMvZWZpLmggYi9ibG9jay9wYXJ0aXRpb25zL2VmaS5oCmluZGV4IDRlZmNhZmIuLmFiZDBiMTkyIDEwMDY0NAotLS0gYS9ibG9jay9wYXJ0aXRpb25zL2VmaS5oCisrKyBiL2Jsb2NrL3BhcnRpdGlvbnMvZWZpLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKICNkZWZpbmUgTVNET1NfTUJSX1NJR05BVFVSRSAweGFhNTUKICNkZWZpbmUgRUZJX1BNQlJfT1NUWVBFX0VGSSAweEVGCkBAIC04NywxMyArODgsMTMgQEAKIAkgKgogCSAqIHVpbnQ4X3QJCXJlc2VydmVkMlsgQmxvY2tTaXplIC0gOTIgXTsKIAkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGdwdF9oZWFkZXI7Cit9IF9fcGFja2VkIGdwdF9oZWFkZXI7CiAKIHR5cGVkZWYgc3RydWN0IF9ncHRfZW50cnlfYXR0cmlidXRlcyB7CiAJdTY0IHJlcXVpcmVkX3RvX2Z1bmN0aW9uOjE7CiAJdTY0IHJlc2VydmVkOjQ3OwogICAgICAgICB1NjQgdHlwZV9ndWlkX3NwZWNpZmljOjE2OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZ3B0X2VudHJ5X2F0dHJpYnV0ZXM7Cit9IF9fcGFja2VkIGdwdF9lbnRyeV9hdHRyaWJ1dGVzOwogCiB0eXBlZGVmIHN0cnVjdCBfZ3B0X2VudHJ5IHsKIAllZmlfZ3VpZF90IHBhcnRpdGlvbl90eXBlX2d1aWQ7CkBAIC0xMDIsNyArMTAzLDcgQEAKIAlfX2xlNjQgZW5kaW5nX2xiYTsKIAlncHRfZW50cnlfYXR0cmlidXRlcyBhdHRyaWJ1dGVzOwogCWVmaV9jaGFyMTZfdCBwYXJ0aXRpb25fbmFtZVs3MiAvIHNpemVvZiAoZWZpX2NoYXIxNl90KV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBncHRfZW50cnk7Cit9IF9fcGFja2VkIGdwdF9lbnRyeTsKIAogdHlwZWRlZiBzdHJ1Y3QgX2dwdF9tYnJfcmVjb3JkIHsKIAl1OAlib290X2luZGljYXRvcjsgLyogdW51c2VkIGJ5IEVGSSwgc2V0IHRvIDB4ODAgZm9yIGJvb3RhYmxlICovCkBAIC0xMjQsNyArMTI1LDcgQEAKIAlfX2xlMTYgdW5rbm93bjsKIAlncHRfbWJyX3JlY29yZCBwYXJ0aXRpb25fcmVjb3JkWzRdOwogCV9fbGUxNiBzaWduYXR1cmU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsZWdhY3lfbWJyOworfSBfX3BhY2tlZCBsZWdhY3lfbWJyOwogCiAvKiBGdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZWZpX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL3BhcnRpdGlvbnMva2FybWEuYyBiL2Jsb2NrL3BhcnRpdGlvbnMva2FybWEuYwppbmRleCAwZWExOTMxLi45NzIxZmE1IDEwMDY0NAotLS0gYS9ibG9jay9wYXJ0aXRpb25zL2thcm1hLmMKKysrIGIvYmxvY2svcGFydGl0aW9ucy9rYXJtYS5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSAiY2hlY2suaCIKICNpbmNsdWRlICJrYXJtYS5oIgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKIGludCBrYXJtYV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSkKIHsKQEAgLTI2LDcgKzI3LDcgQEAKIAkJfSBkX3BhcnRpdGlvbnNbMl07CiAJCXU4IGRfYmxhbmtbMjA4XTsKIAkJX19sZTE2IGRfbWFnaWM7Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqbGFiZWw7CisJfSBfX3BhY2tlZCAqbGFiZWw7CiAJc3RydWN0IGRfcGFydGl0aW9uICpwOwogCiAJZGF0YSA9IHJlYWRfcGFydF9zZWN0b3Ioc3RhdGUsIDAsICZzZWN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCBiMzEzOGZiLi4wYTBhOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC01Miw2ICs1Miw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zcGkvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3NwbWkvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL2hzaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcHBzL0tjb25maWciCkBAIC0xNzAsNCArMTcyLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3Bvd2VyY2FwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tY2IvS2NvbmZpZyIKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggOGUzYjhiMC4uZTNjZWQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC02Niw2ICs2Niw3IEBACiBvYmotJChDT05GSUdfVEFSR0VUX0NPUkUpCSs9IHRhcmdldC8KIG9iai0kKENPTkZJR19NVEQpCQkrPSBtdGQvCiBvYmotJChDT05GSUdfU1BJKQkJKz0gc3BpLworb2JqLSQoQ09ORklHX1NQTUkpCQkrPSBzcG1pLwogb2JqLXkJCQkJKz0gaHNpLwogb2JqLXkJCQkJKz0gbmV0Lwogb2JqLSQoQ09ORklHX0FUTSkJCSs9IGF0bS8KQEAgLTE1NSwzICsxNTYsNCBAQAogb2JqLSQoQ09ORklHX05UQikJCSs9IG50Yi8KIG9iai0kKENPTkZJR19GTUMpCQkrPSBmbWMvCiBvYmotJChDT05GSUdfUE9XRVJDQVApCQkrPSBwb3dlcmNhcC8KK29iai0kKENPTkZJR19NQ0IpCQkrPSBtY2IvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbnVtYS5jIGIvZHJpdmVycy9hY3BpL251bWEuYwppbmRleCA5ZTY4MTZlLi4yNGI1NDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbnVtYS5jCisrKyBiL2RyaXZlcnMvYWNwaS9udW1hLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlyZXR1cm4gbm9kZV90b19weG1fbWFwW25vZGVdOwogfQogCi12b2lkIF9fYWNwaV9tYXBfcHhtX3RvX25vZGUoaW50IHB4bSwgaW50IG5vZGUpCitzdGF0aWMgdm9pZCBfX2FjcGlfbWFwX3B4bV90b19ub2RlKGludCBweG0sIGludCBub2RlKQogewogCWlmIChweG1fdG9fbm9kZV9tYXBbcHhtXSA9PSBOVU1BX05PX05PREUgfHwgbm9kZSA8IHB4bV90b19ub2RlX21hcFtweG1dKQogCQlweG1fdG9fbm9kZV9tYXBbcHhtXSA9IG5vZGU7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKQordm9pZCBfX2luaXQgX193ZWFrCiBhY3BpX251bWFfeDJhcGljX2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfc3JhdF94MmFwaWNfY3B1X2FmZmluaXR5ICpwYSkKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWApAQCAtMzE0LDcgKzMxNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaCkKK3N0YXRpYyBpbnQgYWNwaV9nZXRfcHhtKGFjcGlfaGFuZGxlIGgpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHB4bTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC0zMzEsMTQgKzMzMSwxNCBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgKmhhbmRsZSkKK2ludCBhY3BpX2dldF9ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlpbnQgcHhtLCBub2RlID0gTlVNQV9OT19OT0RFOworCWludCBweG07CiAKIAlweG0gPSBhY3BpX2dldF9weG0oaGFuZGxlKTsKLQlpZiAocHhtID49IDAgJiYgcHhtIDwgTUFYX1BYTV9ET01BSU5TKQotCQlub2RlID0gYWNwaV9tYXBfcHhtX3RvX25vZGUocHhtKTsKKwlpZiAocHhtIDwgMCB8fCBweG0gPj0gTUFYX1BYTV9ET01BSU5TKQorCQlyZXR1cm4gTlVNQV9OT19OT0RFOwogCi0JcmV0dXJuIG5vZGU7CisJcmV0dXJuIGFjcGlfbWFwX3B4bV90b19ub2RlKHB4bSk7CiB9CiBFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggODY4NDI5YS4uMjBlMDNhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC0xMSwxMyArMTEsMTMgQEAKIAkgIHRvIHVwZGF0ZSB0aGUgUEFUQV9QTEFURk9STSBlbnRyeS4KIAogbWVudWNvbmZpZyBBVEEKLQl0cmlzdGF0ZSAiU2VyaWFsIEFUQSBhbmQgUGFyYWxsZWwgQVRBIGRyaXZlcnMiCisJdHJpc3RhdGUgIlNlcmlhbCBBVEEgYW5kIFBhcmFsbGVsIEFUQSBkcml2ZXJzIChsaWJhdGEpIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJZGVwZW5kcyBvbiBCTE9DSwogCWRlcGVuZHMgb24gIShNMzJSIHx8IE02OEsgfHwgUzM5MCkgfHwgQlJPS0VOCiAJc2VsZWN0IFNDU0kKIAktLS1oZWxwLS0tCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgYSBBVEEgaGFyZCBkaXNrLCBBVEEgdGFwZSBkcml2ZSwgQVRBIENELVJPTSBvcgorCSAgSWYgeW91IHdhbnQgdG8gdXNlIGFuIEFUQSBoYXJkIGRpc2ssIEFUQSB0YXBlIGRyaXZlLCBBVEEgQ0QtUk9NIG9yCiAJICBhbnkgb3RoZXIgQVRBIGRldmljZSB1bmRlciBMaW51eCwgc2F5IFkgYW5kIG1ha2Ugc3VyZSB0aGF0IHlvdSBrbm93CiAJICB0aGUgbmFtZSBvZiB5b3VyIEFUQSBob3N0IGFkYXB0ZXIgKHRoZSBjYXJkIGluc2lkZSB5b3VyIGNvbXB1dGVyCiAJICB0aGF0ICJzcGVha3MiIHRoZSBBVEEgcHJvdG9jb2wsIGFsc28gY2FsbGVkIEFUQSBjb250cm9sbGVyKSwKQEAgLTYwLDcgKzYwLDcgQEAKIAogY29uZmlnIFNBVEFfWlBPREQKIAlib29sICJTQVRBIFplcm8gUG93ZXIgT3B0aWNhbCBEaXNjIERyaXZlIChaUE9ERCkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQV9BQ1BJCisJZGVwZW5kcyBvbiBBVEFfQUNQSSAmJiBQTV9SVU5USU1FCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBTQVRBIFplcm8gUG93ZXIgT3B0aWNhbCBEaXNjCkBAIC05NywxNSArOTcsNDggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEFIQ0lfREE4NTAKKwl0cmlzdGF0ZSAiRGFWaW5jaSBEQTg1MCBBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9EQTg1MAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIERhVmluY2kgREE4NTAgU29DJ3MKKwkgIG9uYm9hcmQgQUhDSSBTQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUhDSV9TVAorCXRyaXN0YXRlICJTVCBBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1RJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBTVCBBSENJIFNBVEEgY29udHJvbGxlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEFIQ0lfSU1YCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YIEFIQ0kgU0FUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0FUQV9BSENJX1BMQVRGT1JNICYmIE1GRF9TWVNDT04KKwlkZXBlbmRzIG9uIE1GRF9TWVNDT04KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgaS5NWCBTb0MncwogCSAgb25ib2FyZCBBSENJIFNBVEEuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBBSENJX1NVTlhJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBzdW54aSBBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgc3VueGkgU29DJ3MKKwkgIG9uYm9hcmQgQUhDSSBTQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUhDSV9YR0VORQorCXRyaXN0YXRlICJBUE0gWC1HZW5lIDYuMEdicHMgQUhDSSBTQVRBIGhvc3QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJNNjQgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IFBIWV9YR0VORQorCWhlbHAKKwkgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBBUE0gWC1HZW5lIFNvQyBTQVRBIGhvc3QgY29udHJvbGxlci4KKwogY29uZmlnIFNBVEFfRlNMCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSAzLjBHYnBzIFNBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZTTF9TT0MKQEAgLTIzOSw2ICsyNzIsNyBAQAogCiBjb25maWcgU0FUQV9ISUdIQkFOSwogCXRyaXN0YXRlICJDYWx4ZWRhIEhpZ2hiYW5rIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfSElHSEJBTksgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQ2FseGVkYSBIaWdoYmFuayBTb0MncwogCSAgb25ib2FyZCBTQVRBLgpAQCAtMjQ3LDYgKzI4MSw4IEBACiAKIGNvbmZpZyBTQVRBX01WCiAJdHJpc3RhdGUgIk1hcnZlbGwgU0FUQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJIHx8IEFSQ0hfRE9WRSB8fCBBUkNIX0tJUktXT09EIHx8IEFSQ0hfTVY3OFhYMCB8fCBcCisJCSAgIEFSQ0hfTVZFQlUgfHwgQVJDSF9PUklPTjVYIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBHRU5FUklDX1BIWQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgU2VyaWFsIEFUQSBmYW1pbHkuCkBAIC0yNzMsNiArMzA5LDcgQEAKIAogY29uZmlnIFNBVEFfUkNBUgogCXRyaXN0YXRlICJSZW5lc2FzIFItQ2FyIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU0hNT0JJTEUgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBSZW5lc2FzIFItQ2FyIFNlcmlhbCBBVEEuCiAKQEAgLTM1Miw2ICszODksNyBAQAogCiBjb25maWcgUEFUQV9BUkFTQU5fQ0YKIAl0cmlzdGF0ZSAiQVJBU0FOIENvbXBhY3RGbGFzaCBQQVRBIENvbnRyb2xsZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1BFQVIxM1hYIHx8IENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gRE1BREVWSUNFUwogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscApAQCAtNDAzLDcgKzQ0MSw3IEBACiAKIGNvbmZpZyBQQVRBX0NTNTUyMAogCXRyaXN0YXRlICJDUzU1MTAvNTUyMCBQQVRBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDeXJpeCA1NTEwLzU1MjAKIAkgIGNvbXBhbmlvbiBjaGlwIHVzZWQgd2l0aCB0aGUgTWVkaWFHWC9HZW9kZSBwcm9jZXNzb3IgZmFtaWx5LgpAQCAtNDEyLDcgKzQ1MCw3IEBACiAKIGNvbmZpZyBQQVRBX0NTNTUzMAogCXRyaXN0YXRlICJDUzU1MzAgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBDT01QSUxFX1RFU1QpCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQ3lyaXgvTmF0U2VtaS9BTUQgQ1M1NTMwCiAJICBjb21wYW5pb24gY2hpcCB1c2VkIHdpdGggdGhlIE1lZGlhR1gvR2VvZGUgcHJvY2Vzc29yIGZhbWlseS4KQEAgLTQyMSw3ICs0NTksNyBAQAogCiBjb25maWcgUEFUQV9DUzU1MzUKIAl0cmlzdGF0ZSAiQ1M1NTM1IFBBVEEgc3VwcG9ydCAoRXhwZXJpbWVudGFsKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgIVg4Nl82NAorCWRlcGVuZHMgb24gUENJICYmIFg4Nl8zMgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE5hdFNlbWkvQU1EIENTNTUzNQogCSAgY29tcGFuaW9uIGNoaXAgdXNlZCB3aXRoIHRoZSBHZW9kZSBwcm9jZXNzb3IgZmFtaWx5LgpAQCAtNDMwLDcgKzQ2OCw3IEBACiAKIGNvbmZpZyBQQVRBX0NTNTUzNgogCXRyaXN0YXRlICJDUzU1MzYgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBNSVBTIHx8IENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBTUQgQ1M1NTM2CiAJICBjb21wYW5pb24gY2hpcCB1c2VkIHdpdGggdGhlIEdlb2RlIExYIHByb2Nlc3NvciBmYW1pbHkuCkBAIC02NjYsNyArNzA0LDcgQEAKIAogY29uZmlnIFBBVEFfU0MxMjAwCiAJdHJpc3RhdGUgIlNDMTIwMCBQQVRBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBOYXRTZW1pL0FNRCBTQzEyMDAgU29DCiAJICBjb21wYW5pb24gY2hpcCB1c2VkIHdpdGggdGhlIEdlb2RlIHByb2Nlc3NvciBmYW1pbHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCmluZGV4IDQ2NTE4YzYuLjQ0YzgwMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCkBAIC00LDEzICs0LDE3IEBACiAjIG5vbi1TRkYgaW50ZXJmYWNlCiBvYmotJChDT05GSUdfU0FUQV9BSENJKQkJKz0gYWhjaS5vIGxpYmFoY2kubwogb2JqLSQoQ09ORklHX1NBVEFfQUNBUkRfQUhDSSkJKz0gYWNhcmQtYWhjaS5vIGxpYmFoY2kubwotb2JqLSQoQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STSkgKz0gYWhjaV9wbGF0Zm9ybS5vIGxpYmFoY2kubworb2JqLSQoQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STSkgKz0gYWhjaV9wbGF0Zm9ybS5vIGxpYmFoY2kubyBsaWJhaGNpX3BsYXRmb3JtLm8KIG9iai0kKENPTkZJR19TQVRBX0ZTTCkJCSs9IHNhdGFfZnNsLm8KIG9iai0kKENPTkZJR19TQVRBX0lOSUMxNjJYKQkrPSBzYXRhX2luaWMxNjJ4Lm8KIG9iai0kKENPTkZJR19TQVRBX1NJTDI0KQkrPSBzYXRhX3NpbDI0Lm8KIG9iai0kKENPTkZJR19TQVRBX0RXQykJCSs9IHNhdGFfZHdjXzQ2MGV4Lm8KIG9iai0kKENPTkZJR19TQVRBX0hJR0hCQU5LKQkrPSBzYXRhX2hpZ2hiYW5rLm8gbGliYWhjaS5vCi1vYmotJChDT05GSUdfQUhDSV9JTVgpCQkrPSBhaGNpX2lteC5vCitvYmotJChDT05GSUdfQUhDSV9EQTg1MCkJKz0gYWhjaV9kYTg1MC5vIGxpYmFoY2kubyBsaWJhaGNpX3BsYXRmb3JtLm8KK29iai0kKENPTkZJR19BSENJX0lNWCkJCSs9IGFoY2lfaW14Lm8gbGliYWhjaS5vIGxpYmFoY2lfcGxhdGZvcm0ubworb2JqLSQoQ09ORklHX0FIQ0lfU1VOWEkpCSs9IGFoY2lfc3VueGkubyBsaWJhaGNpLm8gbGliYWhjaV9wbGF0Zm9ybS5vCitvYmotJChDT05GSUdfQUhDSV9TVCkJCSs9IGFoY2lfc3QubyBsaWJhaGNpLm8gbGliYWhjaV9wbGF0Zm9ybS5vCitvYmotJChDT05GSUdfQUhDSV9YR0VORSkJKz0gYWhjaV94Z2VuZS5vIGxpYmFoY2kubyBsaWJhaGNpX3BsYXRmb3JtLm8KIAogIyBTRkYgdy8gY3VzdG9tIERNQQogb2JqLSQoQ09ORklHX1BEQ19BRE1BKQkJKz0gcGRjX2FkbWEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jIGIvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jCmluZGV4IGZkNjY1ZDkuLmI1MTYwNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuYyBiL2RyaXZlcnMvYXRhL2FoY2kuYwppbmRleCBjODFkODA5Li41YTBiZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC01NzgsNiArNTc3LDcgQEAKIAkJCQkgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJYm9vbCBvbmxpbmU7CiAJaW50IHJjOwogCkBAIC01ODgsNyArNTg4LDcgQEAKIAlyYyA9IHNhdGFfbGlua19oYXJkcmVzZXQobGluaywgc2F0YV9laGNfZGViX3RpbWluZygmbGluay0+ZWhfY29udGV4dCksCiAJCQkJIGRlYWRsaW5lLCAmb25saW5lLCBOVUxMKTsKIAotCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKKwlocHJpdi0+c3RhcnRfZW5naW5lKGFwKTsKIAogCURQUklOVEsoIkVYSVQsIHJjPSVkLCBjbGFzcz0ldVxuIiwgcmMsICpjbGFzcyk7CiAKQEAgLTYwMyw2ICs2MDMsNyBAQAogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWJvb2wgb25saW5lOwpAQCAtNjE4LDcgKzYxOSw3IEBACiAJcmMgPSBzYXRhX2xpbmtfaGFyZHJlc2V0KGxpbmssIHNhdGFfZWhjX2RlYl90aW1pbmcoJmxpbmstPmVoX2NvbnRleHQpLAogCQkJCSBkZWFkbGluZSwgJm9ubGluZSwgTlVMTCk7CiAKLQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CiAKIAkvKiBUaGUgcHNldWRvIGNvbmZpZ3VyYXRpb24gZGV2aWNlIG9uIFNJTUc0NzI2IGF0dGFjaGVkIHRvCiAJICogQVNVUyBQNVctREggRGVsdXhlIGRvZXNuJ3Qgc2VuZCBzaWduYXR1cmUgRklTIGFmdGVyCkBAIC0xMTY1LDEzICsxMTY2LDEzIEBACiBzdGF0aWMgaW50IGFoY2lfaW5pdF9pbnRlcnJ1cHRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgbl9wb3J0cywKIAkJCSBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQogewotCWludCByYywgbnZlYzsKKwlpbnQgbnZlYzsKIAogCWlmIChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX01TSSkKIAkJZ290byBpbnR4OwogCi0JcmMgPSBwY2lfbXNpX3ZlY19jb3VudChwZGV2KTsKLQlpZiAocmMgPCAwKQorCW52ZWMgPSBwY2lfbXNpX3ZlY19jb3VudChwZGV2KTsKKwlpZiAobnZlYyA8IDApCiAJCWdvdG8gaW50eDsKIAogCS8qCkBAIC0xMTc5LDIxICsxMTgwLDE5IEBACiAJICogTWVzc2FnZSBtb2RlIGNvdWxkIGJlIGVuZm9yY2VkLiBJbiB0aGlzIGNhc2UgYXNzdW1lIHRoYXQgYWR2YW50YWdlCiAJICogb2YgbXVsdGlwZSBNU0lzIGlzIG5lZ2F0ZWQgYW5kIHVzZSBzaW5nbGUgTVNJIG1vZGUgaW5zdGVhZC4KIAkgKi8KLQlpZiAocmMgPCBuX3BvcnRzKQorCWlmIChudmVjIDwgbl9wb3J0cykKIAkJZ290byBzaW5nbGVfbXNpOwogCi0JbnZlYyA9IHJjOwotCXJjID0gcGNpX2VuYWJsZV9tc2lfYmxvY2socGRldiwgbnZlYyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbnR4OwotCWVsc2UgaWYgKHJjID4gMCkKKwludmVjID0gcGNpX2VuYWJsZV9tc2lfcmFuZ2UocGRldiwgbnZlYywgbnZlYyk7CisJaWYgKG52ZWMgPT0gLUVOT1NQQykKIAkJZ290byBzaW5nbGVfbXNpOworCWVsc2UgaWYgKG52ZWMgPCAwKQorCQlnb3RvIGludHg7CiAKIAlyZXR1cm4gbnZlYzsKIAogc2luZ2xlX21zaToKLQlyYyA9IHBjaV9lbmFibGVfbXNpKHBkZXYpOwotCWlmIChyYykKKwlpZiAocGNpX2VuYWJsZV9tc2kocGRldikpCiAJCWdvdG8gaW50eDsKIAlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5oIGIvZHJpdmVycy9hdGEvYWhjaS5oCmluZGV4IDIyODllZmQuLjUxYWYyNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuaAorKysgYi9kcml2ZXJzL2F0YS9haGNpLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAogLyogRW5jbG9zdXJlIE1hbmFnZW1lbnQgQ29udHJvbCAqLwogI2RlZmluZSBFTV9DVFJMX01TR19UWVBFICAgICAgICAgICAgICAweDAwMGYwMDAwCkBAIC01MSw2ICs1Myw3IEBACiAKIGVudW0gewogCUFIQ0lfTUFYX1BPUlRTCQk9IDMyLAorCUFIQ0lfTUFYX0NMS1MJCT0gMywKIAlBSENJX01BWF9TRwkJPSAxNjgsIC8qIGhhcmR3YXJlIG1heCBpcyA2NEsgKi8KIAlBSENJX0RNQV9CT1VOREFSWQk9IDB4ZmZmZmZmZmYsCiAJQUhDSV9NQVhfQ01EUwkJPSAzMiwKQEAgLTMyMSw4ICszMjQsMTcgQEAKIAl1MzIgCQkJZW1fbG9jOyAvKiBlbmNsb3N1cmUgbWFuYWdlbWVudCBsb2NhdGlvbiAqLwogCXUzMgkJCWVtX2J1Zl9zejsJLyogRU0gYnVmZmVyIHNpemUgaW4gYnl0ZSAqLwogCXUzMgkJCWVtX21zZ190eXBlOwkvKiBFTSBtZXNzYWdlIHR5cGUgKi8KLQlzdHJ1Y3QgY2xrCQkqY2xrOwkJLyogT25seSBmb3IgcGxhdGZvcm1zIHN1cHBvcnRpbmcgY2xrICovCisJYm9vbAkJCWdvdF9ydW50aW1lX3BtOyAvKiBEaWQgd2UgZG8gcG1fcnVudGltZV9nZXQ/ICovCisJc3RydWN0IGNsawkJKmNsa3NbQUhDSV9NQVhfQ0xLU107IC8qIE9wdGlvbmFsICovCisJc3RydWN0IHJlZ3VsYXRvcgkqdGFyZ2V0X3B3cjsJLyogT3B0aW9uYWwgKi8KKwlzdHJ1Y3QgcGh5CQkqcGh5OwkJLyogSWYgcGxhdGZvcm0gdXNlcyBwaHkgKi8KIAl2b2lkCQkJKnBsYXRfZGF0YTsJLyogT3RoZXIgcGxhdGZvcm0gZGF0YSAqLworCS8qCisJICogT3B0aW9uYWwgYWhjaV9zdGFydF9lbmdpbmUgb3ZlcnJpZGUsIGlmIG5vdCBzZXQgdGhpcyBnZXRzIHNldCB0byB0aGUKKwkgKiBkZWZhdWx0IGFoY2lfc3RhcnRfZW5naW5lIGR1cmluZyBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcsIHRoaXMgY2FuCisJICogYmUgb3ZlcnJpZGRlbiBhbnl0aW1lIGJlZm9yZSB0aGUgaG9zdCBpcyBhY3RpdmF0ZWQuCisJICovCisJdm9pZAkJCSgqc3RhcnRfZW5naW5lKShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIH07CiAKIGV4dGVybiBpbnQgYWhjaV9pZ25vcmVfc3NzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaV9kYTg1MC5jIGIvZHJpdmVycy9hdGEvYWhjaV9kYTg1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODM2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9haGNpX2RhODUwLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBEYVZpbmNpIERBODUwIEFIQ0kgU0FUQSBwbGF0Zm9ybSBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KKyNpbmNsdWRlICJhaGNpLmgiCisKKy8qIFNBVEEgUEhZIENvbnRyb2wgUmVnaXN0ZXIgb2Zmc2V0IGZyb20gQUhDSSBiYXNlICovCisjZGVmaW5lIFNBVEFfUDBQSFlDUl9SRUcJMHgxNzgKKworI2RlZmluZSBTQVRBX1BIWV9NUFkoeCkJCSgoeCkgPDwgMCkKKyNkZWZpbmUgU0FUQV9QSFlfTE9TKHgpCQkoKHgpIDw8IDYpCisjZGVmaW5lIFNBVEFfUEhZX1JYQ0RSKHgpCSgoeCkgPDwgMTApCisjZGVmaW5lIFNBVEFfUEhZX1JYRVEoeCkJKCh4KSA8PCAxMykKKyNkZWZpbmUgU0FUQV9QSFlfVFhTV0lORyh4KQkoKHgpIDw8IDE5KQorI2RlZmluZSBTQVRBX1BIWV9FTlBMTCh4KQkoKHgpIDw8IDMxKQorCisvKgorICogVGhlIG11bHRpcGxpZXIgbmVlZGVkIGZvciAxLjVHSHogUExMIG91dHB1dC4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIGN1cnJlbnRseSBoYXJkY29kZWQgdG8gYmUgc3VpdGFibGUgZm9yIDEwME1IeiBjcnlzdGFsCisgKiBmcmVxdWVuY3kgKHdoaWNoIGlzIHVzZWQgYnkgREE4NTAgRVZNIGJvYXJkKSBhbmQgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZAorICogaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoaXMgZHJpdmVyIG9uIHNvbWUgb3RoZXIgYm9hcmQuCisgKi8KKyNkZWZpbmUgREE4NTBfU0FUQV9DTEtfTVVMVElQTElFUgk3CisKK3N0YXRpYyB2b2lkIGRhODUwX3NhdGFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqcHdyZG5fcmVnLAorCQkJICAgIHZvaWQgX19pb21lbSAqYWhjaV9iYXNlKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBFbmFibGUgU0FUQSBjbG9jayByZWNlaXZlciAqLworCXZhbCA9IHJlYWRsKHB3cmRuX3JlZyk7CisJdmFsICY9IH5CSVQoMCk7CisJd3JpdGVsKHZhbCwgcHdyZG5fcmVnKTsKKworCXZhbCA9IFNBVEFfUEhZX01QWShEQTg1MF9TQVRBX0NMS19NVUxUSVBMSUVSICsgMSkgfCBTQVRBX1BIWV9MT1MoMSkgfAorCSAgICAgIFNBVEFfUEhZX1JYQ0RSKDQpIHwgU0FUQV9QSFlfUlhFUSgxKSB8IFNBVEFfUEhZX1RYU1dJTkcoMykgfAorCSAgICAgIFNBVEFfUEhZX0VOUExMKDEpOworCisJd3JpdGVsKHZhbCwgYWhjaV9iYXNlICsgU0FUQV9QMFBIWUNSX1JFRyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX2RhODUwX3BvcnRfaW5mbyA9IHsKKwkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKKwkucGlvX21hc2sJPSBBVEFfUElPNCwKKwkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCS5wb3J0X29wcwk9ICZhaGNpX3BsYXRmb3JtX29wcywKK307CisKK3N0YXRpYyBpbnQgYWhjaV9kYTg1MF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKnB3cmRuX3JlZzsKKwlpbnQgcmM7CisKKwlocHJpdiA9IGFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyhwZGV2KTsKKwlpZiAoSVNfRVJSKGhwcml2KSkKKwkJcmV0dXJuIFBUUl9FUlIoaHByaXYpOworCisJcmMgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXJlcykKKwkJZ290byBkaXNhYmxlX3Jlc291cmNlczsKKworCXB3cmRuX3JlZyA9IGRldm1faW9yZW1hcChkZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwd3Jkbl9yZWcpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlkYTg1MF9zYXRhX2luaXQoZGV2LCBwd3Jkbl9yZWcsIGhwcml2LT5tbWlvKTsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QocGRldiwgaHByaXYsICZhaGNpX2RhODUwX3BvcnRfaW5mbywgMCwgMCk7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCisJcmV0dXJuIDA7CitkaXNhYmxlX3Jlc291cmNlczoKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhaGNpX2RhODUwX3BtX29wcywgYWhjaV9wbGF0Zm9ybV9zdXNwZW5kLAorCQkJIGFoY2lfcGxhdGZvcm1fcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWhjaV9kYTg1MF9kcml2ZXIgPSB7CisJLnByb2JlID0gYWhjaV9kYTg1MF9wcm9iZSwKKwkucmVtb3ZlID0gYXRhX3BsYXRmb3JtX3JlbW92ZV9vbmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWhjaV9kYTg1MCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmYWhjaV9kYTg1MF9wbV9vcHMsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFoY2lfZGE4NTBfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYVZpbmNpIERBODUwIEFIQ0kgU0FUQSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGIuem9sbmllcmtpZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfaW14LmMgYi9kcml2ZXJzL2F0YS9haGNpX2lteC5jCmluZGV4IGRkNGQ2ZjcuLjQ5N2M3YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2lfaW14LmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaV9pbXguYwpAQCAtNDIsMTMgKzQyLDcgQEAKIHN0cnVjdCBpbXhfYWhjaV9wcml2IHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphaGNpX3BkZXY7CiAJZW51bSBhaGNpX2lteF90eXBlIHR5cGU7Ci0KLQkvKiBpLk1YNTMgY2xvY2sgKi8KLQlzdHJ1Y3QgY2xrICpzYXRhX2dhdGVfY2xrOwotCS8qIENvbW1vbiBjbG9jayAqLwotCXN0cnVjdCBjbGsgKnNhdGFfcmVmX2NsazsKIAlzdHJ1Y3QgY2xrICphaGJfY2xrOwotCiAJc3RydWN0IHJlZ21hcCAqZ3ByOwogCWJvb2wgbm9fZGV2aWNlOwogCWJvb2wgZmlyc3RfdGltZTsKQEAgLTU4LDI4OCArNTIsMzIgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChob3RwbHVnLCBhaGNpX2lteF9ob3RwbHVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhob3RwbHVnLCAiQUhDSSBJTVggaG90LXBsdWcgc3VwcG9ydCAoMD1Eb24ndCBzdXBwb3J0LCAxPXN1cHBvcnQpIik7CiAKLXN0YXRpYyBpbnQgaW14X3NhdGFfY2xvY2tfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGFoY2lfaW14X2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOworCitzdGF0aWMgaW50IGlteF9zYXRhX2VuYWJsZShzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQogewotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CiAJaW50IHJldDsKIAotCWlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNTMpIHsKLQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGlteHByaXYtPnNhdGFfZ2F0ZV9jbGspOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihkZXYsICJwcmVwYXJlLWVuYWJsZSBzYXRhX2dhdGUgY2xvY2sgZXJyOiVkXG4iLAotCQkJCXJldCk7CisJaWYgKGlteHByaXYtPm5vX2RldmljZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHByaXYtPnRhcmdldF9wd3IpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShocHJpdi0+dGFyZ2V0X3B3cik7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAJfQogCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGlteHByaXYtPnNhdGFfcmVmX2Nsayk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJwcmVwYXJlLWVuYWJsZSBzYXRhX3JlZiBjbG9jayBlcnI6JWRcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGNsa19lcnI7Ci0JfQotCi0JaWYgKGlteHByaXYtPnR5cGUgPT0gQUhDSV9JTVg2USkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14cHJpdi0+Z3ByLCBJT01VWENfR1BSMTMsCi0JCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTiwKLQkJCQkgICBJTVg2UV9HUFIxM19TQVRBX01QTExfQ0xLX0VOKTsKLQl9Ci0KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0KLQlyZXR1cm4gMDsKLQotY2xrX2VycjoKLQlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaW14cHJpdi0+c2F0YV9nYXRlX2Nsayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaW14X3NhdGFfY2xvY2tfZGlzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlteF9haGNpX3ByaXYgKmlteHByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCi0JaWYgKGlteHByaXYtPnR5cGUgPT0gQUhDSV9JTVg2USkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14cHJpdi0+Z3ByLCBJT01VWENfR1BSMTMsCi0JCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTiwKLQkJCQkgICAhSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTik7Ci0JfQotCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGlteHByaXYtPnNhdGFfcmVmX2Nsayk7Ci0KLQlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaW14cHJpdi0+c2F0YV9nYXRlX2Nsayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFoY2lfaW14X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQl1MzIgcmVnX3ZhbDsKLQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShhcC0+ZGV2KTsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOwotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gZGV2X2dldF9kcnZkYXRhKGFwLT5kZXYtPnBhcmVudCk7Ci0KLQlhaGNpX2Vycm9yX2hhbmRsZXIoYXApOwotCi0JaWYgKCEoaW14cHJpdi0+Zmlyc3RfdGltZSkgfHwgYWhjaV9pbXhfaG90cGx1ZykKLQkJcmV0dXJuOwotCi0JaW14cHJpdi0+Zmlyc3RfdGltZSA9IGZhbHNlOwotCi0JYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkKLQkJcmV0dXJuOwotCS8qCi0JICogRGlzYWJsZSBsaW5rIHRvIHNhdmUgcG93ZXIuICBBbiBpbXggYWhjaSBwb3J0IGNhbid0IGJlIHJlY292ZXJlZAotCSAqIHdpdGhvdXQgZnVsbCByZXNldCBvbmNlIHRoZSBwZGRxIG1vZGUgaXMgZW5hYmxlZCBtYWtpbmcgaXQKLQkgKiBpbXBvc3NpYmxlIHRvIHVzZSBhcyBwYXJ0IG9mIGxpYmF0YSBMUE0uCi0JICovCi0JcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQT1JUX1BIWV9DVEwpOwotCXdyaXRlbChyZWdfdmFsIHwgUE9SVF9QSFlfQ1RMX1BERFFfTE9DLCBtbWlvICsgUE9SVF9QSFlfQ1RMKTsKLQlpbXhfc2F0YV9jbG9ja19kaXNhYmxlKGFwLT5kZXYpOwotCWlteHByaXYtPm5vX2RldmljZSA9IHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQgYWhjaV9pbXhfc29mdHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCi17Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gZGV2X2dldF9kcnZkYXRhKGFwLT5kZXYtPnBhcmVudCk7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQotCQlyZXQgPSBhaGNpX3BtcF9yZXRyeV9zcnN0X29wcy5zb2Z0cmVzZXQobGluaywgY2xhc3MsIGRlYWRsaW5lKTsKLQllbHNlIGlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpCi0JCXJldCA9IGFoY2lfb3BzLnNvZnRyZXNldChsaW5rLCBjbGFzcywgZGVhZGxpbmUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfaW14X29wcyA9IHsKLQkuaW5oZXJpdHMJPSAmYWhjaV9wbGF0Zm9ybV9vcHMsCi0JLmVycm9yX2hhbmRsZXIJPSBhaGNpX2lteF9lcnJvcl9oYW5kbGVyLAotCS5zb2Z0cmVzZXQJPSBhaGNpX2lteF9zb2Z0cmVzZXQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9pbXhfcG9ydF9pbmZvID0gewotCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAotCS5waW9fbWFzawk9IEFUQV9QSU80LAotCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCi0JLnBvcnRfb3BzCT0gJmFoY2lfaW14X29wcywKLX07Ci0KLXN0YXRpYyBpbnQgaW14X3NhdGFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqbW1pbykKLXsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKLQlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0KLQlyZXQgPSBpbXhfc2F0YV9jbG9ja19lbmFibGUoZGV2KTsKKwlyZXQgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzKGhwcml2KTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcjsKIAotCS8qCi0JICogQ29uZmlndXJlIHRoZSBIV0lOSVQgYml0cyBvZiB0aGUgSE9TVF9DQVAgYW5kIEhPU1RfUE9SVFNfSU1QTCwKLQkgKiBhbmQgSVAgdmVuZG9yIHNwZWNpZmljIHJlZ2lzdGVyIEhPU1RfVElNRVIxTVMuCi0JICogQ29uZmlndXJlIENBUF9TU1MgKHN1cHBvcnQgc3RhZ2VyZWQgc3BpbiB1cCkuCi0JICogSW1wbGVtZW50IHRoZSBwb3J0MC4KLQkgKiBHZXQgdGhlIGFoYiBjbG9jayByYXRlLCBhbmQgY29uZmlndXJlIHRoZSBUSU1FUjFNUyByZWdpc3Rlci4KLQkgKi8KLQlyZWdfdmFsID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQKTsKLQlpZiAoIShyZWdfdmFsICYgSE9TVF9DQVBfU1NTKSkgewotCQlyZWdfdmFsIHw9IEhPU1RfQ0FQX1NTUzsKLQkJd3JpdGVsKHJlZ192YWwsIG1taW8gKyBIT1NUX0NBUCk7Ci0JfQotCXJlZ192YWwgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKLQlpZiAoIShyZWdfdmFsICYgMHgxKSkgewotCQlyZWdfdmFsIHw9IDB4MTsKLQkJd3JpdGVsKHJlZ192YWwsIG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOwotCX0KLQotCXJlZ192YWwgPSBjbGtfZ2V0X3JhdGUoaW14cHJpdi0+YWhiX2NsaykgLyAxMDAwOwotCXdyaXRlbChyZWdfdmFsLCBtbWlvICsgSE9TVF9USU1FUjFNUyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW14X3NhdGFfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW14X3NhdGFfY2xvY2tfZGlzYWJsZShkZXYpOwotfQotCi1zdGF0aWMgaW50IGlteF9haGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gIGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0KLQkvKgotCSAqIElmIG5vX2RldmljZSBpcyBzZXQsIFRoZSBDTEtzIGhhZCBiZWVuIGdhdGVkIG9mZiBpbiB0aGUKLQkgKiBpbml0aWFsaXphdGlvbiBzbyBkb24ndCBkbyBpdCBhZ2FpbiBoZXJlLgotCSAqLwotCWlmICghaW14cHJpdi0+bm9fZGV2aWNlKQotCQlpbXhfc2F0YV9jbG9ja19kaXNhYmxlKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbXhfYWhjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gIGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWlteHByaXYtPm5vX2RldmljZSkKLQkJcmV0ID0gaW14X3NhdGFfY2xvY2tfZW5hYmxlKGRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSBpbXhfc2F0YV9wZGF0YSA9IHsKLQkuaW5pdAkJPSBpbXhfc2F0YV9pbml0LAotCS5leGl0CQk9IGlteF9zYXRhX2V4aXQsCi0JLmF0YV9wb3J0X2luZm8JPSAmYWhjaV9pbXhfcG9ydF9pbmZvLAotCS5zdXNwZW5kCT0gaW14X2FoY2lfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGlteF9haGNpX3Jlc3VtZSwKLQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X2FoY2lfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNTMgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNlEgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfYWhjaV9vZl9tYXRjaCk7Ci0KLXN0YXRpYyBpbnQgaW14X2FoY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaXJxLCByZXNbMl07Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7Ci0JZW51bSBhaGNpX2lteF90eXBlIHR5cGU7Ci0JY29uc3Qgc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBOVUxMOwotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2OwotCXN0cnVjdCBkZXZpY2UgKmFoY2lfZGV2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFoY2lfcGRldjsKLQlpbnQgcmV0OwotCi0Jb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UoaW14X2FoY2lfb2ZfbWF0Y2gsIGRldik7Ci0JaWYgKCFvZl9pZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0eXBlID0gKGVudW0gYWhjaV9pbXhfdHlwZSlvZl9pZC0+ZGF0YTsKLQlwZGF0YSA9ICZpbXhfc2F0YV9wZGF0YTsKLQotCWlteHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlteHByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteHByaXYpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvYyBhaGNpX2hvc3RfcHJpdlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWFoY2lfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiYWhjaSIsIC0xKTsKLQlpZiAoIWFoY2lfcGRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlhaGNpX2RldiA9ICZhaGNpX3BkZXYtPmRldjsKLQlhaGNpX2Rldi0+cGFyZW50ID0gZGV2OwotCi0JaW14cHJpdi0+bm9fZGV2aWNlID0gZmFsc2U7Ci0JaW14cHJpdi0+Zmlyc3RfdGltZSA9IHRydWU7Ci0JaW14cHJpdi0+dHlwZSA9IHR5cGU7Ci0KLQlpbXhwcml2LT5haGJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImFoYiIpOwotCWlmIChJU19FUlIoaW14cHJpdi0+YWhiX2NsaykpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgYWhiIGNsb2NrLlxuIik7Ci0JCXJldCA9IFBUUl9FUlIoaW14cHJpdi0+YWhiX2Nsayk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpZiAodHlwZSA9PSBBSENJX0lNWDUzKSB7Ci0JCWlteHByaXYtPnNhdGFfZ2F0ZV9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAic2F0YV9nYXRlIik7Ci0JCWlmIChJU19FUlIoaW14cHJpdi0+c2F0YV9nYXRlX2NsaykpIHsKLQkJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IHNhdGFfZ2F0ZSBjbG9jay5cbiIpOwotCQkJcmV0ID0gUFRSX0VSUihpbXhwcml2LT5zYXRhX2dhdGVfY2xrKTsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCX0KLQotCWlteHByaXYtPnNhdGFfcmVmX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJzYXRhX3JlZiIpOwotCWlmIChJU19FUlIoaW14cHJpdi0+c2F0YV9yZWZfY2xrKSkgewotCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBzYXRhX3JlZiBjbG9jay5cbiIpOwotCQlyZXQgPSBQVFJfRVJSKGlteHByaXYtPnNhdGFfcmVmX2Nsayk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpbXhwcml2LT5haGNpX3BkZXYgPSBhaGNpX3BkZXY7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW14cHJpdik7Ci0KLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7Ci0JaWYgKCFtZW0gfHwgIWlycSkgewotCQlkZXZfZXJyKGRldiwgIm5vIG1taW8vaXJxIHJlc291cmNlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXJlc1swXSA9ICptZW07Ci0JcmVzWzFdID0gKmlycTsKLQotCWFoY2lfZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0JYWhjaV9kZXYtPmRtYV9tYXNrID0gJmFoY2lfZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKLQlhaGNpX2Rldi0+b2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKLQotCWlmICh0eXBlID09IEFIQ0lfSU1YNlEpIHsKLQkJaW14cHJpdi0+Z3ByID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgKLQkJCQkJCQkiZnNsLGlteDZxLWlvbXV4Yy1ncHIiKTsKLQkJaWYgKElTX0VSUihpbXhwcml2LT5ncHIpKSB7Ci0JCQlkZXZfZXJyKGRldiwKLQkJCQkiZmFpbGVkIHRvIGZpbmQgZnNsLGlteDZxLWlvbXV4LWdwciByZWdtYXBcbiIpOwotCQkJcmV0ID0gUFRSX0VSUihpbXhwcml2LT5ncHIpOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0KKwlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDZRKSB7CiAJCS8qCi0JCSAqIFNldCBQSFkgUGFyZW1ldGVycywgdHdvIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGUgR1BSMTMsCisJCSAqIHNldCBQSFkgUGFyZW1ldGVycywgdHdvIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGUgR1BSMTMsCiAJCSAqIG9uZSB3cml0ZSBmb3IgcmVzdCBvZiBwYXJhbWV0ZXJzLCBtYXNrIG9mIGZpcnN0IHdyaXRlCi0JCSAqIGlzIDB4MDdmZmZmZmUsIGFuZCB0aGUgb3RoZXIgb25lIHdyaXRlIGZvciBzZXR0aW5nCi0JCSAqIHRoZSBtcGxsX2Nsa19lbiBoYXBwZW5zIGluIGlteF9zYXRhX2Nsb2NrX2VuYWJsZSgpLgorCQkgKiBpcyAweDA3ZmZmZmZmLCBhbmQgdGhlIG90aGVyIG9uZSB3cml0ZSBmb3Igc2V0dGluZworCQkgKiB0aGUgbXBsbF9jbGtfZW4uCiAJCSAqLwogCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14cHJpdi0+Z3ByLCBJT01VWENfR1BSMTMsCiAJCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9SWF9FUV9WQUxfTUFTSyB8CkBAIC0zNjAsNDIgKzk4LDIyOSBAQAogCQkJCSAgIElNWDZRX0dQUjEzX1NBVEFfVFhfQVRURU5fOV8xNiB8CiAJCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9UWF9CT09TVF8zXzMzX0RCIHwKIAkJCQkgICBJTVg2UV9HUFIxM19TQVRBX1RYX0xWTF8xXzAyNV9WKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteHByaXYtPmdwciwgSU9NVVhDX0dQUjEzLAorCQkJCSAgIElNWDZRX0dQUjEzX1NBVEFfTVBMTF9DTEtfRU4sCisJCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTik7CiAJfQogCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoYWhjaV9wZGV2LCByZXMsIDIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX291dDsKLQotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShhaGNpX3BkZXYsIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhaGNpX3BkZXYpOwotCWlmIChyZXQpIHsKLWVycl9vdXQ6Ci0JCXBsYXRmb3JtX2RldmljZV9wdXQoYWhjaV9wZGV2KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCiAJcmV0dXJuIDA7CisKK2Rpc2FibGVfcmVndWxhdG9yOgorCWlmIChocHJpdi0+dGFyZ2V0X3B3cikKKwkJcmVndWxhdG9yX2Rpc2FibGUoaHByaXYtPnRhcmdldF9wd3IpOworCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpbXhfYWhjaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGlteF9zYXRhX2Rpc2FibGUoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKIHsKLQlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFoY2lfcGRldiA9IGlteHByaXYtPmFoY2lfcGRldjsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhaGNpX3BkZXYpOworCWlmIChpbXhwcml2LT5ub19kZXZpY2UpCisJCXJldHVybjsKKworCWlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpIHsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteHByaXYtPmdwciwgSU9NVVhDX0dQUjEzLAorCQkJCSAgIElNWDZRX0dQUjEzX1NBVEFfTVBMTF9DTEtfRU4sCisJCQkJICAgIUlNWDZRX0dQUjEzX1NBVEFfTVBMTF9DTEtfRU4pOworCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKGhwcml2KTsKKworCWlmIChocHJpdi0+dGFyZ2V0X3B3cikKKwkJcmVndWxhdG9yX2Rpc2FibGUoaHByaXYtPnRhcmdldF9wd3IpOworfQorCitzdGF0aWMgdm9pZCBhaGNpX2lteF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTMyIHJlZ192YWw7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoYXAtPmRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBocHJpdi0+bW1pbzsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CisKKwlhaGNpX2Vycm9yX2hhbmRsZXIoYXApOworCisJaWYgKCEoaW14cHJpdi0+Zmlyc3RfdGltZSkgfHwgYWhjaV9pbXhfaG90cGx1ZykKKwkJcmV0dXJuOworCisJaW14cHJpdi0+Zmlyc3RfdGltZSA9IGZhbHNlOworCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkKKwkJcmV0dXJuOworCS8qCisJICogRGlzYWJsZSBsaW5rIHRvIHNhdmUgcG93ZXIuICBBbiBpbXggYWhjaSBwb3J0IGNhbid0IGJlIHJlY292ZXJlZAorCSAqIHdpdGhvdXQgZnVsbCByZXNldCBvbmNlIHRoZSBwZGRxIG1vZGUgaXMgZW5hYmxlZCBtYWtpbmcgaXQKKwkgKiBpbXBvc3NpYmxlIHRvIHVzZSBhcyBwYXJ0IG9mIGxpYmF0YSBMUE0uCisJICovCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQT1JUX1BIWV9DVEwpOworCXdyaXRlbChyZWdfdmFsIHwgUE9SVF9QSFlfQ1RMX1BERFFfTE9DLCBtbWlvICsgUE9SVF9QSFlfQ1RMKTsKKwlpbXhfc2F0YV9kaXNhYmxlKGhwcml2KTsKKwlpbXhwcml2LT5ub19kZXZpY2UgPSB0cnVlOworfQorCitzdGF0aWMgaW50IGFoY2lfaW14X3NvZnRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoYXAtPmRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CisJaW50IHJldCA9IC1FSU87CisKKwlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQorCQlyZXQgPSBhaGNpX3BtcF9yZXRyeV9zcnN0X29wcy5zb2Z0cmVzZXQobGluaywgY2xhc3MsIGRlYWRsaW5lKTsKKwllbHNlIGlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpCisJCXJldCA9IGFoY2lfb3BzLnNvZnRyZXNldChsaW5rLCBjbGFzcywgZGVhZGxpbmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfaW14X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmYWhjaV9vcHMsCisJLmhvc3Rfc3RvcAk9IGFoY2lfaW14X2hvc3Rfc3RvcCwKKwkuZXJyb3JfaGFuZGxlcgk9IGFoY2lfaW14X2Vycm9yX2hhbmRsZXIsCisJLnNvZnRyZXNldAk9IGFoY2lfaW14X3NvZnRyZXNldCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX2lteF9wb3J0X2luZm8gPSB7CisJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCisJLnBpb19tYXNrCT0gQVRBX1BJTzQsCisJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKKwkucG9ydF9vcHMJPSAmYWhjaV9pbXhfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X2FoY2lfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNTMgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNlEgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfYWhjaV9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgaW14X2FoY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7CisJc3RydWN0IGlteF9haGNpX3ByaXYgKmlteHByaXY7CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisJaW50IHJldDsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGlteF9haGNpX29mX21hdGNoLCBkZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJaW14cHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW14cHJpdiksIEdGUF9LRVJORUwpOworCWlmICghaW14cHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbXhwcml2LT5ub19kZXZpY2UgPSBmYWxzZTsKKwlpbXhwcml2LT5maXJzdF90aW1lID0gdHJ1ZTsKKwlpbXhwcml2LT50eXBlID0gKGVudW0gYWhjaV9pbXhfdHlwZSlvZl9pZC0+ZGF0YTsKKwlpbXhwcml2LT5haGJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImFoYiIpOworCWlmIChJU19FUlIoaW14cHJpdi0+YWhiX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgYWhiIGNsb2NrLlxuIik7CisJCXJldHVybiBQVFJfRVJSKGlteHByaXYtPmFoYl9jbGspOworCX0KKworCWlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpIHsKKwkJaW14cHJpdi0+Z3ByID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgKKwkJCQkJCQkiZnNsLGlteDZxLWlvbXV4Yy1ncHIiKTsKKwkJaWYgKElTX0VSUihpbXhwcml2LT5ncHIpKSB7CisJCQlkZXZfZXJyKGRldiwKKwkJCQkiZmFpbGVkIHRvIGZpbmQgZnNsLGlteDZxLWlvbXV4LWdwciByZWdtYXBcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoaW14cHJpdi0+Z3ByKTsKKwkJfQorCX0KKworCWhwcml2ID0gYWhjaV9wbGF0Zm9ybV9nZXRfcmVzb3VyY2VzKHBkZXYpOworCWlmIChJU19FUlIoaHByaXYpKQorCQlyZXR1cm4gUFRSX0VSUihocHJpdik7CisKKwlocHJpdi0+cGxhdF9kYXRhID0gaW14cHJpdjsKKworCXJldCA9IGlteF9zYXRhX2VuYWJsZShocHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQ29uZmlndXJlIHRoZSBIV0lOSVQgYml0cyBvZiB0aGUgSE9TVF9DQVAgYW5kIEhPU1RfUE9SVFNfSU1QTCwKKwkgKiBhbmQgSVAgdmVuZG9yIHNwZWNpZmljIHJlZ2lzdGVyIEhPU1RfVElNRVIxTVMuCisJICogQ29uZmlndXJlIENBUF9TU1MgKHN1cHBvcnQgc3RhZ2VyZWQgc3BpbiB1cCkuCisJICogSW1wbGVtZW50IHRoZSBwb3J0MC4KKwkgKiBHZXQgdGhlIGFoYiBjbG9jayByYXRlLCBhbmQgY29uZmlndXJlIHRoZSBUSU1FUjFNUyByZWdpc3Rlci4KKwkgKi8KKwlyZWdfdmFsID0gcmVhZGwoaHByaXYtPm1taW8gKyBIT1NUX0NBUCk7CisJaWYgKCEocmVnX3ZhbCAmIEhPU1RfQ0FQX1NTUykpIHsKKwkJcmVnX3ZhbCB8PSBIT1NUX0NBUF9TU1M7CisJCXdyaXRlbChyZWdfdmFsLCBocHJpdi0+bW1pbyArIEhPU1RfQ0FQKTsKKwl9CisJcmVnX3ZhbCA9IHJlYWRsKGhwcml2LT5tbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwlpZiAoIShyZWdfdmFsICYgMHgxKSkgeworCQlyZWdfdmFsIHw9IDB4MTsKKwkJd3JpdGVsKHJlZ192YWwsIGhwcml2LT5tbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwl9CisKKwlyZWdfdmFsID0gY2xrX2dldF9yYXRlKGlteHByaXYtPmFoYl9jbGspIC8gMTAwMDsKKwl3cml0ZWwocmVnX3ZhbCwgaHByaXYtPm1taW8gKyBIT1NUX1RJTUVSMU1TKTsKKworCXJldCA9IGFoY2lfcGxhdGZvcm1faW5pdF9ob3N0KHBkZXYsIGhwcml2LCAmYWhjaV9pbXhfcG9ydF9pbmZvLCAwLCAwKTsKKwlpZiAocmV0KQorCQlpbXhfc2F0YV9kaXNhYmxlKGhwcml2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaW14X2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKworCWlteF9zYXRhX2Rpc2FibGUoaHByaXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGlteF9haGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlteF9zYXRhX2Rpc2FibGUoaHByaXYpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaW14X2FoY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBpbXhfc2F0YV9lbmFibGUoaHByaXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhaGNpX2lteF9wbV9vcHMsIGlteF9haGNpX3N1c3BlbmQsIGlteF9haGNpX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlteF9haGNpX2RyaXZlciA9IHsKIAkucHJvYmUgPSBpbXhfYWhjaV9wcm9iZSwKLQkucmVtb3ZlID0gaW14X2FoY2lfcmVtb3ZlLAorCS5yZW1vdmUgPSBhdGFfcGxhdGZvcm1fcmVtb3ZlX29uZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhaGNpLWlteCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBpbXhfYWhjaV9vZl9tYXRjaCwKKwkJLnBtID0gJmFoY2lfaW14X3BtX29wcywKIAl9LAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaW14X2FoY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYwppbmRleCA0YjIzMWJhLi5lZjY3ZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jCkBAIC0xMiwxMzUgKzEyLDM2IEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvYWhjaV9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgImFoY2kuaCIKIAotc3RhdGljIHZvaWQgYWhjaV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKLQotZW51bSBhaGNpX3R5cGUgewotCUFIQ0ksCQkvKiBzdGFuZGFyZCBwbGF0Zm9ybSBhaGNpICovCi0JSU1YNTNfQUhDSSwJLyogYWhjaSBvbiBpLm14NTMgKi8KLQlTVFJJQ1RfQUhDSSwJLyogZGVsYXllZCBETUEgZW5naW5lIHN0YXJ0ICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBhaGNpX2RldnR5cGVbXSA9IHsKLQl7Ci0JCS5uYW1lID0gImFoY2kiLAotCQkuZHJpdmVyX2RhdGEgPSBBSENJLAotCX0sIHsKLQkJLm5hbWUgPSAiaW14NTMtYWhjaSIsCi0JCS5kcml2ZXJfZGF0YSA9IElNWDUzX0FIQ0ksCi0JfSwgewotCQkubmFtZSA9ICJzdHJpY3QtYWhjaSIsCi0JCS5kcml2ZXJfZGF0YSA9IFNUUklDVF9BSENJLAotCX0sIHsKLQkJLyogc2VudGluZWwgKi8KLQl9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgYWhjaV9kZXZ0eXBlKTsKLQotc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWhjaV9wbGF0Zm9ybV9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJmFoY2lfb3BzLAotCS5ob3N0X3N0b3AJPSBhaGNpX2hvc3Rfc3RvcCwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX29wcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhaGNpX3BsYXRmb3JtX3JldHJ5X3Nyc3Rfb3BzID0gewotCS5pbmhlcml0cwk9ICZhaGNpX3BtcF9yZXRyeV9zcnN0X29wcywKLQkuaG9zdF9zdG9wCT0gYWhjaV9ob3N0X3N0b3AsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9wb3J0X2luZm9bXSA9IHsKLQkvKiBieSBmZWF0dXJlcyAqLwotCVtBSENJXSA9IHsKLQkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCi0JCS5waW9fbWFzawk9IEFUQV9QSU80LAotCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAotCQkucG9ydF9vcHMJPSAmYWhjaV9wbGF0Zm9ybV9vcHMsCi0JfSwKLQlbSU1YNTNfQUhDSV0gPSB7Ci0JCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAotCQkucGlvX21hc2sJPSBBVEFfUElPNCwKLQkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKLQkJLnBvcnRfb3BzCT0gJmFoY2lfcGxhdGZvcm1fcmV0cnlfc3JzdF9vcHMsCi0JfSwKLQlbU1RSSUNUX0FIQ0ldID0gewotCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19ERUxBWV9FTkdJTkUpLAotCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKLQkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCi0JCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCi0JCS5wb3J0X29wcwk9ICZhaGNpX3BsYXRmb3JtX29wcywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWhjaV9wbGF0Zm9ybV9zaHQgPSB7Ci0JQUhDSV9TSFQoImFoY2lfcGxhdGZvcm0iKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mbyA9IHsKKwkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKKwkucGlvX21hc2sJPSBBVEFfUElPNCwKKwkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCS5wb3J0X29wcwk9ICZhaGNpX3BsYXRmb3JtX29wcywKIH07CiAKIHN0YXRpYyBpbnQgYWhjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0JY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gYWhjaV9wb3J0X2luZm9baWQgPyBpZC0+ZHJpdmVyX2RhdGEgOiAwXTsKLQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwaSwgTlVMTCB9OwogCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0OwotCXN0cnVjdCByZXNvdXJjZSAqbWVtOwotCWludCBpcnE7Ci0JaW50IG5fcG9ydHM7Ci0JaW50IGk7CiAJaW50IHJjOwogCi0JbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIW1lbSkgewotCQlkZXZfZXJyKGRldiwgIm5vIG1taW8gc3BhY2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaHByaXYgPSBhaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMocGRldik7CisJaWYgKElTX0VSUihocHJpdikpCisJCXJldHVybiBQVFJfRVJSKGhwcml2KTsKIAotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8PSAwKSB7Ci0JCWRldl9lcnIoZGV2LCAibm8gaXJxXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5hdGFfcG9ydF9pbmZvKQotCQlwaSA9ICpwZGF0YS0+YXRhX3BvcnRfaW5mbzsKLQotCWhwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghaHByaXYpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvYyBhaGNpX2hvc3RfcHJpdlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWhwcml2LT5mbGFncyB8PSAodW5zaWduZWQgbG9uZylwaS5wcml2YXRlX2RhdGE7Ci0KLQlocHJpdi0+bW1pbyA9IGRldm1faW9yZW1hcChkZXYsIG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7Ci0JaWYgKCFocHJpdi0+bW1pbykgewotCQlkZXZfZXJyKGRldiwgImNhbid0IG1hcCAlcFJcbiIsIG1lbSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWhwcml2LT5jbGsgPSBjbGtfZ2V0KGRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihocHJpdi0+Y2xrKSkgewotCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBjbG9ja1xuIik7Ci0JfSBlbHNlIHsKLQkJcmMgPSBjbGtfcHJlcGFyZV9lbmFibGUoaHByaXYtPmNsayk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihkZXYsICJjbG9jayBwcmVwYXJlIGVuYWJsZSBmYWlsZWQiKTsKLQkJCWdvdG8gZnJlZV9jbGs7Ci0JCX0KLQl9CisJcmMgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJLyoKIAkgKiBTb21lIHBsYXRmb3JtcyBtaWdodCBuZWVkIHRvIHByZXBhcmUgZm9yIG1taW8gcmVnaW9uIGFjY2VzcywKQEAgLTE1MSw2OSArNTIsMTAgQEAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKIAkJcmMgPSBwZGF0YS0+aW5pdChkZXYsIGhwcml2LT5tbWlvKTsKIAkJaWYgKHJjKQotCQkJZ290byBkaXNhYmxlX3VucHJlcGFyZV9jbGs7CisJCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOwogCX0KIAotCWFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZyhkZXYsIGhwcml2LAotCQlwZGF0YSA/IHBkYXRhLT5mb3JjZV9wb3J0X21hcCA6IDAsCi0JCXBkYXRhID8gcGRhdGEtPm1hc2tfcG9ydF9tYXAgIDogMCk7Ci0KLQkvKiBwcmVwYXJlIGhvc3QgKi8KLQlpZiAoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX05DUSkKLQkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfTkNROwotCi0JaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9QTVApCi0JCXBpLmZsYWdzIHw9IEFUQV9GTEFHX1BNUDsKLQotCWFoY2lfc2V0X2VtX21lc3NhZ2VzKGhwcml2LCAmcGkpOwotCi0JLyogQ0FQLk5QIHNvbWV0aW1lcyBpbmRpY2F0ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZW5hYmxlZAotCSAqIHBvcnQsIGF0IG90aGVyIHRpbWVzLCB0aGF0IG9mIHRoZSBsYXN0IHBvc3NpYmxlIHBvcnQsIHNvCi0JICogZGV0ZXJtaW5pbmcgdGhlIG1heGltdW0gcG9ydCBudW1iZXIgcmVxdWlyZXMgbG9va2luZyBhdAotCSAqIGJvdGggQ0FQLk5QIGFuZCBwb3J0X21hcC4KLQkgKi8KLQluX3BvcnRzID0gbWF4KGFoY2lfbnJfcG9ydHMoaHByaXYtPmNhcCksIGZscyhocHJpdi0+cG9ydF9tYXApKTsKLQotCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbyhkZXYsIHBwaSwgbl9wb3J0cyk7Ci0JaWYgKCFob3N0KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwZGF0YV9leGl0OwotCX0KLQotCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhwcml2OwotCi0JaWYgKCEoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX1NTUykgfHwgYWhjaV9pZ25vcmVfc3NzKQotCQlob3N0LT5mbGFncyB8PSBBVEFfSE9TVF9QQVJBTExFTF9TQ0FOOwotCWVsc2UKLQkJZGV2X2luZm8oZGV2LCAiU1NTIGZsYWcgc2V0LCBwYXJhbGxlbCBidXMgc2NhbiBkaXNhYmxlZFxuIik7Ci0KLQlpZiAocGkuZmxhZ3MgJiBBVEFfRkxBR19FTSkKLQkJYWhjaV9yZXNldF9lbShob3N0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOwotCi0JCWF0YV9wb3J0X2Rlc2MoYXAsICJtbWlvICVwUiIsIG1lbSk7Ci0JCWF0YV9wb3J0X2Rlc2MoYXAsICJwb3J0IDB4JXgiLCAweDEwMCArIGFwLT5wb3J0X25vICogMHg4MCk7Ci0KLQkJLyogc2V0IGVuY2xvc3VyZSBtYW5hZ2VtZW50IG1lc3NhZ2UgdHlwZSAqLwotCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRU0pCi0JCQlhcC0+ZW1fbWVzc2FnZV90eXBlID0gaHByaXYtPmVtX21zZ190eXBlOwotCi0JCS8qIGRpc2FibGVkL25vdC1pbXBsZW1lbnRlZCBwb3J0ICovCi0JCWlmICghKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKLQkJCWFwLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOwotCX0KLQotCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOwotCWlmIChyYykKLQkJZ290byBwZGF0YV9leGl0OwotCi0JYWhjaV9pbml0X2NvbnRyb2xsZXIoaG9zdCk7Ci0JYWhjaV9wcmludF9pbmZvKGhvc3QsICJwbGF0Zm9ybSIpOwotCi0JcmMgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGFoY2lfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSAgICAgICAmYWhjaV9wbGF0Zm9ybV9zaHQpOworCXJjID0gYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QocGRldiwgaHByaXYsICZhaGNpX3BvcnRfaW5mbywgMCwgMCk7CiAJaWYgKHJjKQogCQlnb3RvIHBkYXRhX2V4aXQ7CiAKQEAgLTIyMSwxMTUgKzYzLDE5IEBACiBwZGF0YV9leGl0OgogCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKIAkJcGRhdGEtPmV4aXQoZGV2KTsKLWRpc2FibGVfdW5wcmVwYXJlX2NsazoKLQlpZiAoIUlTX0VSUihocHJpdi0+Y2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhwcml2LT5jbGspOwotZnJlZV9jbGs6Ci0JaWYgKCFJU19FUlIoaHByaXYtPmNsaykpCi0JCWNsa19wdXQoaHByaXYtPmNsayk7CitkaXNhYmxlX3Jlc291cmNlczoKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBob3N0LT5kZXY7Ci0Jc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0Jc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKLQotCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKLQkJcGRhdGEtPmV4aXQoZGV2KTsKLQotCWlmICghSVNfRVJSKGhwcml2LT5jbGspKSB7Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShocHJpdi0+Y2xrKTsKLQkJY2xrX3B1dChocHJpdi0+Y2xrKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgYWhjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOwotCXUzMiBjdGw7Ci0JaW50IHJjOwotCi0JaWYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfTk9fU1VTUEVORCkgewotCQlkZXZfZXJyKGRldiwgImZpcm13YXJlIHVwZGF0ZSByZXF1aXJlZCBmb3Igc3VzcGVuZC9yZXN1bWVcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIEFIQ0kgc3BlYyByZXYxLjEgc2VjdGlvbiA4LjMuMzoKLQkgKiBTb2Z0d2FyZSBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciB0byByZXF1ZXN0aW5nIGEKLQkgKiB0cmFuc2l0aW9uIG9mIHRoZSBIQkEgdG8gRDMgc3RhdGUuCi0JICovCi0JY3RsID0gcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsKLQljdGwgJj0gfkhPU1RfSVJRX0VOOwotCXdyaXRlbChjdGwsIG1taW8gKyBIT1NUX0NUTCk7Ci0JcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsgLyogZmx1c2ggKi8KLQotCXJjID0gYXRhX2hvc3Rfc3VzcGVuZChob3N0LCBQTVNHX1NVU1BFTkQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5zdXNwZW5kKQotCQlyZXR1cm4gcGRhdGEtPnN1c3BlbmQoZGV2KTsKLQotCWlmICghSVNfRVJSKGhwcml2LT5jbGspKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaHByaXYtPmNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhaGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmM7Ci0KLQlpZiAoIUlTX0VSUihocHJpdi0+Y2xrKSkgewotCQlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZShocHJpdi0+Y2xrKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRldiwgImNsb2NrIHByZXBhcmUgZW5hYmxlIGZhaWxlZCIpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5yZXN1bWUpIHsKLQkJcmMgPSBwZGF0YS0+cmVzdW1lKGRldik7Ci0JCWlmIChyYykKLQkJCWdvdG8gZGlzYWJsZV91bnByZXBhcmVfY2xrOwotCX0KLQotCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKLQkJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIoaG9zdCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZGlzYWJsZV91bnByZXBhcmVfY2xrOwotCi0JCWFoY2lfaW5pdF9jb250cm9sbGVyKGhvc3QpOwotCX0KLQotCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKLQotCXJldHVybiAwOwotCi1kaXNhYmxlX3VucHJlcGFyZV9jbGs6Ci0JaWYgKCFJU19FUlIoaHByaXYtPmNsaykpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShocHJpdi0+Y2xrKTsKLQotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYWhjaV9wbV9vcHMsIGFoY2lfc3VzcGVuZCwgYWhjaV9yZXN1bWUpOworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFoY2lfcG1fb3BzLCBhaGNpX3BsYXRmb3JtX3N1c3BlbmQsCisJCQkgYWhjaV9wbGF0Zm9ybV9yZXN1bWUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhaGNpX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzbnBzLHNwZWFyLWFoY2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic25wcyxleHlub3M1NDQwLWFoY2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiaWJtLDQ3Nmd0ci1haGNpIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNucHMsZHdjLWFoY2kiLCB9LAogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFoY2lfb2ZfbWF0Y2gpOwpAQCAtMzQzLDcgKzg5LDYgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gYWhjaV9vZl9tYXRjaCwKIAkJLnBtID0gJmFoY2lfcG1fb3BzLAogCX0sCi0JLmlkX3RhYmxlCT0gYWhjaV9kZXZ0eXBlLAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWhjaV9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpX3N0LmMgYi9kcml2ZXJzL2F0YS9haGNpX3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMjIyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL2FoY2lfc3QuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTVE1pY3JvZWxlY3Ryb25pY3MgTGltaXRlZAorICoKKyAqIEF1dGhvcnM6IEZyYW5jZXNjbyBWaXJsaW56aSA8ZnJhbmNlc2NvLnZpcmxpbnppQHN0LmNvbT4KKyAqCSAgICBBbGV4YW5kcmUgVG9yZ3VlIDxhbGV4YW5kcmUudG9yZ3VlQHN0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJhaGNpLmgiCisKKyNkZWZpbmUgU1RfQUhDSV9PT0JSCQkJMHhiYworI2RlZmluZSBTVF9BSENJX09PQlJfV0UJCQlCSVQoMzEpCisjZGVmaW5lIFNUX0FIQ0lfT09CUl9DV01JTl9TSElGVAkyNAorI2RlZmluZSBTVF9BSENJX09PQlJfQ1dNQVhfU0hJRlQJMTYKKyNkZWZpbmUgU1RfQUhDSV9PT0JSX0NJTUlOX1NISUZUCTgKKyNkZWZpbmUgU1RfQUhDSV9PT0JSX0NJTUFYX1NISUZUCTAKKworc3RydWN0IHN0X2FoY2lfZHJ2X2RhdGEgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFoY2k7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnB3cjsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqc3dfcnN0OworCXN0cnVjdCByZXNldF9jb250cm9sICpwd3JfcnN0OworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7Cit9OworCitzdGF0aWMgdm9pZCBzdF9haGNpX2NvbmZpZ3VyZV9vb2Iodm9pZCBfX2lvbWVtICptbWlvKQoreworCXVuc2lnbmVkIGxvbmcgb2xkX3ZhbCwgbmV3X3ZhbDsKKworCW5ld192YWwgPSAoMHgwMiA8PCBTVF9BSENJX09PQlJfQ1dNSU5fU0hJRlQpIHwKKwkJICAoMHgwNCA8PCBTVF9BSENJX09PQlJfQ1dNQVhfU0hJRlQpIHwKKwkJICAoMHgwOCA8PCBTVF9BSENJX09PQlJfQ0lNSU5fU0hJRlQpIHwKKwkJICAoMHgwQyA8PCBTVF9BSENJX09PQlJfQ0lNQVhfU0hJRlQpOworCisJb2xkX3ZhbCA9IHJlYWRsKG1taW8gKyBTVF9BSENJX09PQlIpOworCXdyaXRlbChvbGRfdmFsIHwgU1RfQUhDSV9PT0JSX1dFLCBtbWlvICsgU1RfQUhDSV9PT0JSKTsKKwl3cml0ZWwobmV3X3ZhbCB8IFNUX0FIQ0lfT09CUl9XRSwgbW1pbyArIFNUX0FIQ0lfT09CUik7CisJd3JpdGVsKG5ld192YWwsIG1taW8gKyBTVF9BSENJX09PQlIpOworfQorCitzdGF0aWMgaW50IHN0X2FoY2lfZGVhc3NlcnRfcmVzZXRzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RfYWhjaV9kcnZfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKGRydl9kYXRhLT5wd3IpIHsKKwkJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChkcnZfZGF0YS0+cHdyKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gYnJpbmcgb3V0IG9mIHB3cmR3blxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJc3RfYWhjaV9jb25maWd1cmVfb29iKGRydl9kYXRhLT5ocHJpdi0+bW1pbyk7CisKKwlpZiAoZHJ2X2RhdGEtPnN3X3JzdCkgeworCQllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KGRydl9kYXRhLT5zd19yc3QpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBicmluZyBvdXQgb2Ygc3ctcnN0XG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAoZHJ2X2RhdGEtPnB3cl9yc3QpIHsKKwkJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChkcnZfZGF0YS0+cHdyX3JzdCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGJyaW5nIG91dCBvZiBwd3ItcnN0XG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RfYWhjaV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBzdF9haGNpX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnI7CisKKwlpZiAoZHJ2X2RhdGEtPnB3cikgeworCQllcnIgPSByZXNldF9jb250cm9sX2Fzc2VydChkcnZfZGF0YS0+cHdyKTsKKwkJaWYgKGVycikKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHB3cmR3blxuIik7CisJfQorCisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7Cit9CisKK3N0YXRpYyBpbnQgc3RfYWhjaV9wcm9iZV9yZXNldHMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RfYWhjaV9kcnZfZGF0YSAqZHJ2X2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRydl9kYXRhLT5wd3IgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJwd3ItZHduIik7CisJaWYgKElTX0VSUihkcnZfZGF0YS0+cHdyKSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicG93ZXIgcmVzZXQgY29udHJvbCBub3QgZGVmaW5lZFxuIik7CisJCWRydl9kYXRhLT5wd3IgPSBOVUxMOworCX0KKworCWRydl9kYXRhLT5zd19yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJzdy1yc3QiKTsKKwlpZiAoSVNfRVJSKGRydl9kYXRhLT5zd19yc3QpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzb2Z0IHJlc2V0IGNvbnRyb2wgbm90IGRlZmluZWRcbiIpOworCQlkcnZfZGF0YS0+c3dfcnN0ID0gTlVMTDsKKwl9CisKKwlkcnZfZGF0YS0+cHdyX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgInB3ci1yc3QiKTsKKwlpZiAoSVNfRVJSKGRydl9kYXRhLT5wd3JfcnN0KSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwb3dlciBzb2Z0IHJlc2V0IGNvbnRyb2wgbm90IGRlZmluZWRcbiIpOworCQlkcnZfZGF0YS0+cHdyX3JzdCA9IE5VTEw7CisJfQorCisJcmV0dXJuIHN0X2FoY2lfZGVhc3NlcnRfcmVzZXRzKCZwZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc3RfYWhjaV9wb3J0X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmYWhjaV9wbGF0Zm9ybV9vcHMsCisJLmhvc3Rfc3RvcAk9IHN0X2FoY2lfaG9zdF9zdG9wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHN0X2FoY2lfcG9ydF9pbmZvID0geworCS5mbGFncyAgICAgICAgICA9IEFIQ0lfRkxBR19DT01NT04sCisJLnBpb19tYXNrICAgICAgID0gQVRBX1BJTzQsCisJLnVkbWFfbWFzayAgICAgID0gQVRBX1VETUE2LAorCS5wb3J0X29wcyAgICAgICA9ICZzdF9haGNpX3BvcnRfb3BzLAorfTsKKworc3RhdGljIGludCBzdF9haGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN0X2FoY2lfZHJ2X2RhdGEgKmRydl9kYXRhOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7CisJaW50IGVycjsKKworCWRydl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydl9kYXRhKTsKKworCWhwcml2ID0gYWhjaV9wbGF0Zm9ybV9nZXRfcmVzb3VyY2VzKHBkZXYpOworCWlmIChJU19FUlIoaHByaXYpKQorCQlyZXR1cm4gUFRSX0VSUihocHJpdik7CisKKwlkcnZfZGF0YS0+aHByaXYgPSBocHJpdjsKKworCWVyciA9IHN0X2FoY2lfcHJvYmVfcmVzZXRzKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhaGNpX3BsYXRmb3JtX2luaXRfaG9zdChwZGV2LCBocHJpdiwgJnN0X2FoY2lfcG9ydF9pbmZvLCAwLCAwKTsKKwlpZiAoZXJyKSB7CisJCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHN0X2FoY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0X2FoY2lfZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGRydl9kYXRhLT5ocHJpdjsKKwlpbnQgZXJyOworCisJZXJyID0gYWhjaV9wbGF0Zm9ybV9zdXNwZW5kX2hvc3QoZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGRydl9kYXRhLT5wd3IpIHsKKwkJZXJyID0gcmVzZXRfY29udHJvbF9hc3NlcnQoZHJ2X2RhdGEtPnB3cik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHB3cmR3biIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RfYWhjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzdF9haGNpX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBkcnZfZGF0YS0+aHByaXY7CisJaW50IGVycjsKKworCWVyciA9IGFoY2lfcGxhdGZvcm1fZW5hYmxlX3Jlc291cmNlcyhocHJpdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHN0X2FoY2lfZGVhc3NlcnRfcmVzZXRzKGRldik7CisJaWYgKGVycikgeworCQlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzdF9haGNpX3BtX29wcywgc3RfYWhjaV9zdXNwZW5kLCBzdF9haGNpX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X2FoY2lfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0LGFoY2kiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0X2FoY2lfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdF9haGNpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzdF9haGNpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzdF9haGNpX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHN0X2FoY2lfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gc3RfYWhjaV9wcm9iZSwKKwkucmVtb3ZlID0gYXRhX3BsYXRmb3JtX3JlbW92ZV9vbmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdF9haGNpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRyZSBUb3JndWUgPGFsZXhhbmRyZS50b3JndWVAc3QuY29tPiIpOworTU9EVUxFX0FVVEhPUigiRnJhbmNlc2NvIFZpcmxpbnppIDxmcmFuY2VzY28udmlybGluemlAc3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE1pY3JvZWxlY3Ryb25pY3MgU0FUQSBBSENJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaV9zdW54aS5jIGIvZHJpdmVycy9hdGEvYWhjaV9zdW54aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDNmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9haGNpX3N1bnhpLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBBbGx3aW5uZXIgc3VueGkgQUhDSSBTQVRBIHBsYXRmb3JtIGRyaXZlcgorICogQ29weXJpZ2h0IDIwMTMgT2xsaXZlciBTY2hpbmFnbCA8b2xpdmVyQHNjaGluYWdsLm5sPgorICogQ29weXJpZ2h0IDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgQUhDSSBTQVRBIHBsYXRmb3JtIGRyaXZlciBieSBKZWZmIEdhcnppayBhbmQgQW50b24gVm9yb250c292CisgKiBCYXNlZCBvbiBjb2RlIGZyb20gQWxsd2lubmVyIFRlY2hub2xvZ3kgQ28uLCBMdGQuIDx3d3cuYWxsd2lubmVydGVjaC5jb20+LAorICogRGFuaWVsIFdhbmcgPGRhbmllbHdhbmdAYWxsd2lubmVydGVjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgImFoY2kuaCIKKworI2RlZmluZSBBSENJX0JJU1RBRlIJMHgwMGEwCisjZGVmaW5lIEFIQ0lfQklTVENSCTB4MDBhNAorI2RlZmluZSBBSENJX0JJU1RGQ1RSCTB4MDBhOAorI2RlZmluZSBBSENJX0JJU1RTUgkweDAwYWMKKyNkZWZpbmUgQUhDSV9CSVNUREVDUgkweDAwYjAKKyNkZWZpbmUgQUhDSV9ESUFHTlIwCTB4MDBiNAorI2RlZmluZSBBSENJX0RJQUdOUjEJMHgwMGI4CisjZGVmaW5lIEFIQ0lfT09CUgkweDAwYmMKKyNkZWZpbmUgQUhDSV9QSFlDUzBSCTB4MDBjMAorI2RlZmluZSBBSENJX1BIWUNTMVIJMHgwMGM0CisjZGVmaW5lIEFIQ0lfUEhZQ1MyUgkweDAwYzgKKyNkZWZpbmUgQUhDSV9USU1FUjFNUwkweDAwZTAKKyNkZWZpbmUgQUhDSV9HUEFSQU0xUgkweDAwZTgKKyNkZWZpbmUgQUhDSV9HUEFSQU0yUgkweDAwZWMKKyNkZWZpbmUgQUhDSV9QUEFSQU1SCTB4MDBmMAorI2RlZmluZSBBSENJX1RFU1RSCTB4MDBmNAorI2RlZmluZSBBSENJX1ZFUlNJT05SCTB4MDBmOAorI2RlZmluZSBBSENJX0lEUgkweDAwZmMKKyNkZWZpbmUgQUhDSV9SV0NSCTB4MDBmYworI2RlZmluZSBBSENJX1AwRE1BQ1IJMHgwMTcwCisjZGVmaW5lIEFIQ0lfUDBQSFlDUgkweDAxNzgKKyNkZWZpbmUgQUhDSV9QMFBIWVNSCTB4MDE3YworCitzdGF0aWMgdm9pZCBzdW54aV9jbHJiaXRzKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgY2xyX3ZhbCkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSByZWFkbChyZWcpOworCXJlZ192YWwgJj0gfihjbHJfdmFsKTsKKwl3cml0ZWwocmVnX3ZhbCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3VueGlfc2V0Yml0cyh2b2lkIF9faW9tZW0gKnJlZywgdTMyIHNldF92YWwpCit7CisJdTMyIHJlZ192YWw7CisKKwlyZWdfdmFsID0gcmVhZGwocmVnKTsKKwlyZWdfdmFsIHw9IHNldF92YWw7CisJd3JpdGVsKHJlZ192YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1bnhpX2NscnNldGJpdHModm9pZCBfX2lvbWVtICpyZWcsIHUzMiBjbHJfdmFsLCB1MzIgc2V0X3ZhbCkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSByZWFkbChyZWcpOworCXJlZ192YWwgJj0gfihjbHJfdmFsKTsKKwlyZWdfdmFsIHw9IHNldF92YWw7CisJd3JpdGVsKHJlZ192YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB1MzIgc3VueGlfZ2V0Yml0cyh2b2lkIF9faW9tZW0gKnJlZywgdTggbWFzaywgdTggc2hpZnQpCit7CisJcmV0dXJuIChyZWFkbChyZWcpID4+IHNoaWZ0KSAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9zdW54aV9waHlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UpCit7CisJdTMyIHJlZ192YWw7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBUaGlzIG1hZ2ljIGlzIGZyb20gdGhlIG9yaWdpbmFsIGNvZGUgKi8KKwl3cml0ZWwoMCwgcmVnX2Jhc2UgKyBBSENJX1JXQ1IpOworCW1zbGVlcCg1KTsKKworCXN1bnhpX3NldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMVIsIEJJVCgxOSkpOworCXN1bnhpX2NscnNldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMFIsCisJCQkgKDB4NyA8PCAyNCksCisJCQkgKDB4NSA8PCAyNCkgfCBCSVQoMjMpIHwgQklUKDE4KSk7CisJc3VueGlfY2xyc2V0Yml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MxUiwKKwkJCSAoMHgzIDw8IDE2KSB8ICgweDFmIDw8IDgpIHwgKDB4MyA8PCA2KSwKKwkJCSAoMHgyIDw8IDE2KSB8ICgweDYgPDwgOCkgfCAoMHgyIDw8IDYpKTsKKwlzdW54aV9zZXRiaXRzKHJlZ19iYXNlICsgQUhDSV9QSFlDUzFSLCBCSVQoMjgpIHwgQklUKDE1KSk7CisJc3VueGlfY2xyYml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MxUiwgQklUKDE5KSk7CisJc3VueGlfY2xyc2V0Yml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MwUiwKKwkJCSAoMHg3IDw8IDIwKSwgKDB4MyA8PCAyMCkpOworCXN1bnhpX2NscnNldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMlIsCisJCQkgKDB4MWYgPDwgNSksICgweDE5IDw8IDUpKTsKKwltc2xlZXAoNSk7CisKKwlzdW54aV9zZXRiaXRzKHJlZ19iYXNlICsgQUhDSV9QSFlDUzBSLCAoMHgxIDw8IDE5KSk7CisKKwl0aW1lb3V0ID0gMjUwOyAvKiBQb3dlciB1cCB0YWtlcyBhcHJveCA1MCB1cyAqLworCWRvIHsKKwkJcmVnX3ZhbCA9IHN1bnhpX2dldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMFIsIDB4NywgMjgpOworCQlpZiAocmVnX3ZhbCA9PSAweDAyKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tdGltZW91dCA9PSAwKSB7CisJCQlkZXZfZXJyKGRldiwgIlBIWSBwb3dlciB1cCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgxKTsKKworCXN1bnhpX3NldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMlIsICgweDEgPDwgMjQpKTsKKworCXRpbWVvdXQgPSAxMDA7IC8qIENhbGlicmF0aW9uIHRha2VzIGFwcm94IDEwIHVzICovCisJZG8geworCQlyZWdfdmFsID0gc3VueGlfZ2V0Yml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MyUiwgMHgxLCAyNCk7CisJCWlmIChyZWdfdmFsID09IDB4MDApCisJCQlicmVhazsKKworCQlpZiAoLS10aW1lb3V0ID09IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiUEhZIGNhbGlicmF0aW9uIGZhaWxlZC5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJdWRlbGF5KDEpOworCX0gd2hpbGUgKDEpOworCisJbXNsZWVwKDE1KTsKKworCXdyaXRlbCgweDcsIHJlZ19iYXNlICsgQUhDSV9SV0NSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaGNpX3N1bnhpX3N0YXJ0X2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCisJLyogU2V0dXAgRE1BIGJlZm9yZSBETUEgc3RhcnQgKi8KKwlzdW54aV9jbHJzZXRiaXRzKGhwcml2LT5tbWlvICsgQUhDSV9QMERNQUNSLCAweDAwMDBmZjAwLCAweDAwMDA0NDAwKTsKKworCS8qIFN0YXJ0IERNQSAqLworCXN1bnhpX3NldGJpdHMocG9ydF9tbWlvICsgUE9SVF9DTUQsIFBPUlRfQ01EX1NUQVJUKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGFoY2lfc3VueGlfcG9ydF9pbmZvID0geworCUFIQ0lfSEZMQUdTKEFIQ0lfSEZMQUdfMzJCSVRfT05MWSB8IEFIQ0lfSEZMQUdfTk9fTVNJIHwKKwkJCSAgQUhDSV9IRkxBR19OT19QTVAgfCBBSENJX0hGTEFHX1lFU19OQ1EpLAorCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OIHwgQVRBX0ZMQUdfTkNRLAorCS5waW9fbWFzawk9IEFUQV9QSU80LAorCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCisJLnBvcnRfb3BzCT0gJmFoY2lfcGxhdGZvcm1fb3BzLAorfTsKKworc3RhdGljIGludCBhaGNpX3N1bnhpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OworCWludCByYzsKKworCWhwcml2ID0gYWhjaV9wbGF0Zm9ybV9nZXRfcmVzb3VyY2VzKHBkZXYpOworCWlmIChJU19FUlIoaHByaXYpKQorCQlyZXR1cm4gUFRSX0VSUihocHJpdik7CisKKwlocHJpdi0+c3RhcnRfZW5naW5lID0gYWhjaV9zdW54aV9zdGFydF9lbmdpbmU7CisKKwlyYyA9IGFoY2lfcGxhdGZvcm1fZW5hYmxlX3Jlc291cmNlcyhocHJpdik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGFoY2lfc3VueGlfcGh5X2luaXQoZGV2LCBocHJpdi0+bW1pbyk7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCisJcmMgPSBhaGNpX3BsYXRmb3JtX2luaXRfaG9zdChwZGV2LCBocHJpdiwgJmFoY2lfc3VueGlfcG9ydF9pbmZvLCAwLCAwKTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9yZXNvdXJjZXM6CisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGFoY2lfc3VueGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCWludCByYzsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gYWhjaV9zdW54aV9waHlfaW5pdChkZXYsIGhwcml2LT5tbWlvKTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlyYyA9IGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3QoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9yZXNvdXJjZXM6CisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhaGNpX3N1bnhpX3BtX29wcywgYWhjaV9wbGF0Zm9ybV9zdXNwZW5kLAorCQkJIGFoY2lfc3VueGlfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWhjaV9zdW54aV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1haGNpIiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWhjaV9zdW54aV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFoY2lfc3VueGlfZHJpdmVyID0geworCS5wcm9iZSA9IGFoY2lfc3VueGlfcHJvYmUsCisJLnJlbW92ZSA9IGF0YV9wbGF0Zm9ybV9yZW1vdmVfb25lLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFoY2ktc3VueGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gYWhjaV9zdW54aV9vZl9tYXRjaCwKKwkJLnBtID0gJmFoY2lfc3VueGlfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhaGNpX3N1bnhpX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIHN1bnhpIEFIQ0kgU0FUQSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk9sbGl2ZXIgU2NoaW5hZ2wgPG9saXZlckBzY2hpbmFnbC5ubD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfeGdlbmUuYyBiL2RyaXZlcnMvYXRhL2FoY2lfeGdlbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M4OWJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGEvYWhjaV94Z2VuZS5jCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQXBwbGllZE1pY3JvIFgtR2VuZSBTb0MgU0FUQSBIb3N0IENvbnRyb2xsZXIgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IExvYyBIbyA8bGhvQGFwbS5jb20+CisgKiAgICAgICAgIFR1YW4gUGhhbiA8dHBoYW5AYXBtLmNvbT4KKyAqICAgICAgICAgU3VtYW4gVHJpcGF0aGkgPHN0cmlwYXRoaUBhcG0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogTk9URTogUE0gc3VwcG9ydCBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlICJhaGNpLmgiCisKKy8qIE1heCAjIG9mIGRpc2sgcGVyIGEgY29udHJvbGxlciAqLworI2RlZmluZSBNQVhfQUhDSV9DSE5fUEVSQ1RSCQkyCisKKy8qIE1VWCBDU1IgKi8KKyNkZWZpbmUgU0FUQV9FTkVUX0NPTkZJR19SRUcJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIENGR19TQVRBX0VORVRfU0VMRUNUX01BU0sJMHgwMDAwMDAwMQorCisvKiBTQVRBIGNvcmUgaG9zdCBjb250cm9sbGVyIENTUiAqLworI2RlZmluZSBTTFZSREVSUkFUVFJJQlVURVMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU0xWV1JFUlJBVFRSSUJVVEVTCQkweDAwMDAwMDA0CisjZGVmaW5lIE1TVFJERVJSQVRUUklCVVRFUwkJMHgwMDAwMDAwOAorI2RlZmluZSBNU1RXUkVSUkFUVFJJQlVURVMJCTB4MDAwMDAwMGMKKyNkZWZpbmUgQlVTQ1RMUkVHCQkJMHgwMDAwMDAxNAorI2RlZmluZSBJT0ZNU1RSV0FVWAkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgSU5UU1RBVFVTTUFTSwkJCTB4MDAwMDAwMmMKKyNkZWZpbmUgRVJSSU5UU1RBVFVTCQkJMHgwMDAwMDAzMAorI2RlZmluZSBFUlJJTlRTVEFUVVNNQVNLCQkweDAwMDAwMDM0CisKKy8qIFNBVEEgaG9zdCBBSENJIENTUiAqLworI2RlZmluZSBQT1JUQ0ZHCQkJCTB4MDAwMDAwYTQKKyNkZWZpbmUgIFBPUlRBRERSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2YpIHwgKCgodTMyKShzcmMpKSAmIDB4MDAwMDAwM2YpKQorI2RlZmluZSBQT1JUUEhZMUNGRwkJMHgwMDAwMDBhOAorI2RlZmluZSBQT1JUUEhZMUNGR19GUkNQSFlSRFlfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDEwMDAwMCkgfCAoKCh1MzIpKHNyYykgPDwgMHgxNCkgJiAweDAwMTAwMDAwKSkKKyNkZWZpbmUgUE9SVFBIWTJDRkcJCQkweDAwMDAwMGFjCisjZGVmaW5lIFBPUlRQSFkzQ0ZHCQkJMHgwMDAwMDBiMAorI2RlZmluZSBQT1JUUEhZNENGRwkJCTB4MDAwMDAwYjQKKyNkZWZpbmUgUE9SVFBIWTVDRkcJCQkweDAwMDAwMGI4CisjZGVmaW5lIFNDVEwwCQkJCTB4MDAwMDAxMkMKKyNkZWZpbmUgUE9SVFBIWTVDRkdfUlRDSEdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHhmZmYwMDAwMCkgfCAoKCh1MzIpKHNyYykgPDwgMHgxNCkgJiAweGZmZjAwMDAwKSkKKyNkZWZpbmUgUE9SVEFYSUNGR19FTl9DT05URVhUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDEwMDAwMDApIHwgKCgodTMyKShzcmMpIDw8IDB4MTgpICYgMHgwMTAwMDAwMCkpCisjZGVmaW5lIFBPUlRBWElDRkcJCQkweDAwMDAwMGJjCisjZGVmaW5lIFBPUlRBWElDRkdfT1VUVFJBTlNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMGYwMDAwMCkgfCAoKCh1MzIpKHNyYykgPDwgMHgxNCkgJiAweDAwZjAwMDAwKSkKKworLyogU0FUQSBob3N0IGNvbnRyb2xsZXIgQVhJIENTUiAqLworI2RlZmluZSBJTlRfU0xWX1RNT01BU0sJCQkweDAwMDAwMDEwCisKKy8qIFNBVEEgZGlhZ25vc3RpYyBDU1IgKi8KKyNkZWZpbmUgQ0ZHX01FTV9SQU1fU0hVVERPV04JCTB4MDAwMDAwNzAKKyNkZWZpbmUgQkxPQ0tfTUVNX1JEWQkJCTB4MDAwMDAwNzQKKworc3RydWN0IHhnZW5lX2FoY2lfY29udGV4dCB7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpjc3JfY29yZTsJCS8qIENvcmUgQ1NSIGFkZHJlc3Mgb2YgSVAgKi8KKwl2b2lkIF9faW9tZW0gKmNzcl9kaWFnOwkJLyogRGlhZyBDU1IgYWRkcmVzcyBvZiBJUCAqLworCXZvaWQgX19pb21lbSAqY3NyX2F4aTsJCS8qIEFYSSBDU1IgYWRkcmVzcyBvZiBJUCAqLworCXZvaWQgX19pb21lbSAqY3NyX211eDsJCS8qIE1VWCBDU1IgYWRkcmVzcyBvZiBJUCAqLworfTsKKworc3RhdGljIGludCB4Z2VuZV9haGNpX2luaXRfbWVtcmFtKHN0cnVjdCB4Z2VuZV9haGNpX2NvbnRleHQgKmN0eCkKK3sKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVsZWFzZSBtZW1vcnkgZnJvbSBzaHV0ZG93blxuIik7CisJd3JpdGVsKDB4MCwgY3R4LT5jc3JfZGlhZyArIENGR19NRU1fUkFNX1NIVVRET1dOKTsKKwlyZWFkbChjdHgtPmNzcl9kaWFnICsgQ0ZHX01FTV9SQU1fU0hVVERPV04pOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwltc2xlZXAoMSk7CS8qIHJlc2V0IG1heSB0YWtlIHVwIHRvIDFtcyAqLworCWlmIChyZWFkbChjdHgtPmNzcl9kaWFnICsgQkxPQ0tfTUVNX1JEWSkgIT0gMHhGRkZGRkZGRikgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiZmFpbGVkIHRvIHJlbGVhc2UgbWVtb3J5IGZyb20gc2h1dGRvd25cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeGdlbmVfYWhjaV9yZWFkX2lkIC0gUmVhZCBJRCBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAqIEBkZXY6IGRldmljZQorICogQHRmOiBwcm9wb3NlZCB0YXNrZmlsZQorICogQGlkOiBkYXRhIGJ1ZmZlcgorICoKKyAqIFRoaXMgY3VzdG9tIHJlYWQgSUQgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIEhXCisgKiBkb2VzIG5vdCBzdXBwb3J0IERFVlNMUCBhbmQgdGhlIGNvbnRyb2xsZXIgc3RhdGUgbWFjaGluZSBtYXkgZ2V0IHN0dWNrCisgKiBhZnRlciBwcm9jZXNzaW5nIHRoZSBJRCBxdWVyeSBjb21tYW5kLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHhnZW5lX2FoY2lfcmVhZF9pZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTE2ICppZCkKK3sKKwl1MzIgZXJyX21hc2s7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShkZXYtPmxpbmstPmFwKTsKKworCWVycl9tYXNrID0gYXRhX2RvX2Rldl9yZWFkX2lkKGRldiwgdGYsIGlkKTsKKwlpZiAoZXJyX21hc2spCisJCXJldHVybiBlcnJfbWFzazsKKworCS8qCisJICogTWFzayByZXNlcnZlZCBhcmVhLiBXb3JkNzggc3BlYyBvZiBMaW5rIFBvd2VyIE1hbmFnZW1lbnQKKwkgKiBiaXQxNS04OiByZXNlcnZlZAorCSAqIGJpdDc6IE5DUSBhdXRvc2VuY2UKKwkgKiBiaXQ2OiBTb2Z0d2FyZSBzZXR0aW5ncyBwcmVzZXJ2YXRpb24gc3VwcG9ydGVkCisJICogYml0NTogcmVzZXJ2ZWQKKwkgKiBiaXQ0OiBJbi1vcmRlciBzYXRhIGRlbGl2ZXJ5IHN1cHBvcnRlZAorCSAqIGJpdDM6IERJUE0gcmVxdWVzdHMgc3VwcG9ydGVkCisJICogYml0MjogRE1BIFNldHVwIEZJUyBBdXRvLUFjdGl2YXRlIG9wdGltaXphdGlvbiBzdXBwb3J0ZWQKKwkgKiBiaXQxOiBETUEgU2V0dXAgRklYIG5vbi1aZXJvIGJ1ZmZlciBvZmZzZXRzIHN1cHBvcnRlZAorCSAqIGJpdDA6IFJlc2VydmVkCisJICoKKwkgKiBDbGVhciByZXNlcnZlZCBiaXQgOCAoREVWU0xQIGJpdCkgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBERVZTTFAKKwkgKi8KKwlpZFtBVEFfSURfRkVBVFVSRV9TVVBQXSAmPSB+KDEgPDwgOCk7CisKKwkvKgorCSAqIER1ZSB0byBIVyBlcnJhdGEsIHJlc3RhcnQgdGhlIHBvcnQgaWYgbm8gb3RoZXIgY29tbWFuZCBhY3RpdmUuCisJICogT3RoZXJ3aXNlIHRoZSBjb250cm9sbGVyIG1heSBnZXQgc3R1Y2suCisJICovCisJaWYgKCFyZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSkpIHsKKwkJd3JpdGVsKFBPUlRfQ01EX0ZJU19SWCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlyZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7CS8qIEZvcmNlIGEgYmFycmllciAqLworCQl3cml0ZWwoUE9SVF9DTURfRklTX1JYIHwgUE9SVF9DTURfU1RBUlQsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2FoY2lfc2V0X3BoeV9jZmcoc3RydWN0IHhnZW5lX2FoY2lfY29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBjdHgtPmhwcml2LT5tbWlvOworCXUzMiB2YWw7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAicG9ydCBjb25maWd1cmUgbW1pbyAweCVwIGNoYW5uZWwgJWRcbiIsCisJCW1taW8sIGNoYW5uZWwpOworCXZhbCA9IHJlYWRsKG1taW8gKyBQT1JUQ0ZHKTsKKwl2YWwgPSBQT1JUQUREUl9TRVQodmFsLCBjaGFubmVsID09IDAgPyAyIDogMyk7CisJd3JpdGVsKHZhbCwgbW1pbyArIFBPUlRDRkcpOworCXJlYWRsKG1taW8gKyBQT1JUQ0ZHKTsgIC8qIEZvcmNlIGEgYmFycmllciAqLworCS8qIERpc2FibGUgZml4IHJhdGUgKi8KKwl3cml0ZWwoMHgwMDAxZmZmZSwgbW1pbyArIFBPUlRQSFkxQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTFDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHg1MDE4NDYxYywgbW1pbyArIFBPUlRQSFkyQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTJDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHgxYzA4MTkwNywgbW1pbyArIFBPUlRQSFkzQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTNDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHgxYzA4MDgxNSwgbW1pbyArIFBPUlRQSFk0Q0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTRDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwkvKiBTZXQgd2luZG93IG5lZ290aWF0aW9uICovCisJdmFsID0gcmVhZGwobW1pbyArIFBPUlRQSFk1Q0ZHKTsKKwl2YWwgPSBQT1JUUEhZNUNGR19SVENIR19TRVQodmFsLCAweDMwMCk7CisJd3JpdGVsKHZhbCwgbW1pbyArIFBPUlRQSFk1Q0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTVDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl2YWwgPSByZWFkbChtbWlvICsgUE9SVEFYSUNGRyk7CisJdmFsID0gUE9SVEFYSUNGR19FTl9DT05URVhUX1NFVCh2YWwsIDB4MSk7IC8qIEVuYWJsZSBjb250ZXh0IG1nbXQgKi8KKwl2YWwgPSBQT1JUQVhJQ0ZHX09VVFRSQU5TX1NFVCh2YWwsIDB4ZSk7IC8qIFNldCBvdXRzdGFuZGluZyAqLworCXdyaXRlbCh2YWwsIG1taW8gKyBQT1JUQVhJQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVEFYSUNGRyk7IC8qIEZvcmNlIGEgYmFycmllciAqLworfQorCisvKioKKyAqIHhnZW5lX2FoY2lfZG9faGFyZHJlc2V0IC0gSXNzdWUgdGhlIGFjdHVhbCBDT01SRVNFVAorICogQGxpbms6IGxpbmsgdG8gcmVzZXQKKyAqIEBkZWFkbGluZTogZGVhZGxpbmUgamlmZmllcyBmb3IgdGhlIG9wZXJhdGlvbgorICogQG9ubGluZTogUmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIGlmIGRldmljZSBvbmxpbmUKKyAqCisgKiBEdWUgdG8gdGhlIGxpbWl0YXRpb24gb2YgdGhlIGhhcmR3YXJlIFBIWSwgYSBkaWZmZXJlbmNlIHNldCBvZiBzZXR0aW5nIGlzCisgKiByZXF1aXJlZCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGlzayBzcGVlZCAtIEdlbjMgKDYuMEdicHMpLCBHZW4yICgzLjBHYnBzKSwKKyAqIGFuZCBHZW4xICgxLjVHYnBzKS4gT3RoZXJ3aXNlIGR1cmluZyBsb25nIElPIHN0cmVzcyB0ZXN0LCB0aGUgUEhZIHdpbGwKKyAqIHJlcG9ydCBkaXNwYXJpdHkgZXJyb3IgYW5kIGV0Yy4gSW4gYWRkaXRpb24sIGR1cmluZyBDT01SRVNFVCwgdGhlcmUgY2FuCisgKiBiZSBlcnJvciByZXBvcnRlZCBpbiB0aGUgcmVnaXN0ZXIgUE9SVF9TQ1JfRVJSLiBGb3IgU0VSUl9ESVNQQVJJVFkgYW5kCisgKiBTRVJSXzEwQl84Ql9FUlIsIHRoZSBQSFkgcmVjZWl2ZXIgbGluZSBtdXN0IGJlIHJlc2V0ZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGFsZ29yaXRobSBpcyBmb2xsb3dlZCB0byBwcm9wZXIgY29uZmlndXJlIHRoZSBoYXJkd2FyZSBQSFkgZHVyaW5nIENPTVJFU0VUOgorICoKKyAqIEFsZyBQYXJ0IDE6CisgKiAxLiBTdGFydCB0aGUgUEhZIGF0IEdlbjMgc3BlZWQgKGRlZmF1bHQgc2V0dGluZykKKyAqIDIuIElzc3VlIHRoZSBDT01SRVNFVAorICogMy4gSWYgbm8gbGluaywgZ28gdG8gQWxnIFBhcnQgMworICogNC4gSWYgbGluayB1cCwgZGV0ZXJtaW5lIGlmIHRoZSBuZWdvdGlhdGVkIHNwZWVkIG1hdGNoZXMgdGhlIFBIWQorICogICAgY29uZmlndXJlZCBzcGVlZAorICogNS4gSWYgdGhleSBtYXRjaGVkLCBnbyB0byBBbGcgUGFydCAyCisgKiA2LiBJZiB0aGV5IGRvIG5vdCBtYXRjaGVkIGFuZCBmaXJzdCB0aW1lLCBjb25maWd1cmUgdGhlIFBIWSBmb3IgdGhlIGxpbmtlZAorICogICAgdXAgZGlzayBzcGVlZCBhbmQgcmVwZWF0IHN0ZXAgMgorICogNy4gR28gdG8gQWxnIFBhcnQgMgorICoKKyAqIEFsZyBQYXJ0IDI6CisgKiAxLiBPbiBsaW5rIHVwLCBpZiB0aGVyZSBhcmUgYW55IFNFUlJfRElTUEFSSVRZIGFuZCBTRVJSXzEwQl84Ql9FUlIgZXJyb3IKKyAqICAgIHJlcG9ydGVkIGluIHRoZSByZWdpc3RlciBQT1JUX1NDUl9FUlIsIHRoZW4gcmVzZXQgdGhlIFBIWSByZWNlaXZlciBsaW5lCisgKiAyLiBHbyB0byBBbGcgUGFydCAzCisgKgorICogQWxnIFBhcnQgMzoKKyAqIDEuIENsZWFyIGFueSBwZW5kaW5nIGZyb20gcmVnaXN0ZXIgUE9SVF9TQ1JfRVJSLgorICoKKyAqIE5PVEU6IEZvciB0aGUgaW5pdGlhbCB2ZXJzaW9uLCB3ZSB3aWxsIE5PVCBzdXBwb3J0IEdlbjEvR2VuMi4gSW4gYWRkaXRpb24KKyAqICAgICAgIGFuZCB1bnRpbCB0aGUgdW5kZXJseWluZyBQSFkgc3VwcG9ydHMgYW4gbWV0aG9kIHRvIHJlc2V0IHRoZSByZWNlaXZlcgorICogICAgICAgbGluZSwgb24gZGV0ZWN0aW9uIG9mIFNFUlJfRElTUEFSSVRZIG9yIFNFUlJfMTBCXzhCX0VSUiBlcnJvcnMsCisgKiAgICAgICBhbiB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkLgorICovCitzdGF0aWMgaW50IHhnZW5lX2FoY2lfZG9faGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCQkgICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lLCBib29sICpvbmxpbmUpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nID0gc2F0YV9laGNfZGViX3RpbWluZygmbGluay0+ZWhfY29udGV4dCk7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB4Z2VuZV9haGNpX2NvbnRleHQgKmN0eCA9IGhwcml2LT5wbGF0X2RhdGE7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdTggKmQyaF9maXMgPSBwcC0+cnhfZmlzICsgUlhfRklTX0QySF9SRUc7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKwlpbnQgcmM7CisJdTMyIHZhbDsKKworCS8qIGNsZWFyIEQySCByZWNlcHRpb24gYXJlYSB0byBwcm9wZXJseSB3YWl0IGZvciBEMkggRklTICovCisJYXRhX3RmX2luaXQobGluay0+ZGV2aWNlLCAmdGYpOworCXRmLmNvbW1hbmQgPSBBVEFfQlVTWTsKKwlhdGFfdGZfdG9fZmlzKCZ0ZiwgMCwgMCwgZDJoX2Zpcyk7CisJcmMgPSBzYXRhX2xpbmtfaGFyZHJlc2V0KGxpbmssIHRpbWluZywgZGVhZGxpbmUsIG9ubGluZSwKKwkJCQkgYWhjaV9jaGVja19yZWFkeSk7CisKKwl2YWwgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpOworCWlmICh2YWwgJiAoU0VSUl9ESVNQQVJJVFkgfCBTRVJSXzEwQl84Ql9FUlIpKQorCQlkZXZfd2FybihjdHgtPmRldiwgImxpbmsgaGFzIGVycm9yXG4iKTsKKworCS8qIGNsZWFyIGFsbCBlcnJvcnMgaWYgYW55IHBlbmRpbmcgKi8KKwl2YWwgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpOworCXdyaXRlbCh2YWwsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9oYXJkcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzLAorCQkJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOworICAgICAgICBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKKwlib29sIG9ubGluZTsKKwlpbnQgcmM7CisJdTMyIHBvcnRjbWRfc2F2ZWQ7CisJdTMyIHBvcnRjbGJfc2F2ZWQ7CisJdTMyIHBvcnRjbGJoaV9zYXZlZDsKKwl1MzIgcG9ydHJ4ZmlzX3NhdmVkOworCXUzMiBwb3J0cnhmaXNoaV9zYXZlZDsKKworCS8qIEFzIGhhcmRyZXNldCByZXNldHMgdGhlc2UgQ1NSLCBzYXZlIGl0IHRvIHJlc3RvcmUgbGF0ZXIgKi8KKwlwb3J0Y21kX3NhdmVkID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXBvcnRjbGJfc2F2ZWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsKKwlwb3J0Y2xiaGlfc2F2ZWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSX0hJKTsKKwlwb3J0cnhmaXNfc2F2ZWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsKKwlwb3J0cnhmaXNoaV9zYXZlZCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfRklTX0FERFJfSEkpOworCisJYWhjaV9zdG9wX2VuZ2luZShhcCk7CisKKwlyYyA9IHhnZW5lX2FoY2lfZG9faGFyZHJlc2V0KGxpbmssIGRlYWRsaW5lLCAmb25saW5lKTsKKworCS8qIEFzIGNvbnRyb2xsZXIgaGFyZHJlc2V0IGNsZWFycyB0aGVtLCByZXN0b3JlIHRoZW0gKi8KKwl3cml0ZWwocG9ydGNtZF9zYXZlZCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXdyaXRlbChwb3J0Y2xiX3NhdmVkLCBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsKKwl3cml0ZWwocG9ydGNsYmhpX3NhdmVkLCBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSX0hJKTsKKwl3cml0ZWwocG9ydHJ4ZmlzX3NhdmVkLCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsKKwl3cml0ZWwocG9ydHJ4ZmlzaGlfc2F2ZWQsIHBvcnRfbW1pbyArIFBPUlRfRklTX0FERFJfSEkpOworCisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CisKKwlpZiAob25saW5lKQorCQkqY2xhc3MgPSBhaGNpX2Rldl9jbGFzc2lmeShhcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2FoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyB4Z2VuZV9haGNpX29wcyA9IHsKKwkuaW5oZXJpdHMgPSAmYWhjaV9vcHMsCisJLmhvc3Rfc3RvcCA9IHhnZW5lX2FoY2lfaG9zdF9zdG9wLAorCS5oYXJkcmVzZXQgPSB4Z2VuZV9haGNpX2hhcmRyZXNldCwKKwkucmVhZF9pZCA9IHhnZW5lX2FoY2lfcmVhZF9pZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB4Z2VuZV9haGNpX3BvcnRfaW5mbyA9IHsKKwlBSENJX0hGTEFHUyhBSENJX0hGTEFHX05PX1BNUCB8IEFIQ0lfSEZMQUdfWUVTX05DUSksCisJLmZsYWdzID0gQUhDSV9GTEFHX0NPTU1PTiB8IEFUQV9GTEFHX05DUSwKKwkucGlvX21hc2sgPSBBVEFfUElPNCwKKwkudWRtYV9tYXNrID0gQVRBX1VETUE2LAorCS5wb3J0X29wcyA9ICZ4Z2VuZV9haGNpX29wcywKK307CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9od19pbml0KHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYpCit7CisJc3RydWN0IHhnZW5lX2FoY2lfY29udGV4dCAqY3R4ID0gaHByaXYtPnBsYXRfZGF0YTsKKwlpbnQgaTsKKwlpbnQgcmM7CisJdTMyIHZhbDsKKworCS8qIFJlbW92ZSBJUCBSQU0gb3V0IG9mIHNodXRkb3duICovCisJcmMgPSB4Z2VuZV9haGNpX2luaXRfbWVtcmFtKGN0eCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FIQ0lfQ0hOX1BFUkNUUjsgaSsrKQorCQl4Z2VuZV9haGNpX3NldF9waHlfY2ZnKGN0eCwgaSk7CisKKwkvKiBBWEkgZGlzYWJsZSBNYXNrICovCisJd3JpdGVsKDB4ZmZmZmZmZmYsIGhwcml2LT5tbWlvICsgSE9TVF9JUlFfU1RBVCk7CisJcmVhZGwoaHByaXYtPm1taW8gKyBIT1NUX0lSUV9TVEFUKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJd3JpdGVsKDAsIGN0eC0+Y3NyX2NvcmUgKyBJTlRTVEFUVVNNQVNLKTsKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9jb3JlICsgSU5UU1RBVFVTTUFTSyk7IC8qIEZvcmNlIGEgYmFycmllciAqLworCWRldl9kYmcoY3R4LT5kZXYsICJ0b3AgbGV2ZWwgaW50ZXJydXB0IG1hc2sgMHglWCB2YWx1ZSAweCUwOFhcbiIsCisJCUlOVFNUQVRVU01BU0ssIHZhbCk7CisKKwl3cml0ZWwoMHgwLCBjdHgtPmNzcl9jb3JlICsgRVJSSU5UU1RBVFVTTUFTSyk7CisJcmVhZGwoY3R4LT5jc3JfY29yZSArIEVSUklOVFNUQVRVU01BU0spOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHgwLCBjdHgtPmNzcl9heGkgKyBJTlRfU0xWX1RNT01BU0spOworCXJlYWRsKGN0eC0+Y3NyX2F4aSArIElOVF9TTFZfVE1PTUFTSyk7CisKKwkvKiBFbmFibGUgQVhJIEludGVycnVwdCAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBjdHgtPmNzcl9jb3JlICsgU0xWUkRFUlJBVFRSSUJVVEVTKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgY3R4LT5jc3JfY29yZSArIFNMVldSRVJSQVRUUklCVVRFUyk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIGN0eC0+Y3NyX2NvcmUgKyBNU1RSREVSUkFUVFJJQlVURVMpOworCXdyaXRlbCgweGZmZmZmZmZmLCBjdHgtPmNzcl9jb3JlICsgTVNUV1JFUlJBVFRSSUJVVEVTKTsKKworCS8qIEVuYWJsZSBjb2hlcmVuY3kgKi8KKwl2YWwgPSByZWFkbChjdHgtPmNzcl9jb3JlICsgQlVTQ1RMUkVHKTsKKwl2YWwgJj0gfjB4MDAwMDAwMDI7ICAgICAvKiBFbmFibGUgd3JpdGUgY29oZXJlbmN5ICovCisJdmFsICY9IH4weDAwMDAwMDAxOyAgICAgLyogRW5hYmxlIHJlYWQgY29oZXJlbmN5ICovCisJd3JpdGVsKHZhbCwgY3R4LT5jc3JfY29yZSArIEJVU0NUTFJFRyk7CisKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9jb3JlICsgSU9GTVNUUldBVVgpOworCXZhbCB8PSAoMSA8PCAzKTsgICAgICAgIC8qIEVuYWJsZSByZWFkIGNvaGVyZW5jeSAqLworCXZhbCB8PSAoMSA8PCA5KTsgICAgICAgIC8qIEVuYWJsZSB3cml0ZSBjb2hlcmVuY3kgKi8KKwl3cml0ZWwodmFsLCBjdHgtPmNzcl9jb3JlICsgSU9GTVNUUldBVVgpOworCXZhbCA9IHJlYWRsKGN0eC0+Y3NyX2NvcmUgKyBJT0ZNU1RSV0FVWCk7CisJZGV2X2RiZyhjdHgtPmRldiwgImNvaGVyZW5jeSAweCVYIHZhbHVlIDB4JTA4WFxuIiwKKwkJSU9GTVNUUldBVVgsIHZhbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9tdXhfc2VsZWN0KHN0cnVjdCB4Z2VuZV9haGNpX2NvbnRleHQgKmN0eCkKK3sKKwl1MzIgdmFsOworCisJLyogQ2hlY2sgZm9yIG9wdGlvbmFsIE1VWCByZXNvdXJjZSAqLworCWlmIChJU19FUlIoY3R4LT5jc3JfbXV4KSkKKwkJcmV0dXJuIDA7CisKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9tdXggKyBTQVRBX0VORVRfQ09ORklHX1JFRyk7CisJdmFsICY9IH5DRkdfU0FUQV9FTkVUX1NFTEVDVF9NQVNLOworCXdyaXRlbCh2YWwsIGN0eC0+Y3NyX211eCArIFNBVEFfRU5FVF9DT05GSUdfUkVHKTsKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9tdXggKyBTQVRBX0VORVRfQ09ORklHX1JFRyk7CisJcmV0dXJuIHZhbCAmIENGR19TQVRBX0VORVRfU0VMRUNUX01BU0sgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgeGdlbmVfYWhjaV9jb250ZXh0ICpjdHg7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJjOworCisJaHByaXYgPSBhaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMocGRldik7CisJaWYgKElTX0VSUihocHJpdikpCisJCXJldHVybiBQVFJfRVJSKGhwcml2KTsKKworCWN0eCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJaHByaXYtPnBsYXRfZGF0YSA9IGN0eDsKKwljdHgtPmhwcml2ID0gaHByaXY7CisJY3R4LT5kZXYgPSBkZXY7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSVAgY29yZSByZXNvdXJjZSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJY3R4LT5jc3JfY29yZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihjdHgtPmNzcl9jb3JlKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5jc3JfY29yZSk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSVAgZGlhZ25vc3RpYyByZXNvdXJjZSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJY3R4LT5jc3JfZGlhZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihjdHgtPmNzcl9kaWFnKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5jc3JfZGlhZyk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSVAgQVhJIHJlc291cmNlICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAzKTsKKwljdHgtPmNzcl9heGkgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoY3R4LT5jc3JfYXhpKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5jc3JfYXhpKTsKKworCS8qIFJldHJpZXZlIHRoZSBvcHRpb25hbCBJUCBtdXggcmVzb3VyY2UgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDQpOworCWN0eC0+Y3NyX211eCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisKKwlkZXZfZGJnKGRldiwgIlZBZGRyIDB4JXAgTW1pbyBWQWRkciAweCVwXG4iLCBjdHgtPmNzcl9jb3JlLAorCQlocHJpdi0+bW1pbyk7CisKKwkvKiBTZWxlY3QgQVRBICovCisJaWYgKChyYyA9IHhnZW5lX2FoY2lfbXV4X3NlbGVjdChjdHgpKSkgeworCQlkZXZfZXJyKGRldiwgIlNBVEEgbXV4IHNlbGVjdGlvbiBmYWlsZWQgZXJyb3IgJWRcbiIsIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRHVlIHRvIGVycmF0YSwgSFcgcmVxdWlyZXMgZnVsbCB0b2dnbGUgdHJhbnNpdGlvbiAqLworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfY2xrcyhocHJpdik7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKGhwcml2KTsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwkvKiBDb25maWd1cmUgdGhlIGhvc3QgY29udHJvbGxlciAqLworCXhnZW5lX2FoY2lfaHdfaW5pdChocHJpdik7CisKKwkvKgorCSAqIFNldHVwIERNQSBtYXNrLiBUaGlzIGlzIHByZWxpbWluYXJ5IHVudGlsIHRoZSBETUEgcmFuZ2UgaXMgc29ydGVkCisJICogb3V0LgorCSAqLworCXJjID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBzZXQgZG1hIG1hc2tcbiIpOworCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCX0KKworCXJjID0gYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QocGRldiwgaHByaXYsICZ4Z2VuZV9haGNpX3BvcnRfaW5mbywgMCwgMCk7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCisJZGV2X2RiZyhkZXYsICJYLUdlbmUgU0FUQSBob3N0IGNvbnRyb2xsZXIgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworCitkaXNhYmxlX3Jlc291cmNlczoKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnZW5lX2FoY2lfb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWFoY2kifSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4Z2VuZV9haGNpX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGdlbmVfYWhjaV9kcml2ZXIgPSB7CisJLnByb2JlID0geGdlbmVfYWhjaV9wcm9iZSwKKwkucmVtb3ZlID0gYXRhX3BsYXRmb3JtX3JlbW92ZV9vbmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGdlbmUtYWhjaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB4Z2VuZV9haGNpX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHhnZW5lX2FoY2lfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUE0gWC1HZW5lIEFIQ0kgU0FUQSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxvYyBIbyA8bGhvQGFwbS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC40Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwppbmRleCA3ZDE5NjY1Li45NDk4YTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYWhjaS5jIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCmluZGV4IDM2NjA1YWIuLjZiZDRmNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM5NCw2ICszOTMsOSBAQAogICoKICAqCUlmIGluY29uc2lzdGVudCwgY29uZmlnIHZhbHVlcyBhcmUgZml4ZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4KICAqCisgKglJZiBpdCBpcyBub3Qgc2V0IGFscmVhZHkgdGhpcyBmdW5jdGlvbiBzZXRzIGhwcml2LT5zdGFydF9lbmdpbmUgdG8KKyAqCWFoY2lfc3RhcnRfZW5naW5lLgorICoKICAqCUxPQ0tJTkc6CiAgKglOb25lLgogICovCkBAIC01MDAsNiArNTAyLDkgQEAKIAlocHJpdi0+Y2FwID0gY2FwOwogCWhwcml2LT5jYXAyID0gY2FwMjsKIAlocHJpdi0+cG9ydF9tYXAgPSBwb3J0X21hcDsKKworCWlmICghaHByaXYtPnN0YXJ0X2VuZ2luZSkKKwkJaHByaXYtPnN0YXJ0X2VuZ2luZSA9IGFoY2lfc3RhcnRfZW5naW5lOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9zYXZlX2luaXRpYWxfY29uZmlnKTsKIApAQCAtNzY2LDcgKzc3MSw3IEBACiAKIAkvKiBlbmFibGUgRE1BICovCiAJaWYgKCEoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19ERUxBWV9FTkdJTkUpKQotCQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCiAJLyogdHVybiBvbiBMRURzICovCiAJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0VNKSB7CkBAIC0xMDMyLDEyICsxMDM3LDEzIEBACiBzdGF0aWMgc3NpemVfdCBhaGNpX2xlZF9zdG9yZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBjaGFyICpidWYsCiAJCQkJc2l6ZV90IHNpemUpCiB7Ci0JaW50IHN0YXRlOworCXVuc2lnbmVkIGludCBzdGF0ZTsKIAlpbnQgcG1wOwogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBhaGNpX2VtX3ByaXYgKmVtcDsKIAotCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwlpZiAoa3N0cnRvdWludChidWYsIDAsICZzdGF0ZSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGdldCB0aGUgc2xvdCBudW1iZXIgZnJvbSB0aGUgbWVzc2FnZSAqLwogCXBtcCA9IChzdGF0ZSAmIEVNX01TR19MRURfUE1QX1NMT1QpID4+IDg7CkBAIC0xMjM0LDcgKzEyNDAsNyBAQAogCiAJLyogcmVzdGFydCBlbmdpbmUgKi8KICBvdXRfcmVzdGFydDoKLQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9raWNrX2VuZ2luZSk7CkBAIC0xMzg3LDggKzEzOTMsOCBAQAogCXJldHVybiBhdGFfY2hlY2tfcmVhZHkoc3RhdHVzKTsKIH0KIAotaW50IGFoY2lfcG1wX3JldHJ5X3NvZnRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCi0JCQkJdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3N0YXRpYyBpbnQgYWhjaV9wbXBfcmV0cnlfc29mdHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CkBAIC0xNDI2LDYgKzE0MzIsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRpbWluZyA9IHNhdGFfZWhjX2RlYl90aW1pbmcoJmxpbmstPmVoX2NvbnRleHQpOwogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWJvb2wgb25saW5lOwpAQCAtMTQ0Myw3ICsxNDUwLDcgQEAKIAlyYyA9IHNhdGFfbGlua19oYXJkcmVzZXQobGluaywgdGltaW5nLCBkZWFkbGluZSwgJm9ubGluZSwKIAkJCQkgYWhjaV9jaGVja19yZWFkeSk7CiAKLQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CiAKIAlpZiAob25saW5lKQogCQkqY2xhc3MgPSBhaGNpX2Rldl9jbGFzc2lmeShhcCk7CkBAIC0xNjI5LDcgKzE2MzYsNyBAQAogCX0KIAogCWlmIChpcnFfc3RhdCAmIFBPUlRfSVJRX1VOS19GSVMpIHsKLQkJdTMyICp1bmsgPSAodTMyICopKHBwLT5yeF9maXMgKyBSWF9GSVNfVU5LKTsKKwkJdTMyICp1bmsgPSBwcC0+cnhfZmlzICsgUlhfRklTX1VOSzsKIAogCQlhY3RpdmVfZWhpLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOwogCQlhY3RpdmVfZWhpLT5hY3Rpb24gfD0gQVRBX0VIX1JFU0VUOwpAQCAtMjAwNywxMCArMjAxNCwxMiBAQAogCiB2b2lkIGFoY2lfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogeworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCiAJaWYgKCEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19GUk9aRU4pKSB7CiAJCS8qIHJlc3RhcnQgZW5naW5lICovCiAJCWFoY2lfc3RvcF9lbmdpbmUoYXApOwotCQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCX0KIAogCXNhdGFfcG1wX2Vycm9yX2hhbmRsZXIoYXApOwpAQCAtMjAzMSw2ICsyMDQwLDcgQEAKIAogc3RhdGljIHZvaWQgYWhjaV9zZXRfYWdncmVzc2l2ZV9kZXZzbHAoc3RydWN0IGF0YV9wb3J0ICphcCwgYm9vbCBzbGVlcCkKIHsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gYXAtPmxpbmsuZGV2aWNlOwogCXUzMiBkZXZzbHAsIGRtLCBkaXRvLCBtZGF0LCBkZXRvOwpAQCAtMjA5NCw3ICsyMTA0LDcgQEAKIAkJICAgUE9SVF9ERVZTTFBfQURTRSk7CiAJd3JpdGVsKGRldnNscCwgcG9ydF9tbWlvICsgUE9SVF9ERVZTTFApOwogCi0JYWhjaV9zdGFydF9lbmdpbmUoYXApOworCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCiAJLyogZW5hYmxlIGRldmljZSBzbGVlcCBmZWF0dXJlIGZvciB0aGUgZHJpdmUgKi8KIAllcnJfbWFzayA9IGF0YV9kZXZfc2V0X2ZlYXR1cmUoZGV2LApAQCAtMjEwNiw2ICsyMTE2LDcgQEAKIAogc3RhdGljIHZvaWQgYWhjaV9lbmFibGVfZmJzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CiAJdTMyIGZiczsKQEAgLTIxMzQsMTEgKzIxNDUsMTIgQEAKIAl9IGVsc2UKIAkJZGV2X2VycihhcC0+aG9zdC0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBGQlNcbiIpOwogCi0JYWhjaV9zdGFydF9lbmdpbmUoYXApOworCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogfQogCiBzdGF0aWMgdm9pZCBhaGNpX2Rpc2FibGVfZmJzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CiAJdTMyIGZiczsKQEAgLTIxNjYsNyArMjE3OCw3IEBACiAJCXBwLT5mYnNfZW5hYmxlZCA9IGZhbHNlOwogCX0KIAotCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKKwlocHJpdi0+c3RhcnRfZW5naW5lKGFwKTsKIH0KIAogc3RhdGljIHZvaWQgYWhjaV9wbXBfYXR0YWNoKHN0cnVjdCBhdGFfcG9ydCAqYXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhaGNpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9saWJhaGNpX3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiM2E4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL2xpYmFoY2lfcGxhdGZvcm0uYwpAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqIEFIQ0kgU0FUQSBwbGF0Zm9ybSBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSAgUmVkIEhhdCwgSW5jLgorICogICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMCAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgTExDLgorICogICBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgImFoY2kuaCIKKworc3RhdGljIHZvaWQgYWhjaV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKKworc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWhjaV9wbGF0Zm9ybV9vcHMgPSB7CisJLmluaGVyaXRzCT0gJmFoY2lfb3BzLAorCS5ob3N0X3N0b3AJPSBhaGNpX2hvc3Rfc3RvcCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX29wcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFoY2lfcGxhdGZvcm1fc2h0ID0geworCUFIQ0lfU0hUKCJhaGNpX3BsYXRmb3JtIiksCit9OworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZW5hYmxlX2Nsa3MgLSBFbmFibGUgcGxhdGZvcm0gY2xvY2tzCisgKiBAaHByaXY6IGhvc3QgcHJpdmF0ZSBhcmVhIHRvIHN0b3JlIGNvbmZpZyB2YWx1ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgYWxsIHRoZSBjbGtzIGZvdW5kIGluIGhwcml2LT5jbGtzLCBzdGFydGluZyBhdAorICogaW5kZXggMC4gSWYgYW55IGNsayBmYWlscyB0byBlbmFibGUgaXQgZGlzYWJsZXMgYWxsIHRoZSBjbGtzIGFscmVhZHkKKyAqIGVuYWJsZWQgaW4gcmV2ZXJzZSBvcmRlciwgYW5kIHRoZW4gcmV0dXJucyBhbiBlcnJvci4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fZW5hYmxlX2Nsa3Moc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3sKKwlpbnQgYywgcmM7CisKKwlmb3IgKGMgPSAwOyBjIDwgQUhDSV9NQVhfQ0xLUyAmJiBocHJpdi0+Y2xrc1tjXTsgYysrKSB7CisJCXJjID0gY2xrX3ByZXBhcmVfZW5hYmxlKGhwcml2LT5jbGtzW2NdKTsKKwkJaWYgKHJjKQorCQkJZ290byBkaXNhYmxlX3VucHJlcGFyZV9jbGs7CisJfQorCXJldHVybiAwOworCitkaXNhYmxlX3VucHJlcGFyZV9jbGs6CisJd2hpbGUgKC0tYyA+PSAwKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaHByaXYtPmNsa3NbY10pOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fZW5hYmxlX2Nsa3MpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzIC0gRGlzYWJsZSBwbGF0Zm9ybSBjbG9ja3MKKyAqIEBocHJpdjogaG9zdCBwcml2YXRlIGFyZWEgdG8gc3RvcmUgY29uZmlnIHZhbHVlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgYWxsIHRoZSBjbGtzIGZvdW5kIGluIGhwcml2LT5jbGtzLCBpbiByZXZlcnNlCisgKiBvcmRlciBvZiBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzIChzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSkuCisgKi8KK3ZvaWQgYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX2Nsa3Moc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3sKKwlpbnQgYzsKKworCWZvciAoYyA9IEFIQ0lfTUFYX0NMS1MgLSAxOyBjID49IDA7IGMtLSkKKwkJaWYgKGhwcml2LT5jbGtzW2NdKQorCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhwcml2LT5jbGtzW2NdKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKTsKKworLyoqCisgKiBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMgLSBFbmFibGUgcGxhdGZvcm0gcmVzb3VyY2VzCisgKiBAaHByaXY6IGhvc3QgcHJpdmF0ZSBhcmVhIHRvIHN0b3JlIGNvbmZpZyB2YWx1ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgYWxsIGFoY2lfcGxhdGZvcm0gbWFuYWdlZCByZXNvdXJjZXMgaW4gdGhlCisgKiBmb2xsb3dpbmcgb3JkZXI6CisgKiAxKSBSZWd1bGF0b3IKKyAqIDIpIENsb2NrcyAodGhyb3VnaCBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzKQorICogMykgUGh5CisgKgorICogSWYgcmVzb3VyY2UgZW5hYmxpbmcgZmFpbHMgYXQgYW55IHBvaW50IHRoZSBwcmV2aW91cyBlbmFibGVkIHJlc291cmNlcworICogYXJlIGRpc2FibGVkIGluIHJldmVyc2Ugb3JkZXIuCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK2ludCBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3sKKwlpbnQgcmM7CisKKwlpZiAoaHByaXYtPnRhcmdldF9wd3IpIHsKKwkJcmMgPSByZWd1bGF0b3JfZW5hYmxlKGhwcml2LT50YXJnZXRfcHdyKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfY2xrcyhocHJpdik7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yOworCisJaWYgKGhwcml2LT5waHkpIHsKKwkJcmMgPSBwaHlfaW5pdChocHJpdi0+cGh5KTsKKwkJaWYgKHJjKQorCQkJZ290byBkaXNhYmxlX2Nsa3M7CisKKwkJcmMgPSBwaHlfcG93ZXJfb24oaHByaXYtPnBoeSk7CisJCWlmIChyYykgeworCQkJcGh5X2V4aXQoaHByaXYtPnBoeSk7CisJCQlnb3RvIGRpc2FibGVfY2xrczsKKwkJfQorCX0KKworCXJldHVybiAwOworCitkaXNhYmxlX2Nsa3M6CisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX2Nsa3MoaHByaXYpOworCitkaXNhYmxlX3JlZ3VsYXRvcjoKKwlpZiAoaHByaXYtPnRhcmdldF9wd3IpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGhwcml2LT50YXJnZXRfcHdyKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMgLSBEaXNhYmxlIHBsYXRmb3JtIHJlc291cmNlcworICogQGhwcml2OiBob3N0IHByaXZhdGUgYXJlYSB0byBzdG9yZSBjb25maWcgdmFsdWVzCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBhbGwgYWhjaV9wbGF0Zm9ybSBtYW5hZ2VkIHJlc291cmNlcyBpbiB0aGUKKyAqIGZvbGxvd2luZyBvcmRlcjoKKyAqIDEpIFBoeQorICogMikgQ2xvY2tzICh0aHJvdWdoIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKQorICogMykgUmVndWxhdG9yCisgKi8KK3ZvaWQgYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQoreworCWlmIChocHJpdi0+cGh5KSB7CisJCXBoeV9wb3dlcl9vZmYoaHByaXYtPnBoeSk7CisJCXBoeV9leGl0KGhwcml2LT5waHkpOworCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKGhwcml2KTsKKworCWlmIChocHJpdi0+dGFyZ2V0X3B3cikKKwkJcmVndWxhdG9yX2Rpc2FibGUoaHByaXYtPnRhcmdldF9wd3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyk7CisKK3N0YXRpYyB2b2lkIGFoY2lfcGxhdGZvcm1fcHV0X3Jlc291cmNlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gcmVzOworCWludCBjOworCisJaWYgKGhwcml2LT5nb3RfcnVudGltZV9wbSkgeworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCX0KKworCWZvciAoYyA9IDA7IGMgPCBBSENJX01BWF9DTEtTICYmIGhwcml2LT5jbGtzW2NdOyBjKyspCisJCWNsa19wdXQoaHByaXYtPmNsa3NbY10pOworfQorCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyAtIEdldCBwbGF0Zm9ybSByZXNvdXJjZXMKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gZ2V0IHJlc291cmNlcyBmb3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbiBhaGNpX2hvc3RfcHJpdiBzdHJ1Y3QsIGFuZCBnZXRzIHRoZSBmb2xsb3dpbmcKKyAqIHJlc291cmNlcywgc3RvcmluZyBhIHJlZmVyZW5jZSB0byB0aGVtIGluc2lkZSB0aGUgcmV0dXJuZWQgc3RydWN0OgorICoKKyAqIDEpIG1taW8gcmVnaXN0ZXJzIChJT1JFU09VUkNFX01FTSAwLCBtYW5kYXRvcnkpCisgKiAyKSByZWd1bGF0b3IgZm9yIGNvbnRyb2xsaW5nIHRoZSB0YXJnZXRzIHBvd2VyIChvcHRpb25hbCkKKyAqIDMpIDAgLSBBSENJX01BWF9DTEtTIGNsb2NrcywgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXZzIGRldmljZXRyZWUgbm9kZSwKKyAqICAgIG9yIGZvciBub24gZGV2aWNldHJlZSBlbmFibGVkIHBsYXRmb3JtcyBhIHNpbmdsZSBjbG9jaworICoJNCkgcGh5IChvcHRpb25hbCkKKyAqCisgKiBSRVRVUk5TOgorICogVGhlIGFsbG9jYXRlZCBhaGNpX2hvc3RfcHJpdiBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gRVJSX1BUUiB2YWx1ZQorICovCitzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGksIHJjID0gLUVOT01FTTsKKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoZGV2LCBOVUxMLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlocHJpdiA9IGRldnJlc19hbGxvYyhhaGNpX3BsYXRmb3JtX3B1dF9yZXNvdXJjZXMsIHNpemVvZigqaHByaXYpLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KQorCQlnb3RvIGVycl9vdXQ7CisKKwlkZXZyZXNfYWRkKGRldiwgaHByaXYpOworCisJaHByaXYtPm1taW8gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LAorCQkJICAgICAgcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKSk7CisJaWYgKElTX0VSUihocHJpdi0+bW1pbykpIHsKKwkJZGV2X2VycihkZXYsICJubyBtbWlvIHNwYWNlXG4iKTsKKwkJcmMgPSBQVFJfRVJSKGhwcml2LT5tbWlvKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWhwcml2LT50YXJnZXRfcHdyID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGRldiwgInRhcmdldCIpOworCWlmIChJU19FUlIoaHByaXYtPnRhcmdldF9wd3IpKSB7CisJCXJjID0gUFRSX0VSUihocHJpdi0+dGFyZ2V0X3B3cik7CisJCWlmIChyYyA9PSAtRVBST0JFX0RFRkVSKQorCQkJZ290byBlcnJfb3V0OworCQlocHJpdi0+dGFyZ2V0X3B3ciA9IE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFIQ0lfTUFYX0NMS1M7IGkrKykgeworCQkvKgorCQkgKiBGb3Igbm93IHdlIG11c3QgdXNlIGNsa19nZXQoZGV2LCBOVUxMKSBmb3IgdGhlIGZpcnN0IGNsb2NrLAorCQkgKiBiZWNhdXNlIHNvbWUgcGxhdGZvcm1zIChkYTg1MCwgc3BlYXIxM3h4KSBhcmUgbm90IHlldAorCQkgKiBjb252ZXJ0ZWQgdG8gdXNlIGRldmljZXRyZWUgZm9yIGNsb2Nrcy4gIEZvciBuZXcgcGxhdGZvcm1zCisJCSAqIHRoaXMgaXMgZXF1aXZhbGVudCB0byBvZl9jbGtfZ2V0KGRldi0+b2Zfbm9kZSwgMCkuCisJCSAqLworCQlpZiAoaSA9PSAwKQorCQkJY2xrID0gY2xrX2dldChkZXYsIE5VTEwpOworCQllbHNlCisJCQljbGsgPSBvZl9jbGtfZ2V0KGRldi0+b2Zfbm9kZSwgaSk7CisKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlyYyA9IFBUUl9FUlIoY2xrKTsKKwkJCWlmIChyYyA9PSAtRVBST0JFX0RFRkVSKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCWJyZWFrOworCQl9CisJCWhwcml2LT5jbGtzW2ldID0gY2xrOworCX0KKworCWhwcml2LT5waHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAic2F0YS1waHkiKTsKKwlpZiAoSVNfRVJSKGhwcml2LT5waHkpKSB7CisJCXJjID0gUFRSX0VSUihocHJpdi0+cGh5KTsKKwkJc3dpdGNoIChyYykgeworCQljYXNlIC1FTk9ERVY6CisJCWNhc2UgLUVOT1NZUzoKKwkJCS8qIGNvbnRpbnVlIG5vcm1hbGx5ICovCisJCQlocHJpdi0+cGh5ID0gTlVMTDsKKwkJCWJyZWFrOworCisJCWNhc2UgLUVQUk9CRV9ERUZFUjoKKwkJCWdvdG8gZXJyX291dDsKKworCQlkZWZhdWx0OgorCQkJZGV2X2VycihkZXYsICJjb3VsZG4ndCBnZXQgc2F0YS1waHlcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJaHByaXYtPmdvdF9ydW50aW1lX3BtID0gdHJ1ZTsKKworCWRldnJlc19yZW1vdmVfZ3JvdXAoZGV2LCBOVUxMKTsKKwlyZXR1cm4gaHByaXY7CisKK2Vycl9vdXQ6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoZGV2LCBOVUxMKTsKKwlyZXR1cm4gRVJSX1BUUihyYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1faW5pdF9ob3N0IC0gQnJpbmcgdXAgYW4gYWhjaS1wbGF0Zm9ybSBob3N0CisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIgZm9yIHRoZSBob3N0CisgKiBAaHByaXY6IGFoY2ktaG9zdCBwcml2YXRlIGRhdGEgZm9yIHRoZSBob3N0CisgKiBAcGlfdGVtcGxhdGU6IHRlbXBsYXRlIGZvciB0aGUgYXRhX3BvcnRfaW5mbyB0byB1c2UKKyAqIEBmb3JjZV9wb3J0X21hcDogcGFyYW0gcGFzc2VkIHRvIGFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZworICogQG1hc2tfcG9ydF9tYXA6IHBhcmFtIHBhc3NlZCB0byBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIHRoZSB1c3VhbCBzdGVwcyBuZWVkZWQgdG8gYnJpbmcgdXAgYW4KKyAqIGFoY2ktcGxhdGZvcm0gaG9zdCwgbm90ZSBhbnkgbmVjZXNzYXJ5IHJlc291cmNlcyAoaWUgY2xrcywgcGh5LCBldGMuKQorICogbXVzdCBiZSBpbml0aWFsaXplZCAvIGVuYWJsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1faW5pdF9ob3N0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGlfdGVtcGxhdGUsCisJCQkgICAgdW5zaWduZWQgaW50IGZvcmNlX3BvcnRfbWFwLAorCQkJICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnRfbWFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSAqcGlfdGVtcGxhdGU7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJaW50IGksIGlycSwgbl9wb3J0cywgcmM7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlkZXZfZXJyKGRldiwgIm5vIGlycVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHByZXBhcmUgaG9zdCAqLworCWhwcml2LT5mbGFncyB8PSAodW5zaWduZWQgbG9uZylwaS5wcml2YXRlX2RhdGE7CisKKwlhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcoZGV2LCBocHJpdiwgZm9yY2VfcG9ydF9tYXAsIG1hc2tfcG9ydF9tYXApOworCisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9OQ1EpCisJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX05DUTsKKworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfUE1QKQorCQlwaS5mbGFncyB8PSBBVEFfRkxBR19QTVA7CisKKwlhaGNpX3NldF9lbV9tZXNzYWdlcyhocHJpdiwgJnBpKTsKKworCS8qIENBUC5OUCBzb21ldGltZXMgaW5kaWNhdGUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVuYWJsZWQKKwkgKiBwb3J0LCBhdCBvdGhlciB0aW1lcywgdGhhdCBvZiB0aGUgbGFzdCBwb3NzaWJsZSBwb3J0LCBzbworCSAqIGRldGVybWluaW5nIHRoZSBtYXhpbXVtIHBvcnQgbnVtYmVyIHJlcXVpcmVzIGxvb2tpbmcgYXQKKwkgKiBib3RoIENBUC5OUCBhbmQgcG9ydF9tYXAuCisJICovCisJbl9wb3J0cyA9IG1heChhaGNpX25yX3BvcnRzKGhwcml2LT5jYXApLCBmbHMoaHByaXYtPnBvcnRfbWFwKSk7CisKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oZGV2LCBwcGksIG5fcG9ydHMpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCWlmICghKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9TU1MpIHx8IGFoY2lfaWdub3JlX3NzcykKKwkJaG9zdC0+ZmxhZ3MgfD0gQVRBX0hPU1RfUEFSQUxMRUxfU0NBTjsKKwllbHNlCisJCWRldl9pbmZvKGRldiwgIlNTUyBmbGFnIHNldCwgcGFyYWxsZWwgYnVzIHNjYW4gZGlzYWJsZWRcbiIpOworCisJaWYgKHBpLmZsYWdzICYgQVRBX0ZMQUdfRU0pCisJCWFoY2lfcmVzZXRfZW0oaG9zdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKKworCQlhdGFfcG9ydF9kZXNjKGFwLCAibW1pbyAlcFIiLAorCQkJICAgICAgcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKSk7CisJCWF0YV9wb3J0X2Rlc2MoYXAsICJwb3J0IDB4JXgiLCAweDEwMCArIGFwLT5wb3J0X25vICogMHg4MCk7CisKKwkJLyogc2V0IGVuY2xvc3VyZSBtYW5hZ2VtZW50IG1lc3NhZ2UgdHlwZSAqLworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRU0pCisJCQlhcC0+ZW1fbWVzc2FnZV90eXBlID0gaHByaXYtPmVtX21zZ190eXBlOworCisJCS8qIGRpc2FibGVkL25vdC1pbXBsZW1lbnRlZCBwb3J0ICovCisJCWlmICghKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKKwkJCWFwLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOworCX0KKworCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJYWhjaV9pbml0X2NvbnRyb2xsZXIoaG9zdCk7CisJYWhjaV9wcmludF9pbmZvKGhvc3QsICJwbGF0Zm9ybSIpOworCisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIGlycSwgYWhjaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmYWhjaV9wbGF0Zm9ybV9zaHQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QpOworCitzdGF0aWMgdm9pZCBhaGNpX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCisJCXBkYXRhLT5leGl0KGRldik7CisKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorLyoqCisgKiBhaGNpX3BsYXRmb3JtX3N1c3BlbmRfaG9zdCAtIFN1c3BlbmQgYW4gYWhjaS1wbGF0Zm9ybSBob3N0CisgKiBAZGV2OiBkZXZpY2UgcG9pbnRlciBmb3IgdGhlIGhvc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIHRoZSB1c3VhbCBzdGVwcyBuZWVkZWQgdG8gc3VzcGVuZCBhbgorICogYWhjaS1wbGF0Zm9ybSBob3N0LCBub3RlIGFueSBuZWNlc3NhcnkgcmVzb3VyY2VzIChpZSBjbGtzLCBwaHksIGV0Yy4pCisgKiBtdXN0IGJlIGRpc2FibGVkIGFmdGVyIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOworCXUzMiBjdGw7CisKKwlpZiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19TVVNQRU5EKSB7CisJCWRldl9lcnIoZGV2LCAiZmlybXdhcmUgdXBkYXRlIHJlcXVpcmVkIGZvciBzdXNwZW5kL3Jlc3VtZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogQUhDSSBzcGVjIHJldjEuMSBzZWN0aW9uIDguMy4zOgorCSAqIFNvZnR3YXJlIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIHByaW9yIHRvIHJlcXVlc3RpbmcgYQorCSAqIHRyYW5zaXRpb24gb2YgdGhlIEhCQSB0byBEMyBzdGF0ZS4KKwkgKi8KKwljdGwgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCWN0bCAmPSB+SE9TVF9JUlFfRU47CisJd3JpdGVsKGN0bCwgbW1pbyArIEhPU1RfQ1RMKTsKKwlyZWFkbChtbWlvICsgSE9TVF9DVEwpOyAvKiBmbHVzaCAqLworCisJcmV0dXJuIGF0YV9ob3N0X3N1c3BlbmQoaG9zdCwgUE1TR19TVVNQRU5EKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KTsKKworLyoqCisgKiBhaGNpX3BsYXRmb3JtX3Jlc3VtZV9ob3N0IC0gUmVzdW1lIGFuIGFoY2ktcGxhdGZvcm0gaG9zdAorICogQGRldjogZGV2aWNlIHBvaW50ZXIgZm9yIHRoZSBob3N0CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCB0aGUgdXN1YWwgc3RlcHMgbmVlZGVkIHRvIHJlc3VtZSBhbiBhaGNpLXBsYXRmb3JtCisgKiBob3N0LCBub3RlIGFueSBuZWNlc3NhcnkgcmVzb3VyY2VzIChpZSBjbGtzLCBwaHksIGV0Yy4pICBtdXN0IGJlCisgKiBpbml0aWFsaXplZCAvIGVuYWJsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByYzsKKworCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKKwkJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIoaG9zdCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlhaGNpX2luaXRfY29udHJvbGxlcihob3N0KTsKKwl9CisKKwlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3QpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fc3VzcGVuZCAtIFN1c3BlbmQgYW4gYWhjaS1wbGF0Zm9ybSBkZXZpY2UKKyAqIEBkZXY6IHRoZSBwbGF0Zm9ybSBkZXZpY2UgdG8gc3VzcGVuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGhvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UsIGZvbGxvd2VkIGJ5CisgKiBkaXNhYmxpbmcgYWxsIHRoZSByZXNvdXJjZXMgb2YgdGhlIGRldmljZS4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmM7CisKKwlyYyA9IGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPnN1c3BlbmQpIHsKKwkJcmMgPSBwZGF0YS0+c3VzcGVuZChkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIHJlc3VtZV9ob3N0OworCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCisJcmV0dXJuIDA7CisKK3Jlc3VtZV9ob3N0OgorCWFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3QoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX3N1c3BlbmQpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fcmVzdW1lIC0gUmVzdW1lIGFuIGFoY2ktcGxhdGZvcm0gZGV2aWNlCisgKiBAZGV2OiB0aGUgcGxhdGZvcm0gZGV2aWNlIHRvIHJlc3VtZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBhbGwgdGhlIHJlc291cmNlcyBvZiB0aGUgZGV2aWNlIGZvbGxvd2VkIGJ5CisgKiByZXN1bWluZyB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCWludCByYzsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+cmVzdW1lKSB7CisJCXJjID0gcGRhdGEtPnJlc3VtZShkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCX0KKworCXJjID0gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOworCWlmIChyYykKKwkJZ290byBkaXNhYmxlX3Jlc291cmNlczsKKworCS8qIFdlIHJlc3VtZWQgc28gdXBkYXRlIFBNIHJ1bnRpbWUgc3RhdGUgKi8KKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJcmV0dXJuIDA7CisKK2Rpc2FibGVfcmVzb3VyY2VzOgorCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbGF0Zm9ybV9yZXN1bWUpOworI2VuZGlmCisKK01PRFVMRV9ERVNDUklQVElPTigiQUhDSSBTQVRBIHBsYXRmb3JtIGxpYnJhcnkiKTsKK01PRFVMRV9BVVRIT1IoIkFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKaW5kZXggYWNiOTVkZmYuLjk3YTE0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwpAQCAtODUzLDYgKzg1Myw3IEBACiAJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmssIEFMTCkgewogCQkJYXRhX2FjcGlfY2xlYXJfZ3RmKGRldik7CiAJCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikgJiYKKwkJCSAgICBhdGFfZGV2X2FjcGlfaGFuZGxlKGRldikgJiYKIAkJCSAgICBhdGFfZGV2X2dldF9HVEYoZGV2LCBOVUxMKSA+PSAwKQogCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0FDUElfUEVORElORzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggOGNiMjUyMi4uMzQ0MDZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC01MzUyLDIyICs1MzUyLDE3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYXRhX3BvcnRfcmVxdWVzdF9wbShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYWN0aW9uLCB1bnNpZ25lZCBpbnQgZWhpX2ZsYWdzLAotCQkJICAgICAgIGludCAqYXN5bmMpCitzdGF0aWMgdm9pZCBhdGFfcG9ydF9yZXF1ZXN0X3BtKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHBtX21lc3NhZ2VfdCBtZXNnLAorCQkJCXVuc2lnbmVkIGludCBhY3Rpb24sIHVuc2lnbmVkIGludCBlaGlfZmxhZ3MsCisJCQkJYm9vbCBhc3luYykKIHsKIAlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMgPSAwOwogCiAJLyogUHJldmlvdXMgcmVzdW1lIG9wZXJhdGlvbiBtaWdodCBzdGlsbCBiZSBpbgogCSAqIHByb2dyZXNzLiAgV2FpdCBmb3IgUE1fUEVORElORyB0byBjbGVhci4KIAkgKi8KIAlpZiAoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19QTV9QRU5ESU5HKSB7Ci0JCWlmIChhc3luYykgewotCQkJKmFzeW5jID0gLUVBR0FJTjsKLQkJCXJldHVybiAwOwotCQl9CiAJCWF0YV9wb3J0X3dhaXRfZWgoYXApOwogCQlXQVJOX09OKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfUE1fUEVORElORyk7CiAJfQpAQCAtNTM3NiwxMSArNTM3MSw2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAogCWFwLT5wbV9tZXNnID0gbWVzZzsKLQlpZiAoYXN5bmMpCi0JCWFwLT5wbV9yZXN1bHQgPSBhc3luYzsKLQllbHNlCi0JCWFwLT5wbV9yZXN1bHQgPSAmcmM7Ci0KIAlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19QTV9QRU5ESU5HOwogCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBIT1NUX0ZJUlNUKSB7CiAJCWxpbmstPmVoX2luZm8uYWN0aW9uIHw9IGFjdGlvbjsKQEAgLTUzOTEsODcgKzUzODEsODEgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIHdhaXQgYW5kIGNoZWNrIHJlc3VsdCAqLwogCWlmICghYXN5bmMpIHsKIAkJYXRhX3BvcnRfd2FpdF9laChhcCk7CiAJCVdBUk5fT04oYXAtPnBmbGFncyAmIEFUQV9QRkxBR19QTV9QRU5ESU5HKTsKIAl9Ci0KLQlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgX19hdGFfcG9ydF9zdXNwZW5kX2NvbW1vbihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZywgaW50ICphc3luYykKKy8qCisgKiBPbiBzb21lIGhhcmR3YXJlLCBkZXZpY2UgZmFpbHMgdG8gcmVzcG9uZCBhZnRlciBzcHVuIGRvd24gZm9yIHN1c3BlbmQuICBBcworICogdGhlIGRldmljZSB3b24ndCBiZSB1c2VkIGJlZm9yZSBiZWluZyByZXN1bWVkLCB3ZSBkb24ndCBuZWVkIHRvIHRvdWNoIHRoZQorICogZGV2aWNlLiAgQXNrIEVIIHRvIHNraXAgdGhlIHVzdWFsIHN0dWZmIGFuZCBwcm9jZWVkIGRpcmVjdGx5IHRvIHN1c3BlbmQuCisgKgorICogaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUubGludXguaWRlLzQ2NzY0CisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXRhX3BvcnRfc3VzcGVuZF9laGkgPSBBVEFfRUhJX1FVSUVUCisJCQkJCQkgfCBBVEFfRUhJX05PX0FVVE9QU1kKKwkJCQkJCSB8IEFUQV9FSElfTk9fUkVDT1ZFUlk7CisKK3N0YXRpYyB2b2lkIGF0YV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpCiB7Ci0JLyoKLQkgKiBPbiBzb21lIGhhcmR3YXJlLCBkZXZpY2UgZmFpbHMgdG8gcmVzcG9uZCBhZnRlciBzcHVuIGRvd24KLQkgKiBmb3Igc3VzcGVuZC4gIEFzIHRoZSBkZXZpY2Ugd29uJ3QgYmUgdXNlZCBiZWZvcmUgYmVpbmcKLQkgKiByZXN1bWVkLCB3ZSBkb24ndCBuZWVkIHRvIHRvdWNoIHRoZSBkZXZpY2UuICBBc2sgRUggdG8gc2tpcAotCSAqIHRoZSB1c3VhbCBzdHVmZiBhbmQgcHJvY2VlZCBkaXJlY3RseSB0byBzdXNwZW5kLgotCSAqCi0JICogaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUubGludXguaWRlLzQ2NzY0Ci0JICovCi0JdW5zaWduZWQgaW50IGVoaV9mbGFncyA9IEFUQV9FSElfUVVJRVQgfCBBVEFfRUhJX05PX0FVVE9QU1kgfAotCQkJCSBBVEFfRUhJX05PX1JFQ09WRVJZOwotCXJldHVybiBhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCAwLCBlaGlfZmxhZ3MsIGFzeW5jKTsKKwlhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCAwLCBhdGFfcG9ydF9zdXNwZW5kX2VoaSwgZmFsc2UpOwogfQogCi1zdGF0aWMgaW50IGF0YV9wb3J0X3N1c3BlbmRfY29tbW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCitzdGF0aWMgdm9pZCBhdGFfcG9ydF9zdXNwZW5kX2FzeW5jKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCWF0YV9wb3J0X3JlcXVlc3RfcG0oYXAsIG1lc2csIDAsIGF0YV9wb3J0X3N1c3BlbmRfZWhpLCB0cnVlKTsKK30KKworc3RhdGljIGludCBhdGFfcG9ydF9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gdG9fYXRhX3BvcnQoZGV2KTsKIAotCXJldHVybiBfX2F0YV9wb3J0X3N1c3BlbmRfY29tbW9uKGFwLCBtZXNnLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBhdGFfcG9ydF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKIAlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gYXRhX3BvcnRfc3VzcGVuZF9jb21tb24oZGV2LCBQTVNHX1NVU1BFTkQpOworCWF0YV9wb3J0X3N1c3BlbmQoYXAsIFBNU0dfU1VTUEVORCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRhX3BvcnRfZG9fZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYXRhX3BvcnRfc3VzcGVuZF9jb21tb24oZGV2LCBQTVNHX0ZSRUVaRSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXRhX3BvcnRfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBhdGFfcG9ydF9zdXNwZW5kX2NvbW1vbihkZXYsIFBNU0dfSElCRVJOQVRFKTsKLX0KLQotc3RhdGljIGludCBfX2F0YV9wb3J0X3Jlc3VtZV9jb21tb24oc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2csCi0JCQkJICAgIGludCAqYXN5bmMpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCBBVEFfRUhfUkVTRVQsCi0JCUFUQV9FSElfTk9fQVVUT1BTWSB8IEFUQV9FSElfUVVJRVQsIGFzeW5jKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXRhX3BvcnRfcmVzdW1lX2NvbW1vbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQorc3RhdGljIGludCBhdGFfcG9ydF9wbV9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSB0b19hdGFfcG9ydChkZXYpOwogCi0JcmV0dXJuIF9fYXRhX3BvcnRfcmVzdW1lX2NvbW1vbihhcCwgbWVzZywgTlVMTCk7CisJaWYgKHBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCisJCXJldHVybiAwOworCisJYXRhX3BvcnRfc3VzcGVuZChhcCwgUE1TR19GUkVFWkUpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0YV9wb3J0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGF0YV9wb3J0X3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpbnQgcmM7CisJYXRhX3BvcnRfc3VzcGVuZCh0b19hdGFfcG9ydChkZXYpLCBQTVNHX0hJQkVSTkFURSk7CisJcmV0dXJuIDA7Cit9CiAKLQlyYyA9IGF0YV9wb3J0X3Jlc3VtZV9jb21tb24oZGV2LCBQTVNHX1JFU1VNRSk7Ci0JaWYgKCFyYykgewotCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JfQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdGFfcG9ydF9yZXN1bWVfZWhpID0gQVRBX0VISV9OT19BVVRPUFNZCisJCQkJCQl8IEFUQV9FSElfUVVJRVQ7CiAKLQlyZXR1cm4gcmM7CitzdGF0aWMgdm9pZCBhdGFfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJYXRhX3BvcnRfcmVxdWVzdF9wbShhcCwgbWVzZywgQVRBX0VIX1JFU0VULCBhdGFfcG9ydF9yZXN1bWVfZWhpLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9wb3J0X3Jlc3VtZV9hc3luYyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCBBVEFfRUhfUkVTRVQsIGF0YV9wb3J0X3Jlc3VtZV9laGksIHRydWUpOworfQorCitzdGF0aWMgaW50IGF0YV9wb3J0X3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYXRhX3BvcnRfcmVzdW1lX2FzeW5jKHRvX2F0YV9wb3J0KGRldiksIFBNU0dfUkVTVU1FKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNTUwMCwyMSArNTQ4NCwyMyBAQAogCiBzdGF0aWMgaW50IGF0YV9wb3J0X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGF0YV9wb3J0X3N1c3BlbmRfY29tbW9uKGRldiwgUE1TR19BVVRPX1NVU1BFTkQpOworCWF0YV9wb3J0X3N1c3BlbmQodG9fYXRhX3BvcnQoZGV2KSwgUE1TR19BVVRPX1NVU1BFTkQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF0YV9wb3J0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gYXRhX3BvcnRfcmVzdW1lX2NvbW1vbihkZXYsIFBNU0dfQVVUT19SRVNVTUUpOworCWF0YV9wb3J0X3Jlc3VtZSh0b19hdGFfcG9ydChkZXYpLCBQTVNHX0FVVE9fUkVTVU1FKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGF0YV9wb3J0X3BtX29wcyA9IHsKLQkuc3VzcGVuZCA9IGF0YV9wb3J0X3N1c3BlbmQsCi0JLnJlc3VtZSA9IGF0YV9wb3J0X3Jlc3VtZSwKLQkuZnJlZXplID0gYXRhX3BvcnRfZG9fZnJlZXplLAotCS50aGF3ID0gYXRhX3BvcnRfcmVzdW1lLAotCS5wb3dlcm9mZiA9IGF0YV9wb3J0X3Bvd2Vyb2ZmLAotCS5yZXN0b3JlID0gYXRhX3BvcnRfcmVzdW1lLAorCS5zdXNwZW5kID0gYXRhX3BvcnRfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gYXRhX3BvcnRfcG1fcmVzdW1lLAorCS5mcmVlemUgPSBhdGFfcG9ydF9wbV9mcmVlemUsCisJLnRoYXcgPSBhdGFfcG9ydF9wbV9yZXN1bWUsCisJLnBvd2Vyb2ZmID0gYXRhX3BvcnRfcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBhdGFfcG9ydF9wbV9yZXN1bWUsCiAKIAkucnVudGltZV9zdXNwZW5kID0gYXRhX3BvcnRfcnVudGltZV9zdXNwZW5kLAogCS5ydW50aW1lX3Jlc3VtZSA9IGF0YV9wb3J0X3J1bnRpbWVfcmVzdW1lLApAQCAtNTUyNiwxOCArNTUxMiwxNyBAQAogICogbGV2ZWwuIHNhcyBzdXNwZW5kL3Jlc3VtZSBpcyBhc3luYyB0byBhbGxvdyBwYXJhbGxlbCBwb3J0IHJlY292ZXJ5CiAgKiBzaW5jZSBzYXMgaGFzIG11bHRpcGxlIGF0YV9wb3J0IGluc3RhbmNlcyBwZXIgU2NzaV9Ib3N0LgogICovCi1pbnQgYXRhX3Nhc19wb3J0X2FzeW5jX3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYykKK3ZvaWQgYXRhX3Nhc19wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlyZXR1cm4gX19hdGFfcG9ydF9zdXNwZW5kX2NvbW1vbihhcCwgUE1TR19TVVNQRU5ELCBhc3luYyk7CisJYXRhX3BvcnRfc3VzcGVuZF9hc3luYyhhcCwgUE1TR19TVVNQRU5EKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zYXNfcG9ydF9hc3luY19zdXNwZW5kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zYXNfcG9ydF9zdXNwZW5kKTsKIAotaW50IGF0YV9zYXNfcG9ydF9hc3luY19yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYykKK3ZvaWQgYXRhX3Nhc19wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXJldHVybiBfX2F0YV9wb3J0X3Jlc3VtZV9jb21tb24oYXAsIFBNU0dfUkVTVU1FLCBhc3luYyk7CisJYXRhX3BvcnRfcmVzdW1lX2FzeW5jKGFwLCBQTVNHX1JFU1VNRSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2FzX3BvcnRfYXN5bmNfcmVzdW1lKTsKLQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Nhc19wb3J0X3Jlc3VtZSk7CiAKIC8qKgogICoJYXRhX2hvc3Rfc3VzcGVuZCAtIHN1c3BlbmQgaG9zdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCA2ZDg3NTcwLi42NzYwZmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtOTUsMTIgKzk1LDEzIEBACiAgKiByZXByZXNlbnRzIHRpbWVvdXQgZm9yIHRoYXQgdHJ5LiAgVGhlIGZpcnN0IHRyeSBjYW4gYmUgc29mdCBvcgogICogaGFyZHJlc2V0LiAgQWxsIG90aGVycyBhcmUgaGFyZHJlc2V0IGlmIGF2YWlsYWJsZS4gIEluIG1vc3QgY2FzZXMKICAqIHRoZSBmaXJzdCByZXNldCB3LyAxMHNlYyB0aW1lb3V0IHNob3VsZCBzdWNjZWVkLiAgRm9sbG93aW5nIGVudHJpZXMKLSAqIGFyZSBtb3N0bHkgZm9yIGVycm9yIGhhbmRsaW5nLCBob3RwbHVnIGFuZCByZXRhcmRlZCBkZXZpY2VzLgorICogYXJlIG1vc3RseSBmb3IgZXJyb3IgaGFuZGxpbmcsIGhvdHBsdWcgYW5kIHRob3NlIG91dGxpZXIgZGV2aWNlcyB0aGF0CisgKiB0YWtlIGFuIGV4Y2VwdGlvbmFsbHkgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSByZXNldC4KICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgYXRhX2VoX3Jlc2V0X3RpbWVvdXRzW10gPSB7CiAJMTAwMDAsCS8qIG1vc3QgZHJpdmVzIHNwaW4gdXAgYnkgMTBzZWMgKi8KIAkxMDAwMCwJLyogPiA5OSUgd29ya2luZyBkcml2ZXMgc3BpbiB1cCBiZWZvcmUgMjBzZWMgKi8KLQkzNTAwMCwJLyogZ2l2ZSA+IDMwIHNlY3Mgb2YgaWRsZW5lc3MgZm9yIHJldGFyZGVkIGRldmljZXMgKi8KKwkzNTAwMCwJLyogZ2l2ZSA+IDMwIHNlY3Mgb2YgaWRsZW5lc3MgZm9yIG91dGxpZXIgZGV2aWNlcyAqLwogCSA1MDAwLAkvKiBhbmQgc3dlZXQgb25lIGxhc3QgY2hhbmNlICovCiAJVUxPTkdfTUFYLCAvKiA+IDEgbWluIGhhcyBlbGFwc2VkLCBnaXZlIHVwICovCiB9OwpAQCAtNDA2OSw3ICs0MDcwLDcgQEAKIAogCWF0YV9hY3BpX3NldF9zdGF0ZShhcCwgYXAtPnBtX21lc2cpOwogIG91dDoKLQkvKiByZXBvcnQgcmVzdWx0ICovCisJLyogdXBkYXRlIHRoZSBmbGFncyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAKIAlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfUE1fUEVORElORzsKQEAgLTQwNzgsMTEgKzQwNzksNiBAQAogCWVsc2UgaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKQogCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CiAKLQlpZiAoYXAtPnBtX3Jlc3VsdCkgewotCQkqYXAtPnBtX3Jlc3VsdCA9IHJjOwotCQlhcC0+cG1fcmVzdWx0ID0gTlVMTDsKLQl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm47CkBAIC00MTM0LDEzICs0MTMwLDkgQEAKIAkvKiB0ZWxsIEFDUEkgdGhhdCB3ZSdyZSByZXN1bWluZyAqLwogCWF0YV9hY3BpX29uX3Jlc3VtZShhcCk7CiAKLQkvKiByZXBvcnQgcmVzdWx0ICovCisJLyogdXBkYXRlIHRoZSBmbGFncyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAJYXAtPnBmbGFncyAmPSB+KEFUQV9QRkxBR19QTV9QRU5ESU5HIHwgQVRBX1BGTEFHX1NVU1BFTkRFRCk7Ci0JaWYgKGFwLT5wbV9yZXN1bHQpIHsKLQkJKmFwLT5wbV9yZXN1bHQgPSByYzsKLQkJYXAtPnBtX3Jlc3VsdCA9IE5VTEw7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS16cG9kZC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXpwb2RkLmMKaW5kZXggODg5NDljNi4uZjNhNjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXpwb2RkLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXpwb2RkLmMKQEAgLTg1LDIxICs4NSw2IEBACiAJCXJldHVybiBPRERfTUVDSF9UWVBFX1VOU1VQUE9SVEVEOwogfQogCi1zdGF0aWMgYm9vbCBvZGRfY2FuX3Bvd2Vyb2ZmKHN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2KQotewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2OwotCi0JaGFuZGxlID0gYXRhX2Rldl9hY3BpX2hhbmRsZShhdGFfZGV2KTsKLQlpZiAoIWhhbmRsZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmYWNwaV9kZXYpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gYWNwaV9kZXZpY2VfY2FuX3Bvd2Vyb2ZmKGFjcGlfZGV2KTsKLX0KLQogLyogVGVzdCBpZiBPREQgaXMgemVybyBwb3dlciByZWFkeSBieSBzZW5zZSBjb2RlICovCiBzdGF0aWMgYm9vbCB6cHJlYWR5KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CkBAIC0yNjcsMTMgKzI1MiwxMSBAQAogCiB2b2lkIHpwb2RkX2luaXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBBQ1BJX0NPTVBBTklPTigmZGV2LT50ZGV2KTsKIAllbnVtIG9kZF9tZWNoX3R5cGUgbWVjaF90eXBlOwogCXN0cnVjdCB6cG9kZCAqenBvZGQ7CiAKLQlpZiAoZGV2LT56cG9kZCkKLQkJcmV0dXJuOwotCi0JaWYgKCFvZGRfY2FuX3Bvd2Vyb2ZmKGRldikpCisJaWYgKGRldi0+enBvZGQgfHwgIWFkZXYgfHwgIWFjcGlfZGV2aWNlX2Nhbl9wb3dlcm9mZihhZGV2KSkKIAkJcmV0dXJuOwogCiAJbWVjaF90eXBlID0genBvZGRfZ2V0X21lY2hfdHlwZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hY3BpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYwppbmRleCA2MmM5YWM4Li41MTA4Yjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCmluZGV4IGQyM2UyYjMuLjEyMDZmYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9hcmFzYW5fY2YuYwppbmRleCA3MzQ5MmRkLi42ZmFjNTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJhc2FuX2NmLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCiBzdGF0aWMgdm9pZCBkbWFfY2FsbGJhY2sodm9pZCAqZGV2KQogewotCXN0cnVjdCBhcmFzYW5fY2ZfZGV2ICphY2RldiA9IChzdHJ1Y3QgYXJhc2FuX2NmX2RldiAqKSBkZXY7CisJc3RydWN0IGFyYXNhbl9jZl9kZXYgKmFjZGV2ID0gZGV2OwogCiAJY29tcGxldGUoJmFjZGV2LT5kbWFfY29tcGxldGlvbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKaW5kZXggMTU4MWRlZS4uM2FhNGU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdDkxLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYwppbmRleCBkNjNlZThmLi5lOWM4NzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYwpAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwppbmRleCAyNGU1MTA1Li4zMGZhNGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdHA4Njd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYwppbmRleCAyY2E1MDI2Li43ZTczYTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjQwLmMKaW5kZXggOGZiNjllNS4uNTdmMWJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0MC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYwppbmRleCAxMjc1YThkLi42YmNhMzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKaW5kZXggZjEwYmFhYi4uYmNkZTRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jCmluZGV4IGYwN2YyMjkuLjhhZmU4NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYwppbmRleCA5OTdlMTZhLi4yYzA5ODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM2LmMKaW5kZXggMDQ0ODg2MC4uMzJkZGNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNi5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCmluZGV4IDgxMGJjOTkuLjM0MzViZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jIGIvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKaW5kZXggM2MxMmZkNy4uZjQ0MDg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfZXA5M3h4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2VwOTN4eC5jCmluZGV4IDk4MGI4OGUuLmNhZDlkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfZXA5M3h4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9lcDkzeHguYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggMzViNTIxMy4uOGU3NmY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCmluZGV4IGE5ZDc0ZWYuLjNiYTg0M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCmluZGV4IDRiZTAzOTguLmI5M2MwZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCmluZGV4IDg1Y2YyODYuLjI1NWM1YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2lteC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pbXguYwppbmRleCBiMGIxOGVjLi5lMDg3MmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2lteC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaW14LmMKQEAgLTE1LDcgKzE1LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgpAQCAtMTAwLDEzICs5OSw5IEBACiAJc3RydWN0IHJlc291cmNlICppb19yZXM7CiAJaW50IHJldDsKIAotCWlvX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKGlvX3JlcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKIAogCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKIAkJCQlzaXplb2Yoc3RydWN0IHBhdGFfaW14X3ByaXYpLCBHRlBfS0VSTkVMKTsKQEAgLTEzNiwxMSArMTMxLDEwIEBACiAJYXAtPnBpb19tYXNrID0gQVRBX1BJTzA7CiAJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7CiAKLQlwcml2LT5ob3N0X3JlZ3MgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgaW9fcmVzLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShpb19yZXMpKTsKLQlpZiAoIXByaXYtPmhvc3RfcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIElPL0NUTCBiYXNlXG4iKTsKLQkJcmV0ID0gLUVCVVNZOworCWlvX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcHJpdi0+aG9zdF9yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIGlvX3Jlcyk7CisJaWYgKElTX0VSUihwcml2LT5ob3N0X3JlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+aG9zdF9yZWdzKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYwppbmRleCAyYThkZDk1Li44MTM2OWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCmluZGV4IDU4MWUwNGQuLmRjM2Q3ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwpAQCAtNzIsNyArNzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jIGIvZHJpdmVycy9hdGEvcGF0YV9qbWljcm9uLmMKaW5kZXggNzZlNzM5YjAuLmIxY2ZhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwppbmRleCBiZTgxNjQyLi5iY2UyYThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKQEAgLTkxNiw3ICs5MTYsNiBAQAogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQkJcmV0dXJuIEJJT1M7CiAJCX0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAogCWlmIChodDY1NjBhICYgbWFzaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKaW5kZXggYTRmNWU3OC4uNmJhZDNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYwppbmRleCAxZjVmMjhiLi5mMzlhNTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKaW5kZXggYWQxYTBmZS4uZTNiOTcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCmluZGV4IDk1MTNlMDcuLjU2MjAxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKaW5kZXggMGM0MjRkYS4uNjE1NGMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDE1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYwppbmRleCAxNmRjM2E2Li5kNDRkZjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwppbmRleCBkNzdiMmUxLi4zMTliNjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwppbmRleCA0ZWE3MGNkLi5mYjA0MmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCmluZGV4IDc4ZWRlM2YuLmJiNzFlYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCmluZGV4IDQwMjU0ZjQuLmJjYzRiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYwpAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCmluZGV4IDlkODc0YzguLjExNTFmMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMnh4X29sZC5jCmluZGV4IGMzNGZjNTAuLmRlZmEwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDJ4eF9vbGQuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BpY2NvbG8uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGljY29sby5jCmluZGV4IDJiZWI2YjUuLjBiNDZiZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGljY29sby5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGljY29sby5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwppbmRleCAwMjc5NDg4Li5hNTU3OWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcHhhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3B4YS5jCmluZGV4IGE2ZjA1YWMuLjczMjU5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcHhhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9weGEuYwpAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwppbmRleCBmNTgyYmExLi5iZTNmMTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcmRjLmMKaW5kZXggNzlhOTcwZi4uNTIxYjIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JkYy5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwppbmRleCAwNDBiMDkzLi5jYWVkYzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKaW5kZXggY2UyZjgyOC4uOTZhMjMyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCmluZGV4IGYzNWYxNWYuLmYxZjViNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zY2MuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2guYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NoLmMKaW5kZXggZDM4MzBjNC4uNWExY2RlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjaC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKaW5kZXggOTZjNmE3OS4uZTI3ZjMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCBjNGIwYjA3Li43M2ZlMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKaW5kZXggMWU4MzYzNi4uNzhkOTEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKaW5kZXggNjgxNjkxMS4uOTAwZjBlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCmluZGV4IDk0NDczZGEuLjdiYzc4ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCmluZGV4IGMzYWI5YTYuLmY2Yzk2MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwpAQCAtNTUsNyArNTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGRjX2FkbWEuYyBiL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMKaW5kZXggOGVhNmU2YS4uZjEwNjMxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGRjX2FkbWEuYworKysgYi9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwppbmRleCA1MjM1MjRiLi4wYmIyY2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC00NjIsOCArNDYxLDcgQEAKIAlpbnQgY2hhbjsKIAl1MzIgdGZyX3JlZywgZXJyX3JlZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0KLQkJKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKiloc2Rldl9pbnN0YW5jZTsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldiA9IGhzZGV2X2luc3RhbmNlOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgYXRhX2hvc3QgKiloc2Rldi0+aG9zdDsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9oaWdoYmFuay5jIGIvZHJpdmVycy9hdGEvc2F0YV9oaWdoYmFuay5jCmluZGV4IDg3MGIxMWUuLjY1OTY1Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfaGlnaGJhbmsuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2hpZ2hiYW5rLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMTQyLDcgKzE0MSw3IEBACiAJCQkJCXNzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gIGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVjeF9wbGF0X2RhdGEgKnBkYXRhID0gKHN0cnVjdCBlY3hfcGxhdF9kYXRhICopIGhwcml2LT5wbGF0X2RhdGE7CisJc3RydWN0IGVjeF9wbGF0X2RhdGEgKnBkYXRhID0gaHByaXYtPnBsYXRfZGF0YTsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwbXAsIGk7CkBAIC00MDMsNiArNDAyLDcgQEAKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB0aW1pbmdbXSA9IHsgNSwgMTAwLCA1MDB9OwogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWJvb2wgb25saW5lOwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJCQlicmVhazsKIAl9IHdoaWxlICghb25saW5lICYmIHJldHJ5LS0pOwogCi0JYWhjaV9zdGFydF9lbmdpbmUoYXApOworCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCiAJaWYgKG9ubGluZSkKIAkJKmNsYXNzID0gYWhjaV9kZXZfY2xhc3NpZnkoYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IGQ3NGRlZjguLmJhNWYyNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggOTdmNGFjYi4uMzYzODg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYyBiL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYwppbmRleCAzYjBkZDU3Li45YTZiZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwppbmRleCBiNzY5NWU4Li4zMDYyZjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCmluZGV4IDFhZDJmNjIuLmI1MTM0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKaW5kZXggZGM0ZjcwMS4uYzYzMGZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zeDQuYwppbmRleCA5OTQ3MDEwLi4zOWI1ZGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMKQEAgLTgyLDcgKzgyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMDIxLDggKzEwMjAsNyBAQAogCWlkeCsrOwogCWRpc3QgPSAoKGxvbmcpICh3aW5kb3dfc2l6ZSAtIChvZmZzZXQgKyBzaXplKSkpID49IDAgPyBzaXplIDoKIAkJKGxvbmcpICh3aW5kb3dfc2l6ZSAtIG9mZnNldCk7Ci0JbWVtY3B5X2Zyb21pbygoY2hhciAqKSBwc291cmNlLCAoY2hhciAqKSAoZGltbV9tbWlvICsgb2Zmc2V0IC8gNCksCi0JCSAgICAgIGRpc3QpOworCW1lbWNweV9mcm9taW8ocHNvdXJjZSwgZGltbV9tbWlvICsgb2Zmc2V0IC8gNCwgZGlzdCk7CiAKIAlwc291cmNlICs9IGRpc3Q7CiAJc2l6ZSAtPSBkaXN0OwpAQCAtMTAzMSw4ICsxMDI5LDcgQEAKIAkJcmVhZGwobW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOwogCQl3cml0ZWwoKChpZHgpIDw8IHBhZ2VfbWFzayksIG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CiAJCXJlYWRsKG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7Ci0JCW1lbWNweV9mcm9taW8oKGNoYXIgKikgcHNvdXJjZSwgKGNoYXIgKikgKGRpbW1fbW1pbyksCi0JCQkgICAgICB3aW5kb3dfc2l6ZSAvIDQpOworCQltZW1jcHlfZnJvbWlvKHBzb3VyY2UsIGRpbW1fbW1pbywgd2luZG93X3NpemUgLyA0KTsKIAkJcHNvdXJjZSArPSB3aW5kb3dfc2l6ZTsKIAkJc2l6ZSAtPSB3aW5kb3dfc2l6ZTsKIAkJaWR4Kys7CkBAIC0xMDQzLDggKzEwNDAsNyBAQAogCQlyZWFkbChtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CiAJCXdyaXRlbCgoKGlkeCkgPDwgcGFnZV9tYXNrKSwgbW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKIAkJcmVhZGwobW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKLQkJbWVtY3B5X2Zyb21pbygoY2hhciAqKSBwc291cmNlLCAoY2hhciAqKSAoZGltbV9tbWlvKSwKLQkJCSAgICAgIHNpemUgLyA0KTsKKwkJbWVtY3B5X2Zyb21pbyhwc291cmNlLCBkaW1tX21taW8sIHNpemUgLyA0KTsKIAl9CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jCmluZGV4IDZkNjQ4OTEuLjA4Zjk4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV91bGkuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKaW5kZXggODdmMDU2ZS4uZjcyZTg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCA0NGYzMDRiLi4yOWU4NDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9LY29uZmlnIGIvZHJpdmVycy9iYXNlL0tjb25maWcKaW5kZXggZWMzNmU3Ny4uOGZhOGRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL0tjb25maWcKKysrIGIvZHJpdmVycy9iYXNlL0tjb25maWcKQEAgLTE4NSw2ICsxODUsOSBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAorY29uZmlnIEdFTkVSSUNfQ1BVX0FVVE9QUk9CRQorCWJvb2wKKwogY29uZmlnIFNPQ19CVVMKIAlib29sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCmluZGV4IGVjYzE5MjkuLmI4NGNhOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwpAQCAtMTIsNyArMTIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDJiNTY3MTcuLjBkZDY1MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CkBAIC01NzEsNiArNTcwLDIzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVtb3ZlX2ZpbGUpOwogCiAvKioKKyAqIGRldmljZV9yZW1vdmVfZmlsZV9zZWxmIC0gcmVtb3ZlIHN5c2ZzIGF0dHJpYnV0ZSBmaWxlIGZyb20gaXRzIG93biBtZXRob2QuCisgKiBAZGV2OiBkZXZpY2UuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSBkZXNjcmlwdG9yLgorICoKKyAqIFNlZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBmb3IgZGV0YWlscy4KKyAqLworYm9vbCBkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWlmIChkZXYpCisJCXJldHVybiBzeXNmc19yZW1vdmVfZmlsZV9zZWxmKCZkZXYtPmtvYmosICZhdHRyLT5hdHRyKTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKTsKKworLyoqCiAgKiBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlIC0gY3JlYXRlIHN5c2ZzIGJpbmFyeSBhdHRyaWJ1dGUgZmlsZSBmb3IgZGV2aWNlLgogICogQGRldjogZGV2aWNlLgogICogQGF0dHI6IGRldmljZSBiaW5hcnkgYXR0cmlidXRlIGRlc2NyaXB0b3IuCkBAIC0yMDAzLDcgKzIwMTksNiBAQAogCQlzcGluX2xvY2soJmRldmljZXNfa3NldC0+bGlzdF9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmRldmljZXNfa3NldC0+bGlzdF9sb2NrKTsKLQlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiB9CiAKIC8qCkBAIC0yMDU4LDcgKzIwNzMsNiBAQAogCiAJcmV0dXJuIHBvczsKIH0KLUVYUE9SVF9TWU1CT0woY3JlYXRlX3N5c2xvZ19oZWFkZXIpOwogCiBpbnQgZGV2X3ZwcmludGtfZW1pdChpbnQgbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJICAgICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jcHUuYyBiL2RyaXZlcnMvYmFzZS9jcHUuYwppbmRleCBmNDgzNzBkLi4wMDZiMWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY3B1LmMKKysrIGIvZHJpdmVycy9iYXNlL2NwdS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZmVhdHVyZS5oPgogCiAjaW5jbHVkZSAiYmFzZS5oIgogCkBAIC0yODYsNiArMjg3LDQxIEBACiAJICovCiB9CiAKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCitzdGF0aWMgc3NpemVfdCBwcmludF9jcHVfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3NpemVfdCBuOworCXUzMiBpOworCisJbiA9IHNwcmludGYoYnVmLCAiY3B1OnR5cGU6IiBDUFVfRkVBVFVSRV9UWVBFRk1UICI6ZmVhdHVyZToiLAorCQkgICAgQ1BVX0ZFQVRVUkVfVFlQRVZBTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NQVV9GRUFUVVJFUzsgaSsrKQorCQlpZiAoY3B1X2hhdmVfZmVhdHVyZShpKSkgeworCQkJaWYgKFBBR0VfU0laRSA8IG4gKyBzaXplb2YoIixYWFhYXG4iKSkgeworCQkJCVdBUk4oMSwgIkNQVSBmZWF0dXJlcyBvdmVyZmxvdyBwYWdlXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW4gKz0gc3ByaW50ZigmYnVmW25dLCAiLCUwNFgiLCBpKTsKKwkJfQorCWJ1ZltuKytdID0gJ1xuJzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBjcHVfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCWNoYXIgKmJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmKSB7CisJCXByaW50X2NwdV9tb2RhbGlhcyhOVUxMLCBOVUxMLCBidWYpOworCQlhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz0lcyIsIGJ1Zik7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qCiAgKiByZWdpc3Rlcl9jcHUgLSBTZXR1cCBhIHN5c2ZzIGRldmljZSBmb3IgYSBDUFUuCiAgKiBAY3B1IC0gY3B1LT5ob3RwbHVnZ2FibGUgZmllbGQgc2V0IHRvIDEgd2lsbCBnZW5lcmF0ZSBhIGNvbnRyb2wgZmlsZSBpbgpAQCAtMzA2LDggKzM0Miw4IEBACiAJY3B1LT5kZXYub2ZmbGluZV9kaXNhYmxlZCA9ICFjcHUtPmhvdHBsdWdnYWJsZTsKIAljcHUtPmRldi5vZmZsaW5lID0gIWNwdV9vbmxpbmUobnVtKTsKIAljcHUtPmRldi5vZl9ub2RlID0gb2ZfZ2V0X2NwdV9ub2RlKG51bSwgTlVMTCk7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfSEFTX0NQVV9BVVRPUFJPQkUKLQljcHUtPmRldi5idXMtPnVldmVudCA9IGFyY2hfY3B1X3VldmVudDsKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCisJY3B1LT5kZXYuYnVzLT51ZXZlbnQgPSBjcHVfdWV2ZW50OwogI2VuZGlmCiAJY3B1LT5kZXYuZ3JvdXBzID0gY29tbW9uX2NwdV9hdHRyX2dyb3VwczsKIAlpZiAoY3B1LT5ob3RwbHVnZ2FibGUpCkBAIC0zMzAsOCArMzY2LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdldF9jcHVfZGV2aWNlKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX0hBU19DUFVfQVVUT1BST0JFCi1zdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIDA0NDQsIGFyY2hfcHJpbnRfY3B1X21vZGFsaWFzLCBOVUxMKTsKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCitzdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIDA0NDQsIHByaW50X2NwdV9tb2RhbGlhcywgTlVMTCk7CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNwdV9yb290X2F0dHJzW10gPSB7CkBAIC0zNDQsNyArMzgwLDcgQEAKIAkmY3B1X2F0dHJzWzJdLmF0dHIuYXR0ciwKIAkmZGV2X2F0dHJfa2VybmVsX21heC5hdHRyLAogCSZkZXZfYXR0cl9vZmZsaW5lLmF0dHIsCi0jaWZkZWYgQ09ORklHX0FSQ0hfSEFTX0NQVV9BVVRPUFJPQkUKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCiAJJmRldl9hdHRyX21vZGFsaWFzLmF0dHIsCiAjZW5kaWYKIAlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGV2cmVzLmMgYi9kcml2ZXJzL2Jhc2UvZGV2cmVzLmMKaW5kZXggNTQ1YzRkZS4uZGI0ZTI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RldnJlcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZXZyZXMuYwpAQCAtNzkxLDYgKzc5MSwzMiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9rbWFsbG9jKTsKIAogLyoqCisgKiBkZXZtX2tzdHJkdXAgLSBBbGxvY2F0ZSByZXNvdXJjZSBtYW5hZ2VkIHNwYWNlIGFuZAorICogICAgICAgICAgICAgICAgY29weSBhbiBleGlzdGluZyBzdHJpbmcgaW50byB0aGF0LgorICogQGRldjogRGV2aWNlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IKKyAqIEBzOiB0aGUgc3RyaW5nIHRvIGR1cGxpY2F0ZQorICogQGdmcDogdGhlIEdGUCBtYXNrIHVzZWQgaW4gdGhlIGRldm1fa21hbGxvYygpIGNhbGwgd2hlbgorICogICAgICAgYWxsb2NhdGluZyBtZW1vcnkKKyAqIFJFVFVSTlM6CisgKiBQb2ludGVyIHRvIGFsbG9jYXRlZCBzdHJpbmcgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCitjaGFyICpkZXZtX2tzdHJkdXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzLCBnZnBfdCBnZnApCit7CisJc2l6ZV90IHNpemU7CisJY2hhciAqYnVmOworCisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCXNpemUgPSBzdHJsZW4ocykgKyAxOworCWJ1ZiA9IGRldm1fa21hbGxvYyhkZXYsIHNpemUsIGdmcCk7CisJaWYgKGJ1ZikKKwkJbWVtY3B5KGJ1Ziwgcywgc2l6ZSk7CisJcmV0dXJuIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fa3N0cmR1cCk7CisKKy8qKgogICogZGV2bV9rZnJlZSAtIFJlc291cmNlLW1hbmFnZWQga2ZyZWUKICAqIEBkZXY6IERldmljZSB0aGlzIG1lbW9yeSBiZWxvbmdzIHRvCiAgKiBAcDogTWVtb3J5IHRvIGZyZWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWEtYnVmLmMgYi9kcml2ZXJzL2Jhc2UvZG1hLWJ1Zi5jCmluZGV4IDYxZDZkNjIuLmVhNzc3MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtYnVmLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYS1idWYuYwpAQCAtMjUxLDkgKzI1MSw4IEBACiAgKiBAZG1hYnVmOglbaW5dCWJ1ZmZlciB0byBhdHRhY2ggZGV2aWNlIHRvLgogICogQGRldjoJW2luXQlkZXZpY2UgdG8gYmUgYXR0YWNoZWQuCiAgKgotICogUmV0dXJucyBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICogZm9yIHRoaXMgYXR0YWNobWVudDsgbWF5IHJldHVybiBuZWdhdGl2ZQotICogZXJyb3IgY29kZXMuCi0gKgorICogUmV0dXJucyBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICogZm9yIHRoaXMgYXR0YWNobWVudDsgcmV0dXJucyBFUlJfUFRSIG9uCisgKiBlcnJvci4KICAqLwogc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqZG1hX2J1Zl9hdHRhY2goc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0zMTksOSArMzE4LDggQEAKICAqIEBhdHRhY2g6CVtpbl0JYXR0YWNobWVudCB3aG9zZSBzY2F0dGVybGlzdCBpcyB0byBiZSByZXR1cm5lZAogICogQGRpcmVjdGlvbjoJW2luXQlkaXJlY3Rpb24gb2YgRE1BIHRyYW5zZmVyCiAgKgotICogUmV0dXJucyBzZ190YWJsZSBjb250YWluaW5nIHRoZSBzY2F0dGVybGlzdCB0byBiZSByZXR1cm5lZDsgbWF5IHJldHVybiBOVUxMCi0gKiBvciBFUlJfUFRSLgotICoKKyAqIFJldHVybnMgc2dfdGFibGUgY29udGFpbmluZyB0aGUgc2NhdHRlcmxpc3QgdG8gYmUgcmV0dXJuZWQ7IHJldHVybnMgRVJSX1BUUgorICogb24gZXJyb3IuCiAgKi8KIHN0cnVjdCBzZ190YWJsZSAqZG1hX2J1Zl9tYXBfYXR0YWNobWVudChzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2gsCiAJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKQEAgLTMzNCw2ICszMzIsOCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCXNnX3RhYmxlID0gYXR0YWNoLT5kbWFidWYtPm9wcy0+bWFwX2RtYV9idWYoYXR0YWNoLCBkaXJlY3Rpb24pOworCWlmICghc2dfdGFibGUpCisJCXNnX3RhYmxlID0gRVJSX1BUUigtRU5PTUVNKTsKIAogCXJldHVybiBzZ190YWJsZTsKIH0KQEAgLTU0NCw2ICs1NDQsOCBAQAogICogVGhlc2UgY2FsbHMgYXJlIG9wdGlvbmFsIGluIGRyaXZlcnMuIFRoZSBpbnRlbmRlZCB1c2UgZm9yIHRoZW0KICAqIGlzIGZvciBtYXBwaW5nIG9iamVjdHMgbGluZWFyIGluIGtlcm5lbCBzcGFjZSBmb3IgaGlnaCB1c2Ugb2JqZWN0cy4KICAqIFBsZWFzZSBhdHRlbXB0IHRvIHVzZSBrbWFwL2t1bm1hcCBiZWZvcmUgdGhpbmtpbmcgYWJvdXQgdGhlc2UgaW50ZXJmYWNlcy4KKyAqCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAgKi8KIHZvaWQgKmRtYV9idWZfdm1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmKQogewpAQCAtNTY2LDcgKzU2OCw5IEBACiAJQlVHX09OKGRtYWJ1Zi0+dm1hcF9wdHIpOwogCiAJcHRyID0gZG1hYnVmLT5vcHMtPnZtYXAoZG1hYnVmKTsKLQlpZiAoSVNfRVJSX09SX05VTEwocHRyKSkKKwlpZiAoV0FSTl9PTl9PTkNFKElTX0VSUihwdHIpKSkKKwkJcHRyID0gTlVMTDsKKwlpZiAoIXB0cikKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJZG1hYnVmLT52bWFwX3B0ciA9IHB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggYzMwZGY1MGUuLmQyNzZlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC02NDksNyArNjQ5LDkgQEAKIAkJCSAqIHNlZSB0aGUgbWFwcGVkICdidWYtPmRhdGEnIG9uY2UgdGhlIGxvYWRpbmcKIAkJCSAqIGlzIGNvbXBsZXRlZC4KIAkJCSAqICovCi0JCQlmd19tYXBfcGFnZXNfYnVmKGZ3X2J1Zik7CisJCQlpZiAoZndfbWFwX3BhZ2VzX2J1Zihmd19idWYpKQorCQkJCWRldl9lcnIoZGV2LCAiJXM6IG1hcCBwYWdlcyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKIAkJCWxpc3RfZGVsX2luaXQoJmZ3X2J1Zi0+cGVuZGluZ19saXN0KTsKIAkJCWNvbXBsZXRlX2FsbCgmZndfYnVmLT5jb21wbGV0aW9uKTsKIAkJCWJyZWFrOwpAQCAtOTAwLDcgKzkwMiw4IEBACiAJCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKGZfZGV2LCBmYWxzZSk7CiAJCWRldl9kYmcoZl9kZXYsICJmaXJtd2FyZTogcmVxdWVzdGluZyAlc1xuIiwgYnVmLT5md19pZCk7CiAJCWlmICh0aW1lb3V0ICE9IE1BWF9TQ0hFRFVMRV9USU1FT1VUKQotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmd19wcml2LT50aW1lb3V0X3dvcmssIHRpbWVvdXQpOworCQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJCSAgICZmd19wcml2LT50aW1lb3V0X3dvcmssIHRpbWVvdXQpOwogCiAJCWtvYmplY3RfdWV2ZW50KCZmd19wcml2LT5kZXYua29iaiwgS09CSl9BREQpOwogCX0KQEAgLTkwOCw2ICs5MTEsOCBAQAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJ1Zi0+Y29tcGxldGlvbik7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZ3X3ByaXYtPnRpbWVvdXRfd29yayk7CisJaWYgKCFidWYtPmRhdGEpCisJCXJldHZhbCA9IC1FTk9NRU07CiAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZl9kZXYsICZkZXZfYXR0cl9sb2FkaW5nKTsKIGVycl9kZWxfYmluX2F0dHI6CkBAIC0xNTcwLDggKzE1NzUsOCBAQAogICovCiBzdGF0aWMgdm9pZCBkZXZpY2VfdW5jYWNoZV9md19pbWFnZXNfZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkKIHsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ3X2NhY2hlLndvcmssCi0JCQltc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZmd19jYWNoZS53b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogfQogCiBzdGF0aWMgaW50IGZ3X3BtX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmeV9ibG9jaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9ub2RlLmMgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jCmluZGV4IGJjOWY0M2IuLjhmN2VkOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9ub2RlLmMKKysrIGIvZHJpdmVycy9iYXNlL25vZGUuYwpAQCAtNTk5LDcgKzU5OSwxMSBAQAogCiB2b2lkIHVucmVnaXN0ZXJfb25lX25vZGUoaW50IG5pZCkKIHsKKwlpZiAoIW5vZGVfZGV2aWNlc1tuaWRdKQorCQlyZXR1cm47CisKIAl1bnJlZ2lzdGVyX25vZGUobm9kZV9kZXZpY2VzW25pZF0pOworCWtmcmVlKG5vZGVfZGV2aWNlc1tuaWRdKTsKIAlub2RlX2RldmljZXNbbmlkXSA9IE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggYmM3ODg0OC4uZTcxNDcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTQ4MSwxMSArNDgxLDEwIEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKF9kZXYpOwogCWludCByZXQ7CiAKLQlpZiAoQUNQSV9IQU5ETEUoX2RldikpCi0JCWFjcGlfZGV2X3BtX2F0dGFjaChfZGV2LCB0cnVlKTsKKwlhY3BpX2Rldl9wbV9hdHRhY2goX2RldiwgdHJ1ZSk7CiAKIAlyZXQgPSBkcnYtPnByb2JlKGRldik7Ci0JaWYgKHJldCAmJiBBQ1BJX0hBTkRMRShfZGV2KSkKKwlpZiAocmV0KQogCQlhY3BpX2Rldl9wbV9kZXRhY2goX2RldiwgdHJ1ZSk7CiAKIAlpZiAoZHJ2LT5wcmV2ZW50X2RlZmVycmVkX3Byb2JlICYmIHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CkBAIC01MDgsOCArNTA3LDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gZHJ2LT5yZW1vdmUoZGV2KTsKLQlpZiAoQUNQSV9IQU5ETEUoX2RldikpCi0JCWFjcGlfZGV2X3BtX2RldGFjaChfZGV2LCB0cnVlKTsKKwlhY3BpX2Rldl9wbV9kZXRhY2goX2RldiwgdHJ1ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTIwLDggKzUxOCw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKF9kZXYpOwogCiAJZHJ2LT5zaHV0ZG93bihkZXYpOwotCWlmIChBQ1BJX0hBTkRMRShfZGV2KSkKLQkJYWNwaV9kZXZfcG1fZGV0YWNoKF9kZXYsIHRydWUpOworCWFjcGlfZGV2X3BtX2RldGFjaChfZGV2LCB0cnVlKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMKaW5kZXggZTg3MGJiZS4uYjk5ZTZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYwpAQCAtNiw3ICs2LDYgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jCmluZGV4IDVkYTkxNDAuLmRmMmU1ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9jb21tb24uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY29tbW9uLmMKQEAgLTYsNyArNiw2IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKaW5kZXggZGMxMjdlNS4uNmY1NDk2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwpAQCAtNiw3ICs2LDYgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW5fZ292ZXJub3IuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW5fZ292ZXJub3IuYwppbmRleCAyOGRlZTMwLi5hMDg5ZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluX2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbl9nb3Zlcm5vci5jCkBAIC02LDcgKzYsNiBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCmluZGV4IGZhNDE4NzQuLjI1NTM4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCmluZGV4IDMzNDE0YjEuLjdkMTMyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKQEAgLTEzNCw2ICsxMzQsOCBAQAogCiAJLyogaWYgc2V0LCBjb252ZXJ0cyBidWxrIHJ3IHRvIHNpbmdsZSBydyAqLwogCWJvb2wgdXNlX3NpbmdsZV9ydzsKKwkvKiBpZiBzZXQsIHRoZSBkZXZpY2Ugc3VwcG9ydHMgbXVsdGkgd3JpdGUgbW9kZSAqLworCWJvb2wgY2FuX211bHRpX3dyaXRlOwogCiAJc3RydWN0IHJiX3Jvb3QgcmFuZ2VfdHJlZTsKIAl2b2lkICpzZWxlY3Rvcl93b3JrX2J1ZjsJLyogU2NyYXRjaCBidWZmZXIgdXNlZCBmb3Igc2VsZWN0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBkNGRkNzcxLi4yOWI0MTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCkBAIC0yNDksMTEgKzI0OSwxMiBAQAogewogCXVuc2lnbmVkIGludCByZWc7CiAKLQlmb3IgKHJlZyA9IG1pbjsgcmVnIDw9IG1heDsgcmVnKyspIHsKKwlmb3IgKHJlZyA9IG1pbjsgcmVnIDw9IG1heDsgcmVnICs9IG1hcC0+cmVnX3N0cmlkZSkgewogCQl1bnNpZ25lZCBpbnQgdmFsOwogCQlpbnQgcmV0OwogCi0JCWlmIChyZWdtYXBfdm9sYXRpbGUobWFwLCByZWcpKQorCQlpZiAocmVnbWFwX3ZvbGF0aWxlKG1hcCwgcmVnKSB8fAorCQkgICAgIXJlZ21hcF93cml0ZWFibGUobWFwLCByZWcpKQogCQkJY29udGludWU7CiAKIAkJcmV0ID0gcmVnY2FjaGVfcmVhZChtYXAsIHJlZywgJnZhbCk7CkBAIC0zMTIsMTAgKzMxMyw2IEBACiAJLyogQXBwbHkgYW55IHBhdGNoIGZpcnN0ICovCiAJbWFwLT5jYWNoZV9ieXBhc3MgPSAxOwogCWZvciAoaSA9IDA7IGkgPCBtYXAtPnBhdGNoX3JlZ3M7IGkrKykgewotCQlpZiAobWFwLT5wYXRjaFtpXS5yZWcgJSBtYXAtPnJlZ19zdHJpZGUpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQogCQlyZXQgPSBfcmVnbWFwX3dyaXRlKG1hcCwgbWFwLT5wYXRjaFtpXS5yZWcsIG1hcC0+cGF0Y2hbaV0uZGVmKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKG1hcC0+ZGV2LCAiRmFpbGVkIHRvIHdyaXRlICV4ID0gJXg6ICVkXG4iLApAQCAtNjM2LDEwICs2MzMsMTAgQEAKIAlpZiAoKmRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQljb3VudCA9IGN1ciAtIGJhc2U7CisJY291bnQgPSAoY3VyIC0gYmFzZSkgLyBtYXAtPnJlZ19zdHJpZGU7CiAKIAlkZXZfZGJnKG1hcC0+ZGV2LCAiV3JpdGluZyAlenUgYnl0ZXMgZm9yICVkIHJlZ2lzdGVycyBmcm9tIDB4JXgtMHgleFxuIiwKLQkJY291bnQgKiB2YWxfYnl0ZXMsIGNvdW50LCBiYXNlLCBjdXIgLSAxKTsKKwkJY291bnQgKiB2YWxfYnl0ZXMsIGNvdW50LCBiYXNlLCBjdXIgLSBtYXAtPnJlZ19zdHJpZGUpOwogCiAJbWFwLT5jYWNoZV9ieXBhc3MgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKaW5kZXggYzU0NzFjZC4uNDVkODEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYwpAQCAtNTExLDcgKzUxMSw3IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgicmFuZ2UiLCAwNDAwLCBtYXAtPmRlYnVnZnMsCiAJCQkgICAgbWFwLCAmcmVnbWFwX3JlZ19yYW5nZXNfZm9wcyk7CiAKLQlpZiAobWFwLT5tYXhfcmVnaXN0ZXIpIHsKKwlpZiAobWFwLT5tYXhfcmVnaXN0ZXIgfHwgcmVnbWFwX3JlYWRhYmxlKG1hcCwgMCkpIHsKIAkJZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgMDQwMCwgbWFwLT5kZWJ1Z2ZzLAogCQkJCSAgICBtYXAsICZyZWdtYXBfbWFwX2ZvcHMpOwogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhY2Nlc3MiLCAwNDAwLCBtYXAtPmRlYnVnZnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pMmMuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCmluZGV4IGZhNmJmNTIuLmViZDE4OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiBzdGF0aWMgaW50IHJlZ21hcF9pMmNfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaXJxLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYwppbmRleCA4MjY5MjA2Li5lZGY4OGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYwpAQCAtMzY4LDggKzM2OCw2IEBACiAJaWYgKCFkKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCSpkYXRhID0gZDsKLQogCWQtPnN0YXR1c19idWYgPSBremFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogY2hpcC0+bnVtX3JlZ3MsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFkLT5zdGF0dXNfYnVmKQpAQCAtNTA2LDYgKzUwNCw4IEBACiAJCWdvdG8gZXJyX2RvbWFpbjsKIAl9CiAKKwkqZGF0YSA9IGQ7CisKIAlyZXR1cm4gMDsKIAogZXJyX2RvbWFpbjoKQEAgLTUzMyw3ICs1MzMsNyBAQAogCQlyZXR1cm47CiAKIAlmcmVlX2lycShpcnEsIGQpOwotCS8qIFdlIHNob3VsZCB1bm1hcCB0aGUgZG9tYWluIGJ1dC4uLiAqLworCWlycV9kb21haW5fcmVtb3ZlKGQtPmRvbWFpbik7CiAJa2ZyZWUoZC0+d2FrZV9idWYpOwogCWtmcmVlKGQtPm1hc2tfYnVmX2RlZik7CiAJa2ZyZWUoZC0+bWFza19idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtbW1pby5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtbW1pby5jCmluZGV4IDgxZjk3NzUuLjFlMDNlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLW1taW8uYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1tbWlvLmMKQEAgLTE4LDcgKzE4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMjYsMTAgKzI1LDQ3IEBACiAKIHN0cnVjdCByZWdtYXBfbW1pb19jb250ZXh0IHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgcmVnX2J5dGVzOwogCXVuc2lnbmVkIHZhbF9ieXRlczsKKwl1bnNpZ25lZCBwYWRfYnl0ZXM7CiAJc3RydWN0IGNsayAqY2xrOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHJlZ21hcF9tbWlvX3JlZ3NpemVfY2hlY2soc2l6ZV90IHJlZ19zaXplKQoreworCXN3aXRjaCAocmVnX3NpemUpIHsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgNDoKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwljYXNlIDg6CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlZ21hcF9tbWlvX3JlZ2JpdHNfY2hlY2soc2l6ZV90IHJlZ19iaXRzKQoreworCXN3aXRjaCAocmVnX2JpdHMpIHsKKwljYXNlIDg6CisJY2FzZSAxNjoKKwljYXNlIDMyOgorI2lmZGVmIENPTkZJR182NEJJVAorCWNhc2UgNjQ6CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnbWFwX21taW9fY291bnRfY2hlY2soc2l6ZV90IGNvdW50KQoreworCUJVR19PTihjb3VudCAlIDIgIT0gMCk7Cit9CisKIHN0YXRpYyBpbnQgcmVnbWFwX21taW9fZ2F0aGVyX3dyaXRlKHZvaWQgKmNvbnRleHQsCiAJCQkJICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAogCQkJCSAgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKQEAgLTM4LDcgKzc0LDcgQEAKIAl1MzIgb2Zmc2V0OwogCWludCByZXQ7CiAKLQlCVUdfT04ocmVnX3NpemUgIT0gNCk7CisJcmVnbWFwX21taW9fcmVnc2l6ZV9jaGVjayhyZWdfc2l6ZSk7CiAKIAlpZiAoIUlTX0VSUihjdHgtPmNsaykpIHsKIAkJcmV0ID0gY2xrX2VuYWJsZShjdHgtPmNsayk7CkBAIC04MSw5ICsxMTcsMTMgQEAKIAogc3RhdGljIGludCByZWdtYXBfbW1pb193cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCiB7Ci0JQlVHX09OKGNvdW50IDwgNCk7CisJc3RydWN0IHJlZ21hcF9tbWlvX2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisJdTMyIG9mZnNldCA9IGN0eC0+cmVnX2J5dGVzICsgY3R4LT5wYWRfYnl0ZXM7CiAKLQlyZXR1cm4gcmVnbWFwX21taW9fZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIDQsIGRhdGEgKyA0LCBjb3VudCAtIDQpOworCXJlZ21hcF9tbWlvX2NvdW50X2NoZWNrKGNvdW50KTsKKworCXJldHVybiByZWdtYXBfbW1pb19nYXRoZXJfd3JpdGUoY29udGV4dCwgZGF0YSwgY3R4LT5yZWdfYnl0ZXMsCisJCQkJCWRhdGEgKyBvZmZzZXQsIGNvdW50IC0gb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCByZWdtYXBfbW1pb19yZWFkKHZvaWQgKmNvbnRleHQsCkBAIC05NCw3ICsxMzQsNyBAQAogCXUzMiBvZmZzZXQ7CiAJaW50IHJldDsKIAotCUJVR19PTihyZWdfc2l6ZSAhPSA0KTsKKwlyZWdtYXBfbW1pb19yZWdzaXplX2NoZWNrKHJlZ19zaXplKTsKIAogCWlmICghSVNfRVJSKGN0eC0+Y2xrKSkgewogCQlyZXQgPSBjbGtfZW5hYmxlKGN0eC0+Y2xrKTsKQEAgLTE2NSw4ICsyMDUsOSBAQAogCWludCBtaW5fc3RyaWRlOwogCWludCByZXQ7CiAKLQlpZiAoY29uZmlnLT5yZWdfYml0cyAhPSAzMikKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJcmV0ID0gcmVnbWFwX21taW9fcmVnYml0c19jaGVjayhjb25maWctPnJlZ19iaXRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCiAJaWYgKGNvbmZpZy0+cGFkX2JpdHMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjA5LDYgKzI1MCw4IEBACiAKIAljdHgtPnJlZ3MgPSByZWdzOwogCWN0eC0+dmFsX2J5dGVzID0gY29uZmlnLT52YWxfYml0cyAvIDg7CisJY3R4LT5yZWdfYnl0ZXMgPSBjb25maWctPnJlZ19iaXRzIC8gODsKKwljdHgtPnBhZF9ieXRlcyA9IGNvbmZpZy0+cGFkX2JpdHMgLyA4OwogCWN0eC0+Y2xrID0gRVJSX1BUUigtRU5PREVWKTsKIAogCWlmIChjbGtfaWQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwaS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKaW5kZXggMzdmMTJhZS4uMGViMzA5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKQEAgLTEyLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BtaS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BtaS5jCmluZGV4IGFjMjM5MTAuLmQ3MDI2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwbWkuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zcG1pLmMKQEAgLTIyLDY5ICsyMiwyMzUgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLXN0YXRpYyBpbnQgcmVnbWFwX3NwbWlfcmVhZCh2b2lkICpjb250ZXh0LAotCQkJICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAotCQkJICAgIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQorc3RhdGljIGludCByZWdtYXBfc3BtaV9iYXNlX3JlYWQodm9pZCAqY29udGV4dCwKKwkJCQkgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkJIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQogewotCUJVR19PTihyZWdfc2l6ZSAhPSAyKTsKLQlyZXR1cm4gc3BtaV9leHRfcmVnaXN0ZXJfcmVhZGwoY29udGV4dCwgKih1MTYgKilyZWcsCi0JCQkJICAgICAgIHZhbCwgdmFsX3NpemUpOworCXU4IGFkZHIgPSAqKHU4ICopcmVnOworCWludCBlcnIgPSAwOworCisJQlVHX09OKHJlZ19zaXplICE9IDEpOworCisJd2hpbGUgKHZhbF9zaXplLS0gJiYgIWVycikKKwkJZXJyID0gc3BtaV9yZWdpc3Rlcl9yZWFkKGNvbnRleHQsIGFkZHIrKywgdmFsKyspOworCisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWdtYXBfc3BtaV9nYXRoZXJfd3JpdGUodm9pZCAqY29udGV4dCwKLQkJCQkgICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQkJICAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQorc3RhdGljIGludCByZWdtYXBfc3BtaV9iYXNlX2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCQkgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkJCSBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKIHsKLQlCVUdfT04ocmVnX3NpemUgIT0gMik7Ci0JcmV0dXJuIHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlbChjb250ZXh0LCAqKHUxNiAqKXJlZywgdmFsLCB2YWxfc2l6ZSk7CisJY29uc3QgdTggKmRhdGEgPSB2YWw7CisJdTggYWRkciA9ICoodTggKilyZWc7CisJaW50IGVyciA9IDA7CisKKwlCVUdfT04ocmVnX3NpemUgIT0gMSk7CisKKwkvKgorCSAqIFNQTUkgZGVmaW5lcyBhIG1vcmUgYmFuZHdpZHRoLWVmZmljaWVudCAnUmVnaXN0ZXIgMCBXcml0ZScgc2VxdWVuY2UsCisJICogdXNlIGl0IHdoZW4gcG9zc2libGUuCisJICovCisJaWYgKGFkZHIgPT0gMCAmJiB2YWxfc2l6ZSkgeworCQllcnIgPSBzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUoY29udGV4dCwgKmRhdGEpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWRhdGErKzsKKwkJYWRkcisrOworCQl2YWxfc2l6ZS0tOworCX0KKworCXdoaWxlICh2YWxfc2l6ZSkgeworCQllcnIgPSBzcG1pX3JlZ2lzdGVyX3dyaXRlKGNvbnRleHQsIGFkZHIsICpkYXRhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKworCQlkYXRhKys7CisJCWFkZHIrKzsKKwkJdmFsX3NpemUtLTsKKwl9CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWdtYXBfc3BtaV93cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLAotCQkJICAgICBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHJlZ21hcF9zcG1pX2Jhc2Vfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIHNpemVfdCBjb3VudCkKIHsKLQlCVUdfT04oY291bnQgPCAyKTsKLQlyZXR1cm4gcmVnbWFwX3NwbWlfZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIDIsIGRhdGEgKyAyLCBjb3VudCAtIDIpOworCUJVR19PTihjb3VudCA8IDEpOworCXJldHVybiByZWdtYXBfc3BtaV9iYXNlX2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCAxLCBkYXRhICsgMSwKKwkJCQkJICAgICBjb3VudCAtIDEpOwogfQogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9idXMgcmVnbWFwX3NwbWkgPSB7Ci0JLnJlYWQJCQkJPSByZWdtYXBfc3BtaV9yZWFkLAotCS53cml0ZQkJCQk9IHJlZ21hcF9zcG1pX3dyaXRlLAotCS5nYXRoZXJfd3JpdGUJCQk9IHJlZ21hcF9zcG1pX2dhdGhlcl93cml0ZSwKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3BtaV9iYXNlID0geworCS5yZWFkCQkJCT0gcmVnbWFwX3NwbWlfYmFzZV9yZWFkLAorCS53cml0ZQkJCQk9IHJlZ21hcF9zcG1pX2Jhc2Vfd3JpdGUsCisJLmdhdGhlcl93cml0ZQkJCT0gcmVnbWFwX3NwbWlfYmFzZV9nYXRoZXJfd3JpdGUsCiAJLnJlZ19mb3JtYXRfZW5kaWFuX2RlZmF1bHQJPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKIAkudmFsX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdAk9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAogfTsKIAogLyoqCi0gKiByZWdtYXBfaW5pdF9zcG1pKCk6IEluaXRpYWxpemUgcmVnaXN0ZXIgbWFwCi0gKgotICogQHNkZXY6IERldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCi0gKiBAY29uZmlnOiBDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqIHJlZ21hcF9pbml0X3NwbWlfYmFzZSgpOiBDcmVhdGUgcmVnbWFwIGZvciB0aGUgQmFzZSByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CVNQTUkgZGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6CUNvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAogICoKICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyIHRvCiAgKiBhIHN0cnVjdCByZWdtYXAuCiAgKi8KLXN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAotCQkJCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKIHsKLQlyZXR1cm4gcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pLCBzZGV2LCBjb25maWcpOworCXJldHVybiByZWdtYXBfaW5pdCgmc2Rldi0+ZGV2LCAmcmVnbWFwX3NwbWlfYmFzZSwgc2RldiwgY29uZmlnKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9pbml0X3NwbWkpOworRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2luaXRfc3BtaV9iYXNlKTsKIAogLyoqCi0gKiBkZXZtX3JlZ21hcF9pbml0X3NwbWkoKTogSW5pdGlhbGlzZSBtYW5hZ2VkIHJlZ2lzdGVyIG1hcAotICoKLSAqIEBzZGV2OiBEZXZpY2UgdGhhdCB3aWxsIGJlIGludGVyYWN0ZWQgd2l0aAotICogQGNvbmZpZzogQ29uZmlndXJhdGlvbiBmb3IgcmVnaXN0ZXIgbWFwCisgKiBkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZSgpOiBDcmVhdGUgbWFuYWdlZCByZWdtYXAgZm9yIEJhc2UgcmVnaXN0ZXIgc3BhY2UKKyAqIEBzZGV2OglTUE1JIGRldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOglDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKICAqCiAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlcgogICogdG8gYSBzdHJ1Y3QgcmVnbWFwLiAgVGhlIHJlZ21hcCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgYnkgdGhlCiAgKiBkZXZpY2UgbWFuYWdlbWVudCBjb2RlLgogICovCi1zdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pX2Jhc2UsIHNkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZSk7CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X3JlYWQodm9pZCAqY29udGV4dCwKKwkJCQljb25zdCB2b2lkICpyZWcsIHNpemVfdCByZWdfc2l6ZSwKKwkJCQl2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzaXplX3QgbGVuOworCXUxNiBhZGRyOworCisJQlVHX09OKHJlZ19zaXplICE9IDIpOworCisJYWRkciA9ICoodTE2ICopcmVnOworCisJLyoKKwkgKiBTcGxpdCBhY2Nlc3NlcyBpbnRvIHR3byB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbW9yZQorCSAqIGJhbmR3aWR0aC1lZmZpY2llbnQgJ0V4dGVuZGVkIFJlZ2lzdGVyIFJlYWQnIGNvbW1hbmQgd2hlbiBwb3NzaWJsZQorCSAqLworCXdoaWxlIChhZGRyIDw9IDB4RkYgJiYgdmFsX3NpemUpIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCB2YWxfc2l6ZSwgMTYpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWQoY29udGV4dCwgYWRkciwgdmFsLCBsZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCisJd2hpbGUgKHZhbF9zaXplKSB7CisJCWxlbiA9IG1pbl90KHNpemVfdCwgdmFsX3NpemUsIDgpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKGNvbnRleHQsIGFkZHIsIHZhbCwgdmFsX3NpemUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCQljb25zdCB2b2lkICpyZWcsIHNpemVfdCByZWdfc2l6ZSwKKwkJCQkJY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCit7CisJaW50IGVyciA9IDA7CisJc2l6ZV90IGxlbjsKKwl1MTYgYWRkcjsKKworCUJVR19PTihyZWdfc2l6ZSAhPSAyKTsKKworCWFkZHIgPSAqKHUxNiAqKXJlZzsKKworCXdoaWxlIChhZGRyIDw9IDB4RkYgJiYgdmFsX3NpemUpIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCB2YWxfc2l6ZSwgMTYpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKGNvbnRleHQsIGFkZHIsIHZhbCwgbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKworCQlhZGRyICs9IGxlbjsKKwkJdmFsICs9IGxlbjsKKwkJdmFsX3NpemUgLT0gbGVuOworCX0KKworCXdoaWxlICh2YWxfc2l6ZSkgeworCQlsZW4gPSBtaW5fdChzaXplX3QsIHZhbF9zaXplLCA4KTsKKworCQllcnIgPSBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoY29udGV4dCwgYWRkciwgdmFsLCBsZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlCVUdfT04oY291bnQgPCAyKTsKKwlyZXR1cm4gcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCAyLCBkYXRhICsgMiwKKwkJCQkJICAgIGNvdW50IC0gMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3BtaV9leHQgPSB7CisJLnJlYWQJCQkJPSByZWdtYXBfc3BtaV9leHRfcmVhZCwKKwkud3JpdGUJCQkJPSByZWdtYXBfc3BtaV9leHRfd3JpdGUsCisJLmdhdGhlcl93cml0ZQkJCT0gcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZSwKKwkucmVnX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdAk9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS52YWxfZm9ybWF0X2VuZGlhbl9kZWZhdWx0CT0gUkVHTUFQX0VORElBTl9OQVRJVkUsCit9OworCisvKioKKyAqIHJlZ21hcF9pbml0X3NwbWlfZXh0KCk6IENyZWF0ZSByZWdtYXAgZm9yIEV4dCByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CURldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOglDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlciB0bworICogYSBzdHJ1Y3QgcmVnbWFwLgorICovCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2V4dChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIHJlZ21hcF9pbml0KCZzZGV2LT5kZXYsICZyZWdtYXBfc3BtaV9leHQsIHNkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfaW5pdF9zcG1pX2V4dCk7CisKKy8qKgorICogZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2V4dCgpOiBDcmVhdGUgbWFuYWdlZCByZWdtYXAgZm9yIEV4dCByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CVNQTUkgZGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6CUNvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyCisgKiB0byBhIHN0cnVjdCByZWdtYXAuICBUaGUgcmVnbWFwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCBieSB0aGUKKyAqIGRldmljZSBtYW5hZ2VtZW50IGNvZGUuCisgKi8KK3N0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BtaV9leHQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKIHsKLQlyZXR1cm4gZGV2bV9yZWdtYXBfaW5pdCgmc2Rldi0+ZGV2LCAmcmVnbWFwX3NwbWksIHNkZXYsIGNvbmZpZyk7CisJcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pX2V4dCwgc2RldiwgY29uZmlnKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRldm1fcmVnbWFwX2luaXRfc3BtaSk7CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ21hcF9pbml0X3NwbWlfZXh0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKaW5kZXggNmExOTUxNS4uZDBhMDcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCkBAIC0zODAsNiArMzgwLDI4IEBACiAJa2ZyZWUobWFwLT5zZWxlY3Rvcl93b3JrX2J1Zik7CiB9CiAKK2ludCByZWdtYXBfYXR0YWNoX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICoqbTsKKworCW1hcC0+ZGV2ID0gZGV2OworCisJcmVnbWFwX2RlYnVnZnNfaW5pdChtYXAsIGNvbmZpZy0+bmFtZSk7CisKKwkvKiBBZGQgYSBkZXZyZXMgcmVzb3VyY2UgZm9yIGRldl9nZXRfcmVnbWFwKCkgKi8KKwltID0gZGV2cmVzX2FsbG9jKGRldl9nZXRfcmVnbWFwX3JlbGVhc2UsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOworCWlmICghbSkgeworCQlyZWdtYXBfZGVidWdmc19leGl0KG1hcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkqbSA9IG1hcDsKKwlkZXZyZXNfYWRkKGRldiwgbSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9hdHRhY2hfZGV2KTsKKwogLyoqCiAgKiByZWdtYXBfaW5pdCgpOiBJbml0aWFsaXNlIHJlZ2lzdGVyIG1hcAogICoKQEAgLTM5Nyw3ICs0MTksNyBAQAogCQkJICAgdm9pZCAqYnVzX2NvbnRleHQsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKQogewotCXN0cnVjdCByZWdtYXAgKm1hcCwgKiptOworCXN0cnVjdCByZWdtYXAgKm1hcDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAllbnVtIHJlZ21hcF9lbmRpYW4gcmVnX2VuZGlhbiwgdmFsX2VuZGlhbjsKIAlpbnQgaSwgajsKQEAgLTQzOSw2ICs0NjEsNyBAQAogCWVsc2UKIAkJbWFwLT5yZWdfc3RyaWRlID0gMTsKIAltYXAtPnVzZV9zaW5nbGVfcncgPSBjb25maWctPnVzZV9zaW5nbGVfcnc7CisJbWFwLT5jYW5fbXVsdGlfd3JpdGUgPSBjb25maWctPmNhbl9tdWx0aV93cml0ZTsKIAltYXAtPmRldiA9IGRldjsKIAltYXAtPmJ1cyA9IGJ1czsKIAltYXAtPmJ1c19jb250ZXh0ID0gYnVzX2NvbnRleHQ7CkBAIC03MTgsNyArNzQxLDcgQEAKIAkJbmV3LT53aW5kb3dfc3RhcnQgPSByYW5nZV9jZmctPndpbmRvd19zdGFydDsKIAkJbmV3LT53aW5kb3dfbGVuID0gcmFuZ2VfY2ZnLT53aW5kb3dfbGVuOwogCi0JCWlmIChfcmVnbWFwX3JhbmdlX2FkZChtYXAsIG5ldykgPT0gZmFsc2UpIHsKKwkJaWYgKCFfcmVnbWFwX3JhbmdlX2FkZChtYXAsIG5ldykpIHsKIAkJCWRldl9lcnIobWFwLT5kZXYsICJGYWlsZWQgdG8gYWRkIHJhbmdlICVkXG4iLCBpKTsKIAkJCWtmcmVlKG5ldyk7CiAJCQlnb3RvIGVycl9yYW5nZTsKQEAgLTczNCwyNSArNzU3LDE4IEBACiAJCX0KIAl9CiAKLQlyZWdtYXBfZGVidWdmc19pbml0KG1hcCwgY29uZmlnLT5uYW1lKTsKLQogCXJldCA9IHJlZ2NhY2hlX2luaXQobWFwLCBjb25maWcpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJfcmFuZ2U7CiAKLQkvKiBBZGQgYSBkZXZyZXMgcmVzb3VyY2UgZm9yIGRldl9nZXRfcmVnbWFwKCkgKi8KLQltID0gZGV2cmVzX2FsbG9jKGRldl9nZXRfcmVnbWFwX3JlbGVhc2UsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOwotCWlmICghbSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kZWJ1Z2ZzOwotCX0KLQkqbSA9IG1hcDsKLQlkZXZyZXNfYWRkKGRldiwgbSk7CisJaWYgKGRldikKKwkJcmV0ID0gcmVnbWFwX2F0dGFjaF9kZXYoZGV2LCBtYXAsIGNvbmZpZyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyX3JlZ2NhY2hlOwogCiAJcmV0dXJuIG1hcDsKIAotZXJyX2RlYnVnZnM6Ci0JcmVnbWFwX2RlYnVnZnNfZXhpdChtYXApOworZXJyX3JlZ2NhY2hlOgogCXJlZ2NhY2hlX2V4aXQobWFwKTsKIGVycl9yYW5nZToKIAlyZWdtYXBfcmFuZ2VfZXhpdChtYXApOwpAQCAtMTUyMCwxMiArMTUzNiwxMiBAQAogCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCS8qCiAJICogU29tZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQgYnVsayB3cml0ZSwgZm9yCiAJICogdGhlbSB3ZSBoYXZlIGEgc2VyaWVzIG9mIHNpbmdsZSB3cml0ZSBvcGVyYXRpb25zLgogCSAqLwogCWlmICghbWFwLT5idXMgfHwgbWFwLT51c2Vfc2luZ2xlX3J3KSB7CisJCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAkJZm9yIChpID0gMDsgaSA8IHZhbF9jb3VudDsgaSsrKSB7CiAJCQl1bnNpZ25lZCBpbnQgaXZhbDsKIApAQCAtMTU1NCwzMSArMTU3MCwyMzkgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQlnb3RvIG91dDsKIAkJfQorb3V0OgorCQltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIAl9IGVsc2UgewogCQl2b2lkICp3dmFsOwogCiAJCXd2YWwgPSBrbWVtZHVwKHZhbCwgdmFsX2NvdW50ICogdmFsX2J5dGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF3dmFsKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwogCQkJZGV2X2VycihtYXAtPmRldiwgIkVycm9yIGluIG1lbW9yeSBhbGxvY2F0aW9uXG4iKTsKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IHZhbF9jb3VudCAqIHZhbF9ieXRlczsgaSArPSB2YWxfYnl0ZXMpCiAJCQltYXAtPmZvcm1hdC5wYXJzZV9pbnBsYWNlKHd2YWwgKyBpKTsKIAorCQltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7CiAJCXJldCA9IF9yZWdtYXBfcmF3X3dyaXRlKG1hcCwgcmVnLCB3dmFsLCB2YWxfYnl0ZXMgKiB2YWxfY291bnQpOworCQltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIAogCQlrZnJlZSh3dmFsKTsKIAl9Ci1vdXQ6Ci0JbWFwLT51bmxvY2sobWFwLT5sb2NrX2FyZyk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9idWxrX3dyaXRlKTsKIAogLyoKKyAqIF9yZWdtYXBfcmF3X211bHRpX3JlZ193cml0ZSgpCisgKgorICogdGhlIChyZWdpc3RlcixuZXd2YWx1ZSkgcGFpcnMgaW4gcmVncyBoYXZlIG5vdCBiZWVuIGZvcm1hdHRlZCwgYnV0CisgKiB0aGV5IGFyZSBhbGwgaW4gdGhlIHNhbWUgcGFnZSBhbmQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gYmVpbmcgcGFnZQorICogcmVsYXRpdmUuIFRoZSBwYWdlIHJlZ2lzdGVyIGhhcyBiZWVuIHdyaXR0ZW4gaWYgdGhhdCB3YXMgbmVjY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCisJCQkJICAgICAgIHNpemVfdCBudW1fcmVncykKK3sKKwlpbnQgcmV0OworCXZvaWQgKmJ1ZjsKKwlpbnQgaTsKKwl1OCAqdTg7CisJc2l6ZV90IHZhbF9ieXRlcyA9IG1hcC0+Zm9ybWF0LnZhbF9ieXRlczsKKwlzaXplX3QgcmVnX2J5dGVzID0gbWFwLT5mb3JtYXQucmVnX2J5dGVzOworCXNpemVfdCBwYWRfYnl0ZXMgPSBtYXAtPmZvcm1hdC5wYWRfYnl0ZXM7CisJc2l6ZV90IHBhaXJfc2l6ZSA9IHJlZ19ieXRlcyArIHBhZF9ieXRlcyArIHZhbF9ieXRlczsKKwlzaXplX3QgbGVuID0gcGFpcl9zaXplICogbnVtX3JlZ3M7CisKKwlidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogV2UgaGF2ZSB0byBsaW5lYXJpc2UgYnkgaGFuZC4gKi8KKworCXU4ID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJaW50IHJlZyA9IHJlZ3NbaV0ucmVnOworCQlpbnQgdmFsID0gcmVnc1tpXS5kZWY7CisJCXRyYWNlX3JlZ21hcF9od193cml0ZV9zdGFydChtYXAtPmRldiwgcmVnLCAxKTsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyh1OCwgcmVnLCBtYXAtPnJlZ19zaGlmdCk7CisJCXU4ICs9IHJlZ19ieXRlcyArIHBhZF9ieXRlczsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3ZhbCh1OCwgdmFsLCAwKTsKKwkJdTggKz0gdmFsX2J5dGVzOworCX0KKwl1OCA9IGJ1ZjsKKwkqdTggfD0gbWFwLT53cml0ZV9mbGFnX21hc2s7CisKKwlyZXQgPSBtYXAtPmJ1cy0+d3JpdGUobWFwLT5idXNfY29udGV4dCwgYnVmLCBsZW4pOworCisJa2ZyZWUoYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCWludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJdHJhY2VfcmVnbWFwX2h3X3dyaXRlX2RvbmUobWFwLT5kZXYsIHJlZywgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX3JlZ21hcF9yZWdpc3Rlcl9wYWdlKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCQkgIHN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2UpCit7CisJdW5zaWduZWQgaW50IHdpbl9wYWdlID0gKHJlZyAtIHJhbmdlLT5yYW5nZV9taW4pIC8gcmFuZ2UtPndpbmRvd19sZW47CisKKwlyZXR1cm4gd2luX3BhZ2U7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9yYW5nZV9tdWx0aV9wYWdlZF9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCQkgICAgICAgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCQkgICAgICAgc2l6ZV90IG51bV9yZWdzKQoreworCWludCByZXQ7CisJaW50IGksIG47CisJc3RydWN0IHJlZ19kZWZhdWx0ICpiYXNlOworCXVuc2lnbmVkIGludCB0aGlzX3BhZ2U7CisJLyoKKwkgKiB0aGUgc2V0IG9mIHJlZ2lzdGVycyBhcmUgbm90IG5lY2Nlc3NhcmlseSBpbiBvcmRlciwgYnV0CisJICogc2luY2UgdGhlIG9yZGVyIG9mIHdyaXRlIG11c3QgYmUgcHJlc2VydmVkIHRoaXMgYWxnb3JpdGhtCisJICogY2hvcHMgdGhlIHNldCBlYWNoIHRpbWUgdGhlIHBhZ2UgY2hhbmdlcworCSAqLworCWJhc2UgPSByZWdzOworCWZvciAoaSA9IDAsIG4gPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKywgbisrKSB7CisJCXVuc2lnbmVkIGludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJc3RydWN0IHJlZ21hcF9yYW5nZV9ub2RlICpyYW5nZTsKKworCQlyYW5nZSA9IF9yZWdtYXBfcmFuZ2VfbG9va3VwKG1hcCwgcmVnKTsKKwkJaWYgKHJhbmdlKSB7CisJCQl1bnNpZ25lZCBpbnQgd2luX3BhZ2UgPSBfcmVnbWFwX3JlZ2lzdGVyX3BhZ2UobWFwLCByZWcsCisJCQkJCQkJCSAgICAgIHJhbmdlKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQl0aGlzX3BhZ2UgPSB3aW5fcGFnZTsKKwkJCWlmICh3aW5fcGFnZSAhPSB0aGlzX3BhZ2UpIHsKKwkJCQl0aGlzX3BhZ2UgPSB3aW5fcGFnZTsKKwkJCQlyZXQgPSBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUobWFwLCBiYXNlLCBuKTsKKwkJCQlpZiAocmV0ICE9IDApCisJCQkJCXJldHVybiByZXQ7CisJCQkJYmFzZSArPSBuOworCQkJCW4gPSAwOworCQkJfQorCQkJcmV0ID0gX3JlZ21hcF9zZWxlY3RfcGFnZShtYXAsICZiYXNlW25dLnJlZywgcmFuZ2UsIDEpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKG4gPiAwKQorCQlyZXR1cm4gX3JlZ21hcF9yYXdfbXVsdGlfcmVnX3dyaXRlKG1hcCwgYmFzZSwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCQkgICBzaXplX3QgbnVtX3JlZ3MpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmICghbWFwLT5jYW5fbXVsdGlfd3JpdGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFtYXAtPmZvcm1hdC5wYXJzZV9pbnBsYWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXAtPndyaXRlYWJsZV9yZWcpCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCQlpbnQgcmVnID0gcmVnc1tpXS5yZWc7CisJCQlpZiAoIW1hcC0+d3JpdGVhYmxlX3JlZyhtYXAtPmRldiwgcmVnKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCWlmICghbWFwLT5jYWNoZV9ieXBhc3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCB2YWwgPSByZWdzW2ldLmRlZjsKKwkJCXVuc2lnbmVkIGludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJCXJldCA9IHJlZ2NhY2hlX3dyaXRlKG1hcCwgcmVnLCB2YWwpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIobWFwLT5kZXYsCisJCQkJIkVycm9yIGluIGNhY2hpbmcgb2YgcmVnaXN0ZXI6ICV4IHJldDogJWRcbiIsCisJCQkJCQkJCXJlZywgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWlmIChtYXAtPmNhY2hlX29ubHkpIHsKKwkJCW1hcC0+Y2FjaGVfZGlydHkgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlXQVJOX09OKCFtYXAtPmJ1cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgcmVnID0gcmVnc1tpXS5yZWc7CisJCXN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2U7CisJCXJhbmdlID0gX3JlZ21hcF9yYW5nZV9sb29rdXAobWFwLCByZWcpOworCQlpZiAocmFuZ2UpIHsKKwkJCXNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IHJlZ19kZWZhdWx0KSpudW1fcmVnczsKKwkJCXN0cnVjdCByZWdfZGVmYXVsdCAqYmFzZSA9IGttZW1kdXAocmVncywgbGVuLAorCQkJCQkJCSAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFiYXNlKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gX3JlZ21hcF9yYW5nZV9tdWx0aV9wYWdlZF9yZWdfd3JpdGUobWFwLCBiYXNlLAorCQkJCQkJCQkgIG51bV9yZWdzKTsKKwkJCWtmcmVlKGJhc2UpOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7Cit9CisKKy8qCiAgKiByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKCk6IFdyaXRlIG11bHRpcGxlIHJlZ2lzdGVycyB0byB0aGUgZGV2aWNlCiAgKgorICogd2hlcmUgdGhlIHNldCBvZiByZWdpc3Rlcix2YWx1ZSBwYWlycyBhcmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLAorICogcG9zc2libHkgbm90IGFsbCBpbiBhIHNpbmdsZSByYW5nZS4KKyAqCisgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KKyAqIEByZWdzOiBBcnJheSBvZiBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgcmVnaXN0ZXIsdmFsdWUgdG8gYmUgd3JpdHRlbgorICogQG51bV9yZWdzOiBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHdyaXRlCisgKgorICogVGhlICdub3JtYWwnIGJsb2NrIHdyaXRlIG1vZGUgd2lsbCBzZW5kIHVsdGltYXRlbHkgc2VuZCBkYXRhIG9uIHRoZQorICogdGFyZ2V0IGJ1cyBhcyBSLFYxLFYyLFYzLC4uLFZuIHdoZXJlIHN1Y2Nlc3NpdmVseSBoaWdlciByZWdpc3RlcnMgYXJlCisgKiBhZGRyZXNzZWQuIEhvd2V2ZXIsIHRoaXMgYWx0ZXJuYXRpdmUgYmxvY2sgbXVsdGkgd3JpdGUgbW9kZSB3aWxsIHNlbmQKKyAqIHRoZSBkYXRhIGFzIFIxLFYxLFIyLFYyLC4uLFJuLFZuIG9uIHRoZSB0YXJnZXQgYnVzLiBUaGUgdGFyZ2V0IGRldmljZQorICogbXVzdCBvZiBjb3Vyc2Ugc3VwcG9ydCB0aGUgbW9kZS4KKyAqCisgKiBBIHZhbHVlIG9mIHplcm8gd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHdpbGwgYmUKKyAqIHJldHVybmVkIGluIGVycm9yIGNhc2VzLgorICovCitpbnQgcmVnbWFwX211bHRpX3JlZ193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCSAgIGludCBudW1fcmVncykKK3sKKwlpbnQgcmV0OworCisJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisKKwltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKTsKKworLyoKKyAqIHJlZ21hcF9tdWx0aV9yZWdfd3JpdGVfYnlwYXNzZWQoKTogV3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgYnV0IG5vdCB0aGUgY2FjaGUKKyAqCiAgKiB3aGVyZSB0aGUgc2V0IG9mIHJlZ2lzdGVyIGFyZSBzdXBwbGllZCBpbiBhbnkgb3JkZXIKICAqCiAgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KQEAgLTE1OTIsMzAgKzE4MTYsMjcgQEAKICAqIEEgdmFsdWUgb2YgemVybyB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gd2lsbAogICogYmUgcmV0dXJuZWQgaW4gZXJyb3IgY2FzZXMuCiAgKi8KLWludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAotCQkJCWludCBudW1fcmVncykKK2ludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlX2J5cGFzc2VkKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCSAgICBpbnQgbnVtX3JlZ3MpCiB7Ci0JaW50IHJldCA9IDAsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgewotCQlpbnQgcmVnID0gcmVnc1tpXS5yZWc7Ci0JCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaW50IHJldDsKKwlib29sIGJ5cGFzczsKIAogCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7Ci0JCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlnb3RvIG91dDsKLQl9Ci1vdXQ6CisJYnlwYXNzID0gbWFwLT5jYWNoZV9ieXBhc3M7CisJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisKKwltYXAtPmNhY2hlX2J5cGFzcyA9IGJ5cGFzczsKKwogCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUpOworRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX211bHRpX3JlZ193cml0ZV9ieXBhc3NlZCk7CiAKIC8qKgogICogcmVnbWFwX3Jhd193cml0ZV9hc3luYygpOiBXcml0ZSByYXcgdmFsdWVzIHRvIG9uZSBvciBtb3JlIHJlZ2lzdGVycwpAQCAtMTczNiw2ICsxOTU3LDkgQEAKIAlpZiAobWFwLT5jYWNoZV9vbmx5KQogCQlyZXR1cm4gLUVCVVNZOwogCisJaWYgKCFyZWdtYXBfcmVhZGFibGUobWFwLCByZWcpKQorCQlyZXR1cm4gLUVJTzsKKwogCXJldCA9IG1hcC0+cmVnX3JlYWQoY29udGV4dCwgcmVnLCB2YWwpOwogCWlmIChyZXQgPT0gMCkgewogI2lmZGVmIExPR19ERVZJQ0UKQEAgLTE5NjYsOSArMjE5MCwxMSBAQAogCiAJaWYgKHRtcCAhPSBvcmlnKSB7CiAJCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWcsIHRtcCk7Ci0JCSpjaGFuZ2UgPSB0cnVlOworCQlpZiAoY2hhbmdlKQorCQkJKmNoYW5nZSA9IHRydWU7CiAJfSBlbHNlIHsKLQkJKmNoYW5nZSA9IGZhbHNlOworCQlpZiAoY2hhbmdlKQorCQkJKmNoYW5nZSA9IGZhbHNlOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTg3LDExICsyMjEzLDEwIEBACiBpbnQgcmVnbWFwX3VwZGF0ZV9iaXRzKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQogewotCWJvb2wgY2hhbmdlOwogCWludCByZXQ7CiAKIAltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7Ci0JcmV0ID0gX3JlZ21hcF91cGRhdGVfYml0cyhtYXAsIHJlZywgbWFzaywgdmFsLCAmY2hhbmdlKTsKKwlyZXQgPSBfcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwsIE5VTEwpOwogCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIwMTYsMTQgKzIyNDEsMTMgQEAKIGludCByZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCkKIHsKLQlib29sIGNoYW5nZTsKIAlpbnQgcmV0OwogCiAJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJbWFwLT5hc3luYyA9IHRydWU7CiAKLQlyZXQgPSBfcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwsICZjaGFuZ2UpOworCXJldCA9IF9yZWdtYXBfdXBkYXRlX2JpdHMobWFwLCByZWcsIG1hc2ssIHZhbCwgTlVMTCk7CiAKIAltYXAtPmFzeW5jID0gZmFsc2U7CiAKQEAgLTIxNzMsMzUgKzIzOTcsMjEgQEAKICAqIGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkuICBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIGFwcGx5CiAgKiBjb3JyZWN0aW9ucyB0byBiZSBhcHBsaWVkIHRvIHRoZSBkZXZpY2UgZGVmYXVsdHMgb24gc3RhcnR1cCwgc3VjaAogICogYXMgdGhlIHVwZGF0ZXMgc29tZSB2ZW5kb3JzIHByb3ZpZGUgdG8gdW5kb2N1bWVudGVkIHJlZ2lzdGVycy4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkCisgKiBjb25jdXJyZW50bHkgd2l0aCBlaXRoZXIgaXRzZWxmIG9yIHJlZ2NhY2hlX3N5bmMoKS4KICAqLwogaW50IHJlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKIAkJCSAgaW50IG51bV9yZWdzKQogewogCXN0cnVjdCByZWdfZGVmYXVsdCAqcDsKLQlpbnQgaSwgcmV0OworCWludCByZXQ7CiAJYm9vbCBieXBhc3M7CiAKIAlpZiAoV0FSTl9PTkNFKG51bV9yZWdzIDw9IDAsICJpbnZhbGlkIHJlZ2lzdGVycyBudW1iZXIgKCVkKVxuIiwKIAkgICAgbnVtX3JlZ3MpKQogCQlyZXR1cm4gMDsKIAotCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKLQotCWJ5cGFzcyA9IG1hcC0+Y2FjaGVfYnlwYXNzOwotCi0JbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOwotCW1hcC0+YXN5bmMgPSB0cnVlOwotCi0JLyogV3JpdGUgb3V0IGZpcnN0OyBpdCdzIHVzZWZ1bCB0byBhcHBseSBldmVuIGlmIHdlIGZhaWwgbGF0ZXIuICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKLQkJcmV0ID0gX3JlZ21hcF93cml0ZShtYXAsIHJlZ3NbaV0ucmVnLCByZWdzW2ldLmRlZik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2VycihtYXAtPmRldiwgIkZhaWxlZCB0byB3cml0ZSAleCA9ICV4OiAlZFxuIiwKLQkJCQlyZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYsIHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCXAgPSBrcmVhbGxvYyhtYXAtPnBhdGNoLAogCQkgICAgIHNpemVvZihzdHJ1Y3QgcmVnX2RlZmF1bHQpICogKG1hcC0+cGF0Y2hfcmVncyArIG51bV9yZWdzKSwKIAkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTIyMTAsOSArMjQyMCwyMCBAQAogCQltYXAtPnBhdGNoID0gcDsKIAkJbWFwLT5wYXRjaF9yZWdzICs9IG51bV9yZWdzOwogCX0gZWxzZSB7Ci0JCXJldCA9IC1FTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKKworCWJ5cGFzcyA9IG1hcC0+Y2FjaGVfYnlwYXNzOworCisJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOworCW1hcC0+YXN5bmMgPSB0cnVlOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dDsKKwogb3V0OgogCW1hcC0+YXN5bmMgPSBmYWxzZTsKIAltYXAtPmNhY2hlX2J5cGFzcyA9IGJ5cGFzczsKQEAgLTIyNDAsNiArMjQ2MSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2dldF92YWxfYnl0ZXMpOwogCitpbnQgcmVnbWFwX3BhcnNlX3ZhbChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCAqdmFsKQoreworCWlmICghbWFwLT5mb3JtYXQucGFyc2VfdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBtYXAtPmZvcm1hdC5wYXJzZV92YWwoYnVmKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX3BhcnNlX3ZhbCk7CisKIHN0YXRpYyBpbnQgX19pbml0IHJlZ21hcF9pbml0Y2FsbCh2b2lkKQogewogCXJlZ21hcF9kZWJ1Z2ZzX2luaXRjYWxsKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCmluZGV4IDk0ZmZlZTMuLmFkOWQxNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCkBAIC0yMyw3ICsyMyw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMgYi9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCmluZGV4IGViMzk1MDEuLjEyNWQ4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKKysrIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuYwpAQCAtNjQxMSwxMiArNjQxMSwxMiBAQAogCQkJCQkuU2NhdHRlckdhdGhlclNlZ21lbnRzWzBdCiAJCQkJCS5TZWdtZW50Qnl0ZUNvdW50ID0KIAkgICAgQ29tbWFuZE1haWxib3gtPkNvbnRyb2xsZXJJbmZvLkRhdGFUcmFuc2ZlclNpemU7Ci0JICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7Ci0JICB3aGlsZSAoQ29udHJvbGxlci0+VjIuTmV3Q29udHJvbGxlckluZm9ybWF0aW9uLT5QaHlzaWNhbFNjYW5BY3RpdmUpCi0JICAgIHsKLQkgICAgICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7Ci0JICAgICAgc2xlZXBfb25fdGltZW91dCgmQ29udHJvbGxlci0+Q29tbWFuZFdhaXRRdWV1ZSwgSFopOwotCSAgICB9CisJICB3aGlsZSAoMSkgeworCSAgICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7CisJICAgIGlmICghQ29udHJvbGxlci0+VjIuTmV3Q29udHJvbGxlckluZm9ybWF0aW9uLT5QaHlzaWNhbFNjYW5BY3RpdmUpCisJCWJyZWFrOworCSAgICBtc2xlZXAoMTAwMCk7CisJICB9CiAJICBEQUM5NjBfVXNlckNyaXRpY2FsKCJEaXNjb3ZlcnkgQ29tcGxldGVkXG4iLCBDb250cm9sbGVyKTsKICAJfQogICAgIH0KQEAgLTcwMzUsMTggKzcwMzUsMTYgQEAKIAkJRXJyb3JDb2RlID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQotCXdoaWxlIChDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPlN0YXR1c0NoYW5nZUNvdW50ZXIKLQkgICAgICAgPT0gSGVhbHRoU3RhdHVzQnVmZmVyLlN0YXR1c0NoYW5nZUNvdW50ZXIgJiYKLQkgICAgICAgQ29udHJvbGxlci0+VjIuSGVhbHRoU3RhdHVzQnVmZmVyLT5OZXh0RXZlbnRTZXF1ZW5jZU51bWJlcgotCSAgICAgICA9PSBIZWFsdGhTdGF0dXNCdWZmZXIuTmV4dEV2ZW50U2VxdWVuY2VOdW1iZXIpCi0JICB7Ci0JICAgIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmQ29udHJvbGxlci0+SGVhbHRoU3RhdHVzV2FpdFF1ZXVlLAotCQkJCQkgICBEQUM5NjBfTW9uaXRvcmluZ1RpbWVySW50ZXJ2YWwpOwotCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkgICAgCUVycm9yQ29kZSA9IC1FSU5UUjsKLQkgICAgCWJyZWFrOwotCSAgICB9Ci0JICB9CisJRXJyb3JDb2RlID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQ29udHJvbGxlci0+SGVhbHRoU3RhdHVzV2FpdFF1ZXVlLAorCQkJIShDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPlN0YXR1c0NoYW5nZUNvdW50ZXIKKwkJCSAgICA9PSBIZWFsdGhTdGF0dXNCdWZmZXIuU3RhdHVzQ2hhbmdlQ291bnRlciAmJgorCQkJICBDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPk5leHRFdmVudFNlcXVlbmNlTnVtYmVyCisJCQkgICAgPT0gSGVhbHRoU3RhdHVzQnVmZmVyLk5leHRFdmVudFNlcXVlbmNlTnVtYmVyKSwKKwkJCURBQzk2MF9Nb25pdG9yaW5nVGltZXJJbnRlcnZhbCk7CisJaWYgKEVycm9yQ29kZSA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJRXJyb3JDb2RlID0gLUVJTlRSOworCQlicmVhazsKKwl9CiAJaWYgKGNvcHlfdG9fdXNlcihHZXRIZWFsdGhTdGF0dXMuSGVhbHRoU3RhdHVzQnVmZmVyLAogCQkJIENvbnRyb2xsZXItPlYyLkhlYWx0aFN0YXR1c0J1ZmZlciwKIAkJCSBzaXplb2YoREFDOTYwX1YyX0hlYWx0aFN0YXR1c0J1ZmZlcl9UKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCmluZGV4IDBlMzBjNmUuLjk2YjYyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCkBAIC02OCw2ICs2OCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9hdGFmZC5oPgogI2luY2x1ZGUgPGFzbS9hdGFmZHJlZy5oPgpAQCAtMzAxLDcgKzMwMyw3IEBACiAvKiBTeW5jaHJvbml6YXRpb24gb2YgRkRDIGFjY2Vzcy4gKi8KIHN0YXRpYyB2b2xhdGlsZSBpbnQgZmRjX2J1c3kgPSAwOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGZkY193YWl0KTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmb3JtYXRfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGZvcm1hdF93YWl0KTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlZF9mbG9wcGllcyA9IDB4ZmYsIGZha2VfY2hhbmdlID0gMDsKICNkZWZpbmUJQ0hFQ0tfQ0hBTkdFX0RFTEFZCUhaLzIKQEAgLTYwOCw3ICs2MTAsNyBAQAogCWlmIChJc0Zvcm1hdHRpbmcpIHsKIAkJSXNGb3JtYXR0aW5nID0gMDsKIAkJRm9ybWF0RXJyb3IgPSAxOwotCQl3YWtlX3VwKCAmZm9ybWF0X3dhaXQgKTsKKwkJY29tcGxldGUoJmZvcm1hdF93YWl0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjUwLDkgKzY1Miw4IEBACiAJRFBSSU5UKCgiZG9fZm9ybWF0KCBkcj0lZCB0cj0lZCBoZT0lZCBvZmZzPSVkIClcbiIsCiAJCWRyaXZlLCBkZXNjLT50cmFjaywgZGVzYy0+aGVhZCwgZGVzYy0+c2VjdF9vZmZzZXQgKSk7CiAKKwl3YWl0X2V2ZW50KGZkY193YWl0LCBjbXB4Y2hnKCZmZGNfYnVzeSwgMCwgMSkgPT0gMCk7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXdoaWxlKCBmZGNfYnVzeSApIHNsZWVwX29uKCAmZmRjX3dhaXQgKTsKLQlmZGNfYnVzeSA9IDE7CiAJc3RkbWFfbG9jayhmbG9wcHlfaXJxLCBOVUxMKTsKIAlhdGFyaV90dXJub25faXJxKCBJUlFfTUZQX0ZEQyApOyAvKiBzaG91bGQgYmUgYWxyZWFkeSwganVzdCB0byBiZSBzdXJlICovCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNzA2LDcgKzcwNyw3IEBACiAJUmVxU2lkZSAgPSBkZXNjLT5oZWFkOwogCWRvX2ZkX2FjdGlvbiggZHJpdmUgKTsKIAotCXNsZWVwX29uKCAmZm9ybWF0X3dhaXQgKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmb3JtYXRfd2FpdCk7CiAKIAlyZWRvX2ZkX3JlcXVlc3QoKTsKIAlyZXR1cm4oIEZvcm1hdEVycm9yID8gLUVJTyA6IDAgKTsJCkBAIC0xMjI5LDcgKzEyMzAsNyBAQAogCQlnb3RvIGVycl9lbmQ7CiAJfQogCi0Jd2FrZV91cCggJmZvcm1hdF93YWl0ICk7CisJY29tcGxldGUoJmZvcm1hdF93YWl0KTsKIAlyZXR1cm47CiAKICAgZXJyX2VuZDoKQEAgLTE0OTcsOCArMTQ5OCw3IEBACiB2b2lkIGRvX2ZkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCURQUklOVCgoImRvX2ZkX3JlcXVlc3QgZm9yIHBpZCAlZFxuIixjdXJyZW50LT5waWQpKTsKLQl3aGlsZSggZmRjX2J1c3kgKSBzbGVlcF9vbiggJmZkY193YWl0ICk7Ci0JZmRjX2J1c3kgPSAxOworCXdhaXRfZXZlbnQoZmRjX3dhaXQsIGNtcHhjaGcoJmZkY19idXN5LCAwLCAxKSA9PSAwKTsKIAlzdGRtYV9sb2NrKGZsb3BweV9pcnEsIE5VTEwpOwogCiAJYXRhcmlfZGlzYWJsZV9pcnEoIElSUV9NRlBfRkRDICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMDM2ZThhYi4uNzM4OTRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtNDA5MiwxMSArNDA5Miw5IEBACiAJCWlmIChlcnIgPiAwKSB7CiAJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAogCQkJCSJvbmx5ICVkIE1TSS1YIHZlY3RvcnMgYXZhaWxhYmxlXG4iLCBlcnIpOwotCQkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKIAkJCQkiTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCQlnb3RvIGRlZmF1bHRfaW50X21vZGU7CiAJCX0KIAl9CiAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaC0+cGRldiwgUENJX0NBUF9JRF9NU0kpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9hY3Rsb2cuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCmluZGV4IGE5YjEzZjIuLjkwYWU0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCkBAIC05NSwzNCArOTUsMzYgQEAKIAogc3RydWN0IHVwZGF0ZV9vZGJtX3dvcmsgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAl1bnNpZ25lZCBpbnQgZW5yOwogfTsKIAogc3RydWN0IHVwZGF0ZV9hbF93b3JrIHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CiAJaW50IGVycjsKIH07CiAKIAotdm9pZCAqZHJiZF9tZF9nZXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkICpkcmJkX21kX2dldF9idWZmZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHI7CiAKLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwKLQkJICAgKHIgPSBhdG9taWNfY21weGNoZygmbWRldi0+bWRfaW9faW5fdXNlLCAwLCAxKSkgPT0gMCB8fAotCQkgICBtZGV2LT5zdGF0ZS5kaXNrIDw9IERfRkFJTEVEKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LAorCQkgICAociA9IGF0b21pY19jbXB4Y2hnKCZkZXZpY2UtPm1kX2lvX2luX3VzZSwgMCwgMSkpID09IDAgfHwKKwkJICAgZGV2aWNlLT5zdGF0ZS5kaXNrIDw9IERfRkFJTEVEKTsKIAotCXJldHVybiByID8gTlVMTCA6IHBhZ2VfYWRkcmVzcyhtZGV2LT5tZF9pb19wYWdlKTsKKwlyZXR1cm4gciA/IE5VTEwgOiBwYWdlX2FkZHJlc3MoZGV2aWNlLT5tZF9pb19wYWdlKTsKIH0KIAotdm9pZCBkcmJkX21kX3B1dF9idWZmZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9tZF9wdXRfYnVmZmVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZGV2LT5tZF9pb19pbl91c2UpKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZpY2UtPm1kX2lvX2luX3VzZSkpCisJCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAotdm9pZCB3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCit2b2lkIHdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRvbmUpCiB7CiAJbG9uZyBkdDsKQEAgLTEzNCwxNSArMTM2LDE1IEBACiAJaWYgKGR0ID09IDApCiAJCWR0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKLQlkdCA9IHdhaXRfZXZlbnRfdGltZW91dChtZGV2LT5taXNjX3dhaXQsCi0JCQkqZG9uZSB8fCB0ZXN0X2JpdChGT1JDRV9ERVRBQ0gsICZtZGV2LT5mbGFncyksIGR0KTsKKwlkdCA9IHdhaXRfZXZlbnRfdGltZW91dChkZXZpY2UtPm1pc2Nfd2FpdCwKKwkJCSpkb25lIHx8IHRlc3RfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpLCBkdCk7CiAJaWYgKGR0ID09IDApIHsKLQkJZGV2X2VycihERVYsICJtZXRhLWRhdGEgSU8gb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7Ci0JCWRyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIDEsIERSQkRfRk9SQ0VfREVUQUNIKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YS1kYXRhIElPIG9wZXJhdGlvbiB0aW1lZCBvdXRcbiIpOworCQlkcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIDEsIERSQkRfRk9SQ0VfREVUQUNIKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfbWRfc3luY19wYWdlX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkJIHN0cnVjdCBwYWdlICpwYWdlLCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkJIGludCBydywgaW50IHNpemUpCkBAIC0xNTAsMTAgKzE1MiwxMCBAQAogCXN0cnVjdCBiaW8gKmJpbzsKIAlpbnQgZXJyOwogCi0JbWRldi0+bWRfaW8uZG9uZSA9IDA7Ci0JbWRldi0+bWRfaW8uZXJyb3IgPSAtRU5PREVWOworCWRldmljZS0+bWRfaW8uZG9uZSA9IDA7CisJZGV2aWNlLT5tZF9pby5lcnJvciA9IC1FTk9ERVY7CiAKLQlpZiAoKHJ3ICYgV1JJVEUpICYmICF0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCisJaWYgKChydyAmIFdSSVRFKSAmJiAhdGVzdF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncykpCiAJCXJ3IHw9IFJFUV9GVUEgfCBSRVFfRkxVU0g7CiAJcncgfD0gUkVRX1NZTkM7CiAKQEAgLTE2Myw2OSArMTY1LDY5IEBACiAJZXJyID0gLUVJTzsKIAlpZiAoYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgc2l6ZSwgMCkgIT0gc2l6ZSkKIAkJZ290byBvdXQ7Ci0JYmlvLT5iaV9wcml2YXRlID0gJm1kZXYtPm1kX2lvOworCWJpby0+YmlfcHJpdmF0ZSA9ICZkZXZpY2UtPm1kX2lvOwogCWJpby0+YmlfZW5kX2lvID0gZHJiZF9tZF9pb19jb21wbGV0ZTsKIAliaW8tPmJpX3J3ID0gcnc7CiAKLQlpZiAoIShydyAmIFdSSVRFKSAmJiBtZGV2LT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYgbWRldi0+bGRldiA9PSBOVUxMKQorCWlmICghKHJ3ICYgV1JJVEUpICYmIGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmIGRldmljZS0+bGRldiA9PSBOVUxMKQogCQkvKiBzcGVjaWFsIGNhc2UsIGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKTogbm8gZ2V0X2xkZXYgKi8KIAkJOwotCWVsc2UgaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKKwllbHNlIGlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKIAkJLyogQ29ycmVzcG9uZGluZyBwdXRfbGRldiBpbiBkcmJkX21kX2lvX2NvbXBsZXRlKCkgKi8KLQkJZGV2X2VycihERVYsICJBU1NFUlQgRkFJTEVEOiBnZXRfbGRldl9pZl9zdGF0ZSgpID09IDEgaW4gX2RyYmRfbWRfc3luY19wYWdlX2lvKClcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJBU1NFUlQgRkFJTEVEOiBnZXRfbGRldl9pZl9zdGF0ZSgpID09IDEgaW4gX2RyYmRfbWRfc3luY19wYWdlX2lvKClcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CiAKIAliaW9fZ2V0KGJpbyk7IC8qIG9uZSBiaW9fcHV0KCkgaXMgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLwotCWF0b21pY19pbmMoJm1kZXYtPm1kX2lvX2luX3VzZSk7IC8qIGRyYmRfbWRfcHV0X2J1ZmZlcigpIGlzIGluIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIgKi8KLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKQorCWF0b21pY19pbmMoJmRldmljZS0+bWRfaW9faW5fdXNlKTsgLyogZHJiZF9tZF9wdXRfYnVmZmVyKCkgaXMgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLworCWlmIChkcmJkX2luc2VydF9mYXVsdChkZXZpY2UsIChydyAmIFdSSVRFKSA/IERSQkRfRkFVTFRfTURfV1IgOiBEUkJEX0ZBVUxUX01EX1JEKSkKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJZWxzZQogCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOwotCXdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChtZGV2LCBiZGV2LCAmbWRldi0+bWRfaW8uZG9uZSk7CisJd2FpdF91bnRpbF9kb25lX29yX2ZvcmNlX2RldGFjaGVkKGRldmljZSwgYmRldiwgJmRldmljZS0+bWRfaW8uZG9uZSk7CiAJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX1VQVE9EQVRFKSkKLQkJZXJyID0gbWRldi0+bWRfaW8uZXJyb3I7CisJCWVyciA9IGRldmljZS0+bWRfaW8uZXJyb3I7CiAKICBvdXQ6CiAJYmlvX3B1dChiaW8pOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldiwKK2ludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcncpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgcGFnZSAqaW9wID0gbWRldi0+bWRfaW9fcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqaW9wID0gZGV2aWNlLT5tZF9pb19wYWdlOwogCi0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPm1kX2lvX2luX3VzZSkgPT0gMSk7CisJRF9BU1NFUlQoZGV2aWNlLCBhdG9taWNfcmVhZCgmZGV2aWNlLT5tZF9pb19pbl91c2UpID09IDEpOwogCiAJQlVHX09OKCFiZGV2LT5tZF9iZGV2KTsKIAotCWRldl9kYmcoREVWLCAibWV0YV9kYXRhIGlvOiAlcyBbJWRdOiVzKCwlbGx1cywlcykgJXBTXG4iLAorCWRyYmRfZGJnKGRldmljZSwgIm1ldGFfZGF0YSBpbzogJXMgWyVkXTolcygsJWxsdXMsJXMpICVwU1xuIiwKIAkgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgX19mdW5jX18sCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHJ3ICYgV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwKIAkgICAgICh2b2lkKilfUkVUX0lQXyApOwogCiAJaWYgKHNlY3RvciA8IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGJkZXYpIHx8CiAJICAgIHNlY3RvciArIDcgPiBkcmJkX21kX2xhc3Rfc2VjdG9yKGJkZXYpKQotCQlkZXZfYWxlcnQoREVWLCAiJXMgWyVkXTolcygsJWxsdXMsJXMpIG91dCBvZiByYW5nZSBtZCBhY2Nlc3MhXG4iLAorCQlkcmJkX2FsZXJ0KGRldmljZSwgIiVzIFslZF06JXMoLCVsbHVzLCVzKSBvdXQgb2YgcmFuZ2UgbWQgYWNjZXNzIVxuIiwKIAkJICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIF9fZnVuY19fLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCAocncgJiBXUklURSkgPyAiV1JJVEUiIDogIlJFQUQiKTsKIAogCS8qIHdlIGRvIGFsbCBvdXIgbWV0YSBkYXRhIElPIGluIGFsaWduZWQgNGsgYmxvY2tzLiAqLwotCWVyciA9IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhtZGV2LCBiZGV2LCBpb3AsIHNlY3RvciwgcncsIDQwOTYpOworCWVyciA9IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhkZXZpY2UsIGJkZXYsIGlvcCwgc2VjdG9yLCBydywgNDA5Nik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKERFViwgImRyYmRfbWRfc3luY19wYWdlX2lvKCwlbGx1cywlcykgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfbWRfc3luY19wYWdlX2lvKCwlbGx1cywlcykgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHJ3ICYgV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwgZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBibV9leHRlbnQgKmZpbmRfYWN0aXZlX3Jlc3luY19leHRlbnQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IGVucikKK3N0YXRpYyBzdHJ1Y3QgYm1fZXh0ZW50ICpmaW5kX2FjdGl2ZV9yZXN5bmNfZXh0ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yKQogewogCXN0cnVjdCBsY19lbGVtZW50ICp0bXA7Ci0JdG1wID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIGVuci9BTF9FWFRfUEVSX0JNX1NFQ1QpOworCXRtcCA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVuci9BTF9FWFRfUEVSX0JNX1NFQ1QpOwogCWlmICh1bmxpa2VseSh0bXAgIT0gTlVMTCkpIHsKIAkJc3RydWN0IGJtX2V4dGVudCAgKmJtX2V4dCA9IGxjX2VudHJ5KHRtcCwgc3RydWN0IGJtX2V4dGVudCwgbGNlKTsKIAkJaWYgKHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSkKQEAgLTIzNCw0NyArMjM2LDQ4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGNfZWxlbWVudCAqX2FsX2dldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgZW5yLCBib29sIG5vbmJsb2NrKQorc3RhdGljIHN0cnVjdCBsY19lbGVtZW50ICpfYWxfZ2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yLCBib29sIG5vbmJsb2NrKQogewogCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCWludCB3YWtlOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JYm1fZXh0ID0gZmluZF9hY3RpdmVfcmVzeW5jX2V4dGVudChtZGV2LCBlbnIpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJYm1fZXh0ID0gZmluZF9hY3RpdmVfcmVzeW5jX2V4dGVudChkZXZpY2UsIGVucik7CiAJaWYgKGJtX2V4dCkgewogCQl3YWtlID0gIXRlc3RfYW5kX3NldF9iaXQoQk1FX1BSSU9SSVRZLCAmYm1fZXh0LT5mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJaWYgKHdha2UpCi0JCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZiAobm9uYmxvY2spCi0JCWFsX2V4dCA9IGxjX3RyeV9nZXQobWRldi0+YWN0X2xvZywgZW5yKTsKKwkJYWxfZXh0ID0gbGNfdHJ5X2dldChkZXZpY2UtPmFjdF9sb2csIGVucik7CiAJZWxzZQotCQlhbF9leHQgPSBsY19nZXQobWRldi0+YWN0X2xvZywgZW5yKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQlhbF9leHQgPSBsY19nZXQoZGV2aWNlLT5hY3RfbG9nLCBlbnIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlyZXR1cm4gYWxfZXh0OwogfQogCi1ib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCitib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKQogewogCS8qIGZvciBiaW9zIGNyb3NzaW5nIGFjdGl2aXR5IGxvZyBleHRlbnQgYm91bmRhcmllcywKIAkgKiB3ZSBtYXkgbmVlZCB0byBhY3RpdmF0ZSB0d28gZXh0ZW50cyBpbiBvbmUgZ28gKi8KIAl1bnNpZ25lZCBmaXJzdCA9IGktPnNlY3RvciA+PiAoQUxfRVhURU5UX1NISUZULTkpOwogCXVuc2lnbmVkIGxhc3QgPSBpLT5zaXplID09IDAgPyBmaXJzdCA6IChpLT5zZWN0b3IgKyAoaS0+c2l6ZSA+PiA5KSAtIDEpID4+IChBTF9FWFRFTlRfU0hJRlQtOSk7CiAKLQlEX0FTU0VSVCgodW5zaWduZWQpKGxhc3QgLSBmaXJzdCkgPD0gMSk7Ci0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPmxvY2FsX2NudCkgPiAwKTsKKwlEX0FTU0VSVChkZXZpY2UsICh1bnNpZ25lZCkobGFzdCAtIGZpcnN0KSA8PSAxKTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCkgPiAwKTsKIAogCS8qIEZJWE1FIGZpZ3VyZSBvdXQgYSBmYXN0IHBhdGggZm9yIGJpb3MgY3Jvc3NpbmcgQUwgZXh0ZW50IGJvdW5kYXJpZXMgKi8KIAlpZiAoZmlyc3QgIT0gbGFzdCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIF9hbF9nZXQobWRldiwgZmlyc3QsIHRydWUpOworCXJldHVybiBfYWxfZ2V0KGRldmljZSwgZmlyc3QsIHRydWUpOwogfQogCi1ib29sIGRyYmRfYWxfYmVnaW5faW9fcHJlcGFyZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK3N0YXRpYworYm9vbCBkcmJkX2FsX2JlZ2luX2lvX3ByZXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKQogewogCS8qIGZvciBiaW9zIGNyb3NzaW5nIGFjdGl2aXR5IGxvZyBleHRlbnQgYm91bmRhcmllcywKIAkgKiB3ZSBtYXkgbmVlZCB0byBhY3RpdmF0ZSB0d28gZXh0ZW50cyBpbiBvbmUgZ28gKi8KQEAgLTI4MywyMCArMjg2LDIwIEBACiAJdW5zaWduZWQgZW5yOwogCWJvb2wgbmVlZF90cmFuc2FjdGlvbiA9IGZhbHNlOwogCi0JRF9BU1NFUlQoZmlyc3QgPD0gbGFzdCk7Ci0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPmxvY2FsX2NudCkgPiAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGZpcnN0IDw9IGxhc3QpOworCURfQVNTRVJUKGRldmljZSwgYXRvbWljX3JlYWQoJmRldmljZS0+bG9jYWxfY250KSA+IDApOwogCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7Ci0JCXdhaXRfZXZlbnQobWRldi0+YWxfd2FpdCwKLQkJCQkoYWxfZXh0ID0gX2FsX2dldChtZGV2LCBlbnIsIGZhbHNlKSkgIT0gTlVMTCk7CisJCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LAorCQkJCShhbF9leHQgPSBfYWxfZ2V0KGRldmljZSwgZW5yLCBmYWxzZSkpICE9IE5VTEwpOwogCQlpZiAoYWxfZXh0LT5sY19udW1iZXIgIT0gZW5yKQogCQkJbmVlZF90cmFuc2FjdGlvbiA9IHRydWU7CiAJfQogCXJldHVybiBuZWVkX3RyYW5zYWN0aW9uOwogfQogCi1zdGF0aWMgaW50IGFsX3dyaXRlX3RyYW5zYWN0aW9uKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGJvb2wgZGVsZWdhdGUpOworc3RhdGljIGludCBhbF93cml0ZV90cmFuc2FjdGlvbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSk7CiAKIC8qIFdoZW4gY2FsbGVkIHRocm91Z2ggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSwgd2UgbXVzdCBkZWxlZ2F0ZQogICogYWN0aXZpdHkgbG9nIEkvTyB0byB0aGUgd29ya2VyIHRocmVhZDogYSBmdXJ0aGVyIHJlcXVlc3QKQEAgLTMxMCw1OCArMzEzLDU4IEBACiAvKgogICogQGRlbGVnYXRlOiAgIGRlbGVnYXRlIGFjdGl2aXR5IGxvZyBJL08gdG8gdGhlIHdvcmtlciB0aHJlYWQKICAqLwotdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBib29sIGRlbGVnYXRlKQordm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSkKIHsKIAlib29sIGxvY2tlZCA9IGZhbHNlOwogCi0JQlVHX09OKGRlbGVnYXRlICYmIGN1cnJlbnQgPT0gbWRldi0+dGNvbm4tPndvcmtlci50YXNrKTsKKwlCVUdfT04oZGVsZWdhdGUgJiYgY3VycmVudCA9PSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53b3JrZXIudGFzayk7CiAKIAkvKiBTZXJpYWxpemUgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLgogCSAqIFRoaXMgdXNlcyB0ZXN0X2FuZF9zZXRfYml0LCBtZW1vcnkgYmFycmllciBpcyBpbXBsaWNpdC4KIAkgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsCi0JCQltZGV2LT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMgPT0gMCB8fAotCQkJKGxvY2tlZCA9IGxjX3RyeV9sb2NrX2Zvcl90cmFuc2FjdGlvbihtZGV2LT5hY3RfbG9nKSkpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LAorCQkJZGV2aWNlLT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMgPT0gMCB8fAorCQkJKGxvY2tlZCA9IGxjX3RyeV9sb2NrX2Zvcl90cmFuc2FjdGlvbihkZXZpY2UtPmFjdF9sb2cpKSk7CiAKIAlpZiAobG9ja2VkKSB7CiAJCS8qIERvdWJsZSBjaGVjazogaXQgbWF5IGhhdmUgYmVlbiBjb21taXR0ZWQgYnkgc29tZW9uZSBlbHNlLAogCQkgKiB3aGlsZSB3ZSBoYXZlIGJlZW4gd2FpdGluZyBmb3IgdGhlIGxvY2suICovCi0JCWlmIChtZGV2LT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMpIHsKKwkJaWYgKGRldmljZS0+YWN0X2xvZy0+cGVuZGluZ19jaGFuZ2VzKSB7CiAJCQlib29sIHdyaXRlX2FsX3VwZGF0ZXM7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+YWxfdXBkYXRlczsKKwkJCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJCWlmICh3cml0ZV9hbF91cGRhdGVzKQotCQkJCWFsX3dyaXRlX3RyYW5zYWN0aW9uKG1kZXYsIGRlbGVnYXRlKTsKLQkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJCWFsX3dyaXRlX3RyYW5zYWN0aW9uKGRldmljZSwgZGVsZWdhdGUpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJCS8qIEZJWE1FCiAJCQlpZiAoZXJyKQogCQkJCXdlIG5lZWQgYW4gImxjX2NhbmNlbCIgaGVyZTsKIAkJCSovCi0JCQlsY19jb21taXR0ZWQobWRldi0+YWN0X2xvZyk7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJbGNfY29tbWl0dGVkKGRldmljZS0+YWN0X2xvZyk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJCX0KLQkJbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOwotCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJbGNfdW5sb2NrKGRldmljZS0+YWN0X2xvZyk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJfQogfQogCiAvKgogICogQGRlbGVnYXRlOiAgIGRlbGVnYXRlIGFjdGl2aXR5IGxvZyBJL08gdG8gdGhlIHdvcmtlciB0aHJlYWQKICAqLwotdm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX2ludGVydmFsICppLCBib29sIGRlbGVnYXRlKQordm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSkKIHsKLQlCVUdfT04oZGVsZWdhdGUgJiYgY3VycmVudCA9PSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCUJVR19PTihkZWxlZ2F0ZSAmJiBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCWlmIChkcmJkX2FsX2JlZ2luX2lvX3ByZXBhcmUobWRldiwgaSkpCi0JCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KG1kZXYsIGRlbGVnYXRlKTsKKwlpZiAoZHJiZF9hbF9iZWdpbl9pb19wcmVwYXJlKGRldmljZSwgaSkpCisJCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KGRldmljZSwgZGVsZWdhdGUpOwogfQogCi1pbnQgZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK2ludCBkcmJkX2FsX2JlZ2luX2lvX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKIHsKLQlzdHJ1Y3QgbHJ1X2NhY2hlICphbCA9IG1kZXYtPmFjdF9sb2c7CisJc3RydWN0IGxydV9jYWNoZSAqYWwgPSBkZXZpY2UtPmFjdF9sb2c7CiAJLyogZm9yIGJpb3MgY3Jvc3NpbmcgYWN0aXZpdHkgbG9nIGV4dGVudCBib3VuZGFyaWVzLAogCSAqIHdlIG1heSBuZWVkIHRvIGFjdGl2YXRlIHR3byBleHRlbnRzIGluIG9uZSBnbyAqLwogCXVuc2lnbmVkIGZpcnN0ID0gaS0+c2VjdG9yID4+IChBTF9FWFRFTlRfU0hJRlQtOSk7CkBAIC0zNzAsNyArMzczLDcgQEAKIAl1bnNpZ25lZCBhdmFpbGFibGVfdXBkYXRlX3Nsb3RzOwogCXVuc2lnbmVkIGVucjsKIAotCURfQVNTRVJUKGZpcnN0IDw9IGxhc3QpOworCURfQVNTRVJUKGRldmljZSwgZmlyc3QgPD0gbGFzdCk7CiAKIAlucl9hbF9leHRlbnRzID0gMSArIGxhc3QgLSBmaXJzdDsgLyogd29yc3QgY2FzZTogYWxsIHRvdWNoZWQgZXh0ZW5kcyBhcmUgY29sZC4gKi8KIAlhdmFpbGFibGVfdXBkYXRlX3Nsb3RzID0gbWluKGFsLT5ucl9lbGVtZW50cyAtIGFsLT51c2VkLApAQCAtMzg1LDcgKzM4OCw3IEBACiAJLyogSXMgcmVzeW5jIGFjdGl2ZSBpbiB0aGlzIGFyZWE/ICovCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICp0bXA7Ci0JCXRtcCA9IGxjX2ZpbmQobWRldi0+cmVzeW5jLCBlbnIvQUxfRVhUX1BFUl9CTV9TRUNUKTsKKwkJdG1wID0gbGNfZmluZChkZXZpY2UtPnJlc3luYywgZW5yL0FMX0VYVF9QRVJfQk1fU0VDVCk7CiAJCWlmICh1bmxpa2VseSh0bXAgIT0gTlVMTCkpIHsKIAkJCXN0cnVjdCBibV9leHRlbnQgICpibV9leHQgPSBsY19lbnRyeSh0bXAsIHN0cnVjdCBibV9leHRlbnQsIGxjZSk7CiAJCQlpZiAodGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKSB7CkBAIC00MDEsMTQgKzQwNCwxNCBAQAogCSAqIHRoaXMgaGFzIHRvIGJlIHN1Y2Nlc3NmdWwuICovCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7Ci0JCWFsX2V4dCA9IGxjX2dldF9jdW11bGF0aXZlKG1kZXYtPmFjdF9sb2csIGVucik7CisJCWFsX2V4dCA9IGxjX2dldF9jdW11bGF0aXZlKGRldmljZS0+YWN0X2xvZywgZW5yKTsKIAkJaWYgKCFhbF9leHQpCi0JCQlkZXZfaW5mbyhERVYsICJMT0dJQyBCVUcgZm9yIGVucj0ldVxuIiwgZW5yKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJMT0dJQyBCVUcgZm9yIGVucj0ldVxuIiwgZW5yKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZHJiZF9hbF9jb21wbGV0ZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK3ZvaWQgZHJiZF9hbF9jb21wbGV0ZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCiB7CiAJLyogZm9yIGJpb3MgY3Jvc3NpbmcgYWN0aXZpdHkgbG9nIGV4dGVudCBib3VuZGFyaWVzLAogCSAqIHdlIG1heSBuZWVkIHRvIGFjdGl2YXRlIHR3byBleHRlbnRzIGluIG9uZSBnbyAqLwpAQCAtNDE4LDE5ICs0MjEsMTkgQEAKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqZXh0ZW50OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEX0FTU0VSVChmaXJzdCA8PSBsYXN0KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCURfQVNTRVJUKGRldmljZSwgZmlyc3QgPD0gbGFzdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7Ci0JCWV4dGVudCA9IGxjX2ZpbmQobWRldi0+YWN0X2xvZywgZW5yKTsKKwkJZXh0ZW50ID0gbGNfZmluZChkZXZpY2UtPmFjdF9sb2csIGVucik7CiAJCWlmICghZXh0ZW50KSB7Ci0JCQlkZXZfZXJyKERFViwgImFsX2NvbXBsZXRlX2lvKCkgY2FsbGVkIG9uIGluYWN0aXZlIGV4dGVudCAldVxuIiwgZW5yKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImFsX2NvbXBsZXRlX2lvKCkgY2FsbGVkIG9uIGluYWN0aXZlIGV4dGVudCAldVxuIiwgZW5yKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWxjX3B1dChtZGV2LT5hY3RfbG9nLCBleHRlbnQpOworCQlsY19wdXQoZGV2aWNlLT5hY3RfbG9nLCBleHRlbnQpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbF9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAogI2lmIChQQUdFX1NISUZUICsgMykgPCAoQUxfRVhURU5UX1NISUZUIC0gQk1fQkxPQ0tfU0hJRlQpCkBAIC00NjAsMTMgKzQ2MywxMyBAQAogCQkgKEJNX0VYVF9TSElGVCAtIEJNX0JMT0NLX1NISUZUKSk7CiB9CiAKLXN0YXRpYyBzZWN0b3JfdCBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3Ioc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBzZWN0b3JfdCBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IHN0cmlwZXMgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVzOwotCWNvbnN0IHVuc2lnbmVkIGludCBzdHJpcGVfc2l6ZV80a0IgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80azsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RyaXBlcyA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlczsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RyaXBlX3NpemVfNGtCID0gZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80azsKIAogCS8qIHRyYW5zYWN0aW9uIG51bWJlciwgbW9kdWxvIG9uLWRpc2sgcmluZyBidWZmZXIgd3JhcCBhcm91bmQgKi8KLQl1bnNpZ25lZCBpbnQgdCA9IG1kZXYtPmFsX3RyX251bWJlciAlIChtZGV2LT5sZGV2LT5tZC5hbF9zaXplXzRrKTsKKwl1bnNpZ25lZCBpbnQgdCA9IGRldmljZS0+YWxfdHJfbnVtYmVyICUgKGRldmljZS0+bGRldi0+bWQuYWxfc2l6ZV80ayk7CiAKIAkvKiAuLi4gdG8gYWxpZ25lZCA0ayBvbiBkaXNrIGJsb2NrICovCiAJdCA9ICgodCAlIHN0cmlwZXMpICogc3RyaXBlX3NpemVfNGtCKSArIHQvc3RyaXBlczsKQEAgLTQ3NSwxMSArNDc4LDExIEBACiAJdCAqPSA4OwogCiAJLyogLi4uIHBsdXMgb2Zmc2V0IHRvIHRoZSBvbiBkaXNrIHBvc2l0aW9uICovCi0JcmV0dXJuIG1kZXYtPmxkZXYtPm1kLm1kX29mZnNldCArIG1kZXYtPmxkZXYtPm1kLmFsX29mZnNldCArIHQ7CisJcmV0dXJuIGRldmljZS0+bGRldi0+bWQubWRfb2Zmc2V0ICsgZGV2aWNlLT5sZGV2LT5tZC5hbF9vZmZzZXQgKyB0OwogfQogCiBzdGF0aWMgaW50Ci1fYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK19hbF93cml0ZV90cmFuc2FjdGlvbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWxfdHJhbnNhY3Rpb25fb25fZGlzayAqYnVmZmVyOwogCXN0cnVjdCBsY19lbGVtZW50ICplOwpAQCAtNDg5LDMxICs0OTIsMzEgQEAKIAl1bnNpZ25lZCBjcmMgPSAwOwogCWludCBlcnIgPSAwOwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgewotCQlkZXZfZXJyKERFViwgImRpc2sgaXMgJXMsIGNhbm5vdCBzdGFydCBhbCB0cmFuc2FjdGlvblxuIiwKLQkJCWRyYmRfZGlza19zdHIobWRldi0+c3RhdGUuZGlzaykpOworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkcmJkX2VycihkZXZpY2UsICJkaXNrIGlzICVzLCBjYW5ub3Qgc3RhcnQgYWwgdHJhbnNhY3Rpb25cbiIsCisJCQlkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzaykpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBUaGUgYml0bWFwIHdyaXRlIG1heSBoYXZlIGZhaWxlZCwgY2F1c2luZyBhIHN0YXRlIGNoYW5nZS4gKi8KLQlpZiAobWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKSB7Ci0JCWRldl9lcnIoREVWLAorCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCkgeworCQlkcmJkX2VycihkZXZpY2UsCiAJCQkiZGlzayBpcyAlcywgY2Fubm90IHdyaXRlIGFsIHRyYW5zYWN0aW9uXG4iLAotCQkJZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQkJZHJiZF9kaXNrX3N0cihkZXZpY2UtPnN0YXRlLmRpc2spKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBwcm90ZWN0cyBtZF9pb19idWZmZXIsIGFsX3RyX2N5Y2xlLCAuLi4gKi8KKwlidWZmZXIgPSBkcmJkX21kX2dldF9idWZmZXIoZGV2aWNlKTsgLyogcHJvdGVjdHMgbWRfaW9fYnVmZmVyLCBhbF90cl9jeWNsZSwgLi4uICovCiAJaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycihERVYsICJkaXNrIGZhaWxlZCB3aGlsZSB3YWl0aW5nIGZvciBtZF9pbyBidWZmZXJcbiIpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZGlzayBmYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgbWRfaW8gYnVmZmVyXG4iKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKCpidWZmZXIpKTsKIAlidWZmZXItPm1hZ2ljID0gY3B1X3RvX2JlMzIoRFJCRF9BTF9NQUdJQyk7Ci0JYnVmZmVyLT50cl9udW1iZXIgPSBjcHVfdG9fYmUzMihtZGV2LT5hbF90cl9udW1iZXIpOworCWJ1ZmZlci0+dHJfbnVtYmVyID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5hbF90cl9udW1iZXIpOwogCiAJaSA9IDA7CiAKQEAgLTUyMSw4ICs1MjQsOCBAQAogCSAqIG9uY2Ugd2Ugc2V0IHRoZSBMQ19MT0NLRUQgLS0gZnJvbSBkcmJkX2FsX2JlZ2luX2lvKCksCiAJICogbGNfdHJ5X2xvY2tfZm9yX3RyYW5zYWN0aW9uKCkgLS0sIHNvbWVvbmUgbWF5IHN0aWxsCiAJICogYmUgaW4gdGhlIHByb2Nlc3Mgb2YgY2hhbmdpbmcgaXQuICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbWRldi0+YWN0X2xvZy0+dG9fYmVfY2hhbmdlZCwgbGlzdCkgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmZGV2aWNlLT5hY3RfbG9nLT50b19iZV9jaGFuZ2VkLCBsaXN0KSB7CiAJCWlmIChpID09IEFMX1VQREFURVNfUEVSX1RSQU5TQUNUSU9OKSB7CiAJCQlpKys7CiAJCQlicmVhazsKQEAgLTUzMCwxMSArNTMzLDExIEBACiAJCWJ1ZmZlci0+dXBkYXRlX3Nsb3RfbnJbaV0gPSBjcHVfdG9fYmUxNihlLT5sY19pbmRleCk7CiAJCWJ1ZmZlci0+dXBkYXRlX2V4dGVudF9ucltpXSA9IGNwdV90b19iZTMyKGUtPmxjX25ld19udW1iZXIpOwogCQlpZiAoZS0+bGNfbnVtYmVyICE9IExDX0ZSRUUpCi0JCQlkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KG1kZXYsCisJCQlkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KGRldmljZSwKIAkJCQkJYWxfZXh0ZW50X3RvX2JtX3BhZ2UoZS0+bGNfbnVtYmVyKSk7CiAJCWkrKzsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJQlVHX09OKGkgPiBBTF9VUERBVEVTX1BFUl9UUkFOU0FDVElPTik7CiAKIAlidWZmZXItPm5fdXBkYXRlcyA9IGNwdV90b19iZTE2KGkpOwpAQCAtNTQzLDQ4ICs1NDYsNDggQEAKIAkJYnVmZmVyLT51cGRhdGVfZXh0ZW50X25yW2ldID0gY3B1X3RvX2JlMzIoTENfRlJFRSk7CiAJfQogCi0JYnVmZmVyLT5jb250ZXh0X3NpemUgPSBjcHVfdG9fYmUxNihtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW50cyk7Ci0JYnVmZmVyLT5jb250ZXh0X3N0YXJ0X3Nsb3RfbnIgPSBjcHVfdG9fYmUxNihtZGV2LT5hbF90cl9jeWNsZSk7CisJYnVmZmVyLT5jb250ZXh0X3NpemUgPSBjcHVfdG9fYmUxNihkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKTsKKwlidWZmZXItPmNvbnRleHRfc3RhcnRfc2xvdF9uciA9IGNwdV90b19iZTE2KGRldmljZS0+YWxfdHJfY3ljbGUpOwogCiAJbXggPSBtaW5fdChpbnQsIEFMX0NPTlRFWFRfUEVSX1RSQU5TQUNUSU9OLAotCQkgICBtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW50cyAtIG1kZXYtPmFsX3RyX2N5Y2xlKTsKKwkJICAgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50cyAtIGRldmljZS0+YWxfdHJfY3ljbGUpOwogCWZvciAoaSA9IDA7IGkgPCBteDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGlkeCA9IG1kZXYtPmFsX3RyX2N5Y2xlICsgaTsKLQkJZXh0ZW50X25yID0gbGNfZWxlbWVudF9ieV9pbmRleChtZGV2LT5hY3RfbG9nLCBpZHgpLT5sY19udW1iZXI7CisJCXVuc2lnbmVkIGlkeCA9IGRldmljZS0+YWxfdHJfY3ljbGUgKyBpOworCQlleHRlbnRfbnIgPSBsY19lbGVtZW50X2J5X2luZGV4KGRldmljZS0+YWN0X2xvZywgaWR4KS0+bGNfbnVtYmVyOwogCQlidWZmZXItPmNvbnRleHRbaV0gPSBjcHVfdG9fYmUzMihleHRlbnRfbnIpOwogCX0KIAlmb3IgKDsgaSA8IEFMX0NPTlRFWFRfUEVSX1RSQU5TQUNUSU9OOyBpKyspCiAJCWJ1ZmZlci0+Y29udGV4dFtpXSA9IGNwdV90b19iZTMyKExDX0ZSRUUpOwogCi0JbWRldi0+YWxfdHJfY3ljbGUgKz0gQUxfQ09OVEVYVF9QRVJfVFJBTlNBQ1RJT047Ci0JaWYgKG1kZXYtPmFsX3RyX2N5Y2xlID49IG1kZXYtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKQotCQltZGV2LT5hbF90cl9jeWNsZSA9IDA7CisJZGV2aWNlLT5hbF90cl9jeWNsZSArPSBBTF9DT05URVhUX1BFUl9UUkFOU0FDVElPTjsKKwlpZiAoZGV2aWNlLT5hbF90cl9jeWNsZSA+PSBkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKQorCQlkZXZpY2UtPmFsX3RyX2N5Y2xlID0gMDsKIAotCXNlY3RvciA9IGFsX3RyX251bWJlcl90b19vbl9kaXNrX3NlY3RvcihtZGV2KTsKKwlzZWN0b3IgPSBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3IoZGV2aWNlKTsKIAogCWNyYyA9IGNyYzMyYygwLCBidWZmZXIsIDQwOTYpOwogCWJ1ZmZlci0+Y3JjMzJjID0gY3B1X3RvX2JlMzIoY3JjKTsKIAotCWlmIChkcmJkX2JtX3dyaXRlX2hpbnRlZChtZGV2KSkKKwlpZiAoZHJiZF9ibV93cml0ZV9oaW50ZWQoZGV2aWNlKSkKIAkJZXJyID0gLUVJTzsKIAllbHNlIHsKIAkJYm9vbCB3cml0ZV9hbF91cGRhdGVzOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+YWxfdXBkYXRlczsKKwkJd3JpdGVfYWxfdXBkYXRlcyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmFsX3VwZGF0ZXM7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlpZiAod3JpdGVfYWxfdXBkYXRlcykgewotCQkJaWYgKGRyYmRfbWRfc3luY19wYWdlX2lvKG1kZXYsIG1kZXYtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CisJCQlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CiAJCQkJZXJyID0gLUVJTzsKLQkJCQlkcmJkX2Noa19pb19lcnJvcihtZGV2LCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOworCQkJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbWRldi0+YWxfdHJfbnVtYmVyKys7Ci0JCQkJbWRldi0+YWxfd3JpdF9jbnQrKzsKKwkJCQlkZXZpY2UtPmFsX3RyX251bWJlcisrOworCQkJCWRldmljZS0+YWxfd3JpdF9jbnQrKzsKIAkJCX0KIAkJfQogCX0KIAotCWRyYmRfbWRfcHV0X2J1ZmZlcihtZGV2KTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTU5MywxMCArNTk2LDEwIEBACiBzdGF0aWMgaW50IHdfYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKIAlzdHJ1Y3QgdXBkYXRlX2FsX3dvcmsgKmF3ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCB1cGRhdGVfYWxfd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBhdy0+ZGV2aWNlOwogCWludCBlcnI7CiAKLQllcnIgPSBfYWxfd3JpdGVfdHJhbnNhY3Rpb24obWRldik7CisJZXJyID0gX2FsX3dyaXRlX3RyYW5zYWN0aW9uKGRldmljZSk7CiAJYXctPmVyciA9IGVycjsKIAljb21wbGV0ZSgmYXctPmV2ZW50KTsKIApAQCAtNjA2LDYzICs2MDksNjQgQEAKIC8qIENhbGxzIGZyb20gd29ya2VyIGNvbnRleHQgKHNlZSB3X3Jlc3RhcnRfZGlza19pbygpKSBuZWVkIHRvIHdyaXRlIHRoZQogICAgdHJhbnNhY3Rpb24gZGlyZWN0bHkuIE90aGVycyBjYW1lIHRocm91Z2ggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSwKICAgIHRob3NlIG5lZWQgdG8gZGVsZWdhdGUgaXQgdG8gdGhlIHdvcmtlci4gKi8KLXN0YXRpYyBpbnQgYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgYm9vbCBkZWxlZ2F0ZSkKK3N0YXRpYyBpbnQgYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGJvb2wgZGVsZWdhdGUpCiB7CiAJaWYgKGRlbGVnYXRlKSB7CiAJCXN0cnVjdCB1cGRhdGVfYWxfd29yayBhbF93b3JrOwogCQlpbml0X2NvbXBsZXRpb24oJmFsX3dvcmsuZXZlbnQpOwogCQlhbF93b3JrLncuY2IgPSB3X2FsX3dyaXRlX3RyYW5zYWN0aW9uOwotCQlhbF93b3JrLncubWRldiA9IG1kZXY7Ci0JCWRyYmRfcXVldWVfd29ya19mcm9udCgmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmYWxfd29yay53KTsKKwkJYWxfd29yay5kZXZpY2UgPSBkZXZpY2U7CisJCWRyYmRfcXVldWVfd29ya19mcm9udCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJICAgICAgJmFsX3dvcmsudyk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFsX3dvcmsuZXZlbnQpOwogCQlyZXR1cm4gYWxfd29yay5lcnI7CiAJfSBlbHNlCi0JCXJldHVybiBfYWxfd3JpdGVfdHJhbnNhY3Rpb24obWRldik7CisJCXJldHVybiBfYWxfd3JpdGVfdHJhbnNhY3Rpb24oZGV2aWNlKTsKIH0KIAotc3RhdGljIGludCBfdHJ5X2xjX2RlbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgbGNfZWxlbWVudCAqYWxfZXh0KQorc3RhdGljIGludCBfdHJ5X2xjX2RlbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxjX2VsZW1lbnQgKmFsX2V4dCkKIHsKIAlpbnQgcnY7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCXJ2ID0gKGFsX2V4dC0+cmVmY250ID09IDApOwogCWlmIChsaWtlbHkocnYpKQotCQlsY19kZWwobWRldi0+YWN0X2xvZywgYWxfZXh0KTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQlsY19kZWwoZGV2aWNlLT5hY3RfbG9nLCBhbF9leHQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX2FsX3NocmluaygpIC0gUmVtb3ZlcyBhbGwgYWN0aXZlIGV4dGVudHMgZm9ybSB0aGUgYWN0aXZpdHkgbG9nCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBSZW1vdmVzIGFsbCBhY3RpdmUgZXh0ZW50cyBmb3JtIHRoZSBhY3Rpdml0eSBsb2csIHdhaXRpbmcgdW50aWwKICAqIHRoZSByZWZlcmVuY2UgY291bnQgb2YgZWFjaCBlbnRyeSBkcm9wcGVkIHRvIDAgZmlyc3QsIG9mIGNvdXJzZS4KICAqCi0gKiBZb3UgbmVlZCB0byBsb2NrIG1kZXYtPmFjdF9sb2cgd2l0aCBsY190cnlfbG9jaygpIC8gbGNfdW5sb2NrKCkKKyAqIFlvdSBuZWVkIHRvIGxvY2sgZGV2aWNlLT5hY3RfbG9nIHdpdGggbGNfdHJ5X2xvY2soKSAvIGxjX3VubG9jaygpCiAgKi8KLXZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmFsX2V4dDsKIAlpbnQgaTsKIAotCURfQVNTRVJUKHRlc3RfYml0KF9fTENfTE9DS0VELCAmbWRldi0+YWN0X2xvZy0+ZmxhZ3MpKTsKKwlEX0FTU0VSVChkZXZpY2UsIHRlc3RfYml0KF9fTENfTE9DS0VELCAmZGV2aWNlLT5hY3RfbG9nLT5mbGFncykpOwogCi0JZm9yIChpID0gMDsgaSA8IG1kZXYtPmFjdF9sb2ctPm5yX2VsZW1lbnRzOyBpKyspIHsKLQkJYWxfZXh0ID0gbGNfZWxlbWVudF9ieV9pbmRleChtZGV2LT5hY3RfbG9nLCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50czsgaSsrKSB7CisJCWFsX2V4dCA9IGxjX2VsZW1lbnRfYnlfaW5kZXgoZGV2aWNlLT5hY3RfbG9nLCBpKTsKIAkJaWYgKGFsX2V4dC0+bGNfbnVtYmVyID09IExDX0ZSRUUpCiAJCQljb250aW51ZTsKLQkJd2FpdF9ldmVudChtZGV2LT5hbF93YWl0LCBfdHJ5X2xjX2RlbChtZGV2LCBhbF9leHQpKTsKKwkJd2FpdF9ldmVudChkZXZpY2UtPmFsX3dhaXQsIF90cnlfbGNfZGVsKGRldmljZSwgYWxfZXh0KSk7CiAJfQogCi0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAotaW50IGRyYmRfaW5pdGlhbGl6ZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB2b2lkICpidWZmZXIpCitpbnQgZHJiZF9pbml0aWFsaXplX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB2b2lkICpidWZmZXIpCiB7CiAJc3RydWN0IGFsX3RyYW5zYWN0aW9uX29uX2Rpc2sgKmFsID0gYnVmZmVyOwotCXN0cnVjdCBkcmJkX21kICptZCA9ICZtZGV2LT5sZGV2LT5tZDsKKwlzdHJ1Y3QgZHJiZF9tZCAqbWQgPSAmZGV2aWNlLT5sZGV2LT5tZDsKIAlzZWN0b3JfdCBhbF9iYXNlID0gbWQtPm1kX29mZnNldCArIG1kLT5hbF9vZmZzZXQ7CiAJaW50IGFsX3NpemVfNGsgPSBtZC0+YWxfc3RyaXBlcyAqIG1kLT5hbF9zdHJpcGVfc2l6ZV80azsKIAlpbnQgaTsKQEAgLTY3Myw3ICs2NzcsNyBAQAogCWFsLT5jcmMzMmMgPSBjcHVfdG9fYmUzMihjcmMzMmMoMCwgYWwsIDQwOTYpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBhbF9zaXplXzRrOyBpKyspIHsKLQkJaW50IGVyciA9IGRyYmRfbWRfc3luY19wYWdlX2lvKG1kZXYsIG1kZXYtPmxkZXYsIGFsX2Jhc2UgKyBpICogOCwgV1JJVEUpOworCQlpbnQgZXJyID0gZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIGFsX2Jhc2UgKyBpICogOCwgV1JJVEUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC02ODMsMzIgKzY4NywzMiBAQAogc3RhdGljIGludCB3X3VwZGF0ZV9vZGJtKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7CiAJc3RydWN0IHVwZGF0ZV9vZGJtX3dvcmsgKnVkdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgdXBkYXRlX29kYm1fd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSB1ZHctPmRldmljZTsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liID0geyAuc2liX3JlYXNvbiA9IFNJQl9TWU5DX1BST0dSRVNTLCB9OwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgeworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl93YXJuKERFViwgIkNhbiBub3QgdXBkYXRlIG9uIGRpc2sgYml0bWFwLCBsb2NhbCBJTyBkaXNhYmxlZC5cbiIpOworCQkJZHJiZF93YXJuKGRldmljZSwgIkNhbiBub3QgdXBkYXRlIG9uIGRpc2sgYml0bWFwLCBsb2NhbCBJTyBkaXNhYmxlZC5cbiIpOwogCQlrZnJlZSh1ZHcpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkcmJkX2JtX3dyaXRlX3BhZ2UobWRldiwgcnNfZXh0ZW50X3RvX2JtX3BhZ2UodWR3LT5lbnIpKTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX2JtX3dyaXRlX3BhZ2UoZGV2aWNlLCByc19leHRlbnRfdG9fYm1fcGFnZSh1ZHctPmVucikpOworCXB1dF9sZGV2KGRldmljZSk7CiAKIAlrZnJlZSh1ZHcpOwogCi0JaWYgKGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpIDw9IG1kZXYtPnJzX2ZhaWxlZCkgewotCQlzd2l0Y2ggKG1kZXYtPnN0YXRlLmNvbm4pIHsKKwlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA8PSBkZXZpY2UtPnJzX2ZhaWxlZCkgeworCQlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCQljYXNlIENfU1lOQ19TT1VSQ0U6ICBjYXNlIENfU1lOQ19UQVJHRVQ6CiAJCWNhc2UgQ19QQVVTRURfU1lOQ19TOiBjYXNlIENfUEFVU0VEX1NZTkNfVDoKLQkJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJZGVmYXVsdDoKIAkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJCWJyZWFrOwogCQl9CiAJfQotCWRyYmRfYmNhc3RfZXZlbnQobWRldiwgJnNpYik7CisJZHJiZF9iY2FzdF9ldmVudChkZXZpY2UsICZzaWIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MjAsNyArNzI0LDcgQEAKICAqCiAgKiBUT0RPIHdpbGwgYmUgb2Jzb2xldGVkIG9uY2Ugd2UgaGF2ZSBhIGNhY2hpbmcgbHJ1IG9mIHRoZSBvbiBkaXNrIGJpdG1hcAogICovCi1zdGF0aWMgdm9pZCBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwKK3N0YXRpYyB2b2lkIGRyYmRfdHJ5X2NsZWFyX29uX2Rpc2tfYm0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICAgICBpbnQgY291bnQsIGludCBzdWNjZXNzKQogewogCXN0cnVjdCBsY19lbGVtZW50ICplOwpAQCAtNzI4LDEzICs3MzIsMTMgQEAKIAogCXVuc2lnbmVkIGludCBlbnI7CiAKLQlEX0FTU0VSVChhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSk7CisJRF9BU1NFUlQoZGV2aWNlLCBhdG9taWNfcmVhZCgmZGV2aWNlLT5sb2NhbF9jbnQpKTsKIAogCS8qIEkgc2ltcGx5IGFzc3VtZSB0aGF0IGEgc2VjdG9yL3NpemUgcGFpciBuZXZlciBjcm9zc2VzCiAJICogYSAxNiBNQiBleHRlbnQgYm9yZGVyLiAoQ3VycmVudGx5IHRoaXMgaXMgdHJ1ZS4uLikgKi8KIAllbnIgPSBCTV9TRUNUX1RPX0VYVChzZWN0b3IpOwogCi0JZSA9IGxjX2dldChtZGV2LT5yZXN5bmMsIGVucik7CisJZSA9IGxjX2dldChkZXZpY2UtPnJlc3luYywgZW5yKTsKIAlpZiAoZSkgewogCQlzdHJ1Y3QgYm1fZXh0ZW50ICpleHQgPSBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpOwogCQlpZiAoZXh0LT5sY2UubGNfbnVtYmVyID09IGVucikgewpAQCAtNzQzLDEyICs3NDcsMTIgQEAKIAkJCWVsc2UKIAkJCQlleHQtPnJzX2ZhaWxlZCArPSBjb3VudDsKIAkJCWlmIChleHQtPnJzX2xlZnQgPCBleHQtPnJzX2ZhaWxlZCkgewotCQkJCWRldl93YXJuKERFViwgIkJBRCEgc2VjdG9yPSVsbHVzIGVucj0ldSByc19sZWZ0PSVkICIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiQkFEISBzZWN0b3I9JWxsdXMgZW5yPSV1IHJzX2xlZnQ9JWQgIgogCQkJCSAgICAicnNfZmFpbGVkPSVkIGNvdW50PSVkIGNzdGF0ZT0lc1xuIiwKIAkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLAogCQkJCSAgICAgZXh0LT5sY2UubGNfbnVtYmVyLCBleHQtPnJzX2xlZnQsCiAJCQkJICAgICBleHQtPnJzX2ZhaWxlZCwgY291bnQsCi0JCQkJICAgICBkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pKTsKKwkJCQkgICAgIGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAKIAkJCQkvKiBXZSBkb24ndCBleHBlY3QgdG8gYmUgYWJsZSB0byBjbGVhciBtb3JlIGJpdHMKIAkJCQkgKiB0aGFuIGhhdmUgYmVlbiBzZXQgd2hlbiB3ZSBvcmlnaW5hbGx5IGNvdW50ZWQKQEAgLTc1Niw3ICs3NjAsNyBAQAogCQkJCSAqIFdoYXRldmVyIHRoZSByZWFzb24gKGRpc2Nvbm5lY3QgZHVyaW5nIHJlc3luYywKIAkJCQkgKiBkZWxheWVkIGxvY2FsIGNvbXBsZXRpb24gb2YgYW4gYXBwbGljYXRpb24gd3JpdGUpLAogCQkJCSAqIHRyeSB0byBmaXggaXQgdXAgYnkgcmVjb3VudGluZyBoZXJlLiAqLwotCQkJCWV4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCQlleHQtPnJzX2xlZnQgPSBkcmJkX2JtX2Vfd2VpZ2h0KGRldmljZSwgZW5yKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIE5vcm1hbGx5IHRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlLApAQCAtNzY1LDE2ICs3NjksMTYgQEAKIAkJCSAqIEJ1dCBtYXliZSBhbiBhcHBsaWNhdGlvbiB3cml0ZSBmaW5pc2hlZCwgYW5kIHdlIHNldAogCQkJICogc29tZXRoaW5nIG91dHNpZGUgdGhlIHJlc3luYyBscnVfY2FjaGUgaW4gc3luYy4KIAkJCSAqLwotCQkJaW50IHJzX2xlZnQgPSBkcmJkX2JtX2Vfd2VpZ2h0KG1kZXYsIGVucik7CisJCQlpbnQgcnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJaWYgKGV4dC0+ZmxhZ3MgIT0gMCkgewotCQkJCWRldl93YXJuKERFViwgImNoYW5naW5nIHJlc3luYyBsY2U6ICVkWyV1OyUwMmx4XSIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiY2hhbmdpbmcgcmVzeW5jIGxjZTogJWRbJXU7JTAybHhdIgogCQkJCSAgICAgIiAtPiAlZFsldTswMF1cbiIsCiAJCQkJICAgICBleHQtPmxjZS5sY19udW1iZXIsIGV4dC0+cnNfbGVmdCwKIAkJCQkgICAgIGV4dC0+ZmxhZ3MsIGVuciwgcnNfbGVmdCk7CiAJCQkJZXh0LT5mbGFncyA9IDA7CiAJCQl9CiAJCQlpZiAoZXh0LT5yc19mYWlsZWQpIHsKLQkJCQlkZXZfd2FybihERVYsICJLaWNraW5nIHJlc3luY19scnUgZWxlbWVudCBlbnI9JXUgIgorCQkJCWRyYmRfd2FybihkZXZpY2UsICJLaWNraW5nIHJlc3luY19scnUgZWxlbWVudCBlbnI9JXUgIgogCQkJCSAgICAgIm91dCB3aXRoIHJzX2ZhaWxlZD0lZFxuIiwKIAkJCQkgICAgIGV4dC0+bGNlLmxjX251bWJlciwgZXh0LT5yc19mYWlsZWQpOwogCQkJfQpAQCAtNzgyLDkgKzc4Niw5IEBACiAJCQlleHQtPnJzX2ZhaWxlZCA9IHN1Y2Nlc3MgPyAwIDogY291bnQ7CiAJCQkvKiB3ZSBkb24ndCBrZWVwIGEgcGVyc2lzdGVudCBsb2cgb2YgdGhlIHJlc3luYyBscnUsCiAJCQkgKiB3ZSBjYW4gY29tbWl0IGFueSBjaGFuZ2UgcmlnaHQgYXdheS4gKi8KLQkJCWxjX2NvbW1pdHRlZChtZGV2LT5yZXN5bmMpOworCQkJbGNfY29tbWl0dGVkKGRldmljZS0+cmVzeW5jKTsKIAkJfQotCQlsY19wdXQobWRldi0+cmVzeW5jLCAmZXh0LT5sY2UpOworCQlsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZleHQtPmxjZSk7CiAJCS8qIG5vIHJhY2UsIHdlIGFyZSB3aXRoaW4gdGhlIGFsX2xvY2shICovCiAKIAkJaWYgKGV4dC0+cnNfbGVmdCA9PSBleHQtPnJzX2ZhaWxlZCkgewpAQCAtNzk0LDMyICs3OTgsMzMgQEAKIAkJCWlmICh1ZHcpIHsKIAkJCQl1ZHctPmVuciA9IGV4dC0+bGNlLmxjX251bWJlcjsKIAkJCQl1ZHctPncuY2IgPSB3X3VwZGF0ZV9vZGJtOwotCQkJCXVkdy0+dy5tZGV2ID0gbWRldjsKLQkJCQlkcmJkX3F1ZXVlX3dvcmtfZnJvbnQoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnVkdy0+dyk7CisJCQkJdWR3LT5kZXZpY2UgPSBkZXZpY2U7CisJCQkJZHJiZF9xdWV1ZV93b3JrX2Zyb250KCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSAgICAgICZ1ZHctPncpOwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfd2FybihERVYsICJDb3VsZCBub3Qga21hbGxvYyBhbiB1ZHdcbiIpOworCQkJCWRyYmRfd2FybihkZXZpY2UsICJDb3VsZCBub3Qga21hbGxvYyBhbiB1ZHdcbiIpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJZGV2X2VycihERVYsICJsY19nZXQoKSBmYWlsZWQhIGxvY2tlZD0lZC8lZCBmbGFncz0lbHVcbiIsCi0JCSAgICBtZGV2LT5yZXN5bmNfbG9ja2VkLAotCQkgICAgbWRldi0+cmVzeW5jLT5ucl9lbGVtZW50cywKLQkJICAgIG1kZXYtPnJlc3luYy0+ZmxhZ3MpOworCQlkcmJkX2VycihkZXZpY2UsICJsY19nZXQoKSBmYWlsZWQhIGxvY2tlZD0lZC8lZCBmbGFncz0lbHVcbiIsCisJCSAgICBkZXZpY2UtPnJlc3luY19sb2NrZWQsCisJCSAgICBkZXZpY2UtPnJlc3luYy0+bnJfZWxlbWVudHMsCisJCSAgICBkZXZpY2UtPnJlc3luYy0+ZmxhZ3MpOwogCX0KIH0KIAotdm9pZCBkcmJkX2FkdmFuY2VfcnNfbWFya3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBzdGlsbF90b19nbykKK3ZvaWQgZHJiZF9hZHZhbmNlX3JzX21hcmtzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHN0aWxsX3RvX2dvKQogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQl1bnNpZ25lZCBsb25nIGxhc3QgPSBtZGV2LT5yc19tYXJrX3RpbWVbbWRldi0+cnNfbGFzdF9tYXJrXTsKLQlpbnQgbmV4dCA9IChtZGV2LT5yc19sYXN0X21hcmsgKyAxKSAlIERSQkRfU1lOQ19NQVJLUzsKKwl1bnNpZ25lZCBsb25nIGxhc3QgPSBkZXZpY2UtPnJzX21hcmtfdGltZVtkZXZpY2UtPnJzX2xhc3RfbWFya107CisJaW50IG5leHQgPSAoZGV2aWNlLT5yc19sYXN0X21hcmsgKyAxKSAlIERSQkRfU1lOQ19NQVJLUzsKIAlpZiAodGltZV9hZnRlcl9lcShub3csIGxhc3QgKyBEUkJEX1NZTkNfTUFSS19TVEVQKSkgewotCQlpZiAobWRldi0+cnNfbWFya19sZWZ0W21kZXYtPnJzX2xhc3RfbWFya10gIT0gc3RpbGxfdG9fZ28gJiYKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19UICYmCi0JCSAgICBtZGV2LT5zdGF0ZS5jb25uICE9IENfUEFVU0VEX1NZTkNfUykgewotCQkJbWRldi0+cnNfbWFya190aW1lW25leHRdID0gbm93OwotCQkJbWRldi0+cnNfbWFya19sZWZ0W25leHRdID0gc3RpbGxfdG9fZ287Ci0JCQltZGV2LT5yc19sYXN0X21hcmsgPSBuZXh0OworCQlpZiAoZGV2aWNlLT5yc19tYXJrX2xlZnRbZGV2aWNlLT5yc19sYXN0X21hcmtdICE9IHN0aWxsX3RvX2dvICYmCisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19UICYmCisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19TKSB7CisJCQlkZXZpY2UtPnJzX21hcmtfdGltZVtuZXh0XSA9IG5vdzsKKwkJCWRldmljZS0+cnNfbWFya19sZWZ0W25leHRdID0gc3RpbGxfdG9fZ287CisJCQlkZXZpY2UtPnJzX2xhc3RfbWFyayA9IG5leHQ7CiAJCX0KIAl9CiB9CkBAIC04MzEsNyArODM2LDcgQEAKICAqIGNhbGxlZCBieSB3b3JrZXIgb24gQ19TWU5DX1RBUkdFVCBhbmQgcmVjZWl2ZXIgb24gU3luY1NvdXJjZS4KICAqCiAgKi8KLXZvaWQgX19kcmJkX3NldF9pbl9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsCit2b2lkIF9fZHJiZF9zZXRfaW5fc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IHVuc2lnbmVkIGludCBsaW5lKQogewogCS8qIElzIGNhbGxlZCBmcm9tIHdvcmtlciBhbmQgcmVjZWl2ZXIgY29udGV4dCBfb25seV8gKi8KQEAgLTg0MiwxNSArODQ3LDE1IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChzaXplIDw9IDAgfHwgIUlTX0FMSUdORUQoc2l6ZSwgNTEyKSB8fCBzaXplID4gRFJCRF9NQVhfQklPX1NJWkUpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3NldF9pbl9zeW5jOiBzZWN0b3I9JWxsdXMgc2l6ZT0lZCBub25zZW5zZSFcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2V0X2luX3N5bmM6IHNlY3Rvcj0lbGx1cyBzaXplPSVkIG5vbnNlbnNlIVxuIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvciwgc2l6ZSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuOyAvKiBubyBkaXNrLCBubyBtZXRhZGF0YSwgbm8gYml0bWFwIHRvIGNsZWFyIGJpdHMgaW4gKi8KIAotCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJZXNlY3RvciA9IHNlY3RvciArIChzaXplID4+IDkpIC0gMTsKIAogCWlmICghZXhwZWN0KHNlY3RvciA8IG5yX3NlY3RvcnMpKQpAQCAtODc4LDIxICs4ODMsMjEgQEAKIAkgKiBvaywgKGNhcGFjaXR5ICYgNykgIT0gMCBzb21ldGltZXMsIGJ1dCB3aG8gY2FyZXMuLi4KIAkgKiB3ZSBjb3VudCByc197dG90YWwsbGVmdH0gaW4gYml0cywgbm90IHNlY3RvcnMuCiAJICovCi0JY291bnQgPSBkcmJkX2JtX2NsZWFyX2JpdHMobWRldiwgc2JuciwgZWJucik7CisJY291bnQgPSBkcmJkX2JtX2NsZWFyX2JpdHMoZGV2aWNlLCBzYm5yLCBlYm5yKTsKIAlpZiAoY291bnQpIHsKLQkJZHJiZF9hZHZhbmNlX3JzX21hcmtzKG1kZXYsIGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKLQkJZHJiZF90cnlfY2xlYXJfb25fZGlza19ibShtZGV2LCBzZWN0b3IsIGNvdW50LCB0cnVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MoZGV2aWNlLCBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOworCQlkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKGRldmljZSwgc2VjdG9yLCBjb3VudCwgdHJ1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiAJCS8qIGp1c3Qgd2FrZV91cCB1bmNvbmRpdGlvbmFsIG5vdywgdmFyaW91cyBsY19jaGFnZWQoKSwKIAkJICogbGNfcHV0KCkgaW4gZHJiZF90cnlfY2xlYXJfb25fZGlza19ibSgpLiAqLwogCQl3YWtlX3VwID0gMTsKIAl9CiBvdXQ6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlpZiAod2FrZV91cCkKLQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiB9CiAKIC8qCkBAIC05MDMsNyArOTA4LDcgQEAKICAqIGNhbGxlZCBieSB0bF9jbGVhciBhbmQgZHJiZF9zZW5kX2RibG9jayAoPT1kcmJkX21ha2VfcmVxdWVzdCkuCiAgKiBzbyB0aGlzIGNhbiBiZSBfYW55XyBwcm9jZXNzLgogICovCi1pbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAoraW50IF9fZHJiZF9zZXRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsCiAJCQkgICAgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBzYm5yLCBlYm5yLCBmbGFnczsKQEAgLTkxNiwxNSArOTIxLDE1IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHNpemUgPCAwIHx8ICFJU19BTElHTkVEKHNpemUsIDUxMikgfHwgc2l6ZSA+IERSQkRfTUFYX0JJT19TSVpFKSB7Ci0JCWRldl9lcnIoREVWLCAic2VjdG9yOiAlbGx1cywgc2l6ZTogJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgInNlY3RvcjogJWxsdXMsIHNpemU6ICVkXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuIDA7IC8qIG5vIGRpc2ssIG5vIG1ldGFkYXRhLCBubyBiaXRtYXAgdG8gc2V0IGJpdHMgaW4gKi8KIAotCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJZXNlY3RvciA9IHNlY3RvciArIChzaXplID4+IDkpIC0gMTsKIAogCWlmICghZXhwZWN0KHNlY3RvciA8IG5yX3NlY3RvcnMpKQpAQCAtOTM5LDU1ICs5NDQsNTUgQEAKIAogCS8qIG9rLCAoY2FwYWNpdHkgJiA3KSAhPSAwIHNvbWV0aW1lcywgYnV0IHdobyBjYXJlcy4uLgogCSAqIHdlIGNvdW50IHJzX3t0b3RhbCxsZWZ0fSBpbiBiaXRzLCBub3Qgc2VjdG9ycy4gICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKLQljb3VudCA9IGRyYmRfYm1fc2V0X2JpdHMobWRldiwgc2JuciwgZWJucik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOworCWNvdW50ID0gZHJiZF9ibV9zZXRfYml0cyhkZXZpY2UsIHNibnIsIGVibnIpOwogCiAJZW5yID0gQk1fU0VDVF9UT19FWFQoc2VjdG9yKTsKLQllID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIGVucik7CisJZSA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJaWYgKGUpCiAJCWxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSktPnJzX2xlZnQgKz0gY291bnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiBvdXQ6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljCi1zdHJ1Y3QgYm1fZXh0ZW50ICpfYm1lX2dldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgZW5yKQorc3RydWN0IGJtX2V4dGVudCAqX2JtZV9nZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBlbnIpCiB7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmU7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCWludCB3YWtldXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgcnNfZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKLQlpZiAobWRldi0+cmVzeW5jX2xvY2tlZCA+IG1kZXYtPnJlc3luYy0+bnJfZWxlbWVudHMvMikgewotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJaWYgKGRldmljZS0+cmVzeW5jX2xvY2tlZCA+IGRldmljZS0+cmVzeW5jLT5ucl9lbGVtZW50cy8yKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWUgPSBsY19nZXQobWRldi0+cmVzeW5jLCBlbnIpOworCWUgPSBsY19nZXQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCWlmIChibV9leHQpIHsKIAkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciAhPSBlbnIpIHsKLQkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJYm1fZXh0LT5yc19mYWlsZWQgPSAwOwotCQkJbGNfY29tbWl0dGVkKG1kZXYtPnJlc3luYyk7CisJCQlsY19jb21taXR0ZWQoZGV2aWNlLT5yZXN5bmMpOwogCQkJd2FrZXVwID0gMTsKIAkJfQogCQlpZiAoYm1fZXh0LT5sY2UucmVmY250ID09IDEpCi0JCQltZGV2LT5yZXN5bmNfbG9ja2VkKys7CisJCQlkZXZpY2UtPnJlc3luY19sb2NrZWQrKzsKIAkJc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncyk7CiAJfQotCXJzX2ZsYWdzID0gbWRldi0+cmVzeW5jLT5mbGFnczsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXJzX2ZsYWdzID0gZGV2aWNlLT5yZXN5bmMtPmZsYWdzOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAod2FrZXVwKQotCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAogCWlmICghYm1fZXh0KSB7CiAJCWlmIChyc19mbGFncyAmIExDX1NUQVJWSU5HKQotCQkJZGV2X3dhcm4oREVWLCAiSGF2ZSB0byB3YWl0IGZvciBlbGVtZW50IgorCQkJZHJiZF93YXJuKGRldmljZSwgIkhhdmUgdG8gd2FpdCBmb3IgZWxlbWVudCIKIAkJCSAgICAgIiAocmVzeW5jIExSVSB0b28gc21hbGw/KVxuIik7CiAJCUJVR19PTihyc19mbGFncyAmIExDX0xPQ0tFRCk7CiAJfQpAQCAtOTk1LDI1ICsxMDAwLDI1IEBACiAJcmV0dXJuIGJtX2V4dDsKIH0KIAotc3RhdGljIGludCBfaXNfaW5fYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IGVucikKK3N0YXRpYyBpbnQgX2lzX2luX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yKQogewogCWludCBydjsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCXJ2ID0gbGNfaXNfdXNlZChtZGV2LT5hY3RfbG9nLCBlbnIpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwlydiA9IGxjX2lzX3VzZWQoZGV2aWNlLT5hY3RfbG9nLCBlbnIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX3JzX2JlZ2luX2lvKCkgLSBHZXRzIGFuIGV4dGVudCBpbiB0aGUgcmVzeW5jIExSVSBjYWNoZSBhbmQgc2V0cyBpdCB0byBCTUVfTE9DS0VECi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICoKICAqIFRoaXMgZnVuY3Rpb25zIHNsZWVwcyBvbiBhbF93YWl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlRSIGlmIGludGVycnVwdGVkLgogICovCi1pbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpCitpbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKQogewogCXVuc2lnbmVkIGludCBlbnIgPSBCTV9TRUNUX1RPX0VYVChzZWN0b3IpOwogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKQEAgLTEwMjIsOCArMTAyNyw4IEBACiAJCQkgMjAwIHRpbWVzIC0+IDIwIHNlY29uZHMuICovCiAKIHJldHJ5OgotCXNpZyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShtZGV2LT5hbF93YWl0LAotCQkJKGJtX2V4dCA9IF9ibWVfZ2V0KG1kZXYsIGVucikpKTsKKwlzaWcgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5hbF93YWl0LAorCQkJKGJtX2V4dCA9IF9ibWVfZ2V0KGRldmljZSwgZW5yKSkpOwogCWlmIChzaWcpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTEwMzEsMjQgKzEwMzYsMjQgQEAKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxfRVhUX1BFUl9CTV9TRUNUOyBpKyspIHsKLQkJc2lnID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG1kZXYtPmFsX3dhaXQsCi0JCQkJCSAgICAgICAhX2lzX2luX2FsKG1kZXYsIGVuciAqIEFMX0VYVF9QRVJfQk1fU0VDVCArIGkpIHx8CisJCXNpZyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXZpY2UtPmFsX3dhaXQsCisJCQkJCSAgICAgICAhX2lzX2luX2FsKGRldmljZSwgZW5yICogQUxfRVhUX1BFUl9CTV9TRUNUICsgaSkgfHwKIAkJCQkJICAgICAgIHRlc3RfYml0KEJNRV9QUklPUklUWSwgJmJtX2V4dC0+ZmxhZ3MpKTsKIAogCQlpZiAoc2lnIHx8ICh0ZXN0X2JpdChCTUVfUFJJT1JJVFksICZibV9leHQtPmZsYWdzKSAmJiBzYSkpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCQkJaWYgKGxjX3B1dChtZGV2LT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkgeworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwkJCWlmIChsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkgewogCQkJCWJtX2V4dC0+ZmxhZ3MgPSAwOyAvKiBjbGVhcnMgQk1FX05PX1dSSVRFUyBhbmQgZXZlbnR1YWxseSBCTUVfUFJJT1JJVFkgKi8KLQkJCQltZGV2LT5yZXN5bmNfbG9ja2VkLS07Ci0JCQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCQkJZGV2aWNlLT5yZXN5bmNfbG9ja2VkLS07CisJCQkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJCQlpZiAoc2lnKQogCQkJCXJldHVybiAtRUlOVFI7CiAJCQlpZiAoc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaLzEwKSkKIAkJCQlyZXR1cm4gLUVJTlRSOwogCQkJaWYgKHNhICYmIC0tc2EgPT0gMCkKLQkJCQlkZXZfd2FybihERVYsImRyYmRfcnNfYmVnaW5faW8oKSBzdGVwcGVkIGFzaWRlIGZvciAyMHNlYy4iCisJCQkJZHJiZF93YXJuKGRldmljZSwgImRyYmRfcnNfYmVnaW5faW8oKSBzdGVwcGVkIGFzaWRlIGZvciAyMHNlYy4iCiAJCQkJCSAiUmVzeW5jIHN0YWxsZWQ/XG4iKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTEwNTksMTQgKzEwNjQsMTQgQEAKIAogLyoqCiAgKiBkcmJkX3RyeV9yc19iZWdpbl9pbygpIC0gR2V0cyBhbiBleHRlbnQgaW4gdGhlIHJlc3luYyBMUlUgY2FjaGUsIGRvZXMgbm90IHNsZWVwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICoKICAqIEdldHMgYW4gZXh0ZW50IGluIHRoZSByZXN5bmMgTFJVIGNhY2hlLCBzZXRzIGl0IHRvIEJNRV9OT19XUklURVMsIHRoZW4KICAqIHRyaWVzIHRvIHNldCBpdCB0byBCTUVfTE9DS0VELiBSZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBhbmQgLUVBR0FJTgogICogaWYgdGhlcmUgaXMgc3RpbGwgYXBwbGljYXRpb24gSU8gZ29pbmcgb24gaW4gdGhpcyBhcmVhLgogICovCi1pbnQgZHJiZF90cnlfcnNfYmVnaW5faW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQoraW50IGRyYmRfdHJ5X3JzX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpCiB7CiAJdW5zaWduZWQgaW50IGVuciA9IEJNX1NFQ1RfVE9fRVhUKHNlY3Rvcik7CiAJY29uc3QgdW5zaWduZWQgaW50IGFsX2VuciA9IGVucipBTF9FWFRfUEVSX0JNX1NFQ1Q7CkBAIC0xMDc0LDggKzEwNzksOCBAQAogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCWlmIChtZGV2LT5yZXN5bmNfd2VuciAhPSBMQ19GUkVFICYmIG1kZXYtPnJlc3luY193ZW5yICE9IGVucikgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJaWYgKGRldmljZS0+cmVzeW5jX3dlbnIgIT0gTENfRlJFRSAmJiBkZXZpY2UtPnJlc3luY193ZW5yICE9IGVucikgewogCQkvKiBpbiBjYXNlIHlvdSBoYXZlIHZlcnkgaGVhdnkgc2NhdHRlcmVkIGlvLCBpdCBtYXkKIAkJICogc3RhbGwgdGhlIHN5bmNlciB1bmRlZmluZWQgaWYgd2UgZ2l2ZSB1cCB0aGUgcmVmIGNvdW50CiAJCSAqIHdoZW4gd2UgdHJ5IGFnYWluIGFuZCByZXF1ZXVlLgpAQCAtMTA4OSwxOTMgKzEwOTQsMTkzIEBACiAJCSAqIHRoZSBsY19wdXQgaGVyZS4uLgogCQkgKiB3ZSBhbHNvIGhhdmUgdG8gd2FrZV91cAogCQkgKi8KLQkJZSA9IGxjX2ZpbmQobWRldi0+cmVzeW5jLCBtZGV2LT5yZXN5bmNfd2Vucik7CisJCWUgPSBsY19maW5kKGRldmljZS0+cmVzeW5jLCBkZXZpY2UtPnJlc3luY193ZW5yKTsKIAkJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCQlpZiAoYm1fZXh0KSB7Ci0JCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCURfQVNTRVJUKHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSk7CisJCQlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpOworCQkJRF9BU1NFUlQoZGV2aWNlLCB0ZXN0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpOwogCQkJY2xlYXJfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKTsKLQkJCW1kZXYtPnJlc3luY193ZW5yID0gTENfRlJFRTsKLQkJCWlmIChsY19wdXQobWRldi0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApCi0JCQkJbWRldi0+cmVzeW5jX2xvY2tlZC0tOwotCQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCQlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwkJCWlmIChsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkKKwkJCQlkZXZpY2UtPnJlc3luY19sb2NrZWQtLTsKKwkJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfYWxlcnQoREVWLCAiTE9HSUMgQlVHXG4iKTsKKwkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiTE9HSUMgQlVHXG4iKTsKIAkJfQogCX0KIAkvKiBUUlkuICovCi0JZSA9IGxjX3RyeV9nZXQobWRldi0+cmVzeW5jLCBlbnIpOworCWUgPSBsY190cnlfZ2V0KGRldmljZS0+cmVzeW5jLCBlbnIpOwogCWJtX2V4dCA9IGUgPyBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpIDogTlVMTDsKIAlpZiAoYm1fZXh0KSB7CiAJCWlmICh0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpCiAJCQlnb3RvIHByb2NlZWQ7CiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpIHsKLQkJCW1kZXYtPnJlc3luY19sb2NrZWQrKzsKKwkJCWRldmljZS0+cmVzeW5jX2xvY2tlZCsrOwogCQl9IGVsc2UgewogCQkJLyogd2UgZGlkIHNldCB0aGUgQk1FX05PX1dSSVRFUywKIAkJCSAqIGJ1dCB0aGVuIGNvdWxkIG5vdCBzZXQgQk1FX0xPQ0tFRCwKIAkJCSAqIHNvIHdlIHRyaWVkIGFnYWluLgogCQkJICogZHJvcCB0aGUgZXh0cmEgcmVmZXJlbmNlLiAqLwogCQkJYm1fZXh0LT5sY2UucmVmY250LS07Ci0JCQlEX0FTU0VSVChibV9leHQtPmxjZS5yZWZjbnQgPiAwKTsKKwkJCURfQVNTRVJUKGRldmljZSwgYm1fZXh0LT5sY2UucmVmY250ID4gMCk7CiAJCX0KIAkJZ290byBjaGVja19hbDsKIAl9IGVsc2UgewogCQkvKiBkbyB3ZSByYXRoZXIgd2FudCB0byB0cnkgbGF0ZXI/ICovCi0JCWlmIChtZGV2LT5yZXN5bmNfbG9ja2VkID4gbWRldi0+cmVzeW5jLT5ucl9lbGVtZW50cy0zKQorCQlpZiAoZGV2aWNlLT5yZXN5bmNfbG9ja2VkID4gZGV2aWNlLT5yZXN5bmMtPm5yX2VsZW1lbnRzLTMpCiAJCQlnb3RvIHRyeV9hZ2FpbjsKIAkJLyogRG8gb3IgZG8gbm90LiBUaGVyZSBpcyBubyB0cnkuIC0tIFlvZGEgKi8KLQkJZSA9IGxjX2dldChtZGV2LT5yZXN5bmMsIGVucik7CisJCWUgPSBsY19nZXQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJCWJtX2V4dCA9IGUgPyBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpIDogTlVMTDsKIAkJaWYgKCFibV9leHQpIHsKLQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcnNfZmxhZ3MgPSBtZGV2LT5yZXN5bmMtPmZsYWdzOworCQkJY29uc3QgdW5zaWduZWQgbG9uZyByc19mbGFncyA9IGRldmljZS0+cmVzeW5jLT5mbGFnczsKIAkJCWlmIChyc19mbGFncyAmIExDX1NUQVJWSU5HKQotCQkJCWRldl93YXJuKERFViwgIkhhdmUgdG8gd2FpdCBmb3IgZWxlbWVudCIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiSGF2ZSB0byB3YWl0IGZvciBlbGVtZW50IgogCQkJCSAgICAgIiAocmVzeW5jIExSVSB0b28gc21hbGw/KVxuIik7CiAJCQlCVUdfT04ocnNfZmxhZ3MgJiBMQ19MT0NLRUQpOwogCQkJZ290byB0cnlfYWdhaW47CiAJCX0KIAkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciAhPSBlbnIpIHsKLQkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJYm1fZXh0LT5yc19mYWlsZWQgPSAwOwotCQkJbGNfY29tbWl0dGVkKG1kZXYtPnJlc3luYyk7Ci0JCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKLQkJCURfQVNTRVJUKHRlc3RfYml0KEJNRV9MT0NLRUQsICZibV9leHQtPmZsYWdzKSA9PSAwKTsKKwkJCWxjX2NvbW1pdHRlZChkZXZpY2UtPnJlc3luYyk7CisJCQl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOworCQkJRF9BU1NFUlQoZGV2aWNlLCB0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykgPT0gMCk7CiAJCX0KIAkJc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncyk7Ci0JCURfQVNTRVJUKGJtX2V4dC0+bGNlLnJlZmNudCA9PSAxKTsKLQkJbWRldi0+cmVzeW5jX2xvY2tlZCsrOworCQlEX0FTU0VSVChkZXZpY2UsIGJtX2V4dC0+bGNlLnJlZmNudCA9PSAxKTsKKwkJZGV2aWNlLT5yZXN5bmNfbG9ja2VkKys7CiAJCWdvdG8gY2hlY2tfYWw7CiAJfQogY2hlY2tfYWw6CiAJZm9yIChpID0gMDsgaSA8IEFMX0VYVF9QRVJfQk1fU0VDVDsgaSsrKSB7Ci0JCWlmIChsY19pc191c2VkKG1kZXYtPmFjdF9sb2csIGFsX2VucitpKSkKKwkJaWYgKGxjX2lzX3VzZWQoZGV2aWNlLT5hY3RfbG9nLCBhbF9lbnIraSkpCiAJCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAJc2V0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncyk7CiBwcm9jZWVkOgotCW1kZXYtPnJlc3luY193ZW5yID0gTENfRlJFRTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCWRldmljZS0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlyZXR1cm4gMDsKIAogdHJ5X2FnYWluOgogCWlmIChibV9leHQpCi0JCW1kZXYtPnJlc3luY193ZW5yID0gZW5yOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCWRldmljZS0+cmVzeW5jX3dlbnIgPSBlbnI7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCXJldHVybiAtRUFHQUlOOwogfQogCi12b2lkIGRyYmRfcnNfY29tcGxldGVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQordm9pZCBkcmJkX3JzX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpCiB7CiAJdW5zaWduZWQgaW50IGVuciA9IEJNX1NFQ1RfVE9fRVhUKHNlY3Rvcik7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmU7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOwotCWUgPSBsY19maW5kKG1kZXYtPnJlc3luYywgZW5yKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CisJZSA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCWlmICghYm1fZXh0KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJkcmJkX3JzX2NvbXBsZXRlX2lvKCkgY2FsbGVkLCBidXQgZXh0ZW50IG5vdCBmb3VuZFxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3JzX2NvbXBsZXRlX2lvKCkgY2FsbGVkLCBidXQgZXh0ZW50IG5vdCBmb3VuZFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoYm1fZXh0LT5sY2UucmVmY250ID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOwotCQlkZXZfZXJyKERFViwgImRyYmRfcnNfY29tcGxldGVfaW8oLCVsbHUgWz0ldV0pIGNhbGxlZCwgIgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmFsX2xvY2ssIGZsYWdzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZHJiZF9yc19jb21wbGV0ZV9pbygsJWxsdSBbPSV1XSkgY2FsbGVkLCAiCiAJCSAgICAiYnV0IHJlZmNudCBpcyAwIT9cbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgZW5yKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChsY19wdXQobWRldi0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApIHsKKwlpZiAobGNfcHV0KGRldmljZS0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApIHsKIAkJYm1fZXh0LT5mbGFncyA9IDA7IC8qIGNsZWFyIEJNRV9MT0NLRUQsIEJNRV9OT19XUklURVMgYW5kIEJNRV9QUklPUklUWSAqLwotCQltZGV2LT5yZXN5bmNfbG9ja2VkLS07Ci0JCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCQlkZXZpY2UtPnJlc3luY19sb2NrZWQtLTsKKwkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgogICogZHJiZF9yc19jYW5jZWxfYWxsKCkgLSBSZW1vdmVzIGFsbCBleHRlbnRzIGZyb20gdGhlIHJlc3luYyBMUlUgKGV2ZW4gQk1FX0xPQ0tFRCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi12b2lkIGRyYmRfcnNfY2FuY2VsX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX3JzX2NhbmNlbF9hbGwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsgLyogTWFrZXMgc3VyZSAtPnJlc3luYyBpcyB0aGVyZS4gKi8KLQkJbGNfcmVzZXQobWRldi0+cmVzeW5jKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7IC8qIE1ha2VzIHN1cmUgLT5yZXN5bmMgaXMgdGhlcmUuICovCisJCWxjX3Jlc2V0KGRldmljZS0+cmVzeW5jKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9Ci0JbWRldi0+cmVzeW5jX2xvY2tlZCA9IDA7Ci0JbWRldi0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJZGV2aWNlLT5yZXN5bmNfbG9ja2VkID0gMDsKKwlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAogLyoqCiAgKiBkcmJkX3JzX2RlbF9hbGwoKSAtIEdyYWNlZnVsbHkgcmVtb3ZlIGFsbCBleHRlbnRzIGZyb20gdGhlIHJlc3luYyBMUlUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZSBjb3VudCB3YXMKICAqIG5vdCB6ZXJvLgogICovCi1pbnQgZHJiZF9yc19kZWxfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9yc19kZWxfYWxsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBsY19lbGVtZW50ICplOwogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9GQUlMRUQpKSB7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CiAJCS8qIG9rLCAtPnJlc3luYyBpcyB0aGVyZS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IG1kZXYtPnJlc3luYy0+bnJfZWxlbWVudHM7IGkrKykgewotCQkJZSA9IGxjX2VsZW1lbnRfYnlfaW5kZXgobWRldi0+cmVzeW5jLCBpKTsKKwkJZm9yIChpID0gMDsgaSA8IGRldmljZS0+cmVzeW5jLT5ucl9lbGVtZW50czsgaSsrKSB7CisJCQllID0gbGNfZWxlbWVudF9ieV9pbmRleChkZXZpY2UtPnJlc3luYywgaSk7CiAJCQlibV9leHQgPSBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpOwogCQkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciA9PSBMQ19GUkVFKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciA9PSBtZGV2LT5yZXN5bmNfd2VucikgewotCQkJCWRldl9pbmZvKERFViwgImRyb3BwaW5nICV1IGluIGRyYmRfcnNfZGVsX2FsbCwgYXBwYXJlbnRseSIKKwkJCWlmIChibV9leHQtPmxjZS5sY19udW1iZXIgPT0gZGV2aWNlLT5yZXN5bmNfd2VucikgeworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJkcm9wcGluZyAldSBpbiBkcmJkX3JzX2RlbF9hbGwsIGFwcGFyZW50bHkiCiAJCQkJICAgICAiIGdvdCAnc3luY2VkJyBieSBhcHBsaWNhdGlvbiBpb1xuIiwKLQkJCQkgICAgIG1kZXYtPnJlc3luY193ZW5yKTsKLQkJCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCQlEX0FTU0VSVCh0ZXN0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpOworCQkJCSAgICAgZGV2aWNlLT5yZXN5bmNfd2Vucik7CisJCQkJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKKwkJCQlEX0FTU0VSVChkZXZpY2UsIHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSk7CiAJCQkJY2xlYXJfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKTsKLQkJCQltZGV2LT5yZXN5bmNfd2VuciA9IExDX0ZSRUU7Ci0JCQkJbGNfcHV0KG1kZXYtPnJlc3luYywgJmJtX2V4dC0+bGNlKTsKKwkJCQlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwkJCQlsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSk7CiAJCQl9CiAJCQlpZiAoYm1fZXh0LT5sY2UucmVmY250ICE9IDApIHsKLQkJCQlkZXZfaW5mbyhERVYsICJSZXRyeWluZyBkcmJkX3JzX2RlbF9hbGwoKSBsYXRlci4gIgorCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXRyeWluZyBkcmJkX3JzX2RlbF9hbGwoKSBsYXRlci4gIgogCQkJCSAgICAgInJlZmNudD0lZFxuIiwgYm1fZXh0LT5sY2UucmVmY250KTsKLQkJCQlwdXRfbGRldihtZGV2KTsKLQkJCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJCXB1dF9sZGV2KGRldmljZSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCQkJCXJldHVybiAtRUFHQUlOOwogCQkJfQotCQkJRF9BU1NFUlQoIXRlc3RfYml0KEJNRV9MT0NLRUQsICZibV9leHQtPmZsYWdzKSk7Ci0JCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCWxjX2RlbChtZGV2LT5yZXN5bmMsICZibV9leHQtPmxjZSk7CisJCQlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpOworCQkJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKTsKKwkJCWxjX2RlbChkZXZpY2UtPnJlc3luYywgJmJtX2V4dC0+bGNlKTsKIAkJfQotCQlEX0FTU0VSVChtZGV2LT5yZXN5bmMtPnVzZWQgPT0gMCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+cmVzeW5jLT51c2VkID09IDApOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogZHJiZF9yc19mYWlsZWRfaW8oKSAtIFJlY29yZCBpbmZvcm1hdGlvbiBvbiBhIGZhaWx1cmUgdG8gcmVzeW5jIHRoZSBzcGVjaWZpZWQgYmxvY2tzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICogQHNpemU6CVNpemUgb2YgZmFpbGVkIElPIG9wZXJhdGlvbiwgaW4gYnl0ZS4KICAqLwotdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQordm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAkvKiBJcyBjYWxsZWQgZnJvbSB3b3JrZXIgYW5kIHJlY2VpdmVyIGNvbnRleHQgX29ubHlfICovCiAJdW5zaWduZWQgbG9uZyBzYm5yLCBlYm5yLCBsYm5yOwpAQCAtMTI4NCwxMSArMTI4OSwxMSBAQAogCWludCB3YWtlX3VwID0gMDsKIAogCWlmIChzaXplIDw9IDAgfHwgIUlTX0FMSUdORUQoc2l6ZSwgNTEyKSB8fCBzaXplID4gRFJCRF9NQVhfQklPX1NJWkUpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3JzX2ZhaWxlZF9pbzogc2VjdG9yPSVsbHVzIHNpemU9JWQgbm9uc2Vuc2UhXG4iLAorCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3JzX2ZhaWxlZF9pbzogc2VjdG9yPSVsbHVzIHNpemU9JWQgbm9uc2Vuc2UhXG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuOwogCX0KLQlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KTsKKwlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCWVzZWN0b3IgPSBzZWN0b3IgKyAoc2l6ZSA+PiA5KSAtIDE7CiAKIAlpZiAoIWV4cGVjdChzZWN0b3IgPCBucl9zZWN0b3JzKSkKQEAgLTEzMTYsMjEgKzEzMjEsMjEgQEAKIAkgKiBvaywgKGNhcGFjaXR5ICYgNykgIT0gMCBzb21ldGltZXMsIGJ1dCB3aG8gY2FyZXMuLi4KIAkgKiB3ZSBjb3VudCByc197dG90YWwsbGVmdH0gaW4gYml0cywgbm90IHNlY3RvcnMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JY291bnQgPSBkcmJkX2JtX2NvdW50X2JpdHMobWRldiwgc2JuciwgZWJucik7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwljb3VudCA9IGRyYmRfYm1fY291bnRfYml0cyhkZXZpY2UsIHNibnIsIGVibnIpOwogCWlmIChjb3VudCkgewotCQltZGV2LT5yc19mYWlsZWQgKz0gY291bnQ7CisJCWRldmljZS0+cnNfZmFpbGVkICs9IGNvdW50OwogCi0JCWlmIChnZXRfbGRldihtZGV2KSkgewotCQkJZHJiZF90cnlfY2xlYXJfb25fZGlza19ibShtZGV2LCBzZWN0b3IsIGNvdW50LCBmYWxzZSk7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWRyYmRfdHJ5X2NsZWFyX29uX2Rpc2tfYm0oZGV2aWNlLCBzZWN0b3IsIGNvdW50LCBmYWxzZSk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQl9CiAKIAkJLyoganVzdCB3YWtlX3VwIHVuY29uZGl0aW9uYWwgbm93LCB2YXJpb3VzIGxjX2NoYWdlZCgpLAogCQkgKiBsY19wdXQoKSBpbiBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKCkuICovCiAJCXdha2VfdXAgPSAxOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAod2FrZV91cCkKLQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9iaXRtYXAuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCmluZGV4IDU5N2YxMTEuLjFhYTI5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCkBAIC0xMTMsNTQgKzExMyw1NCBAQAogfTsKIAogI2RlZmluZSBibV9wcmludF9sb2NrX2luZm8obSkgX19ibV9wcmludF9sb2NrX2luZm8obSwgX19mdW5jX18pCi1zdGF0aWMgdm9pZCBfX2JtX3ByaW50X2xvY2tfaW5mbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCBjaGFyICpmdW5jKQorc3RhdGljIHZvaWQgX19ibV9wcmludF9sb2NrX2luZm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmZ1bmMpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWlmICghX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKIAkJcmV0dXJuOwotCWRldl9lcnIoREVWLCAiRklYTUUgJXMgaW4gJXMsIGJpdG1hcCBsb2NrZWQgZm9yICclcycgYnkgJXNcbiIsCi0JCWRyYmRfdGFza190b190aHJlYWRfbmFtZShtZGV2LT50Y29ubiwgY3VycmVudCksCi0JCWZ1bmMsIGItPmJtX3doeSA/OiAiPyIsCi0JCWRyYmRfdGFza190b190aHJlYWRfbmFtZShtZGV2LT50Y29ubiwgYi0+Ym1fdGFzaykpOworCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FICVzWyVkXSBpbiAlcywgYml0bWFwIGxvY2tlZCBmb3IgJyVzJyBieSAlc1slZF1cbiIsCisJCSBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwKKwkJIGZ1bmMsIGItPmJtX3doeSA/OiAiPyIsCisJCSBiLT5ibV90YXNrLT5jb21tLCB0YXNrX3BpZF9ucihiLT5ibV90YXNrKSk7CiB9CiAKLXZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKQordm9pZCBkcmJkX2JtX2xvY2soc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAlpbnQgdHJ5bG9ja19mYWlsZWQ7CiAKIAlpZiAoIWIpIHsKLQkJZGV2X2VycihERVYsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV9sb2NrIT9cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV9sb2NrIT9cbiIpOwogCQlyZXR1cm47CiAJfQogCiAJdHJ5bG9ja19mYWlsZWQgPSAhbXV0ZXhfdHJ5bG9jaygmYi0+Ym1fY2hhbmdlKTsKIAogCWlmICh0cnlsb2NrX2ZhaWxlZCkgewotCQlkZXZfd2FybihERVYsICIlcyBnb2luZyB0byAnJXMnIGJ1dCBiaXRtYXAgYWxyZWFkeSBsb2NrZWQgZm9yICclcycgYnkgJXNcbiIsCi0JCQkgZHJiZF90YXNrX3RvX3RocmVhZF9uYW1lKG1kZXYtPnRjb25uLCBjdXJyZW50KSwKLQkJCSB3aHksIGItPmJtX3doeSA/OiAiPyIsCi0JCQkgZHJiZF90YXNrX3RvX3RocmVhZF9uYW1lKG1kZXYtPnRjb25uLCBiLT5ibV90YXNrKSk7CisJCWRyYmRfd2FybihkZXZpY2UsICIlc1slZF0gZ29pbmcgdG8gJyVzJyBidXQgYml0bWFwIGFscmVhZHkgbG9ja2VkIGZvciAnJXMnIGJ5ICVzWyVkXVxuIiwKKwkJCSAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksCisJCQkgIHdoeSwgYi0+Ym1fd2h5ID86ICI/IiwKKwkJCSAgYi0+Ym1fdGFzay0+Y29tbSwgdGFza19waWRfbnIoYi0+Ym1fdGFzaykpOwogCQltdXRleF9sb2NrKCZiLT5ibV9jaGFuZ2UpOwogCX0KIAlpZiAoQk1fTE9DS0VEX01BU0sgJiBiLT5ibV9mbGFncykKLQkJZGV2X2VycihERVYsICJGSVhNRSBiaXRtYXAgYWxyZWFkeSBsb2NrZWQgaW4gYm1fbG9ja1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FIGJpdG1hcCBhbHJlYWR5IGxvY2tlZCBpbiBibV9sb2NrXG4iKTsKIAliLT5ibV9mbGFncyB8PSBmbGFncyAmIEJNX0xPQ0tFRF9NQVNLOwogCiAJYi0+Ym1fd2h5ICA9IHdoeTsKIAliLT5ibV90YXNrID0gY3VycmVudDsKIH0KIAotdm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFiKSB7Ci0JCWRldl9lcnIoREVWLCAiRklYTUUgbm8gYml0bWFwIGluIGRyYmRfYm1fdW5sb2NrIT9cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV91bmxvY2shP1xuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIShCTV9MT0NLRURfTUFTSyAmIG1kZXYtPmJpdG1hcC0+Ym1fZmxhZ3MpKQotCQlkZXZfZXJyKERFViwgIkZJWE1FIGJpdG1hcCBub3QgbG9ja2VkIGluIGJtX3VubG9ja1xuIik7CisJaWYgKCEoQk1fTE9DS0VEX01BU0sgJiBkZXZpY2UtPmJpdG1hcC0+Ym1fZmxhZ3MpKQorCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBiaXRtYXAgbm90IGxvY2tlZCBpbiBibV91bmxvY2tcbiIpOwogCiAJYi0+Ym1fZmxhZ3MgJj0gfkJNX0xPQ0tFRF9NQVNLOwogCWItPmJtX3doeSAgPSBOVUxMOwpAQCAtMjExLDE5ICsyMTEsMTkgQEAKIC8qIEFzIGlzIHZlcnkgdW5saWtlbHkgdGhhdCB0aGUgc2FtZSBwYWdlIGlzIHVuZGVyIElPIGZyb20gbW9yZSB0aGFuIG9uZQogICogY29udGV4dCwgd2UgY2FuIGdldCBhd2F5IHdpdGggYSBiaXQgcGVyIHBhZ2UgYW5kIG9uZSB3YWl0IHF1ZXVlIHBlciBiaXRtYXAuCiAgKi8KLXN0YXRpYyB2b2lkIGJtX3BhZ2VfbG9ja19pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcGFnZV9ucikKK3N0YXRpYyB2b2lkIGJtX3BhZ2VfbG9ja19pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHBhZ2VfbnIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXZvaWQgKmFkZHIgPSAmcGFnZV9wcml2YXRlKGItPmJtX3BhZ2VzW3BhZ2VfbnJdKTsKIAl3YWl0X2V2ZW50KGItPmJtX2lvX3dhaXQsICF0ZXN0X2FuZF9zZXRfYml0KEJNX1BBR0VfSU9fTE9DSywgYWRkcikpOwogfQogCi1zdGF0aWMgdm9pZCBibV9wYWdlX3VubG9ja19pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcGFnZV9ucikKK3N0YXRpYyB2b2lkIGJtX3BhZ2VfdW5sb2NrX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcGFnZV9ucikKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdm9pZCAqYWRkciA9ICZwYWdlX3ByaXZhdGUoYi0+Ym1fcGFnZXNbcGFnZV9ucl0pOwogCWNsZWFyX2JpdF91bmxvY2soQk1fUEFHRV9JT19MT0NLLCBhZGRyKTsKLQl3YWtlX3VwKCZtZGV2LT5iaXRtYXAtPmJtX2lvX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+Yml0bWFwLT5ibV9pb193YWl0KTsKIH0KIAogLyogc2V0IF9iZWZvcmVfIHN1Ym1pdF9pbywgc28gaXQgbWF5IGJlIHJlc2V0IGR1ZSB0byBiZWluZyBjaGFuZ2VkCkBAIC0yNDIsMjIgKzI0MiwyMiBAQAogCiAvKioKICAqIGRyYmRfYm1fbWFya19mb3Jfd3JpdGVvdXQoKSAtIG1hcmsgYSBwYWdlIHdpdGggYSAiaGludCIgdG8gYmUgY29uc2lkZXJlZCBmb3Igd3JpdGVvdXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHBhZ2VfbnI6CXRoZSBiaXRtYXAgcGFnZSB0byBtYXJrIHdpdGggdGhlICJoaW50IiBmbGFnCiAgKgogICogRnJvbSB3aXRoaW4gYW4gYWN0aXZpdHkgbG9nIHRyYW5zYWN0aW9uLCB3ZSBtYXJrIGEgZmV3IHBhZ2VzIHdpdGggdGhlc2UKICAqIGhpbnRzLCB0aGVuIGNhbGwgZHJiZF9ibV93cml0ZV9oaW50ZWQoKSwgd2hpY2ggd2lsbCBvbmx5IHdyaXRlIG91dCBjaGFuZ2VkCiAgKiBwYWdlcyB3aGljaCBhcmUgZmxhZ2dlZCB3aXRoIHRoaXMgbWFyay4KICAqLwotdm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBwYWdlX25yKQordm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcGFnZV9ucikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpZiAocGFnZV9uciA+PSBtZGV2LT5iaXRtYXAtPmJtX251bWJlcl9vZl9wYWdlcykgewotCQlkZXZfd2FybihERVYsICJCQUQ6IHBhZ2VfbnI6ICV1LCBudW1iZXJfb2ZfcGFnZXM6ICV1XG4iLAotCQkJIHBhZ2VfbnIsIChpbnQpbWRldi0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpOworCWlmIChwYWdlX25yID49IGRldmljZS0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIkJBRDogcGFnZV9ucjogJXUsIG51bWJlcl9vZl9wYWdlczogJXVcbiIsCisJCQkgcGFnZV9uciwgKGludClkZXZpY2UtPmJpdG1hcC0+Ym1fbnVtYmVyX29mX3BhZ2VzKTsKIAkJcmV0dXJuOwogCX0KLQlwYWdlID0gbWRldi0+Yml0bWFwLT5ibV9wYWdlc1twYWdlX25yXTsKKwlwYWdlID0gZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzW3BhZ2VfbnJdOwogCXNldF9iaXQoQk1fUEFHRV9ISU5UX1dSSVRFT1VULCAmcGFnZV9wcml2YXRlKHBhZ2UpKTsKIH0KIApAQCAtMzQwLDcgKzM0MCw3IEBACiAKIC8qCiAgKiBhY3R1YWxseSBtb3N0IGZ1bmN0aW9ucyBoZXJlaW4gc2hvdWxkIHRha2UgYSBzdHJ1Y3QgZHJiZF9iaXRtYXAqLCBub3QgYQotICogc3RydWN0IGRyYmRfY29uZiosIGJ1dCBmb3IgdGhlIGRlYnVnIG1hY3JvcyBJIGxpa2UgdG8gaGF2ZSB0aGUgbWRldiBhcm91bmQKKyAqIHN0cnVjdCBkcmJkX2RldmljZSosIGJ1dCBmb3IgdGhlIGRlYnVnIG1hY3JvcyBJIGxpa2UgdG8gaGF2ZSB0aGUgZGV2aWNlIGFyb3VuZAogICogdG8gYmUgYWJsZSB0byByZXBvcnQgZGV2aWNlIHNwZWNpZmljLgogICovCiAKQEAgLTQzNiwxMSArNDM2LDExIEBACiAKIC8qCiAgKiBjYWxsZWQgb24gZHJpdmVyIGluaXQgb25seS4gVE9ETyBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgY3JlYXRlZC4KLSAqIGFsbG9jYXRlcyB0aGUgZHJiZF9iaXRtYXAsIGFuZCBzdG9yZXMgaXQgaW4gbWRldi0+Yml0bWFwLgorICogYWxsb2NhdGVzIHRoZSBkcmJkX2JpdG1hcCwgYW5kIHN0b3JlcyBpdCBpbiBkZXZpY2UtPmJpdG1hcC4KICAqLwotaW50IGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJV0FSTl9PTihiICE9IE5VTEwpOwogCWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9iaXRtYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWIpCkBAIC00NDksMjggKzQ0OSwyOCBAQAogCW11dGV4X2luaXQoJmItPmJtX2NoYW5nZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYi0+Ym1faW9fd2FpdCk7CiAKLQltZGV2LT5iaXRtYXAgPSBiOworCWRldmljZS0+Yml0bWFwID0gYjsKIAogCXJldHVybiAwOwogfQogCi1zZWN0b3JfdCBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzZWN0b3JfdCBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmICghZXhwZWN0KG1kZXYtPmJpdG1hcCkpCisJaWYgKCFleHBlY3QoZGV2aWNlLT5iaXRtYXApKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gbWRldi0+Yml0bWFwLT5ibV9kZXZfY2FwYWNpdHk7CisJcmV0dXJuIGRldmljZS0+Yml0bWFwLT5ibV9kZXZfY2FwYWNpdHk7CiB9CiAKIC8qIGNhbGxlZCBvbiBkcml2ZXIgdW5sb2FkLiBUT0RPOiBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZGVzdHJveWVkLgogICovCi12b2lkIGRyYmRfYm1fY2xlYW51cChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX2NsZWFudXAoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKCFleHBlY3QobWRldi0+Yml0bWFwKSkKKwlpZiAoIWV4cGVjdChkZXZpY2UtPmJpdG1hcCkpCiAJCXJldHVybjsKLQlibV9mcmVlX3BhZ2VzKG1kZXYtPmJpdG1hcC0+Ym1fcGFnZXMsIG1kZXYtPmJpdG1hcC0+Ym1fbnVtYmVyX29mX3BhZ2VzKTsKLQlibV92a19mcmVlKG1kZXYtPmJpdG1hcC0+Ym1fcGFnZXMsIChCTV9QX1ZNQUxMT0NFRCAmIG1kZXYtPmJpdG1hcC0+Ym1fZmxhZ3MpKTsKLQlrZnJlZShtZGV2LT5iaXRtYXApOwotCW1kZXYtPmJpdG1hcCA9IE5VTEw7CisJYm1fZnJlZV9wYWdlcyhkZXZpY2UtPmJpdG1hcC0+Ym1fcGFnZXMsIGRldmljZS0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpOworCWJtX3ZrX2ZyZWUoZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzLCAoQk1fUF9WTUFMTE9DRUQgJiBkZXZpY2UtPmJpdG1hcC0+Ym1fZmxhZ3MpKTsKKwlrZnJlZShkZXZpY2UtPmJpdG1hcCk7CisJZGV2aWNlLT5iaXRtYXAgPSBOVUxMOwogfQogCiAvKgpAQCAtNjMxLDkgKzYzMSw5IEBACiAgKiBJbiBjYXNlIHRoaXMgaXMgYWN0dWFsbHkgYSByZXNpemUsIHdlIGNvcHkgdGhlIG9sZCBiaXRtYXAgaW50byB0aGUgbmV3IG9uZS4KICAqIE90aGVyd2lzZSwgdGhlIGJpdG1hcCBpcyBpbml0aWFsaXplZCB0byBhbGwgYml0cyBzZXQuCiAgKi8KLWludCBkcmJkX2JtX3Jlc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IHNldF9uZXdfYml0cykKK2ludCBkcmJkX2JtX3Jlc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3QgY2FwYWNpdHksIGludCBzZXRfbmV3X2JpdHMpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgYml0cywgd29yZHMsIG93b3Jkcywgb2JpdHM7CiAJdW5zaWduZWQgbG9uZyB3YW50LCBoYXZlLCBvbnBhZ2VzOyAvKiBudW1iZXIgb2YgcGFnZXMgKi8KIAlzdHJ1Y3QgcGFnZSAqKm5wYWdlcywgKipvcGFnZXMgPSBOVUxMOwpAQCAtNjQzLDkgKzY0Myw5IEBACiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZHJiZF9ibV9sb2NrKG1kZXYsICJyZXNpemUiLCBCTV9MT0NLRURfTUFTSyk7CisJZHJiZF9ibV9sb2NrKGRldmljZSwgInJlc2l6ZSIsIEJNX0xPQ0tFRF9NQVNLKTsKIAotCWRldl9pbmZvKERFViwgImRyYmRfYm1fcmVzaXplIGNhbGxlZCB3aXRoIGNhcGFjaXR5ID09ICVsbHVcbiIsCisJZHJiZF9pbmZvKGRldmljZSwgImRyYmRfYm1fcmVzaXplIGNhbGxlZCB3aXRoIGNhcGFjaXR5ID09ICVsbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5KTsKIAogCWlmIChjYXBhY2l0eSA9PSBiLT5ibV9kZXZfY2FwYWNpdHkpCkBAIC02NzgsMTIgKzY3OCwxMiBAQAogCSovCiAJd29yZHMgPSBBTElHTihiaXRzLCA2NCkgPj4gTE4yX0JQTDsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQl1NjQgYml0c19vbl9kaXNrID0gZHJiZF9tZF9vbl9kaXNrX2JpdHMobWRldi0+bGRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCXU2NCBiaXRzX29uX2Rpc2sgPSBkcmJkX21kX29uX2Rpc2tfYml0cyhkZXZpY2UtPmxkZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlpZiAoYml0cyA+IGJpdHNfb25fZGlzaykgewotCQkJZGV2X2luZm8oREVWLCAiYml0cyA9ICVsdVxuIiwgYml0cyk7Ci0JCQlkZXZfaW5mbyhERVYsICJiaXRzX29uX2Rpc2sgPSAlbGx1XG4iLCBiaXRzX29uX2Rpc2spOworCQkJZHJiZF9pbmZvKGRldmljZSwgImJpdHMgPSAlbHVcbiIsIGJpdHMpOworCQkJZHJiZF9pbmZvKGRldmljZSwgImJpdHNfb25fZGlzayA9ICVsbHVcbiIsIGJpdHNfb25fZGlzayk7CiAJCQllcnIgPSAtRU5PU1BDOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTY5MiwxMCArNjkyLDEwIEBACiAJd2FudCA9IEFMSUdOKHdvcmRzKnNpemVvZihsb25nKSwgUEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOwogCWhhdmUgPSBiLT5ibV9udW1iZXJfb2ZfcGFnZXM7CiAJaWYgKHdhbnQgPT0gaGF2ZSkgewotCQlEX0FTU0VSVChiLT5ibV9wYWdlcyAhPSBOVUxMKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBiLT5ibV9wYWdlcyAhPSBOVUxMKTsKIAkJbnBhZ2VzID0gYi0+Ym1fcGFnZXM7CiAJfSBlbHNlIHsKLQkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KG1kZXYsIERSQkRfRkFVTFRfQk1fQUxMT0MpKQorCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLCBEUkJEX0ZBVUxUX0JNX0FMTE9DKSkKIAkJCW5wYWdlcyA9IE5VTEw7CiAJCWVsc2UKIAkJCW5wYWdlcyA9IGJtX3JlYWxsb2NfcGFnZXMoYiwgd2FudCk7CkBAIC03NDIsMTAgKzc0MiwxMCBAQAogCQlibV92a19mcmVlKG9wYWdlcywgb3BhZ2VzX3ZtYWxsb2NlZCk7CiAJaWYgKCFncm93aW5nKQogCQliLT5ibV9zZXQgPSBibV9jb3VudF9iaXRzKGIpOwotCWRldl9pbmZvKERFViwgInJlc3luYyBiaXRtYXA6IGJpdHM9JWx1IHdvcmRzPSVsdSBwYWdlcz0lbHVcbiIsIGJpdHMsIHdvcmRzLCB3YW50KTsKKwlkcmJkX2luZm8oZGV2aWNlLCAicmVzeW5jIGJpdG1hcDogYml0cz0lbHUgd29yZHM9JWx1IHBhZ2VzPSVsdVxuIiwgYml0cywgd29yZHMsIHdhbnQpOwogCiAgb3V0OgotCWRyYmRfYm1fdW5sb2NrKG1kZXYpOworCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzU3LDkgKzc1Nyw5IEBACiAgKgogICogbWF5YmUgYm1fc2V0IHNob3VsZCBiZSBhdG9taWNfdCA/CiAgKi8KLXVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit1bnNpZ25lZCBsb25nIF9kcmJkX2JtX3RvdGFsX3dlaWdodChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTc3NSwyMCArNzc1LDIwIEBACiAJcmV0dXJuIHM7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZHJiZF9ibV90b3RhbF93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3Vuc2lnbmVkIGxvbmcgZHJiZF9ibV90b3RhbF93ZWlnaHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBzOwogCS8qIGlmIEkgZG9uJ3QgaGF2ZSBhIGRpc2ssIEkgZG9uJ3Qga25vdyBhYm91dCBvdXQtb2Ytc3luYyBzdGF0dXMgKi8KLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkKIAkJcmV0dXJuIDA7Ci0JcyA9IF9kcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KTsKLQlwdXRfbGRldihtZGV2KTsKKwlzID0gX2RyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSk7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gczsKIH0KIAotc2l6ZV90IGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3NpemVfdCBkcmJkX2JtX3dvcmRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAlpZiAoIWV4cGVjdChiKSkKIAkJcmV0dXJuIDA7CiAJaWYgKCFleHBlY3QoYi0+Ym1fcGFnZXMpKQpAQCAtNzk3LDkgKzc5Nyw5IEBACiAJcmV0dXJuIGItPmJtX3dvcmRzOwogfQogCi11bnNpZ25lZCBsb25nIGRyYmRfYm1fYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordW5zaWduZWQgbG9uZyBkcmJkX2JtX2JpdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWlmICghZXhwZWN0KGIpKQogCQlyZXR1cm4gMDsKIApAQCAtODExLDEwICs4MTEsMTAgQEAKICAqIGJpdG1hcCBtdXN0IGJlIGxvY2tlZCBieSBkcmJkX2JtX2xvY2suCiAgKiBjdXJyZW50bHkgb25seSB1c2VkIGZyb20gcmVjZWl2ZV9iaXRtYXAuCiAgKi8KLXZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG51bWJlciwKK3ZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBudW1iZXIsCiAJCQl1bnNpZ25lZCBsb25nICpidWZmZXIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciwgKmJtOwogCXVuc2lnbmVkIGxvbmcgd29yZCwgYml0czsKIAl1bnNpZ25lZCBpbnQgaWR4OwpAQCAtODYwLDEwICs4NjAsMTAgQEAKIC8qIGNvcHkgbnVtYmVyIHdvcmRzIGZyb20gdGhlIGJpdG1hcCBzdGFydGluZyBhdCBvZmZzZXQgaW50byB0aGUgYnVmZmVyLgogICogYnVmZmVyW2ldIHdpbGwgYmUgbGl0dGxlIGVuZGlhbiB1bnNpZ25lZCBsb25nLgogICovCi12b2lkIGRyYmRfYm1fZ2V0X2xlbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbnVtYmVyLAordm9pZCBkcmJkX2JtX2dldF9sZWwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBudW1iZXIsCiAJCSAgICAgdW5zaWduZWQgbG9uZyAqYnVmZmVyKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHIsICpibTsKIAlzaXplX3QgZW5kLCBkb19ub3c7CiAKQEAgLTg3OCw3ICs4NzgsNyBAQAogCWlmICgob2Zmc2V0ID49IGItPmJtX3dvcmRzKSB8fAogCSAgICAoZW5kICAgID4gIGItPmJtX3dvcmRzKSB8fAogCSAgICAobnVtYmVyIDw9IDApKQotCQlkZXZfZXJyKERFViwgIm9mZnNldD0lbHUgbnVtYmVyPSVsdSBibV93b3Jkcz0lbHVcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIm9mZnNldD0lbHUgbnVtYmVyPSVsdSBibV93b3Jkcz0lbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZykJb2Zmc2V0LAogCQkJKHVuc2lnbmVkIGxvbmcpCW51bWJlciwKIAkJCSh1bnNpZ25lZCBsb25nKSBiLT5ibV93b3Jkcyk7CkBAIC04OTcsOSArODk3LDkgQEAKIH0KIAogLyogc2V0IGFsbCBiaXRzIGluIHRoZSBiaXRtYXAgKi8KLXZvaWQgZHJiZF9ibV9zZXRfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfYm1fc2V0X2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybjsKIAlpZiAoIWV4cGVjdChiLT5ibV9wYWdlcykpCkBAIC05MTMsOSArOTEzLDkgQEAKIH0KIAogLyogY2xlYXIgYWxsIGJpdHMgaW4gdGhlIGJpdG1hcCAqLwotdm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybjsKIAlpZiAoIWV4cGVjdChiLT5ibV9wYWdlcykpCkBAIC05MjgsNyArOTI4LDcgQEAKIH0KIAogc3RydWN0IGJtX2Fpb19jdHggewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJYXRvbWljX3QgaW5fZmxpZ2h0OwogCXVuc2lnbmVkIGludCBkb25lOwogCXVuc2lnbmVkIGZsYWdzOwpAQCAtOTQzLDcgKzk0Myw3IEBACiB7CiAJc3RydWN0IGJtX2Fpb19jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYm1fYWlvX2N0eCwga3JlZik7CiAKLQlwdXRfbGRldihjdHgtPm1kZXYpOworCXB1dF9sZGV2KGN0eC0+ZGV2aWNlKTsKIAlrZnJlZShjdHgpOwogfQogCkBAIC05NTEsOCArOTUxLDggQEAKIHN0YXRpYyB2b2lkIGJtX2FzeW5jX2lvX2NvbXBsZXRlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQogewogCXN0cnVjdCBibV9haW9fY3R4ICpjdHggPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGN0eC0+bWRldjsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBjdHgtPmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBpbnQgaWR4ID0gYm1fcGFnZV90b19pZHgoYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZSk7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCkBAIC05NjYsNyArOTY2LDcgQEAKIAogCWlmICgoY3R4LT5mbGFncyAmIEJNX0FJT19DT1BZX1BBR0VTKSA9PSAwICYmCiAJICAgICFibV90ZXN0X3BhZ2VfdW5jaGFuZ2VkKGItPmJtX3BhZ2VzW2lkeF0pKQotCQlkZXZfd2FybihERVYsICJiaXRtYXAgcGFnZSBpZHggJXUgY2hhbmdlZCBkdXJpbmcgSU8hXG4iLCBpZHgpOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiYml0bWFwIHBhZ2UgaWR4ICV1IGNoYW5nZWQgZHVyaW5nIElPIVxuIiwgaWR4KTsKIAogCWlmIChlcnJvcikgewogCQkvKiBjdHggZXJyb3Igd2lsbCBob2xkIHRoZSBjb21wbGV0ZWQtbGFzdCBub24temVybyBlcnJvciBjb2RlLApAQCAtOTc2LDE0ICs5NzYsMTQgQEAKIAkJLyogTm90IGlkZW50aWNhbCB0byBvbiBkaXNrIHZlcnNpb24gb2YgaXQuCiAJCSAqIElzIEJNX1BBR0VfSU9fRVJST1IgZW5vdWdoPyAqLwogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiSU8gRVJST1IgJWQgb24gYml0bWFwIHBhZ2UgaWR4ICV1XG4iLAorCQkJZHJiZF9lcnIoZGV2aWNlLCAiSU8gRVJST1IgJWQgb24gYml0bWFwIHBhZ2UgaWR4ICV1XG4iLAogCQkJCQllcnJvciwgaWR4KTsKIAl9IGVsc2UgewogCQlibV9jbGVhcl9wYWdlX2lvX2VycihiLT5ibV9wYWdlc1tpZHhdKTsKLQkJZHluYW1pY19kZXZfZGJnKERFViwgImJpdG1hcCBwYWdlIGlkeCAldSBjb21wbGV0ZWRcbiIsIGlkeCk7CisJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAiYml0bWFwIHBhZ2UgaWR4ICV1IGNvbXBsZXRlZFxuIiwgaWR4KTsKIAl9CiAKLQlibV9wYWdlX3VubG9ja19pbyhtZGV2LCBpZHgpOworCWJtX3BhZ2VfdW5sb2NrX2lvKGRldmljZSwgaWR4KTsKIAogCWlmIChjdHgtPmZsYWdzICYgQk1fQUlPX0NPUFlfUEFHRVMpCiAJCW1lbXBvb2xfZnJlZShiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlLCBkcmJkX21kX2lvX3BhZ2VfcG9vbCk7CkBAIC05OTIsNyArOTkyLDcgQEAKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdHgtPmluX2ZsaWdodCkpIHsKIAkJY3R4LT5kb25lID0gMTsKLQkJd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCQlrcmVmX3B1dCgmY3R4LT5rcmVmLCAmYm1fYWlvX2N0eF9kZXN0cm95KTsKIAl9CiB9CkBAIC0xMDAwLDIzICsxMDAwLDIzIEBACiBzdGF0aWMgdm9pZCBibV9wYWdlX2lvX2FzeW5jKHN0cnVjdCBibV9haW9fY3R4ICpjdHgsIGludCBwYWdlX25yLCBpbnQgcncpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19kcmJkKEdGUF9OT0lPKTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gY3R4LT5tZGV2OwotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGN0eC0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGludCBsZW47CiAKIAlzZWN0b3JfdCBvbl9kaXNrX3NlY3RvciA9Ci0JCW1kZXYtPmxkZXYtPm1kLm1kX29mZnNldCArIG1kZXYtPmxkZXYtPm1kLmJtX29mZnNldDsKKwkJZGV2aWNlLT5sZGV2LT5tZC5tZF9vZmZzZXQgKyBkZXZpY2UtPmxkZXYtPm1kLmJtX29mZnNldDsKIAlvbl9kaXNrX3NlY3RvciArPSAoKHNlY3Rvcl90KXBhZ2VfbnIpIDw8IChQQUdFX1NISUZULTkpOwogCiAJLyogdGhpcyBtaWdodCBoYXBwZW4gd2l0aCB2ZXJ5IHNtYWxsCiAJICogZmxleGlibGUgZXh0ZXJuYWwgbWV0YSBkYXRhIGRldmljZSwKIAkgKiBvciB3aXRoIFBBR0VfU0laRSA+IDRrICovCiAJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBQQUdFX1NJWkUsCi0JCShkcmJkX21kX2xhc3Rfc2VjdG9yKG1kZXYtPmxkZXYpIC0gb25fZGlza19zZWN0b3IgKyAxKTw8OSk7CisJCShkcmJkX21kX2xhc3Rfc2VjdG9yKGRldmljZS0+bGRldikgLSBvbl9kaXNrX3NlY3RvciArIDEpPDw5KTsKIAogCS8qIHNlcmlhbGl6ZSBJTyBvbiB0aGlzIHBhZ2UgKi8KLQlibV9wYWdlX2xvY2tfaW8obWRldiwgcGFnZV9ucik7CisJYm1fcGFnZV9sb2NrX2lvKGRldmljZSwgcGFnZV9ucik7CiAJLyogYmVmb3JlIG1lbWNweSBhbmQgc3VibWl0LAogCSAqIHNvIGl0IGNhbiBiZSByZWRpcnRpZWQgYW55IHRpbWUgKi8KIAlibV9zZXRfcGFnZV91bmNoYW5nZWQoYi0+Ym1fcGFnZXNbcGFnZV9ucl0pOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJYm1fc3RvcmVfcGFnZV9pZHgocGFnZSwgcGFnZV9ucik7CiAJfSBlbHNlCiAJCXBhZ2UgPSBiLT5ibV9wYWdlc1twYWdlX25yXTsKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5tZF9iZGV2OworCWJpby0+YmlfYmRldiA9IGRldmljZS0+bGRldi0+bWRfYmRldjsKIAliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gb25fZGlza19zZWN0b3I7CiAJLyogYmlvX2FkZF9wYWdlIG9mIGEgc2luZ2xlIHBhZ2UgdG8gYW4gZW1wdHkgYmlvIHdpbGwgYWx3YXlzIHN1Y2NlZWQsCiAJICogYWNjb3JkaW5nIHRvIGFwaS4gIERvIHdlIHdhbnQgdG8gYXNzZXJ0IHRoYXQ/ICovCkBAIC0xMDM1LDI0ICsxMDM1LDI0IEBACiAJYmlvLT5iaV9wcml2YXRlID0gY3R4OwogCWJpby0+YmlfZW5kX2lvID0gYm1fYXN5bmNfaW9fY29tcGxldGU7CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKSB7CisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKSB7CiAJCWJpby0+YmlfcncgfD0gcnc7CiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogCX0gZWxzZSB7CiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAJCS8qIHRoaXMgc2hvdWxkIG5vdCBjb3VudCBhcyB1c2VyIGFjdGl2aXR5IGFuZCBjYXVzZSB0aGUKIAkJICogcmVzeW5jIHRvIHRocm90dGxlIC0tIHNlZSBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oKS4gKi8KLQkJYXRvbWljX2FkZChsZW4gPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOworCQlhdG9taWNfYWRkKGxlbiA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2V2KTsKIAl9CiB9CiAKIC8qCiAgKiBibV9ydzogcmVhZC93cml0ZSB0aGUgd2hvbGUgYml0bWFwIGZyb20vdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCiAgKi8KLXN0YXRpYyBpbnQgYm1fcncoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHJ3LCB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbGF6eV93cml0ZW91dF91cHBlcl9pZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQorc3RhdGljIGludCBibV9ydyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHJ3LCB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbGF6eV93cml0ZW91dF91cHBlcl9pZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXN0cnVjdCBibV9haW9fY3R4ICpjdHg7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBudW1fcGFnZXMsIGksIGNvdW50ID0gMDsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAljaGFyIHBwYlsxMF07CkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCSpjdHggPSAoc3RydWN0IGJtX2Fpb19jdHgpIHsKLQkJLm1kZXYgPSBtZGV2LAorCQkuZGV2aWNlID0gZGV2aWNlLAogCQkuaW5fZmxpZ2h0ID0gQVRPTUlDX0lOSVQoMSksCiAJCS5kb25lID0gMCwKIAkJLmZsYWdzID0gZmxhZ3MsCkBAIC0xMDgwLDggKzEwODAsOCBAQAogCQkua3JlZiA9IHsgQVRPTUlDX0lOSVQoMikgfSwKIAl9OwogCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsgIC8qIHB1dCBpcyBpbiBibV9haW9fY3R4X2Rlc3Ryb3koKSAqLwotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBibV9ydygpXG4iKTsKKwlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9BVFRBQ0hJTkcpKSB7ICAvKiBwdXQgaXMgaW4gYm1fYWlvX2N0eF9kZXN0cm95KCkgKi8KKwkJZHJiZF9lcnIoZGV2aWNlLCAiQVNTRVJUIEZBSUxFRDogZ2V0X2xkZXZfaWZfc3RhdGUoKSA9PSAxIGluIGJtX3J3KClcbiIpOwogCQlrZnJlZShjdHgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xMTA2LDE0ICsxMTA2LDE0IEBACiAKIAkJCWlmICghKGZsYWdzICYgQk1fV1JJVEVfQUxMX1BBR0VTKSAmJgogCQkJICAgIGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQoYi0+Ym1fcGFnZXNbaV0pKSB7Ci0JCQkJZHluYW1pY19kZXZfZGJnKERFViwgInNraXBwZWQgYm0gd3JpdGUgZm9yIGlkeCAldVxuIiwgaSk7CisJCQkJZHluYW1pY19kcmJkX2RiZyhkZXZpY2UsICJza2lwcGVkIGJtIHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJLyogZHVyaW5nIGxhenkgd3JpdGVvdXQsCiAJCQkgKiBpZ25vcmUgdGhvc2UgcGFnZXMgbm90IG1hcmtlZCBmb3IgbGF6eSB3cml0ZW91dC4gKi8KIAkJCWlmIChsYXp5X3dyaXRlb3V0X3VwcGVyX2lkeCAmJgogCQkJICAgICFibV90ZXN0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tpXSkpIHsKLQkJCQlkeW5hbWljX2Rldl9kYmcoREVWLCAic2tpcHBlZCBibSBsYXp5IHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOworCQkJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAic2tpcHBlZCBibSBsYXp5IHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0xMTMyLDE5ICsxMTMyLDE5IEBACiAJICogImluX2ZsaWdodCByZWFjaGVkIHplcm8sIGFsbCBkb25lIiBldmVudC4KIAkgKi8KIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+aW5fZmxpZ2h0KSkKLQkJd2FpdF91bnRpbF9kb25lX29yX2ZvcmNlX2RldGFjaGVkKG1kZXYsIG1kZXYtPmxkZXYsICZjdHgtPmRvbmUpOworCQl3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYsICZjdHgtPmRvbmUpOwogCWVsc2UKIAkJa3JlZl9wdXQoJmN0eC0+a3JlZiwgJmJtX2Fpb19jdHhfZGVzdHJveSk7CiAKIAkvKiBzdW1tYXJ5IGZvciBnbG9iYWwgYml0bWFwIElPICovCiAJaWYgKGZsYWdzID09IDApCi0JCWRldl9pbmZvKERFViwgImJpdG1hcCAlcyBvZiAldSBwYWdlcyB0b29rICVsdSBqaWZmaWVzXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiYml0bWFwICVzIG9mICV1IHBhZ2VzIHRvb2sgJWx1IGppZmZpZXNcbiIsCiAJCQkgcncgPT0gV1JJVEUgPyAiV1JJVEUiIDogIlJFQUQiLAogCQkJIGNvdW50LCBqaWZmaWVzIC0gbm93KTsKIAogCWlmIChjdHgtPmVycm9yKSB7Ci0JCWRldl9hbGVydChERVYsICJ3ZSBoYWQgYXQgbGVhc3Qgb25lIE1EIElPIEVSUk9SIGR1cmluZyBiaXRtYXAgSU9cbiIpOwotCQlkcmJkX2Noa19pb19lcnJvcihtZGV2LCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOworCQlkcmJkX2FsZXJ0KGRldmljZSwgIndlIGhhZCBhdCBsZWFzdCBvbmUgTUQgSU8gRVJST1IgZHVyaW5nIGJpdG1hcCBJT1xuIik7CisJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJZXJyID0gLUVJTzsgLyogY3R4LT5lcnJvciA/ICovCiAJfQogCkBAIC0xMTUzLDE2ICsxMTUzLDE2IEBACiAKIAlub3cgPSBqaWZmaWVzOwogCWlmIChydyA9PSBXUklURSkgewotCQlkcmJkX21kX2ZsdXNoKG1kZXYpOworCQlkcmJkX21kX2ZsdXNoKGRldmljZSk7CiAJfSBlbHNlIC8qIHJ3ID09IFJFQUQgKi8gewogCQliLT5ibV9zZXQgPSBibV9jb3VudF9iaXRzKGIpOwotCQlkZXZfaW5mbyhERVYsICJyZWNvdW50aW5nIG9mIHNldCBiaXRzIHRvb2sgYWRkaXRpb25hbCAlbHUgamlmZmllc1xuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgInJlY291bnRpbmcgb2Ygc2V0IGJpdHMgdG9vayBhZGRpdGlvbmFsICVsdSBqaWZmaWVzXG4iLAogCQkgICAgIGppZmZpZXMgLSBub3cpOwogCX0KIAlub3cgPSBiLT5ibV9zZXQ7CiAKIAlpZiAoZmxhZ3MgPT0gMCkKLQkJZGV2X2luZm8oREVWLCAiJXMgKCVsdSBiaXRzKSBtYXJrZWQgb3V0LW9mLXN5bmMgYnkgb24gZGlzayBiaXQtbWFwLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIiVzICglbHUgYml0cykgbWFya2VkIG91dC1vZi1zeW5jIGJ5IG9uIGRpc2sgYml0LW1hcC5cbiIsCiAJCSAgICAgcHBzaXplKHBwYiwgbm93IDw8IChCTV9CTE9DS19TSElGVC0xMCkpLCBub3cpOwogCiAJa3JlZl9wdXQoJmN0eC0+a3JlZiwgJmJtX2Fpb19jdHhfZGVzdHJveSk7CkBAIC0xMTcxLDQ4ICsxMTcxLDM4IEBACiAKIC8qKgogICogZHJiZF9ibV9yZWFkKCkgLSBSZWFkIHRoZSB3aG9sZSBiaXRtYXAgZnJvbSBpdHMgb24gZGlzayBsb2NhdGlvbi4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi1pbnQgZHJiZF9ibV9yZWFkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFJFQUQsIDAsIDApOworCXJldHVybiBibV9ydyhkZXZpY2UsIFJFQUQsIDAsIDApOwogfQogCiAvKioKICAqIGRyYmRfYm1fd3JpdGUoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIG9ubHkgd3JpdGUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBJTy4KICAqLwotaW50IGRyYmRfYm1fd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCitpbnQgZHJiZF9ibV93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCAwLCAwKTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgMCwgMCk7CiB9CiAKIC8qKgogICogZHJiZF9ibV93cml0ZV9hbGwoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIHdyaXRlIGFsbCBwYWdlcy4KICAqLwotaW50IGRyYmRfYm1fd3JpdGVfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfYWxsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCkKIHsKLQlyZXR1cm4gYm1fcncobWRldiwgV1JJVEUsIEJNX1dSSVRFX0FMTF9QQUdFUywgMCk7Ci19Ci0KLS8qKgotICogZHJiZF9ibV9sYXp5X3dyaXRlX291dCgpIC0gV3JpdGUgYml0bWFwIHBhZ2VzIDAgdG8gQHVwcGVyX2lkeC0xLCBpZiB0aGV5IGhhdmUgY2hhbmdlZC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KLSAqIEB1cHBlcl9pZHg6CTA6IHdyaXRlIGFsbCBjaGFuZ2VkIHBhZ2VzOyArdmU6IHBhZ2UgaW5kZXggdG8gc3RvcCBzY2FubmluZyBmb3IgY2hhbmdlZCBwYWdlcwotICovCi1pbnQgZHJiZF9ibV93cml0ZV9sYXp5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIHVwcGVyX2lkeCkgX19tdXN0X2hvbGQobG9jYWwpCi17Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCBCTV9BSU9fQ09QWV9QQUdFUywgdXBwZXJfaWR4KTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgQk1fV1JJVEVfQUxMX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIG9ubHkgd3JpdGUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBJTy4KICAqIEluIGNvbnRyYXN0IHRvIGRyYmRfYm1fd3JpdGUoKSwgdGhpcyB3aWxsIGNvcHkgdGhlIGJpdG1hcCBwYWdlcwpAQCAtMTIyMSwyMyArMTIxMSwyMyBAQAogICogdmVyaWZ5IGlzIGFib3J0ZWQgZHVlIHRvIGEgZmFpbGVkIHBlZXIgZGlzaywgd2hpbGUgbG9jYWwgSU8gY29udGludWVzLCBvcgogICogcGVuZGluZyByZXN5bmMgYWNrcyBhcmUgc3RpbGwgYmVpbmcgcHJvY2Vzc2VkLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9jb3B5X3BhZ2VzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfY29weV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCBCTV9BSU9fQ09QWV9QQUdFUywgMCk7CisJcmV0dXJuIGJtX3J3KGRldmljZSwgV1JJVEUsIEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX2hpbnRlZCgpIC0gV3JpdGUgYml0bWFwIHBhZ2VzIHdpdGggImhpbnQiIG1hcmtzLCBpZiB0aGV5IGhhdmUgY2hhbmdlZC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCitpbnQgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewotCXJldHVybiBibV9ydyhtZGV2LCBXUklURSwgQk1fQUlPX1dSSVRFX0hJTlRFRCB8IEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgQk1fQUlPX1dSSVRFX0hJTlRFRCB8IEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX3BhZ2UoKSAtIFdyaXRlcyBhIFBBR0VfU0laRSBhbGlnbmVkIHBpZWNlIG9mIGJpdG1hcAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAaWR4OgliaXRtYXAgcGFnZSBpbmRleAogICoKICAqIFdlIGRvbid0IHdhbnQgdG8gc3BlY2lhbCBjYXNlIG9uIGxvZ2ljYWxfYmxvY2tfc2l6ZSBvZiB0aGUgYmFja2VuZCBkZXZpY2UsCkBAIC0xMjQ3LDEzICsxMjM3LDEzIEBACiAgKiBJbiBjYXNlIHRoaXMgYmVjb21lcyBhbiBpc3N1ZSBvbiBzeXN0ZW1zIHdpdGggbGFyZ2VyIFBBR0VfU0laRSwKICAqIHdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGFnYWluIHRvIHdyaXRlIDRrIGFsaWduZWQgNGsgcGllY2VzLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9wYWdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfcGFnZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGlkeCkgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJc3RydWN0IGJtX2Fpb19jdHggKmN0eDsKIAlpbnQgZXJyOwogCi0JaWYgKGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQobWRldi0+Yml0bWFwLT5ibV9wYWdlc1tpZHhdKSkgewotCQlkeW5hbWljX2Rldl9kYmcoREVWLCAic2tpcHBlZCBibSBwYWdlIHdyaXRlIGZvciBpZHggJXVcbiIsIGlkeCk7CisJaWYgKGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQoZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzW2lkeF0pKSB7CisJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAic2tpcHBlZCBibSBwYWdlIHdyaXRlIGZvciBpZHggJXVcbiIsIGlkeCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTI2Miw3ICsxMjUyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkqY3R4ID0gKHN0cnVjdCBibV9haW9fY3R4KSB7Ci0JCS5tZGV2ID0gbWRldiwKKwkJLmRldmljZSA9IGRldmljZSwKIAkJLmluX2ZsaWdodCA9IEFUT01JQ19JTklUKDEpLAogCQkuZG9uZSA9IDAsCiAJCS5mbGFncyA9IEJNX0FJT19DT1BZX1BBR0VTLApAQCAtMTI3MCwyMSArMTI2MCwyMSBAQAogCQkua3JlZiA9IHsgQVRPTUlDX0lOSVQoMikgfSwKIAl9OwogCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsgIC8qIHB1dCBpcyBpbiBibV9haW9fY3R4X2Rlc3Ryb3koKSAqLwotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBkcmJkX2JtX3dyaXRlX3BhZ2UoKVxuIik7CisJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkgeyAgLyogcHV0IGlzIGluIGJtX2Fpb19jdHhfZGVzdHJveSgpICovCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBkcmJkX2JtX3dyaXRlX3BhZ2UoKVxuIik7CiAJCWtmcmVlKGN0eCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWJtX3BhZ2VfaW9fYXN5bmMoY3R4LCBpZHgsIFdSSVRFX1NZTkMpOwotCXdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChtZGV2LCBtZGV2LT5sZGV2LCAmY3R4LT5kb25lKTsKKwl3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYsICZjdHgtPmRvbmUpOwogCiAJaWYgKGN0eC0+ZXJyb3IpCi0JCWRyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIDEsIERSQkRfTUVUQV9JT19FUlJPUik7CisJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJLyogdGhhdCBjYXVzZXMgdXMgdG8gZGV0YWNoLCBzbyB0aGUgaW4gbWVtb3J5IGJpdG1hcCB3aWxsIGJlCiAJCSAqIGdvbmUgaW4gYSBtb21lbnQgYXMgd2VsbC4gKi8KIAotCW1kZXYtPmJtX3dyaXRfY250Kys7CisJZGV2aWNlLT5ibV93cml0X2NudCsrOwogCWVyciA9IGF0b21pY19yZWFkKCZjdHgtPmluX2ZsaWdodCkgPyAtRUlPIDogY3R4LT5lcnJvcjsKIAlrcmVmX3B1dCgmY3R4LT5rcmVmLCAmYm1fYWlvX2N0eF9kZXN0cm95KTsKIAlyZXR1cm4gZXJyOwpAQCAtMTI5OCwxNyArMTI4OCwxNyBAQAogICoKICAqIHRoaXMgcmV0dXJucyBhIGJpdCBudW1iZXIsIE5PVCBhIHNlY3RvciEKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19ibV9maW5kX25leHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBibV9mbywKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGJtX2ZvLAogCWNvbnN0IGludCBmaW5kX3plcm9fYml0KQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBiaXRfb2Zmc2V0OwogCXVuc2lnbmVkIGk7CiAKIAogCWlmIChibV9mbyA+IGItPmJtX2JpdHMpIHsKLQkJZGV2X2VycihERVYsICJibV9mbz0lbHUgYm1fYml0cz0lbHVcbiIsIGJtX2ZvLCBiLT5ibV9iaXRzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiYm1fZm89JWx1IGJtX2JpdHM9JWx1XG4iLCBibV9mbywgYi0+Ym1fYml0cyk7CiAJCWJtX2ZvID0gRFJCRF9FTkRfT0ZfQklUTUFQOwogCX0gZWxzZSB7CiAJCXdoaWxlIChibV9mbyA8IGItPmJtX2JpdHMpIHsKQEAgLTEzMzgsMTAgKzEzMjgsMTAgQEAKIAlyZXR1cm4gYm1fZm87CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHVuc2lnbmVkIGxvbmcgYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCXVuc2lnbmVkIGxvbmcgYm1fZm8sIGNvbnN0IGludCBmaW5kX3plcm9fYml0KQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIGkgPSBEUkJEX0VORF9PRl9CSVRNQVA7CiAKIAlpZiAoIWV4cGVjdChiKSkKQEAgLTEzNTEsMzkgKzEzNDEsMzkgQEAKIAogCXNwaW5fbG9ja19pcnEoJmItPmJtX2xvY2spOwogCWlmIChCTV9ET05UX1RFU1QgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAotCWkgPSBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgZmluZF96ZXJvX2JpdCk7CisJaSA9IF9fYm1fZmluZF9uZXh0KGRldmljZSwgYm1fZm8sIGZpbmRfemVyb19iaXQpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAlyZXR1cm4gaTsKIH0KIAotdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKQordW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQlyZXR1cm4gYm1fZmluZF9uZXh0KG1kZXYsIGJtX2ZvLCAwKTsKKwlyZXR1cm4gYm1fZmluZF9uZXh0KGRldmljZSwgYm1fZm8sIDApOwogfQogCiAjaWYgMAogLyogbm90IHlldCBuZWVkZWQgZm9yIGFueXRoaW5nLiAqLwotdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dF96ZXJvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCit1bnNpZ25lZCBsb25nIGRyYmRfYm1fZmluZF9uZXh0X3plcm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCiB7Ci0JcmV0dXJuIGJtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMSk7CisJcmV0dXJuIGJtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAxKTsKIH0KICNlbmRpZgogCiAvKiBkb2VzIG5vdCBzcGluX2xvY2tfaXJxc2F2ZS4KICAqIHlvdSBtdXN0IHRha2UgZHJiZF9ibV9sb2NrKCkgZmlyc3QgKi8KLXVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCit1bnNpZ25lZCBsb25nIF9kcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQkvKiBXQVJOX09OKCEoQk1fRE9OVF9TRVQgJiBtZGV2LT5iLT5ibV9mbGFncykpOyAqLwotCXJldHVybiBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMCk7CisJLyogV0FSTl9PTighKEJNX0RPTlRfU0VUICYgZGV2aWNlLT5iLT5ibV9mbGFncykpOyAqLworCXJldHVybiBfX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAwKTsKIH0KIAotdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKQordW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQkvKiBXQVJOX09OKCEoQk1fRE9OVF9TRVQgJiBtZGV2LT5iLT5ibV9mbGFncykpOyAqLwotCXJldHVybiBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMSk7CisJLyogV0FSTl9PTighKEJNX0RPTlRfU0VUICYgZGV2aWNlLT5iLT5ibV9mbGFncykpOyAqLworCXJldHVybiBfX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAxKTsKIH0KIAogLyogcmV0dXJucyBudW1iZXIgb2YgYml0cyBhY3R1YWxseSBjaGFuZ2VkLgpAQCAtMTM5MiwxMCArMTM4MiwxMCBAQAogICogd2FudHMgYml0bnIsIG5vdCBzZWN0b3IuCiAgKiBleHBlY3RlZCB0byBiZSBjYWxsZWQgZm9yIG9ubHkgYSBmZXcgYml0cyAoZSAtIHMgYWJvdXQgQklUU19QRVJfTE9ORykuCiAgKiBNdXN0IGhvbGQgYml0bWFwIGxvY2sgYWxyZWFkeS4gKi8KLXN0YXRpYyBpbnQgX19ibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCitzdGF0aWMgaW50IF9fYm1fY2hhbmdlX2JpdHNfdG8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywKIAl1bnNpZ25lZCBsb25nIGUsIGludCB2YWwpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiaXRucjsKIAl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlX25yID0gLTFVOwpAQCAtMTQwMyw3ICsxMzkzLDcgQEAKIAlpbnQgY2hhbmdlZF90b3RhbCA9IDA7CiAKIAlpZiAoZSA+PSBiLT5ibV9iaXRzKSB7Ci0JCWRldl9lcnIoREVWLCAiQVNTRVJUIEZBSUxFRDogYml0X3M9JWx1IGJpdF9lPSVsdSBibV9iaXRzPSVsdVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQVNTRVJUIEZBSUxFRDogYml0X3M9JWx1IGJpdF9lPSVsdSBibV9iaXRzPSVsdVxuIiwKIAkJCQlzLCBlLCBiLT5ibV9iaXRzKTsKIAkJZSA9IGItPmJtX2JpdHMgPyBiLT5ibV9iaXRzIC0xIDogMDsKIAl9CkBAIC0xNDQxLDExICsxNDMxLDExIEBACiAgKiBmb3IgdmFsICE9IDAsIHdlIGNoYW5nZSAwIC0+IDEsIHJldHVybiBjb2RlIHBvc2l0aXZlCiAgKiBmb3IgdmFsID09IDAsIHdlIGNoYW5nZSAxIC0+IDAsIHJldHVybiBjb2RlIG5lZ2F0aXZlCiAgKiB3YW50cyBiaXRuciwgbm90IHNlY3RvciAqLwotc3RhdGljIGludCBibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCitzdGF0aWMgaW50IGJtX2NoYW5nZV9iaXRzX3RvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCiAJY29uc3QgdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBjID0gMDsKIAogCWlmICghZXhwZWN0KGIpKQpAQCAtMTQ1NSwyNCArMTQ0NSwyNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmItPmJtX2xvY2ssIGZsYWdzKTsKIAlpZiAoKHZhbCA/IEJNX0RPTlRfU0VUIDogQk1fRE9OVF9DTEVBUikgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAotCWMgPSBfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIHZhbCk7CisJYyA9IF9fYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCB2YWwpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCXJldHVybiBjOwogfQogCiAvKiByZXR1cm5zIG51bWJlciBvZiBiaXRzIGNoYW5nZWQgMCAtPiAxICovCi1pbnQgZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKK2ludCBkcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKIHsKLQlyZXR1cm4gYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJcmV0dXJuIGJtX2NoYW5nZV9iaXRzX3RvKGRldmljZSwgcywgZSwgMSk7CiB9CiAKIC8qIHJldHVybnMgbnVtYmVyIG9mIGJpdHMgY2hhbmdlZCAxIC0+IDAgKi8KLWludCBkcmJkX2JtX2NsZWFyX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCitpbnQgZHJiZF9ibV9jbGVhcl9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKIHsKLQlyZXR1cm4gLWJtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIDApOworCXJldHVybiAtYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCAwKTsKIH0KIAogLyogc2V0cyBhbGwgYml0cyBpbiBmdWxsIHdvcmRzLApAQCAtMTUwNCw3ICsxNDk0LDcgQEAKICAqIFlvdSBtdXN0IGZpcnN0IGRyYmRfYm1fbG9jaygpLgogICogQ2FuIGJlIGNhbGxlZCB0byBzZXQgdGhlIHdob2xlIGJpdG1hcCBpbiBvbmUgZ28uCiAgKiBTZXRzIGJpdHMgZnJvbSBzIHRvIGUgX2luY2x1c2l2ZV8uICovCi12b2lkIF9kcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKQordm9pZCBfZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCiB7CiAJLyogRmlyc3Qgc2V0X2JpdCBmcm9tIHRoZSBmaXJzdCBiaXQgKHMpCiAJICogdXAgdG8gdGhlIG5leHQgbG9uZyBib3VuZGFyeSAoc2wpLApAQCAtMTUxNCw3ICsxNTA0LDcgQEAKIAkgKiBEbyBub3QgdXNlIG1lbXNldCwgYmVjYXVzZSB3ZSBtdXN0IGFjY291bnQgZm9yIGNoYW5nZXMsCiAJICogc28gd2UgbmVlZCB0byBsb29wIG92ZXIgdGhlIHdvcmRzIHdpdGggaHdlaWdodCgpIGFueXdheXMuCiAJICovCi0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgc2wgPSBBTElHTihzLEJJVFNfUEVSX0xPTkcpOwogCXVuc2lnbmVkIGxvbmcgZWwgPSAoZSsxKSAmIH4oKHVuc2lnbmVkIGxvbmcpQklUU19QRVJfTE9ORy0xKTsKIAlpbnQgZmlyc3RfcGFnZTsKQEAgLTE1MjYsNyArMTUxNiw3IEBACiAJaWYgKGUgLSBzIDw9IDMqQklUU19QRVJfTE9ORykgewogCQkvKiBkb24ndCBib3RoZXI7IGVsIGFuZCBzbCBtYXkgZXZlbiBiZSB3cm9uZy4gKi8KIAkJc3Bpbl9sb2NrX2lycSgmYi0+Ym1fbG9jayk7Ci0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJCV9fYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCAxKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MzcsNyArMTUyNyw3IEBACiAKIAkvKiBiaXRzIGZpbGxpbmcgdGhlIGN1cnJlbnQgbG9uZyAqLwogCWlmIChzbCkKLQkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBzLCBzbC0xLCAxKTsKKwkJX19ibV9jaGFuZ2VfYml0c190byhkZXZpY2UsIHMsIHNsLTEsIDEpOwogCiAJZmlyc3RfcGFnZSA9IHNsID4+ICgzICsgUEFHRV9TSElGVCk7CiAJbGFzdF9wYWdlID0gZWwgPj4gKDMgKyBQQUdFX1NISUZUKTsKQEAgLTE1NDksNyArMTUzOSw3IEBACiAKIAkvKiBmaXJzdCBhbmQgZnVsbCBwYWdlcywgdW5sZXNzIGZpcnN0IHBhZ2UgPT0gbGFzdCBwYWdlICovCiAJZm9yIChwYWdlX25yID0gZmlyc3RfcGFnZTsgcGFnZV9uciA8IGxhc3RfcGFnZTsgcGFnZV9ucisrKSB7Ci0JCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShtZGV2LT5iaXRtYXAsIHBhZ2VfbnIsIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCk7CisJCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShkZXZpY2UtPmJpdG1hcCwgcGFnZV9uciwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWZpcnN0X3dvcmQgPSAwOwpAQCAtMTU2NSw3ICsxNTU1LDcgQEAKIAkgKiBhcyB3ZSBkaWQgbm90IGFsbG9jYXRlIGl0LCBpdCBpcyBub3QgcHJlc2VudCBpbiBiaXRtYXAtPmJtX3BhZ2VzLgogCSAqLwogCWlmIChsYXN0X3dvcmQpCi0JCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShtZGV2LT5iaXRtYXAsIGxhc3RfcGFnZSwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKKwkJYm1fc2V0X2Z1bGxfd29yZHNfd2l0aGluX29uZV9wYWdlKGRldmljZS0+Yml0bWFwLCBsYXN0X3BhZ2UsIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCk7CiAKIAkvKiBwb3NzaWJseSB0cmFpbGluZyBiaXRzLgogCSAqIGV4YW1wbGU6IChlICYgNjMpID09IDYzLCBlbCB3aWxsIGJlIGUrMS4KQEAgLTE1NzMsNyArMTU2Myw3IEBACiAJICogaXQgd291bGQgdHJpZ2dlciBhbiBhc3NlcnQgaW4gX19ibV9jaGFuZ2VfYml0c190bygpCiAJICovCiAJaWYgKGVsIDw9IGUpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgZWwsIGUsIDEpOworCQlfX2JtX2NoYW5nZV9iaXRzX3RvKGRldmljZSwgZWwsIGUsIDEpOwogCXNwaW5fdW5sb2NrX2lycSgmYi0+Ym1fbG9jayk7CiB9CiAKQEAgLTE1ODQsMTAgKzE1NzQsMTAgQEAKICAqICAwIC4uLiBiaXQgbm90IHNldAogICogLTEgLi4uIGZpcnN0IG91dCBvZiBib3VuZHMgYWNjZXNzLCBzdG9wIHRlc3RpbmcgZm9yIGJpdHMhCiAgKi8KLWludCBkcmJkX2JtX3Rlc3RfYml0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgYml0bnIpCitpbnQgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBiaXRucikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHI7CiAJaW50IGk7CiAKQEAgLTE1OTgsNyArMTU4OCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCWlmIChCTV9ET05UX1RFU1QgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAlpZiAoYml0bnIgPCBiLT5ibV9iaXRzKSB7CiAJCXBfYWRkciA9IGJtX21hcF9waWR4KGIsIGJtX2JpdF90b19wYWdlX2lkeChiLCBiaXRucikpOwogCQlpID0gdGVzdF9iaXRfbGUoYml0bnIgJiBCSVRTX1BFUl9QQUdFX01BU0ssIHBfYWRkcikgPyAxIDogMDsKQEAgLTE2MDYsNyArMTU5Niw3IEBACiAJfSBlbHNlIGlmIChiaXRuciA9PSBiLT5ibV9iaXRzKSB7CiAJCWkgPSAtMTsKIAl9IGVsc2UgeyAvKiAoYml0bnIgPiBiLT5ibV9iaXRzKSAqLwotCQlkZXZfZXJyKERFViwgImJpdG5yPSVsdSA+IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CisJCWRyYmRfZXJyKGRldmljZSwgImJpdG5yPSVsdSA+IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CiAJCWkgPSAwOwogCX0KIApAQCAtMTYxNSwxMCArMTYwNSwxMCBAQAogfQogCiAvKiByZXR1cm5zIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgcmFuZ2UgW3MsIGVdICovCi1pbnQgZHJiZF9ibV9jb3VudF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKQoraW50IGRyYmRfYm1fY291bnRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyAqcF9hZGRyID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGJpdG5yOwogCXVuc2lnbmVkIGludCBwYWdlX25yID0gLTFVOwpAQCAtMTYzNSw3ICsxNjI1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJaWYgKEJNX0RPTlRfVEVTVCAmIGItPmJtX2ZsYWdzKQotCQlibV9wcmludF9sb2NrX2luZm8obWRldik7CisJCWJtX3ByaW50X2xvY2tfaW5mbyhkZXZpY2UpOwogCWZvciAoYml0bnIgPSBzOyBiaXRuciA8PSBlOyBiaXRucisrKSB7CiAJCXVuc2lnbmVkIGludCBpZHggPSBibV9iaXRfdG9fcGFnZV9pZHgoYiwgYml0bnIpOwogCQlpZiAocGFnZV9uciAhPSBpZHgpIHsKQEAgLTE2NDcsNyArMTYzNyw3IEBACiAJCWlmIChleHBlY3QoYml0bnIgPCBiLT5ibV9iaXRzKSkKIAkJCWMgKz0gKDAgIT0gdGVzdF9iaXRfbGUoYml0bnIgLSAocGFnZV9uciA8PCAoUEFHRV9TSElGVCszKSksIHBfYWRkcikpOwogCQllbHNlCi0JCQlkZXZfZXJyKERFViwgImJpdG5yPSVsdSBibV9iaXRzPSVsdVxuIiwgYml0bnIsIGItPmJtX2JpdHMpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiYml0bnI9JWx1IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CiAJfQogCWlmIChwX2FkZHIpCiAJCWJtX3VubWFwKHBfYWRkcik7CkBAIC0xNjcwLDkgKzE2NjAsOSBAQAogICogcmVmZXJlbmNlIGNvdW50IG9mIHNvbWUgYml0bWFwIGV4dGVudCBlbGVtZW50IGZyb20gc29tZSBscnUgaW5zdGVhZC4uLgogICoKICAqLwotaW50IGRyYmRfYm1fZV93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBlbnIpCitpbnQgZHJiZF9ibV9lX3dlaWdodChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBlbnIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBjb3VudCwgcywgZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciwgKmJtOwpAQCAtMTY4NCw3ICsxNjc0LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJaWYgKEJNX0RPTlRfVEVTVCAmIGItPmJtX2ZsYWdzKQotCQlibV9wcmludF9sb2NrX2luZm8obWRldik7CisJCWJtX3ByaW50X2xvY2tfaW5mbyhkZXZpY2UpOwogCiAJcyA9IFMyVyhlbnIpOwogCWUgPSBtaW4oKHNpemVfdClTMlcoZW5yKzEpLCBiLT5ibV93b3Jkcyk7CkBAIC0xNjk3LDcgKzE2ODcsNyBAQAogCQkJY291bnQgKz0gaHdlaWdodF9sb25nKCpibSsrKTsKIAkJYm1fdW5tYXAocF9hZGRyKTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgInN0YXJ0IG9mZnNldCAoJWQpIHRvbyBsYXJnZSBpbiBkcmJkX2JtX2Vfd2VpZ2h0XG4iLCBzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAic3RhcnQgb2Zmc2V0ICglZCkgdG9vIGxhcmdlIGluIGRyYmRfYm1fZV93ZWlnaHRcbiIsIHMpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAppbmRleCAwZTA2ZjBjLi5lNzA5M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaApAQCAtNDUsNyArNDUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZHJiZF9nZW5sX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RyYmQuaD4KKyNpbmNsdWRlICJkcmJkX3N0cmluZ3MuaCIKICNpbmNsdWRlICJkcmJkX3N0YXRlLmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogCiAjaWZkZWYgX19DSEVDS0VSX18KICMgZGVmaW5lIF9fcHJvdGVjdGVkX2J5KHgpICAgICAgIF9fYXR0cmlidXRlX18oKHJlcXVpcmVfY29udGV4dCh4LDEsOTk5LCJyZHdyIikpKQpAQCAtNjUsNiArNjcsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBtaW5vcl9jb3VudDsKIGV4dGVybiBib29sIGRpc2FibGVfc2VuZHBhZ2U7CiBleHRlcm4gYm9vbCBhbGxvd19vb3M7Cit2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogCiAjaWZkZWYgQ09ORklHX0RSQkRfRkFVTFRfSU5KRUNUSU9OCiBleHRlcm4gaW50IGVuYWJsZV9mYXVsdHM7CkBAIC05NSwyNSArOTgsNjAgQEAKIAogI2RlZmluZSBVVUlEX05FV19CTV9PRkZTRVQgKCh1NjQpMHgwMDAxMDAwMDAwMDAwMDAwVUxMKQogCi1zdHJ1Y3QgZHJiZF9jb25mOwotc3RydWN0IGRyYmRfdGNvbm47CitzdHJ1Y3QgZHJiZF9kZXZpY2U7CitzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uOwogCisjZGVmaW5lIF9fZHJiZF9wcmludGtfZGV2aWNlKGxldmVsLCBkZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWRldl9wcmludGsobGV2ZWwsIGRpc2tfdG9fZGV2KChkZXZpY2UpLT52ZGlzayksIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgX19kcmJkX3ByaW50a19wZWVyX2RldmljZShsZXZlbCwgcGVlcl9kZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWRldl9wcmludGsobGV2ZWwsIGRpc2tfdG9fZGV2KChwZWVyX2RldmljZSktPmRldmljZS0+dmRpc2spLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIF9fZHJiZF9wcmludGtfcmVzb3VyY2UobGV2ZWwsIHJlc291cmNlLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsobGV2ZWwgImRyYmQgJXM6ICIgZm10LCAocmVzb3VyY2UpLT5uYW1lLCAjIyBhcmdzKQorI2RlZmluZSBfX2RyYmRfcHJpbnRrX2Nvbm5lY3Rpb24obGV2ZWwsIGNvbm5lY3Rpb24sIGZtdCwgYXJncy4uLikgXAorCXByaW50ayhsZXZlbCAiZHJiZCAlczogIiBmbXQsIChjb25uZWN0aW9uKS0+cmVzb3VyY2UtPm5hbWUsICMjIGFyZ3MpCiAKLS8qIHRvIHNob3J0ZW4gZGV2X3dhcm4oREVWLCAibXNnIik7IGFuZCByZWxhdGl2ZXMgc3RhdGVtZW50cyAqLwotI2RlZmluZSBERVYgKGRpc2tfdG9fZGV2KG1kZXYtPnZkaXNrKSkKK3ZvaWQgZHJiZF9wcmludGtfd2l0aF93cm9uZ19vYmplY3RfdHlwZSh2b2lkKTsKIAotI2RlZmluZSBjb25uX3ByaW50ayhMRVZFTCwgVENPTk4sIEZNVCwgQVJHUy4uLikgXAotCXByaW50ayhMRVZFTCAiZC1jb24gJXM6ICIgRk1ULCBUQ09OTi0+bmFtZSAsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fYWxlcnQoVENPTk4sIEZNVCwgQVJHUy4uLikgIGNvbm5fcHJpbnRrKEtFUk5fQUxFUlQsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fY3JpdChUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fQ1JJVCwgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9lcnIoVENPTk4sIEZNVCwgQVJHUy4uLikgICAgY29ubl9wcmludGsoS0VSTl9FUlIsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fd2FybihUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fV0FSTklORywgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9ub3RpY2UoVENPTk4sIEZNVCwgQVJHUy4uLikgY29ubl9wcmludGsoS0VSTl9OT1RJQ0UsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5faW5mbyhUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fSU5GTywgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9kYmcoVENPTk4sIEZNVCwgQVJHUy4uLikgICAgY29ubl9wcmludGsoS0VSTl9ERUJVRywgVENPTk4sIEZNVCwgIyMgQVJHUykKKyNkZWZpbmUgX19kcmJkX3ByaW50a19pZl9zYW1lX3R5cGUob2JqLCB0eXBlLCBmdW5jLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AodHlwZW9mKG9iaiksIHR5cGUpIHx8IFwKKwkgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBlb2Yob2JqKSwgY29uc3QgdHlwZSkpLCBcCisJZnVuYyhsZXZlbCwgKGNvbnN0IHR5cGUpKG9iaiksIGZtdCwgIyMgYXJncykKIAotI2RlZmluZSBEX0FTU0VSVChleHApCWlmICghKGV4cCkpIFwKLQkgZGV2X2VycihERVYsICJBU1NFUlQoICIgI2V4cCAiICkgaW4gJXM6JWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgZHJiZF9wcmludGsobGV2ZWwsIG9iaiwgZm10LCBhcmdzLi4uKSBcCisJX19idWlsdGluX2Nob29zZV9leHByKCBcCisJICBfX2RyYmRfcHJpbnRrX2lmX3NhbWVfdHlwZShvYmosIHN0cnVjdCBkcmJkX2RldmljZSAqLCBcCisJCQkgICAgIF9fZHJiZF9wcmludGtfZGV2aWNlLCBsZXZlbCwgZm10LCAjIyBhcmdzKSwgXAorCSAgX19idWlsdGluX2Nob29zZV9leHByKCBcCisJICAgIF9fZHJiZF9wcmludGtfaWZfc2FtZV90eXBlKG9iaiwgc3RydWN0IGRyYmRfcmVzb3VyY2UgKiwgXAorCQkJICAgICAgIF9fZHJiZF9wcmludGtfcmVzb3VyY2UsIGxldmVsLCBmbXQsICMjIGFyZ3MpLCBcCisJICAgIF9fYnVpbHRpbl9jaG9vc2VfZXhwciggXAorCSAgICAgIF9fZHJiZF9wcmludGtfaWZfc2FtZV90eXBlKG9iaiwgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqLCBcCisJCQkJIF9fZHJiZF9wcmludGtfY29ubmVjdGlvbiwgbGV2ZWwsIGZtdCwgIyMgYXJncyksIFwKKwkgICAgICBfX2J1aWx0aW5fY2hvb3NlX2V4cHIoIFwKKwkJX19kcmJkX3ByaW50a19pZl9zYW1lX3R5cGUob2JqLCBzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBcCisJCQkJIF9fZHJiZF9wcmludGtfcGVlcl9kZXZpY2UsIGxldmVsLCBmbXQsICMjIGFyZ3MpLCBcCisJCWRyYmRfcHJpbnRrX3dpdGhfd3Jvbmdfb2JqZWN0X3R5cGUoKSkpKSkKKworI2RlZmluZSBkcmJkX2RiZyhvYmosIGZtdCwgYXJncy4uLikgXAorCWRyYmRfcHJpbnRrKEtFUk5fREVCVUcsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2FsZXJ0KG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9BTEVSVCwgb2JqLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGRyYmRfZXJyKG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9FUlIsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX3dhcm4ob2JqLCBmbXQsIGFyZ3MuLi4pIFwKKwlkcmJkX3ByaW50ayhLRVJOX1dBUk5JTkcsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2luZm8ob2JqLCBmbXQsIGFyZ3MuLi4pIFwKKwlkcmJkX3ByaW50ayhLRVJOX0lORk8sIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2VtZXJnKG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9FTUVSRywgb2JqLCBmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgZHluYW1pY19kcmJkX2RiZyhkZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWR5bmFtaWNfZGV2X2RiZyhkaXNrX3RvX2RldihkZXZpY2UtPnZkaXNrKSwgZm10LCAjIyBhcmdzKQorCisjZGVmaW5lIERfQVNTRVJUKGRldmljZSwgZXhwKQlkbyB7IFwKKwlpZiAoIShleHApKSBcCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCggIiAjZXhwICIgKSBpbiAlczolZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCX0gd2hpbGUgKDApCiAKIC8qKgogICogZXhwZWN0ICAtICBNYWtlIGFuIGFzc2VydGlvbgpAQCAtMTIzLDcgKzE2MSw3IEBACiAjZGVmaW5lIGV4cGVjdChleHApICh7CQkJCQkJCQlcCiAJCWJvb2wgX2Jvb2wgPSAoZXhwKTsJCQkJCQlcCiAJCWlmICghX2Jvb2wpCQkJCQkJCVwKLQkJCWRldl9lcnIoREVWLCAiQVNTRVJUSU9OICVzIEZBSUxFRCBpbiAlc1xuIiwJCVwKKwkJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVElPTiAlcyBGQUlMRUQgaW4gJXNcbiIsCQlcCiAJCQkgICAgICAgICNleHAsIF9fZnVuY19fKTsJCQkJXAogCQlfYm9vbDsJCQkJCQkJCVwKIAkJfSkKQEAgLTE0NSwxNCArMTgzLDE0IEBACiB9OwogCiBleHRlcm4gdW5zaWduZWQgaW50Ci1fZHJiZF9pbnNlcnRfZmF1bHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IHR5cGUpOworX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgdHlwZSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1kcmJkX2luc2VydF9mYXVsdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSkgeworZHJiZF9pbnNlcnRfZmF1bHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCB0eXBlKSB7CiAjaWZkZWYgQ09ORklHX0RSQkRfRkFVTFRfSU5KRUNUSU9OCiAJcmV0dXJuIGZhdWx0X3JhdGUgJiYKIAkJKGVuYWJsZV9mYXVsdHMgJiAoMTw8dHlwZSkpICYmCi0JCV9kcmJkX2luc2VydF9mYXVsdChtZGV2LCB0eXBlKTsKKwkJX2RyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgdHlwZSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC0xNjQsNzQgKzIwMiw4IEBACiAjZGVmaW5lIGRpdl9mbG9vcihBLCBCKSAoKEEpLyhCKSkKIAogZXh0ZXJuIHN0cnVjdCByYXRlbGltaXRfc3RhdGUgZHJiZF9yYXRlbGltaXRfc3RhdGU7Ci1leHRlcm4gc3RydWN0IGlkciBtaW5vcnM7IC8qIFJDVSwgdXBkYXRlczogZ2VubF9sb2NrKCkgKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRyYmRfdGNvbm5zOyAvKiBSQ1UsIHVwZGF0ZXM6IGdlbmxfbG9jaygpICovCi0KLS8qIG9uIHRoZSB3aXJlICovCi1lbnVtIGRyYmRfcGFja2V0IHsKLQkvKiByZWNlaXZlciAoZGF0YSBzb2NrZXQpICovCi0JUF9EQVRBCQkgICAgICA9IDB4MDAsCi0JUF9EQVRBX1JFUExZCSAgICAgID0gMHgwMSwgLyogUmVzcG9uc2UgdG8gUF9EQVRBX1JFUVVFU1QgKi8KLQlQX1JTX0RBVEFfUkVQTFkJICAgICAgPSAweDAyLCAvKiBSZXNwb25zZSB0byBQX1JTX0RBVEFfUkVRVUVTVCAqLwotCVBfQkFSUklFUgkgICAgICA9IDB4MDMsCi0JUF9CSVRNQVAJICAgICAgPSAweDA0LAotCVBfQkVDT01FX1NZTkNfVEFSR0VUICA9IDB4MDUsCi0JUF9CRUNPTUVfU1lOQ19TT1VSQ0UgID0gMHgwNiwKLQlQX1VOUExVR19SRU1PVEUJICAgICAgPSAweDA3LCAvKiBVc2VkIGF0IHZhcmlvdXMgdGltZXMgdG8gaGludCB0aGUgcGVlciAqLwotCVBfREFUQV9SRVFVRVNUCSAgICAgID0gMHgwOCwgLyogVXNlZCB0byBhc2sgZm9yIGEgZGF0YSBibG9jayAqLwotCVBfUlNfREFUQV9SRVFVRVNUICAgICA9IDB4MDksIC8qIFVzZWQgdG8gYXNrIGZvciBhIGRhdGEgYmxvY2sgZm9yIHJlc3luYyAqLwotCVBfU1lOQ19QQVJBTQkgICAgICA9IDB4MGEsCi0JUF9QUk9UT0NPTAkgICAgICA9IDB4MGIsCi0JUF9VVUlEUwkJICAgICAgPSAweDBjLAotCVBfU0laRVMJCSAgICAgID0gMHgwZCwKLQlQX1NUQVRFCQkgICAgICA9IDB4MGUsCi0JUF9TWU5DX1VVSUQJICAgICAgPSAweDBmLAotCVBfQVVUSF9DSEFMTEVOR0UgICAgICA9IDB4MTAsCi0JUF9BVVRIX1JFU1BPTlNFCSAgICAgID0gMHgxMSwKLQlQX1NUQVRFX0NIR19SRVEJICAgICAgPSAweDEyLAotCi0JLyogYXNlbmRlciAobWV0YSBzb2NrZXQgKi8KLQlQX1BJTkcJCSAgICAgID0gMHgxMywKLQlQX1BJTkdfQUNLCSAgICAgID0gMHgxNCwKLQlQX1JFQ1ZfQUNLCSAgICAgID0gMHgxNSwgLyogVXNlZCBpbiBwcm90b2NvbCBCICovCi0JUF9XUklURV9BQ0sJICAgICAgPSAweDE2LCAvKiBVc2VkIGluIHByb3RvY29sIEMgKi8KLQlQX1JTX1dSSVRFX0FDSwkgICAgICA9IDB4MTcsIC8qIElzIGEgUF9XUklURV9BQ0ssIGFkZGl0aW9uYWxseSBjYWxsIHNldF9pbl9zeW5jKCkuICovCi0JUF9TVVBFUlNFREVECSAgICAgID0gMHgxOCwgLyogVXNlZCBpbiBwcm90byBDLCB0d28tcHJpbWFyaWVzIGNvbmZsaWN0IGRldGVjdGlvbiAqLwotCVBfTkVHX0FDSwkgICAgICA9IDB4MTksIC8qIFNlbnQgaWYgbG9jYWwgZGlzayBpcyB1bnVzYWJsZSAqLwotCVBfTkVHX0RSRVBMWQkgICAgICA9IDB4MWEsIC8qIExvY2FsIGRpc2sgaXMgYnJva2VuLi4uICovCi0JUF9ORUdfUlNfRFJFUExZCSAgICAgID0gMHgxYiwgLyogTG9jYWwgZGlzayBpcyBicm9rZW4uLi4gKi8KLQlQX0JBUlJJRVJfQUNLCSAgICAgID0gMHgxYywKLQlQX1NUQVRFX0NIR19SRVBMWSAgICAgPSAweDFkLAotCi0JLyogIm5ldyIgY29tbWFuZHMsIG5vIGxvbmdlciBmaXR0aW5nIGludG8gdGhlIG9yZGVyaW5nIHNjaGVtZSBhYm92ZSAqLwotCi0JUF9PVl9SRVFVRVNUCSAgICAgID0gMHgxZSwgLyogZGF0YSBzb2NrZXQgKi8KLQlQX09WX1JFUExZCSAgICAgID0gMHgxZiwKLQlQX09WX1JFU1VMVAkgICAgICA9IDB4MjAsIC8qIG1ldGEgc29ja2V0ICovCi0JUF9DU1VNX1JTX1JFUVVFU1QgICAgID0gMHgyMSwgLyogZGF0YSBzb2NrZXQgKi8KLQlQX1JTX0lTX0lOX1NZTkMJICAgICAgPSAweDIyLCAvKiBtZXRhIHNvY2tldCAqLwotCVBfU1lOQ19QQVJBTTg5CSAgICAgID0gMHgyMywgLyogZGF0YSBzb2NrZXQsIHByb3RvY29sIHZlcnNpb24gODkgcmVwbGFjZW1lbnQgZm9yIFBfU1lOQ19QQVJBTSAqLwotCVBfQ09NUFJFU1NFRF9CSVRNQVAgICA9IDB4MjQsIC8qIGNvbXByZXNzZWQgb3Igb3RoZXJ3aXNlIGVuY29kZWQgYml0bWFwIHRyYW5zZmVyICovCi0JLyogUF9DS1BUX0ZFTkNFX1JFUSAgICAgID0gMHgyNSwgKiBjdXJyZW50bHkgcmVzZXJ2ZWQgZm9yIHByb3RvY29sIEQgKi8KLQkvKiBQX0NLUFRfRElTQUJMRV9SRVEgICAgPSAweDI2LCAqIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wgRCAqLwotCVBfREVMQVlfUFJPQkUgICAgICAgICA9IDB4MjcsIC8qIGlzIHVzZWQgb24gQk9USCBzb2NrZXRzICovCi0JUF9PVVRfT0ZfU1lOQyAgICAgICAgID0gMHgyOCwgLyogTWFyayBhcyBvdXQgb2Ygc3luYyAoT3V0cnVubmluZyksIGRhdGEgc29ja2V0ICovCi0JUF9SU19DQU5DRUwgICAgICAgICAgID0gMHgyOSwgLyogbWV0YTogVXNlZCB0byBjYW5jZWwgUlNfREFUQV9SRVFVRVNUIHBhY2tldCBieSBTeW5jU291cmNlICovCi0JUF9DT05OX1NUX0NIR19SRVEgICAgID0gMHgyYSwgLyogZGF0YSBzb2NrOiBDb25uZWN0aW9uIHdpZGUgc3RhdGUgcmVxdWVzdCAqLwotCVBfQ09OTl9TVF9DSEdfUkVQTFkgICA9IDB4MmIsIC8qIG1ldGEgc29jazogQ29ubmVjdGlvbiBzaWRlIHN0YXRlIHJlcSByZXBseSAqLwotCVBfUkVUUllfV1JJVEUJICAgICAgPSAweDJjLCAvKiBQcm90b2NvbCBDOiByZXRyeSBjb25mbGljdGluZyB3cml0ZSByZXF1ZXN0ICovCi0JUF9QUk9UT0NPTF9VUERBVEUgICAgID0gMHgyZCwgLyogZGF0YSBzb2NrOiBpcyB1c2VkIGluIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zICovCi0KLQlQX01BWV9JR05PUkUJICAgICAgPSAweDEwMCwgLyogRmxhZyB0byB0ZXN0IGlmIChjbWQgPiBQX01BWV9JR05PUkUpIC4uLiAqLwotCVBfTUFYX09QVF9DTUQJICAgICAgPSAweDEwMSwKLQotCS8qIHNwZWNpYWwgY29tbWFuZCBpZHMgZm9yIGhhbmRzaGFrZSAqLwotCi0JUF9JTklUSUFMX01FVEEJICAgICAgPSAweGZmZjEsIC8qIEZpcnN0IFBhY2tldCBvbiB0aGUgTWV0YVNvY2sgKi8KLQlQX0lOSVRJQUxfREFUQQkgICAgICA9IDB4ZmZmMiwgLyogRmlyc3QgUGFja2V0IG9uIHRoZSBTb2NrZXQgKi8KLQotCVBfQ09OTkVDVElPTl9GRUFUVVJFUyA9IDB4ZmZmZQkvKiBGSVhFRCBmb3IgdGhlIG5leHQgY2VudHVyeSEgKi8KLX07CitleHRlcm4gc3RydWN0IGlkciBkcmJkX2RldmljZXM7IC8qIFJDVSwgdXBkYXRlczogZ2VubF9sb2NrKCkgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRyYmRfcmVzb3VyY2VzOyAvKiBSQ1UsIHVwZGF0ZXM6IGdlbmxfbG9jaygpICovCiAKIGV4dGVybiBjb25zdCBjaGFyICpjbWRuYW1lKGVudW0gZHJiZF9wYWNrZXQgY21kKTsKIApAQCAtMjUzLDcgKzIyNSw3IEBACiAJdW5zaWduZWQgYnl0ZXNbMl07CiB9OwogCi1leHRlcm4gdm9pZCBJTkZPX2JtX3hmZXJfc3RhdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiB2b2lkIElORk9fYm1feGZlcl9zdGF0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJY29uc3QgY2hhciAqZGlyZWN0aW9uLCBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYm1feGZlcl9jdHhfYml0X3RvX3dvcmRfb2Zmc2V0KHN0cnVjdCBibV94ZmVyX2N0eCAqYykKQEAgLTI3NSwyMzMgKzI0Nyw3IEBACiAjZW5kaWYKIH0KIAotI2lmbmRlZiBfX3BhY2tlZAotI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBmb3IgYSBwYWNrZXQgb24gdGhlIHdpcmUuCi0gKiBUaGUgYnl0ZW9yZGVyIGlzIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKiAgICAgKGV4Y2VwdCBibG9ja19pZCBhbmQgYmFycmllciBmaWVsZHMuCi0gKgl0aGVzZSBhcmUgcG9pbnRlcnMgdG8gbG9jYWwgc3RydWN0cwotICoJYW5kIGhhdmUgbm8gcmVsZXZhbmNlIGZvciB0aGUgcGFydG5lciwKLSAqCXdoaWNoIGp1c3QgZWNob2VzIHRoZW0gYXMgcmVjZWl2ZWQuKQotICoKLSAqIE5PVEUgdGhhdCB0aGUgcGF5bG9hZCBzdGFydHMgYXQgYSBsb25nIGFsaWduZWQgb2Zmc2V0LAotICogcmVnYXJkbGVzcyBvZiAzMiBvciA2NCBiaXQgYXJjaCEKLSAqLwotc3RydWN0IHBfaGVhZGVyODAgewotCXUzMgkgIG1hZ2ljOwotCXUxNgkgIGNvbW1hbmQ7Ci0JdTE2CSAgbGVuZ3RoOwkvKiBieXRlcyBvZiBkYXRhIGFmdGVyIHRoaXMgaGVhZGVyICovCi19IF9fcGFja2VkOwotCi0vKiBIZWFkZXIgZm9yIGJpZyBwYWNrZXRzLCBVc2VkIGZvciBkYXRhIHBhY2tldHMgZXhjZWVkaW5nIDY0a0IgKi8KLXN0cnVjdCBwX2hlYWRlcjk1IHsKLQl1MTYJICBtYWdpYzsJLyogdXNlIERSQkRfTUFHSUNfQklHIGhlcmUgKi8KLQl1MTYJICBjb21tYW5kOwotCXUzMgkgIGxlbmd0aDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2hlYWRlcjEwMCB7Ci0JdTMyCSAgbWFnaWM7Ci0JdTE2CSAgdm9sdW1lOwotCXUxNgkgIGNvbW1hbmQ7Ci0JdTMyCSAgbGVuZ3RoOwotCXUzMgkgIHBhZDsKLX0gX19wYWNrZWQ7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotCi0vKiB0aGVzZSBkZWZpbmVzIG11c3Qgbm90IGJlIGNoYW5nZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAqLwotI2RlZmluZSBEUF9IQVJEQkFSUklFUgkgICAgICAxIC8qIGRlcHJpY2F0ZWQgKi8KLSNkZWZpbmUgRFBfUldfU1lOQwkgICAgICAyIC8qIGVxdWFscyBSRVFfU1lOQyAgICAqLwotI2RlZmluZSBEUF9NQVlfU0VUX0lOX1NZTkMgICAgNAotI2RlZmluZSBEUF9VTlBMVUcgICAgICAgICAgICAgOCAvKiBub3QgdXNlZCBhbnltb3JlICAgKi8KLSNkZWZpbmUgRFBfRlVBICAgICAgICAgICAgICAgMTYgLyogZXF1YWxzIFJFUV9GVUEgICAgICovCi0jZGVmaW5lIERQX0ZMVVNIICAgICAgICAgICAgIDMyIC8qIGVxdWFscyBSRVFfRkxVU0ggICAqLwotI2RlZmluZSBEUF9ESVNDQVJEICAgICAgICAgICA2NCAvKiBlcXVhbHMgUkVRX0RJU0NBUkQgKi8KLSNkZWZpbmUgRFBfU0VORF9SRUNFSVZFX0FDSyAxMjggLyogVGhpcyBpcyBhIHByb3RvIEIgd3JpdGUgcmVxdWVzdCAqLwotI2RlZmluZSBEUF9TRU5EX1dSSVRFX0FDSyAgIDI1NiAvKiBUaGlzIGlzIGEgcHJvdG8gQyB3cml0ZSByZXF1ZXN0ICovCi0KLXN0cnVjdCBwX2RhdGEgewotCXU2NAkgICAgc2VjdG9yOyAgICAvKiA2NCBiaXRzIHNlY3RvciBudW1iZXIgKi8KLQl1NjQJICAgIGJsb2NrX2lkOyAgLyogdG8gaWRlbnRpZnkgdGhlIHJlcXVlc3QgaW4gcHJvdG9jb2wgQiZDICovCi0JdTMyCSAgICBzZXFfbnVtOwotCXUzMgkgICAgZHBfZmxhZ3M7Ci19IF9fcGFja2VkOwotCi0vKgotICogY29tbWFuZHMgd2hpY2ggc2hhcmUgYSBzdHJ1Y3Q6Ci0gKiAgcF9ibG9ja19hY2s6Ci0gKiAgIFBfUkVDVl9BQ0sgKHByb3RvIEIpLCBQX1dSSVRFX0FDSyAocHJvdG8gQyksCi0gKiAgIFBfU1VQRVJTRURFRCAocHJvdG8gQywgdHdvLXByaW1hcmllcyBjb25mbGljdCBkZXRlY3Rpb24pCi0gKiAgcF9ibG9ja19yZXE6Ci0gKiAgIFBfREFUQV9SRVFVRVNULCBQX1JTX0RBVEFfUkVRVUVTVAotICovCi1zdHJ1Y3QgcF9ibG9ja19hY2sgewotCXU2NAkgICAgc2VjdG9yOwotCXU2NAkgICAgYmxvY2tfaWQ7Ci0JdTMyCSAgICBibGtzaXplOwotCXUzMgkgICAgc2VxX251bTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2Jsb2NrX3JlcSB7Ci0JdTY0IHNlY3RvcjsKLQl1NjQgYmxvY2tfaWQ7Ci0JdTMyIGJsa3NpemU7Ci0JdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCi19IF9fcGFja2VkOwotCi0vKgotICogY29tbWFuZHMgd2l0aCB0aGVpciBvd24gc3RydWN0IGZvciBhZGRpdGlvbmFsIGZpZWxkczoKLSAqICAgUF9DT05ORUNUSU9OX0ZFQVRVUkVTCi0gKiAgIFBfQkFSUklFUgotICogICBQX0JBUlJJRVJfQUNLCi0gKiAgIFBfU1lOQ19QQVJBTQotICogICBSZXBvcnRQYXJhbXMKLSAqLwotCi1zdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzIHsKLQl1MzIgcHJvdG9jb2xfbWluOwotCXUzMiBmZWF0dXJlX2ZsYWdzOwotCXUzMiBwcm90b2NvbF9tYXg7Ci0KLQkvKiBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCBmb3IgZnV0dXJlIGVuaGFuY2VtZW50cwotCSAqIGZvciBub3csIGZlYXR1cmVfZmxhZ3MgYW5kIHRoZSByZXNlcnZlZCBhcnJheSBzaGFsbCBiZSB6ZXJvLgotCSAqLwotCi0JdTMyIF9wYWQ7Ci0JdTY0IHJlc2VydmVkWzddOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBfYmFycmllciB7Ci0JdTMyIGJhcnJpZXI7CS8qIGJhcnJpZXIgbnVtYmVyIF9oYW5kbGVfIG9ubHkgKi8KLQl1MzIgcGFkOwkvKiB0byBtdWx0aXBsZSBvZiA4IEJ5dGUgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2JhcnJpZXJfYWNrIHsKLQl1MzIgYmFycmllcjsKLQl1MzIgc2V0X3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yc19wYXJhbSB7Ci0JdTMyIHJlc3luY19yYXRlOwotCi0JICAgICAgLyogU2luY2UgcHJvdG9jb2wgdmVyc2lvbiA4OCBhbmQgaGlnaGVyLiAqLwotCWNoYXIgdmVyaWZ5X2FsZ1swXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3JzX3BhcmFtXzg5IHsKLQl1MzIgcmVzeW5jX3JhdGU7Ci0gICAgICAgIC8qIHByb3RvY29sIHZlcnNpb24gODk6ICovCi0JY2hhciB2ZXJpZnlfYWxnW1NIQVJFRF9TRUNSRVRfTUFYXTsKLQljaGFyIGNzdW1zX2FsZ1tTSEFSRURfU0VDUkVUX01BWF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yc19wYXJhbV85NSB7Ci0JdTMyIHJlc3luY19yYXRlOwotCWNoYXIgdmVyaWZ5X2FsZ1tTSEFSRURfU0VDUkVUX01BWF07Ci0JY2hhciBjc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOwotCXUzMiBjX3BsYW5fYWhlYWQ7Ci0JdTMyIGNfZGVsYXlfdGFyZ2V0OwotCXUzMiBjX2ZpbGxfdGFyZ2V0OwotCXUzMiBjX21heF9yYXRlOwotfSBfX3BhY2tlZDsKLQotZW51bSBkcmJkX2Nvbm5fZmxhZ3MgewotCUNGX0RJU0NBUkRfTVlfREFUQSA9IDEsCi0JQ0ZfRFJZX1JVTiA9IDIsCi19OwotCi1zdHJ1Y3QgcF9wcm90b2NvbCB7Ci0JdTMyIHByb3RvY29sOwotCXUzMiBhZnRlcl9zYl8wcDsKLQl1MzIgYWZ0ZXJfc2JfMXA7Ci0JdTMyIGFmdGVyX3NiXzJwOwotCXUzMiBjb25uX2ZsYWdzOwotCXUzMiB0d29fcHJpbWFyaWVzOwotCi0gICAgICAgICAgICAgIC8qIFNpbmNlIHByb3RvY29sIHZlcnNpb24gODcgYW5kIGhpZ2hlci4gKi8KLQljaGFyIGludGVncml0eV9hbGdbMF07Ci0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3V1aWRzIHsKLQl1NjQgdXVpZFtVSV9FWFRFTkRFRF9TSVpFXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3JzX3V1aWQgewotCXU2NAkgICAgdXVpZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3NpemVzIHsKLQl1NjQJICAgIGRfc2l6ZTsgIC8qIHNpemUgb2YgZGlzayAqLwotCXU2NAkgICAgdV9zaXplOyAgLyogdXNlciByZXF1ZXN0ZWQgc2l6ZSAqLwotCXU2NAkgICAgY19zaXplOyAgLyogY3VycmVudCBleHBvcnRlZCBzaXplICovCi0JdTMyCSAgICBtYXhfYmlvX3NpemU7ICAvKiBNYXhpbWFsIHNpemUgb2YgYSBCSU8gKi8KLQl1MTYJICAgIHF1ZXVlX29yZGVyX3R5cGU7ICAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIERSQkQqLwotCXUxNgkgICAgZGRzX2ZsYWdzOyAvKiB1c2UgZW51bSBkZHNfZmxhZ3MgaGVyZS4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3N0YXRlIHsKLQl1MzIJICAgIHN0YXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBfcmVxX3N0YXRlIHsKLQl1MzIJICAgIG1hc2s7Ci0JdTMyCSAgICB2YWw7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgewotCXUzMgkgICAgcmV0Y29kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2RyYmQwNl9wYXJhbSB7Ci0JdTY0CSAgc2l6ZTsKLQl1MzIJICBzdGF0ZTsKLQl1MzIJICBibGtzaXplOwotCXUzMgkgIHByb3RvY29sOwotCXUzMgkgIHZlcnNpb247Ci0JdTMyCSAgZ2VuX2NudFs1XTsKLQl1MzIJICBiaXRfbWFwX2dlbls1XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2Jsb2NrX2Rlc2MgewotCXU2NCBzZWN0b3I7Ci0JdTMyIGJsa3NpemU7Ci0JdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCi19IF9fcGFja2VkOwotCi0vKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZyBmaWVsZC4KLSAqIEJ1bXAgcHJvdG8gdmVyc2lvbiB3aGVuIGNoYW5naW5nIHRoaXMuICovCi1lbnVtIGRyYmRfYml0bWFwX2NvZGUgewotCS8qIFJMRV9WTElfQnl0ZXMgPSAwLAotCSAqIGFuZCBvdGhlciBiaXQgdmFyaWFudHMgaGFkIGJlZW4gZGVmaW5lZCBkdXJpbmcKLQkgKiBhbGdvcml0aG0gZXZhbHVhdGlvbi4gKi8KLQlSTEVfVkxJX0JpdHMgPSAyLAotfTsKLQotc3RydWN0IHBfY29tcHJlc3NlZF9ibSB7Ci0JLyogKGVuY29kaW5nICYgMHgwZik6IGFjdHVhbCBlbmNvZGluZywgc2VlIGVudW0gZHJiZF9iaXRtYXBfY29kZQotCSAqIChlbmNvZGluZyAmIDB4ODApOiBwb2xhcml0eSAoc2V0L3Vuc2V0KSBvZiBmaXJzdCBydW5sZW5ndGgKLQkgKiAoKGVuY29kaW5nID4+IDQpICYgMHgwNyk6IHBhZF9iaXRzLCBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzCi0JICogdXNlZCB0byBwYWQgdXAgdG8gaGVhZC5sZW5ndGggYnl0ZXMKLQkgKi8KLQl1OCBlbmNvZGluZzsKLQotCXU4IGNvZGVbMF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9kZWxheV9wcm9iZTkzIHsKLQl1MzIgICAgIHNlcV9udW07IC8qIHNlcXVlbmNlIG51bWJlciB0byBtYXRjaCB0aGUgdHdvIHByb2JlIHBhY2tldHMgKi8KLQl1MzIgICAgIG9mZnNldDsgIC8qIHVzZWNzIHRoZSBwcm9iZSBnb3Qgc2VudCBhZnRlciB0aGUgcmVmZXJlbmNlIHRpbWUgcG9pbnQgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBCaXRtYXAgcGFja2V0cyBuZWVkIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgcGFnZSBvbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciwKLSAqIHNvIHdlIGFyZSBsaW1pdGVkIHRvIDQgS2lCIChhbmQgbm90IHRvIFBBR0VfU0laRSwgd2hpY2ggY2FuIGJlIGJpZ2dlcikuCi0gKi8KLSNkZWZpbmUgRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgNDA5NgorZXh0ZXJuIHVuc2lnbmVkIGludCBkcmJkX2hlYWRlcl9zaXplKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGVudW0gZHJiZF90aHJlYWRfc3RhdGUgewpAQCAtNTE3LDkgKzI2MywxMCBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHN0b3A7CiAJZW51bSBkcmJkX3RocmVhZF9zdGF0ZSB0X3N0YXRlOwogCWludCAoKmZ1bmN0aW9uKSAoc3RydWN0IGRyYmRfdGhyZWFkICopOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAlpbnQgcmVzZXRfY3B1X21hc2s7Ci0JY2hhciBuYW1lWzldOworCWNvbnN0IGNoYXIgKm5hbWU7CiB9OwogCiBzdGF0aWMgaW5saW5lIGVudW0gZHJiZF90aHJlYWRfc3RhdGUgZ2V0X3Rfc3RhdGUoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCkBAIC01MzUsMTggKzI4MiwyMCBAQAogc3RydWN0IGRyYmRfd29yayB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCAoKmNiKShzdHJ1Y3QgZHJiZF93b3JrICosIGludCBjYW5jZWwpOwotCXVuaW9uIHsKLQkJc3RydWN0IGRyYmRfY29uZiAqbWRldjsKLQkJc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOwotCX07Cit9OworCitzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yayB7CisJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogfTsKIAogI2luY2x1ZGUgImRyYmRfaW50ZXJ2YWwuaCIKIAotZXh0ZXJuIGludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX2ludGVydmFsICopOworZXh0ZXJuIGludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKik7CiAKIHN0cnVjdCBkcmJkX3JlcXVlc3QgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCS8qIGlmIGxvY2FsIElPIGlzIG5vdCBhbGxvd2VkLCB3aWxsIGJlIE5VTEwuCiAJICogaWYgbG9jYWwgSU8gX2lzXyBhbGxvd2VkLCBob2xkcyB0aGUgbG9jYWxseSBzdWJtaXR0ZWQgYmlvIGNsb25lLApAQCAtNTc5LDcgKzMyOCw3IEBACiB9OwogCiBzdHJ1Y3QgZHJiZF9lcG9jaCB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGludCBiYXJyaWVyX25yOwogCWF0b21pY190IGVwb2NoX3NpemU7IC8qIGluY3JlYXNlZCBvbiBldmVyeSByZXF1ZXN0IGFkZGVkLiAqLwpAQCAtNTg3LDYgKzMzNiwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCisvKiBQcm90b3R5cGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gZGVmaW5lZCBpbiBkcmJkX3JlY2VpdmVyLmMgKi8KK2ludCBkcmJkZF9pbml0KHN0cnVjdCBkcmJkX3RocmVhZCAqKTsKK2ludCBkcmJkX2FzZW5kZXIoc3RydWN0IGRyYmRfdGhyZWFkICopOworCiAvKiBkcmJkX2Vwb2NoIGZsYWcgYml0cyAqLwogZW51bSB7CiAJREVfSEFWRV9CQVJSSUVSX05VTUJFUiwKQEAgLTU5OSwxMSArMzUyLDYgQEAKIAlFVl9DTEVBTlVQID0gMzIsIC8qIHVzZWQgYXMgZmxhZyAqLwogfTsKIAotc3RydWN0IGRyYmRfd3FfYmFycmllciB7Ci0Jc3RydWN0IGRyYmRfd29yayB3OwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci19OwotCiBzdHJ1Y3QgZGlnZXN0X2luZm8gewogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3Q7CkBAIC02MTEsNiArMzU5LDcgQEAKIAogc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0IHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCXN0cnVjdCBkcmJkX2Vwb2NoICplcG9jaDsgLyogZm9yIHdyaXRlcyAqLwogCXN0cnVjdCBwYWdlICpwYWdlczsKIAlhdG9taWNfdCBwZW5kaW5nX2Jpb3M7CkBAIC02NjMsNyArNDEyLDcgQEAKICNkZWZpbmUgRUVfU0VORF9XUklURV9BQ0sJKDE8PF9fRUVfU0VORF9XUklURV9BQ0spCiAjZGVmaW5lIEVFX0lOX0lOVEVSVkFMX1RSRUUJKDE8PF9fRUVfSU5fSU5URVJWQUxfVFJFRSkKIAotLyogZmxhZyBiaXRzIHBlciBtZGV2ICovCisvKiBmbGFnIGJpdHMgcGVyIGRldmljZSAqLwogZW51bSB7CiAJVU5QTFVHX1JFTU9URSwJCS8qIHNlbmRpbmcgYSAiVW5wbHVnUmVtb3RlIiBjb3VsZCBoZWxwICovCiAJTURfRElSVFksCQkvKiBjdXJyZW50IHV1aWRzIGFuZCBmbGFncyBub3QgeWV0IG9uIGRpc2sgKi8KQEAgLTY5NSw3ICs0NDQsNyBAQAogCVJFQURfQkFMQU5DRV9SUiwKIH07CiAKLXN0cnVjdCBkcmJkX2JpdG1hcDsgLyogb3BhcXVlIGZvciBkcmJkX2NvbmYgKi8KK3N0cnVjdCBkcmJkX2JpdG1hcDsgLyogb3BhcXVlIGZvciBkcmJkX2RldmljZSAqLwogCiAvKiBkZWZpbml0aW9uIG9mIGJpdHMgaW4gYm1fZmxhZ3MgdG8gYmUgdXNlZCBpbiBkcmJkX2JtX2xvY2sKICAqIGFuZCBkcmJkX2JpdG1hcF9pbyBhbmQgZnJpZW5kcy4gKi8KQEAgLTc2OSw3ICs1MTgsNyBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJhY2tpbmdfYmRldjsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZF9iZGV2OwogCXN0cnVjdCBkcmJkX21kIG1kOwotCXN0cnVjdCBkaXNrX2NvbmYgKmRpc2tfY29uZjsgLyogUkNVLCBmb3IgdXBkYXRlczogbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlICovCisJc3RydWN0IGRpc2tfY29uZiAqZGlza19jb25mOyAvKiBSQ1UsIGZvciB1cGRhdGVzOiByZXNvdXJjZS0+Y29uZl91cGRhdGUgKi8KIAlzZWN0b3JfdCBrbm93bl9zaXplOyAvKiBsYXN0IGtub3duIHNpemUgb2YgdGhhdCBiYWNraW5nIGRldmljZSAqLwogfTsKIApAQCAtNzgyLDggKzUzMSw4IEBACiAJc3RydWN0IGRyYmRfd29yayB3OwogCWNoYXIgKndoeTsKIAllbnVtIGJtX2ZsYWcgZmxhZ3M7Ci0JaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotCXZvaWQgKCpkb25lKShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcnYpOworCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CisJdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcnYpOwogfTsKIAogZW51bSB3cml0ZV9vcmRlcmluZ19lIHsKQEAgLTgwMCw3ICs1NDksNyBAQAogfTsKIGV4dGVybiBzdHJ1Y3QgZmlmb19idWZmZXIgKmZpZm9fYWxsb2MoaW50IGZpZm9fc2l6ZSk7CiAKLS8qIGZsYWcgYml0cyBwZXIgdGNvbm4gKi8KKy8qIGZsYWcgYml0cyBwZXIgY29ubmVjdGlvbiAqLwogZW51bSB7CiAJTkVUX0NPTkdFU1RFRCwJCS8qIFRoZSBkYXRhIHNvY2tldCBpcyBjb25nZXN0ZWQgKi8KIAlSRVNPTFZFX0NPTkZMSUNUUywJLyogU2V0IG9uIG9uZSBub2RlLCBjbGVhcmVkIG9uIHRoZSBwZWVyISAqLwpAQCAtODIyLDIzICs1NzEsMzUgQEAKIAlESVNDT05ORUNUX1NFTlQsCiB9OwogCi1zdHJ1Y3QgZHJiZF90Y29ubiB7CQkJLyogaXMgYSByZXNvdXJjZSBmcm9tIHRoZSBjb25maWcgZmlsZSAqLwotCWNoYXIgKm5hbWU7CQkJLyogUmVzb3VyY2UgbmFtZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYWxsX3Rjb25uOwkvKiBsaW5rZWQgb24gZ2xvYmFsIGRyYmRfdGNvbm5zICovCitzdHJ1Y3QgZHJiZF9yZXNvdXJjZSB7CisJY2hhciAqbmFtZTsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwotCXN0cnVjdCBpZHIgdm9sdW1lczsJCS8qIDx0Y29ubiwgdm5yPiB0byBtZGV2IG1hcHBpbmcgKi8KLQllbnVtIGRyYmRfY29ubnMgY3N0YXRlOwkJLyogT25seSBDX1NUQU5EQUxPTkUgdG8gQ19XRl9SRVBPUlRfUEFSQU1TICovCisJc3RydWN0IGlkciBkZXZpY2VzOwkJLyogdm9sdW1lIG51bWJlciB0byBkZXZpY2UgbWFwcGluZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZXM7CisJc3RydWN0IHJlc19vcHRzIHJlc19vcHRzOworCXN0cnVjdCBtdXRleCBjb25mX3VwZGF0ZTsJLyogbXV0ZXggZm9yIHJlYWR5LWNvcHktdXBkYXRlIG9mIG5ldF9jb25mIGFuZCBkaXNrX2NvbmYgKi8KKwlzcGlubG9ja190IHJlcV9sb2NrOworCiAJdW5zaWduZWQgc3VzcDoxOwkJLyogSU8gc3VzcGVuZGVkIGJ5IHVzZXIgKi8KIAl1bnNpZ25lZCBzdXNwX25vZDoxOwkJLyogSU8gc3VzcGVuZGVkIGJlY2F1c2Ugbm8gZGF0YSAqLwogCXVuc2lnbmVkIHN1c3BfZmVuOjE7CQkvKiBJTyBzdXNwZW5kZWQgYmVjYXVzZSBmZW5jZSBwZWVyIGhhbmRsZXIgcnVucyAqLworCisJY3B1bWFza192YXJfdCBjcHVfbWFzazsKK307CisKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb24geworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGlkciBwZWVyX2RldmljZXM7CS8qIHZvbHVtZSBudW1iZXIgdG8gcGVlciBkZXZpY2UgbWFwcGluZyAqLworCWVudW0gZHJiZF9jb25ucyBjc3RhdGU7CQkvKiBPbmx5IENfU1RBTkRBTE9ORSB0byBDX1dGX1JFUE9SVF9QQVJBTVMgKi8KIAlzdHJ1Y3QgbXV0ZXggY3N0YXRlX211dGV4OwkvKiBQcm90ZWN0cyBncmFjZWZ1bCBkaXNjb25uZWN0cyAqLwogCXVuc2lnbmVkIGludCBjb25uZWN0X2NudDsJLyogSW5jIGVhY2ggdGltZSBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKi8KIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5ldF9jb25mICpuZXRfY29uZjsJLyogY29udGVudCBwcm90ZWN0ZWQgYnkgcmN1ICovCi0Jc3RydWN0IG11dGV4IGNvbmZfdXBkYXRlOwkvKiBtdXRleCBmb3IgcmVhZHktY29weS11cGRhdGUgb2YgbmV0X2NvbmYgYW5kIGRpc2tfY29uZiAqLwogCXdhaXRfcXVldWVfaGVhZF90IHBpbmdfd2FpdDsJLyogV29rZW4gdXBvbiByZWNlcHRpb24gb2YgYSBwaW5nLCBhbmQgYSBzdGF0ZSBjaGFuZ2UgKi8KLQlzdHJ1Y3QgcmVzX29wdHMgcmVzX29wdHM7CiAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBteV9hZGRyOwogCWludCBteV9hZGRyX2xlbjsKQEAgLTg1MSwxMiArNjEyLDEwIEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3JlY2VpdmVkOwkvKiBpbiBqaWZmaWVzLCBlaXRoZXIgc29ja2V0ICovCiAJdW5zaWduZWQgaW50IGtvX2NvdW50OwogCi0Jc3BpbmxvY2tfdCByZXFfbG9jazsKLQogCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNmZXJfbG9nOwkvKiBhbGwgcmVxdWVzdHMgbm90IHlldCBmdWxseSBwcm9jZXNzZWQgKi8KIAogCXN0cnVjdCBjcnlwdG9faGFzaCAqY3JhbV9obWFjX3RmbTsKLQlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmludGVncml0eV90Zm07ICAvKiBjaGVja3N1bXMgd2UgY29tcHV0ZSwgdXBkYXRlcyBwcm90ZWN0ZWQgYnkgdGNvbm4tPmRhdGEtPm11dGV4ICovCisJc3RydWN0IGNyeXB0b19oYXNoICppbnRlZ3JpdHlfdGZtOyAgLyogY2hlY2tzdW1zIHdlIGNvbXB1dGUsIHVwZGF0ZXMgcHJvdGVjdGVkIGJ5IGNvbm5lY3Rpb24tPmRhdGEtPm11dGV4ICovCiAJc3RydWN0IGNyeXB0b19oYXNoICpwZWVyX2ludGVncml0eV90Zm07ICAvKiBjaGVja3N1bXMgd2UgdmVyaWZ5LCBvbmx5IGFjY2Vzc2VkIGZyb20gcmVjZWl2ZXIgdGhyZWFkICAqLwogCXN0cnVjdCBjcnlwdG9faGFzaCAqY3N1bXNfdGZtOwogCXN0cnVjdCBjcnlwdG9faGFzaCAqdmVyaWZ5X3RmbTsKQEAgLTg3NSw3ICs2MzQsNiBAQAogCXN0cnVjdCBkcmJkX3RocmVhZCByZWNlaXZlcjsKIAlzdHJ1Y3QgZHJiZF90aHJlYWQgd29ya2VyOwogCXN0cnVjdCBkcmJkX3RocmVhZCBhc2VuZGVyOwotCWNwdW1hc2tfdmFyX3QgY3B1X21hc2s7CiAKIAkvKiBzZW5kZXIgc2lkZSAqLwogCXN0cnVjdCBkcmJkX3dvcmtfcXVldWUgc2VuZGVyX3dvcms7CkBAIC05MDMsOCArNjYxLDE1IEBACiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZXM7CiB9OwogCi1zdHJ1Y3QgZHJiZF9jb25mIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CitzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZCBwZWVyX2RldmljZXM7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKK307CisKK3N0cnVjdCBkcmJkX2RldmljZSB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBsaXN0X2hlYWQgcGVlcl9kZXZpY2VzOwogCWludCB2bnI7CQkJLyogdm9sdW1lIG51bWJlciB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gKi8KIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCkBAIC05MjAsMTEgKzY4NSwxMSBAQAogCXN0cnVjdCBnZW5kaXNrCSAgICAqdmRpc2s7CiAKIAl1bnNpZ25lZCBsb25nIGxhc3RfcmVhdHRhY2hfamlmOwotCXN0cnVjdCBkcmJkX3dvcmsgIHJlc3luY193b3JrLAotCQkJICB1bnBsdWdfd29yaywKLQkJCSAgZ29fZGlza2xlc3MsCi0JCQkgIG1kX3N5bmNfd29yaywKLQkJCSAgc3RhcnRfcmVzeW5jX3dvcms7CisJc3RydWN0IGRyYmRfd29yayByZXN5bmNfd29yazsKKwlzdHJ1Y3QgZHJiZF93b3JrIHVucGx1Z193b3JrOworCXN0cnVjdCBkcmJkX3dvcmsgZ29fZGlza2xlc3M7CisJc3RydWN0IGRyYmRfd29yayBtZF9zeW5jX3dvcms7CisJc3RydWN0IGRyYmRfd29yayBzdGFydF9yZXN5bmNfd29yazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCByZXN5bmNfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgbWRfc3luY190aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFydF9yZXN5bmNfdGltZXI7CkBAIC0xMDMwLDcgKzc5NSw3IEBACiAJc3RydWN0IGJtX2lvX3dvcmsgYm1faW9fd29yazsKIAl1NjQgZWRfdXVpZDsgLyogVVVJRCBvZiB0aGUgZXhwb3NlZCBkYXRhICovCiAJc3RydWN0IG11dGV4IG93bl9zdGF0ZV9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggKnN0YXRlX211dGV4OyAvKiBlaXRoZXIgb3duX3N0YXRlX211dGV4IG9yIG1kZXYtPnRjb25uLT5jc3RhdGVfbXV0ZXggKi8KKwlzdHJ1Y3QgbXV0ZXggKnN0YXRlX211dGV4OyAvKiBlaXRoZXIgb3duX3N0YXRlX211dGV4IG9yIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCAqLwogCWNoYXIgY29uZ2VzdGlvbl9yZWFzb247ICAvKiBXaHkgd2Ugd2hlcmUgY29uZ2VzdGVkLi4uICovCiAJYXRvbWljX3QgcnNfc2VjdF9pbjsgLyogZm9yIGluY29taW5nIHJlc3luYyBkYXRhIHJhdGUsIFN5bmNUYXJnZXQgKi8KIAlhdG9taWNfdCByc19zZWN0X2V2OyAvKiBmb3Igc3VibWl0dGVkIHJlc3luYyBkYXRhIHJhdGUsIGJvdGggKi8KQEAgLTEwMzgsNyArODAzLDcgQEAKIAlpbnQgcnNfbGFzdF9ldmVudHM7ICAvKiBjb3VudGVyIG9mIHJlYWQgb3Igd3JpdGUgImV2ZW50cyIgKHVuaXQgc2VjdG9ycykKIAkJCSAgICAgICogb24gdGhlIGxvd2VyIGxldmVsIGRldmljZSB3aGVuIHdlIGxhc3QgbG9va2VkLiAqLwogCWludCBjX3N5bmNfcmF0ZTsgLyogY3VycmVudCByZXN5bmMgcmF0ZSBhZnRlciBzeW5jZXIgdGhyb3R0bGUgbWFnaWMgKi8KLQlzdHJ1Y3QgZmlmb19idWZmZXIgKnJzX3BsYW5fczsgLyogY29ycmVjdGlvbiB2YWx1ZXMgb2YgcmVzeW5jIHBsYW5lciAoUkNVLCB0Y29ubi0+Y29ubl91cGRhdGUpICovCisJc3RydWN0IGZpZm9fYnVmZmVyICpyc19wbGFuX3M7IC8qIGNvcnJlY3Rpb24gdmFsdWVzIG9mIHJlc3luYyBwbGFuZXIgKFJDVSwgY29ubmVjdGlvbi0+Y29ubl91cGRhdGUpICovCiAJaW50IHJzX2luX2ZsaWdodDsgLyogcmVzeW5jIHNlY3RvcnMgaW4gZmxpZ2h0ICh0byBwcm94eSwgaW4gcHJveHkgYW5kIGZyb20gcHJveHkpICovCiAJYXRvbWljX3QgYXBfaW5fZmxpZ2h0OyAvKiBBcHAgc2VjdG9ycyBpbiBmbGlnaHQgKHdhaXRpbmcgZm9yIGFjaykgKi8KIAl1bnNpZ25lZCBpbnQgcGVlcl9tYXhfYmlvX3NpemU7CkBAIC0xMDQ5LDE5ICs4MTQsNDYgQEAKIAlzdHJ1Y3Qgc3VibWl0X3dvcmtlciBzdWJtaXQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkcmJkX2NvbmYgKm1pbm9yX3RvX21kZXYodW5zaWduZWQgaW50IG1pbm9yKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9kZXZpY2UgKm1pbm9yX3RvX2RldmljZSh1bnNpZ25lZCBpbnQgbWlub3IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZHJiZF9jb25mICopaWRyX2ZpbmQoJm1pbm9ycywgbWlub3IpOworCXJldHVybiAoc3RydWN0IGRyYmRfZGV2aWNlICopaWRyX2ZpbmQoJmRyYmRfZGV2aWNlcywgbWlub3IpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZGV2X3RvX21pbm9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpmaXJzdF9wZWVyX2RldmljZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlyZXR1cm4gbWRldi0+bWlub3I7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJmRldmljZS0+cGVlcl9kZXZpY2VzLCBzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSwgcGVlcl9kZXZpY2VzKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9jb25mICp2bnJfdG9fbWRldihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGludCB2bnIpCisjZGVmaW5lIGZvcl9lYWNoX3Jlc291cmNlKHJlc291cmNlLCBfcmVzb3VyY2VzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNvdXJjZSwgX3Jlc291cmNlcywgcmVzb3VyY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3Jlc291cmNlX3JjdShyZXNvdXJjZSwgX3Jlc291cmNlcykgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlc291cmNlLCBfcmVzb3VyY2VzLCByZXNvdXJjZXMpCisKKyNkZWZpbmUgZm9yX2VhY2hfcmVzb3VyY2Vfc2FmZShyZXNvdXJjZSwgdG1wLCBfcmVzb3VyY2VzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlc291cmNlLCB0bXAsIF9yZXNvdXJjZXMsIHJlc291cmNlcykKKworI2RlZmluZSBmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmcmVzb3VyY2UtPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9ucykKKworI2RlZmluZSBmb3JfZWFjaF9jb25uZWN0aW9uX3JjdShjb25uZWN0aW9uLCByZXNvdXJjZSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvbm5lY3Rpb24sICZyZXNvdXJjZS0+Y29ubmVjdGlvbnMsIGNvbm5lY3Rpb25zKQorCisjZGVmaW5lIGZvcl9lYWNoX2Nvbm5lY3Rpb25fc2FmZShjb25uZWN0aW9uLCB0bXAsIHJlc291cmNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5lY3Rpb24sIHRtcCwgJnJlc291cmNlLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbnMpCisKKyNkZWZpbmUgZm9yX2VhY2hfcGVlcl9kZXZpY2UocGVlcl9kZXZpY2UsIGRldmljZSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlcl9kZXZpY2UsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3BlZXJfZGV2aWNlX3JjdShwZWVyX2RldmljZSwgZGV2aWNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocGVlcl9kZXZpY2UsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3BlZXJfZGV2aWNlX3NhZmUocGVlcl9kZXZpY2UsIHRtcCwgZGV2aWNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfZGV2aWNlLCB0bXAsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkZXZpY2VfdG9fbWlub3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZHJiZF9jb25mICopaWRyX2ZpbmQoJnRjb25uLT52b2x1bWVzLCB2bnIpOworCXJldHVybiBkZXZpY2UtPm1pbm9yOwogfQogCiAvKgpAQCAtMTA3NSw5NiArODY3LDkzIEBACiAJRERTRl9OT19SRVNZTkMgPSAyLCAvKiBEbyBub3QgcnVuIGEgcmVzeW5jIGZvciB0aGUgbmV3IHNwYWNlICovCiB9OwogCi1leHRlcm4gdm9pZCBkcmJkX2luaXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9pbml0X3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiBleHRlcm4gaW50ICBkcmJkX3RocmVhZF9zdGFydChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CiBleHRlcm4gdm9pZCBfZHJiZF90aHJlYWRfc3RvcChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSwgaW50IHJlc3RhcnQsIGludCB3YWl0KTsKLWV4dGVybiBjaGFyICpkcmJkX3Rhc2tfdG9fdGhyZWFkX25hbWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogI2lmZGVmIENPTkZJR19TTVAKIGV4dGVybiB2b2lkIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7Ci1leHRlcm4gdm9pZCBkcmJkX2NhbGNfY3B1X21hc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKICNlbHNlCiAjZGVmaW5lIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShBKSAoe30pCi0jZGVmaW5lIGRyYmRfY2FsY19jcHVfbWFzayhBKSAoe30pCiAjZW5kaWYKLWV4dGVybiB2b2lkIHRsX3JlbGVhc2Uoc3RydWN0IGRyYmRfdGNvbm4gKiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCitleHRlcm4gdm9pZCB0bF9yZWxlYXNlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0X3NpemUpOwotZXh0ZXJuIHZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfdGNvbm4gKik7Ci1leHRlcm4gdm9pZCBkcmJkX2ZyZWVfc29jayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZXh0ZXJuIGludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorZXh0ZXJuIHZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqKTsKK2V4dGVybiB2b2lkIGRyYmRfZnJlZV9zb2NrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIGludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkJICAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfYWxsKHN0cnVjdCBkcmJkX3Rjb25uICosIHN0cnVjdCBzb2NrZXQgKiwgdm9pZCAqLCBzaXplX3QsCitleHRlcm4gaW50IGRyYmRfc2VuZF9hbGwoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqLCBzdHJ1Y3Qgc29ja2V0ICosIHZvaWQgKiwgc2l6ZV90LAogCQkJIHVuc2lnbmVkKTsKIAotZXh0ZXJuIGludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9wYWNrZXQgY21kKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3Byb3RvY29sKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfc2l6ZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHRyaWdnZXJfcmVwbHksIGVudW0gZGRzX2ZsYWdzIGZsYWdzKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgcyk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfc3luY19wYXJhbShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfc2VuZF9iX2FjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHUzMiBiYXJyaWVyX25yLAorZXh0ZXJuIGludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCk7CitleHRlcm4gaW50IGRyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3V1aWRzKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOworZXh0ZXJuIGludCBkcmJkX3NlbmRfdXVpZHNfc2tpcF9pbml0aWFsX3N5bmMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9zaXplcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBpbnQgdHJpZ2dlcl9yZXBseSwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MpOworZXh0ZXJuIGludCBkcmJkX3NlbmRfc3RhdGUoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSBzKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9zeW5jX3BhcmFtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2JfYWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHUzMiBiYXJyaWVyX25yLAogCQkJICAgIHUzMiBzZXRfc2l6ZSk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9hY2soc3RydWN0IGRyYmRfY29uZiAqLCBlbnVtIGRyYmRfcGFja2V0LAorZXh0ZXJuIGludCBkcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGVudW0gZHJiZF9wYWNrZXQsCiAJCQkgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICopOwotZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2Fja19ycChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2V4dGVybiB2b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgZW51bSBkcmJkX3BhY2tldCwKIAkJCSAgICAgc3RydWN0IHBfYmxvY2tfcmVxICpycCk7Ci1leHRlcm4gdm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAorZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2Fja19kcChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBlbnVtIGRyYmRfcGFja2V0LAogCQkJICAgICBzdHJ1Y3QgcF9kYXRhICpkcCwgaW50IGRhdGFfc2l6ZSk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9hY2tfZXgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3BhY2tldCBjbWQsCitleHRlcm4gaW50IGRyYmRfc2VuZF9hY2tfZXgoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgZW51bSBkcmJkX3BhY2tldCwKIAkJCSAgICBzZWN0b3JfdCBzZWN0b3IsIGludCBibGtzaXplLCB1NjQgYmxvY2tfaWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICopOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfYmxvY2soc3RydWN0IGRyYmRfY29uZiAqLCBlbnVtIGRyYmRfcGFja2V0LAorZXh0ZXJuIGludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2Jsb2NrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGVudW0gZHJiZF9wYWNrZXQsCiAJCQkgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBjbWQsCitleHRlcm4gaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGludCBjbWQsCiAJCQkgICAgICBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLCB1NjQgYmxvY2tfaWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsCitleHRlcm4gaW50IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICBpbnQgc2l6ZSwgdm9pZCAqZGlnZXN0LCBpbnQgZGlnZXN0X3NpemUsCiAJCQkJICAgZW51bSBkcmJkX3BhY2tldCBjbWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LHNlY3Rvcl90IHNlY3RvcixpbnQgc2l6ZSk7CitleHRlcm4gaW50IGRyYmRfc2VuZF9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpOwogCi1leHRlcm4gaW50IGRyYmRfc2VuZF9iaXRtYXAoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOwotZXh0ZXJuIHZvaWQgY29ubl9zZW5kX3NyX3JlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOworZXh0ZXJuIGludCBkcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGRyYmRfc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBlbnVtIGRyYmRfc3RhdGVfcnYgcmV0Y29kZSk7CitleHRlcm4gdm9pZCBjb25uX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOwogZXh0ZXJuIHZvaWQgZHJiZF9mcmVlX2JjKHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpsZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfbWRldl9jbGVhbnVwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotdm9pZCBkcmJkX3ByaW50X3V1aWRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKnRleHQpOworZXh0ZXJuIHZvaWQgZHJiZF9kZXZpY2VfY2xlYW51cChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7Cit2b2lkIGRyYmRfcHJpbnRfdXVpZHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKnRleHQpOwogCi1leHRlcm4gdm9pZCBjb25uX21kX3N5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdm9pZCAqYnVmZmVyKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgIGRyYmRfbWRfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIF9kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfdXVpZF9uZXdfY3VycmVudChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0X2JtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgX19kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWdzKSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX21kX2NsZWFyX2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWdzKV9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiB2b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCBkcmJkX21kX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCAgZHJiZF9tZF9yZWFkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldik7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBfZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGlkeCwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF91dWlkX25ld19jdXJyZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0X2JtKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBfX2RyYmRfdXVpZF9zZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBmbGFncykgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZ3MpX19tdXN0X2hvbGQobG9jYWwpOwogZXh0ZXJuIGludCBkcmJkX21kX3Rlc3RfZmxhZyhzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqLCBpbnQpOwogI2lmbmRlZiBEUkJEX0RFQlVHX01EX1NZTkMKLWV4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAjZWxzZQogI2RlZmluZSBkcmJkX21kX21hcmtfZGlydHkobSkJZHJiZF9tZF9tYXJrX2RpcnR5XyhtLCBfX0xJTkVfXyAsIF9fZnVuY19fICkKLWV4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eV8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eV8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCXVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKTsKICNlbmRpZgotZXh0ZXJuIHZvaWQgZHJiZF9xdWV1ZV9iaXRtYXBfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKLQkJCQkgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2NvbmYgKiksCi0JCQkJIHZvaWQgKCpkb25lKShzdHJ1Y3QgZHJiZF9jb25mICosIGludCksCitleHRlcm4gdm9pZCBkcmJkX3F1ZXVlX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJCQkgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKKwkJCQkgdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpLAogCQkJCSBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncyk7Ci1leHRlcm4gaW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAorZXh0ZXJuIGludCBkcmJkX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKIAkJY2hhciAqd2h5LCBlbnVtIGJtX2ZsYWcgZmxhZ3MpOwotZXh0ZXJuIGludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAotCQlpbnQgKCppb19mbikoc3RydWN0IGRyYmRfY29uZiAqKSwKK2V4dGVybiBpbnQgZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCisJCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiksCiAJCWNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKTsKLWV4dGVybiBpbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX2JtaW9fY2xlYXJfbl93cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfbGRldl9kZXN0cm95KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIGludCBkcmJkX2JtaW9fc2V0X25fd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX2JtaW9fY2xlYXJfbl93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAKIC8qIE1ldGEgZGF0YSBsYXlvdXQKICAqCkBAIC0xMzUwLDUyICsxMTM5LDUyIEBACiAjZGVmaW5lIERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCAoMVUgPDwgMTUpIC8qIEhlYWRlciA4MCBvbmx5IGFsbG93cyBwYWNrZXRzIHVwIHRvIDMyS2lCIGRhdGEgKi8KICNkZWZpbmUgRFJCRF9NQVhfQklPX1NJWkVfUDk1ICAgICgxVSA8PCAxNykgLyogUHJvdG9jb2wgOTUgdG8gOTkgYWxsb3dzIGJpb3MgdXAgdG8gMTI4S2lCICovCiAKLWV4dGVybiBpbnQgIGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fcmVzaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvcnMsIGludCBzZXRfbmV3X2JpdHMpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhbnVwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9zZXRfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhcl9hbGwoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gaW50ICBkcmJkX2JtX2luaXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCAgZHJiZF9ibV9yZXNpemUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvcnMsIGludCBzZXRfbmV3X2JpdHMpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhbnVwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGRyYmRfYm1fc2V0X2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAvKiBzZXQvY2xlYXIvdGVzdCBvbmx5IGEgZmV3IGJpdHMgYXQgYSB0aW1lICovCiBleHRlcm4gaW50ICBkcmJkX2JtX3NldF9iaXRzKAotCQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIHMsIHVuc2lnbmVkIGxvbmcgZSk7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHMsIHVuc2lnbmVkIGxvbmcgZSk7CiBleHRlcm4gaW50ICBkcmJkX2JtX2NsZWFyX2JpdHMoCi0JCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlKTsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlKTsKIGV4dGVybiBpbnQgZHJiZF9ibV9jb3VudF9iaXRzKAotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpOwogLyogYm1fc2V0X2JpdHMgdmFyaWFudCBmb3IgdXNlIHdoaWxlIGhvbGRpbmcgZHJiZF9ibV9sb2NrLAogICogbWF5IHByb2Nlc3MgdGhlIHdob2xlIGJpdG1hcCBpbiBvbmUgZ28gKi8KLWV4dGVybiB2b2lkIF9kcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitleHRlcm4gdm9pZCBfZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpOwotZXh0ZXJuIGludCAgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJpdG5yKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fZV93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBlbnIpOwotZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9wYWdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBwYWdlX25yKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIGludCBkcmJkX2JtX3dyaXRlX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gaW50ICBkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHNpemVfdAkgICAgIGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcmJkX2JtX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gc2VjdG9yX3QgICAgICBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIGludCAgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBiaXRucik7CitleHRlcm4gaW50ICBkcmJkX2JtX2Vfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGVucik7CitleHRlcm4gaW50ICBkcmJkX2JtX3dyaXRlX3BhZ2Uoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgIGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9tYXJrX2Zvcl93cml0ZW91dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHBhZ2VfbnIpOworZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgZHJiZF9ibV93cml0ZV9hbGwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgIGRyYmRfYm1fd3JpdGVfY29weV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHNpemVfdAkgICAgIGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJiZF9ibV9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBzZWN0b3JfdCAgICAgIGRyYmRfYm1fY2FwYWNpdHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogCiAjZGVmaW5lIERSQkRfRU5EX09GX0JJVE1BUAkofih1bnNpZ25lZCBsb25nKTApCi1leHRlcm4gdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKIC8qIGJtX2ZpbmRfbmV4dCB2YXJpYW50cyBmb3IgdXNlIHdoaWxlIHlvdSBob2xkIGRyYmRfYm1fbG9jaygpICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBibV9mbyk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9kcmJkX2JtX3RvdGFsX3dlaWdodChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX2JtX3JzX2RvbmUoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fZmluZF9uZXh0X3plcm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBpbnQgZHJiZF9ibV9yc19kb25lKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIC8qIGZvciByZWNlaXZlX2JpdG1hcCAqLwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwKK2V4dGVybiB2b2lkIGRyYmRfYm1fbWVyZ2VfbGVsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzaXplX3Qgb2Zmc2V0LAogCQlzaXplX3QgbnVtYmVyLCB1bnNpZ25lZCBsb25nICpidWZmZXIpOwogLyogZm9yIF9kcmJkX3NlbmRfYml0bWFwICovCi1leHRlcm4gdm9pZCBkcmJkX2JtX2dldF9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwKK2V4dGVybiB2b2lkIGRyYmRfYm1fZ2V0X2xlbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2l6ZV90IG9mZnNldCwKIAkJc2l6ZV90IG51bWJlciwgdW5zaWduZWQgbG9uZyAqYnVmZmVyKTsKIAotZXh0ZXJuIHZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKTsKLWV4dGVybiB2b2lkIGRyYmRfYm1fdW5sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncyk7CitleHRlcm4gdm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAvKiBkcmJkX21haW4uYyAqLwogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmRyYmRfcmVxdWVzdF9jYWNoZTsKQEAgLTE0MzksMzUgKzEyMjgsNDAgQEAKIAogZXh0ZXJuIHJ3bG9ja190IGdsb2JhbF9zdGF0ZV9sb2NrOwogCi1leHRlcm4gaW50IGNvbm5fbG93ZXN0X21pbm9yKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfcmV0X2NvZGUgY29ubl9uZXdfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgbWlub3IsIGludCB2bnIpOwotZXh0ZXJuIHZvaWQgZHJiZF9taW5vcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKTsKK2V4dGVybiBpbnQgY29ubl9sb3dlc3RfbWlub3Ioc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgdW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdm5yKTsKK2V4dGVybiB2b2lkIGRyYmRfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgZHJiZF9kZWxldGVfZGV2aWNlKHN0cnVjdCBkcmJkX2RldmljZSAqbWRldik7CiAKLWV4dGVybiBpbnQgc2V0X3Jlc291cmNlX29wdGlvbnMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcmVzX29wdHMgKnJlc19vcHRzKTsKLWV4dGVybiBzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cyk7Ci1leHRlcm4gdm9pZCBjb25uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpOwotc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKK2V4dGVybiBzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqZHJiZF9jcmVhdGVfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcmJkX2ZyZWVfcmVzb3VyY2Uoc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlKTsKKworZXh0ZXJuIGludCBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpOworZXh0ZXJuIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpOworZXh0ZXJuIHZvaWQgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24oc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKIAkJCQkJICAgIHZvaWQgKnBlZXJfYWRkciwgaW50IHBlZXJfYWRkcl9sZW4pOwotZXh0ZXJuIHZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOworZXh0ZXJuIHN0cnVjdCBkcmJkX3Jlc291cmNlICpkcmJkX2ZpbmRfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2Uoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogZXh0ZXJuIGludCBwcm9jX2RldGFpbHM7CiAKIC8qIGRyYmRfcmVxICovCiBleHRlcm4gdm9pZCBkb19zdWJtaXQoc3RydWN0IHdvcmtfc3RydWN0ICp3cyk7Ci1leHRlcm4gdm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9fZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICosIHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKLWV4dGVybiBpbnQgZHJiZF9yZWFkX3JlbW90ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIGludCBkcmJkX3JlYWRfcmVtb3RlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOwogZXh0ZXJuIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpOwogZXh0ZXJuIGludCBpc192YWxpZF9hcl9oYW5kbGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqLCBzZWN0b3JfdCk7CiAKIAogLyogZHJiZF9ubC5jICovCiBleHRlcm4gaW50IGRyYmRfbXNnX3B1dF9pbmZvKGNvbnN0IGNoYXIgKmluZm8pOwotZXh0ZXJuIHZvaWQgZHJiZF9zdXNwZW5kX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gdm9pZCBkcmJkX3N1c3BlbmRfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogZXh0ZXJuIGNoYXIgKnBwc2l6ZShjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKTsKLWV4dGVybiBzZWN0b3JfdCBkcmJkX25ld19kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICosIHNlY3Rvcl90LCBpbnQpOworZXh0ZXJuIHNlY3Rvcl90IGRyYmRfbmV3X2Rldl9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqLCBzZWN0b3JfdCwgaW50KTsKIGVudW0gZGV0ZXJtaW5lX2Rldl9zaXplIHsKIAlEU19FUlJPUl9TSFJJTksgPSAtMywKIAlEU19FUlJPUl9TUEFDRV9NRCA9IC0yLApAQCAtMTQ3OCw0OCArMTI3Miw0NyBAQAogCURTX0dSRVdfRlJPTV9aRVJPID0gMywKIH07CiBleHRlcm4gZW51bSBkZXRlcm1pbmVfZGV2X3NpemUKLWRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKHN0cnVjdCBkcmJkX2NvbmYgKiwgZW51bSBkZHNfZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KHN0cnVjdCBkcmJkX2NvbmYgKik7Ci1leHRlcm4gdm9pZCBkcmJkX3JlY29uc2lkZXJfbWF4X2Jpb19zaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBkcmJkX3NldF9yb2xlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitkcmJkX2RldGVybWluZV9kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgZW51bSBkZHNfZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKikgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KHN0cnVjdCBkcmJkX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIGRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBkcmJkX3NldF9yb2xlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQllbnVtIGRyYmRfcm9sZSBuZXdfcm9sZSwKIAkJCQkJaW50IGZvcmNlKTsKLWV4dGVybiBib29sIGNvbm5fdHJ5X291dGRhdGVfcGVlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZXh0ZXJuIHZvaWQgY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfa2hlbHBlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjaGFyICpjbWQpOworZXh0ZXJuIGJvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIHZvaWQgY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIGludCBkcmJkX2toZWxwZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmNtZCk7CiAKIC8qIGRyYmRfd29ya2VyLmMgKi8KIGV4dGVybiBpbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpOwotZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBvX21pbm9yKTsKLXZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfc3RhcnRfcmVzeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9jb25ucyBzaWRlKTsKLWV4dGVybiB2b2lkIHJlc3VtZV9uZXh0X3NnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgZHJiZF9yZXN5bmNfZmluaXNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9yZXN5bmNfYWZ0ZXJfdmFsaWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBvX21pbm9yKTsKK3ZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX3N0YXJ0X3Jlc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Nvbm5zIHNpZGUpOworZXh0ZXJuIHZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IGRyYmRfcmVzeW5jX2ZpbmlzaGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIC8qIG1heWJlIHJhdGhlciBkcmJkX21haW4uYyA/ICovCi1leHRlcm4gdm9pZCAqZHJiZF9tZF9nZXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9tZF9wdXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgKmRyYmRfbWRfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX21kX3B1dF9idWZmZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHJ3KTsKLWV4dGVybiB2b2lkIGRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQoc3RydWN0IGRyYmRfY29uZiAqLCBzZWN0b3JfdCwgaW50KTsKLWV4dGVybiB2b2lkIHdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc2VjdG9yX3QsIGludCk7CitleHRlcm4gdm9pZCB3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCXN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2LCB1bnNpZ25lZCBpbnQgKmRvbmUpOwotZXh0ZXJuIHZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG92X291dF9vZl9zeW5jX3ByaW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgb3Zfb3V0X29mX3N5bmNfcHJpbnQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKG1kZXYtPm92X2xhc3Rfb29zX3NpemUpIHsKLQkJZGV2X2VycihERVYsICJPdXQgb2Ygc3luYzogc3RhcnQ9JWxsdSwgc2l6ZT0lbHUgKHNlY3RvcnMpXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+b3ZfbGFzdF9vb3Nfc3RhcnQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSk7CisJaWYgKGRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSkgeworCQlkcmJkX2VycihkZXZpY2UsICJPdXQgb2Ygc3luYzogc3RhcnQ9JWxsdSwgc2l6ZT0lbHUgKHNlY3RvcnMpXG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5vdl9sYXN0X29vc19zdGFydCwKKwkJICAgICAodW5zaWduZWQgbG9uZylkZXZpY2UtPm92X2xhc3Rfb29zX3NpemUpOwogCX0KLQltZGV2LT5vdl9sYXN0X29vc19zaXplPTA7CisJZGV2aWNlLT5vdl9sYXN0X29vc19zaXplID0gMDsKIH0KIAogCi1leHRlcm4gdm9pZCBkcmJkX2NzdW1fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGNyeXB0b19oYXNoICosIHN0cnVjdCBiaW8gKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGRyYmRfY3N1bV9lZShzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBjcnlwdG9faGFzaCAqLAotCQkJIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgZHJiZF9jc3VtX2JpbyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKiwgc3RydWN0IGJpbyAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgZHJiZF9jc3VtX2VlKHN0cnVjdCBjcnlwdG9faGFzaCAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwgdm9pZCAqKTsKIC8qIHdvcmtlciBjYWxsYmFja3MgKi8KIGV4dGVybiBpbnQgd19lX2VuZF9kYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfZV9lbmRfcnNkYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CkBAIC0xNTI5LDEwICsxMzIyLDggQEAKIGV4dGVybiBpbnQgd19vdl9maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfcmVzeW5jX3RpbWVyKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19zZW5kX3dyaXRlX2hpbnQoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwotZXh0ZXJuIGludCB3X21ha2VfcmVzeW5jX3JlcXVlc3Qoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwogZXh0ZXJuIGludCB3X3NlbmRfZGJsb2NrKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19zZW5kX3JlYWRfcmVxKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKLWV4dGVybiBpbnQgd19wcmV2X3dvcmtfZG9uZShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfZV9yZWlzc3VlKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19yZXN0YXJ0X2Rpc2tfaW8oc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwogZXh0ZXJuIGludCB3X3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwpAQCAtMTU0MiwyNyArMTMzMywyNCBAQAogZXh0ZXJuIHZvaWQgc3RhcnRfcmVzeW5jX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIGRyYmRfcmVjZWl2ZXIuYyAqLwotZXh0ZXJuIGludCBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKTsKLWV4dGVybiBpbnQgZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKiwKK2V4dGVybiBpbnQgZHJiZF9yZWNlaXZlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CitleHRlcm4gaW50IGRyYmRfYXNlbmRlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CitleHRlcm4gaW50IGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKTsKK2V4dGVybiBpbnQgZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLAogCQkJCSAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwgY29uc3QgdW5zaWduZWQsCiAJCQkJICAgIGNvbnN0IGludCk7Ci1leHRlcm4gaW50IGRyYmRfZnJlZV9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgbGlzdF9oZWFkICopOwotZXh0ZXJuIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqZHJiZF9hbGxvY19wZWVyX3JlcShzdHJ1Y3QgZHJiZF9jb25mICosIHU2NCwKK2V4dGVybiBpbnQgZHJiZF9mcmVlX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc3RydWN0IGxpc3RfaGVhZCAqKTsKK2V4dGVybiBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKmRyYmRfYWxsb2NfcGVlcl9yZXEoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdTY0LAogCQkJCQkJICAgICBzZWN0b3JfdCwgdW5zaWduZWQgaW50LAogCQkJCQkJICAgICBnZnBfdCkgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwKK2V4dGVybiB2b2lkIF9fZHJiZF9mcmVlX3BlZXJfcmVxKHN0cnVjdCBkcmJkX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwKIAkJCQkgaW50KTsKICNkZWZpbmUgZHJiZF9mcmVlX3BlZXJfcmVxKG0sZSkgX19kcmJkX2ZyZWVfcGVlcl9yZXEobSwgZSwgMCkKICNkZWZpbmUgZHJiZF9mcmVlX25ldF9wZWVyX3JlcShtLGUpIF9fZHJiZF9mcmVlX3BlZXJfcmVxKG0sIGUsIDEpCi1leHRlcm4gc3RydWN0IHBhZ2UgKmRyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqLCB1bnNpZ25lZCBpbnQsIGJvb2wpOwotZXh0ZXJuIHZvaWQgZHJiZF9zZXRfcmVjdl90Y3Eoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHRjcV9lbmFibGVkKTsKLWV4dGVybiB2b2lkIF9kcmJkX2NsZWFyX2RvbmVfZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGxpc3RfaGVhZCAqdG9fYmVfZnJlZWQpOwotZXh0ZXJuIHZvaWQgY29ubl9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiBpbnQgZHJiZF9jb25uZWN0ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKLXsKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZShtZGV2LT50Y29ubik7Ci19CitleHRlcm4gc3RydWN0IHBhZ2UgKmRyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdW5zaWduZWQgaW50LCBib29sKTsKK2V4dGVybiB2b2lkIGRyYmRfc2V0X3JlY3ZfdGNxKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgdGNxX2VuYWJsZWQpOworZXh0ZXJuIHZvaWQgX2RyYmRfY2xlYXJfZG9uZV9lZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9fYmVfZnJlZWQpOworZXh0ZXJuIGludCBkcmJkX2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqKTsKIAogLyogWWVzLCB0aGVyZSBpcyBrZXJuZWxfc2V0c29ja29wdCwgYnV0IG9ubHkgc2luY2UgMi42LjE4LgogICogU28gd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgaXQgaGVyZS4gKi8KQEAgLTE2MTMsNyArMTQwMSw3IEBACiAJCQkoY2hhciopJnZhbCwgc2l6ZW9mKHZhbCkpOwogfQogCi12b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3byk7Cit2b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIHdyaXRlX29yZGVyaW5nX2Ugd28pOwogCiAvKiBkcmJkX3Byb2MuYyAqLwogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJiZF9wcm9jOwpAQCAtMTYyMiwyOSArMTQxMCwyOSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfcm9sZV9zdHIoZW51bSBkcmJkX3JvbGUgcyk7CiAKIC8qIGRyYmRfYWN0bG9nLmMgKi8KLWV4dGVybiBpbnQgZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBib29sIGRlbGVnYXRlKTsKLWV4dGVybiBib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpOwotZXh0ZXJuIHZvaWQgZHJiZF9hbF9iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FsX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKTsKLWV4dGVybiB2b2lkIGRyYmRfcnNfY29tcGxldGVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKTsKLWV4dGVybiBpbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpOwotZXh0ZXJuIGludCBkcmJkX3RyeV9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpOwotZXh0ZXJuIHZvaWQgZHJiZF9yc19jYW5jZWxfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3JzX2RlbF9hbGwoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIGludCBkcmJkX2FsX2JlZ2luX2lvX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSk7CitleHRlcm4gYm9vbCBkcmJkX2FsX2JlZ2luX2lvX2Zhc3RwYXRoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX3JzX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpOworZXh0ZXJuIGludCBkcmJkX3JzX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpOworZXh0ZXJuIGludCBkcmJkX3RyeV9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKTsKK2V4dGVybiB2b2lkIGRyYmRfcnNfY2FuY2VsX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IGRyYmRfcnNfZGVsX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FkdmFuY2VfcnNfbWFya3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBzdGlsbF90b19nbyk7Ci1leHRlcm4gdm9pZCBfX2RyYmRfc2V0X2luX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLAorZXh0ZXJuIHZvaWQgZHJiZF9hZHZhbmNlX3JzX21hcmtzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHN0aWxsX3RvX2dvKTsKK2V4dGVybiB2b2lkIF9fZHJiZF9zZXRfaW5fc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAogCQlpbnQgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpOwotI2RlZmluZSBkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSkgXAotCV9fZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKLWV4dGVybiBpbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisjZGVmaW5lIGRyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUpIFwKKwlfX2RyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKK2V4dGVybiBpbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAogCQlpbnQgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpOwotI2RlZmluZSBkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCBzZWN0b3IsIHNpemUpIFwKLQlfX2RyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQotZXh0ZXJuIHZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gaW50IGRyYmRfaW5pdGlhbGl6ZV9hbChzdHJ1Y3QgZHJiZF9jb25mICosIHZvaWQgKik7CisjZGVmaW5lIGRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKSBcCisJX19kcmJkX3NldF9vdXRfb2Zfc3luYyhkZXZpY2UsIHNlY3Rvciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorZXh0ZXJuIHZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX2luaXRpYWxpemVfYWwoc3RydWN0IGRyYmRfZGV2aWNlICosIHZvaWQgKik7CiAKIC8qIGRyYmRfbmwuYyAqLwogLyogc3RhdGUgaW5mbyBicm9hZGNhc3QgKi8KQEAgLTE2NjEsNyArMTQ0OSw3IEBACiAJCX07CiAJfTsKIH07Ci12b2lkIGRyYmRfYmNhc3RfZXZlbnQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3Qgc3RydWN0IHNpYl9pbmZvICpzaWIpOwordm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBzdHJ1Y3Qgc2liX2luZm8gKnNpYik7CiAKIC8qCiAgKiBpbmxpbmUgaGVscGVyIGZ1bmN0aW9ucwpAQCAtMTY5MCwyNiArMTQ3OCwyNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGVudW0gZHJiZF9zdGF0ZV9ydgotX2RyYmRfc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitfZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzLCBzdHJ1Y3QgY29tcGxldGlvbiAqZG9uZSkKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKIAlyZWFkX2xvY2soJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlydiA9IF9fZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGZsYWdzLCBkb25lKTsKKwlydiA9IF9fZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZmxhZ3MsIGRvbmUpOwogCXJlYWRfdW5sb2NrKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5pb24gZHJiZF9zdGF0ZSBkcmJkX3JlYWRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdW5pb24gZHJiZF9zdGF0ZSBkcmJkX3JlYWRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKIAl1bmlvbiBkcmJkX3N0YXRlIHJ2OwogCi0JcnYuaSA9IG1kZXYtPnN0YXRlLmk7Ci0JcnYuc3VzcCA9IG1kZXYtPnRjb25uLT5zdXNwOwotCXJ2LnN1c3Bfbm9kID0gbWRldi0+dGNvbm4tPnN1c3Bfbm9kOwotCXJ2LnN1c3BfZmVuID0gbWRldi0+dGNvbm4tPnN1c3BfZmVuOworCXJ2LmkgPSBkZXZpY2UtPnN0YXRlLmk7CisJcnYuc3VzcCA9IHJlc291cmNlLT5zdXNwOworCXJ2LnN1c3Bfbm9kID0gcmVzb3VyY2UtPnN1c3Bfbm9kOworCXJ2LnN1c3BfZmVuID0gcmVzb3VyY2UtPnN1c3BfZmVuOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtMTcyMiwyMiArMTUxMSwyMiBAQAogfTsKIAogI2RlZmluZSBfX2RyYmRfY2hrX2lvX2Vycm9yKG0sZikgX19kcmJkX2Noa19pb19lcnJvcl8obSxmLCBfX2Z1bmNfXykKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RyYmRfY2hrX2lvX2Vycm9yXyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIF9fZHJiZF9jaGtfaW9fZXJyb3JfKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQllbnVtIGRyYmRfZm9yY2VfZGV0YWNoX2ZsYWdzIGRmLAogCQljb25zdCBjaGFyICp3aGVyZSkKIHsKIAllbnVtIGRyYmRfaW9fZXJyb3JfcCBlcDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQllcCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5vbl9pb19lcnJvcjsKKwllcCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPm9uX2lvX2Vycm9yOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoZXApIHsKIAljYXNlIEVQX1BBU1NfT046IC8qIEZJWE1FIHdvdWxkIHRoaXMgYmUgYmV0dGVyIG5hbWVkICJJZ25vcmUiPyAqLwogCQlpZiAoZGYgPT0gRFJCRF9SRUFEX0VSUk9SIHx8IGRmID09IERSQkRfV1JJVEVfRVJST1IpIHsKIAkJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJCWRldl9lcnIoREVWLCAiTG9jYWwgSU8gZmFpbGVkIGluICVzLlxuIiwgd2hlcmUpOwotCQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX0lOQ09OU0lTVEVOVCkKLQkJCQlfZHJiZF9zZXRfc3RhdGUoX05TKG1kZXYsIGRpc2ssIERfSU5DT05TSVNURU5UKSwgQ1NfSEFSRCwgTlVMTCk7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiTG9jYWwgSU8gZmFpbGVkIGluICVzLlxuIiwgd2hlcmUpOworCQkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA+IERfSU5DT05TSVNURU5UKQorCQkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBkaXNrLCBEX0lOQ09OU0lTVEVOVCksIENTX0hBUkQsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogTk9URSBmYWxsIHRocm91Z2ggZm9yIERSQkRfTUVUQV9JT19FUlJPUiBvciBEUkJEX0ZPUkNFX0RFVEFDSCAqLwpAQCAtMTc2MywxNCArMTU1MiwxNCBAQAogCQkgKiB3ZSByZWFkIG1ldGEgZGF0YSBvbmx5IG9uY2UgZHVyaW5nIGF0dGFjaCwKIAkJICogd2hpY2ggd2lsbCBmYWlsIGluIGNhc2Ugb2YgZXJyb3JzLgogCQkgKi8KLQkJc2V0X2JpdChXQVNfSU9fRVJST1IsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoV0FTX0lPX0VSUk9SLCAmZGV2aWNlLT5mbGFncyk7CiAJCWlmIChkZiA9PSBEUkJEX1JFQURfRVJST1IpCi0JCQlzZXRfYml0KFdBU19SRUFEX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOworCQkJc2V0X2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCQlpZiAoZGYgPT0gRFJCRF9GT1JDRV9ERVRBQ0gpCi0JCQlzZXRfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKTsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX0ZBSUxFRCkgewotCQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBkaXNrLCBEX0ZBSUxFRCksIENTX0hBUkQsIE5VTEwpOwotCQkJZGV2X2VycihERVYsCisJCQlzZXRfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9GQUlMRUQpIHsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBkaXNrLCBEX0ZBSUxFRCksIENTX0hBUkQsIE5VTEwpOworCQkJZHJiZF9lcnIoZGV2aWNlLAogCQkJCSJMb2NhbCBJTyBmYWlsZWQgaW4gJXMuIERldGFjaGluZy4uLlxuIiwgd2hlcmUpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTc3OSwyMSArMTU2OCwyMSBAQAogCiAvKioKICAqIGRyYmRfY2hrX2lvX2Vycm9yOiBIYW5kbGUgdGhlIG9uX2lvX2Vycm9yIHNldHRpbmcsIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhbGwgaW8gY29tcGxldGlvbiBoYW5kbGVycwotICogQG1kZXY6CSBEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CSBEUkJEIGRldmljZS4KICAqIEBlcnJvcjoJIEVycm9yIGNvZGUgcGFzc2VkIHRvIHRoZSBJTyBjb21wbGV0aW9uIGNhbGxiYWNrCiAgKiBAZm9yY2VkZXRhY2g6IEZvcmNlIGRldGFjaC4gSS5lLiB0aGUgZXJyb3IgaGFwcGVuZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBtZXRhIGRhdGEKICAqCiAgKiBTZWUgYWxzbyBkcmJkX21haW4uYzphZnRlcl9zdGF0ZV9jaCgpIGlmIChvcy5kaXNrID4gRF9GQUlMRUQgJiYgbnMuZGlzayA9PSBEX0ZBSUxFRCkKICAqLwogI2RlZmluZSBkcmJkX2Noa19pb19lcnJvcihtLGUsZikgZHJiZF9jaGtfaW9fZXJyb3JfKG0sZSxmLCBfX2Z1bmNfXykKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2Noa19pb19lcnJvcl8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2Noa19pb19lcnJvcl8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJaW50IGVycm9yLCBlbnVtIGRyYmRfZm9yY2VfZGV0YWNoX2ZsYWdzIGZvcmNlZGV0YWNoLCBjb25zdCBjaGFyICp3aGVyZSkKIHsKIAlpZiAoZXJyb3IpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOwotCQlfX2RyYmRfY2hrX2lvX2Vycm9yXyhtZGV2LCBmb3JjZWRldGFjaCwgd2hlcmUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3JfKGRldmljZSwgZm9yY2VkZXRhY2gsIHdoZXJlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTE5MTYsMzEgKzE3MDUsMzMgQEAKIAl3YWtlX3VwKCZxLT5xX3dhaXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9hc2VuZGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2V4dGVybiB2b2lkIGRyYmRfZmx1c2hfd29ya3F1ZXVlKHN0cnVjdCBkcmJkX3dvcmtfcXVldWUgKndvcmtfcXVldWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9hc2VuZGVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JaWYgKHRlc3RfYml0KFNJR05BTF9BU0VOREVSLCAmdGNvbm4tPmZsYWdzKSkKLQkJZm9yY2Vfc2lnKERSQkRfU0lHLCB0Y29ubi0+YXNlbmRlci50YXNrKTsKKwlpZiAodGVzdF9iaXQoU0lHTkFMX0FTRU5ERVIsICZjb25uZWN0aW9uLT5mbGFncykpCisJCWZvcmNlX3NpZyhEUkJEX1NJRywgY29ubmVjdGlvbi0+YXNlbmRlci50YXNrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJlcXVlc3RfcGluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcmVxdWVzdF9waW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc2V0X2JpdChTRU5EX1BJTkcsICZ0Y29ubi0+ZmxhZ3MpOwotCXdha2VfYXNlbmRlcih0Y29ubik7CisJc2V0X2JpdChTRU5EX1BJTkcsICZjb25uZWN0aW9uLT5mbGFncyk7CisJd2FrZV9hc2VuZGVyKGNvbm5lY3Rpb24pOwogfQogCi1leHRlcm4gdm9pZCAqY29ubl9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfdGNvbm4gKiwgc3RydWN0IGRyYmRfc29ja2V0ICopOwotZXh0ZXJuIHZvaWQgKmRyYmRfcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGRyYmRfc29ja2V0ICopOwotZXh0ZXJuIGludCBjb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF90Y29ubiAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKiwKK2V4dGVybiB2b2lkICpjb25uX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHN0cnVjdCBkcmJkX3NvY2tldCAqKTsKK2V4dGVybiB2b2lkICpkcmJkX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKik7CitleHRlcm4gaW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgc3RydWN0IGRyYmRfc29ja2V0ICosCiAJCQkgICAgIGVudW0gZHJiZF9wYWNrZXQsIHVuc2lnbmVkIGludCwgdm9pZCAqLAogCQkJICAgICB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX3NvY2tldCAqLAorZXh0ZXJuIGludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKiwKIAkJCSAgICAgZW51bSBkcmJkX3BhY2tldCwgdW5zaWduZWQgaW50LCB2b2lkICosCiAJCQkgICAgIHVuc2lnbmVkIGludCk7CiAKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3BpbmdfYWNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKLWV4dGVybiBpbnQgY29ubl9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF90Y29ubiAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9waW5nX2FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKK2V4dGVybiBpbnQgY29ubl9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHVuaW9uIGRyYmRfc3RhdGUsIHVuaW9uIGRyYmRfc3RhdGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJiZF90aHJlYWRfc3RvcChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKQEAgLTE5NzksMjIgKzE3NzAsMjIgQEAKICAqICBfcmVxX21vZChyZXEsIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKQogICogICAgIFtmcm9tIHRsX2NsZWFyX2JhcnJpZXJdCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbmNfYXBfcGVuZGluZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGluY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWF0b21pY19pbmMoJm1kZXYtPmFwX3BlbmRpbmdfY250KTsKKwlhdG9taWNfaW5jKCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KTsKIH0KIAogI2RlZmluZSBFUlJfSUZfQ05UX0lTX05FR0FUSVZFKHdoaWNoLCBmdW5jLCBsaW5lKQkJCVwKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPndoaWNoKSA8IDApCQkJCVwKLQkJZGV2X2VycihERVYsICJpbiAlczolZDogIiAjd2hpY2ggIiA9ICVkIDwgMCAhXG4iLAlcCisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPndoaWNoKSA8IDApCQkJCVwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiaW4gJXM6JWQ6ICIgI3doaWNoICIgPSAlZCA8IDAgIVxuIiwJXAogCQkJZnVuYywgbGluZSwJCQkJCVwKLQkJCWF0b21pY19yZWFkKCZtZGV2LT53aGljaCkpCisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT53aGljaCkpCiAKLSNkZWZpbmUgZGVjX2FwX3BlbmRpbmcobWRldikgX2RlY19hcF9wZW5kaW5nKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfYXBfcGVuZGluZyhkZXZpY2UpIF9kZWNfYXBfcGVuZGluZyhkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRldi0+YXBfcGVuZGluZ19jbnQpKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KSkKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCUVSUl9JRl9DTlRfSVNfTkVHQVRJVkUoYXBfcGVuZGluZ19jbnQsIGZ1bmMsIGxpbmUpOwogfQogCkBAIC0yMDA0LDE1ICsxNzk1LDE1IEBACiAgKiBDX1NZTkNfU09VUkNFIHNlbmRzIFBfUlNfREFUQV9SRVBMWSAgIChhbmQgZXhwZWN0cyBQX1dSSVRFX0FDSyB3aXRoIElEX1NZTkNFUikKICAqCQkJCQkgICAob3IgUF9ORUdfQUNLIHdpdGggSURfU1lOQ0VSKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX3JzX3BlbmRpbmcoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfcnNfcGVuZGluZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlhdG9taWNfaW5jKCZtZGV2LT5yc19wZW5kaW5nX2NudCk7CisJYXRvbWljX2luYygmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiB9CiAKLSNkZWZpbmUgZGVjX3JzX3BlbmRpbmcobWRldikgX2RlY19yc19wZW5kaW5nKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY19yc19wZW5kaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfcnNfcGVuZGluZyhkZXZpY2UpIF9kZWNfcnNfcGVuZGluZyhkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY19yc19wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlhdG9taWNfZGVjKCZtZGV2LT5yc19wZW5kaW5nX2NudCk7CisJYXRvbWljX2RlYygmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiAJRVJSX0lGX0NOVF9JU19ORUdBVElWRShyc19wZW5kaW5nX2NudCwgZnVuYywgbGluZSk7CiB9CiAKQEAgLTIwMjUsMTAzICsxODE2LDEwNCBAQAogICogIHJlY2VpdmVfRGF0YVJlcXVlc3QgKHJlY2VpdmVfUlNEYXRhUmVxdWVzdCkgd2UgbmVlZCB0byBzZW5kIGJhY2sgUF9EQVRBCiAgKiAgcmVjZWl2ZV9CYXJyaWVyXyoJd2UgbmVlZCB0byBzZW5kIGEgUF9CQVJSSUVSX0FDSwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX3VuYWNrZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfdW5hY2tlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlhdG9taWNfaW5jKCZtZGV2LT51bmFja2VkX2NudCk7CisJYXRvbWljX2luYygmZGV2aWNlLT51bmFja2VkX2NudCk7CiB9CiAKLSNkZWZpbmUgZGVjX3VuYWNrZWQobWRldikgX2RlY191bmFja2VkKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY191bmFja2VkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfdW5hY2tlZChkZXZpY2UpIF9kZWNfdW5hY2tlZChkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY191bmFja2VkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlhdG9taWNfZGVjKCZtZGV2LT51bmFja2VkX2NudCk7CisJYXRvbWljX2RlYygmZGV2aWNlLT51bmFja2VkX2NudCk7CiAJRVJSX0lGX0NOVF9JU19ORUdBVElWRSh1bmFja2VkX2NudCwgZnVuYywgbGluZSk7CiB9CiAKLSNkZWZpbmUgc3ViX3VuYWNrZWQobWRldiwgbikgX3N1Yl91bmFja2VkKG1kZXYsIG4sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX3N1Yl91bmFja2VkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBuLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKKyNkZWZpbmUgc3ViX3VuYWNrZWQoZGV2aWNlLCBuKSBfc3ViX3VuYWNrZWQoZGV2aWNlLCBuLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorc3RhdGljIGlubGluZSB2b2lkIF9zdWJfdW5hY2tlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IG4sIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewotCWF0b21pY19zdWIobiwgJm1kZXYtPnVuYWNrZWRfY250KTsKKwlhdG9taWNfc3ViKG4sICZkZXZpY2UtPnVuYWNrZWRfY250KTsKIAlFUlJfSUZfQ05UX0lTX05FR0FUSVZFKHVuYWNrZWRfY250LCBmdW5jLCBsaW5lKTsKIH0KIAogLyoqCi0gKiBnZXRfbGRldigpIC0gSW5jcmVhc2UgdGhlIHJlZiBjb3VudCBvbiBtZGV2LT5sZGV2LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbGRldgorICogZ2V0X2xkZXYoKSAtIEluY3JlYXNlIHRoZSByZWYgY291bnQgb24gZGV2aWNlLT5sZGV2LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbGRldgogICogQE06CQlEUkJEIGRldmljZS4KICAqCi0gKiBZb3UgaGF2ZSB0byBjYWxsIHB1dF9sZGV2KCkgd2hlbiBmaW5pc2hlZCB3b3JraW5nIHdpdGggbWRldi0+bGRldi4KKyAqIFlvdSBoYXZlIHRvIGNhbGwgcHV0X2xkZXYoKSB3aGVuIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCBkZXZpY2UtPmxkZXYuCiAgKi8KICNkZWZpbmUgZ2V0X2xkZXYoTSkgX19jb25kX2xvY2sobG9jYWwsIF9nZXRfbGRldl9pZl9zdGF0ZShNLERfSU5DT05TSVNURU5UKSkKICNkZWZpbmUgZ2V0X2xkZXZfaWZfc3RhdGUoTSxNSU5TKSBfX2NvbmRfbG9jayhsb2NhbCwgX2dldF9sZGV2X2lmX3N0YXRlKE0sTUlOUykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGRldihzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHB1dF9sZGV2KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWludCBpID0gYXRvbWljX2RlY19yZXR1cm4oJm1kZXYtPmxvY2FsX2NudCk7CisJaW50IGkgPSBhdG9taWNfZGVjX3JldHVybigmZGV2aWNlLT5sb2NhbF9jbnQpOwogCiAJLyogVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gc29tZSBlbmRpbyBoYW5kbGVyLAogCSAqIHNvIHdlIG11c3Qgbm90IHNsZWVwIGhlcmUuICovCiAKIAlfX3JlbGVhc2UobG9jYWwpOwotCURfQVNTRVJUKGkgPj0gMCk7CisJRF9BU1NFUlQoZGV2aWNlLCBpID49IDApOwogCWlmIChpID09IDApIHsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTKQogCQkJLyogZXZlbiBpbnRlcm5hbCByZWZlcmVuY2VzIGdvbmUsIHNhZmUgdG8gZGVzdHJveSAqLwotCQkJZHJiZF9sZGV2X2Rlc3Ryb3kobWRldik7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKSB7CisJCQlkcmJkX2xkZXZfZGVzdHJveShkZXZpY2UpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKSB7CiAJCQkvKiBhbGwgYXBwbGljYXRpb24gSU8gcmVmZXJlbmNlcyBnb25lLiAqLwotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdPX0RJU0tMRVNTLCAmbWRldi0+ZmxhZ3MpKQotCQkJCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+Z29fZGlza2xlc3MpOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdPX0RJU0tMRVNTLCAmZGV2aWNlLT5mbGFncykpCisJCQkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSZkZXZpY2UtPmdvX2Rpc2tsZXNzKTsKIAkJfQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAJfQogfQogCiAjaWZuZGVmIF9fQ0hFQ0tFUl9fCi1zdGF0aWMgaW5saW5lIGludCBfZ2V0X2xkZXZfaWZfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKK3N0YXRpYyBpbmxpbmUgaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKIHsKIAlpbnQgaW9fYWxsb3dlZDsKIAogCS8qIG5ldmVyIGdldCBhIHJlZmVyZW5jZSB3aGlsZSBEX0RJU0tMRVNTICovCi0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MpCiAJCXJldHVybiAwOwogCi0JYXRvbWljX2luYygmbWRldi0+bG9jYWxfY250KTsKLQlpb19hbGxvd2VkID0gKG1kZXYtPnN0YXRlLmRpc2sgPj0gbWlucyk7CisJYXRvbWljX2luYygmZGV2aWNlLT5sb2NhbF9jbnQpOworCWlvX2FsbG93ZWQgPSAoZGV2aWNlLT5zdGF0ZS5kaXNrID49IG1pbnMpOwogCWlmICghaW9fYWxsb3dlZCkKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIGlvX2FsbG93ZWQ7CiB9CiAjZWxzZQotZXh0ZXJuIGludCBfZ2V0X2xkZXZfaWZfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucyk7CitleHRlcm4gaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucyk7CiAjZW5kaWYKIAogLyogeW91IG11c3QgaGF2ZSBhbiAiZ2V0X2xkZXYiIHJlZmVyZW5jZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJdW5zaWduZWQgbG9uZyAqYml0c19sZWZ0LCB1bnNpZ25lZCBpbnQgKnBlcl9taWxfZG9uZSkKIHsKIAkvKiB0aGlzIGlzIHRvIGJyZWFrIGl0IGF0IGNvbXBpbGUgdGltZSB3aGVuIHdlIGNoYW5nZSB0aGF0LCBpbiBjYXNlIHdlCiAJICogd2FudCB0byBzdXBwb3J0IG1vcmUgdGhhbiAoMTw8MzIpIGJpdHMgb24gYSAzMmJpdCBhcmNoLiAqLwotCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBtZGV2LT5yc190b3RhbCk7CisJdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGRldmljZS0+cnNfdG90YWwpOwogCiAJLyogbm90ZTogYm90aCByc190b3RhbCBhbmQgcnNfbGVmdCBhcmUgaW4gYml0cywgaS5lLiBpbgogCSAqIHVuaXRzIG9mIEJNX0JMT0NLX1NJWkUuCiAJICogZm9yIHRoZSBwZXJjZW50YWdlLCB3ZSBkb24ndCBjYXJlLiAqLwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCSpiaXRzX2xlZnQgPSBtZGV2LT5vdl9sZWZ0OworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKKwkJKmJpdHNfbGVmdCA9IGRldmljZS0+b3ZfbGVmdDsKIAllbHNlCi0JCSpiaXRzX2xlZnQgPSBkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSAtIG1kZXYtPnJzX2ZhaWxlZDsKKwkJKmJpdHNfbGVmdCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgLSBkZXZpY2UtPnJzX2ZhaWxlZDsKIAkvKiA+PiAxMCB0byBwcmV2ZW50IG92ZXJmbG93LAogCSAqICsxIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybyAqLwotCWlmICgqYml0c19sZWZ0ID4gbWRldi0+cnNfdG90YWwpIHsKKwlpZiAoKmJpdHNfbGVmdCA+IGRldmljZS0+cnNfdG90YWwpIHsKIAkJLyogZG9oLiBtYXliZSBhIGxvZ2ljIGJ1ZyBzb21ld2hlcmUuCiAJCSAqIG1heSBhbHNvIGJlIGp1c3QgYSByYWNlIGNvbmRpdGlvbgogCQkgKiBiZXR3ZWVuIHRoaXMgYW5kIGEgZGlzY29ubmVjdCBkdXJpbmcgc3luYy4KIAkJICogZm9yIG5vdywganVzdCBwcmV2ZW50IGluLWtlcm5lbCBidWZmZXIgb3ZlcmZsb3cuCiAJCSAqLwogCQlzbXBfcm1iKCk7Ci0JCWRldl93YXJuKERFViwgImNzOiVzIHJzX2xlZnQ9JWx1ID4gcnNfdG90YWw9JWx1IChyc19mYWlsZWQgJWx1KVxuIiwKLQkJCQlkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pLAotCQkJCSpiaXRzX2xlZnQsIG1kZXYtPnJzX3RvdGFsLCBtZGV2LT5yc19mYWlsZWQpOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiY3M6JXMgcnNfbGVmdD0lbHUgPiByc190b3RhbD0lbHUgKHJzX2ZhaWxlZCAlbHUpXG4iLAorCQkJCWRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSwKKwkJCQkqYml0c19sZWZ0LCBkZXZpY2UtPnJzX3RvdGFsLCBkZXZpY2UtPnJzX2ZhaWxlZCk7CiAJCSpwZXJfbWlsX2RvbmUgPSAwOwogCX0gZWxzZSB7CiAJCS8qIE1ha2Ugc3VyZSB0aGUgZGl2aXNpb24gaGFwcGVucyBpbiBsb25nIGNvbnRleHQuCkBAIC0yMTMzLDkgKzE5MjUsOSBAQAogCQkgKiBOb3RlOiBjdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBzdWNoIGxhcmdlIGJpdG1hcHMgb24gMzJiaXQKIAkJICogYXJjaCBhbnl3YXlzLCBidXQgbm8gaGFybSBkb25lIHRvIGJlIHByZXBhcmVkIGZvciBpdCBoZXJlLgogCQkgKi8KLQkJdW5zaWduZWQgaW50IHNoaWZ0ID0gbWRldi0+cnNfdG90YWwgPiBVSU5UX01BWCA/IDE2IDogMTA7CisJCXVuc2lnbmVkIGludCBzaGlmdCA9IGRldmljZS0+cnNfdG90YWwgPiBVSU5UX01BWCA/IDE2IDogMTA7CiAJCXVuc2lnbmVkIGxvbmcgbGVmdCA9ICpiaXRzX2xlZnQgPj4gc2hpZnQ7Ci0JCXVuc2lnbmVkIGxvbmcgdG90YWwgPSAxVUwgKyAobWRldi0+cnNfdG90YWwgPj4gc2hpZnQpOworCQl1bnNpZ25lZCBsb25nIHRvdGFsID0gMVVMICsgKGRldmljZS0+cnNfdG90YWwgPj4gc2hpZnQpOwogCQl1bnNpZ25lZCBsb25nIHRtcCA9IDEwMDBVTCAtIGxlZnQgKiAxMDAwVUwvdG90YWw7CiAJCSpwZXJfbWlsX2RvbmUgPSB0bXA7CiAJfQpAQCAtMjE0NSwyMiArMTkzNywyMiBAQAogLyogdGhpcyB0aHJvdHRsZXMgb24tdGhlLWZseSBhcHBsaWNhdGlvbiByZXF1ZXN0cwogICogYWNjb3JkaW5nIHRvIG1heF9idWZmZXJzIHNldHRpbmdzOwogICogbWF5YmUgcmUtaW1wbGVtZW50IHVzaW5nIHNlbWFwaG9yZXM/ICovCi1zdGF0aWMgaW5saW5lIGludCBkcmJkX2dldF9tYXhfYnVmZmVycyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9nZXRfbWF4X2J1ZmZlcnMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgbXhiOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCW14YiA9IG5jID8gbmMtPm1heF9idWZmZXJzIDogMTAwMDAwMDsgIC8qIGFyYml0cmFyeSBsaW1pdCBvbiBvcGVuIHJlcXVlc3RzICovCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gbXhiOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkcmJkX3N0YXRlX2lzX3N0YWJsZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9zdGF0ZV9pc19zdGFibGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JdW5pb24gZHJiZF9kZXZfc3RhdGUgcyA9IG1kZXYtPnN0YXRlOworCXVuaW9uIGRyYmRfZGV2X3N0YXRlIHMgPSBkZXZpY2UtPnN0YXRlOwogCiAJLyogRE8gTk9UIGFkZCBhIGRlZmF1bHQgY2xhdXNlLCB3ZSB3YW50IHRoZSBjb21waWxlciB0byB3YXJuIHVzCiAJICogZm9yIGFueSBuZXdseSBpbnRyb2R1Y2VkIHN0YXRlIHdlIG1heSBoYXZlIGZvcmdvdHRlbiB0byBhZGQgaGVyZSAqLwpAQCAtMjE5NCw3ICsxOTg2LDcgQEAKIAogCQkvKiBBbGxvdyBJTyBpbiBCTSBleGNoYW5nZSBzdGF0ZXMgd2l0aCBuZXcgcHJvdG9jb2xzICovCiAJY2FzZSBDX1dGX0JJVE1BUF9TOgotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2KQorCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7CiAKQEAgLTIyMjgsMjAgKzIwMjAsMjAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHJiZF9zdXNwZW5kZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgaW50IGRyYmRfc3VzcGVuZGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IGRldmljZS0+cmVzb3VyY2U7CiAKLQlyZXR1cm4gdGNvbm4tPnN1c3AgfHwgdGNvbm4tPnN1c3BfZmVuIHx8IHRjb25uLT5zdXNwX25vZDsKKwlyZXR1cm4gcmVzb3VyY2UtPnN1c3AgfHwgcmVzb3VyY2UtPnN1c3BfZmVuIHx8IHJlc291cmNlLT5zdXNwX25vZDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIG1heV9pbmNfYXBfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgbWF5X2luY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKG1kZXYpOworCWludCBteGIgPSBkcmJkX2dldF9tYXhfYnVmZmVycyhkZXZpY2UpOwogCi0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKQorCWlmIChkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHRlc3RfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KFNVU1BFTkRfSU8sICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogdG8gYXZvaWQgcG90ZW50aWFsIGRlYWRsb2NrIG9yIGJpdG1hcCBjb3JydXB0aW9uLApAQCAtMjI0OSwzMiArMjA0MSwzMiBAQAogCSAqIHRvIHN0YXJ0IGR1cmluZyAic3RhYmxlIiBzdGF0ZXMuICovCiAKIAkvKiBubyBuZXcgaW8gYWNjZXB0ZWQgd2hlbiBhdHRhY2hpbmcgb3IgZGV0YWNoaW5nIHRoZSBkaXNrICovCi0JaWYgKCFkcmJkX3N0YXRlX2lzX3N0YWJsZShtZGV2KSkKKwlpZiAoIWRyYmRfc3RhdGVfaXNfc3RhYmxlKGRldmljZSkpCiAJCXJldHVybiBmYWxzZTsKIAogCS8qIHNpbmNlIHNvbWUgb2xkZXIga2VybmVscyBkb24ndCBoYXZlIGF0b21pY19hZGRfdW5sZXNzLAogCSAqIGFuZCB3ZSBhcmUgd2l0aGluIHRoZSBzcGlubG9jayBhbnl3YXlzLCB3ZSBoYXZlIHRoaXMgd29ya2Fyb3VuZC4gICovCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSA+IG14YikKKwlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+YXBfYmlvX2NudCkgPiBteGIpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAodGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5jX2FwX2Jpb19jb25kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgaW5jX2FwX2Jpb19jb25kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWJvb2wgcnYgPSBmYWxzZTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcnYgPSBtYXlfaW5jX2FwX2JpbyhtZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcnYgPSBtYXlfaW5jX2FwX2JpbyhkZXZpY2UpOwogCWlmIChydikKLQkJYXRvbWljX2luYygmbWRldi0+YXBfYmlvX2NudCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlhdG9taWNfaW5jKCZkZXZpY2UtPmFwX2Jpb19jbnQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX2FwX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGluY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogd2Ugd2FpdCBoZXJlCiAJICogICAgYXMgbG9uZyBhcyB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZApAQCAtMjI4NCw0MiArMjA3Niw0NCBAQAogCSAqIHRvIGF2b2lkIHJhY2VzIHdpdGggdGhlIHJlY29ubmVjdCBjb2RlLAogCSAqIHdlIG5lZWQgdG8gYXRvbWljX2luYyB3aXRoaW4gdGhlIHNwaW5sb2NrLiAqLwogCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsIGluY19hcF9iaW9fY29uZChtZGV2KSk7CisJd2FpdF9ldmVudChkZXZpY2UtPm1pc2Nfd2FpdCwgaW5jX2FwX2Jpb19jb25kKGRldmljZSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVjX2FwX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGRlY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKG1kZXYpOwotCWludCBhcF9iaW8gPSBhdG9taWNfZGVjX3JldHVybigmbWRldi0+YXBfYmlvX2NudCk7CisJaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKGRldmljZSk7CisJaW50IGFwX2JpbyA9IGF0b21pY19kZWNfcmV0dXJuKCZkZXZpY2UtPmFwX2Jpb19jbnQpOwogCi0JRF9BU1NFUlQoYXBfYmlvID49IDApOworCURfQVNTRVJUKGRldmljZSwgYXBfYmlvID49IDApOwogCi0JaWYgKGFwX2JpbyA9PSAwICYmIHRlc3RfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKSkgewotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQklUTUFQX0lPX1FVRVVFRCwgJm1kZXYtPmZsYWdzKSkKLQkJCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+Ym1faW9fd29yay53KTsKKwlpZiAoYXBfYmlvID09IDAgJiYgdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZkZXZpY2UtPmZsYWdzKSkKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+CisJCQkJY29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJmRldmljZS0+Ym1faW9fd29yay53KTsKIAl9CiAKIAkvKiB0aGlzIGN1cnJlbnRseSBkb2VzIHdha2VfdXAgZm9yIGV2ZXJ5IGRlY19hcF9iaW8hCiAJICogbWF5YmUgcmF0aGVyIGludHJvZHVjZSBzb21lIHR5cGUgb2YgaHlzdGVyZXNpcz8KIAkgKiBlLmcuIChhcF9iaW8gPT0gbXhiLzIgfHwgYXBfYmlvID09IDApID8gKi8KIAlpZiAoYXBfYmlvIDwgbXhiKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlyZXR1cm4gbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NyAmJgotCQltZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uICE9IDEwMDsKKwlyZXR1cm4gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk3ICYmCisJCWZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiAhPSAxMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfc2V0X2VkX3V1aWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IHZhbCkKK3N0YXRpYyBpbmxpbmUgaW50IGRyYmRfc2V0X2VkX3V1aWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHU2NCB2YWwpCiB7Ci0JaW50IGNoYW5nZWQgPSBtZGV2LT5lZF91dWlkICE9IHZhbDsKLQltZGV2LT5lZF91dWlkID0gdmFsOworCWludCBjaGFuZ2VkID0gZGV2aWNlLT5lZF91dWlkICE9IHZhbDsKKwlkZXZpY2UtPmVkX3V1aWQgPSB2YWw7CiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfcXVldWVfb3JkZXJfdHlwZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9xdWV1ZV9vcmRlcl90eXBlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIHNvcnJ5LCB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3b3JraW5nIGltcGxlbWVudGF0aW9uCiAJICogb2YgZGlzdHJpYnV0ZWQgVENRIHN0dWZmICovCkBAIC0yMzI5LDIzICsyMTIzLDI5IEBACiAJcmV0dXJuIFFVRVVFX09SREVSRURfTk9ORTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRyYmRfbWRfZmx1c2goc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX21kX2ZsdXNoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCByOwogCi0JaWYgKG1kZXYtPmxkZXYgPT0gTlVMTCkgewotCQlkZXZfd2FybihERVYsICJtZGV2LT5sZGV2ID09IE5VTEwgaW4gZHJiZF9tZF9mbHVzaFxuIik7CisJaWYgKGRldmljZS0+bGRldiA9PSBOVUxMKSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJkZXZpY2UtPmxkZXYgPT0gTlVMTCBpbiBkcmJkX21kX2ZsdXNoXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlyID0gYmxrZGV2X2lzc3VlX2ZsdXNoKG1kZXYtPmxkZXYtPm1kX2JkZXYsIEdGUF9OT0lPLCBOVUxMKTsKKwlyID0gYmxrZGV2X2lzc3VlX2ZsdXNoKGRldmljZS0+bGRldi0+bWRfYmRldiwgR0ZQX05PSU8sIE5VTEwpOwogCWlmIChyKSB7Ci0JCXNldF9iaXQoTURfTk9fRlVBLCAmbWRldi0+ZmxhZ3MpOwotCQlkZXZfZXJyKERFViwgIm1ldGEgZGF0YSBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQsIGRpc2FibGluZyBtZC1mbHVzaGVzXG4iLCByKTsKKwkJc2V0X2JpdChNRF9OT19GVUEsICZkZXZpY2UtPmZsYWdzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YSBkYXRhIGZsdXNoIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCwgZGlzYWJsaW5nIG1kLWZsdXNoZXNcbiIsIHIpOwogCX0KIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpmaXJzdF9jb25uZWN0aW9uKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmcmVzb3VyY2UtPmNvbm5lY3Rpb25zLAorCQkJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMKaW5kZXggOTI5NDY4ZS4uMzMxZTVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX21haW4uYwpAQCAtNTIsMTYgKzUyLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9kcmJkX2xpbWl0cy5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiIC8qIG9ubHkgZm9yIF9yZXFfbW9kIGluIHRsX3JlbGVhc2UgYW5kIHRsX2NsZWFyICovCiAKICNpbmNsdWRlICJkcmJkX3ZsaS5oIgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGRyYmRfbWFpbl9tdXRleCk7Ci1pbnQgZHJiZGRfaW5pdChzdHJ1Y3QgZHJiZF90aHJlYWQgKik7Ci1pbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICopOwotaW50IGRyYmRfYXNlbmRlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKik7Ci0KLWludCBkcmJkX2luaXQodm9pZCk7CiBzdGF0aWMgaW50IGRyYmRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpOwogc3RhdGljIHZvaWQgZHJiZF9yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpnZCwgZm1vZGVfdCBtb2RlKTsKIHN0YXRpYyBpbnQgd19tZF9zeW5jKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpOwpAQCAtMTE4LDggKzExNCw4IEBACiAvKiBpbiAyLjYueCwgb3VyIGRldmljZSBtYXBwaW5nIGFuZCBjb25maWcgaW5mbyBjb250YWlucyBvdXIgdmlydHVhbCBnZW5kaXNrcwogICogYXMgbWVtYmVyICJzdHJ1Y3QgZ2VuZGlzayAqdmRpc2s7IgogICovCi1zdHJ1Y3QgaWRyIG1pbm9yczsKLXN0cnVjdCBsaXN0X2hlYWQgZHJiZF90Y29ubnM7ICAvKiBsaXN0IG9mIHN0cnVjdCBkcmJkX3Rjb25uICovCitzdHJ1Y3QgaWRyIGRyYmRfZGV2aWNlczsKK3N0cnVjdCBsaXN0X2hlYWQgZHJiZF9yZXNvdXJjZXM7CiAKIHN0cnVjdCBrbWVtX2NhY2hlICpkcmJkX3JlcXVlc3RfY2FjaGU7CiBzdHJ1Y3Qga21lbV9jYWNoZSAqZHJiZF9lZV9jYWNoZTsJLyogcGVlciByZXF1ZXN0cyAqLwpAQCAtMTY2LDE1ICsxNjIsMTUgQEAKIC8qIFdoZW4gY2hlY2tpbmcgd2l0aCBzcGFyc2UsIGFuZCB0aGlzIGlzIGFuIGlubGluZSBmdW5jdGlvbiwgc3BhcnNlIHdpbGwKICAgIGdpdmUgdG9ucyBvZiBmYWxzZSBwb3NpdGl2ZXMuIFdoZW4gdGhpcyBpcyBhIHJlYWwgZnVuY3Rpb25zIHNwYXJzZSB3b3Jrcy4KICAqLwotaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfZGlza19zdGF0ZSBtaW5zKQoraW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKIHsKIAlpbnQgaW9fYWxsb3dlZDsKIAotCWF0b21pY19pbmMoJm1kZXYtPmxvY2FsX2NudCk7Ci0JaW9fYWxsb3dlZCA9IChtZGV2LT5zdGF0ZS5kaXNrID49IG1pbnMpOworCWF0b21pY19pbmMoJmRldmljZS0+bG9jYWxfY250KTsKKwlpb19hbGxvd2VkID0gKGRldmljZS0+c3RhdGUuZGlzayA+PSBtaW5zKTsKIAlpZiAoIWlvX2FsbG93ZWQpIHsKLQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1kZXYtPmxvY2FsX2NudCkpCi0JCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2aWNlLT5sb2NhbF9jbnQpKQorCQkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCX0KIAlyZXR1cm4gaW9fYWxsb3dlZDsKIH0KQEAgLTE4Myw3ICsxNzksNyBAQAogCiAvKioKICAqIHRsX3JlbGVhc2UoKSAtIG1hcmsgYXMgQkFSUklFUl9BQ0tFRCBhbGwgcmVxdWVzdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNmZXIgbG9nIGVwb2NoCi0gKiBAdGNvbm46CURSQkQgY29ubmVjdGlvbi4KKyAqIEBjb25uZWN0aW9uOglEUkJEIGNvbm5lY3Rpb24uCiAgKiBAYmFycmllcl9ucjoJRXhwZWN0ZWQgaWRlbnRpZmllciBvZiB0aGUgRFJCRCB3cml0ZSBiYXJyaWVyIHBhY2tldC4KICAqIEBzZXRfc2l6ZToJRXhwZWN0ZWQgbnVtYmVyIG9mIHJlcXVlc3RzIGJlZm9yZSB0aGF0IGJhcnJpZXIuCiAgKgpAQCAtMTkxLDcgKzE4Nyw3IEBACiAgKiBlcG9jaCBvZiBub3QgeWV0IGJhcnJpZXItYWNrZWQgcmVxdWVzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCBjYXVzZSBhCiAgKiB0ZXJtaW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbi4KICAqLwotdm9pZCB0bF9yZWxlYXNlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCit2b2lkIHRsX3JlbGVhc2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCiAJCXVuc2lnbmVkIGludCBzZXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyOwpAQCAtMTk5LDExICsxOTUsMTEgQEAKIAlpbnQgZXhwZWN0X2Vwb2NoID0gMDsKIAlpbnQgZXhwZWN0X3NpemUgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJLyogZmluZCBvbGRlc3Qgbm90IHlldCBiYXJyaWVyLWFja2VkIHdyaXRlIHJlcXVlc3QsCiAJICogY291bnQgd3JpdGVzIGluIGl0cyBlcG9jaC4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZ0Y29ubi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmNvbm5lY3Rpb24tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKIAkJY29uc3QgdW5zaWduZWQgcyA9IHItPnJxX3N0YXRlOwogCQlpZiAoIXJlcSkgewogCQkJaWYgKCEocyAmIFJRX1dSSVRFKSkKQEAgLTIyOCwxOCArMjI0LDE4IEBACiAKIAkvKiBmaXJzdCBzb21lIHBhcmFub2lhIGNvZGUgKi8KIAlpZiAocmVxID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkLCBidXQgbm8gZXBvY2ggaW4gdGwhP1xuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQsIGJ1dCBubyBlcG9jaCBpbiB0bCE/XG4iLAogCQkJIGJhcnJpZXJfbnIpOwogCQlnb3RvIGJhaWw7CiAJfQogCWlmIChleHBlY3RfZXBvY2ggIT0gYmFycmllcl9ucikgewotCQljb25uX2Vycih0Y29ubiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQsIGV4cGVjdGVkICMldSFcbiIsCisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkLCBleHBlY3RlZCAjJXUhXG4iLAogCQkJIGJhcnJpZXJfbnIsIGV4cGVjdF9lcG9jaCk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKIAlpZiAoZXhwZWN0X3NpemUgIT0gc2V0X3NpemUpIHsKLQkJY29ubl9lcnIodGNvbm4sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkIHdpdGggbl93cml0ZXM9JXUsIGV4cGVjdGVkIG5fd3JpdGVzPSV1IVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQgd2l0aCBuX3dyaXRlcz0ldSwgZXhwZWN0ZWQgbl93cml0ZXM9JXUhXG4iLAogCQkJIGJhcnJpZXJfbnIsIHNldF9zaXplLCBleHBlY3Rfc2l6ZSk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0yNDgsOTAgKzI0NCw5MSBAQAogCS8qIHRoaXMgZXh0cmEgbGlzdCB3YWxrIHJlc3RhcnQgaXMgcGFyYW5vaWEsCiAJICogdG8gY2F0Y2ggcmVxdWVzdHMgYmVpbmcgYmFycmllci1hY2tlZCAidW5leHBlY3RlZGx5Ii4KIAkgKiBJdCB1c3VhbGx5IHNob3VsZCBmaW5kIHRoZSBzYW1lIHJlcSBhZ2Fpbiwgb3Igc29tZSBSRUFEIHByZWNlZGluZyBpdC4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnRjb25uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKIAkJaWYgKHJlcS0+ZXBvY2ggPT0gZXhwZWN0X2Vwb2NoKQogCQkJYnJlYWs7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2Zyb20ocmVxLCByLCAmdGNvbm4tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShyZXEsIHIsICZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CiAJCWlmIChyZXEtPmVwb2NoICE9IGV4cGVjdF9lcG9jaCkKIAkJCWJyZWFrOwogCQlfcmVxX21vZChyZXEsIEJBUlJJRVJfQUNLRUQpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuOwogCiBiYWlsOgotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfUFJPVE9DT0xfRVJST1IpLCBDU19IQVJEKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfUFJPVE9DT0xfRVJST1IpLCBDU19IQVJEKTsKIH0KIAogCiAvKioKICAqIF90bF9yZXN0YXJ0KCkgLSBXYWxrcyB0aGUgdHJhbnNmZXIgbG9nLCBhbmQgYXBwbGllcyBhbiBhY3Rpb24gdG8gYWxsIHJlcXVlc3RzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEB3aGF0OiAgICAgICBUaGUgYWN0aW9uL2V2ZW50IHRvIHBlcmZvcm0gd2l0aCBhbGwgcmVxdWVzdCBvYmplY3RzCiAgKgogICogQHdoYXQgbWlnaHQgYmUgb25lIG9mIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HLCBSRVNFTkQsIEZBSUxfRlJPWkVOX0RJU0tfSU8sCiAgKiBSRVNUQVJUX0ZST1pFTl9ESVNLX0lPLgogICovCiAvKiBtdXN0IGhvbGQgcmVzb3VyY2UtPnJlcV9sb2NrICovCi12b2lkIF90bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQordm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHIsICZ0Y29ubi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKIAkJX3JlcV9tb2QocmVxLCB3aGF0KTsKIH0KIAotdm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQordm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCkKIHsKLQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCV90bF9yZXN0YXJ0KHRjb25uLCB3aGF0KTsKLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfdGxfcmVzdGFydChjb25uZWN0aW9uLCB3aGF0KTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiB9CiAKIC8qKgogICogdGxfY2xlYXIoKSAtIENsZWFycyBhbGwgcmVxdWVzdHMgYW5kICZzdHJ1Y3QgZHJiZF90bF9lcG9jaCBvYmplY3RzIG91dCBvZiB0aGUgVEwKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIHdhcyBsb3N0LiBUaGUgc3RvcmFnZSBjb3ZlcmVkCiAgKiBieSB0aGUgcmVxdWVzdHMgb24gdGhlIHRyYW5zZmVyIGdldHMgbWFya2VkIGFzIG91ciBvZiBzeW5jLiBDYWxsZWQgZnJvbSB0aGUKICAqIHJlY2VpdmVyIHRocmVhZCBhbmQgdGhlIHdvcmtlciB0aHJlYWQuCiAgKi8KLXZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCB0bF9jbGVhcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXRsX3Jlc3RhcnQodGNvbm4sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKKwl0bF9yZXN0YXJ0KGNvbm5lY3Rpb24sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKIH0KIAogLyoqCi0gKiB0bF9hYm9ydF9kaXNrX2lvKCkgLSBBYm9ydCBkaXNrIEkvTyBmb3IgYWxsIHJlcXVlc3RzIGZvciBhIGNlcnRhaW4gbWRldiBpbiB0aGUgVEwKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIHRsX2Fib3J0X2Rpc2tfaW8oKSAtIEFib3J0IGRpc2sgSS9PIGZvciBhbGwgcmVxdWVzdHMgZm9yIGEgY2VydGFpbiBkZXZpY2UgaW4gdGhlIFRMCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqLwotdm9pZCB0bF9hYm9ydF9kaXNrX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqcjsKIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgciwgJnRjb25uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykgewogCQlpZiAoIShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORykpCiAJCQljb250aW51ZTsKLQkJaWYgKHJlcS0+dy5tZGV2ICE9IG1kZXYpCisJCWlmIChyZXEtPmRldmljZSAhPSBkZXZpY2UpCiAJCQljb250aW51ZTsKIAkJX3JlcV9tb2QocmVxLCBBQk9SVF9ESVNLX0lPKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogc3RhdGljIGludCBkcmJkX3RocmVhZF9zZXR1cCh2b2lkICphcmcpCiB7CiAJc3RydWN0IGRyYmRfdGhyZWFkICp0aGkgPSAoc3RydWN0IGRyYmRfdGhyZWFkICopIGFyZzsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IHRoaS0+cmVzb3VyY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwogCiAJc25wcmludGYoY3VycmVudC0+Y29tbSwgc2l6ZW9mKGN1cnJlbnQtPmNvbW0pLCAiZHJiZF8lY18lcyIsCi0JCSB0aGktPm5hbWVbMF0sIHRoaS0+dGNvbm4tPm5hbWUpOworCQkgdGhpLT5uYW1lWzBdLAorCQkgcmVzb3VyY2UtPm5hbWUpOwogCiByZXN0YXJ0OgogCXJldHZhbCA9IHRoaS0+ZnVuY3Rpb24odGhpKTsKQEAgLTM0OSw3ICszNDYsNyBAQAogCSAqLwogCiAJaWYgKHRoaS0+dF9zdGF0ZSA9PSBSRVNUQVJUSU5HKSB7Ci0JCWNvbm5faW5mbyh0Y29ubiwgIlJlc3RhcnRpbmcgJXMgdGhyZWFkXG4iLCB0aGktPm5hbWUpOworCQlkcmJkX2luZm8ocmVzb3VyY2UsICJSZXN0YXJ0aW5nICVzIHRocmVhZFxuIiwgdGhpLT5uYW1lKTsKIAkJdGhpLT50X3N0YXRlID0gUlVOTklORzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAkJZ290byByZXN0YXJ0OwpAQCAtMzYxLDI5ICszNTgsMzIgQEAKIAljb21wbGV0ZV9hbGwoJnRoaS0+c3RvcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAotCWNvbm5faW5mbyh0Y29ubiwgIlRlcm1pbmF0aW5nICVzXG4iLCBjdXJyZW50LT5jb21tKTsKKwlkcmJkX2luZm8ocmVzb3VyY2UsICJUZXJtaW5hdGluZyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAKIAkvKiBSZWxlYXNlIG1vZCByZWZlcmVuY2UgdGFrZW4gd2hlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQgKi8KIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJa3JlZl9wdXQoJnRoaS0+Y29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOworCWtyZWZfcHV0KCZyZXNvdXJjZS0+a3JlZiwgZHJiZF9kZXN0cm95X3Jlc291cmNlKTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3RocmVhZF9pbml0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfdGhyZWFkICp0aGksCi0JCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3QgZHJiZF90aHJlYWQgKiksIGNoYXIgKm5hbWUpCitzdGF0aWMgdm9pZCBkcmJkX3RocmVhZF9pbml0KHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgc3RydWN0IGRyYmRfdGhyZWFkICp0aGksCisJCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3QgZHJiZF90aHJlYWQgKiksIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJnRoaS0+dF9sb2NrKTsKIAl0aGktPnRhc2sgICAgPSBOVUxMOwogCXRoaS0+dF9zdGF0ZSA9IE5PTkU7CiAJdGhpLT5mdW5jdGlvbiA9IGZ1bmM7Ci0JdGhpLT50Y29ubiA9IHRjb25uOwotCXN0cm5jcHkodGhpLT5uYW1lLCBuYW1lLCBBUlJBWV9TSVpFKHRoaS0+bmFtZSkpOworCXRoaS0+cmVzb3VyY2UgPSByZXNvdXJjZTsKKwl0aGktPmNvbm5lY3Rpb24gPSBOVUxMOworCXRoaS0+bmFtZSA9IG5hbWU7CiB9CiAKIGludCBkcmJkX3RocmVhZF9zdGFydChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IHRoaS0+cmVzb3VyY2U7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zOTMsMTcgKzM5MywxOSBAQAogCiAJc3dpdGNoICh0aGktPnRfc3RhdGUpIHsKIAljYXNlIE5PTkU6Ci0JCWNvbm5faW5mbyh0Y29ubiwgIlN0YXJ0aW5nICVzIHRocmVhZCAoZnJvbSAlcyBbJWRdKVxuIiwKKwkJZHJiZF9pbmZvKHJlc291cmNlLCAiU3RhcnRpbmcgJXMgdGhyZWFkIChmcm9tICVzIFslZF0pXG4iLAogCQkJIHRoaS0+bmFtZSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAogCQkvKiBHZXQgcmVmIG9uIG1vZHVsZSBmb3IgdGhyZWFkIC0gdGhpcyBpcyByZWxlYXNlZCB3aGVuIHRocmVhZCBleGl0cyAqLwogCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgewotCQkJY29ubl9lcnIodGNvbm4sICJGYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgaW4gZHJiZF90aHJlYWRfc3RhcnRcbiIpOworCQkJZHJiZF9lcnIocmVzb3VyY2UsICJGYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgaW4gZHJiZF90aHJlYWRfc3RhcnRcbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCWtyZWZfZ2V0KCZ0aGktPnRjb25uLT5rcmVmKTsKKwkJa3JlZl9nZXQoJnJlc291cmNlLT5rcmVmKTsKKwkJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJCWtyZWZfZ2V0KCZ0aGktPmNvbm5lY3Rpb24tPmtyZWYpOwogCiAJCWluaXRfY29tcGxldGlvbigmdGhpLT5zdG9wKTsKIAkJdGhpLT5yZXNldF9jcHVfbWFzayA9IDE7CkBAIC00MTIsMTIgKzQxNCwxNCBAQAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOyAvKiBvdGhlcncuIG1heSBnZXQgLUVSRVNUQVJUTk9JTlRSICovCiAKIAkJbnQgPSBrdGhyZWFkX2NyZWF0ZShkcmJkX3RocmVhZF9zZXR1cCwgKHZvaWQgKikgdGhpLAotCQkJCSAgICAiZHJiZF8lY18lcyIsIHRoaS0+bmFtZVswXSwgdGhpLT50Y29ubi0+bmFtZSk7CisJCQkJICAgICJkcmJkXyVjXyVzIiwgdGhpLT5uYW1lWzBdLCB0aGktPnJlc291cmNlLT5uYW1lKTsKIAogCQlpZiAoSVNfRVJSKG50KSkgewotCQkJY29ubl9lcnIodGNvbm4sICJDb3VsZG4ndCBzdGFydCB0aHJlYWRcbiIpOworCQkJZHJiZF9lcnIocmVzb3VyY2UsICJDb3VsZG4ndCBzdGFydCB0aHJlYWRcbiIpOwogCi0JCQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOworCQkJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJCQlrcmVmX3B1dCgmdGhpLT5jb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCQlrcmVmX3B1dCgmcmVzb3VyY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9yZXNvdXJjZSk7CiAJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNDI5LDcgKzQzMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgRVhJVElORzoKIAkJdGhpLT50X3N0YXRlID0gUkVTVEFSVElORzsKLQkJY29ubl9pbmZvKHRjb25uLCAiUmVzdGFydGluZyAlcyB0aHJlYWQgKGZyb20gJXMgWyVkXSlcbiIsCisJCWRyYmRfaW5mbyhyZXNvdXJjZSwgIlJlc3RhcnRpbmcgJXMgdGhyZWFkIChmcm9tICVzIFslZF0pXG4iLAogCQkJCXRoaS0+bmFtZSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBSVU5OSU5HOgpAQCAtNDc4LDY1ICs0ODIsNjAgQEAKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmdGhpLT5zdG9wKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkcmJkX3RocmVhZCAqZHJiZF90YXNrX3RvX3RocmVhZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK2ludCBjb25uX2xvd2VzdF9taW5vcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX3RocmVhZCAqdGhpID0KLQkJdGFzayA9PSB0Y29ubi0+cmVjZWl2ZXIudGFzayA/ICZ0Y29ubi0+cmVjZWl2ZXIgOgotCQl0YXNrID09IHRjb25uLT5hc2VuZGVyLnRhc2sgID8gJnRjb25uLT5hc2VuZGVyIDoKLQkJdGFzayA9PSB0Y29ubi0+d29ya2VyLnRhc2sgICA/ICZ0Y29ubi0+d29ya2VyIDogTlVMTDsKLQotCXJldHVybiB0aGk7Ci19Ci0KLWNoYXIgKmRyYmRfdGFza190b190aHJlYWRfbmFtZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSA9IGRyYmRfdGFza190b190aHJlYWQodGNvbm4sIHRhc2spOwotCXJldHVybiB0aGkgPyB0aGktPm5hbWUgOiB0YXNrLT5jb21tOwotfQotCi1pbnQgY29ubl9sb3dlc3RfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQotewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7Ci0JaW50IHZuciA9IDAsIG07CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCWludCB2bnIgPSAwLCBtaW5vciA9IC0xOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW1kZXYgPSBpZHJfZ2V0X25leHQoJnRjb25uLT52b2x1bWVzLCAmdm5yKTsKLQltID0gbWRldiA/IG1kZXZfdG9fbWlub3IobWRldikgOiAtMTsKKwlwZWVyX2RldmljZSA9IGlkcl9nZXRfbmV4dCgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCAmdm5yKTsKKwlpZiAocGVlcl9kZXZpY2UpCisJCW1pbm9yID0gZGV2aWNlX3RvX21pbm9yKHBlZXJfZGV2aWNlLT5kZXZpY2UpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIG07CisJcmV0dXJuIG1pbm9yOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUAogLyoqCiAgKiBkcmJkX2NhbGNfY3B1X21hc2soKSAtIEdlbmVyYXRlIENQVSBtYXNrcywgc3ByZWFkIG92ZXIgYWxsIENQVXMKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KICAqCi0gKiBGb3JjZXMgYWxsIHRocmVhZHMgb2YgYSBkZXZpY2Ugb250byB0aGUgc2FtZSBDUFUuIFRoaXMgaXMgYmVuZWZpY2lhbCBmb3IKKyAqIEZvcmNlcyBhbGwgdGhyZWFkcyBvZiBhIHJlc291cmNlIG9udG8gdGhlIHNhbWUgQ1BVLiBUaGlzIGlzIGJlbmVmaWNpYWwgZm9yCiAgKiBEUkJEJ3MgcGVyZm9ybWFuY2UuIE1heSBiZSBvdmVyd3JpdHRlbiBieSB1c2VyJ3MgY29uZmlndXJhdGlvbi4KICAqLwotdm9pZCBkcmJkX2NhbGNfY3B1X21hc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgZHJiZF9jYWxjX2NwdV9tYXNrKGNwdW1hc2tfdmFyX3QgKmNwdV9tYXNrKQogewotCWludCBvcmQsIGNwdTsKKwl1bnNpZ25lZCBpbnQgKnJlc291cmNlc19wZXJfY3B1LCBtaW5faW5kZXggPSB+MDsKIAotCS8qIHVzZXIgb3ZlcnJpZGUuICovCi0JaWYgKGNwdW1hc2tfd2VpZ2h0KHRjb25uLT5jcHVfbWFzaykpCi0JCXJldHVybjsKKwlyZXNvdXJjZXNfcGVyX2NwdSA9IGt6YWxsb2MobnJfY3B1X2lkcyAqIHNpemVvZigqcmVzb3VyY2VzX3Blcl9jcHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzb3VyY2VzX3Blcl9jcHUpIHsKKwkJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCQl1bnNpZ25lZCBpbnQgY3B1LCBtaW4gPSB+MDsKIAotCW9yZCA9IGNvbm5fbG93ZXN0X21pbm9yKHRjb25uKSAlIGNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzayk7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKG9yZC0tID09IDApIHsKLQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHRjb25uLT5jcHVfbWFzayk7Ci0JCQlyZXR1cm47CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfcmVzb3VyY2VfcmN1KHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJCWZvcl9lYWNoX2NwdShjcHUsIHJlc291cmNlLT5jcHVfbWFzaykKKwkJCQlyZXNvdXJjZXNfcGVyX2NwdVtjcHVdKys7CiAJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlpZiAocmVzb3VyY2VzX3Blcl9jcHVbY3B1XSA8IG1pbikgeworCQkJCW1pbiA9IHJlc291cmNlc19wZXJfY3B1W2NwdV07CisJCQkJbWluX2luZGV4ID0gY3B1OworCQkJfQorCQl9CisJCWtmcmVlKHJlc291cmNlc19wZXJfY3B1KTsKIAl9Ci0JLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCi0JY3B1bWFza19zZXRhbGwodGNvbm4tPmNwdV9tYXNrKTsKKwlpZiAobWluX2luZGV4ID09IH4wKSB7CisJCWNwdW1hc2tfc2V0YWxsKCpjcHVfbWFzayk7CisJCXJldHVybjsKKwl9CisJY3B1bWFza19zZXRfY3B1KG1pbl9pbmRleCwgKmNwdV9tYXNrKTsKIH0KIAogLyoqCiAgKiBkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoKSAtIG1vZGlmaWVzIHRoZSBjcHUgbWFzayBvZiB0aGUgX2N1cnJlbnRfIHRocmVhZAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAdGhpOglkcmJkX3RocmVhZCBvYmplY3QKICAqCiAgKiBjYWxsIGluIHRoZSAibWFpbiBsb29wIiBvZiBfYWxsXyB0aHJlYWRzLCBubyBuZWVkIGZvciBhbnkgbXV0ZXgsIGN1cnJlbnQgd29uJ3QgZGllCkBAIC01NDQsMTMgKzU0MywxNiBAQAogICovCiB2b2lkIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSB0aGktPnJlc291cmNlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAKIAlpZiAoIXRoaS0+cmVzZXRfY3B1X21hc2spCiAJCXJldHVybjsKIAl0aGktPnJlc2V0X2NwdV9tYXNrID0gMDsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihwLCB0aGktPnRjb25uLT5jcHVfbWFzayk7CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIocCwgcmVzb3VyY2UtPmNwdV9tYXNrKTsKIH0KKyNlbHNlCisjZGVmaW5lIGRyYmRfY2FsY19jcHVfbWFzayhBKSAoe30pCiAjZW5kaWYKIAogLyoqCkBAIC01NjAsOSArNTYyLDkgQEAKICAqIHdvcmQgYWxpZ25lZCBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4gIChUaGUgYml0bWFwIHNlbmQgYW5kIHJlY2VpdmUgY29kZQogICogcmVsaWVzIG9uIHRoaXMuKQogICovCi11bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCit1bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWlmICh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDEwMCkgeworCWlmIChjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CiAJCUJVSUxEX0JVR19PTighSVNfQUxJR05FRChzaXplb2Yoc3RydWN0IHBfaGVhZGVyMTAwKSwgOCkpOwogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBwX2hlYWRlcjEwMCk7CiAJfSBlbHNlIHsKQEAgLTYwMCw0NCArNjAyLDQ0IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcF9oZWFkZXIxMDApOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHByZXBhcmVfaGVhZGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgaW50IHZuciwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJlcGFyZV9oZWFkZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZuciwKIAkJCQkgICB2b2lkICpidWZmZXIsIGVudW0gZHJiZF9wYWNrZXQgY21kLCBpbnQgc2l6ZSkKIHsKLQlpZiAodGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDApCisJaWYgKGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDApCiAJCXJldHVybiBwcmVwYXJlX2hlYWRlcjEwMChidWZmZXIsIGNtZCwgc2l6ZSwgdm5yKTsKLQllbHNlIGlmICh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1ICYmCisJZWxzZSBpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1ICYmCiAJCSBzaXplID4gRFJCRF9NQVhfU0laRV9IODBfUEFDS0VUKQogCQlyZXR1cm4gcHJlcGFyZV9oZWFkZXI5NShidWZmZXIsIGNtZCwgc2l6ZSk7CiAJZWxzZQogCQlyZXR1cm4gcHJlcGFyZV9oZWFkZXI4MChidWZmZXIsIGNtZCwgc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkICpfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwKK3N0YXRpYyB2b2lkICpfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCiAJCQkJICAgIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaykKIHsKIAlpZiAoIXNvY2stPnNvY2tldCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNvY2stPnNidWYgKyBkcmJkX2hlYWRlcl9zaXplKHRjb25uKTsKKwlyZXR1cm4gc29jay0+c2J1ZiArIGRyYmRfaGVhZGVyX3NpemUoY29ubmVjdGlvbik7CiB9CiAKLXZvaWQgKmNvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQordm9pZCAqY29ubl9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQogewogCXZvaWQgKnA7CiAKIAltdXRleF9sb2NrKCZzb2NrLT5tdXRleCk7Ci0JcCA9IF9fY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXAgPSBfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqZHJiZF9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQordm9pZCAqZHJiZF9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2spCiB7Ci0JcmV0dXJuIGNvbm5fcHJlcGFyZV9jb21tYW5kKG1kZXYtPnRjb25uLCBzb2NrKTsKKwlyZXR1cm4gY29ubl9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIHNvY2spOwogfQogCi1zdGF0aWMgaW50IF9fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgaW50IHZuciwKK3N0YXRpYyBpbnQgX19zZW5kX2NvbW1hbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZuciwKIAkJCSAgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJCSAgdW5zaWduZWQgaW50IGhlYWRlcl9zaXplLCB2b2lkICpkYXRhLAogCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSkKQEAgLTY1NCw4MiArNjU2LDgyIEBACiAJICovCiAJbXNnX2ZsYWdzID0gZGF0YSA/IE1TR19NT1JFIDogMDsKIAotCWhlYWRlcl9zaXplICs9IHByZXBhcmVfaGVhZGVyKHRjb25uLCB2bnIsIHNvY2stPnNidWYsIGNtZCwKKwloZWFkZXJfc2l6ZSArPSBwcmVwYXJlX2hlYWRlcihjb25uZWN0aW9uLCB2bnIsIHNvY2stPnNidWYsIGNtZCwKIAkJCQkgICAgICBoZWFkZXJfc2l6ZSArIHNpemUpOwotCWVyciA9IGRyYmRfc2VuZF9hbGwodGNvbm4sIHNvY2stPnNvY2tldCwgc29jay0+c2J1ZiwgaGVhZGVyX3NpemUsCisJZXJyID0gZHJiZF9zZW5kX2FsbChjb25uZWN0aW9uLCBzb2NrLT5zb2NrZXQsIHNvY2stPnNidWYsIGhlYWRlcl9zaXplLAogCQkJICAgIG1zZ19mbGFncyk7CiAJaWYgKGRhdGEgJiYgIWVycikKLQkJZXJyID0gZHJiZF9zZW5kX2FsbCh0Y29ubiwgc29jay0+c29ja2V0LCBkYXRhLCBzaXplLCAwKTsKKwkJZXJyID0gZHJiZF9zZW5kX2FsbChjb25uZWN0aW9uLCBzb2NrLT5zb2NrZXQsIGRhdGEsIHNpemUsIDApOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19jb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKK3N0YXRpYyBpbnQgX19jb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2ssCiAJCQkgICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKLQlyZXR1cm4gX19zZW5kX2NvbW1hbmQodGNvbm4sIDAsIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOworCXJldHVybiBfX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCAwLCBzb2NrLCBjbWQsIGhlYWRlcl9zaXplLCBkYXRhLCBzaXplKTsKIH0KIAotaW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrLAoraW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IF9fY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOworCWVyciA9IF9fY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgY21kLCBoZWFkZXJfc2l6ZSwgZGF0YSwgc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGRyYmRfc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKK2ludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsCi0JCQkgICAgIGRhdGEsIHNpemUpOworCWVyciA9IF9fc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwZWVyX2RldmljZS0+ZGV2aWNlLT52bnIsCisJCQkgICAgIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOwogCW11dGV4X3VubG9jaygmc29jay0+bXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX3NlbmRfcGluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spKQorCXNvY2sgPSAmY29ubmVjdGlvbi0+bWV0YTsKKwlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spKQogCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIFBfUElORywgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIFBfUElORywgMCwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfcGluZ19hY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraW50IGRyYmRfc2VuZF9waW5nX2FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAotCXNvY2sgPSAmdGNvbm4tPm1ldGE7Ci0JaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jaykpCisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaykpCiAJCXJldHVybiAtRUlPOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9QSU5HX0FDSywgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIFBfUElOR19BQ0ssIDAsIE5VTEwsIDApOwogfQogCi1pbnQgZHJiZF9zZW5kX3N5bmNfcGFyYW0oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX3NlbmRfc3luY19wYXJhbShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JzX3BhcmFtXzk1ICpwOwogCWludCBzaXplOwotCWNvbnN0IGludCBhcHYgPSBtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uOworCWNvbnN0IGludCBhcHYgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uOwogCWVudW0gZHJiZF9wYWNrZXQgY21kOwogCXN0cnVjdCBuZXRfY29uZiAqbmM7CiAJc3RydWN0IGRpc2tfY29uZiAqZGM7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAKIAlzaXplID0gYXB2IDw9IDg3ID8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtKQogCQk6IGFwdiA9PSA4OCA/IHNpemVvZihzdHJ1Y3QgcF9yc19wYXJhbSkKQEAgLTc0MiwxNCArNzQ0LDE0IEBACiAJLyogaW5pdGlhbGl6ZSB2ZXJpZnlfYWxnIGFuZCBjc3Vtc19hbGcgKi8KIAltZW1zZXQocC0+dmVyaWZ5X2FsZywgMCwgMiAqIFNIQVJFRF9TRUNSRVRfTUFYKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpOworCWlmIChnZXRfbGRldihwZWVyX2RldmljZS0+ZGV2aWNlKSkgeworCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+ZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOwogCQlwLT5yZXN5bmNfcmF0ZSA9IGNwdV90b19iZTMyKGRjLT5yZXN5bmNfcmF0ZSk7CiAJCXAtPmNfcGxhbl9haGVhZCA9IGNwdV90b19iZTMyKGRjLT5jX3BsYW5fYWhlYWQpOwogCQlwLT5jX2RlbGF5X3RhcmdldCA9IGNwdV90b19iZTMyKGRjLT5jX2RlbGF5X3RhcmdldCk7CiAJCXAtPmNfZmlsbF90YXJnZXQgPSBjcHVfdG9fYmUzMihkYy0+Y19maWxsX3RhcmdldCk7CiAJCXAtPmNfbWF4X3JhdGUgPSBjcHVfdG9fYmUzMihkYy0+Y19tYXhfcmF0ZSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihwZWVyX2RldmljZS0+ZGV2aWNlKTsKIAl9IGVsc2UgewogCQlwLT5yZXN5bmNfcmF0ZSA9IGNwdV90b19iZTMyKERSQkRfUkVTWU5DX1JBVEVfREVGKTsKIAkJcC0+Y19wbGFuX2FoZWFkID0gY3B1X3RvX2JlMzIoRFJCRF9DX1BMQU5fQUhFQURfREVGKTsKQEAgLTc2NCwzMyArNzY2LDMzIEBACiAJCXN0cmNweShwLT5jc3Vtc19hbGcsIG5jLT5jc3Vtc19hbGcpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIGNtZCwgc2l6ZSwgTlVMTCwgMCk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBjbWQsIHNpemUsIE5VTEwsIDApOwogfQogCi1pbnQgX19kcmJkX3NlbmRfcHJvdG9jb2woc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCkKK2ludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcHJvdG9jb2wgKnA7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgc2l6ZSwgY2Y7CiAKLQlzb2NrID0gJnRjb25uLT5kYXRhOwotCXAgPSBfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IF9fY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAotCWlmIChuYy0+dGVudGF0aXZlICYmIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MikgeworCWlmIChuYy0+dGVudGF0aXZlICYmIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkyKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQltdXRleF91bmxvY2soJnNvY2stPm11dGV4KTsKLQkJY29ubl9lcnIodGNvbm4sICItLWRyeS1ydW4gaXMgbm90IHN1cHBvcnRlZCBieSBwZWVyIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICItLWRyeS1ydW4gaXMgbm90IHN1cHBvcnRlZCBieSBwZWVyIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlzaXplID0gc2l6ZW9mKCpwKTsKLQlpZiAodGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4NykKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg3KQogCQlzaXplICs9IHN0cmxlbihuYy0+aW50ZWdyaXR5X2FsZykgKyAxOwogCiAJcC0+cHJvdG9jb2wgICAgICA9IGNwdV90b19iZTMyKG5jLT53aXJlX3Byb3RvY29sKTsKQEAgLTgwNSwxMjggKzgwNywxMzEgQEAKIAkJY2YgfD0gQ0ZfRFJZX1JVTjsKIAlwLT5jb25uX2ZsYWdzICAgID0gY3B1X3RvX2JlMzIoY2YpOwogCi0JaWYgKHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODcpCisJaWYgKGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4NykKIAkJc3RyY3B5KHAtPmludGVncml0eV9hbGcsIG5jLT5pbnRlZ3JpdHlfYWxnKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJldHVybiBfX2Nvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIHNpemUsIE5VTEwsIDApOworCXJldHVybiBfX2Nvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIGNtZCwgc2l6ZSwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfcHJvdG9jb2woc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraW50IGRyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZ0Y29ubi0+ZGF0YS5tdXRleCk7Ci0JZXJyID0gX19kcmJkX3NlbmRfcHJvdG9jb2wodGNvbm4sIFBfUFJPVE9DT0wpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCWVyciA9IF9fZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24sIFBfUFJPVE9DT0wpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgX2RyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1NjQgdXVpZF9mbGFncykKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHU2NCB1dWlkX2ZsYWdzKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfdXVpZHMgKnA7CiAJaW50IGk7CiAKLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkKIAkJcmV0dXJuIDA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAJZm9yIChpID0gVUlfQ1VSUkVOVDsgaSA8IFVJX1NJWkU7IGkrKykKLQkJcC0+dXVpZFtpXSA9IGNwdV90b19iZTY0KG1kZXYtPmxkZXYtPm1kLnV1aWRbaV0pOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwkJcC0+dXVpZFtpXSA9IGNwdV90b19iZTY0KGRldmljZS0+bGRldi0+bWQudXVpZFtpXSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAKLQltZGV2LT5jb21tX2JtX3NldCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOwotCXAtPnV1aWRbVUlfU0laRV0gPSBjcHVfdG9fYmU2NChtZGV2LT5jb21tX2JtX3NldCk7CisJZGV2aWNlLT5jb21tX2JtX3NldCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSk7CisJcC0+dXVpZFtVSV9TSVpFXSA9IGNwdV90b19iZTY0KGRldmljZS0+Y29tbV9ibV9zZXQpOwogCXJjdV9yZWFkX2xvY2soKTsKLQl1dWlkX2ZsYWdzIHw9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT5kaXNjYXJkX215X2RhdGEgPyAxIDogMDsKKwl1dWlkX2ZsYWdzIHw9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5kaXNjYXJkX215X2RhdGEgPyAxIDogMDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQl1dWlkX2ZsYWdzIHw9IHRlc3RfYml0KENSQVNIRURfUFJJTUFSWSwgJm1kZXYtPmZsYWdzKSA/IDIgOiAwOwotCXV1aWRfZmxhZ3MgfD0gbWRldi0+bmV3X3N0YXRlX3RtcC5kaXNrID09IERfSU5DT05TSVNURU5UID8gNCA6IDA7CisJdXVpZF9mbGFncyB8PSB0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSA/IDIgOiAwOworCXV1aWRfZmxhZ3MgfD0gZGV2aWNlLT5uZXdfc3RhdGVfdG1wLmRpc2sgPT0gRF9JTkNPTlNJU1RFTlQgPyA0IDogMDsKIAlwLT51dWlkW1VJX0ZMQUdTXSA9IGNwdV90b19iZTY0KHV1aWRfZmxhZ3MpOwogCi0JcHV0X2xkZXYobWRldik7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfVVVJRFMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXB1dF9sZGV2KGRldmljZSk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1VVSURTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7Ci0JcmV0dXJuIF9kcmJkX3NlbmRfdXVpZHMobWRldiwgMCk7CisJcmV0dXJuIF9kcmJkX3NlbmRfdXVpZHMocGVlcl9kZXZpY2UsIDApOwogfQogCi1pbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKLQlyZXR1cm4gX2RyYmRfc2VuZF91dWlkcyhtZGV2LCA4KTsKKwlyZXR1cm4gX2RyYmRfc2VuZF91dWlkcyhwZWVyX2RldmljZSwgOCk7CiB9CiAKLXZvaWQgZHJiZF9wcmludF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCBjaGFyICp0ZXh0KQordm9pZCBkcmJkX3ByaW50X3V1aWRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICp0ZXh0KQogewotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgewotCQl1NjQgKnV1aWQgPSBtZGV2LT5sZGV2LT5tZC51dWlkOwotCQlkZXZfaW5mbyhERVYsICIlcyAlMDE2bGxYOiUwMTZsbFg6JTAxNmxsWDolMDE2bGxYXG4iLAorCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCXU2NCAqdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZDsKKwkJZHJiZF9pbmZvKGRldmljZSwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFhcbiIsCiAJCSAgICAgdGV4dCwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXV1aWRbVUlfQ1VSUkVOVF0sCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0JJVE1BUF0sCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0hJU1RPUllfU1RBUlRdLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdXVpZFtVSV9ISVNUT1JZX0VORF0pOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9IGVsc2UgewotCQlkZXZfaW5mbyhERVYsICIlcyBlZmZlY3RpdmUgZGF0YSB1dWlkOiAlMDE2bGxYXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiJXMgZWZmZWN0aXZlIGRhdGEgdXVpZDogJTAxNmxsWFxuIiwKIAkJCQl0ZXh0LAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+ZWRfdXVpZCk7CisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPmVkX3V1aWQpOwogCX0KIH0KIAotdm9pZCBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JzX3V1aWQgKnA7CiAJdTY0IHV1aWQ7CiAKLQlEX0FTU0VSVChtZGV2LT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSk7CisJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9VUF9UT19EQVRFKTsKIAotCXV1aWQgPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07CisJdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdOwogCWlmICh1dWlkICYmIHV1aWQgIT0gVVVJRF9KVVNUX0NSRUFURUQpCiAJCXV1aWQgPSB1dWlkICsgVVVJRF9ORVdfQk1fT0ZGU0VUOwogCWVsc2UKIAkJZ2V0X3JhbmRvbV9ieXRlcygmdXVpZCwgc2l6ZW9mKHU2NCkpOwotCWRyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCB1dWlkKTsKLQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIHN5bmMgVVVJRCIpOwotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCB1dWlkKTsKKwlkcmJkX3ByaW50X3V1aWRzKGRldmljZSwgInVwZGF0ZWQgc3luYyBVVUlEIik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKHApIHsKIAkJcC0+dXVpZCA9IGNwdV90b19iZTY0KHV1aWQpOwotCQlkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NZTkNfVVVJRCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJCWRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NZTkNfVVVJRCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiAJfQogfQogCi1pbnQgZHJiZF9zZW5kX3NpemVzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCB0cmlnZ2VyX3JlcGx5LCBlbnVtIGRkc19mbGFncyBmbGFncykKK2ludCBkcmJkX3NlbmRfc2l6ZXMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBpbnQgdHJpZ2dlcl9yZXBseSwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9zaXplcyAqcDsKIAlzZWN0b3JfdCBkX3NpemUsIHVfc2l6ZTsKIAlpbnQgcV9vcmRlcl90eXBlOwogCXVuc2lnbmVkIGludCBtYXhfYmlvX3NpemU7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9ORUdPVElBVElORykpIHsKLQkJRF9BU1NFUlQobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKLQkJZF9zaXplID0gZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG1kZXYtPmxkZXYpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOworCQlkX3NpemUgPSBkcmJkX2dldF9tYXhfY2FwYWNpdHkoZGV2aWNlLT5sZGV2KTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl1X3NpemUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOworCQl1X3NpemUgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlxX29yZGVyX3R5cGUgPSBkcmJkX3F1ZXVlX29yZGVyX3R5cGUobWRldik7Ci0JCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CisJCXFfb3JkZXJfdHlwZSA9IGRyYmRfcXVldWVfb3JkZXJfdHlwZShkZXZpY2UpOworCQltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CiAJCW1heF9iaW9fc2l6ZSA9IG1pbihtYXhfYmlvX3NpemUsIERSQkRfTUFYX0JJT19TSVpFKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfSBlbHNlIHsKIAkJZF9zaXplID0gMDsKIAkJdV9zaXplID0gMDsKQEAgLTkzNCw0NSArOTM5LDQ1IEBACiAJCW1heF9iaW9fc2l6ZSA9IERSQkRfTUFYX0JJT19TSVpFOyAvKiAuLi4gbXVsdGlwbGUgQklPcyBwZXIgcGVlcl9yZXF1ZXN0ICovCiAJfQogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8PSA5NCkKKwlpZiAocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8PSA5NCkKIAkJbWF4X2Jpb19zaXplID0gbWluKG1heF9iaW9fc2l6ZSwgRFJCRF9NQVhfU0laRV9IODBfUEFDS0VUKTsKLQllbHNlIGlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKQorCWVsc2UgaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApCiAJCW1heF9iaW9fc2l6ZSA9IG1pbihtYXhfYmlvX3NpemUsIERSQkRfTUFYX0JJT19TSVpFX1A5NSk7CiAKIAlwLT5kX3NpemUgPSBjcHVfdG9fYmU2NChkX3NpemUpOwogCXAtPnVfc2l6ZSA9IGNwdV90b19iZTY0KHVfc2l6ZSk7Ci0JcC0+Y19zaXplID0gY3B1X3RvX2JlNjQodHJpZ2dlcl9yZXBseSA/IDAgOiBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKTsKKwlwLT5jX3NpemUgPSBjcHVfdG9fYmU2NCh0cmlnZ2VyX3JlcGx5ID8gMCA6IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSk7CiAJcC0+bWF4X2Jpb19zaXplID0gY3B1X3RvX2JlMzIobWF4X2Jpb19zaXplKTsKIAlwLT5xdWV1ZV9vcmRlcl90eXBlID0gY3B1X3RvX2JlMTYocV9vcmRlcl90eXBlKTsKIAlwLT5kZHNfZmxhZ3MgPSBjcHVfdG9fYmUxNihmbGFncyk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfU0laRVMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9TSVpFUywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qKgogICogZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUoKSAtIFNlbmRzIHRoZSBkcmJkIHN0YXRlIHRvIHRoZSBwZWVyCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAcGVlcl9kZXZpY2U6CURSQkQgcGVlciBkZXZpY2UuCiAgKi8KLWludCBkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfc3RhdGUgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKLQlwLT5zdGF0ZSA9IGNwdV90b19iZTMyKG1kZXYtPnN0YXRlLmkpOyAvKiBXaXRoaW4gdGhlIHNlbmQgbXV0ZXggKi8KLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9TVEFURSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcC0+c3RhdGUgPSBjcHVfdG9fYmUzMihwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5pKTsgLyogV2l0aGluIHRoZSBzZW5kIG11dGV4ICovCisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX3NlbmRfc3RhdGUoKSAtIEFmdGVyIGEgc3RhdGUgY2hhbmdlLCBzZW5kcyB0aGUgbmV3IHN0YXRlIHRvIHRoZSBwZWVyCi0gKiBAbWRldjogICAgICBEUkJEIGRldmljZS4KKyAqIEBwZWVyX2RldmljZTogICAgICBEUkJEIHBlZXIgZGV2aWNlLgogICogQHN0YXRlOiAgICAgdGhlIHN0YXRlIHRvIHNlbmQsIG5vdCBuZWNlc3NhcmlseSB0aGUgY3VycmVudCBzdGF0ZS4KICAqCiAgKiBFYWNoIHN0YXRlIGNoYW5nZSBxdWV1ZXMgYW4gImFmdGVyX3N0YXRlX2NoIiB3b3JrLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkKQEAgLTk4MCw3MyArOTg1LDczIEBACiAgKiBiZXR3ZWVuIHF1ZXVpbmcgYW5kIHByb2Nlc3Npbmcgb2YgdGhlIGFmdGVyX3N0YXRlX2NoIHdvcmssIHdlIHN0aWxsCiAgKiB3YW50IHRvIHNlbmQgZWFjaCBpbnRlcm1lZGlhcnkgc3RhdGUgaW4gdGhlIG9yZGVyIGl0IG9jY3VycmVkLgogICovCi1pbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgc3RhdGUpCitpbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfc3RhdGUgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAlwLT5zdGF0ZSA9IGNwdV90b19iZTMyKHN0YXRlLmkpOyAvKiBXaXRoaW4gdGhlIHNlbmQgbXV0ZXggKi8KLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9TVEFURSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGRyYmRfc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKK2ludCBkcmJkX3NlbmRfc3RhdGVfcmVxKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcmVxX3N0YXRlICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+bWFzayA9IGNwdV90b19iZTMyKG1hc2suaSk7CiAJcC0+dmFsID0gY3B1X3RvX2JlMzIodmFsLmkpOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NUQVRFX0NIR19SRVEsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9TVEFURV9DSEdfUkVRLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGNvbm5fc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQoraW50IGNvbm5fc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAllbnVtIGRyYmRfcGFja2V0IGNtZDsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcmVxX3N0YXRlICpwOwogCi0JY21kID0gdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/IFBfU1RBVEVfQ0hHX1JFUSA6IFBfQ09OTl9TVF9DSEdfUkVROwotCXNvY2sgPSAmdGNvbm4tPmRhdGE7Ci0JcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwljbWQgPSBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVEgOiBQX0NPTk5fU1RfQ0hHX1JFUTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+bWFzayA9IGNwdV90b19iZTMyKG1hc2suaSk7CiAJcC0+dmFsID0gY3B1X3RvX2JlMzIodmFsLmkpOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotdm9pZCBkcmJkX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpCit2b2lkIGRyYmRfc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIGVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5tZXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5tZXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKHApIHsKIAkJcC0+cmV0Y29kZSA9IGNwdV90b19iZTMyKHJldGNvZGUpOwotCQlkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NUQVRFX0NIR19SRVBMWSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJCWRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFX0NIR19SRVBMWSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiAJfQogfQogCi12b2lkIGNvbm5fc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlKQordm9pZCBjb25uX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JlcV9zdGF0ZV9yZXBseSAqcDsKLQllbnVtIGRyYmRfcGFja2V0IGNtZCA9IHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVBMWSA6IFBfQ09OTl9TVF9DSEdfUkVQTFk7CisJZW51bSBkcmJkX3BhY2tldCBjbWQgPSBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVBMWSA6IFBfQ09OTl9TVF9DSEdfUkVQTFk7CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jayk7CisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKTsKIAlpZiAocCkgewogCQlwLT5yZXRjb2RlID0gY3B1X3RvX2JlMzIocmV0Y29kZSk7Ci0JCWNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOworCQljb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOwogCX0KIH0KIApAQCAtMTA2Nyw3ICsxMDcyLDcgQEAKIAlwLT5lbmNvZGluZyA9IChwLT5lbmNvZGluZyAmICh+MHg3IDw8IDQpKSB8IChuIDw8IDQpOwogfQogCi1pbnQgZmlsbF9iaXRtYXBfcmxlX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbnQgZmlsbF9iaXRtYXBfcmxlX2JpdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgc3RydWN0IHBfY29tcHJlc3NlZF9ibSAqcCwKIAkJCSB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCSBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpCkBAIC0xMDgyLDkgKzEwODcsOSBAQAogCiAJLyogbWF5IHdlIHVzZSB0aGlzIGZlYXR1cmU/ICovCiAJcmN1X3JlYWRfbG9jaygpOwotCXVzZV9ybGUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dXNlX3JsZTsKKwl1c2VfcmxlID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKS0+dXNlX3JsZTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlpZiAoIXVzZV9ybGUgfHwgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkwKQorCWlmICghdXNlX3JsZSB8fCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYy0+Yml0X29mZnNldCA+PSBjLT5ibV9iaXRzKQpAQCAtMTEwNCw4ICsxMTA5LDggQEAKIAkvKiBzZWUgaG93IG11Y2ggcGxhaW4gYml0cyB3ZSBjYW4gc3R1ZmYgaW50byBvbmUgcGFja2V0CiAJICogdXNpbmcgUkxFIGFuZCBWTEkuICovCiAJZG8gewotCQl0bXAgPSAodG9nZ2xlID09IDApID8gX2RyYmRfYm1fZmluZF9uZXh0X3plcm8obWRldiwgYy0+Yml0X29mZnNldCkKLQkJCQkgICAgOiBfZHJiZF9ibV9maW5kX25leHQobWRldiwgYy0+Yml0X29mZnNldCk7CisJCXRtcCA9ICh0b2dnbGUgPT0gMCkgPyBfZHJiZF9ibV9maW5kX25leHRfemVybyhkZXZpY2UsIGMtPmJpdF9vZmZzZXQpCisJCQkJICAgIDogX2RyYmRfYm1fZmluZF9uZXh0KGRldmljZSwgYy0+Yml0X29mZnNldCk7CiAJCWlmICh0bXAgPT0gLTFVTCkKIAkJCXRtcCA9IGMtPmJtX2JpdHM7CiAJCXJsID0gdG1wIC0gYy0+Yml0X29mZnNldDsKQEAgLTExMjUsNyArMTEzMCw3IEBACiAJCS8qIHBhcmFub2lhOiBjYXRjaCB6ZXJvIHJ1bmxlbmd0aC4KIAkJICogY2FuIG9ubHkgaGFwcGVuIGlmIGJpdG1hcCBpcyBtb2RpZmllZCB3aGlsZSB3ZSBzY2FuIGl0LiAqLwogCQlpZiAocmwgPT0gMCkgewotCQkJZGV2X2VycihERVYsICJ1bmV4cGVjdGVkIHplcm8gcnVubGVuZ3RoIHdoaWxlIGVuY29kaW5nIGJpdG1hcCAiCisJCQlkcmJkX2VycihkZXZpY2UsICJ1bmV4cGVjdGVkIHplcm8gcnVubGVuZ3RoIHdoaWxlIGVuY29kaW5nIGJpdG1hcCAiCiAJCQkgICAgInQ6JXUgYm86JWx1XG4iLCB0b2dnbGUsIGMtPmJpdF9vZmZzZXQpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xMTM0LDcgKzExMzksNyBAQAogCQlpZiAoYml0cyA9PSAtRU5PQlVGUykgLyogYnVmZmVyIGZ1bGwgKi8KIAkJCWJyZWFrOwogCQlpZiAoYml0cyA8PSAwKSB7Ci0JCQlkZXZfZXJyKERFViwgImVycm9yIHdoaWxlIGVuY29kaW5nIGJpdG1hcDogJWRcbiIsIGJpdHMpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiZXJyb3Igd2hpbGUgZW5jb2RpbmcgYml0bWFwOiAlZFxuIiwgYml0cyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC0xMTcxLDIxICsxMTc2LDIxIEBACiAgKiBjb2RlIHVwb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotc2VuZF9iaXRtYXBfcmxlX29yX3BsYWluKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBibV94ZmVyX2N0eCAqYykKK3NlbmRfYml0bWFwX3JsZV9vcl9wbGFpbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGJtX3hmZXJfY3R4ICpjKQogewotCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKG1kZXYtPnRjb25uKTsKKwlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2sgPSAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAgPSBzb2NrLT5zYnVmICsgaGVhZGVyX3NpemU7CiAJaW50IGxlbiwgZXJyOwogCi0JbGVuID0gZmlsbF9iaXRtYXBfcmxlX2JpdHMobWRldiwgcCwKKwlsZW4gPSBmaWxsX2JpdG1hcF9ybGVfYml0cyhkZXZpY2UsIHAsCiAJCQlEUkJEX1NPQ0tFVF9CVUZGRVJfU0laRSAtIGhlYWRlcl9zaXplIC0gc2l6ZW9mKCpwKSwgYyk7CiAJaWYgKGxlbiA8IDApCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGxlbikgewogCQlkY2JwX3NldF9jb2RlKHAsIFJMRV9WTElfQml0cyk7Ci0JCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssCisJCWVyciA9IF9fc2VuZF9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLAogCQkJCSAgICAgUF9DT01QUkVTU0VEX0JJVE1BUCwgc2l6ZW9mKCpwKSArIGxlbiwKIAkJCQkgICAgIE5VTEwsIDApOwogCQljLT5wYWNrZXRzWzBdKys7CkBAIC0xMjA1LDggKzEyMTAsOCBAQAogCQkJCSAgYy0+Ym1fd29yZHMgLSBjLT53b3JkX29mZnNldCk7CiAJCWxlbiA9IG51bV93b3JkcyAqIHNpemVvZigqcCk7CiAJCWlmIChsZW4pCi0JCQlkcmJkX2JtX2dldF9sZWwobWRldiwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7Ci0JCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssIFBfQklUTUFQLCBsZW4sIE5VTEwsIDApOworCQkJZHJiZF9ibV9nZXRfbGVsKGRldmljZSwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CisJCWVyciA9IF9fc2VuZF9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLCBQX0JJVE1BUCwgbGVuLCBOVUxMLCAwKTsKIAkJYy0+d29yZF9vZmZzZXQgKz0gbnVtX3dvcmRzOwogCQljLT5iaXRfb2Zmc2V0ID0gYy0+d29yZF9vZmZzZXQgKiBCSVRTX1BFUl9MT05HOwogCkBAIC0xMjE4LDcgKzEyMjMsNyBAQAogCX0KIAlpZiAoIWVycikgewogCQlpZiAobGVuID09IDApIHsKLQkJCUlORk9fYm1feGZlcl9zdGF0cyhtZGV2LCAic2VuZCIsIGMpOworCQkJSU5GT19ibV94ZmVyX3N0YXRzKGRldmljZSwgInNlbmQiLCBjKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UKIAkJCXJldHVybiAxOwpAQCAtMTIyNywxMjggKzEyMzIsMTI4IEBACiB9CiAKIC8qIFNlZSB0aGUgY29tbWVudCBhdCByZWNlaXZlX2JpdG1hcCgpICovCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IF9kcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBibV94ZmVyX2N0eCBjOwogCWludCBlcnI7CiAKLQlpZiAoIWV4cGVjdChtZGV2LT5iaXRtYXApKQorCWlmICghZXhwZWN0KGRldmljZS0+Yml0bWFwKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfRlVMTF9TWU5DKSkgewotCQkJZGV2X2luZm8oREVWLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBNREZfRnVsbFN5bmMgd2FzIHNldC5cbiIpOwotCQkJZHJiZF9ibV9zZXRfYWxsKG1kZXYpOwotCQkJaWYgKGRyYmRfYm1fd3JpdGUobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcoZGV2aWNlLT5sZGV2LCBNREZfRlVMTF9TWU5DKSkgeworCQkJZHJiZF9pbmZvKGRldmljZSwgIldyaXRpbmcgdGhlIHdob2xlIGJpdG1hcCwgTURGX0Z1bGxTeW5jIHdhcyBzZXQuXG4iKTsKKwkJCWRyYmRfYm1fc2V0X2FsbChkZXZpY2UpOworCQkJaWYgKGRyYmRfYm1fd3JpdGUoZGV2aWNlKSkgewogCQkJCS8qIHdyaXRlX2JtIGRpZCBmYWlsISBMZWF2ZSBmdWxsIHN5bmMgZmxhZyBzZXQgaW4gTWV0YSBQX0RBVEEKIAkJCQkgKiBidXQgb3RoZXJ3aXNlIHByb2Nlc3MgYXMgcGVyIG5vcm1hbCAtIG5lZWQgdG8gdGVsbCBvdGhlcgogCQkJCSAqIHNpZGUgdGhhdCBhIGZ1bGwgcmVzeW5jIGlzIHJlcXVpcmVkISAqLwotCQkJCWRldl9lcnIoREVWLCAiRmFpbGVkIHRvIHdyaXRlIGJpdG1hcCB0byBkaXNrIVxuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRmFpbGVkIHRvIHdyaXRlIGJpdG1hcCB0byBkaXNrIVxuIik7CiAJCQl9IGVsc2UgewotCQkJCWRyYmRfbWRfY2xlYXJfZmxhZyhtZGV2LCBNREZfRlVMTF9TWU5DKTsKLQkJCQlkcmJkX21kX3N5bmMobWRldik7CisJCQkJZHJiZF9tZF9jbGVhcl9mbGFnKGRldmljZSwgTURGX0ZVTExfU1lOQyk7CisJCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCQl9CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJYyA9IChzdHJ1Y3QgYm1feGZlcl9jdHgpIHsKLQkJLmJtX2JpdHMgPSBkcmJkX2JtX2JpdHMobWRldiksCi0JCS5ibV93b3JkcyA9IGRyYmRfYm1fd29yZHMobWRldiksCisJCS5ibV9iaXRzID0gZHJiZF9ibV9iaXRzKGRldmljZSksCisJCS5ibV93b3JkcyA9IGRyYmRfYm1fd29yZHMoZGV2aWNlKSwKIAl9OwogCiAJZG8gewotCQllcnIgPSBzZW5kX2JpdG1hcF9ybGVfb3JfcGxhaW4obWRldiwgJmMpOworCQllcnIgPSBzZW5kX2JpdG1hcF9ybGVfb3JfcGxhaW4oZGV2aWNlLCAmYyk7CiAJfSB3aGlsZSAoZXJyID4gMCk7CiAKIAlyZXR1cm4gZXJyID09IDA7CiB9CiAKLWludCBkcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9zZW5kX2JpdG1hcChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7CisJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrID0gJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGE7CiAJaW50IGVyciA9IC0xOwogCiAJbXV0ZXhfbG9jaygmc29jay0+bXV0ZXgpOwogCWlmIChzb2NrLT5zb2NrZXQpCi0JCWVyciA9ICFfZHJiZF9zZW5kX2JpdG1hcChtZGV2KTsKKwkJZXJyID0gIV9kcmJkX3NlbmRfYml0bWFwKGRldmljZSk7CiAJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBkcmJkX3NlbmRfYl9hY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1MzIgYmFycmllcl9uciwgdTMyIHNldF9zaXplKQordm9pZCBkcmJkX3NlbmRfYl9hY2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTMyIGJhcnJpZXJfbnIsIHUzMiBzZXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmFycmllcl9hY2sgKnA7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUykKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TKQogCQlyZXR1cm47CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jayk7CisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybjsKIAlwLT5iYXJyaWVyID0gYmFycmllcl9ucjsKIAlwLT5zZXRfc2l6ZSA9IGNwdV90b19iZTMyKHNldF9zaXplKTsKLQljb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9CQVJSSUVSX0FDSywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9CQVJSSUVSX0FDSywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qKgogICogX2RyYmRfc2VuZF9hY2soKSAtIFNlbmRzIGFuIGFjayBwYWNrZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGNtZDoJUGFja2V0IGNvbW1hbmQgY29kZS4KICAqIEBzZWN0b3I6CXNlY3RvciwgbmVlZHMgdG8gYmUgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyCiAgKiBAYmxrc2l6ZToJc2l6ZSBpbiBieXRlLCBuZWVkcyB0byBiZSBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIKICAqIEBibG9ja19pZDoJSWQsIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcgogICovCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAorc3RhdGljIGludCBfZHJiZF9zZW5kX2FjayhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIGVudW0gZHJiZF9wYWNrZXQgY21kLAogCQkJICB1NjQgc2VjdG9yLCB1MzIgYmxrc2l6ZSwgdTY0IGJsb2NrX2lkKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnA7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQorCWlmIChwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpCiAJCXJldHVybiAtRUlPOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+bWV0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bWV0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gc2VjdG9yOwogCXAtPmJsb2NrX2lkID0gYmxvY2tfaWQ7CiAJcC0+Ymxrc2l6ZSA9IGJsa3NpemU7Ci0JcC0+c2VxX251bSA9IGNwdV90b19iZTMyKGF0b21pY19pbmNfcmV0dXJuKCZtZGV2LT5wYWNrZXRfc2VxKSk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcC0+c2VxX251bSA9IGNwdV90b19iZTMyKGF0b21pY19pbmNfcmV0dXJuKCZwZWVyX2RldmljZS0+ZGV2aWNlLT5wYWNrZXRfc2VxKSk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOwogfQogCiAvKiBkcC0+c2VjdG9yIGFuZCBkcC0+YmxvY2tfaWQgYWxyZWFkeS9zdGlsbCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsCiAgKiBkYXRhX3NpemUgaXMgcGF5bG9hZCBzaXplIGFjY29yZGluZyB0byBkcC0+aGVhZCwKICAqIGFuZCBtYXkgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGRpZ2VzdCBzaXplLiAqLwotdm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAordm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgZW51bSBkcmJkX3BhY2tldCBjbWQsCiAJCSAgICAgIHN0cnVjdCBwX2RhdGEgKmRwLCBpbnQgZGF0YV9zaXplKQogewotCWlmIChtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKQotCQlkYXRhX3NpemUgLT0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKTsKLQlfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsIGRwLT5zZWN0b3IsIGNwdV90b19iZTMyKGRhdGFfc2l6ZSksCisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pCisJCWRhdGFfc2l6ZSAtPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pOworCV9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsIGRwLT5zZWN0b3IsIGNwdV90b19iZTMyKGRhdGFfc2l6ZSksCiAJCSAgICAgICBkcC0+YmxvY2tfaWQpOwogfQogCi12b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3BhY2tldCBjbWQsCit2b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICAgICAgc3RydWN0IHBfYmxvY2tfcmVxICpycCkKIHsKLQlfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsIHJwLT5zZWN0b3IsIHJwLT5ibGtzaXplLCBycC0+YmxvY2tfaWQpOworCV9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsIHJwLT5zZWN0b3IsIHJwLT5ibGtzaXplLCBycC0+YmxvY2tfaWQpOwogfQogCiAvKioKICAqIGRyYmRfc2VuZF9hY2soKSAtIFNlbmRzIGFuIGFjayBwYWNrZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZQorICogQGRldmljZToJRFJCRCBkZXZpY2UKICAqIEBjbWQ6CXBhY2tldCBjb21tYW5kIGNvZGUKICAqIEBwZWVyX3JlcToJcGVlciByZXF1ZXN0CiAgKi8KLWludCBkcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAoraW50IGRyYmRfc2VuZF9hY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewotCXJldHVybiBfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsCisJcmV0dXJuIF9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsCiAJCQkgICAgICBjcHVfdG9fYmU2NChwZWVyX3JlcS0+aS5zZWN0b3IpLAogCQkJICAgICAgY3B1X3RvX2JlMzIocGVlcl9yZXEtPmkuc2l6ZSksCiAJCQkgICAgICBwZWVyX3JlcS0+YmxvY2tfaWQpOwpAQCAtMTM1NiwzMiArMTM2MSwzMiBAQAogCiAvKiBUaGlzIGZ1bmN0aW9uIG1pc3VzZXMgdGhlIGJsb2NrX2lkIGZpZWxkIHRvIHNpZ25hbCBpZiB0aGUgYmxvY2tzCiAgKiBhcmUgaXMgc3luYyBvciBub3QuICovCi1pbnQgZHJiZF9zZW5kX2Fja19leChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2ludCBkcmJkX3NlbmRfYWNrX2V4KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgZW51bSBkcmJkX3BhY2tldCBjbWQsCiAJCSAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgYmxrc2l6ZSwgdTY0IGJsb2NrX2lkKQogewotCXJldHVybiBfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsCisJcmV0dXJuIF9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsCiAJCQkgICAgICBjcHVfdG9fYmU2NChzZWN0b3IpLAogCQkJICAgICAgY3B1X3RvX2JlMzIoYmxrc2l6ZSksCiAJCQkgICAgICBjcHVfdG9fYmU2NChibG9ja19pZCkpOwogfQogCi1pbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBjbWQsCitpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgaW50IGNtZCwKIAkJICAgICAgIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsIHU2NCBibG9ja19pZCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfcmVxICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gY3B1X3RvX2JlNjQoc2VjdG9yKTsKIAlwLT5ibG9ja19pZCA9IGJsb2NrX2lkOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihzaXplKTsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAoraW50IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwKIAkJCSAgICB2b2lkICpkaWdlc3QsIGludCBkaWdlc3Rfc2l6ZSwgZW51bSBkcmJkX3BhY2tldCBjbWQpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwpAQCAtMTM4OSw2NCArMTM5NCw2MyBAQAogCiAJLyogRklYTUU6IFB1dCB0aGUgZGlnZXN0IGludG8gdGhlIHByZWFsbG9jYXRlZCBzb2NrZXQgYnVmZmVyLiAgKi8KIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHNlY3Rvcik7CiAJcC0+YmxvY2tfaWQgPSBJRF9TWU5DRVIgLyogdW51c2VkICovOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihzaXplKTsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgY21kLCBzaXplb2YoKnApLAotCQkJCSBkaWdlc3QsIGRpZ2VzdF9zaXplKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgZGlnZXN0LCBkaWdlc3Rfc2l6ZSk7CiB9CiAKLWludCBkcmJkX3NlbmRfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQoraW50IGRyYmRfc2VuZF9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfcmVxICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gY3B1X3RvX2JlNjQoc2VjdG9yKTsKIAlwLT5ibG9ja19pZCA9IElEX1NZTkNFUiAvKiB1bnVzZWQgKi87CiAJcC0+Ymxrc2l6ZSA9IGNwdV90b19iZTMyKHNpemUpOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX09WX1JFUVVFU1QsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9PVl9SRVFVRVNULCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyogY2FsbGVkIG9uIHNuZHRpbWVvCiAgKiByZXR1cm5zIGZhbHNlIGlmIHdlIHNob3VsZCByZXRyeSwKICAqIHRydWUgaWYgd2UgdGhpbmsgY29ubmVjdGlvbiBpcyBkZWFkCiAgKi8KLXN0YXRpYyBpbnQgd2Vfc2hvdWxkX2Ryb3BfdGhlX2Nvbm5lY3Rpb24oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQorc3RhdGljIGludCB3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCWludCBkcm9wX2l0OwotCS8qIGxvbmcgZWxhcHNlZCA9IChsb25nKShqaWZmaWVzIC0gbWRldi0+bGFzdF9yZWNlaXZlZCk7ICovCisJLyogbG9uZyBlbGFwc2VkID0gKGxvbmcpKGppZmZpZXMgLSBkZXZpY2UtPmxhc3RfcmVjZWl2ZWQpOyAqLwogCi0JZHJvcF9pdCA9ICAgdGNvbm4tPm1ldGEuc29ja2V0ID09IHNvY2sKLQkJfHwgIXRjb25uLT5hc2VuZGVyLnRhc2sKLQkJfHwgZ2V0X3Rfc3RhdGUoJnRjb25uLT5hc2VuZGVyKSAhPSBSVU5OSU5HCi0JCXx8IHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVM7CisJZHJvcF9pdCA9ICAgY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQgPT0gc29jaworCQl8fCAhY29ubmVjdGlvbi0+YXNlbmRlci50YXNrCisJCXx8IGdldF90X3N0YXRlKCZjb25uZWN0aW9uLT5hc2VuZGVyKSAhPSBSVU5OSU5HCisJCXx8IGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUzsKIAogCWlmIChkcm9wX2l0KQogCQlyZXR1cm4gdHJ1ZTsKIAotCWRyb3BfaXQgPSAhLS10Y29ubi0+a29fY291bnQ7CisJZHJvcF9pdCA9ICEtLWNvbm5lY3Rpb24tPmtvX2NvdW50OwogCWlmICghZHJvcF9pdCkgewotCQljb25uX2Vycih0Y29ubiwgIlslcy8lZF0gc29ja19zZW5kbXNnIHRpbWUgZXhwaXJlZCwga28gPSAldVxuIiwKLQkJCSBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHRjb25uLT5rb19jb3VudCk7Ci0JCXJlcXVlc3RfcGluZyh0Y29ubik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJbJXMvJWRdIHNvY2tfc2VuZG1zZyB0aW1lIGV4cGlyZWQsIGtvID0gJXVcbiIsCisJCQkgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBjb25uZWN0aW9uLT5rb19jb3VudCk7CisJCXJlcXVlc3RfcGluZyhjb25uZWN0aW9uKTsKIAl9CiAKLQlyZXR1cm4gZHJvcF9pdDsgLyogJiYgKG1kZXYtPnN0YXRlID09IFJfUFJJTUFSWSkgKi87CisJcmV0dXJuIGRyb3BfaXQ7IC8qICYmIChkZXZpY2UtPnN0YXRlID09IFJfUFJJTUFSWSkgKi87CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfdXBkYXRlX2Nvbmdlc3RlZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgdm9pZCBkcmJkX3VwZGF0ZV9jb25nZXN0ZWQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSB0Y29ubi0+ZGF0YS5zb2NrZXQtPnNrOworCXN0cnVjdCBzb2NrICpzayA9IGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LT5zazsKIAlpZiAoc2stPnNrX3dtZW1fcXVldWVkID4gc2stPnNrX3NuZGJ1ZiAqIDQgLyA1KQotCQlzZXRfYml0KE5FVF9DT05HRVNURUQsICZ0Y29ubi0+ZmxhZ3MpOworCQlzZXRfYml0KE5FVF9DT05HRVNURUQsICZjb25uZWN0aW9uLT5mbGFncyk7CiB9CiAKIC8qIFRoZSBpZGVhIG9mIHNlbmRwYWdlIHNlZW1zIHRvIGJlIHRvIHB1dCBzb21lIGtpbmQgb2YgcmVmZXJlbmNlCkBAIC0xNDcwLDI2ICsxNDc0LDI2IEBACiAgKiBBcyBhIHdvcmthcm91bmQsIHdlIGRpc2FibGUgc2VuZHBhZ2Ugb24gcGFnZXMKICAqIHdpdGggcGFnZV9jb3VudCA9PSAwIG9yIFBhZ2VTbGFiLgogICovCi1zdGF0aWMgaW50IF9kcmJkX25vX3NlbmRfcGFnZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgX2RyYmRfbm9fc2VuZF9wYWdlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkgICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbXNnX2ZsYWdzKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKIAl2b2lkICphZGRyOwogCWludCBlcnI7CiAKLQlzb2NrZXQgPSBtZGV2LT50Y29ubi0+ZGF0YS5zb2NrZXQ7CisJc29ja2V0ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGEuc29ja2V0OwogCWFkZHIgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OwotCWVyciA9IGRyYmRfc2VuZF9hbGwobWRldi0+dGNvbm4sIHNvY2tldCwgYWRkciwgc2l6ZSwgbXNnX2ZsYWdzKTsKKwllcnIgPSBkcmJkX3NlbmRfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBzb2NrZXQsIGFkZHIsIHNpemUsIG1zZ19mbGFncyk7CiAJa3VubWFwKHBhZ2UpOwogCWlmICghZXJyKQotCQltZGV2LT5zZW5kX2NudCArPSBzaXplID4+IDk7CisJCXBlZXJfZGV2aWNlLT5kZXZpY2UtPnNlbmRfY250ICs9IHNpemUgPj4gOTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfcGFnZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF9wYWdlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCSAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbXNnX2ZsYWdzKQogewotCXN0cnVjdCBzb2NrZXQgKnNvY2tldCA9IG1kZXYtPnRjb25uLT5kYXRhLnNvY2tldDsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQ7CiAJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CiAJaW50IGxlbiA9IHNpemU7CiAJaW50IGVyciA9IC1FSU87CkBAIC0xNTAxLDEwICsxNTA1LDEwIEBACiAJICogX19wYWdlX2NhY2hlX3JlbGVhc2UgYSBwYWdlIHRoYXQgd291bGQgYWN0dWFsbHkgc3RpbGwgYmUgcmVmZXJlbmNlZAogCSAqIGJ5IHNvbWVvbmUsIGxlYWRpbmcgdG8gc29tZSBvYnNjdXJlIGRlbGF5ZWQgT29wcyBzb21ld2hlcmUgZWxzZS4gKi8KIAlpZiAoZGlzYWJsZV9zZW5kcGFnZSB8fCAocGFnZV9jb3VudChwYWdlKSA8IDEpIHx8IFBhZ2VTbGFiKHBhZ2UpKQotCQlyZXR1cm4gX2RyYmRfbm9fc2VuZF9wYWdlKG1kZXYsIHBhZ2UsIG9mZnNldCwgc2l6ZSwgbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIF9kcmJkX25vX3NlbmRfcGFnZShwZWVyX2RldmljZSwgcGFnZSwgb2Zmc2V0LCBzaXplLCBtc2dfZmxhZ3MpOwogCiAJbXNnX2ZsYWdzIHw9IE1TR19OT1NJR05BTDsKLQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQobWRldi0+dGNvbm4pOworCWRyYmRfdXBkYXRlX2Nvbmdlc3RlZChwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJZG8gewogCQlpbnQgc2VudDsKQEAgLTE1MTIsMTEgKzE1MTYsMTEgQEAKIAkJc2VudCA9IHNvY2tldC0+b3BzLT5zZW5kcGFnZShzb2NrZXQsIHBhZ2UsIG9mZnNldCwgbGVuLCBtc2dfZmxhZ3MpOwogCQlpZiAoc2VudCA8PSAwKSB7CiAJCQlpZiAoc2VudCA9PSAtRUFHQUlOKSB7Ci0JCQkJaWYgKHdlX3Nob3VsZF9kcm9wX3RoZV9jb25uZWN0aW9uKG1kZXYtPnRjb25uLCBzb2NrZXQpKQorCQkJCWlmICh3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgc29ja2V0KSkKIAkJCQkJYnJlYWs7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlkZXZfd2FybihERVYsICIlczogc2l6ZT0lZCBsZW49JWQgc2VudD0lZFxuIiwKKwkJCWRyYmRfd2FybihwZWVyX2RldmljZS0+ZGV2aWNlLCAiJXM6IHNpemU9JWQgbGVuPSVkIHNlbnQ9JWRcbiIsCiAJCQkgICAgIF9fZnVuY19fLCAoaW50KXNpemUsIGxlbiwgc2VudCk7CiAJCQlpZiAoc2VudCA8IDApCiAJCQkJZXJyID0gc2VudDsKQEAgLTE1MjQsMTggKzE1MjgsMTggQEAKIAkJfQogCQlsZW4gICAgLT0gc2VudDsKIAkJb2Zmc2V0ICs9IHNlbnQ7Ci0JfSB3aGlsZSAobGVuID4gMCAvKiBUSElOSyAmJiBtZGV2LT5jc3RhdGUgPj0gQ19DT05ORUNURUQqLyk7CisJfSB3aGlsZSAobGVuID4gMCAvKiBUSElOSyAmJiBkZXZpY2UtPmNzdGF0ZSA+PSBDX0NPTk5FQ1RFRCovKTsKIAlzZXRfZnMob2xkZnMpOwotCWNsZWFyX2JpdChORVRfQ09OR0VTVEVELCAmbWRldi0+dGNvbm4tPmZsYWdzKTsKKwljbGVhcl9iaXQoTkVUX0NPTkdFU1RFRCwgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncyk7CiAKIAlpZiAobGVuID09IDApIHsKIAkJZXJyID0gMDsKLQkJbWRldi0+c2VuZF9jbnQgKz0gc2l6ZSA+PiA5OworCQlwZWVyX2RldmljZS0+ZGV2aWNlLT5zZW5kX2NudCArPSBzaXplID4+IDk7CiAJfQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfc2VuZF9iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBfZHJiZF9zZW5kX2JpbyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKQEAgLTE1NDQsNyArMTU0OCw3IEBACiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCWludCBlcnI7CiAKLQkJZXJyID0gX2RyYmRfbm9fc2VuZF9wYWdlKG1kZXYsIGJ2ZWMuYnZfcGFnZSwKKwkJZXJyID0gX2RyYmRfbm9fc2VuZF9wYWdlKHBlZXJfZGV2aWNlLCBidmVjLmJ2X3BhZ2UsCiAJCQkJCSBidmVjLmJ2X29mZnNldCwgYnZlYy5idl9sZW4sCiAJCQkJCSBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpCiAJCQkJCSA/IDAgOiBNU0dfTU9SRSk7CkBAIC0xNTU0LDcgKzE1NTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfemNfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19iaW8oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJpb192ZWMgYnZlYzsKIAlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CkBAIC0xNTYzLDcgKzE1NjcsNyBAQAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQlpbnQgZXJyOwogCi0JCWVyciA9IF9kcmJkX3NlbmRfcGFnZShtZGV2LCBidmVjLmJ2X3BhZ2UsCisJCWVyciA9IF9kcmJkX3NlbmRfcGFnZShwZWVyX2RldmljZSwgYnZlYy5idl9wYWdlLAogCQkJCSAgICAgIGJ2ZWMuYnZfb2Zmc2V0LCBidmVjLmJ2X2xlbiwKIAkJCQkgICAgICBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpID8gMCA6IE1TR19NT1JFKTsKIAkJaWYgKGVycikKQEAgLTE1NzIsNyArMTU3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19lZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGludCBfZHJiZF9zZW5kX3pjX2VlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwKIAkJCSAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gcGVlcl9yZXEtPnBhZ2VzOwpAQCAtMTU4Myw3ICsxNTg3LDcgQEAKIAlwYWdlX2NoYWluX2Zvcl9lYWNoKHBhZ2UpIHsKIAkJdW5zaWduZWQgbCA9IG1pbl90KHVuc2lnbmVkLCBsZW4sIFBBR0VfU0laRSk7CiAKLQkJZXJyID0gX2RyYmRfc2VuZF9wYWdlKG1kZXYsIHBhZ2UsIDAsIGwsCisJCWVyciA9IF9kcmJkX3NlbmRfcGFnZShwZWVyX2RldmljZSwgcGFnZSwgMCwgbCwKIAkJCQkgICAgICBwYWdlX2NoYWluX25leHQocGFnZSkgPyBNU0dfTU9SRSA6IDApOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTE1OTIsOSArMTU5Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgYmlvX2ZsYWdzX3RvX3dpcmUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBiaV9ydykKK3N0YXRpYyB1MzIgYmlvX2ZsYWdzX3RvX3dpcmUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgbG9uZyBiaV9ydykKIHsKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NSkKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1KQogCQlyZXR1cm4gIChiaV9ydyAmIFJFUV9TWU5DID8gRFBfUldfU1lOQyA6IDApIHwKIAkJCShiaV9ydyAmIFJFUV9GVUEgPyBEUF9GVUEgOiAwKSB8CiAJCQkoYmlfcncgJiBSRVFfRkxVU0ggPyBEUF9GTFVTSCA6IDApIHwKQEAgLTE2MDYsMjggKzE2MTAsMzAgQEAKIC8qIFVzZWQgdG8gc2VuZCB3cml0ZSByZXF1ZXN0cwogICogUl9QUklNQVJZIC0+IFBlZXIJKFBfREFUQSkKICAqLwotaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQoraW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9kYXRhICpwOwogCXVuc2lnbmVkIGludCBkcF9mbGFncyA9IDA7CiAJaW50IGRnczsKIAlpbnQgZXJyOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7Ci0JZGdzID0gbWRldi0+dGNvbm4tPmludGVncml0eV90Zm0gPyBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOworCWRncyA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtID8KKwkgICAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CiAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHJlcS0+aS5zZWN0b3IpOwogCXAtPmJsb2NrX2lkID0gKHVuc2lnbmVkIGxvbmcpcmVxOwotCXAtPnNlcV9udW0gPSBjcHVfdG9fYmUzMihhdG9taWNfaW5jX3JldHVybigmbWRldi0+cGFja2V0X3NlcSkpOwotCWRwX2ZsYWdzID0gYmlvX2ZsYWdzX3RvX3dpcmUobWRldiwgcmVxLT5tYXN0ZXJfYmlvLT5iaV9ydyk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgotCSAgICBtZGV2LT5zdGF0ZS5jb25uIDw9IENfUEFVU0VEX1NZTkNfVCkKKwlwLT5zZXFfbnVtID0gY3B1X3RvX2JlMzIoYXRvbWljX2luY19yZXR1cm4oJmRldmljZS0+cGFja2V0X3NlcSkpOworCWRwX2ZsYWdzID0gYmlvX2ZsYWdzX3RvX3dpcmUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIHJlcS0+bWFzdGVyX2Jpby0+YmlfcncpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPD0gQ19QQVVTRURfU1lOQ19UKQogCQlkcF9mbGFncyB8PSBEUF9NQVlfU0VUX0lOX1NZTkM7Ci0JaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CiAJCWlmIChyZXEtPnJxX3N0YXRlICYgUlFfRVhQX1JFQ0VJVkVfQUNLKQogCQkJZHBfZmxhZ3MgfD0gRFBfU0VORF9SRUNFSVZFX0FDSzsKIAkJaWYgKHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKQpAQCAtMTYzNSw4ICsxNjQxLDggQEAKIAl9CiAJcC0+ZHBfZmxhZ3MgPSBjcHVfdG9fYmUzMihkcF9mbGFncyk7CiAJaWYgKGRncykKLQkJZHJiZF9jc3VtX2JpbyhtZGV2LCBtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSwgcmVxLT5tYXN0ZXJfYmlvLCBwICsgMSk7Ci0JZXJyID0gX19zZW5kX2NvbW1hbmQobWRldi0+dGNvbm4sIG1kZXYtPnZuciwgc29jaywgUF9EQVRBLCBzaXplb2YoKnApICsgZGdzLCBOVUxMLCByZXEtPmkuc2l6ZSk7CisJCWRyYmRfY3N1bV9iaW8ocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludGVncml0eV90Zm0sIHJlcS0+bWFzdGVyX2JpbywgcCArIDEpOworCWVyciA9IF9fc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBkZXZpY2UtPnZuciwgc29jaywgUF9EQVRBLCBzaXplb2YoKnApICsgZGdzLCBOVUxMLCByZXEtPmkuc2l6ZSk7CiAJaWYgKCFlcnIpIHsKIAkJLyogRm9yIHByb3RvY29sIEEsIHdlIGhhdmUgdG8gbWVtY3B5IHRoZSBwYXlsb2FkIGludG8KIAkJICogc29ja2V0IGJ1ZmZlcnMsIGFzIHdlIG1heSBjb21wbGV0ZSByaWdodCBhd2F5CkBAIC0xNjUwLDE4ICsxNjU2LDE4IEBACiAJCSAqIHJlY2VpdmluZyBzaWRlLCB3ZSBzdXJlIGhhdmUgZGV0ZWN0ZWQgY29ycnVwdGlvbiBlbHNld2hlcmUuCiAJCSAqLwogCQlpZiAoIShyZXEtPnJxX3N0YXRlICYgKFJRX0VYUF9SRUNFSVZFX0FDSyB8IFJRX0VYUF9XUklURV9BQ0spKSB8fCBkZ3MpCi0JCQllcnIgPSBfZHJiZF9zZW5kX2JpbyhtZGV2LCByZXEtPm1hc3Rlcl9iaW8pOworCQkJZXJyID0gX2RyYmRfc2VuZF9iaW8ocGVlcl9kZXZpY2UsIHJlcS0+bWFzdGVyX2Jpbyk7CiAJCWVsc2UKLQkJCWVyciA9IF9kcmJkX3NlbmRfemNfYmlvKG1kZXYsIHJlcS0+bWFzdGVyX2Jpbyk7CisJCQllcnIgPSBfZHJiZF9zZW5kX3pjX2JpbyhwZWVyX2RldmljZSwgcmVxLT5tYXN0ZXJfYmlvKTsKIAogCQkvKiBkb3VibGUgY2hlY2sgZGlnZXN0LCBzb21ldGltZXMgYnVmZmVycyBoYXZlIGJlZW4gbW9kaWZpZWQgaW4gZmxpZ2h0LiAqLwogCQlpZiAoZGdzID4gMCAmJiBkZ3MgPD0gNjQpIHsKIAkJCS8qIDY0IGJ5dGUsIDUxMiBiaXQsIGlzIHRoZSBsYXJnZXN0IGRpZ2VzdCBzaXplCiAJCQkgKiBjdXJyZW50bHkgc3VwcG9ydGVkIGluIGtlcm5lbCBjcnlwdG8uICovCiAJCQl1bnNpZ25lZCBjaGFyIGRpZ2VzdFs2NF07Ci0JCQlkcmJkX2NzdW1fYmlvKG1kZXYsIG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtLCByZXEtPm1hc3Rlcl9iaW8sIGRpZ2VzdCk7CisJCQlkcmJkX2NzdW1fYmlvKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtLCByZXEtPm1hc3Rlcl9iaW8sIGRpZ2VzdCk7CiAJCQlpZiAobWVtY21wKHAgKyAxLCBkaWdlc3QsIGRncykpIHsKLQkJCQlkZXZfd2FybihERVYsCisJCQkJZHJiZF93YXJuKGRldmljZSwKIAkJCQkJIkRpZ2VzdCBtaXNtYXRjaCwgYnVmZmVyIG1vZGlmaWVkIGJ5IHVwcGVyIGxheWVycyBkdXJpbmcgd3JpdGU6ICVsbHVzICsldVxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CiAJCQl9CkBAIC0xNjc4LDE4ICsxNjg0LDIwIEBACiAgKiAgUGVlciAgICAgICAtPiAoZGlza2xlc3MpIFJfUFJJTUFSWSAgIChQX0RBVEFfUkVQTFkpCiAgKiAgQ19TWU5DX1NPVVJDRSAtPiBDX1NZTkNfVEFSR0VUICAgICAgICAgKFBfUlNfREFUQV9SRVBMWSkKICAqLwotaW50IGRyYmRfc2VuZF9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2ludCBkcmJkX3NlbmRfYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICAgIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9kYXRhICpwOwogCWludCBlcnI7CiAJaW50IGRnczsKIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAotCWRncyA9IG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtID8gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSkgOiAwOworCWRncyA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtID8KKwkgICAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CiAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwpAQCAtMTY5OCwyNyArMTcwNiwyNyBAQAogCXAtPnNlcV9udW0gPSAwOyAgLyogdW51c2VkICovCiAJcC0+ZHBfZmxhZ3MgPSAwOwogCWlmIChkZ3MpCi0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSwgcGVlcl9yZXEsIHAgKyAxKTsKLQllcnIgPSBfX3NlbmRfY29tbWFuZChtZGV2LT50Y29ubiwgbWRldi0+dm5yLCBzb2NrLCBjbWQsIHNpemVvZigqcCkgKyBkZ3MsIE5VTEwsIHBlZXJfcmVxLT5pLnNpemUpOworCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludGVncml0eV90Zm0sIHBlZXJfcmVxLCBwICsgMSk7CisJZXJyID0gX19zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLCBjbWQsIHNpemVvZigqcCkgKyBkZ3MsIE5VTEwsIHBlZXJfcmVxLT5pLnNpemUpOwogCWlmICghZXJyKQotCQllcnIgPSBfZHJiZF9zZW5kX3pjX2VlKG1kZXYsIHBlZXJfcmVxKTsKKwkJZXJyID0gX2RyYmRfc2VuZF96Y19lZShwZWVyX2RldmljZSwgcGVlcl9yZXEpOwogCW11dGV4X3VubG9jaygmc29jay0+bXV0ZXgpOyAgLyogbG9ja2VkIGJ5IGRyYmRfcHJlcGFyZV9jb21tYW5kKCkgKi8KIAogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQoraW50IGRyYmRfc2VuZF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfZGVzYyAqcDsKIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHJlcS0+aS5zZWN0b3IpOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihyZXEtPmkuc2l6ZSk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfT1VUX09GX1NZTkMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9PVVRfT0ZfU1lOQywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qCkBAIC0xNzM3LDcgKzE3NDUsNyBAQAogLyoKICAqIHlvdSBtdXN0IGhhdmUgZG93bigpZWQgdGhlIGFwcHJvcHJpYXRlIFttXXNvY2tfbXV0ZXggZWxzZXdoZXJlIQogICovCi1pbnQgZHJiZF9zZW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaywKK2ludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkgICAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpCiB7CiAJc3RydWN0IGt2ZWMgaW92OwpAQCAtMTc1OCwxMSArMTc2NiwxMSBAQAogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CiAJbXNnLm1zZ19mbGFncyAgICAgID0gbXNnX2ZsYWdzIHwgTVNHX05PU0lHTkFMOwogCi0JaWYgKHNvY2sgPT0gdGNvbm4tPmRhdGEuc29ja2V0KSB7CisJaWYgKHNvY2sgPT0gY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl0Y29ubi0+a29fY291bnQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+a29fY291bnQ7CisJCWNvbm5lY3Rpb24tPmtvX2NvdW50ID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKS0+a29fY291bnQ7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQodGNvbm4pOworCQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQoY29ubmVjdGlvbik7CiAJfQogCWRvIHsKIAkJLyogU1RSQU5HRQpAQCAtMTc3Niw3ICsxNzg0LDcgQEAKICAqLwogCQlydiA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpb3YsIDEsIHNpemUpOwogCQlpZiAocnYgPT0gLUVBR0FJTikgewotCQkJaWYgKHdlX3Nob3VsZF9kcm9wX3RoZV9jb25uZWN0aW9uKHRjb25uLCBzb2NrKSkKKwkJCWlmICh3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihjb25uZWN0aW9uLCBzb2NrKSkKIAkJCQlicmVhazsKIAkJCWVsc2UKIAkJCQljb250aW51ZTsKQEAgLTE3OTIsMTcgKzE4MDAsMTcgQEAKIAkJaW92Lmlvdl9sZW4gIC09IHJ2OwogCX0gd2hpbGUgKHNlbnQgPCBzaXplKTsKIAotCWlmIChzb2NrID09IHRjb25uLT5kYXRhLnNvY2tldCkKLQkJY2xlYXJfYml0KE5FVF9DT05HRVNURUQsICZ0Y29ubi0+ZmxhZ3MpOworCWlmIChzb2NrID09IGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0KQorCQljbGVhcl9iaXQoTkVUX0NPTkdFU1RFRCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCWlmIChydiA8PSAwKSB7CiAJCWlmIChydiAhPSAtRUFHQUlOKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIiVzX3NlbmRtc2cgcmV0dXJuZWQgJWRcbiIsCi0JCQkJIHNvY2sgPT0gdGNvbm4tPm1ldGEuc29ja2V0ID8gIm1zb2NrIiA6ICJzb2NrIiwKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlc19zZW5kbXNnIHJldHVybmVkICVkXG4iLAorCQkJCSBzb2NrID09IGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0ID8gIm1zb2NrIiA6ICJzb2NrIiwKIAkJCQkgcnYpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0JST0tFTl9QSVBFKSwgQ1NfSEFSRCk7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOwogCQl9IGVsc2UKLQkJCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19USU1FT1VUKSwgQ1NfSEFSRCk7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19USU1FT1VUKSwgQ1NfSEFSRCk7CiAJfQogCiAJcmV0dXJuIHNlbnQ7CkBAIC0xODEzLDEyICsxODIxLDEyIEBACiAgKgogICogUmV0dXJucyAwIHVwb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBvdGhlcndpc2UuCiAgKi8KLWludCBkcmJkX3NlbmRfYWxsKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmZmVyLAoraW50IGRyYmRfc2VuZF9hbGwoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmZmVyLAogCQkgIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfc2VuZCh0Y29ubiwgc29jaywgYnVmZmVyLCBzaXplLCBtc2dfZmxhZ3MpOworCWVyciA9IGRyYmRfc2VuZChjb25uZWN0aW9uLCBzb2NrLCBidWZmZXIsIHNpemUsIG1zZ19mbGFncyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKGVyciAhPSBzaXplKQpAQCAtMTgyOCwxNiArMTgzNiwxNiBAQAogCiBzdGF0aWMgaW50IGRyYmRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBydiA9IDA7CiAKIAltdXRleF9sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQkvKiB0byBoYXZlIGEgc3RhYmxlIG1kZXYtPnN0YXRlLnJvbGUKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwkvKiB0byBoYXZlIGEgc3RhYmxlIGRldmljZS0+c3RhdGUucm9sZQogCSAqIGFuZCBubyByYWNlIHdpdGggdXBkYXRpbmcgb3Blbl9jbnQgKi8KIAotCWlmIChtZGV2LT5zdGF0ZS5yb2xlICE9IFJfUFJJTUFSWSkgeworCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9QUklNQVJZKSB7CiAJCWlmIChtb2RlICYgRk1PREVfV1JJVEUpCiAJCQlydiA9IC1FUk9GUzsKIAkJZWxzZSBpZiAoIWFsbG93X29vcykKQEAgLTE4NDUsOCArMTg1Myw4IEBACiAJfQogCiAJaWYgKCFydikKLQkJbWRldi0+b3Blbl9jbnQrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJZGV2aWNlLT5vcGVuX2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwogCiAJcmV0dXJuIHJ2OwpAQCAtMTg1NCwxNyArMTg2MiwxNyBAQAogCiBzdGF0aWMgdm9pZCBkcmJkX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmdkLCBmbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGdkLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOwogCW11dGV4X2xvY2soJmRyYmRfbWFpbl9tdXRleCk7Ci0JbWRldi0+b3Blbl9jbnQtLTsKKwlkZXZpY2UtPm9wZW5fY250LS07CiAJbXV0ZXhfdW5sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIHZvaWQgZHJiZF9zZXRfZGVmYXVsdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogQmV3YXJlISBUaGUgYWN0dWFsIGxheW91dCBkaWZmZXJzCiAJICogYmV0d2VlbiBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuICovCi0JbWRldi0+c3RhdGUgPSAodW5pb24gZHJiZF9kZXZfc3RhdGUpIHsKKwlkZXZpY2UtPnN0YXRlID0gKHVuaW9uIGRyYmRfZGV2X3N0YXRlKSB7CiAJCXsgLnJvbGUgPSBSX1NFQ09OREFSWSwKIAkJICAucGVlciA9IFJfVU5LTk9XTiwKIAkJICAuY29ubiA9IENfU1RBTkRBTE9ORSwKQEAgLTE4NzMsMTMwICsxODgxLDEyMyBAQAogCQl9IH07CiB9CiAKLXZvaWQgZHJiZF9pbml0X3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2luaXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIHRoZSBtZW1zZXQoLDAsKSBkaWQgbW9zdCBvZiB0aGlzLgogCSAqIG5vdGU6IG9ubHkgYXNzaWdubWVudHMsIG5vIGFsbG9jYXRpb24gaW4gaGVyZSAqLwogCi0JZHJiZF9zZXRfZGVmYXVsdHMobWRldik7CisJZHJiZF9zZXRfZGVmYXVsdHMoZGV2aWNlKTsKIAotCWF0b21pY19zZXQoJm1kZXYtPmFwX2Jpb19jbnQsIDApOwotCWF0b21pY19zZXQoJm1kZXYtPmFwX3BlbmRpbmdfY250LCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19wZW5kaW5nX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+dW5hY2tlZF9jbnQsIDApOwotCWF0b21pY19zZXQoJm1kZXYtPmxvY2FsX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cHBfaW5fdXNlX2J5X25ldCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cnNfc2VjdF9pbiwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cnNfc2VjdF9ldiwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+YXBfaW5fZmxpZ2h0LCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5tZF9pb19pbl91c2UsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+YXBfYmlvX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT51bmFja2VkX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5sb2NhbF9jbnQsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+cHBfaW5fdXNlX2J5X25ldCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19zZWN0X2luLCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPnJzX3NlY3RfZXYsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+YXBfaW5fZmxpZ2h0LCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPm1kX2lvX2luX3VzZSwgMCk7CiAKLQltdXRleF9pbml0KCZtZGV2LT5vd25fc3RhdGVfbXV0ZXgpOwotCW1kZXYtPnN0YXRlX211dGV4ID0gJm1kZXYtPm93bl9zdGF0ZV9tdXRleDsKKwltdXRleF9pbml0KCZkZXZpY2UtPm93bl9zdGF0ZV9tdXRleCk7CisJZGV2aWNlLT5zdGF0ZV9tdXRleCA9ICZkZXZpY2UtPm93bl9zdGF0ZV9tdXRleDsKIAotCXNwaW5fbG9ja19pbml0KCZtZGV2LT5hbF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+YWN0aXZlX2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+c3luY19lZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1kZXYtPmRvbmVfZWUpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5yZWFkX2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+bmV0X2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+cmVzeW5jX3JlYWRzKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+cmVzeW5jX3dvcmsubGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1kZXYtPnVucGx1Z193b3JrLmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5nb19kaXNrbGVzcy5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+bWRfc3luY193b3JrLmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5zdGFydF9yZXN5bmNfd29yay5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+Ym1faW9fd29yay53Lmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmFjdGl2ZV9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+c3luY19lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+ZG9uZV9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cmVhZF9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bmV0X2VlKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5yZXN5bmNfcmVhZHMpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnJlc3luY193b3JrLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnVucGx1Z193b3JrLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmdvX2Rpc2tsZXNzLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPm1kX3N5bmNfd29yay5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5zdGFydF9yZXN5bmNfd29yay5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5ibV9pb193b3JrLncubGlzdCk7CiAKLQltZGV2LT5yZXN5bmNfd29yay5jYiAgPSB3X3Jlc3luY190aW1lcjsKLQltZGV2LT51bnBsdWdfd29yay5jYiAgPSB3X3NlbmRfd3JpdGVfaGludDsKLQltZGV2LT5nb19kaXNrbGVzcy5jYiAgPSB3X2dvX2Rpc2tsZXNzOwotCW1kZXYtPm1kX3N5bmNfd29yay5jYiA9IHdfbWRfc3luYzsKLQltZGV2LT5ibV9pb193b3JrLncuY2IgPSB3X2JpdG1hcF9pbzsKLQltZGV2LT5zdGFydF9yZXN5bmNfd29yay5jYiA9IHdfc3RhcnRfcmVzeW5jOworCWRldmljZS0+cmVzeW5jX3dvcmsuY2IgID0gd19yZXN5bmNfdGltZXI7CisJZGV2aWNlLT51bnBsdWdfd29yay5jYiAgPSB3X3NlbmRfd3JpdGVfaGludDsKKwlkZXZpY2UtPmdvX2Rpc2tsZXNzLmNiICA9IHdfZ29fZGlza2xlc3M7CisJZGV2aWNlLT5tZF9zeW5jX3dvcmsuY2IgPSB3X21kX3N5bmM7CisJZGV2aWNlLT5ibV9pb193b3JrLncuY2IgPSB3X2JpdG1hcF9pbzsKKwlkZXZpY2UtPnN0YXJ0X3Jlc3luY193b3JrLmNiID0gd19zdGFydF9yZXN5bmM7CiAKLQltZGV2LT5yZXN5bmNfd29yay5tZGV2ICA9IG1kZXY7Ci0JbWRldi0+dW5wbHVnX3dvcmsubWRldiAgPSBtZGV2OwotCW1kZXYtPmdvX2Rpc2tsZXNzLm1kZXYgID0gbWRldjsKLQltZGV2LT5tZF9zeW5jX3dvcmsubWRldiA9IG1kZXY7Ci0JbWRldi0+Ym1faW9fd29yay53Lm1kZXYgPSBtZGV2OwotCW1kZXYtPnN0YXJ0X3Jlc3luY193b3JrLm1kZXYgPSBtZGV2OworCWluaXRfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZkZXZpY2UtPm1kX3N5bmNfdGltZXIpOworCWluaXRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIpOworCWRldmljZS0+cmVzeW5jX3RpbWVyLmZ1bmN0aW9uID0gcmVzeW5jX3RpbWVyX2ZuOworCWRldmljZS0+cmVzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+bWRfc3luY190aW1lci5mdW5jdGlvbiA9IG1kX3N5bmNfdGltZXJfZm47CisJZGV2aWNlLT5tZF9zeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmZ1bmN0aW9uID0gc3RhcnRfcmVzeW5jX3RpbWVyX2ZuOworCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+cmVxdWVzdF90aW1lci5mdW5jdGlvbiA9IHJlcXVlc3RfdGltZXJfZm47CisJZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOwogCi0JaW5pdF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyKTsKLQlpbml0X3RpbWVyKCZtZGV2LT5tZF9zeW5jX3RpbWVyKTsKLQlpbml0X3RpbWVyKCZtZGV2LT5zdGFydF9yZXN5bmNfdGltZXIpOwotCWluaXRfdGltZXIoJm1kZXYtPnJlcXVlc3RfdGltZXIpOwotCW1kZXYtPnJlc3luY190aW1lci5mdW5jdGlvbiA9IHJlc3luY190aW1lcl9mbjsKLQltZGV2LT5yZXN5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPm1kX3N5bmNfdGltZXIuZnVuY3Rpb24gPSBtZF9zeW5jX3RpbWVyX2ZuOwotCW1kZXYtPm1kX3N5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPnN0YXJ0X3Jlc3luY190aW1lci5mdW5jdGlvbiA9IHN0YXJ0X3Jlc3luY190aW1lcl9mbjsKLQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPnJlcXVlc3RfdGltZXIuZnVuY3Rpb24gPSByZXF1ZXN0X3RpbWVyX2ZuOwotCW1kZXYtPnJlcXVlc3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+bWlzY193YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPnN0YXRlX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+ZWVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlLT5hbF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPnNlcV93YWl0KTsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1kZXYtPm1pc2Nfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+c3RhdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+ZWVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+YWxfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+c2VxX3dhaXQpOwotCi0JbWRldi0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOwotCW1kZXYtPnBlZXJfbWF4X2Jpb19zaXplID0gRFJCRF9NQVhfQklPX1NJWkVfU0FGRTsKLQltZGV2LT5sb2NhbF9tYXhfYmlvX3NpemUgPSBEUkJEX01BWF9CSU9fU0laRV9TQUZFOworCWRldmljZS0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOworCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBEUkJEX01BWF9CSU9fU0laRV9TQUZFOworCWRldmljZS0+bG9jYWxfbWF4X2Jpb19zaXplID0gRFJCRF9NQVhfQklPX1NJWkVfU0FGRTsKIH0KIAotdm9pZCBkcmJkX21kZXZfY2xlYW51cChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2RldmljZV9jbGVhbnVwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBpOwotCWlmIChtZGV2LT50Y29ubi0+cmVjZWl2ZXIudF9zdGF0ZSAhPSBOT05FKQotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IHJlY2VpdmVyIHRfc3RhdGUgPT0gJWQgZXhwZWN0ZWQgMC5cbiIsCi0JCQkJbWRldi0+dGNvbm4tPnJlY2VpdmVyLnRfc3RhdGUpOworCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5yZWNlaXZlci50X3N0YXRlICE9IE5PTkUpCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQ6IHJlY2VpdmVyIHRfc3RhdGUgPT0gJWQgZXhwZWN0ZWQgMC5cbiIsCisJCQkJZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIudF9zdGF0ZSk7CiAKLQltZGV2LT5hbF93cml0X2NudCAgPQotCW1kZXYtPmJtX3dyaXRfY250ICA9Ci0JbWRldi0+cmVhZF9jbnQgICAgID0KLQltZGV2LT5yZWN2X2NudCAgICAgPQotCW1kZXYtPnNlbmRfY250ICAgICA9Ci0JbWRldi0+d3JpdF9jbnQgICAgID0KLQltZGV2LT5wX3NpemUgICAgICAgPQotCW1kZXYtPnJzX3N0YXJ0ICAgICA9Ci0JbWRldi0+cnNfdG90YWwgICAgID0KLQltZGV2LT5yc19mYWlsZWQgICAgPSAwOwotCW1kZXYtPnJzX2xhc3RfZXZlbnRzID0gMDsKLQltZGV2LT5yc19sYXN0X3NlY3RfZXYgPSAwOworCWRldmljZS0+YWxfd3JpdF9jbnQgID0KKwlkZXZpY2UtPmJtX3dyaXRfY250ICA9CisJZGV2aWNlLT5yZWFkX2NudCAgICAgPQorCWRldmljZS0+cmVjdl9jbnQgICAgID0KKwlkZXZpY2UtPnNlbmRfY250ICAgICA9CisJZGV2aWNlLT53cml0X2NudCAgICAgPQorCWRldmljZS0+cF9zaXplICAgICAgID0KKwlkZXZpY2UtPnJzX3N0YXJ0ICAgICA9CisJZGV2aWNlLT5yc190b3RhbCAgICAgPQorCWRldmljZS0+cnNfZmFpbGVkICAgID0gMDsKKwlkZXZpY2UtPnJzX2xhc3RfZXZlbnRzID0gMDsKKwlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCW1kZXYtPnJzX21hcmtfbGVmdFtpXSA9IDA7Ci0JCW1kZXYtPnJzX21hcmtfdGltZVtpXSA9IDA7CisJCWRldmljZS0+cnNfbWFya19sZWZ0W2ldID0gMDsKKwkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSAwOwogCX0KLQlEX0FTU0VSVChtZGV2LT50Y29ubi0+bmV0X2NvbmYgPT0gTlVMTCk7CisJRF9BU1NFUlQoZGV2aWNlLCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZiA9PSBOVUxMKTsKIAotCWRyYmRfc2V0X215X2NhcGFjaXR5KG1kZXYsIDApOwotCWlmIChtZGV2LT5iaXRtYXApIHsKKwlkcmJkX3NldF9teV9jYXBhY2l0eShkZXZpY2UsIDApOworCWlmIChkZXZpY2UtPmJpdG1hcCkgewogCQkvKiBtYXliZSBuZXZlciBhbGxvY2F0ZWQuICovCi0JCWRyYmRfYm1fcmVzaXplKG1kZXYsIDAsIDEpOwotCQlkcmJkX2JtX2NsZWFudXAobWRldik7CisJCWRyYmRfYm1fcmVzaXplKGRldmljZSwgMCwgMSk7CisJCWRyYmRfYm1fY2xlYW51cChkZXZpY2UpOwogCX0KIAotCWRyYmRfZnJlZV9iYyhtZGV2LT5sZGV2KTsKLQltZGV2LT5sZGV2ID0gTlVMTDsKKwlkcmJkX2ZyZWVfYmMoZGV2aWNlLT5sZGV2KTsKKwlkZXZpY2UtPmxkZXYgPSBOVUxMOwogCi0JY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncyk7CiAKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5hY3RpdmVfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5zeW5jX2VlKSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+ZG9uZV9lZSkpOwotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5uZXRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5yZXN5bmNfcmVhZHMpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmsucSkpOwotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlc3luY193b3JrLmxpc3QpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT51bnBsdWdfd29yay5saXN0KSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+Z29fZGlza2xlc3MubGlzdCkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5hY3RpdmVfZWUpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+c3luY19lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5kb25lX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnJlYWRfZWUpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+bmV0X2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnJlc3luY19yZWFkcykpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5yZXN5bmNfd29yay5saXN0KSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnVucGx1Z193b3JrLmxpc3QpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+Z29fZGlza2xlc3MubGlzdCkpOwogCi0JZHJiZF9zZXRfZGVmYXVsdHMobWRldik7CisJZHJiZF9zZXRfZGVmYXVsdHMoZGV2aWNlKTsKIH0KIAogCkBAIC0yMDExLDcgKzIwMTIsNyBAQAogCQlkcmJkX3BwX3ZhY2FudC0tOwogCX0KIAotCS8qIERfQVNTRVJUKGF0b21pY19yZWFkKCZkcmJkX3BwX3ZhY2FudCk9PTApOyAqLworCS8qIERfQVNTRVJUKGRldmljZSwgYXRvbWljX3JlYWQoJmRyYmRfcHBfdmFjYW50KT09MCk7ICovCiAKIAlpZiAoZHJiZF9tZF9pb19iaW9fc2V0KQogCQliaW9zZXRfZnJlZShkcmJkX21kX2lvX2Jpb19zZXQpOwpAQCAtMjEzMSw2OSArMjEzMiw3MyBAQAogCS5ub3RpZmllcl9jYWxsID0gZHJiZF9ub3RpZnlfc3lzLAogfTsKIAotc3RhdGljIHZvaWQgZHJiZF9yZWxlYXNlX2FsbF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfcmVsZWFzZV9hbGxfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBycjsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+YWN0aXZlX2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gYWN0aXZlIGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBhY3RpdmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+c3luY19lZSk7CisJcnIgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKGRldmljZSwgJmRldmljZS0+c3luY19lZSk7CiAJaWYgKHJyKQotCQlkZXZfZXJyKERFViwgIiVkIEVFcyBpbiBzeW5jIGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBzeW5jIGxpc3QgZm91bmQhXG4iLCBycik7CiAKLQlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMobWRldiwgJm1kZXYtPnJlYWRfZWUpOworCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhkZXZpY2UsICZkZXZpY2UtPnJlYWRfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gcmVhZCBsaXN0IGZvdW5kIVxuIiwgcnIpOworCQlkcmJkX2VycihkZXZpY2UsICIlZCBFRXMgaW4gcmVhZCBsaXN0IGZvdW5kIVxuIiwgcnIpOwogCi0JcnIgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKG1kZXYsICZtZGV2LT5kb25lX2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5kb25lX2VlKTsKIAlpZiAocnIpCi0JCWRldl9lcnIoREVWLCAiJWQgRUVzIGluIGRvbmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiJWQgRUVzIGluIGRvbmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+bmV0X2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5uZXRfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gbmV0IGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBuZXQgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIH0KIAogLyogY2F1dGlvbi4gbm8gbG9ja2luZy4gKi8KLXZvaWQgZHJiZF9taW5vcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQordm9pZCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKHN0cnVjdCBrcmVmICprcmVmKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfY29uZiwga3JlZik7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfZGV2aWNlLCBrcmVmKTsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSBkZXZpY2UtPnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAKLQlkZWxfdGltZXJfc3luYygmbWRldi0+cmVxdWVzdF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmRldmljZS0+cmVxdWVzdF90aW1lcik7CiAKIAkvKiBwYXJhbm9pYSBhc3NlcnRzICovCi0JRF9BU1NFUlQobWRldi0+b3Blbl9jbnQgPT0gMCk7CisJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPm9wZW5fY250ID09IDApOwogCS8qIGVuZCBwYXJhbm9pYSBhc3NlcnRzICovCiAKIAkvKiBjbGVhbnVwIHN0dWZmIHRoYXQgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZHVyaW5nCiAJICogZGV2aWNlIChyZS0pY29uZmlndXJhdGlvbiBvciBzdGF0ZSBjaGFuZ2VzICovCiAKLQlpZiAobWRldi0+dGhpc19iZGV2KQotCQliZHB1dChtZGV2LT50aGlzX2JkZXYpOworCWlmIChkZXZpY2UtPnRoaXNfYmRldikKKwkJYmRwdXQoZGV2aWNlLT50aGlzX2JkZXYpOwogCi0JZHJiZF9mcmVlX2JjKG1kZXYtPmxkZXYpOwotCW1kZXYtPmxkZXYgPSBOVUxMOworCWRyYmRfZnJlZV9iYyhkZXZpY2UtPmxkZXYpOworCWRldmljZS0+bGRldiA9IE5VTEw7CiAKLQlkcmJkX3JlbGVhc2VfYWxsX3BlZXJfcmVxcyhtZGV2KTsKKwlkcmJkX3JlbGVhc2VfYWxsX3BlZXJfcmVxcyhkZXZpY2UpOwogCi0JbGNfZGVzdHJveShtZGV2LT5hY3RfbG9nKTsKLQlsY19kZXN0cm95KG1kZXYtPnJlc3luYyk7CisJbGNfZGVzdHJveShkZXZpY2UtPmFjdF9sb2cpOworCWxjX2Rlc3Ryb3koZGV2aWNlLT5yZXN5bmMpOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQkvKiBtZGV2LT5wX3V1aWQgPSBOVUxMOyAqLworCWtmcmVlKGRldmljZS0+cF91dWlkKTsKKwkvKiBkZXZpY2UtPnBfdXVpZCA9IE5VTEw7ICovCiAKLQlpZiAobWRldi0+Yml0bWFwKSAvKiBzaG91bGQgbm8gbG9uZ2VyIGJlIHRoZXJlLiAqLwotCQlkcmJkX2JtX2NsZWFudXAobWRldik7Ci0JX19mcmVlX3BhZ2UobWRldi0+bWRfaW9fcGFnZSk7Ci0JcHV0X2Rpc2sobWRldi0+dmRpc2spOwotCWJsa19jbGVhbnVwX3F1ZXVlKG1kZXYtPnJxX3F1ZXVlKTsKLQlrZnJlZShtZGV2LT5yc19wbGFuX3MpOwotCWtmcmVlKG1kZXYpOworCWlmIChkZXZpY2UtPmJpdG1hcCkgLyogc2hvdWxkIG5vIGxvbmdlciBiZSB0aGVyZS4gKi8KKwkJZHJiZF9ibV9jbGVhbnVwKGRldmljZSk7CisJX19mcmVlX3BhZ2UoZGV2aWNlLT5tZF9pb19wYWdlKTsKKwlwdXRfZGlzayhkZXZpY2UtPnZkaXNrKTsKKwlibGtfY2xlYW51cF9xdWV1ZShkZXZpY2UtPnJxX3F1ZXVlKTsKKwlrZnJlZShkZXZpY2UtPnJzX3BsYW5fcyk7CisJa2ZyZWUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CisJa2ZyZWUoZGV2aWNlKTsKIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKKwlrcmVmX3B1dCgmcmVzb3VyY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9yZXNvdXJjZSk7CiB9CiAKIC8qIE9uZSBnbG9iYWwgcmV0cnkgdGhyZWFkLCBpZiB3ZSBuZWVkIHRvIHB1c2ggYmFjayBzb21lIGJpbyBhbmQgaGF2ZSBpdApAQCAtMjIxOCwxOSArMjIyMywxOSBAQAogCXNwaW5fdW5sb2NrX2lycSgmcmV0cnktPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCAmd3JpdGVzLCB0bF9yZXF1ZXN0cykgewotCQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJCXN0cnVjdCBiaW8gKmJpbyA9IHJlcS0+bWFzdGVyX2JpbzsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gcmVxLT5zdGFydF90aW1lOwogCQlib29sIGV4cGVjdGVkOwogCi0JCWV4cGVjdGVkID0gCisJCWV4cGVjdGVkID0KIAkJCWV4cGVjdChhdG9taWNfcmVhZCgmcmVxLT5jb21wbGV0aW9uX3JlZikgPT0gMCkgJiYKIAkJCWV4cGVjdChyZXEtPnJxX3N0YXRlICYgUlFfUE9TVFBPTkVEKSAmJgogCQkJZXhwZWN0KChyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORykgPT0gMCB8fAogCQkJCShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfQUJPUlRFRCkgIT0gMCk7CiAKIAkJaWYgKCFleHBlY3RlZCkKLQkJCWRldl9lcnIoREVWLCAicmVxPSVwIGNvbXBsZXRpb25fcmVmPSVkIHJxX3N0YXRlPSV4XG4iLAorCQkJZHJiZF9lcnIoZGV2aWNlLCAicmVxPSVwIGNvbXBsZXRpb25fcmVmPSVkIHJxX3N0YXRlPSV4XG4iLAogCQkJCXJlcSwgYXRvbWljX3JlYWQoJnJlcS0+Y29tcGxldGlvbl9yZWYpLAogCQkJCXJlcS0+cnFfc3RhdGUpOwogCkBAIC0yMjU0LDggKzIyNTksOCBAQAogCiAJCS8qIFdlIGFyZSBub3QganVzdCBkb2luZyBnZW5lcmljX21ha2VfcmVxdWVzdCgpLAogCQkgKiBhcyB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0YXJ0X3RpbWUgaW5mb3JtYXRpb24uICovCi0JCWluY19hcF9iaW8obWRldik7Ci0JCV9fZHJiZF9tYWtlX3JlcXVlc3QobWRldiwgYmlvLCBzdGFydF90aW1lKTsKKwkJaW5jX2FwX2JpbyhkZXZpY2UpOworCQlfX2RyYmRfbWFrZV9yZXF1ZXN0KGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIAl9CiB9CiAKQEAgLTIyNjksMTcgKzIyNzQsMzggQEAKIAkvKiBEcm9wIHRoZSBleHRyYSByZWZlcmVuY2UgdGhhdCB3b3VsZCBvdGhlcndpc2UKIAkgKiBoYXZlIGJlZW4gZHJvcHBlZCBieSBjb21wbGV0ZV9tYXN0ZXJfYmlvLgogCSAqIGRvX3JldHJ5KCkgbmVlZHMgdG8gZ3JhYiBhIG5ldyBvbmUuICovCi0JZGVjX2FwX2JpbyhyZXEtPncubWRldik7CisJZGVjX2FwX2JpbyhyZXEtPmRldmljZSk7CiAKIAlxdWV1ZV93b3JrKHJldHJ5LndxLCAmcmV0cnkud29ya2VyKTsKIH0KIAordm9pZCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkcmJkX3Jlc291cmNlLCBrcmVmKTsKKworCWlkcl9kZXN0cm95KCZyZXNvdXJjZS0+ZGV2aWNlcyk7CisJZnJlZV9jcHVtYXNrX3ZhcihyZXNvdXJjZS0+Y3B1X21hc2spOworCWtmcmVlKHJlc291cmNlLT5uYW1lKTsKKwlrZnJlZShyZXNvdXJjZSk7Cit9CisKK3ZvaWQgZHJiZF9mcmVlX3Jlc291cmNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCAqdG1wOworCisJZm9yX2VhY2hfY29ubmVjdGlvbl9zYWZlKGNvbm5lY3Rpb24sIHRtcCwgcmVzb3VyY2UpIHsKKwkJbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmNvbm5lY3Rpb25zKTsKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKKwl9CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworfQogCiBzdGF0aWMgdm9pZCBkcmJkX2NsZWFudXAodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgKnRtcDsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsICp0bXA7CiAKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZHJiZF9ub3RpZmllcik7CiAKQEAgLTIyOTksMjYgKzIzMjUsMTkgQEAKIAogCWRyYmRfZ2VubF91bnJlZ2lzdGVyKCk7CiAKLQlpZHJfZm9yX2VhY2hfZW50cnkoJm1pbm9ycywgbWRldiwgaSkgewotCQlpZHJfcmVtb3ZlKCZtaW5vcnMsIG1kZXZfdG9fbWlub3IobWRldikpOwotCQlpZHJfcmVtb3ZlKCZtZGV2LT50Y29ubi0+dm9sdW1lcywgbWRldi0+dm5yKTsKLQkJZGVzdHJveV93b3JrcXVldWUobWRldi0+c3VibWl0LndxKTsKLQkJZGVsX2dlbmRpc2sobWRldi0+dmRpc2spOwotCQkvKiBzeW5jaHJvbml6ZV9yY3UoKTsgTm8gb3RoZXIgdGhyZWFkcyBydW5uaW5nIGF0IHRoaXMgcG9pbnQgKi8KLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOwotCX0KKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgZGV2aWNlLCBpKQorCQlkcmJkX2RlbGV0ZV9kZXZpY2UoZGV2aWNlKTsKIAogCS8qIG5vdCBfcmN1IHNpbmNlLCBubyBvdGhlciB1cGRhdGVyIGFueW1vcmUuIEdlbmwgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGNvbm4sIHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkJbGlzdF9kZWwoJnRjb25uLT5hbGxfdGNvbm4pOyAvKiBub3QgX3JjdSBubyBwcm9jLCBub3Qgb3RoZXIgdGhyZWFkcyAqLwotCQkvKiBzeW5jaHJvbml6ZV9yY3UoKTsgKi8KLQkJa3JlZl9wdXQoJnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlmb3JfZWFjaF9yZXNvdXJjZV9zYWZlKHJlc291cmNlLCB0bXAsICZkcmJkX3Jlc291cmNlcykgeworCQlsaXN0X2RlbCgmcmVzb3VyY2UtPnJlc291cmNlcyk7CisJCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CiAJfQogCiAJZHJiZF9kZXN0cm95X21lbXBvb2xzKCk7CiAJdW5yZWdpc3Rlcl9ibGtkZXYoRFJCRF9NQUpPUiwgImRyYmQiKTsKIAotCWlkcl9kZXN0cm95KCZtaW5vcnMpOworCWlkcl9kZXN0cm95KCZkcmJkX2RldmljZXMpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZHJiZDogbW9kdWxlIGNsZWFudXAgZG9uZS5cbiIpOwogfQpAQCAtMjMzMiw0OSArMjM1MSw1MCBAQAogICovCiBzdGF0aWMgaW50IGRyYmRfY29uZ2VzdGVkKHZvaWQgKmNvbmdlc3RlZF9kYXRhLCBpbnQgYmRpX2JpdHMpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGNvbmdlc3RlZF9kYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gY29uZ2VzdGVkX2RhdGE7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJY2hhciByZWFzb24gPSAnLSc7CiAJaW50IHIgPSAwOwogCi0JaWYgKCFtYXlfaW5jX2FwX2JpbyhtZGV2KSkgeworCWlmICghbWF5X2luY19hcF9iaW8oZGV2aWNlKSkgewogCQkvKiBEUkJEIGhhcyBmcm96ZW4gSU8gKi8KIAkJciA9IGJkaV9iaXRzOwogCQlyZWFzb24gPSAnZCc7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0ZXN0X2JpdChDQUxMQkFDS19QRU5ESU5HLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChDQUxMQkFDS19QRU5ESU5HLCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpKSB7CiAJCXIgfD0gKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCk7CiAJCS8qIFdpdGhvdXQgZ29vZCBsb2NhbCBkYXRhLCB3ZSB3b3VsZCBuZWVkIHRvIHJlYWQgZnJvbSByZW1vdGUsCiAJCSAqIGFuZCB0aGF0IHdvdWxkIG5lZWQgdGhlIHdvcmtlciB0aHJlYWQgYXMgd2VsbCwgd2hpY2ggaXMKIAkJICogY3VycmVudGx5IGJsb2NrZWQgd2FpdGluZyBmb3IgdGhhdCB1c2VybW9kZSBoZWxwZXIgdG8KIAkJICogZmluaXNoLgogCQkgKi8KLQkJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX1VQX1RPX0RBVEUpKQorCQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9VUF9UT19EQVRFKSkKIAkJCXIgfD0gKDEgPDwgQkRJX3N5bmNfY29uZ2VzdGVkKTsKIAkJZWxzZQotCQkJcHV0X2xkZXYobWRldik7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQlyICY9IGJkaV9iaXRzOwogCQlyZWFzb24gPSAnYyc7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlxID0gYmRldl9nZXRfcXVldWUobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlxID0gYmRldl9nZXRfcXVldWUoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCQlyID0gYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgYmRpX2JpdHMpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJaWYgKHIpCiAJCQlyZWFzb24gPSAnYic7CiAJfQogCi0JaWYgKGJkaV9iaXRzICYgKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCkgJiYgdGVzdF9iaXQoTkVUX0NPTkdFU1RFRCwgJm1kZXYtPnRjb25uLT5mbGFncykpIHsKKwlpZiAoYmRpX2JpdHMgJiAoMSA8PCBCRElfYXN5bmNfY29uZ2VzdGVkKSAmJgorCSAgICB0ZXN0X2JpdChORVRfQ09OR0VTVEVELCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpKSB7CiAJCXIgfD0gKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCk7CiAJCXJlYXNvbiA9IHJlYXNvbiA9PSAnYicgPyAnYScgOiAnbic7CiAJfQogCiBvdXQ6Ci0JbWRldi0+Y29uZ2VzdGlvbl9yZWFzb24gPSByZWFzb247CisJZGV2aWNlLT5jb25nZXN0aW9uX3JlYXNvbiA9IHJlYXNvbjsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMjM4NSw0NSArMjQwNSw3MiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndxLT5xX3dhaXQpOwogfQogCi1zdHJ1Y3QgZHJiZF90Y29ubiAqY29ubl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQorc3RydWN0IGNvbXBsZXRpb25fd29yayB7CisJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Cit9OworCitzdGF0aWMgaW50IHdfY29tcGxldGUoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGNvbXBsZXRpb25fd29yayAqY29tcGxldGlvbl93b3JrID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBjb21wbGV0aW9uX3dvcmssIHcpOworCisJY29tcGxldGUoJmNvbXBsZXRpb25fd29yay0+ZG9uZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHJiZF9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqd29ya19xdWV1ZSkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbl93b3JrIGNvbXBsZXRpb25fd29yazsKKworCWNvbXBsZXRpb25fd29yay53LmNiID0gd19jb21wbGV0ZTsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXBsZXRpb25fd29yay5kb25lKTsKKwlkcmJkX3F1ZXVlX3dvcmsod29ya19xdWV1ZSwgJmNvbXBsZXRpb25fd29yay53KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uX3dvcmsuZG9uZSk7Cit9CisKK3N0cnVjdCBkcmJkX3Jlc291cmNlICpkcmJkX2ZpbmRfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2U7CiAKIAlpZiAoIW5hbWUgfHwgIW5hbWVbMF0pCiAJCXJldHVybiBOVUxMOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRjb25uLCAmZHJiZF90Y29ubnMsIGFsbF90Y29ubikgewotCQlpZiAoIXN0cmNtcCh0Y29ubi0+bmFtZSwgbmFtZSkpIHsKLQkJCWtyZWZfZ2V0KCZ0Y29ubi0+a3JlZik7CisJZm9yX2VhY2hfcmVzb3VyY2VfcmN1KHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJaWYgKCFzdHJjbXAocmVzb3VyY2UtPm5hbWUsIG5hbWUpKSB7CisJCQlrcmVmX2dldCgmcmVzb3VyY2UtPmtyZWYpOwogCQkJZ290byBmb3VuZDsKIAkJfQogCX0KLQl0Y29ubiA9IE5VTEw7CisJcmVzb3VyY2UgPSBOVUxMOwogZm91bmQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHRjb25uOworCXJldHVybiByZXNvdXJjZTsKIH0KIAotc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKIAkJCQkgICAgIHZvaWQgKnBlZXJfYWRkciwgaW50IHBlZXJfYWRkcl9sZW4pCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRjb25uLCAmZHJiZF90Y29ubnMsIGFsbF90Y29ubikgewotCQlpZiAodGNvbm4tPm15X2FkZHJfbGVuID09IG15X2FkZHJfbGVuICYmCi0JCSAgICB0Y29ubi0+cGVlcl9hZGRyX2xlbiA9PSBwZWVyX2FkZHJfbGVuICYmCi0JCSAgICAhbWVtY21wKCZ0Y29ubi0+bXlfYWRkciwgbXlfYWRkciwgbXlfYWRkcl9sZW4pICYmCi0JCSAgICAhbWVtY21wKCZ0Y29ubi0+cGVlcl9hZGRyLCBwZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pKSB7Ci0JCQlrcmVmX2dldCgmdGNvbm4tPmtyZWYpOwotCQkJZ290byBmb3VuZDsKKwlmb3JfZWFjaF9yZXNvdXJjZV9yY3UocmVzb3VyY2UsICZkcmJkX3Jlc291cmNlcykgeworCQlmb3JfZWFjaF9jb25uZWN0aW9uX3JjdShjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQkJaWYgKGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID09IG15X2FkZHJfbGVuICYmCisJCQkgICAgY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbiA9PSBwZWVyX2FkZHJfbGVuICYmCisJCQkgICAgIW1lbWNtcCgmY29ubmVjdGlvbi0+bXlfYWRkciwgbXlfYWRkciwgbXlfYWRkcl9sZW4pICYmCisJCQkgICAgIW1lbWNtcCgmY29ubmVjdGlvbi0+cGVlcl9hZGRyLCBwZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pKSB7CisJCQkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CiAJCX0KIAl9Ci0JdGNvbm4gPSBOVUxMOworCWNvbm5lY3Rpb24gPSBOVUxMOwogZm91bmQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHRjb25uOworCXJldHVybiBjb25uZWN0aW9uOwogfQogCiBzdGF0aWMgaW50IGRyYmRfYWxsb2Nfc29ja2V0KHN0cnVjdCBkcmJkX3NvY2tldCAqc29ja2V0KQpAQCAtMjQ0MywyOSArMjQ5MCwzMCBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc29ja2V0LT5yYnVmKTsKIH0KIAotdm9pZCBjb25uX2ZyZWVfY3J5cHRvKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3ZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWRyYmRfZnJlZV9zb2NrKHRjb25uKTsKKwlkcmJkX2ZyZWVfc29jayhjb25uZWN0aW9uKTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPmNzdW1zX3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+dmVyaWZ5X3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+Y3JhbV9obWFjX3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+aW50ZWdyaXR5X3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKTsKLQlrZnJlZSh0Y29ubi0+aW50X2RpZ19pbik7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfdnYpOworCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOworCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSk7CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ19pbik7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ192dik7CiAKLQl0Y29ubi0+Y3N1bXNfdGZtID0gTlVMTDsKLQl0Y29ubi0+dmVyaWZ5X3RmbSA9IE5VTEw7Ci0JdGNvbm4tPmNyYW1faG1hY190Zm0gPSBOVUxMOwotCXRjb25uLT5pbnRlZ3JpdHlfdGZtID0gTlVMTDsKLQl0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gTlVMTDsKLQl0Y29ubi0+aW50X2RpZ19pbiA9IE5VTEw7Ci0JdGNvbm4tPmludF9kaWdfdnYgPSBOVUxMOworCWNvbm5lY3Rpb24tPmNzdW1zX3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+aW50ZWdyaXR5X3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gTlVMTDsKKwljb25uZWN0aW9uLT5pbnRfZGlnX2luID0gTlVMTDsKKwljb25uZWN0aW9uLT5pbnRfZGlnX3Z2ID0gTlVMTDsKIH0KIAotaW50IHNldF9yZXNvdXJjZV9vcHRpb25zKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cykKK2ludCBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpCiB7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAljcHVtYXNrX3Zhcl90IG5ld19jcHVfbWFzazsKIAlpbnQgZXJyOwogCkBAIC0yNDc4LDIyICsyNTI2LDI0IEBACiAKIAkvKiBzaWxlbnRseSBpZ25vcmUgY3B1IG1hc2sgb24gVVAga2VybmVsICovCiAJaWYgKG5yX2NwdV9pZHMgPiAxICYmIHJlc19vcHRzLT5jcHVfbWFza1swXSAhPSAwKSB7Ci0JCS8qIEZJWE1FOiBHZXQgcmlkIG9mIGNvbnN0YW50IDMyIGhlcmUgKi8KLQkJZXJyID0gYml0bWFwX3BhcnNlKHJlc19vcHRzLT5jcHVfbWFzaywgMzIsCisJCWVyciA9IGJpdG1hcF9wYXJzZShyZXNfb3B0cy0+Y3B1X21hc2ssIERSQkRfQ1BVX01BU0tfU0laRSwKIAkJCQkgICBjcHVtYXNrX2JpdHMobmV3X2NwdV9tYXNrKSwgbnJfY3B1X2lkcyk7CiAJCWlmIChlcnIpIHsKLQkJCWNvbm5fd2Fybih0Y29ubiwgImJpdG1hcF9wYXJzZSgpIGZhaWxlZCB3aXRoICVkXG4iLCBlcnIpOworCQkJZHJiZF93YXJuKHJlc291cmNlLCAiYml0bWFwX3BhcnNlKCkgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CiAJCQkvKiByZXRjb2RlID0gRVJSX0NQVV9NQVNLX1BBUlNFOyAqLwogCQkJZ290byBmYWlsOwogCQl9CiAJfQotCXRjb25uLT5yZXNfb3B0cyA9ICpyZXNfb3B0czsKLQlpZiAoIWNwdW1hc2tfZXF1YWwodGNvbm4tPmNwdV9tYXNrLCBuZXdfY3B1X21hc2spKSB7Ci0JCWNwdW1hc2tfY29weSh0Y29ubi0+Y3B1X21hc2ssIG5ld19jcHVfbWFzayk7Ci0JCWRyYmRfY2FsY19jcHVfbWFzayh0Y29ubik7Ci0JCXRjb25uLT5yZWNlaXZlci5yZXNldF9jcHVfbWFzayA9IDE7Ci0JCXRjb25uLT5hc2VuZGVyLnJlc2V0X2NwdV9tYXNrID0gMTsKLQkJdGNvbm4tPndvcmtlci5yZXNldF9jcHVfbWFzayA9IDE7CisJcmVzb3VyY2UtPnJlc19vcHRzID0gKnJlc19vcHRzOworCWlmIChjcHVtYXNrX2VtcHR5KG5ld19jcHVfbWFzaykpCisJCWRyYmRfY2FsY19jcHVfbWFzaygmbmV3X2NwdV9tYXNrKTsKKwlpZiAoIWNwdW1hc2tfZXF1YWwocmVzb3VyY2UtPmNwdV9tYXNrLCBuZXdfY3B1X21hc2spKSB7CisJCWNwdW1hc2tfY29weShyZXNvdXJjZS0+Y3B1X21hc2ssIG5ld19jcHVfbWFzayk7CisJCWZvcl9lYWNoX2Nvbm5lY3Rpb25fcmN1KGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCQljb25uZWN0aW9uLT5yZWNlaXZlci5yZXNldF9jcHVfbWFzayA9IDE7CisJCQljb25uZWN0aW9uLT5hc2VuZGVyLnJlc2V0X2NwdV9tYXNrID0gMTsKKwkJCWNvbm5lY3Rpb24tPndvcmtlci5yZXNldF9jcHVfbWFzayA9IDE7CisJCX0KIAl9CiAJZXJyID0gMDsKIApAQCAtMjUwMywxNDYgKzI1NTMsMTc3IEBACiAKIH0KIAotLyogY2FsbGVyIG11c3QgYmUgdW5kZXIgZ2VubF9sb2NrKCkgKi8KLXN0cnVjdCBkcmJkX3Rjb25uICpjb25uX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcmVzX29wdHMgKnJlc19vcHRzKQorc3RydWN0IGRyYmRfcmVzb3VyY2UgKmRyYmRfY3JlYXRlX3Jlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKIAotCXRjb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfdGNvbm4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uKQotCQlyZXR1cm4gTlVMTDsKLQotCXRjb25uLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uLT5uYW1lKQorCXJlc291cmNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKQogCQlnb3RvIGZhaWw7CisJcmVzb3VyY2UtPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UtPm5hbWUpCisJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlOworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZyZXNvdXJjZS0+Y3B1X21hc2ssIEdGUF9LRVJORUwpKQorCQlnb3RvIGZhaWxfZnJlZV9uYW1lOworCWtyZWZfaW5pdCgmcmVzb3VyY2UtPmtyZWYpOworCWlkcl9pbml0KCZyZXNvdXJjZS0+ZGV2aWNlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5jb25uZWN0aW9ucyk7CisJbGlzdF9hZGRfdGFpbF9yY3UoJnJlc291cmNlLT5yZXNvdXJjZXMsICZkcmJkX3Jlc291cmNlcyk7CisJbXV0ZXhfaW5pdCgmcmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwlzcGluX2xvY2tfaW5pdCgmcmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlyZXR1cm4gcmVzb3VyY2U7CiAKLQlpZiAoZHJiZF9hbGxvY19zb2NrZXQoJnRjb25uLT5kYXRhKSkKLQkJZ290byBmYWlsOwotCWlmIChkcmJkX2FsbG9jX3NvY2tldCgmdGNvbm4tPm1ldGEpKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmdGNvbm4tPmNwdV9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJZ290byBmYWlsOwotCi0JaWYgKHNldF9yZXNvdXJjZV9vcHRpb25zKHRjb25uLCByZXNfb3B0cykpCi0JCWdvdG8gZmFpbDsKLQotCXRjb25uLT5jdXJyZW50X2Vwb2NoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uLT5jdXJyZW50X2Vwb2NoKQotCQlnb3RvIGZhaWw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdGNvbm4tPnRyYW5zZmVyX2xvZyk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOwotCXRjb25uLT5lcG9jaHMgPSAxOwotCXNwaW5fbG9ja19pbml0KCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JdGNvbm4tPndyaXRlX29yZGVyaW5nID0gV09fYmRldl9mbHVzaDsKLQotCXRjb25uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IGZhbHNlOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSAwOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKLQotCXRjb25uLT5jc3RhdGUgPSBDX1NUQU5EQUxPTkU7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPmNzdGF0ZV9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRjb25uLT5yZXFfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPmNvbmZfdXBkYXRlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0Y29ubi0+cGluZ193YWl0KTsKLQlpZHJfaW5pdCgmdGNvbm4tPnZvbHVtZXMpOwotCi0JZHJiZF9pbml0X3dvcmtxdWV1ZSgmdGNvbm4tPnNlbmRlcl93b3JrKTsKLQltdXRleF9pbml0KCZ0Y29ubi0+ZGF0YS5tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPm1ldGEubXV0ZXgpOwotCi0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT5yZWNlaXZlciwgZHJiZGRfaW5pdCwgInJlY2VpdmVyIik7Ci0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT53b3JrZXIsIGRyYmRfd29ya2VyLCAid29ya2VyIik7Ci0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT5hc2VuZGVyLCBkcmJkX2FzZW5kZXIsICJhc2VuZGVyIik7Ci0KLQlrcmVmX2luaXQoJnRjb25uLT5rcmVmKTsKLQlsaXN0X2FkZF90YWlsX3JjdSgmdGNvbm4tPmFsbF90Y29ubiwgJmRyYmRfdGNvbm5zKTsKLQotCXJldHVybiB0Y29ubjsKLQorZmFpbF9mcmVlX25hbWU6CisJa2ZyZWUocmVzb3VyY2UtPm5hbWUpOworZmFpbF9mcmVlX3Jlc291cmNlOgorCWtmcmVlKHJlc291cmNlKTsKIGZhaWw6Ci0Ja2ZyZWUodGNvbm4tPmN1cnJlbnRfZXBvY2gpOwotCWZyZWVfY3B1bWFza192YXIodGNvbm4tPmNwdV9tYXNrKTsKLQlkcmJkX2ZyZWVfc29ja2V0KCZ0Y29ubi0+bWV0YSk7Ci0JZHJiZF9mcmVlX3NvY2tldCgmdGNvbm4tPmRhdGEpOwotCWtmcmVlKHRjb25uLT5uYW1lKTsKLQlrZnJlZSh0Y29ubik7Ci0KIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBjb25uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCisvKiBjYWxsZXIgbXVzdCBiZSB1bmRlciBnZW5sX2xvY2soKSAqLworc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cykKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfdGNvbm4sIGtyZWYpOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCi0JaWYgKGF0b21pY19yZWFkKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkgIT0gIDApCi0JCWNvbm5fZXJyKHRjb25uLCAiZXBvY2hfc2l6ZTolZFxuIiwgYXRvbWljX3JlYWQoJnRjb25uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplKSk7Ci0Ja2ZyZWUodGNvbm4tPmN1cnJlbnRfZXBvY2gpOworCWNvbm5lY3Rpb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm4gTlVMTDsKIAotCWlkcl9kZXN0cm95KCZ0Y29ubi0+dm9sdW1lcyk7CisJaWYgKGRyYmRfYWxsb2Nfc29ja2V0KCZjb25uZWN0aW9uLT5kYXRhKSkKKwkJZ290byBmYWlsOworCWlmIChkcmJkX2FsbG9jX3NvY2tldCgmY29ubmVjdGlvbi0+bWV0YSkpCisJCWdvdG8gZmFpbDsKIAotCWZyZWVfY3B1bWFza192YXIodGNvbm4tPmNwdV9tYXNrKTsKLQlkcmJkX2ZyZWVfc29ja2V0KCZ0Y29ubi0+bWV0YSk7Ci0JZHJiZF9mcmVlX3NvY2tldCgmdGNvbm4tPmRhdGEpOwotCWtmcmVlKHRjb25uLT5uYW1lKTsKLQlrZnJlZSh0Y29ubi0+aW50X2RpZ19pbik7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfdnYpOwotCWtmcmVlKHRjb25uKTsKKwljb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gpCisJCWdvdG8gZmFpbDsKKworCUlOSVRfTElTVF9IRUFEKCZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2cpOworCisJSU5JVF9MSVNUX0hFQUQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOworCWNvbm5lY3Rpb24tPmVwb2NocyA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOworCWNvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nID0gV09fYmRldl9mbHVzaDsKKworCWNvbm5lY3Rpb24tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0ID0gZmFsc2U7CisJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yID0gMDsKKwljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKKworCXJlc291cmNlID0gZHJiZF9jcmVhdGVfcmVzb3VyY2UobmFtZSk7CisJaWYgKCFyZXNvdXJjZSkKKwkJZ290byBmYWlsOworCisJY29ubmVjdGlvbi0+Y3N0YXRlID0gQ19TVEFOREFMT05FOworCW11dGV4X2luaXQoJmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY29ubmVjdGlvbi0+cGluZ193YWl0KTsKKwlpZHJfaW5pdCgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzKTsKKworCWRyYmRfaW5pdF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5tZXRhLm11dGV4KTsKKworCWRyYmRfdGhyZWFkX2luaXQocmVzb3VyY2UsICZjb25uZWN0aW9uLT5yZWNlaXZlciwgZHJiZF9yZWNlaXZlciwgInJlY2VpdmVyIik7CisJY29ubmVjdGlvbi0+cmVjZWl2ZXIuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZHJiZF90aHJlYWRfaW5pdChyZXNvdXJjZSwgJmNvbm5lY3Rpb24tPndvcmtlciwgZHJiZF93b3JrZXIsICJ3b3JrZXIiKTsKKwljb25uZWN0aW9uLT53b3JrZXIuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZHJiZF90aHJlYWRfaW5pdChyZXNvdXJjZSwgJmNvbm5lY3Rpb24tPmFzZW5kZXIsIGRyYmRfYXNlbmRlciwgImFzZW5kZXIiKTsKKwljb25uZWN0aW9uLT5hc2VuZGVyLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJa3JlZl9pbml0KCZjb25uZWN0aW9uLT5rcmVmKTsKKworCWNvbm5lY3Rpb24tPnJlc291cmNlID0gcmVzb3VyY2U7CisKKwlpZiAoc2V0X3Jlc291cmNlX29wdGlvbnMocmVzb3VyY2UsIHJlc19vcHRzKSkKKwkJZ290byBmYWlsX3Jlc291cmNlOworCisJa3JlZl9nZXQoJnJlc291cmNlLT5rcmVmKTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmY29ubmVjdGlvbi0+Y29ubmVjdGlvbnMsICZyZXNvdXJjZS0+Y29ubmVjdGlvbnMpOworCXJldHVybiBjb25uZWN0aW9uOworCitmYWlsX3Jlc291cmNlOgorCWxpc3RfZGVsKCZyZXNvdXJjZS0+cmVzb3VyY2VzKTsKKwlkcmJkX2ZyZWVfcmVzb3VyY2UocmVzb3VyY2UpOworZmFpbDoKKwlrZnJlZShjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoKTsKKwlkcmJkX2ZyZWVfc29ja2V0KCZjb25uZWN0aW9uLT5tZXRhKTsKKwlkcmJkX2ZyZWVfc29ja2V0KCZjb25uZWN0aW9uLT5kYXRhKTsKKwlrZnJlZShjb25uZWN0aW9uKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotaW50IGluaXRfc3VibWl0dGVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfY29ubmVjdGlvbiwga3JlZik7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gY29ubmVjdGlvbi0+cmVzb3VyY2U7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpICE9ICAwKQorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXBvY2hfc2l6ZTolZFxuIiwgYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKTsKKwlrZnJlZShjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoKTsKKworCWlkcl9kZXN0cm95KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMpOworCisJZHJiZF9mcmVlX3NvY2tldCgmY29ubmVjdGlvbi0+bWV0YSk7CisJZHJiZF9mcmVlX3NvY2tldCgmY29ubmVjdGlvbi0+ZGF0YSk7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ19pbik7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ192dik7CisJa2ZyZWUoY29ubmVjdGlvbik7CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworfQorCitzdGF0aWMgaW50IGluaXRfc3VibWl0dGVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIG9wZW5jb2RlZCBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgpLAogCSAqIHRvIGJlIGFibGUgdG8gc2F5ICJkcmJkJWQiLCAuLi4sIG1pbm9yICovCi0JbWRldi0+c3VibWl0LndxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcmJkJXVfc3VibWl0IiwKLQkJCVdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwgbWRldi0+bWlub3IpOwotCWlmICghbWRldi0+c3VibWl0LndxKQorCWRldmljZS0+c3VibWl0LndxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcmJkJXVfc3VibWl0IiwKKwkJCVdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwgZGV2aWNlLT5taW5vcik7CisJaWYgKCFkZXZpY2UtPnN1Ym1pdC53cSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlJTklUX1dPUksoJm1kZXYtPnN1Ym1pdC53b3JrZXIsIGRvX3N1Ym1pdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+c3VibWl0LndyaXRlcyk7CisJSU5JVF9XT1JLKCZkZXZpY2UtPnN1Ym1pdC53b3JrZXIsIGRvX3N1Ym1pdCk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+c3VibWl0LmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMpOwogCXJldHVybiAwOwogfQogCi1lbnVtIGRyYmRfcmV0X2NvZGUgY29ubl9uZXdfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgbWlub3IsIGludCB2bnIpCitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgdW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdm5yKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsICp0bXBfcGVlcl9kZXZpY2U7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7Ci0JaW50IHZucl9nb3QgPSB2bnI7Ci0JaW50IG1pbm9yX2dvdCA9IG1pbm9yOworCWludCBpZDsKIAllbnVtIGRyYmRfcmV0X2NvZGUgZXJyID0gRVJSX05PTUVNOwogCi0JbWRldiA9IG1pbm9yX3RvX21kZXYobWlub3IpOwotCWlmIChtZGV2KQorCWRldmljZSA9IG1pbm9yX3RvX2RldmljZShtaW5vcik7CisJaWYgKGRldmljZSkKIAkJcmV0dXJuIEVSUl9NSU5PUl9FWElTVFM7CiAKIAkvKiBHRlBfS0VSTkVMLCB3ZSBhcmUgb3V0c2lkZSBvZiBhbGwgd3JpdGUtb3V0IHBhdGhzICovCi0JbWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcmJkX2NvbmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1kZXYpCisJZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2UpCiAJCXJldHVybiBFUlJfTk9NRU07CisJa3JlZl9pbml0KCZkZXZpY2UtPmtyZWYpOwogCi0Ja3JlZl9nZXQoJnRjb25uLT5rcmVmKTsKLQltZGV2LT50Y29ubiA9IHRjb25uOworCWtyZWZfZ2V0KCZyZXNvdXJjZS0+a3JlZik7CisJZGV2aWNlLT5yZXNvdXJjZSA9IHJlc291cmNlOworCWRldmljZS0+bWlub3IgPSBtaW5vcjsKKwlkZXZpY2UtPnZuciA9IHZucjsKIAotCW1kZXYtPm1pbm9yID0gbWlub3I7Ci0JbWRldi0+dm5yID0gdm5yOwotCi0JZHJiZF9pbml0X3NldF9kZWZhdWx0cyhtZGV2KTsKKwlkcmJkX2luaXRfc2V0X2RlZmF1bHRzKGRldmljZSk7CiAKIAlxID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwogCWlmICghcSkKIAkJZ290byBvdXRfbm9fcTsKLQltZGV2LT5ycV9xdWV1ZSA9IHE7Ci0JcS0+cXVldWVkYXRhICAgPSBtZGV2OworCWRldmljZS0+cnFfcXVldWUgPSBxOworCXEtPnF1ZXVlZGF0YSAgID0gZGV2aWNlOwogCiAJZGlzayA9IGFsbG9jX2Rpc2soMSk7CiAJaWYgKCFkaXNrKQogCQlnb3RvIG91dF9ub19kaXNrOwotCW1kZXYtPnZkaXNrID0gZGlzazsKKwlkZXZpY2UtPnZkaXNrID0gZGlzazsKIAogCXNldF9kaXNrX3JvKGRpc2ssIHRydWUpOwogCkBAIC0yNjUxLDE0ICsyNzMyLDE0IEBACiAJZGlzay0+Zmlyc3RfbWlub3IgPSBtaW5vcjsKIAlkaXNrLT5mb3BzID0gJmRyYmRfb3BzOwogCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAiZHJiZCVkIiwgbWlub3IpOwotCWRpc2stPnByaXZhdGVfZGF0YSA9IG1kZXY7CisJZGlzay0+cHJpdmF0ZV9kYXRhID0gZGV2aWNlOwogCi0JbWRldi0+dGhpc19iZGV2ID0gYmRnZXQoTUtERVYoRFJCRF9NQUpPUiwgbWlub3IpKTsKKwlkZXZpY2UtPnRoaXNfYmRldiA9IGJkZ2V0KE1LREVWKERSQkRfTUFKT1IsIG1pbm9yKSk7CiAJLyogd2UgaGF2ZSBubyBwYXJ0aXRpb25zLiB3ZSBjb250YWluIG9ubHkgb3Vyc2VsdmVzLiAqLwotCW1kZXYtPnRoaXNfYmRldi0+YmRfY29udGFpbnMgPSBtZGV2LT50aGlzX2JkZXY7CisJZGV2aWNlLT50aGlzX2JkZXYtPmJkX2NvbnRhaW5zID0gZGV2aWNlLT50aGlzX2JkZXY7CiAKIAlxLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IGRyYmRfY29uZ2VzdGVkOwotCXEtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBtZGV2OworCXEtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBkZXZpY2U7CiAKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHEsIGRyYmRfbWFrZV9yZXF1ZXN0KTsKIAlibGtfcXVldWVfZmx1c2gocSwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSk7CkBAIC0yNjY3LDcwICsyNzQ4LDEyNSBAQAogCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhxLCBEUkJEX01BWF9CSU9fU0laRV9TQUZFID4+IDgpOwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgQkxLX0JPVU5DRV9BTlkpOwogCWJsa19xdWV1ZV9tZXJnZV9idmVjKHEsIGRyYmRfbWVyZ2VfYnZlYyk7Ci0JcS0+cXVldWVfbG9jayA9ICZtZGV2LT50Y29ubi0+cmVxX2xvY2s7IC8qIG5lZWRlZCBzaW5jZSB3ZSB1c2UgKi8KKwlxLT5xdWV1ZV9sb2NrID0gJnJlc291cmNlLT5yZXFfbG9jazsKIAotCW1kZXYtPm1kX2lvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCWlmICghbWRldi0+bWRfaW9fcGFnZSkKKwlkZXZpY2UtPm1kX2lvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlLT5tZF9pb19wYWdlKQogCQlnb3RvIG91dF9ub19pb19wYWdlOwogCi0JaWYgKGRyYmRfYm1faW5pdChtZGV2KSkKKwlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpCiAJCWdvdG8gb3V0X25vX2JpdG1hcDsKLQltZGV2LT5yZWFkX3JlcXVlc3RzID0gUkJfUk9PVDsKLQltZGV2LT53cml0ZV9yZXF1ZXN0cyA9IFJCX1JPT1Q7CisJZGV2aWNlLT5yZWFkX3JlcXVlc3RzID0gUkJfUk9PVDsKKwlkZXZpY2UtPndyaXRlX3JlcXVlc3RzID0gUkJfUk9PVDsKIAotCW1pbm9yX2dvdCA9IGlkcl9hbGxvYygmbWlub3JzLCBtZGV2LCBtaW5vciwgbWlub3IgKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAobWlub3JfZ290IDwgMCkgewotCQlpZiAobWlub3JfZ290ID09IC1FTk9TUEMpIHsKKwlpZCA9IGlkcl9hbGxvYygmZHJiZF9kZXZpY2VzLCBkZXZpY2UsIG1pbm9yLCBtaW5vciArIDEsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApIHsKKwkJaWYgKGlkID09IC1FTk9TUEMpIHsKIAkJCWVyciA9IEVSUl9NSU5PUl9FWElTVFM7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygicmVxdWVzdGVkIG1pbm9yIGV4aXN0cyBhbHJlYWR5Iik7CiAJCX0KIAkJZ290byBvdXRfbm9fbWlub3JfaWRyOwogCX0KKwlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKIAotCXZucl9nb3QgPSBpZHJfYWxsb2MoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIsIHZuciArIDEsIEdGUF9LRVJORUwpOwotCWlmICh2bnJfZ290IDwgMCkgewotCQlpZiAodm5yX2dvdCA9PSAtRU5PU1BDKSB7Ci0JCQllcnIgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOwotCQkJZHJiZF9tc2dfcHV0X2luZm8oInJlcXVlc3RlZCB2b2x1bWUgZXhpc3RzIGFscmVhZHkiKTsKKwlpZCA9IGlkcl9hbGxvYygmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZSwgdm5yLCB2bnIgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKSB7CisJCWlmIChpZCA9PSAtRU5PU1BDKSB7CisJCQllcnIgPSBFUlJfTUlOT1JfRVhJU1RTOworCQkJZHJiZF9tc2dfcHV0X2luZm8oInJlcXVlc3RlZCBtaW5vciBleGlzdHMgYWxyZWFkeSIpOwogCQl9CiAJCWdvdG8gb3V0X2lkcl9yZW1vdmVfbWlub3I7CiAJfQorCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCi0JaWYgKGluaXRfc3VibWl0dGVyKG1kZXYpKSB7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cGVlcl9kZXZpY2VzKTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCXBlZXJfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZWVyX2RldmljZSkKKwkJCWdvdG8gb3V0X2lkcl9yZW1vdmVfZnJvbV9yZXNvdXJjZTsKKwkJcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQlwZWVyX2RldmljZS0+ZGV2aWNlID0gZGV2aWNlOworCisJCWxpc3RfYWRkKCZwZWVyX2RldmljZS0+cGVlcl9kZXZpY2VzLCAmZGV2aWNlLT5wZWVyX2RldmljZXMpOworCQlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKKworCQlpZCA9IGlkcl9hbGxvYygmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yLCB2bnIgKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlkIDwgMCkgeworCQkJaWYgKGlkID09IC1FTk9TUEMpIHsKKwkJCQllcnIgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOworCQkJCWRyYmRfbXNnX3B1dF9pbmZvKCJyZXF1ZXN0ZWQgdm9sdW1lIGV4aXN0cyBhbHJlYWR5Iik7CisJCQl9CisJCQlnb3RvIG91dF9pZHJfcmVtb3ZlX2Zyb21fcmVzb3VyY2U7CisJCX0KKwkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCX0KKworCWlmIChpbml0X3N1Ym1pdHRlcihkZXZpY2UpKSB7CiAJCWVyciA9IEVSUl9OT01FTTsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVuYWJsZSB0byBjcmVhdGUgc3VibWl0IHdvcmtxdWV1ZSIpOwogCQlnb3RvIG91dF9pZHJfcmVtb3ZlX3ZvbDsKIAl9CiAKIAlhZGRfZGlzayhkaXNrKTsKLQlrcmVmX2luaXQoJm1kZXYtPmtyZWYpOyAvKiBvbmUgcmVmIGZvciBib3RoIGlkcnMgYW5kIHRoZSB0aGUgYWRkX2Rpc2sgKi8KIAogCS8qIGluaGVyaXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgKi8KLQltZGV2LT5zdGF0ZS5jb25uID0gdGNvbm4tPmNzdGF0ZTsKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCWRyYmRfY29ubmVjdGVkKG1kZXYpOworCWRldmljZS0+c3RhdGUuY29ubiA9IGZpcnN0X2Nvbm5lY3Rpb24ocmVzb3VyY2UpLT5jc3RhdGU7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJZm9yX2VhY2hfcGVlcl9kZXZpY2UocGVlcl9kZXZpY2UsIGRldmljZSkKKwkJCWRyYmRfY29ubmVjdGVkKHBlZXJfZGV2aWNlKTsKKwl9CiAKIAlyZXR1cm4gTk9fRVJST1I7CiAKIG91dF9pZHJfcmVtb3ZlX3ZvbDoKLQlpZHJfcmVtb3ZlKCZ0Y29ubi0+dm9sdW1lcywgdm5yX2dvdCk7CisJaWRyX3JlbW92ZSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCB2bnIpOworb3V0X2lkcl9yZW1vdmVfZnJvbV9yZXNvdXJjZToKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCXBlZXJfZGV2aWNlID0gaWRyX2ZpbmQoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgdm5yKTsKKwkJaWYgKHBlZXJfZGV2aWNlKSB7CisJCQlpZHJfcmVtb3ZlKCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHZucik7CisJCQlrcmVmX3B1dCgmY29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOworCQl9CisJfQorCWZvcl9lYWNoX3BlZXJfZGV2aWNlX3NhZmUocGVlcl9kZXZpY2UsIHRtcF9wZWVyX2RldmljZSwgZGV2aWNlKSB7CisJCWxpc3RfZGVsKCZwZWVyX2RldmljZS0+cGVlcl9kZXZpY2VzKTsKKwkJa2ZyZWUocGVlcl9kZXZpY2UpOworCX0KKwlpZHJfcmVtb3ZlKCZyZXNvdXJjZS0+ZGV2aWNlcywgdm5yKTsKIG91dF9pZHJfcmVtb3ZlX21pbm9yOgotCWlkcl9yZW1vdmUoJm1pbm9ycywgbWlub3JfZ290KTsKKwlpZHJfcmVtb3ZlKCZkcmJkX2RldmljZXMsIG1pbm9yKTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIG91dF9ub19taW5vcl9pZHI6Ci0JZHJiZF9ibV9jbGVhbnVwKG1kZXYpOworCWRyYmRfYm1fY2xlYW51cChkZXZpY2UpOwogb3V0X25vX2JpdG1hcDoKLQlfX2ZyZWVfcGFnZShtZGV2LT5tZF9pb19wYWdlKTsKKwlfX2ZyZWVfcGFnZShkZXZpY2UtPm1kX2lvX3BhZ2UpOwogb3V0X25vX2lvX3BhZ2U6CiAJcHV0X2Rpc2soZGlzayk7CiBvdXRfbm9fZGlzazoKIAlibGtfY2xlYW51cF9xdWV1ZShxKTsKIG91dF9ub19xOgotCWtmcmVlKG1kZXYpOwotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworCWtmcmVlKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIAordm9pZCBkcmJkX2RlbGV0ZV9kZXZpY2Uoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCWludCByZWZzID0gMzsKKworCWZvcl9lYWNoX2Nvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVzb3VyY2UpIHsKKwkJaWRyX3JlbW92ZSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBkZXZpY2UtPnZucik7CisJCXJlZnMrKzsKKwl9CisJaWRyX3JlbW92ZSgmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZS0+dm5yKTsKKwlpZHJfcmVtb3ZlKCZkcmJkX2RldmljZXMsIGRldmljZV90b19taW5vcihkZXZpY2UpKTsKKwlkZWxfZ2VuZGlzayhkZXZpY2UtPnZkaXNrKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwlrcmVmX3N1YigmZGV2aWNlLT5rcmVmLCByZWZzLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKK30KKwogaW50IF9faW5pdCBkcmJkX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtMjc2MSwxMCArMjg5NywxMCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRyYmRfcHBfd2FpdCk7CiAKIAlkcmJkX3Byb2MgPSBOVUxMOyAvKiBwbGF5IHNhZmUgZm9yIGRyYmRfY2xlYW51cCAqLwotCWlkcl9pbml0KCZtaW5vcnMpOworCWlkcl9pbml0KCZkcmJkX2RldmljZXMpOwogCiAJcndsb2NrX2luaXQoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmZHJiZF90Y29ubnMpOworCUlOSVRfTElTVF9IRUFEKCZkcmJkX3Jlc291cmNlcyk7CiAKIAllcnIgPSBkcmJkX2dlbmxfcmVnaXN0ZXIoKTsKIAlpZiAoZXJyKSB7CkBAIC0yODIyLDM3ICsyOTU4LDM5IEBACiAJa2ZyZWUobGRldik7CiB9CiAKLXZvaWQgZHJiZF9mcmVlX3NvY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBkcmJkX2ZyZWVfc29jayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWlmICh0Y29ubi0+ZGF0YS5zb2NrZXQpIHsKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOwotCQlrZXJuZWxfc29ja19zaHV0ZG93bih0Y29ubi0+ZGF0YS5zb2NrZXQsIFNIVVRfUkRXUik7Ci0JCXNvY2tfcmVsZWFzZSh0Y29ubi0+ZGF0YS5zb2NrZXQpOwotCQl0Y29ubi0+ZGF0YS5zb2NrZXQgPSBOVUxMOwotCQltdXRleF91bmxvY2soJnRjb25uLT5kYXRhLm11dGV4KTsKKwlpZiAoY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CisJCWtlcm5lbF9zb2NrX3NodXRkb3duKGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LCBTSFVUX1JEV1IpOworCQlzb2NrX3JlbGVhc2UoY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpOworCQljb25uZWN0aW9uLT5kYXRhLnNvY2tldCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAJfQotCWlmICh0Y29ubi0+bWV0YS5zb2NrZXQpIHsKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPm1ldGEubXV0ZXgpOwotCQlrZXJuZWxfc29ja19zaHV0ZG93bih0Y29ubi0+bWV0YS5zb2NrZXQsIFNIVVRfUkRXUik7Ci0JCXNvY2tfcmVsZWFzZSh0Y29ubi0+bWV0YS5zb2NrZXQpOwotCQl0Y29ubi0+bWV0YS5zb2NrZXQgPSBOVUxMOwotCQltdXRleF91bmxvY2soJnRjb25uLT5tZXRhLm11dGV4KTsKKwlpZiAoY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQpIHsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bWV0YS5tdXRleCk7CisJCWtlcm5lbF9zb2NrX3NodXRkb3duKGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LCBTSFVUX1JEV1IpOworCQlzb2NrX3JlbGVhc2UoY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQpOworCQljb25uZWN0aW9uLT5tZXRhLnNvY2tldCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bWV0YS5tdXRleCk7CiAJfQogfQogCiAvKiBtZXRhIGRhdGEgbWFuYWdlbWVudCAqLwogCi12b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCit2b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX21kX3N5bmMobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9tZF9zeW5jKGRldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMjg4Myw3ICszMDIxLDcgQEAKIAogCiAKLXZvaWQgZHJiZF9tZF93cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB2b2lkICpiKQordm9pZCBkcmJkX21kX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB2b2lkICpiKQogewogCXN0cnVjdCBtZXRhX2RhdGFfb25fZGlzayAqYnVmZmVyID0gYjsKIAlzZWN0b3JfdCBzZWN0b3I7CkBAIC0yODkxLDM5ICszMDI5LDM5IEBACiAKIAltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoKmJ1ZmZlcikpOwogCi0JYnVmZmVyLT5sYV9zaXplX3NlY3QgPSBjcHVfdG9fYmU2NChkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKTsKKwlidWZmZXItPmxhX3NpemVfc2VjdCA9IGNwdV90b19iZTY0KGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSk7CiAJZm9yIChpID0gVUlfQ1VSUkVOVDsgaSA8IFVJX1NJWkU7IGkrKykKLQkJYnVmZmVyLT51dWlkW2ldID0gY3B1X3RvX2JlNjQobWRldi0+bGRldi0+bWQudXVpZFtpXSk7Ci0JYnVmZmVyLT5mbGFncyA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmZsYWdzKTsKKwkJYnVmZmVyLT51dWlkW2ldID0gY3B1X3RvX2JlNjQoZGV2aWNlLT5sZGV2LT5tZC51dWlkW2ldKTsKKwlidWZmZXItPmZsYWdzID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5sZGV2LT5tZC5mbGFncyk7CiAJYnVmZmVyLT5tYWdpYyA9IGNwdV90b19iZTMyKERSQkRfTURfTUFHSUNfODRfVU5DTEVBTik7CiAKLQlidWZmZXItPm1kX3NpemVfc2VjdCAgPSBjcHVfdG9fYmUzMihtZGV2LT5sZGV2LT5tZC5tZF9zaXplX3NlY3QpOwotCWJ1ZmZlci0+YWxfb2Zmc2V0ICAgICA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmFsX29mZnNldCk7Ci0JYnVmZmVyLT5hbF9ucl9leHRlbnRzID0gY3B1X3RvX2JlMzIobWRldi0+YWN0X2xvZy0+bnJfZWxlbWVudHMpOworCWJ1ZmZlci0+bWRfc2l6ZV9zZWN0ICA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQubWRfc2l6ZV9zZWN0KTsKKwlidWZmZXItPmFsX29mZnNldCAgICAgPSBjcHVfdG9fYmUzMihkZXZpY2UtPmxkZXYtPm1kLmFsX29mZnNldCk7CisJYnVmZmVyLT5hbF9ucl9leHRlbnRzID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50cyk7CiAJYnVmZmVyLT5ibV9ieXRlc19wZXJfYml0ID0gY3B1X3RvX2JlMzIoQk1fQkxPQ0tfU0laRSk7Ci0JYnVmZmVyLT5kZXZpY2VfdXVpZCA9IGNwdV90b19iZTY0KG1kZXYtPmxkZXYtPm1kLmRldmljZV91dWlkKTsKKwlidWZmZXItPmRldmljZV91dWlkID0gY3B1X3RvX2JlNjQoZGV2aWNlLT5sZGV2LT5tZC5kZXZpY2VfdXVpZCk7CiAKLQlidWZmZXItPmJtX29mZnNldCA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmJtX29mZnNldCk7Ci0JYnVmZmVyLT5sYV9wZWVyX21heF9iaW9fc2l6ZSA9IGNwdV90b19iZTMyKG1kZXYtPnBlZXJfbWF4X2Jpb19zaXplKTsKKwlidWZmZXItPmJtX29mZnNldCA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYm1fb2Zmc2V0KTsKKwlidWZmZXItPmxhX3BlZXJfbWF4X2Jpb19zaXplID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5wZWVyX21heF9iaW9fc2l6ZSk7CiAKLQlidWZmZXItPmFsX3N0cmlwZXMgPSBjcHVfdG9fYmUzMihtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVzKTsKLQlidWZmZXItPmFsX3N0cmlwZV9zaXplXzRrID0gY3B1X3RvX2JlMzIobWRldi0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGspOworCWJ1ZmZlci0+YWxfc3RyaXBlcyA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlcyk7CisJYnVmZmVyLT5hbF9zdHJpcGVfc2l6ZV80ayA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGspOwogCi0JRF9BU1NFUlQoZHJiZF9tZF9zcyhtZGV2LT5sZGV2KSA9PSBtZGV2LT5sZGV2LT5tZC5tZF9vZmZzZXQpOwotCXNlY3RvciA9IG1kZXYtPmxkZXYtPm1kLm1kX29mZnNldDsKKwlEX0FTU0VSVChkZXZpY2UsIGRyYmRfbWRfc3MoZGV2aWNlLT5sZGV2KSA9PSBkZXZpY2UtPmxkZXYtPm1kLm1kX29mZnNldCk7CisJc2VjdG9yID0gZGV2aWNlLT5sZGV2LT5tZC5tZF9vZmZzZXQ7CiAKLQlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8obWRldiwgbWRldi0+bGRldiwgc2VjdG9yLCBXUklURSkpIHsKKwlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CiAJCS8qIHRoaXMgd2FzIGEgdHJ5IGFueXdheXMgLi4uICovCi0JCWRldl9lcnIoREVWLCAibWV0YSBkYXRhIHVwZGF0ZSBmYWlsZWQhXG4iKTsKLQkJZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YSBkYXRhIHVwZGF0ZSBmYWlsZWQhXG4iKTsKKwkJZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOwogCX0KIH0KIAogLyoqCiAgKiBkcmJkX21kX3N5bmMoKSAtIFdyaXRlcyB0aGUgbWV0YSBkYXRhIHN1cGVyIGJsb2NrIGlmIHRoZSBNRF9ESVJUWSBmbGFnIGJpdCBpcyBzZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi12b2lkIGRyYmRfbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX21kX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG1ldGFfZGF0YV9vbl9kaXNrICpidWZmZXI7CiAKQEAgLTI5MzEsMzIgKzMwNjksMzIgQEAKIAlCVUlMRF9CVUdfT04oVUlfU0laRSAhPSA0KTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBtZXRhX2RhdGFfb25fZGlzaykgIT0gNDA5Nik7CiAKLQlkZWxfdGltZXIoJm1kZXYtPm1kX3N5bmNfdGltZXIpOworCWRlbF90aW1lcigmZGV2aWNlLT5tZF9zeW5jX3RpbWVyKTsKIAkvKiB0aW1lciBtYXkgYmUgcmVhcm1lZCBieSBkcmJkX21kX21hcmtfZGlydHkoKSBub3cuICovCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTURfRElSVFksICZtZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyogV2UgdXNlIGhlcmUgRF9GQUlMRUQgYW5kIG5vdCBEX0FUVEFDSElORyBiZWNhdXNlIHdlIHRyeSB0byB3cml0ZQogCSAqIG1ldGFkYXRhIGV2ZW4gaWYgd2UgZGV0YWNoIGR1ZSB0byBhIGRpc2sgZmFpbHVyZSEgKi8KLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkKKwlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKQogCQlyZXR1cm47CiAKLQlidWZmZXIgPSBkcmJkX21kX2dldF9idWZmZXIobWRldik7CisJYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKGRldmljZSk7CiAJaWYgKCFidWZmZXIpCiAJCWdvdG8gb3V0OwogCi0JZHJiZF9tZF93cml0ZShtZGV2LCBidWZmZXIpOworCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCi0JLyogVXBkYXRlIG1kZXYtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCwKKwkvKiBVcGRhdGUgZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3QsCiAJICogc2luY2Ugd2UgdXBkYXRlZCBpdCBvbiBtZXRhZGF0YS4gKi8KLQltZGV2LT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCWRldmljZS0+bGRldi0+bWQubGFfc2l6ZV9zZWN0ID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCi0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogb3V0OgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGNoZWNrX2FjdGl2aXR5X2xvZ19zdHJpcGVfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IG1ldGFfZGF0YV9vbl9kaXNrICpvbl9kaXNrLAogCQlzdHJ1Y3QgZHJiZF9tZCAqaW5fY29yZSkKIHsKQEAgLTI5OTYsMTIgKzMxMzQsMTIgQEAKIAogCXJldHVybiAwOwogZXJyOgotCWRldl9lcnIoREVWLCAiaW52YWxpZCBhY3Rpdml0eSBsb2cgc3RyaXBpbmc6IGFsX3N0cmlwZXM9JXUsIGFsX3N0cmlwZV9zaXplXzRrPSV1XG4iLAorCWRyYmRfZXJyKGRldmljZSwgImludmFsaWQgYWN0aXZpdHkgbG9nIHN0cmlwaW5nOiBhbF9zdHJpcGVzPSV1LCBhbF9zdHJpcGVfc2l6ZV80az0ldVxuIiwKIAkJCWFsX3N0cmlwZXMsIGFsX3N0cmlwZV9zaXplXzRrKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBjaGVja19vZmZzZXRzX2FuZF9zaXplcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldikKK3N0YXRpYyBpbnQgY2hlY2tfb2Zmc2V0c19hbmRfc2l6ZXMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2KQogewogCXNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkoYmRldi0+bWRfYmRldik7CiAJc3RydWN0IGRyYmRfbWQgKmluX2NvcmUgPSAmYmRldi0+bWQ7CkBAIC0zMDY4LDcgKzMyMDYsNyBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JZGV2X2VycihERVYsICJtZXRhIGRhdGEgb2Zmc2V0cyBkb24ndCBtYWtlIHNlbnNlOiBpZHg9JWQgIgorCWRyYmRfZXJyKGRldmljZSwgIm1ldGEgZGF0YSBvZmZzZXRzIGRvbid0IG1ha2Ugc2Vuc2U6IGlkeD0lZCAiCiAJCQkiYWxfcz0ldSwgYWxfc3o0az0ldSwgYWxfb2Zmc2V0PSVkLCBibV9vZmZzZXQ9JWQsICIKIAkJCSJtZF9zaXplX3NlY3Q9JXUsIGxhX3NpemU9JWxsdSwgbWRfY2FwYWNpdHk9JWxsdVxuIiwKIAkJCWluX2NvcmUtPm1ldGFfZGV2X2lkeCwKQEAgLTMwODMsMjUgKzMyMjEsMjUgQEAKIAogLyoqCiAgKiBkcmJkX21kX3JlYWQoKSAtIFJlYWRzIGluIHRoZSBtZXRhIGRhdGEgc3VwZXIgYmxvY2sKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGJkZXY6CURldmljZSBmcm9tIHdoaWNoIHRoZSBtZXRhIGRhdGEgc2hvdWxkIGJlIHJlYWQgaW4uCiAgKgogICogUmV0dXJuIE5PX0VSUk9SIG9uIHN1Y2Nlc3MsIGFuZCBhbiBlbnVtIGRyYmRfcmV0X2NvZGUgaW4gY2FzZQogICogc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAgKgogICogQ2FsbGVkIGV4YWN0bHkgb25jZSBkdXJpbmcgZHJiZF9hZG1fYXR0YWNoKCksIHdoaWxlIHN0aWxsIGJlaW5nIERfRElTS0xFU1MsCi0gKiBldmVuIGJlZm9yZSBAYmRldiBpcyBhc3NpZ25lZCB0byBAbWRldi0+bGRldi4KKyAqIGV2ZW4gYmVmb3JlIEBiZGV2IGlzIGFzc2lnbmVkIHRvIEBkZXZpY2UtPmxkZXYuCiAgKi8KLWludCBkcmJkX21kX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYpCitpbnQgZHJiZF9tZF9yZWFkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldikKIHsKIAlzdHJ1Y3QgbWV0YV9kYXRhX29uX2Rpc2sgKmJ1ZmZlcjsKIAl1MzIgbWFnaWMsIGZsYWdzOwogCWludCBpLCBydiA9IE5PX0VSUk9SOwogCi0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrICE9IERfRElTS0xFU1MpCiAJCXJldHVybiBFUlJfRElTS19DT05GSUdVUkVEOwogCi0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOworCWJ1ZmZlciA9IGRyYmRfbWRfZ2V0X2J1ZmZlcihkZXZpY2UpOwogCWlmICghYnVmZmVyKQogCQlyZXR1cm4gRVJSX05PTUVNOwogCkBAIC0zMTEwLDEwICszMjQ4LDEwIEBACiAJYmRldi0+bWQubWV0YV9kZXZfaWR4ID0gYmRldi0+ZGlza19jb25mLT5tZXRhX2Rldl9pZHg7CiAJYmRldi0+bWQubWRfb2Zmc2V0ID0gZHJiZF9tZF9zcyhiZGV2KTsKIAotCWlmIChkcmJkX21kX3N5bmNfcGFnZV9pbyhtZGV2LCBiZGV2LCBiZGV2LT5tZC5tZF9vZmZzZXQsIFJFQUQpKSB7CisJaWYgKGRyYmRfbWRfc3luY19wYWdlX2lvKGRldmljZSwgYmRldiwgYmRldi0+bWQubWRfb2Zmc2V0LCBSRUFEKSkgewogCQkvKiBOT1RFOiBjYW4ndCBkbyBub3JtYWwgZXJyb3IgcHJvY2Vzc2luZyBoZXJlIGFzIHRoaXMgaXMKIAkJICAgY2FsbGVkIEJFRk9SRSBkaXNrIGlzIGF0dGFjaGVkICovCi0JCWRldl9lcnIoREVWLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBtZXRhZGF0YS5cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJFcnJvciB3aGlsZSByZWFkaW5nIG1ldGFkYXRhLlxuIik7CiAJCXJ2ID0gRVJSX0lPX01EX0RJU0s7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxMjMsNyArMzI2MSw3IEBACiAJaWYgKG1hZ2ljID09IERSQkRfTURfTUFHSUNfODRfVU5DTEVBTiB8fAogCSAgICAobWFnaWMgPT0gRFJCRF9NRF9NQUdJQ18wOCAmJiAhKGZsYWdzICYgTURGX0FMX0NMRUFOKSkpIHsKIAkJCS8qIGJ0dzogdGhhdCdzIEFjdGl2aXR5IExvZyBjbGVhbiwgbm90ICJhbGwiIGNsZWFuLiAqLwotCQlkZXZfZXJyKERFViwgIkZvdW5kIHVuY2xlYW4gbWV0YSBkYXRhLiBEaWQgeW91IFwiZHJiZGFkbSBhcHBseS1hbFwiP1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkZvdW5kIHVuY2xlYW4gbWV0YSBkYXRhLiBEaWQgeW91IFwiZHJiZGFkbSBhcHBseS1hbFwiP1xuIik7CiAJCXJ2ID0gRVJSX01EX1VOQ0xFQU47CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxMzEsMTQgKzMyNjksMTQgQEAKIAlydiA9IEVSUl9NRF9JTlZBTElEOwogCWlmIChtYWdpYyAhPSBEUkJEX01EX01BR0lDXzA4KSB7CiAJCWlmIChtYWdpYyA9PSBEUkJEX01EX01BR0lDXzA3KQotCQkJZGV2X2VycihERVYsICJGb3VuZCBvbGQgKDAuNykgbWV0YSBkYXRhIG1hZ2ljLiBEaWQgeW91IFwiZHJiZGFkbSBjcmVhdGUtbWRcIj9cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiRm91bmQgb2xkICgwLjcpIG1ldGEgZGF0YSBtYWdpYy4gRGlkIHlvdSBcImRyYmRhZG0gY3JlYXRlLW1kXCI/XG4iKTsKIAkJZWxzZQotCQkJZGV2X2VycihERVYsICJNZXRhIGRhdGEgbWFnaWMgbm90IGZvdW5kLiBEaWQgeW91IFwiZHJiZGFkbSBjcmVhdGUtbWRcIj9cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiTWV0YSBkYXRhIG1hZ2ljIG5vdCBmb3VuZC4gRGlkIHlvdSBcImRyYmRhZG0gY3JlYXRlLW1kXCI/XG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJaWYgKGJlMzJfdG9fY3B1KGJ1ZmZlci0+Ym1fYnl0ZXNfcGVyX2JpdCkgIT0gQk1fQkxPQ0tfU0laRSkgewotCQlkZXZfZXJyKERFViwgInVuZXhwZWN0ZWQgYm1fYnl0ZXNfcGVyX2JpdDogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBibV9ieXRlc19wZXJfYml0OiAldSAoZXhwZWN0ZWQgJXUpXG4iLAogCQkgICAgYmUzMl90b19jcHUoYnVmZmVyLT5ibV9ieXRlc19wZXJfYml0KSwgQk1fQkxPQ0tfU0laRSk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxNTUsMTgyICszMjkzLDE4MiBAQAogCWJkZXYtPm1kLmFsX29mZnNldCA9IGJlMzJfdG9fY3B1KGJ1ZmZlci0+YWxfb2Zmc2V0KTsKIAliZGV2LT5tZC5ibV9vZmZzZXQgPSBiZTMyX3RvX2NwdShidWZmZXItPmJtX29mZnNldCk7CiAKLQlpZiAoY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKG1kZXYsIGJ1ZmZlciwgJmJkZXYtPm1kKSkKKwlpZiAoY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKGRldmljZSwgYnVmZmVyLCAmYmRldi0+bWQpKQogCQlnb3RvIGVycjsKLQlpZiAoY2hlY2tfb2Zmc2V0c19hbmRfc2l6ZXMobWRldiwgYmRldikpCisJaWYgKGNoZWNrX29mZnNldHNfYW5kX3NpemVzKGRldmljZSwgYmRldikpCiAJCWdvdG8gZXJyOwogCiAJaWYgKGJlMzJfdG9fY3B1KGJ1ZmZlci0+Ym1fb2Zmc2V0KSAhPSBiZGV2LT5tZC5ibV9vZmZzZXQpIHsKLQkJZGV2X2VycihERVYsICJ1bmV4cGVjdGVkIGJtX29mZnNldDogJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBibV9vZmZzZXQ6ICVkIChleHBlY3RlZCAlZClcbiIsCiAJCSAgICBiZTMyX3RvX2NwdShidWZmZXItPmJtX29mZnNldCksIGJkZXYtPm1kLmJtX29mZnNldCk7CiAJCWdvdG8gZXJyOwogCX0KIAlpZiAoYmUzMl90b19jcHUoYnVmZmVyLT5tZF9zaXplX3NlY3QpICE9IGJkZXYtPm1kLm1kX3NpemVfc2VjdCkgewotCQlkZXZfZXJyKERFViwgInVuZXhwZWN0ZWQgbWRfc2l6ZTogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBtZF9zaXplOiAldSAoZXhwZWN0ZWQgJXUpXG4iLAogCQkgICAgYmUzMl90b19jcHUoYnVmZmVyLT5tZF9zaXplX3NlY3QpLCBiZGV2LT5tZC5tZF9zaXplX3NlY3QpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlydiA9IE5PX0VSUk9SOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkgewogCQl1bnNpZ25lZCBpbnQgcGVlcjsKIAkJcGVlciA9IGJlMzJfdG9fY3B1KGJ1ZmZlci0+bGFfcGVlcl9tYXhfYmlvX3NpemUpOwogCQlwZWVyID0gbWF4KHBlZXIsIERSQkRfTUFYX0JJT19TSVpFX1NBRkUpOwotCQltZGV2LT5wZWVyX21heF9iaW9fc2l6ZSA9IHBlZXI7CisJCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBwZWVyOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKICBlcnI6Ci0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGRyYmRfbWRfbWFya19kaXJ0eSgpIC0gTWFyayBtZXRhIGRhdGEgc3VwZXIgYmxvY2sgYXMgZGlydHkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENhbGwgdGhpcyBmdW5jdGlvbiBpZiB5b3UgY2hhbmdlIGFueXRoaW5nIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8KICAqIHRoZSBtZXRhLWRhdGEgc3VwZXIgYmxvY2suIFRoaXMgZnVuY3Rpb24gc2V0cyBNRF9ESVJUWSwgYW5kIHN0YXJ0cyBhCiAgKiB0aW1lciB0aGF0IGVuc3VyZXMgdGhhdCB3aXRoaW4gZml2ZSBzZWNvbmRzIHlvdSBoYXZlIHRvIGNhbGwgZHJiZF9tZF9zeW5jKCkuCiAgKi8KICNpZmRlZiBERUJVRwotdm9pZCBkcmJkX21kX21hcmtfZGlydHlfKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKQordm9pZCBkcmJkX21kX21hcmtfZGlydHlfKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuYykKIHsKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZtZGV2LT5mbGFncykpIHsKLQkJbW9kX3RpbWVyKCZtZGV2LT5tZF9zeW5jX3RpbWVyLCBqaWZmaWVzICsgSFopOwotCQltZGV2LT5sYXN0X21kX21hcmtfZGlydHkubGluZSA9IGxpbmU7Ci0JCW1kZXYtPmxhc3RfbWRfbWFya19kaXJ0eS5mdW5jID0gZnVuYzsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkgeworCQltb2RfdGltZXIoJmRldmljZS0+bWRfc3luY190aW1lciwgamlmZmllcyArIEhaKTsKKwkJZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkubGluZSA9IGxpbmU7CisJCWRldmljZS0+bGFzdF9tZF9tYXJrX2RpcnR5LmZ1bmMgPSBmdW5jOwogCX0KIH0KICNlbHNlCi12b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX21kX21hcmtfZGlydHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE1EX0RJUlRZLCAmbWRldi0+ZmxhZ3MpKQotCQltb2RfdGltZXIoJm1kZXYtPm1kX3N5bmNfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPm1kX3N5bmNfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKIH0KICNlbmRpZgogCi12b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCit2b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCWludCBpOwogCiAJZm9yIChpID0gVUlfSElTVE9SWV9TVEFSVDsgaSA8IFVJX0hJU1RPUllfRU5EOyBpKyspCi0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbaSsxXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbaV07CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtpKzFdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW2ldOwogfQogCi12b2lkIF9fZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgX19kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKIHsKIAlpZiAoaWR4ID09IFVJX0NVUlJFTlQpIHsKLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSkKIAkJCXZhbCB8PSAxOwogCQllbHNlCiAJCQl2YWwgJj0gfigodTY0KTEpOwogCi0JCWRyYmRfc2V0X2VkX3V1aWQobWRldiwgdmFsKTsKKwkJZHJiZF9zZXRfZWRfdXVpZChkZXZpY2UsIHZhbCk7CiAJfQogCi0JbWRldi0+bGRldi0+bWQudXVpZFtpZHhdID0gdmFsOwotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKKwlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaWR4XSA9IHZhbDsKKwlkcmJkX21kX21hcmtfZGlydHkoZGV2aWNlKTsKIH0KIAotdm9pZCBfZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgX2RyYmRfdXVpZF9zZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOwotCV9fZHJiZF91dWlkX3NldChtZGV2LCBpZHgsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgaWR4LCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGlkeCwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7Ci0JaWYgKG1kZXYtPmxkZXYtPm1kLnV1aWRbaWR4XSkgewotCQlkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gbWRldi0+bGRldi0+bWQudXVpZFtpZHhdOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCWlmIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaWR4XSkgeworCQlkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KGRldmljZSk7CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpZHhdOwogCX0KLQlfX2RyYmRfdXVpZF9zZXQobWRldiwgaWR4LCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCV9fZHJiZF91dWlkX3NldChkZXZpY2UsIGlkeCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOwogfQogCiAvKioKICAqIGRyYmRfdXVpZF9uZXdfY3VycmVudCgpIC0gQ3JlYXRlcyBhIG5ldyBjdXJyZW50IFVVSUQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENyZWF0ZXMgYSBuZXcgY3VycmVudCBVVUlELCBhbmQgcm90YXRlcyB0aGUgb2xkIGN1cnJlbnQgVVVJRCBpbnRvCiAgKiB0aGUgYml0bWFwIHNsb3QuIENhdXNlcyBhbiBpbmNyZW1lbnRhbCByZXN5bmMgdXBvbiBuZXh0IGNvbm5lY3QuCiAgKi8KLXZvaWQgZHJiZF91dWlkX25ld19jdXJyZW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQordm9pZCBkcmJkX3V1aWRfbmV3X2N1cnJlbnQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXU2NCB2YWw7CiAJdW5zaWduZWQgbG9uZyBsb25nIGJtX3V1aWQ7CiAKIAlnZXRfcmFuZG9tX2J5dGVzKCZ2YWwsIHNpemVvZih1NjQpKTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7Ci0JYm1fdXVpZCA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJYm1fdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdOwogCiAJaWYgKGJtX3V1aWQpCi0JCWRldl93YXJuKERFViwgImJtIFVVSUQgd2FzIGFscmVhZHkgc2V0OiAlbGxYXG4iLCBibV91dWlkKTsKKwkJZHJiZF93YXJuKGRldmljZSwgImJtIFVVSUQgd2FzIGFscmVhZHkgc2V0OiAlbGxYXG4iLCBibV91dWlkKTsKIAotCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF07Ci0JX19kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5sZGV2LT5tZC51dWlkX2xvY2spOworCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdOworCV9fZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0NVUlJFTlQsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAKLQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJuZXcgY3VycmVudCBVVUlEIik7CisJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJuZXcgY3VycmVudCBVVUlEIik7CiAJLyogZ2V0IGl0IHRvIHN0YWJsZSBzdG9yYWdlIF9ub3dfICovCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogfQogCi12b2lkIGRyYmRfdXVpZF9zZXRfYm0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpCit2b2lkIGRyYmRfdXVpZF9zZXRfYm0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWYgKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIHZhbCA9PSAwKQorCWlmIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIHZhbCA9PSAwKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiAJaWYgKHZhbCA9PSAwKSB7Ci0JCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkobWRldik7Ci0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07Ci0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IDA7CisJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkoZGV2aWNlKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID0gMDsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIGxvbmcgYm1fdXVpZCA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJtX3V1aWQgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKIAkJaWYgKGJtX3V1aWQpCi0JCQlkZXZfd2FybihERVYsICJibSBVVUlEIHdhcyBhbHJlYWR5IHNldDogJWxsWFxuIiwgYm1fdXVpZCk7CisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiYm0gVVVJRCB3YXMgYWxyZWFkeSBzZXQ6ICVsbFhcbiIsIGJtX3V1aWQpOwogCi0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IHZhbCAmIH4oKHU2NCkxKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPSB2YWwgJiB+KCh1NjQpMSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiAKLQlkcmJkX21kX21hcmtfZGlydHkobWRldik7CisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CiB9CiAKIC8qKgogICogZHJiZF9ibWlvX3NldF9uX3dyaXRlKCkgLSBpb19mbiBmb3IgZHJiZF9xdWV1ZV9iaXRtYXBfaW8oKSBvciBkcmJkX2JpdG1hcF9pbygpCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBTZXRzIGFsbCBiaXRzIGluIHRoZSBiaXRtYXAgYW5kIHdyaXRlcyB0aGUgd2hvbGUgYml0bWFwIHRvIHN0YWJsZSBzdG9yYWdlLgogICovCi1pbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBydiA9IC1FSU87CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKSB7Ci0JCWRyYmRfbWRfc2V0X2ZsYWcobWRldiwgTURGX0ZVTExfU1lOQyk7Ci0JCWRyYmRfbWRfc3luYyhtZGV2KTsKLQkJZHJiZF9ibV9zZXRfYWxsKG1kZXYpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkgeworCQlkcmJkX21kX3NldF9mbGFnKGRldmljZSwgTURGX0ZVTExfU1lOQyk7CisJCWRyYmRfbWRfc3luYyhkZXZpY2UpOworCQlkcmJkX2JtX3NldF9hbGwoZGV2aWNlKTsKIAotCQlydiA9IGRyYmRfYm1fd3JpdGUobWRldik7CisJCXJ2ID0gZHJiZF9ibV93cml0ZShkZXZpY2UpOwogCiAJCWlmICghcnYpIHsKLQkJCWRyYmRfbWRfY2xlYXJfZmxhZyhtZGV2LCBNREZfRlVMTF9TWU5DKTsKLQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWRyYmRfbWRfY2xlYXJfZmxhZyhkZXZpY2UsIE1ERl9GVUxMX1NZTkMpOworCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCX0KIAotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gcnY7CkBAIC0zMzM4LDE5ICszNDc2LDE5IEBACiAKIC8qKgogICogZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUoKSAtIGlvX2ZuIGZvciBkcmJkX3F1ZXVlX2JpdG1hcF9pbygpIG9yIGRyYmRfYml0bWFwX2lvKCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENsZWFycyBhbGwgYml0cyBpbiB0aGUgYml0bWFwIGFuZCB3cml0ZXMgdGhlIHdob2xlIGJpdG1hcCB0byBzdGFibGUgc3RvcmFnZS4KICAqLwotaW50IGRyYmRfYm1pb19jbGVhcl9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJ2ID0gLUVJTzsKIAotCWRyYmRfcmVzdW1lX2FsKG1kZXYpOwotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKLQkJZHJiZF9ibV9jbGVhcl9hbGwobWRldik7Ci0JCXJ2ID0gZHJiZF9ibV93cml0ZShtZGV2KTsKLQkJcHV0X2xkZXYobWRldik7CisJZHJiZF9yZXN1bWVfYWwoZGV2aWNlKTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJZHJiZF9ibV9jbGVhcl9hbGwoZGV2aWNlKTsKKwkJcnYgPSBkcmJkX2JtX3dyaXRlKGRldmljZSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJcmV0dXJuIHJ2OwpAQCAtMzM1OCw1MCArMzQ5Niw1MiBAQAogCiBzdGF0aWMgaW50IHdfYml0bWFwX2lvKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7Ci0Jc3RydWN0IGJtX2lvX3dvcmsgKndvcmsgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJtX2lvX3dvcmssIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZSwgYm1faW9fd29yay53KTsKKwlzdHJ1Y3QgYm1faW9fd29yayAqd29yayA9ICZkZXZpY2UtPmJtX2lvX3dvcms7CiAJaW50IHJ2ID0gLUVJTzsKIAotCURfQVNTRVJUKGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpID09IDApOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfYm1fbG9jayhtZGV2LCB3b3JrLT53aHksIHdvcmstPmZsYWdzKTsKLQkJcnYgPSB3b3JrLT5pb19mbihtZGV2KTsKLQkJZHJiZF9ibV91bmxvY2sobWRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfYm1fbG9jayhkZXZpY2UsIHdvcmstPndoeSwgd29yay0+ZmxhZ3MpOworCQlydiA9IHdvcmstPmlvX2ZuKGRldmljZSk7CisJCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCi0JY2xlYXJfYml0X3VubG9jayhCSVRNQVBfSU8sICZtZGV2LT5mbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwljbGVhcl9iaXRfdW5sb2NrKEJJVE1BUF9JTywgJmRldmljZS0+ZmxhZ3MpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIAogCWlmICh3b3JrLT5kb25lKQotCQl3b3JrLT5kb25lKG1kZXYsIHJ2KTsKKwkJd29yay0+ZG9uZShkZXZpY2UsIHJ2KTsKIAotCWNsZWFyX2JpdChCSVRNQVBfSU9fUVVFVUVELCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChCSVRNQVBfSU9fUVVFVUVELCAmZGV2aWNlLT5mbGFncyk7CiAJd29yay0+d2h5ID0gTlVMTDsKIAl3b3JrLT5mbGFncyA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlsY19kZXN0cm95KG1kZXYtPnJlc3luYyk7Ci0JbWRldi0+cmVzeW5jID0gTlVMTDsKLQlsY19kZXN0cm95KG1kZXYtPmFjdF9sb2cpOwotCW1kZXYtPmFjdF9sb2cgPSBOVUxMOworCWxjX2Rlc3Ryb3koZGV2aWNlLT5yZXN5bmMpOworCWRldmljZS0+cmVzeW5jID0gTlVMTDsKKwlsY19kZXN0cm95KGRldmljZS0+YWN0X2xvZyk7CisJZGV2aWNlLT5hY3RfbG9nID0gTlVMTDsKIAlfX25vX3dhcm4obG9jYWwsCi0JCWRyYmRfZnJlZV9iYyhtZGV2LT5sZGV2KTsKLQkJbWRldi0+bGRldiA9IE5VTEw7KTsKKwkJZHJiZF9mcmVlX2JjKGRldmljZS0+bGRldik7CisJCWRldmljZS0+bGRldiA9IE5VTEw7KTsKIAotCWNsZWFyX2JpdChHT19ESVNLTEVTUywgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoR09fRElTS0xFU1MsICZkZXZpY2UtPmZsYWdzKTsKIH0KIAogc3RhdGljIGludCB3X2dvX2Rpc2tsZXNzKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCBnb19kaXNrbGVzcyk7CiAKLQlEX0FTU0VSVChtZGV2LT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKTsKKwlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0ZBSUxFRCk7CiAJLyogd2UgY2Fubm90IGFzc2VydCBsb2NhbF9jbnQgPT0gMCBoZXJlLCBhcyBnZXRfbGRldl9pZl9zdGF0ZSB3aWxsCiAJICogaW5jL2RlYyBpdCBmcmVxdWVudGx5LiBPbmNlIHdlIGFyZSBEX0RJU0tMRVNTLCBubyBvbmUgd2lsbCB0b3VjaAogCSAqIHRoZSBwcm90ZWN0ZWQgbWVtYmVycyBhbnltb3JlLCB0aG91Z2gsIHNvIG9uY2UgcHV0X2xkZXYgcmVhY2hlcyB6ZXJvCkBAIC0zNDIwLDI3ICszNTYwLDI3IEBACiAJICogV2Ugc3RpbGwgbmVlZCB0byBjaGVjayBpZiBib3RoIGJpdG1hcCBhbmQgbGRldiBhcmUgcHJlc2VudCwgd2UgbWF5CiAJICogZW5kIHVwIGhlcmUgYWZ0ZXIgYSBmYWlsZWQgYXR0YWNoLCBiZWZvcmUgbGRldiB3YXMgZXZlbiBhc3NpZ25lZC4KIAkgKi8KLQlpZiAobWRldi0+Yml0bWFwICYmIG1kZXYtPmxkZXYpIHsKKwlpZiAoZGV2aWNlLT5iaXRtYXAgJiYgZGV2aWNlLT5sZGV2KSB7CiAJCS8qIEFuIGludGVycnVwdGVkIHJlc3luYyBvciBzaW1pbGFyIGlzIGFsbG93ZWQgdG8gcmVjb3VudHMgYml0cwogCQkgKiB3aGlsZSB3ZSBkZXRhY2guCiAJCSAqIEFueSBtb2RpZmljYXRpb25zIHdvdWxkIG5vdCBiZSBleHBlY3RlZCBhbnltb3JlLCB0aG91Z2guCiAJCSAqLwotCQlpZiAoZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIobWRldiwgZHJiZF9ibV93cml0ZSwKKwkJaWYgKGRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKGRldmljZSwgZHJiZF9ibV93cml0ZSwKIAkJCQkJImRldGFjaCIsIEJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpKSB7Ci0JCQlpZiAodGVzdF9iaXQoV0FTX1JFQURfRVJST1IsICZtZGV2LT5mbGFncykpIHsKLQkJCQlkcmJkX21kX3NldF9mbGFnKG1kZXYsIE1ERl9GVUxMX1NZTkMpOwotCQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWlmICh0ZXN0X2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCQkJZHJiZF9tZF9zZXRfZmxhZyhkZXZpY2UsIE1ERl9GVUxMX1NZTkMpOworCQkJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCQkJfQogCQl9CiAJfQogCi0JZHJiZF9mb3JjZV9zdGF0ZShtZGV2LCBOUyhkaXNrLCBEX0RJU0tMRVNTKSk7CisJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBkcmJkX3F1ZXVlX2JpdG1hcF9pbygpIC0gUXVldWVzIGFuIElPIG9wZXJhdGlvbiBvbiB0aGUgd2hvbGUgYml0bWFwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBpb19mbjoJSU8gY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYml0bWFwIElPIGlzIHBvc3NpYmxlCiAgKiBAZG9uZToJY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBiaXRtYXAgSU8gd2FzIHBlcmZvcm1lZAogICogQHdoeToJRGVzY3JpcHRpdmUgdGV4dCBvZiB0aGUgcmVhc29uIGZvciBkb2luZyB0aGUgSU8KQEAgLTM0NTAsNzYgKzM1OTAsNzcgQEAKICAqIGNhbGxlZCBmcm9tIHdvcmtlciBjb250ZXh0LiBJdCBNVVNUIE5PVCBiZSB1c2VkIHdoaWxlIGEgcHJldmlvdXMgc3VjaAogICogd29yayBpcyBzdGlsbCBwZW5kaW5nIQogICovCi12b2lkIGRyYmRfcXVldWVfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCQkgIGludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAotCQkJICB2b2lkICgqZG9uZSkoc3RydWN0IGRyYmRfY29uZiAqLCBpbnQpLAordm9pZCBkcmJkX3F1ZXVlX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJCSAgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKKwkJCSAgdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpLAogCQkJICBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKLQlEX0FTU0VSVChjdXJyZW50ID09IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCURfQVNTRVJUKCF0ZXN0X2JpdChCSVRNQVBfSU9fUVVFVUVELCAmbWRldi0+ZmxhZ3MpKTsKLQlEX0FTU0VSVCghdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5ibV9pb193b3JrLncubGlzdCkpOwotCWlmIChtZGV2LT5ibV9pb193b3JrLndoeSkKLQkJZGV2X2VycihERVYsICJGSVhNRSBnb2luZyB0byBxdWV1ZSAnJXMnIGJ1dCAnJXMnIHN0aWxsIHBlbmRpbmc/XG4iLAotCQkJd2h5LCBtZGV2LT5ibV9pb193b3JrLndoeSk7CisJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQklUTUFQX0lPX1FVRVVFRCwgJmRldmljZS0+ZmxhZ3MpKTsKKwlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmJtX2lvX3dvcmsudy5saXN0KSk7CisJaWYgKGRldmljZS0+Ym1faW9fd29yay53aHkpCisJCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FIGdvaW5nIHRvIHF1ZXVlICclcycgYnV0ICclcycgc3RpbGwgcGVuZGluZz9cbiIsCisJCQl3aHksIGRldmljZS0+Ym1faW9fd29yay53aHkpOwogCi0JbWRldi0+Ym1faW9fd29yay5pb19mbiA9IGlvX2ZuOwotCW1kZXYtPmJtX2lvX3dvcmsuZG9uZSA9IGRvbmU7Ci0JbWRldi0+Ym1faW9fd29yay53aHkgPSB3aHk7Ci0JbWRldi0+Ym1faW9fd29yay5mbGFncyA9IGZsYWdzOworCWRldmljZS0+Ym1faW9fd29yay5pb19mbiA9IGlvX2ZuOworCWRldmljZS0+Ym1faW9fd29yay5kb25lID0gZG9uZTsKKwlkZXZpY2UtPmJtX2lvX3dvcmsud2h5ID0gd2h5OworCWRldmljZS0+Ym1faW9fd29yay5mbGFncyA9IGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlzZXRfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKTsKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPmFwX2Jpb19jbnQpID09IDApIHsKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZtZGV2LT5mbGFncykpCi0JCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJm1kZXYtPmJtX2lvX3dvcmsudyk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXNldF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpID09IDApIHsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZkZXZpY2UtPmZsYWdzKSkKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJCSZkZXZpY2UtPmJtX2lvX3dvcmsudyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JpdG1hcF9pbygpIC0gIERvZXMgYW4gSU8gb3BlcmF0aW9uIG9uIHRoZSB3aG9sZSBiaXRtYXAKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGlvX2ZuOglJTyBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBiaXRtYXAgSU8gaXMgcG9zc2libGUKICAqIEB3aHk6CURlc2NyaXB0aXZlIHRleHQgb2YgdGhlIHJlYXNvbiBmb3IgZG9pbmcgdGhlIElPCiAgKgogICogZnJlZXplcyBhcHBsaWNhdGlvbiBJTyB3aGlsZSB0aGF0IHRoZSBhY3R1YWwgSU8gb3BlcmF0aW9ucyBydW5zLiBUaGlzCiAgKiBmdW5jdGlvbnMgTUFZIE5PVCBiZSBjYWxsZWQgZnJvbSB3b3JrZXIgY29udGV4dC4KICAqLwotaW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAoraW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgKCppb19mbikoc3RydWN0IGRyYmRfZGV2aWNlICopLAogCQljaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKIAlpbnQgcnY7CiAKLQlEX0FTU0VSVChjdXJyZW50ICE9IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ICE9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAogCWlmICgoZmxhZ3MgJiBCTV9MT0NLRURfU0VUX0FMTE9XRUQpID09IDApCi0JCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKKwkJZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgd2h5LCBmbGFncyk7Ci0JcnYgPSBpb19mbihtZGV2KTsKLQlkcmJkX2JtX3VubG9jayhtZGV2KTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCB3aHksIGZsYWdzKTsKKwlydiA9IGlvX2ZuKGRldmljZSk7CisJZHJiZF9ibV91bmxvY2soZGV2aWNlKTsKIAogCWlmICgoZmxhZ3MgJiBCTV9MT0NLRURfU0VUX0FMTE9XRUQpID09IDApCi0JCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCQlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCi12b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWcpIF9fbXVzdF9ob2xkKGxvY2FsKQordm9pZCBkcmJkX21kX3NldF9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZykgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JaWYgKChtZGV2LT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IGZsYWcpIHsKLQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC5mbGFncyB8PSBmbGFnOworCWlmICgoZGV2aWNlLT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IGZsYWcpIHsKKwkJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgfD0gZmxhZzsKIAl9CiB9CiAKLXZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBmbGFnKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZykgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JaWYgKChtZGV2LT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IDApIHsKLQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC5mbGFncyAmPSB+ZmxhZzsKKwlpZiAoKGRldmljZS0+bGRldi0+bWQuZmxhZ3MgJiBmbGFnKSAhPSAwKSB7CisJCWRyYmRfbWRfbWFya19kaXJ0eShkZXZpY2UpOworCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzICY9IH5mbGFnOwogCX0KIH0KIGludCBkcmJkX21kX3Rlc3RfZmxhZyhzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldiwgaW50IGZsYWcpCkBAIC0zNTI5LDIzICszNjcwLDI1IEBACiAKIHN0YXRpYyB2b2lkIG1kX3N5bmNfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOwogCiAJLyogbXVzdCBub3QgZG91YmxlLXF1ZXVlISAqLwotCWlmIChsaXN0X2VtcHR5KCZtZGV2LT5tZF9zeW5jX3dvcmsubGlzdCkpCi0JCWRyYmRfcXVldWVfd29ya19mcm9udCgmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+bWRfc3luY193b3JrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5tZF9zeW5jX3dvcmsubGlzdCkpCisJCWRyYmRfcXVldWVfd29ya19mcm9udCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJICAgICAgJmRldmljZS0+bWRfc3luY193b3JrKTsKIH0KIAogc3RhdGljIGludCB3X21kX3N5bmMoc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIG1kX3N5bmNfd29yayk7CiAKLQlkZXZfd2FybihERVYsICJtZF9zeW5jX3RpbWVyIGV4cGlyZWQhIFdvcmtlciBjYWxscyBkcmJkX21kX3N5bmMoKS5cbiIpOworCWRyYmRfd2FybihkZXZpY2UsICJtZF9zeW5jX3RpbWVyIGV4cGlyZWQhIFdvcmtlciBjYWxscyBkcmJkX21kX3N5bmMoKS5cbiIpOwogI2lmZGVmIERFQlVHCi0JZGV2X3dhcm4oREVWLCAibGFzdCBtZF9tYXJrX2RpcnR5OiAlczoldVxuIiwKLQkJbWRldi0+bGFzdF9tZF9tYXJrX2RpcnR5LmZ1bmMsIG1kZXYtPmxhc3RfbWRfbWFya19kaXJ0eS5saW5lKTsKKwlkcmJkX3dhcm4oZGV2aWNlLCAibGFzdCBtZF9tYXJrX2RpcnR5OiAlczoldVxuIiwKKwkJZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkuZnVuYywgZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkubGluZSk7CiAjZW5kaWYKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2MjEsMTggKzM3NjQsMTggQEAKIAogLyoqCiAgKiBkcmJkX3dhaXRfbWlzYyAgLSAgd2FpdCBmb3IgYSByZXF1ZXN0IHRvIG1ha2UgcHJvZ3Jlc3MKLSAqIEBtZGV2OglkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKiBAZGV2aWNlOglkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CiAgKiBAaToJCXRoZSBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCBlbWJlZGRlZCBpbiBzdHJ1Y3QgZHJiZF9yZXF1ZXN0IG9yCiAgKgkJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0CiAgKi8KLWludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK2ludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCiB7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlsb25nIHRpbWVvdXQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKCFuYykgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC0zNjQwLDE0ICszNzgzLDE0IEBACiAJdGltZW91dCA9IG5jLT5rb19jb3VudCA/IG5jLT50aW1lb3V0ICogSFogLyAxMCAqIG5jLT5rb19jb3VudCA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JLyogSW5kaWNhdGUgdG8gd2FrZSB1cCBtZGV2LT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLworCS8qIEluZGljYXRlIHRvIHdha2UgdXAgZGV2aWNlLT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLwogCWktPndhaXRpbmcgPSB0cnVlOwotCXByZXBhcmVfdG9fd2FpdCgmbWRldi0+bWlzY193YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJcHJlcGFyZV90b193YWl0KCZkZXZpY2UtPm1pc2Nfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JZmluaXNoX3dhaXQoJm1kZXYtPm1pc2Nfd2FpdCwgJndhaXQpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKCF0aW1lb3V0IHx8IG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKKwlmaW5pc2hfd2FpdCgmZGV2aWNlLT5taXNjX3dhaXQsICZ3YWl0KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJaWYgKCF0aW1lb3V0IHx8IGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0zNzAzLDIwICszODQ2LDIwIEBACiB9CiAKIHVuc2lnbmVkIGludAotX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCB0eXBlKQorX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdGF0aWMgc3RydWN0IGZhdWx0X3JhbmRvbV9zdGF0ZSBycnMgPSB7MCwgMH07CiAKIAl1bnNpZ25lZCBpbnQgcmV0ID0gKAogCQkoZmF1bHRfZGV2cyA9PSAwIHx8Ci0JCQkoKDEgPDwgbWRldl90b19taW5vcihtZGV2KSkgJiBmYXVsdF9kZXZzKSAhPSAwKSAmJgorCQkJKCgxIDw8IGRldmljZV90b19taW5vcihkZXZpY2UpKSAmIGZhdWx0X2RldnMpICE9IDApICYmCiAJCSgoKF9kcmJkX2ZhdWx0X3JhbmRvbSgmcnJzKSAlIDEwMCkgKyAxKSA8PSBmYXVsdF9yYXRlKSk7CiAKIAlpZiAocmV0KSB7CiAJCWZhdWx0X2NvdW50Kys7CiAKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfd2FybihERVYsICIqKipTaW11bGF0aW5nICVzIGZhaWx1cmVcbiIsCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiKioqU2ltdWxhdGluZyAlcyBmYWlsdXJlXG4iLAogCQkJCV9kcmJkX2ZhdWx0X3N0cih0eXBlKSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbmwuYwppbmRleCBjNzA2ZDUwLi41MjY0MTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX25sLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlICJkcmJkX2ludC5oIgorI2luY2x1ZGUgImRyYmRfcHJvdG9jb2wuaCIKICNpbmNsdWRlICJkcmJkX3JlcS5oIgogI2luY2x1ZGUgImRyYmRfd3JhcHBlcnMuaCIKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC00NCw4ICs0NSw4IEBACiAvLyBpbnQgZHJiZF9hZG1fY3JlYXRlX3Jlc291cmNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwogLy8gaW50IGRyYmRfYWRtX2RlbGV0ZV9yZXNvdXJjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAotaW50IGRyYmRfYWRtX2FkZF9taW5vcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKLWludCBkcmJkX2FkbV9kZWxldGVfbWlub3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgZHJiZF9hZG1fbmV3X21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGRyYmRfYWRtX2RlbF9taW5vcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IGRyYmRfYWRtX25ld19yZXNvdXJjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCBkcmJkX2FkbV9kZWxfcmVzb3VyY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CkBAIC0xMDIsOCArMTAzLDkgQEAKIAkvKiBwb2ludGVyIGludG8gcmVwbHkgYnVmZmVyICovCiAJc3RydWN0IGRyYmRfZ2VubG1zZ2hkciAqcmVwbHlfZGg7CiAJLyogcmVzb2x2ZWQgZnJvbSBhdHRyaWJ1dGVzLCBpZiBwb3NzaWJsZSAqLwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogfSBhZG1fY3R4OwogCiBzdGF0aWMgdm9pZCBkcmJkX2FkbV9zZW5kX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCkBAIC0yMDIsNjIgKzIwNCw2NyBAQAogCQlhZG1fY3R4Lm15X2FkZHIgPSBuZXN0ZWRfYXR0cl90YltfX25sYV90eXBlKFRfY3R4X215X2FkZHIpXTsKIAkJYWRtX2N0eC5wZWVyX2FkZHIgPSBuZXN0ZWRfYXR0cl90YltfX25sYV90eXBlKFRfY3R4X3BlZXJfYWRkcildOwogCQlpZiAoKGFkbV9jdHgubXlfYWRkciAmJgotCQkgICAgIG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA+IHNpemVvZihhZG1fY3R4LnRjb25uLT5teV9hZGRyKSkgfHwKKwkJICAgICBubGFfbGVuKGFkbV9jdHgubXlfYWRkcikgPiBzaXplb2YoYWRtX2N0eC5jb25uZWN0aW9uLT5teV9hZGRyKSkgfHwKIAkJICAgIChhZG1fY3R4LnBlZXJfYWRkciAmJgotCQkgICAgIG5sYV9sZW4oYWRtX2N0eC5wZWVyX2FkZHIpID4gc2l6ZW9mKGFkbV9jdHgudGNvbm4tPnBlZXJfYWRkcikpKSB7CisJCSAgICAgbmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikgPiBzaXplb2YoYWRtX2N0eC5jb25uZWN0aW9uLT5wZWVyX2FkZHIpKSkgewogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCX0KIAogCWFkbV9jdHgubWlub3IgPSBkX2luLT5taW5vcjsKLQlhZG1fY3R4Lm1kZXYgPSBtaW5vcl90b19tZGV2KGRfaW4tPm1pbm9yKTsKLQlhZG1fY3R4LnRjb25uID0gY29ubl9nZXRfYnlfbmFtZShhZG1fY3R4LnJlc291cmNlX25hbWUpOworCWFkbV9jdHguZGV2aWNlID0gbWlub3JfdG9fZGV2aWNlKGRfaW4tPm1pbm9yKTsKKwlpZiAoYWRtX2N0eC5yZXNvdXJjZV9uYW1lKSB7CisJCWFkbV9jdHgucmVzb3VyY2UgPSBkcmJkX2ZpbmRfcmVzb3VyY2UoYWRtX2N0eC5yZXNvdXJjZV9uYW1lKTsKKwl9CiAKLQlpZiAoIWFkbV9jdHgubWRldiAmJiAoZmxhZ3MgJiBEUkJEX0FETV9ORUVEX01JTk9SKSkgeworCWlmICghYWRtX2N0eC5kZXZpY2UgJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9NSU5PUikpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVua25vd24gbWlub3IiKTsKIAkJcmV0dXJuIEVSUl9NSU5PUl9JTlZBTElEOwogCX0KLQlpZiAoIWFkbV9jdHgudGNvbm4gJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSkpIHsKKwlpZiAoIWFkbV9jdHgucmVzb3VyY2UgJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSkpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVua25vd24gcmVzb3VyY2UiKTsKKwkJaWYgKGFkbV9jdHgucmVzb3VyY2VfbmFtZSkKKwkJCXJldHVybiBFUlJfUkVTX05PVF9LTk9XTjsKIAkJcmV0dXJuIEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJfQogCiAJaWYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9DT05ORUNUSU9OKSB7Ci0JCWlmIChhZG1fY3R4LnRjb25uICYmICEoZmxhZ3MgJiBEUkJEX0FETV9ORUVEX1JFU09VUkNFKSkgeworCQlpZiAoYWRtX2N0eC5yZXNvdXJjZSkgewogCQkJZHJiZF9tc2dfcHV0X2luZm8oIm5vIHJlc291cmNlIG5hbWUgZXhwZWN0ZWQiKTsKIAkJCXJldHVybiBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQl9Ci0JCWlmIChhZG1fY3R4Lm1kZXYpIHsKKwkJaWYgKGFkbV9jdHguZGV2aWNlKSB7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygibm8gbWlub3IgbnVtYmVyIGV4cGVjdGVkIik7CiAJCQlyZXR1cm4gRVJSX0lOVkFMSURfUkVRVUVTVDsKIAkJfQogCQlpZiAoYWRtX2N0eC5teV9hZGRyICYmIGFkbV9jdHgucGVlcl9hZGRyKQotCQkJYWRtX2N0eC50Y29ubiA9IGNvbm5fZ2V0X2J5X2FkZHJzKG5sYV9kYXRhKGFkbV9jdHgubXlfYWRkciksCisJCQlhZG1fY3R4LmNvbm5lY3Rpb24gPSBjb25uX2dldF9ieV9hZGRycyhubGFfZGF0YShhZG1fY3R4Lm15X2FkZHIpLAogCQkJCQkJCSAgbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpLAogCQkJCQkJCSAgbmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLAogCQkJCQkJCSAgbmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikpOwotCQlpZiAoIWFkbV9jdHgudGNvbm4pIHsKKwkJaWYgKCFhZG1fY3R4LmNvbm5lY3Rpb24pIHsKIAkJCWRyYmRfbXNnX3B1dF9pbmZvKCJ1bmtub3duIGNvbm5lY3Rpb24iKTsKIAkJCXJldHVybiBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQl9CiAJfQogCiAJLyogc29tZSBtb3JlIHBhcmFub2lhLCBpZiB0aGUgcmVxdWVzdCB3YXMgb3Zlci1kZXRlcm1pbmVkICovCi0JaWYgKGFkbV9jdHgubWRldiAmJiBhZG1fY3R4LnRjb25uICYmCi0JICAgIGFkbV9jdHgubWRldi0+dGNvbm4gIT0gYWRtX2N0eC50Y29ubikgewotCQlwcl93YXJuaW5nKCJyZXF1ZXN0OiBtaW5vcj0ldSwgcmVzb3VyY2U9JXM7IGJ1dCB0aGF0IG1pbm9yIGJlbG9uZ3MgdG8gY29ubmVjdGlvbiAlc1xuIiwKLQkJCQlhZG1fY3R4Lm1pbm9yLCBhZG1fY3R4LnJlc291cmNlX25hbWUsCi0JCQkJYWRtX2N0eC5tZGV2LT50Y29ubi0+bmFtZSk7CisJaWYgKGFkbV9jdHguZGV2aWNlICYmIGFkbV9jdHgucmVzb3VyY2UgJiYKKwkgICAgYWRtX2N0eC5kZXZpY2UtPnJlc291cmNlICE9IGFkbV9jdHgucmVzb3VyY2UpIHsKKwkJcHJfd2FybmluZygicmVxdWVzdDogbWlub3I9JXUsIHJlc291cmNlPSVzOyBidXQgdGhhdCBtaW5vciBiZWxvbmdzIHRvIHJlc291cmNlICVzXG4iLAorCQkJCWFkbV9jdHgubWlub3IsIGFkbV9jdHgucmVzb3VyY2UtPm5hbWUsCisJCQkJYWRtX2N0eC5kZXZpY2UtPnJlc291cmNlLT5uYW1lKTsKIAkJZHJiZF9tc2dfcHV0X2luZm8oIm1pbm9yIGV4aXN0cyBpbiBkaWZmZXJlbnQgcmVzb3VyY2UiKTsKIAkJcmV0dXJuIEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJfQotCWlmIChhZG1fY3R4Lm1kZXYgJiYKKwlpZiAoYWRtX2N0eC5kZXZpY2UgJiYKIAkgICAgYWRtX2N0eC52b2x1bWUgIT0gVk9MVU1FX1VOU1BFQ0lGSUVEICYmCi0JICAgIGFkbV9jdHgudm9sdW1lICE9IGFkbV9jdHgubWRldi0+dm5yKSB7CisJICAgIGFkbV9jdHgudm9sdW1lICE9IGFkbV9jdHguZGV2aWNlLT52bnIpIHsKIAkJcHJfd2FybmluZygicmVxdWVzdDogbWlub3I9JXUsIHZvbHVtZT0ldTsgYnV0IHRoYXQgbWlub3IgaXMgdm9sdW1lICV1IGluICVzXG4iLAogCQkJCWFkbV9jdHgubWlub3IsIGFkbV9jdHgudm9sdW1lLAotCQkJCWFkbV9jdHgubWRldi0+dm5yLCBhZG1fY3R4Lm1kZXYtPnRjb25uLT5uYW1lKTsKKwkJCQlhZG1fY3R4LmRldmljZS0+dm5yLAorCQkJCWFkbV9jdHguZGV2aWNlLT5yZXNvdXJjZS0+bmFtZSk7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKCJtaW5vciBleGlzdHMgYXMgZGlmZmVyZW50IHZvbHVtZSIpOwogCQlyZXR1cm4gRVJSX0lOVkFMSURfUkVRVUVTVDsKIAl9CkBAIC0yNzIsOSArMjc5LDEzIEBACiAKIHN0YXRpYyBpbnQgZHJiZF9hZG1fZmluaXNoKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sIGludCByZXRjb2RlKQogewotCWlmIChhZG1fY3R4LnRjb25uKSB7Ci0JCWtyZWZfcHV0KCZhZG1fY3R4LnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKLQkJYWRtX2N0eC50Y29ubiA9IE5VTEw7CisJaWYgKGFkbV9jdHguY29ubmVjdGlvbikgeworCQlrcmVmX3B1dCgmYWRtX2N0eC5jb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCWFkbV9jdHguY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCWlmIChhZG1fY3R4LnJlc291cmNlKSB7CisJCWtyZWZfcHV0KCZhZG1fY3R4LnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworCQlhZG1fY3R4LnJlc291cmNlID0gTlVMTDsKIAl9CiAKIAlpZiAoIWFkbV9jdHgucmVwbHlfc2tiKQpAQCAtMjg1LDM0ICsyOTYsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfa2hlbHBlcl9lbnYoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBjaGFyICoqZW52cCkKK3N0YXRpYyB2b2lkIHNldHVwX2toZWxwZXJfZW52KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGNoYXIgKiplbnZwKQogewogCWNoYXIgKmFmczsKIAogCS8qIEZJWE1FOiBBIGZ1dHVyZSB2ZXJzaW9uIHdpbGwgbm90IGFsbG93IHRoaXMgY2FzZS4gKi8KLQlpZiAodGNvbm4tPm15X2FkZHJfbGVuID09IDAgfHwgdGNvbm4tPnBlZXJfYWRkcl9sZW4gPT0gMCkKKwlpZiAoY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4gPT0gMCB8fCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuID09IDApCiAJCXJldHVybjsKIAotCXN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbm4tPnBlZXJfYWRkciktPnNhX2ZhbWlseSkgeworCXN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2FfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUNjoKIAkJYWZzID0gImlwdjYiOwogCQlzbnByaW50ZihlbnZwWzRdLCA2MCwgIkRSQkRfUEVFUl9BRERSRVNTPSVwSTYiLAotCQkJICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbjZfYWRkcik7CisJCQkgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZjb25uZWN0aW9uLT5wZWVyX2FkZHIpLT5zaW42X2FkZHIpOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ6CiAJCWFmcyA9ICJpcHY0IjsKIAkJc25wcmludGYoZW52cFs0XSwgNjAsICJEUkJEX1BFRVJfQUREUkVTUz0lcEk0IiwKLQkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbl9hZGRyKTsKKwkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2luX2FkZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlhZnMgPSAic3NvY2tzIjsKIAkJc25wcmludGYoZW52cFs0XSwgNjAsICJEUkJEX1BFRVJfQUREUkVTUz0lcEk0IiwKLQkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbl9hZGRyKTsKKwkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2luX2FkZHIpOwogCX0KIAlzbnByaW50ZihlbnZwWzNdLCAyMCwgIkRSQkRfUEVFUl9BRj0lcyIsIGFmcyk7CiB9CiAKLWludCBkcmJkX2toZWxwZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY2hhciAqY21kKQoraW50IGRyYmRfa2hlbHBlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY2hhciAqY21kKQogewogCWNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsCiAJCQkiVEVSTT1saW51eCIsCkBAIC0zMjIsMzkgKzMzMywzOSBAQAogCQkJTlVMTCB9OwogCWNoYXIgbWJbMTJdOwogCWNoYXIgKmFyZ3ZbXSA9IHt1c2VybW9kZV9oZWxwZXIsIGNtZCwgbWIsIE5VTEwgfTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liOwogCWludCByZXQ7CiAKLQlpZiAoY3VycmVudCA9PSB0Y29ubi0+d29ya2VyLnRhc2spCi0JCXNldF9iaXQoQ0FMTEJBQ0tfUEVORElORywgJnRjb25uLT5mbGFncyk7CisJaWYgKGN1cnJlbnQgPT0gY29ubmVjdGlvbi0+d29ya2VyLnRhc2spCisJCXNldF9iaXQoQ0FMTEJBQ0tfUEVORElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCXNucHJpbnRmKG1iLCAxMiwgIm1pbm9yLSVkIiwgbWRldl90b19taW5vcihtZGV2KSk7Ci0Jc2V0dXBfa2hlbHBlcl9lbnYodGNvbm4sIGVudnApOworCXNucHJpbnRmKG1iLCAxMiwgIm1pbm9yLSVkIiwgZGV2aWNlX3RvX21pbm9yKGRldmljZSkpOworCXNldHVwX2toZWxwZXJfZW52KGNvbm5lY3Rpb24sIGVudnApOwogCiAJLyogVGhlIGhlbHBlciBtYXkgdGFrZSBzb21lIHRpbWUuCiAJICogd3JpdGUgb3V0IGFueSB1bnN5bmNlZCBtZXRhIGRhdGEgY2hhbmdlcyBub3cgKi8KLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlkZXZfaW5mbyhERVYsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXNcbiIsIHVzZXJtb2RlX2hlbHBlciwgY21kLCBtYik7CisJZHJiZF9pbmZvKGRldmljZSwgImhlbHBlciBjb21tYW5kOiAlcyAlcyAlc1xuIiwgdXNlcm1vZGVfaGVscGVyLCBjbWQsIG1iKTsKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9IRUxQRVJfUFJFOwogCXNpYi5oZWxwZXJfbmFtZSA9IGNtZDsKLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAlyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKHVzZXJtb2RlX2hlbHBlciwgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CiAJaWYgKHJldCkKLQkJZGV2X3dhcm4oREVWLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCisJCWRyYmRfd2FybihkZXZpY2UsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKIAkJCQl1c2VybW9kZV9oZWxwZXIsIGNtZCwgbWIsCiAJCQkJKHJldCA+PiA4KSAmIDB4ZmYsIHJldCk7CiAJZWxzZQotCQlkZXZfaW5mbyhERVYsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgImhlbHBlciBjb21tYW5kOiAlcyAlcyAlcyBleGl0IGNvZGUgJXUgKDB4JXgpXG4iLAogCQkJCXVzZXJtb2RlX2hlbHBlciwgY21kLCBtYiwKIAkJCQkocmV0ID4+IDgpICYgMHhmZiwgcmV0KTsKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9IRUxQRVJfUE9TVDsKIAlzaWIuaGVscGVyX2V4aXRfY29kZSA9IHJldDsKLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAotCWlmIChjdXJyZW50ID09IHRjb25uLT53b3JrZXIudGFzaykKLQkJY2xlYXJfYml0KENBTExCQUNLX1BFTkRJTkcsICZ0Y29ubi0+ZmxhZ3MpOworCWlmIChjdXJyZW50ID09IGNvbm5lY3Rpb24tPndvcmtlci50YXNrKQorCQljbGVhcl9iaXQoQ0FMTEJBQ0tfUEVORElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCWlmIChyZXQgPCAwKSAvKiBJZ25vcmUgYW55IEVSUk5PcyB3ZSBnb3QuICovCiAJCXJldCA9IDA7CkBAIC0zNjIsNyArMzczLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgY29ubl9raGVscGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgY2hhciAqY21kKQorc3RhdGljIGludCBjb25uX2toZWxwZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgY2hhciAqY21kKQogewogCWNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsCiAJCQkiVEVSTT1saW51eCIsCkBAIC0zNzAsMjMgKzM4MSwyNCBAQAogCQkJIChjaGFyWzIwXSkgeyB9LCAvKiBhZGRyZXNzIGZhbWlseSAqLwogCQkJIChjaGFyWzYwXSkgeyB9LCAvKiBhZGRyZXNzICovCiAJCQlOVUxMIH07Ci0JY2hhciAqYXJndltdID0ge3VzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwgTlVMTCB9OworCWNoYXIgKnJlc291cmNlX25hbWUgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+bmFtZTsKKwljaGFyICphcmd2W10gPSB7dXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsIE5VTEwgfTsKIAlpbnQgcmV0OwogCi0Jc2V0dXBfa2hlbHBlcl9lbnYodGNvbm4sIGVudnApOwotCWNvbm5fbWRfc3luYyh0Y29ubik7CisJc2V0dXBfa2hlbHBlcl9lbnYoY29ubmVjdGlvbiwgZW52cCk7CisJY29ubl9tZF9zeW5jKGNvbm5lY3Rpb24pOwogCi0JY29ubl9pbmZvKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzXG4iLCB1c2VybW9kZV9oZWxwZXIsIGNtZCwgdGNvbm4tPm5hbWUpOworCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzXG4iLCB1c2VybW9kZV9oZWxwZXIsIGNtZCwgcmVzb3VyY2VfbmFtZSk7CiAJLyogVE9ETzogY29ubl9iY2FzdF9ldmVudCgpID8/ICovCiAKIAlyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKHVzZXJtb2RlX2hlbHBlciwgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CiAJaWYgKHJldCkKLQkJY29ubl93YXJuKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCi0JCQkgIHVzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwKKwkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJCSAgdXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsCiAJCQkgIChyZXQgPj4gOCkgJiAweGZmLCByZXQpOwogCWVsc2UKLQkJY29ubl9pbmZvKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCi0JCQkgIHVzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJCSAgdXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsCiAJCQkgIChyZXQgPj4gOCkgJiAweGZmLCByZXQpOwogCS8qIFRPRE86IGNvbm5fYmNhc3RfZXZlbnQoKSA/PyAqLwogCkBAIC0zOTYsMTggKzQwOCwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBlbnVtIGRyYmRfZmVuY2luZ19wIGhpZ2hlc3RfZmVuY2luZ19wb2xpY3koc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGVudW0gZHJiZF9mZW5jaW5nX3AgaGlnaGVzdF9mZW5jaW5nX3BvbGljeShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9mZW5jaW5nX3AgZnAgPSBGUF9OT1RfQVZBSUw7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQ09OU0lTVEVOVCkpIHsKLQkJCWZwID0gbWF4X3QoZW51bSBkcmJkX2ZlbmNpbmdfcCwgZnAsCi0JCQkJICAgcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmcpOwotCQkJcHV0X2xkZXYobWRldik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0NPTlNJU1RFTlQpKSB7CisJCQlzdHJ1Y3QgZGlza19jb25mICpkaXNrX2NvbmYgPQorCQkJCXJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+ZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOworCQkJZnAgPSBtYXhfdChlbnVtIGRyYmRfZmVuY2luZ19wLCBmcCwgZGlza19jb25mLT5mZW5jaW5nKTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC00MTUsNyArNDI5LDcgQEAKIAlyZXR1cm4gZnA7CiB9CiAKLWJvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2Jvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGNvbm5lY3RfY250OwogCXVuaW9uIGRyYmRfc3RhdGUgbWFzayA9IHsgfTsKQEAgLTQyNCwyNiArNDM4LDI2IEBACiAJY2hhciAqZXhfdG9fc3RyaW5nOwogCWludCByOwogCi0JaWYgKHRjb25uLT5jc3RhdGUgPj0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiRXhwZWN0ZWQgY3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TXG4iKTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiRXhwZWN0ZWQgY3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JY29ubmVjdF9jbnQgPSB0Y29ubi0+Y29ubmVjdF9jbnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJY29ubmVjdF9jbnQgPSBjb25uZWN0aW9uLT5jb25uZWN0X2NudDsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlmcCA9IGhpZ2hlc3RfZmVuY2luZ19wb2xpY3kodGNvbm4pOworCWZwID0gaGlnaGVzdF9mZW5jaW5nX3BvbGljeShjb25uZWN0aW9uKTsKIAlzd2l0Y2ggKGZwKSB7CiAJY2FzZSBGUF9OT1RfQVZBSUw6Ci0JCWNvbm5fd2Fybih0Y29ubiwgIk5vdCBmZW5jaW5nIHBlZXIsIEknbSBub3QgZXZlbiBDb25zaXN0ZW50IG15c2VsZi5cbiIpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIk5vdCBmZW5jaW5nIHBlZXIsIEknbSBub3QgZXZlbiBDb25zaXN0ZW50IG15c2VsZi5cbiIpOwogCQlnb3RvIG91dDsKIAljYXNlIEZQX0RPTlRfQ0FSRToKIAkJcmV0dXJuIHRydWU7CiAJZGVmYXVsdDogOwogCX0KIAotCXIgPSBjb25uX2toZWxwZXIodGNvbm4sICJmZW5jZS1wZWVyIik7CisJciA9IGNvbm5fa2hlbHBlcihjb25uZWN0aW9uLCAiZmVuY2UtcGVlciIpOwogCiAJc3dpdGNoICgocj4+OCkgJiAweGZmKSB7CiAJY2FzZSAzOiAvKiBwZWVyIGlzIGluY29uc2lzdGVudCAqLwpAQCAtNDU3LDcgKzQ3MSw3IEBACiAJCXZhbC5wZHNrID0gRF9PVVREQVRFRDsKIAkJYnJlYWs7CiAJY2FzZSA1OiAvKiBwZWVyIHdhcyBkb3duICovCi0JCWlmIChjb25uX2hpZ2hlc3RfZGlzayh0Y29ubikgPT0gRF9VUF9UT19EQVRFKSB7CisJCWlmIChjb25uX2hpZ2hlc3RfZGlzayhjb25uZWN0aW9uKSA9PSBEX1VQX1RPX0RBVEUpIHsKIAkJCS8qIHdlIHdpbGwoaGF2ZSkgY3JlYXRlKGQpIGEgbmV3IFVVSUQgYW55d2F5cy4uLiAqLwogCQkJZXhfdG9fc3RyaW5nID0gInBlZXIgaXMgdW5yZWFjaGFibGUsIGFzc3VtZWQgdG8gYmUgZGVhZCI7CiAJCQltYXNrLnBkc2sgPSBEX01BU0s7CkBAIC00NzAsNzAgKzQ4NCw3MCBAQAogCQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIHVuY29ubmVjdGVkIFJfU0VDT05EQVJZIGlzIGFza2VkIHRvCiAJCSAqIGJlY29tZSBSX1BSSU1BUlksIGJ1dCBmaW5kcyB0aGUgb3RoZXIgcGVlciBiZWluZyBhY3RpdmUuICovCiAJCWV4X3RvX3N0cmluZyA9ICJwZWVyIGlzIGFjdGl2ZSI7Ci0JCWNvbm5fd2Fybih0Y29ubiwgIlBlZXIgaXMgcHJpbWFyeSwgb3V0ZGF0aW5nIG15c2VsZi5cbiIpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIlBlZXIgaXMgcHJpbWFyeSwgb3V0ZGF0aW5nIG15c2VsZi5cbiIpOwogCQltYXNrLmRpc2sgPSBEX01BU0s7CiAJCXZhbC5kaXNrID0gRF9PVVREQVRFRDsKIAkJYnJlYWs7CiAJY2FzZSA3OgogCQlpZiAoZnAgIT0gRlBfU1RPTklUSCkKLQkJCWNvbm5fZXJyKHRjb25uLCAiZmVuY2UtcGVlcigpID0gNyAmJiBmZW5jaW5nICE9IFN0b25pdGggISEhXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJmZW5jZS1wZWVyKCkgPSA3ICYmIGZlbmNpbmcgIT0gU3Rvbml0aCAhISFcbiIpOwogCQlleF90b19zdHJpbmcgPSAicGVlciB3YXMgc3Rvbml0aGVkIjsKIAkJbWFzay5wZHNrID0gRF9NQVNLOwogCQl2YWwucGRzayA9IERfT1VUREFURUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFRoZSBzY3JpcHQgaXMgYnJva2VuIC4uLiAqLwotCQljb25uX2Vycih0Y29ubiwgImZlbmNlLXBlZXIgaGVscGVyIGJyb2tlbiwgcmV0dXJuZWQgJWRcbiIsIChyPj44KSYweGZmKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImZlbmNlLXBlZXIgaGVscGVyIGJyb2tlbiwgcmV0dXJuZWQgJWRcbiIsIChyPj44KSYweGZmKTsKIAkJcmV0dXJuIGZhbHNlOyAvKiBFdmVudHVhbGx5IGxlYXZlIElPIGZyb3plbiAqLwogCX0KIAotCWNvbm5faW5mbyh0Y29ubiwgImZlbmNlLXBlZXIgaGVscGVyIHJldHVybmVkICVkICglcylcbiIsCisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJmZW5jZS1wZWVyIGhlbHBlciByZXR1cm5lZCAlZCAoJXMpXG4iLAogCQkgIChyPj44KSAmIDB4ZmYsIGV4X3RvX3N0cmluZyk7CiAKICBvdXQ6CiAKIAkvKiBOb3QgdXNpbmcKLQkgICBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CisJICAgY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CiAJICAgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCB3ZXJlIGFibGUgdG8gcmUtZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGluIHRoZQogCSAgIG1lYW50aW1lLiAqLwotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgIXRlc3RfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpKSB7Ci0JCWlmICh0Y29ubi0+Y29ubmVjdF9jbnQgIT0gY29ubmVjdF9jbnQpCisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TICYmICF0ZXN0X2JpdChTVEFURV9TRU5ULCAmY29ubmVjdGlvbi0+ZmxhZ3MpKSB7CisJCWlmIChjb25uZWN0aW9uLT5jb25uZWN0X2NudCAhPSBjb25uZWN0X2NudCkKIAkJCS8qIEluIGNhc2UgdGhlIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIGFuZCBkcm9wZWQKIAkJCSAgIHdoaWxlIHRoZSBmZW5jZS1wZWVyIGhhbmRsZXIgd2FzIHJ1bm5pbmcsIGlnbm9yZSBpdCAqLwotCQkJY29ubl9pbmZvKHRjb25uLCAiSWdub3JpbmcgZmVuY2UtcGVlciBleGl0IGNvZGVcbiIpOworCQkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJJZ25vcmluZyBmZW5jZS1wZWVyIGV4aXQgY29kZVxuIik7CiAJCWVsc2UKLQkJCV9jb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CisJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlyZXR1cm4gY29ubl9oaWdoZXN0X3Bkc2sodGNvbm4pIDw9IERfT1VUREFURUQ7CisJcmV0dXJuIGNvbm5faGlnaGVzdF9wZHNrKGNvbm5lY3Rpb24pIDw9IERfT1VUREFURUQ7CiB9CiAKIHN0YXRpYyBpbnQgX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmModm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSAoc3RydWN0IGRyYmRfdGNvbm4gKilkYXRhOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSAoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqKWRhdGE7CiAKLQljb25uX3RyeV9vdXRkYXRlX3BlZXIodGNvbm4pOworCWNvbm5fdHJ5X291dGRhdGVfcGVlcihjb25uZWN0aW9uKTsKIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjb25uX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBjb25uX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9wYTsKIAotCWtyZWZfZ2V0KCZ0Y29ubi0+a3JlZik7Ci0Jb3BhID0ga3RocmVhZF9ydW4oX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMsIHRjb25uLCAiZHJiZF9hc3luY19oIik7CisJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCW9wYSA9IGt0aHJlYWRfcnVuKF90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jLCBjb25uZWN0aW9uLCAiZHJiZF9hc3luY19oIik7CiAJaWYgKElTX0VSUihvcGEpKSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAib3V0IG9mIG1lbSwgZmFpbGVkIHRvIGludm9rZSBmZW5jZS1wZWVyIGhlbHBlclxuIik7Ci0JCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJvdXQgb2YgbWVtLCBmYWlsZWQgdG8gaW52b2tlIGZlbmNlLXBlZXIgaGVscGVyXG4iKTsKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKIAl9CiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotZHJiZF9zZXRfcm9sZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcm9sZSBuZXdfcm9sZSwgaW50IGZvcmNlKQorZHJiZF9zZXRfcm9sZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX3JvbGUgbmV3X3JvbGUsIGludCBmb3JjZSkKIHsKIAljb25zdCBpbnQgbWF4X3RyaWVzID0gNDsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnYgPSBTU19VTktOT1dOX0VSUk9SOwpAQCAtNTQyLDE2ICs1NTYsMjQgQEAKIAlpbnQgZm9yY2VkID0gMDsKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHZhbDsKIAotCWlmIChuZXdfcm9sZSA9PSBSX1BSSU1BUlkpCi0JCXJlcXVlc3RfcGluZyhtZGV2LT50Y29ubik7IC8qIERldGVjdCBhIGRlYWQgcGVlciBBU0FQICovCisJaWYgKG5ld19yb2xlID09IFJfUFJJTUFSWSkgeworCQlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCi0JbXV0ZXhfbG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCS8qIERldGVjdCBkZWFkIHBlZXJzIGFzIHNvb24gYXMgcG9zc2libGUuICAqLworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCBkZXZpY2UtPnJlc291cmNlKQorCQkJcmVxdWVzdF9waW5nKGNvbm5lY3Rpb24pOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCiAJbWFzay5pID0gMDsgbWFzay5yb2xlID0gUl9NQVNLOwogCXZhbC5pICA9IDA7IHZhbC5yb2xlICA9IG5ld19yb2xlOwogCiAJd2hpbGUgKHRyeSsrIDwgbWF4X3RyaWVzKSB7Ci0JCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBtYXNrLCB2YWwsIENTX1dBSVRfQ09NUExFVEUpOworCQlydiA9IF9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIENTX1dBSVRfQ09NUExFVEUpOwogCiAJCS8qIGluIGNhc2Ugd2UgZmlyc3Qgc3VjY2VlZGVkIHRvIG91dGRhdGUsCiAJCSAqIGJ1dCBub3cgc3VkZGVubHkgY291bGQgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiAqLwpAQCAtNTYyLDggKzU4NCw4IEBACiAJCX0KIAogCQlpZiAocnYgPT0gU1NfTk9fVVBfVE9fREFURV9ESVNLICYmIGZvcmNlICYmCi0JCSAgICAobWRldi0+c3RhdGUuZGlzayA8IERfVVBfVE9fREFURSAmJgotCQkgICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQpKSB7CisJCSAgICAoZGV2aWNlLT5zdGF0ZS5kaXNrIDwgRF9VUF9UT19EQVRFICYmCisJCSAgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfSU5DT05TSVNURU5UKSkgewogCQkJbWFzay5kaXNrID0gRF9NQVNLOwogCQkJdmFsLmRpc2sgID0gRF9VUF9UT19EQVRFOwogCQkJZm9yY2VkID0gMTsKQEAgLTU3MSwxMCArNTkzLDEwIEBACiAJCX0KIAogCQlpZiAocnYgPT0gU1NfTk9fVVBfVE9fREFURV9ESVNLICYmCi0JCSAgICBtZGV2LT5zdGF0ZS5kaXNrID09IERfQ09OU0lTVEVOVCAmJiBtYXNrLnBkc2sgPT0gMCkgewotCQkJRF9BU1NFUlQobWRldi0+c3RhdGUucGRzayA9PSBEX1VOS05PV04pOworCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfQ09OU0lTVEVOVCAmJiBtYXNrLnBkc2sgPT0gMCkgeworCQkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLnBkc2sgPT0gRF9VTktOT1dOKTsKIAotCQkJaWYgKGNvbm5fdHJ5X291dGRhdGVfcGVlcihtZGV2LT50Y29ubikpIHsKKwkJCWlmIChjb25uX3RyeV9vdXRkYXRlX3BlZXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbikpIHsKIAkJCQl2YWwuZGlzayA9IERfVVBfVE9fREFURTsKIAkJCQltYXNrLmRpc2sgPSBEX01BU0s7CiAJCQl9CkBAIC01ODQsOCArNjA2LDggQEAKIAkJaWYgKHJ2ID09IFNTX05PVEhJTkdfVE9fRE8pCiAJCQlnb3RvIG91dDsKIAkJaWYgKHJ2ID09IFNTX1BSSU1BUllfTk9QICYmIG1hc2sucGRzayA9PSAwKSB7Ci0JCQlpZiAoIWNvbm5fdHJ5X291dGRhdGVfcGVlcihtZGV2LT50Y29ubikgJiYgZm9yY2UpIHsKLQkJCQlkZXZfd2FybihERVYsICJGb3JjZWQgaW50byBzcGxpdCBicmFpbiBzaXR1YXRpb24hXG4iKTsKKwkJCWlmICghY29ubl90cnlfb3V0ZGF0ZV9wZWVyKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pICYmIGZvcmNlKSB7CisJCQkJZHJiZF93YXJuKGRldmljZSwgIkZvcmNlZCBpbnRvIHNwbGl0IGJyYWluIHNpdHVhdGlvbiFcbiIpOwogCQkJCW1hc2sucGRzayA9IERfTUFTSzsKIAkJCQl2YWwucGRzayAgPSBEX09VVERBVEVEOwogCkBAIC01OTcsNyArNjE5LDcgQEAKIAkJCSAgIHJldHJ5IGF0IG1vc3Qgb25jZSBtb3JlIGluIHRoaXMgY2FzZS4gKi8KIAkJCWludCB0aW1lbzsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl0aW1lbyA9IG5jID8gKG5jLT5waW5nX3RpbWVvICsgMSkgKiBIWiAvIDEwIDogMTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvKTsKQEAgLTYwNiw3ICs2MjgsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQkJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIG1hc2ssIHZhbCwKKwkJCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIG1hc2ssIHZhbCwKIAkJCQkJCUNTX1ZFUkJPU0UgKyBDU19XQUlUX0NPTVBMRVRFKTsKIAkJCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCQkJZ290byBvdXQ7CkBAIC02MTgsNTMgKzY0MCw1MyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChmb3JjZWQpCi0JCWRldl93YXJuKERFViwgIkZvcmNlZCB0byBjb25zaWRlciBsb2NhbCBkYXRhIGFzIFVwVG9EYXRlIVxuIik7CisJCWRyYmRfd2FybihkZXZpY2UsICJGb3JjZWQgdG8gY29uc2lkZXIgbG9jYWwgZGF0YSBhcyBVcFRvRGF0ZSFcbiIpOwogCiAJLyogV2FpdCB1bnRpbCBub3RoaW5nIGlzIG9uIHRoZSBmbHkgOikgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwgYXRvbWljX3JlYWQoJm1kZXYtPmFwX3BlbmRpbmdfY250KSA9PSAwKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgPT0gMCk7CiAKIAkvKiBGSVhNRSBhbHNvIHdhaXQgZm9yIGFsbCBwZW5kaW5nIFBfQkFSUklFUl9BQ0s/ICovCiAKIAlpZiAobmV3X3JvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJc2V0X2Rpc2tfcm8obWRldi0+dmRpc2ssIHRydWUpOwotCQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJj0gfih1NjQpMTsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQlzZXRfZGlza19ybyhkZXZpY2UtPnZkaXNrLCB0cnVlKTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmPSB+KHU2NCkxOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JCW5jID0gbWRldi0+dGNvbm4tPm5ldF9jb25mOworCQltdXRleF9sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCW5jID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmY7CiAJCWlmIChuYykKIAkJCW5jLT5kaXNjYXJkX215X2RhdGEgPSAwOyAvKiB3aXRob3V0IGNvcHk7IHNpbmdsZSBiaXQgb3AgaXMgYXRvbWljICovCi0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAKLQkJc2V0X2Rpc2tfcm8obWRldi0+dmRpc2ssIGZhbHNlKTsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCQlpZiAoKChtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQgfHwKLQkJCSAgICAgICBtZGV2LT5zdGF0ZS5wZHNrIDw9IERfRkFJTEVEKQotCQkJICAgICAgJiYgbWRldi0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID09IDApIHx8IGZvcmNlZCkKLQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQobWRldik7CisJCXNldF9kaXNrX3JvKGRldmljZS0+dmRpc2ssIGZhbHNlKTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWlmICgoKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8CisJCQkgICAgICAgZGV2aWNlLT5zdGF0ZS5wZHNrIDw9IERfRkFJTEVEKQorCQkJICAgICAgJiYgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCkgfHwgZm9yY2VkKQorCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOwogCi0JCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdIHw9ICAodTY0KTE7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSB8PSAgKHU2NCkxOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAogCS8qIHdyaXRlb3V0IG9mIGFjdGl2aXR5IGxvZyBjb3ZlcmVkIGFyZWFzIG9mIHRoZSBiaXRtYXAKIAkgKiB0byBzdGFibGUgc3RvcmFnZSBkb25lIGluIGFmdGVyIHN0YXRlIGNoYW5nZSBhbHJlYWR5ICovCiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfV0ZfUkVQT1JUX1BBUkFNUykgewogCQkvKiBpZiB0aGlzIHdhcyBmb3JjZWQsIHdlIHNob3VsZCBjb25zaWRlciBzeW5jICovCiAJCWlmIChmb3JjZWQpCi0JCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKG1kZXYpOworCQkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRldi0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CisJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KGRldmljZS0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAJcmV0dXJuIHJ2OwogfQogCkBAIC02OTksOSArNzIxLDkgQEAKIAl9CiAKIAlpZiAoaW5mby0+Z2VubGhkci0+Y21kID09IERSQkRfQURNX1BSSU1BUlkpCi0JCXJldGNvZGUgPSBkcmJkX3NldF9yb2xlKGFkbV9jdHgubWRldiwgUl9QUklNQVJZLCBwYXJtcy5hc3N1bWVfdXB0b2RhdGUpOworCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShhZG1fY3R4LmRldmljZSwgUl9QUklNQVJZLCBwYXJtcy5hc3N1bWVfdXB0b2RhdGUpOwogCWVsc2UKLQkJcmV0Y29kZSA9IGRyYmRfc2V0X3JvbGUoYWRtX2N0eC5tZGV2LCBSX1NFQ09OREFSWSwgMCk7CisJCXJldGNvZGUgPSBkcmJkX3NldF9yb2xlKGFkbV9jdHguZGV2aWNlLCBSX1NFQ09OREFSWSwgMCk7CiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwogCXJldHVybiAwOwpAQCAtNzI4LDcgKzc1MCw3IEBACiAgKiAgQWN0aXZpdHkgbG9nIHNpemUgdXNlZCB0byBiZSBmaXhlZCAzMmtCLAogICogIGJ1dCBpcyBhYm91dCB0byBiZWNvbWUgY29uZmlndXJhYmxlLgogICovCi1zdGF0aWMgdm9pZCBkcmJkX21kX3NldF9zZWN0b3Jfb2Zmc2V0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgICAgIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2KQogewogCXNlY3Rvcl90IG1kX3NpemVfc2VjdCA9IDA7CkBAIC04MDQsMzUgKzgyNiwzNSBAQAogICogZHJiZF9hZG1fc3VzcGVuZF9pby9kcmJkX2FkbV9yZXN1bWVfaW8sCiAgKiB3aGljaCBhcmUgKHN1Yikgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgYWRtaW4gKGRyYmRzZXR1cCksCiAgKiBhbmQgY2FuIGJlIGxvbmcgbGl2ZWQuCi0gKiBUaGlzIGNoYW5nZXMgYW4gbWRldi0+ZmxhZywgaXMgdHJpZ2dlcmVkIGJ5IGRyYmQgaW50ZXJuYWxzLAorICogVGhpcyBjaGFuZ2VzIGFuIGRldmljZS0+ZmxhZywgaXMgdHJpZ2dlcmVkIGJ5IGRyYmQgaW50ZXJuYWxzLAogICogYW5kIHNob3VsZCBiZSBzaG9ydC1saXZlZC4gKi8KLXZvaWQgZHJiZF9zdXNwZW5kX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfc3VzcGVuZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzZXRfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7Ci0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKQorCXNldF9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOworCWlmIChkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQogCQlyZXR1cm47Ci0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+YXBfYmlvX2NudCkpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9iaW9fY250KSk7CiB9CiAKLXZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JY2xlYXJfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwljbGVhcl9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAogLyoqCiAgKiBkcmJkX2RldGVybWluZV9kZXZfc2l6ZSgpIC0gIFNldHMgdGhlIHJpZ2h0IGRldmljZSBzaXplIG9iZXlpbmcgYWxsIGNvbnN0cmFpbnRzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgcmV0dXJuIHZhbHVlcyBpbmRpY2F0ZSBlcnJvcnMuCiAgKiBZb3Ugc2hvdWxkIGNhbGwgZHJiZF9tZF9zeW5jKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiBlbnVtIGRldGVybWluZV9kZXZfc2l6ZQotZHJiZF9kZXRlcm1pbmVfZGV2X3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKnJzKSBfX211c3RfaG9sZChsb2NhbCkKK2RyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRkc19mbGFncyBmbGFncywgc3RydWN0IHJlc2l6ZV9wYXJtcyAqcnMpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXNlY3Rvcl90IHByZXZfZmlyc3Rfc2VjdCwgcHJldl9zaXplOyAvKiBwcmV2aW91cyBtZXRhIGxvY2F0aW9uICovCiAJc2VjdG9yX3QgbGFfc2l6ZV9zZWN0LCB1X3NpemU7Ci0Jc3RydWN0IGRyYmRfbWQgKm1kID0gJm1kZXYtPmxkZXYtPm1kOworCXN0cnVjdCBkcmJkX21kICptZCA9ICZkZXZpY2UtPmxkZXYtPm1kOwogCXUzMiBwcmV2X2FsX3N0cmlwZV9zaXplXzRrOwogCXUzMiBwcmV2X2FsX3N0cmlwZXM7CiAJc2VjdG9yX3Qgc2l6ZTsKQEAgLTg1MSwxOSArODczLDE5IEBACiAJICogU3VzcGVuZCBJTyByaWdodCBoZXJlLgogCSAqIHN0aWxsIGxvY2sgdGhlIGFjdF9sb2cgdG8gbm90IHRyaWdnZXIgQVNTRVJUcyB0aGVyZS4KIAkgKi8KLQlkcmJkX3N1c3BlbmRfaW8obWRldik7Ci0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBMb2NrIG1ldGEtZGF0YSBJTyAqLworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCWJ1ZmZlciA9IGRyYmRfbWRfZ2V0X2J1ZmZlcihkZXZpY2UpOyAvKiBMb2NrIG1ldGEtZGF0YSBJTyAqLwogCWlmICghYnVmZmVyKSB7Ci0JCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCQlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCQlyZXR1cm4gRFNfRVJST1I7CiAJfQogCiAJLyogbm8gd2FpdCBuZWNlc3NhcnkgYW55bW9yZSwgYWN0dWFsbHkgd2UgY291bGQgYXNzZXJ0IHRoYXQgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsIGxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+YWxfd2FpdCwgbGNfdHJ5X2xvY2soZGV2aWNlLT5hY3RfbG9nKSk7CiAKLQlwcmV2X2ZpcnN0X3NlY3QgPSBkcmJkX21kX2ZpcnN0X3NlY3RvcihtZGV2LT5sZGV2KTsKLQlwcmV2X3NpemUgPSBtZGV2LT5sZGV2LT5tZC5tZF9zaXplX3NlY3Q7Ci0JbGFfc2l6ZV9zZWN0ID0gbWRldi0+bGRldi0+bWQubGFfc2l6ZV9zZWN0OworCXByZXZfZmlyc3Rfc2VjdCA9IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGRldmljZS0+bGRldik7CisJcHJldl9zaXplID0gZGV2aWNlLT5sZGV2LT5tZC5tZF9zaXplX3NlY3Q7CisJbGFfc2l6ZV9zZWN0ID0gZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3Q7CiAKIAlpZiAocnMpIHsKIAkJLyogcnMgaXMgbm9uIE5VTEwgaWYgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgQUwgbGF5b3V0IG9ubHkgKi8KQEAgLTg3NiwxOCArODk4LDE4IEBACiAJCW1kLT5hbF9zaXplXzRrID0gKHU2NClycy0+YWxfc3RyaXBlcyAqIHJzLT5hbF9zdHJpcGVfc2l6ZSAvIDQ7CiAJfQogCi0JZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMobWRldiwgbWRldi0+bGRldik7CisJZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoZGV2aWNlLCBkZXZpY2UtPmxkZXYpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXVfc2l6ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CisJdV9zaXplID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXNpemUgPSBkcmJkX25ld19kZXZfc2l6ZShtZGV2LCBtZGV2LT5sZGV2LCB1X3NpemUsIGZsYWdzICYgRERTRl9GT1JDRUQpOworCXNpemUgPSBkcmJkX25ld19kZXZfc2l6ZShkZXZpY2UsIGRldmljZS0+bGRldiwgdV9zaXplLCBmbGFncyAmIEREU0ZfRk9SQ0VEKTsKIAogCWlmIChzaXplIDwgbGFfc2l6ZV9zZWN0KSB7CiAJCWlmIChycyAmJiB1X3NpemUgPT0gMCkgewogCQkJLyogUmVtb3ZlICJycyAmJiIgbGF0ZXIuIFRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBhY3RpdmUsIGJ1dAogCQkJICAgcmlnaHQgbm93IHRoZSByZWNlaXZlciBleHBlY3RzIHRoZSBwZXJtaXNzaXZlIGJlaGF2aW9yICovCi0JCQlkZXZfd2FybihERVYsICJJbXBsaWNpdCBzaHJpbmsgbm90IGFsbG93ZWQuICIKKwkJCWRyYmRfd2FybihkZXZpY2UsICJJbXBsaWNpdCBzaHJpbmsgbm90IGFsbG93ZWQuICIKIAkJCQkgIlVzZSAtLXNpemU9JWxsdXMgZm9yIGV4cGxpY2l0IHNocmluay5cbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpc2l6ZSk7CiAJCQlydiA9IERTX0VSUk9SX1NIUklOSzsKQEAgLTg5OCw2MCArOTIwLDYwIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaWYgKGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgIT0gc2l6ZSB8fAotCSAgICBkcmJkX2JtX2NhcGFjaXR5KG1kZXYpICE9IHNpemUpIHsKKwlpZiAoZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpICE9IHNpemUgfHwKKwkgICAgZHJiZF9ibV9jYXBhY2l0eShkZXZpY2UpICE9IHNpemUpIHsKIAkJaW50IGVycjsKLQkJZXJyID0gZHJiZF9ibV9yZXNpemUobWRldiwgc2l6ZSwgIShmbGFncyAmIEREU0ZfTk9fUkVTWU5DKSk7CisJCWVyciA9IGRyYmRfYm1fcmVzaXplKGRldmljZSwgc2l6ZSwgIShmbGFncyAmIEREU0ZfTk9fUkVTWU5DKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkvKiBjdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgZXJyb3I6IEVOT01FTSEgKi8KLQkJCXNpemUgPSBkcmJkX2JtX2NhcGFjaXR5KG1kZXYpPj4xOworCQkJc2l6ZSA9IGRyYmRfYm1fY2FwYWNpdHkoZGV2aWNlKT4+MTsKIAkJCWlmIChzaXplID09IDApIHsKLQkJCQlkZXZfZXJyKERFViwgIk9VVCBPRiBNRU1PUlkhICIKKwkJCQlkcmJkX2VycihkZXZpY2UsICJPVVQgT0YgTUVNT1JZISAiCiAJCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgYml0bWFwIVxuIik7CiAJCQl9IGVsc2UgewotCQkJCWRldl9lcnIoREVWLCAiQk0gcmVzaXppbmcgZmFpbGVkLiAiCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiQk0gcmVzaXppbmcgZmFpbGVkLiAiCiAJCQkJICAgICJMZWF2aW5nIHNpemUgdW5jaGFuZ2VkIGF0IHNpemUgPSAlbHUgS0JcbiIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemUpOwogCQkJfQogCQkJcnYgPSBEU19FUlJPUjsKIAkJfQogCQkvKiByYWN5LCBzZWUgY29tbWVudHMgYWJvdmUuICovCi0JCWRyYmRfc2V0X215X2NhcGFjaXR5KG1kZXYsIHNpemUpOwotCQltZGV2LT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBzaXplOwotCQlkZXZfaW5mbyhERVYsICJzaXplID0gJXMgKCVsbHUgS0IpXG4iLCBwcHNpemUocHBiLCBzaXplPj4xKSwKKwkJZHJiZF9zZXRfbXlfY2FwYWNpdHkoZGV2aWNlLCBzaXplKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBzaXplOworCQlkcmJkX2luZm8oZGV2aWNlLCAic2l6ZSA9ICVzICglbGx1IEtCKVxuIiwgcHBzaXplKHBwYiwgc2l6ZT4+MSksCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplPj4xKTsKIAl9CiAJaWYgKHJ2IDw9IERTX0VSUk9SKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlsYV9zaXplX2NoYW5nZWQgPSAobGFfc2l6ZV9zZWN0ICE9IG1kZXYtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCk7CisJbGFfc2l6ZV9jaGFuZ2VkID0gKGxhX3NpemVfc2VjdCAhPSBkZXZpY2UtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCk7CiAKLQltZF9tb3ZlZCA9IHByZXZfZmlyc3Rfc2VjdCAhPSBkcmJkX21kX2ZpcnN0X3NlY3RvcihtZGV2LT5sZGV2KQotCQl8fCBwcmV2X3NpemUJICAgIT0gbWRldi0+bGRldi0+bWQubWRfc2l6ZV9zZWN0OworCW1kX21vdmVkID0gcHJldl9maXJzdF9zZWN0ICE9IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGRldmljZS0+bGRldikKKwkJfHwgcHJldl9zaXplCSAgICE9IGRldmljZS0+bGRldi0+bWQubWRfc2l6ZV9zZWN0OwogCiAJaWYgKGxhX3NpemVfY2hhbmdlZCB8fCBtZF9tb3ZlZCB8fCBycykgewogCQl1MzIgcHJldl9mbGFnczsKIAotCQlkcmJkX2FsX3NocmluayhtZGV2KTsgLyogQWxsIGV4dGVudHMgaW5hY3RpdmUuICovCisJCWRyYmRfYWxfc2hyaW5rKGRldmljZSk7IC8qIEFsbCBleHRlbnRzIGluYWN0aXZlLiAqLwogCiAJCXByZXZfZmxhZ3MgPSBtZC0+ZmxhZ3M7CiAJCW1kLT5mbGFncyAmPSB+TURGX1BSSU1BUllfSU5EOwotCQlkcmJkX21kX3dyaXRlKG1kZXYsIGJ1ZmZlcik7CisJCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCi0JCWRldl9pbmZvKERFViwgIldyaXRpbmcgdGhlIHdob2xlIGJpdG1hcCwgJXNcbiIsCisJCWRyYmRfaW5mbyhkZXZpY2UsICJXcml0aW5nIHRoZSB3aG9sZSBiaXRtYXAsICVzXG4iLAogCQkJIGxhX3NpemVfY2hhbmdlZCAmJiBtZF9tb3ZlZCA/ICJzaXplIGNoYW5nZWQgYW5kIG1kIG1vdmVkIiA6CiAJCQkgbGFfc2l6ZV9jaGFuZ2VkID8gInNpemUgY2hhbmdlZCIgOiAibWQgbW92ZWQiKTsKIAkJLyogbmV4dCBsaW5lIGltcGxpY2l0bHkgZG9lcyBkcmJkX3N1c3BlbmRfaW8oKStkcmJkX3Jlc3VtZV9pbygpICovCi0JCWRyYmRfYml0bWFwX2lvKG1kZXYsIG1kX21vdmVkID8gJmRyYmRfYm1fd3JpdGVfYWxsIDogJmRyYmRfYm1fd3JpdGUsCisJCWRyYmRfYml0bWFwX2lvKGRldmljZSwgbWRfbW92ZWQgPyAmZHJiZF9ibV93cml0ZV9hbGwgOiAmZHJiZF9ibV93cml0ZSwKIAkJCSAgICAgICAic2l6ZSBjaGFuZ2VkIiwgQk1fTE9DS0VEX01BU0spOwotCQlkcmJkX2luaXRpYWxpemVfYWwobWRldiwgYnVmZmVyKTsKKwkJZHJiZF9pbml0aWFsaXplX2FsKGRldmljZSwgYnVmZmVyKTsKIAogCQltZC0+ZmxhZ3MgPSBwcmV2X2ZsYWdzOwotCQlkcmJkX21kX3dyaXRlKG1kZXYsIGJ1ZmZlcik7CisJCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCiAJCWlmIChycykKLQkJCWRldl9pbmZvKERFViwgIkNoYW5nZWQgQUwgbGF5b3V0IHRvIGFsLXN0cmlwZXMgPSAlZCwgYWwtc3RyaXBlLXNpemUta0IgPSAlZFxuIiwKLQkJCQkgbWQtPmFsX3N0cmlwZXMsIG1kLT5hbF9zdHJpcGVfc2l6ZV80ayAqIDQpOworCQkJZHJiZF9pbmZvKGRldmljZSwgIkNoYW5nZWQgQUwgbGF5b3V0IHRvIGFsLXN0cmlwZXMgPSAlZCwgYWwtc3RyaXBlLXNpemUta0IgPSAlZFxuIiwKKwkJCQkgIG1kLT5hbF9zdHJpcGVzLCBtZC0+YWxfc3RyaXBlX3NpemVfNGsgKiA0KTsKIAl9CiAKIAlpZiAoc2l6ZSA+IGxhX3NpemVfc2VjdCkKQEAgLTk2NiwzMCArOTg4LDMwIEBACiAJCQltZC0+YWxfc3RyaXBlX3NpemVfNGsgPSBwcmV2X2FsX3N0cmlwZV9zaXplXzRrOwogCQkJbWQtPmFsX3NpemVfNGsgPSAodTY0KXByZXZfYWxfc3RyaXBlcyAqIHByZXZfYWxfc3RyaXBlX3NpemVfNGs7CiAKLQkJCWRyYmRfbWRfc2V0X3NlY3Rvcl9vZmZzZXRzKG1kZXYsIG1kZXYtPmxkZXYpOworCQkJZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoZGV2aWNlLCBkZXZpY2UtPmxkZXYpOwogCQl9CiAJfQotCWxjX3VubG9jayhtZGV2LT5hY3RfbG9nKTsKLQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKLQlkcmJkX21kX3B1dF9idWZmZXIobWRldik7Ci0JZHJiZF9yZXN1bWVfaW8obWRldik7CisJbGNfdW5sb2NrKGRldmljZS0+YWN0X2xvZyk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiBzZWN0b3JfdAotZHJiZF9uZXdfZGV2X3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCitkcmJkX25ld19kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCSAgc2VjdG9yX3QgdV9zaXplLCBpbnQgYXNzdW1lX3BlZXJfaGFzX3NwYWNlKQogewotCXNlY3Rvcl90IHBfc2l6ZSA9IG1kZXYtPnBfc2l6ZTsgICAvKiBwYXJ0bmVyJ3MgZGlzayBzaXplLiAqLworCXNlY3Rvcl90IHBfc2l6ZSA9IGRldmljZS0+cF9zaXplOyAgIC8qIHBhcnRuZXIncyBkaXNrIHNpemUuICovCiAJc2VjdG9yX3QgbGFfc2l6ZV9zZWN0ID0gYmRldi0+bWQubGFfc2l6ZV9zZWN0OyAvKiBsYXN0IGFncmVlZCBzaXplLiAqLwogCXNlY3Rvcl90IG1fc2l6ZTsgLyogbXkgc2l6ZSAqLwogCXNlY3Rvcl90IHNpemUgPSAwOwogCiAJbV9zaXplID0gZHJiZF9nZXRfbWF4X2NhcGFjaXR5KGJkZXYpOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBhc3N1bWVfcGVlcl9oYXNfc3BhY2UpIHsKLQkJZGV2X3dhcm4oREVWLCAiUmVzaXplIHdoaWxlIG5vdCBjb25uZWN0ZWQgd2FzIGZvcmNlZCBieSB0aGUgdXNlciFcbiIpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBhc3N1bWVfcGVlcl9oYXNfc3BhY2UpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIlJlc2l6ZSB3aGlsZSBub3QgY29ubmVjdGVkIHdhcyBmb3JjZWQgYnkgdGhlIHVzZXIhXG4iKTsKIAkJcF9zaXplID0gbV9zaXplOwogCX0KIApAQCAtMTAxMSwxMSArMTAzMywxMSBAQAogCX0KIAogCWlmIChzaXplID09IDApCi0JCWRldl9lcnIoREVWLCAiQm90aCBub2RlcyBkaXNrbGVzcyFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJCb3RoIG5vZGVzIGRpc2tsZXNzIVxuIik7CiAKIAlpZiAodV9zaXplKSB7CiAJCWlmICh1X3NpemUgPiBzaXplKQotCQkJZGV2X2VycihERVYsICJSZXF1ZXN0ZWQgZGlzayBzaXplIGlzIHRvbyBiaWcgKCVsdSA+ICVsdSlcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJSZXF1ZXN0ZWQgZGlzayBzaXplIGlzIHRvbyBiaWcgKCVsdSA+ICVsdSlcbiIsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpdV9zaXplPj4xLCAodW5zaWduZWQgbG9uZylzaXplPj4xKTsKIAkJZWxzZQogCQkJc2l6ZSA9IHVfc2l6ZTsKQEAgLTEwMjYsNzEgKzEwNDgsNzEgQEAKIAogLyoqCiAgKiBkcmJkX2NoZWNrX2FsX3NpemUoKSAtIEVuc3VyZXMgdGhhdCB0aGUgQUwgaXMgb2YgdGhlIHJpZ2h0IHNpemUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFJldHVybnMgLUVCVVNZIGlmIGN1cnJlbnQgYWwgbHJ1IGlzIHN0aWxsIHVzZWQsIC1FTk9NRU0gd2hlbiBhbGxvY2F0aW9uCiAgKiBmYWlsZWQsIGFuZCAwIG9uIHN1Y2Nlc3MuIFlvdSBzaG91bGQgY2FsbCBkcmJkX21kX3N5bmMoKSBhZnRlciB5b3UgY2FsbGVkCiAgKiB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGRyYmRfY2hlY2tfYWxfc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZGlza19jb25mICpkYykKK3N0YXRpYyBpbnQgZHJiZF9jaGVja19hbF9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGlza19jb25mICpkYykKIHsKIAlzdHJ1Y3QgbHJ1X2NhY2hlICpuLCAqdDsKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqZTsKIAl1bnNpZ25lZCBpbnQgaW5fdXNlOwogCWludCBpOwogCi0JaWYgKG1kZXYtPmFjdF9sb2cgJiYKLQkgICAgbWRldi0+YWN0X2xvZy0+bnJfZWxlbWVudHMgPT0gZGMtPmFsX2V4dGVudHMpCisJaWYgKGRldmljZS0+YWN0X2xvZyAmJgorCSAgICBkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzID09IGRjLT5hbF9leHRlbnRzKQogCQlyZXR1cm4gMDsKIAogCWluX3VzZSA9IDA7Ci0JdCA9IG1kZXYtPmFjdF9sb2c7CisJdCA9IGRldmljZS0+YWN0X2xvZzsKIAluID0gbGNfY3JlYXRlKCJhY3RfbG9nIiwgZHJiZF9hbF9leHRfY2FjaGUsIEFMX1VQREFURVNfUEVSX1RSQU5TQUNUSU9OLAogCQlkYy0+YWxfZXh0ZW50cywgc2l6ZW9mKHN0cnVjdCBsY19lbGVtZW50KSwgMCk7CiAKIAlpZiAobiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2Fubm90IGFsbG9jYXRlIGFjdF9sb2cgbHJ1IVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNhbm5vdCBhbGxvY2F0ZSBhY3RfbG9nIGxydSFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAodCkgewogCQlmb3IgKGkgPSAwOyBpIDwgdC0+bnJfZWxlbWVudHM7IGkrKykgewogCQkJZSA9IGxjX2VsZW1lbnRfYnlfaW5kZXgodCwgaSk7CiAJCQlpZiAoZS0+cmVmY250KQotCQkJCWRldl9lcnIoREVWLCAicmVmY250KCVkKT09JWRcbiIsCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAicmVmY250KCVkKT09JWRcbiIsCiAJCQkJICAgIGUtPmxjX251bWJlciwgZS0+cmVmY250KTsKIAkJCWluX3VzZSArPSBlLT5yZWZjbnQ7CiAJCX0KIAl9CiAJaWYgKCFpbl91c2UpCi0JCW1kZXYtPmFjdF9sb2cgPSBuOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCWRldmljZS0+YWN0X2xvZyA9IG47CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCWlmIChpbl91c2UpIHsKLQkJZGV2X2VycihERVYsICJBY3Rpdml0eSBsb2cgc3RpbGwgaW4gdXNlIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkFjdGl2aXR5IGxvZyBzdGlsbCBpbiB1c2UhXG4iKTsKIAkJbGNfZGVzdHJveShuKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewogCQlpZiAodCkKIAkJCWxjX2Rlc3Ryb3kodCk7CiAJfQotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsgLyogd2UgY2hhbmdlZCBtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW5zICovCisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7IC8qIHdlIGNoYW5nZWQgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW5zICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfc2V0dXBfcXVldWVfcGFyYW0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IG1heF9iaW9fc2l6ZSkKK3N0YXRpYyB2b2lkIGRyYmRfc2V0dXBfcXVldWVfcGFyYW0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBtYXhfYmlvX3NpemUpCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBxID0gbWRldi0+cnFfcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBxID0gZGV2aWNlLT5ycV9xdWV1ZTsKIAl1bnNpZ25lZCBpbnQgbWF4X2h3X3NlY3RvcnMgPSBtYXhfYmlvX3NpemUgPj4gOTsKIAl1bnNpZ25lZCBpbnQgbWF4X3NlZ21lbnRzID0gMDsKIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKLQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBiID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBiID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYtPmJkX2Rpc2stPnF1ZXVlOwogCiAJCW1heF9od19zZWN0b3JzID0gbWluKHF1ZXVlX21heF9od19zZWN0b3JzKGIpLCBtYXhfYmlvX3NpemUgPj4gOSk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbWF4X3NlZ21lbnRzID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPm1heF9iaW9fYnZlY3M7CisJCW1heF9zZWdtZW50cyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPm1heF9iaW9fYnZlY3M7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEsIDUxMik7CkBAIC0xMDk5LDQ2ICsxMTIxLDQ2IEBACiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhxLCBtYXhfc2VnbWVudHMgPyBtYXhfc2VnbWVudHMgOiBCTEtfTUFYX1NFR01FTlRTKTsKIAlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShxLCBQQUdFX0NBQ0hFX1NJWkUtMSk7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKSB7Ci0JCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICogY29uc3QgYiA9IG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWU7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9BVFRBQ0hJTkcpKSB7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICogY29uc3QgYiA9IGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIAogCQlibGtfcXVldWVfc3RhY2tfbGltaXRzKHEsIGIpOwogCiAJCWlmIChxLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzICE9IGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMpIHsKLQkJCWRldl9pbmZvKERFViwgIkFkanVzdGluZyBteSByYV9wYWdlcyB0byBiYWNraW5nIGRldmljZSdzICglbHUgLT4gJWx1KVxuIiwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJBZGp1c3RpbmcgbXkgcmFfcGFnZXMgdG8gYmFja2luZyBkZXZpY2UncyAoJWx1IC0+ICVsdSlcbiIsCiAJCQkJIHEtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMsCiAJCQkJIGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMpOwogCQkJcS0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXM7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogfQogCi12b2lkIGRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZWNvbnNpZGVyX21heF9iaW9fc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl1bnNpZ25lZCBpbnQgbm93LCBuZXcsIGxvY2FsLCBwZWVyOwogCi0Jbm93ID0gcXVldWVfbWF4X2h3X3NlY3RvcnMobWRldi0+cnFfcXVldWUpIDw8IDk7Ci0JbG9jYWwgPSBtZGV2LT5sb2NhbF9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSB2b2xhdGlsZSBtZW1vcnkgKi8KLQlwZWVyID0gbWRldi0+cGVlcl9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSBtZXRhIGRhdGEgKi8KKwlub3cgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPnJxX3F1ZXVlKSA8PCA5OworCWxvY2FsID0gZGV2aWNlLT5sb2NhbF9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSB2b2xhdGlsZSBtZW1vcnkgKi8KKwlwZWVyID0gZGV2aWNlLT5wZWVyX21heF9iaW9fc2l6ZTsgLyogRXZlbnR1YWxseSBsYXN0IGtub3duIHZhbHVlLCBmcm9tIG1ldGEgZGF0YSAqLwogCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkgewotCQlsb2NhbCA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7Ci0JCW1kZXYtPmxvY2FsX21heF9iaW9fc2l6ZSA9IGxvY2FsOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJbG9jYWwgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CisJCWRldmljZS0+bG9jYWxfbWF4X2Jpb19zaXplID0gbG9jYWw7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCWxvY2FsID0gbWluKGxvY2FsLCBEUkJEX01BWF9CSU9fU0laRSk7CiAKIAkvKiBXZSBtYXkgaWdub3JlIHBlZXIgbGltaXRzIGlmIHRoZSBwZWVyIGlzIG1vZGVybiBlbm91Z2guCiAJICAgQmVjYXVzZSBuZXcgZnJvbSA4LjMuOCBvbndhcmRzIHRoZSBwZWVyIGNhbiB1c2UgbXVsdGlwbGUKIAkgICBCSU9zIGZvciBhIHNpbmdsZSBwZWVyX3JlcXVlc3QgKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKLQkJaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NCkKLQkJCXBlZXIgPSBtaW4obWRldi0+cGVlcl9tYXhfYmlvX3NpemUsIERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk0KQorCQkJcGVlciA9IG1pbihkZXZpY2UtPnBlZXJfbWF4X2Jpb19zaXplLCBEUkJEX01BWF9TSVpFX0g4MF9QQUNLRVQpOwogCQkJLyogQ29ycmVjdCBvbGQgZHJiZCAodXAgdG8gOC4zLjcpIGlmIGl0IGJlbGlldmVzIGl0IGNhbiBkbyBtb3JlIHRoYW4gMzJLaUIgKi8KLQkJZWxzZSBpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA9PSA5NCkKKwkJZWxzZSBpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID09IDk0KQogCQkJcGVlciA9IERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVDsKLQkJZWxzZSBpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCkKKwkJZWxzZSBpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKQogCQkJcGVlciA9IERSQkRfTUFYX0JJT19TSVpFX1A5NTsgIC8qIGRyYmQgOC4zLjggb253YXJkcywgYmVmb3JlIDguNC4wICovCiAJCWVsc2UKIAkJCXBlZXIgPSBEUkJEX01BWF9CSU9fU0laRTsKQEAgLTExNDYsNTcgKzExNjgsNTcgQEAKIAogCW5ldyA9IG1pbihsb2NhbCwgcGVlcik7CiAKLQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYgbmV3IDwgbm93KQotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQgbmV3IDwgbm93OyAoJXUgPCAldSlcbiIsIG5ldywgbm93KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSAmJiBuZXcgPCBub3cpCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQgbmV3IDwgbm93OyAoJXUgPCAldSlcbiIsIG5ldywgbm93KTsKIAogCWlmIChuZXcgIT0gbm93KQotCQlkZXZfaW5mbyhERVYsICJtYXggQklPIHNpemUgPSAldVxuIiwgbmV3KTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIm1heCBCSU8gc2l6ZSA9ICV1XG4iLCBuZXcpOwogCi0JZHJiZF9zZXR1cF9xdWV1ZV9wYXJhbShtZGV2LCBuZXcpOworCWRyYmRfc2V0dXBfcXVldWVfcGFyYW0oZGV2aWNlLCBuZXcpOwogfQogCiAvKiBTdGFydHMgdGhlIHdvcmtlciB0aHJlYWQgKi8KLXN0YXRpYyB2b2lkIGNvbm5fcmVjb25maWdfc3RhcnQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9yZWNvbmZpZ19zdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+d29ya2VyKTsKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZSh0Y29ubik7CisJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPndvcmtlcik7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIH0KIAogLyogaWYgc3RpbGwgdW5jb25maWd1cmVkLCBzdG9wcyB3b3JrZXIgYWdhaW4uICovCi1zdGF0aWMgdm9pZCBjb25uX3JlY29uZmlnX2RvbmUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9yZWNvbmZpZ19kb25lKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJYm9vbCBzdG9wX3RocmVhZHM7Ci0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlzdG9wX3RocmVhZHMgPSBjb25uX2FsbF92b2xzX3VuY29uZih0Y29ubikgJiYKLQkJdGNvbm4tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkU7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJc3RvcF90aHJlYWRzID0gY29ubl9hbGxfdm9sc191bmNvbmYoY29ubmVjdGlvbikgJiYKKwkJY29ubmVjdGlvbi0+Y3N0YXRlID09IENfU1RBTkRBTE9ORTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAJaWYgKHN0b3BfdGhyZWFkcykgewogCQkvKiBhc2VuZGVyIGlzIGltcGxpY2l0bHkgc3RvcHBlZCBieSByZWNlaXZlcgogCQkgKiBpbiBjb25uX2Rpc2Nvbm5lY3QoKSAqLwotCQlkcmJkX3RocmVhZF9zdG9wKCZ0Y29ubi0+cmVjZWl2ZXIpOwotCQlkcmJkX3RocmVhZF9zdG9wKCZ0Y29ubi0+d29ya2VyKTsKKwkJZHJiZF90aHJlYWRfc3RvcCgmY29ubmVjdGlvbi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT53b3JrZXIpOwogCX0KIH0KIAogLyogTWFrZSBzdXJlIElPIGlzIHN1c3BlbmRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKCkuICovCi1zdGF0aWMgdm9pZCBkcmJkX3N1c3BlbmRfYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfc3VzcGVuZF9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcyA9IDA7CiAKLQlpZiAoIWxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKSB7Ci0JCWRldl93YXJuKERFViwgIkZhaWxlZCB0byBsb2NrIGFsIGluIGRyYmRfc3VzcGVuZF9hbCgpXG4iKTsKKwlpZiAoIWxjX3RyeV9sb2NrKGRldmljZS0+YWN0X2xvZykpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIkZhaWxlZCB0byBsb2NrIGFsIGluIGRyYmRfc3VzcGVuZF9hbCgpXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWRyYmRfYWxfc2hyaW5rKG1kZXYpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKLQkJcyA9ICF0ZXN0X2FuZF9zZXRfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOworCWRyYmRfYWxfc2hyaW5rKGRldmljZSk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKKwkJcyA9ICF0ZXN0X2FuZF9zZXRfYml0KEFMX1NVU1BFTkRFRCwgJmRldmljZS0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWxjX3VubG9jayhkZXZpY2UtPmFjdF9sb2cpOwogCiAJaWYgKHMpCi0JCWRldl9pbmZvKERFViwgIlN1c3BlbmRlZCBBTCB1cGRhdGVzXG4iKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlN1c3BlbmRlZCBBTCB1cGRhdGVzXG4iKTsKIH0KIAogCkBAIC0xMjM3LDcgKzEyNTksNyBAQAogaW50IGRyYmRfYWRtX2Rpc2tfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRpc2tfY29uZiAqbmV3X2Rpc2tfY29uZiwgKm9sZF9kaXNrX2NvbmY7CiAJc3RydWN0IGZpZm9fYnVmZmVyICpvbGRfcGxhbiA9IE5VTEwsICpuZXdfcGxhbiA9IE5VTEw7CiAJaW50IGVyciwgZmlmb19zaXplOwpAQCAtMTI0OCwxMSArMTI3MCwxMSBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiB3ZSBhbHNvIG5lZWQgYSBkaXNrCiAJICogdG8gY2hhbmdlIHRoZSBvcHRpb25zIG9uICovCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgeworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlyZXRjb2RlID0gRVJSX05PX0RJU0s7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyNjMsOCArMTI4NSw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9kaXNrX2NvbmYgPSBtZGV2LT5sZGV2LT5kaXNrX2NvbmY7CisJbXV0ZXhfbG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9kaXNrX2NvbmYgPSBkZXZpY2UtPmxkZXYtPmRpc2tfY29uZjsKIAkqbmV3X2Rpc2tfY29uZiA9ICpvbGRfZGlza19jb25mOwogCWlmIChzaG91bGRfc2V0X2RlZmF1bHRzKGluZm8pKQogCQlzZXRfZGlza19jb25mX2RlZmF1bHRzKG5ld19kaXNrX2NvbmYpOwpAQCAtMTI3Myw2ICsxMjk1LDcgQEAKIAlpZiAoZXJyICYmIGVyciAhPSAtRU5PTVNHKSB7CiAJCXJldGNvZGUgPSBFUlJfTUFOREFUT1JZX1RBRzsKIAkJZHJiZF9tc2dfcHV0X2luZm8oZnJvbV9hdHRyc19lcnJfdG9fdHh0KGVycikpOworCQlnb3RvIGZhaWxfdW5sb2NrOwogCX0KIAogCWlmICghZXhwZWN0KG5ld19kaXNrX2NvbmYtPnJlc3luY19yYXRlID49IDEpKQpAQCAtMTI4MCwyOSArMTMwMywyOSBAQAogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPCBEUkJEX0FMX0VYVEVOVFNfTUlOKQogCQluZXdfZGlza19jb25mLT5hbF9leHRlbnRzID0gRFJCRF9BTF9FWFRFTlRTX01JTjsKLQlpZiAobmV3X2Rpc2tfY29uZi0+YWxfZXh0ZW50cyA+IGRyYmRfYWxfZXh0ZW50c19tYXgobWRldi0+bGRldikpCi0JCW5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPSBkcmJkX2FsX2V4dGVudHNfbWF4KG1kZXYtPmxkZXYpOworCWlmIChuZXdfZGlza19jb25mLT5hbF9leHRlbnRzID4gZHJiZF9hbF9leHRlbnRzX21heChkZXZpY2UtPmxkZXYpKQorCQluZXdfZGlza19jb25mLT5hbF9leHRlbnRzID0gZHJiZF9hbF9leHRlbnRzX21heChkZXZpY2UtPmxkZXYpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmNfcGxhbl9haGVhZCA+IERSQkRfQ19QTEFOX0FIRUFEX01BWCkKIAkJbmV3X2Rpc2tfY29uZi0+Y19wbGFuX2FoZWFkID0gRFJCRF9DX1BMQU5fQUhFQURfTUFYOwogCiAJZmlmb19zaXplID0gKG5ld19kaXNrX2NvbmYtPmNfcGxhbl9haGVhZCAqIDEwICogU0xFRVBfVElNRSkgLyBIWjsKLQlpZiAoZmlmb19zaXplICE9IG1kZXYtPnJzX3BsYW5fcy0+c2l6ZSkgeworCWlmIChmaWZvX3NpemUgIT0gZGV2aWNlLT5yc19wbGFuX3MtPnNpemUpIHsKIAkJbmV3X3BsYW4gPSBmaWZvX2FsbG9jKGZpZm9fc2l6ZSk7CiAJCWlmICghbmV3X3BsYW4pIHsKLQkJCWRldl9lcnIoREVWLCAia21hbGxvYyBvZiBmaWZvX2J1ZmZlciBmYWlsZWQiKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2Mgb2YgZmlmb19idWZmZXIgZmFpbGVkIik7CiAJCQlyZXRjb2RlID0gRVJSX05PTUVNOwogCQkJZ290byBmYWlsX3VubG9jazsKIAkJfQogCX0KIAotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsIGxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKTsKLQlkcmJkX2FsX3NocmluayhtZGV2KTsKLQllcnIgPSBkcmJkX2NoZWNrX2FsX3NpemUobWRldiwgbmV3X2Rpc2tfY29uZik7Ci0JbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOwotCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOwotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LCBsY190cnlfbG9jayhkZXZpY2UtPmFjdF9sb2cpKTsKKwlkcmJkX2FsX3NocmluayhkZXZpY2UpOworCWVyciA9IGRyYmRfY2hlY2tfYWxfc2l6ZShkZXZpY2UsIG5ld19kaXNrX2NvbmYpOworCWxjX3VubG9jayhkZXZpY2UtPmFjdF9sb2cpOworCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogCWlmIChlcnIpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKQEAgLTEzMTAsMTAgKzEzMzMsMTAgQEAKIAl9CiAKIAl3cml0ZV9sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwotCXJldGNvZGUgPSBkcmJkX3Jlc3luY19hZnRlcl92YWxpZChtZGV2LCBuZXdfZGlza19jb25mLT5yZXN5bmNfYWZ0ZXIpOworCXJldGNvZGUgPSBkcmJkX3Jlc3luY19hZnRlcl92YWxpZChkZXZpY2UsIG5ld19kaXNrX2NvbmYtPnJlc3luY19hZnRlcik7CiAJaWYgKHJldGNvZGUgPT0gTk9fRVJST1IpIHsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG1kZXYtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7Ci0JCWRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQobWRldik7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCWRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQoZGV2aWNlKTsKIAl9CiAJd3JpdGVfdW5sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwogCkBAIC0xMzIxLDQyICsxMzQ0LDQ2IEBACiAJCWdvdG8gZmFpbF91bmxvY2s7CiAKIAlpZiAobmV3X3BsYW4pIHsKLQkJb2xkX3BsYW4gPSBtZGV2LT5yc19wbGFuX3M7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihtZGV2LT5yc19wbGFuX3MsIG5ld19wbGFuKTsKKwkJb2xkX3BsYW4gPSBkZXZpY2UtPnJzX3BsYW5fczsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS0+cnNfcGxhbl9zLCBuZXdfcGxhbik7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmFsX3VwZGF0ZXMpCi0JCW1kZXYtPmxkZXYtPm1kLmZsYWdzICY9IH5NREZfQUxfRElTQUJMRUQ7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgJj0gfk1ERl9BTF9ESVNBQkxFRDsKIAllbHNlCi0JCW1kZXYtPmxkZXYtPm1kLmZsYWdzIHw9IE1ERl9BTF9ESVNBQkxFRDsKKwkJZGV2aWNlLT5sZGV2LT5tZC5mbGFncyB8PSBNREZfQUxfRElTQUJMRUQ7CiAKIAlpZiAobmV3X2Rpc2tfY29uZi0+bWRfZmx1c2hlcykKLQkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJm1kZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpOwogCWVsc2UKLQkJc2V0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX2J1bXBfd3JpdGVfb3JkZXJpbmcobWRldi0+dGNvbm4sIFdPX2JkZXZfZmx1c2gpOworCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBXT19iZGV2X2ZsdXNoKTsKIAotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEKQotCQlkcmJkX3NlbmRfc3luY19wYXJhbShtZGV2KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEKSB7CisJCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKworCQlmb3JfZWFjaF9wZWVyX2RldmljZShwZWVyX2RldmljZSwgZGV2aWNlKQorCQkJZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOworCX0KIAogCXN5bmNocm9uaXplX3JjdSgpOwogCWtmcmVlKG9sZF9kaXNrX2NvbmYpOwogCWtmcmVlKG9sZF9wbGFuKTsKLQltb2RfdGltZXIoJm1kZXYtPnJlcXVlc3RfdGltZXIsIGppZmZpZXMgKyBIWik7CisJbW9kX3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIsIGppZmZpZXMgKyBIWik7CiAJZ290byBzdWNjZXNzOwogCiBmYWlsX3VubG9jazoKLQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAgZmFpbDoKIAlrZnJlZShuZXdfZGlza19jb25mKTsKIAlrZnJlZShuZXdfcGxhbik7CiBzdWNjZXNzOgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiAgb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTEzNjQsNyArMTM5MSw3IEBACiAKIGludCBkcmJkX2FkbV9hdHRhY2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCBlcnI7CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAJZW51bSBkZXRlcm1pbmVfZGV2X3NpemUgZGQ7CkBAIC0xMzg1LDExICsxNDEyLDExIEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmluaXNoOwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQljb25uX3JlY29uZmlnX3N0YXJ0KG1kZXYtPnRjb25uKTsKKwlkZXZpY2UgPSBhZG1fY3R4LmRldmljZTsKKwljb25uX3JlY29uZmlnX3N0YXJ0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCiAJLyogaWYgeW91IHdhbnQgdG8gcmVjb25maWd1cmUsIHBsZWFzZSB0ZWFyIGRvd24gZmlyc3QgKi8KLQlpZiAobWRldi0+c3RhdGUuZGlzayA+IERfRElTS0xFU1MpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9ESVNLTEVTUykgewogCQlyZXRjb2RlID0gRVJSX0RJU0tfQ09ORklHVVJFRDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTEzOTcsMTcgKzE0MjQsMTcgQEAKIAkgKiBkcmJkX2xkZXZfZGVzdHJveSBpcyBkb25lIGFscmVhZHksIHdlIG1heSBlbmQgdXAgaGVyZSB2ZXJ5IGZhc3QsCiAJICogZS5nLiBpZiBzb21lb25lIGNhbGxzIGF0dGFjaCBmcm9tIHRoZSBvbi1pby1lcnJvciBoYW5kbGVyLAogCSAqIHRvIHJlYWxpemUgYSAiaG90IHNwYXJlIiBmZWF0dXJlIChub3QgdGhhdCBJJ2QgcmVjb21tZW5kIHRoYXQpICovCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSk7CisJd2FpdF9ldmVudChkZXZpY2UtPm1pc2Nfd2FpdCwgIWF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCkpOwogCiAJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGxlZnRvdmVyIGZyb20gcHJldmlvdXMgZm9yY2UtZGV0YWNoIGF0dGVtcHRzICovCi0JY2xlYXJfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKTsKLQljbGVhcl9iaXQoV0FTX0lPX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChXQVNfUkVBRF9FUlJPUiwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRk9SQ0VfREVUQUNILCAmZGV2aWNlLT5mbGFncyk7CisJY2xlYXJfYml0KFdBU19JT19FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCiAJLyogYW5kIG5vIGxlZnRvdmVyIGZyb20gcHJldmlvdXNseSBhYm9ydGVkIHJlc3luYyBvciB2ZXJpZnksIGVpdGhlciAqLwotCW1kZXYtPnJzX3RvdGFsID0gMDsKLQltZGV2LT5yc19mYWlsZWQgPSAwOwotCWF0b21pY19zZXQoJm1kZXYtPnJzX3BlbmRpbmdfY250LCAwKTsKKwlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CiAKIAkvKiBhbGxvY2F0aW9uIG5vdCBpbiB0aGUgSU8gcGF0aCwgZHJiZHNldHVwIGNvbnRleHQgKi8KIAluYmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiksIEdGUF9LRVJORUwpOwpAQCAtMTQ0NywxMyArMTQ3NCwxMyBAQAogCX0KIAogCXdyaXRlX2xvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7Ci0JcmV0Y29kZSA9IGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKG1kZXYsIG5ld19kaXNrX2NvbmYtPnJlc3luY19hZnRlcik7CisJcmV0Y29kZSA9IGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKGRldmljZSwgbmV3X2Rpc2tfY29uZi0+cmVzeW5jX2FmdGVyKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmFpbDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAlpZiAobmMpIHsKIAkJaWYgKG5ld19kaXNrX2NvbmYtPmZlbmNpbmcgPT0gRlBfU1RPTklUSCAmJiBuYy0+d2lyZV9wcm90b2NvbCA9PSBEUkJEX1BST1RfQSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNDY0LDkgKzE0OTEsOSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJYmRldiA9IGJsa2Rldl9nZXRfYnlfcGF0aChuZXdfZGlza19jb25mLT5iYWNraW5nX2RldiwKLQkJCQkgIEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSB8IEZNT0RFX0VYQ0wsIG1kZXYpOworCQkJCSAgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhDTCwgZGV2aWNlKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7Ci0JCWRldl9lcnIoREVWLCAib3BlbihcIiVzXCIpIGZhaWxlZCB3aXRoICVsZFxuIiwgbmV3X2Rpc2tfY29uZi0+YmFja2luZ19kZXYsCisJCWRyYmRfZXJyKGRldmljZSwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5ld19kaXNrX2NvbmYtPmJhY2tpbmdfZGV2LAogCQkJUFRSX0VSUihiZGV2KSk7CiAJCXJldGNvZGUgPSBFUlJfT1BFTl9ESVNLOwogCQlnb3RvIGZhaWw7CkBAIC0xNDg0LDkgKzE1MTEsOSBAQAogCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgobmV3X2Rpc2tfY29uZi0+bWV0YV9kZXYsCiAJCQkJICBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMLAogCQkJCSAgKG5ld19kaXNrX2NvbmYtPm1ldGFfZGV2X2lkeCA8IDApID8KLQkJCQkgICh2b2lkICopbWRldiA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CisJCQkJICAodm9pZCAqKWRldmljZSA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CiAJaWYgKElTX0VSUihiZGV2KSkgewotCQlkZXZfZXJyKERFViwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5ld19kaXNrX2NvbmYtPm1ldGFfZGV2LAorCQlkcmJkX2VycihkZXZpY2UsICJvcGVuKFwiJXNcIikgZmFpbGVkIHdpdGggJWxkXG4iLCBuZXdfZGlza19jb25mLT5tZXRhX2RldiwKIAkJCVBUUl9FUlIoYmRldikpOwogCQlyZXRjb2RlID0gRVJSX09QRU5fTURfRElTSzsKIAkJZ290byBmYWlsOwpAQCAtMTUxMCw3ICsxNTM3LDcgQEAKIAogCS8qIFJlYWQgb3VyIG1ldGEgZGF0YSBzdXBlciBibG9jayBlYXJseS4KIAkgKiBUaGlzIGFsc28gc2V0cyBvdGhlciBvbi1kaXNrIG9mZnNldHMuICovCi0JcmV0Y29kZSA9IGRyYmRfbWRfcmVhZChtZGV2LCBuYmMpOworCXJldGNvZGUgPSBkcmJkX21kX3JlYWQoZGV2aWNlLCBuYmMpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKQEAgLTE1MjAsNyArMTU0Nyw3IEBACiAJCW5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPSBkcmJkX2FsX2V4dGVudHNfbWF4KG5iYyk7CiAKIAlpZiAoZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG5iYykgPCBuZXdfZGlza19jb25mLT5kaXNrX3NpemUpIHsKLQkJZGV2X2VycihERVYsICJtYXggY2FwYWNpdHkgJWxsdSBzbWFsbGVyIHRoYW4gZGlzayBzaXplICVsbHVcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIm1heCBjYXBhY2l0eSAlbGx1IHNtYWxsZXIgdGhhbiBkaXNrIHNpemUgJWxsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGRyYmRfZ2V0X21heF9jYXBhY2l0eShuYmMpLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbmV3X2Rpc2tfY29uZi0+ZGlza19zaXplKTsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPT19TTUFMTDsKQEAgLTE1MzgsNyArMTU2NSw3IEBACiAKIAlpZiAoZHJiZF9nZXRfY2FwYWNpdHkobmJjLT5tZF9iZGV2KSA8IG1pbl9tZF9kZXZpY2Vfc2VjdG9ycykgewogCQlyZXRjb2RlID0gRVJSX01EX0RJU0tfVE9PX1NNQUxMOwotCQlkZXZfd2FybihERVYsICJyZWZ1c2luZyBhdHRhY2g6IG1kLWRldmljZSB0b28gc21hbGwsICIKKwkJZHJiZF93YXJuKGRldmljZSwgInJlZnVzaW5nIGF0dGFjaDogbWQtZGV2aWNlIHRvbyBzbWFsbCwgIgogCQkgICAgICJhdCBsZWFzdCAlbGx1IHNlY3RvcnMgbmVlZGVkIGZvciB0aGlzIG1ldGEtZGlzayB0eXBlXG4iLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1pbl9tZF9kZXZpY2Vfc2VjdG9ycyk7CiAJCWdvdG8gZmFpbDsKQEAgLTE1NDcsNyArMTU3NCw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBuZXcgZGlzayBpcyBiaWcgZW5vdWdoCiAJICogKHdlIG1heSBjdXJyZW50bHkgYmUgUl9QUklNQVJZIHdpdGggbm8gbG9jYWwgZGlzay4uLikgKi8KIAlpZiAoZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG5iYykgPAotCSAgICBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKSB7CisJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSkgewogCQlyZXRjb2RlID0gRVJSX0RJU0tfVE9PX1NNQUxMOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTU1NSwxNSArMTU4MiwxNSBAQAogCW5iYy0+a25vd25fc2l6ZSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG5iYy0+YmFja2luZ19iZGV2KTsKIAogCWlmIChuYmMtPmtub3duX3NpemUgPiBtYXhfcG9zc2libGVfc2VjdG9ycykgewotCQlkZXZfd2FybihERVYsICI9PT4gdHJ1bmNhdGluZyB2ZXJ5IGJpZyBsb3dlciBsZXZlbCBkZXZpY2UgIgorCQlkcmJkX3dhcm4oZGV2aWNlLCAiPT0+IHRydW5jYXRpbmcgdmVyeSBiaWcgbG93ZXIgbGV2ZWwgZGV2aWNlICIKIAkJCSJ0byBjdXJyZW50bHkgbWF4aW11bSBwb3NzaWJsZSAlbGx1IHNlY3RvcnMgPD09XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbWF4X3Bvc3NpYmxlX3NlY3RvcnMpOwogCQlpZiAobmV3X2Rpc2tfY29uZi0+bWV0YV9kZXZfaWR4ID49IDApCi0JCQlkZXZfd2FybihERVYsICI9PT4+IHVzaW5nIGludGVybmFsIG9yIGZsZXhpYmxlICIKKwkJCWRyYmRfd2FybihkZXZpY2UsICI9PT4+IHVzaW5nIGludGVybmFsIG9yIGZsZXhpYmxlICIKIAkJCQkgICAgICAibWV0YSBkYXRhIG1heSBoZWxwIDw8PT1cbiIpOwogCX0KIAotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKKwlkcmJkX3N1c3BlbmRfaW8oZGV2aWNlKTsKIAkvKiBhbHNvIHdhaXQgZm9yIHRoZSBsYXN0IGJhcnJpZXIgYWNrLiAqLwogCS8qIEZJWE1FIHNlZSBhbHNvIGh0dHBzOi8vZGFpcXVpcmkubGluYml0L2NnaS1iaW4vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3MQogCSAqIFdlIG5lZWQgYSB3YXkgdG8gZWl0aGVyIGlnbm9yZSBiYXJyaWVyIGFja3MgZm9yIGJhcnJpZXJzIHNlbnQgYmVmb3JlIGEgZGV2aWNlCkBAIC0xNTcxLDQ1ICsxNTk4LDQ1IEBACiAJICogQXMgYmFycmllcnMgYXJlIGNvdW50ZWQgcGVyIHJlc291cmNlLAogCSAqIHdlJ2QgbmVlZCB0byBzdXNwZW5kIGlvIG9uIGFsbCBkZXZpY2VzIG9mIGEgcmVzb3VyY2UuCiAJICovCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+YXBfcGVuZGluZ19jbnQpIHx8IGRyYmRfc3VzcGVuZGVkKG1kZXYpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhYXRvbWljX3JlYWQoJmRldmljZS0+YXBfcGVuZGluZ19jbnQpIHx8IGRyYmRfc3VzcGVuZGVkKGRldmljZSkpOwogCS8qIGFuZCBmb3IgYW55IG90aGVyIHByZXZpb3VzbHkgcXVldWVkIHdvcmsgKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmspOwogCi0JcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfQVRUQUNISU5HKSwgQ1NfVkVSQk9TRSk7CisJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoZGlzaywgRF9BVFRBQ0hJTkcpLCBDU19WRVJCT1NFKTsKIAlyZXRjb2RlID0gcnY7ICAvKiBGSVhNRTogVHlwZSBtaXNtYXRjaC4gKi8KLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gZmFpbDsKIAotCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpCiAJCWdvdG8gZm9yY2VfZGlza2xlc3M7CiAKLQlpZiAoIW1kZXYtPmJpdG1hcCkgewotCQlpZiAoZHJiZF9ibV9pbml0KG1kZXYpKSB7CisJaWYgKCFkZXZpY2UtPmJpdG1hcCkgeworCQlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpIHsKIAkJCXJldGNvZGUgPSBFUlJfTk9NRU07CiAJCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQgJiYKLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKLQkgICAgKG1kZXYtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChuYmMtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG9ubHkgYXR0YWNoIHRvIGRhdGEgd2l0aCBjdXJyZW50IFVVSUQ9JTAxNmxsWFxuIiwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+ZWRfdXVpZCk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEICYmCisJICAgIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKKwkgICAgKGRldmljZS0+ZWRfdXVpZCAmIH4oKHU2NCkxKSkgIT0gKG5iYy0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKSkpIHsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ2FuIG9ubHkgYXR0YWNoIHRvIGRhdGEgd2l0aCBjdXJyZW50IFVVSUQ9JTAxNmxsWFxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5lZF91dWlkKTsKIAkJcmV0Y29kZSA9IEVSUl9EQVRBX05PVF9DVVJSRU5UOwogCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAl9CiAKIAkvKiBTaW5jZSB3ZSBhcmUgZGlza2xlc3MsIGZpeCB0aGUgYWN0aXZpdHkgbG9nIGZpcnN0Li4uICovCi0JaWYgKGRyYmRfY2hlY2tfYWxfc2l6ZShtZGV2LCBuZXdfZGlza19jb25mKSkgeworCWlmIChkcmJkX2NoZWNrX2FsX3NpemUoZGV2aWNlLCBuZXdfZGlza19jb25mKSkgewogCQlyZXRjb2RlID0gRVJSX05PTUVNOwogCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAl9CiAKIAkvKiBQcmV2ZW50IHNocmlua2luZyBvZiBjb25zaXN0ZW50IGRldmljZXMgISAqLwogCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhuYmMsIE1ERl9DT05TSVNURU5UKSAmJgotCSAgICBkcmJkX25ld19kZXZfc2l6ZShtZGV2LCBuYmMsIG5iYy0+ZGlza19jb25mLT5kaXNrX3NpemUsIDApIDwgbmJjLT5tZC5sYV9zaXplX3NlY3QpIHsKLQkJZGV2X3dhcm4oREVWLCAicmVmdXNpbmcgdG8gdHJ1bmNhdGUgYSBjb25zaXN0ZW50IGRldmljZVxuIik7CisJICAgIGRyYmRfbmV3X2Rldl9zaXplKGRldmljZSwgbmJjLCBuYmMtPmRpc2tfY29uZi0+ZGlza19zaXplLCAwKSA8IG5iYy0+bWQubGFfc2l6ZV9zZWN0KSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJyZWZ1c2luZyB0byB0cnVuY2F0ZSBhIGNvbnNpc3RlbnQgZGV2aWNlXG4iKTsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPT19TTUFMTDsKIAkJZ290byBmb3JjZV9kaXNrbGVzc19kZWM7CiAJfQpAQCAtMTYxNyw0MCArMTY0NCw0MCBAQAogCS8qIFJlc2V0IHRoZSAiYmFycmllcnMgZG9uJ3Qgd29yayIgYml0cyBoZXJlLCB0aGVuIGZvcmNlIG1ldGEgZGF0YSB0bwogCSAqIGJlIHdyaXR0ZW4sIHRvIGVuc3VyZSB3ZSBkZXRlcm1pbmUgaWYgYmFycmllcnMgYXJlIHN1cHBvcnRlZC4gKi8KIAlpZiAobmV3X2Rpc2tfY29uZi0+bWRfZmx1c2hlcykKLQkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJm1kZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpOwogCWVsc2UKLQkJc2V0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncyk7CiAKIAkvKiBQb2ludCBvZiBubyByZXR1cm4gcmVhY2hlZC4KIAkgKiBEZXZpY2VzIGFuZCBtZW1vcnkgYXJlIG5vIGxvbmdlciByZWxlYXNlZCBieSBlcnJvciBjbGVhbnVwIGJlbG93LgotCSAqIG5vdyBtZGV2IHRha2VzIG92ZXIgcmVzcG9uc2liaWxpdHksIGFuZCB0aGUgc3RhdGUgZW5naW5lIHNob3VsZAorCSAqIG5vdyBkZXZpY2UgdGFrZXMgb3ZlciByZXNwb25zaWJpbGl0eSwgYW5kIHRoZSBzdGF0ZSBlbmdpbmUgc2hvdWxkCiAJICogY2xlYW4gaXQgdXAgc29tZXdoZXJlLiAgKi8KLQlEX0FTU0VSVChtZGV2LT5sZGV2ID09IE5VTEwpOwotCW1kZXYtPmxkZXYgPSBuYmM7Ci0JbWRldi0+cmVzeW5jID0gcmVzeW5jX2xydTsKLQltZGV2LT5yc19wbGFuX3MgPSBuZXdfcGxhbjsKKwlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+bGRldiA9PSBOVUxMKTsKKwlkZXZpY2UtPmxkZXYgPSBuYmM7CisJZGV2aWNlLT5yZXN5bmMgPSByZXN5bmNfbHJ1OworCWRldmljZS0+cnNfcGxhbl9zID0gbmV3X3BsYW47CiAJbmJjID0gTlVMTDsKIAlyZXN5bmNfbHJ1ID0gTlVMTDsKIAluZXdfZGlza19jb25mID0gTlVMTDsKIAluZXdfcGxhbiA9IE5VTEw7CiAKLQlkcmJkX2J1bXBfd3JpdGVfb3JkZXJpbmcobWRldi0+dGNvbm4sIFdPX2JkZXZfZmx1c2gpOworCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBXT19iZGV2X2ZsdXNoKTsKIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQ1JBU0hFRF9QUklNQVJZKSkKLQkJc2V0X2JpdChDUkFTSEVEX1BSSU1BUlksICZtZGV2LT5mbGFncyk7CisJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NSQVNIRURfUFJJTUFSWSkpCisJCXNldF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncyk7CiAJZWxzZQotCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX1BSSU1BUllfSU5EKSAmJgotCSAgICAhKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG1kZXYtPnRjb25uLT5zdXNwX25vZCkpCi0JCXNldF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOworCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QUklNQVJZX0lORCkgJiYKKwkgICAgIShkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIGRldmljZS0+cmVzb3VyY2UtPnN1c3Bfbm9kKSkKKwkJc2V0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKTsKIAotCW1kZXYtPnNlbmRfY250ID0gMDsKLQltZGV2LT5yZWN2X2NudCA9IDA7Ci0JbWRldi0+cmVhZF9jbnQgPSAwOwotCW1kZXYtPndyaXRfY250ID0gMDsKKwlkZXZpY2UtPnNlbmRfY250ID0gMDsKKwlkZXZpY2UtPnJlY3ZfY250ID0gMDsKKwlkZXZpY2UtPnJlYWRfY250ID0gMDsKKwlkZXZpY2UtPndyaXRfY250ID0gMDsKIAotCWRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUobWRldik7CisJZHJiZF9yZWNvbnNpZGVyX21heF9iaW9fc2l6ZShkZXZpY2UpOwogCiAJLyogSWYgSSBhbSBjdXJyZW50bHkgbm90IFJfUFJJTUFSWSwKIAkgKiBidXQgbWV0YSBkYXRhIHByaW1hcnkgaW5kaWNhdG9yIGlzIHNldCwKQEAgLTE2NjYsNTAgKzE2OTMsNTAgQEAKIAkgKiBzbyB3ZSBjYW4gYXV0b21hdGljYWxseSByZWNvdmVyIGZyb20gYSBjcmFzaCBvZiBhCiAJICogZGVncmFkZWQgYnV0IGFjdGl2ZSAiY2x1c3RlciIgYWZ0ZXIgYSBjZXJ0YWluIHRpbWVvdXQuCiAJICovCi0JY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOwotCWlmIChtZGV2LT5zdGF0ZS5yb2xlICE9IFJfUFJJTUFSWSAmJgotCSAgICAgZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX1BSSU1BUllfSU5EKSAmJgotCSAgICAhZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX0NPTk5FQ1RFRF9JTkQpKQotCQlzZXRfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChVU0VfREVHUl9XRkNfVCwgJmRldmljZS0+ZmxhZ3MpOworCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9QUklNQVJZICYmCisJICAgICBkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QUklNQVJZX0lORCkgJiYKKwkgICAgIWRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NPTk5FQ1RFRF9JTkQpKQorCQlzZXRfYml0KFVTRV9ERUdSX1dGQ19ULCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIDAsIE5VTEwpOworCWRkID0gZHJiZF9kZXRlcm1pbmVfZGV2X3NpemUoZGV2aWNlLCAwLCBOVUxMKTsKIAlpZiAoZGQgPD0gRFNfRVJST1IpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTV9CSVRNQVA7CiAJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCX0gZWxzZSBpZiAoZGQgPT0gRFNfR1JFVykKLQkJc2V0X2JpdChSRVNZTkNfQUZURVJfTkVHLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZkZXZpY2UtPmZsYWdzKTsKIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfRlVMTF9TWU5DKSB8fAotCSAgICAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpICYmCi0JICAgICBkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQUxfRElTQUJMRUQpKSkgewotCQlkZXZfaW5mbyhERVYsICJBc3N1bWluZyB0aGF0IGFsbCBibG9ja3MgYXJlIG91dCBvZiBzeW5jICIKKwlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcoZGV2aWNlLT5sZGV2LCBNREZfRlVMTF9TWU5DKSB8fAorCSAgICAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncykgJiYKKwkgICAgIGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0FMX0RJU0FCTEVEKSkpIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIkFzc3VtaW5nIHRoYXQgYWxsIGJsb2NrcyBhcmUgb3V0IG9mIHN5bmMgIgogCQkgICAgICIoYWthIEZ1bGxTeW5jKVxuIik7Ci0JCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAorCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAogCQkJInNldF9uX3dyaXRlIGZyb20gYXR0YWNoaW5nIiwgQk1fTE9DS0VEX01BU0spKSB7CiAJCQlyZXRjb2RlID0gRVJSX0lPX01EX0RJU0s7CiAJCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibV9yZWFkLAorCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibV9yZWFkLAogCQkJInJlYWQgZnJvbSBhdHRhY2hpbmciLCBCTV9MT0NLRURfTUFTSykpIHsKIAkJCXJldGNvZGUgPSBFUlJfSU9fTURfRElTSzsKIAkJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCQl9CiAJfQogCi0JaWYgKF9kcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA9PSBkcmJkX2JtX2JpdHMobWRldikpCi0JCWRyYmRfc3VzcGVuZF9hbChtZGV2KTsgLyogSU8gaXMgc3RpbGwgc3VzcGVuZGVkIGhlcmUuLi4gKi8KKwlpZiAoX2RyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgPT0gZHJiZF9ibV9iaXRzKGRldmljZSkpCisJCWRyYmRfc3VzcGVuZF9hbChkZXZpY2UpOyAvKiBJTyBpcyBzdGlsbCBzdXNwZW5kZWQgaGVyZS4uLiAqLwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAlucyA9IG9zOwogCS8qIElmIE1ERl9DT05TSVNURU5UIGlzIG5vdCBzZXQgZ28gaW50byBpbmNvbnNpc3RlbnQgc3RhdGUsCiAJICAgb3RoZXJ3aXNlIGludmVzdGlnYXRlIE1ERl9XYXNVcFRvRGF0ZS4uLgogCSAgIElmIE1ERl9XQVNfVVBfVE9fREFURSBpcyBub3Qgc2V0IGdvIGludG8gRF9PVVREQVRFRCBkaXNrIHN0YXRlLAogCSAgIG90aGVyd2lzZSBpbnRvIERfQ09OU0lTVEVOVCBzdGF0ZS4KIAkqLwotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQ09OU0lTVEVOVCkpIHsKLQkJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKG1kZXYtPmxkZXYsIE1ERl9XQVNfVVBfVE9fREFURSkpCisJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NPTlNJU1RFTlQpKSB7CisJCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9XQVNfVVBfVE9fREFURSkpCiAJCQlucy5kaXNrID0gRF9DT05TSVNURU5UOwogCQllbHNlCiAJCQlucy5kaXNrID0gRF9PVVREQVRFRDsKQEAgLTE3MTcsMTIgKzE3NDQsMTIgQEAKIAkJbnMuZGlzayA9IERfSU5DT05TSVNURU5UOwogCX0KIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfUEVFUl9PVVRfREFURUQpKQorCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QRUVSX09VVF9EQVRFRCkpCiAJCW5zLnBkc2sgPSBEX09VVERBVEVEOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChucy5kaXNrID09IERfQ09OU0lTVEVOVCAmJgotCSAgICAobnMucGRzayA9PSBEX09VVERBVEVEIHx8IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nID09IEZQX0RPTlRfQ0FSRSkpCisJICAgIChucy5wZHNrID09IERfT1VUREFURUQgfHwgcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZyA9PSBGUF9ET05UX0NBUkUpKQogCQlucy5kaXNrID0gRF9VUF9UT19EQVRFOwogCiAJLyogQWxsIHRlc3RzIG9uIE1ERl9QUklNQVJZX0lORCwgTURGX0NPTk5FQ1RFRF9JTkQsCkBAIC0xNzMwLDU2ICsxNzU3LDU2IEBACiAJICAgdGhpcyBwb2ludCwgYmVjYXVzZSBkcmJkX3JlcXVlc3Rfc3RhdGUoKSBtb2RpZmllcyB0aGVzZQogCSAgIGZsYWdzLiAqLwogCi0JaWYgKHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzKQotCQltZGV2LT5sZGV2LT5tZC5mbGFncyAmPSB+TURGX0FMX0RJU0FCTEVEOworCWlmIChyY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzKQorCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzICY9IH5NREZfQUxfRElTQUJMRUQ7CiAJZWxzZQotCQltZGV2LT5sZGV2LT5tZC5mbGFncyB8PSBNREZfQUxfRElTQUJMRUQ7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgfD0gTURGX0FMX0RJU0FCTEVEOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBJbiBjYXNlIHdlIGFyZSBDX0NPTk5FQ1RFRCBwb3N0cG9uZSBhbnkgZGVjaXNpb24gb24gdGhlIG5ldyBkaXNrCiAJICAgc3RhdGUgYWZ0ZXIgdGhlIG5lZ290aWF0aW9uIHBoYXNlLiAqLwotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEKSB7Ci0JCW1kZXYtPm5ld19zdGF0ZV90bXAuaSA9IG5zLmk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCkgeworCQlkZXZpY2UtPm5ld19zdGF0ZV90bXAuaSA9IG5zLmk7CiAJCW5zLmkgPSBvcy5pOwogCQlucy5kaXNrID0gRF9ORUdPVElBVElORzsKIAogCQkvKiBXZSBleHBlY3QgdG8gcmVjZWl2ZSB1cC10by1kYXRlIFVVSURzIHNvb24uCiAJCSAgIFRvIGF2b2lkIGEgcmFjZSBpbiByZWNlaXZlX3N0YXRlLCBmcmVlIHBfdXVpZCB3aGlsZQogCQkgICBob2xkaW5nIHJlcV9sb2NrLiBJLmUuIGF0b21pYyB3aXRoIHRoZSBzdGF0ZSBjaGFuZ2UgKi8KLQkJa2ZyZWUobWRldi0+cF91dWlkKTsKLQkJbWRldi0+cF91dWlkID0gTlVMTDsKKwkJa2ZyZWUoZGV2aWNlLT5wX3V1aWQpOworCQlkZXZpY2UtPnBfdXVpZCA9IE5VTEw7CiAJfQogCi0JcnYgPSBfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlydiA9IF9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBDU19WRVJCT1NFLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCi0JbW9kX3RpbWVyKCZtZGV2LT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOwogCi0JaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQotCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdIHw9ICAodTY0KTE7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpCisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSB8PSAgKHU2NCkxOwogCWVsc2UKLQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmPSB+KHU2NCkxOworCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJj0gfih1NjQpMTsKIAotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRldi0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7Ci0JcHV0X2xkZXYobWRldik7Ci0JY29ubl9yZWNvbmZpZ19kb25lKG1kZXYtPnRjb25uKTsKKwlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYoZGV2aWNlLT52ZGlzayktPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwlwdXRfbGRldihkZXZpY2UpOworCWNvbm5fcmVjb25maWdfZG9uZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiAKICBmb3JjZV9kaXNrbGVzc19kZWM6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKICBmb3JjZV9kaXNrbGVzczoKLQlkcmJkX2ZvcmNlX3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKICBmYWlsOgotCWNvbm5fcmVjb25maWdfZG9uZShtZGV2LT50Y29ubik7CisJY29ubl9yZWNvbmZpZ19kb25lKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCWlmIChuYmMpIHsKIAkJaWYgKG5iYy0+YmFja2luZ19iZGV2KQogCQkJYmxrZGV2X3B1dChuYmMtPmJhY2tpbmdfYmRldiwKQEAgLTE3OTgsMjYgKzE4MjUsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZG1fZGV0YWNoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBmb3JjZSkKK3N0YXRpYyBpbnQgYWRtX2RldGFjaChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGZvcmNlKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlOwogCWludCByZXQ7CiAKIAlpZiAoZm9yY2UpIHsKLQkJc2V0X2JpdChGT1JDRV9ERVRBQ0gsICZtZGV2LT5mbGFncyk7Ci0JCWRyYmRfZm9yY2Vfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKKwkJc2V0X2JpdChGT1JDRV9ERVRBQ0gsICZkZXZpY2UtPmZsYWdzKTsKKwkJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRkFJTEVEKSk7CiAJCXJldGNvZGUgPSBTU19TVUNDRVNTOwogCQlnb3RvIG91dDsKIAl9CiAKLQlkcmJkX3N1c3BlbmRfaW8obWRldik7IC8qIHNvIG5vLW9uZSBpcyBzdHVjayBpbiBkcmJkX2FsX2JlZ2luX2lvICovCi0JZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gaW4tZmxpZ2h0IG1ldGEtZGF0YSBJTyAqLwotCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKLQlkcmJkX21kX3B1dF9idWZmZXIobWRldik7CisJZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7IC8qIHNvIG5vLW9uZSBpcyBzdHVjayBpbiBkcmJkX2FsX2JlZ2luX2lvICovCisJZHJiZF9tZF9nZXRfYnVmZmVyKGRldmljZSk7IC8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBpbi1mbGlnaHQgbWV0YS1kYXRhIElPICovCisJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRkFJTEVEKSk7CisJZHJiZF9tZF9wdXRfYnVmZmVyKGRldmljZSk7CiAJLyogRF9GQUlMRUQgd2lsbCB0cmFuc2l0aW9uIHRvIERJU0tMRVNTLiAqLwotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShtZGV2LT5taXNjX3dhaXQsCi0JCQltZGV2LT5zdGF0ZS5kaXNrICE9IERfRkFJTEVEKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5taXNjX3dhaXQsCisJCQlkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9GQUlMRUQpOworCWRyYmRfcmVzdW1lX2lvKGRldmljZSk7CiAJaWYgKChpbnQpcmV0Y29kZSA9PSAoaW50KVNTX0lTX0RJU0tMRVNTKQogCQlyZXRjb2RlID0gU1NfTk9USElOR19UT19ETzsKIAlpZiAocmV0KQpAQCAtMTg1MiwyNCArMTg3OSwyNSBAQAogCQl9CiAJfQogCi0JcmV0Y29kZSA9IGFkbV9kZXRhY2goYWRtX2N0eC5tZGV2LCBwYXJtcy5mb3JjZV9kZXRhY2gpOworCXJldGNvZGUgPSBhZG1fZGV0YWNoKGFkbV9jdHguZGV2aWNlLCBwYXJtcy5mb3JjZV9kZXRhY2gpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgY29ubl9yZXN5bmNfcnVubmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgYm9vbCBjb25uX3Jlc3luY19ydW5uaW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJYm9vbCBydiA9IGZhbHNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAotCQkgICAgbWRldi0+c3RhdGUuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19TIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7CiAJCQlydiA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpAQCAtMTg3OSwxNiArMTkwNywxNyBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIGJvb2wgY29ubl9vdl9ydW5uaW5nKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBib29sIGNvbm5fb3ZfcnVubmluZyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWJvb2wgcnYgPSBmYWxzZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fAorCQkgICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpIHsKIAkJCXJ2ID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xODk5LDYzICsxOTI4LDY1IEBACiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUKLV9jaGVja19uZXRfb3B0aW9ucyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmYsIHN0cnVjdCBuZXRfY29uZiAqbmV3X2NvbmYpCitfY2hlY2tfbmV0X29wdGlvbnMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCBpOwogCi0JaWYgKG9sZF9jb25mICYmIHRjb25uLT5jc3RhdGUgPT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKLQkJaWYgKG5ld19jb25mLT53aXJlX3Byb3RvY29sICE9IG9sZF9jb25mLT53aXJlX3Byb3RvY29sKQorCWlmIChvbGRfbmV0X2NvbmYgJiYgY29ubmVjdGlvbi0+Y3N0YXRlID09IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKKwkJaWYgKG5ld19uZXRfY29uZi0+d2lyZV9wcm90b2NvbCAhPSBvbGRfbmV0X2NvbmYtPndpcmVfcHJvdG9jb2wpCiAJCQlyZXR1cm4gRVJSX05FRURfQVBWXzEwMDsKIAotCQlpZiAobmV3X2NvbmYtPnR3b19wcmltYXJpZXMgIT0gb2xkX2NvbmYtPnR3b19wcmltYXJpZXMpCisJCWlmIChuZXdfbmV0X2NvbmYtPnR3b19wcmltYXJpZXMgIT0gb2xkX25ldF9jb25mLT50d29fcHJpbWFyaWVzKQogCQkJcmV0dXJuIEVSUl9ORUVEX0FQVl8xMDA7CiAKLQkJaWYgKHN0cmNtcChuZXdfY29uZi0+aW50ZWdyaXR5X2FsZywgb2xkX2NvbmYtPmludGVncml0eV9hbGcpKQorCQlpZiAoc3RyY21wKG5ld19uZXRfY29uZi0+aW50ZWdyaXR5X2FsZywgb2xkX25ldF9jb25mLT5pbnRlZ3JpdHlfYWxnKSkKIAkJCXJldHVybiBFUlJfTkVFRF9BUFZfMTAwOwogCX0KIAotCWlmICghbmV3X2NvbmYtPnR3b19wcmltYXJpZXMgJiYKLQkgICAgY29ubl9oaWdoZXN0X3JvbGUodGNvbm4pID09IFJfUFJJTUFSWSAmJgotCSAgICBjb25uX2hpZ2hlc3RfcGVlcih0Y29ubikgPT0gUl9QUklNQVJZKQorCWlmICghbmV3X25ldF9jb25mLT50d29fcHJpbWFyaWVzICYmCisJICAgIGNvbm5faGlnaGVzdF9yb2xlKGNvbm5lY3Rpb24pID09IFJfUFJJTUFSWSAmJgorCSAgICBjb25uX2hpZ2hlc3RfcGVlcihjb25uZWN0aW9uKSA9PSBSX1BSSU1BUlkpCiAJCXJldHVybiBFUlJfTkVFRF9BTExPV19UV09fUFJJOwogCi0JaWYgKG5ld19jb25mLT50d29fcHJpbWFyaWVzICYmCi0JICAgIChuZXdfY29uZi0+d2lyZV9wcm90b2NvbCAhPSBEUkJEX1BST1RfQykpCisJaWYgKG5ld19uZXRfY29uZi0+dHdvX3ByaW1hcmllcyAmJgorCSAgICAobmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9DKSkKIAkJcmV0dXJuIEVSUl9OT1RfUFJPVE9fQzsKIAotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIGkpIHsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCQllbnVtIGRyYmRfZmVuY2luZ19wIGZwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmc7Ci0JCQlwdXRfbGRldihtZGV2KTsKLQkJCWlmIChuZXdfY29uZi0+d2lyZV9wcm90b2NvbCA9PSBEUkJEX1BST1RfQSAmJiBmcCA9PSBGUF9TVE9OSVRIKQorCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgaSkgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCQllbnVtIGRyYmRfZmVuY2luZ19wIGZwID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQlpZiAobmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sID09IERSQkRfUFJPVF9BICYmIGZwID09IEZQX1NUT05JVEgpCiAJCQkJcmV0dXJuIEVSUl9TVE9OSVRIX0FORF9QUk9UX0E7CiAJCX0KLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG5ld19jb25mLT5kaXNjYXJkX215X2RhdGEpCisJCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG5ld19uZXRfY29uZi0+ZGlzY2FyZF9teV9kYXRhKQogCQkJcmV0dXJuIEVSUl9ESVNDQVJEX0lNUE9TU0lCTEU7CiAJfQogCi0JaWYgKG5ld19jb25mLT5vbl9jb25nZXN0aW9uICE9IE9DX0JMT0NLICYmIG5ld19jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9BKQorCWlmIChuZXdfbmV0X2NvbmYtPm9uX2Nvbmdlc3Rpb24gIT0gT0NfQkxPQ0sgJiYgbmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9BKQogCQlyZXR1cm4gRVJSX0NPTkdfTk9UX1BST1RPX0E7CiAKIAlyZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUKLWNoZWNrX25ldF9vcHRpb25zKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IG5ldF9jb25mICpuZXdfY29uZikKK2NoZWNrX25ldF9vcHRpb25zKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewogCXN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUgcnY7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IGk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcnYgPSBfY2hlY2tfbmV0X29wdGlvbnModGNvbm4sIHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpLCBuZXdfY29uZik7CisJcnYgPSBfY2hlY2tfbmV0X29wdGlvbnMoY29ubmVjdGlvbiwgcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKSwgbmV3X25ldF9jb25mKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCS8qIHRjb25uLT52b2x1bWVzIHByb3RlY3RlZCBieSBnZW5sX2xvY2soKSBoZXJlICovCi0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlpZiAoIW1kZXYtPmJpdG1hcCkgewotCQkJaWYoZHJiZF9ibV9pbml0KG1kZXYpKQorCS8qIGNvbm5lY3Rpb24tPnZvbHVtZXMgcHJvdGVjdGVkIGJ5IGdlbmxfbG9jaygpIGhlcmUgKi8KKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIGkpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoIWRldmljZS0+Yml0bWFwKSB7CisJCQlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpCiAJCQkJcmV0dXJuIEVSUl9OT01FTTsKIAkJfQogCX0KQEAgLTE5ODYsMjYgKzIwMTcsMjYgQEAKIH0KIAogc3RhdGljIGVudW0gZHJiZF9yZXRfY29kZQotYWxsb2NfY3J5cHRvKHN0cnVjdCBjcnlwdG8gKmNyeXB0bywgc3RydWN0IG5ldF9jb25mICpuZXdfY29uZikKK2FsbG9jX2NyeXB0byhzdHJ1Y3QgY3J5cHRvICpjcnlwdG8sIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewogCWNoYXIgaG1hY19uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwogCWVudW0gZHJiZF9yZXRfY29kZSBydjsKIAotCXJ2ID0gYWxsb2NfaGFzaCgmY3J5cHRvLT5jc3Vtc190Zm0sIG5ld19jb25mLT5jc3Vtc19hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmNzdW1zX3RmbSwgbmV3X25ldF9jb25mLT5jc3Vtc19hbGcsCiAJCSAgICAgICBFUlJfQ1NVTVNfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlydiA9IGFsbG9jX2hhc2goJmNyeXB0by0+dmVyaWZ5X3RmbSwgbmV3X2NvbmYtPnZlcmlmeV9hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPnZlcmlmeV90Zm0sIG5ld19uZXRfY29uZi0+dmVyaWZ5X2FsZywKIAkJICAgICAgIEVSUl9WRVJJRllfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlydiA9IGFsbG9jX2hhc2goJmNyeXB0by0+aW50ZWdyaXR5X3RmbSwgbmV3X2NvbmYtPmludGVncml0eV9hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmludGVncml0eV90Zm0sIG5ld19uZXRfY29uZi0+aW50ZWdyaXR5X2FsZywKIAkJICAgICAgIEVSUl9JTlRFR1JJVFlfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlpZiAobmV3X2NvbmYtPmNyYW1faG1hY19hbGdbMF0gIT0gMCkgeworCWlmIChuZXdfbmV0X2NvbmYtPmNyYW1faG1hY19hbGdbMF0gIT0gMCkgewogCQlzbnByaW50ZihobWFjX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsICJobWFjKCVzKSIsCi0JCQkgbmV3X2NvbmYtPmNyYW1faG1hY19hbGcpOworCQkJIG5ld19uZXRfY29uZi0+Y3JhbV9obWFjX2FsZyk7CiAKIAkJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmNyYW1faG1hY190Zm0sIGhtYWNfbmFtZSwKIAkJCSAgICAgICBFUlJfQVVUSF9BTEcpOwpAQCAtMjAyNSw4ICsyMDU2LDggQEAKIGludCBkcmJkX2FkbV9uZXRfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKLQlzdHJ1Y3QgbmV0X2NvbmYgKm9sZF9jb25mLCAqbmV3X2NvbmYgPSBOVUxMOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsICpuZXdfbmV0X2NvbmYgPSBOVUxMOwogCWludCBlcnI7CiAJaW50IG92cjsgLyogb25saW5lIHZlcmlmeSBydW5uaW5nICovCiAJaW50IHJzcjsgLyogcmUtc3luYyBydW5uaW5nICovCkBAIC0yMDM4LDk4ICsyMDY5LDEwMyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCXRjb25uID0gYWRtX2N0eC50Y29ubjsKKwljb25uZWN0aW9uID0gYWRtX2N0eC5jb25uZWN0aW9uOwogCi0JbmV3X2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2NvbmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19jb25mKSB7CisJbmV3X25ldF9jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JY29ubl9yZWNvbmZpZ19zdGFydCh0Y29ubik7CisJY29ubl9yZWNvbmZpZ19zdGFydChjb25uZWN0aW9uKTsKIAotCW11dGV4X2xvY2soJnRjb25uLT5kYXRhLm11dGV4KTsKLQltdXRleF9sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9jb25mID0gdGNvbm4tPm5ldF9jb25mOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJb2xkX25ldF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CiAKLQlpZiAoIW9sZF9jb25mKSB7CisJaWYgKCFvbGRfbmV0X2NvbmYpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oIm5ldCBjb25mIG1pc3NpbmcsIHRyeSBjb25uZWN0Iik7CiAJCXJldGNvZGUgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JKm5ld19jb25mID0gKm9sZF9jb25mOworCSpuZXdfbmV0X2NvbmYgPSAqb2xkX25ldF9jb25mOwogCWlmIChzaG91bGRfc2V0X2RlZmF1bHRzKGluZm8pKQotCQlzZXRfbmV0X2NvbmZfZGVmYXVsdHMobmV3X2NvbmYpOworCQlzZXRfbmV0X2NvbmZfZGVmYXVsdHMobmV3X25ldF9jb25mKTsKIAotCWVyciA9IG5ldF9jb25mX2Zyb21fYXR0cnNfZm9yX2NoYW5nZShuZXdfY29uZiwgaW5mbyk7CisJZXJyID0gbmV0X2NvbmZfZnJvbV9hdHRyc19mb3JfY2hhbmdlKG5ld19uZXRfY29uZiwgaW5mbyk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT01TRykgewogCQlyZXRjb2RlID0gRVJSX01BTkRBVE9SWV9UQUc7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKGZyb21fYXR0cnNfZXJyX3RvX3R4dChlcnIpKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyh0Y29ubiwgbmV3X2NvbmYpOworCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyhjb25uZWN0aW9uLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKIAkvKiByZS1zeW5jIHJ1bm5pbmcgKi8KLQlyc3IgPSBjb25uX3Jlc3luY19ydW5uaW5nKHRjb25uKTsKLQlpZiAocnNyICYmIHN0cmNtcChuZXdfY29uZi0+Y3N1bXNfYWxnLCBvbGRfY29uZi0+Y3N1bXNfYWxnKSkgeworCXJzciA9IGNvbm5fcmVzeW5jX3J1bm5pbmcoY29ubmVjdGlvbik7CisJaWYgKHJzciAmJiBzdHJjbXAobmV3X25ldF9jb25mLT5jc3Vtc19hbGcsIG9sZF9uZXRfY29uZi0+Y3N1bXNfYWxnKSkgewogCQlyZXRjb2RlID0gRVJSX0NTVU1TX1JFU1lOQ19SVU5OSU5HOwogCQlnb3RvIGZhaWw7CiAJfQogCiAJLyogb25saW5lIHZlcmlmeSBydW5uaW5nICovCi0Jb3ZyID0gY29ubl9vdl9ydW5uaW5nKHRjb25uKTsKLQlpZiAob3ZyICYmIHN0cmNtcChuZXdfY29uZi0+dmVyaWZ5X2FsZywgb2xkX2NvbmYtPnZlcmlmeV9hbGcpKSB7CisJb3ZyID0gY29ubl9vdl9ydW5uaW5nKGNvbm5lY3Rpb24pOworCWlmIChvdnIgJiYgc3RyY21wKG5ld19uZXRfY29uZi0+dmVyaWZ5X2FsZywgb2xkX25ldF9jb25mLT52ZXJpZnlfYWxnKSkgewogCQlyZXRjb2RlID0gRVJSX1ZFUklGWV9SVU5OSU5HOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0Y29kZSA9IGFsbG9jX2NyeXB0bygmY3J5cHRvLCBuZXdfY29uZik7CisJcmV0Y29kZSA9IGFsbG9jX2NyeXB0bygmY3J5cHRvLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBuZXdfY29uZik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBuZXdfbmV0X2NvbmYpOwogCiAJaWYgKCFyc3IpIHsKLQkJY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+Y3N1bXNfdGZtKTsKLQkJdGNvbm4tPmNzdW1zX3RmbSA9IGNyeXB0by5jc3Vtc190Zm07CisJCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJY29ubmVjdGlvbi0+Y3N1bXNfdGZtID0gY3J5cHRvLmNzdW1zX3RmbTsKIAkJY3J5cHRvLmNzdW1zX3RmbSA9IE5VTEw7CiAJfQogCWlmICghb3ZyKSB7Ci0JCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPnZlcmlmeV90Zm0pOwotCQl0Y29ubi0+dmVyaWZ5X3RmbSA9IGNyeXB0by52ZXJpZnlfdGZtOworCQljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOworCQljb25uZWN0aW9uLT52ZXJpZnlfdGZtID0gY3J5cHRvLnZlcmlmeV90Zm07CiAJCWNyeXB0by52ZXJpZnlfdGZtID0gTlVMTDsKIAl9CiAKLQljcnlwdG9fZnJlZV9oYXNoKHRjb25uLT5pbnRlZ3JpdHlfdGZtKTsKLQl0Y29ubi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOwotCWlmICh0Y29ubi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiB0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDEwMCkKLQkJLyogRG8gdGhpcyB3aXRob3V0IHRyeWluZyB0byB0YWtlIHRjb25uLT5kYXRhLm11dGV4IGFnYWluLiAgKi8KLQkJX19kcmJkX3NlbmRfcHJvdG9jb2wodGNvbm4sIFBfUFJPVE9DT0xfVVBEQVRFKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPmludGVncml0eV90Zm0pOworCWNvbm5lY3Rpb24tPmludGVncml0eV90Zm0gPSBjcnlwdG8uaW50ZWdyaXR5X3RmbTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKQorCQkvKiBEbyB0aGlzIHdpdGhvdXQgdHJ5aW5nIHRvIHRha2UgY29ubmVjdGlvbi0+ZGF0YS5tdXRleCBhZ2Fpbi4gICovCisJCV9fZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24sIFBfUFJPVE9DT0xfVVBEQVRFKTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPmNyYW1faG1hY190Zm0pOwotCXRjb25uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtKTsKKwljb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CiAKLQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+ZGF0YS5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAJc3luY2hyb25pemVfcmN1KCk7Ci0Ja2ZyZWUob2xkX2NvbmYpOworCWtmcmVlKG9sZF9uZXRfY29uZik7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCWRyYmRfc2VuZF9zeW5jX3BhcmFtKG1pbm9yX3RvX21kZXYoY29ubl9sb3dlc3RfbWlub3IodGNvbm4pKSk7CisJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCQlpbnQgdm5yOworCisJCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKQorCQkJZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOworCX0KIAogCWdvdG8gZG9uZTsKIAogIGZhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOwogCWZyZWVfY3J5cHRvKCZjcnlwdG8pOwotCWtmcmVlKG5ld19jb25mKTsKKwlrZnJlZShuZXdfbmV0X2NvbmYpOwogIGRvbmU6Ci0JY29ubl9yZWNvbmZpZ19kb25lKHRjb25uKTsKKwljb25uX3JlY29uZmlnX2RvbmUoY29ubmVjdGlvbik7CiAgb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTIxMzcsMTAgKzIxNzMsMTEgQEAKIAogaW50IGRyYmRfYWRtX2Nvbm5lY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwotCXN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmYsICpuZXdfY29uZiA9IE5VTEw7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBuZXRfY29uZiAqb2xkX25ldF9jb25mLCAqbmV3X25ldF9jb25mID0gTlVMTDsKIAlzdHJ1Y3QgY3J5cHRvIGNyeXB0byA9IHsgfTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAJaW50IGk7CiAJaW50IGVycjsKQEAgLTIxNjAsMTA2ICsyMTk3LDExMSBAQAogCS8qIE5vIG5lZWQgZm9yIF9yY3UgaGVyZS4gQWxsIHJlY29uZmlndXJhdGlvbiBpcwogCSAqIHN0cmljdGx5IHNlcmlhbGl6ZWQgb24gZ2VubF9sb2NrKCkuIFdlIGFyZSBwcm90ZWN0ZWQgYWdhaW5zdAogCSAqIGNvbmN1cnJlbnQgcmVjb25maWd1cmF0aW9uL2FkZGl0aW9uL2RlbGV0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0Y29ubiwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA9PSB0Y29ubi0+bXlfYWRkcl9sZW4gJiYKLQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgJnRjb25uLT5teV9hZGRyLCB0Y29ubi0+bXlfYWRkcl9sZW4pKSB7Ci0JCQlyZXRjb2RlID0gRVJSX0xPQ0FMX0FERFI7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWZvcl9lYWNoX3Jlc291cmNlKHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA9PSBjb25uZWN0aW9uLT5teV9hZGRyX2xlbiAmJgorCQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgJmNvbm5lY3Rpb24tPm15X2FkZHIsCisJCQkJICAgIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuKSkgeworCQkJCXJldGNvZGUgPSBFUlJfTE9DQUxfQUREUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAotCQlpZiAobmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikgPT0gdGNvbm4tPnBlZXJfYWRkcl9sZW4gJiYKLQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLCAmdGNvbm4tPnBlZXJfYWRkciwgdGNvbm4tPnBlZXJfYWRkcl9sZW4pKSB7Ci0JCQlyZXRjb2RlID0gRVJSX1BFRVJfQUREUjsKLQkJCWdvdG8gb3V0OworCQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5wZWVyX2FkZHIpID09IGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gJiYKKwkJCSAgICAhbWVtY21wKG5sYV9kYXRhKGFkbV9jdHgucGVlcl9hZGRyKSwgJmNvbm5lY3Rpb24tPnBlZXJfYWRkciwKKwkJCQkgICAgY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbikpIHsKKwkJCQlyZXRjb2RlID0gRVJSX1BFRVJfQUREUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCX0KIAotCXRjb25uID0gYWRtX2N0eC50Y29ubjsKLQljb25uX3JlY29uZmlnX3N0YXJ0KHRjb25uKTsKKwljb25uZWN0aW9uID0gZmlyc3RfY29ubmVjdGlvbihhZG1fY3R4LnJlc291cmNlKTsKKwljb25uX3JlY29uZmlnX3N0YXJ0KGNvbm5lY3Rpb24pOwogCi0JaWYgKHRjb25uLT5jc3RhdGUgPiBDX1NUQU5EQUxPTkUpIHsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID4gQ19TVEFOREFMT05FKSB7CiAJCXJldGNvZGUgPSBFUlJfTkVUX0NPTkZJR1VSRUQ7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBhbGxvY2F0aW9uIG5vdCBpbiB0aGUgSU8gcGF0aCwgZHJiZHNldHVwIC8gbmV0bGluayBwcm9jZXNzIGNvbnRleHQgKi8KLQluZXdfY29uZiA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY29uZiksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X2NvbmYpIHsKKwluZXdfbmV0X2NvbmYgPSBremFsbG9jKHNpemVvZigqbmV3X25ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKIAkJZ290byBmYWlsOwogCX0KIAotCXNldF9uZXRfY29uZl9kZWZhdWx0cyhuZXdfY29uZik7CisJc2V0X25ldF9jb25mX2RlZmF1bHRzKG5ld19uZXRfY29uZik7CiAKLQllcnIgPSBuZXRfY29uZl9mcm9tX2F0dHJzKG5ld19jb25mLCBpbmZvKTsKKwllcnIgPSBuZXRfY29uZl9mcm9tX2F0dHJzKG5ld19uZXRfY29uZiwgaW5mbyk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT01TRykgewogCQlyZXRjb2RlID0gRVJSX01BTkRBVE9SWV9UQUc7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKGZyb21fYXR0cnNfZXJyX3RvX3R4dChlcnIpKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyh0Y29ubiwgbmV3X2NvbmYpOworCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyhjb25uZWN0aW9uLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQlyZXRjb2RlID0gYWxsb2NfY3J5cHRvKCZjcnlwdG8sIG5ld19jb25mKTsKKwlyZXRjb2RlID0gYWxsb2NfY3J5cHRvKCZjcnlwdG8sIG5ld19uZXRfY29uZik7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmFpbDsKIAotCSgoY2hhciAqKW5ld19jb25mLT5zaGFyZWRfc2VjcmV0KVtTSEFSRURfU0VDUkVUX01BWC0xXSA9IDA7CisJKChjaGFyICopbmV3X25ldF9jb25mLT5zaGFyZWRfc2VjcmV0KVtTSEFSRURfU0VDUkVUX01BWC0xXSA9IDA7CiAKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZSh0Y29ubik7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAotCW11dGV4X2xvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0Jb2xkX2NvbmYgPSB0Y29ubi0+bmV0X2NvbmY7Ci0JaWYgKG9sZF9jb25mKSB7CisJbXV0ZXhfbG9jaygmYWRtX2N0eC5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9uZXRfY29uZiA9IGNvbm5lY3Rpb24tPm5ldF9jb25mOworCWlmIChvbGRfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9ORVRfQ09ORklHVVJFRDsKLQkJbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOworCQltdXRleF91bmxvY2soJmFkbV9jdHgucmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAkJZ290byBmYWlsOwogCX0KLQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBuZXdfY29uZik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBuZXdfbmV0X2NvbmYpOwogCi0JY29ubl9mcmVlX2NyeXB0byh0Y29ubik7Ci0JdGNvbm4tPmNyYW1faG1hY190Zm0gPSBjcnlwdG8uY3JhbV9obWFjX3RmbTsKLQl0Y29ubi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOwotCXRjb25uLT5jc3Vtc190Zm0gPSBjcnlwdG8uY3N1bXNfdGZtOwotCXRjb25uLT52ZXJpZnlfdGZtID0gY3J5cHRvLnZlcmlmeV90Zm07CisJY29ubl9mcmVlX2NyeXB0byhjb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CisJY29ubmVjdGlvbi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOworCWNvbm5lY3Rpb24tPmNzdW1zX3RmbSA9IGNyeXB0by5jc3Vtc190Zm07CisJY29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IGNyeXB0by52ZXJpZnlfdGZtOwogCi0JdGNvbm4tPm15X2FkZHJfbGVuID0gbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpOwotCW1lbWNweSgmdGNvbm4tPm15X2FkZHIsIG5sYV9kYXRhKGFkbV9jdHgubXlfYWRkciksIHRjb25uLT5teV9hZGRyX2xlbik7Ci0JdGNvbm4tPnBlZXJfYWRkcl9sZW4gPSBubGFfbGVuKGFkbV9jdHgucGVlcl9hZGRyKTsKLQltZW1jcHkoJnRjb25uLT5wZWVyX2FkZHIsIG5sYV9kYXRhKGFkbV9jdHgucGVlcl9hZGRyKSwgdGNvbm4tPnBlZXJfYWRkcl9sZW4pOworCWNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID0gbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpOworCW1lbWNweSgmY29ubmVjdGlvbi0+bXlfYWRkciwgbmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4pOworCWNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gPSBubGFfbGVuKGFkbV9jdHgucGVlcl9hZGRyKTsKKwltZW1jcHkoJmNvbm5lY3Rpb24tPnBlZXJfYWRkciwgbmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuKTsKIAotCW11dGV4X3VubG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmFkbV9jdHgucmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCBpKSB7Ci0JCW1kZXYtPnNlbmRfY250ID0gMDsKLQkJbWRldi0+cmVjdl9jbnQgPSAwOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgaSkgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRldmljZS0+c2VuZF9jbnQgPSAwOworCQlkZXZpY2UtPnJlY3ZfY250ID0gMDsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXRjb2RlID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX1VOQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CisJcmV0Y29kZSA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1VOQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CiAKLQljb25uX3JlY29uZmlnX2RvbmUodGNvbm4pOworCWNvbm5fcmVjb25maWdfZG9uZShjb25uZWN0aW9uKTsKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiAKIGZhaWw6CiAJZnJlZV9jcnlwdG8oJmNyeXB0byk7Ci0Ja2ZyZWUobmV3X2NvbmYpOworCWtmcmVlKG5ld19uZXRfY29uZik7CiAKLQljb25uX3JlY29uZmlnX2RvbmUodGNvbm4pOworCWNvbm5fcmVjb25maWdfZG9uZShjb25uZWN0aW9uKTsKIG91dDoKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgY29ubl90cnlfZGlzY29ubmVjdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGJvb2wgZm9yY2UpCitzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGNvbm5fdHJ5X2Rpc2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgYm9vbCBmb3JjZSkKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwKKwlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLAogCQkJZm9yY2UgPyBDU19IQVJEIDogMCk7CiAKIAlzd2l0Y2ggKHJ2KSB7CkBAIC0yMjY5LDE4ICsyMzExLDE4IEBACiAJCXJldHVybiBTU19TVUNDRVNTOwogCWNhc2UgU1NfUFJJTUFSWV9OT1A6CiAJCS8qIE91ciBzdGF0ZSBjaGVja2luZyBjb2RlIHdhbnRzIHRvIHNlZSB0aGUgcGVlciBvdXRkYXRlZC4gKi8KLQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsIHBkc2ssIERfT1VUREFURUQpLCAwKTsKKwkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMyKGNvbm4sIENfRElTQ09OTkVDVElORywgcGRzaywgRF9PVVREQVRFRCksIDApOwogCiAJCWlmIChydiA9PSBTU19PVVREQVRFX1dPX0NPTk4pIC8qIGxvc3QgY29ubmVjdGlvbiBiZWZvcmUgZ3JhY2VmdWwgZGlzY29ubmVjdCBzdWNjZWVkZWQgKi8KLQkJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19WRVJCT1NFKTsKKwkJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX1ZFUkJPU0UpOwogCiAJCWJyZWFrOwogCWNhc2UgU1NfQ1dfRkFJTEVEX0JZX1BFRVI6CiAJCS8qIFRoZSBwZWVyIHByb2JhYmx5IHdhbnRzIHRvIHNlZSB1cyBvdXRkYXRlZC4gKi8KLQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsCisJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsCiAJCQkJCQkJZGlzaywgRF9PVVREQVRFRCksIDApOwogCQlpZiAocnYgPT0gU1NfSVNfRElTS0xFU1MgfHwgcnYgPT0gU1NfTE9XRVJfVEhBTl9PVVREQVRFRCkgewotCQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksCisJCQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLAogCQkJCQlDU19IQVJEKTsKIAkJfQogCQlicmVhazsKQEAgLTIyOTQsMTggKzIzMzYsMTggQEAKIAkJICogVGhlIHN0YXRlIGhhbmRsaW5nIG9ubHkgdXNlcyBkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgpLAogCQkgKiB3ZSB3YW50IHRvIHJlYWxseSB3YWl0IGhlcmUgdW50aWwgdGhlIHJlY2VpdmVyIGlzIG5vIG1vcmUuCiAJCSAqLwotCQlkcmJkX3RocmVhZF9zdG9wKCZhZG1fY3R4LnRjb25uLT5yZWNlaXZlcik7CisJCWRyYmRfdGhyZWFkX3N0b3AoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCQkvKiBSYWNlIGJyZWFrZXIuICBUaGlzIGFkZGl0aW9uYWwgc3RhdGUgY2hhbmdlIHJlcXVlc3QgbWF5IGJlCiAJCSAqIG5lY2Vzc2FyeSwgaWYgdGhpcyB3YXMgYSBmb3JjZWQgZGlzY29ubmVjdCBkdXJpbmcgYSByZWNlaXZlcgogCQkgKiByZXN0YXJ0LiAgV2UgbWF5IGhhdmUgImtpbGxlZCIgdGhlIHJlY2VpdmVyIHRocmVhZCBqdXN0Ci0JCSAqIGFmdGVyIGRyYmRkX2luaXQoKSByZXR1cm5lZC4gIFR5cGljYWxseSwgd2Ugc2hvdWxkIGJlCisJCSAqIGFmdGVyIGRyYmRfcmVjZWl2ZXIoKSByZXR1cm5lZC4gIFR5cGljYWxseSwgd2Ugc2hvdWxkIGJlCiAJCSAqIENfU1RBTkRBTE9ORSBhbHJlYWR5LCBub3csIGFuZCB0aGlzIGJlY29tZXMgYSBuby1vcC4KIAkJICovCi0JCXJ2MiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19TVEFOREFMT05FKSwKKwkJcnYyID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksCiAJCQkJQ1NfVkVSQk9TRSB8IENTX0hBUkQpOwogCQlpZiAocnYyIDwgU1NfU1VDQ0VTUykKLQkJCWNvbm5fZXJyKHRjb25uLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwKIAkJCQkidW5leHBlY3RlZCBydjI9JWQgaW4gY29ubl90cnlfZGlzY29ubmVjdCgpXG4iLAogCQkJCXJ2Mik7CiAJfQpAQCAtMjMxNSw3ICsyMzU3LDcgQEAKIGludCBkcmJkX2FkbV9kaXNjb25uZWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRpc2Nvbm5lY3RfcGFybXMgcGFybXM7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwogCWludCBlcnI7CkBAIC0yMzI2LDcgKzIzNjgsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQl0Y29ubiA9IGFkbV9jdHgudGNvbm47CisJY29ubmVjdGlvbiA9IGFkbV9jdHguY29ubmVjdGlvbjsKIAltZW1zZXQoJnBhcm1zLCAwLCBzaXplb2YocGFybXMpKTsKIAlpZiAoaW5mby0+YXR0cnNbRFJCRF9OTEFfRElTQ09OTkVDVF9QQVJNU10pIHsKIAkJZXJyID0gZGlzY29ubmVjdF9wYXJtc19mcm9tX2F0dHJzKCZwYXJtcywgaW5mbyk7CkBAIC0yMzM3LDcgKzIzNzksNyBAQAogCQl9CiAJfQogCi0JcnYgPSBjb25uX3RyeV9kaXNjb25uZWN0KHRjb25uLCBwYXJtcy5mb3JjZV9kaXNjb25uZWN0KTsKKwlydiA9IGNvbm5fdHJ5X2Rpc2Nvbm5lY3QoY29ubmVjdGlvbiwgcGFybXMuZm9yY2VfZGlzY29ubmVjdCk7CiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKIAkJcmV0Y29kZSA9IHJ2OyAgLyogRklYTUU6IFR5cGUgbWlzbWF0Y2guICovCiAJZWxzZQpAQCAtMjM0NywyNyArMjM4OSwyNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCByZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IGlhc3M7IC8qIEkgYW0gc3luYyBzb3VyY2UgKi8KIAotCWRldl9pbmZvKERFViwgIlJlc3luYyBvZiBuZXcgc3RvcmFnZSBhZnRlciBvbmxpbmUgZ3Jvd1xuIik7Ci0JaWYgKG1kZXYtPnN0YXRlLnJvbGUgIT0gbWRldi0+c3RhdGUucGVlcikKLQkJaWFzcyA9IChtZGV2LT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSk7CisJZHJiZF9pbmZvKGRldmljZSwgIlJlc3luYyBvZiBuZXcgc3RvcmFnZSBhZnRlciBvbmxpbmUgZ3Jvd1xuIik7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSAhPSBkZXZpY2UtPnN0YXRlLnBlZXIpCisJCWlhc3MgPSAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSk7CiAJZWxzZQotCQlpYXNzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCQlpYXNzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5mbGFncyk7CiAKIAlpZiAoaWFzcykKLQkJZHJiZF9zdGFydF9yZXN5bmMobWRldiwgQ19TWU5DX1NPVVJDRSk7CisJCWRyYmRfc3RhcnRfcmVzeW5jKGRldmljZSwgQ19TWU5DX1NPVVJDRSk7CiAJZWxzZQotCQlfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSArIENTX1NFUklBTElaRSk7CisJCV9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUyhjb25uLCBDX1dGX1NZTkNfVVVJRCksIENTX1ZFUkJPU0UgKyBDU19TRVJJQUxJWkUpOwogfQogCiBpbnQgZHJiZF9hZG1fcmVzaXplKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRpc2tfY29uZiAqb2xkX2Rpc2tfY29uZiwgKm5ld19kaXNrX2NvbmYgPSBOVUxMOwogCXN0cnVjdCByZXNpemVfcGFybXMgcnM7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKIAllbnVtIGRldGVybWluZV9kZXZfc2l6ZSBkZDsKIAlib29sIGNoYW5nZV9hbF9sYXlvdXQgPSBmYWxzZTsKQEAgLTIzODEsMTUgKzI0MjMsMTUgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBmYWlsOwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCXJldGNvZGUgPSBFUlJfTk9fRElTSzsKIAkJZ290byBmYWlsOwogCX0KIAogCW1lbXNldCgmcnMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzaXplX3Bhcm1zKSk7Ci0JcnMuYWxfc3RyaXBlcyA9IG1kZXYtPmxkZXYtPm1kLmFsX3N0cmlwZXM7Ci0JcnMuYWxfc3RyaXBlX3NpemUgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAqIDQ7CisJcnMuYWxfc3RyaXBlcyA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlczsKKwlycy5hbF9zdHJpcGVfc2l6ZSA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGsgKiA0OwogCWlmIChpbmZvLT5hdHRyc1tEUkJEX05MQV9SRVNJWkVfUEFSTVNdKSB7CiAJCWVyciA9IHJlc2l6ZV9wYXJtc19mcm9tX2F0dHJzKCZycywgaW5mbyk7CiAJCWlmIChlcnIpIHsKQEAgLTIzOTksMjQgKzI0NDEsMjQgQEAKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID4gQ19DT05ORUNURUQpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID4gQ19DT05ORUNURUQpIHsKIAkJcmV0Y29kZSA9IEVSUl9SRVNJWkVfUkVTWU5DOwogCQlnb3RvIGZhaWxfbGRldjsKIAl9CiAKLQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSAmJgotCSAgICBtZGV2LT5zdGF0ZS5wZWVyID09IFJfU0VDT05EQVJZKSB7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSAmJgorCSAgICBkZXZpY2UtPnN0YXRlLnBlZXIgPT0gUl9TRUNPTkRBUlkpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT19QUklNQVJZOwogCQlnb3RvIGZhaWxfbGRldjsKIAl9CiAKLQlpZiAocnMubm9fcmVzeW5jICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MykgeworCWlmIChycy5ub19yZXN5bmMgJiYgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTMpIHsKIAkJcmV0Y29kZSA9IEVSUl9ORUVEX0FQVl85MzsKIAkJZ290byBmYWlsX2xkZXY7CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCXVfc2l6ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CisJdV9zaXplID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh1X3NpemUgIT0gKHNlY3Rvcl90KXJzLnJlc2l6ZV9zaXplKSB7CiAJCW5ld19kaXNrX2NvbmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19jb25mKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNDI2LDggKzI0NjgsOCBAQAogCQl9CiAJfQogCi0JaWYgKG1kZXYtPmxkZXYtPm1kLmFsX3N0cmlwZXMgIT0gcnMuYWxfc3RyaXBlcyB8fAotCSAgICBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAhPSBycy5hbF9zdHJpcGVfc2l6ZSAvIDQpIHsKKwlpZiAoZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVzICE9IHJzLmFsX3N0cmlwZXMgfHwKKwkgICAgZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAhPSBycy5hbF9zdHJpcGVfc2l6ZSAvIDQpIHsKIAkJdTMyIGFsX3NpemVfayA9IHJzLmFsX3N0cmlwZXMgKiBycy5hbF9zdHJpcGVfc2l6ZTsKIAogCQlpZiAoYWxfc2l6ZV9rID4gKDE2ICogMTAyNCAqIDEwMjQpKSB7CkBAIC0yNDQwLDcgKzI0ODIsNyBAQAogCQkJZ290byBmYWlsX2xkZXY7CiAJCX0KIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiAhPSBDX0NPTk5FQ1RFRCkgeworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uICE9IENfQ09OTkVDVEVEKSB7CiAJCQlyZXRjb2RlID0gRVJSX01EX0xBWU9VVF9DT05ORUNURUQ7CiAJCQlnb3RvIGZhaWxfbGRldjsKIAkJfQpAQCAtMjQ0OCwyNCArMjQ5MCwyNCBAQAogCQljaGFuZ2VfYWxfbGF5b3V0ID0gdHJ1ZTsKIAl9CiAKLQlpZiAobWRldi0+bGRldi0+a25vd25fc2l6ZSAhPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYpKQotCQltZGV2LT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplICE9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2KSkKKwkJZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYpIHsKLQkJbXV0ZXhfbG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKLQkJb2xkX2Rpc2tfY29uZiA9IG1kZXYtPmxkZXYtPmRpc2tfY29uZjsKKwkJbXV0ZXhfbG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCQlvbGRfZGlza19jb25mID0gZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmY7CiAJCSpuZXdfZGlza19jb25mID0gKm9sZF9kaXNrX2NvbmY7CiAJCW5ld19kaXNrX2NvbmYtPmRpc2tfc2l6ZSA9IChzZWN0b3JfdClycy5yZXNpemVfc2l6ZTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG1kZXYtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7Ci0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlrZnJlZShvbGRfZGlza19jb25mKTsKIAl9CiAKIAlkZHNmID0gKHJzLnJlc2l6ZV9mb3JjZSA/IEREU0ZfRk9SQ0VEIDogMCkgfCAocnMubm9fcmVzeW5jID8gRERTRl9OT19SRVNZTkMgOiAwKTsKLQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIGRkc2YsIGNoYW5nZV9hbF9sYXlvdXQgPyAmcnMgOiBOVUxMKTsKLQlkcmJkX21kX3N5bmMobWRldik7Ci0JcHV0X2xkZXYobWRldik7CisJZGQgPSBkcmJkX2RldGVybWluZV9kZXZfc2l6ZShkZXZpY2UsIGRkc2YsIGNoYW5nZV9hbF9sYXlvdXQgPyAmcnMgOiBOVUxMKTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCWlmIChkZCA9PSBEU19FUlJPUikgewogCQlyZXRjb2RlID0gRVJSX05PTUVNX0JJVE1BUDsKIAkJZ290byBmYWlsOwpAQCAtMjQ3NywxMiArMjUxOSwxMiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEKSB7CiAJCWlmIChkZCA9PSBEU19HUkVXKQotCQkJc2V0X2JpdChSRVNJWkVfUEVORElORywgJm1kZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoUkVTSVpFX1BFTkRJTkcsICZkZXZpY2UtPmZsYWdzKTsKIAotCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9zaXplcyhtZGV2LCAxLCBkZHNmKTsKKwkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfc2l6ZXMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgMSwgZGRzZik7CiAJfQogCiAgZmFpbDoKQEAgLTI0OTAsMTQgKzI1MzIsMTMgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWxfbGRldjoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCWdvdG8gZmFpbDsKIH0KIAogaW50IGRyYmRfYWRtX3Jlc291cmNlX29wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CiAJc3RydWN0IHJlc19vcHRzIHJlc19vcHRzOwogCWludCBlcnI7CiAKQEAgLTI1MDYsOSArMjU0Nyw4IEBACiAJCXJldHVybiByZXRjb2RlOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7Ci0JdGNvbm4gPSBhZG1fY3R4LnRjb25uOwogCi0JcmVzX29wdHMgPSB0Y29ubi0+cmVzX29wdHM7CisJcmVzX29wdHMgPSBhZG1fY3R4LnJlc291cmNlLT5yZXNfb3B0czsKIAlpZiAoc2hvdWxkX3NldF9kZWZhdWx0cyhpbmZvKSkKIAkJc2V0X3Jlc19vcHRzX2RlZmF1bHRzKCZyZXNfb3B0cyk7CiAKQEAgLTI1MTksNyArMjU1OSw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQllcnIgPSBzZXRfcmVzb3VyY2Vfb3B0aW9ucyh0Y29ubiwgJnJlc19vcHRzKTsKKwllcnIgPSBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhhZG1fY3R4LnJlc291cmNlLCAmcmVzX29wdHMpOwogCWlmIChlcnIpIHsKIAkJcmV0Y29kZSA9IEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJCWlmIChlcnIgPT0gLUVOT01FTSkKQEAgLTI1MzMsNyArMjU3Myw3IEBACiAKIGludCBkcmJkX2FkbV9pbnZhbGlkYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlpbnQgcmV0Y29kZTsgLyogZW51bSBkcmJkX3JldF9jb2RlIHJzcC4gZW51bSBkcmJkX3N0YXRlX3J2ICovCiAKIAlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIERSQkRfQURNX05FRURfTUlOT1IpOwpAQCAtMjU0MiwyOSArMjU4MiwyOSBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiBJZiB0aGVyZSBpcyBzdGlsbCBiaXRtYXAgSU8gcGVuZGluZywgcHJvYmFibHkgYmVjYXVzZSBvZiBhIHByZXZpb3VzCiAJICogcmVzeW5jIGp1c3QgYmVpbmcgZmluaXNoZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSByZXF1ZXN0aW5nIGEgbmV3IHJlc3luYy4KIAkgKiBBbHNvIHdhaXQgZm9yIGl0J3MgYWZ0ZXJfc3RhdGVfY2goKS4gKi8KLQlkcmJkX3N1c3BlbmRfaW8obWRldik7Ci0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZtZGV2LT5mbGFncykpOwotCWRyYmRfZmx1c2hfd29ya3F1ZXVlKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAogCS8qIElmIHdlIGhhcHBlbiB0byBiZSBDX1NUQU5EQUxPTkUgUl9TRUNPTkRBUlksIGp1c3QgY2hhbmdlIHRvCiAJICogRF9JTkNPTlNJU1RFTlQsIGFuZCBzZXQgYWxsIGJpdHMgaW4gdGhlIGJpdG1hcC4gIE90aGVyd2lzZSwKIAkgKiB0cnkgdG8gc3RhcnQgYSByZXN5bmMgaGFuZHNoYWtlIGFzIHN5bmMgdGFyZ2V0IGZvciBmdWxsIHN5bmMuCiAJICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhkaXNrLCBEX0lOQ09OU0lTVEVOVCkpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgeworCQlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoZGlzaywgRF9JTkNPTlNJU1RFTlQpKTsKIAkJaWYgKHJldGNvZGUgPj0gU1NfU1VDQ0VTUykgewotCQkJaWYgKGRyYmRfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtaW9fc2V0X25fd3JpdGUsCisJCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAogCQkJCSJzZXRfbl93cml0ZSBmcm9tIGludmFsaWRhdGUiLCBCTV9MT0NLRURfTUFTSykpCiAJCQkJcmV0Y29kZSA9IEVSUl9JT19NRF9ESVNLOwogCQl9CiAJfSBlbHNlCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19TVEFSVElOR19TWU5DX1QpKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfU1RBUlRJTkdfU1lOQ19UKSk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI1ODIsMjUgKzI2MjIsMjUgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBvdXQ7CiAKLQlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHgubWRldiwgbWFzaywgdmFsKTsKKwlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBtYXNrLCB2YWwpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcmJkX2JtaW9fc2V0X3N1c3BfYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgZHJiZF9ibWlvX3NldF9zdXNwX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBydjsKIAotCXJ2ID0gZHJiZF9ibWlvX3NldF9uX3dyaXRlKG1kZXYpOwotCWRyYmRfc3VzcGVuZF9hbChtZGV2KTsKKwlydiA9IGRyYmRfYm1pb19zZXRfbl93cml0ZShkZXZpY2UpOworCWRyYmRfc3VzcGVuZF9hbChkZXZpY2UpOwogCXJldHVybiBydjsKIH0KIAogaW50IGRyYmRfYWRtX2ludmFsaWRhdGVfcGVlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWludCByZXRjb2RlOyAvKiBkcmJkX3JldF9jb2RlLCBkcmJkX3N0YXRlX3J2ICovCi0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9NSU5PUik7CiAJaWYgKCFhZG1fY3R4LnJlcGx5X3NrYikKQEAgLTI2MDgsMzIgKzI2NDgsMzIgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBvdXQ7CiAKLQltZGV2ID0gYWRtX2N0eC5tZGV2OworCWRldmljZSA9IGFkbV9jdHguZGV2aWNlOwogCiAJLyogSWYgdGhlcmUgaXMgc3RpbGwgYml0bWFwIElPIHBlbmRpbmcsIHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBwcmV2aW91cwogCSAqIHJlc3luYyBqdXN0IGJlaW5nIGZpbmlzaGVkLCB3YWl0IGZvciBpdCBiZWZvcmUgcmVxdWVzdGluZyBhIG5ldyByZXN5bmMuCiAJICogQWxzbyB3YWl0IGZvciBpdCdzIGFmdGVyX3N0YXRlX2NoKCkuICovCi0JZHJiZF9zdXNwZW5kX2lvKG1kZXYpOwotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX3N1c3BlbmRfaW8oZGV2aWNlKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpOworCWRyYmRfZmx1c2hfd29ya3F1ZXVlKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yayk7CiAKIAkvKiBJZiB3ZSBoYXBwZW4gdG8gYmUgQ19TVEFOREFMT05FIFJfUFJJTUFSWSwganVzdCBzZXQgYWxsIGJpdHMKIAkgKiBpbiB0aGUgYml0bWFwLiAgT3RoZXJ3aXNlLCB0cnkgdG8gc3RhcnQgYSByZXN5bmMgaGFuZHNoYWtlCiAJICogYXMgc3luYyBzb3VyY2UgZm9yIGZ1bGwgc3luYy4KIAkgKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJiBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCS8qIFRoZSBwZWVyIHdpbGwgZ2V0IGEgcmVzeW5jIHVwb24gY29ubmVjdCBhbnl3YXlzLiBKdXN0IG1ha2UgdGhhdAogCQkgICBpbnRvIGEgZnVsbCByZXN5bmMuICovCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMocGRzaywgRF9JTkNPTlNJU1RFTlQpKTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKHBkc2ssIERfSU5DT05TSVNURU5UKSk7CiAJCWlmIChyZXRjb2RlID49IFNTX1NVQ0NFU1MpIHsKLQkJCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibWlvX3NldF9zdXNwX2FsLAorCQkJaWYgKGRyYmRfYml0bWFwX2lvKGRldmljZSwgJmRyYmRfYm1pb19zZXRfc3VzcF9hbCwKIAkJCQkic2V0X25fd3JpdGUgZnJvbSBpbnZhbGlkYXRlX3BlZXIiLAogCQkJCUJNX0xPQ0tFRF9TRVRfQUxMT1dFRCkpCiAJCQkJcmV0Y29kZSA9IEVSUl9JT19NRF9ESVNLOwogCQl9CiAJfSBlbHNlCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19TVEFSVElOR19TWU5DX1MpKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfU1RBUlRJTkdfU1lOQ19TKSk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI2NTAsNyArMjY5MCw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRyYmRfcmVxdWVzdF9zdGF0ZShhZG1fY3R4Lm1kZXYsIE5TKHVzZXJfaXNwLCAxKSkgPT0gU1NfTk9USElOR19UT19ETykKKwlpZiAoZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBOUyh1c2VyX2lzcCwgMSkpID09IFNTX05PVEhJTkdfVE9fRE8pCiAJCXJldGNvZGUgPSBFUlJfUEFVU0VfSVNfU0VUOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI2NjgsOCArMjcwOCw4IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRyYmRfcmVxdWVzdF9zdGF0ZShhZG1fY3R4Lm1kZXYsIE5TKHVzZXJfaXNwLCAwKSkgPT0gU1NfTk9USElOR19UT19ETykgewotCQlzID0gYWRtX2N0eC5tZGV2LT5zdGF0ZTsKKwlpZiAoZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBOUyh1c2VyX2lzcCwgMCkpID09IFNTX05PVEhJTkdfVE9fRE8pIHsKKwkJcyA9IGFkbV9jdHguZGV2aWNlLT5zdGF0ZTsKIAkJaWYgKHMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MgfHwgcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCkgewogCQkJcmV0Y29kZSA9IHMuYWZ0cl9pc3AgPyBFUlJfUElDX0FGVEVSX0RFUCA6CiAJCQkJICBzLnBlZXJfaXNwID8gRVJSX1BJQ19QRUVSX0RFUCA6IEVSUl9QQVVTRV9JU19DTEVBUjsKQEAgLTI2OTAsNyArMjczMCw3IEBACiAKIGludCBkcmJkX2FkbV9yZXN1bWVfaW8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCByZXRjb2RlOyAvKiBlbnVtIGRyYmRfcmV0X2NvZGUgcnNwLiBlbnVtIGRyYmRfc3RhdGVfcnYgKi8KIAogCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9NSU5PUik7CkBAIC0yNjk5LDIwICsyNzM5LDIwIEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwlkZXZpY2UgPSBhZG1fY3R4LmRldmljZTsKKwlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncykpIHsKKwkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCWNsZWFyX2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKTsKIAl9Ci0JZHJiZF9zdXNwZW5kX2lvKG1kZXYpOwotCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMzKHN1c3AsIDAsIHN1c3Bfbm9kLCAwLCBzdXNwX2ZlbiwgMCkpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUzMoc3VzcCwgMCwgc3VzcF9ub2QsIDAsIHN1c3BfZmVuLCAwKSk7CiAJaWYgKHJldGNvZGUgPT0gU1NfU1VDQ0VTUykgewotCQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQotCQkJdGxfY2xlYXIobWRldi0+dGNvbm4pOwotCQlpZiAobWRldi0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTIHx8IG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9GQUlMRUQpCi0JCQl0bF9yZXN0YXJ0KG1kZXYtPnRjb25uLCBGQUlMX0ZST1pFTl9ESVNLX0lPKTsKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQorCQkJdGxfY2xlYXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CisJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyB8fCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9GQUlMRUQpCisJCQl0bF9yZXN0YXJ0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIEZBSUxfRlJPWkVOX0RJU0tfSU8pOwogCX0KLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwpAQCAtMjcyNCwyMyArMjc2NCwyOCBAQAogCXJldHVybiBkcmJkX2FkbV9zaW1wbGVfcmVxdWVzdF9zdGF0ZShza2IsIGluZm8sIE5TKGRpc2ssIERfT1VUREFURUQpKTsKIH0KIAotaW50IG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuc2lnbmVkIHZucikKK3N0YXRpYyBpbnQgbmxhX3B1dF9kcmJkX2NmZ19jb250ZXh0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgICAgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5sYXR0ciAqbmxhOwogCW5sYSA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgRFJCRF9OTEFfQ0ZHX0NPTlRFWFQpOwogCWlmICghbmxhKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpZiAodm5yICE9IFZPTFVNRV9VTlNQRUNJRklFRCAmJgotCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3R4X3ZvbHVtZSwgdm5yKSkKKwlpZiAoZGV2aWNlICYmCisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVF9jdHhfdm9sdW1lLCBkZXZpY2UtPnZucikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChubGFfcHV0X3N0cmluZyhza2IsIFRfY3R4X3Jlc291cmNlX25hbWUsIHRjb25uLT5uYW1lKSkKKwlpZiAobmxhX3B1dF9zdHJpbmcoc2tiLCBUX2N0eF9yZXNvdXJjZV9uYW1lLCByZXNvdXJjZS0+bmFtZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmICh0Y29ubi0+bXlfYWRkcl9sZW4gJiYKLQkgICAgbmxhX3B1dChza2IsIFRfY3R4X215X2FkZHIsIHRjb25uLT5teV9hZGRyX2xlbiwgJnRjb25uLT5teV9hZGRyKSkKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JaWYgKHRjb25uLT5wZWVyX2FkZHJfbGVuICYmCi0JICAgIG5sYV9wdXQoc2tiLCBUX2N0eF9wZWVyX2FkZHIsIHRjb25uLT5wZWVyX2FkZHJfbGVuLCAmdGNvbm4tPnBlZXJfYWRkcikpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChjb25uZWN0aW9uKSB7CisJCWlmIChjb25uZWN0aW9uLT5teV9hZGRyX2xlbiAmJgorCQkgICAgbmxhX3B1dChza2IsIFRfY3R4X215X2FkZHIsIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuLCAmY29ubmVjdGlvbi0+bXlfYWRkcikpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJaWYgKGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gJiYKKwkJICAgIG5sYV9wdXQoc2tiLCBUX2N0eF9wZWVyX2FkZHIsIGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4sICZjb25uZWN0aW9uLT5wZWVyX2FkZHIpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQogCW5sYV9uZXN0X2VuZChza2IsIG5sYSk7CiAJcmV0dXJuIDA7CiAKQEAgLTI3NTAsOSArMjc5NSwyMiBAQAogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKLWludCBubGFfcHV0X3N0YXR1c19pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCisvKgorICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIG9mIEByZXNvdXJjZSBpZiBAcmVzb3VyY2UgaGFzIGV4YWN0bHkgb25lIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICp0aGVfb25seV9jb25uZWN0aW9uKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjb25uZWN0aW9ucyA9ICZyZXNvdXJjZS0+Y29ubmVjdGlvbnM7CisKKwlpZiAobGlzdF9lbXB0eShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMtPm5leHQtPm5leHQgIT0gY29ubmVjdGlvbnMpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5KCZyZXNvdXJjZS0+Y29ubmVjdGlvbnMsIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zKTsKK30KKworaW50IG5sYV9wdXRfc3RhdHVzX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IHN0cnVjdCBzaWJfaW5mbyAqc2liKQogeworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IGRldmljZS0+cmVzb3VyY2U7CiAJc3RydWN0IHN0YXRlX2luZm8gKnNpID0gTlVMTDsgLyogZm9yIHNpemVvZihzaS0+bWVtYmVyKTsgKi8KIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJaW50IGdvdF9sZGV2OwpAQCAtMjc3MiwyNyArMjgzMCwyNyBAQAogCSAqIGFsd2F5cyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgKi8KIAlleGNsdWRlX3NlbnNpdGl2ZSA9IHNpYiB8fCAhY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKIAotCWdvdF9sZGV2ID0gZ2V0X2xkZXYobWRldik7CisJZ290X2xkZXYgPSBnZXRfbGRldihkZXZpY2UpOwogCiAJLyogV2UgbmVlZCB0byBhZGQgY29ubmVjdGlvbiBuYW1lIGFuZCB2b2x1bWUgbnVtYmVyIGluZm9ybWF0aW9uIHN0aWxsLgogCSAqIE1pbm9yIG51bWJlciBpcyBpbiBkcmJkX2dlbmxtc2doZHIuICovCi0JaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIG1kZXYtPnRjb25uLCBtZGV2LT52bnIpKQorCWlmIChubGFfcHV0X2RyYmRfY2ZnX2NvbnRleHQoc2tiLCByZXNvdXJjZSwgdGhlX29ubHlfY29ubmVjdGlvbihyZXNvdXJjZSksIGRldmljZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKHJlc19vcHRzX3RvX3NrYihza2IsICZtZGV2LT50Y29ubi0+cmVzX29wdHMsIGV4Y2x1ZGVfc2Vuc2l0aXZlKSkKKwlpZiAocmVzX29wdHNfdG9fc2tiKHNrYiwgJmRldmljZS0+cmVzb3VyY2UtPnJlc19vcHRzLCBleGNsdWRlX3NlbnNpdGl2ZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChnb3RfbGRldikgewogCQlzdHJ1Y3QgZGlza19jb25mICpkaXNrX2NvbmY7CiAKLQkJZGlza19jb25mID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZik7CisJCWRpc2tfY29uZiA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZik7CiAJCWVyciA9IGRpc2tfY29uZl90b19za2Ioc2tiLCBkaXNrX2NvbmYsIGV4Y2x1ZGVfc2Vuc2l0aXZlKTsKIAl9CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IG5ldF9jb25mICpuYzsKIAotCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCWlmIChuYykKIAkJCWVyciA9IG5ldF9jb25mX3RvX3NrYihza2IsIG5jLCBleGNsdWRlX3NlbnNpdGl2ZSk7CiAJfQpAQCAtMjgwNCwzOCArMjg2MiwzOCBAQAogCWlmICghbmxhKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF91MzIoc2tiLCBUX3NpYl9yZWFzb24sIHNpYiA/IHNpYi0+c2liX3JlYXNvbiA6IFNJQl9HRVRfU1RBVFVTX1JFUExZKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3VycmVudF9zdGF0ZSwgbWRldi0+c3RhdGUuaSkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2VkX3V1aWQsIG1kZXYtPmVkX3V1aWQpIHx8Ci0JICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9jYXBhY2l0eSwgZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KSkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3NlbmRfY250LCBtZGV2LT5zZW5kX2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3JlY3ZfY250LCBtZGV2LT5yZWN2X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3JlYWRfY250LCBtZGV2LT5yZWFkX2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3dyaXRfY250LCBtZGV2LT53cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2FsX3dyaXRfY250LCBtZGV2LT5hbF93cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JtX3dyaXRfY250LCBtZGV2LT5ibV93cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX2Jpb19jbnQsIGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX3BlbmRpbmdfY250LCBhdG9taWNfcmVhZCgmbWRldi0+YXBfcGVuZGluZ19jbnQpKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIFRfcnNfcGVuZGluZ19jbnQsIGF0b21pY19yZWFkKCZtZGV2LT5yc19wZW5kaW5nX2NudCkpKQorCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3VycmVudF9zdGF0ZSwgZGV2aWNlLT5zdGF0ZS5pKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfZWRfdXVpZCwgZGV2aWNlLT5lZF91dWlkKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfY2FwYWNpdHksIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSkgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3NlbmRfY250LCBkZXZpY2UtPnNlbmRfY250KSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfcmVjdl9jbnQsIGRldmljZS0+cmVjdl9jbnQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9yZWFkX2NudCwgZGV2aWNlLT5yZWFkX2NudCkgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3dyaXRfY250LCBkZXZpY2UtPndyaXRfY250KSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfYWxfd3JpdF9jbnQsIGRldmljZS0+YWxfd3JpdF9jbnQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9ibV93cml0X2NudCwgZGV2aWNlLT5ibV93cml0X2NudCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX2Jpb19jbnQsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIFRfYXBfcGVuZGluZ19jbnQsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KSkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUX3JzX3BlbmRpbmdfY250LCBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChnb3RfbGRldikgewogCQlpbnQgZXJyOwogCi0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7Ci0JCWVyciA9IG5sYV9wdXQoc2tiLCBUX3V1aWRzLCBzaXplb2Yoc2ktPnV1aWRzKSwgbWRldi0+bGRldi0+bWQudXVpZCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5sZGV2LT5tZC51dWlkX2xvY2spOworCQllcnIgPSBubGFfcHV0KHNrYiwgVF91dWlkcywgc2l6ZW9mKHNpLT51dWlkcyksIGRldmljZS0+bGRldi0+bWQudXVpZCk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5sZGV2LT5tZC51dWlkX2xvY2spOwogCiAJCWlmIChlcnIpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAobmxhX3B1dF91MzIoc2tiLCBUX2Rpc2tfZmxhZ3MsIG1kZXYtPmxkZXYtPm1kLmZsYWdzKSB8fAotCQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfdG90YWwsIGRyYmRfYm1fYml0cyhtZGV2KSkgfHwKLQkJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9iaXRzX29vcywgZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpKQorCQlpZiAobmxhX3B1dF91MzIoc2tiLCBUX2Rpc2tfZmxhZ3MsIGRldmljZS0+bGRldi0+bWQuZmxhZ3MpIHx8CisJCSAgICBubGFfcHV0X3U2NChza2IsIFRfYml0c190b3RhbCwgZHJiZF9ibV9iaXRzKGRldmljZSkpIHx8CisJCSAgICBubGFfcHV0X3U2NChza2IsIFRfYml0c19vb3MsIGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCWlmIChDX1NZTkNfU09VUkNFIDw9IG1kZXYtPnN0YXRlLmNvbm4gJiYKLQkJICAgIENfUEFVU0VEX1NZTkNfVCA+PSBtZGV2LT5zdGF0ZS5jb25uKSB7Ci0JCQlpZiAobmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfdG90YWwsIG1kZXYtPnJzX3RvdGFsKSB8fAotCQkJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9iaXRzX3JzX2ZhaWxlZCwgbWRldi0+cnNfZmFpbGVkKSkKKwkJaWYgKENfU1lOQ19TT1VSQ0UgPD0gZGV2aWNlLT5zdGF0ZS5jb25uICYmCisJCSAgICBDX1BBVVNFRF9TWU5DX1QgPj0gZGV2aWNlLT5zdGF0ZS5jb25uKSB7CisJCQlpZiAobmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfdG90YWwsIGRldmljZS0+cnNfdG90YWwpIHx8CisJCQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfZmFpbGVkLCBkZXZpY2UtPnJzX2ZhaWxlZCkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KIAl9CkBAIC0yODY3LDcgKzI5MjUsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCQllcnIgPSAtRU1TR1NJWkU7CiAJaWYgKGdvdF9sZGV2KQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yODgyLDcgKzI5NDAsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCWVyciA9IG5sYV9wdXRfc3RhdHVzX2luZm8oYWRtX2N0eC5yZXBseV9za2IsIGFkbV9jdHgubWRldiwgTlVMTCk7CisJZXJyID0gbmxhX3B1dF9zdGF0dXNfaW5mbyhhZG1fY3R4LnJlcGx5X3NrYiwgYWRtX2N0eC5kZXZpY2UsIE5VTEwpOwogCWlmIChlcnIpIHsKIAkJbmxtc2dfZnJlZShhZG1fY3R4LnJlcGx5X3NrYik7CiAJCXJldHVybiBlcnI7CkBAIC0yODkyLDIyICsyOTUwLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfb25lX3N0YXR1cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IGdldF9vbmVfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkcmJkX2dlbmxtc2doZHIgKmRoOwotCXN0cnVjdCBkcmJkX3Rjb25uICpwb3MgPSAoc3RydWN0IGRyYmRfdGNvbm4qKWNiLT5hcmdzWzBdOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IE5VTEw7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRtcDsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcG9zID0gKHN0cnVjdCBkcmJkX3Jlc291cmNlICopY2ItPmFyZ3NbMF07CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqdG1wOwogCXVuc2lnbmVkIHZvbHVtZSA9IGNiLT5hcmdzWzFdOwogCiAJLyogT3BlbiBjb2RlZCwgZGVmZXJyZWQsIGl0ZXJhdGlvbjoKLQkgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGNvbm4sIHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkgKglpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCBpKSB7CisJICogZm9yX2VhY2hfcmVzb3VyY2Vfc2FmZShyZXNvdXJjZSwgdG1wLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkgKiAgICAgIGNvbm5lY3Rpb24gPSAiZmlyc3QgY29ubmVjdGlvbiBvZiByZXNvdXJjZSBvciB1bmRlZmluZWQiOworCSAqCWlkcl9mb3JfZWFjaF9lbnRyeSgmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZSwgaSkgewogCSAqCSAgLi4uCiAJICoJfQogCSAqIH0KLQkgKiB3aGVyZSB0Y29ubiBpcyBjYi0+YXJnc1swXTsKKwkgKiB3aGVyZSByZXNvdXJjZSBpcyBjYi0+YXJnc1swXTsKIAkgKiBhbmQgaSBpcyBjYi0+YXJnc1sxXTsKIAkgKgogCSAqIGNiLT5hcmdzWzJdIGluZGljYXRlcyBpZiB3ZSBzaGFsbCBsb29wIG92ZXIgYWxsIHJlc291cmNlcywKQEAgLTI5MTYsNDQgKzI5NzUsNDQgQEAKIAkgKiBUaGlzIG1heSBtaXNzIGVudHJpZXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhpcyBkdW1wIHN0YXJ0ZWQsCiAJICogb3IgZW50cmllcyBkZWxldGVkIGJlZm9yZSB0aGV5IGFyZSByZWFjaGVkLgogCSAqCi0JICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIG1kZXYgd29uJ3QgZGlzYXBwZWFyIHdoaWxlCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGRldmljZSB3b24ndCBkaXNhcHBlYXIgd2hpbGUKIAkgKiB3ZSBhcmUgbG9va2luZyBhdCBpdCwgYW5kIHJldmFsaWRhdGUgb3VyIGl0ZXJhdG9ycwogCSAqIG9uIGVhY2ggaXRlcmF0aW9uLgogCSAqLwogCi0JLyogc3luY2hyb25pemUgd2l0aCBjb25uX2NyZWF0ZSgpL2Nvbm5fZGVzdHJveSgpICovCisJLyogc3luY2hyb25pemUgd2l0aCBjb25uX2NyZWF0ZSgpL2RyYmRfZGVzdHJveV9jb25uZWN0aW9uKCkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJLyogcmV2YWxpZGF0ZSBpdGVyYXRvciBwb3NpdGlvbiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKKwlmb3JfZWFjaF9yZXNvdXJjZV9yY3UodG1wLCAmZHJiZF9yZXNvdXJjZXMpIHsKIAkJaWYgKHBvcyA9PSBOVUxMKSB7CiAJCQkvKiBmaXJzdCBpdGVyYXRpb24gKi8KIAkJCXBvcyA9IHRtcDsKLQkJCXRjb25uID0gcG9zOworCQkJcmVzb3VyY2UgPSBwb3M7CiAJCQlicmVhazsKIAkJfQogCQlpZiAodG1wID09IHBvcykgewotCQkJdGNvbm4gPSBwb3M7CisJCQlyZXNvdXJjZSA9IHBvczsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmICh0Y29ubikgewotbmV4dF90Y29ubjoKLQkJbWRldiA9IGlkcl9nZXRfbmV4dCgmdGNvbm4tPnZvbHVtZXMsICZ2b2x1bWUpOwotCQlpZiAoIW1kZXYpIHsKLQkJCS8qIE5vIG1vcmUgdm9sdW1lcyB0byBkdW1wIG9uIHRoaXMgdGNvbm4uCi0JCQkgKiBBZHZhbmNlIHRjb25uIGl0ZXJhdG9yLiAqLwotCQkJcG9zID0gbGlzdF9lbnRyeV9yY3UodGNvbm4tPmFsbF90Y29ubi5uZXh0LAotCQkJCQkgICAgIHN0cnVjdCBkcmJkX3Rjb25uLCBhbGxfdGNvbm4pOwotCQkJLyogRGlkIHdlIGR1bXAgYW55IHZvbHVtZSBvbiB0aGlzIHRjb25uIHlldD8gKi8KKwlpZiAocmVzb3VyY2UpIHsKK25leHRfcmVzb3VyY2U6CisJCWRldmljZSA9IGlkcl9nZXRfbmV4dCgmcmVzb3VyY2UtPmRldmljZXMsICZ2b2x1bWUpOworCQlpZiAoIWRldmljZSkgeworCQkJLyogTm8gbW9yZSB2b2x1bWVzIHRvIGR1bXAgb24gdGhpcyByZXNvdXJjZS4KKwkJCSAqIEFkdmFuY2UgcmVzb3VyY2UgaXRlcmF0b3IuICovCisJCQlwb3MgPSBsaXN0X2VudHJ5X3JjdShyZXNvdXJjZS0+cmVzb3VyY2VzLm5leHQsCisJCQkJCSAgICAgc3RydWN0IGRyYmRfcmVzb3VyY2UsIHJlc291cmNlcyk7CisJCQkvKiBEaWQgd2UgZHVtcCBhbnkgdm9sdW1lIG9mIHRoaXMgcmVzb3VyY2UgeWV0PyAqLwogCQkJaWYgKHZvbHVtZSAhPSAwKSB7CiAJCQkJLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LAogCQkJCSAqIG9yIG9ubHkgYSBzaW5nbGUgcmVzb3VyY2UgZHVtcCB3YXMgcmVxdWVzdGVkLAogCQkJCSAqIHdlIGFyZSBkb25lLiAqLwotCQkJCWlmICgmcG9zLT5hbGxfdGNvbm4gPT0gJmRyYmRfdGNvbm5zIHx8IGNiLT5hcmdzWzJdKQorCQkJCWlmICgmcG9zLT5yZXNvdXJjZXMgPT0gJmRyYmRfcmVzb3VyY2VzIHx8IGNiLT5hcmdzWzJdKQogCQkJCQlnb3RvIG91dDsKIAkJCQl2b2x1bWUgPSAwOwotCQkJCXRjb25uID0gcG9zOwotCQkJCWdvdG8gbmV4dF90Y29ubjsKKwkJCQlyZXNvdXJjZSA9IHBvczsKKwkJCQlnb3RvIG5leHRfcmVzb3VyY2U7CiAJCQl9CiAJCX0KIApAQCAtMjk2Myw0MyArMzAyMiw0OSBAQAogCQlpZiAoIWRoKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKCFtZGV2KSB7Ci0JCQkvKiBUaGlzIGlzIGEgdGNvbm4gd2l0aG91dCBhIHNpbmdsZSB2b2x1bWUuCisJCWlmICghZGV2aWNlKSB7CisJCQkvKiBUaGlzIGlzIGEgY29ubmVjdGlvbiB3aXRob3V0IGEgc2luZ2xlIHZvbHVtZS4KIAkJCSAqIFN1cHJpc2luZ2x5IGVub3VnaCwgaXQgbWF5IGhhdmUgYSBuZXR3b3JrCiAJCQkgKiBjb25maWd1cmF0aW9uLiAqLwotCQkJc3RydWN0IG5ldF9jb25mICpuYzsKKwkJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKIAkJCWRoLT5taW5vciA9IC0xVTsKIAkJCWRoLT5yZXRfY29kZSA9IE5PX0VSUk9SOwotCQkJaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIHRjb25uLCBWT0xVTUVfVU5TUEVDSUZJRUQpKQorCQkJY29ubmVjdGlvbiA9IHRoZV9vbmx5X2Nvbm5lY3Rpb24ocmVzb3VyY2UpOworCQkJaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIHJlc291cmNlLCBjb25uZWN0aW9uLCBOVUxMKSkKIAkJCQlnb3RvIGNhbmNlbDsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7Ci0JCQlpZiAobmMgJiYgbmV0X2NvbmZfdG9fc2tiKHNrYiwgbmMsIDEpICE9IDApCi0JCQkJZ290byBjYW5jZWw7CisJCQlpZiAoY29ubmVjdGlvbikgeworCQkJCXN0cnVjdCBuZXRfY29uZiAqbmM7CisKKwkJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CisJCQkJaWYgKG5jICYmIG5ldF9jb25mX3RvX3NrYihza2IsIG5jLCAxKSAhPSAwKQorCQkJCQlnb3RvIGNhbmNlbDsKKwkJCX0KIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCURfQVNTRVJUKG1kZXYtPnZuciA9PSB2b2x1bWUpOwotCQlEX0FTU0VSVChtZGV2LT50Y29ubiA9PSB0Y29ubik7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT52bnIgPT0gdm9sdW1lKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnJlc291cmNlID09IHJlc291cmNlKTsKIAotCQlkaC0+bWlub3IgPSBtZGV2X3RvX21pbm9yKG1kZXYpOworCQlkaC0+bWlub3IgPSBkZXZpY2VfdG9fbWlub3IoZGV2aWNlKTsKIAkJZGgtPnJldF9jb2RlID0gTk9fRVJST1I7CiAKLQkJaWYgKG5sYV9wdXRfc3RhdHVzX2luZm8oc2tiLCBtZGV2LCBOVUxMKSkgeworCQlpZiAobmxhX3B1dF9zdGF0dXNfaW5mbyhza2IsIGRldmljZSwgTlVMTCkpIHsKIGNhbmNlbDoKIAkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgZGgpOwogCQkJZ290byBvdXQ7CiAJCX0KIGRvbmU6CiAJCWdlbmxtc2dfZW5kKHNrYiwgZGgpOwotICAgICAgICB9CisJfQogCiBvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJLyogd2hlcmUgdG8gc3RhcnQgdGhlIG5leHQgaXRlcmF0aW9uICovCi0gICAgICAgIGNiLT5hcmdzWzBdID0gKGxvbmcpcG9zOwotICAgICAgICBjYi0+YXJnc1sxXSA9IChwb3MgPT0gdGNvbm4pID8gdm9sdW1lICsgMSA6IDA7CisJY2ItPmFyZ3NbMF0gPSAobG9uZylwb3M7CisJY2ItPmFyZ3NbMV0gPSAocG9zID09IHJlc291cmNlKSA/IHZvbHVtZSArIDEgOiAwOwogCi0JLyogTm8gbW9yZSB0Y29ubnMvdm9sdW1lcy9taW5vcnMgZm91bmQgcmVzdWx0cyBpbiBhbiBlbXB0eSBza2IuCisJLyogTm8gbW9yZSByZXNvdXJjZXMvdm9sdW1lcy9taW5vcnMgZm91bmQgcmVzdWx0cyBpbiBhbiBlbXB0eSBza2IuCiAJICogV2hpY2ggd2lsbCB0ZXJtaW5hdGUgdGhlIGR1bXAuICovCiAgICAgICAgIHJldHVybiBza2ItPmxlbjsKIH0KQEAgLTMwMTksNyArMzA4NCw3IEBACiAJY29uc3QgdW5zaWduZWQgaGRybGVuID0gR0VOTF9IRFJMRU4gKyBHRU5MX01BR0lDX0ZBTUlMWV9IRFJTWjsKIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOwogCWludCBtYXh0eXBlOwogCiAJLyogSXMgdGhpcyBhIGZvbGxvd3VwIGNhbGw/ICovCkBAIC0zMDQ4LDE4ICszMTEzLDE5IEBACiAJaWYgKCFubGEpCiAJCXJldHVybiAtRUlOVkFMOwogCXJlc291cmNlX25hbWUgPSBubGFfZGF0YShubGEpOwotCXRjb25uID0gY29ubl9nZXRfYnlfbmFtZShyZXNvdXJjZV9uYW1lKTsKLQotCWlmICghdGNvbm4pCisJaWYgKCEqcmVzb3VyY2VfbmFtZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmVzb3VyY2UgPSBkcmJkX2ZpbmRfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk7CisJaWYgKCFyZXNvdXJjZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOyAvKiBnZXRfb25lX3N0YXR1cygpIChyZSl2YWxpZGF0ZXMgdGNvbm4gYnkgaXRzZWxmICovCisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOyAvKiBnZXRfb25lX3N0YXR1cygpIHJldmFsaWRhdGVzIHRoZSByZXNvdXJjZSAqLwogCiAJLyogcHJpbWUgaXRlcmF0b3JzLCBhbmQgc2V0ICJmaWx0ZXIiIG1vZGUgbWFyazoKLQkgKiBvbmx5IGR1bXAgdGhpcyB0Y29ubi4gKi8KLQljYi0+YXJnc1swXSA9IChsb25nKXRjb25uOworCSAqIG9ubHkgZHVtcCB0aGlzIGNvbm5lY3Rpb24uICovCisJY2ItPmFyZ3NbMF0gPSAobG9uZylyZXNvdXJjZTsKIAkvKiBjYi0+YXJnc1sxXSA9IDA7IHBhc3NlZCBpbiB0aGlzIHdheS4gKi8KLQljYi0+YXJnc1syXSA9IChsb25nKXRjb25uOworCWNiLT5hcmdzWzJdID0gKGxvbmcpcmVzb3VyY2U7CiAKIGR1bXA6CiAJcmV0dXJuIGdldF9vbmVfc3RhdHVzKHNrYiwgY2IpOwpAQCAtMzA3OCw4ICszMTQ0LDggQEAKIAkJZ290byBvdXQ7CiAKIAl0cC50aW1lb3V0X3R5cGUgPQotCQlhZG1fY3R4Lm1kZXYtPnN0YXRlLnBkc2sgPT0gRF9PVVREQVRFRCA/IFVUX1BFRVJfT1VUREFURUQgOgotCQl0ZXN0X2JpdChVU0VfREVHUl9XRkNfVCwgJmFkbV9jdHgubWRldi0+ZmxhZ3MpID8gVVRfREVHUkFERUQgOgorCQlhZG1fY3R4LmRldmljZS0+c3RhdGUucGRzayA9PSBEX09VVERBVEVEID8gVVRfUEVFUl9PVVREQVRFRCA6CisJCXRlc3RfYml0KFVTRV9ERUdSX1dGQ19ULCAmYWRtX2N0eC5kZXZpY2UtPmZsYWdzKSA/IFVUX0RFR1JBREVEIDoKIAkJVVRfREVGQVVMVDsKIAogCWVyciA9IHRpbWVvdXRfcGFybXNfdG9fcHJpdl9za2IoYWRtX2N0eC5yZXBseV9za2IsICZ0cCk7CkBAIC0zMDk0LDcgKzMxNjAsNyBAQAogCiBpbnQgZHJiZF9hZG1fc3RhcnRfb3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwogCXN0cnVjdCBzdGFydF9vdl9wYXJtcyBwYXJtczsKIApAQCAtMzEwNCwxMCArMzE3MCwxMCBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiByZXN1bWUgZnJvbSBsYXN0IGtub3duIHBvc2l0aW9uLCBpZiBwb3NzaWJsZSAqLwotCXBhcm1zLm92X3N0YXJ0X3NlY3RvciA9IG1kZXYtPm92X3N0YXJ0X3NlY3RvcjsKKwlwYXJtcy5vdl9zdGFydF9zZWN0b3IgPSBkZXZpY2UtPm92X3N0YXJ0X3NlY3RvcjsKIAlwYXJtcy5vdl9zdG9wX3NlY3RvciA9IFVMTE9OR19NQVg7CiAJaWYgKGluZm8tPmF0dHJzW0RSQkRfTkxBX1NUQVJUX09WX1BBUk1TXSkgewogCQlpbnQgZXJyID0gc3RhcnRfb3ZfcGFybXNfZnJvbV9hdHRycygmcGFybXMsIGluZm8pOwpAQCAtMzExOCwxNSArMzE4NCwxNSBAQAogCQl9CiAJfQogCS8qIHdfbWFrZV9vdl9yZXF1ZXN0IGV4cGVjdHMgcG9zaXRpb24gdG8gYmUgYWxpZ25lZCAqLwotCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IHBhcm1zLm92X3N0YXJ0X3NlY3RvciAmIH4oQk1fU0VDVF9QRVJfQklULTEpOwotCW1kZXYtPm92X3N0b3Bfc2VjdG9yID0gcGFybXMub3Zfc3RvcF9zZWN0b3I7CisJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPSBwYXJtcy5vdl9zdGFydF9zZWN0b3IgJiB+KEJNX1NFQ1RfUEVSX0JJVC0xKTsKKwlkZXZpY2UtPm92X3N0b3Bfc2VjdG9yID0gcGFybXMub3Zfc3RvcF9zZWN0b3I7CiAKIAkvKiBJZiB0aGVyZSBpcyBzdGlsbCBiaXRtYXAgSU8gcGVuZGluZywgZS5nLiBwcmV2aW91cyByZXN5bmMgb3IgdmVyaWZ5CiAJICoganVzdCBiZWluZyBmaW5pc2hlZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgcmVzeW5jLiAqLwotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwgIXRlc3RfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKSk7Ci0JcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LE5TKGNvbm4sQ19WRVJJRllfUykpOwotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfVkVSSUZZX1MpKTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTMxMzUsNyArMzIwMSw3IEBACiAKIGludCBkcmJkX2FkbV9uZXdfY191dWlkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKIAlpbnQgc2tpcF9pbml0aWFsX3N5bmMgPSAwOwogCWludCBlcnI7CkBAIC0zMTQ3LDcgKzMyMTMsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dF9ub2xvY2s7CiAKLQltZGV2ID0gYWRtX2N0eC5tZGV2OworCWRldmljZSA9IGFkbV9jdHguZGV2aWNlOwogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAlpZiAoaW5mby0+YXR0cnNbRFJCRF9OTEFfTkVXX0NfVVVJRF9QQVJNU10pIHsKIAkJZXJyID0gbmV3X2NfdXVpZF9wYXJtc19mcm9tX2F0dHJzKCZhcmdzLCBpbmZvKTsKQEAgLTMxNTgsNDkgKzMyMjQsNTAgQEAKIAkJfQogCX0KIAotCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOyAvKiBQcm90ZWN0cyB1cyBhZ2FpbnN0IHNlcmlhbGl6ZWQgc3RhdGUgY2hhbmdlcy4gKi8KKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOyAvKiBQcm90ZWN0cyB1cyBhZ2FpbnN0IHNlcmlhbGl6ZWQgc3RhdGUgY2hhbmdlcy4gKi8KIAotCWlmICghZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT19ESVNLOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiB0aGlzIGlzICJza2lwIGluaXRpYWwgc3luYyIsIGFzc3VtZSB0byBiZSBjbGVhbiAqLwotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTAgJiYKLQkgICAgbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJiBhcmdzLmNsZWFyX2JtKSB7Ci0JCWRldl9pbmZvKERFViwgIlByZXBhcmluZyB0byBza2lwIGluaXRpYWwgc3luY1xuIik7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgorCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTAgJiYKKwkgICAgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdID09IFVVSURfSlVTVF9DUkVBVEVEICYmIGFyZ3MuY2xlYXJfYm0pIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlByZXBhcmluZyB0byBza2lwIGluaXRpYWwgc3luY1xuIik7CiAJCXNraXBfaW5pdGlhbF9zeW5jID0gMTsKLQl9IGVsc2UgaWYgKG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FKSB7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FKSB7CiAJCXJldGNvZGUgPSBFUlJfQ09OTkVDVEVEOwogCQlnb3RvIG91dF9kZWM7CiAJfQogCi0JZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIDApOyAvKiBSb3RhdGUgVUlfQklUTUFQIHRvIEhpc3RvcnkgMSwgZXRjLi4uICovCi0JZHJiZF91dWlkX25ld19jdXJyZW50KG1kZXYpOyAvKiBOZXcgY3VycmVudCwgcHJldmlvdXMgdG8gVUlfQklUTUFQICovCisJZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMCk7IC8qIFJvdGF0ZSBVSV9CSVRNQVAgdG8gSGlzdG9yeSAxLCBldGMuLi4gKi8KKwlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsgLyogTmV3IGN1cnJlbnQsIHByZXZpb3VzIHRvIFVJX0JJVE1BUCAqLwogCiAJaWYgKGFyZ3MuY2xlYXJfYm0pIHsKLQkJZXJyID0gZHJiZF9iaXRtYXBfaW8obWRldiwgJmRyYmRfYm1pb19jbGVhcl9uX3dyaXRlLAorCQllcnIgPSBkcmJkX2JpdG1hcF9pbyhkZXZpY2UsICZkcmJkX2JtaW9fY2xlYXJfbl93cml0ZSwKIAkJCSJjbGVhcl9uX3dyaXRlIGZyb20gbmV3X2NfdXVpZCIsIEJNX0xPQ0tFRF9NQVNLKTsKIAkJaWYgKGVycikgewotCQkJZGV2X2VycihERVYsICJXcml0aW5nIGJpdG1hcCBmYWlsZWQgd2l0aCAlZFxuIixlcnIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiV3JpdGluZyBiaXRtYXAgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CiAJCQlyZXRjb2RlID0gRVJSX0lPX01EX0RJU0s7CiAJCX0KIAkJaWYgKHNraXBfaW5pdGlhbF9zeW5jKSB7Ci0JCQlkcmJkX3NlbmRfdXVpZHNfc2tpcF9pbml0aWFsX3N5bmMobWRldik7Ci0JCQlfZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIDApOwotCQkJZHJiZF9wcmludF91dWlkcyhtZGV2LCAiY2xlYXJlZCBiaXRtYXAgVVVJRCIpOwotCQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQkJCV9kcmJkX3NldF9zdGF0ZShfTlMyKG1kZXYsIGRpc2ssIERfVVBfVE9fREFURSwgcGRzaywgRF9VUF9UT19EQVRFKSwKKwkJCWRyYmRfc2VuZF91dWlkc19za2lwX2luaXRpYWxfc3luYyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKKwkJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCAwKTsKKwkJCWRyYmRfcHJpbnRfdXVpZHMoZGV2aWNlLCAiY2xlYXJlZCBiaXRtYXAgVVVJRCIpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQkJX2RyYmRfc2V0X3N0YXRlKF9OUzIoZGV2aWNlLCBkaXNrLCBEX1VQX1RPX0RBVEUsIHBkc2ssIERfVVBfVE9fREFURSksCiAJCQkJCUNTX1ZFUkJPU0UsIE5VTEwpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCX0KIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiBvdXRfZGVjOgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiBvdXRfbm9sb2NrOgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTMyNDYsNyArMzMxMyw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGFkbV9jdHgudGNvbm4pIHsKKwlpZiAoYWRtX2N0eC5yZXNvdXJjZSkgewogCQlpZiAoaW5mby0+bmxoZHItPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkgewogCQkJcmV0Y29kZSA9IEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygicmVzb3VyY2UgZXhpc3RzIik7CkBAIC0zMjYyLDcgKzMzMjksNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJiZF9hZG1fYWRkX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitpbnQgZHJiZF9hZG1fbmV3X21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRyYmRfZ2VubG1zZ2hkciAqZGggPSBpbmZvLT51c2VyaGRyOwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwpAQCAtMzI4NSw0MSArMzM1MiwzNiBAQAogCX0KIAogCS8qIGRyYmRfYWRtX3ByZXBhcmUgbWFkZSBzdXJlIGFscmVhZHkKLQkgKiB0aGF0IG1kZXYtPnRjb25uIGFuZCBtZGV2LT52bnIgbWF0Y2ggdGhlIHJlcXVlc3QuICovCi0JaWYgKGFkbV9jdHgubWRldikgeworCSAqIHRoYXQgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiBhbmQgZGV2aWNlLT52bnIgbWF0Y2ggdGhlIHJlcXVlc3QuICovCisJaWYgKGFkbV9jdHguZGV2aWNlKSB7CiAJCWlmIChpbmZvLT5ubGhkci0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJcmV0Y29kZSA9IEVSUl9NSU5PUl9FWElTVFM7CiAJCS8qIGVsc2U6IHN0aWxsIE5PX0VSUk9SICovCiAJCWdvdG8gb3V0OwogCX0KIAotCXJldGNvZGUgPSBjb25uX25ld19taW5vcihhZG1fY3R4LnRjb25uLCBkaC0+bWlub3IsIGFkbV9jdHgudm9sdW1lKTsKKwlyZXRjb2RlID0gZHJiZF9jcmVhdGVfZGV2aWNlKGFkbV9jdHgucmVzb3VyY2UsIGRoLT5taW5vciwgYWRtX2N0eC52b2x1bWUpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGVudW0gZHJiZF9yZXRfY29kZSBhZG1fZGVsZXRlX21pbm9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgZW51bSBkcmJkX3JldF9jb2RlIGFkbV9kZWxfbWlub3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgotCSAgICAvKiBubyBuZWVkIHRvIGJlIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmCisJaWYgKGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmCisJICAgIC8qIG5vIG5lZWQgdG8gYmUgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJgogCSAgICAgKiB3ZSBtYXkgd2FudCB0byBkZWxldGUgYSBtaW5vciBmcm9tIGEgbGl2ZSByZXBsaWNhdGlvbiBncm91cC4KIAkgICAgICovCi0JICAgIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLAorCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfUkVQT1JUX1BBUkFNUyksCiAJCQkJICAgIENTX1ZFUkJPU0UgKyBDU19XQUlUX0NPTVBMRVRFKTsKLQkJaWRyX3JlbW92ZSgmbWRldi0+dGNvbm4tPnZvbHVtZXMsIG1kZXYtPnZucik7Ci0JCWlkcl9yZW1vdmUoJm1pbm9ycywgbWRldl90b19taW5vcihtZGV2KSk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKG1kZXYtPnN1Ym1pdC53cSk7Ci0JCWRlbF9nZW5kaXNrKG1kZXYtPnZkaXNrKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9kZWxldGVfZGV2aWNlKGRldmljZSk7CiAJCXJldHVybiBOT19FUlJPUjsKIAl9IGVsc2UKIAkJcmV0dXJuIEVSUl9NSU5PUl9DT05GSUdVUkVEOwogfQogCi1pbnQgZHJiZF9hZG1fZGVsZXRlX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitpbnQgZHJiZF9hZG1fZGVsX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAKQEAgLTMzMjksNyArMzM5MSw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JcmV0Y29kZSA9IGFkbV9kZWxldGVfbWlub3IoYWRtX2N0eC5tZGV2KTsKKwlyZXRjb2RlID0gYWRtX2RlbF9taW5vcihhZG1fY3R4LmRldmljZSk7CiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwogCXJldHVybiAwOwpAQCAtMzMzNyw1NSArMzM5OSw1OCBAQAogCiBpbnQgZHJiZF9hZG1fZG93bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogeworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCByZXRjb2RlOyAvKiBlbnVtIGRyYmRfcmV0X2NvZGUgcnNwLiBlbnVtIGRyYmRfc3RhdGVfcnYgKi8KLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwogCXVuc2lnbmVkIGk7CiAKLQlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIDApOworCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSk7CiAJaWYgKCFhZG1fY3R4LnJlcGx5X3NrYikKIAkJcmV0dXJuIHJldGNvZGU7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCFhZG1fY3R4LnRjb25uKSB7Ci0JCXJldGNvZGUgPSBFUlJfUkVTX05PVF9LTk9XTjsKLQkJZ290byBvdXQ7Ci0JfQotCisJcmVzb3VyY2UgPSBhZG1fY3R4LnJlc291cmNlOwogCS8qIGRlbW90ZSAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShtZGV2LCBSX1NFQ09OREFSWSwgMCk7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCBpKSB7CisJCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShwZWVyX2RldmljZS0+ZGV2aWNlLCBSX1NFQ09OREFSWSwgMCk7CisJCQlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpIHsKKwkJCQlkcmJkX21zZ19wdXRfaW5mbygiZmFpbGVkIHRvIGRlbW90ZSIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJcmV0Y29kZSA9IGNvbm5fdHJ5X2Rpc2Nvbm5lY3QoY29ubmVjdGlvbiwgMCk7CiAJCWlmIChyZXRjb2RlIDwgU1NfU1VDQ0VTUykgewotCQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZW1vdGUiKTsKKwkJCWRyYmRfbXNnX3B1dF9pbmZvKCJmYWlsZWQgdG8gZGlzY29ubmVjdCIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlyZXRjb2RlID0gY29ubl90cnlfZGlzY29ubmVjdChhZG1fY3R4LnRjb25uLCAwKTsKLQlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpIHsKLQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkaXNjb25uZWN0Iik7Ci0JCWdvdG8gb3V0OwotCX0KLQogCS8qIGRldGFjaCAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gYWRtX2RldGFjaChtZGV2LCAwKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJnJlc291cmNlLT5kZXZpY2VzLCBkZXZpY2UsIGkpIHsKKwkJcmV0Y29kZSA9IGFkbV9kZXRhY2goZGV2aWNlLCAwKTsKIAkJaWYgKHJldGNvZGUgPCBTU19TVUNDRVNTIHx8IHJldGNvZGUgPiBOT19FUlJPUikgewogCQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZXRhY2giKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JLyogSWYgd2UgcmVhY2ggdGhpcywgYWxsIHZvbHVtZXMgKG9mIHRoaXMgdGNvbm4pIGFyZSBTZWNvbmRhcnksCisJLyogSWYgd2UgcmVhY2ggdGhpcywgYWxsIHZvbHVtZXMgKG9mIHRoaXMgY29ubmVjdGlvbikgYXJlIFNlY29uZGFyeSwKIAkgKiBEaXNjb25uZWN0ZWQsIERpc2tsZXNzLCBha2EgVW5jb25maWd1cmVkLiBNYWtlIHN1cmUgYWxsIHRocmVhZHMgaGF2ZQogCSAqIGFjdHVhbGx5IHN0b3BwZWQsIHN0YXRlIGhhbmRsaW5nIG9ubHkgZG9lcyBkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgpLiAqLwotCWRyYmRfdGhyZWFkX3N0b3AoJmFkbV9jdHgudGNvbm4tPndvcmtlcik7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkKKwkJZHJiZF90aHJlYWRfc3RvcCgmY29ubmVjdGlvbi0+d29ya2VyKTsKIAogCS8qIE5vdywgbm90aGluZyBjYW4gZmFpbCBhbnltb3JlICovCiAKIAkvKiBkZWxldGUgdm9sdW1lcyAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gYWRtX2RlbGV0ZV9taW5vcihtZGV2KTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJnJlc291cmNlLT5kZXZpY2VzLCBkZXZpY2UsIGkpIHsKKwkJcmV0Y29kZSA9IGFkbV9kZWxfbWlub3IoZGV2aWNlKTsKIAkJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpIHsKIAkJCS8qICJjYW4gbm90IGhhcHBlbiIgKi8KIAkJCWRyYmRfbXNnX3B1dF9pbmZvKCJmYWlsZWQgdG8gZGVsZXRlIHZvbHVtZSIpOwpAQCAtMzM5MywxOSArMzQ1OCwxMSBAQAogCQl9CiAJfQogCi0JLyogZGVsZXRlIGNvbm5lY3Rpb24gKi8KLQlpZiAoY29ubl9sb3dlc3RfbWlub3IoYWRtX2N0eC50Y29ubikgPCAwKSB7Ci0JCWxpc3RfZGVsX3JjdSgmYWRtX2N0eC50Y29ubi0+YWxsX3Rjb25uKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtyZWZfcHV0KCZhZG1fY3R4LnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlsaXN0X2RlbF9yY3UoJnJlc291cmNlLT5yZXNvdXJjZXMpOworCXN5bmNocm9uaXplX3JjdSgpOworCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CisJcmV0Y29kZSA9IE5PX0VSUk9SOwogCi0JCXJldGNvZGUgPSBOT19FUlJPUjsKLQl9IGVsc2UgewotCQkvKiAiY2FuIG5vdCBoYXBwZW4iICovCi0JCXJldGNvZGUgPSBFUlJfUkVTX0lOX1VTRTsKLQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZWxldGUgY29ubmVjdGlvbiIpOwotCX0KLQlnb3RvIG91dDsKIG91dDoKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CkBAIC0zNDEzLDYgKzM0NzAsOCBAQAogCiBpbnQgZHJiZF9hZG1fZGVsX3Jlc291cmNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAKIAlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIERSQkRfQURNX05FRURfUkVTT1VSQ0UpOwpAQCAtMzQyMSwyNCArMzQ4MCwzMCBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCWlmIChjb25uX2xvd2VzdF9taW5vcihhZG1fY3R4LnRjb25uKSA8IDApIHsKLQkJbGlzdF9kZWxfcmN1KCZhZG1fY3R4LnRjb25uLT5hbGxfdGNvbm4pOwotCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJa3JlZl9wdXQoJmFkbV9jdHgudGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOwotCi0JCXJldGNvZGUgPSBOT19FUlJPUjsKLQl9IGVsc2UgeworCXJlc291cmNlID0gYWRtX2N0eC5yZXNvdXJjZTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCWlmIChjb25uZWN0aW9uLT5jc3RhdGUgPiBDX1NUQU5EQUxPTkUpIHsKKwkJCXJldGNvZGUgPSBFUlJfTkVUX0NPTkZJR1VSRUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoIWlkcl9pc19lbXB0eSgmcmVzb3VyY2UtPmRldmljZXMpKSB7CiAJCXJldGNvZGUgPSBFUlJfUkVTX0lOX1VTRTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHJldGNvZGUgPT0gTk9fRVJST1IpCi0JCWRyYmRfdGhyZWFkX3N0b3AoJmFkbV9jdHgudGNvbm4tPndvcmtlcik7CisJbGlzdF9kZWxfcmN1KCZyZXNvdXJjZS0+cmVzb3VyY2VzKTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKQorCQlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT53b3JrZXIpOworCXN5bmNocm9uaXplX3JjdSgpOworCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CisJcmV0Y29kZSA9IE5PX0VSUk9SOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHN0cnVjdCBzaWJfaW5mbyAqc2liKQordm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBzdHJ1Y3Qgc2liX2luZm8gKnNpYikKIHsKIAlzdGF0aWMgYXRvbWljX3QgZHJiZF9nZW5sX3NlcSA9IEFUT01JQ19JTklUKDIpOyAvKiB0d28uICovCiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKQEAgLTM0NDcsOCArMzUxMiw4IEBACiAJaW50IGVyciA9IC1FTk9NRU07CiAKIAlpZiAoc2liLT5zaWJfcmVhc29uID09IFNJQl9TWU5DX1BST0dSRVNTKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1kZXYtPnJzX2xhc3RfYmNhc3QgKyBIWikpCi0JCQltZGV2LT5yc19sYXN0X2JjYXN0ID0gamlmZmllczsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2aWNlLT5yc19sYXN0X2JjYXN0ICsgSFopKQorCQkJZGV2aWNlLT5yc19sYXN0X2JjYXN0ID0gamlmZmllczsKIAkJZWxzZQogCQkJcmV0dXJuOwogCX0KQEAgLTM0NjIsMTAgKzM1MjcsMTAgQEAKIAlkX291dCA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmZHJiZF9nZW5sX2ZhbWlseSwgMCwgRFJCRF9FVkVOVCk7CiAJaWYgKCFkX291dCkgLyogY2Fubm90IGhhcHBlbiwgYnV0IGFueXdheXMuICovCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWRfb3V0LT5taW5vciA9IG1kZXZfdG9fbWlub3IobWRldik7CisJZF9vdXQtPm1pbm9yID0gZGV2aWNlX3RvX21pbm9yKGRldmljZSk7CiAJZF9vdXQtPnJldF9jb2RlID0gTk9fRVJST1I7CiAKLQlpZiAobmxhX3B1dF9zdGF0dXNfaW5mbyhtc2csIG1kZXYsIHNpYikpCisJaWYgKG5sYV9wdXRfc3RhdHVzX2luZm8obXNnLCBkZXZpY2UsIHNpYikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWdlbmxtc2dfZW5kKG1zZywgZF9vdXQpOwogCWVyciA9IGRyYmRfZ2VubF9tdWx0aWNhc3RfZXZlbnRzKG1zZywgMCk7CkBAIC0zNDc4LDcgKzM1NDMsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCW5sbXNnX2ZyZWUobXNnKTsKIGZhaWxlZDoKLQlkZXZfZXJyKERFViwgIkVycm9yICVkIHdoaWxlIGJyb2FkY2FzdGluZyBldmVudC4gIgorCWRyYmRfZXJyKGRldmljZSwgIkVycm9yICVkIHdoaWxlIGJyb2FkY2FzdGluZyBldmVudC4gIgogCQkJIkV2ZW50IHNlcToldSBzaWJfcmVhc29uOiV1XG4iLAogCQkJZXJyLCBzZXEsIHNpYi0+c2liX3JlYXNvbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm9jLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm9jLmMKaW5kZXggYmYzMWQ0MS4uMmYyNmU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcHJvYy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3Byb2MuYwpAQCAtNDYsNyArNDYsNyBAQAogCS5yZWxlYXNlCT0gZHJiZF9wcm9jX3JlbGVhc2UsCiB9OwogCi12b2lkIHNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvbmcgdikKK3N0YXRpYyB2b2lkIHNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvbmcgdikKIHsKIAkvKiB2IGlzIGluIGtCL3NlYy4gV2UgZG9uJ3QgZXhwZWN0IFRpQnl0ZS9zZWMgeWV0LiAqLwogCWlmICh1bmxpa2VseSh2ID49IDEwMDAwMDApKSB7CkBAIC02NiwxNCArNjYsMTQgQEAKICAqCVs9PT09PT4uLi4uLi4uLi4uLi4uLl0gMzMuNSUgKDIzNDU2LzEyMzQ1NikKICAqCWZpbmlzaDogMjoyMDoyMCBzcGVlZDogNiwzNDUgKDYsNDU2KSBLL3NlYwogICovCi1zdGF0aWMgdm9pZCBkcmJkX3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3N0YXRpYyB2b2lkIGRyYmRfc3luY2VyX3Byb2dyZXNzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdCwgcnQsIHJzX2xlZnQ7CiAJdW5zaWduZWQgaW50IHJlczsKIAlpbnQgaSwgeCwgeTsKIAlpbnQgc3RhbGxlZCA9IDA7CiAKLQlkcmJkX2dldF9zeW5jZXJfcHJvZ3Jlc3MobWRldiwgJnJzX2xlZnQsICZyZXMpOworCWRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhkZXZpY2UsICZyc19sZWZ0LCAmcmVzKTsKIAogCXggPSByZXMvNTA7CiAJeSA9IDIwLXg7CkBAIC04NSwyMSArODUsMjEgQEAKIAkJc2VxX3ByaW50ZihzZXEsICIuIik7CiAJc2VxX3ByaW50ZihzZXEsICJdICIpOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9UKQogCQlzZXFfcHJpbnRmKHNlcSwgInZlcmlmaWVkOiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJzeW5jJ2VkOiIpOwogCXNlcV9wcmludGYoc2VxLCAiJTN1LiV1JSUgIiwgcmVzIC8gMTAsIHJlcyAlIDEwKTsKIAogCS8qIGlmIG1vcmUgdGhhbiBhIGZldyBHQiwgZGlzcGxheSBpbiBNQiAqLwotCWlmIChtZGV2LT5yc190b3RhbCA+ICg0VUwgPDwgKDMwIC0gQk1fQkxPQ0tfU0hJRlQpKSkKKwlpZiAoZGV2aWNlLT5yc190b3RhbCA+ICg0VUwgPDwgKDMwIC0gQk1fQkxPQ0tfU0hJRlQpKSkKIAkJc2VxX3ByaW50ZihzZXEsICIoJWx1LyVsdSlNIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZykgQml0MktCKHJzX2xlZnQgPj4gMTApLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IobWRldi0+cnNfdG90YWwgPj4gMTApKTsKKwkJCSAgICAodW5zaWduZWQgbG9uZykgQml0MktCKGRldmljZS0+cnNfdG90YWwgPj4gMTApKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiKCVsdS8lbHUpS1xuXHQiLAogCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IocnNfbGVmdCksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIEJpdDJLQihtZGV2LT5yc190b3RhbCkpOworCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IoZGV2aWNlLT5yc190b3RhbCkpOwogCiAJLyogc2VlIGRyaXZlcnMvbWQvbWQuYwogCSAqIFdlIGRvIG5vdCB3YW50IHRvIG92ZXJmbG93LCBzbyB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMgYW5kCkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCSAqIGF0IGxlYXN0IChEUkJEX1NZTkNfTUFSS1MtMikqRFJCRF9TWU5DX01BUktfU1RFUCBvbGQsIGFuZCBoYXMgYXQKIAkgKiBsZWFzdCBEUkJEX1NZTkNfTUFSS19TVEVQIHRpbWUgYmVmb3JlIGl0IHdpbGwgYmUgbW9kaWZpZWQuICovCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIH4xOHMgYXZlcmFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIDIpICUgRFJCRF9TWU5DX01BUktTOwotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19tYXJrX3RpbWVbaV0pIC8gSFo7CisJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIDIpICUgRFJCRF9TWU5DX01BUktTOworCWR0ID0gKGppZmZpZXMgLSBkZXZpY2UtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKIAlpZiAoZHQgPiAoRFJCRF9TWU5DX01BUktfU1RFUCAqIERSQkRfU1lOQ19NQVJLUykpCiAJCXN0YWxsZWQgPSAxOwogCiAJaWYgKCFkdCkKIAkJZHQrKzsKLQlkYiA9IG1kZXYtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CisJZGIgPSBkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CiAJcnQgPSAoZHQgKiAocnNfbGVmdCAvIChkYi8xMDArMSkpKS8xMDA7IC8qIHNlY29uZHMgKi8KIAogCXNlcV9wcmludGYoc2VxLCAiZmluaXNoOiAlbHU6JTAybHU6JTAybHUiLApAQCAtMTM0LDExICsxMzQsMTEgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIH4zcyBhdmVyYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWlmIChwcm9jX2RldGFpbHMgPj0gMSkgewogCQkvKiB0aGlzIGlzIHdoYXQgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKCkgdXNlcyAqLwotCQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKLQkJZHQgPSAoamlmZmllcyAtIG1kZXYtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKKwkJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKKwkJZHQgPSAoamlmZmllcyAtIGRldmljZS0+cnNfbWFya190aW1lW2ldKSAvIEhaOwogCQlpZiAoIWR0KQogCQkJZHQrKzsKLQkJZGIgPSBtZGV2LT5yc19tYXJrX2xlZnRbaV0gLSByc19sZWZ0OworCQlkYiA9IGRldmljZS0+cnNfbWFya19sZWZ0W2ldIC0gcnNfbGVmdDsKIAkJZGJkdCA9IEJpdDJLQihkYi9kdCk7CiAJCXNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc2VxLCBkYmR0KTsKIAkJc2VxX3ByaW50ZihzZXEsICIgLS0gIik7CkBAIC0xNDcsMzQgKzE0NywzNCBAQAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb25nIHRlcm0gYXZlcmFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLyogbWVhbiBzcGVlZCBzaW5jZSBzeW5jZXIgc3RhcnRlZAogCSAqIHdlIGRvIGFjY291bnQgZm9yIFBhdXNlZFN5bmMgcGVyaW9kcyAqLwotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19zdGFydCAtIG1kZXYtPnJzX3BhdXNlZCkgLyBIWjsKKwlkdCA9IChqaWZmaWVzIC0gZGV2aWNlLT5yc19zdGFydCAtIGRldmljZS0+cnNfcGF1c2VkKSAvIEhaOwogCWlmIChkdCA9PSAwKQogCQlkdCA9IDE7Ci0JZGIgPSBtZGV2LT5yc190b3RhbCAtIHJzX2xlZnQ7CisJZGIgPSBkZXZpY2UtPnJzX3RvdGFsIC0gcnNfbGVmdDsKIAlkYmR0ID0gQml0MktCKGRiL2R0KTsKIAlzZXFfcHJpbnRmX3dpdGhfdGhvdXNhbmRzX2dyb3VwaW5nKHNlcSwgZGJkdCk7CiAJc2VxX3ByaW50ZihzZXEsICIpIik7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8Ci0JICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUykgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUykgewogCQlzZXFfcHJpbnRmKHNlcSwgIiB3YW50OiAiKTsKLQkJc2VxX3ByaW50Zl93aXRoX3Rob3VzYW5kc19ncm91cGluZyhzZXEsIG1kZXYtPmNfc3luY19yYXRlKTsKKwkJc2VxX3ByaW50Zl93aXRoX3Rob3VzYW5kc19ncm91cGluZyhzZXEsIGRldmljZS0+Y19zeW5jX3JhdGUpOwogCX0KIAlzZXFfcHJpbnRmKHNlcSwgIiBLL3NlYyVzXG4iLCBzdGFsbGVkID8gIiAoc3RhbGxlZCkiIDogIiIpOwogCiAJaWYgKHByb2NfZGV0YWlscyA+PSAxKSB7CiAJCS8qIDY0IGJpdDoKIAkJICogd2UgY29udmVydCB0byBzZWN0b3JzIGluIHRoZSBkaXNwbGF5IGJlbG93LiAqLwotCQl1bnNpZ25lZCBsb25nIGJtX2JpdHMgPSBkcmJkX2JtX2JpdHMobWRldik7CisJCXVuc2lnbmVkIGxvbmcgYm1fYml0cyA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOwogCQl1bnNpZ25lZCBsb25nIGJpdF9wb3M7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdG9wX3NlY3RvciA9IDA7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkgewotCQkJYml0X3BvcyA9IGJtX2JpdHMgLSBtZGV2LT5vdl9sZWZ0OwotCQkJaWYgKHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IobWRldikpCi0JCQkJc3RvcF9zZWN0b3IgPSBtZGV2LT5vdl9zdG9wX3NlY3RvcjsKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkgeworCQkJYml0X3BvcyA9IGJtX2JpdHMgLSBkZXZpY2UtPm92X2xlZnQ7CisJCQlpZiAodmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpKQorCQkJCXN0b3Bfc2VjdG9yID0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAkJfSBlbHNlCi0JCQliaXRfcG9zID0gbWRldi0+Ym1fcmVzeW5jX2ZvOworCQkJYml0X3BvcyA9IGRldmljZS0+Ym1fcmVzeW5jX2ZvOwogCQkvKiBUb3RhbCBzZWN0b3JzIG1heSBiZSBzbGlnaHRseSBvZmYgZm9yIG9kZGx5CiAJCSAqIHNpemVkIGRldmljZXMuIFNvIHdoYXQuICovCiAJCXNlcV9wcmludGYoc2VxLApAQCAtMjAyLDcgKzIwMiw3IEBACiB7CiAJaW50IGksIHByZXZfaSA9IC0xOwogCWNvbnN0IGNoYXIgKnNuOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAljaGFyIHdwOwogCkBAIC0yMzYsNzIgKzIzNiw3MiBAQAogCSovCiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZtaW5vcnMsIG1kZXYsIGkpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgZGV2aWNlLCBpKSB7CiAJCWlmIChwcmV2X2kgIT0gaSAtIDEpCiAJCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CiAJCXByZXZfaSA9IGk7CiAKLQkJc24gPSBkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pOworCQlzbiA9IGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKTsKIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYKLQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgotCQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgeworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJgorCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYKKwkJICAgIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgewogCQkJc2VxX3ByaW50ZihzZXEsICIlMmQ6IGNzOlVuY29uZmlndXJlZFxuIiwgaSk7CiAJCX0gZWxzZSB7Ci0JCQkvKiByZXNldCBtZGV2LT5jb25nZXN0aW9uX3JlYXNvbiAqLwotCQkJYmRpX3J3X2Nvbmdlc3RlZCgmbWRldi0+cnFfcXVldWUtPmJhY2tpbmdfZGV2X2luZm8pOworCQkJLyogcmVzZXQgZGV2aWNlLT5jb25nZXN0aW9uX3JlYXNvbiAqLworCQkJYmRpX3J3X2Nvbmdlc3RlZCgmZGV2aWNlLT5ycV9xdWV1ZS0+YmFja2luZ19kZXZfaW5mbyk7CiAKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl3cCA9IG5jID8gbmMtPndpcmVfcHJvdG9jb2wgLSBEUkJEX1BST1RfQSArICdBJyA6ICcgJzsKIAkJCXNlcV9wcmludGYoc2VxLAogCQkJICAgIiUyZDogY3M6JXMgcm86JXMvJXMgZHM6JXMvJXMgJWMgJWMlYyVjJWMlYyVjXG4iCiAJCQkgICAiICAgIG5zOiV1IG5yOiV1IGR3OiV1IGRyOiV1IGFsOiV1IGJtOiV1ICIKIAkJCSAgICJsbzolZCBwZTolZCB1YTolZCBhcDolZCBlcDolZCB3bzolYyIsCiAJCQkgICBpLCBzbiwKLQkJCSAgIGRyYmRfcm9sZV9zdHIobWRldi0+c3RhdGUucm9sZSksCi0JCQkgICBkcmJkX3JvbGVfc3RyKG1kZXYtPnN0YXRlLnBlZXIpLAotCQkJICAgZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSwKLQkJCSAgIGRyYmRfZGlza19zdHIobWRldi0+c3RhdGUucGRzayksCisJCQkgICBkcmJkX3JvbGVfc3RyKGRldmljZS0+c3RhdGUucm9sZSksCisJCQkgICBkcmJkX3JvbGVfc3RyKGRldmljZS0+c3RhdGUucGVlciksCisJCQkgICBkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzayksCisJCQkgICBkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUucGRzayksCiAJCQkgICB3cCwKLQkJCSAgIGRyYmRfc3VzcGVuZGVkKG1kZXYpID8gJ3MnIDogJ3InLAotCQkJICAgbWRldi0+c3RhdGUuYWZ0cl9pc3AgPyAnYScgOiAnLScsCi0JCQkgICBtZGV2LT5zdGF0ZS5wZWVyX2lzcCA/ICdwJyA6ICctJywKLQkJCSAgIG1kZXYtPnN0YXRlLnVzZXJfaXNwID8gJ3UnIDogJy0nLAotCQkJICAgbWRldi0+Y29uZ2VzdGlvbl9yZWFzb24gPzogJy0nLAotCQkJICAgdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpID8gJ3MnIDogJy0nLAotCQkJICAgbWRldi0+c2VuZF9jbnQvMiwKLQkJCSAgIG1kZXYtPnJlY3ZfY250LzIsCi0JCQkgICBtZGV2LT53cml0X2NudC8yLAotCQkJICAgbWRldi0+cmVhZF9jbnQvMiwKLQkJCSAgIG1kZXYtPmFsX3dyaXRfY250LAotCQkJICAgbWRldi0+Ym1fd3JpdF9jbnQsCi0JCQkgICBhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSwKLQkJCSAgIGF0b21pY19yZWFkKCZtZGV2LT5hcF9wZW5kaW5nX2NudCkgKwotCQkJICAgYXRvbWljX3JlYWQoJm1kZXYtPnJzX3BlbmRpbmdfY250KSwKLQkJCSAgIGF0b21pY19yZWFkKCZtZGV2LT51bmFja2VkX2NudCksCi0JCQkgICBhdG9taWNfcmVhZCgmbWRldi0+YXBfYmlvX2NudCksCi0JCQkgICBtZGV2LT50Y29ubi0+ZXBvY2hzLAotCQkJICAgd3JpdGVfb3JkZXJpbmdfY2hhcnNbbWRldi0+dGNvbm4tPndyaXRlX29yZGVyaW5nXQorCQkJICAgZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSA/ICdzJyA6ICdyJywKKwkJCSAgIGRldmljZS0+c3RhdGUuYWZ0cl9pc3AgPyAnYScgOiAnLScsCisJCQkgICBkZXZpY2UtPnN0YXRlLnBlZXJfaXNwID8gJ3AnIDogJy0nLAorCQkJICAgZGV2aWNlLT5zdGF0ZS51c2VyX2lzcCA/ICd1JyA6ICctJywKKwkJCSAgIGRldmljZS0+Y29uZ2VzdGlvbl9yZWFzb24gPzogJy0nLAorCQkJICAgdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncykgPyAncycgOiAnLScsCisJCQkgICBkZXZpY2UtPnNlbmRfY250LzIsCisJCQkgICBkZXZpY2UtPnJlY3ZfY250LzIsCisJCQkgICBkZXZpY2UtPndyaXRfY250LzIsCisJCQkgICBkZXZpY2UtPnJlYWRfY250LzIsCisJCQkgICBkZXZpY2UtPmFsX3dyaXRfY250LAorCQkJICAgZGV2aWNlLT5ibV93cml0X2NudCwKKwkJCSAgIGF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCksCisJCQkgICBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgKworCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+cnNfcGVuZGluZ19jbnQpLAorCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+dW5hY2tlZF9jbnQpLAorCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+YXBfYmlvX2NudCksCisJCQkgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5lcG9jaHMsCisJCQkgICB3cml0ZV9vcmRlcmluZ19jaGFyc1tmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZ10KIAkJCSk7CiAJCQlzZXFfcHJpbnRmKHNlcSwgIiBvb3M6JWxsdVxuIiwKIAkJCQkgICBCaXQyS0IoKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkJICAgZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpKTsKKwkJCQkJICAgZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSkpOwogCQl9Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAotCQkgICAgbWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCQlkcmJkX3N5bmNlcl9wcm9ncmVzcyhtZGV2LCBzZXEpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fAorCQkgICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCQlkcmJkX3N5bmNlcl9wcm9ncmVzcyhkZXZpY2UsIHNlcSk7CiAKLQkJaWYgKHByb2NfZGV0YWlscyA+PSAxICYmIGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkgewotCQkJbGNfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIG1kZXYtPnJlc3luYyk7Ci0JCQlsY19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgbWRldi0+YWN0X2xvZyk7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJaWYgKHByb2NfZGV0YWlscyA+PSAxICYmIGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCQlsY19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgZGV2aWNlLT5yZXN5bmMpOworCQkJbGNfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIGRldmljZS0+YWN0X2xvZyk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQl9CiAKIAkJaWYgKHByb2NfZGV0YWlscyA+PSAyKSB7Ci0JCQlpZiAobWRldi0+cmVzeW5jKSB7Ci0JCQkJbGNfc2VxX2R1bXBfZGV0YWlscyhzZXEsIG1kZXYtPnJlc3luYywgInJzX2xlZnQiLAorCQkJaWYgKGRldmljZS0+cmVzeW5jKSB7CisJCQkJbGNfc2VxX2R1bXBfZGV0YWlscyhzZXEsIGRldmljZS0+cmVzeW5jLCAicnNfbGVmdCIsCiAJCQkJCXJlc3luY19kdW1wX2RldGFpbCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3Byb3RvY29sLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDRlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMjk1IEBACisjaWZuZGVmIF9fRFJCRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9fRFJCRF9QUk9UT0NPTF9ICisKK2VudW0gZHJiZF9wYWNrZXQgeworCS8qIHJlY2VpdmVyIChkYXRhIHNvY2tldCkgKi8KKwlQX0RBVEEJCSAgICAgID0gMHgwMCwKKwlQX0RBVEFfUkVQTFkJICAgICAgPSAweDAxLCAvKiBSZXNwb25zZSB0byBQX0RBVEFfUkVRVUVTVCAqLworCVBfUlNfREFUQV9SRVBMWQkgICAgICA9IDB4MDIsIC8qIFJlc3BvbnNlIHRvIFBfUlNfREFUQV9SRVFVRVNUICovCisJUF9CQVJSSUVSCSAgICAgID0gMHgwMywKKwlQX0JJVE1BUAkgICAgICA9IDB4MDQsCisJUF9CRUNPTUVfU1lOQ19UQVJHRVQgID0gMHgwNSwKKwlQX0JFQ09NRV9TWU5DX1NPVVJDRSAgPSAweDA2LAorCVBfVU5QTFVHX1JFTU9URQkgICAgICA9IDB4MDcsIC8qIFVzZWQgYXQgdmFyaW91cyB0aW1lcyB0byBoaW50IHRoZSBwZWVyICovCisJUF9EQVRBX1JFUVVFU1QJICAgICAgPSAweDA4LCAvKiBVc2VkIHRvIGFzayBmb3IgYSBkYXRhIGJsb2NrICovCisJUF9SU19EQVRBX1JFUVVFU1QgICAgID0gMHgwOSwgLyogVXNlZCB0byBhc2sgZm9yIGEgZGF0YSBibG9jayBmb3IgcmVzeW5jICovCisJUF9TWU5DX1BBUkFNCSAgICAgID0gMHgwYSwKKwlQX1BST1RPQ09MCSAgICAgID0gMHgwYiwKKwlQX1VVSURTCQkgICAgICA9IDB4MGMsCisJUF9TSVpFUwkJICAgICAgPSAweDBkLAorCVBfU1RBVEUJCSAgICAgID0gMHgwZSwKKwlQX1NZTkNfVVVJRAkgICAgICA9IDB4MGYsCisJUF9BVVRIX0NIQUxMRU5HRSAgICAgID0gMHgxMCwKKwlQX0FVVEhfUkVTUE9OU0UJICAgICAgPSAweDExLAorCVBfU1RBVEVfQ0hHX1JFUQkgICAgICA9IDB4MTIsCisKKwkvKiBhc2VuZGVyIChtZXRhIHNvY2tldCAqLworCVBfUElORwkJICAgICAgPSAweDEzLAorCVBfUElOR19BQ0sJICAgICAgPSAweDE0LAorCVBfUkVDVl9BQ0sJICAgICAgPSAweDE1LCAvKiBVc2VkIGluIHByb3RvY29sIEIgKi8KKwlQX1dSSVRFX0FDSwkgICAgICA9IDB4MTYsIC8qIFVzZWQgaW4gcHJvdG9jb2wgQyAqLworCVBfUlNfV1JJVEVfQUNLCSAgICAgID0gMHgxNywgLyogSXMgYSBQX1dSSVRFX0FDSywgYWRkaXRpb25hbGx5IGNhbGwgc2V0X2luX3N5bmMoKS4gKi8KKwlQX1NVUEVSU0VERUQJICAgICAgPSAweDE4LCAvKiBVc2VkIGluIHByb3RvIEMsIHR3by1wcmltYXJpZXMgY29uZmxpY3QgZGV0ZWN0aW9uICovCisJUF9ORUdfQUNLCSAgICAgID0gMHgxOSwgLyogU2VudCBpZiBsb2NhbCBkaXNrIGlzIHVudXNhYmxlICovCisJUF9ORUdfRFJFUExZCSAgICAgID0gMHgxYSwgLyogTG9jYWwgZGlzayBpcyBicm9rZW4uLi4gKi8KKwlQX05FR19SU19EUkVQTFkJICAgICAgPSAweDFiLCAvKiBMb2NhbCBkaXNrIGlzIGJyb2tlbi4uLiAqLworCVBfQkFSUklFUl9BQ0sJICAgICAgPSAweDFjLAorCVBfU1RBVEVfQ0hHX1JFUExZICAgICA9IDB4MWQsCisKKwkvKiAibmV3IiBjb21tYW5kcywgbm8gbG9uZ2VyIGZpdHRpbmcgaW50byB0aGUgb3JkZXJpbmcgc2NoZW1lIGFib3ZlICovCisKKwlQX09WX1JFUVVFU1QJICAgICAgPSAweDFlLCAvKiBkYXRhIHNvY2tldCAqLworCVBfT1ZfUkVQTFkJICAgICAgPSAweDFmLAorCVBfT1ZfUkVTVUxUCSAgICAgID0gMHgyMCwgLyogbWV0YSBzb2NrZXQgKi8KKwlQX0NTVU1fUlNfUkVRVUVTVCAgICAgPSAweDIxLCAvKiBkYXRhIHNvY2tldCAqLworCVBfUlNfSVNfSU5fU1lOQwkgICAgICA9IDB4MjIsIC8qIG1ldGEgc29ja2V0ICovCisJUF9TWU5DX1BBUkFNODkJICAgICAgPSAweDIzLCAvKiBkYXRhIHNvY2tldCwgcHJvdG9jb2wgdmVyc2lvbiA4OSByZXBsYWNlbWVudCBmb3IgUF9TWU5DX1BBUkFNICovCisJUF9DT01QUkVTU0VEX0JJVE1BUCAgID0gMHgyNCwgLyogY29tcHJlc3NlZCBvciBvdGhlcndpc2UgZW5jb2RlZCBiaXRtYXAgdHJhbnNmZXIgKi8KKwkvKiBQX0NLUFRfRkVOQ0VfUkVRICAgICAgPSAweDI1LCAqIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wgRCAqLworCS8qIFBfQ0tQVF9ESVNBQkxFX1JFUSAgICA9IDB4MjYsICogY3VycmVudGx5IHJlc2VydmVkIGZvciBwcm90b2NvbCBEICovCisJUF9ERUxBWV9QUk9CRSAgICAgICAgID0gMHgyNywgLyogaXMgdXNlZCBvbiBCT1RIIHNvY2tldHMgKi8KKwlQX09VVF9PRl9TWU5DICAgICAgICAgPSAweDI4LCAvKiBNYXJrIGFzIG91dCBvZiBzeW5jIChPdXRydW5uaW5nKSwgZGF0YSBzb2NrZXQgKi8KKwlQX1JTX0NBTkNFTCAgICAgICAgICAgPSAweDI5LCAvKiBtZXRhOiBVc2VkIHRvIGNhbmNlbCBSU19EQVRBX1JFUVVFU1QgcGFja2V0IGJ5IFN5bmNTb3VyY2UgKi8KKwlQX0NPTk5fU1RfQ0hHX1JFUSAgICAgPSAweDJhLCAvKiBkYXRhIHNvY2s6IENvbm5lY3Rpb24gd2lkZSBzdGF0ZSByZXF1ZXN0ICovCisJUF9DT05OX1NUX0NIR19SRVBMWSAgID0gMHgyYiwgLyogbWV0YSBzb2NrOiBDb25uZWN0aW9uIHNpZGUgc3RhdGUgcmVxIHJlcGx5ICovCisJUF9SRVRSWV9XUklURQkgICAgICA9IDB4MmMsIC8qIFByb3RvY29sIEM6IHJldHJ5IGNvbmZsaWN0aW5nIHdyaXRlIHJlcXVlc3QgKi8KKwlQX1BST1RPQ09MX1VQREFURSAgICAgPSAweDJkLCAvKiBkYXRhIHNvY2s6IGlzIHVzZWQgaW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMgKi8KKworCVBfTUFZX0lHTk9SRQkgICAgICA9IDB4MTAwLCAvKiBGbGFnIHRvIHRlc3QgaWYgKGNtZCA+IFBfTUFZX0lHTk9SRSkgLi4uICovCisJUF9NQVhfT1BUX0NNRAkgICAgICA9IDB4MTAxLAorCisJLyogc3BlY2lhbCBjb21tYW5kIGlkcyBmb3IgaGFuZHNoYWtlICovCisKKwlQX0lOSVRJQUxfTUVUQQkgICAgICA9IDB4ZmZmMSwgLyogRmlyc3QgUGFja2V0IG9uIHRoZSBNZXRhU29jayAqLworCVBfSU5JVElBTF9EQVRBCSAgICAgID0gMHhmZmYyLCAvKiBGaXJzdCBQYWNrZXQgb24gdGhlIFNvY2tldCAqLworCisJUF9DT05ORUNUSU9OX0ZFQVRVUkVTID0gMHhmZmZlCS8qIEZJWEVEIGZvciB0aGUgbmV4dCBjZW50dXJ5ISAqLworfTsKKworI2lmbmRlZiBfX3BhY2tlZAorI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGxheW91dCBmb3IgYSBwYWNrZXQgb24gdGhlIHdpcmUuCisgKiBUaGUgYnl0ZW9yZGVyIGlzIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAgICAgKGV4Y2VwdCBibG9ja19pZCBhbmQgYmFycmllciBmaWVsZHMuCisgKgl0aGVzZSBhcmUgcG9pbnRlcnMgdG8gbG9jYWwgc3RydWN0cworICoJYW5kIGhhdmUgbm8gcmVsZXZhbmNlIGZvciB0aGUgcGFydG5lciwKKyAqCXdoaWNoIGp1c3QgZWNob2VzIHRoZW0gYXMgcmVjZWl2ZWQuKQorICoKKyAqIE5PVEUgdGhhdCB0aGUgcGF5bG9hZCBzdGFydHMgYXQgYSBsb25nIGFsaWduZWQgb2Zmc2V0LAorICogcmVnYXJkbGVzcyBvZiAzMiBvciA2NCBiaXQgYXJjaCEKKyAqLworc3RydWN0IHBfaGVhZGVyODAgeworCXUzMgkgIG1hZ2ljOworCXUxNgkgIGNvbW1hbmQ7CisJdTE2CSAgbGVuZ3RoOwkvKiBieXRlcyBvZiBkYXRhIGFmdGVyIHRoaXMgaGVhZGVyICovCit9IF9fcGFja2VkOworCisvKiBIZWFkZXIgZm9yIGJpZyBwYWNrZXRzLCBVc2VkIGZvciBkYXRhIHBhY2tldHMgZXhjZWVkaW5nIDY0a0IgKi8KK3N0cnVjdCBwX2hlYWRlcjk1IHsKKwl1MTYJICBtYWdpYzsJLyogdXNlIERSQkRfTUFHSUNfQklHIGhlcmUgKi8KKwl1MTYJICBjb21tYW5kOworCXUzMgkgIGxlbmd0aDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2hlYWRlcjEwMCB7CisJdTMyCSAgbWFnaWM7CisJdTE2CSAgdm9sdW1lOworCXUxNgkgIGNvbW1hbmQ7CisJdTMyCSAgbGVuZ3RoOworCXUzMgkgIHBhZDsKK30gX19wYWNrZWQ7CisKKy8qIHRoZXNlIGRlZmluZXMgbXVzdCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGNoYW5naW5nIHRoZSBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIERQX0hBUkRCQVJSSUVSCSAgICAgIDEgLyogZGVwcmljYXRlZCAqLworI2RlZmluZSBEUF9SV19TWU5DCSAgICAgIDIgLyogZXF1YWxzIFJFUV9TWU5DICAgICovCisjZGVmaW5lIERQX01BWV9TRVRfSU5fU1lOQyAgICA0CisjZGVmaW5lIERQX1VOUExVRyAgICAgICAgICAgICA4IC8qIG5vdCB1c2VkIGFueW1vcmUgICAqLworI2RlZmluZSBEUF9GVUEgICAgICAgICAgICAgICAxNiAvKiBlcXVhbHMgUkVRX0ZVQSAgICAgKi8KKyNkZWZpbmUgRFBfRkxVU0ggICAgICAgICAgICAgMzIgLyogZXF1YWxzIFJFUV9GTFVTSCAgICovCisjZGVmaW5lIERQX0RJU0NBUkQgICAgICAgICAgIDY0IC8qIGVxdWFscyBSRVFfRElTQ0FSRCAqLworI2RlZmluZSBEUF9TRU5EX1JFQ0VJVkVfQUNLIDEyOCAvKiBUaGlzIGlzIGEgcHJvdG8gQiB3cml0ZSByZXF1ZXN0ICovCisjZGVmaW5lIERQX1NFTkRfV1JJVEVfQUNLICAgMjU2IC8qIFRoaXMgaXMgYSBwcm90byBDIHdyaXRlIHJlcXVlc3QgKi8KKworc3RydWN0IHBfZGF0YSB7CisJdTY0CSAgICBzZWN0b3I7ICAgIC8qIDY0IGJpdHMgc2VjdG9yIG51bWJlciAqLworCXU2NAkgICAgYmxvY2tfaWQ7ICAvKiB0byBpZGVudGlmeSB0aGUgcmVxdWVzdCBpbiBwcm90b2NvbCBCJkMgKi8KKwl1MzIJICAgIHNlcV9udW07CisJdTMyCSAgICBkcF9mbGFnczsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb21tYW5kcyB3aGljaCBzaGFyZSBhIHN0cnVjdDoKKyAqICBwX2Jsb2NrX2FjazoKKyAqICAgUF9SRUNWX0FDSyAocHJvdG8gQiksIFBfV1JJVEVfQUNLIChwcm90byBDKSwKKyAqICAgUF9TVVBFUlNFREVEIChwcm90byBDLCB0d28tcHJpbWFyaWVzIGNvbmZsaWN0IGRldGVjdGlvbikKKyAqICBwX2Jsb2NrX3JlcToKKyAqICAgUF9EQVRBX1JFUVVFU1QsIFBfUlNfREFUQV9SRVFVRVNUCisgKi8KK3N0cnVjdCBwX2Jsb2NrX2FjayB7CisJdTY0CSAgICBzZWN0b3I7CisJdTY0CSAgICBibG9ja19pZDsKKwl1MzIJICAgIGJsa3NpemU7CisJdTMyCSAgICBzZXFfbnVtOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfYmxvY2tfcmVxIHsKKwl1NjQgc2VjdG9yOworCXU2NCBibG9ja19pZDsKKwl1MzIgYmxrc2l6ZTsKKwl1MzIgcGFkOwkvKiB0byBtdWx0aXBsZSBvZiA4IEJ5dGUgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb21tYW5kcyB3aXRoIHRoZWlyIG93biBzdHJ1Y3QgZm9yIGFkZGl0aW9uYWwgZmllbGRzOgorICogICBQX0NPTk5FQ1RJT05fRkVBVFVSRVMKKyAqICAgUF9CQVJSSUVSCisgKiAgIFBfQkFSUklFUl9BQ0sKKyAqICAgUF9TWU5DX1BBUkFNCisgKiAgIFJlcG9ydFBhcmFtcworICovCisKK3N0cnVjdCBwX2Nvbm5lY3Rpb25fZmVhdHVyZXMgeworCXUzMiBwcm90b2NvbF9taW47CisJdTMyIGZlYXR1cmVfZmxhZ3M7CisJdTMyIHByb3RvY29sX21heDsKKworCS8qIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoIGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzCisJICogZm9yIG5vdywgZmVhdHVyZV9mbGFncyBhbmQgdGhlIHJlc2VydmVkIGFycmF5IHNoYWxsIGJlIHplcm8uCisJICovCisKKwl1MzIgX3BhZDsKKwl1NjQgcmVzZXJ2ZWRbN107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9iYXJyaWVyIHsKKwl1MzIgYmFycmllcjsJLyogYmFycmllciBudW1iZXIgX2hhbmRsZV8gb25seSAqLworCXUzMiBwYWQ7CS8qIHRvIG11bHRpcGxlIG9mIDggQnl0ZSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfYmFycmllcl9hY2sgeworCXUzMiBiYXJyaWVyOworCXUzMiBzZXRfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3JzX3BhcmFtIHsKKwl1MzIgcmVzeW5jX3JhdGU7CisKKwkgICAgICAvKiBTaW5jZSBwcm90b2NvbCB2ZXJzaW9uIDg4IGFuZCBoaWdoZXIuICovCisJY2hhciB2ZXJpZnlfYWxnWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcnNfcGFyYW1fODkgeworCXUzMiByZXN5bmNfcmF0ZTsKKwkvKiBwcm90b2NvbCB2ZXJzaW9uIDg5OiAqLworCWNoYXIgdmVyaWZ5X2FsZ1tTSEFSRURfU0VDUkVUX01BWF07CisJY2hhciBjc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcnNfcGFyYW1fOTUgeworCXUzMiByZXN5bmNfcmF0ZTsKKwljaGFyIHZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOworCWNoYXIgY3N1bXNfYWxnW1NIQVJFRF9TRUNSRVRfTUFYXTsKKwl1MzIgY19wbGFuX2FoZWFkOworCXUzMiBjX2RlbGF5X3RhcmdldDsKKwl1MzIgY19maWxsX3RhcmdldDsKKwl1MzIgY19tYXhfcmF0ZTsKK30gX19wYWNrZWQ7CisKK2VudW0gZHJiZF9jb25uX2ZsYWdzIHsKKwlDRl9ESVNDQVJEX01ZX0RBVEEgPSAxLAorCUNGX0RSWV9SVU4gPSAyLAorfTsKKworc3RydWN0IHBfcHJvdG9jb2wgeworCXUzMiBwcm90b2NvbDsKKwl1MzIgYWZ0ZXJfc2JfMHA7CisJdTMyIGFmdGVyX3NiXzFwOworCXUzMiBhZnRlcl9zYl8ycDsKKwl1MzIgY29ubl9mbGFnczsKKwl1MzIgdHdvX3ByaW1hcmllczsKKworCS8qIFNpbmNlIHByb3RvY29sIHZlcnNpb24gODcgYW5kIGhpZ2hlci4gKi8KKwljaGFyIGludGVncml0eV9hbGdbMF07CisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3V1aWRzIHsKKwl1NjQgdXVpZFtVSV9FWFRFTkRFRF9TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3JzX3V1aWQgeworCXU2NAkgICAgdXVpZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3NpemVzIHsKKwl1NjQJICAgIGRfc2l6ZTsgIC8qIHNpemUgb2YgZGlzayAqLworCXU2NAkgICAgdV9zaXplOyAgLyogdXNlciByZXF1ZXN0ZWQgc2l6ZSAqLworCXU2NAkgICAgY19zaXplOyAgLyogY3VycmVudCBleHBvcnRlZCBzaXplICovCisJdTMyCSAgICBtYXhfYmlvX3NpemU7ICAvKiBNYXhpbWFsIHNpemUgb2YgYSBCSU8gKi8KKwl1MTYJICAgIHF1ZXVlX29yZGVyX3R5cGU7ICAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIERSQkQqLworCXUxNgkgICAgZGRzX2ZsYWdzOyAvKiB1c2UgZW51bSBkZHNfZmxhZ3MgaGVyZS4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3N0YXRlIHsKKwl1MzIJICAgIHN0YXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcmVxX3N0YXRlIHsKKwl1MzIJICAgIG1hc2s7CisJdTMyCSAgICB2YWw7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgeworCXUzMgkgICAgcmV0Y29kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2RyYmQwNl9wYXJhbSB7CisJdTY0CSAgc2l6ZTsKKwl1MzIJICBzdGF0ZTsKKwl1MzIJICBibGtzaXplOworCXUzMgkgIHByb3RvY29sOworCXUzMgkgIHZlcnNpb247CisJdTMyCSAgZ2VuX2NudFs1XTsKKwl1MzIJICBiaXRfbWFwX2dlbls1XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2Jsb2NrX2Rlc2MgeworCXU2NCBzZWN0b3I7CisJdTMyIGJsa3NpemU7CisJdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCit9IF9fcGFja2VkOworCisvKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZyBmaWVsZC4KKyAqIEJ1bXAgcHJvdG8gdmVyc2lvbiB3aGVuIGNoYW5naW5nIHRoaXMuICovCitlbnVtIGRyYmRfYml0bWFwX2NvZGUgeworCS8qIFJMRV9WTElfQnl0ZXMgPSAwLAorCSAqIGFuZCBvdGhlciBiaXQgdmFyaWFudHMgaGFkIGJlZW4gZGVmaW5lZCBkdXJpbmcKKwkgKiBhbGdvcml0aG0gZXZhbHVhdGlvbi4gKi8KKwlSTEVfVkxJX0JpdHMgPSAyLAorfTsKKworc3RydWN0IHBfY29tcHJlc3NlZF9ibSB7CisJLyogKGVuY29kaW5nICYgMHgwZik6IGFjdHVhbCBlbmNvZGluZywgc2VlIGVudW0gZHJiZF9iaXRtYXBfY29kZQorCSAqIChlbmNvZGluZyAmIDB4ODApOiBwb2xhcml0eSAoc2V0L3Vuc2V0KSBvZiBmaXJzdCBydW5sZW5ndGgKKwkgKiAoKGVuY29kaW5nID4+IDQpICYgMHgwNyk6IHBhZF9iaXRzLCBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzCisJICogdXNlZCB0byBwYWQgdXAgdG8gaGVhZC5sZW5ndGggYnl0ZXMKKwkgKi8KKwl1OCBlbmNvZGluZzsKKworCXU4IGNvZGVbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9kZWxheV9wcm9iZTkzIHsKKwl1MzIgICAgIHNlcV9udW07IC8qIHNlcXVlbmNlIG51bWJlciB0byBtYXRjaCB0aGUgdHdvIHByb2JlIHBhY2tldHMgKi8KKwl1MzIgICAgIG9mZnNldDsgIC8qIHVzZWNzIHRoZSBwcm9iZSBnb3Qgc2VudCBhZnRlciB0aGUgcmVmZXJlbmNlIHRpbWUgcG9pbnQgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBCaXRtYXAgcGFja2V0cyBuZWVkIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgcGFnZSBvbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciwKKyAqIHNvIHdlIGFyZSBsaW1pdGVkIHRvIDQgS2lCIChhbmQgbm90IHRvIFBBR0VfU0laRSwgd2hpY2ggY2FuIGJlIGJpZ2dlcikuCisgKi8KKyNkZWZpbmUgRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgNDA5NgorCisjZW5kaWYgIC8qIF9fRFJCRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYwppbmRleCBkMDczMzA1Li4xOGM3NmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKICNpbmNsdWRlICJkcmJkX3ZsaS5oIgpAQCAtNjEsMTEgKzYyLDExIEBACiAJRkVfUkVDWUNMRUQsCiB9OwogCi1zdGF0aWMgaW50IGRyYmRfZG9fZmVhdHVyZXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLXN0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1zdGF0aWMgaW50IGRyYmRfZGlzY29ubmVjdGVkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworc3RhdGljIGludCBkcmJkX2RvX2ZlYXR1cmVzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitzdGF0aWMgaW50IGRyYmRfZGlzY29ubmVjdGVkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOwogCi1zdGF0aWMgZW51bSBmaW5pc2hfZXBvY2ggZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHN0cnVjdCBkcmJkX3Rjb25uICosIHN0cnVjdCBkcmJkX2Vwb2NoICosIGVudW0gZXBvY2hfZXZlbnQpOworc3RhdGljIGVudW0gZmluaXNoX2Vwb2NoIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHN0cnVjdCBkcmJkX2Vwb2NoICosIGVudW0gZXBvY2hfZXZlbnQpOwogc3RhdGljIGludCBlX2VuZF9ibG9jayhzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiAKIApAQCAtMTUwLDcgKzE1MSw3IEBACiAJKmhlYWQgPSBjaGFpbl9maXJzdDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpfX2RyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqX19kcmJkX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKQEAgLTE5Niw0MSArMTk3LDM5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICp0b19iZV9mcmVlZCkKIHsKLQlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxlLCAqdGxlOworCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsICp0bXA7CiAKIAkvKiBUaGUgRUVzIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gU2luY2UKIAkgICB0aGV5IGFyZSBzZW50IGluIG9yZGVyIG92ZXIgdGhlIHdpcmUsIHRoZXkgaGF2ZSB0byBmaW5pc2gKIAkgICBpbiBvcmRlci4gQXMgc29vbiBhcyB3ZSBzZWUgdGhlIGZpcnN0IG5vdCBmaW5pc2hlZCB3ZSBjYW4KIAkgICBzdG9wIHRvIGV4YW1pbmUgdGhlIGxpc3QuLi4gKi8KIAotCWxpc3RfZm9yX2VhY2hfc2FmZShsZSwgdGxlLCAmbWRldi0+bmV0X2VlKSB7Ci0JCXBlZXJfcmVxID0gbGlzdF9lbnRyeShsZSwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3Lmxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZWVyX3JlcSwgdG1wLCAmZGV2aWNlLT5uZXRfZWUsIHcubGlzdCkgewogCQlpZiAoZHJiZF9wZWVyX3JlcV9oYXNfYWN0aXZlX3BhZ2UocGVlcl9yZXEpKQogCQkJYnJlYWs7Ci0JCWxpc3RfbW92ZShsZSwgdG9fYmVfZnJlZWQpOworCQlsaXN0X21vdmUoJnBlZXJfcmVxLT53Lmxpc3QsIHRvX2JlX2ZyZWVkKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfa2lja19sb19hbmRfcmVjbGFpbV9uZXQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfa2lja19sb19hbmRfcmVjbGFpbV9uZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJTElTVF9IRUFEKHJlY2xhaW1lZCk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgKnQ7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhtZGV2LCAmcmVjbGFpbWVkKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhkZXZpY2UsICZyZWNsYWltZWQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfcmVxLCB0LCAmcmVjbGFpbWVkLCB3Lmxpc3QpCi0JCWRyYmRfZnJlZV9uZXRfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfbmV0X3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogfQogCiAvKioKICAqIGRyYmRfYWxsb2NfcGFnZXMoKSAtIFJldHVybnMgQG51bWJlciBwYWdlcywgcmV0cmllcyBmb3JldmVyIChvciB1bnRpbCBzaWduYWxsZWQpCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBudW1iZXI6CW51bWJlciBvZiBwYWdlcyByZXF1ZXN0ZWQKICAqIEByZXRyeToJd2hldGhlciB0byByZXRyeSwgaWYgbm90IGVub3VnaCBwYWdlcyBhcmUgYXZhaWxhYmxlIHJpZ2h0IG5vdwogICoKQEAgLTI0MCw5ICsyMzksMTAgQEAKICAqCiAgKiBSZXR1cm5zIGEgcGFnZSBjaGFpbiBsaW5rZWQgdmlhIHBhZ2UtPnByaXZhdGUuCiAgKi8KLXN0cnVjdCBwYWdlICpkcmJkX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBudW1iZXIsCitzdHJ1Y3QgcGFnZSAqZHJiZF9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHVuc2lnbmVkIGludCBudW1iZXIsCiAJCQkgICAgICBib29sIHJldHJ5KQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKQEAgLTI1MSwyMCArMjUxLDIwIEBACiAJLyogWWVzLCB3ZSBtYXkgcnVuIHVwIHRvIEBudW1iZXIgb3ZlciBtYXhfYnVmZmVycy4gSWYgd2UKIAkgKiBmb2xsb3cgaXQgc3RyaWN0bHksIHRoZSBhZG1pbiB3aWxsIGdldCBpdCB3cm9uZyBhbnl3YXlzLiAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJbXhiID0gbmMgPyBuYy0+bWF4X2J1ZmZlcnMgOiAxMDAwMDAwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT5wcF9pbl91c2UpIDwgbXhiKQotCQlwYWdlID0gX19kcmJkX2FsbG9jX3BhZ2VzKG1kZXYsIG51bWJlcik7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZSkgPCBteGIpCisJCXBhZ2UgPSBfX2RyYmRfYWxsb2NfcGFnZXMoZGV2aWNlLCBudW1iZXIpOwogCiAJd2hpbGUgKHBhZ2UgPT0gTlVMTCkgewogCQlwcmVwYXJlX3RvX3dhaXQoJmRyYmRfcHBfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJZHJiZF9raWNrX2xvX2FuZF9yZWNsYWltX25ldChtZGV2KTsKKwkJZHJiZF9raWNrX2xvX2FuZF9yZWNsYWltX25ldChkZXZpY2UpOwogCi0JCWlmIChhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlKSA8IG14YikgewotCQkJcGFnZSA9IF9fZHJiZF9hbGxvY19wYWdlcyhtZGV2LCBudW1iZXIpOworCQlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+cHBfaW5fdXNlKSA8IG14YikgeworCQkJcGFnZSA9IF9fZHJiZF9hbGxvY19wYWdlcyhkZXZpY2UsIG51bWJlcik7CiAJCQlpZiAocGFnZSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMjczLDcgKzI3Myw3IEBACiAJCQlicmVhazsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCWRldl93YXJuKERFViwgImRyYmRfYWxsb2NfcGFnZXMgaW50ZXJydXB0ZWQhXG4iKTsKKwkJCWRyYmRfd2FybihkZXZpY2UsICJkcmJkX2FsbG9jX3BhZ2VzIGludGVycnVwdGVkIVxuIik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yODIsMTcgKzI4MiwxNyBAQAogCWZpbmlzaF93YWl0KCZkcmJkX3BwX3dhaXQsICZ3YWl0KTsKIAogCWlmIChwYWdlKQotCQlhdG9taWNfYWRkKG51bWJlciwgJm1kZXYtPnBwX2luX3VzZSk7CisJCWF0b21pY19hZGQobnVtYmVyLCAmZGV2aWNlLT5wcF9pbl91c2UpOwogCXJldHVybiBwYWdlOwogfQogCiAvKiBNdXN0IG5vdCBiZSB1c2VkIGZyb20gaXJxLCBhcyB0aGF0IG1heSBkZWFkbG9jazogc2VlIGRyYmRfYWxsb2NfcGFnZXMuCi0gKiBJcyBhbHNvIHVzZWQgZnJvbSBpbnNpZGUgYW4gb3RoZXIgc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKyAqIElzIGFsc28gdXNlZCBmcm9tIGluc2lkZSBhbiBvdGhlciBzcGluX2xvY2tfaXJxKCZyZXNvdXJjZS0+cmVxX2xvY2spOwogICogRWl0aGVyIGxpbmtzIHRoZSBwYWdlIGNoYWluIGJhY2sgdG8gdGhlIGdsb2JhbCBwb29sLAogICogb3IgcmV0dXJucyBhbGwgcGFnZXMgdG8gdGhlIHN5c3RlbS4gKi8KLXN0YXRpYyB2b2lkIGRyYmRfZnJlZV9wYWdlcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGlzX25ldCkKK3N0YXRpYyB2b2lkIGRyYmRfZnJlZV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBpc19uZXQpCiB7Ci0JYXRvbWljX3QgKmEgPSBpc19uZXQgPyAmbWRldi0+cHBfaW5fdXNlX2J5X25ldCA6ICZtZGV2LT5wcF9pbl91c2U7CisJYXRvbWljX3QgKmEgPSBpc19uZXQgPyAmZGV2aWNlLT5wcF9pbl91c2VfYnlfbmV0IDogJmRldmljZS0+cHBfaW5fdXNlOwogCWludCBpOwogCiAJaWYgKHBhZ2UgPT0gTlVMTCkKQEAgLTMxMCw3ICszMTAsNyBAQAogCX0KIAlpID0gYXRvbWljX3N1Yl9yZXR1cm4oaSwgYSk7CiAJaWYgKGkgPCAwKQotCQlkZXZfd2FybihERVYsICJBU1NFUlRJT04gRkFJTEVEOiAlczogJWQgPCAwXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiQVNTRVJUSU9OIEZBSUxFRDogJXM6ICVkIDwgMFxuIiwKIAkJCWlzX25ldCA/ICJwcF9pbl91c2VfYnlfbmV0IiA6ICJwcF9pbl91c2UiLCBpKTsKIAl3YWtlX3VwKCZkcmJkX3BwX3dhaXQpOwogfQpAQCAtMzMwLDI1ICszMzAsMjYgQEAKICovCiAKIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqCi1kcmJkX2FsbG9jX3BlZXJfcmVxKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHU2NCBpZCwgc2VjdG9yX3Qgc2VjdG9yLAorZHJiZF9hbGxvY19wZWVyX3JlcShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHU2NCBpZCwgc2VjdG9yX3Qgc2VjdG9yLAogCQkgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAl1bnNpZ25lZCBucl9wYWdlcyA9IChkYXRhX3NpemUgKyBQQUdFX1NJWkUgLTEpID4+IFBBR0VfU0hJRlQ7CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgRFJCRF9GQVVMVF9BTF9FRSkpCisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgRFJCRF9GQVVMVF9BTF9FRSkpCiAJCXJldHVybiBOVUxMOwogCiAJcGVlcl9yZXEgPSBtZW1wb29sX2FsbG9jKGRyYmRfZWVfbWVtcG9vbCwgZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSk7CiAJaWYgKCFwZWVyX3JlcSkgewogCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX05PV0FSTikpCi0JCQlkZXZfZXJyKERFViwgIiVzOiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiJXM6IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmIChkYXRhX3NpemUpIHsKLQkJcGFnZSA9IGRyYmRfYWxsb2NfcGFnZXMobWRldiwgbnJfcGFnZXMsIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKTsKKwkJcGFnZSA9IGRyYmRfYWxsb2NfcGFnZXMocGVlcl9kZXZpY2UsIG5yX3BhZ2VzLCAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSk7CiAJCWlmICghcGFnZSkKIAkJCWdvdG8gZmFpbDsKIAl9CkBAIC0zNjAsNyArMzYxLDcgQEAKIAlwZWVyX3JlcS0+aS53YWl0aW5nID0gZmFsc2U7CiAKIAlwZWVyX3JlcS0+ZXBvY2ggPSBOVUxMOwotCXBlZXJfcmVxLT53Lm1kZXYgPSBtZGV2OworCXBlZXJfcmVxLT5wZWVyX2RldmljZSA9IHBlZXJfZGV2aWNlOwogCXBlZXJfcmVxLT5wYWdlcyA9IHBhZ2U7CiAJYXRvbWljX3NldCgmcGVlcl9yZXEtPnBlbmRpbmdfYmlvcywgMCk7CiAJcGVlcl9yZXEtPmZsYWdzID0gMDsKQEAgLTM3NywzMCArMzc4LDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwKK3ZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsCiAJCSAgICAgICBpbnQgaXNfbmV0KQogewogCWlmIChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9IQVNfRElHRVNUKQogCQlrZnJlZShwZWVyX3JlcS0+ZGlnZXN0KTsKLQlkcmJkX2ZyZWVfcGFnZXMobWRldiwgcGVlcl9yZXEtPnBhZ2VzLCBpc19uZXQpOwotCURfQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyX3JlcS0+cGVuZGluZ19iaW9zKSA9PSAwKTsKLQlEX0FTU0VSVChkcmJkX2ludGVydmFsX2VtcHR5KCZwZWVyX3JlcS0+aSkpOworCWRyYmRfZnJlZV9wYWdlcyhkZXZpY2UsIHBlZXJfcmVxLT5wYWdlcywgaXNfbmV0KTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZwZWVyX3JlcS0+cGVuZGluZ19iaW9zKSA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CiAJbWVtcG9vbF9mcmVlKHBlZXJfcmVxLCBkcmJkX2VlX21lbXBvb2wpOwogfQogCi1pbnQgZHJiZF9mcmVlX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoraW50IGRyYmRfZnJlZV9wZWVyX3JlcXMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJTElTVF9IRUFEKHdvcmtfbGlzdCk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgKnQ7CiAJaW50IGNvdW50ID0gMDsKLQlpbnQgaXNfbmV0ID0gbGlzdCA9PSAmbWRldi0+bmV0X2VlOworCWludCBpc19uZXQgPSBsaXN0ID09ICZkZXZpY2UtPm5ldF9lZTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQobGlzdCwgJndvcmtfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfcmVxLCB0LCAmd29ya19saXN0LCB3Lmxpc3QpIHsKLQkJX19kcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEsIGlzX25ldCk7CisJCV9fZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEsIGlzX25ldCk7CiAJCWNvdW50Kys7CiAJfQogCXJldHVybiBjb3VudDsKQEAgLTQwOSwyMCArNDEwLDIwIEBACiAvKgogICogU2VlIGFsc28gY29tbWVudHMgaW4gX3JlcV9tb2QoLEJBUlJJRVJfQUNLRUQpIGFuZCByZWNlaXZlX0JhcnJpZXIuCiAgKi8KLXN0YXRpYyBpbnQgZHJiZF9maW5pc2hfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IGRyYmRfZmluaXNoX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlMSVNUX0hFQUQod29ya19saXN0KTsKIAlMSVNUX0hFQUQocmVjbGFpbWVkKTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxLCAqdDsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKG1kZXYsICZyZWNsYWltZWQpOwotCWxpc3Rfc3BsaWNlX2luaXQoJm1kZXYtPmRvbmVfZWUsICZ3b3JrX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKGRldmljZSwgJnJlY2xhaW1lZCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZGV2aWNlLT5kb25lX2VlLCAmd29ya19saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZWVyX3JlcSwgdCwgJnJlY2xhaW1lZCwgdy5saXN0KQotCQlkcmJkX2ZyZWVfbmV0X3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX25ldF9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCS8qIHBvc3NpYmxlIGNhbGxiYWNrcyBoZXJlOgogCSAqIGVfZW5kX2Jsb2NrLCBhbmQgZV9lbmRfcmVzeW5jX2Jsb2NrLCBlX3NlbmRfc3VwZXJzZWRlZC4KQEAgLTQzNSwxNCArNDM2LDE0IEBACiAJCWVycjIgPSBwZWVyX3JlcS0+dy5jYigmcGVlcl9yZXEtPncsICEhZXJyKTsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSBlcnIyOwotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAJfQotCXdha2VfdXAoJm1kZXYtPmVlX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyB2b2lkIF9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CkBAIC00NTAsMjAgKzQ1MSwyMCBAQAogCS8qIGF2b2lkcyBzcGluX2xvY2svdW5sb2NrCiAJICogYW5kIGNhbGxpbmcgcHJlcGFyZV90b193YWl0IGluIHRoZSBmYXN0IHBhdGggKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcHJlcGFyZV90b193YWl0KCZtZGV2LT5lZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5lZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJaW9fc2NoZWR1bGUoKTsKLQkJZmluaXNoX3dhaXQoJm1kZXYtPmVlX3dhaXQsICZ3YWl0KTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJZmluaXNoX3dhaXQoJmRldmljZS0+ZWVfd2FpdCwgJndhaXQpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCBoZWFkKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogc3RhdGljIGludCBkcmJkX3JlY3Zfc2hvcnQoc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQpAQCAtNDg4LDQ0ICs0ODksNDQgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9yZWN2KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgZHJiZF9yZWN2KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJaW50IHJ2OwogCi0JcnYgPSBkcmJkX3JlY3Zfc2hvcnQodGNvbm4tPmRhdGEuc29ja2V0LCBidWYsIHNpemUsIDApOworCXJ2ID0gZHJiZF9yZWN2X3Nob3J0KGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LCBidWYsIHNpemUsIDApOwogCiAJaWYgKHJ2IDwgMCkgewogCQlpZiAocnYgPT0gLUVDT05OUkVTRVQpCi0JCQljb25uX2luZm8odGNvbm4sICJzb2NrIHdhcyByZXNldCBieSBwZWVyXG4iKTsKKwkJCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAic29jayB3YXMgcmVzZXQgYnkgcGVlclxuIik7CiAJCWVsc2UgaWYgKHJ2ICE9IC1FUkVTVEFSVFNZUykKLQkJCWNvbm5fZXJyKHRjb25uLCAic29ja19yZWN2bXNnIHJldHVybmVkICVkXG4iLCBydik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAic29ja19yZWN2bXNnIHJldHVybmVkICVkXG4iLCBydik7CiAJfSBlbHNlIGlmIChydiA9PSAwKSB7Ci0JCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykpIHsKIAkJCWxvbmcgdDsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbyAqIEhaLzEwOworCQkJdCA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZiktPnBpbmdfdGltZW8gKiBIWi8xMDsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRjb25uLT5waW5nX3dhaXQsIHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMsIHQpOworCQkJdCA9IHdhaXRfZXZlbnRfdGltZW91dChjb25uZWN0aW9uLT5waW5nX3dhaXQsIGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUywgdCk7CiAKIAkJCWlmICh0KQogCQkJCWdvdG8gb3V0OwogCQl9Ci0JCWNvbm5faW5mbyh0Y29ubiwgInNvY2sgd2FzIHNodXQgZG93biBieSBwZWVyXG4iKTsKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJzb2NrIHdhcyBzaHV0IGRvd24gYnkgcGVlclxuIik7CiAJfQogCiAJaWYgKHJ2ICE9IHNpemUpCi0JCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOwogCiBvdXQ6CiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGRyYmRfcmVjdl9hbGwoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfcmVjdih0Y29ubiwgYnVmLCBzaXplKTsKKwllcnIgPSBkcmJkX3JlY3YoY29ubmVjdGlvbiwgYnVmLCBzaXplKTsKIAlpZiAoZXJyICE9IHNpemUpIHsKIAkJaWYgKGVyciA+PSAwKQogCQkJZXJyID0gLUVJTzsKQEAgLTUzNCwxMyArNTM1LDEzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsX3dhcm4oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsX3dhcm4oc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X2FsbCh0Y29ubiwgYnVmLCBzaXplKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsKGNvbm5lY3Rpb24sIGJ1Ziwgc2l6ZSk7CiAJaWYgKGVyciAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWNvbm5fd2Fybih0Y29ubiwgInNob3J0IHJlYWQgKGV4cGVjdGVkIHNpemUgJWQpXG4iLCAoaW50KXNpemUpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgInNob3J0IHJlYWQgKGV4cGVjdGVkIHNpemUgJWQpXG4iLCAoaW50KXNpemUpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU2Myw3ICs1NjQsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfdHJ5X2Nvbm5lY3Qoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfdHJ5X2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAljb25zdCBjaGFyICp3aGF0OwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CkBAIC01NzUsNyArNTc2LDcgQEAKIAlpbnQgZGlzY29ubmVjdF9vbl9lcnJvciA9IDE7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKCFuYykgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC01ODUsMTYgKzU4NiwxNiBAQAogCWNvbm5lY3RfaW50ID0gbmMtPmNvbm5lY3RfaW50OwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JbXlfYWRkcl9sZW4gPSBtaW5fdChpbnQsIHRjb25uLT5teV9hZGRyX2xlbiwgc2l6ZW9mKHNyY19pbjYpKTsKLQltZW1jcHkoJnNyY19pbjYsICZ0Y29ubi0+bXlfYWRkciwgbXlfYWRkcl9sZW4pOworCW15X2FkZHJfbGVuID0gbWluX3QoaW50LCBjb25uZWN0aW9uLT5teV9hZGRyX2xlbiwgc2l6ZW9mKHNyY19pbjYpKTsKKwltZW1jcHkoJnNyY19pbjYsICZjb25uZWN0aW9uLT5teV9hZGRyLCBteV9hZGRyX2xlbik7CiAKLQlpZiAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbm4tPm15X2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJaWYgKCgoc3RydWN0IHNvY2thZGRyICopJmNvbm5lY3Rpb24tPm15X2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCiAJCXNyY19pbjYuc2luNl9wb3J0ID0gMDsKIAllbHNlCiAJCSgoc3RydWN0IHNvY2thZGRyX2luICopJnNyY19pbjYpLT5zaW5fcG9ydCA9IDA7IC8qIEFGX0lORVQgJiBBRl9TQ0kgKi8KIAotCXBlZXJfYWRkcl9sZW4gPSBtaW5fdChpbnQsIHRjb25uLT5wZWVyX2FkZHJfbGVuLCBzaXplb2Yoc3JjX2luNikpOwotCW1lbWNweSgmcGVlcl9pbjYsICZ0Y29ubi0+cGVlcl9hZGRyLCBwZWVyX2FkZHJfbGVuKTsKKwlwZWVyX2FkZHJfbGVuID0gbWluX3QoaW50LCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuLCBzaXplb2Yoc3JjX2luNikpOworCW1lbWNweSgmcGVlcl9pbjYsICZjb25uZWN0aW9uLT5wZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pOwogCiAJd2hhdCA9ICJzb2NrX2NyZWF0ZV9rZXJuIjsKIAllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKCgoc3RydWN0IHNvY2thZGRyICopJnNyY19pbjYpLT5zYV9mYW1pbHksCkBAIC02NDIsMTcgKzY0MywxNyBAQAogCQkJZGlzY29ubmVjdF9vbl9lcnJvciA9IDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWNvbm5fZXJyKHRjb25uLCAiJXMgZmFpbGVkLCBlcnIgPSAlZFxuIiwgd2hhdCwgZXJyKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOwogCQl9CiAJCWlmIChkaXNjb25uZWN0X29uX2Vycm9yKQotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAl9CiAKIAlyZXR1cm4gc29jazsKIH0KIAogc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCXN0cnVjdCBzb2NrZXQgKnNfbGlzdGVuOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvb3JfYmVsbDsKIAl2b2lkICgqb3JpZ2luYWxfc2tfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjcwLDcgKzY3MSw3IEBACiAJc3RhdGVfY2hhbmdlKHNrKTsKIH0KIAotc3RhdGljIGludCBwcmVwYXJlX2xpc3Rlbl9zb2NrZXQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCitzdGF0aWMgaW50IHByZXBhcmVfbGlzdGVuX3NvY2tldChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCiB7CiAJaW50IGVyciwgc25kYnVmX3NpemUsIHJjdmJ1Zl9zaXplLCBteV9hZGRyX2xlbjsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42IG15X2FkZHI7CkBAIC02NzksNyArNjgwLDcgQEAKIAljb25zdCBjaGFyICp3aGF0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmICghbmMpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRUlPOwpAQCAtNjg4LDggKzY4OSw4IEBACiAJcmN2YnVmX3NpemUgPSBuYy0+cmN2YnVmX3NpemU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlteV9hZGRyX2xlbiA9IG1pbl90KGludCwgdGNvbm4tPm15X2FkZHJfbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotCW1lbWNweSgmbXlfYWRkciwgJnRjb25uLT5teV9hZGRyLCBteV9hZGRyX2xlbik7CisJbXlfYWRkcl9sZW4gPSBtaW5fdChpbnQsIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCW1lbWNweSgmbXlfYWRkciwgJmNvbm5lY3Rpb24tPm15X2FkZHIsIG15X2FkZHJfbGVuKTsKIAogCXdoYXQgPSAic29ja19jcmVhdGVfa2VybiI7CiAJZXJyID0gc29ja19jcmVhdGVfa2VybigoKHN0cnVjdCBzb2NrYWRkciAqKSZteV9hZGRyKS0+c2FfZmFtaWx5LApAQCAtNzI1LDggKzcyNiw4IEBACiAJCXNvY2tfcmVsZWFzZShzX2xpc3Rlbik7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKGVyciAhPSAtRUFHQUlOICYmIGVyciAhPSAtRUlOVFIgJiYgZXJyICE9IC1FUkVTVEFSVFNZUykgewotCQkJY29ubl9lcnIodGNvbm4sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOworCQkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQl9CiAJfQogCkBAIC03NDEsMTQgKzc0MiwxNCBAQAogCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwogfQogCi1zdGF0aWMgc3RydWN0IHNvY2tldCAqZHJiZF93YWl0X2Zvcl9jb25uZWN0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgKmFkKQorc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfd2FpdF9mb3JfY29ubmVjdChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCiB7CiAJaW50IHRpbWVvLCBjb25uZWN0X2ludCwgZXJyID0gMDsKIAlzdHJ1Y3Qgc29ja2V0ICpzX2VzdGFiID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmICghbmMpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNzY3LDggKzc2OCw4IEBACiAJZXJyID0ga2VybmVsX2FjY2VwdChhZC0+c19saXN0ZW4sICZzX2VzdGFiLCAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyICE9IC1FQUdBSU4gJiYgZXJyICE9IC1FSU5UUiAmJiBlcnIgIT0gLUVSRVNUQVJUU1lTKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImFjY2VwdCBmYWlsZWQsIGVyciA9ICVkXG4iLCBlcnIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJhY2NlcHQgZmFpbGVkLCBlcnIgPSAlZFxuIiwgZXJyKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAkJfQogCX0KIApAQCAtNzc4LDI5ICs3NzksMjkgQEAKIAlyZXR1cm4gc19lc3RhYjsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKHN0cnVjdCBkcmJkX3Rjb25uICosIHZvaWQgKiwgc3RydWN0IHBhY2tldF9pbmZvICopOworc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgdm9pZCAqLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CiAKLXN0YXRpYyBpbnQgc2VuZF9maXJzdF9wYWNrZXQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2ssCitzdGF0aWMgaW50IHNlbmRfZmlyc3RfcGFja2V0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJCSAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQpCiB7Ci0JaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jaykpCisJaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKSkKIAkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIDAsIE5VTEwsIDApOworCXJldHVybiBjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBjbWQsIDAsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgaW50IHJlY2VpdmVfZmlyc3RfcGFja2V0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaykKK3N0YXRpYyBpbnQgcmVjZWl2ZV9maXJzdF9wYWNrZXQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaykKIHsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKGNvbm5lY3Rpb24pOwogCXN0cnVjdCBwYWNrZXRfaW5mbyBwaTsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X3Nob3J0KHNvY2ssIHRjb25uLT5kYXRhLnJidWYsIGhlYWRlcl9zaXplLCAwKTsKKwllcnIgPSBkcmJkX3JlY3Zfc2hvcnQoc29jaywgY29ubmVjdGlvbi0+ZGF0YS5yYnVmLCBoZWFkZXJfc2l6ZSwgMCk7CiAJaWYgKGVyciAhPSBoZWFkZXJfc2l6ZSkgewogCQlpZiAoZXJyID49IDApCiAJCQllcnIgPSAtRUlPOwogCQlyZXR1cm4gZXJyOwogCX0KLQllcnIgPSBkZWNvZGVfaGVhZGVyKHRjb25uLCB0Y29ubi0+ZGF0YS5yYnVmLCAmcGkpOworCWVyciA9IGRlY29kZV9oZWFkZXIoY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+ZGF0YS5yYnVmLCAmcGkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIHBpLmNtZDsKQEAgLTgzMCwyOCArODMxLDI5IEBACiB9CiAvKiBHZXRzIGNhbGxlZCBpZiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIG9yIGlmIGEgbmV3IG1pbm9yIGdldHMgY3JlYXRlZAogICAgaW4gYSBjb25uZWN0aW9uICovCi1pbnQgZHJiZF9jb25uZWN0ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKLQlhdG9taWNfc2V0KCZtZGV2LT5wYWNrZXRfc2VxLCAwKTsKLQltZGV2LT5wZWVyX3NlcSA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5wYWNrZXRfc2VxLCAwKTsKKwlkZXZpY2UtPnBlZXJfc2VxID0gMDsKIAotCW1kZXYtPnN0YXRlX211dGV4ID0gbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/Ci0JCSZtZGV2LT50Y29ubi0+Y3N0YXRlX211dGV4IDoKLQkJJm1kZXYtPm93bl9zdGF0ZV9tdXRleDsKKwlkZXZpY2UtPnN0YXRlX211dGV4ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/CisJCSZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N0YXRlX211dGV4IDoKKwkJJmRldmljZS0+b3duX3N0YXRlX211dGV4OwogCi0JZXJyID0gZHJiZF9zZW5kX3N5bmNfcGFyYW0obWRldik7CisJZXJyID0gZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOwogCWlmICghZXJyKQotCQllcnIgPSBkcmJkX3NlbmRfc2l6ZXMobWRldiwgMCwgMCk7CisJCWVyciA9IGRyYmRfc2VuZF9zaXplcyhwZWVyX2RldmljZSwgMCwgMCk7CiAJaWYgKCFlcnIpCi0JCWVyciA9IGRyYmRfc2VuZF91dWlkcyhtZGV2KTsKKwkJZXJyID0gZHJiZF9zZW5kX3V1aWRzKHBlZXJfZGV2aWNlKTsKIAlpZiAoIWVycikKLQkJZXJyID0gZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUobWRldik7Ci0JY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChSRVNJWkVfUEVORElORywgJm1kZXYtPmZsYWdzKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5hcF9pbl9mbGlnaHQsIDApOwotCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgamlmZmllcyArIEhaKTsgLyoganVzdCBzdGFydCBpdCBoZXJlLiAqLworCQllcnIgPSBkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShwZWVyX2RldmljZSk7CisJY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmZGV2aWNlLT5mbGFncyk7CisJY2xlYXJfYml0KFJFU0laRV9QRU5ESU5HLCAmZGV2aWNlLT5mbGFncyk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5hcF9pbl9mbGlnaHQsIDApOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOyAvKiBqdXN0IHN0YXJ0IGl0IGhlcmUuICovCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODYzLDU5ICs4NjUsNTkgQEAKICAqICAgICBubyBwb2ludCBpbiB0cnlpbmcgYWdhaW4sIHBsZWFzZSBnbyBzdGFuZGFsb25lLgogICogIC0yIFdlIGRvIG5vdCBoYXZlIGEgbmV0d29yayBjb25maWcuLi4KICAqLwotc3RhdGljIGludCBjb25uX2Nvbm5lY3Qoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBjb25uX2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgc29jaywgbXNvY2s7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgdm5yLCB0aW1lb3V0LCBoLCBvazsKIAlib29sIGRpc2NhcmRfbXlfZGF0YTsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAJc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgYWQgPSB7Ci0JCS50Y29ubiA9IHRjb25uLAorCQkuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sCiAJCS5kb29yX2JlbGwgPSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSX09OU1RBQ0soYWQuZG9vcl9iZWxsKSwKIAl9OwogCi0JY2xlYXJfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncyk7Ci0JaWYgKGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19XRl9DT05ORUNUSU9OKSwgQ1NfVkVSQk9TRSkgPCBTU19TVUNDRVNTKQorCWNsZWFyX2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CisJaWYgKGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1dGX0NPTk5FQ1RJT04pLCBDU19WRVJCT1NFKSA8IFNTX1NVQ0NFU1MpCiAJCXJldHVybiAtMjsKIAogCW11dGV4X2luaXQoJnNvY2subXV0ZXgpOwotCXNvY2suc2J1ZiA9IHRjb25uLT5kYXRhLnNidWY7Ci0Jc29jay5yYnVmID0gdGNvbm4tPmRhdGEucmJ1ZjsKKwlzb2NrLnNidWYgPSBjb25uZWN0aW9uLT5kYXRhLnNidWY7CisJc29jay5yYnVmID0gY29ubmVjdGlvbi0+ZGF0YS5yYnVmOwogCXNvY2suc29ja2V0ID0gTlVMTDsKIAltdXRleF9pbml0KCZtc29jay5tdXRleCk7Ci0JbXNvY2suc2J1ZiA9IHRjb25uLT5tZXRhLnNidWY7Ci0JbXNvY2sucmJ1ZiA9IHRjb25uLT5tZXRhLnJidWY7CisJbXNvY2suc2J1ZiA9IGNvbm5lY3Rpb24tPm1ldGEuc2J1ZjsKKwltc29jay5yYnVmID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCW1zb2NrLnNvY2tldCA9IE5VTEw7CiAKIAkvKiBBc3N1bWUgdGhhdCB0aGUgcGVlciBvbmx5IHVuZGVyc3RhbmRzIHByb3RvY29sIDgwIHVudGlsIHdlIGtub3cgYmV0dGVyLiAgKi8KLQl0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID0gODA7CisJY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID0gODA7CiAKLQlpZiAocHJlcGFyZV9saXN0ZW5fc29ja2V0KHRjb25uLCAmYWQpKQorCWlmIChwcmVwYXJlX2xpc3Rlbl9zb2NrZXQoY29ubmVjdGlvbiwgJmFkKSkKIAkJcmV0dXJuIDA7CiAKIAlkbyB7CiAJCXN0cnVjdCBzb2NrZXQgKnM7CiAKLQkJcyA9IGRyYmRfdHJ5X2Nvbm5lY3QodGNvbm4pOworCQlzID0gZHJiZF90cnlfY29ubmVjdChjb25uZWN0aW9uKTsKIAkJaWYgKHMpIHsKIAkJCWlmICghc29jay5zb2NrZXQpIHsKIAkJCQlzb2NrLnNvY2tldCA9IHM7Ci0JCQkJc2VuZF9maXJzdF9wYWNrZXQodGNvbm4sICZzb2NrLCBQX0lOSVRJQUxfREFUQSk7CisJCQkJc2VuZF9maXJzdF9wYWNrZXQoY29ubmVjdGlvbiwgJnNvY2ssIFBfSU5JVElBTF9EQVRBKTsKIAkJCX0gZWxzZSBpZiAoIW1zb2NrLnNvY2tldCkgewotCQkJCWNsZWFyX2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnRjb25uLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCQkJCW1zb2NrLnNvY2tldCA9IHM7Ci0JCQkJc2VuZF9maXJzdF9wYWNrZXQodGNvbm4sICZtc29jaywgUF9JTklUSUFMX01FVEEpOworCQkJCXNlbmRfZmlyc3RfcGFja2V0KGNvbm5lY3Rpb24sICZtc29jaywgUF9JTklUSUFMX01FVEEpOwogCQkJfSBlbHNlIHsKLQkJCQljb25uX2Vycih0Y29ubiwgIkxvZ2ljIGVycm9yIGluIGNvbm5fY29ubmVjdCgpXG4iKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiTG9naWMgZXJyb3IgaW4gY29ubl9jb25uZWN0KClcbiIpOwogCQkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJCX0KIAkJfQogCiAJCWlmIChzb2NrLnNvY2tldCAmJiBtc29jay5zb2NrZXQpIHsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl0aW1lb3V0ID0gbmMtPnBpbmdfdGltZW8gKiBIWiAvIDEwOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CkBAIC05MjYsMTUgKzkyOCwxNSBAQAogCQl9CiAKIHJldHJ5OgotCQlzID0gZHJiZF93YWl0X2Zvcl9jb25uZWN0KHRjb25uLCAmYWQpOworCQlzID0gZHJiZF93YWl0X2Zvcl9jb25uZWN0KGNvbm5lY3Rpb24sICZhZCk7CiAJCWlmIChzKSB7Ci0JCQlpbnQgZnAgPSByZWNlaXZlX2ZpcnN0X3BhY2tldCh0Y29ubiwgcyk7CisJCQlpbnQgZnAgPSByZWNlaXZlX2ZpcnN0X3BhY2tldChjb25uZWN0aW9uLCBzKTsKIAkJCWRyYmRfc29ja2V0X29rYXkoJnNvY2suc29ja2V0KTsKIAkJCWRyYmRfc29ja2V0X29rYXkoJm1zb2NrLnNvY2tldCk7CiAJCQlzd2l0Y2ggKGZwKSB7CiAJCQljYXNlIFBfSU5JVElBTF9EQVRBOgogCQkJCWlmIChzb2NrLnNvY2tldCkgewotCQkJCQljb25uX3dhcm4odGNvbm4sICJpbml0aWFsIHBhY2tldCBTIGNyb3NzZWRcbiIpOworCQkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgImluaXRpYWwgcGFja2V0IFMgY3Jvc3NlZFxuIik7CiAJCQkJCXNvY2tfcmVsZWFzZShzb2NrLnNvY2tldCk7CiAJCQkJCXNvY2suc29ja2V0ID0gczsKIAkJCQkJZ290byByYW5kb21pemU7CkBAIC05NDIsOSArOTQ0LDkgQEAKIAkJCQlzb2NrLnNvY2tldCA9IHM7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFBfSU5JVElBTF9NRVRBOgotCQkJCXNldF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZ0Y29ubi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCQkJaWYgKG1zb2NrLnNvY2tldCkgewotCQkJCQljb25uX3dhcm4odGNvbm4sICJpbml0aWFsIHBhY2tldCBNIGNyb3NzZWRcbiIpOworCQkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgImluaXRpYWwgcGFja2V0IE0gY3Jvc3NlZFxuIik7CiAJCQkJCXNvY2tfcmVsZWFzZShtc29jay5zb2NrZXQpOwogCQkJCQltc29jay5zb2NrZXQgPSBzOwogCQkJCQlnb3RvIHJhbmRvbWl6ZTsKQEAgLTk1Miw3ICs5NTQsNyBAQAogCQkJCW1zb2NrLnNvY2tldCA9IHM7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWNvbm5fd2Fybih0Y29ubiwgIkVycm9yIHJlY2VpdmluZyBpbml0aWFsIHBhY2tldFxuIik7CisJCQkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJFcnJvciByZWNlaXZpbmcgaW5pdGlhbCBwYWNrZXRcbiIpOwogCQkJCXNvY2tfcmVsZWFzZShzKTsKIHJhbmRvbWl6ZToKIAkJCQlpZiAocHJhbmRvbV91MzIoKSAmIDEpCkBAIC05NjAsMTIgKzk2MiwxMiBAQAogCQkJfQogCQl9CiAKLQkJaWYgKHRjb25uLT5jc3RhdGUgPD0gQ19ESVNDT05ORUNUSU5HKQorCQlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDw9IENfRElTQ09OTkVDVElORykKIAkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCQkJc21wX3JtYigpOwotCQkJaWYgKGdldF90X3N0YXRlKCZ0Y29ubi0+cmVjZWl2ZXIpID09IEVYSVRJTkcpCisJCQlpZiAoZ2V0X3Rfc3RhdGUoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKSA9PSBFWElUSU5HKQogCQkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJfQogCkBAIC05ODYsMTIgKzk4OCwxMiBAQAogCW1zb2NrLnNvY2tldC0+c2stPnNrX3ByaW9yaXR5ID0gVENfUFJJT19JTlRFUkFDVElWRTsKIAogCS8qIE5PVCBZRVQgLi4uCi0JICogc29jay5zb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IHRjb25uLT5uZXRfY29uZi0+dGltZW91dCpIWi8xMDsKKwkgKiBzb2NrLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gY29ubmVjdGlvbi0+bmV0X2NvbmYtPnRpbWVvdXQqSFovMTA7CiAJICogc29jay5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbyA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCSAqIGZpcnN0IHNldCBpdCB0byB0aGUgUF9DT05ORUNUSU9OX0ZFQVRVUkVTIHRpbWVvdXQsCiAJICogd2hpY2ggd2Ugc2V0IHRvIDR4IHRoZSBjb25maWd1cmVkIHBpbmdfdGltZW91dC4gKi8KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAKIAlzb2NrLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0KIAlzb2NrLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gbmMtPnBpbmdfdGltZW8qNCpIWi8xMDsKQEAgLTEwMDgsMzcgKzEwMTAsMzggQEAKIAlkcmJkX3RjcF9ub2RlbGF5KHNvY2suc29ja2V0KTsKIAlkcmJkX3RjcF9ub2RlbGF5KG1zb2NrLnNvY2tldCk7CiAKLQl0Y29ubi0+ZGF0YS5zb2NrZXQgPSBzb2NrLnNvY2tldDsKLQl0Y29ubi0+bWV0YS5zb2NrZXQgPSBtc29jay5zb2NrZXQ7Ci0JdGNvbm4tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOworCWNvbm5lY3Rpb24tPmRhdGEuc29ja2V0ID0gc29jay5zb2NrZXQ7CisJY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQgPSBtc29jay5zb2NrZXQ7CisJY29ubmVjdGlvbi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAKLQloID0gZHJiZF9kb19mZWF0dXJlcyh0Y29ubik7CisJaCA9IGRyYmRfZG9fZmVhdHVyZXMoY29ubmVjdGlvbik7CiAJaWYgKGggPD0gMCkKIAkJcmV0dXJuIGg7CiAKLQlpZiAodGNvbm4tPmNyYW1faG1hY190Zm0pIHsKLQkJLyogZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIFdGQXV0aCkpOyAqLwotCQlzd2l0Y2ggKGRyYmRfZG9fYXV0aCh0Y29ubikpIHsKKwlpZiAoY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSkgeworCQkvKiBkcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUyhjb25uLCBXRkF1dGgpKTsgKi8KKwkJc3dpdGNoIChkcmJkX2RvX2F1dGgoY29ubmVjdGlvbikpIHsKIAkJY2FzZSAtMToKLQkJCWNvbm5fZXJyKHRjb25uLCAiQXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWRcbiIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkF1dGhlbnRpY2F0aW9uIG9mIHBlZXIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJY2FzZSAwOgotCQkJY29ubl9lcnIodGNvbm4sICJBdXRoZW50aWNhdGlvbiBvZiBwZWVyIGZhaWxlZCwgdHJ5aW5nIGFnYWluLlxuIik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWQsIHRyeWluZyBhZ2Fpbi5cbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQl0Y29ubi0+ZGF0YS5zb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IHRpbWVvdXQ7Ci0JdGNvbm4tPmRhdGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwljb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gdGltZW91dDsKKwljb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKLQlpZiAoZHJiZF9zZW5kX3Byb3RvY29sKHRjb25uKSA9PSAtRU9QTk9UU1VQUCkKKwlpZiAoZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24pID09IC1FT1BOT1RTVVBQKQogCQlyZXR1cm4gLTE7CiAKLQlzZXRfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpOworCXNldF9iaXQoU1RBVEVfU0VOVCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJCS8qIFByZXZlbnQgYSByYWNlIGJldHdlZW4gcmVzeW5jLWhhbmRzaGFrZSBhbmQKQEAgLTEwNDgsMzUgKzEwNTEsMzUgQEAKIAkJICogZHJiZF9zZXRfcm9sZSgpIGlzIGZpbmlzaGVkLCBhbmQgYW55IGluY29taW5nIGRyYmRfc2V0X3JvbGUKIAkJICogd2lsbCBzZWUgdGhlIFNUQVRFX1NFTlQgZmxhZywgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGNsZWFyZWQuCiAJCSAqLwotCQltdXRleF9sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKLQkJbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfbG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCiAJCWlmIChkaXNjYXJkX215X2RhdGEpCi0JCQlzZXRfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAJCWVsc2UKLQkJCWNsZWFyX2JpdChESVNDQVJEX01ZX0RBVEEsICZtZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQkJZHJiZF9jb25uZWN0ZWQobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9jb25uZWN0ZWQocGVlcl9kZXZpY2UpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLCBDU19WRVJCT1NFKTsKLQlpZiAocnYgPCBTU19TVUNDRVNTIHx8IHRjb25uLT5jc3RhdGUgIT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCWNsZWFyX2JpdChTVEFURV9TRU5ULCAmdGNvbm4tPmZsYWdzKTsKKwlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLCBDU19WRVJCT1NFKTsKKwlpZiAocnYgPCBTU19TVUNDRVNTIHx8IGNvbm5lY3Rpb24tPmNzdGF0ZSAhPSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJY2xlYXJfYml0KFNUQVRFX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+YXNlbmRlcik7CisJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPmFzZW5kZXIpOwogCi0JbXV0ZXhfbG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCS8qIFRoZSBkaXNjYXJkX215X2RhdGEgZmxhZyBpcyBhIHNpbmdsZS1zaG90IG1vZGlmaWVyIHRvIHRoZSBuZXh0CiAJICogY29ubmVjdGlvbiBhdHRlbXB0LCB0aGUgaGFuZHNoYWtlIG9mIHdoaWNoIGlzIG5vdyB3ZWxsIHVuZGVyd2F5LgogCSAqIE5vIG5lZWQgZm9yIHJjdSBzdHlsZSBjb3B5aW5nIG9mIHRoZSB3aG9sZSBzdHJ1Y3QKIAkgKiBqdXN0IHRvIGNsZWFyIGEgc2luZ2xlIHZhbHVlLiAqLwotCXRjb25uLT5uZXRfY29uZi0+ZGlzY2FyZF9teV9kYXRhID0gMDsKLQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7CisJY29ubmVjdGlvbi0+bmV0X2NvbmYtPmRpc2NhcmRfbXlfZGF0YSA9IDA7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJcmV0dXJuIGg7CiAKQEAgLTEwOTAsMTUgKzEwOTMsMTUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHZvaWQgKmhlYWRlciwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICpoZWFkZXIsIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZSh0Y29ubik7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKTsKIAogCWlmIChoZWFkZXJfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IHBfaGVhZGVyMTAwKSAmJgogCSAgICAqKF9fYmUzMiAqKWhlYWRlciA9PSBjcHVfdG9fYmUzMihEUkJEX01BR0lDXzEwMCkpIHsKIAkJc3RydWN0IHBfaGVhZGVyMTAwICpoID0gaGVhZGVyOwogCQlpZiAoaC0+cGFkICE9IDApIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAiSGVhZGVyIHBhZGRpbmcgaXMgbm90IHplcm9cbiIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkhlYWRlciBwYWRkaW5nIGlzIG5vdCB6ZXJvXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXBpLT52bnIgPSBiZTE2X3RvX2NwdShoLT52b2x1bWUpOwpAQCAtMTExNyw1NSArMTEyMCw1NyBAQAogCQlwaS0+c2l6ZSA9IGJlMTZfdG9fY3B1KGgtPmxlbmd0aCk7CiAJCXBpLT52bnIgPSAwOwogCX0gZWxzZSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiV3JvbmcgbWFnaWMgdmFsdWUgMHglMDh4IGluIHByb3RvY29sIHZlcnNpb24gJWRcbiIsCisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJXcm9uZyBtYWdpYyB2YWx1ZSAweCUwOHggaW4gcHJvdG9jb2wgdmVyc2lvbiAlZFxuIiwKIAkJCSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWhlYWRlciksCi0JCQkgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbik7CisJCQkgY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBpLT5kYXRhID0gaGVhZGVyICsgaGVhZGVyX3NpemU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9yZWN2X2hlYWRlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGRyYmRfcmVjdl9oZWFkZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQl2b2lkICpidWZmZXIgPSB0Y29ubi0+ZGF0YS5yYnVmOworCXZvaWQgKmJ1ZmZlciA9IGNvbm5lY3Rpb24tPmRhdGEucmJ1ZjsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBidWZmZXIsIGRyYmRfaGVhZGVyX3NpemUodGNvbm4pKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4oY29ubmVjdGlvbiwgYnVmZmVyLCBkcmJkX2hlYWRlcl9zaXplKGNvbm5lY3Rpb24pKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gZGVjb2RlX2hlYWRlcih0Y29ubiwgYnVmZmVyLCBwaSk7Ci0JdGNvbm4tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOworCWVyciA9IGRlY29kZV9oZWFkZXIoY29ubmVjdGlvbiwgYnVmZmVyLCBwaSk7CisJY29ubmVjdGlvbi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX2ZsdXNoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyB2b2lkIGRyYmRfZmx1c2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlpbnQgcnY7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAotCWlmICh0Y29ubi0+d3JpdGVfb3JkZXJpbmcgPj0gV09fYmRldl9mbHVzaCkgeworCWlmIChjb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZyA+PSBXT19iZGV2X2ZsdXNoKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCQlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCisJCQlpZiAoIWdldF9sZGV2KGRldmljZSkpCiAJCQkJY29udGludWU7Ci0JCQlrcmVmX2dldCgmbWRldi0+a3JlZik7CisJCQlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQlydiA9IGJsa2Rldl9pc3N1ZV9mbHVzaChtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYsCisJCQlydiA9IGJsa2Rldl9pc3N1ZV9mbHVzaChkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldiwKIAkJCQkJR0ZQX05PSU8sIE5VTEwpOwogCQkJaWYgKHJ2KSB7Ci0JCQkJZGV2X2luZm8oREVWLCAibG9jYWwgZGlzayBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJ2KTsKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAibG9jYWwgZGlzayBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJ2KTsKIAkJCQkvKiB3b3VsZCByYXRoZXIgY2hlY2sgb24gRU9QTk9UU1VQUCwgYnV0IHRoYXQgaXMgbm90IHJlbGlhYmxlLgogCQkJCSAqIGRvbid0IHRyeSBhZ2FpbiBmb3IgQU5ZIHJldHVybiB2YWx1ZSAhPSAwCiAJCQkJICogaWYgKHJ2ID09IC1FT1BOT1RTVVBQKSAqLwotCQkJCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyh0Y29ubiwgV09fZHJhaW5faW8pOworCQkJCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhjb25uZWN0aW9uLCBXT19kcmFpbl9pbyk7CiAJCQl9Ci0JCQlwdXRfbGRldihtZGV2KTsKLQkJCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJaWYgKHJ2KQpAQCAtMTE3NywxMSArMTE4MiwxMSBAQAogCiAvKioKICAqIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaCgpIC0gQXBwbGllcyBhbiBlcG9jaF9ldmVudCB0byB0aGUgZXBvY2gncyBzdGF0ZSwgZXZlbnR1YWxseSBmaW5pc2hlcyBpdC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGVwb2NoOglFcG9jaCBvYmplY3QuCiAgKiBAZXY6CQlFcG9jaCBldmVudC4KICAqLwotc3RhdGljIGVudW0gZmluaXNoX2Vwb2NoIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sCitzdGF0aWMgZW51bSBmaW5pc2hfZXBvY2ggZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCiAJCQkJCSAgICAgICBzdHJ1Y3QgZHJiZF9lcG9jaCAqZXBvY2gsCiAJCQkJCSAgICAgICBlbnVtIGVwb2NoX2V2ZW50IGV2KQogewpAQCAtMTE4OSw3ICsxMTk0LDcgQEAKIAlzdHJ1Y3QgZHJiZF9lcG9jaCAqbmV4dF9lcG9jaDsKIAllbnVtIGZpbmlzaF9lcG9jaCBydiA9IEZFX1NUSUxMX0xJVkU7CiAKLQlzcGluX2xvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOwogCWRvIHsKIAkJbmV4dF9lcG9jaCA9IE5VTEw7CiAKQEAgLTEyMTEsMjIgKzEyMTYsMjIgQEAKIAkJICAgIGF0b21pY19yZWFkKCZlcG9jaC0+YWN0aXZlKSA9PSAwICYmCiAJCSAgICAodGVzdF9iaXQoREVfSEFWRV9CQVJSSUVSX05VTUJFUiwgJmVwb2NoLT5mbGFncykgfHwgZXYgJiBFVl9DTEVBTlVQKSkgewogCQkJaWYgKCEoZXYgJiBFVl9DTEVBTlVQKSkgewotCQkJCXNwaW5fdW5sb2NrKCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JCQkJZHJiZF9zZW5kX2JfYWNrKGVwb2NoLT50Y29ubiwgZXBvY2gtPmJhcnJpZXJfbnIsIGVwb2NoX3NpemUpOwotCQkJCXNwaW5fbG9jaygmdGNvbm4tPmVwb2NoX2xvY2spOworCQkJCXNwaW5fdW5sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKKwkJCQlkcmJkX3NlbmRfYl9hY2soZXBvY2gtPmNvbm5lY3Rpb24sIGVwb2NoLT5iYXJyaWVyX25yLCBlcG9jaF9zaXplKTsKKwkJCQlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOwogCQkJfQogI2lmIDAKIAkJCS8qIEZJWE1FOiBkZWMgdW5hY2tlZCBvbiBjb25uZWN0aW9uLCBvbmNlIHdlIGhhdmUKIAkJCSAqIHNvbWV0aGluZyB0byBjb3VudCBwZW5kaW5nIGNvbm5lY3Rpb24gcGFja2V0cyBpbi4gKi8KIAkJCWlmICh0ZXN0X2JpdChERV9IQVZFX0JBUlJJRVJfTlVNQkVSLCAmZXBvY2gtPmZsYWdzKSkKLQkJCQlkZWNfdW5hY2tlZChlcG9jaC0+dGNvbm4pOworCQkJCWRlY191bmFja2VkKGVwb2NoLT5jb25uZWN0aW9uKTsKICNlbmRpZgogCi0JCQlpZiAodGNvbm4tPmN1cnJlbnRfZXBvY2ggIT0gZXBvY2gpIHsKKwkJCWlmIChjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoICE9IGVwb2NoKSB7CiAJCQkJbmV4dF9lcG9jaCA9IGxpc3RfZW50cnkoZXBvY2gtPmxpc3QubmV4dCwgc3RydWN0IGRyYmRfZXBvY2gsIGxpc3QpOwogCQkJCWxpc3RfZGVsKCZlcG9jaC0+bGlzdCk7CiAJCQkJZXYgPSBFVl9CRUNBTUVfTEFTVCB8IChldiAmIEVWX0NMRUFOVVApOwotCQkJCXRjb25uLT5lcG9jaHMtLTsKKwkJCQljb25uZWN0aW9uLT5lcG9jaHMtLTsKIAkJCQlrZnJlZShlcG9jaCk7CiAKIAkJCQlpZiAocnYgPT0gRkVfU1RJTExfTElWRSkKQEAgLTEyNDYsMjAgKzEyNTEsMjAgQEAKIAkJZXBvY2ggPSBuZXh0X2Vwb2NoOwogCX0gd2hpbGUgKDEpOwogCi0Jc3Bpbl91bmxvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+ZXBvY2hfbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKIC8qKgogICogZHJiZF9idW1wX3dyaXRlX29yZGVyaW5nKCkgLSBGYWxsIGJhY2sgdG8gYW4gb3RoZXIgd3JpdGUgb3JkZXJpbmcgbWV0aG9kCi0gKiBAdGNvbm46CURSQkQgY29ubmVjdGlvbi4KKyAqIEBjb25uZWN0aW9uOglEUkJEIGNvbm5lY3Rpb24uCiAgKiBAd286CQlXcml0ZSBvcmRlcmluZyBtZXRob2QgdG8gdHJ5LgogICovCi12b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3bykKK3ZvaWQgZHJiZF9idW1wX3dyaXRlX29yZGVyaW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3bykKIHsKIAlzdHJ1Y3QgZGlza19jb25mICpkYzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAllbnVtIHdyaXRlX29yZGVyaW5nX2UgcHdvOwogCWludCB2bnI7CiAJc3RhdGljIGNoYXIgKndyaXRlX29yZGVyaW5nX3N0cltdID0gewpAQCAtMTI2OCwyOSArMTI3MywzMSBAQAogCQlbV09fYmRldl9mbHVzaF0gPSAiZmx1c2giLAogCX07CiAKLQlwd28gPSB0Y29ubi0+d3JpdGVfb3JkZXJpbmc7CisJcHdvID0gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmc7CiAJd28gPSBtaW4ocHdvLCB3byk7CiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkKIAkJCWNvbnRpbnVlOwotCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpOworCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZik7CiAKIAkJaWYgKHdvID09IFdPX2JkZXZfZmx1c2ggJiYgIWRjLT5kaXNrX2ZsdXNoZXMpCiAJCQl3byA9IFdPX2RyYWluX2lvOwogCQlpZiAod28gPT0gV09fZHJhaW5faW8gJiYgIWRjLT5kaXNrX2RyYWluKQogCQkJd28gPSBXT19ub25lOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JdGNvbm4tPndyaXRlX29yZGVyaW5nID0gd287Ci0JaWYgKHB3byAhPSB0Y29ubi0+d3JpdGVfb3JkZXJpbmcgfHwgd28gPT0gV09fYmRldl9mbHVzaCkKLQkJY29ubl9pbmZvKHRjb25uLCAiTWV0aG9kIHRvIGVuc3VyZSB3cml0ZSBvcmRlcmluZzogJXNcbiIsIHdyaXRlX29yZGVyaW5nX3N0clt0Y29ubi0+d3JpdGVfb3JkZXJpbmddKTsKKwljb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZyA9IHdvOworCWlmIChwd28gIT0gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcgfHwgd28gPT0gV09fYmRldl9mbHVzaCkKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJNZXRob2QgdG8gZW5zdXJlIHdyaXRlIG9yZGVyaW5nOiAlc1xuIiwgd3JpdGVfb3JkZXJpbmdfc3RyW2Nvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nXSk7CiB9CiAKIC8qKgogICogZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHBlZXJfcmVxOglwZWVyIHJlcXVlc3QKICAqIEBydzoJCWZsYWcgZmllbGQsIHNlZSBiaW8tPmJpX3J3CiAgKgpAQCAtMTMwNSw3ICsxMzEyLDcgQEAKICAqICBvbiBjZXJ0YWluIFhlbiBkZXBsb3ltZW50cy4KICAqLwogLyogVE9ETyBhbGxvY2F0ZSBmcm9tIG91ciBvd24gYmlvX3NldC4gKi8KLWludCBkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3Qoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2ludCBkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsCiAJCQkgICAgIGNvbnN0IHVuc2lnbmVkIHJ3LCBjb25zdCBpbnQgZmF1bHRfdHlwZSkKIHsKQEAgLTEzMjksMTIgKzEzMzYsMTIgQEAKIG5leHRfYmlvOgogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnJfcGFnZXMpOwogCWlmICghYmlvKSB7Ci0JCWRldl9lcnIoREVWLCAic3VibWl0X2VlOiBBbGxvY2F0aW9uIG9mIGEgYmlvIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgInN1Ym1pdF9lZTogQWxsb2NhdGlvbiBvZiBhIGJpbyBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCS8qID4gcGVlcl9yZXEtPmkuc2VjdG9yLCB1bmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgYmlvICovCiAJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAJYmlvLT5iaV9ydyA9IHJ3OwogCWJpby0+YmlfcHJpdmF0ZSA9IHBlZXJfcmVxOwogCWJpby0+YmlfZW5kX2lvID0gZHJiZF9wZWVyX3JlcXVlc3RfZW5kaW87CkBAIC0xMzUwLDcgKzEzNTcsNyBAQAogCQkJICogQnV0IGluIGNhc2UgaXQgZmFpbHMgYW55d2F5cywKIAkJCSAqIHdlIGRlYWwgd2l0aCBpdCwgYW5kIGNvbXBsYWluIChiZWxvdykuICovCiAJCQlpZiAoYmlvLT5iaV92Y250ID09IDApIHsKLQkJCQlkZXZfZXJyKERFViwKKwkJCQlkcmJkX2VycihkZXZpY2UsCiAJCQkJCSJiaW9fYWRkX3BhZ2UgZmFpbGVkIGZvciBsZW49JXUsICIKIAkJCQkJImJpX3ZjbnQ9MCAoYmlfc2VjdG9yPSVsbHUpXG4iLAogCQkJCQlsZW4sICh1aW50NjRfdCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKQEAgLTEzNjMsOCArMTM3MCw4IEBACiAJCXNlY3RvciArPSBsZW4gPj4gOTsKIAkJLS1ucl9wYWdlczsKIAl9Ci0JRF9BU1NFUlQocGFnZSA9PSBOVUxMKTsKLQlEX0FTU0VSVChkcyA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIHBhZ2UgPT0gTlVMTCk7CisJRF9BU1NFUlQoZGV2aWNlLCBkcyA9PSAwKTsKIAogCWF0b21pY19zZXQoJnBlZXJfcmVxLT5wZW5kaW5nX2Jpb3MsIG5fYmlvcyk7CiAJZG8gewpAQCAtMTM3Miw3ICsxMzc5LDcgQEAKIAkJYmlvcyA9IGJpb3MtPmJpX25leHQ7CiAJCWJpby0+YmlfbmV4dCA9IE5VTEw7CiAKLQkJZHJiZF9nZW5lcmljX21ha2VfcmVxdWVzdChtZGV2LCBmYXVsdF90eXBlLCBiaW8pOworCQlkcmJkX2dlbmVyaWNfbWFrZV9yZXF1ZXN0KGRldmljZSwgZmF1bHRfdHlwZSwgYmlvKTsKIAl9IHdoaWxlIChiaW9zKTsKIAlyZXR1cm4gMDsKIApAQCAtMTM4NSwzNiArMTM5Miw0NCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfcmVtb3ZlX2Vwb2NoX2VudHJ5X2ludGVydmFsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCBkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJICAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBkcmJkX2ludGVydmFsICppID0gJnBlZXJfcmVxLT5pOwogCi0JZHJiZF9yZW1vdmVfaW50ZXJ2YWwoJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBpKTsKKwlkcmJkX3JlbW92ZV9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgaSk7CiAJZHJiZF9jbGVhcl9pbnRlcnZhbChpKTsKIAogCS8qIFdha2UgdXAgYW55IHByb2Nlc3NlcyB3YWl0aW5nIGZvciB0aGlzIHBlZXIgcmVxdWVzdCB0byBjb21wbGV0ZS4gICovCiAJaWYgKGktPndhaXRpbmcpCi0JCXdha2VfdXAoJm1kZXYtPm1pc2Nfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAotdm9pZCBjb25uX3dhaXRfYWN0aXZlX2VlX2VtcHR5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyB2b2lkIGNvbm5fd2FpdF9hY3RpdmVfZWVfZW1wdHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlrcmVmX2dldCgmbWRldi0+a3JlZik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCisJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgJm1kZXYtPmFjdGl2ZV9lZSk7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX0JhcnJpZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICoKK2Nvbm5fcGVlcl9kZXZpY2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZvbHVtZV9udW1iZXIpCit7CisJcmV0dXJuIGlkcl9maW5kKCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHZvbHVtZV9udW1iZXIpOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfQmFycmllcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCWludCBydjsKIAlzdHJ1Y3QgcF9iYXJyaWVyICpwID0gcGktPmRhdGE7CkBAIC0xNDIzLDE2ICsxNDM4LDE2IEBACiAJLyogRklYTUUgdGhlc2UgYXJlIHVuYWNrZWQgb24gY29ubmVjdGlvbiwKIAkgKiBub3QgYSBzcGVjaWZpYyAocGVlcilkZXZpY2UuCiAJICovCi0JdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmJhcnJpZXJfbnIgPSBwLT5iYXJyaWVyOwotCXRjb25uLT5jdXJyZW50X2Vwb2NoLT50Y29ubiA9IHRjb25uOwotCXJ2ID0gZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHRjb25uLCB0Y29ubi0+Y3VycmVudF9lcG9jaCwgRVZfR09UX0JBUlJJRVJfTlIpOworCWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmJhcnJpZXJfbnIgPSBwLT5iYXJyaWVyOworCWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCXJ2ID0gZHJiZF9tYXlfZmluaXNoX2Vwb2NoKGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gsIEVWX0dPVF9CQVJSSUVSX05SKTsKIAogCS8qIFBfQkFSUklFUl9BQ0sgbWF5IGltcGx5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW50IGlzIGRyb3BwZWQgZnJvbQogCSAqIHRoZSBhY3Rpdml0eSBsb2csIHdoaWNoIG1lYW5zIGl0IHdvdWxkIG5vdCBiZSByZXN5bmNlZCBpbiBjYXNlIHRoZQogCSAqIFJfUFJJTUFSWSBjcmFzaGVzIG5vdy4KIAkgKiBUaGVyZWZvcmUgd2UgbXVzdCBzZW5kIHRoZSBiYXJyaWVyX2FjayBhZnRlciB0aGUgYmFycmllciByZXF1ZXN0IHdhcwogCSAqIGNvbXBsZXRlZC4gKi8KLQlzd2l0Y2ggKHRjb25uLT53cml0ZV9vcmRlcmluZykgeworCXN3aXRjaCAoY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcpIHsKIAljYXNlIFdPX25vbmU6CiAJCWlmIChydiA9PSBGRV9SRUNZQ0xFRCkKIAkJCXJldHVybiAwOwpAQCAtMTQ0MywxNSArMTQ1OCwxNSBAQAogCQlpZiAoZXBvY2gpCiAJCQlicmVhazsKIAkJZWxzZQotCQkJY29ubl93YXJuKHRjb25uLCAiQWxsb2NhdGlvbiBvZiBhbiBlcG9jaCBmYWlsZWQsIHNsb3dpbmcgZG93blxuIik7CisJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIkFsbG9jYXRpb24gb2YgYW4gZXBvY2ggZmFpbGVkLCBzbG93aW5nIGRvd25cbiIpOwogCQkJLyogRmFsbCB0aHJvdWdoICovCiAKIAljYXNlIFdPX2JkZXZfZmx1c2g6CiAJY2FzZSBXT19kcmFpbl9pbzoKLQkJY29ubl93YWl0X2FjdGl2ZV9lZV9lbXB0eSh0Y29ubik7Ci0JCWRyYmRfZmx1c2godGNvbm4pOworCQljb25uX3dhaXRfYWN0aXZlX2VlX2VtcHR5KGNvbm5lY3Rpb24pOworCQlkcmJkX2ZsdXNoKGNvbm5lY3Rpb24pOwogCi0JCWlmIChhdG9taWNfcmVhZCgmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKSB7CisJCWlmIChhdG9taWNfcmVhZCgmY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkpIHsKIAkJCWVwb2NoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfTk9JTyk7CiAJCQlpZiAoZXBvY2gpCiAJCQkJYnJlYWs7CkBAIC0xNDU5LDcgKzE0NzQsNyBAQAogCiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCWNvbm5fZXJyKHRjb25uLCAiU3RyYW5nZW5lc3MgaW4gdGNvbm4tPndyaXRlX29yZGVyaW5nICVkXG4iLCB0Y29ubi0+d3JpdGVfb3JkZXJpbmcpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiU3RyYW5nZW5lc3MgaW4gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcgJWRcbiIsIGNvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNDY3LDE2ICsxNDgyLDE2IEBACiAJYXRvbWljX3NldCgmZXBvY2gtPmVwb2NoX3NpemUsIDApOwogCWF0b21pY19zZXQoJmVwb2NoLT5hY3RpdmUsIDApOwogCi0Jc3Bpbl9sb2NrKCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkpIHsKLQkJbGlzdF9hZGQoJmVwb2NoLT5saXN0LCAmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOwotCQl0Y29ubi0+Y3VycmVudF9lcG9jaCA9IGVwb2NoOwotCQl0Y29ubi0+ZXBvY2hzKys7CisJc3Bpbl9sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKSB7CisJCWxpc3RfYWRkKCZlcG9jaC0+bGlzdCwgJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOworCQljb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoID0gZXBvY2g7CisJCWNvbm5lY3Rpb24tPmVwb2NocysrOwogCX0gZWxzZSB7CiAJCS8qIFRoZSBjdXJyZW50X2Vwb2NoIGdvdCByZWN5Y2xlZCB3aGlsZSB3ZSBhbGxvY2F0ZWQgdGhpcyBvbmUuLi4gKi8KIAkJa2ZyZWUoZXBvY2gpOwogCX0KLQlzcGluX3VubG9jaygmdGNvbm4tPmVwb2NoX2xvY2spOworCXNwaW5fdW5sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4NCwyNSArMTQ5OSwyNiBAQAogLyogdXNlZCBmcm9tIHJlY2VpdmVfUlNEYXRhUmVwbHkgKHJlY3ZfcmVzeW5jX3JlYWQpCiAgKiBhbmQgZnJvbSByZWNlaXZlX0RhdGEgKi8KIHN0YXRpYyBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKgotcmVhZF9pbl9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1NjQgaWQsIHNlY3Rvcl90IHNlY3RvciwKK3JlYWRfaW5fYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCB1NjQgaWQsIHNlY3Rvcl90IHNlY3RvciwKIAkgICAgICBpbnQgZGF0YV9zaXplKSBfX211c3RfaG9sZChsb2NhbCkKIHsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCWNvbnN0IHNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGRncywgZHMsIGVycjsKLQl2b2lkICpkaWdfaW4gPSBtZGV2LT50Y29ubi0+aW50X2RpZ19pbjsKLQl2b2lkICpkaWdfdnYgPSBtZGV2LT50Y29ubi0+aW50X2RpZ192djsKKwl2b2lkICpkaWdfaW4gPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+aW50X2RpZ19pbjsKKwl2b2lkICpkaWdfdnYgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+aW50X2RpZ192djsKIAl1bnNpZ25lZCBsb25nICpkYXRhOwogCiAJZGdzID0gMDsKLQlpZiAobWRldi0+dGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSkgewotCQlkZ3MgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5wZWVyX2ludGVncml0eV90Zm0pOworCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7CisJCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CiAJCS8qCiAJCSAqIEZJWE1FOiBSZWNlaXZlIHRoZSBpbmNvbWluZyBkaWdlc3QgaW50byB0aGUgcmVjZWl2ZSBidWZmZXIKIAkJICoJICBoZXJlLCB0b2dldGhlciB3aXRoIGl0cyBzdHJ1Y3QgcF9kYXRhPwogCQkgKi8KLQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKG1kZXYtPnRjb25uLCBkaWdfaW4sIGRncyk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGlnX2luLCBkZ3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIE5VTEw7CiAJCWRhdGFfc2l6ZSAtPSBkZ3M7CkBAIC0xNTE2LDcgKzE1MzIsNyBAQAogCS8qIGV2ZW4gdGhvdWdoIHdlIHRydXN0IG91dCBwZWVyLAogCSAqIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGRvdWJsZSBjaGVjay4gKi8KIAlpZiAoc2VjdG9yICsgKGRhdGFfc2l6ZT4+OSkgPiBjYXBhY2l0eSkgewotCQlkZXZfZXJyKERFViwgInJlcXVlc3QgZnJvbSBwZWVyIGJleW9uZCBlbmQgb2YgbG9jYWwgZGlzazogIgorCQlkcmJkX2VycihkZXZpY2UsICJyZXF1ZXN0IGZyb20gcGVlciBiZXlvbmQgZW5kIG9mIGxvY2FsIGRpc2s6ICIKIAkJCSJjYXBhY2l0eTogJWxsdXMgPCBzZWN0b3I6ICVsbHVzICsgc2l6ZTogJXVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5LAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIGRhdGFfc2l6ZSk7CkBAIC0xNTI2LDcgKzE1NDIsNyBAQAogCS8qIEdGUF9OT0lPLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhdXNlIGFyYml0cmFyeSB3cml0ZS1vdXQ6IGluIGEgRFJCRAogCSAqICJjcmlzcy1jcm9zcyIgc2V0dXAsIHRoYXQgbWlnaHQgY2F1c2Ugd3JpdGUtb3V0IG9uIHNvbWUgb3RoZXIgRFJCRCwKIAkgKiB3aGljaCBpbiB0dXJuIG1pZ2h0IGJsb2NrIG9uIHRoZSBvdGhlciBub2RlIGF0IHRoaXMgdmVyeSBwbGFjZS4gICovCi0JcGVlcl9yZXEgPSBkcmJkX2FsbG9jX3BlZXJfcmVxKG1kZXYsIGlkLCBzZWN0b3IsIGRhdGFfc2l6ZSwgR0ZQX05PSU8pOworCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShwZWVyX2RldmljZSwgaWQsIHNlY3RvciwgZGF0YV9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKCFwZWVyX3JlcSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE1MzgsMzYgKzE1NTQsMzYgQEAKIAlwYWdlX2NoYWluX2Zvcl9lYWNoKHBhZ2UpIHsKIAkJdW5zaWduZWQgbGVuID0gbWluX3QoaW50LCBkcywgUEFHRV9TSVpFKTsKIAkJZGF0YSA9IGttYXAocGFnZSk7Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgZGF0YSwgbGVuKTsKLQkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KG1kZXYsIERSQkRfRkFVTFRfUkVDRUlWRSkpIHsKLQkJCWRldl9lcnIoREVWLCAiRmF1bHQgaW5qZWN0aW9uOiBDb3JydXB0aW5nIGRhdGEgb24gcmVjZWl2ZVxuIik7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGF0YSwgbGVuKTsKKwkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgRFJCRF9GQVVMVF9SRUNFSVZFKSkgeworCQkJZHJiZF9lcnIoZGV2aWNlLCAiRmF1bHQgaW5qZWN0aW9uOiBDb3JydXB0aW5nIGRhdGEgb24gcmVjZWl2ZVxuIik7CiAJCQlkYXRhWzBdID0gZGF0YVswXSBeICh1bnNpZ25lZCBsb25nKS0xOwogCQl9CiAJCWt1bm1hcChwYWdlKTsKIAkJaWYgKGVycikgewotCQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWRzIC09IGxlbjsKIAl9CiAKIAlpZiAoZGdzKSB7Ci0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtLCBwZWVyX3JlcSwgZGlnX3Z2KTsKKwkJZHJiZF9jc3VtX2VlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0sIHBlZXJfcmVxLCBkaWdfdnYpOwogCQlpZiAobWVtY21wKGRpZ19pbiwgZGlnX3Z2LCBkZ3MpKSB7Ci0JCQlkZXZfZXJyKERFViwgIkRpZ2VzdCBpbnRlZ3JpdHkgY2hlY2sgRkFJTEVEOiAlbGx1cyArJXVcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJEaWdlc3QgaW50ZWdyaXR5IGNoZWNrIEZBSUxFRDogJWxsdXMgKyV1XG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBkYXRhX3NpemUpOwotCQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQotCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKKwlkZXZpY2UtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKIAlyZXR1cm4gcGVlcl9yZXE7CiB9CiAKIC8qIGRyYmRfZHJhaW5fYmxvY2soKSBqdXN0IHRha2VzIGEgZGF0YSBibG9jawogICogb3V0IG9mIHRoZSBzb2NrZXQgaW5wdXQgYnVmZmVyLCBhbmQgZGlzY2FyZHMgaXQuCiAgKi8KLXN0YXRpYyBpbnQgZHJiZF9kcmFpbl9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgZGF0YV9zaXplKQorc3RhdGljIGludCBkcmJkX2RyYWluX2Jsb2NrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgZXJyID0gMDsKQEAgLTE1NzYsMzYgKzE1OTIsMzYgQEAKIAlpZiAoIWRhdGFfc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlwYWdlID0gZHJiZF9hbGxvY19wYWdlcyhtZGV2LCAxLCAxKTsKKwlwYWdlID0gZHJiZF9hbGxvY19wYWdlcyhwZWVyX2RldmljZSwgMSwgMSk7CiAKIAlkYXRhID0ga21hcChwYWdlKTsKIAl3aGlsZSAoZGF0YV9zaXplKSB7CiAJCXVuc2lnbmVkIGludCBsZW4gPSBtaW5fdChpbnQsIGRhdGFfc2l6ZSwgUEFHRV9TSVpFKTsKIAotCQllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4obWRldi0+dGNvbm4sIGRhdGEsIGxlbik7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGF0YSwgbGVuKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCQlkYXRhX3NpemUgLT0gbGVuOwogCX0KIAlrdW5tYXAocGFnZSk7Ci0JZHJiZF9mcmVlX3BhZ2VzKG1kZXYsIHBhZ2UsIDApOworCWRyYmRfZnJlZV9wYWdlcyhwZWVyX2RldmljZS0+ZGV2aWNlLCBwYWdlLCAwKTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZGxlc3NfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsCitzdGF0aWMgaW50IHJlY3ZfZGxlc3NfcmVhZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwKIAkJCSAgIHNlY3Rvcl90IHNlY3RvciwgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IGRncywgZXJyLCBleHBlY3Q7Ci0Jdm9pZCAqZGlnX2luID0gbWRldi0+dGNvbm4tPmludF9kaWdfaW47Ci0Jdm9pZCAqZGlnX3Z2ID0gbWRldi0+dGNvbm4tPmludF9kaWdfdnY7CisJdm9pZCAqZGlnX2luID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludF9kaWdfaW47CisJdm9pZCAqZGlnX3Z2ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludF9kaWdfdnY7CiAKIAlkZ3MgPSAwOwotCWlmIChtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7Ci0JCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSk7Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgZGlnX2luLCBkZ3MpOworCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7CisJCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGlnX2luLCBkZ3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJZGF0YV9zaXplIC09IGRnczsKQEAgLTE2MTMsMTUgKzE2MjksMTUgQEAKIAogCS8qIG9wdGltaXN0aWNhbGx5IHVwZGF0ZSByZWN2X2NudC4gIGlmIHJlY2VpdmluZyBmYWlscyBiZWxvdywKIAkgKiB3ZSBkaXNjb25uZWN0IGFueXdheXMsIGFuZCBjb3VudGVycyB3aWxsIGJlIHJlc2V0LiAqLwotCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKKwlwZWVyX2RldmljZS0+ZGV2aWNlLT5yZWN2X2NudCArPSBkYXRhX3NpemU+Pjk7CiAKIAliaW8gPSByZXEtPm1hc3Rlcl9iaW87Ci0JRF9BU1NFUlQoc2VjdG9yID09IGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOworCURfQVNTRVJUKHBlZXJfZGV2aWNlLT5kZXZpY2UsIHNlY3RvciA9PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQl2b2lkICptYXBwZWQgPSBrbWFwKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldDsKIAkJZXhwZWN0ID0gbWluX3QoaW50LCBkYXRhX3NpemUsIGJ2ZWMuYnZfbGVuKTsKLQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKG1kZXYtPnRjb25uLCBtYXBwZWQsIGV4cGVjdCk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgbWFwcGVkLCBleHBlY3QpOwogCQlrdW5tYXAoYnZlYy5idl9wYWdlKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC0xNjI5LDE0ICsxNjQ1LDE0IEBACiAJfQogCiAJaWYgKGRncykgewotCQlkcmJkX2NzdW1fYmlvKG1kZXYsIG1kZXYtPnRjb25uLT5wZWVyX2ludGVncml0eV90Zm0sIGJpbywgZGlnX3Z2KTsKKwkJZHJiZF9jc3VtX2JpbyhwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtLCBiaW8sIGRpZ192dik7CiAJCWlmIChtZW1jbXAoZGlnX2luLCBkaWdfdnYsIGRncykpIHsKLQkJCWRldl9lcnIoREVWLCAiRGlnZXN0IGludGVncml0eSBjaGVjayBGQUlMRUQuIEJyb2tlbiBOSUNzP1xuIik7CisJCQlkcmJkX2VycihwZWVyX2RldmljZSwgIkRpZ2VzdCBpbnRlZ3JpdHkgY2hlY2sgRkFJTEVELiBCcm9rZW4gTklDcz9cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKLQlEX0FTU0VSVChkYXRhX3NpemUgPT0gMCk7CisJRF9BU1NFUlQocGVlcl9kZXZpY2UtPmRldmljZSwgZGF0YV9zaXplID09IDApOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQ4LDY0ICsxNjY0LDY3IEBACiB7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSA9CiAJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCWludCBlcnI7CiAKLQlEX0FTU0VSVChkcmJkX2ludGVydmFsX2VtcHR5KCZwZWVyX3JlcS0+aSkpOworCURfQVNTRVJUKGRldmljZSwgZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKIAogCWlmIChsaWtlbHkoKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikgPT0gMCkpIHsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUlNfV1JJVEVfQUNLLCBwZWVyX3JlcSk7CisJCWRyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX1JTX1dSSVRFX0FDSywgcGVlcl9yZXEpOwogCX0gZWxzZSB7CiAJCS8qIFJlY29yZCBmYWlsdXJlIHRvIHN5bmMgKi8KLQkJZHJiZF9yc19mYWlsZWRfaW8obWRldiwgc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCi0JCWVyciAgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0FDSywgcGVlcl9yZXEpOworCQllcnIgID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwZWVyX3JlcSk7CiAJfQotCWRlY191bmFja2VkKG1kZXYpOworCWRlY191bmFja2VkKGRldmljZSk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcmVzeW5jX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgZGF0YV9zaXplKSBfX3JlbGVhc2VzKGxvY2FsKQorc3RhdGljIGludCByZWN2X3Jlc3luY19yZWFkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAorCQkJICAgIGludCBkYXRhX3NpemUpIF9fcmVsZWFzZXMobG9jYWwpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAKLQlwZWVyX3JlcSA9IHJlYWRfaW5fYmxvY2sobWRldiwgSURfU1lOQ0VSLCBzZWN0b3IsIGRhdGFfc2l6ZSk7CisJcGVlcl9yZXEgPSByZWFkX2luX2Jsb2NrKHBlZXJfZGV2aWNlLCBJRF9TWU5DRVIsIHNlY3RvciwgZGF0YV9zaXplKTsKIAlpZiAoIXBlZXJfcmVxKQogCQlnb3RvIGZhaWw7CiAKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JaW5jX3VuYWNrZWQobWRldik7CisJaW5jX3VuYWNrZWQoZGV2aWNlKTsKIAkvKiBjb3JyZXNwb25kaW5nIGRlY191bmFja2VkKCkgaW4gZV9lbmRfcmVzeW5jX2Jsb2NrKCkKIAkgKiByZXNwZWN0aXZlIF9kcmJkX2NsZWFyX2RvbmVfZWUgKi8KIAogCXBlZXJfcmVxLT53LmNiID0gZV9lbmRfcmVzeW5jX2Jsb2NrOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZCgmcGVlcl9yZXEtPncubGlzdCwgJm1kZXYtPnN5bmNfZWUpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnN5bmNfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JYXRvbWljX2FkZChkYXRhX3NpemUgPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOwotCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QobWRldiwgcGVlcl9yZXEsIFdSSVRFLCBEUkJEX0ZBVUxUX1JTX1dSKSA9PSAwKQorCWF0b21pY19hZGQoZGF0YV9zaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOworCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QoZGV2aWNlLCBwZWVyX3JlcSwgV1JJVEUsIERSQkRfRkFVTFRfUlNfV1IpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogZG9uJ3QgY2FyZSBmb3IgdGhlIHJlYXNvbiBoZXJlICovCi0JZGV2X2VycihERVYsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJZHJiZF9lcnIoZGV2aWNlLCAic3VibWl0IGZhaWxlZCwgdHJpZ2dlcmluZyByZS1jb25uZWN0XG4iKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogZmFpbDoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqCi1maW5kX3JlcXVlc3Qoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBpZCwKK2ZpbmRfcmVxdWVzdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBpZCwKIAkgICAgIHNlY3Rvcl90IHNlY3RvciwgYm9vbCBtaXNzaW5nX29rLCBjb25zdCBjaGFyICpmdW5jKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKQEAgLTE3MTUsMzYgKzE3MzQsMzggQEAKIAlpZiAoZHJiZF9jb250YWluc19pbnRlcnZhbChyb290LCBzZWN0b3IsICZyZXEtPmkpICYmIHJlcS0+aS5sb2NhbCkKIAkJcmV0dXJuIHJlcTsKIAlpZiAoIW1pc3Npbmdfb2spIHsKLQkJZGV2X2VycihERVYsICIlczogZmFpbGVkIHRvIGZpbmQgcmVxdWVzdCAweCVseCwgc2VjdG9yICVsbHVzXG4iLCBmdW5jLAorCQlkcmJkX2VycihkZXZpY2UsICIlczogZmFpbGVkIHRvIGZpbmQgcmVxdWVzdCAweCVseCwgc2VjdG9yICVsbHVzXG4iLCBmdW5jLAogCQkJKHVuc2lnbmVkIGxvbmcpaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9EYXRhUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX0RhdGFSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcF9kYXRhICpwID0gcGktPmRhdGE7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXJlcSA9IGZpbmRfcmVxdWVzdChtZGV2LCAmbWRldi0+cmVhZF9yZXF1ZXN0cywgcC0+YmxvY2tfaWQsIHNlY3RvciwgZmFsc2UsIF9fZnVuY19fKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlcSA9IGZpbmRfcmVxdWVzdChkZXZpY2UsICZkZXZpY2UtPnJlYWRfcmVxdWVzdHMsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIGZhbHNlLCBfX2Z1bmNfXyk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJaWYgKHVubGlrZWx5KCFyZXEpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIGhsaXN0X2RlbCgmcmVxLT5jb2xsaXNpb24pIGlzIGRvbmUgaW4gX3JlcV9tYXlfYmVfZG9uZSwgdG8gYXZvaWQKIAkgKiBzcGVjaWFsIGNhc2luZyBpdCB0aGVyZSBmb3IgdGhlIHZhcmlvdXMgZmFpbHVyZSBjYXNlcy4KIAkgKiBzdGlsbCBubyByYWNlIHdpdGggZHJiZF9mYWlsX3BlbmRpbmdfcmVhZHMgKi8KLQllcnIgPSByZWN2X2RsZXNzX3JlYWQobWRldiwgcmVxLCBzZWN0b3IsIHBpLT5zaXplKTsKKwllcnIgPSByZWN2X2RsZXNzX3JlYWQocGVlcl9kZXZpY2UsIHJlcSwgc2VjdG9yLCBwaS0+c2l6ZSk7CiAJaWYgKCFlcnIpCiAJCXJlcV9tb2QocmVxLCBEQVRBX1JFQ0VJVkVEKTsKIAkvKiBlbHNlOiBub3RoaW5nLiBoYW5kbGVkIGZyb20gZHJiZF9kaXNjb25uZWN0Li4uCkBAIC0xNzU0LDQ2ICsxNzc1LDQ4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1JTRGF0YVJlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9SU0RhdGFSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXNlY3Rvcl90IHNlY3RvcjsKIAlpbnQgZXJyOwogCXN0cnVjdCBwX2RhdGEgKnAgPSBwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJc2VjdG9yID0gYmU2NF90b19jcHUocC0+c2VjdG9yKTsKLQlEX0FTU0VSVChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpOworCURfQVNTRVJUKGRldmljZSwgcC0+YmxvY2tfaWQgPT0gSURfU1lOQ0VSKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgeworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CiAJCS8qIGRhdGEgaXMgc3VibWl0dGVkIHRvIGRpc2sgd2l0aGluIHJlY3ZfcmVzeW5jX3JlYWQuCiAJCSAqIGNvcnJlc3BvbmRpbmcgcHV0X2xkZXYgZG9uZSBiZWxvdyBvbiBlcnJvciwKIAkJICogb3IgaW4gZHJiZF9wZWVyX3JlcXVlc3RfZW5kaW8uICovCi0JCWVyciA9IHJlY3ZfcmVzeW5jX3JlYWQobWRldiwgc2VjdG9yLCBwaS0+c2l6ZSk7CisJCWVyciA9IHJlY3ZfcmVzeW5jX3JlYWQocGVlcl9kZXZpY2UsIHNlY3RvciwgcGktPnNpemUpOwogCX0gZWxzZSB7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJDYW4gbm90IHdyaXRlIHJlc3luYyBkYXRhIHRvIGxvY2FsIGRpc2suXG4iKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgIkNhbiBub3Qgd3JpdGUgcmVzeW5jIGRhdGEgdG8gbG9jYWwgZGlzay5cbiIpOwogCi0JCWVyciA9IGRyYmRfZHJhaW5fYmxvY2sobWRldiwgcGktPnNpemUpOworCQllcnIgPSBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAKLQkJZHJiZF9zZW5kX2Fja19kcChtZGV2LCBQX05FR19BQ0ssIHAsIHBpLT5zaXplKTsKKwkJZHJiZF9zZW5kX2Fja19kcChwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwLCBwaS0+c2l6ZSk7CiAJfQogCi0JYXRvbWljX2FkZChwaS0+c2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJYXRvbWljX2FkZChwaS0+c2l6ZSA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2luKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCByZXN0YXJ0X2NvbmZsaWN0aW5nX3dyaXRlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXE7CiAKLQlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKKwlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSkgewogCQlpZiAoIWktPmxvY2FsKQogCQkJY29udGludWU7CiAJCXJlcSA9IGNvbnRhaW5lcl9vZihpLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCBpKTsKQEAgLTE4MTMsNTIgKzE4MzYsNTMgQEAKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CiAJaW50IGVyciA9IDAsIHBjbWQ7CiAKIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfU0VORF9XUklURV9BQ0spIHsKIAkJaWYgKGxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSA9PSAwKSkgewotCQkJcGNtZCA9IChtZGV2LT5zdGF0ZS5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKLQkJCQltZGV2LT5zdGF0ZS5jb25uIDw9IENfUEFVU0VEX1NZTkNfVCAmJgorCQkJcGNtZCA9IChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgorCQkJCWRldmljZS0+c3RhdGUuY29ubiA8PSBDX1BBVVNFRF9TWU5DX1QgJiYKIAkJCQlwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9NQVlfU0VUX0lOX1NZTkMpID8KIAkJCQlQX1JTX1dSSVRFX0FDSyA6IFBfV1JJVEVfQUNLOwotCQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBwY21kLCBwZWVyX3JlcSk7CisJCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBwY21kLCBwZWVyX3JlcSk7CiAJCQlpZiAocGNtZCA9PSBQX1JTX1dSSVRFX0FDSykKLQkJCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CisJCQkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0FDSywgcGVlcl9yZXEpOworCQkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwZWVyX3JlcSk7CiAJCQkvKiB3ZSBleHBlY3QgaXQgdG8gYmUgbWFya2VkIG91dCBvZiBzeW5jIGFueXdheXMuLi4KIAkJCSAqIG1heWJlIGFzc2VydCB0aGlzPyAgKi8KIAkJfQotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAl9CiAJLyogd2UgZGVsZXRlIGZyb20gdGhlIGNvbmZsaWN0IGRldGVjdGlvbiBoYXNoIF9hZnRlcl8gd2Ugc2VudCBvdXQgdGhlCiAJICogUF9XUklURV9BQ0sgLyBQX05FR19BQ0ssIHRvIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIHJpZ2h0LiAgKi8KIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfSU5fSU5URVJWQUxfVFJFRSkgewotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCQlEX0FTU0VSVCghZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKLQkJZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJCURfQVNTRVJUKGRldmljZSwgIWRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CisJCWRyYmRfcmVtb3ZlX2Vwb2NoX2VudHJ5X2ludGVydmFsKGRldmljZSwgcGVlcl9yZXEpOwogCQlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfUkVTVEFSVF9SRVFVRVNUUykKLQkJCXJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKG1kZXYsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJCXJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKGRldmljZSwgc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfSBlbHNlCi0JCURfQVNTRVJUKGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CisJCURfQVNTRVJUKGRldmljZSwgZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKIAotCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaChtZGV2LT50Y29ubiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyAoY2FuY2VsID8gRVZfQ0xFQU5VUCA6IDApKTsKKwlkcmJkX21heV9maW5pc2hfZXBvY2goZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyAoY2FuY2VsID8gRVZfQ0xFQU5VUCA6IDApKTsKIAogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZV9zZW5kX2FjayhzdHJ1Y3QgZHJiZF93b3JrICp3LCBlbnVtIGRyYmRfcGFja2V0IGFjaykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOwogCWludCBlcnI7CiAKLQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIGFjaywgcGVlcl9yZXEpOwotCWRlY191bmFja2VkKG1kZXYpOworCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIGFjaywgcGVlcl9yZXEpOworCWRlY191bmFja2VkKHBlZXJfZGV2aWNlLT5kZXZpY2UpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE4NzAsOSArMTg5NCwxMSBAQAogCiBzdGF0aWMgaW50IGVfc2VuZF9yZXRyeV93cml0ZShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgdW51c2VkKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IHctPm1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uOwogCi0JcmV0dXJuIGVfc2VuZF9hY2sodywgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDAgPworCXJldHVybiBlX3NlbmRfYWNrKHcsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDAgPwogCQkJICAgICBQX1JFVFJZX1dSSVRFIDogUF9TVVBFUlNFREVEKTsKIH0KIApAQCAtMTg5MSwxOCArMTkxNywxOSBAQAogCXJldHVybiBzZXFfZ3JlYXRlcihhLCBiKSA/IGEgOiBiOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcGVlcl9zZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IHBlZXJfc2VxKQorc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJfc2VxKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5zaWduZWQgaW50IHBlZXJfc2VxKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAl1bnNpZ25lZCBpbnQgbmV3ZXN0X3BlZXJfc2VxOwogCi0JaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgewotCQlzcGluX2xvY2soJm1kZXYtPnBlZXJfc2VxX2xvY2spOwotCQluZXdlc3RfcGVlcl9zZXEgPSBzZXFfbWF4KG1kZXYtPnBlZXJfc2VxLCBwZWVyX3NlcSk7Ci0JCW1kZXYtPnBlZXJfc2VxID0gbmV3ZXN0X3BlZXJfc2VxOwotCQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7Ci0JCS8qIHdha2UgdXAgb25seSBpZiB3ZSBhY3R1YWxseSBjaGFuZ2VkIG1kZXYtPnBlZXJfc2VxICovCisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkgeworCQlzcGluX2xvY2soJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CisJCW5ld2VzdF9wZWVyX3NlcSA9IHNlcV9tYXgoZGV2aWNlLT5wZWVyX3NlcSwgcGVlcl9zZXEpOworCQlkZXZpY2UtPnBlZXJfc2VxID0gbmV3ZXN0X3BlZXJfc2VxOworCQlzcGluX3VubG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKKwkJLyogd2FrZSB1cCBvbmx5IGlmIHdlIGFjdHVhbGx5IGNoYW5nZWQgZGV2aWNlLT5wZWVyX3NlcSAqLwogCQlpZiAocGVlcl9zZXEgPT0gbmV3ZXN0X3BlZXJfc2VxKQotCQkJd2FrZV91cCgmbWRldi0+c2VxX3dhaXQpOworCQkJd2FrZV91cCgmZGV2aWNlLT5zZXFfd2FpdCk7CiAJfQogfQogCkBAIC0xOTEyLDIwICsxOTM5LDIwIEBACiB9CiAKIC8qIG1heWJlIGNoYW5nZSBzeW5jX2VlIGludG8gaW50ZXJ2YWwgdHJlZXMgYXMgd2VsbD8gKi8KLXN0YXRpYyBib29sIG92ZXJsYXBwaW5nX3Jlc3luY193cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQorc3RhdGljIGJvb2wgb3ZlcmxhcHBpbmdfcmVzeW5jX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcnNfcmVxOwogCWJvb2wgcnYgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzX3JlcSwgJm1kZXYtPnN5bmNfZWUsIHcubGlzdCkgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzX3JlcSwgJmRldmljZS0+c3luY19lZSwgdy5saXN0KSB7CiAJCWlmIChvdmVybGFwcyhwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUsCiAJCQkgICAgIHJzX3JlcS0+aS5zZWN0b3IsIHJzX3JlcS0+aS5zaXplKSkgewogCQkJcnYgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtMTkzOSw5ICsxOTY2LDkgQEAKICAqCiAgKiBOb3RlOiB3ZSBkb24ndCBjYXJlIGZvciBBY2sgcGFja2V0cyBvdmVydGFraW5nIFBfREFUQSBwYWNrZXRzLgogICoKLSAqIEluIGNhc2UgcGFja2V0X3NlcSBpcyBsYXJnZXIgdGhhbiBtZGV2LT5wZWVyX3NlcSBudW1iZXIsIHRoZXJlIGFyZQorICogSW4gY2FzZSBwYWNrZXRfc2VxIGlzIGxhcmdlciB0aGFuIGRldmljZS0+cGVlcl9zZXEgbnVtYmVyLCB0aGVyZSBhcmUKICAqIG91dHN0YW5kaW5nIHBhY2tldHMgb24gdGhlIG1zb2NrLiBXZSB3YWl0IGZvciB0aGVtIHRvIGFycml2ZS4KLSAqIEluIGNhc2Ugd2UgYXJlIHRoZSBsb2dpY2FsbHkgbmV4dCBwYWNrZXQsIHdlIHVwZGF0ZSBtZGV2LT5wZWVyX3NlcQorICogSW4gY2FzZSB3ZSBhcmUgdGhlIGxvZ2ljYWxseSBuZXh0IHBhY2tldCwgd2UgdXBkYXRlIGRldmljZS0+cGVlcl9zZXEKICAqIG91cnNlbHZlcy4gQ29ycmVjdGx5IGhhbmRsZXMgMzJiaXQgd3JhcCBhcm91bmQuCiAgKgogICogQXNzdW1lIHdlIGhhdmUgYSAxMCBHQml0IGNvbm5lY3Rpb24sIHRoYXQgaXMgYWJvdXQgMTw8MzAgYnl0ZSBwZXIgc2Vjb25kLApAQCAtMTk1MSwxOSArMTk3OCwyMCBAQAogICoKICAqIHJldHVybnMgMCBpZiB3ZSBtYXkgcHJvY2VzcyB0aGUgcGFja2V0LAogICogLUVSRVNUQVJUU1lTIGlmIHdlIHdlcmUgaW50ZXJydXB0ZWQgKGJ5IGRpc2Nvbm5lY3Qgc2lnbmFsKS4gKi8KLXN0YXRpYyBpbnQgd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1MzIgcGVlcl9zZXEpCitzdGF0aWMgaW50IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBjb25zdCB1MzIgcGVlcl9zZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCURFRklORV9XQUlUKHdhaXQpOwogCWxvbmcgdGltZW91dDsKIAlpbnQgcmV0ID0gMCwgdHA7CiAKLQlpZiAoIXRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2soJm1kZXYtPnBlZXJfc2VxX2xvY2spOworCXNwaW5fbG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKIAlmb3IgKDs7KSB7Ci0JCWlmICghc2VxX2dyZWF0ZXIocGVlcl9zZXEgLSAxLCBtZGV2LT5wZWVyX3NlcSkpIHsKLQkJCW1kZXYtPnBlZXJfc2VxID0gc2VxX21heChtZGV2LT5wZWVyX3NlcSwgcGVlcl9zZXEpOworCQlpZiAoIXNlcV9ncmVhdGVyKHBlZXJfc2VxIC0gMSwgZGV2aWNlLT5wZWVyX3NlcSkpIHsKKwkJCWRldmljZS0+cGVlcl9zZXEgPSBzZXFfbWF4KGRldmljZS0+cGVlcl9zZXEsIHBlZXJfc2VxKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE5NzMsMzUgKzIwMDEsMzUgQEAKIAkJfQogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJdHAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dHdvX3ByaW1hcmllczsKKwkJdHAgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT50d29fcHJpbWFyaWVzOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQlpZiAoIXRwKQogCQkJYnJlYWs7CiAKIAkJLyogT25seSBuZWVkIHRvIHdhaXQgaWYgdHdvX3ByaW1hcmllcyBpcyBlbmFibGVkICovCi0JCXByZXBhcmVfdG9fd2FpdCgmbWRldi0+c2VxX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5zZXFfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnBlZXJfc2VxX2xvY2spOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXRpbWVvdXQgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbypIWi8xMDsKKwkJdGltZW91dCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5waW5nX3RpbWVvKkhaLzEwOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJCXNwaW5fbG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKIAkJaWYgKCF0aW1lb3V0KSB7CiAJCQlyZXQgPSAtRVRJTUVET1VUOwotCQkJZGV2X2VycihERVYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWlzc2luZyBhY2sgcGFja2V0czsgZGlzY29ubmVjdGluZ1xuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWlzc2luZyBhY2sgcGFja2V0czsgZGlzY29ubmVjdGluZ1xuIik7CiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7Ci0JZmluaXNoX3dhaXQoJm1kZXYtPnNlcV93YWl0LCAmd2FpdCk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CisJZmluaXNoX3dhaXQoJmRldmljZS0+c2VxX3dhaXQsICZ3YWl0KTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBzZWUgYWxzbyBiaW9fZmxhZ3NfdG9fd2lyZSgpCiAgKiBEUkJEX1JFUV8qLCBiZWNhdXNlIHdlIG5lZWQgdG8gc2VtYW50aWNhbGx5IG1hcCB0aGUgZmxhZ3MgdG8gZGF0YSBwYWNrZXQKICAqIGZsYWdzIGFuZCBiYWNrLiBXZSBtYXkgcmVwbGljYXRlIHRvIG90aGVyIGtlcm5lbCB2ZXJzaW9ucy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpcmVfZmxhZ3NfdG9fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHUzMiBkcGYpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3aXJlX2ZsYWdzX3RvX2Jpbyh1MzIgZHBmKQogewogCXJldHVybiAgKGRwZiAmIERQX1JXX1NZTkMgPyBSRVFfU1lOQyA6IDApIHwKIAkJKGRwZiAmIERQX0ZVQSA/IFJFUV9GVUEgOiAwKSB8CkBAIC0yMDA5LDEzICsyMDM3LDEzIEBACiAJCShkcGYgJiBEUF9ESVNDQVJEID8gUkVRX0RJU0NBUkQgOiAwKTsKIH0KIAotc3RhdGljIHZvaWQgZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLAorc3RhdGljIHZvaWQgZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmk7CiAKICAgICByZXBlYXQ6Ci0JZHJiZF9mb3JfZWFjaF9vdmVybGFwKGksICZtZGV2LT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKSB7CisJZHJiZF9mb3JfZWFjaF9vdmVybGFwKGksICZkZXZpY2UtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKIAkJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxOwogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCkBAIC0yMDI2LDE5ICsyMDU0LDE5IEBACiAJCQljb250aW51ZTsKIAkJcmVxLT5ycV9zdGF0ZSAmPSB+UlFfUE9TVFBPTkVEOwogCQlfX3JlcV9tb2QocmVxLCBORUdfQUNLRUQsICZtKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJaWYgKG0uYmlvKQotCQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCQljb21wbGV0ZV9tYXN0ZXJfYmlvKGRldmljZSwgJm0pOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWdvdG8gcmVwZWF0OwogCX0KIH0KIAotc3RhdGljIGludCBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGhhbmRsZV93cml0ZV9jb25mbGljdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOwotCWJvb2wgcmVzb2x2ZV9jb25mbGljdHMgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnRjb25uLT5mbGFncyk7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHBlZXJfcmVxLT5wZWVyX2RldmljZS0+Y29ubmVjdGlvbjsKKwlib29sIHJlc29sdmVfY29uZmxpY3RzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCWNvbnN0IHVuc2lnbmVkIGludCBzaXplID0gcGVlcl9yZXEtPmkuc2l6ZTsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKQEAgLTIwNDksMTAgKzIwNzcsMTAgQEAKIAkgKiBJbnNlcnRpbmcgdGhlIHBlZXIgcmVxdWVzdCBpbnRvIHRoZSB3cml0ZV9yZXF1ZXN0cyB0cmVlIHdpbGwgcHJldmVudAogCSAqIG5ldyBjb25mbGljdGluZyBsb2NhbCByZXF1ZXN0cyBmcm9tIGJlaW5nIGFkZGVkLgogCSAqLwotCWRyYmRfaW5zZXJ0X2ludGVydmFsKCZtZGV2LT53cml0ZV9yZXF1ZXN0cywgJnBlZXJfcmVxLT5pKTsKKwlkcmJkX2luc2VydF9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgJnBlZXJfcmVxLT5pKTsKIAogICAgIHJlcGVhdDoKLQlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKKwlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSkgewogCQlpZiAoaSA9PSAmcGVlcl9yZXEtPmkpCiAJCQljb250aW51ZTsKIApAQCAtMjA2Miw3ICsyMDkwLDcgQEAKIAkJCSAqIHNob3VsZCBub3QgaGFwcGVuIGluIGEgdHdvLW5vZGUgc2V0dXAuICBXYWl0IGZvciB0aGUKIAkJCSAqIGVhcmxpZXIgcGVlciByZXF1ZXN0IHRvIGNvbXBsZXRlLgogCQkJICovCi0JCQllcnIgPSBkcmJkX3dhaXRfbWlzYyhtZGV2LCBpKTsKKwkJCWVyciA9IGRyYmRfd2FpdF9taXNjKGRldmljZSwgaSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByZXBlYXQ7CkBAIC0yMDgwLDE4ICsyMTA4LDE4IEBACiAJCQkJICAgICAgIChpLT5zaXplID4+IDkpID49IHNlY3RvciArIChzaXplID4+IDkpOwogCiAJCQlpZiAoIWVxdWFsKQotCQkJCWRldl9hbGVydChERVYsICJDb25jdXJyZW50IHdyaXRlcyBkZXRlY3RlZDogIgorCQkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiQ29uY3VycmVudCB3cml0ZXMgZGV0ZWN0ZWQ6ICIKIAkJCQkJICAgICAgICJsb2NhbD0lbGx1cyArJXUsIHJlbW90ZT0lbGx1cyArJXUsICIKIAkJCQkJICAgICAgICJhc3N1bWluZyAlcyBjYW1lIGZpcnN0XG4iLAogCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaS0+c2VjdG9yLCBpLT5zaXplLAogCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplLAogCQkJCQkgIHN1cGVyc2VkZWQgPyAibG9jYWwiIDogInJlbW90ZSIpOwogCi0JCQlpbmNfdW5hY2tlZChtZGV2KTsKKwkJCWluY191bmFja2VkKGRldmljZSk7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHN1cGVyc2VkZWQgPyBlX3NlbmRfc3VwZXJzZWRlZCA6CiAJCQkJCQkgICBlX3NlbmRfcmV0cnlfd3JpdGU7Ci0JCQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+ZG9uZV9lZSk7Ci0JCQl3YWtlX2FzZW5kZXIobWRldi0+dGNvbm4pOworCQkJbGlzdF9hZGRfdGFpbCgmcGVlcl9yZXEtPncubGlzdCwgJmRldmljZS0+ZG9uZV9lZSk7CisJCQl3YWtlX2FzZW5kZXIoY29ubmVjdGlvbik7CiAKIAkJCWVyciA9IC1FTk9FTlQ7CiAJCQlnb3RvIG91dDsKQEAgLTIxMDAsNyArMjEyOCw3IEBACiAJCQkJY29udGFpbmVyX29mKGksIHN0cnVjdCBkcmJkX3JlcXVlc3QsIGkpOwogCiAJCQlpZiAoIWVxdWFsKQotCQkJCWRldl9hbGVydChERVYsICJDb25jdXJyZW50IHdyaXRlcyBkZXRlY3RlZDogIgorCQkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiQ29uY3VycmVudCB3cml0ZXMgZGV0ZWN0ZWQ6ICIKIAkJCQkJICAgICAgICJsb2NhbD0lbGx1cyArJXUsIHJlbW90ZT0lbGx1cyArJXVcbiIsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpLT5zZWN0b3IsIGktPnNpemUsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNpemUpOwpAQCAtMjExOCwxMiArMjE0NiwxMCBAQAogCQkJCSAqIHJlcXVlc3QgdG8gZmluaXNoIGxvY2FsbHkgYmVmb3JlIHN1Ym1pdHRpbmcKIAkJCQkgKiB0aGUgY29uZmxpY3RpbmcgcGVlciByZXF1ZXN0LgogCQkJCSAqLwotCQkJCWVyciA9IGRyYmRfd2FpdF9taXNjKG1kZXYsICZyZXEtPmkpOworCQkJCWVyciA9IGRyYmRfd2FpdF9taXNjKGRldmljZSwgJnJlcS0+aSk7CiAJCQkJaWYgKGVycikgewotCQkJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLAotCQkJCQkJCSAgICBOUyhjb25uLCBDX1RJTUVPVVQpLAotCQkJCQkJCSAgICBDU19IQVJEKTsKLQkJCQkJZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJCQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1RJTUVPVVQpLCBDU19IQVJEKTsKKwkJCQkJZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJZ290byByZXBlYXQ7CkBAIC0yMTM5LDE0ICsyMTY1LDE1IEBACiAKICAgICBvdXQ6CiAJaWYgKGVycikKLQkJZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChkZXZpY2UsIHBlZXJfcmVxKTsKIAlyZXR1cm4gZXJyOwogfQogCiAvKiBtaXJyb3JlZCB3cml0ZSAqLwotc3RhdGljIGludCByZWNlaXZlX0RhdGEoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX0RhdGEoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcTsKIAlzdHJ1Y3QgcF9kYXRhICpwID0gcGktPmRhdGE7CkBAIC0yMTU1LDE3ICsyMTgyLDE4IEBACiAJdTMyIGRwX2ZsYWdzOwogCWludCBlcnIsIHRwOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCWludCBlcnIyOwogCi0JCWVyciA9IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEobWRldiwgcGVlcl9zZXEpOwotCQlkcmJkX3NlbmRfYWNrX2RwKG1kZXYsIFBfTkVHX0FDSywgcCwgcGktPnNpemUpOwotCQlhdG9taWNfaW5jKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSk7Ci0JCWVycjIgPSBkcmJkX2RyYWluX2Jsb2NrKG1kZXYsIHBpLT5zaXplKTsKKwkJZXJyID0gd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgcGVlcl9zZXEpOworCQlkcmJkX3NlbmRfYWNrX2RwKHBlZXJfZGV2aWNlLCBQX05FR19BQ0ssIHAsIHBpLT5zaXplKTsKKwkJYXRvbWljX2luYygmY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSk7CisJCWVycjIgPSBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAJCWlmICghZXJyKQogCQkJZXJyID0gZXJyMjsKIAkJcmV0dXJuIGVycjsKQEAgLTIxNzgsNjEgKzIyMDYsNjEgQEAKIAkgKi8KIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7Ci0JcGVlcl9yZXEgPSByZWFkX2luX2Jsb2NrKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIHBpLT5zaXplKTsKKwlwZWVyX3JlcSA9IHJlYWRfaW5fYmxvY2socGVlcl9kZXZpY2UsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIHBpLT5zaXplKTsKIAlpZiAoIXBlZXJfcmVxKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlwZWVyX3JlcS0+dy5jYiA9IGVfZW5kX2Jsb2NrOwogCiAJZHBfZmxhZ3MgPSBiZTMyX3RvX2NwdShwLT5kcF9mbGFncyk7Ci0JcncgfD0gd2lyZV9mbGFnc190b19iaW8obWRldiwgZHBfZmxhZ3MpOworCXJ3IHw9IHdpcmVfZmxhZ3NfdG9fYmlvKGRwX2ZsYWdzKTsKIAlpZiAocGVlcl9yZXEtPnBhZ2VzID09IE5VTEwpIHsKLQkJRF9BU1NFUlQocGVlcl9yZXEtPmkuc2l6ZSA9PSAwKTsKLQkJRF9BU1NFUlQoZHBfZmxhZ3MgJiBEUF9GTFVTSCk7CisJCURfQVNTRVJUKGRldmljZSwgcGVlcl9yZXEtPmkuc2l6ZSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkcF9mbGFncyAmIERQX0ZMVVNIKTsKIAl9CiAKIAlpZiAoZHBfZmxhZ3MgJiBEUF9NQVlfU0VUX0lOX1NZTkMpCiAJCXBlZXJfcmVxLT5mbGFncyB8PSBFRV9NQVlfU0VUX0lOX1NZTkM7CiAKLQlzcGluX2xvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKLQlwZWVyX3JlcS0+ZXBvY2ggPSB0Y29ubi0+Y3VycmVudF9lcG9jaDsKKwlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOworCXBlZXJfcmVxLT5lcG9jaCA9IGNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2g7CiAJYXRvbWljX2luYygmcGVlcl9yZXEtPmVwb2NoLT5lcG9jaF9zaXplKTsKIAlhdG9taWNfaW5jKCZwZWVyX3JlcS0+ZXBvY2gtPmFjdGl2ZSk7Ci0Jc3Bpbl91bmxvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+ZXBvY2hfbG9jayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdHAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dHdvX3ByaW1hcmllczsKKwl0cCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT50d29fcHJpbWFyaWVzOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh0cCkgewogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfSU5fSU5URVJWQUxfVFJFRTsKLQkJZXJyID0gd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShtZGV2LCBwZWVyX3NlcSk7CisJCWVyciA9IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIHBlZXJfc2VxKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2ludGVycnVwdGVkOwotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCQllcnIgPSBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKG1kZXYsIHBlZXJfcmVxKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQllcnIgPSBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKGRldmljZSwgcGVlcl9yZXEpOwogCQlpZiAoZXJyKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJCWlmIChlcnIgPT0gLUVOT0VOVCkgewotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlnb3RvIG91dF9pbnRlcnJ1cHRlZDsKIAkJfQogCX0gZWxzZSB7Ci0JCXVwZGF0ZV9wZWVyX3NlcShtZGV2LCBwZWVyX3NlcSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgcGVlcl9zZXEpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQotCWxpc3RfYWRkKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+YWN0aXZlX2VlKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPmFjdGl2ZV9lZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUKQotCQl3YWl0X2V2ZW50KG1kZXYtPmVlX3dhaXQsICFvdmVybGFwcGluZ19yZXN5bmNfd3JpdGUobWRldiwgcGVlcl9yZXEpKTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19UQVJHRVQpCisJCXdhaXRfZXZlbnQoZGV2aWNlLT5lZV93YWl0LCAhb3ZlcmxhcHBpbmdfcmVzeW5jX3dyaXRlKGRldmljZSwgcGVlcl9yZXEpKTsKIAotCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKSB7CisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlzd2l0Y2ggKHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT53aXJlX3Byb3RvY29sKSB7CisJCXN3aXRjaCAocmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPndpcmVfcHJvdG9jb2wpIHsKIAkJY2FzZSBEUkJEX1BST1RfQzoKIAkJCWRwX2ZsYWdzIHw9IERQX1NFTkRfV1JJVEVfQUNLOwogCQkJYnJlYWs7CkBAIC0yMjQ1LDcgKzIyNzMsNyBAQAogCiAJaWYgKGRwX2ZsYWdzICYgRFBfU0VORF9XUklURV9BQ0spIHsKIAkJcGVlcl9yZXEtPmZsYWdzIHw9IEVFX1NFTkRfV1JJVEVfQUNLOwotCQlpbmNfdW5hY2tlZChtZGV2KTsKKwkJaW5jX3VuYWNrZWQoZGV2aWNlKTsKIAkJLyogY29ycmVzcG9uZGluZyBkZWNfdW5hY2tlZCgpIGluIGVfZW5kX2Jsb2NrKCkKIAkJICogcmVzcGVjdGl2ZSBfZHJiZF9jbGVhcl9kb25lX2VlICovCiAJfQpAQCAtMjI1MywzNCArMjI4MSwzNCBAQAogCWlmIChkcF9mbGFncyAmIERQX1NFTkRfUkVDRUlWRV9BQ0spIHsKIAkJLyogSSByZWFsbHkgZG9uJ3QgbGlrZSBpdCB0aGF0IHRoZSByZWNlaXZlciB0aHJlYWQKIAkJICogc2VuZHMgb24gdGhlIG1zb2NrLCBidXQgYW55d2F5cyAqLwotCQlkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUkVDVl9BQ0ssIHBlZXJfcmVxKTsKKwkJZHJiZF9zZW5kX2FjayhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBQX1JFQ1ZfQUNLLCBwZWVyX3JlcSk7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCkgeworCWlmIChkZXZpY2UtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCkgewogCQkvKiBJbiBjYXNlIHdlIGhhdmUgdGhlIG9ubHkgZGlzayBvZiB0aGUgY2x1c3RlciwgKi8KLQkJZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfQ0FMTF9BTF9DT01QTEVURV9JTzsKIAkJcGVlcl9yZXEtPmZsYWdzICY9IH5FRV9NQVlfU0VUX0lOX1NZTkM7Ci0JCWRyYmRfYWxfYmVnaW5faW8obWRldiwgJnBlZXJfcmVxLT5pLCB0cnVlKTsKKwkJZHJiZF9hbF9iZWdpbl9pbyhkZXZpY2UsICZwZWVyX3JlcS0+aSwgdHJ1ZSk7CiAJfQogCi0JZXJyID0gZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KG1kZXYsIHBlZXJfcmVxLCBydywgRFJCRF9GQVVMVF9EVF9XUik7CisJZXJyID0gZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIHJ3LCBEUkJEX0ZBVUxUX0RUX1dSKTsKIAlpZiAoIWVycikKIAkJcmV0dXJuIDA7CiAKIAkvKiBkb24ndCBjYXJlIGZvciB0aGUgcmVhc29uIGhlcmUgKi8KLQlkZXZfZXJyKERFViwgInN1Ym1pdCBmYWlsZWQsIHRyaWdnZXJpbmcgcmUtY29ubmVjdFxuIik7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlkcmJkX2VycihkZXZpY2UsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlsaXN0X2RlbCgmcGVlcl9yZXEtPncubGlzdCk7Ci0JZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChkZXZpY2UsIHBlZXJfcmVxKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfQ0FMTF9BTF9DT01QTEVURV9JTykKLQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhtZGV2LCAmcGVlcl9yZXEtPmkpOworCQlkcmJkX2FsX2NvbXBsZXRlX2lvKGRldmljZSwgJnBlZXJfcmVxLT5pKTsKIAogb3V0X2ludGVycnVwdGVkOgotCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaCh0Y29ubiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyBFVl9DTEVBTlVQKTsKLQlwdXRfbGRldihtZGV2KTsKLQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaChjb25uZWN0aW9uLCBwZWVyX3JlcS0+ZXBvY2gsIEVWX1BVVCArIEVWX0NMRUFOVVApOworCXB1dF9sZGV2KGRldmljZSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIyOTUsOSArMjMyMyw5IEBACiAgKiBUaGUgY3VycmVudCBzeW5jIHJhdGUgdXNlZCBoZXJlIHVzZXMgb25seSB0aGUgbW9zdCByZWNlbnQgdHdvIHN0ZXAgbWFya3MsCiAgKiB0byBoYXZlIGEgc2hvcnQgdGltZSBhdmVyYWdlIHNvIHdlIGNhbiByZWFjdCBmYXN0ZXIuCiAgKi8KLWludCBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQoraW50IGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKQogewotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9jb250YWlucy0+YmRfZGlzazsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9jb250YWlucy0+YmRfZGlzazsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdDsKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqdG1wOwogCWludCBjdXJyX2V2ZW50czsKQEAgLTIzMDUsNDggKzIzMzMsNDggQEAKIAl1bnNpZ25lZCBpbnQgY19taW5fcmF0ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQljX21pbl9yYXRlID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmNfbWluX3JhdGU7CisJY19taW5fcmF0ZSA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmNfbWluX3JhdGU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBmZWF0dXJlIGRpc2FibGVkPyAqLwogCWlmIChjX21pbl9yYXRlID09IDApCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JdG1wID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIEJNX1NFQ1RfVE9fRVhUKHNlY3RvcikpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJdG1wID0gbGNfZmluZChkZXZpY2UtPnJlc3luYywgQk1fU0VDVF9UT19FWFQoc2VjdG9yKSk7CiAJaWYgKHRtcCkgewogCQlzdHJ1Y3QgYm1fZXh0ZW50ICpibV9leHQgPSBsY19lbnRyeSh0bXAsIHN0cnVjdCBibV9leHRlbnQsIGxjZSk7CiAJCWlmICh0ZXN0X2JpdChCTUVfUFJJT1JJVFksICZibV9leHQtPmZsYWdzKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCS8qIERvIG5vdCBzbG93IGRvd24gaWYgYXBwIElPIGlzIGFscmVhZHkgd2FpdGluZyBmb3IgdGhpcyBleHRlbnQgKi8KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAKIAljdXJyX2V2ZW50cyA9IChpbnQpcGFydF9zdGF0X3JlYWQoJmRpc2stPnBhcnQwLCBzZWN0b3JzWzBdKSArCiAJCSAgICAgIChpbnQpcGFydF9zdGF0X3JlYWQoJmRpc2stPnBhcnQwLCBzZWN0b3JzWzFdKSAtCi0JCQlhdG9taWNfcmVhZCgmbWRldi0+cnNfc2VjdF9ldik7CisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19zZWN0X2V2KTsKIAotCWlmICghbWRldi0+cnNfbGFzdF9ldmVudHMgfHwgY3Vycl9ldmVudHMgLSBtZGV2LT5yc19sYXN0X2V2ZW50cyA+IDY0KSB7CisJaWYgKCFkZXZpY2UtPnJzX2xhc3RfZXZlbnRzIHx8IGN1cnJfZXZlbnRzIC0gZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA+IDY0KSB7CiAJCXVuc2lnbmVkIGxvbmcgcnNfbGVmdDsKIAkJaW50IGk7CiAKLQkJbWRldi0+cnNfbGFzdF9ldmVudHMgPSBjdXJyX2V2ZW50czsKKwkJZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA9IGN1cnJfZXZlbnRzOwogCiAJCS8qIHN5bmMgc3BlZWQgYXZlcmFnZSBvdmVyIHRoZSBsYXN0IDIqRFJCRF9TWU5DX01BUktfU1RFUCwKIAkJICogYXBwcm94LiAqLwotCQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKKwkJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKLQkJCXJzX2xlZnQgPSBtZGV2LT5vdl9sZWZ0OworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCQlyc19sZWZ0ID0gZGV2aWNlLT5vdl9sZWZ0OwogCQllbHNlCi0JCQlyc19sZWZ0ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikgLSBtZGV2LT5yc19mYWlsZWQ7CisJCQlyc19sZWZ0ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSAtIGRldmljZS0+cnNfZmFpbGVkOwogCi0JCWR0ID0gKChsb25nKWppZmZpZXMgLSAobG9uZyltZGV2LT5yc19tYXJrX3RpbWVbaV0pIC8gSFo7CisJCWR0ID0gKChsb25nKWppZmZpZXMgLSAobG9uZylkZXZpY2UtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKIAkJaWYgKCFkdCkKIAkJCWR0Kys7Ci0JCWRiID0gbWRldi0+cnNfbWFya19sZWZ0W2ldIC0gcnNfbGVmdDsKKwkJZGIgPSBkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CiAJCWRiZHQgPSBCaXQyS0IoZGIvZHQpOwogCiAJCWlmIChkYmR0ID4gY19taW5fcmF0ZSkKQEAgLTIzNTYsOSArMjM4NCwxMCBAQAogfQogCiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9EYXRhUmVxdWVzdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfRGF0YVJlcXVlc3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc2VjdG9yX3QgY2FwYWNpdHk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcTsKQEAgLTIzNjcsNTggKzIzOTYsNTkgQEAKIAl1bnNpZ25lZCBpbnQgZmF1bHRfdHlwZTsKIAlzdHJ1Y3QgcF9ibG9ja19yZXEgKnAgPQlwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKLQljYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwljYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAJc2l6ZSAgID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAKIAlpZiAoc2l6ZSA8PSAwIHx8ICFJU19BTElHTkVEKHNpemUsIDUxMikgfHwgc2l6ZSA+IERSQkRfTUFYX0JJT19TSVpFKSB7Ci0JCWRldl9lcnIoREVWLCAiJXM6JWQ6IHNlY3RvcjogJWxsdXMsIHNpemU6ICV1XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCWRyYmRfZXJyKGRldmljZSwgIiVzOiVkOiBzZWN0b3I6ICVsbHVzLCBzaXplOiAldVxuIiwgX19GSUxFX18sIF9fTElORV9fLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChzZWN0b3IgKyAoc2l6ZT4+OSkgPiBjYXBhY2l0eSkgewotCQlkZXZfZXJyKERFViwgIiVzOiVkOiBzZWN0b3I6ICVsbHVzLCBzaXplOiAldVxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQlkcmJkX2VycihkZXZpY2UsICIlczolZDogc2VjdG9yOiAlbGx1cywgc2l6ZTogJXVcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvciwgc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9VUF9UT19EQVRFKSkgeworCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX1VQX1RPX0RBVEUpKSB7CiAJCXZlcmIgPSAxOwogCQlzd2l0Y2ggKHBpLT5jbWQpIHsKIAkJY2FzZSBQX0RBVEFfUkVRVUVTVDoKLQkJCWRyYmRfc2VuZF9hY2tfcnAobWRldiwgUF9ORUdfRFJFUExZLCBwKTsKKwkJCWRyYmRfc2VuZF9hY2tfcnAocGVlcl9kZXZpY2UsIFBfTkVHX0RSRVBMWSwgcCk7CiAJCQlicmVhazsKIAkJY2FzZSBQX1JTX0RBVEFfUkVRVUVTVDoKIAkJY2FzZSBQX0NTVU1fUlNfUkVRVUVTVDoKIAkJY2FzZSBQX09WX1JFUVVFU1Q6Ci0JCQlkcmJkX3NlbmRfYWNrX3JwKG1kZXYsIFBfTkVHX1JTX0RSRVBMWSAsIHApOworCQkJZHJiZF9zZW5kX2Fja19ycChwZWVyX2RldmljZSwgUF9ORUdfUlNfRFJFUExZICwgcCk7CiAJCQlicmVhazsKIAkJY2FzZSBQX09WX1JFUExZOgogCQkJdmVyYiA9IDA7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKLQkJCWRyYmRfc2VuZF9hY2tfZXgobWRldiwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwgSURfSU5fU1lOQyk7CisJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOworCQkJZHJiZF9zZW5kX2Fja19leChwZWVyX2RldmljZSwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwgSURfSU5fU1lOQyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CiAJCWlmICh2ZXJiICYmIF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIkNhbiBub3Qgc2F0aXNmeSBwZWVyJ3MgcmVhZCByZXF1ZXN0LCAiCisJCQlkcmJkX2VycihkZXZpY2UsICJDYW4gbm90IHNhdGlzZnkgcGVlcidzIHJlYWQgcmVxdWVzdCwgIgogCQkJICAgICJubyBsb2NhbCBkYXRhLlxuIik7CiAKIAkJLyogZHJhaW4gcG9zc2libHkgcGF5bG9hZCAqLwotCQlyZXR1cm4gZHJiZF9kcmFpbl9ibG9jayhtZGV2LCBwaS0+c2l6ZSk7CisJCXJldHVybiBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAJfQogCiAJLyogR0ZQX05PSU8sIGJlY2F1c2Ugd2UgbXVzdCBub3QgY2F1c2UgYXJiaXRyYXJ5IHdyaXRlLW91dDogaW4gYSBEUkJECiAJICogImNyaXNzLWNyb3NzIiBzZXR1cCwgdGhhdCBtaWdodCBjYXVzZSB3cml0ZS1vdXQgb24gc29tZSBvdGhlciBEUkJELAogCSAqIHdoaWNoIGluIHR1cm4gbWlnaHQgYmxvY2sgb24gdGhlIG90aGVyIG5vZGUgYXQgdGhpcyB2ZXJ5IHBsYWNlLiAgKi8KLQlwZWVyX3JlcSA9IGRyYmRfYWxsb2NfcGVlcl9yZXEobWRldiwgcC0+YmxvY2tfaWQsIHNlY3Rvciwgc2l6ZSwgR0ZQX05PSU8pOworCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShwZWVyX2RldmljZSwgcC0+YmxvY2tfaWQsIHNlY3Rvciwgc2l6ZSwgR0ZQX05PSU8pOwogCWlmICghcGVlcl9yZXEpIHsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjQzMyw3ICsyNDYzLDcgQEAKIAkJcGVlcl9yZXEtPncuY2IgPSB3X2VfZW5kX3JzZGF0YV9yZXE7CiAJCWZhdWx0X3R5cGUgPSBEUkJEX0ZBVUxUX1JTX1JEOwogCQkvKiB1c2VkIGluIHRoZSBzZWN0b3Igb2Zmc2V0IHByb2dyZXNzIGRpc3BsYXkgKi8KLQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gQk1fU0VDVF9UT19CSVQoc2VjdG9yKTsKKwkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBCTV9TRUNUX1RPX0JJVChzZWN0b3IpOwogCQlicmVhazsKIAogCWNhc2UgUF9PVl9SRVBMWToKQEAgLTI0NDksMTkgKzI0NzksMTkgQEAKIAkJcGVlcl9yZXEtPmRpZ2VzdCA9IGRpOwogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfSEFTX0RJR0VTVDsKIAotCQlpZiAoZHJiZF9yZWN2X2FsbChtZGV2LT50Y29ubiwgZGktPmRpZ2VzdCwgcGktPnNpemUpKQorCQlpZiAoZHJiZF9yZWN2X2FsbChwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGktPmRpZ2VzdCwgcGktPnNpemUpKQogCQkJZ290byBvdXRfZnJlZV9lOwogCiAJCWlmIChwaS0+Y21kID09IFBfQ1NVTV9SU19SRVFVRVNUKSB7Ci0JCQlEX0FTU0VSVChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg5KTsKKwkJCURfQVNTRVJUKGRldmljZSwgcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSk7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHdfZV9lbmRfY3N1bV9yc19yZXE7CiAJCQkvKiB1c2VkIGluIHRoZSBzZWN0b3Igb2Zmc2V0IHByb2dyZXNzIGRpc3BsYXkgKi8KLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJCX0gZWxzZSBpZiAocGktPmNtZCA9PSBQX09WX1JFUExZKSB7CiAJCQkvKiB0cmFjayBwcm9ncmVzcywgd2UgbWF5IG5lZWQgdG8gdGhyb3R0bGUgKi8KLQkJCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJCQlhdG9taWNfYWRkKHNpemUgPj4gOSwgJmRldmljZS0+cnNfc2VjdF9pbik7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHdfZV9lbmRfb3ZfcmVwbHk7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCQkvKiBkcmJkX3JzX2JlZ2luX2lvIGRvbmUgd2hlbiB3ZSBzZW50IHRoaXMgcmVxdWVzdCwKIAkJCSAqIGJ1dCBhY2NvdW50aW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUuICovCiAJCQlnb3RvIHN1Ym1pdF9mb3JfcmVzeW5jOwpAQCAtMjQ2OSwxOSArMjQ5OSwxOSBAQAogCQlicmVhazsKIAogCWNhc2UgUF9PVl9SRVFVRVNUOgotCQlpZiAobWRldi0+b3Zfc3RhcnRfc2VjdG9yID09IH4oc2VjdG9yX3QpMCAmJgotCQkgICAgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5MCkgeworCQlpZiAoZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPT0gfihzZWN0b3JfdCkwICYmCisJCSAgICBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDkwKSB7CiAJCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJCQlpbnQgaTsKLQkJCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IHNlY3RvcjsKLQkJCW1kZXYtPm92X3Bvc2l0aW9uID0gc2VjdG9yOwotCQkJbWRldi0+b3ZfbGVmdCA9IGRyYmRfYm1fYml0cyhtZGV2KSAtIEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7Ci0JCQltZGV2LT5yc190b3RhbCA9IG1kZXYtPm92X2xlZnQ7CisJCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IHNlY3RvcjsKKwkJCWRldmljZS0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CisJCQlkZXZpY2UtPm92X2xlZnQgPSBkcmJkX2JtX2JpdHMoZGV2aWNlKSAtIEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CisJCQlkZXZpY2UtPnJzX3RvdGFsID0gZGV2aWNlLT5vdl9sZWZ0OwogCQkJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCQkJbWRldi0+cnNfbWFya19sZWZ0W2ldID0gbWRldi0+b3ZfbGVmdDsKLQkJCQltZGV2LT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CisJCQkJZGV2aWNlLT5yc19tYXJrX2xlZnRbaV0gPSBkZXZpY2UtPm92X2xlZnQ7CisJCQkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CiAJCQl9Ci0JCQlkZXZfaW5mbyhERVYsICJPbmxpbmUgVmVyaWZ5IHN0YXJ0IHNlY3RvcjogJWxsdVxuIiwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJPbmxpbmUgVmVyaWZ5IHN0YXJ0IHNlY3RvcjogJWxsdVxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IpOwogCQl9CiAJCXBlZXJfcmVxLT53LmNiID0gd19lX2VuZF9vdl9yZXE7CkBAIC0yNTE0LDU3ICsyNTQ0LDYxIEBACiAJICogd2Ugd291bGQgYWxzbyB0aHJvdHRsZSBpdHMgYXBwbGljYXRpb24gcmVhZHMuCiAJICogSW4gdGhhdCBjYXNlLCB0aHJvdHRsaW5nIGlzIGRvbmUgb24gdGhlIFN5bmNUYXJnZXQgb25seS4KIAkgKi8KLQlpZiAobWRldi0+c3RhdGUucGVlciAhPSBSX1BSSU1BUlkgJiYgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikpCisJaWYgKGRldmljZS0+c3RhdGUucGVlciAhPSBSX1BSSU1BUlkgJiYgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKGRldmljZSwgc2VjdG9yKSkKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFovMTApOwotCWlmIChkcmJkX3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpCisJaWYgKGRyYmRfcnNfYmVnaW5faW8oZGV2aWNlLCBzZWN0b3IpKQogCQlnb3RvIG91dF9mcmVlX2U7CiAKIHN1Ym1pdF9mb3JfcmVzeW5jOgotCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9ldik7CisJYXRvbWljX2FkZChzaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOwogCiBzdWJtaXQ6Ci0JaW5jX3VuYWNrZWQobWRldik7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCWluY191bmFja2VkKGRldmljZSk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JaWYgKGRyYmRfc3VibWl0X3BlZXJfcmVxdWVzdChtZGV2LCBwZWVyX3JlcSwgUkVBRCwgZmF1bHRfdHlwZSkgPT0gMCkKKwlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIFJFQUQsIGZhdWx0X3R5cGUpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogZG9uJ3QgY2FyZSBmb3IgdGhlIHJlYXNvbiBoZXJlICovCi0JZGV2X2VycihERVYsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJZHJiZF9lcnIoZGV2aWNlLCAic3VibWl0IGZhaWxlZCwgdHJpZ2dlcmluZyByZS1jb25uZWN0XG4iKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkvKiBubyBkcmJkX3JzX2NvbXBsZXRlX2lvKCksIHdlIGFyZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBhbnl3YXlzICovCiAKIG91dF9mcmVlX2U6Ci0JcHV0X2xkZXYobWRldik7Ci0JZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwlwdXRfbGRldihkZXZpY2UpOworCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBkcmJkX2FzYl9yZWNvdmVyXzBwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQorLyoqCisgKiBkcmJkX2FzYl9yZWNvdmVyXzBwICAtICBSZWNvdmVyIGFmdGVyIHNwbGl0LWJyYWluIHdpdGggbm8gcmVtYWluaW5nIHByaW1hcmllcworICovCitzdGF0aWMgaW50IGRyYmRfYXNiX3JlY292ZXJfMHAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCkKIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IHNlbGYsIHBlZXIsIHJ2ID0gLTEwMDsKIAl1bnNpZ25lZCBsb25nIGNoX3NlbGYsIGNoX3BlZXI7CiAJZW51bSBkcmJkX2FmdGVyX3NiX3AgYWZ0ZXJfc2JfMHA7CiAKLQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICYgMTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0JJVE1BUF0gJiAxOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIDE7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiAxOwogCi0JY2hfcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9TSVpFXTsKLQljaF9zZWxmID0gbWRldi0+Y29tbV9ibV9zZXQ7CisJY2hfcGVlciA9IGRldmljZS0+cF91dWlkW1VJX1NJWkVdOworCWNoX3NlbGYgPSBkZXZpY2UtPmNvbW1fYm1fc2V0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFmdGVyX3NiXzBwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZiktPmFmdGVyX3NiXzBwOworCWFmdGVyX3NiXzBwID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPmFmdGVyX3NiXzBwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoYWZ0ZXJfc2JfMHApIHsKIAljYXNlIEFTQl9DT05TRU5TVVM6CiAJY2FzZSBBU0JfRElTQ0FSRF9TRUNPTkRBUlk6CiAJY2FzZSBBU0JfQ0FMTF9IRUxQRVI6CiAJY2FzZSBBU0JfVklPTEVOVExZOgotCQlkZXZfZXJyKERFViwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ29uZmlndXJhdGlvbiBlcnJvci5cbiIpOwogCQlicmVhazsKIAljYXNlIEFTQl9ESVNDT05ORUNUOgogCQlicmVhazsKQEAgLTI1ODgsMTEgKzI2MjIsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIG9uZSBvZiB0aGUgb3RoZXIgc3RyYXRlZ2llcy4uLiAqLwotCQlkZXZfd2FybihERVYsICJEaXNjYXJkIHlvdW5nZXIvb2xkZXIgcHJpbWFyeSBkaWQgbm90IGZpbmQgYSBkZWNpc2lvblxuIgorCQlkcmJkX3dhcm4oZGV2aWNlLCAiRGlzY2FyZCB5b3VuZ2VyL29sZGVyIHByaW1hcnkgZGlkIG5vdCBmaW5kIGEgZGVjaXNpb25cbiIKIAkJICAgICAiVXNpbmcgZGlzY2FyZC1sZWFzdC1jaGFuZ2VzIGluc3RlYWRcbiIpOwogCWNhc2UgQVNCX0RJU0NBUkRfWkVST19DSEc6CiAJCWlmIChjaF9wZWVyID09IDAgJiYgY2hfc2VsZiA9PSAwKSB7Ci0JCQlydiA9IHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKQorCQkJcnYgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncykKIAkJCQk/IC0xIDogMTsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewpAQCAtMjYwOCw3ICsyNjQyLDcgQEAKIAkJCXJ2ID0gIDE7CiAJCWVsc2UgLyogKCBjaF9zZWxmID09IGNoX3BlZXIgKSAqLwogCQkgICAgIC8qIFdlbGwsIHRoZW4gdXNlIHNvbWV0aGluZyBlbHNlLiAqLwotCQkJcnYgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJm1kZXYtPnRjb25uLT5mbGFncykKKwkJCXJ2ID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZmxhZ3MpCiAJCQkJPyAtMSA6IDE7CiAJCWJyZWFrOwogCWNhc2UgQVNCX0RJU0NBUkRfTE9DQUw6CkBAIC0yNjIxLDEzICsyNjU1LDE3IEBACiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGRyYmRfYXNiX3JlY292ZXJfMXAoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCisvKioKKyAqIGRyYmRfYXNiX3JlY292ZXJfMXAgIC0gIFJlY292ZXIgYWZ0ZXIgc3BsaXQtYnJhaW4gd2l0aCBvbmUgcmVtYWluaW5nIHByaW1hcnkKKyAqLworc3RhdGljIGludCBkcmJkX2FzYl9yZWNvdmVyXzFwKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBoZywgcnYgPSAtMTAwOwogCWVudW0gZHJiZF9hZnRlcl9zYl9wIGFmdGVyX3NiXzFwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFmdGVyX3NiXzFwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZiktPmFmdGVyX3NiXzFwOworCWFmdGVyX3NiXzFwID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPmFmdGVyX3NiXzFwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoYWZ0ZXJfc2JfMXApIHsKIAljYXNlIEFTQl9ESVNDQVJEX1lPVU5HRVJfUFJJOgpAQCAtMjYzNiwzNSArMjY3NCwzNSBAQAogCWNhc2UgQVNCX0RJU0NBUkRfTE9DQUw6CiAJY2FzZSBBU0JfRElTQ0FSRF9SRU1PVEU6CiAJY2FzZSBBU0JfRElTQ0FSRF9aRVJPX0NIRzoKLQkJZGV2X2VycihERVYsICJDb25maWd1cmF0aW9uIGVycm9yLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBU0JfRElTQ09OTkVDVDoKIAkJYnJlYWs7CiAJY2FzZSBBU0JfQ09OU0VOU1VTOgotCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7Ci0JCWlmIChoZyA9PSAtMSAmJiBtZGV2LT5zdGF0ZS5yb2xlID09IFJfU0VDT05EQVJZKQorCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOworCQlpZiAoaGcgPT0gLTEgJiYgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfU0VDT05EQVJZKQogCQkJcnYgPSBoZzsKLQkJaWYgKGhnID09IDEgICYmIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpZiAoaGcgPT0gMSAgJiYgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSkKIAkJCXJ2ID0gaGc7CiAJCWJyZWFrOwogCWNhc2UgQVNCX1ZJT0xFTlRMWToKLQkJcnYgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKG1kZXYpOworCQlydiA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOwogCQlicmVhazsKIAljYXNlIEFTQl9ESVNDQVJEX1NFQ09OREFSWToKLQkJcmV0dXJuIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZID8gMSA6IC0xOworCQlyZXR1cm4gZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSA/IDEgOiAtMTsKIAljYXNlIEFTQl9DQUxMX0hFTFBFUjoKLQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKG1kZXYpOwotCQlpZiAoaGcgPT0gLTEgJiYgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKKwkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKHBlZXJfZGV2aWNlKTsKKwkJaWYgKGhnID09IC0xICYmIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKIAkJCWVudW0gZHJiZF9zdGF0ZV9ydiBydjI7CiAKIAkJCSAvKiBkcmJkX2NoYW5nZV9zdGF0ZSgpIGRvZXMgbm90IHNsZWVwIHdoaWxlIGluIFNTX0lOX1RSQU5TSUVOVF9TVEFURSwKIAkJCSAgKiB3ZSBtaWdodCBiZSBoZXJlIGluIENfV0ZfUkVQT1JUX1BBUkFNUyB3aGljaCBpcyB0cmFuc2llbnQuCiAJCQkgICogd2UgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgdGhlIGFmdGVyIHN0YXRlIGNoYW5nZSB3b3JrIGVpdGhlci4gKi8KLQkJCXJ2MiA9IGRyYmRfY2hhbmdlX3N0YXRlKG1kZXYsIENTX1ZFUkJPU0UsIE5TKHJvbGUsIFJfU0VDT05EQVJZKSk7CisJCQlydjIgPSBkcmJkX2NoYW5nZV9zdGF0ZShkZXZpY2UsIENTX1ZFUkJPU0UsIE5TKHJvbGUsIFJfU0VDT05EQVJZKSk7CiAJCQlpZiAocnYyICE9IFNTX1NVQ0NFU1MpIHsKLQkJCQlkcmJkX2toZWxwZXIobWRldiwgInByaS1sb3N0LWFmdGVyLXNiIik7CisJCQkJZHJiZF9raGVscGVyKGRldmljZSwgInByaS1sb3N0LWFmdGVyLXNiIik7CiAJCQl9IGVsc2UgewotCQkJCWRldl93YXJuKERFViwgIlN1Y2Nlc3NmdWxseSBnYXZlIHVwIHByaW1hcnkgcm9sZS5cbiIpOworCQkJCWRyYmRfd2FybihkZXZpY2UsICJTdWNjZXNzZnVsbHkgZ2F2ZSB1cCBwcmltYXJ5IHJvbGUuXG4iKTsKIAkJCQlydiA9IGhnOwogCQkJfQogCQl9IGVsc2UKQEAgLTI2NzQsMTMgKzI3MTIsMTcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9hc2JfcmVjb3Zlcl8ycChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCkKKy8qKgorICogZHJiZF9hc2JfcmVjb3Zlcl8ycCAgLSAgUmVjb3ZlciBhZnRlciBzcGxpdC1icmFpbiB3aXRoIHR3byByZW1haW5pbmcgcHJpbWFyaWVzCisgKi8KK3N0YXRpYyBpbnQgZHJiZF9hc2JfcmVjb3Zlcl8ycChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlpbnQgaGcsIHJ2ID0gLTEwMDsKIAllbnVtIGRyYmRfYWZ0ZXJfc2JfcCBhZnRlcl9zYl8ycDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlhZnRlcl9zYl8ycCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT5hZnRlcl9zYl8ycDsKKwlhZnRlcl9zYl8ycCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5hZnRlcl9zYl8ycDsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlzd2l0Y2ggKGFmdGVyX3NiXzJwKSB7CiAJY2FzZSBBU0JfRElTQ0FSRF9ZT1VOR0VSX1BSSToKQEAgLTI2OTEsMjYgKzI3MzMsMjYgQEAKIAljYXNlIEFTQl9DT05TRU5TVVM6CiAJY2FzZSBBU0JfRElTQ0FSRF9TRUNPTkRBUlk6CiAJY2FzZSBBU0JfRElTQ0FSRF9aRVJPX0NIRzoKLQkJZGV2X2VycihERVYsICJDb25maWd1cmF0aW9uIGVycm9yLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBU0JfVklPTEVOVExZOgotCQlydiA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCXJ2ID0gZHJiZF9hc2JfcmVjb3Zlcl8wcChwZWVyX2RldmljZSk7CiAJCWJyZWFrOwogCWNhc2UgQVNCX0RJU0NPTk5FQ1Q6CiAJCWJyZWFrOwogCWNhc2UgQVNCX0NBTExfSEVMUEVSOgotCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8wcChwZWVyX2RldmljZSk7CiAJCWlmIChoZyA9PSAtMSkgewogCQkJZW51bSBkcmJkX3N0YXRlX3J2IHJ2MjsKIAogCQkJIC8qIGRyYmRfY2hhbmdlX3N0YXRlKCkgZG9lcyBub3Qgc2xlZXAgd2hpbGUgaW4gU1NfSU5fVFJBTlNJRU5UX1NUQVRFLAogCQkJICAqIHdlIG1pZ2h0IGJlIGhlcmUgaW4gQ19XRl9SRVBPUlRfUEFSQU1TIHdoaWNoIGlzIHRyYW5zaWVudC4KIAkJCSAgKiB3ZSBkbyBub3QgbmVlZCB0byB3YWl0IGZvciB0aGUgYWZ0ZXIgc3RhdGUgY2hhbmdlIHdvcmsgZWl0aGVyLiAqLwotCQkJcnYyID0gZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfVkVSQk9TRSwgTlMocm9sZSwgUl9TRUNPTkRBUlkpKTsKKwkJCXJ2MiA9IGRyYmRfY2hhbmdlX3N0YXRlKGRldmljZSwgQ1NfVkVSQk9TRSwgTlMocm9sZSwgUl9TRUNPTkRBUlkpKTsKIAkJCWlmIChydjIgIT0gU1NfU1VDQ0VTUykgewotCQkJCWRyYmRfa2hlbHBlcihtZGV2LCAicHJpLWxvc3QtYWZ0ZXItc2IiKTsKKwkJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLWxvc3QtYWZ0ZXItc2IiKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZGV2X3dhcm4oREVWLCAiU3VjY2Vzc2Z1bGx5IGdhdmUgdXAgcHJpbWFyeSByb2xlLlxuIik7CisJCQkJZHJiZF93YXJuKGRldmljZSwgIlN1Y2Nlc3NmdWxseSBnYXZlIHVwIHByaW1hcnkgcm9sZS5cbiIpOwogCQkJCXJ2ID0gaGc7CiAJCQl9CiAJCX0gZWxzZQpAQCAtMjcyMCwxNCArMjc2MiwxNCBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF91dWlkX2R1bXAoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY2hhciAqdGV4dCwgdTY0ICp1dWlkLAorc3RhdGljIHZvaWQgZHJiZF91dWlkX2R1bXAoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKnRleHQsIHU2NCAqdXVpZCwKIAkJCSAgIHU2NCBiaXRzLCB1NjQgZmxhZ3MpCiB7CiAJaWYgKCF1dWlkKSB7Ci0JCWRldl9pbmZvKERFViwgIiVzIHV1aWQgaW5mbyB2YW5pc2hlZCB3aGlsZSBJIHdhcyBsb29raW5nIVxuIiwgdGV4dCk7CisJCWRyYmRfaW5mbyhkZXZpY2UsICIlcyB1dWlkIGluZm8gdmFuaXNoZWQgd2hpbGUgSSB3YXMgbG9va2luZyFcbiIsIHRleHQpOwogCQlyZXR1cm47CiAJfQotCWRldl9pbmZvKERFViwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFggYml0czolbGx1IGZsYWdzOiVsbFhcbiIsCisJZHJiZF9pbmZvKGRldmljZSwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFggYml0czolbGx1IGZsYWdzOiVsbFhcbiIsCiAJICAgICB0ZXh0LAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0NVUlJFTlRdLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0JJVE1BUF0sCkBAIC0yNzQ5LDEzICsyNzkxLDEzIEBACiAtMTA5MSAgIHJlcXVpcmVzIHByb3RvIDkxCiAtMTA5NiAgIHJlcXVpcmVzIHByb3RvIDk2CiAgKi8KLXN0YXRpYyBpbnQgZHJiZF91dWlkX2NvbXBhcmUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50ICpydWxlX25yKSBfX211c3RfaG9sZChsb2NhbCkKK3N0YXRpYyBpbnQgZHJiZF91dWlkX2NvbXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCAqcnVsZV9ucikgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJdTY0IHNlbGYsIHBlZXI7CiAJaW50IGksIGo7CiAKLQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOwogCiAJKnJ1bGVfbnIgPSAxMDsKIAlpZiAoc2VsZiA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJiBwZWVyID09IFVVSURfSlVTVF9DUkVBVEVEKQpAQCAtMjc3NCw0NiArMjgxNiw0NiBAQAogCWlmIChzZWxmID09IHBlZXIpIHsKIAkJaW50IHJjdCwgZGM7IC8qIHJvbGVzIGF0IGNyYXNoIHRpbWUgKi8KIAotCQlpZiAobWRldi0+cF91dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAhPSAodTY0KTApIHsKKwkJaWYgKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICE9ICh1NjQpMCkgewogCi0JCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQorCQkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQogCQkJCXJldHVybiAtMTA5MTsKIAotCQkJaWYgKChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpICYmCi0JCQkgICAgKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdICYgfigodTY0KTEpKSkgewotCQkJCWRldl9pbmZvKERFViwgIndhcyBTeW5jU291cmNlLCBtaXNzZWQgdGhlIHJlc3luYyBmaW5pc2hlZCBldmVudCwgY29ycmVjdGVkIG15c2VsZjpcbiIpOwotCQkJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkobWRldik7Ci0JCQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKLQkJCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPSAwOworCQkJaWYgKChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkgPT0gKGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSAmJgorCQkJICAgIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpKSB7CisJCQkJZHJiZF9pbmZvKGRldmljZSwgIndhcyBTeW5jU291cmNlLCBtaXNzZWQgdGhlIHJlc3luYyBmaW5pc2hlZCBldmVudCwgY29ycmVjdGVkIG15c2VsZjpcbiIpOworCQkJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkoZGV2aWNlKTsKKwkJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwkJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IDA7CiAKLQkJCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAic2VsZiIsIG1kZXYtPmxkZXYtPm1kLnV1aWQsCi0JCQkJCSAgICAgICBtZGV2LT5zdGF0ZS5kaXNrID49IERfTkVHT1RJQVRJTkcgPyBkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA6IDAsIDApOworCQkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInNlbGYiLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWQsCisJCQkJCSAgICAgICBkZXZpY2UtPnN0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyA/IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgOiAwLCAwKTsKIAkJCQkqcnVsZV9uciA9IDM0OwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfaW5mbyhERVYsICJ3YXMgU3luY1NvdXJjZSAocGVlciBmYWlsZWQgdG8gd3JpdGUgc3luY191dWlkKVxuIik7CisJCQkJZHJiZF9pbmZvKGRldmljZSwgIndhcyBTeW5jU291cmNlIChwZWVyIGZhaWxlZCB0byB3cml0ZSBzeW5jX3V1aWQpXG4iKTsKIAkJCQkqcnVsZV9uciA9IDM2OwogCQkJfQogCiAJCQlyZXR1cm4gMTsKIAkJfQogCi0JCWlmIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICE9ICh1NjQpMCkgeworCQlpZiAoZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gIT0gKHU2NCkwKSB7CiAKLQkJCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCisJCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCiAJCQkJcmV0dXJuIC0xMDkxOwogCi0JCQlpZiAoKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkgJiYKLQkJCSAgICAobWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCQkJZGV2X2luZm8oREVWLCAid2FzIFN5bmNUYXJnZXQsIHBlZXIgbWlzc2VkIHRoZSByZXN5bmMgZmluaXNoZWQgZXZlbnQsIGNvcnJlY3RlZCBwZWVyOlxuIik7CisJCQlpZiAoKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkgPT0gKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpICYmCisJCQkgICAgKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpID09IChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkpIHsKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAid2FzIFN5bmNUYXJnZXQsIHBlZXIgbWlzc2VkIHRoZSByZXN5bmMgZmluaXNoZWQgZXZlbnQsIGNvcnJlY3RlZCBwZWVyOlxuIik7CiAKLQkJCQltZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdID0gbWRldi0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdOwotCQkJCW1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdOwotCQkJCW1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdID0gMFVMOworCQkJCWRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSA9IGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdOworCQkJCWRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gZGV2aWNlLT5wX3V1aWRbVUlfQklUTUFQXTsKKwkJCQlkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdID0gMFVMOwogCi0JCQkJZHJiZF91dWlkX2R1bXAobWRldiwgInBlZXIiLCBtZGV2LT5wX3V1aWQsIG1kZXYtPnBfdXVpZFtVSV9TSVpFXSwgbWRldi0+cF91dWlkW1VJX0ZMQUdTXSk7CisJCQkJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAicGVlciIsIGRldmljZS0+cF91dWlkLCBkZXZpY2UtPnBfdXVpZFtVSV9TSVpFXSwgZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdKTsKIAkJCQkqcnVsZV9uciA9IDM1OwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfaW5mbyhERVYsICJ3YXMgU3luY1RhcmdldCAoZmFpbGVkIHRvIHdyaXRlIHN5bmNfdXVpZClcbiIpOworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJ3YXMgU3luY1RhcmdldCAoZmFpbGVkIHRvIHdyaXRlIHN5bmNfdXVpZClcbiIpOwogCQkJCSpydWxlX25yID0gMzc7CiAJCQl9CiAKQEAgLTI4MjEsOCArMjg2Myw4IEBACiAJCX0KIAogCQkvKiBDb21tb24gcG93ZXIgW29mZnxmYWlsdXJlXSAqLwotCQlyY3QgPSAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpID8gMSA6IDApICsKLQkJCShtZGV2LT5wX3V1aWRbVUlfRkxBR1NdICYgMik7CisJCXJjdCA9ICh0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSA/IDEgOiAwKSArCisJCQkoZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICYgMik7CiAJCS8qIGxvd2VzdCBiaXQgaXMgc2V0IHdoZW4gd2Ugd2VyZSBwcmltYXJ5LAogCQkgKiBuZXh0IGJpdCAod2VpZ2h0IDIpIGlzIHNldCB3aGVuIHBlZXIgd2FzIHByaW1hcnkgKi8KIAkJKnJ1bGVfbnIgPSA0MDsKQEAgLTI4MzIsNzIgKzI4NzQsNzIgQEAKIAkJY2FzZSAxOiAvKiAgc2VsZl9wcmkgJiYgIXBlZXJfcHJpICovIHJldHVybiAxOwogCQljYXNlIDI6IC8qICFzZWxmX3ByaSAmJiAgcGVlcl9wcmkgKi8gcmV0dXJuIC0xOwogCQljYXNlIDM6IC8qICBzZWxmX3ByaSAmJiAgcGVlcl9wcmkgKi8KLQkJCWRjID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCQkJZGMgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCXJldHVybiBkYyA/IC0xIDogMTsKIAkJfQogCX0KIAogCSpydWxlX25yID0gNTA7Ci0JcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOworCXBlZXIgPSBkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOwogCWlmIChzZWxmID09IHBlZXIpCiAJCXJldHVybiAtMTsKIAogCSpydWxlX25yID0gNTE7Ci0JcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKTsKKwlwZWVyID0gZGV2aWNlLT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikgewotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KLQkJICAgIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSA9PQotCQkgICAgKG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpIDoKLQkJICAgIHBlZXIgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpKSkgeworCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYgPworCQkgICAgKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkgPT0KKwkJICAgIChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpIDoKKwkJICAgIHBlZXIgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpKSB7CiAJCQkvKiBUaGUgbGFzdCBQX1NZTkNfVVVJRCBkaWQgbm90IGdldCB0aG91Z2guIFVuZG8gdGhlIGxhc3Qgc3RhcnQgb2YKIAkJCSAgIHJlc3luYyBhcyBzeW5jIHNvdXJjZSBtb2RpZmljYXRpb25zIG9mIHRoZSBwZWVyJ3MgVVVJRHMuICovCiAKLQkJCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCisJCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCiAJCQkJcmV0dXJuIC0xMDkxOwogCi0JCQltZGV2LT5wX3V1aWRbVUlfQklUTUFQXSA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXTsKLQkJCW1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV07CisJCQlkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdID0gZGV2aWNlLT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF07CisJCQlkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXTsKIAotCQkJZGV2X2luZm8oREVWLCAiTG9zdCBsYXN0IHN5bmNVVUlEIHBhY2tldCwgY29ycmVjdGVkOlxuIik7Ci0JCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAicGVlciIsIG1kZXYtPnBfdXVpZCwgbWRldi0+cF91dWlkW1VJX1NJWkVdLCBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJMb3N0IGxhc3Qgc3luY1VVSUQgcGFja2V0LCBjb3JyZWN0ZWQ6XG4iKTsKKwkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInBlZXIiLCBkZXZpY2UtPnBfdXVpZCwgZGV2aWNlLT5wX3V1aWRbVUlfU0laRV0sIGRldmljZS0+cF91dWlkW1VJX0ZMQUdTXSk7CiAKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KIAogCSpydWxlX25yID0gNjA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKTsKIAlmb3IgKGkgPSBVSV9ISVNUT1JZX1NUQVJUOyBpIDw9IFVJX0hJU1RPUllfRU5EOyBpKyspIHsKLQkJcGVlciA9IG1kZXYtPnBfdXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJcGVlciA9IGRldmljZS0+cF91dWlkW2ldICYgfigodTY0KTEpOwogCQlpZiAoc2VsZiA9PSBwZWVyKQogCQkJcmV0dXJuIC0yOwogCX0KIAogCSpydWxlX25yID0gNzA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKKwlwZWVyID0gZGV2aWNlLT5wX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikKIAkJcmV0dXJuIDE7CiAKIAkqcnVsZV9uciA9IDcxOwotCXNlbGYgPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikgewotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KLQkJICAgIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSAmIH4oKHU2NCkxKSkgPT0KLQkJICAgIChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpIDoKLQkJICAgIHNlbGYgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkpIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KKwkJICAgIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdICYgfigodTY0KTEpKSA9PQorCQkgICAgKGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSA6CisJCSAgICBzZWxmICsgVVVJRF9ORVdfQk1fT0ZGU0VUID09IChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkpIHsKIAkJCS8qIFRoZSBsYXN0IFBfU1lOQ19VVUlEIGRpZCBub3QgZ2V0IHRob3VnaC4gVW5kbyB0aGUgbGFzdCBzdGFydCBvZgogCQkJICAgcmVzeW5jIGFzIHN5bmMgc291cmNlIG1vZGlmaWNhdGlvbnMgb2Ygb3VyIFVVSURzLiAqLwogCi0JCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQorCQkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQogCQkJCXJldHVybiAtMTA5MTsKIAotCQkJX19kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0JJVE1BUCwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSk7Ci0JCQlfX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfSElTVE9SWV9TVEFSVCwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0pOworCQkJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0pOworCQkJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfSElTVE9SWV9TVEFSVCwgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSk7CiAKLQkJCWRldl9pbmZvKERFViwgIkxhc3Qgc3luY1VVSUQgZGlkIG5vdCBnZXQgdGhyb3VnaCwgY29ycmVjdGVkOlxuIik7Ci0JCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAic2VsZiIsIG1kZXYtPmxkZXYtPm1kLnV1aWQsCi0JCQkJICAgICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyA/IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpIDogMCwgMCk7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiTGFzdCBzeW5jVVVJRCBkaWQgbm90IGdldCB0aHJvdWdoLCBjb3JyZWN0ZWQ6XG4iKTsKKwkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInNlbGYiLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWQsCisJCQkJICAgICAgIGRldmljZS0+c3RhdGUuZGlzayA+PSBEX05FR09USUFUSU5HID8gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA6IDAsIDApOwogCiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMjkwNSwyNCArMjk0NywyNCBAQAogCiAKIAkqcnVsZV9uciA9IDgwOwotCXBlZXIgPSBtZGV2LT5wX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOwogCWZvciAoaSA9IFVJX0hJU1RPUllfU1RBUlQ7IGkgPD0gVUlfSElTVE9SWV9FTkQ7IGkrKykgewotCQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKIAkJaWYgKHNlbGYgPT0gcGVlcikKIAkJCXJldHVybiAyOwogCX0KIAogCSpydWxlX25yID0gOTA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSk7CisJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOworCXBlZXIgPSBkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOwogCWlmIChzZWxmID09IHBlZXIgJiYgc2VsZiAhPSAoKHU2NCkwKSkKIAkJcmV0dXJuIDEwMDsKIAogCSpydWxlX25yID0gMTAwOwogCWZvciAoaSA9IFVJX0hJU1RPUllfU1RBUlQ7IGkgPD0gVUlfSElTVE9SWV9FTkQ7IGkrKykgewotCQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKIAkJZm9yIChqID0gVUlfSElTVE9SWV9TVEFSVDsgaiA8PSBVSV9ISVNUT1JZX0VORDsgaisrKSB7Ci0JCQlwZWVyID0gbWRldi0+cF91dWlkW2pdICYgfigodTY0KTEpOworCQkJcGVlciA9IGRldmljZS0+cF91dWlkW2pdICYgfigodTY0KTEpOwogCQkJaWYgKHNlbGYgPT0gcGVlcikKIAkJCQlyZXR1cm4gLTEwMDsKIAkJfQpAQCAtMjkzNCwzNiArMjk3NiwzOCBAQAogLyogZHJiZF9zeW5jX2hhbmRzaGFrZSgpIHJldHVybnMgdGhlIG5ldyBjb25uIHN0YXRlIG9uIHN1Y2Nlc3MsIG9yCiAgICBDT05OX01BU0sgKC0xKSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgZW51bSBkcmJkX2Nvbm5zIGRyYmRfc3luY19oYW5kc2hha2Uoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3JvbGUgcGVlcl9yb2xlLAorc3RhdGljIGVudW0gZHJiZF9jb25ucyBkcmJkX3N5bmNfaGFuZHNoYWtlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwKKwkJCQkJICAgZW51bSBkcmJkX3JvbGUgcGVlcl9yb2xlLAogCQkJCQkgICBlbnVtIGRyYmRfZGlza19zdGF0ZSBwZWVyX2Rpc2spIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAllbnVtIGRyYmRfY29ubnMgcnYgPSBDX01BU0s7CiAJZW51bSBkcmJkX2Rpc2tfc3RhdGUgbXlkaXNrOwogCXN0cnVjdCBuZXRfY29uZiAqbmM7CiAJaW50IGhnLCBydWxlX25yLCBycl9jb25mbGljdCwgdGVudGF0aXZlOwogCi0JbXlkaXNrID0gbWRldi0+c3RhdGUuZGlzazsKKwlteWRpc2sgPSBkZXZpY2UtPnN0YXRlLmRpc2s7CiAJaWYgKG15ZGlzayA9PSBEX05FR09USUFUSU5HKQotCQlteWRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCW15ZGlzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5kaXNrOwogCi0JZGV2X2luZm8oREVWLCAiZHJiZF9zeW5jX2hhbmRzaGFrZTpcbiIpOworCWRyYmRfaW5mbyhkZXZpY2UsICJkcmJkX3N5bmNfaGFuZHNoYWtlOlxuIik7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5sZGV2LT5tZC51dWlkX2xvY2spOwotCWRyYmRfdXVpZF9kdW1wKG1kZXYsICJzZWxmIiwgbWRldi0+bGRldi0+bWQudXVpZCwgbWRldi0+Y29tbV9ibV9zZXQsIDApOwotCWRyYmRfdXVpZF9kdW1wKG1kZXYsICJwZWVyIiwgbWRldi0+cF91dWlkLAotCQkgICAgICAgbWRldi0+cF91dWlkW1VJX1NJWkVdLCBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAic2VsZiIsIGRldmljZS0+bGRldi0+bWQudXVpZCwgZGV2aWNlLT5jb21tX2JtX3NldCwgMCk7CisJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAicGVlciIsIGRldmljZS0+cF91dWlkLAorCQkgICAgICAgZGV2aWNlLT5wX3V1aWRbVUlfU0laRV0sIGRldmljZS0+cF91dWlkW1VJX0ZMQUdTXSk7CiAKLQloZyA9IGRyYmRfdXVpZF9jb21wYXJlKG1kZXYsICZydWxlX25yKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJaGcgPSBkcmJkX3V1aWRfY29tcGFyZShkZXZpY2UsICZydWxlX25yKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrKTsKIAotCWRldl9pbmZvKERFViwgInV1aWRfY29tcGFyZSgpPSVkIGJ5IHJ1bGUgJWRcbiIsIGhnLCBydWxlX25yKTsKKwlkcmJkX2luZm8oZGV2aWNlLCAidXVpZF9jb21wYXJlKCk9JWQgYnkgcnVsZSAlZFxuIiwgaGcsIHJ1bGVfbnIpOwogCiAJaWYgKGhnID09IC0xMDAwKSB7Ci0JCWRldl9hbGVydChERVYsICJVbnJlbGF0ZWQgZGF0YSwgYWJvcnRpbmchXG4iKTsKKwkJZHJiZF9hbGVydChkZXZpY2UsICJVbnJlbGF0ZWQgZGF0YSwgYWJvcnRpbmchXG4iKTsKIAkJcmV0dXJuIENfTUFTSzsKIAl9CiAJaWYgKGhnIDwgLTEwMDApIHsKLQkJZGV2X2FsZXJ0KERFViwgIlRvIHJlc29sdmUgdGhpcyBib3RoIHNpZGVzIGhhdmUgdG8gc3VwcG9ydCBhdCBsZWFzdCBwcm90b2NvbCAlZFxuIiwgLWhnIC0gMTAwMCk7CisJCWRyYmRfYWxlcnQoZGV2aWNlLCAiVG8gcmVzb2x2ZSB0aGlzIGJvdGggc2lkZXMgaGF2ZSB0byBzdXBwb3J0IGF0IGxlYXN0IHByb3RvY29sICVkXG4iLCAtaGcgLSAxMDAwKTsKIAkJcmV0dXJuIENfTUFTSzsKIAl9CiAKQEAgLTI5NzMsMzggKzMwMTcsMzggQEAKIAkJaGcgPSBteWRpc2sgPiBEX0lOQ09OU0lTVEVOVCA/IDEgOiAtMTsKIAkJaWYgKGYpCiAJCQloZyA9IGhnKjI7Ci0JCWRldl9pbmZvKERFViwgIkJlY29taW5nIHN5bmMgJXMgZHVlIHRvIGRpc2sgc3RhdGVzLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIkJlY29taW5nIHN5bmMgJXMgZHVlIHRvIGRpc2sgc3RhdGVzLlxuIiwKIAkJICAgICBoZyA+IDAgPyAic291cmNlIiA6ICJ0YXJnZXQiKTsKIAl9CiAKIAlpZiAoYWJzKGhnKSA9PSAxMDApCi0JCWRyYmRfa2hlbHBlcihtZGV2LCAiaW5pdGlhbC1zcGxpdC1icmFpbiIpOworCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAiaW5pdGlhbC1zcGxpdC1icmFpbiIpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAogCWlmIChoZyA9PSAxMDAgfHwgKGhnID09IC0xMDAgJiYgbmMtPmFsd2F5c19hc2JwKSkgewotCQlpbnQgcGNvdW50ID0gKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpbnQgcGNvdW50ID0gKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpCiAJCQkgICArIChwZWVyX3JvbGUgPT0gUl9QUklNQVJZKTsKIAkJaW50IGZvcmNlZCA9IChoZyA9PSAtMTAwKTsKIAogCQlzd2l0Y2ggKHBjb3VudCkgewogCQljYXNlIDA6Ci0JCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8xcChtZGV2KTsKKwkJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8xcChwZWVyX2RldmljZSk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzJwKG1kZXYpOworCQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzJwKHBlZXJfZGV2aWNlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChhYnMoaGcpIDwgMTAwKSB7Ci0JCQlkZXZfd2FybihERVYsICJTcGxpdC1CcmFpbiBkZXRlY3RlZCwgJWQgcHJpbWFyaWVzLCAiCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQsICVkIHByaW1hcmllcywgIgogCQkJICAgICAiYXV0b21hdGljYWxseSBzb2x2ZWQuIFN5bmMgZnJvbSAlcyBub2RlXG4iLAogCQkJICAgICBwY291bnQsIChoZyA8IDApID8gInBlZXIiIDogInRoaXMiKTsKIAkJCWlmIChmb3JjZWQpIHsKLQkJCQlkZXZfd2FybihERVYsICJEb2luZyBhIGZ1bGwgc3luYywgc2luY2UiCisJCQkJZHJiZF93YXJuKGRldmljZSwgIkRvaW5nIGEgZnVsbCBzeW5jLCBzaW5jZSIKIAkJCQkgICAgICIgVVVJRHMgd2hlcmUgYW1iaWd1b3VzLlxuIik7CiAJCQkJaGcgPSBoZyoyOwogCQkJfQpAQCAtMzAxMiwxMyArMzA1NiwxMyBAQAogCX0KIAogCWlmIChoZyA9PSAtMTAwKSB7Ci0JCWlmICh0ZXN0X2JpdChESVNDQVJEX01ZX0RBVEEsICZtZGV2LT5mbGFncykgJiYgIShtZGV2LT5wX3V1aWRbVUlfRkxBR1NdJjEpKQorCQlpZiAodGVzdF9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncykgJiYgIShkZXZpY2UtPnBfdXVpZFtVSV9GTEFHU10mMSkpCiAJCQloZyA9IC0xOwotCQlpZiAoIXRlc3RfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKSAmJiAobWRldi0+cF91dWlkW1VJX0ZMQUdTXSYxKSkKKwkJaWYgKCF0ZXN0X2JpdChESVNDQVJEX01ZX0RBVEEsICZkZXZpY2UtPmZsYWdzKSAmJiAoZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdJjEpKQogCQkJaGcgPSAxOwogCiAJCWlmIChhYnMoaGcpIDwgMTAwKQotCQkJZGV2X3dhcm4oREVWLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQsIG1hbnVhbGx5IHNvbHZlZC4gIgorCQkJZHJiZF93YXJuKGRldmljZSwgIlNwbGl0LUJyYWluIGRldGVjdGVkLCBtYW51YWxseSBzb2x2ZWQuICIKIAkJCSAgICAgIlN5bmMgZnJvbSAlcyBub2RlXG4iLAogCQkJICAgICAoaGcgPCAwKSA/ICJwZWVyIiA6ICJ0aGlzIik7CiAJfQpAQCAtMzAzMSw0NCArMzA3NSw0NCBAQAogCQkgKiBhZnRlciBhbiBhdHRlbXB0ZWQgYXR0YWNoIG9uIGEgZGlza2xlc3Mgbm9kZS4KIAkJICogV2UganVzdCByZWZ1c2UgdG8gYXR0YWNoIC0tIHdlbGwsIHdlIGRyb3AgdGhlICJjb25uZWN0aW9uIgogCQkgKiB0byB0aGF0IGRpc2ssIGluIGEgd2F5Li4uICovCi0JCWRldl9hbGVydChERVYsICJTcGxpdC1CcmFpbiBkZXRlY3RlZCBidXQgdW5yZXNvbHZlZCwgZHJvcHBpbmcgY29ubmVjdGlvbiFcbiIpOwotCQlkcmJkX2toZWxwZXIobWRldiwgInNwbGl0LWJyYWluIik7CisJCWRyYmRfYWxlcnQoZGV2aWNlLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQgYnV0IHVucmVzb2x2ZWQsIGRyb3BwaW5nIGNvbm5lY3Rpb24hXG4iKTsKKwkJZHJiZF9raGVscGVyKGRldmljZSwgInNwbGl0LWJyYWluIik7CiAJCXJldHVybiBDX01BU0s7CiAJfQogCiAJaWYgKGhnID4gMCAmJiBteWRpc2sgPD0gRF9JTkNPTlNJU1RFTlQpIHsKLQkJZGV2X2VycihERVYsICJJIHNoYWxsIGJlY29tZSBTeW5jU291cmNlLCBidXQgSSBhbSBpbmNvbnNpc3RlbnQhXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiSSBzaGFsbCBiZWNvbWUgU3luY1NvdXJjZSwgYnV0IEkgYW0gaW5jb25zaXN0ZW50IVxuIik7CiAJCXJldHVybiBDX01BU0s7CiAJfQogCiAJaWYgKGhnIDwgMCAmJiAvKiBieSBpbnRlbnRpb24gd2UgZG8gbm90IHVzZSBteWRpc2sgaGVyZS4gKi8KLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYgbWRldi0+c3RhdGUuZGlzayA+PSBEX0NPTlNJU1RFTlQpIHsKKwkgICAgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSAmJiBkZXZpY2UtPnN0YXRlLmRpc2sgPj0gRF9DT05TSVNURU5UKSB7CiAJCXN3aXRjaCAocnJfY29uZmxpY3QpIHsKIAkJY2FzZSBBU0JfQ0FMTF9IRUxQRVI6Ci0JCQlkcmJkX2toZWxwZXIobWRldiwgInByaS1sb3N0Iik7CisJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLWxvc3QiKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIEFTQl9ESVNDT05ORUNUOgotCQkJZGV2X2VycihERVYsICJJIHNoYWxsIGJlY29tZSBTeW5jVGFyZ2V0LCBidXQgSSBhbSBwcmltYXJ5IVxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJJIHNoYWxsIGJlY29tZSBTeW5jVGFyZ2V0LCBidXQgSSBhbSBwcmltYXJ5IVxuIik7CiAJCQlyZXR1cm4gQ19NQVNLOwogCQljYXNlIEFTQl9WSU9MRU5UTFk6Ci0JCQlkZXZfd2FybihERVYsICJCZWNvbWluZyBTeW5jVGFyZ2V0LCB2aW9sYXRpbmcgdGhlIHN0YWJsZS1kYXRhIgorCQkJZHJiZF93YXJuKGRldmljZSwgIkJlY29taW5nIFN5bmNUYXJnZXQsIHZpb2xhdGluZyB0aGUgc3RhYmxlLWRhdGEiCiAJCQkgICAgICJhc3N1bXB0aW9uXG4iKTsKIAkJfQogCX0KIAotCWlmICh0ZW50YXRpdmUgfHwgdGVzdF9iaXQoQ09OTl9EUllfUlVOLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgeworCWlmICh0ZW50YXRpdmUgfHwgdGVzdF9iaXQoQ09OTl9EUllfUlVOLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkgewogCQlpZiAoaGcgPT0gMCkKLQkJCWRldl9pbmZvKERFViwgImRyeS1ydW4gY29ubmVjdDogTm8gcmVzeW5jLCB3b3VsZCBiZWNvbWUgQ29ubmVjdGVkIGltbWVkaWF0ZWx5LlxuIik7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiZHJ5LXJ1biBjb25uZWN0OiBObyByZXN5bmMsIHdvdWxkIGJlY29tZSBDb25uZWN0ZWQgaW1tZWRpYXRlbHkuXG4iKTsKIAkJZWxzZQotCQkJZGV2X2luZm8oREVWLCAiZHJ5LXJ1biBjb25uZWN0OiBXb3VsZCBiZWNvbWUgJXMsIGRvaW5nIGEgJXMgcmVzeW5jLiIsCisJCQlkcmJkX2luZm8oZGV2aWNlLCAiZHJ5LXJ1biBjb25uZWN0OiBXb3VsZCBiZWNvbWUgJXMsIGRvaW5nIGEgJXMgcmVzeW5jLiIsCiAJCQkJIGRyYmRfY29ubl9zdHIoaGcgPiAwID8gQ19TWU5DX1NPVVJDRSA6IENfU1lOQ19UQVJHRVQpLAogCQkJCSBhYnMoaGcpID49IDIgPyAiZnVsbCIgOiAiYml0LW1hcCBiYXNlZCIpOwogCQlyZXR1cm4gQ19NQVNLOwogCX0KIAogCWlmIChhYnMoaGcpID49IDIpIHsKLQkJZGV2X2luZm8oREVWLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBmdWxsIHN5bmMgcmVxdWlyZWQgYWZ0ZXIgZHJiZF9zeW5jX2hhbmRzaGFrZS5cbiIpOwotCQlpZiAoZHJiZF9iaXRtYXBfaW8obWRldiwgJmRyYmRfYm1pb19zZXRfbl93cml0ZSwgInNldF9uX3dyaXRlIGZyb20gc3luY19oYW5kc2hha2UiLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBmdWxsIHN5bmMgcmVxdWlyZWQgYWZ0ZXIgZHJiZF9zeW5jX2hhbmRzaGFrZS5cbiIpOworCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLCAic2V0X25fd3JpdGUgZnJvbSBzeW5jX2hhbmRzaGFrZSIsCiAJCQkJCUJNX0xPQ0tFRF9TRVRfQUxMT1dFRCkpCiAJCQlyZXR1cm4gQ19NQVNLOwogCX0KQEAgLTMwNzksOSArMzEyMyw5IEBACiAJCXJ2ID0gQ19XRl9CSVRNQVBfVDsKIAl9IGVsc2UgewogCQlydiA9IENfQ09OTkVDVEVEOwotCQlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpIHsKLQkJCWRldl9pbmZvKERFViwgIk5vIHJlc3luYywgYnV0ICVsdSBiaXRzIGluIGJpdG1hcCFcbiIsCi0JCQkgICAgIGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpKTsKKwkJaWYgKGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkpIHsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJObyByZXN5bmMsIGJ1dCAlbHUgYml0cyBpbiBiaXRtYXAhXG4iLAorCQkJICAgICBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpKTsKIAkJfQogCX0KIApAQCAtMzEwMiw3ICszMTQ2LDcgQEAKIAlyZXR1cm4gcGVlcjsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX3Byb3RvY29sKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXN0cnVjdCBwX3Byb3RvY29sICpwID0gcGktPmRhdGE7CiAJZW51bSBkcmJkX2FmdGVyX3NiX3AgcF9hZnRlcl9zYl8wcCwgcF9hZnRlcl9zYl8xcCwgcF9hZnRlcl9zYl8ycDsKQEAgLTMxMjAsNTggKzMxNjQsNTggQEAKIAljZgkJPSBiZTMyX3RvX2NwdShwLT5jb25uX2ZsYWdzKTsKIAlwX2Rpc2NhcmRfbXlfZGF0YSA9IGNmICYgQ0ZfRElTQ0FSRF9NWV9EQVRBOwogCi0JaWYgKHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODcpIHsKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg3KSB7CiAJCWludCBlcnI7CiAKIAkJaWYgKHBpLT5zaXplID4gc2l6ZW9mKGludGVncml0eV9hbGcpKQogCQkJcmV0dXJuIC1FSU87Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGwodGNvbm4sIGludGVncml0eV9hbGcsIHBpLT5zaXplKTsKKwkJZXJyID0gZHJiZF9yZWN2X2FsbChjb25uZWN0aW9uLCBpbnRlZ3JpdHlfYWxnLCBwaS0+c2l6ZSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCQlpbnRlZ3JpdHlfYWxnW1NIQVJFRF9TRUNSRVRfTUFYIC0gMV0gPSAwOwogCX0KIAogCWlmIChwaS0+Y21kICE9IFBfUFJPVE9DT0xfVVBEQVRFKSB7Ci0JCWNsZWFyX2JpdChDT05OX0RSWV9SVU4sICZ0Y29ubi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ09OTl9EUllfUlVOLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCiAJCWlmIChjZiAmIENGX0RSWV9SVU4pCi0JCQlzZXRfYml0KENPTk5fRFJZX1JVTiwgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KENPTk5fRFJZX1JVTiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAogCQlpZiAocF9wcm90byAhPSBuYy0+d2lyZV9wcm90b2NvbCkgewotCQkJY29ubl9lcnIodGNvbm4sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJwcm90b2NvbCIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgInByb3RvY29sIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChjb252ZXJ0X2FmdGVyX3NiKHBfYWZ0ZXJfc2JfMHApICE9IG5jLT5hZnRlcl9zYl8wcCkgewotCQkJY29ubl9lcnIodGNvbm4sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhZnRlci1zYi0wcHJpIik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiaW5jb21wYXRpYmxlICVzIHNldHRpbmdzXG4iLCAiYWZ0ZXItc2ItMHByaSIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIAogCQlpZiAoY29udmVydF9hZnRlcl9zYihwX2FmdGVyX3NiXzFwKSAhPSBuYy0+YWZ0ZXJfc2JfMXApIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAiaW5jb21wYXRpYmxlICVzIHNldHRpbmdzXG4iLCAiYWZ0ZXItc2ItMXByaSIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFmdGVyLXNiLTFwcmkiKTsKIAkJCWdvdG8gZGlzY29ubmVjdF9yY3VfdW5sb2NrOwogCQl9CiAKIAkJaWYgKGNvbnZlcnRfYWZ0ZXJfc2IocF9hZnRlcl9zYl8ycCkgIT0gbmMtPmFmdGVyX3NiXzJwKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFmdGVyLXNiLTJwcmkiKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhZnRlci1zYi0ycHJpIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChwX2Rpc2NhcmRfbXlfZGF0YSAmJiBuYy0+ZGlzY2FyZF9teV9kYXRhKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRpc2NhcmQtbXktZGF0YSIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRpc2NhcmQtbXktZGF0YSIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIAogCQlpZiAocF90d29fcHJpbWFyaWVzICE9IG5jLT50d29fcHJpbWFyaWVzKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFsbG93LXR3by1wcmltYXJpZXMiKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhbGxvdy10d28tcHJpbWFyaWVzIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChzdHJjbXAoaW50ZWdyaXR5X2FsZywgbmMtPmludGVncml0eV9hbGcpKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRhdGEtaW50ZWdyaXR5LWFsZyIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRhdGEtaW50ZWdyaXR5LWFsZyIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIApAQCAtMzE5Miw3ICszMjM2LDcgQEAKIAogCQlwZWVyX2ludGVncml0eV90Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaChpbnRlZ3JpdHlfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKIAkJaWYgKCFwZWVyX2ludGVncml0eV90Zm0pIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAicGVlciBkYXRhLWludGVncml0eS1hbGcgJXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJwZWVyIGRhdGEtaW50ZWdyaXR5LWFsZyAlcyBub3Qgc3VwcG9ydGVkXG4iLAogCQkJCSBpbnRlZ3JpdHlfYWxnKTsKIAkJCWdvdG8gZGlzY29ubmVjdDsKIAkJfQpAQCAtMzIwMSwyMCArMzI0NSwyMCBAQAogCQlpbnRfZGlnX2luID0ga21hbGxvYyhoYXNoX3NpemUsIEdGUF9LRVJORUwpOwogCQlpbnRfZGlnX3Z2ID0ga21hbGxvYyhoYXNoX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIShpbnRfZGlnX2luICYmIGludF9kaWdfdnYpKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIkFsbG9jYXRpb24gb2YgYnVmZmVycyBmb3IgZGF0YSBpbnRlZ3JpdHkgY2hlY2tpbmcgZmFpbGVkXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJBbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgZm9yIGRhdGEgaW50ZWdyaXR5IGNoZWNraW5nIGZhaWxlZFxuIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCX0KIAl9CiAKIAluZXdfbmV0X2NvbmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2NvbmYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19uZXRfY29uZikgewotCQljb25uX2Vycih0Y29ubiwgIkFsbG9jYXRpb24gb2YgbmV3IG5ldF9jb25mIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJBbGxvY2F0aW9uIG9mIG5ldyBuZXRfY29uZiBmYWlsZWRcbiIpOwogCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJfQogCi0JbXV0ZXhfbG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOwotCW11dGV4X2xvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0Jb2xkX25ldF9jb25mID0gdGNvbm4tPm5ldF9jb25mOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJb2xkX25ldF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CiAJKm5ld19uZXRfY29uZiA9ICpvbGRfbmV0X2NvbmY7CiAKIAluZXdfbmV0X2NvbmYtPndpcmVfcHJvdG9jb2wgPSBwX3Byb3RvOwpAQCAtMzIyMywxOSArMzI2NywxOSBAQAogCW5ld19uZXRfY29uZi0+YWZ0ZXJfc2JfMnAgPSBjb252ZXJ0X2FmdGVyX3NiKHBfYWZ0ZXJfc2JfMnApOwogCW5ld19uZXRfY29uZi0+dHdvX3ByaW1hcmllcyA9IHBfdHdvX3ByaW1hcmllczsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcih0Y29ubi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uZWN0aW9uLT5uZXRfY29uZiwgbmV3X25ldF9jb25mKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSk7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfaW4pOwotCWtmcmVlKHRjb25uLT5pbnRfZGlnX3Z2KTsKLQl0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gcGVlcl9pbnRlZ3JpdHlfdGZtOwotCXRjb25uLT5pbnRfZGlnX2luID0gaW50X2RpZ19pbjsKLQl0Y29ubi0+aW50X2RpZ192diA9IGludF9kaWdfdnY7CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pOworCWtmcmVlKGNvbm5lY3Rpb24tPmludF9kaWdfaW4pOworCWtmcmVlKGNvbm5lY3Rpb24tPmludF9kaWdfdnYpOworCWNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSA9IHBlZXJfaW50ZWdyaXR5X3RmbTsKKwljb25uZWN0aW9uLT5pbnRfZGlnX2luID0gaW50X2RpZ19pbjsKKwljb25uZWN0aW9uLT5pbnRfZGlnX3Z2ID0gaW50X2RpZ192djsKIAogCWlmIChzdHJjbXAob2xkX25ldF9jb25mLT5pbnRlZ3JpdHlfYWxnLCBpbnRlZ3JpdHlfYWxnKSkKLQkJY29ubl9pbmZvKHRjb25uLCAicGVlciBkYXRhLWludGVncml0eS1hbGc6ICVzXG4iLAorCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgInBlZXIgZGF0YS1pbnRlZ3JpdHktYWxnOiAlc1xuIiwKIAkJCSAgaW50ZWdyaXR5X2FsZ1swXSA/IGludGVncml0eV9hbGcgOiAiKG5vbmUpIik7CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKQEAgLTMyNDgsNyArMzI5Miw3IEBACiAJY3J5cHRvX2ZyZWVfaGFzaChwZWVyX2ludGVncml0eV90Zm0pOwogCWtmcmVlKGludF9kaWdfaW4pOwogCWtmcmVlKGludF9kaWdfdnYpOwotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0zMjU3LDcgKzMzMDEsOCBAQAogICogcmV0dXJuOiBOVUxMIChhbGcgbmFtZSB3YXMgIiIpCiAgKiAgICAgICAgIEVSUl9QVFIoZXJyb3IpIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgKiAgICAgICAgIG9yIHRoZSBjcnlwdG8gaGFzaCBwdHIsIGlmIGl0IHdvcmtlZCBvdXQgb2suICovCi1zdHJ1Y3QgY3J5cHRvX2hhc2ggKmRyYmRfY3J5cHRvX2FsbG9jX2RpZ2VzdF9zYWZlKGNvbnN0IHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMKK3N0cnVjdCBjcnlwdG9faGFzaCAqZHJiZF9jcnlwdG9fYWxsb2NfZGlnZXN0X3NhZmUoY29uc3Qgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IGNoYXIgKmFsZywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKQEAgLTMyNjcsMjEgKzMzMTIsMjEgQEAKIAogCXRmbSA9IGNyeXB0b19hbGxvY19oYXNoKGFsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUih0Zm0pKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG5vdCBhbGxvY2F0ZSBcIiVzXCIgYXMgJXMgKHJlYXNvbjogJWxkKVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ2FuIG5vdCBhbGxvY2F0ZSBcIiVzXCIgYXMgJXMgKHJlYXNvbjogJWxkKVxuIiwKIAkJCWFsZywgbmFtZSwgUFRSX0VSUih0Zm0pKTsKIAkJcmV0dXJuIHRmbTsKIAl9CiAJcmV0dXJuIHRmbTsKIH0KIAotc3RhdGljIGludCBpZ25vcmVfcmVtYWluaW5nX3BhY2tldChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jdm9pZCAqYnVmZmVyID0gdGNvbm4tPmRhdGEucmJ1ZjsKKwl2b2lkICpidWZmZXIgPSBjb25uZWN0aW9uLT5kYXRhLnJidWY7CiAJaW50IHNpemUgPSBwaS0+c2l6ZTsKIAogCXdoaWxlIChzaXplKSB7CiAJCWludCBzID0gbWluX3QoaW50LCBzaXplLCBEUkJEX1NPQ0tFVF9CVUZGRVJfU0laRSk7Ci0JCXMgPSBkcmJkX3JlY3YodGNvbm4sIGJ1ZmZlciwgcyk7CisJCXMgPSBkcmJkX3JlY3YoY29ubmVjdGlvbiwgYnVmZmVyLCBzKTsKIAkJaWYgKHMgPD0gMCkgewogCQkJaWYgKHMgPCAwKQogCQkJCXJldHVybiBzOwpAQCAtMzMwNSwzMCArMzM1MCwzMiBAQAogICoKICAqIChXZSBjYW4gYWxzbyBlbmQgdXAgaGVyZSBpZiBkcmJkIGlzIG1pc2NvbmZpZ3VyZWQuKQogICovCi1zdGF0aWMgaW50IGNvbmZpZ191bmtub3duX3ZvbHVtZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGNvbmZpZ191bmtub3duX3ZvbHVtZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCWNvbm5fd2Fybih0Y29ubiwgIiVzIHBhY2tldCByZWNlaXZlZCBmb3Igdm9sdW1lICV1LCB3aGljaCBpcyBub3QgY29uZmlndXJlZCBsb2NhbGx5XG4iLAorCWRyYmRfd2Fybihjb25uZWN0aW9uLCAiJXMgcGFja2V0IHJlY2VpdmVkIGZvciB2b2x1bWUgJXUsIHdoaWNoIGlzIG5vdCBjb25maWd1cmVkIGxvY2FsbHlcbiIsCiAJCSAgY21kbmFtZShwaS0+Y21kKSwgcGktPnZucik7Ci0JcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHRjb25uLCBwaSk7CisJcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KGNvbm5lY3Rpb24sIHBpKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1N5bmNQYXJhbShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfU3luY1BhcmFtKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IHBfcnNfcGFyYW1fOTUgKnA7CiAJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplLCBkYXRhX3NpemUsIGV4cF9tYXhfc3o7CiAJc3RydWN0IGNyeXB0b19oYXNoICp2ZXJpZnlfdGZtID0gTlVMTDsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmNzdW1zX3RmbSA9IE5VTEw7CiAJc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsICpuZXdfbmV0X2NvbmYgPSBOVUxMOwogCXN0cnVjdCBkaXNrX2NvbmYgKm9sZF9kaXNrX2NvbmYgPSBOVUxMLCAqbmV3X2Rpc2tfY29uZiA9IE5VTEw7Ci0JY29uc3QgaW50IGFwdiA9IHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb247CisJY29uc3QgaW50IGFwdiA9IGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbjsKIAlzdHJ1Y3QgZmlmb19idWZmZXIgKm9sZF9wbGFuID0gTlVMTCwgKm5ld19wbGFuID0gTlVMTDsKIAlpbnQgZmlmb19zaXplID0gMDsKIAlpbnQgZXJyOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCi0JCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUodGNvbm4sIHBpKTsKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKKwkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZShjb25uZWN0aW9uLCBwaSk7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCWV4cF9tYXhfc3ogID0gYXB2IDw9IDg3ID8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtKQogCQkgICAgOiBhcHYgPT0gODggPyBzaXplb2Yoc3RydWN0IHBfcnNfcGFyYW0pCkBAIC0zMzM3LDcgKzMzODQsNyBAQAogCQkgICAgOiAvKiBhcHYgPj0gOTUgKi8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtXzk1KTsKIAogCWlmIChwaS0+c2l6ZSA+IGV4cF9tYXhfc3opIHsKLQkJZGV2X2VycihERVYsICJTeW5jUGFyYW0gcGFja2V0IHRvbyBsb25nOiByZWNlaXZlZCAldSwgZXhwZWN0ZWQgPD0gJXUgYnl0ZXNcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIlN5bmNQYXJhbSBwYWNrZXQgdG9vIGxvbmc6IHJlY2VpdmVkICV1LCBleHBlY3RlZCA8PSAldSBieXRlc1xuIiwKIAkJICAgIHBpLT5zaXplLCBleHBfbWF4X3N6KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzM0OCwzMyArMzM5NSwzMyBAQAogCX0gZWxzZSBpZiAoYXB2IDw9IDk0KSB7CiAJCWhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtXzg5KTsKIAkJZGF0YV9zaXplID0gcGktPnNpemUgLSBoZWFkZXJfc2l6ZTsKLQkJRF9BU1NFUlQoZGF0YV9zaXplID09IDApOworCQlEX0FTU0VSVChkZXZpY2UsIGRhdGFfc2l6ZSA9PSAwKTsKIAl9IGVsc2UgewogCQloZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcF9yc19wYXJhbV85NSk7CiAJCWRhdGFfc2l6ZSA9IHBpLT5zaXplIC0gaGVhZGVyX3NpemU7Ci0JCURfQVNTRVJUKGRhdGFfc2l6ZSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkYXRhX3NpemUgPT0gMCk7CiAJfQogCiAJLyogaW5pdGlhbGl6ZSB2ZXJpZnlfYWxnIGFuZCBjc3Vtc19hbGcgKi8KIAlwID0gcGktPmRhdGE7CiAJbWVtc2V0KHAtPnZlcmlmeV9hbGcsIDAsIDIgKiBTSEFSRURfU0VDUkVUX01BWCk7CiAKLQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCBoZWFkZXJfc2l6ZSk7CisJZXJyID0gZHJiZF9yZWN2X2FsbChwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgcCwgaGVhZGVyX3NpemUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9uZXRfY29uZiA9IG1kZXYtPnRjb25uLT5uZXRfY29uZjsKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9uZXRfY29uZiA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZjsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQluZXdfZGlza19jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpc2tfY29uZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld19kaXNrX2NvbmYpIHsKLQkJCXB1dF9sZGV2KG1kZXYpOwotCQkJbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCQkJZGV2X2VycihERVYsICJBbGxvY2F0aW9uIG9mIG5ldyBkaXNrX2NvbmYgZmFpbGVkXG4iKTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCQlkcmJkX2VycihkZXZpY2UsICJBbGxvY2F0aW9uIG9mIG5ldyBkaXNrX2NvbmYgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJb2xkX2Rpc2tfY29uZiA9IG1kZXYtPmxkZXYtPmRpc2tfY29uZjsKKwkJb2xkX2Rpc2tfY29uZiA9IGRldmljZS0+bGRldi0+ZGlza19jb25mOwogCQkqbmV3X2Rpc2tfY29uZiA9ICpvbGRfZGlza19jb25mOwogCiAJCW5ld19kaXNrX2NvbmYtPnJlc3luY19yYXRlID0gYmUzMl90b19jcHUocC0+cmVzeW5jX3JhdGUpOwpAQCAtMzM4MywzNyArMzQzMCwzNyBAQAogCWlmIChhcHYgPj0gODgpIHsKIAkJaWYgKGFwdiA9PSA4OCkgewogCQkJaWYgKGRhdGFfc2l6ZSA+IFNIQVJFRF9TRUNSRVRfTUFYIHx8IGRhdGFfc2l6ZSA9PSAwKSB7Ci0JCQkJZGV2X2VycihERVYsICJ2ZXJpZnktYWxnIG9mIHdyb25nIHNpemUsICIKKwkJCQlkcmJkX2VycihkZXZpY2UsICJ2ZXJpZnktYWxnIG9mIHdyb25nIHNpemUsICIKIAkJCQkJInBlZXIgd2FudHMgJXUsIGFjY2VwdGluZyBvbmx5IHVwIHRvICV1IGJ5dGVcbiIsCiAJCQkJCWRhdGFfc2l6ZSwgU0hBUkVEX1NFQ1JFVF9NQVgpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9CiAKLQkJCWVyciA9IGRyYmRfcmVjdl9hbGwobWRldi0+dGNvbm4sIHAtPnZlcmlmeV9hbGcsIGRhdGFfc2l6ZSk7CisJCQllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLT52ZXJpZnlfYWxnLCBkYXRhX3NpemUpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCS8qIHdlIGV4cGVjdCBOVUwgdGVybWluYXRlZCBzdHJpbmcgKi8KIAkJCS8qIGJ1dCBqdXN0IGluIGNhc2Ugc29tZW9uZSB0cmllcyB0byBiZSBldmlsICovCi0JCQlEX0FTU0VSVChwLT52ZXJpZnlfYWxnW2RhdGFfc2l6ZS0xXSA9PSAwKTsKKwkJCURfQVNTRVJUKGRldmljZSwgcC0+dmVyaWZ5X2FsZ1tkYXRhX3NpemUtMV0gPT0gMCk7CiAJCQlwLT52ZXJpZnlfYWxnW2RhdGFfc2l6ZS0xXSA9IDA7CiAKIAkJfSBlbHNlIC8qIGFwdiA+PSA4OSAqLyB7CiAJCQkvKiB3ZSBzdGlsbCBleHBlY3QgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncyAqLwogCQkJLyogYnV0IGp1c3QgaW4gY2FzZSBzb21lb25lIHRyaWVzIHRvIGJlIGV2aWwgKi8KLQkJCURfQVNTRVJUKHAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7Ci0JCQlEX0FTU0VSVChwLT5jc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7CisJCQlEX0FTU0VSVChkZXZpY2UsIHAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7CisJCQlEX0FTU0VSVChkZXZpY2UsIHAtPmNzdW1zX2FsZ1tTSEFSRURfU0VDUkVUX01BWC0xXSA9PSAwKTsKIAkJCXAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPSAwOwogCQkJcC0+Y3N1bXNfYWxnW1NIQVJFRF9TRUNSRVRfTUFYLTFdID0gMDsKIAkJfQogCiAJCWlmIChzdHJjbXAob2xkX25ldF9jb25mLT52ZXJpZnlfYWxnLCBwLT52ZXJpZnlfYWxnKSkgewotCQkJaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCQkJZGV2X2VycihERVYsICJEaWZmZXJlbnQgdmVyaWZ5LWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAorCQkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJEaWZmZXJlbnQgdmVyaWZ5LWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAogCQkJCSAgICBvbGRfbmV0X2NvbmYtPnZlcmlmeV9hbGcsIHAtPnZlcmlmeV9hbGcpOwogCQkJCWdvdG8gZGlzY29ubmVjdDsKIAkJCX0KLQkJCXZlcmlmeV90Zm0gPSBkcmJkX2NyeXB0b19hbGxvY19kaWdlc3Rfc2FmZShtZGV2LAorCQkJdmVyaWZ5X3RmbSA9IGRyYmRfY3J5cHRvX2FsbG9jX2RpZ2VzdF9zYWZlKGRldmljZSwKIAkJCQkJcC0+dmVyaWZ5X2FsZywgInZlcmlmeS1hbGciKTsKIAkJCWlmIChJU19FUlIodmVyaWZ5X3RmbSkpIHsKIAkJCQl2ZXJpZnlfdGZtID0gTlVMTDsKQEAgLTM0MjIsMTIgKzM0NjksMTIgQEAKIAkJfQogCiAJCWlmIChhcHYgPj0gODkgJiYgc3RyY21wKG9sZF9uZXRfY29uZi0+Y3N1bXNfYWxnLCBwLT5jc3Vtc19hbGcpKSB7Ci0JCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKLQkJCQlkZXZfZXJyKERFViwgIkRpZmZlcmVudCBjc3Vtcy1hbGcgc2V0dGluZ3MuIG1lPVwiJXNcIiBwZWVyPVwiJXNcIlxuIiwKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRGlmZmVyZW50IGNzdW1zLWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAogCQkJCSAgICBvbGRfbmV0X2NvbmYtPmNzdW1zX2FsZywgcC0+Y3N1bXNfYWxnKTsKIAkJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCQl9Ci0JCQljc3Vtc190Zm0gPSBkcmJkX2NyeXB0b19hbGxvY19kaWdlc3Rfc2FmZShtZGV2LAorCQkJY3N1bXNfdGZtID0gZHJiZF9jcnlwdG9fYWxsb2NfZGlnZXN0X3NhZmUoZGV2aWNlLAogCQkJCQlwLT5jc3Vtc19hbGcsICJjc3Vtcy1hbGciKTsKIAkJCWlmIChJU19FUlIoY3N1bXNfdGZtKSkgewogCQkJCWNzdW1zX3RmbSA9IE5VTEw7CkBAIC0zNDQyLDExICszNDg5LDExIEBACiAJCQluZXdfZGlza19jb25mLT5jX21heF9yYXRlID0gYmUzMl90b19jcHUocC0+Y19tYXhfcmF0ZSk7CiAKIAkJCWZpZm9fc2l6ZSA9IChuZXdfZGlza19jb25mLT5jX3BsYW5fYWhlYWQgKiAxMCAqIFNMRUVQX1RJTUUpIC8gSFo7Ci0JCQlpZiAoZmlmb19zaXplICE9IG1kZXYtPnJzX3BsYW5fcy0+c2l6ZSkgeworCQkJaWYgKGZpZm9fc2l6ZSAhPSBkZXZpY2UtPnJzX3BsYW5fcy0+c2l6ZSkgewogCQkJCW5ld19wbGFuID0gZmlmb19hbGxvYyhmaWZvX3NpemUpOwogCQkJCWlmICghbmV3X3BsYW4pIHsKLQkJCQkJZGV2X2VycihERVYsICJrbWFsbG9jIG9mIGZpZm9fYnVmZmVyIGZhaWxlZCIpOwotCQkJCQlwdXRfbGRldihtZGV2KTsKKwkJCQkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYyBvZiBmaWZvX2J1ZmZlciBmYWlsZWQiKTsKKwkJCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCQkJZ290byBkaXNjb25uZWN0OwogCQkJCX0KIAkJCX0KQEAgLTM0NTUsNyArMzUwMiw3IEBACiAJCWlmICh2ZXJpZnlfdGZtIHx8IGNzdW1zX3RmbSkgewogCQkJbmV3X25ldF9jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19uZXRfY29uZikgewotCQkJCWRldl9lcnIoREVWLCAiQWxsb2NhdGlvbiBvZiBuZXcgbmV0X2NvbmYgZmFpbGVkXG4iKTsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJBbGxvY2F0aW9uIG9mIG5ldyBuZXRfY29uZiBmYWlsZWRcbiIpOwogCQkJCWdvdG8gZGlzY29ubmVjdDsKIAkJCX0KIApAQCAtMzQ2NCwzMiArMzUxMSwzMiBAQAogCQkJaWYgKHZlcmlmeV90Zm0pIHsKIAkJCQlzdHJjcHkobmV3X25ldF9jb25mLT52ZXJpZnlfYWxnLCBwLT52ZXJpZnlfYWxnKTsKIAkJCQluZXdfbmV0X2NvbmYtPnZlcmlmeV9hbGdfbGVuID0gc3RybGVuKHAtPnZlcmlmeV9hbGcpICsgMTsKLQkJCQljcnlwdG9fZnJlZV9oYXNoKG1kZXYtPnRjb25uLT52ZXJpZnlfdGZtKTsKLQkJCQltZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSA9IHZlcmlmeV90Zm07Ci0JCQkJZGV2X2luZm8oREVWLCAidXNpbmcgdmVyaWZ5LWFsZzogXCIlc1wiXG4iLCBwLT52ZXJpZnlfYWxnKTsKKwkJCQljcnlwdG9fZnJlZV9oYXNoKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT52ZXJpZnlfdGZtKTsKKwkJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IHZlcmlmeV90Zm07CisJCQkJZHJiZF9pbmZvKGRldmljZSwgInVzaW5nIHZlcmlmeS1hbGc6IFwiJXNcIlxuIiwgcC0+dmVyaWZ5X2FsZyk7CiAJCQl9CiAJCQlpZiAoY3N1bXNfdGZtKSB7CiAJCQkJc3RyY3B5KG5ld19uZXRfY29uZi0+Y3N1bXNfYWxnLCBwLT5jc3Vtc19hbGcpOwogCQkJCW5ld19uZXRfY29uZi0+Y3N1bXNfYWxnX2xlbiA9IHN0cmxlbihwLT5jc3Vtc19hbGcpICsgMTsKLQkJCQljcnlwdG9fZnJlZV9oYXNoKG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pOwotCQkJCW1kZXYtPnRjb25uLT5jc3Vtc190Zm0gPSBjc3Vtc190Zm07Ci0JCQkJZGV2X2luZm8oREVWLCAidXNpbmcgY3N1bXMtYWxnOiBcIiVzXCJcbiIsIHAtPmNzdW1zX2FsZyk7CisJCQkJY3J5cHRvX2ZyZWVfaGFzaChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtID0gY3N1bXNfdGZtOworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJ1c2luZyBjc3Vtcy1hbGc6IFwiJXNcIlxuIiwgcC0+Y3N1bXNfYWxnKTsKIAkJCX0KLQkJCXJjdV9hc3NpZ25fcG9pbnRlcih0Y29ubi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoY29ubmVjdGlvbi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7CiAJCX0KIAl9CiAKIAlpZiAobmV3X2Rpc2tfY29uZikgewotCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJaWYgKG5ld19wbGFuKSB7Ci0JCW9sZF9wbGFuID0gbWRldi0+cnNfcGxhbl9zOwotCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+cnNfcGxhbl9zLCBuZXdfcGxhbik7CisJCW9sZF9wbGFuID0gZGV2aWNlLT5yc19wbGFuX3M7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPnJzX3BsYW5fcywgbmV3X3BsYW4pOwogCX0KIAotCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJc3luY2hyb25pemVfcmN1KCk7CiAJaWYgKG5ld19uZXRfY29uZikKIAkJa2ZyZWUob2xkX25ldF9jb25mKTsKQEAgLTM1MDAsMzAgKzM1NDcsMzAgQEAKIAogcmVjb25uZWN0OgogCWlmIChuZXdfZGlza19jb25mKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlrZnJlZShuZXdfZGlza19jb25mKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAlyZXR1cm4gLUVJTzsKIAogZGlzY29ubmVjdDoKIAlrZnJlZShuZXdfcGxhbik7CiAJaWYgKG5ld19kaXNrX2NvbmYpIHsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWtmcmVlKG5ld19kaXNrX2NvbmYpOwogCX0KLQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCS8qIGp1c3QgZm9yIGNvbXBsZXRlbmVzczogYWN0dWFsbHkgbm90IG5lZWRlZCwKIAkgKiBhcyB0aGlzIGlzIG5vdCByZWFjaGVkIGlmIGNzdW1zX3RmbSB3YXMgb2suICovCiAJY3J5cHRvX2ZyZWVfaGFzaChjc3Vtc190Zm0pOwogCS8qIGJ1dCBmcmVlIHRoZSB2ZXJpZnlfdGZtIGFnYWluLCBpZiBjc3Vtc190Zm0gZGlkIG5vdCB3b3JrIG91dCAqLwogCWNyeXB0b19mcmVlX2hhc2godmVyaWZ5X3RmbSk7Ci0JY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCiAvKiB3YXJuIGlmIHRoZSBhcmd1bWVudHMgZGlmZmVyIGJ5IG1vcmUgdGhhbiAxMi41JSAqLwotc3RhdGljIHZvaWQgd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCB3YXJuX2lmX2RpZmZlcl9jb25zaWRlcmFibHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJY29uc3QgY2hhciAqcywgc2VjdG9yX3QgYSwgc2VjdG9yX3QgYikKIHsKIAlzZWN0b3JfdCBkOwpAQCAtMzUzMSw1NCArMzU3OCw1NiBAQAogCQlyZXR1cm47CiAJZCA9IChhID4gYikgPyAoYSAtIGIpIDogKGIgLSBhKTsKIAlpZiAoZCA+IChhPj4zKSB8fCBkID4gKGI+PjMpKQotCQlkZXZfd2FybihERVYsICJDb25zaWRlcmFibGUgZGlmZmVyZW5jZSBpbiAlczogJWxsdXMgdnMuICVsbHVzXG4iLCBzLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiQ29uc2lkZXJhYmxlIGRpZmZlcmVuY2UgaW4gJXM6ICVsbHVzIHZzLiAlbGx1c1xuIiwgcywKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWEsICh1bnNpZ25lZCBsb25nIGxvbmcpYik7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9zaXplcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfc2l6ZXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9zaXplcyAqcCA9IHBpLT5kYXRhOwogCWVudW0gZGV0ZXJtaW5lX2Rldl9zaXplIGRkID0gRFNfVU5DSEFOR0VEOwogCXNlY3Rvcl90IHBfc2l6ZSwgcF91c2l6ZSwgbXlfdXNpemU7CiAJaW50IGxkc2MgPSAwOyAvKiBsb2NhbCBkaXNrIHNpemUgY2hhbmdlZCAqLwogCWVudW0gZGRzX2ZsYWdzIGRkc2Y7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKLQkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZSh0Y29ubiwgcGkpOworCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQorCQlyZXR1cm4gY29uZmlnX3Vua25vd25fdm9sdW1lKGNvbm5lY3Rpb24sIHBpKTsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJcF9zaXplID0gYmU2NF90b19jcHUocC0+ZF9zaXplKTsKIAlwX3VzaXplID0gYmU2NF90b19jcHUocC0+dV9zaXplKTsKIAogCS8qIGp1c3Qgc3RvcmUgdGhlIHBlZXIncyBkaXNrIHNpemUgZm9yIG5vdy4KIAkgKiB3ZSBzdGlsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBhY2NlcHQgdGhhdC4gKi8KLQltZGV2LT5wX3NpemUgPSBwX3NpemU7CisJZGV2aWNlLT5wX3NpemUgPSBwX3NpemU7CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW15X3VzaXplID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmRpc2tfc2l6ZTsKKwkJbXlfdXNpemUgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCXdhcm5faWZfZGlmZmVyX2NvbnNpZGVyYWJseShtZGV2LCAibG93ZXIgbGV2ZWwgZGV2aWNlIHNpemVzIiwKLQkJCSAgIHBfc2l6ZSwgZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG1kZXYtPmxkZXYpKTsKLQkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KG1kZXYsICJ1c2VyIHJlcXVlc3RlZCBzaXplIiwKKwkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KGRldmljZSwgImxvd2VyIGxldmVsIGRldmljZSBzaXplcyIsCisJCQkgICBwX3NpemUsIGRyYmRfZ2V0X21heF9jYXBhY2l0eShkZXZpY2UtPmxkZXYpKTsKKwkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KGRldmljZSwgInVzZXIgcmVxdWVzdGVkIHNpemUiLAogCQkJCQkgICAgcF91c2l6ZSwgbXlfdXNpemUpOwogCiAJCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNvbm5lY3QsIG9yIGFuIG90aGVyd2lzZSBleHBlY3RlZAogCQkgKiBwYXJhbSBleGNoYW5nZSwgY2hvb3NlIHRoZSBtaW5pbXVtICovCi0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCiAJCQlwX3VzaXplID0gbWluX25vdF96ZXJvKG15X3VzaXplLCBwX3VzaXplKTsKIAogCQkvKiBOZXZlciBzaHJpbmsgYSBkZXZpY2Ugd2l0aCB1c2FibGUgZGF0YSBkdXJpbmcgY29ubmVjdC4KIAkJICAgQnV0IGFsbG93IG9ubGluZSBzaHJpbmtpbmcgaWYgd2UgYXJlIGNvbm5lY3RlZC4gKi8KLQkJaWYgKGRyYmRfbmV3X2Rldl9zaXplKG1kZXYsIG1kZXYtPmxkZXYsIHBfdXNpemUsIDApIDwKLQkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgJiYKLQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9PVVREQVRFRCAmJgotCQkgICAgbWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7Ci0JCQlkZXZfZXJyKERFViwgIlRoZSBwZWVyJ3MgZGlzayBzaXplIGlzIHRvbyBzbWFsbCFcbiIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQlpZiAoZHJiZF9uZXdfZGV2X3NpemUoZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHBfdXNpemUsIDApIDwKKwkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSAmJgorCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfT1VUREFURUQgJiYKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7CisJCQlkcmJkX2VycihkZXZpY2UsICJUaGUgcGVlcidzIGRpc2sgc2l6ZSBpcyB0b28gc21hbGwhXG4iKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIApAQCAtMzU4NywxNDUgKzM2MzYsMTQ3IEBACiAKIAkJCW5ld19kaXNrX2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19jb25mKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19kaXNrX2NvbmYpIHsKLQkJCQlkZXZfZXJyKERFViwgIkFsbG9jYXRpb24gb2YgbmV3IGRpc2tfY29uZiBmYWlsZWRcbiIpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCWRyYmRfZXJyKGRldmljZSwgIkFsbG9jYXRpb24gb2YgbmV3IGRpc2tfY29uZiBmYWlsZWRcbiIpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAKLQkJCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JCQlvbGRfZGlza19jb25mID0gbWRldi0+bGRldi0+ZGlza19jb25mOworCQkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwkJCW9sZF9kaXNrX2NvbmYgPSBkZXZpY2UtPmxkZXYtPmRpc2tfY29uZjsKIAkJCSpuZXdfZGlza19jb25mID0gKm9sZF9kaXNrX2NvbmY7CiAJCQluZXdfZGlza19jb25mLT5kaXNrX3NpemUgPSBwX3VzaXplOwogCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKLQkJCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCQltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJCWtmcmVlKG9sZF9kaXNrX2NvbmYpOwogCi0JCQlkZXZfaW5mbyhERVYsICJQZWVyIHNldHMgdV9zaXplIHRvICVsdSBzZWN0b3JzXG4iLAorCQkJZHJiZF9pbmZvKGRldmljZSwgIlBlZXIgc2V0cyB1X3NpemUgdG8gJWx1IHNlY3RvcnNcbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nKW15X3VzaXplKTsKIAkJfQogCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWRkc2YgPSBiZTE2X3RvX2NwdShwLT5kZHNfZmxhZ3MpOwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIGRkc2YsIE5VTEwpOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKGRldmljZSwgZGRzZiwgTlVMTCk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmIChkZCA9PSBEU19FUlJPUikKIAkJCXJldHVybiAtRUlPOwotCQlkcmJkX21kX3N5bmMobWRldik7CisJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCX0gZWxzZSB7CiAJCS8qIEkgYW0gZGlza2xlc3MsIG5lZWQgdG8gYWNjZXB0IHRoZSBwZWVyJ3Mgc2l6ZS4gKi8KLQkJZHJiZF9zZXRfbXlfY2FwYWNpdHkobWRldiwgcF9zaXplKTsKKwkJZHJiZF9zZXRfbXlfY2FwYWNpdHkoZGV2aWNlLCBwX3NpemUpOwogCX0KIAotCW1kZXYtPnBlZXJfbWF4X2Jpb19zaXplID0gYmUzMl90b19jcHUocC0+bWF4X2Jpb19zaXplKTsKLQlkcmJkX3JlY29uc2lkZXJfbWF4X2Jpb19zaXplKG1kZXYpOworCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBiZTMyX3RvX2NwdShwLT5tYXhfYmlvX3NpemUpOworCWRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoZGV2aWNlKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlpZiAobWRldi0+bGRldi0+a25vd25fc2l6ZSAhPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYpKSB7Ci0JCQltZGV2LT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplICE9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2KSkgeworCQkJZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCQkJbGRzYyA9IDE7CiAJCX0KIAotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPiBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKIAkJaWYgKGJlNjRfdG9fY3B1KHAtPmNfc2l6ZSkgIT0KLQkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgfHwgbGRzYykgeworCQkgICAgZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpIHx8IGxkc2MpIHsKIAkJCS8qIHdlIGhhdmUgZGlmZmVyZW50IHNpemVzLCBwcm9iYWJseSBwZWVyCiAJCQkgKiBuZWVkcyB0byBrbm93IG15IG5ldyBzaXplLi4uICovCi0JCQlkcmJkX3NlbmRfc2l6ZXMobWRldiwgMCwgZGRzZik7CisJCQlkcmJkX3NlbmRfc2l6ZXMocGVlcl9kZXZpY2UsIDAsIGRkc2YpOwogCQl9Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTSVpFX1BFTkRJTkcsICZtZGV2LT5mbGFncykgfHwKLQkJICAgIChkZCA9PSBEU19HUkVXICYmIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpKSB7Ci0JCQlpZiAobWRldi0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCAmJgotCQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNJWkVfUEVORElORywgJmRldmljZS0+ZmxhZ3MpIHx8CisJCSAgICAoZGQgPT0gRFNfR1JFVyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpKSB7CisJCQlpZiAoZGV2aWNlLT5zdGF0ZS5wZHNrID49IERfSU5DT05TSVNURU5UICYmCisJCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfSU5DT05TSVNURU5UKSB7CiAJCQkJaWYgKGRkc2YgJiBERFNGX05PX1JFU1lOQykKLQkJCQkJZGV2X2luZm8oREVWLCAiUmVzeW5jIG9mIG5ldyBzdG9yYWdlIHN1cHByZXNzZWQgd2l0aCAtLWFzc3VtZS1jbGVhblxuIik7CisJCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXN5bmMgb2YgbmV3IHN0b3JhZ2Ugc3VwcHJlc3NlZCB3aXRoIC0tYXNzdW1lLWNsZWFuXG4iKTsKIAkJCQllbHNlCi0JCQkJCXJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhtZGV2KTsKKwkJCQkJcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KGRldmljZSk7CiAJCQl9IGVsc2UKLQkJCQlzZXRfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZtZGV2LT5mbGFncyk7CisJCQkJc2V0X2JpdChSRVNZTkNfQUZURVJfTkVHLCAmZGV2aWNlLT5mbGFncyk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX3V1aWRzKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV91dWlkcyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX3V1aWRzICpwID0gcGktPmRhdGE7CiAJdTY0ICpwX3V1aWQ7CiAJaW50IGksIHVwZGF0ZWRfdXVpZHMgPSAwOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCi0JCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUodGNvbm4sIHBpKTsKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKKwkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZShjb25uZWN0aW9uLCBwaSk7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXBfdXVpZCA9IGttYWxsb2Moc2l6ZW9mKHU2NCkqVUlfRVhURU5ERURfU0laRSwgR0ZQX05PSU8pOwogCWlmICghcF91dWlkKSB7Ci0JCWRldl9lcnIoREVWLCAia21hbGxvYyBvZiBwX3V1aWQgZmFpbGVkXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYyBvZiBwX3V1aWQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWZvciAoaSA9IFVJX0NVUlJFTlQ7IGkgPCBVSV9FWFRFTkRFRF9TSVpFOyBpKyspCiAJCXBfdXVpZFtpXSA9IGJlNjRfdG9fY3B1KHAtPnV1aWRbaV0pOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQltZGV2LT5wX3V1aWQgPSBwX3V1aWQ7CisJa2ZyZWUoZGV2aWNlLT5wX3V1aWQpOworCWRldmljZS0+cF91dWlkID0gcF91dWlkOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJgotCSAgICBtZGV2LT5zdGF0ZS5kaXNrIDwgRF9JTkNPTlNJU1RFTlQgJiYKLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKLQkgICAgKG1kZXYtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChwX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG9ubHkgY29ubmVjdCB0byBkYXRhIHdpdGggY3VycmVudCBVVUlEPSUwMTZsbFhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW1kZXYtPmVkX3V1aWQpOwotCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJgorCSAgICBkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCAmJgorCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmCisJICAgIChkZXZpY2UtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChwX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7CisJCWRyYmRfZXJyKGRldmljZSwgIkNhbiBvbmx5IGNvbm5lY3QgdG8gZGF0YSB3aXRoIGN1cnJlbnQgVVVJRD0lMDE2bGxYXG4iLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPmVkX3V1aWQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlpbnQgc2tpcF9pbml0aWFsX3N5bmMgPQotCQkJbWRldi0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgotCQkJbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5MCAmJgotCQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJgorCQkJZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEICYmCisJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDkwICYmCisJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gPT0gVVVJRF9KVVNUX0NSRUFURUQgJiYKIAkJCShwX3V1aWRbVUlfRkxBR1NdICYgOCk7CiAJCWlmIChza2lwX2luaXRpYWxfc3luYykgewotCQkJZGV2X2luZm8oREVWLCAiQWNjZXB0ZWQgbmV3IGN1cnJlbnQgVVVJRCwgcHJlcGFyaW5nIHRvIHNraXAgaW5pdGlhbCBzeW5jXG4iKTsKLQkJCWRyYmRfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtaW9fY2xlYXJfbl93cml0ZSwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJBY2NlcHRlZCBuZXcgY3VycmVudCBVVUlELCBwcmVwYXJpbmcgdG8gc2tpcCBpbml0aWFsIHN5bmNcbiIpOworCQkJZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUsCiAJCQkJCSJjbGVhcl9uX3dyaXRlIGZyb20gcmVjZWl2ZV91dWlkcyIsCiAJCQkJCUJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwotCQkJX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfQ1VSUkVOVCwgcF91dWlkW1VJX0NVUlJFTlRdKTsKLQkJCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0JJVE1BUCwgMCk7Ci0JCQlfZHJiZF9zZXRfc3RhdGUoX05TMihtZGV2LCBkaXNrLCBEX1VQX1RPX0RBVEUsIHBkc2ssIERfVVBfVE9fREFURSksCisJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0NVUlJFTlQsIHBfdXVpZFtVSV9DVVJSRU5UXSk7CisJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMCk7CisJCQlfZHJiZF9zZXRfc3RhdGUoX05TMihkZXZpY2UsIGRpc2ssIERfVVBfVE9fREFURSwgcGRzaywgRF9VUF9UT19EQVRFKSwKIAkJCQkJQ1NfVkVSQk9TRSwgTlVMTCk7Ci0JCQlkcmJkX21kX3N5bmMobWRldik7CisJCQlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAkJCXVwZGF0ZWRfdXVpZHMgPSAxOwogCQl9Ci0JCXB1dF9sZGV2KG1kZXYpOwotCX0gZWxzZSBpZiAobWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UICYmCi0JCSAgIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CisJCXB1dF9sZGV2KGRldmljZSk7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCAmJgorCQkgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCS8qIEkgYW0gYSBkaXNrbGVzcyBwcmltYXJ5LCB0aGUgcGVlciBqdXN0IGNyZWF0ZWQgYSBuZXcgY3VycmVudCBVVUlECiAJCSAgIGZvciBtZS4gKi8KLQkJdXBkYXRlZF91dWlkcyA9IGRyYmRfc2V0X2VkX3V1aWQobWRldiwgcF91dWlkW1VJX0NVUlJFTlRdKTsKKwkJdXBkYXRlZF91dWlkcyA9IGRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBwX3V1aWRbVUlfQ1VSUkVOVF0pOwogCX0KIAogCS8qIEJlZm9yZSB3ZSB0ZXN0IGZvciB0aGUgZGlzayBzdGF0ZSwgd2Ugc2hvdWxkIHdhaXQgdW50aWwgYW4gZXZlbnR1YWxseQogCSAgIG9uZ29pbmcgY2x1c3RlciB3aWRlIHN0YXRlIGNoYW5nZSBpcyBmaW5pc2hlZC4gVGhhdCBpcyBpbXBvcnRhbnQgaWYKIAkgICB3ZSBhcmUgcHJpbWFyeSBhbmQgYXJlIGRldGFjaGluZyBmcm9tIG91ciBkaXNrLiBXZSBuZWVkIHRvIHNlZSB0aGUKIAkgICBuZXcgZGlzayBzdGF0ZS4uLiAqLwotCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOwotCW11dGV4X3VubG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19DT05ORUNURUQgJiYgbWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKQotCQl1cGRhdGVkX3V1aWRzIHw9IGRyYmRfc2V0X2VkX3V1aWQobWRldiwgcF91dWlkW1VJX0NVUlJFTlRdKTsKKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOworCW11dGV4X3VubG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEICYmIGRldmljZS0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKQorCQl1cGRhdGVkX3V1aWRzIHw9IGRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBwX3V1aWRbVUlfQ1VSUkVOVF0pOwogCiAJaWYgKHVwZGF0ZWRfdXVpZHMpCi0JCWRyYmRfcHJpbnRfdXVpZHMobWRldiwgInJlY2VpdmVyIHVwZGF0ZWQgVVVJRHMgdG8iKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJyZWNlaXZlciB1cGRhdGVkIFVVSURzIHRvIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM3NjEsMzggKzM4MTIsNDAgQEAKIAlyZXR1cm4gbXM7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9yZXFfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX3JlcV9zdGF0ZSAqcCA9IHBpLT5kYXRhOwogCXVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdmFsOwogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJbWFzay5pID0gYmUzMl90b19jcHUocC0+bWFzayk7CiAJdmFsLmkgPSBiZTMyX3RvX2NwdShwLT52YWwpOwogCi0JaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSAmJgotCSAgICBtdXRleF9pc19sb2NrZWQobWRldi0+c3RhdGVfbXV0ZXgpKSB7Ci0JCWRyYmRfc2VuZF9zcl9yZXBseShtZGV2LCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSAmJgorCSAgICBtdXRleF9pc19sb2NrZWQoZGV2aWNlLT5zdGF0ZV9tdXRleCkpIHsKKwkJZHJiZF9zZW5kX3NyX3JlcGx5KHBlZXJfZGV2aWNlLCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CiAJCXJldHVybiAwOwogCX0KIAogCW1hc2sgPSBjb252ZXJ0X3N0YXRlKG1hc2spOwogCXZhbCA9IGNvbnZlcnRfc3RhdGUodmFsKTsKIAotCXJ2ID0gZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfVkVSQk9TRSwgbWFzaywgdmFsKTsKLQlkcmJkX3NlbmRfc3JfcmVwbHkobWRldiwgcnYpOworCXJ2ID0gZHJiZF9jaGFuZ2Vfc3RhdGUoZGV2aWNlLCBDU19WRVJCT1NFLCBtYXNrLCB2YWwpOworCWRyYmRfc2VuZF9zcl9yZXBseShwZWVyX2RldmljZSwgcnYpOwogCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9yZXFfY29ubl9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfcmVxX2Nvbm5fc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGUgKnAgPSBwaS0+ZGF0YTsKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHZhbDsKQEAgLTM4MDEsNDYgKzM4NTQsNDggQEAKIAltYXNrLmkgPSBiZTMyX3RvX2NwdShwLT5tYXNrKTsKIAl2YWwuaSA9IGJlMzJfdG9fY3B1KHAtPnZhbCk7CiAKLQlpZiAodGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZ0Y29ubi0+ZmxhZ3MpICYmCi0JICAgIG11dGV4X2lzX2xvY2tlZCgmdGNvbm4tPmNzdGF0ZV9tdXRleCkpIHsKLQkJY29ubl9zZW5kX3NyX3JlcGx5KHRjb25uLCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmY29ubmVjdGlvbi0+ZmxhZ3MpICYmCisJICAgIG11dGV4X2lzX2xvY2tlZCgmY29ubmVjdGlvbi0+Y3N0YXRlX211dGV4KSkgeworCQljb25uX3NlbmRfc3JfcmVwbHkoY29ubmVjdGlvbiwgU1NfQ09OQ1VSUkVOVF9TVF9DSEcpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltYXNrID0gY29udmVydF9zdGF0ZShtYXNrKTsKIAl2YWwgPSBjb252ZXJ0X3N0YXRlKHZhbCk7CiAKLQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgbWFzaywgdmFsLCBDU19WRVJCT1NFIHwgQ1NfTE9DQUxfT05MWSB8IENTX0lHTl9PVVREX0ZBSUwpOwotCWNvbm5fc2VuZF9zcl9yZXBseSh0Y29ubiwgcnYpOworCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSB8IENTX0xPQ0FMX09OTFkgfCBDU19JR05fT1VURF9GQUlMKTsKKwljb25uX3NlbmRfc3JfcmVwbHkoY29ubmVjdGlvbiwgcnYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9zdGF0ZSAqcCA9IHBpLT5kYXRhOwogCXVuaW9uIGRyYmRfc3RhdGUgb3MsIG5zLCBwZWVyX3N0YXRlOwogCWVudW0gZHJiZF9kaXNrX3N0YXRlIHJlYWxfcGVlcl9kaXNrOwogCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGNzX2ZsYWdzOwogCWludCBydjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQotCQlyZXR1cm4gY29uZmlnX3Vua25vd25fdm9sdW1lKHRjb25uLCBwaSk7CisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCisJCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUoY29ubmVjdGlvbiwgcGkpOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKIAlwZWVyX3N0YXRlLmkgPSBiZTMyX3RvX2NwdShwLT5zdGF0ZSk7CiAKIAlyZWFsX3BlZXJfZGlzayA9IHBlZXJfc3RhdGUuZGlzazsKIAlpZiAocGVlcl9zdGF0ZS5kaXNrID09IERfTkVHT1RJQVRJTkcpIHsKLQkJcmVhbF9wZWVyX2Rpc2sgPSBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdICYgNCA/IERfSU5DT05TSVNURU5UIDogRF9DT05TSVNURU5UOwotCQlkZXZfaW5mbyhERVYsICJyZWFsIHBlZXIgZGlzayBzdGF0ZSA9ICVzXG4iLCBkcmJkX2Rpc2tfc3RyKHJlYWxfcGVlcl9kaXNrKSk7CisJCXJlYWxfcGVlcl9kaXNrID0gZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICYgNCA/IERfSU5DT05TSVNURU5UIDogRF9DT05TSVNURU5UOworCQlkcmJkX2luZm8oZGV2aWNlLCAicmVhbCBwZWVyIGRpc2sgc3RhdGUgPSAlc1xuIiwgZHJiZF9kaXNrX3N0cihyZWFsX3BlZXJfZGlzaykpOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogIHJldHJ5OgotCW9zID0gbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCW9zID0gbnMgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCS8qIElmIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZSAoYXNlbmRlciB0aHJlYWQsIHRpbWVvdXQpCiAJICogYWxyZWFkeSBkZWNpZGVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFnYWluLApAQCAtMzg3Miw4ICszOTI3LDggQEAKIAkJICogTWF5YmUgd2Ugc2hvdWxkIGZpbmlzaCBpdCB1cCwgdG9vPyAqLwogCQllbHNlIGlmIChvcy5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKIAkJCSBwZWVyX3N0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpIHsKLQkJCWlmIChkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA8PSBtZGV2LT5yc19mYWlsZWQpCi0JCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJCQlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA8PSBkZXZpY2UtPnJzX2ZhaWxlZCkKKwkJCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0zODgxLDggKzM5MzYsOCBAQAogCS8qIGV4cGxpY2l0IHZlcmlmeSBmaW5pc2hlZCBub3RpZmljYXRpb24sIHN0b3Agc2VjdG9yIHJlYWNoZWQuICovCiAJaWYgKG9zLmNvbm4gPT0gQ19WRVJJRllfVCAmJiBvcy5kaXNrID09IERfVVBfVE9fREFURSAmJgogCSAgICBwZWVyX3N0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgcmVhbF9wZWVyX2Rpc2sgPT0gRF9VUF9UT19EQVRFKSB7Ci0JCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOwotCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKKwkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zOTAxLDggKzM5NTYsOCBAQAogCWlmIChwZWVyX3N0YXRlLmNvbm4gPT0gQ19BSEVBRCkKIAkJbnMuY29ubiA9IENfQkVISU5EOwogCi0JaWYgKG1kZXYtPnBfdXVpZCAmJiBwZWVyX3N0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyAmJgotCSAgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgeworCWlmIChkZXZpY2UtPnBfdXVpZCAmJiBwZWVyX3N0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyAmJgorCSAgICBnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CiAJCWludCBjcjsgLyogY29uc2lkZXIgcmVzeW5jICovCiAKIAkJLyogaWYgd2UgZXN0YWJsaXNoZWQgYSBuZXcgY29ubmVjdGlvbiAqLwpAQCAtMzkxNCw3ICszOTY5LDcgQEAKIAkJCW9zLmRpc2sgPT0gRF9ORUdPVElBVElORykpOwogCQkvKiBpZiB3ZSBoYXZlIGJvdGggYmVlbiBpbmNvbnNpc3RlbnQsIGFuZCB0aGUgcGVlciBoYXMgYmVlbgogCQkgKiBmb3JjZWQgdG8gYmUgVXBUb0RhdGUgd2l0aCAtLW92ZXJ3cml0ZS1kYXRhICovCi0JCWNyIHw9IHRlc3RfYml0KENPTlNJREVSX1JFU1lOQywgJm1kZXYtPmZsYWdzKTsKKwkJY3IgfD0gdGVzdF9iaXQoQ09OU0lERVJfUkVTWU5DLCAmZGV2aWNlLT5mbGFncyk7CiAJCS8qIGlmIHdlIGhhZCBiZWVuIHBsYWluIGNvbm5lY3RlZCwgYW5kIHRoZSBhZG1pbiByZXF1ZXN0ZWQgdG8KIAkJICogc3RhcnQgYSBzeW5jIGJ5ICJpbnZhbGlkYXRlIiBvciAiaW52YWxpZGF0ZS1yZW1vdGUiICovCiAJCWNyIHw9IChvcy5jb25uID09IENfQ09OTkVDVEVEICYmCkBAIC0zOTIyLDU1ICszOTc3LDU1IEBACiAJCQkJIHBlZXJfc3RhdGUuY29ubiA8PSBDX1dGX0JJVE1BUF9UKSk7CiAKIAkJaWYgKGNyKQotCQkJbnMuY29ubiA9IGRyYmRfc3luY19oYW5kc2hha2UobWRldiwgcGVlcl9zdGF0ZS5yb2xlLCByZWFsX3BlZXJfZGlzayk7CisJCQlucy5jb25uID0gZHJiZF9zeW5jX2hhbmRzaGFrZShwZWVyX2RldmljZSwgcGVlcl9zdGF0ZS5yb2xlLCByZWFsX3BlZXJfZGlzayk7CiAKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmIChucy5jb25uID09IENfTUFTSykgewogCQkJbnMuY29ubiA9IENfQ09OTkVDVEVEOwotCQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgewotCQkJCWRyYmRfZm9yY2Vfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgeworCQkJCWRyYmRfZm9yY2Vfc3RhdGUoZGV2aWNlLCBOUyhkaXNrLCBEX0ZBSUxFRCkpOwogCQkJfSBlbHNlIGlmIChwZWVyX3N0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgewotCQkJCWRldl9lcnIoREVWLCAiRGlzayBhdHRhY2ggcHJvY2VzcyBvbiB0aGUgcGVlciBub2RlIHdhcyBhYm9ydGVkLlxuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRGlzayBhdHRhY2ggcHJvY2VzcyBvbiB0aGUgcGVlciBub2RlIHdhcyBhYm9ydGVkLlxuIik7CiAJCQkJcGVlcl9zdGF0ZS5kaXNrID0gRF9ESVNLTEVTUzsKIAkJCQlyZWFsX3BlZXJfZGlzayA9IERfRElTS0xFU1M7CiAJCQl9IGVsc2UgewotCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9EUllfUlVOLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkKKwkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fRFJZX1JVTiwgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncykpCiAJCQkJCXJldHVybiAtRUlPOwotCQkJCURfQVNTRVJUKG9zLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKTsKLQkJCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQkJCURfQVNTRVJUKGRldmljZSwgb3MuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpOworCQkJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCX0KIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCWlmIChvcy5pICE9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KS5pKQorCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlpZiAob3MuaSAhPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKS5pKQogCQlnb3RvIHJldHJ5OwotCWNsZWFyX2JpdChDT05TSURFUl9SRVNZTkMsICZtZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KENPTlNJREVSX1JFU1lOQywgJmRldmljZS0+ZmxhZ3MpOwogCW5zLnBlZXIgPSBwZWVyX3N0YXRlLnJvbGU7CiAJbnMucGRzayA9IHJlYWxfcGVlcl9kaXNrOwogCW5zLnBlZXJfaXNwID0gKHBlZXJfc3RhdGUuYWZ0cl9pc3AgfCBwZWVyX3N0YXRlLnVzZXJfaXNwKTsKIAlpZiAoKG5zLmNvbm4gPT0gQ19DT05ORUNURUQgfHwgbnMuY29ubiA9PSBDX1dGX0JJVE1BUF9TKSAmJiBucy5kaXNrID09IERfTkVHT1RJQVRJTkcpCi0JCW5zLmRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCW5zLmRpc2sgPSBkZXZpY2UtPm5ld19zdGF0ZV90bXAuZGlzazsKIAljc19mbGFncyA9IENTX1ZFUkJPU0UgKyAob3MuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLmNvbm4gPj0gQ19DT05ORUNURUQgPyAwIDogQ1NfSEFSRCk7Ci0JaWYgKG5zLnBkc2sgPT0gRF9DT05TSVNURU5UICYmIGRyYmRfc3VzcGVuZGVkKG1kZXYpICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgb3MuY29ubiA8IENfQ09OTkVDVEVEICYmCi0JICAgIHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKSkgeworCWlmIChucy5wZHNrID09IERfQ09OU0lTVEVOVCAmJiBkcmJkX3N1c3BlbmRlZChkZXZpY2UpICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgb3MuY29ubiA8IENfQ09OTkVDVEVEICYmCisJICAgIHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpKSB7CiAJCS8qIERvIG5vdCBhbGxvdyB0bF9yZXN0YXJ0KFJFU0VORCkgZm9yIGEgcmVib290ZWQgcGVlci4gV2UgY2FuIG9ubHkgYWxsb3cgdGhpcwogCQkgICBmb3IgdGVtcG9yYWwgbmV0d29yayBvdXRhZ2VzISAqLwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JCWRldl9lcnIoREVWLCAiQWJvcnRpbmcgQ29ubmVjdCwgY2FuIG5vdCB0aGF3IElPIHdpdGggYW4gb25seSBDb25zaXN0ZW50IHBlZXJcbiIpOwotCQl0bF9jbGVhcihtZGV2LT50Y29ubik7Ci0JCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKLQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUzIoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiwgc3VzcCwgMCksIENTX0hBUkQpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQWJvcnRpbmcgQ29ubmVjdCwgY2FuIG5vdCB0aGF3IElPIHdpdGggYW4gb25seSBDb25zaXN0ZW50IHBlZXJcbiIpOworCQl0bF9jbGVhcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CisJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOworCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncyk7CisJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMyKGNvbm4sIENfUFJPVE9DT0xfRVJST1IsIHN1c3AsIDApLCBDU19IQVJEKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBjc19mbGFncywgTlVMTCk7Ci0JbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIGNzX2ZsYWdzLCBOVUxMKTsKKwlucyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTM5ODAsNDcgKzQwMzUsNDkgQEAKIAkJCS8qIHdlIHdhbnQgcmVzeW5jLCBwZWVyIGhhcyBub3QgeWV0IGRlY2lkZWQgdG8gc3luYy4uLiAqLwogCQkJLyogTm93YWRheXMgb25seSB1c2VkIHdoZW4gZm9yY2luZyBhIG5vZGUgaW50byBwcmltYXJ5IHJvbGUgYW5kCiAJCQkgICBzZXR0aW5nIGl0cyBkaXNrIHRvIFVwVG9EYXRlIHdpdGggdGhhdCAqLwotCQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQkJZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUobWRldik7CisJCQlkcmJkX3NlbmRfdXVpZHMocGVlcl9kZXZpY2UpOworCQkJZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUocGVlcl9kZXZpY2UpOwogCQl9CiAJfQogCi0JY2xlYXJfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX21kX3N5bmMobWRldik7IC8qIHVwZGF0ZSBjb25uZWN0ZWQgaW5kaWNhdG9yLCBsYV9zaXplX3NlY3QsIC4uLiAqLworCWRyYmRfbWRfc3luYyhkZXZpY2UpOyAvKiB1cGRhdGUgY29ubmVjdGVkIGluZGljYXRvciwgbGFfc2l6ZV9zZWN0LCAuLi4gKi8KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlY2VpdmVfc3luY191dWlkKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9zeW5jX3V1aWQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9yc191dWlkICpwID0gcGktPmRhdGE7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LAotCQkgICBtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfU1lOQ19VVUlEIHx8Ci0JCSAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19CRUhJTkQgfHwKLQkJICAgbWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8Ci0JCSAgIG1kZXYtPnN0YXRlLmRpc2sgPCBEX05FR09USUFUSU5HKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LAorCQkgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgfHwKKwkJICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQkVISU5EIHx8CisJCSAgIGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8CisJCSAgIGRldmljZS0+c3RhdGUuZGlzayA8IERfTkVHT1RJQVRJTkcpOwogCi0JLyogRF9BU1NFUlQoIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgKTsgKi8KKwkvKiBEX0FTU0VSVChkZXZpY2UsICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgKTsgKi8KIAogCS8qIEhlcmUgdGhlIF9kcmJkX3V1aWRfIGZ1bmN0aW9ucyBhcmUgcmlnaHQsIGN1cnJlbnQgc2hvdWxkCiAJICAgX25vdF8gYmUgcm90YXRlZCBpbnRvIHRoZSBoaXN0b3J5ICovCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKSB7Ci0JCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIGJlNjRfdG9fY3B1KHAtPnV1aWQpKTsKLQkJX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCAwVUwpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQ1VSUkVOVCwgYmU2NF90b19jcHUocC0+dXVpZCkpOworCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMFVMKTsKIAotCQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIHN5bmMgdXVpZCIpOwotCQlkcmJkX3N0YXJ0X3Jlc3luYyhtZGV2LCBDX1NZTkNfVEFSR0VUKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJ1cGRhdGVkIHN5bmMgdXVpZCIpOworCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19UQVJHRVQpOwogCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0gZWxzZQotCQlkZXZfZXJyKERFViwgIklnbm9yaW5nIFN5bmNVVUlEIHBhY2tldCFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJJZ25vcmluZyBTeW5jVVVJRCBwYWNrZXQhXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDAzMiwyNyArNDA4OSwyNyBAQAogICogY29kZSB1cG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLXJlY2VpdmVfYml0bWFwX3BsYWluKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBzaXplLAorcmVjZWl2ZV9iaXRtYXBfcGxhaW4oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJICAgICB1bnNpZ25lZCBsb25nICpwLCBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpCiB7CiAJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0KLQkJCQkgZHJiZF9oZWFkZXJfc2l6ZShtZGV2LT50Y29ubik7CisJCQkJIGRyYmRfaGVhZGVyX3NpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24pOwogCXVuc2lnbmVkIGludCBudW1fd29yZHMgPSBtaW5fdChzaXplX3QsIGRhdGFfc2l6ZSAvIHNpemVvZigqcCksCiAJCQkJICAgICAgIGMtPmJtX3dvcmRzIC0gYy0+d29yZF9vZmZzZXQpOwogCXVuc2lnbmVkIGludCB3YW50ID0gbnVtX3dvcmRzICogc2l6ZW9mKCpwKTsKIAlpbnQgZXJyOwogCiAJaWYgKHdhbnQgIT0gc2l6ZSkgewotCQlkZXZfZXJyKERFViwgIiVzOndhbnQgKCV1KSAhPSBzaXplICgldSlcbiIsIF9fZnVuY19fLCB3YW50LCBzaXplKTsKKwkJZHJiZF9lcnIocGVlcl9kZXZpY2UsICIlczp3YW50ICgldSkgIT0gc2l6ZSAoJXUpXG4iLCBfX2Z1bmNfXywgd2FudCwgc2l6ZSk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAod2FudCA9PSAwKQogCQlyZXR1cm4gMDsKLQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCB3YW50KTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLCB3YW50KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZHJiZF9ibV9tZXJnZV9sZWwobWRldiwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CisJZHJiZF9ibV9tZXJnZV9sZWwocGVlcl9kZXZpY2UtPmRldmljZSwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CiAKIAljLT53b3JkX29mZnNldCArPSBudW1fd29yZHM7CiAJYy0+Yml0X29mZnNldCA9IGMtPndvcmRfb2Zmc2V0ICogQklUU19QRVJfTE9ORzsKQEAgLTQwODQsNyArNDE0MSw3IEBACiAgKiBjb2RlIHVwb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotcmVjdl9ibV9ybGVfYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorcmVjdl9ibV9ybGVfYml0cyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsCiAJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAsCiAJCSBzdHJ1Y3QgYm1feGZlcl9jdHggKmMsCiAJCSB1bnNpZ25lZCBpbnQgbGVuKQpAQCAtNDExMywxNCArNDE3MCwxNCBAQAogCQlpZiAodG9nZ2xlKSB7CiAJCQllID0gcyArIHJsIC0xOwogCQkJaWYgKGUgPj0gYy0+Ym1fYml0cykgewotCQkJCWRldl9lcnIoREVWLCAiYml0bWFwIG92ZXJmbG93IChlOiVsdSkgd2hpbGUgZGVjb2RpbmcgYm0gUkxFIHBhY2tldFxuIiwgZSk7CisJCQkJZHJiZF9lcnIocGVlcl9kZXZpY2UsICJiaXRtYXAgb3ZlcmZsb3cgKGU6JWx1KSB3aGlsZSBkZWNvZGluZyBibSBSTEUgcGFja2V0XG4iLCBlKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KLQkJCV9kcmJkX2JtX3NldF9iaXRzKG1kZXYsIHMsIGUpOworCQkJX2RyYmRfYm1fc2V0X2JpdHMocGVlcl9kZXZpY2UtPmRldmljZSwgcywgZSk7CiAJCX0KIAogCQlpZiAoaGF2ZSA8IGJpdHMpIHsKLQkJCWRldl9lcnIoREVWLCAiYml0bWFwIGRlY29kaW5nIGVycm9yOiBoOiVkIGI6JWQgbGE6MHglMDhsbHggbDoldS8ldVxuIiwKKwkJCWRyYmRfZXJyKHBlZXJfZGV2aWNlLCAiYml0bWFwIGRlY29kaW5nIGVycm9yOiBoOiVkIGI6JWQgbGE6MHglMDhsbHggbDoldS8ldVxuIiwKIAkJCQloYXZlLCBiaXRzLCBsb29rX2FoZWFkLAogCQkJCSh1bnNpZ25lZCBpbnQpKGJzLmN1ci5iIC0gcC0+Y29kZSksCiAJCQkJKHVuc2lnbmVkIGludClicy5idWZfbGVuKTsKQEAgLTQxNTMsMjggKzQyMTAsMjggQEAKICAqIGNvZGUgdXBvbiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1kZWNvZGVfYml0bWFwX2Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2RlY29kZV9iaXRtYXBfYyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsCiAJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAsCiAJCXN0cnVjdCBibV94ZmVyX2N0eCAqYywKIAkJdW5zaWduZWQgaW50IGxlbikKIHsKIAlpZiAoZGNicF9nZXRfY29kZShwKSA9PSBSTEVfVkxJX0JpdHMpCi0JCXJldHVybiByZWN2X2JtX3JsZV9iaXRzKG1kZXYsIHAsIGMsIGxlbiAtIHNpemVvZigqcCkpOworCQlyZXR1cm4gcmVjdl9ibV9ybGVfYml0cyhwZWVyX2RldmljZSwgcCwgYywgbGVuIC0gc2l6ZW9mKCpwKSk7CiAKIAkvKiBvdGhlciB2YXJpYW50cyBoYWQgYmVlbiBpbXBsZW1lbnRlZCBmb3IgZXZhbHVhdGlvbiwKIAkgKiBidXQgaGF2ZSBiZWVuIGRyb3BwZWQgYXMgdGhpcyBvbmUgdHVybmVkIG91dCB0byBiZSAiYmVzdCIKIAkgKiBkdXJpbmcgYWxsIG91ciB0ZXN0cy4gKi8KIAotCWRldl9lcnIoREVWLCAicmVjZWl2ZV9iaXRtYXBfYzogdW5rbm93biBlbmNvZGluZyAldVxuIiwgcC0+ZW5jb2RpbmcpOwotCWNvbm5fcmVxdWVzdF9zdGF0ZShtZGV2LT50Y29ubiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOworCWRyYmRfZXJyKHBlZXJfZGV2aWNlLCAicmVjZWl2ZV9iaXRtYXBfYzogdW5rbm93biBlbmNvZGluZyAldVxuIiwgcC0+ZW5jb2RpbmcpOworCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCi12b2lkIElORk9fYm1feGZlcl9zdGF0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAordm9pZCBJTkZPX2JtX3hmZXJfc3RhdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IGNoYXIgKmRpcmVjdGlvbiwgc3RydWN0IGJtX3hmZXJfY3R4ICpjKQogewogCS8qIHdoYXQgd291bGQgaXQgdGFrZSB0byB0cmFuc2ZlciBpdCAicGxhaW50ZXh0IiAqLwotCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IGRyYmRfaGVhZGVyX3NpemUobWRldi0+dGNvbm4pOworCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IGRyYmRfaGVhZGVyX3NpemUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0gaGVhZGVyX3NpemU7CiAJdW5zaWduZWQgaW50IHBsYWluID0KIAkJaGVhZGVyX3NpemUgKiAoRElWX1JPVU5EX1VQKGMtPmJtX3dvcmRzLCBkYXRhX3NpemUpICsgMSkgKwpAQCAtNDE5OCw3ICs0MjU1LDcgQEAKIAkJciA9IDEwMDA7CiAKIAlyID0gMTAwMCAtIHI7Ci0JZGV2X2luZm8oREVWLCAiJXMgYml0bWFwIHN0YXRzIFtCeXRlcyhwYWNrZXRzKV06IHBsYWluICV1KCV1KSwgUkxFICV1KCV1KSwgIgorCWRyYmRfaW5mbyhkZXZpY2UsICIlcyBiaXRtYXAgc3RhdHMgW0J5dGVzKHBhY2tldHMpXTogcGxhaW4gJXUoJXUpLCBSTEUgJXUoJXUpLCAiCiAJICAgICAidG90YWwgJXU7IGNvbXByZXNzaW9uOiAldS4ldSUlXG4iLAogCQkJZGlyZWN0aW9uLAogCQkJYy0+Ynl0ZXNbMV0sIGMtPnBhY2tldHNbMV0sCkBAIC00MjE0LDEyOSArNDI3MSwxMzMgQEAKICAgIGluIG9yZGVyIHRvIGJlIGFnbm9zdGljIHRvIHRoZSAzMiB2cyA2NCBiaXRzIGlzc3VlLgogCiAgICByZXR1cm5zIDAgb24gZmFpbHVyZSwgMSBpZiB3ZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgaXQuICovCi1zdGF0aWMgaW50IHJlY2VpdmVfYml0bWFwKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9iaXRtYXAoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYm1feGZlcl9jdHggYzsKIAlpbnQgZXJyOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgInJlY2VpdmUgYml0bWFwIiwgQk1fTE9DS0VEX1NFVF9BTExPV0VEKTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCAicmVjZWl2ZSBiaXRtYXAiLCBCTV9MT0NLRURfU0VUX0FMTE9XRUQpOwogCS8qIHlvdSBhcmUgc3VwcG9zZWQgdG8gc2VuZCBhZGRpdGlvbmFsIG91dC1vZi1zeW5jIGluZm9ybWF0aW9uCiAJICogaWYgeW91IGFjdHVhbGx5IHNldCBiaXRzIGR1cmluZyB0aGlzIHBoYXNlICovCiAKIAljID0gKHN0cnVjdCBibV94ZmVyX2N0eCkgewotCQkuYm1fYml0cyA9IGRyYmRfYm1fYml0cyhtZGV2KSwKLQkJLmJtX3dvcmRzID0gZHJiZF9ibV93b3JkcyhtZGV2KSwKKwkJLmJtX2JpdHMgPSBkcmJkX2JtX2JpdHMoZGV2aWNlKSwKKwkJLmJtX3dvcmRzID0gZHJiZF9ibV93b3JkcyhkZXZpY2UpLAogCX07CiAKIAlmb3IoOzspIHsKIAkJaWYgKHBpLT5jbWQgPT0gUF9CSVRNQVApCi0JCQllcnIgPSByZWNlaXZlX2JpdG1hcF9wbGFpbihtZGV2LCBwaS0+c2l6ZSwgcGktPmRhdGEsICZjKTsKKwkJCWVyciA9IHJlY2VpdmVfYml0bWFwX3BsYWluKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSwgcGktPmRhdGEsICZjKTsKIAkJZWxzZSBpZiAocGktPmNtZCA9PSBQX0NPTVBSRVNTRURfQklUTUFQKSB7CiAJCQkvKiBNQVlCRTogc2FuaXR5IGNoZWNrIHRoYXQgd2Ugc3BlYWsgcHJvdG8gPj0gOTAsCiAJCQkgKiBhbmQgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCEgKi8KIAkJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAgPSBwaS0+ZGF0YTsKIAotCQkJaWYgKHBpLT5zaXplID4gRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgLSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKSkgewotCQkJCWRldl9lcnIoREVWLCAiUmVwb3J0Q0JpdG1hcCBwYWNrZXQgdG9vIGxhcmdlXG4iKTsKKwkJCWlmIChwaS0+c2l6ZSA+IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKSkgeworCQkJCWRyYmRfZXJyKGRldmljZSwgIlJlcG9ydENCaXRtYXAgcGFja2V0IHRvbyBsYXJnZVxuIik7CiAJCQkJZXJyID0gLUVJTzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChwaS0+c2l6ZSA8PSBzaXplb2YoKnApKSB7Ci0JCQkJZGV2X2VycihERVYsICJSZXBvcnRDQml0bWFwIHBhY2tldCB0b28gc21hbGwgKGw6JXUpXG4iLCBwaS0+c2l6ZSk7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiUmVwb3J0Q0JpdG1hcCBwYWNrZXQgdG9vIHNtYWxsIChsOiV1KVxuIiwgcGktPnNpemUpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCBwaS0+c2l6ZSk7CisJCQllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLCBwaS0+c2l6ZSk7CiAJCQlpZiAoZXJyKQogCQkJICAgICAgIGdvdG8gb3V0OwotCQkJZXJyID0gZGVjb2RlX2JpdG1hcF9jKG1kZXYsIHAsICZjLCBwaS0+c2l6ZSk7CisJCQllcnIgPSBkZWNvZGVfYml0bWFwX2MocGVlcl9kZXZpY2UsIHAsICZjLCBwaS0+c2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfd2FybihERVYsICJyZWNlaXZlX2JpdG1hcDogY21kIG5laXRoZXIgUmVwb3J0Qml0TWFwIG5vciBSZXBvcnRDQml0TWFwIChpcyAweCV4KSIsIHBpLT5jbWQpOworCQkJZHJiZF93YXJuKGRldmljZSwgInJlY2VpdmVfYml0bWFwOiBjbWQgbmVpdGhlciBSZXBvcnRCaXRNYXAgbm9yIFJlcG9ydENCaXRNYXAgKGlzIDB4JXgpIiwgcGktPmNtZCk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQljLnBhY2tldHNbcGktPmNtZCA9PSBQX0JJVE1BUF0rKzsKLQkJYy5ieXRlc1twaS0+Y21kID09IFBfQklUTUFQXSArPSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKSArIHBpLT5zaXplOworCQljLmJ5dGVzW3BpLT5jbWQgPT0gUF9CSVRNQVBdICs9IGRyYmRfaGVhZGVyX3NpemUoY29ubmVjdGlvbikgKyBwaS0+c2l6ZTsKIAogCQlpZiAoZXJyIDw9IDApIHsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWdvdG8gb3V0OwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gZHJiZF9yZWN2X2hlYWRlcihtZGV2LT50Y29ubiwgcGkpOworCQllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwaSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlJTkZPX2JtX3hmZXJfc3RhdHMobWRldiwgInJlY2VpdmUiLCAmYyk7CisJSU5GT19ibV94ZmVyX3N0YXRzKGRldmljZSwgInJlY2VpdmUiLCAmYyk7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9UKSB7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9UKSB7CiAJCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCQllcnIgPSBkcmJkX3NlbmRfYml0bWFwKG1kZXYpOworCQllcnIgPSBkcmJkX3NlbmRfYml0bWFwKGRldmljZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJLyogT21pdCBDU19PUkRFUkVEIHdpdGggdGhpcyBzdGF0ZSB0cmFuc2l0aW9uIHRvIGF2b2lkIGRlYWRsb2Nrcy4gKi8KLQkJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7Ci0JCURfQVNTRVJUKHJ2ID09IFNTX1NVQ0NFU1MpOwotCX0gZWxzZSBpZiAobWRldi0+c3RhdGUuY29ubiAhPSBDX1dGX0JJVE1BUF9TKSB7CisJCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7CisJCURfQVNTRVJUKGRldmljZSwgcnYgPT0gU1NfU1VDQ0VTUyk7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19XRl9CSVRNQVBfUykgewogCQkvKiBhZG1pbiBtYXkgaGF2ZSByZXF1ZXN0ZWQgQ19ESVNDT05ORUNUSU5HLAogCQkgKiBvdGhlciB0aHJlYWRzIG1heSBoYXZlIG5vdGljZWQgbmV0d29yayBlcnJvcnMgKi8KLQkJZGV2X2luZm8oREVWLCAidW5leHBlY3RlZCBjc3RhdGUgKCVzKSBpbiByZWNlaXZlX2JpdG1hcFxuIiwKLQkJICAgIGRyYmRfY29ubl9zdHIobWRldi0+c3RhdGUuY29ubikpOworCQlkcmJkX2luZm8oZGV2aWNlLCAidW5leHBlY3RlZCBjc3RhdGUgKCVzKSBpbiByZWNlaXZlX2JpdG1hcFxuIiwKKwkJICAgIGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAJfQogCWVyciA9IDA7CiAKICBvdXQ6Ci0JZHJiZF9ibV91bmxvY2sobWRldik7Ci0JaWYgKCFlcnIgJiYgbWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQotCQlkcmJkX3N0YXJ0X3Jlc3luYyhtZGV2LCBDX1NZTkNfU09VUkNFKTsKKwlkcmJkX2JtX3VubG9jayhkZXZpY2UpOworCWlmICghZXJyICYmIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQorCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9za2lwKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9za2lwKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0JY29ubl93YXJuKHRjb25uLCAic2tpcHBpbmcgdW5rbm93biBvcHRpb25hbCBwYWNrZXQgdHlwZSAlZCwgbDogJWQhXG4iLAorCWRyYmRfd2Fybihjb25uZWN0aW9uLCAic2tpcHBpbmcgdW5rbm93biBvcHRpb25hbCBwYWNrZXQgdHlwZSAlZCwgbDogJWQhXG4iLAogCQkgcGktPmNtZCwgcGktPnNpemUpOwogCi0JcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHRjb25uLCBwaSk7CisJcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KGNvbm5lY3Rpb24sIHBpKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1VucGx1Z1JlbW90ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfVW5wbHVnUmVtb3RlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7CiAJLyogTWFrZSBzdXJlIHdlJ3ZlIGFja2VkIGFsbCB0aGUgVENQIGRhdGEgYXNzb2NpYXRlZAogCSAqIHdpdGggdGhlIGRhdGEgcmVxdWVzdHMgYmVpbmcgdW5wbHVnZ2VkICovCi0JZHJiZF90Y3BfcXVpY2thY2sodGNvbm4tPmRhdGEuc29ja2V0KTsKKwlkcmJkX3RjcF9xdWlja2Fjayhjb25uZWN0aW9uLT5kYXRhLnNvY2tldCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX291dF9vZl9zeW5jKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX2Jsb2NrX2Rlc2MgKnAgPSBwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0Jc3dpdGNoIChtZGV2LT5zdGF0ZS5jb25uKSB7CisJc3dpdGNoIChkZXZpY2UtPnN0YXRlLmNvbm4pIHsKIAljYXNlIENfV0ZfU1lOQ19VVUlEOgogCWNhc2UgQ19XRl9CSVRNQVBfVDoKIAljYXNlIENfQkVISU5EOgogCQkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihERVYsICJBU1NFUlQgRkFJTEVEIGNzdGF0ZSA9ICVzLCBleHBlY3RlZDogV0ZTeW5jVVVJRHxXRkJpdE1hcFR8QmVoaW5kXG4iLAotCQkJCWRyYmRfY29ubl9zdHIobWRldi0+c3RhdGUuY29ubikpOworCQlkcmJkX2VycihkZXZpY2UsICJBU1NFUlQgRkFJTEVEIGNzdGF0ZSA9ICVzLCBleHBlY3RlZDogV0ZTeW5jVVVJRHxXRkJpdE1hcFR8QmVoaW5kXG4iLAorCQkJCWRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAJfQogCi0JZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgYmU2NF90b19jcHUocC0+c2VjdG9yKSwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOworCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgYmU2NF90b19jcHUocC0+c2VjdG9yKSwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MzQ0LDcgKzQ0MDUsNyBAQAogc3RydWN0IGRhdGFfY21kIHsKIAlpbnQgZXhwZWN0X3BheWxvYWQ7CiAJc2l6ZV90IHBrdF9zaXplOwotCWludCAoKmZuKShzdHJ1Y3QgZHJiZF90Y29ubiAqLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CisJaW50ICgqZm4pKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHBhY2tldF9pbmZvICopOwogfTsKIAogc3RhdGljIHN0cnVjdCBkYXRhX2NtZCBkcmJkX2NtZF9oYW5kbGVyW10gPSB7CkBAIC00Mzc0LDQzICs0NDM1LDQzIEBACiAJW1BfUFJPVE9DT0xfVVBEQVRFXSA9IHsgMSwgc2l6ZW9mKHN0cnVjdCBwX3Byb3RvY29sKSwgcmVjZWl2ZV9wcm90b2NvbCB9LAogfTsKIAotc3RhdGljIHZvaWQgZHJiZGQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgZHJiZGQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJc2l6ZV90IHNoczsgLyogc3ViIGhlYWRlciBzaXplICovCiAJaW50IGVycjsKIAotCXdoaWxlIChnZXRfdF9zdGF0ZSgmdGNvbm4tPnJlY2VpdmVyKSA9PSBSVU5OSU5HKSB7CisJd2hpbGUgKGdldF90X3N0YXRlKCZjb25uZWN0aW9uLT5yZWNlaXZlcikgPT0gUlVOTklORykgewogCQlzdHJ1Y3QgZGF0YV9jbWQgKmNtZDsKIAotCQlkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoJnRjb25uLT5yZWNlaXZlcik7Ci0JCWlmIChkcmJkX3JlY3ZfaGVhZGVyKHRjb25uLCAmcGkpKQorCQlkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKKwkJaWYgKGRyYmRfcmVjdl9oZWFkZXIoY29ubmVjdGlvbiwgJnBpKSkKIAkJCWdvdG8gZXJyX291dDsKIAogCQljbWQgPSAmZHJiZF9jbWRfaGFuZGxlcltwaS5jbWRdOwogCQlpZiAodW5saWtlbHkocGkuY21kID49IEFSUkFZX1NJWkUoZHJiZF9jbWRfaGFuZGxlcikgfHwgIWNtZC0+Zm4pKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIlVuZXhwZWN0ZWQgZGF0YSBwYWNrZXQgJXMgKDB4JTA0eCkiLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlVuZXhwZWN0ZWQgZGF0YSBwYWNrZXQgJXMgKDB4JTA0eCkiLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAogCQlzaHMgPSBjbWQtPnBrdF9zaXplOwogCQlpZiAocGkuc2l6ZSA+IHNocyAmJiAhY21kLT5leHBlY3RfcGF5bG9hZCkgewotCQkJY29ubl9lcnIodGNvbm4sICJObyBwYXlsb2FkIGV4cGVjdGVkICVzIGw6JWRcbiIsCisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiTm8gcGF5bG9hZCBleHBlY3RlZCAlcyBsOiVkXG4iLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLnNpemUpOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKIAkJaWYgKHNocykgewotCQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBwaS5kYXRhLCBzaHMpOworCQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKGNvbm5lY3Rpb24sIHBpLmRhdGEsIHNocyk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyX291dDsKIAkJCXBpLnNpemUgLT0gc2hzOwogCQl9CiAKLQkJZXJyID0gY21kLT5mbih0Y29ubiwgJnBpKTsKKwkJZXJyID0gY21kLT5mbihjb25uZWN0aW9uLCAmcGkpOwogCQlpZiAoZXJyKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImVycm9yIHJlY2VpdmluZyAlcywgZTogJWQgbDogJWQhXG4iLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImVycm9yIHJlY2VpdmluZyAlcywgZTogJWQgbDogJWQhXG4iLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIGVyciwgcGkuc2l6ZSk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KQEAgLTQ0MTgsMjcgKzQ0NzksMTYgQEAKIAlyZXR1cm47CiAKICAgICBlcnJfb3V0OgotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOworCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1BST1RPQ09MX0VSUk9SKSwgQ1NfSEFSRCk7CiB9CiAKLXZvaWQgY29ubl9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9kaXNjb25uZWN0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfd3FfYmFycmllciBiYXJyOwotCi0JYmFyci53LmNiID0gd19wcmV2X3dvcmtfZG9uZTsKLQliYXJyLncudGNvbm4gPSB0Y29ubjsKLQlpbml0X2NvbXBsZXRpb24oJmJhcnIuZG9uZSk7Ci0JZHJiZF9xdWV1ZV93b3JrKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZiYXJyLncpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJhcnIuZG9uZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5fZGlzY29ubmVjdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCi17Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJZW51bSBkcmJkX2Nvbm5zIG9jOwogCWludCB2bnI7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkUpCisJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkUpCiAJCXJldHVybjsKIAogCS8qIFdlIGFyZSBhYm91dCB0byBzdGFydCB0aGUgY2xlYW51cCBhZnRlciBjb25uZWN0aW9uIGxvc3MuCkBAIC00NDQ2LDU0ICs0NDk2LDU2IEBACiAJICogVXN1YWxseSB3ZSBzaG91bGQgYmUgaW4gc29tZSBuZXR3b3JrIGZhaWx1cmUgc3RhdGUgYWxyZWFkeSwKIAkgKiBidXQganVzdCBpbiBjYXNlIHdlIGFyZSBub3QsIHdlIGZpeCBpdCB1cCBoZXJlLgogCSAqLwotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKKwljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKIAogCS8qIGFzZW5kZXIgZG9lcyBub3QgY2xlYW4gdXAgYW55dGhpbmcuIGl0IG11c3Qgbm90IGludGVyZmVyZSwgZWl0aGVyICovCi0JZHJiZF90aHJlYWRfc3RvcCgmdGNvbm4tPmFzZW5kZXIpOwotCWRyYmRfZnJlZV9zb2NrKHRjb25uKTsKKwlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT5hc2VuZGVyKTsKKwlkcmJkX2ZyZWVfc29jayhjb25uZWN0aW9uKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX2Rpc2Nvbm5lY3RlZChtZGV2KTsKLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQlkcmJkX2Rpc2Nvbm5lY3RlZChwZWVyX2RldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+bGlzdCkpCi0JCWNvbm5fZXJyKHRjb25uLCAiQVNTRVJUSU9OIEZBSUxFRDogdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3Qgbm90IGVtcHR5XG4iKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpKQorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQVNTRVJUSU9OIEZBSUxFRDogY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+bGlzdCBub3QgZW1wdHlcbiIpOwogCS8qIG9rLCBubyBtb3JlIGVlJ3Mgb24gdGhlIGZseSwgaXQgaXMgc2FmZSB0byByZXNldCB0aGUgZXBvY2hfc2l6ZSAqLwotCWF0b21pY19zZXQoJnRjb25uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplLCAwKTsKLQl0Y29ubi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQgPSBmYWxzZTsKKwlhdG9taWNfc2V0KCZjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplLCAwKTsKKwljb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IGZhbHNlOwogCi0JY29ubl9pbmZvKHRjb25uLCAiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOworCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOwogCi0JaWYgKGNvbm5faGlnaGVzdF9yb2xlKHRjb25uKSA9PSBSX1BSSU1BUlkgJiYgY29ubl9oaWdoZXN0X3Bkc2sodGNvbm4pID49IERfVU5LTk9XTikKLQkJY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHRjb25uKTsKKwlpZiAoY29ubl9oaWdoZXN0X3JvbGUoY29ubmVjdGlvbikgPT0gUl9QUklNQVJZICYmIGNvbm5faGlnaGVzdF9wZHNrKGNvbm5lY3Rpb24pID49IERfVU5LTk9XTikKKwkJY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKGNvbm5lY3Rpb24pOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlvYyA9IHRjb25uLT5jc3RhdGU7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlvYyA9IGNvbm5lY3Rpb24tPmNzdGF0ZTsKIAlpZiAob2MgPj0gQ19VTkNPTk5FQ1RFRCkKLQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19VTkNPTk5FQ1RFRCksIENTX1ZFUkJPU0UpOworCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfVU5DT05ORUNURUQpLCBDU19WRVJCT1NFKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKIAlpZiAob2MgPT0gQ19ESVNDT05ORUNUSU5HKQotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksIENTX1ZFUkJPU0UgfCBDU19IQVJEKTsKKwkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksIENTX1ZFUkJPU0UgfCBDU19IQVJEKTsKIH0KIAotc3RhdGljIGludCBkcmJkX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBkcmJkX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXVuc2lnbmVkIGludCBpOwogCiAJLyogd2FpdCBmb3IgY3VycmVudCBhY3Rpdml0eSB0byBjZWFzZS4gKi8KLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShtZGV2LCAmbWRldi0+YWN0aXZlX2VlKTsKLQlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgJm1kZXYtPnN5bmNfZWUpOwotCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShtZGV2LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOworCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShkZXZpY2UsICZkZXZpY2UtPnN5bmNfZWUpOworCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShkZXZpY2UsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJLyogV2UgZG8gbm90IGhhdmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgd291bGQgYWxsb3cgdXMgdG8KIAkgKiBnZXQgdGhlIHJzX3BlbmRpbmdfY250IGRvd24gdG8gMCBhZ2Fpbi4KQEAgLTQ1MDUsNDIgKzQ1NTcsNDIgQEAKIAkgKiAgcmVzeW5jX0xSVS4gVGhlIHJlc3luY19MUlUgdHJhY2tzIHRoZSB3aG9sZSBvcGVyYXRpb24gaW5jbHVkaW5nCiAJICogIHRoZSBkaXNrLUlPLCB3aGlsZSB0aGUgcnNfcGVuZGluZ19jbnQgb25seSB0cmFja3MgdGhlIGJsb2NrcwogCSAqICBvbiB0aGUgZmx5LiAqLwotCWRyYmRfcnNfY2FuY2VsX2FsbChtZGV2KTsKLQltZGV2LT5yc190b3RhbCA9IDA7Ci0JbWRldi0+cnNfZmFpbGVkID0gMDsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19wZW5kaW5nX2NudCwgMCk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwlkcmJkX3JzX2NhbmNlbF9hbGwoZGV2aWNlKTsKKwlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CisJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCi0JZGVsX3RpbWVyX3N5bmMoJm1kZXYtPnJlc3luY190aW1lcik7Ci0JcmVzeW5jX3RpbWVyX2ZuKCh1bnNpZ25lZCBsb25nKW1kZXYpOworCWRlbF90aW1lcl9zeW5jKCZkZXZpY2UtPnJlc3luY190aW1lcik7CisJcmVzeW5jX3RpbWVyX2ZuKCh1bnNpZ25lZCBsb25nKWRldmljZSk7CiAKIAkvKiB3YWl0IGZvciBhbGwgd19lX2VuZF9kYXRhX3JlcSwgd19lX2VuZF9yc2RhdGFfcmVxLCB3X3NlbmRfYmFycmllciwKIAkgKiB3X21ha2VfcmVzeW5jX3JlcXVlc3QgZXRjLiB3aGljaCBtYXkgc3RpbGwgYmUgb24gdGhlIHdvcmtlciBxdWV1ZQogCSAqIHRvIGJlICJjYW5jZWxlZCIgKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAotCWRyYmRfZmluaXNoX3BlZXJfcmVxcyhtZGV2KTsKKwlkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoZGV2aWNlKTsKIAogCS8qIFRoaXMgc2Vjb25kIHdvcmtxdWV1ZSBmbHVzaCBpcyBuZWNlc3NhcnksIHNpbmNlIGRyYmRfZmluaXNoX3BlZXJfcmVxcygpCiAJICAgbWlnaHQgaGF2ZSBpc3N1ZWQgYSB3b3JrIGFnYWluLiBUaGUgb25lIGJlZm9yZSBkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoKSBpcwogCSAgIG5lY2Vzc2FyeSB0byByZWNsYWluIG5ldF9lZSBpbiBkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoKS4gKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAogCS8qIG5lZWQgdG8gZG8gaXQgYWdhaW4sIGRyYmRfZmluaXNoX3BlZXJfcmVxcygpIG1heSBoYXZlIHBvcHVsYXRlZCBpdAogCSAqIGFnYWluIHZpYSBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKCkuICovCi0JZHJiZF9yc19jYW5jZWxfYWxsKG1kZXYpOworCWRyYmRfcnNfY2FuY2VsX2FsbChkZXZpY2UpOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQltZGV2LT5wX3V1aWQgPSBOVUxMOworCWtmcmVlKGRldmljZS0+cF91dWlkKTsKKwlkZXZpY2UtPnBfdXVpZCA9IE5VTEw7CiAKLQlpZiAoIWRyYmRfc3VzcGVuZGVkKG1kZXYpKQotCQl0bF9jbGVhcihtZGV2LT50Y29ubik7CisJaWYgKCFkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQorCQl0bF9jbGVhcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKIAkvKiBzZXJpYWxpemUgd2l0aCBiaXRtYXAgd3JpdGVvdXQgdHJpZ2dlcmVkIGJ5IHRoZSBzdGF0ZSBjaGFuZ2UsCiAJICogaWYgYW55LiAqLwotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpOwogCiAJLyogdGNwX2Nsb3NlIGFuZCByZWxlYXNlIG9mIHNlbmRwYWdlIHBhZ2VzIGNhbiBiZSBkZWZlcnJlZC4gIEkgZG9uJ3QKIAkgKiB3YW50IHRvIHVzZSBTT19MSU5HRVIsIGJlY2F1c2UgYXBwYXJlbnRseSBpdCBjYW4gYmUgZGVmZXJyZWQgZm9yCkBAIC00NTQ5LDIwICs0NjAxLDIwIEBACiAJICogQWN0dWFsbHkgd2UgZG9uJ3QgY2FyZSBmb3IgZXhhY3RseSB3aGVuIHRoZSBuZXR3b3JrIHN0YWNrIGRvZXMgaXRzCiAJICogcHV0X3BhZ2UoKSwgYnV0IHJlbGVhc2Ugb3VyIHJlZmVyZW5jZSBvbiB0aGVzZSBwYWdlcyByaWdodCBoZXJlLgogCSAqLwotCWkgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKG1kZXYsICZtZGV2LT5uZXRfZWUpOworCWkgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKGRldmljZSwgJmRldmljZS0+bmV0X2VlKTsKIAlpZiAoaSkKLQkJZGV2X2luZm8oREVWLCAibmV0X2VlIG5vdCBlbXB0eSwga2lsbGVkICV1IGVudHJpZXNcbiIsIGkpOwotCWkgPSBhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlX2J5X25ldCk7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJuZXRfZWUgbm90IGVtcHR5LCBraWxsZWQgJXUgZW50cmllc1xuIiwgaSk7CisJaSA9IGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZV9ieV9uZXQpOwogCWlmIChpKQotCQlkZXZfaW5mbyhERVYsICJwcF9pbl91c2VfYnlfbmV0ID0gJWQsIGV4cGVjdGVkIDBcbiIsIGkpOwotCWkgPSBhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgInBwX2luX3VzZV9ieV9uZXQgPSAlZCwgZXhwZWN0ZWQgMFxuIiwgaSk7CisJaSA9IGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZSk7CiAJaWYgKGkpCi0JCWRldl9pbmZvKERFViwgInBwX2luX3VzZSA9ICVkLCBleHBlY3RlZCAwXG4iLCBpKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgInBwX2luX3VzZSA9ICVkLCBleHBlY3RlZCAwXG4iLCBpKTsKIAotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5hY3RpdmVfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5zeW5jX2VlKSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+ZG9uZV9lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5yZWFkX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmFjdGl2ZV9lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5zeW5jX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmRvbmVfZWUpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU3NiwxOSArNDYyOCwxOSBAQAogICoKICAqIGZvciBub3csIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHplcm8sIGJ1dCBpZ25vcmVkLgogICovCi1zdGF0aWMgaW50IGRyYmRfc2VuZF9mZWF0dXJlcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgaW50IGRyYmRfc2VuZF9mZWF0dXJlcyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzICpwOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CiAJcC0+cHJvdG9jb2xfbWluID0gY3B1X3RvX2JlMzIoUFJPX1ZFUlNJT05fTUlOKTsKIAlwLT5wcm90b2NvbF9tYXggPSBjcHVfdG9fYmUzMihQUk9fVkVSU0lPTl9NQVgpOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9DT05ORUNUSU9OX0ZFQVRVUkVTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9DT05ORUNUSU9OX0ZFQVRVUkVTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyoKQEAgLTQ1OTgsMzYgKzQ2NTAsMzYgQEAKICAqICAtMSBwZWVyIHRhbGtzIGRpZmZlcmVudCBsYW5ndWFnZSwKICAqICAgICBubyBwb2ludCBpbiB0cnlpbmcgYWdhaW4sIHBsZWFzZSBnbyBzdGFuZGFsb25lLgogICovCi1zdGF0aWMgaW50IGRyYmRfZG9fZmVhdHVyZXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX2RvX2ZlYXR1cmVzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JLyogQVNTRVJUIGN1cnJlbnQgPT0gdGNvbm4tPnJlY2VpdmVyIC4uLiAqLworCS8qIEFTU0VSVCBjdXJyZW50ID09IGNvbm5lY3Rpb24tPnJlY2VpdmVyIC4uLiAqLwogCXN0cnVjdCBwX2Nvbm5lY3Rpb25fZmVhdHVyZXMgKnA7CiAJY29uc3QgaW50IGV4cGVjdCA9IHNpemVvZihzdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzKTsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfc2VuZF9mZWF0dXJlcyh0Y29ubik7CisJZXJyID0gZHJiZF9zZW5kX2ZlYXR1cmVzKGNvbm5lY3Rpb24pOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIDA7CiAKIAlpZiAocGkuY21kICE9IFBfQ09OTkVDVElPTl9GRUFUVVJFUykgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIENvbm5lY3Rpb25GZWF0dXJlcyBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImV4cGVjdGVkIENvbm5lY3Rpb25GZWF0dXJlcyBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAocGkuc2l6ZSAhPSBleHBlY3QpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBDb25uZWN0aW9uRmVhdHVyZXMgbGVuZ3RoOiAldSwgcmVjZWl2ZWQ6ICV1XG4iLAorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQ29ubmVjdGlvbkZlYXR1cmVzIGxlbmd0aDogJXUsIHJlY2VpdmVkOiAldVxuIiwKIAkJICAgICBleHBlY3QsIHBpLnNpemUpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJcCA9IHBpLmRhdGE7Ci0JZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBwLCBleHBlY3QpOworCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybihjb25uZWN0aW9uLCBwLCBleHBlY3QpOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCkBAIC00NjQwLDE1ICs0NjkyLDE1IEBACiAJICAgIFBST19WRVJTSU9OX01JTiA+IHAtPnByb3RvY29sX21heCkKIAkJZ290byBpbmNvbXBhdDsKIAotCXRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPSBtaW5fdChpbnQsIFBST19WRVJTSU9OX01BWCwgcC0+cHJvdG9jb2xfbWF4KTsKKwljb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPSBtaW5fdChpbnQsIFBST19WRVJTSU9OX01BWCwgcC0+cHJvdG9jb2xfbWF4KTsKIAotCWNvbm5faW5mbyh0Y29ubiwgIkhhbmRzaGFrZSBzdWNjZXNzZnVsOiAiCi0JICAgICAiQWdyZWVkIG5ldHdvcmsgcHJvdG9jb2wgdmVyc2lvbiAlZFxuIiwgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbik7CisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJIYW5kc2hha2Ugc3VjY2Vzc2Z1bDogIgorCSAgICAgIkFncmVlZCBuZXR3b3JrIHByb3RvY29sIHZlcnNpb24gJWRcbiIsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbik7CiAKIAlyZXR1cm4gMTsKIAogIGluY29tcGF0OgotCWNvbm5fZXJyKHRjb25uLCAiaW5jb21wYXRpYmxlIERSQkQgZGlhbGVjdHM6ICIKKwlkcmJkX2Vycihjb25uZWN0aW9uLCAiaW5jb21wYXRpYmxlIERSQkQgZGlhbGVjdHM6ICIKIAkgICAgIkkgc3VwcG9ydCAlZC0lZCwgcGVlciBzdXBwb3J0cyAlZC0lZFxuIiwKIAkgICAgUFJPX1ZFUlNJT05fTUlOLCBQUk9fVkVSU0lPTl9NQVgsCiAJICAgIHAtPnByb3RvY29sX21pbiwgcC0+cHJvdG9jb2xfbWF4KTsKQEAgLTQ2NTYsMTAgKzQ3MDgsMTAgQEAKIH0KIAogI2lmICFkZWZpbmVkKENPTkZJR19DUllQVE9fSE1BQykgJiYgIWRlZmluZWQoQ09ORklHX0NSWVBUT19ITUFDX01PRFVMRSkKLXN0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JY29ubl9lcnIodGNvbm4sICJUaGlzIGtlcm5lbCB3YXMgYnVpbGQgd2l0aG91dCBDT05GSUdfQ1JZUFRPX0hNQUMuXG4iKTsKLQljb25uX2Vycih0Y29ubiwgIllvdSBuZWVkIHRvIGRpc2FibGUgJ2NyYW0taG1hYy1hbGcnIGluIGRyYmQuY29uZi5cbiIpOworCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJUaGlzIGtlcm5lbCB3YXMgYnVpbGQgd2l0aG91dCBDT05GSUdfQ1JZUFRPX0hNQUMuXG4iKTsKKwlkcmJkX2Vycihjb25uZWN0aW9uLCAiWW91IG5lZWQgdG8gZGlzYWJsZSAnY3JhbS1obWFjLWFsZycgaW4gZHJiZC5jb25mLlxuIik7CiAJcmV0dXJuIC0xOwogfQogI2Vsc2UKQEAgLTQ2NzEsNyArNDcyMyw3IEBACiAJLTEgLSBhdXRoIGZhaWxlZCwgZG9uJ3QgdHJ5IGFnYWluLgogKi8KIAotc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJY2hhciBteV9jaGFsbGVuZ2VbQ0hBTExFTkdFX0xFTl07ICAvKiA2NCBCeXRlcy4uLiAqLwpAQCAtNDY5MCw2OSArNDc0Miw2OSBAQAogCS8qIEZJWE1FOiBQdXQgdGhlIGNoYWxsZW5nZS9yZXNwb25zZSBpbnRvIHRoZSBwcmVhbGxvY2F0ZWQgc29ja2V0IGJ1ZmZlci4gICovCiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJa2V5X2xlbiA9IHN0cmxlbihuYy0+c2hhcmVkX3NlY3JldCk7CiAJbWVtY3B5KHNlY3JldCwgbmMtPnNoYXJlZF9zZWNyZXQsIGtleV9sZW4pOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JZGVzYy50Zm0gPSB0Y29ubi0+Y3JhbV9obWFjX3RmbTsKKwlkZXNjLnRmbSA9IGNvbm5lY3Rpb24tPmNyYW1faG1hY190Zm07CiAJZGVzYy5mbGFncyA9IDA7CiAKLQlydiA9IGNyeXB0b19oYXNoX3NldGtleSh0Y29ubi0+Y3JhbV9obWFjX3RmbSwgKHU4ICopc2VjcmV0LCBrZXlfbGVuKTsKKwlydiA9IGNyeXB0b19oYXNoX3NldGtleShjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtLCAodTggKilzZWNyZXQsIGtleV9sZW4pOwogCWlmIChydikgewotCQljb25uX2Vycih0Y29ubiwgImNyeXB0b19oYXNoX3NldGtleSgpIGZhaWxlZCB3aXRoICVkXG4iLCBydik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJjcnlwdG9faGFzaF9zZXRrZXkoKSBmYWlsZWQgd2l0aCAlZFxuIiwgcnYpOwogCQlydiA9IC0xOwogCQlnb3RvIGZhaWw7CiAJfQogCiAJZ2V0X3JhbmRvbV9ieXRlcyhteV9jaGFsbGVuZ2UsIENIQUxMRU5HRV9MRU4pOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKSkgeworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spKSB7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KLQlydiA9ICFjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9BVVRIX0NIQUxMRU5HRSwgMCwKKwlydiA9ICFjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0FVVEhfQ0hBTExFTkdFLCAwLAogCQkJCW15X2NoYWxsZW5nZSwgQ0hBTExFTkdFX0xFTik7CiAJaWYgKCFydikKIAkJZ290byBmYWlsOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAlpZiAocGkuY21kICE9IFBfQVVUSF9DSEFMTEVOR0UpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBBdXRoQ2hhbGxlbmdlIHBhY2tldCwgcmVjZWl2ZWQ6ICVzICgweCUwNHgpXG4iLAorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aENoYWxsZW5nZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAogCWlmIChwaS5zaXplID4gQ0hBTExFTkdFX0xFTiAqIDIpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBBdXRoQ2hhbGxlbmdlIHBheWxvYWQgdG9vIGJpZy5cbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aENoYWxsZW5nZSBwYXlsb2FkIHRvbyBiaWcuXG4iKTsKIAkJcnYgPSAtMTsKIAkJZ290byBmYWlsOwogCX0KIAogCXBlZXJzX2NoID0ga21hbGxvYyhwaS5zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHBlZXJzX2NoID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHBlZXJzX2NoIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHBlZXJzX2NoIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4odGNvbm4sIHBlZXJzX2NoLCBwaS5zaXplKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4oY29ubmVjdGlvbiwgcGVlcnNfY2gsIHBpLnNpemUpOwogCWlmIChlcnIpIHsKIAkJcnYgPSAwOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmVzcF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZSh0Y29ubi0+Y3JhbV9obWFjX3RmbSk7CisJcmVzcF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtKTsKIAlyZXNwb25zZSA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHJlc3BvbnNlID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHJlc3BvbnNlIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHJlc3BvbnNlIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00NzYyLDQwICs0ODE0LDQwIEBACiAKIAlydiA9IGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgJnNnLCBzZy5sZW5ndGgsIHJlc3BvbnNlKTsKIAlpZiAocnYpIHsKLQkJY29ubl9lcnIodGNvbm4sICJjcnlwdG9faGFzaF9kaWdlc3QoKSBmYWlsZWQgd2l0aCAlZFxuIiwgcnYpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiY3J5cHRvX2hhc2hfZGlnZXN0KCkgZmFpbGVkIHdpdGggJWRcbiIsIHJ2KTsKIAkJcnYgPSAtMTsKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spKSB7CisJaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKSkgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9Ci0JcnYgPSAhY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIFBfQVVUSF9SRVNQT05TRSwgMCwKKwlydiA9ICFjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0FVVEhfUkVTUE9OU0UsIDAsCiAJCQkJcmVzcG9uc2UsIHJlc3Bfc2l6ZSk7CiAJaWYgKCFydikKIAkJZ290byBmYWlsOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAlpZiAocGkuY21kICE9IFBfQVVUSF9SRVNQT05TRSkgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAogCWlmIChwaS5zaXplICE9IHJlc3Bfc2l6ZSkgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYXlsb2FkIG9mIHdyb25nIHNpemVcbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aFJlc3BvbnNlIHBheWxvYWQgb2Ygd3Jvbmcgc2l6ZVxuIik7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAotCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybih0Y29ubiwgcmVzcG9uc2UgLCByZXNwX3NpemUpOworCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybihjb25uZWN0aW9uLCByZXNwb25zZSAsIHJlc3Bfc2l6ZSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKQEAgLTQ4MDMsNyArNDg1NSw3IEBACiAKIAlyaWdodF9yZXNwb25zZSA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHJpZ2h0X3Jlc3BvbnNlID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHJpZ2h0X3Jlc3BvbnNlIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHJpZ2h0X3Jlc3BvbnNlIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00ODEyLDcgKzQ4NjQsNyBAQAogCiAJcnYgPSBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsICZzZywgc2cubGVuZ3RoLCByaWdodF9yZXNwb25zZSk7CiAJaWYgKHJ2KSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiY3J5cHRvX2hhc2hfZGlnZXN0KCkgZmFpbGVkIHdpdGggJWRcbiIsIHJ2KTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImNyeXB0b19oYXNoX2RpZ2VzdCgpIGZhaWxlZCB3aXRoICVkXG4iLCBydik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00ODIwLDcgKzQ4NzIsNyBAQAogCXJ2ID0gIW1lbWNtcChyZXNwb25zZSwgcmlnaHRfcmVzcG9uc2UsIHJlc3Bfc2l6ZSk7CiAKIAlpZiAocnYpCi0JCWNvbm5faW5mbyh0Y29ubiwgIlBlZXIgYXV0aGVudGljYXRlZCB1c2luZyAlZCBieXRlcyBITUFDXG4iLAorCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgIlBlZXIgYXV0aGVudGljYXRlZCB1c2luZyAlZCBieXRlcyBITUFDXG4iLAogCQkgICAgIHJlc3Bfc2l6ZSk7CiAJZWxzZQogCQlydiA9IC0xOwpAQCAtNDgzNCwxNjMgKzQ4ODYsMTY5IEBACiB9CiAjZW5kaWYKIAotaW50IGRyYmRkX2luaXQoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCitpbnQgZHJiZF9yZWNlaXZlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSB0aGktPmNvbm5lY3Rpb247CiAJaW50IGg7CiAKLQljb25uX2luZm8odGNvbm4sICJyZWNlaXZlciAocmUpc3RhcnRlZFxuIik7CisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJyZWNlaXZlciAocmUpc3RhcnRlZFxuIik7CiAKIAlkbyB7Ci0JCWggPSBjb25uX2Nvbm5lY3QodGNvbm4pOworCQloID0gY29ubl9jb25uZWN0KGNvbm5lY3Rpb24pOwogCQlpZiAoaCA9PSAwKSB7Ci0JCQljb25uX2Rpc2Nvbm5lY3QodGNvbm4pOworCQkJY29ubl9kaXNjb25uZWN0KGNvbm5lY3Rpb24pOwogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKIAkJfQogCQlpZiAoaCA9PSAtMSkgewotCQkJY29ubl93YXJuKHRjb25uLCAiRGlzY2FyZGluZyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4iKTsKLQkJCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIkRpc2NhcmRpbmcgbmV0d29yayBjb25maWd1cmF0aW9uLlxuIik7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCX0KIAl9IHdoaWxlIChoID09IDApOwogCiAJaWYgKGggPiAwKQotCQlkcmJkZCh0Y29ubik7CisJCWRyYmRkKGNvbm5lY3Rpb24pOwogCi0JY29ubl9kaXNjb25uZWN0KHRjb25uKTsKKwljb25uX2Rpc2Nvbm5lY3QoY29ubmVjdGlvbik7CiAKLQljb25uX2luZm8odGNvbm4sICJyZWNlaXZlciB0ZXJtaW5hdGVkXG4iKTsKKwlkcmJkX2luZm8oY29ubmVjdGlvbiwgInJlY2VpdmVyIHRlcm1pbmF0ZWRcbiIpOwogCXJldHVybiAwOwogfQogCiAvKiAqKioqKioqKiogYWNrbm93bGVkZ2Ugc2VuZGVyICoqKioqKioqICovCiAKLXN0YXRpYyBpbnQgZ290X2Nvbm5fUnFTUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfY29ubl9ScVNSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXN0cnVjdCBwX3JlcV9zdGF0ZV9yZXBseSAqcCA9IHBpLT5kYXRhOwogCWludCByZXRjb2RlID0gYmUzMl90b19jcHUocC0+cmV0Y29kZSk7CiAKIAlpZiAocmV0Y29kZSA+PSBTU19TVUNDRVNTKSB7Ci0JCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJnRjb25uLT5mbGFncyk7CisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAl9IGVsc2UgewotCQlzZXRfYml0KENPTk5fV0RfU1RfQ0hHX0ZBSUwsICZ0Y29ubi0+ZmxhZ3MpOwotCQljb25uX2Vycih0Y29ubiwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfRkFJTCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCiAJCQkgZHJiZF9zZXRfc3RfZXJyX3N0cihyZXRjb2RlKSwgcmV0Y29kZSk7CiAJfQotCXdha2VfdXAoJnRjb25uLT5waW5nX3dhaXQpOworCXdha2VfdXAoJmNvbm5lY3Rpb24tPnBpbmdfd2FpdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfUnFTUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfUnFTUmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgKnAgPSBwaS0+ZGF0YTsKIAlpbnQgcmV0Y29kZSA9IGJlMzJfdG9fY3B1KHAtPnJldGNvZGUpOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlpZiAodGVzdF9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmdGNvbm4tPmZsYWdzKSkgewotCQlEX0FTU0VSVCh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKTsKLQkJcmV0dXJuIGdvdF9jb25uX1JxU1JlcGx5KHRjb25uLCBwaSk7CisJaWYgKHRlc3RfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKSkgeworCQlEX0FTU0VSVChkZXZpY2UsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCk7CisJCXJldHVybiBnb3RfY29ubl9ScVNSZXBseShjb25uZWN0aW9uLCBwaSk7CiAJfQogCiAJaWYgKHJldGNvZGUgPj0gU1NfU1VDQ0VTUykgewotCQlzZXRfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmZGV2aWNlLT5mbGFncyk7CiAJfSBlbHNlIHsKLQkJc2V0X2JpdChDTF9TVF9DSEdfRkFJTCwgJm1kZXYtPmZsYWdzKTsKLQkJZGV2X2VycihERVYsICJSZXF1ZXN0ZWQgc3RhdGUgY2hhbmdlIGZhaWxlZCBieSBwZWVyOiAlcyAoJWQpXG4iLAorCQlzZXRfYml0KENMX1NUX0NIR19GQUlMLCAmZGV2aWNlLT5mbGFncyk7CisJCWRyYmRfZXJyKGRldmljZSwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCiAJCQlkcmJkX3NldF9zdF9lcnJfc3RyKHJldGNvZGUpLCByZXRjb2RlKTsKIAl9Ci0Jd2FrZV91cCgmbWRldi0+c3RhdGVfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5zdGF0ZV93YWl0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdvdF9QaW5nKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X1Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlyZXR1cm4gZHJiZF9zZW5kX3BpbmdfYWNrKHRjb25uKTsKKwlyZXR1cm4gZHJiZF9zZW5kX3BpbmdfYWNrKGNvbm5lY3Rpb24pOwogCiB9CiAKLXN0YXRpYyBpbnQgZ290X1BpbmdBY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfUGluZ0FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCS8qIHJlc3RvcmUgaWRsZSB0aW1lb3V0ICovCi0JdGNvbm4tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSB0Y29ubi0+bmV0X2NvbmYtPnBpbmdfaW50KkhaOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChHT1RfUElOR19BQ0ssICZ0Y29ubi0+ZmxhZ3MpKQotCQl3YWtlX3VwKCZ0Y29ubi0+cGluZ193YWl0KTsKKwljb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gY29ubmVjdGlvbi0+bmV0X2NvbmYtPnBpbmdfaW50KkhaOworCWlmICghdGVzdF9hbmRfc2V0X2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncykpCisJCXdha2VfdXAoJmNvbm5lY3Rpb24tPnBpbmdfd2FpdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfSXNJblN5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfSXNJblN5bmMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCWludCBibGtzaXplID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCURfQVNTRVJUKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODkpOworCURfQVNTRVJUKGRldmljZSwgcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSk7CiAKLQl1cGRhdGVfcGVlcl9zZXEobWRldiwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOworCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIGJsa3NpemUpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOworCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgc2VjdG9yLCBibGtzaXplKTsKIAkJLyogcnNfc2FtZV9jc3VtcyBpcyBzdXBwb3NlZCB0byBjb3VudCBpbiB1bml0cyBvZiBCTV9CTE9DS19TSVpFICovCi0JCW1kZXYtPnJzX3NhbWVfY3N1bSArPSAoYmxrc2l6ZSA+PiBCTV9CTE9DS19TSElGVCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlkZXZpY2UtPnJzX3NhbWVfY3N1bSArPSAoYmxrc2l6ZSA+PiBCTV9CTE9DS19TSElGVCk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQotCWRlY19yc19wZW5kaW5nKG1kZXYpOwotCWF0b21pY19hZGQoYmxrc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJZGVjX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwlhdG9taWNfYWRkKGJsa3NpemUgPj4gOSwgJmRldmljZS0+cnNfc2VjdF9pbik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IGlkLCBzZWN0b3JfdCBzZWN0b3IsCit2YWxpZGF0ZV9yZXFfY2hhbmdlX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdTY0IGlkLCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkgICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgY29uc3QgY2hhciAqZnVuYywKIAkJCSAgICAgIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwgYm9vbCBtaXNzaW5nX29rKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlyZXEgPSBmaW5kX3JlcXVlc3QobWRldiwgcm9vdCwgaWQsIHNlY3RvciwgbWlzc2luZ19vaywgZnVuYyk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlcSA9IGZpbmRfcmVxdWVzdChkZXZpY2UsIHJvb3QsIGlkLCBzZWN0b3IsIG1pc3Npbmdfb2ssIGZ1bmMpOwogCWlmICh1bmxpa2VseSghcmVxKSkgewotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJX19yZXFfbW9kKHJlcSwgd2hhdCwgJm0pOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWlmIChtLmJpbykKLQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7CisJCWNvbXBsZXRlX21hc3Rlcl9iaW8oZGV2aWNlLCAmbSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X0Jsb2NrQWNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X0Jsb2NrQWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IHBfYmxvY2tfYWNrICpwID0gcGktPmRhdGE7CiAJc2VjdG9yX3Qgc2VjdG9yID0gYmU2NF90b19jcHUocC0+c2VjdG9yKTsKIAlpbnQgYmxrc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPmJsa3NpemUpOwogCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdDsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpIHsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIGJsa3NpemUpOwotCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHNlY3RvciwgYmxrc2l6ZSk7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAlzd2l0Y2ggKHBpLT5jbWQpIHsKQEAgLTUwMTMsMzMgKzUwNzEsMzUgQEAKIAkJQlVHKCk7CiAJfQogCi0JcmV0dXJuIHZhbGlkYXRlX3JlcV9jaGFuZ2VfcmVxX3N0YXRlKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCi0JCQkJCSAgICAgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBfX2Z1bmNfXywKKwlyZXR1cm4gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoZGV2aWNlLCBwLT5ibG9ja19pZCwgc2VjdG9yLAorCQkJCQkgICAgICZkZXZpY2UtPndyaXRlX3JlcXVlc3RzLCBfX2Z1bmNfXywKIAkJCQkJICAgICB3aGF0LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ0FjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9OZWdBY2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCWludCBzaXplID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAJaW50IGVycjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpIHsKLQkJZGVjX3JzX3BlbmRpbmcobWRldik7Ci0JCWRyYmRfcnNfZmFpbGVkX2lvKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CisJCWRyYmRfcnNfZmFpbGVkX2lvKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZXJyID0gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUobWRldiwgcC0+YmxvY2tfaWQsIHNlY3RvciwKLQkJCQkJICAgICZtZGV2LT53cml0ZV9yZXF1ZXN0cywgX19mdW5jX18sCisJZXJyID0gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoZGV2aWNlLCBwLT5ibG9ja19pZCwgc2VjdG9yLAorCQkJCQkgICAgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIF9fZnVuY19fLAogCQkJCQkgICAgTkVHX0FDS0VELCB0cnVlKTsKIAlpZiAoZXJyKSB7CiAJCS8qIFByb3RvY29sIEEgaGFzIG5vIFBfV1JJVEVfQUNLcywgYnV0IGhhcyBQX05FR19BQ0tzLgpAQCAtNTA0Nyw4MCArNTEwNyw4NiBAQAogCQkgICByZXF1ZXN0IGlzIG5vIGxvbmdlciBpbiB0aGUgY29sbGlzaW9uIGhhc2guICovCiAJCS8qIEluIFByb3RvY29sIEIgd2UgbWlnaHQgYWxyZWFkeSBoYXZlIGdvdCBhIFBfUkVDVl9BQ0sKIAkJICAgYnV0IHRoZW4gZ2V0IGEgUF9ORUdfQUNLIGFmdGVyd2FyZHMuICovCi0JCWRyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ0RSZXBseShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9OZWdEUmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQl1cGRhdGVfcGVlcl9zZXEobWRldiwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOworCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOwogCi0JZGV2X2VycihERVYsICJHb3QgTmVnRFJlcGx5OyBTZWN0b3IgJWxsdXMsIGxlbiAldS5cbiIsCisJZHJiZF9lcnIoZGV2aWNlLCAiR290IE5lZ0RSZXBseTsgU2VjdG9yICVsbHVzLCBsZW4gJXUuXG4iLAogCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOwogCi0JcmV0dXJuIHZhbGlkYXRlX3JlcV9jaGFuZ2VfcmVxX3N0YXRlKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCi0JCQkJCSAgICAgJm1kZXYtPnJlYWRfcmVxdWVzdHMsIF9fZnVuY19fLAorCXJldHVybiB2YWxpZGF0ZV9yZXFfY2hhbmdlX3JlcV9zdGF0ZShkZXZpY2UsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCisJCQkJCSAgICAgJmRldmljZS0+cmVhZF9yZXF1ZXN0cywgX19mdW5jX18sCiAJCQkJCSAgICAgTkVHX0FDS0VELCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ1JTRFJlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X05lZ1JTRFJlcGx5KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCWludCBzaXplOwogCXN0cnVjdCBwX2Jsb2NrX2FjayAqcCA9IHBpLT5kYXRhOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKIAlzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCXNpemUgPSBiZTMyX3RvX2NwdShwLT5ibGtzaXplKTsKIAotCXVwZGF0ZV9wZWVyX3NlcShtZGV2LCBiZTMyX3RvX2NwdShwLT5zZXFfbnVtKSk7CisJdXBkYXRlX3BlZXJfc2VxKHBlZXJfZGV2aWNlLCBiZTMyX3RvX2NwdShwLT5zZXFfbnVtKSk7CiAKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkgewotCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHNlY3Rvcik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOwogCQlzd2l0Y2ggKHBpLT5jbWQpIHsKIAkJY2FzZSBQX05FR19SU19EUkVQTFk6Ci0JCQlkcmJkX3JzX2ZhaWxlZF9pbyhtZGV2LCBzZWN0b3IsIHNpemUpOworCQkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogCQljYXNlIFBfUlNfQ0FOQ0VMOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfQmFycmllckFjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9CYXJyaWVyQWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7CiAJc3RydWN0IHBfYmFycmllcl9hY2sgKnAgPSBwaS0+ZGF0YTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCi0JdGxfcmVsZWFzZSh0Y29ubiwgcC0+YmFycmllciwgYmUzMl90b19jcHUocC0+c2V0X3NpemUpKTsKKwl0bF9yZWxlYXNlKGNvbm5lY3Rpb24sIHAtPmJhcnJpZXIsIGJlMzJfdG9fY3B1KHAtPnNldF9zaXplKSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQUhFQUQgJiYKLQkJICAgIGF0b21pY19yZWFkKCZtZGV2LT5hcF9pbl9mbGlnaHQpID09IDAgJiYKLQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKLQkJCWFkZF90aW1lcigmbWRldi0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0FIRUFEICYmCisJCSAgICBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9pbl9mbGlnaHQpID09IDAgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCQlhZGRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKIAkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTUxMjgsOTAgKzUxOTQsOTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfT1ZSZXN1bHQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfT1ZSZXN1bHQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKLQlzdHJ1Y3QgZHJiZF93b3JrICp3OworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdzsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJaW50IHNpemU7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAJc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPmJsa3NpemUpOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChiZTY0X3RvX2NwdShwLT5ibG9ja19pZCkgPT0gSURfT1VUX09GX1NZTkMpCi0JCWRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChkZXZpY2UsIHNlY3Rvciwgc2l6ZSk7CiAJZWxzZQotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKIAotCWlmICghZ2V0X2xkZXYobWRldikpCisJaWYgKCFnZXRfbGRldihkZXZpY2UpKQogCQlyZXR1cm4gMDsKIAotCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JLS1tZGV2LT5vdl9sZWZ0OworCS0tZGV2aWNlLT5vdl9sZWZ0OwogCiAJLyogbGV0J3MgYWR2YW5jZSBwcm9ncmVzcyBzdGVwIG1hcmtzIG9ubHkgZm9yIGV2ZXJ5IG90aGVyIG1lZ2FieXRlICovCi0JaWYgKChtZGV2LT5vdl9sZWZ0ICYgMHgyMDApID09IDB4MjAwKQotCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MobWRldiwgbWRldi0+b3ZfbGVmdCk7CisJaWYgKChkZXZpY2UtPm92X2xlZnQgJiAweDIwMCkgPT0gMHgyMDApCisJCWRyYmRfYWR2YW5jZV9yc19tYXJrcyhkZXZpY2UsIGRldmljZS0+b3ZfbGVmdCk7CiAKLQlpZiAobWRldi0+b3ZfbGVmdCA9PSAwKSB7Ci0JCXcgPSBrbWFsbG9jKHNpemVvZigqdyksIEdGUF9OT0lPKTsKLQkJaWYgKHcpIHsKLQkJCXctPmNiID0gd19vdl9maW5pc2hlZDsKLQkJCXctPm1kZXYgPSBtZGV2OwotCQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssIHcpOworCWlmIChkZXZpY2UtPm92X2xlZnQgPT0gMCkgeworCQlkdyA9IGttYWxsb2Moc2l6ZW9mKCpkdyksIEdGUF9OT0lPKTsKKwkJaWYgKGR3KSB7CisJCQlkdy0+dy5jYiA9IHdfb3ZfZmluaXNoZWQ7CisJCQlkdy0+ZGV2aWNlID0gZGV2aWNlOworCQkJZHJiZF9xdWV1ZV93b3JrKCZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZkdy0+dyk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKERFViwgImttYWxsb2ModykgZmFpbGVkLiIpOwotCQkJb3Zfb3V0X29mX3N5bmNfcHJpbnQobWRldik7Ci0JCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2MoZHcpIGZhaWxlZC4iKTsKKwkJCW92X291dF9vZl9zeW5jX3ByaW50KGRldmljZSk7CisJCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQl9CiAJfQotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X3NraXAoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3Rfc2tpcChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjb25uX2ZpbmlzaF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yLCBub3RfZW1wdHkgPSAwOwogCiAJZG8gewotCQljbGVhcl9iaXQoU0lHTkFMX0FTRU5ERVIsICZ0Y29ubi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoU0lHTkFMX0FTRU5ERVIsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlpZiAoZHJiZF9maW5pc2hfcGVlcl9yZXFzKG1kZXYpKSB7Ci0JCQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQkJaWYgKGRyYmRfZmluaXNoX3BlZXJfcmVxcyhkZXZpY2UpKSB7CisJCQkJa3JlZl9wdXQoJmRldmljZS0+a3JlZiwgZHJiZF9kZXN0cm95X2RldmljZSk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9Ci0JCQlrcmVmX3B1dCgmbWRldi0+a3JlZiwgJmRyYmRfbWlub3JfZGVzdHJveSk7CisJCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJCXJjdV9yZWFkX2xvY2soKTsKIAkJfQotCQlzZXRfYml0KFNJR05BTF9BU0VOREVSLCAmdGNvbm4tPmZsYWdzKTsKKwkJc2V0X2JpdChTSUdOQUxfQVNFTkRFUiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCW5vdF9lbXB0eSA9ICFsaXN0X2VtcHR5KCZtZGV2LT5kb25lX2VlKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJCW5vdF9lbXB0eSA9ICFsaXN0X2VtcHR5KCZkZXZpY2UtPmRvbmVfZWUpOwogCQkJaWYgKG5vdF9lbXB0eSkKIAkJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfSB3aGlsZSAobm90X2VtcHR5KTsKIApAQCAtNTIyMCw3ICs1MjkwLDcgQEAKIAogc3RydWN0IGFzZW5kZXJfY21kIHsKIAlzaXplX3QgcGt0X3NpemU7Ci0JaW50ICgqZm4pKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICopOworCWludCAoKmZuKShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CiB9OwogCiBzdGF0aWMgc3RydWN0IGFzZW5kZXJfY21kIGFzZW5kZXJfdGJsW10gPSB7CkBAIC01MjQ1LDEzICs1MzE1LDEzIEBACiAKIGludCBkcmJkX2FzZW5kZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gdGhpLT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdGhpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBhc2VuZGVyX2NtZCAqY21kID0gTlVMTDsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJaW50IHJ2OwotCXZvaWQgKmJ1ZiAgICA9IHRjb25uLT5tZXRhLnJidWY7CisJdm9pZCAqYnVmICAgID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCWludCByZWNlaXZlZCA9IDA7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZSh0Y29ubik7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKTsKIAlpbnQgZXhwZWN0ICAgPSBoZWFkZXJfc2l6ZTsKIAlib29sIHBpbmdfdGltZW91dF9hY3RpdmUgPSBmYWxzZTsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwpAQCAtNTI2MCw0NSArNTMzMCw0NSBAQAogCiAJcnYgPSBzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfUlIsICZwYXJhbSk7CiAJaWYgKHJ2IDwgMCkKLQkJY29ubl9lcnIodGNvbm4sICJkcmJkX2FzZW5kZXI6IEVSUk9SIHNldCBwcmlvcml0eSwgcmV0PSVkXG4iLCBydik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJkcmJkX2FzZW5kZXI6IEVSUk9SIHNldCBwcmlvcml0eSwgcmV0PSVkXG4iLCBydik7CiAKIAl3aGlsZSAoZ2V0X3Rfc3RhdGUodGhpKSA9PSBSVU5OSU5HKSB7CiAJCWRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdSh0aGkpOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwkJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCQlwaW5nX3RpbWVvID0gbmMtPnBpbmdfdGltZW87CiAJCXRjcF9jb3JrID0gbmMtPnRjcF9jb3JrOwogCQlwaW5nX2ludCA9IG5jLT5waW5nX2ludDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTRU5EX1BJTkcsICZ0Y29ubi0+ZmxhZ3MpKSB7Ci0JCQlpZiAoZHJiZF9zZW5kX3BpbmcodGNvbm4pKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICJkcmJkX3NlbmRfcGluZyBoYXMgZmFpbGVkXG4iKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTRU5EX1BJTkcsICZjb25uZWN0aW9uLT5mbGFncykpIHsKKwkJCWlmIChkcmJkX3NlbmRfcGluZyhjb25uZWN0aW9uKSkgeworCQkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJkcmJkX3NlbmRfcGluZyBoYXMgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCX0KLQkJCXRjb25uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gcGluZ190aW1lbyAqIEhaIC8gMTA7CisJCQljb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gcGluZ190aW1lbyAqIEhaIC8gMTA7CiAJCQlwaW5nX3RpbWVvdXRfYWN0aXZlID0gdHJ1ZTsKIAkJfQogCiAJCS8qIFRPRE86IGNvbmRpdGlvbmFsbHkgY29yazsgaXQgbWF5IGh1cnQgbGF0ZW5jeSBpZiB3ZSBjb3JrIHdpdGhvdXQKIAkJICAgbXVjaCB0byBzZW5kICovCiAJCWlmICh0Y3BfY29yaykKLQkJCWRyYmRfdGNwX2NvcmsodGNvbm4tPm1ldGEuc29ja2V0KTsKLQkJaWYgKHRjb25uX2ZpbmlzaF9wZWVyX3JlcXModGNvbm4pKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgInRjb25uX2ZpbmlzaF9wZWVyX3JlcXMoKSBmYWlsZWRcbiIpOworCQkJZHJiZF90Y3BfY29yayhjb25uZWN0aW9uLT5tZXRhLnNvY2tldCk7CisJCWlmIChjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoY29ubmVjdGlvbikpIHsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoKSBmYWlsZWRcbiIpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAkJLyogYnV0IHVuY29uZGl0aW9uYWxseSB1bmNvcmsgdW5sZXNzIGRpc2FibGVkICovCiAJCWlmICh0Y3BfY29yaykKLQkJCWRyYmRfdGNwX3VuY29yayh0Y29ubi0+bWV0YS5zb2NrZXQpOworCQkJZHJiZF90Y3BfdW5jb3JrKGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0KTsKIAogCQkvKiBzaG9ydCBjaXJjdWl0LCByZWN2X21zZyB3b3VsZCByZXR1cm4gRUlOVFIgYW55d2F5cy4gKi8KIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJY29udGludWU7CiAKLQkJcnYgPSBkcmJkX3JlY3Zfc2hvcnQodGNvbm4tPm1ldGEuc29ja2V0LCBidWYsIGV4cGVjdC1yZWNlaXZlZCwgMCk7Ci0JCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJnRjb25uLT5mbGFncyk7CisJCXJ2ID0gZHJiZF9yZWN2X3Nob3J0KGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LCBidWYsIGV4cGVjdC1yZWNlaXZlZCwgMCk7CisJCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCkBAIC01MzE2LDUxICs1Mzg2LDUxIEBACiAJCQlyZWNlaXZlZCArPSBydjsKIAkJCWJ1ZgkgKz0gcnY7CiAJCX0gZWxzZSBpZiAocnYgPT0gMCkgewotCQkJaWYgKHRlc3RfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncykpIHsKKwkJCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykpIHsKIAkJCQlsb25nIHQ7CiAJCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJCXQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbyAqIEhaLzEwOworCQkJCXQgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpLT5waW5nX3RpbWVvICogSFovMTA7CiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRjb25uLT5waW5nX3dhaXQsCi0JCQkJCQkgICAgICAgdGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUywKKwkJCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KGNvbm5lY3Rpb24tPnBpbmdfd2FpdCwKKwkJCQkJCSAgICAgICBjb25uZWN0aW9uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMsCiAJCQkJCQkgICAgICAgdCk7CiAJCQkJaWYgKHQpCiAJCQkJCWJyZWFrOwogCQkJfQotCQkJY29ubl9lcnIodGNvbm4sICJtZXRhIGNvbm5lY3Rpb24gc2h1dCBkb3duIGJ5IHBlZXIuXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJtZXRhIGNvbm5lY3Rpb24gc2h1dCBkb3duIGJ5IHBlZXIuXG4iKTsKIAkJCWdvdG8gcmVjb25uZWN0OwogCQl9IGVsc2UgaWYgKHJ2ID09IC1FQUdBSU4pIHsKIAkJCS8qIElmIHRoZSBkYXRhIHNvY2tldCByZWNlaXZlZCBzb21ldGhpbmcgbWVhbndoaWxlLAogCQkJICogdGhhdCBpcyBnb29kIGVub3VnaDogcGVlciBpcyBzdGlsbCBhbGl2ZS4gKi8KLQkJCWlmICh0aW1lX2FmdGVyKHRjb25uLT5sYXN0X3JlY2VpdmVkLAotCQkJCWppZmZpZXMgLSB0Y29ubi0+bWV0YS5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbykpCisJCQlpZiAodGltZV9hZnRlcihjb25uZWN0aW9uLT5sYXN0X3JlY2VpdmVkLAorCQkJCWppZmZpZXMgLSBjb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvKSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChwaW5nX3RpbWVvdXRfYWN0aXZlKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICJQaW5nQWNrIGRpZCBub3QgYXJyaXZlIGluIHRpbWUuXG4iKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiUGluZ0FjayBkaWQgbm90IGFycml2ZSBpbiB0aW1lLlxuIik7CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9Ci0JCQlzZXRfYml0KFNFTkRfUElORywgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KFNFTkRfUElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKHJ2ID09IC1FSU5UUikgewogCQkJY29udGludWU7CiAJCX0gZWxzZSB7Ci0JCQljb25uX2Vycih0Y29ubiwgInNvY2tfcmVjdm1zZyByZXR1cm5lZCAlZFxuIiwgcnYpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgInNvY2tfcmVjdm1zZyByZXR1cm5lZCAlZFxuIiwgcnYpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAogCQlpZiAocmVjZWl2ZWQgPT0gZXhwZWN0ICYmIGNtZCA9PSBOVUxMKSB7Ci0JCQlpZiAoZGVjb2RlX2hlYWRlcih0Y29ubiwgdGNvbm4tPm1ldGEucmJ1ZiwgJnBpKSkKKwkJCWlmIChkZWNvZGVfaGVhZGVyKGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm1ldGEucmJ1ZiwgJnBpKSkKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCWNtZCA9ICZhc2VuZGVyX3RibFtwaS5jbWRdOwogCQkJaWYgKHBpLmNtZCA+PSBBUlJBWV9TSVpFKGFzZW5kZXJfdGJsKSB8fCAhY21kLT5mbikgewotCQkJCWNvbm5fZXJyKHRjb25uLCAiVW5leHBlY3RlZCBtZXRhIHBhY2tldCAlcyAoMHglMDR4KVxuIiwKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiVW5leHBlY3RlZCBtZXRhIHBhY2tldCAlcyAoMHglMDR4KVxuIiwKIAkJCQkJIGNtZG5hbWUocGkuY21kKSwgcGkuY21kKTsKIAkJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCQl9CiAJCQlleHBlY3QgPSBoZWFkZXJfc2l6ZSArIGNtZC0+cGt0X3NpemU7CiAJCQlpZiAocGkuc2l6ZSAhPSBleHBlY3QgLSBoZWFkZXJfc2l6ZSkgewotCQkJCWNvbm5fZXJyKHRjb25uLCAiV3JvbmcgcGFja2V0IHNpemUgb24gbWV0YSAoYzogJWQsIGw6ICVkKVxuIiwKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiV3JvbmcgcGFja2V0IHNpemUgb24gbWV0YSAoYzogJWQsIGw6ICVkKVxuIiwKIAkJCQkJcGkuY21kLCBwaS5zaXplKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCX0KQEAgLTUzNjgsMjEgKzU0MzgsMjEgQEAKIAkJaWYgKHJlY2VpdmVkID09IGV4cGVjdCkgewogCQkJYm9vbCBlcnI7CiAKLQkJCWVyciA9IGNtZC0+Zm4odGNvbm4sICZwaSk7CisJCQllcnIgPSBjbWQtPmZuKGNvbm5lY3Rpb24sICZwaSk7CiAJCQlpZiAoZXJyKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICIlcGYgZmFpbGVkXG4iLCBjbWQtPmZuKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiJXBmIGZhaWxlZFxuIiwgY21kLT5mbik7CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9CiAKLQkJCXRjb25uLT5sYXN0X3JlY2VpdmVkID0gamlmZmllczsKKwkJCWNvbm5lY3Rpb24tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOwogCiAJCQlpZiAoY21kID09ICZhc2VuZGVyX3RibFtQX1BJTkdfQUNLXSkgewogCQkJCS8qIHJlc3RvcmUgaWRsZSB0aW1lb3V0ICovCi0JCQkJdGNvbm4tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBwaW5nX2ludCAqIEhaOworCQkJCWNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBwaW5nX2ludCAqIEhaOwogCQkJCXBpbmdfdGltZW91dF9hY3RpdmUgPSBmYWxzZTsKIAkJCX0KIAotCQkJYnVmCSA9IHRjb25uLT5tZXRhLnJidWY7CisJCQlidWYJID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCQkJcmVjZWl2ZWQgPSAwOwogCQkJZXhwZWN0CSA9IGhlYWRlcl9zaXplOwogCQkJY21kCSA9IE5VTEw7CkBAIC01MzkxLDE2ICs1NDYxLDE2IEBACiAKIAlpZiAoMCkgewogcmVjb25uZWN0OgotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfTkVUV09SS19GQUlMVVJFKSwgQ1NfSEFSRCk7Ci0JCWNvbm5fbWRfc3luYyh0Y29ubik7CisJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX05FVFdPUktfRkFJTFVSRSksIENTX0hBUkQpOworCQljb25uX21kX3N5bmMoY29ubmVjdGlvbik7CiAJfQogCWlmICgwKSB7CiBkaXNjb25uZWN0OgotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJfQotCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJnRjb25uLT5mbGFncyk7CisJY2xlYXJfYml0KFNJR05BTF9BU0VOREVSLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCi0JY29ubl9pbmZvKHRjb25uLCAiYXNlbmRlciB0ZXJtaW5hdGVkXG4iKTsKKwlkcmJkX2luZm8oY29ubmVjdGlvbiwgImFzZW5kZXIgdGVybWluYXRlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKaW5kZXggMTA0YTA0MC4uMzc3OWM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKQEAgLTMxLDM3ICszMSwzNyBAQAogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKIAotc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKTsKK3N0YXRpYyBib29sIGRyYmRfbWF5X2RvX2xvY2FsX3JlYWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpOwogCiAvKiBVcGRhdGUgZGlzayBzdGF0cyBhdCBzdGFydCBvZiBJL08gcmVxdWVzdCAqLwotc3RhdGljIHZvaWQgX2RyYmRfc3RhcnRfaW9fYWNjdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCitzdGF0aWMgdm9pZCBfZHJiZF9zdGFydF9pb19hY2N0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2Jpbyk7CiAJaW50IGNwdTsKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnRfcm91bmRfc3RhdHMoY3B1LCAmbWRldi0+dmRpc2stPnBhcnQwKTsKLQlwYXJ0X3N0YXRfaW5jKGNwdSwgJm1kZXYtPnZkaXNrLT5wYXJ0MCwgaW9zW3J3XSk7Ci0JcGFydF9zdGF0X2FkZChjcHUsICZtZGV2LT52ZGlzay0+cGFydDAsIHNlY3RvcnNbcnddLCByZXEtPmkuc2l6ZSA+PiA5KTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwKTsKKwlwYXJ0X3N0YXRfaW5jKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCBzZWN0b3JzW3J3XSwgcmVxLT5pLnNpemUgPj4gOSk7CiAJKHZvaWQpIGNwdTsgLyogVGhlIG1hY3JvIGludm9jYXRpb25zIGFib3ZlIHdhbnQgdGhlIGNwdSBhcmd1bWVudCwgSSBkbyBub3QgbGlrZQogCQkgICAgICAgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgY3B1IG9ubHkgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQuLi4gKi8KLQlwYXJ0X2luY19pbl9mbGlnaHQoJm1kZXYtPnZkaXNrLT5wYXJ0MCwgcncpOworCXBhcnRfaW5jX2luX2ZsaWdodCgmZGV2aWNlLT52ZGlzay0+cGFydDAsIHJ3KTsKIAlwYXJ0X3N0YXRfdW5sb2NrKCk7CiB9CiAKIC8qIFVwZGF0ZSBkaXNrIHN0YXRzIHdoZW4gY29tcGxldGluZyByZXF1ZXN0IHVwd2FyZHMgKi8KLXN0YXRpYyB2b2lkIF9kcmJkX2VuZF9pb19hY2N0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIF9kcmJkX2VuZF9pb19hY2N0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CiAJaW50IHJ3ID0gYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2Jpbyk7CiAJdW5zaWduZWQgbG9uZyBkdXJhdGlvbiA9IGppZmZpZXMgLSByZXEtPnN0YXJ0X3RpbWU7CiAJaW50IGNwdTsKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnRfc3RhdF9hZGQoY3B1LCAmbWRldi0+dmRpc2stPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKLQlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJm1kZXYtPnZkaXNrLT5wYXJ0MCk7Ci0JcGFydF9kZWNfaW5fZmxpZ2h0KCZtZGV2LT52ZGlzay0+cGFydDAsIHJ3KTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwKTsKKwlwYXJ0X2RlY19pbl9mbGlnaHQoJmRldmljZS0+dmRpc2stPnBhcnQwLCBydyk7CiAJcGFydF9zdGF0X3VubG9jaygpOwogfQogCi1zdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqZHJiZF9yZXFfbmV3KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqZHJiZF9yZXFfbmV3KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgICAgc3RydWN0IGJpbyAqYmlvX3NyYykKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXE7CkBAIC03Miw3ICs3Miw3IEBACiAKIAlkcmJkX3JlcV9tYWtlX3ByaXZhdGVfYmlvKHJlcSwgYmlvX3NyYyk7CiAJcmVxLT5ycV9zdGF0ZSAgICA9IGJpb19kYXRhX2RpcihiaW9fc3JjKSA9PSBXUklURSA/IFJRX1dSSVRFIDogMDsKLQlyZXEtPncubWRldiAgICAgID0gbWRldjsKKwlyZXEtPmRldmljZSAgID0gZGV2aWNlOwogCXJlcS0+bWFzdGVyX2JpbyAgPSBiaW9fc3JjOwogCXJlcS0+ZXBvY2ggICAgICAgPSAwOwogCkBAIC05NSwxNCArOTUsMTQgQEAKIHZvaWQgZHJiZF9yZXFfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfcmVxdWVzdCwga3JlZik7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJY29uc3QgdW5zaWduZWQgcyA9IHJlcS0+cnFfc3RhdGU7CiAKIAlpZiAoKHJlcS0+bWFzdGVyX2JpbyAmJiAhKHMgJiBSUV9QT1NUUE9ORUQpKSB8fAogCQlhdG9taWNfcmVhZCgmcmVxLT5jb21wbGV0aW9uX3JlZikgfHwKIAkJKHMgJiBSUV9MT0NBTF9QRU5ESU5HKSB8fAogCQkoKHMgJiBSUV9ORVRfTUFTSykgJiYgIShzICYgUlFfTkVUX0RPTkUpKSkgewotCQlkZXZfZXJyKERFViwgImRyYmRfcmVxX2Rlc3Ryb3k6IExvZ2ljIEJVRyBycV9zdGF0ZSA9IDB4JXgsIGNvbXBsZXRpb25fcmVmID0gJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2Rlc3Ryb3k6IExvZ2ljIEJVRyBycV9zdGF0ZSA9IDB4JXgsIGNvbXBsZXRpb25fcmVmID0gJWRcbiIsCiAJCQkJcywgYXRvbWljX3JlYWQoJnJlcS0+Y29tcGxldGlvbl9yZWYpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzMiwxMCArMTMyLDEwIEBACiAJCSAqLwogCQlpZiAoKHMgJiAoUlFfUE9TVFBPTkVEfFJRX0xPQ0FMX01BU0t8UlFfTkVUX01BU0spKSAhPSBSUV9QT1NUUE9ORUQpIHsKIAkJCWlmICghKHMgJiBSUV9ORVRfT0spIHx8ICEocyAmIFJRX0xPQ0FMX09LKSkKLQkJCQlkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CisJCQkJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CiAKIAkJCWlmICgocyAmIFJRX05FVF9PSykgJiYgKHMgJiBSUV9MT0NBTF9PSykgJiYgKHMgJiBSUV9ORVRfU0lTKSkKLQkJCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplKTsKKwkJCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwogCQl9CiAKIAkJLyogb25lIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gbW92ZSB0aGUgZHJiZF9hbF9jb21wbGV0ZV9pbwpAQCAtMTQ5LDExICsxNDksMTEgQEAKIAkJICogd2Ugd291bGQgZm9yZ2V0IHRvIHJlc3luYyB0aGUgY29ycmVzcG9uZGluZyBleHRlbnQuCiAJCSAqLwogCQlpZiAocyAmIFJRX0lOX0FDVF9MT0cpIHsKLQkJCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsKLQkJCQlkcmJkX2FsX2NvbXBsZXRlX2lvKG1kZXYsICZyZXEtPmkpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhkZXZpY2UsICZyZXEtPmkpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQl9IGVsc2UgaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpIHsKLQkJCQlkZXZfd2FybihERVYsICJTaG91bGQgaGF2ZSBjYWxsZWQgZHJiZF9hbF9jb21wbGV0ZV9pbygsICVsbHUsICV1KSwgIgorCQkJCWRyYmRfd2FybihkZXZpY2UsICJTaG91bGQgaGF2ZSBjYWxsZWQgZHJiZF9hbF9jb21wbGV0ZV9pbygsICVsbHUsICV1KSwgIgogCQkJCQkgImJ1dCBteSBEaXNrIHNlZW1zIHRvIGhhdmUgZmFpbGVkIDooXG4iLAogCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwogCQkJfQpAQCAtMTYzLDQxICsxNjMsNDIgQEAKIAltZW1wb29sX2ZyZWUocmVxLCBkcmJkX3JlcXVlc3RfbWVtcG9vbCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdha2VfYWxsX3NlbmRlcnMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKSB7Ci0Jd2FrZV91cCgmdGNvbm4tPnNlbmRlcl93b3JrLnFfd2FpdCk7CitzdGF0aWMgdm9pZCB3YWtlX2FsbF9zZW5kZXJzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJd2FrZV91cCgmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucV93YWl0KTsKIH0KIAogLyogbXVzdCBob2xkIHJlc291cmNlLT5yZXFfbG9jayAqLwotdm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAkvKiBubyBwb2ludCBjbG9zaW5nIGFuIGVwb2NoLCBpZiBpdCBpcyBlbXB0eSwgYW55d2F5cy4gKi8KLQlpZiAodGNvbm4tPmN1cnJlbnRfdGxlX3dyaXRlcyA9PSAwKQorCWlmIChjb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPT0gMCkKIAkJcmV0dXJuOwogCi0JdGNvbm4tPmN1cnJlbnRfdGxlX3dyaXRlcyA9IDA7Ci0JYXRvbWljX2luYygmdGNvbm4tPmN1cnJlbnRfdGxlX25yKTsKLQl3YWtlX2FsbF9zZW5kZXJzKHRjb25uKTsKKwljb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPSAwOworCWF0b21pY19pbmMoJmNvbm5lY3Rpb24tPmN1cnJlbnRfdGxlX25yKTsKKwl3YWtlX2FsbF9zZW5kZXJzKGNvbm5lY3Rpb24pOwogfQogCi12b2lkIGNvbXBsZXRlX21hc3Rlcl9iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3ZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7CiAJYmlvX2VuZGlvKG0tPmJpbywgbS0+ZXJyb3IpOwotCWRlY19hcF9iaW8obWRldik7CisJZGVjX2FwX2JpbyhkZXZpY2UpOwogfQogCiAKIHN0YXRpYyB2b2lkIGRyYmRfcmVtb3ZlX3JlcXVlc3RfaW50ZXJ2YWwoc3RydWN0IHJiX3Jvb3QgKnJvb3QsCiAJCQkJCSBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkgPSAmcmVxLT5pOwogCiAJZHJiZF9yZW1vdmVfaW50ZXJ2YWwocm9vdCwgaSk7CiAKIAkvKiBXYWtlIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgdGhpcyByZXF1ZXN0IHRvIGNvbXBsZXRlLiAgKi8KIAlpZiAoaS0+d2FpdGluZykKLQkJd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogfQogCiAvKiBIZWxwZXIgZm9yIF9fcmVxX21vZCgpLgpAQCAtMjEwLDcgKzIxMSw3IEBACiB2b2lkIGRyYmRfcmVxX2NvbXBsZXRlKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7CiAJY29uc3QgdW5zaWduZWQgcyA9IHJlcS0+cnFfc3RhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJaW50IHJ3OwogCWludCBlcnJvciwgb2s7CiAKQEAgLTIyNiwxMiArMjI3LDEyIEBACiAJaWYgKChzICYgUlFfTE9DQUxfUEVORElORyAmJiAhKHMgJiBSUV9MT0NBTF9BQk9SVEVEKSkgfHwKIAkgICAgKHMgJiBSUV9ORVRfUVVFVUVEKSB8fCAocyAmIFJRX05FVF9QRU5ESU5HKSB8fAogCSAgICAocyAmIFJRX0NPTVBMRVRJT05fU1VTUCkpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3JlcV9jb21wbGV0ZTogTG9naWMgQlVHIHJxX3N0YXRlID0gMHgleFxuIiwgcyk7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2NvbXBsZXRlOiBMb2dpYyBCVUcgcnFfc3RhdGUgPSAweCV4XG4iLCBzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICghcmVxLT5tYXN0ZXJfYmlvKSB7Ci0JCWRldl9lcnIoREVWLCAiZHJiZF9yZXFfY29tcGxldGU6IExvZ2ljIEJVRywgbWFzdGVyX2JpbyA9PSBOVUxMIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2NvbXBsZXRlOiBMb2dpYyBCVUcsIG1hc3Rlcl9iaW8gPT0gTlVMTCFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNTksOSArMjYwLDkgQEAKIAkJc3RydWN0IHJiX3Jvb3QgKnJvb3Q7CiAKIAkJaWYgKHJ3ID09IFdSSVRFKQotCQkJcm9vdCA9ICZtZGV2LT53cml0ZV9yZXF1ZXN0czsKKwkJCXJvb3QgPSAmZGV2aWNlLT53cml0ZV9yZXF1ZXN0czsKIAkJZWxzZQotCQkJcm9vdCA9ICZtZGV2LT5yZWFkX3JlcXVlc3RzOworCQkJcm9vdCA9ICZkZXZpY2UtPnJlYWRfcmVxdWVzdHM7CiAJCWRyYmRfcmVtb3ZlX3JlcXVlc3RfaW50ZXJ2YWwocm9vdCwgcmVxKTsKIAl9CiAKQEAgLTI3MywxMSArMjc0LDExIEBACiAJICogYW5kIHJlc2V0IHRoZSB0cmFuc2ZlciBsb2cgZXBvY2ggd3JpdGVfY250LgogCSAqLwogCWlmIChydyA9PSBXUklURSAmJgotCSAgICByZXEtPmVwb2NoID09IGF0b21pY19yZWFkKCZtZGV2LT50Y29ubi0+Y3VycmVudF90bGVfbnIpKQotCQlzdGFydF9uZXdfdGxfZXBvY2gobWRldi0+dGNvbm4pOworCSAgICByZXEtPmVwb2NoID09IGF0b21pY19yZWFkKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV9ucikpCisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCS8qIFVwZGF0ZSBkaXNrIHN0YXRzICovCi0JX2RyYmRfZW5kX2lvX2FjY3QobWRldiwgcmVxKTsKKwlfZHJiZF9lbmRfaW9fYWNjdChkZXZpY2UsIHJlcSk7CiAKIAkvKiBJZiBSRUFEIGZhaWxlZCwKIAkgKiBoYXZlIGl0IGJlIHB1c2hlZCBiYWNrIHRvIHRoZSByZXRyeSB3b3JrIHF1ZXVlLApAQCAtMzA1LDggKzMwNiw4IEBACiAKIHN0YXRpYyBpbnQgZHJiZF9yZXFfcHV0X2NvbXBsZXRpb25fcmVmKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGJpb19hbmRfZXJyb3IgKm0sIGludCBwdXQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OwotCURfQVNTRVJUKG0gfHwgKHJlcS0+cnFfc3RhdGUgJiBSUV9QT1NUUE9ORUQpKTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCURfQVNTRVJUKGRldmljZSwgbSB8fCAocmVxLT5ycV9zdGF0ZSAmIFJRX1BPU1RQT05FRCkpOwogCiAJaWYgKCFhdG9taWNfc3ViX2FuZF90ZXN0KHB1dCwgJnJlcS0+Y29tcGxldGlvbl9yZWYpKQogCQlyZXR1cm4gMDsKQEAgLTMyOCwxMiArMzI5LDEyIEBACiBzdGF0aWMgdm9pZCBtb2RfcnFfc3RhdGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSwKIAkJaW50IGNsZWFyLCBpbnQgc2V0KQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXVuc2lnbmVkIHMgPSByZXEtPnJxX3N0YXRlOwogCWludCBjX3B1dCA9IDA7CiAJaW50IGtfcHV0ID0gMDsKIAotCWlmIChkcmJkX3N1c3BlbmRlZChtZGV2KSAmJiAhKChzIHwgY2xlYXIpICYgUlFfQ09NUExFVElPTl9TVVNQKSkKKwlpZiAoZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSAmJiAhKChzIHwgY2xlYXIpICYgUlFfQ09NUExFVElPTl9TVVNQKSkKIAkJc2V0IHw9IFJRX0NPTVBMRVRJT05fU1VTUDsKIAogCS8qIGFwcGx5ICovCkBAIC0zNTEsNyArMzUyLDcgQEAKIAkJYXRvbWljX2luYygmcmVxLT5jb21wbGV0aW9uX3JlZik7CiAKIAlpZiAoIShzICYgUlFfTkVUX1BFTkRJTkcpICYmIChzZXQgJiBSUV9ORVRfUEVORElORykpIHsKLQkJaW5jX2FwX3BlbmRpbmcobWRldik7CisJCWluY19hcF9wZW5kaW5nKGRldmljZSk7CiAJCWF0b21pY19pbmMoJnJlcS0+Y29tcGxldGlvbl9yZWYpOwogCX0KIApAQCAtMzYyLDcgKzM2Myw3IEBACiAJCWtyZWZfZ2V0KCZyZXEtPmtyZWYpOyAvKiB3YWl0IGZvciB0aGUgRE9ORSAqLwogCiAJaWYgKCEocyAmIFJRX05FVF9TRU5UKSAmJiAoc2V0ICYgUlFfTkVUX1NFTlQpKQotCQlhdG9taWNfYWRkKHJlcS0+aS5zaXplID4+IDksICZtZGV2LT5hcF9pbl9mbGlnaHQpOworCQlhdG9taWNfYWRkKHJlcS0+aS5zaXplID4+IDksICZkZXZpY2UtPmFwX2luX2ZsaWdodCk7CiAKIAlpZiAoIShzICYgUlFfQ09NUExFVElPTl9TVVNQKSAmJiAoc2V0ICYgUlFfQ09NUExFVElPTl9TVVNQKSkKIAkJYXRvbWljX2luYygmcmVxLT5jb21wbGV0aW9uX3JlZik7CkBAIC0zNzMsNyArMzc0LDcgQEAKIAkJKytjX3B1dDsKIAogCWlmICghKHMgJiBSUV9MT0NBTF9BQk9SVEVEKSAmJiAoc2V0ICYgUlFfTE9DQUxfQUJPUlRFRCkpIHsKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX1BFTkRJTkcpOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9QRU5ESU5HKTsKIAkJLyogbG9jYWwgY29tcGxldGlvbiBtYXkgc3RpbGwgY29tZSBpbiBsYXRlciwKIAkJICogd2UgbmVlZCB0byBrZWVwIHRoZSByZXEgb2JqZWN0IGFyb3VuZC4gKi8KIAkJa3JlZl9nZXQoJnJlcS0+a3JlZik7CkBAIC0zODgsNyArMzg5LDcgQEAKIAl9CiAKIAlpZiAoKHMgJiBSUV9ORVRfUEVORElORykgJiYgKGNsZWFyICYgUlFfTkVUX1BFTkRJTkcpKSB7Ci0JCWRlY19hcF9wZW5kaW5nKG1kZXYpOworCQlkZWNfYXBfcGVuZGluZyhkZXZpY2UpOwogCQkrK2NfcHV0OwogCX0KIApAQCAtMzk3LDcgKzM5OCw3IEBACiAKIAlpZiAoKHMgJiBSUV9FWFBfQkFSUl9BQ0spICYmICEocyAmIFJRX05FVF9ET05FKSAmJiAoc2V0ICYgUlFfTkVUX0RPTkUpKSB7CiAJCWlmIChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1NFTlQpCi0JCQlhdG9taWNfc3ViKHJlcS0+aS5zaXplID4+IDksICZtZGV2LT5hcF9pbl9mbGlnaHQpOworCQkJYXRvbWljX3N1YihyZXEtPmkuc2l6ZSA+PiA5LCAmZGV2aWNlLT5hcF9pbl9mbGlnaHQpOwogCQkrK2tfcHV0OwogCX0KIApAQCAtNDA5LDE0ICs0MTAsMTQgQEAKIAkJaW50IGF0X2xlYXN0ID0ga19wdXQgKyAhIWNfcHV0OwogCQlpbnQgcmVmY291bnQgPSBhdG9taWNfcmVhZCgmcmVxLT5rcmVmLnJlZmNvdW50KTsKIAkJaWYgKHJlZmNvdW50IDwgYXRfbGVhc3QpCi0JCQlkZXZfZXJyKERFViwKKwkJCWRyYmRfZXJyKGRldmljZSwKIAkJCQkibW9kX3JxX3N0YXRlOiBMb2dpYyBCVUc6ICV4IC0+ICV4OiByZWZjb3VudCA9ICVkLCBzaG91bGQgYmUgPj0gJWRcbiIsCiAJCQkJcywgcmVxLT5ycV9zdGF0ZSwgcmVmY291bnQsIGF0X2xlYXN0KTsKIAl9CiAKIAkvKiBJZiB3ZSBtYWRlIHByb2dyZXNzLCByZXRyeSBjb25mbGljdGluZyBwZWVyIHJlcXVlc3RzLCBpZiBhbnkuICovCiAJaWYgKHJlcS0+aS53YWl0aW5nKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAKIAlpZiAoY19wdXQpCiAJCWtfcHV0ICs9IGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZihyZXEsIG0sIGNfcHV0KTsKQEAgLTQyNCwxOCArNDI1LDE4IEBACiAJCWtyZWZfc3ViKCZyZXEtPmtyZWYsIGtfcHV0LCBkcmJkX3JlcV9kZXN0cm95KTsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9yZXBvcnRfaW9fZXJyb3Ioc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgZHJiZF9yZXBvcnRfaW9fZXJyb3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKICAgICAgICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCiAJaWYgKCFfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQogCQlyZXR1cm47CiAKLQlkZXZfd2FybihERVYsICJsb2NhbCAlcyBJTyBlcnJvciBzZWN0b3IgJWxsdSsldSBvbiAlc1xuIiwKKwlkcmJkX3dhcm4oZGV2aWNlLCAibG9jYWwgJXMgSU8gZXJyb3Igc2VjdG9yICVsbHUrJXUgb24gJXNcbiIsCiAJCQkocmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFKSA/ICJXUklURSIgOiAiUkVBRCIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+aS5zZWN0b3IsCiAJCQlyZXEtPmkuc2l6ZSA+PiA5LAotCQkJYmRldm5hbWUobWRldi0+bGRldi0+YmFja2luZ19iZGV2LCBiKSk7CisJCQliZGV2bmFtZShkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldiwgYikpOwogfQogCiAvKiBvYnZpb3VzbHkgdGhpcyBjb3VsZCBiZSBjb2RlZCBhcyBtYW55IHNpbmdsZSBmdW5jdGlvbnMKQEAgLTQ1Myw3ICs0NTQsNyBAQAogaW50IF9fcmVxX21vZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgcCwgcnYgPSAwOwogCkBAIC00NjIsNyArNDYzLDcgQEAKIAogCXN3aXRjaCAod2hhdCkgewogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoREVWLCAiTE9HSUMgQlVHIGluICVzOiV1XG4iLCBfX0ZJTEVfXyAsIF9fTElORV9fKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiTE9HSUMgQlVHIGluICVzOiV1XG4iLCBfX0ZJTEVfXyAsIF9fTElORV9fKTsKIAkJYnJlYWs7CiAKIAkvKiBkb2VzIG5vdCBoYXBwZW4uLi4KQEAgLTQ3NCw5ICs0NzUsOSBAQAogCWNhc2UgVE9fQkVfU0VOVDogLyogdmlhIG5ldHdvcmsgKi8KIAkJLyogcmVhY2hlZCB2aWEgX19kcmJkX21ha2VfcmVxdWVzdAogCQkgKiBhbmQgZnJvbSB3X3JlYWRfcmV0cnlfcmVtb3RlICovCi0JCURfQVNTRVJUKCEocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9NQVNLKSk7CisJCURfQVNTRVJUKGRldmljZSwgIShyZXEtPnJxX3N0YXRlICYgUlFfTkVUX01BU0spKTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCXAgPSBuYy0+d2lyZV9wcm90b2NvbDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJlcS0+cnFfc3RhdGUgfD0KQEAgLTQ4NywxNSArNDg4LDE1IEBACiAKIAljYXNlIFRPX0JFX1NVQk1JVFRFRDogLyogbG9jYWxseSAqLwogCQkvKiByZWFjaGVkIHZpYSBfX2RyYmRfbWFrZV9yZXF1ZXN0ICovCi0JCURfQVNTRVJUKCEocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX01BU0spKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCAhKHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9NQVNLKSk7CiAJCW1vZF9ycV9zdGF0ZShyZXEsIG0sIDAsIFJRX0xPQ0FMX1BFTkRJTkcpOwogCQlicmVhazsKIAogCWNhc2UgQ09NUExFVEVEX09LOgogCQlpZiAocmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFKQotCQkJbWRldi0+d3JpdF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKKwkJCWRldmljZS0+d3JpdF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKIAkJZWxzZQotCQkJbWRldi0+cmVhZF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKKwkJCWRldmljZS0+cmVhZF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKIAogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9MT0NBTF9QRU5ESU5HLAogCQkJCVJRX0xPQ0FMX0NPTVBMRVRFRHxSUV9MT0NBTF9PSyk7CkBAIC01MDYsMTUgKzUwNywxNSBAQAogCQlicmVhazsKIAogCWNhc2UgV1JJVEVfQ09NUExFVEVEX1dJVEhfRVJST1I6Ci0JCWRyYmRfcmVwb3J0X2lvX2Vycm9yKG1kZXYsIHJlcSk7Ci0JCV9fZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgRFJCRF9XUklURV9FUlJPUik7CisJCWRyYmRfcmVwb3J0X2lvX2Vycm9yKGRldmljZSwgcmVxKTsKKwkJX19kcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIERSQkRfV1JJVEVfRVJST1IpOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9MT0NBTF9QRU5ESU5HLCBSUV9MT0NBTF9DT01QTEVURUQpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9DT01QTEVURURfV0lUSF9FUlJPUjoKLQkJZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwotCQlkcmJkX3JlcG9ydF9pb19lcnJvcihtZGV2LCByZXEpOwotCQlfX2RyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIERSQkRfUkVBRF9FUlJPUik7CisJCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOworCQlkcmJkX3JlcG9ydF9pb19lcnJvcihkZXZpY2UsIHJlcSk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX1JFQURfRVJST1IpOwogCQkvKiBmYWxsIHRocm91Z2guICovCiAJY2FzZSBSRUFEX0FIRUFEX0NPTVBMRVRFRF9XSVRIX0VSUk9SOgogCQkvKiBpdCBpcyBsZWdhbCB0byBmYWlsIFJFQURBLCBubyBfX2RyYmRfY2hrX2lvX2Vycm9yIGluIHRoYXQgY2FzZS4gKi8KQEAgLTUzMiwxNiArNTMzLDE3IEBACiAJCS8qIFNvIHdlIGNhbiB2ZXJpZnkgdGhlIGhhbmRsZSBpbiB0aGUgYW5zd2VyIHBhY2tldC4KIAkJICogQ29ycmVzcG9uZGluZyBkcmJkX3JlbW92ZV9yZXF1ZXN0X2ludGVydmFsIGlzIGluCiAJCSAqIGRyYmRfcmVxX2NvbXBsZXRlKCkgKi8KLQkJRF9BU1NFUlQoZHJiZF9pbnRlcnZhbF9lbXB0eSgmcmVxLT5pKSk7Ci0JCWRyYmRfaW5zZXJ0X2ludGVydmFsKCZtZGV2LT5yZWFkX3JlcXVlc3RzLCAmcmVxLT5pKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkcmJkX2ludGVydmFsX2VtcHR5KCZyZXEtPmkpKTsKKwkJZHJiZF9pbnNlcnRfaW50ZXJ2YWwoJmRldmljZS0+cmVhZF9yZXF1ZXN0cywgJnJlcS0+aSk7CiAKLQkJc2V0X2JpdChVTlBMVUdfUkVNT1RFLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFVOUExVR19SRU1PVEUsICZkZXZpY2UtPmZsYWdzKTsKIAotCQlEX0FTU0VSVChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOwotCQlEX0FTU0VSVCgocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX01BU0spID09IDApOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgKHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9NQVNLKSA9PSAwKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgMCwgUlFfTkVUX1FVRVVFRCk7CiAJCXJlcS0+dy5jYiA9IHdfc2VuZF9yZWFkX3JlcTsKLQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZyZXEtPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZyZXEtPncpOwogCQlicmVhazsKIAogCWNhc2UgUVVFVUVfRk9SX05FVF9XUklURToKQEAgLTU1MCw4ICs1NTIsOCBAQAogCiAJCS8qIENvcnJlc3BvbmRpbmcgZHJiZF9yZW1vdmVfcmVxdWVzdF9pbnRlcnZhbCBpcyBpbgogCQkgKiBkcmJkX3JlcV9jb21wbGV0ZSgpICovCi0JCURfQVNTRVJUKGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnJlcS0+aSkpOwotCQlkcmJkX2luc2VydF9pbnRlcnZhbCgmbWRldi0+d3JpdGVfcmVxdWVzdHMsICZyZXEtPmkpOworCQlEX0FTU0VSVChkZXZpY2UsIGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnJlcS0+aSkpOworCQlkcmJkX2luc2VydF9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgJnJlcS0+aSk7CiAKIAkJLyogTk9URQogCQkgKiBJbiBjYXNlIHRoZSByZXEgZW5kZWQgdXAgb24gdGhlIHRyYW5zZmVyIGxvZyBiZWZvcmUgYmVpbmcKQEAgLTU3MCwyOCArNTcyLDMwIEBACiAJCS8qIG90aGVyd2lzZSB3ZSBtYXkgbG9zZSBhbiB1bnBsdWcsIHdoaWNoIG1heSBjYXVzZSBzb21lIHJlbW90ZQogCQkgKiBpby1zY2hlZHVsZXIgdGltZW91dCB0byBleHBpcmUsIGluY3JlYXNpbmcgbWF4aW11bSBsYXRlbmN5LAogCQkgKiBodXJ0aW5nIHBlcmZvcm1hbmNlLiAqLwotCQlzZXRfYml0KFVOUExVR19SRU1PVEUsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoVU5QTFVHX1JFTU9URSwgJmRldmljZS0+ZmxhZ3MpOwogCiAJCS8qIHF1ZXVlIHdvcmsgaXRlbSB0byBzZW5kIGRhdGEgKi8KLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCByZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCAwLCBSUV9ORVRfUVVFVUVEfFJRX0VYUF9CQVJSX0FDSyk7CiAJCXJlcS0+dy5jYiA9ICB3X3NlbmRfZGJsb2NrOwotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnJlcS0+dyk7CisJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJnJlcS0+dyk7CiAKIAkJLyogY2xvc2UgdGhlIGVwb2NoLCBpbiBjYXNlIGl0IG91dGdyZXcgdGhlIGxpbWl0ICovCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwkJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCQlwID0gbmMtPm1heF9lcG9jaF9zaXplOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKG1kZXYtPnRjb25uLT5jdXJyZW50X3RsZV93cml0ZXMgPj0gcCkKLQkJCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPj0gcCkKKwkJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCQlicmVhazsKIAogCWNhc2UgUVVFVUVfRk9SX1NFTkRfT09TOgogCQltb2RfcnFfc3RhdGUocmVxLCBtLCAwLCBSUV9ORVRfUVVFVUVEKTsKIAkJcmVxLT53LmNiID0gIHdfc2VuZF9vdXRfb2Zfc3luYzsKLQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZyZXEtPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZyZXEtPncpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9SRVRSWV9SRU1PVEVfQ0FOQ0VMRUQ6CkBAIC02MzksMTUgKzY0MywxNSBAQAogCQkgKiBJZiB0aGlzIHJlcXVlc3QgaGFkIGJlZW4gbWFya2VkIGFzIFJRX1BPU1RQT05FRCBiZWZvcmUsCiAJCSAqIGl0IHdpbGwgYWN0dWFsbHkgbm90IGJlIGNvbXBsZXRlZCwgYnV0ICJyZXN0YXJ0ZWQiLAogCQkgKiByZXN1Ym1pdHRlZCBmcm9tIHRoZSByZXRyeSB3b3JrZXIgY29udGV4dC4gKi8KLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9ORVRfUEVORElORywgUlFfTkVUX0RPTkV8UlFfTkVUX09LKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdSSVRFX0FDS0VEX0JZX1BFRVJfQU5EX1NJUzoKIAkJcmVxLT5ycV9zdGF0ZSB8PSBSUV9ORVRfU0lTOwogCWNhc2UgV1JJVEVfQUNLRURfQllfUEVFUjoKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKTsKIAkJLyogcHJvdG9jb2wgQzsgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gb24gcGVlci4KIAkJICogTm90aGluZyBtb3JlIHRvIGRvIGhlcmUuCiAJCSAqIFdlIHdhbnQgdG8ga2VlcCB0aGUgdGwgaW4gcGxhY2UgZm9yIGFsbCBwcm90b2NvbHMsIHRvIGNhdGVyCkBAIC02NTUsMjUgKzY1OSwyNSBAQAogCiAJCWdvdG8gYWNrX2NvbW1vbjsKIAljYXNlIFJFQ1ZfQUNLRURfQllfUEVFUjoKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9SRUNFSVZFX0FDSyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9SRUNFSVZFX0FDSyk7CiAJCS8qIHByb3RvY29sIEI7IHByZXRlbmRzIHRvIGJlIHN1Y2Nlc3NmdWxseSB3cml0dGVuIG9uIHBlZXIuCiAJCSAqIHNlZSBhbHNvIG5vdGVzIGFib3ZlIGluIEhBTkRFRF9PVkVSX1RPX05FVFdPUksgYWJvdXQKIAkJICogcHJvdG9jb2wgIT0gQyAqLwogCWFja19jb21tb246Ci0JCURfQVNTRVJUKHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfTkVUX1BFTkRJTkcsIFJRX05FVF9PSyk7CiAJCWJyZWFrOwogCiAJY2FzZSBQT1NUUE9ORV9XUklURToKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKTsKIAkJLyogSWYgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGRldGVjdGVkIHRoZSB3cml0ZSBjb25mbGljdCwgdGhlCiAJCSAqIHdvcmtlciB3aWxsIGJlIHdhaXRpbmcgb24gbWlzY193YWl0LiAgV2FrZSBpdCB1cCBvbmNlIHRoaXMKIAkJICogcmVxdWVzdCBoYXMgY29tcGxldGVkIGxvY2FsbHkuCiAJCSAqLwotCQlEX0FTU0VSVChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CiAJCXJlcS0+cnFfc3RhdGUgfD0gUlFfUE9TVFBPTkVEOwogCQlpZiAocmVxLT5pLndhaXRpbmcpCi0JCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCQkvKiBEbyBub3QgY2xlYXIgUlFfTkVUX1BFTkRJTkcuIFRoaXMgcmVxdWVzdCB3aWxsIG1ha2UgZnVydGhlcgogCQkgKiBwcm9ncmVzcyB2aWEgcmVzdGFydF9jb25mbGljdGluZ193cml0ZXMoKSBvcgogCQkgKiBmYWlsX3Bvc3Rwb25lZF9yZXF1ZXN0cygpLiBIb3BlZnVsbHkuICovCkBAIC03MDEsOSArNzA1LDEwIEBACiAJCWlmIChiaW9fZGF0YV9kaXIocmVxLT5tYXN0ZXJfYmlvKSA9PSBXUklURSkKIAkJCXJ2ID0gTVJfV1JJVEU7CiAKLQkJZ2V0X2xkZXYobWRldik7IC8qIGFsd2F5cyBzdWNjZWVkcyBpbiB0aGlzIGNhbGwgcGF0aCAqLworCQlnZXRfbGRldihkZXZpY2UpOyAvKiBhbHdheXMgc3VjY2VlZHMgaW4gdGhpcyBjYWxsIHBhdGggKi8KIAkJcmVxLT53LmNiID0gd19yZXN0YXJ0X2Rpc2tfaW87Ci0JCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmcmVxLT53KTsKKwkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkmcmVxLT53KTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFU0VORDoKQEAgLTcxOSwxMiArNzI0LDEzIEBACiAJCSAgIFRocm93aW5nIHRoZW0gb3V0IG9mIHRoZSBUTCBoZXJlIGJ5IHByZXRlbmRpbmcgd2UgZ290IGEgQkFSUklFUl9BQ0suCiAJCSAgIER1cmluZyBjb25uZWN0aW9uIGhhbmRzaGFrZSwgd2UgZW5zdXJlIHRoYXQgdGhlIHBlZXIgd2FzIG5vdCByZWJvb3RlZC4gKi8KIAkJaWYgKCEocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9PSykpIHsKLQkJCS8qIEZJWE1FIGNvdWxkIHRoaXMgcG9zc2libHkgYmUgYSByZXEtPncuY2IgPT0gd19zZW5kX291dF9vZl9zeW5jPworCQkJLyogRklYTUUgY291bGQgdGhpcyBwb3NzaWJseSBiZSBhIHJlcS0+ZHcuY2IgPT0gd19zZW5kX291dF9vZl9zeW5jPwogCQkJICogaW4gdGhhdCBjYXNlIHdlIG11c3Qgbm90IHNldCBSUV9ORVRfUEVORElORy4gKi8KIAogCQkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfQ09NUExFVElPTl9TVVNQLCBSUV9ORVRfUVVFVUVEfFJRX05FVF9QRU5ESU5HKTsKIAkJCWlmIChyZXEtPncuY2IpIHsKLQkJCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnJlcS0+dyk7CisJCQkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSZyZXEtPncpOwogCQkJCXJ2ID0gcmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFID8gTVJfV1JJVEUgOiBNUl9SRUFEOwogCQkJfSAvKiBlbHNlOiBGSVhNRSBjYW4gdGhpcyBoYXBwZW4/ICovCiAJCQlicmVhazsKQEAgLTc0MCw3ICs3NDYsNyBAQAogCQkJLyogYmFycmllciBjYW1lIGluIGJlZm9yZSBhbGwgcmVxdWVzdHMgd2VyZSBhY2tlZC4KIAkJCSAqIHRoaXMgaXMgYmFkLCBiZWNhdXNlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGxvc3Qgbm93LAogCQkJICogd2Ugd29uJ3QgYmUgYWJsZSB0byBjbGVhbiB0aGVtIHVwLi4uICovCi0JCQlkZXZfZXJyKERFViwgIkZJWE1FIChCQVJSSUVSX0FDS0VEIGJ1dCBwZW5kaW5nKVxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSAoQkFSUklFUl9BQ0tFRCBidXQgcGVuZGluZylcbiIpOwogCQl9CiAJCS8qIEFsbG93ZWQgdG8gY29tcGxldGUgcmVxdWVzdHMsIGV2ZW4gd2hpbGUgc3VzcGVuZGVkLgogCQkgKiBBcyB0aGlzIGlzIGNhbGxlZCBmb3IgYWxsIHJlcXVlc3RzIHdpdGhpbiBhIG1hdGNoaW5nIGVwb2NoLApAQCAtNzUxLDEyICs3NTcsMTIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIERBVEFfUkVDRUlWRUQ6Ci0JCURfQVNTRVJUKHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfTkVUX1BFTkRJTkcsIFJRX05FVF9PS3xSUV9ORVRfRE9ORSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRVUVVRV9BU19EUkJEX0JBUlJJRVI6Ci0JCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgMCwgUlFfTkVUX09LfFJRX05FVF9ET05FKTsKIAkJYnJlYWs7CiAJfTsKQEAgLTc3MSwyNyArNzc3LDI3IEBACiAgKiAgIHNpbmNlIHNpemUgbWF5IGJlIGJpZ2dlciB0aGFuIEJNX0JMT0NLX1NJWkUsCiAgKiAgIHdlIG1heSBuZWVkIHRvIGNoZWNrIHNldmVyYWwgYml0cy4KICAqLwotc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQorc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHNibnIsIGVibnI7CiAJc2VjdG9yX3QgZXNlY3RvciwgbnJfc2VjdG9yczsKIAotCWlmIChtZGV2LT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSkKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSkKIAkJcmV0dXJuIHRydWU7Ci0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9JTkNPTlNJU1RFTlQpCisJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0lOQ09OU0lTVEVOVCkKIAkJcmV0dXJuIGZhbHNlOwogCWVzZWN0b3IgPSBzZWN0b3IgKyAoc2l6ZSA+PiA5KSAtIDE7Ci0JbnJfc2VjdG9ycyA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7Ci0JRF9BU1NFUlQoc2VjdG9yICA8IG5yX3NlY3RvcnMpOwotCURfQVNTRVJUKGVzZWN0b3IgPCBucl9zZWN0b3JzKTsKKwlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOworCURfQVNTRVJUKGRldmljZSwgc2VjdG9yICA8IG5yX3NlY3RvcnMpOworCURfQVNTRVJUKGRldmljZSwgZXNlY3RvciA8IG5yX3NlY3RvcnMpOwogCiAJc2JuciA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJZWJuciA9IEJNX1NFQ1RfVE9fQklUKGVzZWN0b3IpOwogCi0JcmV0dXJuIGRyYmRfYm1fY291bnRfYml0cyhtZGV2LCBzYm5yLCBlYm5yKSA9PSAwOworCXJldHVybiBkcmJkX2JtX2NvdW50X2JpdHMoZGV2aWNlLCBzYm5yLCBlYm5yKSA9PSAwOwogfQogCi1zdGF0aWMgYm9vbCByZW1vdGVfZHVlX3RvX3JlYWRfYmFsYW5jaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwKK3N0YXRpYyBib29sIHJlbW90ZV9kdWVfdG9fcmVhZF9iYWxhbmNpbmcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJZW51bSBkcmJkX3JlYWRfYmFsYW5jaW5nIHJibSkKIHsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwpAQCAtNzk5LDExICs4MDUsMTEgQEAKIAogCXN3aXRjaCAocmJtKSB7CiAJY2FzZSBSQl9DT05HRVNURURfUkVNT1RFOgotCQliZGkgPSAmbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mbzsKKwkJYmRpID0gJmRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mbzsKIAkJcmV0dXJuIGJkaV9yZWFkX2Nvbmdlc3RlZChiZGkpOwogCWNhc2UgUkJfTEVBU1RfUEVORElORzoKLQkJcmV0dXJuIGF0b21pY19yZWFkKCZtZGV2LT5sb2NhbF9jbnQpID4KLQkJCWF0b21pY19yZWFkKCZtZGV2LT5hcF9wZW5kaW5nX2NudCkgKyBhdG9taWNfcmVhZCgmbWRldi0+cnNfcGVuZGluZ19jbnQpOworCQlyZXR1cm4gYXRvbWljX3JlYWQoJmRldmljZS0+bG9jYWxfY250KSA+CisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgKyBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiAJY2FzZSBSQl8zMktfU1RSSVBJTkc6ICAvKiBzdHJpcGVfc2hpZnQgPSAxNSAqLwogCWNhc2UgUkJfNjRLX1NUUklQSU5HOgogCWNhc2UgUkJfMTI4S19TVFJJUElORzoKQEAgLTgxMyw3ICs4MTksNyBAQAogCQlzdHJpcGVfc2hpZnQgPSAocmJtIC0gUkJfMzJLX1NUUklQSU5HICsgMTUpOwogCQlyZXR1cm4gKHNlY3RvciA+PiAoc3RyaXBlX3NoaWZ0IC0gOSkpICYgMTsKIAljYXNlIFJCX1JPVU5EX1JPQklOOgotCQlyZXR1cm4gdGVzdF9hbmRfY2hhbmdlX2JpdChSRUFEX0JBTEFOQ0VfUlIsICZtZGV2LT5mbGFncyk7CisJCXJldHVybiB0ZXN0X2FuZF9jaGFuZ2VfYml0KFJFQURfQkFMQU5DRV9SUiwgJmRldmljZS0+ZmxhZ3MpOwogCWNhc2UgUkJfUFJFRkVSX1JFTU9URToKIAkJcmV0dXJuIHRydWU7CiAJY2FzZSBSQl9QUkVGRVJfTE9DQUw6CkBAIC04MzQsNzMgKzg0MCw3MyBAQAogc3RhdGljIHZvaWQgY29tcGxldGVfY29uZmxpY3Rpbmdfd3JpdGVzKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKIAlzZWN0b3JfdCBzZWN0b3IgPSByZXEtPmkuc2VjdG9yOwogCWludCBzaXplID0gcmVxLT5pLnNpemU7CiAKLQlpID0gZHJiZF9maW5kX292ZXJsYXAoJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpOworCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKTsKIAlpZiAoIWkpCiAJCXJldHVybjsKIAogCWZvciAoOzspIHsKLQkJcHJlcGFyZV90b193YWl0KCZtZGV2LT5taXNjX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmbWRldi0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5taXNjX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKTsKIAkJaWYgKCFpKQogCQkJYnJlYWs7CiAJCS8qIEluZGljYXRlIHRvIHdha2UgdXAgZGV2aWNlLT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLwogCQlpLT53YWl0aW5nID0gdHJ1ZTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJc2NoZWR1bGUoKTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCX0KLQlmaW5pc2hfd2FpdCgmbWRldi0+bWlzY193YWl0LCAmd2FpdCk7CisJZmluaXNoX3dhaXQoJmRldmljZS0+bWlzY193YWl0LCAmd2FpdCk7CiB9CiAKIC8qIGNhbGxlZCB3aXRoaW4gcmVxX2xvY2sgYW5kIHJjdV9yZWFkX2xvY2soKSAqLwotc3RhdGljIHZvaWQgbWF5YmVfcHVsbF9haGVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIHZvaWQgbWF5YmVfcHVsbF9haGVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCWJvb2wgY29uZ2VzdGVkID0gZmFsc2U7CiAJZW51bSBkcmJkX29uX2Nvbmdlc3Rpb24gb25fY29uZ2VzdGlvbjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAlvbl9jb25nZXN0aW9uID0gbmMgPyBuYy0+b25fY29uZ2VzdGlvbiA6IE9DX0JMT0NLOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmIChvbl9jb25nZXN0aW9uID09IE9DX0JMT0NLIHx8Ci0JICAgIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NikKKwkgICAgY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCiAJCXJldHVybjsKIAogCS8qIElmIEkgZG9uJ3QgZXZlbiBoYXZlIGdvb2QgbG9jYWwgc3RvcmFnZSwgd2UgY2FuIG5vdCByZWFzb25hYmx5IHRyeQogCSAqIHRvIHB1bGwgYWhlYWQgb2YgdGhlIHBlZXIuIFdlIGFsc28gbmVlZCB0aGUgbG9jYWwgcmVmZXJlbmNlIHRvIG1ha2UKLQkgKiBzdXJlIG1kZXYtPmFjdF9sb2cgaXMgdGhlcmUuCisJICogc3VyZSBkZXZpY2UtPmFjdF9sb2cgaXMgdGhlcmUuCiAJICovCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX1VQX1RPX0RBVEUpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX1VQX1RPX0RBVEUpKQogCQlyZXR1cm47CiAKIAlpZiAobmMtPmNvbmdfZmlsbCAmJgotCSAgICBhdG9taWNfcmVhZCgmbWRldi0+YXBfaW5fZmxpZ2h0KSA+PSBuYy0+Y29uZ19maWxsKSB7Ci0JCWRldl9pbmZvKERFViwgIkNvbmdlc3Rpb24tZmlsbCB0aHJlc2hvbGQgcmVhY2hlZFxuIik7CisJICAgIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2luX2ZsaWdodCkgPj0gbmMtPmNvbmdfZmlsbCkgeworCQlkcmJkX2luZm8oZGV2aWNlLCAiQ29uZ2VzdGlvbi1maWxsIHRocmVzaG9sZCByZWFjaGVkXG4iKTsKIAkJY29uZ2VzdGVkID0gdHJ1ZTsKIAl9CiAKLQlpZiAobWRldi0+YWN0X2xvZy0+dXNlZCA+PSBuYy0+Y29uZ19leHRlbnRzKSB7Ci0JCWRldl9pbmZvKERFViwgIkNvbmdlc3Rpb24tZXh0ZW50cyB0aHJlc2hvbGQgcmVhY2hlZFxuIik7CisJaWYgKGRldmljZS0+YWN0X2xvZy0+dXNlZCA+PSBuYy0+Y29uZ19leHRlbnRzKSB7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJDb25nZXN0aW9uLWV4dGVudHMgdGhyZXNob2xkIHJlYWNoZWRcbiIpOwogCQljb25nZXN0ZWQgPSB0cnVlOwogCX0KIAogCWlmIChjb25nZXN0ZWQpIHsKIAkJLyogc3RhcnQgYSBuZXcgZXBvY2ggZm9yIG5vbi1taXJyb3JlZCB3cml0ZXMgKi8KLQkJc3RhcnRfbmV3X3RsX2Vwb2NoKG1kZXYtPnRjb25uKTsKKwkJc3RhcnRfbmV3X3RsX2Vwb2NoKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCiAJCWlmIChvbl9jb25nZXN0aW9uID09IE9DX1BVTExfQUhFQUQpCi0JCQlfZHJiZF9zZXRfc3RhdGUoX05TKG1kZXYsIGNvbm4sIENfQUhFQUQpLCAwLCBOVUxMKTsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX0FIRUFEKSwgMCwgTlVMTCk7CiAJCWVsc2UgIC8qbmMtPm9uX2Nvbmdlc3Rpb24gPT0gT0NfRElTQ09OTkVDVCAqLwotCQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCAwLCBOVUxMKTsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCAwLCBOVUxMKTsKIAl9Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIH0KIAogLyogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCBhbmQgcmVxLT5wcml2YXRlX2JpbyBpcyBzdGlsbCBzZXQsCkBAIC05MTQsMTkgKzkyMCwxOSBAQAogICovCiBzdGF0aWMgYm9vbCBkb19yZW1vdGVfcmVhZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJZW51bSBkcmJkX3JlYWRfYmFsYW5jaW5nIHJibTsKIAogCWlmIChyZXEtPnByaXZhdGVfYmlvKSB7Ci0JCWlmICghZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChtZGV2LAorCQlpZiAoIWRyYmRfbWF5X2RvX2xvY2FsX3JlYWQoZGV2aWNlLAogCQkJCQlyZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSkpIHsKIAkJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCQlyZXEtPnByaXZhdGVfYmlvID0gTlVMTDsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5wZHNrICE9IERfVVBfVE9fREFURSkKKwlpZiAoZGV2aWNlLT5zdGF0ZS5wZHNrICE9IERfVVBfVE9fREFURSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHJlcS0+cHJpdmF0ZV9iaW8gPT0gTlVMTCkKQEAgLTkzNiwxNyArOTQyLDE3IEBACiAJICogcHJvdG9jb2wsIHBlbmRpbmcgcmVxdWVzdHMgZXRjLiAqLwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXJibSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5yZWFkX2JhbGFuY2luZzsKKwlyYm0gPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5yZWFkX2JhbGFuY2luZzsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChyYm0gPT0gUkJfUFJFRkVSX0xPQ0FMICYmIHJlcS0+cHJpdmF0ZV9iaW8pCiAJCXJldHVybiBmYWxzZTsgLyogc3VibWl0IGxvY2FsbHkgKi8KIAotCWlmIChyZW1vdGVfZHVlX3RvX3JlYWRfYmFsYW5jaW5nKG1kZXYsIHJlcS0+aS5zZWN0b3IsIHJibSkpIHsKKwlpZiAocmVtb3RlX2R1ZV90b19yZWFkX2JhbGFuY2luZyhkZXZpY2UsIHJlcS0+aS5zZWN0b3IsIHJibSkpIHsKIAkJaWYgKHJlcS0+cHJpdmF0ZV9iaW8pIHsKIAkJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCQlyZXEtPnByaXZhdGVfYmlvID0gTlVMTDsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC05NTksMTEgKzk2NSwxMSBAQAogICogd2hpY2ggZG9lcyBOT1QgaW5jbHVkZSB0aG9zZSB0aGF0IHdlIGFyZSBMX0FIRUFEIGZvci4gKi8KIHN0YXRpYyBpbnQgZHJiZF9wcm9jZXNzX3dyaXRlX3JlcXVlc3Qoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCWludCByZW1vdGUsIHNlbmRfb29zOwogCi0JcmVtb3RlID0gZHJiZF9zaG91bGRfZG9fcmVtb3RlKG1kZXYtPnN0YXRlKTsKLQlzZW5kX29vcyA9IGRyYmRfc2hvdWxkX3NlbmRfb3V0X29mX3N5bmMobWRldi0+c3RhdGUpOworCXJlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShkZXZpY2UtPnN0YXRlKTsKKwlzZW5kX29vcyA9IGRyYmRfc2hvdWxkX3NlbmRfb3V0X29mX3N5bmMoZGV2aWNlLT5zdGF0ZSk7CiAKIAkvKiBOZWVkIHRvIHJlcGxpY2F0ZSB3cml0ZXMuICBVbmxlc3MgaXQgaXMgYW4gZW1wdHkgZmx1c2gsCiAJICogd2hpY2ggaXMgYmV0dGVyIG1hcHBlZCB0byBhIERSQkQgUF9CQVJSSUVSIHBhY2tldCwKQEAgLTk3Myw3ICs5NzksNyBAQAogCSAqIHJlcGxpY2F0aW5nLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIG5vIHBvaW50LiAqLwogCWlmICh1bmxpa2VseShyZXEtPmkuc2l6ZSA9PSAwKSkgewogCQkvKiBUaGUgb25seSBzaXplPT0wIGJpb3Mgd2UgZXhwZWN0IGFyZSBlbXB0eSBmbHVzaGVzLiAqLwotCQlEX0FTU0VSVChyZXEtPm1hc3Rlcl9iaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCByZXEtPm1hc3Rlcl9iaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKIAkJaWYgKHJlbW90ZSkKIAkJCV9yZXFfbW9kKHJlcSwgUVVFVUVfQVNfRFJCRF9CQVJSSUVSKTsKIAkJcmV0dXJuIHJlbW90ZTsKQEAgLTk4MiwxMiArOTg4LDEyIEBACiAJaWYgKCFyZW1vdGUgJiYgIXNlbmRfb29zKQogCQlyZXR1cm4gMDsKIAotCURfQVNTRVJUKCEocmVtb3RlICYmIHNlbmRfb29zKSk7CisJRF9BU1NFUlQoZGV2aWNlLCAhKHJlbW90ZSAmJiBzZW5kX29vcykpOwogCiAJaWYgKHJlbW90ZSkgewogCQlfcmVxX21vZChyZXEsIFRPX0JFX1NFTlQpOwogCQlfcmVxX21vZChyZXEsIFFVRVVFX0ZPUl9ORVRfV1JJVEUpOwotCX0gZWxzZSBpZiAoZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpKQorCX0gZWxzZSBpZiAoZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSkpCiAJCV9yZXFfbW9kKHJlcSwgUVVFVUVfRk9SX1NFTkRfT09TKTsKIAogCXJldHVybiByZW1vdGU7CkBAIC05OTYsMzYgKzEwMDIsMzYgQEAKIHN0YXRpYyB2b2lkCiBkcmJkX3N1Ym1pdF9yZXFfcHJpdmF0ZV9iaW8oc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXN0cnVjdCBiaW8gKmJpbyA9IHJlcS0+cHJpdmF0ZV9iaW87CiAJY29uc3QgaW50IHJ3ID0gYmlvX3J3KGJpbyk7CiAKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAKIAkvKiBTdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIGdyYWJiZWQgb3VyIHJlZmVyZW5jZSBvbiB0aGUKIAkgKiAtPmxkZXYgbWVtYmVyLiBEb3VibGUgY2hlY2ssIGFuZCBzaG9ydC1jaXJjdWl0IHRvIGVuZGlvLgogCSAqIEluIGNhc2UgdGhlIGxhc3QgYWN0aXZpdHkgbG9nIHRyYW5zYWN0aW9uIGZhaWxlZCB0byBnZXQgb24KIAkgKiBzdGFibGUgc3RvcmFnZSwgYW5kIHRoaXMgaXMgYSBXUklURSwgd2UgbWF5IG5vdCBldmVuIHN1Ym1pdAogCSAqIHRoaXMgYmlvLiAqLwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLAogCQkJCSAgICAgIHJ3ID09IFdSSVRFID8gRFJCRF9GQVVMVF9EVF9XUgogCQkJCSAgICA6IHJ3ID09IFJFQUQgID8gRFJCRF9GQVVMVF9EVF9SRAogCQkJCSAgICA6ICAgICAgICAgICAgICAgRFJCRF9GQVVMVF9EVF9SQSkpCiAJCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKIAkJZWxzZQogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfSBlbHNlCiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3F1ZXVlX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIGRyYmRfcXVldWVfd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKLQlzcGluX2xvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCAmbWRldi0+c3VibWl0LndyaXRlcyk7Ci0Jc3Bpbl91bmxvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlxdWV1ZV93b3JrKG1kZXYtPnN1Ym1pdC53cSwgJm1kZXYtPnN1Ym1pdC53b3JrZXIpOworCXNwaW5fbG9jaygmZGV2aWNlLT5zdWJtaXQubG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT50bF9yZXF1ZXN0cywgJmRldmljZS0+c3VibWl0LndyaXRlcyk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+c3VibWl0LmxvY2spOworCXF1ZXVlX3dvcmsoZGV2aWNlLT5zdWJtaXQud3EsICZkZXZpY2UtPnN1Ym1pdC53b3JrZXIpOwogfQogCiAvKiByZXR1cm5zIHRoZSBuZXcgZHJiZF9yZXF1ZXN0IHBvaW50ZXIsIGlmIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8KQEAgLTEwMzMsMzYgKzEwMzksMzYgQEAKICAqIHJlcXVlc3Qgb24gdGhlIHN1Ym1pdHRlciB0aHJlYWQuCiAgKiBSZXR1cm5zIEVSUl9QVFIoLUVOT01FTSkgaWYgd2UgY2Fubm90IGFsbG9jYXRlIGEgZHJiZF9yZXF1ZXN0LgogICovCi1zdHJ1Y3QgZHJiZF9yZXF1ZXN0ICoKLWRyYmRfcmVxdWVzdF9wcmVwYXJlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQorc3RhdGljIHN0cnVjdCBkcmJkX3JlcXVlc3QgKgorZHJiZF9yZXF1ZXN0X3ByZXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQogewogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAogCS8qIGFsbG9jYXRlIG91dHNpZGUgb2YgYWxsIGxvY2tzOyAqLwotCXJlcSA9IGRyYmRfcmVxX25ldyhtZGV2LCBiaW8pOworCXJlcSA9IGRyYmRfcmVxX25ldyhkZXZpY2UsIGJpbyk7CiAJaWYgKCFyZXEpIHsKLQkJZGVjX2FwX2JpbyhtZGV2KTsKKwkJZGVjX2FwX2JpbyhkZXZpY2UpOwogCQkvKiBvbmx5IHBhc3MgdGhlIGVycm9yIHRvIHRoZSB1cHBlciBsYXllcnMuCiAJCSAqIGlmIHVzZXIgY2Fubm90IGhhbmRsZSBpbyBlcnJvcnMsIHRoYXQncyBub3Qgb3VyIGJ1c2luZXNzLiAqLwotCQlkZXZfZXJyKERFViwgImNvdWxkIG5vdCBrbWFsbG9jKCkgcmVxXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiY291bGQgbm90IGttYWxsb2MoKSByZXFcbiIpOwogCQliaW9fZW5kaW8oYmlvLCAtRU5PTUVNKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXJlcS0+c3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCXJlcS0+cHJpdmF0ZV9iaW8gPSBOVUxMOwogCX0KIAogCS8qIFVwZGF0ZSBkaXNrIHN0YXRzICovCi0JX2RyYmRfc3RhcnRfaW9fYWNjdChtZGV2LCByZXEpOworCV9kcmJkX3N0YXJ0X2lvX2FjY3QoZGV2aWNlLCByZXEpOwogCiAJaWYgKHJ3ID09IFdSSVRFICYmIHJlcS0+cHJpdmF0ZV9iaW8gJiYgcmVxLT5pLnNpemUKLQkmJiAhdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCWlmICghZHJiZF9hbF9iZWdpbl9pb19mYXN0cGF0aChtZGV2LCAmcmVxLT5pKSkgewotCQkJZHJiZF9xdWV1ZV93cml0ZShtZGV2LCByZXEpOworCSYmICF0ZXN0X2JpdChBTF9TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQlpZiAoIWRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoZGV2aWNlLCAmcmVxLT5pKSkgeworCQkJZHJiZF9xdWV1ZV93cml0ZShkZXZpY2UsIHJlcSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlyZXEtPnJxX3N0YXRlIHw9IFJRX0lOX0FDVF9MT0c7CkBAIC0xMDcxLDEzICsxMDc3LDEzIEBACiAJcmV0dXJuIHJlcTsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9zZW5kX2FuZF9zdWJtaXQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgZHJiZF9zZW5kX2FuZF9zdWJtaXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAljb25zdCBpbnQgcncgPSBiaW9fcncocmVxLT5tYXN0ZXJfYmlvKTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtID0geyBOVUxMLCB9OwogCWJvb2wgbm9fcmVtb3RlID0gZmFsc2U7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlpZiAocncgPT0gV1JJVEUpIHsKIAkJLyogVGhpcyBtYXkgdGVtcG9yYXJpbHkgZ2l2ZSB1cCB0aGUgcmVxX2xvY2ssCiAJCSAqIGJ1dCB3aWxsIHJlLWFxdWlyZSBpdCBiZWZvcmUgaXQgcmV0dXJucyBoZXJlLgpAQCAtMTA4NywxNyArMTA5MywxNyBAQAogCiAJCS8qIGNoZWNrIGZvciBjb25nZXN0aW9uLCBhbmQgcG90ZW50aWFsbHkgc3RvcCBzZW5kaW5nCiAJCSAqIGZ1bGwgZGF0YSB1cGRhdGVzLCBidXQgc3RhcnQgc2VuZGluZyAiZGlydHkgYml0cyIgb25seS4gKi8KLQkJbWF5YmVfcHVsbF9haGVhZChtZGV2KTsKKwkJbWF5YmVfcHVsbF9haGVhZChkZXZpY2UpOwogCX0KIAogCi0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKSB7CisJaWYgKGRyYmRfc3VzcGVuZGVkKGRldmljZSkpIHsKIAkJLyogcHVzaCBiYWNrIGFuZCByZXRyeTogKi8KIAkJcmVxLT5ycV9zdGF0ZSB8PSBSUV9QT1NUUE9ORUQ7CiAJCWlmIChyZXEtPnByaXZhdGVfYmlvKSB7CiAJCQliaW9fcHV0KHJlcS0+cHJpdmF0ZV9iaW8pOwogCQkJcmVxLT5wcml2YXRlX2JpbyA9IE5VTEw7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAkJZ290byBvdXQ7CiAJfQpAQCAtMTExMSwxNSArMTExNywxNSBAQAogCX0KIAogCS8qIHdoaWNoIHRyYW5zZmVyIGxvZyBlcG9jaCBkb2VzIHRoaXMgYmVsb25nIHRvPyAqLwotCXJlcS0+ZXBvY2ggPSBhdG9taWNfcmVhZCgmbWRldi0+dGNvbm4tPmN1cnJlbnRfdGxlX25yKTsKKwlyZXEtPmVwb2NoID0gYXRvbWljX3JlYWQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmN1cnJlbnRfdGxlX25yKTsKIAogCS8qIG5vIHBvaW50IGluIGFkZGluZyBlbXB0eSBmbHVzaGVzIHRvIHRoZSB0cmFuc2ZlciBsb2csCiAJICogdGhleSBhcmUgbWFwcGVkIHRvIGRyYmQgYmFycmllcnMgYWxyZWFkeS4gKi8KIAlpZiAobGlrZWx5KHJlcS0+aS5zaXplIT0wKSkgewogCQlpZiAocncgPT0gV1JJVEUpCi0JCQltZGV2LT50Y29ubi0+Y3VycmVudF90bGVfd3JpdGVzKys7CisJCQlmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMrKzsKIAotCQlsaXN0X2FkZF90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCAmbWRldi0+dGNvbm4tPnRyYW5zZmVyX2xvZyk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+dGxfcmVxdWVzdHMsICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT50cmFuc2Zlcl9sb2cpOwogCX0KIAogCWlmIChydyA9PSBXUklURSkgewpAQCAtMTEzOSwxMyArMTE0NSwxMyBAQAogCQkvKiBuZWVkcyB0byBiZSBtYXJrZWQgd2l0aGluIHRoZSBzYW1lIHNwaW5sb2NrICovCiAJCV9yZXFfbW9kKHJlcSwgVE9fQkVfU1VCTUlUVEVEKTsKIAkJLyogYnV0IHdlIG5lZWQgdG8gZ2l2ZSB1cCB0aGUgc3BpbmxvY2sgdG8gc3VibWl0ICovCi0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWRyYmRfc3VibWl0X3JlcV9wcml2YXRlX2JpbyhyZXEpOwotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfSBlbHNlIGlmIChub19yZW1vdGUpIHsKIG5vZGF0YToKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIklPIEVSUk9SOiBuZWl0aGVyIGxvY2FsIG5vciByZW1vdGUgZGF0YSwgc2VjdG9yICVsbHUrJXVcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJJTyBFUlJPUjogbmVpdGhlciBsb2NhbCBub3IgcmVtb3RlIGRhdGEsIHNlY3RvciAlbGx1KyV1XG4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplID4+IDkpOwogCQkvKiBBIHdyaXRlIG1heSBoYXZlIGJlZW4gcXVldWVkIGZvciBzZW5kX29vcywgaG93ZXZlci4KIAkJICogU28gd2UgY2FuIG5vdCBzaW1wbHkgZnJlZSBpdCwgd2UgbXVzdCBnbyB0aHJvdWdoIGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZigpICovCkBAIC0xMTU0LDIxICsxMTYwLDIxIEBACiBvdXQ6CiAJaWYgKGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZihyZXEsICZtLCAxKSkKIAkJa3JlZl9wdXQoJnJlcS0+a3JlZiwgZHJiZF9yZXFfZGVzdHJveSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIH0KIAotdm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQordm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSkKIHsKLQlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBkcmJkX3JlcXVlc3RfcHJlcGFyZShtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGRyYmRfcmVxdWVzdF9wcmVwYXJlKGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIAlpZiAoSVNfRVJSX09SX05VTEwocmVxKSkKIAkJcmV0dXJuOwotCWRyYmRfc2VuZF9hbmRfc3VibWl0KG1kZXYsIHJlcSk7CisJZHJiZF9zZW5kX2FuZF9zdWJtaXQoZGV2aWNlLCByZXEpOwogfQogCi1zdGF0aWMgdm9pZCBzdWJtaXRfZmFzdF9wYXRoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmluY29taW5nKQorc3RhdGljIHZvaWQgc3VibWl0X2Zhc3RfcGF0aChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxpc3RfaGVhZCAqaW5jb21pbmcpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqdG1wOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgaW5jb21pbmcsIHRsX3JlcXVlc3RzKSB7CkBAIC0xMTc2LDE5ICsxMTgyLDE5IEBACiAKIAkJaWYgKHJ3ID09IFdSSVRFIC8qIHJ3ICE9IFdSSVRFIHNob3VsZCBub3QgZXZlbiBlbmQgdXAgaGVyZSEgKi8KIAkJJiYgcmVxLT5wcml2YXRlX2JpbyAmJiByZXEtPmkuc2l6ZQotCQkmJiAhdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQlpZiAoIWRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgobWRldiwgJnJlcS0+aSkpCisJCSYmICF0ZXN0X2JpdChBTF9TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQkJaWYgKCFkcmJkX2FsX2JlZ2luX2lvX2Zhc3RwYXRoKGRldmljZSwgJnJlcS0+aSkpCiAJCQkJY29udGludWU7CiAKIAkJCXJlcS0+cnFfc3RhdGUgfD0gUlFfSU5fQUNUX0xPRzsKIAkJfQogCiAJCWxpc3RfZGVsX2luaXQoJnJlcS0+dGxfcmVxdWVzdHMpOwotCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChtZGV2LCByZXEpOworCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChkZXZpY2UsIHJlcSk7CiAJfQogfQogCi1zdGF0aWMgYm9vbCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgYm9vbCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqaW5jb21pbmcsCiAJCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwZW5kaW5nKQogewpAQCAtMTE5Niw5ICsxMjAyLDkgQEAKIAlpbnQgd2FrZSA9IDA7CiAJaW50IGVycjsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCBpbmNvbWluZywgdGxfcmVxdWVzdHMpIHsKLQkJZXJyID0gZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhtZGV2LCAmcmVxLT5pKTsKKwkJZXJyID0gZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhkZXZpY2UsICZyZXEtPmkpOwogCQlpZiAoZXJyID09IC1FQlVTWSkKIAkJCXdha2UgPSAxOwogCQlpZiAoZXJyKQpAQCAtMTIwNiwzMCArMTIxMiwzMCBAQAogCQlyZXEtPnJxX3N0YXRlIHw9IFJRX0lOX0FDVF9MT0c7CiAJCWxpc3RfbW92ZV90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCBwZW5kaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJaWYgKHdha2UpCi0JCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOwogCiAJcmV0dXJuICFsaXN0X2VtcHR5KHBlbmRpbmcpOwogfQogCiB2b2lkIGRvX3N1Ym1pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBkcmJkX2NvbmYsIHN1Ym1pdC53b3JrZXIpOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIHN1Ym1pdC53b3JrZXIpOwogCUxJU1RfSEVBRChpbmNvbWluZyk7CiAJTElTVF9IRUFEKHBlbmRpbmcpOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgKnRtcDsKIAogCWZvciAoOzspIHsKLQkJc3Bpbl9sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7Ci0JCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbWRldi0+c3VibWl0LndyaXRlcywgJmluY29taW5nKTsKLQkJc3Bpbl91bmxvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMsICZpbmNvbWluZyk7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKIAotCQlzdWJtaXRfZmFzdF9wYXRoKG1kZXYsICZpbmNvbWluZyk7CisJCXN1Ym1pdF9mYXN0X3BhdGgoZGV2aWNlLCAmaW5jb21pbmcpOwogCQlpZiAobGlzdF9lbXB0eSgmaW5jb21pbmcpKQogCQkJYnJlYWs7CiAKLQkJd2FpdF9ldmVudChtZGV2LT5hbF93YWl0LCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKG1kZXYsICZpbmNvbWluZywgJnBlbmRpbmcpKTsKKwkJd2FpdF9ldmVudChkZXZpY2UtPmFsX3dhaXQsIHByZXBhcmVfYWxfdHJhbnNhY3Rpb25fbm9uYmxvY2soZGV2aWNlLCAmaW5jb21pbmcsICZwZW5kaW5nKSk7CiAJCS8qIE1heWJlIG1vcmUgd2FzIHF1ZXVlZCwgd2hpbGUgd2UgcHJlcGFyZWQgdGhlIHRyYW5zYWN0aW9uPwogCQkgKiBUcnkgdG8gc3R1ZmYgdGhlbSBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gYXMgd2VsbC4KIAkJICogQmUgc3RyaWN0bHkgbm9uLWJsb2NraW5nIGhlcmUsIG5vIHdhaXRfZXZlbnQsIHdlIGFscmVhZHkKQEAgLTEyNDMsMTcgKzEyNDksMTcgQEAKIAogCQkJLyogSXQgaXMgb2sgdG8gbG9vayBvdXRzaWRlIHRoZSBsb2NrLAogCQkJICogaXQncyBvbmx5IGFuIG9wdGltaXphdGlvbiBhbnl3YXlzICovCi0JCQlpZiAobGlzdF9lbXB0eSgmbWRldi0+c3VibWl0LndyaXRlcykpCisJCQlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5zdWJtaXQud3JpdGVzKSkKIAkJCQlicmVhazsKIAotCQkJc3Bpbl9sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7Ci0JCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJm1kZXYtPnN1Ym1pdC53cml0ZXMsICZtb3JlX2luY29taW5nKTsKLQkJCXNwaW5fdW5sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7CisJCQlzcGluX2xvY2soJmRldmljZS0+c3VibWl0LmxvY2spOworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMsICZtb3JlX2luY29taW5nKTsKKwkJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKIAogCQkJaWYgKGxpc3RfZW1wdHkoJm1vcmVfaW5jb21pbmcpKQogCQkJCWJyZWFrOwogCi0JCQltYWRlX3Byb2dyZXNzID0gcHJlcGFyZV9hbF90cmFuc2FjdGlvbl9ub25ibG9jayhtZGV2LCAmbW9yZV9pbmNvbWluZywgJm1vcmVfcGVuZGluZyk7CisJCQltYWRlX3Byb2dyZXNzID0gcHJlcGFyZV9hbF90cmFuc2FjdGlvbl9ub25ibG9jayhkZXZpY2UsICZtb3JlX2luY29taW5nLCAmbW9yZV9wZW5kaW5nKTsKIAogCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtb3JlX3BlbmRpbmcsICZwZW5kaW5nKTsKIAkJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbW9yZV9pbmNvbWluZywgJmluY29taW5nKTsKQEAgLTEyNjEsMTggKzEyNjcsMTggQEAKIAkJCWlmICghbWFkZV9wcm9ncmVzcykKIAkJCQlicmVhazsKIAkJfQotCQlkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChtZGV2LCBmYWxzZSk7CisJCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KGRldmljZSwgZmFsc2UpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJnBlbmRpbmcsIHRsX3JlcXVlc3RzKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZyZXEtPnRsX3JlcXVlc3RzKTsKLQkJCWRyYmRfc2VuZF9hbmRfc3VibWl0KG1kZXYsIHJlcSk7CisJCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChkZXZpY2UsIHJlcSk7CiAJCX0KIAl9CiB9CiAKIHZvaWQgZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gKHN0cnVjdCBkcmJkX2NvbmYgKikgcS0+cXVldWVkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBxLT5xdWV1ZWRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwogCiAJc3RhcnRfdGltZSA9IGppZmZpZXM7CkBAIC0xMjgwLDEwICsxMjg2LDEwIEBACiAJLyoKIAkgKiB3aGF0IHdlICJibGluZGx5IiBhc3N1bWU6CiAJICovCi0JRF9BU1NFUlQoSVNfQUxJR05FRChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwgNTEyKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBJU19BTElHTkVEKGJpby0+YmlfaXRlci5iaV9zaXplLCA1MTIpKTsKIAotCWluY19hcF9iaW8obWRldik7Ci0JX19kcmJkX21ha2VfcmVxdWVzdChtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCWluY19hcF9iaW8oZGV2aWNlKTsKKwlfX2RyYmRfbWFrZV9yZXF1ZXN0KGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIH0KIAogLyogVGhpcyBpcyBjYWxsZWQgYnkgYmlvX2FkZF9wYWdlKCkuCkBAIC0xMzAwLDMyICsxMzA2LDMyIEBACiAgKi8KIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IChzdHJ1Y3QgZHJiZF9jb25mICopIHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgZHJiZF9kZXZpY2UgKikgcS0+cXVldWVkYXRhOwogCXVuc2lnbmVkIGludCBiaW9fc2l6ZSA9IGJ2bS0+Ymlfc2l6ZTsKIAlpbnQgbGltaXQgPSBEUkJEX01BWF9CSU9fU0laRTsKIAlpbnQgYmFja2luZ19saW1pdDsKIAotCWlmIChiaW9fc2l6ZSAmJiBnZXRfbGRldihtZGV2KSkgeworCWlmIChiaW9fc2l6ZSAmJiBnZXRfbGRldihkZXZpY2UpKSB7CiAJCXVuc2lnbmVkIGludCBtYXhfaHdfc2VjdG9ycyA9IHF1ZXVlX21heF9od19zZWN0b3JzKHEpOwogCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIGNvbnN0IGIgPQotCQkJbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwkJCWRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIAkJaWYgKGItPm1lcmdlX2J2ZWNfZm4pIHsKIAkJCWJhY2tpbmdfbGltaXQgPSBiLT5tZXJnZV9idmVjX2ZuKGIsIGJ2bSwgYnZlYyk7CiAJCQlsaW1pdCA9IG1pbihsaW1pdCwgYmFja2luZ19saW1pdCk7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmICgobGltaXQgPj4gOSkgPiBtYXhfaHdfc2VjdG9ycykKIAkJCWxpbWl0ID0gbWF4X2h3X3NlY3RvcnMgPDwgOTsKIAl9CiAJcmV0dXJuIGxpbWl0OwogfQogCi1zdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpmaW5kX29sZGVzdF9yZXF1ZXN0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpmaW5kX29sZGVzdF9yZXF1ZXN0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJLyogV2FsayB0aGUgdHJhbnNmZXIgbG9nLAogCSAqIGFuZCBmaW5kIHRoZSBvbGRlc3Qgbm90IHlldCBjb21wbGV0ZWQgcmVxdWVzdCAqLwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnI7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmdGNvbm4tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmci0+Y29tcGxldGlvbl9yZWYpKQogCQkJcmV0dXJuIHI7CiAJfQpAQCAtMTMzNCwyMSArMTM0MCwyMSBAQAogCiB2b2lkIHJlcXVlc3RfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsgLyogb2xkZXN0IHJlcXVlc3QgKi8KIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCXVuc2lnbmVkIGxvbmcgZW50ID0gMCwgZHQgPSAwLCBldCwgbnQ7IC8qIGVmZmVjdGl2ZSB0aW1lb3V0ID0ga29fY291bnQgKiB0aW1lb3V0ICovCiAJdW5zaWduZWQgbG9uZyBub3c7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKLQlpZiAobmMgJiYgbWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOworCWlmIChuYyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19XRl9SRVBPUlRfUEFSQU1TKQogCQllbnQgPSBuYy0+dGltZW91dCAqIEhaLzEwICogbmMtPmtvX2NvdW50OwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7IC8qIGltcGxpY2l0IHN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQgKi8KLQkJZHQgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZGlza190aW1lb3V0ICogSFogLyAxMDsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsgLyogaW1wbGljaXQgc3RhdGUuZGlzayA+PSBEX0lOQ09OU0lTVEVOVCAqLworCQlkdCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmRpc2tfdGltZW91dCAqIEhaIC8gMTA7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0xMzU5LDExICsxMzY1LDExIEBACiAKIAlub3cgPSBqaWZmaWVzOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlyZXEgPSBmaW5kX29sZGVzdF9yZXF1ZXN0KHRjb25uKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcmVxID0gZmluZF9vbGRlc3RfcmVxdWVzdChjb25uZWN0aW9uKTsKIAlpZiAoIXJlcSkgewotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgbm93ICsgZXQpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIsIG5vdyArIGV0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM4NSwxNyArMTM5MSwxNyBAQAogCSAqLwogCWlmIChlbnQgJiYgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HICYmCiAJCSB0aW1lX2FmdGVyKG5vdywgcmVxLT5zdGFydF90aW1lICsgZW50KSAmJgotCQkhdGltZV9pbl9yYW5nZShub3csIHRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYsIHRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYgKyBlbnQpKSB7Ci0JCWRldl93YXJuKERFViwgIlJlbW90ZSBmYWlsZWQgdG8gZmluaXNoIGEgcmVxdWVzdCB3aXRoaW4ga28tY291bnQgKiB0aW1lb3V0XG4iKTsKLQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBjb25uLCBDX1RJTUVPVVQpLCBDU19WRVJCT1NFIHwgQ1NfSEFSRCwgTlVMTCk7CisJCSF0aW1lX2luX3JhbmdlKG5vdywgY29ubmVjdGlvbi0+bGFzdF9yZWNvbm5lY3RfamlmLCBjb25uZWN0aW9uLT5sYXN0X3JlY29ubmVjdF9qaWYgKyBlbnQpKSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJSZW1vdGUgZmFpbGVkIHRvIGZpbmlzaCBhIHJlcXVlc3Qgd2l0aGluIGtvLWNvdW50ICogdGltZW91dFxuIik7CisJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX1RJTUVPVVQpLCBDU19WRVJCT1NFIHwgQ1NfSEFSRCwgTlVMTCk7CiAJfQotCWlmIChkdCAmJiByZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORyAmJiByZXEtPncubWRldiA9PSBtZGV2ICYmCisJaWYgKGR0ICYmIHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9QRU5ESU5HICYmIHJlcS0+ZGV2aWNlID09IGRldmljZSAmJgogCQkgdGltZV9hZnRlcihub3csIHJlcS0+c3RhcnRfdGltZSArIGR0KSAmJgotCQkhdGltZV9pbl9yYW5nZShub3csIG1kZXYtPmxhc3RfcmVhdHRhY2hfamlmLCBtZGV2LT5sYXN0X3JlYXR0YWNoX2ppZiArIGR0KSkgewotCQlkZXZfd2FybihERVYsICJMb2NhbCBiYWNraW5nIGRldmljZSBmYWlsZWQgdG8gbWVldCB0aGUgZGlzay10aW1lb3V0XG4iKTsKLQkJX19kcmJkX2Noa19pb19lcnJvcihtZGV2LCBEUkJEX0ZPUkNFX0RFVEFDSCk7CisJCSF0aW1lX2luX3JhbmdlKG5vdywgZGV2aWNlLT5sYXN0X3JlYXR0YWNoX2ppZiwgZGV2aWNlLT5sYXN0X3JlYXR0YWNoX2ppZiArIGR0KSkgeworCQlkcmJkX3dhcm4oZGV2aWNlLCAiTG9jYWwgYmFja2luZyBkZXZpY2UgZmFpbGVkIHRvIG1lZXQgdGhlIGRpc2stdGltZW91dFxuIik7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX0ZPUkNFX0RFVEFDSCk7CiAJfQogCW50ID0gKHRpbWVfYWZ0ZXIobm93LCByZXEtPnN0YXJ0X3RpbWUgKyBldCkgPyBub3cgOiByZXEtPnN0YXJ0X3RpbWUpICsgZXQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgbnQpOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwltb2RfdGltZXIoJmRldmljZS0+cmVxdWVzdF90aW1lciwgbnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZXEuaAppbmRleCAyOGUxNWQ5Li5jNjg0Yzk2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKQEAgLTI3NSwxNyArMjc1LDE3IEBACiAJaW50IGVycm9yOwogfTsKIAotZXh0ZXJuIHZvaWQgc3RhcnRfbmV3X3RsX2Vwb2NoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7CitleHRlcm4gdm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CiBleHRlcm4gdm9pZCBkcmJkX3JlcV9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKTsKIGV4dGVybiB2b2lkIF9yZXFfbWF5X2JlX2RvbmUoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLAogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSk7CiBleHRlcm4gaW50IF9fcmVxX21vZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pOwotZXh0ZXJuIHZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pOwogZXh0ZXJuIHZvaWQgcmVxdWVzdF90aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpOwotZXh0ZXJuIHZvaWQgdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7Ci1leHRlcm4gdm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7CitleHRlcm4gdm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7CitleHRlcm4gdm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpOwogCiAvKiB0aGlzIGlzIGluIGRyYmRfbWFpbi5jICovCiBleHRlcm4gdm9pZCBkcmJkX3Jlc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOwpAQCAtMjk0LDE0ICsyOTQsMTQgQEAKICAqIG91dHNpZGUgdGhlIHNwaW5sb2NrLCBlLmcuIHdoZW4gd2Fsa2luZyBzb21lIGxpc3Qgb24gY2xlYW51cC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IF9yZXFfbW9kKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXN0cnVjdCBiaW9fYW5kX2Vycm9yIG07CiAJaW50IHJ2OwogCiAJLyogX19yZXFfbW9kIHBvc3NpYmx5IGZyZWVzIHJlcSwgZG8gbm90IHRvdWNoIHJlcSBhZnRlciB0aGF0ISAqLwogCXJ2ID0gX19yZXFfbW9kKHJlcSwgd2hhdCwgJm0pOwogCWlmIChtLmJpbykKLQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7CisJCWNvbXBsZXRlX21hc3Rlcl9iaW8oZGV2aWNlLCAmbSk7CiAKIAlyZXR1cm4gcnY7CiB9CkBAIC0zMTQsMTYgKzMxNCwxNiBAQAogCQllbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCWludCBydjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAlydiA9IF9fcmVxX21vZChyZXEsIHdoYXQsICZtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIAogCXJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdGF0ZS5jCmluZGV4IDIxNmQ0N2IuLjFhODQzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuYwpAQCAtMjcsMTMgKzI3LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9kcmJkX2xpbWl0cy5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKLS8qIGluIGRyYmRfbWFpbi5jICovCi1leHRlcm4gdm9pZCB0bF9hYm9ydF9kaXNrX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotCiBzdHJ1Y3QgYWZ0ZXJfc3RhdGVfY2hnX3dvcmsgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAl1bmlvbiBkcmJkX3N0YXRlIG9zOwogCXVuaW9uIGRyYmRfc3RhdGUgbnM7CiAJZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3M7CkBAIC01MCwxMiArNDksMTIgQEAKIH07CiAKIHN0YXRpYyBpbnQgd19hZnRlcl9zdGF0ZV9jaChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgdW51c2VkKTsKLXN0YXRpYyB2b2lkIGFmdGVyX3N0YXRlX2NoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgb3MsCitzdGF0aWMgdm9pZCBhZnRlcl9zdGF0ZV9jaChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBvcywKIAkJCSAgIHVuaW9uIGRyYmRfc3RhdGUgbnMsIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzKTsKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgaXNfdmFsaWRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlKTsKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUsIHVuaW9uIGRyYmRfc3RhdGUsIHN0cnVjdCBkcmJkX3Rjb25uICopOworc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydiBpc192YWxpZF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSk7CitzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbih1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlLCBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICopOwogc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydiBpc192YWxpZF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMpOwotc3RhdGljIHVuaW9uIGRyYmRfc3RhdGUgc2FuaXRpemVfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBucywKK3N0YXRpYyB1bmlvbiBkcmJkX3N0YXRlIHNhbml0aXplX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG5zLAogCQkJCSAgICAgICBlbnVtIHNhbml0aXplX3N0YXRlX3dhcm5pbmdzICp3YXJuKTsKIAogc3RhdGljIGlubGluZSBib29sIGlzX3N1c3AodW5pb24gZHJiZF9zdGF0ZSBzKQpAQCAtNjMsMTcgKzYyLDE4IEBACiAgICAgICAgIHJldHVybiBzLnN1c3AgfHwgcy5zdXNwX25vZCB8fCBzLnN1c3BfZmVuOwogfQogCi1ib29sIGNvbm5fYWxsX3ZvbHNfdW5jb25mKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2Jvb2wgY29ubl9hbGxfdm9sc191bmNvbmYoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlib29sIHJ2ID0gdHJ1ZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAobWRldi0+c3RhdGUuZGlzayAhPSBEX0RJU0tMRVNTIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uICE9IENfU1RBTkRBTE9ORSB8fAotCQkgICAgbWRldi0+c3RhdGUucm9sZSAhPSBSX1NFQ09OREFSWSkgeworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0RJU0tMRVNTIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9TRUNPTkRBUlkpIHsKIAkJCXJ2ID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQpAQCAtMTAyLDk5ICsxMDIsMTExIEBACiAJcmV0dXJuIFJfUFJJTUFSWTsKIH0KIAotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3JvbGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3JvbGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfcm9sZSByb2xlID0gUl9VTktOT1dOOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKQotCQlyb2xlID0gbWF4X3JvbGUocm9sZSwgbWRldi0+c3RhdGUucm9sZSk7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlyb2xlID0gbWF4X3JvbGUocm9sZSwgZGV2aWNlLT5zdGF0ZS5yb2xlKTsKKwl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcm9sZTsKIH0KIAotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3BlZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3BlZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfcm9sZSBwZWVyID0gUl9VTktOT1dOOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKQotCQlwZWVyID0gbWF4X3JvbGUocGVlciwgbWRldi0+c3RhdGUucGVlcik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlwZWVyID0gbWF4X3JvbGUocGVlciwgZGV2aWNlLT5zdGF0ZS5wZWVyKTsKKwl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcGVlcjsKIH0KIAotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X2Rpc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X2Rpc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfZGlza19zdGF0ZSBkcyA9IERfRElTS0xFU1M7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBtZGV2LT5zdGF0ZS5kaXNrKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBkZXZpY2UtPnN0YXRlLmRpc2spOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBkczsKIH0KIAotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9sb3dlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2xvd2VzdF9kaXNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJZW51bSBkcmJkX2Rpc2tfc3RhdGUgZHMgPSBEX01BU0s7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWRzID0gbWluX3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBtZGV2LT5zdGF0ZS5kaXNrKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRzID0gbWluX3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBkZXZpY2UtPnN0YXRlLmRpc2spOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBkczsKIH0KIAotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfZGlza19zdGF0ZSBkcyA9IERfRElTS0xFU1M7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBtZGV2LT5zdGF0ZS5wZHNrKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRzID0gbWF4X3QoZW51bSBkcmJkX2Rpc2tfc3RhdGUsIGRzLCBkZXZpY2UtPnN0YXRlLnBkc2spOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBkczsKIH0KIAotZW51bSBkcmJkX2Nvbm5zIGNvbm5fbG93ZXN0X2Nvbm4oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorZW51bSBkcmJkX2Nvbm5zIGNvbm5fbG93ZXN0X2Nvbm4oc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfY29ubnMgY29ubiA9IENfTUFTSzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikKLQkJY29ubiA9IG1pbl90KGVudW0gZHJiZF9jb25ucywgY29ubiwgbWRldi0+c3RhdGUuY29ubik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQljb25uID0gbWluX3QoZW51bSBkcmJkX2Nvbm5zLCBjb25uLCBkZXZpY2UtPnN0YXRlLmNvbm4pOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBjb25uOwogfQogCi1zdGF0aWMgYm9vbCBub19wZWVyX3dmX3JlcG9ydF9wYXJhbXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGJvb2wgbm9fcGVlcl93Zl9yZXBvcnRfcGFyYW1zKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAlib29sIHJ2ID0gdHJ1ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKQorCQlpZiAocGVlcl9kZXZpY2UtPmRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKIAkJCXJ2ID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQpAQCAtMjA2LDExICsyMTgsMTEgQEAKIAogLyoqCiAgKiBjbF93aWRlX3N0X2NoZygpIC0gdHJ1ZSBpZiB0aGUgc3RhdGUgY2hhbmdlIGlzIGEgY2x1c3RlciB3aWRlIG9uZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAb3M6CQlvbGQgKGN1cnJlbnQpIHN0YXRlLgogICogQG5zOgkJbmV3ICh3YW50ZWQpIHN0YXRlLgogICovCi1zdGF0aWMgaW50IGNsX3dpZGVfc3RfY2hnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGNsX3dpZGVfc3RfY2hnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJICB1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zKQogewogCXJldHVybiAob3MuY29ubiA+PSBDX0NPTk5FQ1RFRCAmJiBucy5jb25uID49IENfQ09OTkVDVEVEICYmCkBAIC0yMzIsNzIgKzI0NCw3MiBAQAogfQogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLWRyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGYsCitkcmJkX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZiwKIAkJICB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5pb24gZHJiZF9zdGF0ZSBuczsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JbnMgPSBhcHBseV9tYXNrX3ZhbChkcmJkX3JlYWRfc3RhdGUobWRldiksIG1hc2ssIHZhbCk7Ci0JcnYgPSBfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGYsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOworCW5zID0gYXBwbHlfbWFza192YWwoZHJiZF9yZWFkX3N0YXRlKGRldmljZSksIG1hc2ssIHZhbCk7CisJcnYgPSBfZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZiwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX2ZvcmNlX3N0YXRlKCkgLSBJbXBvc2UgYSBjaGFuZ2Ugd2hpY2ggaGFwcGVucyBvdXRzaWRlIG91ciBjb250cm9sIG9uIG91ciBzdGF0ZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbWFzazoJbWFzayBvZiBzdGF0ZSBiaXRzIHRvIGNoYW5nZS4KICAqIEB2YWw6CXZhbHVlIG9mIG5ldyBzdGF0ZSBiaXRzLgogICovCi12b2lkIGRyYmRfZm9yY2Vfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3ZvaWQgZHJiZF9mb3JjZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewotCWRyYmRfY2hhbmdlX3N0YXRlKG1kZXYsIENTX0hBUkQsIG1hc2ssIHZhbCk7CisJZHJiZF9jaGFuZ2Vfc3RhdGUoZGV2aWNlLCBDU19IQVJELCBtYXNrLCB2YWwpOwogfQogCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1fcmVxX3N0X2NvbmQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAorX3JlcV9zdF9jb25kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCiAJICAgICB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAl1bmlvbiBkcmJkX3N0YXRlIG9zLCBuczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0xfU1RfQ0hHX1NVQ0NFU1MsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTF9TVF9DSEdfU1VDQ0VTUywgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfU1VDQ0VTUzsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0xfU1RfQ0hHX0ZBSUwsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTF9TVF9DSEdfRkFJTCwgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0Jb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0JbnMgPSBzYW5pdGl6ZV9zdGF0ZShtZGV2LCBhcHBseV9tYXNrX3ZhbChvcywgbWFzaywgdmFsKSwgTlVMTCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwlucyA9IHNhbml0aXplX3N0YXRlKGRldmljZSwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOwogCXJ2ID0gaXNfdmFsaWRfdHJhbnNpdGlvbihvcywgbnMpOwogCWlmIChydiA+PSBTU19TVUNDRVNTKQogCQlydiA9IFNTX1VOS05PV05fRVJST1I7ICAvKiBjb250IHdhaXRpbmcsIG90aGVyd2lzZSBmYWlsLiAqLwogCi0JaWYgKCFjbF93aWRlX3N0X2NoZyhtZGV2LCBvcywgbnMpKQorCWlmICghY2xfd2lkZV9zdF9jaGcoZGV2aWNlLCBvcywgbnMpKQogCQlydiA9IFNTX0NXX05PX05FRUQ7CiAJaWYgKHJ2ID09IFNTX1VOS05PV05fRVJST1IpIHsKLQkJcnYgPSBpc192YWxpZF9zdGF0ZShtZGV2LCBucyk7CisJCXJ2ID0gaXNfdmFsaWRfc3RhdGUoZGV2aWNlLCBucyk7CiAJCWlmIChydiA+PSBTU19TVUNDRVNTKSB7Ci0JCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIG1kZXYtPnRjb25uKTsKKwkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAJCQlpZiAocnYgPj0gU1NfU1VDQ0VTUykKIAkJCQlydiA9IFNTX1VOS05PV05fRVJST1I7IC8qIGNvbnQgd2FpdGluZywgb3RoZXJ3aXNlIGZhaWwuICovCiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX3JlcV9zdGF0ZSgpIC0gUGVyZm9ybSBhbiBldmVudHVhbGx5IGNsdXN0ZXIgd2lkZSBzdGF0ZSBjaGFuZ2UKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG1hc2s6CW1hc2sgb2Ygc3RhdGUgYml0cyB0byBjaGFuZ2UuCiAgKiBAdmFsOgl2YWx1ZSBvZiBuZXcgc3RhdGUgYml0cy4KICAqIEBmOgkJZmxhZ3MKQEAgLTMwNiw3ICszMTgsNyBAQAogICogX2RyYmRfcmVxdWVzdF9zdGF0ZSgpLgogICovCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1kcmJkX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCitkcmJkX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAogCSAgICAgICB1bmlvbiBkcmJkX3N0YXRlIHZhbCwgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZikKIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwpAQCAtMzE3LDY4ICszMjksNjggQEAKIAlpbml0X2NvbXBsZXRpb24oJmRvbmUpOwogCiAJaWYgKGYgJiBDU19TRVJJQUxJWkUpCi0JCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOworCQltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOwotCW9zID0gZHJiZF9yZWFkX3N0YXRlKG1kZXYpOwotCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOworCW9zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CisJbnMgPSBzYW5pdGl6ZV9zdGF0ZShkZXZpY2UsIGFwcGx5X21hc2tfdmFsKG9zLCBtYXNrLCB2YWwpLCBOVUxMKTsKIAlydiA9IGlzX3ZhbGlkX3RyYW5zaXRpb24ob3MsIG5zKTsKIAlpZiAocnYgPCBTU19TVUNDRVNTKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCQlnb3RvIGFib3J0OwogCX0KIAotCWlmIChjbF93aWRlX3N0X2NoZyhtZGV2LCBvcywgbnMpKSB7Ci0JCXJ2ID0gaXNfdmFsaWRfc3RhdGUobWRldiwgbnMpOworCWlmIChjbF93aWRlX3N0X2NoZyhkZXZpY2UsIG9zLCBucykpIHsKKwkJcnYgPSBpc192YWxpZF9zdGF0ZShkZXZpY2UsIG5zKTsKIAkJaWYgKHJ2ID09IFNTX1NVQ0NFU1MpCi0JCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIG1kZXYtPnRjb25uKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKIAkJCWlmIChmICYgQ1NfVkVSQk9TRSkKLQkJCQlwcmludF9zdF9lcnIobWRldiwgb3MsIG5zLCBydik7CisJCQkJcHJpbnRfc3RfZXJyKGRldmljZSwgb3MsIG5zLCBydik7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAKLQkJaWYgKGRyYmRfc2VuZF9zdGF0ZV9yZXEobWRldiwgbWFzaywgdmFsKSkgeworCQlpZiAoZHJiZF9zZW5kX3N0YXRlX3JlcShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBtYXNrLCB2YWwpKSB7CiAJCQlydiA9IFNTX0NXX0ZBSUxFRF9CWV9QRUVSOwogCQkJaWYgKGYgJiBDU19WRVJCT1NFKQotCQkJCXByaW50X3N0X2VycihtZGV2LCBvcywgbnMsIHJ2KTsKKwkJCQlwcmludF9zdF9lcnIoZGV2aWNlLCBvcywgbnMsIHJ2KTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KIAotCQl3YWl0X2V2ZW50KG1kZXYtPnN0YXRlX3dhaXQsCi0JCQkocnYgPSBfcmVxX3N0X2NvbmQobWRldiwgbWFzaywgdmFsKSkpOworCQl3YWl0X2V2ZW50KGRldmljZS0+c3RhdGVfd2FpdCwKKwkJCShydiA9IF9yZXFfc3RfY29uZChkZXZpY2UsIG1hc2ssIHZhbCkpKTsKIAogCQlpZiAocnYgPCBTU19TVUNDRVNTKSB7CiAJCQlpZiAoZiAmIENTX1ZFUkJPU0UpCi0JCQkJcHJpbnRfc3RfZXJyKG1kZXYsIG9zLCBucywgcnYpOworCQkJCXByaW50X3N0X2VycihkZXZpY2UsIG9zLCBucywgcnYpOwogCQkJZ290byBhYm9ydDsKIAkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JCW5zID0gYXBwbHlfbWFza192YWwoZHJiZF9yZWFkX3N0YXRlKG1kZXYpLCBtYXNrLCB2YWwpOwotCQlydiA9IF9kcmJkX3NldF9zdGF0ZShtZGV2LCBucywgZiwgJmRvbmUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJbnMgPSBhcHBseV9tYXNrX3ZhbChkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKSwgbWFzaywgdmFsKTsKKwkJcnYgPSBfZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZiwgJmRvbmUpOwogCX0gZWxzZSB7Ci0JCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBmLCAmZG9uZSk7CisJCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIGYsICZkb25lKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGYgJiBDU19XQUlUX0NPTVBMRVRFICYmIHJ2ID09IFNTX1NVQ0NFU1MpIHsKLQkJRF9BU1NFUlQoY3VycmVudCAhPSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCQlEX0FTU0VSVChkZXZpY2UsIGN1cnJlbnQgIT0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+d29ya2VyLnRhc2spOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKIAl9CiAKIGFib3J0OgogCWlmIChmICYgQ1NfU0VSSUFMSVpFKQotCQltdXRleF91bmxvY2sobWRldi0+c3RhdGVfbXV0ZXgpOworCQltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKIC8qKgogICogX2RyYmRfcmVxdWVzdF9zdGF0ZSgpIC0gUmVxdWVzdCBhIHN0YXRlIGNoYW5nZSAod2l0aCBmbGFncykKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG1hc2s6CW1hc2sgb2Ygc3RhdGUgYml0cyB0byBjaGFuZ2UuCiAgKiBAdmFsOgl2YWx1ZSBvZiBuZXcgc3RhdGUgYml0cy4KICAqIEBmOgkJZmxhZ3MKQEAgLTM4NywyMCArMzk5LDIwIEBACiAgKiBmbGFnLCBvciB3aGVuIGxvZ2dpbmcgb2YgZmFpbGVkIHN0YXRlIGNoYW5nZSByZXF1ZXN0cyBpcyBub3QgZGVzaXJlZC4KICAqLwogZW51bSBkcmJkX3N0YXRlX3J2Ci1fZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKK19kcmJkX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKIAkJICAgIHVuaW9uIGRyYmRfc3RhdGUgdmFsLCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCXdhaXRfZXZlbnQobWRldi0+c3RhdGVfd2FpdCwKLQkJICAgKHJ2ID0gZHJiZF9yZXFfc3RhdGUobWRldiwgbWFzaywgdmFsLCBmKSkgIT0gU1NfSU5fVFJBTlNJRU5UX1NUQVRFKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+c3RhdGVfd2FpdCwKKwkJICAgKHJ2ID0gZHJiZF9yZXFfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIGYpKSAhPSBTU19JTl9UUkFOU0lFTlRfU1RBVEUpOwogCiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9zdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjaGFyICpuYW1lLCB1bmlvbiBkcmJkX3N0YXRlIG5zKQorc3RhdGljIHZvaWQgcHJpbnRfc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKm5hbWUsIHVuaW9uIGRyYmRfc3RhdGUgbnMpCiB7Ci0JZGV2X2VycihERVYsICIgJXMgPSB7IGNzOiVzIHJvOiVzLyVzIGRzOiVzLyVzICVjJWMlYyVjJWMlYyB9XG4iLAorCWRyYmRfZXJyKGRldmljZSwgIiAlcyA9IHsgY3M6JXMgcm86JXMvJXMgZHM6JXMvJXMgJWMlYyVjJWMlYyVjIH1cbiIsCiAJICAgIG5hbWUsCiAJICAgIGRyYmRfY29ubl9zdHIobnMuY29ubiksCiAJICAgIGRyYmRfcm9sZV9zdHIobnMucm9sZSksCkBAIC00MTYsMTQgKzQyOCwxNCBAQAogCSAgICApOwogfQogCi12b2lkIHByaW50X3N0X2VycihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG9zLAordm9pZCBwcmludF9zdF9lcnIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgb3MsCiAJICAgICAgICAgIHVuaW9uIGRyYmRfc3RhdGUgbnMsIGVudW0gZHJiZF9zdGF0ZV9ydiBlcnIpCiB7CiAJaWYgKGVyciA9PSBTU19JTl9UUkFOU0lFTlRfU1RBVEUpCiAJCXJldHVybjsKLQlkZXZfZXJyKERFViwgIlN0YXRlIGNoYW5nZSBmYWlsZWQ6ICVzXG4iLCBkcmJkX3NldF9zdF9lcnJfc3RyKGVycikpOwotCXByaW50X3N0KG1kZXYsICIgc3RhdGUiLCBvcyk7Ci0JcHJpbnRfc3QobWRldiwgIndhbnRlZCIsIG5zKTsKKwlkcmJkX2VycihkZXZpY2UsICJTdGF0ZSBjaGFuZ2UgZmFpbGVkOiAlc1xuIiwgZHJiZF9zZXRfc3RfZXJyX3N0cihlcnIpKTsKKwlwcmludF9zdChkZXZpY2UsICIgc3RhdGUiLCBvcyk7CisJcHJpbnRfc3QoZGV2aWNlLCAid2FudGVkIiwgbnMpOwogfQogCiBzdGF0aWMgbG9uZyBwcmludF9zdGF0ZV9jaGFuZ2UoY2hhciAqcGIsIHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCkBAIC00NTcsNyArNDY5LDcgQEAKIAlyZXR1cm4gcGJwIC0gcGI7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfcHJfc3RhdGVfY2hhbmdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitzdGF0aWMgdm9pZCBkcmJkX3ByX3N0YXRlX2NoYW5nZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywKIAkJCQkgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJY2hhciBwYlszMDBdOwpAQCAtNDc5LDEwICs0OTEsMTAgQEAKIAkJCSAgICAgICBucy51c2VyX2lzcCk7CiAKIAlpZiAocGJwICE9IHBiKQotCQlkZXZfaW5mbyhERVYsICIlc1xuIiwgcGIpOworCQlkcmJkX2luZm8oZGV2aWNlLCAiJXNcbiIsIHBiKTsKIH0KIAotc3RhdGljIHZvaWQgY29ubl9wcl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zLAorc3RhdGljIHZvaWQgY29ubl9wcl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywKIAkJCQkgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJY2hhciBwYlszMDBdOwpAQCAtNDk2LDE3ICs1MDgsMTcgQEAKIAkJCSAgICAgICBpc19zdXNwKG5zKSk7CiAKIAlpZiAocGJwICE9IHBiKQotCQljb25uX2luZm8odGNvbm4sICIlc1xuIiwgcGIpOworCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgIiVzXG4iLCBwYik7CiB9CiAKIAogLyoqCiAgKiBpc192YWxpZF9zdGF0ZSgpIC0gUmV0dXJucyBhbiBTU18gZXJyb3IgY29kZSBpZiBucyBpcyBub3QgdmFsaWQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG5zOgkJU3RhdGUgdG8gY29uc2lkZXIuCiAgKi8KIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLWlzX3ZhbGlkX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbnMpCitpc192YWxpZF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBucykKIHsKIAkvKiBTZWUgZHJiZF9zdGF0ZV9zd19lcnJvcnMgaW4gZHJiZF9zdHJpbmdzLmMgKi8KIApAQCAtNTE2LDI0ICs1MjgsMjQgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlmcCA9IEZQX0RPTlRfQ0FSRTsKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJZnAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJZnAgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmIChuYykgewogCQlpZiAoIW5jLT50d29fcHJpbWFyaWVzICYmIG5zLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCQlpZiAobnMucGVlciA9PSBSX1BSSU1BUlkpCiAJCQkJcnYgPSBTU19UV09fUFJJTUFSSUVTOwotCQkJZWxzZSBpZiAoY29ubl9oaWdoZXN0X3BlZXIobWRldi0+dGNvbm4pID09IFJfUFJJTUFSWSkKKwkJCWVsc2UgaWYgKGNvbm5faGlnaGVzdF9wZWVyKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pID09IFJfUFJJTUFSWSkKIAkJCQlydiA9IFNTX09fVk9MX1BFRVJfUFJJOwogCQl9CiAJfQogCiAJaWYgKHJ2IDw9IDApCiAJCS8qIGFscmVhZHkgZm91bmQgYSByZWFzb24gdG8gYWJvcnQgKi87Ci0JZWxzZSBpZiAobnMucm9sZSA9PSBSX1NFQ09OREFSWSAmJiBtZGV2LT5vcGVuX2NudCkKKwllbHNlIGlmIChucy5yb2xlID09IFJfU0VDT05EQVJZICYmIGRldmljZS0+b3Blbl9jbnQpCiAJCXJ2ID0gU1NfREVWSUNFX0lOX1VTRTsKIAogCWVsc2UgaWYgKG5zLnJvbGUgPT0gUl9QUklNQVJZICYmIG5zLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBucy5kaXNrIDwgRF9VUF9UT19EQVRFKQpAQCAtNTY3LDcgKzU3OSw3IEBACiAJCXJ2ID0gU1NfTk9fVkVSSUZZX0FMRzsKIAogCWVsc2UgaWYgKChucy5jb25uID09IENfVkVSSUZZX1MgfHwgbnMuY29ubiA9PSBDX1ZFUklGWV9UKSAmJgotCQkgIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA4OCkKKwkJICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA4OCkKIAkJcnYgPSBTU19OT1RfU1VQUE9SVEVEOwogCiAJZWxzZSBpZiAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuZGlzayA8IERfVVBfVE9fREFURSAmJiBucy5wZHNrIDwgRF9VUF9UT19EQVRFKQpAQCAtNTg5LDEyICs2MDEsMTIgQEAKICAqIGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbigpIC0gUmV0dXJucyBhbiBTU18gZXJyb3IgY29kZSBpZiB0aGUgc3RhdGUgdHJhbnNpdGlvbiBpcyBub3QgcG9zc2libGUKICAqIFRoaXMgZnVuY3Rpb24gbGltaXRzIHN0YXRlIHRyYW5zaXRpb25zIHRoYXQgbWF5IGJlIGRlY2xpbmVkIGJ5IERSQkQuIEkuZS4KICAqIHVzZXIgcmVxdWVzdHMgKGFrYSBzb2Z0IHRyYW5zaXRpb25zKS4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQG9zOgkJb2xkIHN0YXRlLgogICovCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1pc192YWxpZF9zb2Z0X3RyYW5zaXRpb24odW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywgc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2ID0gU1NfU1VDQ0VTUzsKIApAQCAtNjIyLDcgKzYzNCw3IEBACiAKIAkvKiBXaGlsZSBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIG9ubHkgYWxsb3cgY3N0YXRlIHRvIGNoYW5nZS4KIAkgICBEZWxheS9yZWZ1c2Ugcm9sZSBjaGFuZ2VzLCBkZXRhY2ggYXR0YWNoIGV0Yy4uLiAqLwotCWlmICh0ZXN0X2JpdChTVEFURV9TRU5ULCAmdGNvbm4tPmZsYWdzKSAmJgorCWlmICh0ZXN0X2JpdChTVEFURV9TRU5ULCAmY29ubmVjdGlvbi0+ZmxhZ3MpICYmCiAJICAgICEob3MuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMgfHwKIAkgICAgICAobnMuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgb3MuY29ubiA9PSBDX1dGX0NPTk5FQ1RJT04pKSkKIAkJcnYgPSBTU19JTl9UUkFOU0lFTlRfU1RBVEU7CkBAIC03MDMsNyArNzE1LDcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3Nhbml0aXplX3dhcm5pbmdzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gc2FuaXRpemVfc3RhdGVfd2FybmluZ3Mgd2FybikKK3N0YXRpYyB2b2lkIHByaW50X3Nhbml0aXplX3dhcm5pbmdzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIHNhbml0aXplX3N0YXRlX3dhcm5pbmdzIHdhcm4pCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKm1zZ190YWJsZVtdID0gewogCQlbTk9fV0FSTklOR10gPSAiIiwKQEAgLTcxNSwxMiArNzI3LDEyIEBACiAJfTsKIAogCWlmICh3YXJuICE9IE5PX1dBUk5JTkcpCi0JCWRldl93YXJuKERFViwgIiVzXG4iLCBtc2dfdGFibGVbd2Fybl0pOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiJXNcbiIsIG1zZ190YWJsZVt3YXJuXSk7CiB9CiAKIC8qKgogICogc2FuaXRpemVfc3RhdGUoKSAtIFJlc29sdmVzIGltcGxpY2l0bHkgbmVjZXNzYXJ5IGFkZGl0aW9uYWwgY2hhbmdlcyB0byBhIHN0YXRlIHRyYW5zaXRpb24KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG9zOgkJb2xkIHN0YXRlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQHdhcm5fc3luY19hYm9ydDoKQEAgLTcyOCw3ICs3NDAsNyBAQAogICogV2hlbiB3ZSBsb29zZSBjb25uZWN0aW9uLCB3ZSBoYXZlIHRvIHNldCB0aGUgc3RhdGUgb2YgdGhlIHBlZXJzIGRpc2sgKHBkc2spCiAgKiB0byBEX1VOS05PV04uIFRoaXMgcnVsZSBhbmQgbWFueSBtb3JlIGFsb25nIHRob3NlIGxpbmVzIGFyZSBpbiB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdW5pb24gZHJiZF9zdGF0ZSBzYW5pdGl6ZV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG5zLAorc3RhdGljIHVuaW9uIGRyYmRfc3RhdGUgc2FuaXRpemVfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJCQkJICAgICAgIGVudW0gc2FuaXRpemVfc3RhdGVfd2FybmluZ3MgKndhcm4pCiB7CiAJZW51bSBkcmJkX2ZlbmNpbmdfcCBmcDsKQEAgLTczOCwxMSArNzUwLDExIEBACiAJCSp3YXJuID0gTk9fV0FSTklORzsKIAogCWZwID0gRlBfRE9OVF9DQVJFOwotCWlmIChnZXRfbGRldihtZGV2KSkgeworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJZnAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKKwkJZnAgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogSW1wbGljYXRpb25zIGZyb20gY29ubmVjdGlvbiB0byBwZWVyIGFuZCBwZWVyX2lzcCAqLwpAQCAtNzY4LDE3ICs3ODAsMTcgQEAKIAogCS8qIENvbm5lY3Rpb24gYnJlYWtzIGRvd24gYmVmb3JlIHdlIGZpbmlzaGVkICJOZWdvdGlhdGluZyIgKi8KIAlpZiAobnMuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLmRpc2sgPT0gRF9ORUdPVElBVElORyAmJgotCSAgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgewotCQlpZiAobWRldi0+ZWRfdXVpZCA9PSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdKSB7Ci0JCQlucy5kaXNrID0gbWRldi0+bmV3X3N0YXRlX3RtcC5kaXNrOwotCQkJbnMucGRzayA9IG1kZXYtPm5ld19zdGF0ZV90bXAucGRzazsKKwkgICAgZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkgeworCQlpZiAoZGV2aWNlLT5lZF91dWlkID09IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSkgeworCQkJbnMuZGlzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5kaXNrOworCQkJbnMucGRzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5wZHNrOwogCQl9IGVsc2UgewogCQkJaWYgKHdhcm4pCiAJCQkJKndhcm4gPSBDT05ORUNUSU9OX0xPU1RfTkVHT1RJQVRJTkc7CiAJCQlucy5kaXNrID0gRF9ESVNLTEVTUzsKIAkJCW5zLnBkc2sgPSBEX1VOS05PV047CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogRF9DT05TSVNURU5UIGFuZCBEX09VVERBVEVEIHZhbmlzaCB3aGVuIHdlIGdldCBjb25uZWN0ZWQgKi8KQEAgLTg3Myw3ICs4ODUsNyBAQAogCSAgICAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLnBkc2sgPiBEX09VVERBVEVEKSkKIAkJbnMuc3VzcF9mZW4gPSAxOyAvKiBTdXNwZW5kIElPIHdoaWxlIGZlbmNlLXBlZXIgaGFuZGxlciBydW5zIChwZWVyIGxvc3QpICovCiAKLQlpZiAobWRldi0+dGNvbm4tPnJlc19vcHRzLm9uX25vX2RhdGEgPT0gT05EX1NVU1BFTkRfSU8gJiYKKwlpZiAoZGV2aWNlLT5yZXNvdXJjZS0+cmVzX29wdHMub25fbm9fZGF0YSA9PSBPTkRfU1VTUEVORF9JTyAmJgogCSAgICAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuZGlzayA8IERfVVBfVE9fREFURSAmJiBucy5wZHNrIDwgRF9VUF9UT19EQVRFKSkKIAkJbnMuc3VzcF9ub2QgPSAxOyAvKiBTdXNwZW5kIElPIHdoaWxlIG5vIGRhdGEgYXZhaWxhYmxlIChubyBhY2Nlc3NpYmxlIGRhdGEgYXZhaWxhYmxlKSAqLwogCkBAIC04OTIsNDIgKzkwNCw0MiBAQAogCXJldHVybiBuczsKIH0KIAotdm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKSkKLQkJZGV2X2luZm8oREVWLCAiUmVzdW1lZCBBTCB1cGRhdGVzXG4iKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJmRldmljZS0+ZmxhZ3MpKQorCQlkcmJkX2luZm8oZGV2aWNlLCAiUmVzdW1lZCBBTCB1cGRhdGVzXG4iKTsKIH0KIAogLyogaGVscGVyIGZvciBfX2RyYmRfc2V0X3N0YXRlICovCi1zdGF0aWMgdm9pZCBzZXRfb3ZfcG9zaXRpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Nvbm5zIGNzKQorc3RhdGljIHZvaWQgc2V0X292X3Bvc2l0aW9uKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRyYmRfY29ubnMgY3MpCiB7Ci0JaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MCkKLQkJbWRldi0+b3Zfc3RhcnRfc2VjdG9yID0gMDsKLQltZGV2LT5yc190b3RhbCA9IGRyYmRfYm1fYml0cyhtZGV2KTsKLQltZGV2LT5vdl9wb3NpdGlvbiA9IDA7CisJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkwKQorCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IDA7CisJZGV2aWNlLT5yc190b3RhbCA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOworCWRldmljZS0+b3ZfcG9zaXRpb24gPSAwOwogCWlmIChjcyA9PSBDX1ZFUklGWV9UKSB7CiAJCS8qIHN0YXJ0aW5nIG9ubGluZSB2ZXJpZnkgZnJvbSBhbiBhcmJpdHJhcnkgcG9zaXRpb24KIAkJICogZG9lcyBub3QgZml0IHdlbGwgaW50byB0aGUgZXhpc3RpbmcgcHJvdG9jb2wuCiAJCSAqIG9uIENfVkVSSUZZX1QsIHdlIGluaXRpYWxpemUgb3ZfbGVmdCBhbmQgZnJpZW5kcwogCQkgKiBpbXBsaWNpdGx5IGluIHJlY2VpdmVfRGF0YVJlcXVlc3Qgb25jZSB0aGUKIAkJICogZmlyc3QgUF9PVl9SRVFVRVNUIGlzIHJlY2VpdmVkICovCi0JCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IH4oc2VjdG9yX3QpMDsKKwkJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPSB+KHNlY3Rvcl90KTA7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBiaXQgPSBCTV9TRUNUX1RPX0JJVChtZGV2LT5vdl9zdGFydF9zZWN0b3IpOwotCQlpZiAoYml0ID49IG1kZXYtPnJzX3RvdGFsKSB7Ci0JCQltZGV2LT5vdl9zdGFydF9zZWN0b3IgPQotCQkJCUJNX0JJVF9UT19TRUNUKG1kZXYtPnJzX3RvdGFsIC0gMSk7Ci0JCQltZGV2LT5yc190b3RhbCA9IDE7CisJCXVuc2lnbmVkIGxvbmcgYml0ID0gQk1fU0VDVF9UT19CSVQoZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IpOworCQlpZiAoYml0ID49IGRldmljZS0+cnNfdG90YWwpIHsKKwkJCWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yID0KKwkJCQlCTV9CSVRfVE9fU0VDVChkZXZpY2UtPnJzX3RvdGFsIC0gMSk7CisJCQlkZXZpY2UtPnJzX3RvdGFsID0gMTsKIAkJfSBlbHNlCi0JCQltZGV2LT5yc190b3RhbCAtPSBiaXQ7Ci0JCW1kZXYtPm92X3Bvc2l0aW9uID0gbWRldi0+b3Zfc3RhcnRfc2VjdG9yOworCQkJZGV2aWNlLT5yc190b3RhbCAtPSBiaXQ7CisJCWRldmljZS0+b3ZfcG9zaXRpb24gPSBkZXZpY2UtPm92X3N0YXJ0X3NlY3RvcjsKIAl9Ci0JbWRldi0+b3ZfbGVmdCA9IG1kZXYtPnJzX3RvdGFsOworCWRldmljZS0+b3ZfbGVmdCA9IGRldmljZS0+cnNfdG90YWw7CiB9CiAKIC8qKgogICogX19kcmJkX3NldF9zdGF0ZSgpIC0gU2V0IGEgbmV3IERSQkQgc3RhdGUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQGZsYWdzOglGbGFncwogICogQGRvbmU6CU9wdGlvbmFsIGNvbXBsZXRpb24sIHRoYXQgd2lsbCBnZXQgY29tcGxldGVkIGFmdGVyIHRoZSBhZnRlcl9zdGF0ZV9jaCgpIGZpbmlzaGVkCkBAIC05MzUsNyArOTQ3LDcgQEAKICAqIENhbGxlciBuZWVkcyB0byBob2xkIHJlcV9sb2NrLCBhbmQgZ2xvYmFsX3N0YXRlX2xvY2suIERvIG5vdCBjYWxsIGRpcmVjdGx5LgogICovCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9fZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBucywKK19fZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJICAgICAgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MsIHN0cnVjdCBjb21wbGV0aW9uICpkb25lKQogewogCXVuaW9uIGRyYmRfc3RhdGUgb3M7CkBAIC05NDQsOSArOTU2LDkgQEAKIAlzdHJ1Y3QgYWZ0ZXJfc3RhdGVfY2hnX3dvcmsgKmFzY3c7CiAJYm9vbCBkaWRfcmVtb3RlLCBzaG91bGRfZG9fcmVtb3RlOwogCi0Jb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAotCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgbnMsICZzc3cpOworCW5zID0gc2FuaXRpemVfc3RhdGUoZGV2aWNlLCBucywgJnNzdyk7CiAJaWYgKG5zLmkgPT0gb3MuaSkKIAkJcmV0dXJuIFNTX05PVEhJTkdfVE9fRE87CiAKQEAgLTk1OCwzMiArOTcwLDMzIEBACiAJCS8qICBwcmUtc3RhdGUtY2hhbmdlIGNoZWNrcyA7IG9ubHkgbG9vayBhdCBucyAgKi8KIAkJLyogU2VlIGRyYmRfc3RhdGVfc3dfZXJyb3JzIGluIGRyYmRfc3RyaW5ncy5jICovCiAKLQkJcnYgPSBpc192YWxpZF9zdGF0ZShtZGV2LCBucyk7CisJCXJ2ID0gaXNfdmFsaWRfc3RhdGUoZGV2aWNlLCBucyk7CiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKIAkJCS8qIElmIHRoZSBvbGQgc3RhdGUgd2FzIGlsbGVnYWwgYXMgd2VsbCwgdGhlbiBsZXQKIAkJCSAgIHRoaXMgaGFwcGVuLi4uKi8KIAotCQkJaWYgKGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG9zKSA9PSBydikKLQkJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIG1kZXYtPnRjb25uKTsKKwkJCWlmIChpc192YWxpZF9zdGF0ZShkZXZpY2UsIG9zKSA9PSBydikKKwkJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCQl9IGVsc2UKLQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgbWRldi0+dGNvbm4pOworCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAl9CiAKIAlpZiAocnYgPCBTU19TVUNDRVNTKSB7CiAJCWlmIChmbGFncyAmIENTX1ZFUkJPU0UpCi0JCQlwcmludF9zdF9lcnIobWRldiwgb3MsIG5zLCBydik7CisJCQlwcmludF9zdF9lcnIoZGV2aWNlLCBvcywgbnMsIHJ2KTsKIAkJcmV0dXJuIHJ2OwogCX0KIAotCXByaW50X3Nhbml0aXplX3dhcm5pbmdzKG1kZXYsIHNzdyk7CisJcHJpbnRfc2FuaXRpemVfd2FybmluZ3MoZGV2aWNlLCBzc3cpOwogCi0JZHJiZF9wcl9zdGF0ZV9jaGFuZ2UobWRldiwgb3MsIG5zLCBmbGFncyk7CisJZHJiZF9wcl9zdGF0ZV9jaGFuZ2UoZGV2aWNlLCBvcywgbnMsIGZsYWdzKTsKIAogCS8qIERpc3BsYXkgY2hhbmdlcyB0byB0aGUgc3VzcCogZmxhZ3MgdGhhdCB3aGVyZSBjYXVzZWQgYnkgdGhlIGNhbGwgdG8KIAkgICBzYW5pdGl6ZV9zdGF0ZSgpLiBPbmx5IGRpc3BsYXkgaXQgaGVyZSBpZiB3ZSB3aGVyZSBub3QgY2FsbGVkIGZyb20KIAkgICBfY29ubl9yZXF1ZXN0X3N0YXRlKCkgKi8KIAlpZiAoIShmbGFncyAmIENTX0RDX1NVU1ApKQotCQljb25uX3ByX3N0YXRlX2NoYW5nZShtZGV2LT50Y29ubiwgb3MsIG5zLCAoZmxhZ3MgJiB+Q1NfRENfTUFTSykgfCBDU19EQ19TVVNQKTsKKwkJY29ubl9wcl9zdGF0ZV9jaGFuZ2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgb3MsIG5zLAorCQkJCSAgICAgKGZsYWdzICYgfkNTX0RDX01BU0spIHwgQ1NfRENfU1VTUCk7CiAKIAkvKiBpZiB3ZSBhcmUgZ29pbmcgLT4gRF9GQUlMRUQgb3IgRF9ESVNLTEVTUywgZ3JhYiBvbmUgZXh0cmEgcmVmZXJlbmNlCiAJICogb24gdGhlIGxkZXYgaGVyZSwgdG8gYmUgc3VyZSB0aGUgdHJhbnNpdGlvbiAtPiBEX0RJU0tMRVNTIHJlc3AuCkBAIC05OTEsNTUgKzEwMDQsNTUgQEAKIAkgKiBhZnRlcl9zdGF0ZV9jaCB3b3JrcyBydW4sIHdoZXJlIHdlIHB1dF9sZGV2IGFnYWluLiAqLwogCWlmICgob3MuZGlzayAhPSBEX0ZBSUxFRCAmJiBucy5kaXNrID09IERfRkFJTEVEKSB8fAogCSAgICAob3MuZGlzayAhPSBEX0RJU0tMRVNTICYmIG5zLmRpc2sgPT0gRF9ESVNLTEVTUykpCi0JCWF0b21pY19pbmMoJm1kZXYtPmxvY2FsX2NudCk7CisJCWF0b21pY19pbmMoJmRldmljZS0+bG9jYWxfY250KTsKIAotCWRpZF9yZW1vdGUgPSBkcmJkX3Nob3VsZF9kb19yZW1vdGUobWRldi0+c3RhdGUpOwotCW1kZXYtPnN0YXRlLmkgPSBucy5pOwotCXNob3VsZF9kb19yZW1vdGUgPSBkcmJkX3Nob3VsZF9kb19yZW1vdGUobWRldi0+c3RhdGUpOwotCW1kZXYtPnRjb25uLT5zdXNwID0gbnMuc3VzcDsKLQltZGV2LT50Y29ubi0+c3VzcF9ub2QgPSBucy5zdXNwX25vZDsKLQltZGV2LT50Y29ubi0+c3VzcF9mZW4gPSBucy5zdXNwX2ZlbjsKKwlkaWRfcmVtb3RlID0gZHJiZF9zaG91bGRfZG9fcmVtb3RlKGRldmljZS0+c3RhdGUpOworCWRldmljZS0+c3RhdGUuaSA9IG5zLmk7CisJc2hvdWxkX2RvX3JlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShkZXZpY2UtPnN0YXRlKTsKKwlkZXZpY2UtPnJlc291cmNlLT5zdXNwID0gbnMuc3VzcDsKKwlkZXZpY2UtPnJlc291cmNlLT5zdXNwX25vZCA9IG5zLnN1c3Bfbm9kOworCWRldmljZS0+cmVzb3VyY2UtPnN1c3BfZmVuID0gbnMuc3VzcF9mZW47CiAKIAkvKiBwdXQgcmVwbGljYXRlZCB2cyBub3QtcmVwbGljYXRlZCByZXF1ZXN0cyBpbiBzZXBlcmF0ZSBlcG9jaHMgKi8KIAlpZiAoZGlkX3JlbW90ZSAhPSBzaG91bGRfZG9fcmVtb3RlKQotCQlzdGFydF9uZXdfdGxfZXBvY2gobWRldi0+dGNvbm4pOworCQlzdGFydF9uZXdfdGxfZXBvY2goZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAKIAlpZiAob3MuZGlzayA9PSBEX0FUVEFDSElORyAmJiBucy5kaXNrID49IERfTkVHT1RJQVRJTkcpCi0JCWRyYmRfcHJpbnRfdXVpZHMobWRldiwgImF0dGFjaGVkIHRvIFVVSURzIik7CisJCWRyYmRfcHJpbnRfdXVpZHMoZGV2aWNlLCAiYXR0YWNoZWQgdG8gVVVJRHMiKTsKIAogCS8qIFdha2UgdXAgcm9sZSBjaGFuZ2VzLCB0aGF0IHdlcmUgZGVsYXllZCBiZWNhdXNlIG9mIGNvbm5lY3Rpb24gZXN0YWJsaXNoaW5nICovCiAJaWYgKG9zLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIG5zLmNvbm4gIT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmCi0JICAgIG5vX3BlZXJfd2ZfcmVwb3J0X3BhcmFtcyhtZGV2LT50Y29ubikpCi0JCWNsZWFyX2JpdChTVEFURV9TRU5ULCAmbWRldi0+dGNvbm4tPmZsYWdzKTsKKwkgICAgbm9fcGVlcl93Zl9yZXBvcnRfcGFyYW1zKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pKQorCQljbGVhcl9iaXQoU1RBVEVfU0VOVCwgJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCXdha2VfdXAoJm1kZXYtPm1pc2Nfd2FpdCk7Ci0Jd2FrZV91cCgmbWRldi0+c3RhdGVfd2FpdCk7Ci0Jd2FrZV91cCgmbWRldi0+dGNvbm4tPnBpbmdfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+c3RhdGVfd2FpdCk7CisJd2FrZV91cCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cGluZ193YWl0KTsKIAogCS8qIEFib3J0ZWQgdmVyaWZ5IHJ1biwgb3Igd2UgcmVhY2hlZCB0aGUgc3RvcCBzZWN0b3IuCiAJICogTG9nIHRoZSBsYXN0IHBvc2l0aW9uLCB1bmxlc3MgZW5kLW9mLWRldmljZS4gKi8KIAlpZiAoKG9zLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBvcy5jb25uID09IENfVkVSSUZZX1QpICYmCiAJICAgIG5zLmNvbm4gPD0gQ19DT05ORUNURUQpIHsKLQkJbWRldi0+b3Zfc3RhcnRfc2VjdG9yID0KLQkJCUJNX0JJVF9UT19TRUNUKGRyYmRfYm1fYml0cyhtZGV2KSAtIG1kZXYtPm92X2xlZnQpOwotCQlpZiAobWRldi0+b3ZfbGVmdCkKLQkJCWRldl9pbmZvKERFViwgIk9ubGluZSBWZXJpZnkgcmVhY2hlZCBzZWN0b3IgJWxsdVxuIiwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1kZXYtPm92X3N0YXJ0X3NlY3Rvcik7CisJCWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yID0KKwkJCUJNX0JJVF9UT19TRUNUKGRyYmRfYm1fYml0cyhkZXZpY2UpIC0gZGV2aWNlLT5vdl9sZWZ0KTsKKwkJaWYgKGRldmljZS0+b3ZfbGVmdCkKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJPbmxpbmUgVmVyaWZ5IHJlYWNoZWQgc2VjdG9yICVsbHVcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPm92X3N0YXJ0X3NlY3Rvcik7CiAJfQogCiAJaWYgKChvcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCB8fCBvcy5jb25uID09IENfUEFVU0VEX1NZTkNfUykgJiYKIAkgICAgKG5zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCAgfHwgbnMuY29ubiA9PSBDX1NZTkNfU09VUkNFKSkgewotCQlkZXZfaW5mbyhERVYsICJTeW5jZXIgY29udGludWVzLlxuIik7Ci0JCW1kZXYtPnJzX3BhdXNlZCArPSAobG9uZylqaWZmaWVzCi0JCQkJICAtKGxvbmcpbWRldi0+cnNfbWFya190aW1lW21kZXYtPnJzX2xhc3RfbWFya107CisJCWRyYmRfaW5mbyhkZXZpY2UsICJTeW5jZXIgY29udGludWVzLlxuIik7CisJCWRldmljZS0+cnNfcGF1c2VkICs9IChsb25nKWppZmZpZXMKKwkJCQkgIC0obG9uZylkZXZpY2UtPnJzX21hcmtfdGltZVtkZXZpY2UtPnJzX2xhc3RfbWFya107CiAJCWlmIChucy5jb25uID09IENfU1lOQ19UQVJHRVQpCi0JCQltb2RfdGltZXIoJm1kZXYtPnJlc3luY190aW1lciwgamlmZmllcyk7CisJCQltb2RfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKIAl9CiAKIAlpZiAoKG9zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCAgfHwgb3MuY29ubiA9PSBDX1NZTkNfU09VUkNFKSAmJgogCSAgICAobnMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QgfHwgbnMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MpKSB7Ci0JCWRldl9pbmZvKERFViwgIlJlc3luYyBzdXNwZW5kZWRcbiIpOwotCQltZGV2LT5yc19tYXJrX3RpbWVbbWRldi0+cnNfbGFzdF9tYXJrXSA9IGppZmZpZXM7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXN5bmMgc3VzcGVuZGVkXG4iKTsKKwkJZGV2aWNlLT5yc19tYXJrX3RpbWVbZGV2aWNlLT5yc19sYXN0X21hcmtdID0gamlmZmllczsKIAl9CiAKIAlpZiAob3MuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgpAQCAtMTA0Nyw3NyArMTA2MCw3NyBAQAogCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJCWludCBpOwogCi0JCXNldF9vdl9wb3NpdGlvbihtZGV2LCBucy5jb25uKTsKLQkJbWRldi0+cnNfc3RhcnQgPSBub3c7Ci0JCW1kZXYtPnJzX2xhc3RfZXZlbnRzID0gMDsKLQkJbWRldi0+cnNfbGFzdF9zZWN0X2V2ID0gMDsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSA9IDA7Ci0JCW1kZXYtPm92X2xhc3Rfb29zX3N0YXJ0ID0gMDsKKwkJc2V0X292X3Bvc2l0aW9uKGRldmljZSwgbnMuY29ubik7CisJCWRldmljZS0+cnNfc3RhcnQgPSBub3c7CisJCWRldmljZS0+cnNfbGFzdF9ldmVudHMgPSAwOworCQlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CisJCWRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSA9IDA7CisJCWRldmljZS0+b3ZfbGFzdF9vb3Nfc3RhcnQgPSAwOwogCiAJCWZvciAoaSA9IDA7IGkgPCBEUkJEX1NZTkNfTUFSS1M7IGkrKykgewotCQkJbWRldi0+cnNfbWFya19sZWZ0W2ldID0gbWRldi0+b3ZfbGVmdDsKLQkJCW1kZXYtPnJzX21hcmtfdGltZVtpXSA9IG5vdzsKKwkJCWRldmljZS0+cnNfbWFya19sZWZ0W2ldID0gZGV2aWNlLT5vdl9sZWZ0OworCQkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CiAJCX0KIAotCQlkcmJkX3JzX2NvbnRyb2xsZXJfcmVzZXQobWRldik7CisJCWRyYmRfcnNfY29udHJvbGxlcl9yZXNldChkZXZpY2UpOwogCiAJCWlmIChucy5jb25uID09IENfVkVSSUZZX1MpIHsKLQkJCWRldl9pbmZvKERFViwgIlN0YXJ0aW5nIE9ubGluZSBWZXJpZnkgZnJvbSBzZWN0b3IgJWxsdVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltZGV2LT5vdl9wb3NpdGlvbik7Ci0JCQltb2RfdGltZXIoJm1kZXYtPnJlc3luY190aW1lciwgamlmZmllcyk7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiU3RhcnRpbmcgT25saW5lIFZlcmlmeSBmcm9tIHNlY3RvciAlbGx1XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRldmljZS0+b3ZfcG9zaXRpb24pOworCQkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlc3luY190aW1lciwgamlmZmllcyk7CiAJCX0KIAl9CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJdTMyIG1kZiA9IG1kZXYtPmxkZXYtPm1kLmZsYWdzICYgfihNREZfQ09OU0lTVEVOVHxNREZfUFJJTUFSWV9JTkR8CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJdTMyIG1kZiA9IGRldmljZS0+bGRldi0+bWQuZmxhZ3MgJiB+KE1ERl9DT05TSVNURU5UfE1ERl9QUklNQVJZX0lORHwKIAkJCQkJCSBNREZfQ09OTkVDVEVEX0lORHxNREZfV0FTX1VQX1RPX0RBVEV8CiAJCQkJCQkgTURGX1BFRVJfT1VUX0RBVEVEfE1ERl9DUkFTSEVEX1BSSU1BUlkpOwogCiAJCW1kZiAmPSB+TURGX0FMX0NMRUFOOwotCQlpZiAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpKQorCQlpZiAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncykpCiAJCQltZGYgfD0gTURGX0NSQVNIRURfUFJJTUFSWTsKLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZIHx8Ci0JCSAgICAobWRldi0+c3RhdGUucGRzayA8IERfSU5DT05TSVNURU5UICYmIG1kZXYtPnN0YXRlLnBlZXIgPT0gUl9QUklNQVJZKSkKKwkJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgfHwKKwkJICAgIChkZXZpY2UtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCAmJiBkZXZpY2UtPnN0YXRlLnBlZXIgPT0gUl9QUklNQVJZKSkKIAkJCW1kZiB8PSBNREZfUFJJTUFSWV9JTkQ7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID4gQ19XRl9SRVBPUlRfUEFSQU1TKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID4gQ19XRl9SRVBPUlRfUEFSQU1TKQogCQkJbWRmIHw9IE1ERl9DT05ORUNURURfSU5EOwotCQlpZiAobWRldi0+c3RhdGUuZGlzayA+IERfSU5DT05TSVNURU5UKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9JTkNPTlNJU1RFTlQpCiAJCQltZGYgfD0gTURGX0NPTlNJU1RFTlQ7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrID4gRF9PVVREQVRFRCkKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA+IERfT1VUREFURUQpCiAJCQltZGYgfD0gTURGX1dBU19VUF9UT19EQVRFOwotCQlpZiAobWRldi0+c3RhdGUucGRzayA8PSBEX09VVERBVEVEICYmIG1kZXYtPnN0YXRlLnBkc2sgPj0gRF9JTkNPTlNJU1RFTlQpCisJCWlmIChkZXZpY2UtPnN0YXRlLnBkc2sgPD0gRF9PVVREQVRFRCAmJiBkZXZpY2UtPnN0YXRlLnBkc2sgPj0gRF9JTkNPTlNJU1RFTlQpCiAJCQltZGYgfD0gTURGX1BFRVJfT1VUX0RBVEVEOwotCQlpZiAobWRmICE9IG1kZXYtPmxkZXYtPm1kLmZsYWdzKSB7Ci0JCQltZGV2LT5sZGV2LT5tZC5mbGFncyA9IG1kZjsKLQkJCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKKwkJaWYgKG1kZiAhPSBkZXZpY2UtPmxkZXYtPm1kLmZsYWdzKSB7CisJCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzID0gbWRmOworCQkJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CiAJCX0KIAkJaWYgKG9zLmRpc2sgPCBEX0NPTlNJU1RFTlQgJiYgbnMuZGlzayA+PSBEX0NPTlNJU1RFTlQpCi0JCQlkcmJkX3NldF9lZF91dWlkKG1kZXYsIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOwotCQlwdXRfbGRldihtZGV2KTsKKwkJCWRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCS8qIFBlZXIgd2FzIGZvcmNlZCBEX1VQX1RPX0RBVEUgJiBSX1BSSU1BUlksIGNvbnNpZGVyIHRvIHJlc3luYyAqLwogCWlmIChvcy5kaXNrID09IERfSU5DT05TSVNURU5UICYmIG9zLnBkc2sgPT0gRF9JTkNPTlNJU1RFTlQgJiYKIAkgICAgb3MucGVlciA9PSBSX1NFQ09OREFSWSAmJiBucy5wZWVyID09IFJfUFJJTUFSWSkKLQkJc2V0X2JpdChDT05TSURFUl9SRVNZTkMsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoQ09OU0lERVJfUkVTWU5DLCAmZGV2aWNlLT5mbGFncyk7CiAKIAkvKiBSZWNlaXZlciBzaG91bGQgY2xlYW4gdXAgaXRzZWxmICovCiAJaWYgKG9zLmNvbm4gIT0gQ19ESVNDT05ORUNUSU5HICYmIG5zLmNvbm4gPT0gQ19ESVNDT05ORUNUSU5HKQotCQlkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgmbWRldi0+dGNvbm4tPnJlY2VpdmVyKTsKKwkJZHJiZF90aHJlYWRfc3RvcF9ub3dhaXQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCS8qIE5vdyB0aGUgcmVjZWl2ZXIgZmluaXNoZWQgY2xlYW5pbmcgdXAgaXRzZWxmLCBpdCBzaG91bGQgZGllICovCiAJaWYgKG9zLmNvbm4gIT0gQ19TVEFOREFMT05FICYmIG5zLmNvbm4gPT0gQ19TVEFOREFMT05FKQotCQlkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgmbWRldi0+dGNvbm4tPnJlY2VpdmVyKTsKKwkJZHJiZF90aHJlYWRfc3RvcF9ub3dhaXQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCS8qIFVwb24gbmV0d29yayBmYWlsdXJlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHJlY2VpdmVyLiAqLwogCWlmIChvcy5jb25uID4gQ19XRl9DT05ORUNUSU9OICYmCiAJICAgIG5zLmNvbm4gPD0gQ19URUFSX0RPV04gJiYgbnMuY29ubiA+PSBDX1RJTUVPVVQpCi0JCWRyYmRfdGhyZWFkX3Jlc3RhcnRfbm93YWl0KCZtZGV2LT50Y29ubi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9yZXN0YXJ0X25vd2FpdCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIpOwogCiAJLyogUmVzdW1lIEFMIHdyaXRpbmcgaWYgd2UgZ2V0IGEgY29ubmVjdGlvbiAqLwogCWlmIChvcy5jb25uIDwgQ19DT05ORUNURUQgJiYgbnMuY29ubiA+PSBDX0NPTk5FQ1RFRCkgewotCQlkcmJkX3Jlc3VtZV9hbChtZGV2KTsKLQkJbWRldi0+dGNvbm4tPmNvbm5lY3RfY250Kys7CisJCWRyYmRfcmVzdW1lX2FsKGRldmljZSk7CisJCWZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNvbm5lY3RfY250Kys7CiAJfQogCiAJLyogcmVtZW1iZXIgbGFzdCBhdHRhY2ggdGltZSBzbyByZXF1ZXN0X3RpbWVyX2ZuKCkgd29uJ3QKQEAgLTExMjUsNyArMTEzOCw3IEBACiAJICogcHJldmlvdXNseSBmcm96ZW4gSU8gKi8KIAlpZiAoKG9zLmRpc2sgPT0gRF9BVFRBQ0hJTkcgfHwgb3MuZGlzayA9PSBEX05FR09USUFUSU5HKSAmJgogCSAgICBucy5kaXNrID4gRF9ORUdPVElBVElORykKLQkJbWRldi0+bGFzdF9yZWF0dGFjaF9qaWYgPSBqaWZmaWVzOworCQlkZXZpY2UtPmxhc3RfcmVhdHRhY2hfamlmID0gamlmZmllczsKIAogCWFzY3cgPSBrbWFsbG9jKHNpemVvZigqYXNjdyksIEdGUF9BVE9NSUMpOwogCWlmIChhc2N3KSB7CkBAIC0xMTMzLDExICsxMTQ2LDEyIEBACiAJCWFzY3ctPm5zID0gbnM7CiAJCWFzY3ctPmZsYWdzID0gZmxhZ3M7CiAJCWFzY3ctPncuY2IgPSB3X2FmdGVyX3N0YXRlX2NoOwotCQlhc2N3LT53Lm1kZXYgPSBtZGV2OworCQlhc2N3LT5kZXZpY2UgPSBkZXZpY2U7CiAJCWFzY3ctPmRvbmUgPSBkb25lOwotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJmFzY3ctPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZhc2N3LT53KTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgIkNvdWxkIG5vdCBrbWFsbG9jIGFuIGFzY3dcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJDb3VsZCBub3Qga21hbGxvYyBhbiBhc2N3XG4iKTsKIAl9CiAKIAlyZXR1cm4gcnY7CkBAIC0xMTQ3LDY2ICsxMTYxLDY1IEBACiB7CiAJc3RydWN0IGFmdGVyX3N0YXRlX2NoZ193b3JrICphc2N3ID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBhZnRlcl9zdGF0ZV9jaGdfd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBhc2N3LT5kZXZpY2U7CiAKLQlhZnRlcl9zdGF0ZV9jaChtZGV2LCBhc2N3LT5vcywgYXNjdy0+bnMsIGFzY3ctPmZsYWdzKTsKLQlpZiAoYXNjdy0+ZmxhZ3MgJiBDU19XQUlUX0NPTVBMRVRFKSB7Ci0JCURfQVNTRVJUKGFzY3ctPmRvbmUgIT0gTlVMTCk7CisJYWZ0ZXJfc3RhdGVfY2goZGV2aWNlLCBhc2N3LT5vcywgYXNjdy0+bnMsIGFzY3ctPmZsYWdzKTsKKwlpZiAoYXNjdy0+ZmxhZ3MgJiBDU19XQUlUX0NPTVBMRVRFKQogCQljb21wbGV0ZShhc2N3LT5kb25lKTsKLQl9CiAJa2ZyZWUoYXNjdyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWJ3X3N0YXJ0X3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHJ2KQorc3RhdGljIHZvaWQgYWJ3X3N0YXJ0X3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBydikKIHsKIAlpZiAocnYpIHsKLQkJZGV2X2VycihERVYsICJXcml0aW5nIHRoZSBiaXRtYXAgZmFpbGVkIG5vdCBzdGFydGluZyByZXN5bmMuXG4iKTsKLQkJX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhjb25uLCBDX0NPTk5FQ1RFRCksIENTX1ZFUkJPU0UpOworCQlkcmJkX2VycihkZXZpY2UsICJXcml0aW5nIHRoZSBiaXRtYXAgZmFpbGVkIG5vdCBzdGFydGluZyByZXN5bmMuXG4iKTsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CiAJCXJldHVybjsKIAl9CiAKLQlzd2l0Y2ggKG1kZXYtPnN0YXRlLmNvbm4pIHsKKwlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCWNhc2UgQ19TVEFSVElOR19TWU5DX1Q6Ci0JCV9kcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19XRl9TWU5DX1VVSUQpLCBDU19WRVJCT1NFKTsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7CiAJCWJyZWFrOwogCWNhc2UgQ19TVEFSVElOR19TWU5DX1M6Ci0JCWRyYmRfc3RhcnRfcmVzeW5jKG1kZXYsIENfU1lOQ19TT1VSQ0UpOworCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOwogCQlicmVhazsKIAl9CiB9CiAKLWludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAotCQlpbnQgKCppb19mbikoc3RydWN0IGRyYmRfY29uZiAqKSwKK2ludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKIAkJY2hhciAqd2h5LCBlbnVtIGJtX2ZsYWcgZmxhZ3MpCiB7CiAJaW50IHJ2OwogCi0JRF9BU1NFUlQoY3VycmVudCA9PSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCURfQVNTRVJUKGRldmljZSwgY3VycmVudCA9PSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53b3JrZXIudGFzayk7CiAKLQkvKiBvcGVuIGNvZGVkIG5vbi1ibG9ja2luZyBkcmJkX3N1c3BlbmRfaW8obWRldik7ICovCi0Jc2V0X2JpdChTVVNQRU5EX0lPLCAmbWRldi0+ZmxhZ3MpOworCS8qIG9wZW4gY29kZWQgbm9uLWJsb2NraW5nIGRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOyAqLworCXNldF9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOwogCi0JZHJiZF9ibV9sb2NrKG1kZXYsIHdoeSwgZmxhZ3MpOwotCXJ2ID0gaW9fZm4obWRldik7Ci0JZHJiZF9ibV91bmxvY2sobWRldik7CisJZHJiZF9ibV9sb2NrKGRldmljZSwgd2h5LCBmbGFncyk7CisJcnYgPSBpb19mbihkZXZpY2UpOworCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CiAKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGFmdGVyX3N0YXRlX2NoKCkgLSBQZXJmb3JtIGFmdGVyIHN0YXRlIGNoYW5nZSBhY3Rpb25zIHRoYXQgbWF5IHNsZWVwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBvczoJCW9sZCBzdGF0ZS4KICAqIEBuczoJCW5ldyBzdGF0ZS4KICAqIEBmbGFnczoJRmxhZ3MKICAqLwotc3RhdGljIHZvaWQgYWZ0ZXJfc3RhdGVfY2goc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBvcywKK3N0YXRpYyB2b2lkIGFmdGVyX3N0YXRlX2NoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG9zLAogCQkJICAgdW5pb24gZHJiZF9zdGF0ZSBucywgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liOwogCiAJc2liLnNpYl9yZWFzb24gPSBTSUJfU1RBVEVfQ0hBTkdFOwpAQCAtMTIxNCw2MyArMTIyNyw2MyBAQAogCXNpYi5ucyA9IG5zOwogCiAJaWYgKG9zLmNvbm4gIT0gQ19DT05ORUNURUQgJiYgbnMuY29ubiA9PSBDX0NPTk5FQ1RFRCkgewotCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOwotCQlpZiAobWRldi0+cF91dWlkKQotCQkJbWRldi0+cF91dWlkW1VJX0ZMQUdTXSAmPSB+KCh1NjQpMik7CisJCWNsZWFyX2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKTsKKwkJaWYgKGRldmljZS0+cF91dWlkKQorCQkJZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICY9IH4oKHU2NCkyKTsKIAl9CiAKIAkvKiBJbmZvcm0gdXNlcnNwYWNlIGFib3V0IHRoZSBjaGFuZ2UuLi4gKi8KLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAogCWlmICghKG9zLnJvbGUgPT0gUl9QUklNQVJZICYmIG9zLmRpc2sgPCBEX1VQX1RPX0RBVEUgJiYgb3MucGRzayA8IERfVVBfVE9fREFURSkgJiYKIAkgICAgKG5zLnJvbGUgPT0gUl9QUklNQVJZICYmIG5zLmRpc2sgPCBEX1VQX1RPX0RBVEUgJiYgbnMucGRzayA8IERfVVBfVE9fREFURSkpCi0JCWRyYmRfa2hlbHBlcihtZGV2LCAicHJpLW9uLWluY29uLWRlZ3IiKTsKKwkJZHJiZF9raGVscGVyKGRldmljZSwgInByaS1vbi1pbmNvbi1kZWdyIik7CiAKIAkvKiBIZXJlIHdlIGhhdmUgdGhlIGFjdGlvbnMgdGhhdCBhcmUgcGVyZm9ybWVkIGFmdGVyIGEKIAkgICBzdGF0ZSBjaGFuZ2UuIFRoaXMgZnVuY3Rpb24gbWlnaHQgc2xlZXAgKi8KIAogCWlmIChucy5zdXNwX25vZCkgewotCQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwkJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCA9IE5PVEhJTkc7CiAKLQkJc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQkJaWYgKG9zLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBjb25uX2xvd2VzdF9jb25uKHRjb25uKSA+PSBDX0NPTk5FQ1RFRCkKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQlpZiAob3MuY29ubiA8IENfQ09OTkVDVEVEICYmIGNvbm5fbG93ZXN0X2Nvbm4oY29ubmVjdGlvbikgPj0gQ19DT05ORUNURUQpCiAJCQl3aGF0ID0gUkVTRU5EOwogCiAJCWlmICgob3MuZGlzayA9PSBEX0FUVEFDSElORyB8fCBvcy5kaXNrID09IERfTkVHT1RJQVRJTkcpICYmCi0JCSAgICBjb25uX2xvd2VzdF9kaXNrKHRjb25uKSA+IERfTkVHT1RJQVRJTkcpCisJCSAgICBjb25uX2xvd2VzdF9kaXNrKGNvbm5lY3Rpb24pID4gRF9ORUdPVElBVElORykKIAkJCXdoYXQgPSBSRVNUQVJUX0ZST1pFTl9ESVNLX0lPOwogCi0JCWlmICh0Y29ubi0+c3VzcF9ub2QgJiYgd2hhdCAhPSBOT1RISU5HKSB7Ci0JCQlfdGxfcmVzdGFydCh0Y29ubiwgd2hhdCk7Ci0JCQlfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLAorCQlpZiAocmVzb3VyY2UtPnN1c3Bfbm9kICYmIHdoYXQgIT0gTk9USElORykgeworCQkJX3RsX3Jlc3RhcnQoY29ubmVjdGlvbiwgd2hhdCk7CisJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX25vZCA9IDEgfSB9LAogCQkJCQkgICAgKHVuaW9uIGRyYmRfc3RhdGUpIHsgeyAuc3VzcF9ub2QgPSAwIH0gfSwKIAkJCQkJICAgIENTX1ZFUkJPU0UpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQogCiAJaWYgKG5zLnN1c3BfZmVuKSB7Ci0JCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCQlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQlpZiAodGNvbm4tPnN1c3BfZmVuICYmIGNvbm5fbG93ZXN0X2Nvbm4odGNvbm4pID49IENfQ09OTkVDVEVEKSB7CisJCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJaWYgKHJlc291cmNlLT5zdXNwX2ZlbiAmJiBjb25uX2xvd2VzdF9jb25uKGNvbm5lY3Rpb24pID49IENfQ09OTkVDVEVEKSB7CiAJCQkvKiBjYXNlMjogVGhlIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIGFnYWluOiAqLwotCQkJc3RydWN0IGRyYmRfY29uZiAqb2RldjsKKwkJCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAkJCWludCB2bnI7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG9kZXYsIHZucikKLQkJCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmb2Rldi0+ZmxhZ3MpOworCQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpCisJCQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJnBlZXJfZGV2aWNlLT5kZXZpY2UtPmZsYWdzKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJX3RsX3Jlc3RhcnQodGNvbm4sIFJFU0VORCk7Ci0JCQlfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLAorCQkJX3RsX3Jlc3RhcnQoY29ubmVjdGlvbiwgUkVTRU5EKTsKKwkJCV9jb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3BfZmVuID0gMSB9IH0sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX2ZlbiA9IDAgfSB9LAogCQkJCQkgICAgQ1NfVkVSQk9TRSk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAl9CiAKIAkvKiBCZWNhbWUgc3luYyBzb3VyY2UuICBXaXRoIHByb3RvY29sID49IDk2LCB3ZSBzdGlsbCBuZWVkIHRvIHNlbmQgb3V0CkBAIC0xMjc5LDkgKzEyOTIsOSBAQAogCSAqIHdoaWNoIGlzIHVuZXhwZWN0ZWQuICovCiAJaWYgKChvcy5jb25uICE9IENfU1lOQ19TT1VSQ0UgJiYgb3MuY29ubiAhPSBDX1BBVVNFRF9TWU5DX1MpICYmCiAJICAgIChucy5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwgbnMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MpICYmCi0JICAgIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTYgJiYgZ2V0X2xkZXYobWRldikpIHsKLQkJZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKG1kZXYpOwotCQlwdXRfbGRldihtZGV2KTsKKwkgICAgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk2ICYmIGdldF9sZGV2KGRldmljZSkpIHsKKwkJZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCS8qIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBpZiBhYm92ZSBhbmQgdGhlIHR3byBiZWxvdy4uLiAqLwpAQCAtMTI4OSwyMCArMTMwMiwyMCBAQAogCSAgICBucy5wZHNrID4gRF9ESVNLTEVTUyAmJiBucy5wZHNrICE9IERfVU5LTk9XTikgeyAgICAgIC8qIGF0dGFjaCBvbiB0aGUgcGVlciAqLwogCQkvKiB3ZSBwcm9iYWJseSB3aWxsIHN0YXJ0IGEgcmVzeW5jIHNvb24uCiAJCSAqIG1ha2Ugc3VyZSB0aG9zZSB0aGluZ3MgYXJlIHByb3Blcmx5IHJlc2V0LiAqLwotCQltZGV2LT5yc190b3RhbCA9IDA7Ci0JCW1kZXYtPnJzX2ZhaWxlZCA9IDA7Ci0JCWF0b21pY19zZXQoJm1kZXYtPnJzX3BlbmRpbmdfY250LCAwKTsKLQkJZHJiZF9yc19jYW5jZWxfYWxsKG1kZXYpOworCQlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwkJZGV2aWNlLT5yc19mYWlsZWQgPSAwOworCQlhdG9taWNfc2V0KCZkZXZpY2UtPnJzX3BlbmRpbmdfY250LCAwKTsKKwkJZHJiZF9yc19jYW5jZWxfYWxsKGRldmljZSk7CiAKLQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfdXVpZHMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAJfQogCS8qIE5vIHBvaW50IGluIHF1ZXVpbmcgc2VuZF9iaXRtYXAgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvbm5lY3Rpb24KIAkgKiBhbnltb3JlLCBzbyBjaGVjayBhbHNvIHRoZSBfY3VycmVudF8gc3RhdGUsIG5vdCBvbmx5IHRoZSBuZXcgc3RhdGUKIAkgKiBhdCB0aGUgdGltZSB0aGlzIHdvcmsgd2FzIHF1ZXVlZC4gKi8KIAlpZiAob3MuY29ubiAhPSBDX1dGX0JJVE1BUF9TICYmIG5zLmNvbm4gPT0gQ19XRl9CSVRNQVBfUyAmJgotCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfQklUTUFQX1MpCi0JCWRyYmRfcXVldWVfYml0bWFwX2lvKG1kZXYsICZkcmJkX3NlbmRfYml0bWFwLCBOVUxMLAorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9CSVRNQVBfUykKKwkJZHJiZF9xdWV1ZV9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9zZW5kX2JpdG1hcCwgTlVMTCwKIAkJCQkic2VuZF9iaXRtYXAgKFdGQml0TWFwUykiLAogCQkJCUJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwogCkBAIC0xMzEzLDgwICsxMzI2LDgwIEBACiAJJiYgIChucy5wZHNrIDwgRF9JTkNPTlNJU1RFTlQgfHwKIAkgICAgIG5zLnBkc2sgPT0gRF9VTktOT1dOIHx8CiAJICAgICBucy5wZHNrID09IERfT1VUREFURUQpKSB7Ci0JCWlmIChnZXRfbGRldihtZGV2KSkgeworCQlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQkJaWYgKChucy5yb2xlID09IFJfUFJJTUFSWSB8fCBucy5wZWVyID09IFJfUFJJTUFSWSkgJiYKLQkJCSAgICBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCAmJiBucy5kaXNrID49IERfVVBfVE9fREFURSkgewotCQkJCWlmIChkcmJkX3N1c3BlbmRlZChtZGV2KSkgewotCQkJCQlzZXRfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwkJCSAgICBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIG5zLmRpc2sgPj0gRF9VUF9UT19EQVRFKSB7CisJCQkJaWYgKGRyYmRfc3VzcGVuZGVkKGRldmljZSkpIHsKKwkJCQkJc2V0X2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKTsKIAkJCQl9IGVsc2UgewotCQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQobWRldik7Ci0JCQkJCWRyYmRfc2VuZF91dWlkcyhtZGV2KTsKKwkJCQkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCQkJCWRyYmRfc2VuZF91dWlkcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAkJCQl9CiAJCQl9Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAl9CiAKLQlpZiAobnMucGRzayA8IERfSU5DT05TSVNURU5UICYmIGdldF9sZGV2KG1kZXYpKSB7CisJaWYgKG5zLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCAmJiBnZXRfbGRldihkZXZpY2UpKSB7CiAJCWlmIChvcy5wZWVyID09IFJfU0VDT05EQVJZICYmIG5zLnBlZXIgPT0gUl9QUklNQVJZICYmCi0JCSAgICBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCAmJiBucy5kaXNrID49IERfVVBfVE9fREFURSkgewotCQkJZHJiZF91dWlkX25ld19jdXJyZW50KG1kZXYpOwotCQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOworCQkgICAgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCAmJiBucy5kaXNrID49IERfVVBfVE9fREFURSkgeworCQkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCQlkcmJkX3NlbmRfdXVpZHMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CiAJCX0KIAkJLyogRF9ESVNLTEVTUyBQZWVyIGJlY29tZXMgc2Vjb25kYXJ5ICovCiAJCWlmIChvcy5wZWVyID09IFJfUFJJTUFSWSAmJiBucy5wZWVyID09IFJfU0VDT05EQVJZKQogCQkJLyogV2UgbWF5IHN0aWxsIGJlIFByaW1hcnkgb3Vyc2VsdmVzLgogCQkJICogTm8gaGFybSBkb25lIGlmIHRoZSBiaXRtYXAgc3RpbGwgY2hhbmdlcywKIAkJCSAqIHJlZGlydGllZCBwYWdlcyB3aWxsIGZvbGxvdyBsYXRlci4gKi8KLQkJCWRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKG1kZXYsICZkcmJkX2JtX3dyaXRlLAorCQkJZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIoZGV2aWNlLCAmZHJiZF9ibV93cml0ZSwKIAkJCQkiZGVtb3RlIGRpc2tsZXNzIHBlZXIiLCBCTV9MT0NLRURfU0VUX0FMTE9XRUQpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBXcml0ZSBvdXQgYWxsIGNoYW5nZWQgYml0cyBvbiBkZW1vdGUuCiAJICogVGhvdWdoLCBubyBuZWVkIHRvIGRhIHRoYXQganVzdCB5ZXQKIAkgKiBpZiB0aGVyZSBpcyBhIHJlc3luYyBnb2luZyBvbiBzdGlsbCAqLwogCWlmIChvcy5yb2xlID09IFJfUFJJTUFSWSAmJiBucy5yb2xlID09IFJfU0VDT05EQVJZICYmCi0JCW1kZXYtPnN0YXRlLmNvbm4gPD0gQ19DT05ORUNURUQgJiYgZ2V0X2xkZXYobWRldikpIHsKKwkJZGV2aWNlLT5zdGF0ZS5jb25uIDw9IENfQ09OTkVDVEVEICYmIGdldF9sZGV2KGRldmljZSkpIHsKIAkJLyogTm8gY2hhbmdlcyB0byB0aGUgYml0bWFwIGV4cGVjdGVkIHRoaXMgdGltZSwgc28gYXNzZXJ0IHRoYXQsCiAJCSAqIGV2ZW4gdGhvdWdoIG5vIGhhcm0gd2FzIGRvbmUgaWYgaXQgZGlkIGNoYW5nZS4gKi8KLQkJZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIobWRldiwgJmRyYmRfYm1fd3JpdGUsCisJCWRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKGRldmljZSwgJmRyYmRfYm1fd3JpdGUsCiAJCQkJImRlbW90ZSIsIEJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBMYXN0IHBhcnQgb2YgdGhlIGF0dGFjaGluZyBwcm9jZXNzIC4uLiAqLwogCWlmIChucy5jb25uID49IENfQ09OTkVDVEVEICYmCiAJICAgIG9zLmRpc2sgPT0gRF9BVFRBQ0hJTkcgJiYgbnMuZGlzayA9PSBEX05FR09USUFUSU5HKSB7Ci0JCWRyYmRfc2VuZF9zaXplcyhtZGV2LCAwLCAwKTsgIC8qIHRvIHN0YXJ0IHN5bmMuLi4gKi8KLQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc2l6ZXMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgMCwgMCk7ICAvKiB0byBzdGFydCBzeW5jLi4uICovCisJCWRyYmRfc2VuZF91dWlkcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAl9CiAKIAkvKiBXZSB3YW50IHRvIHBhdXNlL2NvbnRpbnVlIHJlc3luYywgdGVsbCBwZWVyLiAqLwogCWlmIChucy5jb25uID49IENfQ09OTkVDVEVEICYmCiAJICAgICAoKG9zLmFmdHJfaXNwICE9IG5zLmFmdHJfaXNwKSB8fAogCSAgICAgIChvcy51c2VyX2lzcCAhPSBucy51c2VyX2lzcCkpKQotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJLyogSW4gY2FzZSBvbmUgb2YgdGhlIGlzcCBiaXRzIGdvdCBzZXQsIHN1c3BlbmQgb3RoZXIgZGV2aWNlcy4gKi8KIAlpZiAoKCFvcy5hZnRyX2lzcCAmJiAhb3MucGVlcl9pc3AgJiYgIW9zLnVzZXJfaXNwKSAmJgogCSAgICAobnMuYWZ0cl9pc3AgfHwgbnMucGVlcl9pc3AgfHwgbnMudXNlcl9pc3ApKQotCQlzdXNwZW5kX290aGVyX3NnKG1kZXYpOworCQlzdXNwZW5kX290aGVyX3NnKGRldmljZSk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHBlZXIgZ2V0cyBpbmZvcm1lZCBhYm91dCBldmVudHVhbCBzdGF0ZQogCSAgIGNoYW5nZXMgKElTUCBiaXRzKSB3aGlsZSB3ZSB3ZXJlIGluIFdGUmVwb3J0UGFyYW1zLiAqLwogCWlmIChvcy5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBucy5jb25uID49IENfQ09OTkVDVEVEKQotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJaWYgKG9zLmNvbm4gIT0gQ19BSEVBRCAmJiBucy5jb25uID09IENfQUhFQUQpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAkvKiBXZSBhcmUgaW4gdGhlIHByb2dyZXNzIHRvIHN0YXJ0IGEgZnVsbCBzeW5jLi4uICovCiAJaWYgKChvcy5jb25uICE9IENfU1RBUlRJTkdfU1lOQ19UICYmIG5zLmNvbm4gPT0gQ19TVEFSVElOR19TWU5DX1QpIHx8CiAJICAgIChvcy5jb25uICE9IENfU1RBUlRJTkdfU1lOQ19TICYmIG5zLmNvbm4gPT0gQ19TVEFSVElOR19TWU5DX1MpKQogCQkvKiBubyBvdGhlciBiaXRtYXAgY2hhbmdlcyBleHBlY3RlZCBkdXJpbmcgdGhpcyBwaGFzZSAqLwotCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhtZGV2LAorCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhkZXZpY2UsCiAJCQkmZHJiZF9ibWlvX3NldF9uX3dyaXRlLCAmYWJ3X3N0YXJ0X3N5bmMsCiAJCQkic2V0X25fd3JpdGUgZnJvbSBTdGFydGluZ1N5bmMiLCBCTV9MT0NLRURfVEVTVF9BTExPV0VEKTsKIApAQCAtMTM5OSwxNSArMTQxMiwxNSBAQAogCQkgKiBvdXIgY2xlYW51cCBoZXJlIHdpdGggdGhlIHRyYW5zaXRpb24gdG8gRF9ESVNLTEVTUy4KIAkJICogQnV0IGlzIGlzIHN0aWxsIG5vdCBzYXZlIHRvIGRyZWZlcmVuY2UgbGRldiBoZXJlLCBzaW5jZQogCQkgKiB3ZSBtaWdodCBjb21lIGZyb20gYW4gZmFpbGVkIEF0dGFjaCBiZWZvcmUgbGRldiB3YXMgc2V0LiAqLwotCQlpZiAobWRldi0+bGRldikgeworCQlpZiAoZGV2aWNlLT5sZGV2KSB7CiAJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQllaCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5vbl9pb19lcnJvcjsKKwkJCWVoID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+b25faW9fZXJyb3I7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQkJd2FzX2lvX2Vycm9yID0gdGVzdF9hbmRfY2xlYXJfYml0KFdBU19JT19FUlJPUiwgJm1kZXYtPmZsYWdzKTsKKwkJCXdhc19pb19lcnJvciA9IHRlc3RfYW5kX2NsZWFyX2JpdChXQVNfSU9fRVJST1IsICZkZXZpY2UtPmZsYWdzKTsKIAogCQkJaWYgKHdhc19pb19lcnJvciAmJiBlaCA9PSBFUF9DQUxMX0hFTFBFUikKLQkJCQlkcmJkX2toZWxwZXIobWRldiwgImxvY2FsLWlvLWVycm9yIik7CisJCQkJZHJiZF9raGVscGVyKGRldmljZSwgImxvY2FsLWlvLWVycm9yIik7CiAKIAkJCS8qIEltbWVkaWF0ZWx5IGFsbG93IGNvbXBsZXRpb24gb2YgYWxsIGFwcGxpY2F0aW9uIElPLAogCQkJICogdGhhdCB3YWl0cyBmb3IgY29tcGxldGlvbiBmcm9tIHRoZSBsb2NhbCBkaXNrLApAQCAtMTQyMiw3NiArMTQzNSw3NiBAQAogCQkJICogU28gYWJvcnRpbmcgbG9jYWwgcmVxdWVzdHMgbWF5IGNhdXNlIGNyYXNoZXMsCiAJCQkgKiBvciBldmVuIHdvcnNlLCBzaWxlbnQgZGF0YSBjb3JydXB0aW9uLgogCQkJICovCi0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKSkKLQkJCQl0bF9hYm9ydF9kaXNrX2lvKG1kZXYpOworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGT1JDRV9ERVRBQ0gsICZkZXZpY2UtPmZsYWdzKSkKKwkJCQl0bF9hYm9ydF9kaXNrX2lvKGRldmljZSk7CiAKIAkJCS8qIGN1cnJlbnQgc3RhdGUgc3RpbGwgaGFzIHRvIGJlIERfRkFJTEVELAogCQkJICogdGhlcmUgaXMgb25seSBvbmUgd2F5IG91dDogdG8gRF9ESVNLTEVTUywKIAkJCSAqIGFuZCB0aGF0IG1heSBvbmx5IGhhcHBlbiBhZnRlciBvdXIgcHV0X2xkZXYgYmVsb3cuICovCi0JCQlpZiAobWRldi0+c3RhdGUuZGlzayAhPSBEX0ZBSUxFRCkKLQkJCQlkZXZfZXJyKERFViwKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9GQUlMRUQpCisJCQkJZHJiZF9lcnIoZGV2aWNlLAogCQkJCQkiQVNTRVJUIEZBSUxFRDogZGlzayBpcyAlcyBkdXJpbmcgZGV0YWNoXG4iLAotCQkJCQlkcmJkX2Rpc2tfc3RyKG1kZXYtPnN0YXRlLmRpc2spKTsKKwkJCQkJZHJiZF9kaXNrX3N0cihkZXZpY2UtPnN0YXRlLmRpc2spKTsKIAogCQkJaWYgKG5zLmNvbm4gPj0gQ19DT05ORUNURUQpCi0JCQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkJCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCi0JCQlkcmJkX3JzX2NhbmNlbF9hbGwobWRldik7CisJCQlkcmJkX3JzX2NhbmNlbF9hbGwoZGV2aWNlKTsKIAogCQkJLyogSW4gY2FzZSB3ZSB3YW50IHRvIGdldCBzb21ldGhpbmcgdG8gc3RhYmxlIHN0b3JhZ2Ugc3RpbGwsCiAJCQkgKiB0aGlzIG1heSBiZSB0aGUgbGFzdCBjaGFuY2UuCiAJCQkgKiBGb2xsb3dpbmcgcHV0X2xkZXYgbWF5IHRyYW5zaXRpb24gdG8gRF9ESVNLTEVTUy4gKi8KLQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCQl9Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAotICAgICAgICAvKiBzZWNvbmQgaGFsZiBvZiBsb2NhbCBJTyBlcnJvciwgZmFpbHVyZSB0byBhdHRhY2gsCi0gICAgICAgICAqIG9yIGFkbWluaXN0cmF0aXZlIGRldGFjaCwKLSAgICAgICAgICogYWZ0ZXIgbG9jYWxfY250IHJlZmVyZW5jZXMgaGF2ZSByZWFjaGVkIHplcm8gYWdhaW4gKi8KLSAgICAgICAgaWYgKG9zLmRpc2sgIT0gRF9ESVNLTEVTUyAmJiBucy5kaXNrID09IERfRElTS0xFU1MpIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBtdXN0IHN0aWxsIGJlIGRpc2tsZXNzLAotICAgICAgICAgICAgICAgICAqIHJlLWF0dGFjaCBoYXMgdG8gYmUgc2VyaWFsaXplZCB3aXRoIHRoaXMhICovCi0gICAgICAgICAgICAgICAgaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoREVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVNTRVJUIEZBSUxFRDogZGlzayBpcyAlcyB3aGlsZSBnb2luZyBkaXNrbGVzc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSk7CisJLyogc2Vjb25kIGhhbGYgb2YgbG9jYWwgSU8gZXJyb3IsIGZhaWx1cmUgdG8gYXR0YWNoLAorCSAqIG9yIGFkbWluaXN0cmF0aXZlIGRldGFjaCwKKwkgKiBhZnRlciBsb2NhbF9jbnQgcmVmZXJlbmNlcyBoYXZlIHJlYWNoZWQgemVybyBhZ2FpbiAqLworCWlmIChvcy5kaXNrICE9IERfRElTS0xFU1MgJiYgbnMuZGlzayA9PSBEX0RJU0tMRVNTKSB7CisJCS8qIFdlIG11c3Qgc3RpbGwgYmUgZGlza2xlc3MsCisJCSAqIHJlLWF0dGFjaCBoYXMgdG8gYmUgc2VyaWFsaXplZCB3aXRoIHRoaXMhICovCisJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKKwkJCWRyYmRfZXJyKGRldmljZSwKKwkJCQkgIkFTU0VSVCBGQUlMRUQ6IGRpc2sgaXMgJXMgd2hpbGUgZ29pbmcgZGlza2xlc3NcbiIsCisJCQkJIGRyYmRfZGlza19zdHIoZGV2aWNlLT5zdGF0ZS5kaXNrKSk7CiAKIAkJaWYgKG5zLmNvbm4gPj0gQ19DT05ORUNURUQpCi0JCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAkJLyogY29ycmVzcG9uZGluZyBnZXRfbGRldiBpbiBfX2RyYmRfc2V0X3N0YXRlCiAJCSAqIHRoaXMgbWF5IGZpbmFsbHkgdHJpZ2dlciBkcmJkX2xkZXZfZGVzdHJveS4gKi8KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogTm90aWZ5IHBlZXIgdGhhdCBJIGhhZCBhIGxvY2FsIElPIGVycm9yLCBhbmQgZGlkIG5vdCBkZXRhY2hlZC4uICovCiAJaWYgKG9zLmRpc2sgPT0gRF9VUF9UT19EQVRFICYmIG5zLmRpc2sgPT0gRF9JTkNPTlNJU1RFTlQgJiYgbnMuY29ubiA+PSBDX0NPTk5FQ1RFRCkKLQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAogCS8qIERpc2tzIGdvdCBiaWdnZXIgd2hpbGUgdGhleSB3ZXJlIGRldGFjaGVkICovCiAJaWYgKG5zLmRpc2sgPiBEX05FR09USUFUSU5HICYmIG5zLnBkc2sgPiBEX05FR09USUFUSU5HICYmCi0JICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRVNZTkNfQUZURVJfTkVHLCAmbWRldi0+ZmxhZ3MpKSB7CisJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRVNZTkNfQUZURVJfTkVHLCAmZGV2aWNlLT5mbGFncykpIHsKIAkJaWYgKG5zLmNvbm4gPT0gQ19DT05ORUNURUQpCi0JCQlyZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3cobWRldik7CisJCQlyZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3coZGV2aWNlKTsKIAl9CiAKIAkvKiBBIHJlc3luYyBmaW5pc2hlZCBvciBhYm9ydGVkLCB3YWtlIHBhdXNlZCBkZXZpY2VzLi4uICovCiAJaWYgKChvcy5jb25uID4gQ19DT05ORUNURUQgJiYgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCkgfHwKIAkgICAgKG9zLnBlZXJfaXNwICYmICFucy5wZWVyX2lzcCkgfHwKIAkgICAgKG9zLnVzZXJfaXNwICYmICFucy51c2VyX2lzcCkpCi0JCXJlc3VtZV9uZXh0X3NnKG1kZXYpOworCQlyZXN1bWVfbmV4dF9zZyhkZXZpY2UpOwogCiAJLyogc3luYyB0YXJnZXQgZG9uZSB3aXRoIHJlc3luYy4gIEV4cGxpY2l0bHkgbm90aWZ5IHBlZXIsIGV2ZW4gdGhvdWdoCiAJICogaXQgc2hvdWxkIChhdCBsZWFzdCBmb3Igbm9uLWVtcHR5IHJlc3luY3MpIGFscmVhZHkga25vdyBpdHNlbGYuICovCiAJaWYgKG9zLmRpc2sgPCBEX1VQX1RPX0RBVEUgJiYgb3MuY29ubiA+PSBDX1NZTkNfU09VUkNFICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAkvKiBWZXJpZnkgZmluaXNoZWQsIG9yIHJlYWNoZWQgc3RvcCBzZWN0b3IuICBQZWVyIGRpZCBub3Qga25vdyBhYm91dAogCSAqIHRoZSBzdG9wIHNlY3RvciwgYW5kIHdlIG1heSBldmVuIGhhdmUgY2hhbmdlZCB0aGUgc3RvcCBzZWN0b3IgZHVyaW5nCiAJICogdmVyaWZ5IHRvIGludGVycnVwdC9zdG9wIGVhcmx5LiAgU2VuZCB0aGUgbmV3IHN0YXRlLiAqLwogCWlmIChvcy5jb25uID09IENfVkVSSUZZX1MgJiYgbnMuY29ubiA9PSBDX0NPTk5FQ1RFRAotCSYmIHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IobWRldikpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpKQorCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJLyogVGhpcyB0cmlnZ2VycyBiaXRtYXAgd3JpdGVvdXQgb2YgcG90ZW50aWFsbHkgc3RpbGwgdW53cml0dGVuIHBhZ2VzCiAJICogaWYgdGhlIHJlc3luYyBmaW5pc2hlZCBjbGVhbmx5LCBvciBhYm9ydGVkIGJlY2F1c2Ugb2YgcGVlciBkaXNrCkBAIC0xNTAwLDU2ICsxNTEzLDU3IEBACiAJICogYW55IGJpdG1hcCB3cml0ZW91dCBhbnltb3JlLgogCSAqIE5vIGhhcm0gZG9uZSBpZiBzb21lIGJpdHMgY2hhbmdlIGR1cmluZyB0aGlzIHBoYXNlLgogCSAqLwotCWlmIChvcy5jb25uID4gQ19DT05ORUNURUQgJiYgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCAmJiBnZXRfbGRldihtZGV2KSkgewotCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibV93cml0ZV9jb3B5X3BhZ2VzLCBOVUxMLAorCWlmIChvcy5jb25uID4gQ19DT05ORUNURUQgJiYgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCAmJiBnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcXVldWVfYml0bWFwX2lvKGRldmljZSwgJmRyYmRfYm1fd3JpdGVfY29weV9wYWdlcywgTlVMTCwKIAkJCSJ3cml0ZSBmcm9tIHJlc3luY19maW5pc2hlZCIsIEJNX0xPQ0tFRF9DSEFOR0VfQUxMT1dFRCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWlmIChucy5kaXNrID09IERfRElTS0xFU1MgJiYKIAkgICAgbnMuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYKIAkgICAgbnMucm9sZSA9PSBSX1NFQ09OREFSWSkgewogCQlpZiAob3MuYWZ0cl9pc3AgIT0gbnMuYWZ0cl9pc3ApCi0JCQlyZXN1bWVfbmV4dF9zZyhtZGV2KTsKKwkJCXJlc3VtZV9uZXh0X3NnKGRldmljZSk7CiAJfQogCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogfQogCiBzdHJ1Y3QgYWZ0ZXJfY29ubl9zdGF0ZV9jaGdfd29yayB7CiAJc3RydWN0IGRyYmRfd29yayB3OwogCWVudW0gZHJiZF9jb25ucyBvYzsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zX21pbjsKLQl1bmlvbiBkcmJkX3N0YXRlIG5zX21heDsgLyogbmV3LCBtYXggc3RhdGUsIG92ZXIgYWxsIG1kZXZzICovCisJdW5pb24gZHJiZF9zdGF0ZSBuc19tYXg7IC8qIG5ldywgbWF4IHN0YXRlLCBvdmVyIGFsbCBkZXZpY2VzICovCiAJZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3M7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIH07CiAKIHN0YXRpYyBpbnQgd19hZnRlcl9jb25uX3N0YXRlX2NoKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7CiAJc3RydWN0IGFmdGVyX2Nvbm5fc3RhdGVfY2hnX3dvcmsgKmFjc2N3ID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBhZnRlcl9jb25uX3N0YXRlX2NoZ193b3JrLCB3KTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB3LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gYWNzY3ctPmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX2Nvbm5zIG9jID0gYWNzY3ctPm9jOwogCXVuaW9uIGRyYmRfc3RhdGUgbnNfbWF4ID0gYWNzY3ctPm5zX21heDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJa2ZyZWUoYWNzY3cpOwogCiAJLyogVXBvbiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24sIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHJlY2VpdmVyICovCiAJaWYgKG9jID09IENfU1RBTkRBTE9ORSAmJiBuc19tYXguY29ubiA9PSBDX1VOQ09OTkVDVEVEKQotCQlkcmJkX3RocmVhZF9zdGFydCgmdGNvbm4tPnJlY2VpdmVyKTsKKwkJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCWlmIChvYyA9PSBDX0RJU0NPTk5FQ1RJTkcgJiYgbnNfbWF4LmNvbm4gPT0gQ19TVEFOREFMT05FKSB7CiAJCXN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmY7CiAKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKLQkJb2xkX2NvbmYgPSB0Y29ubi0+bmV0X2NvbmY7Ci0JCXRjb25uLT5teV9hZGRyX2xlbiA9IDA7Ci0JCXRjb25uLT5wZWVyX2FkZHJfbGVuID0gMDsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHRjb25uLT5uZXRfY29uZiwgTlVMTCk7Ci0JCWNvbm5fZnJlZV9jcnlwdG8odGNvbm4pOwotCQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7CisJCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCW9sZF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CisJCWNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID0gMDsKKwkJY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbiA9IDA7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uZWN0aW9uLT5uZXRfY29uZiwgTlVMTCk7CisJCWNvbm5fZnJlZV9jcnlwdG8oY29ubmVjdGlvbik7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAogCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJa2ZyZWUob2xkX2NvbmYpOwpAQCAtMTU1OSw0NSArMTU3Myw0NyBAQAogCQkvKiBjYXNlMTogVGhlIG91dGRhdGUgcGVlciBoYW5kbGVyIGlzIHN1Y2Nlc3NmdWw6ICovCiAJCWlmIChuc19tYXgucGRzayA8PSBEX09VVERBVEVEKSB7CiAJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCQlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJCQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwkJCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCQkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQkJCWlmICh0ZXN0X2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsKKwkJCQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpOwogCQkJCX0KIAkJCX0KIAkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQkJCV90bF9yZXN0YXJ0KHRjb25uLCBDT05ORUNUSU9OX0xPU1RfV0hJTEVfUEVORElORyk7Ci0JCQlfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLAorCQkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJCV90bF9yZXN0YXJ0KGNvbm5lY3Rpb24sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKKwkJCV9jb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3BfZmVuID0gMSB9IH0sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX2ZlbiA9IDAgfSB9LAogCQkJCQkgICAgQ1NfVkVSQk9TRSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCX0KIAl9Ci0Ja3JlZl9wdXQoJnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlrcmVmX3B1dCgmY29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOwogCi0JY29ubl9tZF9zeW5jKHRjb25uKTsKKwljb25uX21kX3N5bmMoY29ubmVjdGlvbik7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjb25uX29sZF9jb21tb25fc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlICpwY3MsIGVudW0gY2hnX3N0YXRlX2ZsYWdzICpwZikKK3ZvaWQgY29ubl9vbGRfY29tbW9uX3N0YXRlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgKnBjcywgZW51bSBjaGdfc3RhdGVfZmxhZ3MgKnBmKQogewogCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzID0gfjA7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZuciwgZmlyc3Rfdm9sID0gMTsKIAl1bmlvbiBkcmJkX2Rldl9zdGF0ZSBvcywgY3MgPSB7CiAJCXsgLnJvbGUgPSBSX1NFQ09OREFSWSwKIAkJICAucGVlciA9IFJfVU5LTk9XTiwKLQkJICAuY29ubiA9IHRjb25uLT5jc3RhdGUsCisJCSAgLmNvbm4gPSBjb25uZWN0aW9uLT5jc3RhdGUsCiAJCSAgLmRpc2sgPSBEX0RJU0tMRVNTLAogCQkgIC5wZHNrID0gRF9VTktOT1dOLAogCQl9IH07CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCW9zID0gbWRldi0+c3RhdGU7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlvcyA9IGRldmljZS0+c3RhdGU7CiAKIAkJaWYgKGZpcnN0X3ZvbCkgewogCQkJY3MgPSBvczsKQEAgLTE2MjgsMTggKzE2NDQsMTkgQEAKIH0KIAogc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydgotY29ubl9pc192YWxpZF90cmFuc2l0aW9uKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKK2Nvbm5faXNfdmFsaWRfdHJhbnNpdGlvbihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkJIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydiA9IFNTX1NVQ0NFU1M7CiAJdW5pb24gZHJiZF9zdGF0ZSBucywgb3M7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0JCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwkJbnMgPSBzYW5pdGl6ZV9zdGF0ZShkZXZpY2UsIGFwcGx5X21hc2tfdmFsKG9zLCBtYXNrLCB2YWwpLCBOVUxMKTsKIAogCQlpZiAoZmxhZ3MgJiBDU19JR05fT1VURF9GQUlMICYmIG5zLmRpc2sgPT0gRF9PVVREQVRFRCAmJiBvcy5kaXNrIDwgRF9PVVREQVRFRCkKIAkJCW5zLmRpc2sgPSBvcy5kaXNrOwpAQCAtMTY0OCwzMCArMTY2NSwyOSBAQAogCQkJY29udGludWU7CiAKIAkJcnYgPSBpc192YWxpZF90cmFuc2l0aW9uKG9zLCBucyk7Ci0JCWlmIChydiA8IFNTX1NVQ0NFU1MpCi0JCQlicmVhazsKIAotCQlpZiAoIShmbGFncyAmIENTX0hBUkQpKSB7Ci0JCQlydiA9IGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG5zKTsKKwkJaWYgKHJ2ID49IFNTX1NVQ0NFU1MgJiYgIShmbGFncyAmIENTX0hBUkQpKSB7CisJCQlydiA9IGlzX3ZhbGlkX3N0YXRlKGRldmljZSwgbnMpOwogCQkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQkJCWlmIChpc192YWxpZF9zdGF0ZShtZGV2LCBvcykgPT0gcnYpCi0JCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgdGNvbm4pOworCQkJCWlmIChpc192YWxpZF9zdGF0ZShkZXZpY2UsIG9zKSA9PSBydikKKwkJCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBjb25uZWN0aW9uKTsKIAkJCX0gZWxzZQotCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgdGNvbm4pOworCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgY29ubmVjdGlvbik7CiAJCX0KLQkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKKworCQlpZiAocnYgPCBTU19TVUNDRVNTKSB7CisJCQlpZiAoZmxhZ3MgJiBDU19WRVJCT1NFKQorCQkJCXByaW50X3N0X2VycihkZXZpY2UsIG9zLCBucywgcnYpOwogCQkJYnJlYWs7CisJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAocnYgPCBTU19TVUNDRVNTICYmIGZsYWdzICYgQ1NfVkVSQk9TRSkKLQkJcHJpbnRfc3RfZXJyKG1kZXYsIG9zLCBucywgcnYpOwotCiAJcmV0dXJuIHJ2OwogfQogCiB2b2lkCi1jb25uX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCitjb25uX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCSAgICAgICB1bmlvbiBkcmJkX3N0YXRlICpwbnNfbWluLCB1bmlvbiBkcmJkX3N0YXRlICpwbnNfbWF4LCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zLCBvcywgbnNfbWF4ID0geyB9OwpAQCAtMTY4Miw3ICsxNjk4LDcgQEAKIAkJICAuZGlzayA9IERfTUFTSywKIAkJICAucGRzayA9IERfTUFTSwogCQl9IH07Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCWludCB2bnIsIG51bWJlcl9vZl92b2x1bWVzID0gMDsKIApAQCAtMTY5MCwyNyArMTcwNiwyOCBAQAogCQkvKiByZW1lbWJlciBsYXN0IGNvbm5lY3QgdGltZSBzbyByZXF1ZXN0X3RpbWVyX2ZuKCkgd29uJ3QKIAkJICoga2lsbCBuZXdseSBlc3RhYmxpc2hlZCBzZXNzaW9ucyB3aGlsZSB3ZSBhcmUgc3RpbGwgdHJ5aW5nIHRvIHRoYXcKIAkJICogcHJldmlvdXNseSBmcm96ZW4gSU8gKi8KLQkJaWYgKHRjb25uLT5jc3RhdGUgIT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIHZhbC5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykKLQkJCXRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYgPSBqaWZmaWVzOworCQlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlICE9IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiB2YWwuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJCQljb25uZWN0aW9uLT5sYXN0X3JlY29ubmVjdF9qaWYgPSBqaWZmaWVzOwogCi0JCXRjb25uLT5jc3RhdGUgPSB2YWwuY29ubjsKKwkJY29ubmVjdGlvbi0+Y3N0YXRlID0gdmFsLmNvbm47CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgeworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAkJbnVtYmVyX29mX3ZvbHVtZXMrKzsKLQkJb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJCW9zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CiAJCW5zID0gYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCk7Ci0JCW5zID0gc2FuaXRpemVfc3RhdGUobWRldiwgbnMsIE5VTEwpOworCQlucyA9IHNhbml0aXplX3N0YXRlKGRldmljZSwgbnMsIE5VTEwpOwogCiAJCWlmIChmbGFncyAmIENTX0lHTl9PVVREX0ZBSUwgJiYgbnMuZGlzayA9PSBEX09VVERBVEVEICYmIG9zLmRpc2sgPCBEX09VVERBVEVEKQogCQkJbnMuZGlzayA9IG9zLmRpc2s7CiAKLQkJcnYgPSBfX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBmbGFncywgTlVMTCk7CisJCXJ2ID0gX19kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBmbGFncywgTlVMTCk7CiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCQlCVUcoKTsKIAotCQlucy5pID0gbWRldi0+c3RhdGUuaTsKKwkJbnMuaSA9IGRldmljZS0+c3RhdGUuaTsKIAkJbnNfbWF4LnJvbGUgPSBtYXhfcm9sZShucy5yb2xlLCBuc19tYXgucm9sZSk7CiAJCW5zX21heC5wZWVyID0gbWF4X3JvbGUobnMucGVlciwgbnNfbWF4LnBlZXIpOwogCQluc19tYXguY29ubiA9IG1heF90KGVudW0gZHJiZF9jb25ucywgbnMuY29ubiwgbnNfbWF4LmNvbm4pOwpAQCAtMTczNSwzOSArMTc1MiwzOSBAQAogCQkJfSB9OwogCX0KIAotCW5zX21pbi5zdXNwID0gbnNfbWF4LnN1c3AgPSB0Y29ubi0+c3VzcDsKLQluc19taW4uc3VzcF9ub2QgPSBuc19tYXguc3VzcF9ub2QgPSB0Y29ubi0+c3VzcF9ub2Q7Ci0JbnNfbWluLnN1c3BfZmVuID0gbnNfbWF4LnN1c3BfZmVuID0gdGNvbm4tPnN1c3BfZmVuOworCW5zX21pbi5zdXNwID0gbnNfbWF4LnN1c3AgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+c3VzcDsKKwluc19taW4uc3VzcF9ub2QgPSBuc19tYXguc3VzcF9ub2QgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+c3VzcF9ub2Q7CisJbnNfbWluLnN1c3BfZmVuID0gbnNfbWF4LnN1c3BfZmVuID0gY29ubmVjdGlvbi0+cmVzb3VyY2UtPnN1c3BfZmVuOwogCiAJKnBuc19taW4gPSBuc19taW47CiAJKnBuc19tYXggPSBuc19tYXg7CiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLV9jb25uX3JxX2NvbmQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQorX2Nvbm5fcnFfY29uZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJnRjb25uLT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1dEX1NUX0NIR19PS0FZLCAmY29ubmVjdGlvbi0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfU1VDQ0VTUzsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfRkFJTCwgJnRjb25uLT5mbGFncykpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1dEX1NUX0NIR19GQUlMLCAmY29ubmVjdGlvbi0+ZmxhZ3MpKQogCQlyZXR1cm4gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAKLQlydiA9IGNvbm5faXNfdmFsaWRfdHJhbnNpdGlvbih0Y29ubiwgbWFzaywgdmFsLCAwKTsKLQlpZiAocnYgPT0gU1NfU1VDQ0VTUyAmJiB0Y29ubi0+Y3N0YXRlID09IENfV0ZfUkVQT1JUX1BBUkFNUykKKwlydiA9IGNvbm5faXNfdmFsaWRfdHJhbnNpdGlvbihjb25uZWN0aW9uLCBtYXNrLCB2YWwsIDApOworCWlmIChydiA9PSBTU19TVUNDRVNTICYmIGNvbm5lY3Rpb24tPmNzdGF0ZSA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCiAJCXJ2ID0gU1NfVU5LTk9XTl9FUlJPUjsgLyogY29udGludWUgd2FpdGluZyAqLwogCiAJcmV0dXJuIHJ2OwogfQogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9jb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAorX2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2ID0gU1NfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWZ0ZXJfY29ubl9zdGF0ZV9jaGdfd29yayAqYWNzY3c7Ci0JZW51bSBkcmJkX2Nvbm5zIG9jID0gdGNvbm4tPmNzdGF0ZTsKKwllbnVtIGRyYmRfY29ubnMgb2MgPSBjb25uZWN0aW9uLT5jc3RhdGU7CiAJdW5pb24gZHJiZF9zdGF0ZSBuc19tYXgsIG5zX21pbiwgb3M7CiAJYm9vbCBoYXZlX211dGV4ID0gZmFsc2U7CiAKQEAgLTE3NzcsNyArMTc5NCw3IEBACiAJCQlnb3RvIGFib3J0OwogCX0KIAotCXJ2ID0gY29ubl9pc192YWxpZF90cmFuc2l0aW9uKHRjb25uLCBtYXNrLCB2YWwsIGZsYWdzKTsKKwlydiA9IGNvbm5faXNfdmFsaWRfdHJhbnNpdGlvbihjb25uZWN0aW9uLCBtYXNrLCB2YWwsIGZsYWdzKTsKIAlpZiAocnYgPCBTU19TVUNDRVNTKQogCQlnb3RvIGFib3J0OwogCkBAIC0xNzg3LDM4ICsxODA0LDM4IEBACiAJCS8qIFRoaXMgd2lsbCBiZSBhIGNsdXN0ZXItd2lkZSBzdGF0ZSBjaGFuZ2UuCiAJCSAqIE5lZWQgdG8gZ2l2ZSB1cCB0aGUgc3BpbmxvY2ssIGdyYWIgdGhlIG11dGV4LAogCQkgKiB0aGVuIHNlbmQgdGhlIHN0YXRlIGNoYW5nZSByZXF1ZXN0LCAuLi4gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQltdXRleF9sb2NrKCZ0Y29ubi0+Y3N0YXRlX211dGV4KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5jc3RhdGVfbXV0ZXgpOwogCQloYXZlX211dGV4ID0gdHJ1ZTsKIAotCQlzZXRfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJnRjb25uLT5mbGFncyk7Ci0JCWlmIChjb25uX3NlbmRfc3RhdGVfcmVxKHRjb25uLCBtYXNrLCB2YWwpKSB7CisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOworCQlpZiAoY29ubl9zZW5kX3N0YXRlX3JlcShjb25uZWN0aW9uLCBtYXNrLCB2YWwpKSB7CiAJCQkvKiBzZW5kaW5nIGZhaWxlZC4gKi8KLQkJCWNsZWFyX2JpdChDT05OX1dEX1NUX0NIR19SRVEsICZ0Y29ubi0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCXJ2ID0gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAJCQkvKiBuZWVkIHRvIHJlLWFxdWlyZSB0aGUgc3BpbiBsb2NrLCB0aG91Z2ggKi8KIAkJCWdvdG8gYWJvcnRfdW5sb2NrZWQ7CiAJCX0KIAogCQlpZiAodmFsLmNvbm4gPT0gQ19ESVNDT05ORUNUSU5HKQotCQkJc2V0X2JpdChESVNDT05ORUNUX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpOworCQkJc2V0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CiAKIAkJLyogLi4uIGFuZCByZS1hcXVpcmUgdGhlIHNwaW5sb2NrLgogCQkgKiBJZiBfY29ubl9ycV9jb25kKCkgcmV0dXJuZWQgPj0gU1NfU1VDQ0VTUywgd2UgbXVzdCBjYWxsCiAJCSAqIGNvbm5fc2V0X3N0YXRlKCkgd2l0aGluIHRoZSBzYW1lIHNwaW5sb2NrLiAqLwotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQl3YWl0X2V2ZW50X2xvY2tfaXJxKHRjb25uLT5waW5nX3dhaXQsCi0JCQkJKHJ2ID0gX2Nvbm5fcnFfY29uZCh0Y29ubiwgbWFzaywgdmFsKSksCi0JCQkJdGNvbm4tPnJlcV9sb2NrKTsKLQkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJnRjb25uLT5mbGFncyk7CisJCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29ubmVjdGlvbi0+cGluZ193YWl0LAorCQkJCShydiA9IF9jb25uX3JxX2NvbmQoY29ubmVjdGlvbiwgbWFzaywgdmFsKSksCisJCQkJY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKIAkJCWdvdG8gYWJvcnQ7CiAJfQogCi0JY29ubl9vbGRfY29tbW9uX3N0YXRlKHRjb25uLCAmb3MsICZmbGFncyk7CisJY29ubl9vbGRfY29tbW9uX3N0YXRlKGNvbm5lY3Rpb24sICZvcywgJmZsYWdzKTsKIAlmbGFncyB8PSBDU19EQ19TVVNQOwotCWNvbm5fc2V0X3N0YXRlKHRjb25uLCBtYXNrLCB2YWwsICZuc19taW4sICZuc19tYXgsIGZsYWdzKTsKLQljb25uX3ByX3N0YXRlX2NoYW5nZSh0Y29ubiwgb3MsIG5zX21heCwgZmxhZ3MpOworCWNvbm5fc2V0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgJm5zX21pbiwgJm5zX21heCwgZmxhZ3MpOworCWNvbm5fcHJfc3RhdGVfY2hhbmdlKGNvbm5lY3Rpb24sIG9zLCBuc19tYXgsIGZsYWdzKTsKIAogCWFjc2N3ID0ga21hbGxvYyhzaXplb2YoKmFjc2N3KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGFjc2N3KSB7CkBAIC0xODI3LDM5ICsxODQ0LDM5IEBACiAJCWFjc2N3LT5uc19tYXggPSBuc19tYXg7CiAJCWFjc2N3LT5mbGFncyA9IGZsYWdzOwogCQlhY3Njdy0+dy5jYiA9IHdfYWZ0ZXJfY29ubl9zdGF0ZV9jaDsKLQkJa3JlZl9nZXQoJnRjb25uLT5rcmVmKTsKLQkJYWNzY3ctPncudGNvbm4gPSB0Y29ubjsKLQkJZHJiZF9xdWV1ZV93b3JrKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZhY3Njdy0+dyk7CisJCWtyZWZfZ2V0KCZjb25uZWN0aW9uLT5rcmVmKTsKKwkJYWNzY3ctPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQlkcmJkX3F1ZXVlX3dvcmsoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLCAmYWNzY3ctPncpOwogCX0gZWxzZSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiQ291bGQgbm90IGttYWxsb2MgYW4gYWNzY3dcbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQ291bGQgbm90IGttYWxsb2MgYW4gYWNzY3dcbiIpOwogCX0KIAogIGFib3J0OgogCWlmIChoYXZlX211dGV4KSB7CiAJCS8qIG11dGV4X3VubG9jaygpICIuLi4gbXVzdCBub3QgYmUgdXNlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4iLAogCQkgKiBzbyBnaXZlIHVwIHRoZSBzcGlubG9jaywgdGhlbiByZS1hcXVpcmUgaXQgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAgYWJvcnRfdW5sb2NrZWQ6Ci0JCW11dGV4X3VubG9jaygmdGNvbm4tPmNzdGF0ZV9tdXRleCk7Ci0JCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+Y3N0YXRlX211dGV4KTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAl9CiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUyAmJiBmbGFncyAmIENTX1ZFUkJPU0UpIHsKLQkJY29ubl9lcnIodGNvbm4sICJTdGF0ZSBjaGFuZ2UgZmFpbGVkOiAlc1xuIiwgZHJiZF9zZXRfc3RfZXJyX3N0cihydikpOwotCQljb25uX2Vycih0Y29ubiwgIiBtYXNrID0gMHgleCB2YWwgPSAweCV4XG4iLCBtYXNrLmksIHZhbC5pKTsKLQkJY29ubl9lcnIodGNvbm4sICIgb2xkX2Nvbm46JXMgd2FudGVkX2Nvbm46JXNcbiIsIGRyYmRfY29ubl9zdHIob2MpLCBkcmJkX2Nvbm5fc3RyKHZhbC5jb25uKSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJTdGF0ZSBjaGFuZ2UgZmFpbGVkOiAlc1xuIiwgZHJiZF9zZXRfc3RfZXJyX3N0cihydikpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiIG1hc2sgPSAweCV4IHZhbCA9IDB4JXhcbiIsIG1hc2suaSwgdmFsLmkpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiIG9sZF9jb25uOiVzIHdhbnRlZF9jb25uOiVzXG4iLCBkcmJkX2Nvbm5fc3RyKG9jKSwgZHJiZF9jb25uX3N0cih2YWwuY29ubikpOwogCX0KIAlyZXR1cm4gcnY7CiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotY29ubl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKK2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCXJ2ID0gX2Nvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgbWFzaywgdmFsLCBmbGFncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJcnYgPSBfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdGF0ZS5oCmluZGV4IGEzYzM2MWIuLmNjNDE2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuaApAQCAtMSw4ICsxLDggQEAKICNpZm5kZWYgRFJCRF9TVEFURV9ICiAjZGVmaW5lIERSQkRfU1RBVEVfSAogCi1zdHJ1Y3QgZHJiZF9jb25mOwotc3RydWN0IGRyYmRfdGNvbm47CitzdHJ1Y3QgZHJiZF9kZXZpY2U7CitzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uOwogCiAvKioKICAqIERPQzogRFJCRCBTdGF0ZSBtYWNyb3MKQEAgLTEwNywzNiArMTA3LDM2IEBACiAJdW5zaWduZWQgaW50IGk7CiB9OwogCi1leHRlcm4gZW51bSBkcmJkX3N0YXRlX3J2IGRyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitleHRlcm4gZW51bSBkcmJkX3N0YXRlX3J2IGRyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZiwKIAkJCQkJICAgIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKIAkJCQkJICAgIHVuaW9uIGRyYmRfc3RhdGUgdmFsKTsKLWV4dGVybiB2b2lkIGRyYmRfZm9yY2Vfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlLAorZXh0ZXJuIHZvaWQgZHJiZF9mb3JjZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCXVuaW9uIGRyYmRfc3RhdGUpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBfZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKiwKK2V4dGVybiBlbnVtIGRyYmRfc3RhdGVfcnYgX2RyYmRfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwKIAkJCQkJICAgICAgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCQkJICAgICAgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCQkJICAgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBfX2RyYmRfc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKiwgdW5pb24gZHJiZF9zdGF0ZSwKK2V4dGVybiBlbnVtIGRyYmRfc3RhdGVfcnYgX19kcmJkX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCQkJICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MsCiAJCQkJCSAgIHN0cnVjdCBjb21wbGV0aW9uICpkb25lKTsKLWV4dGVybiB2b2lkIHByaW50X3N0X2VycihzdHJ1Y3QgZHJiZF9jb25mICosIHVuaW9uIGRyYmRfc3RhdGUsCitleHRlcm4gdm9pZCBwcmludF9zdF9lcnIoc3RydWN0IGRyYmRfZGV2aWNlICosIHVuaW9uIGRyYmRfc3RhdGUsCiAJCQl1bmlvbiBkcmJkX3N0YXRlLCBpbnQpOwogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9jb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAorX2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpOwogCiBlbnVtIGRyYmRfc3RhdGVfcnYKLWNvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCitjb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKIAkJICAgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpOwogCi1leHRlcm4gdm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBib29sIGNvbm5fYWxsX3ZvbHNfdW5jb25mKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7CitleHRlcm4gdm9pZCBkcmJkX3Jlc3VtZV9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gYm9vbCBjb25uX2FsbF92b2xzX3VuY29uZihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogLyoqCiAgKiBkcmJkX3JlcXVlc3Rfc3RhdGUoKSAtIFJlcWVzdCBhIHN0YXRlIGNoYW5nZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbWFzazoJbWFzayBvZiBzdGF0ZSBiaXRzIHRvIGNoYW5nZS4KICAqIEB2YWw6CXZhbHVlIG9mIG5ldyBzdGF0ZSBiaXRzLgogICoKQEAgLTE0NCwxOCArMTQ0LDE4IEBACiAgKiBxdWl0ZSB2ZXJib3NlIGluIGNhc2UgdGhlIHN0YXRlIGNoYW5nZSBpcyBub3QgcG9zc2libGUsIGFuZCBhbGwgdGhvc2UKICAqIHN0YXRlIGNoYW5nZXMgYXJlIGdsb2JhbGx5IHNlcmlhbGl6ZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSBpbnQgZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCSAgICAgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAogCQkJCSAgICAgdW5pb24gZHJiZF9zdGF0ZSB2YWwpCiB7Ci0JcmV0dXJuIF9kcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgbWFzaywgdmFsLCBDU19WRVJCT1NFICsgQ1NfT1JERVJFRCk7CisJcmV0dXJuIF9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIENTX1ZFUkJPU0UgKyBDU19PUkRFUkVEKTsKIH0KIAotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3JvbGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWVudW0gZHJiZF9yb2xlIGNvbm5faGlnaGVzdF9wZWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9sb3dlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWVudW0gZHJiZF9jb25ucyBjb25uX2xvd2VzdF9jb25uKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7CitlbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3Rfcm9sZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2VudW0gZHJiZF9yb2xlIGNvbm5faGlnaGVzdF9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X2Rpc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2xvd2VzdF9kaXNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZW51bSBkcmJkX2Rpc2tfc3RhdGUgY29ubl9oaWdoZXN0X3Bkc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfY29ubnMgY29ubl9sb3dlc3RfY29ubihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmMKaW5kZXggNThlMDhmZi4uODBiMGY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RyaW5ncy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuYwpAQCAtMjQsNiArMjQsNyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RyYmQuaD4KKyNpbmNsdWRlICJkcmJkX3N0cmluZ3MuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyYmRfY29ubl9zX25hbWVzW10gPSB7CiAJW0NfU1RBTkRBTE9ORV0gICAgICAgPSAiU3RhbmRBbG9uZSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MjNjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX19EUkJEX1NUUklOR1NfSAorI2RlZmluZSBfX0RSQkRfU1RSSU5HU19ICisKK2V4dGVybiBjb25zdCBjaGFyICpkcmJkX2Nvbm5fc3RyKGVudW0gZHJiZF9jb25ucyk7CitleHRlcm4gY29uc3QgY2hhciAqZHJiZF9yb2xlX3N0cihlbnVtIGRyYmRfcm9sZSk7CitleHRlcm4gY29uc3QgY2hhciAqZHJiZF9kaXNrX3N0cihlbnVtIGRyYmRfZGlza19zdGF0ZSk7CitleHRlcm4gY29uc3QgY2hhciAqZHJiZF9zZXRfc3RfZXJyX3N0cihlbnVtIGRyYmRfc3RhdGVfcnYpOworCisjZW5kaWYgIC8qIF9fRFJCRF9TVFJJTkdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKaW5kZXggODRkMzE3NS4uMmM0Y2U0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAgIGFsb25nIHdpdGggZHJiZDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KIAotICovCisqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZHJiZC5oPgpAQCAtMzYsMTAgKzM2LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKLXN0YXRpYyBpbnQgd19tYWtlX292X3JlcXVlc3Qoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCk7Ci0KK3N0YXRpYyBpbnQgbWFrZV9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpOworc3RhdGljIGludCBtYWtlX3Jlc3luY19yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpOwogCiAvKiBlbmRpbyBoYW5kbGVyczoKICAqICAgZHJiZF9tZF9pb19jb21wbGV0ZSAoZGVmaW5lZCBoZXJlKQpAQCAtNjcsMTAgKzY4LDEwIEBACiB2b2lkIGRyYmRfbWRfaW9fY29tcGxldGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IGRyYmRfbWRfaW8gKm1kX2lvOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAKIAltZF9pbyA9IChzdHJ1Y3QgZHJiZF9tZF9pbyAqKWJpby0+YmlfcHJpdmF0ZTsKLQltZGV2ID0gY29udGFpbmVyX29mKG1kX2lvLCBzdHJ1Y3QgZHJiZF9jb25mLCBtZF9pbyk7CisJZGV2aWNlID0gY29udGFpbmVyX29mKG1kX2lvLCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIG1kX2lvKTsKIAogCW1kX2lvLT5lcnJvciA9IGVycm9yOwogCkBAIC04MywzNSArODQsMzYgQEAKIAkgKiBNYWtlIHN1cmUgd2UgZmlyc3QgZHJvcCB0aGUgcmVmZXJlbmNlLCBhbmQgb25seSB0aGVuIHNpZ25hbAogCSAqIGNvbXBsZXRpb24sIG9yIHdlIG1heSAoaW4gZHJiZF9hbF9yZWFkX2xvZygpKSBjeWNsZSBzbyBmYXN0IGludG8gdGhlCiAJICogbmV4dCBkcmJkX21kX3N5bmNfcGFnZV9pbygpLCB0aGF0IHdlIHRyaWdnZXIgdGhlCi0JICogQVNTRVJUKGF0b21pY19yZWFkKCZtZGV2LT5tZF9pb19pbl91c2UpID09IDEpIHRoZXJlLgorCSAqIEFTU0VSVChhdG9taWNfcmVhZCgmZGV2aWNlLT5tZF9pb19pbl91c2UpID09IDEpIHRoZXJlLgogCSAqLwotCWRyYmRfbWRfcHV0X2J1ZmZlcihtZGV2KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKIAltZF9pby0+ZG9uZSA9IDE7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAJYmlvX3B1dChiaW8pOwotCWlmIChtZGV2LT5sZGV2KSAvKiBzcGVjaWFsIGNhc2U6IGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKSAqLwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZGV2aWNlLT5sZGV2KSAvKiBzcGVjaWFsIGNhc2U6IGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKSAqLworCQlwdXRfbGRldihkZXZpY2UpOwogfQogCiAvKiByZWFkcyBvbiBiZWhhbGYgb2YgdGhlIHBhcnRuZXIsCiAgKiAic3VibWl0dGVkIiBieSB0aGUgcmVjZWl2ZXIKICAqLwotdm9pZCBkcmJkX2VuZGlvX3JlYWRfc2VjX2ZpbmFsKHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpIF9fcmVsZWFzZXMobG9jYWwpCitzdGF0aWMgdm9pZCBkcmJkX2VuZGlvX3JlYWRfc2VjX2ZpbmFsKHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpIF9fcmVsZWFzZXMobG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHBlZXJfcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQltZGV2LT5yZWFkX2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJZGV2aWNlLT5yZWFkX2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCWlmIChsaXN0X2VtcHR5KCZtZGV2LT5yZWFkX2VlKSkKLQkJd2FrZV91cCgmbWRldi0+ZWVfd2FpdCk7CisJaWYgKGxpc3RfZW1wdHkoJmRldmljZS0+cmVhZF9lZSkpCisJCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAJaWYgKHRlc3RfYml0KF9fRUVfV0FTX0VSUk9SLCAmcGVlcl9yZXEtPmZsYWdzKSkKLQkJX19kcmJkX2Noa19pb19lcnJvcihtZGV2LCBEUkJEX1JFQURfRVJST1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCQlfX2RyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgRFJCRF9SRUFEX0VSUk9SKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCi0JZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZwZWVyX3JlcS0+dyk7Ci0JcHV0X2xkZXYobWRldik7CisJZHJiZF9xdWV1ZV93b3JrKCZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZwZWVyX3JlcS0+dyk7CisJcHV0X2xkZXYoZGV2aWNlKTsKIH0KIAogLyogd3JpdGVzIG9uIGJlaGFsZiBvZiB0aGUgcGFydG5lciwgb3IgcmVzeW5jIHdyaXRlcywKQEAgLTExOSw3ICsxMjEsOCBAQAogc3RhdGljIHZvaWQgZHJiZF9lbmRpb193cml0ZV9zZWNfZmluYWwoc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkgX19yZWxlYXNlcyhsb2NhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcGVlcl9yZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX2ludGVydmFsIGk7CiAJaW50IGRvX3dha2U7CiAJdTY0IGJsb2NrX2lkOwpAQCAtMTMzLDM1ICsxMzYsMzUgQEAKIAlkb19hbF9jb21wbGV0ZV9pbyA9IHBlZXJfcmVxLT5mbGFncyAmIEVFX0NBTExfQUxfQ09NUExFVEVfSU87CiAJYmxvY2tfaWQgPSBwZWVyX3JlcS0+YmxvY2tfaWQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JbWRldi0+d3JpdF9jbnQgKz0gcGVlcl9yZXEtPmkuc2l6ZSA+PiA5OwotCWxpc3RfbW92ZV90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+ZG9uZV9lZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJZGV2aWNlLT53cml0X2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7CisJbGlzdF9tb3ZlX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPmRvbmVfZWUpOwogCiAJLyoKIAkgKiBEbyBub3QgcmVtb3ZlIGZyb20gdGhlIHdyaXRlX3JlcXVlc3RzIHRyZWUgaGVyZTogd2UgZGlkIG5vdCBzZW5kIHRoZQogCSAqIEFjayB5ZXQgYW5kIGRpZCBub3Qgd2FrZSBwb3NzaWJseSB3YWl0aW5nIGNvbmZsaWN0aW5nIHJlcXVlc3RzLgogCSAqIFJlbW92ZWQgZnJvbSB0aGUgdHJlZSBmcm9tICJkcmJkX3Byb2Nlc3NfZG9uZV9lZSIgd2l0aGluIHRoZQotCSAqIGFwcHJvcHJpYXRlIHcuY2IgKGVfZW5kX2Jsb2NrL2VfZW5kX3Jlc3luY19ibG9jaykgb3IgZnJvbQorCSAqIGFwcHJvcHJpYXRlIGR3LmNiIChlX2VuZF9ibG9jay9lX2VuZF9yZXN5bmNfYmxvY2spIG9yIGZyb20KIAkgKiBfZHJiZF9jbGVhcl9kb25lX2VlLgogCSAqLwogCi0JZG9fd2FrZSA9IGxpc3RfZW1wdHkoYmxvY2tfaWQgPT0gSURfU1lOQ0VSID8gJm1kZXYtPnN5bmNfZWUgOiAmbWRldi0+YWN0aXZlX2VlKTsKKwlkb193YWtlID0gbGlzdF9lbXB0eShibG9ja19pZCA9PSBJRF9TWU5DRVIgPyAmZGV2aWNlLT5zeW5jX2VlIDogJmRldmljZS0+YWN0aXZlX2VlKTsKIAogCWlmICh0ZXN0X2JpdChfX0VFX1dBU19FUlJPUiwgJnBlZXJfcmVxLT5mbGFncykpCi0JCV9fZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgRFJCRF9XUklURV9FUlJPUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX1dSSVRFX0VSUk9SKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGJsb2NrX2lkID09IElEX1NZTkNFUikKLQkJZHJiZF9yc19jb21wbGV0ZV9pbyhtZGV2LCBpLnNlY3Rvcik7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBpLnNlY3Rvcik7CiAKIAlpZiAoZG9fd2FrZSkKLQkJd2FrZV91cCgmbWRldi0+ZWVfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAKIAlpZiAoZG9fYWxfY29tcGxldGVfaW8pCi0JCWRyYmRfYWxfY29tcGxldGVfaW8obWRldiwgJmkpOworCQlkcmJkX2FsX2NvbXBsZXRlX2lvKGRldmljZSwgJmkpOwogCi0Jd2FrZV9hc2VuZGVyKG1kZXYtPnRjb25uKTsKLQlwdXRfbGRldihtZGV2KTsKKwl3YWtlX2FzZW5kZXIocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24pOworCXB1dF9sZGV2KGRldmljZSk7CiB9CiAKIC8qIHdyaXRlcyBvbiBiZWhhbGYgb2YgdGhlIHBhcnRuZXIsIG9yIHJlc3luYyB3cml0ZXMsCkBAIC0xNzAsMTcgKzE3MywxNyBAQAogdm9pZCBkcmJkX3BlZXJfcmVxdWVzdF9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gYmlvLT5iaV9wcml2YXRlOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBwZWVyX3JlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCWludCBpc193cml0ZSA9IGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFOwogCiAJaWYgKGVycm9yICYmIF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCWRldl93YXJuKERFViwgIiVzOiBlcnJvcj0lZCBzPSVsbHVzXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiJXM6IGVycm9yPSVkIHM9JWxsdXNcbiIsCiAJCQkJaXNfd3JpdGUgPyAid3JpdGUiIDogInJlYWQiLCBlcnJvciwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBlZXJfcmVxLT5pLnNlY3Rvcik7CiAJaWYgKCFlcnJvciAmJiAhdXB0b2RhdGUpIHsKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfd2FybihERVYsICIlczogc2V0dGluZyBlcnJvciB0byAtRUlPIHM9JWxsdXNcbiIsCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiJXM6IHNldHRpbmcgZXJyb3IgdG8gLUVJTyBzPSVsbHVzXG4iLAogCQkJCQlpc193cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGVlcl9yZXEtPmkuc2VjdG9yKTsKIAkJLyogc3RyYW5nZSBiZWhhdmlvciBvZiBzb21lIGxvd2VyIGxldmVsIGRyaXZlcnMuLi4KQEAgLTIwNywxMyArMjEwLDEzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IGJpb19hbmRfZXJyb3IgbTsKIAllbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQ7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCiAJaWYgKCFlcnJvciAmJiAhdXB0b2RhdGUpIHsKLQkJZGV2X3dhcm4oREVWLCAicCAlczogc2V0dGluZyBlcnJvciB0byAtRUlPXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAicCAlczogc2V0dGluZyBlcnJvciB0byAtRUlPXG4iLAogCQkJIGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFID8gIndyaXRlIiA6ICJyZWFkIik7CiAJCS8qIHN0cmFuZ2UgYmVoYXZpb3Igb2Ygc29tZSBsb3dlciBsZXZlbCBkcml2ZXJzLi4uCiAJCSAqIGZhaWwgdGhlIHJlcXVlc3QgYnkgY2xlYXJpbmcgdGhlIHVwdG9kYXRlIGZsYWcsCkBAIC0yNTIsNyArMjU1LDcgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX0FCT1JURUQpKSB7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VtZXJnKERFViwgImRlbGF5ZWQgY29tcGxldGlvbiBvZiBhYm9ydGVkIGxvY2FsIHJlcXVlc3Q7IGRpc2stdGltZW91dCBtYXkgYmUgdG9vIGFnZ3Jlc3NpdmVcbiIpOworCQkJZHJiZF9lbWVyZyhkZXZpY2UsICJkZWxheWVkIGNvbXBsZXRpb24gb2YgYWJvcnRlZCBsb2NhbCByZXF1ZXN0OyBkaXNrLXRpbWVvdXQgbWF5IGJlIHRvbyBhZ2dyZXNzaXZlXG4iKTsKIAogCQlpZiAoIWVycm9yKQogCQkJcGFuaWMoInBvc3NpYmxlIHJhbmRvbSBtZW1vcnkgY29ycnVwdGlvbiBjYXVzZWQgYnkgZGVsYXllZCBjb21wbGV0aW9uIG9mIGFib3J0ZWQgbG9jYWwgcmVxdWVzdFxuIik7CkBAIC0yNzIsMTcgKzI3NSwxNiBAQAogCXJlcS0+cHJpdmF0ZV9iaW8gPSBFUlJfUFRSKGVycm9yKTsKIAogCS8qIG5vdCByZXFfbW9kKCksIHdlIG5lZWQgaXJxc2F2ZSBoZXJlISAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAlfX3JlcV9tb2QocmVxLCB3aGF0LCAmbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0JcHV0X2xkZXYobWRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIH0KIAotdm9pZCBkcmJkX2NzdW1fZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sCi0JCSAgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgdm9pZCAqZGlnZXN0KQordm9pZCBkcmJkX2NzdW1fZWUoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsIHZvaWQgKmRpZ2VzdCkKIHsKIAlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtMzA5LDcgKzMxMSw3IEBACiAJY3J5cHRvX2hhc2hfZmluYWwoJmRlc2MsIGRpZ2VzdCk7CiB9CiAKLXZvaWQgZHJiZF9jc3VtX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgc3RydWN0IGJpbyAqYmlvLCB2b2lkICpkaWdlc3QpCit2b2lkIGRyYmRfY3N1bV9iaW8oc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHN0cnVjdCBiaW8gKmJpbywgdm9pZCAqZGlnZXN0KQogewogCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CkBAIC0zMzMsNyArMzM1LDggQEAKIHN0YXRpYyBpbnQgd19lX3NlbmRfY3N1bShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3Q7CiAJaW50IGVyciA9IDA7CkBAIC0zNDQsODkgKzM0Nyw5MiBAQAogCWlmICh1bmxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSAhPSAwKSkKIAkJZ290byBvdXQ7CiAKLQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPmNzdW1zX3RmbSk7CisJZGlnZXN0X3NpemUgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0pOwogCWRpZ2VzdCA9IGttYWxsb2MoZGlnZXN0X3NpemUsIEdGUF9OT0lPKTsKIAlpZiAoZGlnZXN0KSB7CiAJCXNlY3Rvcl90IHNlY3RvciA9IHBlZXJfcmVxLT5pLnNlY3RvcjsKIAkJdW5zaWduZWQgaW50IHNpemUgPSBwZWVyX3JlcS0+aS5zaXplOwotCQlkcmJkX2NzdW1fZWUobWRldiwgbWRldi0+dGNvbm4tPmNzdW1zX3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CisJCWRyYmRfY3N1bV9lZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtLCBwZWVyX3JlcSwgZGlnZXN0KTsKIAkJLyogRnJlZSBwZWVyX3JlcSBhbmQgcGFnZXMgYmVmb3JlIHNlbmQuCiAJCSAqIEluIGNhc2Ugd2UgYmxvY2sgb24gY29uZ2VzdGlvbiwgd2UgY291bGQgb3RoZXJ3aXNlIHJ1biBpbnRvCiAJCSAqIHNvbWUgZGlzdHJpYnV0ZWQgZGVhZGxvY2ssIGlmIHRoZSBvdGhlciBzaWRlIGJsb2NrcyBvbgogCQkgKiBjb25nZXN0aW9uIGFzIHdlbGwsIGJlY2F1c2Ugb3VyIHJlY2VpdmVyIGJsb2NrcyBpbgogCQkgKiBkcmJkX2FsbG9jX3BhZ2VzIGR1ZSB0byBwcF9pbl91c2UgPiBtYXhfYnVmZmVycy4gKi8KLQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCQlwZWVyX3JlcSA9IE5VTEw7Ci0JCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQllcnIgPSBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShtZGV2LCBzZWN0b3IsIHNpemUsCisJCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHBlZXJfZGV2aWNlLCBzZWN0b3IsIHNpemUsCiAJCQkJCSAgICAgIGRpZ2VzdCwgZGlnZXN0X3NpemUsCiAJCQkJCSAgICAgIFBfQ1NVTV9SU19SRVFVRVNUKTsKIAkJa2ZyZWUoZGlnZXN0KTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgImttYWxsb2MoKSBvZiBkaWdlc3QgZmFpbGVkLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2MoKSBvZiBkaWdlc3QgZmFpbGVkLlxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJfQogCiBvdXQ6CiAJaWYgKHBlZXJfcmVxKQotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAKIAlpZiAodW5saWtlbHkoZXJyKSkKLQkJZGV2X2VycihERVYsICJkcmJkX3NlbmRfZHJlcXVlc3QoLi4uLCBjc3VtKSBmYWlsZWRcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfZHJlcXVlc3QoLi4uLCBjc3VtKSBmYWlsZWRcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKICNkZWZpbmUgR0ZQX1RSWQkoX19HRlBfSElHSE1FTSB8IF9fR0ZQX05PV0FSTikKIAotc3RhdGljIGludCByZWFkX2Zvcl9jc3VtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpCitzdGF0aWMgaW50IHJlYWRfZm9yX2NzdW0oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihtZGV2LCBzZWN0b3IpKQorCWlmIChkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oZGV2aWNlLCBzZWN0b3IpKQogCQlnb3RvIGRlZmVyOwogCiAJLyogR0ZQX1RSWSwgYmVjYXVzZSBpZiB0aGVyZSBpcyBubyBtZW1vcnkgYXZhaWxhYmxlIHJpZ2h0IG5vdywgdGhpcyBtYXkKIAkgKiBiZSByZXNjaGVkdWxlZCBmb3IgbGF0ZXIuIEl0IGlzICJvbmx5IiBiYWNrZ3JvdW5kIHJlc3luYywgYWZ0ZXIgYWxsLiAqLwotCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShtZGV2LCBJRF9TWU5DRVIgLyogdW51c2VkICovLCBzZWN0b3IsCisJcGVlcl9yZXEgPSBkcmJkX2FsbG9jX3BlZXJfcmVxKHBlZXJfZGV2aWNlLCBJRF9TWU5DRVIgLyogdW51c2VkICovLCBzZWN0b3IsCiAJCQkJICAgICAgIHNpemUsIEdGUF9UUlkpOwogCWlmICghcGVlcl9yZXEpCiAJCWdvdG8gZGVmZXI7CiAKIAlwZWVyX3JlcS0+dy5jYiA9IHdfZV9zZW5kX2NzdW07Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZCgmcGVlcl9yZXEtPncubGlzdCwgJm1kZXYtPnJlYWRfZWUpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JYXRvbWljX2FkZChzaXplID4+IDksICZtZGV2LT5yc19zZWN0X2V2KTsKLQlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KG1kZXYsIHBlZXJfcmVxLCBSRUFELCBEUkJEX0ZBVUxUX1JTX1JEKSA9PSAwKQorCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2V2KTsKKwlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIFJFQUQsIERSQkRfRkFVTFRfUlNfUkQpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogSWYgaXQgZmFpbGVkIGJlY2F1c2Ugb2YgRU5PTUVNLCByZXRyeSBzaG91bGQgaGVscC4gIElmIGl0IGZhaWxlZAogCSAqIGJlY2F1c2UgYmlvX2FkZF9wYWdlIGZhaWxlZCAocHJvYmFibHkgYnJva2VuIGxvd2VyIGxldmVsIGRyaXZlciksCiAJICogcmV0cnkgbWF5IG9yIG1heSBub3QgaGVscC4KIAkgKiBJZiBpdCBkb2VzIG5vdCwgeW91IG1heSBuZWVkIHRvIGZvcmNlIGRpc2Nvbm5lY3QuICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogZGVmZXI6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gLUVBR0FJTjsKIH0KIAogaW50IHdfcmVzeW5jX3RpbWVyKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7Ci0Jc3dpdGNoIChtZGV2LT5zdGF0ZS5jb25uKSB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCByZXN5bmNfd29yayk7CisKKwlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCWNhc2UgQ19WRVJJRllfUzoKLQkJd19tYWtlX292X3JlcXVlc3QodywgY2FuY2VsKTsKKwkJbWFrZV9vdl9yZXF1ZXN0KGRldmljZSwgY2FuY2VsKTsKIAkJYnJlYWs7CiAJY2FzZSBDX1NZTkNfVEFSR0VUOgotCQl3X21ha2VfcmVzeW5jX3JlcXVlc3QodywgY2FuY2VsKTsKKwkJbWFrZV9yZXN5bmNfcmVxdWVzdChkZXZpY2UsIGNhbmNlbCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDM1LDEwICs0NDEsMTEgQEAKIAogdm9pZCByZXN5bmNfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOwogCi0JaWYgKGxpc3RfZW1wdHkoJm1kZXYtPnJlc3luY193b3JrLmxpc3QpKQotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJm1kZXYtPnJlc3luY193b3JrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5yZXN5bmNfd29yay5saXN0KSkKKwkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkmZGV2aWNlLT5yZXN5bmNfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIGZpZm9fc2V0KHN0cnVjdCBmaWZvX2J1ZmZlciAqZmIsIGludCB2YWx1ZSkKQEAgLTQ4NSw3ICs0OTIsNyBAQAogCXJldHVybiBmYjsKIH0KIAotc3RhdGljIGludCBkcmJkX3JzX2NvbnRyb2xsZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgZHJiZF9yc19jb250cm9sbGVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBkaXNrX2NvbmYgKmRjOwogCXVuc2lnbmVkIGludCBzZWN0X2luOyAgLyogTnVtYmVyIG9mIHNlY3RvcnMgdGhhdCBjYW1lIGluIHNpbmNlIHRoZSBsYXN0IHR1cm4gKi8KQEAgLTQ5OCwyMiArNTA1LDIyIEBACiAJaW50IG1heF9zZWN0OwogCXN0cnVjdCBmaWZvX2J1ZmZlciAqcGxhbjsKIAotCXNlY3RfaW4gPSBhdG9taWNfeGNoZygmbWRldi0+cnNfc2VjdF9pbiwgMCk7IC8qIE51bWJlciBvZiBzZWN0b3JzIHRoYXQgY2FtZSBpbiAqLwotCW1kZXYtPnJzX2luX2ZsaWdodCAtPSBzZWN0X2luOworCXNlY3RfaW4gPSBhdG9taWNfeGNoZygmZGV2aWNlLT5yc19zZWN0X2luLCAwKTsgLyogTnVtYmVyIG9mIHNlY3RvcnMgdGhhdCBjYW1lIGluICovCisJZGV2aWNlLT5yc19pbl9mbGlnaHQgLT0gc2VjdF9pbjsKIAotCWRjID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZik7Ci0JcGxhbiA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5yc19wbGFuX3MpOworCWRjID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKTsKKwlwbGFuID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+cnNfcGxhbl9zKTsKIAogCXN0ZXBzID0gcGxhbi0+c2l6ZTsgLyogKGRjLT5jX3BsYW5fYWhlYWQgKiAxMCAqIFNMRUVQX1RJTUUpIC8gSFo7ICovCiAKLQlpZiAobWRldi0+cnNfaW5fZmxpZ2h0ICsgc2VjdF9pbiA9PSAwKSB7IC8qIEF0IHN0YXJ0IG9mIHJlc3luYyAqLworCWlmIChkZXZpY2UtPnJzX2luX2ZsaWdodCArIHNlY3RfaW4gPT0gMCkgeyAvKiBBdCBzdGFydCBvZiByZXN5bmMgKi8KIAkJd2FudCA9ICgoZGMtPnJlc3luY19yYXRlICogMiAqIFNMRUVQX1RJTUUpIC8gSFopICogc3RlcHM7CiAJfSBlbHNlIHsgLyogbm9ybWFsIHBhdGggKi8KIAkJd2FudCA9IGRjLT5jX2ZpbGxfdGFyZ2V0ID8gZGMtPmNfZmlsbF90YXJnZXQgOgogCQkJc2VjdF9pbiAqIGRjLT5jX2RlbGF5X3RhcmdldCAqIEhaIC8gKFNMRUVQX1RJTUUgKiAxMCk7CiAJfQogCi0JY29ycmVjdGlvbiA9IHdhbnQgLSBtZGV2LT5yc19pbl9mbGlnaHQgLSBwbGFuLT50b3RhbDsKKwljb3JyZWN0aW9uID0gd2FudCAtIGRldmljZS0+cnNfaW5fZmxpZ2h0IC0gcGxhbi0+dG90YWw7CiAKIAkvKiBQbGFuIGFoZWFkICovCiAJY3BzID0gY29ycmVjdGlvbiAvIHN0ZXBzOwpAQCAtNTMzLDI1ICs1NDAsMjUgQEAKIAkJcmVxX3NlY3QgPSBtYXhfc2VjdDsKIAogCS8qCi0JZGV2X3dhcm4oREVWLCAic2k9JXUgaWY9JWQgd2E9JXUgY289JWQgc3Q9JWQgY3BzPSVkIHBsPSVkIGNjPSVkIHJzPSVkXG4iLAotCQkgc2VjdF9pbiwgbWRldi0+cnNfaW5fZmxpZ2h0LCB3YW50LCBjb3JyZWN0aW9uLAotCQkgc3RlcHMsIGNwcywgbWRldi0+cnNfcGxhbmVkLCBjdXJyX2NvcnIsIHJlcV9zZWN0KTsKKwlkcmJkX3dhcm4oZGV2aWNlLCAic2k9JXUgaWY9JWQgd2E9JXUgY289JWQgc3Q9JWQgY3BzPSVkIHBsPSVkIGNjPSVkIHJzPSVkXG4iLAorCQkgc2VjdF9pbiwgZGV2aWNlLT5yc19pbl9mbGlnaHQsIHdhbnQsIGNvcnJlY3Rpb24sCisJCSBzdGVwcywgY3BzLCBkZXZpY2UtPnJzX3BsYW5lZCwgY3Vycl9jb3JyLCByZXFfc2VjdCk7CiAJKi8KIAogCXJldHVybiByZXFfc2VjdDsKIH0KIAotc3RhdGljIGludCBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgbnVtYmVyOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChyY3VfZGVyZWZlcmVuY2UobWRldi0+cnNfcGxhbl9zKS0+c2l6ZSkgewotCQludW1iZXIgPSBkcmJkX3JzX2NvbnRyb2xsZXIobWRldikgPj4gKEJNX0JMT0NLX1NISUZUIC0gOSk7Ci0JCW1kZXYtPmNfc3luY19yYXRlID0gbnVtYmVyICogSFogKiAoQk1fQkxPQ0tfU0laRSAvIDEwMjQpIC8gU0xFRVBfVElNRTsKKwlpZiAocmN1X2RlcmVmZXJlbmNlKGRldmljZS0+cnNfcGxhbl9zKS0+c2l6ZSkgeworCQludW1iZXIgPSBkcmJkX3JzX2NvbnRyb2xsZXIoZGV2aWNlKSA+PiAoQk1fQkxPQ0tfU0hJRlQgLSA5KTsKKwkJZGV2aWNlLT5jX3N5bmNfcmF0ZSA9IG51bWJlciAqIEhaICogKEJNX0JMT0NLX1NJWkUgLyAxMDI0KSAvIFNMRUVQX1RJTUU7CiAJfSBlbHNlIHsKLQkJbWRldi0+Y19zeW5jX3JhdGUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+cmVzeW5jX3JhdGU7Ci0JCW51bWJlciA9IFNMRUVQX1RJTUUgKiBtZGV2LT5jX3N5bmNfcmF0ZSAgLyAoKEJNX0JMT0NLX1NJWkUgLyAxMDI0KSAqIEhaKTsKKwkJZGV2aWNlLT5jX3N5bmNfcmF0ZSA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPnJlc3luY19yYXRlOworCQludW1iZXIgPSBTTEVFUF9USU1FICogZGV2aWNlLT5jX3N5bmNfcmF0ZSAgLyAoKEJNX0JMT0NLX1NJWkUgLyAxMDI0KSAqIEhaKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKQEAgLTU2MCwxMiArNTY3LDExIEBACiAJcmV0dXJuIG51bWJlcjsKIH0KIAotaW50IHdfbWFrZV9yZXN5bmNfcmVxdWVzdChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQorc3RhdGljIGludCBtYWtlX3Jlc3luY19yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwogCXVuc2lnbmVkIGxvbmcgYml0OwogCXNlY3Rvcl90IHNlY3RvcjsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJY29uc3Qgc2VjdG9yX3QgY2FwYWNpdHkgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJaW50IG1heF9iaW9fc2l6ZTsKIAlpbnQgbnVtYmVyLCByb2xsYmFja19pLCBzaXplOwogCWludCBhbGlnbiwgcXVldWVkLCBzbmRidWY7CkBAIC01NzQsNjEgKzU4MCw2MSBAQAogCWlmICh1bmxpa2VseShjYW5jZWwpKQogCQlyZXR1cm4gMDsKIAotCWlmIChtZGV2LT5yc190b3RhbCA9PSAwKSB7CisJaWYgKGRldmljZS0+cnNfdG90YWwgPT0gMCkgewogCQkvKiBlbXB0eSByZXN5bmM/ICovCi0JCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7Ci0JCS8qIFNpbmNlIHdlIG9ubHkgbmVlZCB0byBhY2Nlc3MgbWRldi0+cnN5bmMgYQotCQkgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LERfRkFJTEVEKSB3b3VsZCBiZSBzdWZmaWNpZW50LCBidXQKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpIHsKKwkJLyogU2luY2Ugd2Ugb25seSBuZWVkIHRvIGFjY2VzcyBkZXZpY2UtPnJzeW5jIGEKKwkJICAgZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLERfRkFJTEVEKSB3b3VsZCBiZSBzdWZmaWNpZW50LCBidXQKIAkJICAgdG8gY29udGludWUgcmVzeW5jIHdpdGggYSBicm9rZW4gZGlzayBtYWtlcyBubyBzZW5zZSBhdAogCQkgICBhbGwgKi8KLQkJZGV2X2VycihERVYsICJEaXNrIGJyb2tlIGRvd24gZHVyaW5nIHJlc3luYyFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJEaXNrIGJyb2tlIGRvd24gZHVyaW5nIHJlc3luYyFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhtZGV2LT5ycV9xdWV1ZSkgPDwgOTsKLQludW1iZXIgPSBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhtZGV2KTsKKwltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPnJxX3F1ZXVlKSA8PCA5OworCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKGRldmljZSk7CiAJaWYgKG51bWJlciA9PSAwKQogCQlnb3RvIHJlcXVldWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJLyogU3RvcCBnZW5lcmF0aW5nIFJTIHJlcXVlc3RzLCB3aGVuIGhhbGYgb2YgdGhlIHNlbmQgYnVmZmVyIGlzIGZpbGxlZCAqLwotCQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+ZGF0YS5tdXRleCk7Ci0JCWlmIChtZGV2LT50Y29ubi0+ZGF0YS5zb2NrZXQpIHsKLQkJCXF1ZXVlZCA9IG1kZXYtPnRjb25uLT5kYXRhLnNvY2tldC0+c2stPnNrX3dtZW1fcXVldWVkOwotCQkJc25kYnVmID0gbWRldi0+dGNvbm4tPmRhdGEuc29ja2V0LT5zay0+c2tfc25kYnVmOworCQltdXRleF9sb2NrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGEuc29ja2V0KSB7CisJCQlxdWV1ZWQgPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3dtZW1fcXVldWVkOworCQkJc25kYnVmID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQtPnNrLT5za19zbmRidWY7CiAJCX0gZWxzZSB7CiAJCQlxdWV1ZWQgPSAxOwogCQkJc25kYnVmID0gMDsKIAkJfQotCQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5kYXRhLm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKIAkJaWYgKHF1ZXVlZCA+IHNuZGJ1ZiAvIDIpCiAJCQlnb3RvIHJlcXVldWU7CiAKIG5leHRfc2VjdG9yOgogCQlzaXplID0gQk1fQkxPQ0tfU0laRTsKLQkJYml0ICA9IGRyYmRfYm1fZmluZF9uZXh0KG1kZXYsIG1kZXYtPmJtX3Jlc3luY19mbyk7CisJCWJpdCAgPSBkcmJkX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGRldmljZS0+Ym1fcmVzeW5jX2ZvKTsKIAogCQlpZiAoYml0ID09IERSQkRfRU5EX09GX0JJVE1BUCkgewotCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gZHJiZF9ibV9iaXRzKG1kZXYpOwotCQkJcHV0X2xkZXYobWRldik7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJc2VjdG9yID0gQk1fQklUX1RPX1NFQ1QoYml0KTsKIAotCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikgfHwKLQkJICAgIGRyYmRfdHJ5X3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpIHsKLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IGJpdDsKKwkJaWYgKGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihkZXZpY2UsIHNlY3RvcikgfHwKKwkJICAgIGRyYmRfdHJ5X3JzX2JlZ2luX2lvKGRldmljZSwgc2VjdG9yKSkgeworCQkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBiaXQ7CiAJCQlnb3RvIHJlcXVldWU7CiAJCX0KLQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gYml0ICsgMTsKKwkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBiaXQgKyAxOwogCi0JCWlmICh1bmxpa2VseShkcmJkX2JtX3Rlc3RfYml0KG1kZXYsIGJpdCkgPT0gMCkpIHsKLQkJCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKKwkJaWYgKHVubGlrZWx5KGRyYmRfYm1fdGVzdF9iaXQoZGV2aWNlLCBiaXQpID09IDApKSB7CisJCQlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKIAkJCWdvdG8gbmV4dF9zZWN0b3I7CiAJCX0KIApAQCAtNjU3LDcgKzY2Myw3IEBACiAJCQkgKiBvYnNjdXJlIHJlYXNvbjsgKCBiID09IDAgKSB3b3VsZCBnZXQgdGhlIG91dC1vZi1iYW5kCiAJCQkgKiBvbmx5IGFjY2lkZW50YWxseSByaWdodCBiZWNhdXNlIG9mIHRoZSAib2RkbHkgc2l6ZWQiCiAJCQkgKiBhZGp1c3RtZW50IGJlbG93ICovCi0JCQlpZiAoZHJiZF9ibV90ZXN0X2JpdChtZGV2LCBiaXQrMSkgIT0gMSkKKwkJCWlmIChkcmJkX2JtX3Rlc3RfYml0KGRldmljZSwgYml0KzEpICE9IDEpCiAJCQkJYnJlYWs7CiAJCQliaXQrKzsKIAkJCXNpemUgKz0gQk1fQkxPQ0tfU0laRTsKQEAgLTY2OCwyMCArNjc0LDIxIEBACiAJCS8qIGlmIHdlIG1lcmdlZCBzb21lLAogCQkgKiByZXNldCB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBuZXh0IGRyYmRfYm1fZmluZF9uZXh0IGZyb20gKi8KIAkJaWYgKHNpemUgPiBCTV9CTE9DS19TSVpFKQotCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gYml0ICsgMTsKKwkJCWRldmljZS0+Ym1fcmVzeW5jX2ZvID0gYml0ICsgMTsKICNlbmRpZgogCiAJCS8qIGFkanVzdCB2ZXJ5IGxhc3Qgc2VjdG9ycywgaW4gY2FzZSB3ZSBhcmUgb2RkbHkgc2l6ZWQgKi8KIAkJaWYgKHNlY3RvciArIChzaXplPj45KSA+IGNhcGFjaXR5KQogCQkJc2l6ZSA9IChjYXBhY2l0eS1zZWN0b3IpPDw5OwotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSAmJiBtZGV2LT50Y29ubi0+Y3N1bXNfdGZtKSB7Ci0JCQlzd2l0Y2ggKHJlYWRfZm9yX2NzdW0obWRldiwgc2VjdG9yLCBzaXplKSkgeworCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg5ICYmCisJCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0pIHsKKwkJCXN3aXRjaCAocmVhZF9mb3JfY3N1bShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBzZWN0b3IsIHNpemUpKSB7CiAJCQljYXNlIC1FSU86IC8qIERpc2sgZmFpbHVyZSAqLwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQljYXNlIC1FQUdBSU46IC8qIGFsbG9jYXRpb24gZmFpbGVkLCBvciBsZGV2IGJ1c3kgKi8KLQkJCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHNlY3Rvcik7Ci0JCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gQk1fU0VDVF9UT19CSVQoc2VjdG9yKTsKKwkJCQlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKKwkJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJCQkJaSA9IHJvbGxiYWNrX2k7CiAJCQkJZ290byByZXF1ZXVlOwogCQkJY2FzZSAwOgpAQCAtNjkzLDUwICs3MDAsNDkgQEAKIAkJfSBlbHNlIHsKIAkJCWludCBlcnI7CiAKLQkJCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQkJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0KG1kZXYsIFBfUlNfREFUQV9SRVFVRVNULAorCQkJaW5jX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwkJCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBQX1JTX0RBVEFfUkVRVUVTVCwKIAkJCQkJCSBzZWN0b3IsIHNpemUsIElEX1NZTkNFUik7CiAJCQlpZiAoZXJyKSB7Ci0JCQkJZGV2X2VycihERVYsICJkcmJkX3NlbmRfZHJlcXVlc3QoKSBmYWlsZWQsIGFib3J0aW5nLi4uXG4iKTsKLQkJCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKLQkJCQlwdXRfbGRldihtZGV2KTsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfZHJlcXVlc3QoKSBmYWlsZWQsIGFib3J0aW5nLi4uXG4iKTsKKwkJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQogCX0KIAotCWlmIChtZGV2LT5ibV9yZXN5bmNfZm8gPj0gZHJiZF9ibV9iaXRzKG1kZXYpKSB7CisJaWYgKGRldmljZS0+Ym1fcmVzeW5jX2ZvID49IGRyYmRfYm1fYml0cyhkZXZpY2UpKSB7CiAJCS8qIGxhc3Qgc3luY2VyIF9yZXF1ZXN0XyB3YXMgc2VudCwKIAkJICogYnV0IHRoZSBQX1JTX0RBVEFfUkVQTFkgbm90IHlldCByZWNlaXZlZC4gIHN5bmMgd2lsbCBlbmQgKGFuZAogCQkgKiBuZXh0IHN5bmMgZ3JvdXAgd2lsbCByZXN1bWUpLCBhcyBzb29uIGFzIHdlIHJlY2VpdmUgdGhlIGxhc3QKIAkJICogcmVzeW5jIGRhdGEgYmxvY2ssIGFuZCB0aGUgbGFzdCBiaXQgaXMgY2xlYXJlZC4KIAkJICogdW50aWwgdGhlbiByZXN5bmMgIndvcmsiIGlzICJpbmFjdGl2ZSIgLi4uCiAJCSAqLwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAgcmVxdWV1ZToKLQltZGV2LT5yc19pbl9mbGlnaHQgKz0gKGkgPDwgKEJNX0JMT0NLX1NISUZUIC0gOSkpOwotCW1vZF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzICsgU0xFRVBfVElNRSk7Ci0JcHV0X2xkZXYobWRldik7CisJZGV2aWNlLT5yc19pbl9mbGlnaHQgKz0gKGkgPDwgKEJNX0JMT0NLX1NISUZUIC0gOSkpOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXN5bmNfdGltZXIsIGppZmZpZXMgKyBTTEVFUF9USU1FKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdfbWFrZV9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCitzdGF0aWMgaW50IG1ha2Vfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKIAlpbnQgbnVtYmVyLCBpLCBzaXplOwogCXNlY3Rvcl90IHNlY3RvcjsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJY29uc3Qgc2VjdG9yX3QgY2FwYWNpdHkgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJYm9vbCBzdG9wX3NlY3Rvcl9yZWFjaGVkID0gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkKIAkJcmV0dXJuIDE7CiAKLQludW1iZXIgPSBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhtZGV2KTsKKwludW1iZXIgPSBkcmJkX3JzX251bWJlcl9yZXF1ZXN0cyhkZXZpY2UpOwogCi0Jc2VjdG9yID0gbWRldi0+b3ZfcG9zaXRpb247CisJc2VjdG9yID0gZGV2aWNlLT5vdl9wb3NpdGlvbjsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJaWYgKHNlY3RvciA+PSBjYXBhY2l0eSkKIAkJCXJldHVybiAxOwpAQCAtNzQ1LDExNiArNzUxLDEyMSBAQAogCQkgKiB3X2VfZW5kX292X3JlcGx5KCkuCiAJCSAqIFdlIG5lZWQgdG8gc2VuZCBhdCBsZWFzdCBvbmUgcmVxdWVzdCBvdXQuICovCiAJCXN0b3Bfc2VjdG9yX3JlYWNoZWQgPSBpID4gMAotCQkJJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihtZGV2KQotCQkJJiYgc2VjdG9yID49IG1kZXYtPm92X3N0b3Bfc2VjdG9yOworCQkJJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpCisJCQkmJiBzZWN0b3IgPj0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAkJaWYgKHN0b3Bfc2VjdG9yX3JlYWNoZWQpCiAJCQlicmVhazsKIAogCQlzaXplID0gQk1fQkxPQ0tfU0laRTsKIAotCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikgfHwKLQkJICAgIGRyYmRfdHJ5X3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpIHsKLQkJCW1kZXYtPm92X3Bvc2l0aW9uID0gc2VjdG9yOworCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKGRldmljZSwgc2VjdG9yKSB8fAorCQkgICAgZHJiZF90cnlfcnNfYmVnaW5faW8oZGV2aWNlLCBzZWN0b3IpKSB7CisJCQlkZXZpY2UtPm92X3Bvc2l0aW9uID0gc2VjdG9yOwogCQkJZ290byByZXF1ZXVlOwogCQl9CiAKIAkJaWYgKHNlY3RvciArIChzaXplPj45KSA+IGNhcGFjaXR5KQogCQkJc2l6ZSA9IChjYXBhY2l0eS1zZWN0b3IpPDw5OwogCi0JCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQlpZiAoZHJiZF9zZW5kX292X3JlcXVlc3QobWRldiwgc2VjdG9yLCBzaXplKSkgewotCQkJZGVjX3JzX3BlbmRpbmcobWRldik7CisJCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJCWlmIChkcmJkX3NlbmRfb3ZfcmVxdWVzdChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBzZWN0b3IsIHNpemUpKSB7CisJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJc2VjdG9yICs9IEJNX1NFQ1RfUEVSX0JJVDsKIAl9Ci0JbWRldi0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CisJZGV2aWNlLT5vdl9wb3NpdGlvbiA9IHNlY3RvcjsKIAogIHJlcXVldWU6Ci0JbWRldi0+cnNfaW5fZmxpZ2h0ICs9IChpIDw8IChCTV9CTE9DS19TSElGVCAtIDkpKTsKKwlkZXZpY2UtPnJzX2luX2ZsaWdodCArPSAoaSA8PCAoQk1fQkxPQ0tfU0hJRlQgLSA5KSk7CiAJaWYgKGkgPT0gMCB8fCAhc3RvcF9zZWN0b3JfcmVhY2hlZCkKLQkJbW9kX3RpbWVyKCZtZGV2LT5yZXN5bmNfdGltZXIsIGppZmZpZXMgKyBTTEVFUF9USU1FKTsKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlc3luY190aW1lciwgamlmZmllcyArIFNMRUVQX1RJTUUpOwogCXJldHVybiAxOwogfQogCiBpbnQgd19vdl9maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCWtmcmVlKHcpOwotCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOwotCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdyA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yaywgdyk7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBkdy0+ZGV2aWNlOworCWtmcmVlKGR3KTsKKwlvdl9vdXRfb2Zfc3luY19wcmludChkZXZpY2UpOworCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3X3Jlc3luY19maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCWtmcmVlKHcpOworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdyA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yaywgdyk7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBkdy0+ZGV2aWNlOworCWtmcmVlKGR3KTsKIAotCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGluZ19wZWVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgdm9pZCBwaW5nX3BlZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAKLQljbGVhcl9iaXQoR09UX1BJTkdfQUNLLCAmdGNvbm4tPmZsYWdzKTsKLQlyZXF1ZXN0X3BpbmcodGNvbm4pOwotCXdhaXRfZXZlbnQodGNvbm4tPnBpbmdfd2FpdCwKLQkJICAgdGVzdF9iaXQoR09UX1BJTkdfQUNLLCAmdGNvbm4tPmZsYWdzKSB8fCBtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpOworCWNsZWFyX2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncyk7CisJcmVxdWVzdF9waW5nKGNvbm5lY3Rpb24pOworCXdhaXRfZXZlbnQoY29ubmVjdGlvbi0+cGluZ193YWl0LAorCQkgICB0ZXN0X2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncykgfHwgZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpOwogfQogCi1pbnQgZHJiZF9yZXN5bmNfZmluaXNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX3Jlc3luY19maW5pc2hlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdDsKIAl1bnNpZ25lZCBsb25nIG5fb29zOwogCXVuaW9uIGRyYmRfc3RhdGUgb3MsIG5zOwotCXN0cnVjdCBkcmJkX3dvcmsgKnc7CisJc3RydWN0IGRyYmRfZGV2aWNlX3dvcmsgKmR3OwogCWNoYXIgKmtoZWxwZXJfY21kID0gTlVMTDsKIAlpbnQgdmVyaWZ5X2RvbmUgPSAwOwogCiAJLyogUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSByZXN5bmMgTFJVLiBTaW5jZSBmdXR1cmUgYWN0aW9ucwogCSAqIG1pZ2h0IHNldCBiaXRzIGluIHRoZSAobWFpbikgYml0bWFwLCB0aGVuIHRoZSBlbnRyaWVzIGluIHRoZQogCSAqIHJlc3luYyBMUlUgd291bGQgYmUgd3JvbmcuICovCi0JaWYgKGRyYmRfcnNfZGVsX2FsbChtZGV2KSkgeworCWlmIChkcmJkX3JzX2RlbF9hbGwoZGV2aWNlKSkgewogCQkvKiBJbiBjYXNlIHRoaXMgaXMgbm90IHBvc3NpYmxlIG5vdywgbW9zdCBwcm9iYWJseSBiZWNhdXNlCiAJCSAqIHRoZXJlIGFyZSBQX1JTX0RBVEFfUkVQTFkgUGFja2V0cyBsaW5nZXJpbmcgb24gdGhlIHdvcmtlcidzCiAJCSAqIHF1ZXVlIChvciBldmVuIHRoZSByZWFkIG9wZXJhdGlvbnMgZm9yIHRob3NlIHBhY2tldHMKIAkJICogaXMgbm90IGZpbmlzaGVkIGJ5IG5vdykuICAgUmV0cnkgaW4gMTAwbXMuICovCiAKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaIC8gMTApOwotCQl3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfd29yayksIEdGUF9BVE9NSUMpOwotCQlpZiAodykgewotCQkJdy0+Y2IgPSB3X3Jlc3luY19maW5pc2hlZDsKLQkJCXctPm1kZXYgPSBtZGV2OwotCQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssIHcpOworCQlkdyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkcmJkX2RldmljZV93b3JrKSwgR0ZQX0FUT01JQyk7CisJCWlmIChkdykgeworCQkJZHctPncuY2IgPSB3X3Jlc3luY19maW5pc2hlZDsKKwkJCWR3LT5kZXZpY2UgPSBkZXZpY2U7CisJCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCQkmZHctPncpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJZGV2X2VycihERVYsICJXYXJuIGZhaWxlZCB0byBkcmJkX3JzX2RlbF9hbGwoKSBhbmQgdG8ga21hbGxvYyh3KS5cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJXYXJuIGZhaWxlZCB0byBkcmJkX3JzX2RlbF9hbGwoKSBhbmQgdG8ga21hbGxvYyhkdykuXG4iKTsKIAl9CiAKLQlkdCA9IChqaWZmaWVzIC0gbWRldi0+cnNfc3RhcnQgLSBtZGV2LT5yc19wYXVzZWQpIC8gSFo7CisJZHQgPSAoamlmZmllcyAtIGRldmljZS0+cnNfc3RhcnQgLSBkZXZpY2UtPnJzX3BhdXNlZCkgLyBIWjsKIAlpZiAoZHQgPD0gMCkKIAkJZHQgPSAxOwotCQotCWRiID0gbWRldi0+cnNfdG90YWw7CisKKwlkYiA9IGRldmljZS0+cnNfdG90YWw7CiAJLyogYWRqdXN0IGZvciB2ZXJpZnkgc3RhcnQgYW5kIHN0b3Agc2VjdG9ycywgcmVzcGVjdGl2ZSByZWFjaGVkIHBvc2l0aW9uICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCWRiIC09IG1kZXYtPm92X2xlZnQ7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9UKQorCQlkYiAtPSBkZXZpY2UtPm92X2xlZnQ7CiAKIAlkYmR0ID0gQml0MktCKGRiL2R0KTsKLQltZGV2LT5yc19wYXVzZWQgLz0gSFo7CisJZGV2aWNlLT5yc19wYXVzZWQgLz0gSFo7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJZ290byBvdXQ7CiAKLQlwaW5nX3BlZXIobWRldik7CisJcGluZ19wZWVyKGRldmljZSk7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCW9zID0gZHJiZF9yZWFkX3N0YXRlKG1kZXYpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlvcyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOwogCiAJdmVyaWZ5X2RvbmUgPSAob3MuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG9zLmNvbm4gPT0gQ19WRVJJRllfVCk7CiAKQEAgLTg2Niw0MSArODc3LDQxIEBACiAJbnMgPSBvczsKIAlucy5jb25uID0gQ19DT05ORUNURUQ7CiAKLQlkZXZfaW5mbyhERVYsICIlcyBkb25lICh0b3RhbCAlbHUgc2VjOyBwYXVzZWQgJWx1IHNlYzsgJWx1IEsvc2VjKVxuIiwKKwlkcmJkX2luZm8oZGV2aWNlLCAiJXMgZG9uZSAodG90YWwgJWx1IHNlYzsgcGF1c2VkICVsdSBzZWM7ICVsdSBLL3NlYylcbiIsCiAJICAgICB2ZXJpZnlfZG9uZSA/ICJPbmxpbmUgdmVyaWZ5IiA6ICJSZXN5bmMiLAotCSAgICAgZHQgKyBtZGV2LT5yc19wYXVzZWQsIG1kZXYtPnJzX3BhdXNlZCwgZGJkdCk7CisJICAgICBkdCArIGRldmljZS0+cnNfcGF1c2VkLCBkZXZpY2UtPnJzX3BhdXNlZCwgZGJkdCk7CiAKLQluX29vcyA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOworCW5fb29zID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKTsKIAogCWlmIChvcy5jb25uID09IENfVkVSSUZZX1MgfHwgb3MuY29ubiA9PSBDX1ZFUklGWV9UKSB7CiAJCWlmIChuX29vcykgewotCQkJZGV2X2FsZXJ0KERFViwgIk9ubGluZSB2ZXJpZnkgZm91bmQgJWx1ICVkayBibG9jayBvdXQgb2Ygc3luYyFcbiIsCisJCQlkcmJkX2FsZXJ0KGRldmljZSwgIk9ubGluZSB2ZXJpZnkgZm91bmQgJWx1ICVkayBibG9jayBvdXQgb2Ygc3luYyFcbiIsCiAJCQkgICAgICBuX29vcywgQml0MktCKDEpKTsKIAkJCWtoZWxwZXJfY21kID0gIm91dC1vZi1zeW5jIjsKIAkJfQogCX0gZWxzZSB7Ci0JCURfQVNTRVJUKChuX29vcyAtIG1kZXYtPnJzX2ZhaWxlZCkgPT0gMCk7CisJCURfQVNTRVJUKGRldmljZSwgKG5fb29zIC0gZGV2aWNlLT5yc19mYWlsZWQpID09IDApOwogCiAJCWlmIChvcy5jb25uID09IENfU1lOQ19UQVJHRVQgfHwgb3MuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QpCiAJCQlraGVscGVyX2NtZCA9ICJhZnRlci1yZXN5bmMtdGFyZ2V0IjsKIAotCQlpZiAobWRldi0+dGNvbm4tPmNzdW1zX3RmbSAmJiBtZGV2LT5yc190b3RhbCkgewotCQkJY29uc3QgdW5zaWduZWQgbG9uZyBzID0gbWRldi0+cnNfc2FtZV9jc3VtOwotCQkJY29uc3QgdW5zaWduZWQgbG9uZyB0ID0gbWRldi0+cnNfdG90YWw7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0gJiYgZGV2aWNlLT5yc190b3RhbCkgeworCQkJY29uc3QgdW5zaWduZWQgbG9uZyBzID0gZGV2aWNlLT5yc19zYW1lX2NzdW07CisJCQljb25zdCB1bnNpZ25lZCBsb25nIHQgPSBkZXZpY2UtPnJzX3RvdGFsOwogCQkJY29uc3QgaW50IHJhdGlvID0KIAkJCQkodCA9PSAwKSAgICAgPyAwIDoKIAkJCSh0IDwgMTAwMDAwKSA/ICgocyoxMDApL3QpIDogKHMvKHQvMTAwKSk7Ci0JCQlkZXZfaW5mbyhERVYsICIldSAlJSBoYWQgZXF1YWwgY2hlY2tzdW1zLCBlbGltaW5hdGVkOiAlbHVLOyAiCisJCQlkcmJkX2luZm8oZGV2aWNlLCAiJXUgJSUgaGFkIGVxdWFsIGNoZWNrc3VtcywgZWxpbWluYXRlZDogJWx1SzsgIgogCQkJICAgICAidHJhbnNmZXJyZWQgJWx1SyB0b3RhbCAlbHVLXG4iLAogCQkJICAgICByYXRpbywKLQkJCSAgICAgQml0MktCKG1kZXYtPnJzX3NhbWVfY3N1bSksCi0JCQkgICAgIEJpdDJLQihtZGV2LT5yc190b3RhbCAtIG1kZXYtPnJzX3NhbWVfY3N1bSksCi0JCQkgICAgIEJpdDJLQihtZGV2LT5yc190b3RhbCkpOworCQkJICAgICBCaXQyS0IoZGV2aWNlLT5yc19zYW1lX2NzdW0pLAorCQkJICAgICBCaXQyS0IoZGV2aWNlLT5yc190b3RhbCAtIGRldmljZS0+cnNfc2FtZV9jc3VtKSwKKwkJCSAgICAgQml0MktCKGRldmljZS0+cnNfdG90YWwpKTsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5yc19mYWlsZWQpIHsKLQkJZGV2X2luZm8oREVWLCAiICAgICAgICAgICAgJWx1IGZhaWxlZCBibG9ja3NcbiIsIG1kZXYtPnJzX2ZhaWxlZCk7CisJaWYgKGRldmljZS0+cnNfZmFpbGVkKSB7CisJCWRyYmRfaW5mbyhkZXZpY2UsICIgICAgICAgICAgICAlbHUgZmFpbGVkIGJsb2Nrc1xuIiwgZGV2aWNlLT5yc19mYWlsZWQpOwogCiAJCWlmIChvcy5jb25uID09IENfU1lOQ19UQVJHRVQgfHwgb3MuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QpIHsKIAkJCW5zLmRpc2sgPSBEX0lOQ09OU0lTVEVOVDsKQEAgLTkxNCwxNzkgKzkyNSwxODEgQEAKIAkJbnMucGRzayA9IERfVVBfVE9fREFURTsKIAogCQlpZiAob3MuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8IG9zLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7Ci0JCQlpZiAobWRldi0+cF91dWlkKSB7CisJCQlpZiAoZGV2aWNlLT5wX3V1aWQpIHsKIAkJCQlpbnQgaTsKIAkJCQlmb3IgKGkgPSBVSV9CSVRNQVAgOyBpIDw9IFVJX0hJU1RPUllfRU5EIDsgaSsrKQotCQkJCQlfZHJiZF91dWlkX3NldChtZGV2LCBpLCBtZGV2LT5wX3V1aWRbaV0pOwotCQkJCWRyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdKTsKLQkJCQlfZHJiZF91dWlkX3NldChtZGV2LCBVSV9DVVJSRU5ULCBtZGV2LT5wX3V1aWRbVUlfQ1VSUkVOVF0pOworCQkJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIGksIGRldmljZS0+cF91dWlkW2ldKTsKKwkJCQlkcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOworCQkJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQ1VSUkVOVCwgZGV2aWNlLT5wX3V1aWRbVUlfQ1VSUkVOVF0pOwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKERFViwgIm1kZXYtPnBfdXVpZCBpcyBOVUxMISBCVUdcbiIpOworCQkJCWRyYmRfZXJyKGRldmljZSwgImRldmljZS0+cF91dWlkIGlzIE5VTEwhIEJVR1xuIik7CiAJCQl9CiAJCX0KIAogCQlpZiAoIShvcy5jb25uID09IENfVkVSSUZZX1MgfHwgb3MuY29ubiA9PSBDX1ZFUklGWV9UKSkgewogCQkJLyogZm9yIHZlcmlmeSBydW5zLCB3ZSBkb24ndCB1cGRhdGUgdXVpZHMgaGVyZSwKIAkJCSAqIHNvIHRoZXJlIHdvdWxkIGJlIG5vdGhpbmcgdG8gcmVwb3J0LiAqLwotCQkJZHJiZF91dWlkX3NldF9ibShtZGV2LCAwVUwpOwotCQkJZHJiZF9wcmludF91dWlkcyhtZGV2LCAidXBkYXRlZCBVVUlEcyIpOwotCQkJaWYgKG1kZXYtPnBfdXVpZCkgeworCQkJZHJiZF91dWlkX3NldF9ibShkZXZpY2UsIDBVTCk7CisJCQlkcmJkX3ByaW50X3V1aWRzKGRldmljZSwgInVwZGF0ZWQgVVVJRHMiKTsKKwkJCWlmIChkZXZpY2UtPnBfdXVpZCkgewogCQkJCS8qIE5vdyB0aGUgdHdvIFVVSUQgc2V0cyBhcmUgZXF1YWwsIHVwZGF0ZSB3aGF0IHdlCiAJCQkJICoga25vdyBvZiB0aGUgcGVlci4gKi8KIAkJCQlpbnQgaTsKIAkJCQlmb3IgKGkgPSBVSV9DVVJSRU5UIDsgaSA8PSBVSV9ISVNUT1JZX0VORCA7IGkrKykKLQkJCQkJbWRldi0+cF91dWlkW2ldID0gbWRldi0+bGRldi0+bWQudXVpZFtpXTsKKwkJCQkJZGV2aWNlLT5wX3V1aWRbaV0gPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaV07CiAJCQl9CiAJCX0KIAl9CiAKLQlfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOworCV9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBDU19WRVJCT1NFLCBOVUxMKTsKIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXB1dF9sZGV2KG1kZXYpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXB1dF9sZGV2KGRldmljZSk7CiBvdXQ6Ci0JbWRldi0+cnNfdG90YWwgID0gMDsKLQltZGV2LT5yc19mYWlsZWQgPSAwOwotCW1kZXYtPnJzX3BhdXNlZCA9IDA7CisJZGV2aWNlLT5yc190b3RhbCAgPSAwOworCWRldmljZS0+cnNfZmFpbGVkID0gMDsKKwlkZXZpY2UtPnJzX3BhdXNlZCA9IDA7CiAKIAkvKiByZXNldCBzdGFydCBzZWN0b3IsIGlmIHdlIHJlYWNoZWQgZW5kIG9mIGRldmljZSAqLwotCWlmICh2ZXJpZnlfZG9uZSAmJiBtZGV2LT5vdl9sZWZ0ID09IDApCi0JCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IDA7CisJaWYgKHZlcmlmeV9kb25lICYmIGRldmljZS0+b3ZfbGVmdCA9PSAwKQorCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IDA7CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKIAlpZiAoa2hlbHBlcl9jbWQpCi0JCWRyYmRfa2hlbHBlcihtZGV2LCBraGVscGVyX2NtZCk7CisJCWRyYmRfa2hlbHBlcihkZXZpY2UsIGtoZWxwZXJfY21kKTsKIAogCXJldHVybiAxOwogfQogCiAvKiBoZWxwZXIgKi8KLXN0YXRpYyB2b2lkIG1vdmVfdG9fbmV0X2VlX29yX2ZyZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkKK3N0YXRpYyB2b2lkIG1vdmVfdG9fbmV0X2VlX29yX2ZyZWUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpCiB7CiAJaWYgKGRyYmRfcGVlcl9yZXFfaGFzX2FjdGl2ZV9wYWdlKHBlZXJfcmVxKSkgewogCQkvKiBUaGlzIG1pZ2h0IGhhcHBlbiBpZiBzZW5kcGFnZSgpIGhhcyBub3QgZmluaXNoZWQgKi8KIAkJaW50IGkgPSAocGVlcl9yZXEtPmkuc2l6ZSArIFBBR0VfU0laRSAtMSkgPj4gUEFHRV9TSElGVDsKLQkJYXRvbWljX2FkZChpLCAmbWRldi0+cHBfaW5fdXNlX2J5X25ldCk7Ci0JCWF0b21pY19zdWIoaSwgJm1kZXYtPnBwX2luX3VzZSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZtZGV2LT5uZXRfZWUpOwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCWF0b21pY19hZGQoaSwgJmRldmljZS0+cHBfaW5fdXNlX2J5X25ldCk7CisJCWF0b21pY19zdWIoaSwgJmRldmljZS0+cHBfaW5fdXNlKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmZGV2aWNlLT5uZXRfZWUpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJd2FrZV91cCgmZHJiZF9wcF93YWl0KTsKIAl9IGVsc2UKLQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogfQogCiAvKioKICAqIHdfZV9lbmRfZGF0YV9yZXEoKSAtIFdvcmtlciBjYWxsYmFjaywgdG8gc2VuZCBhIFBfREFUQV9SRVBMWSBwYWNrZXQgaW4gcmVzcG9uc2UgdG8gYSBQX0RBVEFfUkVRVUVTVAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAdzoJCXdvcmsgb2JqZWN0LgogICogQGNhbmNlbDoJVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW55d2F5cwogICovCiBpbnQgd19lX2VuZF9kYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOwotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCQlkZWNfdW5hY2tlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAobGlrZWx5KChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9XQVNfRVJST1IpID09IDApKSB7Ci0JCWVyciA9IGRyYmRfc2VuZF9ibG9jayhtZGV2LCBQX0RBVEFfUkVQTFksIHBlZXJfcmVxKTsKKwkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKHBlZXJfZGV2aWNlLCBQX0RBVEFfUkVQTFksIHBlZXJfcmVxKTsKIAl9IGVsc2UgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiU2VuZGluZyBOZWdEUmVwbHkuIHNlY3Rvcj0lbGx1cy5cbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJTZW5kaW5nIE5lZ0RSZXBseS4gc2VjdG9yPSVsbHVzLlxuIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlZXJfcmVxLT5pLnNlY3Rvcik7CiAKLQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBQX05FR19EUkVQTFksIHBlZXJfcmVxKTsKKwkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfRFJFUExZLCBwZWVyX3JlcSk7CiAJfQogCi0JZGVjX3VuYWNrZWQobWRldik7CisJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAotCW1vdmVfdG9fbmV0X2VlX29yX2ZyZWUobWRldiwgcGVlcl9yZXEpOworCW1vdmVfdG9fbmV0X2VlX29yX2ZyZWUoZGV2aWNlLCBwZWVyX3JlcSk7CiAKIAlpZiAodW5saWtlbHkoZXJyKSkKLQkJZGV2X2VycihERVYsICJkcmJkX3NlbmRfYmxvY2soKSBmYWlsZWRcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfYmxvY2soKSBmYWlsZWRcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKIC8qKgogICogd19lX2VuZF9yc2RhdGFfcmVxKCkgLSBXb3JrZXIgY2FsbGJhY2sgdG8gc2VuZCBhIFBfUlNfREFUQV9SRVBMWSBwYWNrZXQgaW4gcmVzcG9uc2UgdG8gYSBQX1JTX0RBVEFfUkVRVUVTVAotICogQG1kZXY6CURSQkQgZGV2aWNlLgogICogQHc6CQl3b3JrIG9iamVjdC4KICAqIEBjYW5jZWw6CVRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIGFueXdheXMKICAqLwogaW50IHdfZV9lbmRfcnNkYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOwotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCQlkZWNfdW5hY2tlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9GQUlMRUQpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQUhFQUQpIHsKLQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBQX1JTX0NBTkNFTCwgcGVlcl9yZXEpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19BSEVBRCkgeworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX1JTX0NBTkNFTCwgcGVlcl9yZXEpOwogCX0gZWxzZSBpZiAobGlrZWx5KChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9XQVNfRVJST1IpID09IDApKSB7Ci0JCWlmIChsaWtlbHkobWRldi0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCkpIHsKLQkJCWluY19yc19wZW5kaW5nKG1kZXYpOwotCQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKG1kZXYsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOworCQlpZiAobGlrZWx5KGRldmljZS0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCkpIHsKKwkJCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJCQllcnIgPSBkcmJkX3NlbmRfYmxvY2socGVlcl9kZXZpY2UsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOwogCQl9IGVsc2UgewogCQkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQkJZGV2X2VycihERVYsICJOb3Qgc2VuZGluZyBSU0RhdGFSZXBseSwgIgorCQkJCWRyYmRfZXJyKGRldmljZSwgIk5vdCBzZW5kaW5nIFJTRGF0YVJlcGx5LCAiCiAJCQkJICAgICJwYXJ0bmVyIERJU0tMRVNTIVxuIik7CiAJCQllcnIgPSAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIlNlbmRpbmcgTmVnUlNEUmVwbHkuIHNlY3RvciAlbGx1cy5cbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJTZW5kaW5nIE5lZ1JTRFJlcGx5LiBzZWN0b3IgJWxsdXMuXG4iLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGVlcl9yZXEtPmkuc2VjdG9yKTsKIAotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX1JTX0RSRVBMWSwgcGVlcl9yZXEpOworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX05FR19SU19EUkVQTFksIHBlZXJfcmVxKTsKIAogCQkvKiB1cGRhdGUgcmVzeW5jIGRhdGEgd2l0aCBmYWlsdXJlICovCi0JCWRyYmRfcnNfZmFpbGVkX2lvKG1kZXYsIHBlZXJfcmVxLT5pLnNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CisJCWRyYmRfcnNfZmFpbGVkX2lvKGRldmljZSwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKIAl9CiAKLQlkZWNfdW5hY2tlZChtZGV2KTsKKwlkZWNfdW5hY2tlZChkZXZpY2UpOwogCi0JbW92ZV90b19uZXRfZWVfb3JfZnJlZShtZGV2LCBwZWVyX3JlcSk7CisJbW92ZV90b19uZXRfZWVfb3JfZnJlZShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCWlmICh1bmxpa2VseShlcnIpKQotCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9ibG9jaygpIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2VuZF9ibG9jaygpIGZhaWxlZFxuIik7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IHdfZV9lbmRfY3N1bV9yc19yZXEoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZGlnZXN0X2luZm8gKmRpOwogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3QgPSBOVUxMOwogCWludCBlcnIsIGVxID0gMDsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7Ci0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JCWRlY191bmFja2VkKG1kZXYpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CisJCWRlY191bmFja2VkKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHBlZXJfcmVxLT5pLnNlY3Rvcik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWRpID0gcGVlcl9yZXEtPmRpZ2VzdDsKQEAgLTEwOTUsNDcgKzExMDgsNDggQEAKIAkJLyogcXVpY2sgaGFjayB0byB0cnkgdG8gYXZvaWQgYSByYWNlIGFnYWluc3QgcmVjb25maWd1cmF0aW9uLgogCQkgKiBhIHJlYWwgZml4IHdvdWxkIGJlIG11Y2ggbW9yZSBpbnZvbHZlZCwKIAkJICogaW50cm9kdWNpbmcgbW9yZSBsb2NraW5nIG1lY2hhbmlzbXMgKi8KLQkJaWYgKG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pIHsKLQkJCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+Y3N1bXNfdGZtKTsKLQkJCURfQVNTRVJUKGRpZ2VzdF9zaXplID09IGRpLT5kaWdlc3Rfc2l6ZSk7CisJCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtKSB7CisJCQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmNzdW1zX3RmbSk7CisJCQlEX0FTU0VSVChkZXZpY2UsIGRpZ2VzdF9zaXplID09IGRpLT5kaWdlc3Rfc2l6ZSk7CiAJCQlkaWdlc3QgPSBrbWFsbG9jKGRpZ2VzdF9zaXplLCBHRlBfTk9JTyk7CiAJCX0KIAkJaWYgKGRpZ2VzdCkgewotCQkJZHJiZF9jc3VtX2VlKG1kZXYsIG1kZXYtPnRjb25uLT5jc3Vtc190Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOworCQkJZHJiZF9jc3VtX2VlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCQkJZXEgPSAhbWVtY21wKGRpZ2VzdCwgZGktPmRpZ2VzdCwgZGlnZXN0X3NpemUpOwogCQkJa2ZyZWUoZGlnZXN0KTsKIAkJfQogCiAJCWlmIChlcSkgewotCQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOworCQkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHBlZXJfcmVxLT5pLnNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CiAJCQkvKiByc19zYW1lX2NzdW1zIHVuaXQgaXMgQk1fQkxPQ0tfU0laRSAqLwotCQkJbWRldi0+cnNfc2FtZV9jc3VtICs9IHBlZXJfcmVxLT5pLnNpemUgPj4gQk1fQkxPQ0tfU0hJRlQ7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUlNfSVNfSU5fU1lOQywgcGVlcl9yZXEpOworCQkJZGV2aWNlLT5yc19zYW1lX2NzdW0gKz0gcGVlcl9yZXEtPmkuc2l6ZSA+PiBCTV9CTE9DS19TSElGVDsKKwkJCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIFBfUlNfSVNfSU5fU1lOQywgcGVlcl9yZXEpOwogCQl9IGVsc2UgewotCQkJaW5jX3JzX3BlbmRpbmcobWRldik7CisJCQlpbmNfcnNfcGVuZGluZyhkZXZpY2UpOwogCQkJcGVlcl9yZXEtPmJsb2NrX2lkID0gSURfU1lOQ0VSOyAvKiBCeSBzZXR0aW5nIGJsb2NrX2lkLCBkaWdlc3QgcG9pbnRlciBiZWNvbWVzIGludmFsaWQhICovCiAJCQlwZWVyX3JlcS0+ZmxhZ3MgJj0gfkVFX0hBU19ESUdFU1Q7IC8qIFRoaXMgcGVlciByZXF1ZXN0IG5vIGxvbmdlciBoYXMgYSBkaWdlc3QgcG9pbnRlciAqLwogCQkJa2ZyZWUoZGkpOwotCQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKG1kZXYsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOworCQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKHBlZXJfZGV2aWNlLCBQX1JTX0RBVEFfUkVQTFksIHBlZXJfcmVxKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWVyciA9IGRyYmRfc2VuZF9hY2sobWRldiwgUF9ORUdfUlNfRFJFUExZLCBwZWVyX3JlcSk7CisJCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIFBfTkVHX1JTX0RSRVBMWSwgcGVlcl9yZXEpOwogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiU2VuZGluZyBOZWdEUmVwbHkuIEkgZ3Vlc3MgaXQgZ2V0cyBtZXNzeS5cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiU2VuZGluZyBOZWdEUmVwbHkuIEkgZ3Vlc3MgaXQgZ2V0cyBtZXNzeS5cbiIpOwogCX0KIAotCWRlY191bmFja2VkKG1kZXYpOwotCW1vdmVfdG9fbmV0X2VlX29yX2ZyZWUobWRldiwgcGVlcl9yZXEpOworCWRlY191bmFja2VkKGRldmljZSk7CisJbW92ZV90b19uZXRfZWVfb3JfZnJlZShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCWlmICh1bmxpa2VseShlcnIpKQotCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9ibG9jay9hY2soKSBmYWlsZWRcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3NlbmRfYmxvY2svYWNrKCkgZmFpbGVkXG4iKTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgd19lX2VuZF9vdl9yZXEoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CiAJdW5zaWduZWQgaW50IHNpemUgPSBwZWVyX3JlcS0+aS5zaXplOwogCWludCBkaWdlc3Rfc2l6ZTsKQEAgLTExNDUsNyArMTE1OSw3IEBACiAJaWYgKHVubGlrZWx5KGNhbmNlbCkpCiAJCWdvdG8gb3V0OwogCi0JZGlnZXN0X3NpemUgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT52ZXJpZnlfdGZtKTsKKwlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOwogCWRpZ2VzdCA9IGttYWxsb2MoZGlnZXN0X3NpemUsIEdGUF9OT0lPKTsKIAlpZiAoIWRpZ2VzdCkgewogCQllcnIgPSAxOwkvKiB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaW4gY2FzZSB0aGUgYWxsb2NhdGlvbiBmYWlsZWQgKi8KQEAgLTExNTMsNyArMTE2Nyw3IEBACiAJfQogCiAJaWYgKGxpa2VseSghKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikpKQotCQlkcmJkX2NzdW1fZWUobWRldiwgbWRldi0+dGNvbm4tPnZlcmlmeV90Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOworCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCWVsc2UKIAkJbWVtc2V0KGRpZ2VzdCwgMCwgZGlnZXN0X3NpemUpOwogCkBAIC0xMTYyLDM2ICsxMTc2LDM3IEBACiAJICogc29tZSBkaXN0cmlidXRlZCBkZWFkbG9jaywgaWYgdGhlIG90aGVyIHNpZGUgYmxvY2tzIG9uCiAJICogY29uZ2VzdGlvbiBhcyB3ZWxsLCBiZWNhdXNlIG91ciByZWNlaXZlciBibG9ja3MgaW4KIAkgKiBkcmJkX2FsbG9jX3BhZ2VzIGR1ZSB0byBwcF9pbl91c2UgPiBtYXhfYnVmZmVycy4gKi8KLQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAlwZWVyX3JlcSA9IE5VTEw7Ci0JaW5jX3JzX3BlbmRpbmcobWRldik7Ci0JZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0X2NzdW0obWRldiwgc2VjdG9yLCBzaXplLCBkaWdlc3QsIGRpZ2VzdF9zaXplLCBQX09WX1JFUExZKTsKKwlpbmNfcnNfcGVuZGluZyhkZXZpY2UpOworCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHBlZXJfZGV2aWNlLCBzZWN0b3IsIHNpemUsIGRpZ2VzdCwgZGlnZXN0X3NpemUsIFBfT1ZfUkVQTFkpOwogCWlmIChlcnIpCi0JCWRlY19yc19wZW5kaW5nKG1kZXYpOworCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCWtmcmVlKGRpZ2VzdCk7CiAKIG91dDoKIAlpZiAocGVlcl9yZXEpCi0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JZGVjX3VuYWNrZWQobWRldik7CisJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKKwlkZWNfdW5hY2tlZChkZXZpY2UpOwogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQordm9pZCBkcmJkX292X291dF9vZl9zeW5jX2ZvdW5kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQogewotCWlmIChtZGV2LT5vdl9sYXN0X29vc19zdGFydCArIG1kZXYtPm92X2xhc3Rfb29zX3NpemUgPT0gc2VjdG9yKSB7Ci0JCW1kZXYtPm92X2xhc3Rfb29zX3NpemUgKz0gc2l6ZT4+OTsKKwlpZiAoZGV2aWNlLT5vdl9sYXN0X29vc19zdGFydCArIGRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSA9PSBzZWN0b3IpIHsKKwkJZGV2aWNlLT5vdl9sYXN0X29vc19zaXplICs9IHNpemU+Pjk7CiAJfSBlbHNlIHsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc3RhcnQgPSBzZWN0b3I7Ci0JCW1kZXYtPm92X2xhc3Rfb29zX3NpemUgPSBzaXplPj45OworCQlkZXZpY2UtPm92X2xhc3Rfb29zX3N0YXJ0ID0gc2VjdG9yOworCQlkZXZpY2UtPm92X2xhc3Rfb29zX3NpemUgPSBzaXplPj45OwogCX0KLQlkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCBzZWN0b3IsIHNpemUpOworCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIH0KIAogaW50IHdfZV9lbmRfb3ZfcmVwbHkoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZGlnZXN0X2luZm8gKmRpOwogCXZvaWQgKmRpZ2VzdDsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CkBAIC0xMjAxLDI3ICsxMjE2LDI3IEBACiAJYm9vbCBzdG9wX3NlY3Rvcl9yZWFjaGVkID0gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOwotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCQlkZWNfdW5hY2tlZChkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBhZnRlciAiY2FuY2VsIiwgYmVjYXVzZSBhZnRlciBkcmJkX2Rpc2Nvbm5lY3QvZHJiZF9yc19jYW5jZWxfYWxsCiAJICogdGhlIHJlc3luYyBscnUgaGFzIGJlZW4gY2xlYW5lZCB1cCBhbHJlYWR5ICovCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJZHJiZF9yc19jb21wbGV0ZV9pbyhkZXZpY2UsIHBlZXJfcmVxLT5pLnNlY3Rvcik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJZGkgPSBwZWVyX3JlcS0+ZGlnZXN0OwogCiAJaWYgKGxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSA9PSAwKSkgewotCQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPnZlcmlmeV90Zm0pOworCQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOwogCQlkaWdlc3QgPSBrbWFsbG9jKGRpZ2VzdF9zaXplLCBHRlBfTk9JTyk7CiAJCWlmIChkaWdlc3QpIHsKLQkJCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CisJCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnZlcmlmeV90Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCi0JCQlEX0FTU0VSVChkaWdlc3Rfc2l6ZSA9PSBkaS0+ZGlnZXN0X3NpemUpOworCQkJRF9BU1NFUlQoZGV2aWNlLCBkaWdlc3Rfc2l6ZSA9PSBkaS0+ZGlnZXN0X3NpemUpOwogCQkJZXEgPSAhbWVtY21wKGRpZ2VzdCwgZGktPmRpZ2VzdCwgZGlnZXN0X3NpemUpOwogCQkJa2ZyZWUoZGlnZXN0KTsKIAkJfQpAQCAtMTIzMiwxMDIgKzEyNDcsOTUgQEAKIAkgKiBzb21lIGRpc3RyaWJ1dGVkIGRlYWRsb2NrLCBpZiB0aGUgb3RoZXIgc2lkZSBibG9ja3Mgb24KIAkgKiBjb25nZXN0aW9uIGFzIHdlbGwsIGJlY2F1c2Ugb3VyIHJlY2VpdmVyIGJsb2NrcyBpbgogCSAqIGRyYmRfYWxsb2NfcGFnZXMgZHVlIHRvIHBwX2luX3VzZSA+IG1heF9idWZmZXJzLiAqLwotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCWlmICghZXEpCi0JCWRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChkZXZpY2UsIHNlY3Rvciwgc2l6ZSk7CiAJZWxzZQotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKIAotCWVyciA9IGRyYmRfc2VuZF9hY2tfZXgobWRldiwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwKKwllcnIgPSBkcmJkX3NlbmRfYWNrX2V4KHBlZXJfZGV2aWNlLCBQX09WX1JFU1VMVCwgc2VjdG9yLCBzaXplLAogCQkJICAgICAgIGVxID8gSURfSU5fU1lOQyA6IElEX09VVF9PRl9TWU5DKTsKIAotCWRlY191bmFja2VkKG1kZXYpOworCWRlY191bmFja2VkKGRldmljZSk7CiAKLQktLW1kZXYtPm92X2xlZnQ7CisJLS1kZXZpY2UtPm92X2xlZnQ7CiAKIAkvKiBsZXQncyBhZHZhbmNlIHByb2dyZXNzIHN0ZXAgbWFya3Mgb25seSBmb3IgZXZlcnkgb3RoZXIgbWVnYWJ5dGUgKi8KLQlpZiAoKG1kZXYtPm92X2xlZnQgJiAweDIwMCkgPT0gMHgyMDApCi0JCWRyYmRfYWR2YW5jZV9yc19tYXJrcyhtZGV2LCBtZGV2LT5vdl9sZWZ0KTsKKwlpZiAoKGRldmljZS0+b3ZfbGVmdCAmIDB4MjAwKSA9PSAweDIwMCkKKwkJZHJiZF9hZHZhbmNlX3JzX21hcmtzKGRldmljZSwgZGV2aWNlLT5vdl9sZWZ0KTsKIAotCXN0b3Bfc2VjdG9yX3JlYWNoZWQgPSB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKG1kZXYpICYmCi0JCShzZWN0b3IgKyAoc2l6ZT4+OSkpID49IG1kZXYtPm92X3N0b3Bfc2VjdG9yOworCXN0b3Bfc2VjdG9yX3JlYWNoZWQgPSB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKGRldmljZSkgJiYKKwkJKHNlY3RvciArIChzaXplPj45KSkgPj0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAotCWlmIChtZGV2LT5vdl9sZWZ0ID09IDAgfHwgc3RvcF9zZWN0b3JfcmVhY2hlZCkgewotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKLQkJZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJaWYgKGRldmljZS0+b3ZfbGVmdCA9PSAwIHx8IHN0b3Bfc2VjdG9yX3JlYWNoZWQpIHsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKKwkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgd19wcmV2X3dvcmtfZG9uZShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQotewotCXN0cnVjdCBkcmJkX3dxX2JhcnJpZXIgKmIgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfd3FfYmFycmllciwgdyk7Ci0KLQljb21wbGV0ZSgmYi0+ZG9uZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qIEZJWE1FCiAgKiBXZSBuZWVkIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YgcGVuZGluZyBiYXJyaWVyIGFja3MsCiAgKiBhbmQgdG8gYmUgYWJsZSB0byB3YWl0IGZvciB0aGVtLgogICogU2VlIGFsc28gY29tbWVudCBpbiBkcmJkX2FkbV9hdHRhY2ggYmVmb3JlIGRyYmRfc3VzcGVuZF9pby4KICAqLwotaW50IGRyYmRfc2VuZF9iYXJyaWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBpbnQgZHJiZF9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgcF9iYXJyaWVyICpwOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAotCXNvY2sgPSAmdGNvbm4tPmRhdGE7Ci0JcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87Ci0JcC0+YmFycmllciA9IHRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnI7CisJcC0+YmFycmllciA9IGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF9ucjsKIAlwLT5wYWQgPSAwOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKKwljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKIAotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9CQVJSSUVSLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9CQVJSSUVSLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogaW50IHdfc2VuZF93cml0ZV9oaW50KHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCB1bnBsdWdfd29yayk7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCiAJaWYgKGNhbmNlbCkKIAkJcmV0dXJuIDA7Ci0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlpZiAoIWRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spKQorCXNvY2sgPSAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlpZiAoIWRyYmRfcHJlcGFyZV9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIHNvY2spKQogCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9VTlBMVUdfUkVNT1RFLCAwLCBOVUxMLCAwKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgc29jaywgUF9VTlBMVUdfUkVNT1RFLCAwLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgcmVfaW5pdF9pZl9maXJzdF93cml0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuc2lnbmVkIGludCBlcG9jaCkKK3N0YXRpYyB2b2lkIHJlX2luaXRfaWZfZmlyc3Rfd3JpdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGVwb2NoKQogewotCWlmICghdGNvbm4tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0KSB7Ci0JCXRjb25uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IHRydWU7Ci0JCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSBlcG9jaDsKLQkJdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMgPSAwOworCWlmICghY29ubmVjdGlvbi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQpIHsKKwkJY29ubmVjdGlvbi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQgPSB0cnVlOworCQljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSBlcG9jaDsKKwkJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcyA9IDA7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBtYXliZV9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgZXBvY2gpCitzdGF0aWMgdm9pZCBtYXliZV9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGVwb2NoKQogewogCS8qIHJlLWluaXQgaWYgZmlyc3Qgd3JpdGUgb24gdGhpcyBjb25uZWN0aW9uICovCi0JaWYgKCF0Y29ubi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQpCisJaWYgKCFjb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCkKIAkJcmV0dXJuOwotCWlmICh0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yICE9IGVwb2NoKSB7Ci0JCWlmICh0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcykKLQkJCWRyYmRfc2VuZF9iYXJyaWVyKHRjb25uKTsKLQkJdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF9uciA9IGVwb2NoOworCWlmIChjb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgIT0gZXBvY2gpIHsKKwkJaWYgKGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMpCisJCQlkcmJkX3NlbmRfYmFycmllcihjb25uZWN0aW9uKTsKKwkJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yID0gZXBvY2g7CiAJfQogfQogCiBpbnQgd19zZW5kX291dF9vZl9zeW5jKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJaW50IGVycjsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7CkBAIC0xMzM1LDEzICsxMzQzLDEzIEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIHRoaXMgdGltZSwgbm8gdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMrKzsKKwkvKiB0aGlzIHRpbWUsIG5vIGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMrKzsKIAkgKiBJZiBpdCB3YXMgc2VudCwgaXQgd2FzIHRoZSBjbG9zaW5nIGJhcnJpZXIgZm9yIHRoZSBsYXN0CiAJICogcmVwbGljYXRlZCBlcG9jaCwgYmVmb3JlIHdlIHdlbnQgaW50byBBSEVBRCBtb2RlLgogCSAqIE5vIG1vcmUgYmFycmllcnMgd2lsbCBiZSBzZW50LCB1bnRpbCB3ZSBsZWF2ZSBBSEVBRCBtb2RlIGFnYWluLiAqLwotCW1heWJlX3NlbmRfYmFycmllcih0Y29ubiwgcmVxLT5lcG9jaCk7CisJbWF5YmVfc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24sIHJlcS0+ZXBvY2gpOwogCi0JZXJyID0gZHJiZF9zZW5kX291dF9vZl9zeW5jKG1kZXYsIHJlcSk7CisJZXJyID0gZHJiZF9zZW5kX291dF9vZl9zeW5jKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIHJlcSk7CiAJcmVxX21vZChyZXEsIE9PU19IQU5ERURfVE9fTkVUV09SSyk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTM0OSwxNSArMTM1NywxNCBAQAogCiAvKioKICAqIHdfc2VuZF9kYmxvY2soKSAtIFdvcmtlciBjYWxsYmFjayB0byBzZW5kIGEgUF9EQVRBIHBhY2tldCBpbiBvcmRlciB0byBtaXJyb3IgYSB3cml0ZSByZXF1ZXN0Ci0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCiAgKiBAdzoJCXdvcmsgb2JqZWN0LgogICogQGNhbmNlbDoJVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW55d2F5cwogICovCiBpbnQgd19zZW5kX2RibG9jayhzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewpAQCAtMTM2NSwxMSArMTM3MiwxMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZV9pbml0X2lmX2ZpcnN0X3dyaXRlKHRjb25uLCByZXEtPmVwb2NoKTsKLQltYXliZV9zZW5kX2JhcnJpZXIodGNvbm4sIHJlcS0+ZXBvY2gpOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzKys7CisJcmVfaW5pdF9pZl9maXJzdF93cml0ZShjb25uZWN0aW9uLCByZXEtPmVwb2NoKTsKKwltYXliZV9zZW5kX2JhcnJpZXIoY29ubmVjdGlvbiwgcmVxLT5lcG9jaCk7CisJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcysrOwogCi0JZXJyID0gZHJiZF9zZW5kX2RibG9jayhtZGV2LCByZXEpOworCWVyciA9IGRyYmRfc2VuZF9kYmxvY2soZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgcmVxKTsKIAlyZXFfbW9kKHJlcSwgZXJyID8gU0VORF9GQUlMRUQgOiBIQU5ERURfT1ZFUl9UT19ORVRXT1JLKTsKIAogCXJldHVybiBlcnI7CkBAIC0xMzc3LDE1ICsxMzg0LDE0IEBACiAKIC8qKgogICogd19zZW5kX3JlYWRfcmVxKCkgLSBXb3JrZXIgY2FsbGJhY2sgdG8gc2VuZCBhIHJlYWQgcmVxdWVzdCAoUF9EQVRBX1JFUVVFU1QpIHBhY2tldAotICogQG1kZXY6CURSQkQgZGV2aWNlLgogICogQHc6CQl3b3JrIG9iamVjdC4KICAqIEBjYW5jZWw6CVRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIGFueXdheXMKICAqLwogaW50IHdfc2VuZF9yZWFkX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCWludCBlcnI7CiAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkgewpAQCAtMTM5NSw5ICsxNDAxLDkgQEAKIAogCS8qIEV2ZW4gcmVhZCByZXF1ZXN0cyBtYXkgY2xvc2UgYSB3cml0ZSBlcG9jaCwKIAkgKiBpZiB0aGVyZSB3YXMgYW55IHlldC4gKi8KLQltYXliZV9zZW5kX2JhcnJpZXIodGNvbm4sIHJlcS0+ZXBvY2gpOworCW1heWJlX3NlbmRfYmFycmllcihjb25uZWN0aW9uLCByZXEtPmVwb2NoKTsKIAotCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdChtZGV2LCBQX0RBVEFfUkVRVUVTVCwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUsCisJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIFBfREFUQV9SRVFVRVNULCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSwKIAkJCQkgKHVuc2lnbmVkIGxvbmcpcmVxKTsKIAogCXJlcV9tb2QocmVxLCBlcnIgPyBTRU5EX0ZBSUxFRCA6IEhBTkRFRF9PVkVSX1RPX05FVFdPUkspOwpAQCAtMTQwOCwyMSArMTQxNCwyMSBAQAogaW50IHdfcmVzdGFydF9kaXNrX2lvKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAKIAlpZiAoYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2JpbykgPT0gV1JJVEUgJiYgcmVxLT5ycV9zdGF0ZSAmIFJRX0lOX0FDVF9MT0cpCi0JCWRyYmRfYWxfYmVnaW5faW8obWRldiwgJnJlcS0+aSwgZmFsc2UpOworCQlkcmJkX2FsX2JlZ2luX2lvKGRldmljZSwgJnJlcS0+aSwgZmFsc2UpOwogCiAJZHJiZF9yZXFfbWFrZV9wcml2YXRlX2JpbyhyZXEsIHJlcS0+bWFzdGVyX2Jpbyk7Ci0JcmVxLT5wcml2YXRlX2Jpby0+YmlfYmRldiA9IG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldjsKKwlyZXEtPnByaXZhdGVfYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAJZ2VuZXJpY19tYWtlX3JlcXVlc3QocmVxLT5wcml2YXRlX2Jpbyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfZHJiZF9tYXlfc3luY19ub3coc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgX2RyYmRfbWF5X3N5bmNfbm93KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm9kZXYgPSBtZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldiA9IGRldmljZTsKIAlpbnQgcmVzeW5jX2FmdGVyOwogCiAJd2hpbGUgKDEpIHsKQEAgLTE0MzMsNyArMTQzOSw3IEBACiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlpZiAocmVzeW5jX2FmdGVyID09IC0xKQogCQkJcmV0dXJuIDE7Ci0JCW9kZXYgPSBtaW5vcl90b19tZGV2KHJlc3luY19hZnRlcik7CisJCW9kZXYgPSBtaW5vcl90b19kZXZpY2UocmVzeW5jX2FmdGVyKTsKIAkJaWYgKCFvZGV2KQogCQkJcmV0dXJuIDE7CiAJCWlmICgob2Rldi0+c3RhdGUuY29ubiA+PSBDX1NZTkNfU09VUkNFICYmCkBAIC0xNDQ2LDE3ICsxNDUyLDE3IEBACiAKIC8qKgogICogX2RyYmRfcGF1c2VfYWZ0ZXIoKSAtIFBhdXNlIHJlc3luYyBvbiBhbGwgZGV2aWNlcyB0aGF0IG1heSBub3QgcmVzeW5jIG5vdwotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKgogICogQ2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IG9ubHkgKGFkbWluIGNvbW1hbmQgYW5kIGFmdGVyX3N0YXRlX2NoKS4KICAqLwotc3RhdGljIGludCBfZHJiZF9wYXVzZV9hZnRlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBfZHJiZF9wYXVzZV9hZnRlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldjsKIAlpbnQgaSwgcnYgPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmbWlub3JzLCBvZGV2LCBpKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZkcmJkX2RldmljZXMsIG9kZXYsIGkpIHsKIAkJaWYgKG9kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG9kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKIAkJCWNvbnRpbnVlOwogCQlpZiAoIV9kcmJkX21heV9zeW5jX25vdyhvZGV2KSkKQEAgLTE0NzAsMTcgKzE0NzYsMTcgQEAKIAogLyoqCiAgKiBfZHJiZF9yZXN1bWVfbmV4dCgpIC0gUmVzdW1lIHJlc3luYyBvbiBhbGwgZGV2aWNlcyB0aGF0IG1heSByZXN5bmMgbm93Ci0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBDYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgb25seSAoYWRtaW4gY29tbWFuZCBhbmQgd29ya2VyKS4KICAqLwotc3RhdGljIGludCBfZHJiZF9yZXN1bWVfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBfZHJiZF9yZXN1bWVfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldjsKIAlpbnQgaSwgcnYgPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmbWlub3JzLCBvZGV2LCBpKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZkcmJkX2RldmljZXMsIG9kZXYsIGkpIHsKIAkJaWYgKG9kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG9kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKIAkJCWNvbnRpbnVlOwogCQlpZiAob2Rldi0+c3RhdGUuYWZ0cl9pc3ApIHsKQEAgLTE0OTQsMjQgKzE1MDAsMjQgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJd3JpdGVfbG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlfZHJiZF9yZXN1bWVfbmV4dChtZGV2KTsKKwlfZHJiZF9yZXN1bWVfbmV4dChkZXZpY2UpOwogCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKIH0KIAotdm9pZCBzdXNwZW5kX290aGVyX3NnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIHN1c3BlbmRfb3RoZXJfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJd3JpdGVfbG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlfZHJiZF9wYXVzZV9hZnRlcihtZGV2KTsKKwlfZHJiZF9wYXVzZV9hZnRlcihkZXZpY2UpOwogCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKIH0KIAogLyogY2FsbGVyIG11c3QgaG9sZCBnbG9iYWxfc3RhdGVfbG9jayAqLwotZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBvX21pbm9yKQorZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgb19taW5vcikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqb2RldjsKIAlpbnQgcmVzeW5jX2FmdGVyOwogCiAJaWYgKG9fbWlub3IgPT0gLTEpCkBAIC0xNTIwLDkgKzE1MjYsOSBAQAogCQlyZXR1cm4gRVJSX1JFU1lOQ19BRlRFUjsKIAogCS8qIGNoZWNrIGZvciBsb29wcyAqLwotCW9kZXYgPSBtaW5vcl90b19tZGV2KG9fbWlub3IpOworCW9kZXYgPSBtaW5vcl90b19kZXZpY2Uob19taW5vcik7CiAJd2hpbGUgKDEpIHsKLQkJaWYgKG9kZXYgPT0gbWRldikKKwkJaWYgKG9kZXYgPT0gZGV2aWNlKQogCQkJcmV0dXJuIEVSUl9SRVNZTkNfQUZURVJfQ1lDTEU7CiAKIAkJLyogWW91IGFyZSBmcmVlIHRvIGRlcGVuZCBvbiBkaXNrbGVzcywgbm9uLWV4aXN0aW5nLApAQCAtMTU0MiwzNSArMTU0OCwzNSBAQAogCQkJcmV0dXJuIE5PX0VSUk9SOwogCiAJCS8qIGZvbGxvdyB0aGUgZGVwZW5kZW5jeSBjaGFpbiAqLwotCQlvZGV2ID0gbWlub3JfdG9fbWRldihyZXN5bmNfYWZ0ZXIpOworCQlvZGV2ID0gbWlub3JfdG9fZGV2aWNlKHJlc3luY19hZnRlcik7CiAJfQogfQogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGdsb2JhbF9zdGF0ZV9sb2NrICovCi12b2lkIGRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgY2hhbmdlczsKIAogCWRvIHsKLQkJY2hhbmdlcyAgPSBfZHJiZF9wYXVzZV9hZnRlcihtZGV2KTsKLQkJY2hhbmdlcyB8PSBfZHJiZF9yZXN1bWVfbmV4dChtZGV2KTsKKwkJY2hhbmdlcyAgPSBfZHJiZF9wYXVzZV9hZnRlcihkZXZpY2UpOworCQljaGFuZ2VzIHw9IF9kcmJkX3Jlc3VtZV9uZXh0KGRldmljZSk7CiAJfSB3aGlsZSAoY2hhbmdlcyk7CiB9CiAKLXZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfcnNfY29udHJvbGxlcl9yZXNldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgZmlmb19idWZmZXIgKnBsYW47CiAKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19zZWN0X2luLCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19zZWN0X2V2LCAwKTsKLQltZGV2LT5yc19pbl9mbGlnaHQgPSAwOworCWF0b21pY19zZXQoJmRldmljZS0+cnNfc2VjdF9pbiwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19zZWN0X2V2LCAwKTsKKwlkZXZpY2UtPnJzX2luX2ZsaWdodCA9IDA7CiAKIAkvKiBVcGRhdGluZyB0aGUgUkNVIHByb3RlY3RlZCBvYmplY3QgaW4gcGxhY2UgaXMgbmVjZXNzYXJ5IHNpbmNlCiAJICAgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBmcm9tIGF0b21pYyBjb250ZXh0LgogCSAgIEl0IGlzIHZhbGlkIHNpbmNlIGFsbCBvdGhlciB1cGRhdGVzIGFsc28gbGVhZCB0byBhbiBjb21wbGV0ZWx5CiAJICAgZW1wdHkgZmlmbyAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlwbGFuID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnJzX3BsYW5fcyk7CisJcGxhbiA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPnJzX3BsYW5fcyk7CiAJcGxhbi0+dG90YWwgPSAwOwogCWZpZm9fc2V0KHBsYW4sIDApOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTU3OCwxMDEgKzE1ODQsMTA0IEBACiAKIHZvaWQgc3RhcnRfcmVzeW5jX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gKHN0cnVjdCBkcmJkX2NvbmYgKikgZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgZHJiZF9kZXZpY2UgKikgZGF0YTsKIAotCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+c3RhcnRfcmVzeW5jX3dvcmspOworCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkmZGV2aWNlLT5zdGFydF9yZXN5bmNfd29yayk7CiB9CiAKIGludCB3X3N0YXJ0X3Jlc3luYyhzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZSwgc3RhcnRfcmVzeW5jX3dvcmspOwogCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT51bmFja2VkX2NudCkgfHwgYXRvbWljX3JlYWQoJm1kZXYtPnJzX3BlbmRpbmdfY250KSkgewotCQlkZXZfd2FybihERVYsICJ3X3N0YXJ0X3Jlc3luYyBsYXRlci4uLlxuIik7Ci0JCW1kZXYtPnN0YXJ0X3Jlc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzEwOwotCQlhZGRfdGltZXIoJm1kZXYtPnN0YXJ0X3Jlc3luY190aW1lcik7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPnVuYWNrZWRfY250KSB8fCBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCkpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIndfc3RhcnRfcmVzeW5jIGxhdGVyLi4uXG4iKTsKKwkJZGV2aWNlLT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8xMDsKKwkJYWRkX3RpbWVyKCZkZXZpY2UtPnN0YXJ0X3Jlc3luY190aW1lcik7CiAJCXJldHVybiAwOwogCX0KIAotCWRyYmRfc3RhcnRfcmVzeW5jKG1kZXYsIENfU1lOQ19TT1VSQ0UpOwotCWNsZWFyX2JpdChBSEVBRF9UT19TWU5DX1NPVVJDRSwgJm1kZXYtPmZsYWdzKTsKKwlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOworCWNsZWFyX2JpdChBSEVBRF9UT19TWU5DX1NPVVJDRSwgJmRldmljZS0+ZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiAvKioKICAqIGRyYmRfc3RhcnRfcmVzeW5jKCkgLSBTdGFydCB0aGUgcmVzeW5jIHByb2Nlc3MKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHNpZGU6CUVpdGhlciBDX1NZTkNfU09VUkNFIG9yIENfU1lOQ19UQVJHRVQKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGJyaW5nIHlvdSBkaXJlY3RseSBpbnRvIG9uZSBvZiB0aGUKICAqIENfUEFVU0VEX1NZTkNfKiBzdGF0ZXMuCiAgKi8KLXZvaWQgZHJiZF9zdGFydF9yZXN5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Nvbm5zIHNpZGUpCit2b2lkIGRyYmRfc3RhcnRfcmVzeW5jKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRyYmRfY29ubnMgc2lkZSkKIHsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zOwogCWludCByOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJiBtZGV2LT5zdGF0ZS5jb25uIDwgQ19BSEVBRCkgewotCQlkZXZfZXJyKERFViwgIlJlc3luYyBhbHJlYWR5IHJ1bm5pbmchXG4iKTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYgZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19BSEVBRCkgeworCQlkcmJkX2VycihkZXZpY2UsICJSZXN5bmMgYWxyZWFkeSBydW5uaW5nIVxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KEJfUlNfSF9ET05FLCAmbWRldi0+ZmxhZ3MpKSB7CisJaWYgKCF0ZXN0X2JpdChCX1JTX0hfRE9ORSwgJmRldmljZS0+ZmxhZ3MpKSB7CiAJCWlmIChzaWRlID09IENfU1lOQ19UQVJHRVQpIHsKIAkJCS8qIFNpbmNlIGFwcGxpY2F0aW9uIElPIHdhcyBsb2NrZWQgb3V0IGR1cmluZyBDX1dGX0JJVE1BUF9UIGFuZAogCQkJICAgQ19XRl9TWU5DX1VVSUQgd2UgYXJlIHN0aWxsIHVubW9kaWZpZWQuIEJlZm9yZSBnb2luZyB0byBDX1NZTkNfVEFSR0VUCiAJCQkgICB3ZSBjaGVjayB0aGF0IHdlIG1pZ2h0IG1ha2UgdGhlIGRhdGEgaW5jb25zaXN0ZW50LiAqLwotCQkJciA9IGRyYmRfa2hlbHBlcihtZGV2LCAiYmVmb3JlLXJlc3luYy10YXJnZXQiKTsKKwkJCXIgPSBkcmJkX2toZWxwZXIoZGV2aWNlLCAiYmVmb3JlLXJlc3luYy10YXJnZXQiKTsKIAkJCXIgPSAociA+PiA4KSAmIDB4ZmY7CiAJCQlpZiAociA+IDApIHsKLQkJCQlkZXZfaW5mbyhERVYsICJiZWZvcmUtcmVzeW5jLXRhcmdldCBoYW5kbGVyIHJldHVybmVkICVkLCAiCisJCQkJZHJiZF9pbmZvKGRldmljZSwgImJlZm9yZS1yZXN5bmMtdGFyZ2V0IGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKIAkJCQkJICJkcm9wcGluZyBjb25uZWN0aW9uLlxuIiwgcik7Ci0JCQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCQljb25uX3JlcXVlc3Rfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9IGVsc2UgLyogQ19TWU5DX1NPVVJDRSAqLyB7Ci0JCQlyID0gZHJiZF9raGVscGVyKG1kZXYsICJiZWZvcmUtcmVzeW5jLXNvdXJjZSIpOworCQkJciA9IGRyYmRfa2hlbHBlcihkZXZpY2UsICJiZWZvcmUtcmVzeW5jLXNvdXJjZSIpOwogCQkJciA9IChyID4+IDgpICYgMHhmZjsKIAkJCWlmIChyID4gMCkgewogCQkJCWlmIChyID09IDMpIHsKLQkJCQkJZGV2X2luZm8oREVWLCAiYmVmb3JlLXJlc3luYy1zb3VyY2UgaGFuZGxlciByZXR1cm5lZCAlZCwgIgorCQkJCQlkcmJkX2luZm8oZGV2aWNlLCAiYmVmb3JlLXJlc3luYy1zb3VyY2UgaGFuZGxlciByZXR1cm5lZCAlZCwgIgogCQkJCQkJICJpZ25vcmluZy4gT2xkIHVzZXJsYW5kIHRvb2xzPyIsIHIpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWRldl9pbmZvKERFViwgImJlZm9yZS1yZXN5bmMtc291cmNlIGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKKwkJCQkJZHJiZF9pbmZvKGRldmljZSwgImJlZm9yZS1yZXN5bmMtc291cmNlIGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKIAkJCQkJCSAiZHJvcHBpbmcgY29ubmVjdGlvbi5cbiIsIHIpOwotCQkJCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQkJCQljb25uX3JlcXVlc3Rfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwKKwkJCQkJCQkgICBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KIAotCWlmIChjdXJyZW50ID09IG1kZXYtPnRjb25uLT53b3JrZXIudGFzaykgeworCWlmIChjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKSB7CiAJCS8qIFRoZSB3b3JrZXIgc2hvdWxkIG5vdCBzbGVlcCB3YWl0aW5nIGZvciBzdGF0ZV9tdXRleCwKIAkJICAgdGhhdCBjYW4gdGFrZSBsb25nICovCi0JCWlmICghbXV0ZXhfdHJ5bG9jayhtZGV2LT5zdGF0ZV9tdXRleCkpIHsKLQkJCXNldF9iaXQoQl9SU19IX0RPTkUsICZtZGV2LT5mbGFncyk7Ci0JCQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi81OwotCQkJYWRkX3RpbWVyKCZtZGV2LT5zdGFydF9yZXN5bmNfdGltZXIpOworCQlpZiAoIW11dGV4X3RyeWxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCkpIHsKKwkJCXNldF9iaXQoQl9SU19IX0RPTkUsICZkZXZpY2UtPmZsYWdzKTsKKwkJCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovNTsKKwkJCWFkZF90aW1lcigmZGV2aWNlLT5zdGFydF9yZXN5bmNfdGltZXIpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKLQkJbXV0ZXhfbG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCW11dGV4X2xvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAJfQotCWNsZWFyX2JpdChCX1JTX0hfRE9ORSwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQl9SU19IX0RPTkUsICZkZXZpY2UtPmZsYWdzKTsKIAogCXdyaXRlX2xvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAJLyogRGlkIHNvbWUgY29ubmVjdGlvbiBicmVha2FnZSBvciBJTyBlcnJvciByYWNlIHdpdGggdXM/ICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRAotCXx8ICFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRAorCXx8ICFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CiAJCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQkJbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCi0JbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJbnMgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAotCW5zLmFmdHJfaXNwID0gIV9kcmJkX21heV9zeW5jX25vdyhtZGV2KTsKKwlucy5hZnRyX2lzcCA9ICFfZHJiZF9tYXlfc3luY19ub3coZGV2aWNlKTsKIAogCW5zLmNvbm4gPSBzaWRlOwogCkBAIC0xNjgxLDQzICsxNjkwLDQzIEBACiAJZWxzZSAvKiBzaWRlID09IENfU1lOQ19TT1VSQ0UgKi8KIAkJbnMucGRzayA9IERfSU5DT05TSVNURU5UOwogCi0JciA9IF9fZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOwotCW5zID0gZHJiZF9yZWFkX3N0YXRlKG1kZXYpOworCXIgPSBfX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOworCW5zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CiAKIAlpZiAobnMuY29ubiA8IENfQ09OTkVDVEVEKQogCQlyID0gU1NfVU5LTk9XTl9FUlJPUjsKIAogCWlmIChyID09IFNTX1NVQ0NFU1MpIHsKLQkJdW5zaWduZWQgbG9uZyB0dyA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOworCQl1bnNpZ25lZCBsb25nIHR3ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKTsKIAkJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCQlpbnQgaTsKIAotCQltZGV2LT5yc19mYWlsZWQgICAgPSAwOwotCQltZGV2LT5yc19wYXVzZWQgICAgPSAwOwotCQltZGV2LT5yc19zYW1lX2NzdW0gPSAwOwotCQltZGV2LT5yc19sYXN0X2V2ZW50cyA9IDA7Ci0JCW1kZXYtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7Ci0JCW1kZXYtPnJzX3RvdGFsICAgICA9IHR3OwotCQltZGV2LT5yc19zdGFydCAgICAgPSBub3c7CisJCWRldmljZS0+cnNfZmFpbGVkICAgID0gMDsKKwkJZGV2aWNlLT5yc19wYXVzZWQgICAgPSAwOworCQlkZXZpY2UtPnJzX3NhbWVfY3N1bSA9IDA7CisJCWRldmljZS0+cnNfbGFzdF9ldmVudHMgPSAwOworCQlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CisJCWRldmljZS0+cnNfdG90YWwgICAgID0gdHc7CisJCWRldmljZS0+cnNfc3RhcnQgICAgID0gbm93OwogCQlmb3IgKGkgPSAwOyBpIDwgRFJCRF9TWU5DX01BUktTOyBpKyspIHsKLQkJCW1kZXYtPnJzX21hcmtfbGVmdFtpXSA9IHR3OwotCQkJbWRldi0+cnNfbWFya190aW1lW2ldID0gbm93OworCQkJZGV2aWNlLT5yc19tYXJrX2xlZnRbaV0gPSB0dzsKKwkJCWRldmljZS0+cnNfbWFya190aW1lW2ldID0gbm93OwogCQl9Ci0JCV9kcmJkX3BhdXNlX2FmdGVyKG1kZXYpOworCQlfZHJiZF9wYXVzZV9hZnRlcihkZXZpY2UpOwogCX0KIAl3cml0ZV91bmxvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAKIAlpZiAociA9PSBTU19TVUNDRVNTKSB7CiAJCS8qIHJlc2V0IHJzX2xhc3RfYmNhc3Qgd2hlbiBhIHJlc3luYyBvciB2ZXJpZnkgaXMgc3RhcnRlZCwKIAkJICogdG8gZGVhbCB3aXRoIHBvdGVudGlhbCBqaWZmaWVzIHdyYXAuICovCi0JCW1kZXYtPnJzX2xhc3RfYmNhc3QgPSBqaWZmaWVzIC0gSFo7CisJCWRldmljZS0+cnNfbGFzdF9iY2FzdCA9IGppZmZpZXMgLSBIWjsKIAotCQlkZXZfaW5mbyhERVYsICJCZWdhbiByZXN5bmMgYXMgJXMgKHdpbGwgc3luYyAlbHUgS0IgWyVsdSBiaXRzIHNldF0pLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIkJlZ2FuIHJlc3luYyBhcyAlcyAod2lsbCBzeW5jICVsdSBLQiBbJWx1IGJpdHMgc2V0XSkuXG4iLAogCQkgICAgIGRyYmRfY29ubl9zdHIobnMuY29ubiksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIG1kZXYtPnJzX3RvdGFsIDw8IChCTV9CTE9DS19TSElGVC0xMCksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIG1kZXYtPnJzX3RvdGFsKTsKKwkJICAgICAodW5zaWduZWQgbG9uZykgZGV2aWNlLT5yc190b3RhbCA8PCAoQk1fQkxPQ0tfU0hJRlQtMTApLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBkZXZpY2UtPnJzX3RvdGFsKTsKIAkJaWYgKHNpZGUgPT0gQ19TWU5DX1RBUkdFVCkKLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IDA7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IDA7CiAKIAkJLyogU2luY2UgcHJvdG9jb2wgOTYsIHdlIG11c3Qgc2VyaWFsaXplIGRyYmRfZ2VuX2FuZF9zZW5kX3N5bmNfdXVpZAogCQkgKiB3aXRoIHdfc2VuZF9vb3MsIG9yIHRoZSBzeW5jIHRhcmdldCB3aWxsIGdldCBjb25mdXNlZCBhcyB0bwpAQCAtMTcyNiwxMCArMTczNSwxMiBAQAogCQkgKiBkcmJkX3Jlc3luY19maW5pc2hlZCBmcm9tIGhlcmUgaW4gdGhhdCBjYXNlLgogCQkgKiBXZSBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQgaGVyZSBmb3IgcHJvdG9jb2wgPCA5NiwKIAkJICogYW5kIGZyb20gYWZ0ZXJfc3RhdGVfY2ggb3RoZXJ3aXNlLiAqLwotCQlpZiAoc2lkZSA9PSBDX1NZTkNfU09VUkNFICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NikKLQkJCWRyYmRfZ2VuX2FuZF9zZW5kX3N5bmNfdXVpZChtZGV2KTsKKwkJaWYgKHNpZGUgPT0gQ19TWU5DX1NPVVJDRSAmJgorCQkgICAgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCisJCQlkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CiAKLQkJaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NSAmJiBtZGV2LT5yc190b3RhbCA9PSAwKSB7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NSAmJgorCQkgICAgZGV2aWNlLT5yc190b3RhbCA9PSAwKSB7CiAJCQkvKiBUaGlzIHN0aWxsIGhhcyBhIHJhY2UgKGFib3V0IHdoZW4gZXhhY3RseSB0aGUgcGVlcnMKIAkJCSAqIGRldGVjdCBjb25uZWN0aW9uIGxvc3MpIHRoYXQgY2FuIGxlYWQgdG8gYSBmdWxsIHN5bmMKIAkJCSAqIG9uIG5leHQgaGFuZHNoYWtlLiBJbiA4LjMuOSB3ZSBmaXhlZCB0aGlzIHdpdGggZXhwbGljaXQKQEAgLTE3NDUsMzMgKzE3NTYsMzMgQEAKIAkJCQlpbnQgdGltZW87CiAKIAkJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQkJbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwkJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQkJdGltZW8gPSBuYy0+cGluZ19pbnQgKiBIWiArIG5jLT5waW5nX3RpbWVvICogSFogLyA5OwogCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lbyk7CiAJCQl9Ci0JCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAJCX0KIAotCQlkcmJkX3JzX2NvbnRyb2xsZXJfcmVzZXQobWRldik7Ci0JCS8qIG5zLmNvbm4gbWF5IGFscmVhZHkgYmUgIT0gbWRldi0+c3RhdGUuY29ubiwKKwkJZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KGRldmljZSk7CisJCS8qIG5zLmNvbm4gbWF5IGFscmVhZHkgYmUgIT0gZGV2aWNlLT5zdGF0ZS5jb25uLAogCQkgKiB3ZSBtYXkgaGF2ZSBiZWVuIHBhdXNlZCBpbiBiZXR3ZWVuLCBvciBiZWNvbWUgcGF1c2VkIHVudGlsCiAJCSAqIHRoZSB0aW1lciB0cmlnZ2Vycy4KIAkJICogTm8gbWF0dGVyLCB0aGF0IGlzIGhhbmRsZWQgaW4gcmVzeW5jX3RpbWVyX2ZuKCkgKi8KIAkJaWYgKG5zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCkKLQkJCW1vZF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKKwkJCW1vZF90aW1lcigmZGV2aWNlLT5yZXN5bmNfdGltZXIsIGppZmZpZXMpOwogCi0JCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJfQotCXB1dF9sZGV2KG1kZXYpOwotCW11dGV4X3VubG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJcHV0X2xkZXYoZGV2aWNlKTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiB9CiAKIC8qIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGNsb3NlZCB0aGUgY3VycmVudCBlcG9jaCwgYnV0IHdlIGRpZCBub3QKICAqIChiZWNhdXNlIHdlIGhhdmUgbm90IHlldCBzZWVuIG5ldyByZXF1ZXN0cyksIHdlIHNob3VsZCBzZW5kIHRoZQogICogY29ycmVzcG9uZGluZyBiYXJyaWVyIG5vdy4gIE11c3QgYmUgY2hlY2tlZCB3aXRoaW4gdGhlIHNhbWUgc3BpbmxvY2sKICAqIHRoYXQgaXMgdXNlZCB0byBjaGVjayBmb3IgbmV3IHJlcXVlc3RzLiAqLwotYm9vbCBuZWVkX3RvX3NlbmRfYmFycmllcihzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubmVjdGlvbikKK3N0YXRpYyBib29sIG5lZWRfdG9fc2VuZF9iYXJyaWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJaWYgKCFjb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTc5NSw3ICsxODA2LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBkZXF1ZXVlX3dvcmtfYmF0Y2goc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCkKK3N0YXRpYyBib29sIGRlcXVldWVfd29ya19iYXRjaChzdHJ1Y3QgZHJiZF93b3JrX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQogewogCXNwaW5fbG9ja19pcnEoJnF1ZXVlLT5xX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJnF1ZXVlLT5xLCB3b3JrX2xpc3QpOwpAQCAtMTgwMyw3ICsxODE0LDcgQEAKIAlyZXR1cm4gIWxpc3RfZW1wdHkod29ya19saXN0KTsKIH0KIAotYm9vbCBkZXF1ZXVlX3dvcmtfaXRlbShzdHJ1Y3QgZHJiZF93b3JrX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQorc3RhdGljIGJvb2wgZGVxdWV1ZV93b3JrX2l0ZW0oc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCkKIHsKIAlzcGluX2xvY2tfaXJxKCZxdWV1ZS0+cV9sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnF1ZXVlLT5xKSkKQEAgLTE4MTIsNyArMTgyMyw3IEBACiAJcmV0dXJuICFsaXN0X2VtcHR5KHdvcmtfbGlzdCk7CiB9CiAKLXZvaWQgd2FpdF9mb3Jfd29yayhzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubmVjdGlvbiwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQorc3RhdGljIHZvaWQgd2FpdF9mb3Jfd29yayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKQEAgLTE4NDIsNyArMTg1Myw3IEBACiAJZm9yICg7OykgewogCQlpbnQgc2VuZF9iYXJyaWVyOwogCQlwcmVwYXJlX3RvX3dhaXQoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnFfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlcV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJc3Bpbl9sb2NrKCZjb25uZWN0aW9uLT5zZW5kZXJfd29yay5xX2xvY2spOwkvKiBGSVhNRSBnZXQgcmlkIG9mIHRoaXMgb25lPyAqLwogCQkvKiBkZXF1ZXVlIHNpbmdsZSBpdGVtIG9ubHksCiAJCSAqIHdlIHN0aWxsIHVzZSBkcmJkX3F1ZXVlX3dvcmtfZnJvbnQoKSBpbiBzb21lIHBsYWNlcyAqLwpAQCAtMTg1MCwxMSArMTg2MSwxMSBAQAogCQkJbGlzdF9tb3ZlKGNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnEubmV4dCwgd29ya19saXN0KTsKIAkJc3Bpbl91bmxvY2soJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnFfbG9jayk7CS8qIEZJWE1FIGdldCByaWQgb2YgdGhpcyBvbmU/ICovCiAJCWlmICghbGlzdF9lbXB0eSh3b3JrX2xpc3QpIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlcV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNlbmRfYmFycmllciA9IG5lZWRfdG9fc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24pOwotCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQlpZiAoc2VuZF9iYXJyaWVyKSB7CiAJCQlkcmJkX3NlbmRfYmFycmllcihjb25uZWN0aW9uKTsKIAkJCWNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF9ucisrOwpAQCAtMTg4Myw5ICsxODk0LDkgQEAKIAogaW50IGRyYmRfd29ya2VyKHN0cnVjdCBkcmJkX3RocmVhZCAqdGhpKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IHRoaS0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHRoaS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3QgZHJiZF93b3JrICp3ID0gTlVMTDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlMSVNUX0hFQUQod29ya19saXN0KTsKIAlpbnQgdm5yOwogCkBAIC0xODk1LDEyICsxOTA2LDEyIEBACiAJCS8qIGFzIGxvbmcgYXMgd2UgdXNlIGRyYmRfcXVldWVfd29ya19mcm9udCgpLAogCQkgKiB3ZSBtYXkgb25seSBkZXF1ZXVlIHNpbmdsZSB3b3JrIGl0ZW1zIGhlcmUsIG5vdCBiYXRjaGVzLiAqLwogCQlpZiAobGlzdF9lbXB0eSgmd29ya19saXN0KSkKLQkJCXdhaXRfZm9yX3dvcmsodGNvbm4sICZ3b3JrX2xpc3QpOworCQkJd2FpdF9mb3Jfd29yayhjb25uZWN0aW9uLCAmd29ya19saXN0KTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCQlpZiAoZ2V0X3Rfc3RhdGUodGhpKSA9PSBSVU5OSU5HKSB7Ci0JCQkJY29ubl93YXJuKHRjb25uLCAiV29ya2VyIGdvdCBhbiB1bmV4cGVjdGVkIHNpZ25hbFxuIik7CisJCQkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJXb3JrZXIgZ290IGFuIHVuZXhwZWN0ZWQgc2lnbmFsXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTkxMiwxMCArMTkyMywxMCBAQAogCQl3aGlsZSAoIWxpc3RfZW1wdHkoJndvcmtfbGlzdCkpIHsKIAkJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ3b3JrX2xpc3QsIHN0cnVjdCBkcmJkX3dvcmssIGxpc3QpOwogCQkJbGlzdF9kZWxfaW5pdCgmdy0+bGlzdCk7Ci0JCQlpZiAody0+Y2IodywgdGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUykgPT0gMCkKKwkJCWlmICh3LT5jYih3LCBjb25uZWN0aW9uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMpID09IDApCiAJCQkJY29udGludWU7Ci0JCQlpZiAodGNvbm4tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX05FVFdPUktfRkFJTFVSRSksIENTX0hBUkQpOworCQkJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJCQkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfTkVUV09SS19GQUlMVVJFKSwgQ1NfSEFSRCk7CiAJCX0KIAl9CiAKQEAgLTE5MjUsMTYgKzE5MzYsMTcgQEAKIAkJCWxpc3RfZGVsX2luaXQoJnctPmxpc3QpOwogCQkJdy0+Y2IodywgMSk7CiAJCX0KLQkJZGVxdWV1ZV93b3JrX2JhdGNoKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZ3b3JrX2xpc3QpOworCQlkZXF1ZXVlX3dvcmtfYmF0Y2goJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLCAmd29ya19saXN0KTsKIAl9IHdoaWxlICghbGlzdF9lbXB0eSgmd29ya19saXN0KSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCURfQVNTRVJUKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJiBtZGV2LT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSk7Ci0JCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSk7CisJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJZHJiZF9tZGV2X2NsZWFudXAobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9kZXZpY2VfY2xlYW51cChkZXZpY2UpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dyYXBwZXJzLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93cmFwcGVycy5oCmluZGV4IDMyOGYxOGUuLjNkYjllYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dyYXBwZXJzLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd3JhcHBlcnMuaApAQCAtOSwxMiArOSwxMiBAQAogZXh0ZXJuIGNoYXIgKmRyYmRfc2VjX2hvbGRlcjsKIAogLyogc2V0cyB0aGUgbnVtYmVyIG9mIDUxMiBieXRlIHNlY3RvcnMgb2Ygb3VyIHZpcnR1YWwgZGV2aWNlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9zZXRfbXlfY2FwYWNpdHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX3NldF9teV9jYXBhY2l0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJc2VjdG9yX3Qgc2l6ZSkKIHsKLQkvKiBzZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2LT5iZF9kaXNrLCBzaXplKTsgKi8KLQlzZXRfY2FwYWNpdHkobWRldi0+dmRpc2ssIHNpemUpOwotCW1kZXYtPnRoaXNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA9IChsb2ZmX3Qpc2l6ZSA8PCA5OworCS8qIHNldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldi0+YmRfZGlzaywgc2l6ZSk7ICovCisJc2V0X2NhcGFjaXR5KGRldmljZS0+dmRpc2ssIHNpemUpOworCWRldmljZS0+dGhpc19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID0gKGxvZmZfdClzaXplIDw8IDk7CiB9CiAKICNkZWZpbmUgZHJiZF9iaW9fdXB0b2RhdGUoYmlvKSBiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkKQEAgLTI3LDIwICsyNywyMCBAQAogLyoKICAqIHVzZWQgdG8gc3VibWl0IG91ciBwcml2YXRlIGJpbwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9nZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2VuZXJpY19tYWtlX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJCSAgICAgaW50IGZhdWx0X3R5cGUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlfX3JlbGVhc2UobG9jYWwpOwogCWlmICghYmlvLT5iaV9iZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZHJiZCVkOiBkcmJkX2dlbmVyaWNfbWFrZV9yZXF1ZXN0OiAiCiAJCQkJImJpby0+YmlfYmRldiA9PSBOVUxMXG4iLAotCQkgICAgICAgbWRldl90b19taW5vcihtZGV2KSk7CisJCSAgICAgICBkZXZpY2VfdG9fbWlub3IoZGV2aWNlKSk7CiAJCWR1bXBfc3RhY2soKTsKIAkJYmlvX2VuZGlvKGJpbywgLUVOT0RFVik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgZmF1bHRfdHlwZSkpCisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgZmF1bHRfdHlwZSkpCiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogCWVsc2UKIAkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCmluZGV4IDIwMjMwNDMuLjhmNTU2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKKysrIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwpAQCAtOTYxLDE3ICs5NjEsMzEgQEAKIHsKIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyhmbG9wcHlfd29yaywgTlVMTCk7CitzdGF0aWMgdm9pZCAoKmZsb3BweV93b3JrX2ZuKSh2b2lkKTsKKworc3RhdGljIHZvaWQgZmxvcHB5X3dvcmtfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlmbG9wcHlfd29ya19mbigpOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKGZsb3BweV93b3JrLCBmbG9wcHlfd29ya193b3JrZm4pOwogCiBzdGF0aWMgdm9pZCBzY2hlZHVsZV9iaCh2b2lkICgqaGFuZGxlcikodm9pZCkpCiB7CiAJV0FSTl9PTih3b3JrX3BlbmRpbmcoJmZsb3BweV93b3JrKSk7CiAKLQlQUkVQQVJFX1dPUksoJmZsb3BweV93b3JrLCAod29ya19mdW5jX3QpaGFuZGxlcik7CisJZmxvcHB5X3dvcmtfZm4gPSBoYW5kbGVyOwogCXF1ZXVlX3dvcmsoZmxvcHB5X3dxLCAmZmxvcHB5X3dvcmspOwogfQogCi1zdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoZmRfdGltZXIsIE5VTEwpOworc3RhdGljIHZvaWQgKCpmZF90aW1lcl9mbikodm9pZCkgPSBOVUxMOworCitzdGF0aWMgdm9pZCBmZF90aW1lcl93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWZkX3RpbWVyX2ZuKCk7Cit9CisKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhmZF90aW1lciwgZmRfdGltZXJfd29ya2ZuKTsKIAogc3RhdGljIHZvaWQgY2FuY2VsX2FjdGl2aXR5KHZvaWQpCiB7CkBAIC05ODIsNyArOTk2LDcgQEAKIAogLyogdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIGRpc2sgc3RheXMgaW4gdGhlIGRyaXZlIGR1cmluZyB0aGUKICAqIHRyYW5zZmVyICovCi1zdGF0aWMgdm9pZCBmZF93YXRjaGRvZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmFyZykKK3N0YXRpYyB2b2lkIGZkX3dhdGNoZG9nKHZvaWQpCiB7CiAJZGVidWdfZGNsKERQLT5mbGFncywgImNhbGxpbmcgZGlzayBjaGFuZ2UgZnJvbSB3YXRjaGRvZ1xuIik7CiAKQEAgLTk5Myw3ICsxMDA3LDcgQEAKIAkJcmVzZXRfZmRjKCk7CiAJfSBlbHNlIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmRfdGltZXIpOwotCQlQUkVQQVJFX0RFTEFZRURfV09SSygmZmRfdGltZXIsIGZkX3dhdGNoZG9nKTsKKwkJZmRfdGltZXJfZm4gPSBmZF93YXRjaGRvZzsKIAkJcXVldWVfZGVsYXllZF93b3JrKGZsb3BweV93cSwgJmZkX3RpbWVyLCBIWiAvIDEwKTsKIAl9CiB9CkBAIC0xMDA1LDcgKzEwMTksOCBAQAogfQogCiAvKiB3YWl0cyBmb3IgYSBkZWxheSAoc3BpbnVwIG9yIHNlbGVjdCkgdG8gcGFzcyAqLwotc3RhdGljIGludCBmZF93YWl0X2Zvcl9jb21wbGV0aW9uKHVuc2lnbmVkIGxvbmcgZXhwaXJlcywgd29ya19mdW5jX3QgZnVuY3Rpb24pCitzdGF0aWMgaW50IGZkX3dhaXRfZm9yX2NvbXBsZXRpb24odW5zaWduZWQgbG9uZyBleHBpcmVzLAorCQkJCSAgdm9pZCAoKmZ1bmN0aW9uKSh2b2lkKSkKIHsKIAlpZiAoRkRDUy0+cmVzZXQpIHsKIAkJcmVzZXRfZmRjKCk7CS8qIGRvIHRoZSByZXNldCBkdXJpbmcgc2xlZXAgdG8gd2luIHRpbWUKQEAgLTEwMTYsNyArMTAzMSw3IEBACiAKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJlcykpIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmRfdGltZXIpOwotCQlQUkVQQVJFX0RFTEFZRURfV09SSygmZmRfdGltZXIsIGZ1bmN0aW9uKTsKKwkJZmRfdGltZXJfZm4gPSBmdW5jdGlvbjsKIAkJcXVldWVfZGVsYXllZF93b3JrKGZsb3BweV93cSwgJmZkX3RpbWVyLCBleHBpcmVzIC0gamlmZmllcyk7CiAJCXJldHVybiAxOwogCX0KQEAgLTEzMzQsOCArMTM0OSw3IEBACiAJICogUGF1c2UgNSBtc2VjIHRvIGF2b2lkIHRyb3VibGUuIChOZWVkcyB0byBiZSAyIGppZmZpZXMpCiAJICovCiAJRkRDUy0+ZHRyID0gcmF3X2NtZC0+cmF0ZSAmIDM7Ci0JcmV0dXJuIGZkX3dhaXRfZm9yX2NvbXBsZXRpb24oamlmZmllcyArIDJVTCAqIEhaIC8gMTAwLAotCQkJCSAgICAgICh3b3JrX2Z1bmNfdClmbG9wcHlfcmVhZHkpOworCXJldHVybiBmZF93YWl0X2Zvcl9jb21wbGV0aW9uKGppZmZpZXMgKyAyVUwgKiBIWiAvIDEwMCwgZmxvcHB5X3JlYWR5KTsKIH0JCQkJLyogZmRjX2R0ciAqLwogCiBzdGF0aWMgdm9pZCB0ZWxsX3NlY3Rvcih2b2lkKQpAQCAtMTQ0MCw3ICsxNDU0LDcgQEAKIAlpbnQgZmxhZ3M7CiAJaW50IGRmbGFnczsKIAl1bnNpZ25lZCBsb25nIHJlYWR5X2RhdGU7Ci0Jd29ya19mdW5jX3QgZnVuY3Rpb247CisJdm9pZCAoKmZ1bmN0aW9uKSh2b2lkKTsKIAogCWZsYWdzID0gcmF3X2NtZC0+ZmxhZ3M7CiAJaWYgKGZsYWdzICYgKEZEX1JBV19SRUFEIHwgRkRfUkFXX1dSSVRFKSkKQEAgLTE0NTQsOSArMTQ2OCw5IEBACiAJCSAqLwogCQlpZiAodGltZV9hZnRlcihyZWFkeV9kYXRlLCBqaWZmaWVzICsgRFAtPnNlbGVjdF9kZWxheSkpIHsKIAkJCXJlYWR5X2RhdGUgLT0gRFAtPnNlbGVjdF9kZWxheTsKLQkJCWZ1bmN0aW9uID0gKHdvcmtfZnVuY190KWZsb3BweV9zdGFydDsKKwkJCWZ1bmN0aW9uID0gZmxvcHB5X3N0YXJ0OwogCQl9IGVsc2UKLQkJCWZ1bmN0aW9uID0gKHdvcmtfZnVuY190KXNldHVwX3J3X2Zsb3BweTsKKwkJCWZ1bmN0aW9uID0gc2V0dXBfcndfZmxvcHB5OwogCiAJCS8qIHdhaXQgdW50aWwgdGhlIGZsb3BweSBpcyBzcGlubmluZyBmYXN0IGVub3VnaCAqLwogCQlpZiAoZmRfd2FpdF9mb3JfY29tcGxldGlvbihyZWFkeV9kYXRlLCBmdW5jdGlvbikpCkBAIC0xNDg2LDcgKzE1MDAsNyBAQAogCQlpbnIgPSByZXN1bHQoKTsKIAkJY29udC0+aW50ZXJydXB0KCk7CiAJfSBlbHNlIGlmIChmbGFncyAmIEZEX1JBV19ORUVEX0RJU0spCi0JCWZkX3dhdGNoZG9nKE5VTEwpOworCQlmZF93YXRjaGRvZygpOwogfQogCiBzdGF0aWMgaW50IGJsaW5kX3NlZWs7CkBAIC0xODYzLDcgKzE4NzcsNyBAQAogCiAJLyogd2FpdF9mb3JfY29tcGxldGlvbiBhbHNvIHNjaGVkdWxlcyByZXNldCBpZiBuZWVkZWQuICovCiAJcmV0dXJuIGZkX3dhaXRfZm9yX2NvbXBsZXRpb24oRFJTLT5zZWxlY3RfZGF0ZSArIERQLT5zZWxlY3RfZGVsYXksCi0JCQkJICAgICAgKHdvcmtfZnVuY190KWZ1bmN0aW9uKTsKKwkJCQkgICAgICBmdW5jdGlvbik7CiB9CiAKIHN0YXRpYyB2b2lkIGZsb3BweV9yZWFkeSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jIGIvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jCmluZGV4IDUxNjAyNjkuLjU5YzVhYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguYworKysgYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMKQEAgLTI1MiwzOCArMjUyLDQ1IEBACiAJCQkJdm9pZCAqZGF0YSwKIAkJCQlpbnQgc3RhdHVzKQogewotCXN0cnVjdCBtdGlwX2NtZCAqY29tbWFuZDsKKwlzdHJ1Y3QgbXRpcF9jbWQgKmNtZDsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRkID0gZGF0YTsKLQlpbnQgY2Jfc3RhdHVzID0gc3RhdHVzID8gLUVJTyA6IDA7CisJaW50IHVuYWxpZ25lZCwgY2Jfc3RhdHVzID0gc3RhdHVzID8gLUVJTyA6IDA7CisJdm9pZCAoKmZ1bmMpKHZvaWQgKiwgaW50KTsKIAogCWlmICh1bmxpa2VseSghZGQpIHx8IHVubGlrZWx5KCFwb3J0KSkKIAkJcmV0dXJuOwogCi0JY29tbWFuZCA9ICZwb3J0LT5jb21tYW5kc1t0YWddOworCWNtZCA9ICZwb3J0LT5jb21tYW5kc1t0YWddOwogCiAJaWYgKHVubGlrZWx5KHN0YXR1cyA9PSBQT1JUX0lSUV9URl9FUlIpKSB7CiAJCWRldl93YXJuKCZwb3J0LT5kZC0+cGRldi0+ZGV2LAogCQkJIkNvbW1hbmQgdGFnICVkIGZhaWxlZCBkdWUgdG8gVEZFXG4iLCB0YWcpOwogCX0KIAotCS8qIFVwcGVyIGxheWVyIGNhbGxiYWNrICovCi0JaWYgKGxpa2VseShjb21tYW5kLT5hc3luY19jYWxsYmFjaykpCi0JCWNvbW1hbmQtPmFzeW5jX2NhbGxiYWNrKGNvbW1hbmQtPmFzeW5jX2RhdGEsIGNiX3N0YXR1cyk7Ci0KLQljb21tYW5kLT5hc3luY19jYWxsYmFjayA9IE5VTEw7Ci0JY29tbWFuZC0+Y29tcF9mdW5jID0gTlVMTDsKLQotCS8qIFVubWFwIHRoZSBETUEgc2NhdHRlciBsaXN0IGVudHJpZXMgKi8KLQlkbWFfdW5tYXBfc2coJmRkLT5wZGV2LT5kZXYsCi0JCWNvbW1hbmQtPnNnLAotCQljb21tYW5kLT5zY2F0dGVyX2VudHMsCi0JCWNvbW1hbmQtPmRpcmVjdGlvbik7Ci0KLQkvKiBDbGVhciB0aGUgYWxsb2NhdGVkIGFuZCBhY3RpdmUgYml0cyBmb3IgdGhlIGNvbW1hbmQgKi8KKwkvKiBDbGVhciB0aGUgYWN0aXZlIGZsYWcgKi8KIAlhdG9taWNfc2V0KCZwb3J0LT5jb21tYW5kc1t0YWddLmFjdGl2ZSwgMCk7Ci0JcmVsZWFzZV9zbG90KHBvcnQsIHRhZyk7CiAKLQl1cCgmcG9ydC0+Y21kX3Nsb3QpOworCS8qIFVwcGVyIGxheWVyIGNhbGxiYWNrICovCisJZnVuYyA9IGNtZC0+YXN5bmNfY2FsbGJhY2s7CisJaWYgKGxpa2VseShmdW5jICYmIGNtcHhjaGcoJmNtZC0+YXN5bmNfY2FsbGJhY2ssIGZ1bmMsIDApID09IGZ1bmMpKSB7CisKKwkJLyogVW5tYXAgdGhlIERNQSBzY2F0dGVyIGxpc3QgZW50cmllcyAqLworCQlkbWFfdW5tYXBfc2coJmRkLT5wZGV2LT5kZXYsCisJCQljbWQtPnNnLAorCQkJY21kLT5zY2F0dGVyX2VudHMsCisJCQljbWQtPmRpcmVjdGlvbik7CisKKwkJZnVuYyhjbWQtPmFzeW5jX2RhdGEsIGNiX3N0YXR1cyk7CisJCXVuYWxpZ25lZCA9IGNtZC0+dW5hbGlnbmVkOworCisJCS8qIENsZWFyIHRoZSBhbGxvY2F0ZWQgYml0IGZvciB0aGUgY29tbWFuZCAqLworCQlyZWxlYXNlX3Nsb3QocG9ydCwgdGFnKTsKKworCQlpZiAodW5saWtlbHkodW5hbGlnbmVkKSkKKwkJCXVwKCZwb3J0LT5jbWRfc2xvdF91bmFsKTsKKwkJZWxzZQorCQkJdXAoJnBvcnQtPmNtZF9zbG90KTsKKwl9CiB9CiAKIC8qCkBAIC02NjAsMTEgKzY2NywxMiBAQAogewogCXN0cnVjdCBtdGlwX3BvcnQgKnBvcnQgPSAoc3RydWN0IG10aXBfcG9ydCAqKSBkYXRhOwogCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmZpczsKLQlzdHJ1Y3QgbXRpcF9jbWQgKmNvbW1hbmQ7Ci0JaW50IHRhZywgY21kdG9fY250ID0gMDsKKwlzdHJ1Y3QgbXRpcF9jbWQgKmNtZDsKKwlpbnQgdW5hbGlnbmVkLCB0YWcsIGNtZHRvX2NudCA9IDA7CiAJdW5zaWduZWQgaW50IGJpdCwgZ3JvdXA7CiAJdW5zaWduZWQgaW50IG51bV9jb21tYW5kX3Nsb3RzOwogCXVuc2lnbmVkIGxvbmcgdG8sIHRhZ2FjY3VtW1NMT1RCSVRTX0lOX0xPTkdTXTsKKwl2b2lkICgqZnVuYykodm9pZCAqLCBpbnQpOwogCiAJaWYgKHVubGlrZWx5KCFwb3J0KSkKIAkJcmV0dXJuOwpAQCAtNjk0LDggKzcwMiw4IEBACiAJCQlncm91cCA9IHRhZyA+PiA1OwogCQkJYml0ID0gdGFnICYgMHgxRjsKIAotCQkJY29tbWFuZCA9ICZwb3J0LT5jb21tYW5kc1t0YWddOwotCQkJZmlzID0gKHN0cnVjdCBob3N0X3RvX2Rldl9maXMgKikgY29tbWFuZC0+Y29tbWFuZDsKKwkJCWNtZCA9ICZwb3J0LT5jb21tYW5kc1t0YWddOworCQkJZmlzID0gKHN0cnVjdCBob3N0X3RvX2Rldl9maXMgKikgY21kLT5jb21tYW5kOwogCiAJCQlzZXRfYml0KHRhZywgdGFnYWNjdW0pOwogCQkJY21kdG9fY250Kys7CkBAIC03MDksMjcgKzcxNywzMCBAQAogCQkJICovCiAJCQl3cml0ZWwoMSA8PCBiaXQsIHBvcnQtPmNvbXBsZXRlZFtncm91cF0pOwogCi0JCQkvKiBDYWxsIHRoZSBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrLiAqLwotCQkJaWYgKGxpa2VseShjb21tYW5kLT5hc3luY19jYWxsYmFjaykpCi0JCQkJY29tbWFuZC0+YXN5bmNfY2FsbGJhY2soY29tbWFuZC0+YXN5bmNfZGF0YSwKLQkJCQkJCQkgLUVJTyk7Ci0JCQljb21tYW5kLT5hc3luY19jYWxsYmFjayA9IE5VTEw7Ci0JCQljb21tYW5kLT5jb21wX2Z1bmMgPSBOVUxMOwotCi0JCQkvKiBVbm1hcCB0aGUgRE1BIHNjYXR0ZXIgbGlzdCBlbnRyaWVzICovCi0JCQlkbWFfdW5tYXBfc2coJnBvcnQtPmRkLT5wZGV2LT5kZXYsCi0JCQkJCWNvbW1hbmQtPnNnLAotCQkJCQljb21tYW5kLT5zY2F0dGVyX2VudHMsCi0JCQkJCWNvbW1hbmQtPmRpcmVjdGlvbik7Ci0KLQkJCS8qCi0JCQkgKiBDbGVhciB0aGUgYWxsb2NhdGVkIGJpdCBhbmQgYWN0aXZlIHRhZyBmb3IgdGhlCi0JCQkgKiBjb21tYW5kLgotCQkJICovCisJCQkvKiBDbGVhciB0aGUgYWN0aXZlIGZsYWcgZm9yIHRoZSBjb21tYW5kICovCiAJCQlhdG9taWNfc2V0KCZwb3J0LT5jb21tYW5kc1t0YWddLmFjdGl2ZSwgMCk7Ci0JCQlyZWxlYXNlX3Nsb3QocG9ydCwgdGFnKTsKIAotCQkJdXAoJnBvcnQtPmNtZF9zbG90KTsKKwkJCWZ1bmMgPSBjbWQtPmFzeW5jX2NhbGxiYWNrOworCQkJaWYgKGZ1bmMgJiYKKwkJCSAgICBjbXB4Y2hnKCZjbWQtPmFzeW5jX2NhbGxiYWNrLCBmdW5jLCAwKSA9PSBmdW5jKSB7CisKKwkJCQkvKiBVbm1hcCB0aGUgRE1BIHNjYXR0ZXIgbGlzdCBlbnRyaWVzICovCisJCQkJZG1hX3VubWFwX3NnKCZwb3J0LT5kZC0+cGRldi0+ZGV2LAorCQkJCQkJY21kLT5zZywKKwkJCQkJCWNtZC0+c2NhdHRlcl9lbnRzLAorCQkJCQkJY21kLT5kaXJlY3Rpb24pOworCisJCQkJZnVuYyhjbWQtPmFzeW5jX2RhdGEsIC1FSU8pOworCQkJCXVuYWxpZ25lZCA9IGNtZC0+dW5hbGlnbmVkOworCisJCQkJLyogQ2xlYXIgdGhlIGFsbG9jYXRlZCBiaXQgZm9yIHRoZSBjb21tYW5kLiAqLworCQkJCXJlbGVhc2Vfc2xvdChwb3J0LCB0YWcpOworCisJCQkJaWYgKHVuYWxpZ25lZCkKKwkJCQkJdXAoJnBvcnQtPmNtZF9zbG90X3VuYWwpOworCQkJCWVsc2UKKwkJCQkJdXAoJnBvcnQtPmNtZF9zbG90KTsKKwkJCX0KIAkJfQogCX0KIApAQCAtNDIxMyw2ICs0MjI0LDcgQEAKIAlibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMoZGQtPnF1ZXVlLCAweGZmZmYpOwogCWJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKGRkLT5xdWV1ZSwgMHg0MDAwMDApOwogCWJsa19xdWV1ZV9pb19taW4oZGQtPnF1ZXVlLCA0MDk2KTsKKwlibGtfcXVldWVfYm91bmNlX2xpbWl0KGRkLT5xdWV1ZSwgZGQtPnBkZXYtPmRtYV9tYXNrKTsKIAogCS8qCiAJICogd3JpdGUgYmFjayBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBkZXZpY2UuIEZVQSBkZXBlbmRzIG9uCkBAIC00NDk4LDcgKzQ1MTAsNyBAQAogCX0KIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTlVNQSBub2RlICVkIChjbG9zZXN0OiAlZCwlZCwgcHJvYmUgb24gJWQ6JWQpXG4iLAogCQlteV9ub2RlLCBwY2lidXNfdG9fbm9kZShwZGV2LT5idXMpLCBkZXZfdG9fbm9kZSgmcGRldi0+ZGV2KSwKLQkJY3B1X3RvX25vZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJY3B1X3RvX25vZGUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSksIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJZGQgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBkcml2ZXJfZGF0YSksIEdGUF9LRVJORUwsIG15X25vZGUpOwogCWlmIChkZCA9PSBOVUxMKSB7CkBAIC00NjE1LDcgKzQ2MjcsNyBAQAogCWlmIChydikgewogCQlkZXZfd2FybigmcGRldi0+ZGV2LAogCQkJIlVuYWJsZSB0byBlbmFibGUgTVNJIGludGVycnVwdC5cbiIpOwotCQlnb3RvIGJsb2NrX2luaXRpYWxpemVfZXJyOworCQlnb3RvIG1zaV9pbml0aWFsaXplX2VycjsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSBibG9jayBsYXllci4gKi8KQEAgLTQ2NDUsNiArNDY1Nyw4IEBACiAKIGJsb2NrX2luaXRpYWxpemVfZXJyOgogCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKworbXNpX2luaXRpYWxpemVfZXJyOgogCWlmIChkZC0+aXNyX3dvcmtxKSB7CiAJCWZsdXNoX3dvcmtxdWV1ZShkZC0+aXNyX3dvcmtxKTsKIAkJZGVzdHJveV93b3JrcXVldWUoZGQtPmlzcl93b3JrcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmggYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmgKaW5kZXggNTQxNzRjYi4uZmZiOTU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5oCisrKyBiL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguaApAQCAtOTIsNyArOTIsNyBAQAogCiAvKiBEcml2ZXIgbmFtZSBhbmQgdmVyc2lvbiBzdHJpbmdzICovCiAjZGVmaW5lIE1USVBfRFJWX05BTUUJCSJtdGlwMzJ4eCIKLSNkZWZpbmUgTVRJUF9EUlZfVkVSU0lPTgkiMS4zLjAiCisjZGVmaW5lIE1USVBfRFJWX1ZFUlNJT04JIjEuMy4xIgogCiAvKiBNYXhpbXVtIG51bWJlciBvZiBtaW5vciBkZXZpY2UgbnVtYmVycyBwZXIgZGV2aWNlLiAqLwogI2RlZmluZSBNVElQX01BWF9NSU5PUlMJCTE2CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jIGIvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYwppbmRleCA1MTgyNGQxLi5kYTA4NWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jCisrKyBiL2RyaXZlcnMvYmxvY2svbnZtZS1jb3JlLmMKQEAgLTk5Myw3ICs5OTMsNyBAQAogCQlkZXZfd2FybigmZGV2LT5wY2lfZGV2LT5kZXYsCiAJCQkiSS9PICVkIFFJRCAlZCB0aW1lb3V0LCByZXNldCBjb250cm9sbGVyXG4iLCBjbWRpZCwKIAkJCQkJCQkJbnZtZXEtPnFpZCk7Ci0JCVBSRVBBUkVfV09SSygmZGV2LT5yZXNldF93b3JrLCBudm1lX3Jlc2V0X2ZhaWxlZF9kZXYpOworCQlkZXYtPnJlc2V0X3dvcmtmbiA9IG52bWVfcmVzZXRfZmFpbGVkX2RldjsKIAkJcXVldWVfd29yayhudm1lX3dvcmtxLCAmZGV2LT5yZXNldF93b3JrKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2OTYsOCArMTY5Niw3IEBACiAJCQkJbGlzdF9kZWxfaW5pdCgmZGV2LT5ub2RlKTsKIAkJCQlkZXZfd2FybigmZGV2LT5wY2lfZGV2LT5kZXYsCiAJCQkJCSJGYWlsZWQgc3RhdHVzLCByZXNldCBjb250cm9sbGVyXG4iKTsKLQkJCQlQUkVQQVJFX1dPUksoJmRldi0+cmVzZXRfd29yaywKLQkJCQkJCQludm1lX3Jlc2V0X2ZhaWxlZF9kZXYpOworCQkJCWRldi0+cmVzZXRfd29ya2ZuID0gbnZtZV9yZXNldF9mYWlsZWRfZGV2OwogCQkJCXF1ZXVlX3dvcmsobnZtZV93b3JrcSwgJmRldi0+cmVzZXRfd29yayk7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0xODM3LDMxICsxODM2LDE2IEBACiAJLyogRGVyZWdpc3RlciB0aGUgYWRtaW4gcXVldWUncyBpbnRlcnJ1cHQgKi8KIAlmcmVlX2lycShkZXYtPmVudHJ5WzBdLnZlY3RvciwgYWRtaW5xKTsKIAotCXZlY3MgPSBucl9pb19xdWV1ZXM7Ci0JZm9yIChpID0gMDsgaSA8IHZlY3M7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9fcXVldWVzOyBpKyspCiAJCWRldi0+ZW50cnlbaV0uZW50cnkgPSBpOwotCWZvciAoOzspIHsKLQkJcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGRldi0+ZW50cnksIHZlY3MpOwotCQlpZiAocmVzdWx0IDw9IDApCi0JCQlicmVhazsKLQkJdmVjcyA9IHJlc3VsdDsKLQl9Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotCQl2ZWNzID0gbnJfaW9fcXVldWVzOwotCQlpZiAodmVjcyA+IDMyKQotCQkJdmVjcyA9IDMyOwotCQlmb3IgKDs7KSB7Ci0JCQlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaV9ibG9jayhwZGV2LCB2ZWNzKTsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCB2ZWNzOyBpKyspCi0JCQkJCWRldi0+ZW50cnlbaV0udmVjdG9yID0gaSArIHBkZXYtPmlycTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAocmVzdWx0IDwgMCkgewotCQkJCXZlY3MgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdmVjcyA9IHJlc3VsdDsKKwl2ZWNzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIGRldi0+ZW50cnksIDEsIG5yX2lvX3F1ZXVlcyk7CisJaWYgKHZlY3MgPCAwKSB7CisJCXZlY3MgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCBtaW4obnJfaW9fcXVldWVzLCAzMikpOworCQlpZiAodmVjcyA8IDApIHsKKwkJCXZlY3MgPSAxOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IHZlY3M7IGkrKykKKwkJCQlkZXYtPmVudHJ5W2ldLnZlY3RvciA9IGkgKyBwZGV2LT5pcnE7CiAJCX0KIAl9CiAKQEAgLTI0MDYsNyArMjM5MCw3IEBACiAJCXJldHVybiByZXQ7CiAJaWYgKHJldCA9PSAtRUJVU1kpIHsKIAkJc3Bpbl9sb2NrKCZkZXZfbGlzdF9sb2NrKTsKLQkJUFJFUEFSRV9XT1JLKCZkZXYtPnJlc2V0X3dvcmssIG52bWVfcmVtb3ZlX2Rpc2tzKTsKKwkJZGV2LT5yZXNldF93b3JrZm4gPSBudm1lX3JlbW92ZV9kaXNrczsKIAkJcXVldWVfd29yayhudm1lX3dvcmtxLCAmZGV2LT5yZXNldF93b3JrKTsKIAkJc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOwogCX0KQEAgLTI0MzUsNiArMjQxOSwxMiBAQAogCW52bWVfZGV2X3Jlc2V0KGRldik7CiB9CiAKK3N0YXRpYyB2b2lkIG52bWVfcmVzZXRfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbnZtZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbnZtZV9kZXYsIHJlc2V0X3dvcmspOworCWRldi0+cmVzZXRfd29ya2ZuKHdvcmspOworfQorCiBzdGF0aWMgaW50IG52bWVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmVzdWx0ID0gLUVOT01FTTsKQEAgLTI0NTMsNyArMjQ0Myw4IEBACiAJCWdvdG8gZnJlZTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPm5hbWVzcGFjZXMpOwotCUlOSVRfV09SSygmZGV2LT5yZXNldF93b3JrLCBudm1lX3Jlc2V0X2ZhaWxlZF9kZXYpOworCWRldi0+cmVzZXRfd29ya2ZuID0gbnZtZV9yZXNldF9mYWlsZWRfZGV2OworCUlOSVRfV09SSygmZGV2LT5yZXNldF93b3JrLCBudm1lX3Jlc2V0X3dvcmtmbik7CiAJZGV2LT5wY2lfZGV2ID0gcGRldjsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAlyZXN1bHQgPSBudm1lX3NldF9pbnN0YW5jZShkZXYpOwpAQCAtMjU1Myw3ICsyNTQ0LDcgQEAKIAlzdHJ1Y3QgbnZtZV9kZXYgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKIAlpZiAobnZtZV9kZXZfcmVzdW1lKG5kZXYpICYmICF3b3JrX2J1c3koJm5kZXYtPnJlc2V0X3dvcmspKSB7Ci0JCVBSRVBBUkVfV09SSygmbmRldi0+cmVzZXRfd29yaywgbnZtZV9yZXNldF9mYWlsZWRfZGV2KTsKKwkJbmRldi0+cmVzZXRfd29ya2ZuID0gbnZtZV9yZXNldF9mYWlsZWRfZGV2OwogCQlxdWV1ZV93b3JrKG52bWVfd29ya3EsICZuZGV2LT5yZXNldF93b3JrKTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JiZC5jIGIvZHJpdmVycy9ibG9jay9yYmQuYwppbmRleCBiMzY1ZTBkLi4zNDg5OGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JiZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcmJkLmMKQEAgLTIxMDksNyArMjEwOSw2IEBACiAJcmJkX2Fzc2VydChpbWdfcmVxdWVzdC0+b2JqX3JlcXVlc3RfY291bnQgPiAwKTsKIAlyYmRfYXNzZXJ0KHdoaWNoICE9IEJBRF9XSElDSCk7CiAJcmJkX2Fzc2VydCh3aGljaCA8IGltZ19yZXF1ZXN0LT5vYmpfcmVxdWVzdF9jb3VudCk7Ci0JcmJkX2Fzc2VydCh3aGljaCA+PSBpbWdfcmVxdWVzdC0+bmV4dF9jb21wbGV0aW9uKTsKIAogCXNwaW5fbG9ja19pcnEoJmltZ19yZXF1ZXN0LT5jb21wbGV0aW9uX2xvY2spOwogCWlmICh3aGljaCAhPSBpbWdfcmVxdWVzdC0+bmV4dF9jb21wbGV0aW9uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9za2RfbWFpbi5jIGIvZHJpdmVycy9ibG9jay9za2RfbWFpbi5jCmluZGV4IGViNmUxZTBlLi5hNjlkZDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3NrZF9tYWluLmMKKysrIGIvZHJpdmVycy9ibG9jay9za2RfbWFpbi5jCkBAIC0zOTEwLDE4ICszOTEwLDIyIEBACiAJc3RydWN0IHNrZF9tc2l4X2VudHJ5ICpxZW50cnk7CiAJaW50IGk7CiAKLQlpZiAoc2tkZXYtPm1zaXhfZW50cmllcyA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZm9yIChpID0gMDsgaSA8IHNrZGV2LT5tc2l4X2NvdW50OyBpKyspIHsKLQkJcWVudHJ5ID0gJnNrZGV2LT5tc2l4X2VudHJpZXNbaV07Ci0JCXNrZGV2ID0gcWVudHJ5LT5yc3A7CisJaWYgKHNrZGV2LT5tc2l4X2VudHJpZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNrZGV2LT5tc2l4X2NvdW50OyBpKyspIHsKKwkJCXFlbnRyeSA9ICZza2Rldi0+bXNpeF9lbnRyaWVzW2ldOworCQkJc2tkZXYgPSBxZW50cnktPnJzcDsKIAotCQlpZiAocWVudHJ5LT5oYXZlX2lycSkKLQkJCWRldm1fZnJlZV9pcnEoJnNrZGV2LT5wZGV2LT5kZXYsCi0JCQkJICAgICAgcWVudHJ5LT52ZWN0b3IsIHFlbnRyeS0+cnNwKTsKKwkJCWlmIChxZW50cnktPmhhdmVfaXJxKQorCQkJCWRldm1fZnJlZV9pcnEoJnNrZGV2LT5wZGV2LT5kZXYsCisJCQkJCSAgICAgIHFlbnRyeS0+dmVjdG9yLCBxZW50cnktPnJzcCk7CisJCX0KKworCQlrZnJlZShza2Rldi0+bXNpeF9lbnRyaWVzKTsKIAl9Ci0JcGNpX2Rpc2FibGVfbXNpeChza2Rldi0+cGRldik7Ci0Ja2ZyZWUoc2tkZXYtPm1zaXhfZW50cmllcyk7CisKKwlpZiAoc2tkZXYtPm1zaXhfY291bnQpCisJCXBjaV9kaXNhYmxlX21zaXgoc2tkZXYtPnBkZXYpOworCiAJc2tkZXYtPm1zaXhfY291bnQgPSAwOwogCXNrZGV2LT5tc2l4X2VudHJpZXMgPSBOVUxMOwogfQpAQCAtMzkyOSwxMiArMzkzMywxMCBAQAogc3RhdGljIGludCBza2RfYWNxdWlyZV9tc2l4KHN0cnVjdCBza2RfZGV2aWNlICpza2RldikKIHsKIAlpbnQgaSwgcmM7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2tkZXYtPnBkZXY7CisJc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXM7CiAJc3RydWN0IHNrZF9tc2l4X2VudHJ5ICpxZW50cnk7CiAKLQlwZGV2ID0gc2tkZXYtPnBkZXY7Ci0Jc2tkZXYtPm1zaXhfY291bnQgPSBTS0RfTUFYX01TSVhfQ09VTlQ7CiAJZW50cmllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSAqIFNLRF9NQVhfTVNJWF9DT1VOVCwKIAkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyaWVzKQpAQCAtMzk0Myw0MCArMzk0NSwyNiBAQAogCWZvciAoaSA9IDA7IGkgPCBTS0RfTUFYX01TSVhfQ09VTlQ7IGkrKykKIAkJZW50cmllc1tpXS5lbnRyeSA9IGk7CiAKLQlyYyA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCBlbnRyaWVzLCBTS0RfTUFYX01TSVhfQ09VTlQpOwotCWlmIChyYyA8IDApCisJcmMgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UocGRldiwgZW50cmllcywKKwkJCQkgICBTS0RfTUlOX01TSVhfQ09VTlQsIFNLRF9NQVhfTVNJWF9DT1VOVCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiglcyk6IGZhaWxlZCB0byBlbmFibGUgTVNJLVggJWRcbiIsCisJCSAgICAgICBza2RfbmFtZShza2RldiksIHJjKTsKIAkJZ290byBtc2l4X291dDsKLQlpZiAocmMpIHsKLQkJaWYgKHJjIDwgU0tEX01JTl9NU0lYX0NPVU5UKSB7Ci0JCQlwcl9lcnIoIiglcyk6IGZhaWxlZCB0byBlbmFibGUgTVNJLVggJWRcbiIsCi0JCQkgICAgICAgc2tkX25hbWUoc2tkZXYpLCByYyk7Ci0JCQlnb3RvIG1zaXhfb3V0OwotCQl9Ci0JCXByX2RlYnVnKCIlczolczolZCAlczogPCVzPiBhbGxvY2F0ZWQgJWQgTVNJLVggdmVjdG9yc1xuIiwKLQkJCSBza2Rldi0+bmFtZSwgX19mdW5jX18sIF9fTElORV9fLAotCQkJIHBjaV9uYW1lKHBkZXYpLCBza2Rldi0+bmFtZSwgcmMpOwotCi0JCXNrZGV2LT5tc2l4X2NvdW50ID0gcmM7Ci0JCXJjID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGVudHJpZXMsIHNrZGV2LT5tc2l4X2NvdW50KTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiglcyk6IGZhaWxlZCB0byBlbmFibGUgTVNJLVggIgotCQkJICAgICAgICJzdXBwb3J0ICglZCkgJWRcbiIsCi0JCQkgICAgICAgc2tkX25hbWUoc2tkZXYpLCBza2Rldi0+bXNpeF9jb3VudCwgcmMpOwotCQkJZ290byBtc2l4X291dDsKLQkJfQogCX0KKworCXNrZGV2LT5tc2l4X2NvdW50ID0gcmM7CiAJc2tkZXYtPm1zaXhfZW50cmllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBza2RfbXNpeF9lbnRyeSkgKgogCQkJCSAgICAgIHNrZGV2LT5tc2l4X2NvdW50LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrZGV2LT5tc2l4X2VudHJpZXMpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQlza2Rldi0+bXNpeF9jb3VudCA9IDA7CiAJCXByX2VycigiKCVzKTogbXNpeCB0YWJsZSBhbGxvY2F0aW9uIGVycm9yXG4iLAogCQkgICAgICAgc2tkX25hbWUoc2tkZXYpKTsKIAkJZ290byBtc2l4X291dDsKIAl9CiAKLQlxZW50cnkgPSBza2Rldi0+bXNpeF9lbnRyaWVzOwogCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7CisJCXFlbnRyeSA9ICZza2Rldi0+bXNpeF9lbnRyaWVzW2ldOwogCQlxZW50cnktPnZlY3RvciA9IGVudHJpZXNbaV0udmVjdG9yOwogCQlxZW50cnktPmVudHJ5ID0gZW50cmllc1tpXS5lbnRyeTsKIAkJcWVudHJ5LT5yc3AgPSBOVUxMOwpAQCAtMzk4NSwxMSArMzk3MywxMCBAQAogCQkJIHNrZGV2LT5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQkgcGNpX25hbWUocGRldiksIHNrZGV2LT5uYW1lLAogCQkJIGksIHFlbnRyeS0+dmVjdG9yLCBxZW50cnktPmVudHJ5KTsKLQkJcWVudHJ5Kys7CiAJfQogCiAJLyogRW5hYmxlIE1TSS1YIHZlY3RvcnMgZm9yIHRoZSBiYXNlIHF1ZXVlICovCi0JZm9yIChpID0gMDsgaSA8IFNLRF9NQVhfTVNJWF9DT1VOVDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNrZGV2LT5tc2l4X2NvdW50OyBpKyspIHsKIAkJcWVudHJ5ID0gJnNrZGV2LT5tc2l4X2VudHJpZXNbaV07CiAJCXNucHJpbnRmKHFlbnRyeS0+aXNyX25hbWUsIHNpemVvZihxZW50cnktPmlzcl9uYW1lKSwKIAkJCSAiJXMlZC1tc2l4ICVzIiwgRFJWX05BTUUsIHNrZGV2LT5kZXZubywKQEAgLTQwNDUsOCArNDAzMiw4IEBACiAJY2FzZSBTS0RfSVJRX01TSToKIAkJc25wcmludGYoc2tkZXYtPmlzcl9uYW1lLCBzaXplb2Yoc2tkZXYtPmlzcl9uYW1lKSwgIiVzJWQtbXNpIiwKIAkJCSBEUlZfTkFNRSwgc2tkZXYtPmRldm5vKTsKLQkJcmMgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKLQkJaWYgKCFyYykgeworCQlyYyA9IHBjaV9lbmFibGVfbXNpX3JhbmdlKHBkZXYsIDEsIDEpOworCQlpZiAocmMgPiAwKSB7CiAJCQlyYyA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcGRldi0+aXJxLCBza2RfaXNyLCAwLAogCQkJCQkgICAgICBza2Rldi0+aXNyX25hbWUsIHNrZGV2KTsKIAkJCWlmIChyYykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zd2ltMy5jIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCmluZGV4IDIwZTA2MWMzLi5jNzRmN2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKKysrIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGJkbWEuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtODQwLDE0ICs4NDEsMTcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCWlmIChmcy0+c3RhdGUgIT0gaWRsZSAmJiBmcy0+c3RhdGUgIT0gYXZhaWxhYmxlKSB7CiAJCSsrZnMtPndhbnRlZDsKLQkJd2hpbGUgKGZzLT5zdGF0ZSAhPSBhdmFpbGFibGUpIHsKKwkJLyogdGhpcyB3aWxsIGVuYWJsZSBpcnFzIGluIG9yZGVyIHRvIHNsZWVwICovCisJCWlmICghaW50ZXJydXB0aWJsZSkKKwkJCXdhaXRfZXZlbnRfbG9ja19pcnEoZnMtPndhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMtPnN0YXRlID09IGF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2ltM19sb2NrKTsKKwkJZWxzZSBpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2xvY2tfaXJxKGZzLT53YWl0LAorCQkJCQlmcy0+c3RhdGUgPT0gYXZhaWxhYmxlLAorCQkJCQlzd2ltM19sb2NrKSkgeworCQkJLS1mcy0+d2FudGVkOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGludGVycnVwdGlibGUgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQktLWZzLT53YW50ZWQ7Ci0JCQkJcmV0dXJuIC1FSU5UUjsKLQkJCX0KLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmZzLT53YWl0KTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzd2ltM19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVJTlRSOwogCQl9CiAJCS0tZnMtPndhbnRlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCmluZGV4IGIxY2IzZjQuLjBlYWNlNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCkBAIC00OTAsMTMgKzQ5MCwxNCBAQAogCS5mbGFncwkJPSBCTEtfTVFfRl9TSE9VTERfTUVSR0UsCiB9OwogCi1zdGF0aWMgdm9pZCB2aXJ0YmxrX2luaXRfdmJyKHZvaWQgKmRhdGEsIHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAorc3RhdGljIGludCB2aXJ0YmxrX2luaXRfdmJyKHZvaWQgKmRhdGEsIHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAogCQkJICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHVuc2lnbmVkIGludCBucikKIHsKIAlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsayA9IGRhdGE7CiAJc3RydWN0IHZpcnRibGtfcmVxICp2YnIgPSBycS0+c3BlY2lhbDsKIAogCXNnX2luaXRfdGFibGUodmJyLT5zZywgdmJsay0+c2dfZWxlbXMpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpcnRibGtfcHJvYmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2J1cy9tdmVidS1tYnVzLmMgYi9kcml2ZXJzL2J1cy9tdmVidS1tYnVzLmMKaW5kZXggNzI1YzQ2MS4uMmFjNzU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9idXMvbXZlYnUtbWJ1cy5jCisrKyBiL2RyaXZlcnMvYnVzL212ZWJ1LW1idXMuYwpAQCAtODcwLDE0ICs4NzAsMTQgQEAKIAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwgInBjaWUtbWVtLWFwZXJ0dXJlIiwgcmVnLCBBUlJBWV9TSVpFKHJlZykpOwogCWlmICghcmV0KSB7CiAJCW1lbS0+c3RhcnQgPSByZWdbMF07Ci0JCW1lbS0+ZW5kID0gbWVtLT5zdGFydCArIHJlZ1sxXTsKKwkJbWVtLT5lbmQgPSBtZW0tPnN0YXJ0ICsgcmVnWzFdIC0gMTsKIAkJbWVtLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwogCX0KIAogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5wLCAicGNpZS1pby1hcGVydHVyZSIsIHJlZywgQVJSQVlfU0laRShyZWcpKTsKIAlpZiAoIXJldCkgewogCQlpby0+c3RhcnQgPSByZWdbMF07Ci0JCWlvLT5lbmQgPSBpby0+c3RhcnQgKyByZWdbMV07CisJCWlvLT5lbmQgPSBpby0+c3RhcnQgKyByZWdbMV0gLSAxOwogCQlpby0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwppbmRleCAxYjE5MjM5Li44MTIxYjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9hZ3BnYXJ0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCmluZGV4IGYzOTQzN2EuLjBmYmNjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCkBAIC0yOSw3ICsyOSw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKaW5kZXggNWM4NTM1MC4uOWEwMjRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCkBAIC0xNyw3ICsxNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCmluZGV4IDA1YjhkMDIuLjMwNTFjNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgogI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgogI2luY2x1ZGUgPGFzbS9zbi9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9iY20yODM1LXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9iY20yODM1LXJuZy5jCmluZGV4IDQzNTc3Y2EuLjhjM2IyNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtMjgzNS1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2JjbTI4MzUtcm5nLmMKQEAgLTgsNyArOCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2h3X3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYwppbmRleCBhMGY3NzI0Li5iOTQ5NWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2V4eW5vcy1ybmcuYwppbmRleCA0MDJjY2ZiLi45ZjgyNzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2V4eW5vcy1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2V4eW5vcy1ybmcuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2h3X3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKaW5kZXggZjliZWVkNS4uNDMyMjMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbm9tYWRpay1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbm9tYWRpay1ybmcuYwppbmRleCAyMzJiODdmLi4wMGU5ZDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9ub21hZGlrLXJuZy5jCkBAIC0xMCw3ICsxMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vY3Rlb24tcm5nLmMKaW5kZXggZjI4ODVkYi4uYjVjYzM0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vY3Rlb24tcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vY3Rlb24tcm5nLmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3X3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwppbmRleCAwM2Y0MTg5Li5iN2VmZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtNjEsNyArNjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDkyYzU5MzcuLjkxNzQwM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTk5LDYgKzk5LDkgQEAKIAlzc2l6ZV90IHJlYWQsIHN6OwogCWNoYXIgKnB0cjsKIAorCWlmIChwICE9ICpwcG9zKQorCQlyZXR1cm4gMDsKKwogCWlmICghdmFsaWRfcGh5c19hZGRyX3JhbmdlKHAsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmVhZCA9IDA7CkBAIC0xNTcsNiArMTYwLDkgQEAKIAl1bnNpZ25lZCBsb25nIGNvcGllZDsKIAl2b2lkICpwdHI7CiAKKwlpZiAocCAhPSAqcHBvcykKKwkJcmV0dXJuIC1FRkJJRzsKKwogCWlmICghdmFsaWRfcGh5c19hZGRyX3JhbmdlKHAsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKaW5kZXggODgxYzllNS4uMjg3NDAwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKKysrIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBjb25kX3Jlc2NoZWQoKSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKaW5kZXggMGU1MDZiYS4uYmQzNzc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCisrKyBiL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYwpAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyoga21hbGxvYygpICovCiAjaW5jbHVkZSA8bGludXgvZnMuaD4JCS8qIGV2ZXJ5dGhpbmcuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX2luZmluZW9uLmMKaW5kZXggNTJiOWIyYi4uNDcyYWY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX2luZmluZW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX2luZmluZW9uLmMKQEAgLTIxLDcgKzIxLDYgQEAKICAqCiAgKgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX3N0bV9zdDMzLmMKaW5kZXggNWIwZGQ4ZS4uM2I3YmYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX3N0bV9zdDMzLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX3N0bV9zdDMzLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCmluZGV4IGNkNjk1MGYuLjUyZTkzMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKQEAgLTE0MCwzICsxNDAsNTEgQEAKIAlib29sCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgUGVyaW9kIEludGVycnVwdCBUaW1lciBvbiBGcmVlc2NhbGUgVnlicmlkIEZhbWlseSBTb0NzLgorCitjb25maWcgU1lTX1NVUFBPUlRTX1NIX0NNVAorICAgICAgICBib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfU0hfTVRVMgorICAgICAgICBib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfU0hfVE1VCisgICAgICAgIGJvb2wKKworY29uZmlnIFNZU19TVVBQT1JUU19FTV9TVEkKKyAgICAgICAgYm9vbAorCitjb25maWcgU0hfVElNRVJfQ01UCisJYm9vbCAiUmVuZXNhcyBDTVQgdGltZXIgZHJpdmVyIiBpZiBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZhdWx0IFNZU19TVVBQT1JUU19TSF9DTVQKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgYSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCBkcml2ZXIgZm9yCisJICB0aGUgQ29tcGFyZSBNYXRjaCBUaW1lciAoQ01UKSBoYXJkd2FyZSBhdmFpbGFibGUgaW4gMTYvMzIvNDgtYml0CisJICB2YXJpYW50cyBvbiBhIHdpZGUgcmFuZ2Ugb2YgTW9iaWxlIGFuZCBBdXRvbW90aXZlIFNvQ3MgZnJvbSBSZW5lc2FzLgorCitjb25maWcgU0hfVElNRVJfTVRVMgorCWJvb2wgIlJlbmVzYXMgTVRVMiB0aW1lciBkcml2ZXIiIGlmIENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gR0VORVJJQ19DTE9DS0VWRU5UUworCWRlZmF1bHQgU1lTX1NVUFBPUlRTX1NIX01UVTIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgYSBjbG9ja2V2ZW50IGRyaXZlciBmb3IgdGhlIE11bHRpLUZ1bmN0aW9uCisJICBUaW1lciBQdWxzZSBVbml0IDIgKFRNVTIpIGhhcmR3YXJlIGF2YWlsYWJsZSBvbiBTb0NzIGZyb20gUmVuZXNhcy4KKwkgIFRoaXMgaGFyZHdhcmUgY29tZXMgd2l0aCAxNiBiaXQtdGltZXIgcmVnaXN0ZXJzLgorCitjb25maWcgU0hfVElNRVJfVE1VCisJYm9vbCAiUmVuZXNhcyBUTVUgdGltZXIgZHJpdmVyIiBpZiBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZhdWx0IFNZU19TVVBQT1JUU19TSF9UTVUKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgYSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCBkcml2ZXIgZm9yCisJICB0aGUgMzItYml0IFRpbWVyIFVuaXQgKFRNVSkgaGFyZHdhcmUgYXZhaWxhYmxlIG9uIGEgd2lkZSByYW5nZQorCSAgU29DcyBmcm9tIFJlbmVzYXMuCisKK2NvbmZpZyBFTV9USU1FUl9TVEkKKwlib29sICJSZW5lc2FzIFNUSSB0aW1lciBkcml2ZXIiIGlmIENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gR0VORVJJQ19DTE9DS0VWRU5UUworCWRlZmF1bHQgU1lTX1NVUFBPUlRTX0VNX1NUSQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiBhIGNsb2Nrc291cmNlIGFuZCBjbG9ja2V2ZW50IGRyaXZlciBmb3IKKwkgIHRoZSA0OC1iaXQgU3lzdGVtIFRpbWVyIChTVEkpIGhhcmR3YXJlIGF2YWlsYWJsZSBvbiBhIFNvQ3MKKwkgIHN1Y2ggYXMgRU1FVjIgZnJvbSBmb3JtZXIgTkVDIEVsZWN0cm9uaWNzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKaW5kZXggYzdjYTUwYS4uZjNmZTRjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCkBAIC0xLDYgKzEsNSBAQAogb2JqLSQoQ09ORklHX0NMS1NSQ19PRikJKz0gY2xrc3JjLW9mLm8KIG9iai0kKENPTkZJR19BVE1FTF9UQ0JfQ0xLU1JDKQkrPSB0Y2JfY2xrc3JjLm8KLW9iai0kKENPTkZJR19YODZfQ1lDTE9ORV9USU1FUikJKz0gY3ljbG9uZS5vCiBvYmotJChDT05GSUdfWDg2X1BNX1RJTUVSKQkrPSBhY3BpX3BtLm8KIG9iai0kKENPTkZJR19TQ3gyMDBIUl9USU1FUikJKz0gc2N4MjAwX2hydC5vCiBvYmotJChDT05GSUdfQ1M1NTM1X0NMT0NLX0VWRU5UX1NSQykJKz0gY3M1NTM1LWNsb2NrZXZ0Lm8KQEAgLTIxLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19BUkNIX01PWEFSVCkJKz0gbW94YXJ0X3RpbWVyLm8KIG9iai0kKENPTkZJR19BUkNIX01YUykJCSs9IG14c190aW1lci5vCiBvYmotJChDT05GSUdfQVJDSF9QUklNQTIpCSs9IHRpbWVyLXByaW1hMi5vCitvYmotJChDT05GSUdfQVJDSF9VMzAwKQkJKz0gdGltZXItdTMwMC5vCiBvYmotJChDT05GSUdfU1VONElfVElNRVIpCSs9IHN1bjRpX3RpbWVyLm8KIG9iai0kKENPTkZJR19TVU41SV9IU1RJTUVSKQkrPSB0aW1lci1zdW41aS5vCiBvYmotJChDT05GSUdfQVJDSF9URUdSQSkJKz0gdGVncmEyMF90aW1lci5vCkBAIC0zNywzICszNyw0IEBACiBvYmotJChDT05GSUdfQVJNX0dMT0JBTF9USU1FUikJCSs9IGFybV9nbG9iYWxfdGltZXIubwogb2JqLSQoQ09ORklHX0NMS1NSQ19NRVRBR19HRU5FUklDKQkrPSBtZXRhZ19nZW5lcmljLm8KIG9iai0kKENPTkZJR19BUkNIX0hBU19USUNLX0JST0FEQ0FTVCkJKz0gZHVtbXlfdGltZXIubworb2JqLSQoQ09ORklHX0FSQ0hfS0VZU1RPTkUpCQkrPSB0aW1lci1rZXlzdG9uZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKaW5kZXggOTVmYjk0NC4uNTdlODIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYwpAQCAtMjc3LDYgKzI3Nyw3IEBACiAJCQljbGstPnNldF9uZXh0X2V2ZW50ID0gYXJjaF90aW1lcl9zZXRfbmV4dF9ldmVudF9waHlzOwogCQl9CiAJfSBlbHNlIHsKKwkJY2xrLT5mZWF0dXJlcyB8PSBDTE9DS19FVlRfRkVBVF9EWU5JUlE7CiAJCWNsay0+bmFtZSA9ICJhcmNoX21lbV90aW1lciI7CiAJCWNsay0+cmF0aW5nID0gNDAwOwogCQljbGstPmNwdW1hc2sgPSBjcHVfYWxsX21hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2NhZGVuY2VfdHRjX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2NhZGVuY2VfdHRjX3RpbWVyLmMKaW5kZXggNjNmMTc2ZC4uNDlmYmUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jYWRlbmNlX3R0Y190aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvY2FkZW5jZV90dGNfdGltZXIuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtNTIsNiArNTMsOCBAQAogI2RlZmluZSBUVENfQ05UX0NOVFJMX0RJU0FCTEVfTUFTSwkweDEKIAogI2RlZmluZSBUVENfQ0xLX0NOVFJMX0NTUkNfTUFTSwkJKDEgPDwgNSkJLyogY2xvY2sgc291cmNlICovCisjZGVmaW5lIFRUQ19DTEtfQ05UUkxfUFNWX01BU0sJCTB4MWUKKyNkZWZpbmUgVFRDX0NMS19DTlRSTF9QU1ZfU0hJRlQJCTEKIAogLyoKICAqIFNldHVwIHRoZSB0aW1lcnMgdG8gdXNlIHByZS1zY2FsaW5nLCB1c2luZyBhIGZpeGVkIHZhbHVlIGZvciBub3cgdGhhdCB3aWxsCkBAIC02Myw2ICs2Niw4IEBACiAjZGVmaW5lIENMS19DTlRSTF9QUkVTQ0FMRV9FTgkxCiAjZGVmaW5lIENOVF9DTlRSTF9SRVNFVAkJKDEgPDwgNCkKIAorI2RlZmluZSBNQVhfRl9FUlIgNTAKKwogLyoqCiAgKiBzdHJ1Y3QgdHRjX3RpbWVyIC0gVGhpcyBkZWZpbml0aW9uIGRlZmluZXMgbG9jYWwgdGltZXIgc3RydWN0dXJlCiAgKgpAQCAtODIsNiArODcsOCBAQAogCQljb250YWluZXJfb2YoeCwgc3RydWN0IHR0Y190aW1lciwgY2xrX3JhdGVfY2hhbmdlX25iKQogCiBzdHJ1Y3QgdHRjX3RpbWVyX2Nsb2Nrc291cmNlIHsKKwl1MzIJCQlzY2FsZV9jbGtfY3RybF9yZWdfb2xkOworCXUzMgkJCXNjYWxlX2Nsa19jdHJsX3JlZ19uZXc7CiAJc3RydWN0IHR0Y190aW1lcgl0dGM7CiAJc3RydWN0IGNsb2Nrc291cmNlCWNzOwogfTsKQEAgLTIyOSwzMiArMjM2LDg5IEBACiAJCQlzdHJ1Y3QgdHRjX3RpbWVyX2Nsb2Nrc291cmNlLCB0dGMpOwogCiAJc3dpdGNoIChldmVudCkgewotCWNhc2UgUE9TVF9SQVRFX0NIQU5HRToKLQkJLyoKLQkJICogRG8gd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHRvIG1haW50YWluIGEgcHJvcGVyIHRpbWUgYmFzZQotCQkgKgotCQkgKiBJIGNhbm5vdCBmaW5kIGEgd2F5IHRvIGFkanVzdCB0aGUgY3VycmVudGx5IHVzZWQgY2xvY2tzb3VyY2UKLQkJICogdG8gdGhlIG5ldyBmcmVxdWVuY3kuIF9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9oeigpIHNvdW5kcwotCQkgKiBnb29kLCBidXQgZG9lcyBub3Qgd29yay4gTm90IHN1cmUgd2hhdCdzIHRoYXQgbWlzc2luZy4KLQkJICoKLQkJICogVGhpcyBhcHByb2FjaCB3b3JrcywgYnV0IHRyaWdnZXJzIHR3byBjbG9ja3NvdXJjZSBzd2l0Y2hlcy4KLQkJICogVGhlIGZpcnN0IGFmdGVyIHVucmVnaXN0ZXIgdG8gY2xvY2tzb3VyY2UgamlmZmllcy4gQW5kCi0JCSAqIGFub3RoZXIgb25lIGFmdGVyIHRoZSByZWdpc3RlciB0byB0aGUgbmV3bHkgcmVnaXN0ZXJlZCB0aW1lci4KLQkJICoKLQkJICogQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCAnd2FzdGUnIGFub3RoZXIgSFcgdGltZXIgdG8gcGluZyBwb25nCi0JCSAqIGJldHdlZW4gY2xvY2sgc291cmNlcy4gVGhhdCB3b3VsZCBhbHNvIHVzZSBvbmUgcmVnaXN0ZXIgYW5kCi0JCSAqIG9uZSB1bnJlZ2lzdGVyIGNhbGwsIGJ1dCBvbmx5IHRyaWdnZXIgb25lIGNsb2Nrc291cmNlIHN3aXRjaAotCQkgKiBmb3IgdGhlIGNvc3Qgb2YgYW5vdGhlciBIVyB0aW1lciB1c2VkIGJ5IHRoZSBPUy4KLQkJICovCi0JCWNsb2Nrc291cmNlX3VucmVnaXN0ZXIoJnR0Y2NzLT5jcyk7Ci0JCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZ0dGNjcy0+Y3MsCi0JCQkJbmRhdGEtPm5ld19yYXRlIC8gUFJFU0NBTEUpOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFBSRV9SQVRFX0NIQU5HRToKKwl7CisJCXUzMiBwc3Y7CisJCXVuc2lnbmVkIGxvbmcgZmFjdG9yLCByYXRlX2xvdywgcmF0ZV9oaWdoOworCisJCWlmIChuZGF0YS0+bmV3X3JhdGUgPiBuZGF0YS0+b2xkX3JhdGUpIHsKKwkJCWZhY3RvciA9IERJVl9ST1VORF9DTE9TRVNUKG5kYXRhLT5uZXdfcmF0ZSwKKwkJCQkJbmRhdGEtPm9sZF9yYXRlKTsKKwkJCXJhdGVfbG93ID0gbmRhdGEtPm9sZF9yYXRlOworCQkJcmF0ZV9oaWdoID0gbmRhdGEtPm5ld19yYXRlOworCQl9IGVsc2UgeworCQkJZmFjdG9yID0gRElWX1JPVU5EX0NMT1NFU1QobmRhdGEtPm9sZF9yYXRlLAorCQkJCQluZGF0YS0+bmV3X3JhdGUpOworCQkJcmF0ZV9sb3cgPSBuZGF0YS0+bmV3X3JhdGU7CisJCQlyYXRlX2hpZ2ggPSBuZGF0YS0+b2xkX3JhdGU7CisJCX0KKworCQlpZiAoIWlzX3Bvd2VyX29mXzIoZmFjdG9yKSkKKwkJCQlyZXR1cm4gTk9USUZZX0JBRDsKKworCQlpZiAoYWJzKHJhdGVfaGlnaCAtIChmYWN0b3IgKiByYXRlX2xvdykpID4gTUFYX0ZfRVJSKQorCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJZmFjdG9yID0gX19pbG9nMl91MzIoZmFjdG9yKTsKKworCQkvKgorCQkgKiBzdG9yZSB0aW1lciBjbG9jayBjdHJsIHJlZ2lzdGVyIHNvIHdlIGNhbiByZXN0b3JlIGl0IGluIGNhc2UKKwkJICogb2YgYW4gYWJvcnQuCisJCSAqLworCQl0dGNjcy0+c2NhbGVfY2xrX2N0cmxfcmVnX29sZCA9CisJCQlfX3Jhd19yZWFkbCh0dGNjcy0+dHRjLmJhc2VfYWRkciArCisJCQkJCVRUQ19DTEtfQ05UUkxfT0ZGU0VUKTsKKworCQlwc3YgPSAodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQgJgorCQkJCVRUQ19DTEtfQ05UUkxfUFNWX01BU0spID4+CisJCQkJVFRDX0NMS19DTlRSTF9QU1ZfU0hJRlQ7CisJCWlmIChuZGF0YS0+bmV3X3JhdGUgPCBuZGF0YS0+b2xkX3JhdGUpCisJCQlwc3YgLT0gZmFjdG9yOworCQllbHNlCisJCQlwc3YgKz0gZmFjdG9yOworCisJCS8qIHByZXNjYWxlciB3aXRoaW4gbGVnYWwgcmFuZ2U/ICovCisJCWlmIChwc3YgJiB+KFRUQ19DTEtfQ05UUkxfUFNWX01BU0sgPj4gVFRDX0NMS19DTlRSTF9QU1ZfU0hJRlQpKQorCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJdHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19uZXcgPSB0dGNjcy0+c2NhbGVfY2xrX2N0cmxfcmVnX29sZCAmCisJCQl+VFRDX0NMS19DTlRSTF9QU1ZfTUFTSzsKKwkJdHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19uZXcgfD0gcHN2IDw8IFRUQ19DTEtfQ05UUkxfUFNWX1NISUZUOworCisKKwkJLyogc2NhbGUgZG93bjogYWRqdXN0IGRpdmlkZXIgaW4gcG9zdC1jaGFuZ2Ugbm90aWZpY2F0aW9uICovCisJCWlmIChuZGF0YS0+bmV3X3JhdGUgPCBuZGF0YS0+b2xkX3JhdGUpCisJCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkJLyogc2NhbGUgdXA6IGFkanVzdCBkaXZpZGVyIG5vdyAtIGJlZm9yZSBmcmVxdWVuY3kgY2hhbmdlICovCisJCV9fcmF3X3dyaXRlbCh0dGNjcy0+c2NhbGVfY2xrX2N0cmxfcmVnX25ldywKKwkJCQl0dGNjcy0+dHRjLmJhc2VfYWRkciArIFRUQ19DTEtfQ05UUkxfT0ZGU0VUKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUE9TVF9SQVRFX0NIQU5HRToKKwkJLyogc2NhbGUgdXA6IHByZS1jaGFuZ2Ugbm90aWZpY2F0aW9uIGRpZCB0aGUgYWRqdXN0bWVudCAqLworCQlpZiAobmRhdGEtPm5ld19yYXRlID4gbmRhdGEtPm9sZF9yYXRlKQorCQkJcmV0dXJuIE5PVElGWV9PSzsKKworCQkvKiBzY2FsZSBkb3duOiBhZGp1c3QgZGl2aWRlciBub3cgLSBhZnRlciBmcmVxdWVuY3kgY2hhbmdlICovCisJCV9fcmF3X3dyaXRlbCh0dGNjcy0+c2NhbGVfY2xrX2N0cmxfcmVnX25ldywKKwkJCQl0dGNjcy0+dHRjLmJhc2VfYWRkciArIFRUQ19DTEtfQ05UUkxfT0ZGU0VUKTsKKwkJYnJlYWs7CisKIAljYXNlIEFCT1JUX1JBVEVfQ0hBTkdFOgorCQkvKiB3ZSBoYXZlIHRvIHVuZG8gdGhlIGFkanVzdG1lbnQgaW4gY2FzZSB3ZSBzY2FsZSB1cCAqLworCQlpZiAobmRhdGEtPm5ld19yYXRlIDwgbmRhdGEtPm9sZF9yYXRlKQorCQkJcmV0dXJuIE5PVElGWV9PSzsKKworCQkvKiByZXN0b3JlIG9yaWdpbmFsIHJlZ2lzdGVyIHZhbHVlICovCisJCV9fcmF3X3dyaXRlbCh0dGNjcy0+c2NhbGVfY2xrX2N0cmxfcmVnX29sZCwKKwkJCQl0dGNjcy0+dHRjLmJhc2VfYWRkciArIFRUQ19DTEtfQ05UUkxfT0ZGU0VUKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHR0Y19zZXR1cF9jbG9ja3NvdXJjZShzdHJ1Y3QgY2xrICpjbGssIHZvaWQgX19pb21lbSAqYmFzZSkKQEAgLTMyMSwyNSArMzg1LDEyIEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBQT1NUX1JBVEVfQ0hBTkdFOgotCXsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkvKgotCQkgKiBjbG9ja2V2ZW50c191cGRhdGVfZnJlcSBzaG91bGQgYmUgY2FsbGVkIHdpdGggSVJRIGRpc2FibGVkIG9uCi0JCSAqIHRoZSBDUFUgdGhlIHRpbWVyIHByb3ZpZGVzIGV2ZW50cyBmb3IuIFRoZSB0aW1lciB3ZSB1c2UgaXMKLQkJICogY29tbW9uIHRvIGJvdGggQ1BVcywgbm90IHN1cmUgaWYgd2UgbmVlZCB0byBydW4gb24gYm90aAotCQkgKiBjb3Jlcy4KLQkJICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoJnR0Y2NlLT5jZSwKLQkJCQluZGF0YS0+bmV3X3JhdGUgLyBQUkVTQ0FMRSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQogCQkvKiB1cGRhdGUgY2FjaGVkIGZyZXF1ZW5jeSAqLwogCQl0dGMtPmZyZXEgPSBuZGF0YS0+bmV3X3JhdGU7CiAKKwkJY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoJnR0Y2NlLT5jZSwgbmRhdGEtPm5ld19yYXRlIC8gUFJFU0NBTEUpOworCiAJCS8qIGZhbGwgdGhyb3VnaCAqLwotCX0KIAljYXNlIFBSRV9SQVRFX0NIQU5HRToKIAljYXNlIEFCT1JUX1JBVEVfQ0hBTkdFOgogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvY3ljbG9uZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTA5OThmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvY3ljbG9uZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2hfdGltZXIuaD4KLQotI2RlZmluZSBDWUNMT05FX0NCQVJfQUREUgkweEZFQjAwQ0QwCS8qIGJhc2UgYWRkcmVzcyBwdHIgKi8KLSNkZWZpbmUgQ1lDTE9ORV9QTUNDX09GRlNFVAkweDUxQTAJCS8qIG9mZnNldCB0byBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIENZQ0xPTkVfTVBDU19PRkZTRVQJMHg1MUE4CQkvKiBvZmZzZXQgdG8gc2VsZWN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIENZQ0xPTkVfTVBNQ19PRkZTRVQJMHg1MUQwCQkvKiBvZmZzZXQgdG8gY291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ1lDTE9ORV9USU1FUl9GUkVRCTk5NzgwMDAwCS8qIDEwME1oeiwgYnV0IG5vdCByZWFsbHkgKi8KLSNkZWZpbmUgQ1lDTE9ORV9USU1FUl9NQVNLCUNMT0NLU09VUkNFX01BU0soMzIpIC8qIDMyIGJpdCBtYXNrICovCi0KLWludCB1c2VfY3ljbG9uZSA9IDA7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICpjeWNsb25lX3B0cjsKLQotc3RhdGljIGN5Y2xlX3QgcmVhZF9jeWNsb25lKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCi17Ci0JcmV0dXJuIChjeWNsZV90KXJlYWRsKGN5Y2xvbmVfcHRyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9jeWNsb25lID0gewotCS5uYW1lCQk9ICJjeWNsb25lIiwKLQkucmF0aW5nCQk9IDI1MCwKLQkucmVhZAkJPSByZWFkX2N5Y2xvbmUsCi0JLm1hc2sJCT0gQ1lDTE9ORV9USU1FUl9NQVNLLAotCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfY3ljbG9uZV9jbG9ja3NvdXJjZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYmFzZTsJLyogc2F2ZWQgdmFsdWUgZnJvbSBDQkFSICovCi0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdTMyIF9faW9tZW0qIHZvbGF0aWxlIGN5Y2xvbmVfdGltZXI7CS8qIEN5Y2xvbmUgTVBNQzAgcmVnaXN0ZXIgKi8KLQl1MzIgX19pb21lbSogcmVnOwotCWludCBpOwotCi0JLyogbWFrZSBzdXJlIHdlJ3JlIG9uIGEgc3VtbWl0IGJveDogKi8KLQlpZiAoIXVzZV9jeWNsb25lKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXByaW50ayhLRVJOX0lORk8gIlN1bW1pdCBjaGlwc2V0OiBTdGFydGluZyBDeWNsb25lIENvdW50ZXIuXG4iKTsKLQotCS8qIGZpbmQgYmFzZSBhZGRyZXNzOiAqLwotCW9mZnNldCA9IENZQ0xPTkVfQ0JBUl9BRERSOwotCXJlZyA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZihyZWcpKTsKLQlpZiAoIXJlZykgewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBDQkFSIHJlZ2lzdGVyLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQkvKiBldmVuIG9uIDY0Yml0IHN5c3RlbXMsIHRoaXMgaXMgb25seSAzMmJpdHM6ICovCi0JYmFzZSA9IHJlYWRsKHJlZyk7Ci0JaW91bm1hcChyZWcpOwotCWlmICghYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBDQkFSIHZhbHVlLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIHNldHVwIFBNQ0M6ICovCi0Jb2Zmc2V0ID0gYmFzZSArIENZQ0xPTkVfUE1DQ19PRkZTRVQ7Ci0JcmVnID0gaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHJlZykpOwotCWlmICghcmVnKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIFBNQ0MgcmVnaXN0ZXIuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXdyaXRlbCgweDAwMDAwMDAxLHJlZyk7Ci0JaW91bm1hcChyZWcpOwotCi0JLyogc2V0dXAgTVBDUzogKi8KLQlvZmZzZXQgPSBiYXNlICsgQ1lDTE9ORV9NUENTX09GRlNFVDsKLQlyZWcgPSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YocmVnKSk7Ci0JaWYgKCFyZWcpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgTVBDUyByZWdpc3Rlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0Jd3JpdGVsKDB4MDAwMDAwMDEscmVnKTsKLQlpb3VubWFwKHJlZyk7Ci0KLQkvKiBtYXAgaW4gY3ljbG9uZV90aW1lcjogKi8KLQlvZmZzZXQgPSBiYXNlICsgQ1lDTE9ORV9NUE1DX09GRlNFVDsKLQljeWNsb25lX3RpbWVyID0gaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHU2NCkpOwotCWlmICghY3ljbG9uZV90aW1lcikgewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBNUE1DIHJlZ2lzdGVyLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIHF1aWNrIHRlc3QgdG8gbWFrZSBzdXJlIGl0cyB0aWNraW5nOiAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspewotCQl1MzIgb2xkID0gcmVhZGwoY3ljbG9uZV90aW1lcik7Ci0JCWludCBzdGFsbCA9IDEwMDsKLQotCQl3aGlsZSAoc3RhbGwtLSkKLQkJCWJhcnJpZXIoKTsKLQotCQlpZiAocmVhZGwoY3ljbG9uZV90aW1lcikgPT0gb2xkKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VudGVyIG5vdCBjb3VudGluZyEgRElTQUJMRURcbiIpOwotCQkJaW91bm1hcChjeWNsb25lX3RpbWVyKTsKLQkJCWN5Y2xvbmVfdGltZXIgPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0JY3ljbG9uZV9wdHIgPSBjeWNsb25lX3RpbWVyOwotCi0JcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9jeWNsb25lLAotCQkJCQlDWUNMT05FX1RJTUVSX0ZSRVEpOwotfQotCi1hcmNoX2luaXRjYWxsKGluaXRfY3ljbG9uZV9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvZXh5bm9zX21jdC5jCmluZGV4IDQ4Zjc2YmMuLmMyZTM5MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvZXh5bm9zX21jdC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvZXh5bm9zX21jdC5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAltZXZ0ID0gY29udGFpbmVyX29mKGV2dCwgc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UsIGV2dCk7CiAKIAltZXZ0LT5iYXNlID0gRVhZTk9TNF9NQ1RfTF9CQVNFKGNwdSk7Ci0Jc3ByaW50ZihtZXZ0LT5uYW1lLCAibWN0X3RpY2slZCIsIGNwdSk7CisJc25wcmludGYobWV2dC0+bmFtZSwgc2l6ZW9mKG1ldnQtPm5hbWUpLCAibWN0X3RpY2slZCIsIGNwdSk7CiAKIAlldnQtPm5hbWUgPSBtZXZ0LT5uYW1lOwogCWV2dC0+Y3B1bWFzayA9IGNwdW1hc2tfb2YoY3B1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYwppbmRleCBiZjQ5N2FmLi5lZmIxN2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jCkBAIC0xOTYsNSArMTk2LDUgQEAKIAljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKCZzdW40aV9jbG9ja2V2ZW50LCByYXRlLAogCQkJCQlUSU1FUl9TWU5DX1RJQ0tTLCAweGZmZmZmZmZmKTsKIH0KLUNMT0NLU09VUkNFX09GX0RFQ0xBUkUoc3VuNGksICJhbGx3aW5uZXIsc3VuNGktdGltZXIiLAorQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRShzdW40aSwgImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiLAogCQkgICAgICAgc3VuNGlfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYwppbmRleCBlZTg2OTFiLi4wNDUxZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1hcm1hZGEtMzcwLXhwLmMKQEAgLTg1LDEyICs4NSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIF9fcGVyY3B1ICphcm1hZGFfMzcwX3hwX2V2dDsKIAotc3RhdGljIHZvaWQgdGltZXJfY3RybF9jbHJzZXQodTMyIGNsciwgdTMyIHNldCkKLXsKLQl3cml0ZWwoKHJlYWRsKHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMX09GRikgJiB+Y2xyKSB8IHNldCwKLQkJdGltZXJfYmFzZSArIFRJTUVSX0NUUkxfT0ZGKTsKLX0KLQogc3RhdGljIHZvaWQgbG9jYWxfdGltZXJfY3RybF9jbHJzZXQodTMyIGNsciwgdTMyIHNldCkKIHsKIAl3cml0ZWwoKHJlYWRsKGxvY2FsX2Jhc2UgKyBUSU1FUl9DVFJMX09GRikgJiB+Y2xyKSB8IHNldCwKQEAgLTI0NSw3ICsyMzksNyBAQAogCQljbHIgPSBUSU1FUjBfMjVNSFo7CiAJCWVuYWJsZV9tYXNrID0gVElNRVIwX0VOIHwgVElNRVIwX0RJVihUSU1FUl9ESVZJREVSX1NISUZUKTsKIAl9Ci0JdGltZXJfY3RybF9jbHJzZXQoY2xyLCBzZXQpOworCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkxfT0ZGLCBjbHIgfCBzZXQsIHNldCk7CiAJbG9jYWxfdGltZXJfY3RybF9jbHJzZXQoY2xyLCBzZXQpOwogCiAJLyoKQEAgLTI2Myw3ICsyNTcsOSBAQAogCXdyaXRlbCgweGZmZmZmZmZmLCB0aW1lcl9iYXNlICsgVElNRVIwX1ZBTF9PRkYpOwogCXdyaXRlbCgweGZmZmZmZmZmLCB0aW1lcl9iYXNlICsgVElNRVIwX1JFTE9BRF9PRkYpOwogCi0JdGltZXJfY3RybF9jbHJzZXQoMCwgVElNRVIwX1JFTE9BRF9FTiB8IGVuYWJsZV9tYXNrKTsKKwlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMX09GRiwKKwkJVElNRVIwX1JFTE9BRF9FTiB8IGVuYWJsZV9tYXNrLAorCQlUSU1FUjBfUkVMT0FEX0VOIHwgZW5hYmxlX21hc2spOwogCiAJLyoKIAkgKiBTZXQgc2NhbGUgYW5kIHRpbWVyIGZvciBzY2hlZF9jbG9jay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLW9yaW9uLmMKaW5kZXggMjAwNjYyMi4uMGIzY2UwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLW9yaW9uLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLW9yaW9uLmMKQEAgLTM1LDIwICszNSw2IEBACiAjZGVmaW5lIE9SSU9OX09ORVNIT1RfTUFYCTB4ZmZmZmZmZmUKIAogc3RhdGljIHZvaWQgX19pb21lbSAqdGltZXJfYmFzZTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZXJfY3RybF9sb2NrKTsKLQotLyoKLSAqIFRocmVhZC1zYWZlIGFjY2VzcyB0byBUSU1FUl9DVFJMIHJlZ2lzdGVyCi0gKiAoc2hhcmVkIHdpdGggd2F0Y2hkb2cgdGltZXIpCi0gKi8KLXZvaWQgb3Jpb25fdGltZXJfY3RybF9jbHJzZXQodTMyIGNsciwgdTMyIHNldCkKLXsKLQlzcGluX2xvY2soJnRpbWVyX2N0cmxfbG9jayk7Ci0Jd3JpdGVsKChyZWFkbCh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTCkgJiB+Y2xyKSB8IHNldCwKLQkJdGltZXJfYmFzZSArIFRJTUVSX0NUUkwpOwotCXNwaW5fdW5sb2NrKCZ0aW1lcl9jdHJsX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTChvcmlvbl90aW1lcl9jdHJsX2NscnNldCk7CiAKIC8qCiAgKiBGcmVlLXJ1bm5pbmcgY2xvY2tzb3VyY2UgaGFuZGxpbmcuCkBAIC02OCw3ICs1NCw4IEBACiB7CiAJLyogc2V0dXAgYW5kIGVuYWJsZSBvbmUtc2hvdCB0aW1lciAqLwogCXdyaXRlbChkZWx0YSwgdGltZXJfYmFzZSArIFRJTUVSMV9WQUwpOwotCW9yaW9uX3RpbWVyX2N0cmxfY2xyc2V0KFRJTUVSMV9SRUxPQURfRU4sIFRJTUVSMV9FTik7CisJYXRvbWljX2lvX21vZGlmeSh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTCwKKwkJVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTiwgVElNRVIxX0VOKTsKIAogCXJldHVybiAwOwogfQpAQCAtODAsMTAgKzY3LDEzIEBACiAJCS8qIHNldHVwIGFuZCBlbmFibGUgcGVyaW9kaWMgdGltZXIgYXQgMS9IWiBpbnRlcnZhbHMgKi8KIAkJd3JpdGVsKHRpY2tzX3Blcl9qaWZmeSAtIDEsIHRpbWVyX2Jhc2UgKyBUSU1FUjFfUkVMT0FEKTsKIAkJd3JpdGVsKHRpY2tzX3Blcl9qaWZmeSAtIDEsIHRpbWVyX2Jhc2UgKyBUSU1FUjFfVkFMKTsKLQkJb3Jpb25fdGltZXJfY3RybF9jbHJzZXQoMCwgVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTik7CisJCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkwsCisJCQlUSU1FUjFfUkVMT0FEX0VOIHwgVElNRVIxX0VOLAorCQkJVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTik7CiAJfSBlbHNlIHsKIAkJLyogZGlzYWJsZSB0aW1lciAqLwotCQlvcmlvbl90aW1lcl9jdHJsX2NscnNldChUSU1FUjFfUkVMT0FEX0VOIHwgVElNRVIxX0VOLCAwKTsKKwkJYXRvbWljX2lvX21vZGlmeSh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTCwKKwkJCVRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4sIDApOwogCX0KIH0KIApAQCAtMTMxLDcgKzEyMSw5IEBACiAJLyogc2V0dXAgdGltZXIwIGFzIGZyZWUtcnVubmluZyBjbG9ja3NvdXJjZSAqLwogCXdyaXRlbCh+MCwgdGltZXJfYmFzZSArIFRJTUVSMF9WQUwpOwogCXdyaXRlbCh+MCwgdGltZXJfYmFzZSArIFRJTUVSMF9SRUxPQUQpOwotCW9yaW9uX3RpbWVyX2N0cmxfY2xyc2V0KDAsIFRJTUVSMF9SRUxPQURfRU4gfCBUSU1FUjBfRU4pOworCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkwsCisJCVRJTUVSMF9SRUxPQURfRU4gfCBUSU1FUjBfRU4sCisJCVRJTUVSMF9SRUxPQURfRU4gfCBUSU1FUjBfRU4pOwogCWNsb2Nrc291cmNlX21taW9faW5pdCh0aW1lcl9iYXNlICsgVElNRVIwX1ZBTCwgIm9yaW9uX2Nsb2Nrc291cmNlIiwKIAkJCSAgICAgIGNsa19nZXRfcmF0ZShjbGspLCAzMDAsIDMyLAogCQkJICAgICAgY2xvY2tzb3VyY2VfbW1pb19yZWFkbF9kb3duKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXIta2V5c3RvbmUuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXIta2V5c3RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjUwMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1rZXlzdG9uZS5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogS2V5c3RvbmUgYnJvYWRjYXN0IGNsb2NrLWV2ZW50CisgKgorICogQ29weXJpZ2h0IDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IEl2YW4gS2hvcm9uemh1ayA8aXZhbi5raG9yb256aHVrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorCisjZGVmaW5lIFRJTUVSX05BTUUJCQkidGltZXIta2V5c3RvbmUiCisKKy8qIFRpbWVyIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgVElNMTIJCQkJMHgxMAorI2RlZmluZSBUSU0zNAkJCQkweDE0CisjZGVmaW5lIFBSRDEyCQkJCTB4MTgKKyNkZWZpbmUgUFJEMzQJCQkJMHgxYworI2RlZmluZSBUQ1IJCQkJMHgyMAorI2RlZmluZSBUR0NSCQkJCTB4MjQKKyNkZWZpbmUgSU5UQ1RMU1RBVAkJCTB4NDQKKworLyogVGltZXIgcmVnaXN0ZXIgYml0ZmllbGRzICovCisjZGVmaW5lIFRDUl9FTkFNT0RFX01BU0sJCTB4QzAKKyNkZWZpbmUgVENSX0VOQU1PREVfT05FU0hPVF9NQVNLCTB4NDAKKyNkZWZpbmUgVENSX0VOQU1PREVfUEVSSU9ESUNfTUFTSwkweDgwCisKKyNkZWZpbmUgVEdDUl9USU1fVU5SRVNFVF9NQVNLCQkweDAzCisjZGVmaW5lIElOVENUTFNUQVRfRU5JTlRfTUFTSwkJMHgwMQorCisvKioKKyAqIHN0cnVjdCBrZXlzdG9uZV90aW1lcjogaG9sZHMgdGltZXIncyBkYXRhCisgKiBAYmFzZTogdGltZXIgbWVtb3J5IGJhc2UgYWRkcmVzcworICogQGh6X3BlcmlvZDogY3ljbGVzIHBlciBIWiBwZXJpb2QKKyAqIEBldmVudF9kZXY6IGV2ZW50IGRldmljZSBiYXNlZCBvbiB0aW1lcgorICovCitzdGF0aWMgc3RydWN0IGtleXN0b25lX3RpbWVyIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgbG9uZyBoel9wZXJpb2Q7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBldmVudF9kZXY7Cit9IHRpbWVyOworCitzdGF0aWMgaW5saW5lIHUzMiBrZXlzdG9uZV90aW1lcl9yZWFkbCh1bnNpZ25lZCBsb25nIHJnKQoreworCXJldHVybiByZWFkbF9yZWxheGVkKHRpbWVyLmJhc2UgKyByZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrZXlzdG9uZV90aW1lcl93cml0ZWwodTMyIHZhbCwgdW5zaWduZWQgbG9uZyByZykKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHRpbWVyLmJhc2UgKyByZyk7Cit9CisKKy8qKgorICoga2V5c3RvbmVfdGltZXJfYmFycmllcjogd3JpdGUgbWVtb3J5IGJhcnJpZXIKKyAqIHVzZSBleHBsaWNpdCBiYXJyaWVyIHRvIGF2b2lkIHVzaW5nIHJlYWRsL3dyaXRlbCBub24gcmVsYXhlZCBmdW5jdGlvbgorICogdmFyaWFudHMsIGJlY2F1c2UgaW4gb3VyIGNhc2Ugbm9uIHJlbGF4ZWQgdmFyaWFudHMgaGlkZSB0aGUgdHJ1ZSBwbGFjZXMKKyAqIHdoZXJlIGJhcnJpZXIgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQga2V5c3RvbmVfdGltZXJfYmFycmllcih2b2lkKQoreworCV9faW93bWIoKTsKK30KKworLyoqCisgKiBrZXlzdG9uZV90aW1lcl9jb25maWc6IGNvbmZpZ3VyZXMgdGltZXIgdG8gd29yayBpbiBvbmVzaG90L3BlcmlvZGljIG1vZGVzLgorICogQCBtb2RlOiBtb2RlIHRvIGNvbmZpZ3VyZQorICogQCBwZXJpb2Q6IGN5Y2xlcyBudW1iZXIgdG8gY29uZmlndXJlIGZvcgorICovCitzdGF0aWMgaW50IGtleXN0b25lX3RpbWVyX2NvbmZpZyh1NjQgcGVyaW9kLCBlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSkKK3sKKwl1MzIgdGNyOworCXUzMiBvZmY7CisKKwl0Y3IgPSBrZXlzdG9uZV90aW1lcl9yZWFkbChUQ1IpOworCW9mZiA9IHRjciAmIH4oVENSX0VOQU1PREVfTUFTSyk7CisKKwkvKiBzZXQgZW5hYmxlIG1vZGUgKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJCXRjciB8PSBUQ1JfRU5BTU9ERV9PTkVTSE9UX01BU0s7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCXRjciB8PSBUQ1JfRU5BTU9ERV9QRVJJT0RJQ19NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogZGlzYWJsZSB0aW1lciAqLworCWtleXN0b25lX3RpbWVyX3dyaXRlbChvZmYsIFRDUik7CisJLyogaGVyZSB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhlIHRpbWVyIGhhcyBiZWVuIGRpc2FibGVkICovCisJa2V5c3RvbmVfdGltZXJfYmFycmllcigpOworCisJLyogcmVzZXQgY291bnRlciB0byB6ZXJvLCBzZXQgbmV3IHBlcmlvZCAqLworCWtleXN0b25lX3RpbWVyX3dyaXRlbCgwLCBUSU0xMik7CisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKDAsIFRJTTM0KTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwocGVyaW9kICYgMHhmZmZmZmZmZiwgUFJEMTIpOworCWtleXN0b25lX3RpbWVyX3dyaXRlbChwZXJpb2QgPj4gMzIsIFBSRDM0KTsKKworCS8qCisJICogZW5hYmxlIHRpbWVyCisJICogaGVyZSB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhhdCBDTlRMTywgQ05USEksIFBSRExPLCBQUkRISSByZWdpc3RlcnMKKwkgKiBoYXZlIGJlZW4gd3JpdHRlbi4KKwkgKi8KKwlrZXlzdG9uZV90aW1lcl9iYXJyaWVyKCk7CisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKHRjciwgVENSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga2V5c3RvbmVfdGltZXJfZGlzYWJsZSh2b2lkKQoreworCXUzMiB0Y3I7CisKKwl0Y3IgPSBrZXlzdG9uZV90aW1lcl9yZWFkbChUQ1IpOworCisJLyogZGlzYWJsZSB0aW1lciAqLworCXRjciAmPSB+KFRDUl9FTkFNT0RFX01BU0spOworCWtleXN0b25lX3RpbWVyX3dyaXRlbCh0Y3IsIFRDUik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBrZXlzdG9uZV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IGRldl9pZDsKKworCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBrZXlzdG9uZV9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKKwkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlyZXR1cm4ga2V5c3RvbmVfdGltZXJfY29uZmlnKGN5Y2xlcywgZXZ0LT5tb2RlKTsKK30KKworc3RhdGljIHZvaWQga2V5c3RvbmVfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQlrZXlzdG9uZV90aW1lcl9jb25maWcodGltZXIuaHpfcGVyaW9kLCBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQyk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQlrZXlzdG9uZV90aW1lcl9kaXNhYmxlKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGtleXN0b25lX3RpbWVyX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldmVudF9kZXYgPSAmdGltZXIuZXZlbnRfZGV2OworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGlycSwgZXJyb3I7CisKKwlpcnEgID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgaW50ZXJydXB0c1xuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJdGltZXIuYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXRpbWVyLmJhc2UpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCByZWdpc3RlcnNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNsayA9IG9mX2Nsa19nZXQobnAsIDApOworCWlmIChJU19FUlIoY2xrKSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNsb2NrXG4iLCBfX2Z1bmNfXyk7CisJCWlvdW5tYXAodGltZXIuYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwllcnJvciA9IGNsa19wcmVwYXJlX2VuYWJsZShjbGspOworCWlmIChlcnJvcikgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGNsb2NrXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKworCS8qIGRpc2FibGUsIHVzZSBpbnRlcm5hbCBjbG9jayBzb3VyY2UgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoMCwgVENSKTsKKwkvKiBoZXJlIHdlIGhhdmUgdG8gYmUgc3VyZSB0aGUgdGltZXIgaGFzIGJlZW4gZGlzYWJsZWQgKi8KKwlrZXlzdG9uZV90aW1lcl9iYXJyaWVyKCk7CisKKwkvKiByZXNldCB0aW1lciBhcyA2NC1iaXQsIG5vIHByZS1zY2FsZXIsIHBsdXMgZmVhdHVyZXMgYXJlIGRpc2FibGVkICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKDAsIFRHQ1IpOworCisJLyogdW5yZXNldCB0aW1lciAqLworCWtleXN0b25lX3RpbWVyX3dyaXRlbChUR0NSX1RJTV9VTlJFU0VUX01BU0ssIFRHQ1IpOworCisJLyogaW5pdCBjb3VudGVyIHRvIHplcm8gKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoMCwgVElNMTIpOworCWtleXN0b25lX3RpbWVyX3dyaXRlbCgwLCBUSU0zNCk7CisKKwl0aW1lci5oel9wZXJpb2QgPSBESVZfUk9VTkRfVVAocmF0ZSwgSFopOworCisJLyogZW5hYmxlIHRpbWVyIGludGVycnVwdHMgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoSU5UQ1RMU1RBVF9FTklOVF9NQVNLLCBJTlRDVExTVEFUKTsKKworCWVycm9yID0gcmVxdWVzdF9pcnEoaXJxLCBrZXlzdG9uZV90aW1lcl9pbnRlcnJ1cHQsIElSUUZfVElNRVIsCisJCQkgICAgVElNRVJfTkFNRSwgZXZlbnRfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldHVwIGlycVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBzZXR1cCBjbG9ja2V2ZW50ICovCisJZXZlbnRfZGV2LT5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKKwlldmVudF9kZXYtPnNldF9uZXh0X2V2ZW50ID0ga2V5c3RvbmVfc2V0X25leHRfZXZlbnQ7CisJZXZlbnRfZGV2LT5zZXRfbW9kZSA9IGtleXN0b25lX3NldF9tb2RlOworCWV2ZW50X2Rldi0+Y3B1bWFzayA9IGNwdV9hbGxfbWFzazsKKwlldmVudF9kZXYtPm93bmVyID0gVEhJU19NT0RVTEU7CisJZXZlbnRfZGV2LT5uYW1lID0gVElNRVJfTkFNRTsKKwlldmVudF9kZXYtPmlycSA9IGlycTsKKworCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoZXZlbnRfZGV2LCByYXRlLCAxLCBVTE9OR19NQVgpOworCisJcHJfaW5mbygia2V5c3RvbmUgdGltZXIgY2xvY2sgQCVsdSBIelxuIiwgcmF0ZSk7CisJcmV0dXJuOworZXJyOgorCWNsa19wdXQoY2xrKTsKKwlpb3VubWFwKHRpbWVyLmJhc2UpOworfQorCitDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKGtleXN0b25lX3RpbWVyLCAidGksa2V5c3RvbmUtdGltZXIiLAorCQkJCQlrZXlzdG9uZV90aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdTMwMC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci11MzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzZDQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdTMwMC5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU1QtRXJpY3Nzb24gQUIKKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICogVGltZXIgQ09IIDkwMSAzMjgsIHJ1bnMgdGhlIE9TIHRpbWVyIGludGVycnVwdC4KKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZF9jbG9jay5oPgorCisvKiBHZW5lcmljIHN0dWZmICovCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisvKgorICogQVBQIHNpZGUgc3BlY2lhbCB0aW1lciByZWdpc3RlcnMKKyAqIFRoaXMgdGltZXIgY29udGFpbnMgZm91ciB0aW1lcnMgd2hpY2ggY2FuIGZpcmUgYW4gaW50ZXJydXB0IGVhY2guCisgKiBPUyAob3BlcmF0aW5nIHN5c3RlbSkgdGltZXIgQCAzMjc2OCBIegorICogREQgKGRldmljZSBkcml2ZXIpIHRpbWVyIEAgMSBrSHoKKyAqIEdQMSAoZ2VuZXJhbCBwdXJwb3NlIDEpIHRpbWVyIEAgMU1IegorICogR1AyIChnZW5lcmFsIHB1cnBvc2UgMikgdGltZXIgQCAxTUh6CisgKi8KKworLyogUmVzZXQgT1MgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUk9TVAkJCQkJKDB4MDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUk9TVF9USU1FUl9SRVNFVAkJCQkoMHgwMDAwMDAwMCkKKy8qIEVuYWJsZSBPUyBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FT1NUCQkJCQkoMHgwMDA0KQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FT1NUX1RJTUVSX0VOQUJMRQkJCSgweDAwMDAwMDAwKQorLyogRGlzYWJsZSBPUyBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ET1NUCQkJCQkoMHgwMDA4KQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ET1NUX1RJTUVSX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKKy8qIE9TIFRpbWVyIE1vZGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU09TVE0JCQkJCSgweDAwMGMpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NPU1RNX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TT1NUTV9NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMDEpCisvKiBPUyBUaW1lciBTdGF0dXMgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUUwkJCQkJKDB4MDAxMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19USU1FUl9TVEFURV9NQVNLCQkJKDB4MDAwMDAwMEYpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfVElNRVJfU1RBVEVfSURMRQkJCSgweDAwMDAwMDAxKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX1RJTUVSX1NUQVRFX0FDVElWRQkJCSgweDAwMDAwMDAyKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX0VOQUJMRV9JTkQJCQkJKDB4MDAwMDAwMTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfTU9ERV9NQVNLCQkJCSgweDAwMDAwMDIwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19JUlFfRU5BQkxFRF9JTkQJCQkoMHgwMDAwMDA0MCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19JUlFfUEVORElOR19JTkQJCQkoMHgwMDAwMDA4MCkKKy8qIE9TIFRpbWVyIEN1cnJlbnQgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUQ0MJCQkJCSgweDAwMTQpCisvKiBPUyBUaW1lciBUZXJtaW5hbCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RUQwkJCQkJKDB4MDAxOCkKKy8qIE9TIFRpbWVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUUJCQkJCSgweDAwMWMpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElFX0lSUV9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElFX0lSUV9FTkFCTEUJCQkJKDB4MDAwMDAwMDEpCisvKiBPUyBUaW1lciBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUEJCQkJCSgweDAwMjApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElBX0lSUV9BQ0sJCQkJKDB4MDAwMDAwODApCisKKy8qIFJlc2V0IEREIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JERFQJCQkJCSgweDAwNDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JERFRfVElNRVJfUkVTRVQJCQkJKDB4MDAwMDAwMDApCisvKiBFbmFibGUgREQgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUREVAkJCQkJKDB4MDA0NCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUREVF9USU1FUl9FTkFCTEUJCQkoMHgwMDAwMDAwMCkKKy8qIERpc2FibGUgREQgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREREVAkJCQkJKDB4MDA0OCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREREVF9USU1FUl9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCisvKiBERCBUaW1lciBNb2RlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NERFRNCQkJCQkoMHgwMDRjKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TRERUTV9NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0REVE1fTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDAxKQorLyogREQgVGltZXIgU3RhdHVzIFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFMJCQkJCSgweDAwNTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfVElNRVJfU1RBVEVfTUFTSwkJCSgweDAwMDAwMDBGKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX1RJTUVSX1NUQVRFX0lETEUJCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19USU1FUl9TVEFURV9BQ1RJVkUJCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19FTkFCTEVfSU5ECQkJCSgweDAwMDAwMDEwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX01PREVfTUFTSwkJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMjApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfSVJRX0VOQUJMRURfSU5ECQkJKDB4MDAwMDAwNDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfSVJRX1BFTkRJTkdfSU5ECQkJKDB4MDAwMDAwODApCisvKiBERCBUaW1lciBDdXJyZW50IENvdW50IFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVENDCQkJCQkoMHgwMDU0KQorLyogREQgVGltZXIgVGVybWluYWwgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUVEMJCQkJCSgweDAwNTgpCisvKiBERCBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElFCQkJCQkoMHgwMDVjKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJRV9JUlFfRElTQUJMRQkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJRV9JUlFfRU5BQkxFCQkJCSgweDAwMDAwMDAxKQorLyogREQgVGltZXIgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElBCQkJCQkoMHgwMDYwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJQV9JUlFfQUNLCQkJCSgweDAwMDAwMDgwKQorCisvKiBSZXNldCBHUDEgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkdQVDEJCQkJCSgweDAwODApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JHUFQxX1RJTUVSX1JFU0VUCQkJKDB4MDAwMDAwMDApCisvKiBFbmFibGUgR1AxIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VHUFQxCQkJCQkoMHgwMDg0KQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FR1BUMV9USU1FUl9FTkFCTEUJCQkoMHgwMDAwMDAwMCkKKy8qIERpc2FibGUgR1AxIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RHUFQxCQkJCQkoMHgwMDg4KQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCisvKiBHUDEgVGltZXIgTW9kZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMU0JCQkJCSgweDAwOGMpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQxTV9NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAwMSkKKy8qIEdQMSBUaW1lciBTdGF0dXMgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVMJCQkJCSgweDAwOTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX1RJTUVSX1NUQVRFX01BU0sJCQkoMHgwMDAwMDAwRikKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfVElNRVJfU1RBVEVfSURMRQkJCSgweDAwMDAwMDAxKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19USU1FUl9TVEFURV9BQ1RJVkUJCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfRU5BQkxFX0lORAkJCQkoMHgwMDAwMDAxMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfTU9ERV9NQVNLCQkJCSgweDAwMDAwMDIwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDIwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19JUlFfRU5BQkxFRF9JTkQJCQkoMHgwMDAwMDA0MCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfSVJRX1BFTkRJTkdfSU5ECQkJKDB4MDAwMDAwODApCisvKiBHUDEgVGltZXIgQ3VycmVudCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxQ0MJCQkJCSgweDAwOTQpCisvKiBHUDEgVGltZXIgVGVybWluYWwgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVRDCQkJCQkoMHgwMDk4KQorLyogR1AxIFRpbWVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlFCQkJCQkoMHgwMDljKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUJCQkoMHgwMDAwMDAwMSkKKy8qIEdQMSBUaW1lciBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlBCQkJCQkoMHgwMGEwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUFfSVJRX0FDSwkJCQkoMHgwMDAwMDA4MCkKKworLyogUmVzZXQgR1AyIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JHUFQyCQkJCQkoMHgwMGMwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SR1BUMl9USU1FUl9SRVNFVAkJCSgweDAwMDAwMDAwKQorLyogRW5hYmxlIEdQMiBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FR1BUMgkJCQkJKDB4MDBjNCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUdQVDJfVElNRVJfRU5BQkxFCQkJKDB4MDAwMDAwMDApCisvKiBEaXNhYmxlIEdQMiBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ER1BUMgkJCQkJKDB4MDBjOCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREdQVDJfVElNRVJfRElTQUJMRQkJCSgweDAwMDAwMDAwKQorLyogR1AyIFRpbWVyIE1vZGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDJNCQkJCQkoMHgwMGNjKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMk1fTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQyTV9NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMDEpCisvKiBHUDIgVGltZXIgU3RhdHVzIFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTCQkJCQkoMHgwMGQwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19USU1FUl9TVEFURV9NQVNLCQkJKDB4MDAwMDAwMEYpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX1RJTUVSX1NUQVRFX0lETEUJCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfVElNRVJfU1RBVEVfQUNUSVZFCQkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX0VOQUJMRV9JTkQJCQkJKDB4MDAwMDAwMTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX01PREVfTUFTSwkJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfSVJRX0VOQUJMRURfSU5ECQkJKDB4MDAwMDAwNDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX0lSUV9QRU5ESU5HX0lORAkJCSgweDAwMDAwMDgwKQorLyogR1AyIFRpbWVyIEN1cnJlbnQgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMkNDCQkJCQkoMHgwMGQ0KQorLyogR1AyIFRpbWVyIFRlcm1pbmFsIENvdW50IFJlZ2lzdGVyIDMyYml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJUQwkJCQkJKDB4MDBkOCkKKy8qIEdQMiBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJRQkJCQkJKDB4MDBkYykKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklFX0lSUV9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJRV9JUlFfRU5BQkxFCQkJKDB4MDAwMDAwMDEpCisvKiBHUDIgVGltZXIgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJQQkJCQkJKDB4MDBlMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklBX0lSUV9BQ0sJCQkJKDB4MDAwMDAwODApCisKKy8qIENsb2NrIHJlcXVlc3QgY29udHJvbCByZWdpc3RlciAtIGFsbCBmb3VyIHRpbWVycyAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9DUkMJCQkJCSgweDEwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfQ1JDX0NMT0NLX1JFUVVFU1RfRU5BQkxFCQkJKDB4MDAwMDAwMDEpCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnUzMDBfdGltZXJfYmFzZTsKKworc3RydWN0IHUzMDBfY2xvY2tldmVudF9kYXRhIHsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNldmQ7CisJdW5zaWduZWQgdGlja3NfcGVyX2ppZmZ5OworfTsKKworLyoKKyAqIFRoZSB1MzAwX3NldF9tb2RlKCkgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBmaXJzdCwgaWYgd2UKKyAqIGhhdmUgb25lc2hvdCB0aW1lciBhY3RpdmUsIHRoZSBvbmVzaG90IHNjaGVkdWxpbmcgZnVuY3Rpb24KKyAqIHUzMDBfc2V0X25leHRfZXZlbnQoKSBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHUzMDBfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgdTMwMF9jbG9ja2V2ZW50X2RhdGEgKmNldmRhdGEgPQorCQljb250YWluZXJfb2YoZXZ0LCBzdHJ1Y3QgdTMwMF9jbG9ja2V2ZW50X2RhdGEsIGNldmQpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIEdQVDEgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRElTQUJMRSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7CisJCS8qIERpc2FibGUgR1AxIHdoaWxlIHdlJ3JlIHJlcHJvZ3JhbW1pbmcgaXQuICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREdQVDEpOworCQkvKgorCQkgKiBTZXQgdGhlIHBlcmlvZGljIG1vZGUgdG8gYSBjZXJ0YWluIG51bWJlciBvZiB0aWNrcyBwZXIKKwkJICogamlmZnkuCisJCSAqLworCQl3cml0ZWwoY2V2ZGF0YS0+dGlja3NfcGVyX2ppZmZ5LAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMVRDKTsKKwkJLyoKKwkJICogU2V0IGNvbnRpbnVvdXMgbW9kZSwgc28gdGhlIHRpbWVyIGtlZXBzIHRyaWdnZXJpbmcKKwkJICogaW50ZXJydXB0cy4KKwkJICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9TR1BUMU1fTU9ERV9DT05USU5VT1VTLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfU0dQVDFNKTsKKwkJLyogRW5hYmxlIHRpbWVyIGludGVycnVwdHMgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRU5BQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKKwkJLyogVGhlbiBlbmFibGUgdGhlIE9TIHRpbWVyIGFnYWluICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9FR1BUMV9USU1FUl9FTkFCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9FR1BUMSk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJLyogSnVzdCBicmVhazsgaGVyZT8gKi8KKwkJLyoKKwkJICogVGhlIGFjdHVhbCBldmVudCB3aWxsIGJlIHByb2dyYW1tZWQgYnkgdGhlIG5leHQgZXZlbnQgaG9vaywKKwkJICogc28gd2UganVzdCBzZXQgYSBkdW1teSB2YWx1ZSBzb21ld2hlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKwkJICogdW5pdmVyc2UgaGVyZS4KKwkJICovCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiBHUFQxICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOworCQkvKiBEaXNhYmxlIEdQMSB3aGlsZSB3ZSdyZSByZXByb2dyYW1taW5nIGl0LiAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RHUFQxKTsKKwkJLyoKKwkJICogRXhwaXJlIGZhciBpbiB0aGUgZnV0dXJlLCB1MzAwX3NldF9uZXh0X2V2ZW50KCkgd2lsbCBiZQorCQkgKiBjYWxsZWQgc29vbi4uLgorCQkgKi8KKwkJd3JpdGVsKDB4RkZGRkZGRkYsIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFUQyk7CisJCS8qIFdlIHJ1biBvbmUgc2hvdCBwZXIgdGljayBoZXJlISAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfT05FX1NIT1QsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9TR1BUMU0pOworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgdGhpcyB0aW1lciAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOworCQkvKiBFbmFibGUgdGltZXIgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0VHUFQxX1RJTUVSX0VOQUJMRSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0VHUFQxKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIEdQMSAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9ESVNBQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKKwkJLyogRGlzYWJsZSBHUDEgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RHUFQxX1RJTUVSX0RJU0FCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ER1BUMSk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQkvKiBJZ25vcmUgdGhpcyBjYWxsICovCisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFRoZSBhcHAgdGltZXIgaW4gb25lIHNob3QgbW9kZSBvYnZpb3VzbHkgaGFzIHRvIGJlIHJlcHJvZ3JhbW1lZAorICogaW4gRVhBQ1RMWSB0aGlzIHNlcXVlbmNlIHRvIHdvcmsgcHJvcGVybHkuIERvIE5PVCB0cnkgdG8gZS5nLiByZXBsYWNlCisgKiB0aGUgaW50ZXJydXB0IGRpc2FibGUgKyB0aW1lciBkaXNhYmxlIGNvbW1hbmRzIHdpdGggYSByZXNldCBjb21tYW5kLAorICogaXQgd2lsbCBmYWlsIG1pc2VyYWJseS4gQXBwYXJlbnRseSAoYW5kIEkgZm91bmQgdGhpcyB0aGUgaGFyZCB3YXkpCisgKiB0aGUgdGltZXIgaXMgdmVyeSBzZW5zaXRpdmUgdG8gdGhlIGluc3RydWN0aW9uIG9yZGVyLCB0aG91Z2ggeW91IGRvbid0CisgKiBnZXQgdGhhdCBpbXByZXNzaW9uIGZyb20gdGhlIGRhdGEgc2hlZXQuCisgKi8KK3N0YXRpYyBpbnQgdTMwMF9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKKwkJCSAgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCisKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gR1BUMSAqLworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7CisJLyogRGlzYWJsZSBHUDEgd2hpbGUgd2UncmUgcmVwcm9ncmFtbWluZyBpdC4gKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRSwKKwkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREdQVDEpOworCS8qIFJlc2V0IHRoZSBHZW5lcmFsIFB1cnBvc2UgdGltZXIgMS4gKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUkdQVDFfVElNRVJfUkVTRVQsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JHUFQxKTsKKwkvKiBJUlEgaW4gbiAqIGN5Y2xlcyAqLworCXdyaXRlbChjeWNsZXMsIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFUQyk7CisJLyoKKwkgKiBXZSBydW4gb25lIHNob3QgcGVyIHRpY2sgaGVyZSEgKFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHJlY29uZmlndXJlLAorCSAqIHRoZSB0aW1lciB3aWxsIHRpbHQgaWYgeW91IGRvbid0ISkKKwkgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfT05FX1NIT1QsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1NHUFQxTSk7CisJLyogRW5hYmxlIHRpbWVyIGludGVycnVwdHMgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7CisJLyogVGhlbiBlbmFibGUgdGhlIE9TIHRpbWVyIGFnYWluICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0VHUFQxX1RJTUVSX0VOQUJMRSwKKwkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRUdQVDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHUzMDBfY2xvY2tldmVudF9kYXRhIHUzMDBfY2xvY2tldmVudF9kYXRhID0geworCS8qIFVzZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgMSBhcyBjbG9jayBldmVudCAqLworCS5jZXZkID0geworCQkubmFtZQkJPSAiR1BUMSIsCisJCS8qIFJlYXNvbmFibHkgZmFzdCBhbmQgYWNjdXJhdGUgY2xvY2sgZXZlbnQgKi8KKwkJLnJhdGluZwkJPSAzMDAsCisJCS5mZWF0dXJlcwk9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwKKwkJCUNMT0NLX0VWVF9GRUFUX09ORVNIT1QsCisJCS5zZXRfbmV4dF9ldmVudAk9IHUzMDBfc2V0X25leHRfZXZlbnQsCisJCS5zZXRfbW9kZQk9IHUzMDBfc2V0X21vZGUsCisJfSwKK307CisKKy8qIENsb2NrIGV2ZW50IHRpbWVyIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdTMwMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZ1MzAwX2Nsb2NrZXZlbnRfZGF0YS5jZXZkOworCS8qIEFDSy9DbGVhciB0aW1lciBJUlEgZm9yIHRoZSBBUFAgR1BUMSBUaW1lciAqLworCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJQV9JUlFfQUNLLAorCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUEpOworCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdTMwMF90aW1lcl9pcnEgPSB7CisJLm5hbWUJCT0gIlUzMDAgVGltZXIgVGljayIsCisJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAorCS5oYW5kbGVyCT0gdTMwMF90aW1lcl9pbnRlcnJ1cHQsCit9OworCisvKgorICogT3ZlcnJpZGUgdGhlIGdsb2JhbCB3ZWFrIHNjaGVkX2Nsb2NrIHN5bWJvbCB3aXRoIHRoaXMKKyAqIGxvY2FsIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgdGhlIGNsb2Nrc291cmNlIHRvIGdldCBzb21lCisgKiBiZXR0ZXIgcmVzb2x1dGlvbiB3aGVuIHNjaGVkdWxpbmcgdGhlIGtlcm5lbC4gV2UgYWNjZXB0IHRoYXQKKyAqIHRoaXMgd3JhcHMgYXJvdW5kIGZvciBub3csIHNpbmNlIGl0IGlzIGp1c3QgYSByZWxhdGl2ZSB0aW1lCisgKiBzdGFtcC4gKEluc3BpcmVkIGJ5IE9NQVAgaW1wbGVtZW50YXRpb24uKQorICovCisKK3N0YXRpYyB1NjQgbm90cmFjZSB1MzAwX3JlYWRfc2NoZWRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGwodTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMkNDKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdTMwMF9yZWFkX2N1cnJlbnRfdGltZXIodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGwodTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMkNDKTsKK30KKworc3RhdGljIHN0cnVjdCBkZWxheV90aW1lciB1MzAwX2RlbGF5X3RpbWVyOworCisvKgorICogVGhpcyBzZXRzIHVwIHRoZSBzeXN0ZW0gdGltZXJzLCBjbG9jayBzb3VyY2UgYW5kIGNsb2NrIGV2ZW50LgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgdTMwMF90aW1lcl9pbml0X29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdW5zaWduZWQgbG9uZyByYXRlOworCisJdTMwMF90aW1lcl9iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCWlmICghdTMwMF90aW1lcl9iYXNlKQorCQlwYW5pYygiY291bGQgbm90IGlvcmVtYXAgc3lzdGVtIHRpbWVyXG4iKTsKKworCS8qIEdldCB0aGUgSVJRIGZvciB0aGUgR1AxIHRpbWVyICovCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDIpOworCWlmICghaXJxKQorCQlwYW5pYygibm8gSVJRIGZvciBzeXN0ZW0gdGltZXJcbiIpOworCisJcHJfaW5mbygiVTMwMCBHUDEgdGltZXIgQCBiYXNlOiAlcCwgSVJROiAldVxuIiwgdTMwMF90aW1lcl9iYXNlLCBpcnEpOworCisJLyogQ2xvY2sgdGhlIGludGVycnVwdCBjb250cm9sbGVyICovCisJY2xrID0gb2ZfY2xrX2dldChucCwgMCk7CisJQlVHX09OKElTX0VSUihjbGspKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwlyYXRlID0gY2xrX2dldF9yYXRlKGNsayk7CisKKwl1MzAwX2Nsb2NrZXZlbnRfZGF0YS50aWNrc19wZXJfamlmZnkgPSBESVZfUk9VTkRfQ0xPU0VTVChyYXRlLCBIWik7CisKKwlzY2hlZF9jbG9ja19yZWdpc3Rlcih1MzAwX3JlYWRfc2NoZWRfY2xvY2ssIDMyLCByYXRlKTsKKworCXUzMDBfZGVsYXlfdGltZXIucmVhZF9jdXJyZW50X3RpbWVyID0gJnUzMDBfcmVhZF9jdXJyZW50X3RpbWVyOworCXUzMDBfZGVsYXlfdGltZXIuZnJlcSA9IHJhdGU7CisJcmVnaXN0ZXJfY3VycmVudF90aW1lcl9kZWxheSgmdTMwMF9kZWxheV90aW1lcik7CisKKwkvKgorCSAqIERpc2FibGUgdGhlICJPUyIgYW5kICJERCIgdGltZXJzIC0gdGhlc2UgYXJlIGRlc2lnbmVkIGZvciBTeW1iaWFuIQorCSAqIEV4YW1wbGUgdXNhZ2UgaW4gY25oMTYwMTU3OCBjcHUgc3Vic3lzdGVtIHBkX3RpbWVyX2FwcC5jCisJICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0NSQ19DTE9DS19SRVFVRVNUX0VOQUJMRSwKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfQ1JDKTsKKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUk9TVF9USU1FUl9SRVNFVCwKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUk9TVCk7CisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RPU1RfVElNRVJfRElTQUJMRSwKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRE9TVCk7CisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1JERFRfVElNRVJfUkVTRVQsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JERFQpOworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ERERUX1RJTUVSX0RJU0FCTEUsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RERFQpOworCisJLyogUmVzZXQgdGhlIEdlbmVyYWwgUHVycG9zZSB0aW1lciAxLiAqLworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9SR1BUMV9USU1FUl9SRVNFVCwKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUkdQVDEpOworCisJLyogU2V0IHVwIHRoZSBJUlEgaGFuZGxlciAqLworCXNldHVwX2lycShpcnEsICZ1MzAwX3RpbWVyX2lycSk7CisKKwkvKiBSZXNldCB0aGUgR2VuZXJhbCBQdXJwb3NlIHRpbWVyIDIgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUkdQVDJfVElNRVJfUkVTRVQsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JHUFQyKTsKKwkvKiBTZXQgdGhpcyB0aW1lciB0byBydW4gYXJvdW5kIGZvcmV2ZXIgKi8KKwl3cml0ZWwoMHhGRkZGRkZGRlUsIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDJUQyk7CisJLyogU2V0IGNvbnRpbnVvdXMgbW9kZSBzbyBpdCB3cmFwcyBhcm91bmQgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDJNX01PREVfQ09OVElOVU9VUywKKwkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfU0dQVDJNKTsKKwkvKiBEaXNhYmxlIHRpbWVyIGludGVycnVwdHMgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMklFX0lSUV9ESVNBQkxFLAorCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQySUUpOworCS8qIFRoZW4gZW5hYmxlIHRoZSBHUDIgdGltZXIgdG8gdXNlIGFzIGEgZnJlZSBydW5uaW5nIHVzIGNvdW50ZXIgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfRUdQVDJfVElNRVJfRU5BQkxFLAorCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9FR1BUMik7CisKKwkvKiBVc2UgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIDIgYXMgY2xvY2sgc291cmNlICovCisJaWYgKGNsb2Nrc291cmNlX21taW9faW5pdCh1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQyQ0MsCisJCQkiR1BUMiIsIHJhdGUsIDMwMCwgMzIsIGNsb2Nrc291cmNlX21taW9fcmVhZGxfdXApKQorCQlwcl9lcnIoInRpbWVyOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBVMzAwIGNsb2NrIHNvdXJjZVxuIik7CisKKwkvKiBDb25maWd1cmUgYW5kIHJlZ2lzdGVyIHRoZSBjbG9ja2V2ZW50ICovCisJY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3RlcigmdTMwMF9jbG9ja2V2ZW50X2RhdGEuY2V2ZCwgcmF0ZSwKKwkJCQkJMSwgMHhmZmZmZmZmZik7CisKKwkvKgorCSAqIFRPRE86IGluaXQgYW5kIHJlZ2lzdGVyIHRoZSByZXN0IG9mIHRoZSB0aW1lcnMgdG9vLCB0aGV5IGNhbiBiZQorCSAqIHVzZWQgYnkgaHJ0aW1lcnMhCisJICovCit9CisKK0NMT0NLU09VUkNFX09GX0RFQ0xBUkUodTMwMF90aW1lciwgInN0ZXJpY3Nzb24sdTMwMC1hcHB0aW1lciIsCisJCSAgICAgICB1MzAwX3RpbWVyX2luaXRfb2YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS92Zl9waXRfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdmZfcGl0X3RpbWVyLmMKaW5kZXggMDI4MjFiMC4uYTkxOGJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS92Zl9waXRfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3ZmX3BpdF90aW1lci5jCkBAIC01NCw3ICs1NCw3IEBACiAKIHN0YXRpYyB1NjQgcGl0X3JlYWRfc2NoZWRfY2xvY2sodm9pZCkKIHsKLQlyZXR1cm4gX19yYXdfcmVhZGwoY2xrc3JjX2Jhc2UgKyBQSVRDVkFMKTsKKwlyZXR1cm4gfl9fcmF3X3JlYWRsKGNsa3NyY19iYXNlICsgUElUQ1ZBTCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBpdF9jbG9ja3NvdXJjZV9pbml0KHVuc2lnbmVkIGxvbmcgcmF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwppbmRleCAxOGM1YjliLi4xNDhkNzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCkBAIC05NSw3ICs5NSw3IEBACiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KIAkvKiAgSWYgY25fbmV0bGlua19zZW5kKCkgZmFpbGVkLCB0aGUgZGF0YSBpcyBub3Qgc2VudCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19leGVjX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCkBAIC0xMjIsNyArMTIyLDcgQEAKIAltc2ctPmFjayA9IDA7IC8qIG5vdCB1c2VkICovCiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KLQljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOwogfQogCiB2b2lkIHByb2NfaWRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHdoaWNoX2lkKQpAQCAtMTYzLDcgKzE2Myw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX3NpZF9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMTkwLDcgKzE5MCw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX3B0cmFjZV9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcHRyYWNlX2lkKQpAQCAtMjI1LDcgKzIyNSw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX2NvbW1fY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTI1Myw3ICsyNTMsNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19jb3JlZHVtcF9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMjgwLDcgKzI4MCw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX2V4aXRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTMwOSw3ICszMDksNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIC8qCkBAIC0zNDMsNyArMzQzLDcgQEAKIAltc2ctPmFjayA9IHJjdmRfYWNrICsgMTsKIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwppbmRleCBhMzY3NDlmLi43N2FmZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwpAQCAtNTAsNyArNTAsNyBAQAogICoKICAqIFNlcXVlbmNlIG51bWJlciBpcyBpbmNyZW1lbnRlZCB3aXRoIGVhY2ggbWVzc2FnZSB0byBiZSBzZW50LgogICoKLSAqIElmIHdlIGV4cGVjdCByZXBseSB0byBvdXIgbWVzc2FnZSB0aGVuIHRoZSBzZXF1ZW5jZSBudW1iZXIgaW4KKyAqIElmIHdlIGV4cGVjdCBhIHJlcGx5IHRvIG91ciBtZXNzYWdlIHRoZW4gdGhlIHNlcXVlbmNlIG51bWJlciBpbgogICogcmVjZWl2ZWQgbWVzc2FnZSBNVVNUIGJlIHRoZSBzYW1lIGFzIGluIG9yaWdpbmFsIG1lc3NhZ2UsIGFuZAogICogYWNrbm93bGVkZ2UgbnVtYmVyIE1VU1QgYmUgdGhlIHNhbWUgKyAxLgogICoKQEAgLTYyLDggKzYyLDExIEBACiAgKiB0aGUgYWNrbm93bGVkZ2VtZW50IG51bWJlciBpbiB0aGUgb3JpZ2luYWwgbWVzc2FnZSArIDEsIHRoZW4gaXQgaXMKICAqIGEgbmV3IG1lc3NhZ2UuCiAgKgorICogVGhlIG1lc3NhZ2UgaXMgc2VudCB0bywgdGhlIHBvcnRpZCBpZiBnaXZlbiwgdGhlIGdyb3VwIGlmIGdpdmVuLCBib3RoIGlmCisgKiBib3RoLCBvciBpZiBib3RoIGFyZSB6ZXJvIHRoZW4gdGhlIGdyb3VwIGlzIGxvb2tlZCB1cCBhbmQgc2VudCB0aGVyZS4KICAqLwotaW50IGNuX25ldGxpbmtfc2VuZChzdHJ1Y3QgY25fbXNnICptc2csIHUzMiBfX2dyb3VwLCBnZnBfdCBnZnBfbWFzaykKK2ludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgX19ncm91cCwKKwlnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgY25fY2FsbGJhY2tfZW50cnkgKl9fY2JxOwogCXVuc2lnbmVkIGludCBzaXplOwpAQCAtNzQsNyArNzcsOSBAQAogCXUzMiBncm91cCA9IDA7CiAJaW50IGZvdW5kID0gMDsKIAotCWlmICghX19ncm91cCkgeworCWlmIChwb3J0aWQgfHwgX19ncm91cCkgeworCQlncm91cCA9IF9fZ3JvdXA7CisJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrX2JoKCZkZXYtPmNiZGV2LT5xdWV1ZV9sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2NicSwgJmRldi0+Y2JkZXYtPnF1ZXVlX2xpc3QsCiAJCQkJICAgIGNhbGxiYWNrX2VudHJ5KSB7CkBAIC04OCwxMSArOTMsOSBAQAogCiAJCWlmICghZm91bmQpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UgewotCQlncm91cCA9IF9fZ3JvdXA7CiAJfQogCi0JaWYgKCFuZXRsaW5rX2hhc19saXN0ZW5lcnMoZGV2LT5ubHMsIGdyb3VwKSkKKwlpZiAoIXBvcnRpZCAmJiAhbmV0bGlua19oYXNfbGlzdGVuZXJzKGRldi0+bmxzLCBncm91cCkpCiAJCXJldHVybiAtRVNSQ0g7CiAKIAlzaXplID0gc2l6ZW9mKCptc2cpICsgbXNnLT5sZW47CkBAIC0xMTMsNyArMTE2LDEwIEBACiAKIAlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gZ3JvdXA7CiAKLQlyZXR1cm4gbmV0bGlua19icm9hZGNhc3QoZGV2LT5ubHMsIHNrYiwgMCwgZ3JvdXAsIGdmcF9tYXNrKTsKKwlpZiAoZ3JvdXApCisJCXJldHVybiBuZXRsaW5rX2Jyb2FkY2FzdChkZXYtPm5scywgc2tiLCBwb3J0aWQsIGdyb3VwLAorCQkJCQkgZ2ZwX21hc2spOworCXJldHVybiBuZXRsaW5rX3VuaWNhc3QoZGV2LT5ubHMsIHNrYiwgcG9ydGlkLCAhKGdmcF9tYXNrJl9fR0ZQX1dBSVQpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNuX25ldGxpbmtfc2VuZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IGViMjE0ZDguLmVjYWFlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHV0aW1lLmg+CiAKIHN0YXRpYyBzcGlubG9ja190IGNwdWZyZXFfc3RhdHNfbG9jazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYyBiL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMKaW5kZXggZTk1MjkzNi4uY2I2NjU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkID0gJnBlcl9jcHUoY3B1aWRsZV9jb3VwbGVkX3Bva2VfY2IsIGNwdSk7CiAKIAlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfc2V0X2NwdShjcHUsICZjcHVpZGxlX2NvdXBsZWRfcG9rZV9wZW5kaW5nKSkKLQkJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBjc2QsIDApOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoY3B1LCBjc2QpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYwppbmRleCA3OGZkMTc0Li43MTlmNmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCkBAIC0xMSw5ICsxMSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcnVubGF0Y2guaD4KKworLyogRmxhZ3MgYW5kIGNvbnN0YW50cyB1c2VkIGluIFBvd2VyTlYgcGxhdGZvcm0gKi8KKworI2RlZmluZSBNQVhfUE9XRVJOVl9JRExFX1NUQVRFUwk4CisjZGVmaW5lIElETEVfVVNFX0lOU1RfTkFQCTB4MDAwMTAwMDAgLyogVXNlIG5hcCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBJRExFX1VTRV9JTlNUX1NMRUVQCTB4MDAwMjAwMDAgLyogVXNlIHNsZWVwIGluc3RydWN0aW9uICovCiAKIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBwb3dlcm52X2lkbGVfZHJpdmVyID0gewogCS5uYW1lICAgICAgICAgICAgID0gInBvd2VybnZfaWRsZSIsCkBAIC0zMCwxMiArMzksMTQgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAKKwlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKIAl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCUhNVF9sb3coKTsKIAkJSE1UX3ZlcnlfbG93KCk7CiAJfQogCiAJSE1UX21lZGl1bSgpOworCXBwYzY0X3J1bmxhdGNoX29uKCk7CiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAlzbXBfbWIoKTsKIAlyZXR1cm4gaW5kZXg7CkBAIC00NSwxNCArNTYsNDIgQEAKIAkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAogCQkJaW50IGluZGV4KQogeworCXBwYzY0X3J1bmxhdGNoX29mZigpOwogCXBvd2VyN19pZGxlKCk7CisJcHBjNjRfcnVubGF0Y2hfb24oKTsKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgZmFzdHNsZWVwX2xvb3Aoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJaW50IGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgb2xkX2xwY3IgPSBtZnNwcihTUFJOX0xQQ1IpOworCXVuc2lnbmVkIGxvbmcgbmV3X2xwY3I7CisKKwlpZiAodW5saWtlbHkoc3lzdGVtX3N0YXRlIDwgU1lTVEVNX1JVTk5JTkcpKQorCQlyZXR1cm4gaW5kZXg7CisKKwluZXdfbHBjciA9IG9sZF9scGNyOworCW5ld19scGNyICY9IH4oTFBDUl9NRVIgfCBMUENSX1BFQ0UpOyAvKiBscGNyW21lcl0gbXVzdCBiZSAwICovCisKKwkvKiBleGl0IHBvd2Vyc2F2ZSB1cG9uIGV4dGVybmFsIGludGVycnVwdCwgYnV0IG5vdCBkZWNyZW1lbnRlcgorCSAqIGludGVycnVwdC4KKwkgKi8KKwluZXdfbHBjciB8PSBMUENSX1BFQ0UwOworCisJbXRzcHIoU1BSTl9MUENSLCBuZXdfbHBjcik7CisJcG93ZXI3X3NsZWVwKCk7CisKKwltdHNwcihTUFJOX0xQQ1IsIG9sZF9scGNyKTsKKwogCXJldHVybiBpbmRleDsKIH0KIAogLyoKICAqIFN0YXRlcyBmb3IgZGVkaWNhdGVkIHBhcnRpdGlvbiBjYXNlLgogICovCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgcG93ZXJudl9zdGF0ZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBwb3dlcm52X3N0YXRlc1tNQVhfUE9XRVJOVl9JRExFX1NUQVRFU10gPSB7CiAJeyAvKiBTbm9vemUgKi8KIAkJLm5hbWUgPSAic25vb3plIiwKIAkJLmRlc2MgPSAic25vb3plIiwKQEAgLTYwLDEzICs5OSw2IEBACiAJCS5leGl0X2xhdGVuY3kgPSAwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDAsCiAJCS5lbnRlciA9ICZzbm9vemVfbG9vcCB9LAotCXsgLyogTkFQICovCi0JCS5uYW1lID0gIk5BUCIsCi0JCS5kZXNjID0gIk5BUCIsCi0JCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELAotCQkuZXhpdF9sYXRlbmN5ID0gMTAsCi0JCS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwLAotCQkuZW50ZXIgPSAmbmFwX2xvb3AgfSwKIH07CiAKIHN0YXRpYyBpbnQgcG93ZXJudl9jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLApAQCAtMTI3LDE5ICsxNTksNzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwb3dlcm52X2FkZF9pZGxlX3N0YXRlcyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG93ZXJfbWd0OworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgbnJfaWRsZV9zdGF0ZXMgPSAxOyAvKiBTbm9vemUgKi8KKwlpbnQgZHRfaWRsZV9zdGF0ZXM7CisJdTMyICpmbGFnczsKKwlpbnQgaTsKKworCS8qIEN1cnJlbnRseSB3ZSBoYXZlIHNub296ZSBzdGF0aWNhbGx5IGRlZmluZWQgKi8KKworCXBvd2VyX21ndCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLG9wYWwvcG93ZXItbWd0Iik7CisJaWYgKCFwb3dlcl9tZ3QpIHsKKwkJcHJfd2Fybigib3BhbDogUG93ZXJNZ210IE5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIG5yX2lkbGVfc3RhdGVzOworCX0KKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KHBvd2VyX21ndCwgImlibSxjcHUtaWRsZS1zdGF0ZS1mbGFncyIsIE5VTEwpOworCWlmICghcHJvcCkgeworCQlwcl93YXJuKCJEVC1Qb3dlck1nbXQ6IG1pc3NpbmcgaWJtLGNwdS1pZGxlLXN0YXRlLWZsYWdzXG4iKTsKKwkJcmV0dXJuIG5yX2lkbGVfc3RhdGVzOworCX0KKworCWR0X2lkbGVfc3RhdGVzID0gcHJvcC0+bGVuZ3RoIC8gc2l6ZW9mKHUzMik7CisJZmxhZ3MgPSAodTMyICopIHByb3AtPnZhbHVlOworCisJZm9yIChpID0gMDsgaSA8IGR0X2lkbGVfc3RhdGVzOyBpKyspIHsKKworCQlpZiAoZmxhZ3NbaV0gJiBJRExFX1VTRV9JTlNUX05BUCkgeworCQkJLyogQWRkIE5BUCBzdGF0ZSAqLworCQkJc3RyY3B5KHBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5uYW1lLCAiTmFwIik7CisJCQlzdHJjcHkocG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLmRlc2MsICJOYXAiKTsKKwkJCXBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCQkJcG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLmV4aXRfbGF0ZW5jeSA9IDEwOworCQkJcG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDA7CisJCQlwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10uZW50ZXIgPSAmbmFwX2xvb3A7CisJCQlucl9pZGxlX3N0YXRlcysrOworCQl9CisKKwkJaWYgKGZsYWdzW2ldICYgSURMRV9VU0VfSU5TVF9TTEVFUCkgeworCQkJLyogQWRkIEZBU1RTTEVFUCBzdGF0ZSAqLworCQkJc3RyY3B5KHBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5uYW1lLCAiRmFzdFNsZWVwIik7CisJCQlzdHJjcHkocG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLmRlc2MsICJGYXN0U2xlZXAiKTsKKwkJCXBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5mbGFncyA9CisJCQkJQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQgfCBDUFVJRExFX0ZMQUdfVElNRVJfU1RPUDsKKwkJCXBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5leGl0X2xhdGVuY3kgPSAzMDA7CisJCQlwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwMDA7CisJCQlwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10uZW50ZXIgPSAmZmFzdHNsZWVwX2xvb3A7CisJCQlucl9pZGxlX3N0YXRlcysrOworCQl9CisJfQorCisJcmV0dXJuIG5yX2lkbGVfc3RhdGVzOworfQorCiAvKgogICogcG93ZXJudl9pZGxlX3Byb2JlKCkKICAqIENob29zZSBzdGF0ZSB0YWJsZSBmb3Igc2hhcmVkIHZlcnN1cyBkZWRpY2F0ZWQgcGFydGl0aW9uCiAgKi8KIHN0YXRpYyBpbnQgcG93ZXJudl9pZGxlX3Byb2JlKHZvaWQpCiB7Ci0KIAlpZiAoY3B1aWRsZV9kaXNhYmxlICE9IElETEVfTk9fT1ZFUlJJREUpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYzKSkgewogCQljcHVpZGxlX3N0YXRlX3RhYmxlID0gcG93ZXJudl9zdGF0ZXM7Ci0JCW1heF9pZGxlX3N0YXRlID0gQVJSQVlfU0laRShwb3dlcm52X3N0YXRlcyk7CisJCS8qIERldmljZSB0cmVlIGNhbiBpbmRpY2F0ZSBtb3JlIGlkbGUgc3RhdGVzICovCisJCW1heF9pZGxlX3N0YXRlID0gcG93ZXJudl9hZGRfaWRsZV9zdGF0ZXMoKTsKICAJfSBlbHNlCiAgCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCmluZGV4IDdhYjU2NGEuLjZmN2IwMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wc2VyaWVzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcnVubGF0Y2guaD4KICNpbmNsdWRlIDxhc20vcGxwYXJfd3JhcHBlcnMuaD4KIAogc3RydWN0IGNwdWlkbGVfZHJpdmVyIHBzZXJpZXNfaWRsZV9kcml2ZXIgPSB7CkBAIC0yOSw2ICszMCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGxlX2xvb3BfcHJvbG9nKHVuc2lnbmVkIGxvbmcgKmluX3B1cnIpCiB7CisJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CiAJKmluX3B1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwogCS8qCiAJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQpAQCAtNDUsNiArNDcsMTAgQEAKIAl3YWl0X2N5Y2xlcyArPSBtZnNwcihTUFJOX1BVUlIpIC0gaW5fcHVycjsKIAlnZXRfbHBwYWNhKCktPndhaXRfc3RhdGVfY3ljbGVzID0gY3B1X3RvX2JlNjQod2FpdF9jeWNsZXMpOwogCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7CisKKwlpZiAoaXJxc19kaXNhYmxlZCgpKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcHBjNjRfcnVubGF0Y2hfb24oKTsKIH0KIAogc3RhdGljIGludCBzbm9vemVfbG9vcChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCmluZGV4IDM2NmU2ODQuLmNiMjBmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwpAQCAtMTQxLDEyICsxNDEsMTQgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JdHJhY2VfY3B1X2lkbGVfcmN1aWRsZShuZXh0X3N0YXRlLCBkZXYtPmNwdSk7Ci0KIAlicm9hZGNhc3QgPSAhIShkcnYtPnN0YXRlc1tuZXh0X3N0YXRlXS5mbGFncyAmIENQVUlETEVfRkxBR19USU1FUl9TVE9QKTsKIAotCWlmIChicm9hZGNhc3QpCi0JCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwgJmRldi0+Y3B1KTsKKwlpZiAoYnJvYWRjYXN0ICYmCisJICAgIGNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwgJmRldi0+Y3B1KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZShuZXh0X3N0YXRlLCBkZXYtPmNwdSk7CiAKIAlpZiAoY3B1aWRsZV9zdGF0ZV9pc19jb3VwbGVkKGRldiwgZHJ2LCBuZXh0X3N0YXRlKSkKIAkJZW50ZXJlZF9zdGF0ZSA9IGNwdWlkbGVfZW50ZXJfc3RhdGVfY291cGxlZChkZXYsIGRydiwKQEAgLTE1NCwxMSArMTU2LDExIEBACiAJZWxzZQogCQllbnRlcmVkX3N0YXRlID0gY3B1aWRsZV9lbnRlcl9zdGF0ZShkZXYsIGRydiwgbmV4dF9zdGF0ZSk7CiAKKwl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKFBXUl9FVkVOVF9FWElULCBkZXYtPmNwdSk7CisKIAlpZiAoYnJvYWRjYXN0KQogCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVCwgJmRldi0+Y3B1KTsKIAotCXRyYWNlX2NwdV9pZGxlX3JjdWlkbGUoUFdSX0VWRU5UX0VYSVQsIGRldi0+Y3B1KTsKLQogCS8qIGdpdmUgdGhlIGdvdmVybm9yIGFuIG9wcG9ydHVuaXR5IHRvIHJlZmxlY3Qgb24gdGhlIG91dGNvbWUgKi8KIAlpZiAoY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KQogCQljcHVpZGxlX2N1cnJfZ292ZXJub3ItPnJlZmxlY3QoZGV2LCBlbnRlcmVkX3N0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCmluZGV4IDk4ZTE0ZWUuLmY4YmYwMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwpAQCAtMTIzOSw5ICsxMjM5LDE3IEBACiAJaWYgKG51bV9kY3RzX2ludGx2ID09IDIpIHsKIAkJc2VsZWN0ID0gKHN5c19hZGRyID4+IDgpICYgMHgzOwogCQljaGFubmVsID0gc2VsZWN0ID8gMHgzIDogMDsKLQl9IGVsc2UgaWYgKG51bV9kY3RzX2ludGx2ID09IDQpCi0JCWNoYW5uZWwgPSAoc3lzX2FkZHIgPj4gOCkgJiAweDc7Ci0KKwl9IGVsc2UgaWYgKG51bV9kY3RzX2ludGx2ID09IDQpIHsKKwkJdTggaW50bHZfYWRkciA9IGRjdF9zZWxfaW50ZXJsZWF2ZV9hZGRyKHB2dCk7CisJCXN3aXRjaCAoaW50bHZfYWRkcikgeworCQljYXNlIDB4NDoKKwkJCWNoYW5uZWwgPSAoc3lzX2FkZHIgPj4gOCkgJiAweDM7CisJCQlicmVhazsKKwkJY2FzZSAweDU6CisJCQljaGFubmVsID0gKHN5c19hZGRyID4+IDkpICYgMHgzOworCQkJYnJlYWs7CisJCX0KKwl9CiAJcmV0dXJuIGNoYW5uZWw7CiB9CiAKQEAgLTE3OTksNiArMTgwNywxNyBAQAogCQkJLnJlYWRfZGN0X3BjaV9jZmcJPSBmMTBfcmVhZF9kY3RfcGNpX2NmZywKIAkJfQogCX0sCisJW0YxNl9NMzBIX0NQVVNdID0geworCQkuY3RsX25hbWUgPSAiRjE2aF9NMzBoIiwKKwkJLmYxX2lkID0gUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjEsCisJCS5mM19pZCA9IFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YzLAorCQkub3BzID0geworCQkJLmVhcmx5X2NoYW5uZWxfY291bnQJPSBmMXhfZWFybHlfY2hhbm5lbF9jb3VudCwKKwkJCS5tYXBfc3lzYWRkcl90b19jc3Jvdwk9IGYxeF9tYXBfc3lzYWRkcl90b19jc3JvdywKKwkJCS5kYmFtX3RvX2NzCQk9IGYxNl9kYmFtX3RvX2NoaXBfc2VsZWN0LAorCQkJLnJlYWRfZGN0X3BjaV9jZmcJPSBmMTBfcmVhZF9kY3RfcGNpX2NmZywKKwkJfQorCX0sCiB9OwogCiAvKgpAQCAtMjU3OCw2ICsyNTk3LDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSAweDE2OgorCQlpZiAocHZ0LT5tb2RlbCA9PSAweDMwKSB7CisJCQlmYW1fdHlwZSA9ICZmYW1pbHlfdHlwZXNbRjE2X00zMEhfQ1BVU107CisJCQlwdnQtPm9wcyA9ICZmYW1pbHlfdHlwZXNbRjE2X00zMEhfQ1BVU10ub3BzOworCQkJYnJlYWs7CisJCX0KIAkJZmFtX3R5cGUJPSAmZmFtaWx5X3R5cGVzW0YxNl9DUFVTXTsKIAkJcHZ0LT5vcHMJPSAmZmFtaWx5X3R5cGVzW0YxNl9DUFVTXS5vcHM7CiAJCWJyZWFrOwpAQCAtMjgzMCw2ICsyODU0LDE0IEBACiAJCS5jbGFzcwkJPSAwLAogCQkuY2xhc3NfbWFzawk9IDAsCiAJfSwKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9BTUQsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjIsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmNsYXNzCQk9IDAsCisJCS5jbGFzc19tYXNrCT0gMCwKKwl9LAogCiAJezAsIH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaAppbmRleCA2ZGMxZmNjLi5kOTAzZTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKQEAgLTE2OCw2ICsxNjgsOCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTkJfRjIJMHgxNjAyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9OQl9GMQkweDE1MzEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX05CX0YyCTB4MTUzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GMSAweDE1ODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjIgMHgxNTgyCiAKIC8qCiAgKiBGdW5jdGlvbiAxIC0gQWRkcmVzcyBNYXAKQEAgLTMwMCw2ICszMDIsNyBAQAogCUYxNV9DUFVTLAogCUYxNV9NMzBIX0NQVVMsCiAJRjE2X0NQVVMsCisJRjE2X00zMEhfQ1BVUywKIAlOVU1fRkFNSUxJRVMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kODExMV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvYW1kODExMV9lZGFjLmMKaW5kZXggZGRkODkwMC4uMmI2M2Y3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2FtZDgxMTFfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ4MTExX2VkYWMuYwpAQCAtMzUwLDYgKzM1MCw3IEBACiAJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBhbWQ4MTExX2Rldl9pbmZvICpkZXZfaW5mbyA9ICZhbWQ4MTExX2RldmljZXNbaWQtPmRyaXZlcl9kYXRhXTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKIAogCWRldl9pbmZvLT5kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FNRCwKIAkJCQkJZGV2X2luZm8tPmVycl9kZXYsIE5VTEwpOwpAQCAtMzU5LDE2ICszNjAsMTUgQEAKIAkJCSJ2ZW5kb3IgJXgsIGRldmljZSAleCwgbmFtZSAlc1xuIiwKIAkJCVBDSV9WRU5ET1JfSURfQU1ELCBkZXZfaW5mby0+ZXJyX2RldiwKIAkJCWRldl9pbmZvLT5jdGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycjsKIAl9CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2X2luZm8tPmRldikpIHsKLQkJcGNpX2Rldl9wdXQoZGV2X2luZm8tPmRldik7CiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGVuYWJsZToiCiAJCQkidmVuZG9yICV4LCBkZXZpY2UgJXgsIG5hbWUgJXNcbiIsCiAJCQlQQ0lfVkVORE9SX0lEX0FNRCwgZGV2X2luZm8tPmVycl9kZXYsCiAJCQlkZXZfaW5mby0+Y3RsX25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnJfZGV2X3B1dDsKIAl9CiAKIAkvKgpAQCAtMzgxLDggKzM4MSwxMCBAQAogCQllZGFjX2RldmljZV9hbGxvY19jdGxfaW5mbygwLCBkZXZfaW5mby0+Y3RsX25hbWUsIDEsCiAJCQkJCSAgIE5VTEwsIDAsIDAsCiAJCQkJCSAgIE5VTEwsIDAsIGRldl9pbmZvLT5lZGFjX2lkeCk7Ci0JaWYgKCFkZXZfaW5mby0+ZWRhY19kZXYpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghZGV2X2luZm8tPmVkYWNfZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rldl9wdXQ7CisJfQogCiAJZGV2X2luZm8tPmVkYWNfZGV2LT5wdnRfaW5mbyA9IGRldl9pbmZvOwogCWRldl9pbmZvLT5lZGFjX2Rldi0+ZGV2ID0gJmRldl9pbmZvLT5kZXYtPmRldjsKQEAgLTM5OSw4ICs0MDEsNyBAQAogCWlmIChlZGFjX2RldmljZV9hZGRfZGV2aWNlKGRldl9pbmZvLT5lZGFjX2RldikgPiAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGFkZCBlZGFjX2RldiBmb3IgJXNcbiIsCiAJCQlkZXZfaW5mby0+Y3RsX25hbWUpOwotCQllZGFjX2RldmljZV9mcmVlX2N0bF9pbmZvKGRldl9pbmZvLT5lZGFjX2Rldik7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycl9lZGFjX2ZyZWVfY3RsOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gImFkZGVkIG9uZSBlZGFjX2RldiBvbiBBTUQ4MTExICIKQEAgLTQwOSw2ICs0MTAsMTMgQEAKIAkJZGV2X2luZm8tPmN0bF9uYW1lKTsKIAogCXJldHVybiAwOworCitlcnJfZWRhY19mcmVlX2N0bDoKKwllZGFjX2RldmljZV9mcmVlX2N0bF9pbmZvKGRldl9pbmZvLT5lZGFjX2Rldik7CitlcnJfZGV2X3B1dDoKKwlwY2lfZGV2X3B1dChkZXZfaW5mby0+ZGV2KTsKK2VycjoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhbWQ4MTExX2Rldl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKQEAgLTQzNyw2ICs0NDUsNyBAQAogCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYW1kODExMV9wY2lfaW5mbyAqcGNpX2luZm8gPSAmYW1kODExMV9wY2lzW2lkLT5kcml2ZXJfZGF0YV07CisJaW50IHJldCA9IC1FTk9ERVY7CiAKIAlwY2lfaW5mby0+ZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsCiAJCQkJCXBjaV9pbmZvLT5lcnJfZGV2LCBOVUxMKTsKQEAgLTQ0NiwxNiArNDU1LDE1IEBACiAJCQkidmVuZG9yICV4LCBkZXZpY2UgJXgsIG5hbWUgJXNcbiIsCiAJCQlQQ0lfVkVORE9SX0lEX0FNRCwgcGNpX2luZm8tPmVycl9kZXYsCiAJCQlwY2lfaW5mby0+Y3RsX25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnI7CiAJfQogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9pbmZvLT5kZXYpKSB7Ci0JCXBjaV9kZXZfcHV0KHBjaV9pbmZvLT5kZXYpOwogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBlbmFibGU6IgogCQkJInZlbmRvciAleCwgZGV2aWNlICV4LCBuYW1lICVzXG4iLAogCQkJUENJX1ZFTkRPUl9JRF9BTUQsIHBjaV9pbmZvLT5lcnJfZGV2LAogCQkJcGNpX2luZm8tPmN0bF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZXJyX2Rldl9wdXQ7CiAJfQogCiAJLyoKQEAgLTQ2NSw4ICs0NzMsMTAgQEAKIAkqLwogCXBjaV9pbmZvLT5lZGFjX2lkeCA9IGVkYWNfcGNpX2FsbG9jX2luZGV4KCk7CiAJcGNpX2luZm8tPmVkYWNfZGV2ID0gZWRhY19wY2lfYWxsb2NfY3RsX2luZm8oMCwgcGNpX2luZm8tPmN0bF9uYW1lKTsKLQlpZiAoIXBjaV9pbmZvLT5lZGFjX2RldikKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFwY2lfaW5mby0+ZWRhY19kZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGV2X3B1dDsKKwl9CiAKIAlwY2lfaW5mby0+ZWRhY19kZXYtPnB2dF9pbmZvID0gcGNpX2luZm87CiAJcGNpX2luZm8tPmVkYWNfZGV2LT5kZXYgPSAmcGNpX2luZm8tPmRldi0+ZGV2OwpAQCAtNDgzLDggKzQ5Myw3IEBACiAJaWYgKGVkYWNfcGNpX2FkZF9kZXZpY2UocGNpX2luZm8tPmVkYWNfZGV2LCBwY2lfaW5mby0+ZWRhY19pZHgpID4gMCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBhZGQgZWRhY19wY2kgZm9yICVzXG4iLAogCQkJcGNpX2luZm8tPmN0bF9uYW1lKTsKLQkJZWRhY19wY2lfZnJlZV9jdGxfaW5mbyhwY2lfaW5mby0+ZWRhY19kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnJfZWRhY19mcmVlX2N0bDsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJhZGRlZCBvbmUgZWRhY19wY2kgb24gQU1EODExMSAiCkBAIC00OTMsNiArNTAyLDEzIEBACiAJCXBjaV9pbmZvLT5jdGxfbmFtZSk7CiAKIAlyZXR1cm4gMDsKKworZXJyX2VkYWNfZnJlZV9jdGw6CisJZWRhY19wY2lfZnJlZV9jdGxfaW5mbyhwY2lfaW5mby0+ZWRhY19kZXYpOworZXJyX2Rldl9wdXQ6CisJcGNpX2Rldl9wdXQocGNpX2luZm8tPmRldik7CitlcnI6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYW1kODExMV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYwppbmRleCA5MmQ1NGZhLi5iMmQ3MTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lNzUyeF9lZGFjLmMKQEAgLTIwOSw3ICsyMDksNiBAQAogICovCiAKIHN0cnVjdCBlNzUyeF9wdnQgewotCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfY2s7CiAJc3RydWN0IHBjaV9kZXYgKmRldl9kMGYwOwogCXN0cnVjdCBwY2lfZGV2ICpkZXZfZDBmMTsKIAl1MzIgdG9sbTsKQEAgLTg5MSw3ICs4OTAsNyBAQAogCQkJCQlpbmZvLT5idWZfZmVycik7CiAKIAkJaWYgKGluZm8tPmRyYW1fZmVycikKLQkJCXBjaV93cml0ZV9iaXRzMTYocHZ0LT5icmlkZ2VfY2ssIEU3NTJYX0RSQU1fRkVSUiwKKwkJCXBjaV93cml0ZV9iaXRzMTYocHZ0LT5kZXZfZDBmMSwgRTc1MlhfRFJBTV9GRVJSLAogCQkJCQkgaW5mby0+ZHJhbV9mZXJyLCBpbmZvLT5kcmFtX2ZlcnIpOwogCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBFNzUyWF9GRVJSX0dMT0JBTCwKQEAgLTkzNiw3ICs5MzUsNyBAQAogCQkJCQlpbmZvLT5idWZfbmVycik7CiAKIAkJaWYgKGluZm8tPmRyYW1fbmVycikKLQkJCXBjaV93cml0ZV9iaXRzMTYocHZ0LT5icmlkZ2VfY2ssIEU3NTJYX0RSQU1fTkVSUiwKKwkJCXBjaV93cml0ZV9iaXRzMTYocHZ0LT5kZXZfZDBmMSwgRTc1MlhfRFJBTV9ORVJSLAogCQkJCQkgaW5mby0+ZHJhbV9uZXJyLCBpbmZvLT5kcmFtX25lcnIpOwogCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBFNzUyWF9ORVJSX0dMT0JBTCwKQEAgLTExNzcsMzggKzExNzYsMzMgQEAKIHN0YXRpYyBpbnQgZTc1MnhfZ2V0X2RldnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBkZXZfaWR4LAogCQkJc3RydWN0IGU3NTJ4X3B2dCAqcHZ0KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJcHZ0LT5kZXZfZDBmMSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJcHZ0LT5kZXZfaW5mby0+ZXJyX2RldiwgTlVMTCk7CiAKLQlwdnQtPmJyaWRnZV9jayA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCQkJcHZ0LT5kZXZfaW5mby0+ZXJyX2RldiwgcHZ0LT5icmlkZ2VfY2spOwotCi0JaWYgKHB2dC0+YnJpZGdlX2NrID09IE5VTEwpIHsKLQkJcHZ0LT5icmlkZ2VfY2sgPSBwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKHBkZXYtPmJ1cywKKwlpZiAocHZ0LT5kZXZfZDBmMSA9PSBOVUxMKSB7CisJCXB2dC0+ZGV2X2QwZjEgPSBwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKHBkZXYtPmJ1cywKIAkJCQkJCQlQQ0lfREVWRk4oMCwgMSkpOwotCQlwY2lfZGV2X2dldChwdnQtPmJyaWRnZV9jayk7CisJCXBjaV9kZXZfZ2V0KHB2dC0+ZGV2X2QwZjEpOwogCX0KIAotCWlmIChwdnQtPmJyaWRnZV9jayA9PSBOVUxMKSB7CisJaWYgKHB2dC0+ZGV2X2QwZjEgPT0gTlVMTCkgewogCQllNzUyeF9wcmludGsoS0VSTl9FUlIsICJlcnJvciByZXBvcnRpbmcgZGV2aWNlIG5vdCBmb3VuZDoiCiAJCQkidmVuZG9yICV4IGRldmljZSAweCV4IChicm9rZW4gQklPUz8pXG4iLAogCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgZTc1MnhfZGV2c1tkZXZfaWR4XS5lcnJfZGV2KTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwlwdnQtPmRldl9kMGYwID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJCQllNzUyeF9kZXZzW2Rldl9pZHhdLmN0bF9kZXYsCiAJCQkJTlVMTCk7CiAKLQlpZiAoZGV2ID09IE5VTEwpCisJaWYgKHB2dC0+ZGV2X2QwZjAgPT0gTlVMTCkKIAkJZ290byBmYWlsOwogCi0JcHZ0LT5kZXZfZDBmMCA9IGRldjsKLQlwdnQtPmRldl9kMGYxID0gcGNpX2Rldl9nZXQocHZ0LT5icmlkZ2VfY2spOwotCiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JcGNpX2Rldl9wdXQocHZ0LT5icmlkZ2VfY2spOworCXBjaV9kZXZfcHV0KHB2dC0+ZGV2X2QwZjEpOwogCXJldHVybiAxOwogfQogCkBAIC0xMzg1LDcgKzEzNzksNiBAQAogZmFpbDoKIAlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYwKTsKIAlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYxKTsKLQlwY2lfZGV2X3B1dChwdnQtPmJyaWRnZV9jayk7CiAJZWRhY19tY19mcmVlKG1jaSk7CiAKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0MTksNyArMTQxMiw2IEBACiAJcHZ0ID0gKHN0cnVjdCBlNzUyeF9wdnQgKiltY2ktPnB2dF9pbmZvOwogCXBjaV9kZXZfcHV0KHB2dC0+ZGV2X2QwZjApOwogCXBjaV9kZXZfcHV0KHB2dC0+ZGV2X2QwZjEpOwotCXBjaV9kZXZfcHV0KHB2dC0+YnJpZGdlX2NrKTsKIAllZGFjX21jX2ZyZWUobWNpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2kzMjAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pMzIwMF9lZGFjLmMKaW5kZXggZmExMzI2ZS4uMDIyYTcwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2kzMjAwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTMyMDBfZWRhYy5jCkBAIC00NjQsNiArNDY0LDggQEAKIAlpb3VubWFwKHByaXYtPndpbmRvdyk7CiAKIAllZGFjX21jX2ZyZWUobWNpKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGkzMjAwX3BjaV90YmxbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pNTEwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTUxMDBfZWRhYy5jCmluZGV4IDM2YTM4ZWUuLjYyNDdkMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pNTEwMF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k1MTAwX2VkYWMuYwpAQCAtODY5LDE2ICs4NjksMTMgQEAKIAkJCSAgICAgICBjaGFuLCByYW5rLCAwKTsKIAogCQlkaW1tLT5ucl9wYWdlcyA9IG5wYWdlczsKLQkJaWYgKG5wYWdlcykgewotCQkJZGltbS0+Z3JhaW4gPSAzMjsKLQkJCWRpbW0tPmR0eXBlID0gKHByaXYtPm10cltjaGFuXVtyYW5rXS53aWR0aCA9PSA0KSA/Ci0JCQkJCURFVl9YNCA6IERFVl9YODsKLQkJCWRpbW0tPm10eXBlID0gTUVNX1JERFIyOwotCQkJZGltbS0+ZWRhY19tb2RlID0gRURBQ19TRUNERUQ7Ci0JCQlzbnByaW50ZihkaW1tLT5sYWJlbCwgc2l6ZW9mKGRpbW0tPmxhYmVsKSwKLQkJCQkiRElNTSV1IiwKLQkJCQlpNTEwMF9yYW5rX3RvX3Nsb3QobWNpLCBjaGFuLCByYW5rKSk7Ci0JCX0KKwkJZGltbS0+Z3JhaW4gPSAzMjsKKwkJZGltbS0+ZHR5cGUgPSAocHJpdi0+bXRyW2NoYW5dW3JhbmtdLndpZHRoID09IDQpID8KKwkJCQlERVZfWDQgOiBERVZfWDg7CisJCWRpbW0tPm10eXBlID0gTUVNX1JERFIyOworCQlkaW1tLT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsKKwkJc25wcmludGYoZGltbS0+bGFiZWwsIHNpemVvZihkaW1tLT5sYWJlbCksICJESU1NJXUiLAorCQkJIGk1MTAwX3JhbmtfdG9fc2xvdChtY2ksIGNoYW4sIHJhbmspKTsKIAogCQllZGFjX2RiZygyLCAiZGltbSBjaGFubmVsICVkLCByYW5rICVkLCBzaXplICVsZFxuIiwKIAkJCSBjaGFuLCByYW5rLCAobG9uZylQQUdFU19UT19NaUIobnBhZ2VzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYwppbmRleCBlMDgwY2JmLi41MzgxZTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMKQEAgLTE0MDgsNiArMTQwOCw4IEBACiAJLyogcmV0cmlldmUgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMsIGFuZCBmcmVlIHRob3NlIHJlc291cmNlcyAqLwogCWk1NDAwX3B1dF9kZXZpY2VzKG1jaSk7CiAKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKIAllZGFjX21jX2ZyZWUobWNpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYwppbmRleCBkODcxMjc1Li44YmM4M2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYwpAQCAtMTcwOCw3ICsxNzA4LDcgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IG1jZSAqbSkKIHsKIAlzdHJ1Y3QgaTdjb3JlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKLQljaGFyICp0eXBlLCAqb3B0eXBlLCAqZXJyOworCWNoYXIgKm9wdHlwZSwgKmVycjsKIAllbnVtIGh3X2V2ZW50X21jX2Vycl90eXBlIHRwX2V2ZW50OwogCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSBtLT5zdGF0dXMgJiAweDFmZjAwMDBsOwogCWJvb2wgdW5jb3JyZWN0ZWRfZXJyb3IgPSBtLT5tY2dzdGF0dXMgJiAxbGwgPDwgNjE7CkBAIC0xNzIxLDE1ICsxNzIxLDExIEBACiAJdTMyIGVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZlcnJvciwgMzIpOwogCiAJaWYgKHVuY29ycmVjdGVkX2Vycm9yKSB7Ci0JCWlmIChyaXB2KSB7Ci0JCQl0eXBlID0gIkZBVEFMIjsKKwkJaWYgKHJpcHYpCiAJCQl0cF9ldmVudCA9IEhXX0VWRU5UX0VSUl9GQVRBTDsKLQkJfSBlbHNlIHsKLQkJCXR5cGUgPSAiTk9OX0ZBVEFMIjsKKwkJZWxzZQogCQkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfVU5DT1JSRUNURUQ7Ci0JCX0KIAl9IGVsc2UgewotCQl0eXBlID0gIkNPUlJFQ1RFRCI7CiAJCXRwX2V2ZW50ID0gSFdfRVZFTlRfRVJSX0NPUlJFQ1RFRDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYwppbmRleCA4MDU3M2RmLi44ZDA0NTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCkBAIC00MDYsOCArNDA2LDYgQEAKIAogCWVkYWNfZGJnKDAsICJcbiIpOwogCi0Jb3ZyZmxfcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5EX0RFVihJTlRFTCwgODI4NzVfNiksIE5VTEwpOwotCiAJaWYgKGk4Mjg3NXBfc2V0dXBfb3ZlcmZsX2RldihwZGV2LCAmb3ZyZmxfcGRldiwgJm92cmZsX3dpbmRvdykpCiAJCXJldHVybiAtRU5PREVWOwogCWRyYyA9IHJlYWRsKG92cmZsX3dpbmRvdyArIEk4Mjg3NVBfRFJDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCmluZGV4IDMwZjczMDkuLjUxYjljYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKKysrIGIvZHJpdmVycy9lZGFjL21jZV9hbWQuYwpAQCAtNzQxLDYgKzc0MSwzNiBAQAogCWlmIChhbWRfZmlsdGVyX21jZShtKSkKIAkJcmV0dXJuIE5PVElGWV9TVE9QOwogCisJcHJfZW1lcmcoSFdfRVJSICIlc1xuIiwgZGVjb2RlX2Vycm9yX3N0YXR1cyhtKSk7CisKKwlwcl9lbWVyZyhIV19FUlIgIkNQVTolZCAoJXg6JXg6JXgpIE1DJWRfU1RBVFVTWyVzfCVzfCVzfCVzfCVzIiwKKwkJbS0+ZXh0Y3B1LAorCQljLT54ODYsIGMtPng4Nl9tb2RlbCwgYy0+eDg2X21hc2ssCisJCW0tPmJhbmssCisJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19PVkVSKQk/ICJPdmVyIiAgOiAiLSIpLAorCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfVUMpCT8gIlVFIgkgIDogIkNFIiksCisJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19NSVNDVikJPyAiTWlzY1YiIDogIi0iKSwKKwkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1BDQykJPyAiUENDIgkgIDogIi0iKSwKKwkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQk/ICJBZGRyViIgOiAiLSIpKTsKKworCWlmIChjLT54ODYgPT0gMHgxNSB8fCBjLT54ODYgPT0gMHgxNikKKwkJcHJfY29udCgifCVzfCVzIiwKKwkJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19ERUZFUlJFRCkgPyAiRGVmZXJyZWQiIDogIi0iKSwKKwkJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19QT0lTT04pICAgPyAiUG9pc29uIiAgIDogIi0iKSk7CisKKwkvKiBkbyB0aGUgdHdvIGJpdHNbMTQ6MTNdIHRvZ2V0aGVyICovCisJZWNjID0gKG0tPnN0YXR1cyA+PiA0NSkgJiAweDM7CisJaWYgKGVjYykKKwkJcHJfY29udCgifCVzRUNDIiwgKChlY2MgPT0gMikgPyAiQyIgOiAiVSIpKTsKKworCXByX2NvbnQoIl06IDB4JTAxNmxseFxuIiwgbS0+c3RhdHVzKTsKKworCWlmIChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQorCQlwcl9lbWVyZyhIV19FUlIgIk1DJWRfQUREUjogMHglMDE2bGx4XG4iLCBtLT5iYW5rLCBtLT5hZGRyKTsKKworCWlmICghZmFtX29wcykKKwkJZ290byBlcnJfY29kZTsKKwogCXN3aXRjaCAobS0+YmFuaykgewogCWNhc2UgMDoKIAkJZGVjb2RlX21jMF9tY2UobSk7CkBAIC03NzQsMzMgKzgwNCw3IEBACiAJCWJyZWFrOwogCX0KIAotCXByX2VtZXJnKEhXX0VSUiAiRXJyb3IgU3RhdHVzOiAlc1xuIiwgZGVjb2RlX2Vycm9yX3N0YXR1cyhtKSk7Ci0KLQlwcl9lbWVyZyhIV19FUlIgIkNQVTolZCAoJXg6JXg6JXgpIE1DJWRfU1RBVFVTWyVzfCVzfCVzfCVzfCVzIiwKLQkJbS0+ZXh0Y3B1LAotCQljLT54ODYsIGMtPng4Nl9tb2RlbCwgYy0+eDg2X21hc2ssCi0JCW0tPmJhbmssCi0JCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19PVkVSKQk/ICJPdmVyIiAgOiAiLSIpLAotCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfVUMpCT8gIlVFIgkgIDogIkNFIiksCi0JCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19NSVNDVikJPyAiTWlzY1YiIDogIi0iKSwKLQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1BDQykJPyAiUENDIgkgIDogIi0iKSwKLQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQk/ICJBZGRyViIgOiAiLSIpKTsKLQotCWlmIChjLT54ODYgPT0gMHgxNSB8fCBjLT54ODYgPT0gMHgxNikKLQkJcHJfY29udCgifCVzfCVzIiwKLQkJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19ERUZFUlJFRCkgPyAiRGVmZXJyZWQiIDogIi0iKSwKLQkJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19QT0lTT04pICAgPyAiUG9pc29uIiAgIDogIi0iKSk7Ci0KLQkvKiBkbyB0aGUgdHdvIGJpdHNbMTQ6MTNdIHRvZ2V0aGVyICovCi0JZWNjID0gKG0tPnN0YXR1cyA+PiA0NSkgJiAweDM7Ci0JaWYgKGVjYykKLQkJcHJfY29udCgifCVzRUNDIiwgKChlY2MgPT0gMikgPyAiQyIgOiAiVSIpKTsKLQotCXByX2NvbnQoIl06IDB4JTAxNmxseFxuIiwgbS0+c3RhdHVzKTsKLQotCWlmIChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQotCQlwcl9lbWVyZyhIV19FUlIgIk1DJWRfQUREUjogMHglMDE2bGx4XG4iLCBtLT5iYW5rLCBtLT5hZGRyKTsKLQorIGVycl9jb2RlOgogCWFtZF9kZWNvZGVfZXJyX2NvZGUobS0+c3RhdHVzICYgMHhmZmZmKTsKIAogCXJldHVybiBOT1RJRllfU1RPUDsKQEAgLTgxNiwxMCArODIwLDcgQEAKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKIAogCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKQotCQlyZXR1cm4gMDsKLQotCWlmIChjLT54ODYgPCAweGYgfHwgYy0+eDg2ID4gMHgxNikKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCiAJZmFtX29wcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWRfZGVjb2Rlcl9vcHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZhbV9vcHMpCkBAIC04NzQsNyArODc1LDcgQEAKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9XQVJOSU5HICJIdWg/IFdoYXQgZmFtaWx5IGlzIGl0OiAweCV4PyFcbiIsIGMtPng4Nik7CiAJCWtmcmVlKGZhbV9vcHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZmFtX29wcyA9IE5VTEw7CiAJfQogCiAJcHJfaW5mbygiTUNFOiBJbi1rZXJuZWwgTUNFIGRlY29kaW5nIGVuYWJsZWQuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCA4ZjkxODIxLi5mNGFlYzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJcGRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5kZXYub2Zfbm9kZSwgMCk7CiAJCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoJm9wLT5kZXYsIHBkYXRhLT5pcnEsCiAJCQkJICAgICAgIG1wYzg1eHhfcGNpX2lzciwKLQkJCQkgICAgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCQkJCSAgICAgICBJUlFGX1NIQVJFRCwKIAkJCQkgICAgICAgIltFREFDXSBQQ0kgZXJyIiwgcGNpKTsKIAkJaWYgKHJlcyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtNjMzLDcgKzYzMyw3IEBACiAJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgewogCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKIAkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmb3AtPmRldiwgcGRhdGEtPmlycSwKLQkJCQkgICAgICAgbXBjODV4eF9sMl9pc3IsIElSUUZfRElTQUJMRUQsCisJCQkJICAgICAgIG1wYzg1eHhfbDJfaXNyLCAwLAogCQkJCSAgICAgICAiW0VEQUNdIEwyIGVyciIsIGVkYWNfZGV2KTsKIAkJaWYgKHJlcyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMTEzMyw3ICsxMTMzLDcgQEAKIAkJcGRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5kZXYub2Zfbm9kZSwgMCk7CiAJCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoJm9wLT5kZXYsIHBkYXRhLT5pcnEsCiAJCQkJICAgICAgIG1wYzg1eHhfbWNfaXNyLAotCQkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJCQkJICAgICAgIElSUUZfU0hBUkVELAogCQkJCSAgICAgICAiW0VEQUNdIE1DIGVyciIsIG1jaSk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQgZm9yICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9vY3Rlb25fZWRhYy1sbWMuYyBiL2RyaXZlcnMvZWRhYy9vY3Rlb25fZWRhYy1sbWMuYwppbmRleCA5MzQxMmQ2Li40YmQxMGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvb2N0ZW9uX2VkYWMtbG1jLmMKKysrIGIvZHJpdmVycy9lZGFjL29jdGVvbl9lZGFjLWxtYy5jCkBAIC01LDEyICs1LDE2IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFdpbmQgUml2ZXIgU3lzdGVtcywKICAqICAgd3JpdHRlbiBieSBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGJ5IENpc2NvIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1sbWN4LWRlZnMuaD4KQEAgLTIwLDYgKzI0LDE4IEBACiAKICNkZWZpbmUgT0NURU9OX01BWF9NQyA0CiAKKyNkZWZpbmUgdG9fbWNpKGspIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3QgbWVtX2N0bF9pbmZvLCBkZXYpCisKK3N0cnVjdCBvY3Rlb25fbG1jX3B2dCB7CisJdW5zaWduZWQgbG9uZyBpbmplY3Q7CisJdW5zaWduZWQgbG9uZyBlcnJvcl90eXBlOworCXVuc2lnbmVkIGxvbmcgZGltbTsKKwl1bnNpZ25lZCBsb25nIHJhbms7CisJdW5zaWduZWQgbG9uZyBiYW5rOworCXVuc2lnbmVkIGxvbmcgcm93OworCXVuc2lnbmVkIGxvbmcgY29sOworfTsKKwogc3RhdGljIHZvaWQgb2N0ZW9uX2xtY19lZGFjX3BvbGwoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQogewogCXVuaW9uIGN2bXhfbG1jeF9tZW1fY2ZnMCBjZmcwOwpAQCAtNTUsMTQgKzcxLDMxIEBACiAKIHN0YXRpYyB2b2lkIG9jdGVvbl9sbWNfZWRhY19wb2xsX28yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKIHsKKwlzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CiAJdW5pb24gY3ZteF9sbWN4X2ludCBpbnRfcmVnOwogCWJvb2wgZG9fY2xlYXIgPSBmYWxzZTsKIAljaGFyIG1zZ1s2NF07CiAKLQlpbnRfcmVnLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MTUNYX0lOVChtY2ktPm1jX2lkeCkpOworCWlmICghcHZ0LT5pbmplY3QpCisJCWludF9yZWcudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX0xNQ1hfSU5UKG1jaS0+bWNfaWR4KSk7CisJZWxzZSB7CisJCWlmIChwdnQtPmVycm9yX3R5cGUgPT0gMSkKKwkJCWludF9yZWcucy5zZWNfZXJyID0gMTsKKwkJaWYgKHB2dC0+ZXJyb3JfdHlwZSA9PSAyKQorCQkJaW50X3JlZy5zLmRlZF9lcnIgPSAxOworCX0KKwogCWlmIChpbnRfcmVnLnMuc2VjX2VyciB8fCBpbnRfcmVnLnMuZGVkX2VycikgewogCQl1bmlvbiBjdm14X2xtY3hfZmFkciBmYWRyOwotCQlmYWRyLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MTUNYX0ZBRFIobWNpLT5tY19pZHgpKTsKKwkJaWYgKGxpa2VseSghcHZ0LT5pbmplY3QpKQorCQkJZmFkci51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTE1DWF9GQURSKG1jaS0+bWNfaWR4KSk7CisJCWVsc2UgeworCQkJZmFkci5jbjYxeHguZmRpbW0gPSBwdnQtPmRpbW07CisJCQlmYWRyLmNuNjF4eC5mYnVuayA9IHB2dC0+cmFuazsKKwkJCWZhZHIuY242MXh4LmZiYW5rID0gcHZ0LT5iYW5rOworCQkJZmFkci5jbjYxeHguZnJvdyA9IHB2dC0+cm93OworCQkJZmFkci5jbjYxeHguZmNvbCA9IHB2dC0+Y29sOworCQl9CiAJCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCiAJCQkgIkRJTU0gJWQgcmFuayAlZCBiYW5rICVkIHJvdyAlZCBjb2wgJWQiLAogCQkJIGZhZHIuY242MXh4LmZkaW1tLCBmYWRyLmNuNjF4eC5mYnVuaywKQEAgLTgyLDggKzExNSwxMjggQEAKIAkJaW50X3JlZy5zLmRlZF9lcnIgPSAtMTsJLyogRG9uZSwgcmUtYXJtICovCiAJCWRvX2NsZWFyID0gdHJ1ZTsKIAl9Ci0JaWYgKGRvX2NsZWFyKQotCQljdm14X3dyaXRlX2NzcihDVk1YX0xNQ1hfSU5UKG1jaS0+bWNfaWR4KSwgaW50X3JlZy51NjQpOworCisJaWYgKGRvX2NsZWFyKSB7CisJCWlmIChsaWtlbHkoIXB2dC0+aW5qZWN0KSkKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfTE1DWF9JTlQobWNpLT5tY19pZHgpLCBpbnRfcmVnLnU2NCk7CisJCWVsc2UKKwkJCXB2dC0+aW5qZWN0ID0gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogTUMgU1lTRlMgcGFydHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE9ubHkgYSBjb3VwbGUgbmFtaW5nIGRpZmZlcmVuY2VzIHBlciB0ZW1wbGF0ZSwgc28gdmVyeSBzaW1pbGFyICovCisjZGVmaW5lIFRFTVBMQVRFX1NIT1cocmVnKQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IG9jdGVvbl9tY19pbmplY3RfIyNyZWcjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgICAgIGNoYXIgKmRhdGEpCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7CQkJCVwKKwlzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CQkJXAorCXJldHVybiBzcHJpbnRmKGRhdGEsICIlMDE2bGx1XG4iLCAodTY0KXB2dC0+cmVnKTsJCVwKK30KKworI2RlZmluZSBURU1QTEFURV9TVE9SRShyZWcpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgb2N0ZW9uX21jX2luamVjdF8jI3JlZyMjX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7CQkJCVwKKwlzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CQkJXAorCWlmIChpc2RpZ2l0KCpkYXRhKSkgewkJCQkJCVwKKwkJaWYgKCFrc3RydG91bChkYXRhLCAwLCAmcHZ0LT5yZWcpKQkJCVwKKwkJCXJldHVybiBjb3VudDsJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworVEVNUExBVEVfU0hPVyhpbmplY3QpOworVEVNUExBVEVfU1RPUkUoaW5qZWN0KTsKK1RFTVBMQVRFX1NIT1coZGltbSk7CitURU1QTEFURV9TVE9SRShkaW1tKTsKK1RFTVBMQVRFX1NIT1coYmFuayk7CitURU1QTEFURV9TVE9SRShiYW5rKTsKK1RFTVBMQVRFX1NIT1cocmFuayk7CitURU1QTEFURV9TVE9SRShyYW5rKTsKK1RFTVBMQVRFX1NIT1cocm93KTsKK1RFTVBMQVRFX1NUT1JFKHJvdyk7CitURU1QTEFURV9TSE9XKGNvbCk7CitURU1QTEFURV9TVE9SRShjb2wpOworCitzdGF0aWMgc3NpemVfdCBvY3Rlb25fbWNfaW5qZWN0X2Vycm9yX3R5cGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmRhdGEsCisJCQkJCSAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBvY3Rlb25fbG1jX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCWlmICghc3RybmNtcChkYXRhLCAic2luZ2xlIiwgNikpCisJCXB2dC0+ZXJyb3JfdHlwZSA9IDE7CisJZWxzZSBpZiAoIXN0cm5jbXAoZGF0YSwgImRvdWJsZSIsIDYpKQorCQlwdnQtPmVycm9yX3R5cGUgPSAyOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBvY3Rlb25fbWNfaW5qZWN0X2Vycm9yX3R5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7CisJc3RydWN0IG9jdGVvbl9sbWNfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCWlmIChwdnQtPmVycm9yX3R5cGUgPT0gMSkKKwkJcmV0dXJuIHNwcmludGYoZGF0YSwgInNpbmdsZSIpOworCWVsc2UgaWYgKHB2dC0+ZXJyb3JfdHlwZSA9PSAyKQorCQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiZG91YmxlIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGluamVjdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG9jdGVvbl9tY19pbmplY3RfaW5qZWN0X3Nob3csIG9jdGVvbl9tY19pbmplY3RfaW5qZWN0X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihlcnJvcl90eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgb2N0ZW9uX21jX2luamVjdF9lcnJvcl90eXBlX3Nob3csIG9jdGVvbl9tY19pbmplY3RfZXJyb3JfdHlwZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGltbSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG9jdGVvbl9tY19pbmplY3RfZGltbV9zaG93LCBvY3Rlb25fbWNfaW5qZWN0X2RpbW1fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHJhbmssIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBvY3Rlb25fbWNfaW5qZWN0X3Jhbmtfc2hvdywgb2N0ZW9uX21jX2luamVjdF9yYW5rX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5rLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgb2N0ZW9uX21jX2luamVjdF9iYW5rX3Nob3csIG9jdGVvbl9tY19pbmplY3RfYmFua19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocm93LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgb2N0ZW9uX21jX2luamVjdF9yb3dfc2hvdywgb2N0ZW9uX21jX2luamVjdF9yb3dfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGNvbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG9jdGVvbl9tY19pbmplY3RfY29sX3Nob3csIG9jdGVvbl9tY19pbmplY3RfY29sX3N0b3JlKTsKKworCitzdGF0aWMgaW50IG9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJaW50IHJjOworCisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfZXJyb3JfdHlwZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2RpbW0pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9yYW5rKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfYmFuayk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX3Jvdyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2NvbCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgb2N0ZW9uX2xtY19lZGFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC05Miw2ICsyNDUsOCBAQAogCXN0cnVjdCBlZGFjX21jX2xheWVyIGxheWVyc1sxXTsKIAlpbnQgbWMgPSBwZGV2LT5pZDsKIAorCW9wc3RhdGVfaW5pdCgpOworCiAJbGF5ZXJzWzBdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NIQU5ORUw7CiAJbGF5ZXJzWzBdLnNpemUgPSAxOwogCWxheWVyc1swXS5pc192aXJ0X2Nzcm93ID0gZmFsc2U7CkBAIC0xMDUsNyArMjYwLDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJbWNpID0gZWRhY19tY19hbGxvYyhtYywgQVJSQVlfU0laRShsYXllcnMpLCBsYXllcnMsIDApOworCQltY2kgPSBlZGFjX21jX2FsbG9jKG1jLCBBUlJBWV9TSVpFKGxheWVycyksIGxheWVycywgc2l6ZW9mKHN0cnVjdCBvY3Rlb25fbG1jX3B2dCkpOwogCQlpZiAoIW1jaSkKIAkJCXJldHVybiAtRU5YSU87CiAKQEAgLTEyMiw2ICsyNzcsMTIgQEAKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KIAorCQlpZiAob2N0ZW9uX3NldF9tY19zeXNmc19hdHRyaWJ1dGVzKG1jaSkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcygpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwogCQljZmcwLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MTUNYX01FTV9DRkcwKG1jKSk7CiAJCWNmZzAucy5pbnRyX2RlZF9lbmEgPSAwOwkvKiBXZSBwb2xsICovCiAJCWNmZzAucy5pbnRyX3NlY19lbmEgPSAwOwpAQCAtMTM3LDcgKzI5OCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCW1jaSA9IGVkYWNfbWNfYWxsb2MobWMsIEFSUkFZX1NJWkUobGF5ZXJzKSwgbGF5ZXJzLCAwKTsKKwkJbWNpID0gZWRhY19tY19hbGxvYyhtYywgQVJSQVlfU0laRShsYXllcnMpLCBsYXllcnMsIHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQpKTsKIAkJaWYgKCFtY2kpCiAJCQlyZXR1cm4gLUVOWElPOwogCkBAIC0xNTQsNiArMzE1LDEyIEBACiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAKKwkJaWYgKG9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhtY2kpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvY3Rlb25fc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMoKSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisKIAkJZW4udTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX0xNQ1hfTUVNX0NGRzAobWMpKTsKIAkJZW4ucy5pbnRyX2RlZF9lbmEgPSAwOwkvKiBXZSBwb2xsICovCiAJCWVuLnMuaW50cl9zZWNfZW5hID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCmluZGV4IDU0ZTJhYmUuLjM0N2M3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3NiX2VkYWMuYwpAQCAtMTI2Myw3ICsxMjYzLDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CiAJdTggYnVzID0gMDsKIAotCXNicmlkZ2VfcHJpbnRrKEtFUk5fSU5GTywKKwlzYnJpZGdlX3ByaW50ayhLRVJOX0RFQlVHLAogCQkiU2Vla2luZyBmb3I6IGRldiAlMDJ4LiVkIFBDSSBJRCAlMDR4OiUwNHhcbiIsCiAJCWRldl9kZXNjci0+ZGV2LCBkZXZfZGVzY3ItPmZ1bmMsCiAJCVBDSV9WRU5ET1JfSURfSU5URUwsIGRldl9kZXNjci0+ZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL0tjb25maWcgYi9kcml2ZXJzL2V4dGNvbi9LY29uZmlnCmluZGV4IGJkYjVhMDAuLmJlNTZlOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL0tjb25maWcKKysrIGIvZHJpdmVycy9leHRjb24vS2NvbmZpZwpAQCAtMTQsMTAgKzE0LDYgQEAKIAogY29tbWVudCAiRXh0Y29uIERldmljZSBEcml2ZXJzIgogCi1jb25maWcgT0ZfRVhUQ09OCi0JZGVmX3RyaXN0YXRlIHkKLQlkZXBlbmRzIG9uIE9GCi0KIGNvbmZpZyBFWFRDT05fR1BJTwogCXRyaXN0YXRlICJHUElPIGV4dGNvbiBzdXBwb3J0IgogCWRlcGVuZHMgb24gR1BJT0xJQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vTWFrZWZpbGUgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQppbmRleCA0M2VjY2MwLi5iZjc4NjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQpAQCAtMiw4ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIGV4dGVybmFsIGNvbm5lY3RvciBjbGFzcyAoZXh0Y29uKSBkZXZpY2VzCiAjCiAKLW9iai0kKENPTkZJR19PRl9FWFRDT04pCQkrPSBvZl9leHRjb24ubwotCiBvYmotJChDT05GSUdfRVhUQ09OKQkJKz0gZXh0Y29uLWNsYXNzLm8KIG9iai0kKENPTkZJR19FWFRDT05fR1BJTykJKz0gZXh0Y29uLWdwaW8ubwogb2JqLSQoQ09ORklHX0VYVENPTl9BRENfSkFDSykJKz0gZXh0Y29uLWFkYy1qYWNrLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1jbGFzcy5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWNsYXNzLmMKaW5kZXggNzYzMjIzMy4uN2FiMjFhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWNsYXNzLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWNsYXNzLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAvKgogICogZXh0Y29uX2NhYmxlX25hbWUgc3VnZ2VzdHMgdGhlIHN0YW5kYXJkIGNhYmxlIG5hbWVzIGZvciBjb21tb25seSB1c2VkCkBAIC04MTgsNiArODE5LDQ3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZGV2X3VucmVnaXN0ZXIpOwogCisjaWZkZWYgQ09ORklHX09GCisvKgorICogZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUgLSBHZXQgdGhlIGV4dGNvbiBkZXZpY2UgZnJvbSBkZXZpY2V0cmVlCisgKiBAZGV2IC0gaW5zdGFuY2UgdG8gdGhlIGdpdmVuIGRldmljZQorICogQGluZGV4IC0gaW5kZXggaW50byBsaXN0IG9mIGV4dGNvbl9kZXYKKyAqCisgKiByZXR1cm4gdGhlIGluc3RhbmNlIG9mIGV4dGNvbiBkZXZpY2UKKyAqLworc3RydWN0IGV4dGNvbl9kZXYgKmV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldjsKKworCWlmICghZGV2LT5vZl9ub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBkZXZpY2Ugbm9kZSBlbnRyeVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCW5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgImV4dGNvbiIsIGluZGV4KTsKKwlpZiAoIW5vZGUpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBoYW5kbGUgaW4gJXMgbm9kZVxuIiwKKwkJCWRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJZWRldiA9IGV4dGNvbl9nZXRfZXh0Y29uX2Rldihub2RlLT5uYW1lKTsKKwlpZiAoIWVkZXYpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gZ2V0IGV4dGNvbiBkZXZpY2UgOiAlc1xuIiwgbm9kZS0+bmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCXJldHVybiBlZGV2OworfQorI2Vsc2UKK3N0cnVjdCBleHRjb25fZGV2ICpleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKTsKKwogc3RhdGljIGludCBfX2luaXQgZXh0Y29uX2NsYXNzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gY3JlYXRlX2V4dGNvbl9jbGFzcygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMKaW5kZXggYTYzYTZiMi4uMTNkNTIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jCkBAIC0xNzYsOSArMTc2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZ3Bpb19leHRjb25fcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKE5VTEwsIGdwaW9fZXh0Y29uX3Jlc3VtZSkKLX07CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoZ3Bpb19leHRjb25fcG1fb3BzLCBOVUxMLCBncGlvX2V4dGNvbl9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncGlvX2V4dGNvbl9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGdwaW9fZXh0Y29uX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jCmluZGV4IDJhZWE0YmMuLmRkZmYyYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMKQEAgLTI3MSwxMCArMjcxLDcgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBhbG1hc19wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocGFsbWFzX3VzYl9zdXNwZW5kLAotCQkJCXBhbG1hc191c2JfcmVzdW1lKQotfTsKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwYWxtYXNfcG1fb3BzLCBwYWxtYXNfdXNiX3N1c3BlbmQsIHBhbG1hc191c2JfcmVzdW1lKTsKIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfcGFsbWFzX21hdGNoX3RibFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGkscGFsbWFzLXVzYiIsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9vZl9leHRjb24uYyBiL2RyaXZlcnMvZXh0Y29uL29mX2V4dGNvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE3M2VjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZXh0Y29uL29mX2V4dGNvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIE9GIGhlbHBlcnMgZm9yIEV4dGVybmFsIGNvbm5lY3RvciAoZXh0Y29uKSBmcmFtZXdvcmsKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqIEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bGludXgvZXh0Y29uL29mX2V4dGNvbi5oPgotCi0vKgotICogb2ZfZXh0Y29uX2dldF9leHRjb25fZGV2IC0gR2V0IHRoZSBuYW1lIG9mIGV4dGNvbiBkZXZpY2UgZnJvbSBkZXZpY2V0cmVlCi0gKiBAZGV2IC0gaW5zdGFuY2UgdG8gdGhlIGdpdmVuIGRldmljZQotICogQGluZGV4IC0gaW5kZXggaW50byBsaXN0IG9mIGV4dGNvbl9kZXYKLSAqCi0gKiByZXR1cm4gdGhlIGluc3RhbmNlIG9mIGV4dGNvbiBkZXZpY2UKLSAqLwotc3RydWN0IGV4dGNvbl9kZXYgKm9mX2V4dGNvbl9nZXRfZXh0Y29uX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGV4dGNvbl9kZXYgKmVkZXY7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZXh0Y29uX3BhcmVudF9kZXY7Ci0KLQlpZiAoIWRldi0+b2Zfbm9kZSkgewotCQlkZXZfZGJnKGRldiwgImRldmljZSBkb2VzIG5vdCBoYXZlIGEgZGV2aWNlIG5vZGUgZW50cnlcbiIpOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9Ci0KLQlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsICJleHRjb24iLCBpbmRleCk7Ci0JaWYgKCFub2RlKSB7Ci0JCWRldl9kYmcoZGV2LCAiZmFpbGVkIHRvIGdldCBwaGFuZGxlIGluICVzIG5vZGVcbiIsCi0JCQlkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQotCWV4dGNvbl9wYXJlbnRfZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShub2RlKTsKLQlpZiAoIWV4dGNvbl9wYXJlbnRfZGV2KSB7Ci0JCWRldl9kYmcoZGV2LCAidW5hYmxlIHRvIGZpbmQgZGV2aWNlIGJ5IG5vZGVcbiIpOwotCQlyZXR1cm4gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKLQl9Ci0KLQllZGV2ID0gZXh0Y29uX2dldF9leHRjb25fZGV2KGRldl9uYW1lKCZleHRjb25fcGFyZW50X2Rldi0+ZGV2KSk7Ci0JaWYgKCFlZGV2KSB7Ci0JCWRldl9kYmcoZGV2LCAidW5hYmxlIHRvIGdldCBleHRjb24gZGV2aWNlIDogJXNcbiIsCi0JCQkJZGV2X25hbWUoJmV4dGNvbl9wYXJlbnRfZGV2LT5kZXYpKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQotCi0JcmV0dXJuIGVkZXY7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9leHRjb25fZ2V0X2V4dGNvbl9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKaW5kZXggMWI1ZThlNC4uNzE2MGM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCkBAIC01ODQsNyArNTg0LDcgQEAKIAkucmVtb3ZlCQk9IGRjZGJhc19yZW1vdmUsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pbmZvIGRjZGJhc19kZXZfaW5mbyBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbyBkY2RiYXNfZGV2X2luZm8gX19pbml0Y29uc3QgPSB7CiAJLm5hbWUJCT0gRFJJVkVSX05BTUUsCiAJLmlkCQk9IC0xLAogCS5kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktc3R1Yi1oZWxwZXIuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1zdHViLWhlbHBlci5jCmluZGV4IGI2YmZmYmYuLmZmNTBhZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1zdHViLWhlbHBlci5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1zdHViLWhlbHBlci5jCkBAIC0xNiwxOCArMTYsNiBAQAogCXU2NCBzaXplOwogfTsKIAotCi0KLQotc3RhdGljIHZvaWQgZWZpX2NoYXIxNl9wcmludGsoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAotCQkJICAgICAgZWZpX2NoYXIxNl90ICpzdHIpCi17Ci0Jc3RydWN0IGVmaV9zaW1wbGVfdGV4dF9vdXRwdXRfcHJvdG9jb2wgKm91dDsKLQotCW91dCA9IChzdHJ1Y3QgZWZpX3NpbXBsZV90ZXh0X291dHB1dF9wcm90b2NvbCAqKXN5c190YWJsZV9hcmctPmNvbl9vdXQ7Ci0JZWZpX2NhbGxfcGh5czIob3V0LT5vdXRwdXRfc3RyaW5nLCBvdXQsIHN0cik7Ci19Ci0KIHN0YXRpYyB2b2lkIGVmaV9wcmludGsoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLCBjaGFyICpzdHIpCiB7CiAJY2hhciAqczg7CkBAIC02NSwyMCArNTMsMjMgQEAKIAkgKiBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSBpbiBhIG5ldyBkZXNjcmlwdG9yIHJlZ2lvbi4KIAkgKi8KIAkqbWFwX3NpemUgKz0gc2l6ZW9mKCptKTsKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGVfYXJnLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQlFRklfTE9BREVSX0RBVEEsICptYXBfc2l6ZSwgKHZvaWQgKiopJm0pOworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwKKwkJCQkqbWFwX3NpemUsICh2b2lkICoqKSZtKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlnb3RvIGZhaWw7CiAKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShzeXNfdGFibGVfYXJnLT5ib290dGltZS0+Z2V0X21lbW9yeV9tYXAsCi0JCQkJbWFwX3NpemUsIG0sICZrZXksIGRlc2Nfc2l6ZSwgJmRlc2NfdmVyc2lvbik7CisJKmRlc2Nfc2l6ZSA9IDA7CisJa2V5ID0gMDsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShnZXRfbWVtb3J5X21hcCwgbWFwX3NpemUsIG0sCisJCQkJJmtleSwgZGVzY19zaXplLCAmZGVzY192ZXJzaW9uKTsKIAlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7Ci0JCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIG0pOworCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG0pOwogCQlnb3RvIGFnYWluOwogCX0KIAogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCi0JCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIG0pOworCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG0pOworCiAJaWYgKGtleV9wdHIgJiYgc3RhdHVzID09IEVGSV9TVUNDRVNTKQogCQkqa2V5X3B0ciA9IGtleTsKIAlpZiAoZGVzY192ZXIgJiYgc3RhdHVzID09IEVGSV9TVUNDRVNTKQpAQCAtMTU4LDcgKzE0OSw3IEBACiAJaWYgKCFtYXhfYWRkcikKIAkJc3RhdHVzID0gRUZJX05PVF9GT1VORDsKIAllbHNlIHsKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czQoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmFsbG9jYXRlX3BhZ2VzLAorCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wYWdlcywKIAkJCQkJRUZJX0FMTE9DQVRFX0FERFJFU1MsIEVGSV9MT0FERVJfREFUQSwKIAkJCQkJbnJfcGFnZXMsICZtYXhfYWRkcik7CiAJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKQEAgLTE3MCw4ICsxNjEsNyBAQAogCQkqYWRkciA9IG1heF9hZGRyOwogCX0KIAotCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIG1hcCk7Ci0KKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG1hcCk7CiBmYWlsOgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMzEsNyArMjIxLDcgQEAKIAkJaWYgKChzdGFydCArIHNpemUpID4gZW5kKQogCQkJY29udGludWU7CiAKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czQoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmFsbG9jYXRlX3BhZ2VzLAorCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wYWdlcywKIAkJCQkJRUZJX0FMTE9DQVRFX0FERFJFU1MsIEVGSV9MT0FERVJfREFUQSwKIAkJCQkJbnJfcGFnZXMsICZzdGFydCk7CiAJCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpIHsKQEAgLTI0Myw3ICsyMzMsNyBAQAogCWlmIChpID09IG1hcF9zaXplIC8gZGVzY19zaXplKQogCQlzdGF0dXMgPSBFRklfTk9UX0ZPVU5EOwogCi0JZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgbWFwKTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG1hcCk7CiBmYWlsOgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yNTcsNyArMjQ3LDcgQEAKIAkJcmV0dXJuOwogCiAJbnJfcGFnZXMgPSByb3VuZF91cChzaXplLCBFRklfUEFHRV9TSVpFKSAvIEVGSV9QQUdFX1NJWkU7Ci0JZWZpX2NhbGxfcGh5czIoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmZyZWVfcGFnZXMsIGFkZHIsIG5yX3BhZ2VzKTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3BhZ2VzLCBhZGRyLCBucl9wYWdlcyk7CiB9CiAKIApAQCAtMjc2LDkgKzI2Niw3IEBACiB7CiAJc3RydWN0IGZpbGVfaW5mbyAqZmlsZXM7CiAJdW5zaWduZWQgbG9uZyBmaWxlX2FkZHI7Ci0JZWZpX2d1aWRfdCBmc19wcm90byA9IEVGSV9GSUxFX1NZU1RFTV9HVUlEOwogCXU2NCBmaWxlX3NpemVfdG90YWw7Ci0JZWZpX2ZpbGVfaW9faW50ZXJmYWNlX3QgKmlvOwogCWVmaV9maWxlX2hhbmRsZV90ICpmaDsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCWludCBucl9maWxlczsKQEAgLTMxOSwxMCArMzA3LDggQEAKIAlpZiAoIW5yX2ZpbGVzKQogCQlyZXR1cm4gRUZJX1NVQ0NFU1M7CiAKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGVfYXJnLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQlFRklfTE9BREVSX0RBVEEsCi0JCQkJbnJfZmlsZXMgKiBzaXplb2YoKmZpbGVzKSwKLQkJCQkodm9pZCAqKikmZmlsZXMpOworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwKKwkJCQlucl9maWxlcyAqIHNpemVvZigqZmlsZXMpLCAodm9pZCAqKikmZmlsZXMpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJZWZpX3ByaW50ayhzeXNfdGFibGVfYXJnLCAiRmFpbGVkIHRvIGFsbG9jIG1lbSBmb3IgZmlsZSBoYW5kbGUgbGlzdFxuIik7CiAJCWdvdG8gZmFpbDsKQEAgLTMzMSwxMyArMzE3LDggQEAKIAlzdHIgPSBjbWRfbGluZTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZmlsZXM7IGkrKykgewogCQlzdHJ1Y3QgZmlsZV9pbmZvICpmaWxlOwotCQllZmlfZmlsZV9oYW5kbGVfdCAqaDsKLQkJZWZpX2ZpbGVfaW5mb190ICppbmZvOwogCQllZmlfY2hhcjE2X3QgZmlsZW5hbWVfMTZbMjU2XTsKLQkJdW5zaWduZWQgbG9uZyBpbmZvX3N6OwotCQllZmlfZ3VpZF90IGluZm9fZ3VpZCA9IEVGSV9GSUxFX0lORk9fSUQ7CiAJCWVmaV9jaGFyMTZfdCAqcDsKLQkJdTY0IGZpbGVfc3o7CiAKIAkJc3RyID0gc3Ryc3RyKHN0ciwgb3B0aW9uX3N0cmluZyk7CiAJCWlmICghc3RyKQpAQCAtMzY4LDcxICszNDksMTggQEAKIAogCQkvKiBPbmx5IG9wZW4gdGhlIHZvbHVtZSBvbmNlLiAqLwogCQlpZiAoIWkpIHsKLQkJCWVmaV9ib290X3NlcnZpY2VzX3QgKmJvb3R0aW1lOwotCi0JCQlib290dGltZSA9IHN5c190YWJsZV9hcmctPmJvb3R0aW1lOwotCi0JCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhib290dGltZS0+aGFuZGxlX3Byb3RvY29sLAotCQkJCQlpbWFnZS0+ZGV2aWNlX2hhbmRsZSwgJmZzX3Byb3RvLAotCQkJCQkJKHZvaWQgKiopJmlvKTsKLQkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJGYWlsZWQgdG8gaGFuZGxlIGZzX3Byb3RvXG4iKTsKKwkJCXN0YXR1cyA9IGVmaV9vcGVuX3ZvbHVtZShzeXNfdGFibGVfYXJnLCBpbWFnZSwKKwkJCQkJCSAodm9pZCAqKikmZmgpOworCQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJCQlnb3RvIGZyZWVfZmlsZXM7Ci0JCQl9Ci0KLQkJCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMyKGlvLT5vcGVuX3ZvbHVtZSwgaW8sICZmaCk7Ci0JCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCQkJZWZpX3ByaW50ayhzeXNfdGFibGVfYXJnLCAiRmFpbGVkIHRvIG9wZW4gdm9sdW1lXG4iKTsKLQkJCQlnb3RvIGZyZWVfZmlsZXM7Ci0JCQl9CiAJCX0KIAotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShmaC0+b3BlbiwgZmgsICZoLCBmaWxlbmFtZV8xNiwKLQkJCQkJRUZJX0ZJTEVfTU9ERV9SRUFELCAodTY0KTApOwotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiKTsKLQkJCWVmaV9jaGFyMTZfcHJpbnRrKHN5c190YWJsZV9hcmcsIGZpbGVuYW1lXzE2KTsKLQkJCWVmaV9wcmludGsoc3lzX3RhYmxlX2FyZywgIlxuIik7CisJCXN0YXR1cyA9IGVmaV9maWxlX3NpemUoc3lzX3RhYmxlX2FyZywgZmgsIGZpbGVuYW1lXzE2LAorCQkJCSAgICAgICAodm9pZCAqKikmZmlsZS0+aGFuZGxlLCAmZmlsZS0+c2l6ZSk7CisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCQlnb3RvIGNsb3NlX2hhbmRsZXM7Ci0JCX0KIAotCQlmaWxlLT5oYW5kbGUgPSBoOwotCi0JCWluZm9fc3ogPSAwOwotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNChoLT5nZXRfaW5mbywgaCwgJmluZm9fZ3VpZCwKLQkJCQkJJmluZm9fc3osIE5VTEwpOwotCQlpZiAoc3RhdHVzICE9IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7Ci0JCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJGYWlsZWQgdG8gZ2V0IGZpbGUgaW5mbyBzaXplXG4iKTsKLQkJCWdvdG8gY2xvc2VfaGFuZGxlczsKLQkJfQotCi1ncm93OgotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGVfYXJnLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQkJRUZJX0xPQURFUl9EQVRBLCBpbmZvX3N6LAotCQkJCQkodm9pZCAqKikmaW5mbyk7Ci0JCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJCWVmaV9wcmludGsoc3lzX3RhYmxlX2FyZywgIkZhaWxlZCB0byBhbGxvYyBtZW0gZm9yIGZpbGUgaW5mb1xuIik7Ci0JCQlnb3RvIGNsb3NlX2hhbmRsZXM7Ci0JCX0KLQotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNChoLT5nZXRfaW5mbywgaCwgJmluZm9fZ3VpZCwKLQkJCQkJJmluZm9fc3osIGluZm8pOwotCQlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7Ci0JCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGVfYXJnLT5ib290dGltZS0+ZnJlZV9wb29sLAotCQkJCSAgICAgICBpbmZvKTsKLQkJCWdvdG8gZ3JvdzsKLQkJfQotCi0JCWZpbGVfc3ogPSBpbmZvLT5maWxlX3NpemU7Ci0JCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIGluZm8pOwotCi0JCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJCWVmaV9wcmludGsoc3lzX3RhYmxlX2FyZywgIkZhaWxlZCB0byBnZXQgZmlsZSBpbmZvXG4iKTsKLQkJCWdvdG8gY2xvc2VfaGFuZGxlczsKLQkJfQotCi0JCWZpbGUtPnNpemUgPSBmaWxlX3N6OwotCQlmaWxlX3NpemVfdG90YWwgKz0gZmlsZV9zejsKKwkJZmlsZV9zaXplX3RvdGFsICs9IGZpbGUtPnNpemU7CiAJfQogCiAJaWYgKGZpbGVfc2l6ZV90b3RhbCkgewpAQCAtNDY4LDEwICszOTYsMTAgQEAKIAkJCQkJY2h1bmtzaXplID0gRUZJX1JFQURfQ0hVTktfU0laRTsKIAkJCQllbHNlCiAJCQkJCWNodW5rc2l6ZSA9IHNpemU7Ci0JCQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoZmgtPnJlYWQsCi0JCQkJCQkJZmlsZXNbal0uaGFuZGxlLAotCQkJCQkJCSZjaHVua3NpemUsCi0JCQkJCQkJKHZvaWQgKilhZGRyKTsKKworCQkJCXN0YXR1cyA9IGVmaV9maWxlX3JlYWQoZmgsIGZpbGVzW2pdLmhhbmRsZSwKKwkJCQkJCSAgICAgICAmY2h1bmtzaXplLAorCQkJCQkJICAgICAgICh2b2lkICopYWRkcik7CiAJCQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQkJCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJGYWlsZWQgdG8gcmVhZCBmaWxlXG4iKTsKIAkJCQkJZ290byBmcmVlX2ZpbGVfdG90YWw7CkBAIC00ODAsMTIgKzQwOCwxMiBAQAogCQkJCXNpemUgLT0gY2h1bmtzaXplOwogCQkJfQogCi0JCQllZmlfY2FsbF9waHlzMShmaC0+Y2xvc2UsIGZpbGVzW2pdLmhhbmRsZSk7CisJCQllZmlfZmlsZV9jbG9zZShmaCwgZmlsZXNbal0uaGFuZGxlKTsKIAkJfQogCiAJfQogCi0JZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgZmlsZXMpOworCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgZmlsZXMpOwogCiAJKmxvYWRfYWRkciA9IGZpbGVfYWRkcjsKIAkqbG9hZF9zaXplID0gZmlsZV9zaXplX3RvdGFsOwpAQCAtNDk3LDkgKzQyNSw5IEBACiAKIGNsb3NlX2hhbmRsZXM6CiAJZm9yIChrID0gajsgayA8IGk7IGsrKykKLQkJZWZpX2NhbGxfcGh5czEoZmgtPmNsb3NlLCBmaWxlc1trXS5oYW5kbGUpOworCQllZmlfZmlsZV9jbG9zZShmaCwgZmlsZXNba10uaGFuZGxlKTsKIGZyZWVfZmlsZXM6Ci0JZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgZmlsZXMpOworCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgZmlsZXMpOwogZmFpbDoKIAkqbG9hZF9hZGRyID0gMDsKIAkqbG9hZF9zaXplID0gMDsKQEAgLTU0NSw3ICs0NzMsNyBAQAogCSAqIGFzIHBvc3NpYmxlIHdoaWxlIHJlc3BlY3RpbmcgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4KIAkgKi8KIAlucl9wYWdlcyA9IHJvdW5kX3VwKGFsbG9jX3NpemUsIEVGSV9QQUdFX1NJWkUpIC8gRUZJX1BBR0VfU0laRTsKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNChzeXNfdGFibGVfYXJnLT5ib290dGltZS0+YWxsb2NhdGVfcGFnZXMsCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcGFnZXMsCiAJCQkJRUZJX0FMTE9DQVRFX0FERFJFU1MsIEVGSV9MT0FERVJfREFUQSwKIAkJCQlucl9wYWdlcywgJmVmaV9hZGRyKTsKIAluZXdfYWRkciA9IGVmaV9hZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYwppbmRleCA0NzUzYmFjLi5hZjIwZjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJe1NBTF9TWVNURU1fVEFCTEVfR1VJRCwgIlNBTHN5c3RhYiIsICZlZmkuc2FsX3N5c3RhYn0sCiAJe1NNQklPU19UQUJMRV9HVUlELCAiU01CSU9TIiwgJmVmaS5zbWJpb3N9LAogCXtVR0FfSU9fUFJPVE9DT0xfR1VJRCwgIlVHQSIsICZlZmkudWdhfSwKLQl7TlVMTF9HVUlELCBOVUxMLCAwfSwKKwl7TlVMTF9HVUlELCBOVUxMLCBOVUxMfSwKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IG1hdGNoX2NvbmZpZ190YWJsZShlZmlfZ3VpZF90ICpndWlkLApAQCAtMzEzLDUgKzMxMyw4IEBACiAJfQogCXByX2NvbnQoIlxuIik7CiAJZWFybHlfaW91bm1hcChjb25maWdfdGFibGVzLCBlZmkuc3lzdGFiLT5ucl90YWJsZXMgKiBzeik7CisKKwlzZXRfYml0KEVGSV9DT05GSUdfVEFCTEVTLCAmZWZpLmZsYWdzKTsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jCmluZGV4IDNkYzI0ODIuLjUwZWE0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZml2YXJzLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCW1lbWNweSgmZW50cnktPnZhciwgbmV3X3ZhciwgY291bnQpOwogCiAJZXJyID0gZWZpdmFyX2VudHJ5X3NldChlbnRyeSwgbmV3X3Zhci0+QXR0cmlidXRlcywKLQkJCSAgICAgICBuZXdfdmFyLT5EYXRhU2l6ZSwgbmV3X3Zhci0+RGF0YSwgZmFsc2UpOworCQkJICAgICAgIG5ld192YXItPkRhdGFTaXplLCBuZXdfdmFyLT5EYXRhLCBOVUxMKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImVmaXZhcnM6IHNldF92YXJpYWJsZSgpIGZhaWxlZDogc3RhdHVzPSVkXG4iLCBlcnIpOwogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwppbmRleCBlNWE2N2IyLi5mMWFiMDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCkBAIC04OTIsMTMgKzg5Miw2IEBACiAJCWdvdG8gb3V0X3JlbW92ZV9zeXNmc19maWxlczsKIAl9CiAKLQlyZXQgPSBlZml2YXJzX3N5c2ZzX2luaXQoKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImdzbWk6IEZhaWxlZCB0byBjcmVhdGUgZWZpdmFycyBmaWxlc1xuIik7Ci0JCWVmaXZhcnNfdW5yZWdpc3RlcigmZWZpdmFycyk7Ci0JCWdvdG8gb3V0X3JlbW92ZV9zeXNmc19maWxlczsKLQl9Ci0KIAlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdzbWlfcmVib290X25vdGlmaWVyKTsKIAlyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmdzbWlfZGllX25vdGlmaWVyKTsKIAlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9tZW1jb25zb2xlLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9tZW1jb25zb2xlLmMKaW5kZXggMmE5MGJhNi4uMmY1NjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL21lbWNvbnNvbGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9iaW9zX2ViZGEuaD4KIAogI2RlZmluZSBCSU9TX01FTUNPTlNPTEVfVjFfTUFHSUMJMHhERUFEQkFCRQpAQCAtNDEsMTUgKzQyLDI1IEBACiAJfTsKIH0gX19wYWNrZWQ7CiAKLXN0YXRpYyBjaGFyICptZW1jb25zb2xlX2Jhc2VhZGRyOworc3RhdGljIHUzMiBtZW1jb25zb2xlX2Jhc2VhZGRyOwogc3RhdGljIHNpemVfdCBtZW1jb25zb2xlX2xlbmd0aDsKIAogc3RhdGljIHNzaXplX3QgbWVtY29uc29sZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29icCwKIAkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsIGNoYXIgKmJ1ZiwKIAkJCSAgICAgICBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIG1lbWNvbnNvbGVfYmFzZWFkZHIsCi0JCQkJICAgICAgIG1lbWNvbnNvbGVfbGVuZ3RoKTsKKwljaGFyICptZW1jb25zb2xlOworCXNzaXplX3QgcmV0OworCisJbWVtY29uc29sZSA9IGlvcmVtYXBfY2FjaGUobWVtY29uc29sZV9iYXNlYWRkciwgbWVtY29uc29sZV9sZW5ndGgpOworCWlmICghbWVtY29uc29sZSkgeworCQlwcl9lcnIoIm1lbWNvbnNvbGU6IGlvcmVtYXBfY2FjaGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIG1lbWNvbnNvbGUsCisJCQkJICAgICAgbWVtY29uc29sZV9sZW5ndGgpOworCWlvdW5tYXAobWVtY29uc29sZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIG1lbWNvbnNvbGVfYmluX2F0dHIgPSB7CkBAIC01OCw0MyArNjksNDIgQEAKIH07CiAKIAotc3RhdGljIHZvaWQgZm91bmRfdjFfaGVhZGVyKHN0cnVjdCBiaW9zbWVtY29uX2ViZGEgKmhkcikKK3N0YXRpYyB2b2lkIF9faW5pdCBmb3VuZF92MV9oZWFkZXIoc3RydWN0IGJpb3NtZW1jb25fZWJkYSAqaGRyKQogewotCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSB2MSBFQkRBIHN0cnVjdHVyZSBmb3VuZCBhdCAlcFxuIiwgaGRyKTsKLQlwcmludGsoS0VSTl9JTkZPICJCSU9TIGNvbnNvbGUgYnVmZmVyIGF0IDB4JS44eCwgIgorCXByX2luZm8oIkJJT1MgY29uc29sZSB2MSBFQkRBIHN0cnVjdHVyZSBmb3VuZCBhdCAlcFxuIiwgaGRyKTsKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgYnVmZmVyIGF0IDB4JS44eCwgIgogCSAgICAgICAic3RhcnQgPSAlZCwgZW5kID0gJWQsIG51bSA9ICVkXG4iLAogCSAgICAgICBoZHItPnYxLmJ1ZmZlcl9hZGRyLCBoZHItPnYxLnN0YXJ0LAogCSAgICAgICBoZHItPnYxLmVuZCwgaGRyLT52MS5udW1fY2hhcnMpOwogCiAJbWVtY29uc29sZV9sZW5ndGggPSBoZHItPnYxLm51bV9jaGFyczsKLQltZW1jb25zb2xlX2Jhc2VhZGRyID0gcGh5c190b192aXJ0KGhkci0+djEuYnVmZmVyX2FkZHIpOworCW1lbWNvbnNvbGVfYmFzZWFkZHIgPSBoZHItPnYxLmJ1ZmZlcl9hZGRyOwogfQogCi1zdGF0aWMgdm9pZCBmb3VuZF92Ml9oZWFkZXIoc3RydWN0IGJpb3NtZW1jb25fZWJkYSAqaGRyKQorc3RhdGljIHZvaWQgX19pbml0IGZvdW5kX3YyX2hlYWRlcihzdHJ1Y3QgYmlvc21lbWNvbl9lYmRhICpoZHIpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBjb25zb2xlIHYyIEVCREEgc3RydWN0dXJlIGZvdW5kIGF0ICVwXG4iLCBoZHIpOwotCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSBidWZmZXIgYXQgMHglLjh4LCAiCisJcHJfaW5mbygiQklPUyBjb25zb2xlIHYyIEVCREEgc3RydWN0dXJlIGZvdW5kIGF0ICVwXG4iLCBoZHIpOworCXByX2luZm8oIkJJT1MgY29uc29sZSBidWZmZXIgYXQgMHglLjh4LCAiCiAJICAgICAgICJzdGFydCA9ICVkLCBlbmQgPSAlZCwgbnVtX2J5dGVzID0gJWRcbiIsCiAJICAgICAgIGhkci0+djIuYnVmZmVyX2FkZHIsIGhkci0+djIuc3RhcnQsCiAJICAgICAgIGhkci0+djIuZW5kLCBoZHItPnYyLm51bV9ieXRlcyk7CiAKIAltZW1jb25zb2xlX2xlbmd0aCA9IGhkci0+djIuZW5kIC0gaGRyLT52Mi5zdGFydDsKLQltZW1jb25zb2xlX2Jhc2VhZGRyID0gcGh5c190b192aXJ0KGhkci0+djIuYnVmZmVyX2FkZHIKLQkJCQkJICAgKyBoZHItPnYyLnN0YXJ0KTsKKwltZW1jb25zb2xlX2Jhc2VhZGRyID0gaGRyLT52Mi5idWZmZXJfYWRkciArIGhkci0+djIuc3RhcnQ7CiB9CiAKIC8qCiAgKiBTZWFyY2ggdGhyb3VnaCB0aGUgRUJEQSBmb3IgdGhlIEJJT1MgTWVtb3J5IENvbnNvbGUsIGFuZAogICogc2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzIHRvIHBvaW50IHRvIGl0LiAgUmV0dXJuIHRydWUgaWYgZm91bmQuCiAgKi8KLXN0YXRpYyBib29sIGZvdW5kX21lbWNvbnNvbGUodm9pZCkKK3N0YXRpYyBib29sIF9faW5pdCBmb3VuZF9tZW1jb25zb2xlKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGFkZHJlc3M7CiAJc2l6ZV90IGxlbmd0aCwgY3VyOwogCiAJYWRkcmVzcyA9IGdldF9iaW9zX2ViZGEoKTsKIAlpZiAoIWFkZHJlc3MpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBFQkRBIG5vbi1leGlzdGVudC5cbiIpOworCQlwcl9pbmZvKCJCSU9TIEVCREEgbm9uLWV4aXN0ZW50LlxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEyMiw3ICsxMzIsNyBAQAogCQl9CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBjb25zb2xlIEVCREEgc3RydWN0dXJlIG5vdCBmb3VuZCFcbiIpOworCXByX2luZm8oIkJJT1MgY29uc29sZSBFQkRBIHN0cnVjdHVyZSBub3QgZm91bmQhXG4iKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTEzOSw4ICsxNDksNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtZW1jb25zb2xlX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKG1lbWNvbnNvbGVfZG1pX3RhYmxlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE0OCwxMCArMTU2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAltZW1jb25zb2xlX2Jpbl9hdHRyLnNpemUgPSBtZW1jb25zb2xlX2xlbmd0aDsKLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShmaXJtd2FyZV9rb2JqLCAmbWVtY29uc29sZV9iaW5fYXR0cik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBzeXNmc19jcmVhdGVfYmluX2ZpbGUoZmlybXdhcmVfa29iaiwgJm1lbWNvbnNvbGVfYmluX2F0dHIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWVtY29uc29sZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZtYy9mbWMtY29yZS5jIGIvZHJpdmVycy9mbWMvZm1jLWNvcmUuYwppbmRleCAyNGQ1MjQ5Li4zNTNmYzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZtYy9mbWMtY29yZS5jCisrKyBiL2RyaXZlcnMvZm1jL2ZtYy1jb3JlLmMKQEAgLTk5LDEwICs5OSwyMyBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgZm1jX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZm1jX2RldmljZSAqZm1jOworCisJZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCWZtYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBmbWNfZGV2aWNlLCBkZXYpOworCXJldHVybiBmbWMtPm9wLT53cml0ZV9lZShmbWMsIG9mZiwgYnVmLCBjb3VudCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBmbWNfZWVwcm9tX2F0dHIgPSB7Ci0JLmF0dHIgPSB7IC5uYW1lID0gImVlcHJvbSIsIC5tb2RlID0gU19JUlVHTywgfSwKKwkuYXR0ciA9IHsgLm5hbWUgPSAiZWVwcm9tIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwgfSwKIAkuc2l6ZSA9IDgxOTIsIC8qIG1vcmUgb3IgbGVzcyBzdGFuZGFyZCAqLwogCS5yZWFkID0gZm1jX3JlYWRfZWVwcm9tLAorCS53cml0ZSA9IGZtY193cml0ZV9lZXByb20sCiB9OwogCiAvKgpAQCAtMTU0LDcgKzE2Nyw3IEBACiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGZtYy0+ZmxhZ3MgPT0gRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpIHsKKwkJaWYgKGZtYy0+ZmxhZ3MgJiBGTUNfREVWSUNFX05PX01FWlpBTklORSkgewogCQkJZGV2X2luZm8oZm1jLT5od2RldiwgImFic2VudCBtZXp6YW5pbmUgaW4gc2xvdCAlZFxuIiwKIAkJCQkgZm1jLT5zbG90X2lkKTsKIAkJCWNvbnRpbnVlOwpAQCAtMTg5LDkgKzIwMiw2IEBACiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlmbWMgPSBkZXZhcnJheVtpXTsKIAotCQlpZiAoZm1jLT5mbGFncyA9PSBGTUNfREVWSUNFX05PX01FWlpBTklORSkKLQkJCWNvbnRpbnVlOyAvKiBkZXZfaW5mbyBhbHJlYWR5IGRvbmUgYWJvdmUgKi8KLQogCQlmbWMtPm5yX3Nsb3RzID0gbjsgLyogZWFjaCBzbG90IG11c3Qga25vdyBob3cgbWFueSBhcmUgdGhlcmUgKi8KIAkJZm1jLT5kZXZhcnJheSA9IGRldmFycmF5OwogCkBAIC0yNjMsOCArMjczLDYgQEAKIAlrZnJlZShkZXZzWzBdLT5kZXZhcnJheSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWlmIChkZXZzW2ldLT5mbGFncyA9PSBGTUNfREVWSUNFX05PX01FWlpBTklORSkKLQkJCWNvbnRpbnVlOwogCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmRldnNbaV0tPmRldi5rb2JqLCAmZm1jX2VlcHJvbV9hdHRyKTsKIAkJZGV2aWNlX2RlbCgmZGV2c1tpXS0+ZGV2KTsKIAkJZm1jX2ZyZWVfaWRfaW5mbyhkZXZzW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZm1jL2ZtYy1zZGIuYyBiL2RyaXZlcnMvZm1jL2ZtYy1zZGIuYwppbmRleCA3OWFkYzM5Li40NjAzZmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZtYy9mbWMtc2RiLmMKKysrIGIvZHJpdmVycy9mbWMvZm1jLXNkYi5jCkBAIC0xNTAsMjMgKzE1MCwzNiBAQAogfQogRVhQT1JUX1NZTUJPTChmbWNfcmVwcm9ncmFtKTsKIAorc3RhdGljIGNoYXIgKl9fc3RyaXBfdHJhaWxpbmdfc3BhY2UoY2hhciAqYnVmLCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJaW50IGkgPSBsZW4gLSAxOworCisJbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworCXdoaWxlKGkgPj0gMCAmJiBidWZbaV0gPT0gJyAnKQorCQlidWZbaS0tXSA9ICdcMCc7CisJcmV0dXJuIGJ1ZjsKK30KKworI2RlZmluZSBfX3NkYl9zdHJpbmcoYnVmLCBmaWVsZCkgKHsJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZihidWYpIDwgc2l6ZW9mKGZpZWxkKSk7CVwKKwlfX3N0cmlwX3RyYWlsaW5nX3NwYWNlKGJ1ZiwgKHZvaWQgKikoZmllbGQpLCBzaXplb2YoZmllbGQpKTsJXAorCQl9KQorCiBzdGF0aWMgdm9pZCBfX2ZtY19zaG93X3NkYl90cmVlKGNvbnN0IHN0cnVjdCBmbWNfZGV2aWNlICpmbWMsCiAJCQkJY29uc3Qgc3RydWN0IHNkYl9hcnJheSAqYXJyKQogeworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGFyci0+YmFzZWFkZHI7CiAJaW50IGksIGosIG4gPSBhcnItPmxlbiwgbGV2ZWwgPSBhcnItPmxldmVsOwotCWNvbnN0IHN0cnVjdCBzZGJfYXJyYXkgKmFwOworCWNoYXIgYnVmWzY0XTsKIAogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBiYXNlOwogCQl1bmlvbiAgc2RiX3JlY29yZCAqcjsKIAkJc3RydWN0IHNkYl9wcm9kdWN0ICpwOwogCQlzdHJ1Y3Qgc2RiX2NvbXBvbmVudCAqYzsKIAkJciA9ICZhcnItPnJlY29yZFtpXTsKIAkJYyA9ICZyLT5kZXYuc2RiX2NvbXBvbmVudDsKIAkJcCA9ICZjLT5wcm9kdWN0OwotCQliYXNlID0gMDsKLQkJZm9yIChhcCA9IGFycjsgYXA7IGFwID0gYXAtPnBhcmVudCkKLQkJCWJhc2UgKz0gYXAtPmJhc2VhZGRyOworCiAJCWRldl9pbmZvKCZmbWMtPmRldiwgIlNEQjogIik7CiAKIAkJZm9yIChqID0gMDsgaiA8IGxldmVsOyBqKyspCkBAIC0xOTMsOCArMjA2LDggQEAKIAkJCSAgICAgICBwLT5uYW1lLAogCQkJICAgICAgIF9fYmU2NF90b19jcHUoYy0+YWRkcl9maXJzdCkgKyBiYXNlKTsKIAkJCWlmIChJU19FUlIoYXJyLT5zdWJ0cmVlW2ldKSkgewotCQkJCXByaW50ayhLRVJOX0NPTlQgIihicmlkZ2UgZXJyb3IgJWxpKVxuIiwKLQkJCQkgICAgICAgUFRSX0VSUihhcnItPnN1YnRyZWVbaV0pKTsKKwkJCQlkZXZfaW5mbygmZm1jLT5kZXYsICJTREI6IChicmlkZ2UgZXJyb3IgJWxpKVxuIiwKKwkJCQkJIFBUUl9FUlIoYXJyLT5zdWJ0cmVlW2ldKSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlfX2ZtY19zaG93X3NkYl90cmVlKGZtYywgYXJyLT5zdWJ0cmVlW2ldKTsKQEAgLTIwMywxMCArMjE2LDIwIEBACiAJCQlwcmludGsoS0VSTl9DT05UICJpbnRlZ3JhdGlvblxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBzZGJfdHlwZV9yZXBvX3VybDoKLQkJCXByaW50ayhLRVJOX0NPTlQgInJlcG8tdXJsXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIlN5bnRoZXNpcyByZXBvc2l0b3J5OiAlc1xuIiwKKwkJCSAgICAgICBfX3NkYl9zdHJpbmcoYnVmLCByLT5yZXBvX3VybC5yZXBvX3VybCkpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc2RiX3R5cGVfc3ludGhlc2lzOgotCQkJcHJpbnRrKEtFUk5fQ09OVCAic3ludGhlc2lzLWluZm9cbiIpOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiQml0c3RyZWFtICclcycgIiwKKwkJCSAgICAgICBfX3NkYl9zdHJpbmcoYnVmLCByLT5zeW50aGVzaXMuc3luX25hbWUpKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgInN5bnRoZXNpemVkICUwOHggYnkgJXMgIiwKKwkJCSAgICAgICBfX2JlMzJfdG9fY3B1KHItPnN5bnRoZXNpcy5kYXRlKSwKKwkJCSAgICAgICBfX3NkYl9zdHJpbmcoYnVmLCByLT5zeW50aGVzaXMudXNlcl9uYW1lKSk7CisJCQlwcmludGsoS0VSTl9DT05UICIoJXMgdmVyc2lvbiAleCksICIsCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+c3ludGhlc2lzLnRvb2xfbmFtZSksCisJCQkgICAgICAgX19iZTMyX3RvX2NwdShyLT5zeW50aGVzaXMudG9vbF92ZXJzaW9uKSk7CisJCQlwcmludGsoS0VSTl9DT05UICJjb21taXQgJXBtXG4iLAorCQkJICAgICAgIHItPnN5bnRoZXNpcy5jb21taXRfaWQpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc2RiX3R5cGVfZW1wdHk6CiAJCQlwcmludGsoS0VSTl9DT05UICJlbXB0eVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby12cjQxeHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXZyNDF4eC5jCmluZGV4IDk5MDI3MzIuLjY2Y2JjYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZyNDF4eC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXZyNDF4eC5jCkBAIC04MSw2ICs4MSw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnaXVfZmxhZ3M7CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmdpdV9iYXNlOworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdnI0MXh4X2dwaW9fY2hpcDsKIAogI2RlZmluZSBnaXVfcmVhZChvZmZzZXQpCQlyZWFkdyhnaXVfYmFzZSArIChvZmZzZXQpKQogI2RlZmluZSBnaXVfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIGdpdV9iYXNlICsgKG9mZnNldCkpCkBAIC0xMzUsMTIgKzEzNiwzMSBAQAogCWdpdV9zZXQoR0lVSU5URU5MLCAxIDw8IEdQSU9fUElOX09GX0lSUShkLT5pcnEpKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2dpdWludChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJaWYgKGdwaW9fbG9ja19hc19pcnEoJnZyNDF4eF9ncGlvX2NoaXAsIGRhdGEtPmh3aXJxKSkKKwkJZGV2X2Vycih2cjQxeHhfZ3Bpb19jaGlwLmRldiwKKwkJCSJ1bmFibGUgdG8gbG9jayBIVyBJUlEgJWx1IGZvciBJUlFcbiIsCisJCQlkYXRhLT5od2lycSk7CisJLyogU2F0aXNmeSB0aGUgLmVuYWJsZSBzZW1hbnRpY3MgYnkgdW5tYXNraW5nIHRoZSBsaW5lICovCisJdW5tYXNrX2dpdWludF9sb3coZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNodXRkb3duX2dpdWludChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJbWFza19naXVpbnRfbG93KGRhdGEpOworCWdwaW9fdW5sb2NrX2FzX2lycSgmdnI0MXh4X2dwaW9fY2hpcCwgZGF0YS0+aHdpcnEpOworfQorCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdpdWludF9sb3dfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIkdJVUlOVEwiLAogCS5pcnFfYWNrCT0gYWNrX2dpdWludF9sb3csCiAJLmlycV9tYXNrCT0gbWFza19naXVpbnRfbG93LAogCS5pcnFfbWFza19hY2sJPSBtYXNrX2Fja19naXVpbnRfbG93LAogCS5pcnFfdW5tYXNrCT0gdW5tYXNrX2dpdWludF9sb3csCisJLmlycV9zdGFydHVwCT0gc3RhcnR1cF9naXVpbnQsCisJLmlycV9zaHV0ZG93bgk9IHNodXRkb3duX2dpdWludCwKIH07CiAKIHN0YXRpYyB2b2lkIGFja19naXVpbnRfaGlnaChzdHJ1Y3QgaXJxX2RhdGEgKmQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMKaW5kZXggYmI4ZjU4MC4uNTM0Y2I4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jYWNoZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYwpAQCAtMzIsNiArMzIsMTIgQEAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2KQorCisvKgorICogY2xmbHVzaG9wdCBpcyBhbiB1bm9yZGVyZWQgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgZmVuY2luZyB3aXRoIG1mZW5jZSBvcgorICogc2ZlbmNlIHRvIGF2b2lkIG9yZGVyaW5nIGlzc3Vlcy4gIEZvciBkcm1fY2xmbHVzaF9wYWdlIHRoaXMgZmVuY2luZyBoYXBwZW5zCisgKiBpbiB0aGUgY2FsbGVyLgorICovCiBzdGF0aWMgdm9pZAogZHJtX2NsZmx1c2hfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKQEAgLTQ0LDcgKzUwLDcgQEAKIAogCXBhZ2VfdmlydHVhbCA9IGttYXBfYXRvbWljKHBhZ2UpOwogCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkgKz0gc2l6ZSkKLQkJY2xmbHVzaChwYWdlX3ZpcnR1YWwgKyBpKTsKKwkJY2xmbHVzaG9wdChwYWdlX3ZpcnR1YWwgKyBpKTsKIAlrdW5tYXBfYXRvbWljKHBhZ2VfdmlydHVhbCk7CiB9CiAKQEAgLTEzMyw3ICsxMzksNyBAQAogCQltYigpOwogCQlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBib290X2NwdV9kYXRhLng4Nl9jbGZsdXNoX3NpemUpCiAJCQljbGZsdXNoKGFkZHIpOwotCQljbGZsdXNoKGVuZCAtIDEpOworCQljbGZsdXNob3B0KGVuZCAtIDEpOwogCQltYigpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCA3ZjJhZjlhLi4zMDkwMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMzE5LDcgKzMxOSw4IEBACiAJCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKIAkJfQogCQlpZiAoIWRldi0+aG9zZSkgewotCQkJc3RydWN0IHBjaV9idXMgKmIgPSBwY2lfYnVzX2IocGNpX3Jvb3RfYnVzZXMubmV4dCk7CisJCQlzdHJ1Y3QgcGNpX2J1cyAqYiA9IGxpc3RfZW50cnkocGNpX3Jvb3RfYnVzZXMubmV4dCwKKwkJCQlzdHJ1Y3QgcGNpX2J1cywgbm9kZSk7CiAJCQlpZiAoYikKIAkJCQlkZXYtPmhvc2UgPSBiLT5zeXNkYXRhOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYwppbmRleCA1NzM2YWFhLi5mN2FmNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKQEAgLTQ2OCw4ICs0NjgsOCBAQAogCX0gZWxzZSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmRyaXZlci0+bGVnYWN5X2Rldl9saXN0LAogCQkJCQkgbGVnYWN5X2Rldl9saXN0KSB7Ci0JCQlkcm1fcHV0X2RldihkZXYpOwogCQkJbGlzdF9kZWwoJmRldi0+bGVnYWN5X2Rldl9saXN0KTsKKwkJCWRybV9wdXRfZGV2KGRldik7CiAJCX0KIAl9CiAJRFJNX0lORk8oIk1vZHVsZSB1bmxvYWRlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMKaW5kZXggNTY4MDVjMy4uYmI1MTZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcmltZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJpbWUuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJZ2V0X2RtYV9idWYoZG1hX2J1Zik7CiAKIAlzZ3QgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGF0dGFjaCwgRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChJU19FUlJfT1JfTlVMTChzZ3QpKSB7CisJaWYgKElTX0VSUihzZ3QpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2d0KTsKIAkJZ290byBmYWlsX2RldGFjaDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZG1hYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZG1hYnVmLmMKaW5kZXggNTk4MjdjYy4uYzc4NmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RtYWJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kbWFidWYuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJZ2V0X2RtYV9idWYoZG1hX2J1Zik7CiAKIAlzZ3QgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGF0dGFjaCwgRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChJU19FUlJfT1JfTlVMTChzZ3QpKSB7CisJaWYgKElTX0VSUihzZ3QpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2d0KTsKIAkJZ290byBlcnJfYnVmX2RldGFjaDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMKaW5kZXggMjE1MTMxYS4uYzIwNGI0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuYwpAQCAtMTcyLDIwICsxNzIsMjQgQEAKIAogCXJldCA9IGV4eW5vc19kcm1fc3ViZHJ2X29wZW4oZGV2LCBmaWxlKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfZmlsZV9wcml2X2ZyZWU7CiAKIAlhbm9uX2ZpbHAgPSBhbm9uX2lub2RlX2dldGZpbGUoImV4eW5vc19nZW0iLCAmZXh5bm9zX2RybV9nZW1fZm9wcywKIAkJCQkJTlVMTCwgMCk7CiAJaWYgKElTX0VSUihhbm9uX2ZpbHApKSB7CiAJCXJldCA9IFBUUl9FUlIoYW5vbl9maWxwKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyX3N1YmRydl9jbG9zZTsKIAl9CiAKIAlhbm9uX2ZpbHAtPmZfbW9kZSA9IEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURTsKIAlmaWxlX3ByaXYtPmFub25fZmlscCA9IGFub25fZmlscDsKIAogCXJldHVybiByZXQ7Ci1vdXQ6CisKK2Vycl9zdWJkcnZfY2xvc2U6CisJZXh5bm9zX2RybV9zdWJkcnZfY2xvc2UoZGV2LCBmaWxlKTsKKworZXJyX2ZpbGVfcHJpdl9mcmVlOgogCWtmcmVlKGZpbGVfcHJpdik7CiAJZmlsZS0+ZHJpdmVyX3ByaXYgPSBOVUxMOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL21tdS5jIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9tbXUuYwppbmRleCA0OWJhYzQxLi5jM2U2N2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL21tdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvbW11LmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCiAJZHJpdmVyLT5oYXNfY2xmbHVzaCA9IDA7CiAKLQlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkpIHsKKwlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxVU0gpKSB7CiAJCXVpbnQzMl90IHRmbXMsIG1pc2MsIGNhcDAsIGNhcDQsIGNsZmx1c2hfc2l6ZTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCA0MGEyYjM2Li5kMjc4YmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtODQyLDcgKzg0Miw3IEBACiAJZGV2X3ByaXYtPmd0dC5iYXNlLmNsZWFyX3JhbmdlKCZkZXZfcHJpdi0+Z3R0LmJhc2UsCiAJCQkJICAgICAgIGRldl9wcml2LT5ndHQuYmFzZS5zdGFydCAvIFBBR0VfU0laRSwKIAkJCQkgICAgICAgZGV2X3ByaXYtPmd0dC5iYXNlLnRvdGFsIC8gUEFHRV9TSVpFLAotCQkJCSAgICAgICBmYWxzZSk7CisJCQkJICAgICAgIHRydWUpOwogfQogCiB2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9zdG9sZW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3N0b2xlbi5jCmluZGV4IGQ1OGI0ZTIuLjI4ZDI0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3N0b2xlbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3N0b2xlbi5jCkBAIC0yMTQsNiArMjE0LDEzIEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgYmlvc19yZXNlcnZlZCA9IDA7CiAKKyNpZmRlZiBDT05GSUdfSU5URUxfSU9NTVUKKwlpZiAoaW50ZWxfaW9tbXVfZ2Z4X21hcHBlZCkgeworCQlEUk1fSU5GTygiRE1BUiBhY3RpdmUsIGRpc2FibGluZyB1c2Ugb2Ygc3RvbGVuIG1lbW9yeVxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCiAJaWYgKGRldl9wcml2LT5ndHQuc3RvbGVuX3NpemUgPT0gMCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCmluZGV4IDlmZWM3MTEuLmQ1NTQxNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwpAQCAtNjE4LDMzICs2MTgsMjUgQEAKIAogLyogcmF3IHJlYWRzLCBvbmx5IGZvciBmYXN0IHJlYWRzIG9mIGRpc3BsYXkgYmxvY2ssIG5vIG5lZWQgZm9yIGZvcmNld2FrZSBldGMuICovCiAjZGVmaW5lIF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2X18sIHJlZ19fKSByZWFkbCgoZGV2X3ByaXZfXyktPnJlZ3MgKyAocmVnX18pKQotI2RlZmluZSBfX3Jhd19pOTE1X3JlYWQxNihkZXZfcHJpdl9fLCByZWdfXykgcmVhZHcoKGRldl9wcml2X18pLT5yZWdzICsgKHJlZ19fKSkKIAogc3RhdGljIGJvb2wgaWxrX3BpcGVfaW5fdmJsYW5rX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIHBpcGUgcGlwZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgcmVnOwogCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNykgewotCQlzdGF0dXMgPSBwaXBlID09IFBJUEVfQSA/Ci0JCQlERV9QSVBFQV9WQkxBTksgOgotCQkJREVfUElQRUJfVkJMQU5LOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KSB7CisJCXN0YXR1cyA9IEdFTjhfUElQRV9WQkxBTks7CisJCXJlZyA9IEdFTjhfREVfUElQRV9JU1IocGlwZSk7CisJfSBlbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3KSB7CisJCXN0YXR1cyA9IERFX1BJUEVfVkJMQU5LX0lWQihwaXBlKTsKKwkJcmVnID0gREVJU1I7CiAJfSBlbHNlIHsKLQkJc3dpdGNoIChwaXBlKSB7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgUElQRV9BOgotCQkJc3RhdHVzID0gREVfUElQRUFfVkJMQU5LX0lWQjsKLQkJCWJyZWFrOwotCQljYXNlIFBJUEVfQjoKLQkJCXN0YXR1cyA9IERFX1BJUEVCX1ZCTEFOS19JVkI7Ci0JCQlicmVhazsKLQkJY2FzZSBQSVBFX0M6Ci0JCQlzdGF0dXMgPSBERV9QSVBFQ19WQkxBTktfSVZCOwotCQkJYnJlYWs7Ci0JCX0KKwkJc3RhdHVzID0gREVfUElQRV9WQkxBTksocGlwZSk7CisJCXJlZyA9IERFSVNSOwogCX0KIAotCXJldHVybiBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgREVJU1IpICYgc3RhdHVzOworCXJldHVybiBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgcmVnKSAmIHN0YXR1czsKIH0KIAogc3RhdGljIGludCBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCkBAIC03MDIsNyArNjk0LDI4IEBACiAJCWVsc2UKIAkJCXBvc2l0aW9uID0gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIFBJUEVEU0wocGlwZSkpICYgRFNMX0xJTkVNQVNLX0dFTjM7CiAKLQkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgeworCQlpZiAoSEFTX0RESShkZXYpKSB7CisJCQkvKgorCQkJICogT24gSFNXIEhETUkgb3V0cHV0cyB0aGVyZSBzZWVtcyB0byBiZSBhIDIgbGluZQorCQkJICogZGlmZmVyZW5jZSwgd2hlcmVhcyBlRFAgaGFzIHRoZSBub3JtYWwgMSBsaW5lCisJCQkgKiBkaWZmZXJlbmNlIHRoYXQgZWFybGllciBwbGF0Zm9ybXMgaGF2ZS4gRXh0ZXJuYWwKKwkJCSAqIERQIGlzIHVua25vd24uIEZvciBub3cganVzdCBjaGVjayBmb3IgdGhlIDIgbGluZQorCQkJICogZGlmZmVyZW5jZSBjYXNlIG9uIGFsbCBvdXRwdXQgdHlwZXMgb24gSFNXKy4KKwkJCSAqCisJCQkgKiBUaGlzIG1pZ2h0IG1pc2ludGVycHJldCB0aGUgc2NhbmxpbmUgY291bnRlciBiZWluZworCQkJICogb25lIGxpbmUgdG9vIGZhciBhbG9uZyBvbiBlRFAsIGJ1dCB0aGF0J3MgbGVzcworCQkJICogZGFuZ2Vyb3VzIHRoYW4gdGhlIGFsdGVybmF0aXZlIHNpbmNlIHRoYXQgd291bGQgbGVhZAorCQkJICogdGhlIHZibGFuayB0aW1lc3RhbXAgY29kZSBhc3RyYXkgd2hlbiBpdCBzZWVzIGEKKwkJCSAqIHNjYW5saW5lIGNvdW50IGJlZm9yZSB2Ymxhbmtfc3RhcnQgZHVyaW5nIGEgdmJsYW5rCisJCQkgKiBpbnRlcnJ1cHQuCisJCQkgKi8KKwkJCWluX3ZibCA9IGlsa19waXBlX2luX3ZibGFua19sb2NrZWQoZGV2LCBwaXBlKTsKKwkJCWlmICgoaW5fdmJsICYmIChwb3NpdGlvbiA9PSB2Ymxfc3RhcnQgLSAyIHx8CisJCQkJCXBvc2l0aW9uID09IHZibF9zdGFydCAtIDEpKSB8fAorCQkJICAgICghaW5fdmJsICYmIChwb3NpdGlvbiA9PSB2YmxfZW5kIC0gMiB8fAorCQkJCQkgcG9zaXRpb24gPT0gdmJsX2VuZCAtIDEpKSkKKwkJCQlwb3NpdGlvbiA9IChwb3NpdGlvbiArIDIpICUgdnRvdGFsOworCQl9IGVsc2UgaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQkJLyoKIAkJCSAqIFRoZSBzY2FubGluZSBjb3VudGVyIGluY3JlbWVudHMgYXQgdGhlIGxlYWRpbmcgZWRnZQogCQkJICogb2YgaHN5bmMsIGllLiBpdCBjb21wbGV0ZWx5IG1pc3NlcyB0aGUgYWN0aXZlIHBvcnRpb24KQEAgLTI3NjksMTAgKzI3ODIsOSBAQAogCQlyZXR1cm47CiAKIAlpZiAoSEFTX1BDSF9JQlgoZGV2KSkgewotCQltYXNrID0gU0RFX0dNQlVTIHwgU0RFX0FVWF9NQVNLIHwgU0RFX1RSQU5TQl9GSUZPX1VOREVSIHwKLQkJICAgICAgIFNERV9UUkFOU0FfRklGT19VTkRFUiB8IFNERV9QT0lTT047CisJCW1hc2sgPSBTREVfR01CVVMgfCBTREVfQVVYX01BU0sgfCBTREVfUE9JU09OOwogCX0gZWxzZSB7Ci0JCW1hc2sgPSBTREVfR01CVVNfQ1BUIHwgU0RFX0FVWF9NQVNLX0NQVCB8IFNERV9FUlJPUl9DUFQ7CisJCW1hc2sgPSBTREVfR01CVVNfQ1BUIHwgU0RFX0FVWF9NQVNLX0NQVDsKIAogCQlJOTE1X1dSSVRFKFNFUlJfSU5ULCBJOTE1X1JFQUQoU0VSUl9JTlQpKTsKIAl9CkBAIC0yODMyLDIwICsyODQ0LDE5IEBACiAJCWRpc3BsYXlfbWFzayA9IChERV9NQVNURVJfSVJRX0NPTlRST0wgfCBERV9HU0VfSVZCIHwKIAkJCQlERV9QQ0hfRVZFTlRfSVZCIHwgREVfUExBTkVDX0ZMSVBfRE9ORV9JVkIgfAogCQkJCURFX1BMQU5FQl9GTElQX0RPTkVfSVZCIHwKLQkJCQlERV9QTEFORUFfRkxJUF9ET05FX0lWQiB8IERFX0FVWF9DSEFOTkVMX0FfSVZCIHwKLQkJCQlERV9FUlJfSU5UX0lWQik7CisJCQkJREVfUExBTkVBX0ZMSVBfRE9ORV9JVkIgfCBERV9BVVhfQ0hBTk5FTF9BX0lWQik7CiAJCWV4dHJhX21hc2sgPSAoREVfUElQRUNfVkJMQU5LX0lWQiB8IERFX1BJUEVCX1ZCTEFOS19JVkIgfAotCQkJICAgICAgREVfUElQRUFfVkJMQU5LX0lWQik7CisJCQkgICAgICBERV9QSVBFQV9WQkxBTktfSVZCIHwgREVfRVJSX0lOVF9JVkIpOwogCiAJCUk5MTVfV1JJVEUoR0VON19FUlJfSU5ULCBJOTE1X1JFQUQoR0VON19FUlJfSU5UKSk7CiAJfSBlbHNlIHsKIAkJZGlzcGxheV9tYXNrID0gKERFX01BU1RFUl9JUlFfQ09OVFJPTCB8IERFX0dTRSB8IERFX1BDSF9FVkVOVCB8CiAJCQkJREVfUExBTkVBX0ZMSVBfRE9ORSB8IERFX1BMQU5FQl9GTElQX0RPTkUgfAogCQkJCURFX0FVWF9DSEFOTkVMX0EgfAotCQkJCURFX1BJUEVCX0ZJRk9fVU5ERVJSVU4gfCBERV9QSVBFQV9GSUZPX1VOREVSUlVOIHwKIAkJCQlERV9QSVBFQl9DUkNfRE9ORSB8IERFX1BJUEVBX0NSQ19ET05FIHwKIAkJCQlERV9QT0lTT04pOwotCQlleHRyYV9tYXNrID0gREVfUElQRUFfVkJMQU5LIHwgREVfUElQRUJfVkJMQU5LIHwgREVfUENVX0VWRU5UOworCQlleHRyYV9tYXNrID0gREVfUElQRUFfVkJMQU5LIHwgREVfUElQRUJfVkJMQU5LIHwgREVfUENVX0VWRU5UIHwKKwkJCQlERV9QSVBFQl9GSUZPX1VOREVSUlVOIHwgREVfUElQRUFfRklGT19VTkRFUlJVTjsKIAl9CiAKIAlkZXZfcHJpdi0+aXJxX21hc2sgPSB+ZGlzcGxheV9tYXNrOwpAQCAtMjk2MSw5ICsyOTcyLDkgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKIAl1aW50MzJfdCBkZV9waXBlX21hc2tlZCA9IEdFTjhfUElQRV9GTElQX0RPTkUgfAogCQlHRU44X1BJUEVfQ0RDTEtfQ1JDX0RPTkUgfAotCQlHRU44X1BJUEVfRklGT19VTkRFUlJVTiB8CiAJCUdFTjhfREVfUElQRV9JUlFfRkFVTFRfRVJST1JTOwotCXVpbnQzMl90IGRlX3BpcGVfZW5hYmxlcyA9IGRlX3BpcGVfbWFza2VkIHwgR0VOOF9QSVBFX1ZCTEFOSzsKKwl1aW50MzJfdCBkZV9waXBlX2VuYWJsZXMgPSBkZV9waXBlX21hc2tlZCB8IEdFTjhfUElQRV9WQkxBTksgfAorCQlHRU44X1BJUEVfRklGT19VTkRFUlJVTjsKIAlpbnQgcGlwZTsKIAlkZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9BXSA9IH5kZV9waXBlX21hc2tlZDsKIAlkZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9CXSA9IH5kZV9waXBlX21hc2tlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKaW5kZXggZTA2YjllMC4uMjM0YWM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKQEAgLTEyNDQsNiArMTI0NCw3IEBACiAJaWYgKHR5cGUgPT0gSU5URUxfT1VUUFVUX0RJU1BMQVlQT1JUIHx8IHR5cGUgPT0gSU5URUxfT1VUUFVUX0VEUCkgewogCQlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2RwKGVuY29kZXIpOwogCQlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CiAJCWlyb25sYWtlX2VkcF9wYW5lbF9vZmYoaW50ZWxfZHApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggNTc1NTJlYi4uMjY4OGY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC0xMjQ5LDE3ICsxMjQ5LDI0IEBACiAKIAlEUk1fREVCVUdfS01TKCJUdXJuIGVEUCBwb3dlciBvZmZcbiIpOwogCisJV0FSTighaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkLCAiTmVlZCBWREQgdG8gdHVybiBvZmYgcGFuZWxcbiIpOworCiAJcHAgPSBpcm9ubGFrZV9nZXRfcHBfY29udHJvbChpbnRlbF9kcCk7CiAJLyogV2UgbmVlZCB0byBzd2l0Y2ggb2ZmIHBhbmVsIHBvd2VyIF9hbmRfIGZvcmNlIHZkZCwgZm9yIG90aGVyd2lzZSBzb21lCiAJICogcGFuZWxzIGdldCB2ZXJ5IHVuaGFwcHkgYW5kIGNlYXNlIHRvIHdvcmsuICovCi0JcHAgJj0gfihQT1dFUl9UQVJHRVRfT04gfCBQQU5FTF9QT1dFUl9SRVNFVCB8IEVEUF9CTENfRU5BQkxFKTsKKwlwcCAmPSB+KFBPV0VSX1RBUkdFVF9PTiB8IEVEUF9GT1JDRV9WREQgfCBQQU5FTF9QT1dFUl9SRVNFVCB8IEVEUF9CTENfRU5BQkxFKTsKIAogCXBwX2N0cmxfcmVnID0gX3BwX2N0cmxfcmVnKGludGVsX2RwKTsKIAogCUk5MTVfV1JJVEUocHBfY3RybF9yZWcsIHBwKTsKIAlQT1NUSU5HX1JFQUQocHBfY3RybF9yZWcpOwogCisJaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkID0gZmFsc2U7CisKIAlpcm9ubGFrZV93YWl0X3BhbmVsX29mZihpbnRlbF9kcCk7CisKKwkvKiBXZSBnb3QgYSByZWZlcmVuY2Ugd2hlbiB3ZSBlbmFibGVkIHRoZSBWREQuICovCisJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwogfQogCiB2b2lkIGlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKQEAgLTE2MzksNyArMTY0Niw3IEBACiAJCXZhbCB8PSBFRFBfUFNSX0xJTktfRElTQUJMRTsKIAogCUk5MTVfV1JJVEUoRURQX1BTUl9DVEwoZGV2KSwgdmFsIHwKLQkJICAgSVNfQlJPQURXRUxMKGRldikgPyAwIDogbGlua19lbnRyeV90aW1lIHwKKwkJICAgKElTX0JST0FEV0VMTChkZXYpID8gMCA6IGxpbmtfZW50cnlfdGltZSkgfAogCQkgICBtYXhfc2xlZXBfdGltZSA8PCBFRFBfUFNSX01BWF9TTEVFUF9USU1FX1NISUZUIHwKIAkJICAgaWRsZV9mcmFtZXMgPDwgRURQX1BTUl9JRExFX0ZSQU1FX1NISUZUIHwKIAkJICAgRURQX1BTUl9FTkFCTEUpOwpAQCAtMTc4NCw2ICsxNzkxLDcgQEAKIAogCS8qIE1ha2Ugc3VyZSB0aGUgcGFuZWwgaXMgb2ZmIGJlZm9yZSB0cnlpbmcgdG8gY2hhbmdlIHRoZSBtb2RlLiBCdXQgYWxzbwogCSAqIGVuc3VyZSB0aGF0IHdlIGhhdmUgdmRkIHdoaWxlIHdlIHN3aXRjaCBvZmYgdGhlIHBhbmVsLiAqLworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOwogCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGludGVsX2RwKTsKIAlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIERSTV9NT0RFX0RQTVNfT0ZGKTsKIAlpcm9ubGFrZV9lZHBfcGFuZWxfb2ZmKGludGVsX2RwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jCmluZGV4IDg5YzQ4NGQuLjRlZTcwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcm0uYwpAQCAtODY2LDEzICs4NjYsMTYgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgcmV0OwogCi0JaWYgKG5vdXZlYXVfcnVudGltZV9wbSA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobm91dmVhdV9ydW50aW1lX3BtID09IDApIHsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAkvKiBhcmUgd2Ugb3B0aW11cyBlbmFibGVkPyAqLwogCWlmIChub3V2ZWF1X3J1bnRpbWVfcG0gPT0gLTEgJiYgIW5vdXZlYXVfaXNfb3B0aW11cygpICYmICFub3V2ZWF1X2lzX3YxX2RzbSgpKSB7CiAJCURSTV9ERUJVR19EUklWRVIoImZhaWxpbmcgdG8gcG93ZXIgb2ZmIC0gbm90IG9wdGltdXNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAludl9kZWJ1Z19sZXZlbChTSUxFTlQpOwpAQCAtOTIzLDEyICs5MjYsMTUgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKGRybV9kZXYpOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAotCWlmIChub3V2ZWF1X3J1bnRpbWVfcG0gPT0gMCkKKwlpZiAobm91dmVhdV9ydW50aW1lX3BtID09IDApIHsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAkvKiBhcmUgd2Ugb3B0aW11cyBlbmFibGVkPyAqLwogCWlmIChub3V2ZWF1X3J1bnRpbWVfcG0gPT0gLTEgJiYgIW5vdXZlYXVfaXNfb3B0aW11cygpICYmICFub3V2ZWF1X2lzX3YxX2RzbSgpKSB7CiAJCURSTV9ERUJVR19EUklWRVIoImZhaWxpbmcgdG8gcG93ZXIgb2ZmIC0gbm90IG9wdGltdXNcbiIpOworCQlwbV9ydW50aW1lX2ZvcmJpZChkZXYpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwppbmRleCA4NGExYmJiNy4uZjYzM2MyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTQwMywxMSArNDAzLDE1IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IHJldDsKIAotCWlmIChyYWRlb25fcnVudGltZV9wbSA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gMCkgeworCQlwbV9ydW50aW1lX2ZvcmJpZChkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAotCWlmIChyYWRlb25fcnVudGltZV9wbSA9PSAtMSAmJiAhcmFkZW9uX2lzX3B4KCkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyYWRlb25fcnVudGltZV9wbSA9PSAtMSAmJiAhcmFkZW9uX2lzX3B4KCkpIHsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlkcm1fZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HOwogCWRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZShkcm1fZGV2KTsKQEAgLTQ1NiwxMiArNDYwLDE1IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCi0JaWYgKHJhZGVvbl9ydW50aW1lX3BtID09IDApCisJaWYgKHJhZGVvbl9ydW50aW1lX3BtID09IDApIHsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAkvKiBhcmUgd2UgUFggZW5hYmxlZD8gKi8KIAlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gLTEgJiYgIXJhZGVvbl9pc19weCgpKSB7CiAJCURSTV9ERUJVR19EUklWRVIoImZhaWxpbmcgdG8gcG93ZXIgb2ZmIC0gbm90IHB4XG4iKTsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZ2VtLmMKaW5kZXggOGQ2N2I5NC4uMDM5NDgxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZ2VtLmMKQEAgLTE3Nyw4ICsxNzcsMTAgQEAKIAlpZiAob2JqLT52bWFwcGluZykKIAkJdWRsX2dlbV92dW5tYXAob2JqKTsKIAotCWlmIChnZW1fb2JqLT5pbXBvcnRfYXR0YWNoKQorCWlmIChnZW1fb2JqLT5pbXBvcnRfYXR0YWNoKSB7CiAJCWRybV9wcmltZV9nZW1fZGVzdHJveShnZW1fb2JqLCBvYmotPnNnKTsKKwkJcHV0X2RldmljZShnZW1fb2JqLT5kZXYtPmRldik7CisJfQogCiAJaWYgKG9iai0+cGFnZXMpCiAJCXVkbF9nZW1fcHV0X3BhZ2VzKG9iaik7CkBAIC0yNTYsOSArMjU4LDEyIEBACiAJaW50IHJldDsKIAogCS8qIG5lZWQgdG8gYXR0YWNoICovCisJZ2V0X2RldmljZShkZXYtPmRldik7CiAJYXR0YWNoID0gZG1hX2J1Zl9hdHRhY2goZG1hX2J1ZiwgZGV2LT5kZXYpOwotCWlmIChJU19FUlIoYXR0YWNoKSkKKwlpZiAoSVNfRVJSKGF0dGFjaCkpIHsKKwkJcHV0X2RldmljZShkZXYtPmRldik7CiAJCXJldHVybiBFUlJfQ0FTVChhdHRhY2gpOworCX0KIAogCWdldF9kbWFfYnVmKGRtYV9idWYpOwogCkBAIC0yODIsNiArMjg3LDYgQEAKIGZhaWxfZGV0YWNoOgogCWRtYV9idWZfZGV0YWNoKGRtYV9idWYsIGF0dGFjaCk7CiAJZG1hX2J1Zl9wdXQoZG1hX2J1Zik7Ci0KKwlwdXRfZGV2aWNlKGRldi0+ZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggY2MzMmE2Zi4uMjQ0OGQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0yMjc4LDYgKzIyNzgsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMjApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1lFQUxJTkssIFVTQl9ERVZJQ0VfSURfWUVBTElOS19QMUtfUDRLX0IySykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUklTT19LQUdBS1UsIFVTQl9ERVZJQ0VfSURfUklfS0FfV0VCTUFJTCkgfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaCBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAppbmRleCAyMmYyOGQ2Li44MzBkZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCkBAIC05NjEsNCArOTYxLDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9QUklNQVhfS0VZQk9BUkQJMHg0ZTA1CiAKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1JJU09fS0FHQUtVCTB4MTI5NAkvKiBSaXNvIEthZ2FrdSBDb3JwLiAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1JJX0tBX1dFQk1BSUwJMHgxMzIwCS8qIFdlYm1haWwgTm90aWZpZXIgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jCmluZGV4IGJlZmUwZTMuLjI0ODgzYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jCkBAIC00Myw2ICs0Myw3IEBACiAjZGVmaW5lIEcyNV9SRVZfTUlOIDB4MjIKICNkZWZpbmUgRzI3X1JFVl9NQUogMHgxMgogI2RlZmluZSBHMjdfUkVWX01JTiAweDM4CisjZGVmaW5lIEcyN18yX1JFVl9NSU4gMHgzOQogCiAjZGVmaW5lIHRvX2hpZF9kZXZpY2UocGRldikgY29udGFpbmVyX29mKHBkZXYsIHN0cnVjdCBoaWRfZGV2aWNlLCBkZXYpCiAKQEAgLTEzMCw2ICsxMzEsNyBAQAogCXtERlBfUkVWX01BSiwgIERGUF9SRVZfTUlOLCAgJm5hdGl2ZV9kZnB9LAkvKiBEcml2aW5nIEZvcmNlIFBybyAqLwogCXtHMjVfUkVWX01BSiwgIEcyNV9SRVZfTUlOLCAgJm5hdGl2ZV9nMjV9LAkvKiBHMjUgKi8KIAl7RzI3X1JFVl9NQUosICBHMjdfUkVWX01JTiwgICZuYXRpdmVfZzI3fSwJLyogRzI3ICovCisJe0cyN19SRVZfTUFKLCAgRzI3XzJfUkVWX01JTiwgICZuYXRpdmVfZzI3fSwJLyogRzI3IHYyICovCiB9OwogCiAvKiBSZWNhbGN1bGF0ZXMgWCBheGlzIHZhbHVlIGFjY29yZGluZ2x5IHRvIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jIGIvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCmluZGV4IDdlZDgyODAuLjkxZmFiOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKQEAgLTYyNCw3ICs2MjQsOCBAQAogCiAJLyogU2V0dXAgc291bmQgY2FyZCAqLwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwbS0+cGstPmhkZXYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcGtfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgcGMtbWlkaSBzb3VuZCBjYXJkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTY2MCw4ICs2NjEsNiBAQAogCXNuZF9yYXdtaWRpX3NldF9vcHMocndtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwKIAkJJnBjbWlkaV9pbl9vcHMpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcG0tPnBrLT5oZGV2LT5kZXYpOwotCiAJLyogY3JlYXRlIHN5c2ZzIHZhcmlhYmxlcyAqLwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcG0tPnBrLT5oZGV2LT5kZXYsCiAJCQkJIHN5c2ZzX2RldmljZV9hdHRyX2NoYW5uZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKaW5kZXggMTIzNTQwNS4uMmYxOWIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIERVQUxTSE9DSzRfQ09OVFJPTExFUl9CVCAgQklUKDYpCiAKICNkZWZpbmUgU09OWV9MRURfU1VQUE9SVCAoU0lYQVhJU19DT05UUk9MTEVSX1VTQiB8IEJVWlpfQ09OVFJPTExFUiB8IERVQUxTSE9DSzRfQ09OVFJPTExFUl9VU0IpCisjZGVmaW5lIFNPTllfRkZfU1VQUE9SVCAoU0lYQVhJU19DT05UUk9MTEVSX1VTQiB8IERVQUxTSE9DSzRfQ09OVFJPTExFUl9VU0IpCiAKICNkZWZpbmUgTUFYX0xFRFMgNAogCkBAIC00OTksNiArNTAwLDcgQEAKIAlfX3U4IHJpZ2h0OwogI2VuZGlmCiAKKwlfX3U4IHdvcmtlcl9pbml0aWFsaXplZDsKIAlfX3U4IGxlZF9zdGF0ZVtNQVhfTEVEU107CiAJX191OCBsZWRfY291bnQ7CiB9OwpAQCAtOTkzLDIyICs5OTUsMTEgQEAKIAlyZXR1cm4gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoaW5wdXRfZGV2LCBOVUxMLCBzb255X3BsYXlfZWZmZWN0KTsKIH0KIAotc3RhdGljIHZvaWQgc29ueV9kZXN0cm95X2ZmKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQotewotCXN0cnVjdCBzb255X3NjICpzYyA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKLQotCWNhbmNlbF93b3JrX3N5bmMoJnNjLT5zdGF0ZV93b3JrZXIpOwotfQotCiAjZWxzZQogc3RhdGljIGludCBzb255X2luaXRfZmYoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyB2b2lkIHNvbnlfZGVzdHJveV9mZihzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKLXsKLX0KICNlbmRpZgogCiBzdGF0aWMgaW50IHNvbnlfc2V0X291dHB1dF9yZXBvcnQoc3RydWN0IHNvbnlfc2MgKnNjLCBpbnQgcmVxX2lkLCBpbnQgcmVxX3NpemUpCkBAIC0xMDc3LDYgKzEwNjgsOCBAQAogCWlmIChzYy0+cXVpcmtzICYgU0lYQVhJU19DT05UUk9MTEVSX1VTQikgewogCQloZGV2LT5oaWRfb3V0cHV0X3Jhd19yZXBvcnQgPSBzaXhheGlzX3VzYl9vdXRwdXRfcmF3X3JlcG9ydDsKIAkJcmV0ID0gc2l4YXhpc19zZXRfb3BlcmF0aW9uYWxfdXNiKGhkZXYpOworCisJCXNjLT53b3JrZXJfaW5pdGlhbGl6ZWQgPSAxOwogCQlJTklUX1dPUksoJnNjLT5zdGF0ZV93b3JrZXIsIHNpeGF4aXNfc3RhdGVfd29ya2VyKTsKIAl9CiAJZWxzZSBpZiAoc2MtPnF1aXJrcyAmIFNJWEFYSVNfQ09OVFJPTExFUl9CVCkKQEAgLTEwODcsNiArMTA4MCw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcnJfc3RvcDsKIAorCQlzYy0+d29ya2VyX2luaXRpYWxpemVkID0gMTsKIAkJSU5JVF9XT1JLKCZzYy0+c3RhdGVfd29ya2VyLCBkdWFsc2hvY2s0X3N0YXRlX3dvcmtlcik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gMDsKQEAgLTExMDEsOSArMTA5NSwxMSBAQAogCQkJZ290byBlcnJfc3RvcDsKIAl9CiAKLQlyZXQgPSBzb255X2luaXRfZmYoaGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3N0b3A7CisJaWYgKHNjLT5xdWlya3MgJiBTT05ZX0ZGX1NVUFBPUlQpIHsKKwkJcmV0ID0gc29ueV9pbml0X2ZmKGhkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX3N0b3A7CisJfQogCiAJcmV0dXJuIDA7CiBlcnJfc3RvcDoKQEAgLTExMjAsNyArMTExNiw4IEBACiAJaWYgKHNjLT5xdWlya3MgJiBTT05ZX0xFRF9TVVBQT1JUKQogCQlzb255X2xlZHNfcmVtb3ZlKGhkZXYpOwogCi0Jc29ueV9kZXN0cm95X2ZmKGhkZXYpOworCWlmIChzYy0+d29ya2VyX2luaXRpYWxpemVkKQorCQljYW5jZWxfd29ya19zeW5jKCZzYy0+c3RhdGVfd29ya2VyKTsKIAogCWhpZF9od19zdG9wKGhkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkcmF3LmMgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwppbmRleCBjYjAxMzdiLi5hYjI0Y2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWRyYXcuYworKysgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwpAQCAtMzIwLDEzICszMjAsMTMgQEAKIAkJCWhpZF9od19jbG9zZShoaWRyYXctPmhpZCk7CiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZHJhdy0+d2FpdCk7CiAJCX0KKwkJZGV2aWNlX2Rlc3Ryb3koaGlkcmF3X2NsYXNzLAorCQkJICAgICAgIE1LREVWKGhpZHJhd19tYWpvciwgaGlkcmF3LT5taW5vcikpOwogCX0gZWxzZSB7CiAJCS0taGlkcmF3LT5vcGVuOwogCX0KIAlpZiAoIWhpZHJhdy0+b3BlbikgewogCQlpZiAoIWhpZHJhdy0+ZXhpc3QpIHsKLQkJCWRldmljZV9kZXN0cm95KGhpZHJhd19jbGFzcywKLQkJCQkJTUtERVYoaGlkcmF3X21ham9yLCBoaWRyYXctPm1pbm9yKSk7CiAJCQloaWRyYXdfdGFibGVbaGlkcmF3LT5taW5vcl0gPSBOVUxMOwogCQkJa2ZyZWUoaGlkcmF3KTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvTWFrZWZpbGUgYi9kcml2ZXJzL2h2L01ha2VmaWxlCmluZGV4IDBhNzRiNTYuLjVlNGRmYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9odi9NYWtlZmlsZQpAQCAtNSw0ICs1LDQgQEAKIGh2X3ZtYnVzLXkgOj0gdm1idXNfZHJ2Lm8gXAogCQkgaHYubyBjb25uZWN0aW9uLm8gY2hhbm5lbC5vIFwKIAkJIGNoYW5uZWxfbWdtdC5vIHJpbmdfYnVmZmVyLm8KLWh2X3V0aWxzLXkgOj0gaHZfdXRpbC5vIGh2X2t2cC5vIGh2X3NuYXBzaG90Lm8KK2h2X3V0aWxzLXkgOj0gaHZfdXRpbC5vIGh2X2t2cC5vIGh2X3NuYXBzaG90Lm8gaHZfZmNvcHkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9jaGFubmVsLmMgYi9kcml2ZXJzL2h2L2NoYW5uZWwuYwppbmRleCA2OWVhMzZmLi42MDJjYTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2NoYW5uZWwuYworKysgYi9kcml2ZXJzL2h2L2NoYW5uZWwuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogI2luY2x1ZGUgImh5cGVydl92bWJ1cy5oIgogCkBAIC01NTQsMTQgKzU1NSwxNCBAQAogICoKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotaW50IHZtYnVzX3NlbmRwYWNrZXQoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKK2ludCB2bWJ1c19zZW5kcGFja2V0KHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCB2b2lkICpidWZmZXIsCiAJCQkgICB1MzIgYnVmZmVybGVuLCB1NjQgcmVxdWVzdGlkLAogCQkJICAgZW51bSB2bWJ1c19wYWNrZXRfdHlwZSB0eXBlLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgZGVzYzsKIAl1MzIgcGFja2V0bGVuID0gc2l6ZW9mKHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yKSArIGJ1ZmZlcmxlbjsKIAl1MzIgcGFja2V0bGVuX2FsaWduZWQgPSBBTElHTihwYWNrZXRsZW4sIHNpemVvZih1NjQpKTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgYnVmZmVybGlzdFszXTsKKwlzdHJ1Y3Qga3ZlYyBidWZmZXJsaXN0WzNdOwogCXU2NCBhbGlnbmVkX2RhdGEgPSAwOwogCWludCByZXQ7CiAJYm9vbCBzaWduYWwgPSBmYWxzZTsKQEAgLTU3NSwxMSArNTc2LDEyIEBACiAJZGVzYy5sZW44ID0gKHUxNikocGFja2V0bGVuX2FsaWduZWQgPj4gMyk7CiAJZGVzYy50cmFuc19pZCA9IHJlcXVlc3RpZDsKIAotCXNnX2luaXRfdGFibGUoYnVmZmVybGlzdCwgMyk7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFswXSwgJmRlc2MsIHNpemVvZihzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvcikpOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMV0sIGJ1ZmZlciwgYnVmZmVybGVuKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzJdLCAmYWxpZ25lZF9kYXRhLAotCQkgICBwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CisJYnVmZmVybGlzdFswXS5pb3ZfYmFzZSA9ICZkZXNjOworCWJ1ZmZlcmxpc3RbMF0uaW92X2xlbiA9IHNpemVvZihzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvcik7CisJYnVmZmVybGlzdFsxXS5pb3ZfYmFzZSA9IGJ1ZmZlcjsKKwlidWZmZXJsaXN0WzFdLmlvdl9sZW4gPSBidWZmZXJsZW47CisJYnVmZmVybGlzdFsyXS5pb3ZfYmFzZSA9ICZhbGlnbmVkX2RhdGE7CisJYnVmZmVybGlzdFsyXS5pb3ZfbGVuID0gKHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAogCXJldCA9IGh2X3JpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCAzLCAmc2lnbmFsKTsKIApAQCAtNjA1LDcgKzYwNyw3IEBACiAJdTMyIGRlc2NzaXplOwogCXUzMiBwYWNrZXRsZW47CiAJdTMyIHBhY2tldGxlbl9hbGlnbmVkOwotCXN0cnVjdCBzY2F0dGVybGlzdCBidWZmZXJsaXN0WzNdOworCXN0cnVjdCBrdmVjIGJ1ZmZlcmxpc3RbM107CiAJdTY0IGFsaWduZWRfZGF0YSA9IDA7CiAJYm9vbCBzaWduYWwgPSBmYWxzZTsKIApAQCAtNjM3LDExICs2MzksMTIgQEAKIAkJZGVzYy5yYW5nZVtpXS5wZm4JID0gcGFnZWJ1ZmZlcnNbaV0ucGZuOwogCX0KIAotCXNnX2luaXRfdGFibGUoYnVmZmVybGlzdCwgMyk7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFswXSwgJmRlc2MsIGRlc2NzaXplKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzFdLCBidWZmZXIsIGJ1ZmZlcmxlbik7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsyXSwgJmFsaWduZWRfZGF0YSwKLQkJcGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOworCWJ1ZmZlcmxpc3RbMF0uaW92X2Jhc2UgPSAmZGVzYzsKKwlidWZmZXJsaXN0WzBdLmlvdl9sZW4gPSBkZXNjc2l6ZTsKKwlidWZmZXJsaXN0WzFdLmlvdl9iYXNlID0gYnVmZmVyOworCWJ1ZmZlcmxpc3RbMV0uaW92X2xlbiA9IGJ1ZmZlcmxlbjsKKwlidWZmZXJsaXN0WzJdLmlvdl9iYXNlID0gJmFsaWduZWRfZGF0YTsKKwlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsICZzaWduYWwpOwogCkBAIC02NjUsNyArNjY4LDcgQEAKIAl1MzIgZGVzY3NpemU7CiAJdTMyIHBhY2tldGxlbjsKIAl1MzIgcGFja2V0bGVuX2FsaWduZWQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IGJ1ZmZlcmxpc3RbM107CisJc3RydWN0IGt2ZWMgYnVmZmVybGlzdFszXTsKIAl1NjQgYWxpZ25lZF9kYXRhID0gMDsKIAlib29sIHNpZ25hbCA9IGZhbHNlOwogCXUzMiBwZm5jb3VudCA9IE5VTV9QQUdFU19TUEFOTkVEKG11bHRpX3BhZ2VidWZmZXItPm9mZnNldCwKQEAgLTcwMCwxMSArNzAzLDEyIEBACiAJbWVtY3B5KGRlc2MucmFuZ2UucGZuX2FycmF5LCBtdWx0aV9wYWdlYnVmZmVyLT5wZm5fYXJyYXksCiAJICAgICAgIHBmbmNvdW50ICogc2l6ZW9mKHU2NCkpOwogCi0Jc2dfaW5pdF90YWJsZShidWZmZXJsaXN0LCAzKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzBdLCAmZGVzYywgZGVzY3NpemUpOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMV0sIGJ1ZmZlciwgYnVmZmVybGVuKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzJdLCAmYWxpZ25lZF9kYXRhLAotCQlwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CisJYnVmZmVybGlzdFswXS5pb3ZfYmFzZSA9ICZkZXNjOworCWJ1ZmZlcmxpc3RbMF0uaW92X2xlbiA9IGRlc2NzaXplOworCWJ1ZmZlcmxpc3RbMV0uaW92X2Jhc2UgPSBidWZmZXI7CisJYnVmZmVybGlzdFsxXS5pb3ZfbGVuID0gYnVmZmVybGVuOworCWJ1ZmZlcmxpc3RbMl0uaW92X2Jhc2UgPSAmYWxpZ25lZF9kYXRhOworCWJ1ZmZlcmxpc3RbMl0uaW92X2xlbiA9IChwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CiAKIAlyZXQgPSBodl9yaW5nYnVmZmVyX3dyaXRlKCZjaGFubmVsLT5vdXRib3VuZCwgYnVmZmVybGlzdCwgMywgJnNpZ25hbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfYmFsbG9vbi5jIGIvZHJpdmVycy9odi9odl9iYWxsb29uLmMKaW5kZXggN2UxN2E1NC4uN2U2ZDc4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9iYWxsb29uLmMKKysrIGIvZHJpdmVycy9odi9odl9iYWxsb29uLmMKQEAgLTExNzEsNyArMTE3MSw4IEBACiAJaW50IHQ7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkbV9kZXZpY2UuY29uZmlnX2V2ZW50LCAxKkhaKTsKKwkJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCQkJJmRtX2RldmljZS5jb25maWdfZXZlbnQsIDEqSFopOwogCQkvKgogCQkgKiBUaGUgaG9zdCBleHBlY3RzIHVzIHRvIHBvc3QgaW5mb3JtYXRpb24gb24gdGhlIG1lbW9yeQogCQkgKiBwcmVzc3VyZSBldmVyeSBzZWNvbmQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMgYi9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhYTNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHYvaHZfZmNvcHkuYwpAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGZpbGUgY29weSBzZXJ2aWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCwgTWljcm9zb2Z0LCBJbmMuCisgKgorICogQXV0aG9yIDogSy4gWS4gU3Jpbml2YXNhbiA8a3NyaW5pdmFzYW5Abm92ZWxsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworI2luY2x1ZGUgImh5cGVydl92bWJ1cy5oIgorCisjZGVmaW5lIFdJTjhfU1JWX01BSk9SCQkxCisjZGVmaW5lIFdJTjhfU1JWX01JTk9SCQkxCisjZGVmaW5lIFdJTjhfU1JWX1ZFUlNJT04JKFdJTjhfU1JWX01BSk9SIDw8IDE2IHwgV0lOOF9TUlZfTUlOT1IpCisKKy8qCisgKiBHbG9iYWwgc3RhdGUgbWFpbnRhaW5lZCBmb3IgdHJhbnNhY3Rpb24gdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQuCisgKiBGb3IgYSBjbGFzcyBvZiBpbnRlZ3JhdGlvbiBzZXJ2aWNlcywgaW5jbHVkaW5nIHRoZSAiZmlsZSBjb3B5IHNlcnZpY2UiLAorICogdGhlIHNwZWNpZmllZCBwcm90b2NvbCBpcyBhICJyZXF1ZXN0L3Jlc3BvbnNlIiBwcm90b2NvbCB3aGljaCBtZWFucyB0aGF0CisgKiB0aGVyZSBjYW4gb25seSBiZSBzaW5nbGUgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24gZnJvbSB0aGUgaG9zdCBhdCBhbnkKKyAqIGdpdmVuIHBvaW50IGluIHRpbWUuIFdlIHVzZSB0aGlzIHRvIHNpbXBsaWZ5IG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoaXMKKyAqIGRyaXZlciAtIHdlIGNhY2hlIGFuZCBwcm9jZXNzIG9ubHkgb25lIG1lc3NhZ2UgYXQgYSB0aW1lLgorICoKKyAqIFdoaWxlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHByb3RvY29sIGlzIGd1YXJhbnRlZWQgYnkgdGhlIGhvc3QsIHdlIGZ1cnRoZXIKKyAqIGVuc3VyZSB0aGlzIGJ5IHNlcmlhbGl6aW5nIHBhY2tldCBwcm9jZXNzaW5nIGluIHRoaXMgZHJpdmVyIC0gd2UgZG8gbm90CisgKiByZWFkIGFkZGl0aW9uYWwgcGFja2V0cyBmcm9tIHRoZSBWTUJVcyB1bnRpbCB0aGUgY3VycmVudCBwYWNrZXQgaXMgZnVsbHkKKyAqIGhhbmRsZWQuCisgKgorICogVGhlIHRyYW5zYWN0aW9uICJhY3RpdmUiIHN0YXRlIGlzIHNldCB3aGVuIHdlIHJlY2VpdmUgYSByZXF1ZXN0IGZyb20gdGhlCisgKiBob3N0IGFuZCB3ZSBjbGVhbnVwIHRoaXMgc3RhdGUgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGVkIC0gd2hlbiB3ZQorICogcmVzcG9uZCB0byB0aGUgaG9zdCB3aXRoIG91ciByZXNwb25zZS4gV2hlbiB0aGUgdHJhbnNhY3Rpb24gYWN0aXZlIHN0YXRlIGlzCisgKiBzZXQsIHdlIGRlZmVyIGhhbmRsaW5nIGluY29taW5nIHBhY2tldHMuCisgKi8KKworc3RhdGljIHN0cnVjdCB7CisJYm9vbCBhY3RpdmU7IC8qIHRyYW5zYWN0aW9uIHN0YXR1cyAtIGFjdGl2ZSBvciBub3QgKi8KKwlpbnQgcmVjdl9sZW47IC8qIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4gKi8KKwlzdHJ1Y3QgaHZfZmNvcHlfaGRyICAqZmNvcHlfbXNnOyAvKiBjdXJyZW50IG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgIG1lc3NhZ2U7IC8qICBzZW50IHRvIGRhZW1vbiAqLworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpyZWN2X2NoYW5uZWw7IC8qIGNobiB3ZSBnb3QgdGhlIHJlcXVlc3QgKi8KKwl1NjQgcmVjdl9yZXFfaWQ7IC8qIHJlcXVlc3QgSUQuICovCisJdm9pZCAqZmNvcHlfY29udGV4dDsgLyogZm9yIHRoZSBjaGFubmVsIGNhbGxiYWNrICovCisJc3RydWN0IHNlbWFwaG9yZSByZWFkX3NlbWE7Cit9IGZjb3B5X3RyYW5zYWN0aW9uOworCitzdGF0aWMgYm9vbCBvcGVuZWQ7IC8qIGN1cnJlbnRseSBkZXZpY2Ugb3BlbmVkICovCisKKy8qCisgKiBCZWZvcmUgd2UgY2FuIGFjY2VwdCBjb3B5IG1lc3NhZ2VzIGZyb20gdGhlIGhvc3QsIHdlIG5lZWQKKyAqIHRvIGhhbmRzaGFrZSB3aXRoIHRoZSB1c2VyIGxldmVsIGRhZW1vbi4gVGhpcyBzdGF0ZSB0cmFja3MKKyAqIGlmIHdlIGFyZSBpbiB0aGUgaGFuZHNoYWtlIHBoYXNlLgorICovCitzdGF0aWMgYm9vbCBpbl9oYW5kX3NoYWtlID0gdHJ1ZTsKK3N0YXRpYyB2b2lkIGZjb3B5X3NlbmRfZGF0YSh2b2lkKTsKK3N0YXRpYyB2b2lkIGZjb3B5X3Jlc3BvbmRfdG9faG9zdChpbnQgZXJyb3IpOworc3RhdGljIHZvaWQgZmNvcHlfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGZjb3B5X3dvcmssIGZjb3B5X3dvcmtfZnVuYyk7CitzdGF0aWMgdTggKnJlY3ZfYnVmZmVyOworCitzdGF0aWMgdm9pZCBmY29weV93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKK3sKKwkvKgorCSAqIElmIHRoZSB0aW1lciBmaXJlcywgdGhlIHVzZXItbW9kZSBjb21wb25lbnQgaGFzIG5vdCByZXNwb25kZWQ7CisJICogcHJvY2VzcyB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlmY29weV9yZXNwb25kX3RvX2hvc3QoSFZfRV9GQUlMKTsKK30KKworc3RhdGljIGludCBmY29weV9oYW5kbGVfaGFuZHNoYWtlKHUzMiB2ZXJzaW9uKQoreworCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgRkNPUFlfQ1VSUkVOVF9WRVJTSU9OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBGb3Igbm93IHdlIHdpbGwgZmFpbCB0aGUgcmVnaXN0cmF0aW9uLgorCQkgKiBJZiBhbmQgd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHZlcnNpb25zIHRvCisJCSAqIGRlYWwgd2l0aCwgd2Ugd2lsbCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlLgorCQkgKiBXZSB3aWxsIGFkZCB0aGlzIGNvZGUgd2hlbiBuZWVkZWQuCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfaW5mbygiRkNQOiB1c2VyLW1vZGUgcmVnaXN0ZXJpbmcgZG9uZS4gRGFlbW9uIHZlcnNpb246ICVkXG4iLAorCQl2ZXJzaW9uKTsKKwlmY29weV90cmFuc2FjdGlvbi5hY3RpdmUgPSBmYWxzZTsKKwlpZiAoZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfY29udGV4dCkKKwkJaHZfZmNvcHlfb25jaGFubmVsY2FsbGJhY2soZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfY29udGV4dCk7CisJaW5faGFuZF9zaGFrZSA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmY29weV9zZW5kX2RhdGEodm9pZCkKK3sKKwlzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgKnNtc2dfb3V0ID0gJmZjb3B5X3RyYW5zYWN0aW9uLm1lc3NhZ2U7CisJaW50IG9wZXJhdGlvbiA9IGZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X21zZy0+b3BlcmF0aW9uOworCXN0cnVjdCBodl9zdGFydF9mY29weSAqc21zZ19pbjsKKworCS8qCisJICogVGhlICBzdHJpbmdzIHNlbnQgZnJvbSB0aGUgaG9zdCBhcmUgZW5jb2RlZCBpbgorCSAqIGluIHV0ZjE2OyBjb252ZXJ0IGl0IHRvIHV0Zjggc3RyaW5ncy4KKwkgKiBUaGUgaG9zdCBhc3N1cmVzIHVzIHRoYXQgdGhlIHV0ZjE2IHN0cmluZ3Mgd2lsbCBub3QgZXhjZWVkCisJICogdGhlIG1heCBsZW5ndGhzIHNwZWNpZmllZC4gV2Ugd2lsbCBob3dldmVyLCByZXNlcnZlIHJvb20KKwkgKiBmb3IgdGhlIHN0cmluZyB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgLSBpbiB0aGUgdXRmMTZzX3V0ZjhzKCkKKwkgKiBmdW5jdGlvbiB3ZSBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHdoZXJlIHRoZSBjb252ZXJ0ZWQKKwkgKiBzdHJpbmcgaXMgcGxhY2VkIHRvIFdfTUFYX1BBVEggLTEgdG8gZ3VhcmFudGVlCisJICogdGhhdCB0aGUgc3RyaW5ncyBjYW4gYmUgcHJvcGVybHkgdGVybWluYXRlZCEKKwkgKi8KKworCXN3aXRjaCAob3BlcmF0aW9uKSB7CisJY2FzZSBTVEFSVF9GSUxFX0NPUFk6CisJCW1lbXNldChzbXNnX291dCwgMCwgc2l6ZW9mKHN0cnVjdCBodl9zdGFydF9mY29weSkpOworCQlzbXNnX291dC0+aGRyLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwkJc21zZ19pbiA9IChzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgKilmY29weV90cmFuc2FjdGlvbi5mY29weV9tc2c7CisKKwkJdXRmMTZzX3RvX3V0ZjhzKCh3Y2hhcl90ICopc21zZ19pbi0+ZmlsZV9uYW1lLCBXX01BWF9QQVRILAorCQkJCVVURjE2X0xJVFRMRV9FTkRJQU4sCisJCQkJKF9fdTggKilzbXNnX291dC0+ZmlsZV9uYW1lLCBXX01BWF9QQVRIIC0gMSk7CisKKwkJdXRmMTZzX3RvX3V0ZjhzKCh3Y2hhcl90ICopc21zZ19pbi0+cGF0aF9uYW1lLCBXX01BWF9QQVRILAorCQkJCVVURjE2X0xJVFRMRV9FTkRJQU4sCisJCQkJKF9fdTggKilzbXNnX291dC0+cGF0aF9uYW1lLCBXX01BWF9QQVRIIC0gMSk7CisKKwkJc21zZ19vdXQtPmNvcHlfZmxhZ3MgPSBzbXNnX2luLT5jb3B5X2ZsYWdzOworCQlzbXNnX291dC0+ZmlsZV9zaXplID0gc21zZ19pbi0+ZmlsZV9zaXplOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwl1cCgmZmNvcHlfdHJhbnNhY3Rpb24ucmVhZF9zZW1hKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTZW5kIGEgcmVzcG9uc2UgYmFjayB0byB0aGUgaG9zdC4KKyAqLworCitzdGF0aWMgdm9pZAorZmNvcHlfcmVzcG9uZF90b19ob3N0KGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgaWNtc2dfaGRyICppY21zZ2hkcjsKKwl1MzIgYnVmX2xlbjsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKKwl1NjQgcmVxX2lkOworCisJLyoKKwkgKiBDb3B5IHRoZSBnbG9iYWwgc3RhdGUgZm9yIGNvbXBsZXRpbmcgdGhlIHRyYW5zYWN0aW9uLiBOb3RlIHRoYXQKKwkgKiBvbmx5IG9uZSB0cmFuc2FjdGlvbiBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZS4gVGhpcyBpcyBndWFyYW50ZWVkCisJICogYnkgdGhlIGZpbGUgY29weSBwcm90b2NvbCBpbXBsZW1lbnRlZCBieSB0aGUgaG9zdC4gRnVydGhlcm1vcmUsCisJICogdGhlICJ0cmFuc2FjdGlvbiBhY3RpdmUiIHN0YXRlIHdlIG1haW50YWluIGVuc3VyZXMgdGhhdCB0aGVyZSBjYW4KKwkgKiBvbmx5IGJlIG9uZSBhY3RpdmUgdHJhbnNhY3Rpb24gYXQgYSB0aW1lLgorCSAqLworCisJYnVmX2xlbiA9IGZjb3B5X3RyYW5zYWN0aW9uLnJlY3ZfbGVuOworCWNoYW5uZWwgPSBmY29weV90cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWw7CisJcmVxX2lkID0gZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9yZXFfaWQ7CisKKwlmY29weV90cmFuc2FjdGlvbi5hY3RpdmUgPSBmYWxzZTsKKworCWljbXNnaGRyID0gKHN0cnVjdCBpY21zZ19oZHIgKikKKwkJCSZyZWN2X2J1ZmZlcltzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKKworCWlmIChjaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPT0gTlVMTCkKKwkJLyoKKwkJICogV2UgaGF2ZSByYWNlZCB3aXRoIHV0aWwgZHJpdmVyIGJlaW5nIHVubG9hZGVkOworCQkgKiBzaWxlbnRseSByZXR1cm4uCisJCSAqLworCQlyZXR1cm47CisKKwlpY21zZ2hkci0+c3RhdHVzID0gZXJyb3I7CisJaWNtc2doZHItPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04gfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7CisJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCByZWN2X2J1ZmZlciwgYnVmX2xlbiwgcmVxX2lkLAorCQkJCVZNX1BLVF9EQVRBX0lOQkFORCwgMCk7Cit9CisKK3ZvaWQgaHZfZmNvcHlfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7CisJdTMyIHJlY3ZsZW47CisJdTY0IHJlcXVlc3RpZDsKKwlzdHJ1Y3QgaHZfZmNvcHlfaGRyICpmY29weV9tc2c7CisJc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHI7CisJc3RydWN0IGljbXNnX25lZ290aWF0ZSAqbmVnb3AgPSBOVUxMOworCWludCB1dGlsX2Z3X3ZlcnNpb247CisJaW50IGZjb3B5X3Nydl92ZXJzaW9uOworCisJaWYgKGZjb3B5X3RyYW5zYWN0aW9uLmFjdGl2ZSkgeworCQkvKgorCQkgKiBXZSB3aWxsIGRlZmVyIHByb2Nlc3NpbmcgdGhpcyBjYWxsYmFjayBvbmNlCisJCSAqIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorCQkgKi8KKwkJZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfY29udGV4dCA9IGNvbnRleHQ7CisJCXJldHVybjsKKwl9CisKKwl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIHJlY3ZfYnVmZmVyLCBQQUdFX1NJWkUgKiAyLCAmcmVjdmxlbiwKKwkJCSAmcmVxdWVzdGlkKTsKKwlpZiAocmVjdmxlbiA8PSAwKQorCQlyZXR1cm47CisKKwlpY21zZ2hkciA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJnJlY3ZfYnVmZmVyWworCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07CisJaWYgKGljbXNnaGRyLT5pY21zZ3R5cGUgPT0gSUNNU0dUWVBFX05FR09USUFURSkgeworCQl1dGlsX2Z3X3ZlcnNpb24gPSBVVElMX0ZXX1ZFUlNJT047CisJCWZjb3B5X3Nydl92ZXJzaW9uID0gV0lOOF9TUlZfVkVSU0lPTjsKKwkJdm1idXNfcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkciwgbmVnb3AsIHJlY3ZfYnVmZmVyLAorCQkJCXV0aWxfZndfdmVyc2lvbiwgZmNvcHlfc3J2X3ZlcnNpb24pOworCX0gZWxzZSB7CisJCWZjb3B5X21zZyA9IChzdHJ1Y3QgaHZfZmNvcHlfaGRyICopJnJlY3ZfYnVmZmVyWworCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKworCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CisKKwkJLyoKKwkJICogU3Rhc2ggYXdheSB0aGlzIGdsb2JhbCBzdGF0ZSBmb3IgY29tcGxldGluZyB0aGUKKwkJICogdHJhbnNhY3Rpb247IG5vdGUgdHJhbnNhY3Rpb25zIGFyZSBzZXJpYWxpemVkLgorCQkgKi8KKworCQlmY29weV90cmFuc2FjdGlvbi5hY3RpdmUgPSB0cnVlOworCQlmY29weV90cmFuc2FjdGlvbi5yZWN2X2xlbiA9IHJlY3ZsZW47CisJCWZjb3B5X3RyYW5zYWN0aW9uLnJlY3ZfY2hhbm5lbCA9IGNoYW5uZWw7CisJCWZjb3B5X3RyYW5zYWN0aW9uLnJlY3ZfcmVxX2lkID0gcmVxdWVzdGlkOworCQlmY29weV90cmFuc2FjdGlvbi5mY29weV9tc2cgPSBmY29weV9tc2c7CisKKwkJLyoKKwkJICogU2VuZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXItbGV2ZWwgZGFlbW9uLgorCQkgKi8KKwkJZmNvcHlfc2VuZF9kYXRhKCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmNvcHlfd29yaywgNSpIWik7CisJCXJldHVybjsKKwl9CisJaWNtc2doZHItPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04gfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7CisJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCByZWN2X2J1ZmZlciwgcmVjdmxlbiwgcmVxdWVzdGlkLAorCQkJVk1fUEtUX0RBVEFfSU5CQU5ELCAwKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIGNoYXIgZGV2aWNlIHRoYXQgY2FuIHN1cHBvcnQgcmVhZC93cml0ZSBmb3IgcGFzc2luZworICogdGhlIHBheWxvYWQuCisgKi8KKworc3RhdGljIHNzaXplX3QgZmNvcHlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdm9pZCAqc3JjOworCXNpemVfdCBjb3B5X3NpemU7CisJaW50IG9wZXJhdGlvbjsKKworCS8qCisJICogV2FpdCB1bnRpbCB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYmUgcmVhZC4KKwkgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZmY29weV90cmFuc2FjdGlvbi5yZWFkX3NlbWEpKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyoKKwkgKiBUaGUgY2hhbm5lbCBtYXkgYmUgcmVzY2luZGVkIGFuZCBpbiB0aGlzIGNhc2UsIHdlIHdpbGwgd2FrZXVwIHRoZQorCSAqIHRoZSB0aHJlYWQgYmxvY2tlZCBvbiB0aGUgc2VtYXBob3JlIGFuZCB3ZSB3aWxsIHVzZSB0aGUgb3BlbmVkCisJICogc3RhdGUgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGlzIGNhc2UuCisJICovCisJaWYgKCFvcGVuZWQpCisJCXJldHVybiAtRU5PREVWOworCisJb3BlcmF0aW9uID0gZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfbXNnLT5vcGVyYXRpb247CisKKwlpZiAob3BlcmF0aW9uID09IFNUQVJUX0ZJTEVfQ09QWSkgeworCQlzcmMgPSAmZmNvcHlfdHJhbnNhY3Rpb24ubWVzc2FnZTsKKwkJY29weV9zaXplID0gc2l6ZW9mKHN0cnVjdCBodl9zdGFydF9mY29weSk7CisJCWlmIChjb3VudCA8IGNvcHlfc2l6ZSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXNyYyA9IGZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X21zZzsKKwkJY29weV9zaXplID0gc2l6ZW9mKHN0cnVjdCBodl9kb19mY29weSk7CisJCWlmIChjb3VudCA8IGNvcHlfc2l6ZSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoY29weV90b191c2VyKGJ1Ziwgc3JjLCBjb3B5X3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBjb3B5X3NpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZjb3B5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJlc3BvbnNlID0gMDsKKworCWlmIChjb3VudCAhPSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlc3BvbnNlLCBidWYsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaW5faGFuZF9zaGFrZSkgeworCQlpZiAoZmNvcHlfaGFuZGxlX2hhbmRzaGFrZShyZXNwb25zZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHNpemVvZihpbnQpOworCX0KKworCS8qCisJICogQ29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIGJ5IGZvcndhcmRpbmcgdGhlIHJlc3VsdAorCSAqIHRvIHRoZSBob3N0LiBCdXQgZmlyc3QsIGNhbmNlbCB0aGUgdGltZW91dC4KKwkgKi8KKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmY29weV93b3JrKSkKKwkJZmNvcHlfcmVzcG9uZF90b19ob3N0KHJlc3BvbnNlKTsKKworCXJldHVybiBzaXplb2YoaW50KTsKK30KKworc3RhdGljIGludCBmY29weV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQoreworCS8qCisJICogVGhlIHVzZXIgbGV2ZWwgZGFlbW9uIHRoYXQgd2lsbCBvcGVuIHRoaXMgZGV2aWNlIGlzCisJICogcmVhbGx5IGFuIGV4dGVuc2lvbiBvZiB0aGlzIGRyaXZlci4gV2UgY2FuIGhhdmUgb25seQorCSAqIGFjdGl2ZSBvcGVuIGF0IGEgdGltZS4KKwkgKi8KKwlpZiAob3BlbmVkKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBUaGUgZGFlbW9uIGlzIGFsaXZlOyBzZXR1cCB0aGUgc3RhdGUuCisJICovCisJb3BlbmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmY29weV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQoreworCS8qCisJICogVGhlIGRhZW1vbiBoYXMgZXhpdGVkOyByZXNldCB0aGUgc3RhdGUuCisJICovCisJaW5faGFuZF9zaGFrZSA9IHRydWU7CisJb3BlbmVkID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmNvcHlfZm9wcyA9IHsKKwkucmVhZCAgICAgICAgICAgPSBmY29weV9yZWFkLAorCS53cml0ZSAgICAgICAgICA9IGZjb3B5X3dyaXRlLAorCS5yZWxlYXNlCT0gZmNvcHlfcmVsZWFzZSwKKwkub3BlbgkJPSBmY29weV9vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGZjb3B5X21pc2MgPSB7CisJLm1pbm9yICAgICAgICAgID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lICAgICAgICAgICA9ICJ2bWJ1cy9odl9mY29weSIsCisJLmZvcHMgICAgICAgICAgID0gJmZjb3B5X2ZvcHMsCit9OworCitzdGF0aWMgaW50IGZjb3B5X2Rldl9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmZjb3B5X21pc2MpOworfQorCitzdGF0aWMgdm9pZCBmY29weV9kZXZfZGVpbml0KHZvaWQpCit7CisKKwkvKgorCSAqIFRoZSBkZXZpY2UgaXMgZ29pbmcgYXdheSAtIHBlcmhhcHMgYmVjYXVzZSB0aGUKKwkgKiBob3N0IGhhcyByZXNjaW5kZWQgdGhlIGNoYW5uZWwuIFNldHVwIHN0YXRlIHNvIHRoYXQKKwkgKiB1c2VyIGxldmVsIGRhZW1vbiBjYW4gZ3JhY2VmdWxseSBleGl0IGlmIGl0IGlzIGJsb2NrZWQKKwkgKiBvbiB0aGUgcmVhZCBzZW1hcGhvcmUuCisJICovCisJb3BlbmVkID0gZmFsc2U7CisJLyoKKwkgKiBTaWduYWwgdGhlIHNlbWFwaG9yZSBhcyB0aGUgZGV2aWNlIGlzCisJICogZ29pbmcgYXdheS4KKwkgKi8KKwl1cCgmZmNvcHlfdHJhbnNhY3Rpb24ucmVhZF9zZW1hKTsKKwltaXNjX2RlcmVnaXN0ZXIoJmZjb3B5X21pc2MpOworfQorCitpbnQgaHZfZmNvcHlfaW5pdChzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlICpzcnYpCit7CisJcmVjdl9idWZmZXIgPSBzcnYtPnJlY3ZfYnVmZmVyOworCisJLyoKKwkgKiBXaGVuIHRoaXMgZHJpdmVyIGxvYWRzLCB0aGUgdXNlciBsZXZlbCBkYWVtb24gdGhhdAorCSAqIHByb2Nlc3NlcyB0aGUgaG9zdCByZXF1ZXN0cyBtYXkgbm90IHlldCBiZSBydW5uaW5nLgorCSAqIERlZmVyIHByb2Nlc3NpbmcgY2hhbm5lbCBjYWxsYmFja3MgdW50aWwgdGhlIGRhZW1vbgorCSAqIGhhcyByZWdpc3RlcmVkLgorCSAqLworCWZjb3B5X3RyYW5zYWN0aW9uLmFjdGl2ZSA9IHRydWU7CisJc2VtYV9pbml0KCZmY29weV90cmFuc2FjdGlvbi5yZWFkX3NlbWEsIDApOworCisJcmV0dXJuIGZjb3B5X2Rldl9pbml0KCk7Cit9CisKK3ZvaWQgaHZfZmNvcHlfZGVpbml0KHZvaWQpCit7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmY29weV93b3JrKTsKKwlmY29weV9kZXZfZGVpbml0KCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X2t2cC5jIGIvZHJpdmVycy9odi9odl9rdnAuYwppbmRleCAwOTk4OGIyLi5lYTg1MjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X2t2cC5jCisrKyBiL2RyaXZlcnMvaHYvaHZfa3ZwLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCQlrdnBfbXNnLT5rdnBfaGRyLm9wZXJhdGlvbiA9IHJlZ192YWx1ZTsKIAkJc3RyY3B5KHZlcnNpb24sIEhWX0RSVl9WRVJTSU9OKTsKIAkJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IGh2X2t2cF9tc2cpOwotCQljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfQVRPTUlDKTsKKwkJY25fbmV0bGlua19zZW5kKG1zZywgMCwgMCwgR0ZQX0FUT01JQyk7CiAJCWtmcmVlKG1zZyk7CiAJfQogfQpAQCAtNDM1LDcgKzQzNSw3IEBACiAJfQogCiAJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IGh2X2t2cF9tc2cpOwotCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9BVE9NSUMpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIDAsIEdGUF9BVE9NSUMpOwogCWtmcmVlKG1zZyk7CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X3NuYXBzaG90LmMgYi9kcml2ZXJzL2h2L2h2X3NuYXBzaG90LmMKaW5kZXggMGMzNTQ2Mi4uMzRmMTRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9zbmFwc2hvdC5jCisrKyBiL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYwpAQCAtOTgsNyArOTgsNyBAQAogCXZzc19tc2ctPnZzc19oZHIub3BlcmF0aW9uID0gb3A7CiAJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IGh2X3Zzc19tc2cpOwogCi0JY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0FUT01JQyk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgMCwgR0ZQX0FUT01JQyk7CiAJa2ZyZWUobXNnKTsKIAogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfdXRpbC5jIGIvZHJpdmVycy9odi9odl91dGlsLmMKaW5kZXggNjJkZmQyNDYuLmRkNzYxODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHZfdXRpbC5jCisrKyBiL2RyaXZlcnMvaHYvaHZfdXRpbC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKKyNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKIAogI2RlZmluZSBTRF9NQUpPUgkzCiAjZGVmaW5lIFNEX01JTk9SCTAKQEAgLTgyLDYgKzgzLDEyIEBACiAJLnV0aWxfZGVpbml0ID0gaHZfdnNzX2RlaW5pdCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlIHV0aWxfZmNvcHkgPSB7CisJLnV0aWxfY2IgPSBodl9mY29weV9vbmNoYW5uZWxjYWxsYmFjaywKKwkudXRpbF9pbml0ID0gaHZfZmNvcHlfaW5pdCwKKwkudXRpbF9kZWluaXQgPSBodl9mY29weV9kZWluaXQsCit9OworCiBzdGF0aWMgdm9pZCBwZXJmb3JtX3NodXRkb3duKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7CiAJb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKQEAgLTQwMSw2ICs0MDgsMTAgQEAKIAl7IEhWX1ZTU19HVUlELAogCSAgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnV0aWxfdnNzCiAJfSwKKwkvKiBGaWxlIGNvcHkgR1VJRCAqLworCXsgSFZfRkNPUFlfR1VJRCwKKwkgIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZ1dGlsX2Zjb3B5CisJfSwKIAl7IH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oIGIvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaAppbmRleCBlMDU1MTc2Li44NjAxMzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCisrKyBiL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKQEAgLTU1OSw4ICs1NTksOCBAQAogdm9pZCBodl9yaW5nYnVmZmVyX2NsZWFudXAoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbyk7CiAKIGludCBodl9yaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCi0JCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJICAgIHUzMiBzZ2NvdW50LCBib29sICpzaWduYWwpOworCQkgICAgc3RydWN0IGt2ZWMgKmt2X2xpc3QsCisJCSAgICB1MzIga3ZfY291bnQsIGJvb2wgKnNpZ25hbCk7CiAKIGludCBodl9yaW5nYnVmZmVyX3BlZWsoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgdm9pZCAqYnVmZmVyLAogCQkgICB1MzIgYnVmbGVuKTsKQEAgLTY2OSw1ICs2NjksOSBAQAogCiB2b2lkIHZtYnVzX29uX2V2ZW50KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKK2ludCBodl9mY29weV9pbml0KHN0cnVjdCBodl91dGlsX3NlcnZpY2UgKik7Cit2b2lkIGh2X2Zjb3B5X2RlaW5pdCh2b2lkKTsKK3ZvaWQgaHZfZmNvcHlfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqKTsKKwogCiAjZW5kaWYgLyogX0hZUEVSVl9WTUJVU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMgYi9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKaW5kZXggMjZjOTNjZi4uMTVkYjY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9yaW5nX2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKIApAQCAtMzg3LDIzICszODgsMjAgQEAKICAqCiAgKi8KIGludCBodl9yaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpvdXRyaW5nX2luZm8sCi0JCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdTMyIHNnY291bnQsIGJvb2wgKnNpZ25hbCkKKwkJICAgIHN0cnVjdCBrdmVjICprdl9saXN0LCB1MzIga3ZfY291bnQsIGJvb2wgKnNpZ25hbCkKIHsKIAlpbnQgaSA9IDA7CiAJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CiAJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKIAl1MzIgdG90YWxieXRlc190b3dyaXRlID0gMDsKIAotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJdTMyIG5leHRfd3JpdGVfbG9jYXRpb247CiAJdTMyIG9sZF93cml0ZTsKIAl1NjQgcHJldl9pbmRpY2VzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZm9yX2VhY2hfc2coc2dsaXN0LCBzZywgc2djb3VudCwgaSkKLQl7Ci0JCXRvdGFsYnl0ZXNfdG93cml0ZSArPSBzZy0+bGVuZ3RoOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwga3ZfY291bnQ7IGkrKykKKwkJdG90YWxieXRlc190b3dyaXRlICs9IGt2X2xpc3RbaV0uaW92X2xlbjsKIAogCXRvdGFsYnl0ZXNfdG93cml0ZSArPSBzaXplb2YodTY0KTsKIApAQCAtNDI3LDEyICs0MjUsMTEgQEAKIAogCW9sZF93cml0ZSA9IG5leHRfd3JpdGVfbG9jYXRpb247CiAKLQlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBzZ2NvdW50LCBpKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwga3ZfY291bnQ7IGkrKykgewogCQluZXh0X3dyaXRlX2xvY2F0aW9uID0gaHZfY29weXRvX3JpbmdidWZmZXIob3V0cmluZ19pbmZvLAogCQkJCQkJICAgICBuZXh0X3dyaXRlX2xvY2F0aW9uLAotCQkJCQkJICAgICBzZ192aXJ0KHNnKSwKLQkJCQkJCSAgICAgc2ctPmxlbmd0aCk7CisJCQkJCQkgICAgIGt2X2xpc3RbaV0uaW92X2Jhc2UsCisJCQkJCQkgICAgIGt2X2xpc3RbaV0uaW92X2xlbik7CiAJfQogCiAJLyogU2V0IHByZXZpb3VzIHBhY2tldCBzdGFydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi92bWJ1c19kcnYuYyBiL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKaW5kZXggMDc3YmIxYi4uOGU1M2EzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi92bWJ1c19kcnYuYworKysgYi9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ0LDYgKzQzLDEyIEBACiBzdGF0aWMgc3RydWN0IGNvbXBsZXRpb24gcHJvYmVfZXZlbnQ7CiBzdGF0aWMgaW50IGlycTsKIAorc3RydWN0IHJlc291cmNlIGh5cGVydl9tbWlvID0geworCS5uYW1lICA9ICJoeXBlcnYgbW1pbyIsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCit9OworRVhQT1JUX1NZTUJPTF9HUEwoaHlwZXJ2X21taW8pOworCiBzdGF0aWMgaW50IHZtYnVzX2V4aXN0cyh2b2lkKQogewogCWlmIChodl9hY3BpX2RldiA9PSBOVUxMKQpAQCAtNTU4LDkgKzU2Myw2IEBACiAJLmRldl9ncm91cHMgPQkJdm1idXNfZ3JvdXBzLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lID0gImh5cGVydiI7Ci0KLQogc3RydWN0IG9ubWVzc2FnZV93b3JrX2NvbnRleHQgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCBodl9tZXNzYWdlIG1zZzsKQEAgLTYxOSw3ICs2MjEsNyBAQAogCX0KIH0KIAotc3RhdGljIGlycXJldHVybl90IHZtYnVzX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgdm9pZCB2bWJ1c19pc3Iodm9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXZvaWQgKnBhZ2VfYWRkcjsKQEAgLTYyOSw3ICs2MzEsNyBAQAogCiAJcGFnZV9hZGRyID0gaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV07CiAJaWYgKHBhZ2VfYWRkciA9PSBOVUxMKQotCQlyZXR1cm4gSVJRX05PTkU7CisJCXJldHVybjsKIAogCWV2ZW50ID0gKHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICopcGFnZV9hZGRyICsKIAkJCQkJIFZNQlVTX01FU1NBR0VfU0lOVDsKQEAgLTY2NSwyOCArNjY3LDggQEAKIAltc2cgPSAoc3RydWN0IGh2X21lc3NhZ2UgKilwYWdlX2FkZHIgKyBWTUJVU19NRVNTQUdFX1NJTlQ7CiAKIAkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYWN0dWFsIG1zZ3MgdG8gYmUgcHJvY2Vzc2VkICovCi0JaWYgKG1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSAhPSBIVk1TR19OT05FKSB7Ci0JCWhhbmRsZWQgPSB0cnVlOworCWlmIChtc2ctPmhlYWRlci5tZXNzYWdlX3R5cGUgIT0gSFZNU0dfTk9ORSkKIAkJdGFza2xldF9zY2hlZHVsZSgmbXNnX2RwYyk7Ci0JfQotCi0JaWYgKGhhbmRsZWQpCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQllbHNlCi0JCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyoKLSAqIHZtYnVzIGludGVycnVwdCBmbG93IGhhbmRsZXI6Ci0gKiB2bWJ1cyBpbnRlcnJ1cHRzIGNhbiBjb25jdXJyZW50bHkgb2NjdXIgb24gbXVsdGlwbGUgQ1BVcyBhbmQKLSAqIGNhbiBiZSBoYW5kbGVkIGNvbmN1cnJlbnRseS4KLSAqLwotCi1zdGF0aWMgdm9pZCB2bWJ1c19mbG93X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGRlc2MpOwotCi0JZGVzYy0+YWN0aW9uLT5oYW5kbGVyKGlycSwgZGVzYy0+YWN0aW9uLT5kZXZfaWQpOwogfQogCiAvKgpAQCAtNzE1LDI1ICs2OTcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2NsZWFudXA7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHZtYnVzX2lzciwgMCwgZHJpdmVyX25hbWUsIGh2X2FjcGlfZGV2KTsKLQotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuIiwKLQkJCSAgIGlycSk7Ci0JCWdvdG8gZXJyX3VucmVnaXN0ZXI7Ci0JfQotCi0JLyoKLQkgKiBWbWJ1cyBpbnRlcnJ1cHRzIGNhbiBiZSBoYW5kbGVkIGNvbmN1cnJlbnRseSBvbgotCSAqIGRpZmZlcmVudCBDUFVzLiBFc3RhYmxpc2ggYW4gYXBwcm9wcmlhdGUgaW50ZXJydXB0IGZsb3cKLQkgKiBoYW5kbGVyIHRoYXQgY2FuIHN1cHBvcnQgdGhpcyBtb2RlbC4KLQkgKi8KLQlpcnFfc2V0X2hhbmRsZXIoaXJxLCB2bWJ1c19mbG93X2hhbmRsZXIpOwotCi0JLyoKLQkgKiBSZWdpc3RlciBvdXIgaW50ZXJydXB0IGhhbmRsZXIuCi0JICovCi0JaHZfcmVnaXN0ZXJfdm1idXNfaGFuZGxlcihpcnEsIHZtYnVzX2lzcik7CisJaHZfc2V0dXBfdm1idXNfaXJxKHZtYnVzX2lzcik7CiAKIAlyZXQgPSBodl9zeW5pY19hbGxvYygpOwogCWlmIChyZXQpCkBAIC03NTMsOSArNzE3LDggQEAKIAogZXJyX2FsbG9jOgogCWh2X3N5bmljX2ZyZWUoKTsKLQlmcmVlX2lycShpcnEsIGh2X2FjcGlfZGV2KTsKKwlodl9yZW1vdmVfdm1idXNfaXJxKCk7CiAKLWVycl91bnJlZ2lzdGVyOgogCWJ1c191bnJlZ2lzdGVyKCZodl9idXMpOwogCiBlcnJfY2xlYW51cDoKQEAgLTg4NiwxOCArODQ5LDIxIEBACiAKIAogLyoKLSAqIFZNQlVTIGlzIGFuIGFjcGkgZW51bWVyYXRlZCBkZXZpY2UuIEdldCB0aGUgdGhlIElSUSBpbmZvcm1hdGlvbgotICogZnJvbSBEU0RULgorICogVk1CVVMgaXMgYW4gYWNwaSBlbnVtZXJhdGVkIGRldmljZS4gR2V0IHRoZSB0aGUgaW5mb3JtYXRpb24gd2UKKyAqIG5lZWQgZnJvbSBEU0RULgogICovCiAKLXN0YXRpYyBhY3BpX3N0YXR1cyB2bWJ1c193YWxrX3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICppcnEpCitzdGF0aWMgYWNwaV9zdGF0dXMgdm1idXNfd2Fsa19yZXNvdXJjZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqY3R4KQogeworCXN3aXRjaCAocmVzLT50eXBlKSB7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgorCQlpcnEgPSByZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF07CisJCWJyZWFrOwogCi0JaWYgKHJlcy0+dHlwZSA9PSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRKSB7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqaXJxcDsKLQkJaXJxcCA9ICZyZXMtPmRhdGEuaXJxOwotCi0JCSooKHVuc2lnbmVkIGludCAqKWlycSkgPSBpcnFwLT5pbnRlcnJ1cHRzWzBdOworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NDoKKwkJaHlwZXJ2X21taW8uc3RhcnQgPSByZXMtPmRhdGEuYWRkcmVzczY0Lm1pbmltdW07CisJCWh5cGVydl9tbWlvLmVuZCA9IHJlcy0+ZGF0YS5hZGRyZXNzNjQubWF4aW11bTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIEFFX09LOwpAQCAtOTA2LDE4ICs4NzIsMzQgQEAKIHN0YXRpYyBpbnQgdm1idXNfYWNwaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgcmVzdWx0OworCWludCByZXRfdmFsID0gLUVOT0RFVjsKIAogCWh2X2FjcGlfZGV2ID0gZGV2aWNlOwogCiAJcmVzdWx0ID0gYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJCQkJdm1idXNfd2Fsa19yZXNvdXJjZXMsICZpcnEpOworCQkJCQl2bWJ1c193YWxrX3Jlc291cmNlcywgTlVMTCk7CiAKLQlpZiAoQUNQSV9GQUlMVVJFKHJlc3VsdCkpIHsKLQkJY29tcGxldGUoJnByb2JlX2V2ZW50KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpKQorCQlnb3RvIGFjcGlfd2Fsa19lcnI7CisJLyoKKwkgKiBUaGUgcGFyZW50IG9mIHRoZSB2bWJ1cyBhY3BpIGRldmljZSAoR2VuMiBmaXJtd2FyZSkgaXMgdGhlIFZNT0QgdGhhdAorCSAqIGhhcyB0aGUgbW1pbyByYW5nZXMuIEdldCB0aGF0LgorCSAqLworCWlmIChkZXZpY2UtPnBhcmVudCkgeworCQlyZXN1bHQgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+cGFyZW50LT5oYW5kbGUsCisJCQkJCU1FVEhPRF9OQU1FX19DUlMsCisJCQkJCXZtYnVzX3dhbGtfcmVzb3VyY2VzLCBOVUxMKTsKKworCQlpZiAoQUNQSV9GQUlMVVJFKHJlc3VsdCkpCisJCQlnb3RvIGFjcGlfd2Fsa19lcnI7CisJCWlmIChoeXBlcnZfbW1pby5zdGFydCAmJiBoeXBlcnZfbW1pby5lbmQpCisJCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmh5cGVydl9tbWlvKTsKIAl9CisJcmV0X3ZhbCA9IDA7CisKK2FjcGlfd2Fsa19lcnI6CiAJY29tcGxldGUoJnByb2JlX2V2ZW50KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCB2bWJ1c19hY3BpX2RldmljZV9pZHNbXSA9IHsKQEAgLTk0Nyw3ICs5MjksNiBAQAogCS8qCiAJICogR2V0IGlycSByZXNvdXJjZXMgZmlyc3QuCiAJICovCi0KIAlyZXQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnZtYnVzX2FjcGlfZHJpdmVyKTsKIAogCWlmIChyZXQpCkBAIC05NzgsOCArOTU5LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHZtYnVzX2V4aXQodm9pZCkKIHsKLQotCWZyZWVfaXJxKGlycSwgaHZfYWNwaV9kZXYpOworCWh2X3JlbW92ZV92bWJ1c19pcnEoKTsKIAl2bWJ1c19mcmVlX2NoYW5uZWxzKCk7CiAJYnVzX3VucmVnaXN0ZXIoJmh2X2J1cyk7CiAJaHZfY2xlYW51cCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDVjZTQzZDguLmI1M2Q4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTExMSwyMiArMTExLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgYWQ3NDE4LgogCi1jb25maWcgU0VOU09SU19BRENYWAotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIEFEQ3h4eFN4eHgiCi0JZGVwZW5kcyBvbiBTUElfTUFTVEVSCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCi0JICBBREM8YmI+PGM+Uzxzc3M+IGNoaXAgZmFtaWx5LCB3aGVyZQotCSAgKiBiYiAgaXMgdGhlIHJlc29sdXRpb24gaW4gbnVtYmVyIG9mIGJpdHMgKDgsIDEwLCAxMikKLQkgICogYyAgIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKDEsIDIsIDQsIDgpCi0JICAqIHNzcyBpcyB0aGUgbWF4aW11bSBjb252ZXJzaW9uIHNwZWVkICgwMjEgZm9yIDIwMCBrU1BTLCAwNTEgZm9yIDUwMAotCSAgICBrU1BTIGFuZCAxMDEgZm9yIDEgTVNQUykKLQotCSAgRXhhbXBsZXMgOiBBREMwODFTMTAxLCBBREMxMjRTNTAxLCAuLi4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRjeHguCi0KIGNvbmZpZyBTRU5TT1JTX0FETTEwMjEKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyMSBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTMxMiw2ICsyOTYsMzEgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGZhbTE1aF9wb3dlci4KIAorY29uZmlnIFNFTlNPUlNfQVBQTEVTTUMKKwl0cmlzdGF0ZSAiQXBwbGUgU01DIChNb3Rpb24gc2Vuc29yLCBsaWdodCBzZW5zb3IsIGtleWJvYXJkIGJhY2tsaWdodCkiCisJZGVwZW5kcyBvbiBJTlBVVCAmJiBYODYKKwlzZWxlY3QgTkVXX0xFRFMKKwlzZWxlY3QgTEVEU19DTEFTUworCXNlbGVjdCBJTlBVVF9QT0xMREVWCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIEFwcGxlIFN5c3RlbSBNYW5hZ2VtZW50CisJICBDb250cm9sbGVyLCB3aGljaCBwcm92aWRlcyBhbiBhY2NlbGVyb21ldGVyIChBcHBsZSBTdWRkZW4gTW90aW9uCisJICBTZW5zb3IpLCBsaWdodCBzZW5zb3JzLCB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBrZXlib2FyZCBiYWNrbGlnaHQKKwkgIGNvbnRyb2wgYW5kIGZhbiBjb250cm9sLgorCisJICBPbmx5IEludGVsLWJhc2VkIEFwcGxlJ3MgY29tcHV0ZXJzIGFyZSBzdXBwb3J0ZWQgKE1hY0Jvb2sgUHJvLAorCSAgTWFjQm9vaywgTWFjTWluaSkuCisKKwkgIERhdGEgZnJvbSB0aGUgZGlmZmVyZW50IHNlbnNvcnMsIGtleWJvYXJkIGJhY2tsaWdodCBjb250cm9sIGFuZCBmYW4KKwkgIGNvbnRyb2wgYXJlIGFjY2Vzc2libGUgdmlhIHN5c2ZzLgorCisJICBUaGlzIGRyaXZlciBhbHNvIHByb3ZpZGVzIGFuIGFic29sdXRlIGlucHV0IGNsYXNzIGRldmljZSwgYWxsb3dpbmcKKwkgIHRoZSBsYXB0b3AgdG8gYWN0IGFzIGEgcGluYmFsbCBtYWNoaW5lLWVzcXVlIGpveXN0aWNrLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGFwcGxpY2FibGUgbGFwdG9wIGFuZCB3YW50IHRvIGV4cGVyaWVuY2UKKwkgIHRoZSBhd2Vzb21lIHBvd2VyIG9mIGFwcGxlc21jLgorCiBjb25maWcgU0VOU09SU19BU0IxMDAKIAl0cmlzdGF0ZSAiQXN1cyBBU0IxMDAgQmFjaCIKIAlkZXBlbmRzIG9uIFg4NiAmJiBJMkMKQEAgLTQzNSw2ICs0NDQsMTIgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGY3NTM3NXMuCiAKK2NvbmZpZyBTRU5TT1JTX01DMTM3ODNfQURDCisgICAgICAgIHRyaXN0YXRlICJGcmVlc2NhbGUgTUMxMzc4My9NQzEzODkyIEFEQyIKKyAgICAgICAgZGVwZW5kcyBvbiBNRkRfTUMxM1hYWAorICAgICAgICBoZWxwCisgICAgICAgICAgU3VwcG9ydCBmb3IgdGhlIEEvRCBjb252ZXJ0ZXIgb24gTUMxMzc4MyBhbmQgTUMxMzg5MiBQTUlDLgorCiBjb25maWcgU0VOU09SU19GU0NITUQKIAl0cmlzdGF0ZSAiRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVycyBzZW5zb3IgY2hpcHMiCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCkBAIC00NTEsMjYgKzQ2Niw2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBmc2NobWQuCiAKLWNvbmZpZyBTRU5TT1JTX0c3NjBBCi0JdHJpc3RhdGUgIkdNVCBHNzYwQSIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHbG9iYWwgTWl4ZWQtbW9kZQotCSAgVGVjaG5vbG9neSBJbmMgRzc2MEEgZmFuIHNwZWVkIFBXTSBjb250cm9sbGVyIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBnNzYwYS4KLQotY29uZmlnIFNFTlNPUlNfRzc2MgotCXRyaXN0YXRlICJHTVQgRzc2MiBhbmQgRzc2MyIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHbG9iYWwgTWl4ZWQtbW9kZQotCSAgVGVjaG5vbG9neSBJbmMgRzc2MiBhbmQgRzc2MyBmYW4gc3BlZWQgUFdNIGNvbnRyb2xsZXIgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGc3NjIuCi0KIGNvbmZpZyBTRU5TT1JTX0dMNTE4U00KIAl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUxOFNNIgogCWRlcGVuZHMgb24gSTJDCkBAIC00OTIsNiArNDg3LDI2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBnbDUyMHNtLgogCitjb25maWcgU0VOU09SU19HNzYwQQorCXRyaXN0YXRlICJHTVQgRzc2MEEiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2xvYmFsIE1peGVkLW1vZGUKKwkgIFRlY2hub2xvZ3kgSW5jIEc3NjBBIGZhbiBzcGVlZCBQV00gY29udHJvbGxlciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZzc2MGEuCisKK2NvbmZpZyBTRU5TT1JTX0c3NjIKKwl0cmlzdGF0ZSAiR01UIEc3NjIgYW5kIEc3NjMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2xvYmFsIE1peGVkLW1vZGUKKwkgIFRlY2hub2xvZ3kgSW5jIEc3NjIgYW5kIEc3NjMgZmFuIHNwZWVkIFBXTSBjb250cm9sbGVyIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnNzYyLgorCiBjb25maWcgU0VOU09SU19HUElPX0ZBTgogCXRyaXN0YXRlICJHUElPIGZhbiIKIAlkZXBlbmRzIG9uIEdQSU9MSUIKQEAgLTUxMSwyNCArNTI2LDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGhpaDYxMzAuCiAKLWNvbmZpZyBTRU5TT1JTX0hUVTIxCi0JdHJpc3RhdGUgIk1lYXN1cmVtZW50IFNwZWNpYWx0aWVzIEhUVTIxRCBodW1pZGl0eS90ZW1wZXJhdHVyZSBzZW5zb3JzIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNZWFzdXJlbWVudCBTcGVjaWFsdGllcwotCSAgSFRVMjFEIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBodHUyMS4KLQotY29uZmlnIFNFTlNPUlNfQ09SRVRFTVAKLQl0cmlzdGF0ZSAiSW50ZWwgQ29yZS9Db3JlMi9BdG9tIHRlbXBlcmF0dXJlIHNlbnNvciIKLQlkZXBlbmRzIG9uIFg4NgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgdGVtcGVyYXR1cmUKLQkgIHNlbnNvciBpbnNpZGUgeW91ciBDUFUuIE1vc3Qgb2YgdGhlIGZhbWlseSA2IENQVXMKLQkgIGFyZSBzdXBwb3J0ZWQuIENoZWNrIERvY3VtZW50YXRpb24vaHdtb24vY29yZXRlbXAgZm9yIGRldGFpbHMuCi0KIGNvbmZpZyBTRU5TT1JTX0lCTUFFTQogCXRyaXN0YXRlICJJQk0gQWN0aXZlIEVuZXJneSBNYW5hZ2VyIHRlbXBlcmF0dXJlL3Bvd2VyIHNlbnNvcnMgYW5kIGNvbnRyb2wiCiAJc2VsZWN0IElQTUlfU0kKQEAgLTU1Nyw2ICs1NTQsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGlibXBleC4KIAorY29uZmlnIFNFTlNPUlNfSUJNUE9XRVJOVgorCXRyaXN0YXRlICJJQk0gUG93ZXJOdiBQbGF0Zm9ybSB0ZW1wZXJhdHVyZS9wb3dlci9mYW4gc2Vuc29yIgorCWRlcGVuZHMgb24gUFBDX1BPV0VSTlYKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIHRlbXBlcmF0dXJlL2Zhbi9wb3dlcgorCSAgc2Vuc29ycyBvbiB5b3VyIHBsYXRmb3JtLgorCiBjb25maWcgU0VOU09SU19JSU9fSFdNT04KIAl0cmlzdGF0ZSAiSHdtb24gZHJpdmVyIHRoYXQgdXNlcyBjaGFubmVscyBzcGVjaWZpZWQgdmlhIGlpbyBtYXBzIgogCWRlcGVuZHMgb24gSUlPCkBAIC01NjYsNiArNTcxLDE0IEBACiAJICBmb3IgdGhvc2UgY2hhbm5lbHMgc3BlY2lmaWVkIGluIHRoZSBtYXAuICBUaGlzIG1hcCBjYW4gYmUgcHJvdmlkZWQKIAkgIGVpdGhlciB2aWEgcGxhdGZvcm0gZGF0YSBvciB0aGUgZGV2aWNlIHRyZWUgYmluZGluZ3MuCiAKK2NvbmZpZyBTRU5TT1JTX0NPUkVURU1QCisJdHJpc3RhdGUgIkludGVsIENvcmUvQ29yZTIvQXRvbSB0ZW1wZXJhdHVyZSBzZW5zb3IiCisJZGVwZW5kcyBvbiBYODYKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIHRlbXBlcmF0dXJlCisJICBzZW5zb3IgaW5zaWRlIHlvdXIgQ1BVLiBNb3N0IG9mIHRoZSBmYW1pbHkgNiBDUFVzCisJICBhcmUgc3VwcG9ydGVkLiBDaGVjayBEb2N1bWVudGF0aW9uL2h3bW9uL2NvcmV0ZW1wIGZvciBkZXRhaWxzLgorCiBjb25maWcgU0VOU09SU19JVDg3CiAJdHJpc3RhdGUgIklURSBJVDg3eHggYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gIVBQQwpAQCAtNjE0LDYgKzYyNywyMTkgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxpbmVhZ2UtcGVtLgogCitjb25maWcgU0VOU09SU19MVEMyOTQ1CisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzI5NDUiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEMyOTQ1CisJICBJMkMgU3lzdGVtIE1vbml0b3IuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbHRjMjk0NS4KKworY29uZmlnIFNFTlNPUlNfTFRDNDE1MQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MTUxIgorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQxNTEKKwkgIEhpZ2ggVm9sdGFnZSBJMkMgQ3VycmVudCBhbmQgVm9sdGFnZSBNb25pdG9yIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MTUxLgorCitjb25maWcgU0VOU09SU19MVEM0MjE1CisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyMTUiCisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDIxNQorCSAgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzQyMTUuCisKK2NvbmZpZyBTRU5TT1JTX0xUQzQyMjIKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDIyMiIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBSRUdNQVBfSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyMjIKKwkgIER1YWwgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzQyMjIuCisKK2NvbmZpZyBTRU5TT1JTX0xUQzQyNDUKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NSIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1CisJICBNdWx0aXBsZSBTdXBwbHkgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzQyNDUuCisKK2NvbmZpZyBTRU5TT1JTX0xUQzQyNjAKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MCIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBSRUdNQVBfSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyNjAKKwkgIFBvc2l0aXZlIFZvbHRhZ2UgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzQyNjAuCisKK2NvbmZpZyBTRU5TT1JTX0xUQzQyNjEKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MSIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYxCisJICBOZWdhdGl2ZSBWb2x0YWdlIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjYxLgorCitjb25maWcgU0VOU09SU19NQVgxMTExCisJdHJpc3RhdGUgIk1heGltIE1BWDExMTEgU2VyaWFsIDgtYml0IEFEQyBjaGlwIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKKwloZWxwCisJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgTWF4aW0ncyBNQVgxMTEwLCBNQVgxMTExLCBNQVgxMTEyLCBhbmQgTUFYMTExMworCSAgQURDIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxMTExLgorCitjb25maWcgU0VOU09SU19NQVgxNjA2NQorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjA2NSBTeXN0ZW0gTWFuYWdlciBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCSAgY2FwYWJpbGl0aWVzIG9mIHRoZSBmb2xsb3dpbmcgTWF4aW0gU3lzdGVtIE1hbmFnZXIgY2hpcHMuCisJICAgIE1BWDE2MDY1CisJICAgIE1BWDE2MDY2CisJICAgIE1BWDE2MDY3CisJICAgIE1BWDE2MDY4CisJICAgIE1BWDE2MDcwCisJICAgIE1BWDE2MDcxCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2MDY1LgorCitjb25maWcgU0VOU09SU19NQVgxNjE5CisJdHJpc3RhdGUgIk1heGltIE1BWDE2MTkgc2Vuc29yIGNoaXAiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTYxOSBzZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTYxOS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTY2OAorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjY4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjY4LCBNQVgxOTg5IGFuZAorCSAgTUFYMTgwNSBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTY2OC4KKworY29uZmlnIFNFTlNPUlNfTUFYMTk3CisJdHJpc3RhdGUgIk1heGltIE1BWDE5NyBhbmQgY29tcGF0aWJsZXMiCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIE1heGltIE1BWDE5NyBBL0QgY29udmVydGVyLgorCSAgU3VwcG9ydCB3aWxsIGluY2x1ZGUsIGJ1dCBub3QgYmUgbGltaXRlZCB0bywgTUFYMTk3LCBhbmQgTUFYMTk5LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE5Ny4KKworY29uZmlnIFNFTlNPUlNfTUFYNjYzOQorCXRyaXN0YXRlICJNYXhpbSBNQVg2NjM5IHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNQVg2NjM5CisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDY2MzkuCisKK2NvbmZpZyBTRU5TT1JTX01BWDY2NDIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjY0MiBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVg2NjQyIHNlbnNvciBjaGlwLgorCSAgTUFYNjY0MiBpcyBhIFNNQnVzLUNvbXBhdGlibGUgUmVtb3RlL0xvY2FsIFRlbXBlcmF0dXJlIFNlbnNvcgorCSAgd2l0aCBPdmVydGVtcGVyYXR1cmUgQWxhcm0gZnJvbSBNYXhpbS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY0Mi4KKworY29uZmlnIFNFTlNPUlNfTUFYNjY1MAorCXRyaXN0YXRlICJNYXhpbSBNQVg2NjUwIHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNQVg2NjUwIC8gTUFYNjY1MQorCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXg2NjUwLgorCitjb25maWcgU0VOU09SU19NQVg2Njk3CisJdHJpc3RhdGUgIk1heGltIE1BWDY2OTcgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDY1ODEsIE1BWDY2MDIsIE1BWDY2MjIsCisJICBNQVg2NjM2LCBNQVg2Njg5LCBNQVg2NjkzLCBNQVg2Njk0LCBNQVg2Njk3LCBNQVg2Njk4LCBhbmQgTUFYNjY5OQorCSAgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXg2Njk3LgorCitjb25maWcgU0VOU09SU19IVFUyMQorCXRyaXN0YXRlICJNZWFzdXJlbWVudCBTcGVjaWFsdGllcyBIVFUyMUQgaHVtaWRpdHkvdGVtcGVyYXR1cmUgc2Vuc29ycyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTWVhc3VyZW1lbnQgU3BlY2lhbHRpZXMKKwkgIEhUVTIxRCBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaHR1MjEuCisKK2NvbmZpZyBTRU5TT1JTX01DUDMwMjEKKwl0cmlzdGF0ZSAiTWljcm9jaGlwIE1DUDMwMjEgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1DUDMwMjEgYW5kIE1DUDMyMjEuCisJICBUaGUgTUNQMzAyMSBpcyBhIEEvRCBjb252ZXJ0ZXIgKEFEQykgd2l0aCAxMC1iaXQgYW5kIHRoZSBNQ1AzMjIxCisJICB3aXRoIDEyLWJpdCByZXNvbHV0aW9uLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtY3AzMDIxLgorCitjb25maWcgU0VOU09SU19BRENYWAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIEFEQ3h4eFN4eHgiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisJICBBREM8YmI+PGM+Uzxzc3M+IGNoaXAgZmFtaWx5LCB3aGVyZQorCSAgKiBiYiAgaXMgdGhlIHJlc29sdXRpb24gaW4gbnVtYmVyIG9mIGJpdHMgKDgsIDEwLCAxMikKKwkgICogYyAgIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKDEsIDIsIDQsIDgpCisJICAqIHNzcyBpcyB0aGUgbWF4aW11bSBjb252ZXJzaW9uIHNwZWVkICgwMjEgZm9yIDIwMCBrU1BTLCAwNTEgZm9yIDUwMAorCSAgICBrU1BTIGFuZCAxMDEgZm9yIDEgTVNQUykKKworCSAgRXhhbXBsZXMgOiBBREMwODFTMTAxLCBBREMxMjRTNTAxLCAuLi4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRjeHguCisKIGNvbmZpZyBTRU5TT1JTX0xNNjMKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTYzIGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtNzc2LDUwICsxMDAyLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTMuCiAKLWNvbmZpZyBTRU5TT1JTX0xUQzQxNTEKLQl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDE1MSIKLQlkZXBlbmRzIG9uIEkyQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MTUxCi0JICBIaWdoIFZvbHRhZ2UgSTJDIEN1cnJlbnQgYW5kIFZvbHRhZ2UgTW9uaXRvciBpbnRlcmZhY2UuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbHRjNDE1MS4KLQotY29uZmlnIFNFTlNPUlNfTFRDNDIxNQotCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjE1IgotCWRlcGVuZHMgb24gSTJDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyMTUKLQkgIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBsdGM0MjE1LgotCi1jb25maWcgU0VOU09SU19MVEM0MjQ1Ci0JdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNDUiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NQotCSAgTXVsdGlwbGUgU3VwcGx5IEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBsdGM0MjQ1LgotCi1jb25maWcgU0VOU09SU19MVEM0MjYxCi0JdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNjEiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MQotCSAgTmVnYXRpdmUgVm9sdGFnZSBIb3QgU3dhcCBDb250cm9sbGVyIEkyQyBpbnRlcmZhY2UuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbHRjNDI2MS4KLQogY29uZmlnIFNFTlNPUlNfTE05NTIzNAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyMzQiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTg0OSwxNDAgKzEwMzEsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG05NTI0NS4KIAotY29uZmlnIFNFTlNPUlNfTUFYMTExMQotCXRyaXN0YXRlICJNYXhpbSBNQVgxMTExIFNlcmlhbCA4LWJpdCBBREMgY2hpcCBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBTUElfTUFTVEVSCi0JaGVscAotCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IE1heGltJ3MgTUFYMTExMCwgTUFYMTExMSwgTUFYMTExMiwgYW5kIE1BWDExMTMKLQkgIEFEQyBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTExMS4KLQotY29uZmlnIFNFTlNPUlNfTUFYMTYwNjUKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjUgU3lzdGVtIE1hbmFnZXIgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGNhcGFiaWxpdGllcyBvZiB0aGUgZm9sbG93aW5nIE1heGltIFN5c3RlbSBNYW5hZ2VyIGNoaXBzLgotCSAgICBNQVgxNjA2NQotCSAgICBNQVgxNjA2NgotCSAgICBNQVgxNjA2NwotCSAgICBNQVgxNjA2OAotCSAgICBNQVgxNjA3MAotCSAgICBNQVgxNjA3MQotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjA2NS4KLQotY29uZmlnIFNFTlNPUlNfTUFYMTYxOQotCXRyaXN0YXRlICJNYXhpbSBNQVgxNjE5IHNlbnNvciBjaGlwIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDE2MTkgc2Vuc29yIGNoaXAuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDE2MTkuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2NjgKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTY2OCBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTY2OCwgTUFYMTk4OSBhbmQKLQkgIE1BWDE4MDUgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDE2NjguCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE5NwotCXRyaXN0YXRlICJNYXhpbSBNQVgxOTcgYW5kIGNvbXBhdGlibGVzIgotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVgxOTcgQS9EIGNvbnZlcnRlci4KLQkgIFN1cHBvcnQgd2lsbCBpbmNsdWRlLCBidXQgbm90IGJlIGxpbWl0ZWQgdG8sIE1BWDE5NywgYW5kIE1BWDE5OS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxOTcuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDY2MzkKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYNjYzOSBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjYzOQotCSAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXg2NjM5LgotCi1jb25maWcgU0VOU09SU19NQVg2NjQyCi0JdHJpc3RhdGUgIk1heGltIE1BWDY2NDIgc2Vuc29yIGNoaXAiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYNjY0MiBzZW5zb3IgY2hpcC4KLQkgIE1BWDY2NDIgaXMgYSBTTUJ1cy1Db21wYXRpYmxlIFJlbW90ZS9Mb2NhbCBUZW1wZXJhdHVyZSBTZW5zb3IKLQkgIHdpdGggT3ZlcnRlbXBlcmF0dXJlIEFsYXJtIGZyb20gTWF4aW0uCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDY2NDIuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDY2NTAKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYNjY1MCBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjY1MCAvIE1BWDY2NTEKLQkgIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY1MC4KLQotY29uZmlnIFNFTlNPUlNfTUFYNjY5NwotCXRyaXN0YXRlICJNYXhpbSBNQVg2Njk3IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVg2NTgxLCBNQVg2NjAyLCBNQVg2NjIyLAotCSAgTUFYNjYzNiwgTUFYNjY4OSwgTUFYNjY5MywgTUFYNjY5NCwgTUFYNjY5NywgTUFYNjY5OCwgYW5kIE1BWDY2OTkKLQkgIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY5Ny4KLQotY29uZmlnIFNFTlNPUlNfTUNQMzAyMQotCXRyaXN0YXRlICJNaWNyb2NoaXAgTUNQMzAyMSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUNQMzAyMSBhbmQgTUNQMzIyMS4KLQkgIFRoZSBNQ1AzMDIxIGlzIGEgQS9EIGNvbnZlcnRlciAoQURDKSB3aXRoIDEwLWJpdCBhbmQgdGhlIE1DUDMyMjEKLQkgIHdpdGggMTItYml0IHJlc29sdXRpb24uCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1jcDMwMjEuCi0KLWNvbmZpZyBTRU5TT1JTX05DVDY3NzUKLQl0cmlzdGF0ZSAiTnV2b3RvbiBOQ1Q2Nzc1RiBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiAhUFBDCi0Jc2VsZWN0IEhXTU9OX1ZJRAotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTnV2b3RvbiBOQ1Q2Nzc1RiwgTkNUNjc3NkYsIE5DVDY3NzlECi0JICBhbmQgY29tcGF0aWJsZSBTdXBlci1JL08gY2hpcHMuIFRoaXMgZHJpdmVyIHJlcGxhY2VzIHRoZQotCSAgdzgzNjI3ZWhmIGRyaXZlciBmb3IgTkNUNjc3NUYgYW5kIE5DVDY3NzZGLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBuY3Q2Nzc1LgotCi1jb25maWcgU0VOU09SU19OVENfVEhFUk1JU1RPUgotCXRyaXN0YXRlICJOVEMgdGhlcm1pc3RvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKCFPRiAmJiAhSUlPKSB8fCAoT0YgJiYgSUlPKQotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5UQyB0aGVybWlzdG9ycyBzZW5zb3IgcmVhZGluZyBhbmQgaXRzCi0JICBpbnRlcnByZXRhdGlvbi4gVGhlIGRyaXZlciBjYW4gYWxzbyBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBhbmQKLQkgIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgdGVtcGVyYXR1cmUuCi0KLQkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMKLQkgIE5DUDE1V0I0NzMsIE5DUDE4V0I0NzMsIE5DUDIxV0I0NzMsIE5DUDAzV0I0NzMsIGFuZCBOQ1AxNVdMMzMzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBudGMtdGhlcm1pc3Rvci4KLQogY29uZmlnIFNFTlNPUlNfUEM4NzM2MAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNjAgZmFtaWx5IgogCWRlcGVuZHMgb24gIVBQQwpAQCAtMTAxMSw2ICsxMDU5LDMzIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBwYzg3NDI3LgogCitjb25maWcgU0VOU09SU19OVENfVEhFUk1JU1RPUgorCXRyaXN0YXRlICJOVEMgdGhlcm1pc3RvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKCFPRiAmJiAhSUlPKSB8fCAoT0YgJiYgSUlPKQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5UQyB0aGVybWlzdG9ycyBzZW5zb3IgcmVhZGluZyBhbmQgaXRzCisJICBpbnRlcnByZXRhdGlvbi4gVGhlIGRyaXZlciBjYW4gYWxzbyBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBhbmQKKwkgIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgdGVtcGVyYXR1cmUuCisKKwkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMKKwkgIE5DUDE1V0I0NzMsIE5DUDE4V0I0NzMsIE5DUDIxV0I0NzMsIE5DUDAzV0I0NzMsIGFuZCBOQ1AxNVdMMzMzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBudGMtdGhlcm1pc3Rvci4KKworY29uZmlnIFNFTlNPUlNfTkNUNjc3NQorCXRyaXN0YXRlICJOdXZvdG9uIE5DVDY3NzVGIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uICFQUEMKKwlzZWxlY3QgSFdNT05fVklECisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCisJICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBOdXZvdG9uIE5DVDY3NzVGLCBOQ1Q2Nzc2RiwgTkNUNjc3OUQKKwkgIGFuZCBjb21wYXRpYmxlIFN1cGVyLUkvTyBjaGlwcy4gVGhpcyBkcml2ZXIgcmVwbGFjZXMgdGhlCisJICB3ODM2MjdlaGYgZHJpdmVyIGZvciBOQ1Q2Nzc1RiBhbmQgTkNUNjc3NkYuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5jdDY3NzUuCisKIGNvbmZpZyBTRU5TT1JTX1BDRjg1OTEKIAl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTkxIEFEQy9EQUMiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTEwNzQsMjEgKzExNDksNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2lzNTU5NS4KIAotY29uZmlnIFNFTlNPUlNfU01NNjY1Ci0JdHJpc3RhdGUgIlN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNTTY2NSIKLQlkZXBlbmRzIG9uIEkyQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZmVhdHVyZXMgb2YgdGhlIFN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNTTY2NS9TTU02NjVCIFNpeC1DaGFubmVsCi0JICBBY3RpdmUgREMgT3V0cHV0IENvbnRyb2xsZXIgLyBNb25pdG9yLgotCi0JICBPdGhlciBzdXBwb3J0ZWQgY2hpcHMgYXJlIFNNTTQ2NSwgU01NNjY1QywgU01NNzY0LCBhbmQgU01NNzY2LgotCSAgU3VwcG9ydCBmb3IgdGhvc2UgY2hpcHMgaXMgdW50ZXN0ZWQuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgc21tNjY1LgotCiBjb25maWcgU0VOU09SU19ETUUxNzM3CiAJdHJpc3RhdGUgIlNNU0MgRE1FMTczNywgU0NIMzExeCBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMgJiYgIVBQQwpAQCAtMTIxMCw2ICsxMjcwLDMxIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzY2g1NjM2LgogCitjb25maWcgU0VOU09SU19TTU02NjUKKwl0cmlzdGF0ZSAiU3VtbWl0IE1pY3JvZWxlY3Ryb25pY3MgU01NNjY1IgorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCisJICBmZWF0dXJlcyBvZiB0aGUgU3VtbWl0IE1pY3JvZWxlY3Ryb25pY3MgU01NNjY1L1NNTTY2NUIgU2l4LUNoYW5uZWwKKwkgIEFjdGl2ZSBEQyBPdXRwdXQgQ29udHJvbGxlciAvIE1vbml0b3IuCisKKwkgIE90aGVyIHN1cHBvcnRlZCBjaGlwcyBhcmUgU01NNDY1LCBTTU02NjVDLCBTTU03NjQsIGFuZCBTTU03NjYuCisJICBTdXBwb3J0IGZvciB0aG9zZSBjaGlwcyBpcyB1bnRlc3RlZC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBzbW02NjUuCisKK2NvbmZpZyBTRU5TT1JTX0FEQzEyOEQ4MTgKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMTI4RDgxOCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMKKwkgIEFEQzEyOEQ4MTggU3lzdGVtIE1vbml0b3Igd2l0aCBUZW1wZXJhdHVyZSBTZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZGMxMjhkODE4LgorCiBjb25maWcgU0VOU09SU19BRFMxMDE1CiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFEUzEwMTUiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTE1MjUsMzcgKzE2MTAsNiBAQAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhNDUgd29ya3N0YXRpb24gZW52aXJvbm1lbnRhbAogCSAgc2Vuc29ycy4KIAotY29uZmlnIFNFTlNPUlNfQVBQTEVTTUMKLQl0cmlzdGF0ZSAiQXBwbGUgU01DIChNb3Rpb24gc2Vuc29yLCBsaWdodCBzZW5zb3IsIGtleWJvYXJkIGJhY2tsaWdodCkiCi0JZGVwZW5kcyBvbiBJTlBVVCAmJiBYODYKLQlzZWxlY3QgTkVXX0xFRFMKLQlzZWxlY3QgTEVEU19DTEFTUwotCXNlbGVjdCBJTlBVVF9QT0xMREVWCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIEFwcGxlIFN5c3RlbSBNYW5hZ2VtZW50Ci0JICBDb250cm9sbGVyLCB3aGljaCBwcm92aWRlcyBhbiBhY2NlbGVyb21ldGVyIChBcHBsZSBTdWRkZW4gTW90aW9uCi0JICBTZW5zb3IpLCBsaWdodCBzZW5zb3JzLCB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBrZXlib2FyZCBiYWNrbGlnaHQKLQkgIGNvbnRyb2wgYW5kIGZhbiBjb250cm9sLgotCi0JICBPbmx5IEludGVsLWJhc2VkIEFwcGxlJ3MgY29tcHV0ZXJzIGFyZSBzdXBwb3J0ZWQgKE1hY0Jvb2sgUHJvLAotCSAgTWFjQm9vaywgTWFjTWluaSkuCi0KLQkgIERhdGEgZnJvbSB0aGUgZGlmZmVyZW50IHNlbnNvcnMsIGtleWJvYXJkIGJhY2tsaWdodCBjb250cm9sIGFuZCBmYW4KLQkgIGNvbnRyb2wgYXJlIGFjY2Vzc2libGUgdmlhIHN5c2ZzLgotCi0JICBUaGlzIGRyaXZlciBhbHNvIHByb3ZpZGVzIGFuIGFic29sdXRlIGlucHV0IGNsYXNzIGRldmljZSwgYWxsb3dpbmcKLQkgIHRoZSBsYXB0b3AgdG8gYWN0IGFzIGEgcGluYmFsbCBtYWNoaW5lLWVzcXVlIGpveXN0aWNrLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGFwcGxpY2FibGUgbGFwdG9wIGFuZCB3YW50IHRvIGV4cGVyaWVuY2UKLQkgIHRoZSBhd2Vzb21lIHBvd2VyIG9mIGFwcGxlc21jLgotCi1jb25maWcgU0VOU09SU19NQzEzNzgzX0FEQwotICAgICAgICB0cmlzdGF0ZSAiRnJlZXNjYWxlIE1DMTM3ODMvTUMxMzg5MiBBREMiCi0gICAgICAgIGRlcGVuZHMgb24gTUZEX01DMTNYWFgKLSAgICAgICAgaGVscAotICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBBL0QgY29udmVydGVyIG9uIE1DMTM3ODMgYW5kIE1DMTM4OTIgUE1JQy4KLQogaWYgQUNQSQogCiBjb21tZW50ICJBQ1BJIGRyaXZlcnMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCBlYzdjZGUwLi4xOTljNDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0FENzMxNCkJKz0gYWQ3MzE0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FENzQxNCkJKz0gYWQ3NDE0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FENzQxOCkJKz0gYWQ3NDE4Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FEQzEyOEQ4MTgpICs9IGFkYzEyOGQ4MTgubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURDWFgpCSs9IGFkY3h4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjEpCSs9IGFkbTEwMjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNSkJKz0gYWRtMTAyNS5vCkBAIC03MCw2ICs3MSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19JNUtfQU1CKQkrPSBpNWtfYW1iLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0lCTUFFTSkJKz0gaWJtYWVtLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0lCTVBFWCkJKz0gaWJtcGV4Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0lCTVBPV0VSTlYpKz0gaWJtcG93ZXJudi5vCiBvYmotJChDT05GSUdfU0VOU09SU19JSU9fSFdNT04pICs9IGlpb19od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19JTkEyMDkpCSs9IGluYTIwOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19JTkEyWFgpCSs9IGluYTJ4eC5vCkBAIC05NSw5ICs5NywxMiBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05NTIzNCkJKz0gbG05NTIzNC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTk1MjQxKQkrPSBsbTk1MjQxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTUyNDUpCSs9IGxtOTUyNDUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDMjk0NSkJKz0gbHRjMjk0NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MTUxKQkrPSBsdGM0MTUxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyMTUpCSs9IGx0YzQyMTUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDIyMikJKz0gbHRjNDIyMi5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjQ1KQkrPSBsdGM0MjQ1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyNjApCSs9IGx0YzQyNjAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDI2MSkJKz0gbHRjNDI2MS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxMTExKQkrPSBtYXgxMTExLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MDY1KQkrPSBtYXgxNjA2NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkYzEyOGQ4MTguYyBiL2RyaXZlcnMvaHdtb24vYWRjMTI4ZDgxOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmQ4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2FkYzEyOGQ4MTguYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIERyaXZlciBmb3IgVEkgQURDMTI4RDgxOCBTeXN0ZW0gTW9uaXRvciB3aXRoIFRlbXBlcmF0dXJlIFNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHdWVudGVyIFJvZWNrCisgKgorICogRGVyaXZlZCBmcm9tIGxtODAuYworICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgKgkJCSAgICAgYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuCisgKiBUaGUgY2hpcCBhbHNvIHN1cHBvcnRzIGFkZHJlc3NlcyAweDM1Li4weDM3LiBEb24ndCBzY2FuIHRob3NlIGFkZHJlc3NlcworICogc2luY2UgdGhleSBhcmUgYWxzbyB1c2VkIGJ5IHNvbWUgRUVQUk9Ncywgd2hpY2ggbWF5IHJlc3VsdCBpbiBmYWxzZQorICogcG9zaXRpdmVzLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCTB4MWQsIDB4MWUsIDB4MWYsIDB4MmQsIDB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07CisKKy8qIHJlZ2lzdGVycyAqLworI2RlZmluZSBBREMxMjhfUkVHX0lOX01BWChucikJCSgweDJhICsgKG5yKSAqIDIpCisjZGVmaW5lIEFEQzEyOF9SRUdfSU5fTUlOKG5yKQkJKDB4MmIgKyAobnIpICogMikKKyNkZWZpbmUgQURDMTI4X1JFR19JTihucikJCSgweDIwICsgKG5yKSkKKworI2RlZmluZSBBREMxMjhfUkVHX1RFTVAJCQkweDI3CisjZGVmaW5lIEFEQzEyOF9SRUdfVEVNUF9NQVgJCTB4MzgKKyNkZWZpbmUgQURDMTI4X1JFR19URU1QX0hZU1QJCTB4MzkKKworI2RlZmluZSBBREMxMjhfUkVHX0NPTkZJRwkJMHgwMAorI2RlZmluZSBBREMxMjhfUkVHX0FMQVJNCQkweDAxCisjZGVmaW5lIEFEQzEyOF9SRUdfTUFTSwkJCTB4MDMKKyNkZWZpbmUgQURDMTI4X1JFR19DT05WX1JBVEUJCTB4MDcKKyNkZWZpbmUgQURDMTI4X1JFR19PTkVTSE9UCQkweDA5CisjZGVmaW5lIEFEQzEyOF9SRUdfU0hVVERPV04JCTB4MGEKKyNkZWZpbmUgQURDMTI4X1JFR19DT05GSUdfQURWCQkweDBiCisjZGVmaW5lIEFEQzEyOF9SRUdfQlVTWV9TVEFUVVMJCTB4MGMKKworI2RlZmluZSBBREMxMjhfUkVHX01BTl9JRAkJMHgzZQorI2RlZmluZSBBREMxMjhfUkVHX0RFVl9JRAkJMHgzZgorCitzdHJ1Y3QgYWRjMTI4X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCWludCB2cmVmOwkJLyogUmVmZXJlbmNlIHZvbHRhZ2UgaW4gbVYgKi8KKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJYm9vbCB2YWxpZDsJCS8qIHRydWUgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTE2IGluWzNdWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUsIG5vcm1hbGl6ZWQgdG8gMTIgYml0CisJCQkJICogMDogaW5wdXQgdm9sdGFnZQorCQkJCSAqIDE6IG1pbiBsaW1pdAorCQkJCSAqIDI6IG1heCBsaW1pdAorCQkJCSAqLworCXMxNiB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUsIG5vcm1hbGl6ZWQgdG8gOSBiaXQKKwkJCQkgKiAwOiBzZW5zb3IgMTogbGltaXQgMjogaHlzdAorCQkJCSAqLworCXU4IGFsYXJtczsJCS8qIGFsYXJtIHJlZ2lzdGVyIHZhbHVlICovCit9OworCitzdGF0aWMgc3RydWN0IGFkYzEyOF9kYXRhICphZGMxMjhfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKnJldCA9IGRhdGE7CisJaW50IGksIHJ2OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCQlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQkJIEFEQzEyOF9SRUdfSU4oaSkpOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIGFib3J0OworCQkJZGF0YS0+aW5bMF1baV0gPSBydiA+PiA0OworCisJCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgICAgICBBREMxMjhfUkVHX0lOX01JTihpKSk7CisJCQlpZiAocnYgPCAwKQorCQkJCWdvdG8gYWJvcnQ7CisJCQlkYXRhLT5pblsxXVtpXSA9IHJ2IDw8IDQ7CisKKwkJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICAgIEFEQzEyOF9SRUdfSU5fTUFYKGkpKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBhYm9ydDsKKwkJCWRhdGEtPmluWzJdW2ldID0gcnYgPDwgNDsKKwkJfQorCisJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgQURDMTI4X1JFR19URU1QKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gYWJvcnQ7CisJCWRhdGEtPnRlbXBbMF0gPSBydiA+PiA3OworCisJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19URU1QX01BWCk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGFib3J0OworCQlkYXRhLT50ZW1wWzFdID0gcnYgPDwgMTsKKworCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfVEVNUF9IWVNUKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gYWJvcnQ7CisJCWRhdGEtPnRlbXBbMl0gPSBydiA8PCAxOworCisJCXJ2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19BTEFSTSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGFib3J0OworCQlkYXRhLT5hbGFybXMgfD0gcnY7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSB0cnVlOworCX0KKwlnb3RvIGRvbmU7CisKK2Fib3J0OgorCXJldCA9IEVSUl9QVFIocnYpOworCWRhdGEtPnZhbGlkID0gZmFsc2U7Citkb25lOgorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gYWRjMTI4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0ciktPm5yOworCWludCB2YWw7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKGRhdGEtPmluW2luZGV4XVtucl0gKiBkYXRhLT52cmVmLCA0MDk1KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRjMTI4X3NldF9pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0ciktPm5yOworCXU4IHJlZywgcmVndmFsOworCWxvbmcgdmFsOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCS8qIDEwIG1WIExTQiBvbiBsaW1pdCByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodmFsLCAxMCksIDAsIDI1NSk7CisJZGF0YS0+aW5baW5kZXhdW25yXSA9IHJlZ3ZhbCA8PCA0OworCXJlZyA9IGluZGV4ID09IDEgPyBBREMxMjhfUkVHX0lOX01JTihucikgOiBBREMxMjhfUkVHX0lOX01BWChucik7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIHJlZywgcmVndmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYWRjMTI4X3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEgPSBhZGMxMjhfdXBkYXRlX2RldmljZShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJaW50IHRlbXA7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXRlbXAgPSAoZGF0YS0+dGVtcFtpbmRleF0gPDwgNykgPj4gNzsJLyogc2lnbiBleHRlbmQgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAqIDUwMCk7LyogMC41IGRlZ3JlZXMgQyByZXNvbHV0aW9uICovCit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zZXRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlsb25nIHZhbDsKKwlpbnQgZXJyOworCXM4IHJlZ3ZhbDsKKworCWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmVndmFsID0gY2xhbXBfdmFsKERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMTAwMCksIC0xMjgsIDEyNyk7CisJZGF0YS0+dGVtcFtpbmRleF0gPSByZWd2YWwgPDwgMTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkgIGluZGV4ID09IDEgPyBBREMxMjhfUkVHX1RFTVBfTUFYCisJCQkJCSAgICAgOiBBREMxMjhfUkVHX1RFTVBfSFlTVCwKKwkJCQkgIHJlZ3ZhbCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEgPSBhZGMxMjhfdXBkYXRlX2RldmljZShkZXYpOworCWludCBtYXNrID0gMSA8PCB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXU4IGFsYXJtczsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJLyoKKwkgKiBDbGVhciBhbiBhbGFybSBhZnRlciByZXBvcnRpbmcgaXQgdG8gdXNlciBzcGFjZS4gSWYgaXQgaXMgc3RpbGwKKwkgKiBhY3RpdmUsIHRoZSBuZXh0IHVwZGF0ZSBzZXF1ZW5jZSB3aWxsIHNldCB0aGUgYWxhcm0gYml0IGFnYWluLgorCSAqLworCWFsYXJtcyA9IGRhdGEtPmFsYXJtczsKKwlkYXRhLT5hbGFybXMgJj0gfm1hc2s7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgISEoYWxhcm1zICYgbWFzaykpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4wX2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4wX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDAsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMF9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAwLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDEsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAxLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMSwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfaW5wdXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAyLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMiwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDIsIDIpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMywgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDMsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAzLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDQsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA0LCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNCwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfaW5wdXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA1LCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNSwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW41X21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDUsIDIpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW42X2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW42X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDYsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA2LCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgYWRjMTI4X3Nob3dfdGVtcCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIGFkYzEyOF9zaG93X3RlbXAsIGFkYzEyOF9zZXRfdGVtcCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgYWRjMTI4X3Nob3dfdGVtcCwgYWRjMTI4X3NldF90ZW1wLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgNyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGMxMjhfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKK0FUVFJJQlVURV9HUk9VUFMoYWRjMTI4KTsKKworc3RhdGljIGludCBhZGMxMjhfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlpbnQgbWFuX2lkLCBkZXZfaWQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfTUFOX0lEKTsKKwlkZXZfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0RFVl9JRCk7CisJaWYgKG1hbl9pZCAhPSAweDAxIHx8IGRldl9pZCAhPSAweDA5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIHVudXNlZCBiaXRzIGZvciBjb25maXJtYXRpb24gKi8KKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19DT05GSUcpICYgMHhmNCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09OVl9SQVRFKSAmIDB4ZmUpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX09ORVNIT1QpICYgMHhmZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfU0hVVERPV04pICYgMHhmZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09ORklHX0FEVikgJiAweGY4KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19CVVNZX1NUQVRVUykgJiAweGZjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmxjcHkoaW5mby0+dHlwZSwgImFkYzEyOGQ4MTgiLCBJMkNfTkFNRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYzEyOF9pbml0X2NsaWVudChzdHJ1Y3QgYWRjMTI4X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBSZXNldCBjaGlwIHRvIGRlZmF1bHRzLgorCSAqIFRoaXMgbWFrZXMgbW9zdCBvdGhlciBpbml0aWFsaXphdGlvbnMgdW5uZWNlc3NhcnkuCisJICovCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09ORklHLCAweDgwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0NPTkZJRywgMHgwMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIGV4dGVybmFsIHZyZWYgaXMgc2VsZWN0ZWQsIGNvbmZpZ3VyZSB0aGUgY2hpcCB0byB1c2UgaXQgKi8KKwlpZiAoZGF0YS0+cmVndWxhdG9yKSB7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJQURDMTI4X1JFR19DT05GSUdfQURWLCAweDAxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTI4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhOworCWludCBlcnIsIHZyZWY7CisKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBhZGMxMjhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB2cmVmIGlzIG9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIGlzIHVzZWQgYXMgY2hpcCByZWZlcmVuY2Ugdm9sdGFnZSAqLworCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJ2cmVmIik7CisJaWYgKCFJU19FUlIocmVndWxhdG9yKSkgeworCQlkYXRhLT5yZWd1bGF0b3IgPSByZWd1bGF0b3I7CisJCWVyciA9IHJlZ3VsYXRvcl9lbmFibGUocmVndWxhdG9yKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQl2cmVmID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHJlZ3VsYXRvcik7CisJCWlmICh2cmVmIDwgMCkgeworCQkJZXJyID0gdnJlZjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGF0YS0+dnJlZiA9IERJVl9ST1VORF9DTE9TRVNUKHZyZWYsIDEwMDApOworCX0gZWxzZSB7CisJCWRhdGEtPnZyZWYgPSAyNTYwOwkvKiAyLjU2ViwgaW4gbVYgKi8KKwl9CisKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLworCWVyciA9IGFkYzEyOF9pbml0X2NsaWVudChkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSAgIGRhdGEsIGFkYzEyOF9ncm91cHMpOworCWlmIChJU19FUlIoaHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGh3bW9uX2Rldik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChkYXRhLT5yZWd1bGF0b3IpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGRhdGEtPnJlZ3VsYXRvcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZGMxMjhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoZGF0YS0+cmVndWxhdG9yKQorCQlyZWd1bGF0b3JfZGlzYWJsZShkYXRhLT5yZWd1bGF0b3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGMxMjhfaWRbXSA9IHsKKwl7ICJhZGMxMjhkODE4IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZGMxMjhfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRjMTI4X2RyaXZlciA9IHsKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkYzEyOGQ4MTgiLAorCX0sCisJLnByb2JlCQk9IGFkYzEyOF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFkYzEyOF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWRjMTI4X2lkLAorCS5kZXRlY3QJCT0gYWRjMTI4X2RldGVjdCwKKwkuYWRkcmVzc19saXN0CT0gbm9ybWFsX2kyYywKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGFkYzEyOF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIFJvZWNrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQURDMTI4RDgxOCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IGJiYjBiMGQuLmYzMWJjNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTk0LDYgKzk0LDggQEAKIAlib29sIHZhbGlkOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyc1tUT1RBTF9BVFRSU107CiAJY2hhciBhdHRyX25hbWVbVE9UQUxfQVRUUlNdW0NPUkVURU1QX05BTUVfTEVOR1RIXTsKKwlzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1tUT1RBTF9BVFRSUyArIDFdOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXR0cl9ncm91cDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiB9OwogCkBAIC0xMTQsMTIgKzExNiw2IEBACiBzdGF0aWMgTElTVF9IRUFEKHBkZXZfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHBkZXZfbGlzdF9tdXRleCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBEUlZOQU1FKTsKLX0KLQogc3RhdGljIHNzaXplX3Qgc2hvd19sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTM5MywyMCArMzg5LDEwIEBACiAJcmV0dXJuIGFkanVzdF90am1heChjLCBpZCwgZGV2KTsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfbmFtZV9hdHRyKHN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3lzZnNfYXR0cl9pbml0KCZwZGF0YS0+bmFtZV9hdHRyLmF0dHIpOwotCXBkYXRhLT5uYW1lX2F0dHIuYXR0ci5uYW1lID0gIm5hbWUiOwotCXBkYXRhLT5uYW1lX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKLQlwZGF0YS0+bmFtZV9hdHRyLnNob3cgPSBzaG93X25hbWU7Ci0JcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZwZGF0YS0+bmFtZV9hdHRyKTsKLX0KLQogc3RhdGljIGludCBjcmVhdGVfY29yZV9hdHRycyhzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSwgc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBpbnQgYXR0cl9ubykKIHsKLQlpbnQgZXJyLCBpOworCWludCBpOwogCXN0YXRpYyBzc2l6ZV90ICgqY29uc3QgcmRfcHRyW1RPVEFMX0FUVFJTXSkgKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpID0gewogCQkJc2hvd19sYWJlbCwgc2hvd19jcml0X2FsYXJtLCBzaG93X3RlbXAsIHNob3dfdGptYXgsCkBAIC00MjQsMTYgKzQxMCwxMCBAQAogCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLnNob3cgPSByZF9wdHJbaV07CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5pbmRleCA9IGF0dHJfbm87Ci0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwotCQlpZiAoZXJyKQotCQkJZ290byBleGl0X2ZyZWU7CisJCXRkYXRhLT5hdHRyc1tpXSA9ICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0cjsKIAl9Ci0JcmV0dXJuIDA7Ci0KLWV4aXRfZnJlZToKLQl3aGlsZSAoLS1pID49IDApCi0JCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwotCXJldHVybiBlcnI7CisJdGRhdGEtPmF0dHJfZ3JvdXAuYXR0cnMgPSB0ZGF0YS0+YXR0cnM7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmdGRhdGEtPmF0dHJfZ3JvdXApOwogfQogCiAKQEAgLTU0OCw3ICs1MjgsNyBAQAogCXBkYXRhLT5jb3JlX2RhdGFbYXR0cl9ub10gPSB0ZGF0YTsKIAogCS8qIENyZWF0ZSBzeXNmcyBpbnRlcmZhY2VzICovCi0JZXJyID0gY3JlYXRlX2NvcmVfYXR0cnModGRhdGEsICZwZGV2LT5kZXYsIGF0dHJfbm8pOworCWVyciA9IGNyZWF0ZV9jb3JlX2F0dHJzKHRkYXRhLCBwZGF0YS0+aHdtb25fZGV2LCBhdHRyX25vKTsKIAlpZiAoZXJyKQogCQlnb3RvIGV4aXRfZnJlZTsKIApAQCAtNTczLDE0ICs1NTMsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgY29yZXRlbXBfcmVtb3ZlX2NvcmUoc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhLAotCQkJCXN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZHgpCisJCQkJIGludCBpbmR4KQogewotCWludCBpOwogCXN0cnVjdCB0ZW1wX2RhdGEgKnRkYXRhID0gcGRhdGEtPmNvcmVfZGF0YVtpbmR4XTsKIAogCS8qIFJlbW92ZSB0aGUgc3lzZnMgYXR0cmlidXRlcyAqLwotCWZvciAoaSA9IDA7IGkgPCB0ZGF0YS0+YXR0cl9zaXplOyBpKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRhdGEtPmh3bW9uX2Rldi0+a29iaiwgJnRkYXRhLT5hdHRyX2dyb3VwKTsKIAogCWtmcmVlKHBkYXRhLT5jb3JlX2RhdGFbaW5keF0pOwogCXBkYXRhLT5jb3JlX2RhdGFbaW5keF0gPSBOVUxMOwpAQCAtNTg4LDM0ICs1NjYsMjAgQEAKIAogc3RhdGljIGludCBjb3JldGVtcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhOwotCWludCBlcnI7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBwZXItcGFja2FnZSBkYXRhIHN0cnVjdHVyZXMgKi8KLQlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IGNyZWF0ZV9uYW1lX2F0dHIocGRhdGEsICZwZGV2LT5kZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9mcmVlOwotCiAJcGRhdGEtPnBoeXNfcHJvY19pZCA9IHBkZXYtPmlkOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKIAotCXBkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUihwZGF0YS0+aHdtb25fZGV2KSkgewotCQllcnIgPSBQVFJfRVJSKHBkYXRhLT5od21vbl9kZXYpOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDbGFzcyByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsIGVycik7Ci0JCWdvdG8gZXhpdF9uYW1lOwotCX0KLQlyZXR1cm4gMDsKLQotZXhpdF9uYW1lOgotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmcGRhdGEtPm5hbWVfYXR0cik7Ci1leGl0X2ZyZWU6Ci0Ja2ZyZWUocGRhdGEpOwotCXJldHVybiBlcnI7CisJcGRhdGEtPmh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgRFJWTkFNRSwKKwkJCQkJCQkJICBwZGF0YSwgTlVMTCk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwZGF0YS0+aHdtb25fZGV2KTsKIH0KIAogc3RhdGljIGludCBjb3JldGVtcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTYyNSwxMSArNTg5LDggQEAKIAogCWZvciAoaSA9IE1BWF9DT1JFX0RBVEEgLSAxOyBpID49IDA7IC0taSkKIAkJaWYgKHBkYXRhLT5jb3JlX2RhdGFbaV0pCi0JCQljb3JldGVtcF9yZW1vdmVfY29yZShwZGF0YSwgJnBkZXYtPmRldiwgaSk7CisJCQljb3JldGVtcF9yZW1vdmVfY29yZShwZGF0YSwgaSk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJnBkYXRhLT5uYW1lX2F0dHIpOwotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5od21vbl9kZXYpOwotCWtmcmVlKHBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzc3LDcgKzczOCw3IEBACiAJCXJldHVybjsKIAogCWlmIChwZGF0YS0+Y29yZV9kYXRhW2luZHhdICYmIHBkYXRhLT5jb3JlX2RhdGFbaW5keF0tPmNwdSA9PSBjcHUpCi0JCWNvcmV0ZW1wX3JlbW92ZV9jb3JlKHBkYXRhLCAmcGRldi0+ZGV2LCBpbmR4KTsKKwkJY29yZXRlbXBfcmVtb3ZlX2NvcmUocGRhdGEsIGluZHgpOwogCiAJLyoKIAkgKiBJZiBhIEhUIHNpYmxpbmcgb2YgYSBjb3JlIGlzIHRha2VuIG9mZmxpbmUsIGJ1dCBhbm90aGVyIEhUIHNpYmxpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZW1jMjEwMy5jIGIvZHJpdmVycy9od21vbi9lbWMyMTAzLmMKaW5kZXggMmMxMzdiMi4uZmQ4OTJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9lbWMyMTAzLmMKKysrIGIvZHJpdmVycy9od21vbi9lbWMyMTAzLmMKQEAgLTM0OSw3ICszNDksNyBAQAogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgInJlZyAweCUwMngsIGVyciAlZFxuIiwKIAkJCVJFR19GQU5fQ09ORjEsIHN0YXR1cyk7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAJc3RhdHVzICY9IDB4OUY7CiAJc3RhdHVzIHw9IChuZXdfcmFuZ2VfYml0cyA8PCA1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCBlMTc2YTQzLi5hMjZjMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2RlZmluZSBIV01PTl9JRF9QUkVGSVggImh3bW9uIgogI2RlZmluZSBIV01PTl9JRF9GT1JNQVQgSFdNT05fSURfUFJFRklYICIlZCIKQEAgLTk5LDYgKzEwMCwxMCBAQAogCXN0cnVjdCBod21vbl9kZXZpY2UgKmh3ZGV2OwogCWludCBlcnIsIGlkOwogCisJLyogRG8gbm90IGFjY2VwdCBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gaHdtb24gbmFtZSBhdHRyaWJ1dGUgKi8KKwlpZiAobmFtZSAmJiAoIXN0cmxlbihuYW1lKSB8fCBzdHJwYnJrKG5hbWUsICItKiBcdFxuIikpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwogCWlkID0gaWRhX3NpbXBsZV9nZXQoJmh3bW9uX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGlkIDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIoaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2IxMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBod21vbiBkcml2ZXIgZm9yIHRlbXBlcmF0dXJlL3Bvd2VyL2ZhbiBvbiBJQk0gUG93ZXJOViBwbGF0Zm9ybQorICogQ29weXJpZ2h0IChDKSAyMDEzIElCTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBQb3dlck5WIFBsYXRmb3JtIHBvd2VyL3RlbXAvZmFuIHNlbnNvciBod21vbiBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBNQVhfQVRUUl9MRU5HVEgJCTMyCisKKy8qIERldmljZSB0cmVlIHNlbnNvciBuYW1lIHByZWZpeGVzLiBUaGUgZGV2aWNlIHRyZWUgaGFzIHRoZSBuYW1lcyBpbiB0aGUKKyAqIGZvcm1hdCAiY29vbGluZy1mYW4jMi1mYXVsdGVkIiB3aGVyZSB0aGUgImNvb2xpbmctZmFuIiBpcyB0aGUgc2Vuc29yIHR5cGUsCisgKiAyIGlzIHRoZSBzZW5zb3IgY291bnQsIGFuZCAiZmF1bHRlZCIgaXMgdGhlIHNlbnNvciBkYXRhIGF0dHJpYnV0ZSB0eXBlLgorICovCisjZGVmaW5lIERUX0ZBVUxUX0FUVFJfU1VGRklYCQkiZmF1bHRlZCIKKyNkZWZpbmUgRFRfREFUQV9BVFRSX1NVRkZJWAkJImRhdGEiCisjZGVmaW5lIERUX1RIUkVTSE9MRF9BVFRSX1NVRkZJWAkidGhycyIKKworZW51bSBzZW5zb3JzIHsKKwlGQU4sCisJVEVNUEVSQVRVUkUsCisJUE9XRVJTVVBQTFksCisJUE9XRVIsCisJTUFYX1NFTlNPUl9UWVBFLAorfTsKKworZW51bSBhdHRyaWJ1dGVzIHsKKwlJTlBVVCwKKwlNSU5JTVVNLAorCU1BWElNVU0sCisJRkFVTFQsCisJTUFYX0FUVFJfVFlQRVMKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX25hbWUgeworCWNoYXIgKm5hbWU7CisJY2hhciAqY29tcGFpYmxlOworfSBzZW5zb3JfbmFtZXNbXSA9IHsKKwkJeyJmYW4tc2Vuc29yIiwgImlibSxvcGFsLXNlbnNvci1jb29saW5nLWZhbiJ9LAorCQl7ImFtYi10ZW1wLXNlbnNvciIsICJpYm0sb3BhbC1zZW5zb3ItYW1iLXRlbXAifSwKKwkJeyJwb3dlci1zZW5zb3IiLCAiaWJtLG9wYWwtc2Vuc29yLXBvd2VyLXN1cHBseSJ9LAorCQl7InBvd2VyIiwgImlibSxvcGFsLXNlbnNvci1wb3dlciJ9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0dHJpYnV0ZV90eXBlX3RhYmxlW10gPSB7CisJImlucHV0IiwKKwkibWluIiwKKwkibWF4IiwKKwkiZmF1bHQiLAorCU5VTEwKK307CisKK3N0cnVjdCBwZGV2X2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwllbnVtIHNlbnNvcnMgdHlwZTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQocGRldl9saXN0KTsKKworLyogVGhlIHNlbnNvcnMgYXJlIGNhdGVnb3Jpc2VkIG9uIHR5cGUuCisgKgorICogVGhlIHNlbnNvcnMgb2Ygc2FtZSB0eXBlIGFyZSBjYXRlZ29yaXNlZCB1bmRlciBhIGNvbW1vbiBwbGF0Zm9ybSBkZXZpY2UuCisgKiBTbywgVGhlIHBkZXYgaXMgc2hhcmVkIGJ5IGFsbCBzZW5zb3JzIG9mIHNhbWUgdHlwZS4KKyAqIEV4IDogdGVtcDFfaW5wdXQsIHRlbXAxX21heCwgdGVtcDJfaW5wdXQsdGVtcDJfbWF4IGFsbCBzaGFyZSBzYW1lIHBsYXRmb3JtCisgKiBkZXZpY2UuCisgKgorICogInNlbnNvcl9kYXRhIiBpcyB0aGUgUGxhdGZvcm0gZGV2aWNlIHNwZWNpZmljIGRhdGEuCisgKiBUaGVyZSBpcyBvbmUgaHdtb25fZGV2aWNlIGluc3RhbmNlIGZvciBhbGwgdGhlIHNlbnNvcnMgb2Ygc2FtZSB0eXBlLgorICogVGhpcyBhbHNvIGhvbGRzIHRoZSBsaXN0IG9mIGFsbCBzZW5zb3JzIHdpdGggc2FtZSB0eXBlIGJ1dCBkaWZmZXJlbnQKKyAqIGF0dHJpYnV0ZSBhbmQgaW5kZXguCisgKi8KK3N0cnVjdCBzZW5zb3Jfc3BlY2lmaWNfZGF0YSB7CisJdTMyIHNlbnNvcl9pZDsgLyogVGhlIGhleCB2YWx1ZSBhcyBpbiB0aGUgZGV2aWNlIHRyZWUgKi8KKwl1MzIgc2Vuc29yX2luZGV4OyAvKiBUaGUgc2Vuc29yIGluc3RhbmNlIGluZGV4ICovCisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkX2F0dHI7CisJZW51bSBhdHRyaWJ1dGVzIGF0dHJfdHlwZTsKKwljaGFyIGF0dHJfbmFtZVs2NF07Cit9OworCitzdHJ1Y3Qgc2Vuc29yX2RhdGEgeworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlbnNvcl9saXN0OworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG5hbWVfYXR0cjsKK307CisKK3N0cnVjdCAgc2Vuc29yX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHNlbnNvcl9zcGVjaWZpY19kYXRhICpzZW5zb3JfZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwb3dlcm52X3NlbnNvcl9nZXRfcGRldihlbnVtIHNlbnNvcnMgdHlwZSkKK3sKKwlzdHJ1Y3QgcGRldl9lbnRyeSAqcDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwZGV2X2xpc3QsIGxpc3QpCisJCWlmIChwLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gcC0+cGRldjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHNlbnNvcl9zcGVjaWZpY19kYXRhICpwb3dlcm52X3NlbnNvcl9nZXRfc2Vuc29yX2RhdGEoCisJCQkJCXN0cnVjdCBzZW5zb3JfZGF0YSAqcGRhdGEsCisJCQkJCWludCBpbmRleCwgZW51bSBhdHRyaWJ1dGVzIGF0dHJfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2VudHJ5ICpwOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnBkYXRhLT5zZW5zb3JfbGlzdCwgbGlzdCkKKwkJaWYgKChwLT5zZW5zb3JfZGF0YS0+c2Vuc29yX2luZGV4ID09IGluZGV4KSAmJgorCQkgICAgKGF0dHJfdHlwZSA9PSBwLT5zZW5zb3JfZGF0YS0+YXR0cl90eXBlKSkKKwkJCXJldHVybiBwLT5zZW5zb3JfZGF0YTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHBkZXYtPm5hbWUpOworfQorCisvKiBOb3RlOiBEYXRhIGZyb20gdGhlIHNlbnNvcnMgZm9yIGVhY2ggc2Vuc29yIHR5cGUgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvCisgKiB0aGUgZGltZW5zaW9uIGFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgc3NpemVfdCBzaG93X3NlbnNvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX3NwZWNpZmljX2RhdGEgKnRkYXRhID0gTlVMTDsKKwllbnVtIHNlbnNvcnMgc2Vuc29yX3R5cGUgPSBwZGV2LT5pZDsKKwl1MzIgeCA9IC0xOworCWludCByZXQ7CisKKwlpZiAoc2RfYXR0ciAmJiBzZF9hdHRyLT5kZXZfYXR0ci5hdHRyLm5hbWUpIHsKKwkJY2hhciAqcG9zID0gc3RyY2hyKHNkX2F0dHItPmRldl9hdHRyLmF0dHIubmFtZSwgJ18nKTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9BVFRSX1RZUEVTOyBpKyspIHsKKwkJCWlmIChzdHJjbXAocG9zKzEsIGF0dHJpYnV0ZV90eXBlX3RhYmxlW2ldKSA9PSAwKSB7CisJCQkJdGRhdGEgPSBwb3dlcm52X3NlbnNvcl9nZXRfc2Vuc29yX2RhdGEocGRhdGEsCisJCQkJCQlzZF9hdHRyLT5pbmRleCwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodGRhdGEpIHsKKwkJcmV0ID0gb3BhbF9nZXRfc2Vuc29yX2RhdGEodGRhdGEtPnNlbnNvcl9pZCwgJngpOworCQlpZiAocmV0KQorCQkJeCA9IC0xOworCX0KKworCWlmIChzZW5zb3JfdHlwZSA9PSBURU1QRVJBVFVSRSAmJiB4ID4gMCkgeworCQkvKiBUZW1wZXJhdHVyZSBjb21lcyBpbiBEZWdyZWVzIGFuZCBjb252ZXJ0IGl0IHRvCisJCSAqIG1pbGxpLWRlZ3JlZXMuCisJCSAqLworCQl4ID0geCoxMDAwOworCX0gZWxzZSBpZiAoc2Vuc29yX3R5cGUgPT0gUE9XRVIgJiYgeCA+IDApIHsKKwkJLyogUG93ZXIgdmFsdWUgY29tZXMgaW4gd2F0dHMsIGNvbnZlcnQgdG8gbWljcm8td2F0dHMgKi8KKwkJeCA9IHggKiAxMDAwMDAwOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4KTsKK30KKworc3RhdGljIHUzMiBnZXRfc2Vuc29yX2luZGV4X2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmhhc2hfcG9zaXRpb24gPSBzdHJjaHIobmFtZSwgJyMnKTsKKwl1MzIgaW5kZXggPSAwLCBjb3B5X2xlbmd0aDsKKwljaGFyIG5ld2J1Zls4XTsKKworCWlmIChoYXNoX3Bvc2l0aW9uKSB7CisJCWNvcHlfbGVuZ3RoID0gc3RyY2hyKGhhc2hfcG9zaXRpb24sICctJykgLSBoYXNoX3Bvc2l0aW9uIC0gMTsKKwkJaWYgKGNvcHlfbGVuZ3RoIDwgc2l6ZW9mKG5ld2J1ZikpIHsKKwkJCXN0cm5jcHkobmV3YnVmLCBoYXNoX3Bvc2l0aW9uICsgMSwgY29weV9sZW5ndGgpOworCQkJc3NjYW5mKG5ld2J1ZiwgIiVkIiwgJmluZGV4KTsKKwkJfQorCX0KKworCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9zZW5zb3Jfc3VmZml4X2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICpzdWZmaXgpCit7CisJY2hhciAqZGFzaF9wb3NpdGlvbiA9IHN0cnJjaHIobmFtZSwgJy0nKTsKKwlpZiAoZGFzaF9wb3NpdGlvbikKKwkJc3RybmNweShzdWZmaXgsIGRhc2hfcG9zaXRpb24rMSwgTUFYX0FUVFJfTEVOR1RIKTsKKwllbHNlCisJCXN0cmNweShzdWZmaXgsIiIpOworfQorCitzdGF0aWMgaW50IGdldF9zZW5zb3JfYXR0cl9wcm9wZXJ0aWVzKGNvbnN0IGNoYXIgKnNlbnNvcl9uYW1lLAorCQllbnVtIHNlbnNvcnMgc2Vuc29yX3R5cGUsIGVudW0gYXR0cmlidXRlcyAqYXR0cl90eXBlLAorCQl1MzIgKnNlbnNvcl9pbmRleCkKK3sKKwljaGFyIHN1ZmZpeFtNQVhfQVRUUl9MRU5HVEhdOworCisJKmF0dHJfdHlwZSA9IE1BWF9BVFRSX1RZUEVTOworCSpzZW5zb3JfaW5kZXggPSBnZXRfc2Vuc29yX2luZGV4X2Zyb21fbmFtZShzZW5zb3JfbmFtZSk7CisJaWYgKCpzZW5zb3JfaW5kZXggPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnZXRfc2Vuc29yX3N1ZmZpeF9mcm9tX25hbWUoc2Vuc29yX25hbWUsIHN1ZmZpeCk7CisJaWYgKHN0cmNtcChzdWZmaXgsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJjbXAoc3VmZml4LCBEVF9GQVVMVF9BVFRSX1NVRkZJWCkgPT0gMCkKKwkJKmF0dHJfdHlwZSA9IEZBVUxUOworCWVsc2UgaWYgKHN0cmNtcChzdWZmaXgsIERUX0RBVEFfQVRUUl9TVUZGSVgpID09IDApCisJCSphdHRyX3R5cGUgPSBJTlBVVDsKKwllbHNlIGlmICgoc2Vuc29yX3R5cGUgPT0gVEVNUEVSQVRVUkUpICYmCisJCQkoc3RyY21wKHN1ZmZpeCwgRFRfVEhSRVNIT0xEX0FUVFJfU1VGRklYKSA9PSAwKSkKKwkJKmF0dHJfdHlwZSA9IE1BWElNVU07CisJZWxzZSBpZiAoKHNlbnNvcl90eXBlID09IEZBTikgJiYKKwkJCShzdHJjbXAoc3VmZml4LCBEVF9USFJFU0hPTERfQVRUUl9TVUZGSVgpID09IDApKQorCQkqYXR0cl90eXBlID0gTUlOSU1VTTsKKwllbHNlCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKCgoc2Vuc29yX3R5cGUgPT0gRkFOKSAmJiAoKCphdHRyX3R5cGUgPT0gSU5QVVQpIHx8CisJCQkJICAgICgqYXR0cl90eXBlID09IE1JTklNVU0pKSkKKwkgICAgfHwgKChzZW5zb3JfdHlwZSA9PSBURU1QRVJBVFVSRSkgJiYgKCgqYXR0cl90eXBlID09IElOUFVUKSB8fAorCQkJCQkJICgqYXR0cl90eXBlID09IE1BWElNVU0pKSkKKwkgICAgfHwgKChzZW5zb3JfdHlwZSA9PSBQT1dFUikgJiYgKCgqYXR0cl90eXBlID09IElOUFVUKSkpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9zZW5zb3JfYXR0cihzdHJ1Y3Qgc2Vuc29yX3NwZWNpZmljX2RhdGEgKnRkYXRhLAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gc2Vuc29ycyBzZW5zb3JfdHlwZSwKKwkJZW51bSBhdHRyaWJ1dGVzIGF0dHJfdHlwZSkKK3sKKwlpbnQgZXJyID0gMDsKKwljaGFyIHRlbXBfZmlsZV9wcmVmaXhbNTBdOworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmaWxlX25hbWVfZm9ybWF0ID0gIiVzJWRfJXMiOworCisJdGRhdGEtPmF0dHJfdHlwZSA9IGF0dHJfdHlwZTsKKworCWlmIChzZW5zb3JfdHlwZSA9PSBGQU4pCisJCXN0cmNweSh0ZW1wX2ZpbGVfcHJlZml4LCAiZmFuIik7CisJZWxzZSBpZiAoc2Vuc29yX3R5cGUgPT0gVEVNUEVSQVRVUkUpCisJCXN0cmNweSh0ZW1wX2ZpbGVfcHJlZml4LCAidGVtcCIpOworCWVsc2UgaWYgKHNlbnNvcl90eXBlID09IFBPV0VSU1VQUExZKQorCQlzdHJjcHkodGVtcF9maWxlX3ByZWZpeCwgInBvd2Vyc3VwcGx5Iik7CisJZWxzZSBpZiAoc2Vuc29yX3R5cGUgPT0gUE9XRVIpCisJCXN0cmNweSh0ZW1wX2ZpbGVfcHJlZml4LCAicG93ZXIiKTsKKworCXNucHJpbnRmKHRkYXRhLT5hdHRyX25hbWUsIHNpemVvZih0ZGF0YS0+YXR0cl9uYW1lKSwgZmlsZV9uYW1lX2Zvcm1hdCwKKwkJIHRlbXBfZmlsZV9wcmVmaXgsIHRkYXRhLT5zZW5zb3JfaW5kZXgsCisJCSBhdHRyaWJ1dGVfdHlwZV90YWJsZVt0ZGF0YS0+YXR0cl90eXBlXSk7CisKKwlzeXNmc19hdHRyX2luaXQoJnRkYXRhLT5zZF9hdHRyLmRldl9hdHRyLmF0dHIpOworCXRkYXRhLT5zZF9hdHRyLmRldl9hdHRyLmF0dHIubmFtZSA9IHRkYXRhLT5hdHRyX25hbWU7CisJdGRhdGEtPnNkX2F0dHIuZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwl0ZGF0YS0+c2RfYXR0ci5kZXZfYXR0ci5zaG93ID0gc2hvd19zZW5zb3I7CisKKwl0ZGF0YS0+c2RfYXR0ci5pbmRleCA9IHRkYXRhLT5zZW5zb3JfaW5kZXg7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnRkYXRhLT5zZF9hdHRyLmRldl9hdHRyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX25hbWVfYXR0cihzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnBkYXRhLAorCQkJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzeXNmc19hdHRyX2luaXQoJnBkYXRhLT5uYW1lX2F0dHIuYXR0cik7CisJcGRhdGEtPm5hbWVfYXR0ci5hdHRyLm5hbWUgPSAibmFtZSI7CisJcGRhdGEtPm5hbWVfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCXBkYXRhLT5uYW1lX2F0dHIuc2hvdyA9IHNob3dfbmFtZTsKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnBkYXRhLT5uYW1lX2F0dHIpOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9wbGF0Zm9ybV9kZXZpY2UoZW51bSBzZW5zb3JzIHNlbnNvcl90eXBlLAorCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqcGRldikKK3sKKwlzdHJ1Y3QgcGRldl9lbnRyeSAqcGRldl9lbnRyeSA9IE5VTEw7CisJaW50IGVycjsKKworCSpwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHNlbnNvcl9uYW1lc1tzZW5zb3JfdHlwZV0ubmFtZSwKKwkJCXNlbnNvcl90eXBlKTsKKwlpZiAoISpwZGV2KSB7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXBkZXZfZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGRldl9lbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghcGRldl9lbnRyeSkgeworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCX0KKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoKnBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CisJCWdvdG8gZXhpdF9kZXZpY2VfZnJlZTsKKwl9CisKKwlwZGV2X2VudHJ5LT5wZGV2ID0gKnBkZXY7CisJcGRldl9lbnRyeS0+dHlwZSA9ICgqcGRldiktPmlkOworCisJbGlzdF9hZGRfdGFpbCgmcGRldl9lbnRyeS0+bGlzdCwgJnBkZXZfbGlzdCk7CisKKwlyZXR1cm4gMDsKK2V4aXRfZGV2aWNlX2ZyZWU6CisJa2ZyZWUocGRldl9lbnRyeSk7CitleGl0X2RldmljZV9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dCgqcGRldik7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3NlbnNvcl9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNlbnNvcl9kYXRhICpwZGF0YSA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZW5zb3JfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWVyciA9IGNyZWF0ZV9uYW1lX2F0dHIocGRhdGEsICZwZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9mcmVlOworCisJcGRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIocGRhdGEtPmh3bW9uX2Rldik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNsYXNzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJCWVycik7CisJCWdvdG8gZXhpdF9uYW1lOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZwZGF0YS0+c2Vuc29yX2xpc3QpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCXJldHVybiAwOworCitleGl0X25hbWU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZwZGF0YS0+bmFtZV9hdHRyKTsKK2V4aXRfZnJlZToKKwlrZnJlZShwZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9zZW5zb3JfYXR0cihzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzZW5zb3JfZW50cnkgKnMsICpsOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIGwsICZwZGF0YS0+c2Vuc29yX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHNlbnNvcl9zcGVjaWZpY19kYXRhICp0ZGF0YSA9IHMtPnNlbnNvcl9kYXRhOworCQkJa2ZyZWUodGRhdGEpOworCQkJbGlzdF9kZWwoJnMtPmxpc3QpOworCQkJa2ZyZWUocyk7CisJCX0KK30KKworc3RhdGljIGludCBwb3dlcm52X3NlbnNvcl9pbml0KHUzMiBzZW5zb3JfaWQsIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCWVudW0gc2Vuc29ycyBzZW5zb3JfdHlwZSwgZW51bSBhdHRyaWJ1dGVzIGF0dHJfdHlwZSwKKwkJdTMyIHNlbnNvcl9pbmRleCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcG93ZXJudl9zZW5zb3JfZ2V0X3BkZXYoc2Vuc29yX3R5cGUpOworCXN0cnVjdCBzZW5zb3Jfc3BlY2lmaWNfZGF0YSAqdGRhdGE7CisJc3RydWN0IHNlbnNvcl9lbnRyeSAqc2Vuc29yX2VudHJ5OworCXN0cnVjdCBzZW5zb3JfZGF0YSAqcGRhdGE7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIXBkZXYpIHsKKwkJZXJyID0gY3JlYXRlX3BsYXRmb3JtX2RldmljZShzZW5zb3JfdHlwZSwgJnBkZXYpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0OworCisJCWVyciA9IGNyZWF0ZV9zZW5zb3JfZGF0YShwZGV2KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhpdDsKKwl9CisKKwlwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghcGRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXRkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlbnNvcl9zcGVjaWZpY19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJdGRhdGEtPnNlbnNvcl9pZCA9IHNlbnNvcl9pZDsKKwl0ZGF0YS0+c2Vuc29yX2luZGV4ID0gc2Vuc29yX2luZGV4OworCisJZXJyID0gY3JlYXRlX3NlbnNvcl9hdHRyKHRkYXRhLCAmcGRldi0+ZGV2LCBzZW5zb3JfdHlwZSwgYXR0cl90eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCXNlbnNvcl9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZW5zb3JfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlbnNvcl9lbnRyeSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfYXR0cjsKKwl9CisKKwlzZW5zb3JfZW50cnktPnNlbnNvcl9kYXRhID0gdGRhdGE7CisKKwlsaXN0X2FkZF90YWlsKCZzZW5zb3JfZW50cnktPmxpc3QsICZwZGF0YS0+c2Vuc29yX2xpc3QpOworCisJcmV0dXJuIDA7CitleGl0X2F0dHI6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZ0ZGF0YS0+c2RfYXR0ci5kZXZfYXR0cik7CitleGl0X2ZyZWU6CisJa2ZyZWUodGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkZWxldGVfdW5yZWdpc3Rlcl9zZW5zb3JzKHZvaWQpCit7CisJc3RydWN0IHBkZXZfZW50cnkgKnAsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZwZGV2X2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHNlbnNvcl9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHAtPnBkZXYpOworCQkJaWYgKHBkYXRhKSB7CisJCQkJZGVsZXRlX3NlbnNvcl9hdHRyKHBkYXRhKTsKKworCQkJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5od21vbl9kZXYpOworCQkJCWtmcmVlKHBkYXRhKTsKKwkJCX0KKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocC0+cGRldik7CisJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJa2ZyZWUocCk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm52X2h3bW9uX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wYWwsICpucCA9IE5VTEw7CisJZW51bSBhdHRyaWJ1dGVzIGF0dHJfdHlwZTsKKwllbnVtIHNlbnNvcnMgdHlwZTsKKwljb25zdCB1MzIgKnNlbnNvcl9pZDsKKwl1MzIgc2Vuc29yX2luZGV4OworCWludCBlcnI7CisKKwlvcGFsID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbC9zZW5zb3JzIik7CisJaWYgKCFvcGFsKSB7CisJCXByX2VycigiJXM6IE9wYWwgJ3NlbnNvcnMnIG5vZGUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShvcGFsLCBucCkgeworCQlpZiAobnAtPm5hbWUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhfU0VOU09SX1RZUEU7IHR5cGUrKykKKwkJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwKKwkJCQkJc2Vuc29yX25hbWVzW3R5cGVdLmNvbXBhaWJsZSkpCisJCQkJYnJlYWs7CisKKwkJaWYgKHR5cGUgPT0gTUFYX1NFTlNPUl9UWVBFKQorCQkJY29udGludWU7CisKKwkJaWYgKGdldF9zZW5zb3JfYXR0cl9wcm9wZXJ0aWVzKG5wLT5uYW1lLCB0eXBlLCAmYXR0cl90eXBlLAorCQkJCSZzZW5zb3JfaW5kZXgpKQorCQkJY29udGludWU7CisKKwkJc2Vuc29yX2lkID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2Vuc29yLWlkIiwgTlVMTCk7CisJCWlmICghc2Vuc29yX2lkKSB7CisJCQlwcl9pbmZvKCIlczogJXMgZG9lc24ndCBoYXZlIHNlbnNvci1pZFxuIiwgX19mdW5jX18sCisJCQkJCW5wLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJyID0gcG93ZXJudl9zZW5zb3JfaW5pdCgqc2Vuc29yX2lkLCBucCwgdHlwZSwgYXR0cl90eXBlLAorCQkJCXNlbnNvcl9pbmRleCk7CisJCWlmIChlcnIpIHsKKwkJCW9mX25vZGVfcHV0KG9wYWwpOworCQkJZ290byBleGl0OworCQl9CisJfQorCW9mX25vZGVfcHV0KG9wYWwpOworCisJcmV0dXJuIDA7CitleGl0OgorCWRlbGV0ZV91bnJlZ2lzdGVyX3NlbnNvcnMoKTsKKwlyZXR1cm4gZXJyOworCit9CisKK3N0YXRpYyB2b2lkIHBvd2VybnZfaHdtb25fZXhpdCh2b2lkKQoreworCWRlbGV0ZV91bnJlZ2lzdGVyX3NlbnNvcnMoKTsKK30KKworbW9kdWxlX2luaXQocG93ZXJudl9od21vbl9pbml0KTsKK21vZHVsZV9leGl0KHBvd2VybnZfaHdtb25fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jIGIvZHJpdmVycy9od21vbi9paW9faHdtb24uYwppbmRleCA3MDgwODFiLi45ZmJiMWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWlvX2h3bW9uLmMKQEAgLTMxLDYgKzMxLDcgQEAKIAlpbnQgbnVtX2NoYW5uZWxzOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJfZ3JvdXA7CisJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzJdOwogCXN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyczsKIH07CiAKQEAgLTU2LDE5ICs1Nyw2IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKLXsKLQljb25zdCBjaGFyICpuYW1lID0gImlpb19od21vbiI7Ci0KLQlpZiAoZGV2LT5vZl9ub2RlICYmIGRldi0+b2Zfbm9kZS0+bmFtZSkKLQkJbmFtZSA9IGRldi0+b2Zfbm9kZS0+bmFtZTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBuYW1lKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCk7Ci0KIHN0YXRpYyBpbnQgaWlvX2h3bW9uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTc4LDYgKzY2LDEwIEBACiAJaW50IGluX2kgPSAxLCB0ZW1wX2kgPSAxLCBjdXJyX2kgPSAxOwogCWVudW0gaWlvX2NoYW5fdHlwZSB0eXBlOwogCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbm5lbHM7CisJY29uc3QgY2hhciAqbmFtZSA9ICJpaW9faHdtb24iOworCisJaWYgKGRldi0+b2Zfbm9kZSAmJiBkZXYtPm9mX25vZGUtPm5hbWUpCisJCW5hbWUgPSBkZXYtPm9mX25vZGUtPm5hbWU7CiAKIAljaGFubmVscyA9IGlpb19jaGFubmVsX2dldF9hbGwoZGV2KTsKIAlpZiAoSVNfRVJSKGNoYW5uZWxzKSkKQEAgLTk2LDcgKzg4LDcgQEAKIAkJc3QtPm51bV9jaGFubmVscysrOwogCiAJc3QtPmF0dHJzID0gZGV2bV9remFsbG9jKGRldiwKLQkJCQkgc2l6ZW9mKCpzdC0+YXR0cnMpICogKHN0LT5udW1fY2hhbm5lbHMgKyAyKSwKKwkJCQkgc2l6ZW9mKCpzdC0+YXR0cnMpICogKHN0LT5udW1fY2hhbm5lbHMgKyAxKSwKIAkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0LT5hdHRycyA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xNDQsMjIgKzEzNiwxOCBAQAogCQlhLT5pbmRleCA9IGk7CiAJCXN0LT5hdHRyc1tpXSA9ICZhLT5kZXZfYXR0ci5hdHRyOwogCX0KLQlzdC0+YXR0cnNbc3QtPm51bV9jaGFubmVsc10gPSAmZGV2X2F0dHJfbmFtZS5hdHRyOwotCXN0LT5hdHRyX2dyb3VwLmF0dHJzID0gc3QtPmF0dHJzOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHN0KTsKLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJnN0LT5hdHRyX2dyb3VwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9yZWxlYXNlX2NoYW5uZWxzOwogCi0Jc3QtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihkZXYpOworCXN0LT5hdHRyX2dyb3VwLmF0dHJzID0gc3QtPmF0dHJzOworCXN0LT5ncm91cHNbMF0gPSAmc3QtPmF0dHJfZ3JvdXA7CisJc3QtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIG5hbWUsIHN0LAorCQkJCQkJCSAgc3QtPmdyb3Vwcyk7CiAJaWYgKElTX0VSUihzdC0+aHdtb25fZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKHN0LT5od21vbl9kZXYpOwotCQlnb3RvIGVycm9yX3JlbW92ZV9ncm91cDsKKwkJZ290byBlcnJvcl9yZWxlYXNlX2NoYW5uZWxzOwogCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzdCk7CiAJcmV0dXJuIDA7CiAKLWVycm9yX3JlbW92ZV9ncm91cDoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJnN0LT5hdHRyX2dyb3VwKTsKIGVycm9yX3JlbGVhc2VfY2hhbm5lbHM6CiAJaWlvX2NoYW5uZWxfcmVsZWFzZV9hbGwoY2hhbm5lbHMpOwogCXJldHVybiByZXQ7CkBAIC0xNzAsNyArMTU4LDYgQEAKIAlzdHJ1Y3QgaWlvX2h3bW9uX3N0YXRlICpzdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnN0LT5hdHRyX2dyb3VwKTsKIAlpaW9fY2hhbm5lbF9yZWxlYXNlX2FsbChzdC0+Y2hhbm5lbHMpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2p6NDc0MC1od21vbi5jIGIvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYwppbmRleCBhMTgzZTQ4Li43NDg4ZTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2p6NDc0MC1od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vano0NzQwLWh3bW9uLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogCiBzdHJ1Y3Qgano0NzQwX2h3bW9uIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAKIAlpbnQgaXJxOwpAQCAtMTA2LDYgKzEwNSw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgano0NzQwX2h3bW9uICpod21vbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAogCWh3bW9uID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaHdtb24pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWh3bW9uKQpAQCAtMTIwLDI1ICsxMjAsMTAgQEAKIAkJcmV0dXJuIGh3bW9uLT5pcnE7CiAJfQogCi0JaHdtb24tPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFod21vbi0+bWVtKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGxhdGZvcm0gbW1pbyByZXNvdXJjZVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCWh3bW9uLT5tZW0gPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCBod21vbi0+bWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUoaHdtb24tPm1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghaHdtb24tPm1lbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBtbWlvIG1lbW9yeSByZWdpb25cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWh3bW9uLT5iYXNlID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgaHdtb24tPm1lbS0+c3RhcnQsCi0JCQkJCSAgIHJlc291cmNlX3NpemUoaHdtb24tPm1lbSkpOwotCWlmICghaHdtb24tPmJhc2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgbW1pbyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWh3bW9uLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1lbSk7CisJaWYgKElTX0VSUihod21vbi0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGh3bW9uLT5iYXNlKTsKIAogCWluaXRfY29tcGxldGlvbigmaHdtb24tPnJlYWRfY29tcGxldGlvbik7CiAJbXV0ZXhfaW5pdCgmaHdtb24tPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwppbmRleCA0YjY4ZmIyLi5jZGYxOWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwpAQCAtODksNyArODksNyBAQAogCiAvKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKSAqLwogc3RydWN0IGxtOTUyNDFfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkLCBpbnRlcnZhbDsJLyogaW4gamlmZmllcyAqLwogCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCkBAIC0xMTMsOCArMTEzLDggQEAKIAogc3RhdGljIHN0cnVjdCBsbTk1MjQxX2RhdGEgKmxtOTUyNDFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCSAgICAhZGF0YS0+dmFsaWQpIHsKIAkJaW50IGk7CiAKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTk1MjQxIGRhdGEuXG4iKTsKKwkJZGV2X2RiZyhkZXYsICJVcGRhdGluZyBsbTk1MjQxIGRhdGEuXG4iKTsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0MV9yZWdfYWRkcmVzcyk7IGkrKykKIAkJCWRhdGEtPnRlbXBbaV0KIAkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LApAQCAtMTUzLDggKzE1Myw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKIAkJZGF0YS0+bW9kZWwgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8gIjFcbiIgOiAiMlxuIik7CkBAIC0xNjMsOCArMTYyLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgc2hpZnQ7CiAJdTggbWFzayA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CkBAIC0yMDEsOCArMjAwLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKIAkJCWRhdGEtPmNvbmZpZyAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPwpAQCAtMjEyLDggKzIxMCw3IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApCkBAIC0yMjksNyArMjI2LDggQEAKIAkJZGF0YS0+Y29uZmlnICY9IH50b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWRhdGEtPnZhbGlkID0gMDsKIAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywKKwkJCQkgIGRhdGEtPmNvbmZpZyk7CiAKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIApAQCAtMjM5LDggKzIzNyw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCiAJCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KQEAgLTI1MCw4ICsyNDcsNyBAQAogc3RhdGljIHNzaXplX3Qgc2V0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWxvbmcgdmFsOwogCiAJaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMjY3LDcgKzI2Myw4IEBACiAJCWRhdGEtPmNvbmZpZyAmPSB+dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlkYXRhLT52YWxpZCA9IDA7CiAKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCisJCQkJICBkYXRhLT5jb25maWcpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTI4Niw4ICsyODMsNyBAQAogc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCiAJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKQEAgLTMxNiw3ICszMTIsNyBAQAogc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW50ZXJ2YWwsCiAJCSAgIHNldF9pbnRlcnZhbCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQxX2F0dHJpYnV0ZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQxX2F0dHJzW10gPSB7CiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCkBAIC0zMjksMTAgKzMyNSw3IEBACiAJJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAogCU5VTEwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTUyNDFfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05NTI0MV9hdHRyaWJ1dGVzLAotfTsKK0FUVFJJQlVURV9HUk9VUFMobG05NTI0MSk7CiAKIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBsbTk1MjQxX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKQEAgLTM2NiwxNCArMzU5LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGxtOTUyNDFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyB2b2lkIGxtOTUyNDFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQogCWRhdGEtPmludGVydmFsID0gSFo7CS8qIDEgc2VjIGRlZmF1bHQgKi8KLQlkYXRhLT52YWxpZCA9IDA7CiAJZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMDA3NjsKLQlkYXRhLT5tb2RlbCA9IDA7CiAJZGF0YS0+dHJ1dGhlcm0gPSAoVFRfT0ZGIDw8IFRUMV9TSElGVCkgfCAoVFRfT0ZGIDw8IFRUMl9TSElGVCk7CiAKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOwpAQCAtMzg1LDQ5ICszNzUsMjcgQEAKIAkJCQkgIGRhdGEtPm1vZGVsKTsKIH0KIAotc3RhdGljIGludCBsbTk1MjQxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAorc3RhdGljIGludCBsbTk1MjQxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhOwotCWludCBlcnI7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmbmV3X2NsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGxtOTUyNDFfZGF0YSksCi0JCQkgICAgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbG05NTI0MV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTE05NTI0MSBjaGlwICovCi0JbG05NTI0MV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKwlsbTk1MjQxX2luaXRfY2xpZW50KGNsaWVudCwgZGF0YSk7CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZsbTk1MjQxX2dyb3VwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOwotCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewotCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWV4aXRfcmVtb3ZlX2ZpbGVzOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZsbTk1MjQxX2dyb3VwKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGxtOTUyNDFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsbTk1MjQxX2dyb3VwKTsKLQotCXJldHVybiAwOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSAgIGRhdGEsCisJCQkJCQkJICAgbG05NTI0MV9ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIAogLyogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykgKi8KQEAgLTQ0NCw3ICs0MTIsNiBAQAogCQkubmFtZQk9IERFVk5BTUUsCiAJfSwKIAkucHJvYmUJCT0gbG05NTI0MV9wcm9iZSwKLQkucmVtb3ZlCQk9IGxtOTUyNDFfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGxtOTUyNDFfaWQsCiAJLmRldGVjdAkJPSBsbTk1MjQxX2RldGVjdCwKIAkuYWRkcmVzc19saXN0CT0gbm9ybWFsX2kyYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKaW5kZXggYTZjODVmMC4uMGFlMGRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAvKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKSAqLwogc3RydWN0IGxtOTUyNDVfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBpbiBqaWZmaWVzICovCiAJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsJLyogaW4gbXNlY3MgKi8KQEAgLTE0MCw4ICsxNDAsOCBAQAogCiBzdGF0aWMgc3RydWN0IGxtOTUyNDVfZGF0YSAqbG05NTI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIApAQCAtMTQ5LDcgKzE0OSw2IEBACiAJCSsgbXNlY3NfdG9famlmZmllcyhkYXRhLT5pbnRlcnZhbCkpIHx8ICFkYXRhLT52YWxpZCkgewogCQlpbnQgaTsKIAotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTUyNDUgZGF0YS5cbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbTk1MjQ1X3JlZ19hZGRyZXNzKTsgaSsrKQogCQkJZGF0YS0+cmVnc1tpXQogCQkJICA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCkBAIC0yNDksOSArMjQ4LDkgQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAogCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCkBAIC0yNzIsMjcgKzI3MSwzOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlpbnQgaHlzdCA9IGRhdGEtPnJlZ3NbaW5kZXhdIC0gZGF0YS0+cmVnc1s4XTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwgaHlzdCAqIDEwMDApOworfQorCiBzdGF0aWMgc3NpemVfdCBzZXRfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBoeXN0LCBsaW1pdDsKIAogCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdmFsIC89IDEwMDA7Ci0KLQl2YWwgPSBjbGFtcF92YWwodmFsLCAwLCAzMSk7Ci0KIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlkYXRhLT52YWxpZCA9IDA7CisJbGltaXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBsbTk1MjQ1X3JlZ19hZGRyZXNzW2luZGV4XSk7CisJaHlzdCA9IGxpbWl0IC0gdmFsIC8gMTAwMDsKKwloeXN0ID0gY2xhbXBfdmFsKGh5c3QsIDAsIDMxKTsKKwlkYXRhLT5yZWdzWzhdID0gaHlzdDsKIAogCS8qIHNoYXJlZCBjcml0IGh5c3RlcmVzaXMgKi8KIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMsCi0JCXZhbCk7CisJCWh5c3QpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTMwMiw4ICszMTIsNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCiAJCWRhdGEtPmNvbmZpZzIgJiBDRkcyX1JFTU9URV9UVCA/ICIxXG4iIDogIjJcbiIpOwpAQCAtMzEyLDggKzMyMSw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMzU5LDggKzM2OCw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAogCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCkBAIC0zNzgsMTYgKzM4NywxNSBAQAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAogCQlzZXRfbGltaXQsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAotCQlzZXRfY3JpdF9oeXN0LCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19jcml0X2h5c3QsCisJCXNldF9jcml0X2h5c3QsIDYpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAogCQlTVEFUVVMxX0xPQyk7CiAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKIAkJc2V0X2xpbWl0LCA3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKLQkJc2V0X2NyaXRfaHlzdCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd19jcml0X2h5c3QsIE5VTEwsIDcpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAogCQlTVEFUVVMxX1JUQ1JJVCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUsCkBAIC0zOTgsNyArNDA2LDcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2ludGVydmFsLAogCQlzZXRfaW50ZXJ2YWwpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0NV9hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0NV9hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLApAQCAtNDEyLDEwICs0MjAsNyBAQAogCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKIAlOVUxMCiB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTk1MjQ1X2dyb3VwID0gewotCS5hdHRycyA9IGxtOTUyNDVfYXR0cmlidXRlcywKLX07CitBVFRSSUJVVEVfR1JPVVBTKGxtOTUyNDUpOwogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgbG05NTI0NV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCkBAIC00MzYsMTEgKzQ0MSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGxtOTUyNDVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyB2b2lkIGxtOTUyNDVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWRhdGEtPnZhbGlkID0gMDsKIAlkYXRhLT5pbnRlcnZhbCA9IGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoY2xpZW50KTsKIAogCWRhdGEtPmNvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LApAQCAtNDU2LDQ5ICs0NTksMjcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbG05NTI0NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKK3N0YXRpYyBpbnQgbG05NTI0NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YTsKLQlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJm5ld19jbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQ1X2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGxtOTUyNDVfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIExNOTUyNDUgY2hpcCAqLwotCWxtOTUyNDVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisJbG05NTI0NV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0NV9ncm91cCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwotCX0KLQotCXJldHVybiAwOwotCi1leGl0X3JlbW92ZV9maWxlczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0NV9ncm91cCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBsbTk1MjQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG05NTI0NV9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLAorCQkJCQkJCSAgIGxtOTUyNDVfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIC8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCkBAIC01MTQsNyArNDk1LDYgQEAKIAkJLm5hbWUJPSBERVZOQU1FLAogCX0sCiAJLnByb2JlCQk9IGxtOTUyNDVfcHJvYmUsCi0JLnJlbW92ZQkJPSBsbTk1MjQ1X3JlbW92ZSwKIAkuaWRfdGFibGUJPSBsbTk1MjQ1X2lkLAogCS5kZXRlY3QJCT0gbG05NTI0NV9kZXRlY3QsCiAJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzI5NDUuYyBiL2RyaXZlcnMvaHdtb24vbHRjMjk0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2x0YzI5NDUuYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjk0NSBJMkMgUG93ZXIgTW9uaXRvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHdWVudGVyIFJvZWNrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworLyogY2hpcCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTFRDMjk0NV9DT05UUk9MCQkJMHgwMAorI2RlZmluZSBMVEMyOTQ1X0FMRVJUCQkJMHgwMQorI2RlZmluZSBMVEMyOTQ1X1NUQVRVUwkJCTB4MDIKKyNkZWZpbmUgTFRDMjk0NV9GQVVMVAkJCTB4MDMKKyNkZWZpbmUgTFRDMjk0NV9QT1dFUl9ICQkJMHgwNQorI2RlZmluZSBMVEMyOTQ1X01BWF9QT1dFUl9ICQkweDA4CisjZGVmaW5lIExUQzI5NDVfTUlOX1BPV0VSX0gJCTB4MGIKKyNkZWZpbmUgTFRDMjk0NV9NQVhfUE9XRVJfVEhSRVNfSAkweDBlCisjZGVmaW5lIExUQzI5NDVfTUlOX1BPV0VSX1RIUkVTX0gJMHgxMQorI2RlZmluZSBMVEMyOTQ1X1NFTlNFX0gJCQkweDE0CisjZGVmaW5lIExUQzI5NDVfTUFYX1NFTlNFX0gJCTB4MTYKKyNkZWZpbmUgTFRDMjk0NV9NSU5fU0VOU0VfSAkJMHgxOAorI2RlZmluZSBMVEMyOTQ1X01BWF9TRU5TRV9USFJFU19ICTB4MWEKKyNkZWZpbmUgTFRDMjk0NV9NSU5fU0VOU0VfVEhSRVNfSAkweDFjCisjZGVmaW5lIExUQzI5NDVfVklOX0gJCQkweDFlCisjZGVmaW5lIExUQzI5NDVfTUFYX1ZJTl9ICQkweDIwCisjZGVmaW5lIExUQzI5NDVfTUlOX1ZJTl9ICQkweDIyCisjZGVmaW5lIExUQzI5NDVfTUFYX1ZJTl9USFJFU19ICQkweDI0CisjZGVmaW5lIExUQzI5NDVfTUlOX1ZJTl9USFJFU19ICQkweDI2CisjZGVmaW5lIExUQzI5NDVfQURJTl9ICQkJMHgyOAorI2RlZmluZSBMVEMyOTQ1X01BWF9BRElOX0gJCTB4MmEKKyNkZWZpbmUgTFRDMjk0NV9NSU5fQURJTl9ICQkweDJjCisjZGVmaW5lIExUQzI5NDVfTUFYX0FESU5fVEhSRVNfSAkweDJlCisjZGVmaW5lIExUQzI5NDVfTUlOX0FESU5fVEhSRVNfSAkweDMwCisjZGVmaW5lIExUQzI5NDVfTUlOX0FESU5fVEhSRVNfTAkweDMxCisKKy8qIEZhdWx0IHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBGQVVMVF9BRElOX1VWCQkoMSA8PCAwKQorI2RlZmluZSBGQVVMVF9BRElOX09WCQkoMSA8PCAxKQorI2RlZmluZSBGQVVMVF9WSU5fVVYJCSgxIDw8IDIpCisjZGVmaW5lIEZBVUxUX1ZJTl9PVgkJKDEgPDwgMykKKyNkZWZpbmUgRkFVTFRfU0VOU0VfVVYJCSgxIDw8IDQpCisjZGVmaW5lIEZBVUxUX1NFTlNFX09WCQkoMSA8PCA1KQorI2RlZmluZSBGQVVMVF9QT1dFUl9VVgkJKDEgPDwgNikKKyNkZWZpbmUgRkFVTFRfUE9XRVJfT1YJCSgxIDw8IDcpCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIENPTlRST0xfTVVMVF9TRUxFQ1QJKDEgPDwgMCkKKyNkZWZpbmUgQ09OVFJPTF9URVNUX01PREUJKDEgPDwgNCkKKworc3RhdGljIGlubGluZSBib29sIGlzX3Bvd2VyX3JlZyh1OCByZWcpCit7CisJcmV0dXJuIHJlZyA8IExUQzI5NDVfU0VOU0VfSDsKK30KKworLyogUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiByZWdpc3RlciBpbiB1VywgbVYsIG9yIG1BICovCitzdGF0aWMgbG9uZyBsb25nIGx0YzI5NDVfcmVnX3RvX3ZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgY29udHJvbDsKKwl1OCBidWZbM107CisJbG9uZyBsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChyZWdtYXAsIHJlZywgYnVmLAorCQkJICAgICAgIGlzX3Bvd2VyX3JlZyhyZWcpID8gMyA6IDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGlzX3Bvd2VyX3JlZyhyZWcpKSB7CisJCS8qIHBvd2VyICovCisJCXZhbCA9IChidWZbMF0gPDwgMTYpICsgKGJ1ZlsxXSA8PCA4KSArIGJ1ZlsyXTsKKwl9IGVsc2UgeworCQkvKiBjdXJyZW50LCB2b2x0YWdlICovCisJCXZhbCA9IChidWZbMF0gPDwgNCkgKyAoYnVmWzFdID4+IDQpOworCX0KKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEMyOTQ1X1BPV0VSX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9QT1dFUl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfSDoKKwljYXNlIExUQzI5NDVfTUFYX1BPV0VSX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9QT1dFUl9USFJFU19IOgorCQkvKgorCQkgKiBDb252ZXJ0IHRvIHVXIGJ5IGFzc3VtaW5nIGN1cnJlbnQgaXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxbU9obSBzZW5zZSByZXNpc3Rvciwgc2ltaWxhciB0byBjdXJyZW50CisJCSAqIG1lYXN1cmVtZW50cy4KKwkJICogQ29udHJvbCByZWdpc3RlciBiaXQgMCBzZWxlY3RzIGlmIHZvbHRhZ2UgYXQgU0VOU0UrL1ZERAorCQkgKiBvciB2b2x0YWdlIGF0IEFESU4gaXMgdXNlZCB0byBtZWFzdXJlIHBvd2VyLgorCQkgKi8KKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMVEMyOTQ1X0NPTlRST0wsICZjb250cm9sKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoY29udHJvbCAmIENPTlRST0xfTVVMVF9TRUxFQ1QpIHsKKwkJCS8qIDI1IG1WICogMjUgdVYgPSAwLjYyNSB1ViByZXNvbHV0aW9uLiAqLworCQkJdmFsICo9IDYyNUxMOworCQl9IGVsc2UgeworCQkJLyogMC41IG1WICogMjUgdVYgPSAwLjAxMjUgdVYgcmVzb2x1dGlvbi4gKi8KKwkJCXZhbCA9ICh2YWwgKiAyNUxMKSA+PiAxOworCQl9CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9WSU5fSDoKKwljYXNlIExUQzI5NDVfTUFYX1ZJTl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fVklOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9WSU5fVEhSRVNfSDoKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9USFJFU19IOgorCQkvKiAyNSBtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgKj0gMjU7CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9BRElOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9BRElOX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9BRElOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9BRElOX0g6CisJCS8qIDAuNW1WIHJlc29sdXRpb24uIENvbnZlcnQgdG8gbVYuICovCisJCXZhbCA9IHZhbCA+PiAxOworCQlicmVhazsKKwljYXNlIExUQzI5NDVfU0VOU0VfSDoKKwljYXNlIExUQzI5NDVfTUFYX1NFTlNFX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9IOgorCWNhc2UgTFRDMjk0NV9NQVhfU0VOU0VfVEhSRVNfSDoKKwljYXNlIExUQzI5NDVfTUlOX1NFTlNFX1RIUkVTX0g6CisJCS8qCisJCSAqIDI1IHVWIHJlc29sdXRpb24uIENvbnZlcnQgdG8gY3VycmVudCBhcyBtZWFzdXJlZCB3aXRoCisJCSAqIGFuIDEgbU9obSBzZW5zZSByZXNpc3RvciwgaW4gbUEuIElmIGEgZGlmZmVyZW50IHNlbnNlCisJCSAqIHJlc2lzdG9yIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZSBhY3R1YWwgY3VycmVudCBieQorCQkgKiBkaXZpZGluZyB0aGUgcmVwb3J0ZWQgY3VycmVudCBieSB0aGUgc2Vuc2UgcmVzaXN0b3IgdmFsdWUKKwkJICogaW4gbU9obS4KKwkJICovCisJCXZhbCAqPSAyNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgbHRjMjk0NV92YWxfdG9fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGNvbnRyb2w7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEMyOTQ1X1BPV0VSX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9QT1dFUl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfSDoKKwljYXNlIExUQzI5NDVfTUFYX1BPV0VSX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9QT1dFUl9USFJFU19IOgorCQkvKgorCQkgKiBDb252ZXJ0IHRvIHJlZ2lzdGVyIHZhbHVlIGJ5IGFzc3VtaW5nIGN1cnJlbnQgaXMgbWVhc3VyZWQKKwkJICogd2l0aCBhbiAxbU9obSBzZW5zZSByZXNpc3Rvciwgc2ltaWxhciB0byBjdXJyZW50CisJCSAqIG1lYXN1cmVtZW50cy4KKwkJICogQ29udHJvbCByZWdpc3RlciBiaXQgMCBzZWxlY3RzIGlmIHZvbHRhZ2UgYXQgU0VOU0UrL1ZERAorCQkgKiBvciB2b2x0YWdlIGF0IEFESU4gaXMgdXNlZCB0byBtZWFzdXJlIHBvd2VyLCB3aGljaCBpbiB0dXJuCisJCSAqIGRldGVybWluZXMgcmVnaXN0ZXIgY2FsY3VsYXRpb25zLgorCQkgKi8KKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMVEMyOTQ1X0NPTlRST0wsICZjb250cm9sKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoY29udHJvbCAmIENPTlRST0xfTVVMVF9TRUxFQ1QpIHsKKwkJCS8qIDI1IG1WICogMjUgdVYgPSAwLjYyNSB1ViByZXNvbHV0aW9uLiAqLworCQkJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QodmFsLCA2MjUpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIDAuNSBtViAqIDI1IHVWID0gMC4wMTI1IHVWIHJlc29sdXRpb24uCisJCQkgKiBEaXZpZGUgZmlyc3QgdG8gYXZvaWQgb3ZlcmZsb3c7CisJCQkgKiBhY2NlcHQgbG9zcyBvZiBhY2N1cmFjeS4KKwkJCSAqLworCQkJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QodmFsLCAyNSkgKiAyOworCQl9CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9WSU5fSDoKKwljYXNlIExUQzI5NDVfTUFYX1ZJTl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fVklOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9WSU5fVEhSRVNfSDoKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9USFJFU19IOgorCQkvKiAyNSBtViByZXNvbHV0aW9uLiAqLworCQl2YWwgLz0gMjU7CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9BRElOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9BRElOX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9BRElOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9BRElOX0g6CisJCS8qIDAuNW1WIHJlc29sdXRpb24uICovCisJCXZhbCAqPSAyOworCQlicmVhazsKKwljYXNlIExUQzI5NDVfU0VOU0VfSDoKKwljYXNlIExUQzI5NDVfTUFYX1NFTlNFX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9IOgorCWNhc2UgTFRDMjk0NV9NQVhfU0VOU0VfVEhSRVNfSDoKKwljYXNlIExUQzI5NDVfTUlOX1NFTlNFX1RIUkVTX0g6CisJCS8qCisJCSAqIDI1IHVWIHJlc29sdXRpb24uIENvbnZlcnQgdG8gY3VycmVudCBhcyBtZWFzdXJlZCB3aXRoCisJCSAqIGFuIDEgbU9obSBzZW5zZSByZXNpc3RvciwgaW4gbUEuIElmIGEgZGlmZmVyZW50IHNlbnNlCisJCSAqIHJlc2lzdG9yIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZSBhY3R1YWwgY3VycmVudCBieQorCQkgKiBkaXZpZGluZyB0aGUgcmVwb3J0ZWQgY3VycmVudCBieSB0aGUgc2Vuc2UgcmVzaXN0b3IgdmFsdWUKKwkJICogaW4gbU9obS4KKwkJICovCisJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMjUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHNzaXplX3QgbHRjMjk0NV9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJbG9uZyBsb25nIHZhbHVlOworCisJdmFsdWUgPSBsdGMyOTQ1X3JlZ190b192YWwoZGV2LCBhdHRyLT5pbmRleCk7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbGRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgbHRjMjk0NV9zZXRfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCByZWcgPSBhdHRyLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1OCByZWdidWZbM107CisJaW50IG51bV9yZWdzOworCWludCByZWd2YWw7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBjb252ZXJ0IHRvIHJlZ2lzdGVyIHZhbHVlLCB0aGVuIGNsYW1wIGFuZCB3cml0ZSByZXN1bHQgKi8KKwlyZWd2YWwgPSBsdGMyOTQ1X3ZhbF90b19yZWcoZGV2LCByZWcsIHZhbCk7CisJaWYgKGlzX3Bvd2VyX3JlZyhyZWcpKSB7CisJCXJlZ3ZhbCA9IGNsYW1wX3ZhbChyZWd2YWwsIDAsIDB4ZmZmZmZmKTsKKwkJcmVnYnVmWzBdID0gcmVndmFsID4+IDE2OworCQlyZWdidWZbMV0gPSAocmVndmFsID4+IDgpICYgMHhmZjsKKwkJcmVnYnVmWzJdID0gcmVndmFsOworCQludW1fcmVncyA9IDM7CisJfSBlbHNlIHsKKwkJcmVndmFsID0gY2xhbXBfdmFsKHJlZ3ZhbCwgMCwgMHhmZmYpIDw8IDQ7CisJCXJlZ2J1ZlswXSA9IHJlZ3ZhbCA+PiA4OworCQlyZWdidWZbMV0gPSByZWd2YWwgJiAweGZmOworCQludW1fcmVncyA9IDI7CisJfQorCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHJlZ21hcCwgcmVnLCByZWdidWYsIG51bV9yZWdzKTsKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBsdGMyOTQ1X3Jlc2V0X2hpc3Rvcnkoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCByZWcgPSBhdHRyLT5pbmRleDsKKwlpbnQgbnVtX3JlZ3MgPSBpc19wb3dlcl9yZWcocmVnKSA/IDMgOiAyOworCXU4IGJ1Zl9taW5bM10gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKwl1OCBidWZfbWF4WzNdID0geyAwLCAwLCAwIH07CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExUQzI5NDVfQ09OVFJPTCwgQ09OVFJPTF9URVNUX01PREUsCisJCQkJIENPTlRST0xfVEVTVF9NT0RFKTsKKworCS8qIFJlc2V0IG1pbmltdW0gKi8KKwlyZXQgPSByZWdtYXBfYnVsa193cml0ZShyZWdtYXAsIHJlZywgYnVmX21pbiwgbnVtX3JlZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfSDoKKwkJcmVnID0gTFRDMjk0NV9NQVhfUE9XRVJfSDsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9IOgorCQlyZWcgPSBMVEMyOTQ1X01BWF9TRU5TRV9IOworCQlicmVhazsKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9IOgorCQlyZWcgPSBMVEMyOTQ1X01BWF9WSU5fSDsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X01JTl9BRElOX0g6CisJCXJlZyA9IExUQzI5NDVfTUFYX0FESU5fSDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKwkvKiBSZXNldCBtYXhpbXVtICovCisJcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUocmVnbWFwLCByZWcsIGJ1Zl9tYXgsIG51bV9yZWdzKTsKKworCS8qIFRyeSByZXNldHRpbmcgdGVzdCBtb2RlIGV2ZW4gaWYgdGhlcmUgd2FzIGFuIGVycm9yICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgTFRDMjk0NV9DT05UUk9MLCBDT05UUk9MX1RFU1RfTU9ERSwgMCk7CisKKwlyZXR1cm4gcmV0ID8gOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgbHRjMjk0NV9zaG93X2Jvb2woc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBmYXVsdDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMVEMyOTQ1X0ZBVUxULCAmZmF1bHQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZmF1bHQgJj0gYXR0ci0+aW5kZXg7CisJaWYgKGZhdWx0KQkJLyogQ2xlYXIgcmVwb3J0ZWQgZmF1bHRzIGluIGNoaXAgcmVnaXN0ZXIgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgTFRDMjk0NV9GQVVMVCwgYXR0ci0+aW5kZXgsIDApOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsICEhZmF1bHQpOworfQorCisvKiBJbnB1dCB2b2x0YWdlcyAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X1ZJTl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUlOX1ZJTl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUFYX1ZJTl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2xvd2VzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X01JTl9WSU5fSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9oaWdoZXN0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfTUFYX1ZJTl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX3Jlc2V0X2hpc3RvcnksIFNfSVdVU1IsIE5VTEwsCisJCQkgIGx0YzI5NDVfcmVzZXRfaGlzdG9yeSwgTFRDMjk0NV9NSU5fVklOX0gpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X0FESU5fSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBsdGMyOTQ1X3NldF92YWx1ZSwgTFRDMjk0NV9NQVhfQURJTl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2xvd2VzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X01JTl9BRElOX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaGlnaGVzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X01BWF9BRElOX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfcmVzZXRfaGlzdG9yeSwgU19JV1VTUiwgTlVMTCwKKwkJCSAgbHRjMjk0NV9yZXNldF9oaXN0b3J5LCBMVEMyOTQ1X01JTl9BRElOX0gpOworCisvKiBWb2x0YWdlIGFsYXJtcyAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzI5NDVfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9WSU5fVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfVklOX09WKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX21pbl9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX0FESU5fVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfQURJTl9PVik7CisKKy8qIEN1cnJlbnRzICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfaW5wdXQsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9TRU5TRV9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBsdGMyOTQ1X3NldF92YWx1ZSwgTFRDMjk0NV9NSU5fU0VOU0VfVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUFYX1NFTlNFX1RIUkVTX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9sb3dlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NSU5fU0VOU0VfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2hpZ2hlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NQVhfU0VOU0VfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX3Jlc2V0X2hpc3RvcnksIFNfSVdVU1IsIE5VTEwsCisJCQkgIGx0YzI5NDVfcmVzZXRfaGlzdG9yeSwgTFRDMjk0NV9NSU5fU0VOU0VfSCk7CisKKy8qIEN1cnJlbnQgYWxhcm1zICovCisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfU0VOU0VfVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzI5NDVfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9TRU5TRV9PVik7CisKKy8qIFBvd2VyICovCisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfUE9XRVJfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01JTl9QT1dFUl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUFYX1BPV0VSX1RIUkVTX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfaW5wdXRfbG93ZXN0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIE5VTEwsIExUQzI5NDVfTUlOX1BPV0VSX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfaW5wdXRfaGlnaGVzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBOVUxMLCBMVEMyOTQ1X01BWF9QT1dFUl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX3Jlc2V0X2hpc3RvcnksIFNfSVdVU1IsIE5VTEwsCisJCQkgIGx0YzI5NDVfcmVzZXRfaGlzdG9yeSwgTFRDMjk0NV9NSU5fUE9XRVJfSCk7CisKKy8qIFBvd2VyIGFsYXJtcyAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzI5NDVfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9QT1dFUl9VVik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzI5NDVfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9QT1dFUl9PVik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGMyOTQ1X2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9sb3dlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9oaWdoZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfcmVzZXRfaGlzdG9yeS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9sb3dlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9oaWdoZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfcmVzZXRfaGlzdG9yeS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2xvd2VzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfaGlnaGVzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfcmVzZXRfaGlzdG9yeS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfaW5wdXRfbG93ZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfaW5wdXRfaGlnaGVzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyhsdGMyOTQ1KTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGx0YzI5NDVfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IExUQzI5NDVfTUlOX0FESU5fVEhSRVNfTCwKK307CisKK3N0YXRpYyBpbnQgbHRjMjk0NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmx0YzI5NDVfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJLyogQ2xlYXIgZmF1bHRzICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgTFRDMjk0NV9GQVVMVCwgMHgwMCk7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICByZWdtYXAsCisJCQkJCQkJICAgbHRjMjk0NV9ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzI5NDVfaWRbXSA9IHsKKwl7Imx0YzI5NDUiLCAwfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGMyOTQ1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzI5NDVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImx0YzI5NDUiLAorCQkgICB9LAorCS5wcm9iZSA9IGx0YzI5NDVfcHJvYmUsCisJLmlkX3RhYmxlID0gbHRjMjk0NV9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzI5NDVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEMyOTQ1IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjE1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyMTUuYwppbmRleCA4YTE0Mjk2Li5jOGE5YmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2x0YzQyMTUuYworKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyMTUuYwpAQCAtMzMsNyArMzMsNyBAQAogfTsKIAogc3RydWN0IGx0YzQyMTVfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJYm9vbCB2YWxpZDsKQEAgLTQ1LDggKzQ1LDggQEAKIAogc3RhdGljIHN0cnVjdCBsdGM0MjE1X2RhdGEgKmx0YzQyMTVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbHRjNDIxNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGx0YzQyMTVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJczMyIHZhbDsKIAlpbnQgaTsKIApAQCAtMjE0LDcgKzIxNCw3IEBACiAgKiBGaW5hbGx5LCBjb25zdHJ1Y3QgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gbWVtYmVycyBvZiB0aGUgYWJvdmUgb2JqZWN0cywKICAqIGFzIHJlcXVpcmVkIGZvciBzeXNmc19jcmVhdGVfZ3JvdXAoKQogICovCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRjNDIxNV9hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRjNDIxNV9hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCkBAIC0yMjksNTcgKzIyOSwzMyBAQAogCiAJTlVMTCwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGx0YzQyMTVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbHRjNDIxNV9hdHRyaWJ1dGVzLAotfTsKK0FUVFJJQlVURV9HUk9VUFMobHRjNDIxNSk7CiAKIHN0YXRpYyBpbnQgbHRjNDIxNV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBsdGM0MjE1X2RhdGEgKmRhdGE7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIExUQzQyMTUgY2hpcCAqLwogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjE1X0ZBVUxULCAweDAwKTsKIAotCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDIxNV9ncm91cCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwotCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JCWdvdG8gb3V0X2h3bW9uX2RldmljZV9yZWdpc3RlcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotb3V0X2h3bW9uX2RldmljZV9yZWdpc3RlcjoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjE1X2dyb3VwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGx0YzQyMTVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGx0YzQyMTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjE1X2dyb3VwKTsKLQotCXJldHVybiAwOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSAgIGRhdGEsCisJCQkJCQkJICAgbHRjNDIxNV9ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzQyMTVfaWRbXSA9IHsKQEAgLTI5NCw3ICsyNzAsNiBAQAogCQkubmFtZQk9ICJsdGM0MjE1IiwKIAl9LAogCS5wcm9iZQkJPSBsdGM0MjE1X3Byb2JlLAotCS5yZW1vdmUJCT0gbHRjNDIxNV9yZW1vdmUsCiAJLmlkX3RhYmxlCT0gbHRjNDIxNV9pZCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDIyMi5jIGIvZHJpdmVycy9od21vbi9sdGM0MjIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMjU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDIyMi5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogRHJpdmVyIGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjIyIER1YWwgSG90IFN3YXAgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHdWVudGVyIFJvZWNrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworLyogY2hpcCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBMVEM0MjIyX0NPTlRST0wxCTB4ZDAKKyNkZWZpbmUgTFRDNDIyMl9BTEVSVDEJCTB4ZDEKKyNkZWZpbmUgTFRDNDIyMl9TVEFUVVMxCQkweGQyCisjZGVmaW5lIExUQzQyMjJfRkFVTFQxCQkweGQzCisjZGVmaW5lIExUQzQyMjJfQ09OVFJPTDIJMHhkNAorI2RlZmluZSBMVEM0MjIyX0FMRVJUMgkJMHhkNQorI2RlZmluZSBMVEM0MjIyX1NUQVRVUzIJCTB4ZDYKKyNkZWZpbmUgTFRDNDIyMl9GQVVMVDIJCTB4ZDcKKyNkZWZpbmUgTFRDNDIyMl9TT1VSQ0UxCQkweGQ4CisjZGVmaW5lIExUQzQyMjJfU09VUkNFMgkJMHhkYQorI2RlZmluZSBMVEM0MjIyX0FESU4xCQkweGRjCisjZGVmaW5lIExUQzQyMjJfQURJTjIJCTB4ZGUKKyNkZWZpbmUgTFRDNDIyMl9TRU5TRTEJCTB4ZTAKKyNkZWZpbmUgTFRDNDIyMl9TRU5TRTIJCTB4ZTIKKyNkZWZpbmUgTFRDNDIyMl9BRENfQ09OVFJPTAkweGU0CisKKy8qCisgKiBGYXVsdCByZWdpc3RlciBiaXRzCisgKi8KKyNkZWZpbmUgRkFVTFRfT1YJQklUKDApCisjZGVmaW5lIEZBVUxUX1VWCUJJVCgxKQorI2RlZmluZSBGQVVMVF9PQwlCSVQoMikKKyNkZWZpbmUgRkFVTFRfUE9XRVJfQkFECUJJVCgzKQorI2RlZmluZSBGQVVMVF9GRVRfQkFECUJJVCg1KQorCisvKiBSZXR1cm4gdGhlIHZvbHRhZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gbVYgb3IgbUEgKi8KK3N0YXRpYyBpbnQgbHRjNDIyMl9nZXRfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9idWxrX3JlYWQocmVnbWFwLCByZWcsIGJ1ZiwgMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl2YWwgPSAoKGJ1ZlswXSA8PCA4KSArIGJ1ZlsxXSkgPj4gNjsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEM0MjIyX0FESU4xOgorCWNhc2UgTFRDNDIyMl9BRElOMjoKKwkJLyogMS4yNSBtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwgKiA1LCA0KTsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjIyX1NPVVJDRTE6CisJY2FzZSBMVEM0MjIyX1NPVVJDRTI6CisJCS8qIDMxLjI1IG1WIHJlc29sdXRpb24uIENvbnZlcnQgdG8gbVYuICovCisJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCAqIDEyNSwgNCk7CisJCWJyZWFrOworCWNhc2UgTFRDNDIyMl9TRU5TRTE6CisJY2FzZSBMVEM0MjIyX1NFTlNFMjoKKwkJLyoKKwkJICogNjIuNSB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLiBJZiBhIGRpZmZlcmVudCBzZW5zZQorCQkgKiByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgYnkKKwkJICogZGl2aWRpbmcgdGhlIHJlcG9ydGVkIGN1cnJlbnQgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlCisJCSAqIGluIG1PaG0uCisJCSAqLworCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwgKiAxMjUsIDIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHNzaXplX3QgbHRjNDIyMl9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSBsdGM0MjIyX2dldF92YWx1ZShkZXYsIGF0dHItPmluZGV4KTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gdmFsdWU7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgbHRjNDIyMl9zaG93X2Jvb2woc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRhKTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmF1bHQ7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgYXR0ci0+bnIsICZmYXVsdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZmF1bHQgJj0gYXR0ci0+aW5kZXg7CisJaWYgKGZhdWx0KQkJLyogQ2xlYXIgcmVwb3J0ZWQgZmF1bHRzIGluIGNoaXAgcmVnaXN0ZXIgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgYXR0ci0+bnIsIGF0dHItPmluZGV4LCAwKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIWZhdWx0KTsKK30KKworLyogVm9sdGFnZXMgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyMjJfU09VUkNFMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX0FESU4xKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyMjJfU09VUkNFMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX0FESU4yKTsKKworLyoKKyAqIFZvbHRhZ2UgYWxhcm1zCisgKiBVVi9PViBmYXVsdHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgdm9sdGFnZSwgYW5kIHBvd2VyIGJhZCBhbmQgZmV0CisgKiBmYXVsdHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IHZvbHRhZ2UuCisgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMSwgRkFVTFRfVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyMjJfc2hvd19ib29sLCBOVUxMLAorCQkJICAgIExUQzQyMjJfRkFVTFQxLCBGQVVMVF9PVik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMSwgRkFVTFRfUE9XRVJfQkFEIHwgRkFVTFRfRkVUX0JBRCk7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjNfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMiwgRkFVTFRfVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyMjJfc2hvd19ib29sLCBOVUxMLAorCQkJICAgIExUQzQyMjJfRkFVTFQyLCBGQVVMVF9PVik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW40X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMiwgRkFVTFRfUE9XRVJfQkFEIHwgRkFVTFRfRkVUX0JBRCk7CisKKy8qIEN1cnJlbnQgKHZpYSBzZW5zZSByZXNpc3RvcikgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9TRU5TRTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMl9pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX1NFTlNFMik7CisKKy8qIE92ZXJjdXJyZW50IGFsYXJtICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoY3VycjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMSwgRkFVTFRfT0MpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnIyX21heF9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDIsIEZBVUxUX09DKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyMjJfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJTlVMTCwKK307CitBVFRSSUJVVEVfR1JPVVBTKGx0YzQyMjIpOworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgbHRjNDIyMl9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKwkubWF4X3JlZ2lzdGVyID0gTFRDNDIyMl9BRENfQ09OVFJPTCwKK307CisKK3N0YXRpYyBpbnQgbHRjNDIyMl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmx0YzQyMjJfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJLyogQ2xlYXIgZmF1bHRzICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgTFRDNDIyMl9GQVVMVDEsIDB4MDApOworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzQyMjJfRkFVTFQyLCAweDAwKTsKKworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSAgIHJlZ21hcCwKKwkJCQkJCQkgICBsdGM0MjIyX2dyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbHRjNDIyMl9pZFtdID0geworCXsibHRjNDIyMiIsIDB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0YzQyMjJfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbHRjNDIyMl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAibHRjNDIyMiIsCisJCSAgIH0sCisJLnByb2JlID0gbHRjNDIyMl9wcm9iZSwKKwkuaWRfdGFibGUgPSBsdGM0MjIyX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIobHRjNDIyMl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxUQzQyMjIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jCmluZGV4IGQ0MTcyOTMzLi42ODFiNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYworKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwpAQCAtOTUsNyArOTUsNiBAQAogCSAqIHJlYWRpbmdzIGFzIHN0YWxlIGJ5IHNldHRpbmcgdGhlbSB0byAtRUFHQUlOCiAJICovCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgNSAqIEhaKSkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIk1hcmtpbmcgR1BJT3MgaW52YWxpZFxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmdwaW9zKTsgaSsrKQogCQkJZGF0YS0+Z3Bpb3NbaV0gPSAtRUFHQUlOOwogCX0KQEAgLTE0MSw4ICsxNDAsNiBAQAogCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewogCi0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgbHRjNDI0NSB1cGRhdGVcbiIpOwotCiAJCS8qIFJlYWQgY29udHJvbCByZWdpc3RlcnMgLS0gMHgwMCB0byAweDA3ICovCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmNyZWdzKTsgaSsrKSB7CiAJCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBpKTsKQEAgLTQ3MCwxOSArNDY3LDE1IEBACiBzdGF0aWMgYm9vbCBsdGM0MjQ1X3VzZV9leHRyYV9ncGlvcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBsdGM0MjQ1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwotI2lmZGVmIENPTkZJR19PRgogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBjbGllbnQtPmRldi5vZl9ub2RlOwotI2VuZGlmCiAKIAkvKiBwcmVmZXIgcGxhdGZvcm0gZGF0YSAqLwogCWlmIChwZGF0YSkKIAkJcmV0dXJuIHBkYXRhLT51c2VfZXh0cmFfZ3Bpb3M7CiAKLSNpZmRlZiBDT05GSUdfT0YKIAkvKiBmYWxsYmFjayBvbiBPRiAqLwogCWlmIChvZl9maW5kX3Byb3BlcnR5KG5wLCAibHRjNDI0NSx1c2UtZXh0cmEtZ3Bpb3MiLCBOVUxMKSkKIAkJcmV0dXJuIHRydWU7Ci0jZW5kaWYKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTUxMiwyNCArNTA1LDEwIEBACiAJLyogQWRkIHN5c2ZzIGhvb2tzICovCiAJbHRjNDI0NV9zeXNmc19hZGRfZ3JvdXBzKGRhdGEpOwogCi0JaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKCZjbGllbnQtPmRldiwKLQkJCQkJCSAgICAgIGNsaWVudC0+bmFtZSwgZGF0YSwKLQkJCQkJCSAgICAgIGRhdGEtPmdyb3Vwcyk7Ci0JaWYgKElTX0VSUihod21vbl9kZXYpKQotCQlyZXR1cm4gUFRSX0VSUihod21vbl9kZXYpOwotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaHdtb25fZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGx0YzQyNDVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3Rlcihod21vbl9kZXYpOwotCi0JcmV0dXJuIDA7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoJmNsaWVudC0+ZGV2LAorCQkJCQkJCSAgIGNsaWVudC0+bmFtZSwgZGF0YSwKKwkJCQkJCQkgICBkYXRhLT5ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzQyNDVfaWRbXSA9IHsKQEAgLTU0NCw3ICs1MjMsNiBAQAogCQkubmFtZQk9ICJsdGM0MjQ1IiwKIAl9LAogCS5wcm9iZQkJPSBsdGM0MjQ1X3Byb2JlLAotCS5yZW1vdmUJCT0gbHRjNDI0NV9yZW1vdmUsCiAJLmlkX3RhYmxlCT0gbHRjNDI0NV9pZCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDI2MC5jIGIvZHJpdmVycy9od21vbi9sdGM0MjYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzYTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDI2MC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogRHJpdmVyIGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYwIEkyQyBQb3NpdGl2ZSBWb2x0YWdlIEhvdCBTd2FwIENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR3VlbnRlciBSb2VjaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qIGNoaXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIExUQzQyNjBfQ09OVFJPTAkweDAwCisjZGVmaW5lIExUQzQyNjBfQUxFUlQJMHgwMQorI2RlZmluZSBMVEM0MjYwX1NUQVRVUwkweDAyCisjZGVmaW5lIExUQzQyNjBfRkFVTFQJMHgwMworI2RlZmluZSBMVEM0MjYwX1NFTlNFCTB4MDQKKyNkZWZpbmUgTFRDNDI2MF9TT1VSQ0UJMHgwNQorI2RlZmluZSBMVEM0MjYwX0FESU4JMHgwNgorCisvKgorICogRmF1bHQgcmVnaXN0ZXIgYml0cworICovCisjZGVmaW5lIEZBVUxUX09WCSgxIDw8IDApCisjZGVmaW5lIEZBVUxUX1VWCSgxIDw8IDEpCisjZGVmaW5lIEZBVUxUX09DCSgxIDw8IDIpCisjZGVmaW5lIEZBVUxUX1BPV0VSX0JBRAkoMSA8PCAzKQorI2RlZmluZSBGQVVMVF9GRVRfU0hPUlQJKDEgPDwgNSkKKworLyogUmV0dXJuIHRoZSB2b2x0YWdlIGZyb20gdGhlIGdpdmVuIHJlZ2lzdGVyIGluIG1WIG9yIG1BICovCitzdGF0aWMgaW50IGx0YzQyNjBfZ2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgcmVnLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEM0MjYwX0FESU46CisJCS8qIDEwIG1WIHJlc29sdXRpb24uIENvbnZlcnQgdG8gbVYuICovCisJCXZhbCA9IHZhbCAqIDEwOworCQlicmVhazsKKwljYXNlIExUQzQyNjBfU09VUkNFOgorCQkvKiA0MDAgbVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBtVi4gKi8KKwkJdmFsID0gdmFsICogNDAwOworCQlicmVhazsKKwljYXNlIExUQzQyNjBfU0VOU0U6CisJCS8qCisJCSAqIDMwMCB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLiBJZiBhIGRpZmZlcmVudCBzZW5zZQorCQkgKiByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgYnkKKwkJICogZGl2aWRpbmcgdGhlIHJlcG9ydGVkIGN1cnJlbnQgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlCisJCSAqIGluIG1PaG0uCisJCSAqLworCQl2YWwgPSB2YWwgKiAzMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNjBfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWludCB2YWx1ZTsKKworCXZhbHVlID0gbHRjNDI2MF9nZXRfdmFsdWUoZGV2LCBhdHRyLT5pbmRleCk7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNjBfc2hvd19ib29sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmF1bHQ7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDNDI2MF9GQVVMVCwgJmZhdWx0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZhdWx0ICY9IGF0dHItPmluZGV4OworCWlmIChmYXVsdCkJCS8qIENsZWFyIHJlcG9ydGVkIGZhdWx0cyBpbiBjaGlwIHJlZ2lzdGVyICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExUQzQyNjBfRkFVTFQsIGF0dHItPmluZGV4LCAwKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIWZhdWx0KTsKK30KKworLyogVm9sdGFnZXMgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyNjBfU09VUkNFKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyNjBfQURJTik7CisKKy8qCisgKiBWb2x0YWdlIGFsYXJtcworICogVVYvT1YgZmF1bHRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHZvbHRhZ2UsIGFuZCB0aGUgUE9XRVIgQkFEIGFuZAorICogRkVUIFNIT1JUIGZhdWx0cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgdm9sdGFnZS4KKyAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfT1YpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYWxhcm0sIFNfSVJVR08sIGx0YzQyNjBfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9QT1dFUl9CQUQgfCBGQVVMVF9GRVRfU0hPUlQpOworCisvKiBDdXJyZW50ICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyNjBfU0VOU0UpOworCisvKiBPdmVyY3VycmVudCBhbGFybSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNjBfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9PQyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjYwX2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyhsdGM0MjYwKTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGx0YzQyNjBfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IExUQzQyNjBfQURJTiwKK307CisKK3N0YXRpYyBpbnQgbHRjNDI2MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmx0YzQyNjBfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJLyogQ2xlYXIgZmF1bHRzICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgTFRDNDI2MF9GQVVMVCwgMHgwMCk7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICByZWdtYXAsCisJCQkJCQkJICAgbHRjNDI2MF9ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzQyNjBfaWRbXSA9IHsKKwl7Imx0YzQyNjAiLCAwfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MjYwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQyNjBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImx0YzQyNjAiLAorCQkgICB9LAorCS5wcm9iZSA9IGx0YzQyNjBfcHJvYmUsCisJLmlkX3RhYmxlID0gbHRjNDI2MF9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzQyNjBfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEM0MjYwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxNjY4LmMgYi9kcml2ZXJzL2h3bW9uL21heDE2NjguYwppbmRleCAwMjliNjVlLi5lM2VkMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDE2NjguYworKysgYi9kcml2ZXJzL2h3bW9uL21heDE2NjguYwpAQCAtNjYsNyArNjYsOCBAQAogZW51bSBjaGlwcyB7IG1heDE2NjgsIG1heDE4MDUsIG1heDE5ODkgfTsKIAogc3RydWN0IG1heDE2NjhfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzNdOwogCWVudW0gY2hpcHMgdHlwZTsKIAogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKQEAgLTgyLDggKzgzLDggQEAKIAogc3RhdGljIHN0cnVjdCBtYXgxNjY4X2RhdGEgKm1heDE2NjhfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJc3RydWN0IG1heDE2NjhfZGF0YSAqcmV0ID0gZGF0YTsKIAlzMzIgdmFsOwogCWludCBpOwpAQCAtMjA1LDggKzIwNiw4IEBACiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlsb25nIHRlbXA7CiAJaW50IHJldDsKIApAQCAtMjE2LDEwICsyMTcsMTEgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT50ZW1wX21heFtpbmRleF0gPSBjbGFtcF92YWwodGVtcC8xMDAwLCAtMTI4LCAxMjcpOwotCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJTUFYMTY2OF9SRUdfTElNSF9XUihpbmRleCksCi0JCQkJCWRhdGEtPnRlbXBfbWF4W2luZGV4XSkpCi0JCWNvdW50ID0gLUVJTzsKKwkJCQkJZGF0YS0+dGVtcF9tYXhbaW5kZXhdKTsKKwlpZiAocmV0IDwgMCkKKwkJY291bnQgPSByZXQ7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0yMzAsOCArMjMyLDggQEAKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCWxvbmcgdGVtcDsKIAlpbnQgcmV0OwogCkBAIC0yNDEsMTAgKzI0MywxMSBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXBfbWluW2luZGV4XSA9IGNsYW1wX3ZhbCh0ZW1wLzEwMDAsIC0xMjgsIDEyNyk7Ci0JaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAogCQkJCQlNQVgxNjY4X1JFR19MSU1MX1dSKGluZGV4KSwKLQkJCQkJZGF0YS0+dGVtcF9taW5baW5kZXhdKSkKLQkJY291bnQgPSAtRUlPOworCQkJCQlkYXRhLT50ZW1wX21pbltpbmRleF0pOworCWlmIChyZXQgPCAwKQorCQljb3VudCA9IHJldDsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKQEAgLTQwNSw2MCArNDA4LDI5IEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGE7Ci0JaW50IGVycjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkYXRhID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBtYXgxNjY4X2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1heDE2NjhfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CiAJZGF0YS0+dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfY29tbW9uKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLAotCQkJCQkgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyb3Jfc3lzcmVtMDsKLQl9Ci0KLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGVycm9yX3N5c3JlbTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX3N5c3JlbTE6CisJLyogc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5ncm91cHNbMF0gPSAmbWF4MTY2OF9ncm91cF9jb21tb247CiAJaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKLWVycm9yX3N5c3JlbTA6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF9jb21tb24pOwotCXJldHVybiBlcnI7Ci19CisJCWRhdGEtPmdyb3Vwc1sxXSA9ICZtYXgxNjY4X2dyb3VwX3VuaXF1ZTsKIAotc3RhdGljIGludCBtYXgxNjY4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0JaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfY29tbW9uKTsKLQotCXJldHVybiAwOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSAgIGRhdGEsIGRhdGEtPmdyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4MTY2OF9pZFtdID0gewpAQCAtNDc2LDcgKzQ0OCw2IEBACiAJCSAgLm5hbWUJPSAibWF4MTY2OCIsCiAJCSAgfSwKIAkucHJvYmUgPSBtYXgxNjY4X3Byb2JlLAotCS5yZW1vdmUJPSBtYXgxNjY4X3JlbW92ZSwKIAkuaWRfdGFibGUgPSBtYXgxNjY4X2lkLAogCS5kZXRlY3QJPSBtYXgxNjY4X2RldGVjdCwKIAkuYWRkcmVzc19saXN0ID0gbWF4MTY2OF9hZGRyX2xpc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDY2MzkuYyBiL2RyaXZlcnMvaHdtb24vbWF4NjYzOS5jCmluZGV4IDA2NmU1ODcuLjcwNjUwZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4NjYzOS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWF4NjYzOS5jCkBAIC04MCw3ICs4MCw3IEBACiAgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQogICovCiBzdHJ1Y3QgbWF4NjYzOV9kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCkBAIC0xMDQsOCArMTA0LDggQEAKIAogc3RhdGljIHN0cnVjdCBtYXg2NjM5X2RhdGEgKm1heDY2MzlfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJc3RydWN0IG1heDY2MzlfZGF0YSAqcmV0ID0gZGF0YTsKIAlpbnQgaTsKIAlpbnQgc3RhdHVzX3JlZzsKQEAgLTE5MSw5ICsxOTEsOCBAQAogc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT50ZW1wX3RoZXJtW2F0dHItPmluZGV4XSAqIDEwMDApKTsKIH0KQEAgLTIwMiw5ICsyMDEsOSBAQAogCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXM7CiAKQEAgLTIyNCw5ICsyMjMsOCBAQAogc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGRhdGEtPnRlbXBfYWxlcnRbYXR0ci0+aW5kZXhdICogMTAwMCkpOwogfQpAQCAtMjM1LDkgKzIzMyw5IEBACiAJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKIAkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmVzOwogCkBAIC0yNTgsOSArMjU2LDggQEAKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkJICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT50ZW1wX290W2F0dHItPmluZGV4XSAqIDEwMDApKTsKIH0KQEAgLTI2OSw5ICsyNjYsOSBAQAogCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAogCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmVzOwogCkBAIC0yOTEsOSArMjg4LDggQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnB3bVthdHRyLT5pbmRleF0gKiAyNTUgLyAxMjApOwogfQpAQCAtMzAyLDkgKzI5OCw5IEBACiAJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXM7CiAKQEAgLTM3OCw3ICszNzQsNyBAQAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9lbWVyZ2VuY3lfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDQpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXg2NjM5X2F0dHJpYnV0ZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXg2NjM5X2F0dHJzW10gPSB7CiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2ZhdWx0LmRldl9hdHRyLmF0dHIsCkBAIC00MDMsMTAgKzM5OSw3IEBACiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9lbWVyZ2VuY3lfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXg2NjM5X2dyb3VwID0gewotCS5hdHRycyA9IG1heDY2MzlfYXR0cmlidXRlcywKLX07CitBVFRSSUJVVEVfR1JPVVBTKG1heDY2MzkpOwogCiAvKgogICogIHJldHVybnMgcmVzcGVjdGl2ZSBpbmRleCBpbiBycG1fcmFuZ2VzIHRhYmxlCkBAIC00MjQsOSArNDE3LDkgQEAKIAlyZXR1cm4gMTsgLyogZGVmYXVsdDogNDAwMCBSUE0gKi8KIH0KIAotc3RhdGljIGludCBtYXg2NjM5X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG1heDY2MzlfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgICBzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3QgbWF4NjYzOV9wbGF0Zm9ybV9kYXRhICptYXg2NjM5X2luZm8gPQogCQlkZXZfZ2V0X3BsYXRkYXRhKCZjbGllbnQtPmRldik7CiAJaW50IGk7CkBAIC01NDUsNTAgKzUzOCwyNyBAQAogc3RhdGljIGludCBtYXg2NjM5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhOworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlpbnQgZXJyOwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbWF4NjYzOV9kYXRhKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXg2NjM5X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIG1heDY2MzkgY2hpcCAqLwotCWVyciA9IG1heDY2MzlfaW5pdF9jbGllbnQoY2xpZW50KTsKKwllcnIgPSBtYXg2NjM5X2luaXRfY2xpZW50KGNsaWVudCwgZGF0YSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2MzlfZ3JvdXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGVycm9yX3JlbW92ZTsKLQl9Ci0KLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJ0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIGZhbiBjb250cm9sIGZvdW5kXG4iKTsKLQotCXJldHVybiAwOwotCi1lcnJvcl9yZW1vdmU6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjYzOV9ncm91cCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtYXg2NjM5X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjYzOV9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLAorCQkJCQkJCSAgIG1heDY2MzlfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKQEAgLTYyMiw5ICs1OTIsNyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4NjYzOV9pZCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBtYXg2NjM5X3BtX29wcyA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhtYXg2NjM5X3N1c3BlbmQsIG1heDY2MzlfcmVzdW1lKQotfTsKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtYXg2NjM5X3BtX29wcywgbWF4NjYzOV9zdXNwZW5kLCBtYXg2NjM5X3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2NjM5X2RyaXZlciA9IHsKIAkuY2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04sCkBAIC02MzMsNyArNjAxLDYgQEAKIAkJICAgLnBtID0gJm1heDY2MzlfcG1fb3BzLAogCQkgICB9LAogCS5wcm9iZSA9IG1heDY2MzlfcHJvYmUsCi0JLnJlbW92ZSA9IG1heDY2MzlfcmVtb3ZlLAogCS5pZF90YWJsZSA9IG1heDY2MzlfaWQsCiAJLmRldGVjdCA9IG1heDY2MzlfZGV0ZWN0LAogCS5hZGRyZXNzX2xpc3QgPSBub3JtYWxfaTJjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg2NjUwLmMgYi9kcml2ZXJzL2h3bW9uL21heDY2NTAuYwppbmRleCAwY2FmYzM5Li4xNjJhNTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDY2NTAuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDY2NTAuYwpAQCAtMTA1LDM4ICsxMDUsMTMgQEAKIAogI2RlZmluZSBESVZfRlJPTV9SRUcocmVnKSAoMSA8PCAocmVnICYgNykpCiAKLXN0YXRpYyBpbnQgbWF4NjY1MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgaW50IG1heDY2NTBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci1zdGF0aWMgaW50IG1heDY2NTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotc3RhdGljIHN0cnVjdCBtYXg2NjUwX2RhdGEgKm1heDY2NTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCi0vKgotICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NjY1MF9pZFtdID0gewotCXsgIm1heDY2NTAiLCAxIH0sCi0JeyAibWF4NjY1MSIsIDQgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4NjY1MF9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2NjUwX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJtYXg2NjUwIiwKLQl9LAotCS5wcm9iZQkJPSBtYXg2NjUwX3Byb2JlLAotCS5yZW1vdmUJCT0gbWF4NjY1MF9yZW1vdmUsCi0JLmlkX3RhYmxlCT0gbWF4NjY1MF9pZCwKLX07Ci0KIC8qCiAgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQogICovCiAKIHN0cnVjdCBtYXg2NjUwX2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdyb3Vwc1szXTsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJaW50IG5yX2ZhbnM7CiAJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwpAQCAtMTUxLDYgKzEyNiw1MSBAQAogCXU4IGFsYXJtOwogfTsKIAorc3RhdGljIGNvbnN0IHU4IHRhY2hfcmVnW10gPSB7CisJTUFYNjY1MF9SRUdfVEFDSDAsCisJTUFYNjY1MF9SRUdfVEFDSDEsCisJTUFYNjY1MF9SRUdfVEFDSDIsCisJTUFYNjY1MF9SRUdfVEFDSDMsCit9OworCitzdGF0aWMgc3RydWN0IG1heDY2NTBfZGF0YSAqbWF4NjY1MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGF0YS0+c3BlZWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgICAgIE1BWDY2NTBfUkVHX1NQRUVEKTsKKwkJZGF0YS0+Y29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCQlNQVg2NjUwX1JFR19DT05GSUcpOworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnJfZmFuczsgaSsrKSB7CisJCQlkYXRhLT50YWNoW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCQkJIHRhY2hfcmVnW2ldKTsKKwkJfQorCQlkYXRhLT5jb3VudCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJTUFYNjY1MF9SRUdfQ09VTlQpOworCQlkYXRhLT5kYWMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMpOworCisJCS8qCisJCSAqIEFsYXJtcyBhcmUgY2xlYXJlZCBvbiByZWFkIGluIGNhc2UgdGhlIGNvbmRpdGlvbiB0aGF0CisJCSAqIGNhdXNlZCB0aGUgYWxhcm0gaXMgcmVtb3ZlZC4gS2VlcCB0aGUgdmFsdWUgbGF0Y2hlZCBoZXJlCisJCSAqIGZvciBwcm92aWRpbmcgdGhlIHJlZ2lzdGVyIHRocm91Z2ggZGlmZmVyZW50IGFsYXJtIGZpbGVzLgorCQkgKi8KKwkJZGF0YS0+YWxhcm0gfD0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCQlNQVg2NjUwX1JFR19BTEFSTSk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGdldF9mYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJICAgICAgIGNoYXIgKmJ1ZikKIHsKQEAgLTIzNSw4ICsyNTUsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCWludCBrc2NhbGUsIGt0YWNoOwogCXVuc2lnbmVkIGxvbmcgcnBtOwogCWludCBlcnI7CkBAIC0zMDQsOCArMzI0LDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgcHdtOwogCWludCBlcnI7CiAKQEAgLTM1MCw4ICszNzAsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQgbWF4NjY1MF9tb2Rlc1szXSA9IHswLCAzLCAyfTsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CiAJaW50IGVycjsKQEAgLTQwMCw4ICs0MjAsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyBkaXY7CiAJaW50IGVycjsKIApAQCAtNDQ2LDcgKzQ2Niw3IEBACiB7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwogCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBtYXg2NjUwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IGFsYXJtID0gMDsKIAogCWlmIChkYXRhLT5hbGFybSAmIGF0dHItPmluZGV4KSB7CkBAIC00ODQsNyArNTA0LDggQEAKIAkJCQkgICAgaW50IG4pCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdTggYWxhcm1fZW4gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19BTEFSTV9FTik7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHI7CiAKQEAgLTUxOSw3ICs1NDAsNyBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDY2NTBfYXR0cl9ncnAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXg2NjUwX2dyb3VwID0gewogCS5hdHRycyA9IG1heDY2NTBfYXR0cnMsCiAJLmlzX3Zpc2libGUgPSBtYXg2NjUwX2F0dHJzX3Zpc2libGUsCiB9OwpAQCAtNTMxLDcgKzU1Miw3IEBACiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4NjY1MV9hdHRyX2dycCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDY2NTFfZ3JvdXAgPSB7CiAJLmF0dHJzID0gbWF4NjY1MV9hdHRycywKIH07CiAKQEAgLTUzOSw3NCArNTYwLDE3IEBACiAgKiBSZWFsIGNvZGUKICAqLwogCi1zdGF0aWMgaW50IG1heDY2NTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IG1heDY2NTBfaW5pdF9jbGllbnQoc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSwKKwkJCSAgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGE7Ci0JaW50IGVycjsKLQotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IG1heDY2NTBfZGF0YSksCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAib3V0IG9mIG1lbW9yeS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKLQltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+bnJfZmFucyA9IGlkLT5kcml2ZXJfZGF0YTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgbWF4NjY1MCBjaGlwCi0JICovCi0JZXJyID0gbWF4NjY1MF9pbml0X2NsaWVudChjbGllbnQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXg2NjUwX2F0dHJfZ3JwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCS8qIDMgYWRkaXRpb25hbCBmYW4gaW5wdXRzIGZvciB0aGUgTUFYNjY1MSAqLwotCWlmIChkYXRhLT5ucl9mYW5zID09IDQpIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MV9hdHRyX2dycCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9yZW1vdmU7Ci0JfQotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7Ci0JaWYgKCFJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JZGV2X2VycigmY2xpZW50LT5kZXYsICJlcnJvciByZWdpc3RlcmluZyBod21vbiBkZXZpY2UuXG4iKTsKLQlpZiAoZGF0YS0+bnJfZmFucyA9PSA0KQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXg2NjUxX2F0dHJfZ3JwKTsKLWVycl9yZW1vdmU6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MF9hdHRyX2dycCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtYXg2NjUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0JaWYgKGRhdGEtPm5yX2ZhbnMgPT0gNCkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MV9hdHRyX2dycCk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MF9hdHRyX2dycCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjY1MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJaW50IGNvbmZpZzsKIAlpbnQgZXJyID0gLUVJTzsKIAogCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRyk7CiAKIAlpZiAoY29uZmlnIDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgY29uZmlnLCBhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKGRldiwgIkVycm9yIHJlYWRpbmcgY29uZmlnLCBhYm9ydGluZy5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjIwLDExICs1ODQsMTEgQEAKIAkJY29uZmlnIHw9IE1BWDY2NTBfQ0ZHX1YxMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBmYW5fdm9sdGFnZSAoJWQpXG4iLAorCQlkZXZfZXJyKGRldiwgImlsbGVnYWwgdmFsdWUgZm9yIGZhbl92b2x0YWdlICglZClcbiIsCiAJCQlmYW5fdm9sdGFnZSk7CiAJfQogCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRmFuIHZvbHRhZ2UgaXMgc2V0IHRvICVkVi5cbiIsCisJZGV2X2luZm8oZGV2LCAiRmFuIHZvbHRhZ2UgaXMgc2V0IHRvICVkVi5cbiIsCiAJCSAoY29uZmlnICYgTUFYNjY1MF9DRkdfVjEyKSA/IDEyIDogNSk7CiAKIAlzd2l0Y2ggKHByZXNjYWxlcikgewpAQCAtNjUwLDExICs2MTQsMTAgQEAKIAkJCSB8IE1BWDY2NTBfQ0ZHX1BSRVNDQUxFUl8xNjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBwcmVzY2FsZXIgKCVkKVxuIiwKLQkJCXByZXNjYWxlcik7CisJCWRldl9lcnIoZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgcHJlc2NhbGVyICglZClcbiIsIHByZXNjYWxlcik7CiAJfQogCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUHJlc2NhbGVyIGlzIHNldCB0byAlZC5cbiIsCisJZGV2X2luZm8oZGV2LCAiUHJlc2NhbGVyIGlzIHNldCB0byAlZC5cbiIsCiAJCSAxIDw8IChjb25maWcgJiBNQVg2NjUwX0NGR19QUkVTQ0FMRVJfTUFTSykpOwogCiAJLyoKQEAgLTY2NCwxNyArNjI3LDE3IEBACiAJICovCiAKIAlpZiAoKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX01PREVfTUFTSykgPT0gTUFYNjY1MF9DRkdfTU9ERV9PRkYpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJDaGFuZ2UgbW9kZSB0byBvcGVuIGxvb3AsIGZ1bGwgb2ZmLlxuIik7CisJCWRldl9kYmcoZGV2LCAiQ2hhbmdlIG1vZGUgdG8gb3BlbiBsb29wLCBmdWxsIG9mZi5cbiIpOwogCQljb25maWcgPSAoY29uZmlnICYgfk1BWDY2NTBfQ0ZHX01PREVfTUFTSykKIAkJCSB8IE1BWDY2NTBfQ0ZHX01PREVfT1BFTl9MT09QOwogCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0RBQywgMjU1KSkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJEQUMgd3JpdGUgZXJyb3IsIGFib3J0aW5nLlxuIik7CisJCQlkZXZfZXJyKGRldiwgIkRBQyB3cml0ZSBlcnJvciwgYWJvcnRpbmcuXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CiAKIAlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRywgY29uZmlnKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNvbmZpZyB3cml0ZSBlcnJvciwgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJDb25maWcgd3JpdGUgZXJyb3IsIGFib3J0aW5nLlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02ODQsNTEgKzY0Nyw1NSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgdTggdGFjaF9yZWdbXSA9IHsKLQlNQVg2NjUwX1JFR19UQUNIMCwKLQlNQVg2NjUwX1JFR19UQUNIMSwKLQlNQVg2NjUwX1JFR19UQUNIMiwKLQlNQVg2NjUwX1JFR19UQUNIMywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4NjY1MF9kYXRhICptYXg2NjUwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBtYXg2NjUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCWludCBpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhOworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlpbnQgZXJyOwogCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1heDY2NTBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCWRhdGEtPnNwZWVkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSAgICAgICBNQVg2NjUwX1JFR19TUEVFRCk7Ci0JCWRhdGEtPmNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkJTUFYNjY1MF9SRUdfQ09ORklHKTsKLQkJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX2ZhbnM7IGkrKykgewotCQkJZGF0YS0+dGFjaFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkJCSB0YWNoX3JlZ1tpXSk7Ci0JCX0KLQkJZGF0YS0+Y291bnQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJCU1BWDY2NTBfUkVHX0NPVU5UKTsKLQkJZGF0YS0+ZGFjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDKTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPm5yX2ZhbnMgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKLQkJLyoKLQkJICogQWxhcm1zIGFyZSBjbGVhcmVkIG9uIHJlYWQgaW4gY2FzZSB0aGUgY29uZGl0aW9uIHRoYXQKLQkJICogY2F1c2VkIHRoZSBhbGFybSBpcyByZW1vdmVkLiBLZWVwIHRoZSB2YWx1ZSBsYXRjaGVkIGhlcmUKLQkJICogZm9yIHByb3ZpZGluZyB0aGUgcmVnaXN0ZXIgdGhyb3VnaCBkaWZmZXJlbnQgYWxhcm0gZmlsZXMuCi0JCSAqLwotCQlkYXRhLT5hbGFybSB8PSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJCU1BWDY2NTBfUkVHX0FMQVJNKTsKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIG1heDY2NTAgY2hpcAorCSAqLworCWVyciA9IG1heDY2NTBfaW5pdF9jbGllbnQoZGF0YSwgY2xpZW50KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7Ci0JCWRhdGEtPnZhbGlkID0gMTsKLQl9CisJZGF0YS0+Z3JvdXBzWzBdID0gJm1heDY2NTBfZ3JvdXA7CisJLyogMyBhZGRpdGlvbmFsIGZhbiBpbnB1dHMgZm9yIHRoZSBNQVg2NjUxICovCisJaWYgKGRhdGEtPm5yX2ZhbnMgPT0gNCkKKwkJZGF0YS0+Z3JvdXBzWzFdID0gJm1heDY2NTFfZ3JvdXA7CiAKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBkYXRhOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwKKwkJCQkJCQkgICBjbGllbnQtPm5hbWUsIGRhdGEsCisJCQkJCQkJICAgZGF0YS0+Z3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXg2NjUwX2lkW10gPSB7CisJeyAibWF4NjY1MCIsIDEgfSwKKwl7ICJtYXg2NjUxIiwgNCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg2NjUwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDY2NTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIm1heDY2NTAiLAorCX0sCisJLnByb2JlCQk9IG1heDY2NTBfcHJvYmUsCisJLmlkX3RhYmxlCT0gbWF4NjY1MF9pZCwKK307CisKIG1vZHVsZV9pMmNfZHJpdmVyKG1heDY2NTBfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiSGFucyBKLiBLb2NoIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbHRjMjk3OC5jCmluZGV4IGRlM2MxNTIuLmUyNGVkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMvbHRjMjk3OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbHRjMjk3OC5jCkBAIC0xLDkgKzEsOSBAQAogLyoKICAqIEhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVyIGZvciBMVEMyOTc0LCBMVEMyOTc3LCBMVEMyOTc4LCBMVEMzODgwLAotICogYW5kIExUQzM4ODMKKyAqIExUQzM4ODMsIGFuZCBMVE00Njc2CiAgKgogICogQ29weXJpZ2h0IChjKSAyMDExIEVyaWNzc29uIEFCLgotICogQ29weXJpZ2h0IChjKSAyMDEzIEd1ZW50ZXIgUm9lY2sKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCBHdWVudGVyIFJvZWNrCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNCwxMCArMTQsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI4LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlICJwbWJ1cy5oIgogCi1lbnVtIGNoaXBzIHsgbHRjMjk3NCwgbHRjMjk3NywgbHRjMjk3OCwgbHRjMzg4MCwgbHRjMzg4MyB9OworZW51bSBjaGlwcyB7IGx0YzI5NzQsIGx0YzI5NzcsIGx0YzI5NzgsIGx0YzM4ODAsIGx0YzM4ODMsIGx0bTQ2NzYgfTsKIAogLyogQ29tbW9uIGZvciBhbGwgY2hpcHMgKi8KICNkZWZpbmUgTFRDMjk3OF9NRlJfVk9VVF9QRUFLCQkweGRkCkBAIC00NSw3ICs0MSw3IEBACiAjZGVmaW5lIExUQzI5NzRfTUZSX0lPVVRfUEVBSwkJMHhkNwogI2RlZmluZSBMVEMyOTc0X01GUl9JT1VUX01JTgkJMHhkOAogCi0vKiBMVEMzODgwIGFuZCBMVEMzODgzICovCisvKiBMVEMzODgwLCBMVEMzODgzLCBhbmQgTFRNNDY3NiAqLwogI2RlZmluZSBMVEMzODgwX01GUl9JT1VUX1BFQUsJCTB4ZDcKICNkZWZpbmUgTFRDMzg4MF9NRlJfQ0xFQVJfUEVBS1MJCTB4ZTMKICNkZWZpbmUgTFRDMzg4MF9NRlJfVEVNUEVSQVRVUkUyX1BFQUsJMHhmNApAQCAtNTMsNyArNDksOCBAQAogLyogTFRDMzg4MyBvbmx5ICovCiAjZGVmaW5lIExUQzM4ODNfTUZSX0lJTl9QRUFLCQkweGUxCiAKLSNkZWZpbmUgTFRDMjk3NF9JRAkJCTB4MDIxMgorI2RlZmluZSBMVEMyOTc0X0lEX1JFVjEJCQkweDAyMTIKKyNkZWZpbmUgTFRDMjk3NF9JRF9SRVYyCQkJMHgwMjEzCiAjZGVmaW5lIExUQzI5NzdfSUQJCQkweDAxMzAKICNkZWZpbmUgTFRDMjk3OF9JRF9SRVYxCQkJMHgwMTIxCiAjZGVmaW5lIExUQzI5NzhfSURfUkVWMgkJCTB4MDEyMgpAQCAtNjIsNiArNTksOCBAQAogI2RlZmluZSBMVEMzODgwX0lEX01BU0sJCQkweGZmMDAKICNkZWZpbmUgTFRDMzg4M19JRAkJCTB4NDMwMAogI2RlZmluZSBMVEMzODgzX0lEX01BU0sJCQkweGZmMDAKKyNkZWZpbmUgTFRNNDY3Nl9JRAkJCTB4NDQ4MAkvKiBkYXRhc2hlZXQgY2xhaW1zIDB4NDQwWCAqLworI2RlZmluZSBMVE00Njc2X0lEX01BU0sJCQkweGZmZjAKIAogI2RlZmluZSBMVEMyOTc0X05VTV9QQUdFUwkJNAogI2RlZmluZSBMVEMyOTc4X05VTV9QQUdFUwkJOApAQCAtMzcwLDYgKzM2OSw3IEBACiAJeyJsdGMyOTc4IiwgbHRjMjk3OH0sCiAJeyJsdGMzODgwIiwgbHRjMzg4MH0sCiAJeyJsdGMzODgzIiwgbHRjMzg4M30sCisJeyJsdG00Njc2IiwgbHRtNDY3Nn0sCiAJe30KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjMjk3OF9pZCk7CkBAIC0zOTQsNyArMzk0LDcgQEAKIAlpZiAoY2hpcF9pZCA8IDApCiAJCXJldHVybiBjaGlwX2lkOwogCi0JaWYgKGNoaXBfaWQgPT0gTFRDMjk3NF9JRCkgeworCWlmIChjaGlwX2lkID09IExUQzI5NzRfSURfUkVWMSB8fCBjaGlwX2lkID09IExUQzI5NzRfSURfUkVWMikgewogCQlkYXRhLT5pZCA9IGx0YzI5NzQ7CiAJfSBlbHNlIGlmIChjaGlwX2lkID09IExUQzI5NzdfSUQpIHsKIAkJZGF0YS0+aWQgPSBsdGMyOTc3OwpAQCAtNDA1LDYgKzQwNSw4IEBACiAJCWRhdGEtPmlkID0gbHRjMzg4MDsKIAl9IGVsc2UgaWYgKChjaGlwX2lkICYgTFRDMzg4M19JRF9NQVNLKSA9PSBMVEMzODgzX0lEKSB7CiAJCWRhdGEtPmlkID0gbHRjMzg4MzsKKwl9IGVsc2UgaWYgKChjaGlwX2lkICYgTFRNNDY3Nl9JRF9NQVNLKSA9PSBMVE00Njc2X0lEKSB7CisJCWRhdGEtPmlkID0gbHRtNDY3NjsKIAl9IGVsc2UgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuc3VwcG9ydGVkIGNoaXAgSUQgMHgleFxuIiwgY2hpcF9pZCk7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDU4LDYgKzQ2MCw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBsdGMzODgwOgorCWNhc2UgbHRtNDY3NjoKIAkJaW5mby0+cmVhZF93b3JkX2RhdGEgPSBsdGMzODgwX3JlYWRfd29yZF9kYXRhOwogCQlpbmZvLT5wYWdlcyA9IExUQzM4ODBfTlVNX1BBR0VTOwogCQlpbmZvLT5mdW5jWzBdID0gUE1CVVNfSEFWRV9WSU4gfCBQTUJVU19IQVZFX0lJTgpAQCAtNTAwLDUgKzUwMyw1IEBACiBtb2R1bGVfaTJjX2RyaXZlcihsdGMyOTc4X2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2siKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUE1CdXMgZHJpdmVyIGZvciBMVEMyOTc0LCBMVEMyOTc4LCBMVEMzODgwLCBhbmQgTFRDMzg4MyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQTUJ1cyBkcml2ZXIgZm9yIExUQzI5NzQsIExUQzI5NzgsIExUQzM4ODAsIExUQzM4ODMsIGFuZCBMVE00Njc2Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jIGIvZHJpdmVycy9od21vbi9zbW02NjUuYwppbmRleCBkOWUxYjdkLi40ZWY1ODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21tNjY1LmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCXJ2ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgMCk7CiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWFkIEFEQyB2YWx1ZTogZXJyb3IgJWQiLCBydik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIHJ2OwogCX0KIAkvKgogCSAqIFZhbGlkYXRlL3ZlcmlmeSByZWFkYmFjayBhZGMgY2hhbm5lbCAoaW4gYml0IDExLi4xNCkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYwppbmRleCBiZTdmMGEyLi5mM2I4OWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKQEAgLTM5LDcgKzM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KICNpbmNsdWRlIDxhc20vY3BtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jCmluZGV4IGJmZWMzMTMuLmE3ZTY4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jCkBAIC00NTEsOSArNDUxLDkgQEAKIAkudHlwZSA9IElJT19BQ0NFTCwJCQkJCQlcCiAJLm1vZGlmaWVkID0gMSwJCQkJCQkJXAogCS5jaGFubmVsMiA9IElJT19NT0RfIyNfYXhpcywJCQkJCVwKLQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8CQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwJCVwKIAkJQklUKElJT19DSEFOX0lORk9fTE9XX1BBU1NfRklMVEVSXzNEQl9GUkVRVUVOQ1kpLAlcCi0JLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJCVwKIAkuc2Nhbl9pbmRleCA9IEFYSVNfIyNfYXhpcywJCQkJCVwKIAkuc2Nhbl90eXBlID0gewkJCQkJCQlcCiAJCS5zaWduID0gJ3MnLAkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9paW8vYWRjL0tjb25maWcKaW5kZXggMjIwOWYyOC4uNGJmNGMxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vYWRjL0tjb25maWcKQEAgLTE1NSw2ICsxNTUsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgbWNwMzQyMi4KIAorY29uZmlnIE1FTl9aMTg4X0FEQworCXRyaXN0YXRlICJNRU4gMTZ6MTg4IEFEQyBJUCBDb3JlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0IKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBNRU4gMTZ6MTg4IEFEQyBJUC1Db3JlIG9uIGEgTUNCCisJICBjYXJyaWVyLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIG1lbl96MTg4X2FkYy4KKwogY29uZmlnIE5BVTc4MDIKIAl0cmlzdGF0ZSAiTnV2b3RvbiBOQVU3ODAyIEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTE5Nyw2ICsyMDcsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgdHdsNjAzMC1ncGFkYy4KIAorY29uZmlnIFZGNjEwX0FEQworCXRyaXN0YXRlICJGcmVlc2NhbGUgdmY2MTAgQURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIE9GCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgZm9yIFZ5YnJpZCBib2FyZCBhbmFsb2ctdG8tZGlnaXRhbCBjb252ZXJ0ZXIuCisJICBTaW5jZSB0aGUgSVAgaXMgdXNlZCBmb3IgaS5NWDZTTFgsIHRoZSBkcml2ZXIgYWxzbyBzdXBwb3J0IGkuTVg2U0xYLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHZmNjEwX2FkYy4KKwogY29uZmlnIFZJUEVSQk9BUkRfQURDCiAJdHJpc3RhdGUgIlZpcGVyYm9hcmQgQURDIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNRkRfVklQRVJCT0FSRCAmJiBVU0IKQEAgLTIwNCw0ICsyMjQsMTcgQEAKIAkgIFNheSB5ZXMgaGVyZSB0byBhY2Nlc3MgdGhlIEFEQyBwYXJ0IG9mIHRoZSBOYW5vIFJpdmVyCiAJICBUZWNobm9sb2dpZXMgVmlwZXJib2FyZC4KIAorY29uZmlnIFhJTElOWF9YQURDCisJdHJpc3RhdGUgIlhpbGlueCBYQURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfWllOUSB8fCBNSUNST0JMQVpFIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgWGlsaW54IFhBREMuIFRoZSBkcml2ZXIgZG9lcyBzdXBwb3J0CisJICBib3RoIHRoZSBaWU5RIGludGVyZmFjZSB0byB0aGUgWEFEQyBhcyB3ZWxsIGFzIHRoZSBBWEktWEFEQyBpbnRlcmZhY2UuCisKKwkgIFRoZSBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICB4aWxpbngteGFkYy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCmluZGV4IGJhOWExMGEuLmJiMjUyNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKQEAgLTE3LDggKzE3LDEyIEBACiBvYmotJChDT05GSUdfTUFYMTM2MykgKz0gbWF4MTM2My5vCiBvYmotJChDT05GSUdfTUNQMzIwWCkgKz0gbWNwMzIweC5vCiBvYmotJChDT05GSUdfTUNQMzQyMikgKz0gbWNwMzQyMi5vCitvYmotJChDT05GSUdfTUVOX1oxODhfQURDKSArPSBtZW5fejE4OF9hZGMubwogb2JqLSQoQ09ORklHX05BVTc4MDIpICs9IG5hdTc4MDIubwogb2JqLSQoQ09ORklHX1RJX0FEQzA4MUMpICs9IHRpLWFkYzA4MWMubwogb2JqLSQoQ09ORklHX1RJX0FNMzM1WF9BREMpICs9IHRpX2FtMzM1eF9hZGMubwogb2JqLSQoQ09ORklHX1RXTDYwMzBfR1BBREMpICs9IHR3bDYwMzAtZ3BhZGMubworb2JqLSQoQ09ORklHX1ZGNjEwX0FEQykgKz0gdmY2MTBfYWRjLm8KIG9iai0kKENPTkZJR19WSVBFUkJPQVJEX0FEQykgKz0gdmlwZXJib2FyZF9hZGMubworeGlsaW54LXhhZGMteSA6PSB4aWxpbngteGFkYy1jb3JlLm8geGlsaW54LXhhZGMtZXZlbnRzLm8KK29iai0kKENPTkZJR19YSUxJTlhfWEFEQykgKz0geGlsaW54LXhhZGMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL21heDEzNjMuYyBiL2RyaXZlcnMvaWlvL2FkYy9tYXgxMzYzLmMKaW5kZXggMzYwMjU5Mi4uOWNmMzIyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL21heDEzNjMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvbWF4MTM2My5jCkBAIC04LDE3ICs4LDExIEBACiAgICogYmFzZWQgb24gbGludXgvZHJpdmVycy9hY3Jvbi9jaGFyL3BjZjg1ODMuYwogICAqIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcKICAgKgorICAqIERyaXZlciBmb3IgbWF4MTM2MyBhbmQgc2ltaWxhciBjaGlwcy4KKyAgKgogICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgKgotICAqIG1heDEzNjMuYwotICAqCi0gICogUGFydGlhbCBzdXBwb3J0IGZvciBtYXgxMzYzIGFuZCBzaW1pbGFyIGNoaXBzLgotICAqCi0gICogTm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KLSAgKgotICAqIC0gQ29udHJvbCBvZiBpbnRlcm5hbCByZWZlcmVuY2UuCiAgICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTEyNTMsNyArMTI0Nyw3IEBACiAJfSwKIAlbbWF4MTE2MDRdID0gewogCQkuYml0cyA9IDgsCi0JCS5pbnRfdnJlZl9tdiA9IDQwOTgsCisJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCiAJCS5tb2RlX2xpc3QgPSBtYXgxMjM4X21vZGVfbGlzdCwKIAkJLm51bV9tb2RlcyA9IEFSUkFZX1NJWkUobWF4MTIzOF9tb2RlX2xpc3QpLAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLApAQCAtMTMxMyw3ICsxMzA3LDcgQEAKIAl9LAogCVttYXgxMTYxMF0gPSB7CiAJCS5iaXRzID0gMTAsCi0JCS5pbnRfdnJlZl9tdiA9IDQwOTgsCisJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCiAJCS5tb2RlX2xpc3QgPSBtYXgxMjM4X21vZGVfbGlzdCwKIAkJLm51bV9tb2RlcyA9IEFSUkFZX1NJWkUobWF4MTIzOF9tb2RlX2xpc3QpLAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLApAQCAtMTM3Myw3ICsxMzY3LDcgQEAKIAl9LAogCVttYXgxMTYxNl0gPSB7CiAJCS5iaXRzID0gMTIsCi0JCS5pbnRfdnJlZl9tdiA9IDQwOTgsCisJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCiAJCS5tb2RlX2xpc3QgPSBtYXgxMjM4X21vZGVfbGlzdCwKIAkJLm51bV9tb2RlcyA9IEFSUkFZX1NJWkUobWF4MTIzOF9tb2RlX2xpc3QpLAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODljMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMvbWVuX3oxODhfYWRjLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBNRU4gMTZ6MTg4IEFuYWxvZyB0byBEaWdpYWwgQ29udmVydGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IE1FTiBNaWtyb2VsZWt0cm9uaWsgR21iSCAod3d3Lm1lbi5kZSkKKyAqIEF1dGhvcjogSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKworI2RlZmluZSBaMTg4X0FEQ19NQVhfQ0hBTgk4CisjZGVmaW5lIFoxODhfQURDX0dBSU4JCTB4MDcwMDAwMAorI2RlZmluZSBaMTg4X01PREVfVk9MVEFHRQlCSVQoMjcpCisjZGVmaW5lIFoxODhfQ0ZHX0FVVE8JCTB4MQorI2RlZmluZSBaMTg4X0NUUkxfUkVHCQkweDQwCisKKyNkZWZpbmUgQURDX0RBVEEoeCkgKCgoeCkgPj4gMikgJiAweDdmZmZmYykKKyNkZWZpbmUgQURDX09WUih4KSAoKHgpICYgMHgxKQorCitzdHJ1Y3QgejE4OF9hZGMgeworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKyNkZWZpbmUgWjE4OF9BRENfQ0hBTk5FTChpZHgpIHsJCQkJCVwKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJXAorCQkuaW5kZXhlZCA9IDEsCQkJCQlcCisJCS5jaGFubmVsID0gKGlkeCksCQkJCVwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksICAgXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgejE4OF9hZGNfaWlvX2NoYW5uZWxzW10gPSB7CisJWjE4OF9BRENfQ0hBTk5FTCgwKSwKKwlaMTg4X0FEQ19DSEFOTkVMKDEpLAorCVoxODhfQURDX0NIQU5ORUwoMiksCisJWjE4OF9BRENfQ0hBTk5FTCgzKSwKKwlaMTg4X0FEQ19DSEFOTkVMKDQpLAorCVoxODhfQURDX0NIQU5ORUwoNSksCisJWjE4OF9BRENfQ0hBTk5FTCg2KSwKKwlaMTg4X0FEQ19DSEFOTkVMKDcpLAorfTsKKworc3RhdGljIGludCB6MTg4X2lpb19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaWlvX2RldiwKKwkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJaW50ICp2YWwsCisJCQlpbnQgKnZhbDIsCisJCQlsb25nIGluZm8pCit7CisJc3RydWN0IHoxODhfYWRjICphZGMgPSBpaW9fcHJpdihpaW9fZGV2KTsKKwlpbnQgcmV0OworCXUxNiB0bXA7CisKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQl0bXAgPSByZWFkdyhhZGMtPmJhc2UgKyBjaGFuLT5jaGFubmVsICogNCk7CisKKwkJaWYgKEFEQ19PVlIodG1wKSkgeworCQkJZGV2X2luZm8oJmlpb19kZXYtPmRldiwKKwkJCQkiT3ZlcnNhbXBsaW5nIGVycm9yIG9uIEFEQyBjaGFubmVsICVkXG4iLAorCQkJCWNoYW4tPmNoYW5uZWwpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJKnZhbCA9IEFEQ19EQVRBKHRtcCk7CisJCXJldCA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGlpb19pbmZvIHoxODhfYWRjX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJnoxODhfaWlvX3JlYWRfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdm9pZCBtZW5fejE4OF9jb25maWdfY2hhbm5lbHModm9pZCBfX2lvbWVtICphZGRyKQoreworCWludCBpOworCXUzMiBjZmc7CisJdTMyIGN0bDsKKworCWN0bCA9IHJlYWRsKGFkZHIgKyBaMTg4X0NUUkxfUkVHKTsKKwljdGwgfD0gWjE4OF9DRkdfQVVUTzsKKwl3cml0ZWwoY3RsLCBhZGRyICsgWjE4OF9DVFJMX1JFRyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWjE4OF9BRENfTUFYX0NIQU47IGkrKykgeworCQljZmcgPSByZWFkbChhZGRyICsgaSk7CisJCWNmZyAmPSB+WjE4OF9BRENfR0FJTjsKKwkJY2ZnIHw9IFoxODhfTU9ERV9WT0xUQUdFOworCQl3cml0ZWwoY2ZnLCBhZGRyICsgaSk7CisJfQorfQorCitzdGF0aWMgaW50IG1lbl96MTg4X3Byb2JlKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYsCisJCQljb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHoxODhfYWRjICphZGM7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgejE4OF9hZGMpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWluZGlvX2Rldi0+bmFtZSA9ICJ6MTg4LWFkYyI7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmRldi0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZ6MTg4X2FkY19pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gejE4OF9hZGNfaWlvX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRSh6MTg4X2FkY19paW9fY2hhbm5lbHMpOworCisJbWVtID0gbWNiX3JlcXVlc3RfbWVtKGRldiwgInoxODgtYWRjIik7CisJaWYgKCFtZW0pCisJCXJldHVybiAtRU5PTUVNOworCisJYWRjLT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmIChhZGMtPmJhc2UgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwltZW5fejE4OF9jb25maWdfY2hhbm5lbHMoYWRjLT5iYXNlKTsKKworCWFkYy0+bWVtID0gbWVtOworCW1jYl9zZXRfZHJ2ZGF0YShkZXYsIGluZGlvX2Rldik7CisKKwlyZXR1cm4gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCitlcnI6CisJbWNiX3JlbGVhc2VfbWVtKG1lbSk7CisJcmV0dXJuIC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgbWVuX3oxODhfcmVtb3ZlKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiAgPSBtY2JfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgejE4OF9hZGMgKmFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpb3VubWFwKGFkYy0+YmFzZSk7CisJbWNiX3JlbGVhc2VfbWVtKGFkYy0+bWVtKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtY2JfZGV2aWNlX2lkIG1lbl96MTg4X2lkc1tdID0geworCXsgLmRldmljZSA9IDB4YmMgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG1jYiwgbWVuX3oxODhfaWRzKTsKKworc3RhdGljIHN0cnVjdCBtY2JfZHJpdmVyIG1lbl96MTg4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ6MTg4LWFkYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gbWVuX3oxODhfcHJvYmUsCisJLnJlbW92ZSA9IG1lbl96MTg4X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBtZW5fejE4OF9pZHMsCit9OworbW9kdWxlX21jYl9kcml2ZXIobWVuX3oxODhfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJSU8gQURDIGRyaXZlciBmb3IgTUVOIDE2ejE4OCBBREMgQ29yZSIpOworTU9EVUxFX0FMSUFTKCJtY2I6MTZ6MTg4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYwppbmRleCAzMWU3ODZlLi5hNGRiMzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKQEAgLTEzLDcgKzEzLDYgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy90d2w2MDMwLWdwYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvdHdsNjAzMC1ncGFkYy5jCmluZGV4IDUzYTI0ZWIuLjE1MjgyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy90d2w2MDMwLWdwYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3R3bDYwMzAtZ3BhZGMuYwpAQCAtMjgsNyArMjgsNiBAQAogICogMDIxMTAtMTMwMSBVU0EKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3OTllYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMKQEAgLTAsMCArMSw3MTEgQEAKKy8qCisgKiBGcmVlc2NhbGUgVnlicmlkIHZmNjEwIEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vZHJpdmVyLmg+CisKKy8qIFRoaXMgd2lsbCBiZSB0aGUgZHJpdmVyIG5hbWUgdGhlIGtlcm5lbCByZXBvcnRzICovCisjZGVmaW5lIERSSVZFUl9OQU1FICJ2ZjYxMC1hZGMiCisKKy8qIFZ5YnJpZC9JTVggQURDIHJlZ2lzdGVycyAqLworI2RlZmluZSBWRjYxMF9SRUdfQURDX0hDMAkJMHgwMAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0hDMQkJMHgwNAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0hTCQkweDA4CisjZGVmaW5lIFZGNjEwX1JFR19BRENfUjAJCTB4MGMKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19SMQkJMHgxMAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0NGRwkJMHgxNAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0dDCQkweDE4CisjZGVmaW5lIFZGNjEwX1JFR19BRENfR1MJCTB4MWMKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19DVgkJMHgyMAorI2RlZmluZSBWRjYxMF9SRUdfQURDX09GUwkJMHgyNAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0NBTAkJMHgyOAorI2RlZmluZSBWRjYxMF9SRUdfQURDX1BDVEwJCTB4MzAKKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciBmaWVsZCBkZWZpbmUgKi8KKyNkZWZpbmUgVkY2MTBfQURDX01PREVfQklUOAkJMHgwMAorI2RlZmluZSBWRjYxMF9BRENfTU9ERV9CSVQxMAkJMHgwNAorI2RlZmluZSBWRjYxMF9BRENfTU9ERV9CSVQxMgkJMHgwOAorI2RlZmluZSBWRjYxMF9BRENfTU9ERV9NQVNLCQkweDBjCisjZGVmaW5lIFZGNjEwX0FEQ19CVVNDTEsyX1NFTAkJMHgwMQorI2RlZmluZSBWRjYxMF9BRENfQUxUQ0xLX1NFTAkJMHgwMgorI2RlZmluZSBWRjYxMF9BRENfQURBQ0tfU0VMCQkweDAzCisjZGVmaW5lIFZGNjEwX0FEQ19BRENDTEtfTUFTSwkJMHgwMworI2RlZmluZSBWRjYxMF9BRENfQ0xLX0RJVjIJCTB4MjAKKyNkZWZpbmUgVkY2MTBfQURDX0NMS19ESVY0CQkweDQwCisjZGVmaW5lIFZGNjEwX0FEQ19DTEtfRElWOAkJMHg2MAorI2RlZmluZSBWRjYxMF9BRENfQ0xLX01BU0sJCTB4NjAKKyNkZWZpbmUgVkY2MTBfQURDX0FETFNNUF9MT05HCQkweDEwCisjZGVmaW5lIFZGNjEwX0FEQ19BRFNUU19NQVNLCQkweDMwMAorI2RlZmluZSBWRjYxMF9BRENfQURMUENfRU4JCTB4ODAKKyNkZWZpbmUgVkY2MTBfQURDX0FESFNDX0VOCQkweDQwMAorI2RlZmluZSBWRjYxMF9BRENfUkVGU0VMX1ZBTFQJCTB4MTAwCisjZGVmaW5lIFZGNjEwX0FEQ19SRUZTRUxfVkJHCQkweDEwMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FEVFJHX0hBUkQJCTB4MjAwMAorI2RlZmluZSBWRjYxMF9BRENfQVZHU184CQkweDQwMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FWR1NfMTYJCTB4ODAwMAorI2RlZmluZSBWRjYxMF9BRENfQVZHU18zMgkJMHhDMDAwCisjZGVmaW5lIFZGNjEwX0FEQ19BVkdTX01BU0sJCTB4QzAwMAorI2RlZmluZSBWRjYxMF9BRENfT1ZXUkVOCQkweDEwMDAwCisKKy8qIEdlbmVyYWwgY29udHJvbCByZWdpc3RlciBmaWVsZCBkZWZpbmUgKi8KKyNkZWZpbmUgVkY2MTBfQURDX0FEQUNLRU4JCTB4MQorI2RlZmluZSBWRjYxMF9BRENfRE1BRU4JCQkweDIKKyNkZWZpbmUgVkY2MTBfQURDX0FDUkVOCQkJMHg0CisjZGVmaW5lIFZGNjEwX0FEQ19BQ0ZHVAkJCTB4OAorI2RlZmluZSBWRjYxMF9BRENfQUNGRQkJCTB4MTAKKyNkZWZpbmUgVkY2MTBfQURDX0FWR0VOCQkJMHgyMAorI2RlZmluZSBWRjYxMF9BRENfQURDT04JCQkweDQwCisjZGVmaW5lIFZGNjEwX0FEQ19DQUwJCQkweDgwCisKKy8qIE90aGVyIGZpZWxkIGRlZmluZSAqLworI2RlZmluZSBWRjYxMF9BRENfQURDSEMoeCkJCSgoeCkgJiAweEYpCisjZGVmaW5lIFZGNjEwX0FEQ19BSUVOCQkJKDB4MSA8PCA3KQorI2RlZmluZSBWRjYxMF9BRENfQ09OVl9ESVNBQkxFCQkweDFGCisjZGVmaW5lIFZGNjEwX0FEQ19IU19DT0NPMAkJMHgxCisjZGVmaW5lIFZGNjEwX0FEQ19DQUxGCQkJMHgyCisjZGVmaW5lIFZGNjEwX0FEQ19USU1FT1VUCQltc2Vjc190b19qaWZmaWVzKDEwMCkKKworZW51bSBjbGtfc2VsIHsKKwlWRjYxMF9BRENJT0NfQlVTQ0xLX1NFVCwKKwlWRjYxMF9BRENJT0NfQUxUQ0xLX1NFVCwKKwlWRjYxMF9BRENJT0NfQURBQ0tfU0VULAorfTsKKworZW51bSB2b2xfcmVmIHsKKwlWRjYxMF9BRENJT0NfVlJfVlJFRl9TRVQsCisJVkY2MTBfQURDSU9DX1ZSX1ZBTFRfU0VULAorCVZGNjEwX0FEQ0lPQ19WUl9WQkdfU0VULAorfTsKKworZW51bSBhdmVyYWdlX3NlbCB7CisJVkY2MTBfQURDX1NBTVBMRV8xLAorCVZGNjEwX0FEQ19TQU1QTEVfNCwKKwlWRjYxMF9BRENfU0FNUExFXzgsCisJVkY2MTBfQURDX1NBTVBMRV8xNiwKKwlWRjYxMF9BRENfU0FNUExFXzMyLAorfTsKKworc3RydWN0IHZmNjEwX2FkY19mZWF0dXJlIHsKKwllbnVtIGNsa19zZWwJY2xrX3NlbDsKKwllbnVtIHZvbF9yZWYJdm9sX3JlZjsKKworCWludAljbGtfZGl2OworCWludCAgICAgc2FtcGxlX3JhdGU7CisJaW50CXJlc19tb2RlOworCisJYm9vbAlscG07CisJYm9vbAljYWxpYnJhdGlvbjsKKwlib29sCW92d3JlbjsKK307CisKK3N0cnVjdCB2ZjYxMF9hZGMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGNsayAqY2xrOworCisJdTMyIHZyZWZfdXY7CisJdTMyIHZhbHVlOworCXN0cnVjdCByZWd1bGF0b3IgKnZyZWY7CisJc3RydWN0IHZmNjEwX2FkY19mZWF0dXJlIGFkY19mZWF0dXJlOworCisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKK307CisKKyNkZWZpbmUgVkY2MTBfQURDX0NIQU4oX2lkeCwgX2NoYW5fdHlwZSkgewkJCVwKKwkudHlwZSA9IChfY2hhbl90eXBlKSwJCQkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCS5jaGFubmVsID0gKF9pZHgpLAkJCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAlcCisJCQkJQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwJXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdmY2MTBfYWRjX2lpb19jaGFubmVsc1tdID0geworCVZGNjEwX0FEQ19DSEFOKDAsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMiwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDMsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTig0LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oNSwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDYsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTig3LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oOCwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDksIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxMCwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDExLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMTIsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxMywgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDE0LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMTUsIElJT19WT0xUQUdFKSwKKwkvKiBzZW50aW5lbCAqLworfTsKKworLyoKKyAqIEFEQyBzYW1wbGUgZnJlcXVlbmN5LCB1bml0IGlzIEFEQ0sgY3ljbGVzLgorICogQURDIGNsayBzb3VyY2UgaXMgaXBnIGNsb2NrLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBidXMgY2xvY2suCisgKgorICogQURDIGNvbnZlcnNpb24gdGltZSA9IFNGQ0FkZGVyICsgQXZlcmFnZU51bSB4IChCQ1QgKyBMU1RBZGRlcikKKyAqIFNGQ0FkZGVyOiBmaXhlZCB0byA2IEFEQ0sgY3ljbGVzCisgKiBBdmVyYWdlTnVtOiAxLCA0LCA4LCAxNiwgMzIgc2FtcGxlcyBmb3IgaGFyZHdhcmUgYXZlcmFnZS4KKyAqIEJDVCAoQmFzZSBDb252ZXJzaW9uIFRpbWUpOiBmaXhlZCB0byAyNSBBRENLIGN5Y2xlcyBmb3IgMTIgYml0IG1vZGUKKyAqIExTVEFkZGVyKExvbmcgU2FtcGxlIFRpbWUpOiBmaXhlZCB0byAzIEFEQ0sgY3ljbGVzCisgKgorICogQnkgZGVmYXVsdCwgZW5hYmxlIDEyIGJpdCByZXNvbHV0aW9uIG1vZGUsIGNsb2NrIHNvdXJjZQorICogc2V0IHRvIGlwZyBjbG9jaywgU28gZ2V0IGJlbG93IGZyZXF1ZW5jeSBncm91cDoKKyAqLworc3RhdGljIGNvbnN0IHUzMiB2ZjYxMF9zYW1wbGVfZnJlcV9hdmFpbFs1XSA9Cit7MTk0MTE3NiwgNTU5MzMyLCAyODY5NTcsIDE0NTM3NCwgNzMxNzF9OworCitzdGF0aWMgaW5saW5lIHZvaWQgdmY2MTBfYWRjX2NmZ19pbml0KHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJLyogc2V0IGRlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgQURDIGNvbnRyb2xsZXIgKi8KKwlpbmZvLT5hZGNfZmVhdHVyZS5jbGtfc2VsID0gVkY2MTBfQURDSU9DX0JVU0NMS19TRVQ7CisJaW5mby0+YWRjX2ZlYXR1cmUudm9sX3JlZiA9IFZGNjEwX0FEQ0lPQ19WUl9WUkVGX1NFVDsKKworCWluZm8tPmFkY19mZWF0dXJlLmNhbGlicmF0aW9uID0gdHJ1ZTsKKwlpbmZvLT5hZGNfZmVhdHVyZS5vdndyZW4gPSB0cnVlOworCisJaW5mby0+YWRjX2ZlYXR1cmUuY2xrX2RpdiA9IDE7CisJaW5mby0+YWRjX2ZlYXR1cmUucmVzX21vZGUgPSAxMjsKKwlpbmZvLT5hZGNfZmVhdHVyZS5zYW1wbGVfcmF0ZSA9IDE7CisJaW5mby0+YWRjX2ZlYXR1cmUubHBtID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgdmY2MTBfYWRjX2NmZ19wb3N0X3NldChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCXN0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSAqYWRjX2ZlYXR1cmUgPSAmaW5mby0+YWRjX2ZlYXR1cmU7CisJaW50IGNmZ19kYXRhID0gMDsKKwlpbnQgZ2NfZGF0YSA9IDA7CisKKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT5jbGtfc2VsKSB7CisJY2FzZSBWRjYxMF9BRENJT0NfQUxUQ0xLX1NFVDoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FMVENMS19TRUw7CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDSU9DX0FEQUNLX1NFVDoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FEQUNLX1NFTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogbG93IHBvd2VyIHNldCBmb3IgY2FsaWJyYXRpb24gKi8KKwljZmdfZGF0YSB8PSBWRjYxMF9BRENfQURMUENfRU47CisKKwkvKiBlbmFibGUgaGlnaCBzcGVlZCBmb3IgY2FsaWJyYXRpb24gKi8KKwljZmdfZGF0YSB8PSBWRjYxMF9BRENfQURIU0NfRU47CisKKwkvKiB2b2x0YWdlIHJlZmVyZW5jZSAqLworCXN3aXRjaCAoYWRjX2ZlYXR1cmUtPnZvbF9yZWYpIHsKKwljYXNlIFZGNjEwX0FEQ0lPQ19WUl9WUkVGX1NFVDoKKwkJYnJlYWs7CisJY2FzZSBWRjYxMF9BRENJT0NfVlJfVkFMVF9TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19SRUZTRUxfVkFMVDsKKwkJYnJlYWs7CisJY2FzZSBWRjYxMF9BRENJT0NfVlJfVkJHX1NFVDoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX1JFRlNFTF9WQkc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiZXJyb3Igdm9sdGFnZSByZWZlcmVuY2VcbiIpOworCX0KKworCS8qIGRhdGEgb3ZlcndyaXRlIGVuYWJsZSAqLworCWlmIChhZGNfZmVhdHVyZS0+b3Z3cmVuKQorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfT1ZXUkVOOworCisJd3JpdGVsKGNmZ19kYXRhLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19DRkcpOworCXdyaXRlbChnY19kYXRhLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19jYWxpYnJhdGlvbihzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCWludCBhZGNfZ2MsIGhjX2NmZzsKKwlpbnQgdGltZW91dDsKKworCWlmICghaW5mby0+YWRjX2ZlYXR1cmUuY2FsaWJyYXRpb24pCisJCXJldHVybjsKKworCS8qIGVuYWJsZSBjYWxpYnJhdGlvbiBpbnRlcnJ1cHQgKi8KKwloY19jZmcgPSBWRjYxMF9BRENfQUlFTiB8IFZGNjEwX0FEQ19DT05WX0RJU0FCTEU7CisJd3JpdGVsKGhjX2NmZywgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSEMwKTsKKworCWFkY19nYyA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dDKTsKKwl3cml0ZWwoYWRjX2djIHwgVkY2MTBfQURDX0NBTCwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworCisJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dAorCQkJKCZpbmZvLT5jb21wbGV0aW9uLCBWRjYxMF9BRENfVElNRU9VVCk7CisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJZGV2X2VycihpbmZvLT5kZXYsICJUaW1lb3V0IGZvciBhZGMgY2FsaWJyYXRpb25cbiIpOworCisJYWRjX2djID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR1MpOworCWlmIChhZGNfZ2MgJiBWRjYxMF9BRENfQ0FMRikKKwkJZGV2X2VycihpbmZvLT5kZXYsICJBREMgY2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKKworCWluZm8tPmFkY19mZWF0dXJlLmNhbGlicmF0aW9uID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19jZmdfc2V0KHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJc3RydWN0IHZmNjEwX2FkY19mZWF0dXJlICphZGNfZmVhdHVyZSA9ICYoaW5mby0+YWRjX2ZlYXR1cmUpOworCWludCBjZmdfZGF0YTsKKworCWNmZ19kYXRhID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKworCS8qIGxvdyBwb3dlciBjb25maWd1cmF0aW9uICovCisJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19BRExQQ19FTjsKKwlpZiAoYWRjX2ZlYXR1cmUtPmxwbSkKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FETFBDX0VOOworCisJLyogZGlzYWJsZSBoaWdoIHNwZWVkICovCisJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19BREhTQ19FTjsKKworCXdyaXRlbChjZmdfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKK30KKworc3RhdGljIHZvaWQgdmY2MTBfYWRjX3NhbXBsZV9zZXQoc3RydWN0IHZmNjEwX2FkYyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjX2ZlYXR1cmUgKmFkY19mZWF0dXJlID0gJihpbmZvLT5hZGNfZmVhdHVyZSk7CisJaW50IGNmZ19kYXRhLCBnY19kYXRhOworCisJY2ZnX2RhdGEgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19DRkcpOworCWdjX2RhdGEgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7CisKKwkvKiByZXNvbHV0aW9uIG1vZGUgKi8KKwljZmdfZGF0YSAmPSB+VkY2MTBfQURDX01PREVfTUFTSzsKKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT5yZXNfbW9kZSkgeworCWNhc2UgODoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX01PREVfQklUODsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX01PREVfQklUMTA7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19NT0RFX0JJVDEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgImVycm9yIHJlc29sdXRpb24gbW9kZVxuIik7CisJCWJyZWFrOworCX0KKworCS8qIGNsb2NrIHNlbGVjdCBhbmQgY2xvY2sgZGl2aWRlciAqLworCWNmZ19kYXRhICY9IH4oVkY2MTBfQURDX0NMS19NQVNLIHwgVkY2MTBfQURDX0FEQ0NMS19NQVNLKTsKKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT5jbGtfZGl2KSB7CisJY2FzZSAxOgorCQlicmVhazsKKwljYXNlIDI6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19DTEtfRElWMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfQ0xLX0RJVjQ7CisJCWJyZWFrOworCWNhc2UgODoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0NMS19ESVY4OworCQlicmVhazsKKwljYXNlIDE2OgorCQlzd2l0Y2ggKGFkY19mZWF0dXJlLT5jbGtfc2VsKSB7CisJCWNhc2UgVkY2MTBfQURDSU9DX0JVU0NMS19TRVQ6CisJCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfQlVTQ0xLMl9TRUwgfCBWRjYxMF9BRENfQ0xLX0RJVjg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoaW5mby0+ZGV2LCAiZXJyb3IgY2xrIGRpdmlkZXJcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogVXNlIHRoZSBzaG9ydCBzYW1wbGUgbW9kZSAqLworCWNmZ19kYXRhICY9IH4oVkY2MTBfQURDX0FETFNNUF9MT05HIHwgVkY2MTBfQURDX0FEU1RTX01BU0spOworCisJLyogdXBkYXRlIGhhcmR3YXJlIGF2ZXJhZ2Ugc2VsZWN0aW9uICovCisJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19BVkdTX01BU0s7CisJZ2NfZGF0YSAmPSB+VkY2MTBfQURDX0FWR0VOOworCXN3aXRjaCAoYWRjX2ZlYXR1cmUtPnNhbXBsZV9yYXRlKSB7CisJY2FzZSBWRjYxMF9BRENfU0FNUExFXzE6CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV80OgorCQlnY19kYXRhIHw9IFZGNjEwX0FEQ19BVkdFTjsKKwkJYnJlYWs7CisJY2FzZSBWRjYxMF9BRENfU0FNUExFXzg6CisJCWdjX2RhdGEgfD0gVkY2MTBfQURDX0FWR0VOOworCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfQVZHU184OworCQlicmVhazsKKwljYXNlIFZGNjEwX0FEQ19TQU1QTEVfMTY6CisJCWdjX2RhdGEgfD0gVkY2MTBfQURDX0FWR0VOOworCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfQVZHU18xNjsKKwkJYnJlYWs7CisJY2FzZSBWRjYxMF9BRENfU0FNUExFXzMyOgorCQlnY19kYXRhIHw9IFZGNjEwX0FEQ19BVkdFTjsKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FWR1NfMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaW5mby0+ZGV2LAorCQkJImVycm9yIGhhcmR3YXJlIHNhbXBsZSBhdmVyYWdlIHNlbGVjdFxuIik7CisJfQorCisJd3JpdGVsKGNmZ19kYXRhLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19DRkcpOworCXdyaXRlbChnY19kYXRhLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19od19pbml0KHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJLyogQ0ZHOiBGZWF0dXJlIHNldCAqLworCXZmNjEwX2FkY19jZmdfcG9zdF9zZXQoaW5mbyk7CisJdmY2MTBfYWRjX3NhbXBsZV9zZXQoaW5mbyk7CisKKwkvKiBhZGMgY2FsaWJyYXRpb24gKi8KKwl2ZjYxMF9hZGNfY2FsaWJyYXRpb24oaW5mbyk7CisKKwkvKiBDRkc6IHBvd2VyIGFuZCBzcGVlZCBzZXQgKi8KKwl2ZjYxMF9hZGNfY2ZnX3NldChpbmZvKTsKK30KKworc3RhdGljIGludCB2ZjYxMF9hZGNfcmVhZF9kYXRhKHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX1IwKTsKKworCXN3aXRjaCAoaW5mby0+YWRjX2ZlYXR1cmUucmVzX21vZGUpIHsKKwljYXNlIDg6CisJCXJlc3VsdCAmPSAweEZGOworCQlicmVhazsKKwljYXNlIDEwOgorCQlyZXN1bHQgJj0gMHgzRkY7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCXJlc3VsdCAmPSAweEZGRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZmNjEwX2FkY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSAoc3RydWN0IHZmNjEwX2FkYyAqKWRldl9pZDsKKwlpbnQgY29jbzsKKworCWNvY28gPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19IUyk7CisJaWYgKGNvY28gJiBWRjYxMF9BRENfSFNfQ09DTzApIHsKKwkJaW5mby0+dmFsdWUgPSB2ZjYxMF9hZGNfcmVhZF9kYXRhKGluZm8pOworCQljb21wbGV0ZSgmaW5mby0+Y29tcGxldGlvbik7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIxOTQxMTc2LCA1NTkzMzIsIDI4Njk1NywgMTQ1Mzc0LCA3MzE3MSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmY2MTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmY2MTBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IHZmNjEwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IHZmNjEwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCWludCAqdmFsLAorCQkJaW50ICp2YWwyLAorCQkJbG9uZyBtYXNrKQoreworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBoY19jZmc7CisJbG9uZyByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmVpbml0X2NvbXBsZXRpb24oJmluZm8tPmNvbXBsZXRpb24pOworCisJCWhjX2NmZyA9IFZGNjEwX0FEQ19BRENIQyhjaGFuLT5jaGFubmVsKTsKKwkJaGNfY2ZnIHw9IFZGNjEwX0FEQ19BSUVOOworCQl3cml0ZWwoaGNfY2ZnLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19IQzApOworCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dAorCQkJCSgmaW5mby0+Y29tcGxldGlvbiwgVkY2MTBfQURDX1RJTUVPVVQpOworCQlpZiAocmV0ID09IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkqdmFsID0gaW5mby0+dmFsdWU7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJKnZhbCA9IGluZm8tPnZyZWZfdXYgLyAxMDAwOworCQkqdmFsMiA9IGluZm8tPmFkY19mZWF0dXJlLnJlc19tb2RlOworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQkqdmFsID0gdmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWxbaW5mby0+YWRjX2ZlYXR1cmUuc2FtcGxlX3JhdGVdOworCQkqdmFsMiA9IDA7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZmNjEwX3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQlpbnQgdmFsLAorCQkJaW50IHZhbDIsCisJCQlsb25nIG1hc2spCit7CisJc3RydWN0IHZmNjEwX2FkYyAqaW5mbyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGk7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwkJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJCWZvciAoaSA9IDA7CisJCQkJaSA8IEFSUkFZX1NJWkUodmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWwpOworCQkJCWkrKykKKwkJCQlpZiAodmFsID09IHZmNjEwX3NhbXBsZV9mcmVxX2F2YWlsW2ldKSB7CisJCQkJCWluZm8tPmFkY19mZWF0dXJlLnNhbXBsZV9yYXRlID0gaTsKKwkJCQkJdmY2MTBfYWRjX3NhbXBsZV9zZXQoaW5mbyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2ZjYxMF9hZGNfcmVnX2FjY2VzcyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB3cml0ZXZhbCwKKwkJCXVuc2lnbmVkICpyZWFkdmFsKQoreworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKChyZWFkdmFsID09IE5VTEwpIHx8CisJCSghKHJlZyAlIDQpIHx8IChyZWcgPiBWRjYxMF9SRUdfQURDX1BDVEwpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqcmVhZHZhbCA9IHJlYWRsKGluZm8tPnJlZ3MgKyByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gdmY2MTBfYWRjX2lpb19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJnZmNjEwX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAmdmY2MTBfd3JpdGVfcmF3LAorCS5kZWJ1Z2ZzX3JlZ19hY2Nlc3MgPSAmdmY2MTBfYWRjX3JlZ19hY2Nlc3MsCisJLmF0dHJzID0gJnZmNjEwX2F0dHJpYnV0ZV9ncm91cCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZmNjEwX2FkY19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLHZmNjEwLWFkYyIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdmY2MTBfYWRjX21hdGNoKTsKKworc3RhdGljIGludCB2ZjYxMF9hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisJaW50IGlycTsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgdmY2MTBfYWRjKSk7CisJaWYgKCFpbmRpb19kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIGFsbG9jYXRpbmcgaWlvIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWluZm8tPmRldiA9ICZwZGV2LT5kZXY7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWluZm8tPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKKwlpZiAoSVNfRVJSKGluZm8tPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihpbmZvLT5yZWdzKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGluZm8tPmRldiwgaXJxLAorCQkJCXZmNjEwX2FkY19pc3IsIDAsCisJCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCByZXF1ZXN0aW5nIGlycSwgaXJxID0gJWRcbiIsIGlycSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5mby0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhZGMiKTsKKwlpZiAoSVNfRVJSKGluZm8tPmNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIGdldHRpbmcgY2xvY2ssIGVyciA9ICVsZFxuIiwKKwkJCQkJCVBUUl9FUlIoaW5mby0+Y2xrKSk7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+Y2xrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvLT52cmVmID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZwZGV2LT5kZXYsICJ2cmVmIik7CisJaWYgKElTX0VSUihpbmZvLT52cmVmKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW5mby0+dnJlZik7CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGluZm8tPnZyZWYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbmZvLT52cmVmX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGluZm8tPnZyZWYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5kaW9fZGV2KTsKKworCWluaXRfY29tcGxldGlvbigmaW5mby0+Y29tcGxldGlvbik7CisKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlpbmRpb19kZXYtPmluZm8gPSAmdmY2MTBfYWRjX2lpb19pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gdmY2MTBfYWRjX2lpb19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodmY2MTBfYWRjX2lpb19jaGFubmVscyk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaW5mby0+Y2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJDb3VsZCBub3QgcHJlcGFyZSBvciBlbmFibGUgdGhlIGNsb2NrLlxuIik7CisJCWdvdG8gZXJyb3JfYWRjX2Nsa19lbmFibGU7CisJfQorCisJdmY2MTBfYWRjX2NmZ19pbml0KGluZm8pOworCXZmNjEwX2FkY19od19pbml0KGluZm8pOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVnaXN0ZXIgdGhlIGRldmljZS5cbiIpOworCQlnb3RvIGVycm9yX2lpb19kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKKworZXJyb3JfaWlvX2RldmljZV9yZWdpc3RlcjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaW5mby0+Y2xrKTsKK2Vycm9yX2FkY19jbGtfZW5hYmxlOgorCXJlZ3VsYXRvcl9kaXNhYmxlKGluZm8tPnZyZWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZjYxMF9hZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJcmVndWxhdG9yX2Rpc2FibGUoaW5mby0+dnJlZik7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB2ZjYxMF9hZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBoY19jZmc7CisKKwkvKiBBREMgY29udHJvbGxlciBlbnRlcnMgdG8gc3RvcCBtb2RlICovCisJaGNfY2ZnID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSEMwKTsKKwloY19jZmcgfD0gVkY2MTBfQURDX0NPTlZfRElTQUJMRTsKKwl3cml0ZWwoaGNfY2ZnLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19IQzApOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPmNsayk7CisJcmVndWxhdG9yX2Rpc2FibGUoaW5mby0+dnJlZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZjYxMF9hZGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHZmNjEwX2FkYyAqaW5mbyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoaW5mby0+dnJlZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShpbmZvLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2ZjYxMF9hZGNfaHdfaW5pdChpbmZvKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyh2ZjYxMF9hZGNfcG1fb3BzLAorCQkJdmY2MTBfYWRjX3N1c3BlbmQsCisJCQl2ZjYxMF9hZGNfcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmY2MTBfYWRjX2RyaXZlciA9IHsKKwkucHJvYmUgICAgICAgICAgPSB2ZjYxMF9hZGNfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gdmY2MTBfYWRjX3JlbW92ZSwKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSBEUklWRVJfTkFNRSwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB2ZjYxMF9hZGNfbWF0Y2gsCisJCS5wbSAgICAgPSAmdmY2MTBfYWRjX3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih2ZjYxMF9hZGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiRnVnYW5nIER1YW4gPEIzODYxMUBmcmVlc2NhbGUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgVkY2MTAgQURDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvdmlwZXJib2FyZF9hZGMuYwppbmRleCBkMGFkZDhmLi45YWNmNmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdmlwZXJib2FyZF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdmlwZXJib2FyZF9hZGMuYwpAQCAtMTM5LDggKzEzOSw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5kaW9fZGV2KTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMveGlsaW54LXhhZGMtY29yZS5jIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjUyYmUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWNvcmUuYwpAQCAtMCwwICsxLDEzMzMgQEAKKy8qCisgKiBYaWxpbnggWEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdWVuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICoKKyAqIERvY3VtZW50YXRpb24gZm9yIHRoZSBwYXJ0cyBjYW4gYmUgZm91bmQgYXQ6CisgKiAgLSBYQURDIGhhcmRtYWNybzogWGlsaW54IFVHNDgwCisgKiAgLSBaWU5RIFhBREMgaW50ZXJmYWNlOiBYaWxpbnggVUc1ODUKKyAqICAtIEFYSSBYQURDIGludGVyZmFjZTogWGlsaW54IFBHMDE5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vZXZlbnRzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorCisjaW5jbHVkZSAieGlsaW54LXhhZGMuaCIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBYQURDX1pZTlFfVU5NQVNLX1RJTUVPVVQgPSA1MDA7CisKKy8qIFpZTlEgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19DRkcJMHgwMAorI2RlZmluZSBYQURDX1pZTlFfUkVHX0lOVFNUUwkweDA0CisjZGVmaW5lIFhBRENfWllOUV9SRUdfSU5UTVNLCTB4MDgKKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19TVEFUVVMJMHgwYworI2RlZmluZSBYQURDX1pZTlFfUkVHX0NGSUZPCTB4MTAKKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19ERklGTwkweDE0CisjZGVmaW5lIFhBRENfWllOUV9SRUdfQ1RMCQkweDE4CisKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19FTkFCTEUJCUJJVCgzMSkKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19DRklGT1RIX01BU0sJKDB4ZiA8PCAyMCkKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19DRklGT1RIX09GRlNFVAkyMAorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX0RGSUZPVEhfTUFTSwkoMHhmIDw8IDE2KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX0RGSUZPVEhfT0ZGU0VUCTE2CisjZGVmaW5lIFhBRENfWllOUV9DRkdfV0VER0UJCUJJVCgxMykKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19SRURHRQkJQklUKDEyKQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfTUFTSwkoMHgzIDw8IDgpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVYyCSgweDAgPDwgOCkKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19UQ0tSQVRFX0RJVjQJKDB4MSA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWOAkoMHgyIDw8IDgpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVYxNgkoMHgzIDw8IDgpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfSUdBUF9NQVNLCQkweDFmCisjZGVmaW5lIFhBRENfWllOUV9DRkdfSUdBUCh4KQkJKHgpCisKKyNkZWZpbmUgWEFEQ19aWU5RX0lOVF9DRklGT19MVEgJCUJJVCg5KQorI2RlZmluZSBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSAkJQklUKDgpCisjZGVmaW5lIFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSwkweGZmCisjZGVmaW5lIFhBRENfWllOUV9JTlRfQUxBUk1fT0ZGU0VUCTAKKworI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0NGSUZPX0xWTF9NQVNLCSgweGYgPDwgMTYpCisjZGVmaW5lIFhBRENfWllOUV9TVEFUVVNfQ0ZJRk9fTFZMX09GRlNFVAkxNgorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0RGSUZPX0xWTF9NQVNLCSgweGYgPDwgMTIpCisjZGVmaW5lIFhBRENfWllOUV9TVEFUVVNfREZJRk9fTFZMX09GRlNFVAkxMgorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0NGSUZPRgkJQklUKDExKQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0NGSUZPRQkJQklUKDEwKQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0RGSUZPRgkJQklUKDkpCisjZGVmaW5lIFhBRENfWllOUV9TVEFUVVNfREZJRk9FCQlCSVQoOCkKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19PVAkJQklUKDcpCisjZGVmaW5lIFhBRENfWllOUV9TVEFUVVNfQUxNKHgpCQlCSVQoeCkKKworI2RlZmluZSBYQURDX1pZTlFfQ1RMX1JFU0VUCQlCSVQoNCkKKworI2RlZmluZSBYQURDX1pZTlFfQ01EX05PUAkJMHgwMAorI2RlZmluZSBYQURDX1pZTlFfQ01EX1JFQUQJCTB4MDEKKyNkZWZpbmUgWEFEQ19aWU5RX0NNRF9XUklURQkJMHgwMgorCisjZGVmaW5lIFhBRENfWllOUV9DTUQoY21kLCBhZGRyLCBkYXRhKSAoKChjbWQpIDw8IDI2KSB8ICgoYWRkcikgPDwgMTYpIHwgKGRhdGEpKQorCisvKiBBWEkgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgWEFEQ19BWElfUkVHX1JFU0VUCQkweDAwCisjZGVmaW5lIFhBRENfQVhJX1JFR19TVEFUVVMJCTB4MDQKKyNkZWZpbmUgWEFEQ19BWElfUkVHX0FMQVJNX1NUQVRVUwkweDA4CisjZGVmaW5lIFhBRENfQVhJX1JFR19DT05WU1QJCTB4MGMKKyNkZWZpbmUgWEFEQ19BWElfUkVHX1hBRENfUkVTRVQJCTB4MTAKKyNkZWZpbmUgWEFEQ19BWElfUkVHX0dJRVIJCTB4NWMKKyNkZWZpbmUgWEFEQ19BWElfUkVHX0lQSVNSCQkweDYwCisjZGVmaW5lIFhBRENfQVhJX1JFR19JUElFUgkJMHg2OAorI2RlZmluZSBYQURDX0FYSV9BRENfUkVHX09GRlNFVAkJMHgyMDAKKworI2RlZmluZSBYQURDX0FYSV9SRVNFVF9NQUdJQwkJMHhhCisjZGVmaW5lIFhBRENfQVhJX0dJRVJfRU5BQkxFCQlCSVQoMzEpCisKKyNkZWZpbmUgWEFEQ19BWElfSU5UX0VPUwkJQklUKDQpCisjZGVmaW5lIFhBRENfQVhJX0lOVF9BTEFSTV9NQVNLCQkweDNjMGYKKworI2RlZmluZSBYQURDX0ZMQUdTX0JVRkZFUkVEIEJJVCgwKQorCitzdGF0aWMgdm9pZCB4YWRjX3dyaXRlX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MzJfdCB2YWwpCit7CisJd3JpdGVsKHZhbCwgeGFkYy0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHhhZGNfcmVhZF9yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDMyX3QgKnZhbCkKK3sKKwkqdmFsID0gcmVhZGwoeGFkYy0+YmFzZSArIHJlZyk7Cit9CisKKy8qCisgKiBUaGUgWllOUSBpbnRlcmZhY2UgdXNlcyB0d28gYXN5bmNocm9ub3VzIEZJRk9zIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlCisgKiBYQURDLiBSZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBYQURDIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQgYnkgc3VibWl0dGluZyBhCisgKiByZXF1ZXN0IHRvIHRoZSBjb21tYW5kIEZJRk8gKENGSUZPKSwgb25jZSB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQgdGhlCisgKiByZXN1bHQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgZGF0YSBGSUZPIChERklGTykuIFRoZSBtZXRob2QgY3VycmVudGx5IHVzZWQgaW4KKyAqIHRoaXMgZHJpdmVyIGlzIHRvIHN1Ym1pdCB0aGUgcmVxdWVzdCBmb3IgYSByZWFkL3dyaXRlIG9wZXJhdGlvbiwgdGhlbiBnbyB0bworICogc2xlZXAgYW5kIHdhaXQgZm9yIGFuIGludGVycnVwdCB0aGF0IHNpZ25hbHMgdGhhdCBhIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSBpbgorICogdGhlIGRhdGEgRklGTy4KKyAqLworCitzdGF0aWMgdm9pZCB4YWRjX3p5bnFfd3JpdGVfZmlmbyhzdHJ1Y3QgeGFkYyAqeGFkYywgdWludDMyX3QgKmNtZCwKKwl1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ0ZJRk8sIGNtZFtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHhhZGNfenlucV9kcmFpbl9maWZvKHN0cnVjdCB4YWRjICp4YWRjKQoreworCXVpbnQzMl90IHN0YXR1cywgdG1wOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX1NUQVRVUywgJnN0YXR1cyk7CisKKwl3aGlsZSAoIShzdGF0dXMgJiBYQURDX1pZTlFfU1RBVFVTX0RGSUZPRSkpIHsKKwkJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0RGSUZPLCAmdG1wKTsKKwkJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX1NUQVRVUywgJnN0YXR1cyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4YWRjX3p5bnFfdXBkYXRlX2ludG1zayhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IG1hc2ssCisJdW5zaWduZWQgaW50IHZhbCkKK3sKKwl4YWRjLT56eW5xX2ludG1hc2sgJj0gfm1hc2s7CisJeGFkYy0+enlucV9pbnRtYXNrIHw9IHZhbDsKKworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UTVNLLAorCQl4YWRjLT56eW5xX2ludG1hc2sgfCB4YWRjLT56eW5xX21hc2tlZF9hbGFybSk7Cit9CisKK3N0YXRpYyBpbnQgeGFkY196eW5xX3dyaXRlX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgdmFsKQoreworCXVpbnQzMl90IGNtZFsxXTsKKwl1aW50MzJfdCB0bXA7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnEoJnhhZGMtPmxvY2spOworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILAorCQkJWEFEQ19aWU5RX0lOVF9ERklGT19HVEgpOworCisJcmVpbml0X2NvbXBsZXRpb24oJnhhZGMtPmNvbXBsZXRpb24pOworCisJY21kWzBdID0gWEFEQ19aWU5RX0NNRChYQURDX1pZTlFfQ01EX1dSSVRFLCByZWcsIHZhbCk7CisJeGFkY196eW5xX3dyaXRlX2ZpZm8oeGFkYywgY21kLCBBUlJBWV9TSVpFKGNtZCkpOworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsICZ0bXApOworCXRtcCAmPSB+WEFEQ19aWU5RX0NGR19ERklGT1RIX01BU0s7CisJdG1wIHw9IDAgPDwgWEFEQ19aWU5RX0NGR19ERklGT1RIX09GRlNFVDsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGRywgdG1wKTsKKworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILCAwKTsKKwlzcGluX3VubG9ja19pcnEoJnhhZGMtPmxvY2spOworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnhhZGMtPmNvbXBsZXRpb24sIEhaKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IC1FSU87CisJZWxzZQorCQlyZXQgPSAwOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0RGSUZPLCAmdG1wKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGFkY196eW5xX3JlYWRfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCAqdmFsKQoreworCXVpbnQzMl90IGNtZFsyXTsKKwl1aW50MzJfdCByZXNwLCB0bXA7CisJaW50IHJldDsKKworCWNtZFswXSA9IFhBRENfWllOUV9DTUQoWEFEQ19aWU5RX0NNRF9SRUFELCByZWcsIDApOworCWNtZFsxXSA9IFhBRENfWllOUV9DTUQoWEFEQ19aWU5RX0NNRF9OT1AsIDAsIDApOworCisJc3Bpbl9sb2NrX2lycSgmeGFkYy0+bG9jayk7CisJeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soeGFkYywgWEFEQ19aWU5RX0lOVF9ERklGT19HVEgsCisJCQlYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCk7CisJeGFkY196eW5xX2RyYWluX2ZpZm8oeGFkYyk7CisJcmVpbml0X2NvbXBsZXRpb24oJnhhZGMtPmNvbXBsZXRpb24pOworCisJeGFkY196eW5xX3dyaXRlX2ZpZm8oeGFkYywgY21kLCBBUlJBWV9TSVpFKGNtZCkpOworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsICZ0bXApOworCXRtcCAmPSB+WEFEQ19aWU5RX0NGR19ERklGT1RIX01BU0s7CisJdG1wIHw9IDEgPDwgWEFEQ19aWU5RX0NGR19ERklGT1RIX09GRlNFVDsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGRywgdG1wKTsKKworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILCAwKTsKKwlzcGluX3VubG9ja19pcnEoJnhhZGMtPmxvY2spOworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZ4YWRjLT5jb21wbGV0aW9uLCBIWik7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0RGSUZPLCAmcmVzcCk7CisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0RGSUZPLCAmcmVzcCk7CisKKwkqdmFsID0gcmVzcCAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHhhZGNfenlucV90cmFuc2Zvcm1fYWxhcm0odW5zaWduZWQgaW50IGFsYXJtKQoreworCXJldHVybiAoKGFsYXJtICYgMHg4MCkgPj4gNCkgfAorCQkoKGFsYXJtICYgMHg3OCkgPDwgMSkgfAorCQkoYWxhcm0gJiAweDA3KTsKK30KKworLyoKKyAqIFRoZSBaWU5RIHRocmVzaG9sZCBpbnRlcnJ1cHRzIGFyZSBsZXZlbCBzZW5zaXRpdmUuIFNpbmNlIHdlIGNhbid0IG1ha2UgdGhlCisgKiB0aHJlc2hvbGQgY29uZGl0aW9uIGdvIHdheSBmcm9tIHdpdGhpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHRoaXMgbWVhbnMgYXMKKyAqIHNvb24gYXMgYSB0aHJlc2hvbGQgY29uZGl0aW9uIGlzIHByZXNlbnQgd2Ugd291bGQgZW50ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKiBhZ2FpbiBhbmQgYWdhaW4uIFRvIHdvcmsgYXJvdW5kIHRoaXMgd2UgbWFzayBhbGwgYWN0aXZlIHRocmVzaG9sZHMgaW50ZXJydXB0cworICogaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCBzdGFydCBhIHRpbWVyLiBJbiB0aGlzIHRpbWVyIHdlIHBvbGwgdGhlCisgKiBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBvbmx5IGlmIHRoZSBpbnRlcnJ1cHQgaXMgaW5hY3RpdmUgd2UgdW5tYXNrIGl0IGFnYWluLgorICovCitzdGF0aWMgdm9pZCB4YWRjX3p5bnFfdW5tYXNrX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHhhZGMsIHp5bnFfdW5tYXNrX3dvcmsud29yayk7CisJdW5zaWduZWQgaW50IG1pc2Nfc3RzLCB1bm1hc2s7CisKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfU1RBVFVTLCAmbWlzY19zdHMpOworCisJbWlzY19zdHMgJj0gWEFEQ19aWU5RX0lOVF9BTEFSTV9NQVNLOworCisJc3Bpbl9sb2NrX2lycSgmeGFkYy0+bG9jayk7CisKKwkvKiBDbGVhciB0aG9zZSBiaXRzIHdoaWNoIGFyZSBub3QgYWN0aXZlIGFueW1vcmUgKi8KKwl1bm1hc2sgPSAoeGFkYy0+enlucV9tYXNrZWRfYWxhcm0gXiBtaXNjX3N0cykgJiB4YWRjLT56eW5xX21hc2tlZF9hbGFybTsKKwl4YWRjLT56eW5xX21hc2tlZF9hbGFybSAmPSBtaXNjX3N0czsKKworCS8qIEFsc28gY2xlYXIgdGhvc2Ugd2hpY2ggYXJlIG1hc2tlZCBvdXQgYW55d2F5ICovCisJeGFkYy0+enlucV9tYXNrZWRfYWxhcm0gJj0gfnhhZGMtPnp5bnFfaW50bWFzazsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIGJlZm9yZSB3ZSB1bm1hc2sgdGhlbSAqLworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCB1bm1hc2spOworCisJeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soeGFkYywgMCwgMCk7CisKKwlzcGluX3VubG9ja19pcnEoJnhhZGMtPmxvY2spOworCisJLyogaWYgc3RpbGwgcGVuZGluZyBzb21lIGFsYXJtIHJlLXRyaWdnZXIgdGhlIHRpbWVyICovCisJaWYgKHhhZGMtPnp5bnFfbWFza2VkX2FsYXJtKSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmeGFkYy0+enlucV91bm1hc2tfd29yaywKKwkJCQltc2Vjc190b19qaWZmaWVzKFhBRENfWllOUV9VTk1BU0tfVElNRU9VVCkpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHhhZGNfenlucV90aHJlYWRlZF9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2aWQ7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBhbGFybTsKKworCXNwaW5fbG9ja19pcnEoJnhhZGMtPmxvY2spOworCWFsYXJtID0geGFkYy0+enlucV9hbGFybTsKKwl4YWRjLT56eW5xX2FsYXJtID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnhhZGMtPmxvY2spOworCisJeGFkY19oYW5kbGVfZXZlbnRzKGluZGlvX2RldiwgeGFkY196eW5xX3RyYW5zZm9ybV9hbGFybShhbGFybSkpOworCisJLyogdW5tYXNrIHRoZSByZXF1aXJlZCBpbnRlcnJ1cHRzIGluIHRpbWVyLiAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmeGFkYy0+enlucV91bm1hc2tfd29yaywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoWEFEQ19aWU5RX1VOTUFTS19USU1FT1VUKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4YWRjX3p5bnFfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldmlkOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCAmc3RhdHVzKTsKKworCXN0YXR1cyAmPSB+KHhhZGMtPnp5bnFfaW50bWFzayB8IHhhZGMtPnp5bnFfbWFza2VkX2FsYXJtKTsKKworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnhhZGMtPmxvY2spOworCisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRTVFMsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgWEFEQ19aWU5RX0lOVF9ERklGT19HVEgpIHsKKwkJeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soeGFkYywgWEFEQ19aWU5RX0lOVF9ERklGT19HVEgsCisJCQlYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCk7CisJCWNvbXBsZXRlKCZ4YWRjLT5jb21wbGV0aW9uKTsKKwl9CisKKwlzdGF0dXMgJj0gWEFEQ19aWU5RX0lOVF9BTEFSTV9NQVNLOworCWlmIChzdGF0dXMpIHsKKwkJeGFkYy0+enlucV9hbGFybSB8PSBzdGF0dXM7CisJCXhhZGMtPnp5bnFfbWFza2VkX2FsYXJtIHw9IHN0YXR1czsKKwkJLyoKKwkJICogbWFzayB0aGUgY3VycmVudCBldmVudCBpbnRlcnJ1cHQsCisJCSAqIHVubWFzayBpdCB3aGVuIHRoZSBpbnRlcnJ1cHQgaXMgbm8gbW9yZSBhY3RpdmUuCisJCSAqLworCQl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCAwLCAwKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKwlzcGluX3VubG9jaygmeGFkYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFhBRENfWllOUV9UQ0tfUkFURV9NQVggNTAwMDAwMDAKKyNkZWZpbmUgWEFEQ19aWU5RX0lHQVBfREVGQVVMVCAyMAorCitzdGF0aWMgaW50IHhhZGNfenlucV9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBpcnEpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgcGNhcF9yYXRlOworCXVuc2lnbmVkIGludCB0Y2tfZGl2OworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IGlnYXA7CisJdW5zaWduZWQgaW50IHRja19yYXRlOworCisJLyogVE9ETzogRmlndXJlIG91dCBob3cgdG8gbWFrZSBpZ2FwIGFuZCB0Y2tfcmF0ZSBjb25maWd1cmFibGUgKi8KKwlpZ2FwID0gWEFEQ19aWU5RX0lHQVBfREVGQVVMVDsKKwl0Y2tfcmF0ZSA9IFhBRENfWllOUV9UQ0tfUkFURV9NQVg7CisKKwl4YWRjLT56eW5xX2ludG1hc2sgPSB+MDsKKworCXBjYXBfcmF0ZSA9IGNsa19nZXRfcmF0ZSh4YWRjLT5jbGspOworCisJaWYgKHRja19yYXRlID4gWEFEQ19aWU5RX1RDS19SQVRFX01BWCkKKwkJdGNrX3JhdGUgPSBYQURDX1pZTlFfVENLX1JBVEVfTUFYOworCWlmICh0Y2tfcmF0ZSA+IHBjYXBfcmF0ZSAvIDIpIHsKKwkJZGl2ID0gMjsKKwl9IGVsc2UgeworCQlkaXYgPSBwY2FwX3JhdGUgLyB0Y2tfcmF0ZTsKKwkJaWYgKHBjYXBfcmF0ZSAvIGRpdiA+IFhBRENfWllOUV9UQ0tfUkFURV9NQVgpCisJCQlkaXYrKzsKKwl9CisKKwlpZiAoZGl2IDw9IDMpCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMjsKKwllbHNlIGlmIChkaXYgPD0gNykKKwkJdGNrX2RpdiA9IFhBRENfWllOUV9DRkdfVENLUkFURV9ESVY0OworCWVsc2UgaWYgKGRpdiA8PSAxNSkKKwkJdGNrX2RpdiA9IFhBRENfWllOUV9DRkdfVENLUkFURV9ESVY4OworCWVsc2UKKwkJdGNrX2RpdiA9IFhBRENfWllOUV9DRkdfVENLUkFURV9ESVYxNjsKKworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ1RMLCBYQURDX1pZTlFfQ1RMX1JFU0VUKTsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NUTCwgMCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRTVFMsIH4wKTsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVE1TSywgeGFkYy0+enlucV9pbnRtYXNrKTsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGRywgWEFEQ19aWU5RX0NGR19FTkFCTEUgfAorCQkJWEFEQ19aWU5RX0NGR19SRURHRSB8IFhBRENfWllOUV9DRkdfV0VER0UgfAorCQkJdGNrX2RpdiB8IFhBRENfWllOUV9DRkdfSUdBUChpZ2FwKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGFkY196eW5xX2dldF9kY2xrX3JhdGUoc3RydWN0IHhhZGMgKnhhZGMpCit7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1aW50MzJfdCB2YWw7CisKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ0ZHLCAmdmFsKTsKKworCXN3aXRjaCAodmFsICYgWEFEQ19aWU5RX0NGR19UQ0tSQVRFX01BU0spIHsKKwljYXNlIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVY0OgorCQlkaXYgPSA0OworCQlicmVhazsKKwljYXNlIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVY4OgorCQlkaXYgPSA4OworCQlicmVhazsKKwljYXNlIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVYxNjoKKwkJZGl2ID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpdiA9IDI7CisJCWJyZWFrOworCX0KKworCXJldHVybiBjbGtfZ2V0X3JhdGUoeGFkYy0+Y2xrKSAvIGRpdjsKK30KKworc3RhdGljIHZvaWQgeGFkY196eW5xX3VwZGF0ZV9hbGFybShzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IGFsYXJtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3Qgc3RhdHVzOworCisJLyogTW92ZSBPVCB0byBiaXQgNyAqLworCWFsYXJtID0gKChhbGFybSAmIDB4MDgpIDw8IDQpIHwgKChhbGFybSAmIDB4ZjApID4+IDEpIHwgKGFsYXJtICYgMHgwNyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGFkYy0+bG9jaywgZmxhZ3MpOworCisJLyogQ2xlYXIgcHJldmlvdXMgaW50ZXJydXB0cyBpZiBhbnkuICovCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVFNUUywgJnN0YXR1cyk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRTVFMsIHN0YXR1cyAmIGFsYXJtKTsKKworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSywKKwkJfmFsYXJtICYgWEFEQ19aWU5RX0lOVF9BTEFSTV9NQVNLKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YWRjX29wcyB4YWRjX3p5bnFfb3BzID0geworCS5yZWFkID0geGFkY196eW5xX3JlYWRfYWRjX3JlZywKKwkud3JpdGUgPSB4YWRjX3p5bnFfd3JpdGVfYWRjX3JlZywKKwkuc2V0dXAgPSB4YWRjX3p5bnFfc2V0dXAsCisJLmdldF9kY2xrX3JhdGUgPSB4YWRjX3p5bnFfZ2V0X2RjbGtfcmF0ZSwKKwkuaW50ZXJydXB0X2hhbmRsZXIgPSB4YWRjX3p5bnFfaW50ZXJydXB0X2hhbmRsZXIsCisJLnRocmVhZGVkX2ludGVycnVwdF9oYW5kbGVyID0geGFkY196eW5xX3RocmVhZGVkX2ludGVycnVwdF9oYW5kbGVyLAorCS51cGRhdGVfYWxhcm0gPSB4YWRjX3p5bnFfdXBkYXRlX2FsYXJtLAorfTsKKworc3RhdGljIGludCB4YWRjX2F4aV9yZWFkX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgKnZhbCkKK3sKKwl1aW50MzJfdCB2YWwzMjsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19BWElfQURDX1JFR19PRkZTRVQgKyByZWcgKiA0LCAmdmFsMzIpOworCSp2YWwgPSB2YWwzMiAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhZGNfYXhpX3dyaXRlX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgdmFsKQoreworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX0FEQ19SRUdfT0ZGU0VUICsgcmVnICogNCwgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhZGNfYXhpX3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX0FYSV9SRUdfUkVTRVQsIFhBRENfQVhJX1JFU0VUX01BR0lDKTsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX0FYSV9SRUdfR0lFUiwgWEFEQ19BWElfR0lFUl9FTkFCTEUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4YWRjX2F4aV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2aWQ7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVpbnQzMl90IHN0YXR1cywgbWFzazsKKwl1bnNpZ25lZCBpbnQgZXZlbnRzOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX0FYSV9SRUdfSVBJU1IsICZzdGF0dXMpOworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSUVSLCAmbWFzayk7CisJc3RhdHVzICY9IG1hc2s7CisKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKChzdGF0dXMgJiBYQURDX0FYSV9JTlRfRU9TKSAmJiB4YWRjLT50cmlnZ2VyKQorCQlpaW9fdHJpZ2dlcl9wb2xsKHhhZGMtPnRyaWdnZXIsIDApOworCisJaWYgKHN0YXR1cyAmIFhBRENfQVhJX0lOVF9BTEFSTV9NQVNLKSB7CisJCS8qCisJCSAqIFRoZSBvcmRlciBvZiB0aGUgYml0cyBpbiB0aGUgQVhJLVhBREMgc3RhdHVzIHJlZ2lzdGVyIGRvZXMKKwkJICogbm90IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYml0cyBpbiB0aGUgWEFEQyBhbGFybSBlbmFibGUKKwkJICogcmVnaXN0ZXIuIHhhZGNfaGFuZGxlX2V2ZW50cygpIGV4cGVjdHMgdGhlIGV2ZW50cyB0byBiZSBpbgorCQkgKiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgWEFEQyBhbGFybSBlbmFibGUgcmVnaXN0ZXIuCisJCSAqLworCQlldmVudHMgPSAoc3RhdHVzICYgMHgwMDBlKSA+PiAxOworCQlldmVudHMgfD0gKHN0YXR1cyAmIDB4MDAwMSkgPDwgMzsKKwkJZXZlbnRzIHw9IChzdGF0dXMgJiAweDNjMDApID4+IDY7CisJCXhhZGNfaGFuZGxlX2V2ZW50cyhpbmRpb19kZXYsIGV2ZW50cyk7CisJfQorCisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSVNSLCBzdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCB4YWRjX2F4aV91cGRhdGVfYWxhcm0oc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBhbGFybSkKK3sKKwl1aW50MzJfdCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogVGhlIG9yZGVyIG9mIHRoZSBiaXRzIGluIHRoZSBBWEktWEFEQyBzdGF0dXMgcmVnaXN0ZXIgZG9lcyBub3QgbWF0Y2gKKwkgKiB0aGUgb3JkZXIgb2YgdGhlIGJpdHMgaW4gdGhlIFhBREMgYWxhcm0gZW5hYmxlIHJlZ2lzdGVyLiBXZSBnZXQKKwkgKiBwYXNzZWQgdGhlIGFsYXJtIG1hc2sgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlIFhBREMgYWxhcm0gZW5hYmxlCisJICogcmVnaXN0ZXIuCisJICovCisJYWxhcm0gPSAoKGFsYXJtICYgMHgwNykgPDwgMSkgfCAoKGFsYXJtICYgMHgwOCkgPj4gMykgfAorCQkJKChhbGFybSAmIDB4ZjApIDw8IDYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgJnZhbCk7CisJdmFsICY9IH5YQURDX0FYSV9JTlRfQUxBUk1fTUFTSzsKKwl2YWwgfD0gYWxhcm07CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSUVSLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGFkY19heGlfZ2V0X2RjbGsoc3RydWN0IHhhZGMgKnhhZGMpCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZSh4YWRjLT5jbGspOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHhhZGNfb3BzIHhhZGNfYXhpX29wcyA9IHsKKwkucmVhZCA9IHhhZGNfYXhpX3JlYWRfYWRjX3JlZywKKwkud3JpdGUgPSB4YWRjX2F4aV93cml0ZV9hZGNfcmVnLAorCS5zZXR1cCA9IHhhZGNfYXhpX3NldHVwLAorCS5nZXRfZGNsa19yYXRlID0geGFkY19heGlfZ2V0X2RjbGssCisJLnVwZGF0ZV9hbGFybSA9IHhhZGNfYXhpX3VwZGF0ZV9hbGFybSwKKwkuaW50ZXJydXB0X2hhbmRsZXIgPSB4YWRjX2F4aV9pbnRlcnJ1cHRfaGFuZGxlciwKKwkuZmxhZ3MgPSBYQURDX0ZMQUdTX0JVRkZFUkVELAorfTsKKworc3RhdGljIGludCBfeGFkY191cGRhdGVfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCBtYXNrLCB1aW50MTZfdCB2YWwpCit7CisJdWludDE2X3QgdG1wOworCWludCByZXQ7CisKKwlyZXQgPSBfeGFkY19yZWFkX2FkY19yZWcoeGFkYywgcmVnLCAmdG1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIF94YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgcmVnLCAodG1wICYgfm1hc2spIHwgdmFsKTsKK30KKworc3RhdGljIGludCB4YWRjX3VwZGF0ZV9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90IG1hc2ssIHVpbnQxNl90IHZhbCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCXJldCA9IF94YWRjX3VwZGF0ZV9hZGNfcmVnKHhhZGMsIHJlZywgbWFzaywgdmFsKTsKKwltdXRleF91bmxvY2soJnhhZGMtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhhZGNfZ2V0X2RjbGtfcmF0ZShzdHJ1Y3QgeGFkYyAqeGFkYykKK3sKKwlyZXR1cm4geGFkYy0+b3BzLT5nZXRfZGNsa19yYXRlKHhhZGMpOworfQorCitzdGF0aWMgaW50IHhhZGNfdXBkYXRlX3NjYW5fbW9kZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHVuc2lnbmVkIGxvbmcgKm1hc2spCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBuOworCisJbiA9IGJpdG1hcF93ZWlnaHQobWFzaywgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKTsKKworCWtmcmVlKHhhZGMtPmRhdGEpOworCXhhZGMtPmRhdGEgPSBrY2FsbG9jKG4sIHNpemVvZigqeGFkYy0+ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICgheGFkYy0+ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4YWRjX3NjYW5faW5kZXhfdG9fY2hhbm5lbCh1bnNpZ25lZCBpbnQgc2Nhbl9pbmRleCkKK3sKKwlzd2l0Y2ggKHNjYW5faW5kZXgpIHsKKwljYXNlIDU6CisJCXJldHVybiBYQURDX1JFR19WQ0NQSU5UOworCWNhc2UgNjoKKwkJcmV0dXJuIFhBRENfUkVHX1ZDQ1BBVVg7CisJY2FzZSA3OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDT19ERFI7CisJY2FzZSA4OgorCQlyZXR1cm4gWEFEQ19SRUdfVEVNUDsKKwljYXNlIDk6CisJCXJldHVybiBYQURDX1JFR19WQ0NJTlQ7CisJY2FzZSAxMDoKKwkJcmV0dXJuIFhBRENfUkVHX1ZDQ0FVWDsKKwljYXNlIDExOgorCQlyZXR1cm4gWEFEQ19SRUdfVlBWTjsKKwljYXNlIDEyOgorCQlyZXR1cm4gWEFEQ19SRUdfVlJFRlA7CisJY2FzZSAxMzoKKwkJcmV0dXJuIFhBRENfUkVHX1ZSRUZOOworCWNhc2UgMTQ6CisJCXJldHVybiBYQURDX1JFR19WQ0NCUkFNOworCWRlZmF1bHQ6CisJCXJldHVybiBYQURDX1JFR19WQVVYKHNjYW5faW5kZXggLSAxNik7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGFkY190cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwlpbnQgaSwgajsKKworCWlmICgheGFkYy0+ZGF0YSkKKwkJZ290byBvdXQ7CisKKwlqID0gMDsKKwlmb3JfZWFjaF9zZXRfYml0KGksIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaywKKwkJaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CisJCWNoYW4gPSB4YWRjX3NjYW5faW5kZXhfdG9fY2hhbm5lbChpKTsKKwkJeGFkY19yZWFkX2FkY19yZWcoeGFkYywgY2hhbiwgJnhhZGMtPmRhdGFbal0pOworCQlqKys7CisJfQorCisJaWlvX3B1c2hfdG9fYnVmZmVycyhpbmRpb19kZXYsIHhhZGMtPmRhdGEpOworCitvdXQ6CisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB4YWRjX3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ2dlciwgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWdnZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNvbnZzdDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCisJaWYgKHN0YXRlKSB7CisJCS8qIE9ubHkgb25lIG9mIHRoZSB0d28gdHJpZ2dlcnMgY2FuIGJlIGFjdGl2ZSBhdCB0aGUgYSB0aW1lLiAqLworCQlpZiAoeGFkYy0+dHJpZ2dlciAhPSBOVUxMKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0gZWxzZSB7CisJCQl4YWRjLT50cmlnZ2VyID0gdHJpZ2dlcjsKKwkJCWlmICh0cmlnZ2VyID09IHhhZGMtPmNvbnZzdF90cmlnZ2VyKQorCQkJCWNvbnZzdCA9IFhBRENfQ09ORjBfRUM7CisJCQllbHNlCisJCQkJY29udnN0ID0gMDsKKwkJfQorCQlyZXQgPSBfeGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgWEFEQ19DT05GMF9FQywKKwkJCQkJY29udnN0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX291dDsKKwl9IGVsc2UgeworCQl4YWRjLT50cmlnZ2VyID0gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGFkYy0+bG9jaywgZmxhZ3MpOworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSUVSLCAmdmFsKTsKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX0FYSV9SRUdfSVBJU1IsIHZhbCAmIFhBRENfQVhJX0lOVF9FT1MpOworCWlmIChzdGF0ZSkKKwkJdmFsIHw9IFhBRENfQVhJX0lOVF9FT1M7CisJZWxzZQorCQl2YWwgJj0gflhBRENfQVhJX0lOVF9FT1M7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSUVSLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKKworZXJyX291dDoKKwltdXRleF91bmxvY2soJnhhZGMtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIHhhZGNfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gJnhhZGNfdHJpZ2dlcl9zZXRfc3RhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGlpb190cmlnZ2VyICp4YWRjX2FsbG9jX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZzsKKwlpbnQgcmV0OworCisJdHJpZyA9IGlpb190cmlnZ2VyX2FsbG9jKCIlcyVkLSVzIiwgaW5kaW9fZGV2LT5uYW1lLAorCQkJCWluZGlvX2Rldi0+aWQsIG5hbWUpOworCWlmICh0cmlnID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJdHJpZy0+ZGV2LnBhcmVudCA9IGluZGlvX2Rldi0+ZGV2LnBhcmVudDsKKwl0cmlnLT5vcHMgPSAmeGFkY190cmlnZ2VyX29wczsKKwlpaW9fdHJpZ2dlcl9zZXRfZHJ2ZGF0YSh0cmlnLCBpaW9fcHJpdihpbmRpb19kZXYpKTsKKworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHRyaWcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCisJcmV0dXJuIHRyaWc7CisKK2Vycm9yX2ZyZWVfdHJpZzoKKwlpaW9fdHJpZ2dlcl9mcmVlKHRyaWcpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgeGFkY19wb3dlcl9hZGNfYihzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHNlcV9tb2RlKQoreworCXVpbnQxNl90IHZhbDsKKworCXN3aXRjaCAoc2VxX21vZGUpIHsKKwljYXNlIFhBRENfQ09ORjFfU0VRX1NJTVVMVEFORU9VUzoKKwljYXNlIFhBRENfQ09ORjFfU0VRX0lOREVQRU5ERU5UOgorCQl2YWwgPSBYQURDX0NPTkYyX1BEX0FEQ19COworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMiwgWEFEQ19DT05GMl9QRF9NQVNLLAorCQl2YWwpOworfQorCitzdGF0aWMgaW50IHhhZGNfZ2V0X3NlcV9tb2RlKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBsb25nIHNjYW5fbW9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgYXV4X3NjYW5fbW9kZSA9IHNjYW5fbW9kZSA+PiAxNjsKKworCWlmICh4YWRjLT5leHRlcm5hbF9tdXhfbW9kZSA9PSBYQURDX0VYVEVSTkFMX01VWF9EVUFMKQorCQlyZXR1cm4gWEFEQ19DT05GMV9TRVFfU0lNVUxUQU5FT1VTOworCisJaWYgKChhdXhfc2Nhbl9tb2RlICYgMHhmZjAwKSA9PSAwIHx8CisJCShhdXhfc2Nhbl9tb2RlICYgMHgwMGZmKSA9PSAwKQorCQlyZXR1cm4gWEFEQ19DT05GMV9TRVFfQ09OVElOVU9VUzsKKworCXJldHVybiBYQURDX0NPTkYxX1NFUV9TSU1VTFRBTkVPVVM7Cit9CisKK3N0YXRpYyBpbnQgeGFkY19wb3N0ZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHNjYW5fbWFzazsKKwlpbnQgcmV0OworCWludCBpOworCisJc2Nhbl9tYXNrID0gMTsgLyogUnVuIGNhbGlicmF0aW9uIGFzIHBhcnQgb2YgdGhlIHNlcXVlbmNlICovCisJZm9yIChpID0gMDsgaSA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBpKyspCisJCXNjYW5fbWFzayB8PSBCSVQoaW5kaW9fZGV2LT5jaGFubmVsc1tpXS5zY2FuX2luZGV4KTsKKworCS8qIEVuYWJsZSBhbGwgY2hhbm5lbHMgYW5kIGNhbGlicmF0aW9uICovCisJcmV0ID0geGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1NFUSgwKSwgc2Nhbl9tYXNrICYgMHhmZmZmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1NFUSgxKSwgc2Nhbl9tYXNrID4+IDE2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgWEFEQ19DT05GMV9TRVFfTUFTSywKKwkJWEFEQ19DT05GMV9TRVFfQ09OVElOVU9VUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB4YWRjX3Bvd2VyX2FkY19iKHhhZGMsIFhBRENfQ09ORjFfU0VRX0NPTlRJTlVPVVMpOworfQorCitzdGF0aWMgaW50IHhhZGNfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9tYXNrOworCWludCBzZXFfbW9kZTsKKwlpbnQgcmV0OworCisJcmV0ID0geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgWEFEQ19DT05GMV9TRVFfTUFTSywKKwkJWEFEQ19DT05GMV9TRVFfREVGQVVMVCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlzY2FuX21hc2sgPSAqaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrOworCXNlcV9tb2RlID0geGFkY19nZXRfc2VxX21vZGUoeGFkYywgc2Nhbl9tYXNrKTsKKworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19TRVEoMCksIHNjYW5fbWFzayAmIDB4ZmZmZik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfU0VRKDEpLCBzY2FuX21hc2sgPj4gMTYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0geGFkY19wb3dlcl9hZGNfYih4YWRjLCBzZXFfbW9kZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSB4YWRjX3VwZGF0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYxLCBYQURDX0NPTkYxX1NFUV9NQVNLLAorCQlzZXFfbW9kZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKK2VycjoKKwl4YWRjX3Bvc3RkaXNhYmxlKGluZGlvX2Rldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyB4YWRjX2J1ZmZlcl9vcHMgPSB7CisJLnByZWVuYWJsZSA9ICZ4YWRjX3ByZWVuYWJsZSwKKwkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCisJLnBvc3RkaXNhYmxlID0gJnhhZGNfcG9zdGRpc2FibGUsCit9OworCitzdGF0aWMgaW50IHhhZGNfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBpbmZvKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVpbnQxNl90IHZhbDE2OworCWludCByZXQ7CisKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSB4YWRjX3JlYWRfYWRjX3JlZyh4YWRjLCBjaGFuLT5hZGRyZXNzLCAmdmFsMTYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsMTYgPj49IDQ7CisJCWlmIChjaGFuLT5zY2FuX3R5cGUuc2lnbiA9PSAndScpCisJCQkqdmFsID0gdmFsMTY7CisJCWVsc2UKKwkJCSp2YWwgPSBzaWduX2V4dGVuZDMyKHZhbDE2LCAxMSk7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1ZPTFRBR0U6CisJCQkvKiBWID0gKHZhbCAqIDMuMCkgLyA0MDk2ICovCisJCQlzd2l0Y2ggKGNoYW4tPmFkZHJlc3MpIHsKKwkJCWNhc2UgWEFEQ19SRUdfVkNDSU5UOgorCQkJY2FzZSBYQURDX1JFR19WQ0NBVVg6CisJCQljYXNlIFhBRENfUkVHX1ZDQ0JSQU06CisJCQljYXNlIFhBRENfUkVHX1ZDQ1BJTlQ6CisJCQljYXNlIFhBRENfUkVHX1ZDQ1BBVVg6CisJCQljYXNlIFhBRENfUkVHX1ZDQ09fRERSOgorCQkJCSp2YWwgPSAzMDAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkqdmFsID0gMTAwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSp2YWwyID0gMTI7CisJCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJCWNhc2UgSUlPX1RFTVA6CisJCQkvKiBUZW1wIGluIEMgPSAodmFsICogNTAzLjk3NSkgLyA0MDk2IC0gMjczLjE1ICovCisJCQkqdmFsID0gNTAzOTc1OworCQkJKnZhbDIgPSAxMjsKKwkJCXJldHVybiBJSU9fVkFMX0ZSQUNUSU9OQUxfTE9HMjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJLyogT25seSB0aGUgdGVtcGVyYXR1cmUgY2hhbm5lbCBoYXMgYW4gb2Zmc2V0ICovCisJCSp2YWwgPSAtKCgyNzMxNTAgPDwgMTIpIC8gNTAzOTc1KTsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldCA9IHhhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYyLCAmdmFsMTYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkaXYgPSAodmFsMTYgJiBYQURDX0NPTkYyX0RJVl9NQVNLKSA+PiBYQURDX0NPTkYyX0RJVl9PRkZTRVQ7CisJCWlmIChkaXYgPCAyKQorCQkJZGl2ID0gMjsKKworCQkqdmFsID0geGFkY19nZXRfZGNsa19yYXRlKHhhZGMpIC8gZGl2IC8gMjY7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCB4YWRjX3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBpbmZvKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIGNsa19yYXRlID0geGFkY19nZXRfZGNsa19yYXRlKHhhZGMpOworCXVuc2lnbmVkIGludCBkaXY7CisKKwlpZiAoaW5mbyAhPSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFsIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWF4LiAxNTAga1NQUyAqLworCWlmICh2YWwgPiAxNTAwMDApCisJCXZhbCA9IDE1MDAwMDsKKworCXZhbCAqPSAyNjsKKworCS8qIE1pbiAxTUh6ICovCisJaWYgKHZhbCA8IDEwMDAwMDApCisJCXZhbCA9IDEwMDAwMDA7CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gcm91bmQgZG93biwgYnV0IG9ubHkgaWYgd2UgZG8gbm90IGV4Y2VlZCB0aGUgMTUwIGtTUFMKKwkgKiBsaW1pdC4KKwkgKi8KKwlkaXYgPSBjbGtfcmF0ZSAvIHZhbDsKKwlpZiAoY2xrX3JhdGUgLyBkaXYgLyAyNiA+IDE1MDAwMCkKKwkJZGl2Kys7CisJaWYgKGRpdiA8IDIpCisJCWRpdiA9IDI7CisJZWxzZSBpZiAoZGl2ID4gMHhmZikKKwkJZGl2ID0gMHhmZjsKKworCXJldHVybiB4YWRjX3VwZGF0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYyLCBYQURDX0NPTkYyX0RJVl9NQVNLLAorCQlkaXYgPDwgWEFEQ19DT05GMl9ESVZfT0ZGU0VUKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fZXZlbnRfc3BlYyB4YWRjX3RlbXBfZXZlbnRzW10gPSB7CisJeworCQkudHlwZSA9IElJT19FVl9UWVBFX1RIUkVTSCwKKwkJLmRpciA9IElJT19FVl9ESVJfUklTSU5HLAorCQkubWFza19zZXBhcmF0ZSA9IEJJVChJSU9fRVZfSU5GT19FTkFCTEUpIHwKKwkJCQlCSVQoSUlPX0VWX0lORk9fVkFMVUUpIHwKKwkJCQlCSVQoSUlPX0VWX0lORk9fSFlTVEVSRVNJUyksCisJfSwKK307CisKKy8qIFNlcGFyYXRlIHZhbHVlcyBmb3IgdXBwZXIgYW5kIGxvd2VyIHRocmVzaG9sZHMsIGJ1dCBvbmx5IGEgc2hhcmVkIGVuYWJsZWQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2V2ZW50X3NwZWMgeGFkY192b2x0YWdlX2V2ZW50c1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fRVZfVFlQRV9USFJFU0gsCisJCS5kaXIgPSBJSU9fRVZfRElSX1JJU0lORywKKwkJLm1hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0VWX0lORk9fVkFMVUUpLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fRVZfVFlQRV9USFJFU0gsCisJCS5kaXIgPSBJSU9fRVZfRElSX0ZBTExJTkcsCisJCS5tYXNrX3NlcGFyYXRlID0gQklUKElJT19FVl9JTkZPX1ZBTFVFKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0VWX1RZUEVfVEhSRVNILAorCQkuZGlyID0gSUlPX0VWX0RJUl9FSVRIRVIsCisJCS5tYXNrX3NlcGFyYXRlID0gQklUKElJT19FVl9JTkZPX0VOQUJMRSksCisJfSwKK307CisKKyNkZWZpbmUgWEFEQ19DSEFOX1RFTVAoX2NoYW4sIF9zY2FuX2luZGV4LCBfYWRkcikgeyBcCisJLnR5cGUgPSBJSU9fVEVNUCwgXAorCS5pbmRleGVkID0gMSwgXAorCS5jaGFubmVsID0gKF9jaGFuKSwgXAorCS5hZGRyZXNzID0gKF9hZGRyKSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgXAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfCBcCisJCUJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLmV2ZW50X3NwZWMgPSB4YWRjX3RlbXBfZXZlbnRzLCBcCisJLm51bV9ldmVudF9zcGVjcyA9IEFSUkFZX1NJWkUoeGFkY190ZW1wX2V2ZW50cyksIFwKKwkuc2Nhbl9pbmRleCA9IChfc2Nhbl9pbmRleCksIFwKKwkuc2Nhbl90eXBlID0geyBcCisJCS5zaWduID0gJ3UnLCBcCisJCS5yZWFsYml0cyA9IDEyLCBcCisJCS5zdG9yYWdlYml0cyA9IDE2LCBcCisJCS5zaGlmdCA9IDQsIFwKKwkJLmVuZGlhbm5lc3MgPSBJSU9fQ1BVLCBcCisJfSwgXAorfQorCisjZGVmaW5lIFhBRENfQ0hBTl9WT0xUQUdFKF9jaGFuLCBfc2Nhbl9pbmRleCwgX2FkZHIsIF9leHQsIF9hbGFybSkgeyBcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwgXAorCS5pbmRleGVkID0gMSwgXAorCS5jaGFubmVsID0gKF9jaGFuKSwgXAorCS5hZGRyZXNzID0gKF9hZGRyKSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgXAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLmV2ZW50X3NwZWMgPSAoX2FsYXJtKSA/IHhhZGNfdm9sdGFnZV9ldmVudHMgOiBOVUxMLCBcCisJLm51bV9ldmVudF9zcGVjcyA9IChfYWxhcm0pID8gQVJSQVlfU0laRSh4YWRjX3ZvbHRhZ2VfZXZlbnRzKSA6IDAsIFwKKwkuc2Nhbl9pbmRleCA9IChfc2Nhbl9pbmRleCksIFwKKwkuc2Nhbl90eXBlID0geyBcCisJCS5zaWduID0gJ3UnLCBcCisJCS5yZWFsYml0cyA9IDEyLCBcCisJCS5zdG9yYWdlYml0cyA9IDE2LCBcCisJCS5zaGlmdCA9IDQsIFwKKwkJLmVuZGlhbm5lc3MgPSBJSU9fQ1BVLCBcCisJfSwgXAorCS5leHRlbmRfbmFtZSA9IF9leHQsIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHhhZGNfY2hhbm5lbHNbXSA9IHsKKwlYQURDX0NIQU5fVEVNUCgwLCA4LCBYQURDX1JFR19URU1QKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgwLCA5LCBYQURDX1JFR19WQ0NJTlQsICJ2Y2NpbnQiLCB0cnVlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxLCAxMCwgWEFEQ19SRUdfVkNDSU5ULCAidmNjYXV4IiwgdHJ1ZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMiwgMTQsIFhBRENfUkVHX1ZDQ0JSQU0sICJ2Y2NicmFtIiwgdHJ1ZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMywgNSwgWEFEQ19SRUdfVkNDUElOVCwgInZjY3BpbnQiLCB0cnVlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg0LCA2LCBYQURDX1JFR19WQ0NQQVVYLCAidmNjcGF1eCIsIHRydWUpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDUsIDcsIFhBRENfUkVHX1ZDQ09fRERSLCAidmNjb2RkciIsIHRydWUpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDYsIDEyLCBYQURDX1JFR19WUkVGUCwgInZyZWZwIiwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDcsIDEzLCBYQURDX1JFR19WUkVGTiwgInZyZWZuIiwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDgsIDExLCBYQURDX1JFR19WUFZOLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoOSwgMTYsIFhBRENfUkVHX1ZBVVgoMCksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxMCwgMTcsIFhBRENfUkVHX1ZBVVgoMSksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxMSwgMTgsIFhBRENfUkVHX1ZBVVgoMiksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxMiwgMTksIFhBRENfUkVHX1ZBVVgoMyksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxMywgMjAsIFhBRENfUkVHX1ZBVVgoNCksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxNCwgMjEsIFhBRENfUkVHX1ZBVVgoNSksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxNSwgMjIsIFhBRENfUkVHX1ZBVVgoNiksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxNiwgMjMsIFhBRENfUkVHX1ZBVVgoNyksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxNywgMjQsIFhBRENfUkVHX1ZBVVgoOCksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxOCwgMjUsIFhBRENfUkVHX1ZBVVgoOSksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgxOSwgMjYsIFhBRENfUkVHX1ZBVVgoMTApLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMjAsIDI3LCBYQURDX1JFR19WQVVYKDExKSwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIxLCAyOCwgWEFEQ19SRUdfVkFVWCgxMiksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgyMiwgMjksIFhBRENfUkVHX1ZBVVgoMTMpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMjMsIDMwLCBYQURDX1JFR19WQVVYKDE0KSwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDI0LCAzMSwgWEFEQ19SRUdfVkFVWCgxNSksIE5VTEwsIGZhbHNlKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8geGFkY19pbmZvID0geworCS5yZWFkX3JhdyA9ICZ4YWRjX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAmeGFkY193cml0ZV9yYXcsCisJLnJlYWRfZXZlbnRfY29uZmlnID0gJnhhZGNfcmVhZF9ldmVudF9jb25maWcsCisJLndyaXRlX2V2ZW50X2NvbmZpZyA9ICZ4YWRjX3dyaXRlX2V2ZW50X2NvbmZpZywKKwkucmVhZF9ldmVudF92YWx1ZSA9ICZ4YWRjX3JlYWRfZXZlbnRfdmFsdWUsCisJLndyaXRlX2V2ZW50X3ZhbHVlID0gJnhhZGNfd3JpdGVfZXZlbnRfdmFsdWUsCisJLnVwZGF0ZV9zY2FuX21vZGUgPSAmeGFkY191cGRhdGVfc2Nhbl9tb2RlLAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4YWRjX29mX21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHp5bnEteGFkYy0xLjAwLmEiLCAodm9pZCAqKSZ4YWRjX3p5bnFfb3BzIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LGF4aS14YWRjLTEuMDAuYSIsICh2b2lkICopJnhhZGNfYXhpX29wcyB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4YWRjX29mX21hdGNoX3RhYmxlKTsKKworc3RhdGljIGludCB4YWRjX3BhcnNlX2R0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJdW5zaWduZWQgaW50ICpjb25mKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsICpjaGFuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hhbl9ub2RlLCAqY2hpbGQ7CisJdW5zaWduZWQgaW50IG51bV9jaGFubmVsczsKKwljb25zdCBjaGFyICpleHRlcm5hbF9tdXg7CisJdTMyIGV4dF9tdXhfY2hhbjsKKwlpbnQgcmVnOworCWludCByZXQ7CisKKwkqY29uZiA9IDA7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgInhsbngsZXh0ZXJuYWwtbXV4IiwgJmV4dGVybmFsX211eCk7CisJaWYgKHJldCA8IDAgfHwgc3RyY2FzZWNtcChleHRlcm5hbF9tdXgsICJub25lIikgPT0gMCkKKwkJeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPSBYQURDX0VYVEVSTkFMX01VWF9OT05FOworCWVsc2UgaWYgKHN0cmNhc2VjbXAoZXh0ZXJuYWxfbXV4LCAic2luZ2xlIikgPT0gMCkKKwkJeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPSBYQURDX0VYVEVSTkFMX01VWF9TSU5HTEU7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChleHRlcm5hbF9tdXgsICJkdWFsIikgPT0gMCkKKwkJeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPSBYQURDX0VYVEVSTkFMX01VWF9EVUFMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgIT0gWEFEQ19FWFRFUk5BTF9NVVhfTk9ORSkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInhsbngsZXh0ZXJuYWwtbXV4LWNoYW5uZWwiLAorCQkJCQkmZXh0X211eF9jaGFuKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWlmICh4YWRjLT5leHRlcm5hbF9tdXhfbW9kZSA9PSBYQURDX0VYVEVSTkFMX01VWF9TSU5HTEUpIHsKKwkJCWlmIChleHRfbXV4X2NoYW4gPT0gMCkKKwkJCQlleHRfbXV4X2NoYW4gPSBYQURDX1JFR19WUFZOOworCQkJZWxzZSBpZiAoZXh0X211eF9jaGFuIDw9IDE2KQorCQkJCWV4dF9tdXhfY2hhbiA9IFhBRENfUkVHX1ZBVVgoZXh0X211eF9jaGFuIC0gMSk7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlpZiAoZXh0X211eF9jaGFuID4gMCAmJiBleHRfbXV4X2NoYW4gPD0gOCkKKwkJCQlleHRfbXV4X2NoYW4gPSBYQURDX1JFR19WQVVYKGV4dF9tdXhfY2hhbiAtIDEpOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJKmNvbmYgfD0gWEFEQ19DT05GMF9NVVggfCBYQURDX0NPTkYwX0NIQU4oZXh0X211eF9jaGFuKTsKKwl9CisKKwljaGFubmVscyA9IGttZW1kdXAoeGFkY19jaGFubmVscywgc2l6ZW9mKHhhZGNfY2hhbm5lbHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW51bV9jaGFubmVscyA9IDk7CisJY2hhbiA9ICZjaGFubmVsc1s5XTsKKworCWNoYW5fbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAieGxueCxjaGFubmVscyIpOworCWlmIChjaGFuX25vZGUpIHsKKwkJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShjaGFuX25vZGUsIGNoaWxkKSB7CisJCQlpZiAobnVtX2NoYW5uZWxzID49IEFSUkFZX1NJWkUoeGFkY19jaGFubmVscykpIHsKKwkJCQlvZl9ub2RlX3B1dChjaGlsZCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAicmVnIiwgJnJlZyk7CisJCQlpZiAocmV0IHx8IHJlZyA+IDE2KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGNoaWxkLCAieGxueCxiaXBvbGFyIikpCisJCQkJY2hhbi0+c2Nhbl90eXBlLnNpZ24gPSAncyc7CisKKwkJCWlmIChyZWcgPT0gMCkgeworCQkJCWNoYW4tPnNjYW5faW5kZXggPSAxMTsKKwkJCQljaGFuLT5hZGRyZXNzID0gWEFEQ19SRUdfVlBWTjsKKwkJCX0gZWxzZSB7CisJCQkJY2hhbi0+c2Nhbl9pbmRleCA9IDE1ICsgcmVnOworCQkJCWNoYW4tPnNjYW5faW5kZXggPSBYQURDX1JFR19WQVVYKHJlZyAtIDEpOworCQkJfQorCQkJbnVtX2NoYW5uZWxzKys7CisJCQljaGFuKys7CisJCX0KKwl9CisJb2Zfbm9kZV9wdXQoY2hhbl9ub2RlKTsKKworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBrcmVhbGxvYyhjaGFubmVscywgc2l6ZW9mKCpjaGFubmVscykgKgorCQkJCQludW1fY2hhbm5lbHMsIEdGUF9LRVJORUwpOworCS8qIElmIHdlIGNhbid0IHJlc2l6ZSB0aGUgY2hhbm5lbHMgYXJyYXksIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCAqLworCWlmICghaW5kaW9fZGV2LT5jaGFubmVscykKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNoYW5uZWxzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGFkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJdW5zaWduZWQgaW50IGJpcG9sYXJfbWFzazsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl1bnNpZ25lZCBpbnQgY29uZjA7CisJc3RydWN0IHhhZGMgKnhhZGM7CisJaW50IHJldDsKKwlpbnQgaXJxOworCWludCBpOworCisJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZCA9IG9mX21hdGNoX25vZGUoeGFkY19vZl9tYXRjaF90YWJsZSwgcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmICghaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAtRU5YSU87CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp4YWRjKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJeGFkYy0+b3BzID0gaWQtPmRhdGE7CisJaW5pdF9jb21wbGV0aW9uKCZ4YWRjLT5jb21wbGV0aW9uKTsKKwltdXRleF9pbml0KCZ4YWRjLT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJnhhZGMtPmxvY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZ4YWRjLT56eW5xX3VubWFza193b3JrLCB4YWRjX3p5bnFfdW5tYXNrX3dvcmtlcik7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXhhZGMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKKwlpZiAoSVNfRVJSKHhhZGMtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih4YWRjLT5iYXNlKTsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5kaW9fZGV2LT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCWluZGlvX2Rldi0+bmFtZSA9ICJ4YWRjIjsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5pbmZvID0gJnhhZGNfaW5mbzsKKworCXJldCA9IHhhZGNfcGFyc2VfZHQoaW5kaW9fZGV2LCBwZGV2LT5kZXYub2Zfbm9kZSwgJmNvbmYwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZXZpY2VfZnJlZTsKKworCWlmICh4YWRjLT5vcHMtPmZsYWdzICYgWEFEQ19GTEFHU19CVUZGRVJFRCkgeworCQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsCisJCQkmaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsICZ4YWRjX3RyaWdnZXJfaGFuZGxlciwKKwkJCSZ4YWRjX2J1ZmZlcl9vcHMpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGV2aWNlX2ZyZWU7CisKKwkJeGFkYy0+Y29udnN0X3RyaWdnZXIgPSB4YWRjX2FsbG9jX3RyaWdnZXIoaW5kaW9fZGV2LCAiY29udnN0Iik7CisJCWlmIChJU19FUlIoeGFkYy0+Y29udnN0X3RyaWdnZXIpKQorCQkJZ290byBlcnJfdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwOworCQl4YWRjLT5zYW1wbGVyYXRlX3RyaWdnZXIgPSB4YWRjX2FsbG9jX3RyaWdnZXIoaW5kaW9fZGV2LAorCQkJInNhbXBsZXJhdGUiKTsKKwkJaWYgKElTX0VSUih4YWRjLT5zYW1wbGVyYXRlX3RyaWdnZXIpKQorCQkJZ290byBlcnJfZnJlZV9jb252c3RfdHJpZ2dlcjsKKwl9CisKKwl4YWRjLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUih4YWRjLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoeGFkYy0+Y2xrKTsKKwkJZ290byBlcnJfZnJlZV9zYW1wbGVyYXRlX3RyaWdnZXI7CisJfQorCWNsa19wcmVwYXJlX2VuYWJsZSh4YWRjLT5jbGspOworCisJcmV0ID0geGFkYy0+b3BzLT5zZXR1cChwZGV2LCBpbmRpb19kZXYsIGlycSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9zYW1wbGVyYXRlX3RyaWdnZXI7CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIHhhZGMtPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIsCisJCQkJeGFkYy0+b3BzLT50aHJlYWRlZF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkJCQkwLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jbGtfZGlzYWJsZV91bnByZXBhcmU7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeGFkY19yZWFkX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfVEhSRVNIT0xEKGkpLAorCQkJJnhhZGMtPnRocmVzaG9sZFtpXSk7CisKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjAsIGNvbmYwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCWJpcG9sYXJfbWFzayA9IDA7CisJZm9yIChpID0gMDsgaSA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJaWYgKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uc2Nhbl90eXBlLnNpZ24gPT0gJ3MnKQorCQkJYmlwb2xhcl9tYXNrIHw9IEJJVChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnNjYW5faW5kZXgpOworCX0KKworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19JTlBVVF9NT0RFKDApLCBiaXBvbGFyX21hc2spOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19JTlBVVF9NT0RFKDEpLAorCQliaXBvbGFyX21hc2sgPj4gMTYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJLyogRGlzYWJsZSBhbGwgYWxhcm1zICovCisJeGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgWEFEQ19DT05GMV9BTEFSTV9NQVNLLAorCQlYQURDX0NPTkYxX0FMQVJNX01BU0spOworCisJLyogU2V0IHRocmVzaG9sZHMgdG8gbWluL21heCAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCS8qCisJCSAqIFNldCBtYXggdm9sdGFnZSB0aHJlc2hvbGQgYW5kIGJvdGggdGVtcGVyYXR1cmUgdGhyZXNob2xkcyB0bworCQkgKiAweGZmZmYsIG1pbiB2b2x0YWdlIHRocmVzaG9sZCB0byAwLgorCQkgKi8KKwkJaWYgKGkgJSA4IDwgNCB8fCBpID09IDcpCisJCQl4YWRjLT50aHJlc2hvbGRbaV0gPSAweGZmZmY7CisJCWVsc2UKKwkJCXhhZGMtPnRocmVzaG9sZFtpXSA9IDA7CisJCXhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19USFJFU0hPTEQoaSksCisJCQl4YWRjLT50aHJlc2hvbGRbaV0pOworCX0KKworCS8qIEdvIHRvIG5vbi1idWZmZXJlZCBtb2RlICovCisJeGFkY19wb3N0ZGlzYWJsZShpbmRpb19kZXYpOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCBpbmRpb19kZXYpOworZXJyX2ZyZWVfc2FtcGxlcmF0ZV90cmlnZ2VyOgorCWlmICh4YWRjLT5vcHMtPmZsYWdzICYgWEFEQ19GTEFHU19CVUZGRVJFRCkKKwkJaWlvX3RyaWdnZXJfZnJlZSh4YWRjLT5zYW1wbGVyYXRlX3RyaWdnZXIpOworZXJyX2ZyZWVfY29udnN0X3RyaWdnZXI6CisJaWYgKHhhZGMtPm9wcy0+ZmxhZ3MgJiBYQURDX0ZMQUdTX0JVRkZFUkVEKQorCQlpaW9fdHJpZ2dlcl9mcmVlKHhhZGMtPmNvbnZzdF90cmlnZ2VyKTsKK2Vycl90cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXA6CisJaWYgKHhhZGMtPm9wcy0+ZmxhZ3MgJiBYQURDX0ZMQUdTX0JVRkZFUkVEKQorCQlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitlcnJfY2xrX2Rpc2FibGVfdW5wcmVwYXJlOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZSh4YWRjLT5jbGspOworZXJyX2RldmljZV9mcmVlOgorCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4YWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAoeGFkYy0+b3BzLT5mbGFncyAmIFhBRENfRkxBR1NfQlVGRkVSRUQpIHsKKwkJaWlvX3RyaWdnZXJfZnJlZSh4YWRjLT5zYW1wbGVyYXRlX3RyaWdnZXIpOworCQlpaW9fdHJpZ2dlcl9mcmVlKHhhZGMtPmNvbnZzdF90cmlnZ2VyKTsKKwkJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCX0KKwlmcmVlX2lycShpcnEsIGluZGlvX2Rldik7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHhhZGMtPmNsayk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmeGFkYy0+enlucV91bm1hc2tfd29yayk7CisJa2ZyZWUoeGFkYy0+ZGF0YSk7CisJa2ZyZWUoaW5kaW9fZGV2LT5jaGFubmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGFkY19kcml2ZXIgPSB7CisJLnByb2JlID0geGFkY19wcm9iZSwKKwkucmVtb3ZlID0geGFkY19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGFkYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB4YWRjX29mX21hdGNoX3RhYmxlLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4YWRjX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggWEFEQyBJSU8gZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMveGlsaW54LXhhZGMtZXZlbnRzLmMgYi9kcml2ZXJzL2lpby9hZGMveGlsaW54LXhhZGMtZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ZjBkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy1ldmVudHMuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIFhpbGlueCBYQURDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEzIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdWVuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9paW8vZXZlbnRzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSAieGlsaW54LXhhZGMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICp4YWRjX2V2ZW50X3RvX2NoYW5uZWwoCisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFhBRENfVEhSRVNIT0xEX09UX01BWDoKKwljYXNlIFhBRENfVEhSRVNIT0xEX1RFTVBfTUFYOgorCQlyZXR1cm4gJmluZGlvX2Rldi0+Y2hhbm5lbHNbMF07CisJY2FzZSBYQURDX1RIUkVTSE9MRF9WQ0NJTlRfTUFYOgorCWNhc2UgWEFEQ19USFJFU0hPTERfVkNDQVVYX01BWDoKKwkJcmV0dXJuICZpbmRpb19kZXYtPmNoYW5uZWxzW2V2ZW50XTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gJmluZGlvX2Rldi0+Y2hhbm5lbHNbZXZlbnQtMV07CisJfQorfQorCitzdGF0aWMgdm9pZCB4YWRjX2hhbmRsZV9ldmVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCBpbnQgZXZlbnQpCit7CisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW47CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCS8qIFRlbXBlcmF0dXJlIHRocmVzaG9sZCBlcnJvciwgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgeWV0ICovCisJaWYgKGV2ZW50ID09IDApCisJCXJldHVybjsKKworCWlmIChldmVudCA8IDQpCisJCW9mZnNldCA9IGV2ZW50OworCWVsc2UKKwkJb2Zmc2V0ID0gZXZlbnQgKyA0OworCisJY2hhbiA9IHhhZGNfZXZlbnRfdG9fY2hhbm5lbChpbmRpb19kZXYsIGV2ZW50KTsKKworCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCS8qCisJCSAqIFRoZSB0ZW1wZXJhdHVyZSBjaGFubmVsIG9ubHkgc3VwcG9ydHMgb3Zlci10ZW1wZXJhdHVyZQorCQkgKiBldmVudHMuCisJCSAqLworCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQlJSU9fVU5NT0RfRVZFTlRfQ09ERShjaGFuLT50eXBlLCBjaGFuLT5jaGFubmVsLAorCQkJCUlJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9SSVNJTkcpLAorCQkJaWlvX2dldF90aW1lX25zKCkpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZvciBvdGhlciBjaGFubmVscyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgaXQgaXMgYSB1cHBlciBvcgorCQkgKiBsb3dlciB0aHJlc2hvbGQgZXZlbnQuIFVzZXJzcGFjZSB3aWxsIGhhdmUgdG8gY2hlY2sgdGhlCisJCSAqIGNoYW5uZWwgdmFsdWUgaWYgaXQgd2FudHMgdG8ga25vdy4KKwkJICovCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCUlJT19VTk1PRF9FVkVOVF9DT0RFKGNoYW4tPnR5cGUsIGNoYW4tPmNoYW5uZWwsCisJCQkJSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX0VJVEhFUiksCisJCQlpaW9fZ2V0X3RpbWVfbnMoKSk7CisJfQorfQorCit2b2lkIHhhZGNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCBsb25nIGV2ZW50cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvcl9lYWNoX3NldF9iaXQoaSwgJmV2ZW50cywgOCkKKwkJeGFkY19oYW5kbGVfZXZlbnQoaW5kaW9fZGV2LCBpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHhhZGNfZ2V0X3RocmVzaG9sZF9vZmZzZXQoY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApIHsKKwkJb2Zmc2V0ID0gWEFEQ19USFJFU0hPTERfT1RfTUFYOworCX0gZWxzZSB7CisJCWlmIChjaGFuLT5jaGFubmVsIDwgMikKKwkJCW9mZnNldCA9IGNoYW4tPmNoYW5uZWwgKyAxOworCQllbHNlCisJCQlvZmZzZXQgPSBjaGFuLT5jaGFubmVsICsgNjsKKwl9CisKKwlpZiAoZGlyID09IElJT19FVl9ESVJfRkFMTElORykKKwkJb2Zmc2V0ICs9IDQ7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHhhZGNfZ2V0X2FsYXJtX21hc2soY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4pCit7CisJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApIHsKKwkJcmV0dXJuIFhBRENfQUxBUk1fT1RfTUFTSzsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGNoYW4tPmNoYW5uZWwpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIFhBRENfQUxBUk1fVkNDSU5UX01BU0s7CisJCWNhc2UgMToKKwkJCXJldHVybiBYQURDX0FMQVJNX1ZDQ0FVWF9NQVNLOworCQljYXNlIDI6CisJCQlyZXR1cm4gWEFEQ19BTEFSTV9WQ0NCUkFNX01BU0s7CisJCWNhc2UgMzoKKwkJCXJldHVybiBYQURDX0FMQVJNX1ZDQ1BJTlRfTUFTSzsKKwkJY2FzZSA0OgorCQkJcmV0dXJuIFhBRENfQUxBUk1fVkNDUEFVWF9NQVNLOworCQljYXNlIDU6CisJCQlyZXR1cm4gWEFEQ19BTEFSTV9WQ0NPRERSX01BU0s7CisJCWRlZmF1bHQ6CisJCQkvKiBXZSB3aWxsIG5ldmVyIGdldCBoZXJlICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKworaW50IHhhZGNfcmVhZF9ldmVudF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIChib29sKSh4YWRjLT5hbGFybV9tYXNrICYgeGFkY19nZXRfYWxhcm1fbWFzayhjaGFuKSk7Cit9CisKK2ludCB4YWRjX3dyaXRlX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpciwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGludCBhbGFybSA9IHhhZGNfZ2V0X2FsYXJtX21hc2soY2hhbik7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVpbnQxNl90IGNmZywgb2xkX2NmZzsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCisJaWYgKHN0YXRlKQorCQl4YWRjLT5hbGFybV9tYXNrIHw9IGFsYXJtOworCWVsc2UKKwkJeGFkYy0+YWxhcm1fbWFzayAmPSB+YWxhcm07CisKKwl4YWRjLT5vcHMtPnVwZGF0ZV9hbGFybSh4YWRjLCB4YWRjLT5hbGFybV9tYXNrKTsKKworCXJldCA9IF94YWRjX3JlYWRfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgJmNmZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0OworCisJb2xkX2NmZyA9IGNmZzsKKwljZmcgfD0gWEFEQ19DT05GMV9BTEFSTV9NQVNLOworCWNmZyAmPSB+KCh4YWRjLT5hbGFybV9tYXNrICYgMHhmMCkgPDwgNCk7IC8qIGJyYW0sIHBpbnQsIHBhdXgsIGRkciAqLworCWNmZyAmPSB+KCh4YWRjLT5hbGFybV9tYXNrICYgMHgwOCkgPj4gMyk7IC8qIG90ICovCisJY2ZnICY9IH4oKHhhZGMtPmFsYXJtX21hc2sgJiAweDA3KSA8PCAxKTsgLyogdGVtcCwgdmNjaW50LCB2Y2NhdXggKi8KKwlpZiAob2xkX2NmZyAhPSBjZmcpCisJCXJldCA9IF94YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIGNmZyk7CisKK2Vycl9vdXQ6CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdpc3RlciB2YWx1ZSBpcyBtc2IgYWxpZ25lZCwgdGhlIGxvd2VyIDQgYml0cyBhcmUgaWdub3JlZCAqLworI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQUxVRV9TSElGVCA0CisKK2ludCB4YWRjX3JlYWRfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGVudW0gaWlvX2V2ZW50X2luZm8gaW5mbywKKwlpbnQgKnZhbCwgaW50ICp2YWwyKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSB4YWRjX2dldF90aHJlc2hvbGRfb2Zmc2V0KGNoYW4sIGRpcik7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fRVZfSU5GT19WQUxVRToKKwkJKnZhbCA9IHhhZGMtPnRocmVzaG9sZFtvZmZzZXRdOworCQlicmVhazsKKwljYXNlIElJT19FVl9JTkZPX0hZU1RFUkVTSVM6CisJCSp2YWwgPSB4YWRjLT50ZW1wX2h5c3RlcmVzaXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSp2YWwgPj49IFhBRENfVEhSRVNIT0xEX1ZBTFVFX1NISUZUOworCisJcmV0dXJuIElJT19WQUxfSU5UOworfQorCitpbnQgeGFkY193cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpciwgZW51bSBpaW9fZXZlbnRfaW5mbyBpbmZvLAorCWludCB2YWwsIGludCB2YWwyKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSB4YWRjX2dldF90aHJlc2hvbGRfb2Zmc2V0KGNoYW4sIGRpcik7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSAwOworCisJdmFsIDw8PSBYQURDX1RIUkVTSE9MRF9WQUxVRV9TSElGVDsKKworCWlmICh2YWwgPCAwIHx8IHZhbCA+IDB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIElJT19FVl9JTkZPX1ZBTFVFOgorCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0XSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fRVZfSU5GT19IWVNURVJFU0lTOgorCQl4YWRjLT50ZW1wX2h5c3RlcmVzaXMgPSB2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fVEVNUCkgeworCQkvKgorCQkgKiBBY2NvcmRpbmcgdG8gdGhlIGRhdGFzaGVldCB3ZSBuZWVkIHRvIHNldCB0aGUgbG93ZXIgNCBiaXRzIHRvCisJCSAqIDB4Mywgb3RoZXJ3aXNlIDEyNSBkZWdyZWUgY2Vsc2l1cyB3aWxsIGJlIHVzZWQgYXMgdGhlCisJCSAqIHRocmVzaG9sZC4KKwkJICovCisJCXZhbCB8PSAweDM7CisKKwkJLyoKKwkJICogU2luY2Ugd2Ugc3RvcmUgdGhlIGh5c3RlcmVzaXMgYXMgcmVsYXRpdmUgKHRvIHRoZSB0aHJlc2hvbGQpCisJCSAqIHZhbHVlLCBidXQgdGhlIGhhcmR3YXJlIGV4cGVjdHMgYW4gYWJzb2x1dGUgdmFsdWUgd2UgbmVlZCB0bworCQkgKiByZWNhbGN1YWx0ZSB0aGlzIHZhbHVlIHdoZW5ldmVyIHRoZSBoeXN0ZXJlc2lzIG9yIHRoZQorCQkgKiB0aHJlc2hvbGQgY2hhbmdlcy4KKwkJICovCisJCWlmICh4YWRjLT50aHJlc2hvbGRbb2Zmc2V0XSA8IHhhZGMtPnRlbXBfaHlzdGVyZXNpcykKKwkJCXhhZGMtPnRocmVzaG9sZFtvZmZzZXQgKyA0XSA9IDA7CisJCWVsc2UKKwkJCXhhZGMtPnRocmVzaG9sZFtvZmZzZXQgKyA0XSA9IHhhZGMtPnRocmVzaG9sZFtvZmZzZXRdIC0KKwkJCQkJeGFkYy0+dGVtcF9oeXN0ZXJlc2lzOworCQlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1RIUkVTSE9MRChvZmZzZXQgKyA0KSwKKwkJCXhhZGMtPnRocmVzaG9sZFtvZmZzZXQgKyA0XSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKGluZm8gPT0gSUlPX0VWX0lORk9fVkFMVUUpCisJCXJldCA9IF94YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfVEhSRVNIT0xEKG9mZnNldCksIHZhbCk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLmggYi9kcml2ZXJzL2lpby9hZGMveGlsaW54LXhhZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ4N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBYaWxpbnggWEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaWZuZGVmIF9fSUlPX1hJTElOWF9YQURDX18KKyNkZWZpbmUgX19JSU9fWElMSU5YX1hBRENfXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCitzdHJ1Y3QgaWlvX2RldjsKK3N0cnVjdCBjbGs7CitzdHJ1Y3QgeGFkY19vcHM7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworCit2b2lkIHhhZGNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCBsb25nIGV2ZW50cyk7CisKK2ludCB4YWRjX3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyKTsKK2ludCB4YWRjX3dyaXRlX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpciwgaW50IHN0YXRlKTsKK2ludCB4YWRjX3JlYWRfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGVudW0gaWlvX2V2ZW50X2luZm8gaW5mbywKKwlpbnQgKnZhbCwgaW50ICp2YWwyKTsKK2ludCB4YWRjX3dyaXRlX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyLCBlbnVtIGlpb19ldmVudF9pbmZvIGluZm8sCisJaW50IHZhbCwgaW50IHZhbDIpOworCitlbnVtIHhhZGNfZXh0ZXJuYWxfbXV4X21vZGUgeworCVhBRENfRVhURVJOQUxfTVVYX05PTkUsCisJWEFEQ19FWFRFUk5BTF9NVVhfU0lOR0xFLAorCVhBRENfRVhURVJOQUxfTVVYX0RVQUwsCit9OworCitzdHJ1Y3QgeGFkYyB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBjbGsgKmNsazsKKworCWNvbnN0IHN0cnVjdCB4YWRjX29wcyAqb3BzOworCisJdWludDE2X3QgdGhyZXNob2xkWzE2XTsKKwl1aW50MTZfdCB0ZW1wX2h5c3RlcmVzaXM7CisJdW5zaWduZWQgaW50IGFsYXJtX21hc2s7CisKKwl1aW50MTZfdCAqZGF0YTsKKworCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ2dlcjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKmNvbnZzdF90cmlnZ2VyOworCXN0cnVjdCBpaW9fdHJpZ2dlciAqc2FtcGxlcmF0ZV90cmlnZ2VyOworCisJZW51bSB4YWRjX2V4dGVybmFsX211eF9tb2RlIGV4dGVybmFsX211eF9tb2RlOworCisJdW5zaWduZWQgaW50IHp5bnFfYWxhcm07CisJdW5zaWduZWQgaW50IHp5bnFfbWFza2VkX2FsYXJtOworCXVuc2lnbmVkIGludCB6eW5xX2ludG1hc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayB6eW5xX3VubWFza193b3JrOworCisJc3RydWN0IG11dGV4IG11dGV4OworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Cit9OworCitzdHJ1Y3QgeGFkY19vcHMgeworCWludCAoKnJlYWQpKHN0cnVjdCB4YWRjICosIHVuc2lnbmVkIGludCwgdWludDE2X3QgKik7CisJaW50ICgqd3JpdGUpKHN0cnVjdCB4YWRjICosIHVuc2lnbmVkIGludCwgdWludDE2X3QpOworCWludCAoKnNldHVwKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJaW50IGlycSk7CisJdm9pZCAoKnVwZGF0ZV9hbGFybSkoc3RydWN0IHhhZGMgKiwgdW5zaWduZWQgaW50KTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X2RjbGtfcmF0ZSkoc3RydWN0IHhhZGMgKik7CisJaXJxcmV0dXJuX3QgKCppbnRlcnJ1cHRfaGFuZGxlcikoaW50LCB2b2lkICopOworCWlycXJldHVybl90ICgqdGhyZWFkZWRfaW50ZXJydXB0X2hhbmRsZXIpKGludCwgdm9pZCAqKTsKKworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IF94YWRjX3JlYWRfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCAqdmFsKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnhhZGMtPm11dGV4KTsKKwlyZXR1cm4geGFkYy0+b3BzLT5yZWFkKHhhZGMsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX3hhZGNfd3JpdGVfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCB2YWwpCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmeGFkYy0+bXV0ZXgpOworCXJldHVybiB4YWRjLT5vcHMtPndyaXRlKHhhZGMsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGFkY19yZWFkX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCXJldCA9IF94YWRjX3JlYWRfYWRjX3JlZyh4YWRjLCByZWcsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGFkY193cml0ZV9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90IHZhbCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCXJldCA9IF94YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgcmVnLCB2YWwpOworCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFhBREMgaGFyZG1hY3JvIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFhBRENfUkVHX1RFTVAJCTB4MDAKKyNkZWZpbmUgWEFEQ19SRUdfVkNDSU5UCQkweDAxCisjZGVmaW5lIFhBRENfUkVHX1ZDQ0FVWAkJMHgwMgorI2RlZmluZSBYQURDX1JFR19WUFZOCQkweDAzCisjZGVmaW5lIFhBRENfUkVHX1ZSRUZQCQkweDA0CisjZGVmaW5lIFhBRENfUkVHX1ZSRUZOCQkweDA1CisjZGVmaW5lIFhBRENfUkVHX1ZDQ0JSQU0JMHgwNgorCisjZGVmaW5lIFhBRENfUkVHX1ZDQ1BJTlQJMHgwZAorI2RlZmluZSBYQURDX1JFR19WQ0NQQVVYCTB4MGUKKyNkZWZpbmUgWEFEQ19SRUdfVkNDT19ERFIJMHgwZgorI2RlZmluZSBYQURDX1JFR19WQVVYKHgpCSgweDEwICsgKHgpKQorCisjZGVmaW5lIFhBRENfUkVHX01BWF9URU1QCTB4MjAKKyNkZWZpbmUgWEFEQ19SRUdfTUFYX1ZDQ0lOVAkweDIxCisjZGVmaW5lIFhBRENfUkVHX01BWF9WQ0NBVVgJMHgyMgorI2RlZmluZSBYQURDX1JFR19NQVhfVkNDQlJBTQkweDIzCisjZGVmaW5lIFhBRENfUkVHX01JTl9URU1QCTB4MjQKKyNkZWZpbmUgWEFEQ19SRUdfTUlOX1ZDQ0lOVAkweDI1CisjZGVmaW5lIFhBRENfUkVHX01JTl9WQ0NBVVgJMHgyNgorI2RlZmluZSBYQURDX1JFR19NSU5fVkNDQlJBTQkweDI3CisjZGVmaW5lIFhBRENfUkVHX01BWF9WQ0NQSU5UCTB4MjgKKyNkZWZpbmUgWEFEQ19SRUdfTUFYX1ZDQ1BBVVgJMHgyOQorI2RlZmluZSBYQURDX1JFR19NQVhfVkNDT19ERFIJMHgyYQorI2RlZmluZSBYQURDX1JFR19NSU5fVkNDUElOVAkweDJiCisjZGVmaW5lIFhBRENfUkVHX01JTl9WQ0NQQVVYCTB4MmMKKyNkZWZpbmUgWEFEQ19SRUdfTUlOX1ZDQ09fRERSCTB4MmQKKworI2RlZmluZSBYQURDX1JFR19DT05GMAkJMHg0MAorI2RlZmluZSBYQURDX1JFR19DT05GMQkJMHg0MQorI2RlZmluZSBYQURDX1JFR19DT05GMgkJMHg0MgorI2RlZmluZSBYQURDX1JFR19TRVEoeCkJCSgweDQ4ICsgKHgpKQorI2RlZmluZSBYQURDX1JFR19JTlBVVF9NT0RFKHgpCSgweDRjICsgKHgpKQorI2RlZmluZSBYQURDX1JFR19USFJFU0hPTEQoeCkJKDB4NTAgKyAoeCkpCisKKyNkZWZpbmUgWEFEQ19SRUdfRkxBRwkJMHgzZgorCisjZGVmaW5lIFhBRENfQ09ORjBfRUMJCQlCSVQoOSkKKyNkZWZpbmUgWEFEQ19DT05GMF9BQ1EJCQlCSVQoOCkKKyNkZWZpbmUgWEFEQ19DT05GMF9NVVgJCQlCSVQoMTEpCisjZGVmaW5lIFhBRENfQ09ORjBfQ0hBTih4KQkJKHgpCisKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfTUFTSwkJKDB4ZiA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfREVGQVVMVAkJKDAgPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX1NJTkdMRV9QQVNTCSgxIDw8IDEyKQorI2RlZmluZSBYQURDX0NPTkYxX1NFUV9DT05USU5VT1VTCSgyIDw8IDEyKQorI2RlZmluZSBYQURDX0NPTkYxX1NFUV9TSU5HTEVfQ0hBTk5FTAkoMyA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfU0lNVUxUQU5FT1VTCSg0IDw8IDEyKQorI2RlZmluZSBYQURDX0NPTkYxX1NFUV9JTkRFUEVOREVOVAkoOCA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9BTEFSTV9NQVNLCQkweDBmMGYKKworI2RlZmluZSBYQURDX0NPTkYyX0RJVl9NQVNLCTB4ZmYwMAorI2RlZmluZSBYQURDX0NPTkYyX0RJVl9PRkZTRVQJOAorCisjZGVmaW5lIFhBRENfQ09ORjJfUERfTUFTSwkoMHgzIDw8IDQpCisjZGVmaW5lIFhBRENfQ09ORjJfUERfTk9ORQkoMHgwIDw8IDQpCisjZGVmaW5lIFhBRENfQ09ORjJfUERfQURDX0IJKDB4MiA8PCA0KQorI2RlZmluZSBYQURDX0NPTkYyX1BEX0JPVEgJKDB4MyA8PCA0KQorCisjZGVmaW5lIFhBRENfQUxBUk1fVEVNUF9NQVNLCQlCSVQoMCkKKyNkZWZpbmUgWEFEQ19BTEFSTV9WQ0NJTlRfTUFTSwkJQklUKDEpCisjZGVmaW5lIFhBRENfQUxBUk1fVkNDQVVYX01BU0sJCUJJVCgyKQorI2RlZmluZSBYQURDX0FMQVJNX09UX01BU0sJCUJJVCgzKQorI2RlZmluZSBYQURDX0FMQVJNX1ZDQ0JSQU1fTUFTSwkJQklUKDQpCisjZGVmaW5lIFhBRENfQUxBUk1fVkNDUElOVF9NQVNLCQlCSVQoNSkKKyNkZWZpbmUgWEFEQ19BTEFSTV9WQ0NQQVVYX01BU0sJCUJJVCg2KQorI2RlZmluZSBYQURDX0FMQVJNX1ZDQ09ERFJfTUFTSwkJQklUKDcpCisKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVEVNUF9NQVgJCTB4MAorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NJTlRfTUFYCTB4MQorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NBVVhfTUFYCTB4MgorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9PVF9NQVgJCTB4MworI2RlZmluZSBYQURDX1RIUkVTSE9MRF9URU1QX01JTgkJMHg0CisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ0lOVF9NSU4JMHg1CisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ0FVWF9NSU4JMHg2CisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX09UX01JTgkJMHg3CisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ0JSQU1fTUFYCTB4OAorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NQSU5UX01BWAkweDkKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDUEFVWF9NQVgJMHhhCisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ09ERFJfTUFYCTB4YgorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NCUkFNX01JTgkweGMKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDUElOVF9NSU4JMHhkCisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ1BBVVhfTUlOCTB4ZQorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NPRERSX01JTgkweGYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9idWZmZXJfY2IuYyBiL2RyaXZlcnMvaWlvL2J1ZmZlcl9jYi5jCmluZGV4IDJkOWM2ZjguLmViNDZlNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2J1ZmZlcl9jYi5jCisrKyBiL2RyaXZlcnMvaWlvL2J1ZmZlcl9jYi5jCkBAIC00NiwxMCArNDYsOCBAQAogCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbjsKIAogCWNiX2J1ZmYgPSBremFsbG9jKHNpemVvZigqY2JfYnVmZiksIEdGUF9LRVJORUwpOwotCWlmIChjYl9idWZmID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQorCWlmIChjYl9idWZmID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJaWlvX2J1ZmZlcl9pbml0KCZjYl9idWZmLT5idWZmZXIpOwogCkBAIC05MSw3ICs4OSw2IEBACiAJaWlvX2NoYW5uZWxfcmVsZWFzZV9hbGwoY2JfYnVmZi0+Y2hhbm5lbHMpOwogZXJyb3JfZnJlZV9jYl9idWZmOgogCWtmcmVlKGNiX2J1ZmYpOwotZXJyb3JfcmV0OgogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9nZXRfYWxsX2NiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9hZDczMDMuYyBiL2RyaXZlcnMvaWlvL2RhYy9hZDczMDMuYwppbmRleCBkMDUwNWZkLi5mYTI4MTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9kYWMvYWQ3MzAzLmMKKysrIGIvZHJpdmVycy9paW8vZGFjL2FkNzMwMy5jCkBAIC05Miw3ICs5Miw3IEBACiAJYWQ3MzAzX3dyaXRlKHN0LCBjaGFuLT5jaGFubmVsLCBzdC0+ZGFjX2NhY2hlW2NoYW4tPmNoYW5uZWxdKTsKIAogCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgaW50IGFkNzMwM19nZXRfdnJlZihzdHJ1Y3QgYWQ3MzAzX3N0YXRlICpzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9tYXg1MTcuYyBiL2RyaXZlcnMvaWlvL2RhYy9tYXg1MTcuYwppbmRleCBkZTc2ZTZhLi45YTgyYTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMKKysrIGIvZHJpdmVycy9paW8vZGFjL21heDUxNy5jCkBAIC0xOSw3ICsxOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL21jcDQ3MjUuYyBiL2RyaXZlcnMvaWlvL2RhYy9tY3A0NzI1LmMKaW5kZXggN2Q5ZjVjMy4uNDNkMTQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL21jcDQ3MjUuYworKysgYi9kcml2ZXJzL2lpby9kYWMvbWNwNDcyNS5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcKaW5kZXggNDYzYzRkOS4uZTExNmJkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9LY29uZmlnCkBAIC0xMiw0ICsxMiwxNCBAQAogCSAgT3RoZXIgc2Vuc29ycyBzaG91bGQgd29yayBhcyB3ZWxsIGFzIGxvbmcgYXMgdGhleSBzcGVhayB0aGUKIAkgIHNhbWUgcHJvdG9jb2wuCiAKK2NvbmZpZyBTSTcwMDUKKwl0cmlzdGF0ZSAiU0k3MDA1IHJlbGF0aXZlIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFNpbGFicyBTaTcwMDUgcmVsYXRpdmUKKwkgIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNpNzAwNS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9NYWtlZmlsZQppbmRleCBkNWQzNmMwLi5lM2YzZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9odW1pZGl0eS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9NYWtlZmlsZQpAQCAtMywzICszLDQgQEAKICMKIAogb2JqLSQoQ09ORklHX0RIVDExKSArPSBkaHQxMS5vCitvYmotJChDT05GSUdfU0k3MDA1KSArPSBzaTcwMDUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvc2k3MDA1LmMgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9zaTcwMDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQ1ODZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvc2k3MDA1LmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBzaTcwMDUuYyAtIFN1cHBvcnQgZm9yIFNpbGFicyBTaTcwMDUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KKyAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAoNy1iaXQgSTJDIHNsYXZlIGFkZHJlc3MgMHg0MCkKKyAqCisgKiBUT0RPOiBoZWF0ZXIsIGZhc3QgbW9kZSwgcHJvY2Vzc2VkIG1vZGUgKHRlbXAuIC8gbGluZWFyaXR5IGNvbXBlbnNhdGlvbikKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorCisjZGVmaW5lIFNJNzAwNV9TVEFUVVMgMHgwMAorI2RlZmluZSBTSTcwMDVfREFUQSAweDAxIC8qIDE2LWJpdCwgTVNCICovCisjZGVmaW5lIFNJNzAwNV9DT05GSUcgMHgwMworI2RlZmluZSBTSTcwMDVfSUQgMHgxMQorCisjZGVmaW5lIFNJNzAwNV9TVEFUVVNfTlJEWSBCSVQoMCkKKyNkZWZpbmUgU0k3MDA1X0NPTkZJR19URU1QIEJJVCg0KQorI2RlZmluZSBTSTcwMDVfQ09ORklHX1NUQVJUIEJJVCgwKQorCisjZGVmaW5lIFNJNzAwNV9JRF83MDA1IDB4NTAKKyNkZWZpbmUgU0k3MDA1X0lEXzcwMTUgMHhmMAorCitzdHJ1Y3Qgc2k3MDA1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTggY29uZmlnOworfTsKKworc3RhdGljIGludCBzaTcwMDVfcmVhZF9tZWFzdXJlbWVudChzdHJ1Y3Qgc2k3MDA1X2RhdGEgKmRhdGEsIGJvb2wgdGVtcCkKK3sKKwlpbnQgdHJpZXMgPSA1MDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgU0k3MDA1X0NPTkZJRywKKwkJZGF0YS0+Y29uZmlnIHwgU0k3MDA1X0NPTkZJR19TVEFSVCB8CisJCSh0ZW1wID8gU0k3MDA1X0NPTkZJR19URU1QIDogMCkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwl3aGlsZSAodHJpZXMtLSA+IDApIHsKKwkJbXNsZWVwKDIwKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgU0k3MDA1X1NUQVRVUyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCQlpZiAoIShyZXQgJiBTSTcwMDVfU1RBVFVTX05SRFkpKQorCQkJYnJlYWs7CisJfQorCWlmICh0cmllcyA8IDApIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChkYXRhLT5jbGllbnQsIFNJNzAwNV9EQVRBKTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaTcwMDVfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsCisJCQkgICAgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHNpNzAwNV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0ID0gc2k3MDA1X3JlYWRfbWVhc3VyZW1lbnQoZGF0YSwgY2hhbi0+dHlwZSA9PSBJSU9fVEVNUCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJldDsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApIHsKKwkJCSp2YWwgPSA3OworCQkJKnZhbDIgPSA4MTI1MDA7CisJCX0gZWxzZSB7CisJCQkqdmFsID0gMzsKKwkJCSp2YWwyID0gOTA2MjUwOworCQl9CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKQorCQkJKnZhbCA9IC01MCAqIDMyICogNDsKKwkJZWxzZQorCQkJKnZhbCA9IC0yNCAqIDE2ICogMTY7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpNzAwNV9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fSFVNSURJVFlSRUxBVElWRSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAorCQkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwKKwl9LAorCXsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAorCQkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHNpNzAwNV9pbmZvID0geworCS5yZWFkX3JhdyA9IHNpNzAwNV9yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBzaTcwMDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgc2k3MDA1X2RhdGEgKmRhdGE7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKCZjbGllbnQtPmRldik7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+aW5mbyA9ICZzaTcwMDVfaW5mbzsKKworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBzaTcwMDVfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHNpNzAwNV9jaGFubmVscyk7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBTSTcwMDVfSUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgIT0gU0k3MDA1X0lEXzcwMDUgJiYgcmV0ICE9IFNJNzAwNV9JRF83MDE1KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFNJNzAwNV9DT05GSUcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWRhdGEtPmNvbmZpZyA9IHJldDsKKworCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBpbmRpb19kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2k3MDA1X2lkW10gPSB7CisJeyAic2k3MDA1IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzaTcwMDVfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2k3MDA1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzaTcwMDUiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHNpNzAwNV9wcm9iZSwKKwkuaWRfdGFibGUgPSBzaTcwMDVfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoc2k3MDA1X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIE1lZXJ3YWxkIDxwbWVlcndAcG1lZXJ3Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2lsYWJzIFNpNzAwNSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW11L0tjb25maWcgYi9kcml2ZXJzL2lpby9pbXUvS2NvbmZpZwppbmRleCA2NjNlODhhLi4yYjBlNDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9pbXUvS2NvbmZpZwpAQCAtMjUsNiArMjUsOCBAQAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFESVMxNjM3NSwgQURJUzE2NDgwLAogCSAgQURJUzE2NDg1LCBBRElTMTY0ODggaW5lcnRpYWwgc2Vuc29ycy4KIAorc291cmNlICJkcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvS2NvbmZpZyIKKwogZW5kbWVudQogCiBjb25maWcgSUlPX0FESVNfTElCCkBAIC0zOCw1ICs0MCwzIEBACiAJaGVscAogCSAgQSBzZXQgb2YgYnVmZmVyIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBBbmFsb2cgRGV2aWNlcyBBRElTKiBkZXZpY2UKIAkgIGZhbWlseS4KLQotc291cmNlICJkcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jIGIvZHJpdmVycy9paW8vaW11L2FkaXMxNjQwMF9jb3JlLmMKaW5kZXggN2M1ODJmNy4uNDMzNTgzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2FkaXMxNjQwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2FkaXMxNjQwMF9jb3JlLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCXN0LT52YXJpYW50LT5zZXRfZnJlcShzdCwgdmFsKTsKIAltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCi0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiAvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYwppbmRleCBkZjdmMWUxLi5jYjlmOTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfY29yZS5jCkBAIC0xMiw3ICsxMiw2IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTExNyw3ICsxMTYsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCiAJaWYgKGVuKSB7Ci0JCS8qIFdhaXQgZm9yIG91dHB1dCBzdGFibGl6ZSAqLworCQkvKiBXYWl0IGZvciBvdXRwdXQgc3RhYmlsaXplICovCiAJCW1zbGVlcChJTlZfTVBVNjA1MF9URU1QX1VQX1RJTUUpOwogCQlpZiAoSU5WX01QVTYwNTBfQklUX1BXUl9HWVJPX1NUQlkgPT0gbWFzaykgewogCQkJLyogc3dpdGNoIGludGVybmFsIGNsb2NrIHRvIFBMTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmggYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9paW8uaAppbmRleCBmMzgzOTU1Li4wYWIzODJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9paW8uaAorKysgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9paW8uaApAQCAtMTI2LDM1ICsxMjYsMzUgQEAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX1NBTVBMRV9SQVRFX0RJViAgICAgMHgxOQogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfQ09ORklHICAgICAgICAgICAgICAweDFBCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19HWVJPX0NPTkZJRyAgICAgICAgIDB4MUIKLSNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0FDQ0VMX0NPTkZJRwkgICAgMHgxQworI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfQUNDRUxfQ09ORklHICAgICAgICAweDFDCiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0ZJRk9fRU4gICAgICAgICAgICAgMHgyMwotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfQUNDRUxfT1VUICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUU19HWVJPX09VVCAgICAgICAgICAgICAgICAgICAweDcwCisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9BQ0NFTF9PVVQgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUU19HWVJPX09VVCAgICAgICAgICAgMHg3MAogCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19JTlRfRU5BQkxFICAgICAgICAgIDB4MzgKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0RBVEFfUkRZX0VOICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9ETVBfSU5UX0VOICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfREFUQV9SRFlfRU4gICAgICAgICAweDAxCisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9ETVBfSU5UX0VOICAgICAgICAgIDB4MDIKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfUkFXX0FDQ0VMICAgICAgICAgICAweDNCCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19URU1QRVJBVFVSRSAgICAgICAgIDB4NDEKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX1JBV19HWVJPICAgICAgICAgICAgMHg0MwogCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19VU0VSX0NUUkwgICAgICAgICAgIDB4NkEKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0ZJRk9fUlNUICAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9ETVBfUlNUICAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfSTJDX01TVF9FTiAgICAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0ZJRk9fRU4gICAgICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9ETVBfRU4gICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRklGT19SU1QgICAgICAgICAgICAweDA0CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9ETVBfUlNUICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0kyQ19NU1RfRU4gICAgICAgICAgMHgyMAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRklGT19FTiAgICAgICAgICAgICAweDQwCisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9ETVBfRU4gICAgICAgICAgICAgIDB4ODAKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfUFdSX01HTVRfMSAgICAgICAgICAweDZCCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9IX1JFU0VUICAgICAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0NMS19NQVNLICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0hfUkVTRVQgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfU0xFRVAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9DTEtfTUFTSyAgICAgICAgICAgIDB4NwogCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19QV1JfTUdNVF8yICAgICAgICAgIDB4NkMKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1BXUl9BQ0NMX1NUQlkgICAgICAgICAgICAgICAweDM4Ci0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9QV1JfR1lST19TVEJZICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfUFdSX0FDQ0xfU1RCWSAgICAgICAweDM4CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9QV1JfR1lST19TVEJZICAgICAgIDB4MDcKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfRklGT19DT1VOVF9IICAgICAgICAweDcyCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19GSUZPX1JfVyAgICAgICAgICAgIDB4NzQKQEAgLTE4MCwxMCArMTgwLDEwIEBACiAKIC8qIGluaXQgcGFyYW1ldGVycyAqLwogI2RlZmluZSBJTlZfTVBVNjA1MF9JTklUX0ZJRk9fUkFURSAgICAgICAgICAgNTAKLSNkZWZpbmUgSU5WX01QVTYwNTBfVElNRV9TVEFNUF9UT1IgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIElOVl9NUFU2MDUwX01BWF9GSUZPX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAotI2RlZmluZSBJTlZfTVBVNjA1MF9NSU5fRklGT19SQVRFICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgSU5WX01QVTYwNTBfT05FX0tfSFogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIElOVl9NUFU2MDUwX1RJTUVfU1RBTVBfVE9SICAgICAgICAgICA1CisjZGVmaW5lIElOVl9NUFU2MDUwX01BWF9GSUZPX1JBVEUgICAgICAgICAgICAxMDAwCisjZGVmaW5lIElOVl9NUFU2MDUwX01JTl9GSUZPX1JBVEUgICAgICAgICAgICA0CisjZGVmaW5lIElOVl9NUFU2MDUwX09ORV9LX0haICAgICAgICAgICAgICAgICAxMDAwCiAKIC8qIHNjYW4gZWxlbWVudCBkZWZpbml0aW9uICovCiBlbnVtIGludl9tcHU2MDUwX3NjYW4gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfcmluZy5jIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfcmluZy5jCmluZGV4IDQyOTUxNzEuLjBjZDMwNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYworKysgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9yaW5nLmMKQEAgLTEyLDcgKzEyLDYgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCmluZGV4IGM2N2Q4M2IuLmUxMDhmMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQkJCSAgICAgJmluZGlvX2Rldi0+ZGV2LAogCQkJCSAgICAgJmJ1ZmZlci0+c2Nhbl9lbF9kZXZfYXR0cl9saXN0KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKKwkJcmV0dXJuIHJldDsKIAlhdHRyY291bnQrKzsKIAlyZXQgPSBfX2lpb19hZGRfY2hhbl9kZXZhdHRyKCJ0eXBlIiwKIAkJCQkgICAgIGNoYW4sCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKIAkJCQkgICAgICZidWZmZXItPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9yZXQ7CisJCXJldHVybiByZXQ7CiAJYXR0cmNvdW50Kys7CiAJaWYgKGNoYW4tPnR5cGUgIT0gSUlPX1RJTUVTVEFNUCkKIAkJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigiZW4iLApAQCAtMjk2LDEwICsyOTYsOSBAQAogCQkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKIAkJCQkJICAgICAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OworCQlyZXR1cm4gcmV0OwogCWF0dHJjb3VudCsrOwogCXJldCA9IGF0dHJjb3VudDsKLWVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NTMsMTMgKzU1MiwxMyBAQAogCQlpZiAoaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnByZWRpc2FibGUpIHsKIAkJCXJldCA9IGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wcmVkaXNhYmxlKGluZGlvX2Rldik7CiAJCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3JfcmV0OworCQkJCXJldHVybiByZXQ7CiAJCX0KIAkJaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9IElORElPX0RJUkVDVF9NT0RFOwogCQlpZiAoaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKSB7CiAJCQlyZXQgPSBpbmRpb19kZXYtPnNldHVwX29wcy0+cG9zdGRpc2FibGUoaW5kaW9fZGV2KTsKIAkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcl9yZXQ7CisJCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAkvKiBLZWVwIGEgY29weSBvZiBjdXJyZW50IHNldHVwIHRvIGFsbG93IHJvbGwgYmFjayAqLwpAQCAtNjEzLDcgKzYxMiw3IEBACiAJCQllbHNlIHsKIAkJCQlrZnJlZShjb21wb3VuZF9tYXNrKTsKIAkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyb3JfcmV0OworCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewpAQCAtNjk2LDEzICs2OTUsMTAgQEAKIAlpZiAoaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKQogCQlpbmRpb19kZXYtPnNldHVwX29wcy0+cG9zdGRpc2FibGUoaW5kaW9fZGV2KTsKIGVycm9yX3JlbW92ZV9pbnNlcnRlZDoKLQogCWlmIChpbnNlcnRfYnVmZmVyKQogCQlpaW9fYnVmZmVyX2RlYWN0aXZhdGUoaW5zZXJ0X2J1ZmZlcik7CiAJaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrID0gb2xkX21hc2s7CiAJa2ZyZWUoY29tcG91bmRfbWFzayk7Ci1lcnJvcl9yZXQ6Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYwppbmRleCBhY2M5MTFhLi5lZGUxNmFlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCkBAIC01NDAsNyArNTQwLDcgQEAKIAkJCSAgIGVudW0gaWlvX3NoYXJlZF9ieSBzaGFyZWRfYnkpCiB7CiAJaW50IHJldCA9IDA7Ci0JY2hhciAqbmFtZV9mb3JtYXQgPSBOVUxMOworCWNoYXIgKm5hbWUgPSBOVUxMOwogCWNoYXIgKmZ1bGxfcG9zdGZpeDsKIAlzeXNmc19hdHRyX2luaXQoJmRldl9hdHRyLT5hdHRyKTsKIApAQCAtNTU4LDcgKzU1OCw3IEBACiAJCQkJCQkJCSAgICAtPmNoYW5uZWwyXSwKIAkJCQkJCSBwb3N0Zml4KTsKIAl9IGVsc2UgewotCQlpZiAoY2hhbi0+ZXh0ZW5kX25hbWUgPT0gTlVMTCkKKwkJaWYgKGNoYW4tPmV4dGVuZF9uYW1lID09IE5VTEwgfHwgc2hhcmVkX2J5ICE9IElJT19TRVBBUkFURSkKIAkJCWZ1bGxfcG9zdGZpeCA9IGtzdHJkdXAocG9zdGZpeCwgR0ZQX0tFUk5FTCk7CiAJCWVsc2UKIAkJCWZ1bGxfcG9zdGZpeCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLApAQCAtNTcyLDE2ICs1NzIsMTUgQEAKIAlpZiAoY2hhbi0+ZGlmZmVyZW50aWFsKSB7IC8qIERpZmZlcmVudGlhbCBjYW4gbm90IGhhdmUgbW9kaWZpZXIgKi8KIAkJc3dpdGNoIChzaGFyZWRfYnkpIHsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX0FMTDoKLQkJCW5hbWVfZm9ybWF0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ1bGxfcG9zdGZpeCk7CisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ1bGxfcG9zdGZpeCk7CiAJCQlicmVhazsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX0RJUjoKLQkJCW5hbWVfZm9ybWF0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCiAJCQkJCQlpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCiAJCQkJCQlmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9UWVBFOgotCQkJbmFtZV9mb3JtYXQKLQkJCQk9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMtJXNfJXMiLAorCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMtJXNfJXMiLAogCQkJCQkgICAgaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCiAJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKQEAgLTU5Myw4ICs1OTIsNyBAQAogCQkJCXJldCA9IC1FSU5WQUw7CiAJCQkJZ290byBlcnJvcl9mcmVlX2Z1bGxfcG9zdGZpeDsKIAkJCX0KLQkJCW5hbWVfZm9ybWF0Ci0JCQkJPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKIAkJCQkJICAgICIlc18lcyVkLSVzJWRfJXMiLAogCQkJCQkgICAgaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCkBAIC02MDcsMTYgKzYwNSwxNSBAQAogCX0gZWxzZSB7IC8qIFNpbmdsZSBlbmRlZCAqLwogCQlzd2l0Y2ggKHNoYXJlZF9ieSkgewogCQljYXNlIElJT19TSEFSRURfQllfQUxMOgotCQkJbmFtZV9mb3JtYXQgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzIiwgZnVsbF9wb3N0Zml4KTsKKwkJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzIiwgZnVsbF9wb3N0Zml4KTsKIAkJCWJyZWFrOwogCQljYXNlIElJT19TSEFSRURfQllfRElSOgotCQkJbmFtZV9mb3JtYXQgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzIiwKKwkJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzIiwKIAkJCQkJCWlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJCWZ1bGxfcG9zdGZpeCk7CiAJCQlicmVhazsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX1RZUEU6Ci0JCQluYW1lX2Zvcm1hdAotCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc18lcyIsCisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc18lcyIsCiAJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCiAJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKIAkJCQkJICAgIGZ1bGxfcG9zdGZpeCk7CkBAIC02MjQsMzMgKzYyMSwyNCBAQAogCiAJCWNhc2UgSUlPX1NFUEFSQVRFOgogCQkJaWYgKGNoYW4tPmluZGV4ZWQpCi0JCQkJbmFtZV9mb3JtYXQKLQkJCQkJPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzJWRfJXMiLAorCQkJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzJWRfJXMiLAogCQkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKIAkJCQkJCSAgICBjaGFuLT5jaGFubmVsLAogCQkJCQkJICAgIGZ1bGxfcG9zdGZpeCk7CiAJCQllbHNlCi0JCQkJbmFtZV9mb3JtYXQKLQkJCQkJPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzXyVzIiwKKwkJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc18lcyIsCiAJCQkJCQkgICAgaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW2NoYW4tPnR5cGVdLAogCQkJCQkJICAgIGZ1bGxfcG9zdGZpeCk7CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAobmFtZV9mb3JtYXQgPT0gTlVMTCkgeworCWlmIChuYW1lID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9mcmVlX2Z1bGxfcG9zdGZpeDsKIAl9Ci0JZGV2X2F0dHItPmF0dHIubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAotCQkJCQluYW1lX2Zvcm1hdCwKLQkJCQkJY2hhbi0+Y2hhbm5lbCwKLQkJCQkJY2hhbi0+Y2hhbm5lbDIpOwotCWlmIChkZXZfYXR0ci0+YXR0ci5uYW1lID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9mcmVlX25hbWVfZm9ybWF0OwotCX0KKwlkZXZfYXR0ci0+YXR0ci5uYW1lID0gbmFtZTsKIAogCWlmIChyZWFkZnVuYykgewogCQlkZXZfYXR0ci0+YXR0ci5tb2RlIHw9IFNfSVJVR087CkBAIC02NjEsOCArNjQ5LDcgQEAKIAkJZGV2X2F0dHItPmF0dHIubW9kZSB8PSBTX0lXVVNSOwogCQlkZXZfYXR0ci0+c3RvcmUgPSB3cml0ZWZ1bmM7CiAJfQotZXJyb3JfZnJlZV9uYW1lX2Zvcm1hdDoKLQlrZnJlZShuYW1lX2Zvcm1hdCk7CisKIGVycm9yX2ZyZWVfZnVsbF9wb3N0Zml4OgogCWtmcmVlKGZ1bGxfcG9zdGZpeCk7CiAKQEAgLTY5MiwxMCArNjc5LDggQEAKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICppaW9fYXR0ciwgKnQ7CiAKIAlpaW9fYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCppaW9fYXR0ciksIEdGUF9LRVJORUwpOwotCWlmIChpaW9fYXR0ciA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KKwlpZiAoaWlvX2F0dHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmV0ID0gX19paW9fZGV2aWNlX2F0dHJfaW5pdCgmaWlvX2F0dHItPmRldl9hdHRyLAogCQkJCSAgICAgcG9zdGZpeCwgY2hhbiwKIAkJCQkgICAgIHJlYWRmdW5jLCB3cml0ZWZ1bmMsIHNoYXJlZF9ieSk7CkBAIC03MjAsNyArNzA1LDYgQEAKIAlfX2lpb19kZXZpY2VfYXR0cl9kZWluaXQoJmlpb19hdHRyLT5kZXZfYXR0cik7CiBlcnJvcl9paW9fZGV2X2F0dHJfZnJlZToKIAlrZnJlZShpaW9fYXR0cik7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTEzNCw3ICsxMTE4LDcgQEAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoaW5kaW9fZGV2LT5kZXYucGFyZW50LAogCQkJIkZhaWxlZCB0byByZWdpc3RlciBkZWJ1Z2ZzIGludGVyZmFjZXNcbiIpOwotCQlnb3RvIGVycm9yX3JldDsKKwkJcmV0dXJuIHJldDsKIAl9CiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3Rlcl9zeXNmcyhpbmRpb19kZXYpOwogCWlmIChyZXQpIHsKQEAgLTExNzUsNyArMTE1OSw2IEBACiAJaWlvX2RldmljZV91bnJlZ2lzdGVyX3N5c2ZzKGluZGlvX2Rldik7CiBlcnJvcl91bnJlZ19kZWJ1Z2ZzOgogCWlpb19kZXZpY2VfdW5yZWdpc3Rlcl9kZWJ1Z2ZzKGluZGlvX2Rldik7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWlvX2RldmljZV9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1ldmVudC5jCmluZGV4IGM5YzE0MTkuLmVhNmUwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1ldmVudC5jCisrKyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1ldmVudC5jCkBAIC00MCw2ICs0MCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlkZXZfYXR0cl9saXN0OwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJZ3JvdXA7CisJc3RydWN0IG11dGV4CQlyZWFkX2xvY2s7CiB9OwogCiAvKioKQEAgLTQ3LDE2ICs0OCwxNyBAQAogICogQGluZGlvX2RldjoJCUlJTyBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZXZfY29kZToJCVdoYXQgZXZlbnQKICAqIEB0aW1lc3RhbXA6CQlXaGVuIHRoZSBldmVudCBvY2N1cnJlZAorICoKKyAqIE5vdGU6IFRoZSBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBydW5uaW5nCisgKiBjb25jdXJyZW50bHkgZm9yIHRoZSBzYW1lIGluZGlvX2RldiBtb3JlIHRoYW4gb25jZS4KICAqKi8KIGludCBpaW9fcHVzaF9ldmVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1NjQgZXZfY29kZSwgczY0IHRpbWVzdGFtcCkKIHsKIAlzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSAqZXZfaW50ID0gaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2U7CiAJc3RydWN0IGlpb19ldmVudF9kYXRhIGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNvcGllZDsKIAogCS8qIERvZXMgYW55b25lIGNhcmU/ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV2X2ludC0+d2FpdC5sb2NrLCBmbGFncyk7CiAJaWYgKHRlc3RfYml0KElJT19CVVNZX0JJVF9QT1MsICZldl9pbnQtPmZsYWdzKSkgewogCiAJCWV2LmlkID0gZXZfY29kZTsKQEAgLTY0LDkgKzY2LDggQEAKIAogCQljb3BpZWQgPSBrZmlmb19wdXQoJmV2X2ludC0+ZGV0X2V2ZW50cywgZXYpOwogCQlpZiAoY29waWVkICE9IDApCi0JCQl3YWtlX3VwX2xvY2tlZF9wb2xsKCZldl9pbnQtPndhaXQsIFBPTExJTik7CisJCQl3YWtlX3VwX3BvbGwoJmV2X2ludC0+d2FpdCwgUE9MTElOKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZfaW50LT53YWl0LmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtODcsMTAgKzg4LDggQEAKIAogCXBvbGxfd2FpdChmaWxlcCwgJmV2X2ludC0+d2FpdCwgd2FpdCk7CiAKLQlzcGluX2xvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CiAJaWYgKCFrZmlmb19pc19lbXB0eSgmZXZfaW50LT5kZXRfZXZlbnRzKSkKIAkJZXZlbnRzID0gUE9MTElOIHwgUE9MTFJETk9STTsKLQlzcGluX3VubG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKIAogCXJldHVybiBldmVudHM7CiB9CkBAIC0xMTEsMzEgKzExMCw0MCBAQAogCWlmIChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaWlvX2V2ZW50X2RhdGEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKLQlpZiAoa2ZpZm9faXNfZW1wdHkoJmV2X2ludC0+ZGV0X2V2ZW50cykpIHsKLQkJaWYgKGZpbGVwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZXJyb3JfdW5sb2NrOwotCQl9Ci0JCS8qIEJsb2NraW5nIG9uIGRldmljZTsgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGJlIHRoZXJlICovCi0JCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9sb2NrZWRfaXJxKGV2X2ludC0+d2FpdCwKKwlkbyB7CisJCWlmIChrZmlmb19pc19lbXB0eSgmZXZfaW50LT5kZXRfZXZlbnRzKSkgeworCQkJaWYgKGZpbGVwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKworCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGV2X2ludC0+d2FpdCwKIAkJCQkJIWtmaWZvX2lzX2VtcHR5KCZldl9pbnQtPmRldF9ldmVudHMpIHx8CiAJCQkJCWluZGlvX2Rldi0+aW5mbyA9PSBOVUxMKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5sb2NrOwotCQlpZiAoaW5kaW9fZGV2LT5pbmZvID09IE5VTEwpIHsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycm9yX3VubG9jazsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChpbmRpb19kZXYtPmluZm8gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQkvKiBTaW5nbGUgYWNjZXNzIGRldmljZSBzbyBubyBvbmUgZWxzZSBjYW4gZ2V0IHRoZSBkYXRhICovCi0JfQogCi0JcmV0ID0ga2ZpZm9fdG9fdXNlcigmZXZfaW50LT5kZXRfZXZlbnRzLCBidWYsIGNvdW50LCAmY29waWVkKTsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZXZfaW50LT5yZWFkX2xvY2spKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJcmV0ID0ga2ZpZm9fdG9fdXNlcigmZXZfaW50LT5kZXRfZXZlbnRzLCBidWYsIGNvdW50LCAmY29waWVkKTsKKwkJbXV0ZXhfdW5sb2NrKCZldl9pbnQtPnJlYWRfbG9jayk7CiAKLWVycm9yX3VubG9jazoKLQlzcGluX3VubG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcmV0ID8gcmV0IDogY29waWVkOworCQkvKgorCQkgKiBJZiB3ZSBjb3VsZG4ndCByZWFkIGFueXRoaW5nIGZyb20gdGhlIGZpZm8gKGEgZGlmZmVyZW50CisJCSAqIHRocmVhZCBtaWdodCBoYXZlIGJlZW4gZmFzdGVyKSB3ZSBlaXRoZXIgcmV0dXJuIC1FQUdBSU4gaWYKKwkJICogdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub24tYmxvY2tpbmcsIG90aGVyd2lzZSB3ZSBnbyBiYWNrIHRvCisJCSAqIHNsZWVwIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLgorCQkgKi8KKwkJaWYgKGNvcGllZCA9PSAwICYmIChmaWxlcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwl9IHdoaWxlIChjb3BpZWQgPT0gMCk7CisKKwlyZXR1cm4gY29waWVkOwogfQogCiBzdGF0aWMgaW50IGlpb19ldmVudF9jaHJkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCkBAIC0xNDMsMTUgKzE1MSw3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGZpbGVwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgKmV2X2ludCA9IGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlOwogCi0Jc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwotCV9fY2xlYXJfYml0KElJT19CVVNZX0JJVF9QT1MsICZldl9pbnQtPmZsYWdzKTsKLQkvKgotCSAqIEluIG9yZGVyIHRvIG1haW50YWluIGEgY2xlYW4gc3RhdGUgZm9yIHJlb3BlbmluZywKLQkgKiBjbGVhciBvdXQgYW55IGF3YWl0aW5nIGV2ZW50cy4gVGhlIG1hc2sgd2lsbCBwcmV2ZW50Ci0JICogYW55IG5ldyBfX2lpb19wdXNoX2V2ZW50IGNhbGxzIHJ1bm5pbmcuCi0JICovCi0Ja2ZpZm9fcmVzZXRfb3V0KCZldl9pbnQtPmRldF9ldmVudHMpOwotCXNwaW5fdW5sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOworCWNsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncyk7CiAKIAlpaW9fZGV2aWNlX3B1dChpbmRpb19kZXYpOwogCkBAIC0xNzQsMjIgKzE3NCwyMCBAQAogCWlmIChldl9pbnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlzcGluX2xvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7Ci0JaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncykpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlzcGluX3VubG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKKwogCWlpb19kZXZpY2VfZ2V0KGluZGlvX2Rldik7CiAKIAlmZCA9IGFub25faW5vZGVfZ2V0ZmQoImlpbzpldmVudCIsICZpaW9fZXZlbnRfY2hyZGV2X2ZpbGVvcHMsCiAJCQkJaW5kaW9fZGV2LCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CiAJaWYgKGZkIDwgMCkgewotCQlzcGluX2xvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7Ci0JCV9fY2xlYXJfYml0KElJT19CVVNZX0JJVF9QT1MsICZldl9pbnQtPmZsYWdzKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CisJCWNsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncyk7CiAJCWlpb19kZXZpY2VfcHV0KGluZGlvX2Rldik7CisJfSBlbHNlIHsKKwkJa2ZpZm9fcmVzZXRfb3V0KCZldl9pbnQtPmRldF9ldmVudHMpOwogCX0KKwogCXJldHVybiBmZDsKIH0KIApAQCAtMzY2LDMyICszNjQsMzEgQEAKIAkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnQoaW5kaW9fZGV2LCBjaGFuLCBpLCB0eXBlLCBkaXIsCiAJCQlJSU9fU0VQQVJBVEUsICZjaGFuLT5ldmVudF9zcGVjW2ldLm1hc2tfc2VwYXJhdGUpOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3JfcmV0OworCQkJcmV0dXJuIHJldDsKIAkJYXR0cmNvdW50ICs9IHJldDsKIAogCQlyZXQgPSBpaW9fZGV2aWNlX2FkZF9ldmVudChpbmRpb19kZXYsIGNoYW4sIGksIHR5cGUsIGRpciwKIAkJCUlJT19TSEFSRURfQllfVFlQRSwKIAkJCSZjaGFuLT5ldmVudF9zcGVjW2ldLm1hc2tfc2hhcmVkX2J5X3R5cGUpOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3JfcmV0OworCQkJcmV0dXJuIHJldDsKIAkJYXR0cmNvdW50ICs9IHJldDsKIAogCQlyZXQgPSBpaW9fZGV2aWNlX2FkZF9ldmVudChpbmRpb19kZXYsIGNoYW4sIGksIHR5cGUsIGRpciwKIAkJCUlJT19TSEFSRURfQllfRElSLAogCQkJJmNoYW4tPmV2ZW50X3NwZWNbaV0ubWFza19zaGFyZWRfYnlfZGlyKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJCWF0dHJjb3VudCArPSByZXQ7CiAKIAkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnQoaW5kaW9fZGV2LCBjaGFuLCBpLCB0eXBlLCBkaXIsCiAJCQlJSU9fU0hBUkVEX0JZX0FMTCwKIAkJCSZjaGFuLT5ldmVudF9zcGVjW2ldLm1hc2tfc2hhcmVkX2J5X2FsbCk7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnJvcl9yZXQ7CisJCQlyZXR1cm4gcmV0OwogCQlhdHRyY291bnQgKz0gcmV0OwogCX0KIAlyZXQgPSBhdHRyY291bnQ7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDI1LDYgKzQyMiw3IEBACiB7CiAJSU5JVF9LRklGTyhldl9pbnQtPmRldF9ldmVudHMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmV2X2ludC0+d2FpdCk7CisJbXV0ZXhfaW5pdCgmZXZfaW50LT5yZWFkX2xvY2spOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqaWlvX2V2ZW50X2dyb3VwX25hbWUgPSAiZXZlbnRzIjsKQEAgLTQ0MCwxMCArNDM4LDggQEAKIAogCWluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlID0KIAkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9CisJaWYgKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCiAJSU5JVF9MSVNUX0hFQUQoJmluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlLT5kZXZfYXR0cl9saXN0KTsKIApAQCAtNDg5LDggKzQ4NSw2IEBACiBlcnJvcl9mcmVlX3NldHVwX2V2ZW50X2xpbmVzOgogCWlpb19mcmVlX2NoYW5fZGV2YXR0cl9saXN0KCZpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+ZGV2X2F0dHJfbGlzdCk7CiAJa2ZyZWUoaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UpOwotZXJyb3JfcmV0OgotCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKaW5kZXggNzY2ZmFiMi4uMzM4M2IwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCkBAIC02MiwxMCArNjIsOSBAQAogCWludCByZXQ7CiAKIAl0cmlnX2luZm8tPmlkID0gaWRhX3NpbXBsZV9nZXQoJmlpb190cmlnZ2VyX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRyaWdfaW5mby0+aWQgPCAwKSB7Ci0JCXJldCA9IHRyaWdfaW5mby0+aWQ7Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KKwlpZiAodHJpZ19pbmZvLT5pZCA8IDApCisJCXJldHVybiB0cmlnX2luZm8tPmlkOworCiAJLyogU2V0IHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBzeXNmcyBkaXJlY3RvcnkgZXRjICovCiAJZGV2X3NldF9uYW1lKCZ0cmlnX2luZm8tPmRldiwgInRyaWdnZXIlbGQiLAogCQkgICAgICh1bnNpZ25lZCBsb25nKSB0cmlnX2luZm8tPmlkKTsKQEAgLTgzLDcgKzgyLDYgQEAKIAogZXJyb3JfdW5yZWdpc3Rlcl9pZDoKIAlpZGFfc2ltcGxlX3JlbW92ZSgmaWlvX3RyaWdnZXJfaWRhLCB0cmlnX2luZm8tPmlkKTsKLWVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl9yZWdpc3Rlcik7CkBAIC0yMzQsMTMgKzIzMiwxMiBAQAogCWlmICh0cmlnLT5vcHMgJiYgdHJpZy0+b3BzLT5zZXRfdHJpZ2dlcl9zdGF0ZSAmJiBub19vdGhlcl91c2VycykgewogCQlyZXQgPSB0cmlnLT5vcHMtPnNldF90cmlnZ2VyX3N0YXRlKHRyaWcsIGZhbHNlKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfcmV0OworCQkJcmV0dXJuIHJldDsKIAl9CiAJaWlvX3RyaWdnZXJfcHV0X2lycSh0cmlnLCBwZi0+aXJxKTsKIAlmcmVlX2lycShwZi0+aXJxLCBwZik7CiAJbW9kdWxlX3B1dChwZi0+aW5kaW9fZGV2LT5pbmZvLT5kcml2ZXJfbW9kdWxlKTsKIAotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCmluZGV4IGQxMmIyYTAuLmM4OTc0MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZwpAQCAtNzMsNiArNzMsMjAgQEAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgSElEIFNFTlNPUgogCSAgQW1iaWVudCBsaWdodCBzZW5zb3IuCiAKK2NvbmZpZyBISURfU0VOU09SX1BST1gKKwlkZXBlbmRzIG9uIEhJRF9TRU5TT1JfSFVCCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwlzZWxlY3QgSElEX1NFTlNPUl9JSU9fQ09NTU9OCisJc2VsZWN0IEhJRF9TRU5TT1JfSUlPX1RSSUdHRVIKKwl0cmlzdGF0ZSAiSElEIFBST1giCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBISUQgU0VOU09SCisJICBQcm94aW1pdHkgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBoaWQtc2Vuc29yLXByb3guCisKIGNvbmZpZyBTRU5TT1JTX0xNMzUzMwogCXRyaXN0YXRlICJMTTM1MzMgYW1iaWVudCBsaWdodCBzZW5zb3IiCiAJZGVwZW5kcyBvbiBNRkRfTE0zNTMzCkBAIC05MCw2ICsxMDQsMTggQEAKIAkgIGNoYW5nZXMuIFRoZSBBTFMtY29udHJvbCBvdXRwdXQgdmFsdWVzIGNhbiBiZSBzZXQgcGVyIHpvbmUgZm9yIHRoZQogCSAgdGhyZWUgY3VycmVudCBvdXRwdXQgY2hhbm5lbHMuCiAKK2NvbmZpZyBMVFI1MDEKKwl0cmlzdGF0ZSAiTFRSLTUwMUFMUy0wMSBsaWdodCBzZW5zb3IiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCWhlbHAKKwkgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBMaXRlLU9uIExUUi01MDFBTFMtMDEKKwkgYW1iaWVudCBsaWdodCBhbmQgcHJveGltaXR5IHNlbnNvci4KKworCSBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisgICAgICAgICB3aWxsIGJlIGNhbGxlZCBsdHI1MDEuCisKIGNvbmZpZyBUQ1MzNDcyCiAJdHJpc3RhdGUgIlRBT1MgVENTMzQ3MiBjb2xvciBsaWdodC10by1kaWdpdGFsIGNvbnZlcnRlciIKIAlkZXBlbmRzIG9uIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQppbmRleCA2MGUzNWFjLi4zZWIzNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQpAQCAtOSw3ICs5LDkgQEAKIG9iai0kKENPTkZJR19DTTM2NjUxKQkJKz0gY20zNjY1MS5vCiBvYmotJChDT05GSUdfR1AyQVAwMjBBMDBGKQkrPSBncDJhcDAyMGEwMGYubwogb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfQUxTKQkrPSBoaWQtc2Vuc29yLWFscy5vCitvYmotJChDT05GSUdfSElEX1NFTlNPUl9QUk9YKQkrPSBoaWQtc2Vuc29yLXByb3gubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE0zNTMzKQkrPSBsbTM1MzMtYWxzLm8KK29iai0kKENPTkZJR19MVFI1MDEpCQkrPSBsdHI1MDEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVFNMMjU2MykJKz0gdHNsMjU2My5vCiBvYmotJChDT05GSUdfVENTMzQ3MikJCSs9IHRjczM0NzIubwogb2JqLSQoQ09ORklHX1RTTDQ1MzEpCQkrPSB0c2w0NTMxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jIGIvZHJpdmVycy9paW8vbGlnaHQvYWRqZF9zMzExLmMKaW5kZXggZjMwNjg0Ny4uMDlhZDVmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvYWRqZF9zMzExLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvYWRqZF9zMzExLmMKQEAgLTE0LDcgKzE0LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTEyMCw3ICsxMTksNiBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OwogCXN0cnVjdCBhZGpkX3MzMTFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJczY0IHRpbWVfbnMgPSBpaW9fZ2V0X3RpbWVfbnMoKTsKLQlpbnQgbGVuID0gMDsKIAlpbnQgaSwgaiA9IDA7CiAKIAlpbnQgcmV0ID0gYWRqZF9zMzExX3JlcV9kYXRhKGluZGlvX2Rldik7CkBAIC0xMzUsNyArMTMzLDYgQEAKIAkJCWdvdG8gZG9uZTsKIAogCQlkYXRhLT5idWZmZXJbaisrXSA9IHJldCAmIEFESkRfUzMxMV9EQVRBX01BU0s7Ci0JCWxlbiArPSAyOwogCX0KIAogCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLT5idWZmZXIsIHRpbWVfbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvaGlkLXNlbnNvci1wcm94LmMgYi9kcml2ZXJzL2lpby9saWdodC9oaWQtc2Vuc29yLXByb3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk0YWIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvaGlkLXNlbnNvci1wcm94LmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBISUQgU2Vuc29ycyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLXNlbnNvci1odWIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlICIuLi9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmgiCisKKyNkZWZpbmUgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNFTkNFIDAKKworc3RydWN0IHByb3hfc3RhdGUgeworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9jYWxsYmFja3MgY2FsbGJhY2tzOworCXN0cnVjdCBoaWRfc2Vuc29yX2NvbW1vbiBjb21tb25fYXR0cmlidXRlczsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfYXR0cmlidXRlX2luZm8gcHJveF9hdHRyOworCXUzMiBodW1hbl9wcmVzZW5jZTsKK307CisKKy8qIENoYW5uZWwgZGVmaW5pdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBwcm94X2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19QUk9YSU1JVFksCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19OT19NT0QsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8CisJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CisJCUJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19IWVNURVJFU0lTKSwKKwkJLnNjYW5faW5kZXggPSBDSEFOTkVMX1NDQU5fSU5ERVhfUFJFU0VOQ0UsCisJfQorfTsKKworLyogQWRqdXN0IGNoYW5uZWwgcmVhbCBiaXRzIGJhc2VkIG9uIHJlcG9ydCBkZXNjcmlwdG9yICovCitzdGF0aWMgdm9pZCBwcm94X2FkanVzdF9jaGFubmVsX2JpdF9tYXNrKHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVscywKKwkJCQkJaW50IGNoYW5uZWwsIGludCBzaXplKQoreworCWNoYW5uZWxzW2NoYW5uZWxdLnNjYW5fdHlwZS5zaWduID0gJ3MnOworCS8qIFJlYWwgc3RvcmFnZSBiaXRzIHdpbGwgY2hhbmdlIGJhc2VkIG9uIHRoZSByZXBvcnQgZGVzYy4gKi8KKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUucmVhbGJpdHMgPSBzaXplICogODsKKwkvKiBNYXhpbXVtIHNpemUgb2YgYSBzYW1wbGUgdG8gY2FwdHVyZSBpcyB1MzIgKi8KKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgPSBzaXplb2YodTMyKSAqIDg7Cit9CisKKy8qIENoYW5uZWwgcmVhZF9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcm94X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsCisJCQkgICAgICBsb25nIG1hc2spCit7CisJc3RydWN0IHByb3hfc3RhdGUgKnByb3hfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXBvcnRfaWQgPSAtMTsKKwl1MzIgYWRkcmVzczsKKwlpbnQgcmV0OworCWludCByZXRfdHlwZTsKKworCSp2YWwgPSAwOworCSp2YWwyID0gMDsKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlzd2l0Y2ggKGNoYW4tPnNjYW5faW5kZXgpIHsKKwkJY2FzZSAgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNFTkNFOgorCQkJcmVwb3J0X2lkID0gcHJveF9zdGF0ZS0+cHJveF9hdHRyLnJlcG9ydF9pZDsKKwkJCWFkZHJlc3MgPQorCQkJSElEX1VTQUdFX1NFTlNPUl9IVU1BTl9QUkVTRU5DRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVwb3J0X2lkID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmVwb3J0X2lkID49IDApCisJCQkqdmFsID0gc2Vuc29yX2h1Yl9pbnB1dF9hdHRyX2dldF9yYXdfdmFsdWUoCisJCQkJcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYsCisJCQkJSElEX1VTQUdFX1NFTlNPUl9QUk9YLCBhZGRyZXNzLAorCQkJCXJlcG9ydF9pZCk7CisJCWVsc2UgeworCQkJKnZhbCA9IDA7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCSp2YWwgPSBwcm94X3N0YXRlLT5wcm94X2F0dHIudW5pdHM7CisJCXJldF90eXBlID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCSp2YWwgPSBoaWRfc2Vuc29yX2NvbnZlcnRfZXhwb25lbnQoCisJCQkJcHJveF9zdGF0ZS0+cHJveF9hdHRyLnVuaXRfZXhwbyk7CisJCXJldF90eXBlID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldCA9IGhpZF9zZW5zb3JfcmVhZF9zYW1wX2ZyZXFfdmFsdWUoCisJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19IWVNURVJFU0lTOgorCQlyZXQgPSBoaWRfc2Vuc29yX3JlYWRfcmF3X2h5c3RfdmFsdWUoCisJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldF90eXBlID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldF90eXBlOworfQorCisvKiBDaGFubmVsIHdyaXRlX3JhdyBoYW5kbGVyICovCitzdGF0aWMgaW50IHByb3hfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICAgaW50IHZhbCwKKwkJCSAgICAgICBpbnQgdmFsMiwKKwkJCSAgICAgICBsb25nIG1hc2spCit7CisJc3RydWN0IHByb3hfc3RhdGUgKnByb3hfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0ID0gaGlkX3NlbnNvcl93cml0ZV9zYW1wX2ZyZXFfdmFsdWUoCisJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fSFlTVEVSRVNJUzoKKwkJcmV0ID0gaGlkX3NlbnNvcl93cml0ZV9yYXdfaHlzdF92YWx1ZSgKKwkJCQkmcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsIHZhbCwgdmFsMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBwcm94X2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSAmcHJveF9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gJnByb3hfd3JpdGVfcmF3LAorfTsKKworLyogRnVuY3Rpb24gdG8gcHVzaCBkYXRhIHRvIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgaGlkX3NlbnNvcl9wdXNoX2RhdGEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGxlbikKK3sKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgImhpZF9zZW5zb3JfcHVzaF9kYXRhXG4iKTsKKwlpaW9fcHVzaF90b19idWZmZXJzKGluZGlvX2RldiwgZGF0YSk7Cit9CisKKy8qIENhbGxiYWNrIGhhbmRsZXIgdG8gc2VuZCBldmVudCBhZnRlciBhbGwgc2FtcGxlcyBhcmUgcmVjZWl2ZWQgYW5kIGNhcHR1cmVkICovCitzdGF0aWMgaW50IHByb3hfcHJvY19ldmVudChzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiwKKwkJCQl1bnNpZ25lZCB1c2FnZV9pZCwKKwkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKwlzdHJ1Y3QgcHJveF9zdGF0ZSAqcHJveF9zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgInByb3hfcHJvY19ldmVudCBbJWRdXG4iLAorCQkJCXByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmRhdGFfcmVhZHkpOworCWlmIChwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5KQorCQloaWRfc2Vuc29yX3B1c2hfZGF0YShpbmRpb19kZXYsCisJCQkJJnByb3hfc3RhdGUtPmh1bWFuX3ByZXNlbmNlLAorCQkJCXNpemVvZihwcm94X3N0YXRlLT5odW1hbl9wcmVzZW5jZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhcHR1cmUgc2FtcGxlcyBpbiBsb2NhbCBzdG9yYWdlICovCitzdGF0aWMgaW50IHByb3hfY2FwdHVyZV9zYW1wbGUoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJc2l6ZV90IHJhd19sZW4sIGNoYXIgKnJhd19kYXRhLAorCQkJCXZvaWQgKnByaXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHByaXYpOworCXN0cnVjdCBwcm94X3N0YXRlICpwcm94X3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodXNhZ2VfaWQpIHsKKwljYXNlIEhJRF9VU0FHRV9TRU5TT1JfSFVNQU5fUFJFU0VOQ0U6CisJCXByb3hfc3RhdGUtPmh1bWFuX3ByZXNlbmNlID0gKih1MzIgKilyYXdfZGF0YTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgcmVwb3J0IHdoaWNoIGlzIHNwZWNpZmljIHRvIGFuIHVzYWdlIGlkKi8KK3N0YXRpYyBpbnQgcHJveF9wYXJzZV9yZXBvcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiwKKwkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJc3RydWN0IHByb3hfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBzZW5zb3JfaHViX2lucHV0X2dldF9hdHRyaWJ1dGVfaW5mbyhoc2RldiwgSElEX0lOUFVUX1JFUE9SVCwKKwkJCXVzYWdlX2lkLAorCQkJSElEX1VTQUdFX1NFTlNPUl9IVU1BTl9QUkVTRU5DRSwKKwkJCSZzdC0+cHJveF9hdHRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwcm94X2FkanVzdF9jaGFubmVsX2JpdF9tYXNrKGNoYW5uZWxzLCBDSEFOTkVMX1NDQU5fSU5ERVhfUFJFU0VOQ0UsCisJCQkJCXN0LT5wcm94X2F0dHIuc2l6ZSk7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJwcm94ICV4OiV4XG4iLCBzdC0+cHJveF9hdHRyLmluZGV4LAorCQkJc3QtPnByb3hfYXR0ci5yZXBvcnRfaWQpOworCisJLyogU2V0IFNlbnNpdGl2aXR5IGZpZWxkIGlkcywgd2hlbiB0aGVyZSBpcyBubyBpbmRpdmlkdWFsIG1vZGlmaWVyICovCisJaWYgKHN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eS5pbmRleCA8IDApIHsKKwkJc2Vuc29yX2h1Yl9pbnB1dF9nZXRfYXR0cmlidXRlX2luZm8oaHNkZXYsCisJCQlISURfRkVBVFVSRV9SRVBPUlQsIHVzYWdlX2lkLAorCQkJSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTIHwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfREFUQV9QUkVTRU5DRSwKKwkJCSZzdC0+Y29tbW9uX2F0dHJpYnV0ZXMuc2Vuc2l0aXZpdHkpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJTZW5zaXRpdml0eSBpbmRleDpyZXBvcnQgJWQ6JWRcbiIsCisJCQlzdC0+Y29tbW9uX2F0dHJpYnV0ZXMuc2Vuc2l0aXZpdHkuaW5kZXgsCisJCQlzdC0+Y29tbW9uX2F0dHJpYnV0ZXMuc2Vuc2l0aXZpdHkucmVwb3J0X2lkKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc2luZyBmb3IgdXNhZ2UgaWQgKi8KK3N0YXRpYyBpbnQgaGlkX3Byb3hfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICJwcm94IjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBwcm94X3N0YXRlICpwcm94X3N0YXRlOworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBwcm94X3N0YXRlKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlwcm94X3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiA9IGhzZGV2OworCXByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLnBkZXYgPSBwZGV2OworCisJcmV0ID0gaGlkX3NlbnNvcl9wYXJzZV9jb21tb25fYXR0cmlidXRlcyhoc2RldiwgSElEX1VTQUdFX1NFTlNPUl9QUk9YLAorCQkJCQkmcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGNvbW1vbiBhdHRyaWJ1dGVzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljaGFubmVscyA9IGttZW1kdXAocHJveF9jaGFubmVscywgc2l6ZW9mKHByb3hfY2hhbm5lbHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWxzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBkdXBsaWNhdGUgY2hhbm5lbHNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBwcm94X3BhcnNlX3JlcG9ydChwZGV2LCBoc2RldiwgY2hhbm5lbHMsCisJCQkJSElEX1VTQUdFX1NFTlNPUl9QUk9YLCBwcm94X3N0YXRlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBhdHRyaWJ1dGVzXG4iKTsKKwkJZ290byBlcnJvcl9mcmVlX2Rldl9tZW07CisJfQorCisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0KKwkJCQlBUlJBWV9TSVpFKHByb3hfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJnByb3hfaW5mbzsKKwlpbmRpb19kZXYtPm5hbWUgPSBuYW1lOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgJmlpb19wb2xsZnVuY19zdG9yZV90aW1lLAorCQlOVUxMLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHRyaWdnZXIgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcl9mcmVlX2Rldl9tZW07CisJfQorCXByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmRhdGFfcmVhZHkgPSBmYWxzZTsKKwlyZXQgPSBoaWRfc2Vuc29yX3NldHVwX3RyaWdnZXIoaW5kaW9fZGV2LCBuYW1lLAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0cmlnZ2VyIHNldHVwIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyX2Z1bmNzOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCX0KKworCXByb3hfc3RhdGUtPmNhbGxiYWNrcy5zZW5kX2V2ZW50ID0gcHJveF9wcm9jX2V2ZW50OworCXByb3hfc3RhdGUtPmNhbGxiYWNrcy5jYXB0dXJlX3NhbXBsZSA9IHByb3hfY2FwdHVyZV9zYW1wbGU7CisJcHJveF9zdGF0ZS0+Y2FsbGJhY2tzLnBkZXYgPSBwZGV2OworCXJldCA9IHNlbnNvcl9odWJfcmVnaXN0ZXJfY2FsbGJhY2soaHNkZXYsIEhJRF9VU0FHRV9TRU5TT1JfUFJPWCwKKwkJCQkJJnByb3hfc3RhdGUtPmNhbGxiYWNrcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FsbGJhY2sgcmVnIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfaWlvX3VucmVnOworCX0KKworCXJldHVybiByZXQ7CisKK2Vycm9yX2lpb191bnJlZzoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWhpZF9zZW5zb3JfcmVtb3ZlX3RyaWdnZXIoJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzKTsKK2Vycm9yX3VucmVnX2J1ZmZlcl9mdW5jczoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitlcnJvcl9mcmVlX2Rldl9tZW06CisJa2ZyZWUoaW5kaW9fZGV2LT5jaGFubmVscyk7CisJcmV0dXJuIHJldDsKK30KKworLyogRnVuY3Rpb24gdG8gZGVpbml0aWFsaXplIHRoZSBwcm9jZXNzaW5nIGZvciB1c2FnZSBpZCAqLworc3RhdGljIGludCBoaWRfcHJveF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcHJveF9zdGF0ZSAqcHJveF9zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzZW5zb3JfaHViX3JlbW92ZV9jYWxsYmFjayhoc2RldiwgSElEX1VTQUdFX1NFTlNPUl9QUk9YKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGhpZF9wcm94X2lkc1tdID0geworCXsKKwkJLyogRm9ybWF0OiBISUQtU0VOU09SLXVzYWdlX2lkX2luX2hleF9sb3dlcmNhc2UgKi8KKwkJLm5hbWUgPSAiSElELVNFTlNPUi0yMDAwMTEiLAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgaGlkX3Byb3hfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGlkX3Byb3hfcGxhdGZvcm1fZHJpdmVyID0geworCS5pZF90YWJsZSA9IGhpZF9wcm94X2lkcywKKwkuZHJpdmVyID0geworCQkubmFtZQk9IEtCVUlMRF9NT0ROQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBoaWRfcHJveF9wcm9iZSwKKwkucmVtb3ZlCQk9IGhpZF9wcm94X3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhpZF9wcm94X3BsYXRmb3JtX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiSElEIFNlbnNvciBQcm94aW1pdHkiKTsKK01PRFVMRV9BVVRIT1IoIkFyY2hhbmEgUGF0bmkgPGFyY2hhbmEucGF0bmlAaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvbHRyNTAxLmMgYi9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmI3MDcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvbHRyNTAxLmMKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBsdHI1MDEuYyAtIFN1cHBvcnQgZm9yIExpdGUtT24gTFRSNTAxIGFtYmllbnQgbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KKyAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiA3LWJpdCBJMkMgc2xhdmUgYWRkcmVzcyAweDIzCisgKgorICogVE9ETzogaW50ZXJydXB0LCB0aHJlc2hvbGQsIG1lYXN1cmVtZW50IHJhdGUsIElSIExFRCBjaGFyYWN0ZXJpc3RpY3MKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorCisjZGVmaW5lIExUUjUwMV9EUlZfTkFNRSAibHRyNTAxIgorCisjZGVmaW5lIExUUjUwMV9BTFNfQ09OVFIgMHg4MCAvKiBBTFMgb3BlcmF0aW9uIG1vZGUsIFNXIHJlc2V0ICovCisjZGVmaW5lIExUUjUwMV9QU19DT05UUiAweDgxIC8qIFBTIG9wZXJhdGlvbiBtb2RlICovCisjZGVmaW5lIExUUjUwMV9QQVJUX0lEIDB4ODYKKyNkZWZpbmUgTFRSNTAxX01BTlVGQUNfSUQgMHg4NworI2RlZmluZSBMVFI1MDFfQUxTX0RBVEExIDB4ODggLyogMTYtYml0LCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIExUUjUwMV9BTFNfREFUQTAgMHg4YSAvKiAxNi1iaXQsIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgTFRSNTAxX0FMU19QU19TVEFUVVMgMHg4YworI2RlZmluZSBMVFI1MDFfUFNfREFUQSAweDhkIC8qIDE2LWJpdCwgbGl0dGxlIGVuZGlhbiAqLworCisjZGVmaW5lIExUUjUwMV9BTFNfQ09OVFJfU1dfUkVTRVQgQklUKDIpCisjZGVmaW5lIExUUjUwMV9DT05UUl9QU19HQUlOX01BU0sgKEJJVCgzKSB8IEJJVCgyKSkKKyNkZWZpbmUgTFRSNTAxX0NPTlRSX1BTX0dBSU5fU0hJRlQgMgorI2RlZmluZSBMVFI1MDFfQ09OVFJfQUxTX0dBSU5fTUFTSyBCSVQoMykKKyNkZWZpbmUgTFRSNTAxX0NPTlRSX0FDVElWRSBCSVQoMSkKKworI2RlZmluZSBMVFI1MDFfU1RBVFVTX0FMU19SRFkgQklUKDIpCisjZGVmaW5lIExUUjUwMV9TVEFUVVNfUFNfUkRZIEJJVCgwKQorCisjZGVmaW5lIExUUjUwMV9QU19EQVRBX01BU0sgMHg3ZmYKKworc3RydWN0IGx0cjUwMV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBtdXRleCBsb2NrX2FscywgbG9ja19wczsKKwl1OCBhbHNfY29udHIsIHBzX2NvbnRyOworfTsKKworc3RhdGljIGludCBsdHI1MDFfZHJkeShzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEsIHU4IGRyZHlfbWFzaykKK3sKKwlpbnQgdHJpZXMgPSAxMDA7CisJaW50IHJldDsKKworCXdoaWxlICh0cmllcy0tKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQlMVFI1MDFfQUxTX1BTX1NUQVRVUyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKChyZXQgJiBkcmR5X21hc2spID09IGRyZHlfbWFzaykKKwkJCXJldHVybiAwOworCQltc2xlZXAoMjUpOworCX0KKworCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAibHRyNTAxX2RyZHkoKSBmYWlsZWQsIGRhdGEgbm90IHJlYWR5XG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBsdHI1MDFfcmVhZF9hbHMoc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhLCBfX2xlMTYgYnVmWzJdKQoreworCWludCByZXQgPSBsdHI1MDFfZHJkeShkYXRhLCBMVFI1MDFfU1RBVFVTX0FMU19SRFkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCS8qIGFsd2F5cyByZWFkIGJvdGggQUxTIGNoYW5uZWxzIGluIGdpdmVuIG9yZGVyICovCisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRhdGEtPmNsaWVudCwKKwkJTFRSNTAxX0FMU19EQVRBMSwgMiAqIHNpemVvZihfX2xlMTYpLCAodTggKikgYnVmKTsKK30KKworc3RhdGljIGludCBsdHI1MDFfcmVhZF9wcyhzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IGx0cjUwMV9kcmR5KGRhdGEsIExUUjUwMV9TVEFUVVNfUFNfUkRZKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX1BTX0RBVEEpOworfQorCisjZGVmaW5lIExUUjUwMV9JTlRFTlNJVFlfQ0hBTk5FTChfaWR4LCBfYWRkciwgX21vZCwgX3NoYXJlZCkgeyBcCisJLnR5cGUgPSBJSU9fSU5URU5TSVRZLCBcCisJLm1vZGlmaWVkID0gMSwgXAorCS5hZGRyZXNzID0gKF9hZGRyKSwgXAorCS5jaGFubmVsMiA9IChfbW9kKSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IChfc2hhcmVkKSwgXAorCS5zY2FuX2luZGV4ID0gKF9pZHgpLCBcCisJLnNjYW5fdHlwZSA9IHsgXAorCQkuc2lnbiA9ICd1JywgXAorCQkucmVhbGJpdHMgPSAxNiwgXAorCQkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCQkuZW5kaWFubmVzcyA9IElJT19DUFUsIFwKKwl9IFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGx0cjUwMV9jaGFubmVsc1tdID0geworCUxUUjUwMV9JTlRFTlNJVFlfQ0hBTk5FTCgwLCBMVFI1MDFfQUxTX0RBVEEwLCBJSU9fTU9EX0xJR0hUX0JPVEgsIDApLAorCUxUUjUwMV9JTlRFTlNJVFlfQ0hBTk5FTCgxLCBMVFI1MDFfQUxTX0RBVEExLCBJSU9fTU9EX0xJR0hUX0lSLAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkpLAorCXsKKwkJLnR5cGUgPSBJSU9fUFJPWElNSVRZLAorCQkuYWRkcmVzcyA9IExUUjUwMV9QU19EQVRBLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8CisJCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMiwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3UnLAorCQkJLnJlYWxiaXRzID0gMTEsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0NQVSwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDMpLAorfTsKKworc3RhdGljIGNvbnN0IGludCBsdHI1MDFfcHNfZ2Fpbls0XVsyXSA9IHsKKwl7MSwgMH0sIHswLCAyNTAwMDB9LCB7MCwgMTI1MDAwfSwgezAsIDYyNTAwfQorfTsKKworc3RhdGljIGludCBsdHI1MDFfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlfX2xlMTYgYnVmWzJdOworCWludCByZXQsIGk7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrX2Fscyk7CisJCQlyZXQgPSBsdHI1MDFfcmVhZF9hbHMoZGF0YSwgYnVmKTsKKwkJCW11dGV4X3VubG9jaygmZGF0YS0+bG9ja19hbHMpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCSp2YWwgPSBsZTE2X3RvX2NwdShjaGFuLT5hZGRyZXNzID09IExUUjUwMV9BTFNfREFUQTEgPworCQkJCWJ1ZlswXSA6IGJ1ZlsxXSk7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWNhc2UgSUlPX1BST1hJTUlUWToKKwkJCW11dGV4X2xvY2soJmRhdGEtPmxvY2tfcHMpOworCQkJcmV0ID0gbHRyNTAxX3JlYWRfcHMoZGF0YSk7CisJCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2tfcHMpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCSp2YWwgPSByZXQgJiBMVFI1MDFfUFNfREFUQV9NQVNLOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCQlpZiAoZGF0YS0+YWxzX2NvbnRyICYgTFRSNTAxX0NPTlRSX0FMU19HQUlOX01BU0spIHsKKwkJCQkqdmFsID0gMDsKKwkJCQkqdmFsMiA9IDUwMDA7CisJCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCQl9IGVsc2UgeworCQkJCSp2YWwgPSAxOworCQkJCSp2YWwyID0gMDsKKwkJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCQl9CisJCWNhc2UgSUlPX1BST1hJTUlUWToKKwkJCWkgPSAoZGF0YS0+cHNfY29udHIgJiBMVFI1MDFfQ09OVFJfUFNfR0FJTl9NQVNLKSA+PgorCQkJCUxUUjUwMV9DT05UUl9QU19HQUlOX1NISUZUOworCQkJKnZhbCA9IGx0cjUwMV9wc19nYWluW2ldWzBdOworCQkJKnZhbDIgPSBsdHI1MDFfcHNfZ2FpbltpXVsxXTsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX2dldF9wc19nYWluX2luZGV4KGludCB2YWwsIGludCB2YWwyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHRyNTAxX3BzX2dhaW4pOyBpKyspCisJCWlmICh2YWwgPT0gbHRyNTAxX3BzX2dhaW5baV1bMF0gJiYgdmFsMiA9PSBsdHI1MDFfcHNfZ2FpbltpXVsxXSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGx0cjUwMV93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgICBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGk7CisKKwlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCQlpZiAodmFsID09IDAgJiYgdmFsMiA9PSA1MDAwKQorCQkJCWRhdGEtPmFsc19jb250ciB8PSBMVFI1MDFfQ09OVFJfQUxTX0dBSU5fTUFTSzsKKwkJCWVsc2UgaWYgKHZhbCA9PSAxICYmIHZhbDIgPT0gMCkKKwkJCQlkYXRhLT5hbHNfY29udHIgJj0gfkxUUjUwMV9DT05UUl9BTFNfR0FJTl9NQVNLOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCUxUUjUwMV9BTFNfQ09OVFIsIGRhdGEtPmFsc19jb250cik7CisJCWNhc2UgSUlPX1BST1hJTUlUWToKKwkJCWkgPSBsdHI1MDFfZ2V0X3BzX2dhaW5faW5kZXgodmFsLCB2YWwyKTsKKwkJCWlmIChpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRhdGEtPnBzX2NvbnRyICY9IH5MVFI1MDFfQ09OVFJfUFNfR0FJTl9NQVNLOworCQkJZGF0YS0+cHNfY29udHIgfD0gaSA8PCBMVFI1MDFfQ09OVFJfUFNfR0FJTl9TSElGVDsKKwkJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlMVFI1MDFfUFNfQ09OVFIsIGRhdGEtPnBzX2NvbnRyKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZSwgIjEgMC4yNSAwLjEyNSAwLjA2MjUiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlLCAiMSAwLjAwNSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRyNTAxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfaW5fcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHRyNTAxX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBsdHI1MDFfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbHRyNTAxX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gbHRyNTAxX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSBsdHI1MDFfd3JpdGVfcmF3LAorCS5hdHRycyA9ICZsdHI1MDFfYXR0cmlidXRlX2dyb3VwLAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGx0cjUwMV93cml0ZV9jb250cihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBhbHNfdmFsLCB1OCBwc192YWwpCit7CisJaW50IHJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMVFI1MDFfQUxTX0NPTlRSLCBhbHNfdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRSNTAxX1BTX0NPTlRSLCBwc192YWwpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbHRyNTAxX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1MTYgYnVmWzhdOworCV9fbGUxNiBhbHNfYnVmWzJdOworCXU4IG1hc2sgPSAwOworCWludCBqID0gMDsKKwlpbnQgcmV0OworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJLyogZmlndXJlIG91dCB3aGljaCBkYXRhIG5lZWRzIHRvIGJlIHJlYWR5ICovCisJaWYgKHRlc3RfYml0KDAsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykgfHwKKwkJdGVzdF9iaXQoMSwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkKKwkJbWFzayB8PSBMVFI1MDFfU1RBVFVTX0FMU19SRFk7CisJaWYgKHRlc3RfYml0KDIsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCW1hc2sgfD0gTFRSNTAxX1NUQVRVU19QU19SRFk7CisKKwlyZXQgPSBsdHI1MDFfZHJkeShkYXRhLCBtYXNrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJaWYgKG1hc2sgJiBMVFI1MDFfU1RBVFVTX0FMU19SRFkpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJTFRSNTAxX0FMU19EQVRBMSwgc2l6ZW9mKGFsc19idWYpLCAodTggKikgYWxzX2J1Zik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHRlc3RfYml0KDAsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCQlidWZbaisrXSA9IGxlMTZfdG9fY3B1KGFsc19idWZbMV0pOworCQlpZiAodGVzdF9iaXQoMSwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkKKwkJCWJ1ZltqKytdID0gbGUxNl90b19jcHUoYWxzX2J1ZlswXSk7CisJfQorCisJaWYgKG1hc2sgJiBMVFI1MDFfU1RBVFVTX1BTX1JEWSkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBMVFI1MDFfUFNfREFUQSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCQlidWZbaisrXSA9IHJldCAmIExUUjUwMV9QU19EQVRBX01BU0s7CisJfQorCisJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsIGJ1ZiwKKwkJaWlvX2dldF90aW1lX25zKCkpOworCitkb25lOgorCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX2luaXQoc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBMVFI1MDFfQUxTX0NPTlRSKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkYXRhLT5hbHNfY29udHIgPSByZXQgfCBMVFI1MDFfQ09OVFJfQUNUSVZFOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX1BTX0NPTlRSKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkYXRhLT5wc19jb250ciA9IHJldCB8IExUUjUwMV9DT05UUl9BQ1RJVkU7CisKKwlyZXR1cm4gbHRyNTAxX3dyaXRlX2NvbnRyKGRhdGEtPmNsaWVudCwgZGF0YS0+YWxzX2NvbnRyLAorCQlkYXRhLT5wc19jb250cik7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9ja19hbHMpOworCW11dGV4X2luaXQoJmRhdGEtPmxvY2tfcHMpOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX1BBUlRfSUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmICgocmV0ID4+IDQpICE9IDB4OCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJmx0cjUwMV9pbmZvOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBsdHI1MDFfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGx0cjUwMV9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5uYW1lID0gTFRSNTAxX0RSVl9OQU1FOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGx0cjUwMV9pbml0KGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQlsdHI1MDFfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsdHI1MDFfcG93ZXJkb3duKHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gbHRyNTAxX3dyaXRlX2NvbnRyKGRhdGEtPmNsaWVudCwKKwkJZGF0YS0+YWxzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUsCisJCWRhdGEtPnBzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUpOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisJbHRyNTAxX3Bvd2VyZG93bihpaW9fcHJpdihpbmRpb19kZXYpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGx0cjUwMV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEoCisJCXRvX2kyY19jbGllbnQoZGV2KSkpOworCXJldHVybiBsdHI1MDFfcG93ZXJkb3duKGRhdGEpOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGkyY19nZXRfY2xpZW50ZGF0YSgKKwkJdG9faTJjX2NsaWVudChkZXYpKSk7CisKKwlyZXR1cm4gbHRyNTAxX3dyaXRlX2NvbnRyKGRhdGEtPmNsaWVudCwgZGF0YS0+YWxzX2NvbnRyLAorCQlkYXRhLT5wc19jb250cik7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGx0cjUwMV9wbV9vcHMsIGx0cjUwMV9zdXNwZW5kLCBsdHI1MDFfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0cjUwMV9pZFtdID0geworCXsgImx0cjUwMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRyNTAxX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0cjUwMV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICA9IExUUjUwMV9EUlZfTkFNRSwKKwkJLnBtCT0gJmx0cjUwMV9wbV9vcHMsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSAgPSBsdHI1MDFfcHJvYmUsCisJLnJlbW92ZQk9IGx0cjUwMV9yZW1vdmUsCisJLmlkX3RhYmxlID0gbHRyNTAxX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIobHRyNTAxX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIE1lZXJ3YWxkIDxwbWVlcndAcG1lZXJ3Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGl0ZS1PbiBMVFI1MDEgYW1iaWVudCBsaWdodCBhbmQgcHJveGltaXR5IHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L3RjczM0NzIuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3RjczM0NzIuYwppbmRleCA4ODdmZWNmLi5mZTA2M2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC90Y3MzNDcyLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvdGNzMzQ3Mi5jCkBAIC0xNzksNyArMTc5LDYgQEAKIAlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OwogCXN0cnVjdCB0Y3MzNDcyX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCBsZW4gPSAwOwogCWludCBpLCBqID0gMDsKIAogCWludCByZXQgPSB0Y3MzNDcyX3JlcV9kYXRhKGRhdGEpOwpAQCAtMTk0LDcgKzE5Myw2IEBACiAJCQlnb3RvIGRvbmU7CiAKIAkJZGF0YS0+YnVmZmVyW2orK10gPSByZXQ7Ci0JCWxlbiArPSAyOwogCX0KIAogCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLT5idWZmZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc1LmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc1LmMKaW5kZXggMDU0MjM1NC4uNzQ4NjZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9hazg5NzUuYwpAQCAtNTEzLDYgKzUxMyw3IEBACiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFrODk3NV9jaGFubmVsczsKIAlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWs4OTc1X2NoYW5uZWxzKTsKIAlpbmRpb19kZXYtPmluZm8gPSAmYWs4OTc1X2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gaWQtPm5hbWU7CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCiAJZXJyID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKaW5kZXggZjY2OTU1Zi4uOGI3Nzc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYworKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCkBAIC0xODMsOSArMTgzLDE3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKLQkJKnZhbCA9IDA7Ci0JCSp2YWwyID0gMTAwMDsKLQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19NQUdOOgorCQkJKnZhbCA9IDA7CisJCQkqdmFsMiA9IDEwMDA7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwgPSAxMDAwOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgogCQlpID0gZGF0YS0+Y3RybF9yZWcxID4+IE1BRzMxMTBfQ1RSTF9EUl9TSElGVDsKIAkJKnZhbCA9IG1hZzMxMTBfc2FtcF9mcmVxW2ldWzBdOwpAQCAtMjcwLDcgKzI3OCw4IEBACiAJTUFHMzExMF9DSEFOTkVMKFosIDIpLAogCXsKIAkJLnR5cGUgPSBJSU9fVEVNUCwKLQkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKIAkJLnNjYW5faW5kZXggPSAzLAogCQkuc2Nhbl90eXBlID0gewogCQkJLnNpZ24gPSAncycsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZwppbmRleCBhOGI5Y2FlLi5kODhmZjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKQEAgLTUsNiArNSwyMCBAQAogCiBtZW51ICJQcmVzc3VyZSBzZW5zb3JzIgogCitjb25maWcgSElEX1NFTlNPUl9QUkVTUworCWRlcGVuZHMgb24gSElEX1NFTlNPUl9IVUIKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCXNlbGVjdCBISURfU0VOU09SX0lJT19DT01NT04KKwlzZWxlY3QgSElEX1NFTlNPUl9JSU9fVFJJR0dFUgorCXRyaXN0YXRlICJISUQgUFJFU1MiCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBISUQgU0VOU09SCisJICBQcmVzc3VyZSBkcml2ZXIKKworICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKyAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBoaWQtc2Vuc29yLXByZXNzLgorCiBjb25maWcgTVBMMzExNQogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBMMzExNUEyIHByZXNzdXJlIHNlbnNvciBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTI2LDcgKzQwLDcgQEAKIAlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIgaWYgKElJT19CVUZGRVIpCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIFNUTWljcm9lbGVjdHJvbmljcyBwcmVzc3VyZQotCSAgc2Vuc29yczogTFBTMDAxV1AsIExQUzMzMUFQLgorCSAgc2Vuc29yczogTFBTMDAxV1AsIExQUzI1SCwgTFBTMzMxQVAuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlc2UgbW9kdWxlcwogCSAgd2lsbCBiZSBjcmVhdGVkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQppbmRleCA0MmJiOWZjLi40YTU3YmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKICMKIAogIyBXaGVuIGFkZGluZyBuZXcgZW50cmllcyBrZWVwIHRoZSBsaXN0IGluIGFscGhhYmV0aWNhbCBvcmRlcgorb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfUFJFU1MpICAgKz0gaGlkLXNlbnNvci1wcmVzcy5vCiBvYmotJChDT05GSUdfTVBMMzExNSkgKz0gbXBsMzExNS5vCiBvYmotJChDT05GSUdfSUlPX1NUX1BSRVNTKSArPSBzdF9wcmVzc3VyZS5vCiBzdF9wcmVzc3VyZS15IDo9IHN0X3ByZXNzdXJlX2NvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvaGlkLXNlbnNvci1wcmVzcy5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvaGlkLXNlbnNvci1wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZTY0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9oaWQtc2Vuc29yLXByZXNzLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBISUQgU2Vuc29ycyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLXNlbnNvci1odWIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlICIuLi9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmgiCisKKyNkZWZpbmUgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNTVVJFIDAKKworc3RydWN0IHByZXNzX3N0YXRlIHsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfY2FsbGJhY2tzIGNhbGxiYWNrczsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gY29tbW9uX2F0dHJpYnV0ZXM7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2F0dHJpYnV0ZV9pbmZvIHByZXNzX2F0dHI7CisJdTMyIHByZXNzX2RhdGE7Cit9OworCisvKiBDaGFubmVsIGRlZmluaXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgcHJlc3NfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX1BSRVNTVVJFLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpIHwKKwkJQklUKElJT19DSEFOX0lORk9fSFlTVEVSRVNJUyksCisJCS5zY2FuX2luZGV4ID0gQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNTVVJFLAorCX0KK307CisKKy8qIEFkanVzdCBjaGFubmVsIHJlYWwgYml0cyBiYXNlZCBvbiByZXBvcnQgZGVzY3JpcHRvciAqLworc3RhdGljIHZvaWQgcHJlc3NfYWRqdXN0X2NoYW5uZWxfYml0X21hc2soc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJCQlpbnQgY2hhbm5lbCwgaW50IHNpemUpCit7CisJY2hhbm5lbHNbY2hhbm5lbF0uc2Nhbl90eXBlLnNpZ24gPSAncyc7CisJLyogUmVhbCBzdG9yYWdlIGJpdHMgd2lsbCBjaGFuZ2UgYmFzZWQgb24gdGhlIHJlcG9ydCBkZXNjLiAqLworCWNoYW5uZWxzW2NoYW5uZWxdLnNjYW5fdHlwZS5yZWFsYml0cyA9IHNpemUgKiA4OworCS8qIE1heGltdW0gc2l6ZSBvZiBhIHNhbXBsZSB0byBjYXB0dXJlIGlzIHUzMiAqLworCWNoYW5uZWxzW2NoYW5uZWxdLnNjYW5fdHlwZS5zdG9yYWdlYml0cyA9IHNpemVvZih1MzIpICogODsKK30KKworLyogQ2hhbm5lbCByZWFkX3JhdyBoYW5kbGVyICovCitzdGF0aWMgaW50IHByZXNzX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsCisJCQkgICAgICBsb25nIG1hc2spCit7CisJc3RydWN0IHByZXNzX3N0YXRlICpwcmVzc19zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJlcG9ydF9pZCA9IC0xOworCXUzMiBhZGRyZXNzOworCWludCByZXQ7CisJaW50IHJldF90eXBlOworCisJKnZhbCA9IDA7CisJKnZhbDIgPSAwOworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCXN3aXRjaCAoY2hhbi0+c2Nhbl9pbmRleCkgeworCQljYXNlICBDSEFOTkVMX1NDQU5fSU5ERVhfUFJFU1NVUkU6CisJCQlyZXBvcnRfaWQgPSBwcmVzc19zdGF0ZS0+cHJlc3NfYXR0ci5yZXBvcnRfaWQ7CisJCQlhZGRyZXNzID0KKwkJCUhJRF9VU0FHRV9TRU5TT1JfQVRNT1NQSEVSSUNfUFJFU1NVUkU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcG9ydF9pZCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlcG9ydF9pZCA+PSAwKQorCQkJKnZhbCA9IHNlbnNvcl9odWJfaW5wdXRfYXR0cl9nZXRfcmF3X3ZhbHVlKAorCQkJCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiwKKwkJCQlISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCBhZGRyZXNzLAorCQkJCXJlcG9ydF9pZCk7CisJCWVsc2UgeworCQkJKnZhbCA9IDA7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCSp2YWwgPSBwcmVzc19zdGF0ZS0+cHJlc3NfYXR0ci51bml0czsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJKnZhbCA9IGhpZF9zZW5zb3JfY29udmVydF9leHBvbmVudCgKKwkJCQlwcmVzc19zdGF0ZS0+cHJlc3NfYXR0ci51bml0X2V4cG8pOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQlyZXQgPSBoaWRfc2Vuc29yX3JlYWRfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsIHZhbCwgdmFsMik7CisJCXJldF90eXBlID0gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX0hZU1RFUkVTSVM6CisJCXJldCA9IGhpZF9zZW5zb3JfcmVhZF9yYXdfaHlzdF92YWx1ZSgKKwkJCQkmcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldF90eXBlID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldF90eXBlOworfQorCisvKiBDaGFubmVsIHdyaXRlX3JhdyBoYW5kbGVyICovCitzdGF0aWMgaW50IHByZXNzX3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGludCB2YWwsCisJCQkgICAgICAgaW50IHZhbDIsCisJCQkgICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcmVzc19zdGF0ZSAqcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0ID0gaGlkX3NlbnNvcl93cml0ZV9zYW1wX2ZyZXFfdmFsdWUoCisJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX0hZU1RFUkVTSVM6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfcmF3X2h5c3RfdmFsdWUoCisJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHByZXNzX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSAmcHJlc3NfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZwcmVzc193cml0ZV9yYXcsCit9OworCisvKiBGdW5jdGlvbiB0byBwdXNoIGRhdGEgdG8gYnVmZmVyICovCitzdGF0aWMgdm9pZCBoaWRfc2Vuc29yX3B1c2hfZGF0YShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQlpbnQgbGVuKQoreworCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiaGlkX3NlbnNvcl9wdXNoX2RhdGFcbiIpOworCWlpb19wdXNoX3RvX2J1ZmZlcnMoaW5kaW9fZGV2LCBkYXRhKTsKK30KKworLyogQ2FsbGJhY2sgaGFuZGxlciB0byBzZW5kIGV2ZW50IGFmdGVyIGFsbCBzYW1wbGVzIGFyZSByZWNlaXZlZCBhbmQgY2FwdHVyZWQgKi8KK3N0YXRpYyBpbnQgcHJlc3NfcHJvY19ldmVudChzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiwKKwkJCQl1bnNpZ25lZCB1c2FnZV9pZCwKKwkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAicHJlc3NfcHJvY19ldmVudCBbJWRdXG4iLAorCQkJCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5KTsKKwlpZiAocHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmRhdGFfcmVhZHkpCisJCWhpZF9zZW5zb3JfcHVzaF9kYXRhKGluZGlvX2RldiwKKwkJCQkmcHJlc3Nfc3RhdGUtPnByZXNzX2RhdGEsCisJCQkJc2l6ZW9mKHByZXNzX3N0YXRlLT5wcmVzc19kYXRhKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FwdHVyZSBzYW1wbGVzIGluIGxvY2FsIHN0b3JhZ2UgKi8KK3N0YXRpYyBpbnQgcHJlc3NfY2FwdHVyZV9zYW1wbGUoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJc2l6ZV90IHJhd19sZW4sIGNoYXIgKnJhd19kYXRhLAorCQkJCXZvaWQgKnByaXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHByaXYpOworCXN0cnVjdCBwcmVzc19zdGF0ZSAqcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoICh1c2FnZV9pZCkgeworCWNhc2UgSElEX1VTQUdFX1NFTlNPUl9BVE1PU1BIRVJJQ19QUkVTU1VSRToKKwkJcHJlc3Nfc3RhdGUtPnByZXNzX2RhdGEgPSAqKHUzMiAqKXJhd19kYXRhOworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBQYXJzZSByZXBvcnQgd2hpY2ggaXMgc3BlY2lmaWMgdG8gYW4gdXNhZ2UgaWQqLworc3RhdGljIGludCBwcmVzc19wYXJzZV9yZXBvcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiwKKwkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJc3RydWN0IHByZXNzX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2Vuc29yX2h1Yl9pbnB1dF9nZXRfYXR0cmlidXRlX2luZm8oaHNkZXYsIEhJRF9JTlBVVF9SRVBPUlQsCisJCQl1c2FnZV9pZCwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisJCQkmc3QtPnByZXNzX2F0dHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXByZXNzX2FkanVzdF9jaGFubmVsX2JpdF9tYXNrKGNoYW5uZWxzLCBDSEFOTkVMX1NDQU5fSU5ERVhfUFJFU1NVUkUsCisJCQkJCXN0LT5wcmVzc19hdHRyLnNpemUpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJlc3MgJXg6JXhcbiIsIHN0LT5wcmVzc19hdHRyLmluZGV4LAorCQkJc3QtPnByZXNzX2F0dHIucmVwb3J0X2lkKTsKKworCS8qIFNldCBTZW5zaXRpdml0eSBmaWVsZCBpZHMsIHdoZW4gdGhlcmUgaXMgbm8gaW5kaXZpZHVhbCBtb2RpZmllciAqLworCWlmIChzdC0+Y29tbW9uX2F0dHJpYnV0ZXMuc2Vuc2l0aXZpdHkuaW5kZXggPCAwKSB7CisJCXNlbnNvcl9odWJfaW5wdXRfZ2V0X2F0dHJpYnV0ZV9pbmZvKGhzZGV2LAorCQkJSElEX0ZFQVRVUkVfUkVQT1JULCB1c2FnZV9pZCwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyB8CisJCQlISURfVVNBR0VfU0VOU09SX0RBVEFfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisJCQkmc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5KTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiU2Vuc2l0aXZpdHkgaW5kZXg6cmVwb3J0ICVkOiVkXG4iLAorCQkJc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LmluZGV4LAorCQkJc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LnJlcG9ydF9pZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3NpbmcgZm9yIHVzYWdlIGlkICovCitzdGF0aWMgaW50IGhpZF9wcmVzc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gInByZXNzIjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBwcmVzc19zdGF0ZSAqcHJlc3Nfc3RhdGU7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnBkZXYtPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0IHByZXNzX3N0YXRlKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlwcmVzc19zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmhzZGV2ID0gaHNkZXY7CisJcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLnBkZXYgPSBwZGV2OworCisJcmV0ID0gaGlkX3NlbnNvcl9wYXJzZV9jb21tb25fYXR0cmlidXRlcyhoc2RldiwKKwkJCQkJSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwKKwkJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgY29tbW9uIGF0dHJpYnV0ZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW5uZWxzID0ga21lbWR1cChwcmVzc19jaGFubmVscywgc2l6ZW9mKHByZXNzX2NoYW5uZWxzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVscykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZHVwbGljYXRlIGNoYW5uZWxzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gcHJlc3NfcGFyc2VfcmVwb3J0KHBkZXYsIGhzZGV2LCBjaGFubmVscywKKwkJCQlISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCBwcmVzc19zdGF0ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgYXR0cmlidXRlc1xuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9CisJCQkJQVJSQVlfU0laRShwcmVzc19jaGFubmVscyk7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmcHJlc3NfaW5mbzsKKwlpbmRpb19kZXYtPm5hbWUgPSBuYW1lOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgJmlpb19wb2xsZnVuY19zdG9yZV90aW1lLAorCQlOVUxMLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHRyaWdnZXIgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcl9mcmVlX2Rldl9tZW07CisJfQorCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5ID0gZmFsc2U7CisJcmV0ID0gaGlkX3NlbnNvcl9zZXR1cF90cmlnZ2VyKGluZGlvX2RldiwgbmFtZSwKKwkJCQkmcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInRyaWdnZXIgc2V0dXAgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19idWZmZXJfZnVuY3M7CisJfQorCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJfQorCisJcHJlc3Nfc3RhdGUtPmNhbGxiYWNrcy5zZW5kX2V2ZW50ID0gcHJlc3NfcHJvY19ldmVudDsKKwlwcmVzc19zdGF0ZS0+Y2FsbGJhY2tzLmNhcHR1cmVfc2FtcGxlID0gcHJlc3NfY2FwdHVyZV9zYW1wbGU7CisJcHJlc3Nfc3RhdGUtPmNhbGxiYWNrcy5wZGV2ID0gcGRldjsKKwlyZXQgPSBzZW5zb3JfaHViX3JlZ2lzdGVyX2NhbGxiYWNrKGhzZGV2LCBISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLAorCQkJCQkmcHJlc3Nfc3RhdGUtPmNhbGxiYWNrcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FsbGJhY2sgcmVnIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfaWlvX3VucmVnOworCX0KKworCXJldHVybiByZXQ7CisKK2Vycm9yX2lpb191bnJlZzoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWhpZF9zZW5zb3JfcmVtb3ZlX3RyaWdnZXIoJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CitlcnJvcl91bnJlZ19idWZmZXJfZnVuY3M6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXZfbWVtOgorCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGRlaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc2luZyBmb3IgdXNhZ2UgaWQgKi8KK3N0YXRpYyBpbnQgaGlkX3ByZXNzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBwcmVzc19zdGF0ZSAqcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc2Vuc29yX2h1Yl9yZW1vdmVfY2FsbGJhY2soaHNkZXYsIEhJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWhpZF9zZW5zb3JfcmVtb3ZlX3RyaWdnZXIoJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGhpZF9wcmVzc19pZHNbXSA9IHsKKwl7CisJCS8qIEZvcm1hdDogSElELVNFTlNPUi11c2FnZV9pZF9pbl9oZXhfbG93ZXJjYXNlICovCisJCS5uYW1lID0gIkhJRC1TRU5TT1ItMjAwMDMxIiwKKwl9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGhpZF9wcmVzc19pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoaWRfcHJlc3NfcGxhdGZvcm1fZHJpdmVyID0geworCS5pZF90YWJsZSA9IGhpZF9wcmVzc19pZHMsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gaGlkX3ByZXNzX3Byb2JlLAorCS5yZW1vdmUJCT0gaGlkX3ByZXNzX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhpZF9wcmVzc19wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkhJRCBTZW5zb3IgUHJlc3N1cmUiKTsKK01PRFVMRV9BVVRIT1IoIkFyY2hhbmEgUGF0bmkgPGFyY2hhbmEucGF0bmlAaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXBsMzExNS5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXBsMzExNS5jCmluZGV4IGFjOGM4YWIuLmJhNmQwYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21wbDMxMTUuYworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tcGwzMTE1LmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkJCSAgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCiB7CiAJc3RydWN0IG1wbDMxMTVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JczMyIHRtcCA9IDA7CisJX19iZTMyIHRtcCA9IDA7CiAJaW50IHJldDsKIAogCXN3aXRjaCAobWFzaykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmUuaCBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlLmgKaW5kZXggMDQ5YzIxYS4uMjQyOTQzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmUuaAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZS5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaWlvL2NvbW1vbi9zdF9zZW5zb3JzLmg+CiAKICNkZWZpbmUgTFBTMDAxV1BfUFJFU1NfREVWX05BTUUJCSJscHMwMDF3cCIKKyNkZWZpbmUgTFBTMjVIX1BSRVNTX0RFVl9OQU1FCQkibHBzMjVoIgogI2RlZmluZSBMUFMzMzFBUF9QUkVTU19ERVZfTkFNRQkJImxwczMzMWFwIgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX2NvcmUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX2NvcmUuYwppbmRleCA1ODA4M2Y5Li43NDE4NzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfY29yZS5jCkBAIC00MCw2ICs0MCw5IEBACiAvKiBGVUxMU0NBTEUgKi8KICNkZWZpbmUgU1RfUFJFU1NfRlNfQVZMXzEyNjBNQgkJCTEyNjAKIAorI2RlZmluZSBTVF9QUkVTU18xX09VVF9YTF9BRERSCQkJMHgyOAorI2RlZmluZSBTVF9URU1QXzFfT1VUX0xfQUREUgkJCTB4MmIKKwogLyogQ1VTVE9NIFZBTFVFUyBGT1IgTFBTMzMxQVAgU0VOU09SICovCiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX1dBSV9FWFAJCTB4YmIKICNkZWZpbmUgU1RfUFJFU1NfTFBTMzMxQVBfT0RSX0FERFIJCTB4MjAKQEAgLTYyLDggKzY1LDYgQEAKICNkZWZpbmUgU1RfUFJFU1NfTFBTMzMxQVBfRFJEWV9JUlFfSU5UMl9NQVNLCTB4MjAKICNkZWZpbmUgU1RfUFJFU1NfTFBTMzMxQVBfTVVMVElSRUFEX0JJVAkJdHJ1ZQogI2RlZmluZSBTVF9QUkVTU19MUFMzMzFBUF9URU1QX09GRlNFVAkJNDI1MDAKLSNkZWZpbmUgU1RfUFJFU1NfTFBTMzMxQVBfT1VUX1hMX0FERFIJCTB4MjgKLSNkZWZpbmUgU1RfVEVNUF9MUFMzMzFBUF9PVVRfTF9BRERSCQkweDJiCiAKIC8qIENVU1RPTSBWQUxVRVMgRk9SIExQUzAwMVdQIFNFTlNPUiAqLwogI2RlZmluZSBTVF9QUkVTU19MUFMwMDFXUF9XQUlfRVhQCQkweGJhCkBAIC04MCwxMSArODEsMzYgQEAKICNkZWZpbmUgU1RfUFJFU1NfTFBTMDAxV1BfT1VUX0xfQUREUgkJMHgyOAogI2RlZmluZSBTVF9URU1QX0xQUzAwMVdQX09VVF9MX0FERFIJCTB4MmEKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0X3ByZXNzX2xwczMzMWFwX2NoYW5uZWxzW10gPSB7CisvKiBDVVNUT00gVkFMVUVTIEZPUiBMUFMyNUggU0VOU09SICovCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9XQUlfRVhQCQkJMHhiZAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT0RSX0FERFIJCTB4MjAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09EUl9NQVNLCQkweDcwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzFIWl9WQUwJCTB4MDEKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09EUl9BVkxfN0haX1ZBTAkJMHgwMgorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF8xM0haX1ZBTAkweDAzCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzI1SFpfVkFMCTB4MDQKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX1BXX0FERFIJCQkweDIwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9QV19NQVNLCQkJMHg4MAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRlNfQUREUgkJCTB4MDAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0ZTX01BU0sJCQkweDAwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfMTI2MF9WQUwJCTB4MDAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0ZTX0FWTF8xMjYwX0dBSU4JU1RfUFJFU1NfS1BBU0NBTF9OQU5PX1NDQUxFCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfVEVNUF9HQUlOCVNUX1BSRVNTX0NFTFNJVVNfTkFOT19TQ0FMRQorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfQkRVX0FERFIJCTB4MjAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0JEVV9NQVNLCQkweDA0CisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9EUkRZX0lSUV9BRERSCQkweDIzCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9EUkRZX0lSUV9JTlQxX01BU0sJMHgwMQorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfSU5UMl9NQVNLCTB4MTAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX01VTFRJUkVBRF9CSVQJCXRydWUKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX1RFTVBfT0ZGU0VUCQk0MjUwMAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT1VUX1hMX0FERFIJCTB4MjgKKyNkZWZpbmUgU1RfVEVNUF9MUFMyNUhfT1VUX0xfQUREUgkJMHgyYgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgc3RfcHJlc3NfMV9jaGFubmVsc1tdID0gewogCXsKIAkJLnR5cGUgPSBJSU9fUFJFU1NVUkUsCiAJCS5jaGFubmVsMiA9IElJT19OT19NT0QsCi0JCS5hZGRyZXNzID0gU1RfUFJFU1NfTFBTMzMxQVBfT1VUX1hMX0FERFIsCisJCS5hZGRyZXNzID0gU1RfUFJFU1NfMV9PVVRfWExfQUREUiwKIAkJLnNjYW5faW5kZXggPSBTVF9TRU5TT1JTX1NDQU5fWCwKIAkJLnNjYW5fdHlwZSA9IHsKIAkJCS5zaWduID0gJ3UnLApAQCAtOTksNyArMTI1LDcgQEAKIAl7CiAJCS50eXBlID0gSUlPX1RFTVAsCiAJCS5jaGFubmVsMiA9IElJT19OT19NT0QsCi0JCS5hZGRyZXNzID0gU1RfVEVNUF9MUFMzMzFBUF9PVVRfTF9BRERSLAorCQkuYWRkcmVzcyA9IFNUX1RFTVBfMV9PVVRfTF9BRERSLAogCQkuc2Nhbl9pbmRleCA9IC0xLAogCQkuc2Nhbl90eXBlID0gewogCQkJLnNpZ24gPSAndScsCkBAIC0xNTYsOCArMTgyLDggQEAKIAkJLnNlbnNvcnNfc3VwcG9ydGVkID0gewogCQkJWzBdID0gTFBTMzMxQVBfUFJFU1NfREVWX05BTUUsCiAJCX0sCi0JCS5jaCA9IChzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqKXN0X3ByZXNzX2xwczMzMWFwX2NoYW5uZWxzLAotCQkubnVtX2NoID0gQVJSQVlfU0laRShzdF9wcmVzc19scHMzMzFhcF9jaGFubmVscyksCisJCS5jaCA9IChzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqKXN0X3ByZXNzXzFfY2hhbm5lbHMsCisJCS5udW1fY2ggPSBBUlJBWV9TSVpFKHN0X3ByZXNzXzFfY2hhbm5lbHMpLAogCQkub2RyID0gewogCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMzMzFBUF9PRFJfQUREUiwKIAkJCS5tYXNrID0gU1RfUFJFU1NfTFBTMzMxQVBfT0RSX01BU0ssCkBAIC0yMzMsNiArMjU5LDUzIEBACiAJCS5tdWx0aV9yZWFkX2JpdCA9IFNUX1BSRVNTX0xQUzAwMVdQX01VTFRJUkVBRF9CSVQsCiAJCS5ib290aW1lID0gMiwKIAl9LAorCXsKKwkJLndhaSA9IFNUX1BSRVNTX0xQUzI1SF9XQUlfRVhQLAorCQkuc2Vuc29yc19zdXBwb3J0ZWQgPSB7CisJCQlbMF0gPSBMUFMyNUhfUFJFU1NfREVWX05BTUUsCisJCX0sCisJCS5jaCA9IChzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqKXN0X3ByZXNzXzFfY2hhbm5lbHMsCisJCS5udW1fY2ggPSBBUlJBWV9TSVpFKHN0X3ByZXNzXzFfY2hhbm5lbHMpLAorCQkub2RyID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfT0RSX0FERFIsCisJCQkubWFzayA9IFNUX1BSRVNTX0xQUzI1SF9PRFJfTUFTSywKKwkJCS5vZHJfYXZsID0geworCQkJCXsgMSwgU1RfUFJFU1NfTFBTMjVIX09EUl9BVkxfMUhaX1ZBTCwgfSwKKwkJCQl7IDcsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzdIWl9WQUwsIH0sCisJCQkJeyAxMywgU1RfUFJFU1NfTFBTMjVIX09EUl9BVkxfMTNIWl9WQUwsIH0sCisJCQkJeyAyNSwgU1RfUFJFU1NfTFBTMjVIX09EUl9BVkxfMjVIWl9WQUwsIH0sCisJCQl9LAorCQl9LAorCQkucHcgPSB7CisJCQkuYWRkciA9IFNUX1BSRVNTX0xQUzI1SF9QV19BRERSLAorCQkJLm1hc2sgPSBTVF9QUkVTU19MUFMyNUhfUFdfTUFTSywKKwkJCS52YWx1ZV9vbiA9IFNUX1NFTlNPUlNfREVGQVVMVF9QT1dFUl9PTl9WQUxVRSwKKwkJCS52YWx1ZV9vZmYgPSBTVF9TRU5TT1JTX0RFRkFVTFRfUE9XRVJfT0ZGX1ZBTFVFLAorCQl9LAorCQkuZnMgPSB7CisJCQkuYWRkciA9IFNUX1BSRVNTX0xQUzI1SF9GU19BRERSLAorCQkJLm1hc2sgPSBTVF9QUkVTU19MUFMyNUhfRlNfTUFTSywKKwkJCS5mc19hdmwgPSB7CisJCQkJWzBdID0geworCQkJCQkubnVtID0gU1RfUFJFU1NfRlNfQVZMXzEyNjBNQiwKKwkJCQkJLnZhbHVlID0gU1RfUFJFU1NfTFBTMjVIX0ZTX0FWTF8xMjYwX1ZBTCwKKwkJCQkJLmdhaW4gPSBTVF9QUkVTU19MUFMyNUhfRlNfQVZMXzEyNjBfR0FJTiwKKwkJCQkJLmdhaW4yID0gU1RfUFJFU1NfTFBTMjVIX0ZTX0FWTF9URU1QX0dBSU4sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJCS5iZHUgPSB7CisJCQkuYWRkciA9IFNUX1BSRVNTX0xQUzI1SF9CRFVfQUREUiwKKwkJCS5tYXNrID0gU1RfUFJFU1NfTFBTMjVIX0JEVV9NQVNLLAorCQl9LAorCQkuZHJkeV9pcnEgPSB7CisJCQkuYWRkciA9IFNUX1BSRVNTX0xQUzI1SF9EUkRZX0lSUV9BRERSLAorCQkJLm1hc2tfaW50MSA9IFNUX1BSRVNTX0xQUzI1SF9EUkRZX0lSUV9JTlQxX01BU0ssCisJCQkubWFza19pbnQyID0gU1RfUFJFU1NfTFBTMjVIX0RSRFlfSVJRX0lOVDJfTUFTSywKKwkJfSwKKwkJLm11bHRpX3JlYWRfYml0ID0gU1RfUFJFU1NfTFBTMjVIX01VTFRJUkVBRF9CSVQsCisJCS5ib290aW1lID0gMiwKKwl9LAogfTsKIAogc3RhdGljIGludCBzdF9wcmVzc19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9pMmMuYwppbmRleCA1MWVhYjdmLi4zY2Q3M2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9pMmMuYworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9pMmMuYwpAQCAtNTAsNiArNTAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3RfcHJlc3NfaWRfdGFibGVbXSA9IHsKIAl7IExQUzAwMVdQX1BSRVNTX0RFVl9OQU1FIH0sCisJeyBMUFMyNUhfUFJFU1NfREVWX05BTUUgfSwKIAl7IExQUzMzMUFQX1BSRVNTX0RFVl9OQU1FIH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9zcGkuYwppbmRleCAyNzMyMmFmLi5mNDVkNDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9zcGkuYworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9zcGkuYwpAQCAtNDksNiArNDksNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgc3RfcHJlc3NfaWRfdGFibGVbXSA9IHsKIAl7IExQUzAwMVdQX1BSRVNTX0RFVl9OQU1FIH0sCisJeyBMUFMyNUhfUFJFU1NfREVWX05BTUUgfSwKIAl7IExQUzMzMUFQX1BSRVNTX0RFVl9OQU1FIH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IGEwNmUxMjUuLmNlOTUzZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTk1NCwxMSArOTU0LDEzIEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQllcnJvciA9IGlucHV0X2ZmX3VwbG9hZChkZXYsICZlZmZlY3QsIGZpbGUpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CiAKIAkJaWYgKHB1dF91c2VyKGVmZmVjdC5pZCwgJigoKHN0cnVjdCBmZl9lZmZlY3QgX191c2VyICopcCktPmlkKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlyZXR1cm4gZXJyb3I7CisJCXJldHVybiAwOwogCX0KIAogCS8qIE11bHRpLW51bWJlciB2YXJpYWJsZS1sZW5ndGggaGFuZGxlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OC1rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jCmluZGV4IGJiM2I1N2IuLjVlZjdmY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OC1rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYwpAQCAtNzYsOCArNzYsMTggQEAKIAlzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhZHA1NTg4X2twYWQsIGdjKTsKIAl1bnNpZ25lZCBpbnQgYmFuayA9IEFEUDU1ODhfQkFOSyhrcGFkLT5ncGlvbWFwW29mZl0pOwogCXVuc2lnbmVkIGludCBiaXQgPSBBRFA1NTg4X0JJVChrcGFkLT5ncGlvbWFwW29mZl0pOworCWludCB2YWw7CiAKLQlyZXR1cm4gISEoYWRwNTU4OF9yZWFkKGtwYWQtPmNsaWVudCwgR1BJT19EQVRfU1RBVDEgKyBiYW5rKSAmIGJpdCk7CisJbXV0ZXhfbG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKKworCWlmIChrcGFkLT5kaXJbYmFua10gJiBiaXQpCisJCXZhbCA9IGtwYWQtPmRhdF9vdXRbYmFua107CisJZWxzZQorCQl2YWwgPSBhZHA1NTg4X3JlYWQoa3BhZC0+Y2xpZW50LCBHUElPX0RBVF9TVEFUMSArIGJhbmspOworCisJbXV0ZXhfdW5sb2NrKCZrcGFkLT5ncGlvX2xvY2spOworCisJcmV0dXJuICEhKHZhbCAmIGJpdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFkcDU1ODhfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9kYTkwNTJfb25rZXkuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9kYTkwNTJfb25rZXkuYwppbmRleCAxZjY5NWYyLi4xODRjOGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvZGE5MDUyX29ua2V5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2RhOTA1Ml9vbmtleS5jCkBAIC0yNywyOSArMjcsMzIgQEAKIAogc3RhdGljIHZvaWQgZGE5MDUyX29ua2V5X3F1ZXJ5KHN0cnVjdCBkYTkwNTJfb25rZXkgKm9ua2V5KQogewotCWludCBrZXlfc3RhdDsKKwlpbnQgcmV0OwogCi0Ja2V5X3N0YXQgPSBkYTkwNTJfcmVnX3JlYWQob25rZXktPmRhOTA1MiwgREE5MDUyX0VWRU5UX0JfUkVHKTsKLQlpZiAoa2V5X3N0YXQgPCAwKSB7CisJcmV0ID0gZGE5MDUyX3JlZ19yZWFkKG9ua2V5LT5kYTkwNTIsIERBOTA1Ml9TVEFUVVNfQV9SRUcpOworCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIob25rZXktPmRhOTA1Mi0+ZGV2LAotCQkJIkZhaWxlZCB0byByZWFkIG9ua2V5IGV2ZW50ICVkXG4iLCBrZXlfc3RhdCk7CisJCQkiRmFpbGVkIHRvIHJlYWQgb25rZXkgZXZlbnQgZXJyPSVkXG4iLCByZXQpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFNpbmNlIGludGVycnVwdCBmb3IgZGVhc3NlcnRpb24gb2YgT05LRVkgcGluIGlzIG5vdAogCQkgKiBnZW5lcmF0ZWQsIG9ua2V5IGV2ZW50IHN0YXRlIGRldGVybWluZXMgdGhlIG9ua2V5CiAJCSAqIGJ1dHRvbiBzdGF0ZS4KIAkJICovCi0JCWtleV9zdGF0ICY9IERBOTA1Ml9FVkVOVEJfRU5PTktFWTsKLQkJaW5wdXRfcmVwb3J0X2tleShvbmtleS0+aW5wdXQsIEtFWV9QT1dFUiwga2V5X3N0YXQpOwotCQlpbnB1dF9zeW5jKG9ua2V5LT5pbnB1dCk7Ci0JfQorCQlib29sIHByZXNzZWQgPSAhKHJldCAmIERBOTA1Ml9TVEFUVVNBX05PTktFWSk7CiAKLQkvKgotCSAqIEludGVycnVwdCBpcyBnZW5lcmF0ZWQgb25seSB3aGVuIHRoZSBPTktFWSBwaW4gaXMgYXNzZXJ0ZWQuCi0JICogSGVuY2UgdGhlIGRlYXNzZXJ0aW9uIG9mIHRoZSBwaW4gaXMgc2ltdWxhdGVkIHRocm91Z2ggd29yayBxdWV1ZS4KLQkgKi8KLQlpZiAoa2V5X3N0YXQpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmb25rZXktPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwkJaW5wdXRfcmVwb3J0X2tleShvbmtleS0+aW5wdXQsIEtFWV9QT1dFUiwgcHJlc3NlZCk7CisJCWlucHV0X3N5bmMob25rZXktPmlucHV0KTsKKworCQkvKgorCQkgKiBJbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIG9ubHkgd2hlbiB0aGUgT05LRVkgcGluCisJCSAqIGlzIGFzc2VydGVkLiAgSGVuY2UgdGhlIGRlYXNzZXJ0aW9uIG9mIHRoZSBwaW4KKwkJICogaXMgc2ltdWxhdGVkIHRocm91Z2ggd29yayBxdWV1ZS4KKwkJICovCisJCWlmIChwcmVzc2VkKQorCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZvbmtleS0+d29yaywKKwkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGRhOTA1Ml9vbmtleV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvY3lwcmVzc19wczIuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvY3lwcmVzc19wczIuYwppbmRleCA4NzA5NWUyLi44YWYzNGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2N5cHJlc3NfcHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9jeXByZXNzX3BzMi5jCkBAIC00MDksNyArNDA5LDYgQEAKIAlfX2NsZWFyX2JpdChSRUxfWCwgaW5wdXQtPnJlbGJpdCk7CiAJX19jbGVhcl9iaXQoUkVMX1ksIGlucHV0LT5yZWxiaXQpOwogCi0JX19zZXRfYml0KElOUFVUX1BST1BfQlVUVE9OUEFELCBpbnB1dC0+cHJvcGJpdCk7CiAJX19zZXRfYml0KEVWX0tFWSwgaW5wdXQtPmV2Yml0KTsKIAlfX3NldF9iaXQoQlROX0xFRlQsIGlucHV0LT5rZXliaXQpOwogCV9fc2V0X2JpdChCVE5fUklHSFQsIGlucHV0LT5rZXliaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKaW5kZXggMjYzODZmOS4uZDhkNDlkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCkBAIC0yNjUsMTEgKzI2NSwyMiBAQAogICogUmVhZCB0b3VjaHBhZCByZXNvbHV0aW9uIGFuZCBtYXhpbXVtIHJlcG9ydGVkIGNvb3JkaW5hdGVzCiAgKiBSZXNvbHV0aW9uIGlzIGxlZnQgemVybyBpZiB0b3VjaHBhZCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBxdWVyeQogICovCisKK3N0YXRpYyBjb25zdCBpbnQgKnF1aXJrX21pbl9tYXg7CisKIHN0YXRpYyBpbnQgc3luYXB0aWNzX3Jlc29sdXRpb24oc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBjaGFyIHJlc3BbM107CiAKKwlpZiAocXVpcmtfbWluX21heCkgeworCQlwcml2LT54X21pbiA9IHF1aXJrX21pbl9tYXhbMF07CisJCXByaXYtPnhfbWF4ID0gcXVpcmtfbWluX21heFsxXTsKKwkJcHJpdi0+eV9taW4gPSBxdWlya19taW5fbWF4WzJdOworCQlwcml2LT55X21heCA9IHF1aXJrX21pbl9tYXhbM107CisJCXJldHVybiAwOworCX0KKwogCWlmIChTWU5fSURfTUFKT1IocHJpdi0+aWRlbnRpdHkpIDwgNCkKIAkJcmV0dXJuIDA7CiAKQEAgLTE0ODUsMTAgKzE0OTYsNTQgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBtaW5fbWF4X2RtaV90YWJsZVtdIF9faW5pdGNvbnN0ID0geworI2lmIGRlZmluZWQoQ09ORklHX0RNSSkKKwl7CisJCS8qIExlbm92byBUaGlua1BhZCBIZWxpeCAqLworCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJUaGlua1BhZCBIZWxpeCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAoaW50IFtdKXsxMDI0LCA1MDUyLCAyMjU4LCA0ODMyfSwKKwl9LAorCXsKKwkJLyogTGVub3ZvIFRoaW5rUGFkIFgyNDAgKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJMRU5PVk8iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiVGhpbmtQYWQgWDI0MCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAoaW50IFtdKXsxMjMyLCA1NzEwLCAxMTU2LCA0Njk2fSwKKwl9LAorCXsKKwkJLyogTGVub3ZvIFRoaW5rUGFkIFQ0NDBzICovCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTEVOT1ZPIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIlRoaW5rUGFkIFQ0NDAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKGludCBbXSl7MTAyNCwgNTExMiwgMjAyNCwgNDgzMn0sCisJfSwKKwl7CisJCS8qIExlbm92byBUaGlua1BhZCBUNTQwcCAqLworCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJUaGlua1BhZCBUNTQwIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9IChpbnQgW10pezEwMjQsIDUwNTYsIDIwNTgsIDQ4MzJ9LAorCX0sCisjZW5kaWYKKwl7IH0KK307CisKIHZvaWQgX19pbml0IHN5bmFwdGljc19tb2R1bGVfaW5pdCh2b2lkKQogeworCWNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICptaW5fbWF4X2RtaTsKKwogCWltcGFpcmVkX3Rvc2hpYmFfa2JjID0gZG1pX2NoZWNrX3N5c3RlbSh0b3NoaWJhX2RtaV90YWJsZSk7CiAJYnJva2VuX29scGNfZWMgPSBkbWlfY2hlY2tfc3lzdGVtKG9scGNfZG1pX3RhYmxlKTsKKworCW1pbl9tYXhfZG1pID0gZG1pX2ZpcnN0X21hdGNoKG1pbl9tYXhfZG1pX3RhYmxlKTsKKwlpZiAobWluX21heF9kbWkpCisJCXF1aXJrX21pbl9tYXggPSBtaW5fbWF4X2RtaS0+ZHJpdmVyX2RhdGE7CiB9CiAKIHN0YXRpYyBpbnQgX19zeW5hcHRpY3NfaW5pdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgYm9vbCBhYnNvbHV0ZV9tb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCmluZGV4IDRjODQyYzMuLmI2MDQ1NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTY3LDcgKzY3LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3QgY2RldiBjZGV2OwogCWJvb2wgZXhpc3Q7Ci0JYm9vbCBpc19taXhkZXY7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1peGRldl9ub2RlOwogCWJvb2wgb3BlbmVkX2J5X21peGRldjsKQEAgLTc3LDYgKzc2LDkgQEAKIAlpbnQgb2xkX3hbNF0sIG9sZF95WzRdOwogCWludCBmcmFjX2R4LCBmcmFjX2R5OwogCXVuc2lnbmVkIGxvbmcgdG91Y2g7CisKKwlpbnQgKCpvcGVuX2RldmljZSkoc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldik7CisJdm9pZCAoKmNsb3NlX2RldmljZSkoc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldik7CiB9OwogCiBlbnVtIG1vdXNlZGV2X2VtdWwgewpAQCAtMTE2LDkgKzExOCw2IEBACiBzdGF0aWMgc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldl9taXg7CiBzdGF0aWMgTElTVF9IRUFEKG1vdXNlZGV2X21peF9saXN0KTsKIAotc3RhdGljIHZvaWQgbWl4ZGV2X29wZW5fZGV2aWNlcyh2b2lkKTsKLXN0YXRpYyB2b2lkIG1peGRldl9jbG9zZV9kZXZpY2VzKHZvaWQpOwotCiAjZGVmaW5lIGZ4KGkpICAobW91c2VkZXYtPm9sZF94Wyhtb3VzZWRldi0+cGt0X2NvdW50IC0gKGkpKSAmIDAzXSkKICNkZWZpbmUgZnkoaSkgIChtb3VzZWRldi0+b2xkX3lbKG1vdXNlZGV2LT5wa3RfY291bnQgLSAoaSkpICYgMDNdKQogCkBAIC00MjgsOSArNDI3LDcgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JaWYgKG1vdXNlZGV2LT5pc19taXhkZXYpCi0JCW1peGRldl9vcGVuX2RldmljZXMoKTsKLQllbHNlIGlmICghbW91c2VkZXYtPmV4aXN0KQorCWlmICghbW91c2VkZXYtPmV4aXN0KQogCQlyZXR2YWwgPSAtRU5PREVWOwogCWVsc2UgaWYgKCFtb3VzZWRldi0+b3BlbisrKSB7CiAJCXJldHZhbCA9IGlucHV0X29wZW5fZGV2aWNlKCZtb3VzZWRldi0+aGFuZGxlKTsKQEAgLTQ0Niw5ICs0NDMsNyBAQAogewogCW11dGV4X2xvY2soJm1vdXNlZGV2LT5tdXRleCk7CiAKLQlpZiAobW91c2VkZXYtPmlzX21peGRldikKLQkJbWl4ZGV2X2Nsb3NlX2RldmljZXMoKTsKLQllbHNlIGlmIChtb3VzZWRldi0+ZXhpc3QgJiYgIS0tbW91c2VkZXYtPm9wZW4pCisJaWYgKG1vdXNlZGV2LT5leGlzdCAmJiAhLS1tb3VzZWRldi0+b3BlbikKIAkJaW5wdXRfY2xvc2VfZGV2aWNlKCZtb3VzZWRldi0+aGFuZGxlKTsKIAogCW11dGV4X3VubG9jaygmbW91c2VkZXYtPm11dGV4KTsKQEAgLTQ1OSwyMSArNDU0LDI5IEBACiAgKiBzdHJlYW0uIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG1vdXNlZGV2X21peC0+bXV0ZXgKICAqIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkIG1peGRldl9vcGVuX2RldmljZXModm9pZCkKK3N0YXRpYyBpbnQgbWl4ZGV2X29wZW5fZGV2aWNlcyhzdHJ1Y3QgbW91c2VkZXYgKm1peGRldikKIHsKLQlzdHJ1Y3QgbW91c2VkZXYgKm1vdXNlZGV2OworCWludCBlcnJvcjsKIAotCWlmIChtb3VzZWRldl9taXgtPm9wZW4rKykKLQkJcmV0dXJuOworCWVycm9yID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZtaXhkZXYtPm11dGV4KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobW91c2VkZXYsICZtb3VzZWRldl9taXhfbGlzdCwgbWl4ZGV2X25vZGUpIHsKLQkJaWYgKCFtb3VzZWRldi0+b3BlbmVkX2J5X21peGRldikgewotCQkJaWYgKG1vdXNlZGV2X29wZW5fZGV2aWNlKG1vdXNlZGV2KSkKLQkJCQljb250aW51ZTsKKwlpZiAoIW1peGRldi0+b3BlbisrKSB7CisJCXN0cnVjdCBtb3VzZWRldiAqbW91c2VkZXY7CiAKLQkJCW1vdXNlZGV2LT5vcGVuZWRfYnlfbWl4ZGV2ID0gdHJ1ZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtb3VzZWRldiwgJm1vdXNlZGV2X21peF9saXN0LCBtaXhkZXZfbm9kZSkgeworCQkJaWYgKCFtb3VzZWRldi0+b3BlbmVkX2J5X21peGRldikgeworCQkJCWlmIChtb3VzZWRldl9vcGVuX2RldmljZShtb3VzZWRldikpCisJCQkJCWNvbnRpbnVlOworCisJCQkJbW91c2VkZXYtPm9wZW5lZF9ieV9taXhkZXYgPSB0cnVlOworCQkJfQogCQl9CiAJfQorCisJbXV0ZXhfdW5sb2NrKCZtaXhkZXYtPm11dGV4KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQ4MSwxOSArNDg0LDIyIEBACiAgKiBkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG1vdXNlZGV2X21peC0+bXV0ZXgKICAqIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkIG1peGRldl9jbG9zZV9kZXZpY2VzKHZvaWQpCitzdGF0aWMgdm9pZCBtaXhkZXZfY2xvc2VfZGV2aWNlcyhzdHJ1Y3QgbW91c2VkZXYgKm1peGRldikKIHsKLQlzdHJ1Y3QgbW91c2VkZXYgKm1vdXNlZGV2OworCW11dGV4X2xvY2soJm1peGRldi0+bXV0ZXgpOwogCi0JaWYgKC0tbW91c2VkZXZfbWl4LT5vcGVuKQotCQlyZXR1cm47CisJaWYgKCEtLW1peGRldi0+b3BlbikgeworCQlzdHJ1Y3QgbW91c2VkZXYgKm1vdXNlZGV2OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtb3VzZWRldiwgJm1vdXNlZGV2X21peF9saXN0LCBtaXhkZXZfbm9kZSkgewotCQlpZiAobW91c2VkZXYtPm9wZW5lZF9ieV9taXhkZXYpIHsKLQkJCW1vdXNlZGV2LT5vcGVuZWRfYnlfbWl4ZGV2ID0gZmFsc2U7Ci0JCQltb3VzZWRldl9jbG9zZV9kZXZpY2UobW91c2VkZXYpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vdXNlZGV2LCAmbW91c2VkZXZfbWl4X2xpc3QsIG1peGRldl9ub2RlKSB7CisJCQlpZiAobW91c2VkZXYtPm9wZW5lZF9ieV9taXhkZXYpIHsKKwkJCQltb3VzZWRldi0+b3BlbmVkX2J5X21peGRldiA9IGZhbHNlOworCQkJCW1vdXNlZGV2X2Nsb3NlX2RldmljZShtb3VzZWRldik7CisJCQl9CiAJCX0KIAl9CisKKwltdXRleF91bmxvY2soJm1peGRldi0+bXV0ZXgpOwogfQogCiAKQEAgLTUyMiw3ICs1MjgsNyBAQAogCW1vdXNlZGV2X2RldGFjaF9jbGllbnQobW91c2VkZXYsIGNsaWVudCk7CiAJa2ZyZWUoY2xpZW50KTsKIAotCW1vdXNlZGV2X2Nsb3NlX2RldmljZShtb3VzZWRldik7CisJbW91c2VkZXYtPmNsb3NlX2RldmljZShtb3VzZWRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU1MCw3ICs1NTYsNyBAQAogCWNsaWVudC0+bW91c2VkZXYgPSBtb3VzZWRldjsKIAltb3VzZWRldl9hdHRhY2hfY2xpZW50KG1vdXNlZGV2LCBjbGllbnQpOwogCi0JZXJyb3IgPSBtb3VzZWRldl9vcGVuX2RldmljZShtb3VzZWRldik7CisJZXJyb3IgPSBtb3VzZWRldi0+b3Blbl9kZXZpY2UobW91c2VkZXYpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJfZnJlZV9jbGllbnQ7CiAKQEAgLTg2MSwxNiArODY3LDIxIEBACiAKIAlpZiAobWl4ZGV2KSB7CiAJCWRldl9zZXRfbmFtZSgmbW91c2VkZXYtPmRldiwgIm1pY2UiKTsKKworCQltb3VzZWRldi0+b3Blbl9kZXZpY2UgPSBtaXhkZXZfb3Blbl9kZXZpY2VzOworCQltb3VzZWRldi0+Y2xvc2VfZGV2aWNlID0gbWl4ZGV2X2Nsb3NlX2RldmljZXM7CiAJfSBlbHNlIHsKIAkJaW50IGRldl9ubyA9IG1pbm9yOwogCQkvKiBOb3JtYWxpemUgZGV2aWNlIG51bWJlciBpZiBpdCBmYWxscyBpbnRvIGxlZ2FjeSByYW5nZSAqLwogCQlpZiAoZGV2X25vIDwgTU9VU0VERVZfTUlOT1JfQkFTRSArIE1PVVNFREVWX01JTk9SUykKIAkJCWRldl9ubyAtPSBNT1VTRURFVl9NSU5PUl9CQVNFOwogCQlkZXZfc2V0X25hbWUoJm1vdXNlZGV2LT5kZXYsICJtb3VzZSVkIiwgZGV2X25vKTsKKworCQltb3VzZWRldi0+b3Blbl9kZXZpY2UgPSBtb3VzZWRldl9vcGVuX2RldmljZTsKKwkJbW91c2VkZXYtPmNsb3NlX2RldmljZSA9IG1vdXNlZGV2X2Nsb3NlX2RldmljZTsKIAl9CiAKIAltb3VzZWRldi0+ZXhpc3QgPSB0cnVlOwotCW1vdXNlZGV2LT5pc19taXhkZXYgPSBtaXhkZXY7CiAJbW91c2VkZXYtPmhhbmRsZS5kZXYgPSBpbnB1dF9nZXRfZGV2aWNlKGRldik7CiAJbW91c2VkZXYtPmhhbmRsZS5uYW1lID0gZGV2X25hbWUoJm1vdXNlZGV2LT5kZXYpOwogCW1vdXNlZGV2LT5oYW5kbGUuaGFuZGxlciA9IGhhbmRsZXI7CkBAIC05MTksNyArOTMwLDcgQEAKIAlkZXZpY2VfZGVsKCZtb3VzZWRldi0+ZGV2KTsKIAltb3VzZWRldl9jbGVhbnVwKG1vdXNlZGV2KTsKIAlpbnB1dF9mcmVlX21pbm9yKE1JTk9SKG1vdXNlZGV2LT5kZXYuZGV2dCkpOwotCWlmICghbW91c2VkZXYtPmlzX21peGRldikKKwlpZiAobW91c2VkZXYgIT0gbW91c2VkZXZfbWl4KQogCQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZSgmbW91c2VkZXYtPmhhbmRsZSk7CiAJcHV0X2RldmljZSgmbW91c2VkZXYtPmRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaAppbmRleCBlNDAwZmJlLi5jZmYwMzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3R5cGVzLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KIAogLyoKICAqIE1heGltdW0gbnVtYmVyIG9mIElPTU1VcyBzdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZSBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQppbmRleCA1MTk0YWZiLi4xYzBjMTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiBvYmotJChDT05GSUdfQVJDSF9NT1hBUlQpCQkrPSBpcnEtbW94YXJ0Lm8KIG9iai0kKENPTkZJR19PUklPTl9JUlFDSElQKQkJKz0gaXJxLW9yaW9uLm8KIG9iai0kKENPTkZJR19BUkNIX1NVTlhJKQkJKz0gaXJxLXN1bjRpLm8KK29iai0kKENPTkZJR19BUkNIX1NVTlhJKQkJKz0gaXJxLXN1bnhpLW5taS5vCiBvYmotJChDT05GSUdfQVJDSF9TUEVBUjNYWCkJCSs9IHNwZWFyLXNoaXJxLm8KIG9iai0kKENPTkZJR19BUk1fR0lDKQkJCSs9IGlycS1naWMubwogb2JqLSQoQ09ORklHX0FSTV9OVklDKQkJCSs9IGlycS1udmljLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1hcm1hZGEtMzcwLXhwLmMKaW5kZXggNTQwOTU2NC4uNDFiZTg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1hcm1hZGEtMzcwLXhwLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1hcm1hZGEtMzcwLXhwLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgpAQCAtNDIsNiArNDMsNyBAQAogI2RlZmluZSBBUk1BREFfMzcwX1hQX0lOVF9TT1VSQ0VfQ1RMKGlycSkJKDB4MTAwICsgaXJxKjQpCiAKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9DUFVfSU5UQUNLX09GRlMJCSgweDQ0KQorI2RlZmluZSBBUk1BREFfMzc1X1BQSV9DQVVTRQkJCSgweDEwKQogCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfU1dfVFJJR19JTlRfT0ZGUyAgICAgICAgICAgKDB4NCkKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9JTl9EUkJFTF9NU0tfT0ZGUyAgICAgICAgICAoMHhjKQpAQCAtMzUyLDcgKzM1NCw2MyBAQAogCS54bGF0ZSA9IGlycV9kb21haW5feGxhdGVfb25lY2VsbCwKIH07CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyB2b2lkIGFybWFkYV8zNzBfeHBfaGFuZGxlX21zaV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGJvb2wgaXNfY2hhaW5lZCkKK3sKKwl1MzIgbXNpbWFzaywgbXNpbnI7CisKKwltc2ltYXNrID0gcmVhZGxfcmVsYXhlZChwZXJfY3B1X2ludF9iYXNlICsKKwkJCQlBUk1BREFfMzcwX1hQX0lOX0RSQkVMX0NBVVNFX09GRlMpCisJCSYgUENJX01TSV9ET09SQkVMTF9NQVNLOworCisJd3JpdGVsKH5tc2ltYXNrLCBwZXJfY3B1X2ludF9iYXNlICsKKwkgICAgICAgQVJNQURBXzM3MF9YUF9JTl9EUkJFTF9DQVVTRV9PRkZTKTsKKworCWZvciAobXNpbnIgPSBQQ0lfTVNJX0RPT1JCRUxMX1NUQVJUOworCSAgICAgbXNpbnIgPCBQQ0lfTVNJX0RPT1JCRUxMX0VORDsgbXNpbnIrKykgeworCQlpbnQgaXJxOworCisJCWlmICghKG1zaW1hc2sgJiBCSVQobXNpbnIpKSkKKwkJCWNvbnRpbnVlOworCisJCWlycSA9IGlycV9maW5kX21hcHBpbmcoYXJtYWRhXzM3MF94cF9tc2lfZG9tYWluLAorCQkJCSAgICAgICBtc2luciAtIDE2KTsKKworCQlpZiAoaXNfY2hhaW5lZCkKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOworCQllbHNlCisJCQloYW5kbGVfSVJRKGlycSwgcmVncyk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGFybWFkYV8zNzBfeHBfaGFuZGxlX21zaV9pcnEoc3RydWN0IHB0X3JlZ3MgKnIsIGJvb2wgYikge30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX21waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKHVuc2lnbmVkIGludCBpcnEsCisJCQkJCQkgIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwl1bnNpZ25lZCBsb25nIGlycW1hcCwgaXJxbjsKKwl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnE7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCWlycW1hcCA9IHJlYWRsX3JlbGF4ZWQocGVyX2NwdV9pbnRfYmFzZSArIEFSTUFEQV8zNzVfUFBJX0NBVVNFKTsKKworCWlmIChpcnFtYXAgJiBCSVQoMCkpIHsKKwkJYXJtYWRhXzM3MF94cF9oYW5kbGVfbXNpX2lycShOVUxMLCB0cnVlKTsKKwkJaXJxbWFwICY9IH5CSVQoMCk7CisJfQorCisJZm9yX2VhY2hfc2V0X2JpdChpcnFuLCAmaXJxbWFwLCBCSVRTX1BFUl9MT05HKSB7CisJCWNhc2NhZGVfaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluLCBpcnFuKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKKwl9CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkKIGFybWFkYV8zNzBfeHBfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgaXJxc3RhdCwgaXJxbnI7CkBAIC0zNzIsMzEgKzQzMCw5IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0jaWZkZWYgQ09ORklHX1BDSV9NU0kKIAkJLyogTVNJIGhhbmRsaW5nICovCi0JCWlmIChpcnFuciA9PSAxKSB7Ci0JCQl1MzIgbXNpbWFzaywgbXNpbnI7Ci0KLQkJCW1zaW1hc2sgPSByZWFkbF9yZWxheGVkKHBlcl9jcHVfaW50X2Jhc2UgKwotCQkJCQkJQVJNQURBXzM3MF9YUF9JTl9EUkJFTF9DQVVTRV9PRkZTKQotCQkJCSYgUENJX01TSV9ET09SQkVMTF9NQVNLOwotCi0JCQl3cml0ZWwofm1zaW1hc2ssIHBlcl9jcHVfaW50X2Jhc2UgKwotCQkJICAgICAgIEFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfQ0FVU0VfT0ZGUyk7Ci0KLQkJCWZvciAobXNpbnIgPSBQQ0lfTVNJX0RPT1JCRUxMX1NUQVJUOwotCQkJICAgICBtc2luciA8IFBDSV9NU0lfRE9PUkJFTExfRU5EOyBtc2lucisrKSB7Ci0JCQkJaW50IGlycTsKLQotCQkJCWlmICghKG1zaW1hc2sgJiBCSVQobXNpbnIpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGFybWFkYV8zNzBfeHBfbXNpX2RvbWFpbiwKLQkJCQkJCSAgICAgICBtc2luciAtIDE2KTsKLQkJCQloYW5kbGVfSVJRKGlycSwgcmVncyk7Ci0JCQl9Ci0JCX0KLSNlbmRpZgorCQlpZiAoaXJxbnIgPT0gMSkKKwkJCWFybWFkYV8zNzBfeHBfaGFuZGxlX21zaV9pcnEocmVncywgZmFsc2UpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCQkvKiBJUEkgSGFuZGxpbmcgKi8KQEAgLTQyNyw2ICs0NjMsNyBAQAogCQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQogewogCXN0cnVjdCByZXNvdXJjZSBtYWluX2ludF9yZXMsIHBlcl9jcHVfaW50X3JlczsKKwlpbnQgcGFyZW50X2lycTsKIAl1MzIgY29udHJvbDsKIAogCUJVR19PTihvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIDAsICZtYWluX2ludF9yZXMpKTsKQEAgLTQ1NSw4ICs0OTIsNiBAQAogCiAJQlVHX09OKCFhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKIAotCWlycV9zZXRfZGVmYXVsdF9ob3N0KGFybWFkYV8zNzBfeHBfbXBpY19kb21haW4pOwotCiAjaWZkZWYgQ09ORklHX1NNUAogCWFybWFkYV94cF9tcGljX3NtcF9jcHVfaW5pdCgpOwogCkBAIC00NzIsNyArNTA3LDE0IEBACiAKIAlhcm1hZGFfMzcwX3hwX21zaV9pbml0KG5vZGUsIG1haW5faW50X3Jlcy5zdGFydCk7CiAKLQlzZXRfaGFuZGxlX2lycShhcm1hZGFfMzcwX3hwX2hhbmRsZV9pcnEpOworCXBhcmVudF9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKKwlpZiAocGFyZW50X2lycSA8PSAwKSB7CisJCWlycV9zZXRfZGVmYXVsdF9ob3N0KGFybWFkYV8zNzBfeHBfbXBpY19kb21haW4pOworCQlzZXRfaGFuZGxlX2lycShhcm1hZGFfMzcwX3hwX2hhbmRsZV9pcnEpOworCX0gZWxzZSB7CisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBhcmVudF9pcnEsCisJCQkJCWFybWFkYV8zNzBfeHBfbXBpY19oYW5kbGVfY2FzY2FkZV9pcnEpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWJjbTI4MzUuYwppbmRleCAxNjkzYjhlLi41OTE2ZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWJjbTI4MzUuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWJjbTI4MzUuYwpAQCAtOTUsNyArOTUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBhcm1jdHJsX2ljIGludGMgX19yZWFkX21vc3RseTsKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGJjbTI4MzVfaGFuZGxlX2lycSgKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBiY20yODM1X2hhbmRsZV9pcnEoCiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBzdGF0aWMgdm9pZCBhcm1jdHJsX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKQEAgLTE5Niw3ICsxOTYsNyBAQAogCWhhbmRsZV9JUlEoaXJxX2xpbmVhcl9yZXZtYXAoaW50Yy5kb21haW4sIGlycSksIHJlZ3MpOwogfQogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBiY20yODM1X2hhbmRsZV9pcnEoCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgYmNtMjgzNV9oYW5kbGVfaXJxKAogCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXUzMiBzdGF0LCBpcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYwppbmRleCAzNDFjNjAxLi41MzE3NjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAogdW5pb24gZ2ljX2Jhc2UgewogCXZvaWQgX19pb21lbSAqY29tbW9uX2Jhc2U7Ci0Jdm9pZCBfX3BlcmNwdSBfX2lvbWVtICoqcGVyY3B1X2Jhc2U7CisJdm9pZCBfX3BlcmNwdSAqIF9faW9tZW0gKnBlcmNwdV9iYXNlOwogfTsKIAogc3RydWN0IGdpY19jaGlwX2RhdGEgewpAQCAtMjc5LDcgKzI3OSw3IEBACiAjZGVmaW5lIGdpY19zZXRfd2FrZQlOVUxMCiAjZW5kaWYKIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgZ2ljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgZ2ljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycXN0YXQsIGlycW5yOwogCXN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWMgPSAmZ2ljX2RhdGFbMF07CkBAIC02NDgsNyArNjQ4LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUAotdm9pZCBnaWNfcmFpc2Vfc29mdGlycShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGdpY19yYWlzZV9zb2Z0aXJxKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgaXJxKQogewogCWludCBjcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgbWFwID0gMDsKQEAgLTg2OSw3ICs4NjksNyBAQAogfTsKICNlbmRpZgogCi1jb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgZ2ljX2lycV9kb21haW5fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBnaWNfaXJxX2RvbWFpbl9vcHMgPSB7CiAJLm1hcCA9IGdpY19pcnFfZG9tYWluX21hcCwKIAkueGxhdGUgPSBnaWNfaXJxX2RvbWFpbl94bGF0ZSwKIH07CkBAIC05NzQsNyArOTc0LDggQEAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBpbnQgZ2ljX2NudCBfX2luaXRkYXRhOwogCi1pbnQgX19pbml0IGdpY19vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCitzdGF0aWMgaW50IF9faW5pdAorZ2ljX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKIHsKIAl2b2lkIF9faW9tZW0gKmNwdV9iYXNlOwogCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1tbXAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW1wLmMKaW5kZXggMmNiN2NkMC4uM2M4ODI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1tbXAuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1tcC5jCkBAIC0xOTQsOCArMTk0LDcgQEAKIAkuY29uZl9tYXNrCT0gMHg3ZiwKIH07CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5Ci1tbXBfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBtbXBfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaXJxLCBod2lycTsKIApAQCAtMjA3LDggKzIwNiw3IEBACiAJaGFuZGxlX0lSUShpcnEsIHJlZ3MpOwogfQogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeQotbW1wMl9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IG1tcDJfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaXJxLCBod2lycTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1tb3hhcnQuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW94YXJ0LmMKaW5kZXggNTU1MmZjMi4uMDBiM2NjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1tb3hhcnQuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1veGFydC5jCkBAIC00NCw3ICs0NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbW94YXJ0X2lycV9kYXRhIGludGM7CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGhhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgaXJxc3RhdDsKIAlpbnQgaHdpcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLW9yaW9uLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW9yaW9uLmMKaW5kZXggOGU0MWJlNi4uZTI1ZjI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1vcmlvbi5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtb3Jpb24uYwpAQCAtMzAsNyArMzAsNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9kb21haW4gKm9yaW9uX2lycV9kb21haW47CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQKK3N0YXRpYyB2b2lkCiBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgb3Jpb25faGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYyA9IG9yaW9uX2lycV9kb21haW4tPmdjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXNpcmZzb2MuYwppbmRleCAzYTA3MGM1Li41ODFlZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXNpcmZzb2MuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXNpcmZzb2MuYwpAQCAtNDcsNyArNDcsNyBAQAogCWN0LT5yZWdzLm1hc2sgPSBTSVJGU09DX0lOVF9SSVNDX01BU0swOwogfQogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzaXJmc29jX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgc2lyZnNvY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IHNpcmZzb2NfaXJxZG9tYWluLT5ob3N0X2RhdGE7CiAJdTMyIGlycXN0YXQsIGlycW5yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1zdW40aS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zdW40aS5jCmluZGV4IGE1NDM4ZDguLjZmY2VmNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VuNGkuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bjRpLmMKQEAgLTM2LDE4ICszNiwxNiBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqc3VuNGlfaXJxX2Jhc2U7CiBzdGF0aWMgc3RydWN0IGlycV9kb21haW4gKnN1bjRpX2lycV9kb21haW47CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHN1bjRpX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHN1bjRpX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBzdGF0aWMgdm9pZCBzdW40aV9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqaXJxZCkKIHsKIAl1bnNpZ25lZCBpbnQgaXJxID0gaXJxZF90b19od2lycShpcnFkKTsKLQl1bnNpZ25lZCBpbnQgaXJxX29mZiA9IGlycSAlIDMyOwotCWludCByZWcgPSBpcnEgLyAzMjsKLQl1MzIgdmFsOwogCi0JdmFsID0gcmVhZGwoc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfUEVORElOR19SRUcocmVnKSk7Ci0Jd3JpdGVsKHZhbCB8ICgxIDw8IGlycV9vZmYpLAotCSAgICAgICBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9QRU5ESU5HX1JFRyhyZWcpKTsKKwlpZiAoaXJxICE9IDApCisJCXJldHVybjsgLyogT25seSBJUlEgMCAvIHRoZSBFTk1JIG5lZWRzIHRvIGJlIGFja2VkICovCisKKwl3cml0ZWwoQklUKDApLCBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9QRU5ESU5HX1JFRygwKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bjRpX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqaXJxZCkKQEAgLTc2LDE2ICs3NCwxNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjRpX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJzdW40aV9pcnEiLAotCS5pcnFfYWNrCT0gc3VuNGlfaXJxX2FjaywKKwkuaXJxX2VvaQk9IHN1bjRpX2lycV9hY2ssCiAJLmlycV9tYXNrCT0gc3VuNGlfaXJxX21hc2ssCiAJLmlycV91bm1hc2sJPSBzdW40aV9pcnFfdW5tYXNrLAorCS5mbGFncwkJPSBJUlFDSElQX0VPSV9USFJFQURFRCB8IElSUUNISVBfRU9JX0lGX0hBTkRMRUQsCiB9OwogCiBzdGF0aWMgaW50IHN1bjRpX2lycV9tYXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAogCQkJIGlycV9od19udW1iZXJfdCBodykKIHsKLQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJnN1bjRpX2lycV9jaGlwLAotCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJnN1bjRpX2lycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOwogCXNldF9pcnFfZmxhZ3ModmlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDksNyArMTA3LDcgQEAKIAl3cml0ZWwoMCwgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfRU5BQkxFX1JFRygxKSk7CiAJd3JpdGVsKDAsIHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX0VOQUJMRV9SRUcoMikpOwogCi0JLyogTWFzayBhbGwgdGhlIGludGVycnVwdHMgKi8KKwkvKiBVbm1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzLCBFTkFCTEVfUkVHKHgpIGlzIHVzZWQgZm9yIG1hc2tpbmcgKi8KIAl3cml0ZWwoMCwgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfTUFTS19SRUcoMCkpOwogCXdyaXRlbCgwLCBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9NQVNLX1JFRygxKSk7CiAJd3JpdGVsKDAsIHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX01BU0tfUkVHKDIpKTsKQEAgLTEzNCwxNiArMTMyLDMwIEBACiAKIAlyZXR1cm4gMDsKIH0KLUlSUUNISVBfREVDTEFSRShhbGx3aW5uZXJfc3VuNGlfaWMsICJhbGx3aW5uZXIsc3VuNGktaWMiLCBzdW40aV9vZl9pbml0KTsKK0lSUUNISVBfREVDTEFSRShhbGx3aW5uZXJfc3VuNGlfaWMsICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIiwgc3VuNGlfb2ZfaW5pdCk7CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHN1bjRpX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgc3VuNGlfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgaXJxLCBod2lycTsKIAorCS8qCisJICogaHdpcnEgPT0gMCBjYW4gbWVhbiBvbmUgb2YgMyB0aGluZ3M6CisJICogMSkgbm8gbW9yZSBpcnFzIHBlbmRpbmcKKwkgKiAyKSBpcnEgMCBwZW5kaW5nCisJICogMykgc3B1cmlvdXMgaXJxCisJICogU28gaWYgd2UgaW1tZWRpYXRlbHkgZ2V0IGEgcmVhZGluZyBvZiAwLCBjaGVjayB0aGUgaXJxLXBlbmRpbmcgcmVnCisJICogdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIDIgYW5kIDMuIFdlIG9ubHkgZG8gdGhpcyBvbmNlIHRvIGF2b2lkCisJICogdGhlIGV4dHJhIGNoZWNrIGluIHRoZSBjb21tb24gY2FzZSBvZiAxIGhhcGVuaW5nIGFmdGVyIGhhdmluZworCSAqIHJlYWQgdGhlIHZlY3Rvci1yZWcgb25jZS4KKwkgKi8KIAlod2lycSA9IHJlYWRsKHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX1ZFQ1RPUl9SRUcpID4+IDI7Ci0Jd2hpbGUgKGh3aXJxICE9IDApIHsKKwlpZiAoaHdpcnEgPT0gMCAmJgorCQkgICEocmVhZGwoc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfUEVORElOR19SRUcoMCkpICYgQklUKDApKSkKKwkJcmV0dXJuOworCisJZG8gewogCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHN1bjRpX2lycV9kb21haW4sIGh3aXJxKTsKIAkJaGFuZGxlX0lSUShpcnEsIHJlZ3MpOwogCQlod2lycSA9IHJlYWRsKHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX1ZFQ1RPUl9SRUcpID4+IDI7Ci0JfQorCX0gd2hpbGUgKGh3aXJxICE9IDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1zdW54aS1ubWkuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VueGktbm1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VueGktbm1pLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBBbGx3aW5uZXIgQTIwL0EzMSBTb0NzIE5NSSBJUlEgY2hpcCBkcml2ZXIuCisgKgorICogQ2FybG8gQ2Fpb25lIDxjYXJsby5jYWlvbmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KKyNpbmNsdWRlICJpcnFjaGlwLmgiCisKKyNkZWZpbmUgU1VOWElfTk1JX1NSQ19UWVBFX01BU0sJMHgwMDAwMDAwMworCitlbnVtIHsKKwlTVU5YSV9TUkNfVFlQRV9MRVZFTF9MT1cgPSAwLAorCVNVTlhJX1NSQ19UWVBFX0VER0VfRkFMTElORywKKwlTVU5YSV9TUkNfVFlQRV9MRVZFTF9ISUdILAorCVNVTlhJX1NSQ19UWVBFX0VER0VfUklTSU5HLAorfTsKKworc3RydWN0IHN1bnhpX3NjX25taV9yZWdfb2ZmcyB7CisJdTMyIGN0cmw7CisJdTMyIHBlbmQ7CisJdTMyIGVuYWJsZTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VueGlfc2Nfbm1pX3JlZ19vZmZzIHN1bjdpX3JlZ19vZmZzID0geworCS5jdHJsCT0gMHgwMCwKKwkucGVuZAk9IDB4MDQsCisJLmVuYWJsZQk9IDB4MDgsCit9OworCitzdGF0aWMgc3RydWN0IHN1bnhpX3NjX25taV9yZWdfb2ZmcyBzdW42aV9yZWdfb2ZmcyA9IHsKKwkuY3RybAk9IDB4MDAsCisJLnBlbmQJPSAweDA0LAorCS5lbmFibGUJPSAweDM0LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIHN1bnhpX3NjX25taV93cml0ZShzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHUzMiBvZmYsCisJCQkJICAgICAgdTMyIHZhbCkKK3sKKwlpcnFfcmVnX3dyaXRlbCh2YWwsIGdjLT5yZWdfYmFzZSArIG9mZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHN1bnhpX3NjX25taV9yZWFkKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYywgdTMyIG9mZikKK3sKKwlyZXR1cm4gaXJxX3JlZ19yZWFkbChnYy0+cmVnX2Jhc2UgKyBvZmYpOworfQorCitzdGF0aWMgdm9pZCBzdW54aV9zY19ubWlfaGFuZGxlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJdW5zaWduZWQgaW50IHZpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGRvbWFpbiwgMCk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKwlnZW5lcmljX2hhbmRsZV9pcnEodmlycSk7CisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKK30KKworc3RhdGljIGludCBzdW54aV9zY19ubWlfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdCA9IGdjLT5jaGlwX3R5cGVzOworCXUzMiBzcmNfdHlwZV9yZWc7CisJdTMyIGN0cmxfb2ZmID0gY3QtPnJlZ3MudHlwZTsKKwl1bnNpZ25lZCBpbnQgc3JjX3R5cGU7CisJdW5zaWduZWQgaW50IGk7CisKKwlpcnFfZ2NfbG9jayhnYyk7CisKKwlzd2l0Y2ggKGZsb3dfdHlwZSAmIElSUUZfVFJJR0dFUl9NQVNLKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXNyY190eXBlID0gU1VOWElfU1JDX1RZUEVfRURHRV9GQUxMSU5HOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlzcmNfdHlwZSA9IFNVTlhJX1NSQ19UWVBFX0VER0VfUklTSU5HOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCXNyY190eXBlID0gU1VOWElfU1JDX1RZUEVfTEVWRUxfSElHSDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9OT05FOgorCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQlzcmNfdHlwZSA9IFNVTlhJX1NSQ19UWVBFX0xFVkVMX0xPVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaXJxX2djX3VubG9jayhnYyk7CisJCXByX2VycigiJXM6IENhbm5vdCBhc3NpZ24gbXVsdGlwbGUgdHJpZ2dlciBtb2RlcyB0byBJUlEgJWQuXG4iLAorCQkJX19mdW5jX18sIGRhdGEtPmlycSk7CisJCXJldHVybiAtRUJBRFI7CisJfQorCisJaXJxZF9zZXRfdHJpZ2dlcl90eXBlKGRhdGEsIGZsb3dfdHlwZSk7CisJaXJxX3NldHVwX2FsdF9jaGlwKGRhdGEsIGZsb3dfdHlwZSk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IGdjLT5udW1fY3Q7IGkrKywgY3QrKykKKwkJaWYgKGN0LT50eXBlICYgZmxvd190eXBlKQorCQkJY3RybF9vZmYgPSBjdC0+cmVncy50eXBlOworCisJc3JjX3R5cGVfcmVnID0gc3VueGlfc2Nfbm1pX3JlYWQoZ2MsIGN0cmxfb2ZmKTsKKwlzcmNfdHlwZV9yZWcgJj0gflNVTlhJX05NSV9TUkNfVFlQRV9NQVNLOworCXNyY190eXBlX3JlZyB8PSBzcmNfdHlwZTsKKwlzdW54aV9zY19ubWlfd3JpdGUoZ2MsIGN0cmxfb2ZmLCBzcmNfdHlwZV9yZWcpOworCisJaXJxX2djX3VubG9jayhnYyk7CisKKwlyZXR1cm4gSVJRX1NFVF9NQVNLX09LOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzdW54aV9zY19ubWlfaXJxX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCQlzdHJ1Y3Qgc3VueGlfc2Nfbm1pX3JlZ19vZmZzICpyZWdfb2ZmcykKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGludCBjbHIgPSBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkUgfCBJUlFfTk9BVVRPRU47CisJaW50IHJldDsKKworCisJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5vZGUsIDEsICZpcnFfZ2VuZXJpY19jaGlwX29wcywgTlVMTCk7CisJaWYgKCFkb21haW4pIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IHJlZ2lzdGVyIGludGVycnVwdCBkb21haW4uXG4iLCBub2RlLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gaXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKGRvbWFpbiwgMSwgMiwgbm9kZS0+bmFtZSwKKwkJCQkJICAgICBoYW5kbGVfZmFzdGVvaV9pcnEsIGNsciwgMCwKKwkJCQkJICAgICBJUlFfR0NfSU5JVF9NQVNLX0NBQ0hFKTsKKwlpZiAocmV0KSB7CisJCSBwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgZ2VuZXJpYyBpbnRlcnJ1cHQgY2hpcC5cbiIsCisJCQkgbm9kZS0+bmFtZSk7CisJCSBnb3RvIGZhaWxfaXJxZF9yZW1vdmU7CisJfQorCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJaWYgKGlycSA8PSAwKSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBwYXJzZSBpcnFcbiIsIG5vZGUtPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfaXJxZF9yZW1vdmU7CisJfQorCisJZ2MgPSBpcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoZG9tYWluLCAwKTsKKwlnYy0+cmVnX2Jhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlpZiAoIWdjLT5yZWdfYmFzZSkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gbWFwIHJlc291cmNlXG4iLCBub2RlLT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2lycWRfcmVtb3ZlOworCX0KKworCWdjLT5jaGlwX3R5cGVzWzBdLnR5cGUJCQk9IElSUV9UWVBFX0xFVkVMX01BU0s7CisJZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5pcnFfbWFzawkJPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWdjLT5jaGlwX3R5cGVzWzBdLmNoaXAuaXJxX3VubWFzawk9IGlycV9nY19tYXNrX3NldF9iaXQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5pcnFfZW9pCQk9IGlycV9nY19hY2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlc1swXS5jaGlwLmlycV9zZXRfdHlwZQk9IHN1bnhpX3NjX25taV9zZXRfdHlwZTsKKwlnYy0+Y2hpcF90eXBlc1swXS5jaGlwLmZsYWdzCQk9IElSUUNISVBfRU9JX1RIUkVBREVEIHwgSVJRQ0hJUF9FT0lfSUZfSEFORExFRDsKKwlnYy0+Y2hpcF90eXBlc1swXS5yZWdzLmFjawkJPSByZWdfb2Zmcy0+cGVuZDsKKwlnYy0+Y2hpcF90eXBlc1swXS5yZWdzLm1hc2sJCT0gcmVnX29mZnMtPmVuYWJsZTsKKwlnYy0+Y2hpcF90eXBlc1swXS5yZWdzLnR5cGUJCT0gcmVnX29mZnMtPmN0cmw7CisKKwlnYy0+Y2hpcF90eXBlc1sxXS50eXBlCQkJPSBJUlFfVFlQRV9FREdFX0JPVEg7CisJZ2MtPmNoaXBfdHlwZXNbMV0uY2hpcC5uYW1lCQk9IGdjLT5jaGlwX3R5cGVzWzBdLmNoaXAubmFtZTsKKwlnYy0+Y2hpcF90eXBlc1sxXS5jaGlwLmlycV9hY2sJCT0gaXJxX2djX2Fja19zZXRfYml0OworCWdjLT5jaGlwX3R5cGVzWzFdLmNoaXAuaXJxX21hc2sJCT0gaXJxX2djX21hc2tfY2xyX2JpdDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5jaGlwLmlycV91bm1hc2sJPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWdjLT5jaGlwX3R5cGVzWzFdLmNoaXAuaXJxX3NldF90eXBlCT0gc3VueGlfc2Nfbm1pX3NldF90eXBlOworCWdjLT5jaGlwX3R5cGVzWzFdLnJlZ3MuYWNrCQk9IHJlZ19vZmZzLT5wZW5kOworCWdjLT5jaGlwX3R5cGVzWzFdLnJlZ3MubWFzawkJPSByZWdfb2Zmcy0+ZW5hYmxlOworCWdjLT5jaGlwX3R5cGVzWzFdLnJlZ3MudHlwZQkJPSByZWdfb2Zmcy0+Y3RybDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5oYW5kbGVyCQk9IGhhbmRsZV9lZGdlX2lycTsKKworCXN1bnhpX3NjX25taV93cml0ZShnYywgcmVnX29mZnMtPmVuYWJsZSwgMCk7CisJc3VueGlfc2Nfbm1pX3dyaXRlKGdjLCByZWdfb2Zmcy0+cGVuZCwgMHgxKTsKKworCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgZG9tYWluKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIHN1bnhpX3NjX25taV9oYW5kbGVfaXJxKTsKKworCXJldHVybiAwOworCitmYWlsX2lycWRfcmVtb3ZlOgorCWlycV9kb21haW5fcmVtb3ZlKGRvbWFpbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBzdW42aV9zY19ubWlfaXJxX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwlyZXR1cm4gc3VueGlfc2Nfbm1pX2lycV9pbml0KG5vZGUsICZzdW42aV9yZWdfb2Zmcyk7Cit9CitJUlFDSElQX0RFQ0xBUkUoc3VuNmlfc2Nfbm1pLCAiYWxsd2lubmVyLHN1bjZpLWEzMS1zYy1ubWkiLCBzdW42aV9zY19ubWlfaXJxX2luaXQpOworCitzdGF0aWMgaW50IF9faW5pdCBzdW43aV9zY19ubWlfaXJxX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwlyZXR1cm4gc3VueGlfc2Nfbm1pX2lycV9pbml0KG5vZGUsICZzdW43aV9yZWdfb2Zmcyk7Cit9CitJUlFDSElQX0RFQ0xBUkUoc3VuN2lfc2Nfbm1pLCAiYWxsd2lubmVyLHN1bjdpLWEyMC1zYy1ubWkiLCBzdW43aV9zY19ubWlfaXJxX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS12aWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmljLmMKaW5kZXggOGUyMWFlMC4uNDczZjA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS12aWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXZpYy5jCkBAIC0yMjgsNyArMjI4LDcgQEAKICAqIEtlZXAgaXRlcmF0aW5nIG92ZXIgYWxsIHJlZ2lzdGVyZWQgVklDJ3MgdW50aWwgdGhlcmUgYXJlIG5vIHBlbmRpbmcKICAqIGludGVycnVwdHMuCiAgKi8KLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHZpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHZpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBpLCBoYW5kbGVkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLXZ0ODUwMC5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS12dDg1MDAuYwppbmRleCAxODQ2ZTdkLi5lYjZlOTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXZ0ODUwMC5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtdnQ4NTAwLmMKQEAgLTE3OCw4ICsxNzgsNyBAQAogCS54bGF0ZSA9IGlycV9kb21haW5feGxhdGVfb25lY2VsbCwKIH07CiAKLXN0YXRpYyBhc21saW5rYWdlCi12b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB2dDg1MDBfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB2dDg1MDBfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgc3RhdCwgaTsKIAlpbnQgaXJxbnIsIHZpcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLXh0ZW5zYS1teC5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS14dGVuc2EtbXguYwppbmRleCBmNjkzZjFiLi5lMWMyZjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXh0ZW5zYS1teC5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEteHRlbnNhLW14LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogc3RhdGljIGludCB4dGVuc2FfbXhfaXJxX3NldF9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmQsCiAJCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0LCBib29sIGZvcmNlKQogewotCXVuc2lnbmVkIG1hc2sgPSAxdSA8PCBjcHVtYXNrX2FueShkZXN0KTsKKwl1bnNpZ25lZCBtYXNrID0gMXUgPDwgY3B1bWFza19hbnlfYW5kKGRlc3QsIGNwdV9vbmxpbmVfbWFzayk7CiAKIAlzZXRfZXIobWFzaywgTUlST1VUKGQtPmh3aXJxIC0gSFdfSVJRX01YX0JBU0UpKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtemV2aW8uYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtemV2aW8uYwppbmRleCA4ZWQwNGM0Li5jZWIzYTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS16ZXZpby5jCkBAIC01MCw3ICs1MCw3IEBACiAJcmVhZGwoZ2MtPnJlZ19iYXNlICsgcmVncy0+YWNrKTsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgemV2aW9faGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB6ZXZpb19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBpcnFucjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycWNoaXAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnFjaGlwLmMKaW5kZXggZjQ5NmFmYy4uY2FkM2UyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycWNoaXAuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxY2hpcC5jCkBAIC0xMCw4ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0KLSNpbmNsdWRlICJpcnFjaGlwLmgiCisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC5oPgogCiAvKgogICogVGhpcyBzcGVjaWFsIG9mX2RldmljZV9pZCBpcyB0aGUgc2VudGluZWwgYXQgdGhlIGVuZCBvZiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCmluZGV4IGYwNDY4NjUuLjk4MTZjNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZwpAQCAtMTYsMTYgKzE2LDYgQEAKIAkgIFRoaXMgd2lsbCBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUga2VybmVsY2FwaSBtb2R1bGUgYnkgMjAgS0IuCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCi1jb25maWcgSVNETl9DQVBJX01JRERMRVdBUkUKLQlib29sICJDQVBJMi4wIE1pZGRsZXdhcmUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFRUWQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHdpbGwgZW5oYW5jZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSAvZGV2L2NhcGkyMAotCSAgaW50ZXJmYWNlLiAgSXQgd2lsbCBwcm92aWRlIGEgbWVhbnMgb2YgbW92aW5nIGEgZGF0YSBjb25uZWN0aW9uLAotCSAgZXN0YWJsaXNoZWQgdmlhIHRoZSB1c3VhbCAvZGV2L2NhcGkyMCBpbnRlcmZhY2UgdG8gYSBzcGVjaWFsIHR0eQotCSAgZGV2aWNlLiAgSWYgeW91IHdhbnQgdG8gdXNlIHBwcGQgd2l0aCBwcHBkY2FwaXBsdWdpbiB0byBkaWFsIHVwIHRvCi0JICB5b3VyIElTUCwgc2F5IFkgaGVyZS4KLQogY29uZmlnIElTRE5fQ0FQSV9DQVBJMjAKIAl0cmlzdGF0ZSAiQ0FQSTIuMCAvZGV2L2NhcGkgc3VwcG9ydCIKIAloZWxwCkBAIC0zNCw2ICsyNCwxNiBAQAogCSAgc3RhbmRhcmRpemVkIGxpYmNhcGkyMCB0byBhY2Nlc3MgdGhpcyBmdW5jdGlvbmFsaXR5LiAgWW91IHNob3VsZCBzYXkKIAkgIFkvTSBoZXJlLgogCitjb25maWcgSVNETl9DQVBJX01JRERMRVdBUkUKKwlib29sICJDQVBJMi4wIE1pZGRsZXdhcmUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTRE5fQ0FQSV9DQVBJMjAgJiYgVFRZCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBlbmhhbmNlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIC9kZXYvY2FwaTIwCisJICBpbnRlcmZhY2UuICBJdCB3aWxsIHByb3ZpZGUgYSBtZWFucyBvZiBtb3ZpbmcgYSBkYXRhIGNvbm5lY3Rpb24sCisJICBlc3RhYmxpc2hlZCB2aWEgdGhlIHVzdWFsIC9kZXYvY2FwaTIwIGludGVyZmFjZSB0byBhIHNwZWNpYWwgdHR5CisJICBkZXZpY2UuICBJZiB5b3Ugd2FudCB0byB1c2UgcHBwZCB3aXRoIHBwcGRjYXBpcGx1Z2luIHRvIGRpYWwgdXAgdG8KKwkgIHlvdXIgSVNQLCBzYXkgWSBoZXJlLgorCiBjb25maWcgSVNETl9DQVBJX0NBUElEUlYKIAl0cmlzdGF0ZSAiQ0FQSTIuMCBjYXBpZHJ2IGludGVyZmFjZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNETl9JNEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKaW5kZXggMDRhNTA0OS4uOWU5YzU2NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2lmZGVmIENPTkZJR19QUEMKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CkBAIC0xOTMsOCArMTkzLDcgQEAKIAkJCQkJYnJlYWs7CiAKIAkJCQlub01vdmVtZW50ID0gMDsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIE5vIGRldmljZXMgbGVmdCBhdCBhZGRyZXNzIGk7IG1vdmUgdGhlCiAJCQkJICogb25lKHMpIHdlIG1vdmVkIHRvIGBoaWdoRnJlZScgYmFjayB0byBpLgpAQCAtMjYzLDcgKzI2Miw3IEBACiAvKgogICogbm90aWZ5IGNsaWVudHMgYmVmb3JlIHNsZWVwCiAgKi8KLXN0YXRpYyBpbnQgYWRiX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IF9fYWRiX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJYWRiX2dvdF9zbGVlcCA9IDE7CiAJLyogV2UgbmVlZCB0byBnZXQgYSBsb2NrIG9uIHRoZSBwcm9iZSB0aHJlYWQgKi8KQEAgLTI3NiwxMCArMjc1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYWRiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfX2FkYl9zdXNwZW5kKHRvX3BsYXRmb3JtX2RldmljZShkZXYpLCBQTVNHX1NVU1BFTkQpOworfQorCitzdGF0aWMgaW50IGFkYl9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfX2FkYl9zdXNwZW5kKHRvX3BsYXRmb3JtX2RldmljZShkZXYpLCBQTVNHX0ZSRUVaRSk7Cit9CisKK3N0YXRpYyBpbnQgYWRiX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19hZGJfc3VzcGVuZCh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSwgUE1TR19ISUJFUk5BVEUpOworfQorCiAvKgogICogcmVzZXQgYnVzIGFmdGVyIHNsZWVwCiAgKi8KLXN0YXRpYyBpbnQgYWRiX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fYWRiX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJYWRiX2dvdF9zbGVlcCA9IDA7CiAJdXAoJmFkYl9wcm9iZV9tdXRleCk7CkBAIC0yODcsNiArMzAxLDExIEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCBhZGJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19hZGJfcmVzdW1lKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKK30KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogc3RhdGljIGludCBfX2luaXQgYWRiX2luaXQodm9pZCkKQEAgLTUwMiw3ICs1MjEsNyBAQAogYWRiX2lucHV0KHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG5iLCBpbnQgYXV0b3BvbGwpCiB7CiAJaW50IGksIGlkOwotCXN0YXRpYyBpbnQgZHVtcF9hZGJfaW5wdXQgPSAwOworCXN0YXRpYyBpbnQgZHVtcF9hZGJfaW5wdXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKIAl2b2lkICgqaGFuZGxlcikodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCk7CkBAIC02MjQsOCArNjQzLDcgQEAKIHsKIAlpbnQJcmV0ID0gLUVJTlZBTDsKIAotCXN3aXRjaChyZXEtPmRhdGFbMV0pCi0JeworCXN3aXRjaChyZXEtPmRhdGFbMV0pIHsKIAljYXNlIEFEQl9RVUVSWV9HRVRERVZJTkZPOgogCQlpZiAocmVxLT5uYnl0ZXMgPCAzKQogCQkJYnJlYWs7CkBAIC02OTcsNyArNzE1LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgYWRiZGV2X3N0YXRlICpzdGF0ZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYWRiX3JlcXVlc3QgKnJlcTsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LGN1cnJlbnQpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY291bnQgPCAyKQpAQCAtNzk0LDggKzgxMiw4IEBACiAJfQogCS8qIFNwZWNpYWwgY2FzZSBmb3IgQURCX0JVU1JFU0VUIHJlcXVlc3QsIGFsbCBvdGhlcnMgYXJlIHNlbnQgdG8KIAkgICB0aGUgY29udHJvbGxlciAqLwotCWVsc2UgaWYgKChyZXEtPmRhdGFbMF0gPT0gQURCX1BBQ0tFVCkmJihjb3VudCA+IDEpCi0JCSYmKHJlcS0+ZGF0YVsxXSA9PSBBREJfQlVTUkVTRVQpKSB7CisJZWxzZSBpZiAoKHJlcS0+ZGF0YVswXSA9PSBBREJfUEFDS0VUKSAmJiAoY291bnQgPiAxKQorCQkmJiAocmVxLT5kYXRhWzFdID09IEFEQl9CVVNSRVNFVCkpIHsKIAkJcmV0ID0gZG9fYWRiX3Jlc2V0X2J1cygpOwogCQl1cCgmYWRiX3Byb2JlX211dGV4KTsKIAkJYXRvbWljX2RlYygmc3RhdGUtPm5fcGVuZGluZyk7CkBAIC04MzEsMTQgKzg0OSwyNSBAQAogCS5yZWxlYXNlCT0gYWRiX3JlbGVhc2UsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYWRiX2Rldl9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBhZGJfc3VzcGVuZCwKKwkucmVzdW1lID0gYWRiX3Jlc3VtZSwKKwkvKiBIaWJlcm5hdGUgaG9va3MgKi8KKwkuZnJlZXplID0gYWRiX2ZyZWV6ZSwKKwkudGhhdyA9IGFkYl9yZXN1bWUsCisJLnBvd2Vyb2ZmID0gYWRiX3Bvd2Vyb2ZmLAorCS5yZXN0b3JlID0gYWRiX3Jlc3VtZSwKK307CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWRiX3BmZHJ2ID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImFkYiIsCi0JfSwKICNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZCA9IGFkYl9zdXNwZW5kLAotCS5yZXN1bWUgPSBhZGJfcmVzdW1lLAorCQkucG0gPSAmYWRiX2Rldl9wbV9vcHMsCiAjZW5kaWYKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYWRiX3BmZGV2ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvS2NvbmZpZyBiL2RyaXZlcnMvbWNiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhNjk3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL0tjb25maWcKQEAgLTAsMCArMSwzMSBAQAorIworIyBNRU4gQ2hhbWVsZW9uIEJ1cyAoTUNCKSBzdXBwb3J0CisjCisKK21lbnVjb25maWcgTUNCCisJICAgdHJpc3RhdGUgIk1DQiBzdXBwb3J0IgorCSAgIGRlZmF1bHQgbgorCSAgIGRlcGVuZHMgb24gSEFTX0lPTUVNCisJICAgaGVscAorCisJICAgVGhlIE1DQiAoTUVOIENoYW1lbGVvbiBCdXMpIGlzIGEgQnVzIHNwZWNpZmljIHRvIE1FTiBNaWtyb2VsZWt0cm9uaWsKKwkgICBGUEdBIGJhc2VkIGRldmljZXMuIEl0IGlzIHVzZWQgdG8gaWRlbnRpZnkgTUNCIGJhc2VkIElQLUNvcmVzIHdpdGhpbgorCSAgIGFuIEZQR0EgYW5kIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBmcmFtZXdvcmsgZm9yIGluc3RhbnRpYXRpbmcgZHJpdmVycworCSAgIGZvciB0aGVzZSBkZXZpY2VzLgorCisJICAgSWYgYnVpbGQgYXMgYSBtb2R1bGUsIHRoZSBtb2R1bGUgaXMgY2FsbGVkIG1jYi5rbworCitpZiBNQ0IKK2NvbmZpZyBNQ0JfUENJCisJICAgdHJpc3RhdGUgIlBDSSBiYXNlZCBNQ0IgY2FycmllciIKKwkgICBkZWZhdWx0IG4KKwkgICBkZXBlbmRzIG9uIFBDSQorCSAgIGhlbHAKKworCSAgIFRoaXMgaXMgYSBNQ0IgY2FycmllciBvbiBhIFBDSSBkZXZpY2UuIEJvdGggUENJIGF0dGFjaGVkIG9uLWJvYXJkCisJICAgRlBHQXMgYXMgd2VsbCBhcyBDb21wYWN0UENJIGF0dGFjaGVkIE1DQiBGUEdBcyBhcmUgc3VwcG9ydGVkIHdpdGgKKwkgICB0aGlzIGRyaXZlci4KKworCSAgIElmIGJ1aWxkIGFzIGEgbW9kdWxlLCB0aGUgbW9kdWxlIGlzIGNhbGxlZCBtY2ItcGNpLmtvCisKK2VuZGlmICMgTUNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWNiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTE0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKworb2JqLSQoQ09ORklHX01DQikgKz0gbWNiLm8KKworbWNiLXkgKz0gbWNiLWNvcmUubworbWNiLXkgKz0gbWNiLXBhcnNlLm8KKworb2JqLSQoQ09ORklHX01DQl9QQ0kpICs9IG1jYi1wY2kubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLWNvcmUuYyBiL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMTI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBNRU4gQ2hhbWVsZW9uIEJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTUVOIE1pa3JvZWxla3Ryb25payBHbWJIICh3d3cubWVuLmRlKQorICogQXV0aG9yOiBKb2hhbm5lcyBUaHVtc2hpcm4gPGpvaGFubmVzLnRodW1zaGlybkBtZW4uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2IuaD4KKworc3RhdGljIERFRklORV9JREEobWNiX2lkYSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqbWNiX21hdGNoX2lkKGNvbnN0IHN0cnVjdCBtY2JfZGV2aWNlX2lkICppZHMsCisJCQkJCQlzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KQoreworCWlmIChpZHMpIHsKKwkJd2hpbGUgKGlkcy0+ZGV2aWNlKSB7CisJCQlpZiAoaWRzLT5kZXZpY2UgPT0gZGV2LT5pZCkKKwkJCQlyZXR1cm4gaWRzOworCQkJaWRzKys7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBtY2JfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBtY2JfZHJpdmVyICptZHJ2ID0gdG9fbWNiX2RyaXZlcihkcnYpOworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCWNvbnN0IHN0cnVjdCBtY2JfZGV2aWNlX2lkICpmb3VuZF9pZDsKKworCWZvdW5kX2lkID0gbWNiX21hdGNoX2lkKG1kcnYtPmlkX3RhYmxlLCBtZGV2KTsKKwlpZiAoZm91bmRfaWQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNiX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9bWNiOjE2eiUwM2QiLCBtZGV2LT5pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY2JfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtY2JfZHJpdmVyICptZHJ2ID0gdG9fbWNiX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisJY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmZvdW5kX2lkOworCisJZm91bmRfaWQgPSBtY2JfbWF0Y2hfaWQobWRydi0+aWRfdGFibGUsIG1kZXYpOworCWlmICghZm91bmRfaWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIG1kcnYtPnByb2JlKG1kZXYsIGZvdW5kX2lkKTsKK30KKworc3RhdGljIGludCBtY2JfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWNiX2RyaXZlciAqbWRydiA9IHRvX21jYl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCisJbWRydi0+cmVtb3ZlKG1kZXYpOworCisJcHV0X2RldmljZSgmbWRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2Jfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCXN0cnVjdCBtY2JfZHJpdmVyICptZHJ2ID0gbWRldi0+ZHJpdmVyOworCisJaWYgKG1kcnYgJiYgbWRydi0+c2h1dGRvd24pCisJCW1kcnYtPnNodXRkb3duKG1kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIG1jYl9idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJtY2IiLAorCS5tYXRjaCA9IG1jYl9tYXRjaCwKKwkudWV2ZW50ID0gbWNiX3VldmVudCwKKwkucHJvYmUgPSBtY2JfcHJvYmUsCisJLnJlbW92ZSA9IG1jYl9yZW1vdmUsCisJLnNodXRkb3duID0gbWNiX3NodXRkb3duLAorfTsKKworLyoqCisgKiBfX21jYl9yZWdpc3Rlcl9kcml2ZXIoKSAtIFJlZ2lzdGVyIGEgQG1jYl9kcml2ZXIgYXQgdGhlIHN5c3RlbQorICogQGRydjogVGhlIEBtY2JfZHJpdmVyCisgKiBAb3duZXI6IFRoZSBAbWNiX2RyaXZlcidzIG1vZHVsZQorICogQG1vZF9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgQG1jYl9kcml2ZXIncyBtb2R1bGUKKyAqCisgKiBSZWdpc3RlciBhIEBtY2JfZHJpdmVyIGF0IHRoZSBzeXN0ZW0uIFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLCBpZgorICogdGhlIC5wcm9iZSBhbmQgLnJlbW92ZSBtZXRob2RzIGFyZSBwcm92aWRlZCBieSB0aGUgZHJpdmVyLgorICovCitpbnQgX19tY2JfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtY2JfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQkJY29uc3QgY2hhciAqbW9kX25hbWUpCit7CisJaWYgKCFkcnYtPnByb2JlIHx8ICFkcnYtPnJlbW92ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOworCWRydi0+ZHJpdmVyLmJ1cyA9ICZtY2JfYnVzX3R5cGU7CisJZHJ2LT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKKworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbWNiX3JlZ2lzdGVyX2RyaXZlcik7CisKKy8qKgorICogbWNiX3VucmVnaXN0ZXJfZHJpdmVyKCkgLSBVbnJlZ2lzdGVyIGEgQG1jYl9kcml2ZXIgZnJvbSB0aGUgc3lzdGVtCisgKiBAZHJ2OiBUaGUgQG1jYl9kcml2ZXIKKyAqCisgKiBVbnJlZ2lzdGVyIGEgQG1jYl9kcml2ZXIgZnJvbSB0aGUgc3lzdGVtLgorICovCit2b2lkIG1jYl91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWNiX2RyaXZlciAqZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfdW5yZWdpc3Rlcl9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBtY2JfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCisJbWNiX2J1c19wdXQobWRldi0+YnVzKTsKKwlrZnJlZShtZGV2KTsKK30KKworLyoqCisgKiBtY2JfZGV2aWNlX3JlZ2lzdGVyKCkgLSBSZWdpc3RlciBhIG1jYl9kZXZpY2UKKyAqIEBidXM6IFRoZSBAbWNiX2J1cyBvZiB0aGUgZGV2aWNlCisgKiBAZGV2OiBUaGUgQG1jYl9kZXZpY2UKKyAqCisgKiBSZWdpc3RlciBhIHNwZWNpZmljIEBtY2JfZGV2aWNlIGF0IGEgQG1jYl9idXMgYW5kIHRoZSBzeXN0ZW0gaXRzZWxmLgorICovCitpbnQgbWNiX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgbWNiX2J1cyAqYnVzLCBzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisJaW50IGRldmljZV9pZDsKKworCWRldmljZV9pbml0aWFsaXplKCZkZXYtPmRldik7CisJZGV2LT5kZXYuYnVzID0gJm1jYl9idXNfdHlwZTsKKwlkZXYtPmRldi5wYXJlbnQgPSBidXMtPmRldi5wYXJlbnQ7CisJZGV2LT5kZXYucmVsZWFzZSA9IG1jYl9yZWxlYXNlX2RldjsKKworCWRldmljZV9pZCA9IGRldi0+aWQ7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIm1jYiVkLTE2eiUwM2QtJWQ6JWQ6JWQiLAorCQlidXMtPmJ1c19uciwgZGV2aWNlX2lkLCBkZXYtPmluc3QsIGRldi0+Z3JvdXAsIGRldi0+dmFyKTsKKworCXJldCA9IGRldmljZV9hZGQoJmRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWxlZCByZWdpc3RlcmluZyBkZXZpY2UgMTZ6JTAzZCBvbiBidXMgbWNiJWQgKCVkKVxuIiwKKwkJCWRldmljZV9pZCwgYnVzLT5idXNfbnIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiAwOworCitvdXQ6CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2RldmljZV9yZWdpc3Rlcik7CisKKy8qKgorICogbWNiX2FsbG9jX2J1cygpIC0gQWxsb2NhdGUgYSBuZXcgQG1jYl9idXMKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyBAbWNiX2J1cy4KKyAqLworc3RydWN0IG1jYl9idXMgKm1jYl9hbGxvY19idXModm9pZCkKK3sKKwlzdHJ1Y3QgbWNiX2J1cyAqYnVzOworCWludCBidXNfbnI7CisKKwlidXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWNiX2J1cyksIEdGUF9LRVJORUwpOworCWlmICghYnVzKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1c19uciA9IGlkYV9zaW1wbGVfZ2V0KCZtY2JfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVzX25yIDwgMCkgeworCQlrZnJlZShidXMpOworCQlyZXR1cm4gRVJSX1BUUihidXNfbnIpOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZidXMtPmNoaWxkcmVuKTsKKwlidXMtPmJ1c19uciA9IGJ1c19ucjsKKworCXJldHVybiBidXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfYWxsb2NfYnVzKTsKKworc3RhdGljIGludCBfX21jYl9kZXZpY2VzX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWRldmljZV91bnJlZ2lzdGVyKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1jYl9kZXZpY2VzX3VucmVnaXN0ZXIoc3RydWN0IG1jYl9idXMgKmJ1cykKK3sKKwlidXNfZm9yX2VhY2hfZGV2KCZtY2JfYnVzX3R5cGUsIE5VTEwsIE5VTEwsIF9fbWNiX2RldmljZXNfdW5yZWdpc3Rlcik7Cit9CisvKioKKyAqIG1jYl9yZWxlYXNlX2J1cygpIC0gRnJlZSBhIEBtY2JfYnVzCisgKiBAYnVzOiBUaGUgQG1jYl9idXMgdG8gcmVsZWFzZQorICoKKyAqIFJlbGVhc2UgYW4gYWxsb2NhdGVkIEBtY2JfYnVzIGZyb20gdGhlIHN5c3RlbS4KKyAqLwordm9pZCBtY2JfcmVsZWFzZV9idXMoc3RydWN0IG1jYl9idXMgKmJ1cykKK3sKKwltY2JfZGV2aWNlc191bnJlZ2lzdGVyKGJ1cyk7CisKKwlpZGFfc2ltcGxlX3JlbW92ZSgmbWNiX2lkYSwgYnVzLT5idXNfbnIpOworCisJa2ZyZWUoYnVzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9yZWxlYXNlX2J1cyk7CisKKy8qKgorICogbWNiX2J1c19wdXQoKSAtIEluY3JlbWVudCByZWZjbnQKKyAqIEBidXM6IFRoZSBAbWNiX2J1cworICoKKyAqIEdldCBhIEBtY2JfYnVzJyByZWYKKyAqLworc3RydWN0IG1jYl9idXMgKm1jYl9idXNfZ2V0KHN0cnVjdCBtY2JfYnVzICpidXMpCit7CisJaWYgKGJ1cykKKwkJZ2V0X2RldmljZSgmYnVzLT5kZXYpOworCisJcmV0dXJuIGJ1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9idXNfZ2V0KTsKKworLyoqCisgKiBtY2JfYnVzX3B1dCgpIC0gRGVjcmVtZW50IHJlZmNudAorICogQGJ1czogVGhlIEBtY2JfYnVzCisgKgorICogUmVsZWFzZSBhIEBtY2JfYnVzJyByZWYKKyAqLwordm9pZCBtY2JfYnVzX3B1dChzdHJ1Y3QgbWNiX2J1cyAqYnVzKQoreworCWlmIChidXMpCisJCXB1dF9kZXZpY2UoJmJ1cy0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9idXNfcHV0KTsKKworLyoqCisgKiBtY2JfYWxsb2NfZGV2KCkgLSBBbGxvY2F0ZSBhIGRldmljZQorICogQGJ1czogVGhlIEBtY2JfYnVzIHRoZSBkZXZpY2UgaXMgcGFydCBvZgorICoKKyAqIEFsbG9jYXRlIGEgQG1jYl9kZXZpY2UgYW5kIGFkZCBidXMuCisgKi8KK3N0cnVjdCBtY2JfZGV2aWNlICptY2JfYWxsb2NfZGV2KHN0cnVjdCBtY2JfYnVzICpidXMpCit7CisJc3RydWN0IG1jYl9kZXZpY2UgKmRldjsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2JfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+YnVzX2xpc3QpOworCWRldi0+YnVzID0gYnVzOworCisJcmV0dXJuIGRldjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9hbGxvY19kZXYpOworCisvKioKKyAqIG1jYl9mcmVlX2RldigpIC0gRnJlZSBAbWNiX2RldmljZQorICogQGRldjogVGhlIGRldmljZSB0byBmcmVlCisgKgorICogRnJlZSBhIEBtY2JfZGV2aWNlCisgKi8KK3ZvaWQgbWNiX2ZyZWVfZGV2KHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJa2ZyZWUoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9mcmVlX2Rldik7CisKK3N0YXRpYyBpbnQgX19tY2JfYnVzX2FkZF9kZXZpY2VzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKwlpbnQgcmV0dmFsOworCisJaWYgKG1kZXYtPmlzX2FkZGVkKQorCQlyZXR1cm4gMDsKKworCXJldHZhbCA9IGRldmljZV9hdHRhY2goZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycihkZXYsICJFcnJvciBhZGRpbmcgZGV2aWNlICglZClcbiIsIHJldHZhbCk7CisKKwltZGV2LT5pc19hZGRlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21jYl9idXNfYWRkX2NoaWxkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbWNiX2J1cyAqY2hpbGQ7CisKKwlCVUdfT04oIW1kZXYtPmlzX2FkZGVkKTsKKwljaGlsZCA9IG1kZXYtPnN1Ym9yZGluYXRlOworCisJaWYgKGNoaWxkKQorCQltY2JfYnVzX2FkZF9kZXZpY2VzKGNoaWxkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1jYl9idXNfYWRkX2RldmljZXMoKSAtIEFkZCBkZXZpY2VzIGluIHRoZSBidXMnIGludGVybmFsIGRldmljZSBsaXN0CisgKiBAYnVzOiBUaGUgQG1jYl9idXMgd2UgYWRkIHRoZSBkZXZpY2VzCisgKgorICogQWRkIGRldmljZXMgaW4gdGhlIGJ1cycgaW50ZXJuYWwgZGV2aWNlIGxpc3QgdG8gdGhlIHN5c3RlbS4KKyAqLwordm9pZCBtY2JfYnVzX2FkZF9kZXZpY2VzKGNvbnN0IHN0cnVjdCBtY2JfYnVzICpidXMpCit7CisJYnVzX2Zvcl9lYWNoX2RldigmbWNiX2J1c190eXBlLCBOVUxMLCBOVUxMLCBfX21jYl9idXNfYWRkX2RldmljZXMpOworCWJ1c19mb3JfZWFjaF9kZXYoJm1jYl9idXNfdHlwZSwgTlVMTCwgTlVMTCwgX19tY2JfYnVzX2FkZF9jaGlsZCk7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9idXNfYWRkX2RldmljZXMpOworCisvKioKKyAqIG1jYl9yZXF1ZXN0X21lbSgpIC0gUmVxdWVzdCBtZW1vcnkKKyAqIEBkZXY6IFRoZSBAbWNiX2RldmljZSB0aGUgbWVtb3J5IGlzIGZvcgorICogQG5hbWU6IFRoZSBuYW1lIGZvciB0aGUgbWVtb3J5IHJlZmVyZW5jZS4KKyAqCisgKiBSZXF1ZXN0IG1lbW9yeSBmb3IgYSBAbWNiX2RldmljZS4gSWYgQG5hbWUgaXMgTlVMTCB0aGUgZHJpdmVyIG5hbWUgd2lsbAorICogYmUgdXNlZC4KKyAqLworc3RydWN0IHJlc291cmNlICptY2JfcmVxdWVzdF9tZW0oc3RydWN0IG1jYl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl1MzIgc2l6ZTsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9IGRldi0+ZGV2LmRyaXZlci0+bmFtZTsKKworCXNpemUgPSByZXNvdXJjZV9zaXplKCZkZXYtPm1lbSk7CisKKwltZW0gPSByZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5tZW0uc3RhcnQsIHNpemUsIG5hbWUpOworCWlmICghbWVtKQorCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOworCisJcmV0dXJuIG1lbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9yZXF1ZXN0X21lbSk7CisKKy8qKgorICogbWNiX3JlbGVhc2VfbWVtKCkgLSBSZWxlYXNlIG1lbW9yeSByZXF1ZXN0ZWQgYnkgZGV2aWNlCisgKiBAZGV2OiBUaGUgQG1jYl9kZXZpY2UgdGhhdCByZXF1ZXN0ZWQgdGhlIG1lbW9yeQorICoKKyAqIFJlbGVhc2UgbWVtb3J5IHRoYXQgd2FzIHByaW9yIHJlcXVlc3RlZCB2aWEgQG1jYl9yZXF1ZXN0X21lbSgpLgorICovCit2b2lkIG1jYl9yZWxlYXNlX21lbShzdHJ1Y3QgcmVzb3VyY2UgKm1lbSkKK3sKKwl1MzIgc2l6ZTsKKworCXNpemUgPSByZXNvdXJjZV9zaXplKG1lbSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHNpemUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX3JlbGVhc2VfbWVtKTsKKworLyoqCisgKiBtY2JfZ2V0X2lycSgpIC0gR2V0IGRldmljZSdzIElSUSBudW1iZXIKKyAqIEBkZXY6IFRoZSBAbWNiX2RldmljZSB0aGUgSVJRIGlzIGZvcgorICoKKyAqIEdldCB0aGUgSVJRIG51bWJlciBvZiBhIGdpdmVuIEBtY2JfZGV2aWNlLgorICovCitpbnQgbWNiX2dldF9pcnEoc3RydWN0IG1jYl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlycSA9ICZkZXYtPmlycTsKKworCXJldHVybiBpcnEtPnN0YXJ0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2dldF9pcnEpOworCitzdGF0aWMgaW50IG1jYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGJ1c19yZWdpc3RlcigmbWNiX2J1c190eXBlKTsKK30KKworc3RhdGljIHZvaWQgbWNiX2V4aXQodm9pZCkKK3sKKwlidXNfdW5yZWdpc3RlcigmbWNiX2J1c190eXBlKTsKK30KKworLyogbWNiIG11c3QgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgUENJIGJ1dCBiZWZvcmUgdGhlIGNoYW1lbGVvbiBkcml2ZXJzLgorICogVGhhdCBtZWFucyB3ZSBtdXN0IHVzZSBzb21lIGluaXRjYWxsIGJldHdlZW4gc3Vic3lzX2luaXRjYWxsIGFuZAorICogZGV2aWNlX2luaXRjYWxsLgorICovCitmc19pbml0Y2FsbChtY2JfaW5pdCk7Cittb2R1bGVfZXhpdChtY2JfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTUVOIENoYW1lbGVvbiBCdXMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKb2hhbm5lcyBUaHVtc2hpcm4gPGpvaGFubmVzLnRodW1zaGlybkBtZW4uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTZlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaApAQCAtMCwwICsxLDExOCBAQAorI2lmbmRlZiBfX01DQl9JTlRFUk5BTAorI2RlZmluZSBfX01DQl9JTlRFUk5BTAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01FTgkJMHgxYTg4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVOX0NIQU1FTEVPTgkweDRkNDUKKyNkZWZpbmUgQ0hBTUVMRU9OX0ZJTEVOQU1FX0xFTgkJMTIKKyNkZWZpbmUgQ0hBTUVMRU9OVjJfTUFHSUMJCTB4YWJjZQorCitlbnVtIGNoYW1lbGVvbl9kZXNjcmlwdG9yX3R5cGUgeworCUNIQU1FTEVPTl9EVFlQRV9HRU5FUkFMID0gMHgwLAorCUNIQU1FTEVPTl9EVFlQRV9CUklER0UgPSAweDEsCisJQ0hBTUVMRU9OX0RUWVBFX0NQVSA9IDB4MiwKKwlDSEFNRUxFT05fRFRZUEVfQkFSID0gMHgzLAorCUNIQU1FTEVPTl9EVFlQRV9FTkQgPSAweGYsCit9OworCitlbnVtIGNoYW1lbGVvbl9idXNfdHlwZSB7CisJQ0hBTUVMRU9OX0JVU19XSVNIQk9ORSwKKwlDSEFNRUxFT05fQlVTX0FWQUxPTiwKKwlDSEFNRUxFT05fQlVTX0xQQywKKwlDSEFNRUxFT05fQlVTX0lTQSwKK307CisKKy8qKgorICogc3RydWN0IGNoYW1lbGVvbl9mcGdhX2hlYWRlcgorICoKKyAqIEByZXZpc2lvbjoJUmV2aXNvbiBvZiBDaGFtZWxlb24gdGFibGUgaW4gRlBHQQorICogQG1vZGVsOglDaGFtZWxlb24gdGFibGUgbW9kZWwgQVNDSUkgY2hhcgorICogQG1pbm9yOglSZXZpc2lvbiBtaW5vcgorICogQGJ1c190eXBlOglCdXMgdHlwZSAodXN1YWxseSAlQ0hBTUVMRU9OX0JVU19XSVNIQk9ORSkKKyAqIEBtYWdpYzoJQ2hhbWVsZW9uIGhlYWRlciBtYWdpYyBudW1iZXIgKDB4YWJjZSBmb3IgdmVyc2lvbiAyKQorICogQHJlc2VydmVkOglSZXNlcnZlZAorICogQGZpbGVuYW1lOglGaWxlbmFtZSBvZiBGUEdBIGJpdHN0cmVhbQorICovCitzdHJ1Y3QgY2hhbWVsZW9uX2ZwZ2FfaGVhZGVyIHsKKwl1OCByZXZpc2lvbjsKKwljaGFyIG1vZGVsOworCXU4IG1pbm9yOworCXU4IGJ1c190eXBlOworCXUxNiBtYWdpYzsKKwl1MTYgcmVzZXJ2ZWQ7CisJLyogVGhpcyBvbmUgaGFzIG5vICdcMCcgYXQgdGhlIGVuZCEhISAqLworCWNoYXIgZmlsZW5hbWVbQ0hBTUVMRU9OX0ZJTEVOQU1FX0xFTl07Cit9IF9fcGFja2VkOworI2RlZmluZSBIRUFERVJfTUFHSUNfT0ZGU0VUIDB4NAorCisvKioKKyAqIHN0cnVjdCBjaGFtZWxlb25fZ2RkIC0gQ2hhbWVsZW9uIEdlbmVyYWwgRGV2aWNlIERlc2NyaXB0b3IKKyAqCisgKiBAaXJxOgl0aGUgcG9zaXRpb24gaW4gdGhlIEZQR0EncyBJUlEgY29udHJvbGxlciB2ZWN0b3IKKyAqIEByZXY6CXRoZSByZXZpc2lvbiBvZiB0aGUgdmFyaWFudCdzIGltcGxlbWVudGF0aW9uCisgKiBAdmFyOgl0aGUgdmFyaWFudCBvZiB0aGUgSVAgY29yZQorICogQGRldjoJdGhlIGRldmljZSAgdGhlIElQIGNvcmUgaXMKKyAqIEBkdHlwZToJZGV2aWNlIGRlc2NyaXB0b3IgdHlwZQorICogQGJhcjoJQkFSIG9mZnNldCB0aGF0IG11c3QgYmUgYWRkZWQgdG8gbW9kdWxlIG9mZnNldAorICogQGluc3Q6CXRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhlIGRldmljZSwgMCBpcyBmaXJzdCBpbnN0YW5jZQorICogQGdyb3VwOgl0aGUgZ3JvdXAgdGhlIGRldmljZSBiZWxvbmdzIHRvICgwID0gbm8gZ3JvdXApCisgKiBAcmVzZXJ2ZWQ6CXJlc2VydmVkCisgKiBAb2Zmc2V0OgliZWdpbm5pbmcgb2YgdGhlIGFkZHJlc3Mgd2luZG93IG9mIGRlc2lyZWQgbW9kdWxlCisgKiBAc2l6ZToJc2l6ZSBvZiB0aGUgbW9kdWxlJ3MgYWRkcmVzcyB3aW5kb3cKKyAqLworc3RydWN0IGNoYW1lbGVvbl9nZGQgeworCV9fbGUzMiByZWcxOworCV9fbGUzMiByZWcyOworCV9fbGUzMiBvZmZzZXQ7CisJX19sZTMyIHNpemU7CisKK30gX19wYWNrZWQ7CisKKy8qIEdERCBSZWdpc3RlciAxIGZpZWxkcyAqLworI2RlZmluZSBHRERfSVJRKHgpICgoeCkgJiAweDFmKQorI2RlZmluZSBHRERfUkVWKHgpICgoKHgpID4+IDUpICYgMHgzZikKKyNkZWZpbmUgR0REX1ZBUih4KSAoKCh4KSA+PiAxMSkgJiAweDNmKQorI2RlZmluZSBHRERfREVWKHgpICgoKHgpID4+IDE4KSAmIDB4M2ZmKQorI2RlZmluZSBHRERfRFRZKHgpICgoKHgpID4+IDI4KSAmIDB4ZikKKworLyogR0REIFJlZ2lzdGVyIDIgZmllbGRzICovCisjZGVmaW5lIEdERF9CQVIoeCkgKCh4KSAmIDB4NykKKyNkZWZpbmUgR0REX0lOUyh4KSAoKCh4KSA+PiAzKSAmIDB4M2YpCisjZGVmaW5lIEdERF9HUlAoeCkgKCgoeCkgPj4gOSkgJiAweDNmKQorCisvKioKKyAqIHN0cnVjdCBjaGFtZWxlb25fYmRkIC0gQ2hhbWVsZW9uIEJyaWRnZSBEZXZpY2UgRGVzY3JpcHRvcgorICoKKyAqIEBpcnE6CXRoZSBwb3NpdGlvbiBpbiB0aGUgRlBHQSdzIElSUSBjb250cm9sbGVyIHZlY3RvcgorICogQHJldjoJdGhlIHJldmlzaW9uIG9mIHRoZSB2YXJpYW50J3MgaW1wbGVtZW50YXRpb24KKyAqIEB2YXI6CXRoZSB2YXJpYW50IG9mIHRoZSBJUCBjb3JlCisgKiBAZGV2Ogl0aGUgZGV2aWNlICB0aGUgSVAgY29yZSBpcworICogQGR0eXBlOglkZXZpY2UgZGVzY3JpcHRvciB0eXBlCisgKiBAYmFyOglCQVIgb2Zmc2V0IHRoYXQgbXVzdCBiZSBhZGRlZCB0byBtb2R1bGUgb2Zmc2V0CisgKiBAaW5zdDoJdGhlIGluc3RhbmNlIG51bWJlciBvZiB0aGUgZGV2aWNlLCAwIGlzIGZpcnN0IGluc3RhbmNlCisgKiBAZGJhcjoJZGVzdGluYXRpb24gYmFyIGZyb20gdGhlIGJ1cyBfYmVoaW5kXyB0aGUgYnJpZGdlCisgKiBAY2hhbW9mZjoJb2Zmc2V0IHdpdGhpbiB0aGUgQkFSIG9mIHRoZSBzb3VyY2UgYnVzCisgKiBAb2Zmc2V0OgorICogQHNpemU6CisgKi8KK3N0cnVjdCBjaGFtZWxlb25fYmRkIHsKKwl1bnNpZ25lZCBpbnQgaXJxOjY7CisJdW5zaWduZWQgaW50IHJldjo2OworCXVuc2lnbmVkIGludCB2YXI6NjsKKwl1bnNpZ25lZCBpbnQgZGV2OjEwOworCXVuc2lnbmVkIGludCBkdHlwZTo0OworCXVuc2lnbmVkIGludCBiYXI6MzsKKwl1bnNpZ25lZCBpbnQgaW5zdDo2OworCXVuc2lnbmVkIGludCBkYmFyOjM7CisJdW5zaWduZWQgaW50IGdyb3VwOjY7CisJdW5zaWduZWQgaW50IHJlc2VydmVkOjE0OworCXUzMiBjaGFtb2ZmOworCXUzMiBvZmZzZXQ7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitpbnQgY2hhbWVsZW9uX3BhcnNlX2NlbGxzKHN0cnVjdCBtY2JfYnVzICpidXMsIHBoeXNfYWRkcl90IG1hcGJhc2UsCisJCQkgIHZvaWQgX19pb21lbSAqYmFzZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMgYi9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTI3OGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMKQEAgLTAsMCArMSwxNTkgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21jYi5oPgorCisjaW5jbHVkZSAibWNiLWludGVybmFsLmgiCisKK3N0cnVjdCBtY2JfcGFyc2VfcHJpdiB7CisJcGh5c19hZGRyX3QgbWFwYmFzZTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCisjZGVmaW5lIGZvcl9lYWNoX2NoYW1lbGVvbl9jZWxsKGR0eXBlLCBwKQlcCisJZm9yICgoZHR5cGUpID0gZ2V0X25leHRfZHR5cGUoKHApKTsJXAorCSAgICAgKGR0eXBlKSAhPSBDSEFNRUxFT05fRFRZUEVfRU5EOwlcCisJICAgICAoZHR5cGUpID0gZ2V0X25leHRfZHR5cGUoKHApKSkKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfbmV4dF9kdHlwZSh2b2lkIF9faW9tZW0gKnApCit7CisJdWludDMyX3QgZHR5cGU7CisKKwlkdHlwZSA9IHJlYWRsKHApOworCXJldHVybiBkdHlwZSA+PiAyODsKK30KKworc3RhdGljIGludCBjaGFtZWxlb25fcGFyc2VfYmRkKHN0cnVjdCBtY2JfYnVzICpidXMsCisJCQlwaHlzX2FkZHJfdCBtYXBiYXNlLAorCQkJdm9pZCBfX2lvbWVtICpiYXNlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoYW1lbGVvbl9wYXJzZV9nZGQoc3RydWN0IG1jYl9idXMgKmJ1cywKKwkJCXBoeXNfYWRkcl90IG1hcGJhc2UsCisJCQl2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJc3RydWN0IGNoYW1lbGVvbl9nZGQgX19pb21lbSAqZ2RkID0KKwkJKHN0cnVjdCBjaGFtZWxlb25fZ2RkIF9faW9tZW0gKikgYmFzZTsKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldjsKKwl1MzIgb2Zmc2V0OworCXUzMiBzaXplOworCWludCByZXQ7CisJX19sZTMyIHJlZzE7CisJX19sZTMyIHJlZzI7CisKKwltZGV2ID0gbWNiX2FsbG9jX2RldihidXMpOworCWlmICghbWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWcxID0gcmVhZGwoJmdkZC0+cmVnMSk7CisJcmVnMiA9IHJlYWRsKCZnZGQtPnJlZzIpOworCW9mZnNldCA9IHJlYWRsKCZnZGQtPm9mZnNldCk7CisJc2l6ZSA9IHJlYWRsKCZnZGQtPnNpemUpOworCisJbWRldi0+aWQgPSBHRERfREVWKHJlZzEpOworCW1kZXYtPnJldiA9IEdERF9SRVYocmVnMSk7CisJbWRldi0+dmFyID0gR0REX1ZBUihyZWcxKTsKKwltZGV2LT5iYXIgPSBHRERfQkFSKHJlZzEpOworCW1kZXYtPmdyb3VwID0gR0REX0dSUChyZWcyKTsKKwltZGV2LT5pbnN0ID0gR0REX0lOUyhyZWcyKTsKKworCXByX2RlYnVnKCJGb3VuZCBhIDE2eiUwM2RcbiIsIG1kZXYtPmlkKTsKKworCW1kZXYtPmlycS5zdGFydCA9IEdERF9JUlEocmVnMSk7CisJbWRldi0+aXJxLmVuZCA9IEdERF9JUlEocmVnMSk7CisJbWRldi0+aXJxLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisKKwltZGV2LT5tZW0uc3RhcnQgPSBtYXBiYXNlICsgb2Zmc2V0OworCW1kZXYtPm1lbS5lbmQgPSBtZGV2LT5tZW0uc3RhcnQgKyBzaXplIC0gMTsKKwltZGV2LT5tZW0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKworCW1kZXYtPmlzX2FkZGVkID0gZmFsc2U7CisKKwlyZXQgPSBtY2JfZGV2aWNlX3JlZ2lzdGVyKGJ1cywgbWRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwltY2JfZnJlZV9kZXYobWRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY2hhbWVsZW9uX3BhcnNlX2NlbGxzKHN0cnVjdCBtY2JfYnVzICpidXMsIHBoeXNfYWRkcl90IG1hcGJhc2UsCisJCQl2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJY2hhciBfX2lvbWVtICpwID0gYmFzZTsKKwlzdHJ1Y3QgY2hhbWVsZW9uX2ZwZ2FfaGVhZGVyICpoZWFkZXI7CisJdWludDMyX3QgZHR5cGU7CisJaW50IG51bV9jZWxscyA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIGhzaXplOworCisJaHNpemUgPSBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9mcGdhX2hlYWRlcik7CisKKwloZWFkZXIgPSBremFsbG9jKGhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhlYWRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBFeHRyYWN0IGhlYWRlciBpbmZvcm1hdGlvbiAqLworCW1lbWNweV9mcm9taW8oaGVhZGVyLCBwLCBoc2l6ZSk7CisJLyogV2Ugb25seSBzdXBwb3J0IGNoYW1lbGVvbiB2MiBhdCB0aGUgbW9tZW50ICovCisJaGVhZGVyLT5tYWdpYyA9IGxlMTZfdG9fY3B1KGhlYWRlci0+bWFnaWMpOworCWlmIChoZWFkZXItPm1hZ2ljICE9IENIQU1FTEVPTlYyX01BR0lDKSB7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgY2hhbWVsZW9uIHZlcnNpb24gMHgleFxuIiwKKwkJCQloZWFkZXItPm1hZ2ljKTsKKwkJa2ZyZWUoaGVhZGVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXAgKz0gaHNpemU7CisKKwlwcl9kZWJ1ZygiaGVhZGVyLT5yZXZpc2lvbiA9ICVkXG4iLCBoZWFkZXItPnJldmlzaW9uKTsKKwlwcl9kZWJ1ZygiaGVhZGVyLT5tb2RlbCA9IDB4JXggKCclYycpXG4iLCBoZWFkZXItPm1vZGVsLAorCQloZWFkZXItPm1vZGVsKTsKKwlwcl9kZWJ1ZygiaGVhZGVyLT5taW5vciA9ICVkXG4iLCBoZWFkZXItPm1pbm9yKTsKKwlwcl9kZWJ1ZygiaGVhZGVyLT5idXNfdHlwZSA9IDB4JXhcbiIsIGhlYWRlci0+YnVzX3R5cGUpOworCisKKwlwcl9kZWJ1ZygiaGVhZGVyLT5tYWdpYyA9IDB4JXhcbiIsIGhlYWRlci0+bWFnaWMpOworCXByX2RlYnVnKCJoZWFkZXItPmZpbGVuYW1lID0gXCIlLipzXCJcbiIsIENIQU1FTEVPTl9GSUxFTkFNRV9MRU4sCisJCWhlYWRlci0+ZmlsZW5hbWUpOworCisJZm9yX2VhY2hfY2hhbWVsZW9uX2NlbGwoZHR5cGUsIHApIHsKKwkJc3dpdGNoIChkdHlwZSkgeworCQljYXNlIENIQU1FTEVPTl9EVFlQRV9HRU5FUkFMOgorCQkJcmV0ID0gY2hhbWVsZW9uX3BhcnNlX2dkZChidXMsIG1hcGJhc2UsIHApOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCQlwICs9IHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2dkZCk7CisJCQlicmVhazsKKwkJY2FzZSBDSEFNRUxFT05fRFRZUEVfQlJJREdFOgorCQkJY2hhbWVsZW9uX3BhcnNlX2JkZChidXMsIG1hcGJhc2UsIHApOworCQkJcCArPSBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9iZGQpOworCQkJYnJlYWs7CisJCWNhc2UgQ0hBTUVMRU9OX0RUWVBFX0VORDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJJbnZhbGlkIGNoYW1lbGVvbiBkZXNjcmlwdG9yIHR5cGUgMHgleFxuIiwKKwkJCQlkdHlwZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQludW1fY2VsbHMrKzsKKwl9CisKKwlpZiAobnVtX2NlbGxzID09IDApCisJCW51bV9jZWxscyA9IC1FSU5WQUw7CisKKwlrZnJlZShoZWFkZXIpOworCXJldHVybiBudW1fY2VsbHM7CisKK291dDoKKwlrZnJlZShoZWFkZXIpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjaGFtZWxlb25fcGFyc2VfY2VsbHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLXBjaS5jIGIvZHJpdmVycy9tY2IvbWNiLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Yzc0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9tY2ItcGNpLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBNRU4gQ2hhbWVsZW9uIEJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTUVOIE1pa3JvZWxla3Ryb25payBHbWJIICh3d3cubWVuLmRlKQorICogQXV0aG9yOiBKb2hhbm5lcyBUaHVtc2hpcm4gPGpvaGFubmVzLnRodW1zaGlybkBtZW4uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYi5oPgorCisjaW5jbHVkZSAibWNiLWludGVybmFsLmgiCisKK3N0cnVjdCBwcml2IHsKKwlzdHJ1Y3QgbWNiX2J1cyAqYnVzOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKK3N0YXRpYyBpbnQgbWNiX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBwcml2ICpwcml2OworCXBoeXNfYWRkcl90IG1hcGJhc2U7CisJaW50IHJldDsKKwlpbnQgbnVtX2NlbGxzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1hcGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaWYgKCFtYXBiYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIFBDSSByZXNvdXJjZVxuIik7CisJCWdvdG8gZXJyX3N0YXJ0OworCX0KKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCBLQlVJTERfTU9ETkFNRSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBQQ0kgQkFSc1xuIik7CisJCWdvdG8gZXJyX3N0YXJ0OworCX0KKworCXByaXYtPmJhc2UgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFwcml2LT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBpb3JlbWFwXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKTsKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCXJldCA9IC1FTk9UU1VQUDsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIklPIG1hcHBlZCBQQ0kgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcHJpdi0+YnVzID0gbWNiX2FsbG9jX2J1cygpOworCisJcmV0ID0gY2hhbWVsZW9uX3BhcnNlX2NlbGxzKHByaXYtPmJ1cywgbWFwYmFzZSwgcHJpdi0+YmFzZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2RydmRhdGE7CisJbnVtX2NlbGxzID0gcmV0OworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiRm91bmQgJWQgY2VsbHNcbiIsIG51bV9jZWxscyk7CisKKwltY2JfYnVzX2FkZF9kZXZpY2VzKHByaXYtPmJ1cyk7CisKK2Vycl9kcnZkYXRhOgorCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmJhc2UpOworZXJyX2lvcmVtYXA6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworZXJyX3N0YXJ0OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtY2JfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW1jYl9yZWxlYXNlX2J1cyhwcml2LT5idXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWNiX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NRU4sIFBDSV9ERVZJQ0VfSURfTUVOX0NIQU1FTEVPTikgfSwKKwl7IDAgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWNiX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbWNiX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAibWNiLXBjaSIsCisJLmlkX3RhYmxlID0gbWNiX3BjaV90YmwsCisJLnByb2JlID0gbWNiX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gbWNiX3BjaV9yZW1vdmUsCit9OworCittb2R1bGVfcGNpX2RyaXZlcihtY2JfcGNpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUNCIG92ZXIgUENJIHN1cHBvcnQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL0tjb25maWcgYi9kcml2ZXJzL21kL2JjYWNoZS9LY29uZmlnCmluZGV4IDI2Mzg0MTcuLjRkMjAwODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL0tjb25maWcKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvS2NvbmZpZwpAQCAtMjQsMTEgKzI0LDMgQEAKIAlLZWVwcyBhbGwgYWN0aXZlIGNsb3N1cmVzIGluIGEgbGlua2VkIGxpc3QgYW5kIHByb3ZpZGVzIGEgZGVidWdmcwogCWludGVyZmFjZSB0byBsaXN0IHRoZW0sIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNlZSBhc3luY2hyb25vdXMKIAlvcGVyYXRpb25zIHRoYXQgZ2V0IHN0dWNrLgotCi0jIGNncm91cCBjb2RlIG5lZWRzIHRvIGJlIHVwZGF0ZWQ6Ci0jCi0jY29uZmlnIENHUk9VUF9CQ0FDSEUKLSMJYm9vbCAiQ2dyb3VwIGNvbnRyb2xzIGZvciBiY2FjaGUiCi0jCWRlcGVuZHMgb24gQkNBQ0hFICYmIEJMS19DR1JPVVAKLSMJLS0taGVscC0tLQotIwlUT0RPCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYwppbmRleCBjMGQzN2QwLi40NDNkMDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKQEAgLTc4LDEyICs3OCw2IEBACiAJY2EtPnNldC0+bmVlZF9nYyA9IG1heChjYS0+c2V0LT5uZWVkX2djLCBidWNrZXRfZ2NfZ2VuKGIpKTsKIAlXQVJOX09OX09OQ0UoY2EtPnNldC0+bmVlZF9nYyA+IEJVQ0tFVF9HQ19HRU5fTUFYKTsKIAotCWlmIChDQUNIRV9TWU5DKCZjYS0+c2V0LT5zYikpIHsKLQkJY2EtPm5lZWRfc2F2ZV9wcmlvID0gbWF4KGNhLT5uZWVkX3NhdmVfcHJpbywKLQkJCQkJIGJ1Y2tldF9kaXNrX2dlbihiKSk7Ci0JCVdBUk5fT05fT05DRShjYS0+bmVlZF9zYXZlX3ByaW8gPiBCVUNLRVRfRElTS19HRU5fTUFYKTsKLQl9Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjAsNTEgKzExNCw0NSBAQAogCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwogfQogCi0vKiBBbGxvY2F0aW9uICovCisvKgorICogQmFja2dyb3VuZCBhbGxvY2F0aW9uIHRocmVhZDogc2NhbnMgZm9yIGJ1Y2tldHMgdG8gYmUgaW52YWxpZGF0ZWQsCisgKiBpbnZhbGlkYXRlcyB0aGVtLCByZXdyaXRlcyBwcmlvcy9nZW5zIChtYXJraW5nIHRoZW0gYXMgaW52YWxpZGF0ZWQgb24gZGlzayksCisgKiB0aGVuIG9wdGlvbmFsbHkgaXNzdWVzIGRpc2NhcmQgY29tbWFuZHMgdG8gdGhlIG5ld2x5IGZyZWUgYnVja2V0cywgdGhlbiBwdXRzCisgKiB0aGVtIG9uIHRoZSB2YXJpb3VzIGZyZWVsaXN0cy4KKyAqLwogCiBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2luY19idWNrZXRfZ2VuKHN0cnVjdCBidWNrZXQgKmIpCiB7Ci0JcmV0dXJuIGJ1Y2tldF9nY19nZW4oYikgPCBCVUNLRVRfR0NfR0VOX01BWCAmJgotCQlidWNrZXRfZGlza19nZW4oYikgPCBCVUNLRVRfRElTS19HRU5fTUFYOworCXJldHVybiBidWNrZXRfZ2NfZ2VuKGIpIDwgQlVDS0VUX0dDX0dFTl9NQVg7CiB9CiAKLWJvb2wgYmNoX2J1Y2tldF9hZGRfdW51c2VkKHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCitib29sIGJjaF9jYW5faW52YWxpZGF0ZV9idWNrZXQoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKIHsKLQlCVUdfT04oR0NfTUFSSyhiKSB8fCBHQ19TRUNUT1JTX1VTRUQoYikpOworCUJVR19PTighY2EtPnNldC0+Z2NfbWFya192YWxpZCk7CiAKLQlpZiAoQ0FDSEVfUkVQTEFDRU1FTlQoJmNhLT5zYikgPT0gQ0FDSEVfUkVQTEFDRU1FTlRfRklGTykgewotCQl1bnNpZ25lZCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBSRVNFUlZFX05PTkU7IGkrKykKLQkJCWlmICghZmlmb19mdWxsKCZjYS0+ZnJlZVtpXSkpCi0JCQkJZ290byBhZGQ7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLWFkZDoKLQliLT5wcmlvID0gMDsKLQotCWlmIChjYW5faW5jX2J1Y2tldF9nZW4oYikgJiYKLQkgICAgZmlmb19wdXNoKCZjYS0+dW51c2VkLCBiIC0gY2EtPmJ1Y2tldHMpKSB7Ci0JCWF0b21pY19pbmMoJmItPnBpbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgY2FuX2ludmFsaWRhdGVfYnVja2V0KHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCi17Ci0JcmV0dXJuIEdDX01BUksoYikgPT0gR0NfTUFSS19SRUNMQUlNQUJMRSAmJgorCXJldHVybiAoIUdDX01BUksoYikgfHwKKwkJR0NfTUFSSyhiKSA9PSBHQ19NQVJLX1JFQ0xBSU1BQkxFKSAmJgogCQkhYXRvbWljX3JlYWQoJmItPnBpbikgJiYKIAkJY2FuX2luY19idWNrZXRfZ2VuKGIpOwogfQogCi1zdGF0aWMgdm9pZCBpbnZhbGlkYXRlX29uZV9idWNrZXQoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKK3ZvaWQgX19iY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCiB7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2EtPnNldC0+YnVja2V0X2xvY2spOworCUJVR19PTihHQ19NQVJLKGIpICYmIEdDX01BUksoYikgIT0gR0NfTUFSS19SRUNMQUlNQUJMRSk7CisKKwlpZiAoR0NfU0VDVE9SU19VU0VEKGIpKQorCQl0cmFjZV9iY2FjaGVfaW52YWxpZGF0ZShjYSwgYiAtIGNhLT5idWNrZXRzKTsKKwogCWJjaF9pbmNfZ2VuKGNhLCBiKTsKIAliLT5wcmlvID0gSU5JVElBTF9QUklPOwogCWF0b21pY19pbmMoJmItPnBpbik7Cit9CisKK3N0YXRpYyB2b2lkIGJjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoc3RydWN0IGNhY2hlICpjYSwgc3RydWN0IGJ1Y2tldCAqYikKK3sKKwlfX2JjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOworCiAJZmlmb19wdXNoKCZjYS0+ZnJlZV9pbmMsIGIgLSBjYS0+YnVja2V0cyk7CiB9CiAKQEAgLTE5NSwyMCArMTgzLDcgQEAKIAljYS0+aGVhcC51c2VkID0gMDsKIAogCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkgewotCQkvKgotCQkgKiBJZiB3ZSBmaWxsIHVwIHRoZSB1bnVzZWQgbGlzdCwgaWYgd2UgdGhlbiByZXR1cm4gYmVmb3JlCi0JCSAqIGFkZGluZyBhbnl0aGluZyB0byB0aGUgZnJlZV9pbmMgbGlzdCB3ZSdsbCBza2lwIHdyaXRpbmcKLQkJICogcHJpb3MvZ2VucyBhbmQganVzdCBnbyBiYWNrIHRvIGFsbG9jYXRpbmcgZnJvbSB0aGUgdW51c2VkCi0JCSAqIGxpc3Q6Ci0JCSAqLwotCQlpZiAoZmlmb19mdWxsKCZjYS0+dW51c2VkKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIWNhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIUdDX1NFQ1RPUlNfVVNFRChiKSAmJgotCQkgICAgYmNoX2J1Y2tldF9hZGRfdW51c2VkKGNhLCBiKSkKKwkJaWYgKCFiY2hfY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghaGVhcF9mdWxsKCZjYS0+aGVhcCkpCkBAIC0yMzMsNyArMjA4LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCWludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CisJCWJjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOwogCX0KIH0KIApAQCAtMjQ5LDggKzIyNCw4IEBACiAKIAkJYiA9IGNhLT5idWNrZXRzICsgY2EtPmZpZm9fbGFzdF9idWNrZXQrKzsKIAotCQlpZiAoY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSkKLQkJCWludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CisJCWlmIChiY2hfY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSkKKwkJCWJjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOwogCiAJCWlmICgrK2NoZWNrZWQgPj0gY2EtPnNiLm5idWNrZXRzKSB7CiAJCQljYS0+aW52YWxpZGF0ZV9uZWVkc19nYyA9IDE7CkBAIC0yNzQsOCArMjQ5LDggQEAKIAogCQliID0gY2EtPmJ1Y2tldHMgKyBuOwogCi0JCWlmIChjYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpKQotCQkJaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKKwkJaWYgKGJjaF9jYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpKQorCQkJYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CiAKIAkJaWYgKCsrY2hlY2tlZCA+PSBjYS0+c2IubmJ1Y2tldHMgLyAyKSB7CiAJCQljYS0+aW52YWxpZGF0ZV9uZWVkc19nYyA9IDE7CkBAIC0yODcsOCArMjYyLDcgQEAKIAogc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9idWNrZXRzKHN0cnVjdCBjYWNoZSAqY2EpCiB7Ci0JaWYgKGNhLT5pbnZhbGlkYXRlX25lZWRzX2djKQotCQlyZXR1cm47CisJQlVHX09OKGNhLT5pbnZhbGlkYXRlX25lZWRzX2djKTsKIAogCXN3aXRjaCAoQ0FDSEVfUkVQTEFDRU1FTlQoJmNhLT5zYikpIHsKIAljYXNlIENBQ0hFX1JFUExBQ0VNRU5UX0xSVToKQEAgLTMwMSw4ICsyNzUsNiBAQAogCQlpbnZhbGlkYXRlX2J1Y2tldHNfcmFuZG9tKGNhKTsKIAkJYnJlYWs7CiAJfQotCi0JdHJhY2VfYmNhY2hlX2FsbG9jX2ludmFsaWRhdGUoY2EpOwogfQogCiAjZGVmaW5lIGFsbG9jYXRvcl93YWl0KGNhLCBjb25kKQkJCQkJXApAQCAtMzUwLDE3ICszMjIsMTAgQEAKIAkJICogcG9zc2libHkgaXNzdWUgZGlzY2FyZHMgdG8gdGhlbSwgdGhlbiB3ZSBhZGQgdGhlIGJ1Y2tldCB0bwogCQkgKiB0aGUgZnJlZSBsaXN0OgogCQkgKi8KLQkJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKCFmaWZvX2VtcHR5KCZjYS0+ZnJlZV9pbmMpKSB7CiAJCQlsb25nIGJ1Y2tldDsKIAotCQkJaWYgKCghYXRvbWljX3JlYWQoJmNhLT5zZXQtPnByaW9fYmxvY2tlZCkgfHwKLQkJCSAgICAgIUNBQ0hFX1NZTkMoJmNhLT5zZXQtPnNiKSkgJiYKLQkJCSAgICAhZmlmb19lbXB0eSgmY2EtPnVudXNlZCkpCi0JCQkJZmlmb19wb3AoJmNhLT51bnVzZWQsIGJ1Y2tldCk7Ci0JCQllbHNlIGlmICghZmlmb19lbXB0eSgmY2EtPmZyZWVfaW5jKSkKLQkJCQlmaWZvX3BvcCgmY2EtPmZyZWVfaW5jLCBidWNrZXQpOwotCQkJZWxzZQotCQkJCWJyZWFrOworCQkJZmlmb19wb3AoJmNhLT5mcmVlX2luYywgYnVja2V0KTsKIAogCQkJaWYgKGNhLT5kaXNjYXJkKSB7CiAJCQkJbXV0ZXhfdW5sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CkBAIC0zNzEsNiArMzM2LDcgQEAKIAkJCX0KIAogCQkJYWxsb2NhdG9yX3dhaXQoY2EsIGJjaF9hbGxvY2F0b3JfcHVzaChjYSwgYnVja2V0KSk7CisJCQl3YWtlX3VwKCZjYS0+c2V0LT5idHJlZV9jYWNoZV93YWl0KTsKIAkJCXdha2VfdXAoJmNhLT5zZXQtPmJ1Y2tldF93YWl0KTsKIAkJfQogCkBAIC0zODAsOSArMzQ2LDkgQEAKIAkJICogdGhlbSB0byB0aGUgZnJlZV9pbmMgbGlzdDoKIAkJICovCiAKK3JldHJ5X2ludmFsaWRhdGU6CiAJCWFsbG9jYXRvcl93YWl0KGNhLCBjYS0+c2V0LT5nY19tYXJrX3ZhbGlkICYmCi0JCQkgICAgICAgKGNhLT5uZWVkX3NhdmVfcHJpbyA+IDY0IHx8Ci0JCQkJIWNhLT5pbnZhbGlkYXRlX25lZWRzX2djKSk7CisJCQkgICAgICAgIWNhLT5pbnZhbGlkYXRlX25lZWRzX2djKTsKIAkJaW52YWxpZGF0ZV9idWNrZXRzKGNhKTsKIAogCQkvKgpAQCAtMzkwLDEzICszNTYsMjggQEAKIAkJICogbmV3IHN0dWZmIHRvIHRoZW06CiAJCSAqLwogCQlhbGxvY2F0b3Jfd2FpdChjYSwgIWF0b21pY19yZWFkKCZjYS0+c2V0LT5wcmlvX2Jsb2NrZWQpKTsKLQkJaWYgKENBQ0hFX1NZTkMoJmNhLT5zZXQtPnNiKSAmJgotCQkgICAgKCFmaWZvX2VtcHR5KCZjYS0+ZnJlZV9pbmMpIHx8Ci0JCSAgICAgY2EtPm5lZWRfc2F2ZV9wcmlvID4gNjQpKQorCQlpZiAoQ0FDSEVfU1lOQygmY2EtPnNldC0+c2IpKSB7CisJCQkvKgorCQkJICogVGhpcyBjb3VsZCBkZWFkbG9jayBpZiBhbiBhbGxvY2F0aW9uIHdpdGggYSBidHJlZQorCQkJICogbm9kZSBsb2NrZWQgZXZlciBibG9ja2VkIC0gaGF2aW5nIHRoZSBidHJlZSBub2RlCisJCQkgKiBsb2NrZWQgd291bGQgYmxvY2sgZ2FyYmFnZSBjb2xsZWN0aW9uLCBidXQgaGVyZSB3ZSdyZQorCQkJICogd2FpdGluZyBvbiBnYXJiYWdlIGNvbGxlY3Rpb24gYmVmb3JlIHdlIGludmFsaWRhdGUKKwkJCSAqIGFuZCBmcmVlIGFueXRoaW5nLgorCQkJICoKKwkJCSAqIEJ1dCB0aGlzIHNob3VsZCBiZSBzYWZlIHNpbmNlIHRoZSBidHJlZSBjb2RlIGFsd2F5cworCQkJICogdXNlcyBidHJlZV9jaGVja19yZXNlcnZlKCkgYmVmb3JlIGFsbG9jYXRpbmcgbm93LCBhbmQKKwkJCSAqIGlmIGl0IGZhaWxzIGl0IGJsb2NrcyB3aXRob3V0IGJ0cmVlIG5vZGVzIGxvY2tlZC4KKwkJCSAqLworCQkJaWYgKCFmaWZvX2Z1bGwoJmNhLT5mcmVlX2luYykpCisJCQkJZ290byByZXRyeV9pbnZhbGlkYXRlOworCiAJCQliY2hfcHJpb193cml0ZShjYSk7CisJCX0KIAl9CiB9CiAKKy8qIEFsbG9jYXRpb24gKi8KKwogbG9uZyBiY2hfYnVja2V0X2FsbG9jKHN0cnVjdCBjYWNoZSAqY2EsIHVuc2lnbmVkIHJlc2VydmUsIGJvb2wgd2FpdCkKIHsKIAlERUZJTkVfV0FJVCh3KTsKQEAgLTQwOCw4ICszODksMTAgQEAKIAkgICAgZmlmb19wb3AoJmNhLT5mcmVlW3Jlc2VydmVdLCByKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoIXdhaXQpCisJaWYgKCF3YWl0KSB7CisJCXRyYWNlX2JjYWNoZV9hbGxvY19mYWlsKGNhLCByZXNlcnZlKTsKIAkJcmV0dXJuIC0xOworCX0KIAogCWRvIHsKIAkJcHJlcGFyZV90b193YWl0KCZjYS0+c2V0LT5idWNrZXRfd2FpdCwgJncsCkBAIC00MjUsNiArNDA4LDggQEAKIG91dDoKIAl3YWtlX3VwX3Byb2Nlc3MoY2EtPmFsbG9jX3RocmVhZCk7CiAKKwl0cmFjZV9iY2FjaGVfYWxsb2MoY2EsIHJlc2VydmUpOworCiAJaWYgKGV4cGVuc2l2ZV9kZWJ1Z19jaGVja3MoY2EtPnNldCkpIHsKIAkJc2l6ZV90IGl0ZXI7CiAJCWxvbmcgaTsKQEAgLTQzOCw4ICs0MjMsNiBAQAogCQkJCUJVR19PTihpID09IHIpOwogCQlmaWZvX2Zvcl9lYWNoKGksICZjYS0+ZnJlZV9pbmMsIGl0ZXIpCiAJCQlCVUdfT04oaSA9PSByKTsKLQkJZmlmb19mb3JfZWFjaChpLCAmY2EtPnVudXNlZCwgaXRlcikKLQkJCUJVR19PTihpID09IHIpOwogCX0KIAogCWIgPSBjYS0+YnVja2V0cyArIHI7CkBAIC00NjEsMTcgKzQ0NCwxOSBAQAogCXJldHVybiByOwogfQogCit2b2lkIF9fYmNoX2J1Y2tldF9mcmVlKHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCit7CisJU0VUX0dDX01BUksoYiwgMCk7CisJU0VUX0dDX1NFQ1RPUlNfVVNFRChiLCAwKTsKK30KKwogdm9pZCBiY2hfYnVja2V0X2ZyZWUoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmspCiB7CiAJdW5zaWduZWQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKSB7Ci0JCXN0cnVjdCBidWNrZXQgKmIgPSBQVFJfQlVDS0VUKGMsIGssIGkpOwotCi0JCVNFVF9HQ19NQVJLKGIsIEdDX01BUktfUkVDTEFJTUFCTEUpOwotCQlTRVRfR0NfU0VDVE9SU19VU0VEKGIsIDApOwotCQliY2hfYnVja2V0X2FkZF91bnVzZWQoUFRSX0NBQ0hFKGMsIGssIGkpLCBiKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspCisJCV9fYmNoX2J1Y2tldF9mcmVlKFBUUl9DQUNIRShjLCBrLCBpKSwKKwkJCQkgIFBUUl9CVUNLRVQoYywgaywgaSkpOwogfQogCiBpbnQgX19iY2hfYnVja2V0X2FsbG9jX3NldChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCB1bnNpZ25lZCByZXNlcnZlLApAQCAtNzA5LDI1ICs2OTQsMyBAQAogCWNhLT5hbGxvY190aHJlYWQgPSBrOwogCXJldHVybiAwOwogfQotCi1pbnQgYmNoX2NhY2hlX2FsbG9jYXRvcl9pbml0KHN0cnVjdCBjYWNoZSAqY2EpCi17Ci0JLyoKLQkgKiBSZXNlcnZlOgotCSAqIFByaW8vZ2VuIHdyaXRlcyBmaXJzdAotCSAqIFRoZW4gOCBmb3IgYnRyZWUgYWxsb2NhdGlvbnMKLQkgKiBUaGVuIGhhbGYgZm9yIHRoZSBtb3ZpbmcgZ2FyYmFnZSBjb2xsZWN0b3IKLQkgKi8KLSNpZiAwCi0JY2EtPndhdGVybWFya1tXQVRFUk1BUktfUFJJT10gPSAwOwotCi0JY2EtPndhdGVybWFya1tXQVRFUk1BUktfTUVUQURBVEFdID0gcHJpb19idWNrZXRzKGNhKTsKLQotCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX01PVklOR0dDXSA9IDggKwotCQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19NRVRBREFUQV07Ci0KLQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19OT05FXSA9IGNhLT5mcmVlLnNpemUgLyAyICsKLQkJY2EtPndhdGVybWFya1tXQVRFUk1BUktfTU9WSU5HR0NdOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2JjYWNoZS5oCmluZGV4IGE0YzczMDYuLjgyYzljNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2JjYWNoZS5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2JjYWNoZS5oCkBAIC0xOTUsOSArMTk1LDcgQEAKIAlhdG9taWNfdAlwaW47CiAJdWludDE2X3QJcHJpbzsKIAl1aW50OF90CQlnZW47Ci0JdWludDhfdAkJZGlza19nZW47CiAJdWludDhfdAkJbGFzdF9nYzsgLyogTW9zdCBvdXQgb2YgZGF0ZSBnZW4gaW4gdGhlIGJ0cmVlICovCi0JdWludDhfdAkJZ2NfZ2VuOwogCXVpbnQxNl90CWdjX21hcms7IC8qIEJpdGZpZWxkIHVzZWQgYnkgR0MuIFNlZSBiZWxvdyBmb3IgZmllbGQgKi8KIH07CiAKQEAgLTIwNyw5ICsyMDUsOSBAQAogICovCiAKIEJJVE1BU0soR0NfTUFSSywJIHN0cnVjdCBidWNrZXQsIGdjX21hcmssIDAsIDIpOwotI2RlZmluZSBHQ19NQVJLX1JFQ0xBSU1BQkxFCTAKLSNkZWZpbmUgR0NfTUFSS19ESVJUWQkJMQotI2RlZmluZSBHQ19NQVJLX01FVEFEQVRBCTIKKyNkZWZpbmUgR0NfTUFSS19SRUNMQUlNQUJMRQkxCisjZGVmaW5lIEdDX01BUktfRElSVFkJCTIKKyNkZWZpbmUgR0NfTUFSS19NRVRBREFUQQkzCiAjZGVmaW5lIEdDX1NFQ1RPUlNfVVNFRF9TSVpFCTEzCiAjZGVmaW5lIE1BWF9HQ19TRUNUT1JTX1VTRUQJKH4ofjBVTEwgPDwgR0NfU0VDVE9SU19VU0VEX1NJWkUpKQogQklUTUFTSyhHQ19TRUNUT1JTX1VTRUQsIHN0cnVjdCBidWNrZXQsIGdjX21hcmssIDIsIEdDX1NFQ1RPUlNfVVNFRF9TSVpFKTsKQEAgLTQyNiwxNCArNDI0LDkgQEAKIAkgKiB0aGVpciBuZXcgZ2VuIHRvIGRpc2suIEFmdGVyIHByaW9fd3JpdGUoKSBmaW5pc2hlcyB3cml0aW5nIHRoZSBuZXcKIAkgKiBnZW5zL3ByaW9zLCB0aGV5J2xsIGJlIG1vdmVkIHRvIHRoZSBmcmVlIGxpc3QgKGFuZCBwb3NzaWJseSBkaXNjYXJkZWQKIAkgKiBpbiB0aGUgcHJvY2VzcykKLQkgKgotCSAqIHVudXNlZDogR0MgZm91bmQgbm90aGluZyBwb2ludGluZyBpbnRvIHRoZXNlIGJ1Y2tldHMgKHBvc3NpYmx5Ci0JICogYmVjYXVzZSBhbGwgdGhlIGRhdGEgdGhleSBjb250YWluZWQgd2FzIG92ZXJ3cml0dGVuKSwgc28gd2Ugb25seQotCSAqIG5lZWQgdG8gZGlzY2FyZCB0aGVtIGJlZm9yZSB0aGV5IGNhbiBiZSBtb3ZlZCB0byB0aGUgZnJlZSBsaXN0LgogCSAqLwogCURFQ0xBUkVfRklGTyhsb25nLCBmcmVlKVtSRVNFUlZFX05SXTsKIAlERUNMQVJFX0ZJRk8obG9uZywgZnJlZV9pbmMpOwotCURFQ0xBUkVfRklGTyhsb25nLCB1bnVzZWQpOwogCiAJc2l6ZV90CQkJZmlmb19sYXN0X2J1Y2tldDsKIApAQCAtNDQzLDEyICs0MzYsNiBAQAogCURFQ0xBUkVfSEVBUChzdHJ1Y3QgYnVja2V0ICosIGhlYXApOwogCiAJLyoKLQkgKiBtYXgoZ2VuIC0gZGlza19nZW4pIGZvciBhbGwgYnVja2V0cy4gV2hlbiBpdCBnZXRzIHRvbyBiaWcgd2UgaGF2ZSB0bwotCSAqIGNhbGwgcHJpb193cml0ZSgpIHRvIGtlZXAgZ2VucyBmcm9tIHdyYXBwaW5nLgotCSAqLwotCXVpbnQ4X3QJCQluZWVkX3NhdmVfcHJpbzsKLQotCS8qCiAJICogSWYgbm9uemVybywgd2Uga25vdyB3ZSBhcmVuJ3QgZ29pbmcgdG8gZmluZCBhbnkgYnVja2V0cyB0byBpbnZhbGlkYXRlCiAJICogdW50aWwgYSBnYyBmaW5pc2hlcyAtIG90aGVyd2lzZSB3ZSBjb3VsZCBwb2ludGxlc3NseSBidXJuIGEgdG9uIG9mCiAJICogY3B1CkBAIC01NjIsMTkgKzU0OSwxNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJYnRyZWVfY2FjaGVfZnJlZWQ7CiAKIAkvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnRyZWVfY2FjaGUgKyBidHJlZV9jYWNoZV9mcmVlYWJsZSBsaXN0cyAqLwotCXVuc2lnbmVkCQlidWNrZXRfY2FjaGVfdXNlZDsKKwl1bnNpZ25lZAkJYnRyZWVfY2FjaGVfdXNlZDsKIAogCS8qCiAJICogSWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgbmV3IGJ0cmVlIG5vZGUgYW5kIHRoYXQKIAkgKiBhbGxvY2F0aW9uIGZhaWxzLCB3ZSBjYW4gY2FubmliYWxpemUgYW5vdGhlciBub2RlIGluIHRoZSBidHJlZSBjYWNoZQotCSAqIHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24uIEhvd2V2ZXIsIG9ubHkgb25lIHRocmVhZCBjYW4gYmUgZG9pbmcgdGhpcwotCSAqIGF0IGEgdGltZSwgZm9yIG9idmlvdXMgcmVhc29ucyAtIHRyeV9oYXJkZXIgYW5kIHRyeV93YWl0IGFyZQotCSAqIGJhc2ljYWxseSBhIGxvY2sgZm9yIHRoaXMgdGhhdCB3ZSBjYW4gd2FpdCBvbiBhc3luY2hyb25vdXNseS4gVGhlCi0JICogYnRyZWVfcm9vdCgpIG1hY3JvIHJlbGVhc2VzIHRoZSBsb2NrIHdoZW4gaXQgcmV0dXJucy4KKwkgKiB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIC0gbG9jayB0byBndWFyYW50ZWUgb25seSBvbmUgdGhyZWFkIGRvZXMKKwkgKiB0aGlzIGF0IGEgdGltZToKIAkgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRyeV9oYXJkZXI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJdHJ5X3dhaXQ7Ci0JdWludDY0X3QJCXRyeV9oYXJkZXJfc3RhcnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJYnRyZWVfY2FjaGVfd2FpdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmJ0cmVlX2NhY2hlX2FsbG9jX2xvY2s7CiAKIAkvKgogCSAqIFdoZW4gd2UgZnJlZSBhIGJ0cmVlIG5vZGUsIHdlIGluY3JlbWVudCB0aGUgZ2VuIG9mIHRoZSBidWNrZXQgdGhlCkBAIC02MDMsNyArNTg3LDcgQEAKIAl1aW50MTZfdAkJbWluX3ByaW87CiAKIAkvKgotCSAqIG1heChnZW4gLSBnY19nZW4pIGZvciBhbGwgYnVja2V0cy4gV2hlbiBpdCBnZXRzIHRvbyBiaWcgd2UgaGF2ZSB0byBnYworCSAqIG1heChnZW4gLSBsYXN0X2djKSBmb3IgYWxsIGJ1Y2tldHMuIFdoZW4gaXQgZ2V0cyB0b28gYmlnIHdlIGhhdmUgdG8gZ2MKIAkgKiB0byBrZWVwIGdlbnMgZnJvbSB3cmFwcGluZyBhcm91bmQuCiAJICovCiAJdWludDhfdAkJCW5lZWRfZ2M7CkBAIC02MjgsNiArNjEyLDggQEAKIAkvKiBOdW1iZXIgb2YgbW92aW5nIEdDIGJpb3MgaW4gZmxpZ2h0ICovCiAJc3RydWN0IHNlbWFwaG9yZQltb3ZpbmdfaW5fZmxpZ2h0OwogCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKm1vdmluZ19nY193cTsKKwogCXN0cnVjdCBidHJlZQkJKnJvb3Q7CiAKICNpZmRlZiBDT05GSUdfQkNBQ0hFX0RFQlVHCkBAIC02NjcsNyArNjUzLDYgQEAKIAlzdHJ1Y3QgdGltZV9zdGF0cwlidHJlZV9nY190aW1lOwogCXN0cnVjdCB0aW1lX3N0YXRzCWJ0cmVlX3NwbGl0X3RpbWU7CiAJc3RydWN0IHRpbWVfc3RhdHMJYnRyZWVfcmVhZF90aW1lOwotCXN0cnVjdCB0aW1lX3N0YXRzCXRyeV9oYXJkZXJfdGltZTsKIAogCWF0b21pY19sb25nX3QJCWNhY2hlX3JlYWRfcmFjZXM7CiAJYXRvbWljX2xvbmdfdAkJd3JpdGViYWNrX2tleXNfZG9uZTsKQEAgLTg1MCw5ICs4MzUsNiBAQAogLyoKICAqIGJ1Y2tldF9nY19nZW4oKSByZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJ1Y2tldCdzIGN1cnJlbnQgZ2VuIGFuZAogICogdGhlIG9sZGVzdCBnZW4gb2YgYW55IHBvaW50ZXIgaW50byB0aGF0IGJ1Y2tldCBpbiB0aGUgYnRyZWUgKGxhc3RfZ2MpLgotICoKLSAqIGJ1Y2tldF9kaXNrX2dlbigpIHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBnZW4gYW5kIHRoZSBnZW4KLSAqIG9uIGRpc2s7IHRoZXkncmUgYm90aCB1c2VkIHRvIG1ha2Ugc3VyZSBnZW5zIGRvbid0IHdyYXAgYXJvdW5kLgogICovCiAKIHN0YXRpYyBpbmxpbmUgdWludDhfdCBidWNrZXRfZ2NfZ2VuKHN0cnVjdCBidWNrZXQgKmIpCkBAIC04NjAsMTMgKzg0Miw3IEBACiAJcmV0dXJuIGItPmdlbiAtIGItPmxhc3RfZ2M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdWludDhfdCBidWNrZXRfZGlza19nZW4oc3RydWN0IGJ1Y2tldCAqYikKLXsKLQlyZXR1cm4gYi0+Z2VuIC0gYi0+ZGlza19nZW47Ci19Ci0KICNkZWZpbmUgQlVDS0VUX0dDX0dFTl9NQVgJOTZVCi0jZGVmaW5lIEJVQ0tFVF9ESVNLX0dFTl9NQVgJNjRVCiAKICNkZWZpbmUga29ial9hdHRyaWJ1dGVfd3JpdGUobiwgZm4pCQkJCQlcCiAJc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBrc3lzZnNfIyNuID0gX19BVFRSKG4sIFNfSVdVU1IsIE5VTEwsIGZuKQpAQCAtODk5LDExICs4NzUsMTQgQEAKIAogdWludDhfdCBiY2hfaW5jX2dlbihzdHJ1Y3QgY2FjaGUgKiwgc3RydWN0IGJ1Y2tldCAqKTsKIHZvaWQgYmNoX3Jlc2NhbGVfcHJpb3JpdGllcyhzdHJ1Y3QgY2FjaGVfc2V0ICosIGludCk7Ci1ib29sIGJjaF9idWNrZXRfYWRkX3VudXNlZChzdHJ1Y3QgY2FjaGUgKiwgc3RydWN0IGJ1Y2tldCAqKTsKIAotbG9uZyBiY2hfYnVja2V0X2FsbG9jKHN0cnVjdCBjYWNoZSAqLCB1bnNpZ25lZCwgYm9vbCk7Citib29sIGJjaF9jYW5faW52YWxpZGF0ZV9idWNrZXQoc3RydWN0IGNhY2hlICosIHN0cnVjdCBidWNrZXQgKik7Cit2b2lkIF9fYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKiwgc3RydWN0IGJ1Y2tldCAqKTsKKwordm9pZCBfX2JjaF9idWNrZXRfZnJlZShzdHJ1Y3QgY2FjaGUgKiwgc3RydWN0IGJ1Y2tldCAqKTsKIHZvaWQgYmNoX2J1Y2tldF9mcmVlKHN0cnVjdCBjYWNoZV9zZXQgKiwgc3RydWN0IGJrZXkgKik7CiAKK2xvbmcgYmNoX2J1Y2tldF9hbGxvYyhzdHJ1Y3QgY2FjaGUgKiwgdW5zaWduZWQsIGJvb2wpOwogaW50IF9fYmNoX2J1Y2tldF9hbGxvY19zZXQoc3RydWN0IGNhY2hlX3NldCAqLCB1bnNpZ25lZCwKIAkJCSAgIHN0cnVjdCBia2V5ICosIGludCwgYm9vbCk7CiBpbnQgYmNoX2J1Y2tldF9hbGxvY19zZXQoc3RydWN0IGNhY2hlX3NldCAqLCB1bnNpZ25lZCwKQEAgLTk1NCwxMyArOTMzLDEwIEBACiB2b2lkIGJjaF9vcGVuX2J1Y2tldHNfZnJlZShzdHJ1Y3QgY2FjaGVfc2V0ICopOwogCiBpbnQgYmNoX2NhY2hlX2FsbG9jYXRvcl9zdGFydChzdHJ1Y3QgY2FjaGUgKmNhKTsKLWludCBiY2hfY2FjaGVfYWxsb2NhdG9yX2luaXQoc3RydWN0IGNhY2hlICpjYSk7CiAKIHZvaWQgYmNoX2RlYnVnX2V4aXQodm9pZCk7CiBpbnQgYmNoX2RlYnVnX2luaXQoc3RydWN0IGtvYmplY3QgKik7CiB2b2lkIGJjaF9yZXF1ZXN0X2V4aXQodm9pZCk7CiBpbnQgYmNoX3JlcXVlc3RfaW5pdCh2b2lkKTsKLXZvaWQgYmNoX2J0cmVlX2V4aXQodm9pZCk7Ci1pbnQgYmNoX2J0cmVlX2luaXQodm9pZCk7CiAKICNlbmRpZiAvKiBfQkNBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuYwppbmRleCAzZjc0YjRiLi41NDU0MTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5jCkBAIC0yMyw4ICsyMyw4IEBACiAJZm9yIChrID0gaS0+c3RhcnQ7IGsgPCBic2V0X2JrZXlfbGFzdChpKTsgayA9IG5leHQpIHsKIAkJbmV4dCA9IGJrZXlfbmV4dChrKTsKIAotCQlwcmludGsoS0VSTl9FUlIgImJsb2NrICV1IGtleSAlbGkvJXU6ICIsIHNldCwKLQkJICAgICAgICh1aW50NjRfdCAqKSBrIC0gaS0+ZCwgaS0+a2V5cyk7CisJCXByaW50ayhLRVJOX0VSUiAiYmxvY2sgJXUga2V5ICV1LyV1OiAiLCBzZXQsCisJCSAgICAgICAodW5zaWduZWQpICgodTY0ICopIGsgLSBpLT5kKSwgaS0+a2V5cyk7CiAKIAkJaWYgKGItPm9wcy0+a2V5X2R1bXApCiAJCQliLT5vcHMtPmtleV9kdW1wKGIsIGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5oIGIvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5oCmluZGV4IDAwMzI2MGYuLjVmNjcyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmgKQEAgLTQ3OCw2ICs0NzgsMTIgQEAKIAlsLT50b3BfcCA9IGwtPmtleXNfcCA9IGwtPmlubGluZV9rZXlzOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYmNoX2tleWxpc3RfaW5pdF9zaW5nbGUoc3RydWN0IGtleWxpc3QgKmwsIHN0cnVjdCBia2V5ICprKQoreworCWwtPmtleXMgPSBrOworCWwtPnRvcCA9IGJrZXlfbmV4dChrKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGJjaF9rZXlsaXN0X3B1c2goc3RydWN0IGtleWxpc3QgKmwpCiB7CiAJbC0+dG9wID0gYmtleV9uZXh0KGwtPnRvcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5jIGIvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuYwppbmRleCA1ZjljMmE2Li43MzQ3YjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMKQEAgLTY4LDE1ICs2OCwxMSBAQAogICogYWxsb2NfYnVja2V0KCkgY2Fubm90IGZhaWwuIFRoaXMgc2hvdWxkIGJlIHRydWUgYnV0IGlzIG5vdCBjb21wbGV0ZWx5CiAgKiBvYnZpb3VzLgogICoKLSAqIE1ha2Ugc3VyZSBhbGwgYWxsb2NhdGlvbnMgZ2V0IGNoYXJnZWQgdG8gdGhlIHJvb3QgY2dyb3VwCi0gKgogICogUGx1Z2dpbmc/CiAgKgogICogSWYgZGF0YSB3cml0ZSBpcyBsZXNzIHRoYW4gaGFyZCBzZWN0b3Igc2l6ZSBvZiBzc2QsIHJvdW5kIHVwIG9mZnNldCBpbiBvcGVuCiAgKiBidWNrZXQgdG8gdGhlIG5leHQgd2hvbGUgc2VjdG9yCiAgKgotICogQWxzbyBsb29rdXAgYnkgY2dyb3VwIGluIGdldF9vcGVuX2J1Y2tldCgpCi0gKgogICogU3VwZXJibG9jayBuZWVkcyB0byBiZSBmbGVzaGVkIG91dCBmb3IgbXVsdGlwbGUgY2FjaGUgZGV2aWNlcwogICoKICAqIEFkZCBhIHN5c2ZzIHR1bmFibGUgZm9yIHRoZSBudW1iZXIgb2Ygd3JpdGViYWNrIElPcyBpbiBmbGlnaHQKQEAgLTk3LDggKzkzLDYgQEAKICNkZWZpbmUgUFRSX0hBU0goYywgaykJCQkJCQkJXAogCSgoKGspLT5wdHJbMF0gPj4gYy0+YnVja2V0X2JpdHMpIHwgUFRSX0dFTihrLCAwKSkKIAotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpidHJlZV9pb193cTsKLQogI2RlZmluZSBpbnNlcnRfbG9jayhzLCBiKQkoKGIpLT5sZXZlbCA8PSAocyktPmxvY2spCiAKIC8qCkBAIC0xMjMsNyArMTE3LDcgQEAKICh7CQkJCQkJCQkJXAogCWludCBfciwgbCA9IChiKS0+bGV2ZWwgLSAxOwkJCQkJXAogCWJvb2wgX3cgPSBsIDw9IChvcCktPmxvY2s7CQkJCQlcCi0Jc3RydWN0IGJ0cmVlICpfY2hpbGQgPSBiY2hfYnRyZWVfbm9kZV9nZXQoKGIpLT5jLCBrZXksIGwsIF93KTsJXAorCXN0cnVjdCBidHJlZSAqX2NoaWxkID0gYmNoX2J0cmVlX25vZGVfZ2V0KChiKS0+Yywgb3AsIGtleSwgbCwgX3cpO1wKIAlpZiAoIUlTX0VSUihfY2hpbGQpKSB7CQkJCQkJXAogCQlfY2hpbGQtPnBhcmVudCA9IChiKTsJCQkJCVwKIAkJX3IgPSBiY2hfYnRyZWVfICMjIGZuKF9jaGlsZCwgb3AsICMjX19WQV9BUkdTX18pOwlcCkBAIC0xNTIsMTcgKzE0NiwxMiBAQAogCQkJX3IgPSBiY2hfYnRyZWVfICMjIGZuKF9iLCBvcCwgIyNfX1ZBX0FSR1NfXyk7CVwKIAkJfQkJCQkJCQlcCiAJCXJ3X3VubG9jayhfdywgX2IpOwkJCQkJXAorCQliY2hfY2FubmliYWxpemVfdW5sb2NrKGMpOwkJCQlcCiAJCWlmIChfciA9PSAtRUlOVFIpCQkJCQlcCiAJCQlzY2hlZHVsZSgpOwkJCQkJXAotCQliY2hfY2FubmliYWxpemVfdW5sb2NrKGMpOwkJCQlcCi0JCWlmIChfciA9PSAtRU5PU1BDKSB7CQkJCQlcCi0JCQl3YWl0X2V2ZW50KChjKS0+dHJ5X3dhaXQsCQkJXAotCQkJCSAgICEoYyktPnRyeV9oYXJkZXIpOwkJCVwKLQkJCV9yID0gLUVJTlRSOwkJCQkJXAotCQl9CQkJCQkJCVwKIAl9IHdoaWxlIChfciA9PSAtRUlOVFIpOwkJCQkJCVwKIAkJCQkJCQkJCVwKLQlmaW5pc2hfd2FpdCgmKGMpLT5idWNrZXRfd2FpdCwgJihvcCktPndhaXQpOwkJCVwKKwlmaW5pc2hfd2FpdCgmKGMpLT5idHJlZV9jYWNoZV93YWl0LCAmKG9wKS0+d2FpdCk7CQlcCiAJX3I7CQkJCQkJCQlcCiB9KQogCkBAIC0xNzEsNiArMTYwLDIwIEBACiAJcmV0dXJuICgodm9pZCAqKSBidHJlZV9ic2V0X2ZpcnN0KGIpKSArIGItPndyaXR0ZW4gKiBibG9ja19ieXRlcyhiLT5jKTsKIH0KIAorc3RhdGljIHZvaWQgYmNoX2J0cmVlX2luaXRfbmV4dChzdHJ1Y3QgYnRyZWUgKmIpCit7CisJLyogSWYgbm90IGEgbGVhZiBub2RlLCBhbHdheXMgc29ydCAqLworCWlmIChiLT5sZXZlbCAmJiBiLT5rZXlzLm5zZXRzKQorCQliY2hfYnRyZWVfc29ydCgmYi0+a2V5cywgJmItPmMtPnNvcnQpOworCWVsc2UKKwkJYmNoX2J0cmVlX3NvcnRfbGF6eSgmYi0+a2V5cywgJmItPmMtPnNvcnQpOworCisJaWYgKGItPndyaXR0ZW4gPCBidHJlZV9ibG9ja3MoYikpCisJCWJjaF9ic2V0X2luaXRfbmV4dCgmYi0+a2V5cywgd3JpdGVfYmxvY2soYiksCisJCQkJICAgYnNldF9tYWdpYygmYi0+Yy0+c2IpKTsKKworfQorCiAvKiBCdHJlZSBrZXkgbWFuaXB1bGF0aW9uICovCiAKIHZvaWQgYmtleV9wdXQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmspCkBAIC0zNTIsOCArMzU1LDcgQEAKIAlidHJlZV9jb21wbGV0ZV93cml0ZShiLCB3KTsKIAogCWlmIChidHJlZV9ub2RlX2RpcnR5KGIpKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoYnRyZWVfaW9fd3EsICZiLT53b3JrLAotCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMzAwMDApKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZiLT53b3JrLCAzMCAqIEhaKTsKIAogCWNsb3N1cmVfcmV0dXJuX3dpdGhfZGVzdHJ1Y3RvcihjbCwgYnRyZWVfbm9kZV93cml0ZV91bmxvY2spOwogfQpAQCAtNDQyLDEwICs0NDQsMTIgQEAKIAl9CiB9CiAKLXZvaWQgYmNoX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50KQordm9pZCBfX2JjaF9idHJlZV9ub2RlX3dyaXRlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCkKIHsKIAlzdHJ1Y3QgYnNldCAqaSA9IGJ0cmVlX2JzZXRfbGFzdChiKTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmItPndyaXRlX2xvY2spOworCiAJdHJhY2VfYmNhY2hlX2J0cmVlX3dyaXRlKGIpOwogCiAJQlVHX09OKGN1cnJlbnQtPmJpb19saXN0KTsKQEAgLTQ2OSwyMyArNDczLDI0IEBACiAJCQkmUFRSX0NBQ0hFKGItPmMsICZiLT5rZXksIDApLT5idHJlZV9zZWN0b3JzX3dyaXR0ZW4pOwogCiAJYi0+d3JpdHRlbiArPSBzZXRfYmxvY2tzKGksIGJsb2NrX2J5dGVzKGItPmMpKTsKK30KIAotCS8qIElmIG5vdCBhIGxlYWYgbm9kZSwgYWx3YXlzIHNvcnQgKi8KLQlpZiAoYi0+bGV2ZWwgJiYgYi0+a2V5cy5uc2V0cykKLQkJYmNoX2J0cmVlX3NvcnQoJmItPmtleXMsICZiLT5jLT5zb3J0KTsKLQllbHNlCi0JCWJjaF9idHJlZV9zb3J0X2xhenkoJmItPmtleXMsICZiLT5jLT5zb3J0KTsKK3ZvaWQgYmNoX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50KQoreworCXVuc2lnbmVkIG5zZXRzID0gYi0+a2V5cy5uc2V0czsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmItPmxvY2spOworCisJX19iY2hfYnRyZWVfbm9kZV93cml0ZShiLCBwYXJlbnQpOwogCiAJLyoKIAkgKiBkbyB2ZXJpZnkgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgc2V0IGluaXRpYWxseSAoaS5lLiB3ZSBkaWQgYQogCSAqIHNvcnQpIGFuZCB3ZSBzb3J0ZWQgZG93biB0byBhIHNpbmdsZSBzZXQ6CiAJICovCi0JaWYgKGkgIT0gYi0+a2V5cy5zZXQtPmRhdGEgJiYgIWItPmtleXMubnNldHMpCisJaWYgKG5zZXRzICYmICFiLT5rZXlzLm5zZXRzKQogCQliY2hfYnRyZWVfdmVyaWZ5KGIpOwogCi0JaWYgKGItPndyaXR0ZW4gPCBidHJlZV9ibG9ja3MoYikpCi0JCWJjaF9ic2V0X2luaXRfbmV4dCgmYi0+a2V5cywgd3JpdGVfYmxvY2soYiksCi0JCQkJICAgYnNldF9tYWdpYygmYi0+Yy0+c2IpKTsKKwliY2hfYnRyZWVfaW5pdF9uZXh0KGIpOwogfQogCiBzdGF0aWMgdm9pZCBiY2hfYnRyZWVfbm9kZV93cml0ZV9zeW5jKHN0cnVjdCBidHJlZSAqYikKQEAgLTQ5Myw3ICs0OTgsMTEgQEAKIAlzdHJ1Y3QgY2xvc3VyZSBjbDsKIAogCWNsb3N1cmVfaW5pdF9zdGFjaygmY2wpOworCisJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CiAJYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgJmNsKTsKKwltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOworCiAJY2xvc3VyZV9zeW5jKCZjbCk7CiB9CiAKQEAgLTUwMSwxMSArNTEwLDEwIEBACiB7CiAJc3RydWN0IGJ0cmVlICpiID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3KSwgc3RydWN0IGJ0cmVlLCB3b3JrKTsKIAotCXJ3X2xvY2sodHJ1ZSwgYiwgYi0+bGV2ZWwpOwotCisJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CiAJaWYgKGJ0cmVlX25vZGVfZGlydHkoYikpCi0JCWJjaF9idHJlZV9ub2RlX3dyaXRlKGIsIE5VTEwpOwotCXJ3X3VubG9jayh0cnVlLCBiKTsKKwkJX19iY2hfYnRyZWVfbm9kZV93cml0ZShiLCBOVUxMKTsKKwltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBiY2hfYnRyZWVfbGVhZl9kaXJ0eShzdHJ1Y3QgYnRyZWUgKmIsIGF0b21pY190ICpqb3VybmFsX3JlZikKQEAgLTUxMywxMSArNTIxLDEzIEBACiAJc3RydWN0IGJzZXQgKmkgPSBidHJlZV9ic2V0X2xhc3QoYik7CiAJc3RydWN0IGJ0cmVlX3dyaXRlICp3ID0gYnRyZWVfY3VycmVudF93cml0ZShiKTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmItPndyaXRlX2xvY2spOworCiAJQlVHX09OKCFiLT53cml0dGVuKTsKIAlCVUdfT04oIWktPmtleXMpOwogCiAJaWYgKCFidHJlZV9ub2RlX2RpcnR5KGIpKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoYnRyZWVfaW9fd3EsICZiLT53b3JrLCAzMCAqIEhaKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZiLT53b3JrLCAzMCAqIEhaKTsKIAogCXNldF9idHJlZV9ub2RlX2RpcnR5KGIpOwogCkBAIC01NDgsNyArNTU4LDcgQEAKICNkZWZpbmUgbWNhX3Jlc2VydmUoYykJKCgoYy0+cm9vdCAmJiBjLT5yb290LT5sZXZlbCkJCVwKIAkJCSAgPyBjLT5yb290LT5sZXZlbCA6IDEpICogOCArIDE2KQogI2RlZmluZSBtY2FfY2FuX2ZyZWUoYykJCQkJCQlcCi0JbWF4X3QoaW50LCAwLCBjLT5idWNrZXRfY2FjaGVfdXNlZCAtIG1jYV9yZXNlcnZlKGMpKQorCW1heF90KGludCwgMCwgYy0+YnRyZWVfY2FjaGVfdXNlZCAtIG1jYV9yZXNlcnZlKGMpKQogCiBzdGF0aWMgdm9pZCBtY2FfZGF0YV9mcmVlKHN0cnVjdCBidHJlZSAqYikKIHsKQEAgLTU1Niw3ICs1NjYsNyBAQAogCiAJYmNoX2J0cmVlX2tleXNfZnJlZSgmYi0+a2V5cyk7CiAKLQliLT5jLT5idWNrZXRfY2FjaGVfdXNlZC0tOworCWItPmMtPmJ0cmVlX2NhY2hlX3VzZWQtLTsKIAlsaXN0X21vdmUoJmItPmxpc3QsICZiLT5jLT5idHJlZV9jYWNoZV9mcmVlZCk7CiB9CiAKQEAgLTU4MSw3ICs1OTEsNyBAQAogCQkJCQlpbG9nMihiLT5jLT5idHJlZV9wYWdlcyksCiAJCQkJCWJ0cmVlX29yZGVyKGspKSwKIAkJCQkgIGdmcCkpIHsKLQkJYi0+Yy0+YnVja2V0X2NhY2hlX3VzZWQrKzsKKwkJYi0+Yy0+YnRyZWVfY2FjaGVfdXNlZCsrOwogCQlsaXN0X21vdmUoJmItPmxpc3QsICZiLT5jLT5idHJlZV9jYWNoZSk7CiAJfSBlbHNlIHsKIAkJbGlzdF9tb3ZlKCZiLT5saXN0LCAmYi0+Yy0+YnRyZWVfY2FjaGVfZnJlZWQpOwpAQCAtNTk3LDYgKzYwNyw4IEBACiAKIAlpbml0X3J3c2VtKCZiLT5sb2NrKTsKIAlsb2NrZGVwX3NldF9ub3ZhbGlkYXRlX2NsYXNzKCZiLT5sb2NrKTsKKwltdXRleF9pbml0KCZiLT53cml0ZV9sb2NrKTsKKwlsb2NrZGVwX3NldF9ub3ZhbGlkYXRlX2NsYXNzKCZiLT53cml0ZV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYi0+bGlzdCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmItPndvcmssIGJ0cmVlX25vZGVfd3JpdGVfd29yayk7CiAJYi0+YyA9IGM7CkBAIC02MzAsOCArNjQyLDEyIEBACiAJCXVwKCZiLT5pb19tdXRleCk7CiAJfQogCisJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CiAJaWYgKGJ0cmVlX25vZGVfZGlydHkoYikpCi0JCWJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMoYik7CisJCV9fYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgJmNsKTsKKwltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOworCisJY2xvc3VyZV9zeW5jKCZjbCk7CiAKIAkvKiB3YWl0IGZvciBhbnkgaW4gZmxpZ2h0IGJ0cmVlIHdyaXRlICovCiAJZG93bigmYi0+aW9fbXV0ZXgpOwpAQCAtNjU0LDcgKzY3MCw3IEBACiAJaWYgKGMtPnNocmlua2VyX2Rpc2FibGVkKQogCQlyZXR1cm4gU0hSSU5LX1NUT1A7CiAKLQlpZiAoYy0+dHJ5X2hhcmRlcikKKwlpZiAoYy0+YnRyZWVfY2FjaGVfYWxsb2NfbG9jaykKIAkJcmV0dXJuIFNIUklOS19TVE9QOwogCiAJLyogUmV0dXJuIC0xIGlmIHdlIGNhbid0IGRvIGFueXRoaW5nIHJpZ2h0IG5vdyAqLwpAQCAtNjg2LDcgKzcwMiw3IEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyAobnItLSkgJiYgaSA8IGMtPmJ1Y2tldF9jYWNoZV91c2VkOyBpKyspIHsKKwlmb3IgKGkgPSAwOyAobnItLSkgJiYgaSA8IGMtPmJ0cmVlX2NhY2hlX3VzZWQ7IGkrKykgewogCQlpZiAobGlzdF9lbXB0eSgmYy0+YnRyZWVfY2FjaGUpKQogCQkJZ290byBvdXQ7CiAKQEAgLTcxNSw3ICs3MzEsNyBAQAogCWlmIChjLT5zaHJpbmtlcl9kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYy0+dHJ5X2hhcmRlcikKKwlpZiAoYy0+YnRyZWVfY2FjaGVfYWxsb2NfbG9jaykKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gbWNhX2Nhbl9mcmVlKGMpICogYy0+YnRyZWVfcGFnZXM7CkBAIC04MTksMTcgKzgzNSwzMCBAQAogCXJldHVybiBiOwogfQogCi1zdGF0aWMgc3RydWN0IGJ0cmVlICptY2FfY2FubmliYWxpemUoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmspCitzdGF0aWMgaW50IG1jYV9jYW5uaWJhbGl6ZV9sb2NrKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBidHJlZV9vcCAqb3ApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpvbGQ7CisKKwlvbGQgPSBjbXB4Y2hnKCZjLT5idHJlZV9jYWNoZV9hbGxvY19sb2NrLCBOVUxMLCBjdXJyZW50KTsKKwlpZiAob2xkICYmIG9sZCAhPSBjdXJyZW50KSB7CisJCWlmIChvcCkKKwkJCXByZXBhcmVfdG9fd2FpdCgmYy0+YnRyZWVfY2FjaGVfd2FpdCwgJm9wLT53YWl0LAorCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnRyZWUgKm1jYV9jYW5uaWJhbGl6ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAorCQkJCSAgICAgc3RydWN0IGJrZXkgKmspCiB7CiAJc3RydWN0IGJ0cmVlICpiOwogCiAJdHJhY2VfYmNhY2hlX2J0cmVlX2NhY2hlX2Nhbm5pYmFsaXplKGMpOwogCi0JaWYgKCFjLT50cnlfaGFyZGVyKSB7Ci0JCWMtPnRyeV9oYXJkZXIgPSBjdXJyZW50OwotCQljLT50cnlfaGFyZGVyX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKLQl9IGVsc2UgaWYgKGMtPnRyeV9oYXJkZXIgIT0gY3VycmVudCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJaWYgKG1jYV9jYW5uaWJhbGl6ZV9sb2NrKGMsIG9wKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShiLCAmYy0+YnRyZWVfY2FjaGUsIGxpc3QpCiAJCWlmICghbWNhX3JlYXAoYiwgYnRyZWVfb3JkZXIoayksIGZhbHNlKSkKQEAgLTgzOSw2ICs4NjgsNyBAQAogCQlpZiAoIW1jYV9yZWFwKGIsIGJ0cmVlX29yZGVyKGspLCB0cnVlKSkKIAkJCXJldHVybiBiOwogCisJV0FSTigxLCAiYnRyZWUgY2FjaGUgY2FubmliYWxpemUgZmFpbGVkXG4iKTsKIAlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIH0KIApAQCAtODUwLDE0ICs4ODAsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgYmNoX2Nhbm5pYmFsaXplX3VubG9jayhzdHJ1Y3QgY2FjaGVfc2V0ICpjKQogewotCWlmIChjLT50cnlfaGFyZGVyID09IGN1cnJlbnQpIHsKLQkJYmNoX3RpbWVfc3RhdHNfdXBkYXRlKCZjLT50cnlfaGFyZGVyX3RpbWUsIGMtPnRyeV9oYXJkZXJfc3RhcnQpOwotCQljLT50cnlfaGFyZGVyID0gTlVMTDsKLQkJd2FrZV91cCgmYy0+dHJ5X3dhaXQpOworCWlmIChjLT5idHJlZV9jYWNoZV9hbGxvY19sb2NrID09IGN1cnJlbnQpIHsKKwkJYy0+YnRyZWVfY2FjaGVfYWxsb2NfbG9jayA9IE5VTEw7CisJCXdha2VfdXAoJmMtPmJ0cmVlX2NhY2hlX3dhaXQpOwogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBidHJlZSAqbWNhX2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBia2V5ICprLCBpbnQgbGV2ZWwpCitzdGF0aWMgc3RydWN0IGJ0cmVlICptY2FfYWxsb2Moc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJ0cmVlX29wICpvcCwKKwkJCSAgICAgICBzdHJ1Y3QgYmtleSAqaywgaW50IGxldmVsKQogewogCXN0cnVjdCBidHJlZSAqYjsKIApAQCAtOTIwLDcgKzk1MCw3IEBACiAJaWYgKGIpCiAJCXJ3X3VubG9jayh0cnVlLCBiKTsKIAotCWIgPSBtY2FfY2FubmliYWxpemUoYywgayk7CisJYiA9IG1jYV9jYW5uaWJhbGl6ZShjLCBvcCwgayk7CiAJaWYgKCFJU19FUlIoYikpCiAJCWdvdG8gb3V0OwogCkBAIC05MzYsOCArOTY2LDggQEAKICAqIFRoZSBidHJlZSBub2RlIHdpbGwgaGF2ZSBlaXRoZXIgYSByZWFkIG9yIGEgd3JpdGUgbG9jayBoZWxkLCBkZXBlbmRpbmcgb24KICAqIGxldmVsIGFuZCBvcC0+bG9jay4KICAqLwotc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9nZXQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmssCi0JCQkJIGludCBsZXZlbCwgYm9vbCB3cml0ZSkKK3N0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfZ2V0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBidHJlZV9vcCAqb3AsCisJCQkJIHN0cnVjdCBia2V5ICprLCBpbnQgbGV2ZWwsIGJvb2wgd3JpdGUpCiB7CiAJaW50IGkgPSAwOwogCXN0cnVjdCBidHJlZSAqYjsKQEAgLTk1MSw3ICs5ODEsNyBAQAogCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAKIAkJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwotCQliID0gbWNhX2FsbG9jKGMsIGssIGxldmVsKTsKKwkJYiA9IG1jYV9hbGxvYyhjLCBvcCwgaywgbGV2ZWwpOwogCQltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIAogCQlpZiAoIWIpCkBAIC05OTcsNyArMTAyNyw3IEBACiAJc3RydWN0IGJ0cmVlICpiOwogCiAJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwotCWIgPSBtY2FfYWxsb2MoYywgaywgbGV2ZWwpOworCWIgPSBtY2FfYWxsb2MoYywgTlVMTCwgaywgbGV2ZWwpOwogCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwogCiAJaWYgKCFJU19FUlJfT1JfTlVMTChiKSkgewpAQCAtMTAxMCw0NiArMTA0MCw0MSBAQAogCiBzdGF0aWMgdm9pZCBidHJlZV9ub2RlX2ZyZWUoc3RydWN0IGJ0cmVlICpiKQogewotCXVuc2lnbmVkIGk7Ci0KIAl0cmFjZV9iY2FjaGVfYnRyZWVfbm9kZV9mcmVlKGIpOwogCiAJQlVHX09OKGIgPT0gYi0+Yy0+cm9vdCk7CiAKKwltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKKwogCWlmIChidHJlZV9ub2RlX2RpcnR5KGIpKQogCQlidHJlZV9jb21wbGV0ZV93cml0ZShiLCBidHJlZV9jdXJyZW50X3dyaXRlKGIpKTsKIAljbGVhcl9iaXQoQlRSRUVfTk9ERV9kaXJ0eSwgJmItPmZsYWdzKTsKIAorCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CisKIAljYW5jZWxfZGVsYXllZF93b3JrKCZiLT53b3JrKTsKIAogCW11dGV4X2xvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUygmYi0+a2V5KTsgaSsrKSB7Ci0JCUJVR19PTihhdG9taWNfcmVhZCgmUFRSX0JVQ0tFVChiLT5jLCAmYi0+a2V5LCBpKS0+cGluKSk7Ci0KLQkJYmNoX2luY19nZW4oUFRSX0NBQ0hFKGItPmMsICZiLT5rZXksIGkpLAotCQkJICAgIFBUUl9CVUNLRVQoYi0+YywgJmItPmtleSwgaSkpOwotCX0KLQogCWJjaF9idWNrZXRfZnJlZShiLT5jLCAmYi0+a2V5KTsKIAltY2FfYnVja2V0X2ZyZWUoYik7CiAJbXV0ZXhfdW5sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7CiB9CiAKLXN0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfYWxsb2Moc3RydWN0IGNhY2hlX3NldCAqYywgaW50IGxldmVsLCBib29sIHdhaXQpCitzdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBidHJlZV9vcCAqb3AsCisJCQkJICAgaW50IGxldmVsKQogewogCUJLRVlfUEFEREVEKGtleSkgazsKIAlzdHJ1Y3QgYnRyZWUgKmIgPSBFUlJfUFRSKC1FQUdBSU4pOwogCiAJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwogcmV0cnk6Ci0JaWYgKF9fYmNoX2J1Y2tldF9hbGxvY19zZXQoYywgUkVTRVJWRV9CVFJFRSwgJmsua2V5LCAxLCB3YWl0KSkKKwlpZiAoX19iY2hfYnVja2V0X2FsbG9jX3NldChjLCBSRVNFUlZFX0JUUkVFLCAmay5rZXksIDEsIG9wICE9IE5VTEwpKQogCQlnb3RvIGVycjsKIAogCWJrZXlfcHV0KGMsICZrLmtleSk7CiAJU0VUX0tFWV9TSVpFKCZrLmtleSwgYy0+YnRyZWVfcGFnZXMgKiBQQUdFX1NFQ1RPUlMpOwogCi0JYiA9IG1jYV9hbGxvYyhjLCAmay5rZXksIGxldmVsKTsKKwliID0gbWNhX2FsbG9jKGMsIG9wLCAmay5rZXksIGxldmVsKTsKIAlpZiAoSVNfRVJSKGIpKQogCQlnb3RvIGVycl9mcmVlOwogCkBAIC0xMDc1LDEyICsxMTAwLDE1IEBACiAJcmV0dXJuIGI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZWUgKmJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQoc3RydWN0IGJ0cmVlICpiLCBib29sIHdhaXQpCitzdGF0aWMgc3RydWN0IGJ0cmVlICpidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KHN0cnVjdCBidHJlZSAqYiwKKwkJCQkJCSAgc3RydWN0IGJ0cmVlX29wICpvcCkKIHsKLQlzdHJ1Y3QgYnRyZWUgKm4gPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBiLT5sZXZlbCwgd2FpdCk7CisJc3RydWN0IGJ0cmVlICpuID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYi0+Yywgb3AsIGItPmxldmVsKTsKIAlpZiAoIUlTX0VSUl9PUl9OVUxMKG4pKSB7CisJCW11dGV4X2xvY2soJm4tPndyaXRlX2xvY2spOwogCQliY2hfYnRyZWVfc29ydF9pbnRvKCZiLT5rZXlzLCAmbi0+a2V5cywgJmItPmMtPnNvcnQpOwogCQlia2V5X2NvcHlfa2V5KCZuLT5rZXksICZiLT5rZXkpOworCQltdXRleF91bmxvY2soJm4tPndyaXRlX2xvY2spOwogCX0KIAogCXJldHVybiBuOwpAQCAtMTA5MCw0MyArMTExOCw0NyBAQAogewogCXVuc2lnbmVkIGk7CiAKKwltdXRleF9sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7CisKKwlhdG9taWNfaW5jKCZiLT5jLT5wcmlvX2Jsb2NrZWQpOworCiAJYmtleV9jb3B5KGssICZiLT5rZXkpOwogCWJrZXlfY29weV9rZXkoaywgJlpFUk9fS0VZKTsKIAotCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKSB7Ci0JCXVpbnQ4X3QgZyA9IFBUUl9CVUNLRVQoYi0+YywgaywgaSktPmdlbiArIDE7CisJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspCisJCVNFVF9QVFJfR0VOKGssIGksCisJCQkgICAgYmNoX2luY19nZW4oUFRSX0NBQ0hFKGItPmMsICZiLT5rZXksIGkpLAorCQkJCQlQVFJfQlVDS0VUKGItPmMsICZiLT5rZXksIGkpKSk7CiAKLQkJU0VUX1BUUl9HRU4oaywgaSwgZyk7Ci0JfQotCi0JYXRvbWljX2luYygmYi0+Yy0+cHJpb19ibG9ja2VkKTsKKwltdXRleF91bmxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKIH0KIAogc3RhdGljIGludCBidHJlZV9jaGVja19yZXNlcnZlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX29wICpvcCkKIHsKIAlzdHJ1Y3QgY2FjaGVfc2V0ICpjID0gYi0+YzsKIAlzdHJ1Y3QgY2FjaGUgKmNhOwotCXVuc2lnbmVkIGksIHJlc2VydmUgPSBjLT5yb290LT5sZXZlbCAqIDIgKyAxOwotCWludCByZXQgPSAwOworCXVuc2lnbmVkIGksIHJlc2VydmUgPSAoYy0+cm9vdC0+bGV2ZWwgLSBiLT5sZXZlbCkgKiAyICsgMTsKIAogCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIAogCWZvcl9lYWNoX2NhY2hlKGNhLCBjLCBpKQogCQlpZiAoZmlmb191c2VkKCZjYS0+ZnJlZVtSRVNFUlZFX0JUUkVFXSkgPCByZXNlcnZlKSB7CiAJCQlpZiAob3ApCi0JCQkJcHJlcGFyZV90b193YWl0KCZjLT5idWNrZXRfd2FpdCwgJm9wLT53YWl0LAorCQkJCXByZXBhcmVfdG9fd2FpdCgmYy0+YnRyZWVfY2FjaGVfd2FpdCwgJm9wLT53YWl0LAogCQkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJcmV0ID0gLUVJTlRSOwotCQkJYnJlYWs7CisJCQltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKwkJCXJldHVybiAtRUlOVFI7CiAJCX0KIAogCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbWNhX2Nhbm5pYmFsaXplX2xvY2soYi0+Yywgb3ApOwogfQogCiAvKiBHYXJiYWdlIGNvbGxlY3Rpb24gKi8KIAotdWludDhfdCBfX2JjaF9idHJlZV9tYXJrX2tleShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBpbnQgbGV2ZWwsIHN0cnVjdCBia2V5ICprKQorc3RhdGljIHVpbnQ4X3QgX19iY2hfYnRyZWVfbWFya19rZXkoc3RydWN0IGNhY2hlX3NldCAqYywgaW50IGxldmVsLAorCQkJCSAgICBzdHJ1Y3QgYmtleSAqaykKIHsKIAl1aW50OF90IHN0YWxlID0gMDsKIAl1bnNpZ25lZCBpOwpAQCAtMTE0Niw4ICsxMTc4LDggQEAKIAogCQlnID0gUFRSX0JVQ0tFVChjLCBrLCBpKTsKIAotCQlpZiAoZ2VuX2FmdGVyKGctPmdjX2dlbiwgUFRSX0dFTihrLCBpKSkpCi0JCQlnLT5nY19nZW4gPSBQVFJfR0VOKGssIGkpOworCQlpZiAoZ2VuX2FmdGVyKGctPmxhc3RfZ2MsIFBUUl9HRU4oaywgaSkpKQorCQkJZy0+bGFzdF9nYyA9IFBUUl9HRU4oaywgaSk7CiAKIAkJaWYgKHB0cl9zdGFsZShjLCBrLCBpKSkgewogCQkJc3RhbGUgPSBtYXgoc3RhbGUsIHB0cl9zdGFsZShjLCBrLCBpKSk7CkBAIC0xMTYzLDYgKzExOTUsOCBAQAogCQkJU0VUX0dDX01BUksoZywgR0NfTUFSS19NRVRBREFUQSk7CiAJCWVsc2UgaWYgKEtFWV9ESVJUWShrKSkKIAkJCVNFVF9HQ19NQVJLKGcsIEdDX01BUktfRElSVFkpOworCQllbHNlIGlmICghR0NfTUFSSyhnKSkKKwkJCVNFVF9HQ19NQVJLKGcsIEdDX01BUktfUkVDTEFJTUFCTEUpOwogCiAJCS8qIGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3cgKi8KIAkJU0VUX0dDX1NFQ1RPUlNfVVNFRChnLCBtaW5fdCh1bnNpZ25lZCwKQEAgLTExNzcsNiArMTIxMSwyNiBAQAogCiAjZGVmaW5lIGJ0cmVlX21hcmtfa2V5KGIsIGspCV9fYmNoX2J0cmVlX21hcmtfa2V5KGItPmMsIGItPmxldmVsLCBrKQogCit2b2lkIGJjaF9pbml0aWFsX21hcmtfa2V5KHN0cnVjdCBjYWNoZV9zZXQgKmMsIGludCBsZXZlbCwgc3RydWN0IGJrZXkgKmspCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlpZiAocHRyX2F2YWlsYWJsZShjLCBrLCBpKSAmJgorCQkgICAgIXB0cl9zdGFsZShjLCBrLCBpKSkgeworCQkJc3RydWN0IGJ1Y2tldCAqYiA9IFBUUl9CVUNLRVQoYywgaywgaSk7CisKKwkJCWItPmdlbiA9IFBUUl9HRU4oaywgaSk7CisKKwkJCWlmIChsZXZlbCAmJiBia2V5X2NtcChrLCAmWkVST19LRVkpKQorCQkJCWItPnByaW8gPSBCVFJFRV9QUklPOworCQkJZWxzZSBpZiAoIWxldmVsICYmIGItPnByaW8gPT0gQlRSRUVfUFJJTykKKwkJCQliLT5wcmlvID0gSU5JVElBTF9QUklPOworCQl9CisKKwlfX2JjaF9idHJlZV9tYXJrX2tleShjLCBsZXZlbCwgayk7Cit9CisKIHN0YXRpYyBib29sIGJ0cmVlX2djX21hcmtfbm9kZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBnY19zdGF0ICpnYykKIHsKIAl1aW50OF90IHN0YWxlID0gMDsKQEAgLTEyMzAsMTQgKzEyODQsMTkgQEAKIAkJCQkgc3RydWN0IGtleWxpc3QgKiwgYXRvbWljX3QgKiwgc3RydWN0IGJrZXkgKik7CiAKIHN0YXRpYyBpbnQgYnRyZWVfZ2NfY29hbGVzY2Uoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAotCQkJICAgICBzdHJ1Y3Qga2V5bGlzdCAqa2V5bGlzdCwgc3RydWN0IGdjX3N0YXQgKmdjLAotCQkJICAgICBzdHJ1Y3QgZ2NfbWVyZ2VfaW5mbyAqcikKKwkJCSAgICAgc3RydWN0IGdjX3N0YXQgKmdjLCBzdHJ1Y3QgZ2NfbWVyZ2VfaW5mbyAqcikKIHsKIAl1bnNpZ25lZCBpLCBub2RlcyA9IDAsIGtleXMgPSAwLCBibG9ja3M7CiAJc3RydWN0IGJ0cmVlICpuZXdfbm9kZXNbR0NfTUVSR0VfTk9ERVNdOworCXN0cnVjdCBrZXlsaXN0IGtleWxpc3Q7CiAJc3RydWN0IGNsb3N1cmUgY2w7CiAJc3RydWN0IGJrZXkgKms7CiAKKwliY2hfa2V5bGlzdF9pbml0KCZrZXlsaXN0KTsKKworCWlmIChidHJlZV9jaGVja19yZXNlcnZlKGIsIE5VTEwpKQorCQlyZXR1cm4gMDsKKwogCW1lbXNldChuZXdfbm9kZXMsIDAsIHNpemVvZihuZXdfbm9kZXMpKTsKIAljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKIApAQCAtMTI1MiwxMSArMTMxMSwyMyBAQAogCQlyZXR1cm4gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKSB7Ci0JCW5ld19ub2Rlc1tpXSA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQocltpXS5iLCBmYWxzZSk7CisJCW5ld19ub2Rlc1tpXSA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQocltpXS5iLCBOVUxMKTsKIAkJaWYgKElTX0VSUl9PUl9OVUxMKG5ld19ub2Rlc1tpXSkpCiAJCQlnb3RvIG91dF9ub2NvYWxlc2NlOwogCX0KIAorCS8qCisJICogV2UgaGF2ZSB0byBjaGVjayB0aGUgcmVzZXJ2ZSBoZXJlLCBhZnRlciB3ZSd2ZSBhbGxvY2F0ZWQgb3VyIG5ldworCSAqIG5vZGVzLCB0byBtYWtlIHN1cmUgdGhlIGluc2VydCBiZWxvdyB3aWxsIHN1Y2NlZWQgLSB3ZSBhbHNvIGNoZWNrCisJICogYmVmb3JlIGFzIGFuIG9wdGltaXphdGlvbiB0byBwb3RlbnRpYWxseSBhdm9pZCBhIGJ1bmNoIG9mIGV4cGVuc2l2ZQorCSAqIGFsbG9jcy9zb3J0cworCSAqLworCWlmIChidHJlZV9jaGVja19yZXNlcnZlKGIsIE5VTEwpKQorCQlnb3RvIG91dF9ub2NvYWxlc2NlOworCisJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspCisJCW11dGV4X2xvY2soJm5ld19ub2Rlc1tpXS0+d3JpdGVfbG9jayk7CisKIAlmb3IgKGkgPSBub2RlcyAtIDE7IGkgPiAwOyAtLWkpIHsKIAkJc3RydWN0IGJzZXQgKm4xID0gYnRyZWVfYnNldF9maXJzdChuZXdfbm9kZXNbaV0pOwogCQlzdHJ1Y3QgYnNldCAqbjIgPSBidHJlZV9ic2V0X2ZpcnN0KG5ld19ub2Rlc1tpIC0gMV0pOwpAQCAtMTMxNSwyOCArMTM4NiwzNCBAQAogCiAJCW4yLT5rZXlzIC09IGtleXM7CiAKLQkJaWYgKF9fYmNoX2tleWxpc3RfcmVhbGxvYyhrZXlsaXN0LAorCQlpZiAoX19iY2hfa2V5bGlzdF9yZWFsbG9jKCZrZXlsaXN0LAogCQkJCQkgIGJrZXlfdTY0cygmbmV3X25vZGVzW2ldLT5rZXkpKSkKIAkJCWdvdG8gb3V0X25vY29hbGVzY2U7CiAKIAkJYmNoX2J0cmVlX25vZGVfd3JpdGUobmV3X25vZGVzW2ldLCAmY2wpOwotCQliY2hfa2V5bGlzdF9hZGQoa2V5bGlzdCwgJm5ld19ub2Rlc1tpXS0+a2V5KTsKKwkJYmNoX2tleWxpc3RfYWRkKCZrZXlsaXN0LCAmbmV3X25vZGVzW2ldLT5rZXkpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKSB7Ci0JCWlmIChfX2JjaF9rZXlsaXN0X3JlYWxsb2Moa2V5bGlzdCwgYmtleV91NjRzKCZyW2ldLmItPmtleSkpKQotCQkJZ290byBvdXRfbm9jb2FsZXNjZTsKKwlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKykKKwkJbXV0ZXhfdW5sb2NrKCZuZXdfbm9kZXNbaV0tPndyaXRlX2xvY2spOwogCi0JCW1ha2VfYnRyZWVfZnJlZWluZ19rZXkocltpXS5iLCBrZXlsaXN0LT50b3ApOwotCQliY2hfa2V5bGlzdF9wdXNoKGtleWxpc3QpOwotCX0KKwljbG9zdXJlX3N5bmMoJmNsKTsKIAogCS8qIFdlIGVtcHRpZWQgb3V0IHRoaXMgbm9kZSAqLwogCUJVR19PTihidHJlZV9ic2V0X2ZpcnN0KG5ld19ub2Rlc1swXSktPmtleXMpOwogCWJ0cmVlX25vZGVfZnJlZShuZXdfbm9kZXNbMF0pOwogCXJ3X3VubG9jayh0cnVlLCBuZXdfbm9kZXNbMF0pOwogCi0JY2xvc3VyZV9zeW5jKCZjbCk7CisJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKKwkJaWYgKF9fYmNoX2tleWxpc3RfcmVhbGxvYygma2V5bGlzdCwgYmtleV91NjRzKCZyW2ldLmItPmtleSkpKQorCQkJZ290byBvdXRfbm9jb2FsZXNjZTsKKworCQltYWtlX2J0cmVlX2ZyZWVpbmdfa2V5KHJbaV0uYiwga2V5bGlzdC50b3ApOworCQliY2hfa2V5bGlzdF9wdXNoKCZrZXlsaXN0KTsKKwl9CisKKwliY2hfYnRyZWVfaW5zZXJ0X25vZGUoYiwgb3AsICZrZXlsaXN0LCBOVUxMLCBOVUxMKTsKKwlCVUdfT04oIWJjaF9rZXlsaXN0X2VtcHR5KCZrZXlsaXN0KSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKykgewogCQlidHJlZV9ub2RlX2ZyZWUocltpXS5iKTsKQEAgLTEzNDUsMjIgKzE0MjIsMjIgQEAKIAkJcltpXS5iID0gbmV3X25vZGVzW2ldOwogCX0KIAotCWJjaF9idHJlZV9pbnNlcnRfbm9kZShiLCBvcCwga2V5bGlzdCwgTlVMTCwgTlVMTCk7Ci0JQlVHX09OKCFiY2hfa2V5bGlzdF9lbXB0eShrZXlsaXN0KSk7Ci0KIAltZW1tb3ZlKHIsIHIgKyAxLCBzaXplb2YoclswXSkgKiAobm9kZXMgLSAxKSk7CiAJcltub2RlcyAtIDFdLmIgPSBFUlJfUFRSKC1FSU5UUik7CiAKIAl0cmFjZV9iY2FjaGVfYnRyZWVfZ2NfY29hbGVzY2Uobm9kZXMpOwogCWdjLT5ub2Rlcy0tOwogCisJYmNoX2tleWxpc3RfZnJlZSgma2V5bGlzdCk7CisKIAkvKiBJbnZhbGlkYXRlZCBvdXIgaXRlcmF0b3IgKi8KIAlyZXR1cm4gLUVJTlRSOwogCiBvdXRfbm9jb2FsZXNjZToKIAljbG9zdXJlX3N5bmMoJmNsKTsKKwliY2hfa2V5bGlzdF9mcmVlKCZrZXlsaXN0KTsKIAotCXdoaWxlICgoayA9IGJjaF9rZXlsaXN0X3BvcChrZXlsaXN0KSkpCisJd2hpbGUgKChrID0gYmNoX2tleWxpc3RfcG9wKCZrZXlsaXN0KSkpCiAJCWlmICghYmtleV9jbXAoaywgJlpFUk9fS0VZKSkKIAkJCWF0b21pY19kZWMoJmItPmMtPnByaW9fYmxvY2tlZCk7CiAKQEAgLTEzNzIsNiArMTQ0OSw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJ0cmVlX2djX3Jld3JpdGVfbm9kZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3AsCisJCQkJIHN0cnVjdCBidHJlZSAqcmVwbGFjZSkKK3sKKwlzdHJ1Y3Qga2V5bGlzdCBrZXlzOworCXN0cnVjdCBidHJlZSAqbjsKKworCWlmIChidHJlZV9jaGVja19yZXNlcnZlKGIsIE5VTEwpKQorCQlyZXR1cm4gMDsKKworCW4gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KHJlcGxhY2UsIE5VTEwpOworCisJLyogcmVjaGVjayByZXNlcnZlIGFmdGVyIGFsbG9jYXRpbmcgcmVwbGFjZW1lbnQgbm9kZSAqLworCWlmIChidHJlZV9jaGVja19yZXNlcnZlKGIsIE5VTEwpKSB7CisJCWJ0cmVlX25vZGVfZnJlZShuKTsKKwkJcndfdW5sb2NrKHRydWUsIG4pOworCQlyZXR1cm4gMDsKKwl9CisKKwliY2hfYnRyZWVfbm9kZV93cml0ZV9zeW5jKG4pOworCisJYmNoX2tleWxpc3RfaW5pdCgma2V5cyk7CisJYmNoX2tleWxpc3RfYWRkKCZrZXlzLCAmbi0+a2V5KTsKKworCW1ha2VfYnRyZWVfZnJlZWluZ19rZXkocmVwbGFjZSwga2V5cy50b3ApOworCWJjaF9rZXlsaXN0X3B1c2goJmtleXMpOworCisJYmNoX2J0cmVlX2luc2VydF9ub2RlKGIsIG9wLCAma2V5cywgTlVMTCwgTlVMTCk7CisJQlVHX09OKCFiY2hfa2V5bGlzdF9lbXB0eSgma2V5cykpOworCisJYnRyZWVfbm9kZV9mcmVlKHJlcGxhY2UpOworCXJ3X3VubG9jayh0cnVlLCBuKTsKKworCS8qIEludmFsaWRhdGVkIG91ciBpdGVyYXRvciAqLworCXJldHVybiAtRUlOVFI7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBidHJlZV9nY19jb3VudF9rZXlzKHN0cnVjdCBidHJlZSAqYikKIHsKIAlzdHJ1Y3QgYmtleSAqazsKQEAgLTEzODcsMjYgKzE1MDAsMjMgQEAKIHN0YXRpYyBpbnQgYnRyZWVfZ2NfcmVjdXJzZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3AsCiAJCQkgICAgc3RydWN0IGNsb3N1cmUgKndyaXRlcywgc3RydWN0IGdjX3N0YXQgKmdjKQogewotCXVuc2lnbmVkIGk7CiAJaW50IHJldCA9IDA7CiAJYm9vbCBzaG91bGRfcmV3cml0ZTsKLQlzdHJ1Y3QgYnRyZWUgKm47CiAJc3RydWN0IGJrZXkgKms7Ci0Jc3RydWN0IGtleWxpc3Qga2V5czsKIAlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOwogCXN0cnVjdCBnY19tZXJnZV9pbmZvIHJbR0NfTUVSR0VfTk9ERVNdOwotCXN0cnVjdCBnY19tZXJnZV9pbmZvICpsYXN0ID0gciArIEdDX01FUkdFX05PREVTIC0gMTsKKwlzdHJ1Y3QgZ2NfbWVyZ2VfaW5mbyAqaSwgKmxhc3QgPSByICsgQVJSQVlfU0laRShyKSAtIDE7CiAKLQliY2hfa2V5bGlzdF9pbml0KCZrZXlzKTsKIAliY2hfYnRyZWVfaXRlcl9pbml0KCZiLT5rZXlzLCAmaXRlciwgJmItPmMtPmdjX2RvbmUpOwogCi0JZm9yIChpID0gMDsgaSA8IEdDX01FUkdFX05PREVTOyBpKyspCi0JCXJbaV0uYiA9IEVSUl9QVFIoLUVJTlRSKTsKKwlmb3IgKGkgPSByOyBpIDwgciArIEFSUkFZX1NJWkUocik7IGkrKykKKwkJaS0+YiA9IEVSUl9QVFIoLUVJTlRSKTsKIAogCXdoaWxlICgxKSB7CiAJCWsgPSBiY2hfYnRyZWVfaXRlcl9uZXh0X2ZpbHRlcigmaXRlciwgJmItPmtleXMsIGJjaF9wdHJfYmFkKTsKIAkJaWYgKGspIHsKLQkJCXItPmIgPSBiY2hfYnRyZWVfbm9kZV9nZXQoYi0+YywgaywgYi0+bGV2ZWwgLSAxLCB0cnVlKTsKKwkJCXItPmIgPSBiY2hfYnRyZWVfbm9kZV9nZXQoYi0+Yywgb3AsIGssIGItPmxldmVsIC0gMSwKKwkJCQkJCSAgdHJ1ZSk7CiAJCQlpZiAoSVNfRVJSKHItPmIpKSB7CiAJCQkJcmV0ID0gUFRSX0VSUihyLT5iKTsKIAkJCQlicmVhazsKQEAgLTE0MTQsNyArMTUyNCw3IEBACiAKIAkJCXItPmtleXMgPSBidHJlZV9nY19jb3VudF9rZXlzKHItPmIpOwogCi0JCQlyZXQgPSBidHJlZV9nY19jb2FsZXNjZShiLCBvcCwgJmtleXMsIGdjLCByKTsKKwkJCXJldCA9IGJ0cmVlX2djX2NvYWxlc2NlKGIsIG9wLCBnYywgcik7CiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCQl9CkBAIC0xNDI0LDMyICsxNTM0LDEwIEBACiAKIAkJaWYgKCFJU19FUlIobGFzdC0+YikpIHsKIAkJCXNob3VsZF9yZXdyaXRlID0gYnRyZWVfZ2NfbWFya19ub2RlKGxhc3QtPmIsIGdjKTsKLQkJCWlmIChzaG91bGRfcmV3cml0ZSAmJgotCQkJICAgICFidHJlZV9jaGVja19yZXNlcnZlKGIsIE5VTEwpKSB7Ci0JCQkJbiA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQobGFzdC0+YiwKLQkJCQkJCQkJIGZhbHNlKTsKLQotCQkJCWlmICghSVNfRVJSX09SX05VTEwobikpIHsKLQkJCQkJYmNoX2J0cmVlX25vZGVfd3JpdGVfc3luYyhuKTsKLQkJCQkJYmNoX2tleWxpc3RfYWRkKCZrZXlzLCAmbi0+a2V5KTsKLQotCQkJCQltYWtlX2J0cmVlX2ZyZWVpbmdfa2V5KGxhc3QtPmIsCi0JCQkJCQkJICAgICAgIGtleXMudG9wKTsKLQkJCQkJYmNoX2tleWxpc3RfcHVzaCgma2V5cyk7Ci0KLQkJCQkJYnRyZWVfbm9kZV9mcmVlKGxhc3QtPmIpOwotCi0JCQkJCWJjaF9idHJlZV9pbnNlcnRfbm9kZShiLCBvcCwgJmtleXMsCi0JCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7Ci0JCQkJCUJVR19PTighYmNoX2tleWxpc3RfZW1wdHkoJmtleXMpKTsKLQotCQkJCQlyd191bmxvY2sodHJ1ZSwgbGFzdC0+Yik7Ci0JCQkJCWxhc3QtPmIgPSBuOwotCi0JCQkJCS8qIEludmFsaWRhdGVkIG91ciBpdGVyYXRvciAqLwotCQkJCQlyZXQgPSAtRUlOVFI7CisJCQlpZiAoc2hvdWxkX3Jld3JpdGUpIHsKKwkJCQlyZXQgPSBidHJlZV9nY19yZXdyaXRlX25vZGUoYiwgb3AsIGxhc3QtPmIpOworCQkJCWlmIChyZXQpCiAJCQkJCWJyZWFrOwotCQkJCX0KIAkJCX0KIAogCQkJaWYgKGxhc3QtPmItPmxldmVsKSB7CkBAIC0xNDY0LDggKzE1NTIsMTAgQEAKIAkJCSAqIE11c3QgZmx1c2ggbGVhZiBub2RlcyBiZWZvcmUgZ2MgZW5kcywgc2luY2UgcmVwbGFjZQogCQkJICogb3BlcmF0aW9ucyBhcmVuJ3Qgam91cm5hbGxlZAogCQkJICovCisJCQltdXRleF9sb2NrKCZsYXN0LT5iLT53cml0ZV9sb2NrKTsKIAkJCWlmIChidHJlZV9ub2RlX2RpcnR5KGxhc3QtPmIpKQogCQkJCWJjaF9idHJlZV9ub2RlX3dyaXRlKGxhc3QtPmIsIHdyaXRlcyk7CisJCQltdXRleF91bmxvY2soJmxhc3QtPmItPndyaXRlX2xvY2spOwogCQkJcndfdW5sb2NrKHRydWUsIGxhc3QtPmIpOwogCQl9CiAKQEAgLTE0NzgsMTUgKzE1NjgsMTUgQEAKIAkJfQogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBHQ19NRVJHRV9OT0RFUzsgaSsrKQotCQlpZiAoIUlTX0VSUl9PUl9OVUxMKHJbaV0uYikpIHsKLQkJCWlmIChidHJlZV9ub2RlX2RpcnR5KHJbaV0uYikpCi0JCQkJYmNoX2J0cmVlX25vZGVfd3JpdGUocltpXS5iLCB3cml0ZXMpOwotCQkJcndfdW5sb2NrKHRydWUsIHJbaV0uYik7CisJZm9yIChpID0gcjsgaSA8IHIgKyBBUlJBWV9TSVpFKHIpOyBpKyspCisJCWlmICghSVNfRVJSX09SX05VTEwoaS0+YikpIHsKKwkJCW11dGV4X2xvY2soJmktPmItPndyaXRlX2xvY2spOworCQkJaWYgKGJ0cmVlX25vZGVfZGlydHkoaS0+YikpCisJCQkJYmNoX2J0cmVlX25vZGVfd3JpdGUoaS0+Yiwgd3JpdGVzKTsKKwkJCW11dGV4X3VubG9jaygmaS0+Yi0+d3JpdGVfbG9jayk7CisJCQlyd191bmxvY2sodHJ1ZSwgaS0+Yik7CiAJCX0KIAotCWJjaF9rZXlsaXN0X2ZyZWUoJmtleXMpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ5OSwxMCArMTU4OSwxMSBAQAogCiAJc2hvdWxkX3Jld3JpdGUgPSBidHJlZV9nY19tYXJrX25vZGUoYiwgZ2MpOwogCWlmIChzaG91bGRfcmV3cml0ZSkgewotCQluID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChiLCBmYWxzZSk7CisJCW4gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGIsIE5VTEwpOwogCiAJCWlmICghSVNfRVJSX09SX05VTEwobikpIHsKIAkJCWJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMobik7CisKIAkJCWJjaF9idHJlZV9zZXRfcm9vdChuKTsKIAkJCWJ0cmVlX25vZGVfZnJlZShiKTsKIAkJCXJ3X3VubG9jayh0cnVlLCBuKTsKQEAgLTE1MTEsNiArMTYwMiw4IEBACiAJCX0KIAl9CiAKKwlfX2JjaF9idHJlZV9tYXJrX2tleShiLT5jLCBiLT5sZXZlbCArIDEsICZiLT5rZXkpOworCiAJaWYgKGItPmxldmVsKSB7CiAJCXJldCA9IGJ0cmVlX2djX3JlY3Vyc2UoYiwgb3AsIHdyaXRlcywgZ2MpOwogCQlpZiAocmV0KQpAQCAtMTUzOCw5ICsxNjMxLDkgQEAKIAogCWZvcl9lYWNoX2NhY2hlKGNhLCBjLCBpKQogCQlmb3JfZWFjaF9idWNrZXQoYiwgY2EpIHsKLQkJCWItPmdjX2dlbiA9IGItPmdlbjsKKwkJCWItPmxhc3RfZ2MgPSBiLT5nZW47CiAJCQlpZiAoIWF0b21pY19yZWFkKCZiLT5waW4pKSB7Ci0JCQkJU0VUX0dDX01BUksoYiwgR0NfTUFSS19SRUNMQUlNQUJMRSk7CisJCQkJU0VUX0dDX01BUksoYiwgMCk7CiAJCQkJU0VUX0dDX1NFQ1RPUlNfVVNFRChiLCAwKTsKIAkJCX0KIAkJfQpAQCAtMTU0OCw3ICsxNjQxLDcgQEAKIAltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIH0KIAotc2l6ZV90IGJjaF9idHJlZV9nY19maW5pc2goc3RydWN0IGNhY2hlX3NldCAqYykKK3N0YXRpYyBzaXplX3QgYmNoX2J0cmVlX2djX2ZpbmlzaChzdHJ1Y3QgY2FjaGVfc2V0ICpjKQogewogCXNpemVfdCBhdmFpbGFibGUgPSAwOwogCXN0cnVjdCBidWNrZXQgKmI7CkBAIC0xNTYxLDExICsxNjU0LDYgQEAKIAljLT5nY19tYXJrX3ZhbGlkID0gMTsKIAljLT5uZWVkX2djCT0gMDsKIAotCWlmIChjLT5yb290KQotCQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoJmMtPnJvb3QtPmtleSk7IGkrKykKLQkJCVNFVF9HQ19NQVJLKFBUUl9CVUNLRVQoYywgJmMtPnJvb3QtPmtleSwgaSksCi0JCQkJICAgIEdDX01BUktfTUVUQURBVEEpOwotCiAJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKCZjLT51dWlkX2J1Y2tldCk7IGkrKykKIAkJU0VUX0dDX01BUksoUFRSX0JVQ0tFVChjLCAmYy0+dXVpZF9idWNrZXQsIGkpLAogCQkJICAgIEdDX01BUktfTUVUQURBVEEpOwpAQCAtMTYwNSwxNSArMTY5MywxNSBAQAogCQkJU0VUX0dDX01BUksoY2EtPmJ1Y2tldHMgKyAqaSwgR0NfTUFSS19NRVRBREFUQSk7CiAKIAkJZm9yX2VhY2hfYnVja2V0KGIsIGNhKSB7Ci0JCQliLT5sYXN0X2djCT0gYi0+Z2NfZ2VuOwogCQkJYy0+bmVlZF9nYwk9IG1heChjLT5uZWVkX2djLCBidWNrZXRfZ2NfZ2VuKGIpKTsKIAotCQkJaWYgKCFhdG9taWNfcmVhZCgmYi0+cGluKSAmJgotCQkJICAgIEdDX01BUksoYikgPT0gR0NfTUFSS19SRUNMQUlNQUJMRSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZiLT5waW4pKQorCQkJCWNvbnRpbnVlOworCisJCQlCVUdfT04oIUdDX01BUksoYikgJiYgR0NfU0VDVE9SU19VU0VEKGIpKTsKKworCQkJaWYgKCFHQ19NQVJLKGIpIHx8IEdDX01BUksoYikgPT0gR0NfTUFSS19SRUNMQUlNQUJMRSkKIAkJCQlhdmFpbGFibGUrKzsKLQkJCQlpZiAoIUdDX1NFQ1RPUlNfVVNFRChiKSkKLQkJCQkJYmNoX2J1Y2tldF9hZGRfdW51c2VkKGNhLCBiKTsKLQkJCX0KIAkJfQogCX0KIApAQCAtMTcwNSwzNiArMTc5MywxNiBAQAogCiAvKiBJbml0aWFsIHBhcnRpYWwgZ2MgKi8KIAotc3RhdGljIGludCBiY2hfYnRyZWVfY2hlY2tfcmVjdXJzZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3AsCi0JCQkJICAgdW5zaWduZWQgbG9uZyAqKnNlZW4pCitzdGF0aWMgaW50IGJjaF9idHJlZV9jaGVja19yZWN1cnNlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX29wICpvcCkKIHsKIAlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpOwogCXN0cnVjdCBia2V5ICprLCAqcCA9IE5VTEw7Ci0Jc3RydWN0IGJ1Y2tldCAqZzsKIAlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOwogCi0JZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfaW52YWxpZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykgewotCQkJaWYgKCFwdHJfYXZhaWxhYmxlKGItPmMsIGssIGkpKQotCQkJCWNvbnRpbnVlOworCWZvcl9lYWNoX2tleV9maWx0ZXIoJmItPmtleXMsIGssICZpdGVyLCBiY2hfcHRyX2ludmFsaWQpCisJCWJjaF9pbml0aWFsX21hcmtfa2V5KGItPmMsIGItPmxldmVsLCBrKTsKIAotCQkJZyA9IFBUUl9CVUNLRVQoYi0+YywgaywgaSk7Ci0KLQkJCWlmICghX190ZXN0X2FuZF9zZXRfYml0KFBUUl9CVUNLRVRfTlIoYi0+YywgaywgaSksCi0JCQkJCQlzZWVuW1BUUl9ERVYoaywgaSldKSB8fAotCQkJICAgICFwdHJfc3RhbGUoYi0+YywgaywgaSkpIHsKLQkJCQlnLT5nZW4gPSBQVFJfR0VOKGssIGkpOwotCi0JCQkJaWYgKGItPmxldmVsKQotCQkJCQlnLT5wcmlvID0gQlRSRUVfUFJJTzsKLQkJCQllbHNlIGlmIChnLT5wcmlvID09IEJUUkVFX1BSSU8pCi0JCQkJCWctPnByaW8gPSBJTklUSUFMX1BSSU87Ci0JCQl9Ci0JCX0KLQotCQlidHJlZV9tYXJrX2tleShiLCBrKTsKLQl9CisJYmNoX2luaXRpYWxfbWFya19rZXkoYi0+YywgYi0+bGV2ZWwgKyAxLCAmYi0+a2V5KTsKIAogCWlmIChiLT5sZXZlbCkgewogCQliY2hfYnRyZWVfaXRlcl9pbml0KCZiLT5rZXlzLCAmaXRlciwgTlVMTCk7CkBAIC0xNzQ2LDQwICsxODE0LDU4IEBACiAJCQkJYnRyZWVfbm9kZV9wcmVmZXRjaChiLT5jLCBrLCBiLT5sZXZlbCAtIDEpOwogCiAJCQlpZiAocCkKLQkJCQlyZXQgPSBidHJlZShjaGVja19yZWN1cnNlLCBwLCBiLCBvcCwgc2Vlbik7CisJCQkJcmV0ID0gYnRyZWUoY2hlY2tfcmVjdXJzZSwgcCwgYiwgb3ApOwogCiAJCQlwID0gazsKIAkJfSB3aGlsZSAocCAmJiAhcmV0KTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgYmNoX2J0cmVlX2NoZWNrKHN0cnVjdCBjYWNoZV9zZXQgKmMpCiB7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0JdW5zaWduZWQgaTsKLQl1bnNpZ25lZCBsb25nICpzZWVuW01BWF9DQUNIRVNfUEVSX1NFVF07CiAJc3RydWN0IGJ0cmVlX29wIG9wOwogCi0JbWVtc2V0KHNlZW4sIDAsIHNpemVvZihzZWVuKSk7CiAJYmNoX2J0cmVlX29wX2luaXQoJm9wLCBTSFJUX01BWCk7CiAKLQlmb3IgKGkgPSAwOyBjLT5jYWNoZVtpXTsgaSsrKSB7Ci0JCXNpemVfdCBuID0gRElWX1JPVU5EX1VQKGMtPmNhY2hlW2ldLT5zYi5uYnVja2V0cywgOCk7Ci0JCXNlZW5baV0gPSBrbWFsbG9jKG4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXNlZW5baV0pCi0JCQlnb3RvIGVycjsKKwlyZXR1cm4gYnRyZWVfcm9vdChjaGVja19yZWN1cnNlLCBjLCAmb3ApOworfQogCi0JCS8qIERpc2FibGVzIHRoZSBzZWVuIGFycmF5IHVudGlsIHByaW9fcmVhZCgpIHVzZXMgaXQgdG9vICovCi0JCW1lbXNldChzZWVuW2ldLCAweEZGLCBuKTsKK3ZvaWQgYmNoX2luaXRpYWxfZ2NfZmluaXNoKHN0cnVjdCBjYWNoZV9zZXQgKmMpCit7CisJc3RydWN0IGNhY2hlICpjYTsKKwlzdHJ1Y3QgYnVja2V0ICpiOworCXVuc2lnbmVkIGk7CisKKwliY2hfYnRyZWVfZ2NfZmluaXNoKGMpOworCisJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHB1dCBzb21lIHVudXNlZCBidWNrZXRzIGRpcmVjdGx5IG9uIHRoZSBwcmlvIGZyZWVsaXN0IGluCisJICogb3JkZXIgdG8gZ2V0IHRoZSBhbGxvY2F0b3IgdGhyZWFkIHN0YXJ0ZWQgLSBpdCBuZWVkcyBmcmVlZCBidWNrZXRzIGluCisJICogb3JkZXIgdG8gcmV3cml0ZSB0aGUgcHJpb3MgYW5kIGdlbnMsIGFuZCBpdCBuZWVkcyB0byByZXdyaXRlIHByaW9zCisJICogYW5kIGdlbnMgaW4gb3JkZXIgdG8gZnJlZSBidWNrZXRzLgorCSAqCisJICogVGhpcyBpcyBvbmx5IHNhZmUgZm9yIGJ1Y2tldHMgdGhhdCBoYXZlIG5vIGxpdmUgZGF0YSBpbiB0aGVtLCB3aGljaAorCSAqIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgc29tZSBvZi4KKwkgKi8KKwlmb3JfZWFjaF9jYWNoZShjYSwgYywgaSkgeworCQlmb3JfZWFjaF9idWNrZXQoYiwgY2EpIHsKKwkJCWlmIChmaWZvX2Z1bGwoJmNhLT5mcmVlW1JFU0VSVkVfUFJJT10pKQorCQkJCWJyZWFrOworCisJCQlpZiAoYmNoX2Nhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikgJiYKKwkJCSAgICAhR0NfTUFSSyhiKSkgeworCQkJCV9fYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CisJCQkJZmlmb19wdXNoKCZjYS0+ZnJlZVtSRVNFUlZFX1BSSU9dLAorCQkJCQkgIGIgLSBjYS0+YnVja2V0cyk7CisJCQl9CisJCX0KIAl9CiAKLQlyZXQgPSBidHJlZV9yb290KGNoZWNrX3JlY3Vyc2UsIGMsICZvcCwgc2Vlbik7Ci1lcnI6Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9DQUNIRVNfUEVSX1NFVDsgaSsrKQotCQlrZnJlZShzZWVuW2ldKTsKLQlyZXR1cm4gcmV0OworCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwogfQogCiAvKiBCdHJlZSBpbnNlcnRpb24gKi8KQEAgLTE4NzEsMTEgKzE5NTcsMTQgQEAKIAljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKIAliY2hfa2V5bGlzdF9pbml0KCZwYXJlbnRfa2V5cyk7CiAKLQlpZiAoIWItPmxldmVsICYmCi0JICAgIGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgb3ApKQotCQlyZXR1cm4gLUVJTlRSOworCWlmIChidHJlZV9jaGVja19yZXNlcnZlKGIsIG9wKSkgeworCQlpZiAoIWItPmxldmVsKQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJZWxzZQorCQkJV0FSTigxLCAiaW5zdWZmaWNpZW50IHJlc2VydmUgZm9yIHNwbGl0XG4iKTsKKwl9CiAKLQluMSA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQoYiwgdHJ1ZSk7CisJbjEgPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGIsIG9wKTsKIAlpZiAoSVNfRVJSKG4xKSkKIAkJZ290byBlcnI7CiAKQEAgLTE4ODcsMTYgKzE5NzYsMTkgQEAKIAogCQl0cmFjZV9iY2FjaGVfYnRyZWVfbm9kZV9zcGxpdChiLCBidHJlZV9ic2V0X2ZpcnN0KG4xKS0+a2V5cyk7CiAKLQkJbjIgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBiLT5sZXZlbCwgdHJ1ZSk7CisJCW4yID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYi0+Yywgb3AsIGItPmxldmVsKTsKIAkJaWYgKElTX0VSUihuMikpCiAJCQlnb3RvIGVycl9mcmVlMTsKIAogCQlpZiAoIWItPnBhcmVudCkgewotCQkJbjMgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBiLT5sZXZlbCArIDEsIHRydWUpOworCQkJbjMgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBvcCwgYi0+bGV2ZWwgKyAxKTsKIAkJCWlmIChJU19FUlIobjMpKQogCQkJCWdvdG8gZXJyX2ZyZWUyOwogCQl9CiAKKwkJbXV0ZXhfbG9jaygmbjEtPndyaXRlX2xvY2spOworCQltdXRleF9sb2NrKCZuMi0+d3JpdGVfbG9jayk7CisKIAkJYmNoX2J0cmVlX2luc2VydF9rZXlzKG4xLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KTsKIAogCQkvKgpAQCAtMTkyMyw0NSArMjAxNSw0NSBAQAogCiAJCWJjaF9rZXlsaXN0X2FkZCgmcGFyZW50X2tleXMsICZuMi0+a2V5KTsKIAkJYmNoX2J0cmVlX25vZGVfd3JpdGUobjIsICZjbCk7CisJCW11dGV4X3VubG9jaygmbjItPndyaXRlX2xvY2spOwogCQlyd191bmxvY2sodHJ1ZSwgbjIpOwogCX0gZWxzZSB7CiAJCXRyYWNlX2JjYWNoZV9idHJlZV9ub2RlX2NvbXBhY3QoYiwgYnRyZWVfYnNldF9maXJzdChuMSktPmtleXMpOwogCisJCW11dGV4X2xvY2soJm4xLT53cml0ZV9sb2NrKTsKIAkJYmNoX2J0cmVlX2luc2VydF9rZXlzKG4xLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KTsKIAl9CiAKIAliY2hfa2V5bGlzdF9hZGQoJnBhcmVudF9rZXlzLCAmbjEtPmtleSk7CiAJYmNoX2J0cmVlX25vZGVfd3JpdGUobjEsICZjbCk7CisJbXV0ZXhfdW5sb2NrKCZuMS0+d3JpdGVfbG9jayk7CiAKIAlpZiAobjMpIHsKIAkJLyogRGVwdGggaW5jcmVhc2VzLCBtYWtlIGEgbmV3IHJvb3QgKi8KKwkJbXV0ZXhfbG9jaygmbjMtPndyaXRlX2xvY2spOwogCQlia2V5X2NvcHlfa2V5KCZuMy0+a2V5LCAmTUFYX0tFWSk7CiAJCWJjaF9idHJlZV9pbnNlcnRfa2V5cyhuMywgb3AsICZwYXJlbnRfa2V5cywgTlVMTCk7CiAJCWJjaF9idHJlZV9ub2RlX3dyaXRlKG4zLCAmY2wpOworCQltdXRleF91bmxvY2soJm4zLT53cml0ZV9sb2NrKTsKIAogCQljbG9zdXJlX3N5bmMoJmNsKTsKIAkJYmNoX2J0cmVlX3NldF9yb290KG4zKTsKIAkJcndfdW5sb2NrKHRydWUsIG4zKTsKLQotCQlidHJlZV9ub2RlX2ZyZWUoYik7CiAJfSBlbHNlIGlmICghYi0+cGFyZW50KSB7CiAJCS8qIFJvb3QgZmlsbGVkIHVwIGJ1dCBkaWRuJ3QgbmVlZCB0byBiZSBzcGxpdCAqLwogCQljbG9zdXJlX3N5bmMoJmNsKTsKIAkJYmNoX2J0cmVlX3NldF9yb290KG4xKTsKLQotCQlidHJlZV9ub2RlX2ZyZWUoYik7CiAJfSBlbHNlIHsKIAkJLyogU3BsaXQgYSBub24gcm9vdCBub2RlICovCiAJCWNsb3N1cmVfc3luYygmY2wpOwogCQltYWtlX2J0cmVlX2ZyZWVpbmdfa2V5KGIsIHBhcmVudF9rZXlzLnRvcCk7CiAJCWJjaF9rZXlsaXN0X3B1c2goJnBhcmVudF9rZXlzKTsKIAotCQlidHJlZV9ub2RlX2ZyZWUoYik7Ci0KIAkJYmNoX2J0cmVlX2luc2VydF9ub2RlKGItPnBhcmVudCwgb3AsICZwYXJlbnRfa2V5cywgTlVMTCwgTlVMTCk7CiAJCUJVR19PTighYmNoX2tleWxpc3RfZW1wdHkoJnBhcmVudF9rZXlzKSk7CiAJfQogCisJYnRyZWVfbm9kZV9mcmVlKGIpOwogCXJ3X3VubG9jayh0cnVlLCBuMSk7CiAKIAliY2hfdGltZV9zdGF0c191cGRhdGUoJmItPmMtPmJ0cmVlX3NwbGl0X3RpbWUsIHN0YXJ0X3RpbWUpOwpAQCAtMTk3Niw3ICsyMDY4LDcgQEAKIAlidHJlZV9ub2RlX2ZyZWUobjEpOwogCXJ3X3VubG9jayh0cnVlLCBuMSk7CiBlcnI6Ci0JV0FSTigxLCAiYmNhY2hlOiBidHJlZSBzcGxpdCBmYWlsZWQiKTsKKwlXQVJOKDEsICJiY2FjaGU6IGJ0cmVlIHNwbGl0IGZhaWxlZCAobGV2ZWwgJXUpIiwgYi0+bGV2ZWwpOwogCiAJaWYgKG4zID09IEVSUl9QVFIoLUVBR0FJTikgfHwKIAkgICAgbjIgPT0gRVJSX1BUUigtRUFHQUlOKSB8fApAQCAtMTk5MSwzMyArMjA4Myw1NCBAQAogCQkJCSBhdG9taWNfdCAqam91cm5hbF9yZWYsCiAJCQkJIHN0cnVjdCBia2V5ICpyZXBsYWNlX2tleSkKIHsKKwlzdHJ1Y3QgY2xvc3VyZSBjbDsKKwogCUJVR19PTihiLT5sZXZlbCAmJiByZXBsYWNlX2tleSk7CiAKKwljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKKworCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOworCisJaWYgKHdyaXRlX2Jsb2NrKGIpICE9IGJ0cmVlX2JzZXRfbGFzdChiKSAmJgorCSAgICBiLT5rZXlzLmxhc3Rfc2V0X3Vud3JpdHRlbikKKwkJYmNoX2J0cmVlX2luaXRfbmV4dChiKTsgLyoganVzdCB3cm90ZSBhIHNldCAqLworCiAJaWYgKGJjaF9rZXlsaXN0X25rZXlzKGluc2VydF9rZXlzKSA+IGluc2VydF91NjRzX3JlbWFpbmluZyhiKSkgewotCQlpZiAoY3VycmVudC0+YmlvX2xpc3QpIHsKLQkJCW9wLT5sb2NrID0gYi0+Yy0+cm9vdC0+bGV2ZWwgKyAxOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0gZWxzZSBpZiAob3AtPmxvY2sgPD0gYi0+Yy0+cm9vdC0+bGV2ZWwpIHsKLQkJCW9wLT5sb2NrID0gYi0+Yy0+cm9vdC0+bGV2ZWwgKyAxOwotCQkJcmV0dXJuIC1FSU5UUjsKLQkJfSBlbHNlIHsKLQkJCS8qIEludmFsaWRhdGVkIGFsbCBpdGVyYXRvcnMgKi8KLQkJCWludCByZXQgPSBidHJlZV9zcGxpdChiLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KTsKKwkJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKKwkJZ290byBzcGxpdDsKKwl9CiAKLQkJCXJldHVybiBiY2hfa2V5bGlzdF9lbXB0eShpbnNlcnRfa2V5cykgPwotCQkJCTAgOiByZXQgPzogLUVJTlRSOwotCQl9CisJQlVHX09OKHdyaXRlX2Jsb2NrKGIpICE9IGJ0cmVlX2JzZXRfbGFzdChiKSk7CisKKwlpZiAoYmNoX2J0cmVlX2luc2VydF9rZXlzKGIsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpKSB7CisJCWlmICghYi0+bGV2ZWwpCisJCQliY2hfYnRyZWVfbGVhZl9kaXJ0eShiLCBqb3VybmFsX3JlZik7CisJCWVsc2UKKwkJCWJjaF9idHJlZV9ub2RlX3dyaXRlKGIsICZjbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKKworCS8qIHdhaXQgZm9yIGJ0cmVlIG5vZGUgd3JpdGUgaWYgbmVjZXNzYXJ5LCBhZnRlciB1bmxvY2sgKi8KKwljbG9zdXJlX3N5bmMoJmNsKTsKKworCXJldHVybiAwOworc3BsaXQ6CisJaWYgKGN1cnJlbnQtPmJpb19saXN0KSB7CisJCW9wLT5sb2NrID0gYi0+Yy0+cm9vdC0+bGV2ZWwgKyAxOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgaWYgKG9wLT5sb2NrIDw9IGItPmMtPnJvb3QtPmxldmVsKSB7CisJCW9wLT5sb2NrID0gYi0+Yy0+cm9vdC0+bGV2ZWwgKyAxOworCQlyZXR1cm4gLUVJTlRSOwogCX0gZWxzZSB7Ci0JCUJVR19PTih3cml0ZV9ibG9jayhiKSAhPSBidHJlZV9ic2V0X2xhc3QoYikpOworCQkvKiBJbnZhbGlkYXRlZCBhbGwgaXRlcmF0b3JzICovCisJCWludCByZXQgPSBidHJlZV9zcGxpdChiLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KTsKIAotCQlpZiAoYmNoX2J0cmVlX2luc2VydF9rZXlzKGIsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpKSB7Ci0JCQlpZiAoIWItPmxldmVsKQotCQkJCWJjaF9idHJlZV9sZWFmX2RpcnR5KGIsIGpvdXJuYWxfcmVmKTsKLQkJCWVsc2UKLQkJCQliY2hfYnRyZWVfbm9kZV93cml0ZV9zeW5jKGIpOwotCQl9Ci0KLQkJcmV0dXJuIDA7CisJCWlmIChiY2hfa2V5bGlzdF9lbXB0eShpbnNlcnRfa2V5cykpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoIXJldCkKKwkJCXJldHVybiAtRUlOVFI7CisJCXJldHVybiByZXQ7CiAJfQogfQogCkBAIC0yNDAzLDE4ICsyNTE2LDMgQEAKIAlzcGluX2xvY2tfaW5pdCgmYnVmLT5sb2NrKTsKIAlhcnJheV9hbGxvY2F0b3JfaW5pdCgmYnVmLT5mcmVlbGlzdCk7CiB9Ci0KLXZvaWQgYmNoX2J0cmVlX2V4aXQodm9pZCkKLXsKLQlpZiAoYnRyZWVfaW9fd3EpCi0JCWRlc3Ryb3lfd29ya3F1ZXVlKGJ0cmVlX2lvX3dxKTsKLX0KLQotaW50IF9faW5pdCBiY2hfYnRyZWVfaW5pdCh2b2lkKQotewotCWJ0cmVlX2lvX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJjaF9idHJlZV9pbyIpOwotCWlmICghYnRyZWVfaW9fd3EpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5oIGIvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuaAppbmRleCBhZjA2NWU5Li45MWRmYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmgKQEAgLTEyNyw2ICsxMjcsOCBAQAogCXN0cnVjdCBjYWNoZV9zZXQJKmM7CiAJc3RydWN0IGJ0cmVlCQkqcGFyZW50OwogCisJc3RydWN0IG11dGV4CQl3cml0ZV9sb2NrOworCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJdWludDE2X3QJCXdyaXR0ZW47CS8qIHdvdWxkIGJlIG5pY2UgdG8ga2lsbCAqLwogCXVpbnQ4X3QJCQlsZXZlbDsKQEAgLTIzNiwxMSArMjM4LDEzIEBACiB9CiAKIHZvaWQgYmNoX2J0cmVlX25vZGVfcmVhZF9kb25lKHN0cnVjdCBidHJlZSAqKTsKK3ZvaWQgX19iY2hfYnRyZWVfbm9kZV93cml0ZShzdHJ1Y3QgYnRyZWUgKiwgc3RydWN0IGNsb3N1cmUgKik7CiB2b2lkIGJjaF9idHJlZV9ub2RlX3dyaXRlKHN0cnVjdCBidHJlZSAqLCBzdHJ1Y3QgY2xvc3VyZSAqKTsKIAogdm9pZCBiY2hfYnRyZWVfc2V0X3Jvb3Qoc3RydWN0IGJ0cmVlICopOwotc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICosIGludCwgYm9vbCk7Ci1zdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2dldChzdHJ1Y3QgY2FjaGVfc2V0ICosIHN0cnVjdCBia2V5ICosIGludCwgYm9vbCk7CitzdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKiwgc3RydWN0IGJ0cmVlX29wICosIGludCk7CitzdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2dldChzdHJ1Y3QgY2FjaGVfc2V0ICosIHN0cnVjdCBidHJlZV9vcCAqLAorCQkJCSBzdHJ1Y3QgYmtleSAqLCBpbnQsIGJvb2wpOwogCiBpbnQgYmNoX2J0cmVlX2luc2VydF9jaGVja19rZXkoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBidHJlZV9vcCAqLAogCQkJICAgICAgIHN0cnVjdCBia2V5ICopOwpAQCAtMjQ4LDEwICsyNTIsMTAgQEAKIAkJICAgICBhdG9taWNfdCAqLCBzdHJ1Y3QgYmtleSAqKTsKIAogaW50IGJjaF9nY190aHJlYWRfc3RhcnQoc3RydWN0IGNhY2hlX3NldCAqKTsKLXNpemVfdCBiY2hfYnRyZWVfZ2NfZmluaXNoKHN0cnVjdCBjYWNoZV9zZXQgKik7Cit2b2lkIGJjaF9pbml0aWFsX2djX2ZpbmlzaChzdHJ1Y3QgY2FjaGVfc2V0ICopOwogdm9pZCBiY2hfbW92aW5nX2djKHN0cnVjdCBjYWNoZV9zZXQgKik7CiBpbnQgYmNoX2J0cmVlX2NoZWNrKHN0cnVjdCBjYWNoZV9zZXQgKik7Ci11aW50OF90IF9fYmNoX2J0cmVlX21hcmtfa2V5KHN0cnVjdCBjYWNoZV9zZXQgKiwgaW50LCBzdHJ1Y3QgYmtleSAqKTsKK3ZvaWQgYmNoX2luaXRpYWxfbWFya19rZXkoc3RydWN0IGNhY2hlX3NldCAqLCBpbnQsIHN0cnVjdCBia2V5ICopOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgd2FrZV91cF9nYyhzdHJ1Y3QgY2FjaGVfc2V0ICpjKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvZXh0ZW50cy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvZXh0ZW50cy5jCmluZGV4IDQxNmQxYTMuLjNhMGRlNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2V4dGVudHMuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmMKQEAgLTE5NCw5ICsxOTQsOSBAQAogCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOwogCWJjaF9leHRlbnRfdG9fdGV4dChidWYsIHNpemVvZihidWYpLCBrKTsKIAlidHJlZV9idWcoYiwKLSJpbmNvbnNpc3RlbnQgYnRyZWUgcG9pbnRlciAlczogYnVja2V0ICV6aSBwaW4gJWkgcHJpbyAlaSBnZW4gJWkgbGFzdF9nYyAlaSBtYXJrICVsbHUgZ2NfZ2VuICVpIiwKKyJpbmNvbnNpc3RlbnQgYnRyZWUgcG9pbnRlciAlczogYnVja2V0ICV6aSBwaW4gJWkgcHJpbyAlaSBnZW4gJWkgbGFzdF9nYyAlaSBtYXJrICVsbHUiLAogCQkgIGJ1ZiwgUFRSX0JVQ0tFVF9OUihiLT5jLCBrLCBpKSwgYXRvbWljX3JlYWQoJmctPnBpbiksCi0JCSAgZy0+cHJpbywgZy0+Z2VuLCBnLT5sYXN0X2djLCBHQ19NQVJLKGcpLCBnLT5nY19nZW4pOworCQkgIGctPnByaW8sIGctPmdlbiwgZy0+bGFzdF9nYywgR0NfTUFSSyhnKSk7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTMwOCw2ICszMDgsMTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgYmNoX3N1YnRyYWN0X2RpcnR5KHN0cnVjdCBia2V5ICprLAorCQkJICAgc3RydWN0IGNhY2hlX3NldCAqYywKKwkJCSAgIHVpbnQ2NF90IG9mZnNldCwKKwkJCSAgIGludCBzZWN0b3JzKQoreworCWlmIChLRVlfRElSVFkoaykpCisJCWJjYWNoZV9kZXZfc2VjdG9yc19kaXJ0eV9hZGQoYywgS0VZX0lOT0RFKGspLAorCQkJCQkgICAgIG9mZnNldCwgLXNlY3RvcnMpOworfQorCiBzdGF0aWMgYm9vbCBiY2hfZXh0ZW50X2luc2VydF9maXh1cChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwKIAkJCQkgICAgc3RydWN0IGJrZXkgKmluc2VydCwKIAkJCQkgICAgc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCkBAIC0zMTUsMTMgKzMyNSw2IEBACiB7CiAJc3RydWN0IGNhY2hlX3NldCAqYyA9IGNvbnRhaW5lcl9vZihiLCBzdHJ1Y3QgYnRyZWUsIGtleXMpLT5jOwogCi0Jdm9pZCBzdWJ0cmFjdF9kaXJ0eShzdHJ1Y3QgYmtleSAqaywgdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2VjdG9ycykKLQl7Ci0JCWlmIChLRVlfRElSVFkoaykpCi0JCQliY2FjaGVfZGV2X3NlY3RvcnNfZGlydHlfYWRkKGMsIEtFWV9JTk9ERShrKSwKLQkJCQkJCSAgICAgb2Zmc2V0LCAtc2VjdG9ycyk7Ci0JfQotCiAJdWludDY0X3Qgb2xkX29mZnNldDsKIAl1bnNpZ25lZCBvbGRfc2l6ZSwgc2VjdG9yc19mb3VuZCA9IDA7CiAKQEAgLTM5OCw3ICs0MDEsOCBAQAogCiAJCQlzdHJ1Y3QgYmtleSAqdG9wOwogCi0JCQlzdWJ0cmFjdF9kaXJ0eShrLCBLRVlfU1RBUlQoaW5zZXJ0KSwgS0VZX1NJWkUoaW5zZXJ0KSk7CisJCQliY2hfc3VidHJhY3RfZGlydHkoaywgYywgS0VZX1NUQVJUKGluc2VydCksCisJCQkJICAgICAgIEtFWV9TSVpFKGluc2VydCkpOwogCiAJCQlpZiAoYmtleV93cml0dGVuKGIsIGspKSB7CiAJCQkJLyoKQEAgLTQ0OCw3ICs0NTIsNyBAQAogCQkJfQogCQl9CiAKLQkJc3VidHJhY3RfZGlydHkoaywgb2xkX29mZnNldCwgb2xkX3NpemUgLSBLRVlfU0laRShrKSk7CisJCWJjaF9zdWJ0cmFjdF9kaXJ0eShrLCBjLCBvbGRfb2Zmc2V0LCBvbGRfc2l6ZSAtIEtFWV9TSVpFKGspKTsKIAl9CiAKIGNoZWNrX2ZhaWxlZDoKQEAgLTQ5OSw5ICs1MDMsOSBAQAogCiAJaWYgKG11dGV4X3RyeWxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKSkgewogCQlpZiAoYi0+Yy0+Z2NfbWFya192YWxpZCAmJgotCQkgICAgKChHQ19NQVJLKGcpICE9IEdDX01BUktfRElSVFkgJiYKLQkJICAgICAgS0VZX0RJUlRZKGspKSB8fAotCQkgICAgIEdDX01BUksoZykgPT0gR0NfTUFSS19NRVRBREFUQSkpCisJCSAgICAoIUdDX01BUksoZykgfHwKKwkJICAgICBHQ19NQVJLKGcpID09IEdDX01BUktfTUVUQURBVEEgfHwKKwkJICAgICAoR0NfTUFSSyhnKSAhPSBHQ19NQVJLX0RJUlRZICYmIEtFWV9ESVJUWShrKSkpKQogCQkJZ290byBlcnI7CiAKIAkJaWYgKGctPnByaW8gPT0gQlRSRUVfUFJJTykKQEAgLTUxNSw5ICs1MTksOSBAQAogCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOwogCWJjaF9leHRlbnRfdG9fdGV4dChidWYsIHNpemVvZihidWYpLCBrKTsKIAlidHJlZV9idWcoYiwKLSJpbmNvbnNpc3RlbnQgZXh0ZW50IHBvaW50ZXIgJXM6XG5idWNrZXQgJXp1IHBpbiAlaSBwcmlvICVpIGdlbiAlaSBsYXN0X2djICVpIG1hcmsgJWxsdSBnY19nZW4gJWkiLAorImluY29uc2lzdGVudCBleHRlbnQgcG9pbnRlciAlczpcbmJ1Y2tldCAlenUgcGluICVpIHByaW8gJWkgZ2VuICVpIGxhc3RfZ2MgJWkgbWFyayAlbGx1IiwKIAkJICBidWYsIFBUUl9CVUNLRVRfTlIoYi0+YywgaywgcHRyKSwgYXRvbWljX3JlYWQoJmctPnBpbiksCi0JCSAgZy0+cHJpbywgZy0+Z2VuLCBnLT5sYXN0X2djLCBHQ19NQVJLKGcpLCBnLT5nY19nZW4pOworCQkgIGctPnByaW8sIGctPmdlbiwgZy0+bGFzdF9nYywgR0NfTUFSSyhnKSk7CiAJcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuYwppbmRleCAxODAzOWFmLi41OWU4MjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5jCkBAIC0yMzcsOCArMjM3LDE0IEBACiAJCWZvciAoaSA9IDA7IGkgPCBjYS0+c2IubmpvdXJuYWxfYnVja2V0czsgaSsrKQogCQkJaWYgKGphLT5zZXFbaV0gPiBzZXEpIHsKIAkJCQlzZXEgPSBqYS0+c2VxW2ldOwotCQkJCWphLT5jdXJfaWR4ID0gamEtPmRpc2NhcmRfaWR4ID0KLQkJCQkJamEtPmxhc3RfaWR4ID0gaTsKKwkJCQkvKgorCQkJCSAqIFdoZW4gam91cm5hbF9yZWNsYWltKCkgZ29lcyB0byBhbGxvY2F0ZSBmb3IKKwkJCQkgKiB0aGUgZmlyc3QgdGltZSwgaXQnbGwgdXNlIHRoZSBidWNrZXQgYWZ0ZXIKKwkJCQkgKiBqYS0+Y3VyX2lkeAorCQkJCSAqLworCQkJCWphLT5jdXJfaWR4ID0gaTsKKwkJCQlqYS0+bGFzdF9pZHggPSBqYS0+ZGlzY2FyZF9pZHggPSAoaSArIDEpICUKKwkJCQkJY2EtPnNiLm5qb3VybmFsX2J1Y2tldHM7CiAKIAkJCX0KIAl9CkBAIC0yODgsMTYgKzI5NCwxMSBAQAogCQkgICAgIGsgPSBia2V5X25leHQoaykpIHsKIAkJCXVuc2lnbmVkIGo7CiAKLQkJCWZvciAoaiA9IDA7IGogPCBLRVlfUFRSUyhrKTsgaisrKSB7Ci0JCQkJc3RydWN0IGJ1Y2tldCAqZyA9IFBUUl9CVUNLRVQoYywgaywgaik7Ci0JCQkJYXRvbWljX2luYygmZy0+cGluKTsKKwkJCWZvciAoaiA9IDA7IGogPCBLRVlfUFRSUyhrKTsgaisrKQorCQkJCWlmIChwdHJfYXZhaWxhYmxlKGMsIGssIGopKQorCQkJCQlhdG9taWNfaW5jKCZQVFJfQlVDS0VUKGMsIGssIGopLT5waW4pOwogCi0JCQkJaWYgKGctPnByaW8gPT0gQlRSRUVfUFJJTyAmJgotCQkJCSAgICAhcHRyX3N0YWxlKGMsIGssIGopKQotCQkJCQlnLT5wcmlvID0gSU5JVElBTF9QUklPOwotCQkJfQotCi0JCQlfX2JjaF9idHJlZV9tYXJrX2tleShjLCAwLCBrKTsKKwkJCWJjaF9pbml0aWFsX21hcmtfa2V5KGMsIDAsIGspOwogCQl9CiAJfQogfQpAQCAtMzEyLDggKzMxMyw2IEBACiAJdWludDY0X3Qgc3RhcnQgPSBpLT5qLmxhc3Rfc2VxLCBlbmQgPSBpLT5qLnNlcSwgbiA9IHN0YXJ0OwogCXN0cnVjdCBrZXlsaXN0IGtleWxpc3Q7CiAKLQliY2hfa2V5bGlzdF9pbml0KCZrZXlsaXN0KTsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgbGlzdCwgbGlzdCkgewogCQlCVUdfT04oaS0+cGluICYmIGF0b21pY19yZWFkKGktPnBpbikgIT0gMSk7CiAKQEAgLTMyNiw4ICszMjUsNyBAQAogCQkgICAgIGsgPSBia2V5X25leHQoaykpIHsKIAkJCXRyYWNlX2JjYWNoZV9qb3VybmFsX3JlcGxheV9rZXkoayk7CiAKLQkJCWJrZXlfY29weShrZXlsaXN0LnRvcCwgayk7Ci0JCQliY2hfa2V5bGlzdF9wdXNoKCZrZXlsaXN0KTsKKwkJCWJjaF9rZXlsaXN0X2luaXRfc2luZ2xlKCZrZXlsaXN0LCBrKTsKIAogCQkJcmV0ID0gYmNoX2J0cmVlX2luc2VydChzLCAma2V5bGlzdCwgaS0+cGluLCBOVUxMKTsKIAkJCWlmIChyZXQpCkBAIC0zODMsMTYgKzM4MSwxNSBAQAogCiAJYiA9IGJlc3Q7CiAJaWYgKGIpIHsKLQkJcndfbG9jayh0cnVlLCBiLCBiLT5sZXZlbCk7Ci0KKwkJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CiAJCWlmICghYnRyZWVfY3VycmVudF93cml0ZShiKS0+am91cm5hbCkgewotCQkJcndfdW5sb2NrKHRydWUsIGIpOworCQkJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAkJCS8qIFdlIHJhY2VkICovCiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKLQkJYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgTlVMTCk7Ci0JCXJ3X3VubG9jayh0cnVlLCBiKTsKKwkJX19iY2hfYnRyZWVfbm9kZV93cml0ZShiLCBOVUxMKTsKKwkJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAl9CiB9CiAKQEAgLTUzNiw2ICs1MzMsNyBAQAogCWF0b21pY19zZXQoJmZpZm9fYmFjaygmai0+cGluKSwgMSk7CiAKIAlqLT5jdXItPmRhdGEtPnNlcQk9ICsrai0+c2VxOworCWotPmN1ci0+ZGlydHkJCT0gZmFsc2U7CiAJai0+Y3VyLT5uZWVkX3dyaXRlCT0gZmFsc2U7CiAJai0+Y3VyLT5kYXRhLT5rZXlzCT0gMDsKIApAQCAtNzMxLDcgKzcyOSwxMCBAQAogCQkJCQkgICBzdHJ1Y3QgY2FjaGVfc2V0LAogCQkJCQkgICBqb3VybmFsLndvcmspOwogCXNwaW5fbG9jaygmYy0+am91cm5hbC5sb2NrKTsKLQlqb3VybmFsX3RyeV93cml0ZShjKTsKKwlpZiAoYy0+am91cm5hbC5jdXItPmRpcnR5KQorCQlqb3VybmFsX3RyeV93cml0ZShjKTsKKwllbHNlCisJCXNwaW5fdW5sb2NrKCZjLT5qb3VybmFsLmxvY2spOwogfQogCiAvKgpAQCAtNzYxLDcgKzc2Miw4IEBACiAJaWYgKHBhcmVudCkgewogCQljbG9zdXJlX3dhaXQoJnctPndhaXQsIHBhcmVudCk7CiAJCWpvdXJuYWxfdHJ5X3dyaXRlKGMpOwotCX0gZWxzZSBpZiAoIXctPm5lZWRfd3JpdGUpIHsKKwl9IGVsc2UgaWYgKCF3LT5kaXJ0eSkgeworCQl3LT5kaXJ0eSA9IHRydWU7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYy0+am91cm5hbC53b3JrLAogCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoYy0+am91cm5hbF9kZWxheV9tcykpOwogCQlzcGluX3VubG9jaygmYy0+am91cm5hbC5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuaAppbmRleCA5MTgwYzQ0Li5lM2MzOTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5oCkBAIC05NSw2ICs5NSw3IEBACiAKIAlzdHJ1Y3QgY2FjaGVfc2V0CSpjOwogCXN0cnVjdCBjbG9zdXJlX3dhaXRsaXN0CXdhaXQ7CisJYm9vbAkJCWRpcnR5OwogCWJvb2wJCQluZWVkX3dyaXRlOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvbW92aW5nZ2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMKaW5kZXggOWViNjBkMS4uY2Q3NDkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvbW92aW5nZ2MuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jCkBAIC0yNCwxMiArMjQsMTAgQEAKIAkJCQkJICAgbW92aW5nX2djX2tleXMpOwogCXVuc2lnbmVkIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykgewotCQlzdHJ1Y3QgYnVja2V0ICpnID0gUFRSX0JVQ0tFVChjLCBrLCBpKTsKLQotCQlpZiAoR0NfTU9WRShnKSkKKwlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKKwkJaWYgKHB0cl9hdmFpbGFibGUoYywgaywgaSkgJiYKKwkJICAgIEdDX01PVkUoUFRSX0JVQ0tFVChjLCBrLCBpKSkpCiAJCQlyZXR1cm4gdHJ1ZTsKLQl9CiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC0xMTUsNyArMTEzLDcgQEAKIAkJY2xvc3VyZV9jYWxsKCZvcC0+Y2wsIGJjaF9kYXRhX2luc2VydCwgTlVMTCwgY2wpOwogCX0KIAotCWNvbnRpbnVlX2F0KGNsLCB3cml0ZV9tb3ZpbmdfZmluaXNoLCBzeXN0ZW1fd3EpOworCWNvbnRpbnVlX2F0KGNsLCB3cml0ZV9tb3ZpbmdfZmluaXNoLCBvcC0+d3EpOwogfQogCiBzdGF0aWMgdm9pZCByZWFkX21vdmluZ19zdWJtaXQoc3RydWN0IGNsb3N1cmUgKmNsKQpAQCAtMTI1LDcgKzEyMyw3IEBACiAKIAliY2hfc3VibWl0X2JiaW8oYmlvLCBpby0+b3AuYywgJmlvLT53LT5rZXksIDApOwogCi0JY29udGludWVfYXQoY2wsIHdyaXRlX21vdmluZywgc3lzdGVtX3dxKTsKKwljb250aW51ZV9hdChjbCwgd3JpdGVfbW92aW5nLCBpby0+b3Aud3EpOwogfQogCiBzdGF0aWMgdm9pZCByZWFkX21vdmluZyhzdHJ1Y3QgY2FjaGVfc2V0ICpjKQpAQCAtMTYwLDYgKzE1OCw3IEBACiAJCWlvLT53CQk9IHc7CiAJCWlvLT5vcC5pbm9kZQk9IEtFWV9JTk9ERSgmdy0+a2V5KTsKIAkJaW8tPm9wLmMJPSBjOworCQlpby0+b3Aud3EJPSBjLT5tb3ZpbmdfZ2Nfd3E7CiAKIAkJbW92aW5nX2luaXQoaW8pOwogCQliaW8gPSAmaW8tPmJpby5iaW87CkBAIC0yMTYsNyArMjE1LDEwIEBACiAJCWNhLT5oZWFwLnVzZWQgPSAwOwogCiAJCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkgewotCQkJaWYgKCFHQ19TRUNUT1JTX1VTRUQoYikpCisJCQlpZiAoR0NfTUFSSyhiKSA9PSBHQ19NQVJLX01FVEFEQVRBIHx8CisJCQkgICAgIUdDX1NFQ1RPUlNfVVNFRChiKSB8fAorCQkJICAgIEdDX1NFQ1RPUlNfVVNFRChiKSA9PSBjYS0+c2IuYnVja2V0X3NpemUgfHwKKwkJCSAgICBhdG9taWNfcmVhZCgmYi0+cGluKSkKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKCFoZWFwX2Z1bGwoJmNhLT5oZWFwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jCmluZGV4IDVkNWQwMzEuLjE1ZmZmNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmMKQEAgLTEyLDExICsxMiw5IEBACiAjaW5jbHVkZSAicmVxdWVzdC5oIgogI2luY2x1ZGUgIndyaXRlYmFjay5oIgogCi0jaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgImJsay1jZ3JvdXAuaCIKIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9iY2FjaGUuaD4KIApAQCAtMjcsMTcxICsyNSwxMyBAQAogCiBzdGF0aWMgdm9pZCBiY2hfZGF0YV9pbnNlcnRfc3RhcnQoc3RydWN0IGNsb3N1cmUgKik7CiAKLS8qIENncm91cCBpbnRlcmZhY2UgKi8KLQotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi1zdGF0aWMgc3RydWN0IGJjaF9jZ3JvdXAgYmNhY2hlX2RlZmF1bHRfY2dyb3VwID0geyAuY2FjaGVfbW9kZSA9IC0xIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmNoX2Nncm91cCAqY2dyb3VwX3RvX2JjYWNoZShzdHJ1Y3QgY2dyb3VwICpjZ3JvdXApCi17Ci0Jc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKLQlyZXR1cm4gY2dyb3VwICYmCi0JCShjc3MgPSBjZ3JvdXBfc3Vic3lzX3N0YXRlKGNncm91cCwgYmNhY2hlX3N1YnN5c19pZCkpCi0JCT8gY29udGFpbmVyX29mKGNzcywgc3RydWN0IGJjaF9jZ3JvdXAsIGNzcykKLQkJOiAmYmNhY2hlX2RlZmF1bHRfY2dyb3VwOwotfQotCi1zdHJ1Y3QgYmNoX2Nncm91cCAqYmNoX2Jpb190b19jZ3JvdXAoc3RydWN0IGJpbyAqYmlvKQotewotCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MgPSBiaW8tPmJpX2NzcwotCQk/IGNncm91cF9zdWJzeXNfc3RhdGUoYmlvLT5iaV9jc3MtPmNncm91cCwgYmNhY2hlX3N1YnN5c19pZCkKLQkJOiB0YXNrX3N1YnN5c19zdGF0ZShjdXJyZW50LCBiY2FjaGVfc3Vic3lzX2lkKTsKLQotCXJldHVybiBjc3MKLQkJPyBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgYmNoX2Nncm91cCwgY3NzKQotCQk6ICZiY2FjaGVfZGVmYXVsdF9jZ3JvdXA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX21vZGVfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQsCi0JCQlzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyIHRtcFsxMDI0XTsKLQlpbnQgbGVuID0gYmNoX3NucHJpbnRfc3RyaW5nX2xpc3QodG1wLCBQQUdFX1NJWkUsIGJjaF9jYWNoZV9tb2RlcywKLQkJCQkJICBjZ3JvdXBfdG9fYmNhY2hlKGNncnApLT5jYWNoZV9tb2RlICsgMSk7Ci0KLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIGxlbjsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgdG1wLCBsZW4pOwotfQotCi1zdGF0aWMgaW50IGNhY2hlX21vZGVfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0LAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZikKLXsKLQlpbnQgdiA9IGJjaF9yZWFkX3N0cmluZ19saXN0KGJ1ZiwgYmNoX2NhY2hlX21vZGVzKTsKLQlpZiAodiA8IDApCi0JCXJldHVybiB2OwotCi0JY2dyb3VwX3RvX2JjYWNoZShjZ3JwKS0+Y2FjaGVfbW9kZSA9IHYgLSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTY0IGJjaF92ZXJpZnlfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCi17Ci0JcmV0dXJuIGNncm91cF90b19iY2FjaGUoY2dycCktPnZlcmlmeTsKLX0KLQotc3RhdGljIGludCBiY2hfdmVyaWZ5X3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCwgdTY0IHZhbCkKLXsKLQljZ3JvdXBfdG9fYmNhY2hlKGNncnApLT52ZXJpZnkgPSB2YWw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1NjQgYmNoX2NhY2hlX2hpdHNfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCi17Ci0Jc3RydWN0IGJjaF9jZ3JvdXAgKmJjYWNoZWNnID0gY2dyb3VwX3RvX2JjYWNoZShjZ3JwKTsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmJjYWNoZWNnLT5zdGF0cy5jYWNoZV9oaXRzKTsKLX0KLQotc3RhdGljIHU2NCBiY2hfY2FjaGVfbWlzc2VzX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXN0cnVjdCBiY2hfY2dyb3VwICpiY2FjaGVjZyA9IGNncm91cF90b19iY2FjaGUoY2dycCk7Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZiY2FjaGVjZy0+c3RhdHMuY2FjaGVfbWlzc2VzKTsKLX0KLQotc3RhdGljIHU2NCBiY2hfY2FjaGVfYnlwYXNzX2hpdHNfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLAotCQkJCQkgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXN0cnVjdCBiY2hfY2dyb3VwICpiY2FjaGVjZyA9IGNncm91cF90b19iY2FjaGUoY2dycCk7Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZiY2FjaGVjZy0+c3RhdHMuY2FjaGVfYnlwYXNzX2hpdHMpOwotfQotCi1zdGF0aWMgdTY0IGJjaF9jYWNoZV9ieXBhc3NfbWlzc2VzX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwKLQkJCQkJICAgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXN0cnVjdCBiY2hfY2dyb3VwICpiY2FjaGVjZyA9IGNncm91cF90b19iY2FjaGUoY2dycCk7Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZiY2FjaGVjZy0+c3RhdHMuY2FjaGVfYnlwYXNzX21pc3Nlcyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2Z0eXBlIGJjaF9maWxlc1tdID0gewotCXsKLQkJLm5hbWUJCT0gImNhY2hlX21vZGUiLAotCQkucmVhZAkJPSBjYWNoZV9tb2RlX3JlYWQsCi0JCS53cml0ZV9zdHJpbmcJPSBjYWNoZV9tb2RlX3dyaXRlLAotCX0sCi0JewotCQkubmFtZQkJPSAidmVyaWZ5IiwKLQkJLnJlYWRfdTY0CT0gYmNoX3ZlcmlmeV9yZWFkLAotCQkud3JpdGVfdTY0CT0gYmNoX3ZlcmlmeV93cml0ZSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gImNhY2hlX2hpdHMiLAotCQkucmVhZF91NjQJPSBiY2hfY2FjaGVfaGl0c19yZWFkLAotCX0sCi0JewotCQkubmFtZQkJPSAiY2FjaGVfbWlzc2VzIiwKLQkJLnJlYWRfdTY0CT0gYmNoX2NhY2hlX21pc3Nlc19yZWFkLAotCX0sCi0JewotCQkubmFtZQkJPSAiY2FjaGVfYnlwYXNzX2hpdHMiLAotCQkucmVhZF91NjQJPSBiY2hfY2FjaGVfYnlwYXNzX2hpdHNfcmVhZCwKLQl9LAotCXsKLQkJLm5hbWUJCT0gImNhY2hlX2J5cGFzc19taXNzZXMiLAotCQkucmVhZF91NjQJPSBiY2hfY2FjaGVfYnlwYXNzX21pc3Nlc19yZWFkLAotCX0sCi0JeyB9CS8qIHRlcm1pbmF0ZSAqLwotfTsKLQotc3RhdGljIHZvaWQgaW5pdF9iY2hfY2dyb3VwKHN0cnVjdCBiY2hfY2dyb3VwICpjZykKLXsKLQljZy0+Y2FjaGVfbW9kZSA9IC0xOwotfQotCi1zdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmJjYWNoZWNnX2NyZWF0ZShzdHJ1Y3QgY2dyb3VwICpjZ3JvdXApCi17Ci0Jc3RydWN0IGJjaF9jZ3JvdXAgKmNnOwotCi0JY2cgPSBremFsbG9jKHNpemVvZigqY2cpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNnKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlpbml0X2JjaF9jZ3JvdXAoY2cpOwotCXJldHVybiAmY2ctPmNzczsKLX0KLQotc3RhdGljIHZvaWQgYmNhY2hlY2dfZGVzdHJveShzdHJ1Y3QgY2dyb3VwICpjZ3JvdXApCi17Ci0Jc3RydWN0IGJjaF9jZ3JvdXAgKmNnID0gY2dyb3VwX3RvX2JjYWNoZShjZ3JvdXApOwotCWtmcmVlKGNnKTsKLX0KLQotc3RydWN0IGNncm91cF9zdWJzeXMgYmNhY2hlX3N1YnN5cyA9IHsKLQkuY3JlYXRlCQk9IGJjYWNoZWNnX2NyZWF0ZSwKLQkuZGVzdHJveQk9IGJjYWNoZWNnX2Rlc3Ryb3ksCi0JLnN1YnN5c19pZAk9IGJjYWNoZV9zdWJzeXNfaWQsCi0JLm5hbWUJCT0gImJjYWNoZSIsCi0JLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChiY2FjaGVfc3Vic3lzKTsKLSNlbmRpZgotCiBzdGF0aWMgdW5zaWduZWQgY2FjaGVfbW9kZShzdHJ1Y3QgY2FjaGVkX2RldiAqZGMsIHN0cnVjdCBiaW8gKmJpbykKIHsKLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotCWludCByID0gYmNoX2Jpb190b19jZ3JvdXAoYmlvKS0+Y2FjaGVfbW9kZTsKLQlpZiAociA+PSAwKQotCQlyZXR1cm4gcjsKLSNlbmRpZgogCXJldHVybiBCREVWX0NBQ0hFX01PREUoJmRjLT5zYik7CiB9CiAKIHN0YXRpYyBib29sIHZlcmlmeShzdHJ1Y3QgY2FjaGVkX2RldiAqZGMsIHN0cnVjdCBiaW8gKmJpbykKIHsKLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotCWlmIChiY2hfYmlvX3RvX2Nncm91cChiaW8pLT52ZXJpZnkpCi0JCXJldHVybiB0cnVlOwotI2VuZGlmCiAJcmV0dXJuIGRjLT52ZXJpZnk7CiB9CiAKQEAgLTI0OCw3ICs4OCw3IEBACiAJCWF0b21pY19kZWNfYnVnKGpvdXJuYWxfcmVmKTsKIAogCWlmICghb3AtPmluc2VydF9kYXRhX2RvbmUpCi0JCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfc3RhcnQsIGJjYWNoZV93cSk7CisJCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfc3RhcnQsIG9wLT53cSk7CiAKIAliY2hfa2V5bGlzdF9mcmVlKCZvcC0+aW5zZXJ0X2tleXMpOwogCWNsb3N1cmVfcmV0dXJuKGNsKTsKQEAgLTI5Nyw3ICsxMzcsNyBAQAogCW9wLT5pbnNlcnRfZGF0YV9kb25lID0gdHJ1ZTsKIAliaW9fcHV0KGJpbyk7CiBvdXQ6Ci0JY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBiY2FjaGVfd3EpOworCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgb3AtPndxKTsKIH0KIAogc3RhdGljIHZvaWQgYmNoX2RhdGFfaW5zZXJ0X2Vycm9yKHN0cnVjdCBjbG9zdXJlICpjbCkKQEAgLTM0MCw3ICsxODAsNyBAQAogCQlpZiAob3AtPndyaXRlYmFjaykKIAkJCW9wLT5lcnJvciA9IGVycm9yOwogCQllbHNlIGlmICghb3AtPnJlcGxhY2UpCi0JCQlzZXRfY2xvc3VyZV9mbihjbCwgYmNoX2RhdGFfaW5zZXJ0X2Vycm9yLCBiY2FjaGVfd3EpOworCQkJc2V0X2Nsb3N1cmVfZm4oY2wsIGJjaF9kYXRhX2luc2VydF9lcnJvciwgb3AtPndxKTsKIAkJZWxzZQogCQkJc2V0X2Nsb3N1cmVfZm4oY2wsIE5VTEwsIE5VTEwpOwogCX0KQEAgLTM3Niw3ICsyMTYsNyBAQAogCQlpZiAoYmNoX2tleWxpc3RfcmVhbGxvYygmb3AtPmluc2VydF9rZXlzLAogCQkJCQkzICsgKG9wLT5jc3VtID8gMSA6IDApLAogCQkJCQlvcC0+YykpCi0JCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIGJjYWNoZV93cSk7CisJCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIG9wLT53cSk7CiAKIAkJayA9IG9wLT5pbnNlcnRfa2V5cy50b3A7CiAJCWJrZXlfaW5pdChrKTsKQEAgLTQxMyw3ICsyNTMsNyBAQAogCX0gd2hpbGUgKG4gIT0gYmlvKTsKIAogCW9wLT5pbnNlcnRfZGF0YV9kb25lID0gdHJ1ZTsKLQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIGJjYWNoZV93cSk7CisJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBvcC0+d3EpOwogZXJyOgogCS8qIGJjaF9hbGxvY19zZWN0b3JzKCkgYmxvY2tzIGlmIHMtPndyaXRlYmFjayA9IHRydWUgKi8KIAlCVUdfT04ob3AtPndyaXRlYmFjayk7CkBAIC00NDIsNyArMjgyLDcgQEAKIAkJYmlvX3B1dChiaW8pOwogCiAJCWlmICghYmNoX2tleWxpc3RfZW1wdHkoJm9wLT5pbnNlcnRfa2V5cykpCi0JCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIGJjYWNoZV93cSk7CisJCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIG9wLT53cSk7CiAJCWVsc2UKIAkJCWNsb3N1cmVfcmV0dXJuKGNsKTsKIAl9CkBAIC04MjQsNiArNjY0LDcgQEAKIAlzLT5pb3AuZXJyb3IJCT0gMDsKIAlzLT5pb3AuZmxhZ3MJCT0gMDsKIAlzLT5pb3AuZmx1c2hfam91cm5hbAk9IChiaW8tPmJpX3J3ICYgKFJFUV9GTFVTSHxSRVFfRlVBKSkgIT0gMDsKKwlzLT5pb3Aud3EJCT0gYmNhY2hlX3dxOwogCiAJcmV0dXJuIHM7CiB9CkBAIC0xMjAzLDIyICsxMDQ0LDEzIEBACiBzdGF0aWMgaW50IGZsYXNoX2Rldl9jYWNoZV9taXNzKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IHNlYXJjaCAqcywKIAkJCQlzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIHNlY3RvcnMpCiB7Ci0Jc3RydWN0IGJpb192ZWMgYnY7Ci0Jc3RydWN0IGJ2ZWNfaXRlciBpdGVyOworCXVuc2lnbmVkIGJ5dGVzID0gbWluKHNlY3RvcnMsIGJpb19zZWN0b3JzKGJpbykpIDw8IDk7CiAKLQkvKiBaZXJvIGZpbGwgYmlvICovCisJc3dhcChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwgYnl0ZXMpOworCXplcm9fZmlsbF9iaW8oYmlvKTsKKwlzd2FwKGJpby0+YmlfaXRlci5iaV9zaXplLCBieXRlcyk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyKSB7Ci0JCXVuc2lnbmVkIGogPSBtaW4oYnYuYnZfbGVuID4+IDksIHNlY3RvcnMpOwotCi0JCXZvaWQgKnAgPSBrbWFwKGJ2LmJ2X3BhZ2UpOwotCQltZW1zZXQocCArIGJ2LmJ2X29mZnNldCwgMCwgaiA8PCA5KTsKLQkJa3VubWFwKGJ2LmJ2X3BhZ2UpOwotCi0JCXNlY3RvcnMJLT0gajsKLQl9Ci0KLQliaW9fYWR2YW5jZShiaW8sIG1pbihzZWN0b3JzIDw8IDksIGJpby0+YmlfaXRlci5iaV9zaXplKSk7CisJYmlvX2FkdmFuY2UoYmlvLCBieXRlcyk7CiAKIAlpZiAoIWJpby0+YmlfaXRlci5iaV9zaXplKQogCQlyZXR1cm4gTUFQX0RPTkU7CkBAIC0xMzEzLDkgKzExNDUsNiBAQAogCiB2b2lkIGJjaF9yZXF1ZXN0X2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotCWNncm91cF91bmxvYWRfc3Vic3lzKCZiY2FjaGVfc3Vic3lzKTsKLSNlbmRpZgogCWlmIChiY2hfc2VhcmNoX2NhY2hlKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koYmNoX3NlYXJjaF9jYWNoZSk7CiB9CkBAIC0xMzI2LDExICsxMTU1LDUgQEAKIAlpZiAoIWJjaF9zZWFyY2hfY2FjaGUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLQljZ3JvdXBfbG9hZF9zdWJzeXMoJmJjYWNoZV9zdWJzeXMpOwotCWluaXRfYmNoX2Nncm91cCgmYmNhY2hlX2RlZmF1bHRfY2dyb3VwKTsKLQotCWNncm91cF9hZGRfY2Z0eXBlcygmYmNhY2hlX3N1YnN5cywgYmNoX2ZpbGVzKTsKLSNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5oIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5oCmluZGV4IDM5ZjIxZGIuLjFmZjM2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmgKQEAgLTEsMTIgKzEsMTEgQEAKICNpZm5kZWYgX0JDQUNIRV9SRVFVRVNUX0hfCiAjZGVmaW5lIF9CQ0FDSEVfUkVRVUVTVF9IXwogCi0jaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+Ci0KIHN0cnVjdCBkYXRhX2luc2VydF9vcCB7CiAJc3RydWN0IGNsb3N1cmUJCWNsOwogCXN0cnVjdCBjYWNoZV9zZXQJKmM7CiAJc3RydWN0IGJpbwkJKmJpbzsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAKIAl1bnNpZ25lZAkJaW5vZGU7CiAJdWludDE2X3QJCXdyaXRlX3BvaW50OwpAQCAtNDEsMjAgKzQwLDQgQEAKIAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpiY2hfc2VhcmNoX2NhY2hlLCAqYmNoX3Bhc3N0aHJvdWdoX2NhY2hlOwogCi1zdHJ1Y3QgYmNoX2Nncm91cCB7Ci0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZQljc3M7Ci0jZW5kaWYKLQkvKgotCSAqIFdlIHN1YnRyYWN0IG9uZSBmcm9tIHRoZSBpbmRleCBpbnRvIGJjaF9jYWNoZV9tb2Rlc1tdLCBzbyB0aGF0Ci0JICogZGVmYXVsdCA9PSAtMTsgdGhpcyBtYWtlcyBpdCBzbyB0aGUgcmVzdCBtYXRjaCB1cCB3aXRoIGQtPmNhY2hlX21vZGUsCi0JICogYW5kIHdlIHVzZSBkLT5jYWNoZV9tb2RlIGlmIGNncnAtPmNhY2hlX21vZGUgPCAwCi0JICovCi0Jc2hvcnQJCQkJY2FjaGVfbW9kZTsKLQlib29sCQkJCXZlcmlmeTsKLQlzdHJ1Y3QgY2FjaGVfc3RhdF9jb2xsZWN0b3IJc3RhdHM7Ci19OwotCi1zdHJ1Y3QgYmNoX2Nncm91cCAqYmNoX2Jpb190b19jZ3JvdXAoc3RydWN0IGJpbyAqYmlvKTsKLQogI2VuZGlmIC8qIF9CQ0FDSEVfUkVRVUVTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvc3RhdHMuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N0YXRzLmMKaW5kZXggODRkMDc4Mi4uMGNhMDcyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvc3RhdHMuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9zdGF0cy5jCkBAIC0yMDEsOSArMjAxLDYgQEAKIAlzdHJ1Y3QgY2FjaGVkX2RldiAqZGMgPSBjb250YWluZXJfb2YoZCwgc3RydWN0IGNhY2hlZF9kZXYsIGRpc2spOwogCW1hcmtfY2FjaGVfc3RhdHMoJmRjLT5hY2NvdW50aW5nLmNvbGxlY3RvciwgaGl0LCBieXBhc3MpOwogCW1hcmtfY2FjaGVfc3RhdHMoJmMtPmFjY291bnRpbmcuY29sbGVjdG9yLCBoaXQsIGJ5cGFzcyk7Ci0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLQltYXJrX2NhY2hlX3N0YXRzKCYoYmNoX2Jpb190b19jZ3JvdXAocy0+b3JpZ19iaW8pLT5zdGF0cyksIGhpdCwgYnlwYXNzKTsKLSNlbmRpZgogfQogCiB2b2lkIGJjaF9tYXJrX2NhY2hlX3JlYWRhaGVhZChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYmNhY2hlX2RldmljZSAqZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jCmluZGV4IDI0YTNhMTUuLjkyNmRlZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYwpAQCAtNTQxLDkgKzU0MSw2IEBACiAJY2xvc3VyZV9zeW5jKGNsKTsKIH0KIAotI2RlZmluZSBidWNrZXRzX2ZyZWUoYykJImZyZWUgJXp1LCBmcmVlX2luYyAlenUsIHVudXNlZCAlenUiLAkJXAotCWZpZm9fdXNlZCgmYy0+ZnJlZSksIGZpZm9fdXNlZCgmYy0+ZnJlZV9pbmMpLCBmaWZvX3VzZWQoJmMtPnVudXNlZCkKLQogdm9pZCBiY2hfcHJpb193cml0ZShzdHJ1Y3QgY2FjaGUgKmNhKQogewogCWludCBpOwpAQCAtNTU0LDEwICs1NTEsNiBAQAogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2EtPnNldC0+YnVja2V0X2xvY2spOwogCi0JZm9yIChiID0gY2EtPmJ1Y2tldHM7Ci0JICAgICBiIDwgY2EtPmJ1Y2tldHMgKyBjYS0+c2IubmJ1Y2tldHM7IGIrKykKLQkJYi0+ZGlza19nZW4gPSBiLT5nZW47Ci0KIAljYS0+ZGlza19idWNrZXRzLT5zZXErKzsKIAogCWF0b21pY19sb25nX2FkZChjYS0+c2IuYnVja2V0X3NpemUgKiBwcmlvX2J1Y2tldHMoY2EpLApAQCAtNjAxLDE0ICs1OTQsMTcgQEAKIAogCW11dGV4X2xvY2soJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKIAotCWNhLT5uZWVkX3NhdmVfcHJpbyA9IDA7Ci0KIAkvKgogCSAqIERvbid0IHdhbnQgdGhlIG9sZCBwcmlvcml0aWVzIHRvIGdldCBnYXJiYWdlIGNvbGxlY3RlZCB1bnRpbCBhZnRlciB3ZQogCSAqIGZpbmlzaCB3cml0aW5nIHRoZSBuZXcgb25lcywgYW5kIHRoZXkncmUgam91cm5hbGxlZAogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwcmlvX2J1Y2tldHMoY2EpOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHByaW9fYnVja2V0cyhjYSk7IGkrKykgeworCQlpZiAoY2EtPnByaW9fbGFzdF9idWNrZXRzW2ldKQorCQkJX19iY2hfYnVja2V0X2ZyZWUoY2EsCisJCQkJJmNhLT5idWNrZXRzW2NhLT5wcmlvX2xhc3RfYnVja2V0c1tpXV0pOworCiAJCWNhLT5wcmlvX2xhc3RfYnVja2V0c1tpXSA9IGNhLT5wcmlvX2J1Y2tldHNbaV07CisJfQogfQogCiBzdGF0aWMgdm9pZCBwcmlvX3JlYWQoc3RydWN0IGNhY2hlICpjYSwgdWludDY0X3QgYnVja2V0KQpAQCAtNjM5LDcgKzYzNSw3IEBACiAJCX0KIAogCQliLT5wcmlvID0gbGUxNl90b19jcHUoZC0+cHJpbyk7Ci0JCWItPmdlbiA9IGItPmRpc2tfZ2VuID0gYi0+bGFzdF9nYyA9IGItPmdjX2dlbiA9IGQtPmdlbjsKKwkJYi0+Z2VuID0gYi0+bGFzdF9nYyA9IGQtPmdlbjsKIAl9CiB9CiAKQEAgLTg0Myw2ICs4MzksNyBAQAogCXEtPmxpbWl0cy5tYXhfc2VnbWVudF9zaXplCT0gVUlOVF9NQVg7CiAJcS0+bGltaXRzLm1heF9zZWdtZW50cwkJPSBCSU9fTUFYX1BBR0VTOwogCXEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzCT0gVUlOVF9NQVg7CisJcS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkJPSA1MTI7CiAJcS0+bGltaXRzLmlvX21pbgkJPSBibG9ja19zaXplOwogCXEtPmxpbWl0cy5sb2dpY2FsX2Jsb2NrX3NpemUJPSBibG9ja19zaXplOwogCXEtPmxpbWl0cy5waHlzaWNhbF9ibG9ja19zaXplCT0gYmxvY2tfc2l6ZTsKQEAgLTEzNTUsNiArMTM1Miw4IEBACiAJYmNoX2JzZXRfc29ydF9zdGF0ZV9mcmVlKCZjLT5zb3J0KTsKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBjLT51dWlkcywgaWxvZzIoYnVja2V0X3BhZ2VzKGMpKSk7CiAKKwlpZiAoYy0+bW92aW5nX2djX3dxKQorCQlkZXN0cm95X3dvcmtxdWV1ZShjLT5tb3ZpbmdfZ2Nfd3EpOwogCWlmIChjLT5iaW9fc3BsaXQpCiAJCWJpb3NldF9mcmVlKGMtPmJpb19zcGxpdCk7CiAJaWYgKGMtPmZpbGxfaXRlcikKQEAgLTEzOTUsMTQgKzEzOTQsMjEgQEAKIAkJbGlzdF9hZGQoJmMtPnJvb3QtPmxpc3QsICZjLT5idHJlZV9jYWNoZSk7CiAKIAkvKiBTaG91bGQgc2tpcCB0aGlzIGlmIHdlJ3JlIHVucmVnaXN0ZXJpbmcgYmVjYXVzZSBvZiBhbiBlcnJvciAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJmMtPmJ0cmVlX2NhY2hlLCBsaXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJmMtPmJ0cmVlX2NhY2hlLCBsaXN0KSB7CisJCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOwogCQlpZiAoYnRyZWVfbm9kZV9kaXJ0eShiKSkKLQkJCWJjaF9idHJlZV9ub2RlX3dyaXRlKGIsIE5VTEwpOworCQkJX19iY2hfYnRyZWVfbm9kZV93cml0ZShiLCBOVUxMKTsKKwkJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKKwl9CiAKIAlmb3JfZWFjaF9jYWNoZShjYSwgYywgaSkKIAkJaWYgKGNhLT5hbGxvY190aHJlYWQpCiAJCQlrdGhyZWFkX3N0b3AoY2EtPmFsbG9jX3RocmVhZCk7CiAKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmMtPmpvdXJuYWwud29yayk7CisJLyogZmx1c2ggbGFzdCBqb3VybmFsIGVudHJ5IGlmIG5lZWRlZCAqLworCWMtPmpvdXJuYWwud29yay53b3JrLmZ1bmMoJmMtPmpvdXJuYWwud29yay53b3JrKTsKKwogCWNsb3N1cmVfcmV0dXJuKGNsKTsKIH0KIApAQCAtMTQ4NSwxNCArMTQ5MSwxMyBAQAogCiAJc2VtYV9pbml0KCZjLT5zYl93cml0ZV9tdXRleCwgMSk7CiAJbXV0ZXhfaW5pdCgmYy0+YnVja2V0X2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPnRyeV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT5idHJlZV9jYWNoZV93YWl0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT5idWNrZXRfd2FpdCk7CiAJc2VtYV9pbml0KCZjLT51dWlkX3dyaXRlX211dGV4LCAxKTsKIAogCXNwaW5fbG9ja19pbml0KCZjLT5idHJlZV9nY190aW1lLmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZjLT5idHJlZV9zcGxpdF90aW1lLmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZjLT5idHJlZV9yZWFkX3RpbWUubG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmMtPnRyeV9oYXJkZXJfdGltZS5sb2NrKTsKIAogCWJjaF9tb3ZpbmdfaW5pdF9jYWNoZV9zZXQoYyk7CiAKQEAgLTE1MTcsNiArMTUyMiw3IEBACiAJICAgICEoYy0+ZmlsbF9pdGVyID0gbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKDEsIGl0ZXJfc2l6ZSkpIHx8CiAJICAgICEoYy0+YmlvX3NwbGl0ID0gYmlvc2V0X2NyZWF0ZSg0LCBvZmZzZXRvZihzdHJ1Y3QgYmJpbywgYmlvKSkpIHx8CiAJICAgICEoYy0+dXVpZHMgPSBhbGxvY19idWNrZXRfcGFnZXMoR0ZQX0tFUk5FTCwgYykpIHx8CisJICAgICEoYy0+bW92aW5nX2djX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYmNhY2hlX2djIikpIHx8CiAJICAgIGJjaF9qb3VybmFsX2FsbG9jKGMpIHx8CiAJICAgIGJjaF9idHJlZV9jYWNoZV9hbGxvYyhjKSB8fAogCSAgICBiY2hfb3Blbl9idWNrZXRzX2FsbG9jKGMpIHx8CkBAIC0xNTgwLDcgKzE1ODYsNyBAQAogCQkJZ290byBlcnI7CiAKIAkJZXJyID0gImVycm9yIHJlYWRpbmcgYnRyZWUgcm9vdCI7Ci0JCWMtPnJvb3QgPSBiY2hfYnRyZWVfbm9kZV9nZXQoYywgaywgai0+YnRyZWVfbGV2ZWwsIHRydWUpOworCQljLT5yb290ID0gYmNoX2J0cmVlX25vZGVfZ2V0KGMsIE5VTEwsIGssIGotPmJ0cmVlX2xldmVsLCB0cnVlKTsKIAkJaWYgKElTX0VSUl9PUl9OVUxMKGMtPnJvb3QpKQogCQkJZ290byBlcnI7CiAKQEAgLTE1OTYsNyArMTYwMiw3IEBACiAJCQlnb3RvIGVycjsKIAogCQliY2hfam91cm5hbF9tYXJrKGMsICZqb3VybmFsKTsKLQkJYmNoX2J0cmVlX2djX2ZpbmlzaChjKTsKKwkJYmNoX2luaXRpYWxfZ2NfZmluaXNoKGMpOwogCQlwcl9kZWJ1ZygiYnRyZWVfY2hlY2soKSBkb25lIik7CiAKIAkJLyoKQEAgLTE2MzgsNyArMTY0NCw3IEBACiAJCQkJY2EtPnNiLmRbal0gPSBjYS0+c2IuZmlyc3RfYnVja2V0ICsgajsKIAkJfQogCi0JCWJjaF9idHJlZV9nY19maW5pc2goYyk7CisJCWJjaF9pbml0aWFsX2djX2ZpbmlzaChjKTsKIAogCQllcnIgPSAiZXJyb3Igc3RhcnRpbmcgYWxsb2NhdG9yIHRocmVhZCI7CiAJCWZvcl9lYWNoX2NhY2hlKGNhLCBjLCBpKQpAQCAtMTY1NSwxMiArMTY2MSwxNCBAQAogCQkJZ290byBlcnI7CiAKIAkJZXJyID0gImNhbm5vdCBhbGxvY2F0ZSBuZXcgYnRyZWUgcm9vdCI7Ci0JCWMtPnJvb3QgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhjLCAwLCB0cnVlKTsKKwkJYy0+cm9vdCA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGMsIE5VTEwsIDApOwogCQlpZiAoSVNfRVJSX09SX05VTEwoYy0+cm9vdCkpCiAJCQlnb3RvIGVycjsKIAorCQltdXRleF9sb2NrKCZjLT5yb290LT53cml0ZV9sb2NrKTsKIAkJYmtleV9jb3B5X2tleSgmYy0+cm9vdC0+a2V5LCAmTUFYX0tFWSk7CiAJCWJjaF9idHJlZV9ub2RlX3dyaXRlKGMtPnJvb3QsICZjbCk7CisJCW11dGV4X3VubG9jaygmYy0+cm9vdC0+d3JpdGVfbG9jayk7CiAKIAkJYmNoX2J0cmVlX3NldF9yb290KGMtPnJvb3QpOwogCQlyd191bmxvY2sodHJ1ZSwgYy0+cm9vdCk7CkBAIC0xNzgyLDcgKzE3OTAsNiBAQAogCXZmcmVlKGNhLT5idWNrZXRzKTsKIAogCWZyZWVfaGVhcCgmY2EtPmhlYXApOwotCWZyZWVfZmlmbygmY2EtPnVudXNlZCk7CiAJZnJlZV9maWZvKCZjYS0+ZnJlZV9pbmMpOwogCiAJZm9yIChpID0gMDsgaSA8IFJFU0VSVkVfTlI7IGkrKykKQEAgLTE4MTksNyArMTgyNiw2IEBACiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlW1JFU0VSVkVfTU9WSU5HR0NdLCBmcmVlLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhaW5pdF9maWZvKCZjYS0+ZnJlZVtSRVNFUlZFX05PTkVdLCBmcmVlLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhaW5pdF9maWZvKCZjYS0+ZnJlZV9pbmMsCWZyZWUgPDwgMiwgR0ZQX0tFUk5FTCkgfHwKLQkgICAgIWluaXRfZmlmbygmY2EtPnVudXNlZCwJZnJlZSA8PCAyLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhaW5pdF9oZWFwKCZjYS0+aGVhcCwJZnJlZSA8PCAzLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhKGNhLT5idWNrZXRzCT0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGJ1Y2tldCkgKgogCQkJCQkgIGNhLT5zYi5uYnVja2V0cykpIHx8CkBAIC0xODM0LDEzICsxODQwLDcgQEAKIAlmb3JfZWFjaF9idWNrZXQoYiwgY2EpCiAJCWF0b21pY19zZXQoJmItPnBpbiwgMCk7CiAKLQlpZiAoYmNoX2NhY2hlX2FsbG9jYXRvcl9pbml0KGNhKSkKLQkJZ290byBlcnI7Ci0KIAlyZXR1cm4gMDsKLWVycjoKLQlrb2JqZWN0X3B1dCgmY2EtPmtvYmopOwotCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCByZWdpc3Rlcl9jYWNoZShzdHJ1Y3QgY2FjaGVfc2IgKnNiLCBzdHJ1Y3QgcGFnZSAqc2JfcGFnZSwKQEAgLTE4NjksNyArMTg2OSwxMCBAQAogCWlmIChrb2JqZWN0X2FkZCgmY2EtPmtvYmosICZwYXJ0X3RvX2RldihiZGV2LT5iZF9wYXJ0KS0+a29iaiwgImJjYWNoZSIpKQogCQlnb3RvIGVycjsKIAorCW11dGV4X2xvY2soJmJjaF9yZWdpc3Rlcl9sb2NrKTsKIAllcnIgPSByZWdpc3Rlcl9jYWNoZV9zZXQoY2EpOworCW11dGV4X3VubG9jaygmYmNoX3JlZ2lzdGVyX2xvY2spOworCiAJaWYgKGVycikKIAkJZ290byBlcnI7CiAKQEAgLTE5MzEsOCArMTkzNCw2IEBACiAJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCiAJCXJldHVybiAtRUJVU1k7CiAKLQltdXRleF9sb2NrKCZiY2hfcmVnaXN0ZXJfbG9jayk7Ci0KIAlpZiAoIShwYXRoID0ga3N0cm5kdXAoYnVmZmVyLCBzaXplLCBHRlBfS0VSTkVMKSkgfHwKIAkgICAgIShzYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjYWNoZV9zYiksIEdGUF9LRVJORUwpKSkKIAkJZ290byBlcnI7CkBAIC0xOTY1LDcgKzE5NjYsOSBAQAogCQlpZiAoIWRjKQogCQkJZ290byBlcnJfY2xvc2U7CiAKKwkJbXV0ZXhfbG9jaygmYmNoX3JlZ2lzdGVyX2xvY2spOwogCQlyZWdpc3Rlcl9iZGV2KHNiLCBzYl9wYWdlLCBiZGV2LCBkYyk7CisJCW11dGV4X3VubG9jaygmYmNoX3JlZ2lzdGVyX2xvY2spOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBjYWNoZSAqY2EgPSBremFsbG9jKHNpemVvZigqY2EpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjYSkKQEAgLTE5NzgsNyArMTk4MSw2IEBACiAJCXB1dF9wYWdlKHNiX3BhZ2UpOwogCWtmcmVlKHNiKTsKIAlrZnJlZShwYXRoKTsKLQltdXRleF91bmxvY2soJmJjaF9yZWdpc3Rlcl9sb2NrKTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gcmV0OwogCkBAIC0yMDU3LDcgKzIwNTksNiBAQAogewogCWJjaF9kZWJ1Z19leGl0KCk7CiAJYmNoX3JlcXVlc3RfZXhpdCgpOwotCWJjaF9idHJlZV9leGl0KCk7CiAJaWYgKGJjYWNoZV9rb2JqKQogCQlrb2JqZWN0X3B1dChiY2FjaGVfa29iaik7CiAJaWYgKGJjYWNoZV93cSkKQEAgLTIwODcsNyArMjA4OCw2IEBACiAJaWYgKCEoYmNhY2hlX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYmNhY2hlIikpIHx8CiAJICAgICEoYmNhY2hlX2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJiY2FjaGUiLCBmc19rb2JqKSkgfHwKIAkgICAgc3lzZnNfY3JlYXRlX2ZpbGVzKGJjYWNoZV9rb2JqLCBmaWxlcykgfHwKLQkgICAgYmNoX2J0cmVlX2luaXQoKSB8fAogCSAgICBiY2hfcmVxdWVzdF9pbml0KCkgfHwKIAkgICAgYmNoX2RlYnVnX2luaXQoYmNhY2hlX2tvYmopKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3N5c2ZzLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9zeXNmcy5jCmluZGV4IGQ4NDU4ZDQuLmIzZmY1N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvc3lzZnMuYwpAQCAtNTQsNyArNTQsNiBAQAogc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGUoYnRyZWVfc3BsaXQsIHNlYywgdXMpOwogc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGUoYnRyZWVfc29ydCwJbXMsICB1cyk7CiBzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZShidHJlZV9yZWFkLAltcywgIHVzKTsKLXN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlKHRyeV9oYXJkZXIsCW1zLCAgdXMpOwogCiByZWFkX2F0dHJpYnV0ZShidHJlZV9ub2Rlcyk7CiByZWFkX2F0dHJpYnV0ZShidHJlZV91c2VkX3BlcmNlbnQpOwpAQCAtNDA2LDcgKzQwNSw3IEBACiAJc3RydWN0IGJzZXRfc3RhdHMgc3RhdHM7CiB9OwogCi1zdGF0aWMgaW50IGJ0cmVlX2JzZXRfc3RhdHMoc3RydWN0IGJ0cmVlX29wICpiX29wLCBzdHJ1Y3QgYnRyZWUgKmIpCitzdGF0aWMgaW50IGJjaF9idHJlZV9ic2V0X3N0YXRzKHN0cnVjdCBidHJlZV9vcCAqYl9vcCwgc3RydWN0IGJ0cmVlICpiKQogewogCXN0cnVjdCBic2V0X3N0YXRzX29wICpvcCA9IGNvbnRhaW5lcl9vZihiX29wLCBzdHJ1Y3QgYnNldF9zdGF0c19vcCwgb3ApOwogCkBAIC00MjQsNyArNDIzLDcgQEAKIAltZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKIAliY2hfYnRyZWVfb3BfaW5pdCgmb3Aub3AsIC0xKTsKIAotCXJldCA9IGJjaF9idHJlZV9tYXBfbm9kZXMoJm9wLm9wLCBjLCAmWkVST19LRVksIGJ0cmVlX2JzZXRfc3RhdHMpOworCXJldCA9IGJjaF9idHJlZV9tYXBfbm9kZXMoJm9wLm9wLCBjLCAmWkVST19LRVksIGJjaF9idHJlZV9ic2V0X3N0YXRzKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDQyLDgxICs0NDEsODEgQEAKIAkJCW9wLnN0YXRzLmZsb2F0cywgb3Auc3RhdHMuZmFpbGVkKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGJjaF9yb290X3VzYWdlKHN0cnVjdCBjYWNoZV9zZXQgKmMpCit7CisJdW5zaWduZWQgYnl0ZXMgPSAwOworCXN0cnVjdCBia2V5ICprOworCXN0cnVjdCBidHJlZSAqYjsKKwlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOworCisJZ290byBsb2NrX3Jvb3Q7CisKKwlkbyB7CisJCXJ3X3VubG9jayhmYWxzZSwgYik7Citsb2NrX3Jvb3Q6CisJCWIgPSBjLT5yb290OworCQlyd19sb2NrKGZhbHNlLCBiLCBiLT5sZXZlbCk7CisJfSB3aGlsZSAoYiAhPSBjLT5yb290KTsKKworCWZvcl9lYWNoX2tleV9maWx0ZXIoJmItPmtleXMsIGssICZpdGVyLCBiY2hfcHRyX2JhZCkKKwkJYnl0ZXMgKz0gYmtleV9ieXRlcyhrKTsKKworCXJ3X3VubG9jayhmYWxzZSwgYik7CisKKwlyZXR1cm4gKGJ5dGVzICogMTAwKSAvIGJ0cmVlX2J5dGVzKGMpOworfQorCitzdGF0aWMgc2l6ZV90IGJjaF9jYWNoZV9zaXplKHN0cnVjdCBjYWNoZV9zZXQgKmMpCit7CisJc2l6ZV90IHJldCA9IDA7CisJc3RydWN0IGJ0cmVlICpiOworCisJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJmMtPmJ0cmVlX2NhY2hlLCBsaXN0KQorCQlyZXQgKz0gMSA8PCAoYi0+a2V5cy5wYWdlX29yZGVyICsgUEFHRV9TSElGVCk7CisKKwltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgYmNoX2NhY2hlX21heF9jaGFpbihzdHJ1Y3QgY2FjaGVfc2V0ICpjKQoreworCXVuc2lnbmVkIHJldCA9IDA7CisJc3RydWN0IGhsaXN0X2hlYWQgKmg7CisKKwltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7CisKKwlmb3IgKGggPSBjLT5idWNrZXRfaGFzaDsKKwkgICAgIGggPCBjLT5idWNrZXRfaGFzaCArICgxIDw8IEJVQ0tFVF9IQVNIX0JJVFMpOworCSAgICAgaCsrKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcDsKKworCQlobGlzdF9mb3JfZWFjaChwLCBoKQorCQkJaSsrOworCisJCXJldCA9IG1heChyZXQsIGkpOworCX0KKworCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBiY2hfYnRyZWVfdXNlZChzdHJ1Y3QgY2FjaGVfc2V0ICpjKQoreworCXJldHVybiBkaXY2NF91NjQoYy0+Z2Nfc3RhdHMua2V5X2J5dGVzICogMTAwLAorCQkJIChjLT5nY19zdGF0cy5ub2RlcyA/OiAxKSAqIGJ0cmVlX2J5dGVzKGMpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGJjaF9hdmVyYWdlX2tleV9zaXplKHN0cnVjdCBjYWNoZV9zZXQgKmMpCit7CisJcmV0dXJuIGMtPmdjX3N0YXRzLm5rZXlzCisJCT8gZGl2NjRfdTY0KGMtPmdjX3N0YXRzLmRhdGEsIGMtPmdjX3N0YXRzLm5rZXlzKQorCQk6IDA7Cit9CisKIFNIT1coX19iY2hfY2FjaGVfc2V0KQogewotCXVuc2lnbmVkIHJvb3RfdXNhZ2Uoc3RydWN0IGNhY2hlX3NldCAqYykKLQl7Ci0JCXVuc2lnbmVkIGJ5dGVzID0gMDsKLQkJc3RydWN0IGJrZXkgKms7Ci0JCXN0cnVjdCBidHJlZSAqYjsKLQkJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKLQotCQlnb3RvIGxvY2tfcm9vdDsKLQotCQlkbyB7Ci0JCQlyd191bmxvY2soZmFsc2UsIGIpOwotbG9ja19yb290OgotCQkJYiA9IGMtPnJvb3Q7Ci0JCQlyd19sb2NrKGZhbHNlLCBiLCBiLT5sZXZlbCk7Ci0JCX0gd2hpbGUgKGIgIT0gYy0+cm9vdCk7Ci0KLQkJZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfYmFkKQotCQkJYnl0ZXMgKz0gYmtleV9ieXRlcyhrKTsKLQotCQlyd191bmxvY2soZmFsc2UsIGIpOwotCi0JCXJldHVybiAoYnl0ZXMgKiAxMDApIC8gYnRyZWVfYnl0ZXMoYyk7Ci0JfQotCi0Jc2l6ZV90IGNhY2hlX3NpemUoc3RydWN0IGNhY2hlX3NldCAqYykKLQl7Ci0JCXNpemVfdCByZXQgPSAwOwotCQlzdHJ1Y3QgYnRyZWUgKmI7Ci0KLQkJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5idHJlZV9jYWNoZSwgbGlzdCkKLQkJCXJldCArPSAxIDw8IChiLT5rZXlzLnBhZ2Vfb3JkZXIgKyBQQUdFX1NISUZUKTsKLQotCQltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl1bnNpZ25lZCBjYWNoZV9tYXhfY2hhaW4oc3RydWN0IGNhY2hlX3NldCAqYykKLQl7Ci0JCXVuc2lnbmVkIHJldCA9IDA7Ci0JCXN0cnVjdCBobGlzdF9oZWFkICpoOwotCi0JCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQotCQlmb3IgKGggPSBjLT5idWNrZXRfaGFzaDsKLQkJICAgICBoIDwgYy0+YnVja2V0X2hhc2ggKyAoMSA8PCBCVUNLRVRfSEFTSF9CSVRTKTsKLQkJICAgICBoKyspIHsKLQkJCXVuc2lnbmVkIGkgPSAwOwotCQkJc3RydWN0IGhsaXN0X25vZGUgKnA7Ci0KLQkJCWhsaXN0X2Zvcl9lYWNoKHAsIGgpCi0JCQkJaSsrOwotCi0JCQlyZXQgPSBtYXgocmV0LCBpKTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXVuc2lnbmVkIGJ0cmVlX3VzZWQoc3RydWN0IGNhY2hlX3NldCAqYykKLQl7Ci0JCXJldHVybiBkaXY2NF91NjQoYy0+Z2Nfc3RhdHMua2V5X2J5dGVzICogMTAwLAotCQkJCSAoYy0+Z2Nfc3RhdHMubm9kZXMgPzogMSkgKiBidHJlZV9ieXRlcyhjKSk7Ci0JfQotCi0JdW5zaWduZWQgYXZlcmFnZV9rZXlfc2l6ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjKQotCXsKLQkJcmV0dXJuIGMtPmdjX3N0YXRzLm5rZXlzCi0JCQk/IGRpdjY0X3U2NChjLT5nY19zdGF0cy5kYXRhLCBjLT5nY19zdGF0cy5ua2V5cykKLQkJCTogMDsKLQl9Ci0KIAlzdHJ1Y3QgY2FjaGVfc2V0ICpjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjYWNoZV9zZXQsIGtvYmopOwogCiAJc3lzZnNfcHJpbnQoc3luY2hyb25vdXMsCQlDQUNIRV9TWU5DKCZjLT5zYikpOwpAQCAtNTI0LDIxICs1MjMsMjAgQEAKIAlzeXNmc19ocHJpbnQoYnVja2V0X3NpemUsCQlidWNrZXRfYnl0ZXMoYykpOwogCXN5c2ZzX2hwcmludChibG9ja19zaXplLAkJYmxvY2tfYnl0ZXMoYykpOwogCXN5c2ZzX3ByaW50KHRyZWVfZGVwdGgsCQkJYy0+cm9vdC0+bGV2ZWwpOwotCXN5c2ZzX3ByaW50KHJvb3RfdXNhZ2VfcGVyY2VudCwJCXJvb3RfdXNhZ2UoYykpOworCXN5c2ZzX3ByaW50KHJvb3RfdXNhZ2VfcGVyY2VudCwJCWJjaF9yb290X3VzYWdlKGMpKTsKIAotCXN5c2ZzX2hwcmludChidHJlZV9jYWNoZV9zaXplLAkJY2FjaGVfc2l6ZShjKSk7Ci0Jc3lzZnNfcHJpbnQoYnRyZWVfY2FjaGVfbWF4X2NoYWluLAljYWNoZV9tYXhfY2hhaW4oYykpOworCXN5c2ZzX2hwcmludChidHJlZV9jYWNoZV9zaXplLAkJYmNoX2NhY2hlX3NpemUoYykpOworCXN5c2ZzX3ByaW50KGJ0cmVlX2NhY2hlX21heF9jaGFpbiwJYmNoX2NhY2hlX21heF9jaGFpbihjKSk7CiAJc3lzZnNfcHJpbnQoY2FjaGVfYXZhaWxhYmxlX3BlcmNlbnQsCTEwMCAtIGMtPmdjX3N0YXRzLmluX3VzZSk7CiAKIAlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT5idHJlZV9nY190aW1lLAlidHJlZV9nYywgc2VjLCBtcyk7CiAJc3lzZnNfcHJpbnRfdGltZV9zdGF0cygmYy0+YnRyZWVfc3BsaXRfdGltZSwJYnRyZWVfc3BsaXQsIHNlYywgdXMpOwogCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPnNvcnQudGltZSwJCWJ0cmVlX3NvcnQsIG1zLCB1cyk7CiAJc3lzZnNfcHJpbnRfdGltZV9zdGF0cygmYy0+YnRyZWVfcmVhZF90aW1lLAlidHJlZV9yZWFkLCBtcywgdXMpOwotCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPnRyeV9oYXJkZXJfdGltZSwJdHJ5X2hhcmRlciwgbXMsIHVzKTsKIAotCXN5c2ZzX3ByaW50KGJ0cmVlX3VzZWRfcGVyY2VudCwJYnRyZWVfdXNlZChjKSk7CisJc3lzZnNfcHJpbnQoYnRyZWVfdXNlZF9wZXJjZW50LAliY2hfYnRyZWVfdXNlZChjKSk7CiAJc3lzZnNfcHJpbnQoYnRyZWVfbm9kZXMsCWMtPmdjX3N0YXRzLm5vZGVzKTsKLQlzeXNmc19ocHJpbnQoYXZlcmFnZV9rZXlfc2l6ZSwJYXZlcmFnZV9rZXlfc2l6ZShjKSk7CisJc3lzZnNfaHByaW50KGF2ZXJhZ2Vfa2V5X3NpemUsCWJjaF9hdmVyYWdlX2tleV9zaXplKGMpKTsKIAogCXN5c2ZzX3ByaW50KGNhY2hlX3JlYWRfcmFjZXMsCiAJCSAgICBhdG9taWNfbG9uZ19yZWFkKCZjLT5jYWNoZV9yZWFkX3JhY2VzKSk7CkBAIC03MDksNyArNzA3LDYgQEAKIAlzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZV9saXN0KGJ0cmVlX3NwbGl0LCBzZWMsIHVzKQogCXN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlX2xpc3QoYnRyZWVfc29ydCwgbXMsIHVzKQogCXN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlX2xpc3QoYnRyZWVfcmVhZCwgbXMsIHVzKQotCXN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlX2xpc3QodHJ5X2hhcmRlciwgbXMsIHVzKQogCiAJJnN5c2ZzX2J0cmVlX25vZGVzLAogCSZzeXNmc19idHJlZV91c2VkX3BlcmNlbnQsCkBAIC03NjEsNyArNzU4LDkgQEAKIAkJaW50IGNtcChjb25zdCB2b2lkICpsLCBjb25zdCB2b2lkICpyKQogCQl7CXJldHVybiAqKCh1aW50MTZfdCAqKSByKSAtICooKHVpbnQxNl90ICopIGwpOyB9CiAKLQkJc2l6ZV90IG4gPSBjYS0+c2IubmJ1Y2tldHMsIGksIHVudXNlZCwgYnRyZWU7CisJCXN0cnVjdCBidWNrZXQgKmI7CisJCXNpemVfdCBuID0gY2EtPnNiLm5idWNrZXRzLCBpOworCQlzaXplX3QgdW51c2VkID0gMCwgYXZhaWxhYmxlID0gMCwgZGlydHkgPSAwLCBtZXRhID0gMDsKIAkJdWludDY0X3Qgc3VtID0gMDsKIAkJLyogQ29tcHV0ZSAzMSBxdWFudGlsZXMgKi8KIAkJdWludDE2X3QgcVszMV0sICpwLCAqY2FjaGVkOwpAQCAtNzcyLDYgKzc3MSwxNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJbXV0ZXhfbG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOworCQlmb3JfZWFjaF9idWNrZXQoYiwgY2EpIHsKKwkJCWlmICghR0NfU0VDVE9SU19VU0VEKGIpKQorCQkJCXVudXNlZCsrOworCQkJaWYgKEdDX01BUksoYikgPT0gR0NfTUFSS19SRUNMQUlNQUJMRSkKKwkJCQlhdmFpbGFibGUrKzsKKwkJCWlmIChHQ19NQVJLKGIpID09IEdDX01BUktfRElSVFkpCisJCQkJZGlydHkrKzsKKwkJCWlmIChHQ19NQVJLKGIpID09IEdDX01BUktfTUVUQURBVEEpCisJCQkJbWV0YSsrOworCQl9CisKIAkJZm9yIChpID0gY2EtPnNiLmZpcnN0X2J1Y2tldDsgaSA8IG47IGkrKykKIAkJCXBbaV0gPSBjYS0+YnVja2V0c1tpXS5wcmlvOwogCQltdXRleF91bmxvY2soJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKQEAgLTc4NiwxMCArNzk2LDcgQEAKIAogCQl3aGlsZSAoY2FjaGVkIDwgcCArIG4gJiYKIAkJICAgICAgICpjYWNoZWQgPT0gQlRSRUVfUFJJTykKLQkJCWNhY2hlZCsrOwotCi0JCWJ0cmVlID0gY2FjaGVkIC0gcDsKLQkJbiAtPSBidHJlZTsKKwkJCWNhY2hlZCsrLCBuLS07CiAKIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKIAkJCXN1bSArPSBJTklUSUFMX1BSSU8gLSBjYWNoZWRbaV07CkBAIC04MDUsMTIgKzgxMiwxNiBAQAogCiAJCXJldCA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwKIAkJCQkiVW51c2VkOgkJJXp1JSVcbiIKKwkJCQkiQ2xlYW46CQklenUlJVxuIgorCQkJCSJEaXJ0eToJCSV6dSUlXG4iCiAJCQkJIk1ldGFkYXRhOgklenUlJVxuIgogCQkJCSJBdmVyYWdlOgklbGx1XG4iCiAJCQkJIlNlY3RvcnMgcGVyIFE6CSV6dVxuIgogCQkJCSJRdWFudGlsZXM6CVsiLAogCQkJCXVudXNlZCAqIDEwMCAvIChzaXplX3QpIGNhLT5zYi5uYnVja2V0cywKLQkJCQlidHJlZSAqIDEwMCAvIChzaXplX3QpIGNhLT5zYi5uYnVja2V0cywgc3VtLAorCQkJCWF2YWlsYWJsZSAqIDEwMCAvIChzaXplX3QpIGNhLT5zYi5uYnVja2V0cywKKwkJCQlkaXJ0eSAqIDEwMCAvIChzaXplX3QpIGNhLT5zYi5uYnVja2V0cywKKwkJCQltZXRhICogMTAwIC8gKHNpemVfdCkgY2EtPnNiLm5idWNrZXRzLCBzdW0sCiAJCQkJbiAqIGNhLT5zYi5idWNrZXRfc2l6ZSAvIChBUlJBWV9TSVpFKHEpICsgMSkpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHEpOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS90cmFjZS5jIGIvZHJpdmVycy9tZC9iY2FjaGUvdHJhY2UuYwppbmRleCBhZGJjM2RmLi5iNzgyMGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS90cmFjZS5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3RyYWNlLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmNhY2hlX2J0cmVlX25vZGVfY29tcGFjdCk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJjYWNoZV9idHJlZV9zZXRfcm9vdCk7CiAKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmNhY2hlX2FsbG9jX2ludmFsaWRhdGUpOworRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChiY2FjaGVfaW52YWxpZGF0ZSk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJjYWNoZV9hbGxvY19mYWlsKTsKIAogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChiY2FjaGVfd3JpdGViYWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jIGIvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLXRyYW5zZmVyLmMKaW5kZXggMDhkOWEyMC4uYjQyOGMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLXRyYW5zZmVyLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLXRyYW5zZmVyLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAltc2ctPnNlcSA9IHRmci0+c2VxOwogCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QpICsgdGZyLT5kYXRhX3NpemU7CiAKLQlyID0gY25fbmV0bGlua19zZW5kKG1zZywgMCwgZ2ZwX2FueSgpKTsKKwlyID0gY25fbmV0bGlua19zZW5kKG1zZywgMCwgMCwgZ2ZwX2FueSgpKTsKIAogCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzM0My5jIGIvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzM0My5jCmluZGV4IGQ0ZTE1YTYuLjlkMzhmN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL2FkdjczNDMuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9hZHY3MzQzLmMKQEAgLTI2LDEyICsyNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9hZHY3MzQzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1hc3luYy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItb2YuaD4KIAogI2luY2x1ZGUgImFkdjczNDNfcmVncy5oIgogCkBAIC00MTAsNyArNDEwLDcgQEAKIAlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GKSB8fCAhY2xpZW50LT5kZXYub2Zfbm9kZSkKIAkJcmV0dXJuIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlucCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CisJbnAgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvbXQ5cDAzMS5jIGIvZHJpdmVycy9tZWRpYS9pMmMvbXQ5cDAzMS5jCmluZGV4IGU1ZGRmNDcuLjE5MmM0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL210OXAwMzEuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9tdDlwMDMxLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjksNyArMzAsNiBAQAogI2luY2x1ZGUgPG1lZGlhL210OXAwMzEuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLW9mLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KIAogI2luY2x1ZGUgImFwdGluYS1wbGwuaCIKQEAgLTk0Myw3ICs5NDMsNyBAQAogCWlmICghSVNfRU5BQkxFRChDT05GSUdfT0YpIHx8ICFjbGllbnQtPmRldi5vZl9ub2RlKQogCQlyZXR1cm4gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCW5wID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKKwlucCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOwogCWlmICghbnApCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9zNWs1YmFmLmMgYi9kcml2ZXJzL21lZGlhL2kyYy9zNWs1YmFmLmMKaW5kZXggNzdlMTBlMC4uMmQ3NjhlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvczVrNWJhZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3M1azViYWYuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lZGlhLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC0xODU1LDcgKzE4NTYsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0Jbm9kZV9lcCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgTlVMTCk7CisJbm9kZV9lcCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KG5vZGUsIE5VTEwpOwogCWlmICghbm9kZV9lcCkgewogCQlkZXZfZXJyKGRldiwgIm5vIGVuZHBvaW50IGRlZmluZWQgYXQgbm9kZSAlc1xuIiwKIAkJCW5vZGUtPmZ1bGxfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy90dnA1MTR4LmMgYi9kcml2ZXJzL21lZGlhL2kyYy90dnA1MTR4LmMKaW5kZXggODNkODVkZi4uY2EwMDExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvdHZwNTE0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDUxNHguYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWFzeW5jLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KQEAgLTEwNjgsNyArMTA2OSw3IEBACiAJaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRikgfHwgIWNsaWVudC0+ZGV2Lm9mX25vZGUpCiAJCXJldHVybiBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JZW5kcG9pbnQgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOworCWVuZHBvaW50ID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CiAJaWYgKCFlbmRwb2ludCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDcwMDIuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDcwMDIuYwppbmRleCA5MTJlMWNjLi5jNGUxZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy90dnA3MDAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvdHZwNzAwMi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3Y0bDItZHYtdGltaW5ncy5oPgogI2luY2x1ZGUgPG1lZGlhL3R2cDcwMDIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWFzeW5jLmg+CkBAIC05NTcsNyArOTU4LDcgQEAKIAlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GKSB8fCAhY2xpZW50LT5kZXYub2Zfbm9kZSkKIAkJcmV0dXJuIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQllbmRwb2ludCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CisJZW5kcG9pbnQgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKIAlpZiAoIWVuZHBvaW50KQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3gxOC9jeDE4LWFsc2EtbWFpbi5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gxOC9jeDE4LWFsc2EtbWFpbi5jCmluZGV4IGIyYzhjMzQuLmVhMjcyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MTgvY3gxOC1hbHNhLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDE4L2N4MTgtYWxzYS1tYWluLmMKQEAgLTE0NSwxMSArMTQ1LDEyIEBACiAJLyogVGhpcyBpcyBhIG5vLW9wIGZvciB1cy4gIFdlJ2xsIHVzZSB0aGUgY3gtPmluc3RhbmNlICovCiAKIAkvKiAoMikgQ3JlYXRlIGEgY2FyZCBpbnN0YW5jZSAqLwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIC8qIHVzZSBmaXJzdCBhdmFpbGFibGUgaWQgKi8KLQkJCSAgICAgIFNORFJWX0RFRkFVTFRfU1RSMSwgLyogeGlkIGZyb20gZW5kIG9mIHNob3J0bmFtZSovCi0JCQkgICAgICBUSElTX01PRFVMRSwgMCwgJnNjKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJmN4LT5wY2lfZGV2LT5kZXYsCisJCQkgICBTTkRSVl9ERUZBVUxUX0lEWDEsIC8qIHVzZSBmaXJzdCBhdmFpbGFibGUgaWQgKi8KKwkJCSAgIFNORFJWX0RFRkFVTFRfU1RSMSwgLyogeGlkIGZyb20gZW5kIG9mIHNob3J0bmFtZSovCisJCQkgICBUSElTX01PRFVMRSwgMCwgJnNjKTsKIAlpZiAocmV0KSB7Ci0JCUNYMThfQUxTQV9FUlIoIiVzOiBzbmRfY2FyZF9jcmVhdGUoKSBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsCisJCUNYMThfQUxTQV9FUlIoIiVzOiBzbmRfY2FyZF9uZXcoKSBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsCiAJCQkgICAgICBfX2Z1bmNfXywgcmV0KTsKIAkJZ290byBlcnJfZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LWFsc2EuYwppbmRleCBjNmM5YmQ1Li41NTQ3OThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS1hbHNhLmMKQEAgLTQ4OSw3ICs0ODksOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXYtPnBjaS0+ZGV2LAorCQkJICAgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCiAJCQlUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKQEAgLTUwMCw4ICs1MDEsNiBAQAogCWNoaXAtPmNhcmQgPSBjYXJkOwogCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+cGNpLT5kZXYpOwotCiAJZXJyID0gc25kX2N4MjM4ODVfcGNtKGNoaXAsIDAsICJDWDIzODg1IERpZ2l0YWwiKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IGIxZTA4YzMuLjJkZDViY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYwpAQCAtNjQ1LDggKzY0NSw5IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZub10sIGlkW2Rldm5vXSwgVEhJU19NT0RVTEUsCi0JCQlzaXplb2Yoc3RydWN0IGN4MjU4MjFfYXVkaW9fZGV2KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2LT5wY2ktPmRldiwgaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sCisJCQkgICBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgY3gyNTgyMV9hdWRpb19kZXYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJfaW5mbygiREVCVUcgRVJST1I6IGNhbm5vdCBjcmVhdGUgc25kX2NhcmRfbmV3IGluICVzXG4iLAogCQkJX19mdW5jX18pOwpAQCAtNjgyLDggKzY4Myw2IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmY2hpcC0+cGNpLT5kZXYpOwotCiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgImN4MjU4MjEiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggaXJxICVkIiwgY2hpcC0+ZGV2LT5uYW1lLAogCQljaGlwLT5pb2Jhc2UsIGNoaXAtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDg4L2N4ODgtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3g4OC9jeDg4LWFsc2EuYwppbmRleCBkMDE0MjA2ZS4uYTcyNTc5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvY3g4OC9jeDg4LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDg4L2N4ODgtYWxzYS5jCkBAIC04NTIsOCArODUyLDYgQEAKIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7CiAJKmNvcmVfcHRyID0gY29yZTsKIApAQCAtODc2LDggKzg3NCw4IEBACiAJCXJldHVybiAoLUVOT0VOVCk7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5vXSwgaWRbZGV2bm9dLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzbmRfY3g4OF9jYXJkX3QpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHNuZF9jeDg4X2NhcmRfdCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvaXZ0di9pdnR2LWFsc2EtbWFpbi5jIGIvZHJpdmVycy9tZWRpYS9wY2kvaXZ0di9pdnR2LWFsc2EtbWFpbi5jCmluZGV4IGU5NzBjZmEuLjM5YjUyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2l2dHYvaXZ0di1hbHNhLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9pdnR2L2l2dHYtYWxzYS1tYWluLmMKQEAgLTE0NSwxMSArMTQ1LDEyIEBACiAJLyogVGhpcyBpcyBhIG5vLW9wIGZvciB1cy4gIFdlJ2xsIHVzZSB0aGUgaXR2LT5pbnN0YW5jZSAqLwogCiAJLyogKDIpIENyZWF0ZSBhIGNhcmQgaW5zdGFuY2UgKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCAvKiB1c2UgZmlyc3QgYXZhaWxhYmxlIGlkICovCi0JCQkgICAgICBTTkRSVl9ERUZBVUxUX1NUUjEsIC8qIHhpZCBmcm9tIGVuZCBvZiBzaG9ydG5hbWUqLwotCQkJICAgICAgVEhJU19NT0RVTEUsIDAsICZzYyk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZpdHYtPnBkZXYtPmRldiwKKwkJCSAgIFNORFJWX0RFRkFVTFRfSURYMSwgLyogdXNlIGZpcnN0IGF2YWlsYWJsZSBpZCAqLworCQkJICAgU05EUlZfREVGQVVMVF9TVFIxLCAvKiB4aWQgZnJvbSBlbmQgb2Ygc2hvcnRuYW1lKi8KKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmc2MpOwogCWlmIChyZXQpIHsKLQkJSVZUVl9BTFNBX0VSUigiJXM6IHNuZF9jYXJkX2NyZWF0ZSgpIGZhaWxlZCB3aXRoIGVyciAlZFxuIiwKKwkJSVZUVl9BTFNBX0VSUigiJXM6IHNuZF9jYXJkX25ldygpIGZhaWxlZCB3aXRoIGVyciAlZFxuIiwKIAkJCSAgICAgIF9fZnVuY19fLCByZXQpOwogCQlnb3RvIGVycl9leGl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCmluZGV4IGRkNjdjOGEuLmUwNGE0ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWFsc2EuYwpAQCAtMTA3Miw4ICsxMDcyLDggQEAKIAlpZiAoIWVuYWJsZVtkZXZudW1dKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZudW1dLCBpZFtkZXZudW1dLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzbmRfY2FyZF9zYWE3MTM0X3QpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXYtPnBjaS0+ZGV2LCBpbmRleFtkZXZudW1dLCBpZFtkZXZudW1dLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzbmRfY2FyZF9zYWE3MTM0X3QpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTExMTUsOCArMTExNSw2IEBACiAJaWYgKChlcnIgPSBzbmRfY2FyZF9zYWE3MTM0X3BjbShjaGlwLCAwKSkgPCAwKQogCQlnb3RvIF9fbm9kZXY7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZjaGlwLT5wY2ktPmRldik7Ci0KIAkvKiBFbmQgb2YgImNyZWF0aW9uIiAqLwogCiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlNBQTcxMzQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy5jCmluZGV4IDEzYTQyMjguLjliZGZhNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMuYwpAQCAtMjQsMTMgKzI0LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1vZi5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CiAKICNpbmNsdWRlICJtZWRpYS1kZXYuaCIKQEAgLTE2NywxMCArMTY3LDEwIEBACiAJdTMyIHRtcCA9IDA7CiAJaW50IHJldDsKIAotCW5wID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChucCwgTlVMTCk7CisJbnAgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChucCwgTlVMTCk7CiAJaWYgKCFucCkKIAkJcmV0dXJuIC1FTlhJTzsKLQlucCA9IHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KG5wKTsKKwlucCA9IG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydChucCk7CiAJaWYgKCFucCkKIAkJcmV0dXJuIC1FTlhJTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21lZGlhLWRldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21lZGlhLWRldi5jCmluZGV4IGMxYmNlMTcuLjA0ZDZlY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9tZWRpYS1kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWVkaWEtZGV2LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQ2OCwxMiArNDY5LDEyIEBACiAJCXJldHVybiAwOwogCiAJdjRsMl9vZl9wYXJzZV9lbmRwb2ludChlcCwgJmVuZHBvaW50KTsKLQlpZiAoV0FSTl9PTihlbmRwb2ludC5wb3J0ID09IDApIHx8IGluZGV4ID49IEZJTUNfTUFYX1NFTlNPUlMpCisJaWYgKFdBUk5fT04oZW5kcG9pbnQuYmFzZS5wb3J0ID09IDApIHx8IGluZGV4ID49IEZJTUNfTUFYX1NFTlNPUlMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGQtPm11eF9pZCA9IChlbmRwb2ludC5wb3J0IC0gMSkgJiAweDE7CisJcGQtPm11eF9pZCA9IChlbmRwb2ludC5iYXNlLnBvcnQgLSAxKSAmIDB4MTsKIAotCXJlbSA9IHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudChlcCk7CisJcmVtID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudChlcCk7CiAJb2Zfbm9kZV9wdXQoZXApOwogCWlmIChyZW0gPT0gTlVMTCkgewogCQl2NGwyX2luZm8oJmZtZC0+djRsMl9kZXYsICJSZW1vdGUgZGV2aWNlIGF0ICVzIG5vdCBmb3VuZFxuIiwKQEAgLTQ5MywxMyArNDk0LDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChmaW1jX2lucHV0X2lzX3BhcmFsbGVsKGVuZHBvaW50LnBvcnQpKSB7CisJaWYgKGZpbWNfaW5wdXRfaXNfcGFyYWxsZWwoZW5kcG9pbnQuYmFzZS5wb3J0KSkgewogCQlpZiAoZW5kcG9pbnQuYnVzX3R5cGUgPT0gVjRMMl9NQlVTX1BBUkFMTEVMKQogCQkJcGQtPnNlbnNvcl9idXNfdHlwZSA9IEZJTUNfQlVTX1RZUEVfSVRVXzYwMTsKIAkJZWxzZQogCQkJcGQtPnNlbnNvcl9idXNfdHlwZSA9IEZJTUNfQlVTX1RZUEVfSVRVXzY1NjsKIAkJcGQtPmZsYWdzID0gZW5kcG9pbnQuYnVzLnBhcmFsbGVsLmZsYWdzOwotCX0gZWxzZSBpZiAoZmltY19pbnB1dF9pc19taXBpX2NzaShlbmRwb2ludC5wb3J0KSkgeworCX0gZWxzZSBpZiAoZmltY19pbnB1dF9pc19taXBpX2NzaShlbmRwb2ludC5iYXNlLnBvcnQpKSB7CiAJCS8qCiAJCSAqIE1JUEkgQ1NJLTI6IG9ubHkgaW5wdXQgbXV4IHNlbGVjdGlvbiBhbmQKIAkJICogdGhlIHNlbnNvcidzIGNsb2NrIGZyZXF1ZW5jeSBpcyBuZWVkZWQuCkBAIC01MDcsNyArNTA4LDcgQEAKIAkJcGQtPnNlbnNvcl9idXNfdHlwZSA9IEZJTUNfQlVTX1RZUEVfTUlQSV9DU0kyOwogCX0gZWxzZSB7CiAJCXY0bDJfZXJyKCZmbWQtPnY0bDJfZGV2LCAiV3JvbmcgcG9ydCBpZCAoJXUpIGF0IG5vZGUgJXNcbiIsCi0JCQkgZW5kcG9pbnQucG9ydCwgcmVtLT5mdWxsX25hbWUpOworCQkJIGVuZHBvaW50LmJhc2UucG9ydCwgcmVtLT5mdWxsX25hbWUpOwogCX0KIAkvKgogCSAqIEZvciBGSU1DLUlTIGhhbmRsZWQgc2Vuc29ycywgdGhhdCBhcmUgcGxhY2VkIHVuZGVyIGkyYy1pc3AgZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWlwaS1jc2lzLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWlwaS1jc2lzLmMKaW5kZXggZjNjMzU5MS4uMzY3OGJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21pcGktY3Npcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9taXBpLWNzaXMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9taXBpLWNzaXMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTc2Miw3ICs3NjMsNyBAQAogCQkJCSAmc3RhdGUtPm1heF9udW1fbGFuZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW5vZGUgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KG5vZGUsIE5VTEwpOworCW5vZGUgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChub2RlLCBOVUxMKTsKIAlpZiAoIW5vZGUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcG9ydCBub2RlIGF0ICVzXG4iLAogCQkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwpAQCAtNzcxLDcgKzc3Miw3IEBACiAJLyogR2V0IHBvcnQgbm9kZSBhbmQgdmFsaWRhdGUgTUlQSS1DU0kgY2hhbm5lbCBpZC4gKi8KIAl2NGwyX29mX3BhcnNlX2VuZHBvaW50KG5vZGUsICZlbmRwb2ludCk7CiAKLQlzdGF0ZS0+aW5kZXggPSBlbmRwb2ludC5wb3J0IC0gRklNQ19JTlBVVF9NSVBJX0NTSTJfMDsKKwlzdGF0ZS0+aW5kZXggPSBlbmRwb2ludC5iYXNlLnBvcnQgLSBGSU1DX0lOUFVUX01JUElfQ1NJMl8wOwogCWlmIChzdGF0ZS0+aW5kZXggPCAwIHx8IHN0YXRlLT5pbmRleCA+PSBDU0lTX01BWF9FTlRJVElFUykKIAkJcmV0dXJuIC1FTlhJTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYwppbmRleCA4MWExZDk3Li45YjkyNTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYwpAQCAtNjY1LDggKzY2NSw4IEBACiAJY3gyMzF4eF9pbmZvKCJjeDIzMXh4LWF1ZGlvLmM6IHByb2JpbmcgZm9yIGN4MjMxeHggIgogCQkgICAgICJub24gc3RhbmRhcmQgdXNiYXVkaW9cbiIpOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5yXSwgIkN4MjMxeHggQXVkaW8iLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+dWRldi0+ZGV2LCBpbmRleFtkZXZucl0sICJDeDIzMXh4IEF1ZGlvIiwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTY4Miw3ICs2ODIsNiBAQAogCXBjbS0+aW5mb19mbGFncyA9IDA7CiAJcGNtLT5wcml2YXRlX2RhdGEgPSBkZXY7CiAJc3RyY3B5KHBjbS0+bmFtZSwgIkNvbmV4YW50IGN4MjMxeHggQ2FwdHVyZSIpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+dWRldi0+ZGV2KTsKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQ3gyMzF4eC1BdWRpbyIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJDeDIzMXh4IEF1ZGlvIik7CiAJc3RyY3B5KGNhcmQtPmxvbmduYW1lLCAiQ29uZXhhbnQgY3gyMzF4eCBBdWRpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCmluZGV4IDA1ZTliZDEuLjFhMjg4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKQEAgLTkwMCw4ICs5MDAsOCBAQAogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgImVtMjh4eC1hdWRpby5jOiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNCBNYXVybyBDYXJ2YWxobyBDaGVoYWJcbiIpOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5yXSwgIkVtMjh4eCBBdWRpbyIsIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2LT51ZGV2LT5kZXYsIGluZGV4W2Rldm5yXSwgIkVtMjh4eCBBdWRpbyIsCisJCQkgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC05MTgsNyArOTE4LDYgQEAKIAlwY20tPnByaXZhdGVfZGF0YSA9IGRldjsKIAlzdHJjcHkocGNtLT5uYW1lLCAiRW1waWEgMjh4eCBDYXB0dXJlIik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPnVkZXYtPmRldik7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkVtMjh4eC1BdWRpbyIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJFbTI4eHggQXVkaW8iKTsKIAlzdHJjcHkoY2FyZC0+bG9uZ25hbWUsICJFbXBpYSBFbTI4eHggQXVkaW8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC1hYzk3LmMgYi9kcml2ZXJzL21lZGlhL3VzYi9zdGsxMTYwL3N0azExNjAtYWM5Ny5jCmluZGV4IGM4NTgzYzIuLmM0NmM4YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC1hYzk3LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLWFjOTcuYwpAQCAtOTgsMTMgKzk4LDExIEBACiAJICogSnVzdCB3YW50IGEgY2FyZCB0byBhY2Nlc3MgYWM5NiBjb250cm9scywKIAkgKiB0aGUgYWN0dWFsIGNhcHR1cmUgaW50ZXJmYWNlIHdpbGwgYmUgaGFuZGxlZCBieSBzbmQtdXNiLWF1ZGlvCiAJICovCi0JcmMgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCi0JCQkgICAgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCXJjID0gc25kX2NhcmRfbmV3KGRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldi0+ZGV2KTsKLQogCS8qIFRPRE86IEknbSBub3Qgc3VyZSB3aGVyZSBzaG91bGQgSSBnZXQgdGhlc2UgbmFtZXMgOi0oICovCiAJc25wcmludGYoY2FyZC0+c2hvcnRuYW1lLCBzaXplb2YoY2FyZC0+c2hvcnRuYW1lKSwKIAkJICJzdGsxMTYwLW1peGVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi90bGcyMzAwL3BkLWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RsZzIzMDAvcGQtYWxzYS5jCmluZGV4IDNmM2UxNDEuLmRkOGZlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3RsZzIzMDAvcGQtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RsZzIzMDAvcGQtYWxzYS5jCkBAIC0zMDAsNyArMzAwLDggQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCByZXQ7CiAKLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoLTEsICJUZWxlZ2VudCIsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZwLT5pbnRlcmZhY2UtPmRldiwgLTEsICJUZWxlZ2VudCIsCisJCQkgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWFsc2EuYwppbmRleCA4MTNjMWVjLi4zMjM5Y2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWFsc2EuYwpAQCAtNDMxLDcgKzQzMSw4IEBACiAJaWYgKCFlbmFibGVbZGV2bnJdKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5yXSwgInRtNjAwMCIsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJcmMgPSBzbmRfY2FyZF9uZXcoJmRldi0+dWRldi0+ZGV2LCBpbmRleFtkZXZucl0sICJ0bTYwMDAiLAorCQkJICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChyYyA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBjYXJkIGluc3RhbmNlICVkXG4iLCBkZXZucik7CiAJCXJldHVybiByYzsKQEAgLTQ0NSw3ICs0NDYsNiBAQAogCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CiAJc25kX2NvbXBvbmVudF9hZGQoY2FyZCwgY29tcG9uZW50KTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPnVkZXYtPmRldik7CiAKIAljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF90bTYwMDBfY2FyZCksIEdGUF9LRVJORUwpOwogCWlmICghY2hpcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jb21wYXQtaW9jdGwzMi5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jb21wYXQtaW9jdGwzMi5jCmluZGV4IDhmN2E2YTQuLjYxOTE5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY29tcGF0LWlvY3RsMzIuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWNvbXBhdC1pb2N0bDMyLmMKQEAgLTczMyw3ICs3MzMsNyBAQAogCQljb3B5X3RvX3VzZXIoJnVwLT51LCAma3AtPnUsIHNpemVvZihrcC0+dSkpIHx8CiAJCXB1dF91c2VyKGtwLT5wZW5kaW5nLCAmdXAtPnBlbmRpbmcpIHx8CiAJCXB1dF91c2VyKGtwLT5zZXF1ZW5jZSwgJnVwLT5zZXF1ZW5jZSkgfHwKLQkJcHV0X2NvbXBhdF90aW1lc3BlYygma3AtPnRpbWVzdGFtcCwgJnVwLT50aW1lc3RhbXApIHx8CisJCWNvbXBhdF9wdXRfdGltZXNwZWMoJmtwLT50aW1lc3RhbXAsICZ1cC0+dGltZXN0YW1wKSB8fAogCQlwdXRfdXNlcihrcC0+aWQsICZ1cC0+aWQpIHx8CiAJCWNvcHlfdG9fdXNlcih1cC0+cmVzZXJ2ZWQsIGtwLT5yZXNlcnZlZCwgOCAqIHNpemVvZihfX3UzMikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW9mLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW9mLmMKaW5kZXggNDJlM2U4YS4uYjRlZDlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1vZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItb2YuYwpAQCAtMTI3LDE3ICsxMjcsOSBAQAogaW50IHY0bDJfb2ZfcGFyc2VfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJICAgc3RydWN0IHY0bDJfb2ZfZW5kcG9pbnQgKmVuZHBvaW50KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydF9ub2RlID0gb2ZfZ2V0X3BhcmVudChub2RlKTsKLQotCW1lbXNldChlbmRwb2ludCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHY0bDJfb2ZfZW5kcG9pbnQsIGhlYWQpKTsKLQotCWVuZHBvaW50LT5sb2NhbF9ub2RlID0gbm9kZTsKLQkvKgotCSAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIHR3byBjYWxscyBiZWxvdyBzdWNjZWVkLgotCSAqIElmIHRoZXkgZG9uJ3QgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSAwIGlzIHVzZWQuCi0JICovCi0Jb2ZfcHJvcGVydHlfcmVhZF91MzIocG9ydF9ub2RlLCAicmVnIiwgJmVuZHBvaW50LT5wb3J0KTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicmVnIiwgJmVuZHBvaW50LT5pZCk7CisJb2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQobm9kZSwgJmVuZHBvaW50LT5iYXNlKTsKKwllbmRwb2ludC0+YnVzX3R5cGUgPSAwOworCW1lbXNldCgmZW5kcG9pbnQtPmJ1cywgMCwgc2l6ZW9mKGVuZHBvaW50LT5idXMpKTsKIAogCXY0bDJfb2ZfcGFyc2VfY3NpX2J1cyhub2RlLCBlbmRwb2ludCk7CiAJLyoKQEAgLTE0NywxMjUgKzEzOSw2IEBACiAJaWYgKGVuZHBvaW50LT5idXMubWlwaV9jc2kyLmZsYWdzID09IDApCiAJCXY0bDJfb2ZfcGFyc2VfcGFyYWxsZWxfYnVzKG5vZGUsIGVuZHBvaW50KTsKIAotCW9mX25vZGVfcHV0KHBvcnRfbm9kZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9vZl9wYXJzZV9lbmRwb2ludCk7Ci0KLS8qKgotICogdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludCgpIC0gZ2V0IG5leHQgZW5kcG9pbnQgbm9kZQotICogQHBhcmVudDogcG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZSBub2RlCi0gKiBAcHJldjogcHJldmlvdXMgZW5kcG9pbnQgbm9kZSwgb3IgTlVMTCB0byBnZXQgZmlyc3QKLSAqCi0gKiBSZXR1cm46IEFuICdlbmRwb2ludCcgbm9kZSBwb2ludGVyIHdpdGggcmVmY291bnQgaW5jcmVtZW50ZWQuIFJlZmNvdW50Ci0gKiBvZiB0aGUgcGFzc2VkIEBwcmV2IG5vZGUgaXMgbm90IGRlY3JlbWVudGVkLCB0aGUgY2FsbGVyIGhhdmUgdG8gdXNlCi0gKiBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KLSAqLwotc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAotCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICplbmRwb2ludDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQgPSBOVUxMOwotCi0JaWYgKCFwYXJlbnQpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCFwcmV2KSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQkJLyoKLQkJICogSXQncyB0aGUgZmlyc3QgY2FsbCwgd2UgaGF2ZSB0byBmaW5kIGEgcG9ydCBzdWJub2RlCi0JCSAqIHdpdGhpbiB0aGlzIG5vZGUgb3Igd2l0aGluIGFuIG9wdGlvbmFsICdwb3J0cycgbm9kZS4KLQkJICovCi0JCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwYXJlbnQsICJwb3J0cyIpOwotCQlpZiAobm9kZSkKLQkJCXBhcmVudCA9IG5vZGU7Ci0KLQkJcG9ydCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBhcmVudCwgInBvcnQiKTsKLQotCQlpZiAocG9ydCkgewotCQkJLyogRm91bmQgYSBwb3J0LCBnZXQgYW4gZW5kcG9pbnQuICovCi0JCQllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIE5VTEwpOwotCQkJb2Zfbm9kZV9wdXQocG9ydCk7Ci0JCX0gZWxzZSB7Ci0JCQllbmRwb2ludCA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoIWVuZHBvaW50KQotCQkJcHJfZXJyKCIlcygpOiBubyBlbmRwb2ludCBub2RlcyBzcGVjaWZpZWQgZm9yICVzXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBwYXJlbnQtPmZ1bGxfbmFtZSk7Ci0JCW9mX25vZGVfcHV0KG5vZGUpOwotCX0gZWxzZSB7Ci0JCXBvcnQgPSBvZl9nZXRfcGFyZW50KHByZXYpOwotCQlpZiAoIXBvcnQpCi0JCQkvKiBIbSwgaGFzIHNvbWVvbmUgZ2l2ZW4gdXMgdGhlIHJvb3Qgbm9kZSA/Li4uICovCi0JCQlyZXR1cm4gTlVMTDsKLQotCQkvKiBBdm9pZCBkcm9wcGluZyBwcmV2IG5vZGUgcmVmY291bnQgdG8gMC4gKi8KLQkJb2Zfbm9kZV9nZXQocHJldik7Ci0JCWVuZHBvaW50ID0gb2ZfZ2V0X25leHRfY2hpbGQocG9ydCwgcHJldik7Ci0JCWlmIChlbmRwb2ludCkgewotCQkJb2Zfbm9kZV9wdXQocG9ydCk7Ci0JCQlyZXR1cm4gZW5kcG9pbnQ7Ci0JCX0KLQotCQkvKiBObyBtb3JlIGVuZHBvaW50cyB1bmRlciB0aGlzIHBvcnQsIHRyeSB0aGUgbmV4dCBvbmUuICovCi0JCWRvIHsKLQkJCXBvcnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIHBvcnQpOwotCQkJaWYgKCFwb3J0KQotCQkJCXJldHVybiBOVUxMOwotCQl9IHdoaWxlIChvZl9ub2RlX2NtcChwb3J0LT5uYW1lLCAicG9ydCIpKTsKLQotCQkvKiBQaWNrIHVwIHRoZSBmaXJzdCBlbmRwb2ludCBpbiB0aGlzIHBvcnQuICovCi0JCWVuZHBvaW50ID0gb2ZfZ2V0X25leHRfY2hpbGQocG9ydCwgTlVMTCk7Ci0JCW9mX25vZGVfcHV0KHBvcnQpOwotCX0KLQotCXJldHVybiBlbmRwb2ludDsKLX0KLUVYUE9SVF9TWU1CT0wodjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludCk7Ci0KLS8qKgotICogdjRsMl9vZl9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KCkgLSBnZXQgcmVtb3RlIHBvcnQncyBwYXJlbnQgbm9kZQotICogQG5vZGU6IHBvaW50ZXIgdG8gYSBsb2NhbCBlbmRwb2ludCBkZXZpY2Vfbm9kZQotICoKLSAqIFJldHVybjogUmVtb3RlIGRldmljZSBub2RlIGFzc29jaWF0ZWQgd2l0aCByZW1vdGUgZW5kcG9pbnQgbm9kZSBsaW5rZWQKLSAqCSAgIHRvIEBub2RlLiBVc2Ugb2Zfbm9kZV9wdXQoKSBvbiBpdCB3aGVuIGRvbmUuCi0gKi8KLXN0cnVjdCBkZXZpY2Vfbm9kZSAqdjRsMl9vZl9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXVuc2lnbmVkIGludCBkZXB0aDsKLQotCS8qIEdldCByZW1vdGUgZW5kcG9pbnQgbm9kZS4gKi8KLQlucCA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgInJlbW90ZS1lbmRwb2ludCIsIDApOwotCi0JLyogV2FsayAzIGxldmVscyB1cCBvbmx5IGlmIHRoZXJlIGlzICdwb3J0cycgbm9kZS4gKi8KLQlmb3IgKGRlcHRoID0gMzsgZGVwdGggJiYgbnA7IGRlcHRoLS0pIHsKLQkJbnAgPSBvZl9nZXRfbmV4dF9wYXJlbnQobnApOwotCQlpZiAoZGVwdGggPT0gMiAmJiBvZl9ub2RlX2NtcChucC0+bmFtZSwgInBvcnRzIikpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIG5wOwotfQotRVhQT1JUX1NZTUJPTCh2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQpOwotCi0vKioKLSAqIHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KCkgLSBnZXQgcmVtb3RlIHBvcnQgbm9kZQotICogQG5vZGU6IHBvaW50ZXIgdG8gYSBsb2NhbCBlbmRwb2ludCBkZXZpY2Vfbm9kZQotICoKLSAqIFJldHVybjogUmVtb3RlIHBvcnQgbm9kZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIGVuZHBvaW50IG5vZGUgbGlua2VkCi0gKgkgICB0byBAbm9kZS4gVXNlIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JLyogR2V0IHJlbW90ZSBlbmRwb2ludCBub2RlLiAqLwotCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAicmVtb3RlLWVuZHBvaW50IiwgMCk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG9mX2dldF9uZXh0X3BhcmVudChucCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLWNvbnRpZy5jCmluZGV4IDMzZDM4NzFkLi44ODBiZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLWNvbnRpZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMKQEAgLTcxOSw3ICs3MTksNyBAQAogCiAJLyogZ2V0IHRoZSBhc3NvY2lhdGVkIHNjYXR0ZXJsaXN0IGZvciB0aGlzIGJ1ZmZlciAqLwogCXNndCA9IGRtYV9idWZfbWFwX2F0dGFjaG1lbnQoYnVmLT5kYl9hdHRhY2gsIGJ1Zi0+ZG1hX2Rpcik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKHNndCkpIHsKKwlpZiAoSVNfRVJSKHNndCkpIHsKIAkJcHJfZXJyKCJFcnJvciBnZXR0aW5nIGRtYWJ1ZiBzY2F0dGVybGlzdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtb3J5L0tjb25maWcgYi9kcml2ZXJzL21lbW9yeS9LY29uZmlnCmluZGV4IDI5YTExZGIuLmM1OWU5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtb3J5L0tjb25maWcKKysrIGIvZHJpdmVycy9tZW1vcnkvS2NvbmZpZwpAQCAtNyw2ICs3LDE3IEBACiAKIGlmIE1FTU9SWQogCitjb25maWcgVElfQUVNSUYKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQUVNSUYgZHJpdmVyIgorCWRlcGVuZHMgb24gKEFSQ0hfREFWSU5DSSB8fCBBUkNIX0tFWVNUT05FKSAmJiBPRgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgQUVNSUYgbW9kdWxlIGF2YWlsYWJsZSBpbiBUZXhhcyBJbnN0cnVtZW50cworCSAgU29Dcy4gQUVNSUYgc3RhbmRzIGZvciBBc3luY2hyb25vdXMgRXh0ZXJuYWwgTWVtb3J5IEludGVyZmFjZSBhbmQKKwkgIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSBnbHVlLWxlc3MgaW50ZXJmYWNlIHRvIGEgdmFyaWV0eSBvZgorCSAgYXN5bmNocm9udW91cyBtZW1vcnkgZGV2aWNlcyBsaWtlIEFTUkFNLCBOT1IgYW5kIE5BTkQgbWVtb3J5LiBBIHRvdGFsCisJICBvZiAyNTZNIGJ5dGVzIG9mIGFueSBvZiB0aGVzZSBtZW1vcmllcyBjYW4gYmUgYWNjZXNzZWQgYXQgYSBnaXZlbgorCSAgdGltZSB2aWEgZm91ciBjaGlwIHNlbGVjdHMgd2l0aCA2NE0gYnl0ZSBhY2Nlc3MgcGVyIGNoaXAgc2VsZWN0LgorCiBjb25maWcgVElfRU1JRgogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBFTUlGIGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTCkBAIC01MCw0ICs2MSw4IEBACiAJICBhbmFseXNpcywgZXNwZWNpYWxseSBmb3IgSU9NTVUvU01NVShTeXN0ZW0gTWVtb3J5IE1hbmFnZW1lbnQKIAkgIFVuaXQpIG1vZHVsZS4KIAorY29uZmlnIEZTTF9JRkMKKwlib29sCisJZGVwZW5kcyBvbiBGU0xfU09DCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVtb3J5L01ha2VmaWxlCmluZGV4IDk2OWQ5MjMuLjcxMTYwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtb3J5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVtb3J5L01ha2VmaWxlCkBAIC01LDcgKzUsOSBAQAogaWZlcSAoJChDT05GSUdfRERSKSx5KQogb2JqLSQoQ09ORklHX09GKQkJKz0gb2ZfbWVtb3J5Lm8KIGVuZGlmCitvYmotJChDT05GSUdfVElfQUVNSUYpCQkrPSB0aS1hZW1pZi5vCiBvYmotJChDT05GSUdfVElfRU1JRikJCSs9IGVtaWYubworb2JqLSQoQ09ORklHX0ZTTF9JRkMpCQkrPSBmc2xfaWZjLm8KIG9iai0kKENPTkZJR19NVkVCVV9ERVZCVVMpCSs9IG12ZWJ1LWRldmJ1cy5vCiBvYmotJChDT05GSUdfVEVHUkEyMF9NQykJKz0gdGVncmEyMC1tYy5vCiBvYmotJChDT05GSUdfVEVHUkEzMF9NQykJKz0gdGVncmEzMC1tYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS9mc2xfaWZjLmMgYi9kcml2ZXJzL21lbW9yeS9mc2xfaWZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZDc5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVtb3J5L2ZzbF9pZmMuYwpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKKyAqCisgKiBGcmVlc2NhbGUgSW50ZWdyYXRlZCBGbGFzaCBDb250cm9sbGVyCisgKgorICogQXV0aG9yOiBEaXBlbiBEdWRoYXQgPERpcGVuLkR1ZGhhdEBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9pZmMuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitzdHJ1Y3QgZnNsX2lmY19jdHJsICpmc2xfaWZjX2N0cmxfZGV2OworRVhQT1JUX1NZTUJPTChmc2xfaWZjX2N0cmxfZGV2KTsKKworLyoKKyAqIGNvbnZlcnRfaWZjX2FkZHJlc3MgLSBjb252ZXJ0IHRoZSBiYXNlIGFkZHJlc3MKKyAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsKKyAqLwordW5zaWduZWQgaW50IGNvbnZlcnRfaWZjX2FkZHJlc3MocGh5c19hZGRyX3QgYWRkcl9iYXNlKQoreworCXJldHVybiBhZGRyX2Jhc2UgJiBDU1BSX0JBOworfQorRVhQT1JUX1NZTUJPTChjb252ZXJ0X2lmY19hZGRyZXNzKTsKKworLyoKKyAqIGZzbF9pZmNfZmluZCAtIGZpbmQgSUZDIGJhbmsKKyAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIElGQyBiYW5rcyBjb21wYXJpbmcgIkJhc2UgYWRkcmVzcyIgZmllbGQgb2YgdGhlIENTUFIKKyAqIHJlZ2lzdGVycyB3aXRoIHRoZSBzdXBwbGllZCBhZGRyX2Jhc2UgYXJndW1lbnQuIFdoZW4gYmFzZXMgbWF0Y2ggdGhpcworICogZnVuY3Rpb24gcmV0dXJucyBiYW5rIG51bWJlciAoc3RhcnRpbmcgd2l0aCAwKSwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlLgorICovCitpbnQgZnNsX2lmY19maW5kKHBoeXNfYWRkcl90IGFkZHJfYmFzZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWZzbF9pZmNfY3RybF9kZXYgfHwgIWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX2lmY19jdHJsX2Rldi0+cmVncy0+Y3Nwcl9jcyk7IGkrKykgeworCQl1MzIgY3NwciA9IGluX2JlMzIoJmZzbF9pZmNfY3RybF9kZXYtPnJlZ3MtPmNzcHJfY3NbaV0uY3Nwcik7CisJCWlmIChjc3ByICYgQ1NQUl9WICYmIChjc3ByICYgQ1NQUl9CQSkgPT0KKwkJCQljb252ZXJ0X2lmY19hZGRyZXNzKGFkZHJfYmFzZSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KK0VYUE9SVF9TWU1CT0woZnNsX2lmY19maW5kKTsKKworc3RhdGljIGludCBmc2xfaWZjX2N0cmxfaW5pdChzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsKQoreworCXN0cnVjdCBmc2xfaWZjX3JlZ3MgX19pb21lbSAqaWZjID0gY3RybC0+cmVnczsKKworCS8qCisJICogQ2xlYXIgYWxsIHRoZSBjb21tb24gc3RhdHVzIGFuZCBldmVudCByZWdpc3RlcnMKKwkgKi8KKwlpZiAoaW5fYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0KSAmIElGQ19DTV9FVlRFUl9TVEFUX0NTRVIpCisJCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX3N0YXQsIElGQ19DTV9FVlRFUl9TVEFUX0NTRVIpOworCisJLyogZW5hYmxlIGFsbCBlcnJvciBhbmQgZXZlbnRzICovCisJb3V0X2JlMzIoJmlmYy0+Y21fZXZ0ZXJfZW4sIElGQ19DTV9FVlRFUl9FTl9DU0VSRU4pOworCisJLyogZW5hYmxlIGFsbCBlcnJvciBhbmQgZXZlbnQgaW50ZXJydXB0cyAqLworCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX2ludHJfZW4sIElGQ19DTV9FVlRFUl9JTlRSX0VOX0NTRVJJUkVOKTsKKwlvdXRfYmUzMigmaWZjLT5jbV9lcmF0dHIwLCAweDApOworCW91dF9iZTMyKCZpZmMtPmNtX2VyYXR0cjEsIDB4MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfaWZjX2N0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisKKwlmcmVlX2lycShjdHJsLT5uYW5kX2lycSwgY3RybCk7CisJZnJlZV9pcnEoY3RybC0+aXJxLCBjdHJsKTsKKworCWlycV9kaXNwb3NlX21hcHBpbmcoY3RybC0+bmFuZF9pcnEpOworCWlycV9kaXNwb3NlX21hcHBpbmcoY3RybC0+aXJxKTsKKworCWlvdW5tYXAoY3RybC0+cmVncyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwlrZnJlZShjdHJsKTsKKworCXJldHVybiAwOworfQorCisvKgorICogTkFORCBldmVudHMgYXJlIHNwbGl0IGJldHdlZW4gYW4gb3BlcmF0aW9uYWwgaW50ZXJydXB0IHdoaWNoIG9ubHkKKyAqIHJlY2VpdmVzIE9QQywgYW5kIGFuIGVycm9yIGludGVycnVwdCB0aGF0IHJlY2VpdmVzIGV2ZXJ5dGhpbmcgZWxzZSwKKyAqIGluY2x1ZGluZyBub24tTkFORCBlcnJvcnMuICBXaGljaGV2ZXIgaW50ZXJydXB0IGdldHMgdG8gaXQgZmlyc3QKKyAqIHJlY29yZHMgdGhlIHN0YXR1cyBhbmQgd2FrZXMgdGhlIHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmFuZF9pcnFfbG9jayk7CisKK3N0YXRpYyB1MzIgY2hlY2tfbmFuZF9zdGF0KHN0cnVjdCBmc2xfaWZjX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGZzbF9pZmNfcmVncyBfX2lvbWVtICppZmMgPSBjdHJsLT5yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHN0YXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmFuZF9pcnFfbG9jaywgZmxhZ3MpOworCisJc3RhdCA9IGluX2JlMzIoJmlmYy0+aWZjX25hbmQubmFuZF9ldnRlcl9zdGF0KTsKKwlpZiAoc3RhdCkgeworCQlvdXRfYmUzMigmaWZjLT5pZmNfbmFuZC5uYW5kX2V2dGVyX3N0YXQsIHN0YXQpOworCQljdHJsLT5uYW5kX3N0YXQgPSBzdGF0OworCQl3YWtlX3VwKCZjdHJsLT5uYW5kX3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5hbmRfaXJxX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2lmY19uYW5kX2lycShpbnQgaXJxbm8sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRhdGE7CisKKwlpZiAoY2hlY2tfbmFuZF9zdGF0KGN0cmwpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qCisgKiBOT1RFOiBUaGlzIGludGVycnVwdCBpcyB1c2VkIHRvIHJlcG9ydCBpZmMgZXZlbnRzIG9mIHZhcmlvdXMga2luZHMsCisgKiBzdWNoIGFzIHRyYW5zYWN0aW9uIGVycm9ycyBvbiB0aGUgY2hpcHNlbGVjdHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2xfaWZjX2N0cmxfaXJxKGludCBpcnFubywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsID0gZGF0YTsKKwlzdHJ1Y3QgZnNsX2lmY19yZWdzIF9faW9tZW0gKmlmYyA9IGN0cmwtPnJlZ3M7CisJdTMyIGVycl9heGlpZCwgZXJyX3NyY2lkLCBzdGF0dXMsIGNzX2VyciwgZXJyX2FkZHI7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwkvKiByZWFkIGZvciBjaGlwIHNlbGVjdCBlcnJvciAqLworCWNzX2VyciA9IGluX2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCk7CisJaWYgKGNzX2VycikgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgInRyYW5zYWN0aW9uIHNlbnQgdG8gSUZDIGlzIG5vdCBtYXBwZWQgdG8iCisJCQkJImFueSBtZW1vcnkgYmFuayAweCUwOFhcbiIsIGNzX2Vycik7CisJCS8qIGNsZWFyIHRoZSBjaGlwIHNlbGVjdCBlcnJvciAqLworCQlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0LCBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKTsKKworCQkvKiByZWFkIGVycm9yIGF0dHJpYnV0ZSByZWdpc3RlcnMgcHJpbnQgdGhlIGVycm9yIGluZm9ybWF0aW9uICovCisJCXN0YXR1cyA9IGluX2JlMzIoJmlmYy0+Y21fZXJhdHRyMCk7CisJCWVycl9hZGRyID0gaW5fYmUzMigmaWZjLT5jbV9lcmF0dHIxKTsKKworCQlpZiAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVJUWVBfUkVBRCkKKwkJCWRldl9lcnIoY3RybC0+ZGV2LCAiUmVhZCB0cmFuc2FjdGlvbiBlcnJvciIKKwkJCQkiQ01fRVJBVFRSMCAweCUwOFhcbiIsIHN0YXR1cyk7CisJCWVsc2UKKwkJCWRldl9lcnIoY3RybC0+ZGV2LCAiV3JpdGUgdHJhbnNhY3Rpb24gZXJyb3IiCisJCQkJIkNNX0VSQVRUUjAgMHglMDhYXG4iLCBzdGF0dXMpOworCisJCWVycl9heGlpZCA9IChzdGF0dXMgJiBJRkNfQ01fRVJBVFRSMF9FUkFJRCkgPj4KKwkJCQkJSUZDX0NNX0VSQVRUUjBfRVJBSURfU0hJRlQ7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiQVhJIElEIG9mIHRoZSBlcnJvciIKKwkJCQkJInRyYW5zYWN0aW9uIDB4JTA4WFxuIiwgZXJyX2F4aWlkKTsKKworCQllcnJfc3JjaWQgPSAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVNSQ0lEKSA+PgorCQkJCQlJRkNfQ01fRVJBVFRSMF9FU1JDSURfU0hJRlQ7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiU1JDIElEIG9mIHRoZSBlcnJvciIKKwkJCQkJInRyYW5zYWN0aW9uIDB4JTA4WFxuIiwgZXJyX3NyY2lkKTsKKworCQlkZXZfZXJyKGN0cmwtPmRldiwgIlRyYW5zYWN0aW9uIEFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBlcnJvciIKKwkJCQkJIkVSQUREUiAweCUwOFhcbiIsIGVycl9hZGRyKTsKKworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoY2hlY2tfbmFuZF9zdGF0KGN0cmwpKQorCQlyZXQgPSBJUlFfSEFORExFRDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBmc2xfaWZjX2N0cmxfcHJvYmUKKyAqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGxheWVyIHdoZW4gaXQgZmluZHMgYSBkZXZpY2UgbWF0Y2hpbmcKKyAqIG9uZSBvdXIgZHJpdmVyIGNhbiBoYW5kbGVkLiBUaGlzIGNvZGUgYWxsb2NhdGVzIGFsbCBvZgorICogdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIHRoZSBjb250cm9sbGVyIG9ubHkuICBUaGUKKyAqIHJlc291cmNlcyBmb3IgdGhlIE5BTkQgYmFua3MgdGhlbXNlbHZlcyBhcmUgYWxsb2NhdGVkCisgKiBpbiB0aGUgY2hpcCBwcm9iZSBmdW5jdGlvbi4KKyovCitzdGF0aWMgaW50IGZzbF9pZmNfY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKworCWRldl9pbmZvKCZkZXYtPmRldiwgIkZyZWVzY2FsZSBJbnRlZ3JhdGVkIEZsYXNoIENvbnRyb2xsZXJcbiIpOworCisJZnNsX2lmY19jdHJsX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpmc2xfaWZjX2N0cmxfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmc2xfaWZjX2N0cmxfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGZzbF9pZmNfY3RybF9kZXYpOworCisJLyogSU9NQVAgdGhlIGVudGlyZSBJRkMgcmVnaW9uICovCisJZnNsX2lmY19jdHJsX2Rldi0+cmVncyA9IG9mX2lvbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDApOworCWlmICghZnNsX2lmY19jdHJsX2Rldi0+cmVncykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGdldCB0aGUgQ29udHJvbGxlciBsZXZlbCBpcnEgKi8KKwlmc2xfaWZjX2N0cmxfZGV2LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAoZnNsX2lmY19jdHJsX2Rldi0+aXJxID09IE5PX0lSUSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlICIKKwkJCQkJCQkiZm9yIElGQ1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGdldCB0aGUgbmFuZCBtYWNoaW5lIGlycSAqLworCWZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxID0KKwkJCWlycV9vZl9wYXJzZV9hbmRfbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDEpOworCisJZnNsX2lmY19jdHJsX2Rldi0+ZGV2ID0gJmRldi0+ZGV2OworCisJcmV0ID0gZnNsX2lmY19jdHJsX2luaXQoZnNsX2lmY19jdHJsX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZnNsX2lmY19jdHJsX2Rldi0+bmFuZF93YWl0KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGZzbF9pZmNfY3RybF9kZXYtPmlycSwgZnNsX2lmY19jdHJsX2lycSwgSVJRRl9TSEFSRUQsCisJCQkgICJmc2wtaWZjIiwgZnNsX2lmY19jdHJsX2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsCisJCQlmc2xfaWZjX2N0cmxfZGV2LT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJaWYgKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxLCBmc2xfaWZjX25hbmRfaXJxLAorCQkJCTAsICJmc2wtaWZjLW5hbmQiLCBmc2xfaWZjX2N0cmxfZGV2KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLAorCQkJCWZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKTsKKwkJCWdvdG8gZXJyX25hbmRpcnE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX25hbmRpcnE6CisJZnJlZV9pcnEoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEsIGZzbF9pZmNfY3RybF9kZXYpOworCWlycV9kaXNwb3NlX21hcHBpbmcoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEpOworZXJyX2lycToKKwlmcmVlX2lycShmc2xfaWZjX2N0cmxfZGV2LT5pcnEsIGZzbF9pZmNfY3RybF9kZXYpOworCWlycV9kaXNwb3NlX21hcHBpbmcoZnNsX2lmY19jdHJsX2Rldi0+aXJxKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfaWZjX21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJmc2wsaWZjIiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX2lmY19jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJmc2wtaWZjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZnNsX2lmY19tYXRjaCwKKwl9LAorCS5wcm9iZSAgICAgICA9IGZzbF9pZmNfY3RybF9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBmc2xfaWZjX2N0cmxfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX2lmY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX2lmY19jdHJsX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwoZnNsX2lmY19pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIEludGVncmF0ZWQgRmxhc2ggQ29udHJvbGxlciBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtb3J5L3RpLWFlbWlmLmMgYi9kcml2ZXJzL21lbW9yeS90aS1hZW1pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGY3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lbW9yeS90aS1hZW1pZi5jCkBAIC0wLDAgKzEsNDI3IEBACisvKgorICogVEkgQUVNSUYgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQuIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIEF1dGhvcnM6CisgKiBNdXJhbGkgS2FyaWNoZXJpIDxtLWthcmljaGVyaTJAdGkuY29tPgorICogSXZhbiBLaG9yb256aHVrIDxpdmFuLmtob3JvbnpodWtAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIFRBX1NISUZUCTIKKyNkZWZpbmUgUkhPTERfU0hJRlQJNAorI2RlZmluZSBSU1RST0JFX1NISUZUCTcKKyNkZWZpbmUgUlNFVFVQX1NISUZUCTEzCisjZGVmaW5lIFdIT0xEX1NISUZUCTE3CisjZGVmaW5lIFdTVFJPQkVfU0hJRlQJMjAKKyNkZWZpbmUgV1NFVFVQX1NISUZUCTI2CisjZGVmaW5lIEVXX1NISUZUCTMwCisjZGVmaW5lIFNTX1NISUZUCTMxCisKKyNkZWZpbmUgVEEoeCkJCSgoeCkgPDwgVEFfU0hJRlQpCisjZGVmaW5lIFJIT0xEKHgpCSgoeCkgPDwgUkhPTERfU0hJRlQpCisjZGVmaW5lIFJTVFJPQkUoeCkJKCh4KSA8PCBSU1RST0JFX1NISUZUKQorI2RlZmluZSBSU0VUVVAoeCkJKCh4KSA8PCBSU0VUVVBfU0hJRlQpCisjZGVmaW5lIFdIT0xEKHgpCSgoeCkgPDwgV0hPTERfU0hJRlQpCisjZGVmaW5lIFdTVFJPQkUoeCkJKCh4KSA8PCBXU1RST0JFX1NISUZUKQorI2RlZmluZSBXU0VUVVAoeCkJKCh4KSA8PCBXU0VUVVBfU0hJRlQpCisjZGVmaW5lIEVXKHgpCQkoKHgpIDw8IEVXX1NISUZUKQorI2RlZmluZSBTUyh4KQkJKCh4KSA8PCBTU19TSElGVCkKKworI2RlZmluZSBBU0laRV9NQVgJMHgxCisjZGVmaW5lIFRBX01BWAkJMHgzCisjZGVmaW5lIFJIT0xEX01BWAkweDcKKyNkZWZpbmUgUlNUUk9CRV9NQVgJMHgzZgorI2RlZmluZSBSU0VUVVBfTUFYCTB4ZgorI2RlZmluZSBXSE9MRF9NQVgJMHg3CisjZGVmaW5lIFdTVFJPQkVfTUFYCTB4M2YKKyNkZWZpbmUgV1NFVFVQX01BWAkweGYKKyNkZWZpbmUgRVdfTUFYCQkweDEKKyNkZWZpbmUgU1NfTUFYCQkweDEKKyNkZWZpbmUgTlVNX0NTCQk0CisKKyNkZWZpbmUgVEFfVkFMKHgpCSgoKHgpICYgVEEoVEFfTUFYKSkgPj4gVEFfU0hJRlQpCisjZGVmaW5lIFJIT0xEX1ZBTCh4KQkoKCh4KSAmIFJIT0xEKFJIT0xEX01BWCkpID4+IFJIT0xEX1NISUZUKQorI2RlZmluZSBSU1RST0JFX1ZBTCh4KQkoKCh4KSAmIFJTVFJPQkUoUlNUUk9CRV9NQVgpKSA+PiBSU1RST0JFX1NISUZUKQorI2RlZmluZSBSU0VUVVBfVkFMKHgpCSgoKHgpICYgUlNFVFVQKFJTRVRVUF9NQVgpKSA+PiBSU0VUVVBfU0hJRlQpCisjZGVmaW5lIFdIT0xEX1ZBTCh4KQkoKCh4KSAmIFdIT0xEKFdIT0xEX01BWCkpID4+IFdIT0xEX1NISUZUKQorI2RlZmluZSBXU1RST0JFX1ZBTCh4KQkoKCh4KSAmIFdTVFJPQkUoV1NUUk9CRV9NQVgpKSA+PiBXU1RST0JFX1NISUZUKQorI2RlZmluZSBXU0VUVVBfVkFMKHgpCSgoKHgpICYgV1NFVFVQKFdTRVRVUF9NQVgpKSA+PiBXU0VUVVBfU0hJRlQpCisjZGVmaW5lIEVXX1ZBTCh4KQkoKCh4KSAmIEVXKEVXX01BWCkpID4+IEVXX1NISUZUKQorI2RlZmluZSBTU19WQUwoeCkJKCgoeCkgJiBTUyhTU19NQVgpKSA+PiBTU19TSElGVCkKKworI2RlZmluZSBOUkNTUl9PRkZTRVQJMHgwMAorI2RlZmluZSBBV0NDUl9PRkZTRVQJMHgwNAorI2RlZmluZSBBMUNSX09GRlNFVAkweDEwCisKKyNkZWZpbmUgQUNSX0FTSVpFX01BU0sJMHgzCisjZGVmaW5lIEFDUl9FV19NQVNLCUJJVCgzMCkKKyNkZWZpbmUgQUNSX1NTX01BU0sJQklUKDMxKQorI2RlZmluZSBBU0laRV8xNkJJVAkxCisKKyNkZWZpbmUgQ09ORklHX01BU0sJKFRBKFRBX01BWCkgfCBcCisJCQkJUkhPTEQoUkhPTERfTUFYKSB8IFwKKwkJCQlSU1RST0JFKFJTVFJPQkVfTUFYKSB8CVwKKwkJCQlSU0VUVVAoUlNFVFVQX01BWCkgfCBcCisJCQkJV0hPTEQoV0hPTERfTUFYKSB8IFwKKwkJCQlXU1RST0JFKFdTVFJPQkVfTUFYKSB8IFwKKwkJCQlXU0VUVVAoV1NFVFVQX01BWCkgfCBcCisJCQkJRVcoRVdfTUFYKSB8IFNTKFNTX01BWCkgfCBcCisJCQkJQVNJWkVfTUFYKQorCisvKioKKyAqIHN0cnVjdCBhZW1pZl9jc19kYXRhOiBzdHJ1Y3R1cmUgdG8gaG9sZCBjcyBwYXJhbWV0ZXJzCisgKiBAY3M6IGNoaXAtc2VsZWN0IG51bWJlcgorICogQHdzdHJvYmU6IHdyaXRlIHN0cm9iZSB3aWR0aCwgbnMKKyAqIEByc3Ryb2JlOiByZWFkIHN0cm9iZSB3aWR0aCwgbnMKKyAqIEB3c2V0dXA6IHdyaXRlIHNldHVwIHdpZHRoLCBucworICogQHdob2xkOiB3cml0ZSBob2xkIHdpZHRoLCBucworICogQHJzZXR1cDogcmVhZCBzZXR1cCB3aWR0aCwgbnMKKyAqIEByaG9sZDogcmVhZCBob2xkIHdpZHRoLCBucworICogQHRhOiBtaW5pbXVtIHR1cm4gYXJvdW5kIHRpbWUsIG5zCisgKiBAZW5hYmxlX3NzOiBlbmFibGUvZGlzYWJsZSBzZWxlY3Qgc3Ryb2JlIG1vZGUKKyAqIEBlbmFibGVfZXc6IGVuYWJsZS9kaXNhYmxlIGV4dGVuZGVkIHdhaXQgbW9kZQorICogQGFzaXplOiB3aWR0aCBvZiB0aGUgYXN5bmNocm9ub3VzIGRldmljZSdzIGRhdGEgYnVzCisgKi8KK3N0cnVjdCBhZW1pZl9jc19kYXRhIHsKKwl1OAljczsKKwl1MTYJd3N0cm9iZTsKKwl1MTYJcnN0cm9iZTsKKwl1OAl3c2V0dXA7CisJdTgJd2hvbGQ7CisJdTgJcnNldHVwOworCXU4CXJob2xkOworCXU4CXRhOworCXU4CWVuYWJsZV9zczsKKwl1OAllbmFibGVfZXc7CisJdTgJYXNpemU7Cit9OworCisvKioKKyAqIHN0cnVjdCBhZW1pZl9kZXZpY2U6IHN0cnVjdHVyZSB0byBob2xkIGRldmljZSBkYXRhCisgKiBAYmFzZTogYmFzZSBhZGRyZXNzIG9mIEFFTUlGIHJlZ2lzdGVycworICogQGNsazogc291cmNlIGNsb2NrCisgKiBAY2xrX3JhdGU6IGNsb2NrJ3MgcmF0ZSBpbiBrSHoKKyAqIEBudW1fY3M6IG51bWJlciBvZiBhc3NpZ25lZCBjaGlwLXNlbGVjdHMKKyAqIEBjc19vZmZzZXQ6IHN0YXJ0IG51bWJlciBvZiBjcyBub2RlcworICogQGNzX2RhdGE6IGFycmF5IG9mIGNoaXAtc2VsZWN0IHNldHRpbmdzCisgKi8KK3N0cnVjdCBhZW1pZl9kZXZpY2UgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZTsKKwl1OCBudW1fY3M7CisJaW50IGNzX29mZnNldDsKKwlzdHJ1Y3QgYWVtaWZfY3NfZGF0YSBjc19kYXRhW05VTV9DU107Cit9OworCisvKioKKyAqIGFlbWlmX2NhbGNfcmF0ZSAtIGNhbGN1bGF0ZSB0aW1pbmcgZGF0YS4KKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gY2FsY3VsYXRlIGZvcgorICogQHdhbnRlZDogVGhlIGN5Y2xlIHRpbWUgbmVlZGVkIGluIG5hbm9zZWNvbmRzLgorICogQGNsazogVGhlIGlucHV0IGNsb2NrIHJhdGUgaW4ga0h6LgorICogQG1heDogVGhlIG1heGltdW0gZGl2aWRlciB2YWx1ZSB0aGF0IGNhbiBiZSBwcm9ncmFtbWVkLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdGltaW5nIHZhbHVlIG1pbnVzIDEgZm9yIGVhc3kKKyAqIHByb2dyYW1taW5nIGludG8gQUVNSUYgdGltaW5nIHJlZ2lzdGVycywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBhZW1pZl9jYWxjX3JhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHdhbnRlZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY2xrLCBpbnQgbWF4KQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBESVZfUk9VTkRfVVAoKHdhbnRlZCAqIGNsayksIE5TRUNfUEVSX01TRUMpIC0gMTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiByZXN1bHQgJWQgZnJvbSAlbGQsICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0LAorCQljbGssIHdhbnRlZCk7CisKKwkvKiBJdCBpcyBnZW5lcmFsbHkgT0sgdG8gaGF2ZSBhIG1vcmUgcmVsYXhlZCB0aW1pbmcgdGhhbiByZXF1ZXN0ZWQuLi4gKi8KKwlpZiAocmVzdWx0IDwgMCkKKwkJcmVzdWx0ID0gMDsKKworCS8qIC4uLiBCdXQgY29uZmlndXJpbmcgdGlnaHRlciB0aW1pbmdzIGlzIG5vdCBhbiBvcHRpb24uICovCisJZWxzZSBpZiAocmVzdWx0ID4gbWF4KQorCQlyZXN1bHQgPSAtRUlOVkFMOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBhZW1pZl9jb25maWdfYWJ1cyAtIGNvbmZpZ3VyZSBhc3luYyBidXMgcGFyYW1ldGVycworICogQHBkZXY6IHBsYXRmb3JtIGRldmljZSB0byBjb25maWd1cmUgZm9yCisgKiBAY3NudW06IGFlbWlmIGNoaXAgc2VsZWN0IG51bWJlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvZ3JhbXMgdGhlIGdpdmVuIHRpbWluZyB2YWx1ZXMgKGluIHJlYWwgY2xvY2spIGludG8gdGhlCisgKiBBRU1JRiByZWdpc3RlcnMgdGFraW5nIHRoZSBBRU1JRiBjbG9jayBpbnRvIGFjY291bnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgYW55IGxvY2tpbmcgd2hpbGUgcHJvZ3JhbW1pbmcgdGhlIEFFTUlGCisgKiBiZWNhdXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgdXNlciBvZiBhIGdpdmVuCisgKiBjaGlwLXNlbGVjdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBhZW1pZl9jb25maWdfYWJ1cyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgY3NudW0pCit7CisJc3RydWN0IGFlbWlmX2RldmljZSAqYWVtaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWVtaWZfY3NfZGF0YSAqZGF0YSA9ICZhZW1pZi0+Y3NfZGF0YVtjc251bV07CisJaW50IHRhLCByaG9sZCwgcnN0cm9iZSwgcnNldHVwLCB3aG9sZCwgd3N0cm9iZSwgd3NldHVwOworCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGUgPSBhZW1pZi0+Y2xrX3JhdGU7CisJdW5zaWduZWQgb2Zmc2V0OworCXUzMiBzZXQsIHZhbDsKKworCW9mZnNldCA9IEExQ1JfT0ZGU0VUICsgKGRhdGEtPmNzIC0gYWVtaWYtPmNzX29mZnNldCkgKiA0OworCisJdGEJPSBhZW1pZl9jYWxjX3JhdGUocGRldiwgZGF0YS0+dGEsIGNsa19yYXRlLCBUQV9NQVgpOworCXJob2xkCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPnJob2xkLCBjbGtfcmF0ZSwgUkhPTERfTUFYKTsKKwlyc3Ryb2JlCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPnJzdHJvYmUsIGNsa19yYXRlLCBSU1RST0JFX01BWCk7CisJcnNldHVwCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPnJzZXR1cCwgY2xrX3JhdGUsIFJTRVRVUF9NQVgpOworCXdob2xkCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPndob2xkLCBjbGtfcmF0ZSwgV0hPTERfTUFYKTsKKwl3c3Ryb2JlCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPndzdHJvYmUsIGNsa19yYXRlLCBXU1RST0JFX01BWCk7CisJd3NldHVwCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPndzZXR1cCwgY2xrX3JhdGUsIFdTRVRVUF9NQVgpOworCisJaWYgKHRhIDwgMCB8fCByaG9sZCA8IDAgfHwgcnN0cm9iZSA8IDAgfHwgcnNldHVwIDwgMCB8fAorCSAgICB3aG9sZCA8IDAgfHwgd3N0cm9iZSA8IDAgfHwgd3NldHVwIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogY2Fubm90IGdldCBzdWl0YWJsZSB0aW1pbmdzXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzZXQgPSBUQSh0YSkgfCBSSE9MRChyaG9sZCkgfCBSU1RST0JFKHJzdHJvYmUpIHwgUlNFVFVQKHJzZXR1cCkgfAorCQlXSE9MRCh3aG9sZCkgfCBXU1RST0JFKHdzdHJvYmUpIHwgV1NFVFVQKHdzZXR1cCk7CisKKwlzZXQgfD0gKGRhdGEtPmFzaXplICYgQUNSX0FTSVpFX01BU0spOworCWlmIChkYXRhLT5lbmFibGVfZXcpCisJCXNldCB8PSBBQ1JfRVdfTUFTSzsKKwlpZiAoZGF0YS0+ZW5hYmxlX3NzKQorCQlzZXQgfD0gQUNSX1NTX01BU0s7CisKKwl2YWwgPSByZWFkbChhZW1pZi0+YmFzZSArIG9mZnNldCk7CisJdmFsICY9IH5DT05GSUdfTUFTSzsKKwl2YWwgfD0gc2V0OworCXdyaXRlbCh2YWwsIGFlbWlmLT5iYXNlICsgb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhZW1pZl9jeWNsZXNfdG9fbnNlYyhpbnQgdmFsLCB1bnNpZ25lZCBsb25nIGNsa19yYXRlKQoreworCXJldHVybiAoKHZhbCArIDEpICogTlNFQ19QRVJfTVNFQykgLyBjbGtfcmF0ZTsKK30KKworLyoqCisgKiBhZW1pZl9nZXRfaHdfcGFyYW1zIC0gZnVuY3Rpb24gdG8gcmVhZCBodyByZWdpc3RlciB2YWx1ZXMKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gcmVhZCBmb3IKKyAqIEBjc251bTogYWVtaWYgY2hpcCBzZWxlY3QgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgZGVmYXVsdHMgZnJvbSB0aGUgcmVnaXN0ZXJzIGFuZCB1cGRhdGUKKyAqIHRoZSB0aW1pbmcgdmFsdWVzLiBSZXF1aXJlZCBmb3IgZ2V0L3NldCBjb21tYW5kcyBhbmQgYWxzbyBmb3IKKyAqIHRoZSBjYXNlIHdoZW4gZHJpdmVyIG5lZWRzIHRvIHVzZSBkZWZhdWx0cyBpbiBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgYWVtaWZfZ2V0X2h3X3BhcmFtcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgY3NudW0pCit7CisJc3RydWN0IGFlbWlmX2RldmljZSAqYWVtaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWVtaWZfY3NfZGF0YSAqZGF0YSA9ICZhZW1pZi0+Y3NfZGF0YVtjc251bV07CisJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZSA9IGFlbWlmLT5jbGtfcmF0ZTsKKwl1MzIgdmFsLCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBBMUNSX09GRlNFVCArIChkYXRhLT5jcyAtIGFlbWlmLT5jc19vZmZzZXQpICogNDsKKwl2YWwgPSByZWFkbChhZW1pZi0+YmFzZSArIG9mZnNldCk7CisKKwlkYXRhLT50YSA9IGFlbWlmX2N5Y2xlc190b19uc2VjKFRBX1ZBTCh2YWwpLCBjbGtfcmF0ZSk7CisJZGF0YS0+cmhvbGQgPSBhZW1pZl9jeWNsZXNfdG9fbnNlYyhSSE9MRF9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPnJzdHJvYmUgPSBhZW1pZl9jeWNsZXNfdG9fbnNlYyhSU1RST0JFX1ZBTCh2YWwpLCBjbGtfcmF0ZSk7CisJZGF0YS0+cnNldHVwID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoUlNFVFVQX1ZBTCh2YWwpLCBjbGtfcmF0ZSk7CisJZGF0YS0+d2hvbGQgPSBhZW1pZl9jeWNsZXNfdG9fbnNlYyhXSE9MRF9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPndzdHJvYmUgPSBhZW1pZl9jeWNsZXNfdG9fbnNlYyhXU1RST0JFX1ZBTCh2YWwpLCBjbGtfcmF0ZSk7CisJZGF0YS0+d3NldHVwID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoV1NFVFVQX1ZBTCh2YWwpLCBjbGtfcmF0ZSk7CisJZGF0YS0+ZW5hYmxlX2V3ID0gRVdfVkFMKHZhbCk7CisJZGF0YS0+ZW5hYmxlX3NzID0gU1NfVkFMKHZhbCk7CisJZGF0YS0+YXNpemUgPSB2YWwgJiBBU0laRV9NQVg7Cit9CisKKy8qKgorICogb2ZfYWVtaWZfcGFyc2VfYWJ1c19jb25maWcgLSBwYXJzZSBDUyBjb25maWd1cmF0aW9uIGZyb20gRFQKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gcGFyc2UgZm9yCisgKiBAbnA6IGRldmljZSBub2RlIHB0cgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlIHRoZSBlbWlmIGFzeW5jIGJ1cyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZXMKKyAqIGNvbmZpZ3VyZWQgaW4gYSBjcyBkZXZpY2UgYmluZGluZyBub2RlLgorICovCitzdGF0aWMgaW50IG9mX2FlbWlmX3BhcnNlX2FidXNfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgYWVtaWZfZGV2aWNlICphZW1pZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhZW1pZl9jc19kYXRhICpkYXRhOworCXUzMiBjczsKKwl1MzIgdmFsOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtY2hpcHNlbGVjdCIsICZjcykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY3MgcHJvcGVydHkgaXMgcmVxdWlyZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNzIC0gYWVtaWYtPmNzX29mZnNldCA+PSBOVU1fQ1MgfHwgY3MgPCBhZW1pZi0+Y3Nfb2Zmc2V0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNzIG51bWJlciBpcyBpbmNvcnJlY3QgJWQiLCBjcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhZW1pZi0+bnVtX2NzID49IE5VTV9DUykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjcyBjb3VudCBpcyBtb3JlIHRoYW4gJWQiLCBOVU1fQ1MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0gJmFlbWlmLT5jc19kYXRhW2FlbWlmLT5udW1fY3NdOworCWRhdGEtPmNzID0gY3M7CisKKwkvKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSBodyByZWdpc3RlciAqLworCWFlbWlmX2dldF9od19wYXJhbXMocGRldiwgYWVtaWYtPm51bV9jcysrKTsKKworCS8qIG92ZXJyaWRlIHRoZSB2YWx1ZXMgZnJvbSBkZXZpY2Ugbm9kZSAqLworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy1taW4tdHVybmFyb3VuZC1ucyIsICZ2YWwpKQorCQlkYXRhLT50YSA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy1yZWFkLWhvbGQtbnMiLCAmdmFsKSkKKwkJZGF0YS0+cmhvbGQgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtcmVhZC1zdHJvYmUtbnMiLCAmdmFsKSkKKwkJZGF0YS0+cnN0cm9iZSA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy1yZWFkLXNldHVwLW5zIiwgJnZhbCkpCisJCWRhdGEtPnJzZXR1cCA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy13cml0ZS1ob2xkLW5zIiwgJnZhbCkpCisJCWRhdGEtPndob2xkID0gdmFsOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNzLXdyaXRlLXN0cm9iZS1ucyIsICZ2YWwpKQorCQlkYXRhLT53c3Ryb2JlID0gdmFsOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNzLXdyaXRlLXNldHVwLW5zIiwgJnZhbCkpCisJCWRhdGEtPndzZXR1cCA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy1idXMtd2lkdGgiLCAmdmFsKSkKKwkJaWYgKHZhbCA9PSAxNikKKwkJCWRhdGEtPmFzaXplID0gMTsKKwlkYXRhLT5lbmFibGVfZXcgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0aSxjcy1leHRlbmRlZC13YWl0LW1vZGUiKTsKKwlkYXRhLT5lbmFibGVfc3MgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0aSxjcy1zZWxlY3Qtc3Ryb2JlLW1vZGUiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWVtaWZfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLGRhdmluY2ktYWVtaWYiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksZGE4NTAtYWVtaWYiLCB9LAorCXt9LAorfTsKKworc3RhdGljIGludCBhZW1pZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCWludCByZXQgPSAtRU5PREVWOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkX25wOworCXN0cnVjdCBhZW1pZl9kZXZpY2UgKmFlbWlmOworCisJaWYgKG5wID09IE5VTEwpCisJCXJldHVybiAwOworCisJYWVtaWYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFlbWlmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZW1pZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhZW1pZik7CisKKwlhZW1pZi0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihhZW1pZi0+Y2xrKSkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBnZXQgY2xvY2sgJ2FlbWlmJ1xuIik7CisJCXJldHVybiBQVFJfRVJSKGFlbWlmLT5jbGspOworCX0KKworCWNsa19wcmVwYXJlX2VuYWJsZShhZW1pZi0+Y2xrKTsKKwlhZW1pZi0+Y2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoYWVtaWYtPmNsaykgLyBNU0VDX1BFUl9TRUM7CisKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ0aSxkYTg1MC1hZW1pZiIpKQorCQlhZW1pZi0+Y3Nfb2Zmc2V0ID0gMjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYWVtaWYtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoYWVtaWYtPmJhc2UpKSB7CisJCXJldCA9IFBUUl9FUlIoYWVtaWYtPmJhc2UpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJICogRm9yIGV2ZXJ5IGNvbnRyb2xsZXIgZGV2aWNlIG5vZGUsIHRoZXJlIGlzIGEgY3MgZGV2aWNlIG5vZGUgdGhhdAorCSAqIGRlc2NyaWJlIHRoZSBidXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiBUaGlzIGZ1bmN0aW9ucyBpdGVyYXRlCisJICogb3ZlciB0aGVzZSBub2RlcyBhbmQgdXBkYXRlIHRoZSBjcyBkYXRhIGFycmF5LgorCSAqLworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZF9ucCkgeworCQlyZXQgPSBvZl9hZW1pZl9wYXJzZV9hYnVzX2NvbmZpZyhwZGV2LCBjaGlsZF9ucCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYWVtaWYtPm51bV9jczsgaSsrKSB7CisJCXJldCA9IGFlbWlmX2NvbmZpZ19hYnVzKHBkZXYsIGkpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJFcnJvciBjb25maWd1cmluZyBjaGlwIHNlbGVjdCAlZFxuIiwKKwkJCQlhZW1pZi0+Y3NfZGF0YVtpXS5jcyk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBjaGlsZCBkZXZpY2VzIGV4cGxpY2l0bHkgZnJvbSBoZXJlIHRvCisJICogZ3VhcmFudGVlIHRoYXQgdGhlIGNoaWxkIHdpbGwgYmUgcHJvYmVkIGFmdGVyIHRoZSBBRU1JRiB0aW1pbmcKKwkgKiBwYXJhbWV0ZXJzIGFyZSBzZXQuCisJICovCisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobnAsIGNoaWxkX25wKSB7CisJCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKGNoaWxkX25wLCBOVUxMLCBOVUxMLCBkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CitlcnJvcjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoYWVtaWYtPmNsayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZW1pZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWVtaWZfZGV2aWNlICphZW1pZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFlbWlmLT5jbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhZW1pZl9kcml2ZXIgPSB7CisJLnByb2JlID0gYWVtaWZfcHJvYmUsCisJLnJlbW92ZSA9IGFlbWlmX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFlbWlmX29mX21hdGNoKSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhZW1pZl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNdXJhbGkgS2FyaWNoZXJpIDxtLWthcmljaGVyaTJAdGkuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSXZhbiBLaG9yb256aHVrIDxpdmFuLmtob3JvbnpodWtAdGkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZXhhcyBJbnN0cnVtZW50cyBBRU1JRiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBLQlVJTERfTU9ETkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwppbmRleCBhOGMwOGYzLi45Mjc1MmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKQEAgLTY1Miw2ICs2NTIsNDQgQEAKIAlyZXR1cm4gaTJvX2hydF9nZXQoYyk7CiB9OwogCitzdGF0aWMgdm9pZCBpMm9fcmVzX2FsbG9jKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmMtPm1lbV9yZXNvdXJjZTsKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZSwgYWxpZ247CisJaW50IGVycjsKKworCXJlcy0+bmFtZSA9IGMtPnBkZXYtPmJ1cy0+bmFtZTsKKwlyZXMtPmZsYWdzID0gZmxhZ3M7CisJcmVzLT5zdGFydCA9IDA7CisJcmVzLT5lbmQgPSAwOworCW9zbV9pbmZvKCIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwgYy0+bmFtZSk7CisKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlzaXplID0gc2ItPmRlc2lyZWRfbWVtX3NpemU7CisJCWFsaWduID0gMSA8PCAyMDsJLyogdW5zcGVjaWZpZWQsIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLworCX0gZWxzZSB7CisJCXNpemUgPSBzYi0+ZGVzaXJlZF9pb19zaXplOworCQlhbGlnbiA9IDEgPDwgMTI7CS8qIHVuc3BlY2lmaWVkLCB1c2UgNEtiIGFuZCBwbGF5IHNhZmUgKi8KKwl9CisKKwllcnIgPSBwY2lfYnVzX2FsbG9jX3Jlc291cmNlKGMtPnBkZXYtPmJ1cywgcmVzLCBzaXplLCBhbGlnbiwgMCwgMCwKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQljLT5tZW1fYWxsb2MgPSAxOworCQlzYi0+Y3VycmVudF9tZW1fc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwkJc2ItPmN1cnJlbnRfbWVtX2Jhc2UgPSByZXMtPnN0YXJ0OworCX0gZWxzZSBpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCWMtPmlvX2FsbG9jID0gMTsKKwkJc2ItPmN1cnJlbnRfaW9fc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwkJc2ItPmN1cnJlbnRfaW9fYmFzZSA9IHJlcy0+c3RhcnQ7CisJfQorCW9zbV9pbmZvKCIlczogYWxsb2NhdGVkIFBDSSBzcGFjZSAlcFJcbiIsIGMtPm5hbWUsIHJlcyk7Cit9CisKIC8qKgogICoJaTJvX2lvcF9zeXN0YWJfc2V0IC0gU2V0IHRoZSBJMk8gU3lzdGVtIFRhYmxlIG9mIHRoZSBzcGVjaWZpZWQgSU9QCiAgKglAYzogSTJPIGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIHN5c3RlbSB0YWJsZSBzaG91bGQgYmUgc2VuZApAQCAtNjY1LDUyICs3MDMsMTMgQEAKIAlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKIAlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjLT5wZGV2LT5kZXY7Ci0Jc3RydWN0IHJlc291cmNlICpyb290OwogCWludCByYzsKIAotCWlmIChzYi0+Y3VycmVudF9tZW1fc2l6ZSA8IHNiLT5kZXNpcmVkX21lbV9zaXplKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmMtPm1lbV9yZXNvdXJjZTsKLQkJcmVzLT5uYW1lID0gYy0+cGRldi0+YnVzLT5uYW1lOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0JCXJlcy0+c3RhcnQgPSAwOwotCQlyZXMtPmVuZCA9IDA7Ci0JCW9zbV9pbmZvKCIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwgYy0+bmFtZSk7Ci0JCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoYy0+cGRldiwgcmVzKTsKLQkJaWYgKHJvb3QgPT0gTlVMTCkKLQkJCW9zbV93YXJuKCIlczogQ2FuJ3QgZmluZCBwYXJlbnQgcmVzb3VyY2UhXG4iLCBjLT5uYW1lKTsKLQkJaWYgKHJvb3QgJiYgYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgc2ItPmRlc2lyZWRfbWVtX3NpemUsIHNiLT5kZXNpcmVkX21lbV9zaXplLCAxIDw8IDIwLAkvKiBVbnNwZWNpZmllZCwgc28gdXNlIDFNYiBhbmQgcGxheSBzYWZlICovCi0JCQkJCSAgICAgIE5VTEwsIE5VTEwpID49IDApIHsKLQkJCWMtPm1lbV9hbGxvYyA9IDE7Ci0JCQlzYi0+Y3VycmVudF9tZW1fc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKLQkJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKLQkJCW9zbV9pbmZvKCIlczogYWxsb2NhdGVkICVsbHUgYnl0ZXMgb2YgUENJIG1lbW9yeSBhdCAiCi0JCQkJIjB4JTAxNmxsWC5cbiIsIGMtPm5hbWUsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXNvdXJjZV9zaXplKHJlcyksCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0KTsKLQkJfQotCX0KKwlpZiAoc2ItPmN1cnJlbnRfbWVtX3NpemUgPCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSkKKwkJaTJvX3Jlc19hbGxvYyhjLCBJT1JFU09VUkNFX01FTSk7CiAKLQlpZiAoc2ItPmN1cnJlbnRfaW9fc2l6ZSA8IHNiLT5kZXNpcmVkX2lvX3NpemUpIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYy0+aW9fcmVzb3VyY2U7Ci0JCXJlcy0+bmFtZSA9IGMtPnBkZXYtPmJ1cy0+bmFtZTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0JCXJlcy0+c3RhcnQgPSAwOwotCQlyZXMtPmVuZCA9IDA7Ci0JCW9zbV9pbmZvKCIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwgYy0+bmFtZSk7Ci0JCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoYy0+cGRldiwgcmVzKTsKLQkJaWYgKHJvb3QgPT0gTlVMTCkKLQkJCW9zbV93YXJuKCIlczogQ2FuJ3QgZmluZCBwYXJlbnQgcmVzb3VyY2UhXG4iLCBjLT5uYW1lKTsKLQkJaWYgKHJvb3QgJiYgYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzYi0+ZGVzaXJlZF9pb19zaXplLCBzYi0+ZGVzaXJlZF9pb19zaXplLCBzYi0+ZGVzaXJlZF9pb19zaXplLCAxIDw8IDIwLAkvKiBVbnNwZWNpZmllZCwgc28gdXNlIDFNYiBhbmQgcGxheSBzYWZlICovCi0JCQkJCSAgICAgIE5VTEwsIE5VTEwpID49IDApIHsKLQkJCWMtPmlvX2FsbG9jID0gMTsKLQkJCXNiLT5jdXJyZW50X2lvX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7Ci0JCQlzYi0+Y3VycmVudF9tZW1fYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCQlvc21faW5mbygiJXM6IGFsbG9jYXRlZCAlbGx1IGJ5dGVzIG9mIFBDSSBJL08gYXQgIgotCQkJCSIweCUwMTZsbFguXG4iLCBjLT5uYW1lLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzb3VyY2Vfc2l6ZShyZXMpLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCk7Ci0JCX0KLQl9CisJaWYgKHNiLT5jdXJyZW50X2lvX3NpemUgPCBzYi0+ZGVzaXJlZF9pb19zaXplKQorCQlpMm9fcmVzX2FsbG9jKGMsIElPUkVTT1VSQ0VfSU8pOwogCiAJbXNnID0gaTJvX21zZ19nZXRfd2FpdChjLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CiAJaWYgKElTX0VSUihtc2cpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMgYi9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYwppbmRleCBhNDVhYWI5Li4xYzNhZTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYwpAQCAtMjUxLDggKzI1MSw2IEBACiAJdW5zaWduZWQgaW50IGZsbCwgc3lzY2xrOwogCWludCByZXQsIGVycjsKIAotCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhcml6b25hLT5yZWdtYXAsIHRydWUpOwotCiAJLyogQ2FjaGUgZXhpc3RpbmcgRkxMIGFuZCBTWVNDTEsgc2V0dGluZ3MgKi8KIAlyZXQgPSByZWdtYXBfcmVhZChhcml6b25hLT5yZWdtYXAsIEFSSVpPTkFfRkxMMV9DT05UUk9MXzEsICZmbGwpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMzIyLDggKzMyMCw2IEBACiAJCQllcnIpOwogCX0KIAotCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhcml6b25hLT5yZWdtYXAsIGZhbHNlKTsKLQogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zZWMtY29yZS5jIGIvZHJpdmVycy9tZmQvc2VjLWNvcmUuYwppbmRleCA3MTRlMjEzLi4yODFhODI3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc2VjLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9zZWMtY29yZS5jCkBAIC0yNiw3ICsyNiw5IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBhMDEuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wczExLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczJtcHMxNC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3M1bTg3NjMuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zNW04NzY3Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CkBAIC02OSwxOCArNzEsNTMgQEAKIAl9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG1mZF9jZWxsIHMybXBzMTRfZGV2c1tdID0geworCXsKKwkJLm5hbWUgPSAiczJtcHMxNC1wbWljIiwKKwl9LCB7CisJCS5uYW1lID0gInMybXBzMTQtcnRjIiwKKwl9LCB7CisJCS5uYW1lID0gInMybXBzMTQtY2xrIiwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1mZF9jZWxsIHMybXBhMDFfZGV2c1tdID0geworCXsKKwkJLm5hbWUgPSAiczJtcGEwMS1wbWljIiwKKwl9LAorfTsKKwogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc2VjX2R0X21hdGNoW10gPSB7CiAJewkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHM1bTg3NjctcG1pYyIsCiAJCS5kYXRhID0gKHZvaWQgKilTNU04NzY3WCwKLQl9LAotCXsJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzMm1wczExLXBtaWMiLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzMm1wczExLXBtaWMiLAogCQkuZGF0YSA9ICh2b2lkICopUzJNUFMxMVgsCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMybXBzMTQtcG1pYyIsCisJCS5kYXRhID0gKHZvaWQgKilTMk1QUzE0WCwKKwl9LCB7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsczJtcGEwMS1wbWljIiwKKwkJLmRhdGEgPSAodm9pZCAqKVMyTVBBMDEsCisJfSwgeworCQkvKiBTZW50aW5lbCAqLwogCX0sCi0Je30sCiB9OwogI2VuZGlmCiAKK3N0YXRpYyBib29sIHMybXBhMDFfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTMk1QQTAxX1JFR19JTlQxTToKKwljYXNlIFMyTVBBMDFfUkVHX0lOVDJNOgorCWNhc2UgUzJNUEEwMV9SRUdfSU5UM006CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisKIHN0YXRpYyBib29sIHMybXBzMTFfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQogewogCXN3aXRjaCAocmVnKSB7CkBAIC0xMTEsNiArMTQ4LDE1IEBACiAJLnZhbF9iaXRzID0gOCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzMm1wYTAxX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCisJLm1heF9yZWdpc3RlciA9IFMyTVBBMDFfUkVHX0xET19PVkNCNCwKKwkudm9sYXRpbGVfcmVnID0gczJtcGEwMV92b2xhdGlsZSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgczJtcHMxMV9yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKQEAgLTEyMCw2ICsxNjYsMTUgQEAKIAkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgczJtcHMxNF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBTMk1QUzE0X1JFR19MRE9EU0NIMywKKwkudm9sYXRpbGVfcmVnID0gczJtcHMxMV92b2xhdGlsZSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgczVtODc2M19yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKQEAgLTEzOCw5ICsxOTMsMTggQEAKIAkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc2VjX3J0Y19yZWdtYXBfY29uZmlnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHM1bV9ydGNfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gU0VDX1JUQ19SRUdfTUFYLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHMybXBzMTRfcnRjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCisJLm1heF9yZWdpc3RlciA9IFMyTVBTX1JUQ19SRUdfTUFYLAogfTsKIAogI2lmZGVmIENPTkZJR19PRgpAQCAtMTgwLDI0ICsyNDQsMjQgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBzZWNfaTJjX2dldF9kcml2ZXJfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNlY19pMmNfZ2V0X2RyaXZlcl9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCiAJCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAjaWZkZWYgQ09ORklHX09GCiAJaWYgKGkyYy0+ZGV2Lm9mX25vZGUpIHsKIAkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShzZWNfZHRfbWF0Y2gsIGkyYy0+ZGV2Lm9mX25vZGUpOwotCQlyZXR1cm4gKGludCltYXRjaC0+ZGF0YTsKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKW1hdGNoLT5kYXRhOwogCX0KICNlbmRpZgotCXJldHVybiAoaW50KWlkLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gaWQtPmRyaXZlcl9kYXRhOwogfQogCiBzdGF0aWMgaW50IHNlY19wbWljX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZpMmMtPmRldik7Ci0JY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcDsKKwljb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqcmVnbWFwLCAqcmVnbWFwX3J0YzsKIAlzdHJ1Y3Qgc2VjX3BtaWNfZGV2ICpzZWNfcG1pYzsKIAlpbnQgcmV0OwogCkBAIC0yMjksMTcgKzI5MywzNCBAQAogCX0KIAogCXN3aXRjaCAoc2VjX3BtaWMtPmRldmljZV90eXBlKSB7CisJY2FzZSBTMk1QQTAxOgorCQlyZWdtYXAgPSAmczJtcGEwMV9yZWdtYXBfY29uZmlnOworCQlicmVhazsKIAljYXNlIFMyTVBTMTFYOgogCQlyZWdtYXAgPSAmczJtcHMxMV9yZWdtYXBfY29uZmlnOworCQkvKgorCQkgKiBUaGUgcnRjLXM1bSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBTMk1QUzExIGFuZCB0aGVyZQorCQkgKiBpcyBubyBtZmRfY2VsbCBmb3IgUzJNUFMxMSBSVEMgZGV2aWNlLgorCQkgKiBIb3dldmVyIHdlIG11c3QgcGFzcyBzb21ldGhpbmcgdG8gZGV2bV9yZWdtYXBfaW5pdF9pMmMoKQorCQkgKiBzbyB1c2UgUzVNLWxpa2UgcmVnbWFwIGNvbmZpZyBldmVuIHRob3VnaCBpdCB3b3VsZG4ndCB3b3JrLgorCQkgKi8KKwkJcmVnbWFwX3J0YyA9ICZzNW1fcnRjX3JlZ21hcF9jb25maWc7CisJCWJyZWFrOworCWNhc2UgUzJNUFMxNFg6CisJCXJlZ21hcCA9ICZzMm1wczE0X3JlZ21hcF9jb25maWc7CisJCXJlZ21hcF9ydGMgPSAmczJtcHMxNF9ydGNfcmVnbWFwX2NvbmZpZzsKIAkJYnJlYWs7CiAJY2FzZSBTNU04NzYzWDoKIAkJcmVnbWFwID0gJnM1bTg3NjNfcmVnbWFwX2NvbmZpZzsKKwkJcmVnbWFwX3J0YyA9ICZzNW1fcnRjX3JlZ21hcF9jb25maWc7CiAJCWJyZWFrOwogCWNhc2UgUzVNODc2N1g6CiAJCXJlZ21hcCA9ICZzNW04NzY3X3JlZ21hcF9jb25maWc7CisJCXJlZ21hcF9ydGMgPSAmczVtX3J0Y19yZWdtYXBfY29uZmlnOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZWdtYXAgPSAmc2VjX3JlZ21hcF9jb25maWc7CisJCXJlZ21hcF9ydGMgPSAmczVtX3J0Y19yZWdtYXBfY29uZmlnOwogCQlicmVhazsKIAl9CiAKQEAgLTI1MiwxMCArMzMzLDEzIEBACiAJfQogCiAJc2VjX3BtaWMtPnJ0YyA9IGkyY19uZXdfZHVtbXkoaTJjLT5hZGFwdGVyLCBSVENfSTJDX0FERFIpOworCWlmICghc2VjX3BtaWMtPnJ0YykgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBJMkMgZm9yIFJUQ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KIAlpMmNfc2V0X2NsaWVudGRhdGEoc2VjX3BtaWMtPnJ0Yywgc2VjX3BtaWMpOwogCi0Jc2VjX3BtaWMtPnJlZ21hcF9ydGMgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhzZWNfcG1pYy0+cnRjLAotCQkJJnNlY19ydGNfcmVnbWFwX2NvbmZpZyk7CisJc2VjX3BtaWMtPnJlZ21hcF9ydGMgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhzZWNfcG1pYy0+cnRjLCByZWdtYXBfcnRjKTsKIAlpZiAoSVNfRVJSKHNlY19wbWljLT5yZWdtYXBfcnRjKSkgewogCQlyZXQgPSBQVFJfRVJSKHNlY19wbWljLT5yZWdtYXBfcnRjKTsKIAkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgUlRDIHJlZ2lzdGVyIG1hcDogJWRcbiIsCkBAIC0yODMsMTAgKzM2NywxOCBAQAogCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHM1bTg3NjdfZGV2cywKIAkJCQkgICAgICBBUlJBWV9TSVpFKHM1bTg3NjdfZGV2cyksIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKKwljYXNlIFMyTVBBMDE6CisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhzZWNfcG1pYy0+ZGV2LCAtMSwgczJtcGEwMV9kZXZzLAorCQkJCSAgICAgIEFSUkFZX1NJWkUoczJtcGEwMV9kZXZzKSwgTlVMTCwgMCwgTlVMTCk7CisJCWJyZWFrOwogCWNhc2UgUzJNUFMxMVg6CiAJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhzZWNfcG1pYy0+ZGV2LCAtMSwgczJtcHMxMV9kZXZzLAogCQkJCSAgICAgIEFSUkFZX1NJWkUoczJtcHMxMV9kZXZzKSwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOworCWNhc2UgUzJNUFMxNFg6CisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhzZWNfcG1pYy0+ZGV2LCAtMSwgczJtcHMxNF9kZXZzLAorCQkJCSAgICAgIEFSUkFZX1NJWkUoczJtcHMxNF9kZXZzKSwgTlVMTCwgMCwgTlVMTCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIElmIHRoaXMgaGFwcGVucyB0aGUgcHJvYmUgZnVuY3Rpb24gaXMgcHJvYmxlbSAqLwogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3NlYy1pcnEuYyBiL2RyaXZlcnMvbWZkL3NlYy1pcnEuYwppbmRleCA0ZGU0OTRmLi42NGU3OTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zZWMtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvc2VjLWlycS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIHNlYy1pcnEuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczJtcHMxMS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zNW04NzYzLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oPgogCkBAIC01OSwxNCArNjAsMTQgQEAKIAkJLnJlZ19vZmZzZXQgPSAxLAogCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQzYwU19NQVNLLAogCX0sCisJW1MyTVBTMTFfSVJRX1JUQ0EwXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAxLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQ0EwX01BU0ssCisJfSwKIAlbUzJNUFMxMV9JUlFfUlRDQTFdID0gewogCQkucmVnX29mZnNldCA9IDEsCiAJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDQTFfTUFTSywKIAl9LAotCVtTMk1QUzExX0lSUV9SVENBMl0gPSB7Ci0JCS5yZWdfb2Zmc2V0ID0gMSwKLQkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMl9NQVNLLAotCX0sCiAJW1MyTVBTMTFfSVJRX1NNUExdID0gewogCQkucmVnX29mZnNldCA9IDEsCiAJCS5tYXNrID0gUzJNUFMxMV9JUlFfU01QTF9NQVNLLApAQCAtODksNiArOTAsNzYgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxIHMybXBzMTRfaXJxc1tdID0geworCVtTMk1QUzE0X0lSUV9QV1JPTkZdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUFdST05GX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfUFdST05SXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1BXUk9OUl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX0pJR09OQkZdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfSklHT05CRl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX0pJR09OQlJdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfSklHT05CUl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX0FDT0tCRl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMCwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9BQ09LQkZfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9BQ09LQlJdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfQUNPS0JSX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfUFdST04xU10gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMCwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9QV1JPTjFTX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfTVJCXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX01SQl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1JUQzYwU10gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVEM2MFNfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9SVENBMV0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMV9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1JUQ0EwXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAxLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQ0EwX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfU01QTF0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9TTVBMX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfUlRDMVNdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDMVNfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9XVFNSXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAxLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1dUU1JfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9JTlQxMjBDXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAyLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0lOVDEyMENfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9JTlQxNDBDXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAyLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0lOVDE0MENfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9UU0RdID0geworCQkucmVnX29mZnNldCA9IDIsCisJCS5tYXNrID0gUzJNUFMxNF9JUlFfVFNEX01BU0ssCisJfSwKK307CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSBzNW04NzY3X2lycXNbXSA9IHsKIAlbUzVNODc2N19JUlFfUFdSUl0gPSB7CkBAIC0yNDYsNiArMzE3LDE2IEBACiAJLmFja19iYXNlID0gUzJNUFMxMV9SRUdfSU5UMSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwIHMybXBzMTRfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAiczJtcHMxNCIsCisJLmlycXMgPSBzMm1wczE0X2lycXMsCisJLm51bV9pcnFzID0gQVJSQVlfU0laRShzMm1wczE0X2lycXMpLAorCS5udW1fcmVncyA9IDMsCisJLnN0YXR1c19iYXNlID0gUzJNUFMxNF9SRUdfSU5UMSwKKwkubWFza19iYXNlID0gUzJNUFMxNF9SRUdfSU5UMU0sCisJLmFja19iYXNlID0gUzJNUFMxNF9SRUdfSU5UMSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwIHM1bTg3NjdfaXJxX2NoaXAgPSB7CiAJLm5hbWUgPSAiczVtODc2NyIsCiAJLmlycXMgPSBzNW04NzY3X2lycXMsCkBAIC0yOTcsNiArMzc4LDEyIEBACiAJCQkJICBzZWNfcG1pYy0+aXJxX2Jhc2UsICZzMm1wczExX2lycV9jaGlwLAogCQkJCSAgJnNlY19wbWljLT5pcnFfZGF0YSk7CiAJCWJyZWFrOworCWNhc2UgUzJNUFMxNFg6CisJCXJldCA9IHJlZ21hcF9hZGRfaXJxX2NoaXAoc2VjX3BtaWMtPnJlZ21hcF9wbWljLCBzZWNfcG1pYy0+aXJxLAorCQkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJICBzZWNfcG1pYy0+aXJxX2Jhc2UsICZzMm1wczE0X2lycV9jaGlwLAorCQkJCSAgJnNlY19wbWljLT5pcnFfZGF0YSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoc2VjX3BtaWMtPmRldiwgIlVua25vd24gZGV2aWNlIHR5cGUgJWRcbiIsCiAJCQlzZWNfcG1pYy0+ZGV2aWNlX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd201MTAyLXRhYmxlcy5jIGIvZHJpdmVycy9tZmQvd201MTAyLXRhYmxlcy5jCmluZGV4IDFlOWE0YjIuLmJmZmM1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtNTEwMi10YWJsZXMuYworKysgYi9kcml2ZXJzL21mZC93bTUxMDItdGFibGVzLmMKQEAgLTgwLDggKzgwLDcgQEAKIGludCB3bTUxMDJfcGF0Y2goc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEpCiB7CiAJY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICp3bTUxMDJfcGF0Y2g7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGksIHBhdGNoX3NpemU7CisJaW50IHBhdGNoX3NpemU7CiAKIAlzd2l0Y2ggKGFyaXpvbmEtPnJldikgewogCWNhc2UgMDoKQEAgLTkyLDIxICs5MSw5IEBACiAJCXBhdGNoX3NpemUgPSBBUlJBWV9TSVpFKHdtNTEwMl9yZXZiX3BhdGNoKTsKIAl9CiAKLQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYXJpem9uYS0+cmVnbWFwLCB0cnVlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwYXRjaF9zaXplOyBpKyspIHsKLQkJcmV0ID0gcmVnbWFwX3dyaXRlKGFyaXpvbmEtPnJlZ21hcCwgd201MTAyX3BhdGNoW2ldLnJlZywKLQkJCQkgICB3bTUxMDJfcGF0Y2hbaV0uZGVmKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byB3cml0ZSAleCA9ICV4OiAlZFxuIiwKLQkJCQl3bTUxMDJfcGF0Y2hbaV0ucmVnLCB3bTUxMDJfcGF0Y2hbaV0uZGVmLCByZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLW91dDoKLQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYXJpem9uYS0+cmVnbWFwLCBmYWxzZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnbWFwX211bHRpX3JlZ193cml0ZV9ieXBhc3NlZChhcml6b25hLT5yZWdtYXAsCisJCQkJCSAgICAgICB3bTUxMDJfcGF0Y2gsCisJCQkJCSAgICAgICBwYXRjaF9zaXplKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxIHdtNTEwMl9hb2RfaXJxc1tBUklaT05BX05VTV9JUlFdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCA2Y2IzODhlLi4xY2I3NDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIGNvbmZpZyBDUzU1MzVfTUZHUFQKIAl0cmlzdGF0ZSAiQ1M1NTM1L0NTNTUzNiBHZW9kZSBNdWx0aS1GdW5jdGlvbiBHZW5lcmFsIFB1cnBvc2UgVGltZXIgKE1GR1BUKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBNRkRfQ1M1NTM1CisJZGVwZW5kcyBvbiBNRkRfQ1M1NTM1CiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgYWNjZXNzIHRvIE1GR1BUIGZ1bmN0aW9uYWxpdHkgZm9yIG90aGVyCkBAIC01MjYsNCArNTI2LDUgQEAKIHNvdXJjZSAiZHJpdmVycy9taXNjL3Ztd192bWNpL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9taWMvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL2dlbndxZS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL21pc2MvZWNoby9LY29uZmlnIgogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCmluZGV4IDk5Yjk0MjQuLjdlYjRiNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKQEAgLTU0LDMgKzU0LDQgQEAKIG9iai0kKENPTkZJR19TUkFNKQkJKz0gc3JhbS5vCiBvYmoteQkJCQkrPSBtaWMvCiBvYmotJChDT05GSUdfR0VOV1FFKQkJKz0gZ2Vud3FlLworb2JqLSQoQ09ORklHX0VDSE8pCQkrPSBlY2hvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMgYi9kcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QuYwppbmRleCBkM2VlZTExLi5hNDMwNTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QuYworKysgYi9kcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QuYwpAQCAtNzIsNyArNzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMgYi9kcml2ZXJzL21pc2MvYXBkczk4MDJhbHMuYwppbmRleCAwYzZlMDM3Li5jNmNjM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYXBkczk4MDJhbHMuYworKysgYi9kcml2ZXJzL21pc2MvYXBkczk4MDJhbHMuYwpAQCAtMjIsNyArMjIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jIGIvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCmluZGV4IDViZTgwODQwLi4yMmRlMTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYXRtZWwtc3NjLmMKKysrIGIvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCkBAIC0xNTAsNiArMTUwLDEyIEBACiAJCXJldHVybiAtRU5PREVWOwogCXNzYy0+cGRhdGEgPSAoc3RydWN0IGF0bWVsX3NzY19wbGF0Zm9ybV9kYXRhICopcGxhdF9kYXQ7CiAKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCQlzc2MtPmNsa19mcm9tX3JrX3BpbiA9CisJCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCxjbGstZnJvbS1yay1waW4iKTsKKwl9CisKIAlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlzc2MtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVncyk7CiAJaWYgKElTX0VSUihzc2MtPnJlZ3MpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2JtcDA4NS5jIGIvZHJpdmVycy9taXNjL2JtcDA4NS5jCmluZGV4IDgyMGU1M2QuLjliMzEzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9ibXAwODUuYworKysgYi9kcml2ZXJzL21pc2MvYm1wMDg1LmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlICJibXAwODUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9jYXJtYS9jYXJtYS1mcGdhLmMgYi9kcml2ZXJzL21pc2MvY2FybWEvY2FybWEtZnBnYS5jCmluZGV4IDllMmI5ODUuLjE0ZDkwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9jYXJtYS9jYXJtYS1mcGdhLmMKKysrIGIvZHJpdmVycy9taXNjL2Nhcm1hL2Nhcm1hLWZwZ2EuYwpAQCAtMTAxLDcgKzEwMSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZHMxNjgyLmMgYi9kcml2ZXJzL21pc2MvZHMxNjgyLmMKaW5kZXggMTU0YjAyZS4uNmE2NzJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2RzMTY4Mi5jCisrKyBiL2RyaXZlcnMvbWlzYy9kczE2ODIuYwpAQCAtMzIsNyArMzIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9lY2hvL0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lY2hvL0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9lY2hvL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL2VjaG8vTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lY2hvL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5jIGIvZHJpdmVycy9taXNjL2VjaG8vZWNoby5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9lY2hvL2VjaG8uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oIGIvZHJpdmVycy9taXNjL2VjaG8vZWNoby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9lY2hvL2VjaG8uaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmggYi9kcml2ZXJzL21pc2MvZWNoby9maXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9lY2hvL2Zpci5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9vc2xlYy5oIGIvZHJpdmVycy9taXNjL2VjaG8vb3NsZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2VjaG8vb3NsZWMuaApyZW5hbWUgdG8gZHJpdmVycy9taXNjL2VjaG8vb3NsZWMuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2F0MjUuYwppbmRleCA0ZjNiY2ExLi42MzRmNzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL2F0MjUuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2F0MjUuYwpAQCAtMTAsNyArMTAsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbS5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYwppbmRleCBmMGZhNGU4Li4zM2Y4NjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzeHg0Ni5jCmluZGV4IDc4ZTU1YjUuLjllYmVhY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzeHg0Ni5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzeHg0Ni5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vbWF4Njg3NS5jCmluZGV4IGUzNjE1N2QuLjU4MGZmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vbWF4Njg3NS5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vbWF4Njg3NS5jCkBAIC0yNyw3ICsyNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL3N1bnhpX3NpZC5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9zdW54aV9zaWQuYwppbmRleCA5YzM0ZTU3Li4zZjJiNjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL3N1bnhpX3NpZC5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vc3VueGlfc2lkLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KQEAgLTk2LDcgKzk1LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VueGlfc2lkX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktc2lkIiwgLmRhdGEgPSAodm9pZCAqKTE2fSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc2lkIiwgLmRhdGEgPSAodm9pZCAqKTE2fSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtc2lkIiwgLmRhdGEgPSAodm9pZCAqKTUxMn0sCiAJey8qIHNlbnRpbmVsICovfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGVidWdmcy5jIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RlYnVnZnMuYwppbmRleCAzYmZkYzA3Li41MGQyMDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9kZWJ1Z2ZzLmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaG1jNjM1Mi5jIGIvZHJpdmVycy9taXNjL2htYzYzNTIuYwppbmRleCAxNzBiZDNkLi45MDUyMGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaG1jNjM1Mi5jCisrKyBiL2RyaXZlcnMvbWlzYy9obWM2MzUyLmMKQEAgLTIyLDcgKzIyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jIGIvZHJpdmVycy9taXNjL2lzbDI5MDAzLmMKaW5kZXggZTMxODNmMi4uMTJjMzBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2lzbDI5MDAzLmMKKysrIGIvZHJpdmVycy9taXNjL2lzbDI5MDAzLmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMgYi9kcml2ZXJzL21pc2MvaXNsMjkwMjAuYwppbmRleCBiN2Y4NGRhLi40YTljNTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaXNsMjkwMjAuYworKysgYi9kcml2ZXJzL21pc2MvaXNsMjkwMjAuYwpAQCAtMjMsNyArMjMsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xhdHRpY2UtZWNwMy1jb25maWcuYyBiL2RyaXZlcnMvbWlzYy9sYXR0aWNlLWVjcDMtY29uZmlnLmMKaW5kZXggNjFmYmU2YS4uMGExNTY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xhdHRpY2UtZWNwMy1jb25maWcuYworKysgYi9kcml2ZXJzL21pc2MvbGF0dGljZS1lY3AzLWNvbmZpZy5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYwppbmRleCAwMzZlZmZlLi4zZWY0NjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jCisrKyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYwppbmRleCA3Yzk3NTUwLi5kMzI0ZjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYworKysgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYwpAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMKaW5kZXggOWFhMmJkMi4uYmQwNmQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMKKysrIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMKQEAgLTEwLDcgKzEwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtLmMgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwppbmRleCA0OWM3YTIzLi5kNjZhMmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGtkdG0uYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwpAQCAtMzAsNiArMzAsNyBAQAogICoKICAqIFNlZSBEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9wcm92b2tlLWNyYXNoZXMudHh0IGZvciBpbnN0cnVjdGlvbnMKICAqLworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTQ1LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCiAjaWZkZWYgQ09ORklHX0lERQogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgpAQCAtMTAxLDYgKzEwMyw3IEBACiAJQ1RfRVhFQ19VU0VSU1BBQ0UsCiAJQ1RfQUNDRVNTX1VTRVJTUEFDRSwKIAlDVF9XUklURV9STywKKwlDVF9XUklURV9LRVJOLAogfTsKIAogc3RhdGljIGNoYXIqIGNwX25hbWVbXSA9IHsKQEAgLTEzNyw2ICsxNDAsNyBAQAogCSJFWEVDX1VTRVJTUEFDRSIsCiAJIkFDQ0VTU19VU0VSU1BBQ0UiLAogCSJXUklURV9STyIsCisJIldSSVRFX0tFUk4iLAogfTsKIAogc3RhdGljIHN0cnVjdCBqcHJvYmUgbGtkdG07CkBAIC0zMTYsNiArMzIwLDEzIEBACiAJcmV0dXJuOwogfQogCisvKiBNdXN0IGltbWVkaWF0ZWx5IGZvbGxvdyBkb19ub3RoaW5nIGZvciBzaXplIGNhbGN1bHVhdGlvbnMgdG8gd29yayBvdXQuICovCitzdGF0aWMgdm9pZCBkb19vdmVyd3JpdHRlbih2b2lkKQoreworCXByX2luZm8oImRvX292ZXJ3cml0dGVuIHdhc24ndCBvdmVyd3JpdHRlbiFcbiIpOworCXJldHVybjsKK30KKwogc3RhdGljIG5vaW5saW5lIHZvaWQgY29ycnVwdF9zdGFjayh2b2lkKQogewogCS8qIFVzZSBkZWZhdWx0IGNoYXIgYXJyYXkgbGVuZ3RoIHRoYXQgdHJpZ2dlcnMgc3RhY2sgcHJvdGVjdGlvbi4gKi8KQEAgLTMyOCw3ICszMzksMTIgQEAKIHsKIAl2b2lkICgqZnVuYykodm9pZCkgPSBkc3Q7CiAKKwlwcl9pbmZvKCJhdHRlbXB0aW5nIG9rIGV4ZWN1dGlvbiBhdCAlcFxuIiwgZG9fbm90aGluZyk7CisJZG9fbm90aGluZygpOworCiAJbWVtY3B5KGRzdCwgZG9fbm90aGluZywgRVhFQ19TSVpFKTsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpZHN0LCAodW5zaWduZWQgbG9uZylkc3QgKyBFWEVDX1NJWkUpOworCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIGV4ZWN1dGlvbiBhdCAlcFxuIiwgZnVuYyk7CiAJZnVuYygpOwogfQogCkBAIC0zMzcsOCArMzUzLDEzIEBACiAJLyogSW50ZW50aW9uYWxseSBjcm9zc2luZyBrZXJuZWwvdXNlciBtZW1vcnkgYm91bmRhcnkuICovCiAJdm9pZCAoKmZ1bmMpKHZvaWQpID0gZHN0OwogCisJcHJfaW5mbygiYXR0ZW1wdGluZyBvayBleGVjdXRpb24gYXQgJXBcbiIsIGRvX25vdGhpbmcpOworCWRvX25vdGhpbmcoKTsKKwogCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopZHN0LCBkb19ub3RoaW5nLCBFWEVDX1NJWkUpKQogCQlyZXR1cm47CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWRzdCwgKHVuc2lnbmVkIGxvbmcpZHN0ICsgRVhFQ19TSVpFKTsKKwlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBleGVjdXRpb24gYXQgJXBcbiIsIGZ1bmMpOwogCWZ1bmMoKTsKIH0KIApAQCAtNDYzLDggKzQ4NCwxMiBAQAogCQl9CiAKIAkJcHRyID0gKHVuc2lnbmVkIGxvbmcgKil1c2VyX2FkZHI7CisKKwkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgcmVhZCBhdCAlcFxuIiwgcHRyKTsKIAkJdG1wID0gKnB0cjsKIAkJdG1wICs9IDB4YzBkZWMwZGU7CisKKwkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgd3JpdGUgYXQgJXBcbiIsIHB0cik7CiAJCSpwdHIgPSB0bXA7CiAKIAkJdm1fbXVubWFwKHVzZXJfYWRkciwgUEFHRV9TSVpFKTsKQEAgLTQ3NSwxMCArNTAwLDI4IEBACiAJCXVuc2lnbmVkIGxvbmcgKnB0cjsKIAogCQlwdHIgPSAodW5zaWduZWQgbG9uZyAqKSZyb2RhdGE7CisKKwkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgd3JpdGUgYXQgJXBcbiIsIHB0cik7CiAJCSpwdHIgXj0gMHhhYmNkMTIzNDsKIAogCQlicmVhazsKIAl9CisJY2FzZSBDVF9XUklURV9LRVJOOiB7CisJCXNpemVfdCBzaXplOworCQl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwkJc2l6ZSA9ICh1bnNpZ25lZCBsb25nKWRvX292ZXJ3cml0dGVuIC0KKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWRvX25vdGhpbmc7CisJCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopZG9fb3ZlcndyaXR0ZW47CisKKwkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgJXp1IGJ5dGUgd3JpdGUgYXQgJXBcbiIsIHNpemUsIHB0cik7CisJCW1lbWNweShwdHIsICh1bnNpZ25lZCBjaGFyICopZG9fbm90aGluZywgc2l6ZSk7CisJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylwdHIsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHB0ciArIHNpemUpKTsKKworCQlkb19vdmVyd3JpdHRlbigpOworCQlicmVhazsKKwl9CiAJY2FzZSBDVF9OT05FOgogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNDkzLDggKzUzNiw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRfbG9jaywgZmxhZ3MpOwogCWNvdW50LS07Ci0JcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50ICVzIG9mIHR5cGUgJXMgaGl0LCB0cmlnZ2VyIGluICVkIHJvdW5kc1xuIiwKLQkJCWNwX25hbWVfdG9fc3RyKGNwb2ludCksIGNwX3R5cGVfdG9fc3RyKGNwdHlwZSksIGNvdW50KTsKKwlwcl9pbmZvKCJDcmFzaCBwb2ludCAlcyBvZiB0eXBlICVzIGhpdCwgdHJpZ2dlciBpbiAlZCByb3VuZHNcbiIsCisJCWNwX25hbWVfdG9fc3RyKGNwb2ludCksIGNwX3R5cGVfdG9fc3RyKGNwdHlwZSksIGNvdW50KTsKIAogCWlmIChjb3VudCA9PSAwKSB7CiAJCWRvX2l0ID0gdHJ1ZTsKQEAgLTU1MSwxOCArNTk0LDE4IEBACiAJCWxrZHRtLmtwLnN5bWJvbF9uYW1lID0gImdlbmVyaWNfaWRlX2lvY3RsIjsKIAkJbGtkdG0uZW50cnkgPSAoa3Byb2JlX29wY29kZV90KikganBfZ2VuZXJpY19pZGVfaW9jdGw7CiAjZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogQ3Jhc2ggcG9pbnQgbm90IGF2YWlsYWJsZVxuIik7CisJCXByX2luZm8oIkNyYXNoIHBvaW50IG5vdCBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogSW52YWxpZCBDcmFzaCBQb2ludFxuIik7CisJCXByX2luZm8oIkludmFsaWQgQ3Jhc2ggUG9pbnRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAljcG9pbnQgPSB3aGljaDsKIAlpZiAoKHJldCA9IHJlZ2lzdGVyX2pwcm9iZSgmbGtkdG0pKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENvdWxkbid0IHJlZ2lzdGVyIGpwcm9iZVxuIik7CisJCXByX2luZm8oIkNvdWxkbid0IHJlZ2lzdGVyIGpwcm9iZVxuIik7CiAJCWNwb2ludCA9IENOX0lOVkFMSUQ7CiAJfQogCkBAIC03MDksOCArNzUyLDcgQEAKIAlpZiAodHlwZSA9PSBDVF9OT05FKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBQZXJmb3JtaW5nIGRpcmVjdCBlbnRyeSAlc1xuIiwKLQkJCWNwX3R5cGVfdG9fc3RyKHR5cGUpKTsKKwlwcl9pbmZvKCJQZXJmb3JtaW5nIGRpcmVjdCBlbnRyeSAlc1xuIiwgY3BfdHlwZV90b19zdHIodHlwZSkpOwogCWxrZHRtX2RvX2FjdGlvbih0eXBlKTsKIAkqb2ZmICs9IGNvdW50OwogCkBAIC03NzIsNyArODE0LDcgQEAKIAkvKiBSZWdpc3RlciBkZWJ1Z2ZzIGludGVyZmFjZSAqLwogCWxrZHRtX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicHJvdm9rZS1jcmFzaCIsIE5VTEwpOwogCWlmICghbGtkdG1fZGVidWdmc19yb290KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibGtkdG06IGNyZWF0aW5nIHJvb3QgZGlyIGZhaWxlZFxuIik7CisJCXByX2VycigiY3JlYXRpbmcgcm9vdCBkaXIgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC03ODcsMjggKzgyOSwyNiBAQAogCQlkZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoY3VyLT5uYW1lLCAwNjQ0LCBsa2R0bV9kZWJ1Z2ZzX3Jvb3QsCiAJCQkJTlVMTCwgJmN1ci0+Zm9wcyk7CiAJCWlmIChkZSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImxrZHRtOiBjb3VsZCBub3QgY3JlYXRlICVzXG4iLAotCQkJCQljdXItPm5hbWUpOworCQkJcHJfZXJyKCJjb3VsZCBub3QgY3JlYXRlICVzXG4iLCBjdXItPm5hbWUpOwogCQkJZ290byBvdXRfZXJyOwogCQl9CiAJfQogCiAJaWYgKGxrZHRtX3BhcnNlX2NvbW1hbmRsaW5lKCkgPT0gLUVJTlZBTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogSW52YWxpZCBjb21tYW5kXG4iKTsKKwkJcHJfaW5mbygiSW52YWxpZCBjb21tYW5kXG4iKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAogCWlmIChjcG9pbnQgIT0gQ05fSU5WQUxJRCAmJiBjcHR5cGUgIT0gQ1RfTk9ORSkgewogCQlyZXQgPSBsa2R0bV9yZWdpc3Rlcl9jcG9pbnQoY3BvaW50KTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBJbnZhbGlkIGNyYXNoIHBvaW50ICVkXG4iLAotCQkJCQljcG9pbnQpOworCQkJcHJfaW5mbygiSW52YWxpZCBjcmFzaCBwb2ludCAlZFxuIiwgY3BvaW50KTsKIAkJCWdvdG8gb3V0X2VycjsKIAkJfQotCQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogQ3Jhc2ggcG9pbnQgJXMgb2YgdHlwZSAlcyByZWdpc3RlcmVkXG4iLAotCQkJCWNwb2ludF9uYW1lLCBjcG9pbnRfdHlwZSk7CisJCXByX2luZm8oIkNyYXNoIHBvaW50ICVzIG9mIHR5cGUgJXMgcmVnaXN0ZXJlZFxuIiwKKwkJCWNwb2ludF9uYW1lLCBjcG9pbnRfdHlwZSk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IE5vIGNyYXNoIHBvaW50cyByZWdpc3RlcmVkLCBlbmFibGUgdGhyb3VnaCBkZWJ1Z2ZzXG4iKTsKKwkJcHJfaW5mbygiTm8gY3Jhc2ggcG9pbnRzIHJlZ2lzdGVyZWQsIGVuYWJsZSB0aHJvdWdoIGRlYnVnZnNcbiIpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODIzLDcgKzg2Myw3IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGxrZHRtX2RlYnVnZnNfcm9vdCk7CiAKIAl1bnJlZ2lzdGVyX2pwcm9iZSgmbGtkdG0pOwotCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBDcmFzaCBwb2ludCB1bnJlZ2lzdGVyZWRcbiIpOworCXByX2luZm8oIkNyYXNoIHBvaW50IHVucmVnaXN0ZXJlZFxuIik7CiB9CiAKIG1vZHVsZV9pbml0KGxrZHRtX21vZHVsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9tZWkvS2NvbmZpZwppbmRleCBjNzZmYTMxLi5kMjMzODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL21laS9LY29uZmlnCkBAIC0zNCwzICszNCwxMiBAQAogCSAgODJRMzMgRXhwcmVzcwogCSAgODJYMzgvWDQ4IEV4cHJlc3MKIAorY29uZmlnIElOVEVMX01FSV9UWEUKKwl0cmlzdGF0ZSAiSW50ZWwgVHJ1c3RlZCBFeGVjdXRpb24gRW52aXJvbm1lbnQgd2l0aCBNRSBJbnRlcmZhY2UiCisJc2VsZWN0IElOVEVMX01FSQorCWRlcGVuZHMgb24gWDg2ICYmIFBDSSAmJiBXQVRDSERPR19DT1JFCisJaGVscAorCSAgTUVJIFN1cHBvcnQgZm9yIFRydXN0ZWQgRXhlY3V0aW9uIEVudmlyb25tZW50IGRldmljZSBvbiBJbnRlbCBTb0NzCisKKwkgIFN1cHBvcnRlZCBTb0NzOgorCSAgSW50ZWwgQmF5IFRyYWlsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL21laS9NYWtlZmlsZQppbmRleCAwODY5OGE0Li44ZWJjNmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiAjCiAjIE1ha2VmaWxlIC0gSW50ZWwgTWFuYWdlbWVudCBFbmdpbmUgSW50ZXJmYWNlIChJbnRlbCBNRUkpIExpbnV4IGRyaXZlcgotIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uCisjIENvcHlyaWdodCAoYykgMjAxMC0yMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KICMKIG9iai0kKENPTkZJR19JTlRFTF9NRUkpICs9IG1laS5vCiBtZWktb2JqcyA6PSBpbml0Lm8KQEAgLTE3LDMgKzE3LDcgQEAKIG9iai0kKENPTkZJR19JTlRFTF9NRUlfTUUpICs9IG1laS1tZS5vCiBtZWktbWUtb2JqcyA6PSBwY2ktbWUubwogbWVpLW1lLW9ianMgKz0gaHctbWUubworCitvYmotJChDT05GSUdfSU5URUxfTUVJX1RYRSkgKz0gbWVpLXR4ZS5vCittZWktdHhlLW9ianMgOj0gcGNpLXR4ZS5vCittZWktdHhlLW9ianMgKz0gaHctdHhlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMgYi9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCmluZGV4IDJmYWQ4NDQuLmI4ZGViMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTM1LDcgKzM0LDYgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCiBjb25zdCB1dWlkX2xlIG1laV9hbXRoaWZfZ3VpZCAgPSBVVUlEX0xFKDB4MTJmODAwMjgsIDB4YjRiNywgMHg0YjJkLApAQCAtNzksMTAgKzc3LDkgQEAKIAogCWkgPSBtZWlfbWVfY2xfYnlfdXVpZChkZXYsICZtZWlfYW10aGlmX2d1aWQpOwogCWlmIChpIDwgMCkgewotCQlyZXQgPSBpOwogCQlkZXZfaW5mbygmZGV2LT5wZGV2LT5kZXYsCi0JCQkiYW10aGlmOiBmYWlsZWQgdG8gZmluZCB0aGUgY2xpZW50ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OworCQkJImFtdGhpZjogZmFpbGVkIHRvIGZpbmQgdGhlIGNsaWVudCAlZFxuIiwgaSk7CisJCXJldHVybiAtRU5PVFRZOwogCX0KIAogCWNsLT5tZV9jbGllbnRfaWQgPSBkZXYtPm1lX2NsaWVudHNbaV0uY2xpZW50X2lkOwpAQCAtMTE2LDE0ICsxMTMsMTEgQEAKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RJTkc7CiAKLQlpZiAobWVpX2hibV9jbF9jb25uZWN0X3JlcShkZXYsIGNsKSkgewotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImFtdGhpZjogRmFpbGVkIHRvIGNvbm5lY3QgdG8gTUUgY2xpZW50XG4iKTsKLQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwotCQljbC0+aG9zdF9jbGllbnRfaWQgPSAwOwotCX0gZWxzZSB7Ci0JCWNsLT50aW1lcl9jb3VudCA9IE1FSV9DT05ORUNUX1RJTUVPVVQ7Ci0JfQotCXJldHVybiAwOworCXJldCA9IG1laV9jbF9jb25uZWN0KGNsLCBOVUxMKTsKKworCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTEzNywxNCArMTMxLDEyIEBACiBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfYW10aGlmX2ZpbmRfcmVhZF9saXN0X2VudHJ5KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCiAJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpwb3MgPSBOVUxMOwotCXN0cnVjdCBtZWlfY2xfY2IgKm5leHQgPSBOVUxMOworCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwKLQkJCQkmZGV2LT5hbXRoaWZfcmRfY29tcGxldGVfbGlzdC5saXN0LCBsaXN0KSB7Ci0JCWlmIChwb3MtPmNsICYmIHBvcy0+Y2wgPT0gJmRldi0+aWFtdGhpZl9jbCAmJgotCQkJcG9zLT5maWxlX29iamVjdCA9PSBmaWxlKQotCQkJcmV0dXJuIHBvczsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNiLCAmZGV2LT5hbXRoaWZfcmRfY29tcGxldGVfbGlzdC5saXN0LCBsaXN0KSB7CisJCWlmIChjYi0+Y2wgJiYgY2ItPmNsID09ICZkZXYtPmlhbXRoaWZfY2wgJiYKKwkJCWNiLT5maWxlX29iamVjdCA9PSBmaWxlKQorCQkJcmV0dXJuIGNiOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE4MCwxNCArMTcyLDEzIEBACiAJLyogT25seSBwb3NzaWJsZSBpZiB3ZSBhcmUgaW4gdGltZW91dCAqLwogCWlmICghY2wgfHwgY2wgIT0gJmRldi0+aWFtdGhpZl9jbCkgewogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImJhZCBmaWxlIGV4dC5cbiIpOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0dXJuIC1FVElNRTsKIAl9CiAKIAlpID0gbWVpX21lX2NsX2J5X2lkKGRldiwgZGV2LT5pYW10aGlmX2NsLm1lX2NsaWVudF9pZCk7Ci0KIAlpZiAoaSA8IDApIHsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJhbXRoaWYgY2xpZW50IG5vdCBmb3VuZC5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIC1FTk9UVFk7CiAJfQogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiY2hlY2tpbmcgYW10aGlmIGRhdGFcbiIpOwogCWNiID0gbWVpX2FtdGhpZl9maW5kX3JlYWRfbGlzdF9lbnRyeShkZXYsIGZpbGUpOwpAQCAtMjI4LDcgKzIxOSw3IEBACiAJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImFtdGhpZiBUaW1lIG91dFxuIik7CiAJCQkvKiAxNSBzZWMgZm9yIHRoZSBtZXNzYWdlIGhhcyBleHBpcmVkICovCiAJCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCQkJcmV0cyA9IC1FVElNRURPVVQ7CisJCQlyZXRzID0gLUVUSU1FOwogCQkJZ290byBmcmVlOwogCQl9CiAJfQpAQCAtMjUzLDkgKzI0NCwxMCBAQAogCSAqIHRoZSBidWZfaWR4IG1heSBwb2ludCBiZXlvbmQgKi8KIAlsZW5ndGggPSBtaW5fdChzaXplX3QsIGxlbmd0aCwgKGNiLT5idWZfaWR4IC0gKm9mZnNldCkpOwogCi0JaWYgKGNvcHlfdG9fdXNlcih1YnVmLCBjYi0+cmVzcG9uc2VfYnVmZmVyLmRhdGEgKyAqb2Zmc2V0LCBsZW5ndGgpKQorCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgY2ItPnJlc3BvbnNlX2J1ZmZlci5kYXRhICsgKm9mZnNldCwgbGVuZ3RoKSkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlcmxhbmRcbiIpOwogCQlyZXRzID0gLUVGQVVMVDsKLQllbHNlIHsKKwl9IGVsc2UgewogCQlyZXRzID0gbGVuZ3RoOwogCQlpZiAoKCpvZmZzZXQgKyBsZW5ndGgpIDwgY2ItPmJ1Zl9pZHgpIHsKIAkJCSpvZmZzZXQgKz0gbGVuZ3RoOwpAQCAtMzAyLDkgKzI5NCw4IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocmV0ICYmIGRldi0+aGJ1Zl9pc19yZWFkeSkgeworCWlmIChyZXQgJiYgbWVpX2hidWZfYWNxdWlyZShkZXYpKSB7CiAJCXJldCA9IDA7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOwogCQlpZiAoY2ItPnJlcXVlc3RfYnVmZmVyLnNpemUgPiBtZWlfaGJ1Zl9tYXhfbGVuKGRldikpIHsKIAkJCW1laV9oZHIubGVuZ3RoID0gbWVpX2hidWZfbWF4X2xlbihkZXYpOwogCQkJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOwpAQCAtMzM2LDEwICszMjcsNiBAQAogCQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPndyaXRlX2xpc3QubGlzdCk7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoIWRldi0+aGJ1Zl9pc19yZWFkeSkKLQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaG9zdCBidWZmZXIgaXMgbm90IGVtcHR5Iik7Ci0KLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJObyBmbG93IGNvbnRyb2wgY3JlZGVudGlhbHMsIHNvIGFkZCBpYW10aGlmIGNiIHRvIHdyaXRlIGxpc3QuXG4iKTsKIAkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPndyaXRlX2xpc3QubGlzdCk7CiAJfQogCXJldHVybiAwOwpAQCAtMzY1LDcgKzM1Miw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfSU9DVEw7CisJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9XUklURTsKIAogCWlmICghbGlzdF9lbXB0eSgmZGV2LT5hbXRoaWZfY21kX2xpc3QubGlzdCkgfHwKIAkgICAgZGV2LT5pYW10aGlmX3N0YXRlICE9IE1FSV9JQU1USElGX0lETEUpIHsKQEAgLTQ0NywyMyArNDM0LDIzIEBACiAKIAogLyoqCi0gKiBtZWlfYW10aGlmX2lycV93cml0ZV9jb21wbGV0ZWQgLSBwcm9jZXNzZXMgY29tcGxldGVkIGlhbXRoaWYgb3BlcmF0aW9uLgorICogbWVpX2FtdGhpZl9pcnFfd3JpdGUgLSB3cml0ZSBpYW10aGlmIGNvbW1hbmQgaW4gaXJxIHRocmVhZCBjb250ZXh0LgogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlLgotICogQHNsb3RzOiBmcmVlIHNsb3RzLgogICogQGNiX3BvczogY2FsbGJhY2sgYmxvY2suCiAgKiBAY2w6IHByaXZhdGUgZGF0YSBvZiB0aGUgZmlsZSBvYmplY3QuCiAgKiBAY21wbF9saXN0OiBjb21wbGV0ZSBsaXN0LgogICoKICAqIHJldHVybnMgMCwgT0s7IG90aGVyd2lzZSwgZXJyb3IuCiAgKi8KLWludCBtZWlfYW10aGlmX2lycV93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkJICBzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCitpbnQgbWVpX2FtdGhpZl9pcnFfd3JpdGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkJIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKIAlzdHJ1Y3QgbWVpX21zZ19oZHIgbWVpX2hkcjsKIAlzaXplX3QgbGVuID0gZGV2LT5pYW10aGlmX21zZ19idWZfc2l6ZSAtIGRldi0+aWFtdGhpZl9tc2dfYnVmX2luZGV4OwogCXUzMiBtc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhsZW4pOworCWludCBzbG90czsKIAlpbnQgcmV0czsKIAogCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKGNsKTsKQEAgLTQ4MCwxMyArNDY3LDE1IEBACiAJbWVpX2hkci5yZXNlcnZlZCA9IDA7CiAJbWVpX2hkci5pbnRlcm5hbCA9IDA7CiAKLQlpZiAoKnNsb3RzID49IG1zZ19zbG90cykgeworCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKKworCWlmIChzbG90cyA+PSBtc2dfc2xvdHMpIHsKIAkJbWVpX2hkci5sZW5ndGggPSBsZW47CiAJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMTsKIAkvKiBTcGxpdCB0aGUgbWVzc2FnZSBvbmx5IGlmIHdlIGNhbiB3cml0ZSB0aGUgd2hvbGUgaG9zdCBidWZmZXIgKi8KLQl9IGVsc2UgaWYgKCpzbG90cyA9PSBkZXYtPmhidWZfZGVwdGgpIHsKLQkJbXNnX3Nsb3RzID0gKnNsb3RzOwotCQlsZW4gPSAoKnNsb3RzICogc2l6ZW9mKHUzMikpIC0gc2l6ZW9mKHN0cnVjdCBtZWlfbXNnX2hkcik7CisJfSBlbHNlIGlmIChzbG90cyA9PSBkZXYtPmhidWZfZGVwdGgpIHsKKwkJbXNnX3Nsb3RzID0gc2xvdHM7CisJCWxlbiA9IChzbG90cyAqIHNpemVvZih1MzIpKSAtIHNpemVvZihzdHJ1Y3QgbWVpX21zZ19oZHIpOwogCQltZWlfaGRyLmxlbmd0aCA9IGxlbjsKIAkJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOwogCX0gZWxzZSB7CkBAIC00OTYsNyArNDg1LDYgQEAKIAogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCBNRUlfSERSX0ZNVCwgIE1FSV9IRFJfUFJNKCZtZWlfaGRyKSk7CiAKLQkqc2xvdHMgLT0gIG1zZ19zbG90czsKIAlyZXRzID0gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmbWVpX2hkciwKIAkJCWRldi0+aWFtdGhpZl9tc2dfYnVmICsgZGV2LT5pYW10aGlmX21zZ19idWZfaW5kZXgpOwogCWlmIChyZXRzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2J1cy5jIGIvZHJpdmVycy9taXNjL21laS9idXMuYwppbmRleCA0YmM3ZDYyLi5kZGM1YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2J1cy5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tZWlfY2xfYnVzLmg+CiAKICNpbmNsdWRlICJtZWlfZGV2LmgiCi0jaW5jbHVkZSAiaHctbWUuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIAogI2RlZmluZSB0b19tZWlfY2xfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgbWVpX2NsX2RyaXZlciwgZHJpdmVyKQpAQCAtMTQ1LDkgKzE0NCw5IEBACiBzdGF0aWMgc3RydWN0IG1laV9jbCAqbWVpX2J1c19maW5kX21laV9jbF9ieV91dWlkKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCiAJCQkJCQl1dWlkX2xlIHV1aWQpCiB7Ci0Jc3RydWN0IG1laV9jbCAqY2wsICpuZXh0OworCXN0cnVjdCBtZWlfY2wgKmNsOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5kZXZpY2VfbGlzdCwgZGV2aWNlX2xpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5kZXZpY2VfbGlzdCwgZGV2aWNlX2xpbmspIHsKIAkJaWYgKCF1dWlkX2xlX2NtcCh1dWlkLCBjbC0+ZGV2aWNlX3V1aWQpKQogCQkJcmV0dXJuIGNsOwogCX0KQEAgLTUyNCw2ICs1MjMsMjIgQEAKIAlzY2hlZHVsZV93b3JrKCZkZXZpY2UtPmV2ZW50X3dvcmspOwogfQogCit2b2lkIG1laV9jbF9idXNfcmVtb3ZlX2RldmljZXMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX2NsICpjbCwgKm5leHQ7CisKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2wsIG5leHQsICZkZXYtPmRldmljZV9saXN0LCBkZXZpY2VfbGluaykgeworCQlpZiAoY2wtPmRldmljZSkKKwkJCW1laV9jbF9yZW1vdmVfZGV2aWNlKGNsLT5kZXZpY2UpOworCisJCWxpc3RfZGVsKCZjbC0+ZGV2aWNlX2xpbmspOworCQltZWlfY2xfdW5saW5rKGNsKTsKKwkJa2ZyZWUoY2wpOworCX0KKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworfQorCiBpbnQgX19pbml0IG1laV9jbF9idXNfaW5pdCh2b2lkKQogewogCXJldHVybiBidXNfcmVnaXN0ZXIoJm1laV9jbF9idXNfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuYwppbmRleCA4OWE1NTc5Li44YzA3OGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmMKQEAgLTI5LDIwICsyOSwyMSBAQAogICogbWVpX21lX2NsX2J5X3V1aWQgLSBsb2NhdGUgaW5kZXggb2YgbWUgY2xpZW50CiAgKgogICogQGRldjogbWVpIGRldmljZQorICoKKyAqIExvY2tpbmc6IGNhbGxlZCB1bmRlciAiZGV2LT5kZXZpY2VfbG9jayIgbG9jaworICoKICAqIHJldHVybnMgbWUgY2xpZW50IGluZGV4IG9yIC1FTk9FTlQgaWYgbm90IGZvdW5kCiAgKi8KIGludCBtZWlfbWVfY2xfYnlfdXVpZChjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBjb25zdCB1dWlkX2xlICp1dWlkKQogewotCWludCBpLCByZXMgPSAtRU5PRU5UOworCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bWVfY2xpZW50c19udW07ICsraSkKIAkJaWYgKHV1aWRfbGVfY21wKCp1dWlkLAotCQkJCWRldi0+bWVfY2xpZW50c1tpXS5wcm9wcy5wcm90b2NvbF9uYW1lKSA9PSAwKSB7Ci0JCQlyZXMgPSBpOwotCQkJYnJlYWs7Ci0JCX0KKwkJCQlkZXYtPm1lX2NsaWVudHNbaV0ucHJvcHMucHJvdG9jb2xfbmFtZSkgPT0gMCkKKwkJCXJldHVybiBpOwogCi0JcmV0dXJuIHJlczsKKwlyZXR1cm4gLUVOT0VOVDsKIH0KIAogCkBAIC02MCwzNCArNjEsNzYgQEAKIGludCBtZWlfbWVfY2xfYnlfaWQoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgdTggY2xpZW50X2lkKQogewogCWludCBpOworCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bWVfY2xpZW50c19udW07IGkrKykKIAkJaWYgKGRldi0+bWVfY2xpZW50c1tpXS5jbGllbnRfaWQgPT0gY2xpZW50X2lkKQotCQkJYnJlYWs7Ci0JaWYgKFdBUk5fT04oZGV2LT5tZV9jbGllbnRzW2ldLmNsaWVudF9pZCAhPSBjbGllbnRfaWQpKQotCQlyZXR1cm4gLUVOT0VOVDsKKwkJCXJldHVybiBpOwogCi0JaWYgKGkgPT0gZGV2LT5tZV9jbGllbnRzX251bSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlyZXR1cm4gaTsKKwlyZXR1cm4gLUVOT0VOVDsKIH0KIAogCiAvKioKKyAqIG1laV9jbF9jbXBfaWQgLSB0ZWxscyBpZiB0aGUgY2xpZW50cyBhcmUgdGhlIHNhbWUKKyAqCisgKiBAY2wxOiBob3N0IGNsaWVudCAxCisgKiBAY2wyOiBob3N0IGNsaWVudCAyCisgKgorICogcmV0dXJucyB0cnVlICAtIGlmIHRoZSBjbGllbnRzIGhhcyBzYW1lIGhvc3QgYW5kIG1lIGlkcworICogICAgICAgICBmYWxzZSAtIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWVpX2NsX2NtcF9pZChjb25zdCBzdHJ1Y3QgbWVpX2NsICpjbDEsCisJCQkJY29uc3Qgc3RydWN0IG1laV9jbCAqY2wyKQoreworCXJldHVybiBjbDEgJiYgY2wyICYmCisJCShjbDEtPmhvc3RfY2xpZW50X2lkID09IGNsMi0+aG9zdF9jbGllbnRfaWQpICYmCisJCShjbDEtPm1lX2NsaWVudF9pZCA9PSBjbDItPm1lX2NsaWVudF9pZCk7Cit9CisKKy8qKgorICogbWVpX2lvX2xpc3RfZmx1c2ggLSByZW1vdmVzIGNicyBiZWxvbmdpbmcgdG8gY2wuCisgKgorICogQGxpc3Q6ICBhbiBpbnN0YW5jZSBvZiBvdXIgbGlzdCBzdHJ1Y3R1cmUKKyAqIEBjbDogICAgaG9zdCBjbGllbnQsIGNhbiBiZSBOVUxMIGZvciBmbHVzaGluZyB0aGUgd2hvbGUgbGlzdAorICogQGZyZWU6ICB3aGV0aGVyIHRvIGZyZWUgdGhlIGNicworICovCitzdGF0aWMgdm9pZCBfX21laV9pb19saXN0X2ZsdXNoKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsCisJCQkJc3RydWN0IG1laV9jbCAqY2wsIGJvb2wgZnJlZSkKK3sKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpuZXh0OworCisJLyogZW5hYmxlIHJlbW92aW5nIGV2ZXJ5dGhpbmcgaWYgbm8gY2wgaXMgc3BlY2lmaWVkICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCAmbGlzdC0+bGlzdCwgbGlzdCkgeworCQlpZiAoIWNsIHx8IChjYi0+Y2wgJiYgbWVpX2NsX2NtcF9pZChjbCwgY2ItPmNsKSkpIHsKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CisJCQlpZiAoZnJlZSkKKwkJCQltZWlfaW9fY2JfZnJlZShjYik7CisJCX0KKwl9Cit9CisKKy8qKgogICogbWVpX2lvX2xpc3RfZmx1c2ggLSByZW1vdmVzIGxpc3QgZW50cnkgYmVsb25naW5nIHRvIGNsLgogICoKICAqIEBsaXN0OiAgQW4gaW5zdGFuY2Ugb2Ygb3VyIGxpc3Qgc3RydWN0dXJlCiAgKiBAY2w6IGhvc3QgY2xpZW50CiAgKi8KLXZvaWQgbWVpX2lvX2xpc3RfZmx1c2goc3RydWN0IG1laV9jbF9jYiAqbGlzdCwgc3RydWN0IG1laV9jbCAqY2wpCitzdGF0aWMgaW5saW5lIHZvaWQgbWVpX2lvX2xpc3RfZmx1c2goc3RydWN0IG1laV9jbF9jYiAqbGlzdCwgc3RydWN0IG1laV9jbCAqY2wpCiB7Ci0Jc3RydWN0IG1laV9jbF9jYiAqY2I7Ci0Jc3RydWN0IG1laV9jbF9jYiAqbmV4dDsKKwlfX21laV9pb19saXN0X2ZsdXNoKGxpc3QsIGNsLCBmYWxzZSk7Cit9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2IsIG5leHQsICZsaXN0LT5saXN0LCBsaXN0KSB7Ci0JCWlmIChjYi0+Y2wgJiYgbWVpX2NsX2NtcF9pZChjbCwgY2ItPmNsKSkKLQkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7Ci0JfQorCisvKioKKyAqIG1laV9pb19saXN0X2ZyZWUgLSByZW1vdmVzIGNiIGJlbG9uZ2luZyB0byBjbCBhbmQgZnJlZSB0aGVtCisgKgorICogQGxpc3Q6ICBBbiBpbnN0YW5jZSBvZiBvdXIgbGlzdCBzdHJ1Y3R1cmUKKyAqIEBjbDogaG9zdCBjbGllbnQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1laV9pb19saXN0X2ZyZWUoc3RydWN0IG1laV9jbF9jYiAqbGlzdCwgc3RydWN0IG1laV9jbCAqY2wpCit7CisJX19tZWlfaW9fbGlzdF9mbHVzaChsaXN0LCBjbCwgdHJ1ZSk7CiB9CiAKIC8qKgpAQCAtMTk2LDggKzIzOSw4IEBACiAKIAljbF9kYmcoZGV2LCBjbCwgInJlbW92ZSBsaXN0IGVudHJ5IGJlbG9uZ2luZyB0byBjbFxuIik7CiAJbWVpX2lvX2xpc3RfZmx1c2goJmNsLT5kZXYtPnJlYWRfbGlzdCwgY2wpOwotCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT53cml0ZV9saXN0LCBjbCk7Ci0JbWVpX2lvX2xpc3RfZmx1c2goJmNsLT5kZXYtPndyaXRlX3dhaXRpbmdfbGlzdCwgY2wpOworCW1laV9pb19saXN0X2ZyZWUoJmNsLT5kZXYtPndyaXRlX2xpc3QsIGNsKTsKKwltZWlfaW9fbGlzdF9mcmVlKCZjbC0+ZGV2LT53cml0ZV93YWl0aW5nX2xpc3QsIGNsKTsKIAltZWlfaW9fbGlzdF9mbHVzaCgmY2wtPmRldi0+Y3RybF93cl9saXN0LCBjbCk7CiAJbWVpX2lvX2xpc3RfZmx1c2goJmNsLT5kZXYtPmN0cmxfcmRfbGlzdCwgY2wpOwogCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT5hbXRoaWZfY21kX2xpc3QsIGNsKTsKQEAgLTI1NCwxMCArMjk3LDkgQEAKIHN0cnVjdCBtZWlfY2xfY2IgKm1laV9jbF9maW5kX3JlYWRfY2Ioc3RydWN0IG1laV9jbCAqY2wpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7Ci0Jc3RydWN0IG1laV9jbF9jYiAqY2IgPSBOVUxMOwotCXN0cnVjdCBtZWlfY2xfY2IgKm5leHQgPSBOVUxMOworCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCAmZGV2LT5yZWFkX2xpc3QubGlzdCwgbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNiLCAmZGV2LT5yZWFkX2xpc3QubGlzdCwgbGlzdCkKIAkJaWYgKG1laV9jbF9jbXBfaWQoY2wsIGNiLT5jbCkpCiAJCQlyZXR1cm4gY2I7CiAJcmV0dXJuIE5VTEw7CkBAIC0zNzUsNiArNDE3LDIzIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIH0KIAorLyoqCisgKiBtZWlfaGJ1Zl9hY3F1aXJlOiB0cnkgdG8gYWNxdWlyZSBob3N0IGJ1ZmZlcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiByZXR1cm5zIHRydWUgaWYgaG9zdCBidWZmZXIgd2FzIGFjcXVpcmVkCisgKi8KK2Jvb2wgbWVpX2hidWZfYWNxdWlyZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCWlmICghZGV2LT5oYnVmX2lzX3JlYWR5KSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaGJ1ZiBpcyBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZGV2LT5oYnVmX2lzX3JlYWR5ID0gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KIAogLyoqCiAgKiBtZWlfY2xfZGlzY29ubmVjdCAtIGRpc2Nvbm5lY3QgaG9zdCBjbGllbnQgZnJvbSB0aGUgbWUgb25lCkBAIC00MDYsOCArNDY1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0NMT1NFOwotCWlmIChkZXYtPmhidWZfaXNfcmVhZHkpIHsKLQkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gZmFsc2U7CisJaWYgKG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCQlpZiAobWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcShkZXYsIGNsKSkgewogCQkJcmV0cyA9IC1FTk9ERVY7CiAJCQljbF9lcnIoZGV2LCBjbCwgImZhaWxlZCB0byBkaXNjb25uZWN0LlxuIik7CkBAIC00NjEsMTcgKzUxOSwxNyBAQAogYm9vbCBtZWlfY2xfaXNfb3RoZXJfY29ubmVjdGluZyhzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwotCXN0cnVjdCBtZWlfY2wgKnBvczsKLQlzdHJ1Y3QgbWVpX2NsICpuZXh0OworCXN0cnVjdCBtZWlfY2wgKm9jbDsgLyogdGhlIG90aGVyIGNsaWVudCAqLwogCiAJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+ZGV2KSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJZGV2ID0gY2wtPmRldjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsICZkZXYtPmZpbGVfbGlzdCwgbGluaykgewotCQlpZiAoKHBvcy0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVElORykgJiYKLQkJICAgIChwb3MgIT0gY2wpICYmIGNsLT5tZV9jbGllbnRfaWQgPT0gcG9zLT5tZV9jbGllbnRfaWQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvY2wsICZkZXYtPmZpbGVfbGlzdCwgbGluaykgeworCQlpZiAob2NsLT5zdGF0ZSA9PSBNRUlfRklMRV9DT05ORUNUSU5HICYmCisJCSAgICBvY2wgIT0gY2wgJiYKKwkJICAgIGNsLT5tZV9jbGllbnRfaWQgPT0gb2NsLT5tZV9jbGllbnRfaWQpCiAJCQlyZXR1cm4gdHJ1ZTsKIAogCX0KQEAgLTUwNSwxMSArNTYzLDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfSU9DVEw7CisJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9DT05ORUNUOwogCi0JaWYgKGRldi0+aGJ1Zl9pc19yZWFkeSAmJiAhbWVpX2NsX2lzX290aGVyX2Nvbm5lY3RpbmcoY2wpKSB7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOwotCisJLyogcnVuIGhidWYgYWNxdWlyZSBsYXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gdW5kbyAqLworCWlmICghbWVpX2NsX2lzX290aGVyX2Nvbm5lY3RpbmcoY2wpICYmIG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCQlpZiAobWVpX2hibV9jbF9jb25uZWN0X3JlcShkZXYsIGNsKSkgewogCQkJcmV0cyA9IC1FTk9ERVY7CiAJCQlnb3RvIG91dDsKQEAgLTUyMSwxOCArNTc4LDE5IEBACiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQlyZXRzID0gd2FpdF9ldmVudF90aW1lb3V0KGRldi0+d2FpdF9yZWN2ZF9tc2csCi0JCQkJIChjbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVEVEIHx8Ci0JCQkJICBjbC0+c3RhdGUgPT0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEKSwKLQkJCQkgbWVpX3NlY3NfdG9famlmZmllcyhNRUlfQ0xfQ09OTkVDVF9USU1FT1VUKSk7CisJd2FpdF9ldmVudF90aW1lb3V0KGRldi0+d2FpdF9yZWN2ZF9tc2csCisJCQkoY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRCB8fAorCQkJIGNsLT5zdGF0ZSA9PSBNRUlfRklMRV9ESVNDT05ORUNURUQpLAorCQkJbWVpX3NlY3NfdG9famlmZmllcyhNRUlfQ0xfQ09OTkVDVF9USU1FT1VUKSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAKIAlpZiAoY2wtPnN0YXRlICE9IE1FSV9GSUxFX0NPTk5FQ1RFRCkgewotCQlyZXRzID0gLUVGQVVMVDsKKwkJLyogc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nICovCisJCWlmICghY2wtPnN0YXR1cykKKwkJCWNsLT5zdGF0dXMgPSAtRUZBVUxUOwogCiAJCW1laV9pb19saXN0X2ZsdXNoKCZkZXYtPmN0cmxfcmRfbGlzdCwgY2wpOwogCQltZWlfaW9fbGlzdF9mbHVzaCgmZGV2LT5jdHJsX3dyX2xpc3QsIGNsKTsKLQkJZ290byBvdXQ7CiAJfQogCiAJcmV0cyA9IGNsLT5zdGF0dXM7CkBAIC01NTQsNyArNjEyLDggQEAKIGludCBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKHN0cnVjdCBtZWlfY2wgKmNsKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7Ci0JaW50IGk7CisJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOworCWludCBpZDsKIAogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTY3LDE5ICs2MjYsMTkgQEAKIAlpZiAoY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPiAwKQogCQlyZXR1cm4gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyBpKyspIHsKLQkJc3RydWN0IG1laV9tZV9jbGllbnQgICptZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaV07Ci0JCWlmIChtZV9jbC0+Y2xpZW50X2lkID09IGNsLT5tZV9jbGllbnRfaWQpIHsKLQkJCWlmIChtZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcykgewotCQkJCWlmIChXQVJOX09OKG1lX2NsLT5wcm9wcy5zaW5nbGVfcmVjdl9idWYgPT0gMCkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQorCWlkID0gbWVpX21lX2NsX2J5X2lkKGRldiwgY2wtPm1lX2NsaWVudF9pZCk7CisJaWYgKGlkIDwgMCkgeworCQljbF9lcnIoZGV2LCBjbCwgIm5vIHN1Y2ggbWUgY2xpZW50ICVkXG4iLCBjbC0+bWVfY2xpZW50X2lkKTsKKwkJcmV0dXJuIGlkOwogCX0KLQlyZXR1cm4gLUVOT0VOVDsKKworCW1lX2NsID0gJmRldi0+bWVfY2xpZW50c1tpZF07CisJaWYgKG1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzKSB7CisJCWlmIChXQVJOX09OKG1lX2NsLT5wcm9wcy5zaW5nbGVfcmVjdl9idWYgPT0gMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwogfQogCiAvKioKQEAgLTU5NSwzMiArNjU0LDMxIEBACiBpbnQgbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2Uoc3RydWN0IG1laV9jbCAqY2wpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKLQlpbnQgaTsKKwlzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2w7CisJaW50IGlkOwogCiAJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+ZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkZXYgPSBjbC0+ZGV2OwogCi0JaWYgKCFkZXYtPm1lX2NsaWVudHNfbnVtKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyBpKyspIHsKLQkJc3RydWN0IG1laV9tZV9jbGllbnQgICptZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaV07Ci0JCWlmIChtZV9jbC0+Y2xpZW50X2lkID09IGNsLT5tZV9jbGllbnRfaWQpIHsKLQkJCWlmIChtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmICE9IDApIHsKLQkJCQlpZiAoV0FSTl9PTihtZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJZGV2LT5tZV9jbGllbnRzW2ldLm1laV9mbG93X2N0cmxfY3JlZHMtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKFdBUk5fT04oY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzLS07Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQorCWlkID0gbWVpX21lX2NsX2J5X2lkKGRldiwgY2wtPm1lX2NsaWVudF9pZCk7CisJaWYgKGlkIDwgMCkgeworCQljbF9lcnIoZGV2LCBjbCwgIm5vIHN1Y2ggbWUgY2xpZW50ICVkXG4iLCBjbC0+bWVfY2xpZW50X2lkKTsKKwkJcmV0dXJuIGlkOwogCX0KLQlyZXR1cm4gLUVOT0VOVDsKKworCW1lX2NsID0gJmRldi0+bWVfY2xpZW50c1tpZF07CisJaWYgKG1lX2NsLT5wcm9wcy5zaW5nbGVfcmVjdl9idWYgIT0gMCkgeworCQlpZiAoV0FSTl9PTihtZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOworCX0gZWxzZSB7CisJCWlmIChXQVJOX09OKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzIDw9IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzLS07CisJfQorCXJldHVybiAwOwogfQogCiAvKioKQEAgLTY1Miw3ICs3MTAsNyBAQAogCWkgPSBtZWlfbWVfY2xfYnlfaWQoZGV2LCBjbC0+bWVfY2xpZW50X2lkKTsKIAlpZiAoaSA8IDApIHsKIAkJY2xfZXJyKGRldiwgY2wsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwgY2wtPm1lX2NsaWVudF9pZCk7Ci0JCXJldHVybiAgLUVOT0RFVjsKKwkJcmV0dXJuICAtRU5PVFRZOwogCX0KIAogCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIE5VTEwpOwpAQCAtNjY2LDggKzcyNCw3IEBACiAJCWdvdG8gZXJyOwogCiAJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9SRUFEOwotCWlmIChkZXYtPmhidWZfaXNfcmVhZHkpIHsKLQkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gZmFsc2U7CisJaWYgKG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCQlpZiAobWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVxKGRldiwgY2wpKSB7CiAJCQljbF9lcnIoZGV2LCBjbCwgImZsb3cgY29udHJvbCBzZW5kIGZhaWxlZFxuIik7CiAJCQlyZXRzID0gLUVOT0RFVjsKQEAgLTY4NywyNyArNzQ0LDI2IEBACiB9CiAKIC8qKgotICogbWVpX2NsX2lycV93cml0ZV9jb21wbGV0ZSAtIHdyaXRlIGEgbWVzc2FnZSB0byBkZXZpY2UKKyAqIG1laV9jbF9pcnFfd3JpdGUgLSB3cml0ZSBhIG1lc3NhZ2UgdG8gZGV2aWNlCiAgKglmcm9tIHRoZSBpbnRlcnJ1cHQgdGhyZWFkIGNvbnRleHQKICAqCiAgKiBAY2w6IGNsaWVudAogICogQGNiOiBjYWxsYmFjayBibG9jay4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjbXBsX2xpc3Q6IGNvbXBsZXRlIGxpc3QuCiAgKgogICogcmV0dXJucyAwLCBPSzsgb3RoZXJ3aXNlIGVycm9yLgogICovCi1pbnQgbWVpX2NsX2lycV93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkJICAgICBzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCitpbnQgbWVpX2NsX2lycV93cml0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCisJCSAgICAgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CiAJc3RydWN0IG1laV9tc2dfZGF0YSAqYnVmOwogCXN0cnVjdCBtZWlfbXNnX2hkciBtZWlfaGRyOwogCXNpemVfdCBsZW47CiAJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CiAJaW50IHJldHM7CiAKLQogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC03MjQsNiArNzgwLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJc2xvdHMgPSBtZWlfaGJ1Zl9lbXB0eV9zbG90cyhkZXYpOwogCWxlbiA9IGJ1Zi0+c2l6ZSAtIGNiLT5idWZfaWR4OwogCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKGxlbik7CiAKQEAgLTczMiwxMyArNzg5LDEzIEBACiAJbWVpX2hkci5yZXNlcnZlZCA9IDA7CiAJbWVpX2hkci5pbnRlcm5hbCA9IGNiLT5pbnRlcm5hbDsKIAotCWlmICgqc2xvdHMgPj0gbXNnX3Nsb3RzKSB7CisJaWYgKHNsb3RzID49IG1zZ19zbG90cykgewogCQltZWlfaGRyLmxlbmd0aCA9IGxlbjsKIAkJbWVpX2hkci5tc2dfY29tcGxldGUgPSAxOwogCS8qIFNwbGl0IHRoZSBtZXNzYWdlIG9ubHkgaWYgd2UgY2FuIHdyaXRlIHRoZSB3aG9sZSBob3N0IGJ1ZmZlciAqLwotCX0gZWxzZSBpZiAoKnNsb3RzID09IGRldi0+aGJ1Zl9kZXB0aCkgewotCQltc2dfc2xvdHMgPSAqc2xvdHM7Ci0JCWxlbiA9ICgqc2xvdHMgKiBzaXplb2YodTMyKSkgLSBzaXplb2Yoc3RydWN0IG1laV9tc2dfaGRyKTsKKwl9IGVsc2UgaWYgKHNsb3RzID09IGRldi0+aGJ1Zl9kZXB0aCkgeworCQltc2dfc2xvdHMgPSBzbG90czsKKwkJbGVuID0gKHNsb3RzICogc2l6ZW9mKHUzMikpIC0gc2l6ZW9mKHN0cnVjdCBtZWlfbXNnX2hkcik7CiAJCW1laV9oZHIubGVuZ3RoID0gbGVuOwogCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDA7CiAJfSBlbHNlIHsKQEAgLTc0OSw3ICs4MDYsNiBAQAogCWNsX2RiZyhkZXYsIGNsLCAiYnVmOiBzaXplID0gJWQgaWR4ID0gJWx1XG4iLAogCQkJY2ItPnJlcXVlc3RfYnVmZmVyLnNpemUsIGNiLT5idWZfaWR4KTsKIAotCSpzbG90cyAtPSAgbXNnX3Nsb3RzOwogCXJldHMgPSBtZWlfd3JpdGVfbWVzc2FnZShkZXYsICZtZWlfaGRyLCBidWYtPmRhdGEgKyBjYi0+YnVmX2lkeCk7CiAJaWYgKHJldHMpIHsKIAkJY2wtPnN0YXR1cyA9IHJldHM7CkBAIC04MDIsMjEgKzg1OCwyOSBAQAogCiAKIAljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX1dSSVRFOworCWNiLT5idWZfaWR4ID0gMDsKKwljbC0+d3JpdGluZ19zdGF0ZSA9IE1FSV9JRExFOworCisJbWVpX2hkci5ob3N0X2FkZHIgPSBjbC0+aG9zdF9jbGllbnRfaWQ7CisJbWVpX2hkci5tZV9hZGRyID0gY2wtPm1lX2NsaWVudF9pZDsKKwltZWlfaGRyLnJlc2VydmVkID0gMDsKKwltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDA7CisJbWVpX2hkci5pbnRlcm5hbCA9IGNiLT5pbnRlcm5hbDsKIAogCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKGNsKTsKIAlpZiAocmV0cyA8IDApCiAJCWdvdG8gZXJyOwogCi0JLyogSG9zdCBidWZmZXIgaXMgbm90IHJlYWR5LCB3ZSBxdWV1ZSB0aGUgcmVxdWVzdCAqLwotCWlmIChyZXRzID09IDAgfHwgIWRldi0+aGJ1Zl9pc19yZWFkeSkgewotCQljYi0+YnVmX2lkeCA9IDA7Ci0JCS8qIHVuc2V0aW5nIGNvbXBsZXRlIHdpbGwgZW5xdWV1ZSB0aGUgY2IgZm9yIHdyaXRlICovCi0JCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMDsKKwlpZiAocmV0cyA9PSAwKSB7CisJCWNsX2RiZyhkZXYsIGNsLCAiTm8gZmxvdyBjb250cm9sIGNyZWRlbnRpYWxzOiBub3Qgc2VuZGluZy5cbiIpOwogCQlyZXRzID0gYnVmLT5zaXplOwogCQlnb3RvIG91dDsKIAl9Ci0KLQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKKwlpZiAoIW1laV9oYnVmX2FjcXVpcmUoZGV2KSkgeworCQljbF9kYmcoZGV2LCBjbCwgIkNhbm5vdCBhY3F1aXJlIHRoZSBob3N0IGJ1ZmZlcjogbm90IHNlbmRpbmcuXG4iKTsKKwkJcmV0cyA9IGJ1Zi0+c2l6ZTsKKwkJZ290byBvdXQ7CisJfQogCiAJLyogQ2hlY2sgZm9yIGEgbWF4aW11bSBsZW5ndGggKi8KIAlpZiAoYnVmLT5zaXplID4gbWVpX2hidWZfbWF4X2xlbihkZXYpKSB7CkBAIC04MjcsMTIgKzg5MSw2IEBACiAJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMTsKIAl9CiAKLQltZWlfaGRyLmhvc3RfYWRkciA9IGNsLT5ob3N0X2NsaWVudF9pZDsKLQltZWlfaGRyLm1lX2FkZHIgPSBjbC0+bWVfY2xpZW50X2lkOwotCW1laV9oZHIucmVzZXJ2ZWQgPSAwOwotCW1laV9oZHIuaW50ZXJuYWwgPSBjYi0+aW50ZXJuYWw7Ci0KLQogCXJldHMgPSBtZWlfd3JpdGVfbWVzc2FnZShkZXYsICZtZWlfaGRyLCBidWYtPmRhdGEpOwogCWlmIChyZXRzKQogCQlnb3RvIGVycjsKQEAgLTg0MCwxMyArODk4LDEyIEBACiAJY2wtPndyaXRpbmdfc3RhdGUgPSBNRUlfV1JJVElORzsKIAljYi0+YnVmX2lkeCA9IG1laV9oZHIubGVuZ3RoOwogCi0JcmV0cyA9IGJ1Zi0+c2l6ZTsKIG91dDoKIAlpZiAobWVpX2hkci5tc2dfY29tcGxldGUpIHsKLQkJaWYgKG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKGNsKSkgewotCQkJcmV0cyA9IC1FTk9ERVY7CisJCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCk7CisJCWlmIChyZXRzIDwgMCkKIAkJCWdvdG8gZXJyOwotCQl9CisKIAkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPndyaXRlX3dhaXRpbmdfbGlzdC5saXN0KTsKIAl9IGVsc2UgewogCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+d3JpdGVfbGlzdC5saXN0KTsKQEAgLTg1NiwxNSArOTEzLDE4IEBACiAJaWYgKGJsb2NraW5nICYmIGNsLT53cml0aW5nX3N0YXRlICE9IE1FSV9XUklURV9DT01QTEVURSkgewogCiAJCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0JCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2wtPnR4X3dhaXQsCi0JCQljbC0+d3JpdGluZ19zdGF0ZSA9PSBNRUlfV1JJVEVfQ09NUExFVEUpKSB7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQlyZXRzID0gLUVJTlRSOwotCQkJCWVsc2UKLQkJCQkJcmV0cyA9IC1FUkVTVEFSVFNZUzsKLQkJfQorCQlyZXRzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNsLT50eF93YWl0LAorCQkJCWNsLT53cml0aW5nX3N0YXRlID09IE1FSV9XUklURV9DT01QTEVURSk7CiAJCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCQkvKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgcmV0dXJucyAtRVJFU1RBUlRTWVMgKi8KKwkJaWYgKHJldHMpIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXRzID0gLUVJTlRSOworCQkJZ290byBlcnI7CisJCX0KIAl9CisKKwlyZXRzID0gYnVmLT5zaXplOwogZXJyOgogCXJldHVybiByZXRzOwogfQpAQCAtOTA1LDkgKzk2NSw5IEBACiAKIHZvaWQgbWVpX2NsX2FsbF9kaXNjb25uZWN0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1laV9jbCAqY2wsICpuZXh0OworCXN0cnVjdCBtZWlfY2wgKmNsOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKIAkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwogCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA9IDA7CiAJCWNsLT50aW1lcl9jb3VudCA9IDA7CkBAIC05MjIsOCArOTgyLDggQEAKICAqLwogdm9pZCBtZWlfY2xfYWxsX3dha2V1cChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtZWlfY2wgKmNsLCAqbmV4dDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2wsIG5leHQsICZkZXYtPmZpbGVfbGlzdCwgbGluaykgeworCXN0cnVjdCBtZWlfY2wgKmNsOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2wsICZkZXYtPmZpbGVfbGlzdCwgbGluaykgewogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmY2wtPnJ4X3dhaXQpKSB7CiAJCQljbF9kYmcoZGV2LCBjbCwgIldha2luZyB1cCByZWFkaW5nIGNsaWVudCFcbiIpOwogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbC0+cnhfd2FpdCk7CkBAIC05NDIsMjAgKzEwMDIsOCBAQAogICovCiB2b2lkIG1laV9jbF9hbGxfd3JpdGVfY2xlYXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgKm5leHQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQotCWxpc3QgPSAmZGV2LT53cml0ZV9saXN0Lmxpc3Q7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCBsaXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZjYi0+bGlzdCk7Ci0JCW1laV9pb19jYl9mcmVlKGNiKTsKLQl9Ci0KLQlsaXN0ID0gJmRldi0+d3JpdGVfd2FpdGluZ19saXN0Lmxpc3Q7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCBsaXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZjYi0+bGlzdCk7Ci0JCW1laV9pb19jYl9mcmVlKGNiKTsKLQl9CisJbWVpX2lvX2xpc3RfZnJlZSgmZGV2LT53cml0ZV9saXN0LCBOVUxMKTsKKwltZWlfaW9fbGlzdF9mcmVlKCZkZXYtPndyaXRlX3dhaXRpbmdfbGlzdCwgTlVMTCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuaCBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmgKaW5kZXggYzgzOTZlNS4uOTZkNWRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oCkBAIC00NSw4ICs0NSw2IEBACiB7CiAJSU5JVF9MSVNUX0hFQUQoJmxpc3QtPmxpc3QpOwogfQotdm9pZCBtZWlfaW9fbGlzdF9mbHVzaChzdHJ1Y3QgbWVpX2NsX2NiICpsaXN0LCBzdHJ1Y3QgbWVpX2NsICpjbCk7Ci0KIC8qCiAgKiBNRUkgSG9zdCBDbGllbnQgRnVuY3Rpb25zCiAgKi8KQEAgLTYxLDIyICs1OSw2IEBACiBpbnQgbWVpX2NsX2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgbWVpX2NsICpjbCk7CiBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfY2xfZmluZF9yZWFkX2NiKHN0cnVjdCBtZWlfY2wgKmNsKTsKIAotLyoqCi0gKiBtZWlfY2xfY21wX2lkIC0gdGVsbHMgaWYgZmlsZSBwcml2YXRlIGRhdGEgaGF2ZSBzYW1lIGlkCi0gKgotICogQGZlMTogcHJpdmF0ZSBkYXRhIG9mIDEuIGZpbGUgb2JqZWN0Ci0gKiBAZmUyOiBwcml2YXRlIGRhdGEgb2YgMi4gZmlsZSBvYmplY3QKLSAqCi0gKiByZXR1cm5zIHRydWUgIC0gaWYgaWRzIGFyZSB0aGUgc2FtZSBhbmQgbm90IE5VTEwKLSAqLwotc3RhdGljIGlubGluZSBib29sIG1laV9jbF9jbXBfaWQoY29uc3Qgc3RydWN0IG1laV9jbCAqY2wxLAotCQkJCWNvbnN0IHN0cnVjdCBtZWlfY2wgKmNsMikKLXsKLQlyZXR1cm4gY2wxICYmIGNsMiAmJgotCQkoY2wxLT5ob3N0X2NsaWVudF9pZCA9PSBjbDItPmhvc3RfY2xpZW50X2lkKSAmJgotCQkoY2wxLT5tZV9jbGllbnRfaWQgPT0gY2wyLT5tZV9jbGllbnRfaWQpOwotfQotCiAKIGludCBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKHN0cnVjdCBtZWlfY2wgKmNsKTsKIApAQCAtODYsMTUgKzY4LDE1IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBtZWlfY2xfaXNfY29ubmVjdGVkKHN0cnVjdCBtZWlfY2wgKmNsKQogewotCXJldHVybiAoY2wtPmRldiAmJgorCXJldHVybiAgY2wtPmRldiAmJgogCQljbC0+ZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9FTkFCTEVEICYmCi0JCWNsLT5zdGF0ZSA9PSBNRUlfRklMRV9DT05ORUNURUQpOworCQljbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVEVEOwogfQogc3RhdGljIGlubGluZSBib29sIG1laV9jbF9pc190cmFuc2l0aW9uaW5nKHN0cnVjdCBtZWlfY2wgKmNsKQogewotCXJldHVybiAoTUVJX0ZJTEVfSU5JVElBTElaSU5HID09IGNsLT5zdGF0ZSB8fAorCXJldHVybiAgTUVJX0ZJTEVfSU5JVElBTElaSU5HID09IGNsLT5zdGF0ZSB8fAogCQlNRUlfRklMRV9ESVNDT05ORUNURUQgPT0gY2wtPnN0YXRlIHx8Ci0JCU1FSV9GSUxFX0RJU0NPTk5FQ1RJTkcgPT0gY2wtPnN0YXRlKTsKKwkJTUVJX0ZJTEVfRElTQ09OTkVDVElORyA9PSBjbC0+c3RhdGU7CiB9CiAKIGJvb2wgbWVpX2NsX2lzX290aGVyX2Nvbm5lY3Rpbmcoc3RydWN0IG1laV9jbCAqY2wpOwpAQCAtMTAyLDggKzg0LDggQEAKIGludCBtZWlfY2xfY29ubmVjdChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IGZpbGUgKmZpbGUpOwogaW50IG1laV9jbF9yZWFkX3N0YXJ0KHN0cnVjdCBtZWlfY2wgKmNsLCBzaXplX3QgbGVuZ3RoKTsKIGludCBtZWlfY2xfd3JpdGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLCBib29sIGJsb2NraW5nKTsKLWludCBtZWlfY2xfaXJxX3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKLQkJCQlzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpOworaW50IG1laV9jbF9pcnFfd3JpdGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkgICAgIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCk7CiAKIHZvaWQgbWVpX2NsX2NvbXBsZXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jIGIvZHJpdmVycy9taXNjL21laS9kZWJ1Z2ZzLmMKaW5kZXggYTNhZTE1NC4uY2VkNWI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9kZWJ1Z2ZzLmMKQEAgLTc1LDYgKzc1LDU0IEBACiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCitzdGF0aWMgc3NpemVfdCBtZWlfZGJnZnNfcmVhZF9hY3RpdmUoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCQkJc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBmcC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtZWlfY2wgKmNsOworCWNvbnN0IHNpemVfdCBidWZzeiA9IDEwMjQ7CisJY2hhciAqYnVmOworCWludCBpID0gMDsKKwlpbnQgcG9zID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSIgIHxtZXxob3N0fHN0YXRlfHJkfHdyfFxuIik7CisKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKworCS8qICBpZiB0aGUgZHJpdmVyIGlzIG5vdCBlbmFibGVkIHRoZSBsaXN0IHdvbid0IGIgY29uc2l0ZW50ICovCisJaWYgKGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfRU5BQkxFRCkKKwkJZ290byBvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKworCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkiJTJkfCUyZHwlNGR8JTVkfCUyZHwlMmR8XG4iLAorCQkJaSwgY2wtPm1lX2NsaWVudF9pZCwgY2wtPmhvc3RfY2xpZW50X2lkLCBjbC0+c3RhdGUsCisJCQljbC0+cmVhZGluZ19zdGF0ZSwgY2wtPndyaXRpbmdfc3RhdGUpOworCQlpKys7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY250LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZWlfZGJnZnNfZm9wc19hY3RpdmUgPSB7CisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKKwkucmVhZCA9IG1laV9kYmdmc19yZWFkX2FjdGl2ZSwKKwkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKK307CisKIHN0YXRpYyBzc2l6ZV90IG1laV9kYmdmc19yZWFkX2RldnN0YXRlKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKnVidWYsCiAJCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTEyOCw2ICsxNzYsMTIgQEAKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJtZWNsaWVudHM6IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CisJZiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFjdGl2ZSIsIFNfSVJVU1IsIGRpciwKKwkJCQlkZXYsICZtZWlfZGJnZnNfZm9wc19hY3RpdmUpOworCWlmICghZikgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm1lY2xpZW50czogcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KIAlmID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZGV2c3RhdGUiLCBTX0lSVVNSLCBkaXIsCiAJCQkJZGV2LCAmbWVpX2RiZ2ZzX2ZvcHNfZGV2c3RhdGUpOwogCWlmICghZikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9oYm0uYyBiL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMKaW5kZXggMjhjZDc0Yy4uNDk2MDI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9oYm0uYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5jCkBAIC0yMSw3ICsyMSw0MSBAQAogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgogI2luY2x1ZGUgImhibS5oIgotI2luY2x1ZGUgImh3LW1lLmgiCisjaW5jbHVkZSAiY2xpZW50LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICptZWlfY2xfY29ubl9zdGF0dXNfc3RyKGVudW0gbWVpX2NsX2Nvbm5lY3Rfc3RhdHVzIHN0YXR1cykKK3sKKyNkZWZpbmUgTUVJX0NMX0NTKHN0YXR1cykgY2FzZSBNRUlfQ0xfQ09OTl8jI3N0YXR1czogcmV0dXJuICNzdGF0dXMKKwlzd2l0Y2ggKHN0YXR1cykgeworCU1FSV9DTF9DUyhTVUNDRVNTKTsKKwlNRUlfQ0xfQ1MoTk9UX0ZPVU5EKTsKKwlNRUlfQ0xfQ1MoQUxSRUFEWV9TVEFSVEVEKTsKKwlNRUlfQ0xfQ1MoT1VUX09GX1JFU09VUkNFUyk7CisJTUVJX0NMX0NTKE1FU1NBR0VfU01BTEwpOworCWRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7CisJfQorI3VuZGVmIE1FSV9DTF9DQ1MKK30KKworLyoqCisgKiBtZWlfY2xfY29ubl9zdGF0dXNfdG9fZXJybm8gLSBjb252ZXJ0IGNsaWVudCBjb25uZWN0IHJlc3BvbnNlCisgKiBzdGF0dXMgdG8gZXJyb3IgY29kZQorICoKKyAqIEBzdGF0dXM6IGNsaWVudCBjb25uZWN0IHJlc3BvbnNlIHN0YXR1cworICoKKyAqIHJldHVybnMgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWVpX2NsX2Nvbm5fc3RhdHVzX3RvX2Vycm5vKGVudW0gbWVpX2NsX2Nvbm5lY3Rfc3RhdHVzIHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgTUVJX0NMX0NPTk5fU1VDQ0VTUzogICAgICAgICAgcmV0dXJuIDA7CisJY2FzZSBNRUlfQ0xfQ09OTl9OT1RfRk9VTkQ6ICAgICAgICByZXR1cm4gLUVOT1RUWTsKKwljYXNlIE1FSV9DTF9DT05OX0FMUkVBRFlfU1RBUlRFRDogIHJldHVybiAtRUJVU1k7CisJY2FzZSBNRUlfQ0xfQ09OTl9PVVRfT0ZfUkVTT1VSQ0VTOiByZXR1cm4gLUVCVVNZOworCWNhc2UgTUVJX0NMX0NPTk5fTUVTU0FHRV9TTUFMTDogICAgcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwl9Cit9CiAKIC8qKgogICogbWVpX2hibV9tZV9jbF9hbGxvY2F0ZSAtIGFsbG9jYXRlcyBzdG9yYWdlIGZvciBtZSBjbGllbnRzCkBAIC0xMDAsMzMgKzEzNCw2IEBACiAKIAogLyoqCi0gKiBpc190cmVhdF9zcGVjaWFsbHlfY2xpZW50IC0gY2hlY2tzIGlmIHRoZSBtZXNzYWdlIGJlbG9uZ3MKLSAqIHRvIHRoZSBmaWxlIHByaXZhdGUgZGF0YS4KLSAqCi0gKiBAY2w6IHByaXZhdGUgZGF0YSBvZiB0aGUgZmlsZSBvYmplY3QKLSAqIEByczogY29ubmVjdCByZXNwb25zZSBidXMgbWVzc2FnZQotICoKLSAqLwotc3RhdGljIGJvb2wgaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudChzdHJ1Y3QgbWVpX2NsICpjbCwKLQkJc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSAqcnMpCi17Ci0JaWYgKG1laV9oYm1fY2xfYWRkcl9lcXVhbChjbCwgcnMpKSB7Ci0JCWlmICghcnMtPnN0YXR1cykgewotCQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfQ09OTkVDVEVEOwotCQkJY2wtPnN0YXR1cyA9IDA7Ci0KLQkJfSBlbHNlIHsKLQkJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKLQkJCWNsLT5zdGF0dXMgPSAtRU5PREVWOwotCQl9Ci0JCWNsLT50aW1lcl9jb3VudCA9IDA7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCiAgKiBtZWlfaGJtX2lkbGUgLSBzZXQgaGJtIHRvIGlkbGUgc3RhdGUKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTQ3LDEzICsxNTQsMTMgQEAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfcmVjdmRfbXNnLAogCQkJZGV2LT5oYm1fc3RhdGUgPT0gTUVJX0hCTV9JRExFIHx8CiAJCQlkZXYtPmhibV9zdGF0ZSA+PSBNRUlfSEJNX1NUQVJURUQsCi0JCQltZWlfc2Vjc190b19qaWZmaWVzKE1FSV9JTlRFUk9QX1RJTUVPVVQpKTsKKwkJCW1laV9zZWNzX3RvX2ppZmZpZXMoTUVJX0hCTV9USU1FT1VUKSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAKIAlpZiAocmV0IDw9IDAgJiYgKGRldi0+aGJtX3N0YXRlIDw9IE1FSV9IQk1fU1RBUlQpKSB7CiAJCWRldi0+aGJtX3N0YXRlID0gTUVJX0hCTV9JRExFOwogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndhaXRpbmcgZm9yIG1laSBzdGFydCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0dXJuIC1FVElNRTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yODMsMTcgKzI5MCwxOCBAQAogfQogCiAvKioKLSAqIG1laV9oYm1fc3RvcF9yZXFfcHJlcGFyZSAtIHByZXBhcmUgc3RvcCByZXF1ZXN0IG1lc3NhZ2UKKyAqIG1laV9oYm1fc3RvcF9yZXEgLSBzZW5kIHN0b3AgcmVxdWVzdCBtZXNzYWdlCiAgKgogICogQGRldiAtIG1laSBkZXZpY2UKLSAqIEBtZWlfaGRyIC0gbWVpIG1lc3NhZ2UgaGVhZGVyCi0gKiBAZGF0YSAtIGhibSBtZXNzYWdlIGJvZHkgYnVmZmVyCisgKiBAY2w6IGNsaWVudCBpbmZvCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FSU8gb24gd3JpdGUgZmFpbHVyZQogICovCi1zdGF0aWMgdm9pZCBtZWlfaGJtX3N0b3BfcmVxX3ByZXBhcmUoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKLQkJc3RydWN0IG1laV9tc2dfaGRyICptZWlfaGRyLCB1bnNpZ25lZCBjaGFyICpkYXRhKQorc3RhdGljIGludCBtZWlfaGJtX3N0b3BfcmVxKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG1laV9tc2dfaGRyICptZWlfaGRyID0gJmRldi0+d3JfbXNnLmhkcjsKIAlzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICpyZXEgPQotCQkJKHN0cnVjdCBoYm1faG9zdF9zdG9wX3JlcXVlc3QgKilkYXRhOworCQkJKHN0cnVjdCBoYm1faG9zdF9zdG9wX3JlcXVlc3QgKilkZXYtPndyX21zZy5kYXRhOwogCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGhibV9ob3N0X3N0b3BfcmVxdWVzdCk7CiAKIAltZWlfaGJtX2hkcihtZWlfaGRyLCBsZW4pOwpAQCAtMzAxLDYgKzMwOSw4IEBACiAJbWVtc2V0KHJlcSwgMCwgbGVuKTsKIAlyZXEtPmhibV9jbWQgPSBIT1NUX1NUT1BfUkVRX0NNRDsKIAlyZXEtPnJlYXNvbiA9IERSSVZFUl9TVE9QX1JFUVVFU1Q7CisKKwlyZXR1cm4gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCBtZWlfaGRyLCBkZXYtPndyX21zZy5kYXRhKTsKIH0KIAogLyoqCkBAIC0zMTksOCArMzI5LDcgQEAKIAltZWlfaGJtX2hkcihtZWlfaGRyLCBsZW4pOwogCW1laV9oYm1fY2xfaGRyKGNsLCBNRUlfRkxPV19DT05UUk9MX0NNRCwgZGV2LT53cl9tc2cuZGF0YSwgbGVuKTsKIAotCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic2VuZGluZyBmbG93IGNvbnRyb2wgaG9zdCBjbGllbnQgPSAlZCwgTUUgY2xpZW50ID0gJWRcbiIsCi0JCWNsLT5ob3N0X2NsaWVudF9pZCwgY2wtPm1lX2NsaWVudF9pZCk7CisJY2xfZGJnKGRldiwgY2wsICJzZW5kaW5nIGZsb3cgY29udHJvbFxuIik7CiAKIAlyZXR1cm4gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCBtZWlfaGRyLCBkZXYtPndyX21zZy5kYXRhKTsKIH0KQEAgLTMzMCwyNyArMzM5LDM0IEBACiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBmbG93OiBmbG93IGNvbnRyb2wuCisgKgorICogcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIG90aGVyd2lzZQogICovCi1zdGF0aWMgdm9pZCBtZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorc3RhdGljIGludCBtZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZsb3cpCiB7Ci0Jc3RydWN0IG1laV9tZV9jbGllbnQgKmNsaWVudDsKLQlpbnQgaTsKKwlzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2w7CisJaW50IGlkOwogCi0JZm9yIChpID0gMDsgaSA8IGRldi0+bWVfY2xpZW50c19udW07IGkrKykgewotCQljbGllbnQgPSAmZGV2LT5tZV9jbGllbnRzW2ldOwotCQlpZiAoY2xpZW50ICYmIGZsb3ctPm1lX2FkZHIgPT0gY2xpZW50LT5jbGllbnRfaWQpIHsKLQkJCWlmIChjbGllbnQtPnByb3BzLnNpbmdsZV9yZWN2X2J1ZikgewotCQkJCWNsaWVudC0+bWVpX2Zsb3dfY3RybF9jcmVkcysrOwotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAicmVjdiBmbG93IGN0cmwgbXNnIE1FICVkIChzaW5nbGUpLlxuIiwKLQkJCQkgICAgZmxvdy0+bWVfYWRkcik7Ci0JCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJmbG93IGNvbnRyb2wgY3JlZGVudGlhbHMgPSVkLlxuIiwKLQkJCQkgICAgY2xpZW50LT5tZWlfZmxvd19jdHJsX2NyZWRzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQlVHKCk7CS8qIGVycm9yIGluIGZsb3cgY29udHJvbCAqLwotCQkJfQotCQl9CisJaWQgPSBtZWlfbWVfY2xfYnlfaWQoZGV2LCBmbG93LT5tZV9hZGRyKTsKKwlpZiAoaWQgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAibm8gc3VjaCBtZSBjbGllbnQgJWRcbiIsCisJCQlmbG93LT5tZV9hZGRyKTsKKwkJcmV0dXJuIGlkOwogCX0KKworCW1lX2NsID0gJmRldi0+bWVfY2xpZW50c1tpZF07CisJaWYgKG1lX2NsLT5wcm9wcy5zaW5nbGVfcmVjdl9idWYpIHsKKwkJbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJyZWN2IGZsb3cgY3RybCBtc2cgTUUgJWQgKHNpbmdsZSkuXG4iLAorCQkgICAgZmxvdy0+bWVfYWRkcik7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmxvdyBjb250cm9sIGNyZWRlbnRpYWxzID0lZC5cbiIsCisJCSAgICBtZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyk7CisJfSBlbHNlIHsKKwkJQlVHKCk7CS8qIGVycm9yIGluIGZsb3cgY29udHJvbCAqLworCX0KKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTM2Miw4ICszNzgsNyBAQAogc3RhdGljIHZvaWQgbWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmbG93X2NvbnRyb2wpCiB7Ci0Jc3RydWN0IG1laV9jbCAqY2wgPSBOVUxMOwotCXN0cnVjdCBtZWlfY2wgKm5leHQgPSBOVUxMOworCXN0cnVjdCBtZWlfY2wgKmNsOwogCiAJaWYgKCFmbG93X2NvbnRyb2wtPmhvc3RfYWRkcikgewogCQkvKiBzaW5nbGUgcmVjZWl2ZSBidWZmZXIgKi8KQEAgLTM3Miw3ICszODcsNyBAQAogCX0KIAogCS8qIG5vcm1hbCBjb25uZWN0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKIAkJaWYgKG1laV9oYm1fY2xfYWRkcl9lcXVhbChjbCwgZmxvd19jb250cm9sKSkgewogCQkJY2wtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKIAkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmxvdyBjdHJsIG1zZyBmb3IgaG9zdCAlZCBNRSAlZC5cbiIsCkBAIC00MDUsNiArNDIwLDI1IEBACiB9CiAKIC8qKgorICogbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcCAtIHNlbmRzIGRpc2Nvbm5lY3QgcmVzcG9zZSB0byB0aGUgRlcKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGNsOiBhIGNsaWVudCB0byBkaXNjb25uZWN0IGZyb20KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgLUVJTyBvbiB3cml0ZSBmYWlsdXJlCisgKi8KK2ludCBtZWlfaGJtX2NsX2Rpc2Nvbm5lY3RfcnNwKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBtZWlfY2wgKmNsKQoreworCXN0cnVjdCBtZWlfbXNnX2hkciAqbWVpX2hkciA9ICZkZXYtPndyX21zZy5oZHI7CisJY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlKTsKKworCW1laV9oYm1faGRyKG1laV9oZHIsIGxlbik7CisJbWVpX2hibV9jbF9oZHIoY2wsIENMSUVOVF9ESVNDT05ORUNUX1JFU19DTUQsIGRldi0+d3JfbXNnLmRhdGEsIGxlbik7CisKKwlyZXR1cm4gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCBtZWlfaGRyLCBkZXYtPndyX21zZy5kYXRhKTsKK30KKworLyoqCiAgKiBtZWlfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVzIC0gZGlzY29ubmVjdCByZXNwb25zZSBmcm9tIE1FCiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTQxNCwyOSArNDQ4LDIzIEBACiAJCXN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2UgKnJzKQogewogCXN0cnVjdCBtZWlfY2wgKmNsOwotCXN0cnVjdCBtZWlfY2xfY2IgKnBvcyA9IE5VTEwsICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgKm5leHQ7CiAKLQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKLQkJCSJkaXNjb25uZWN0X3Jlc3BvbnNlOlxuIgotCQkJIk1FIENsaWVudCA9ICVkXG4iCi0JCQkiSG9zdCBDbGllbnQgPSAlZFxuIgotCQkJIlN0YXR1cyA9ICVkXG4iLAotCQkJcnMtPm1lX2FkZHIsCi0JCQlycy0+aG9zdF9hZGRyLAotCQkJcnMtPnN0YXR1cyk7CisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJoYm06IGRpc2Nvbm5lY3QgcmVzcG9uc2UgY2w6aG9zdD0lMDJkIG1lPSUwMmQgc3RhdHVzPSVkXG4iLAorCQkJcnMtPm1lX2FkZHIsIHJzLT5ob3N0X2FkZHIsIHJzLT5zdGF0dXMpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QsIGxpc3QpIHsKLQkJY2wgPSBwb3MtPmNsOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QsIGxpc3QpIHsKKwkJY2wgPSBjYi0+Y2w7CiAKLQkJaWYgKCFjbCkgewotCQkJbGlzdF9kZWwoJnBvcy0+bGlzdCk7CisJCS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJaWYgKFdBUk5fT04oIWNsKSkgeworCQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAibGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIGluIGN0cmxfcmRfbGlzdC5cbiIpOwogCQlpZiAobWVpX2hibV9jbF9hZGRyX2VxdWFsKGNsLCBycykpIHsKLQkJCWxpc3RfZGVsKCZwb3MtPmxpc3QpOwotCQkJaWYgKCFycy0+c3RhdHVzKQorCQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwkJCWlmIChycy0+c3RhdHVzID09IE1FSV9DTF9ESVNDT05OX1NVQ0NFU1MpCiAJCQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwogCiAJCQljbC0+c3RhdHVzID0gMDsKQEAgLTQ3Niw0NiArNTA0LDQxIEBACiB7CiAKIAlzdHJ1Y3QgbWVpX2NsICpjbDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpwb3MgPSBOVUxMLCAqbmV4dCA9IE5VTEw7CisJc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwogCi0JZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCi0JCQkiY29ubmVjdF9yZXNwb25zZTpcbiIKLQkJCSJNRSBDbGllbnQgPSAlZFxuIgotCQkJIkhvc3QgQ2xpZW50ID0gJWRcbiIKLQkJCSJTdGF0dXMgPSAlZFxuIiwKLQkJCXJzLT5tZV9hZGRyLAotCQkJcnMtPmhvc3RfYWRkciwKLQkJCXJzLT5zdGF0dXMpOworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBjb25uZWN0IHJlc3BvbnNlIGNsOmhvc3Q9JTAyZCBtZT0lMDJkIHN0YXR1cz0lc1xuIiwKKwkJCXJzLT5tZV9hZGRyLCBycy0+aG9zdF9hZGRyLAorCQkJbWVpX2NsX2Nvbm5fc3RhdHVzX3N0cihycy0+c3RhdHVzKSk7CiAKLQkvKiBpZiBXRCBvciBpYW10aGlmIGNsaWVudCB0cmVhdCBzcGVjaWFsbHkgKi8KKwljbCA9IE5VTEw7CiAKLQlpZiAoaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudCgmZGV2LT53ZF9jbCwgcnMpKSB7Ci0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBXRCBjbGllbnQuXG4iKTsKLQkJbWVpX3dhdGNoZG9nX3JlZ2lzdGVyKGRldik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCwgbGlzdCkgewogCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudCgmZGV2LT5pYW10aGlmX2NsLCBycykpIHsKLQkJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfSURMRTsKLQkJcmV0dXJuOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuZXh0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCwgbGlzdCkgewotCi0JCWNsID0gcG9zLT5jbDsKLQkJaWYgKCFjbCkgewotCQkJbGlzdF9kZWwoJnBvcy0+bGlzdCk7Ci0JCQlyZXR1cm47CisJCWNsID0gY2ItPmNsOworCQkvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJCWlmIChXQVJOX09OKCFjbCkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmNiLT5saXN0KTsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChwb3MtPmZvcF90eXBlID09IE1FSV9GT1BfSU9DVEwpIHsKLQkJCWlmIChpc190cmVhdF9zcGVjaWFsbHlfY2xpZW50KGNsLCBycykpIHsKLQkJCQlsaXN0X2RlbCgmcG9zLT5saXN0KTsKLQkJCQljbC0+c3RhdHVzID0gMDsKLQkJCQljbC0+dGltZXJfY291bnQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQorCisJCWlmIChjYi0+Zm9wX3R5cGUgIT0gIE1FSV9GT1BfQ09OTkVDVCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIHJzKSkgeworCQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwkJCWJyZWFrOwogCQl9CiAJfQorCisJaWYgKCFjbCkKKwkJcmV0dXJuOworCisJY2wtPnRpbWVyX2NvdW50ID0gMDsKKwlpZiAocnMtPnN0YXR1cyA9PSBNRUlfQ0xfQ09OTl9TVUNDRVNTKQorCQljbC0+c3RhdGUgPSBNRUlfRklMRV9DT05ORUNURUQ7CisJZWxzZQorCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNURUQ7CisJY2wtPnN0YXR1cyA9IG1laV9jbF9jb25uX3N0YXR1c190b19lcnJubyhycy0+c3RhdHVzKTsKIH0KIAogCkBAIC01MjUsMzIgKzU0OCwzNCBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlLgogICogQGRpc2Nvbm5lY3RfcmVxOiBkaXNjb25uZWN0IHJlcXVlc3QgYnVzIG1lc3NhZ2UgZnJvbSB0aGUgbWUKKyAqCisgKiByZXR1cm5zIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyB2b2lkIG1laV9oYm1fZndfZGlzY29ubmVjdF9yZXEoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgbWVpX2hibV9md19kaXNjb25uZWN0X3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QgKmRpc2Nvbm5lY3RfcmVxKQogewotCXN0cnVjdCBtZWlfY2wgKmNsLCAqbmV4dDsKLQljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2UpOworCXN0cnVjdCBtZWlfY2wgKmNsOworCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKIAkJaWYgKG1laV9oYm1fY2xfYWRkcl9lcXVhbChjbCwgZGlzY29ubmVjdF9yZXEpKSB7CiAJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImRpc2Nvbm5lY3QgcmVxdWVzdCBob3N0IGNsaWVudCAlZCBNRSBjbGllbnQgJWQuXG4iLAogCQkJCQlkaXNjb25uZWN0X3JlcS0+aG9zdF9hZGRyLAogCQkJCQlkaXNjb25uZWN0X3JlcS0+bWVfYWRkcik7CiAJCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNURUQ7CiAJCQljbC0+dGltZXJfY291bnQgPSAwOwotCQkJaWYgKGNsID09ICZkZXYtPndkX2NsKQotCQkJCWRldi0+d2RfcGVuZGluZyA9IGZhbHNlOwotCQkJZWxzZSBpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKLQkJCQlkZXYtPmlhbXRoaWZfdGltZXIgPSAwOwogCi0JCQkvKiBwcmVwYXJlIGRpc2Nvbm5lY3QgcmVzcG9uc2UgKi8KLQkJCW1laV9oYm1faGRyKCZkZXYtPndyX2V4dF9tc2cuaGRyLCBsZW4pOwotCQkJbWVpX2hibV9jbF9oZHIoY2wsIENMSUVOVF9ESVNDT05ORUNUX1JFU19DTUQsCi0JCQkJCSBkZXYtPndyX2V4dF9tc2cuZGF0YSwgbGVuKTsKKwkJCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIE5VTEwpOworCQkJaWYgKCFjYikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfRElTQ09OTkVDVF9SU1A7CisJCQljbF9kYmcoZGV2LCBjbCwgImFkZCBkaXNjb25uZWN0IHJlc3BvbnNlIGFzIGZpcnN0XG4iKTsKKwkJCWxpc3RfYWRkKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCiAJCQlicmVhazsKIAkJfQogCX0KKwlyZXR1cm4gMDsKIH0KIAogCkBAIC02MjksMTAgKzY1NCw3IEBACiAJCQlkZXZfd2FybigmZGV2LT5wZGV2LT5kZXYsICJoYm06IHN0YXJ0OiB2ZXJzaW9uIG1pc21hdGNoIC0gc3RvcHBpbmcgdGhlIGRyaXZlci5cbiIpOwogCiAJCQlkZXYtPmhibV9zdGF0ZSA9IE1FSV9IQk1fU1RPUFBFRDsKLQkJCW1laV9oYm1fc3RvcF9yZXFfcHJlcGFyZShkZXYsICZkZXYtPndyX21zZy5oZHIsCi0JCQkJCQlkZXYtPndyX21zZy5kYXRhKTsKLQkJCWlmIChtZWlfd3JpdGVfbWVzc2FnZShkZXYsICZkZXYtPndyX21zZy5oZHIsCi0JCQkJCWRldi0+d3JfbXNnLmRhdGEpKSB7CisJCQlpZiAobWVpX2hibV9zdG9wX3JlcShkZXYpKSB7CiAJCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJoYm06IHN0YXJ0OiBmYWlsZWQgdG8gc2VuZCBzdG9wIHJlcXVlc3RcbiIpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQpAQCAtNzc4LDEwICs4MDAsMTEgQEAKIAogCWNhc2UgTUVfU1RPUF9SRVFfQ01EOgogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhibTogc3RvcCByZXF1ZXN0OiBtZXNzYWdlIHJlY2VpdmVkXG4iKTsKLQogCQlkZXYtPmhibV9zdGF0ZSA9IE1FSV9IQk1fU1RPUFBFRDsKLQkJbWVpX2hibV9zdG9wX3JlcV9wcmVwYXJlKGRldiwgJmRldi0+d3JfZXh0X21zZy5oZHIsCi0JCQkJCWRldi0+d3JfZXh0X21zZy5kYXRhKTsKKwkJaWYgKG1laV9oYm1fc3RvcF9yZXEoZGV2KSkgeworCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJoYm06IHN0YXJ0OiBmYWlsZWQgdG8gc2VuZCBzdG9wIHJlcXVlc3RcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2hibS5oIGIvZHJpdmVycy9taXNjL21laS9oYm0uaAppbmRleCA1ZjkyMTg4Li4yMGU4NzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2hibS5oCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmgKQEAgLTU0LDYgKzU0LDcgQEAKIGludCBtZWlfaGJtX3N0YXJ0X3dhaXQoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiBpbnQgbWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVxKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBtZWlfY2wgKmNsKTsKIGludCBtZWlfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVxKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBtZWlfY2wgKmNsKTsKK2ludCBtZWlfaGJtX2NsX2Rpc2Nvbm5lY3RfcnNwKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBtZWlfY2wgKmNsKTsKIGludCBtZWlfaGJtX2NsX2Nvbm5lY3RfcmVxKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBtZWlfY2wgKmNsKTsKIGJvb2wgbWVpX2hibV92ZXJzaW9uX2lzX3N1cHBvcnRlZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody1tZS5jIGIvZHJpdmVycy9taXNjL21laS9ody1tZS5jCmluZGV4IDZmNjU2YzAuLjhkYmRhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMKQEAgLTIwLDEwICsyMCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgotI2luY2x1ZGUgImh3LW1lLmgiCi0KICNpbmNsdWRlICJoYm0uaCIKIAorI2luY2x1ZGUgImh3LW1lLmgiCisjaW5jbHVkZSAiaHctbWUtcmVncy5oIgogCiAvKioKICAqIG1laV9tZV9yZWdfcmVhZCAtIFJlYWRzIDMyYml0IGRhdGEgZnJvbSB0aGUgbWVpIGRldmljZQpAQCAtMjQwLDExICsyNDAsMTEgQEAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+d2FpdF9od19yZWFkeSwKIAkJCWRldi0+cmVjdmRfaHdfcmVhZHksCi0JCQltZWlfc2Vjc190b19qaWZmaWVzKE1FSV9JTlRFUk9QX1RJTUVPVVQpKTsKKwkJCW1laV9zZWNzX3RvX2ppZmZpZXMoTUVJX0hXX1JFQURZX1RJTUVPVVQpKTsKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAlpZiAoIWVyciAmJiAhZGV2LT5yZWN2ZF9od19yZWFkeSkgewogCQlpZiAoIWVycikKLQkJCWVyciA9IC1FVElNRURPVVQ7CisJCQllcnIgPSAtRVRJTUU7CiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAogCQkJIndhaXQgaHcgcmVhZHkgZmFpbGVkLiBzdGF0dXMgPSAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKQEAgLTMwMyw3ICszMDMsNyBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogcmV0dXJucyAtMShFU0xPVFNfT1ZFUkZMT1cpIGlmIG92ZXJmbG93LCBvdGhlcndpc2UgZW1wdHkgc2xvdHMgY291bnQKKyAqIHJldHVybnMgLUVPVkVSRkxPVyBpZiBvdmVyZmxvdywgb3RoZXJ3aXNlIGVtcHR5IHNsb3RzIGNvdW50CiAgKi8KIHN0YXRpYyBpbnQgbWVpX21lX2hidWZfZW1wdHlfc2xvdHMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKQEAgLTMyNiw3ICszMjYsNyBAQAogCiAKIC8qKgotICogbWVpX3dyaXRlX21lc3NhZ2UgLSB3cml0ZXMgYSBtZXNzYWdlIHRvIG1laSBkZXZpY2UuCisgKiBtZWlfbWVfd3JpdGVfbWVzc2FnZSAtIHdyaXRlcyBhIG1lc3NhZ2UgdG8gbWVpIGRldmljZS4KICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQGhlYWRlcjogbWVpIEhFQ0kgaGVhZGVyIG9mIG1lc3NhZ2UKQEAgLTM1NCw3ICszNTQsNyBAQAogCiAJZHdfY250ID0gbWVpX2RhdGEyc2xvdHMobGVuZ3RoKTsKIAlpZiAoZW1wdHlfc2xvdHMgPCAwIHx8IGR3X2NudCA+IGVtcHR5X3Nsb3RzKQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCW1laV9tZV9yZWdfd3JpdGUoaHcsIEhfQ0JfV1csICooKHUzMiAqKSBoZWFkZXIpKTsKIApAQCAtMzgxLDcgKzM4MSw3IEBACiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiByZXR1cm5zIC0xKEVTTE9UU19PVkVSRkxPVykgaWYgb3ZlcmZsb3csIG90aGVyd2lzZSBmaWxsZWQgc2xvdHMgY291bnQKKyAqIHJldHVybnMgLUVPVkVSRkxPVyBpZiBvdmVyZmxvdywgb3RoZXJ3aXNlIGZpbGxlZCBzbG90cyBjb3VudAogICovCiBzdGF0aWMgaW50IG1laV9tZV9jb3VudF9mdWxsX3JlYWRfc2xvdHMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKQEAgLTUwNSwxNyArNTA1LDI1IEBACiAJLyogY2hlY2sgc2xvdHMgYXZhaWxhYmxlIGZvciByZWFkaW5nICovCiAJc2xvdHMgPSBtZWlfY291bnRfZnVsbF9yZWFkX3Nsb3RzKGRldik7CiAJd2hpbGUgKHNsb3RzID4gMCkgewotCQkvKiB3ZSBoYXZlIHVyZ2VudCBkYXRhIHRvIHNlbmQgc28gYnJlYWsgdGhlIHJlYWQgKi8KLQkJaWYgKGRldi0+d3JfZXh0X21zZy5oZHIubGVuZ3RoKQotCQkJYnJlYWs7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic2xvdHMgdG8gcmVhZCA9ICUwOHhcbiIsIHNsb3RzKTsKIAkJcmV0cyA9IG1laV9pcnFfcmVhZF9oYW5kbGVyKGRldiwgJmNvbXBsZXRlX2xpc3QsICZzbG90cyk7CisJCS8qIFRoZXJlIGlzIGEgcmFjZSBiZXR3ZWVuIE1FIHdyaXRlIGFuZCBpbnRlcnJ1cHQgZGVsaXZlcnk6CisJCSAqIE5vdCBhbGwgZGF0YSBpcyBhbHdheXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorCQkgKiBpbnRlcnJ1cHQsIHNvIHRyeSB0byByZWFkIGFnYWluIG9uIHRoZSBuZXh0IGludGVycnVwdC4KKwkJICovCisJCWlmIChyZXRzID09IC1FTk9EQVRBKQorCQkJYnJlYWs7CisKIAkJaWYgKHJldHMgJiYgZGV2LT5kZXZfc3RhdGUgIT0gTUVJX0RFVl9SRVNFVFRJTkcpIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAibWVpX2lycV9yZWFkX2hhbmRsZXIgcmV0ID0gJWQuXG4iLAorCQkJCQkJcmV0cyk7CiAJCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOwogCQkJZ290byBlbmQ7CiAJCX0KIAl9CiAKKwlkZXYtPmhidWZfaXNfcmVhZHkgPSBtZWlfaGJ1Zl9pc19yZWFkeShkZXYpOworCiAJcmV0cyA9IG1laV9pcnFfd3JpdGVfaGFuZGxlcihkZXYsICZjb21wbGV0ZV9saXN0KTsKIAogCWRldi0+aGJ1Zl9pc19yZWFkeSA9IG1laV9oYnVmX2lzX3JlYWR5KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmggYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmgKaW5kZXggODBiZDgyOS4uODkzZDUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9ody1tZS5oCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBfTUVJX0lOVEVSRkFDRV9IXwogCiAjaW5jbHVkZSA8bGludXgvbWVpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSAibWVpX2Rldi5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS1yZWdzLmggYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4M2MyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLXJlZ3MuaApAQCAtMCwwICsxLDI5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZWwgTWFuYWdlbWVudCBFbmdpbmUgSW50ZXJmYWNlIChJbnRlbCBNRUkpIExpbnV4IGRyaXZlcgorICogSW50ZWwgTUVJIEludGVyZmFjZSBIZWFkZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORworICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKglJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCWxpbnV4LW1laUBsaW51eC5pbnRlbC5jb20KKyAqCWh0dHA6Ly93d3cuaW50ZWwuY29tCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01FSV9IV19UWEVfUkVHU19IXworI2RlZmluZSBfTUVJX0hXX1RYRV9SRUdTX0hfCisKKyNpbmNsdWRlICJody5oIgorCisjZGVmaW5lIFNFQ19BTElWRU5FU1NfVElNRVJfVElNRU9VVCAgICAgICAgKDUgKiBNU0VDX1BFUl9TRUMpCisjZGVmaW5lIFNFQ19BTElWRU5FU1NfV0FJVF9USU1FT1VUICAgICAgICAgKDEgKiBNU0VDX1BFUl9TRUMpCisjZGVmaW5lIFNFQ19SRVNFVF9XQUlUX1RJTUVPVVQgICAgICAgICAgICAgKDEgKiBNU0VDX1BFUl9TRUMpCisjZGVmaW5lIFNFQ19SRUFEWV9XQUlUX1RJTUVPVVQgICAgICAgICAgICAgKDUgKiBNU0VDX1BFUl9TRUMpCisjZGVmaW5lIFNUQVJUX01FU1NBR0VfUkVTUE9OU0VfV0FJVF9USU1FT1VUICg1ICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBSRVNFVF9DQU5DRUxfV0FJVF9USU1FT1VUICAgICAgICAgICgxICogTVNFQ19QRVJfU0VDKQorCitlbnVtIHsKKwlTRUNfQkFSLAorCUJSSURHRV9CQVIsCisKKwlOVU1fT0ZfTUVNX0JBUlMKK307CisKKy8qIFNlQyBGVyBTdGF0dXMgUmVnaXN0ZXIKKyAqCisgKiBGVyB1c2VzIHRoaXMgcmVnaXN0ZXIgaW4gb3JkZXIgdG8gcmVwb3J0IGl0cyBzdGF0dXMgdG8gaG9zdC4KKyAqIFRoaXMgcmVnaXN0ZXIgcmVzaWRlcyBpbiBQQ0ktRSBjb25maWcgc3BhY2UuCisgKi8KKyNkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMCAgIDB4NDAKKyMgIGRlZmluZSBQQ0lfQ0ZHX1RYRV9GV19TVFMwX1dSS19TVF9NU0sgICAgMHgwMDAwMDAwRgorIyAgZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzBfT1BfU1RfTVNLICAgICAweDAwMDAwMUMwCisjICBkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMF9GV19JTklUX0NNUExUIDB4MDAwMDAyMDAKKyMgIGRlZmluZSBQQ0lfQ0ZHX1RYRV9GV19TVFMwX0VSUl9DT0RFX01TSyAgMHgwMDAwRjAwMAorIyAgZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzBfT1BfTU9ERV9NU0sgICAweDAwMEYwMDAwCisjICBkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMF9SU1RfQ05UX01TSyAgIDB4MDBGMDAwMDAKKworCisjZGVmaW5lIElQQ19CQVNFX0FERFIJMHg4MDQwMCAvKiBTZUMgSVBDIEJhc2UgQWRkcmVzcyAqLworCisvKiBJUEMgSW5wdXQgRG9vcmJlbGwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VDX0lQQ19JTlBVVF9ET09SQkVMTF9SRUcgICAgICAgKDB4MDAwMCArIElQQ19CQVNFX0FERFIpCisKKy8qIElQQyBJbnB1dCBTdGF0dXMgUmVnaXN0ZXIKKyAqIFRoaXMgcmVnaXN0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHByb2Nlc3Npbmcgb2YKKyAqIHRoZSBtb3N0IHJlY2VudCBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgU0VDCisgKiBOZXcgY29tbWFuZHMgYW5kIHBheWxvYWRzIHNob3VsZCBub3QgYmUgd3JpdHRlbiBieSB0aGUgSG9zdAorICogdW50aWwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJldmlvdXMgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQuCisgKi8KKyNkZWZpbmUgU0VDX0lQQ19JTlBVVF9TVEFUVVNfUkVHICAgICAgICAgKDB4MDAwOCArIElQQ19CQVNFX0FERFIpCisjICBkZWZpbmUgU0VDX0lQQ19JTlBVVF9TVEFUVVNfUkRZICAgIEJJVCgwKQorCisvKiBJUEMgSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1JFRyAgICAgICgweDAwMTAgKyBJUENfQkFTRV9BRERSKQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX09VVF9EQiAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19JTl9SRFkgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfSERDUF9NMF9SQ1ZEICAgICAgIEJJVCg1KQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0lMTF9NRU1fQUNDRVNTICAgICBCSVQoMTcpCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfQUVTX0hLRVlfRVJSICAgICAgIEJJVCgxOCkKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19ERVNfSEtFWV9FUlIgICAgICAgQklUKDE5KQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1RNUk1UQl9PVkVSRkxPVyAgICBCSVQoMjEpCisKKy8qIENvbnZlbmllbnQgbWFzayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzICovCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUEVORElORyBcCisJCShTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19PVVRfREJ8IFwKKwkJU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfSU5fUkRZKQorCisvKiBJUEMgSG9zdCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBTRUNfSVBDX0hPU1RfSU5UX01BU0tfUkVHICAgICAgICAoMHgwMDE0ICsgSVBDX0JBU0VfQUREUikKKworIyAgZGVmaW5lIFNFQ19JUENfSE9TVF9JTlRfTUFTS19PVVRfREIJQklUKDApIC8qIE91dHB1dCBEb29yYmVsbCBJbnQgTWFzayAqLworIyAgZGVmaW5lIFNFQ19JUENfSE9TVF9JTlRfTUFTS19JTl9SRFkJQklUKDEpIC8qIElucHV0IFJlYWR5IEludCBNYXNrICovCisKKy8qIElQQyBJbnB1dCBQYXlsb2FkIFJBTSAqLworI2RlZmluZSBTRUNfSVBDX0lOUFVUX1BBWUxPQURfUkVHICAgICAgICAoMHgwMTAwICsgSVBDX0JBU0VfQUREUikKKy8qIElQQyBTaGFyZWQgUGF5bG9hZCBSQU0gKi8KKyNkZWZpbmUgSVBDX1NIQVJFRF9QQVlMT0FEX1JFRyAgICAgICAgICAgKDB4MDIwMCArIElQQ19CQVNFX0FERFIpCisKKy8qIFNlQyBBZGRyZXNzIFRyYW5zbGF0aW9uIFRhYmxlIEVudHJ5IDIgLSBDdHJsCisgKgorICogVGhpcyByZWdpc3RlciByZXNpZGVzIGFsc28gaW4gU2VDJ3MgUENJLUUgTWVtb3J5IHNwYWNlLgorICovCisjZGVmaW5lIFNBVFQyX0NUUkxfUkVHICAgICAgICAgICAgICAgICAgIDB4MTA0MAorIyAgZGVmaW5lIFNBVFQyX0NUUkxfVkFMSURfTVNLICAgICAgICAgICAgQklUKDApCisjICBkZWZpbmUgU0FUVDJfQ1RSTF9CUl9CQVNFX0FERFJfUkVHX1NISUZUIDgKKyMgIGRlZmluZSBTQVRUMl9DVFJMX0JSSURHRV9IT1NUX0VOX01TSyAgIEJJVCgxMikKKworLyogU0FUVCBUYWJsZSBFbnRyeSAyIFNBUCBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0FUVDJfU0FQX0JBX1JFRyAgICAgICAgICAgICAgICAgMHgxMDQ0CisvKiBTQVRUIFRhYmxlIEVudHJ5IDIgU0FQIFNpemUgUmVnaXN0ZXIuICovCisjZGVmaW5lIFNBVFQyX1NBUF9TSVpFX1JFRyAgICAgICAgICAgICAgIDB4MTA0OAorIC8qIFNBVFQgVGFibGUgRW50cnkgMiBTQVAgQnJpZGdlIEFkZHJlc3MgLSBMU0IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0FUVDJfQlJHX0JBX0xTQl9SRUcgICAgICAgICAgICAgMHgxMDRDCisKKy8qIEhvc3QgSGlnaC1sZXZlbCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEhISVNSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyMAorLyogSG9zdCBIaWdoLWxldmVsIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIKKyAqCisgKiBSZXNpZGVzIGluIFBDSSBtZW1vcnkgc3BhY2UuIFRoaXMgaXMgdGhlIHRvcCBoaWVyYXJjaHkgZm9yCisgKiBpbnRlcnJ1cHRzIGZyb20gU2VDIHRvIGhvc3QsIGFnZ3JlZ2F0aW5nIGJvdGggaW50ZXJydXB0cyB0aGF0CisgKiBhcnJpdmUgdGhyb3VnaCBISUNSIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIGludGVycnVwdHMKKyAqIHRoYXQgYXJyaXZlIHZpYSBJUEMuCisgKi8KKyNkZWZpbmUgSEhJRVJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDI0CisjZGVmaW5lICAgSVBDX0hISUVSX1NFQwlCSVQoMCkKKyNkZWZpbmUgICBJUENfSEhJRVJfQlJJREdFCUJJVCgxKQorI2RlZmluZSAgIElQQ19ISElFUl9NU0sJKElQQ19ISElFUl9TRUMgfCBJUENfSEhJRVJfQlJJREdFKQorCisvKiBIb3N0IEhpZ2gtbGV2ZWwgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIuCisgKgorICogUmVzaWRlcyBpbiBQQ0kgbWVtb3J5IHNwYWNlLgorICogVGhpcyBpcyB0aGUgdG9wIGhpZXJhcmNoeSBmb3IgbWFza2luZyBpbnRlcnJ1cHRzIGZyb20gU2VDIHRvIGhvc3QuCisgKi8KKyNkZWZpbmUgSEhJTVJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDI4CisjZGVmaW5lICAgSVBDX0hISU1SX1NFQyAgICAgICBCSVQoMCkKKyNkZWZpbmUgICBJUENfSEhJTVJfQlJJREdFICAgIEJJVCgxKQorCisvKiBIb3N0IEhpZ2gtbGV2ZWwgSVJRIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBISElSUVNSX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDIwMkMKKworLyogSG9zdCBJbnRlcnJ1cHQgQ2F1c2UgUmVnaXN0ZXIgMCAtIFNlQyBJUEMgUmVhZGluZXNzCisgKgorICogVGhpcyByZWdpc3RlciBpcyBib3RoIGFuIElDUiB0byBIb3N0IGZyb20gUENJIE1lbW9yeSBTcGFjZQorICogYW5kIGl0IGlzIGFsc28gZXhwb3NlZCBpbiB0aGUgU2VDIG1lbW9yeSBzcGFjZS4KKyAqIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCBieSBTZUMncyBJUEMgZHJpdmVyIGluIG9yZGVyCisgKiB0byBzeW5jaHJvbml6ZSB3aXRoIGhvc3QgYWJvdXQgSVBDIGludGVyZmFjZSBzdGF0ZS4KKyAqLworI2RlZmluZSBISUNSX1NFQ19JUENfUkVBRElORVNTX1JFRyAgICAgICAweDIwNDAKKyNkZWZpbmUgICBISUNSX1NFQ19JUENfUkVBRElORVNTX0hPU1RfUkRZICBCSVQoMCkKKyNkZWZpbmUgICBISUNSX1NFQ19JUENfUkVBRElORVNTX1NFQ19SRFkgICBCSVQoMSkKKyNkZWZpbmUgICBISUNSX1NFQ19JUENfUkVBRElORVNTX1NZU19SRFkgICAgIFwKKwkgIChISUNSX1NFQ19JUENfUkVBRElORVNTX0hPU1RfUkRZIHwgXAorCSAgIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfU0VDX1JEWSkKKyNkZWZpbmUgICBISUNSX1NFQ19JUENfUkVBRElORVNTX1JEWV9DTFIgICBCSVQoMikKKworLyogSG9zdCBJbnRlcnJ1cHQgQ2F1c2UgUmVnaXN0ZXIgMSAtIEFsaXZlbmVzcyBSZXNwb25zZSAqLworLyogVGhpcyByZWdpc3RlciBpcyBib3RoIGFuIElDUiB0byBIb3N0IGZyb20gUENJIE1lbW9yeSBTcGFjZQorICogYW5kIGl0IGlzIGFsc28gZXhwb3NlZCBpbiB0aGUgU2VDIG1lbW9yeSBzcGFjZS4KKyAqIFRoZSByZWdpc3RlciBtYXkgYmUgdXNlZCBieSBTZUMgdG8gQUNLIGEgaG9zdCByZXF1ZXN0IGZvciBhbGl2ZW5lc3MuCisgKi8KKyNkZWZpbmUgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX1JFRyAgICAgMHgyMDQ0CisjZGVmaW5lICAgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX0FDSyAgICBCSVQoMCkKKworLyogSG9zdCBJbnRlcnJ1cHQgQ2F1c2UgUmVnaXN0ZXIgMiAtIFNlQyBJUEMgT3V0cHV0IERvb3JiZWxsICovCisjZGVmaW5lIEhJQ1JfU0VDX0lQQ19PVVRQVVRfRE9PUkJFTExfUkVHIDB4MjA0OAorCisvKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIuCisgKgorICogUmVzaWRlcyBpbiBQQ0kgbWVtb3J5IHNwYWNlLgorICogVGhpcyBpcyB0aGUgbWFpbiByZWdpc3RlciBpbnZvbHZlZCBpbiBnZW5lcmF0aW5nIGludGVycnVwdHMKKyAqIGZyb20gU2VDIHRvIGhvc3QgdmlhIEhJQ1JzLgorICogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOgorICogQW4gaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW5ldmVyIGZvciBhbnkgaSwKKyAqIHRoZXJlIGlzIGEgdHJhbnNpdGlvbiBmcm9tIGEgc3RhdGUgd2hlcmUgYXQgbGVhc3Qgb25lIG9mCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgZGlkIG5vdCBob2xkLCB0byBhIHN0YXRlIHdoZXJlCisgKiBBTEwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6CisgKiBBKSBISVNSLklOVFtpXV9TVFMgPT0gMS4KKyAqIEIpIEhJRVIuSU5UW2ldX0VOID09IDEuCisgKi8KKyNkZWZpbmUgSElTUl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDYwCisjZGVmaW5lICAgSElTUl9JTlRfMF9TVFMgICAgICBCSVQoMCkKKyNkZWZpbmUgICBISVNSX0lOVF8xX1NUUyAgICAgIEJJVCgxKQorI2RlZmluZSAgIEhJU1JfSU5UXzJfU1RTICAgICAgQklUKDIpCisjZGVmaW5lICAgSElTUl9JTlRfM19TVFMgICAgICBCSVQoMykKKyNkZWZpbmUgICBISVNSX0lOVF80X1NUUyAgICAgIEJJVCg0KQorI2RlZmluZSAgIEhJU1JfSU5UXzVfU1RTICAgICAgQklUKDUpCisjZGVmaW5lICAgSElTUl9JTlRfNl9TVFMgICAgICBCSVQoNikKKyNkZWZpbmUgICBISVNSX0lOVF83X1NUUyAgICAgIEJJVCg3KQorI2RlZmluZSAgIEhJU1JfSU5UX1NUU19NU0sgXAorCShISVNSX0lOVF8wX1NUUyB8IEhJU1JfSU5UXzFfU1RTIHwgSElTUl9JTlRfMl9TVFMpCisKKy8qIEhvc3QgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3Rlci4gUmVzaWRlcyBpbiBQQ0kgbWVtb3J5IHNwYWNlLiAqLworI2RlZmluZSBISUVSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjQKKyNkZWZpbmUgICBISUVSX0lOVF8wX0VOICAgICAgQklUKDApCisjZGVmaW5lICAgSElFUl9JTlRfMV9FTiAgICAgIEJJVCgxKQorI2RlZmluZSAgIEhJRVJfSU5UXzJfRU4gICAgICBCSVQoMikKKyNkZWZpbmUgICBISUVSX0lOVF8zX0VOICAgICAgQklUKDMpCisjZGVmaW5lICAgSElFUl9JTlRfNF9FTiAgICAgIEJJVCg0KQorI2RlZmluZSAgIEhJRVJfSU5UXzVfRU4gICAgICBCSVQoNSkKKyNkZWZpbmUgICBISUVSX0lOVF82X0VOICAgICAgQklUKDYpCisjZGVmaW5lICAgSElFUl9JTlRfN19FTiAgICAgIEJJVCg3KQorCisjZGVmaW5lICAgSElFUl9JTlRfRU5fTVNLIFwKKwkgKEhJRVJfSU5UXzBfRU4gfCBISUVSX0lOVF8xX0VOIHwgSElFUl9JTlRfMl9FTikKKworCisvKiBTRUMgTWVtb3J5IFNwYWNlIElQQyBvdXRwdXQgcGF5bG9hZC4KKyAqCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHBhcnQgb2YgdGhlIG91dHB1dCBwYXlsb2FkIHdoaWNoIFNFQyBwcm92aWRlcyB0byBob3N0LgorICovCisjZGVmaW5lIEJSSURHRV9JUENfT1VUUFVUX1BBWUxPQURfUkVHICAgIDB4MjBDMAorCisvKiBTZUMgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIC0gSG9zdCBBbGl2ZW5lc3MgUmVxdWVzdAorICogVGhpcyByZWdpc3RlciBpcyBib3RoIGFuIElDUiB0byBTZUMgYW5kIGl0IGlzIGFsc28gZXhwb3NlZAorICogaW4gdGhlIGhvc3QtdmlzaWJsZSBQQ0kgbWVtb3J5IHNwYWNlLgorICogVGhlIHJlZ2lzdGVyIGlzIHVzZWQgYnkgaG9zdCB0byByZXF1ZXN0IFNlQyBhbGl2ZW5lc3MuCisgKi8KKyNkZWZpbmUgU0lDUl9IT1NUX0FMSVZFTkVTU19SRVFfUkVHICAgICAgMHgyMTRDCisjZGVmaW5lICAgU0lDUl9IT1NUX0FMSVZFTkVTU19SRVFfUkVRVUVTVEVEICAgIEJJVCgwKQorCisKKy8qIFNlQyBJbnRlcnJ1cHQgQ2F1c2UgUmVnaXN0ZXIgLSBIb3N0IElQQyBSZWFkaW5lc3MKKyAqCisgKiBUaGlzIHJlZ2lzdGVyIGlzIGJvdGggYW4gSUNSIHRvIFNlQyBhbmQgaXQgaXMgYWxzbyBleHBvc2VkCisgKiBpbiB0aGUgaG9zdC12aXNpYmxlIFBDSSBtZW1vcnkgc3BhY2UuCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgYnkgdGhlIGhvc3QncyBTZUMgZHJpdmVyIHVzZXMgaW4gb3JkZXIKKyAqIHRvIHN5bmNocm9uaXplIHdpdGggU2VDIGFib3V0IElQQyBpbnRlcmZhY2Ugc3RhdGUuCisgKi8KKyNkZWZpbmUgU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfUkVRX1JFRyAgMHgyMTUwCisKKworI2RlZmluZSBTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19IT1NUX1JEWSAgQklUKDApCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1NFQ19SRFkgICBCSVQoMSkKKyNkZWZpbmUgU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfU1lTX1JEWSAgICAgXAorCShTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19IT1NUX1JEWSB8IFwKKwkgU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfU0VDX1JEWSkKKyNkZWZpbmUgU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfUkRZX0NMUiAgIEJJVCgyKQorCisvKiBTZUMgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIC0gU2VDIElQQyBPdXRwdXQgU3RhdHVzCisgKgorICogVGhpcyByZWdpc3RlciBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgcHJvY2Vzc2luZyBvZiB0aGUgbW9zdCByZWNlbnQKKyAqIGNvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkIGJ5IHRoZSBIb3N0LgorICogTmV3IGNvbW1hbmRzIGFuZCBwYXlsb2FkcyBzaG91bGQgbm90IGJlIHdyaXR0ZW4gYnkgU2VDIHVudGlsIHRoaXMKKyAqIHJlZ2lzdGVyIGluZGljYXRlcyB0aGF0IHRoZSBwcmV2aW91cyBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAqLworI2RlZmluZSBTSUNSX1NFQ19JUENfT1VUUFVUX1NUQVRVU19SRUcgICAweDIxNTQKKyMgIGRlZmluZSBTRUNfSVBDX09VVFBVVF9TVEFUVVNfUkRZIEJJVCgwKQorCisKKworLyogIE1FSSBJUEMgTWVzc2FnZSBwYXlsb2FkIHNpemUgNjQgYnl0ZXMgKi8KKyNkZWZpbmUgUEFZTE9BRF9TSVpFICAgICAgICA2NAorCisvKiBNQVggc2l6ZSBmb3IgU0FUVCByYW5nZSAzMk1CICovCisjZGVmaW5lIFNBVFRfUkFOR0VfTUFYICAgICAoMzIgPDwgMjApCisKKworI2VuZGlmIC8qIF9NRUlfSFdfVFhFX1JFR1NfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody10eGUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwMTgyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMKQEAgLTAsMCArMSwxMTA3IEBACisvKgorICoKKyAqIEludGVsIE1hbmFnZW1lbnQgRW5naW5lIEludGVyZmFjZSAoSW50ZWwgTUVJKSBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKworI2luY2x1ZGUgPGxpbnV4L21laS5oPgorCisjaW5jbHVkZSAibWVpX2Rldi5oIgorI2luY2x1ZGUgImh3LXR4ZS5oIgorI2luY2x1ZGUgImNsaWVudC5oIgorI2luY2x1ZGUgImhibS5oIgorCisvKioKKyAqIG1laV90eGVfcmVnX3JlYWQgLSBSZWFkcyAzMmJpdCBkYXRhIGZyb20gdGhlIGRldmljZQorICoKKyAqIEBiYXNlX2FkZHI6IHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgbWVpX3R4ZV9yZWdfcmVhZCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIGlvcmVhZDMyKGJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9yZWdfd3JpdGUgLSBXcml0ZXMgMzJiaXQgZGF0YSB0byB0aGUgZGV2aWNlCisgKgorICogQGJhc2VfYWRkcjogcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcworICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0CisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byB3cml0ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWVpX3R4ZV9yZWdfd3JpdGUodm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwlpb3dyaXRlMzIodmFsdWUsIGJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50IC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICoKKyAqIERvZXNuJ3QgY2hlY2sgZm9yIGFsaXZlbmVzcyB3aGlsZSBSZWFkcyAzMmJpdCBkYXRhIGZyb20gdGhlIFNlQyBCQVIKKyAqLworc3RhdGljIGlubGluZSB1MzIgbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlyZXR1cm4gbWVpX3R4ZV9yZWdfcmVhZChody0+bWVtX2FkZHJbU0VDX0JBUl0sIG9mZnNldCk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9zZWNfcmVnX3JlYWQgLSBSZWFkcyAzMmJpdCBkYXRhIGZyb20gdGhlIFNlQyBCQVIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSIGFuZCBzaG91dCBsb3VkIGlmIGFsaXZlbmVzcyBpcyBub3Qgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1laV90eGVfc2VjX3JlZ19yZWFkKHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlXQVJOKCFody0+YWxpdmVuZXNzLCAic2VjIHJlYWQ6IGFsaXZlbmVzcyBub3QgYXNzZXJ0ZWRcbiIpOworCXJldHVybiBtZWlfdHhlX3NlY19yZWdfcmVhZF9zaWxlbnQoaHcsIG9mZnNldCk7Cit9CisvKioKKyAqIG1laV90eGVfc2VjX3JlZ193cml0ZV9zaWxlbnQgLSBXcml0ZXMgMzJiaXQgZGF0YSB0byB0aGUgU2VDIEJBUgorICogICBkb2Vzbid0IGNoZWNrIGZvciBhbGl2ZW5lc3MKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0CisgKiBAdmFsdWU6IHZhbHVlIHRvIHdyaXRlCisgKgorICogRG9lc24ndCBjaGVjayBmb3IgYWxpdmVuZXNzIHdoaWxlIHdyaXRlcyAzMmJpdCBkYXRhIGZyb20gdG8gdGhlIFNlQyBCQVIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1laV90eGVfc2VjX3JlZ193cml0ZV9zaWxlbnQoc3RydWN0IG1laV90eGVfaHcgKmh3LAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJbWVpX3R4ZV9yZWdfd3JpdGUoaHctPm1lbV9hZGRyW1NFQ19CQVJdLCBvZmZzZXQsIHZhbHVlKTsKK30KKworLyoqCisgKiBtZWlfdHhlX3NlY19yZWdfd3JpdGUgLSBXcml0ZXMgMzJiaXQgZGF0YSB0byB0aGUgU2VDIEJBUgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQKKyAqIEB2YWx1ZTogdmFsdWUgdG8gd3JpdGUKKyAqCisgKiBXcml0ZXMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSIGFuZCBzaG91dCBsb3VkIGlmIGFsaXZlbmVzcyBpcyBub3Qgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfdHhlX3NlY19yZWdfd3JpdGUoc3RydWN0IG1laV90eGVfaHcgKmh3LAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJV0FSTighaHctPmFsaXZlbmVzcywgInNlYyB3cml0ZTogYWxpdmVuZXNzIG5vdCBhc3NlcnRlZFxuIik7CisJbWVpX3R4ZV9zZWNfcmVnX3dyaXRlX3NpbGVudChodywgb2Zmc2V0LCB2YWx1ZSk7Cit9CisvKioKKyAqIG1laV90eGVfYnJfcmVnX3JlYWQgLSBSZWFkcyAzMmJpdCBkYXRhIGZyb20gdGhlIEJyaWRnZSBCQVIKKyAqCisgKiBAaHc6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmc2V0OiBvZmZzZXQgZnJvbSB3aGljaCB0byByZWFkIHRoZSBkYXRhCisgKgorICovCitzdGF0aWMgaW5saW5lIHUzMiBtZWlfdHhlX2JyX3JlZ19yZWFkKHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlyZXR1cm4gbWVpX3R4ZV9yZWdfcmVhZChody0+bWVtX2FkZHJbQlJJREdFX0JBUl0sIG9mZnNldCk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9icl9yZWdfd3JpdGUgLSBXcml0ZXMgMzJiaXQgZGF0YSB0byB0aGUgQnJpZGdlIEJBUgorICoKKyAqIEBodzogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IG9mZnNldCBmcm9tIHdoaWNoIHRvIHdyaXRlIHRoZSBkYXRhCisgKiBAdmFsdWU6IHRoZSBieXRlIHRvIHdyaXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfdHhlX2JyX3JlZ193cml0ZShzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwltZWlfdHhlX3JlZ193cml0ZShody0+bWVtX2FkZHJbQlJJREdFX0JBUl0sIG9mZnNldCwgdmFsdWUpOworfQorCisvKioKKyAqIG1laV90eGVfYWxpdmVuZXNzX3NldCAtIHJlcXVlc3QgZm9yIGFsaXZlbmVzcyBjaGFuZ2UKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQHJlcTogcmVxdWVzdGVkIGFsaXZlbmVzcyB2YWx1ZQorICoKKyAqIFJlcXVlc3QgZm9yIGFsaXZlbmVzcyBjaGFuZ2UgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhbmdlIGlzCisgKiAgIHJlYWxseSBuZWVkZWQgYW5kIGZhbHNlIGlmIGFsaXZlbmVzcyBpcyBhbHJlYWR5CisgKiAgIGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUKKyAqIFJlcXVpcmVzIGRldmljZSBsb2NrIHRvIGJlIGhlbGQKKyAqLworc3RhdGljIGJvb2wgbWVpX3R4ZV9hbGl2ZW5lc3Nfc2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUzMiByZXEpCit7CisKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwlib29sIGRvX3JlcSA9IGh3LT5hbGl2ZW5lc3MgIT0gcmVxOworCisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJBbGl2ZW5lc3MgY3VycmVudD0lZCByZXF1ZXN0PSVkXG4iLAorCQkJCWh3LT5hbGl2ZW5lc3MsIHJlcSk7CisJaWYgKGRvX3JlcSkgeworCQlody0+cmVjdmRfYWxpdmVuZXNzID0gZmFsc2U7CisJCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBTSUNSX0hPU1RfQUxJVkVORVNTX1JFUV9SRUcsIHJlcSk7CisJfQorCXJldHVybiBkb19yZXE7Cit9CisKKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc19yZXFfZ2V0IC0gZ2V0IGFsaXZlbmVzcyByZXF1ZXN0ZWQgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIEV4dHJhY3QgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX0FDSyBiaXQgZnJvbQorICogZnJvbSBISUNSX0hPU1RfQUxJVkVORVNTX1JFUSByZWdpc3RlciB2YWx1ZQorICovCitzdGF0aWMgdTMyIG1laV90eGVfYWxpdmVuZXNzX3JlcV9nZXQoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgcmVnOworCXJlZyA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIFNJQ1JfSE9TVF9BTElWRU5FU1NfUkVRX1JFRyk7CisJcmV0dXJuIHJlZyAmIFNJQ1JfSE9TVF9BTElWRU5FU1NfUkVRX1JFUVVFU1RFRDsKK30KKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc19nZXQgLSBnZXQgYWxpdmVuZXNzIHJlc3BvbnNlIHJlZ2lzdGVyIHZhbHVlCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIEV4dHJhY3QgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX0FDSyBiaXQKKyAqIGZyb20gSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQIHJlZ2lzdGVyIHZhbHVlCisgKi8KK3N0YXRpYyB1MzIgbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHJlZzsKKwlyZWcgPSBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBISUNSX0hPU1RfQUxJVkVORVNTX1JFU1BfUkVHKTsKKwlyZXR1cm4gcmVnICYgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX0FDSzsKK30KKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc19wb2xsIC0gd2FpdHMgZm9yIGFsaXZlbmVzcyB0byBzZXR0bGUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGV4cGVjdGVkOiBleHBlY3RlZCBhbGl2ZW5lc3MgdmFsdWUKKyAqCisgKiBQb2xscyBmb3IgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQLkFMSVZFTkVTU19SRVNQIHRvIGJlIHNldAorICogcmV0dXJucyA+IDAgaWYgdGhlIGV4cGVjdGVkIHZhbHVlIHdhcyByZWNlaXZlZCwgLUVUSU1FIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IG1laV90eGVfYWxpdmVuZXNzX3BvbGwoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgdTMyIGV4cGVjdGVkKQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCWludCB0ID0gMDsKKworCWRvIHsKKwkJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCQlpZiAoaHctPmFsaXZlbmVzcyA9PSBleHBlY3RlZCkgeworCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCisJCQkJImFsaXZlbmVzcyBzZXR0bGVkIGFmdGVyICVkIG1zZWNzXG4iLCB0KTsKKwkJCXJldHVybiB0OworCQl9CisJCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJCW1zbGVlcChNU0VDX1BFUl9TRUMgLyA1KTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJCXQgKz0gTVNFQ19QRVJfU0VDIC8gNTsKKwl9IHdoaWxlICh0IDwgU0VDX0FMSVZFTkVTU19XQUlUX1RJTUVPVVQpOworCisJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJhbGl2ZW5lc3MgdGltZWQgb3V0XG4iKTsKKwlyZXR1cm4gLUVUSU1FOworfQorCisvKioKKyAqIG1laV90eGVfYWxpdmVuZXNzX3dhaXQgLSB3YWl0cyBmb3IgYWxpdmVuZXNzIHRvIHNldHRsZQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZXhwZWN0ZWQ6IGV4cGVjdGVkIGFsaXZlbmVzcyB2YWx1ZQorICoKKyAqIFdhaXRzIGZvciBISUNSX0hPU1RfQUxJVkVORVNTX1JFU1AuQUxJVkVORVNTX1JFU1AgdG8gYmUgc2V0CisgKiByZXR1cm5zIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCA8IDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9hbGl2ZW5lc3Nfd2FpdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1MzIgZXhwZWN0ZWQpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJY29uc3QgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0KKwkJCW1zZWNzX3RvX2ppZmZpZXMoU0VDX0FMSVZFTkVTU19XQUlUX1RJTUVPVVQpOworCWxvbmcgZXJyOworCWludCByZXQ7CisKKwlody0+YWxpdmVuZXNzID0gbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0KGRldik7CisJaWYgKGh3LT5hbGl2ZW5lc3MgPT0gZXhwZWN0ZWQpCisJCXJldHVybiAwOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaHctPndhaXRfYWxpdmVuZXNzLAorCQkJaHctPnJlY3ZkX2FsaXZlbmVzcywgdGltZW91dCk7CisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisKKwlody0+YWxpdmVuZXNzID0gbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0KGRldik7CisJcmV0ID0gaHctPmFsaXZlbmVzcyA9PSBleHBlY3RlZCA/IDAgOiAtRVRJTUU7CisKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImFsaXZlbmVzcyB0aW1lZCBvdXQiKTsKKwllbHNlCisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiYWxpdmVuZXNzIHNldHRsZWQgYWZ0ZXIgJWQgbXNlY3NcbiIsCisJCQkJamlmZmllc190b19tc2Vjcyh0aW1lb3V0IC0gZXJyKSk7CisJaHctPnJlY3ZkX2FsaXZlbmVzcyA9IGZhbHNlOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3Nfc2V0X3N5bmMgLSBzZXRzIGFuIHdhaXQgZm9yIGFsaXZlbmVzcyB0byBjb21wbGV0ZQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIG90aGVyd2lzZQorICovCitpbnQgbWVpX3R4ZV9hbGl2ZW5lc3Nfc2V0X3N5bmMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgdTMyIHJlcSkKK3sKKwlpZiAobWVpX3R4ZV9hbGl2ZW5lc3Nfc2V0KGRldiwgcmVxKSkKKwkJcmV0dXJuIG1laV90eGVfYWxpdmVuZXNzX3dhaXQoZGV2LCByZXEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG1laV90eGVfaW5wdXRfcmVhZHlfaW50ZXJydXB0X2VuYWJsZSAtIHNldHMgdGhlIElucHV0IFJlYWR5IEludGVycnVwdAorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaW5wdXRfcmVhZHlfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXUzMiBoaW50bXNrOworCS8qIEVuYWJsZSB0aGUgU0VDX0lQQ19IT1NUX0lOVF9NQVNLX0lOX1JEWSBpbnRlcnJ1cHQgKi8KKwloaW50bXNrID0gbWVpX3R4ZV9zZWNfcmVnX3JlYWQoaHcsIFNFQ19JUENfSE9TVF9JTlRfTUFTS19SRUcpOworCWhpbnRtc2sgfD0gU0VDX0lQQ19IT1NUX0lOVF9NQVNLX0lOX1JEWTsKKwltZWlfdHhlX3NlY19yZWdfd3JpdGUoaHcsIFNFQ19JUENfSE9TVF9JTlRfTUFTS19SRUcsIGhpbnRtc2spOworfQorCisvKioKKyAqIG1laV90eGVfaW5wdXRfZG9vcmJlbGxfc2V0CisgKiAgIC0gU2V0cyBiaXQgMCBpbiBTRUNfSVBDX0lOUFVUX0RPT1JCRUxMLklQQ19JTlBVVF9ET09SQkVMTC4KKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaW5wdXRfZG9vcmJlbGxfc2V0KHN0cnVjdCBtZWlfdHhlX2h3ICpodykKK3sKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlICovCisJY2xlYXJfYml0KFRYRV9JTlRSX0lOX1JFQURZX0JJVCwgJmh3LT5pbnRyX2NhdXNlKTsKKwltZWlfdHhlX3NlY19yZWdfd3JpdGUoaHcsIFNFQ19JUENfSU5QVVRfRE9PUkJFTExfUkVHLCAxKTsKK30KKworLyoqCisgKiBtZWlfdHhlX291dHB1dF9yZWFkeV9zZXQgLSBTZXRzIHRoZSBTSUNSX1NFQ19JUENfT1VUUFVUX1NUQVRVUyBiaXQgdG8gMQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfb3V0cHV0X3JlYWR5X3NldChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcpCit7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsCisJCQlTSUNSX1NFQ19JUENfT1VUUFVUX1NUQVRVU19SRUcsCisJCQlTRUNfSVBDX09VVFBVVF9TVEFUVVNfUkRZKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2lzX2lucHV0X3JlYWR5IC0gY2hlY2sgaWYgVFhFIGlzIHJlYWR5IGZvciByZWNlaXZpbmcgZGF0YQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfaXNfaW5wdXRfcmVhZHkoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgc3RhdHVzOworCXN0YXR1cyA9IG1laV90eGVfc2VjX3JlZ19yZWFkKGh3LCBTRUNfSVBDX0lOUFVUX1NUQVRVU19SRUcpOworCXJldHVybiAhIShTRUNfSVBDX0lOUFVUX1NUQVRVU19SRFkgJiBzdGF0dXMpOworfQorCisvKioKKyAqIG1laV90eGVfaW50cl9jbGVhciAtIGNsZWFyIGFsbCBpbnRlcnJ1cHRzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1laV90eGVfaW50cl9jbGVhcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfc2VjX3JlZ193cml0ZV9zaWxlbnQoaHcsIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1JFRywKKwkJU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUEVORElORyk7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhJU1JfUkVHLCBISVNSX0lOVF9TVFNfTVNLKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSEhJU1JfUkVHLCBJUENfSEhJRVJfTVNLKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2ludHJfZGlzYWJsZSAtIGRpc2FibGUgYWxsIGludGVycnVwdHMKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX2ludHJfZGlzYWJsZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBISElFUl9SRUcsIDApOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBISUVSX1JFRywgMCk7Cit9CisvKioKKyAqIG1laV90eGVfaW50cl9kaXNhYmxlIC0gZW5hYmxlIGFsbCBpbnRlcnJ1cHRzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbWVpX3R4ZV9pbnRyX2VuYWJsZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBISElFUl9SRUcsIElQQ19ISElFUl9NU0spOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBISUVSX1JFRywgSElFUl9JTlRfRU5fTVNLKTsKK30KKworLyoqCisgKiBtZWlfdHhlX3BlbmRpbmdfaW50ZXJydXB0cyAtIGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGludGVycnVwdHMKKyAqCW9ubHkgQWxpdmVuZXNzLCBJbnB1dCByZWFkeSwgYW5kIG91dHB1dCBkb29yYmVsbCBhcmUgb2YgcmVsZXZhbmNlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaW50ZXJydXB0cworICogb25seSBBbGl2ZW5lc3MsIFJlYWRpbmVzcywgSW5wdXQgcmVhZHksIGFuZCBPdXRwdXQgZG9vcmJlbGwgYXJlIHJlbGV2YW50CisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfcGVuZGluZ19pbnRlcnJ1cHRzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwlib29sIHJldCA9IChody0+aW50cl9jYXVzZSAmIChUWEVfSU5UUl9SRUFESU5FU1MgfAorCQkJCSAgICAgIFRYRV9JTlRSX0FMSVZFTkVTUyB8CisJCQkJICAgICAgVFhFX0lOVFJfSU5fUkVBRFkgIHwKKwkJCQkgICAgICBUWEVfSU5UUl9PVVRfREIpKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCisJCQkiUGVuZGluZyBJbnRlcnJ1cHRzIEluUmVhZHk9JTAxZCBSZWFkaW5lc3M9JTAxZCwgQWxpdmVuZXNzPSUwMWQsIE91dERvb3I9JTAxZFxuIiwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfSU5fUkVBRFkpLAorCQkJISEoaHctPmludHJfY2F1c2UgJiBUWEVfSU5UUl9SRUFESU5FU1MpLAorCQkJISEoaHctPmludHJfY2F1c2UgJiBUWEVfSU5UUl9BTElWRU5FU1MpLAorCQkJISEoaHctPmludHJfY2F1c2UgJiBUWEVfSU5UUl9PVVRfREIpKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtZWlfdHhlX2lucHV0X3BheWxvYWRfd3JpdGUgLSB3cml0ZSBhIGR3b3JkIHRvIHRoZSBob3N0IGJ1ZmZlcgorICoJYXQgb2Zmc2V0IGlkeAorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaWR4OiBpbmRleCBpbiB0aGUgaG9zdCBidWZmZXIKKyAqIEB2YWx1ZTogdmFsdWUKKyAqLworc3RhdGljIHZvaWQgbWVpX3R4ZV9pbnB1dF9wYXlsb2FkX3dyaXRlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBsb25nIGlkeCwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfc2VjX3JlZ193cml0ZShodywgU0VDX0lQQ19JTlBVVF9QQVlMT0FEX1JFRyArCisJCQkoaWR4ICogc2l6ZW9mKHUzMikpLCB2YWx1ZSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9vdXRfZGF0YV9yZWFkIC0gcmVhZCBkd29yZCBmcm9tIHRoZSBkZXZpY2UgYnVmZmVyCisgKglhdCBvZmZzZXQgaWR4CisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBpZHg6IGluZGV4IGluIHRoZSBkZXZpY2UgYnVmZmVyCisgKgorICogcmV0dXJucyByZWdpc3RlciB2YWx1ZSBhdCBpbmRleAorICovCitzdGF0aWMgdTMyIG1laV90eGVfb3V0X2RhdGFfcmVhZChjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorCQkJCQl1bnNpZ25lZCBsb25nIGlkeCkKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwlyZXR1cm4gbWVpX3R4ZV9icl9yZWdfcmVhZChodywKKwkJQlJJREdFX0lQQ19PVVRQVVRfUEFZTE9BRF9SRUcgKyAoaWR4ICogc2l6ZW9mKHUzMikpKTsKK30KKworLyogUmVhZGluZXNzICovCisKKy8qKgorICogbWVpX3R4ZV9yZWFkaW5lc3Nfc2V0X2hvc3RfcmR5CisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbWVpX3R4ZV9yZWFkaW5lc3Nfc2V0X2hvc3RfcmR5KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsCisJCVNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JFUV9SRUcsCisJCVNJQ1JfSE9TVF9JUENfUkVBRElORVNTX0hPU1RfUkRZKTsKK30KKworLyoqCisgKiBtZWlfdHhlX3JlYWRpbmVzc19jbGVhcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfcmVhZGluZXNzX2NsZWFyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JFUV9SRUcsCisJCQkJU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfUkRZX0NMUik7Cit9CisvKioKKyAqIG1laV90eGVfcmVhZGluZXNzX2dldCAtIFJlYWRzIGFuZCByZXR1cm5zCisgKgl0aGUgSElDUl9TRUNfSVBDX1JFQURJTkVTUyByZWdpc3RlciB2YWx1ZQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB1MzIgbWVpX3R4ZV9yZWFkaW5lc3NfZ2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJcmV0dXJuIG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfUkVHKTsKK30KKworCisvKioKKyAqIG1laV90eGVfcmVhZGluZXNzX2lzX3NlY19yZHkgLSBjaGVjayByZWFkaW5lc3MKKyAqICBmb3IgSElDUl9TRUNfSVBDX1JFQURJTkVTU19TRUNfUkRZCisgKgorICogQHJlYWRpbmVzcyAtIGNhY2hlZCByZWFkaW5lc3Mgc3RhdGUKKyAqLworc3RhdGljIGlubGluZSBib29sIG1laV90eGVfcmVhZGluZXNzX2lzX3NlY19yZHkodTMyIHJlYWRpbmVzcykKK3sKKwlyZXR1cm4gISEocmVhZGluZXNzICYgSElDUl9TRUNfSVBDX1JFQURJTkVTU19TRUNfUkRZKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2h3X2lzX3JlYWR5IC0gY2hlY2sgaWYgdGhlIGh3IGlzIHJlYWR5CisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGJvb2wgbWVpX3R4ZV9od19pc19yZWFkeShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXUzMiByZWFkaW5lc3MgPSAgbWVpX3R4ZV9yZWFkaW5lc3NfZ2V0KGRldik7CisJcmV0dXJuIG1laV90eGVfcmVhZGluZXNzX2lzX3NlY19yZHkocmVhZGluZXNzKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2hvc3RfaXNfcmVhZHkgLSBjaGVjayBpZiB0aGUgaG9zdCBpcyByZWFkeQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtZWlfdHhlX2hvc3RfaXNfcmVhZHkoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgcmVnID0gbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSElDUl9TRUNfSVBDX1JFQURJTkVTU19SRUcpOworCXJldHVybiAhIShyZWcgJiBISUNSX1NFQ19JUENfUkVBRElORVNTX0hPU1RfUkRZKTsKK30KKworLyoqCisgKiBtZWlfdHhlX3JlYWRpbmVzc193YWl0IC0gd2FpdCB0aWxsIHJlYWRpbmVzcyBzZXR0bGVzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLUVUSU1FIG9uIHRpbWVvdXQKKyAqLworc3RhdGljIGludCBtZWlfdHhlX3JlYWRpbmVzc193YWl0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJaWYgKG1laV90eGVfaHdfaXNfcmVhZHkoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfaHdfcmVhZHksIGRldi0+cmVjdmRfaHdfcmVhZHksCisJCQltc2Vjc190b19qaWZmaWVzKFNFQ19SRVNFVF9XQUlUX1RJTUVPVVQpKTsKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwlpZiAoIWRldi0+cmVjdmRfaHdfcmVhZHkpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3YWl0IGZvciByZWFkaW5lc3MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlkZXYtPnJlY3ZkX2h3X3JlYWR5ID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIG1laV90eGVfaHdfY29uZmlnIC0gY29uZmlndXJlIGhhcmR3YXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZGV2aWNlcworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIGhhcmR3YXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZGV2aWNlIHNob3VsZCBiZSBkb25lIG9ubHkKKyAqICAgb25jZSBhdCB0aGUgZGV2aWNlIHByb2JlIHRpbWUKKyAqLworc3RhdGljIHZvaWQgbWVpX3R4ZV9od19jb25maWcoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCS8qIERvZXNuJ3QgY2hhbmdlIGluIHJ1bnRpbWUgKi8KKwlkZXYtPmhidWZfZGVwdGggPSBQQVlMT0FEX1NJWkUgLyA0OworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWh3LT5yZWFkaW5lc3MgPSBtZWlfdHhlX3JlYWRpbmVzc19nZXQoZGV2KTsKKworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiYWxpdmVuZXNzX3Jlc3AgPSAweCUwOHgsIHJlYWRpbmVzcyA9IDB4JTA4eC5cbiIsCisJCWh3LT5hbGl2ZW5lc3MsIGh3LT5yZWFkaW5lc3MpOworfQorCisKKy8qKgorICogbWVpX3R4ZV93cml0ZSAtIHdyaXRlcyBhIG1lc3NhZ2UgdG8gZGV2aWNlLgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaGVhZGVyOiBoZWFkZXIgb2YgbWVzc2FnZQorICogQGJ1ZjogbWVzc2FnZSBidWZmZXIgd2lsbCBiZSB3cml0dGVuCisgKiByZXR1cm5zIDEgaWYgc3VjY2VzcywgMCAtIG90aGVyd2lzZS4KKyAqLworCitzdGF0aWMgaW50IG1laV90eGVfd3JpdGUoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IG1laV9tc2dfaGRyICpoZWFkZXIsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHJlbTsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsKKwlpbnQgc2xvdHMgPSBkZXYtPmhidWZfZGVwdGg7CisJdTMyICpyZWdfYnVmID0gKHUzMiAqKWJ1ZjsKKwl1MzIgZHdfY250OworCWludCBpOworCisJaWYgKFdBUk5fT04oIWhlYWRlciB8fCAhYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW5ndGggPSBoZWFkZXItPmxlbmd0aDsKKworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCBNRUlfSERSX0ZNVCwgTUVJX0hEUl9QUk0oaGVhZGVyKSk7CisKKwlkd19jbnQgPSBtZWlfZGF0YTJzbG90cyhsZW5ndGgpOworCWlmIChkd19jbnQgPiBzbG90cykKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChXQVJOKCFody0+YWxpdmVuZXNzLCAidHhlIHdyaXRlOiBhbGl2ZW5lc3Mgbm90IGFzc2VydGVkXG4iKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBFbmFibGUgSW5wdXQgUmVhZHkgSW50ZXJydXB0LiAqLworCW1laV90eGVfaW5wdXRfcmVhZHlfaW50ZXJydXB0X2VuYWJsZShkZXYpOworCisJaWYgKCFtZWlfdHhlX2lzX2lucHV0X3JlYWR5KGRldikpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJJbnB1dCBpcyBub3QgcmVhZHkiKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJbWVpX3R4ZV9pbnB1dF9wYXlsb2FkX3dyaXRlKGRldiwgMCwgKigodTMyICopaGVhZGVyKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC8gNDsgaSsrKQorCQltZWlfdHhlX2lucHV0X3BheWxvYWRfd3JpdGUoZGV2LCBpICsgMSwgcmVnX2J1ZltpXSk7CisKKwlyZW0gPSBsZW5ndGggJiAweDM7CisJaWYgKHJlbSA+IDApIHsKKwkJdTMyIHJlZyA9IDA7CisJCW1lbWNweSgmcmVnLCAmYnVmW2xlbmd0aCAtIHJlbV0sIHJlbSk7CisJCW1laV90eGVfaW5wdXRfcGF5bG9hZF93cml0ZShkZXYsIGkgKyAxLCByZWcpOworCX0KKworCS8qIGFmdGVyIGVhY2ggd3JpdGUgdGhlIHdob2xlIGJ1ZmZlciBpcyBjb25zdW1lZCAqLworCWh3LT5zbG90cyA9IDA7CisKKwkvKiBTZXQgSW5wdXQtRG9vcmJlbGwgKi8KKwltZWlfdHhlX2lucHV0X2Rvb3JiZWxsX3NldChodyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2hidWZfbWF4X2xlbiAtIG1pbWljcyB0aGUgbWUgaGJ1ZiBjaXJjdWxhciBidWZmZXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgdGhlIFBBWUxPQURfU0laRSAtIDQKKyAqLworc3RhdGljIHNpemVfdCBtZWlfdHhlX2hidWZfbWF4X2xlbihjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXJldHVybiBQQVlMT0FEX1NJWkUgLSBzaXplb2Yoc3RydWN0IG1laV9tc2dfaGRyKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2hidWZfZW1wdHlfc2xvdHMgLSBtaW1pY3MgdGhlIG1lIGhidWYgY2lyY3VsYXIgYnVmZmVyCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIGFsd2F5cyBoYnVmX2RlcHRoCisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9oYnVmX2VtcHR5X3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJcmV0dXJuIGh3LT5zbG90czsKK30KKworLyoqCisgKiBtZWlfdHhlX2NvdW50X2Z1bGxfcmVhZF9zbG90cyAtIG1pbWljcyB0aGUgbWUgZGV2aWNlIGNpcmN1bGFyIGJ1ZmZlcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyBhbHdheXMgYnVmZmVyIHNpemUgaW4gZHdvcmRzIGNvdW50CisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9jb3VudF9mdWxsX3JlYWRfc2xvdHMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwkvKiByZWFkIGJ1ZmZlcnMgaGFzIHN0YXRpYyBzaXplICovCisJcmV0dXJuICBQQVlMT0FEX1NJWkUgLyA0OworfQorCisvKioKKyAqIG1laV90eGVfcmVhZF9oZHIgLSByZWFkIG1lc3NhZ2UgaGVhZGVyIHdoaWNoIGlzIGFsd2F5cyBpbiA0IGZpcnN0IGJ5dGVzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIG1laSBtZXNzYWdlIGhlYWRlcgorICovCisKK3N0YXRpYyB1MzIgbWVpX3R4ZV9yZWFkX2hkcihjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXJldHVybiBtZWlfdHhlX291dF9kYXRhX3JlYWQoZGV2LCAwKTsKK30KKy8qKgorICogbWVpX3R4ZV9yZWFkIC0gcmVhZHMgYSBtZXNzYWdlIGZyb20gdGhlIHR4ZSBkZXZpY2UuCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IG1lc3NhZ2UgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbgorICogQGxlbjogbWVzc2FnZSBzaXplIHdpbGwgYmUgcmVhZAorICoKKyAqIHJldHVybnMgLUVJTlZBTCBvbiBlcnJvciB3cm9uZyBhcmd1bWVudCBhbmQgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9yZWFkKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgaTsKKwl1MzIgKnJlZ19idWYgPSAodTMyICopYnVmOworCXUzMiByZW0gPSBsZW4gJiAweDM7CisKKwlpZiAoV0FSTl9PTighYnVmIHx8ICFsZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAorCQkiYnVmZmVyLWxlbmd0aCA9ICVsdSBidWZbMF0weCUwOFhcbiIsCisJCWxlbiwgbWVpX3R4ZV9vdXRfZGF0YV9yZWFkKGRldiwgMCkpOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAvIDQ7IGkrKykgeworCQkvKiBza2lwIGhlYWRlcjogaW5kZXggc3RhcnRzIGZyb20gMSAqLworCQl1MzIgcmVnID0gbWVpX3R4ZV9vdXRfZGF0YV9yZWFkKGRldiwgaSArIDEpOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImJ1ZlslZF0gPSAweCUwOFhcbiIsIGksIHJlZyk7CisJCSpyZWdfYnVmKysgPSByZWc7CisJfQorCisJaWYgKHJlbSkgeworCQl1MzIgcmVnID0gbWVpX3R4ZV9vdXRfZGF0YV9yZWFkKGRldiwgaSArIDEpOworCQltZW1jcHkocmVnX2J1ZiwgJnJlZywgcmVtKTsKKwl9CisKKwltZWlfdHhlX291dHB1dF9yZWFkeV9zZXQoaHcpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG1laV90eGVfaHdfcmVzZXQgLSByZXNldHMgaG9zdCBhbmQgZncuCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBpbnRyX2VuYWJsZTogaWYgaW50ZXJydXB0IHNob3VsZCBiZSBlbmFibGVkIGFmdGVyIHJlc2V0LgorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCA8IDAgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdGF0aWMgaW50IG1laV90eGVfaHdfcmVzZXQoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgYm9vbCBpbnRyX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKworCXUzMiBhbGl2ZW5lc3NfcmVxOworCS8qCisJICogcmVhZCBpbnB1dCBkb29yYmVsbCB0byBlbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiAgQnJpZGdlIGFuZCBTZUMKKwkgKiByZXR1cm4gdmFsdWUgbWlnaHQgYmUgZ2FyYmFnZSByZXR1cm4KKwkgKi8KKwkodm9pZCltZWlfdHhlX3NlY19yZWdfcmVhZF9zaWxlbnQoaHcsIFNFQ19JUENfSU5QVVRfRE9PUkJFTExfUkVHKTsKKworCWFsaXZlbmVzc19yZXEgPSBtZWlfdHhlX2FsaXZlbmVzc19yZXFfZ2V0KGRldik7CisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGluIHRoaXMgc3RhZ2Ugd2Ugd2lsbCBwb2xsICovCisJbWVpX3R4ZV9pbnRyX2Rpc2FibGUoZGV2KTsKKworCS8qCisJICogSWYgQWxpdmVuZXNzIFJlcXVlc3QgYW5kIEFsaXZlbmVzcyBSZXNwb25zZSBhcmUgbm90IGVxdWFsIHRoZW4KKwkgKiB3YWl0IGZvciB0aGVtIHRvIGJlIGVxdWFsCisJICogU2luY2Ugd2UgbWlnaHQgaGF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkIC0gcG9sbCBmb3IgaXQKKwkgKi8KKwlpZiAoYWxpdmVuZXNzX3JlcSAhPSBody0+YWxpdmVuZXNzKQorCQlpZiAobWVpX3R4ZV9hbGl2ZW5lc3NfcG9sbChkZXYsIGFsaXZlbmVzc19yZXEpIDwgMCkgeworCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCQkJIndhaXQgZm9yIGFsaXZlbmVzcyBzZXR0bGUgZmFpbGVkIC4uLiBiYWlsaW5nIG91dFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJLyoKKwkgKiBJZiBBbGl2ZW5lc3MgUmVxdWVzdCBhbmQgQWxpdmVuZXNzIFJlc3BvbnNlIGFyZSBzZXQgdGhlbiBjbGVhciB0aGVtCisJICovCisJaWYgKGFsaXZlbmVzc19yZXEpIHsKKwkJbWVpX3R4ZV9hbGl2ZW5lc3Nfc2V0KGRldiwgMCk7CisJCWlmIChtZWlfdHhlX2FsaXZlbmVzc19wb2xsKGRldiwgMCkgPCAwKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKKwkJCQkid2FpdCBmb3IgYWxpdmVuZXNzIGZhaWxlZCAuLi4gYmFpbGluZyBvdXRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKgorCSAqIFNldCByZWRpbmVzcyBSRFlfQ0xSIGJpdAorCSAqLworCW1laV90eGVfcmVhZGluZXNzX2NsZWFyKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2h3X3N0YXJ0IC0gc3RhcnQgdGhlIGhhcmR3YXJlIGFmdGVyIHJlc2V0CisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworc3RhdGljIGludCBtZWlfdHhlX2h3X3N0YXJ0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJaW50IHJldDsKKworCXUzMiBoaXNyOworCisJLyogYnJpbmcgYmFjayBpbnRlcnJ1cHRzICovCisJbWVpX3R4ZV9pbnRyX2VuYWJsZShkZXYpOworCisJcmV0ID0gbWVpX3R4ZV9yZWFkaW5lc3Nfd2FpdChkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2F0aW5nIGZvciByZWFkaW5lc3MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIElmIEhJU1IuSU5UMl9TVFMgaW50ZXJydXB0IHN0YXR1cyBiaXQgaXMgc2V0IHRoZW4gY2xlYXIgaXQuCisJICovCisJaGlzciA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJU1JfUkVHKTsKKwlpZiAoaGlzciAmIEhJU1JfSU5UXzJfU1RTKQorCQltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSElTUl9SRUcsIEhJU1JfSU5UXzJfU1RTKTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgY2F1c2Ugb2YgT3V0cHV0RG9vcmJlbGwgKi8KKwljbGVhcl9iaXQoVFhFX0lOVFJfT1VUX0RCX0JJVCwgJmh3LT5pbnRyX2NhdXNlKTsKKworCXJldCA9IG1laV90eGVfYWxpdmVuZXNzX3NldF9zeW5jKGRldiwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3YWl0IGZvciBhbGl2ZW5lc3MgZmFpbGVkIC4uLiBiYWlsaW5nIG91dFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZW5hYmxlIGlucHV0IHJlYWR5IGludGVycnVwdHM6CisJICogU0VDX0lQQ19IT1NUX0lOVF9NQVNLLklQQ19JTlBVVF9SRUFEWV9JTlRfTUFTSworCSAqLworCW1laV90eGVfaW5wdXRfcmVhZHlfaW50ZXJydXB0X2VuYWJsZShkZXYpOworCisKKwkvKiAgU2V0IHRoZSBTSUNSX1NFQ19JUENfT1VUUFVUX1NUQVRVUy5JUENfT1VUUFVUX1JFQURZIGJpdCAqLworCW1laV90eGVfb3V0cHV0X3JlYWR5X3NldChodyk7CisKKwkvKiBTZXQgYml0IFNJQ1JfSE9TVF9JUENfUkVBRElORVNTLkhPU1RfUkRZCisJICovCisJbWVpX3R4ZV9yZWFkaW5lc3Nfc2V0X2hvc3RfcmR5KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2NoZWNrX2FuZF9hY2tfaW50cnMgLSB0cmFuc2xhdGUgbXVsdGkgQkFSIGludGVycnVwdCBpbnRvCisgKiAgc2luZ2xlIGJpdCBtYXNrIGFuZCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZG9fYWNrOiBhY2tub3dsZWRnZSBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfY2hlY2tfYW5kX2Fja19pbnRycyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBib29sIGRvX2FjaykKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgaGlzcjsKKwl1MzIgaGhpc3I7CisJdTMyIGlwY19pc3I7CisJdTMyIGFsaXZlbmVzczsKKwlib29sIGdlbmVyYXRlZDsKKworCS8qIHJlYWQgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworCWhoaXNyID0gbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSEhJU1JfUkVHKTsKKwlnZW5lcmF0ZWQgPSAoaGhpc3IgJiBJUENfSEhJRVJfTVNLKTsKKwlpZiAoIWdlbmVyYXRlZCkKKwkJZ290byBvdXQ7CisKKwloaXNyID0gbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSElTUl9SRUcpOworCisJYWxpdmVuZXNzID0gbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0KGRldik7CisJaWYgKGhoaXNyICYgSVBDX0hISUVSX1NFQyAmJiBhbGl2ZW5lc3MpCisJCWlwY19pc3IgPSBtZWlfdHhlX3NlY19yZWdfcmVhZF9zaWxlbnQoaHcsCisJCQkJU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUkVHKTsKKwllbHNlCisJCWlwY19pc3IgPSAwOworCisJZ2VuZXJhdGVkID0gZ2VuZXJhdGVkIHx8CisJCShoaXNyICYgSElTUl9JTlRfU1RTX01TSykgfHwKKwkJKGlwY19pc3IgJiBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19QRU5ESU5HKTsKKworCWlmIChnZW5lcmF0ZWQgJiYgZG9fYWNrKSB7CisJCS8qIFNhdmUgdGhlIGludGVycnVwdCBjYXVzZXMgKi8KKwkJaHctPmludHJfY2F1c2UgfD0gaGlzciAmIEhJU1JfSU5UX1NUU19NU0s7CisJCWlmIChpcGNfaXNyICYgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfSU5fUkRZKQorCQkJaHctPmludHJfY2F1c2UgfD0gVFhFX0lOVFJfSU5fUkVBRFk7CisKKworCQltZWlfdHhlX2ludHJfZGlzYWJsZShkZXYpOworCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBpbiBoaWVyYXJjaHk6CisJCSAqIElQQyBhbmQgQnJpZGdlLCB0aGFuIHRoZSBIaWdoIExldmVsICovCisJCW1laV90eGVfc2VjX3JlZ193cml0ZV9zaWxlbnQoaHcsCisJCQlTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcsIGlwY19pc3IpOworCQltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSElTUl9SRUcsIGhpc3IpOworCQltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSEhJU1JfUkVHLCBoaGlzcik7CisJfQorCitvdXQ6CisJcmV0dXJuIGdlbmVyYXRlZDsKK30KKworLyoqCisgKiBtZWlfdHhlX2lycV9xdWlja19oYW5kbGVyIC0gVGhlIElTUiBvZiB0aGUgTUVJIGRldmljZQorICoKKyAqIEBpcnE6IFRoZSBpcnEgbnVtYmVyCisgKiBAZGV2X2lkOiBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyBpcnFyZXR1cm5fdAorICovCitpcnFyZXR1cm5fdCBtZWlfdHhlX2lycV9xdWlja19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gZGV2X2lkOworCisJaWYgKG1laV90eGVfY2hlY2tfYW5kX2Fja19pbnRycyhkZXYsIHRydWUpKQorCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCXJldHVybiBJUlFfTk9ORTsKK30KKworCisvKioKKyAqIG1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyIC0gdHhlIGludGVycnVwdCB0aHJlYWQKKyAqCisgKiBAaXJxOiBUaGUgaXJxIG51bWJlcgorICogQGRldl9pZDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgaXJxcmV0dXJuX3QKKyAqCisgKi8KK2lycXJldHVybl90IG1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gKHN0cnVjdCBtZWlfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwlzdHJ1Y3QgbWVpX2NsX2NiIGNvbXBsZXRlX2xpc3Q7CisJczMyIHNsb3RzOworCWludCByZXRzID0gMDsKKworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaXJxIHRocmVhZDogSW50ZXJydXB0IFJlZ2lzdGVycyBISElTUnxISVNSfFNFQz0lMDJYfCUwNFh8JTAyWFxuIiwKKwkJbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSEhJU1JfUkVHKSwKKwkJbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSElTUl9SRUcpLAorCQltZWlfdHhlX3NlY19yZWdfcmVhZF9zaWxlbnQoaHcsIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1JFRykpOworCisKKwkvKiBpbml0aWFsaXplIG91ciBjb21wbGV0ZSBsaXN0ICovCisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJbWVpX2lvX2xpc3RfaW5pdCgmY29tcGxldGVfbGlzdCk7CisKKwlpZiAocGNpX2Rldl9tc2lfZW5hYmxlZChkZXYtPnBkZXYpKQorCQltZWlfdHhlX2NoZWNrX2FuZF9hY2tfaW50cnMoZGV2LCB0cnVlKTsKKworCS8qIHNob3cgaXJxIGV2ZW50cyAqLworCW1laV90eGVfcGVuZGluZ19pbnRlcnJ1cHRzKGRldik7CisKKwlody0+YWxpdmVuZXNzID0gbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0KGRldik7CisJaHctPnJlYWRpbmVzcyA9IG1laV90eGVfcmVhZGluZXNzX2dldChkZXYpOworCisJLyogUmVhZGluZXNzOgorCSAqIERldGVjdGlvbiBvZiBUWEUgZHJpdmVyIGdvaW5nIHRocm91Z2ggcmVzZXQKKwkgKiBvciBUWEUgZHJpdmVyIHJlc2V0dGluZyB0aGUgSEVDSSBpbnRlcmZhY2UuCisJICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUWEVfSU5UUl9SRUFESU5FU1NfQklULCAmaHctPmludHJfY2F1c2UpKSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiUmVhZGluZXNzIEludGVycnVwdCB3YXMgcmVjZWl2ZWQuLi5cbiIpOworCisJCS8qIENoZWNrIGlmIFNlQyBpcyBnb2luZyB0aHJvdWdoIHJlc2V0ICovCisJCWlmIChtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5KGh3LT5yZWFkaW5lc3MpKSB7CisJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIndlIG5lZWQgdG8gc3RhcnQgdGhlIGRldi5cbiIpOworCQkJZGV2LT5yZWN2ZF9od19yZWFkeSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlkZXYtPnJlY3ZkX2h3X3JlYWR5ID0gZmFsc2U7CisJCQlpZiAoZGV2LT5kZXZfc3RhdGUgIT0gTUVJX0RFVl9SRVNFVFRJTkcpIHsKKworCQkJCWRldl93YXJuKCZkZXYtPnBkZXYtPmRldiwgIkZXIG5vdCByZWFkeTogcmVzZXR0aW5nLlxuIik7CisJCQkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwkJCQlnb3RvIGVuZDsKKworCQkJfQorCQl9CisJCXdha2VfdXAoJmRldi0+d2FpdF9od19yZWFkeSk7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBDaGVjayBpbnRlcnJ1cHQgY2F1c2U6CisJICogQWxpdmVuZXNzOiBEZXRlY3Rpb24gb2YgU2VDIGFja25vd2xlZGdlIG9mIGhvc3QgcmVxdWVzdCB0aGF0CisJICogaXQgcmVtYWluIGFsaXZlIG9yIGhvc3QgY2FuY2VsbGF0aW9uIG9mIHRoYXQgcmVxdWVzdC4KKwkgKi8KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFhFX0lOVFJfQUxJVkVORVNTX0JJVCwgJmh3LT5pbnRyX2NhdXNlKSkgeworCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlICovCisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAorCQkJIkFsaXZlbmVzcyBJbnRlcnJ1cHQ6IFN0YXR1czogJWRcbiIsIGh3LT5hbGl2ZW5lc3MpOworCQlody0+cmVjdmRfYWxpdmVuZXNzID0gdHJ1ZTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmh3LT53YWl0X2FsaXZlbmVzcykpCisJCQl3YWtlX3VwKCZody0+d2FpdF9hbGl2ZW5lc3MpOworCX0KKworCisJLyogT3V0cHV0IERvb3JiZWxsOgorCSAqIERldGVjdGlvbiBvZiBTZUMgaGF2aW5nIHNlbnQgb3V0cHV0IHRvIGhvc3QKKwkgKi8KKwlzbG90cyA9IG1laV9jb3VudF9mdWxsX3JlYWRfc2xvdHMoZGV2KTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRYRV9JTlRSX09VVF9EQl9CSVQsICZody0+aW50cl9jYXVzZSkpIHsKKwkJLyogUmVhZCBmcm9tIFRYRSAqLworCQlyZXRzID0gbWVpX2lycV9yZWFkX2hhbmRsZXIoZGV2LCAmY29tcGxldGVfbGlzdCwgJnNsb3RzKTsKKwkJaWYgKHJldHMgJiYgZGV2LT5kZXZfc3RhdGUgIT0gTUVJX0RFVl9SRVNFVFRJTkcpIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkJCSJtZWlfaXJxX3JlYWRfaGFuZGxlciByZXQgPSAlZC5cbiIsIHJldHMpOworCisJCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisJLyogSW5wdXQgUmVhZHk6IERldGVjdGlvbiBpZiBob3N0IGNhbiB3cml0ZSB0byBTZUMgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRYRV9JTlRSX0lOX1JFQURZX0JJVCwgJmh3LT5pbnRyX2NhdXNlKSkgeworCQlkZXYtPmhidWZfaXNfcmVhZHkgPSB0cnVlOworCQlody0+c2xvdHMgPSBkZXYtPmhidWZfZGVwdGg7CisJfQorCisJaWYgKGh3LT5hbGl2ZW5lc3MgJiYgZGV2LT5oYnVmX2lzX3JlYWR5KSB7CisJCS8qIGdldCB0aGUgcmVhbCByZWdpc3RlciB2YWx1ZSAqLworCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBtZWlfaGJ1Zl9pc19yZWFkeShkZXYpOworCQlyZXRzID0gbWVpX2lycV93cml0ZV9oYW5kbGVyKGRldiwgJmNvbXBsZXRlX2xpc3QpOworCQlpZiAocmV0cyAmJiByZXRzICE9IC1FTVNHU0laRSkKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAibWVpX2lycV93cml0ZV9oYW5kbGVyIHJldCA9ICVkLlxuIiwKKwkJCQlyZXRzKTsKKwkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gbWVpX2hidWZfaXNfcmVhZHkoZGV2KTsKKwl9CisKKwltZWlfaXJxX2NvbXBsX2hhbmRsZXIoZGV2LCAmY29tcGxldGVfbGlzdCk7CisKK2VuZDoKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImludGVycnVwdCB0aHJlYWQgZW5kIHJldCA9ICVkXG4iLCByZXRzKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisKKwltZWlfZW5hYmxlX2ludGVycnVwdHMoZGV2KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVpX2h3X29wcyBtZWlfdHhlX2h3X29wcyA9IHsKKworCS5ob3N0X2lzX3JlYWR5ID0gbWVpX3R4ZV9ob3N0X2lzX3JlYWR5LAorCisJLmh3X2lzX3JlYWR5ID0gbWVpX3R4ZV9od19pc19yZWFkeSwKKwkuaHdfcmVzZXQgPSBtZWlfdHhlX2h3X3Jlc2V0LAorCS5od19jb25maWcgPSBtZWlfdHhlX2h3X2NvbmZpZywKKwkuaHdfc3RhcnQgPSBtZWlfdHhlX2h3X3N0YXJ0LAorCisJLmludHJfY2xlYXIgPSBtZWlfdHhlX2ludHJfY2xlYXIsCisJLmludHJfZW5hYmxlID0gbWVpX3R4ZV9pbnRyX2VuYWJsZSwKKwkuaW50cl9kaXNhYmxlID0gbWVpX3R4ZV9pbnRyX2Rpc2FibGUsCisKKwkuaGJ1Zl9mcmVlX3Nsb3RzID0gbWVpX3R4ZV9oYnVmX2VtcHR5X3Nsb3RzLAorCS5oYnVmX2lzX3JlYWR5ID0gbWVpX3R4ZV9pc19pbnB1dF9yZWFkeSwKKwkuaGJ1Zl9tYXhfbGVuID0gbWVpX3R4ZV9oYnVmX21heF9sZW4sCisKKwkud3JpdGUgPSBtZWlfdHhlX3dyaXRlLAorCisJLnJkYnVmX2Z1bGxfc2xvdHMgPSBtZWlfdHhlX2NvdW50X2Z1bGxfcmVhZF9zbG90cywKKwkucmVhZF9oZHIgPSBtZWlfdHhlX3JlYWRfaGRyLAorCisJLnJlYWQgPSBtZWlfdHhlX3JlYWQsCisKK307CisKKy8qKgorICogbWVpX3R4ZV9kZXZfaW5pdCAtIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdHhlIGhhcmR3YXJlIHNwZWNpZmljIHN0cnVjdHVyZQorICoKKyAqIEBwZGV2IC0gcGNpIGRldmljZQorICogcmV0dXJucyBzdHJ1Y3QgbWVpX2RldmljZSAqIG9uIHN1Y2Nlc3Mgb3IgTlVMTDsKKyAqCisgKi8KK3N0cnVjdCBtZWlfZGV2aWNlICptZWlfdHhlX2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJc3RydWN0IG1laV90eGVfaHcgKmh3OworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1laV9kZXZpY2UpICsKKwkJCSBzaXplb2Yoc3RydWN0IG1laV90eGVfaHcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwltZWlfZGV2aWNlX2luaXQoZGV2KTsKKworCWh3ID0gdG9fdHhlX2h3KGRldik7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+d2FpdF9hbGl2ZW5lc3MpOworCisJZGV2LT5vcHMgPSAmbWVpX3R4ZV9od19vcHM7CisKKwlkZXYtPnBkZXYgPSBwZGV2OworCXJldHVybiBkZXY7Cit9CisKKy8qKgorICogbWVpX3R4ZV9zZXR1cF9zYXR0MiAtIFNBVFQyIGNvbmZpZ3VyYXRpb24gZm9yIERNQSBzdXBwb3J0LgorICoKKyAqIEBkZXY6ICAgdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiAgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCBvZiB0aGUgcmFuZ2UKKyAqIEByYW5nZTogcGh5c2ljYWwgcmFuZ2Ugc2l6ZQorICovCitpbnQgbWVpX3R4ZV9zZXR1cF9zYXR0MihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBwaHlzX2FkZHJfdCBhZGRyLCB1MzIgcmFuZ2UpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisKKwl1MzIgbG8zMiA9IGxvd2VyXzMyX2JpdHMoYWRkcik7CisJdTMyIGhpMzIgPSB1cHBlcl8zMl9iaXRzKGFkZHIpOworCXUzMiBjdHJsOworCisJLyogU0FUVCBpcyBsaW1pdGVkIHRvIDM2IEJpdHMgKi8KKwlpZiAoaGkzMiAmIH4weEYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU0FUVCBoYXMgdG8gYmUgMTZCeXRlIGFsaWduZWQgKi8KKwlpZiAobG8zMiAmIDB4RikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTQVRUIHJhbmdlIGhhcyB0byBiZSA0Qnl0ZXMgYWxpZ25lZCAqLworCWlmIChyYW5nZSAmIDB4NCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTQVRUIGlzIGxpbWl0ZWQgdG8gMzIgTUIgcmFuZ2UqLworCWlmIChyYW5nZSA+IFNBVFRfUkFOR0VfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0cmwgPSBTQVRUMl9DVFJMX1ZBTElEX01TSzsKKwljdHJsIHw9IGhpMzIgIDw8IFNBVFQyX0NUUkxfQlJfQkFTRV9BRERSX1JFR19TSElGVDsKKworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBTQVRUMl9TQVBfU0laRV9SRUcsIHJhbmdlKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0FUVDJfQlJHX0JBX0xTQl9SRUcsIGxvMzIpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBTQVRUMl9DVFJMX1JFRywgY3RybCk7CisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJTQVRUMjogU0FQX1NJWkVfT0ZGU0VUPTB4JTA4WCwgQlJHX0JBX0xTQl9PRkZTRVQ9MHglMDhYLCBDVFJMX09GRlNFVD0weCUwOFhcbiIsCisJCXJhbmdlLCBsbzMyLCBjdHJsKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody10eGUuaCBiL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMmQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqCisgKiBJbnRlbCBNYW5hZ2VtZW50IEVuZ2luZSBJbnRlcmZhY2UgKEludGVsIE1FSSkgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9NRUlfSFdfVFhFX0hfCisjZGVmaW5lIF9NRUlfSFdfVFhFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKworI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiaHctdHhlLXJlZ3MuaCIKKworLyogRmxhdHRlbiBIaWVyYXJjaHkgaW50ZXJydXB0IGNhdXNlICovCisjZGVmaW5lIFRYRV9JTlRSX1JFQURJTkVTU19CSVQgIDAgLyogSElTUl9JTlRfMF9TVFMgKi8KKyNkZWZpbmUgVFhFX0lOVFJfUkVBRElORVNTICAgICAgSElTUl9JTlRfMF9TVFMKKyNkZWZpbmUgVFhFX0lOVFJfQUxJVkVORVNTX0JJVCAgMSAvKiBISVNSX0lOVF8xX1NUUyAqLworI2RlZmluZSBUWEVfSU5UUl9BTElWRU5FU1MgICAgICBISVNSX0lOVF8xX1NUUworI2RlZmluZSBUWEVfSU5UUl9PVVRfREJfQklUICAgICAyIC8qIEhJU1JfSU5UXzJfU1RTICovCisjZGVmaW5lIFRYRV9JTlRSX09VVF9EQiAgICAgICAgIEhJU1JfSU5UXzJfU1RTCisjZGVmaW5lIFRYRV9JTlRSX0lOX1JFQURZX0JJVCAgIDggLyogYmV5b25kIEhJU1IgKi8KKyNkZWZpbmUgVFhFX0lOVFJfSU5fUkVBRFkgICAgICAgQklUKDgpCisKKy8qKgorICogc3RydWN0IG1laV90eGVfaHcgLSB0eGUgaGFyZHdhcmUgc3BlY2lmaWNzCisgKgorICogQG1lbV9hZGRyOiAgICAgICAgU2VDIGFuZCBCUklER0UgYmFycworICogQGFsaXZlbmVzczogICAgICAgYWxpdmVuZXNzIChwb3dlciBnYXRpbmcpIHN0YXRlIG9mIHRoZSBoYXJkd2FyZQorICogQHJlYWRpbmVzczogICAgICAgcmVhZGluZXNzIHN0YXRlIG9mIHRoZSBoYXJkd2FyZQorICogQHdhaXRfYWxpdmVuZXNzOiAgYWxpdmVuZXNzIHdhaXQgcXVldWUKKyAqIEByZWN2ZF9hbGl2ZW5lc3M6IGFsaXZlbmVzcyBpbnRlcnJ1cHQgd2FzIHJlY2l2ZWQKKyAqIEBpbnRyX2NhdXNlOiAgICAgIHRyYW5zbGF0ZWQgaW50ZXJydXB0IGNhdXNlCisgKi8KK3N0cnVjdCBtZWlfdHhlX2h3IHsKKwl2b2lkIF9faW9tZW0gKm1lbV9hZGRyW05VTV9PRl9NRU1fQkFSU107CisJdTMyIGFsaXZlbmVzczsKKwl1MzIgcmVhZGluZXNzOworCXUzMiBzbG90czsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfYWxpdmVuZXNzOworCWJvb2wgcmVjdmRfYWxpdmVuZXNzOworCisJdW5zaWduZWQgbG9uZyBpbnRyX2NhdXNlOworfTsKKworI2RlZmluZSB0b190eGVfaHcoZGV2KSAoc3RydWN0IG1laV90eGVfaHcgKikoKGRldiktPmh3KQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZWlfZGV2aWNlICpod190eGVfdG9fbWVpKHN0cnVjdCBtZWlfdHhlX2h3ICpodykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopaHcsIHN0cnVjdCBtZWlfZGV2aWNlLCBodyk7Cit9CisKK3N0cnVjdCBtZWlfZGV2aWNlICptZWlfdHhlX2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworaXJxcmV0dXJuX3QgbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworaXJxcmV0dXJuX3QgbWVpX3R4ZV9pcnFfdGhyZWFkX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKworaW50IG1laV90eGVfYWxpdmVuZXNzX3NldF9zeW5jKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUzMiByZXEpOworCitpbnQgbWVpX3R4ZV9zZXR1cF9zYXR0MihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBwaHlzX2FkZHJfdCBhZGRyLCB1MzIgcmFuZ2UpOworCisKKyNlbmRpZiAvKiBfTUVJX0hXX1RYRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody5oIGIvZHJpdmVycy9taXNjL21laS9ody5oCmluZGV4IGRkNDRlMzMuLjZiNDc2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHcuaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LmgKQEAgLTIyLDcgKzIyLDcgQEAKIC8qCiAgKiBUaW1lb3V0cyBpbiBTZWNvbmRzCiAgKi8KLSNkZWZpbmUgTUVJX0lOVEVST1BfVElNRU9VVCAgICAgICAgIDcgIC8qIFRpbWVvdXQgb24gcmVhZHkgbWVzc2FnZSAqLworI2RlZmluZSBNRUlfSFdfUkVBRFlfVElNRU9VVCAgICAgICAgMiAgLyogVGltZW91dCBvbiByZWFkeSBtZXNzYWdlICovCiAjZGVmaW5lIE1FSV9DT05ORUNUX1RJTUVPVVQgICAgICAgICAzICAvKiBIUFM6IGF0IGxlYXN0IDIgc2Vjb25kcyAqLwogCiAjZGVmaW5lIE1FSV9DTF9DT05ORUNUX1RJTUVPVVQgICAgIDE1ICAvKiBIUFM6IENsaWVudCBDb25uZWN0IFRpbWVvdXQgKi8KQEAgLTMxLDEzICszMSwxMyBAQAogI2RlZmluZSBNRUlfSUFNVEhJRl9TVEFMTF9USU1FUiAgICAxMiAgLyogSFBTICovCiAjZGVmaW5lIE1FSV9JQU1USElGX1JFQURfVElNRVIgICAgIDEwICAvKiBIUFMgKi8KIAorI2RlZmluZSBNRUlfSEJNX1RJTUVPVVQgICAgICAgICAgICAxICAgLyogMSBzZWNvbmQgKi8KIAogLyoKICAqIE1FSSBWZXJzaW9uCiAgKi8KICNkZWZpbmUgSEJNX01JTk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBIQk1fTUFKT1JfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEhCTV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogMSBzZWNvbmQgKi8KIAogLyogSG9zdCBidXMgbWVzc2FnZSBjb21tYW5kIG9wY29kZSAqLwogI2RlZmluZSBNRUlfSEJNX0NNRF9PUF9NU0sgICAgICAgICAgICAgICAgICAweDdmCkBAIC04OSwxOSArODksMTkgQEAKICAqIENsaWVudCBDb25uZWN0IFN0YXR1cwogICogdXNlZCBieSBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2Uuc3RhdHVzCiAgKi8KLWVudW0gY2xpZW50X2Nvbm5lY3Rfc3RhdHVzX3R5cGVzIHsKLQlDQ1NfU1VDQ0VTUyA9IDB4MDAsCi0JQ0NTX05PVF9GT1VORCA9IDB4MDEsCi0JQ0NTX0FMUkVBRFlfU1RBUlRFRCA9IDB4MDIsCi0JQ0NTX09VVF9PRl9SRVNPVVJDRVMgPSAweDAzLAotCUNDU19NRVNTQUdFX1NNQUxMID0gMHgwNAorZW51bSBtZWlfY2xfY29ubmVjdF9zdGF0dXMgeworCU1FSV9DTF9DT05OX1NVQ0NFU1MgICAgICAgICAgPSAweDAwLAorCU1FSV9DTF9DT05OX05PVF9GT1VORCAgICAgICAgPSAweDAxLAorCU1FSV9DTF9DT05OX0FMUkVBRFlfU1RBUlRFRCAgPSAweDAyLAorCU1FSV9DTF9DT05OX09VVF9PRl9SRVNPVVJDRVMgPSAweDAzLAorCU1FSV9DTF9DT05OX01FU1NBR0VfU01BTEwgICAgPSAweDA0CiB9OwogCiAvKgogICogQ2xpZW50IERpc2Nvbm5lY3QgU3RhdHVzCiAgKi8KLWVudW0gY2xpZW50X2Rpc2Nvbm5lY3Rfc3RhdHVzX3R5cGVzIHsKLQlDRFNfU1VDQ0VTUyA9IDB4MDAKK2VudW0gIG1laV9jbF9kaXNjb25uZWN0X3N0YXR1cyB7CisJTUVJX0NMX0RJU0NPTk5fU1VDQ0VTUyA9IDB4MDAKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2luaXQuYyBiL2RyaXZlcnMvbWlzYy9tZWkvaW5pdC5jCmluZGV4IGNkZDMxYzIuLjQ0NjA5NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaW5pdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaW5pdC5jCkBAIC0xMTYsNyArMTE2LDYgQEAKIAkJbWVpX2NsX3VubGluaygmZGV2LT53ZF9jbCk7CiAJCW1laV9jbF91bmxpbmsoJmRldi0+aWFtdGhpZl9jbCk7CiAJCW1laV9hbXRoaWZfcmVzZXRfcGFyYW1zKGRldik7Ci0JCW1lbXNldCgmZGV2LT53cl9leHRfbXNnLCAwLCBzaXplb2YoZGV2LT53cl9leHRfbXNnKSk7CiAJfQogCiAKQEAgLTEyNiw3ICsxMjUsNiBAQAogCiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImh3X3Jlc2V0IGZhaWxlZCByZXQgPSAlZFxuIiwgcmV0KTsKLQkJZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX0RJU0FCTEVEOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTM5LDcgKzEzNyw2IEBACiAJcmV0ID0gbWVpX2h3X3N0YXJ0KGRldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImh3X3N0YXJ0IGZhaWxlZCByZXQgPSAlZFxuIiwgcmV0KTsKLQkJZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX0RJU0FCTEVEOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTQ5LDcgKzE0Niw3IEBACiAJcmV0ID0gbWVpX2hibV9zdGFydF9yZXEoZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiaGJtX3N0YXJ0IGZhaWxlZCByZXQgPSAlZFxuIiwgcmV0KTsKLQkJZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX0RJU0FCTEVEOworCQlkZXYtPmRldl9zdGF0ZSA9IE1FSV9ERVZfUkVTRVRUSU5HOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTY2LDYgKzE2Myw3IEBACiAgKi8KIGludCBtZWlfc3RhcnQoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0IGFuZCBzdG9wIGludGVycnVwdHMgKi8KQEAgLTE3NSwxMCArMTczLDE4IEBACiAKIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInJlc2V0IGluIHN0YXJ0IHRoZSBtZWkgZGV2aWNlLlxuIik7CiAKLQlkZXYtPmRldl9zdGF0ZSA9IE1FSV9ERVZfSU5JVElBTElaSU5HOwogCWRldi0+cmVzZXRfY291bnQgPSAwOwotCW1laV9yZXNldChkZXYpOworCWRvIHsKKwkJZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX0lOSVRJQUxJWklORzsKKwkJcmV0ID0gbWVpX3Jlc2V0KGRldik7CiAKKwkJaWYgKHJldCA9PSAtRU5PREVWIHx8IGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRElTQUJMRUQpIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAicmVzZXQgZmFpbGVkIHJldCA9ICVkIiwgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSB3aGlsZSAocmV0KTsKKworCS8qIHdlIGNhbm5vdCBzdGFydCB0aGUgZGV2aWNlIHcvbyBoYm0gc3RhcnQgbWVzc2FnZSBjb21wbGV0ZWQgKi8KIAlpZiAoZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9ESVNBQkxFRCkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInJlc2V0IGZhaWxlZCIpOwogCQlnb3RvIGVycjsKQEAgLTIzOCwyNyArMjQ0LDQwIEBACiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCi0JaWYgKGVyciB8fCBkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKQorCWlmIChlcnIgPT0gLUVOT0RFViB8fCBkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZGV2aWNlIGRpc2FibGVkID0gJWRcbiIsIGVycik7CiAJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHRyeSB0byBzdGFydCBhZ2FpbiAqLworCWlmIChlcnIpCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWVpX3Jlc3RhcnQpOwogCi0KIHN0YXRpYyB2b2lkIG1laV9yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtZWlfZGV2aWNlLCAgcmVzZXRfd29yayk7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCi0JbWVpX3Jlc2V0KGRldik7CisJcmV0ID0gbWVpX3Jlc2V0KGRldik7CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCi0JaWYgKGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRElTQUJMRUQpCi0JCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAicmVzZXQgZmFpbGVkIik7CisJaWYgKGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRElTQUJMRUQpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJkZXZpY2UgZGlzYWJsZWQgPSAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJldHJ5IHJlc2V0IGluIGNhc2Ugb2YgZmFpbHVyZSAqLworCWlmIChyZXQpCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CiB9CiAKIHZvaWQgbWVpX3N0b3Aoc3RydWN0IG1laV9kZXZpY2UgKmRldikKQEAgLTI2OSw2ICsyODgsOCBAQAogCiAJbWVpX25mY19ob3N0X2V4aXQoZGV2KTsKIAorCW1laV9jbF9idXNfcmVtb3ZlX2RldmljZXMoZGV2KTsKKwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJbWVpX3dkX3N0b3AoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMgYi9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jCmluZGV4IGYwZmJiNTEuLjI5YjVhZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMKKysrIGIvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYwpAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgogI2luY2x1ZGUgImhibS5oIgotI2luY2x1ZGUgImh3LW1lLmgiCiAjaW5jbHVkZSAiY2xpZW50LmgiCiAKIApAQCAtMTYxLDI5ICsxNjAsNjMgQEAKIH0KIAogLyoqCisgKiBtZWlfY2xfaXJxX2Rpc2Nvbm5lY3RfcnNwIC0gc2VuZCBkaXNjb25uZWN0aW9uIHJlc3BvbnNlIG1lc3NhZ2UKKyAqCisgKiBAY2w6IGNsaWVudAorICogQGNiOiBjYWxsYmFjayBibG9jay4KKyAqIEBjbXBsX2xpc3Q6IGNvbXBsZXRlIGxpc3QuCisgKgorICogcmV0dXJucyAwLCBPSzsgb3RoZXJ3aXNlLCBlcnJvci4KKyAqLworc3RhdGljIGludCBtZWlfY2xfaXJxX2Rpc2Nvbm5lY3RfcnNwKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJCQkgICAgIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKKwl1MzIgbXNnX3Nsb3RzOworCWludCBzbG90czsKKwlpbnQgcmV0OworCisJc2xvdHMgPSBtZWlfaGJ1Zl9lbXB0eV9zbG90cyhkZXYpOworCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlKSk7CisKKwlpZiAoc2xvdHMgPCBtc2dfc2xvdHMpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlyZXQgPSBtZWlfaGJtX2NsX2Rpc2Nvbm5lY3RfcnNwKGRldiwgY2wpOworCisJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOworCWNsLT5zdGF0dXMgPSAwOworCWxpc3RfZGVsKCZjYi0+bGlzdCk7CisJbWVpX2lvX2NiX2ZyZWUoY2IpOworCisJcmV0dXJuIHJldDsKK30KKworCisKKy8qKgogICogbWVpX2NsX2lycV9jbG9zZSAtIHByb2Nlc3NlcyBjbG9zZSByZWxhdGVkIG9wZXJhdGlvbiBmcm9tCiAgKglpbnRlcnJ1cHQgdGhyZWFkIGNvbnRleHQgLSBzZW5kIGRpc2Nvbm5lY3QgcmVxdWVzdAogICoKICAqIEBjbDogY2xpZW50CiAgKiBAY2I6IGNhbGxiYWNrIGJsb2NrLgotICogQHNsb3RzOiBmcmVlIHNsb3RzLgogICogQGNtcGxfbGlzdDogY29tcGxldGUgbGlzdC4KICAqCiAgKiByZXR1cm5zIDAsIE9LOyBvdGhlcndpc2UsIGVycm9yLgogICovCiBzdGF0aWMgaW50IG1laV9jbF9pcnFfY2xvc2Uoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQorCQkJICAgIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKKwl1MzIgbXNnX3Nsb3RzOworCWludCBzbG90czsKIAotCXUzMiBtc2dfc2xvdHMgPQotCQltZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0KSk7CisJbXNnX3Nsb3RzID0gbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCkpOworCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKIAotCWlmICgqc2xvdHMgPCBtc2dfc2xvdHMpCisJaWYgKHNsb3RzIDwgbXNnX3Nsb3RzKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCi0JKnNsb3RzIC09IG1zZ19zbG90czsKLQogCWlmIChtZWlfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVxKGRldiwgY2wpKSB7CiAJCWNsLT5zdGF0dXMgPSAwOwogCQljYi0+YnVmX2lkeCA9IDA7CkBAIC0yMDcsMjcgKzI0MCwyMyBAQAogICoKICAqIEBjbDogY2xpZW50CiAgKiBAY2I6IGNhbGxiYWNrIGJsb2NrLgotICogQHNsb3RzOiBmcmVlIHNsb3RzLgogICogQGNtcGxfbGlzdDogY29tcGxldGUgbGlzdC4KICAqCiAgKiByZXR1cm5zIDAsIE9LOyBvdGhlcndpc2UsIGVycm9yLgogICovCiBzdGF0aWMgaW50IG1laV9jbF9pcnFfcmVhZChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkgICBzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCisJCQkgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7Ci0JdTMyIG1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCkpOwotCisJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CiAJaW50IHJldDsKIAorCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCkpOworCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKIAotCWlmICgqc2xvdHMgPCBtc2dfc2xvdHMpIHsKLQkJLyogcmV0dXJuIHRoZSBjYW5jZWwgcm91dGluZSAqLwotCQlsaXN0X2RlbCgmY2ItPmxpc3QpOworCWlmIChzbG90cyA8IG1zZ19zbG90cykKIAkJcmV0dXJuIC1FTVNHU0laRTsKLQl9Ci0KLQkqc2xvdHMgLT0gbXNnX3Nsb3RzOwogCiAJcmV0ID0gbWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVxKGRldiwgY2wpOwogCWlmIChyZXQpIHsKQEAgLTI0NCwzMiArMjczLDMwIEBACiAKIAogLyoqCi0gKiBtZWlfY2xfaXJxX2lvY3RsIC0gcHJvY2Vzc2VzIGNsaWVudCBpb2N0bCByZWxhdGVkIG9wZXJhdGlvbiBmcm9tIHRoZQotICoJaW50ZXJydXB0IHRocmVhZCBjb250ZXh0IC0gICBzZW5kIGNvbm5lY3Rpb24gcmVxdWVzdAorICogbWVpX2NsX2lycV9jb25uZWN0IC0gc2VuZCBjb25uZWN0IHJlcXVlc3QgaW4gaXJxX3RocmVhZCBjb250ZXh0CiAgKgogICogQGNsOiBjbGllbnQKICAqIEBjYjogY2FsbGJhY2sgYmxvY2suCi0gKiBAc2xvdHM6IGZyZWUgc2xvdHMuCiAgKiBAY21wbF9saXN0OiBjb21wbGV0ZSBsaXN0LgogICoKICAqIHJldHVybnMgMCwgT0s7IG90aGVyd2lzZSwgZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgbWVpX2NsX2lycV9pb2N0bChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkgICBzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCitzdGF0aWMgaW50IG1laV9jbF9pcnFfY29ubmVjdChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCisJCQkgICAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CisJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CiAJaW50IHJldDsKIAotCXUzMiBtc2dfc2xvdHMgPQotCQltZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0KSk7CisJbXNnX3Nsb3RzID0gbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCkpOworCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKIAotCWlmICgqc2xvdHMgPCBtc2dfc2xvdHMpIHsKLQkJLyogcmV0dXJuIHRoZSBjYW5jZWwgcm91dGluZSAqLwotCQlsaXN0X2RlbCgmY2ItPmxpc3QpOworCWlmIChtZWlfY2xfaXNfb3RoZXJfY29ubmVjdGluZyhjbCkpCisJCXJldHVybiAwOworCisJaWYgKHNsb3RzIDwgbXNnX3Nsb3RzKQogCQlyZXR1cm4gLUVNU0dTSVpFOwotCX0KLQotCSpzbG90cyAtPSAgbXNnX3Nsb3RzOwogCiAJY2wtPnN0YXRlID0gTUVJX0ZJTEVfQ09OTkVDVElORzsKIApAQCAtMzIzLDcgKzM1MCw3IEBACiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAibGVzcyBkYXRhIGF2YWlsYWJsZSB0aGFuIGxlbmd0aD0lMDh4LlxuIiwKIAkJCQkqc2xvdHMpOwogCQkvKiB3ZSBjYW4ndCByZWFkIHRoZSBtZXNzYWdlICovCi0JCXJldCA9IC1FUkFOR0U7CisJCXJldCA9IC1FTk9EQVRBOwogCQlnb3RvIGVuZDsKIAl9CiAKQEAgLTQwOSwxMCArNDM2LDEwIEBACiAJczMyIHNsb3RzOwogCWludCByZXQ7CiAKLQlpZiAoIW1laV9oYnVmX2lzX3JlYWR5KGRldikpIHsKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJob3N0IGJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKworCWlmICghbWVpX2hidWZfYWNxdWlyZShkZXYpKQogCQlyZXR1cm4gMDsKLQl9CisKIAlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAJaWYgKHNsb3RzIDw9IDApCiAJCXJldHVybiAtRU1TR1NJWkU7CkBAIC00NDcsMjkgKzQ3NCwxNiBAQAogCiAJaWYgKGRldi0+d2Rfc3RhdGUgPT0gTUVJX1dEX1NUT1BQSU5HKSB7CiAJCWRldi0+d2Rfc3RhdGUgPSBNRUlfV0RfSURMRTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndhaXRfc3RvcF93ZCk7CisJCXdha2VfdXAoJmRldi0+d2FpdF9zdG9wX3dkKTsKIAl9CiAKLQlpZiAoZGV2LT53cl9leHRfbXNnLmhkci5sZW5ndGgpIHsKLQkJbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmZGV2LT53cl9leHRfbXNnLmhkciwKLQkJCQlkZXYtPndyX2V4dF9tc2cuZGF0YSk7Ci0JCXNsb3RzIC09IG1laV9kYXRhMnNsb3RzKGRldi0+d3JfZXh0X21zZy5oZHIubGVuZ3RoKTsKLQkJZGV2LT53cl9leHRfbXNnLmhkci5sZW5ndGggPSAwOwotCX0KLQlpZiAoZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9FTkFCTEVEKSB7CisJaWYgKG1laV9jbF9pc19jb25uZWN0ZWQoJmRldi0+d2RfY2wpKSB7CiAJCWlmIChkZXYtPndkX3BlbmRpbmcgJiYKIAkJICAgIG1laV9jbF9mbG93X2N0cmxfY3JlZHMoJmRldi0+d2RfY2wpID4gMCkgewotCQkJaWYgKG1laV93ZF9zZW5kKGRldikpCi0JCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZCBzZW5kIGZhaWxlZC5cbiIpOwotCQkJZWxzZSBpZiAobWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoJmRldi0+d2RfY2wpKQotCQkJCXJldHVybiAtRU5PREVWOwotCisJCQlyZXQgPSBtZWlfd2Rfc2VuZChkZXYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCQkJZGV2LT53ZF9wZW5kaW5nID0gZmFsc2U7Ci0KLQkJCWlmIChkZXYtPndkX3N0YXRlID09IE1FSV9XRF9SVU5OSU5HKQotCQkJCXNsb3RzIC09IG1laV9kYXRhMnNsb3RzKE1FSV9XRF9TVEFSVF9NU0dfU0laRSk7Ci0JCQllbHNlCi0JCQkJc2xvdHMgLT0gbWVpX2RhdGEyc2xvdHMoTUVJX1dEX1NUT1BfTVNHX1NJWkUpOwogCQl9CiAJfQogCkBAIC00ODQsMjggKzQ5OCwzMSBAQAogCQlzd2l0Y2ggKGNiLT5mb3BfdHlwZSkgewogCQljYXNlIE1FSV9GT1BfQ0xPU0U6CiAJCQkvKiBzZW5kIGRpc2Nvbm5lY3QgbWVzc2FnZSAqLwotCQkJcmV0ID0gbWVpX2NsX2lycV9jbG9zZShjbCwgY2IsICZzbG90cywgY21wbF9saXN0KTsKKwkJCXJldCA9IG1laV9jbF9pcnFfY2xvc2UoY2wsIGNiLCBjbXBsX2xpc3QpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQlicmVhazsKIAkJY2FzZSBNRUlfRk9QX1JFQUQ6CiAJCQkvKiBzZW5kIGZsb3cgY29udHJvbCBtZXNzYWdlICovCi0JCQlyZXQgPSBtZWlfY2xfaXJxX3JlYWQoY2wsIGNiLCAmc2xvdHMsIGNtcGxfbGlzdCk7CisJCQlyZXQgPSBtZWlfY2xfaXJxX3JlYWQoY2wsIGNiLCBjbXBsX2xpc3QpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQlicmVhazsKLQkJY2FzZSBNRUlfRk9QX0lPQ1RMOgorCQljYXNlIE1FSV9GT1BfQ09OTkVDVDoKIAkJCS8qIGNvbm5lY3QgbWVzc2FnZSAqLwotCQkJaWYgKG1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSkKLQkJCQljb250aW51ZTsKLQkJCXJldCA9IG1laV9jbF9pcnFfaW9jdGwoY2wsIGNiLCAmc2xvdHMsIGNtcGxfbGlzdCk7CisJCQlyZXQgPSBtZWlfY2xfaXJxX2Nvbm5lY3QoY2wsIGNiLCBjbXBsX2xpc3QpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQlicmVhazsKLQorCQljYXNlIE1FSV9GT1BfRElTQ09OTkVDVF9SU1A6CisJCQkvKiBzZW5kIGRpc2Nvbm5lY3QgcmVzcCAqLworCQkJcmV0ID0gbWVpX2NsX2lycV9kaXNjb25uZWN0X3JzcChjbCwgY2IsIGNtcGxfbGlzdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CkBAIC01MTgsMTEgKzUzNSw5IEBACiAJCWlmIChjbCA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCWlmIChjbCA9PSAmZGV2LT5pYW10aGlmX2NsKQotCQkJcmV0ID0gbWVpX2FtdGhpZl9pcnFfd3JpdGVfY29tcGxldGUoY2wsIGNiLAotCQkJCQkJJnNsb3RzLCBjbXBsX2xpc3QpOworCQkJcmV0ID0gbWVpX2FtdGhpZl9pcnFfd3JpdGUoY2wsIGNiLCBjbXBsX2xpc3QpOwogCQllbHNlCi0JCQlyZXQgPSBtZWlfY2xfaXJxX3dyaXRlX2NvbXBsZXRlKGNsLCBjYiwKLQkJCQkJCSZzbG90cywgY21wbF9saXN0KTsKKwkJCXJldCA9IG1laV9jbF9pcnFfd3JpdGUoY2wsIGNiLCBjbXBsX2xpc3QpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC01NDEsOCArNTU2LDcgQEAKIHZvaWQgbWVpX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0Jc3RydWN0IG1laV9jbCAqY2xfcG9zID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsICpjbF9uZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAlzdHJ1Y3QgbWVpX2NsX2NiICAqY2JfcG9zID0gTlVMTDsKIAlzdHJ1Y3QgbWVpX2NsX2NiICAqY2JfbmV4dCA9IE5VTEw7CiAKQEAgLTU3MCw5ICs1ODQsOSBAQAogCQlnb3RvIG91dDsKIAogCS8qKiogY29ubmVjdC9kaXNjb25uZWN0IHRpbWVvdXRzICoqKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2xfcG9zLCBjbF9uZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKLQkJaWYgKGNsX3Bvcy0+dGltZXJfY291bnQpIHsKLQkJCWlmICgtLWNsX3Bvcy0+dGltZXJfY291bnQgPT0gMCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2wsICZkZXYtPmZpbGVfbGlzdCwgbGluaykgeworCQlpZiAoY2wtPnRpbWVyX2NvdW50KSB7CisJCQlpZiAoLS1jbC0+dGltZXJfY291bnQgPT0gMCkgewogCQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAidGltZXI6IGNvbm5lY3QvZGlzY29ubmVjdCB0aW1lb3V0LlxuIik7CiAJCQkJbWVpX3Jlc2V0KGRldik7CiAJCQkJZ290byBvdXQ7CkBAIC01ODAsNiArNTk0LDkgQEAKIAkJfQogCX0KIAorCWlmICghbWVpX2NsX2lzX2Nvbm5lY3RlZCgmZGV2LT5pYW10aGlmX2NsKSkKKwkJZ290byBvdXQ7CisKIAlpZiAoZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyKSB7CiAJCWlmICgtLWRldi0+aWFtdGhpZl9zdGFsbF90aW1lciA9PSAwKSB7CiAJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInRpbWVyOiBhbXRoaWYgIGhhbmdlZC5cbiIpOwpAQCAtNjE5LDEwICs2MzYsMTAgQEAKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYl9wb3MsIGNiX25leHQsCiAJCQkJJmRldi0+YW10aGlmX3JkX2NvbXBsZXRlX2xpc3QubGlzdCwgbGlzdCkgewogCi0JCQkJY2xfcG9zID0gY2JfcG9zLT5maWxlX29iamVjdC0+cHJpdmF0ZV9kYXRhOworCQkJCWNsID0gY2JfcG9zLT5maWxlX29iamVjdC0+cHJpdmF0ZV9kYXRhOwogCiAJCQkJLyogRmluZGluZyB0aGUgQU1USEkgZW50cnkuICovCi0JCQkJaWYgKGNsX3BvcyA9PSAmZGV2LT5pYW10aGlmX2NsKQorCQkJCWlmIChjbCA9PSAmZGV2LT5pYW10aGlmX2NsKQogCQkJCQlsaXN0X2RlbCgmY2JfcG9zLT5saXN0KTsKIAkJCX0KIAkJCW1laV9pb19jYl9mcmVlKGRldi0+aWFtdGhpZl9jdXJyZW50X2NiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jIGIvZHJpdmVycy9taXNjL21laS9tYWluLmMKaW5kZXggNTQyNGY4Zi4uYjM1NTk0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9tYWluLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9tYWluLmMKQEAgLTEzLDkgKzEzLDYgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQwLDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tZWkuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCiAvKioKQEAgLTEyOSwxNyArMTI1LDExIEBACiAJfQogCWlmIChjbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVEVEKSB7CiAJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RJTkc7Ci0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAotCQkJImRpc2Nvbm5lY3RpbmcgY2xpZW50IGhvc3QgY2xpZW50ID0gJWQsICIKLQkJICAgICJNRSBjbGllbnQgPSAlZFxuIiwKLQkJICAgIGNsLT5ob3N0X2NsaWVudF9pZCwKLQkJICAgIGNsLT5tZV9jbGllbnRfaWQpOworCQljbF9kYmcoZGV2LCBjbCwgImRpc2Nvbm5lY3RpbmdcbiIpOwogCQlyZXRzID0gbWVpX2NsX2Rpc2Nvbm5lY3QoY2wpOwogCX0KIAltZWlfY2xfZmx1c2hfcXVldWVzKGNsKTsKLQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInJlbW92ZSBjbGllbnQgaG9zdCBjbGllbnQgPSAlZCwgTUUgY2xpZW50ID0gJWRcbiIsCi0JICAgIGNsLT5ob3N0X2NsaWVudF9pZCwKLQkgICAgY2wtPm1lX2NsaWVudF9pZCk7CisJY2xfZGJnKGRldiwgY2wsICJyZW1vdmluZ1xuIik7CiAKIAltZWlfY2xfdW5saW5rKGNsKTsKIApAQCAtMjg0LDYgKzI3NCw3IEBACiAJbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBsZW5ndGgsIGNiLT5idWZfaWR4IC0gKm9mZnNldCk7CiAKIAlpZiAoY29weV90b191c2VyKHVidWYsIGNiLT5yZXNwb25zZV9idWZmZXIuZGF0YSArICpvZmZzZXQsIGxlbmd0aCkpIHsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXJsYW5kXG4iKTsKIAkJcmV0cyA9IC1FRkFVTFQ7CiAJCWdvdG8gZnJlZTsKIAl9CkBAIC0zNDAsNyArMzMxLDcgQEAKIAogCWlkID0gbWVpX21lX2NsX2J5X2lkKGRldiwgY2wtPm1lX2NsaWVudF9pZCk7CiAJaWYgKGlkIDwgMCkgewotCQlyZXRzID0gLUVOT0RFVjsKKwkJcmV0cyA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNDA0LDcgKzM5NSw3IEBACiAKIAlyZXRzID0gY29weV9mcm9tX3VzZXIod3JpdGVfY2ItPnJlcXVlc3RfYnVmZmVyLmRhdGEsIHVidWYsIGxlbmd0aCk7CiAJaWYgKHJldHMpIHsKLQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIGZyb20gdXNlcmxhbmRcbiIpOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZhaWxlZCB0byBjb3B5IGRhdGEgZnJvbSB1c2VybGFuZFxuIik7CiAJCXJldHMgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKIAl9CkBAIC00NzEsNyArNDYyLDcgQEAKIAlpZiAoaSA8IDAgfHwgZGV2LT5tZV9jbGllbnRzW2ldLnByb3BzLmZpeGVkX2FkZHJlc3MpIHsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJDYW5ub3QgY29ubmVjdCB0byBGVyBDbGllbnQgVVVJRCA9ICVwVWxcbiIsCiAJCQkJJmRhdGEtPmluX2NsaWVudF91dWlkKTsKLQkJcmV0cyA9IC1FTk9ERVY7CisJCXJldHMgPSAtRU5PVFRZOwogCQlnb3RvIGVuZDsKIAl9CiAKQEAgLTU2OSw3ICs1NjAsNyBAQAogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiY29weSBjb25uZWN0IGRhdGEgZnJvbSB1c2VyXG4iKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoY29ubmVjdF9kYXRhLCAoY2hhciBfX3VzZXIgKilkYXRhLAogCQkJCXNpemVvZihzdHJ1Y3QgbWVpX2Nvbm5lY3RfY2xpZW50X2RhdGEpKSkgewotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImZhaWxlZCB0byBjb3B5IGRhdGEgZnJvbSB1c2VybGFuZFxuIik7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSBmcm9tIHVzZXJsYW5kXG4iKTsKIAkJcmV0cyA9IC1FRkFVTFQ7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oIGIvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmgKaW5kZXggZjdkZTk1Yi4uOTRhNTE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmgKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tZWlfY2xfYnVzLmg+CiAKICNpbmNsdWRlICJody5oIgotI2luY2x1ZGUgImh3LW1lLXJlZ3MuaCIKICNpbmNsdWRlICJoYm0uaCIKIAogLyoKQEAgLTEzMCwxNiArMTI5LDE4IEBACiAKIC8qKgogICogZW51bSBtZWlfY2JfZmlsZV9vcHMgIC0gZmlsZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsYmFjawotICogQE1FSV9GT1BfUkVBRCAgIC0gcmVhZAotICogQE1FSV9GT1BfV1JJVEUgIC0gd3JpdGUKLSAqIEBNRUlfRk9QX0lPQ1RMICAtIGlvY3RsCi0gKiBATUVJX0ZPUF9PUEVOICAgLSBvcGVuCi0gKiBATUVJX0ZPUF9DTE9TRSAgLSBjbG9zZQorICogQE1FSV9GT1BfUkVBRCAgICAgIC0gcmVhZAorICogQE1FSV9GT1BfV1JJVEUgICAgIC0gd3JpdGUKKyAqIEBNRUlfRk9QX0NPTk5FQ1QgICAtIGNvbm5lY3QKKyAqIEBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQIC0gZGlzY29ubmVjdCByZXNwb25zZQorICogQE1FSV9GT1BfT1BFTiAgICAgIC0gb3BlbgorICogQE1FSV9GT1BfQ0xPU0UgICAgIC0gY2xvc2UKICAqLwogZW51bSBtZWlfY2JfZmlsZV9vcHMgewogCU1FSV9GT1BfUkVBRCA9IDAsCiAJTUVJX0ZPUF9XUklURSwKLQlNRUlfRk9QX0lPQ1RMLAorCU1FSV9GT1BfQ09OTkVDVCwKKwlNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQLAogCU1FSV9GT1BfT1BFTiwKIAlNRUlfRk9QX0NMT1NFCiB9OwpAQCAtMjM2LDIwICsyMzcsMjAgQEAKICAqLwogc3RydWN0IG1laV9od19vcHMgewogCi0JYm9vbCAoKmhvc3RfaXNfcmVhZHkpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwlib29sICgqaG9zdF9pc19yZWFkeSkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKLQlib29sICgqaHdfaXNfcmVhZHkpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKLQlpbnQgKCpod19yZXNldCkgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKLQlpbnQgICgqaHdfc3RhcnQpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKLQl2b2lkICgqaHdfY29uZmlnKSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJYm9vbCAoKmh3X2lzX3JlYWR5KShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwlpbnQgKCpod19yZXNldCkoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOworCWludCAoKmh3X3N0YXJ0KShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaHdfY29uZmlnKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAotCXZvaWQgKCppbnRyX2NsZWFyKSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmludHJfZW5hYmxlKSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmludHJfZGlzYWJsZSkgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworCXZvaWQgKCppbnRyX2NsZWFyKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaW50cl9lbmFibGUpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworCXZvaWQgKCppbnRyX2Rpc2FibGUpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogCi0JaW50ICgqaGJ1Zl9mcmVlX3Nsb3RzKSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0JYm9vbCAoKmhidWZfaXNfcmVhZHkpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKLQlzaXplX3QgKCpoYnVmX21heF9sZW4pIChjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwlpbnQgKCpoYnVmX2ZyZWVfc2xvdHMpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworCWJvb2wgKCpoYnVmX2lzX3JlYWR5KShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwlzaXplX3QgKCpoYnVmX21heF9sZW4pKGNvbnN0IHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogCiAJaW50ICgqd3JpdGUpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCiAJCSAgICAgc3RydWN0IG1laV9tc2dfaGRyICpoZHIsCkBAIC0yNTgsNyArMjU5LDcgQEAKIAlpbnQgKCpyZGJ1Zl9mdWxsX3Nsb3RzKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAogCXUzMiAoKnJlYWRfaGRyKShjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKLQlpbnQgKCpyZWFkKSAoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOwogfTsKIApAQCAtMjk0LDYgKzI5NSw3IEBACiBpbnQgX19tZWlfY2xfc2VuZChzdHJ1Y3QgbWVpX2NsICpjbCwgdTggKmJ1Ziwgc2l6ZV90IGxlbmd0aCk7CiBpbnQgX19tZWlfY2xfcmVjdihzdHJ1Y3QgbWVpX2NsICpjbCwgdTggKmJ1Ziwgc2l6ZV90IGxlbmd0aCk7CiB2b2lkIG1laV9jbF9idXNfcnhfZXZlbnQoc3RydWN0IG1laV9jbCAqY2wpOwordm9pZCBtZWlfY2xfYnVzX3JlbW92ZV9kZXZpY2VzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogaW50IG1laV9jbF9idXNfaW5pdCh2b2lkKTsKIHZvaWQgbWVpX2NsX2J1c19leGl0KHZvaWQpOwogCkBAIC0zMzksNyArMzQxLDYgQEAKICAqIEBoYnVmX2RlcHRoIC0gZGVwdGggb2YgaGFyZHdhcmUgaG9zdC93cml0ZSBidWZmZXIgaXMgc2xvdHMKICAqIEBoYnVmX2lzX3JlYWR5IC0gcXVlcnkgaWYgdGhlIGhvc3QgaG9zdC93cml0ZSBidWZmZXIgaXMgcmVhZHkKICAqIEB3cl9tc2cgLSB0aGUgYnVmZmVyIGZvciBoYm0gY29udHJvbCBtZXNzYWdlcwotICogQHdyX2V4dF9tc2cgLSB0aGUgYnVmZmVyIGZvciBoYm0gY29udHJvbCByZXNwb25zZXMgKHNldCBpbiByZWFkIGN5Y2xlKQogICovCiBzdHJ1Y3QgbWVpX2RldmljZSB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8qIHBvaW50ZXIgdG8gcGNpIGRldmljZSBzdHJ1Y3QgKi8KQEAgLTM5NCwxMSArMzk1LDYgQEAKIAkJdW5zaWduZWQgY2hhciBkYXRhWzEyOF07CiAJfSB3cl9tc2c7CiAKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgbWVpX21zZ19oZHIgaGRyOwotCQl1bnNpZ25lZCBjaGFyIGRhdGFbNF07CS8qIEFsbCBIQk0gbWVzc2FnZXMgYXJlIDQgYnl0ZXMgKi8KLQl9IHdyX2V4dF9tc2c7CQkvKiBmb3IgY29udHJvbCByZXNwb25zZXMgKi8KLQogCXN0cnVjdCBoYm1fdmVyc2lvbiB2ZXJzaW9uOwogCiAJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsaWVudHM7IC8qIE5vdGU6IG1lbW9yeSBoYXMgdG8gYmUgYWxsb2NhdGVkICovCkBAIC01MTgsOCArNTE0LDggQEAKIAogdm9pZCBtZWlfYW10aGlmX3J1bl9uZXh0X2NtZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAotaW50IG1laV9hbXRoaWZfaXJxX3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKLQkJCQkgIHMzMiAqc2xvdHMsIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCk7CitpbnQgbWVpX2FtdGhpZl9pcnFfd3JpdGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkJc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KTsKIAogdm9pZCBtZWlfYW10aGlmX2NvbXBsZXRlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBtZWlfY2xfY2IgKmNiKTsKIGludCBtZWlfYW10aGlmX2lycV9yZWFkX21zZyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LApAQCAtNTQ2LDcgKzU0Miw3IEBACiAgKiAgIG9uY2Ugd2UgZ290IGNvbm5lY3Rpb24gdG8gdGhlIFdEIENsaWVudAogICogQGRldiAtIG1laSBkZXZpY2UKICAqLwotdm9pZCBtZWlfd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CitpbnQgbWVpX3dhdGNoZG9nX3JlZ2lzdGVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogLyoKICAqIG1laV93YXRjaGRvZ191bnJlZ2lzdGVyICAtIFVucmVnaXN0ZXJpbmcgd2F0Y2hkb2cgaW50ZXJmYWNlCiAgKiBAZGV2IC0gbWVpIGRldmljZQpAQCAtNjMzLDYgKzYyOSw4IEBACiAJcmV0dXJuIGRldi0+b3BzLT5yZGJ1Zl9mdWxsX3Nsb3RzKGRldik7CiB9CiAKK2Jvb2wgbWVpX2hidWZfYWNxdWlyZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0ZTKQogaW50IG1laV9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKTsKIHZvaWQgbWVpX2RiZ2ZzX2RlcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL25mYy5jIGIvZHJpdmVycy9taXNjL21laS9uZmMuYwppbmRleCBhNTgzMjBjLi4zMDk1ZmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL25mYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbmZjLmMKQEAgLTM2NCw3ICszNjQsNyBAQAogCWlmICghd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQobmRldi0+c2VuZF93cSwKIAkJCQluZGV2LT5yZWN2X3JlcV9pZCA9PSBuZGV2LT5yZXFfaWQsIEhaKSkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIk5GQyBNRUkgY29tbWFuZCB0aW1lb3V0XG4iKTsKLQkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZXJyID0gLUVUSU1FOwogCX0gZWxzZSB7CiAJCW5kZXYtPnJlcV9pZCsrOwogCX0KQEAgLTUwMiw3ICs1MDIsNyBAQAogCWkgPSBtZWlfbWVfY2xfYnlfdXVpZChkZXYsICZtZWlfbmZjX2luZm9fZ3VpZCk7CiAJaWYgKGkgPCAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPnBkZXYtPmRldiwgIm5mYzogZmFpbGVkIHRvIGZpbmQgdGhlIGNsaWVudFxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtNTIwLDcgKzUyMCw3IEBACiAJaSA9IG1laV9tZV9jbF9ieV91dWlkKGRldiwgJm1laV9uZmNfZ3VpZCk7CiAJaWYgKGkgPCAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPnBkZXYtPmRldiwgIm5mYzogZmFpbGVkIHRvIGZpbmQgdGhlIGNsaWVudFxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtNTUyLDEzICs1NTIsNyBAQAogdm9pZCBtZWlfbmZjX2hvc3RfZXhpdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtZWlfbmZjX2RldiAqbmRldiA9ICZuZmNfZGV2OwotCiAJY2FuY2VsX3dvcmtfc3luYygmbmRldi0+aW5pdF93b3JrKTsKLQotCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwotCWlmIChuZGV2LT5jbCAmJiBuZGV2LT5jbC0+ZGV2aWNlKQotCQltZWlfY2xfcmVtb3ZlX2RldmljZShuZGV2LT5jbC0+ZGV2aWNlKTsKLQotCW1laV9uZmNfZnJlZShuZGV2KTsKLQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCmluZGV4IGRkYWRkMDguLjFjOGZkM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYwpAQCAtMTMsOSArMTMsNiBAQAogICogbW9yZSBkZXRhaWxzLgogICoKICAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjcsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQwLDExICszNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21laS5oPgogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgotI2luY2x1ZGUgImh3LW1lLmgiCiAjaW5jbHVkZSAiY2xpZW50LmgiCisjaW5jbHVkZSAiaHctbWUtcmVncy5oIgorI2luY2x1ZGUgImh3LW1lLmgiCiAKIC8qIG1laV9wY2lfdGJsIC0gUENJIERldmljZSBJRCBUYWJsZSAqLwotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG1laV9tZV9wY2lfdGJsKSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtZWlfbWVfcGNpX3RibFtdID0gewogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIE1FSV9ERVZfSURfODI5NDZHWil9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIE1FSV9ERVZfSURfODJHMzUpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRUlfREVWX0lEXzgyUTk2NSl9LApAQCAtMjcwLDcgKzI2Nyw3IEBACiAKIAogfQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBtZWlfbWVfcGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOwpAQCAtMzMwLDExICszMjcsMTIgQEAKIAogCXJldHVybiAwOwogfQorCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWVpX21lX3BtX29wcywgbWVpX21lX3BjaV9zdXNwZW5kLCBtZWlfbWVfcGNpX3Jlc3VtZSk7CiAjZGVmaW5lIE1FSV9NRV9QTV9PUFMJKCZtZWlfbWVfcG1fb3BzKQogI2Vsc2UKICNkZWZpbmUgTUVJX01FX1BNX09QUwlOVUxMCi0jZW5kaWYgLyogQ09ORklHX1BNICovCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAvKgogICogIFBDSSBkcml2ZXIgc3RydWN0dXJlCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jIGIvZHJpdmVycy9taXNjL21laS9wY2ktdHhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzYWRiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICoKKyAqIEludGVsIE1hbmFnZW1lbnQgRW5naW5lIEludGVyZmFjZSAoSW50ZWwgTUVJKSBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91dWlkLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbWVpLmg+CisKKworI2luY2x1ZGUgIm1laV9kZXYuaCIKKyNpbmNsdWRlICJody10eGUuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1laV90eGVfcGNpX3RibFtdID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MEYxOCl9LCAvKiBCYXl0cmFpbCAqLworCXswLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1laV90eGVfcGNpX3RibCk7CisKKworc3RhdGljIHZvaWQgbWVpX3R4ZV9wY2lfaW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG1laV90eGVfaHcgKmh3KQoreworCWludCBpOworCWZvciAoaSA9IFNFQ19CQVI7IGkgPCBOVU1fT0ZfTUVNX0JBUlM7IGkrKykgeworCQlpZiAoaHctPm1lbV9hZGRyW2ldKSB7CisJCQlwY2lfaW91bm1hcChwZGV2LCBody0+bWVtX2FkZHJbaV0pOworCQkJaHctPm1lbV9hZGRyW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKy8qKgorICogbWVpX3Byb2JlIC0gRGV2aWNlIEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqCisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBlbnQ6IGVudHJ5IGluIG1laV90eGVfcGNpX3RibAorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IG1laV90eGVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHc7CisJaW50IGVycjsKKwlpbnQgaTsKKworCS8qIGVuYWJsZSBwY2kgZGV2ICovCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHBjaSBkZXZpY2UuXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCS8qIHNldCBQQ0kgaG9zdCBtYXN0ZXJpbmcgICovCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJLyogcGNpIHJlcXVlc3QgcmVnaW9ucyBmb3IgbWVpIGRyaXZlciAqLworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgS0JVSUxEX01PRE5BTUUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwY2kgcmVnaW9ucy5cbiIpOworCQlnb3RvIGRpc2FibGVfZGV2aWNlOworCX0KKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7CisJaWYgKGVycikgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlnb3RvIHJlbGVhc2VfcmVnaW9uczsKKwkJfQorCX0KKworCS8qIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIG1laSBkZXYgc3RydWN0dXJlICovCisJZGV2ID0gbWVpX3R4ZV9kZXZfaW5pdChwZGV2KTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uczsKKwl9CisJaHcgPSB0b190eGVfaHcoZGV2KTsKKworCS8qIG1hcHBpbmcgIElPIGRldmljZSBtZW1vcnkgKi8KKwlmb3IgKGkgPSBTRUNfQkFSOyBpIDwgTlVNX09GX01FTV9CQVJTOyBpKyspIHsKKwkJaHctPm1lbV9hZGRyW2ldID0gcGNpX2lvbWFwKHBkZXYsIGksIDApOworCQlpZiAoIWh3LT5tZW1fYWRkcltpXSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWFwcGluZyBJL08gZGV2aWNlIG1lbW9yeSBmYWlsdXJlLlxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX2RldmljZTsKKwkJfQorCX0KKworCisJcGNpX2VuYWJsZV9tc2kocGRldik7CisKKwkvKiBjbGVhciBzcHVyaW91cyBpbnRlcnJ1cHRzICovCisJbWVpX2NsZWFyX2ludGVycnVwdHMoZGV2KTsKKworCS8qIHJlcXVlc3QgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgICovCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQocGRldikpCisJCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBkZXYtPmlycSwKKwkJCU5VTEwsCisJCQltZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlciwKKwkJCUlSUUZfT05FU0hPVCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJZWxzZQorCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCisJCQltZWlfdHhlX2lycV9xdWlja19oYW5kbGVyLAorCQkJbWVpX3R4ZV9pcnFfdGhyZWFkX2hhbmRsZXIsCisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtZWk6IHJlcXVlc3RfdGhyZWFkZWRfaXJxIGZhaWx1cmUuIGlycSA9ICVkXG4iLAorCQkJcGRldi0+aXJxKTsKKwkJZ290byBmcmVlX2RldmljZTsKKwl9CisKKwlpZiAobWVpX3N0YXJ0KGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW5pdCBodyBmYWlsdXJlLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gcmVsZWFzZV9pcnE7CisJfQorCisJZXJyID0gbWVpX3JlZ2lzdGVyKGRldik7CisJaWYgKGVycikKKwkJZ290byByZWxlYXNlX2lycTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIDA7CisKK3JlbGVhc2VfaXJxOgorCisJbWVpX2NhbmNlbF93b3JrKGRldik7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwltZWlfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCitmcmVlX2RldmljZToKKwltZWlfdHhlX3BjaV9pb3VubWFwKHBkZXYsIGh3KTsKKworCWtmcmVlKGRldik7CityZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2VuZDoKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG1laV9yZW1vdmUgLSBEZXZpY2UgUmVtb3ZhbCBSb3V0aW5lCisgKgorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogbWVpX3JlbW92ZSBpcyBjYWxsZWQgYnkgdGhlIFBDSSBzdWJzeXN0ZW0gdG8gYWxlcnQgdGhlIGRyaXZlcgorICogdGhhdCBpdCBzaG91bGQgcmVsZWFzZSBhIFBDSSBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJc3RydWN0IG1laV90eGVfaHcgKmh3OworCisJZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1laTogZGV2ID1OVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWh3ID0gdG9fdHhlX2h3KGRldik7CisKKwltZWlfc3RvcChkZXYpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbWVpX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKwlwY2lfZGlzYWJsZV9tc2kocGRldik7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwltZWlfdHhlX3BjaV9pb3VubWFwKHBkZXYsIGh3KTsKKworCW1laV9kZXJlZ2lzdGVyKGRldik7CisKKwlrZnJlZShkZXYpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtZWlfdHhlX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAic3VzcGVuZFxuIik7CisKKwltZWlfc3RvcChkZXYpOworCisJbWVpX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1laV90eGVfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBjaV9lbmFibGVfbXNpKHBkZXYpOworCisJbWVpX2NsZWFyX2ludGVycnVwdHMoZGV2KTsKKworCS8qIHJlcXVlc3QgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlpZiAocGNpX2Rldl9tc2lfZW5hYmxlZChwZGV2KSkKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLAorCQkJTlVMTCwKKwkJCW1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyLAorCQkJSVJRRl9PTkVTSE9ULCBLQlVJTERfTU9ETkFNRSwgZGV2KTsKKwllbHNlCisJCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBkZXYtPmlycSwKKwkJCW1laV90eGVfaXJxX3F1aWNrX2hhbmRsZXIsCisJCQltZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlciwKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfdGhyZWFkZWRfaXJxIGZhaWxlZDogaXJxID0gJWQuXG4iLAorCQkJCXBkZXYtPmlycSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gbWVpX3Jlc3RhcnQoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtZWlfdHhlX3BtX29wcywKKwkJCSBtZWlfdHhlX3BjaV9zdXNwZW5kLAorCQkJIG1laV90eGVfcGNpX3Jlc3VtZSk7CisKKyNkZWZpbmUgTUVJX1RYRV9QTV9PUFMJKCZtZWlfdHhlX3BtX29wcykKKyNlbHNlCisjZGVmaW5lIE1FSV9UWEVfUE1fT1BTCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKy8qCisgKiAgUENJIGRyaXZlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG1laV90eGVfZHJpdmVyID0geworCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJLmlkX3RhYmxlID0gbWVpX3R4ZV9wY2lfdGJsLAorCS5wcm9iZSA9IG1laV90eGVfcHJvYmUsCisJLnJlbW92ZSA9IG1laV90eGVfcmVtb3ZlLAorCS5zaHV0ZG93biA9IG1laV90eGVfcmVtb3ZlLAorCS5kcml2ZXIucG0gPSBNRUlfVFhFX1BNX09QUywKK307CisKK21vZHVsZV9wY2lfZHJpdmVyKG1laV90eGVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwoUikgVHJ1c3RlZCBFeGVjdXRpb24gRW52aXJvbm1lbnQgSW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3dkLmMgYi9kcml2ZXJzL21pc2MvbWVpL3dkLmMKaW5kZXggZjcwOTQ1ZS4uZWJmMWNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS93ZC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvd2QuYwpAQCAtMjUsNyArMjUsNiBAQAogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgogI2luY2x1ZGUgImhibS5oIgotI2luY2x1ZGUgImh3LW1lLmgiCiAjaW5jbHVkZSAiY2xpZW50LmgiCiAKIHN0YXRpYyBjb25zdCB1OCBtZWlfc3RhcnRfd2RfcGFyYW1zW10gPSB7IDB4MDIsIDB4MTIsIDB4MTMsIDB4MTAgfTsKQEAgLTUzLDcgKzUyLDcgQEAKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIHJldHVybnMgLUVORU5UIGlmIHdkIGNsaWVudCBjYW5ub3QgYmUgZm91bmQKKyAqIHJldHVybnMgLUVOT1RUWSBpZiB3ZCBjbGllbnQgY2Fubm90IGJlIGZvdW5kCiAgKiAgICAgICAgIC1FSU8gaWYgd3JpdGUgaGFzIGZhaWxlZAogICogICAgICAgICAwIG9uIHN1Y2Nlc3MKICAqLwpAQCAtNzMsNyArNzIsNyBAQAogCWlkID0gbWVpX21lX2NsX2J5X3V1aWQoZGV2LCAmbWVpX3dkX2d1aWQpOwogCWlmIChpZCA8IDApIHsKIAkJZGV2X2luZm8oJmRldi0+cGRldi0+ZGV2LCAid2Q6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnRcbiIpOwotCQlyZXR1cm4gaWQ7CisJCXJldHVybiAtRU5PVFRZOwogCX0KIAogCWNsLT5tZV9jbGllbnRfaWQgPSBkZXYtPm1lX2NsaWVudHNbaWRdLmNsaWVudF9pZDsKQEAgLTg3LDE1ICs4NiwyMCBAQAogCiAJY2wtPnN0YXRlID0gTUVJX0ZJTEVfQ09OTkVDVElORzsKIAotCWlmIChtZWlfaGJtX2NsX2Nvbm5lY3RfcmVxKGRldiwgY2wpKSB7Ci0JCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBjbGllbnRcbiIpOwotCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNURUQ7Ci0JCWNsLT5ob3N0X2NsaWVudF9pZCA9IDA7Ci0JCXJldHVybiAtRUlPOwotCX0KLQljbC0+dGltZXJfY291bnQgPSBNRUlfQ09OTkVDVF9USU1FT1VUOworCXJldCA9IG1laV9jbF9jb25uZWN0KGNsLCBOVUxMKTsKIAotCXJldHVybiAwOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogZmFpbGVkIHRvIGNvbm5lY3QgPSAlZFxuIiwgcmV0KTsKKwkJbWVpX2NsX3VubGluayhjbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWVpX3dhdGNoZG9nX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCkgeworCQltZWlfY2xfZGlzY29ubmVjdChjbCk7CisJCW1laV9jbF91bmxpbmsoY2wpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTEwNiwxMyArMTEwLDE2IEBACiAgKiByZXR1cm5zIDAgaWYgc3VjY2VzcywKICAqCS1FSU8gd2hlbiBtZXNzYWdlIHNlbmQgZmFpbHMKICAqCS1FSU5WQUwgd2hlbiBpbnZhbGlkIG1lc3NhZ2UgaXMgdG8gYmUgc2VudAorICoJLUVOT0RFViBvbiBmbG93IGNvbnRyb2wgZmFpbHVyZQogICovCiBpbnQgbWVpX3dkX3NlbmQoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgbWVpX2NsICpjbCA9ICZkZXYtPndkX2NsOwogCXN0cnVjdCBtZWlfbXNnX2hkciBoZHI7CisJaW50IHJldDsKIAotCWhkci5ob3N0X2FkZHIgPSBkZXYtPndkX2NsLmhvc3RfY2xpZW50X2lkOwotCWhkci5tZV9hZGRyID0gZGV2LT53ZF9jbC5tZV9jbGllbnRfaWQ7CisJaGRyLmhvc3RfYWRkciA9IGNsLT5ob3N0X2NsaWVudF9pZDsKKwloZHIubWVfYWRkciA9IGNsLT5tZV9jbGllbnRfaWQ7CiAJaGRyLm1zZ19jb21wbGV0ZSA9IDE7CiAJaGRyLnJlc2VydmVkID0gMDsKIAloZHIuaW50ZXJuYWwgPSAwOwpAQCAtMTIxLDEwICsxMjgsMjQgQEAKIAkJaGRyLmxlbmd0aCA9IE1FSV9XRF9TVEFSVF9NU0dfU0laRTsKIAllbHNlIGlmICghbWVtY21wKGRldi0+d2RfZGF0YSwgbWVpX3N0b3Bfd2RfcGFyYW1zLCBNRUlfV0RfSERSX1NJWkUpKQogCQloZHIubGVuZ3RoID0gTUVJX1dEX1NUT1BfTVNHX1NJWkU7Ci0JZWxzZQorCWVsc2UgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBpbnZhbGlkIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQlyZXR1cm4gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmaGRyLCBkZXYtPndkX2RhdGEpOworCXJldCA9IG1laV93cml0ZV9tZXNzYWdlKGRldiwgJmhkciwgZGV2LT53ZF9kYXRhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IHdyaXRlIG1lc3NhZ2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBmbG93X2N0cmxfcmVkdWNlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEzMyw5ICsxNTQsMTEgQEAKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcHJlc2VydmU6IGluZGljYXRlIGlmIHRvIGtlZXAgdGhlIHRpbWVvdXQgdmFsdWUKICAqCi0gKiByZXR1cm5zIDAgaWYgc3VjY2VzcywKLSAqCS1FSU8gd2hlbiBtZXNzYWdlIHNlbmQgZmFpbHMKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzCisgKiBvbiBlcnJvcjoKKyAqCS1FSU8gICAgd2hlbiBtZXNzYWdlIHNlbmQgZmFpbHMKICAqCS1FSU5WQUwgd2hlbiBpbnZhbGlkIG1lc3NhZ2UgaXMgdG8gYmUgc2VudAorICoJLUVUSU1FICBvbiBtZXNzYWdlIHRpbWVvdXQKICAqLwogaW50IG1laV93ZF9zdG9wKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CkBAIC0xNTEsMjAgKzE3NCwxMiBAQAogCiAJcmV0ID0gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcygmZGV2LT53ZF9jbCk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycjsKIAotCWlmIChyZXQgJiYgZGV2LT5oYnVmX2lzX3JlYWR5KSB7Ci0JCXJldCA9IDA7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOwotCi0JCWlmICghbWVpX3dkX3NlbmQoZGV2KSkgewotCQkJcmV0ID0gbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoJmRldi0+d2RfY2wpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIG91dDsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IHNlbmQgc3RvcCBmYWlsZWRcbiIpOwotCQl9Ci0KKwlpZiAocmV0ICYmIG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgeworCQlyZXQgPSBtZWlfd2Rfc2VuZChkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CiAJCWRldi0+d2RfcGVuZGluZyA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCWRldi0+d2RfcGVuZGluZyA9IHRydWU7CkBAIC0xNzIsMjEgKzE4NywyMSBAQAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+d2FpdF9zdG9wX3dkLAotCQkJCQlkZXYtPndkX3N0YXRlID09IE1FSV9XRF9JRExFLAotCQkJCQltc2Vjc190b19qaWZmaWVzKE1FSV9XRF9TVE9QX1RJTUVPVVQpKTsKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZGV2LT53YWl0X3N0b3Bfd2QsCisJCQkJZGV2LT53ZF9zdGF0ZSA9PSBNRUlfV0RfSURMRSwKKwkJCQltc2Vjc190b19qaWZmaWVzKE1FSV9XRF9TVE9QX1RJTUVPVVQpKTsKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQlpZiAoZGV2LT53ZF9zdGF0ZSA9PSBNRUlfV0RfSURMRSkgewotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIndkOiBzdG9wIGNvbXBsZXRlZCByZXQ9JWQuXG4iLCByZXQpOwotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCWlmICghcmV0KQotCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwlpZiAoZGV2LT53ZF9zdGF0ZSAhPSBNRUlfV0RfSURMRSkgeworCQkvKiB0aW1lb3V0ICovCisJCXJldCA9IC1FVElNRTsKIAkJZGV2X3dhcm4oJmRldi0+cGRldi0+ZGV2LAogCQkJIndkOiBzdG9wIGZhaWxlZCB0byBjb21wbGV0ZSByZXQ9JWQuXG4iLCByZXQpOworCQlnb3RvIGVycjsKIAl9Ci0KLW91dDoKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIndkOiBzdG9wIGNvbXBsZXRlZCBhZnRlciAldSBtc2VjXG4iLAorCQkJTUVJX1dEX1NUT1BfVElNRU9VVCAtIGppZmZpZXNfdG9fbXNlY3MocmV0KSk7CisJcmV0dXJuIDA7CitlcnI6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjYwLDggKzI3NSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgbWVpX3dkX29wc19waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkX2RldikKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCWludCByZXQ7CiAKIAlkZXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZF9kZXYpOwogCWlmICghZGV2KQpAQCAtMjc3LDI1ICsyOTIsMTggQEAKIAogCWRldi0+d2Rfc3RhdGUgPSBNRUlfV0RfUlVOTklORzsKIAorCXJldCA9IG1laV9jbF9mbG93X2N0cmxfY3JlZHMoJmRldi0+d2RfY2wpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVuZDsKIAkvKiBDaGVjayBpZiB3ZSBjYW4gc2VuZCB0aGUgcGluZyB0byBIVyovCi0JaWYgKGRldi0+aGJ1Zl9pc19yZWFkeSAmJiBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKCZkZXYtPndkX2NsKSA+IDApIHsKKwlpZiAocmV0ICYmIG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCi0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOwogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIndkOiBzZW5kaW5nIHBpbmdcbiIpOwogCi0JCWlmIChtZWlfd2Rfc2VuZChkZXYpKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBzZW5kIGZhaWxlZC5cbiIpOwotCQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gbWVpX3dkX3NlbmQoZGV2KTsKKwkJaWYgKHJldCkKIAkJCWdvdG8gZW5kOwotCQl9Ci0KLQkJaWYgKG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKCZkZXYtPndkX2NsKSkgewotCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCi0JCQkJIndkOiBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZSgpIGZhaWxlZC5cbiIpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KKwkJZGV2LT53ZF9wZW5kaW5nID0gZmFsc2U7CiAJfSBlbHNlIHsKIAkJZGV2LT53ZF9wZW5kaW5nID0gdHJ1ZTsKIAl9CkBAIC0zNjMsMTcgKzM3MSwyNSBAQAogfTsKIAogCi12b2lkIG1laV93YXRjaGRvZ19yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoraW50IG1laV93YXRjaGRvZ19yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewotCWlmICh3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2UoJmFtdF93ZF9kZXYpKSB7Ci0JCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAotCQkJIndkOiB1bmFibGUgdG8gcmVnaXN0ZXIgd2F0Y2hkb2cgZGV2aWNlLlxuIik7Ci0JCXJldHVybjsKKworCWludCByZXQ7CisKKwkvKiB1bmxvY2sgdG8gcGVyc2VydmUgY29ycmVjdCBsb2NraW5nIG9yZGVyICovCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwlyZXQgPSB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2UoJmFtdF93ZF9kZXYpOworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogdW5hYmxlIHRvIHJlZ2lzdGVyIHdhdGNoZG9nIGRldmljZSA9ICVkLlxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCiAJCSJ3ZDogc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIHdhdGNoZG9nIGludGVyZmFjZS5cbiIpOwogCXdhdGNoZG9nX3NldF9kcnZkYXRhKCZhbXRfd2RfZGV2LCBkZXYpOworCXJldHVybiAwOwogfQogCiB2b2lkIG1laV93YXRjaGRvZ191bnJlZ2lzdGVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWljL2NhcmQvbWljX2RldmljZS5oIGIvZHJpdmVycy9taXNjL21pYy9jYXJkL21pY19kZXZpY2UuaAppbmRleCAzNDdiOWIzLi4zMDZmNTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWljL2NhcmQvbWljX2RldmljZS5oCisrKyBiL2RyaXZlcnMvbWlzYy9taWMvY2FyZC9taWNfZGV2aWNlLmgKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAKIC8qKgogICogc3RydWN0IG1pY19pbnRyX2luZm8gLSBDb250YWlucyBoL3cgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXMgaW5mbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21pYy9ob3N0L21pY19kZXZpY2UuaCBiL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfZGV2aWNlLmgKaW5kZXggMWE2ZWRjZS4uMDM5OGM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9ob3N0L21pY19kZXZpY2UuaAorKysgYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2RldmljZS5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAKICNpbmNsdWRlICJtaWNfaW50ci5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYyBiL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfaW50ci5jCmluZGV4IGY5YzI5YmMuLmRiYzVhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfaW50ci5jCisrKyBiL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfaW50ci5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUlDX01JTl9NU0lYOyBpKyspCiAJCW1kZXYtPmlycV9pbmZvLm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CiAKLQlyYyA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCBtZGV2LT5pcnFfaW5mby5tc2l4X2VudHJpZXMsCisJcmMgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QocGRldiwgbWRldi0+aXJxX2luZm8ubXNpeF9lbnRyaWVzLAogCQlNSUNfTUlOX01TSVgpOwogCWlmIChyYykgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJFcnJvciBlbmFibGluZyBNU0l4LiByYyA9ICVkXG4iLCByYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcGNoX3BodWIuYyBiL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCmluZGV4IGE1OTI1ZjdmLi45NTY1OTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvcGNoX3BodWIuYworKysgYi9kcml2ZXJzL21pc2MvcGNoX3BodWIuYwpAQCAtNjM2LDYgKzYzNiw3IEBACiAJdTggbWFjW0VUSF9BTEVOXTsKIAlzc2l6ZV90IHJvbV9zaXplOwogCXN0cnVjdCBwY2hfcGh1Yl9yZWcgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OwogCiAJaWYgKCFtYWNfcHRvbihidWYsIG1hYykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjQ0LDggKzY0NSwxMCBAQAogCWlmICghY2hpcC0+cGNoX3BodWJfZXh0cm9tX2Jhc2VfYWRkcmVzcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwY2hfcGh1Yl93cml0ZV9nYmVfbWFjX2FkZHIoY2hpcCwgbWFjKTsKKwlyZXQgPSBwY2hfcGh1Yl93cml0ZV9nYmVfbWFjX2FkZHIoY2hpcCwgbWFjKTsKIAlwY2lfdW5tYXBfcm9tKGNoaXAtPnBkZXYsIGNoaXAtPnBjaF9waHViX2V4dHJvbV9iYXNlX2FkZHJlc3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc3JhbS5jIGIvZHJpdmVycy9taXNjL3NyYW0uYwppbmRleCBhZmU2NjU3MS4uMjExODFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NyYW0uYworKysgYi9kcml2ZXJzL21pc2Mvc3JhbS5jCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdF9zb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0zNiwxNCArMzksMzUgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiB9OwogCitzdHJ1Y3Qgc3JhbV9yZXNlcnZlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIHN0YXJ0OworCXUzMiBzaXplOworfTsKKworc3RhdGljIGludCBzcmFtX3Jlc2VydmVfY21wKHZvaWQgKnByaXYsIHN0cnVjdCBsaXN0X2hlYWQgKmEsCisJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmIpCit7CisJc3RydWN0IHNyYW1fcmVzZXJ2ZSAqcmEgPSBsaXN0X2VudHJ5KGEsIHN0cnVjdCBzcmFtX3Jlc2VydmUsIGxpc3QpOworCXN0cnVjdCBzcmFtX3Jlc2VydmUgKnJiID0gbGlzdF9lbnRyeShiLCBzdHJ1Y3Qgc3JhbV9yZXNlcnZlLCBsaXN0KTsKKworCXJldHVybiByYS0+c3RhcnQgLSByYi0+c3RhcnQ7Cit9CisKIHN0YXRpYyBpbnQgc3JhbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXZvaWQgX19pb21lbSAqdmlydF9iYXNlOwogCXN0cnVjdCBzcmFtX2RldiAqc3JhbTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlLCAqY2hpbGQ7CisJdW5zaWduZWQgbG9uZyBzaXplLCBjdXJfc3RhcnQsIGN1cl9zaXplOworCXN0cnVjdCBzcmFtX3Jlc2VydmUgKnJibG9ja3MsICpibG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlc2VydmVfbGlzdDsKKwl1bnNpZ25lZCBpbnQgbmJsb2NrczsKIAlpbnQgcmV0OwogCisJSU5JVF9MSVNUX0hFQUQoJnJlc2VydmVfbGlzdCk7CisKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCXZpcnRfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIodmlydF9iYXNlKSkKQEAgLTY1LDE5ICs4OSwxMDYgQEAKIAlpZiAoIXNyYW0tPnBvb2wpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gZ2VuX3Bvb2xfYWRkX3ZpcnQoc3JhbS0+cG9vbCwgKHVuc2lnbmVkIGxvbmcpdmlydF9iYXNlLAotCQkJCXJlcy0+c3RhcnQsIHNpemUsIC0xKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAoc3JhbS0+Y2xrKQotCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNyYW0tPmNsayk7Ci0JCXJldHVybiByZXQ7CisJLyoKKwkgKiBXZSBuZWVkIGFuIGFkZGl0aW9uYWwgYmxvY2sgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBtZW1vcnkgcmVnaW9uCisJICogYWZ0ZXIgdGhlIHJlc2VydmVkIGJsb2NrcyBmcm9tIHRoZSBkdCBhcmUgcHJvY2Vzc2VkLgorCSAqLworCW5ibG9ja3MgPSAobnApID8gb2ZfZ2V0X2F2YWlsYWJsZV9jaGlsZF9jb3VudChucCkgKyAxIDogMTsKKwlyYmxvY2tzID0ga21hbGxvYygobmJsb2NrcykgKiBzaXplb2YoKnJibG9ja3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJibG9ja3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2M7CiAJfQogCisJYmxvY2sgPSAmcmJsb2Nrc1swXTsKKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKKwkJc3RydWN0IHJlc291cmNlIGNoaWxkX3JlczsKKworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGNoaWxkLCAwLCAmY2hpbGRfcmVzKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiY291bGQgbm90IGdldCBhZGRyZXNzIGZvciBub2RlICVzXG4iLAorCQkJCWNoaWxkLT5mdWxsX25hbWUpOworCQkJZ290byBlcnJfY2h1bmtzOworCQl9CisKKwkJaWYgKGNoaWxkX3Jlcy5zdGFydCA8IHJlcy0+c3RhcnQgfHwgY2hpbGRfcmVzLmVuZCA+IHJlcy0+ZW5kKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJInJlc2VydmVkIGJsb2NrICVzIG91dHNpZGUgdGhlIHNyYW0gYXJlYVxuIiwKKwkJCQljaGlsZC0+ZnVsbF9uYW1lKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9jaHVua3M7CisJCX0KKworCQlibG9jay0+c3RhcnQgPSBjaGlsZF9yZXMuc3RhcnQgLSByZXMtPnN0YXJ0OworCQlibG9jay0+c2l6ZSA9IHJlc291cmNlX3NpemUoJmNoaWxkX3Jlcyk7CisJCWxpc3RfYWRkX3RhaWwoJmJsb2NrLT5saXN0LCAmcmVzZXJ2ZV9saXN0KTsKKworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJmb3VuZCByZXNlcnZlZCBibG9jayAweCV4LTB4JXhcbiIsCisJCQlibG9jay0+c3RhcnQsCisJCQlibG9jay0+c3RhcnQgKyBibG9jay0+c2l6ZSk7CisKKwkJYmxvY2srKzsKKwl9CisKKwkvKiB0aGUgbGFzdCBjaHVuayBtYXJrcyB0aGUgZW5kIG9mIHRoZSByZWdpb24gKi8KKwlyYmxvY2tzW25ibG9ja3MgLSAxXS5zdGFydCA9IHNpemU7CisJcmJsb2Nrc1tuYmxvY2tzIC0gMV0uc2l6ZSA9IDA7CisJbGlzdF9hZGRfdGFpbCgmcmJsb2Nrc1tuYmxvY2tzIC0gMV0ubGlzdCwgJnJlc2VydmVfbGlzdCk7CisKKwlsaXN0X3NvcnQoTlVMTCwgJnJlc2VydmVfbGlzdCwgc3JhbV9yZXNlcnZlX2NtcCk7CisKKwljdXJfc3RhcnQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJnJlc2VydmVfbGlzdCwgbGlzdCkgeworCQkvKiBjYW4gb25seSBoYXBwZW4gaWYgc2VjdGlvbnMgb3ZlcmxhcCAqLworCQlpZiAoYmxvY2stPnN0YXJ0IDwgY3VyX3N0YXJ0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImJsb2NrIGF0IDB4JXggc3RhcnRzIGFmdGVyIGN1cnJlbnQgb2Zmc2V0IDB4JWx4XG4iLAorCQkJCWJsb2NrLT5zdGFydCwgY3VyX3N0YXJ0KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9jaHVua3M7CisJCX0KKworCQkvKiBjdXJyZW50IHN0YXJ0IGlzIGluIGEgcmVzZXJ2ZWQgYmxvY2ssIHNvIGNvbnRpbnVlIGFmdGVyIGl0ICovCisJCWlmIChibG9jay0+c3RhcnQgPT0gY3VyX3N0YXJ0KSB7CisJCQljdXJfc3RhcnQgPSBibG9jay0+c3RhcnQgKyBibG9jay0+c2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogYWxsb2NhdGUgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGN1cnJlbnQgc3RhcnRpbmcKKwkJICogYWRkcmVzcyBhbmQgdGhlIGZvbGxvd2luZyByZXNlcnZlZCBibG9jaywgb3IgdGhlCisJCSAqIGVuZCBvZiB0aGUgcmVnaW9uLgorCQkgKi8KKwkJY3VyX3NpemUgPSBibG9jay0+c3RhcnQgLSBjdXJfc3RhcnQ7CisKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiYWRkaW5nIGNodW5rIDB4JWx4LTB4JWx4XG4iLAorCQkJY3VyX3N0YXJ0LCBjdXJfc3RhcnQgKyBjdXJfc2l6ZSk7CisJCXJldCA9IGdlbl9wb29sX2FkZF92aXJ0KHNyYW0tPnBvb2wsCisJCQkJKHVuc2lnbmVkIGxvbmcpdmlydF9iYXNlICsgY3VyX3N0YXJ0LAorCQkJCXJlcy0+c3RhcnQgKyBjdXJfc3RhcnQsIGN1cl9zaXplLCAtMSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfY2h1bmtzOworCisJCS8qIG5leHQgYWxsb2NhdGlvbiBhZnRlciB0aGlzIHJlc2VydmVkIGJsb2NrICovCisJCWN1cl9zdGFydCA9IGJsb2NrLT5zdGFydCArIGJsb2NrLT5zaXplOworCX0KKworCWtmcmVlKHJibG9ja3MpOworCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3JhbSk7CiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJTUkFNIHBvb2w6ICVsZCBLaUIgQCAweCVwXG4iLCBzaXplIC8gMTAyNCwgdmlydF9iYXNlKTsKIAogCXJldHVybiAwOworCitlcnJfY2h1bmtzOgorCWtmcmVlKHJibG9ja3MpOworZXJyX2FsbG9jOgorCWlmIChzcmFtLT5jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcmFtLT5jbGspOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc3JhbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTg3LDggKzE5OCw2IEBACiAJaWYgKGdlbl9wb29sX2F2YWlsKHNyYW0tPnBvb2wpIDwgZ2VuX3Bvb2xfc2l6ZShzcmFtLT5wb29sKSkKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVtb3ZlZCB3aGlsZSBTUkFNIGFsbG9jYXRlZFxuIik7CiAKLQlnZW5fcG9vbF9kZXN0cm95KHNyYW0tPnBvb2wpOwotCiAJaWYgKHNyYW0tPmNsaykKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNyYW0tPmNsayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCmluZGV4IDNhZWQ1MjUuLjE5NzJkNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYwpAQCAtMjIsNyArMjIsNiBAQAogI2RlZmluZSBwcl9mbXQoZm10KQkiKHN0Yyk6ICIgZm10CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogCiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aV9kYWM3NTEyLmMgYi9kcml2ZXJzL21pc2MvdGlfZGFjNzUxMi5jCmluZGV4IDgzZGE3MTEuLmNiMDI4OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aV9kYWM3NTEyLmMKKysrIGIvZHJpdmVycy9taXNjL3RpX2RhYzc1MTIuYwpAQCAtMjAsNyArMjAsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90c2wyNTUwLmMgYi9kcml2ZXJzL21pc2MvdHNsMjU1MC5jCmluZGV4IDViYzEwZmExLi5iMDAzMzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdHNsMjU1MC5jCisrKyBiL2RyaXZlcnMvbWlzYy90c2wyNTUwLmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfZ3Vlc3QuYyBiL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2d1ZXN0LmMKaW5kZXggZDM1Y2RhMC4uZTBkNTAxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfZ3Vlc3QuYworKysgYi9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ndWVzdC5jCkBAIC0zODMsMTEgKzM4MywxMiBAQAogCQl2bWNpX2Rldi0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciA9IGk7CiAJfQogCi0JcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIHZtY2lfZGV2LT5tc2l4X2VudHJpZXMsIFZNQ0lfTUFYX0lOVFJTKTsKKwlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QocGRldiwKKwkJCQkgICAgICAgdm1jaV9kZXYtPm1zaXhfZW50cmllcywgVk1DSV9NQVhfSU5UUlMpOwogCWlmIChyZXN1bHQgPT0gMCkKIAkJdm1jaV9kZXYtPmV4Y2x1c2l2ZV92ZWN0b3JzID0gdHJ1ZTsKLQllbHNlIGlmIChyZXN1bHQgPiAwKQotCQlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgdm1jaV9kZXYtPm1zaXhfZW50cmllcywgMSk7CisJZWxzZSBpZiAocmVzdWx0ID09IC1FTk9TUEMpCisJCXJlc3VsdCA9IHBjaV9lbmFibGVfbXNpeF9leGFjdChwZGV2LCB2bWNpX2Rldi0+bXNpeF9lbnRyaWVzLCAxKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwppbmRleCA1NWNkMTEwLi5jMjA0YjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKQEAgLTI2MDcsNyArMjYwNyw3IEBACiAKIAl0YXNrbGV0X2luaXQoJmhvc3QtPnRhc2tsZXQsIGR3X21jaV90YXNrbGV0X2Z1bmMsICh1bnNpZ25lZCBsb25nKWhvc3QpOwogCWhvc3QtPmNhcmRfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJkdy1tY2ktY2FyZCIsCi0JCQlXUV9NRU1fUkVDTEFJTSB8IFdRX05PTl9SRUVOVFJBTlQsIDEpOworCQkJV1FfTUVNX1JFQ0xBSU0sIDEpOwogCWlmICghaG9zdC0+Y2FyZF93b3JrcXVldWUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfZG1hdW5tYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKaW5kZXggOTBmZjQ0Ny4uYTRiZWU0MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKQEAgLTQyOCw2ICs0MjgsNyBAQAogCXRyaXN0YXRlICJOQU5EIHN1cHBvcnQgZm9yIEZyZWVzY2FsZSBJRkMgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIE1URF9OQU5EICYmIEZTTF9TT0MKIAlzZWxlY3QgRlNMX0lGQworCXNlbGVjdCBNRU1PUlkKIAloZWxwCiAJICBWYXJpb3VzIEZyZWVzY2FsZSBjaGlwcyBlLmcgUDEwMTAsIGluY2x1ZGUgYSBOQU5EIEZsYXNoIG1hY2hpbmUKIAkgIHdpdGggYnVpbHQtaW4gaGFyZHdhcmUgRUNDIGNhcGFiaWxpdGllcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2lmY19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF9pZmNfbmFuZC5jCmluZGV4IDkwY2E3ZTcuLjUwZDkxNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2lmY19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfaWZjX25hbmQuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KLSNpbmNsdWRlIDxhc20vZnNsX2lmYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9pZmMuaD4KIAogI2RlZmluZSBGU0xfSUZDX1YxXzFfMAkweDAxMDEwMDAwCiAjZGVmaW5lIEVSUl9CWVRFCQkweEZGIC8qIFZhbHVlIHJldHVybmVkIGZvciByZWFkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKaW5kZXggMmU0NWY2ZS4uMzgwZDI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYwpAQCAtMTI0OCwxOSArMTI0OCwxMyBAQAogCSAqIHNoYXJlZCByZWdpc3RlciBmb3IgdGhlIGhpZ2ggMzIgYml0cywgc28gb25seSBhIHNpbmdsZSwgYWxpZ25lZCwKIAkgKiA0IEdCIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgY2FuIGJlIHVzZWQgZm9yIGRlc2NyaXB0b3JzLgogCSAqLwotCWlmICghZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpICYmCi0JICAgICFkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKKwlpZiAoIWRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRE1BIHRvIDY0LUJJVCBhZGRyZXNzZXNcbiIpOwogCX0gZWxzZSB7Ci0JCWVyciA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJZXJyID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJaWYgKGVycikgewotCQkJZXJyID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsCi0JCQkJCQkgICAgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCQkiTm8gdXNhYmxlIERNQSBjb25maWcsIGFib3J0aW5nXG4iKTsKLQkJCQlnb3RvIG91dF9wY2lfZGlzYWJsZTsKLQkJCX0KKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVzYWJsZSBETUEgY29uZmlnLCBhYm9ydGluZ1xuIik7CisJCQlnb3RvIG91dF9wY2lfZGlzYWJsZTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxZS9hdGwxZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX21haW4uYwppbmRleCBkNWMyZDNlLi40MjJhYWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX21haW4uYwpAQCAtMjQzNiw3ICsyNDM2LDcgQEAKIGVycl9yZWdpc3RlcjoKIGVycl9zd19pbml0OgogZXJyX2VlcHJvbToKLQlpb3VubWFwKGFkYXB0ZXItPmh3Lmh3X2FkZHIpOworCXBjaV9pb3VubWFwKHBkZXYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIpOwogZXJyX2luaXRfbmV0ZGV2OgogZXJyX2lvcmVtYXA6CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKQEAgLTI0NzQsNyArMjQ3NCw3IEBACiAJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlhdGwxZV9mcmVlX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCWF0bDFlX2ZvcmNlX3BzKCZhZGFwdGVyLT5odyk7Ci0JaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKKwlwY2lfaW91bm1hcChwZGV2LCBhZGFwdGVyLT5ody5od19hZGRyKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jCmluZGV4IGZjZjkxMDVhNS4uMDlmM2ZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGNuaWMuYzogQnJvYWRjb20gQ05JQyBjb3JlIG5ldHdvcmsgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzQyLDcgKzM0Miw3IEBACiAJd2hpbGUgKHJldHJ5IDwgMykgewogCQlyYyA9IDA7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJdWxwX29wcyA9IHJjdV9kZXJlZmVyZW5jZShjbmljX3VscF90YmxbQ05JQ19VTFBfSVNDU0ldKTsKKwkJdWxwX29wcyA9IHJjdV9kZXJlZmVyZW5jZShjcC0+dWxwX29wc1tDTklDX1VMUF9JU0NTSV0pOwogCQlpZiAodWxwX29wcykKIAkJCXJjID0gdWxwX29wcy0+aXNjc2lfbmxfc2VuZF9tc2coCiAJCQkJY3AtPnVscF9oYW5kbGVbQ05JQ19VTFBfSVNDU0ldLApAQCAtNzI2LDcgKzcyNiw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5udW1fcGFnZXM7IGkrKykgewogCQlpZiAoZG1hLT5wZ19hcnJbaV0pIHsKLQkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBjaWRldi0+ZGV2LCBCTlgyX1BBR0VfU0laRSwKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkJICBkbWEtPnBnX2FycltpXSwgZG1hLT5wZ19tYXBfYXJyW2ldKTsKIAkJCWRtYS0+cGdfYXJyW2ldID0gTlVMTDsKIAkJfQpAQCAtNzg1LDcgKzc4NSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgewogCQlkbWEtPnBnX2FycltpXSA9IGRtYV9hbGxvY19jb2hlcmVudCgmZGV2LT5wY2lkZXYtPmRldiwKLQkJCQkJCSAgICBCTlgyX1BBR0VfU0laRSwKKwkJCQkJCSAgICBDTklDX1BBR0VfU0laRSwKIAkJCQkJCSAgICAmZG1hLT5wZ19tYXBfYXJyW2ldLAogCQkJCQkJICAgIEdGUF9BVE9NSUMpOwogCQlpZiAoZG1hLT5wZ19hcnJbaV0gPT0gTlVMTCkKQEAgLTc5NCw4ICs3OTQsOCBAQAogCWlmICghdXNlX3BnX3RibCkKIAkJcmV0dXJuIDA7CiAKLQlkbWEtPnBndGJsX3NpemUgPSAoKHBhZ2VzICogOCkgKyBCTlgyX1BBR0VfU0laRSAtIDEpICYKLQkJCSAgfihCTlgyX1BBR0VfU0laRSAtIDEpOworCWRtYS0+cGd0Ymxfc2l6ZSA9ICgocGFnZXMgKiA4KSArIENOSUNfUEFHRV9TSVpFIC0gMSkgJgorCQkJICB+KENOSUNfUEFHRV9TSVpFIC0gMSk7CiAJZG1hLT5wZ3RibCA9IGRtYV9hbGxvY19jb2hlcmVudCgmZGV2LT5wY2lkZXYtPmRldiwgZG1hLT5wZ3RibF9zaXplLAogCQkJCQkmZG1hLT5wZ3RibF9tYXAsIEdGUF9BVE9NSUMpOwogCWlmIChkbWEtPnBndGJsID09IE5VTEwpCkBAIC05MDAsOCArOTAwLDggQEAKIAlpZiAoQk5YMl9DSElQKGNwKSA9PSBCTlgyX0NISVBfNTcwOSkgewogCQlpbnQgaSwgaywgYXJyX3NpemU7CiAKLQkJY3AtPmN0eF9ibGtfc2l6ZSA9IEJOWDJfUEFHRV9TSVpFOwotCQljcC0+Y2lkc19wZXJfYmxrID0gQk5YMl9QQUdFX1NJWkUgLyAxMjg7CisJCWNwLT5jdHhfYmxrX3NpemUgPSBDTklDX1BBR0VfU0laRTsKKwkJY3AtPmNpZHNfcGVyX2JsayA9IENOSUNfUEFHRV9TSVpFIC8gMTI4OwogCQlhcnJfc2l6ZSA9IEJOWDJfTUFYX0NJRCAvIGNwLT5jaWRzX3Blcl9ibGsgKgogCQkJICAgc2l6ZW9mKHN0cnVjdCBjbmljX2N0eCk7CiAJCWNwLT5jdHhfYXJyID0ga3phbGxvYyhhcnJfc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC05MzMsNyArOTMzLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNwLT5jdHhfYmxrczsgaSsrKSB7CiAJCQljcC0+Y3R4X2FycltpXS5jdHggPQogCQkJCWRtYV9hbGxvY19jb2hlcmVudCgmZGV2LT5wY2lkZXYtPmRldiwKLQkJCQkJCSAgIEJOWDJfUEFHRV9TSVpFLAorCQkJCQkJICAgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCQkgICAmY3AtPmN0eF9hcnJbaV0ubWFwcGluZywKIAkJCQkJCSAgIEdGUF9LRVJORUwpOwogCQkJaWYgKGNwLT5jdHhfYXJyW2ldLmN0eCA9PSBOVUxMKQpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIAlpZiAodWRldi0+bDJfcmluZykKIAkJcmV0dXJuIDA7CiAKLQl1ZGV2LT5sMl9yaW5nX3NpemUgPSBwYWdlcyAqIEJOWDJfUEFHRV9TSVpFOworCXVkZXYtPmwyX3Jpbmdfc2l6ZSA9IHBhZ2VzICogQ05JQ19QQUdFX1NJWkU7CiAJdWRldi0+bDJfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmdWRldi0+cGRldi0+ZGV2LCB1ZGV2LT5sMl9yaW5nX3NpemUsCiAJCQkJCSAgICZ1ZGV2LT5sMl9yaW5nX21hcCwKIAkJCQkJICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX0NPTVApOwpAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl1ZGV2LT5sMl9idWZfc2l6ZSA9IChjcC0+bDJfcnhfcmluZ19zaXplICsgMSkgKiBjcC0+bDJfc2luZ2xlX2J1Zl9zaXplOwotCXVkZXYtPmwyX2J1Zl9zaXplID0gUEFHRV9BTElHTih1ZGV2LT5sMl9idWZfc2l6ZSk7CisJdWRldi0+bDJfYnVmX3NpemUgPSBDTklDX1BBR0VfQUxJR04odWRldi0+bDJfYnVmX3NpemUpOwogCXVkZXYtPmwyX2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmdWRldi0+cGRldi0+ZGV2LCB1ZGV2LT5sMl9idWZfc2l6ZSwKIAkJCQkJICAmdWRldi0+bDJfYnVmX21hcCwKIAkJCQkJICBHRlBfS0VSTkVMIHwgX19HRlBfQ09NUCk7CkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCQl1aW5mby0+bWVtWzBdLnNpemUgPSBNQl9HRVRfQ0lEX0FERFIoVFhfVFNTX0NJRCArCiAJCQkJCQkgICAgIFRYX01BWF9UU1NfUklOR1MgKyAxKTsKIAkJdWluZm8tPm1lbVsxXS5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGNwLT5zdGF0dXNfYmxrLmdlbiAmCi0JCQkJCVBBR0VfTUFTSzsKKwkJCQkJQ05JQ19QQUdFX01BU0s7CiAJCWlmIChjcC0+ZXRoZGV2LT5kcnZfc3RhdGUgJiBDTklDX0RSVl9TVEFURV9VU0lOR19NU0lYKQogCQkJdWluZm8tPm1lbVsxXS5zaXplID0gQk5YMl9TQkxLX01TSVhfQUxJR05fU0laRSAqIDk7CiAJCWVsc2UKQEAgLTExMTMsNyArMTExMyw3IEBACiAJCXVpbmZvLT5tZW1bMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wY2lkZXYsIDApOwogCiAJCXVpbmZvLT5tZW1bMV0uYWRkciA9ICh1bnNpZ25lZCBsb25nKSBjcC0+Ym54MnhfZGVmX3N0YXR1c19ibGsgJgotCQkJUEFHRV9NQVNLOworCQkJQ05JQ19QQUdFX01BU0s7CiAJCXVpbmZvLT5tZW1bMV0uc2l6ZSA9IHNpemVvZigqY3AtPmJueDJ4X2RlZl9zdGF0dXNfYmxrKTsKIAogCQl1aW5mby0+bmFtZSA9ICJibngyeF9jbmljIjsKQEAgLTEyNjcsMTQgKzEyNjcsMTQgQEAKIAlmb3IgKGkgPSBNQVhfSVNDU0lfVEJMX1NaOyBpIDwgY3AtPm1heF9jaWRfc3BhY2U7IGkrKykKIAkJY3AtPmN0eF90YmxbaV0udWxwX3Byb3RvX2lkID0gQ05JQ19VTFBfRkNPRTsKIAotCXBhZ2VzID0gUEFHRV9BTElHTihjcC0+bWF4X2NpZF9zcGFjZSAqIENOSUNfS1dRMTZfREFUQV9TSVpFKSAvCi0JCVBBR0VfU0laRTsKKwlwYWdlcyA9IENOSUNfUEFHRV9BTElHTihjcC0+bWF4X2NpZF9zcGFjZSAqIENOSUNfS1dRMTZfREFUQV9TSVpFKSAvCisJCUNOSUNfUEFHRV9TSVpFOwogCiAJcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCBrd3FfMTZfZG1hLCBwYWdlcywgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQluID0gUEFHRV9TSVpFIC8gQ05JQ19LV1ExNl9EQVRBX1NJWkU7CisJbiA9IENOSUNfUEFHRV9TSVpFIC8gQ05JQ19LV1ExNl9EQVRBX1NJWkU7CiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjcC0+bWF4X2NpZF9zcGFjZTsgaSsrKSB7CiAJCWxvbmcgb2ZmID0gQ05JQ19LV1ExNl9EQVRBX1NJWkUgKiAoaSAlIG4pOwogCkBAIC0xMjk2LDcgKzEyOTYsNyBAQAogCQkJZ290byBlcnJvcjsKIAl9CiAKLQlwYWdlcyA9IFBBR0VfQUxJR04oQk5YMlhfSVNDU0lfR0xCX0JVRl9TSVpFKSAvIFBBR0VfU0laRTsKKwlwYWdlcyA9IENOSUNfUEFHRV9BTElHTihCTlgyWF9JU0NTSV9HTEJfQlVGX1NJWkUpIC8gQ05JQ19QQUdFX1NJWkU7CiAJcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCAmY3AtPmdibF9idWZfaW5mbywgcGFnZXMsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CkBAIC0xNDY2LDggKzE0NjYsOCBAQAogCWNwLT5yMnRxX3NpemUgPSBjcC0+bnVtX2lzY3NpX3Rhc2tzICogQk5YMlhfSVNDU0lfTUFYX1BFTkRJTkdfUjJUUyAqCiAJCQlCTlgyWF9JU0NTSV9SMlRRRV9TSVpFOwogCWNwLT5ocV9zaXplID0gY3AtPm51bV9jY2VsbHMgKiBCTlgyWF9JU0NTSV9IUV9CRF9TSVpFOwotCXBhZ2VzID0gUEFHRV9BTElHTihjcC0+aHFfc2l6ZSkgLyBQQUdFX1NJWkU7Ci0JaHFfYmRzID0gcGFnZXMgKiAoUEFHRV9TSVpFIC8gQk5YMlhfSVNDU0lfSFFfQkRfU0laRSk7CisJcGFnZXMgPSBDTklDX1BBR0VfQUxJR04oY3AtPmhxX3NpemUpIC8gQ05JQ19QQUdFX1NJWkU7CisJaHFfYmRzID0gcGFnZXMgKiAoQ05JQ19QQUdFX1NJWkUgLyBCTlgyWF9JU0NTSV9IUV9CRF9TSVpFKTsKIAljcC0+bnVtX2NxcyA9IHJlcTEtPm51bV9jcXM7CiAKIAlpZiAoIWRldi0+bWF4X2lzY3NpX2Nvbm4pCkBAIC0xNDc3LDkgKzE0NzcsOSBAQAogCUNOSUNfV1IxNihkZXYsIEJBUl9UU1RST1JNX0lOVE1FTSArIFRTVE9STV9JU0NTSV9SUV9TSVpFX09GRlNFVChwZmlkKSwKIAkJICByZXExLT5ycV9udW1fd3Flcyk7CiAJQ05JQ19XUjE2KGRldiwgQkFSX1RTVFJPUk1fSU5UTUVNICsgVFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9PRkZTRVQocGZpZCksCi0JCSAgUEFHRV9TSVpFKTsKKwkJICBDTklDX1BBR0VfU0laRSk7CiAJQ05JQ19XUjgoZGV2LCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkgVFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9MT0dfT0ZGU0VUKHBmaWQpLCBQQUdFX1NISUZUKTsKKwkJIFRTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZmlkKSwgQ05JQ19QQUdFX0JJVFMpOwogCUNOSUNfV1IxNihkZXYsIEJBUl9UU1RST1JNX0lOVE1FTSArCiAJCSAgVFNUT1JNX0lTQ1NJX05VTV9PRl9UQVNLU19PRkZTRVQocGZpZCksCiAJCSAgcmVxMS0+bnVtX3Rhc2tzX3Blcl9jb25uKTsKQEAgLTE0ODksOSArMTQ4OSw5IEBACiAJCSAgVVNUT1JNX0lTQ1NJX1JRX0JVRkZFUl9TSVpFX09GRlNFVChwZmlkKSwKIAkJICByZXExLT5ycV9idWZmZXJfc2l6ZSk7CiAJQ05JQ19XUjE2KGRldiwgQkFSX1VTVFJPUk1fSU5UTUVNICsgVVNUT1JNX0lTQ1NJX1BBR0VfU0laRV9PRkZTRVQocGZpZCksCi0JCSAgUEFHRV9TSVpFKTsKKwkJICBDTklDX1BBR0VfU0laRSk7CiAJQ05JQ19XUjgoZGV2LCBCQVJfVVNUUk9STV9JTlRNRU0gKwotCQkgVVNUT1JNX0lTQ1NJX1BBR0VfU0laRV9MT0dfT0ZGU0VUKHBmaWQpLCBQQUdFX1NISUZUKTsKKwkJIFVTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZmlkKSwgQ05JQ19QQUdFX0JJVFMpOwogCUNOSUNfV1IxNihkZXYsIEJBUl9VU1RST1JNX0lOVE1FTSArCiAJCSAgVVNUT1JNX0lTQ1NJX05VTV9PRl9UQVNLU19PRkZTRVQocGZpZCksCiAJCSAgcmVxMS0+bnVtX3Rhc2tzX3Blcl9jb25uKTsKQEAgLTE1MDQsOSArMTUwNCw5IEBACiAKIAkvKiBpbml0IFhzdG9ybSBSQU0gKi8KIAlDTklDX1dSMTYoZGV2LCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fSVNDU0lfUEFHRV9TSVpFX09GRlNFVChwZmlkKSwKLQkJICBQQUdFX1NJWkUpOworCQkgIENOSUNfUEFHRV9TSVpFKTsKIAlDTklDX1dSOChkZXYsIEJBUl9YU1RST1JNX0lOVE1FTSArCi0JCSBYU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZpZCksIFBBR0VfU0hJRlQpOworCQkgWFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9MT0dfT0ZGU0VUKHBmaWQpLCBDTklDX1BBR0VfQklUUyk7CiAJQ05JQ19XUjE2KGRldiwgQkFSX1hTVFJPUk1fSU5UTUVNICsKIAkJICBYU1RPUk1fSVNDU0lfTlVNX09GX1RBU0tTX09GRlNFVChwZmlkKSwKIAkJICByZXExLT5udW1fdGFza3NfcGVyX2Nvbm4pOwpAQCAtMTUxOSw5ICsxNTE5LDkgQEAKIAogCS8qIGluaXQgQ3N0b3JtIFJBTSAqLwogCUNOSUNfV1IxNihkZXYsIEJBUl9DU1RST1JNX0lOVE1FTSArIENTVE9STV9JU0NTSV9QQUdFX1NJWkVfT0ZGU0VUKHBmaWQpLAotCQkgIFBBR0VfU0laRSk7CisJCSAgQ05JQ19QQUdFX1NJWkUpOwogCUNOSUNfV1I4KGRldiwgQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJIENTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZmlkKSwgUEFHRV9TSElGVCk7CisJCSBDU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZpZCksIENOSUNfUEFHRV9CSVRTKTsKIAlDTklDX1dSMTYoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKwogCQkgIENTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmaWQpLAogCQkgIHJlcTEtPm51bV90YXNrc19wZXJfY29ubik7CkBAIC0xNjIzLDE4ICsxNjIzLDE4IEBACiAJfQogCiAJY3R4LT5jaWQgPSBjaWQ7Ci0JcGFnZXMgPSBQQUdFX0FMSUdOKGNwLT50YXNrX2FycmF5X3NpemUpIC8gUEFHRV9TSVpFOworCXBhZ2VzID0gQ05JQ19QQUdFX0FMSUdOKGNwLT50YXNrX2FycmF5X3NpemUpIC8gQ05JQ19QQUdFX1NJWkU7CiAKIAlyZXQgPSBjbmljX2FsbG9jX2RtYShkZXYsICZpc2NzaS0+dGFza19hcnJheV9pbmZvLCBwYWdlcywgMSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcjsKIAotCXBhZ2VzID0gUEFHRV9BTElHTihjcC0+cjJ0cV9zaXplKSAvIFBBR0VfU0laRTsKKwlwYWdlcyA9IENOSUNfUEFHRV9BTElHTihjcC0+cjJ0cV9zaXplKSAvIENOSUNfUEFHRV9TSVpFOwogCXJldCA9IGNuaWNfYWxsb2NfZG1hKGRldiwgJmlzY3NpLT5yMnRxX2luZm8sIHBhZ2VzLCAxKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwogCi0JcGFnZXMgPSBQQUdFX0FMSUdOKGNwLT5ocV9zaXplKSAvIFBBR0VfU0laRTsKKwlwYWdlcyA9IENOSUNfUEFHRV9BTElHTihjcC0+aHFfc2l6ZSkgLyBDTklDX1BBR0VfU0laRTsKIAlyZXQgPSBjbmljX2FsbG9jX2RtYShkZXYsICZpc2NzaS0+aHFfaW5mbywgcGFnZXMsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CkBAIC0xNzYwLDcgKzE3NjAsNyBAQAogCWljdHgtPnRzdG9ybV9zdF9jb250ZXh0LmlzY3NpLmhkcl9ieXRlc18yX2ZldGNoID0gSVNDU0lfSEVBREVSX1NJWkU7CiAJLyogVFNUT1JNIHJlcXVpcmVzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgUlEgREIgJiBub3QgUFRFICovCiAJaWN0eC0+dHN0b3JtX3N0X2NvbnRleHQuaXNjc2kucnFfZGJfcGh5X2FkZHIubG8gPQotCQlyZXEyLT5ycV9wYWdlX3RhYmxlX2FkZHJfbG8gJiBQQUdFX01BU0s7CisJCXJlcTItPnJxX3BhZ2VfdGFibGVfYWRkcl9sbyAmIENOSUNfUEFHRV9NQVNLOwogCWljdHgtPnRzdG9ybV9zdF9jb250ZXh0LmlzY3NpLnJxX2RiX3BoeV9hZGRyLmhpID0KIAkJcmVxMi0+cnFfcGFnZV90YWJsZV9hZGRyX2hpOwogCWljdHgtPnRzdG9ybV9zdF9jb250ZXh0LmlzY3NpLmlzY3NpX2Nvbm5faWQgPSByZXExLT5pc2NzaV9jb25uX2lkOwpAQCAtMTg0Miw3ICsxODQyLDcgQEAKIAkvKiBDU1RPUk0gYW5kIFVTVE9STSBpbml0aWFsaXphdGlvbiBpcyBkaWZmZXJlbnQsIENTVE9STSByZXF1aXJlcwogCSAqIENRIERCIGJhc2UgJiBub3QgUFRFIGFkZHIgKi8KIAlpY3R4LT5jc3Rvcm1fc3RfY29udGV4dC5jcV9kYl9iYXNlLmxvID0KLQkJcmVxMS0+Y3FfcGFnZV90YWJsZV9hZGRyX2xvICYgUEFHRV9NQVNLOworCQlyZXExLT5jcV9wYWdlX3RhYmxlX2FkZHJfbG8gJiBDTklDX1BBR0VfTUFTSzsKIAlpY3R4LT5jc3Rvcm1fc3RfY29udGV4dC5jcV9kYl9iYXNlLmhpID0gcmVxMS0+Y3FfcGFnZV90YWJsZV9hZGRyX2hpOwogCWljdHgtPmNzdG9ybV9zdF9jb250ZXh0LmlzY3NpX2Nvbm5faWQgPSByZXExLT5pc2NzaV9jb25uX2lkOwogCWljdHgtPmNzdG9ybV9zdF9jb250ZXh0LmNxX3Byb2NfZW5fYml0X21hcCA9ICgxIDw8IGNwLT5udW1fY3FzKSAtIDE7CkBAIC0yOTExLDcgKzI5MTEsNyBAQAogCXUxNiBod19jb25zLCBzd19jb25zOwogCXN0cnVjdCBjbmljX3Vpb19kZXYgKnVkZXYgPSBjcC0+dWRldjsKIAl1bmlvbiBldGhfcnhfY3FlICpjcWUsICpjcWVfcmluZyA9ICh1bmlvbiBldGhfcnhfY3FlICopCi0JCQkJCSh1ZGV2LT5sMl9yaW5nICsgKDIgKiBCTlgyX1BBR0VfU0laRSkpOworCQkJCQkodWRldi0+bDJfcmluZyArICgyICogQ05JQ19QQUdFX1NJWkUpKTsKIAl1MzIgY21kOwogCWludCBjb21wID0gMDsKIApAQCAtMzI0NCw3ICszMjQ0LDggQEAKIAlpbnQgcmM7CiAKIAltdXRleF9sb2NrKCZjbmljX2xvY2spOwotCXVscF9vcHMgPSBjbmljX3VscF90YmxfcHJvdCh1bHBfdHlwZSk7CisJdWxwX29wcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3AtPnVscF9vcHNbdWxwX3R5cGVdLAorCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZjbmljX2xvY2spKTsKIAlpZiAodWxwX29wcyAmJiB1bHBfb3BzLT5jbmljX2dldF9zdGF0cykKIAkJcmMgPSB1bHBfb3BzLT5jbmljX2dldF9zdGF0cyhjcC0+dWxwX2hhbmRsZVt1bHBfdHlwZV0pOwogCWVsc2UKQEAgLTQzODQsNyArNDM4NSw3IEBACiAJCXUzMiBpZHggPSBjcC0+Y3R4X2FycltpXS5jaWQgLyBjcC0+Y2lkc19wZXJfYmxrOwogCQl1MzIgdmFsOwogCi0JCW1lbXNldChjcC0+Y3R4X2FycltpXS5jdHgsIDAsIEJOWDJfUEFHRV9TSVpFKTsKKwkJbWVtc2V0KGNwLT5jdHhfYXJyW2ldLmN0eCwgMCwgQ05JQ19QQUdFX1NJWkUpOwogCiAJCUNOSUNfV1IoZGV2LCBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0RBVEEwLAogCQkJKGNwLT5jdHhfYXJyW2ldLm1hcHBpbmcgJiAweGZmZmZmZmZmKSB8IHZhbGlkX2JpdCk7CkBAIC00NjI4LDcgKzQ2MjksNyBAQAogCQl2YWwgPSBCTlgyX0wyQ1RYX0wyX1NUQVRVU0JfTlVNKHNiX2lkKTsKIAljbmljX2N0eF93cihkZXYsIGNpZF9hZGRyLCBCTlgyX0wyQ1RYX0hPU1RfQkRJRFgsIHZhbCk7CiAKLQlyeGJkID0gdWRldi0+bDJfcmluZyArIEJOWDJfUEFHRV9TSVpFOworCXJ4YmQgPSB1ZGV2LT5sMl9yaW5nICsgQ05JQ19QQUdFX1NJWkU7CiAJZm9yIChpID0gMDsgaSA8IEJOWDJfTUFYX1JYX0RFU0NfQ05UOyBpKyssIHJ4YmQrKykgewogCQlkbWFfYWRkcl90IGJ1Zl9tYXA7CiAJCWludCBuID0gKGkgJSBjcC0+bDJfcnhfcmluZ19zaXplKSArIDE7CkBAIC00NjM5LDExICs0NjQwLDExIEBACiAJCXJ4YmQtPnJ4X2JkX2hhZGRyX2hpID0gKHU2NCkgYnVmX21hcCA+PiAzMjsKIAkJcnhiZC0+cnhfYmRfaGFkZHJfbG8gPSAodTY0KSBidWZfbWFwICYgMHhmZmZmZmZmZjsKIAl9Ci0JdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgQk5YMl9QQUdFX1NJWkUpID4+IDMyOworCXZhbCA9ICh1NjQpIChyaW5nX21hcCArIENOSUNfUEFHRV9TSVpFKSA+PiAzMjsKIAljbmljX2N0eF93cihkZXYsIGNpZF9hZGRyLCBCTlgyX0wyQ1RYX05YX0JESEFERFJfSEksIHZhbCk7CiAJcnhiZC0+cnhfYmRfaGFkZHJfaGkgPSB2YWw7CiAKLQl2YWwgPSAodTY0KSAocmluZ19tYXAgKyBCTlgyX1BBR0VfU0laRSkgJiAweGZmZmZmZmZmOworCXZhbCA9ICh1NjQpIChyaW5nX21hcCArIENOSUNfUEFHRV9TSVpFKSAmIDB4ZmZmZmZmZmY7CiAJY25pY19jdHhfd3IoZGV2LCBjaWRfYWRkciwgQk5YMl9MMkNUWF9OWF9CREhBRERSX0xPLCB2YWwpOwogCXJ4YmQtPnJ4X2JkX2hhZGRyX2xvID0gdmFsOwogCkBAIC00NzA5LDEwICs0NzEwLDEwIEBACiAKIAl2YWwgPSBDTklDX1JEKGRldiwgQk5YMl9NUV9DT05GSUcpOwogCXZhbCAmPSB+Qk5YMl9NUV9DT05GSUdfS05MX0JZUF9CTEtfU0laRTsKLQlpZiAoQk5YMl9QQUdFX0JJVFMgPiAxMikKKwlpZiAoQ05JQ19QQUdFX0JJVFMgPiAxMikKIAkJdmFsIHw9ICgxMiAtIDgpICA8PCA0OwogCWVsc2UKLQkJdmFsIHw9IChCTlgyX1BBR0VfQklUUyAtIDgpICA8PCA0OworCQl2YWwgfD0gKENOSUNfUEFHRV9CSVRTIC0gOCkgIDw8IDQ7CiAKIAlDTklDX1dSKGRldiwgQk5YMl9NUV9DT05GSUcsIHZhbCk7CiAKQEAgLTQ3NDIsMTMgKzQ3NDMsMTMgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIGtlcm5lbCB3b3JrIHF1ZXVlIGNvbnRleHQuICovCiAJdmFsID0gS1JOTFFfVFlQRV9UWVBFX0tSTkxRIHwgS1JOTFFfU0laRV9UWVBFX1NJWkUgfAotCSAgICAgIChCTlgyX1BBR0VfQklUUyAtIDgpIHwgS1JOTFFfRkxBR1NfUUVfU0VMRl9TRVE7CisJICAgICAgKENOSUNfUEFHRV9CSVRTIC0gOCkgfCBLUk5MUV9GTEFHU19RRV9TRUxGX1NFUTsKIAljbmljX2N0eF93cihkZXYsIGt3cV9jaWRfYWRkciwgTDVfS1JOTFFfVFlQRSwgdmFsKTsKIAotCXZhbCA9IChCTlgyX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qga3dxZSkgLSAxKSA8PCAxNjsKKwl2YWwgPSAoQ05JQ19QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGt3cWUpIC0gMSkgPDwgMTY7CiAJY25pY19jdHhfd3IoZGV2LCBrd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1FFX1NFTEZfU0VRX01BWCwgdmFsKTsKIAotCXZhbCA9ICgoQk5YMl9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGt3cWUpKSA8PCAxNikgfCBLV1FfUEFHRV9DTlQ7CisJdmFsID0gKChDTklDX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qga3dxZSkpIDw8IDE2KSB8IEtXUV9QQUdFX0NOVDsKIAljbmljX2N0eF93cihkZXYsIGt3cV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfTlBBR0VTLCB2YWwpOwogCiAJdmFsID0gKHUzMikgKCh1NjQpIGNwLT5rd3FfaW5mby5wZ3RibF9tYXAgPj4gMzIpOwpAQCAtNDc2OCwxMyArNDc2OSwxMyBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUga2VybmVsIGNvbXBsZXRlIHF1ZXVlIGNvbnRleHQuICovCiAJdmFsID0gS1JOTFFfVFlQRV9UWVBFX0tSTkxRIHwgS1JOTFFfU0laRV9UWVBFX1NJWkUgfAotCSAgICAgIChCTlgyX1BBR0VfQklUUyAtIDgpIHwgS1JOTFFfRkxBR1NfUUVfU0VMRl9TRVE7CisJICAgICAgKENOSUNfUEFHRV9CSVRTIC0gOCkgfCBLUk5MUV9GTEFHU19RRV9TRUxGX1NFUTsKIAljbmljX2N0eF93cihkZXYsIGtjcV9jaWRfYWRkciwgTDVfS1JOTFFfVFlQRSwgdmFsKTsKIAotCXZhbCA9IChCTlgyX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qga2NxZSkgLSAxKSA8PCAxNjsKKwl2YWwgPSAoQ05JQ19QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGtjcWUpIC0gMSkgPDwgMTY7CiAJY25pY19jdHhfd3IoZGV2LCBrY3FfY2lkX2FkZHIsIEw1X0tSTkxRX1FFX1NFTEZfU0VRX01BWCwgdmFsKTsKIAotCXZhbCA9ICgoQk5YMl9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGtjcWUpKSA8PCAxNikgfCBLQ1FfUEFHRV9DTlQ7CisJdmFsID0gKChDTklDX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qga2NxZSkpIDw8IDE2KSB8IEtDUV9QQUdFX0NOVDsKIAljbmljX2N0eF93cihkZXYsIGtjcV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfTlBBR0VTLCB2YWwpOwogCiAJdmFsID0gKHUzMikgKCh1NjQpIGNwLT5rY3ExLmRtYS5wZ3RibF9tYXAgPj4gMzIpOwpAQCAtNDkxOCw3ICs0OTE5LDcgQEAKIAl1MzIgY2xpID0gY3AtPmV0aGRldi0+aXNjc2lfbDJfY2xpZW50X2lkOwogCXUzMiB2YWw7CiAKLQltZW1zZXQodHhiZCwgMCwgQk5YMl9QQUdFX1NJWkUpOworCW1lbXNldCh0eGJkLCAwLCBDTklDX1BBR0VfU0laRSk7CiAKIAlidWZfbWFwID0gdWRldi0+bDJfYnVmX21hcDsKIAlmb3IgKGkgPSAwOyBpIDwgQk5YMl9NQVhfVFhfREVTQ19DTlQ7IGkgKz0gMywgdHhiZCArPSAzKSB7CkBAIC00OTc4LDkgKzQ5NzksOSBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYtPm5ldGRldik7CiAJc3RydWN0IGNuaWNfdWlvX2RldiAqdWRldiA9IGNwLT51ZGV2OwogCXN0cnVjdCBldGhfcnhfYmQgKnJ4YmQgPSAoc3RydWN0IGV0aF9yeF9iZCAqKSAodWRldi0+bDJfcmluZyArCi0JCQkJQk5YMl9QQUdFX1NJWkUpOworCQkJCUNOSUNfUEFHRV9TSVpFKTsKIAlzdHJ1Y3QgZXRoX3J4X2NxZV9uZXh0X3BhZ2UgKnJ4Y3FlID0gKHN0cnVjdCBldGhfcnhfY3FlX25leHRfcGFnZSAqKQotCQkJCSh1ZGV2LT5sMl9yaW5nICsgKDIgKiBCTlgyX1BBR0VfU0laRSkpOworCQkJCSh1ZGV2LT5sMl9yaW5nICsgKDIgKiBDTklDX1BBR0VfU0laRSkpOwogCXN0cnVjdCBob3N0X3NwX3N0YXR1c19ibG9jayAqc2IgPSBjcC0+Ym54MnhfZGVmX3N0YXR1c19ibGs7CiAJaW50IGk7CiAJdTMyIGNsaSA9IGNwLT5ldGhkZXYtPmlzY3NpX2wyX2NsaWVudF9pZDsKQEAgLTUwMDQsMjAgKzUwMDUsMjAgQEAKIAkJcnhiZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKGJ1Zl9tYXAgJiAweGZmZmZmZmZmKTsKIAl9CiAKLQl2YWwgPSAodTY0KSAocmluZ19tYXAgKyBCTlgyX1BBR0VfU0laRSkgPj4gMzI7CisJdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgQ05JQ19QQUdFX1NJWkUpID4+IDMyOwogCXJ4YmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMih2YWwpOwogCWRhdGEtPnJ4LmJkX3BhZ2VfYmFzZS5oaSA9IGNwdV90b19sZTMyKHZhbCk7CiAKLQl2YWwgPSAodTY0KSAocmluZ19tYXAgKyBCTlgyX1BBR0VfU0laRSkgJiAweGZmZmZmZmZmOworCXZhbCA9ICh1NjQpIChyaW5nX21hcCArIENOSUNfUEFHRV9TSVpFKSAmIDB4ZmZmZmZmZmY7CiAJcnhiZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKHZhbCk7CiAJZGF0YS0+cnguYmRfcGFnZV9iYXNlLmxvID0gY3B1X3RvX2xlMzIodmFsKTsKIAogCXJ4Y3FlICs9IEJOWDJYX01BWF9SQ1FfREVTQ19DTlQ7Ci0JdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgKDIgKiBCTlgyX1BBR0VfU0laRSkpID4+IDMyOworCXZhbCA9ICh1NjQpIChyaW5nX21hcCArICgyICogQ05JQ19QQUdFX1NJWkUpKSA+PiAzMjsKIAlyeGNxZS0+YWRkcl9oaSA9IGNwdV90b19sZTMyKHZhbCk7CiAJZGF0YS0+cnguY3FlX3BhZ2VfYmFzZS5oaSA9IGNwdV90b19sZTMyKHZhbCk7CiAKLQl2YWwgPSAodTY0KSAocmluZ19tYXAgKyAoMiAqIEJOWDJfUEFHRV9TSVpFKSkgJiAweGZmZmZmZmZmOworCXZhbCA9ICh1NjQpIChyaW5nX21hcCArICgyICogQ05JQ19QQUdFX1NJWkUpKSAmIDB4ZmZmZmZmZmY7CiAJcnhjcWUtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMih2YWwpOwogCWRhdGEtPnJ4LmNxZV9wYWdlX2Jhc2UubG8gPSBjcHVfdG9fbGUzMih2YWwpOwogCkBAIC01MjY1LDggKzUyNjYsOCBAQAogCQltc2xlZXAoMTApOwogCX0KIAljbGVhcl9iaXQoQ05JQ19MQ0xfRkxfUklOR1NfSU5JVEVELCAmY3AtPmNuaWNfbG9jYWxfZmxhZ3MpOwotCXJ4X3JpbmcgPSB1ZGV2LT5sMl9yaW5nICsgQk5YMl9QQUdFX1NJWkU7Ci0JbWVtc2V0KHJ4X3JpbmcsIDAsIEJOWDJfUEFHRV9TSVpFKTsKKwlyeF9yaW5nID0gdWRldi0+bDJfcmluZyArIENOSUNfUEFHRV9TSVpFOworCW1lbXNldChyeF9yaW5nLCAwLCBDTklDX1BBR0VfU0laRSk7CiB9CiAKIHN0YXRpYyBpbnQgY25pY19yZWdpc3Rlcl9uZXRkZXYoc3RydWN0IGNuaWNfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmgKaW5kZXggMGQ2YjEzZi4uZDUzNWFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGNuaWMuaDogQnJvYWRjb20gQ05JQyBjb3JlIG5ldHdvcmsgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2RlZnMuaAppbmRleCA5NWE4ZTRiLi5kY2JjYTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2RlZnMuaApAQCAtMSw3ICsxLDcgQEAKIAogLyogY25pYy5jOiBCcm9hZGNvbSBDTklDIGNvcmUgbmV0d29yayBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmgKaW5kZXggOGNmNmIxOTIuLjVmNGQ1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWNfaWYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjbmljX2lmLmg6IEJyb2FkY29tIENOSUMgY29yZSBuZXR3b3JrIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE0LDggKzE0LDggQEAKIAogI2luY2x1ZGUgImJueDJ4L2JueDJ4X21md19yZXEuaCIKIAotI2RlZmluZSBDTklDX01PRFVMRV9WRVJTSU9OCSIyLjUuMTkiCi0jZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIkRlY2VtYmVyIDE5LCAyMDEzIgorI2RlZmluZSBDTklDX01PRFVMRV9WRVJTSU9OCSIyLjUuMjAiCisjZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIk1hcmNoIDE0LCAyMDE0IgogCiAjZGVmaW5lIENOSUNfVUxQX1JETUEJCTAKICNkZWZpbmUgQ05JQ19VTFBfSVNDU0kJCTEKQEAgLTI0LDYgKzI0LDE2IEBACiAjZGVmaW5lIE1BWF9DTklDX1VMUF9UWVBFX0VYVAkzCiAjZGVmaW5lIE1BWF9DTklDX1VMUF9UWVBFCTQKIAorLyogVXNlIENQVSBuYXRpdmUgcGFnZSBzaXplIHVwIHRvIDE2SyBmb3IgY25pYyByaW5nIHNpemVzLiAgKi8KKyNpZiAoUEFHRV9TSElGVCA+IDE0KQorI2RlZmluZSBDTklDX1BBR0VfQklUUwkxNAorI2Vsc2UKKyNkZWZpbmUgQ05JQ19QQUdFX0JJVFMJUEFHRV9TSElGVAorI2VuZGlmCisjZGVmaW5lIENOSUNfUEFHRV9TSVpFCSgxIDw8IChDTklDX1BBR0VfQklUUykpCisjZGVmaW5lIENOSUNfUEFHRV9BTElHTihhZGRyKSBBTElHTihhZGRyLCBDTklDX1BBR0VfU0laRSkKKyNkZWZpbmUgQ05JQ19QQUdFX01BU0sJKH4oKENOSUNfUEFHRV9TSVpFKSAtIDEpKQorCiBzdHJ1Y3Qga3dxZSB7CiAJdTMyIGt3cWVfb3BfZmxhZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwppbmRleCAzYjZkMGJhLi43MGEyMjVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKQEAgLTE3NjQ5LDggKzE3NjQ5LDYgQEAKIAogCXRnM19pbml0X2J1Zm1ncl9jb25maWcodHApOwogCi0JZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWDsKLQogCS8qIDU3MDAgQjAgY2hpcHMgZG8gbm90IHN1cHBvcnQgY2hlY2tzdW1taW5nIGNvcnJlY3RseSBkdWUKIAkgKiB0byBoYXJkd2FyZSBidWdzLgogCSAqLwpAQCAtMTc2ODIsNyArMTc2ODAsOCBAQAogCQkJZmVhdHVyZXMgfD0gTkVUSUZfRl9UU09fRUNOOwogCX0KIAotCWRldi0+ZmVhdHVyZXMgfD0gZmVhdHVyZXM7CisJZGV2LT5mZWF0dXJlcyB8PSBmZWF0dXJlcyB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKKwkJCSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWDsKIAlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gZmVhdHVyZXM7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKaW5kZXggZjQxOGY0Zi4uOGQ3NmZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgpAQCAtODgsOCArODksOSBAQAogI2RlZmluZSAgICAgIE1WTkVUQV9UWF9JTl9QUkdSUyAgICAgICAgICAgICAgICAgIEJJVCgxKQogI2RlZmluZSAgICAgIE1WTkVUQV9UWF9GSUZPX0VNUFRZICAgICAgICAgICAgICAgIEJJVCg4KQogI2RlZmluZSBNVk5FVEFfUlhfTUlOX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAgIDB4MjQ3YwotI2RlZmluZSBNVk5FVEFfU0dNSUlfU0VSREVTX0NGRwkJCSAweDI0QTAKKyNkZWZpbmUgTVZORVRBX1NFUkRFU19DRkcJCQkgMHgyNEEwCiAjZGVmaW5lICAgICAgTVZORVRBX1NHTUlJX1NFUkRFU19QUk9UTwkJIDB4MGNjNworI2RlZmluZSAgICAgIE1WTkVUQV9SR01JSV9TRVJERVNfUFJPVE8JCSAweDA2NjcKICNkZWZpbmUgTVZORVRBX1RZUEVfUFJJTyAgICAgICAgICAgICAgICAgICAgICAgICAweDI0YmMKICNkZWZpbmUgICAgICBNVk5FVEFfRk9SQ0VfVU5JICAgICAgICAgICAgICAgICAgICBCSVQoMjEpCiAjZGVmaW5lIE1WTkVUQV9UWFFfQ01EXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNGU0CkBAIC0xNjEsNyArMTYzLDcgQEAKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19NQVhfUlhfU0laRV9NQVNLICAgICAgICAweDdmZmMKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzBfUE9SVF9FTkFCTEUgICAgICAgICAgICBCSVQoMCkKICNkZWZpbmUgTVZORVRBX0dNQUNfQ1RSTF8yICAgICAgICAgICAgICAgICAgICAgICAweDJjMDgKLSNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUFNDX0VOQUJMRSAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUENTX0VOQUJMRSAgICAgICAgICAgICBCSVQoMykKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUE9SVF9SR01JSSAgICAgICAgICAgICBCSVQoNCkKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUE9SVF9SRVNFVCAgICAgICAgICAgICBCSVQoNikKICNkZWZpbmUgTVZORVRBX0dNQUNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAweDJjMTAKQEAgLTcxMCwzNSArNzEyLDYgQEAKIAltdnJlZ193cml0ZShwcCwgTVZORVRBX1JYUV9DT05GSUdfUkVHKHJ4cS0+aWQpLCB2YWwpOwogfQogCi0KLQotLyogU2V0cyB0aGUgUkdNSUkgRW5hYmxlIGJpdCAoUkdNSUlFbikgaW4gcG9ydCBNQUMgY29udHJvbCByZWdpc3RlciAqLwotc3RhdGljIHZvaWQgbXZuZXRhX2dtYWNfcmdtaWlfc2V0KHN0cnVjdCBtdm5ldGFfcG9ydCAqcHAsIGludCBlbmFibGUpCi17Ci0JdTMyICB2YWw7Ci0KLQl2YWwgPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfR01BQ19DVFJMXzIpOwotCi0JaWYgKGVuYWJsZSkKLQkJdmFsIHw9IE1WTkVUQV9HTUFDMl9QT1JUX1JHTUlJOwotCWVsc2UKLQkJdmFsICY9IH5NVk5FVEFfR01BQzJfUE9SVF9SR01JSTsKLQotCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19DVFJMXzIsIHZhbCk7Ci19Ci0KLS8qIENvbmZpZyBTR01JSSBwb3J0ICovCi1zdGF0aWMgdm9pZCBtdm5ldGFfcG9ydF9zZ21paV9jb25maWcoc3RydWN0IG12bmV0YV9wb3J0ICpwcCkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfQ1RSTF8yKTsKLQl2YWwgfD0gTVZORVRBX0dNQUMyX1BTQ19FTkFCTEU7Ci0JbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9HTUFDX0NUUkxfMiwgdmFsKTsKLQotCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfU0dNSUlfU0VSREVTX0NGRywgTVZORVRBX1NHTUlJX1NFUkRFU19QUk9UTyk7Ci19Ci0KIC8qIFN0YXJ0IHRoZSBFdGhlcm5ldCBwb3J0IFJYIGFuZCBUWCBhY3Rpdml0eSAqLwogc3RhdGljIHZvaWQgbXZuZXRhX3BvcnRfdXAoc3RydWN0IG12bmV0YV9wb3J0ICpwcCkKIHsKQEAgLTI3NTYsMTIgKzI3MjksMTUgQEAKIAltdnJlZ193cml0ZShwcCwgTVZORVRBX1VOSVRfSU5UUl9DQVVTRSwgMCk7CiAKIAlpZiAocGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKQotCQltdm5ldGFfcG9ydF9zZ21paV9jb25maWcocHApOworCQltdnJlZ193cml0ZShwcCwgTVZORVRBX1NFUkRFU19DRkcsIE1WTkVUQV9TR01JSV9TRVJERVNfUFJPVE8pOworCWVsc2UKKwkJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9TRVJERVNfQ0ZHLCBNVk5FVEFfUkdNSUlfU0VSREVTX1BST1RPKTsKIAotCW12bmV0YV9nbWFjX3JnbWlpX3NldChwcCwgMSk7CisJdmFsID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfQ1RSTF8yKTsKKworCXZhbCB8PSBNVk5FVEFfR01BQzJfUENTX0VOQUJMRSB8IE1WTkVUQV9HTUFDMl9QT1JUX1JHTUlJOwogCiAJLyogQ2FuY2VsIFBvcnQgUmVzZXQgKi8KLQl2YWwgPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfR01BQ19DVFJMXzIpOwogCXZhbCAmPSB+TVZORVRBX0dNQUMyX1BPUlRfUkVTRVQ7CiAJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9HTUFDX0NUUkxfMiwgdmFsKTsKIApAQCAtMjc3NCw2ICsyNzUwLDcgQEAKIHN0YXRpYyBpbnQgbXZuZXRhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJY29uc3Qgc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbyAqZHJhbV90YXJnZXRfaW5mbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpwaHlfbm9kZTsKIAl1MzIgcGh5X2FkZHI7CkBAIC0yODM4LDkgKzI4MTUsMTUgQEAKIAogCWNsa19wcmVwYXJlX2VuYWJsZShwcC0+Y2xrKTsKIAotCXBwLT5iYXNlID0gb2ZfaW9tYXAoZG4sIDApOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXBwLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CiAJaWYgKHBwLT5iYXNlID09IE5VTEwpIHsKLQkJZXJyID0gLUVOT01FTTsKKwkJZXJyID0gUFRSX0VSUihwcC0+YmFzZSk7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAKQEAgLTI4NDgsNyArMjgzMSw3IEBACiAJcHAtPnN0YXRzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBtdm5ldGFfcGNwdV9zdGF0cyk7CiAJaWYgKCFwcC0+c3RhdHMpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfdW5tYXA7CisJCWdvdG8gZXJyX2NsazsKIAl9CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CkBAIC0yOTEzLDggKzI4OTYsNiBAQAogCW12bmV0YV9kZWluaXQocHApOwogZXJyX2ZyZWVfc3RhdHM6CiAJZnJlZV9wZXJjcHUocHAtPnN0YXRzKTsKLWVycl91bm1hcDoKLQlpb3VubWFwKHBwLT5iYXNlKTsKIGVycl9jbGs6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBwLT5jbGspOwogZXJyX2ZyZWVfaXJxOgpAQCAtMjkzNCw3ICsyOTE1LDYgQEAKIAltdm5ldGFfZGVpbml0KHBwKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocHAtPmNsayk7CiAJZnJlZV9wZXJjcHUocHAtPnN0YXRzKTsKLQlpb3VubWFwKHBwLT5iYXNlKTsKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKGRldi0+aXJxKTsKIAlmcmVlX25ldGRldihkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jCmluZGV4IDkzNmMxNTMuLmQ0MTNlNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jCkBAIC0yNjgxLDcgKzI2ODEsMTEgQEAKIAogc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgbWx4NF9wY2lfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlpbnQgcmV0ID0gX19tbHg0X2luaXRfb25lKHBkZXYsIDApOworCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZDsKKwlpbnQgcmV0OworCisJaWQgPSBwY2lfbWF0Y2hfaWQobWx4NF9wY2lfdGFibGUsIHBkZXYpOworCXJldCA9IF9fbWx4NF9pbml0X29uZShwZGV2LCBpZC0+ZHJpdmVyX2RhdGEpOwogCiAJcmV0dXJuIHJldCA/IFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QgOiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxLmMKaW5kZXggNzI3YjU0NmEuLmUwYzkyZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NTEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L2VlcHJvbV85M2N4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCkBAIC04Myw2ICs4NCw3IEBACiAgKiBAcmNfcnhxY3I6IENhY2hlZCBjb3B5IG9mIEtTX1JYUUNSLgogICogQGVlcHJvbV9zaXplOiBDb21wYW5pb24gZWVwcm9tIHNpemUgaW4gQnl0ZXMsIDAgaWYgbm8gZWVwcm9tCiAgKiBAZWVwcm9tOiA5M0NYNiBFRVBST00gc3RhdGUgZm9yIGFjY2Vzc2luZyBvbi1ib2FyZCBFRVBST00uCisgKiBAdmRkX3JlZzoJT3B0aW9uYWwgcmVndWxhdG9yIHN1cHBseWluZyB0aGUgY2hpcAogICoKICAqIFRoZSBAbG9jayBlbnN1cmVzIHRoYXQgdGhlIGNoaXAgaXMgcHJvdGVjdGVkIHdoZW4gY2VydGFpbiBvcGVyYXRpb25zIGFyZQogICogaW4gcHJvZ3Jlc3MuIFdoZW4gdGhlIHJlYWQgb3Igd3JpdGUgcGFja2V0IHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLCBtb3N0CkBAIC0xMzAsNiArMTMyLDcgQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXNwaV94ZmVyMlsyXTsKIAogCXN0cnVjdCBlZXByb21fOTNjeDYJZWVwcm9tOworCXN0cnVjdCByZWd1bGF0b3IJKnZkZF9yZWc7CiB9OwogCiBzdGF0aWMgaW50IG1zZ19lbmFibGU7CkBAIC0xNDE0LDYgKzE0MTcsMjEgQEAKIAlrcy0+c3BpZGV2ID0gc3BpOwogCWtzLT50eF9zcGFjZSA9IDYxNDQ7CiAKKwlrcy0+dmRkX3JlZyA9IHJlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoJnNwaS0+ZGV2LCAidmRkIik7CisJaWYgKElTX0VSUihrcy0+dmRkX3JlZykpIHsKKwkJcmV0ID0gUFRSX0VSUihrcy0+dmRkX3JlZyk7CisJCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJCWdvdG8gZXJyX3JlZzsKKwl9IGVsc2UgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGtzLT52ZGRfcmVnKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJyZWd1bGF0b3IgZW5hYmxlIGZhaWw6ICVkXG4iLAorCQkJCXJldCk7CisJCQlnb3RvIGVycl9yZWdfZW47CisJCX0KKwl9CisKKwogCW11dGV4X2luaXQoJmtzLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgma3MtPnN0YXRlbG9jayk7CiAKQEAgLTE1MDgsOCArMTUyNiwxNCBAQAogZXJyX25ldGRldjoKIAlmcmVlX2lycShuZGV2LT5pcnEsIGtzKTsKIAotZXJyX2lkOgogZXJyX2lycToKK2Vycl9pZDoKKwlpZiAoIUlTX0VSUihrcy0+dmRkX3JlZykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGtzLT52ZGRfcmVnKTsKK2Vycl9yZWdfZW46CisJaWYgKCFJU19FUlIoa3MtPnZkZF9yZWcpKQorCQlyZWd1bGF0b3JfcHV0KGtzLT52ZGRfcmVnKTsKK2Vycl9yZWc6CiAJZnJlZV9uZXRkZXYobmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MjMsNiArMTU0NywxMCBAQAogCiAJdW5yZWdpc3Rlcl9uZXRkZXYocHJpdi0+bmV0ZGV2KTsKIAlmcmVlX2lycShzcGktPmlycSwgcHJpdik7CisJaWYgKCFJU19FUlIocHJpdi0+dmRkX3JlZykpIHsKKwkJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+dmRkX3JlZyk7CisJCXJlZ3VsYXRvcl9wdXQocHJpdi0+dmRkX3JlZyk7CisJfQogCWZyZWVfbmV0ZGV2KHByaXYtPm5ldGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZV9tYWluLmMKaW5kZXggY2UyY2ZkZC4uNjU2YzY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZV9tYWluLmMKQEAgLTQ3NjUsNyArNDc2NSw5IEBACiAJbmRldi0+ZmVhdHVyZXMgPSBuZGV2LT5od19mZWF0dXJlczsKIAluZGV2LT52bGFuX2ZlYXR1cmVzID0gbmRldi0+aHdfZmVhdHVyZXM7CiAJLyogdmxhbiBnZXRzIHNhbWUgZmVhdHVyZXMgKGV4Y2VwdCB2bGFuIGZpbHRlcikgKi8KLQluZGV2LT52bGFuX2ZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fQ1RBR19GSUxURVI7CisJbmRldi0+dmxhbl9mZWF0dXJlcyAmPSB+KE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUiB8CisJCQkJIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKKwkJCQkgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpOwogCiAJaWYgKHRlc3RfYml0KFFMX0RNQTY0LCAmcWRldi0+ZmxhZ3MpKQogCQluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKaW5kZXggZmZkNGQxMi4uN2Q2ZDhlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwpAQCAtMjIyOSwxMCArMjIyOSw2IEBACiAJCWdvdG8gY2xlYW5fYWxlX3JldDsKIAl9CiAKLQlpZiAoY3B0c19yZWdpc3RlcigmcGRldi0+ZGV2LCBwcml2LT5jcHRzLAotCQkJICBkYXRhLT5jcHRzX2Nsb2NrX211bHQsIGRhdGEtPmNwdHNfY2xvY2tfc2hpZnQpKQotCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIHJlZ2lzdGVyaW5nIGNwdHMgZGV2aWNlXG4iKTsKLQogCWNwc3dfbm90aWNlKHByaXYsIHByb2JlLCAiaW5pdGlhbGl6ZWQgZGV2aWNlIChyZWdzICVwYSwgaXJxICVkKVxuIiwKIAkJICAgICZzc19yZXMtPnN0YXJ0LCBuZGV2LT5pcnEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKaW5kZXggMzY0ZDBjNy4uODhlZjI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJaW50IGk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwotCWlmIChjdGxyLT5zdGF0ZSAhPSBDUERNQV9TVEFURV9BQ1RJVkUpIHsKKwlpZiAoY3Rsci0+c3RhdGUgPT0gQ1BETUFfU1RBVEVfVEVBUkRPV04pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC04OTEsNyArODkxLDcgQEAKIAl1bnNpZ25lZAkJdGltZW91dDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGNoYW4tPnN0YXRlICE9IENQRE1BX1NUQVRFX0FDVElWRSkgeworCWlmIChjaGFuLT5zdGF0ZSA9PSBDUERNQV9TVEFURV9URUFSRE9XTikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfZW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMKaW5kZXggY2Q5YjE2NC4uOGYwZTY5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMKQEAgLTE1MzIsOSArMTUzMiw5IEBACiAJc3RydWN0IGRldmljZSAqZW1hY19kZXYgPSAmbmRldi0+ZGV2OwogCXUzMiBjbnQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IHJldDsKKwlpbnQgcSwgbSwgcmV0OworCWludCByZXNfbnVtID0gMCwgaXJxX251bSA9IDA7CiAJaW50IGkgPSAwOwotCWludCBrID0gMDsKIAlzdHJ1Y3QgZW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAKIAlwbV9ydW50aW1lX2dldCgmcHJpdi0+cGRldi0+ZGV2KTsKQEAgLTE1NjQsMTUgKzE1NjQsMjQgQEAKIAl9CiAKIAkvKiBSZXF1ZXN0IElSUSAqLworCXdoaWxlICgocmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHByaXYtPnBkZXYsIElPUkVTT1VSQ0VfSVJRLAorCQkJCQkgICAgcmVzX251bSkpKSB7CisJCWZvciAoaXJxX251bSA9IHJlcy0+c3RhcnQ7IGlycV9udW0gPD0gcmVzLT5lbmQ7IGlycV9udW0rKykgeworCQkJZGV2X2VycihlbWFjX2RldiwgIlJlcXVlc3QgSVJRICVkXG4iLCBpcnFfbnVtKTsKKwkJCWlmIChyZXF1ZXN0X2lycShpcnFfbnVtLCBlbWFjX2lycSwgMCwgbmRldi0+bmFtZSwKKwkJCQkJbmRldikpIHsKKwkJCQlkZXZfZXJyKGVtYWNfZGV2LAorCQkJCQkiRGFWaW5jaSBFTUFDOiByZXF1ZXN0X2lycSgpIGZhaWxlZFxuIik7CisJCQkJcmV0ID0gLUVCVVNZOwogCi0Jd2hpbGUgKChyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocHJpdi0+cGRldiwgSU9SRVNPVVJDRV9JUlEsIGspKSkgewotCQlmb3IgKGkgPSByZXMtPnN0YXJ0OyBpIDw9IHJlcy0+ZW5kOyBpKyspIHsKLQkJCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwcml2LT5wZGV2LT5kZXYsIGksIGVtYWNfaXJxLAotCQkJCQkgICAgIDAsIG5kZXYtPm5hbWUsIG5kZXYpKQogCQkJCWdvdG8gcm9sbGJhY2s7CisJCQl9CiAJCX0KLQkJaysrOworCQlyZXNfbnVtKys7CiAJfQorCS8qIHByZXBhcmUgY291bnRlcnMgZm9yIHJvbGxiYWNrIGluIGNhc2Ugb2YgYW4gZXJyb3IgKi8KKwlyZXNfbnVtLS07CisJaXJxX251bS0tOwogCiAJLyogU3RhcnQvRW5hYmxlIEVNQUMgaGFyZHdhcmUgKi8KIAllbWFjX2h3X2VuYWJsZShwcml2KTsKQEAgLTE2MzksMTEgKzE2NDgsMjMgQEAKIAogCXJldHVybiAwOwogCi1yb2xsYmFjazoKLQotCWRldl9lcnIoZW1hY19kZXYsICJEYVZpbmNpIEVNQUM6IGRldm1fcmVxdWVzdF9pcnEoKSBmYWlsZWQiKTsKLQlyZXQgPSAtRUJVU1k7CiBlcnI6CisJZW1hY19pbnRfZGlzYWJsZShwcml2KTsKKwluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOworCityb2xsYmFjazoKKwlmb3IgKHEgPSByZXNfbnVtOyBxID49IDA7IHEtLSkgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocHJpdi0+cGRldiwgSU9SRVNPVVJDRV9JUlEsIHEpOworCQkvKiBhdCB0aGUgZmlyc3QgaXRlcmF0aW9uLCBpcnFfbnVtIGlzIGFscmVhZHkgc2V0IHRvIHRoZQorCQkgKiByaWdodCB2YWx1ZQorCQkgKi8KKwkJaWYgKHEgIT0gcmVzX251bSkKKwkJCWlycV9udW0gPSByZXMtPmVuZDsKKworCQlmb3IgKG0gPSBpcnFfbnVtOyBtID49IHJlcy0+c3RhcnQ7IG0tLSkKKwkJCWZyZWVfaXJxKG0sIG5kZXYpOworCX0KKwljcGRtYV9jdGxyX3N0b3AocHJpdi0+ZG1hKTsKIAlwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTY1OSw2ICsxNjgwLDkgQEAKICAqLwogc3RhdGljIGludCBlbWFjX2Rldl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogeworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpID0gMDsKKwlpbnQgaXJxX251bTsKIAlzdHJ1Y3QgZW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGRldmljZSAqZW1hY19kZXYgPSAmbmRldi0+ZGV2OwogCkBAIC0xNjc0LDYgKzE2OTgsMTMgQEAKIAlpZiAocHJpdi0+cGh5ZGV2KQogCQlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOwogCisJLyogRnJlZSBJUlEgKi8KKwl3aGlsZSAoKHJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwcml2LT5wZGV2LCBJT1JFU09VUkNFX0lSUSwgaSkpKSB7CisJCWZvciAoaXJxX251bSA9IHJlcy0+c3RhcnQ7IGlycV9udW0gPD0gcmVzLT5lbmQ7IGlycV9udW0rKykKKwkJCWZyZWVfaXJxKGlycV9udW0sIHByaXYtPm5kZXYpOworCQlpKys7CisJfQorCiAJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpCiAJCWRldl9ub3RpY2UoZW1hY19kZXYsICJEYVZpbmNpIEVNQUM6ICVzIHN0b3BwZWRcbiIsIG5kZXYtPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMKaW5kZXggZWYzMTJiYy4uNmFjMjBhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtcmhpbmUuYwpAQCAtOTIzLDcgKzkyMyw3IEBACiAJaWYgKHJjKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZCE/XG4iKTsKLQkJZ290byBlcnJfb3V0OworCQlnb3RvIGVycl9vdXRfcGNpX2Rpc2FibGU7CiAJfQogCiAJLyogc2FuaXR5IGNoZWNrICovCkBAIC05MzEsNyArOTMxLDcgQEAKIAkgICAgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBpb19zaXplKSkgewogCQlyYyA9IC1FSU87CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkluc3VmZmljaWVudCBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7Ci0JCWdvdG8gZXJyX291dDsKKwkJZ290byBlcnJfb3V0X3BjaV9kaXNhYmxlOwogCX0KIAogCXBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CkBAIC05NDIsNyArOTQyLDcgQEAKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHJoaW5lX3ByaXZhdGUpKTsKIAlpZiAoIWRldikgewogCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKKwkJZ290byBlcnJfb3V0X3BjaV9kaXNhYmxlOwogCX0KIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCkBAIC0xMDg0LDYgKzEwODQsOCBAQAogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiBlcnJfb3V0X2ZyZWVfbmV0ZGV2OgogCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0X3BjaV9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIGVycl9vdXQ6CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWZiLmMgYi9kcml2ZXJzL25ldC9pZmIuYwppbmRleCBjMTRkMzliLi5kN2IyZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZmIuYworKysgYi9kcml2ZXJzL25ldC9pZmIuYwpAQCAtMTgwLDcgKzE4MCw4IEBACiAJZGV2LT50eF9xdWV1ZV9sZW4gPSBUWF9RX0xJTUlUOwogCiAJZGV2LT5mZWF0dXJlcyB8PSBJRkJfRkVBVFVSRVM7Ci0JZGV2LT52bGFuX2ZlYXR1cmVzIHw9IElGQl9GRUFUVVJFUzsKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gSUZCX0ZFQVRVUkVTICYgfihORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8CisJCQkJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCk7CiAKIAlkZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKIAlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKaW5kZXggNGI5NzBmNy4uMmY2OTg5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCkBAIC02ODMsMTAgKzY4Myw5IEBACiBpbnQgcGh5X3N1c3BlbmQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAlzdHJ1Y3QgcGh5X2RyaXZlciAqcGh5ZHJ2ID0gdG9fcGh5X2RyaXZlcihwaHlkZXYtPmRldi5kcml2ZXIpOwotCXN0cnVjdCBldGh0b29sX3dvbGluZm8gd29sOworCXN0cnVjdCBldGh0b29sX3dvbGluZm8gd29sID0geyAuY21kID0gRVRIVE9PTF9HV09MIH07CiAKIAkvKiBJZiB0aGUgZGV2aWNlIGhhcyBXT0wgZW5hYmxlZCwgd2UgY2Fubm90IHN1c3BlbmQgdGhlIFBIWSAqLwotCXdvbC5jbWQgPSBFVEhUT09MX0dXT0w7CiAJcGh5X2V0aHRvb2xfZ2V0X3dvbChwaHlkZXYsICZ3b2wpOwogCWlmICh3b2wud29sb3B0cykKIAkJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMgYi9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCmluZGV4IGRiZmYyOTAuLmQzNTBkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwpAQCAtNjgsNyArNjgsNiBAQAogc3RhdGljIGludCBjZGNfbmNtX3NldHVwKHN0cnVjdCB1c2JuZXQgKmRldikKIHsKIAlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07Ci0Jc3RydWN0IHVzYl9jZGNfbmNtX250Yl9wYXJhbWV0ZXJzIG5jbV9wYXJtOwogCXUzMiB2YWw7CiAJdTggZmxhZ3M7CiAJdTggaWZhY2Vfbm87CkBAIC04MiwyMiArODEsMjIgQEAKIAllcnIgPSB1c2JuZXRfcmVhZF9jbWQoZGV2LCBVU0JfQ0RDX0dFVF9OVEJfUEFSQU1FVEVSUywKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTgogCQkJICAgICAgfFVTQl9SRUNJUF9JTlRFUkZBQ0UsCi0JCQkgICAgICAwLCBpZmFjZV9ubywgJm5jbV9wYXJtLAotCQkJICAgICAgc2l6ZW9mKG5jbV9wYXJtKSk7CisJCQkgICAgICAwLCBpZmFjZV9ubywgJmN0eC0+bmNtX3Bhcm0sCisJCQkgICAgICBzaXplb2YoY3R4LT5uY21fcGFybSkpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LCAiZmFpbGVkIEdFVF9OVEJfUEFSQU1FVEVSU1xuIik7CiAJCXJldHVybiBlcnI7IC8qIEdFVF9OVEJfUEFSQU1FVEVSUyBpcyByZXF1aXJlZCAqLwogCX0KIAogCS8qIHJlYWQgY29ycmVjdCBzZXQgb2YgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gZGV2aWNlIG1vZGUgKi8KLQljdHgtPnJ4X21heCA9IGxlMzJfdG9fY3B1KG5jbV9wYXJtLmR3TnRiSW5NYXhTaXplKTsKLQljdHgtPnR4X21heCA9IGxlMzJfdG9fY3B1KG5jbV9wYXJtLmR3TnRiT3V0TWF4U2l6ZSk7Ci0JY3R4LT50eF9yZW1haW5kZXIgPSBsZTE2X3RvX2NwdShuY21fcGFybS53TmRwT3V0UGF5bG9hZFJlbWFpbmRlcik7Ci0JY3R4LT50eF9tb2R1bHVzID0gbGUxNl90b19jcHUobmNtX3Bhcm0ud05kcE91dERpdmlzb3IpOwotCWN0eC0+dHhfbmRwX21vZHVsdXMgPSBsZTE2X3RvX2NwdShuY21fcGFybS53TmRwT3V0QWxpZ25tZW50KTsKKwljdHgtPnJ4X21heCA9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpOworCWN0eC0+dHhfbWF4ID0gbGUzMl90b19jcHUoY3R4LT5uY21fcGFybS5kd050Yk91dE1heFNpemUpOworCWN0eC0+dHhfcmVtYWluZGVyID0gbGUxNl90b19jcHUoY3R4LT5uY21fcGFybS53TmRwT3V0UGF5bG9hZFJlbWFpbmRlcik7CisJY3R4LT50eF9tb2R1bHVzID0gbGUxNl90b19jcHUoY3R4LT5uY21fcGFybS53TmRwT3V0RGl2aXNvcik7CisJY3R4LT50eF9uZHBfbW9kdWx1cyA9IGxlMTZfdG9fY3B1KGN0eC0+bmNtX3Bhcm0ud05kcE91dEFsaWdubWVudCk7CiAJLyogZGV2aWNlcyBwcmlvciB0byBOQ00gRXJyYXRhIHNoYWxsIHNldCB0aGlzIGZpZWxkIHRvIHplcm8gKi8KLQljdHgtPnR4X21heF9kYXRhZ3JhbXMgPSBsZTE2X3RvX2NwdShuY21fcGFybS53TnRiT3V0TWF4RGF0YWdyYW1zKTsKLQludGJfZm10X3N1cHBvcnRlZCA9IGxlMTZfdG9fY3B1KG5jbV9wYXJtLmJtTnRiRm9ybWF0c1N1cHBvcnRlZCk7CisJY3R4LT50eF9tYXhfZGF0YWdyYW1zID0gbGUxNl90b19jcHUoY3R4LT5uY21fcGFybS53TnRiT3V0TWF4RGF0YWdyYW1zKTsKKwludGJfZm10X3N1cHBvcnRlZCA9IGxlMTZfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uYm1OdGJGb3JtYXRzU3VwcG9ydGVkKTsKIAogCS8qIHRoZXJlIGFyZSBzb21lIG1pbm9yIGRpZmZlcmVuY2VzIGluIE5DTSBhbmQgTUJJTSBkZWZhdWx0cyAqLwogCWlmIChjZGNfbmNtX2NvbW1faW50Zl9pc19tYmltKGN0eC0+Y29udHJvbC0+Y3VyX2FsdHNldHRpbmcpKSB7CkBAIC0xNDYsNyArMTQ1LDcgQEAKIAl9CiAKIAkvKiBpbmZvcm0gZGV2aWNlIGFib3V0IE5UQiBpbnB1dCBzaXplIGNoYW5nZXMgKi8KLQlpZiAoY3R4LT5yeF9tYXggIT0gbGUzMl90b19jcHUobmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpKSB7CisJaWYgKGN0eC0+cnhfbWF4ICE9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpKSB7CiAJCV9fbGUzMiBkd050YkluTWF4U2l6ZSA9IGNwdV90b19sZTMyKGN0eC0+cnhfbWF4KTsKIAogCQllcnIgPSB1c2JuZXRfd3JpdGVfY21kKGRldiwgVVNCX0NEQ19TRVRfTlRCX0lOUFVUX1NJWkUsCkBAIC0xNjIsMTQgKzE2MSw2IEBACiAJCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiVXNpbmcgZGVmYXVsdCBtYXhpbXVtIHRyYW5zbWl0IGxlbmd0aD0lZFxuIiwKIAkJCUNEQ19OQ01fTlRCX01BWF9TSVpFX1RYKTsKIAkJY3R4LT50eF9tYXggPSBDRENfTkNNX05UQl9NQVhfU0laRV9UWDsKLQotCQkvKiBBZGRpbmcgYSBwYWQgYnl0ZSBoZXJlIHNpbXBsaWZpZXMgdGhlIGhhbmRsaW5nIGluCi0JCSAqIGNkY19uY21fZmlsbF90eF9mcmFtZSwgYnkgbWFraW5nIHR4X21heCBhbHdheXMKLQkJICogcmVwcmVzZW50IHRoZSByZWFsIHNrYiBtYXggc2l6ZS4KLQkJICovCi0JCWlmIChjdHgtPnR4X21heCAlIHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBkZXYtPm91dCwgMSkgPT0gMCkKLQkJCWN0eC0+dHhfbWF4Kys7Ci0KIAl9CiAKIAkvKgpAQCAtNDM5LDYgKzQzMCwxMCBAQAogCQlnb3RvIGVycm9yMjsKIAl9CiAKKwkvKiBpbml0aWFsaXplIGRhdGEgaW50ZXJmYWNlICovCisJaWYgKGNkY19uY21fc2V0dXAoZGV2KSkKKwkJZ290byBlcnJvcjI7CisKIAkvKiBjb25maWd1cmUgZGF0YSBpbnRlcmZhY2UgKi8KIAl0ZW1wID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LCBpZmFjZV9ubywgZGF0YV9hbHRzZXR0aW5nKTsKIAlpZiAodGVtcCkgewpAQCAtNDUzLDEyICs0NDgsNiBAQAogCQlnb3RvIGVycm9yMjsKIAl9CiAKLQkvKiBpbml0aWFsaXplIGRhdGEgaW50ZXJmYWNlICovCi0JaWYgKGNkY19uY21fc2V0dXAoZGV2KSkJewotCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJjZGNfbmNtX3NldHVwKCkgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcjI7Ci0JfQotCiAJdXNiX3NldF9pbnRmZGF0YShjdHgtPmRhdGEsIGRldik7CiAJdXNiX3NldF9pbnRmZGF0YShjdHgtPmNvbnRyb2wsIGRldik7CiAKQEAgLTQ3NSw2ICs0NjQsMTUgQEAKIAlkZXYtPmhhcmRfbXR1ID0gY3R4LT50eF9tYXg7CiAJZGV2LT5yeF91cmJfc2l6ZSA9IGN0eC0+cnhfbWF4OwogCisJLyogY2RjX25jbV9zZXR1cCB3aWxsIG92ZXJyaWRlIGR3TnRiT3V0TWF4U2l6ZSBpZiBpdCBpcworCSAqIG91dHNpZGUgdGhlIHNhbmUgcmFuZ2UuIEFkZGluZyBhIHBhZCBieXRlIGhlcmUgaWYgbmVjZXNzYXJ5CisJICogc2ltcGxpZmllcyB0aGUgaGFuZGxpbmcgaW4gY2RjX25jbV9maWxsX3R4X2ZyYW1lLCBtYWtpbmcKKwkgKiB0eF9tYXggYWx3YXlzIHJlcHJlc2VudCB0aGUgcmVhbCBza2IgbWF4IHNpemUuCisJICovCisJaWYgKGN0eC0+dHhfbWF4ICE9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJPdXRNYXhTaXplKSAmJgorCSAgICBjdHgtPnR4X21heCAlIHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBkZXYtPm91dCwgMSkgPT0gMCkKKwkJY3R4LT50eF9tYXgrKzsKKwogCXJldHVybiAwOwogCiBlcnJvcjI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKaW5kZXggZGQxMGQ1OC4uZjllOTZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYwpAQCAtNzUyLDE0ICs3NTIsMTIgQEAKIC8vIHByZWNvbmRpdGlvbjogbmV2ZXIgY2FsbGVkIGluX2ludGVycnVwdAogc3RhdGljIHZvaWQgdXNibmV0X3Rlcm1pbmF0ZV91cmJzKHN0cnVjdCB1c2JuZXQgKmRldikKIHsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHVubGlua193YWtldXApOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCWludCB0ZW1wOwogCiAJLyogZW5zdXJlIHRoZXJlIGFyZSBubyBtb3JlIGFjdGl2ZSB1cmJzICovCi0JYWRkX3dhaXRfcXVldWUoJnVubGlua193YWtldXAsICZ3YWl0KTsKKwlhZGRfd2FpdF9xdWV1ZSgmZGV2LT53YWl0LCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCWRldi0+d2FpdCA9ICZ1bmxpbmtfd2FrZXVwOwogCXRlbXAgPSB1bmxpbmtfdXJicyhkZXYsICZkZXYtPnR4cSkgKwogCQl1bmxpbmtfdXJicyhkZXYsICZkZXYtPnJ4cSk7CiAKQEAgLTc3MywxNSArNzcxLDE0IEBACiAJCQkJICAid2FpdGVkIGZvciAlZCB1cmIgY29tcGxldGlvbnNcbiIsIHRlbXApOwogCX0KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCWRldi0+d2FpdCA9IE5VTEw7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnVubGlua193YWtldXAsICZ3YWl0KTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2LT53YWl0LCAmd2FpdCk7CiB9CiAKIGludCB1c2JuZXRfc3RvcCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlzdHJ1Y3QgdXNibmV0CQkqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlzdHJ1Y3QgZHJpdmVyX2luZm8JKmluZm8gPSBkZXYtPmRyaXZlcl9pbmZvOwotCWludAkJCXJldHZhbDsKKwlpbnQJCQlyZXR2YWwsIHBtOwogCiAJY2xlYXJfYml0KEVWRU5UX0RFVl9PUEVOLCAmZGV2LT5mbGFncyk7CiAJbmV0aWZfc3RvcF9xdWV1ZSAobmV0KTsKQEAgLTc5MSw2ICs3ODgsOCBAQAogCQkgICBuZXQtPnN0YXRzLnJ4X3BhY2tldHMsIG5ldC0+c3RhdHMudHhfcGFja2V0cywKIAkJICAgbmV0LT5zdGF0cy5yeF9lcnJvcnMsIG5ldC0+c3RhdHMudHhfZXJyb3JzKTsKIAorCS8qIHRvIG5vdCByYWNlIHJlc3VtZSAqLworCXBtID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGRldi0+aW50Zik7CiAJLyogYWxsb3cgbWluaWRyaXZlciB0byBzdG9wIGNvcnJlY3RseSAod2lyZWxlc3MgZGV2aWNlcyB0byB0dXJuIG9mZgogCSAqIHJhZGlvIGV0YykgKi8KIAlpZiAoaW5mby0+c3RvcCkgewpAQCAtODE3LDYgKzgxNiw5IEBACiAJZGV2LT5mbGFncyA9IDA7CiAJZGVsX3RpbWVyX3N5bmMgKCZkZXYtPmRlbGF5KTsKIAl0YXNrbGV0X2tpbGwgKCZkZXYtPmJoKTsKKwlpZiAoIXBtKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoZGV2LT5pbnRmKTsKKwogCWlmIChpbmZvLT5tYW5hZ2VfcG93ZXIgJiYKIAkgICAgIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9OT19SVU5USU1FX1BNLCAmZGV2LT5mbGFncykpCiAJCWluZm8tPm1hbmFnZV9wb3dlcihkZXYsIDApOwpAQCAtMTQzNywxMSArMTQzOSwxMiBAQAogCS8qIHJlc3RhcnQgUlggYWdhaW4gYWZ0ZXIgZGlzYWJsaW5nIGR1ZSB0byBoaWdoIGVycm9yIHJhdGUgKi8KIAljbGVhcl9iaXQoRVZFTlRfUlhfS0lMTCwgJmRldi0+ZmxhZ3MpOwogCi0JLy8gd2FpdGluZyBmb3IgYWxsIHBlbmRpbmcgdXJicyB0byBjb21wbGV0ZT8KLQlpZiAoZGV2LT53YWl0KSB7Ci0JCWlmICgoZGV2LT50eHEucWxlbiArIGRldi0+cnhxLnFsZW4gKyBkZXYtPmRvbmUucWxlbikgPT0gMCkgewotCQkJd2FrZV91cCAoZGV2LT53YWl0KTsKLQkJfQorCS8qIHdhaXRpbmcgZm9yIGFsbCBwZW5kaW5nIHVyYnMgdG8gY29tcGxldGU/CisJICogb25seSB0aGVuIGNhbiB3ZSBmb3JnbyBzdWJtaXR0aW5nIGFuZXcKKwkgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGV2LT53YWl0KSkgeworCQlpZiAoZGV2LT50eHEucWxlbiArIGRldi0+cnhxLnFsZW4gKyBkZXYtPmRvbmUucWxlbiA9PSAwKQorCQkJd2FrZV91cF9hbGwoJmRldi0+d2FpdCk7CiAKIAkvLyBvciBhcmUgd2UgbWF5YmUgc2hvcnQgYSBmZXcgdXJicz8KIAl9IGVsc2UgaWYgKG5ldGlmX3J1bm5pbmcgKGRldi0+bmV0KSAmJgpAQCAtMTU4MCw2ICsxNTgzLDcgQEAKIAlkZXYtPmRyaXZlcl9uYW1lID0gbmFtZTsKIAlkZXYtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdCAobXNnX2xldmVsLCBORVRJRl9NU0dfRFJWCiAJCQkJfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53YWl0KTsKIAlza2JfcXVldWVfaGVhZF9pbml0ICgmZGV2LT5yeHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQgKCZkZXYtPnR4cSk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCAoJmRldi0+ZG9uZSk7CkBAIC0xNzkxLDkgKzE3OTUsMTAgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnR4cS5sb2NrKTsKIAogCQlpZiAodGVzdF9iaXQoRVZFTlRfREVWX09QRU4sICZkZXYtPmZsYWdzKSkgewotCQkJLyogaGFuZGxlIHJlbW90ZSB3YWtldXAgQVNBUCAqLwotCQkJaWYgKCFkZXYtPndhaXQgJiYKLQkJCQluZXRpZl9kZXZpY2VfcHJlc2VudChkZXYtPm5ldCkgJiYKKwkJCS8qIGhhbmRsZSByZW1vdGUgd2FrZXVwIEFTQVAKKwkJCSAqIHdlIGNhbm5vdCByYWNlIGFnYWluc3Qgc3RvcAorCQkJICovCisJCQlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2LT5uZXQpICYmCiAJCQkJIXRpbWVyX3BlbmRpbmcoJmRldi0+ZGVsYXkpICYmCiAJCQkJIXRlc3RfYml0KEVWRU5UX1JYX0hBTFQsICZkZXYtPmZsYWdzKSkKIAkJCQkJcnhfYWxsb2Nfc3VibWl0KGRldiwgR0ZQX05PSU8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmV0aC5jIGIvZHJpdmVycy9uZXQvdmV0aC5jCmluZGV4IDViMzc0MzcuLmMwZTdjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZldGguYworKysgYi9kcml2ZXJzL25ldC92ZXRoLmMKQEAgLTI4Niw3ICsyODYsMTAgQEAKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKIAlkZXYtPmZlYXR1cmVzIHw9IFZFVEhfRkVBVFVSRVM7CiAJZGV2LT52bGFuX2ZlYXR1cmVzID0gZGV2LT5mZWF0dXJlcyAmCi0JCQkgICAgIH4oTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCk7CisJCQkgICAgIH4oTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAorCQkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1RYIHwKKwkJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8CisJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfUlgpOwogCWRldi0+ZGVzdHJ1Y3RvciA9IHZldGhfZGV2X2ZyZWU7CiAKIAlkZXYtPmh3X2ZlYXR1cmVzID0gVkVUSF9GRUFUVVJFUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCA1NjMyYTk5Li44NDFiNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC02NzEsOCArNjcxLDcgQEAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHJxLT52cS0+bnVtX2ZyZWUpOwotCWlmICh1bmxpa2VseSghdmlydHF1ZXVlX2tpY2socnEtPnZxKSkpCi0JCXJldHVybiBmYWxzZTsKKwl2aXJ0cXVldWVfa2ljayhycS0+dnEpOwogCXJldHVybiAhb29tOwogfQogCkBAIC04NzcsNyArODc2LDcgQEAKIAllcnIgPSB4bWl0X3NrYihzcSwgc2tiKTsKIAogCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4hICovCi0JaWYgKHVubGlrZWx5KGVycikgfHwgdW5saWtlbHkoIXZpcnRxdWV1ZV9raWNrKHNxLT52cSkpKSB7CisJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJZGV2X3dhcm4oJmRldi0+ZGV2LApAQCAtODg2LDYgKzg4NSw3IEBACiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KKwl2aXJ0cXVldWVfa2ljayhzcS0+dnEpOwogCiAJLyogRG9uJ3Qgd2FpdCB1cCBmb3IgdHJhbnNtaXR0ZWQgc2ticyB0byBiZSBmcmVlZC4gKi8KIAlza2Jfb3JwaGFuKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92eGxhbi5jIGIvZHJpdmVycy9uZXQvdnhsYW4uYwppbmRleCBiMGY3MDVjLi4xMjM2ODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3Z4bGFuLmMKQEAgLTEzMTgsNiArMTMxOCw5IEBACiAKIAkJbmVpZ2hfcmVsZWFzZShuKTsKIAorCQlpZiAocmVwbHkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCiAJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHJlcGx5KTsKIAkJX19za2JfcHVsbChyZXBseSwgc2tiX25ldHdvcmtfb2Zmc2V0KHJlcGx5KSk7CiAJCXJlcGx5LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKQEAgLTEzMzksMTUgKzEzNDIsMTAzIEBACiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZ4bGFuX25hX2NyZWF0ZShzdHJ1Y3Qgc2tfYnVmZiAqcmVxdWVzdCwKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuLCBib29sIGlzcm91dGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSByZXF1ZXN0LT5kZXY7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5OworCXN0cnVjdCBuZF9tc2cgKm5zLCAqbmE7CisJc3RydWN0IGlwdjZoZHIgKnBpcDY7CisJdTggKmRhZGRyOworCWludCBuYV9vbGVuID0gODsgLyogb3B0IGhkciArIEVUSF9BTEVOIGZvciB0YXJnZXQgKi8KKwlpbnQgbnNfb2xlbjsKKwlpbnQgaSwgbGVuOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJc2l6ZW9mKCpuYSkgKyBuYV9vbGVuICsgZGV2LT5uZWVkZWRfdGFpbHJvb207CisJcmVwbHkgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVwbHkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXBseS0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKwlyZXBseS0+ZGV2ID0gZGV2OworCXNrYl9yZXNlcnZlKHJlcGx5LCBMTF9SRVNFUlZFRF9TUEFDRShyZXF1ZXN0LT5kZXYpKTsKKwlza2JfcHVzaChyZXBseSwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKwlza2Jfc2V0X21hY19oZWFkZXIocmVwbHksIDApOworCisJbnMgPSAoc3RydWN0IG5kX21zZyAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHJlcXVlc3QpOworCisJZGFkZHIgPSBldGhfaGRyKHJlcXVlc3QpLT5oX3NvdXJjZTsKKwluc19vbGVuID0gcmVxdWVzdC0+bGVuIC0gc2tiX3RyYW5zcG9ydF9vZmZzZXQocmVxdWVzdCkgLSBzaXplb2YoKm5zKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnNfb2xlbi0xOyBpICs9IChucy0+b3B0W2krMV08PDMpKSB7CisJCWlmIChucy0+b3B0W2ldID09IE5EX09QVF9TT1VSQ0VfTExfQUREUikgeworCQkJZGFkZHIgPSBucy0+b3B0ICsgaSArIHNpemVvZihzdHJ1Y3QgbmRfb3B0X2hkcik7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEV0aGVybmV0IGhlYWRlciAqLworCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHJlcGx5KS0+aF9kZXN0LCBkYWRkcik7CisJZXRoZXJfYWRkcl9jb3B5KGV0aF9oZHIocmVwbHkpLT5oX3NvdXJjZSwgbi0+aGEpOworCWV0aF9oZHIocmVwbHkpLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJcmVwbHktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CisKKwlza2JfcHVsbChyZXBseSwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHJlcGx5LCAwKTsKKwlza2JfcHV0KHJlcGx5LCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKworCS8qIElQdjYgaGVhZGVyICovCisKKwlwaXA2ID0gaXB2Nl9oZHIocmVwbHkpOworCW1lbXNldChwaXA2LCAwLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlwaXA2LT52ZXJzaW9uID0gNjsKKwlwaXA2LT5wcmlvcml0eSA9IGlwdjZfaGRyKHJlcXVlc3QpLT5wcmlvcml0eTsKKwlwaXA2LT5uZXh0aGRyID0gSVBQUk9UT19JQ01QVjY7CisJcGlwNi0+aG9wX2xpbWl0ID0gMjU1OworCXBpcDYtPmRhZGRyID0gaXB2Nl9oZHIocmVxdWVzdCktPnNhZGRyOworCXBpcDYtPnNhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKiluLT5wcmltYXJ5X2tleTsKKworCXNrYl9wdWxsKHJlcGx5LCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIocmVwbHksIDApOworCisJbmEgPSAoc3RydWN0IG5kX21zZyAqKXNrYl9wdXQocmVwbHksIHNpemVvZigqbmEpICsgbmFfb2xlbik7CisKKwkvKiBOZWlnaGJvciBBZHZlcnRpc2VtZW50ICovCisJbWVtc2V0KG5hLCAwLCBzaXplb2YoKm5hKStuYV9vbGVuKTsKKwluYS0+aWNtcGguaWNtcDZfdHlwZSA9IE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UOworCW5hLT5pY21waC5pY21wNl9yb3V0ZXIgPSBpc3JvdXRlcjsKKwluYS0+aWNtcGguaWNtcDZfb3ZlcnJpZGUgPSAxOworCW5hLT5pY21waC5pY21wNl9zb2xpY2l0ZWQgPSAxOworCW5hLT50YXJnZXQgPSBucy0+dGFyZ2V0OworCWV0aGVyX2FkZHJfY29weSgmbmEtPm9wdFsyXSwgbi0+aGEpOworCW5hLT5vcHRbMF0gPSBORF9PUFRfVEFSR0VUX0xMX0FERFI7CisJbmEtPm9wdFsxXSA9IG5hX29sZW4gPj4gMzsKKworCW5hLT5pY21waC5pY21wNl9ja3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmcGlwNi0+c2FkZHIsCisJCSZwaXA2LT5kYWRkciwgc2l6ZW9mKCpuYSkrbmFfb2xlbiwgSVBQUk9UT19JQ01QVjYsCisJCWNzdW1fcGFydGlhbChuYSwgc2l6ZW9mKCpuYSkrbmFfb2xlbiwgMCkpOworCisJcGlwNi0+cGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2YoKm5hKStuYV9vbGVuKTsKKworCXNrYl9wdXNoKHJlcGx5LCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKworCXJlcGx5LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCXJldHVybiByZXBseTsKK30KKwogc3RhdGljIGludCBuZWlnaF9yZWR1Y2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdnhsYW5fZGV2ICp2eGxhbiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5laWdoYm91ciAqbjsKLQl1bmlvbiB2eGxhbl9hZGRyIGlwYTsKKwlzdHJ1Y3QgbmRfbXNnICptc2c7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaGRyOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsICpkYWRkcjsKLQlzdHJ1Y3QgbmRfbXNnICptc2c7Ci0Jc3RydWN0IGluZXQ2X2RldiAqaW42X2RldiA9IE5VTEw7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppbjZfZGV2OwogCiAJaW42X2RldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKIAlpZiAoIWluNl9kZXYpCkBAIC0xMzYwLDE5ICsxNDUxLDIwIEBACiAJc2FkZHIgPSAmaXBoZHItPnNhZGRyOwogCWRhZGRyID0gJmlwaGRyLT5kYWRkcjsKIAotCWlmIChpcHY2X2FkZHJfbG9vcGJhY2soZGFkZHIpIHx8Ci0JICAgIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZGFkZHIpKQotCQlnb3RvIG91dDsKLQogCW1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlpZiAobXNnLT5pY21waC5pY21wNl9jb2RlICE9IDAgfHwKIAkgICAgbXNnLT5pY21waC5pY21wNl90eXBlICE9IE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT04pCiAJCWdvdG8gb3V0OwogCi0JbiA9IG5laWdoX2xvb2t1cChpcHY2X3N0dWItPm5kX3RibCwgZGFkZHIsIGRldik7CisJaWYgKGlwdjZfYWRkcl9sb29wYmFjayhkYWRkcikgfHwKKwkgICAgaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmbXNnLT50YXJnZXQpKQorCQlnb3RvIG91dDsKKworCW4gPSBuZWlnaF9sb29rdXAoaXB2Nl9zdHViLT5uZF90YmwsICZtc2ctPnRhcmdldCwgZGV2KTsKIAogCWlmIChuKSB7CiAJCXN0cnVjdCB2eGxhbl9mZGIgKmY7CisJCXN0cnVjdCBza19idWZmICpyZXBseTsKIAogCQlpZiAoIShuLT5udWRfc3RhdGUgJiBOVURfQ09OTkVDVEVEKSkgewogCQkJbmVpZ2hfcmVsZWFzZShuKTsKQEAgLTEzODYsMTMgKzE0NzgsMjMgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaXB2Nl9zdHViLT5uZGlzY19zZW5kX25hKGRldiwgbiwgc2FkZHIsICZtc2ctPnRhcmdldCwKLQkJCQkJICEhaW42X2Rldi0+Y25mLmZvcndhcmRpbmcsCi0JCQkJCSB0cnVlLCBmYWxzZSwgZmFsc2UpOworCQlyZXBseSA9IHZ4bGFuX25hX2NyZWF0ZShza2IsIG4sCisJCQkJCSEhKGYgPyBmLT5mbGFncyAmIE5URl9ST1VURVIgOiAwKSk7CisKIAkJbmVpZ2hfcmVsZWFzZShuKTsKKworCQlpZiAocmVwbHkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChuZXRpZl9yeF9uaShyZXBseSkgPT0gTkVUX1JYX0RST1ApCisJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwogCX0gZWxzZSBpZiAodnhsYW4tPmZsYWdzICYgVlhMQU5fRl9MM01JU1MpIHsKLQkJaXBhLnNpbjYuc2luNl9hZGRyID0gKmRhZGRyOwotCQlpcGEuc2Euc2FfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXVuaW9uIHZ4bGFuX2FkZHIgaXBhID0geworCQkJLnNpbjYuc2luNl9hZGRyID0gbXNnLT50YXJnZXQsCisJCQkuc2Euc2FfZmFtaWx5ID0gQUZfSU5FVDYsCisJCX07CisKIAkJdnhsYW5faXBfbWlzcyhkZXYsICZpcGEpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwppbmRleCAzMDNjZTI3Li45MDc4YTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwpAQCAtMTU0OCw2ICsxNTQ4LDcgQEAKIAkJaWYgKHJlZyAhPSBsYXN0X3ZhbCkKIAkJCXJldHVybiB0cnVlOwogCisJCXVkZWxheSgxKTsKIAkJbGFzdF92YWwgPSByZWc7CiAJCWlmICgocmVnICYgMHg3RTdGRkZFRikgPT0gMHgwMDcwMjQwMCkKIAkJCWNvbnRpbnVlOwpAQCAtMTU2MCw4ICsxNTYxLDYgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0KLQkJdWRlbGF5KDEpOwogCX0gd2hpbGUgKGNvdW50LS0gPiAwKTsKIAogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IGYwNDJhMTguLjU1ODk3ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtMjA2Myw3ICsyMDYzLDcgQEAKIAogCUFUSF9UWEJVRl9SRVNFVChiZik7CiAKLQlpZiAodGlkKSB7CisJaWYgKHRpZCAmJiBpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJZnJhZ25vID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiBJRUVFODAyMTFfU0NUTF9GUkFHOwogCQlzZXFubyA9IHRpZC0+c2VxX25leHQ7CiAJCWhkci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNih0aWQtPnNlcV9uZXh0IDw8IElFRUU4MDIxMV9TRVFfU0VRX1NISUZUKTsKQEAgLTIxODYsNyArMjE4Niw3IEBACiAJCXR4cS0+c3RvcHBlZCA9IHRydWU7CiAJfQogCi0JaWYgKHR4Y3RsLT5hbikKKwlpZiAodHhjdGwtPmFuICYmIGllZWU4MDIxMV9pc19kYXRhX3ByZXNlbnQoaGRyLT5mcmFtZV9jb250cm9sKSkKIAkJdGlkID0gYXRoX2dldF9za2JfdGlkKHNjLCB0eGN0bC0+YW4sIHNrYik7CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1BTX1JFU1BPTlNFKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCmluZGV4IDExOWVlNmUuLmRkYWE5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCkBAIC0xOTQ4LDggKzE5NDgsMTAgQEAKIAkJaWYgKHBrdF9wYWQgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlyZXQgPSBicmNtZl9zZGlvX3R4cGt0X2hkYWxpZ24oYnVzLCBwa3RfcGFkKTsKLQkJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJCWtmcmVlX3NrYihwa3RfcGFkKTsKIAkJCXJldHVybiByZXQ7CisJCX0KIAkJbWVtY3B5KHBrdF9wYWQtPmRhdGEsCiAJCSAgICAgICBwa3QtPmRhdGEgKyBwa3QtPmxlbiAtIHRhaWxfY2hvcCwKIAkJICAgICAgIHRhaWxfY2hvcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKaW5kZXggN2Y4YjVkMS4uNDFkNGE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwpAQCAtNTQ2MCwxNCArNTQ2MCwxNSBAQAogCiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDY4LCAweDBiKTsKIAotCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA2OSwgMHgwZCk7Ci0JcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDcwLCAweDA2KTsKKwlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNjksIDB4MTIpOwogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3MywgMHgxMyk7CiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDc1LCAweDQ2KTsKIAlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNzYsIDB4MjgpOwogCiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDc3LCAweDU5KTsKIAorCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3MCwgMHgwYSk7CisKIAlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNzksIDB4MTMpOwogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4MCwgMHgwNSk7CiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDgxLCAweDMzKTsKQEAgLTU1MTAsNyArNTUxMSw2IEBACiAJaWYgKHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MikpIHsKIAkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEzNCwgMHhkMCk7CiAJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMzUsIDB4ZjYpOwotCQlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgMTQ4LCAweDg0KTsKIAl9CiAKIAlydDI4MDBfZGlzYWJsZV91bnVzZWRfZGFjX2FkYyhydDJ4MDBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCmluZGV4IGNhZGRjMWIuLjQyYTJlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKQEAgLTc2NCw3ICs3NjQsNyBAQAogCS8qCiAJICogT3ZlcndyaXRlIFRYIGRvbmUgaGFuZGxlcgogCSAqLwotCVBSRVBBUkVfV09SSygmcnQyeDAwZGV2LT50eGRvbmVfd29yaywgcnQyODAwdXNiX3dvcmtfdHhkb25lKTsKKwlJTklUX1dPUksoJnJ0MngwMGRldi0+dHhkb25lX3dvcmssIHJ0MjgwMHVzYl93b3JrX3R4ZG9uZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggODllODg4YS4uNWY4MWJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpAQCAtOTA0LDYgKzkwNSwzOCBAQAogRVhQT1JUX1NZTUJPTChvZl9maW5kX25vZGVfYnlfcGhhbmRsZSk7CiAKIC8qKgorICogb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZSAtIENvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBwcm9wZXJ0eQorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQGVsZW1fc2l6ZToJc2l6ZSBvZiB0aGUgaW5kaXZpZHVhbCBlbGVtZW50CisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YKKyAqIHNpemUgZWxlbV9zaXplIGluIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBvbiBzdWNlc3MsIC1FSU5WQUwgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCBvciBpdHMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGEgbXVsdGlwbGUgb2YgZWxlbV9zaXplCisgKiBhbmQgLUVOT0RBVEEgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZS4KKyAqLworaW50IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGVsZW1fc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CisKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJvcC0+dmFsdWUpCisJCXJldHVybiAtRU5PREFUQTsKKworCWlmIChwcm9wLT5sZW5ndGggJSBlbGVtX3NpemUgIT0gMCkgeworCQlwcl9lcnIoInNpemUgb2YgJXMgaW4gbm9kZSAlcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAlZFxuIiwKKwkJICAgICAgIHByb3BuYW1lLCBucC0+ZnVsbF9uYW1lLCBlbGVtX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcHJvcC0+bGVuZ3RoIC8gZWxlbV9zaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZSk7CisKKy8qKgogICogb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplCiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KQEAgLTE5ODIsMyArMjAxNSwxNTMgQEAKIAogCXJldHVybiBOVUxMOwogfQorCisvKioKKyAqIG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KCkgLSBwYXJzZSBjb21tb24gZW5kcG9pbnQgbm9kZSBwcm9wZXJ0aWVzCisgKiBAbm9kZTogcG9pbnRlciB0byBlbmRwb2ludCBkZXZpY2Vfbm9kZQorICogQGVuZHBvaW50OiBwb2ludGVyIHRvIHRoZSBPRiBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgYSByZWZlcmVuY2UgdG8gQG5vZGUuCisgKi8KK2ludCBvZl9ncmFwaF9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IG9mX2VuZHBvaW50ICplbmRwb2ludCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnRfbm9kZSA9IG9mX2dldF9wYXJlbnQobm9kZSk7CisKKwlXQVJOX09OQ0UoIXBvcnRfbm9kZSwgIiVzKCk6IGVuZHBvaW50ICVzIGhhcyBubyBwYXJlbnQgbm9kZVxuIiwKKwkJICBfX2Z1bmNfXywgbm9kZS0+ZnVsbF9uYW1lKTsKKworCW1lbXNldChlbmRwb2ludCwgMCwgc2l6ZW9mKCplbmRwb2ludCkpOworCisJZW5kcG9pbnQtPmxvY2FsX25vZGUgPSBub2RlOworCS8qCisJICogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgdHdvIGNhbGxzIGJlbG93IHN1Y2NlZWQuCisJICogSWYgdGhleSBkb24ndCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIDAgaXMgdXNlZC4KKwkgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwb3J0X25vZGUsICJyZWciLCAmZW5kcG9pbnQtPnBvcnQpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJyZWciLCAmZW5kcG9pbnQtPmlkKTsKKworCW9mX25vZGVfcHV0KHBvcnRfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQpOworCisvKioKKyAqIG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KCkgLSBnZXQgbmV4dCBlbmRwb2ludCBub2RlCisgKiBAcGFyZW50OiBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGV2aWNlIG5vZGUKKyAqIEBwcmV2OiBwcmV2aW91cyBlbmRwb2ludCBub2RlLCBvciBOVUxMIHRvIGdldCBmaXJzdAorICoKKyAqIFJldHVybjogQW4gJ2VuZHBvaW50JyBub2RlIHBvaW50ZXIgd2l0aCByZWZjb3VudCBpbmNyZW1lbnRlZC4gUmVmY291bnQKKyAqIG9mIHRoZSBwYXNzZWQgQHByZXYgbm9kZSBpcyBub3QgZGVjcmVtZW50ZWQsIHRoZSBjYWxsZXIgaGF2ZSB0byB1c2UKKyAqIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgorICovCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICplbmRwb2ludDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQgPSBOVUxMOworCisJaWYgKCFwYXJlbnQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFwcmV2KSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwkJLyoKKwkJICogSXQncyB0aGUgZmlyc3QgY2FsbCwgd2UgaGF2ZSB0byBmaW5kIGEgcG9ydCBzdWJub2RlCisJCSAqIHdpdGhpbiB0aGlzIG5vZGUgb3Igd2l0aGluIGFuIG9wdGlvbmFsICdwb3J0cycgbm9kZS4KKwkJICovCisJCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwYXJlbnQsICJwb3J0cyIpOworCQlpZiAobm9kZSkKKwkJCXBhcmVudCA9IG5vZGU7CisKKwkJcG9ydCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBhcmVudCwgInBvcnQiKTsKKworCQlpZiAocG9ydCkgeworCQkJLyogRm91bmQgYSBwb3J0LCBnZXQgYW4gZW5kcG9pbnQuICovCisJCQllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIE5VTEwpOworCQkJb2Zfbm9kZV9wdXQocG9ydCk7CisJCX0gZWxzZSB7CisJCQllbmRwb2ludCA9IE5VTEw7CisJCX0KKworCQlpZiAoIWVuZHBvaW50KQorCQkJcHJfZXJyKCIlcygpOiBubyBlbmRwb2ludCBub2RlcyBzcGVjaWZpZWQgZm9yICVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwYXJlbnQtPmZ1bGxfbmFtZSk7CisJCW9mX25vZGVfcHV0KG5vZGUpOworCisJCXJldHVybiBlbmRwb2ludDsKKwl9CisKKwlwb3J0ID0gb2ZfZ2V0X3BhcmVudChwcmV2KTsKKwlpZiAoV0FSTl9PTkNFKCFwb3J0LCAiJXMoKTogZW5kcG9pbnQgJXMgaGFzIG5vIHBhcmVudCBub2RlXG4iLAorCQkgICAgICBfX2Z1bmNfXywgcHJldi0+ZnVsbF9uYW1lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBdm9pZCBkcm9wcGluZyBwcmV2IG5vZGUgcmVmY291bnQgdG8gMC4gKi8KKwlvZl9ub2RlX2dldChwcmV2KTsKKwllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIHByZXYpOworCWlmIChlbmRwb2ludCkgeworCQlvZl9ub2RlX3B1dChwb3J0KTsKKwkJcmV0dXJuIGVuZHBvaW50OworCX0KKworCS8qIE5vIG1vcmUgZW5kcG9pbnRzIHVuZGVyIHRoaXMgcG9ydCwgdHJ5IHRoZSBuZXh0IG9uZS4gKi8KKwlkbyB7CisJCXBvcnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIHBvcnQpOworCQlpZiAoIXBvcnQpCisJCQlyZXR1cm4gTlVMTDsKKwl9IHdoaWxlIChvZl9ub2RlX2NtcChwb3J0LT5uYW1lLCAicG9ydCIpKTsKKworCS8qIFBpY2sgdXAgdGhlIGZpcnN0IGVuZHBvaW50IGluIHRoaXMgcG9ydC4gKi8KKwllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIE5VTEwpOworCW9mX25vZGVfcHV0KHBvcnQpOworCisJcmV0dXJuIGVuZHBvaW50OworfQorRVhQT1JUX1NZTUJPTChvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludCk7CisKKy8qKgorICogb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudCgpIC0gZ2V0IHJlbW90ZSBwb3J0J3MgcGFyZW50IG5vZGUKKyAqIEBub2RlOiBwb2ludGVyIHRvIGEgbG9jYWwgZW5kcG9pbnQgZGV2aWNlX25vZGUKKyAqCisgKiBSZXR1cm46IFJlbW90ZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIGVuZHBvaW50IG5vZGUgbGlua2VkCisgKgkgICB0byBAbm9kZS4gVXNlIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgorICovCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgaW50IGRlcHRoOworCisJLyogR2V0IHJlbW90ZSBlbmRwb2ludCBub2RlLiAqLworCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAicmVtb3RlLWVuZHBvaW50IiwgMCk7CisKKwkvKiBXYWxrIDMgbGV2ZWxzIHVwIG9ubHkgaWYgdGhlcmUgaXMgJ3BvcnRzJyBub2RlLiAqLworCWZvciAoZGVwdGggPSAzOyBkZXB0aCAmJiBucDsgZGVwdGgtLSkgeworCQlucCA9IG9mX2dldF9uZXh0X3BhcmVudChucCk7CisJCWlmIChkZXB0aCA9PSAyICYmIG9mX25vZGVfY21wKG5wLT5uYW1lLCAicG9ydHMiKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQpOworCisvKioKKyAqIG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydCgpIC0gZ2V0IHJlbW90ZSBwb3J0IG5vZGUKKyAqIEBub2RlOiBwb2ludGVyIHRvIGEgbG9jYWwgZW5kcG9pbnQgZGV2aWNlX25vZGUKKyAqCisgKiBSZXR1cm46IFJlbW90ZSBwb3J0IG5vZGUgYXNzb2NpYXRlZCB3aXRoIHJlbW90ZSBlbmRwb2ludCBub2RlIGxpbmtlZAorICoJICAgdG8gQG5vZGUuIFVzZSBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KKyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwkvKiBHZXQgcmVtb3RlIGVuZHBvaW50IG5vZGUuICovCisJbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJyZW1vdGUtZW5kcG9pbnQiLCAwKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gb2ZfZ2V0X25leHRfcGFyZW50KG5wKTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jIGIvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKaW5kZXggNmE4M2VlMS4uM2ZhNjYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKQEAgLTkwNSw3ICs5MDUsOCBAQAogCQkvKiBJZiBkZXYtPndhaXRpbmcgaXMgY2xlYXIgbm93LCBhbiBpbnRlcnJ1cHQKIAkJICAgZ2F2ZSB1cyB0aGUgcG9ydCBhbmQgd2Ugd291bGQgZGVhZGxvY2sgaWYgd2Ugc2xlcHQuICAqLwogCQlpZiAoZGV2LT53YWl0aW5nKSB7Ci0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmZGV2LT53YWl0X3EpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d2FpdF9xLAorCQkJCQkJICFkZXYtPndhaXRpbmcpOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgewogCQkJCXJldHVybiAtRUlOVFI7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDE3ZDJiMDcuLmUwNGZlMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0zMywyMSArMzMsMTQgQEAKICMKICMgU29tZSBhcmNoaXRlY3R1cmVzIHVzZSB0aGUgZ2VuZXJpYyBQQ0kgc2V0dXAgZnVuY3Rpb25zCiAjCi1vYmotJChDT05GSUdfWDg2KSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX0FMUEhBKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX0FSTSkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19VTklDT1JFMzIpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfUEFSSVNDKSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX1NVUEVSSCkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19QUEMpICs9IHNldHVwLWJ1cy5vCi1vYmotJChDT05GSUdfRlJWKSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX01JUFMpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfWDg2X1ZJU1dTKSArPSBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX01OMTAzMDApICs9IHNldHVwLWJ1cy5vCi1vYmotJChDT05GSUdfTUlDUk9CTEFaRSkgKz0gc2V0dXAtYnVzLm8KLW9iai0kKENPTkZJR19USUxFKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX1NQQVJDX0xFT04pICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfTTY4SykgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19BTFBIQSkgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19BUk0pICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfVU5JQ09SRTMyKSArPSBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1NVUEVSSCkgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19NSVBTKSArPSBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1RJTEUpICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfU1BBUkNfTEVPTikgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19NNjhLKSArPSBzZXR1cC1pcnEubwogCiAjCiAjIEFDUEkgUmVsYXRlZCBQQ0kgRlcgRnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9idXMuYyBiL2RyaXZlcnMvcGNpL2J1cy5jCmluZGV4IDM4OTAxNjYuLmZiOGFlZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2J1cy5jCisrKyBiL2RyaXZlcnMvcGNpL2J1cy5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAogc3RhdGljIGludCBwY2lfYnVzX2FsbG9jX2Zyb21fcmVnaW9uKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSwgcmVzb3VyY2Vfc2l6ZV90IGFsaWduLAotCQlyZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBpbnQgdHlwZV9tYXNrLAorCQlyZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBsb25nIHR5cGVfbWFzaywKIAkJcmVzb3VyY2Vfc2l6ZV90ICgqYWxpZ25mKSh2b2lkICosCiAJCQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICosCiAJCQkJCSAgcmVzb3VyY2Vfc2l6ZV90LApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJc3RydWN0IHJlc291cmNlICpyLCBhdmFpbDsKIAlyZXNvdXJjZV9zaXplX3QgbWF4OwogCi0JdHlwZV9tYXNrIHw9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTTsKKwl0eXBlX21hc2sgfD0gSU9SRVNPVVJDRV9UWVBFX0JJVFM7CiAKIAlwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKGJ1cywgciwgaSkgewogCQlpZiAoIXIpCkBAIC0yMDAsNyArMjAwLDcgQEAKICAqLwogaW50IHBjaV9idXNfYWxsb2NfcmVzb3VyY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCXJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgYWxpZ24sCi0JCXJlc291cmNlX3NpemVfdCBtaW4sIHVuc2lnbmVkIGludCB0eXBlX21hc2ssCisJCXJlc291cmNlX3NpemVfdCBtaW4sIHVuc2lnbmVkIGxvbmcgdHlwZV9tYXNrLAogCQlyZXNvdXJjZV9zaXplX3QgKCphbGlnbmYpKHZvaWQgKiwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiwKIAkJCQkJICByZXNvdXJjZV9zaXplX3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jIGIvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYwppbmRleCAwNmFjZTYyLi40N2FhZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKQEAgLTMyLDExICszMiw2IEBACiAJYnJpZGdlLT5yZWxlYXNlX2RhdGEgPSByZWxlYXNlX2RhdGE7CiB9CiAKLXN0YXRpYyBib29sIHJlc291cmNlX2NvbnRhaW5zKHN0cnVjdCByZXNvdXJjZSAqcmVzMSwgc3RydWN0IHJlc291cmNlICpyZXMyKQotewotCXJldHVybiByZXMxLT5zdGFydCA8PSByZXMyLT5zdGFydCAmJiByZXMxLT5lbmQgPj0gcmVzMi0+ZW5kOwotfQotCiB2b2lkIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAogCQkJICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKQEAgLTQ1LDkgKzQwLDYgQEAKIAlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkod2luZG93LCAmYnJpZGdlLT53aW5kb3dzLCBsaXN0KSB7Ci0JCWlmIChyZXNvdXJjZV90eXBlKHJlcykgIT0gcmVzb3VyY2VfdHlwZSh3aW5kb3ctPnJlcykpCi0JCQljb250aW51ZTsKLQogCQlpZiAocmVzb3VyY2VfY29udGFpbnMod2luZG93LT5yZXMsIHJlcykpIHsKIAkJCW9mZnNldCA9IHdpbmRvdy0+b2Zmc2V0OwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcKaW5kZXggNDdkNDZjNi4uYTZmNjdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvS2NvbmZpZwpAQCAtMjcsNyArMjcsNyBAQAogCiBjb25maWcgUENJX1JDQVJfR0VOMgogCWJvb2wgIlJlbmVzYXMgUi1DYXIgR2VuMiBJbnRlcm5hbCBQQ0kgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSTSAmJiAoQVJDSF9SOEE3NzkwIHx8IEFSQ0hfUjhBNzc5MSB8fCBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBBUkNIX1NITU9CSUxFIHx8IChBUk0gJiYgQ09NUElMRV9URVNUKQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgaW50ZXJuYWwgUENJIHN1cHBvcnQgb24gUi1DYXIgR2VuMiBTb0MuCiAJICBUaGVyZSBhcmUgMyBpbnRlcm5hbCBQQ0kgY29udHJvbGxlcnMgYXZhaWxhYmxlIHdpdGggYSBzaW5nbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYwppbmRleCBlODY2M2E4Li5lZTA4MjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCkBAIC00MjQsMjAgKzQyNCw0MCBAQAogCiBzdGF0aWMgaW50IGlteDZfcGNpZV9saW5rX3VwKHN0cnVjdCBwY2llX3BvcnQgKnBwKQogewotCXUzMiByYywgbHRzc20sIHJ4X3ZhbGlkOworCXUzMiByYywgZGVidWdfcjAsIHJ4X3ZhbGlkOworCWludCBjb3VudCA9IDU7CiAKIAkvKgotCSAqIFRlc3QgaWYgdGhlIFBIWSByZXBvcnRzIHRoYXQgdGhlIGxpbmsgaXMgdXAgYW5kIGFsc28gdGhhdAotCSAqIHRoZSBsaW5rIHRyYWluaW5nIGZpbmlzaGVkLiAgSXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlIFBIWQotCSAqIHJlcG9ydHMgdGhlIGxpbmsgaXMgYWxyZWFkeSB1cCwgYnV0IHRoZSBsaW5rIHRyYWluaW5nIGJpdAotCSAqIGlzIHN0aWxsIHNldCwgc28gbWFrZSBzdXJlIHRvIGNoZWNrIHRoZSB0cmFpbmluZyBpcyBkb25lCi0JICogYXMgd2VsbCBoZXJlLgorCSAqIFRlc3QgaWYgdGhlIFBIWSByZXBvcnRzIHRoYXQgdGhlIGxpbmsgaXMgdXAgYW5kIGFsc28gdGhhdCB0aGUgTFRTU00KKwkgKiB0cmFpbmluZyBmaW5pc2hlZC4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGUgbGluayB3aGVuCisJICogdGhpcyBjb2RlIGlzIGNhbGxlZDoKKwkgKiAxKSBUaGUgbGluayBpcyBET1dOICh1bmxpa2VseSkKKwkgKiAgICAgVGhlIGxpbmsgZGlkbid0IGNvbWUgdXAgeWV0IGZvciBzb21lIHJlYXNvbi4gVGhpcyB1c3VhbGx5IG1lYW5zCisJICogICAgIHdlIGhhdmUgYSByZWFsIHByb2JsZW0gc29tZXdoZXJlLiBSZXNldCB0aGUgUEhZIGFuZCBleGl0LiBUaGlzCisJICogICAgIHN0YXRlIGNhbGxzIGZvciBpbnNwZWN0aW9uIG9mIHRoZSBERUJVRyByZWdpc3RlcnMuCisJICogMikgVGhlIGxpbmsgaXMgVVAsIGJ1dCBzdGlsbCBpbiBMVFNTTSB0cmFpbmluZworCSAqICAgICBXYWl0IGZvciB0aGUgdHJhaW5pbmcgdG8gZmluaXNoLCB3aGljaCBzaG91bGQgdGFrZSBhIHZlcnkgc2hvcnQKKwkgKiAgICAgdGltZS4gSWYgdGhlIHRyYWluaW5nIGRvZXMgbm90IGZpbmlzaCwgd2UgaGF2ZSBhIHByb2JsZW0gYW5kIHdlCisJICogICAgIG5lZWQgdG8gaW5zcGVjdCB0aGUgREVCVUcgcmVnaXN0ZXJzLiBJZiB0aGUgdHJhaW5pbmcgZG9lcyBmaW5pc2gsCisJICogICAgIHRoZSBsaW5rIGlzIHVwIGFuZCBvcGVyYXRpbmcgY29ycmVjdGx5LgorCSAqIDMpIFRoZSBsaW5rIGlzIFVQIGFuZCBubyBsb25nZXIgaW4gTFRTU00gdHJhaW5pbmcKKwkgKiAgICAgVGhlIGxpbmsgaXMgdXAgYW5kIG9wZXJhdGluZyBjb3JyZWN0bHkuCiAJICovCi0JcmMgPSByZWFkbChwcC0+ZGJpX2Jhc2UgKyBQQ0lFX1BIWV9ERUJVR19SMSk7Ci0JaWYgKChyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19VUCkgJiYKLQkgICAgIShyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19JTl9UUkFJTklORykpCi0JCXJldHVybiAxOwotCisJd2hpbGUgKDEpIHsKKwkJcmMgPSByZWFkbChwcC0+ZGJpX2Jhc2UgKyBQQ0lFX1BIWV9ERUJVR19SMSk7CisJCWlmICghKHJjICYgUENJRV9QSFlfREVCVUdfUjFfWE1MSF9MSU5LX1VQKSkKKwkJCWJyZWFrOworCQlpZiAoIShyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19JTl9UUkFJTklORykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFjb3VudC0tKQorCQkJYnJlYWs7CisJCWRldl9kYmcocHAtPmRldiwgIkxpbmsgaXMgdXAsIGJ1dCBzdGlsbCBpbiB0cmFpbmluZ1xuIik7CisJCS8qCisJCSAqIFdhaXQgYSBsaXR0bGUgYml0LCB0aGVuIHJlLWNoZWNrIGlmIHRoZSBsaW5rIGZpbmlzaGVkCisJCSAqIHRoZSB0cmFpbmluZy4KKwkJICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CiAJLyoKIAkgKiBGcm9tIEwwLCBpbml0aWF0ZSBNQUMgZW50cnkgdG8gZ2VuMiBpZiBFUC9SQyBzdXBwb3J0cyBnZW4yLgogCSAqIFdhaXQgMm1zIChMVFNTTSB0aW1lb3V0IGlzIDI0bXMsIFBIWSBsb2NrIGlzIH41dXMgaW4gZ2VuMikuCkBAIC00NDYsMTUgKzQ2NiwxNiBAQAogCSAqIHRvIGdlbjIgaXMgc3R1Y2sKIAkgKi8KIAlwY2llX3BoeV9yZWFkKHBwLT5kYmlfYmFzZSwgUENJRV9QSFlfUlhfQVNJQ19PVVQsICZyeF92YWxpZCk7Ci0JbHRzc20gPSByZWFkbChwcC0+ZGJpX2Jhc2UgKyBQQ0lFX1BIWV9ERUJVR19SMCkgJiAweDNGOworCWRlYnVnX3IwID0gcmVhZGwocHAtPmRiaV9iYXNlICsgUENJRV9QSFlfREVCVUdfUjApOwogCiAJaWYgKHJ4X3ZhbGlkICYgMHgwMSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobHRzc20gIT0gMHgwZCkKKwlpZiAoKGRlYnVnX3IwICYgMHgzZikgIT0gMHgwZCkKIAkJcmV0dXJuIDA7CiAKIAlkZXZfZXJyKHBwLT5kZXYsICJ0cmFuc2l0aW9uIHRvIGdlbjIgaXMgc3R1Y2ssIHJlc2V0IFBIWSFcbiIpOworCWRldl9kYmcocHAtPmRldiwgImRlYnVnX3IwPSUwOHggZGVidWdfcjE9JTA4eFxuIiwgZGVidWdfcjAsIHJjKTsKIAogCWlteDZfcGNpZV9yZXNldF9waHkocHApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYwppbmRleCAwZTc5NjY1Li5kM2QxY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLW12ZWJ1LmMKQEAgLTEwMSw3ICsxMDEsOSBAQAogCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnRzOwogCXN0cnVjdCBtc2lfY2hpcCAqbXNpOwogCXN0cnVjdCByZXNvdXJjZSBpbzsKKwljaGFyIGlvX25hbWVbMzBdOwogCXN0cnVjdCByZXNvdXJjZSByZWFsaW87CisJY2hhciBtZW1fbmFtZVszMF07CiAJc3RydWN0IHJlc291cmNlIG1lbTsKIAlzdHJ1Y3QgcmVzb3VyY2UgYnVzbjsKIAlpbnQgbnBvcnRzOwpAQCAtNjcyLDEwICs2NzQsMzAgQEAKIHsKIAlzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZSA9IHN5c190b19wY2llKHN5cyk7CiAJaW50IGk7CisJaW50IGRvbWFpbiA9IDA7CiAKLQlpZiAocmVzb3VyY2Vfc2l6ZSgmcGNpZS0+cmVhbGlvKSAhPSAwKQorI2lmZGVmIENPTkZJR19QQ0lfRE9NQUlOUworCWRvbWFpbiA9IHN5cy0+ZG9tYWluOworI2VuZGlmCisKKwlzbnByaW50ZihwY2llLT5tZW1fbmFtZSwgc2l6ZW9mKHBjaWUtPm1lbV9uYW1lKSwgIlBDSSBNRU0gJTA0eCIsCisJCSBkb21haW4pOworCXBjaWUtPm1lbS5uYW1lID0gcGNpZS0+bWVtX25hbWU7CisKKwlzbnByaW50ZihwY2llLT5pb19uYW1lLCBzaXplb2YocGNpZS0+aW9fbmFtZSksICJQQ0kgSS9PICUwNHgiLCBkb21haW4pOworCXBjaWUtPnJlYWxpby5uYW1lID0gcGNpZS0+aW9fbmFtZTsKKworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBjaWUtPm1lbSkpCisJCXJldHVybiAwOworCisJaWYgKHJlc291cmNlX3NpemUoJnBjaWUtPnJlYWxpbykgIT0gMCkgeworCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcGNpZS0+cmVhbGlvKSkgeworCQkJcmVsZWFzZV9yZXNvdXJjZSgmcGNpZS0+bWVtKTsKKwkJCXJldHVybiAwOworCQl9CiAJCXBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KCZzeXMtPnJlc291cmNlcywgJnBjaWUtPnJlYWxpbywKIAkJCQkJc3lzLT5pb19vZmZzZXQpOworCX0KIAlwY2lfYWRkX3Jlc291cmNlX29mZnNldCgmc3lzLT5yZXNvdXJjZXMsICZwY2llLT5tZW0sIHN5cy0+bWVtX29mZnNldCk7CiAJcGNpX2FkZF9yZXNvdXJjZSgmc3lzLT5yZXNvdXJjZXMsICZwY2llLT5idXNuKTsKIApAQCAtNzk3LDcgKzgxOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJhbmdlczsgaSsrKSB7CiAJCXUzMiBmbGFncyA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlLCAxKTsKLQkJdTMyIHNsb3QgPSBvZl9yZWFkX251bWJlcihyYW5nZSwgMik7CisJCXUzMiBzbG90ID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyAxLCAxKTsKIAkJdTY0IGNwdWFkZHIgPSBvZl9yZWFkX251bWJlcihyYW5nZSArIG5hLCBwbmEpOwogCQl1bnNpZ25lZCBsb25nIHJ0eXBlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1yY2FyLWdlbjIuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCmluZGV4IGNlZWMxNDcuLmZkM2UzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAvKiBBSEItUENJIEJyaWRnZSBQQ0kgY29tbXVuaWNhdGlvbiByZWdpc3RlcnMgKi8KQEAgLTM5LDkgKzQwLDI2IEBACiAKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX0VOQUJMRV9SRUcJCShSQ0FSX0FIQlBDSV9QQ0lDT01fT0ZGU0VUICsgMHgyMCkKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX1NUQVRVU19SRUcJCShSQ0FSX0FIQlBDSV9QQ0lDT01fT0ZGU0VUICsgMHgyNCkKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1NJR1RBQk9SVAkJKDEgPDwgMCkKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1NJR1JFVEFCT1JUCSgxIDw8IDEpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9SRU1BQk9SVAkJKDEgPDwgMikKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1BFUlIJCSgxIDw8IDMpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9TSUdTRVJSCQkoMSA8PCA0KQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfUkVTRVJSCQkoMSA8PCA1KQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfV0lOMUVSUgkJKDEgPDwgMTIpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9XSU4yRVJSCQkoMSA8PCAxMykKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX0EJCQkoMSA8PCAxNikKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX0IJCQkoMSA8PCAxNykKICNkZWZpbmUgUkNBUl9QQ0lfSU5UX1BNRQkJKDEgPDwgMTkpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9BTExFUlJPUlMgKFJDQVJfUENJX0lOVF9TSUdUQUJPUlQJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9TSUdSRVRBQk9SVAl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfU0lHUkVUQUJPUlQJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1JFTUFCT1JUCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfUEVSUgkJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1NJR1NFUlIJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9SRVNFUlIJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9XSU4xRVJSCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfV0lOMkVSUikKIAogI2RlZmluZSBSQ0FSX0FIQl9CVVNfQ1RSX1JFRwkJKFJDQVJfQUhCUENJX1BDSUNPTV9PRkZTRVQgKyAweDMwKQogI2RlZmluZSBSQ0FSX0FIQl9CVVNfTU1PREVfSFRSQU5TCSgxIDw8IDApCkBAIC03NCw5ICs5Miw2IEBACiAKICNkZWZpbmUgUkNBUl9QQ0lfVU5JVF9SRVZfUkVHCQkoUkNBUl9BSEJQQ0lfUENJQ09NX09GRlNFVCArIDB4NDgpCiAKLS8qIE51bWJlciBvZiBpbnRlcm5hbCBQQ0kgY29udHJvbGxlcnMgKi8KLSNkZWZpbmUgUkNBUl9QQ0lfTlJfQ09OVFJPTExFUlMJCTMKLQogc3RydWN0IHJjYXJfcGNpX3ByaXYgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAl2b2lkIF9faW9tZW0gKnJlZzsKQEAgLTg0LDYgKzk5LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3JlczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmNmZ19yZXM7CiAJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIHdpbmRvd19zaXplOwogfTsKIAogLyogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb3BlcmF0aW9ucyAqLwpAQCAtMTAyLDYgKzExOCwxMCBAQAogCWlmIChzbG90ID4gMikKIAkJcmV0dXJuIE5VTEw7CiAKKwkvKiBicmlkZ2UgbG9naWMgb25seSBoYXMgcmVnaXN0ZXJzIHRvIDB4NDAgKi8KKwlpZiAoc2xvdCA9PSAweDAgJiYgd2hlcmUgPj0gMHg0MCkKKwkJcmV0dXJuIE5VTEw7CisKIAl2YWwgPSBzbG90ID8gUkNBUl9BSEJQQ0lfV0lOMV9ERVZJQ0UgfCBSQ0FSX0FIQlBDSV9XSU5fQ1RSX0NGRyA6CiAJCSAgICAgUkNBUl9BSEJQQ0lfV0lOMV9IT1NUIHwgUkNBUl9BSEJQQ0lfV0lOX0NUUl9DRkc7CiAKQEAgLTE1Niw3ICsxNzYsNyBAQAogfQogCiAvKiBQQ0kgaW50ZXJydXB0IG1hcHBpbmcgKi8KLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCByY2FyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBkZXYtPmJ1cy0+c3lzZGF0YTsKIAlzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdiA9IHN5cy0+cHJpdmF0ZV9kYXRhOwpAQCAtMTY0LDggKzE4NCw0OCBAQAogCXJldHVybiBwcml2LT5pcnE7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJX0RFQlVHCisvKiBpZiBkZWJ1ZyBlbmFibGVkLCB0aGVuIGF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIGlycSB0byB0aGUgYnJpZGdlICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCByY2FyX3BjaV9lcnJfaXJxKGludCBpcnEsIHZvaWQgKnB3KQoreworCXN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2ID0gcHc7CisJdTMyIHN0YXR1cyA9IGlvcmVhZDMyKHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9TVEFUVVNfUkVHKTsKKworCWlmIChzdGF0dXMgJiBSQ0FSX1BDSV9JTlRfQUxMRVJST1JTKSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgaXJxOiBzdGF0dXMgJTA4eFxuIiwgc3RhdHVzKTsKKworCQkvKiBjbGVhciB0aGUgZXJyb3IocykgKi8KKwkJaW93cml0ZTMyKHN0YXR1cyAmIFJDQVJfUENJX0lOVF9BTExFUlJPUlMsCisJCQkgIHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9TVEFUVVNfUkVHKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHZvaWQgcmNhcl9wY2lfc2V0dXBfZXJyaXJxKHN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2KQoreworCWludCByZXQ7CisJdTMyIHZhbDsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEocHJpdi0+ZGV2LCBwcml2LT5pcnEsIHJjYXJfcGNpX2Vycl9pcnEsCisJCQkgICAgICAgSVJRRl9TSEFSRUQsICJlcnJvciBpcnEiLCBwcml2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiY2Fubm90IGNsYWltIElSUSBmb3IgZXJyb3IgaGFuZGxpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJdmFsID0gaW9yZWFkMzIocHJpdi0+cmVnICsgUkNBUl9QQ0lfSU5UX0VOQUJMRV9SRUcpOworCXZhbCB8PSBSQ0FSX1BDSV9JTlRfQUxMRVJST1JTOworCWlvd3JpdGUzMih2YWwsIHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9FTkFCTEVfUkVHKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmNhcl9wY2lfc2V0dXBfZXJyaXJxKHN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2KSB7IH0KKyNlbmRpZgorCiAvKiBQQ0kgaG9zdCBjb250cm9sbGVyIHNldHVwICovCi1zdGF0aWMgaW50IF9faW5pdCByY2FyX3BjaV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3N0YXRpYyBpbnQgcmNhcl9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCiB7CiAJc3RydWN0IHJjYXJfcGNpX3ByaXYgKnByaXYgPSBzeXMtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IHByaXYtPnJlZzsKQEAgLTE4MywxMCArMjQzLDMxIEBACiAJaW93cml0ZTMyKHZhbCwgcmVnICsgUkNBUl9VU0JDVFJfUkVHKTsKIAl1ZGVsYXkoNCk7CiAKLQkvKiBEZS1hc3NlcnQgcmVzZXQgYW5kIHNldCBQQ0lBSEIgd2luZG93MSBzaXplIHRvIDFHQiAqLworCS8qIERlLWFzc2VydCByZXNldCBhbmQgcmVzZXQgUENJQUhCIHdpbmRvdzEgc2l6ZSAqLwogCXZhbCAmPSB+KFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xX01BU0sgfCBSQ0FSX1VTQkNUUl9QQ0lDTEtfTUFTSyB8CiAJCSBSQ0FSX1VTQkNUUl9VU0JIX1JTVCB8IFJDQVJfVVNCQ1RSX1BMTF9SU1QpOwotCWlvd3JpdGUzMih2YWwgfCBSQ0FSX1VTQkNUUl9QQ0lBSEJfV0lOMV8xRywgcmVnICsgUkNBUl9VU0JDVFJfUkVHKTsKKworCS8qIFNldHVwIFBDSUFIQiB3aW5kb3cxIHNpemUgKi8KKwlzd2l0Y2ggKHByaXYtPndpbmRvd19zaXplKSB7CisJY2FzZSBTWl8yRzoKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzJHOworCQlicmVhazsKKwljYXNlIFNaXzFHOgorCQl2YWwgfD0gUkNBUl9VU0JDVFJfUENJQUhCX1dJTjFfMUc7CisJCWJyZWFrOworCWNhc2UgU1pfNTEyTToKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzUxMk07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX3dhcm4oInVua25vd24gd2luZG93IHNpemUgJWxkIC0gZGVmYXVsdGluZyB0byAyNTZNXG4iLAorCQkJcHJpdi0+d2luZG93X3NpemUpOworCQlwcml2LT53aW5kb3dfc2l6ZSA9IFNaXzI1Nk07CisJCS8qIGZhbGwtdGhyb3VnaCAqLworCWNhc2UgU1pfMjU2TToKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzI1Nk07CisJCWJyZWFrOworCX0KKwlpb3dyaXRlMzIodmFsLCByZWcgKyBSQ0FSX1VTQkNUUl9SRUcpOwogCiAJLyogQ29uZmlndXJlIEFIQiBtYXN0ZXIgYW5kIHNsYXZlIG1vZGVzICovCiAJaW93cml0ZTMyKFJDQVJfQUhCX0JVU19NT0RFLCByZWcgKyBSQ0FSX0FIQl9CVVNfQ1RSX1JFRyk7CkBAIC0xOTcsNyArMjc4LDcgQEAKIAkgICAgICAgUkNBUl9QQ0lfQVJCSVRFUl9QQ0lCUF9NT0RFOwogCWlvd3JpdGUzMih2YWwsIHJlZyArIFJDQVJfUENJX0FSQklURVJfQ1RSX1JFRyk7CiAKLQkvKiBQQ0ktQUhCIG1hcHBpbmc6IDB4NDAwMDAwMDAtMHg4MDAwMDAwMCAqLworCS8qIFBDSS1BSEIgbWFwcGluZzogMHg0MDAwMDAwMCBiYXNlICovCiAJaW93cml0ZTMyKDB4NDAwMDAwMDAgfCBSQ0FSX1BDSUFIQl9QUkVGRVRDSDE2LAogCQkgIHJlZyArIFJDQVJfUENJQUhCX1dJTjFfQ1RSX1JFRyk7CiAKQEAgLTIyNCwxMCArMzA1LDE1IEBACiAJaW93cml0ZTMyKFJDQVJfUENJX0lOVF9BIHwgUkNBUl9QQ0lfSU5UX0IgfCBSQ0FSX1BDSV9JTlRfUE1FLAogCQkgIHJlZyArIFJDQVJfUENJX0lOVF9FTkFCTEVfUkVHKTsKIAorCWlmIChwcml2LT5pcnEgPiAwKQorCQlyY2FyX3BjaV9zZXR1cF9lcnJpcnEocHJpdik7CisKIAkvKiBBZGQgUENJIHJlc291cmNlcyAqLwogCXBjaV9hZGRfcmVzb3VyY2UoJnN5cy0+cmVzb3VyY2VzLCAmcHJpdi0+aW9fcmVzKTsKIAlwY2lfYWRkX3Jlc291cmNlKCZzeXMtPnJlc291cmNlcywgJnByaXYtPm1lbV9yZXMpOwogCisJLyogU2V0dXAgYnVzIG51bWJlciBiYXNlZCBvbiBwbGF0Zm9ybSBkZXZpY2UgaWQgKi8KKwlzeXMtPmJ1c25yID0gdG9fcGxhdGZvcm1fZGV2aWNlKHByaXYtPmRldiktPmlkOwogCXJldHVybiAxOwogfQogCkBAIC0yMzYsNDggKzMyMiwxMyBAQAogCS53cml0ZQk9IHJjYXJfcGNpX3dyaXRlX2NvbmZpZywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaHdfcGNpIHJjYXJfaHdfcGNpIF9faW5pdGRhdGEgPSB7Ci0JLm1hcF9pcnEJPSByY2FyX3BjaV9tYXBfaXJxLAotCS5vcHMJCT0gJnJjYXJfcGNpX29wcywKLQkuc2V0dXAJCT0gcmNhcl9wY2lfc2V0dXAsCi19OwotCi1zdGF0aWMgaW50IHJjYXJfcGNpX2NvdW50IF9faW5pdGRhdGE7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX2FkZF9jb250cm9sbGVyKHN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2KQotewotCXZvaWQgKipwcml2YXRlX2RhdGE7Ci0JaW50IGNvdW50OwotCi0JaWYgKHJjYXJfaHdfcGNpLm5yX2NvbnRyb2xsZXJzIDwgcmNhcl9wY2lfY291bnQpCi0JCWdvdG8gYWRkX3ByaXY7Ci0KLQkvKiAoUmUpYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXJyYXkgaWYgbmVlZGVkICovCi0JY291bnQgPSByY2FyX3BjaV9jb3VudCArIFJDQVJfUENJX05SX0NPTlRST0xMRVJTOwotCXByaXZhdGVfZGF0YSA9IGt6YWxsb2MoY291bnQgKiBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2YXRlX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmNhcl9wY2lfY291bnQgPSBjb3VudDsKLQlpZiAocmNhcl9od19wY2kucHJpdmF0ZV9kYXRhKSB7Ci0JCW1lbWNweShwcml2YXRlX2RhdGEsIHJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSwKLQkJICAgICAgIHJjYXJfaHdfcGNpLm5yX2NvbnRyb2xsZXJzICogc2l6ZW9mKHZvaWQgKikpOwotCQlrZnJlZShyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEpOwotCX0KLQotCXJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKLQotYWRkX3ByaXY6Ci0JLyogQWRkIHByaXZhdGUgZGF0YSBwb2ludGVyIHRvIHRoZSBhcnJheSAqLwotCXJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YVtyY2FyX2h3X3BjaS5ucl9jb250cm9sbGVycysrXSA9IHByaXY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHJjYXJfcGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpjZmdfcmVzLCAqbWVtX3JlczsKIAlzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdjsKIAl2b2lkIF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgaHdfcGNpIGh3OworCXZvaWQgKmh3X3ByaXZhdGVbMV07CiAKIAljZmdfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgY2ZnX3Jlcyk7CkBAIC0zMDgsMzEgKzM1OSwzNCBAQAogCXByaXYtPnJlZyA9IHJlZzsKIAlwcml2LT5kZXYgPSAmcGRldi0+ZGV2OwogCi0JcmV0dXJuIHJjYXJfcGNpX2FkZF9jb250cm9sbGVyKHByaXYpOworCWlmIChwcml2LT5pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZhbGlkIGlycSBmb3VuZFxuIik7CisJCXJldHVybiBwcml2LT5pcnE7CisJfQorCisJcHJpdi0+d2luZG93X3NpemUgPSBTWl8xRzsKKworCWh3X3ByaXZhdGVbMF0gPSBwcml2OworCW1lbXNldCgmaHcsIDAsIHNpemVvZihodykpOworCWh3Lm5yX2NvbnRyb2xsZXJzID0gQVJSQVlfU0laRShod19wcml2YXRlKTsKKwlody5wcml2YXRlX2RhdGEgPSBod19wcml2YXRlOworCWh3Lm1hcF9pcnEgPSByY2FyX3BjaV9tYXBfaXJxOworCWh3Lm9wcyA9ICZyY2FyX3BjaV9vcHM7CisJaHcuc2V0dXAgPSByY2FyX3BjaV9zZXR1cDsKKwlwY2lfY29tbW9uX2luaXRfZGV2KCZwZGV2LT5kZXYsICZodyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJjYXJfcGNpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJwY2ktcmNhci1nZW4yIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKIAl9LAorCS5wcm9iZSA9IHJjYXJfcGNpX3Byb2JlLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcmNhcl9wY2lfaW5pdCh2b2lkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnJjYXJfcGNpX2RyaXZlciwgcmNhcl9wY2lfcHJvYmUpOwotCWlmICghcmV0dmFsKQotCQlwY2lfY29tbW9uX2luaXQoJnJjYXJfaHdfcGNpKTsKLQotCS8qIFByaXZhdGUgZGF0YSBwb2ludGVyIGFycmF5IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgKi8KLQlrZnJlZShyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEpOwotCXJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdWJzeXNfaW5pdGNhbGwocmNhcl9wY2lfaW5pdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJjYXJfcGNpX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUmVuZXNhcyBSLUNhciBHZW4yIGludGVybmFsIFBDSSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMKaW5kZXggMTdjZTg4Zi4uNTA5YTI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jCkBAIC0yOTQsMTQgKzI5NCwxMiBAQAogc3RhdGljIHZvaWQgY2xlYXJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IHBvcywgbnZlYzsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJc3RydWN0IG1zaV9kZXNjICptc2k7CiAJc3RydWN0IHBjaWVfcG9ydCAqcHA7CiAJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOwogCiAJLyogZ2V0IHRoZSBwb3J0IHN0cnVjdHVyZSAqLwotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCW1zaSA9IGlycV9kZXNjX2dldF9tc2lfZGVzYyhkZXNjKTsKKwltc2kgPSBpcnFfZGF0YV9nZXRfbXNpKGRhdGEpOwogCXBwID0gc3lzX3RvX3BjaWUobXNpLT5kZXYtPmJ1cy0+c3lzZGF0YSk7CiAJaWYgKCFwcCkgewogCQlCVUcoKTsKQEAgLTgwMCw3ICs3OTgsNyBAQAogCiAJLyogc2V0dXAgUkMgQkFScyAqLwogCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDA0LCBQQ0lfQkFTRV9BRERSRVNTXzApOwotCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDA0LCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDAwLCBQQ0lfQkFTRV9BRERSRVNTXzEpOwogCiAJLyogc2V0dXAgaW50ZXJydXB0IHBpbnMgKi8KIAlkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lfSU5URVJSVVBUX0xJTkUsICZ2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggODI4YWNmNC4uYmNjYzI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC00MjQsNyArNDI0LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgYWNwaXBocF9tYXhfYnVzbnIoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKnRtcDsKIAl1bnNpZ25lZCBjaGFyIG1heCwgbjsKIAogCS8qCkBAIC00MzcsOCArNDM3LDggQEAKIAkgKi8KIAltYXggPSBidXMtPmJ1c25fcmVzLnN0YXJ0OwogCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7Ci0JCW4gPSBwY2lfYnVzX21heF9idXNucihwY2lfYnVzX2IodG1wKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CisJCW4gPSBwY2lfYnVzX21heF9idXNucih0bXApOwogCQlpZiAobiA+IG1heCkKIAkJCW1heCA9IG47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCmluZGV4IDMxMjczZTEuLjAzN2UyNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKQEAgLTkyMCwxMiArOTIwLDEyIEBACiAJCQkJYnVzLT5tYXhfYnVzX3NwZWVkID0gUENJX1NQRUVEXzEwME1Iel9QQ0lYOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKGJ1c19jYXAgJiAyMCkgeworCQkJaWYgKGJ1c19jYXAgJiAweDIwKSB7CiAJCQkJZGJnKCJidXMgbWF4IHN1cHBvcnRzIDY2TUh6IFBDSS1YXG4iKTsKIAkJCQlidXMtPm1heF9idXNfc3BlZWQgPSBQQ0lfU1BFRURfNjZNSHpfUENJWDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChidXNfY2FwICYgMTApIHsKKwkJCWlmIChidXNfY2FwICYgMHgxMCkgewogCQkJCWRiZygiYnVzIG1heCBzdXBwb3J0cyA2Nk1IeiBQQ0lcbiIpOwogCQkJCWJ1cy0+bWF4X2J1c19zcGVlZCA9IFBDSV9TUEVFRF82Nk1IejsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCmluZGV4IDg4YjM3Y2EuLjhhNjY4NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaApAQCAtNzYsNiArNzYsNyBAQAogCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CS8qIHdvcmsgZm9yIGJ1dHRvbiBldmVudCAqLwogCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBtdXRleCBob3RwbHVnX2xvY2s7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogfTsKIApAQCAtMTA5LDYgKzExMCw4IEBACiAjZGVmaW5lIElOVF9CVVRUT05fUFJFU1MJCTcKICNkZWZpbmUgSU5UX0JVVFRPTl9SRUxFQVNFCQk4CiAjZGVmaW5lIElOVF9CVVRUT05fQ0FOQ0VMCQk5CisjZGVmaW5lIElOVF9MSU5LX1VQCQkJMTAKKyNkZWZpbmUgSU5UX0xJTktfRE9XTgkJCTExCiAKICNkZWZpbmUgU1RBVElDX1NUQVRFCQkJMAogI2RlZmluZSBCTElOS0lOR09OX1NUQVRFCQkxCkBAIC0xMzIsNiArMTM1LDcgQEAKIHU4IHBjaWVocF9oYW5kbGVfc3dpdGNoX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIHU4IHBjaWVocF9oYW5kbGVfcHJlc2VuY2VfY2hhbmdlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogdTggcGNpZWhwX2hhbmRsZV9wb3dlcl9mYXVsdChzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKK3ZvaWQgcGNpZWhwX2hhbmRsZV9saW5rc3RhdGVfY2hhbmdlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogaW50IHBjaWVocF9jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogaW50IHBjaWVocF91bmNvbmZpZ3VyZV9kZXZpY2Uoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiB2b2lkIHBjaWVocF9xdWV1ZV9wdXNoYnV0dG9uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTE1Myw2ICsxNTcsNyBAQAogdm9pZCBwY2llaHBfZ3JlZW5fbGVkX29mZihzdHJ1Y3Qgc2xvdCAqc2xvdCk7CiB2b2lkIHBjaWVocF9ncmVlbl9sZWRfYmxpbmsoc3RydWN0IHNsb3QgKnNsb3QpOwogaW50IHBjaWVocF9jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCk7Citib29sIHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCk7CiB2b2lkIHBjaWVocF9yZWxlYXNlX2N0cmwoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwogaW50IHBjaWVocF9yZXNldF9zbG90KHN0cnVjdCBzbG90ICpzbG90LCBpbnQgcHJvYmUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKaW5kZXggZWRkZGRkNC4uMjBmZWE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYwpAQCAtMTEyLDYgKzExMiw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzZWxlY3RfZGV0ZWN0aW9uX21vZGUodm9pZCkKIHsKIAlzdHJ1Y3QgZHVtbXlfc2xvdCAqc2xvdCwgKnRtcDsKKwogCWlmIChwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigmZHVtbXlfZHJpdmVyKSkKIAkJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfQUNQSTsKIAlwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKCZkdW1teV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IDUzYjU4ZGUuLjBlMGEyZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTEwOCw2ICsxMDgsNyBAQAogCW9wcyA9IGt6YWxsb2Moc2l6ZW9mKCpvcHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9wcykKIAkJZ290byBvdXQ7CisKIAlvcHMtPmVuYWJsZV9zbG90ID0gZW5hYmxlX3Nsb3Q7CiAJb3BzLT5kaXNhYmxlX3Nsb3QgPSBkaXNhYmxlX3Nsb3Q7CiAJb3BzLT5nZXRfcG93ZXJfc3RhdHVzID0gZ2V0X3Bvd2VyX3N0YXR1czsKQEAgLTI4Myw4ICsyODQsMTEgQEAKIAlzbG90ID0gY3RybC0+c2xvdDsKIAlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZvY2N1cGllZCk7CiAJcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMoc2xvdCwgJnBvd2Vyb24pOwotCWlmIChvY2N1cGllZCAmJiBwY2llaHBfZm9yY2UpCisJaWYgKG9jY3VwaWVkICYmIHBjaWVocF9mb3JjZSkgeworCQltdXRleF9sb2NrKCZzbG90LT5ob3RwbHVnX2xvY2spOwogCQlwY2llaHBfZW5hYmxlX3Nsb3Qoc2xvdCk7CisJCW11dGV4X3VubG9jaygmc2xvdC0+aG90cGx1Z19sb2NrKTsKKwl9CiAJLyogSWYgZW1wdHkgc2xvdCdzIHBvd2VyIHN0YXR1cyBpcyBvbiwgdHVybiBwb3dlciBvZmYgKi8KIAlpZiAoIW9jY3VwaWVkICYmIHBvd2Vyb24gJiYgUE9XRVJfQ1RSTChjdHJsKSkKIAkJcGNpZWhwX3Bvd2VyX29mZl9zbG90KHNsb3QpOwpAQCAtMzI4LDEwICszMzIsMTIgQEAKIAogCS8qIENoZWNrIGlmIHNsb3QgaXMgb2NjdXBpZWQgKi8KIAlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZzdGF0dXMpOworCW11dGV4X2xvY2soJnNsb3QtPmhvdHBsdWdfbG9jayk7CiAJaWYgKHN0YXR1cykKIAkJcGNpZWhwX2VuYWJsZV9zbG90KHNsb3QpOwogCWVsc2UKIAkJcGNpZWhwX2Rpc2FibGVfc2xvdChzbG90KTsKKwltdXRleF91bmxvY2soJnNsb3QtPmhvdHBsdWdfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogUE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCA1MDYyODQ4Li5jNzVlNmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC0xNTAsNiArMTUwLDI3IEBACiAJcmV0dXJuIDE7CiB9CiAKK3ZvaWQgcGNpZWhwX2hhbmRsZV9saW5rc3RhdGVfY2hhbmdlKHN0cnVjdCBzbG90ICpwX3Nsb3QpCit7CisJdTMyIGV2ZW50X3R5cGU7CisJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CisKKwkvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKwljdHJsX2RiZyhjdHJsLCAiRGF0YSBMaW5rIExheWVyIFN0YXRlIGNoYW5nZVxuIik7CisKKwlpZiAocGNpZWhwX2NoZWNrX2xpbmtfYWN0aXZlKGN0cmwpKSB7CisJCWN0cmxfaW5mbyhjdHJsLCAic2xvdCglcyk6IExpbmsgVXAgZXZlbnRcbiIsCisJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJZXZlbnRfdHlwZSA9IElOVF9MSU5LX1VQOworCX0gZWxzZSB7CisJCWN0cmxfaW5mbyhjdHJsLCAic2xvdCglcyk6IExpbmsgRG93biBldmVudFxuIiwKKwkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQlldmVudF90eXBlID0gSU5UX0xJTktfRE9XTjsKKwl9CisKKwlxdWV1ZV9pbnRlcnJ1cHRfZXZlbnQocF9zbG90LCBldmVudF90eXBlKTsKK30KKwogLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBjb25zdGl0dXRlIHRoZSBidWxrIG9mIHRoZQogICAgaG90cGx1ZyBjb250cm9sbGVyIGxvZ2ljCiAgKi8KQEAgLTIxMiw3ICsyMzMsOCBAQAogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCBhZGQgZGV2aWNlIGF0ICUwNHg6JTAyeDowMFxuIiwKIAkJCSBwY2lfZG9tYWluX25yKHBhcmVudCksIHBhcmVudC0+bnVtYmVyKTsKLQkJZ290byBlcnJfZXhpdDsKKwkJaWYgKHJldHZhbCAhPSAtRUVYSVNUKQorCQkJZ290byBlcnJfZXhpdDsKIAl9CiAKIAlwY2llaHBfZ3JlZW5fbGVkX29uKHBfc2xvdCk7CkBAIC0yNTUsNiArMjc3LDkgQEAKIHN0cnVjdCBwb3dlcl93b3JrX2luZm8gewogCXN0cnVjdCBzbG90ICpwX3Nsb3Q7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdW5zaWduZWQgaW50IHJlcTsKKyNkZWZpbmUgRElTQUJMRV9SRVEgMAorI2RlZmluZSBFTkFCTEVfUkVRICAxCiB9OwogCiAvKioKQEAgLTI2OSwzMCArMjk0LDM4IEBACiAJc3RydWN0IHBvd2VyX3dvcmtfaW5mbyAqaW5mbyA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG93ZXJfd29ya19pbmZvLCB3b3JrKTsKIAlzdHJ1Y3Qgc2xvdCAqcF9zbG90ID0gaW5mby0+cF9zbG90OworCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZwX3Nsb3QtPmxvY2spOwotCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgewotCWNhc2UgUE9XRVJPRkZfU1RBVEU6Ci0JCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKKwlzd2l0Y2ggKGluZm8tPnJlcSkgeworCWNhc2UgRElTQUJMRV9SRVE6CiAJCWN0cmxfZGJnKHBfc2xvdC0+Y3RybCwKIAkJCSAiRGlzYWJsaW5nIGRvbWFpbjpidXM6ZGV2aWNlPSUwNHg6JTAyeDowMFxuIiwKIAkJCSBwY2lfZG9tYWluX25yKHBfc2xvdC0+Y3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUpLAogCQkJIHBfc2xvdC0+Y3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUtPm51bWJlcik7CisJCW11dGV4X2xvY2soJnBfc2xvdC0+aG90cGx1Z19sb2NrKTsKIAkJcGNpZWhwX2Rpc2FibGVfc2xvdChwX3Nsb3QpOworCQltdXRleF91bmxvY2soJnBfc2xvdC0+aG90cGx1Z19sb2NrKTsKIAkJbXV0ZXhfbG9jaygmcF9zbG90LT5sb2NrKTsKIAkJcF9zbG90LT5zdGF0ZSA9IFNUQVRJQ19TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUk9OX1NUQVRFOgogCQltdXRleF91bmxvY2soJnBfc2xvdC0+bG9jayk7Ci0JCWlmIChwY2llaHBfZW5hYmxlX3Nsb3QocF9zbG90KSkKKwkJYnJlYWs7CisJY2FzZSBFTkFCTEVfUkVROgorCQljdHJsX2RiZyhwX3Nsb3QtPmN0cmwsCisJCQkgIkVuYWJsaW5nIGRvbWFpbjpidXM6ZGV2aWNlPSUwNHg6JTAyeDowMFxuIiwKKwkJCSBwY2lfZG9tYWluX25yKHBfc2xvdC0+Y3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUpLAorCQkJIHBfc2xvdC0+Y3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUtPm51bWJlcik7CisJCW11dGV4X2xvY2soJnBfc2xvdC0+aG90cGx1Z19sb2NrKTsKKwkJcmV0ID0gcGNpZWhwX2VuYWJsZV9zbG90KHBfc2xvdCk7CisJCW11dGV4X3VubG9jaygmcF9zbG90LT5ob3RwbHVnX2xvY2spOworCQlpZiAocmV0KQogCQkJcGNpZWhwX2dyZWVuX2xlZF9vZmYocF9zbG90KTsKIAkJbXV0ZXhfbG9jaygmcF9zbG90LT5sb2NrKTsKIAkJcF9zbG90LT5zdGF0ZSA9IFNUQVRJQ19TVEFURTsKKwkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOwogCiAJa2ZyZWUoaW5mbyk7CiB9CkBAIC0zMTUsOSArMzQ4LDExIEBACiAJc3dpdGNoIChwX3Nsb3QtPnN0YXRlKSB7CiAJY2FzZSBCTElOS0lOR09GRl9TVEFURToKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST0ZGX1NUQVRFOworCQlpbmZvLT5yZXEgPSBESVNBQkxFX1JFUTsKIAkJYnJlYWs7CiAJY2FzZSBCTElOS0lOR09OX1NUQVRFOgogCQlwX3Nsb3QtPnN0YXRlID0gUE9XRVJPTl9TVEFURTsKKwkJaW5mby0+cmVxID0gRU5BQkxFX1JFUTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJa2ZyZWUoaW5mbyk7CkBAIC0zNjQsMTEgKzM5OSwxMCBAQAogCQkgKi8KIAkJY3RybF9pbmZvKGN0cmwsICJCdXR0b24gY2FuY2VsIG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnBfc2xvdC0+d29yayk7Ci0JCWlmIChwX3Nsb3QtPnN0YXRlID09IEJMSU5LSU5HT0ZGX1NUQVRFKSB7CisJCWlmIChwX3Nsb3QtPnN0YXRlID09IEJMSU5LSU5HT0ZGX1NUQVRFKQogCQkJcGNpZWhwX2dyZWVuX2xlZF9vbihwX3Nsb3QpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlwY2llaHBfZ3JlZW5fbGVkX29mZihwX3Nsb3QpOwotCQl9CiAJCXBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDApOwogCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIGFjdGlvbiBjYW5jZWxlZCAiCiAJCQkgICJkdWUgdG8gYnV0dG9uIHByZXNzXG4iLCBzbG90X25hbWUocF9zbG90KSk7CkBAIC00MDcsMTQgKzQ0MSw4MSBAQAogCUlOSVRfV09SSygmaW5mby0+d29yaywgcGNpZWhwX3Bvd2VyX3RocmVhZCk7CiAKIAlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7Ci0JaWYgKCFnZXRzdGF0dXMpCisJaWYgKCFnZXRzdGF0dXMpIHsKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST0ZGX1NUQVRFOwotCWVsc2UKKwkJaW5mby0+cmVxID0gRElTQUJMRV9SRVE7CisJfSBlbHNlIHsKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST05fU1RBVEU7CisJCWluZm8tPnJlcSA9IEVOQUJMRV9SRVE7CisJfQogCiAJcXVldWVfd29yayhwX3Nsb3QtPndxLCAmaW5mby0+d29yayk7CiB9CiAKKy8qCisgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggc2xvdC0+bG9jayBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9saW5rX2V2ZW50KHN0cnVjdCBzbG90ICpwX3Nsb3QsIHUzMiBldmVudCkKK3sKKwlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHBfc2xvdC0+Y3RybDsKKwlzdHJ1Y3QgcG93ZXJfd29ya19pbmZvICppbmZvOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCWN0cmxfZXJyKHBfc2xvdC0+Y3RybCwgIiVzOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvLT5wX3Nsb3QgPSBwX3Nsb3Q7CisJaW5mby0+cmVxID0gZXZlbnQgPT0gSU5UX0xJTktfVVAgPyBFTkFCTEVfUkVRIDogRElTQUJMRV9SRVE7CisJSU5JVF9XT1JLKCZpbmZvLT53b3JrLCBwY2llaHBfcG93ZXJfdGhyZWFkKTsKKworCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgeworCWNhc2UgQkxJTktJTkdPTl9TVEFURToKKwljYXNlIEJMSU5LSU5HT0ZGX1NUQVRFOgorCQljYW5jZWxfZGVsYXllZF93b3JrKCZwX3Nsb3QtPndvcmspOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIFNUQVRJQ19TVEFURToKKwkJcF9zbG90LT5zdGF0ZSA9IGV2ZW50ID09IElOVF9MSU5LX1VQID8KKwkJICAgIFBPV0VST05fU1RBVEUgOiBQT1dFUk9GRl9TVEFURTsKKwkJcXVldWVfd29yayhwX3Nsb3QtPndxLCAmaW5mby0+d29yayk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJPTl9TVEFURToKKwkJaWYgKGV2ZW50ID09IElOVF9MSU5LX1VQKSB7CisJCQljdHJsX2luZm8oY3RybCwKKwkJCQkgICJMaW5rIFVwIGV2ZW50IGlnbm9yZWQgb24gc2xvdCglcyk6IGFscmVhZHkgcG93ZXJpbmcgb25cbiIsCisJCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCQlrZnJlZShpbmZvKTsKKwkJfSBlbHNlIHsKKwkJCWN0cmxfaW5mbyhjdHJsLAorCQkJCSAgIkxpbmsgRG93biBldmVudCBxdWV1ZWQgb24gc2xvdCglcyk6IGN1cnJlbnRseSBnZXR0aW5nIHBvd2VyZWQgb25cbiIsCisJCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCQlwX3Nsb3QtPnN0YXRlID0gUE9XRVJPRkZfU1RBVEU7CisJCQlxdWV1ZV93b3JrKHBfc2xvdC0+d3EsICZpbmZvLT53b3JrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBPV0VST0ZGX1NUQVRFOgorCQlpZiAoZXZlbnQgPT0gSU5UX0xJTktfVVApIHsKKwkJCWN0cmxfaW5mbyhjdHJsLAorCQkJCSAgIkxpbmsgVXAgZXZlbnQgcXVldWVkIG9uIHNsb3QoJXMpOiBjdXJyZW50bHkgZ2V0dGluZyBwb3dlcmVkIG9mZlxuIiwKKwkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9OX1NUQVRFOworCQkJcXVldWVfd29yayhwX3Nsb3QtPndxLCAmaW5mby0+d29yayk7CisJCX0gZWxzZSB7CisJCQljdHJsX2luZm8oY3RybCwKKwkJCQkgICJMaW5rIERvd24gZXZlbnQgaWdub3JlZCBvbiBzbG90KCVzKTogYWxyZWFkeSBwb3dlcmluZyBvZmZcbiIsCisJCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCQlrZnJlZShpbmZvKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQljdHJsX2VycihjdHJsLCAiTm90IGEgdmFsaWQgc3RhdGUgb24gc2xvdCglcylcbiIsCisJCQkgc2xvdF9uYW1lKHBfc2xvdCkpOworCQlrZnJlZShpbmZvKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBpbnRlcnJ1cHRfZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGV2ZW50X2luZm8gKmluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGV2ZW50X2luZm8sIHdvcmspOwpAQCAtNDMzLDEyICs1MzQsMjMgQEAKIAkJcGNpZWhwX2dyZWVuX2xlZF9vZmYocF9zbG90KTsKIAkJYnJlYWs7CiAJY2FzZSBJTlRfUFJFU0VOQ0VfT046Ci0JY2FzZSBJTlRfUFJFU0VOQ0VfT0ZGOgogCQlpZiAoIUhQX1NVUFJfUk0oY3RybCkpCiAJCQlicmVhazsKKwkJY3RybF9kYmcoY3RybCwgIlN1cnByaXNlIEluc2VydGlvblxuIik7CisJCWhhbmRsZV9zdXJwcmlzZV9ldmVudChwX3Nsb3QpOworCQlicmVhazsKKwljYXNlIElOVF9QUkVTRU5DRV9PRkY6CisJCS8qCisJCSAqIFJlZ2FyZGxlc3Mgb2Ygc3VycHJpc2UgY2FwYWJpbGl0eSwgd2UgbmVlZCB0bworCQkgKiBkZWZpbml0ZWx5IHJlbW92ZSBhIGNhcmQgdGhhdCBoYXMgYmVlbiBwdWxsZWQgb3V0IQorCQkgKi8KIAkJY3RybF9kYmcoY3RybCwgIlN1cnByaXNlIFJlbW92YWxcbiIpOwogCQloYW5kbGVfc3VycHJpc2VfZXZlbnQocF9zbG90KTsKIAkJYnJlYWs7CisJY2FzZSBJTlRfTElOS19VUDoKKwljYXNlIElOVF9MSU5LX0RPV046CisJCWhhbmRsZV9saW5rX2V2ZW50KHBfc2xvdCwgaW5mby0+ZXZlbnRfdHlwZSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTQ0Nyw2ICs1NTksOSBAQAogCWtmcmVlKGluZm8pOwogfQogCisvKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNsb3QtPmhvdHBsdWdfbG9jayBoZWxkCisgKi8KIGludCBwY2llaHBfZW5hYmxlX3Nsb3Qoc3RydWN0IHNsb3QgKnBfc2xvdCkKIHsKIAl1OCBnZXRzdGF0dXMgPSAwOwpAQCAtNDc5LDEzICs1OTQsMTUgQEAKIAlwY2llaHBfZ2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCiAJcmMgPSBib2FyZF9hZGRlZChwX3Nsb3QpOwotCWlmIChyYykgeworCWlmIChyYykKIAkJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQl9CisKIAlyZXR1cm4gcmM7CiB9CiAKLQorLyoKKyAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzbG90LT5ob3RwbHVnX2xvY2sgaGVsZAorICovCiBpbnQgcGNpZWhwX2Rpc2FibGVfc2xvdChzdHJ1Y3Qgc2xvdCAqcF9zbG90KQogewogCXU4IGdldHN0YXR1cyA9IDA7CkBAIC00OTQsMjQgKzYxMSw2IEBACiAJaWYgKCFwX3Nsb3QtPmN0cmwpCiAJCXJldHVybiAxOwogCi0JaWYgKCFIUF9TVVBSX1JNKHBfc2xvdC0+Y3RybCkpIHsKLQkJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwotCQlpZiAoIWdldHN0YXR1cykgewotCQkJY3RybF9pbmZvKGN0cmwsICJObyBhZGFwdGVyIG9uIHNsb3QoJXMpXG4iLAotCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KLQlpZiAoTVJMX1NFTlMocF9zbG90LT5jdHJsKSkgewotCQlwY2llaHBfZ2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwotCQlpZiAoZ2V0c3RhdHVzKSB7Ci0JCQljdHJsX2luZm8oY3RybCwgIkxhdGNoIG9wZW4gb24gc2xvdCglcylcbiIsCi0JCQkJICBzbG90X25hbWUocF9zbG90KSk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQogCWlmIChQT1dFUl9DVFJMKHBfc2xvdC0+Y3RybCkpIHsKIAkJcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKCFnZXRzdGF0dXMpIHsKQEAgLTUzNiw3ICs2MzUsOSBAQAogCWNhc2UgU1RBVElDX1NUQVRFOgogCQlwX3Nsb3QtPnN0YXRlID0gUE9XRVJPTl9TVEFURTsKIAkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOworCQltdXRleF9sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCXJldHZhbCA9IHBjaWVocF9lbmFibGVfc2xvdChwX3Nsb3QpOworCQltdXRleF91bmxvY2soJnBfc2xvdC0+aG90cGx1Z19sb2NrKTsKIAkJbXV0ZXhfbG9jaygmcF9zbG90LT5sb2NrKTsKIAkJcF9zbG90LT5zdGF0ZSA9IFNUQVRJQ19TVEFURTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCmluZGV4IDE0YWNmY2MuLmQ3ZDA1OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIAltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiB9CiAKLXN0YXRpYyBib29sIGNoZWNrX2xpbmtfYWN0aXZlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQorYm9vbCBwY2llaHBfY2hlY2tfbGlua19hY3RpdmUoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjdHJsX2RldihjdHJsKTsKIAl1MTYgbG5rX3N0YXR1czsKQEAgLTIyNSwxMiArMjI1LDEyIEBACiB7CiAJaW50IHRpbWVvdXQgPSAxMDAwOwogCi0JaWYgKGNoZWNrX2xpbmtfYWN0aXZlKGN0cmwpID09IGFjdGl2ZSkKKwlpZiAocGNpZWhwX2NoZWNrX2xpbmtfYWN0aXZlKGN0cmwpID09IGFjdGl2ZSkKIAkJcmV0dXJuOwogCXdoaWxlICh0aW1lb3V0ID4gMCkgewogCQltc2xlZXAoMTApOwogCQl0aW1lb3V0IC09IDEwOwotCQlpZiAoY2hlY2tfbGlua19hY3RpdmUoY3RybCkgPT0gYWN0aXZlKQorCQlpZiAocGNpZWhwX2NoZWNrX2xpbmtfYWN0aXZlKGN0cmwpID09IGFjdGl2ZSkKIAkJCXJldHVybjsKIAl9CiAJY3RybF9kYmcoY3RybCwgIkRhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBub3QgJXMgaW4gMTAwMCBtc2VjXG4iLApAQCAtMjQyLDExICsyNDIsNiBAQAogCV9fcGNpZV93YWl0X2xpbmtfYWN0aXZlKGN0cmwsIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZCBwY2llX3dhaXRfbGlua19ub3RfYWN0aXZlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQotewotCV9fcGNpZV93YWl0X2xpbmtfYWN0aXZlKGN0cmwsIGZhbHNlKTsKLX0KLQogc3RhdGljIGJvb2wgcGNpX2J1c19jaGVja19kZXYoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKQogewogCXUzMiBsOwpAQCAtMzMyLDExICszMjcsNiBAQAogCXJldHVybiBfX3BjaWVocF9saW5rX3NldChjdHJsLCB0cnVlKTsKIH0KIAotc3RhdGljIGludCBwY2llaHBfbGlua19kaXNhYmxlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQotewotCXJldHVybiBfX3BjaWVocF9saW5rX3NldChjdHJsLCBmYWxzZSk7Ci19Ci0KIHZvaWQgcGNpZWhwX2dldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKQEAgLTUwOCwxNCArNDk4LDYgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAKLQkvKiBEaXNhYmxlIHRoZSBsaW5rIGF0IGZpcnN0ICovCi0JcGNpZWhwX2xpbmtfZGlzYWJsZShjdHJsKTsKLQkvKiB3YWl0IHRoZSBsaW5rIGlzIGRvd24gKi8KLQlpZiAoY3RybC0+bGlua19hY3RpdmVfcmVwb3J0aW5nKQotCQlwY2llX3dhaXRfbGlua19ub3RfYWN0aXZlKGN0cmwpOwotCWVsc2UKLQkJbXNsZWVwKDEwMDApOwotCiAJcGNpZV93cml0ZV9jbWQoY3RybCwgUENJX0VYUF9TTFRDVExfUFdSX09GRiwgUENJX0VYUF9TTFRDVExfUENDKTsKIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCiAJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwKQEAgLTU0MCw3ICs1MjIsNyBAQAogCiAJCWRldGVjdGVkICY9IChQQ0lfRVhQX1NMVFNUQV9BQlAgfCBQQ0lfRVhQX1NMVFNUQV9QRkQgfAogCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9NUkxTQyB8IFBDSV9FWFBfU0xUU1RBX1BEQyB8Ci0JCQkgICAgIFBDSV9FWFBfU0xUU1RBX0NDKTsKKwkJCSAgICAgUENJX0VYUF9TTFRTVEFfQ0MgfCBQQ0lfRVhQX1NMVFNUQV9ETExTQyk7CiAJCWRldGVjdGVkICY9IH5pbnRyX2xvYzsKIAkJaW50cl9sb2MgfD0gZGV0ZWN0ZWQ7CiAJCWlmICghaW50cl9sb2MpCkBAIC01NzksNiArNTYxLDEwIEBACiAJCWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkID0gMTsKIAkJcGNpZWhwX2hhbmRsZV9wb3dlcl9mYXVsdChzbG90KTsKIAl9CisKKwlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9ETExTQykKKwkJcGNpZWhwX2hhbmRsZV9saW5rc3RhdGVfY2hhbmdlKHNsb3QpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC01OTYsOSArNTgyLDE3IEBACiAJICogd2hlbiBpdCBpcyBjbGVhcmVkIGluIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLCBhbmQKIAkgKiBuZXh0IHBvd2VyIGZhdWx0IGRldGVjdGVkIGludGVycnVwdCB3YXMgbm90aWZpZWQgYWdhaW4uCiAJICovCi0JY21kID0gUENJX0VYUF9TTFRDVExfUERDRTsKKworCS8qCisJICogQWx3YXlzIGVuYWJsZSBsaW5rIGV2ZW50czogdGh1cyBsaW5rLXVwIGFuZCBsaW5rLWRvd24gc2hhbGwKKwkgKiBhbHdheXMgYmUgdHJlYXRlZCBhcyBob3RwbHVnIGFuZCB1bnBsdWcgcmVzcGVjdGl2ZWx5LiBFbmFibGUKKwkgKiBwcmVzZW5jZSBkZXRlY3Qgb25seSBpZiBBdHRlbnRpb24gQnV0dG9uIGlzIG5vdCBwcmVzZW50LgorCSAqLworCWNtZCA9IFBDSV9FWFBfU0xUQ1RMX0RMTFNDRTsKIAlpZiAoQVRUTl9CVVRUTihjdHJsKSkKIAkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX0FCUEU7CisJZWxzZQorCQljbWQgfD0gUENJX0VYUF9TTFRDVExfUERDRTsKIAlpZiAoTVJMX1NFTlMoY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9NUkxTQ0U7CiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKQpAQCAtNjA2LDcgKzYwMCw4IEBACiAKIAltYXNrID0gKFBDSV9FWFBfU0xUQ1RMX1BEQ0UgfCBQQ0lfRVhQX1NMVENUTF9BQlBFIHwKIAkJUENJX0VYUF9TTFRDVExfTVJMU0NFIHwgUENJX0VYUF9TTFRDVExfUEZERSB8Ci0JCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFKTsKKwkJUENJX0VYUF9TTFRDVExfSFBJRSB8IFBDSV9FWFBfU0xUQ1RMX0NDSUUgfAorCQlQQ0lfRVhQX1NMVENUTF9ETExTQ0UpOwogCiAJcGNpZV93cml0ZV9jbWQoY3RybCwgY21kLCBtYXNrKTsKIH0KQEAgLTYyNCwzMyArNjE5LDM4IEBACiAKIC8qCiAgKiBwY2llaHAgaGFzIGEgMToxIGJ1czpzbG90IHJlbGF0aW9uc2hpcCBzbyB3ZSB1bHRpbWF0ZWx5IHdhbnQgYSBzZWNvbmRhcnkKLSAqIGJ1cyByZXNldCBvZiB0aGUgYnJpZGdlLCBidXQgaWYgdGhlIHNsb3Qgc3VwcG9ydHMgc3VycHJpc2UgcmVtb3ZhbCB3ZSBuZWVkCi0gKiB0byBkaXNhYmxlIHByZXNlbmNlIGRldGVjdGlvbiBhcm91bmQgdGhlIGJ1cyByZXNldCBhbmQgY2xlYXIgYW55IHNwdXJpb3VzCisgKiBidXMgcmVzZXQgb2YgdGhlIGJyaWRnZSwgYnV0IGF0IHRoZSBzYW1lIHRpbWUgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBpdCBpcworICogbm90IHNlZW4gYXMgYSBob3QtdW5wbHVnLCBmb2xsb3dlZCBieSB0aGUgaG90LXBsdWcgb2YgdGhlIGRldmljZS4gVGh1cywKKyAqIGRpc2FibGUgbGluayBzdGF0ZSBub3RpZmljYXRpb24gYW5kIHByZXNlbmNlIGRldGVjdGlvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgKiBtb21lbnRhcmlseSwgaWYgd2Ugc2VlIHRoYXQgdGhleSBjb3VsZCBpbnRlcmZlcmUuIEFsc28sIGNsZWFyIGFueSBzcHVyaW91cwogICogZXZlbnRzIGFmdGVyLgogICovCiBpbnQgcGNpZWhwX3Jlc2V0X3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QsIGludCBwcm9iZSkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjdHJsX2RldihjdHJsKTsKKwl1MTYgc3RhdF9tYXNrID0gMCwgY3RybF9tYXNrID0gMDsKIAogCWlmIChwcm9iZSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoSFBfU1VQUl9STShjdHJsKSkgewotCQlwY2llX3dyaXRlX2NtZChjdHJsLCAwLCBQQ0lfRVhQX1NMVENUTF9QRENFKTsKLQkJaWYgKHBjaWVocF9wb2xsX21vZGUpCi0JCQlkZWxfdGltZXJfc3luYygmY3RybC0+cG9sbF90aW1lcik7CisJaWYgKCFBVFROX0JVVFROKGN0cmwpKSB7CisJCWN0cmxfbWFzayB8PSBQQ0lfRVhQX1NMVENUTF9QRENFOworCQlzdGF0X21hc2sgfD0gUENJX0VYUF9TTFRTVEFfUERDOwogCX0KKwljdHJsX21hc2sgfD0gUENJX0VYUF9TTFRDVExfRExMU0NFOworCXN0YXRfbWFzayB8PSBQQ0lfRVhQX1NMVFNUQV9ETExTQzsKKworCXBjaWVfd3JpdGVfY21kKGN0cmwsIDAsIGN0cmxfbWFzayk7CisJaWYgKHBjaWVocF9wb2xsX21vZGUpCisJCWRlbF90aW1lcl9zeW5jKCZjdHJsLT5wb2xsX3RpbWVyKTsKIAogCXBjaV9yZXNldF9icmlkZ2Vfc2Vjb25kYXJ5X2J1cyhjdHJsLT5wY2llLT5wb3J0KTsKIAotCWlmIChIUF9TVVBSX1JNKGN0cmwpKSB7Ci0JCXBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKHBkZXYsIFBDSV9FWFBfU0xUU1RBLAotCQkJCQkgICBQQ0lfRVhQX1NMVFNUQV9QREMpOwotCQlwY2llX3dyaXRlX2NtZChjdHJsLCBQQ0lfRVhQX1NMVENUTF9QRENFLCBQQ0lfRVhQX1NMVENUTF9QRENFKTsKLQkJaWYgKHBjaWVocF9wb2xsX21vZGUpCi0JCQlpbnRfcG9sbF90aW1lb3V0KGN0cmwtPnBvbGxfdGltZXIuZGF0YSk7Ci0JfQorCXBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKHBkZXYsIFBDSV9FWFBfU0xUU1RBLCBzdGF0X21hc2spOworCXBjaWVfd3JpdGVfY21kKGN0cmwsIGN0cmxfbWFzaywgY3RybF9tYXNrKTsKKwlpZiAocGNpZWhwX3BvbGxfbW9kZSkKKwkJaW50X3BvbGxfdGltZW91dChjdHJsLT5wb2xsX3RpbWVyLmRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODcsNiArNjg3LDcgQEAKIAogCXNsb3QtPmN0cmwgPSBjdHJsOwogCW11dGV4X2luaXQoJnNsb3QtPmxvY2spOworCW11dGV4X2luaXQoJnNsb3QtPmhvdHBsdWdfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnNsb3QtPndvcmssIHBjaWVocF9xdWV1ZV9wdXNoYnV0dG9uX3dvcmspOwogCWN0cmwtPnNsb3QgPSBzbG90OwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYwppbmRleCBiMDdkN2NjLi4xYjUzMzA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYwpAQCAtNTAsNyArNTAsNyBAQAogCQkJICJhdCAlMDR4OiUwMng6MDAsIGNhbm5vdCBob3QtYWRkXG4iLCBwY2lfbmFtZShkZXYpLAogCQkJIHBjaV9kb21haW5fbnIocGFyZW50KSwgcGFyZW50LT5udW1iZXIpOwogCQlwY2lfZGV2X3B1dChkZXYpOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSAtRUVYSVNUOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdi5jIGIvZHJpdmVycy9wY2kvaW92LmMKaW5kZXggOWRjZTdjNS4uZGU3YTc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW92LmMKKysrIGIvZHJpdmVycy9wY2kvaW92LmMKQEAgLTE3MCw5NyArMTcwLDYgQEAKIAlwY2lfZGV2X3B1dChkZXYpOwogfQogCi1zdGF0aWMgaW50IHNyaW92X21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXUxNiBzdGF0dXM7Ci0Jc3RydWN0IHBjaV9zcmlvdiAqaW92ID0gZGV2LT5zcmlvdjsKLQotCWlmICghaW92LT5udW1fVkZzKQotCQlyZXR1cm4gMDsKLQotCWlmICghKGlvdi0+Y2FwICYgUENJX1NSSU9WX0NBUF9WRk0pKQotCQlyZXR1cm4gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgaW92LT5wb3MgKyBQQ0lfU1JJT1ZfU1RBVFVTLCAmc3RhdHVzKTsKLQlpZiAoIShzdGF0dXMgJiBQQ0lfU1JJT1ZfU1RBVFVTX1ZGTSkpCi0JCXJldHVybiAwOwotCi0Jc2NoZWR1bGVfd29yaygmaW92LT5tdGFzayk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgc3Jpb3ZfbWlncmF0aW9uX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCBpOwotCXU4IHN0YXRlOwotCXUxNiBzdGF0dXM7Ci0Jc3RydWN0IHBjaV9zcmlvdiAqaW92ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwY2lfc3Jpb3YsIG10YXNrKTsKLQotCWZvciAoaSA9IGlvdi0+aW5pdGlhbF9WRnM7IGkgPCBpb3YtPm51bV9WRnM7IGkrKykgewotCQlzdGF0ZSA9IHJlYWRiKGlvdi0+bXN0YXRlICsgaSk7Ci0JCWlmIChzdGF0ZSA9PSBQQ0lfU1JJT1ZfVkZNX01JKSB7Ci0JCQl3cml0ZWIoUENJX1NSSU9WX1ZGTV9BViwgaW92LT5tc3RhdGUgKyBpKTsKLQkJCXN0YXRlID0gcmVhZGIoaW92LT5tc3RhdGUgKyBpKTsKLQkJCWlmIChzdGF0ZSA9PSBQQ0lfU1JJT1ZfVkZNX0FWKQotCQkJCXZpcnRmbl9hZGQoaW92LT5zZWxmLCBpLCAxKTsKLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBQQ0lfU1JJT1ZfVkZNX01PKSB7Ci0JCQl2aXJ0Zm5fcmVtb3ZlKGlvdi0+c2VsZiwgaSwgMSk7Ci0JCQl3cml0ZWIoUENJX1NSSU9WX1ZGTV9VQSwgaW92LT5tc3RhdGUgKyBpKTsKLQkJCXN0YXRlID0gcmVhZGIoaW92LT5tc3RhdGUgKyBpKTsKLQkJCWlmIChzdGF0ZSA9PSBQQ0lfU1JJT1ZfVkZNX0FWKQotCQkJCXZpcnRmbl9hZGQoaW92LT5zZWxmLCBpLCAwKTsKLQkJfQotCX0KLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGlvdi0+c2VsZiwgaW92LT5wb3MgKyBQQ0lfU1JJT1ZfU1RBVFVTLCAmc3RhdHVzKTsKLQlzdGF0dXMgJj0gflBDSV9TUklPVl9TVEFUVVNfVkZNOwotCXBjaV93cml0ZV9jb25maWdfd29yZChpb3YtPnNlbGYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1NUQVRVUywgc3RhdHVzKTsKLX0KLQotc3RhdGljIGludCBzcmlvdl9lbmFibGVfbWlncmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucl92aXJ0Zm4pCi17Ci0JaW50IGJpcjsKLQl1MzIgdGFibGU7Ci0JcmVzb3VyY2Vfc2l6ZV90IHBhOwotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGRldi0+c3Jpb3Y7Ci0KLQlpZiAobnJfdmlydGZuIDw9IGlvdi0+aW5pdGlhbF9WRnMpCi0JCXJldHVybiAwOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgaW92LT5wb3MgKyBQQ0lfU1JJT1ZfVkZNLCAmdGFibGUpOwotCWJpciA9IFBDSV9TUklPVl9WRk1fQklSKHRhYmxlKTsKLQlpZiAoYmlyID4gUENJX1NURF9SRVNPVVJDRV9FTkQpCi0JCXJldHVybiAtRUlPOwotCi0JdGFibGUgPSBQQ0lfU1JJT1ZfVkZNX09GRlNFVCh0YWJsZSk7Ci0JaWYgKHRhYmxlICsgbnJfdmlydGZuID4gcGNpX3Jlc291cmNlX2xlbihkZXYsIGJpcikpCi0JCXJldHVybiAtRUlPOwotCi0JcGEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBiaXIpICsgdGFibGU7Ci0JaW92LT5tc3RhdGUgPSBpb3JlbWFwKHBhLCBucl92aXJ0Zm4pOwotCWlmICghaW92LT5tc3RhdGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JSU5JVF9XT1JLKCZpb3YtPm10YXNrLCBzcmlvdl9taWdyYXRpb25fdGFzayk7Ci0KLQlpb3YtPmN0cmwgfD0gUENJX1NSSU9WX0NUUkxfVkZNIHwgUENJX1NSSU9WX0NUUkxfSU5UUjsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBpb3YtPnBvcyArIFBDSV9TUklPVl9DVFJMLCBpb3YtPmN0cmwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyaW92X2Rpc2FibGVfbWlncmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9zcmlvdiAqaW92ID0gZGV2LT5zcmlvdjsKLQotCWlvdi0+Y3RybCAmPSB+KFBDSV9TUklPVl9DVFJMX1ZGTSB8IFBDSV9TUklPVl9DVFJMX0lOVFIpOwotCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGlvdi0+cG9zICsgUENJX1NSSU9WX0NUUkwsIGlvdi0+Y3RybCk7Ci0KLQljYW5jZWxfd29ya19zeW5jKCZpb3YtPm10YXNrKTsKLQlpb3VubWFwKGlvdi0+bXN0YXRlKTsKLX0KLQogc3RhdGljIGludCBzcmlvdl9lbmFibGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG5yX3ZpcnRmbikKIHsKIAlpbnQgcmM7CkBAIC0zNTEsMTIgKzI2MCw2IEBACiAJCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAoaW92LT5jYXAgJiBQQ0lfU1JJT1ZfQ0FQX1ZGTSkgewotCQlyYyA9IHNyaW92X2VuYWJsZV9taWdyYXRpb24oZGV2LCBucl92aXJ0Zm4pOwotCQlpZiAocmMpCi0JCQlnb3RvIGZhaWxlZDsKLQl9Ci0KIAlrb2JqZWN0X3VldmVudCgmZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UpOwogCWlvdi0+bnVtX1ZGcyA9IG5yX3ZpcnRmbjsKIApAQCAtMzg3LDkgKzI5MCw2IEBACiAJaWYgKCFpb3YtPm51bV9WRnMpCiAJCXJldHVybjsKIAotCWlmIChpb3YtPmNhcCAmIFBDSV9TUklPVl9DQVBfVkZNKQotCQlzcmlvdl9kaXNhYmxlX21pZ3JhdGlvbihkZXYpOwotCiAJZm9yIChpID0gMDsgaSA8IGlvdi0+bnVtX1ZGczsgaSsrKQogCQl2aXJ0Zm5fcmVtb3ZlKGRldiwgaSwgMCk7CiAKQEAgLTY4OCwyNSArNTg4LDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9kaXNhYmxlX3NyaW92KTsKIAogLyoqCi0gKiBwY2lfc3Jpb3ZfbWlncmF0aW9uIC0gbm90aWZ5IFNSLUlPViBjb3JlIG9mIFZpcnR1YWwgRnVuY3Rpb24gTWlncmF0aW9uCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZQotICoKLSAqIFJldHVybnMgSVJRX0hBTkRMRUQgaWYgdGhlIElSUSBpcyBoYW5kbGVkLCBvciBJUlFfTk9ORSBpZiBub3QuCi0gKgotICogUGh5c2ljYWwgRnVuY3Rpb24gZHJpdmVyIGlzIHJlc3BvbnNpYmxlIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyIHVzaW5nCi0gKiBWRiBNaWdyYXRpb24gSW50ZXJydXB0IE1lc3NhZ2UgTnVtYmVyLCBhbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlCi0gKiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KLSAqLwotaXJxcmV0dXJuX3QgcGNpX3NyaW92X21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWlmICghZGV2LT5pc19waHlzZm4pCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXJldHVybiBzcmlvdl9taWdyYXRpb24oZGV2KSA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwY2lfc3Jpb3ZfbWlncmF0aW9uKTsKLQotLyoqCiAgKiBwY2lfbnVtX3ZmIC0gcmV0dXJuIG51bWJlciBvZiBWRnMgYXNzb2NpYXRlZCB3aXRoIGEgUEYgZGV2aWNlX3JlbGVhc2VfZHJpdmVyCiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggMjc2ZWY5Yy4uNGUwYWNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTM1MSwyOCArMzUxLDE3IEBACiAJCQkJCQkJKFNfSVdVU1J8U19JV0dSUCksCiAJCQkJCQkJTlVMTCwgZGV2X3Jlc2Nhbl9zdG9yZSk7CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcGNpX3N0b3BfYW5kX3JlbW92ZV9idXNfZGV2aWNlX2xvY2tlZCh0b19wY2lfZGV2KGRldikpOwotfQotCiBzdGF0aWMgc3NpemVfdAotcmVtb3ZlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAorcmVtb3ZlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAogCWlmIChrc3RydG91bChidWYsIDAsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBBbiBhdHRyaWJ1dGUgY2Fubm90IGJlIHVucmVnaXN0ZXJlZCBieSBvbmUgb2YgaXRzIG93biBtZXRob2RzLAotCSAqIHNvIHdlIGhhdmUgdG8gdXNlIHRoaXMgcm91bmRhYm91dCBhcHByb2FjaC4KLQkgKi8KLQlpZiAodmFsKQotCQlyZXQgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCByZW1vdmVfY2FsbGJhY2spOwotCWlmIChyZXQpCi0JCWNvdW50ID0gcmV0OworCWlmICh2YWwgJiYgZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYoZGV2LCBhdHRyKSkKKwkJcGNpX3N0b3BfYW5kX3JlbW92ZV9idXNfZGV2aWNlX2xvY2tlZCh0b19wY2lfZGV2KGRldikpOwogCXJldHVybiBjb3VudDsKIH0KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfcmVtb3ZlX2F0dHIgPSBfX0FUVFIocmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBmZGJjMjk0Li43MzI1ZDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMTA4LDEyICsxMDgsMTIgQEAKICAqLwogdW5zaWduZWQgY2hhciBwY2lfYnVzX21heF9idXNucihzdHJ1Y3QgcGNpX2J1cyogYnVzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGNpX2J1cyAqdG1wOwogCXVuc2lnbmVkIGNoYXIgbWF4LCBuOwogCiAJbWF4ID0gYnVzLT5idXNuX3Jlcy5lbmQ7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7Ci0JCW4gPSBwY2lfYnVzX21heF9idXNucihwY2lfYnVzX2IodG1wKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CisJCW4gPSBwY2lfYnVzX21heF9idXNucih0bXApOwogCQlpZihuID4gbWF4KQogCQkJbWF4ID0gbjsKIAl9CkBAIC00MDEsMzMgKzQwMSw0MCBAQAogICogQHJlczogY2hpbGQgcmVzb3VyY2UgcmVjb3JkIGZvciB3aGljaCBwYXJlbnQgaXMgc291Z2h0CiAgKgogICogIEZvciBnaXZlbiByZXNvdXJjZSByZWdpb24gb2YgZ2l2ZW4gZGV2aWNlLCByZXR1cm4gdGhlIHJlc291cmNlCi0gKiAgcmVnaW9uIG9mIHBhcmVudCBidXMgdGhlIGdpdmVuIHJlZ2lvbiBpcyBjb250YWluZWQgaW4gb3Igd2hlcmUKLSAqICBpdCBzaG91bGQgYmUgYWxsb2NhdGVkIGZyb20uCisgKiAgcmVnaW9uIG9mIHBhcmVudCBidXMgdGhlIGdpdmVuIHJlZ2lvbiBpcyBjb250YWluZWQgaW4uCiAgKi8KIHN0cnVjdCByZXNvdXJjZSAqCiBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJY29uc3Qgc3RydWN0IHBjaV9idXMgKmJ1cyA9IGRldi0+YnVzOworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgaTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmJlc3QgPSBOVUxMLCAqcjsKIAogCXBjaV9idXNfZm9yX2VhY2hfcmVzb3VyY2UoYnVzLCByLCBpKSB7CiAJCWlmICghcikKIAkJCWNvbnRpbnVlOwotCQlpZiAocmVzLT5zdGFydCAmJiAhKHJlcy0+c3RhcnQgPj0gci0+c3RhcnQgJiYgcmVzLT5lbmQgPD0gci0+ZW5kKSkKLQkJCWNvbnRpbnVlOwkvKiBOb3QgY29udGFpbmVkICovCi0JCWlmICgocmVzLT5mbGFncyBeIHItPmZsYWdzKSAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKQotCQkJY29udGludWU7CS8qIFdyb25nIHR5cGUgKi8KLQkJaWYgKCEoKHJlcy0+ZmxhZ3MgXiByLT5mbGFncykgJiBJT1JFU09VUkNFX1BSRUZFVENIKSkKLQkJCXJldHVybiByOwkvKiBFeGFjdCBtYXRjaCAqLwotCQkvKiBXZSBjYW4ndCBpbnNlcnQgYSBub24tcHJlZmV0Y2ggcmVzb3VyY2UgaW5zaWRlIGEgcHJlZmV0Y2hhYmxlIHBhcmVudCAuLiAqLwotCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQotCQkJY29udGludWU7Ci0JCS8qIC4uIGJ1dCB3ZSBjYW4gcHV0IGEgcHJlZmV0Y2hhYmxlIHJlc291cmNlIGluc2lkZSBhIG5vbi1wcmVmZXRjaGFibGUgb25lICovCi0JCWlmICghYmVzdCkKLQkJCWJlc3QgPSByOworCQlpZiAocmVzLT5zdGFydCAmJiByZXNvdXJjZV9jb250YWlucyhyLCByZXMpKSB7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgd2luZG93IGlzIHByZWZldGNoYWJsZSBidXQgdGhlIEJBUiBpcworCQkJICogbm90LCB0aGUgYWxsb2NhdG9yIG1hZGUgYSBtaXN0YWtlLgorCQkJICovCisJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIICYmCisJCQkgICAgIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSdyZSBiZWxvdyBhIHRyYW5zcGFyZW50IGJyaWRnZSwgdGhlcmUgbWF5CisJCQkgKiBiZSBib3RoIGEgcG9zaXRpdmVseS1kZWNvZGVkIGFwZXJ0dXJlIGFuZCBhCisJCQkgKiBzdWJ0cmFjdGl2ZWx5LWRlY29kZWQgcmVnaW9uIHRoYXQgY29udGFpbiB0aGUgQkFSLgorCQkJICogV2Ugd2FudCB0aGUgcG9zaXRpdmVseS1kZWNvZGVkIG9uZSwgc28gdGhpcyBkZXBlbmRzCisJCQkgKiBvbiBwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKCkgZ2l2aW5nIHVzIHRob3NlCisJCQkgKiBmaXJzdC4KKwkJCSAqLworCQkJcmV0dXJuIHI7CisJCX0KIAl9Ci0JcmV0dXJuIGJlc3Q7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpAQCAtMTE3OCw2ICsxMTg1LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfbG9hZF9hbmRfZnJlZV9zYXZlZF9zdGF0ZSk7CiAKK2ludCBfX3dlYWsgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXJzKQoreworCXJldHVybiBwY2lfZW5hYmxlX3Jlc291cmNlcyhkZXYsIGJhcnMpOworfQorCiBzdGF0aWMgaW50IGRvX3BjaV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXJzKQogewogCWludCBlcnI7CkBAIC0xNjI0LDI5ICsxNjM2LDI3IEBACiAJc3RydWN0IHBjaV9wbWVfZGV2aWNlICpwbWVfZGV2LCAqbjsKIAogCW11dGV4X2xvY2soJnBjaV9wbWVfbGlzdF9tdXRleCk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZwY2lfcG1lX2xpc3QpKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbWVfZGV2LCBuLCAmcGNpX3BtZV9saXN0LCBsaXN0KSB7Ci0JCQlpZiAocG1lX2Rldi0+ZGV2LT5wbWVfcG9sbCkgewotCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBtZV9kZXYsIG4sICZwY2lfcG1lX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBtZV9kZXYtPmRldi0+cG1lX3BvbGwpIHsKKwkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CiAKLQkJCQlicmlkZ2UgPSBwbWVfZGV2LT5kZXYtPmJ1cy0+c2VsZjsKLQkJCQkvKgotCQkJCSAqIElmIGJyaWRnZSBpcyBpbiBsb3cgcG93ZXIgc3RhdGUsIHRoZQotCQkJCSAqIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2Ygc3Vib3JkaW5hdGUgZGV2aWNlcwotCQkJCSAqIG1heSBiZSBub3QgYWNjZXNzaWJsZQotCQkJCSAqLwotCQkJCWlmIChicmlkZ2UgJiYgYnJpZGdlLT5jdXJyZW50X3N0YXRlICE9IFBDSV9EMCkKLQkJCQkJY29udGludWU7Ci0JCQkJcGNpX3BtZV93YWtldXAocG1lX2Rldi0+ZGV2LCBOVUxMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdF9kZWwoJnBtZV9kZXYtPmxpc3QpOwotCQkJCWtmcmVlKHBtZV9kZXYpOwotCQkJfQorCQkJYnJpZGdlID0gcG1lX2Rldi0+ZGV2LT5idXMtPnNlbGY7CisJCQkvKgorCQkJICogSWYgYnJpZGdlIGlzIGluIGxvdyBwb3dlciBzdGF0ZSwgdGhlCisJCQkgKiBjb25maWd1cmF0aW9uIHNwYWNlIG9mIHN1Ym9yZGluYXRlIGRldmljZXMKKwkJCSAqIG1heSBiZSBub3QgYWNjZXNzaWJsZQorCQkJICovCisJCQlpZiAoYnJpZGdlICYmIGJyaWRnZS0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDApCisJCQkJY29udGludWU7CisJCQlwY2lfcG1lX3dha2V1cChwbWVfZGV2LT5kZXYsIE5VTEwpOworCQl9IGVsc2UgeworCQkJbGlzdF9kZWwoJnBtZV9kZXYtPmxpc3QpOworCQkJa2ZyZWUocG1lX2Rldik7CiAJCX0KLQkJaWYgKCFsaXN0X2VtcHR5KCZwY2lfcG1lX2xpc3QpKQotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwY2lfcG1lX3dvcmssCi0JCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUE1FX1RJTUVPVVQpKTsKIAl9CisJaWYgKCFsaXN0X2VtcHR5KCZwY2lfcG1lX2xpc3QpKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBjaV9wbWVfd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFBNRV9USU1FT1VUKSk7CiAJbXV0ZXhfdW5sb2NrKCZwY2lfcG1lX2xpc3RfbXV0ZXgpOwogfQogCkBAIC0yMTkzLDIxICsyMjAzLDE4IEBACiB9CiAKIC8qKgotICogcGNpX2VuYWJsZV9hY3MgLSBlbmFibGUgQUNTIGlmIGhhcmR3YXJlIHN1cHBvcnQgaXQKKyAqIHBjaV9zdGRfZW5hYmxlX2FjcyAtIGVuYWJsZSBBQ1Mgb24gZGV2aWNlcyB1c2luZyBzdGFuZGFyZCBBQ1MgY2FwYWJpbGl0ZXMKICAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCiAgKi8KLXZvaWQgcGNpX2VuYWJsZV9hY3Moc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBpbnQgcGNpX3N0ZF9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHBvczsKIAl1MTYgY2FwOwogCXUxNiBjdHJsOwogCi0JaWYgKCFwY2lfYWNzX2VuYWJsZSkKLQkJcmV0dXJuOwotCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9BQ1MpOwogCWlmICghcG9zKQotCQlyZXR1cm47CisJCXJldHVybiAtRU5PREVWOwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQUNTX0NBUCwgJmNhcCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQUNTX0NUUkwsICZjdHJsKTsKQEAgLTIyMjUsNiArMjIzMiwyMyBAQAogCWN0cmwgfD0gKGNhcCAmIFBDSV9BQ1NfVUYpOwogCiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DVFJMLCBjdHJsKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBjaV9lbmFibGVfYWNzIC0gZW5hYmxlIEFDUyBpZiBoYXJkd2FyZSBzdXBwb3J0IGl0CisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICovCit2b2lkIHBjaV9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKCFwY2lfYWNzX2VuYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFwY2lfc3RkX2VuYWJsZV9hY3MoZGV2KSkKKwkJcmV0dXJuOworCisJcGNpX2Rldl9zcGVjaWZpY19lbmFibGVfYWNzKGRldik7CiB9CiAKIHN0YXRpYyBib29sIHBjaV9hY3NfZmxhZ3NfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2IGFjc19mbGFncykKQEAgLTQyNTAsNiArNDI3NCw3IEBACiAJCQkJIlJvdW5kaW5nIHVwIHNpemUgb2YgcmVzb3VyY2UgIyVkIHRvICUjbGx4LlxuIiwKIAkJCQlpLCAodW5zaWduZWQgbG9uZyBsb25nKXNpemUpOwogCQl9CisJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXItPmVuZCA9IHNpemUgLSAxOwogCQlyLT5zdGFydCA9IDA7CiAJfQpAQCAtNDI2Myw2ICs0Mjg4LDcgQEAKIAkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKIAkJCWlmICghKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQogCQkJCWNvbnRpbnVlOworCQkJci0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAkJCXItPmVuZCA9IHJlc291cmNlX3NpemUocikgLSAxOwogCQkJci0+c3RhcnQgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaCBiL2RyaXZlcnMvcGNpL3BjaS5oCmluZGV4IDRkZjM4ZGYuLjZiZDA4MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBEUklWRVJTX1BDSV9ICiAjZGVmaW5lIERSSVZFUlNfUENJX0gKIAotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCiAjZGVmaW5lIFBDSV9DRkdfU1BBQ0VfU0laRQkyNTYKICNkZWZpbmUgUENJX0NGR19TUEFDRV9FWFBfU0laRQk0MDk2CiAKQEAgLTI0MCw4ICsyMzgsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CS8qIGxvd2VzdCBudW1iZXJlZCBQRiAqLwogCXN0cnVjdCBwY2lfZGV2ICpzZWxmOwkvKiB0aGlzIFBGICovCiAJc3RydWN0IG11dGV4IGxvY2s7CS8qIGxvY2sgZm9yIFZGIGJ1cyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBtdGFzazsgLyogVkYgTWlncmF0aW9uIHRhc2sgKi8KLQl1OCBfX2lvbWVtICptc3RhdGU7CS8qIFZGIE1pZ3JhdGlvbiBTdGF0ZSBBcnJheSAqLwogfTsKIAogI2lmZGVmIENPTkZJR19QQ0lfQVRTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA2ZTM0NDk4Li5lZjA5ZjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTI1Miw2ICsyNTIsNyBAQAogCQkJLyogQWRkcmVzcyBhYm92ZSAzMi1iaXQgYm91bmRhcnk7IGRpc2FibGUgdGhlIEJBUiAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcywgMCk7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgNCwgMCk7CisJCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCQlyZWdpb24uc3RhcnQgPSAwOwogCQkJcmVnaW9uLmVuZCA9IHN6NjQ7CiAJCQliYXJfZGlzYWJsZWQgPSB0cnVlOwpAQCAtNzMxLDIyICs3MzIsNiBAQAogCXJldHVybiBjaGlsZDsKIH0KIAotc3RhdGljIHZvaWQgcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQsIGludCBtYXgpCi17Ci0Jc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IGNoaWxkLT5wYXJlbnQ7Ci0KLQkvKiBBdHRlbXB0cyB0byBmaXggdGhhdCB1cCBhcmUgcmVhbGx5IGRhbmdlcm91cyB1bmxlc3MKLQkgICB3ZSdyZSBnb2luZyB0byByZS1hc3NpZ24gYWxsIGJ1cyBudW1iZXJzLiAqLwotCWlmICghcGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAocGFyZW50LT5wYXJlbnQgJiYgcGFyZW50LT5idXNuX3Jlcy5lbmQgPCBtYXgpIHsKLQkJcGFyZW50LT5idXNuX3Jlcy5lbmQgPSBtYXg7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwYXJlbnQtPnNlbGYsIFBDSV9TVUJPUkRJTkFURV9CVVMsIG1heCk7Ci0JCXBhcmVudCA9IHBhcmVudC0+cGFyZW50OwotCX0KLX0KLQogLyoKICAqIElmIGl0J3MgYSBicmlkZ2UsIGNvbmZpZ3VyZSBpdCBhbmQgc2NhbiB0aGUgYnVzIGJlaGluZCBpdC4KICAqIEZvciBDYXJkQnVzIGJyaWRnZXMsIHdlIGRvbid0IHNjYW4gYmVoaW5kIGFzIHRoZSBkZXZpY2VzIHdpbGwKQEAgLTc4Miw3ICs3NjcsNyBAQAogCS8qIENoZWNrIGlmIHNldHVwIGlzIHNlbnNpYmxlIGF0IGFsbCAqLwogCWlmICghcGFzcyAmJgogCSAgICAocHJpbWFyeSAhPSBidXMtPm51bWJlciB8fCBzZWNvbmRhcnkgPD0gYnVzLT5udW1iZXIgfHwKLQkgICAgIHNlY29uZGFyeSA+IHN1Ym9yZGluYXRlKSkgeworCSAgICAgc2Vjb25kYXJ5ID4gc3Vib3JkaW5hdGUgfHwgc3Vib3JkaW5hdGUgPiBidXMtPmJ1c25fcmVzLmVuZCkpIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiYnJpZGdlIGNvbmZpZ3VyYXRpb24gaW52YWxpZCAoW2J1cyAlMDJ4LSUwMnhdKSwgcmVjb25maWd1cmluZ1xuIiwKIAkJCSBzZWNvbmRhcnksIHN1Ym9yZGluYXRlKTsKIAkJYnJva2VuID0gMTsKQEAgLTgwNSwxMSArNzkwLDEwIEBACiAJCQlnb3RvIG91dDsKIAogCQkvKgotCQkgKiBJZiB3ZSBhbHJlYWR5IGdvdCB0byB0aGlzIGJ1cyB0aHJvdWdoIGEgZGlmZmVyZW50IGJyaWRnZSwKLQkJICogZG9uJ3QgcmUtYWRkIGl0LiBUaGlzIGNhbiBoYXBwZW4gd2l0aCB0aGUgaTQ1ME5YIGNoaXBzZXQuCi0JCSAqCi0JCSAqIEhvd2V2ZXIsIHdlIGNvbnRpbnVlIHRvIGRlc2NlbmQgZG93biB0aGUgaGllcmFyY2h5IGFuZAotCQkgKiBzY2FuIHJlbWFpbmluZyBjaGlsZCBidXNlcy4KKwkJICogVGhlIGJ1cyBtaWdodCBhbHJlYWR5IGV4aXN0IGZvciB0d28gcmVhc29uczogRWl0aGVyIHdlIGFyZQorCQkgKiByZXNjYW5uaW5nIHRoZSBidXMgb3IgdGhlIGJ1cyBpcyByZWFjaGFibGUgdGhyb3VnaCBtb3JlIHRoYW4KKwkJICogb25lIGJyaWRnZS4gVGhlIHNlY29uZCBjYXNlIGNhbiBoYXBwZW4gd2l0aCB0aGUgaTQ1ME5YCisJCSAqIGNoaXBzZXQuCiAJCSAqLwogCQljaGlsZCA9IHBjaV9maW5kX2J1cyhwY2lfZG9tYWluX25yKGJ1cyksIHNlY29uZGFyeSk7CiAJCWlmICghY2hpbGQpIHsKQEAgLTgyMiwxNyArODA2LDE5IEBACiAJCX0KIAogCQljbWF4ID0gcGNpX3NjYW5fY2hpbGRfYnVzKGNoaWxkKTsKLQkJaWYgKGNtYXggPiBtYXgpCi0JCQltYXggPSBjbWF4OwotCQlpZiAoY2hpbGQtPmJ1c25fcmVzLmVuZCA+IG1heCkKLQkJCW1heCA9IGNoaWxkLT5idXNuX3Jlcy5lbmQ7CisJCWlmIChjbWF4ID4gc3Vib3JkaW5hdGUpCisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJicmlkZ2UgaGFzIHN1Ym9yZGluYXRlICUwMnggYnV0IG1heCBidXNuICUwMnhcbiIsCisJCQkJIHN1Ym9yZGluYXRlLCBjbWF4KTsKKwkJLyogc3Vib3JkaW5hdGUgc2hvdWxkIGVxdWFsIGNoaWxkLT5idXNuX3Jlcy5lbmQgKi8KKwkJaWYgKHN1Ym9yZGluYXRlID4gbWF4KQorCQkJbWF4ID0gc3Vib3JkaW5hdGU7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogV2UgbmVlZCB0byBhc3NpZ24gYSBudW1iZXIgdG8gdGhpcyBidXMgd2hpY2ggd2UgYWx3YXlzCiAJCSAqIGRvIGluIHRoZSBzZWNvbmQgcGFzcy4KIAkJICovCiAJCWlmICghcGFzcykgewotCQkJaWYgKHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSB8fCBicm9rZW4pCisJCQlpZiAocGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpIHx8IGJyb2tlbiB8fCBpc19jYXJkYnVzKQogCQkJCS8qIFRlbXBvcmFyaWx5IGRpc2FibGUgZm9yd2FyZGluZyBvZiB0aGUKIAkJCQkgICBjb25maWd1cmF0aW9uIGN5Y2xlcyBvbiBhbGwgYnJpZGdlcyBpbgogCQkJCSAgIHRoaXMgYnVzIHNlZ21lbnQgdG8gYXZvaWQgcG9zc2libGUKQEAgLTg0NCwxOSArODMwLDI1IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCisJCWlmIChtYXggPj0gYnVzLT5idXNuX3Jlcy5lbmQpIHsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgImNhbid0IGFsbG9jYXRlIGNoaWxkIGJ1cyAlMDJ4IGZyb20gJXBSXG4iLAorCQkJCSBtYXgsICZidXMtPmJ1c25fcmVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJLyogQ2xlYXIgZXJyb3JzICovCiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsIDB4ZmZmZik7CiAKLQkJLyogUHJldmVudCBhc3NpZ25pbmcgYSBidXMgbnVtYmVyIHRoYXQgYWxyZWFkeSBleGlzdHMuCi0JCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgYnJpZGdlIGlzIGhvdC1wbHVnZ2VkLCBzbyBpbgotCQkgKiB0aGlzIGNhc2Ugd2Ugb25seSByZS1zY2FuIHRoaXMgYnVzLiAqLworCQkvKiBUaGUgYnVzIHdpbGwgYWxyZWFkeSBleGlzdCBpZiB3ZSBhcmUgcmVzY2FubmluZyAqLwogCQljaGlsZCA9IHBjaV9maW5kX2J1cyhwY2lfZG9tYWluX25yKGJ1cyksIG1heCsxKTsKIAkJaWYgKCFjaGlsZCkgewotCQkJY2hpbGQgPSBwY2lfYWRkX25ld19idXMoYnVzLCBkZXYsICsrbWF4KTsKKwkJCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKGJ1cywgZGV2LCBtYXgrMSk7CiAJCQlpZiAoIWNoaWxkKQogCQkJCWdvdG8gb3V0OwotCQkJcGNpX2J1c19pbnNlcnRfYnVzbl9yZXMoY2hpbGQsIG1heCwgMHhmZik7CisJCQlwY2lfYnVzX2luc2VydF9idXNuX3JlcyhjaGlsZCwgbWF4KzEsCisJCQkJCQlidXMtPmJ1c25fcmVzLmVuZCk7CiAJCX0KKwkJbWF4Kys7CiAJCWJ1c2VzID0gKGJ1c2VzICYgMHhmZjAwMDAwMCkKIAkJICAgICAgfCAoKHVuc2lnbmVkIGludCkoY2hpbGQtPnByaW1hcnkpICAgICA8PCAgMCkKIAkJICAgICAgfCAoKHVuc2lnbmVkIGludCkoY2hpbGQtPmJ1c25fcmVzLnN0YXJ0KSAgIDw8ICA4KQpAQCAtODc4LDIwICs4NzAsNyBAQAogCiAJCWlmICghaXNfY2FyZGJ1cykgewogCQkJY2hpbGQtPmJyaWRnZV9jdGwgPSBiY3RsOwotCQkJLyoKLQkJCSAqIEFkanVzdCBzdWJvcmRpbmF0ZSBidXNuciBpbiBwYXJlbnQgYnVzZXMuCi0JCQkgKiBXZSBkbyB0aGlzIGJlZm9yZSBzY2FubmluZyBmb3IgY2hpbGRyZW4gYmVjYXVzZQotCQkJICogc29tZSBkZXZpY2VzIG1heSBub3QgYmUgZGV0ZWN0ZWQgaWYgdGhlIGJpb3MKLQkJCSAqIHdhcyBsYXp5LgotCQkJICovCi0JCQlwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKGNoaWxkLCBtYXgpOwotCQkJLyogTm93IHdlIGNhbiBzY2FuIGFsbCBzdWJvcmRpbmF0ZSBidXNlcy4uLiAqLwogCQkJbWF4ID0gcGNpX3NjYW5fY2hpbGRfYnVzKGNoaWxkKTsKLQkJCS8qCi0JCQkgKiBub3cgZml4IGl0IHVwIGFnYWluIHNpbmNlIHdlIGhhdmUgZm91bmQKLQkJCSAqIHRoZSByZWFsIHZhbHVlIG9mIG1heC4KLQkJCSAqLwotCQkJcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihjaGlsZCwgbWF4KTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBGb3IgQ2FyZEJ1cyBicmlkZ2VzLCB3ZSBsZWF2ZSA0IGJ1cyBudW1iZXJzCkBAIC05MjIsMTEgKzkwMSwxNSBAQAogCQkJCX0KIAkJCX0KIAkJCW1heCArPSBpOwotCQkJcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihjaGlsZCwgbWF4KTsKIAkJfQogCQkvKgogCQkgKiBTZXQgdGhlIHN1Ym9yZGluYXRlIGJ1cyBudW1iZXIgdG8gaXRzIHJlYWwgdmFsdWUuCiAJCSAqLworCQlpZiAobWF4ID4gYnVzLT5idXNuX3Jlcy5lbmQpIHsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgIm1heCBidXNuICUwMnggaXMgb3V0c2lkZSAlcFJcbiIsCisJCQkJIG1heCwgJmJ1cy0+YnVzbl9yZXMpOworCQkJbWF4ID0gYnVzLT5idXNuX3Jlcy5lbmQ7CisJCX0KIAkJcGNpX2J1c191cGRhdGVfYnVzbl9yZXNfZW5kKGNoaWxkLCBtYXgpOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBtYXgpOwogCX0KQEAgLTExMjUsMTAgKzExMDgsMTAgQEAKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAogCQkvKgotCQkgKglEbyB0aGUgdWdseSBsZWdhY3kgbW9kZSBzdHVmZiBoZXJlIHJhdGhlciB0aGFuIGJyb2tlbiBjaGlwCi0JCSAqCXF1aXJrIGNvZGUuIExlZ2FjeSBtb2RlIEFUQSBjb250cm9sbGVycyBoYXZlIGZpeGVkCi0JCSAqCWFkZHJlc3Nlcy4gVGhlc2UgYXJlIG5vdCBhbHdheXMgZWNob2VkIGluIEJBUjAtMywgYW5kCi0JCSAqCUJBUjAtMyBpbiBhIGZldyBjYXNlcyBjb250YWluIGp1bmshCisJCSAqIERvIHRoZSB1Z2x5IGxlZ2FjeSBtb2RlIHN0dWZmIGhlcmUgcmF0aGVyIHRoYW4gYnJva2VuIGNoaXAKKwkJICogcXVpcmsgY29kZS4gTGVnYWN5IG1vZGUgQVRBIGNvbnRyb2xsZXJzIGhhdmUgZml4ZWQKKwkJICogYWRkcmVzc2VzLiBUaGVzZSBhcmUgbm90IGFsd2F5cyBlY2hvZWQgaW4gQkFSMC0zLCBhbmQKKwkJICogQkFSMC0zIGluIGEgZmV3IGNhc2VzIGNvbnRhaW4ganVuayEKIAkJICovCiAJCWlmIChjbGFzcyA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpIHsKIAkJCXU4IHByb2dpZjsKQEAgLTExMzksMTEgKzExMjIsMTUgQEAKIAkJCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVswXTsKIAkJCQlyZXMtPmZsYWdzID0gTEVHQUNZX0lPX1JFU09VUkNFOwogCQkJCXBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKGRldi0+YnVzLCByZXMsICZyZWdpb24pOworCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgImxlZ2FjeSBJREUgcXVpcms6IHJlZyAweDEwOiAlcFJcbiIsCisJCQkJCSByZXMpOwogCQkJCXJlZ2lvbi5zdGFydCA9IDB4M0Y2OwogCQkJCXJlZ2lvbi5lbmQgPSAweDNGNjsKIAkJCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVsxXTsKIAkJCQlyZXMtPmZsYWdzID0gTEVHQUNZX0lPX1JFU09VUkNFOwogCQkJCXBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKGRldi0+YnVzLCByZXMsICZyZWdpb24pOworCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgImxlZ2FjeSBJREUgcXVpcms6IHJlZyAweDE0OiAlcFJcbiIsCisJCQkJCSByZXMpOwogCQkJfQogCQkJaWYgKChwcm9naWYgJiA0KSA9PSAwKSB7CiAJCQkJcmVnaW9uLnN0YXJ0ID0gMHgxNzA7CkBAIC0xMTUxLDExICsxMTM4LDE1IEBACiAJCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbMl07CiAJCQkJcmVzLT5mbGFncyA9IExFR0FDWV9JT19SRVNPVVJDRTsKIAkJCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYtPmJ1cywgcmVzLCAmcmVnaW9uKTsKKwkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxODogJXBSXG4iLAorCQkJCQkgcmVzKTsKIAkJCQlyZWdpb24uc3RhcnQgPSAweDM3NjsKIAkJCQlyZWdpb24uZW5kID0gMHgzNzY7CiAJCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbM107CiAJCQkJcmVzLT5mbGFncyA9IExFR0FDWV9JT19SRVNPVVJDRTsKIAkJCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYtPmJ1cywgcmVzLCAmcmVnaW9uKTsKKwkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxYzogJXBSXG4iLAorCQkJCQkgcmVzKTsKIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTE4MzUsNyArMTgyNiw3IEBACiAJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9QQ0lfRklYRUQ7CiAJfQogCi0JY29uZmxpY3QgPSBpbnNlcnRfcmVzb3VyY2VfY29uZmxpY3QocGFyZW50X3JlcywgcmVzKTsKKwljb25mbGljdCA9IHJlcXVlc3RfcmVzb3VyY2VfY29uZmxpY3QocGFyZW50X3JlcywgcmVzKTsKIAogCWlmIChjb25mbGljdCkKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCA1Y2I3MjZjLi5lNzI5MjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtMjk2LDYgKzI5Niw3IEBACiAJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2VbMF07CiAKIAlpZiAoKHItPnN0YXJ0ICYgMHgzZmZmZmZmKSB8fCByLT5lbmQgIT0gci0+c3RhcnQgKyAweDNmZmZmZmYpIHsKKwkJci0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAkJci0+c3RhcnQgPSAwOwogCQlyLT5lbmQgPSAweDNmZmZmZmY7CiAJfQpAQCAtOTM3LDYgKzkzOCw4IEBACiBzdGF0aWMgdm9pZCBxdWlya19kdW5vcmQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZSBbMV07CisKKwlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCXItPnN0YXJ0ID0gMDsKIAlyLT5lbmQgPSAweGZmZmZmZjsKIH0KQEAgLTE3NDAsNiArMTc0Myw3IEBACiAJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2VbMF07CiAKIAlpZiAoci0+c3RhcnQgJiAweDgpIHsKKwkJci0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAkJci0+c3RhcnQgPSAwOwogCQlyLT5lbmQgPSAweGY7CiAJfQpAQCAtMTc2OSw2ICsxNzczLDcgQEAKIAkJCWRldl9pbmZvKCZkZXYtPmRldiwKIAkJCQkgIlJlLWFsbG9jYXRpbmcgUExYIFBDSSA5MDUwIEJBUiAldSB0byBsZW5ndGggMjU2IHRvIGF2b2lkIGJpdCA3IGJ1Z1xuIiwKIAkJCQkgYmFyKTsKKwkJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCQlyLT5zdGFydCA9IDA7CiAJCQlyLT5lbmQgPSAweGZmOwogCQl9CkBAIC0zNDIzLDYgKzM0MjgsNjEgQEAKICNlbmRpZgogfQogCisvKgorICogTWFueSBJbnRlbCBQQ0ggcm9vdCBwb3J0cyBkbyBwcm92aWRlIEFDUy1saWtlIGZlYXR1cmVzIHRvIGRpc2FibGUgcGVlcgorICogdHJhbnNhY3Rpb25zIGFuZCB2YWxpZGF0ZSBidXMgbnVtYmVycyBpbiByZXF1ZXN0cywgYnV0IGRvIG5vdCBwcm92aWRlIGFuCisgKiBhY3R1YWwgUENJZSBBQ1MgY2FwYWJpbGl0eS4gIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZGV2aWNlIElEcyBrbm93biB0byBmYWxsCisgKiBpbnRvIHRoYXQgY2F0ZWdvcnkgYXMgcHJvdmlkZWQgYnkgSW50ZWwgaW4gUmVkIEhhdCBidWd6aWxsYSAxMDM3Njg0LgorICovCitzdGF0aWMgY29uc3QgdTE2IHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX2lkc1tdID0geworCS8qIEliZXhwZWFrIFBDSCAqLworCTB4M2I0MiwgMHgzYjQzLCAweDNiNDQsIDB4M2I0NSwgMHgzYjQ2LCAweDNiNDcsIDB4M2I0OCwgMHgzYjQ5LAorCTB4M2I0YSwgMHgzYjRiLCAweDNiNGMsIDB4M2I0ZCwgMHgzYjRlLCAweDNiNGYsIDB4M2I1MCwgMHgzYjUxLAorCS8qIENvdWdhcnBvaW50IFBDSCAqLworCTB4MWMxMCwgMHgxYzExLCAweDFjMTIsIDB4MWMxMywgMHgxYzE0LCAweDFjMTUsIDB4MWMxNiwgMHgxYzE3LAorCTB4MWMxOCwgMHgxYzE5LCAweDFjMWEsIDB4MWMxYiwgMHgxYzFjLCAweDFjMWQsIDB4MWMxZSwgMHgxYzFmLAorCS8qIFBhbnRoZXJwb2ludCBQQ0ggKi8KKwkweDFlMTAsIDB4MWUxMSwgMHgxZTEyLCAweDFlMTMsIDB4MWUxNCwgMHgxZTE1LCAweDFlMTYsIDB4MWUxNywKKwkweDFlMTgsIDB4MWUxOSwgMHgxZTFhLCAweDFlMWIsIDB4MWUxYywgMHgxZTFkLCAweDFlMWUsIDB4MWUxZiwKKwkvKiBMeW54cG9pbnQtSCBQQ0ggKi8KKwkweDhjMTAsIDB4OGMxMSwgMHg4YzEyLCAweDhjMTMsIDB4OGMxNCwgMHg4YzE1LCAweDhjMTYsIDB4OGMxNywKKwkweDhjMTgsIDB4OGMxOSwgMHg4YzFhLCAweDhjMWIsIDB4OGMxYywgMHg4YzFkLCAweDhjMWUsIDB4OGMxZiwKKwkvKiBMeW54cG9pbnQtTFAgUENIICovCisJMHg5YzEwLCAweDljMTEsIDB4OWMxMiwgMHg5YzEzLCAweDljMTQsIDB4OWMxNSwgMHg5YzE2LCAweDljMTcsCisJMHg5YzE4LCAweDljMTksIDB4OWMxYSwgMHg5YzFiLAorCS8qIFdpbGRjYXQgUENIICovCisJMHg5YzkwLCAweDljOTEsIDB4OWM5MiwgMHg5YzkzLCAweDljOTQsIDB4OWM5NSwgMHg5Yzk2LCAweDljOTcsCisJMHg5Yzk4LCAweDljOTksIDB4OWM5YSwgMHg5YzliLAorfTsKKworc3RhdGljIGJvb2wgcGNpX3F1aXJrX2ludGVsX3BjaF9hY3NfbWF0Y2goc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKworCS8qIEZpbHRlciBvdXQgYSBmZXcgb2J2aW91cyBub24tbWF0Y2hlcyBmaXJzdCAqLworCWlmICghcGNpX2lzX3BjaWUoZGV2KSB8fCBwY2lfcGNpZV90eXBlKGRldikgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpX3F1aXJrX2ludGVsX3BjaF9hY3NfaWRzKTsgaSsrKQorCQlpZiAocGNpX3F1aXJrX2ludGVsX3BjaF9hY3NfaWRzW2ldID09IGRldi0+ZGV2aWNlKQorCQkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNkZWZpbmUgSU5URUxfUENIX0FDU19GTEFHUyAoUENJX0FDU19SUiB8IFBDSV9BQ1NfQ1IgfCBQQ0lfQUNTX1VGIHwgUENJX0FDU19TVikKKworc3RhdGljIGludCBwY2lfcXVpcmtfaW50ZWxfcGNoX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MTYgYWNzX2ZsYWdzKQoreworCXUxNiBmbGFncyA9IGRldi0+ZGV2X2ZsYWdzICYgUENJX0RFVl9GTEFHU19BQ1NfRU5BQkxFRF9RVUlSSyA/CisJCSAgICBJTlRFTF9QQ0hfQUNTX0ZMQUdTIDogMDsKKworCWlmICghcGNpX3F1aXJrX2ludGVsX3BjaF9hY3NfbWF0Y2goZGV2KSkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwlyZXR1cm4gYWNzX2ZsYWdzICYgfmZsYWdzID8gMCA6IDE7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2Rldl9hY3NfZW5hYmxlZCB7CiAJdTE2IHZlbmRvcjsKIAl1MTYgZGV2aWNlOwpAQCAtMzQzNCw2ICszNDk0LDcgQEAKIAl7IFBDSV9WRU5ET1JfSURfQVRJLCAweDQzOWQsIHBjaV9xdWlya19hbWRfc2JfYWNzIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0FUSSwgMHg0Mzg0LCBwY2lfcXVpcmtfYW1kX3NiX2FjcyB9LAogCXsgUENJX1ZFTkRPUl9JRF9BVEksIDB4NDM5OSwgcGNpX3F1aXJrX2FtZF9zYl9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9BTllfSUQsIHBjaV9xdWlya19pbnRlbF9wY2hfYWNzIH0sCiAJeyAwIH0KIH07CiAKQEAgLTM0NjEsMyArMzUyMiwxMzIgQEAKIAogCXJldHVybiAtRU5PVFRZOwogfQorCisvKiBDb25maWcgc3BhY2Ugb2Zmc2V0IG9mIFJvb3QgQ29tcGxleCBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfTFBDX1JDQkFfUkVHIDB4ZjAKKy8qIDMxOjE0IFJDQkEgYWRkcmVzcyAqLworI2RlZmluZSBJTlRFTF9MUENfUkNCQV9NQVNLIDB4ZmZmZmMwMDAKKy8qIFJDQkEgRW5hYmxlICovCisjZGVmaW5lIElOVEVMX0xQQ19SQ0JBX0VOQUJMRSAoMSA8PCAwKQorCisvKiBCYWNrYm9uZSBTY3JhdGNoIFBhZCBSZWdpc3RlciAqLworI2RlZmluZSBJTlRFTF9CU1BSX1JFRyAweDExMDQKKy8qIEJhY2tib25lIFBlZXIgTm9uLVBvc3RlZCBEaXNhYmxlICovCisjZGVmaW5lIElOVEVMX0JTUFJfUkVHX0JQTlBEICgxIDw8IDgpCisvKiBCYWNrYm9uZSBQZWVyIFBvc3RlZCBEaXNhYmxlICovCisjZGVmaW5lIElOVEVMX0JTUFJfUkVHX0JQUEQgICgxIDw8IDkpCisKKy8qIFVwc3RyZWFtIFBlZXIgRGVjb2RlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfVVBEQ1JfUkVHIDB4MTExNAorLyogNTowIFBlZXIgRGVjb2RlIEVuYWJsZSBiaXRzICovCisjZGVmaW5lIElOVEVMX1VQRENSX1JFR19NQVNLIDB4M2YKKworc3RhdGljIGludCBwY2lfcXVpcmtfZW5hYmxlX2ludGVsX2xwY19hY3Moc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgcmNiYSwgYnNwciwgdXBkY3I7CisJdm9pZCBfX2lvbWVtICpyY2JhX21lbTsKKworCS8qCisJICogUmVhZCB0aGUgUkNCQSByZWdpc3RlciBmcm9tIHRoZSBMUEMgKEQzMTpGMCkuICBQQ0ggcm9vdCBwb3J0cworCSAqIGFyZSBEMjg6RiogYW5kIHRoZXJlZm9yZSBnZXQgcHJvYmVkIGJlZm9yZSBMUEMsIHRodXMgd2UgY2FuJ3QKKwkgKiB1c2UgcGNpX2dldF9zbG90L3BjaV9yZWFkX2NvbmZpZ19kd29yZCBoZXJlLgorCSAqLworCXBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQoZGV2LT5idXMsIFBDSV9ERVZGTigzMSwgMCksCisJCQkJICBJTlRFTF9MUENfUkNCQV9SRUcsICZyY2JhKTsKKwlpZiAoIShyY2JhICYgSU5URUxfTFBDX1JDQkFfRU5BQkxFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyY2JhX21lbSA9IGlvcmVtYXBfbm9jYWNoZShyY2JhICYgSU5URUxfTFBDX1JDQkFfTUFTSywKKwkJCQkgICBQQUdFX0FMSUdOKElOVEVMX1VQRENSX1JFRykpOworCWlmICghcmNiYV9tZW0pCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBUaGUgQlNQUiBjYW4gZGlzYWxsb3cgcGVlciBjeWNsZXMsIGJ1dCBpdCdzIHNldCBieSBzb2Z0IHN0cmFwIGFuZAorCSAqIHRoZXJlZm9yZSByZWFkLW9ubHkuICBJZiBib3RoIHBvc3RlZCBhbmQgbm9uLXBvc3RlZCBwZWVyIGN5Y2xlcyBhcmUKKwkgKiBkaXNhbGxvd2VkLCB3ZSdyZSBvay4gIElmIGVpdGhlciBhcmUgYWxsb3dlZCwgdGhlbiB3ZSBuZWVkIHRvIHVzZQorCSAqIHRoZSBVUERDUiB0byBkaXNhYmxlIHBlZXIgZGVjb2RlcyBmb3IgZWFjaCBwb3J0LiAgVGhpcyBwcm92aWRlcyB0aGUKKwkgKiBQQ0llIEFDUyBlcXVpdmFsZW50IG9mIFBDSV9BQ1NfUlIgfCBQQ0lfQUNTX0NSIHwgUENJX0FDU19VRgorCSAqLworCWJzcHIgPSByZWFkbChyY2JhX21lbSArIElOVEVMX0JTUFJfUkVHKTsKKwlic3ByICY9IElOVEVMX0JTUFJfUkVHX0JQTlBEIHwgSU5URUxfQlNQUl9SRUdfQlBQRDsKKwlpZiAoYnNwciAhPSAoSU5URUxfQlNQUl9SRUdfQlBOUEQgfCBJTlRFTF9CU1BSX1JFR19CUFBEKSkgeworCQl1cGRjciA9IHJlYWRsKHJjYmFfbWVtICsgSU5URUxfVVBEQ1JfUkVHKTsKKwkJaWYgKHVwZGNyICYgSU5URUxfVVBEQ1JfUkVHX01BU0spIHsKKwkJCWRldl9pbmZvKCZkZXYtPmRldiwgIkRpc2FibGluZyBVUERDUiBwZWVyIGRlY29kZXNcbiIpOworCQkJdXBkY3IgJj0gfklOVEVMX1VQRENSX1JFR19NQVNLOworCQkJd3JpdGVsKHVwZGNyLCByY2JhX21lbSArIElOVEVMX1VQRENSX1JFRyk7CisJCX0KKwl9CisKKwlpb3VubWFwKHJjYmFfbWVtKTsKKwlyZXR1cm4gMDsKK30KKworLyogTWlzY2VsbGFuZW91cyBQb3J0IENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfTVBDX1JFRyAweGQ4CisvKiBNUEM6IEludmFsaWQgUmVjZWl2ZSBCdXMgTnVtYmVyIENoZWNrIEVuYWJsZSAqLworI2RlZmluZSBJTlRFTF9NUENfUkVHX0lSQk5DRSAoMSA8PCAyNikKKworc3RhdGljIHZvaWQgcGNpX3F1aXJrX2VuYWJsZV9pbnRlbF9ycF9tcGNfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIG1wYzsKKworCS8qCisJICogV2hlbiBlbmFibGVkLCB0aGUgSVJCTkNFIGJpdCBvZiB0aGUgTVBDIHJlZ2lzdGVyIGVuYWJsZXMgdGhlCisJICogZXF1aXZhbGVudCBvZiBQQ0kgQUNTIFNvdXJjZSBWYWxpZGF0aW9uIChQQ0lfQUNTX1NWKSwgd2hpY2gKKwkgKiBlbnN1cmVzIHRoYXQgcmVxdWVzdGVyIElEcyBmYWxsIHdpdGhpbiB0aGUgYnVzIG51bWJlciByYW5nZQorCSAqIG9mIHRoZSBicmlkZ2UuICBFbmFibGUgaWYgbm90IGFscmVhZHkuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgSU5URUxfTVBDX1JFRywgJm1wYyk7CisJaWYgKCEobXBjICYgSU5URUxfTVBDX1JFR19JUkJOQ0UpKSB7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkVuYWJsaW5nIE1QQyBJUkJOQ0VcbiIpOworCQltcGMgfD0gSU5URUxfTVBDX1JFR19JUkJOQ0U7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIElOVEVMX01QQ19SRUcsIG1wYyk7CisJfQorfQorCitzdGF0aWMgaW50IHBjaV9xdWlya19lbmFibGVfaW50ZWxfcGNoX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICghcGNpX3F1aXJrX2ludGVsX3BjaF9hY3NfbWF0Y2goZGV2KSkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwlpZiAocGNpX3F1aXJrX2VuYWJsZV9pbnRlbF9scGNfYWNzKGRldikpIHsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBJbnRlbCBQQ0ggQUNTIHF1aXJrXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGNpX3F1aXJrX2VuYWJsZV9pbnRlbF9ycF9tcGNfYWNzKGRldik7CisKKwlkZXYtPmRldl9mbGFncyB8PSBQQ0lfREVWX0ZMQUdTX0FDU19FTkFCTEVEX1FVSVJLOworCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiSW50ZWwgUENIIHJvb3QgcG9ydCBBQ1Mgd29ya2Fyb3VuZCBlbmFibGVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZfZW5hYmxlX2FjcyB7CisJdTE2IHZlbmRvcjsKKwl1MTYgZGV2aWNlOworCWludCAoKmVuYWJsZV9hY3MpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworfSBwY2lfZGV2X2VuYWJsZV9hY3NbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9BTllfSUQsIHBjaV9xdWlya19lbmFibGVfaW50ZWxfcGNoX2FjcyB9LAorCXsgMCB9Cit9OworCit2b2lkIHBjaV9kZXZfc3BlY2lmaWNfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBwY2lfZGV2X2VuYWJsZV9hY3MgKmk7CisJaW50IHJldDsKKworCWZvciAoaSA9IHBjaV9kZXZfZW5hYmxlX2FjczsgaS0+ZW5hYmxlX2FjczsgaSsrKSB7CisJCWlmICgoaS0+dmVuZG9yID09IGRldi0+dmVuZG9yIHx8CisJCSAgICAgaS0+dmVuZG9yID09ICh1MTYpUENJX0FOWV9JRCkgJiYKKwkJICAgIChpLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UgfHwKKwkJICAgICBpLT5kZXZpY2UgPT0gKHUxNilQQ0lfQU5ZX0lEKSkgeworCQkJcmV0ID0gaS0+ZW5hYmxlX2FjcyhkZXYpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldHVybjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3JvbS5jIGIvZHJpdmVycy9wY2kvcm9tLmMKaW5kZXggNWQ1OTU3Mi4uYzE4Mzk0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcm9tLmMKKysrIGIvZHJpdmVycy9wY2kvcm9tLmMKQEAgLTE5Nyw4ICsxOTcsMTAgQEAKIHZvaWQgcGNpX2NsZWFudXBfcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJnBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9DT1BZKSB7CiAJCWtmcmVlKCh2b2lkKikodW5zaWduZWQgbG9uZylyZXMtPnN0YXJ0KTsKKwkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1JPTV9DT1BZOwogCQlyZXMtPnN0YXJ0ID0gMDsKIAkJcmVzLT5lbmQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCAzZmYyYWM3Li40YTFiOTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtNTQsMTQgKzU0LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqcGNpX2RvX2ZpbmRfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGNoYXIgYnVzbnIpCiB7Ci0Jc3RydWN0IHBjaV9idXMqIGNoaWxkOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQ7CisJc3RydWN0IHBjaV9idXMgKnRtcDsKIAogCWlmKGJ1cy0+bnVtYmVyID09IGJ1c25yKQogCQlyZXR1cm4gYnVzOwogCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7Ci0JCWNoaWxkID0gcGNpX2RvX2ZpbmRfYnVzKHBjaV9idXNfYih0bXApLCBidXNucik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CisJCWNoaWxkID0gcGNpX2RvX2ZpbmRfYnVzKHRtcCwgYnVzbnIpOwogCQlpZihjaGlsZCkKIAkJCXJldHVybiBjaGlsZDsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKIAluID0gZnJvbSA/IGZyb20tPm5vZGUubmV4dCA6IHBjaV9yb290X2J1c2VzLm5leHQ7CiAJaWYgKG4gIT0gJnBjaV9yb290X2J1c2VzKQotCQliID0gcGNpX2J1c19iKG4pOworCQliID0gbGlzdF9lbnRyeShuLCBzdHJ1Y3QgcGNpX2J1cywgbm9kZSk7CiAJdXBfcmVhZCgmcGNpX2J1c19zZW0pOwogCXJldHVybiBiOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwppbmRleCA1YzA2MGIxLi43ZWVkNjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtNDQsNiArNDQsOSBAQAogCWlmICghcmVzLT5mbGFncykKIAkJcmV0dXJuOwogCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKQorCQlyZXR1cm47CisKIAkvKgogCSAqIElnbm9yZSBub24tbW92ZWFibGUgcmVzb3VyY2VzLiAgVGhpcyBtaWdodCBiZSBsZWdhY3kgcmVzb3VyY2VzIGZvcgogCSAqIHdoaWNoIG5vIGZ1bmN0aW9uYWwgQkFSIHJlZ2lzdGVyIGV4aXN0cyBvciBhbm90aGVyIGltcG9ydGFudApAQCAtMTAxLDExICsxMDQsNiBAQAogCiAJaWYgKGRpc2FibGUpCiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCi0JcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9VTlNFVDsKLQlkZXZfZGJnKCZkZXYtPmRldiwgIkJBUiAlZDogc2V0IHRvICVwUiAoUENJIGFkZHJlc3MgWyUjbGx4LSUjbGx4XSlcbiIsCi0JCXJlc25vLCByZXMsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5lbmQpOwogfQogCiBpbnQgcGNpX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSkKQEAgLTExMywxOCArMTExLDIzIEBACiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNvdXJjZV07CiAJc3RydWN0IHJlc291cmNlICpyb290LCAqY29uZmxpY3Q7CiAKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpIHsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiY2FuJ3QgY2xhaW0gQkFSICVkICVwUjogbm8gYWRkcmVzcyBhc3NpZ25lZFxuIiwKKwkJCSByZXNvdXJjZSwgcmVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcm9vdCA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKCFyb290KSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIm5vIGNvbXBhdGlibGUgYnJpZGdlIHdpbmRvdyBmb3IgJXBSXG4iLAotCQkJIHJlcyk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgImNhbid0IGNsYWltIEJBUiAlZCAlcFI6IG5vIGNvbXBhdGlibGUgYnJpZGdlIHdpbmRvd1xuIiwKKwkJCSByZXNvdXJjZSwgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJY29uZmxpY3QgPSByZXF1ZXN0X3Jlc291cmNlX2NvbmZsaWN0KHJvb3QsIHJlcyk7CiAJaWYgKGNvbmZsaWN0KSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwKLQkJCSAiYWRkcmVzcyBzcGFjZSBjb2xsaXNpb246ICVwUiBjb25mbGljdHMgd2l0aCAlcyAlcFJcbiIsCi0JCQkgcmVzLCBjb25mbGljdC0+bmFtZSwgY29uZmxpY3QpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJjYW4ndCBjbGFpbSBCQVIgJWQgJXBSOiBhZGRyZXNzIGNvbmZsaWN0IHdpdGggJXMgJXBSXG4iLAorCQkJIHJlc291cmNlLCByZXMsIGNvbmZsaWN0LT5uYW1lLCBjb25mbGljdCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0yNjMsNiArMjY2LDcgQEAKIAlyZXNvdXJjZV9zaXplX3QgYWxpZ24sIHNpemU7CiAJaW50IHJldDsKIAorCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlhbGlnbiA9IHBjaV9yZXNvdXJjZV9hbGlnbm1lbnQoZGV2LCByZXMpOwogCWlmICghYWxpZ24pIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhc3NpZ24gJXBSICIKQEAgLTI4Miw2ICsyODYsNyBAQAogCQlyZXQgPSBwY2lfcmV2ZXJ0X2Z3X2FkZHJlc3MocmVzLCBkZXYsIHJlc25vLCBzaXplKTsKIAogCWlmICghcmV0KSB7CisJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CiAJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfU1RBUlRBTElHTjsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBhc3NpZ25lZCAlcFJcbiIsIHJlc25vLCByZXMpOwogCQlpZiAocmVzbm8gPCBQQ0lfQlJJREdFX1JFU09VUkNFUykKQEAgLTI5Nyw2ICszMDIsNyBAQAogCXJlc291cmNlX3NpemVfdCBuZXdfc2l6ZTsKIAlpbnQgcmV0OwogCisJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCWlmICghcmVzLT5wYXJlbnQpIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCByZWFzc2lnbiBhbiB1bmFzc2lnbmVkIHJlc291cmNlICVwUiAiCiAJCQkgIlxuIiwgcmVzbm8sIHJlcyk7CkBAIC0zMDcsNiArMzEzLDcgQEAKIAluZXdfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKSArIGFkZHNpemU7CiAJcmV0ID0gX3BjaV9hc3NpZ25fcmVzb3VyY2UoZGV2LCByZXNubywgbmV3X3NpemUsIG1pbl9hbGlnbik7CiAJaWYgKCFyZXQpIHsKKwkJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9VTlNFVDsKIAkJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9TVEFSVEFMSUdOOwogCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IHJlYXNzaWduZWQgJXBSXG4iLCByZXNubywgcmVzKTsKIAkJaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpCkBAIC0zMzYsOSArMzQzLDE1IEBACiAJCQkJKCEoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpKSkKIAkJCWNvbnRpbnVlOwogCisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2FuJ3QgZW5hYmxlIGRldmljZTogQkFSICVkICVwUiBub3QgYXNzaWduZWRcbiIsCisJCQkJaSwgcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCiAJCWlmICghci0+cGFyZW50KSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgImRldmljZSBub3QgYXZhaWxhYmxlICIKLQkJCQkiKGNhbid0IHJlc2VydmUgJXBSKVxuIiwgcik7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGVuYWJsZSBkZXZpY2U6IEJBUiAlZCAlcFIgbm90IGNsYWltZWRcbiIsCisJCQkJaSwgcik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCmluZGV4IDg0ODU3NjEuLjk0NmY5MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCkBAIC0xMDc2LDcgKzEwNzYsNyBAQAogICovCiBzdGF0aWMgdm9pZCB5ZW50YV9maXh1cF9wYXJlbnRfYnJpZGdlKHN0cnVjdCBwY2lfYnVzICpjYXJkYnVzX2JyaWRnZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKnNpYmxpbmc7CiAJdW5zaWduZWQgY2hhciB1cHBlcl9saW1pdDsKIAkvKgogCSAqIFdlIG9ubHkgY2hlY2sgYW5kIGZpeCB0aGUgcGFyZW50IGJyaWRnZTogQWxsIHN5c3RlbXMgd2hpY2ggbmVlZApAQCAtMTA5NSwxOCArMTA5NSwxOCBAQAogCS8qIHN0YXkgd2l0aGluIHRoZSBsaW1pdHMgb2YgdGhlIGJ1cyByYW5nZSBvZiB0aGUgcGFyZW50OiAqLwogCXVwcGVyX2xpbWl0ID0gYnJpZGdlX3RvX2ZpeC0+cGFyZW50LT5idXNuX3Jlcy5lbmQ7CiAKLQkvKiBjaGVjayB0aGUgYnVzIHJhbmdlcyBvZiBhbGwgc2lsYmxpbmcgYnJpZGdlcyB0byBwcmV2ZW50IG92ZXJsYXAgKi8KLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmJyaWRnZV90b19maXgtPnBhcmVudC0+Y2hpbGRyZW4pIHsKLQkJc3RydWN0IHBjaV9idXMgKnNpbGJsaW5nID0gcGNpX2J1c19iKHRtcCk7CisJLyogY2hlY2sgdGhlIGJ1cyByYW5nZXMgb2YgYWxsIHNpYmxpbmcgYnJpZGdlcyB0byBwcmV2ZW50IG92ZXJsYXAgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZicmlkZ2VfdG9fZml4LT5wYXJlbnQtPmNoaWxkcmVuLAorCQkJbm9kZSkgewogCQkvKgotCQkgKiBJZiB0aGUgc2lsYmxpbmcgaGFzIGEgaGlnaGVyIHNlY29uZGFyeSBidXMgbnVtYmVyCisJCSAqIElmIHRoZSBzaWJsaW5nIGhhcyBhIGhpZ2hlciBzZWNvbmRhcnkgYnVzIG51bWJlcgogCQkgKiBhbmQgaXQncyBzZWNvbmRhcnkgaXMgZXF1YWwgb3Igc21hbGxlciB0aGFuIG91cgogCQkgKiBjdXJyZW50IHVwcGVyIGxpbWl0LCBzZXQgdGhlIG5ldyB1cHBlciBsaW1pdCB0bwotCQkgKiB0aGUgYnVzIG51bWJlciBiZWxvdyB0aGUgc2lsYmxpbmcncyByYW5nZToKKwkJICogdGhlIGJ1cyBudW1iZXIgYmVsb3cgdGhlIHNpYmxpbmcncyByYW5nZToKIAkJICovCi0JCWlmIChzaWxibGluZy0+YnVzbl9yZXMuc3RhcnQgPiBicmlkZ2VfdG9fZml4LT5idXNuX3Jlcy5lbmQKLQkJICAgICYmIHNpbGJsaW5nLT5idXNuX3Jlcy5zdGFydCA8PSB1cHBlcl9saW1pdCkKLQkJCXVwcGVyX2xpbWl0ID0gc2lsYmxpbmctPmJ1c25fcmVzLnN0YXJ0IC0gMTsKKwkJaWYgKHNpYmxpbmctPmJ1c25fcmVzLnN0YXJ0ID4gYnJpZGdlX3RvX2ZpeC0+YnVzbl9yZXMuZW5kCisJCSAgICAmJiBzaWJsaW5nLT5idXNuX3Jlcy5zdGFydCA8PSB1cHBlcl9saW1pdCkKKwkJCXVwcGVyX2xpbWl0ID0gc2libGluZy0+YnVzbl9yZXMuc3RhcnQgLSAxOwogCX0KIAogCS8qIFNob3cgdGhhdCB0aGUgd2FudGVkIHN1Ym9yZGluYXRlIG51bWJlciBpcyBub3QgcG9zc2libGU6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9LY29uZmlnIGIvZHJpdmVycy9waHkvS2NvbmZpZwppbmRleCBjN2E1NTFjLi44ZDNjNDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGh5L0tjb25maWcKQEAgLTE2LDMwICsxNiw1NiBAQAogCSAgZnJhbWV3b3JrIHNob3VsZCBzZWxlY3QgdGhpcyBjb25maWcuCiAKIGNvbmZpZyBQSFlfRVhZTk9TX01JUElfVklERU8KLQlkZXBlbmRzIG9uIEhBU19JT01FTQogCXRyaXN0YXRlICJTNVAvRVhZTk9TIFNvQyBzZXJpZXMgTUlQSSBDU0ktMi9EU0kgUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCWRlcGVuZHMgb24gQVJDSF9TNVBWMjEwIHx8IEFSQ0hfRVhZTk9TIHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBHRU5FUklDX1BIWQorCWRlZmF1bHQgeSBpZiBBUkNIX1M1UFYyMTAgfHwgQVJDSF9FWFlOT1MKIAloZWxwCiAJICBTdXBwb3J0IGZvciBNSVBJIENTSS0yIGFuZCBNSVBJIERTSSBEUEhZIGZvdW5kIG9uIFNhbXN1bmcgUzVQCiAJICBhbmQgRVhZTk9TIFNvQ3MuCiAKIGNvbmZpZyBQSFlfTVZFQlVfU0FUQQogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9ET1ZFCisJZGVwZW5kcyBvbiBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRSB8fCBNQUNIX0RPVkUKIAlkZXBlbmRzIG9uIE9GCiAJc2VsZWN0IEdFTkVSSUNfUEhZCiAKK2NvbmZpZyBPTUFQX0NPTlRST0xfUEhZCisJdHJpc3RhdGUgIk9NQVAgQ09OVFJPTCBQSFkgRHJpdmVyIgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgUEhZIHBhcnQgcHJlc2VudCBpbiB0aGUgY29udHJvbAorCSAgbW9kdWxlLiBUaGlzIGRyaXZlciBoYXMgQVBJIHRvIHBvd2VyIG9uIHRoZSBVU0IyIFBIWSBhbmQgdG8gd3JpdGUgdG8KKwkgIHRoZSBtYWlsYm94LiBUaGUgbWFpbGJveCBpcyBwcmVzZW50IG9ubHkgaW4gb21hcDQgYW5kIHRoZSByZWdpc3RlciB0bworCSAgcG93ZXIgb24gdGhlIFVTQjIgUEhZIGlzIHByZXNlbnQgaW4gT01BUDQgYW5kIE9NQVA1LiBPTUFQNSBoYXMgYW4KKwkgIGFkZGl0aW9uYWwgcmVnaXN0ZXIgdG8gcG93ZXIgb24gVVNCMyBQSFkvU0FUQSBQSFkvUENJRSBQSFkKKwkgIChQSVBFMyBQSFkpLgorCiBjb25maWcgT01BUF9VU0IyCiAJdHJpc3RhdGUgIk9NQVAgVVNCMiBQSFkgRHJpdmVyIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKIAlkZXBlbmRzIG9uIFVTQl9QSFkKIAlzZWxlY3QgR0VORVJJQ19QSFkKLQlzZWxlY3QgT01BUF9DT05UUk9MX1VTQgorCXNlbGVjdCBPTUFQX0NPTlRST0xfUEhZCisJZGVwZW5kcyBvbiBPTUFQX09DUDJTQ1AKIAloZWxwCiAJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSB0cmFuc2NlaXZlciB0aGF0IGlzIHBhcnQgb2YgU09DLiBUaGlzCiAJICBkcml2ZXIgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIFBIWSBmdW5jdGlvbmFsaXR5IGFwYXJ0IGZyb20gY29tcGFyYXRvci4KIAkgIFRoZSBVU0IgT1RHIGNvbnRyb2xsZXIgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNvbXBhcmF0b3IgdXNpbmcgdGhpcwogCSAgZHJpdmVyLgogCitjb25maWcgVElfUElQRTMKKwl0cmlzdGF0ZSAiVEkgUElQRTMgUEhZIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTIHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVjdCBPTUFQX0NPTlRST0xfUEhZCisJZGVwZW5kcyBvbiBPTUFQX09DUDJTQ1AKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBQSVBFMyBQSFkgdGhhdCBpcyBwYXJ0IG9mIFRJIFNPQ3MuIFRoaXMKKwkgIGRyaXZlciB0YWtlcyBjYXJlIG9mIGFsbCB0aGUgUEhZIGZ1bmN0aW9uYWxpdHkgYXBhcnQgZnJvbSBjb21wYXJhdG9yLgorCSAgVGhpcyBkcml2ZXIgaW50ZXJhY3RzIHdpdGggdGhlICJPTUFQIENvbnRyb2wgUEhZIERyaXZlciIgdG8gcG93ZXIKKwkgIG9uL29mZiB0aGUgUEhZLgorCiBjb25maWcgVFdMNDAzMF9VU0IKIAl0cmlzdGF0ZSAiVFdMNDAzMCBVU0IgVHJhbnNjZWl2ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFICYmIFJFR1VMQVRPUl9UV0w0MDMwICYmIFVTQl9NVVNCX09NQVAyUExVUwpAQCAtNTQsNiArODAsOCBAQAogY29uZmlnIFBIWV9FWFlOT1NfRFBfVklERU8KIAl0cmlzdGF0ZSAiRVhZTk9TIFNvQyBzZXJpZXMgRGlzcGxheSBQb3J0IFBIWSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gQVJDSF9FWFlOT1MgfHwgQ09NUElMRV9URVNUCisJZGVmYXVsdCBBUkNIX0VYWU5PUwogCXNlbGVjdCBHRU5FUklDX1BIWQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIERpc3BsYXkgUG9ydCBQSFkgZm91bmQgb24gU2Ftc3VuZyBFWFlOT1MgU29Dcy4KQEAgLTY1LDQgKzkzLDc3IEBACiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgQnJvYWRjb20gS29uYSBVU0IgMi4wIFBIWS4KIAorY29uZmlnIFBIWV9FWFlOT1M1MjUwX1NBVEEKKwl0cmlzdGF0ZSAiRXh5bm9zNTI1MCBTYXRhIFNlckRlcy9QSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gU09DX0VYWU5PUzUyNTAKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCWRlcGVuZHMgb24gT0YKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgSTJDCisJc2VsZWN0IEkyQ19TM0MyNDEwCisJc2VsZWN0IE1GRF9TWVNDT04KKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IFNBVEEgU2VyRGVzL1BoeSBmb3VuZCBvbiBTYW1zdW5nJ3MKKwkgIEV4eW5vczUyNTAgYmFzZWQgU29Dcy5UaGlzIFNlckRlcy9QaHkgc3VwcG9ydHMgU0FUQSAxLjUgR2IvcywKKwkgIFNBVEEgMy4wIEdiL3MsIFNBVEEgNi4wIEdiL3Mgc3BlZWRzLiBJdCBzdXBwb3J0cyBvbmUgU0FUQSBob3N0CisJICBwb3J0IHRvIGFjY2VwdCBvbmUgU0FUQSBkZXZpY2UuCisKK2NvbmZpZyBQSFlfU1VONElfVVNCCisJdHJpc3RhdGUgIkFsbHdpbm5lciBzdW54aSBTb0MgVVNCIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJICYmIEhBU19JT01FTSAmJiBPRgorCXNlbGVjdCBHRU5FUklDX1BIWQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIHRyYW5zY2VpdmVyIHRoYXQgaXMgcGFydCBvZiBBbGx3aW5uZXIKKwkgIHN1bnhpIFNvQ3MuCisKKwkgIFRoaXMgZHJpdmVyIGNvbnRyb2xzIHRoZSBlbnRpcmUgVVNCIFBIWSBibG9jaywgYm90aCB0aGUgVVNCIE9URworCSAgcGFydHMsIGFzIHdlbGwgYXMgdGhlIDIgcmVndWxhciBVU0IgMiBob3N0IFBIWXMuCisKK2NvbmZpZyBQSFlfU0FNU1VOR19VU0IyCisJdHJpc3RhdGUgIlNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIgorCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVjdCBNRkRfU1lTQ09OCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgU2Ftc3VuZyBVU0IgMi4wIFBIWSBkcml2ZXIgZm9yIFNhbXN1bmcKKwkgIFNvQ3MuIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIFVTQiAyLjAgUEhZLiBTdXBwb3J0IGZvcgorCSAgcGFydGljdWxhciBTb0NzIGhhcyB0byBiZSBlbmFibGVkIGluIGFkZGl0aW9uIHRvIHRoaXMgZHJpdmVyLiBOdW1iZXIKKwkgIGFuZCB0eXBlIG9mIHN1cHBvcnRlZCBwaHlzIGRlcGVuZHMgb24gdGhlIFNvQy4KKworY29uZmlnIFBIWV9FWFlOT1M0MjEwX1VTQjIKKwlib29sICJTdXBwb3J0IGZvciBFeHlub3MgNDIxMCIKKwlkZXBlbmRzIG9uIFBIWV9TQU1TVU5HX1VTQjIKKwlkZXBlbmRzIG9uIENQVV9FWFlOT1M0MjEwCisJaGVscAorCSAgRW5hYmxlIFVTQiBQSFkgc3VwcG9ydCBmb3IgRXh5bm9zIDQyMTAuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHRoYXQKKwkgIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGlzIGVuYWJsZWQgYW5kIG1lYW5zIHRoYXQgc3VwcG9ydCBmb3IgdGhpcworCSAgcGFydGljdWxhciBTb0MgaXMgY29tcGlsZWQgaW4gdGhlIGRyaXZlci4gSW4gY2FzZSBvZiBFeHlub3MgNDIxMCBmb3VyCisJICBwaHlzIGFyZSBhdmFpbGFibGUgLSBkZXZpY2UsIGhvc3QsIEhTSUMwIGFuZCBIU0lDMS4KKworY29uZmlnIFBIWV9FWFlOT1M0WDEyX1VTQjIKKwlib29sICJTdXBwb3J0IGZvciBFeHlub3MgNHgxMiIKKwlkZXBlbmRzIG9uIFBIWV9TQU1TVU5HX1VTQjIKKwlkZXBlbmRzIG9uIChTT0NfRVhZTk9TNDIxMiB8fCBTT0NfRVhZTk9TNDQxMikKKwloZWxwCisJICBFbmFibGUgVVNCIFBIWSBzdXBwb3J0IGZvciBFeHlub3MgNHgxMi4gVGhpcyBvcHRpb24gcmVxdWlyZXMgdGhhdAorCSAgU2Ftc3VuZyBVU0IgMi4wIFBIWSBkcml2ZXIgaXMgZW5hYmxlZCBhbmQgbWVhbnMgdGhhdCBzdXBwb3J0IGZvciB0aGlzCisJICBwYXJ0aWN1bGFyIFNvQyBpcyBjb21waWxlZCBpbiB0aGUgZHJpdmVyLiBJbiBjYXNlIG9mIEV4eW5vcyA0eDEyIGZvdXIKKwkgIHBoeXMgYXJlIGF2YWlsYWJsZSAtIGRldmljZSwgaG9zdCwgSFNJQzAgYW5kIEhTSUMxLgorCitjb25maWcgUEhZX0VYWU5PUzUyNTBfVVNCMgorCWJvb2wgIlN1cHBvcnQgZm9yIEV4eW5vcyA1MjUwIgorCWRlcGVuZHMgb24gUEhZX1NBTVNVTkdfVVNCMgorCWRlcGVuZHMgb24gU09DX0VYWU5PUzUyNTAKKwloZWxwCisJICBFbmFibGUgVVNCIFBIWSBzdXBwb3J0IGZvciBFeHlub3MgNTI1MC4gVGhpcyBvcHRpb24gcmVxdWlyZXMgdGhhdAorCSAgU2Ftc3VuZyBVU0IgMi4wIFBIWSBkcml2ZXIgaXMgZW5hYmxlZCBhbmQgbWVhbnMgdGhhdCBzdXBwb3J0IGZvciB0aGlzCisJICBwYXJ0aWN1bGFyIFNvQyBpcyBjb21waWxlZCBpbiB0aGUgZHJpdmVyLiBJbiBjYXNlIG9mIEV4eW5vcyA1MjUwIGZvdXIKKwkgIHBoeXMgYXJlIGF2YWlsYWJsZSAtIGRldmljZSwgaG9zdCwgSFNJQzAgYW5kIEhTSUMuCisKK2NvbmZpZyBQSFlfWEdFTkUKKwl0cmlzdGF0ZSAiQVBNIFgtR2VuZSAxNUdicHMgUEhZIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0gJiYgT0YgJiYgKEFSTTY0IHx8IENPTVBJTEVfVEVTVCkKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEFQTSBYLUdlbmUgU29DIG11bHRpLXB1cnBvc2UgUEhZLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvcGh5L01ha2VmaWxlCmluZGV4IGI1N2MyNTMuLjJmYWY3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGh5L01ha2VmaWxlCkBAIC03LDUgKzcsMTQgQEAKIG9iai0kKENPTkZJR19QSFlfRVhZTk9TX0RQX1ZJREVPKQkrPSBwaHktZXh5bm9zLWRwLXZpZGVvLm8KIG9iai0kKENPTkZJR19QSFlfRVhZTk9TX01JUElfVklERU8pCSs9IHBoeS1leHlub3MtbWlwaS12aWRlby5vCiBvYmotJChDT05GSUdfUEhZX01WRUJVX1NBVEEpCQkrPSBwaHktbXZlYnUtc2F0YS5vCitvYmotJChDT05GSUdfT01BUF9DT05UUk9MX1BIWSkJCSs9IHBoeS1vbWFwLWNvbnRyb2wubwogb2JqLSQoQ09ORklHX09NQVBfVVNCMikJCQkrPSBwaHktb21hcC11c2IyLm8KK29iai0kKENPTkZJR19USV9QSVBFMykJCQkrPSBwaHktdGktcGlwZTMubwogb2JqLSQoQ09ORklHX1RXTDQwMzBfVVNCKQkJKz0gcGh5LXR3bDQwMzAtdXNiLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNTI1MF9TQVRBKQkrPSBwaHktZXh5bm9zNTI1MC1zYXRhLm8KK29iai0kKENPTkZJR19QSFlfU1VONElfVVNCKQkJKz0gcGh5LXN1bjRpLXVzYi5vCitvYmotJChDT05GSUdfUEhZX1NBTVNVTkdfVVNCMikJCSs9IHBoeS1zYW1zdW5nLXVzYjIubworb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M0MjEwX1VTQjIpCSs9IHBoeS1leHlub3M0MjEwLXVzYjIubworb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M0WDEyX1VTQjIpCSs9IHBoeS1leHlub3M0eDEyLXVzYjIubworb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M1MjUwX1VTQjIpCSs9IHBoeS1leHlub3M1MjUwLXVzYjIubworb2JqLSQoQ09ORklHX1BIWV9YR0VORSkJCQkrPSBwaHkteGdlbmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWJjbS1rb25hLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1iY20ta29uYS11c2IyLmMKaW5kZXggZWZjNWMxYS4uZTk0ZjVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWJjbS1rb25hLXVzYjIuYworKysgYi9kcml2ZXJzL3BoeS9waHktYmNtLWtvbmEtdXNiMi5jCkBAIC0xMjgsMTAgKzEyOCw4IEBACiAKIAlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsCiAJCQlvZl9waHlfc2ltcGxlX3hsYXRlKTsKLQlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpCi0JCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHBoeV9wcm92aWRlcik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbV9rb25hX3VzYjJfZHRfaWRzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktY29yZS5jIGIvZHJpdmVycy9waHkvcGh5LWNvcmUuYwppbmRleCA2YzczODM3Li42MjNiNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktY29yZS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKQEAgLTI3NCw4ICsyNzQsOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocGh5X3Bvd2VyX29mZik7CiAKIC8qKgotICogb2ZfcGh5X2dldCgpIC0gbG9va3VwIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gYSBwaHkgYnkgcGhhbmRsZQotICogQGRldjogZGV2aWNlIHRoYXQgcmVxdWVzdHMgdGhpcyBwaHkKKyAqIF9vZl9waHlfZ2V0KCkgLSBsb29rdXAgYW5kIG9idGFpbiBhIHJlZmVyZW5jZSB0byBhIHBoeSBieSBwaGFuZGxlCisgKiBAbnA6IGRldmljZV9ub2RlIGZvciB3aGljaCB0byBnZXQgdGhlIHBoeQogICogQGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIHBoeQogICoKICAqIFJldHVybnMgdGhlIHBoeSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHBoYW5kbGUgdmFsdWUsCkBAIC0yODQsMjAgKzI4NCwxNyBAQAogICogbm90IHlldCBsb2FkZWQuIFRoaXMgZnVuY3Rpb24gdXNlcyBvZl94bGF0ZSBjYWxsIGJhY2sgZnVuY3Rpb24gcHJvdmlkZWQKICAqIHdoaWxlIHJlZ2lzdGVyaW5nIHRoZSBwaHlfcHJvdmlkZXIgdG8gZmluZCB0aGUgcGh5IGluc3RhbmNlLgogICovCi1zdGF0aWMgc3RydWN0IHBoeSAqb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3N0YXRpYyBzdHJ1Y3QgcGh5ICpfb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CiAJc3RydWN0IHBoeSAqcGh5ID0gTlVMTDsKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7CiAKLQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhkZXYtPm9mX25vZGUsICJwaHlzIiwgIiNwaHktY2VsbHMiLAorCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAicGh5cyIsICIjcGh5LWNlbGxzIiwKIAkJaW5kZXgsICZhcmdzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9kYmcoZGV2LCAiZmFpbGVkIHRvIGdldCBwaHkgaW4gJXMgbm9kZVxuIiwKLQkJCWRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9CiAKIAltdXRleF9sb2NrKCZwaHlfcHJvdmlkZXJfbXV0ZXgpOwogCXBoeV9wcm92aWRlciA9IG9mX3BoeV9wcm92aWRlcl9sb29rdXAoYXJncy5ucCk7CkBAIC0zMTcsNiArMzE0LDM2IEBACiB9CiAKIC8qKgorICogb2ZfcGh5X2dldCgpIC0gbG9va3VwIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gYSBwaHkgdXNpbmcgYSBkZXZpY2Vfbm9kZS4KKyAqIEBucDogZGV2aWNlX25vZGUgZm9yIHdoaWNoIHRvIGdldCB0aGUgcGh5CisgKiBAY29uX2lkOiBuYW1lIG9mIHRoZSBwaHkgZnJvbSBkZXZpY2UncyBwb2ludCBvZiB2aWV3CisgKgorICogUmV0dXJucyB0aGUgcGh5IGRyaXZlciwgYWZ0ZXIgZ2V0dGluZyBhIHJlZmNvdW50IHRvIGl0OyBvcgorICogLUVOT0RFViBpZiB0aGVyZSBpcyBubyBzdWNoIHBoeS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcgcGh5X3B1dCgpIHRvIHJlbGVhc2UgdGhhdCBjb3VudC4KKyAqLworc3RydWN0IHBoeSAqb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IHBoeSAqcGh5ID0gTlVMTDsKKwlpbnQgaW5kZXggPSAwOworCisJaWYgKGNvbl9pZCkKKwkJaW5kZXggPSBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcobnAsICJwaHktbmFtZXMiLCBjb25faWQpOworCisJcGh5ID0gX29mX3BoeV9nZXQobnAsIGluZGV4KTsKKwlpZiAoSVNfRVJSKHBoeSkpCisJCXJldHVybiBwaHk7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHBoeS0+b3BzLT5vd25lcikpCisJCXJldHVybiBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOworCisJZ2V0X2RldmljZSgmcGh5LT5kZXYpOworCisJcmV0dXJuIHBoeTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3BoeV9nZXQpOworCisvKioKICAqIHBoeV9wdXQoKSAtIHJlbGVhc2UgdGhlIFBIWQogICogQHBoeTogdGhlIHBoeSByZXR1cm5lZCBieSBwaHlfZ2V0KCkKICAqCkBAIC00MDcsNyArNDM0LDcgQEAKIAlpZiAoZGV2LT5vZl9ub2RlKSB7CiAJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGRldi0+b2Zfbm9kZSwgInBoeS1uYW1lcyIsCiAJCQlzdHJpbmcpOwotCQlwaHkgPSBvZl9waHlfZ2V0KGRldiwgaW5kZXgpOworCQlwaHkgPSBfb2ZfcGh5X2dldChkZXYtPm9mX25vZGUsIGluZGV4KTsKIAl9IGVsc2UgewogCQlwaHkgPSBwaHlfbG9va3VwKGRldiwgc3RyaW5nKTsKIAl9CkBAIC00OTksNiArNTI2LDM3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3BoeV9vcHRpb25hbF9nZXQpOwogCiAvKioKKyAqIGRldm1fb2ZfcGh5X2dldCgpIC0gbG9va3VwIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gYSBwaHkuCisgKiBAZGV2OiBkZXZpY2UgdGhhdCByZXF1ZXN0cyB0aGlzIHBoeQorICogQG5wOiBub2RlIGNvbnRhaW5pbmcgdGhlIHBoeQorICogQGNvbl9pZDogbmFtZSBvZiB0aGUgcGh5IGZyb20gZGV2aWNlJ3MgcG9pbnQgb2YgdmlldworICoKKyAqIEdldHMgdGhlIHBoeSB1c2luZyBvZl9waHlfZ2V0KCksIGFuZCBhc3NvY2lhdGVzIGEgZGV2aWNlIHdpdGggaXQgdXNpbmcKKyAqIGRldnJlcy4gT24gZHJpdmVyIGRldGFjaCwgcmVsZWFzZSBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIHRoZSBkZXZyZXMgZGF0YSwKKyAqIHRoZW4sIGRldnJlcyBkYXRhIGlzIGZyZWVkLgorICovCitzdHJ1Y3QgcGh5ICpkZXZtX29mX3BoeV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJICAgIGNvbnN0IGNoYXIgKmNvbl9pZCkKK3sKKwlzdHJ1Y3QgcGh5ICoqcHRyLCAqcGh5OworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1fcGh5X3JlbGVhc2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcGh5ID0gb2ZfcGh5X2dldChucCwgY29uX2lkKTsKKwlpZiAoIUlTX0VSUihwaHkpKSB7CisJCSpwdHIgPSBwaHk7CisJCWRldnJlc19hZGQoZGV2LCBwdHIpOworCX0gZWxzZSB7CisJCWRldnJlc19mcmVlKHB0cik7CisJfQorCisJcmV0dXJuIHBoeTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fb2ZfcGh5X2dldCk7CisKKy8qKgogICogcGh5X2NyZWF0ZSgpIC0gY3JlYXRlIGEgbmV3IHBoeQogICogQGRldjogZGV2aWNlIHRoYXQgaXMgY3JlYXRpbmcgdGhlIG5ldyBwaHkKICAqIEBvcHM6IGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBwZXJmb3JtaW5nIHBoeSBvcGVyYXRpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNDIxMC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNDIxMC11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YTUyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0MjEwLXVzYjIuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIgLSBFeHlub3MgNDIxMCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlICJwaHktc2Ftc3VuZy11c2IyLmgiCisKKy8qIEV4eW5vcyBVU0IgUEhZIHJlZ2lzdGVycyAqLworCisvKiBQSFkgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSCQkJMHgwCisKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwX1NVU1BFTkQJQklUKDApCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9QV1IJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfT1RHX1BXUglCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwX1NMRUVQCQlCSVQoNSkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwCSggXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TVVNQRU5EIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9QV1IgfCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwX09UR19QV1IgfCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9TVVNQRU5ECUJJVCg2KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfUFdSCQlCSVQoNykKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkxX1NMRUVQCQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkxICggXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9TVVNQRU5EIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9QV1IgfCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkxX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzBfU1VTUEVORAlCSVQoOSkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMF9TTEVFUAkJQklUKDEwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMwICggXAorCUVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzBfU1VTUEVORCB8IFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMwX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzFfU1VTUEVORAlCSVQoMTEpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzFfU0xFRVAJCUJJVCgxMikKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMSAoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMxX1NVU1BFTkQgfCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMV9TTEVFUCkKKworLyogUEhZIGNsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWUNMSwkJCTB4NAorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF9NQVNLCSgweDMgPDwgMCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWUNMS19QSFlGU0VMX09GRlNFVAkwCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF80OE1IWgkoMHgwIDw8IDApCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF8yNE1IWgkoMHgzIDw8IDApCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF8xMk1IWgkoMHgyIDw8IDApCisKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWUNMS19QSFkwX0lEX1BVTExVUAlCSVQoMikKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWUNMS19QSFkwX0NPTU1PTl9PTglCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWUNMS19QSFkxX0NPTU1PTl9PTglCSVQoNykKKworLyogUEhZIHJlc2V0IGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVJTVAkJCTB4OAorCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fUEhZMAkJQklUKDApCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fT1RHX0hMSU5LCQlCSVQoMSkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9PVEdfUEhZTElOSwkJQklUKDIpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9BTEwJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfUDAJCUJJVCg0KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfUDFQMgkJQklUKDUpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX0FMTAlCSVQoNikKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDAJQklUKDcpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX1AxCUJJVCg4KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMglCSVQoOSkKKworLyogSXNvbGF0aW9uLCBjb25maWd1cmVkIGluIHRoZSBwb3dlciBtYW5hZ2VtZW50IHVuaXQgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfREVWSUNFX09GRlNFVAkweDcwNAorI2RlZmluZSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9ERVZJQ0UJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9IT1NUX09GRlNFVAkweDcwOAorI2RlZmluZSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9IT1NUCQlCSVQoMCkKKworLyogVVNCWVBIWTEgRmxvYXRpbmcgcHJldmVudGlvbiAqLworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZMUNPTgkJCTB4MzQKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWTFDT05fRkxPQVRfUFJFVkVOVElPTgkweDEKKworLyogTW9kZSBzd2l0Y2hpbmcgU1VCIERldmljZSA8LT4gSG9zdCAqLworI2RlZmluZSBFWFlOT1NfNDIxMF9NT0RFX1NXSVRDSF9PRkZTRVQJCTB4MjFjCisjZGVmaW5lIEVYWU5PU180MjEwX01PREVfU1dJVENIX01BU0sJCTEKKyNkZWZpbmUgRVhZTk9TXzQyMTBfTU9ERV9TV0lUQ0hfREVWSUNFCQkwCisjZGVmaW5lIEVYWU5PU180MjEwX01PREVfU1dJVENIX0hPU1QJCTEKKworZW51bSBleHlub3M0MjEwX3BoeV9pZCB7CisJRVhZTk9TNDIxMF9ERVZJQ0UsCisJRVhZTk9TNDIxMF9IT1NULAorCUVYWU5PUzQyMTBfSFNJQzAsCisJRVhZTk9TNDIxMF9IU0lDMSwKKwlFWFlOT1M0MjEwX05VTV9QSFlTLAorfTsKKworLyoKKyAqIGV4eW5vczQyMTBfcmF0ZV90b19jbGsoKSBjb252ZXJ0cyB0aGUgc3VwcGxpZWQgY2xvY2sgcmF0ZSB0byB0aGUgdmFsdWUgdGhhdAorICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHBoeSByZWdpc3Rlci4KKyAqLworc3RhdGljIGludCBleHlub3M0MjEwX3JhdGVfdG9fY2xrKHVuc2lnbmVkIGxvbmcgcmF0ZSwgdTMyICpyZWcpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAxMiAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF8xMk1IWjsKKwkJYnJlYWs7CisJY2FzZSAyNCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF8yNE1IWjsKKwkJYnJlYWs7CisJY2FzZSA0OCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF80OE1IWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczQyMTBfaXNvbChzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCwgYm9vbCBvbikKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKwl1MzIgb2Zmc2V0OworCXUzMiBtYXNrOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M0MjEwX0RFVklDRToKKwkJb2Zmc2V0ID0gRVhZTk9TXzQyMTBfVVNCX0lTT0xfREVWSUNFX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU180MjEwX1VTQl9JU09MX0RFVklDRTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0MjEwX0hPU1Q6CisJCW9mZnNldCA9IEVYWU5PU180MjEwX1VTQl9JU09MX0hPU1RfT0ZGU0VUOworCQltYXNrID0gRVhZTk9TXzQyMTBfVVNCX0lTT0xfSE9TVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX07CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZHJ2LT5yZWdfcG11LCBvZmZzZXQsIG1hc2ssIG9uID8gMCA6IG1hc2spOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0MjEwX3BoeV9wd3Ioc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIHJzdGJpdHMgPSAwOworCXUzMiBwaHlwd3IgPSAwOworCXUzMiByc3Q7CisJdTMyIHB3cjsKKwl1MzIgY2xrOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M0MjEwX0RFVklDRToKKwkJcGh5cHdyID0JRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwOworCQlyc3RiaXRzID0JRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkwOworCQlicmVhazsKKwljYXNlIEVYWU5PUzQyMTBfSE9TVDoKKwkJcGh5cHdyID0JRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkxOworCQlyc3RiaXRzID0JRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX0FMTCB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AwIHwKKwkJCQlFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfUDFQMiB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfQUxMIHwKKwkJCQlFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMDsKKwkJd3JpdGVsKG9uLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZMUNPTik7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNDIxMF9IU0lDMDoKKwkJcGh5cHdyID0JRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMDsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9QMVAyIHwKKwkJCQlFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0MjEwX0hTSUMxOgorCQlwaHlwd3IgPQlFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMxOworCQlyc3RiaXRzID0JRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AxUDIgfAorCQkJCUVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX1AyOworCQlicmVhazsKKwl9OworCisJaWYgKG9uKSB7CisJCWNsayA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlDTEspOworCQljbGsgJj0gfkVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF9NQVNLOworCQljbGsgfD0gZHJ2LT5yZWZfcmVnX3ZhbCA8PCBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfT0ZGU0VUOworCQl3cml0ZWwoY2xrLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZQ0xLKTsKKworCQlwd3IgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUFdSKTsKKwkJcHdyICY9IH5waHlwd3I7CisJCXdyaXRlbChwd3IsIGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlQV1IpOworCisJCXJzdCA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlSU1QpOworCQlyc3QgfD0gcnN0Yml0czsKKwkJd3JpdGVsKHJzdCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWVJTVCk7CisJCXVkZWxheSgxMCk7CisJCXJzdCAmPSB+cnN0Yml0czsKKwkJd3JpdGVsKHJzdCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWVJTVCk7CisJCS8qIFRoZSBmb2xsb3dpbmcgZGVsYXkgaXMgbmVjZXNzYXJ5IGZvciB0aGUgcmVzZXQgc2VxdWVuY2UgdG8gYmUKKwkJICogY29tcGxldGVkICovCisJCXVkZWxheSg4MCk7CisJfSBlbHNlIHsKKwkJcHdyID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWVBXUik7CisJCXB3ciB8PSBwaHlwd3I7CisJCXdyaXRlbChwd3IsIGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlQV1IpOworCX0KK30KKworc3RhdGljIGludCBleHlub3M0MjEwX3Bvd2VyX29uKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCS8qIE9yZGVyIG9mIGluaXRpYWxpc2F0aW9uIGlzIGltcG9ydGFudCAtIGZpcnN0IHBvd2VyIHRoZW4gaXNvbGF0aW9uICovCisJZXh5bm9zNDIxMF9waHlfcHdyKGluc3QsIDEpOworCWV4eW5vczQyMTBfaXNvbChpbnN0LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vczQyMTBfcG93ZXJfb2ZmKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCWV4eW5vczQyMTBfaXNvbChpbnN0LCAxKTsKKwlleHlub3M0MjEwX3BoeV9wd3IoaW5zdCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9jb21tb25fcGh5IGV4eW5vczQyMTBfcGh5c1tdID0geworCXsKKwkJLmxhYmVsCQk9ICJkZXZpY2UiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9ERVZJQ0UsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJob3N0IiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfSE9TVCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMwIiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfSFNJQzAsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMSIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hTSUMxLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7fSwKK307CisKK2NvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M0MjEwX3VzYjJfcGh5X2NvbmZpZyA9IHsKKwkuaGFzX21vZGVfc3dpdGNoCT0gMCwKKwkubnVtX3BoeXMJCT0gRVhZTk9TNDIxMF9OVU1fUEhZUywKKwkucGh5cwkJCT0gZXh5bm9zNDIxMF9waHlzLAorCS5yYXRlX3RvX2NsawkJPSBleHlub3M0MjEwX3JhdGVfdG9fY2xrLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0eDEyLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0eDEyLXVzYjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJhN2NjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczR4MTItdXNiMi5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogU2Ftc3VuZyBTb0MgVVNCIDEuMS8yLjAgUEhZIGRyaXZlciAtIEV4eW5vcyA0eDEyIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogS2FtaWwgRGVic2tpIDxrLmRlYnNraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgInBoeS1zYW1zdW5nLXVzYjIuaCIKKworLyogRXh5bm9zIFVTQiBQSFkgcmVnaXN0ZXJzICovCisKKy8qIFBIWSBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1IJCQkweDAKKworI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTBfU1VTUEVORAlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1BXUgkJQklUKDMpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9PVEdfUFdSCUJJVCg0KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTBfU0xFRVAJCUJJVCg1KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTAgKCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NVU1BFTkQgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1BXUiB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTBfT1RHX1BXUiB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTBfU0xFRVApCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1NVU1BFTkQJQklUKDYpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9QV1IJCUJJVCg3KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTFfU0xFRVAJCUJJVCg4KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTEgKCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1NVU1BFTkQgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1BXUiB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTFfU0xFRVApCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMF9TVVNQRU5ECUJJVCg5KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwX1BXUgkJQklUKDEwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwX1NMRUVQCQlCSVQoMTEpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzAgKCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMF9TVVNQRU5EIHwgXAorCUVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzBfUFdSIHwgXAorCUVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzBfU0xFRVApCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9TVVNQRU5ECUJJVCgxMikKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9QV1IJCUJJVCgxMykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9TTEVFUAkJQklUKDE0KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMxICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfU1VTUEVORCB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMxX1BXUiB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMxX1NMRUVQKQorCisvKiBQSFkgY2xvY2sgY29udHJvbCAqLworI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLCQkJMHg0CisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX01BU0sJKDB4NyA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfT0ZGU0VUCTAKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzlNSFo2CSgweDAgPDwgMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzEwTUhaCSgweDEgPDwgMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzEyTUhaCSgweDIgPDwgMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzE5TUhaMgkoMHgzIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8yME1IWgkoMHg0IDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8yNE1IWgkoMHg1IDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF81ME1IWgkoMHg3IDw8IDApCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFkwX0lEX1BVTExVUAlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFkwX0NPTU1PTl9PTglCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFkxX0NPTU1PTl9PTglCSVQoNykKKworI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLX01BU0sJKDB4N2YgPDwgMTApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfSFNJQ19SRUZDTEtfT0ZGU0VUICAxMAorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLXzEyTUhaCSgweDI0IDw8IDEwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLXzE1TUhaCSgweDFjIDw8IDEwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLXzE2TUhaCSgweDFhIDw8IDEwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLXzE5TUhaMgkoMHgxNSA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18yME1IWgkoMHgxNCA8PCAxMCkKKworLyogUEhZIHJlc2V0IGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVJTVAkJCTB4OAorCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fUEhZMAkJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fT1RHX0hMSU5LCQlCSVQoMSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9PVEdfUEhZTElOSwkJQklUKDIpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9QSFkJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX1BIWTEJCUJJVCg0KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hTSUMwCQlCSVQoNSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9IU0lDMQkJQklUKDYpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9MSU5LX0FMTAlCSVQoNykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX0xJTktfUDAJQklUKDgpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9MSU5LX1AxCUJJVCg5KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfTElOS19QMglCSVQoMTApCisKKy8qIElzb2xhdGlvbiwgY29uZmlndXJlZCBpbiB0aGUgcG93ZXIgbWFuYWdlbWVudCB1bml0ICovCisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX09GRlNFVAkJMHg3MDQKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVNCX0lTT0xfT1RHCQlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzBfT0ZGU0VUCTB4NzA4CisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX0hTSUMwCQlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzFfT0ZGU0VUCTB4NzBjCisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX0hTSUMxCQlCSVQoMCkKKworLyogTW9kZSBzd2l0Y2hpbmcgU1VCIERldmljZSA8LT4gSG9zdCAqLworI2RlZmluZSBFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9PRkZTRVQJCTB4MjFjCisjZGVmaW5lIEVYWU5PU180eDEyX01PREVfU1dJVENIX01BU0sJCTEKKyNkZWZpbmUgRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfREVWSUNFCQkwCisjZGVmaW5lIEVYWU5PU180eDEyX01PREVfU1dJVENIX0hPU1QJCTEKKworZW51bSBleHlub3M0eDEyX3BoeV9pZCB7CisJRVhZTk9TNHgxMl9ERVZJQ0UsCisJRVhZTk9TNHgxMl9IT1NULAorCUVYWU5PUzR4MTJfSFNJQzAsCisJRVhZTk9TNHgxMl9IU0lDMSwKKwlFWFlOT1M0eDEyX05VTV9QSFlTLAorfTsKKworLyoKKyAqIGV4eW5vczR4MTJfcmF0ZV90b19jbGsoKSBjb252ZXJ0cyB0aGUgc3VwcGxpZWQgY2xvY2sgcmF0ZSB0byB0aGUgdmFsdWUgdGhhdAorICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHBoeSByZWdpc3Rlci4KKyAqLworc3RhdGljIGludCBleHlub3M0eDEyX3JhdGVfdG9fY2xrKHVuc2lnbmVkIGxvbmcgcmF0ZSwgdTMyICpyZWcpCit7CisJLyogRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX01BU0sgKi8KKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgOTYwMCAqIEtIWjoKKwkJKnJlZyA9IEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF85TUhaNjsKKwkJYnJlYWs7CisJY2FzZSAxMCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xME1IWjsKKwkJYnJlYWs7CisJY2FzZSAxMiAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xMk1IWjsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMCAqIEtIWjoKKwkJKnJlZyA9IEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xOU1IWjI7CisJCWJyZWFrOworCWNhc2UgMjAgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMjBNSFo7CisJCWJyZWFrOworCWNhc2UgMjQgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMjRNSFo7CisJCWJyZWFrOworCWNhc2UgNTAgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfNTBNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0eDEyX2lzb2woc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIG9mZnNldDsKKwl1MzIgbWFzazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNHgxMl9ERVZJQ0U6CisJY2FzZSBFWFlOT1M0eDEyX0hPU1Q6CisJCW9mZnNldCA9IEVYWU5PU180eDEyX1VTQl9JU09MX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU180eDEyX1VTQl9JU09MX09URzsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0eDEyX0hTSUMwOgorCQlvZmZzZXQgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMF9PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMDsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0eDEyX0hTSUMxOgorCQlvZmZzZXQgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMV9PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX07CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZHJ2LT5yZWdfcG11LCBvZmZzZXQsIG1hc2ssIG9uID8gMCA6IG1hc2spOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0eDEyX3NldHVwX2NsayhzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKwl1MzIgY2xrOworCisJY2xrID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzR4MTJfVVBIWUNMSyk7CisJY2xrICY9IH5FWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfTUFTSzsKKwljbGsgfD0gZHJ2LT5yZWZfcmVnX3ZhbCA8PCBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfT0ZGU0VUOworCXdyaXRlbChjbGssIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlDTEspOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0eDEyX3BoeV9wd3Ioc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIHJzdGJpdHMgPSAwOworCXUzMiBwaHlwd3IgPSAwOworCXUzMiByc3Q7CisJdTMyIHB3cjsKKwl1MzIgbW9kZSA9IDA7CisJdTMyIHN3aXRjaF9tb2RlID0gMDsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNHgxMl9ERVZJQ0U6CisJCXBoeXB3ciA9CUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMDsKKwkJcnN0Yml0cyA9CUVYWU5PU180eDEyX1VSU1RDT05fUEhZMDsKKwkJbW9kZSA9CQlFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9ERVZJQ0U7CisJCXN3aXRjaF9tb2RlID0JMTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0eDEyX0hPU1Q6CisJCXBoeXB3ciA9CUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9QSFk7CisJCW1vZGUgPQkJRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfSE9TVDsKKwkJc3dpdGNoX21vZGUgPQkxOworCQlicmVhazsKKwljYXNlIEVYWU5PUzR4MTJfSFNJQzA6CisJCXBoeXB3ciA9CUVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzA7CisJCXJzdGJpdHMgPQlFWFlOT1NfNHgxMl9VUlNUQ09OX0hTSUMxIHwKKwkJCQlFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfTElOS19QMCB8CisJCQkJRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX1BIWTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0eDEyX0hTSUMxOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMxOworCQlyc3RiaXRzID0JRVhZTk9TXzR4MTJfVVJTVENPTl9IU0lDMSB8CisJCQkJRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX0xJTktfUDE7CisJCWJyZWFrOworCX07CisKKwlpZiAob24pIHsKKwkJaWYgKHN3aXRjaF9tb2RlKQorCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3N5cywKKwkJCQkJICAgRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfT0ZGU0VULAorCQkJCQkgICBFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9NQVNLLCBtb2RlKTsKKworCQlwd3IgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUFdSKTsKKwkJcHdyICY9IH5waHlwd3I7CisJCXdyaXRlbChwd3IsIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlQV1IpOworCisJCXJzdCA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlSU1QpOworCQlyc3QgfD0gcnN0Yml0czsKKwkJd3JpdGVsKHJzdCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzR4MTJfVVBIWVJTVCk7CisJCXVkZWxheSgxMCk7CisJCXJzdCAmPSB+cnN0Yml0czsKKwkJd3JpdGVsKHJzdCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzR4MTJfVVBIWVJTVCk7CisJCS8qIFRoZSBmb2xsb3dpbmcgZGVsYXkgaXMgbmVjZXNzYXJ5IGZvciB0aGUgcmVzZXQgc2VxdWVuY2UgdG8gYmUKKwkJICogY29tcGxldGVkICovCisJCXVkZWxheSg4MCk7CisJfSBlbHNlIHsKKwkJcHdyID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzR4MTJfVVBIWVBXUik7CisJCXB3ciB8PSBwaHlwd3I7CisJCXdyaXRlbChwd3IsIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlQV1IpOworCX0KK30KKworc3RhdGljIGludCBleHlub3M0eDEyX3Bvd2VyX29uKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCisJaW5zdC0+ZW5hYmxlZCA9IDE7CisJZXh5bm9zNHgxMl9zZXR1cF9jbGsoaW5zdCk7CisJZXh5bm9zNHgxMl9waHlfcHdyKGluc3QsIDEpOworCWV4eW5vczR4MTJfaXNvbChpbnN0LCAwKTsKKworCS8qIFBvd2VyIG9uIHRoZSBkZXZpY2UsIGFzIGl0IGlzIG5lY2Vzc2FyeSBmb3IgSFNJQyB0byB3b3JrICovCisJaWYgKGluc3QtPmNmZy0+aWQgPT0gRVhZTk9TNHgxMl9IU0lDMCkgeworCQlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqZGV2aWNlID0KKwkJCQkJJmRydi0+aW5zdGFuY2VzW0VYWU5PUzR4MTJfREVWSUNFXTsKKwkJZXh5bm9zNHgxMl9waHlfcHdyKGRldmljZSwgMSk7CisJCWV4eW5vczR4MTJfaXNvbChkZXZpY2UsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vczR4MTJfcG93ZXJfb2ZmKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICpkZXZpY2UgPQorCQkJCQkmZHJ2LT5pbnN0YW5jZXNbRVhZTk9TNHgxMl9ERVZJQ0VdOworCisJaW5zdC0+ZW5hYmxlZCA9IDA7CisJZXh5bm9zNHgxMl9pc29sKGluc3QsIDEpOworCWV4eW5vczR4MTJfcGh5X3B3cihpbnN0LCAwKTsKKworCWlmIChpbnN0LT5jZmctPmlkID09IEVYWU5PUzR4MTJfSFNJQzAgJiYgIWRldmljZS0+ZW5hYmxlZCkgeworCQlleHlub3M0eDEyX2lzb2woZGV2aWNlLCAxKTsKKwkJZXh5bm9zNHgxMl9waHlfcHdyKGRldmljZSwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSBleHlub3M0eDEyX3BoeXNbXSA9IHsKKwl7CisJCS5sYWJlbAkJPSAiZGV2aWNlIiwKKwkJLmlkCQk9IEVYWU5PUzR4MTJfREVWSUNFLAorCQkucG93ZXJfb24JPSBleHlub3M0eDEyX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNHgxMl9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaG9zdCIsCisJCS5pZAkJPSBFWFlOT1M0eDEyX0hPU1QsCisJCS5wb3dlcl9vbgk9IGV4eW5vczR4MTJfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0eDEyX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMCIsCisJCS5pZAkJPSBFWFlOT1M0eDEyX0hTSUMwLAorCQkucG93ZXJfb24JPSBleHlub3M0eDEyX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNHgxMl9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzEiLAorCQkuaWQJCT0gRVhZTk9TNHgxMl9IU0lDMSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNHgxMl9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczR4MTJfcG93ZXJfb2ZmLAorCX0sCisJe30sCit9OworCitjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNHgxMl91c2IyX3BoeV9jb25maWcgPSB7CisJLmhhc19tb2RlX3N3aXRjaAk9IDEsCisJLm51bV9waHlzCQk9IEVYWU5PUzR4MTJfTlVNX1BIWVMsCisJLnBoeXMJCQk9IGV4eW5vczR4MTJfcGh5cywKKwkucmF0ZV90b19jbGsJCT0gZXh5bm9zNHgxMl9yYXRlX3RvX2NsaywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC1zYXRhLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC1zYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNjFiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1MjUwLXNhdGEuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIFNhbXN1bmcgU0FUQSBTZXJEZXMoUEhZKSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6IEdpcmlzaCBLIFMgPGtzLmdpcmlAc2Ftc3VuZy5jb20+CisgKiAgICAgICAgIFl1dmFyYWogS3VtYXIgQyBEIDx5dXZhcmFqLmNkQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisKKyNkZWZpbmUgU0FUQVBIWV9DT05UUk9MX09GRlNFVAkJMHgwNzI0CisjZGVmaW5lIEVYWU5PUzVfU0FUQVBIWV9QTVVfRU5BQkxFCUJJVCgwKQorI2RlZmluZSBFWFlOT1M1X1NBVEFfUkVTRVQJCTB4NAorI2RlZmluZSBSRVNFVF9HTE9CQUxfUlNUX04JCUJJVCgwKQorI2RlZmluZSBSRVNFVF9DTU5fUlNUX04JCQlCSVQoMSkKKyNkZWZpbmUgUkVTRVRfQ01OX0JMT0NLX1JTVF9OCQlCSVQoMikKKyNkZWZpbmUgUkVTRVRfQ01OX0kyQ19SU1RfTgkJQklUKDMpCisjZGVmaW5lIFJFU0VUX1RYX1JYX1BJUEVfUlNUX04JCUJJVCg0KQorI2RlZmluZSBSRVNFVF9UWF9SWF9CTE9DS19SU1RfTgkJQklUKDUpCisjZGVmaW5lIFJFU0VUX1RYX1JYX0kyQ19SU1RfTgkJKEJJVCg2KSB8IEJJVCg3KSkKKyNkZWZpbmUgTElOS19SRVNFVAkJCTB4ZjAwMDAKKyNkZWZpbmUgRVhZTk9TNV9TQVRBX01PREUwCQkweDEwCisjZGVmaW5lIFNBVEFfU1BEX0dFTjMJCQlCSVQoMSkKKyNkZWZpbmUgRVhZTk9TNV9TQVRBX0NUUkwwCQkweDE0CisjZGVmaW5lIENUUkwwX1AwX1BIWV9DQUxJQlJBVEVEX1NFTAlCSVQoOSkKKyNkZWZpbmUgQ1RSTDBfUDBfUEhZX0NBTElCUkFURUQJCUJJVCg4KQorI2RlZmluZSBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNCTB4ZTAKKyNkZWZpbmUgUEhDVFJMTV9SRUZfUkFURQkJQklUKDEpCisjZGVmaW5lIFBIQ1RSTE1fSElHSF9TUEVFRAkJQklUKDApCisjZGVmaW5lIEVYWU5PUzVfU0FUQV9QSFNBVEFfU1RBVE0JMHhmMAorI2RlZmluZSBQSFNUQVRNX1BMTF9MT0NLRUQJCUJJVCgwKQorCisjZGVmaW5lIFBIWV9QTExfVElNRU9VVCAodXNlY3NfdG9famlmZmllcygxMDAwKSkKKworc3RydWN0IGV4eW5vc19zYXRhX3BoeSB7CisJc3RydWN0IHBoeSAqcGh5OworCXN0cnVjdCBjbGsgKnBoeWNsazsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IHJlZ21hcCAqcG11cmVnOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Cit9OworCitzdGF0aWMgaW50IHdhaXRfZm9yX3JlZ19zdGF0dXModm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgcmVnLCB1MzIgY2hlY2tiaXQsCisJCQkJdTMyIHN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgUEhZX1BMTF9USU1FT1VUOworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmICgocmVhZGwoYmFzZSArIHJlZykgJiBjaGVja2JpdCkgPT0gc3RhdHVzKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX3NhdGFfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX3NhdGFfcGh5ICpzYXRhX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhzYXRhX3BoeS0+cG11cmVnLCBTQVRBUEhZX0NPTlRST0xfT0ZGU0VULAorCQkJRVhZTk9TNV9TQVRBUEhZX1BNVV9FTkFCTEUsIHRydWUpOworCit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX3NhdGFfcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IGV4eW5vc19zYXRhX3BoeSAqc2F0YV9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoc2F0YV9waHktPnBtdXJlZywgU0FUQVBIWV9DT05UUk9MX09GRlNFVCwKKwkJCUVYWU5PUzVfU0FUQVBIWV9QTVVfRU5BQkxFLCBmYWxzZSk7CisKK30KKworc3RhdGljIGludCBleHlub3Nfc2F0YV9waHlfaW5pdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJdTMyIHZhbCA9IDA7CisJaW50IHJldCA9IDA7CisJdTggYnVmW10gPSB7IDB4M2EsIDB4MGIgfTsKKwlzdHJ1Y3QgZXh5bm9zX3NhdGFfcGh5ICpzYXRhX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHNhdGFfcGh5LT5wbXVyZWcsIFNBVEFQSFlfQ09OVFJPTF9PRkZTRVQsCisJCQlFWFlOT1M1X1NBVEFQSFlfUE1VX0VOQUJMRSwgdHJ1ZSk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKCZzYXRhX3BoeS0+cGh5LT5kZXYsICJwaHkgaW5pdCBmYWlsZWRcbiIpOworCisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCXZhbCB8PSBSRVNFVF9HTE9CQUxfUlNUX04gfCBSRVNFVF9DTU5fUlNUX04gfCBSRVNFVF9DTU5fQkxPQ0tfUlNUX04KKwkJfCBSRVNFVF9DTU5fSTJDX1JTVF9OIHwgUkVTRVRfVFhfUlhfUElQRV9SU1RfTgorCQl8IFJFU0VUX1RYX1JYX0JMT0NLX1JTVF9OIHwgUkVTRVRfVFhfUlhfSTJDX1JTVF9OOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKwl2YWwgfD0gTElOS19SRVNFVDsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisJdmFsIHw9IFJFU0VUX0NNTl9SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9QSFNBVEFfQ1RSTE0pOworCXZhbCAmPSB+UEhDVFJMTV9SRUZfUkFURTsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9QSFNBVEFfQ1RSTE0pOworCisJLyogSGlnaCBzcGVlZCBlbmFibGUgZm9yIEdlbjMgKi8KKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9QSFNBVEFfQ1RSTE0pOworCXZhbCB8PSBQSENUUkxNX0hJR0hfU1BFRUQ7CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX0NUUkwwKTsKKwl2YWwgfD0gQ1RSTDBfUDBfUEhZX0NBTElCUkFURURfU0VMIHwgQ1RSTDBfUDBfUEhZX0NBTElCUkFURUQ7CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfQ1RSTDApOworCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfTU9ERTApOworCXZhbCB8PSBTQVRBX1NQRF9HRU4zOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX01PREUwKTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzYXRhX3BoeS0+Y2xpZW50LCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHJlbGVhc2UgY211IHJlc2V0ICovCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCXZhbCAmPSB+UkVTRVRfQ01OX1JTVF9OOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKwl2YWwgfD0gUkVTRVRfQ01OX1JTVF9OOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKworCXJldCA9IHdhaXRfZm9yX3JlZ19zdGF0dXMoc2F0YV9waHktPnJlZ3MsCisJCQkJRVhZTk9TNV9TQVRBX1BIU0FUQV9TVEFUTSwKKwkJCQlQSFNUQVRNX1BMTF9MT0NLRUQsIDEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzYXRhX3BoeS0+cGh5LT5kZXYsCisJCQkiUEhZIFBMTCBsb2NraW5nIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwaHlfb3BzIGV4eW5vc19zYXRhX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gZXh5bm9zX3NhdGFfcGh5X2luaXQsCisJLnBvd2VyX29uCT0gZXh5bm9zX3NhdGFfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSBleHlub3Nfc2F0YV9waHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgZXh5bm9zX3NhdGFfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGV4eW5vc19zYXRhX3BoeSAqc2F0YV9waHk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCWludCByZXQgPSAwOworCisJc2F0YV9waHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNhdGFfcGh5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXRhX3BoeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJc2F0YV9waHktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoc2F0YV9waHktPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihzYXRhX3BoeS0+cmVncyk7CisKKwlzYXRhX3BoeS0+cG11cmVnID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShkZXYtPm9mX25vZGUsCisJCQkJCSJzYW1zdW5nLHN5c2Nvbi1waGFuZGxlIik7CisJaWYgKElTX0VSUihzYXRhX3BoeS0+cG11cmVnKSkgeworCQlkZXZfZXJyKGRldiwgInN5c2NvbiByZWdtYXAgbG9va3VwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihzYXRhX3BoeS0+cG11cmVnKTsKKwl9CisKKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsCisJCQkic2Ftc3VuZyxleHlub3Mtc2F0YXBoeS1pMmMtcGhhbmRsZSIsIDApOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzYXRhX3BoeS0+Y2xpZW50ID0gb2ZfZmluZF9pMmNfZGV2aWNlX2J5X25vZGUobm9kZSk7CisJaWYgKCFzYXRhX3BoeS0+Y2xpZW50KQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNhdGFfcGh5KTsKKworCXNhdGFfcGh5LT5waHljbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAic2F0YV9waHljdHJsIik7CisJaWYgKElTX0VSUihzYXRhX3BoeS0+cGh5Y2xrKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xrIGZvciBQSFlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihzYXRhX3BoeS0+cGh5Y2xrKTsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2F0YV9waHktPnBoeWNsayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIHNvdXJjZSBjbGtcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNhdGFfcGh5LT5waHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCAmZXh5bm9zX3NhdGFfcGh5X29wcywgTlVMTCk7CisJaWYgKElTX0VSUihzYXRhX3BoeS0+cGh5KSkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2F0YV9waHktPnBoeWNsayk7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihzYXRhX3BoeS0+cGh5KTsKKwl9CisKKwlwaHlfc2V0X2RydmRhdGEoc2F0YV9waHktPnBoeSwgc2F0YV9waHkpOworCisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LAorCQkJCQlvZl9waHlfc2ltcGxlX3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhdGFfcGh5LT5waHljbGspOworCQlyZXR1cm4gUFRSX0VSUihwaHlfcHJvdmlkZXIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBleHlub3Nfc2F0YV9waHlfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC1zYXRhLXBoeSIgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZXh5bm9zX3NhdGFfcGh5X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZXh5bm9zX3NhdGFfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUJPSBleHlub3Nfc2F0YV9waHlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm9mX21hdGNoX3RhYmxlCT0gZXh5bm9zX3NhdGFfcGh5X29mX21hdGNoLAorCQkubmFtZSAgPSAic2Ftc3VuZyxzYXRhLXBoeSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGV4eW5vc19zYXRhX3BoeV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU2VyRGVzIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgVjIiKTsKK01PRFVMRV9BVVRIT1IoIkdpcmlzaCBLIFMgPGtzLmdpcmlAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJZdXZhcmFqIEMgRCA8eXV2YXJhai5jZEBzYW1zdW5nLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1MjUwLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1MjUwLXVzYjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDE3OWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczUyNTAtdXNiMi5jCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogU2Ftc3VuZyBTb0MgVVNCIDEuMS8yLjAgUEhZIGRyaXZlciAtIEV4eW5vcyA1MjUwIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogS2FtaWwgRGVic2tpIDxrLmRlYnNraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgInBoeS1zYW1zdW5nLXVzYjIuaCIKKworLyogRXh5bm9zIFVTQiBQSFkgcmVnaXN0ZXJzICovCisjZGVmaW5lIEVYWU5PU181MjUwX1JFRkNMS1NFTF9DUllTVEFMCTB4MAorI2RlZmluZSBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfWE8JMHgxCisjZGVmaW5lIEVYWU5PU181MjUwX1JFRkNMS1NFTF9DTEtDT1JFCTB4MgorCisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfOU1IWjYJCTB4MAorI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzEwTUhaCQkweDEKKyNkZWZpbmUgRVhZTk9TXzUyNTBfRlNFTF8xMk1IWgkJMHgyCisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfMTlNSFoyCQkweDMKKyNkZWZpbmUgRVhZTk9TXzUyNTBfRlNFTF8yME1IWgkJMHg0CisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfMjRNSFoJCTB4NQorI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzUwTUhaCQkweDcKKworLyogTm9ybWFsIGhvc3QgKi8KKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwCQkJMHgwCisKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1BIWVNXUlNUQUxMCQlCSVQoMzEpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9SRUZDTEtTRUxfU0hJRlQJMTkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1JFRkNMS1NFTF9NQVNLCVwKKwkJKDB4MyA8PCBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUkVGQ0xLU0VMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRlNFTF9TSElGVAkJMTYKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZTRUxfTUFTSyBcCisJCSgweDcgPDwgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZTRUxfU0hJRlQpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9URVNUQlVSTklOCQlCSVQoMTEpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9SRVRFTkFCTEUJCUJJVCgxMCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0NPTU1PTl9PTl9OCQlCSVQoOSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1ZBVEVTVEVOQl9NQVNLCQkoMHgzIDw8IDcpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9WQVRFU1RFTkJfRFVBTAkJKDB4MCA8PCA3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVkFURVNURU5CX0lEMAkJKDB4MSA8PCA3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVkFURVNURU5CX0FOQUxPR1RFU1QJKDB4MiA8PCA3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfU0lERFEJCQlCSVQoNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZPUkNFU0xFRVAJCUJJVCg1KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRk9SQ0VTVVNQRU5ECQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1dPUkRJTlRFUkZBQ0UJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVVRNSVNXUlNUCQlCSVQoMikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0xJTktTV1JTVAkJQklUKDEpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9QSFlTV1JTVAkJQklUKDApCisKKy8qIEhTSUMwICYgSFNJQzEgKi8KKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwxCQkJMHgxMAorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDIJCQkweDIwCisKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS1NFTF9NQVNLCQkoMHgzIDw8IDIzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLU0VMX0RFRkFVTFQJKDB4MiA8PCAyMykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl9NQVNLCQkoMHg3ZiA8PCAxNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8xMgkJKDB4MjQgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMTUJCSgweDFjIDw8IDE2KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLRElWXzE2CQkoMHgxYSA8PCAxNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8xOV8yCQkoMHgxNSA8PCAxNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8yMAkJKDB4MTQgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9TSUREUQkJCUJJVCg2KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfRk9SQ0VTTEVFUAkJQklUKDUpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9GT1JDRVNVU1BFTkQJCUJJVCg0KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfV09SRElOVEVSRkFDRQkJQklUKDMpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9VVE1JU1dSU1QJCUJJVCgyKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUEhZU1dSU1QJCUJJVCgwKQorCisvKiBFSENJIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMCQkJMHgzMAorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUlhBTElHTgkJQklUKDI5KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUjQJCUJJVCgyOCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1I4CQlCSVQoMjcpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSMTYJCUJJVCgyNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0FVVE9QUERPTk9WUkNVUkVOCUJJVCgyNSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9TSElGVAkxOQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwwX01BU0sJXAorCQkoMHgzZiA8PCBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwwX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwxX1NISUZUCTEzCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTDFfTUFTSwlcCisJCSgweDNmIDw8IEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTDFfU0hJRlQpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTDJfU0hJRlQJNworI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwwX01BU0sJXAorCQkoMHgzZiA8PCBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwwX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUxIT1NUX1NISUZUCTEKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMSE9TVF9NQVNLIFwKKwkJKDB4MSA8PCBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUxIT1NUX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfU0lNVUxBVElPTk1PREUJCUJJVCgwKQorCisvKiBPSENJIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMICAgICAgICAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUT0hDSUNUUkxfRlJBTUVMRU5WQUxfU0hJRlQJMQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUT0hDSUNUUkxfRlJBTUVMRU5WQUxfTUFTSyBcCisJCSgweDNmZiA8PCBFWFlOT1NfNTI1MF9IT1NUT0hDSUNUUkxfRlJBTUVMRU5WQUxfU0hJRlQpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RPSENJQ1RSTF9GUkFNRUxFTlZBTEVOCQlCSVQoMCkKKworLyogVVNCT1RHICovCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZUwkJCQkweDM4CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19QSFlMSU5LX1NXX1JFU0VUCQlCSVQoMTQpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19MSU5LX1NXX1JTVF9VT1RHCQlCSVQoMTMpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19QSFlfU1dfUlNUCQlCSVQoMTIpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfU0hJRlQJCTkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1JFRkNMS1NFTF9NQVNLIFwKKwkJKDB4MyA8PCBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfSURfUFVMTFVQCQkJQklUKDgpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19DT01NT05fT04JCQlCSVQoNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZTRUxfU0hJRlQJCTQKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZTRUxfTUFTSyBcCisJCSgweDMgPDwgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZTRUxfU0hJRlQpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19GT1JDRV9TTEVFUAkJQklUKDMpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19PVEdESVNBQkxFCQlCSVQoMikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1NJRERRX1VPVEcJCUJJVCgxKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU1VTUEVORAkJQklUKDApCisKKy8qIElzb2xhdGlvbiwgY29uZmlndXJlZCBpbiB0aGUgcG93ZXIgbWFuYWdlbWVudCB1bml0ICovCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQl9JU09MX09UR19PRkZTRVQJCTB4NzA0CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQl9JU09MX09URwkJQklUKDApCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQl9JU09MX0hPU1RfT0ZGU0VUCTB4NzA4CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQl9JU09MX0hPU1QJCUJJVCgwKQorCisvKiBNb2RlIHN3dGljaCByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9PRkZTRVQJCTB4MjMwCisjZGVmaW5lIEVYWU5PU181MjUwX01PREVfU1dJVENIX01BU0sJCTEKKyNkZWZpbmUgRVhZTk9TXzUyNTBfTU9ERV9TV0lUQ0hfREVWSUNFCQkwCisjZGVmaW5lIEVYWU5PU181MjUwX01PREVfU1dJVENIX0hPU1QJCTEKKworZW51bSBleHlub3M0eDEyX3BoeV9pZCB7CisJRVhZTk9TNTI1MF9ERVZJQ0UsCisJRVhZTk9TNTI1MF9IT1NULAorCUVYWU5PUzUyNTBfSFNJQzAsCisJRVhZTk9TNTI1MF9IU0lDMSwKKwlFWFlOT1M1MjUwX05VTV9QSFlTLAorfTsKKworLyoKKyAqIGV4eW5vczUyNTBfcmF0ZV90b19jbGsoKSBjb252ZXJ0cyB0aGUgc3VwcGxpZWQgY2xvY2sgcmF0ZSB0byB0aGUgdmFsdWUgdGhhdAorICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHBoeSByZWdpc3Rlci4KKyAqLworc3RhdGljIGludCBleHlub3M1MjUwX3JhdGVfdG9fY2xrKHVuc2lnbmVkIGxvbmcgcmF0ZSwgdTMyICpyZWcpCit7CisJLyogRVhZTk9TXzUyNTBfRlNFTF9NQVNLICovCisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDk2MDAgKiBLSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzlNSFo2OworCQlicmVhazsKKwljYXNlIDEwICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF8xME1IWjsKKwkJYnJlYWs7CisJY2FzZSAxMiAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU181MjUwX0ZTRUxfMTJNSFo7CisJCWJyZWFrOworCWNhc2UgMTkyMDAgKiBLSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzE5TUhaMjsKKwkJYnJlYWs7CisJY2FzZSAyMCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU181MjUwX0ZTRUxfMjBNSFo7CisJCWJyZWFrOworCWNhc2UgMjQgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzI0TUhaOworCQlicmVhazsKKwljYXNlIDUwICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF81ME1IWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczUyNTBfaXNvbChzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCwgYm9vbCBvbikKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKwl1MzIgb2Zmc2V0OworCXUzMiBtYXNrOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M1MjUwX0RFVklDRToKKwkJb2Zmc2V0ID0gRVhZTk9TXzUyNTBfVVNCX0lTT0xfT1RHX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU181MjUwX1VTQl9JU09MX09URzsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M1MjUwX0hPU1Q6CisJCW9mZnNldCA9IEVYWU5PU181MjUwX1VTQl9JU09MX0hPU1RfT0ZGU0VUOworCQltYXNrID0gRVhZTk9TXzUyNTBfVVNCX0lTT0xfSE9TVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX07CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZHJ2LT5yZWdfcG11LCBvZmZzZXQsIG1hc2ssIG9uID8gMCA6IG1hc2spOworfQorCitzdGF0aWMgaW50IGV4eW5vczUyNTBfcG93ZXJfb24oc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QpCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIGN0cmwwOworCXUzMiBvdGc7CisJdTMyIGVoY2k7CisJdTMyIG9oY2k7CisJdTMyIGhzaWM7CisKKwlzd2l0Y2ggKGluc3QtPmNmZy0+aWQpIHsKKwljYXNlIEVYWU5PUzUyNTBfREVWSUNFOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHJ2LT5yZWdfc3lzLAorCQkJCSAgIEVYWU5PU181MjUwX01PREVfU1dJVENIX09GRlNFVCwKKwkJCQkgICBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9NQVNLLAorCQkJCSAgIEVYWU5PU181MjUwX01PREVfU1dJVENIX0RFVklDRSk7CisKKwkJLyogT1RHIGNvbmZpZ3VyYXRpb24gKi8KKwkJb3RnID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfVVNCT1RHU1lTKTsKKwkJLyogVGhlIGNsb2NrICovCisJCW90ZyAmPSB+RVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZTRUxfTUFTSzsKKwkJb3RnIHw9IGRydi0+cmVmX3JlZ192YWwgPDwgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZTRUxfU0hJRlQ7CisJCS8qIFJlc2V0ICovCisJCW90ZyAmPSB+KEVYWU5PU181MjUwX1VTQk9UR1NZU19GT1JDRV9TVVNQRU5EIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19GT1JDRV9TTEVFUCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfU0lERFFfVU9URyk7CisJCW90ZyB8PQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZX1NXX1JTVCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZTElOS19TV19SRVNFVCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfTElOS19TV19SU1RfVU9URyB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfT1RHRElTQUJMRTsKKwkJLyogUmVmIGNsb2NrICovCisJCW90ZyAmPQl+RVhZTk9TXzUyNTBfVVNCT1RHU1lTX1JFRkNMS1NFTF9NQVNLOworCQlvdGcgfD0gIEVYWU5PU181MjUwX1JFRkNMS1NFTF9DTEtDT1JFIDw8CisJCQkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfU0hJRlQ7CisJCXdyaXRlbChvdGcsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX1VTQk9UR1NZUyk7CisJCXVkZWxheSgxMDApOworCQlvdGcgJj0gfihFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZX1NXX1JTVCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfTElOS19TV19SU1RfVU9URyB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZTElOS19TV19SRVNFVCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfT1RHRElTQUJMRSk7CisJCXdyaXRlbChvdGcsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX1VTQk9UR1NZUyk7CisKKworCQlicmVhazsKKwljYXNlIEVYWU5PUzUyNTBfSE9TVDoKKwljYXNlIEVYWU5PUzUyNTBfSFNJQzA6CisJY2FzZSBFWFlOT1M1MjUwX0hTSUMxOgorCQkvKiBIb3N0IHJlZ2lzdGVycyBjb25maWd1cmF0aW9uICovCisJCWN0cmwwID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwKTsKKwkJLyogVGhlIGNsb2NrICovCisJCWN0cmwwICY9IH5FWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRlNFTF9NQVNLOworCQljdHJsMCB8PSBkcnYtPnJlZl9yZWdfdmFsIDw8CisJCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GU0VMX1NISUZUOworCisJCS8qIFJlc2V0ICovCisJCWN0cmwwICY9CX4oRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1BIWVNXUlNUIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUEhZU1dSU1RBTEwgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9TSUREUSB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZPUkNFU1VTUEVORCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZPUkNFU0xFRVApOworCQljdHJsMCB8PQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfTElOS1NXUlNUIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVVRNSVNXUlNUIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfQ09NTU9OX09OX047CisJCXdyaXRlbChjdHJsMCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwKTsKKwkJdWRlbGF5KDEwKTsKKwkJY3RybDAgJj0JfihFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfTElOS1NXUlNUIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVVRNSVNXUlNUKTsKKwkJd3JpdGVsKGN0cmwwLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDApOworCisJCS8qIE9URyBjb25maWd1cmF0aW9uICovCisJCW90ZyA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX1VTQk9UR1NZUyk7CisJCS8qIFRoZSBjbG9jayAqLworCQlvdGcgJj0gfkVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX01BU0s7CisJCW90ZyB8PSBkcnYtPnJlZl9yZWdfdmFsIDw8IEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUOworCQkvKiBSZXNldCAqLworCQlvdGcgJj0gfihFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU1VTUEVORCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVAgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1NJRERRX1VPVEcpOworCQlvdGcgfD0JRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX09UR0RJU0FCTEU7CisJCS8qIFJlZiBjbG9jayAqLworCQlvdGcgJj0JfkVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfTUFTSzsKKwkJb3RnIHw9ICBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ0xLQ09SRSA8PAorCQkJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX1NISUZUOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQl1ZGVsYXkoMTApOworCQlvdGcgJj0gfihFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZX1NXX1JTVCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfTElOS19TV19SU1RfVU9URyB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZTElOS19TV19SRVNFVCk7CisKKwkJLyogSFNJQyBwaHkgY29uZmlndXJhdGlvbiAqLworCQloc2ljID0gKEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMTIgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtTRUxfREVGQVVMVCB8CisJCQkJRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1BIWVNXUlNUKTsKKwkJd3JpdGVsKGhzaWMsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMSk7CisJCXdyaXRlbChoc2ljLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDIpOworCQl1ZGVsYXkoMTApOworCQloc2ljICY9IH5FWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUEhZU1dSU1Q7CisJCXdyaXRlbChoc2ljLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDEpOworCQl3cml0ZWwoaHNpYywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwyKTsKKwkJLyogVGhlIGZvbGxvd2luZyBkZWxheSBpcyBuZWNlc3NhcnkgZm9yIHRoZSByZXNldCBzZXF1ZW5jZSB0byBiZQorCQkgKiBjb21wbGV0ZWQgKi8KKwkJdWRlbGF5KDgwKTsKKworCQkvKiBFbmFibGUgRUhDSSBETUEgYnVyc3QgKi8KKwkJZWhjaSA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTCk7CisJCWVoY2kgfD0JRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1JYQUxJR04gfAorCQkJRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1I0IHwKKwkJCUVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSOCB8CisJCQlFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUjE2OworCQl3cml0ZWwoZWhjaSwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMKTsKKworCQkvKiBPSENJIHNldHRpbmdzICovCisJCW9oY2kgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IT1NUT0hDSUNUUkwpOworCQkvKiBGb2xsb3dpbmcgY29kZSBpcyBiYXNlZCBvbiB0aGUgb2xkIGRyaXZlciAqLworCQlvaGNpIHw9CTB4MSA8PCAzOworCQl3cml0ZWwob2hjaSwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMKTsKKworCQlicmVhazsKKwl9CisJaW5zdC0+ZW5hYmxlZCA9IDE7CisJZXh5bm9zNTI1MF9pc29sKGluc3QsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNTI1MF9wb3dlcl9vZmYoc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QpCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIGN0cmwwOworCXUzMiBvdGc7CisJdTMyIGhzaWM7CisKKwlpbnN0LT5lbmFibGVkID0gMDsKKwlleHlub3M1MjUwX2lzb2woaW5zdCwgMSk7CisKKwlzd2l0Y2ggKGluc3QtPmNmZy0+aWQpIHsKKwljYXNlIEVYWU5PUzUyNTBfREVWSUNFOgorCQlvdGcgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQlvdGcgfD0gKEVYWU5PU181MjUwX1VTQk9UR1NZU19GT1JDRV9TVVNQRU5EIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19TSUREUV9VT1RHIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19GT1JDRV9TTEVFUCk7CisJCXdyaXRlbChvdGcsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX1VTQk9UR1NZUyk7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNTI1MF9IT1NUOgorCQljdHJsMCA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCWN0cmwwIHw9IChFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfU0lERFEgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNVU1BFTkQgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNMRUVQIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUEhZU1dSU1QgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9QSFlTV1JTVEFMTCk7CisJCXdyaXRlbChjdHJsMCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwKTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M1MjUwX0hTSUMwOgorCWNhc2UgRVhZTk9TNTI1MF9IU0lDMToKKwkJaHNpYyA9IChFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLRElWXzEyIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLU0VMX0RFRkFVTFQgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9TSUREUSB8CisJCQkJRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX0ZPUkNFU0xFRVAgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9GT1JDRVNVU1BFTkQKKwkJCQkpOworCQl3cml0ZWwoaHNpYywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwxKTsKKwkJd3JpdGVsKGhzaWMsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgZXh5bm9zNTI1MF9waHlzW10gPSB7CisJeworCQkubGFiZWwJCT0gImRldmljZSIsCisJCS5pZAkJPSBFWFlOT1M1MjUwX0RFVklDRSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNTI1MF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczUyNTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhvc3QiLAorCQkuaWQJCT0gRVhZTk9TNTI1MF9IT1NULAorCQkucG93ZXJfb24JPSBleHlub3M1MjUwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNTI1MF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzAiLAorCQkuaWQJCT0gRVhZTk9TNTI1MF9IU0lDMCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNTI1MF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczUyNTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMxIiwKKwkJLmlkCQk9IEVYWU5PUzUyNTBfSFNJQzEsCisJCS5wb3dlcl9vbgk9IGV4eW5vczUyNTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M1MjUwX3Bvd2VyX29mZiwKKwl9LAorCXt9LAorfTsKKworY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczUyNTBfdXNiMl9waHlfY29uZmlnID0geworCS5oYXNfbW9kZV9zd2l0Y2gJPSAxLAorCS5udW1fcGh5cwkJPSBFWFlOT1M1MjUwX05VTV9QSFlTLAorCS5waHlzCQkJPSBleHlub3M1MjUwX3BoeXMsCisJLnJhdGVfdG9fY2xrCQk9IGV4eW5vczUyNTBfcmF0ZV90b19jbGssCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LW9tYXAtY29udHJvbC5jIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMWI0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktb21hcC1jb250cm9sLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBvbWFwLWNvbnRyb2wtcGh5LmMgLSBUaGUgUEhZIHBhcnQgb2YgY29udHJvbCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF9jb250cm9sX3BoeS5oPgorCisvKioKKyAqIG9tYXBfY29udHJvbF9waHlfcG93ZXIgLSBwb3dlciBvbi9vZmYgdGhlIHBoeSB1c2luZyBjb250cm9sIG1vZHVsZSByZWcKKyAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKKyAqIEBvbjogMCBvciAxLCBiYXNlZCBvbiBwb3dlcmluZyBvbiBvciBvZmYgdGhlIFBIWQorICovCit2b2lkIG9tYXBfY29udHJvbF9waHlfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pCit7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJc3RydWN0IG9tYXBfY29udHJvbF9waHkJKmNvbnRyb2xfcGh5OworCisJaWYgKElTX0VSUihkZXYpIHx8ICFkZXYpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRyb2xfcGh5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKCFjb250cm9sX3BoeSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBpbnZhbGlkIGNvbnRyb2wgcGh5IGRldmljZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKGNvbnRyb2xfcGh5LT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX09UR0hTKQorCQlyZXR1cm47CisKKwl2YWwgPSByZWFkbChjb250cm9sX3BoeS0+cG93ZXIpOworCisJc3dpdGNoIChjb250cm9sX3BoeS0+dHlwZSkgeworCWNhc2UgT01BUF9DVFJMX1RZUEVfVVNCMjoKKwkJaWYgKG9uKQorCQkJdmFsICY9IH5PTUFQX0NUUkxfREVWX1BIWV9QRDsKKwkJZWxzZQorCQkJdmFsIHw9IE9NQVBfQ1RSTF9ERVZfUEhZX1BEOworCQlicmVhazsKKworCWNhc2UgT01BUF9DVFJMX1RZUEVfUElQRTM6CisJCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY29udHJvbF9waHktPnN5c19jbGspOworCQlyYXRlID0gcmF0ZS8xMDAwMDAwOworCisJCWlmIChvbikgeworCQkJdmFsICY9IH4oT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9NQVNLIHwKKwkJCQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfRlJFUV9NQVNLKTsKKwkJCXZhbCB8PSBPTUFQX0NUUkxfUElQRTNfUEhZX1RYX1JYX1BPV0VST04gPDwKKwkJCQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfQ01EX1NISUZUOworCQkJdmFsIHw9IHJhdGUgPDwKKwkJCQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfRlJFUV9TSElGVDsKKwkJfSBlbHNlIHsKKwkJCXZhbCAmPSB+T01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9NQVNLOworCQkJdmFsIHw9IE9NQVBfQ1RSTF9QSVBFM19QSFlfVFhfUlhfUE9XRVJPRkYgPDwKKwkJCQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfQ01EX1NISUZUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMjoKKwkJaWYgKG9uKQorCQkJdmFsICY9IH5PTUFQX0NUUkxfVVNCMl9QSFlfUEQ7CisJCWVsc2UKKwkJCXZhbCB8PSBPTUFQX0NUUkxfVVNCMl9QSFlfUEQ7CisJCWJyZWFrOworCisJY2FzZSBPTUFQX0NUUkxfVFlQRV9BTTQzN1VTQjI6CisJCWlmIChvbikgeworCQkJdmFsICY9IH4oQU00MzdYX0NUUkxfVVNCMl9QSFlfUEQgfAorCQkJCQlBTTQzN1hfQ1RSTF9VU0IyX09UR19QRCk7CisJCQl2YWwgfD0gKEFNNDM3WF9DVFJMX1VTQjJfT1RHVkRFVF9FTiB8CisJCQkJCUFNNDM3WF9DVFJMX1VTQjJfT1RHU0VTU0VORF9FTik7CisJCX0gZWxzZSB7CisJCQl2YWwgJj0gfihBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4gfAorCQkJCQlBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4pOworCQkJdmFsIHw9IChBTTQzN1hfQ1RSTF9VU0IyX1BIWV9QRCB8CisJCQkJCSBBTTQzN1hfQ1RSTF9VU0IyX09UR19QRCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICIlczogdHlwZSAlZCBub3QgcmVjb2duaXplZFxuIiwKKwkJCV9fZnVuY19fLCBjb250cm9sX3BoeS0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCXdyaXRlbCh2YWwsIGNvbnRyb2xfcGh5LT5wb3dlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKTsKKworLyoqCisgKiBvbWFwX2NvbnRyb2xfdXNiX2hvc3RfbW9kZSAtIHNldCBBVkFMSUQsIFZCVVNWQUxJRCBhbmQgSUQgcGluIGluIGdyb3VuZGVkCisgKiBAY3RybF9waHk6IHN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5ICoKKyAqCisgKiBXcml0ZXMgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gbm90aWZ5IHRoZSB1c2IgY29yZSB0aGF0IGEgdXNiCisgKiBkZXZpY2UgaGFzIGJlZW4gY29ubmVjdGVkLgorICovCitzdGF0aWMgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX2hvc3RfbW9kZShzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqY3RybF9waHkpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKGN0cmxfcGh5LT5vdGdoc19jb250cm9sKTsKKwl2YWwgJj0gfihPTUFQX0NUUkxfREVWX0lERElHIHwgT01BUF9DVFJMX0RFVl9TRVNTRU5EKTsKKwl2YWwgfD0gT01BUF9DVFJMX0RFVl9BVkFMSUQgfCBPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRDsKKwl3cml0ZWwodmFsLCBjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7Cit9CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9kZXZpY2VfbW9kZSAtIHNldCBBVkFMSUQsIFZCVVNWQUxJRCBhbmQgSUQgcGluIGluIGhpZ2gKKyAqIGltcGVkYW5jZQorICogQGN0cmxfcGh5OiBzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqCisgKgorICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgdGhhdCBpdCBoYXMgYmVlbgorICogY29ubmVjdGVkIHRvIGEgdXNiIGhvc3QuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXBfY29udHJvbF91c2JfZGV2aWNlX21vZGUoc3RydWN0IG9tYXBfY29udHJvbF9waHkgKmN0cmxfcGh5KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7CisJdmFsICY9IH5PTUFQX0NUUkxfREVWX1NFU1NFTkQ7CisJdmFsIHw9IE9NQVBfQ1RSTF9ERVZfSURESUcgfCBPTUFQX0NUUkxfREVWX0FWQUxJRCB8CisJCU9NQVBfQ1RSTF9ERVZfVkJVU1ZBTElEOworCXdyaXRlbCh2YWwsIGN0cmxfcGh5LT5vdGdoc19jb250cm9sKTsKK30KKworLyoqCisgKiBvbWFwX2NvbnRyb2xfdXNiX3NldF9zZXNzaW9uZW5kIC0gRW5hYmxlIFNFU1NJT05FTkQgYW5kIElESUcgdG8gaGlnaAorICogaW1wZWRhbmNlCisgKiBAY3RybF9waHk6IHN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5ICoKKyAqCisgKiBXcml0ZXMgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gbm90aWZ5IHRoZSB1c2IgY29yZSBpdCdzIG5vdyBpbgorICogZGlzY29ubmVjdGVkIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX3NldF9zZXNzaW9uZW5kKHN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5ICpjdHJsX3BoeSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoY3RybF9waHktPm90Z2hzX2NvbnRyb2wpOworCXZhbCAmPSB+KE9NQVBfQ1RSTF9ERVZfQVZBTElEIHwgT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQpOworCXZhbCB8PSBPTUFQX0NUUkxfREVWX0lERElHIHwgT01BUF9DVFJMX0RFVl9TRVNTRU5EOworCXdyaXRlbCh2YWwsIGN0cmxfcGh5LT5vdGdoc19jb250cm9sKTsKK30KKworLyoqCisgKiBvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlIC0gQ2FsbHMgdG8gZnVuY3Rpb25zIHRvIHNldCBVU0IgaW4gb25lIG9mIGhvc3QgbW9kZQorICogb3IgZGV2aWNlIG1vZGUgb3IgdG8gZGVub3RlIGRpc2Nvbm5lY3RlZCBzdGF0ZQorICogQGRldjogdGhlIGNvbnRyb2wgbW9kdWxlIGRldmljZQorICogQG1vZGU6IFRoZSBtb2RlIHRvIHdoaWNoIHVzYiBzaG91bGQgYmUgY29uZmlndXJlZAorICoKKyAqIFRoaXMgaXMgYW4gQVBJIHRvIHdyaXRlIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgdGhhdAorICogYSB1c2IgZGV2aWNlIGhhcyBiZWVuIGNvbm5lY3RlZC4KKyAqLwordm9pZCBvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwllbnVtIG9tYXBfY29udHJvbF91c2JfbW9kZSBtb2RlKQoreworCXN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5CSpjdHJsX3BoeTsKKworCWlmIChJU19FUlIoZGV2KSB8fCAhZGV2KQorCQlyZXR1cm47CisKKwljdHJsX3BoeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFjdHJsX3BoeSkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgY29udHJvbCBwaHkgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjdHJsX3BoeS0+dHlwZSAhPSBPTUFQX0NUUkxfVFlQRV9PVEdIUykKKwkJcmV0dXJuOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBVU0JfTU9ERV9IT1NUOgorCQlvbWFwX2NvbnRyb2xfdXNiX2hvc3RfbW9kZShjdHJsX3BoeSk7CisJCWJyZWFrOworCWNhc2UgVVNCX01PREVfREVWSUNFOgorCQlvbWFwX2NvbnRyb2xfdXNiX2RldmljZV9tb2RlKGN0cmxfcGh5KTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfTU9ERV9ESVNDT05ORUNUOgorCQlvbWFwX2NvbnRyb2xfdXNiX3NldF9zZXNzaW9uZW5kKGN0cmxfcGh5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3ZkYmcoZGV2LCAiaW52YWxpZCBvbWFwIGNvbnRyb2wgdXNiIG1vZGVcbiIpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUpOworCisjaWZkZWYgQ09ORklHX09GCisKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSBvdGdoc19kYXRhID0gT01BUF9DVFJMX1RZUEVfT1RHSFM7CitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgdXNiMl9kYXRhID0gT01BUF9DVFJMX1RZUEVfVVNCMjsKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSBwaXBlM19kYXRhID0gT01BUF9DVFJMX1RZUEVfUElQRTM7CitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgZHJhN3VzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX0RSQTdVU0IyOworc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3BoeV90eXBlIGFtNDM3dXNiMl9kYXRhID0gT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvbWFwX2NvbnRyb2xfcGh5X2lkX3RhYmxlW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS1vdGdocyIsCisJCS5kYXRhID0gJm90Z2hzX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LXVzYjIiLAorCQkuZGF0YSA9ICZ1c2IyX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LXBpcGUzIiwKKwkJLmRhdGEgPSAmcGlwZTNfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktdXNiMi1kcmE3IiwKKwkJLmRhdGEgPSAmZHJhN3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktdXNiMi1hbTQzNyIsCisJCS5kYXRhID0gJmFtNDM3dXNiMl9kYXRhLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF9jb250cm9sX3BoeV9pZF90YWJsZSk7CisjZW5kaWYKKworCitzdGF0aWMgaW50IG9tYXBfY29udHJvbF9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlczsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqY29udHJvbF9waHk7CisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIob21hcF9jb250cm9sX3BoeV9pZF90YWJsZSksCisJCQkJJnBkZXYtPmRldik7CisJaWYgKCFvZl9pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb250cm9sX3BoeSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNvbnRyb2xfcGh5KSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250cm9sX3BoeSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBjb250cm9sIHBoeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvbnRyb2xfcGh5LT5kZXYgPSAmcGRldi0+ZGV2OworCWNvbnRyb2xfcGh5LT50eXBlID0gKihlbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSAqKW9mX2lkLT5kYXRhOworCisJaWYgKGNvbnRyb2xfcGh5LT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX09UR0hTKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkib3RnaHNfY29udHJvbCIpOworCQljb250cm9sX3BoeS0+b3RnaHNfY29udHJvbCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgKKwkJCSZwZGV2LT5kZXYsIHJlcyk7CisJCWlmIChJU19FUlIoY29udHJvbF9waHktPm90Z2hzX2NvbnRyb2wpKQorCQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbF9waHktPm90Z2hzX2NvbnRyb2wpOworCX0gZWxzZSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJInBvd2VyIik7CisJCWNvbnRyb2xfcGh5LT5wb3dlciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGNvbnRyb2xfcGh5LT5wb3dlcikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGdldCBwb3dlciByZWdpc3RlclxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihjb250cm9sX3BoeS0+cG93ZXIpOworCQl9CisJfQorCisJaWYgKGNvbnRyb2xfcGh5LT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX1BJUEUzKSB7CisJCWNvbnRyb2xfcGh5LT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KGNvbnRyb2xfcGh5LT5kZXYsCisJCQkic3lzX2Nsa2luIik7CisJCWlmIChJU19FUlIoY29udHJvbF9waHktPnN5c19jbGspKSB7CisJCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IHN5c19jbGtpblxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoY29udHJvbF9waHktPmRldiwgY29udHJvbF9waHkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfY29udHJvbF9waHlfZHJpdmVyID0geworCS5wcm9iZQkJPSBvbWFwX2NvbnRyb2xfcGh5X3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJvbWFwLWNvbnRyb2wtcGh5IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvbWFwX2NvbnRyb2xfcGh5X2lkX3RhYmxlKSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9jb250cm9sX3BoeV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9jb250cm9sX3BoeV9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKG9tYXBfY29udHJvbF9waHlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX2NvbnRyb2xfcGh5X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9jb250cm9sX3BoeV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQob21hcF9jb250cm9sX3BoeV9leGl0KTsKKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogb21hcF9jb250cm9sX3BoeSIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIENvbnRyb2wgTW9kdWxlIFBIWSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYwppbmRleCA3Njk5NzUyLi5hMjIwNWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCkBAIC0yMSwxNiArMjEsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9vbWFwX3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9waHlfY29tcGFuaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL29tYXBfY29udHJvbF91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF9jb250cm9sX3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCisjZGVmaW5lIFVTQjJQSFlfRElTQ09OX0JZUF9MQVRDSCAoMSA8PCAzMSkKKyNkZWZpbmUgVVNCMlBIWV9BTkFfQ09ORklHMSAweDRjCisKIC8qKgogICogb21hcF91c2IyX3NldF9jb21wYXJhdG9yIC0gbGlua3MgdGhlIGNvbXBhcmF0b3IgcHJlc2VudCBpbiB0aGUgc3l0ZW0gd2l0aAogICoJdGhpcyBwaHkKQEAgLTk4LDMzICsxMDEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvbWFwX3VzYjJfc3VzcGVuZChzdHJ1Y3QgdXNiX3BoeSAqeCwgaW50IHN1c3BlbmQpCi17Ci0Jc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfdG9fb21hcHVzYih4KTsKLQlpbnQgcmV0OwotCi0JaWYgKHN1c3BlbmQgJiYgIXBoeS0+aXNfc3VzcGVuZGVkKSB7Ci0JCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwotCQlwbV9ydW50aW1lX3B1dF9zeW5jKHBoeS0+ZGV2KTsKLQkJcGh5LT5pc19zdXNwZW5kZWQgPSAxOwotCX0gZWxzZSBpZiAoIXN1c3BlbmQgJiYgcGh5LT5pc19zdXNwZW5kZWQpIHsKLQkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhwaHktPmRldik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBoeS0+ZGV2LCAiZ2V0X3N5bmMgZmFpbGVkIHdpdGggZXJyICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKLQkJcGh5LT5pc19zdXNwZW5kZWQgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG9tYXBfdXNiX3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICp4KQogewogCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOwogCi0Jb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMCk7CisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMzLDMwICsxMTQsMTAzIEBACiB7CiAJc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CiAKLQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKKwlvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF91c2JfaW5pdChzdHJ1Y3QgcGh5ICp4KQoreworCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOworCXUzMiB2YWw7CisKKwlpZiAocGh5LT5mbGFncyAmIE9NQVBfVVNCMl9DQUxJQlJBVEVfRkFMU0VfRElTQ09OTkVDVCkgeworCQkvKgorCQkgKgorCQkgKiBSZWR1Y2UgdGhlIHNlbnNpdGl2aXR5IG9mIGludGVybmFsIFBIWSBieSBlbmFibGluZyB0aGUKKwkJICogRElTQ09OX0JZUF9MQVRDSCBvZiB0aGUgVVNCMlBIWV9BTkFfQ09ORklHMSByZWdpc3Rlci4gVGhpcworCQkgKiByZXNvbHZlcyBpc3N1ZXMgd2l0aCBjZXJ0YWluIGRldmljZXMgd2hpY2ggY2FuIG90aGVyd2lzZQorCQkgKiBiZSBwcm9uZSB0byBmYWxzZSBkaXNjb25uZWN0cy4KKwkJICoKKwkJICovCisJCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGh5X2Jhc2UsIFVTQjJQSFlfQU5BX0NPTkZJRzEpOworCQl2YWwgfD0gVVNCMlBIWV9ESVNDT05fQllQX0xBVENIOworCQlvbWFwX3VzYl93cml0ZWwocGh5LT5waHlfYmFzZSwgVVNCMlBIWV9BTkFfQ09ORklHMSwgdmFsKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKKwkuaW5pdAkJPSBvbWFwX3VzYl9pbml0LAogCS5wb3dlcl9vbgk9IG9tYXBfdXNiX3Bvd2VyX29uLAogCS5wb3dlcl9vZmYJPSBvbWFwX3VzYl9wb3dlcl9vZmYsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfcGh5X2RhdGEgb21hcF91c2IyX2RhdGEgPSB7CisJLmxhYmVsID0gIm9tYXBfdXNiMiIsCisJLmZsYWdzID0gT01BUF9VU0IyX0hBU19TVEFSVF9TUlAgfCBPTUFQX1VTQjJfSEFTX1NFVF9WQlVTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfcGh5X2RhdGEgb21hcDVfdXNiMl9kYXRhID0geworCS5sYWJlbCA9ICJvbWFwNV91c2IyIiwKKwkuZmxhZ3MgPSAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfcGh5X2RhdGEgZHJhN3hfdXNiMl9kYXRhID0geworCS5sYWJlbCA9ICJkcmE3eF91c2IyIiwKKwkuZmxhZ3MgPSBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9waHlfZGF0YSBhbTQzN3hfdXNiMl9kYXRhID0geworCS5sYWJlbCA9ICJhbTQzN3hfdXNiMiIsCisJLmZsYWdzID0gIDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvbWFwX3VzYjJfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMiIsCisJCS5kYXRhID0gJm9tYXBfdXNiMl9kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNS11c2IyIiwKKwkJLmRhdGEgPSAmb21hcDVfdXNiMl9kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxkcmE3eC11c2IyIiwKKwkJLmRhdGEgPSAmZHJhN3hfdXNiMl9kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxhbTQzN3gtdXNiMiIsCisJCS5kYXRhID0gJmFtNDM3eF91c2IyX2RhdGEsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvbWFwX3VzYjJfaWRfdGFibGUpOworI2VuZGlmCisKIHN0YXRpYyBpbnQgb21hcF91c2IyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXBfdXNiCSpwaHk7CiAJc3RydWN0IHBoeSAqZ2VuZXJpY19waHk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOwogCXN0cnVjdCB1c2Jfb3RnICpvdGc7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sX25vZGU7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29udHJvbF9wZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXN0cnVjdCB1c2JfcGh5X2RhdGEgKnBoeV9kYXRhOwogCi0JaWYgKCFub2RlKQorCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihvbWFwX3VzYjJfaWRfdGFibGUpLCAmcGRldi0+ZGV2KTsKKworCWlmICghb2ZfaWQpCiAJCXJldHVybiAtRUlOVkFMOwogCisJcGh5X2RhdGEgPSAoc3RydWN0IHVzYl9waHlfZGF0YSAqKW9mX2lkLT5kYXRhOworCiAJcGh5ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGh5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaHkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVVNCMiBQSFlcbiIpOwpAQCAtMTcyLDExICsyMjYsMTggQEAKIAlwaHktPmRldgkJPSAmcGRldi0+ZGV2OwogCiAJcGh5LT5waHkuZGV2CQk9IHBoeS0+ZGV2OwotCXBoeS0+cGh5LmxhYmVsCQk9ICJvbWFwLXVzYjIiOwotCXBoeS0+cGh5LnNldF9zdXNwZW5kCT0gb21hcF91c2IyX3N1c3BlbmQ7CisJcGh5LT5waHkubGFiZWwJCT0gcGh5X2RhdGEtPmxhYmVsOwogCXBoeS0+cGh5Lm90ZwkJPSBvdGc7CiAJcGh5LT5waHkudHlwZQkJPSBVU0JfUEhZX1RZUEVfVVNCMjsKIAorCWlmIChwaHlfZGF0YS0+ZmxhZ3MgJiBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1QpIHsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwkJcGh5LT5waHlfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCQlpZiAoIXBoeS0+cGh5X2Jhc2UpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcGh5LT5mbGFncyB8PSBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1Q7CisJfQorCiAJY29udHJvbF9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAiY3RybC1tb2R1bGUiLCAwKTsKIAlpZiAoIWNvbnRyb2xfbm9kZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNvbnRyb2wgZGV2aWNlIHBoYW5kbGVcbiIpOwpAQCAtMTkwLDE0ICsyNTEsMTQgQEAKIAl9CiAKIAlwaHktPmNvbnRyb2xfZGV2ID0gJmNvbnRyb2xfcGRldi0+ZGV2OwotCi0JcGh5LT5pc19zdXNwZW5kZWQJPSAxOwotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOworCW9tYXBfY29udHJvbF9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMCk7CiAKIAlvdGctPnNldF9ob3N0CQk9IG9tYXBfdXNiX3NldF9ob3N0OwogCW90Zy0+c2V0X3BlcmlwaGVyYWwJPSBvbWFwX3VzYl9zZXRfcGVyaXBoZXJhbDsKLQlvdGctPnNldF92YnVzCQk9IG9tYXBfdXNiX3NldF92YnVzOwotCW90Zy0+c3RhcnRfc3JwCQk9IG9tYXBfdXNiX3N0YXJ0X3NycDsKKwlpZiAocGh5X2RhdGEtPmZsYWdzICYgT01BUF9VU0IyX0hBU19TRVRfVkJVUykKKwkJb3RnLT5zZXRfdmJ1cwkJPSBvbWFwX3VzYl9zZXRfdmJ1czsKKwlpZiAocGh5X2RhdGEtPmZsYWdzICYgT01BUF9VU0IyX0hBU19TVEFSVF9TUlApCisJCW90Zy0+c3RhcnRfc3JwCQk9IG9tYXBfdXNiX3N0YXJ0X3NycDsKIAlvdGctPnBoeQkJPSAmcGh5LT5waHk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwaHkpOwpAQCAtMjk3LDE0ICszNTgsNiBAQAogI2RlZmluZSBERVZfUE1fT1BTICAgICBOVUxMCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF91c2IyX2lkX3RhYmxlW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjIiIH0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvbWFwX3VzYjJfaWRfdGFibGUpOwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfdXNiMl9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG9tYXBfdXNiMl9wcm9iZSwKIAkucmVtb3ZlCQk9IG9tYXBfdXNiMl9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktc2Ftc3VuZy11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktc2Ftc3VuZy11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4YzZiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuYwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogS2FtaWwgRGVic2tpIDxrLmRlYnNraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAicGh5LXNhbXN1bmctdXNiMi5oIgorCitzdGF0aWMgaW50IHNhbXN1bmdfdXNiMl9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJaW50IHJldDsKKworCWRldl9kYmcoZHJ2LT5kZXYsICJSZXF1ZXN0IHRvIHBvd2VyX29uIFwiJXNcIiB1c2IgcGh5XG4iLAorCQlpbnN0LT5jZmctPmxhYmVsKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX21haW5fY2xrOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkcnYtPnJlZl9jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2luc3RhbmNlX2NsazsKKwlpZiAoaW5zdC0+Y2ZnLT5wb3dlcl9vbikgeworCQlzcGluX2xvY2soJmRydi0+bG9jayk7CisJCXJldCA9IGluc3QtPmNmZy0+cG93ZXJfb24oaW5zdCk7CisJCXNwaW5fdW5sb2NrKCZkcnYtPmxvY2spOworCX0KKworCXJldHVybiAwOworCitlcnJfaW5zdGFuY2VfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmNsayk7CitlcnJfbWFpbl9jbGs6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzYW1zdW5nX3VzYjJfcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoZHJ2LT5kZXYsICJSZXF1ZXN0IHRvIHBvd2VyX29mZiBcIiVzXCIgdXNiIHBoeVxuIiwKKwkJaW5zdC0+Y2ZnLT5sYWJlbCk7CisJaWYgKGluc3QtPmNmZy0+cG93ZXJfb2ZmKSB7CisJCXNwaW5fbG9jaygmZHJ2LT5sb2NrKTsKKwkJcmV0ID0gaW5zdC0+Y2ZnLT5wb3dlcl9vZmYoaW5zdCk7CisJCXNwaW5fdW5sb2NrKCZkcnYtPmxvY2spOworCX0KKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5yZWZfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5jbGspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X29wcyBzYW1zdW5nX3VzYjJfcGh5X29wcyA9IHsKKwkucG93ZXJfb24JPSBzYW1zdW5nX3VzYjJfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSBzYW1zdW5nX3VzYjJfcGh5X3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHBoeSAqc2Ftc3VuZ191c2IyX3BoeV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnY7CisKKwlkcnYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoIWRydikKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpZiAoV0FSTl9PTihhcmdzLT5hcmdzWzBdID49IGRydi0+Y2ZnLT5udW1fcGh5cykpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJcmV0dXJuIGRydi0+aW5zdGFuY2VzW2FyZ3MtPmFyZ3NbMF1dLnBoeTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2Ftc3VuZ191c2IyX3BoeV9vZl9tYXRjaFtdID0geworI2lmZGVmIENPTkZJR19QSFlfRVhZTk9TNDIxMF9VU0IyCisJeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTAtdXNiMi1waHkiLAorCQkuZGF0YSA9ICZleHlub3M0MjEwX3VzYjJfcGh5X2NvbmZpZywKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BIWV9FWFlOT1M0WDEyX1VTQjIKKwl7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNHgxMi11c2IyLXBoeSIsCisJCS5kYXRhID0gJmV4eW5vczR4MTJfdXNiMl9waHlfY29uZmlnLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEhZX0VYWU5PUzUyNTBfVVNCMgorCXsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjUwLXVzYjItcGh5IiwKKwkJLmRhdGEgPSAmZXh5bm9zNTI1MF91c2IyX3BoeV9jb25maWcsCisJfSwKKyNlbmRpZgorCXsgfSwKK307CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ191c2IyX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyAqY2ZnOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2OworCWludCBpLCByZXQ7CisKKwlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiVGhpcyBkcml2ZXIgaXMgcmVxdWlyZWQgdG8gYmUgaW5zdGFudGlhdGVkIGZyb20gZGV2aWNlIHRyZWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXRjaCA9IG9mX21hdGNoX25vZGUoc2Ftc3VuZ191c2IyX3BoeV9vZl9tYXRjaCwgcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmICghbWF0Y2gpIHsKKwkJZGV2X2VycihkZXYsICJvZl9tYXRjaF9ub2RlKCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNmZyA9IG1hdGNoLT5kYXRhOworCisJZHJ2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlcikgKworCQljZmctPm51bV9waHlzICogc2l6ZW9mKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZHJ2KTsKKwlzcGluX2xvY2tfaW5pdCgmZHJ2LT5sb2NrKTsKKworCWRydi0+Y2ZnID0gY2ZnOworCWRydi0+ZGV2ID0gZGV2OworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlkcnYtPnJlZ19waHkgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCBtZW0pOworCWlmIChJU19FUlIoZHJ2LT5yZWdfcGh5KSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgcmVnaXN0ZXIgbWVtb3J5IChwaHkpXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5yZWdfcGh5KTsKKwl9CisKKwlkcnYtPnJlZ19wbXUgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkic2Ftc3VuZyxwbXVyZWctcGhhbmRsZSIpOworCWlmIChJU19FUlIoZHJ2LT5yZWdfcG11KSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgUE1VIHJlZ2lzdGVycyAodmlhIHN5c2NvbilcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkcnYtPnJlZ19wbXUpOworCX0KKworCWlmIChkcnYtPmNmZy0+aGFzX21vZGVfc3dpdGNoKSB7CisJCWRydi0+cmVnX3N5cyA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUoCisJCQkJcGRldi0+ZGV2Lm9mX25vZGUsICJzYW1zdW5nLHN5c3JlZy1waGFuZGxlIik7CisJCWlmIChJU19FUlIoZHJ2LT5yZWdfc3lzKSkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIHN5c3RlbSByZWdpc3RlcnMgKHZpYSBzeXNjb24pXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKGRydi0+cmVnX3N5cyk7CisJCX0KKwl9CisKKwlkcnYtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJwaHkiKTsKKwlpZiAoSVNfRVJSKGRydi0+Y2xrKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgY2xvY2sgb2YgcGh5IGNvbnRyb2xsZXJcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkcnYtPmNsayk7CisJfQorCisJZHJ2LT5yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZiIpOworCWlmIChJU19FUlIoZHJ2LT5yZWZfY2xrKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgcmVmZXJlbmNlIGNsb2NrIGZvciB0aGUgcGh5IGNvbnRyb2xsZXJcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkcnYtPnJlZl9jbGspOworCX0KKworCWRydi0+cmVmX3JhdGUgPSBjbGtfZ2V0X3JhdGUoZHJ2LT5yZWZfY2xrKTsKKwlpZiAoZHJ2LT5jZmctPnJhdGVfdG9fY2xrKSB7CisJCXJldCA9IGRydi0+Y2ZnLT5yYXRlX3RvX2NsayhkcnYtPnJlZl9yYXRlLCAmZHJ2LT5yZWZfcmVnX3ZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkcnYtPmNmZy0+bnVtX3BoeXM7IGkrKykgeworCQljaGFyICpsYWJlbCA9IGRydi0+Y2ZnLT5waHlzW2ldLmxhYmVsOworCQlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqcCA9ICZkcnYtPmluc3RhbmNlc1tpXTsKKworCQlkZXZfZGJnKGRldiwgIkNyZWF0aW5nIHBoeSBcIiVzXCJcbiIsIGxhYmVsKTsKKwkJcC0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgJnNhbXN1bmdfdXNiMl9waHlfb3BzLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwLT5waHkpKSB7CisJCQlkZXZfZXJyKGRydi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSB1c2IyX3BoeSBcIiVzXCJcbiIsCisJCQkJbGFiZWwpOworCQkJcmV0dXJuIFBUUl9FUlIocC0+cGh5KTsKKwkJfQorCisJCXAtPmNmZyA9ICZkcnYtPmNmZy0+cGh5c1tpXTsKKwkJcC0+ZHJ2ID0gZHJ2OworCQlwaHlfc2V0X2J1c193aWR0aChwLT5waHksIDgpOworCQlwaHlfc2V0X2RydmRhdGEocC0+cGh5LCBwKTsKKwl9CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsCisJCQkJCQkJc2Ftc3VuZ191c2IyX3BoeV94bGF0ZSk7CisJaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKSB7CisJCWRldl9lcnIoZHJ2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcGh5IHByb3ZpZGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgPSB7CisJLnByb2JlCT0gc2Ftc3VuZ191c2IyX3BoeV9wcm9iZSwKKwkuZHJpdmVyID0geworCQkub2ZfbWF0Y2hfdGFibGUJPSBzYW1zdW5nX3VzYjJfcGh5X29mX21hdGNoLAorCQkubmFtZQkJPSAic2Ftc3VuZy11c2IyLXBoeSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTNVAvRVhZTk9TIFNvQyBVU0IgUEhZIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiS2FtaWwgRGVic2tpIDxrLmRlYnNraUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c2Ftc3VuZy11c2IyLXBoeSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5oIGIvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktc2Ftc3VuZy11c2IyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogS2FtaWwgRGVic2tpIDxrLmRlYnNraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1BIWV9FWFlOT1NfVVNCMl9ICisjZGVmaW5lIF9QSFlfRVhZTk9TX1VTQjJfSAorCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgS0haIDEwMDAKKyNkZWZpbmUgTUhaIChLSFogKiBLSFopCisKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlcjsKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlOworc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnOworCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSB7CisJY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9jb21tb25fcGh5ICpjZmc7CisJc3RydWN0IHBoeSAqcGh5OworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2OworCWJvb2wgZW5hYmxlZDsKK307CisKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciB7CisJY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnICpjZmc7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGsgKnJlZl9jbGs7CisJdW5zaWduZWQgbG9uZyByZWZfcmF0ZTsKKwl1MzIgcmVmX3JlZ192YWw7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqcmVnX3BoeTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfcG11OworCXN0cnVjdCByZWdtYXAgKnJlZ19zeXM7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlIGluc3RhbmNlc1swXTsKK307CisKK3N0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSB7CisJaW50ICgqcG93ZXJfb24pKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICopOworCWludCAoKnBvd2VyX29mZikoc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKik7CisJdW5zaWduZWQgaW50IGlkOworCWNoYXIgKmxhYmVsOworfTsKKworCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgeworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSAqcGh5czsKKwlpbnQgKCpyYXRlX3RvX2NsaykodW5zaWduZWQgbG9uZywgdTMyICopOworCXVuc2lnbmVkIGludCBudW1fcGh5czsKKwlib29sIGhhc19tb2RlX3N3aXRjaDsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWc7CitleHRlcm4gY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczR4MTJfdXNiMl9waHlfY29uZmlnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M1MjUwX3VzYjJfcGh5X2NvbmZpZzsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTZjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktc3VuNGktdXNiLmMKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBBbGx3aW5uZXIgc3VuNGkgVVNCIHBoeSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZyb20KKyAqIEFsbHdpbm5lciBUZWNobm9sb2d5IENvLiwgTHRkLiA8d3d3LmFsbHdpbm5lcnRlY2guY29tPgorICoKKyAqIE1vZGVsbGVkIGFmdGVyOiBTYW1zdW5nIFM1UC9FWFlOT1MgU29DIHNlcmllcyBNSVBJIENTSVMvRFNJTSBEUEhZIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IFN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKworI2RlZmluZSBSRUdfSVNDUgkJCTB4MDAKKyNkZWZpbmUgUkVHX1BIWUNUTAkJCTB4MDQKKyNkZWZpbmUgUkVHX1BIWUJJU1QJCQkweDA4CisjZGVmaW5lIFJFR19QSFlUVU5FCQkJMHgwYworCisjZGVmaW5lIFBIWUNUTF9EQVRBCQkJQklUKDcpCisKKyNkZWZpbmUgU1VOWElfQUhCX0lDSFI4X0VOCQlCSVQoMTApCisjZGVmaW5lIFNVTlhJX0FIQl9JTkNSNF9CVVJTVF9FTglCSVQoOSkKKyNkZWZpbmUgU1VOWElfQUhCX0lOQ1JYX0FMSUdOX0VOCUJJVCg4KQorI2RlZmluZSBTVU5YSV9VTFBJX0JZUEFTU19FTgkJQklUKDApCisKKy8qIENvbW1vbiBDb250cm9sIEJpdHMgZm9yIEJvdGggUEhZcyAqLworI2RlZmluZSBQSFlfUExMX0JXCQkJMHgwMworI2RlZmluZSBQSFlfUkVTNDVfQ0FMX0VOCQkweDBjCisKKy8qIFByaXZhdGUgQ29udHJvbCBCaXRzIGZvciBFYWNoIFBIWSAqLworI2RlZmluZSBQSFlfVFhfQU1QTElUVURFX1RVTkUJCTB4MjAKKyNkZWZpbmUgUEhZX1RYX1NMRVdSQVRFX1RVTkUJCTB4MjIKKyNkZWZpbmUgUEhZX1ZCVVNWQUxJRF9USF9TRUwJCTB4MjUKKyNkZWZpbmUgUEhZX1BVTExVUF9SRVNfU0VMCQkweDI3CisjZGVmaW5lIFBIWV9PVEdfRlVOQ19FTgkJCTB4MjgKKyNkZWZpbmUgUEhZX1ZCVVNfREVUX0VOCQkJMHgyOQorI2RlZmluZSBQSFlfRElTQ09OX1RIX1NFTAkJMHgyYQorCisjZGVmaW5lIE1BWF9QSFlTCQkJMworCitzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhIHsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlpbnQgbnVtX3BoeXM7CisJdTMyIGRpc2NfdGhyZXNoOworCXN0cnVjdCBzdW40aV91c2JfcGh5IHsKKwkJc3RydWN0IHBoeSAqcGh5OworCQl2b2lkIF9faW9tZW0gKnBtdTsKKwkJc3RydWN0IHJlZ3VsYXRvciAqdmJ1czsKKwkJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0OworCQlpbnQgaW5kZXg7CisJfSBwaHlzW01BWF9QSFlTXTsKK307CisKKyNkZWZpbmUgdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSkgXAorCWNvbnRhaW5lcl9vZigocGh5KSwgc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSwgcGh5c1socGh5KS0+aW5kZXhdKQorCitzdGF0aWMgdm9pZCBzdW40aV91c2JfcGh5X3dyaXRlKHN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHksIHUzMiBhZGRyLCB1MzIgZGF0YSwKKwkJCQlpbnQgbGVuKQoreworCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKnBoeV9kYXRhID0gdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSk7CisJdTMyIHRlbXAsIHVzYmNfYml0ID0gQklUKHBoeS0+aW5kZXggKiAyKTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnBoeV9kYXRhLT5tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdGVtcCA9IHJlYWRsKHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisKKwkJLyogY2xlYXIgdGhlIGFkZHJlc3MgcG9ydGlvbiAqLworCQl0ZW1wICY9IH4oMHhmZiA8PCA4KTsKKworCQkvKiBzZXQgdGhlIGFkZHJlc3MgKi8KKwkJdGVtcCB8PSAoKGFkZHIgKyBpKSA8PCA4KTsKKwkJd3JpdGVsKHRlbXAsIHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisKKwkJLyogc2V0IHRoZSBkYXRhIGJpdCBhbmQgY2xlYXIgdXNiYyBiaXQqLworCQl0ZW1wID0gcmVhZGIocGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKwkJaWYgKGRhdGEgJiAweDEpCisJCQl0ZW1wIHw9IFBIWUNUTF9EQVRBOworCQllbHNlCisJCQl0ZW1wICY9IH5QSFlDVExfREFUQTsKKwkJdGVtcCAmPSB+dXNiY19iaXQ7CisJCXdyaXRlYih0ZW1wLCBwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCisJCS8qIHB1bHNlIHVzYmNfYml0ICovCisJCXRlbXAgPSByZWFkYihwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCQl0ZW1wIHw9IHVzYmNfYml0OworCQl3cml0ZWIodGVtcCwgcGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKworCQl0ZW1wID0gcmVhZGIocGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKwkJdGVtcCAmPSB+dXNiY19iaXQ7CisJCXdyaXRlYih0ZW1wLCBwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCisJCWRhdGEgPj49IDE7CisJfQorCW11dGV4X3VubG9jaygmcGh5X2RhdGEtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgc3VuNGlfdXNiX3BoeV9wYXNzYnkoc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSwgaW50IGVuYWJsZSkKK3sKKwl1MzIgYml0cywgcmVnX3ZhbHVlOworCisJaWYgKCFwaHktPnBtdSkKKwkJcmV0dXJuOworCisJYml0cyA9IFNVTlhJX0FIQl9JQ0hSOF9FTiB8IFNVTlhJX0FIQl9JTkNSNF9CVVJTVF9FTiB8CisJCVNVTlhJX0FIQl9JTkNSWF9BTElHTl9FTiB8IFNVTlhJX1VMUElfQllQQVNTX0VOOworCisJcmVnX3ZhbHVlID0gcmVhZGwocGh5LT5wbXUpOworCisJaWYgKGVuYWJsZSkKKwkJcmVnX3ZhbHVlIHw9IGJpdHM7CisJZWxzZQorCQlyZWdfdmFsdWUgJj0gfmJpdHM7CisKKwl3cml0ZWwocmVnX3ZhbHVlLCBwaHktPnBtdSk7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeV9pbml0KHN0cnVjdCBwaHkgKl9waHkpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhID0gdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSk7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHBoeS0+cmVzZXQpOworCWlmIChyZXQpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhdGEtPmNsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQWRqdXN0IFBIWSdzIG1hZ25pdHVkZSBhbmQgcmF0ZSAqLworCXN1bjRpX3VzYl9waHlfd3JpdGUocGh5LCBQSFlfVFhfQU1QTElUVURFX1RVTkUsIDB4MTQsIDUpOworCisJLyogRGlzY29ubmVjdCB0aHJlc2hvbGQgYWRqdXN0bWVudCAqLworCXN1bjRpX3VzYl9waHlfd3JpdGUocGh5LCBQSFlfRElTQ09OX1RIX1NFTCwgZGF0YS0+ZGlzY190aHJlc2gsIDIpOworCisJc3VuNGlfdXNiX3BoeV9wYXNzYnkocGh5LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHlfZXhpdChzdHJ1Y3QgcGh5ICpfcGh5KQoreworCXN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOworCisJc3VuNGlfdXNiX3BoeV9wYXNzYnkocGh5LCAwKTsKKwlyZXNldF9jb250cm9sX2Fzc2VydChwaHktPnJlc2V0KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YS0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqX3BoeSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOworCWludCByZXQgPSAwOworCisJaWYgKHBoeS0+dmJ1cykKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShwaHktPnZidXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpfcGh5KQoreworCXN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisKKwlpZiAocGh5LT52YnVzKQorCQlyZWd1bGF0b3JfZGlzYWJsZShwaHktPnZidXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X29wcyBzdW40aV91c2JfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBzdW40aV91c2JfcGh5X2luaXQsCisJLmV4aXQJCT0gc3VuNGlfdXNiX3BoeV9leGl0LAorCS5wb3dlcl9vbgk9IHN1bjRpX3VzYl9waHlfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHN1bjRpX3VzYl9waHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5ICpzdW40aV91c2JfcGh5X3hsYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoV0FSTl9PTihhcmdzLT5hcmdzWzBdID09IDAgfHwgYXJncy0+YXJnc1swXSA+PSBkYXRhLT5udW1fcGh5cykpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJcmV0dXJuIGRhdGEtPnBoeXNbYXJncy0+YXJnc1swXV0ucGh5OworfQorCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwl2b2lkIF9faW9tZW0gKnBtdSA9IE5VTEw7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2YnVzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwaHkgKnBoeTsKKwljaGFyIG5hbWVbMTZdOworCWludCBpOworCisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZkYXRhLT5tdXRleCk7CisKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhbGx3aW5uZXIsc3VuNWktYTEzLXVzYi1waHkiKSkKKwkJZGF0YS0+bnVtX3BoeXMgPSAyOworCWVsc2UKKwkJZGF0YS0+bnVtX3BoeXMgPSAzOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYWxsd2lubmVyLHN1bjRpLWExMC11c2ItcGh5IikpCisJCWRhdGEtPmRpc2NfdGhyZXNoID0gMzsKKwllbHNlCisJCWRhdGEtPmRpc2NfdGhyZXNoID0gMjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJwaHlfY3RybCIpOworCWRhdGEtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoZGF0YS0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmJhc2UpOworCisJZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInVzYl9waHkiKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgZ2V0IHVzYl9waHkgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5jbGspOworCX0KKworCS8qIFNraXAgMCwgMCBpcyB0aGUgcGh5IGZvciBvdGcgd2hpY2ggaXMgbm90IHlldCBzdXBwb3J0ZWQuICovCisJZm9yIChpID0gMTsgaSA8IGRhdGEtPm51bV9waHlzOyBpKyspIHsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidXNiJWRfdmJ1cyIsIGkpOworCQl2YnVzID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGRldiwgbmFtZSk7CisJCWlmIChJU19FUlIodmJ1cykpIHsKKwkJCWlmIChQVFJfRVJSKHZidXMpID09IC1FUFJPQkVfREVGRVIpCisJCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCQl2YnVzID0gTlVMTDsKKwkJfQorCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInVzYiVkX3Jlc2V0IiwgaSk7CisJCXJlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsIG5hbWUpOworCQlpZiAoSVNfRVJSKHJlc2V0KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHJlc2V0ICVzXG4iLCBuYW1lKTsKKwkJCXJldHVybiBQVFJfRVJSKHJlc2V0KTsKKwkJfQorCisJCWlmIChpKSB7IC8qIE5vIHBtdSBmb3IgdXNiYzAgKi8KKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInBtdSVkIiwgaSk7CisJCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCisJCQkJCQkJSU9SRVNPVVJDRV9NRU0sIG5hbWUpOworCQkJcG11ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJCWlmIChJU19FUlIocG11KSkKKwkJCQlyZXR1cm4gUFRSX0VSUihwbXUpOworCQl9CisKKwkJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgJnN1bjRpX3VzYl9waHlfb3BzLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwaHkpKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZICVkXG4iLCBpKTsKKwkJCXJldHVybiBQVFJfRVJSKHBoeSk7CisJCX0KKworCQlkYXRhLT5waHlzW2ldLnBoeSA9IHBoeTsKKwkJZGF0YS0+cGh5c1tpXS5wbXUgPSBwbXU7CisJCWRhdGEtPnBoeXNbaV0udmJ1cyA9IHZidXM7CisJCWRhdGEtPnBoeXNbaV0ucmVzZXQgPSByZXNldDsKKwkJZGF0YS0+cGh5c1tpXS5pbmRleCA9IGk7CisJCXBoeV9zZXRfZHJ2ZGF0YShwaHksICZkYXRhLT5waHlzW2ldKTsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBkYXRhKTsKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIHN1bjRpX3VzYl9waHlfeGxhdGUpOworCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW40aV91c2JfcGh5X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXVzYi1waHkiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLXVzYi1waHkiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLXVzYi1waHkiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bjRpX3VzYl9waHlfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW40aV91c2JfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUJPSBzdW40aV91c2JfcGh5X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5vZl9tYXRjaF90YWJsZQk9IHN1bjRpX3VzYl9waHlfb2ZfbWF0Y2gsCisJCS5uYW1lICA9ICJzdW40aS11c2ItcGh5IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfQorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuNGlfdXNiX3BoeV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFsbHdpbm5lciBzdW40aSBVU0IgcGh5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS10aS1waXBlMy5jIGIvZHJpdmVycy9waHkvcGh5LXRpLXBpcGUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMzY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS10aS1waXBlMy5jCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogcGh5LXRpLXBpcGUzIC0gUElQRTMgUEhZIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF9jb250cm9sX3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNkZWZpbmUJUExMX1NUQVRVUwkJMHgwMDAwMDAwNAorI2RlZmluZQlQTExfR08JCQkweDAwMDAwMDA4CisjZGVmaW5lCVBMTF9DT05GSUdVUkFUSU9OMQkweDAwMDAwMDBDCisjZGVmaW5lCVBMTF9DT05GSUdVUkFUSU9OMgkweDAwMDAwMDEwCisjZGVmaW5lCVBMTF9DT05GSUdVUkFUSU9OMwkweDAwMDAwMDE0CisjZGVmaW5lCVBMTF9DT05GSUdVUkFUSU9ONAkweDAwMDAwMDIwCisKKyNkZWZpbmUJUExMX1JFR01fTUFTSwkJMHgwMDFGRkUwMAorI2RlZmluZQlQTExfUkVHTV9TSElGVAkJMHg5CisjZGVmaW5lCVBMTF9SRUdNX0ZfTUFTSwkJMHgwMDAzRkZGRgorI2RlZmluZQlQTExfUkVHTV9GX1NISUZUCTB4MAorI2RlZmluZQlQTExfUkVHTl9NQVNLCQkweDAwMDAwMUZFCisjZGVmaW5lCVBMTF9SRUdOX1NISUZUCQkweDEKKyNkZWZpbmUJUExMX1NFTEZSRVFEQ09fTUFTSwkweDAwMDAwMDBFCisjZGVmaW5lCVBMTF9TRUxGUkVRRENPX1NISUZUCTB4MQorI2RlZmluZQlQTExfU0RfTUFTSwkJMHgwMDAzRkMwMAorI2RlZmluZQlQTExfU0RfU0hJRlQJCTEwCisjZGVmaW5lCVNFVF9QTExfR08JCTB4MQorI2RlZmluZSBQTExfTERPUFdETgkJQklUKDE1KQorI2RlZmluZSBQTExfVElDT1BXRE4JCUJJVCgxNikKKyNkZWZpbmUJUExMX0xPQ0sJCTB4MgorI2RlZmluZQlQTExfSURMRQkJMHgxCisKKy8qCisgKiBUaGlzIGlzIGFuIEVtcGlyaWNhbCB2YWx1ZSB0aGF0IHdvcmtzLCBuZWVkIHRvIGNvbmZpcm0gdGhlIGFjdHVhbAorICogdmFsdWUgcmVxdWlyZWQgZm9yIHRoZSBQSVBFM1BIWV9QTExfQ09ORklHVVJBVElPTjIuUExMX0lETEUgc3RhdHVzCisgKiB0byBiZSBjb3JyZWN0bHkgcmVmbGVjdGVkIGluIHRoZSBQSVBFM1BIWV9QTExfU1RBVFVTIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFBMTF9JRExFX1RJTUUJMTAwCS8qIGluIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBQTExfTE9DS19USU1FCTEwMAkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKworc3RydWN0IHBpcGUzX2RwbGxfcGFyYW1zIHsKKwl1MTYJbTsKKwl1OAluOworCXU4CWZyZXE6MzsKKwl1OAlzZDsKKwl1MzIJbWY7Cit9OworCitzdHJ1Y3QgcGlwZTNfZHBsbF9tYXAgeworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwlzdHJ1Y3QgcGlwZTNfZHBsbF9wYXJhbXMgcGFyYW1zOworfTsKKworc3RydWN0IHRpX3BpcGUzIHsKKwl2b2lkIF9faW9tZW0JCSpwbGxfY3RybF9iYXNlOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGRldmljZQkJKmNvbnRyb2xfZGV2OworCXN0cnVjdCBjbGsJCSp3a3VwY2xrOworCXN0cnVjdCBjbGsJCSpzeXNfY2xrOworCXN0cnVjdCBjbGsJCSpyZWZjbGs7CisJc3RydWN0IHBpcGUzX2RwbGxfbWFwCSpkcGxsX21hcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGlwZTNfZHBsbF9tYXAgZHBsbF9tYXBfdXNiW10gPSB7CisJezEyMDAwMDAwLCB7MTI1MCwgNSwgNCwgMjAsIDB9IH0sCS8qIDEyIE1IeiAqLworCXsxNjgwMDAwMCwgezMxMjUsIDIwLCA0LCAyMCwgMH0gfSwJLyogMTYuOCBNSHogKi8KKwl7MTkyMDAwMDAsIHsxMTcyLCA4LCA0LCAyMCwgNjU1Mzd9IH0sCS8qIDE5LjIgTUh6ICovCisJezIwMDAwMDAwLCB7MTAwMCwgNywgNCwgMTAsIDB9IH0sCS8qIDIwIE1IeiAqLworCXsyNjAwMDAwMCwgezEyNTAsIDEyLCA0LCAyMCwgMH0gfSwJLyogMjYgTUh6ICovCisJezM4NDAwMDAwLCB7MzEyNSwgNDcsIDQsIDIwLCA5Mjg0M30gfSwJLyogMzguNCBNSHogKi8KKwl7IH0sCQkJCQkvKiBUZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgc3RydWN0IHBpcGUzX2RwbGxfbWFwIGRwbGxfbWFwX3NhdGFbXSA9IHsKKwl7MTIwMDAwMDAsIHsxMDAwLCA3LCA0LCA2LCAwfSB9LAkvKiAxMiBNSHogKi8KKwl7MTY4MDAwMDAsIHs3MTQsIDcsIDQsIDYsIDB9IH0sCQkvKiAxNi44IE1IeiAqLworCXsxOTIwMDAwMCwgezYyNSwgNywgNCwgNiwgMH0gfSwJCS8qIDE5LjIgTUh6ICovCisJezIwMDAwMDAwLCB7NjAwLCA3LCA0LCA2LCAwfSB9LAkJLyogMjAgTUh6ICovCisJezI2MDAwMDAwLCB7NDYxLCA3LCA0LCA2LCAwfSB9LAkJLyogMjYgTUh6ICovCisJezM4NDAwMDAwLCB7MzEyLCA3LCA0LCA2LCAwfSB9LAkJLyogMzguNCBNSHogKi8KKwl7IH0sCQkJCQkvKiBUZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgaW5saW5lIHUzMiB0aV9waXBlM19yZWFkbCh2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aV9waXBlM193cml0ZWwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsCisJdTMyIGRhdGEpCit7CisJX19yYXdfd3JpdGVsKGRhdGEsIGFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBpcGUzX2RwbGxfcGFyYW1zICp0aV9waXBlM19nZXRfZHBsbF9wYXJhbXMoc3RydWN0IHRpX3BpcGUzICpwaHkpCit7CisJdW5zaWduZWQgbG9uZyByYXRlOworCXN0cnVjdCBwaXBlM19kcGxsX21hcCAqZHBsbF9tYXAgPSBwaHktPmRwbGxfbWFwOworCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShwaHktPnN5c19jbGspOworCisJZm9yICg7IGRwbGxfbWFwLT5yYXRlOyBkcGxsX21hcCsrKSB7CisJCWlmIChyYXRlID09IGRwbGxfbWFwLT5yYXRlKQorCQkJcmV0dXJuICZkcGxsX21hcC0+cGFyYW1zOworCX0KKworCWRldl9lcnIocGh5LT5kZXYsICJObyBEUExMIGNvbmZpZ3VyYXRpb24gZm9yICVsdSBIeiBTWVMgQ0xLXG4iLCByYXRlKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICp4KQoreworCXN0cnVjdCB0aV9waXBlMyAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOworCisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX3Bvd2VyX29uKHN0cnVjdCBwaHkgKngpCit7CisJc3RydWN0IHRpX3BpcGUzICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CisKKwlvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlfcGlwZTNfZHBsbF93YWl0X2xvY2soc3RydWN0IHRpX3BpcGUzICpwaHkpCit7CisJdTMyCQl2YWw7CisJdW5zaWduZWQgbG9uZwl0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFBMTF9MT0NLX1RJTUUpOworCWRvIHsKKwkJY3B1X3JlbGF4KCk7CisJCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX1NUQVRVUyk7CisJCWlmICh2YWwgJiBQTExfTE9DSykKKwkJCWJyZWFrOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCWlmICghKHZhbCAmIFBMTF9MT0NLKSkgeworCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRFBMTCBmYWlsZWQgdG8gbG9ja1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlfcGlwZTNfZHBsbF9wcm9ncmFtKHN0cnVjdCB0aV9waXBlMyAqcGh5KQoreworCXUzMgkJCXZhbDsKKwlzdHJ1Y3QgcGlwZTNfZHBsbF9wYXJhbXMgKmRwbGxfcGFyYW1zOworCisJZHBsbF9wYXJhbXMgPSB0aV9waXBlM19nZXRfZHBsbF9wYXJhbXMocGh5KTsKKwlpZiAoIWRwbGxfcGFyYW1zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xKTsKKwl2YWwgJj0gflBMTF9SRUdOX01BU0s7CisJdmFsIHw9IGRwbGxfcGFyYW1zLT5uIDw8IFBMTF9SRUdOX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSwgdmFsKTsKKworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yKTsKKwl2YWwgJj0gflBMTF9TRUxGUkVRRENPX01BU0s7CisJdmFsIHw9IGRwbGxfcGFyYW1zLT5mcmVxIDw8IFBMTF9TRUxGUkVRRENPX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKKworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xKTsKKwl2YWwgJj0gflBMTF9SRUdNX01BU0s7CisJdmFsIHw9IGRwbGxfcGFyYW1zLT5tIDw8IFBMTF9SRUdNX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSwgdmFsKTsKKworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT040KTsKKwl2YWwgJj0gflBMTF9SRUdNX0ZfTUFTSzsKKwl2YWwgfD0gZHBsbF9wYXJhbXMtPm1mIDw8IFBMTF9SRUdNX0ZfU0hJRlQ7CisJdGlfcGlwZTNfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT040LCB2YWwpOworCisJdmFsID0gdGlfcGlwZTNfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjMpOworCXZhbCAmPSB+UExMX1NEX01BU0s7CisJdmFsIHw9IGRwbGxfcGFyYW1zLT5zZCA8PCBQTExfU0RfU0hJRlQ7CisJdGlfcGlwZTNfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04zLCB2YWwpOworCisJdGlfcGlwZTNfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0dPLCBTRVRfUExMX0dPKTsKKworCXJldHVybiB0aV9waXBlM19kcGxsX3dhaXRfbG9jayhwaHkpOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX2luaXQoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3QgdGlfcGlwZTMgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKwl1MzIgdmFsOworCWludCByZXQgPSAwOworCisJLyogQnJpbmcgaXQgb3V0IG9mIElETEUgaWYgaXQgaXMgSURMRSAqLworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yKTsKKwlpZiAodmFsICYgUExMX0lETEUpIHsKKwkJdmFsICY9IH5QTExfSURMRTsKKwkJdGlfcGlwZTNfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOworCQlyZXQgPSB0aV9waXBlM19kcGxsX3dhaXRfbG9jayhwaHkpOworCX0KKworCS8qIFByb2dyYW0gdGhlIERQTEwgb25seSBpZiBub3QgbG9ja2VkICovCisJdmFsID0gdGlfcGlwZTNfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfU1RBVFVTKTsKKwlpZiAoISh2YWwgJiBQTExfTE9DSykpCisJCWlmICh0aV9waXBlM19kcGxsX3Byb2dyYW0ocGh5KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19leGl0KHN0cnVjdCBwaHkgKngpCit7CisJc3RydWN0IHRpX3BpcGUzICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBTQVRBIERQTEwgY2FuJ3QgYmUgcG93ZXJlZCBkb3duIGR1ZSB0byBFcnJhdGEgaTc4MyAqLworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwaHktPmRldi0+b2Zfbm9kZSwgInRpLHBoeS1waXBlMy1zYXRhIikpCisJCXJldHVybiAwOworCisJLyogUHV0IERQTEwgaW4gSURMRSBtb2RlICovCisJdmFsID0gdGlfcGlwZTNfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIpOworCXZhbCB8PSBQTExfSURMRTsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIsIHZhbCk7CisKKwkvKiB3YWl0IGZvciBMRE8gYW5kIE9zY2lsbGF0b3IgdG8gcG93ZXIgZG93biAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhQTExfSURMRV9USU1FKTsKKwlkbyB7CisJCWNwdV9yZWxheCgpOworCQl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOworCQlpZiAoKHZhbCAmIFBMTF9USUNPUFdETikgJiYgKHZhbCAmIFBMTF9MRE9QV0ROKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCWlmICghKHZhbCAmIFBMTF9USUNPUFdETikgfHwgISh2YWwgJiBQTExfTERPUFdETikpIHsKKwkJZGV2X2VycihwaHktPmRldiwgIkZhaWxlZCB0byBwb3dlciBkb3duOiBQTExfU1RBVFVTIDB4JXhcbiIsCisJCQl2YWwpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorc3RhdGljIHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKKwkuaW5pdAkJPSB0aV9waXBlM19pbml0LAorCS5leGl0CQk9IHRpX3BpcGUzX2V4aXQsCisJLnBvd2VyX29uCT0gdGlfcGlwZTNfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHRpX3BpcGUzX3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0aV9waXBlM19pZF90YWJsZVtdOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGlfcGlwZTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdGlfcGlwZTMgKnBoeTsKKwlzdHJ1Y3QgcGh5ICpnZW5lcmljX3BoeTsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sX25vZGU7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29udHJvbF9wZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKHRpX3BpcGUzX2lkX3RhYmxlKSwgJnBkZXYtPmRldik7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwaHkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwaHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoeSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2MgbWVtIGZvciBUSSBQSVBFMyBQSFlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwaHktPmRwbGxfbWFwID0gKHN0cnVjdCBwaXBlM19kcGxsX21hcCAqKW1hdGNoLT5kYXRhOworCWlmICghcGh5LT5kcGxsX21hcCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBEUExMIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAicGxsX2N0cmwiKTsKKwlwaHktPnBsbF9jdHJsX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBoeS0+cGxsX2N0cmxfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBoeS0+cGxsX2N0cmxfYmFzZSk7CisKKwlwaHktPmRldgkJPSAmcGRldi0+ZGV2OworCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAidGkscGh5LXBpcGUzLXNhdGEiKSkgeworCisJCXBoeS0+d2t1cGNsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgIndrdXBjbGsiKTsKKwkJaWYgKElTX0VSUihwaHktPndrdXBjbGspKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHdrdXBjbGtcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIocGh5LT53a3VwY2xrKTsKKwkJfQorCisJCXBoeS0+cmVmY2xrID0gZGV2bV9jbGtfZ2V0KHBoeS0+ZGV2LCAicmVmY2xrIik7CisJCWlmIChJU19FUlIocGh5LT5yZWZjbGspKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHJlZmNsa1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihwaHktPnJlZmNsayk7CisJCX0KKwl9IGVsc2UgeworCQlwaHktPndrdXBjbGsgPSBFUlJfUFRSKC1FTk9ERVYpOworCQlwaHktPnJlZmNsayA9IEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJcGh5LT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KHBoeS0+ZGV2LCAic3lzY2xrIik7CisJaWYgKElTX0VSUihwaHktPnN5c19jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgc3lzY2xrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29udHJvbF9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAiY3RybC1tb2R1bGUiLCAwKTsKKwlpZiAoIWNvbnRyb2xfbm9kZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNvbnRyb2wgZGV2aWNlIHBoYW5kbGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb250cm9sX3BkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGNvbnRyb2xfbm9kZSk7CisJaWYgKCFjb250cm9sX3BkZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBoeS0+Y29udHJvbF9kZXYgPSAmY29udHJvbF9wZGV2LT5kZXY7CisKKwlvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGh5KTsKKwlwbV9ydW50aW1lX2VuYWJsZShwaHktPmRldik7CisKKwlnZW5lcmljX3BoeSA9IGRldm1fcGh5X2NyZWF0ZShwaHktPmRldiwgJm9wcywgTlVMTCk7CisJaWYgKElTX0VSUihnZW5lcmljX3BoeSkpCisJCXJldHVybiBQVFJfRVJSKGdlbmVyaWNfcGh5KTsKKworCXBoeV9zZXRfZHJ2ZGF0YShnZW5lcmljX3BoeSwgcGh5KTsKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihwaHktPmRldiwKKwkJCW9mX3BoeV9zaW1wbGVfeGxhdGUpOworCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKworCXBtX3J1bnRpbWVfZ2V0KCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlfcGlwZTNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZCgmcGRldi0+ZGV2KSkKKwkJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCitzdGF0aWMgaW50IHRpX3BpcGUzX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRpX3BpcGUzCSpwaHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghSVNfRVJSKHBoeS0+d2t1cGNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwaHktPndrdXBjbGspOworCWlmICghSVNfRVJSKHBoeS0+cmVmY2xrKSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBoeS0+cmVmY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MzIgcmV0ID0gMDsKKwlzdHJ1Y3QgdGlfcGlwZTMJKnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFJU19FUlIocGh5LT5yZWZjbGspKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwaHktPnJlZmNsayk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHJlZmNsayAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCWlmICghSVNfRVJSKHBoeS0+d2t1cGNsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBoeS0+d2t1cGNsayk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHdrdXBjbGsgJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycjI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwlpZiAoIUlTX0VSUihwaHktPnJlZmNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwaHktPnJlZmNsayk7CisKK2VycjE6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRpX3BpcGUzX3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFModGlfcGlwZTNfcnVudGltZV9zdXNwZW5kLAorCQkJICAgdGlfcGlwZTNfcnVudGltZV9yZXN1bWUsIE5VTEwpCit9OworCisjZGVmaW5lIERFVl9QTV9PUFMgICAgICgmdGlfcGlwZTNfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgREVWX1BNX09QUyAgICAgTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRpX3BpcGUzX2lkX3RhYmxlW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxwaHktdXNiMyIsCisJCS5kYXRhID0gZHBsbF9tYXBfdXNiLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjMiLAorCQkuZGF0YSA9IGRwbGxfbWFwX3VzYiwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGkscGh5LXBpcGUzLXNhdGEiLAorCQkuZGF0YSA9IGRwbGxfbWFwX3NhdGEsCisJfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRpX3BpcGUzX2lkX3RhYmxlKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aV9waXBlM19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHRpX3BpcGUzX3Byb2JlLAorCS5yZW1vdmUJCT0gdGlfcGlwZTNfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ0aS1waXBlMyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSBERVZfUE1fT1BTLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIodGlfcGlwZTNfaWRfdGFibGUpLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRpX3BpcGUzX2RyaXZlcik7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06IHRpX3BpcGUzIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIFBJUEUzIHBoeSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKaW5kZXggYzNhY2UxZC4uMmUwZTliMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCQlkZXZfZXJyKHR3bC0+ZGV2LCAidW5zdXBwb3J0ZWQgVDIgdHJhbnNjZWl2ZXIgbW9kZSAlZFxuIiwKIAkJCQltb2RlKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHR3bDQwMzBfaTJjX2FjY2VzcyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IG9uKQpAQCAtNjYxLDcgKzY2MSw3IEBACiAJc3RydWN0IHBoeV9wcm92aWRlcgkqcGh5X3Byb3ZpZGVyOwogCXN0cnVjdCBwaHlfaW5pdF9kYXRhCSppbml0X2RhdGEgPSBOVUxMOwogCi0JdHdsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZiAqdHdsLCBHRlBfS0VSTkVMKTsKKwl0d2wgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp0d2wpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXR3bCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTY3Niw3ICs2NzYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlvdGcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mICpvdGcsIEdGUF9LRVJORUwpOworCW90ZyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm90ZyksIEdGUF9LRVJORUwpOwogCWlmICghb3RnKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXhnZW5lLmMgYi9kcml2ZXJzL3BoeS9waHkteGdlbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWExY2NkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS14Z2VuZS5jCkBAIC0wLDAgKzEsMTc1MCBAQAorLyoKKyAqIEFwcGxpZWRNaWNybyBYLUdlbmUgTXVsdGktcHVycG9zZSBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IExvYyBIbyA8bGhvQGFwbS5jb20+CisgKiAgICAgICAgIFR1YW4gUGhhbiA8dHBoYW5AYXBtLmNvbT4KKyAqICAgICAgICAgU3VtYW4gVHJpcGF0aGkgPHN0cmlwYXRoaUBhcG0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIEFQTSBYLUdlbmUgUEhZIGNvbnNpc3RzIG9mIHR3byBQTEwgY2xvY2sgbWFjcm8ncyAoQ01VKSBhbmQgbGFuZXMuCisgKiBUaGUgZmlyc3QgUExMIGNsb2NrIG1hY3JvIGlzIHVzZWQgZm9yIGludGVybmFsIHJlZmVyZW5jZSBjbG9jay4gVGhlIHNlY29uZAorICogUExMIGNsb2NrIG1hY3JvIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgUEhZLiBUaGlzIGRyaXZlcgorICogY29uZmlndXJlcyB0aGUgZmlyc3QgUExMIENNVSwgdGhlIHNlY29uZCBQTEwgQ01VLCBhbmQgcHJvZ3JhbXMgdGhlIFBIWSB0bworICogb3BlcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIG1vZGUgb2Ygb3BlcmF0aW9uLiBUaGUgZmlyc3QgUExMIENNVSBpcyBvbmx5CisgKiByZXF1aXJlZCBpZiBpbnRlcm5hbCBjbG9jayBpcyBlbmFibGVkLgorICoKKyAqIExvZ2ljYWwgTGF5ZXIgT3V0IE9mIEhXIG1vZHVsZSB1bml0czoKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLQorICogfCBJbnRlcm5hbCAgICAgIHwgICAgfC0tLS0tLXwKKyAqIHwgUmVmIFBMTCBDTVUgICB8LS0tLXwgICAgICB8ICAgICAtLS0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLQorICogLS0tLS0tLS0tLS0tIC0tLS0gICAgfCBNVVggIHwtLS0tLXxQSFkgUExMIENNVXwtLS0tfCBTZXJkZXN8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICAgfCAgICAtLS0tLS0tLS0KKyAqIEV4dGVybmFsIENsb2NrIC0tLS0tLXwgICAgICB8ICAgICAtLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tfAorICoKKyAqIFRoZSBSZWYgUExMIENNVSBDU1IgKENvbmZpZ3VyYXRpb24gU3lzdGVtIFJlZ2lzdGVycykgaXMgYWNjZXNzZWQKKyAqIGluZGlyZWN0bHkgZnJvbSB0aGUgU0RTIG9mZnNldCBhdCAweDIwMDAuIEl0IGlzIG9ubHkgcmVxdWlyZWQgZm9yCisgKiBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2suCisgKiBUaGUgUEhZIFBMTCBDTVUgQ1NSIGlzIGFjY2Vzc2VkIGluZGlyZWN0bHkgZnJvbSB0aGUgU0RTIG9mZnNldCBhdCAweDAwMDAuCisgKiBUaGUgU2VyZGVzIENTUiBpcyBhY2Nlc3NlZCBpbmRpcmVjdGx5IGZyb20gdGhlIFNEUyBvZmZzZXQgYXQgMHgwNDAwLgorICoKKyAqIFRoZSBSZWYgUExMIENNVSBjYW4gYmUgbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUgUEhZIElQIG9yIG91dHNpZGUgdGhlIFBIWSBJUAorICogZHVlIHRvIHNoYXJlZCBSZWYgUExMIENNVS4gRm9yIFBIWSB3aXRoIFJlZiBQTEwgQ01VIHNoYXJlZCB3aXRoIGFub3RoZXIgSVAsCisgKiBpdCBpcyBsb2NhdGVkIG91dHNpZGUgdGhlIFBIWSBJUC4gVGhpcyBpcyB0aGUgY2FzZSBmb3IgdGhlIFBIWSBsb2NhdGVkCisgKiBhdCAweDFmMjNhMDAwIChTQVRBIFBvcnQgNC81KS4gRm9yIHN1Y2ggUEhZLCBhbm90aGVyIHJlc291cmNlIGlzIHJlcXVpcmVkCisgKiB0byBsb2NhdGVkIHRoZSBTRFMvUmVmIFBMTCBDTVUgbW9kdWxlIGFuZCBpdHMgY2xvY2sgZm9yIHRoYXQgSVAgZW5hYmxlZC4KKyAqCisgKiBDdXJyZW50bHksIHRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgR2VuMyBTQVRBIG1vZGUgd2l0aCBleHRlcm5hbCBjbG9jay4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKy8qIE1heCAyIGxhbmVzIHBlciBhIFBIWSB1bml0ICovCisjZGVmaW5lIE1BWF9MQU5FCQkJMgorCisvKiBSZWdpc3RlciBvZmZzZXQgaW5zaWRlIHRoZSBQSFkgKi8KKyNkZWZpbmUgU0VSREVTX1BMTF9JTkRJUkVDVF9PRkZTRVQJMHgwMDAwCisjZGVmaW5lIFNFUkRFU19QTExfUkVGX0lORElSRUNUX09GRlNFVAkweDIwMDAKKyNkZWZpbmUgU0VSREVTX0lORElSRUNUX09GRlNFVAkJMHgwNDAwCisjZGVmaW5lIFNFUkRFU19MQU5FX1NUUklERQkJMHgwMjAwCisKKy8qIFNvbWUgZGVmYXVsdCBTZXJkZXMgcGFyYW1ldGVycyAqLworI2RlZmluZSBERUZBVUxUX1NBVEFfVFhCT09TVF9HQUlOCXsgMHgxZSwgMHgxZSwgMHgxZSB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9UWEVZRURJUkVDVElPTgl7IDB4MCwgMHgwLCAweDAgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhFWUVUVU5JTkcJeyAweGEsIDB4YSwgMHhhIH0KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1NQRF9TRUwJCXsgMHgxLCAweDMsIDB4NyB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9UWEFNUAkJeyAweDgsIDB4OCwgMHg4IH0KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYQ04xCQl7IDB4MiwgMHgyLCAweDIgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhDTjIJCXsgMHgwLCAweDAsIDB4MCB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9UWENQMQkJeyAweGEsIDB4YSwgMHhhIH0KKworI2RlZmluZSBTQVRBX1NQRF9TRUxfR0VOMwkJMHg3CisjZGVmaW5lIFNBVEFfU1BEX1NFTF9HRU4yCQkweDMKKyNkZWZpbmUgU0FUQV9TUERfU0VMX0dFTjEJCTB4MQorCisjZGVmaW5lIFNTQ19ESVNBQkxFCQkJMAorI2RlZmluZSBTU0NfRU5BQkxFCQkJMQorCisjZGVmaW5lIEZCRElWX1ZBTF81ME0JCQkweDc3CisjZGVmaW5lIFJFRkRJVl9WQUxfNTBNCQkJMHgxCisjZGVmaW5lIEZCRElWX1ZBTF8xMDBNCQkJMHgzQgorI2RlZmluZSBSRUZESVZfVkFMXzEwME0JCQkweDAKKworLyogU0FUQSBDbG9jay9SZXNldCBDU1IgKi8KKyNkZWZpbmUgU0FUQUNMS0VOUkVHCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgU0FUQTBfQ09SRV9DTEtFTgkJMHgwMDAwMDAwMgorI2RlZmluZSAgU0FUQTFfQ09SRV9DTEtFTgkJMHgwMDAwMDAwNAorI2RlZmluZSBTQVRBU1JFU0VUUkVHCQkJMHgwMDAwMDAwNAorI2RlZmluZSAgU0FUQV9NRU1fUkVTRVRfTUFTSwkJMHgwMDAwMDAyMAorI2RlZmluZSAgU0FUQV9NRU1fUkVTRVRfUkQoc3JjKQkJKCgoc3JjKSAmIDB4MDAwMDAwMjApID4+IDUpCisjZGVmaW5lICBTQVRBX1NEU19SRVNFVF9NQVNLCQkweDAwMDAwMDA0CisjZGVmaW5lICBTQVRBX0NTUl9SRVNFVF9NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lICBTQVRBX0NPUkVfUkVTRVRfTUFTSwkJMHgwMDAwMDAwMgorI2RlZmluZSAgU0FUQV9QTUNMS19SRVNFVF9NQVNLCQkweDAwMDAwMDEwCisjZGVmaW5lICBTQVRBX1BDTEtfUkVTRVRfTUFTSwkJMHgwMDAwMDAwOAorCisvKiBTRFMgQ1NSIHVzZWQgZm9yIFBIWSBJbmRpcmVjdCBhY2Nlc3MgKi8KKyNkZWZpbmUgU0FUQV9FTkVUX1NEU19QQ1NfQ1RMMAkJMHgwMDAwMDAwMAorI2RlZmluZSAgUkVHU1BFQ19DRkdfSV9UWF9XT1JETU9ERTBfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDA3MDAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE2KSAmIDB4MDAwNzAwMDApKQorI2RlZmluZSAgUkVHU1BFQ19DRkdfSV9SWF9XT1JETU9ERTBfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMGUwMDAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDIxKSAmIDB4MDBlMDAwMDApKQorI2RlZmluZSBTQVRBX0VORVRfU0RTX0NUTDAJCTB4MDAwMDAwMGMKKyNkZWZpbmUgIFJFR1NQRUNfQ0ZHX0lfQ1VTVE9NRVJfUElOX01PREUwX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDdmZmYpIHwgKCgodTMyKSAoc3JjKSkgJiAweDAwMDA3ZmZmKSkKKyNkZWZpbmUgU0FUQV9FTkVUX1NEU19DVEwxCQkweDAwMDAwMDEwCisjZGVmaW5lICBDRkdfSV9TUERfU0VMX0NEUl9PVlIxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMGYpIHwgKCgodTMyKSAoc3JjKSkgJiAweDAwMDAwMDBmKSkKKyNkZWZpbmUgU0FUQV9FTkVUX1NEU19SU1RfQ1RMCQkweDAwMDAwMDI0CisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfSU5EX0NNRF9SRUcJMHgwMDAwMDAzYworI2RlZmluZSAgQ0ZHX0lORF9XUl9DTURfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSAgQ0ZHX0lORF9SRF9DTURfTUFTSwkJMHgwMDAwMDAwMgorI2RlZmluZSAgQ0ZHX0lORF9DTURfRE9ORV9NQVNLCQkweDAwMDAwMDA0CisjZGVmaW5lICBDRkdfSU5EX0FERFJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDNmZmZmMCkgfCAoKCh1MzIpIChzcmMpIDw8IDQpICYgMHgwMDNmZmZmMCkpCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfSU5EX1JEQVRBX1JFRwkweDAwMDAwMDQwCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfSU5EX1dEQVRBX1JFRwkweDAwMDAwMDQ0CisjZGVmaW5lIFNBVEFfRU5FVF9DTEtfTUFDUk9fUkVHCQkweDAwMDAwMDRjCisjZGVmaW5lICBJX1JFU0VUX0JfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMSkgfCAoKCh1MzIpIChzcmMpKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSAgSV9QTExfRkJESVZfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDFmZjAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEyKSAmIDB4MDAxZmYwMDApKQorI2RlZmluZSAgSV9DVVNUT01FUk9WX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDBmODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDBmODApKQorI2RlZmluZSAgT19QTExfTE9DS19SRChzcmMpCQkoKChzcmMpICYgMHg0MDAwMDAwMCkgPj4gMzApCisjZGVmaW5lICBPX1BMTF9SRUFEWV9SRChzcmMpCQkoKChzcmMpICYgMHg4MDAwMDAwMCkgPj4gMzEpCisKKy8qIFBMTCBDbG9jayBNYWNybyBVbml0IChDTVUpIENTUiBhY2Nlc3NpbmcgZnJvbSBTRFMgaW5kaXJlY3RseSAqLworI2RlZmluZSBDTVVfUkVHMAkJCTB4MDAwMDAKKyNkZWZpbmUgIENNVV9SRUcwX1BMTF9SRUZfU0VMX01BU0sJMHgwMDAwMjAwMAorI2RlZmluZSAgQ01VX1JFRzBfUExMX1JFRl9TRUxfU0VUKGRzdCwgc3JjKQlcCisJCSgoKGRzdCkgJiB+MHgwMDAwMjAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEzKSAmIDB4MDAwMDIwMDApKQorI2RlZmluZSAgQ01VX1JFRzBfUERPV05fTUFTSwkJMHgwMDAwNDAwMAorI2RlZmluZSAgQ01VX1JFRzBfQ0FMX0NPVU5UX1JFU09MX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZTApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwZTApKQorI2RlZmluZSBDTVVfUkVHMQkJCTB4MDAwMDIKKyNkZWZpbmUgIENNVV9SRUcxX1BMTF9DUF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzYzAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTApICYgMHgwMDAwM2MwMCkpCisjZGVmaW5lICBDTVVfUkVHMV9QTExfTUFOVUFMQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgQ01VX1JFRzFfUExMX0NQX1NFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2UwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwM2UwKSkKKyNkZWZpbmUgIENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9NQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgIENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQoZHN0LCBzcmMpCVwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAxKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgQ01VX1JFRzIJCQkweDAwMDA0CisjZGVmaW5lICBDTVVfUkVHMl9QTExfUkVGRElWX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGMwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNCkgJiAweDAwMDBjMDAwKSkKKyNkZWZpbmUgIENNVV9SRUcyX1BMTF9MRlJFU19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDFlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDFlKSkKKyNkZWZpbmUgIENNVV9SRUcyX1BMTF9GQkRJVl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzZmUwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAzZmUwKSkKKyNkZWZpbmUgQ01VX1JFRzMJCQkweDAwMDA2CisjZGVmaW5lICBDTVVfUkVHM19WQ09WQVJTRUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwZikgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwZikpCisjZGVmaW5lICBDTVVfUkVHM19WQ09fTU9NU0VMX0lOSVRfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDNmMCkgfCAoKCh1MzIpIChzcmMpIDw8IDQpICYgMHgwMDAwMDNmMCkpCisjZGVmaW5lICBDTVVfUkVHM19WQ09fTUFOTU9NU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgQ01VX1JFRzQJCQkweDAwMDA4CisjZGVmaW5lIENNVV9SRUc1CQkJMHgwMDAwYQorI2RlZmluZSAgQ01VX1JFRzVfUExMX0xGU01DQVBfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwYzAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE0KSAmIDB4MDAwMGMwMDApKQorI2RlZmluZSAgQ01VX1JFRzVfUExMX0xPQ0tfUkVTT0xVVElPTl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDBlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDBlKSkKKyNkZWZpbmUgIENNVV9SRUc1X1BMTF9MRkNBUF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTIpICYgMHgwMDAwMzAwMCkpCisjZGVmaW5lICBDTVVfUkVHNV9QTExfUkVTRVRCX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBDTVVfUkVHNgkJCTB4MDAwMGMKKyNkZWZpbmUgIENNVV9SRUc2X1BMTF9WUkVHVFJJTV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwNjAwKSB8ICgoKHUzMikgKHNyYykgPDwgOSkgJiAweDAwMDAwNjAwKSkKKyNkZWZpbmUgIENNVV9SRUc2X01BTl9QVlRfQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDQpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMDQpKQorI2RlZmluZSBDTVVfUkVHNwkJCTB4MDAwMGUKKyNkZWZpbmUgIENNVV9SRUc3X1BMTF9DQUxJQl9ET05FX1JEKHNyYykgKCgweDAwMDA0MDAwICYgKHUzMikgKHNyYykpID4+IDE0KQorI2RlZmluZSAgQ01VX1JFRzdfVkNPX0NBTF9GQUlMX1JEKHNyYykJKCgweDAwMDAwYzAwICYgKHUzMikgKHNyYykpID4+IDEwKQorI2RlZmluZSBDTVVfUkVHOAkJCTB4MDAwMTAKKyNkZWZpbmUgQ01VX1JFRzkJCQkweDAwMDEyCisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl84QklUCQkweDAwMAorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fMTBCSVQJMHgwMDEKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzE2QklUCTB4MDAyCisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl8yMEJJVAkweDAwMworI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fMzJCSVQJMHgwMDQKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzQwQklUCTB4MDA1CisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl82NEJJVAkweDAwNgorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fNjZCSVQJMHgwMDcKKyNkZWZpbmUgIENNVV9SRUc5X1RYX1dPUkRfTU9ERV9DSDFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDM4MCkgfCAoKCh1MzIpIChzcmMpIDw8IDcpICYgMHgwMDAwMDM4MCkpCisjZGVmaW5lICBDTVVfUkVHOV9UWF9XT1JEX01PREVfQ0gwX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNzApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwNzApKQorI2RlZmluZSAgQ01VX1JFRzlfUExMX1BPU1RfRElWQlkyX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgQ01VX1JFRzlfVkJHX0JZUEFTU0JfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwNCkgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDAwNCkpCisjZGVmaW5lICBDTVVfUkVHOV9JR0VOX0JZUEFTU19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAyKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDAyKSkKKyNkZWZpbmUgQ01VX1JFRzEwCQkJMHgwMDAxNAorI2RlZmluZSAgQ01VX1JFRzEwX1ZSRUdfUkVGU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSBDTVVfUkVHMTEJCQkweDAwMDE2CisjZGVmaW5lIENNVV9SRUcxMgkJCTB4MDAwMTgKKyNkZWZpbmUgIENNVV9SRUcxMl9TVEFURV9ERUxBWTlfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDBmMCkgfCAoKCh1MzIpIChzcmMpIDw8IDQpICYgMHgwMDAwMDBmMCkpCisjZGVmaW5lIENNVV9SRUcxMwkJCTB4MDAwMWEKKyNkZWZpbmUgQ01VX1JFRzE0CQkJMHgwMDAxYworI2RlZmluZSBDTVVfUkVHMTUJCQkweDAwMDFlCisjZGVmaW5lIENNVV9SRUcxNgkJCTB4MDAwMjAKKyNkZWZpbmUgIENNVV9SRUcxNl9QVlRfRE5fTUFOX0VOQV9NQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgIENNVV9SRUcxNl9QVlRfVVBfTUFOX0VOQV9NQVNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgIENNVV9SRUcxNl9WQ09DQUxfV0FJVF9CVFdfQ09ERV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDFjKSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDFjKSkKKyNkZWZpbmUgIENNVV9SRUcxNl9DQUxJQlJBVElPTl9ET05FX09WRVJSSURFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNDApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwNDApKQorI2RlZmluZSAgQ01VX1JFRzE2X0JZUEFTU19QTExfTE9DS19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDIwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwMDIwKSkKKyNkZWZpbmUgQ01VX1JFRzE3CQkJMHgwMDAyMgorI2RlZmluZSAgQ01VX1JFRzE3X1BWVF9DT0RFX1IyQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDA3ZjAwKSB8ICgoKHUzMikgKHNyYykgPDwgOCkgJiAweDAwMDA3ZjAwKSkKKyNkZWZpbmUgIENNVV9SRUcxN19SRVNFUlZFRF83X1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZTApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwZTApKQorI2RlZmluZSAgQ01VX1JFRzE3X1BWVF9URVJNX01BTl9FTkFfTUFTSwkweDAwMDA4MDAwCisjZGVmaW5lIENNVV9SRUcxOAkJCTB4MDAwMjQKKyNkZWZpbmUgQ01VX1JFRzE5CQkJMHgwMDAyNgorI2RlZmluZSBDTVVfUkVHMjAJCQkweDAwMDI4CisjZGVmaW5lIENNVV9SRUcyMQkJCTB4MDAwMmEKKyNkZWZpbmUgQ01VX1JFRzIyCQkJMHgwMDAyYworI2RlZmluZSBDTVVfUkVHMjMJCQkweDAwMDJlCisjZGVmaW5lIENNVV9SRUcyNAkJCTB4MDAwMzAKKyNkZWZpbmUgQ01VX1JFRzI1CQkJMHgwMDAzMgorI2RlZmluZSBDTVVfUkVHMjYJCQkweDAwMDM0CisjZGVmaW5lICBDTVVfUkVHMjZfRk9SQ0VfUExMX0xPQ0tfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMSkgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwMSkpCisjZGVmaW5lIENNVV9SRUcyNwkJCTB4MDAwMzYKKyNkZWZpbmUgQ01VX1JFRzI4CQkJMHgwMDAzOAorI2RlZmluZSBDTVVfUkVHMjkJCQkweDAwMDNhCisjZGVmaW5lIENNVV9SRUczMAkJCTB4MDAwM2MKKyNkZWZpbmUgIENNVV9SRUczMF9MT0NLX0NPVU5UX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDYpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDYpKQorI2RlZmluZSAgQ01VX1JFRzMwX1BDSUVfTU9ERV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgQ01VX1JFRzMxCQkJMHgwMDAzZQorI2RlZmluZSBDTVVfUkVHMzIJCQkweDAwMDQwCisjZGVmaW5lICBDTVVfUkVHMzJfRk9SQ0VfVkNPQ0FMX1NUQVJUX01BU0sJMHgwMDAwNDAwMAorI2RlZmluZSAgQ01VX1JFRzMyX1BWVF9DQUxfV0FJVF9TRUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwNikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwNikpCisjZGVmaW5lICBDTVVfUkVHMzJfSVJFRl9BREpfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDE4MCkgfCAoKCh1MzIpIChzcmMpIDw8IDcpICYgMHgwMDAwMDE4MCkpCisjZGVmaW5lIENNVV9SRUczMwkJCTB4MDAwNDIKKyNkZWZpbmUgQ01VX1JFRzM0CQkJMHgwMDA0NAorI2RlZmluZSAgQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0xPX01BWF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDBmKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDBmKSkKKyNkZWZpbmUgIENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9ISV9NQVhfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMGYwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwMGYwMCkpCisjZGVmaW5lICBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfTE9fTUlOX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwZjApKQorI2RlZmluZSAgQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0hJX01JTl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTIpICYgMHgwMDAwZjAwMCkpCisjZGVmaW5lIENNVV9SRUczNQkJCTB4MDAwNDYKKyNkZWZpbmUgIENNVV9SRUczNV9QTExfU1NDX01PRF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmZTAwKSB8ICgoKHUzMikgKHNyYykgPDwgOSkgJiAweDAwMDBmZTAwKSkKKyNkZWZpbmUgQ01VX1JFRzM2CQkJCTB4MDAwNDgKKyNkZWZpbmUgIENNVV9SRUczNl9QTExfU1NDX0VOX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMTApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwMTApKQorI2RlZmluZSAgQ01VX1JFRzM2X1BMTF9TU0NfVlNURVBfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmZjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwZmZjMCkpCisjZGVmaW5lICBDTVVfUkVHMzZfUExMX1NTQ19EU01TRUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAyMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDAyMCkpCisjZGVmaW5lIENNVV9SRUczNwkJCTB4MDAwNGEKKyNkZWZpbmUgQ01VX1JFRzM4CQkJMHgwMDA0YworI2RlZmluZSBDTVVfUkVHMzkJCQkweDAwMDRlCisKKy8qIFBIWSBsYW5lIENTUiBhY2Nlc3NpbmcgZnJvbSBTRFMgaW5kaXJlY3RseSAqLworI2RlZmluZSBSWFRYX1JFRzAJCQkweDAwMAorI2RlZmluZSAgUlhUWF9SRUcwX0NUTEVfRVFfSFJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMGY4MDApKQorI2RlZmluZSAgUlhUWF9SRUcwX0NUTEVfRVFfUVJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDdjMCkpCisjZGVmaW5lICBSWFRYX1JFRzBfQ1RMRV9FUV9GUl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDNlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDNlKSkKKyNkZWZpbmUgUlhUWF9SRUcxCQkJMHgwMDIKKyNkZWZpbmUgIFJYVFhfUkVHMV9SWEFDVkNNX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGYwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMikgJiAweDAwMDBmMDAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMV9DVExFX0VRX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDBmODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDBmODApKQorI2RlZmluZSAgUlhUWF9SRUcxX1JYVlJFRzFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDA2MCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDA2MCkpCisjZGVmaW5lICBSWFRYX1JFRzFfUlhJUkVGX0FESl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA2KSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAgMHgwMDAwMDAwNikpCisjZGVmaW5lIFJYVFhfUkVHMgkJCTB4MDA0CisjZGVmaW5lICBSWFRYX1JFRzJfVlRUX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMTAwKSB8ICgoKHUzMikgKHNyYykgPDwgOCkgJiAweDAwMDAwMTAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMl9UWF9GSUZPX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDIwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwMDIwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMl9WVFRfU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwYzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwYzApKQorI2RlZmluZSBSWFRYX1JFRzQJCQkweDAwOAorI2RlZmluZSAgUlhUWF9SRUc0X1RYX0xPT1BCQUNLX0JVRl9FTl9NQVNLCTB4MDAwMDAwNDAKKyNkZWZpbmUgIFJYVFhfUkVHNF9UWF9EQVRBX1JBVEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwYzAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE0KSAmIDB4MDAwMGMwMDApKQorI2RlZmluZSAgUlhUWF9SRUc0X1RYX1dPUkRfTU9ERV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwMzgwMCkpCisjZGVmaW5lIFJYVFhfUkVHNQkJCTB4MDBhCisjZGVmaW5lICBSWFRYX1JFRzVfVFhfQ04xX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNV9UWF9DUDFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdlMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDdlMCkpCisjZGVmaW5lICBSWFRYX1JFRzVfVFhfQ04yX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMWYpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMWYpKQorI2RlZmluZSBSWFRYX1JFRzYJCQkweDAwYworI2RlZmluZSAgUlhUWF9SRUc2X1RYQU1QX0NOVExfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDc4MCkgfCAoKCh1MzIpIChzcmMpIDw8IDcpICYgMHgwMDAwMDc4MCkpCisjZGVmaW5lICBSWFRYX1JFRzZfVFhBTVBfRU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNDApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwNDApKQorI2RlZmluZSAgUlhUWF9SRUc2X1JYX0JJU1RfRVJSQ05UX1JEX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSAgUlhUWF9SRUc2X1RYX0lETEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwOCkgfCAoKCh1MzIpIChzcmMpIDw8IDMpICYgMHgwMDAwMDAwOCkpCisjZGVmaW5lICBSWFRYX1JFRzZfUlhfQklTVF9SRVNZTkNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lIFJYVFhfUkVHNwkJCTB4MDBlCisjZGVmaW5lICBSWFRYX1JFRzdfUkVTRVRCX1JYRF9NQVNLCTB4MDAwMDAxMDAKKyNkZWZpbmUgIFJYVFhfUkVHN19SRVNFVEJfUlhBX01BU0sJMHgwMDAwMDA4MAorI2RlZmluZSAgUlhUWF9SRUc3X0JJU1RfRU5BX1JYX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNDApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwNDApKQorI2RlZmluZSAgUlhUWF9SRUc3X1JYX1dPUkRfTU9ERV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwMzgwMCkpCisjZGVmaW5lIFJYVFhfUkVHOAkJCTB4MDEwCisjZGVmaW5lICBSWFRYX1JFRzhfQ0RSX0xPT1BfRU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDQwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNCkgJiAweDAwMDA0MDAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOF9DRFJfQllQQVNTX1JYTE9TX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDAwODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOF9TU0NfRU5BQkxFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAyMDApIHwgKCgodTMyKSAoc3JjKSA8PCA5KSAmIDB4MDAwMDAyMDApKQorI2RlZmluZSAgUlhUWF9SRUc4X1NEX1ZSRUZfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDBmMCkgfCAoKCh1MzIpIChzcmMpIDw8IDQpICYgMHgwMDAwMDBmMCkpCisjZGVmaW5lICBSWFRYX1JFRzhfU0RfRElTQUJMRV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMTAwKSB8ICgoKHUzMikgKHNyYykgPDwgOCkgJiAweDAwMDAwMTAwKSkKKyNkZWZpbmUgUlhUWF9SRUc3CQkJMHgwMGUKKyNkZWZpbmUgIFJYVFhfUkVHN19SRVNFVEJfUlhEX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAxMDApIHwgKCgodTMyKSAoc3JjKSA8PCA4KSAmIDB4MDAwMDAxMDApKQorI2RlZmluZSAgUlhUWF9SRUc3X1JFU0VUQl9SWEFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDA4MCkgfCAoKCh1MzIpIChzcmMpIDw8IDcpICYgMHgwMDAwMDA4MCkpCisjZGVmaW5lICBSWFRYX1JFRzdfTE9PUF9CQUNLX0VOQV9DVExFX01BU0sJMHgwMDAwNDAwMAorI2RlZmluZSAgUlhUWF9SRUc3X0xPT1BfQkFDS19FTkFfQ1RMRV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDA0MDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTQpICYgMHgwMDAwNDAwMCkpCisjZGVmaW5lIFJYVFhfUkVHMTEJCQkweDAxNgorI2RlZmluZSAgUlhUWF9SRUcxMV9QSEFTRV9BREpVU1RfTElNSVRfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMGY4MDApKQorI2RlZmluZSBSWFRYX1JFRzEyCQkJMHgwMTgKKyNkZWZpbmUgIFJYVFhfUkVHMTJfTEFUQ0hfT0ZGX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAyMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTMpICYgMHgwMDAwMjAwMCkpCisjZGVmaW5lICBSWFRYX1JFRzEyX1NVTU9TX0VOQUJMRV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgIFJYVFhfUkVHMTJfUlhfREVUX1RFUk1fRU5BQkxFX01BU0sJMHgwMDAwMDAwMgorI2RlZmluZSAgUlhUWF9SRUcxMl9SWF9ERVRfVEVSTV9FTkFCTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lIFJYVFhfUkVHMTMJCQkweDAxYQorI2RlZmluZSBSWFRYX1JFRzE0CQkJMHgwMWMKKyNkZWZpbmUgIFJYVFhfUkVHMTRfQ0xURV9MQVRDQUxfTUFOX1BST0dfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAzZikgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAzZikpCisjZGVmaW5lICBSWFRYX1JFRzE0X0NUTEVfTEFUQ0FMX01BTl9FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDA0MCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDA0MCkpCisjZGVmaW5lIFJYVFhfUkVHMjYJCQkweDAzNAorI2RlZmluZSAgUlhUWF9SRUcyNl9QRVJJT0RfRVJST1JfTEFUQ0hfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMDM4MDApKQorI2RlZmluZSAgUlhUWF9SRUcyNl9CTFdDX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgUlhUWF9SRUcyMQkJCTB4MDJhCisjZGVmaW5lICBSWFRYX1JFRzIxX0RPX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwZmMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgIFJYVFhfUkVHMjFfWE9fTEFUQ0hfQ0FMT1VUX1JEKHNyYykgKCgweDAwMDAwM2YwICYgKHUzMikgKHNyYykpID4+IDQpCisjZGVmaW5lICBSWFRYX1JFRzIxX0xBVENIX0NBTF9GQUlMX09ERF9SRChzcmMpCSgoMHgwMDAwMDAwZiAmICh1MzIpKHNyYykpKQorI2RlZmluZSBSWFRYX1JFRzIyCQkJMHgwMmMKKyNkZWZpbmUgIFJYVFhfUkVHMjJfU09fTEFUQ0hfQ0FMT1VUX1JEKHNyYykgKCgweDAwMDAwM2YwICYgKHUzMikgKHNyYykpID4+IDQpCisjZGVmaW5lICBSWFRYX1JFRzIyX0VPX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwZmMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgIFJYVFhfUkVHMjJfTEFUQ0hfQ0FMX0ZBSUxfRVZFTl9SRChzcmMpCSgoMHgwMDAwMDAwZiAmICh1MzIpKHNyYykpKQorI2RlZmluZSBSWFRYX1JFRzIzCQkJMHgwMmUKKyNkZWZpbmUgIFJYVFhfUkVHMjNfREVfTEFUQ0hfQ0FMT1VUX1JEKHNyYykgKCgweDAwMDBmYzAwICYgKHUzMikgKHNyYykpID4+IDEwKQorI2RlZmluZSAgUlhUWF9SRUcyM19YRV9MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMDAzZjAgJiAodTMyKSAoc3JjKSkgPj4gNCkKKyNkZWZpbmUgUlhUWF9SRUcyNAkJCTB4MDMwCisjZGVmaW5lICBSWFRYX1JFRzI0X0VFX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwZmMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgIFJYVFhfUkVHMjRfU0VfTEFUQ0hfQ0FMT1VUX1JEKHNyYykgKCgweDAwMDAwM2YwICYgKHUzMikgKHNyYykpID4+IDQpCisjZGVmaW5lIFJYVFhfUkVHMjcJCQkweDAzNgorI2RlZmluZSBSWFRYX1JFRzI4CQkJMHgwMzgKKyNkZWZpbmUgUlhUWF9SRUczMQkJCTB4MDNlCisjZGVmaW5lIFJYVFhfUkVHMzgJCQkweDA0YworI2RlZmluZSAgUlhUWF9SRUczOF9DVVNUT01FUl9QSU5NT0RFX0lOVl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIDB4MDAwMGZmZmUpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMGZmZmUpKQorI2RlZmluZSBSWFRYX1JFRzM5CQkJMHgwNGUKKyNkZWZpbmUgUlhUWF9SRUc0MAkJCTB4MDUwCisjZGVmaW5lIFJYVFhfUkVHNDEJCQkweDA1MgorI2RlZmluZSBSWFRYX1JFRzQyCQkJMHgwNTQKKyNkZWZpbmUgUlhUWF9SRUc0MwkJCTB4MDU2CisjZGVmaW5lIFJYVFhfUkVHNDQJCQkweDA1OAorI2RlZmluZSBSWFRYX1JFRzQ1CQkJMHgwNWEKKyNkZWZpbmUgUlhUWF9SRUc0NgkJCTB4MDVjCisjZGVmaW5lIFJYVFhfUkVHNDcJCQkweDA1ZQorI2RlZmluZSBSWFRYX1JFRzQ4CQkJMHgwNjAKKyNkZWZpbmUgUlhUWF9SRUc0OQkJCTB4MDYyCisjZGVmaW5lIFJYVFhfUkVHNTAJCQkweDA2NAorI2RlZmluZSBSWFRYX1JFRzUxCQkJMHgwNjYKKyNkZWZpbmUgUlhUWF9SRUc1MgkJCTB4MDY4CisjZGVmaW5lIFJYVFhfUkVHNTMJCQkweDA2YQorI2RlZmluZSBSWFRYX1JFRzU0CQkJMHgwNmMKKyNkZWZpbmUgUlhUWF9SRUc1NQkJCTB4MDZlCisjZGVmaW5lIFJYVFhfUkVHNjEJCQkweDA3YQorI2RlZmluZSAgUlhUWF9SRUc2MV9JU0NBTl9JTkJFUlRfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAxMCkgfCAoKCh1MzIpIChzcmMpIDw8IDQpICYgMHgwMDAwMDAxMCkpCisjZGVmaW5lICBSWFRYX1JFRzYxX0xPQURGUkVRX1NISUZUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgUlhUWF9SRUc2MV9FWUVfQ09VTlRfV0lEVEhfU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwYzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwYzApKQorI2RlZmluZSAgUlhUWF9SRUc2MV9TUERfU0VMX0NEUl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzYzAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTApICYgMHgwMDAwM2MwMCkpCisjZGVmaW5lIFJYVFhfUkVHNjIJCQkweDA3YworI2RlZmluZSAgUlhUWF9SRUc2Ml9QRVJJT0RfSDFfUUxBVENIX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDM4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDAzODAwKSkKKyNkZWZpbmUgUlhUWF9SRUc4MQkJCTB4MGEyCisjZGVmaW5lICBSWFRYX1JFRzg5X01VX1RIN19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwZjgwMCkpCisjZGVmaW5lICBSWFRYX1JFRzg5X01VX1RIOF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwN2MwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwN2MwKSkKKyNkZWZpbmUgIFJYVFhfUkVHODlfTVVfVEg5X1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2UpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwM2UpKQorI2RlZmluZSBSWFRYX1JFRzk2CQkJMHgwYzAKKyNkZWZpbmUgIFJYVFhfUkVHOTZfTVVfRlJFUTFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMGY4MDApKQorI2RlZmluZSAgUlhUWF9SRUc5Nl9NVV9GUkVRMl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwN2MwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwN2MwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOTZfTVVfRlJFUTNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAzZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAzZSkpCisjZGVmaW5lIFJYVFhfUkVHOTkJCQkweDBjNgorI2RlZmluZSAgUlhUWF9SRUc5OV9NVV9QSEFTRTFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMGY4MDApKQorI2RlZmluZSAgUlhUWF9SRUc5OV9NVV9QSEFTRTJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDdjMCkpCisjZGVmaW5lICBSWFRYX1JFRzk5X01VX1BIQVNFM19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDNlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDNlKSkKKyNkZWZpbmUgUlhUWF9SRUcxMDIJCQkweDBjYworI2RlZmluZSAgUlhUWF9SRUcxMDJfRlJFUUxPT1BfTElNSVRfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDA2MCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDA2MCkpCisjZGVmaW5lIFJYVFhfUkVHMTE0CQkJMHgwZTQKKyNkZWZpbmUgUlhUWF9SRUcxMjEJCQkweDBmMgorI2RlZmluZSAgUlhUWF9SRUcxMjFfU1VNT1NfQ0FMX0NPREVfUkQoc3JjKSAoKDB4MDAwMDAwM2UgJiAodTMyKShzcmMpKSA+PiAweDEpCisjZGVmaW5lIFJYVFhfUkVHMTI1CQkJMHgwZmEKKyNkZWZpbmUgIFJYVFhfUkVHMTI1X1BRX1JFR19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmZTAwKSB8ICgoKHUzMikgKHNyYykgPDwgOSkgJiAweDAwMDBmZTAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI1X1NJR05fUFFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDEwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwMDEwMCkpCisjZGVmaW5lICBSWFRYX1JFRzEyNV9TSUdOX1BRXzJDX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAwODApKQorI2RlZmluZSAgUlhUWF9SRUcxMjVfUEhaX01BTlVBTENPREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDA3YykgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDA3YykpCisjZGVmaW5lICBSWFRYX1JFRzEyNV9QSFpfTUFOVUFMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSBSWFRYX1JFRzEyNwkJCTB4MGZlCisjZGVmaW5lICBSWFRYX1JFRzEyN19GT1JDRV9TVU1fQ0FMX1NUQVJUX01BU0sJMHgwMDAwMDAwMgorI2RlZmluZSAgUlhUWF9SRUcxMjdfRk9SQ0VfTEFUX0NBTF9TVEFSVF9NQVNLCTB4MDAwMDAwMDQKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X0ZPUkNFX1NVTV9DQUxfU1RBUlRfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lICBSWFRYX1JFRzEyN19GT1JDRV9MQVRfQ0FMX1NUQVJUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDQpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMDQpKQorI2RlZmluZSAgUlhUWF9SRUcxMjdfTEFUQ0hfTUFOX0NBTF9FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwOCkgfCAoKCh1MzIpIChzcmMpIDw8IDMpICYgMHgwMDAwMDAwOCkpCisjZGVmaW5lICBSWFRYX1JFRzEyN19ET19MQVRDSF9NQU5DQUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmMwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMGZjMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMjdfWE9fTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAzZjApKQorI2RlZmluZSBSWFRYX1JFRzEyOAkJCTB4MTAwCisjZGVmaW5lICBSWFRYX1JFRzEyOF9MQVRDSF9DQUxfV0FJVF9TRUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwYykgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDAwYykpCisjZGVmaW5lICBSWFRYX1JFRzEyOF9FT19MQVRDSF9NQU5DQUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmMwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMGZjMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMjhfU09fTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAzZjApKQorI2RlZmluZSBSWFRYX1JFRzEyOQkJCTB4MTAyCisjZGVmaW5lICBSWFRYX1JFRzEyOV9ERV9MQVRDSF9NQU5DQUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmMwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMGZjMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMjlfWEVfTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAzZjApKQorI2RlZmluZSBSWFRYX1JFRzEzMAkJCTB4MTA0CisjZGVmaW5lICBSWFRYX1JFRzEzMF9FRV9MQVRDSF9NQU5DQUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmMwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMGZjMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMzBfU0VfTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAzZjApKQorI2RlZmluZSBSWFRYX1JFRzE0NQkJCTB4MTIyCisjZGVmaW5lICBSWFRYX1JFRzE0NV9UWF9JRExFX1NBVEFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMSkgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwMSkpCisjZGVmaW5lICBSWFRYX1JFRzE0NV9SWEVTX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAyKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDAyKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTQ1X1JYREZFX0NPTkZJR19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBjMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTQpICYgMHgwMDAwYzAwMCkpCisjZGVmaW5lICBSWFRYX1JFRzE0NV9SWFZXRVNfTEFURU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDQpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMDQpKQorI2RlZmluZSBSWFRYX1JFRzE0NwkJCTB4MTI2CisjZGVmaW5lIFJYVFhfUkVHMTQ4CQkJMHgxMjgKKworLyogQ2xvY2sgbWFjcm8gdHlwZSAqLworZW51bSBjbXVfdHlwZV90IHsKKwlSRUZfQ01VID0gMCwJLyogQ2xvY2sgbWFjcm8gaXMgdGhlIGludGVybmFsIHJlZmVyZW5jZSBjbG9jayAqLworCVBIWV9DTVUgPSAxLAkvKiBDbG9jayBtYWNybyBpcyB0aGUgUExMIGZvciB0aGUgU2VyZGVzICovCit9OworCitlbnVtIG11eF90eXBlX3QgeworCU1VWF9TRUxFQ1RfQVRBID0gMCwJLyogU3dpdGNoIHRoZSBNVVggdG8gQVRBICovCisJTVVYX1NFTEVDVF9TR01NSUkgPSAwLAkvKiBTd2l0Y2ggdGhlIE1VWCB0byBTR01JSSAqLworfTsKKworZW51bSBjbGtfdHlwZV90IHsKKwlDTEtfRVhUX0RJRkYgPSAwLAkvKiBFeHRlcm5hbCBkaWZmZXJlbnRpYWwgKi8KKwlDTEtfSU5UX0RJRkYgPSAxLAkvKiBJbnRlcm5hbCBkaWZmZXJlbnRpYWwgKi8KKwlDTEtfSU5UX1NJTkcgPSAyLAkvKiBJbnRlcm5hbCBzaW5nbGUgZW5kZWQgKi8KK307CisKK2VudW0gcGh5X21vZGUgeworCU1PREVfU0FUQQk9IDAsCS8qIExpc3QgdGhlbSBmb3Igc2ltcGxlIHJlZmVyZW5jZSAqLworCU1PREVfU0dNSUkJPSAxLAorCU1PREVfUENJRQk9IDIsCisJTU9ERV9VU0IJPSAzLAorCU1PREVfWEZJCT0gNCwKKwlNT0RFX01BWAorfTsKKworc3RydWN0IHhnZW5lX3NhdGFfb3ZlcnJpZGVfcGFyYW0geworCXUzMiBzcGVlZFtNQVhfTEFORV07IC8qIEluZGV4IGZvciBvdmVycmlkZSBwYXJhbWV0ZXIgcGVyIGxhbmUgKi8KKwl1MzIgdHhzcGVlZFszXTsJCQkvKiBUeCBzcGVlZCAqLworCXUzMiB0eGJvb3N0Z2FpbltNQVhfTEFORSozXTsJLyogVHggZnJlcSBib29zdCBhbmQgZ2FpbiBjb250cm9sICovCisJdTMyIHR4ZXlldHVuaW5nW01BWF9MQU5FKjNdOwkvKiBUeCBleWUgdHVuaW5nICovCisJdTMyIHR4ZXllZGlyZWN0aW9uW01BWF9MQU5FKjNdOyAvKiBUeCBleWUgdHVuaW5nIGRpcmVjdGlvbiAqLworCXUzMiB0eGFtcGxpdHVkZVtNQVhfTEFORSozXTsJLyogVHggYW1wbGl0dWRlIGNvbnRyb2wgKi8KKwl1MzIgdHhwcmVjdXJzb3JfY24xW01BWF9MQU5FKjNdOyAvKiBUeCBlbXBoYXNpcyB0YXBzIDFzdCBwcmUtY3Vyc29yICovCisJdTMyIHR4cHJlY3Vyc29yX2NuMltNQVhfTEFORSozXTsgLyogVHggZW1waGFzaXMgdGFwcyAybmQgcHJlLWN1cnNvciAqLworCXUzMiB0eHBvc3RjdXJzb3JfY3AxW01BWF9MQU5FKjNdOyAvKiBUeCBlbXBoYXNpcyB0YXBzIHBvc3QtY3Vyc29yICovCit9OworCitzdHJ1Y3QgeGdlbmVfcGh5X2N0eCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwaHkgKnBoeTsKKwllbnVtIHBoeV9tb2RlIG1vZGU7CQkvKiBNb2RlIG9mIG9wZXJhdGlvbiAqLworCWVudW0gY2xrX3R5cGVfdCBjbGtfdHlwZTsJLyogSW5wdXQgY2xvY2sgc2VsZWN0aW9uICovCisJdm9pZCBfX2lvbWVtICpzZHNfYmFzZTsJCS8qIFBIWSBDU1IgYmFzZSBhZGRyICovCisJc3RydWN0IGNsayAqY2xrOwkJLyogT3B0aW9uYWwgY2xvY2sgKi8KKworCS8qIE92ZXJyaWRlIFNlcmRlcyBwYXJhbWV0ZXJzICovCisJc3RydWN0IHhnZW5lX3NhdGFfb3ZlcnJpZGVfcGFyYW0gc2F0YV9wYXJhbTsKK307CisKKy8qCisgKiBGb3IgY2hpcCBlYXJsaWVyIHRoYW4gQTMgdmVyc2lvbiwgZW5hYmxlIHRoaXMgZmxhZy4KKyAqIFRvIGVuYWJsZSwgcGFzcyBib290IGFyZ3VtZW50IHBoeV94Z2VuZS5wcmVBM0NoaXA9MQorICovCitzdGF0aWMgaW50IHByZUEzQ2hpcDsKK01PRFVMRV9QQVJNX0RFU0MocHJlQTNDaGlwLCAiRW5hYmxlIHByZS1BMyBjaGlwIHN1cHBvcnQgKDE9ZW5hYmxlIDA9ZGlzYWJsZSkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChwcmVBM0NoaXAsIHByZUEzQ2hpcCwgaW50LCAwNDQ0KTsKKworc3RhdGljIHZvaWQgc2RzX3dyKHZvaWQgX19pb21lbSAqY3NyX2Jhc2UsIHUzMiBpbmRpcmVjdF9jbWRfcmVnLAorCQkgICB1MzIgaW5kaXJlY3RfZGF0YV9yZWcsIHUzMiBhZGRyLCB1MzIgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lID0gamlmZmllcyArIEhaOworCXUzMiB2YWw7CisJdTMyIGNtZDsKKworCWNtZCA9IENGR19JTkRfV1JfQ01EX01BU0sgfCBDRkdfSU5EX0NNRF9ET05FX01BU0s7CisJY21kID0gQ0ZHX0lORF9BRERSX1NFVChjbWQsIGFkZHIpOworCXdyaXRlbChkYXRhLCBjc3JfYmFzZSArIGluZGlyZWN0X2RhdGFfcmVnKTsKKwlyZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2RhdGFfcmVnKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJd3JpdGVsKGNtZCwgY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnKTsKKwlyZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwlkbyB7CisJCXZhbCA9IHJlYWRsKGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZyk7CisJfSB3aGlsZSAoISh2YWwgJiBDRkdfSU5EX0NNRF9ET05FX01BU0spICYmCisJCSB0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWFkbGluZSkpOworCWlmICghKHZhbCAmIENGR19JTkRfQ01EX0RPTkVfTUFTSykpCisJCXByX2VycigiU0RTIFdSIHRpbWVvdXQgYXQgMHglcCBvZmZzZXQgMHglMDhYIHZhbHVlIDB4JTA4WFxuIiwKKwkJICAgICAgIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZywgYWRkciwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNkc19yZCh2b2lkIF9faW9tZW0gKmNzcl9iYXNlLCB1MzIgaW5kaXJlY3RfY21kX3JlZywKKwkJICAgdTMyIGluZGlyZWN0X2RhdGFfcmVnLCB1MzIgYWRkciwgdTMyICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUgPSBqaWZmaWVzICsgSFo7CisJdTMyIHZhbDsKKwl1MzIgY21kOworCisJY21kID0gQ0ZHX0lORF9SRF9DTURfTUFTSyB8IENGR19JTkRfQ01EX0RPTkVfTUFTSzsKKwljbWQgPSBDRkdfSU5EX0FERFJfU0VUKGNtZCwgYWRkcik7CisJd3JpdGVsKGNtZCwgY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnKTsKKwlyZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwlkbyB7CisJCXZhbCA9IHJlYWRsKGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZyk7CisJfSB3aGlsZSAoISh2YWwgJiBDRkdfSU5EX0NNRF9ET05FX01BU0spICYmCisJCSB0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWFkbGluZSkpOworCSpkYXRhID0gcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9kYXRhX3JlZyk7CisJaWYgKCEodmFsICYgQ0ZHX0lORF9DTURfRE9ORV9NQVNLKSkKKwkJcHJfZXJyKCJTRFMgV1IgdGltZW91dCBhdCAweCVwIG9mZnNldCAweCUwOFggdmFsdWUgMHglMDhYXG4iLAorCQkgICAgICAgY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnLCBhZGRyLCAqZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGNtdV93cihzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBlbnVtIGNtdV90eXBlX3QgY211X3R5cGUsCisJCSAgIHUzMiByZWcsIHUzMiBkYXRhKQoreworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2UgPSBjdHgtPnNkc19iYXNlOworCXUzMiB2YWw7CisKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkKKwkJcmVnICs9IFNFUkRFU19QTExfUkVGX0lORElSRUNUX09GRlNFVDsKKwllbHNlCisJCXJlZyArPSBTRVJERVNfUExMX0lORElSRUNUX09GRlNFVDsKKwlzZHNfd3Ioc2RzX2Jhc2UsIFNBVEFfRU5FVF9TRFNfSU5EX0NNRF9SRUcsCisJCVNBVEFfRU5FVF9TRFNfSU5EX1dEQVRBX1JFRywgcmVnLCBkYXRhKTsKKwlzZHNfcmQoc2RzX2Jhc2UsIFNBVEFfRU5FVF9TRFNfSU5EX0NNRF9SRUcsCisJCVNBVEFfRU5FVF9TRFNfSU5EX1JEQVRBX1JFRywgcmVnLCAmdmFsKTsKKwlwcl9kZWJ1ZygiQ01VIFdSIGFkZHIgMHglWCB2YWx1ZSAweCUwOFggPC0+IDB4JTA4WFxuIiwgcmVnLCBkYXRhLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBjbXVfcmQoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkgICB1MzIgcmVnLCB1MzIgKmRhdGEpCit7CisJdm9pZCBfX2lvbWVtICpzZHNfYmFzZSA9IGN0eC0+c2RzX2Jhc2U7CisKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkKKwkJcmVnICs9IFNFUkRFU19QTExfUkVGX0lORElSRUNUX09GRlNFVDsKKwllbHNlCisJCXJlZyArPSBTRVJERVNfUExMX0lORElSRUNUX09GRlNFVDsKKwlzZHNfcmQoc2RzX2Jhc2UsIFNBVEFfRU5FVF9TRFNfSU5EX0NNRF9SRUcsCisJCVNBVEFfRU5FVF9TRFNfSU5EX1JEQVRBX1JFRywgcmVnLCBkYXRhKTsKKwlwcl9kZWJ1ZygiQ01VIFJEIGFkZHIgMHglWCB2YWx1ZSAweCUwOFhcbiIsIHJlZywgKmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBjbXVfdG9nZ2xlMXRvMChzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBlbnVtIGNtdV90eXBlX3QgY211X3R5cGUsCisJCQkgICB1MzIgcmVnLCB1MzIgYml0cykKK3sKKwl1MzIgdmFsOworCisJY211X3JkKGN0eCwgY211X3R5cGUsIHJlZywgJnZhbCk7CisJdmFsIHw9IGJpdHM7CisJY211X3dyKGN0eCwgY211X3R5cGUsIHJlZywgdmFsKTsKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgcmVnLCAmdmFsKTsKKwl2YWwgJj0gfmJpdHM7CisJY211X3dyKGN0eCwgY211X3R5cGUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgY211X2NscmJpdHMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCByZWcsICZ2YWwpOworCXZhbCAmPSB+Yml0czsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBjbXVfc2V0Yml0cyhzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBlbnVtIGNtdV90eXBlX3QgY211X3R5cGUsCisJCQl1MzIgcmVnLCB1MzIgYml0cykKK3sKKwl1MzIgdmFsOworCisJY211X3JkKGN0eCwgY211X3R5cGUsIHJlZywgJnZhbCk7CisJdmFsIHw9IGJpdHM7CisJY211X3dyKGN0eCwgY211X3R5cGUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2VyZGVzX3dyKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGludCBsYW5lLCB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnNkc19iYXNlID0gY3R4LT5zZHNfYmFzZTsKKwl1MzIgdmFsOworCisJcmVnICs9IFNFUkRFU19JTkRJUkVDVF9PRkZTRVQ7CisJcmVnICs9IGxhbmUgKiBTRVJERVNfTEFORV9TVFJJREU7CisJc2RzX3dyKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCSAgICAgICBTQVRBX0VORVRfU0RTX0lORF9XREFUQV9SRUcsIHJlZywgZGF0YSk7CisJc2RzX3JkKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCSAgICAgICBTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcsIHJlZywgJnZhbCk7CisJcHJfZGVidWcoIlNFUkRFUyBXUiBhZGRyIDB4JVggdmFsdWUgMHglMDhYIDwtPiAweCUwOFhcbiIsIHJlZywgZGF0YSwKKwkJIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmRlc19yZChzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSwgdTMyIHJlZywgdTMyICpkYXRhKQoreworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2UgPSBjdHgtPnNkc19iYXNlOworCisJcmVnICs9IFNFUkRFU19JTkRJUkVDVF9PRkZTRVQ7CisJcmVnICs9IGxhbmUgKiBTRVJERVNfTEFORV9TVFJJREU7CisJc2RzX3JkKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCSAgICAgICBTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcsIHJlZywgZGF0YSk7CisJcHJfZGVidWcoIlNFUkRFUyBSRCBhZGRyIDB4JVggdmFsdWUgMHglMDhYXG4iLCByZWcsICpkYXRhKTsKK30KKworc3RhdGljIHZvaWQgc2VyZGVzX2NscmJpdHMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUsIHUzMiByZWcsCisJCQkgICB1MzIgYml0cykKK3sKKwl1MzIgdmFsOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwl2YWwgJj0gfmJpdHM7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBzZXJkZXNfc2V0Yml0cyhzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSwgdTMyIHJlZywKKwkJCSAgIHUzMiBiaXRzKQoreworCXUzMiB2YWw7CisKKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCByZWcsICZ2YWwpOworCXZhbCB8PSBiaXRzOworCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X2NmZ19jbXVfY2xrX3R5cGUoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgICAgICAgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJCSAgICAgICBlbnVtIGNsa190eXBlX3QgY2xrX3R5cGUpCit7CisJdTMyIHZhbDsKKworCS8qIFNldCB0aGUgcmVzZXQgc2VxdWVuY2UgZGVsYXkgZm9yIFRYIHJlYWR5IGFzc2VydGlvbiAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTIsICZ2YWwpOworCXZhbCA9IENNVV9SRUcxMl9TVEFURV9ERUxBWTlfU0VUKHZhbCwgMHgxKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEyLCB2YWwpOworCS8qIFNldCB0aGUgcHJvZ3JhbW1hYmxlIHN0YWdlIGRlbGF5cyBiZXR3ZWVuIHZhcmlvdXMgZW5hYmxlIHN0YWdlcyAqLworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTMsIDB4MDIyMik7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNCwgMHgyMjI1KTsKKworCS8qIENvbmZpZ3VyZSBjbG9jayB0eXBlICovCisJaWYgKGNsa190eXBlID09IENMS19FWFRfRElGRikgeworCQkvKiBTZWxlY3QgZXh0ZXJuYWwgY2xvY2sgbXV4ICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcwX1BMTF9SRUZfU0VMX1NFVCh2YWwsIDB4MCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgdmFsKTsKKwkJLyogU2VsZWN0IENNT1MgYXMgcmVmZXJlbmNlIGNsb2NrICAqLworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMV9SRUZDTEtfQ01PU19TRUxfU0VUKHZhbCwgMHgwKTsKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCB2YWwpOworCQlkZXZfZGJnKGN0eC0+ZGV2LCAiU2V0IGV4dGVybmFsIHJlZmVyZW5jZSBjbG9ja1xuIik7CisJfSBlbHNlIGlmIChjbGtfdHlwZSA9PSBDTEtfSU5UX0RJRkYpIHsKKwkJLyogU2VsZWN0IGludGVybmFsIGNsb2NrIG11eCAqLworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzAsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMF9QTExfUkVGX1NFTF9TRVQodmFsLCAweDEpOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzAsIHZhbCk7CisJCS8qIFNlbGVjdCBDTU9TIGFzIHJlZmVyZW5jZSBjbG9jayAgKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUkVGQ0xLX0NNT1NfU0VMX1NFVCh2YWwsIDB4MSk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKwkJZGV2X2RiZyhjdHgtPmRldiwgIlNldCBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2tcbiIpOworCX0gZWxzZSBpZiAoY2xrX3R5cGUgPT0gQ0xLX0lOVF9TSU5HKSB7CisJCS8qCisJCSAqIE5PVEU6IFRoaXMgY2xvY2sgdHlwZSBpcyBOT1Qgc3VwcG9ydCBmb3IgY29udHJvbGxlcgorCQkgKgkgd2hvc2UgaW50ZXJuYWwgY2xvY2sgc2hhcmVkIGluIHRoZSBQQ0llIGNvbnRyb2xsZXIKKwkJICoKKwkJICogU2VsZWN0IGludGVybmFsIGNsb2NrIG11eAorCQkgKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUkVGQ0xLX0NNT1NfU0VMX1NFVCh2YWwsIDB4MSk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKwkJLyogU2VsZWN0IENNTCBhcyByZWZlcmVuY2UgY2xvY2sgKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUkVGQ0xLX0NNT1NfU0VMX1NFVCh2YWwsIDB4MCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKwkJZGV2X2RiZyhjdHgtPmRldiwKKwkJCSJTZXQgaW50ZXJuYWwgc2luZ2xlIGVuZGVkIHJlZmVyZW5jZSBjbG9ja1xuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9waHlfc2F0YV9jZmdfY211X2NvcmUoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkJZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJCQllbnVtIGNsa190eXBlX3QgY2xrX3R5cGUpCit7CisJdTMyIHZhbDsKKwlpbnQgcmVmXzEwME1IejsKKworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VKSB7CisJCS8qIFNldCBWQ08gY2FsaWJyYXRpb24gdm9sdGFnZSB0aHJlc2hvbGQgKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczNCwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9MT19NQVhfU0VUKHZhbCwgMHg3KTsKKwkJdmFsID0gQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0hJX01BWF9TRVQodmFsLCAweGMpOworCQl2YWwgPSBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfTE9fTUlOX1NFVCh2YWwsIDB4Myk7CisJCXZhbCA9IENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9ISV9NSU5fU0VUKHZhbCwgMHg4KTsKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczNCwgdmFsKTsKKwl9CisKKwkvKiBTZXQgdGhlIFZDTyBjYWxpYnJhdGlvbiBjb3VudGVyICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCAmdmFsKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCBwcmVBM0NoaXApCisJCXZhbCA9IENNVV9SRUcwX0NBTF9DT1VOVF9SRVNPTF9TRVQodmFsLCAweDQpOworCWVsc2UKKwkJdmFsID0gQ01VX1JFRzBfQ0FMX0NPVU5UX1JFU09MX1NFVCh2YWwsIDB4Nyk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCB2YWwpOworCisJLyogQ29uZmlndXJlIFBMTCBmb3IgY2FsaWJyYXRpb24gKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsICZ2YWwpOworCXZhbCA9IENNVV9SRUcxX1BMTF9DUF9TRVQodmFsLCAweDEpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VIHx8IHByZUEzQ2hpcCkKKwkJdmFsID0gQ01VX1JFRzFfUExMX0NQX1NFTF9TRVQodmFsLCAweDUpOworCWVsc2UKKwkJdmFsID0gQ01VX1JFRzFfUExMX0NQX1NFTF9TRVQodmFsLCAweDMpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VKQorCQl2YWwgPSBDTVVfUkVHMV9QTExfTUFOVUFMQ0FMX1NFVCh2YWwsIDB4MCk7CisJZWxzZQorCQl2YWwgPSBDTVVfUkVHMV9QTExfTUFOVUFMQ0FMX1NFVCh2YWwsIDB4MSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCB2YWwpOworCisJaWYgKGNtdV90eXBlICE9IFJFRl9DTVUpCisJCWNtdV9jbHJiaXRzKGN0eCwgY211X3R5cGUsIENNVV9SRUc1LCBDTVVfUkVHNV9QTExfUkVTRVRCX01BU0spOworCisJLyogQ29uZmlndXJlIHRoZSBQTEwgZm9yIGVpdGhlciAxMDBNSHogb3IgNTBNSHogKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzIsICZ2YWwpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VKSB7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9MRlJFU19TRVQodmFsLCAweGEpOworCQlyZWZfMTAwTUh6ID0gMTsKKwl9IGVsc2UgeworCQl2YWwgPSBDTVVfUkVHMl9QTExfTEZSRVNfU0VUKHZhbCwgMHgzKTsKKwkJaWYgKGNsa190eXBlID09IENMS19FWFRfRElGRikKKwkJCXJlZl8xMDBNSHogPSAwOworCQllbHNlCisJCQlyZWZfMTAwTUh6ID0gMTsKKwl9CisJaWYgKHJlZl8xMDBNSHopIHsKKwkJdmFsID0gQ01VX1JFRzJfUExMX0ZCRElWX1NFVCh2YWwsIEZCRElWX1ZBTF8xMDBNKTsKKwkJdmFsID0gQ01VX1JFRzJfUExMX1JFRkRJVl9TRVQodmFsLCBSRUZESVZfVkFMXzEwME0pOworCX0gZWxzZSB7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9GQkRJVl9TRVQodmFsLCBGQkRJVl9WQUxfNTBNKTsKKwkJdmFsID0gQ01VX1JFRzJfUExMX1JFRkRJVl9TRVQodmFsLCBSRUZESVZfVkFMXzUwTSk7CisJfQorCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMiwgdmFsKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgVkNPICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczLCAmdmFsKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkgeworCQl2YWwgPSBDTVVfUkVHM19WQ09WQVJTRUxfU0VUKHZhbCwgMHgzKTsKKwkJdmFsID0gQ01VX1JFRzNfVkNPX01PTVNFTF9JTklUX1NFVCh2YWwsIDB4MTApOworCX0gZWxzZSB7CisJCXZhbCA9IENNVV9SRUczX1ZDT1ZBUlNFTF9TRVQodmFsLCAweEYpOworCQlpZiAocHJlQTNDaGlwKQorCQkJdmFsID0gQ01VX1JFRzNfVkNPX01PTVNFTF9JTklUX1NFVCh2YWwsIDB4MTUpOworCQllbHNlCisJCQl2YWwgPSBDTVVfUkVHM19WQ09fTU9NU0VMX0lOSVRfU0VUKHZhbCwgMHgxYSk7CisJCXZhbCA9IENNVV9SRUczX1ZDT19NQU5NT01TRUxfU0VUKHZhbCwgMHgxNSk7CisJfQorCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMywgdmFsKTsKKworCS8qIERpc2FibGUgZm9yY2UgUExMIGxvY2sgKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzI2LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMjZfRk9SQ0VfUExMX0xPQ0tfU0VUKHZhbCwgMHgwKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzI2LCB2YWwpOworCisJLyogU2V0dXAgUExMIGxvb3AgZmlsdGVyICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUc1LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHNV9QTExfTEZTTUNBUF9TRVQodmFsLCAweDMpOworCXZhbCA9IENNVV9SRUc1X1BMTF9MRkNBUF9TRVQodmFsLCAweDMpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VIHx8ICFwcmVBM0NoaXApCisJCXZhbCA9IENNVV9SRUc1X1BMTF9MT0NLX1JFU09MVVRJT05fU0VUKHZhbCwgMHg3KTsKKwllbHNlCisJCXZhbCA9IENNVV9SRUc1X1BMTF9MT0NLX1JFU09MVVRJT05fU0VUKHZhbCwgMHg0KTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzUsIHZhbCk7CisKKwkvKiBFbmFibGUgb3IgZGlzYWJsZSBtYW51YWwgY2FsaWJyYXRpb24gKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzYsICZ2YWwpOworCXZhbCA9IENNVV9SRUc2X1BMTF9WUkVHVFJJTV9TRVQodmFsLCBwcmVBM0NoaXAgPyAweDAgOiAweDIpOworCXZhbCA9IENNVV9SRUc2X01BTl9QVlRfQ0FMX1NFVCh2YWwsIHByZUEzQ2hpcCA/IDB4MSA6IDB4MCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUc2LCB2YWwpOworCisJLyogQ29uZmlndXJlIGxhbmUgZm9yIDIwLWJpdHMgKi8KKwlpZiAoY211X3R5cGUgPT0gUEhZX0NNVSkgeworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzksICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHOV9UWF9XT1JEX01PREVfQ0gxX1NFVCh2YWwsCisJCQkJCQkgICAgQ01VX1JFRzlfV09SRF9MRU5fMjBCSVQpOworCQl2YWwgPSBDTVVfUkVHOV9UWF9XT1JEX01PREVfQ0gwX1NFVCh2YWwsCisJCQkJCQkgICAgQ01VX1JFRzlfV09SRF9MRU5fMjBCSVQpOworCQl2YWwgPSBDTVVfUkVHOV9QTExfUE9TVF9ESVZCWTJfU0VUKHZhbCwgMHgxKTsKKwkJaWYgKCFwcmVBM0NoaXApIHsKKwkJCXZhbCA9IENNVV9SRUc5X1ZCR19CWVBBU1NCX1NFVCh2YWwsIDB4MCk7CisJCQl2YWwgPSBDTVVfUkVHOV9JR0VOX0JZUEFTU19TRVQodmFsICwgMHgwKTsKKwkJfQorCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzksIHZhbCk7CisKKwkJaWYgKCFwcmVBM0NoaXApIHsKKwkJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTAsICZ2YWwpOworCQkJdmFsID0gQ01VX1JFRzEwX1ZSRUdfUkVGU0VMX1NFVCh2YWwsIDB4MSk7CisJCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEwLCB2YWwpOworCQl9CisJfQorCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNiwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzE2X0NBTElCUkFUSU9OX0RPTkVfT1ZFUlJJREVfU0VUKHZhbCwgMHgxKTsKKwl2YWwgPSBDTVVfUkVHMTZfQllQQVNTX1BMTF9MT0NLX1NFVCh2YWwsIDB4MSk7CisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUgfHwgcHJlQTNDaGlwKQorCQl2YWwgPSBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKHZhbCwgMHg0KTsKKwllbHNlCisJCXZhbCA9IENNVV9SRUcxNl9WQ09DQUxfV0FJVF9CVFdfQ09ERV9TRVQodmFsLCAweDcpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTYsIHZhbCk7CisKKwkvKiBDb25maWd1cmUgZm9yIFNBVEEgKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMwLCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMzBfUENJRV9NT0RFX1NFVCh2YWwsIDB4MCk7CisJdmFsID0gQ01VX1JFRzMwX0xPQ0tfQ09VTlRfU0VUKHZhbCwgMHgzKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMwLCB2YWwpOworCisJLyogRGlzYWJsZSBzdGF0ZSBtYWNoaW5lIGJ5cGFzcyAqLworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzEsIDB4Rik7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMyLCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMzJfUFZUX0NBTF9XQUlUX1NFTF9TRVQodmFsLCAweDMpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VIHx8IHByZUEzQ2hpcCkKKwkJdmFsID0gQ01VX1JFRzMyX0lSRUZfQURKX1NFVCh2YWwsIDB4Myk7CisJZWxzZQorCQl2YWwgPSBDTVVfUkVHMzJfSVJFRl9BREpfU0VUKHZhbCwgMHgxKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMyLCB2YWwpOworCisJLyogU2V0IFZDTyBjYWxpYnJhdGlvbiB0aHJlc2hvbGQgKi8KKwlpZiAoY211X3R5cGUgIT0gUkVGX0NNVSAmJiBwcmVBM0NoaXApCisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzQsIDB4OGQyNyk7CisJZWxzZQorCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM0LCAweDg3M2MpOworCisJLyogU2V0IENUTEUgT3ZlcnJpZGUgYW5kIG92ZXJyaWRlIHdhaXRpbmcgZnJvbSBzdGF0ZSBtYWNoaW5lICovCisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczNywgMHhGMDBGKTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X3NzY19lbmFibGUoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlKQoreworCXUzMiB2YWw7CisKKwkvKiBTZXQgU1NDIG1vZHVsYXRpb24gdmFsdWUgKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM1LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMzVfUExMX1NTQ19NT0RfU0VUKHZhbCwgOTgpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzUsIHZhbCk7CisKKwkvKiBFbmFibGUgU1NDLCBzZXQgdmVydGljYWwgc3RlcCBhbmQgRFNNIHZhbHVlICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczNiwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzM2X1BMTF9TU0NfVlNURVBfU0VUKHZhbCwgMzApOworCXZhbCA9IENNVV9SRUczNl9QTExfU1NDX0VOX1NFVCh2YWwsIDEpOworCXZhbCA9IENNVV9SRUczNl9QTExfU1NDX0RTTVNFTF9TRVQodmFsLCAxKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM2LCB2YWwpOworCisJLyogUmVzZXQgdGhlIFBMTCAqLworCWNtdV9jbHJiaXRzKGN0eCwgY211X3R5cGUsIENNVV9SRUc1LCBDTVVfUkVHNV9QTExfUkVTRVRCX01BU0spOworCWNtdV9zZXRiaXRzKGN0eCwgY211X3R5cGUsIENNVV9SRUc1LCBDTVVfUkVHNV9QTExfUkVTRVRCX01BU0spOworCisJLyogRm9yY2UgVkNPIGNhbGlicmF0aW9uIHRvIHJlc3RhcnQgKi8KKwljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzIsCisJCSAgICAgICBDTVVfUkVHMzJfRk9SQ0VfVkNPQ0FMX1NUQVJUX01BU0spOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9waHlfc2F0YV9jZmdfbGFuZXMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCkKK3sKKwl1MzIgdmFsOworCXUzMiByZWc7CisJaW50IGk7CisJaW50IGxhbmU7CisKKwlmb3IgKGxhbmUgPSAwOyBsYW5lIDwgTUFYX0xBTkU7IGxhbmUrKykgeworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzE0NywgMHg2KTsKKworCQkvKiBTZXQgYm9vc3QgY29udHJvbCBmb3IgcXVhcnRlciwgaGFsZiwgYW5kIGZ1bGwgcmF0ZSAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzAsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzBfQ1RMRV9FUV9IUl9TRVQodmFsLCAweDEwKTsKKwkJdmFsID0gUlhUWF9SRUcwX0NUTEVfRVFfUVJfU0VUKHZhbCwgMHgxMCk7CisJCXZhbCA9IFJYVFhfUkVHMF9DVExFX0VRX0ZSX1NFVCh2YWwsIDB4MTApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzAsIHZhbCk7CisKKwkJLyogU2V0IGJvb3N0IGNvbnRyb2wgdmFsdWUgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxX1JYQUNWQ01fU0VUKHZhbCwgMHg3KTsKKwkJdmFsID0gUlhUWF9SRUcxX0NUTEVfRVFfU0VUKHZhbCwKKwkJCWN0eC0+c2F0YV9wYXJhbS50eGJvb3N0Z2FpbltsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxLCB2YWwpOworCisJCS8qIExhdGNoIFZUVCB2YWx1ZSBiYXNlZCBvbiB0aGUgdGVybWluYXRpb24gdG8gZ3JvdW5kIGFuZAorCQkgICBlbmFibGUgVFggRklGTyAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzIsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzJfVlRUX0VOQV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzJfVlRUX1NFTF9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzJfVFhfRklGT19FTkFfU0VUKHZhbCwgMHgxKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcyLCB2YWwpOworCisJCS8qIENvbmZpZ3VyZSBUeCBmb3IgMjAtYml0cyAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzQsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzRfVFhfV09SRF9NT0RFX1NFVCh2YWwsIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc0LCB2YWwpOworCisJCWlmICghcHJlQTNDaGlwKSB7CisJCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEsICZ2YWwpOworCQkJdmFsID0gUlhUWF9SRUcxX1JYVlJFRzFfU0VUKHZhbCwgMHgyKTsKKwkJCXZhbCA9IFJYVFhfUkVHMV9SWElSRUZfQURKX1NFVCh2YWwsIDB4Mik7CisJCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEsIHZhbCk7CisJCX0KKworCQkvKiBTZXQgcHJlLWVtcGhhc2lzIGZpcnN0IDEgYW5kIDIsIGFuZCBwb3N0LWVtcGhhc2lzIHZhbHVlcyAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzUsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzVfVFhfQ04xX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhwcmVjdXJzb3JfY24xW2xhbmUgKiAzICsKKwkJCWN0eC0+c2F0YV9wYXJhbS5zcGVlZFtsYW5lXV0pOworCQl2YWwgPSBSWFRYX1JFRzVfVFhfQ1AxX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhwb3N0Y3Vyc29yX2NwMVtsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJdmFsID0gUlhUWF9SRUc1X1RYX0NOMl9TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4cHJlY3Vyc29yX2NuMltsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc1LCB2YWwpOworCisJCS8qIFNldCBUWCBhbXBsaXR1ZGUgdmFsdWUgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc2LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc2X1RYQU1QX0NOVExfU0VUKHZhbCwKKwkJCWN0eC0+c2F0YV9wYXJhbS50eGFtcGxpdHVkZVtsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJdmFsID0gUlhUWF9SRUc2X1RYQU1QX0VOQV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzZfVFhfSURMRV9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzZfUlhfQklTVF9SRVNZTkNfU0VUKHZhbCwgMHgwKTsKKwkJdmFsID0gUlhUWF9SRUc2X1JYX0JJU1RfRVJSQ05UX1JEX1NFVCh2YWwsIDB4MCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNiwgdmFsKTsKKworCQkvKiBDb25maWd1cmUgUnggZm9yIDIwLWJpdHMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc3LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc3X0JJU1RfRU5BX1JYX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHN19SWF9XT1JEX01PREVfU0VUKHZhbCwgQ01VX1JFRzlfV09SRF9MRU5fMjBCSVQpOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzcsIHZhbCk7CisKKwkJLyogU2V0IENEUiBhbmQgTE9TIHZhbHVlcyBhbmQgZW5hYmxlIFJ4IFNTQyAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzgsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzhfQ0RSX0xPT1BfRU5BX1NFVCh2YWwsIDB4MSk7CisJCXZhbCA9IFJYVFhfUkVHOF9DRFJfQllQQVNTX1JYTE9TX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHOF9TU0NfRU5BQkxFX1NFVCh2YWwsIDB4MSk7CisJCXZhbCA9IFJYVFhfUkVHOF9TRF9ESVNBQkxFX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHOF9TRF9WUkVGX1NFVCh2YWwsIDB4NCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHOCwgdmFsKTsKKworCQkvKiBTZXQgcGhhc2UgYWRqdXN0IHVwcGVyL2xvd2VyIGxpbWl0cyAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzExLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxMV9QSEFTRV9BREpVU1RfTElNSVRfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMSwgdmFsKTsKKworCQkvKiBFbmFibGUgTGF0Y2ggT2ZmOyBkaXNhYmxlIFNVTU9TIGFuZCBUeCB0ZXJtaW5hdGlvbiAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxMl9MQVRDSF9PRkZfRU5BX1NFVCh2YWwsIDB4MSk7CisJCXZhbCA9IFJYVFhfUkVHMTJfU1VNT1NfRU5BQkxFX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHMTJfUlhfREVUX1RFUk1fRU5BQkxFX1NFVCh2YWwsIDB4MCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTIsIHZhbCk7CisKKwkJLyogU2V0IHBlcmlvZCBlcnJvciBsYXRjaCB0byA1MTJUIGFuZCBlbmFibGUgQldMICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMjYsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzI2X1BFUklPRF9FUlJPUl9MQVRDSF9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzI2X0JMV0NfRU5BX1NFVCh2YWwsIDB4MSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjYsIHZhbCk7CisKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcyOCwgMHgwKTsKKworCQkvKiBTZXQgREZFIGxvb3AgcHJlc2V0IHZhbHVlICovCisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMzEsIDB4MCk7CisKKwkJLyogU2V0IEV5ZSBNb25pdG9yIGNvdW50ZXIgd2lkdGggdG8gMTItYml0ICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHNjEsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzYxX0lTQ0FOX0lOQkVSVF9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzYxX0xPQURGUkVRX1NISUZUX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHNjFfRVlFX0NPVU5UX1dJRFRIX1NFTF9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzYxLCB2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHNjIsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzYyX1BFUklPRF9IMV9RTEFUQ0hfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc2MiwgdmFsKTsKKworCQkvKiBTZXQgQlcgc2VsZWN0IHRhcCBYIGZvciBERkUgbG9vcCAqLworCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCQlyZWcgPSBSWFRYX1JFRzgxICsgaSAqIDI7CisJCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCByZWcsICZ2YWwpOworCQkJdmFsID0gUlhUWF9SRUc4OV9NVV9USDdfU0VUKHZhbCwgMHhlKTsKKwkJCXZhbCA9IFJYVFhfUkVHODlfTVVfVEg4X1NFVCh2YWwsIDB4ZSk7CisJCQl2YWwgPSBSWFRYX1JFRzg5X01VX1RIOV9TRVQodmFsLCAweGUpOworCQkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgcmVnLCB2YWwpOworCQl9CisKKwkJLyogU2V0IEJXIHNlbGVjdCB0YXAgWCBmb3IgZnJlcXVlbmN5IGFkanVzdCBsb29wICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXJlZyA9IFJYVFhfUkVHOTYgKyBpICogMjsKKwkJCXNlcmRlc19yZChjdHgsIGxhbmUsIHJlZywgJnZhbCk7CisJCQl2YWwgPSBSWFRYX1JFRzk2X01VX0ZSRVExX1NFVCh2YWwsIDB4MTApOworCQkJdmFsID0gUlhUWF9SRUc5Nl9NVV9GUkVRMl9TRVQodmFsLCAweDEwKTsKKwkJCXZhbCA9IFJYVFhfUkVHOTZfTVVfRlJFUTNfU0VUKHZhbCwgMHgxMCk7CisJCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCByZWcsIHZhbCk7CisJCX0KKworCQkvKiBTZXQgQlcgc2VsZWN0IHRhcCBYIGZvciBwaGFzZSBhZGp1c3QgbG9vcCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlyZWcgPSBSWFRYX1JFRzk5ICsgaSAqIDI7CisJCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCByZWcsICZ2YWwpOworCQkJdmFsID0gUlhUWF9SRUc5OV9NVV9QSEFTRTFfU0VUKHZhbCwgMHg3KTsKKwkJCXZhbCA9IFJYVFhfUkVHOTlfTVVfUEhBU0UyX1NFVCh2YWwsIDB4Nyk7CisJCQl2YWwgPSBSWFRYX1JFRzk5X01VX1BIQVNFM19TRVQodmFsLCAweDcpOworCQkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgcmVnLCB2YWwpOworCQl9CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMDIsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzEwMl9GUkVRTE9PUF9MSU1JVF9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEwMiwgdmFsKTsKKworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzExNCwgMHhmZmUwKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNSwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTI1X1NJR05fUFFfU0VUKHZhbCwKKwkJCWN0eC0+c2F0YV9wYXJhbS50eGV5ZWRpcmVjdGlvbltsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJdmFsID0gUlhUWF9SRUcxMjVfUFFfUkVHX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhleWV0dW5pbmdbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHMTI1X1BIWl9NQU5VQUxfU0VUKHZhbCwgMHgxKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjUsIHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzEyN19MQVRDSF9NQU5fQ0FMX0VOQV9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywgdmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyOCwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTI4X0xBVENIX0NBTF9XQUlUX1NFTF9TRVQodmFsLCAweDMpOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyOCwgdmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzE0NSwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTQ1X1JYREZFX0NPTkZJR19TRVQodmFsLCAweDMpOworCQl2YWwgPSBSWFRYX1JFRzE0NV9UWF9JRExFX1NBVEFfU0VUKHZhbCwgMHgwKTsKKwkJaWYgKHByZUEzQ2hpcCkgeworCQkJdmFsID0gUlhUWF9SRUcxNDVfUlhFU19FTkFfU0VUKHZhbCwgMHgxKTsKKwkJCXZhbCA9IFJYVFhfUkVHMTQ1X1JYVldFU19MQVRFTkFfU0VUKHZhbCwgMHgxKTsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IFJYVFhfUkVHMTQ1X1JYRVNfRU5BX1NFVCh2YWwsIDB4MCk7CisJCQl2YWwgPSBSWFRYX1JFRzE0NV9SWFZXRVNfTEFURU5BX1NFVCh2YWwsIDB4MCk7CisJCX0KKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNDUsIHZhbCk7CisKKwkJLyoKKwkJICogU2V0IFJ4IExPUyBmaWx0ZXIgY2xvY2sgcmF0ZSwgc2FtcGxlIHJhdGUsIGFuZCB0aHJlc2hvbGQKKwkJICogd2luZG93cworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJcmVnID0gUlhUWF9SRUcxNDggKyBpICogMjsKKwkJCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgMHhGRkZGKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB4Z2VuZV9waHlfY2FsX3JkeV9jaGsoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJCSBlbnVtIGNsa190eXBlX3QgY2xrX3R5cGUpCit7CisJdm9pZCBfX2lvbWVtICpjc3Jfc2VyZGVzID0gY3R4LT5zZHNfYmFzZTsKKwlpbnQgbG9vcDsKKwl1MzIgdmFsOworCisJLyogUmVsZWFzZSBQSFkgbWFpbiByZXNldCAqLworCXdyaXRlbCgweGRmLCBjc3Jfc2VyZGVzICsgU0FUQV9FTkVUX1NEU19SU1RfQ1RMKTsKKwlyZWFkbChjc3Jfc2VyZGVzICsgU0FUQV9FTkVUX1NEU19SU1RfQ1RMKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisKKwlpZiAoY211X3R5cGUgIT0gUkVGX0NNVSkgeworCQljbXVfc2V0Yml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKwkJLyoKKwkJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIFBMTCByZXNldCByZXF1aXJlcyBhIG1pbmltdW0KKwkJICogb2YgODAwdXMuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoODAwLCAxMDAwKTsKKworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMV9QTExfTUFOVUFMQ0FMX1NFVCh2YWwsIDB4MCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKwkJLyoKKwkJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIFBMTCBhdXRvIGNhbGlicmF0aW9uIHJlcXVpcmVzCisJCSAqIGEgbWluaW11bSBvZiA4MDB1cy4KKwkJICovCisJCXVzbGVlcF9yYW5nZSg4MDAsIDEwMDApOworCisJCWNtdV90b2dnbGUxdG8wKGN0eCwgY211X3R5cGUsIENNVV9SRUczMiwKKwkJCSAgICAgICBDTVVfUkVHMzJfRk9SQ0VfVkNPQ0FMX1NUQVJUX01BU0spOworCQkvKgorCQkgKiBBcyBwZXIgUEhZIGRlc2lnbiBzcGVjLCB0aGUgUExMIHJlcXVpcmVzIGEgbWluaW11bSBvZgorCQkgKiA4MDB1cyB0byBzZXR0bGUuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoODAwLCAxMDAwKTsKKwl9CisKKwlpZiAoIXByZUEzQ2hpcCkKKwkJZ290byBza2lwX21hbnVhbF9jYWw7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgdGVybWluYXRpb24gcmVzaXN0ZXIgY2FsaWJyYXRpb24KKwkgKiBUaGUgc2VyaWFsIHJlY2VpdmUgcGlucywgUlhQL1JYTiwgaGF2ZSBURVJNaW5hdGlvbiByZXNpc3RvcgorCSAqIHRoYXQgaXMgcmVxdWlyZWQgdG8gYmUgY2FsaWJyYXRlZC4KKwkgKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE3LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMTdfUFZUX0NPREVfUjJBX1NFVCh2YWwsIDB4MTIpOworCXZhbCA9IENNVV9SRUcxN19SRVNFUlZFRF83X1NFVCh2YWwsIDB4MCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgdmFsKTsKKwljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsCisJCSAgICAgICBDTVVfUkVHMTdfUFZUX1RFUk1fTUFOX0VOQV9NQVNLKTsKKwkvKgorCSAqIFRoZSBzZXJpYWwgdHJhbnNtaXQgcGlucywgVFhQL1RYTiwgaGF2ZSBQdWxsLVVQIGFuZCBQdWxsLURPV04KKwkgKiByZXNpc3RvcnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gdGhlIGNhbGlicmF0ZWQuCisJICogQ29uZmlndXJlIHRoZSBwdWxsIERPV04gY2FsaWJyYXRpb24KKwkgKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE3LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMTdfUFZUX0NPREVfUjJBX1NFVCh2YWwsIDB4MjkpOworCXZhbCA9IENNVV9SRUcxN19SRVNFUlZFRF83X1NFVCh2YWwsIDB4MCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgdmFsKTsKKwljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTYsCisJCSAgICAgICBDTVVfUkVHMTZfUFZUX0ROX01BTl9FTkFfTUFTSyk7CisJLyogQ29uZmlndXJlIHRoZSBwdWxsIFVQIGNhbGlicmF0aW9uICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgJnZhbCk7CisJdmFsID0gQ01VX1JFRzE3X1BWVF9DT0RFX1IyQV9TRVQodmFsLCAweDI4KTsKKwl2YWwgPSBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQodmFsLCAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsIHZhbCk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE2LAorCQkgICAgICAgQ01VX1JFRzE2X1BWVF9VUF9NQU5fRU5BX01BU0spOworCitza2lwX21hbnVhbF9jYWw6CisJLyogUG9sbCB0aGUgUExMIGNhbGlicmF0aW9uIGNvbXBsZXRpb24gc3RhdHVzIGZvciBhdCBsZWFzdCAxIG1zICovCisJbG9vcCA9IDEwMDsKKwlkbyB7CisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHNywgJnZhbCk7CisJCWlmIChDTVVfUkVHN19QTExfQ0FMSUJfRE9ORV9SRCh2YWwpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIFBMTCBjYWxpYnJhdGlvbiBzdGF0dXMgcmVxdWlyZXMKKwkJICogYSBtaW5pbXVtIG9mIDEwdXMgdG8gYmUgdXBkYXRlZC4KKwkJICovCisJCXVzbGVlcF9yYW5nZSgxMCwgMTAwKTsKKwl9IHdoaWxlICgtLWxvb3AgPiAwKTsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHNywgJnZhbCk7CisJZGV2X2RiZyhjdHgtPmRldiwgIlBMTCBjYWxpYnJhdGlvbiAlc1xuIiwKKwkJQ01VX1JFRzdfUExMX0NBTElCX0RPTkVfUkQodmFsKSA/ICJkb25lIiA6ICJmYWlsZWQiKTsKKwlpZiAoQ01VX1JFRzdfVkNPX0NBTF9GQUlMX1JEKHZhbCkpIHsKKwkJZGV2X2VycihjdHgtPmRldiwKKwkJCSJQTEwgY2FsaWJyYXRpb24gZmFpbGVkIGR1ZSB0byBWQ08gZmFpbHVyZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZGV2X2RiZyhjdHgtPmRldiwgIlBMTCBjYWxpYnJhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTUsICZ2YWwpOworCWRldl9kYmcoY3R4LT5kZXYsICJQSFkgVHggaXMgJXNyZWFkeVxuIiwgdmFsICYgMHgzMDAgPyAiIiA6ICJub3QgIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9wZHduX2ZvcmNlX3ZjbyhzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LAorCQkJCSAgICAgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJCSAgICAgZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXUzMiB2YWw7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVzZXQgVkNPIGFuZCByZS1zdGFydCBhZ2FpblxuIik7CisJaWYgKGNtdV90eXBlID09IFBIWV9DTVUpIHsKKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNiwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxNl9WQ09DQUxfV0FJVF9CVFdfQ09ERV9TRVQodmFsLCAweDcpOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE2LCB2YWwpOworCX0KKworCWNtdV90b2dnbGUxdG8wKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCBDTVVfUkVHMF9QRE9XTl9NQVNLKTsKKwljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzIsCisJCSAgICAgICBDTVVfUkVHMzJfRk9SQ0VfVkNPQ0FMX1NUQVJUX01BU0spOworfQorCitzdGF0aWMgaW50IHhnZW5lX3BoeV9od19pbml0X3NhdGEoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgIGVudW0gY2xrX3R5cGVfdCBjbGtfdHlwZSwgaW50IHNzY19lbmFibGUpCit7CisJdm9pZCBfX2lvbWVtICpzZHNfYmFzZSA9IGN0eC0+c2RzX2Jhc2U7CisJdTMyIHZhbDsKKwlpbnQgaTsKKworCS8qIENvbmZpZ3VyZSB0aGUgUEhZIGZvciBvcGVyYXRpb24gKi8KKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVzZXQgUEhZXG4iKTsKKwkvKiBQbGFjZSBQSFkgaW50byByZXNldCAqLworCXdyaXRlbCgweDAsIHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19SU1RfQ1RMKTsKKwl2YWwgPSByZWFkbChzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CS8qIEZvcmNlIGEgYmFycmllciAqLworCS8qIFJlbGVhc2UgUEhZIGxhbmUgZnJvbSByZXNldCAoYWN0aXZlIGhpZ2gpICovCisJd3JpdGVsKDB4MjAsIHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19SU1RfQ1RMKTsKKwlyZWFkbChzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CS8qIEZvcmNlIGEgYmFycmllciAqLworCS8qIFJlbGVhc2UgYWxsIFBIWSBtb2R1bGUgb3V0IG9mIHJlc2V0IGV4Y2VwdCBQSFkgbWFpbiByZXNldCAqLworCXdyaXRlbCgweGRlLCBzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKworCS8qIFNldCB0aGUgb3BlcmF0aW9uIHNwZWVkICovCisJdmFsID0gcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX0NUTDEpOworCXZhbCA9IENGR19JX1NQRF9TRUxfQ0RSX09WUjFfU0VUKHZhbCwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4c3BlZWRbY3R4LT5zYXRhX3BhcmFtLnNwZWVkWzBdXSk7CisJd3JpdGVsKHZhbCwgc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX0NUTDEpOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlNldCB0aGUgY3VzdG9tZXIgcGluIG1vZGUgdG8gU0FUQVxuIik7CisJdmFsID0gcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX0NUTDApOworCXZhbCA9IFJFR1NQRUNfQ0ZHX0lfQ1VTVE9NRVJfUElOX01PREUwX1NFVCh2YWwsIDB4NDQyMSk7CisJd3JpdGVsKHZhbCwgc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX0NUTDApOworCisJLyogQ29uZmlndXJlIHRoZSBjbG9jayBtYWNybyB1bml0IChDTVUpIGNsb2NrIHR5cGUgKi8KKwl4Z2VuZV9waHlfY2ZnX2NtdV9jbGtfdHlwZShjdHgsIFBIWV9DTVUsIGNsa190eXBlKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgbWFjcm8gKi8KKwl4Z2VuZV9waHlfc2F0YV9jZmdfY211X2NvcmUoY3R4LCBQSFlfQ01VLCBjbGtfdHlwZSk7CisKKwkvKiBFbmFibGUgU1NDIGlmIGVuYWJsZWQgKi8KKwlpZiAoc3NjX2VuYWJsZSkKKwkJeGdlbmVfcGh5X3NzY19lbmFibGUoY3R4LCBQSFlfQ01VKTsKKworCS8qIENvbmZpZ3VyZSBQSFkgbGFuZXMgKi8KKwl4Z2VuZV9waHlfc2F0YV9jZmdfbGFuZXMoY3R4KTsKKworCS8qIFNldCBSeC9UeCAyMC1iaXQgKi8KKwl2YWwgPSByZWFkbChzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUENTX0NUTDApOworCXZhbCA9IFJFR1NQRUNfQ0ZHX0lfUlhfV09SRE1PREUwX1NFVCh2YWwsIDB4Myk7CisJdmFsID0gUkVHU1BFQ19DRkdfSV9UWF9XT1JETU9ERTBfU0VUKHZhbCwgMHgzKTsKKwl3cml0ZWwodmFsLCBzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUENTX0NUTDApOworCisJLyogU3RhcnQgUExMIGNhbGlicmF0aW9uIGFuZCB0cnkgZm9yIHRocmVlIHRpbWVzICovCisJaSA9IDEwOworCWRvIHsKKwkJaWYgKCF4Z2VuZV9waHlfY2FsX3JkeV9jaGsoY3R4LCBQSFlfQ01VLCBjbGtfdHlwZSkpCisJCQlicmVhazsKKwkJLyogSWYgZmFpbGVkLCB0b2dnbGUgdGhlIFZDTyBwb3dlciBzaWduYWwgYW5kIHN0YXJ0IGFnYWluICovCisJCXhnZW5lX3BoeV9wZHduX2ZvcmNlX3ZjbyhjdHgsIFBIWV9DTVUsIGNsa190eXBlKTsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwkvKiBFdmVuIG9uIGZhaWx1cmUsIGFsbG93IHRvIGNvbnRpbnVlIGFueSB3YXkgKi8KKwlpZiAoaSA8PSAwKQorCQlkZXZfZXJyKGN0eC0+ZGV2LCAiUExMIGNhbGlicmF0aW9uIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2VuZV9waHlfaHdfaW5pdGlhbGl6ZShzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LAorCQkJCSAgIGVudW0gY2xrX3R5cGVfdCBjbGtfdHlwZSwKKwkJCQkgICBpbnQgc3NjX2VuYWJsZSkKK3sKKwlpbnQgcmM7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUEhZIGluaXQgY2xrIHR5cGUgJWRcbiIsIGNsa190eXBlKTsKKworCWlmIChjdHgtPm1vZGUgPT0gTU9ERV9TQVRBKSB7CisJCXJjID0geGdlbmVfcGh5X2h3X2luaXRfc2F0YShjdHgsIGNsa190eXBlLCBzc2NfZW5hYmxlKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0gZWxzZSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJVbi1zdXBwb3J0ZWQgY3VzdG9tZXIgcGluIG1vZGUgJWRcbiIsCisJCQljdHgtPm1vZGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlY2VpdmVyIE9mZnNldCBDYWxpYnJhdGlvbjoKKyAqCisgKiBDYWxpYnJhdGUgdGhlIHJlY2VpdmVyIHNpZ25hbCBwYXRoIG9mZnNldCBpbiB0d28gc3RlcHMgLSBzdW1tYXIgYW5kCisgKiBsYXRjaCBjYWxpYnJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgeGdlbmVfcGh5X2ZvcmNlX2xhdF9zdW1tZXJfY2FsKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGludCBsYW5lKQoreworCWludCBpOworCXN0cnVjdCB7CisJCXUzMiByZWc7CisJCXUzMiB2YWw7CisJfSBzZXJkZXNfcmVnW10gPSB7CisJCXtSWFRYX1JFRzM4LCAweDB9LAorCQl7UlhUWF9SRUczOSwgMHhmZjAwfSwKKwkJe1JYVFhfUkVHNDAsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQxLCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0MiwgMHhmZmZmfSwKKwkJe1JYVFhfUkVHNDMsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQ0LCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0NSwgMHhmZmZmfSwKKwkJe1JYVFhfUkVHNDYsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQ3LCAweGZmZmN9LAorCQl7UlhUWF9SRUc0OCwgMHgwfSwKKwkJe1JYVFhfUkVHNDksIDB4MH0sCisJCXtSWFRYX1JFRzUwLCAweDB9LAorCQl7UlhUWF9SRUc1MSwgMHgwfSwKKwkJe1JYVFhfUkVHNTIsIDB4MH0sCisJCXtSWFRYX1JFRzUzLCAweDB9LAorCQl7UlhUWF9SRUc1NCwgMHgwfSwKKwkJe1JYVFhfUkVHNTUsIDB4MH0sCisJfTsKKworCS8qIFN0YXJ0IFNVTU1FUiBjYWxpYnJhdGlvbiAqLworCXNlcmRlc19zZXRiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsCisJCSAgICAgICBSWFRYX1JFRzEyN19GT1JDRV9TVU1fQ0FMX1NUQVJUX01BU0spOworCS8qCisJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIFN1bW1lciBjYWxpYnJhdGlvbiByZXF1aXJlcyBhIG1pbmltdW0KKwkgKiBvZiAxMDB1cyB0byBjb21wbGV0ZS4KKwkgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwLCA1MDApOworCXNlcmRlc19jbHJiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsCisJCQlSWFRYX1JFRzEyN19GT1JDRV9TVU1fQ0FMX1NUQVJUX01BU0spOworCS8qCisJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIGF1dG8gY2FsaWJyYXRpb24gcmVxdWlyZXMgYSBtaW5pbXVtCisJICogb2YgMTAwdXMgdG8gY29tcGxldGUuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKworCS8qIFN0YXJ0IGxhdGNoIGNhbGlicmF0aW9uICovCisJc2VyZGVzX3NldGJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywKKwkJICAgICAgIFJYVFhfUkVHMTI3X0ZPUkNFX0xBVF9DQUxfU1RBUlRfTUFTSyk7CisJLyoKKwkgKiBBcyBwZXIgUEhZIGRlc2lnbiBzcGVjLCB0aGUgbGF0Y2ggY2FsaWJyYXRpb24gcmVxdWlyZXMgYSBtaW5pbXVtCisJICogb2YgMTAwdXMgdG8gY29tcGxldGUuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwlzZXJkZXNfY2xyYml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LAorCQkgICAgICAgUlhUWF9SRUcxMjdfRk9SQ0VfTEFUX0NBTF9TVEFSVF9NQVNLKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgUEhZIGxhbmUgZm9yIGNhbGlicmF0aW9uICovCisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcyOCwgMHg3KTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzMxLCAweDdlMDApOworCXNlcmRlc19jbHJiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUc0LAorCQkgICAgICAgUlhUWF9SRUc0X1RYX0xPT1BCQUNLX0JVRl9FTl9NQVNLKTsKKwlzZXJkZXNfY2xyYml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHNywKKwkJICAgICAgIFJYVFhfUkVHN19MT09QX0JBQ0tfRU5BX0NUTEVfTUFTSyk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VyZGVzX3JlZyk7IGkrKykKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgc2VyZGVzX3JlZ1tpXS5yZWcsCisJCQkgIHNlcmRlc19yZWdbaV0udmFsKTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X3Jlc2V0X3J4ZChzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSkKK3sKKwkvKiBSZXNldCBkaWdpdGFsIFJ4ICovCisJc2VyZGVzX2NscmJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzcsIFJYVFhfUkVHN19SRVNFVEJfUlhEX01BU0spOworCS8qIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSByZXNldCByZXF1aXJlcyBhIG1pbmltdW0gb2YgMTAwdXMuICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTUwKTsKKwlzZXJkZXNfc2V0Yml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHNywgUlhUWF9SRUc3X1JFU0VUQl9SWERfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfcGh5X2dldF9hdmcoaW50IGFjY3VtLCBpbnQgc2FtcGxlcykKK3sKKwlyZXR1cm4gKGFjY3VtICsgKHNhbXBsZXMgLyAyKSkgLyBzYW1wbGVzOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9waHlfZ2VuX2F2Z192YWwoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUpCit7CisJaW50IG1heF9sb29wID0gMTA7CisJaW50IGF2Z19sb29wID0gMDsKKwlpbnQgbGF0X2RvID0gMCwgbGF0X3hvID0gMCwgbGF0X2VvID0gMCwgbGF0X3NvID0gMDsKKwlpbnQgbGF0X2RlID0gMCwgbGF0X3hlID0gMCwgbGF0X2VlID0gMCwgbGF0X3NlID0gMDsKKwlpbnQgc3VtX2NhbCA9IDA7CisJaW50IGxhdF9kb19pdHIsIGxhdF94b19pdHIsIGxhdF9lb19pdHIsIGxhdF9zb19pdHI7CisJaW50IGxhdF9kZV9pdHIsIGxhdF94ZV9pdHIsIGxhdF9lZV9pdHIsIGxhdF9zZV9pdHI7CisJaW50IHN1bV9jYWxfaXRyOworCWludCBmYWlsX2V2ZW47CisJaW50IGZhaWxfb2RkOworCXUzMiB2YWw7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiR2VuZXJhdGluZyBhdmcgY2FsaWJyYXRpb24gdmFsdWUgZm9yIGxhbmUgJWRcbiIsCisJCWxhbmUpOworCisJLyogRW5hYmxlIFJYIEhpLVogdGVybWluYXRpb24gKi8KKwlzZXJkZXNfc2V0Yml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHMTIsCisJCQlSWFRYX1JFRzEyX1JYX0RFVF9URVJNX0VOQUJMRV9NQVNLKTsKKwkvKiBUdXJuIG9mZiBERkUgKi8KKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzI4LCAweDAwMDApOworCS8qIERGRSBQcmVzZXRzIHRvIHplcm8gKi8KKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzMxLCAweDAwMDApOworCisJLyoKKwkgKiBSZWNlaXZlciBPZmZzZXQgQ2FsaWJyYXRpb246CisJICogQ2FsaWJyYXRlIHRoZSByZWNlaXZlciBzaWduYWwgcGF0aCBvZmZzZXQgaW4gdHdvIHN0ZXBzIC0gc3VtbWFyCisJICogYW5kIGxhdGNoIGNhbGlicmF0aW9uLgorCSAqIFJ1bnMgdGhlICJSZWNlaXZlciBPZmZzZXQgQ2FsaWJyYXRpb24gbXVsdGlwbGUgdGltZXMgdG8gZGV0ZXJtaW5lCisJICogdGhlIGF2ZXJhZ2UgdmFsdWUgdG8gdXNlLgorCSAqLworCXdoaWxlIChhdmdfbG9vcCA8IG1heF9sb29wKSB7CisJCS8qIFN0YXJ0IHRoZSBjYWxpYnJhdGlvbiAqLworCQl4Z2VuZV9waHlfZm9yY2VfbGF0X3N1bW1lcl9jYWwoY3R4LCBsYW5lKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzIxLCAmdmFsKTsKKwkJbGF0X2RvX2l0ciA9IFJYVFhfUkVHMjFfRE9fTEFUQ0hfQ0FMT1VUX1JEKHZhbCk7CisJCWxhdF94b19pdHIgPSBSWFRYX1JFRzIxX1hPX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlmYWlsX29kZCA9IFJYVFhfUkVHMjFfTEFUQ0hfQ0FMX0ZBSUxfT0REX1JEKHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyMiwgJnZhbCk7CisJCWxhdF9lb19pdHIgPSBSWFRYX1JFRzIyX0VPX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlsYXRfc29faXRyID0gUlhUWF9SRUcyMl9TT19MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJZmFpbF9ldmVuID0gUlhUWF9SRUcyMl9MQVRDSF9DQUxfRkFJTF9FVkVOX1JEKHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyMywgJnZhbCk7CisJCWxhdF9kZV9pdHIgPSBSWFRYX1JFRzIzX0RFX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlsYXRfeGVfaXRyID0gUlhUWF9SRUcyM19YRV9MQVRDSF9DQUxPVVRfUkQodmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzI0LCAmdmFsKTsKKwkJbGF0X2VlX2l0ciA9IFJYVFhfUkVHMjRfRUVfTEFUQ0hfQ0FMT1VUX1JEKHZhbCk7CisJCWxhdF9zZV9pdHIgPSBSWFRYX1JFRzI0X1NFX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTIxLCAmdmFsKTsKKwkJc3VtX2NhbF9pdHIgPSBSWFRYX1JFRzEyMV9TVU1PU19DQUxfQ09ERV9SRCh2YWwpOworCisJCS8qIENoZWNrIGZvciBmYWlsdXJlLiBJZiBwYXNzZWQsIHN1bSB0aGVtIGZvciBhdmVyYWdpbmcgKi8KKwkJaWYgKChmYWlsX2V2ZW4gPT0gMCB8fCBmYWlsX2V2ZW4gPT0gMSkgJiYKKwkJICAgIChmYWlsX29kZCA9PSAwIHx8IGZhaWxfb2RkID09IDEpKSB7CisJCQlsYXRfZG8gKz0gbGF0X2RvX2l0cjsKKwkJCWxhdF94byArPSBsYXRfeG9faXRyOworCQkJbGF0X2VvICs9IGxhdF9lb19pdHI7CisJCQlsYXRfc28gKz0gbGF0X3NvX2l0cjsKKwkJCWxhdF9kZSArPSBsYXRfZGVfaXRyOworCQkJbGF0X3hlICs9IGxhdF94ZV9pdHI7CisJCQlsYXRfZWUgKz0gbGF0X2VlX2l0cjsKKwkJCWxhdF9zZSArPSBsYXRfc2VfaXRyOworCQkJc3VtX2NhbCArPSBzdW1fY2FsX2l0cjsKKworCQkJZGV2X2RiZyhjdHgtPmRldiwgIkl0ZXJhdGlvbiAlZDpcbiIsIGF2Z19sb29wKTsKKwkJCWRldl9kYmcoY3R4LT5kZXYsICJETyAweCV4IFhPIDB4JXggRU8gMHgleCBTTyAweCV4XG4iLAorCQkJCWxhdF9kb19pdHIsIGxhdF94b19pdHIsIGxhdF9lb19pdHIsCisJCQkJbGF0X3NvX2l0cik7CisJCQlkZXZfZGJnKGN0eC0+ZGV2LCAiREUgMHgleCBYRSAweCV4IEVFIDB4JXggU0UgMHgleFxuIiwKKwkJCQlsYXRfZGVfaXRyLCBsYXRfeGVfaXRyLCBsYXRfZWVfaXRyLAorCQkJCWxhdF9zZV9pdHIpOworCQkJZGV2X2RiZyhjdHgtPmRldiwgIlNVTSAweCV4XG4iLCBzdW1fY2FsX2l0cik7CisJCQkrK2F2Z19sb29wOworCQl9IGVsc2UgeworCQkJZGV2X2VycihjdHgtPmRldiwKKwkJCQkiUmVjZWl2ZXIgY2FsaWJyYXRpb24gZmFpbGVkIGF0ICVkIGxvb3BcbiIsCisJCQkJYXZnX2xvb3ApOworCQl9CisJCXhnZW5lX3BoeV9yZXNldF9yeGQoY3R4LCBsYW5lKTsKKwl9CisKKwkvKiBVcGRhdGUgbGF0Y2ggbWFudWFsIGNhbGlicmF0aW9uIHdpdGggYXZlcmFnZSB2YWx1ZSAqLworCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzEyN19ET19MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X2RvLCBtYXhfbG9vcCkpOworCXZhbCA9IFJYVFhfUkVHMTI3X1hPX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfeG8sIG1heF9sb29wKSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsIHZhbCk7CisKKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyOCwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMjhfRU9fTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9lbywgbWF4X2xvb3ApKTsKKwl2YWwgPSBSWFRYX1JFRzEyOF9TT19MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X3NvLCBtYXhfbG9vcCkpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI4LCB2YWwpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjksICZ2YWwpOworCXZhbCA9IFJYVFhfUkVHMTI5X0RFX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZGUsIG1heF9sb29wKSk7CisJdmFsID0gUlhUWF9SRUcxMjlfWEVfTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF94ZSwgbWF4X2xvb3ApKTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyOSwgdmFsKTsKKworCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTMwLCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzEzMF9FRV9MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X2VlLCBtYXhfbG9vcCkpOworCXZhbCA9IFJYVFhfUkVHMTMwX1NFX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfc2UsIG1heF9sb29wKSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMzAsIHZhbCk7CisKKwkvKiBVcGRhdGUgU1VNTUVSIGNhbGlicmF0aW9uIHdpdGggYXZlcmFnZSB2YWx1ZSAqLworCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTQsICZ2YWwpOworCXZhbCA9IFJYVFhfUkVHMTRfQ0xURV9MQVRDQUxfTUFOX1BST0dfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcoc3VtX2NhbCwgbWF4X2xvb3ApKTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzE0LCB2YWwpOworCisJZGV2X2RiZyhjdHgtPmRldiwgIkF2ZXJhZ2UgVmFsdWU6XG4iKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiRE8gMHgleCBYTyAweCV4IEVPIDB4JXggU08gMHgleFxuIiwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF9kbywgbWF4X2xvb3ApLAorCQkgeGdlbmVfcGh5X2dldF9hdmcobGF0X3hvLCBtYXhfbG9vcCksCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZW8sIG1heF9sb29wKSwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF9zbywgbWF4X2xvb3ApKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiREUgMHgleCBYRSAweCV4IEVFIDB4JXggU0UgMHgleFxuIiwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF9kZSwgbWF4X2xvb3ApLAorCQkgeGdlbmVfcGh5X2dldF9hdmcobGF0X3hlLCBtYXhfbG9vcCksCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZWUsIG1heF9sb29wKSwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF9zZSwgbWF4X2xvb3ApKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiU1VNIDB4JXhcbiIsCisJCXhnZW5lX3BoeV9nZXRfYXZnKHN1bV9jYWwsIG1heF9sb29wKSk7CisKKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzE0LCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzE0X0NUTEVfTEFUQ0FMX01BTl9FTkFfU0VUKHZhbCwgMHgxKTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzE0LCB2YWwpOworCWRldl9kYmcoY3R4LT5kZXYsICJFbmFibGUgTWFudWFsIFN1bW1lciBjYWxpYnJhdGlvblxuIik7CisKKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMjdfTEFUQ0hfTUFOX0NBTF9FTkFfU0VUKHZhbCwgMHgxKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiRW5hYmxlIE1hbnVhbCBMYXRjaCBjYWxpYnJhdGlvblxuIik7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsIHZhbCk7CisKKwkvKiBEaXNhYmxlIFJYIEhpLVogdGVybWluYXRpb24gKi8KKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzEyX1JYX0RFVF9URVJNX0VOQUJMRV9TRVQodmFsLCAwKTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLCB2YWwpOworCS8qIFR1cm4gb24gREZFICovCisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcyOCwgMHgwMDA3KTsKKwkvKiBTZXQgREZFIHByZXNldCAqLworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMzEsIDB4N2UwMCk7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfcGh5X2h3X2luaXQoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHggPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgcmM7CisJaW50IGk7CisKKwlyYyA9IHhnZW5lX3BoeV9od19pbml0aWFsaXplKGN0eCwgQ0xLX0VYVF9ESUZGLCBTU0NfRElTQUJMRSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJQSFkgaW5pdGlhbGl6ZSBmYWlsZWQgJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFNldHVwIGNsb2NrIHByb3Blcmx5IGFmdGVyIFBIWSBjb25maWd1cmF0aW9uICovCisJaWYgKCFJU19FUlIoY3R4LT5jbGspKSB7CisJCS8qIEhXIHJlcXVpcmVzIGFuIHRvZ2dsZSBvZiB0aGUgY2xvY2sgKi8KKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGN0eC0+Y2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGN0eC0+Y2xrKTsKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGN0eC0+Y2xrKTsKKwl9CisKKwkvKiBDb21wdXRlIGF2ZXJhZ2UgdmFsdWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xBTkU7IGkrKykKKwkJeGdlbmVfcGh5X2dlbl9hdmdfdmFsKGN0eCwgaSk7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUEhZIGluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIHhnZW5lX3BoeV9vcHMgPSB7CisJLmluaXQJCT0geGdlbmVfcGh5X2h3X2luaXQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwaHkgKnhnZW5lX3BoeV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoYXJncy0+YXJnc19jb3VudCA8PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoYXJncy0+YXJnc1swXSA8IE1PREVfU0FUQSB8fCBhcmdzLT5hcmdzWzBdID49IE1PREVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWN0eC0+bW9kZSA9IGFyZ3MtPmFyZ3NbMF07CisJcmV0dXJuIGN0eC0+cGh5OworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9waHlfZ2V0X3BhcmFtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdTMyICpidWZmZXIsCisJCQkJaW50IGNvdW50LCB1MzIgKmRlZmF1bHRfdmFsLAorCQkJCXUzMiBjb252X2ZhY3RvcikKK3sKKwlpbnQgaTsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkocGRldi0+ZGV2Lm9mX25vZGUsIG5hbWUsIGJ1ZmZlciwKKwkJCQkJY291bnQpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJYnVmZmVyW2ldIC89IGNvbnZfZmFjdG9yOworCQlyZXR1cm47CisJfQorCS8qIERvZXMgbm90IGV4aXN0LCBsb2FkIGRlZmF1bHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJYnVmZmVyW2ldID0gZGVmYXVsdF92YWxbaSAlIDNdOworfQorCitzdGF0aWMgaW50IHhnZW5lX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByYyA9IDA7CisJdTMyIGRlZmF1bHRfc3BkW10gPSBERUZBVUxUX1NBVEFfU1BEX1NFTDsKKwl1MzIgZGVmYXVsdF90eGJvb3N0X2dhaW5bXSA9IERFRkFVTFRfU0FUQV9UWEJPT1NUX0dBSU47CisJdTMyIGRlZmF1bHRfdHhleWVfZGlyZWN0aW9uW10gPSBERUZBVUxUX1NBVEFfVFhFWUVESVJFQ1RJT047CisJdTMyIGRlZmF1bHRfdHhleWVfdHVuaW5nW10gPSBERUZBVUxUX1NBVEFfVFhFWUVUVU5JTkc7CisJdTMyIGRlZmF1bHRfdHhhbXBbXSA9IERFRkFVTFRfU0FUQV9UWEFNUDsKKwl1MzIgZGVmYXVsdF90eGNuMVtdID0gREVGQVVMVF9TQVRBX1RYQ04xOworCXUzMiBkZWZhdWx0X3R4Y24yW10gPSBERUZBVUxUX1NBVEFfVFhDTjI7CisJdTMyIGRlZmF1bHRfdHhjcDFbXSA9IERFRkFVTFRfU0FUQV9UWENQMTsKKwlpbnQgaTsKKworCWN0eCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN0eC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJY3R4LT5zZHNfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoY3R4LT5zZHNfYmFzZSkpIHsKKwkJcmMgPSBQVFJfRVJSKGN0eC0+c2RzX2Jhc2UpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFJldHJpZXZlIG9wdGlvbmFsIGNsb2NrICovCisJY3R4LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCisJLyogTG9hZCBvdmVycmlkZSBwYXJhbWF0ZXJzICovCisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LWV5ZS10dW5pbmciLAorCQljdHgtPnNhdGFfcGFyYW0udHhleWV0dW5pbmcsIDYsIGRlZmF1bHRfdHhleWVfdHVuaW5nLCAxKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtZXllLWRpcmVjdGlvbiIsCisJCWN0eC0+c2F0YV9wYXJhbS50eGV5ZWRpcmVjdGlvbiwgNiwgZGVmYXVsdF90eGV5ZV9kaXJlY3Rpb24sIDEpOworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1ib29zdC1nYWluIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4Ym9vc3RnYWluLCA2LCBkZWZhdWx0X3R4Ym9vc3RfZ2FpbiwgMSk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LWFtcGxpdHVkZSIsCisJCWN0eC0+c2F0YV9wYXJhbS50eGFtcGxpdHVkZSwgNiwgZGVmYXVsdF90eGFtcCwgMTMzMDApOworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1wcmUtY3Vyc29yMSIsCisJCWN0eC0+c2F0YV9wYXJhbS50eHByZWN1cnNvcl9jbjEsIDYsIGRlZmF1bHRfdHhjbjEsIDE4MjAwKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtcHJlLWN1cnNvcjIiLAorCQljdHgtPnNhdGFfcGFyYW0udHhwcmVjdXJzb3JfY24yLCA2LCBkZWZhdWx0X3R4Y24yLCAxODIwMCk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LXBvc3QtY3Vyc29yIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4cG9zdGN1cnNvcl9jcDEsIDYsIGRlZmF1bHRfdHhjcDEsIDE4MjAwKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtc3BlZWQiLAorCQljdHgtPnNhdGFfcGFyYW0udHhzcGVlZCwgMywgZGVmYXVsdF9zcGQsIDEpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEFORTsgaSsrKQorCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbaV0gPSAyOyAvKiBEZWZhdWx0IHRvIEdlbjMgKi8KKworCWN0eC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOworCisJY3R4LT5waHkgPSBkZXZtX3BoeV9jcmVhdGUoY3R4LT5kZXYsICZ4Z2VuZV9waHlfb3BzLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGN0eC0+cGh5KSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIFBIWVxuIik7CisJCXJjID0gUFRSX0VSUihjdHgtPnBoeSk7CisJCWdvdG8gZXJyb3I7CisJfQorCXBoeV9zZXRfZHJ2ZGF0YShjdHgtPnBoeSwgY3R4KTsKKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGN0eC0+ZGV2LAorCQkJCQkJICAgICB4Z2VuZV9waHlfeGxhdGUpOworCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgeworCQlyYyA9IFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z2VuZV9waHlfb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSIsfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4Z2VuZV9waHlfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4Z2VuZV9waHlfZHJpdmVyID0geworCS5wcm9iZSA9IHhnZW5lX3BoeV9wcm9iZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJ4Z2VuZS1waHkiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgLm9mX21hdGNoX3RhYmxlID0geGdlbmVfcGh5X29mX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4Z2VuZV9waHlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUE0gWC1HZW5lIE11bHRpLVB1cnBvc2UgUEhZIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTG9jIEhvIDxsaG9AYXBtLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL0tjb25maWcKaW5kZXggMWU0ZTY5My4uMDZjZWUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL0tjb25maWcKKysrIGIvZHJpdmVycy9waW5jdHJsL0tjb25maWcKQEAgLTIyNCw3ICsyMjQsNyBAQAogCiBjb25maWcgUElOQ1RSTF9NU004WDc0CiAJdHJpc3RhdGUgIlF1YWxjb21tIDh4NzQgcGluIGNvbnRyb2xsZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBPRiAmJiBPRl9JUlEKKwlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgT0YKIAlzZWxlY3QgUElOQ1RSTF9NU00KIAloZWxwCiAJICBUaGlzIGlzIHRoZSBwaW5jdHJsLCBwaW5tdXgsIHBpbmNvbmYgYW5kIGdwaW9saWIgZHJpdmVyIGZvciB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9kZXZpY2V0cmVlLmMgYi9kcml2ZXJzL3BpbmN0cmwvZGV2aWNldHJlZS5jCmluZGV4IDM0MGZiNGUuLmVkYTEzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9kZXZpY2V0cmVlLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2RldmljZXRyZWUuYwpAQCAtMTg2LDcgKzE4Niw5IEBACiAKIAkvKiBDT05GSUdfT0YgZW5hYmxlZCwgcC0+ZGV2IG5vdCBpbnN0YW50aWF0ZWQgZnJvbSBEVCAqLwogCWlmICghbnApIHsKLQkJZGV2X2RiZyhwLT5kZXYsICJubyBvZl9ub2RlOyBub3QgcGFyc2luZyBwaW5jdHJsIERUXG4iKTsKKwkJaWYgKG9mX2hhdmVfcG9wdWxhdGVkX2R0KCkpCisJCQlkZXZfZGJnKHAtPmRldiwKKwkJCQkibm8gb2Zfbm9kZTsgbm90IHBhcnNpbmcgcGluY3RybCBEVFxuIik7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvS2NvbmZpZwppbmRleCAzNjZmYTU0Li5jYzI5OGZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L0tjb25maWcKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L0tjb25maWcKQEAgLTgsNiArOCw3IEBACiBjb25maWcgUElOQ1RSTF9ET1ZFCiAJYm9vbAogCXNlbGVjdCBQSU5DVFJMX01WRUJVCisJc2VsZWN0IE1GRF9TWVNDT04KIAogY29uZmlnIFBJTkNUUkxfS0lSS1dPT0QKIAlib29sCkBAIC0xNyw2ICsxOCwxNCBAQAogCWJvb2wKIAlzZWxlY3QgUElOQ1RSTF9NVkVCVQogCitjb25maWcgUElOQ1RSTF9BUk1BREFfMzc1CisJYm9vbAorCXNlbGVjdCBQSU5DVFJMX01WRUJVCisKK2NvbmZpZyBQSU5DVFJMX0FSTUFEQV8zOFgKKwlib29sCisJc2VsZWN0IFBJTkNUUkxfTVZFQlUKKwogY29uZmlnIFBJTkNUUkxfQVJNQURBX1hQCiAJYm9vbAogCXNlbGVjdCBQSU5DVFJMX01WRUJVCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvTWFrZWZpbGUKaW5kZXggMzdjMjUzMi4uYmMxYjlmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9NYWtlZmlsZQpAQCAtMiw0ICsyLDYgQEAKIG9iai0kKENPTkZJR19QSU5DVFJMX0RPVkUpCSs9IHBpbmN0cmwtZG92ZS5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9LSVJLV09PRCkJKz0gcGluY3RybC1raXJrd29vZC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9BUk1BREFfMzcwKSArPSBwaW5jdHJsLWFybWFkYS0zNzAubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBXzM3NSkgKz0gcGluY3RybC1hcm1hZGEtMzc1Lm8KK29iai0kKENPTkZJR19QSU5DVFJMX0FSTUFEQV8zOFgpICs9IHBpbmN0cmwtYXJtYWRhLTM4eC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9BUk1BREFfWFApICArPSBwaW5jdHJsLWFybWFkYS14cC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzcwLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzcwLmMKaW5kZXggYWUxZjc2MC4uNjcwZTViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3MC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzAuYwpAQCAtMjMsNiArMjMsMTggQEAKIAogI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKIAorc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3MF9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3MF9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9zZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKwogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfbW9kZSBtdjg4ZjY3MTBfbXBwX21vZGVzW10gPSB7CiAJTVBQX01PREUoMCwKIAkgICBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLApAQCAtMzczLDcgKzM4NSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjcxMF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgNjUpLAorCU1QUF9GVU5DX0NUUkwoMCwgNjUsIE5VTEwsIGFybWFkYV8zNzBfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY4OGY2NzEwX21wcF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzg1LDYgKzM5NywxMiBAQAogc3RhdGljIGludCBhcm1hZGFfMzcwX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0gJmFybWFkYV8zNzBfcGluY3RybF9pbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CiAKIAlzb2MtPnZhcmlhbnQgPSAwOyAvKiBubyB2YXJpYW50cyBmb3IgQXJtYWRhIDM3MCAqLwogCXNvYy0+Y29udHJvbHMgPSBtdjg4ZjY3MTBfbXBwX2NvbnRyb2xzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3NS5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDc4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzc1LmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBNYXJ2ZWxsIEFybWFkYSAzNzUgcGluY3RybCBkcml2ZXIgYmFzZWQgb24gbXZlYnUgcGluY3RybCBjb3JlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcnZlbGwKKyAqCisgKiBUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorCisjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgorCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKKworc3RhdGljIGludCBhcm1hZGFfMzc1X21wcF9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9nZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzc1X21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9tb2RlIG12ODhmNjcyMF9tcHBfbW9kZXNbXSA9IHsKKwlNUFBfTU9ERSgwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJjczEiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgImNzMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW8yIikpLAorCU1QUF9NT0RFKDEsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgIm1vc2kiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgIm1vc2kiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvMyIpKSwKKwlNUFBfTU9ERSgyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQ0IiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAicHRwIiwgImV2ZW50cmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgImMwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAic2RpIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzQiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJzcGkxIiwgIm1vc2kiKSksCisJTVBQX01PREUoMywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkNSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInB0cCIsICJ0cmlnZ2VuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgInAzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAibWNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW81IiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJtaXNvIikpLAorCU1QUF9NT0RFKDQsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDYiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgIm1pc28iKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgIm1pc28iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvNiIpKSwKKwlNUFBfTU9ERSg1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQ3IiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW83IiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJtaXNvIikpLAorCU1QUF9NT0RFKDYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJsZWQiLCAicDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJhdWRpbyIsICJyY2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzAiKSksCisJTVBQX01PREUoNywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInB0cCIsICJjbGsiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJsZWQiLCAicDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJhdWRpbyIsICJleHRjbGsiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvMSIpKSwKKwlNUFBfTU9ERSg4LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYgIiwgImJvb3RjcyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNwaTAiLCAiY3MwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczAiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImNlIikpLAorCU1QUF9NT0RFKDksCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgIm5mIiwgIndlbiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNwaTAiLCAic2NrIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgIndlIikpLAorCU1QUF9NT0RFKDEwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJuZiIsICJyZW4iKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJkcmFtIiwgInZ0dGN0cmwiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJsZWQiLCAiYzEiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgInJlIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJzY2siKSksCisJTVBQX01PREUoMTEsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImxlZCIsICJjMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImF1ZGlvIiwgInNkbyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiY2xlIikpLAorCU1QUF9NT0RFKDEyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYTEiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJhdWRpbyIsICJiY2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJhbGUiKSksCisJTVBQX01PREUoMTMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJyZWFkeW4iKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAicGNpZTEiLCAicnN0b3V0biIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAicmIiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJzcGkxIiwgIm1vc2kiKSksCisJTVBQX01PREUoMTQsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImkyYzAiLCAic2RhIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAidWFydDEiLCAidHhkIikpLAorCU1QUF9NT0RFKDE1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJpMmMwIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInVhcnQxIiwgInJ4ZCIpKSwKKwlNUFBfTU9ERSgxNiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidWFydDAiLCAidHhkIikpLAorCU1QUF9NT0RFKDE3LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ1YXJ0MCIsICJyeGQiKSksCisJTVBQX01PREUoMTgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJpbnRuIikpLAorCU1QUF9NT0RFKDE5LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ0ZG0iLCAicnN0biIpKSwKKwlNUFBfTU9ERSgyMCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgInBjbGsiKSksCisJTVBQX01PREUoMjEsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJmc3luYyIpKSwKKwlNUFBfTU9ERSgyMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgImRyeCIpKSwKKwlNUFBfTU9ERSgyMywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgImR0eCIpKSwKKwlNUFBfTU9ERSgyNCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInJ4ZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzZCIsICJjbWQiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJ1YXJ0MCIsICJydHMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJzcGkwIiwgImNzMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJjczEiKSksCisJTVBQX01PREUoMjUsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic2QiLCAiZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJ1YXJ0MCIsICJjdHMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJzcGkwIiwgIm1vc2kiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiY3MyIikpLAorCU1QUF9NT0RFKDI2LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMCIsICJjbGtyZXEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAicnhkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDEiLCAicnRzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJjczEiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJsZWQiLCAiYzEiKSksCisJTVBQX01PREUoMjcsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUxIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic2QiLCAiZDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJ1YXJ0MSIsICJjdHMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJzcGkwIiwgIm1pc28iKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJsZWQiLCAiYzIiKSksCisJTVBQX01PREUoMjgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJ0eGN0bCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImRyYW0iLCAidnR0Y3RybCIpKSwKKwlNUFBfTU9ERSgyOSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTEiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInJ4Y2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic2QiLCAiZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJzcGkwIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInBjaWUwIiwgInJzdG91dG4iKSksCisJTVBQX01PREUoMzAsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJ0eGQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczAiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAicDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJwdHAiLCAiZXZlbnRyZXEiKSksCisJTVBQX01PREUoMzEsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJ0eGQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAwIikpLAorCU1QUF9NT0RFKDMyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAic2NrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAicHRwIiwgInRyaWdnZW4iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAiYzAiKSksCisJTVBQX01PREUoMzMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJ0eGQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAyIikpLAorCU1QUF9NT0RFKDM0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhjbGtvdXQiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJjMSIpKSwKKwlNUFBfTU9ERSgzNSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInJ4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczEiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJzcGkwIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMSIpKSwKKwlNUFBfTU9ERSgzNiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTAiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMyIikpLAorCU1QUF9NT0RFKDM3LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMCIsICJjbGtyZXEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ0ZG0iLCAiaW50biIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImdlIiwgIm1kYyIpKSwKKwlNUFBfTU9ERSgzOCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTEiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiZ2UiLCAibWRpbyIpKSwKKwlNUFBfTU9ERSgzOSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAicmVmIiwgImNsa291dCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMyIpKSwKKwlNUFBfTU9ERSg0MCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDEiLCAidHhkIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAwIikpLAorCU1QUF9NT0RFKDQxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJ1YXJ0MSIsICJyeGQiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAicDEiKSksCisJTVBQX01PREUoNDIsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgImMwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAicHRwIiwgImNsayIpKSwKKwlNUFBfTU9ERSg0MywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic2F0YTAiLCAicHJzbnQiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJkcmFtIiwgInZ0dGN0cmwiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAiYzEiKSksCisJTVBQX01PREUoNDQsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInNhdGEwIiwgInByc250IikpLAorCU1QUF9NT0RFKDQ1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInBjaWUwIiwgInJzdG91dG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAiYzIiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJzcGkxIiwgImNzMiIpKSwKKwlNUFBfTU9ERSg0NiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4ZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhkMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJ3ZW4xIikpLAorCU1QUF9NT0RFKDQ3LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAicDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAidHhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJ0eGQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAicHRwIiwgInRyaWdnZW4iKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWxlMCIpKSwKKwlNUFBfTU9ERSg0OCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhbGUxIikpLAorCU1QUF9NT0RFKDQ5LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAicDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAidHhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJ0eGQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImEyIikpLAorCU1QUF9NT0RFKDUwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAiYzAiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAicnhkMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJyeGQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAicHRwIiwgImV2ZW50cmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkMTIiKSksCisJTVBQX01PREUoNTEsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJjMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJyeGQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInJ4ZDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWQ4IikpLAorCU1QUF9NT0RFKDUyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAiYzIiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAicnhkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJyeGQyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAiaTJjMCIsICJzZGEiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWQ5IikpLAorCU1QUF9NT0RFKDUzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMSIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4ZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAicnhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImkyYzAiLCAic2NrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkMTAiKSksCisJTVBQX01PREUoNTQsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUwIiwgInJzdG91dG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAicnhjdGwiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAicnhjdGwiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWQxMSIpKSwKKwlNUFBfTU9ERSg1NSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4Y2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInJ4Y2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImNzMCIpKSwKKwlNUFBfTU9ERSg1NiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4Y2xrb3V0IiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4Y2xrb3V0IiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgIm9lIikpLAorCU1QUF9NT0RFKDU3LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAidHhjdGwiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhjdGwiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAid2VuMCIpKSwKKwlNUFBfTU9ERSg1OCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgImMwIikpLAorCU1QUF9NT0RFKDU5LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJsZWQiLCAiYzEiKSksCisJTVBQX01PREUoNjAsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInVhcnQxIiwgInR4ZCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJjMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDEzIikpLAorCU1QUF9NT0RFKDYxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJpMmMxIiwgInNkYSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInVhcnQxIiwgInJ4ZCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgInAwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkMTQiKSksCisJTVBQX01PREUoNjIsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImkyYzEiLCAic2NrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgInAxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkMTUiKSksCisJTVBQX01PREUoNjMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInB0cCIsICJ0cmlnZ2VuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgInAyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImJ1cnN0IikpLAorCU1QUF9NT0RFKDY0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJkcmFtIiwgInZ0dGN0cmwiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJsZWQiLCAicDMiKSksCisJTVBQX01PREUoNjUsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInNhdGExIiwgInByc250IikpLAorCU1QUF9NT0RFKDY2LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAiZXZlbnRyZXEiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJzcGkxIiwgImNzMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInBjaWUwIiwgInJzdG91dG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiY3MzIikpLAorfTsKKworc3RhdGljIHN0cnVjdCBtdmVidV9waW5jdHJsX3NvY19pbmZvIGFybWFkYV8zNzVfcGluY3RybF9pbmZvOworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhcm1hZGFfMzc1X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsbXY4OGY2NzIwLXBpbmN0cmwiIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBtdjg4ZjY3MjBfbXBwX2NvbnRyb2xzW10gPSB7CisJTVBQX0ZVTkNfQ1RSTCgwLCA2OSwgTlVMTCwgYXJtYWRhXzM3NV9tcHBfY3RybCksCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBtdjg4ZjY3MjBfbXBwX2dwaW9fcmFuZ2VzW10gPSB7CisJTVBQX0dQSU9fUkFOR0UoMCwgICAwLCAgMCwgMzIpLAorCU1QUF9HUElPX1JBTkdFKDEsICAzMiwgMzIsIDMyKSwKKwlNUFBfR1BJT19SQU5HRSgyLCAgNjQsIDY0LCAgMyksCit9OworCitzdGF0aWMgaW50IGFybWFkYV8zNzVfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdmVidV9waW5jdHJsX3NvY19pbmZvICpzb2MgPSAmYXJtYWRhXzM3NV9waW5jdHJsX2luZm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtcHBfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcF9iYXNlKTsKKworCXNvYy0+dmFyaWFudCA9IDA7IC8qIG5vIHZhcmlhbnRzIGZvciBBcm1hZGEgMzc1ICovCisJc29jLT5jb250cm9scyA9IG12ODhmNjcyMF9tcHBfY29udHJvbHM7CisJc29jLT5uY29udHJvbHMgPSBBUlJBWV9TSVpFKG12ODhmNjcyMF9tcHBfY29udHJvbHMpOworCXNvYy0+bW9kZXMgPSBtdjg4ZjY3MjBfbXBwX21vZGVzOworCXNvYy0+bm1vZGVzID0gQVJSQVlfU0laRShtdjg4ZjY3MjBfbXBwX21vZGVzKTsKKwlzb2MtPmdwaW9yYW5nZXMgPSBtdjg4ZjY3MjBfbXBwX2dwaW9fcmFuZ2VzOworCXNvYy0+bmdwaW9yYW5nZXMgPSBBUlJBWV9TSVpFKG12ODhmNjcyMF9tcHBfZ3Bpb19yYW5nZXMpOworCisJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBzb2M7CisKKwlyZXR1cm4gbXZlYnVfcGluY3RybF9wcm9iZShwZGV2KTsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzc1X3BpbmN0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcmVtb3ZlKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1hZGFfMzc1X3BpbmN0cmxfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFybWFkYS0zNzUtcGluY3RybCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYXJtYWRhXzM3NV9waW5jdHJsX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IGFybWFkYV8zNzVfcGluY3RybF9wcm9iZSwKKwkucmVtb3ZlID0gYXJtYWRhXzM3NV9waW5jdHJsX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXJtYWRhXzM3NV9waW5jdHJsX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIEFybWFkYSAzNzUgcGluY3RybCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zOHguYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zOHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ5ZjgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM4eC5jCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogTWFydmVsbCBBcm1hZGEgMzgwLzM4NSBwaW5jdHJsIGRyaXZlciBiYXNlZCBvbiBtdmVidSBwaW5jdHJsIGNvcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTWFydmVsbAorICoKKyAqIFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLW12ZWJ1LmgiCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1wcF9iYXNlOworCitzdGF0aWMgaW50IGFybWFkYV8zOHhfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zOHhfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK2VudW0geworCVZfODhGNjgxMCA9IEJJVCgwKSwKKwlWXzg4RjY4MjAgPSBCSVQoMSksCisJVl84OEY2ODI4ID0gQklUKDIpLAorCVZfODhGNjgxMF9QTFVTID0gKFZfODhGNjgxMCB8IFZfODhGNjgyMCB8IFZfODhGNjgyOCksCisJVl84OEY2ODIwX1BMVVMgPSAoVl84OEY2ODIwIHwgVl84OEY2ODI4KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX21vZGUgYXJtYWRhXzM4eF9tcHBfbW9kZXNbXSA9IHsKKwlNUFBfTU9ERSgwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMCIsICAgInJ4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWEwIiwgICAidHhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMwIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImkyYzAiLCAgInNkYSIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UiLCAgICAibWRjIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInVhMSIsICAgInR4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICJydHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlIiwgICAgIm1kaW8iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTEiLCAgICJyeGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAiY3RzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJ0eGNsa291dCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UwIiwgICAiY3JzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImNzMyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhkMCIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkOSIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhkMSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMTAiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhkMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMTEiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDEwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDMiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDEyIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxMSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJ0eGN0bCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQxMyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTIsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhkMCIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAiY3MxIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMTQiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDEzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZDEiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMCIsICJjbGtyZXEiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTEiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgImNzMiIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDE1IiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxNCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJyeGQyIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicHRwIiwgICAiY2xrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgIm0iLCAgICAgInZ0dF9jdHJsIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICJjczMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAid2VuMSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTUsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhkMyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlIiwgICAgIm1kYyBzbGF2ZSIsICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAibW9zaSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUykpLAorCU1QUF9NT0RFKDE2LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4Y3RsIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZSIsICAgICJtZGlvIHNsYXZlIiwgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAibSIsICAgICAiZGVjY19lcnIiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgIm1pc28iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMCIsICJjbGtyZXEiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxNywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJyeGNsayIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicHRwIiwgICAiY2xrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMSIsICAgInJ4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2F0YTEiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhlcnIiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgInRyaWdfZ2VuIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTEiLCAgICJ0eGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAiY3MwIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUykpLAorCU1QUF9NT0RFKDE5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgImNvbCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwdHAiLCAgICJldmVudF9yZXEiLCAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTAiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNhdGExIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJ1YTAiLCAgICJjdHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyMCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJ0eGNsayIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicHRwIiwgICAiY2xrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzYXRhMCIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAiY3MxIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInJ4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJzYXRhMCIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiY21kIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImJvb3RjcyIsICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDIyLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgIm1vc2kiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDAiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyMywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQyIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAibWlzbyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInVhMCIsICAgImN0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTEiLCAgICJyeGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDQiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgInJlYWR5IiwgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDI1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgImNzMCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTAiLCAgICJydHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWExIiwgICAidHhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQ1IiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJjczAiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJjczIiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAiaTJjMSIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQ2IiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJjczEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyNywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJjczMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhjbGtvdXQiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgImkyYzEiLCAgInNkYSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkNyIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiY3MyIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhkMCIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDUiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJ0eGQxIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWxlMCIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhkMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgIm9lbiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDMxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4ZDMiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhbGUxIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJ0eGN0bCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAid2VuMCIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAibSIsICAgICAiZGVjY19lcnIiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMSIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInJlZiIsICAgImNsa19vdXQxIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhMSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwdHAiLCAgICJ0cmlnX2dlbiIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYTAiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicHRwIiwgICAiY2xrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInJ4Y2xrIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkMyIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQ4IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicHRwIiwgICAiZXZlbnRfcmVxIiwgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInJ4ZDEiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJyZWYiLCAgICJjbGtfb3V0MCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDAiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkNCIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImkyYzEiLCAgInNjayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGQyIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAiY3RzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQxIiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhMiIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0MCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMxIiwgICJzZGEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAicnhkMyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgInJ0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkMiIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQ2IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWExIiwgICAicnhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInJ4Y3RsIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICJjdHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAiY3MzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImJ1cnN0L2xhc3QiLCBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQyLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMSIsICAgInR4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICJydHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQ3IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicGNpZTAiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgIm0iLCAgICAgInZ0dF9jdHJsIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJtIiwgICAgICJkZWNjX2VyciIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImNsa291dCIsICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQ0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAic2F0YTIiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzYXRhMyIsICJwcnNudCIsICAgICAgVl84OEY2ODI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQ1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInJlZiIsICAgImNsa19vdXQwIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInBjaWUyIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMyIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0NiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJyZWYiLCAgICJjbGtfb3V0MSIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJwY2llMiIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAicGNpZTMiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGExIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJzYXRhMiIsICJwcnNudCIsICAgICAgVl84OEY2ODI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgImNzMiIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzYXRhMyIsICJwcnNudCIsICAgICAgVl84OEY2ODI4KSksCisJTVBQX01PREUoNDgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgIm0iLCAgICAgInZ0dF9jdHJsIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ0ZG0yYyIsICJwY2xrIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAibWNsayIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImQ0IiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQ5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEyIiwgInByc250IiwgICAgICBWXzg4RjY4MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAic2F0YTMiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ0ZG0yYyIsICJmc3luYyIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAibHJjbGsiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImQ1IiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDUwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAiZHJ4IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgImV4dGNsayIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJjbWQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ0ZG0yYyIsICJkdHgiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAic2RvIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgIm0iLCAgICAgImRlY2NfZXJyIiwgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDUyLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAiaW50biIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgInNkaSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkNiIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbTJjIiwgInJzdG4iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICJiY2xrIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDciLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGExIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImQzIiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDU1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMSIsICAgImN0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZSIsICAgICJtZGlvIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTEiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgImNzMSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkMCIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1NiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICJydHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UiLCAgICAibWRjIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgIm0iLCAgICAgImRlY2NfZXJyIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJtb3NpIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1NywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiY2xrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicGNpZTEiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImkyYzEiLCAgInNjayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMiIsICJjbGtyZXEiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAibWlzbyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImQxIiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDU5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJpMmMxIiwgICJzZGEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgImNzMCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkMiIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyBhcm1hZGFfMzh4X3BpbmN0cmxfaW5mbzsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM4eF9waW5jdHJsX29mX21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjgxMC1waW5jdHJsIiwKKwkJLmRhdGEgICAgICAgPSAodm9pZCAqKSBWXzg4RjY4MTAsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gIm1hcnZlbGwsbXY4OGY2ODIwLXBpbmN0cmwiLAorCQkuZGF0YSAgICAgICA9ICh2b2lkICopIFZfODhGNjgyMCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAibWFydmVsbCxtdjg4ZjY4MjgtcGluY3RybCIsCisJCS5kYXRhICAgICAgID0gKHZvaWQgKikgVl84OEY2ODI4LAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBhcm1hZGFfMzh4X21wcF9jb250cm9sc1tdID0geworCU1QUF9GVU5DX0NUUkwoMCwgNTksIE5VTEwsIGFybWFkYV8zOHhfbXBwX2N0cmwpLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgYXJtYWRhXzM4eF9tcHBfZ3Bpb19yYW5nZXNbXSA9IHsKKwlNUFBfR1BJT19SQU5HRSgwLCAgIDAsICAwLCAzMiksCisJTVBQX0dQSU9fUkFOR0UoMSwgIDMyLCAzMiwgMjcpLAorfTsKKworc3RhdGljIGludCBhcm1hZGFfMzh4X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0gJmFybWFkYV8zOHhfcGluY3RybF9pbmZvOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0KKwkJb2ZfbWF0Y2hfZGV2aWNlKGFybWFkYV8zOHhfcGluY3RybF9vZl9tYXRjaCwgJnBkZXYtPmRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJbXBwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1wcF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwX2Jhc2UpOworCisJc29jLT52YXJpYW50ID0gKHVuc2lnbmVkKSBtYXRjaC0+ZGF0YSAmIDB4ZmY7CisJc29jLT5jb250cm9scyA9IGFybWFkYV8zOHhfbXBwX2NvbnRyb2xzOworCXNvYy0+bmNvbnRyb2xzID0gQVJSQVlfU0laRShhcm1hZGFfMzh4X21wcF9jb250cm9scyk7CisJc29jLT5ncGlvcmFuZ2VzID0gYXJtYWRhXzM4eF9tcHBfZ3Bpb19yYW5nZXM7CisJc29jLT5uZ3Bpb3JhbmdlcyA9IEFSUkFZX1NJWkUoYXJtYWRhXzM4eF9tcHBfZ3Bpb19yYW5nZXMpOworCXNvYy0+bW9kZXMgPSBhcm1hZGFfMzh4X21wcF9tb2RlczsKKwlzb2MtPm5tb2RlcyA9IGFybWFkYV8zOHhfbXBwX2NvbnRyb2xzWzBdLm5waW5zOworCisJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBzb2M7CisKKwlyZXR1cm4gbXZlYnVfcGluY3RybF9wcm9iZShwZGV2KTsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzh4X3BpbmN0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcmVtb3ZlKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1hZGFfMzh4X3BpbmN0cmxfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFybWFkYS0zOHgtcGluY3RybCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYXJtYWRhXzM4eF9waW5jdHJsX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IGFybWFkYV8zOHhfcGluY3RybF9wcm9iZSwKKwkucmVtb3ZlID0gYXJtYWRhXzM4eF9waW5jdHJsX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXJtYWRhXzM4eF9waW5jdHJsX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIEFybWFkYSAzOHggcGluY3RybCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLXhwLmMKaW5kZXggODQzYTUxZi4uZGUzMTExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLXhwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLXhwLmMKQEAgLTMzLDYgKzMzLDE4IEBACiAKICNpbmNsdWRlICJwaW5jdHJsLW12ZWJ1LmgiCiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1wcF9iYXNlOworCitzdGF0aWMgaW50IGFybWFkYV94cF9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhX3hwX21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCiBlbnVtIGFybWFkYV94cF92YXJpYW50IHsKIAlWX01WNzgyMzAJPSBCSVQoMCksCiAJVl9NVjc4MjYwCT0gQklUKDEpLApAQCAtMzY2LDcgKzM3OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12NzgyMzBfbXBwX2NvbnRyb2xzW10gPSB7Ci0JTVBQX1JFR19DVFJMKDAsIDQ4KSwKKwlNUFBfRlVOQ19DVFJMKDAsIDQ4LCBOVUxMLCBhcm1hZGFfeHBfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY3ODIzMF9tcHBfZ3Bpb19yYW5nZXNbXSA9IHsKQEAgLTM3NSw3ICszODcsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBtdjc4MjYwX21wcF9jb250cm9sc1tdID0gewotCU1QUF9SRUdfQ1RSTCgwLCA2NiksCisJTVBQX0ZVTkNfQ1RSTCgwLCA2NiwgTlVMTCwgYXJtYWRhX3hwX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12NzgyNjBfbXBwX2dwaW9fcmFuZ2VzW10gPSB7CkBAIC0zODUsNyArMzk3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY3ODQ2MF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgNjYpLAorCU1QUF9GVU5DX0NUUkwoMCwgNjYsIE5VTEwsIGFybWFkYV94cF9tcHBfY3RybCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBtdjc4NDYwX21wcF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzk5LDEwICs0MTEsMTYgQEAKIAlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0gJmFybWFkYV94cF9waW5jdHJsX2luZm87CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2ggPQogCQlvZl9tYXRjaF9kZXZpY2UoYXJtYWRhX3hwX3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCiAJaWYgKCFtYXRjaCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtcHBfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcF9iYXNlKTsKKwogCXNvYy0+dmFyaWFudCA9ICh1bnNpZ25lZCkgbWF0Y2gtPmRhdGEgJiAweGZmOwogCiAJc3dpdGNoIChzb2MtPnZhcmlhbnQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWRvdmUuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWRvdmUuYwppbmRleCA0NzI2ODM5Li4zYjAyMjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1kb3ZlLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtZG92ZS5jCkBAIC0xOCwxMDcgKzE4LDEyMiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogCiAjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgogCi0jZGVmaW5lIERPVkVfU0JfUkVHU19WSVJUX0JBU0UJCUlPTUVNKDB4ZmRlMDAwMDApCi0jZGVmaW5lIERPVkVfTVBQX1ZJUlRfQkFTRQkJKERPVkVfU0JfUkVHU19WSVJUX0JBU0UgKyAweGQwMjAwKQotI2RlZmluZSBET1ZFX1BNVV9NUFBfR0VORVJBTF9DVFJMCShET1ZFX01QUF9WSVJUX0JBU0UgKyAweDEwKQotI2RlZmluZSAgRE9WRV9BVTBfQUM5N19TRUwJCUJJVCgxNikKLSNkZWZpbmUgRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8wCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhkODAyQykKLSNkZWZpbmUgRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8xCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhkODAzMCkKLSNkZWZpbmUgRE9WRV9HTE9CQUxfQ09ORklHXzEJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhlODAyQykKLSNkZWZpbmUgRE9WRV9HTE9CQUxfQ09ORklHXzEJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhlODAyQykKLSNkZWZpbmUgIERPVkVfVFdTSV9FTkFCTEVfT1BUSU9OMQlCSVQoNykKLSNkZWZpbmUgRE9WRV9HTE9CQUxfQ09ORklHXzIJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhlODAzMCkKLSNkZWZpbmUgIERPVkVfVFdTSV9FTkFCTEVfT1BUSU9OMglCSVQoMjApCi0jZGVmaW5lICBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjMJQklUKDIxKQotI2RlZmluZSAgRE9WRV9UV1NJX09QVElPTjNfR1BJTwkJQklUKDIyKQotI2RlZmluZSBET1ZFX1NTUF9DVFJMX1NUQVRVU18xCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMzQpCi0jZGVmaW5lICBET1ZFX1NTUF9PTl9BVTEJCUJJVCgwKQotI2RlZmluZSBET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwM2MpCi0jZGVmaW5lICBET1ZFX0FVMV9TUERJRk9fR1BJT19FTglCSVQoMSkKLSNkZWZpbmUgIERPVkVfTkFORF9HUElPX0VOCQlCSVQoMCkKLSNkZWZpbmUgRE9WRV9HUElPX0xPX1ZJUlRfQkFTRQkJKERPVkVfU0JfUkVHU19WSVJUX0JBU0UgKyAweGQwNDAwKQotI2RlZmluZSBET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UJKERPVkVfR1BJT19MT19WSVJUX0JBU0UgKyAweDQwKQotI2RlZmluZSAgRE9WRV9TUElfR1BJT19TRUwJCUJJVCg1KQotI2RlZmluZSAgRE9WRV9VQVJUMV9HUElPX1NFTAkJQklUKDQpCi0jZGVmaW5lICBET1ZFX0FVMV9HUElPX1NFTAkJQklUKDMpCi0jZGVmaW5lICBET1ZFX0NBTV9HUElPX1NFTAkJQklUKDIpCi0jZGVmaW5lICBET1ZFX1NEMV9HUElPX1NFTAkJQklUKDEpCi0jZGVmaW5lICBET1ZFX1NEMF9HUElPX1NFTAkJQklUKDApCisvKiBJbnRlcm5hbCByZWdpc3RlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgYW55IDEgTWlCIGFsaWduZWQgYWRkcmVzcyAqLworI2RlZmluZSBJTlRfUkVHU19NQVNLCQl+KFNaXzFNIC0gMSkKKyNkZWZpbmUgTVBQNF9SRUdTX09GRlMJCTB4ZDA0NDAKKyNkZWZpbmUgUE1VX1JFR1NfT0ZGUwkJMHhkODAyYworI2RlZmluZSBHQ19SRUdTX09GRlMJCTB4ZTgwMmMKIAotI2RlZmluZSBNUFBTX1BFUl9SRUcJOAotI2RlZmluZSBNUFBfQklUUwk0Ci0jZGVmaW5lIE1QUF9NQVNLCTB4ZgorLyogTVBQIEJhc2UgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBNVV9NUFBfR0VORVJBTF9DVFJMCTB4MTAKKyNkZWZpbmUgIEFVMF9BQzk3X1NFTAkJQklUKDE2KQorCisvKiBNUFAgQ29udHJvbCA0IHJlZ2lzdGVyICovCisjZGVmaW5lIFNQSV9HUElPX1NFTAkJQklUKDUpCisjZGVmaW5lIFVBUlQxX0dQSU9fU0VMCQlCSVQoNCkKKyNkZWZpbmUgQVUxX0dQSU9fU0VMCQlCSVQoMykKKyNkZWZpbmUgQ0FNX0dQSU9fU0VMCQlCSVQoMikKKyNkZWZpbmUgU0QxX0dQSU9fU0VMCQlCSVQoMSkKKyNkZWZpbmUgU0QwX0dQSU9fU0VMCQlCSVQoMCkKKworLyogUE1VIFNpZ25hbCBTZWxlY3QgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBNVV9TSUdOQUxfU0VMRUNUXzAJMHgwMAorI2RlZmluZSBQTVVfU0lHTkFMX1NFTEVDVF8xCTB4MDQKKworLyogR2xvYmFsIENvbmZpZyByZWdtYXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIEdMT0JBTF9DT05GSUdfMQkJMHgwMAorI2RlZmluZSAgVFdTSV9FTkFCTEVfT1BUSU9OMQlCSVQoNykKKyNkZWZpbmUgR0xPQkFMX0NPTkZJR18yCQkweDA0CisjZGVmaW5lICBUV1NJX0VOQUJMRV9PUFRJT04yCUJJVCgyMCkKKyNkZWZpbmUgIFRXU0lfRU5BQkxFX09QVElPTjMJQklUKDIxKQorI2RlZmluZSAgVFdTSV9PUFRJT04zX0dQSU8JQklUKDIyKQorI2RlZmluZSBTU1BfQ1RSTF9TVEFUVVNfMQkweDA4CisjZGVmaW5lICBTU1BfT05fQVUxCQlCSVQoMCkKKyNkZWZpbmUgTVBQX0dFTkVSQUxfQ09ORklHCTB4MTAKKyNkZWZpbmUgIEFVMV9TUERJRk9fR1BJT19FTglCSVQoMSkKKyNkZWZpbmUgIE5BTkRfR1BJT19FTgkJQklUKDApCiAKICNkZWZpbmUgQ09ORklHX1BNVQlCSVQoNCkKIAotc3RhdGljIGludCBkb3ZlX3BtdV9tcHBfY3RybF9nZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJCSB1bnNpZ25lZCBsb25nICpjb25maWcpCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1wcDRfYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnBtdV9iYXNlOworc3RhdGljIHN0cnVjdCByZWdtYXAgKmdjb25mbWFwOworCitzdGF0aWMgaW50IGRvdmVfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQogewotCXVuc2lnbmVkIG9mZiA9IChjdHJsLT5waWQgLyBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgc2hpZnQgPSAoY3RybC0+cGlkICUgTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwoRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgZG92ZV9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9zZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKworc3RhdGljIGludCBkb3ZlX3BtdV9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJdW5zaWduZWQgb2ZmID0gKHBpZCAvIE1WRUJVX01QUFNfUEVSX1JFRykgKiBNVkVCVV9NUFBfQklUUzsKKwl1bnNpZ25lZCBzaGlmdCA9IChwaWQgJSBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgbG9uZyBwbXUgPSByZWFkbChtcHBfYmFzZSArIFBNVV9NUFBfR0VORVJBTF9DVFJMKTsKIAl1bnNpZ25lZCBsb25nIGZ1bmM7CiAKLQlpZiAocG11ICYgKDEgPDwgY3RybC0+cGlkKSkgewotCQlmdW5jID0gcmVhZGwoRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKLQkJKmNvbmZpZyA9IChmdW5jID4+IHNoaWZ0KSAmIE1QUF9NQVNLOwotCQkqY29uZmlnIHw9IENPTkZJR19QTVU7Ci0JfSBlbHNlIHsKLQkJZnVuYyA9IHJlYWRsKERPVkVfTVBQX1ZJUlRfQkFTRSArIG9mZik7Ci0JCSpjb25maWcgPSAoZnVuYyA+PiBzaGlmdCkgJiBNUFBfTUFTSzsKLQl9CisJaWYgKChwbXUgJiBCSVQocGlkKSkgPT0gMCkKKwkJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7CisKKwlmdW5jID0gcmVhZGwocG11X2Jhc2UgKyBQTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKKwkqY29uZmlnID0gKGZ1bmMgPj4gc2hpZnQpICYgTVZFQlVfTVBQX01BU0s7CisJKmNvbmZpZyB8PSBDT05GSUdfUE1VOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV9wbXVfbXBwX2N0cmxfc2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQkgdW5zaWduZWQgbG9uZyBjb25maWcpCitzdGF0aWMgaW50IGRvdmVfcG11X21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQogewotCXVuc2lnbmVkIG9mZiA9IChjdHJsLT5waWQgLyBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgc2hpZnQgPSAoY3RybC0+cGlkICUgTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwoRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJdW5zaWduZWQgb2ZmID0gKHBpZCAvIE1WRUJVX01QUFNfUEVSX1JFRykgKiBNVkVCVV9NUFBfQklUUzsKKwl1bnNpZ25lZCBzaGlmdCA9IChwaWQgJSBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgbG9uZyBwbXUgPSByZWFkbChtcHBfYmFzZSArIFBNVV9NUFBfR0VORVJBTF9DVFJMKTsKIAl1bnNpZ25lZCBsb25nIGZ1bmM7CiAKLQlpZiAoY29uZmlnICYgQ09ORklHX1BNVSkgewotCQl3cml0ZWwocG11IHwgKDEgPDwgY3RybC0+cGlkKSwgRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7Ci0JCWZ1bmMgPSByZWFkbChET1ZFX1BNVV9TSUdOQUxfU0VMRUNUXzAgKyBvZmYpOwotCQlmdW5jICY9IH4oTVBQX01BU0sgPDwgc2hpZnQpOwotCQlmdW5jIHw9IChjb25maWcgJiBNUFBfTUFTSykgPDwgc2hpZnQ7Ci0JCXdyaXRlbChmdW5jLCBET1ZFX1BNVV9TSUdOQUxfU0VMRUNUXzAgKyBvZmYpOwotCX0gZWxzZSB7Ci0JCXdyaXRlbChwbXUgJiB+KDEgPDwgY3RybC0+cGlkKSwgRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7Ci0JCWZ1bmMgPSByZWFkbChET1ZFX01QUF9WSVJUX0JBU0UgKyBvZmYpOwotCQlmdW5jICY9IH4oTVBQX01BU0sgPDwgc2hpZnQpOwotCQlmdW5jIHw9IChjb25maWcgJiBNUFBfTUFTSykgPDwgc2hpZnQ7Ci0JCXdyaXRlbChmdW5jLCBET1ZFX01QUF9WSVJUX0JBU0UgKyBvZmYpOworCWlmICgoY29uZmlnICYgQ09ORklHX1BNVSkgPT0gMCkgeworCQl3cml0ZWwocG11ICYgfkJJVChwaWQpLCBtcHBfYmFzZSArIFBNVV9NUFBfR0VORVJBTF9DVFJMKTsKKwkJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7CiAJfQorCisJd3JpdGVsKHBtdSB8IEJJVChwaWQpLCBtcHBfYmFzZSArIFBNVV9NUFBfR0VORVJBTF9DVFJMKTsKKwlmdW5jID0gcmVhZGwocG11X2Jhc2UgKyBQTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKKwlmdW5jICY9IH4oTVZFQlVfTVBQX01BU0sgPDwgc2hpZnQpOworCWZ1bmMgfD0gKGNvbmZpZyAmIE1WRUJVX01QUF9NQVNLKSA8PCBzaGlmdDsKKwl3cml0ZWwoZnVuYywgcG11X2Jhc2UgKyBQTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfbXBwNF9jdHJsX2dldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICpjb25maWcpCitzdGF0aWMgaW50IGRvdmVfbXBwNF9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UpOworCXVuc2lnbmVkIGxvbmcgbXBwNCA9IHJlYWRsKG1wcDRfYmFzZSk7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCi0Jc3dpdGNoIChjdHJsLT5waWQpIHsKKwlzd2l0Y2ggKHBpZCkgewogCWNhc2UgMjQ6IC8qIG1wcF9jYW1lcmEgKi8KLQkJbWFzayA9IERPVkVfQ0FNX0dQSU9fU0VMOworCQltYXNrID0gQ0FNX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDQwOiAvKiBtcHBfc2RpbzAgKi8KLQkJbWFzayA9IERPVkVfU0QwX0dQSU9fU0VMOworCQltYXNrID0gU0QwX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDQ2OiAvKiBtcHBfc2RpbzEgKi8KLQkJbWFzayA9IERPVkVfU0QxX0dQSU9fU0VMOworCQltYXNrID0gU0QxX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDU4OiAvKiBtcHBfc3BpMCAqLwotCQltYXNrID0gRE9WRV9TUElfR1BJT19TRUw7CisJCW1hc2sgPSBTUElfR1BJT19TRUw7CiAJCWJyZWFrOwogCWNhc2UgNjI6IC8qIG1wcF91YXJ0MSAqLwotCQltYXNrID0gRE9WRV9VQVJUMV9HUElPX1NFTDsKKwkJbWFzayA9IFVBUlQxX0dQSU9fU0VMOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyOSwyNyArMTQ0LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV9tcHA0X2N0cmxfc2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX21wcDRfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UpOworCXVuc2lnbmVkIGxvbmcgbXBwNCA9IHJlYWRsKG1wcDRfYmFzZSk7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCi0Jc3dpdGNoIChjdHJsLT5waWQpIHsKKwlzd2l0Y2ggKHBpZCkgewogCWNhc2UgMjQ6IC8qIG1wcF9jYW1lcmEgKi8KLQkJbWFzayA9IERPVkVfQ0FNX0dQSU9fU0VMOworCQltYXNrID0gQ0FNX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDQwOiAvKiBtcHBfc2RpbzAgKi8KLQkJbWFzayA9IERPVkVfU0QwX0dQSU9fU0VMOworCQltYXNrID0gU0QwX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDQ2OiAvKiBtcHBfc2RpbzEgKi8KLQkJbWFzayA9IERPVkVfU0QxX0dQSU9fU0VMOworCQltYXNrID0gU0QxX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDU4OiAvKiBtcHBfc3BpMCAqLwotCQltYXNrID0gRE9WRV9TUElfR1BJT19TRUw7CisJCW1hc2sgPSBTUElfR1BJT19TRUw7CiAJCWJyZWFrOwogCWNhc2UgNjI6IC8qIG1wcF91YXJ0MSAqLwotCQltYXNrID0gRE9WRV9VQVJUMV9HUElPX1NFTDsKKwkJbWFzayA9IFVBUlQxX0dQSU9fU0VMOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1OSw3NCArMTczLDY5IEBACiAJaWYgKGNvbmZpZykKIAkJbXBwNCB8PSBtYXNrOwogCi0Jd3JpdGVsKG1wcDQsIERPVkVfTVBQX0NUUkw0X1ZJUlRfQkFTRSk7CisJd3JpdGVsKG1wcDQsIG1wcDRfYmFzZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX25hbmRfY3RybF9nZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIGludCBkb3ZlX25hbmRfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBnbXBwID0gcmVhZGwoRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOworCXVuc2lnbmVkIGludCBnbXBwOwogCi0JKmNvbmZpZyA9ICgoZ21wcCAmIERPVkVfTkFORF9HUElPX0VOKSAhPSAwKTsKKwlyZWdtYXBfcmVhZChnY29uZm1hcCwgTVBQX0dFTkVSQUxfQ09ORklHLCAmZ21wcCk7CisJKmNvbmZpZyA9ICgoZ21wcCAmIE5BTkRfR1BJT19FTikgIT0gMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX25hbmRfY3RybF9zZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb25maWcpCitzdGF0aWMgaW50IGRvdmVfbmFuZF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQogewotCXVuc2lnbmVkIGxvbmcgZ21wcCA9IHJlYWRsKERPVkVfTVBQX0dFTkVSQUxfVklSVF9CQVNFKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZ2NvbmZtYXAsIE1QUF9HRU5FUkFMX0NPTkZJRywKKwkJCSAgIE5BTkRfR1BJT19FTiwKKwkJCSAgIChjb25maWcpID8gTkFORF9HUElPX0VOIDogMCk7CisJcmV0dXJuIDA7Cit9CiAKLQlnbXBwICY9IH5ET1ZFX05BTkRfR1BJT19FTjsKK3N0YXRpYyBpbnQgZG92ZV9hdWRpbzBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJdW5zaWduZWQgbG9uZyBwbXUgPSByZWFkbChtcHBfYmFzZSArIFBNVV9NUFBfR0VORVJBTF9DVFJMKTsKKworCSpjb25maWcgPSAoKHBtdSAmIEFVMF9BQzk3X1NFTCkgIT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb3ZlX2F1ZGlvMF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisKKwlwbXUgJj0gfkFVMF9BQzk3X1NFTDsKIAlpZiAoY29uZmlnKQotCQlnbXBwIHw9IERPVkVfTkFORF9HUElPX0VOOwotCi0Jd3JpdGVsKGdtcHAsIERPVkVfTVBQX0dFTkVSQUxfVklSVF9CQVNFKTsKKwkJcG11IHw9IEFVMF9BQzk3X1NFTDsKKwl3cml0ZWwocG11LCBtcHBfYmFzZSArIFBNVV9NUFBfR0VORVJBTF9DVFJMKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8wX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQl1bnNpZ25lZCBsb25nICpjb25maWcpCitzdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQogewotCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwoRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJdW5zaWduZWQgaW50IG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOworCXVuc2lnbmVkIGludCBzc3BjMTsKKwl1bnNpZ25lZCBpbnQgZ21wcDsKKwl1bnNpZ25lZCBpbnQgZ2NmZzI7CiAKLQkqY29uZmlnID0gKChwbXUgJiBET1ZFX0FVMF9BQzk3X1NFTCkgIT0gMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkb3ZlX2F1ZGlvMF9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJdW5zaWduZWQgbG9uZyBjb25maWcpCi17Ci0JdW5zaWduZWQgbG9uZyBwbXUgPSByZWFkbChET1ZFX1BNVV9NUFBfR0VORVJBTF9DVFJMKTsKLQotCXBtdSAmPSB+RE9WRV9BVTBfQUM5N19TRUw7Ci0JaWYgKGNvbmZpZykKLQkJcG11IHw9IERPVkVfQVUwX0FDOTdfU0VMOwotCXdyaXRlbChwbXUsIERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZG92ZV9hdWRpbzFfY3RybF9nZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJCXVuc2lnbmVkIGxvbmcgKmNvbmZpZykKLXsKLQl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UpOwotCXVuc2lnbmVkIGxvbmcgc3NwYzEgPSByZWFkbChET1ZFX1NTUF9DVFJMX1NUQVRVU18xKTsKLQl1bnNpZ25lZCBsb25nIGdtcHAgPSByZWFkbChET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7Ci0JdW5zaWduZWQgbG9uZyBnY2ZnMiA9IHJlYWRsKERPVkVfR0xPQkFMX0NPTkZJR18yKTsKKwlyZWdtYXBfcmVhZChnY29uZm1hcCwgU1NQX0NUUkxfU1RBVFVTXzEsICZzc3BjMSk7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIE1QUF9HRU5FUkFMX0NPTkZJRywgJmdtcHApOworCXJlZ21hcF9yZWFkKGdjb25mbWFwLCBHTE9CQUxfQ09ORklHXzIsICZnY2ZnMik7CiAKIAkqY29uZmlnID0gMDsKLQlpZiAobXBwNCAmIERPVkVfQVUxX0dQSU9fU0VMKQorCWlmIChtcHA0ICYgQVUxX0dQSU9fU0VMKQogCQkqY29uZmlnIHw9IEJJVCgzKTsKLQlpZiAoc3NwYzEgJiBET1ZFX1NTUF9PTl9BVTEpCisJaWYgKHNzcGMxICYgU1NQX09OX0FVMSkKIAkJKmNvbmZpZyB8PSBCSVQoMik7Ci0JaWYgKGdtcHAgJiBET1ZFX0FVMV9TUERJRk9fR1BJT19FTikKKwlpZiAoZ21wcCAmIEFVMV9TUERJRk9fR1BJT19FTikKIAkJKmNvbmZpZyB8PSBCSVQoMSk7Ci0JaWYgKGdjZmcyICYgRE9WRV9UV1NJX09QVElPTjNfR1BJTykKKwlpZiAoZ2NmZzIgJiBUV1NJX09QVElPTjNfR1BJTykKIAkJKmNvbmZpZyB8PSBCSVQoMCk7CiAKIAkvKiBTU1AvVFdTSSBvbmx5IGlmIEkyUzEgbm90IHNldCovCkBAIC0yMzgsMzUgKzI0NywyNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfc2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQl1bnNpZ25lZCBsb25nIGNvbmZpZykKK3N0YXRpYyBpbnQgZG92ZV9hdWRpbzFfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UpOwotCXVuc2lnbmVkIGxvbmcgc3NwYzEgPSByZWFkbChET1ZFX1NTUF9DVFJMX1NUQVRVU18xKTsKLQl1bnNpZ25lZCBsb25nIGdtcHAgPSByZWFkbChET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7Ci0JdW5zaWduZWQgbG9uZyBnY2ZnMiA9IHJlYWRsKERPVkVfR0xPQkFMX0NPTkZJR18yKTsKKwl1bnNpZ25lZCBpbnQgbXBwNCA9IHJlYWRsKG1wcDRfYmFzZSk7CiAKLQkvKgotCSAqIGNsZWFyIGFsbCBhdWRpbzEgcmVsYXRlZCBiaXRzIGJlZm9yZSBjb25maWd1cmUKLQkgKi8KLQlnY2ZnMiAmPSB+RE9WRV9UV1NJX09QVElPTjNfR1BJTzsKLQlnbXBwICY9IH5ET1ZFX0FVMV9TUERJRk9fR1BJT19FTjsKLQlzc3BjMSAmPSB+RE9WRV9TU1BfT05fQVUxOwotCW1wcDQgJj0gfkRPVkVfQVUxX0dQSU9fU0VMOwotCi0JaWYgKGNvbmZpZyAmIEJJVCgwKSkKLQkJZ2NmZzIgfD0gRE9WRV9UV1NJX09QVElPTjNfR1BJTzsKLQlpZiAoY29uZmlnICYgQklUKDEpKQotCQlnbXBwIHw9IERPVkVfQVUxX1NQRElGT19HUElPX0VOOwotCWlmIChjb25maWcgJiBCSVQoMikpCi0JCXNzcGMxIHw9IERPVkVfU1NQX09OX0FVMTsKKwltcHA0ICY9IH5BVTFfR1BJT19TRUw7CiAJaWYgKGNvbmZpZyAmIEJJVCgzKSkKLQkJbXBwNCB8PSBET1ZFX0FVMV9HUElPX1NFTDsKKwkJbXBwNCB8PSBBVTFfR1BJT19TRUw7CisJd3JpdGVsKG1wcDQsIG1wcDRfYmFzZSk7CiAKLQl3cml0ZWwobXBwNCwgRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKLQl3cml0ZWwoc3NwYzEsIERPVkVfU1NQX0NUUkxfU1RBVFVTXzEpOwotCXdyaXRlbChnbXBwLCBET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7Ci0Jd3JpdGVsKGdjZmcyLCBET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBTU1BfQ1RSTF9TVEFUVVNfMSwKKwkJCSAgIFNTUF9PTl9BVTEsCisJCQkgICAoY29uZmlnICYgQklUKDIpKSA/IFNTUF9PTl9BVTEgOiAwKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZ2NvbmZtYXAsIE1QUF9HRU5FUkFMX0NPTkZJRywKKwkJCSAgIEFVMV9TUERJRk9fR1BJT19FTiwKKwkJCSAgIChjb25maWcgJiBCSVQoMSkpID8gQVUxX1NQRElGT19HUElPX0VOIDogMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBHTE9CQUxfQ09ORklHXzIsCisJCQkgICBUV1NJX09QVElPTjNfR1BJTywKKwkJCSAgIChjb25maWcgJiBCSVQoMCkpID8gVFdTSV9PUFRJT04zX0dQSU8gOiAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjc2LDExICsyNzQsMTEgQEAKICAqIGJyZWFrIG90aGVyIGZ1bmN0aW9ucy4gSWYgeW91IHJlcXVpcmUgYWxsIG1wcHMgYXMgZ3BpbwogICogZW5mb3JjZSBncGlvIHNldHRpbmcgYnkgcGluY3RybCBtYXBwaW5nLgogICovCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ3Bpb19yZXEoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLCB1OCBwaWQpCitzdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ3Bpb19yZXEodW5zaWduZWQgcGlkKQogewogCXVuc2lnbmVkIGxvbmcgY29uZmlnOwogCi0JZG92ZV9hdWRpbzFfY3RybF9nZXQoY3RybCwgJmNvbmZpZyk7CisJZG92ZV9hdWRpbzFfY3RybF9nZXQocGlkLCAmY29uZmlnKTsKIAogCXN3aXRjaCAoY29uZmlnKSB7CiAJY2FzZSAweDAyOiAvKiBpMnMxIDogZ3Bpb1s1Njo1N10gKi8KQEAgLTMwMyw3NiArMzAxLDYyIEBACiB9CiAKIC8qIG1wcFs1Mjo1N10gaGFzIGdwaW8gcGlucyBjYXBhYmxlIG9mIGluIGFuZCBvdXQgKi8KLXN0YXRpYyBpbnQgZG92ZV9hdWRpbzFfY3RybF9ncGlvX2RpcihzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsIHU4IHBpZCwKLQkJCQlib29sIGlucHV0KQorc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dwaW9fZGlyKHVuc2lnbmVkIHBpZCwgYm9vbCBpbnB1dCkKIHsKIAlpZiAocGlkIDwgNTIgfHwgcGlkID4gNTcpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV90d3NpX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3N0YXRpYyBpbnQgZG92ZV90d3NpX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQogewotCXVuc2lnbmVkIGxvbmcgZ2NmZzEgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMSk7Ci0JdW5zaWduZWQgbG9uZyBnY2ZnMiA9IHJlYWRsKERPVkVfR0xPQkFMX0NPTkZJR18yKTsKKwl1bnNpZ25lZCBpbnQgZ2NmZzE7CisJdW5zaWduZWQgaW50IGdjZmcyOworCisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIEdMT0JBTF9DT05GSUdfMSwgJmdjZmcxKTsKKwlyZWdtYXBfcmVhZChnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18yLCAmZ2NmZzIpOwogCiAJKmNvbmZpZyA9IDA7Ci0JaWYgKGdjZmcxICYgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04xKQorCWlmIChnY2ZnMSAmIFRXU0lfRU5BQkxFX09QVElPTjEpCiAJCSpjb25maWcgPSAxOwotCWVsc2UgaWYgKGdjZmcyICYgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04yKQorCWVsc2UgaWYgKGdjZmcyICYgVFdTSV9FTkFCTEVfT1BUSU9OMikKIAkJKmNvbmZpZyA9IDI7Ci0JZWxzZSBpZiAoZ2NmZzIgJiBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjMpCisJZWxzZSBpZiAoZ2NmZzIgJiBUV1NJX0VOQUJMRV9PUFRJT04zKQogCQkqY29uZmlnID0gMzsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfdHdzaV9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJdW5zaWduZWQgbG9uZyBjb25maWcpCitzdGF0aWMgaW50IGRvdmVfdHdzaV9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQogewotCXVuc2lnbmVkIGxvbmcgZ2NmZzEgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMSk7Ci0JdW5zaWduZWQgbG9uZyBnY2ZnMiA9IHJlYWRsKERPVkVfR0xPQkFMX0NPTkZJR18yKTsKLQotCWdjZmcxICY9IH5ET1ZFX1RXU0lfRU5BQkxFX09QVElPTjE7Ci0JZ2NmZzIgJj0gfihET1ZFX1RXU0lfRU5BQkxFX09QVElPTjIgfCBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjMpOworCXVuc2lnbmVkIGludCBnY2ZnMSA9IDA7CisJdW5zaWduZWQgaW50IGdjZmcyID0gMDsKIAogCXN3aXRjaCAoY29uZmlnKSB7CiAJY2FzZSAxOgotCQlnY2ZnMSB8PSBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjE7CisJCWdjZmcxID0gVFdTSV9FTkFCTEVfT1BUSU9OMTsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlnY2ZnMiB8PSBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjI7CisJCWdjZmcyID0gVFdTSV9FTkFCTEVfT1BUSU9OMjsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlnY2ZnMiB8PSBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjM7CisJCWdjZmcyID0gVFdTSV9FTkFCTEVfT1BUSU9OMzsKIAkJYnJlYWs7CiAJfQogCi0Jd3JpdGVsKGdjZmcxLCBET1ZFX0dMT0JBTF9DT05GSUdfMSk7Ci0Jd3JpdGVsKGdjZmcyLCBET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBHTE9CQUxfQ09ORklHXzEsCisJCQkgICBUV1NJX0VOQUJMRV9PUFRJT04xLAorCQkJICAgZ2NmZzEpOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18yLAorCQkJICAgVFdTSV9FTkFCTEVfT1BUSU9OMiB8IFRXU0lfRU5BQkxFX09QVElPTjMsCisJCQkgICBnY2ZnMik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBkb3ZlX21wcF9jb250cm9sc1tdID0gewotCU1QUF9GVU5DX0NUUkwoMCwgMCwgIm1wcDAiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxLCAxLCAibXBwMSIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDIsIDIsICJtcHAyIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMywgMywgIm1wcDMiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCg0LCA0LCAibXBwNCIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDUsIDUsICJtcHA1IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoNiwgNiwgIm1wcDYiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCg3LCA3LCAibXBwNyIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDgsIDgsICJtcHA4IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoOSwgOSwgIm1wcDkiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxMCwgMTAsICJtcHAxMCIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDExLCAxMSwgIm1wcDExIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMTIsIDEyLCAibXBwMTIiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxMywgMTMsICJtcHAxMyIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDE0LCAxNCwgIm1wcDE0IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMTUsIDE1LCAibXBwMTUiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX1JFR19DVFJMKDE2LCAyMyksCisJTVBQX0ZVTkNfQ1RSTCgwLCAxNSwgTlVMTCwgZG92ZV9wbXVfbXBwX2N0cmwpLAorCU1QUF9GVU5DX0NUUkwoMTYsIDIzLCBOVUxMLCBkb3ZlX21wcF9jdHJsKSwKIAlNUFBfRlVOQ19DVFJMKDI0LCAzOSwgIm1wcF9jYW1lcmEiLCBkb3ZlX21wcDRfY3RybCksCiAJTVBQX0ZVTkNfQ1RSTCg0MCwgNDUsICJtcHBfc2RpbzAiLCBkb3ZlX21wcDRfY3RybCksCiAJTVBQX0ZVTkNfQ1RSTCg0NiwgNTEsICJtcHBfc2RpbzEiLCBkb3ZlX21wcDRfY3RybCksCkBAIC03NzIsOCArNzU2LDE3IEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgZ2NfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSAzMiwKKwkudmFsX2JpdHMgPSAzMiwKKwkucmVnX3N0cmlkZSA9IDQsCisJLm1heF9yZWdpc3RlciA9IDUsCit9OworCiBzdGF0aWMgaW50IGRvdmVfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqbXBwX3JlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgZmJfcmVzOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0KIAkJb2ZfbWF0Y2hfZGV2aWNlKGRvdmVfcGluY3RybF9vZl9tYXRjaCwgJnBkZXYtPmRldik7CiAJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKW1hdGNoLT5kYXRhOwpAQCAtNzg5LDYgKzc4Miw1OSBAQAogCX0KIAljbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKIAorCW1wcF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1wcF9yZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CisKKwkvKiBwcmVwYXJlIGZhbGxiYWNrIHJlc291cmNlICovCisJbWVtY3B5KCZmYl9yZXMsIG1wcF9yZXMsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwlmYl9yZXMuc3RhcnQgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXJlcykgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZmFsbGluZyBiYWNrIHRvIGhhcmRjb2RlZCBNUFA0IHJlc291cmNlXG4iKTsKKwkJYWRqdXN0X3Jlc291cmNlKCZmYl9yZXMsCisJCQkobXBwX3Jlcy0+c3RhcnQgJiBJTlRfUkVHU19NQVNLKSArIE1QUDRfUkVHU19PRkZTLCAweDQpOworCQlyZXMgPSAmZmJfcmVzOworCX0KKworCW1wcDRfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwNF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwNF9iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJaWYgKCFyZXMpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhbGxpbmcgYmFjayB0byBoYXJkY29kZWQgUE1VIHJlc291cmNlXG4iKTsKKwkJYWRqdXN0X3Jlc291cmNlKCZmYl9yZXMsCisJCQkobXBwX3Jlcy0+c3RhcnQgJiBJTlRfUkVHU19NQVNLKSArIFBNVV9SRUdTX09GRlMsIDB4OCk7CisJCXJlcyA9ICZmYl9yZXM7CisJfQorCisJcG11X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBtdV9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIocG11X2Jhc2UpOworCisJZ2NvbmZtYXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9jb21wYXRpYmxlKCJtYXJ2ZWxsLGRvdmUtZ2xvYmFsLWNvbmZpZyIpOworCWlmIChJU19FUlIoZ2NvbmZtYXApKSB7CisJCXZvaWQgX19pb21lbSAqZ2NfYmFzZTsKKworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZmFsbGluZyBiYWNrIHRvIGhhcmRjb2RlZCBnbG9iYWwgcmVnaXN0ZXJzXG4iKTsKKwkJYWRqdXN0X3Jlc291cmNlKCZmYl9yZXMsCisJCQkobXBwX3Jlcy0+c3RhcnQgJiBJTlRfUkVHU19NQVNLKSArIEdDX1JFR1NfT0ZGUywgMHgxNCk7CisJCWdjX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgJmZiX3Jlcyk7CisJCWlmIChJU19FUlIoZ2NfYmFzZSkpCisJCQlyZXR1cm4gUFRSX0VSUihnY19iYXNlKTsKKwkJZ2NvbmZtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oJnBkZXYtPmRldiwKKwkJCQkJCSBnY19iYXNlLCAmZ2NfcmVnbWFwX2NvbmZpZyk7CisJCWlmIChJU19FUlIoZ2NvbmZtYXApKQorCQkJcmV0dXJuIFBUUl9FUlIoZ2NvbmZtYXApOworCX0KKworCS8qIFdhcm4gb24gYW55IG1pc3NpbmcgRFQgcmVzb3VyY2UgKi8KKwlpZiAoZmJfcmVzLnN0YXJ0KQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCBGV19CVUcgIk1pc3NpbmcgcGluY3RybCByZWdzIGluIERUQi4gUGxlYXNlIHVwZGF0ZSB5b3VyIGZpcm13YXJlLlxuIik7CisKIAlyZXR1cm4gbXZlYnVfcGluY3RybF9wcm9iZShwZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwta2lya3dvb2QuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMKaW5kZXggNmI1MDRiNS4uMGQwMjExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwta2lya3dvb2QuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1raXJrd29vZC5jCkBAIC0yMSw2ICsyMSwxOCBAQAogCiAjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgogCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKKworc3RhdGljIGludCBraXJrd29vZF9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQga2lya3dvb2RfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKICNkZWZpbmUgVihmNjE4MCwgZjYxOTAsIGY2MTkyLCBmNjI4MSwgZjYyODIsIGR4NDEyMikJXAogCSgoZjYxODAgPDwgMCkgfCAoZjYxOTAgPDwgMSkgfCAoZjYxOTIgPDwgMikgfAlcCiAJIChmNjI4MSA8PCAzKSB8IChmNjI4MiA8PCA0KSB8IChkeDQxMjIgPDwgNSkpCkBAIC0zNTksNyArMzcxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY4OGY2MTgwX21wcF9jb250cm9sc1tdID0gewotCU1QUF9SRUdfQ1RSTCgwLCAyOSksCisJTVBQX0ZVTkNfQ1RSTCgwLCAyOSwgTlVMTCwga2lya3dvb2RfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY4OGY2MTgwX2dwaW9fcmFuZ2VzW10gPSB7CkBAIC0zNjcsNyArMzc5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY4OGY2MTl4X21wcF9jb250cm9sc1tdID0gewotCU1QUF9SRUdfQ1RSTCgwLCAzNSksCisJTVBQX0ZVTkNfQ1RSTCgwLCAzNSwgTlVMTCwga2lya3dvb2RfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY4OGY2MTl4X2dwaW9fcmFuZ2VzW10gPSB7CkBAIC0zNzYsNyArMzg4LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY4OGY2Mjh4X21wcF9jb250cm9sc1tdID0gewotCU1QUF9SRUdfQ1RSTCgwLCA0OSksCisJTVBQX0ZVTkNfQ1RSTCgwLCA0OSwgTlVMTCwga2lya3dvb2RfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY4OGY2Mjh4X2dwaW9fcmFuZ2VzW10gPSB7CkBAIC00NTYsOSArNDY4LDE2IEBACiAKIHN0YXRpYyBpbnQga2lya3dvb2RfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0KIAkJb2ZfbWF0Y2hfZGV2aWNlKGtpcmt3b29kX3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKiltYXRjaC0+ZGF0YTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJbXBwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1wcF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwX2Jhc2UpOworCiAJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5jCmluZGV4IDBmZDFhZDMuLjk5MDgzNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtbXZlYnUuYwpAQCAtNTAsNyArNTAsNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXY7CiAJc3RydWN0IHBpbmN0cmxfZGVzYyBkZXNjOwotCXZvaWQgX19pb21lbSAqYmFzZTsKIAlzdHJ1Y3QgbXZlYnVfcGluY3RybF9ncm91cCAqZ3JvdXBzOwogCXVuc2lnbmVkIG51bV9ncm91cHM7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfZnVuY3Rpb24gKmZ1bmN0aW9uczsKQEAgLTEzOCw0MyArMTM3LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyoKLSAqIENvbW1vbiBtcHAgcGluIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIG9uIE1WRUJVIGFyZQotICogcmVnaXN0ZXJzIG9mIGVpZ2h0IDQtYml0IHZhbHVlcyBmb3IgZWFjaCBtcHAgc2V0dGluZy4KLSAqIFJlZ2lzdGVyIG9mZnNldCBhbmQgYml0IG1hc2sgYXJlIGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHkgYmVsb3cuCi0gKi8KLXN0YXRpYyBpbnQgbXZlYnVfY29tbW9uX21wcF9nZXQoc3RydWN0IG12ZWJ1X3BpbmN0cmwgKnBjdGwsCi0JCQkJc3RydWN0IG12ZWJ1X3BpbmN0cmxfZ3JvdXAgKmdycCwKLQkJCQl1bnNpZ25lZCBsb25nICpjb25maWcpCi17Ci0JdW5zaWduZWQgcGluID0gZ3JwLT5naWQ7Ci0JdW5zaWduZWQgb2ZmID0gKHBpbiAvIE1QUFNfUEVSX1JFRykgKiBNUFBfQklUUzsKLQl1bnNpZ25lZCBzaGlmdCA9IChwaW4gJSBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0KLQkqY29uZmlnID0gcmVhZGwocGN0bC0+YmFzZSArIG9mZik7Ci0JKmNvbmZpZyA+Pj0gc2hpZnQ7Ci0JKmNvbmZpZyAmPSBNUFBfTUFTSzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG12ZWJ1X2NvbW1vbl9tcHBfc2V0KHN0cnVjdCBtdmVidV9waW5jdHJsICpwY3RsLAotCQkJCXN0cnVjdCBtdmVidV9waW5jdHJsX2dyb3VwICpncnAsCi0JCQkJdW5zaWduZWQgbG9uZyBjb25maWcpCi17Ci0JdW5zaWduZWQgcGluID0gZ3JwLT5naWQ7Ci0JdW5zaWduZWQgb2ZmID0gKHBpbiAvIE1QUFNfUEVSX1JFRykgKiBNUFBfQklUUzsKLQl1bnNpZ25lZCBzaGlmdCA9IChwaW4gJSBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgbG9uZyByZWc7Ci0KLQlyZWcgPSByZWFkbChwY3RsLT5iYXNlICsgb2ZmKTsKLQlyZWcgJj0gfihNUFBfTUFTSyA8PCBzaGlmdCk7Ci0JcmVnIHw9IChjb25maWcgPDwgc2hpZnQpOwotCXdyaXRlbChyZWcsIHBjdGwtPmJhc2UgKyBvZmYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXZlYnVfcGluY29uZl9ncm91cF9nZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAogCQkJCXVuc2lnbmVkIGdpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQogewpAQCAtMTg0LDEwICsxNDYsNyBAQAogCWlmICghZ3JwLT5jdHJsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChncnAtPmN0cmwtPm1wcF9nZXQpCi0JCXJldHVybiBncnAtPmN0cmwtPm1wcF9nZXQoZ3JwLT5jdHJsLCBjb25maWcpOwotCi0JcmV0dXJuIG12ZWJ1X2NvbW1vbl9tcHBfZ2V0KHBjdGwsIGdycCwgY29uZmlnKTsKKwlyZXR1cm4gZ3JwLT5jdHJsLT5tcHBfZ2V0KGdycC0+cGluc1swXSwgY29uZmlnKTsKIH0KIAogc3RhdGljIGludCBtdmVidV9waW5jb25mX2dyb3VwX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCkBAIC0yMDIsMTEgKzE2MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9jb25maWdzOyBpKyspIHsKLQkJaWYgKGdycC0+Y3RybC0+bXBwX3NldCkKLQkJCXJldCA9IGdycC0+Y3RybC0+bXBwX3NldChncnAtPmN0cmwsIGNvbmZpZ3NbaV0pOwotCQllbHNlCi0JCQlyZXQgPSBtdmVidV9jb21tb25fbXBwX3NldChwY3RsLCBncnAsIGNvbmZpZ3NbaV0pOwotCisJCXJldCA9IGdycC0+Y3RybC0+bXBwX3NldChncnAtPnBpbnNbMF0sIGNvbmZpZ3NbaV0pOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9IC8qIGZvciBlYWNoIGNvbmZpZyAqLwpAQCAtMzQ3LDcgKzMwMiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGdycC0+Y3RybC0+bXBwX2dwaW9fcmVxKQotCQlyZXR1cm4gZ3JwLT5jdHJsLT5tcHBfZ3Bpb19yZXEoZ3JwLT5jdHJsLCBvZmZzZXQpOworCQlyZXR1cm4gZ3JwLT5jdHJsLT5tcHBfZ3Bpb19yZXEob2Zmc2V0KTsKIAogCXNldHRpbmcgPSBtdmVidV9waW5jdHJsX2ZpbmRfZ3Bpb19zZXR0aW5nKHBjdGwsIGdycCk7CiAJaWYgKCFzZXR0aW5nKQpAQCAtMzcwLDcgKzMyNSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGdycC0+Y3RybC0+bXBwX2dwaW9fZGlyKQotCQlyZXR1cm4gZ3JwLT5jdHJsLT5tcHBfZ3Bpb19kaXIoZ3JwLT5jdHJsLCBvZmZzZXQsIGlucHV0KTsKKwkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fZGlyKG9mZnNldCwgaW5wdXQpOwogCiAJc2V0dGluZyA9IG12ZWJ1X3BpbmN0cmxfZmluZF9ncGlvX3NldHRpbmcocGN0bCwgZ3JwKTsKIAlpZiAoIXNldHRpbmcpCkBAIC01OTMsMTEgKzU0OCwxMiBAQAogaW50IG12ZWJ1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgbXZlYnVfcGluY3RybCAqcGN0bDsKLQl2b2lkIF9faW9tZW0gKmJhc2U7CiAJc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKnBkZXNjOwogCXVuc2lnbmVkIGdpZCwgbiwgazsKKwl1bnNpZ25lZCBzaXplLCBub25hbWUgPSAwOworCWNoYXIgKm5vbmFtZV9idWY7CisJdm9pZCAqcDsKIAlpbnQgcmV0OwogCiAJaWYgKCFzb2MgfHwgIXNvYy0+Y29udHJvbHMgfHwgIXNvYy0+bW9kZXMpIHsKQEAgLTYwNSwxMSArNTYxLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihiYXNlKSkKLQkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7Ci0KIAlwY3RsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbXZlYnVfcGluY3RybCksCiAJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXBjdGwpIHsKQEAgLTYyMyw3ICs1NzQsNiBAQAogCXBjdGwtPmRlc2MucG14b3BzID0gJm12ZWJ1X3Bpbm11eF9vcHM7CiAJcGN0bC0+ZGVzYy5jb25mb3BzID0gJm12ZWJ1X3BpbmNvbmZfb3BzOwogCXBjdGwtPnZhcmlhbnQgPSBzb2MtPnZhcmlhbnQ7Ci0JcGN0bC0+YmFzZSA9IGJhc2U7CiAJcGN0bC0+ZGV2ID0gJnBkZXYtPmRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwY3RsKTsKIApAQCAtNjMzLDMzICs1ODMsMjMgQEAKIAlwY3RsLT5kZXNjLm5waW5zID0gMDsKIAlmb3IgKG4gPSAwOyBuIDwgc29jLT5uY29udHJvbHM7IG4rKykgewogCQlzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwgPSAmc29jLT5jb250cm9sc1tuXTsKLQkJY2hhciAqbmFtZXM7CiAKIAkJcGN0bC0+ZGVzYy5ucGlucyArPSBjdHJsLT5ucGluczsKLQkJLyogaW5pdGlhbCBjb250cm9sIHBpbnMgKi8KKwkJLyogaW5pdGlhbGl6ZSBjb250cm9sJ3MgcGluc1tdIGFycmF5ICovCiAJCWZvciAoayA9IDA7IGsgPCBjdHJsLT5ucGluczsgaysrKQogCQkJY3RybC0+cGluc1trXSA9IGN0cmwtPnBpZCArIGs7CiAKLQkJLyogc3BlY2lhbCBzb2Mgc3BlY2lmaWMgY29udHJvbCAqLwotCQlpZiAoY3RybC0+bXBwX2dldCB8fCBjdHJsLT5tcHBfc2V0KSB7Ci0JCQlpZiAoIWN0cmwtPm5hbWUgfHwgIWN0cmwtPm1wcF9nZXQgfHwgIWN0cmwtPm1wcF9zZXQpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ3cm9uZyBzb2MgY29udHJvbCBpbmZvXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KKwkJLyoKKwkJICogV2UgYWxsb3cgdG8gcGFzcyBjb250cm9scyB3aXRoIE5VTEwgbmFtZSB0aGF0IHdlIHRyZWF0CisJCSAqIGFzIGEgcmFuZ2Ugb2Ygb25lLXBpbiBncm91cHMgd2l0aCBnZW5lcmljIG12ZWJ1IHJlZ2lzdGVyCisJCSAqIGNvbnRyb2xzLgorCQkgKi8KKwkJaWYgKCFjdHJsLT5uYW1lKSB7CisJCQlwY3RsLT5udW1fZ3JvdXBzICs9IGN0cmwtPm5waW5zOworCQkJbm9uYW1lICs9IGN0cmwtPm5waW5zOworCQl9IGVsc2UgewogCQkJcGN0bC0+bnVtX2dyb3VwcyArPSAxOwotCQkJY29udGludWU7CiAJCX0KLQotCQkvKiBnZW5lcmljIG12ZWJ1IHJlZ2lzdGVyIGNvbnRyb2wgKi8KLQkJbmFtZXMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgY3RybC0+bnBpbnMgKiA4LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuYW1lcykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIG1wcCBuYW1lc1xuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlmb3IgKGsgPSAwOyBrIDwgY3RybC0+bnBpbnM7IGsrKykKLQkJCXNwcmludGYobmFtZXMgKyA4KmssICJtcHAlZCIsIGN0cmwtPnBpZCtrKTsKLQkJY3RybC0+bmFtZSA9IG5hbWVzOwotCQlwY3RsLT5udW1fZ3JvdXBzICs9IGN0cmwtPm5waW5zOwogCX0KIAogCXBkZXNjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHBjdGwtPmRlc2MubnBpbnMgKgpAQCAtNjczLDEyICs2MTMsMTcgQEAKIAkJcGRlc2Nbbl0ubnVtYmVyID0gbjsKIAlwY3RsLT5kZXNjLnBpbnMgPSBwZGVzYzsKIAotCXBjdGwtPmdyb3VwcyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwY3RsLT5udW1fZ3JvdXBzICoKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBtdmVidV9waW5jdHJsX2dyb3VwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY3RsLT5ncm91cHMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIHBpbmN0cmwgZ3JvdXBzXG4iKTsKKwkvKgorCSAqIGFsbG9jYXRlIGdyb3VwcyBhbmQgbmFtZSBidWZmZXJzIGZvciB1bm5hbWVkIGdyb3Vwcy4KKwkgKi8KKwlzaXplID0gcGN0bC0+bnVtX2dyb3VwcyAqIHNpemVvZigqcGN0bC0+Z3JvdXBzKSArIG5vbmFtZSAqIDg7CisJcCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIGdyb3VwIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJcGN0bC0+Z3JvdXBzID0gcDsKKwlub25hbWVfYnVmID0gcCArIHBjdGwtPm51bV9ncm91cHMgKiBzaXplb2YoKnBjdGwtPmdyb3Vwcyk7CiAKIAkvKiBhc3NpZ24gbXBwIGNvbnRyb2xzIHRvIGdyb3VwcyAqLwogCWdpZCA9IDA7CkBAIC02OTAsMTcgKzYzNSwyNiBAQAogCQlwY3RsLT5ncm91cHNbZ2lkXS5waW5zID0gY3RybC0+cGluczsKIAkJcGN0bC0+Z3JvdXBzW2dpZF0ubnBpbnMgPSBjdHJsLT5ucGluczsKIAotCQkvKiBnZW5lcmljIG12ZWJ1IHJlZ2lzdGVyIGNvbnRyb2wgbWFwcyB0byBhIG51bWJlciBvZiBncm91cHMgKi8KLQkJaWYgKCFjdHJsLT5tcHBfZ2V0ICYmICFjdHJsLT5tcHBfc2V0KSB7CisJCS8qCisJCSAqIFdlIHRyZWF0IHVubmFtZWQgY29udHJvbHMgYXMgYSByYW5nZSBvZiBvbmUtcGluIGdyb3VwcworCQkgKiB3aXRoIGdlbmVyaWMgbXZlYnUgcmVnaXN0ZXIgY29udHJvbHMuIFVzZSBvbmUgZ3JvdXAgZm9yCisJCSAqIGVhY2ggaW4gdGhpcyByYW5nZSBhbmQgYXNzaWduIGEgZGVmYXVsdCBncm91cCBuYW1lLgorCQkgKi8KKwkJaWYgKCFjdHJsLT5uYW1lKSB7CisJCQlwY3RsLT5ncm91cHNbZ2lkXS5uYW1lID0gbm9uYW1lX2J1ZjsKIAkJCXBjdGwtPmdyb3Vwc1tnaWRdLm5waW5zID0gMTsKKwkJCXNwcmludGYobm9uYW1lX2J1ZiwgIm1wcCVkIiwgY3RybC0+cGlkKzApOworCQkJbm9uYW1lX2J1ZiArPSA4OwogCiAJCQlmb3IgKGsgPSAxOyBrIDwgY3RybC0+bnBpbnM7IGsrKykgewogCQkJCWdpZCsrOwogCQkJCXBjdGwtPmdyb3Vwc1tnaWRdLmdpZCA9IGdpZDsKIAkJCQlwY3RsLT5ncm91cHNbZ2lkXS5jdHJsID0gY3RybDsKLQkJCQlwY3RsLT5ncm91cHNbZ2lkXS5uYW1lID0gJmN0cmwtPm5hbWVbOCprXTsKKwkJCQlwY3RsLT5ncm91cHNbZ2lkXS5uYW1lID0gbm9uYW1lX2J1ZjsKIAkJCQlwY3RsLT5ncm91cHNbZ2lkXS5waW5zID0gJmN0cmwtPnBpbnNba107CiAJCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubnBpbnMgPSAxOworCQkJCXNwcmludGYobm9uYW1lX2J1ZiwgIm1wcCVkIiwgY3RybC0+cGlkK2spOworCQkJCW5vbmFtZV9idWYgKz0gODsKIAkJCX0KIAkJfQogCQlnaWQrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmggYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5oCmluZGV4IDkwYmQzYmUuLjY1YTk4ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmgKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtbXZlYnUuaApAQCAtMjgsMjAgKzI4LDE5IEBACiAgKiBiZXR3ZWVuIHR3byBvciBtb3JlIGRpZmZlcmVudCBzZXR0aW5ncywgZS5nLiBhc3NpZ24gbXBwIHBpbiAxMyB0bwogICogdWFydDEgb3Igc2F0YS4KICAqCi0gKiBJZiBvcHRpb25hbCBtcHBfZ2V0L19zZXQgZnVuY3Rpb25zIGFyZSBzZXQgdGhlc2UgYXJlIHVzZWQgdG8gZ2V0L3NldAotICogYSBzcGVjaWZpYyBtb2RlLiBPdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtcHAgY29udHJvbCBpcyBiYXNlZAotICogb24gNC1iaXQgZ3JvdXBzIGluIHN1YnNlcXVlbnQgcmVnaXN0ZXJzLiBUaGUgb3B0aW9uYWwgbXBwX2dwaW9fcmVxL19kaXIKLSAqIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBhbGxvdyBwaW4gc2V0dGluZ3Mgd2l0aCB2YXJ5aW5nIGdwaW8gcGlucy4KKyAqIFRoZSBtcHBfZ2V0L19zZXQgZnVuY3Rpb25zIGFyZSBtYW5kYXRvcnkgYW5kIGFyZSB1c2VkIHRvIGdldC9zZXQgYQorICogc3BlY2lmaWMgbW9kZS4gVGhlIG9wdGlvbmFsIG1wcF9ncGlvX3JlcS9fZGlyIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZAorICogdG8gYWxsb3cgcGluIHNldHRpbmdzIHdpdGggdmFyeWluZyBncGlvIHBpbnMuCiAgKi8KIHN0cnVjdCBtdmVidV9tcHBfY3RybCB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1OCBwaWQ7CiAJdTggbnBpbnM7CiAJdW5zaWduZWQgKnBpbnM7Ci0JaW50ICgqbXBwX2dldCkoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLCB1bnNpZ25lZCBsb25nICpjb25maWcpOwotCWludCAoKm1wcF9zZXQpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdW5zaWduZWQgbG9uZyBjb25maWcpOwotCWludCAoKm1wcF9ncGlvX3JlcSkoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLCB1OCBwaWQpOwotCWludCAoKm1wcF9ncGlvX2Rpcikoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLCB1OCBwaWQsIGJvb2wgaW5wdXQpOworCWludCAoKm1wcF9nZXQpKHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKTsKKwlpbnQgKCptcHBfc2V0KSh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKTsKKwlpbnQgKCptcHBfZ3Bpb19yZXEpKHVuc2lnbmVkIHBpZCk7CisJaW50ICgqbXBwX2dwaW9fZGlyKSh1bnNpZ25lZCBwaWQsIGJvb2wgaW5wdXQpOwogfTsKIAogLyoqCkBAIC0xMTQsMTggKzExMyw2IEBACiAJaW50IG5ncGlvcmFuZ2VzOwogfTsKIAotI2RlZmluZSBNUFBfUkVHX0NUUkwoX2lkbCwgX2lkaCkJCQkJXAotCXsJCQkJCQkJXAotCQkubmFtZSA9IE5VTEwsCQkJCQlcCi0JCS5waWQgPSBfaWRsLAkJCQkJXAotCQkubnBpbnMgPSBfaWRoIC0gX2lkbCArIDEsCQkJXAotCQkucGlucyA9ICh1bnNpZ25lZFtfaWRoIC0gX2lkbCArIDFdKSB7IH0sCVwKLQkJLm1wcF9nZXQgPSBOVUxMLAkJCQlcCi0JCS5tcHBfc2V0ID0gTlVMTCwJCQkJXAotCQkubXBwX2dwaW9fcmVxID0gTlVMTCwJCQkJXAotCQkubXBwX2dwaW9fZGlyID0gTlVMTCwJCQkJXAotCX0KLQogI2RlZmluZSBNUFBfRlVOQ19DVFJMKF9pZGwsIF9pZGgsIF9uYW1lLCBfZnVuYykJCQlcCiAJewkJCQkJCQlcCiAJCS5uYW1lID0gX25hbWUsCQkJCQlcCkBAIC0xODYsNiArMTczLDM0IEBACiAJCS5ucGlucyA9IF9ucGlucywJCQkJXAogCX0KIAorI2RlZmluZSBNVkVCVV9NUFBTX1BFUl9SRUcJOAorI2RlZmluZSBNVkVCVV9NUFBfQklUUwkJNAorI2RlZmluZSBNVkVCVV9NUFBfTUFTSwkJMHhmCisKK3N0YXRpYyBpbmxpbmUgaW50IGRlZmF1bHRfbXBwX2N0cmxfZ2V0KHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgaW50IHBpZCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXVuc2lnbmVkIG9mZiA9IChwaWQgLyBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgc2hpZnQgPSAocGlkICUgTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCisJKmNvbmZpZyA9IChyZWFkbChiYXNlICsgb2ZmKSA+PiBzaGlmdCkgJiBNVkVCVV9NUFBfTUFTSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWZhdWx0X21wcF9jdHJsX3NldCh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBwaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXVuc2lnbmVkIG9mZiA9IChwaWQgLyBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgc2hpZnQgPSAocGlkICUgTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIGxvbmcgcmVnOworCisJcmVnID0gcmVhZGwoYmFzZSArIG9mZikgJiB+KE1WRUJVX01QUF9NQVNLIDw8IHNoaWZ0KTsKKwl3cml0ZWwocmVnIHwgKGNvbmZpZyA8PCBzaGlmdCksIGJhc2UgKyBvZmYpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBtdmVidV9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogaW50IG12ZWJ1X3BpbmN0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNTR4LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNTR4LmMKaW5kZXggZWE5ZDlhYi4uMDA4YTI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjU0eC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY1NHguYwpAQCAtMzA5LDM5ICszMDksNiBAQAogCUdQSU9fUEU0LCBHUElPX1BFNSwgR1BJT19QRTYsIEdQSU9fUEU3LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7Ci0JQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MWdycCIsIHVhcnQxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQxY3RzcnRzZ3JwIiwgdWFydDFfY3RzcnRzX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQyZ3JwIiwgdWFydDJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidWFydDNncnAiLCB1YXJ0M19waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0M2N0c3J0c2dycCIsIHVhcnQzX2N0c3J0c19waW5zKSwKLQlBRElfUElOX0dST1VQKCJyc2kwZ3JwIiwgcnNpMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcGkwZ3JwIiwgc3BpMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcGkxZ3JwIiwgc3BpMV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ0d2kwZ3JwIiwgdHdpMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ0d2kxZ3JwIiwgdHdpMV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJyb3RhcnlncnAiLCByb3RhcnlfcGlucyksCi0JQURJX1BJTl9HUk9VUCgiY2FuMGdycCIsIGNhbjBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgiY2FuMWdycCIsIGNhbjFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic21jMGdycCIsIHNtYzBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQwZ3JwIiwgc3BvcnQwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0MWdycCIsIHNwb3J0MV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcG9ydDJncnAiLCBzcG9ydDJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQzZ3JwIiwgc3BvcnQzX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfOGJncnAiLCBwcGkwXzhiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfMTZiZ3JwIiwgcHBpMF8xNmJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMF8yNGJncnAiLCBwcGkwXzI0Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkxXzhiZ3JwIiwgcHBpMV84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkxXzE2YmdycCIsIHBwaTFfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTJfOGJncnAiLCBwcGkyXzhiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImF0YXBpZ3JwIiwgYXRhcGlfcGlucyksCi0JQURJX1BJTl9HUk9VUCgiYXRhcGlhbHRlcmdycCIsIGF0YXBpX2FsdGVyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoIm5mYzBncnAiLCBuZmMwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImtleXNfNHg0Z3JwIiwga2V5c180eDRfcGlucyksCi0JQURJX1BJTl9HUk9VUCgia2V5c184eDhncnAiLCBrZXlzXzh4OF9waW5zKSwKLX07Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB1YXJ0MF9tdXhbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLAogCTAKQEAgLTUxMyw2ICs0ODAsMzkgQEAKIAkwCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkaV9waW5fZ3JvdXAgYWRpX3Bpbl9ncm91cHNbXSA9IHsKKwlBRElfUElOX0dST1VQKCJ1YXJ0MGdycCIsIHVhcnQwX3BpbnMsIHVhcnQwX211eCksCisJQURJX1BJTl9HUk9VUCgidWFydDFncnAiLCB1YXJ0MV9waW5zLCB1YXJ0MV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQxY3RzcnRzZ3JwIiwgdWFydDFfY3RzcnRzX3BpbnMsIHVhcnQxX2N0c3J0c19tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQyZ3JwIiwgdWFydDJfcGlucywgdWFydDJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0M2dycCIsIHVhcnQzX3BpbnMsIHVhcnQzX211eCksCisJQURJX1BJTl9HUk9VUCgidWFydDNjdHNydHNncnAiLCB1YXJ0M19jdHNydHNfcGlucywgdWFydDNfY3RzcnRzX211eCksCisJQURJX1BJTl9HUk9VUCgicnNpMGdycCIsIHJzaTBfcGlucywgcnNpMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwaTBncnAiLCBzcGkwX3BpbnMsIHNwaTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcGkxZ3JwIiwgc3BpMV9waW5zLCBzcGkxX211eCksCisJQURJX1BJTl9HUk9VUCgidHdpMGdycCIsIHR3aTBfcGlucywgdHdpMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInR3aTFncnAiLCB0d2kxX3BpbnMsIHR3aTFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJyb3RhcnlncnAiLCByb3RhcnlfcGlucywgcm90YXJ5X211eCksCisJQURJX1BJTl9HUk9VUCgiY2FuMGdycCIsIGNhbjBfcGlucywgY2FuMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImNhbjFncnAiLCBjYW4xX3BpbnMsIGNhbjFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzbWMwZ3JwIiwgc21jMF9waW5zLCBzbWMwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQwZ3JwIiwgc3BvcnQwX3BpbnMsIHNwb3J0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0MWdycCIsIHNwb3J0MV9waW5zLCBzcG9ydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcG9ydDJncnAiLCBzcG9ydDJfcGlucywgc3BvcnQyX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQzZ3JwIiwgc3BvcnQzX3BpbnMsIHNwb3J0M19tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTBfOGJncnAiLCBwcGkwXzhiX3BpbnMsIHBwaTBfOGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkwXzE2YmdycCIsIHBwaTBfMTZiX3BpbnMsIHBwaTBfMTZiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMF8yNGJncnAiLCBwcGkwXzI0Yl9waW5zLCBwcGkwXzI0Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTFfOGJncnAiLCBwcGkxXzhiX3BpbnMsIHBwaTFfOGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkxXzE2YmdycCIsIHBwaTFfMTZiX3BpbnMsIHBwaTFfMTZiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMl84YmdycCIsIHBwaTJfOGJfcGlucywgcHBpMl84Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoImF0YXBpZ3JwIiwgYXRhcGlfcGlucywgYXRhcGlfbXV4KSwKKwlBRElfUElOX0dST1VQKCJhdGFwaWFsdGVyZ3JwIiwgYXRhcGlfYWx0ZXJfcGlucywgYXRhcGlfYWx0ZXJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJuZmMwZ3JwIiwgbmZjMF9waW5zLCBuZmMwX211eCksCisJQURJX1BJTl9HUk9VUCgia2V5c180eDRncnAiLCBrZXlzXzR4NF9waW5zLCBrZXlzXzR4NF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImtleXNfOHg4Z3JwIiwga2V5c184eDhfcGlucywga2V5c184eDhfbXV4KSwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDBncnBbXSA9IHsgInVhcnQwZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0MWdycFtdID0geyAidWFydDFncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQxY3RzcnRzZ3JwW10gPSB7ICJ1YXJ0MWN0c3J0c2dycCIgfTsKQEAgLTUzMiw0OSArNTMyLDQ1IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwb3J0MWdycFtdID0geyAic3BvcnQxZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcG9ydDJncnBbXSA9IHsgInNwb3J0MmdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BvcnQzZ3JwW10gPSB7ICJzcG9ydDNncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfOGJncnBbXSA9IHsgInBwaTBfOGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfMTZiZ3JwW10gPSB7ICJwcGkwXzE2YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMF8yNGJncnBbXSA9IHsgInBwaTBfMjRiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxXzhiZ3JwW10gPSB7ICJwcGkxXzhiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxXzE2YmdycFtdID0geyAicHBpMV8xNmJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTJfOGJncnBbXSA9IHsgInBwaTJfOGJncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBncnBbXSA9IHsgInBwaTBfOGJncnAiLAorCQkJCQkicHBpMF8xNmJncnAiLAorCQkJCQkicHBpMF8yNGJncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTFncnBbXSA9IHsgInBwaTFfOGJncnAiLAorCQkJCQkicHBpMV8xNmJncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTJncnBbXSA9IHsgInBwaTJfOGJncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0YXBpZ3JwW10gPSB7ICJhdGFwaWdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRhcGlhbHRlcmdycFtdID0geyAiYXRhcGlhbHRlcmdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmZjMGdycFtdID0geyAibmZjMGdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5c180eDRncnBbXSA9IHsgImtleXNfNHg0Z3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlzXzh4OGdycFtdID0geyAia2V5c184eDhncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleXNncnBbXSA9IHsgImtleXNfNHg0Z3JwIiwKKwkJCQkJImtleXNfOHg4Z3JwIiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkaV9wbXhfZnVuYyBhZGlfcG14X2Z1bmN0aW9uc1tdID0gewotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQwIiwgdWFydDBncnAsIHVhcnQwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDEiLCB1YXJ0MWdycCwgdWFydDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MV9jdHNydHMiLCB1YXJ0MWN0c3J0c2dycCwgdWFydDFfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDIiLCB1YXJ0MmdycCwgdWFydDJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MyIsIHVhcnQzZ3JwLCB1YXJ0M19tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQzX2N0c3J0cyIsIHVhcnQzY3RzcnRzZ3JwLCB1YXJ0M19jdHNydHNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJyc2kwIiwgcnNpMGdycCwgcnNpMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwaTAiLCBzcGkwZ3JwLCBzcGkwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BpMSIsIHNwaTFncnAsIHNwaTFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kwIiwgdHdpMGdycCwgdHdpMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInR3aTEiLCB0d2kxZ3JwLCB0d2kxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicm90YXJ5Iiwgcm90YXJ5Z3JwLCByb3RhcnlfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJjYW4wIiwgY2FuMGdycCwgY2FuMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImNhbjEiLCBjYW4xZ3JwLCBjYW4xX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic21jMCIsIHNtYzBncnAsIHNtYzBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDAiLCBzcG9ydDBncnAsIHNwb3J0MF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MSIsIHNwb3J0MWdycCwgc3BvcnQxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQyIiwgc3BvcnQyZ3JwLCBzcG9ydDJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDMiLCBzcG9ydDNncnAsIHNwb3J0M19tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTBfOGIiLCBwcGkwXzhiZ3JwLCBwcGkwXzhiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMF8xNmIiLCBwcGkwXzE2YmdycCwgcHBpMF8xNmJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkwXzI0YiIsIHBwaTBfMjRiZ3JwLCBwcGkwXzI0Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTFfOGIiLCBwcGkxXzhiZ3JwLCBwcGkxXzhiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMV8xNmIiLCBwcGkxXzE2YmdycCwgcHBpMV8xNmJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkyXzhiIiwgcHBpMl84YmdycCwgcHBpMl84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpIiwgYXRhcGlncnAsIGF0YXBpX211eCksCi0JQURJX1BNWF9GVU5DVElPTigiYXRhcGlfYWx0ZXIiLCBhdGFwaWFsdGVyZ3JwLCBhdGFwaV9hbHRlcl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oIm5mYzAiLCBuZmMwZ3JwLCBuZmMwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigia2V5c180eDQiLCBrZXlzXzR4NGdycCwga2V5c180eDRfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJrZXlzXzh4OCIsIGtleXNfOHg4Z3JwLCBrZXlzXzh4OF9tdXgpLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQwIiwgdWFydDBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxIiwgdWFydDFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxX2N0c3J0cyIsIHVhcnQxY3RzcnRzZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MiIsIHVhcnQyZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MyIsIHVhcnQzZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0M19jdHNydHMiLCB1YXJ0M2N0c3J0c2dycCksCisJQURJX1BNWF9GVU5DVElPTigicnNpMCIsIHJzaTBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwaTAiLCBzcGkwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcGkxIiwgc3BpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigidHdpMCIsIHR3aTBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInR3aTEiLCB0d2kxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJyb3RhcnkiLCByb3RhcnlncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImNhbjAiLCBjYW4wZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJjYW4xIiwgY2FuMWdycCksCisJQURJX1BNWF9GVU5DVElPTigic21jMCIsIHNtYzBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MCIsIHNwb3J0MGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BvcnQxIiwgc3BvcnQxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDIiLCBzcG9ydDJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MyIsIHNwb3J0M2dycCksCisJQURJX1BNWF9GVU5DVElPTigicHBpMCIsIHBwaTBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInBwaTEiLCBwcGkxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJwcGkyIiwgcHBpMmdycCksCisJQURJX1BNWF9GVU5DVElPTigiYXRhcGkiLCBhdGFwaWdycCksCisJQURJX1BNWF9GVU5DVElPTigiYXRhcGlfYWx0ZXIiLCBhdGFwaWFsdGVyZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJuZmMwIiwgbmZjMGdycCksCisJQURJX1BNWF9GVU5DVElPTigia2V5cyIsIGtleXNncnApLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluY3RybF9zb2NfZGF0YSBhZGlfYmY1NHhfc29jID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjYweC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjYweC5jCmluZGV4IGJmNTdhZWEuLjRjYjU5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY2MHguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNjB4LmMKQEAgLTI1OSwzNyArMjU5LDYgQEAKIAlHUElPX1BGMTIsIEdQSU9fUEYxMywgR1BJT19QRjE0LCBHUElPX1BGMTUsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFkaV9waW5fZ3JvdXAgYWRpX3Bpbl9ncm91cHNbXSA9IHsKLQlBRElfUElOX0dST1VQKCJ1YXJ0MGdycCIsIHVhcnQwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQwY3RzcnRzZ3JwIiwgdWFydDBfY3RzcnRzX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQxZ3JwIiwgdWFydDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidWFydDFjdHNydHNncnAiLCB1YXJ0MV9jdHNydHNfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicnNpMGdycCIsIHJzaTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgiZXRoMGdycCIsIGV0aDBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgiZXRoMWdycCIsIGV0aDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BpMGdycCIsIHNwaTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidHdpMGdycCIsIHR3aTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidHdpMWdycCIsIHR3aTFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNtYzBncnAiLCBzbWMwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0MGdycCIsIHNwb3J0MF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcG9ydDFncnAiLCBzcG9ydDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQyZ3JwIiwgc3BvcnQyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfOGJncnAiLCBwcGkwXzhiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfMTZiZ3JwIiwgcHBpMF8xNmJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMF8yNGJncnAiLCBwcGkwXzI0Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkxXzhiZ3JwIiwgcHBpMV84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkxXzE2YmdycCIsIHBwaTFfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTJfOGJncnAiLCBwcGkyXzhiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTJfMTZiZ3JwIiwgcHBpMl8xNmJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgibHAwZ3JwIiwgbHAwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImxwMWdycCIsIGxwMV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJscDJncnAiLCBscDJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgibHAzZ3JwIiwgbHAzX3BpbnMpLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHVhcnQwX211eFtdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsCiAJMApAQCAtNDQ2LDYgKzQxNSwzNyBAQAogICAgICAgICAwCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkaV9waW5fZ3JvdXAgYWRpX3Bpbl9ncm91cHNbXSA9IHsKKwlBRElfUElOX0dST1VQKCJ1YXJ0MGdycCIsIHVhcnQwX3BpbnMsIHVhcnQwX211eCksCisJQURJX1BJTl9HUk9VUCgidWFydDBjdHNydHNncnAiLCB1YXJ0MF9jdHNydHNfcGlucywgdWFydDBfY3RzcnRzX211eCksCisJQURJX1BJTl9HUk9VUCgidWFydDFncnAiLCB1YXJ0MV9waW5zLCB1YXJ0MV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQxY3RzcnRzZ3JwIiwgdWFydDFfY3RzcnRzX3BpbnMsIHVhcnQxX2N0c3J0c19tdXgpLAorCUFESV9QSU5fR1JPVVAoInJzaTBncnAiLCByc2kwX3BpbnMsIHJzaTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJldGgwZ3JwIiwgZXRoMF9waW5zLCBldGgwX211eCksCisJQURJX1BJTl9HUk9VUCgiZXRoMWdycCIsIGV0aDFfcGlucywgZXRoMV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwaTBncnAiLCBzcGkwX3BpbnMsIHNwaTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcGkxZ3JwIiwgc3BpMV9waW5zLCBzcGkxX211eCksCisJQURJX1BJTl9HUk9VUCgidHdpMGdycCIsIHR3aTBfcGlucywgdHdpMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInR3aTFncnAiLCB0d2kxX3BpbnMsIHR3aTFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJyb3RhcnlncnAiLCByb3RhcnlfcGlucywgcm90YXJ5X211eCksCisJQURJX1BJTl9HUk9VUCgiY2FuMGdycCIsIGNhbjBfcGlucywgY2FuMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNtYzBncnAiLCBzbWMwX3BpbnMsIHNtYzBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcG9ydDBncnAiLCBzcG9ydDBfcGlucywgc3BvcnQwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQxZ3JwIiwgc3BvcnQxX3BpbnMsIHNwb3J0MV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0MmdycCIsIHNwb3J0Ml9waW5zLCBzcG9ydDJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zLCBwcGkwXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMF8xNmJncnAiLCBwcGkwXzE2Yl9waW5zLCBwcGkwXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucywgcHBpMF8yNGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkxXzhiZ3JwIiwgcHBpMV84Yl9waW5zLCBwcGkxXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zLCBwcGkxXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTJfOGJncnAiLCBwcGkyXzhiX3BpbnMsIHBwaTJfOGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkyXzE2YmdycCIsIHBwaTJfMTZiX3BpbnMsIHBwaTJfMTZiX211eCksCisJQURJX1BJTl9HUk9VUCgibHAwZ3JwIiwgbHAwX3BpbnMsIGxwMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImxwMWdycCIsIGxwMV9waW5zLCBscDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJscDJncnAiLCBscDJfcGlucywgbHAyX211eCksCisJQURJX1BJTl9HUk9VUCgibHAzZ3JwIiwgbHAzX3BpbnMsIGxwM19tdXgpLAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0MGdycFtdID0geyAidWFydDBncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQwY3RzcnRzZ3JwW10gPSB7ICJ1YXJ0MGN0c3J0c2dycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDFncnBbXSA9IHsgInVhcnQxZ3JwIiB9OwpAQCAtNDYzLDQ3ICs0NjMsNDMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BvcnQwZ3JwW10gPSB7ICJzcG9ydDBncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwb3J0MWdycFtdID0geyAic3BvcnQxZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcG9ydDJncnBbXSA9IHsgInNwb3J0MmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMF84YmdycFtdID0geyAicHBpMF84YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMF8xNmJncnBbXSA9IHsgInBwaTBfMTZiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwXzI0YmdycFtdID0geyAicHBpMF8yNGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTFfOGJncnBbXSA9IHsgInBwaTFfOGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTFfMTZiZ3JwW10gPSB7ICJwcGkxXzE2YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMl84YmdycFtdID0geyAicHBpMl84YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMl8xNmJncnBbXSA9IHsgInBwaTJfMTZiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwZ3JwW10gPSB7ICJwcGkwXzhiZ3JwIiwKKwkJCQkJInBwaTBfMTZiZ3JwIiwKKwkJCQkJInBwaTBfMjRiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxZ3JwW10gPSB7ICJwcGkxXzhiZ3JwIiwKKwkJCQkJInBwaTFfMTZiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkyZ3JwW10gPSB7ICJwcGkyXzhiZ3JwIiwKKwkJCQkJInBwaTJfMTZiZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBscDBncnBbXSA9IHsgImxwMGdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbHAxZ3JwW10gPSB7ICJscDFncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxwMmdycFtdID0geyAibHAyZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBscDNncnBbXSA9IHsgImxwM2dycCIgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcG14X2Z1bmMgYWRpX3BteF9mdW5jdGlvbnNbXSA9IHsKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MCIsIHVhcnQwZ3JwLCB1YXJ0MF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQwX2N0c3J0cyIsIHVhcnQwY3RzcnRzZ3JwLCB1YXJ0MF9jdHNydHNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MSIsIHVhcnQxZ3JwLCB1YXJ0MV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxX2N0c3J0cyIsIHVhcnQxY3RzcnRzZ3JwLCB1YXJ0MV9jdHNydHNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJyc2kwIiwgcnNpMGdycCwgcnNpMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImV0aDAiLCBldGgwZ3JwLCBldGgwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigiZXRoMSIsIGV0aDFncnAsIGV0aDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCwgc3BpMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwaTEiLCBzcGkxZ3JwLCBzcGkxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidHdpMCIsIHR3aTBncnAsIHR3aTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCwgdHdpMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInJvdGFyeSIsIHJvdGFyeWdycCwgcm90YXJ5X211eCksCi0JQURJX1BNWF9GVU5DVElPTigiY2FuMCIsIGNhbjBncnAsIGNhbjBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzbWMwIiwgc21jMGdycCwgc21jMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MCIsIHNwb3J0MGdycCwgc3BvcnQwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQxIiwgc3BvcnQxZ3JwLCBzcG9ydDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDIiLCBzcG9ydDJncnAsIHNwb3J0Ml9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTBfOGIiLCBwcGkwXzhiZ3JwLCBwcGkwXzhiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMF8xNmIiLCBwcGkwXzE2YmdycCwgcHBpMF8xNmJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkwXzI0YiIsIHBwaTBfMjRiZ3JwLCBwcGkwXzI0Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTFfOGIiLCBwcGkxXzhiZ3JwLCBwcGkxXzhiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMV8xNmIiLCBwcGkxXzE2YmdycCwgcHBpMV8xNmJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkyXzhiIiwgcHBpMl84YmdycCwgcHBpMl84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTJfMTZiIiwgcHBpMl8xNmJncnAsIHBwaTJfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigibHAwIiwgbHAwZ3JwLCBscDBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJscDEiLCBscDFncnAsIGxwMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImxwMiIsIGxwMmdycCwgbHAyX211eCksCi0JQURJX1BNWF9GVU5DVElPTigibHAzIiwgbHAzZ3JwLCBscDNfbXV4KSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MCIsIHVhcnQwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MF9jdHNydHMiLCB1YXJ0MGN0c3J0c2dycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDEiLCB1YXJ0MWdycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDFfY3RzcnRzIiwgdWFydDFjdHNydHNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInJzaTAiLCByc2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJldGgwIiwgZXRoMGdycCksCisJQURJX1BNWF9GVU5DVElPTigiZXRoMSIsIGV0aDFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwaTAiLCBzcGkwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcGkxIiwgc3BpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigidHdpMCIsIHR3aTBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInR3aTEiLCB0d2kxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJyb3RhcnkiLCByb3RhcnlncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImNhbjAiLCBjYW4wZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzbWMwIiwgc21jMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BvcnQwIiwgc3BvcnQwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDEiLCBzcG9ydDFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MiIsIHNwb3J0MmdycCksCisJQURJX1BNWF9GVU5DVElPTigicHBpMCIsIHBwaTBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInBwaTEiLCBwcGkxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJwcGkyIiwgcHBpMmdycCksCisJQURJX1BNWF9GVU5DVElPTigibHAwIiwgbHAwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJscDEiLCBscDFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImxwMiIsIGxwMmdycCksCisJQURJX1BNWF9GVU5DVElPTigibHAzIiwgbHAzZ3JwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3BpbmN0cmxfc29jX2RhdGEgYWRpX2JmNjB4X3NvYyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuYwppbmRleCA3YTM5NTYyLi4yMDBlYTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi5jCkBAIC04OSw2ICs4OSwxOSBAQAogCXUzMiBtdXg7CiB9OwogCisvKgorICogc3RydWN0IGdwaW9fcGludF9zYXZlZCAtIFBJTlQgcmVnaXN0ZXJzIHNhdmVkIGluIFBNIG9wZXJhdGlvbnMKKyAqCisgKiBAYXNzaWduOiBBU1NJR04gcmVnaXN0ZXIKKyAqIEBlZGdlX3NldDogRURHRV9TRVQgcmVnaXN0ZXIKKyAqIEBpbnZlcnRfc2V0OiBJTlZFUlRfU0VUIHJlZ2lzdGVyCisgKi8KK3N0cnVjdCBncGlvX3BpbnRfc2F2ZWQgeworCXUzMiBhc3NpZ247CisJdTMyIGVkZ2Vfc2V0OworCXUzMiBpbnZlcnRfc2V0OworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgZ3Bpb19waW50IC0gUGluIGludGVycnVwdCBjb250cm9sbGVyIGRldmljZS4gTXVsdGlwbGUgQURJIEdQSU8KICAqIGJhbmtzIGNhbiBiZSBtYXBwZWQgaW50byBvbmUgUGluIGludGVycnVwdCBjb250cm9sbGVyLgpAQCAtMTE0LDcgKzEyNyw3IEBACiAJaW50IGlycTsKIAlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluWzJdOwogCXN0cnVjdCBncGlvX3BpbnRfcmVncyAqcmVnczsKLQlzdHJ1Y3QgYWRpX3BtX3BpbnRfc2F2ZSBzYXZlZF9kYXRhOworCXN0cnVjdCBncGlvX3BpbnRfc2F2ZWQgc2F2ZWRfZGF0YTsKIAlpbnQgbWFwX2NvdW50OwogCXNwaW5sb2NrX3QgbG9jazsKIApAQCAtMTYwLDcgKzE3Myw3IEBACiBzdHJ1Y3QgZ3Bpb19wb3J0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwotCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKKwlpbnQgaXJxX2Jhc2U7CiAJdW5zaWduZWQgaW50IHdpZHRoOwogCXN0cnVjdCBncGlvX3BvcnRfdCAqcmVnczsKIAlzdHJ1Y3QgZ3Bpb19wb3J0X3NhdmVkIHNhdmVkX2RhdGE7CkBAIC02MDUsOCArNjE4LDggQEAKIAkuZ2V0X2dyb3VwX3BpbnMgPSBhZGlfZ2V0X2dyb3VwX3BpbnMsCiB9OwogCi1zdGF0aWMgaW50IGFkaV9waW5tdXhfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgc2VsZWN0b3IsCi0JdW5zaWduZWQgZ3JvdXApCitzdGF0aWMgaW50IGFkaV9waW5tdXhfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgZnVuY19pZCwKKwl1bnNpZ25lZCBncm91cF9pZCkKIHsKIAlzdHJ1Y3QgYWRpX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKIAlzdHJ1Y3QgZ3Bpb19wb3J0ICpwb3J0OwpAQCAtNjE0LDcgKzYyNyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCAqbXV4LCBwaW47CiAKLQltdXggPSAodW5zaWduZWQgc2hvcnQgKilwaW5jdHJsLT5zb2MtPmZ1bmN0aW9uc1tzZWxlY3Rvcl0ubXV4OworCW11eCA9ICh1bnNpZ25lZCBzaG9ydCAqKXBpbmN0cmwtPnNvYy0+Z3JvdXBzW2dyb3VwX2lkXS5tdXg7CiAKIAl3aGlsZSAoKm11eCkgewogCQlwaW4gPSBQX0lERU5UKCptdXgpOwpAQCAtNjI4LDcgKzY0MSw3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAkJcG9ydG11eF9zZXR1cChwb3J0LCBwaW5fdG9fb2Zmc2V0KHJhbmdlLCBwaW4pLAotCQkJCSBQX0ZVTkNUMk1VWCgqbXV4KSk7CisJCQkJUF9GVU5DVDJNVVgoKm11eCkpOwogCQlwb3J0X3NldHVwKHBvcnQsIHBpbl90b19vZmZzZXQocmFuZ2UsIHBpbiksIGZhbHNlKTsKIAkJbXV4Kys7CiAKQEAgLTYzOCw4ICs2NTEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhZGlfcGlubXV4X2Rpc2FibGUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBzZWxlY3RvciwKLQl1bnNpZ25lZCBncm91cCkKK3N0YXRpYyB2b2lkIGFkaV9waW5tdXhfZGlzYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGZ1bmNfaWQsCisJdW5zaWduZWQgZ3JvdXBfaWQpCiB7CiAJc3RydWN0IGFkaV9waW5jdHJsICpwaW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CiAJc3RydWN0IGdwaW9fcG9ydCAqcG9ydDsKQEAgLTY0Nyw3ICs2NjAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgKm11eCwgcGluOwogCi0JbXV4ID0gKHVuc2lnbmVkIHNob3J0ICopcGluY3RybC0+c29jLT5mdW5jdGlvbnNbc2VsZWN0b3JdLm11eDsKKwltdXggPSAodW5zaWduZWQgc2hvcnQgKilwaW5jdHJsLT5zb2MtPmdyb3Vwc1tncm91cF9pZF0ubXV4OwogCiAJd2hpbGUgKCptdXgpIHsKIAkJcGluID0gUF9JREVOVCgqbXV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuaAppbmRleCAxZjA2ZjhkLi4zY2EyOTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi5oCkBAIC0yMSwxMyArMjEsMTUgQEAKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IHVuc2lnbmVkICpwaW5zOwogCWNvbnN0IHVuc2lnbmVkIG51bTsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqbXV4OwogfTsKIAotI2RlZmluZSBBRElfUElOX0dST1VQKG4sIHApICBcCisjZGVmaW5lIEFESV9QSU5fR1JPVVAobiwgcCwgbSkgIFwKIAl7CQkJXAogCQkubmFtZSA9IG4sCVwKIAkJLnBpbnMgPSBwLAlcCiAJCS5udW0gPSBBUlJBWV9TSVpFKHApLAlcCisJCS5tdXggPSBtLAkJCVwKIAl9CiAKICAvKioKQEAgLTQxLDE1ICs0MywxMyBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CiAJY29uc3QgY2hhciAqIGNvbnN0ICpncm91cHM7CiAJY29uc3QgdW5zaWduZWQgbnVtX2dyb3VwczsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCAqbXV4OwogfTsKIAotI2RlZmluZSBBRElfUE1YX0ZVTkNUSU9OKG4sIGcsIG0pCQlcCisjZGVmaW5lIEFESV9QTVhfRlVOQ1RJT04obiwgZykJCVwKIAl7CQkJCQlcCiAJCS5uYW1lID0gbiwJCQlcCiAJCS5ncm91cHMgPSBnLAkJCVwKIAkJLm51bV9ncm91cHMgPSBBUlJBWV9TSVpFKGcpLAlcCi0JCS5tdXggPSBtLAkJCVwKIAl9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCmluZGV4IGQ5OTBlMzMuLjVkMjRhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKQEAgLTExMzcsNiArMTEzNywxNyBAQAogCXBpbmN0cmxfZnJlZV9ncGlvKGdwaW8pOwogfQogCitzdGF0aWMgaW50IGF0OTFfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXQ5MV9ncGlvX2NoaXAgKmF0OTFfZ3BpbyA9IHRvX2F0OTFfZ3Bpb19jaGlwKGNoaXApOworCXZvaWQgX19pb21lbSAqcGlvID0gYXQ5MV9ncGlvLT5yZWdiYXNlOworCXVuc2lnbmVkIG1hc2sgPSAxIDw8IG9mZnNldDsKKwl1MzIgb3NyOworCisJb3NyID0gcmVhZGxfcmVsYXhlZChwaW8gKyBQSU9fT1NSKTsKKwlyZXR1cm4gIShvc3IgJiBtYXNrKTsKK30KKwogc3RhdGljIGludCBhdDkxX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlzdHJ1Y3QgYXQ5MV9ncGlvX2NoaXAgKmF0OTFfZ3BpbyA9IHRvX2F0OTFfZ3Bpb19jaGlwKGNoaXApOwpAQCAtMTMyNSw2ICsxMzM2LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19pcnFfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZAlwaW4gPSBkLT5od2lycTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19sb2NrX2FzX2lycSgmYXQ5MV9ncGlvLT5jaGlwLCBwaW4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihhdDkxX2dwaW8tPmNoaXAuZGV2LCAidW5hYmxlIHRvIGxvY2sgcGluZCAlbHUgSVJRXG4iLAorCQkJZC0+aHdpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKwlncGlvX2lycV91bm1hc2soZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgYXQ5MV9ncGlvX2NoaXAgKmF0OTFfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkCXBpbiA9IGQtPmh3aXJxOworCisJZ3Bpb19pcnFfbWFzayhkKTsKKwlncGlvX3VubG9ja19hc19pcnEoJmF0OTFfZ3Bpby0+Y2hpcCwgcGluKTsKK30KKwogI2lmZGVmIENPTkZJR19QTQogCiBzdGF0aWMgdTMyIHdha2V1cHNbTUFYX0dQSU9fQkFOS1NdOwpAQCAtMTM5OSw2ICsxNDM1LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncGlvX2lycWNoaXAgPSB7CiAJLm5hbWUJCT0gIkdQSU8iLAorCS5pcnFfc3RhcnR1cAk9IGdwaW9faXJxX3N0YXJ0dXAsCisJLmlycV9zaHV0ZG93bgk9IGdwaW9faXJxX3NodXRkb3duLAogCS5pcnFfZGlzYWJsZQk9IGdwaW9faXJxX21hc2ssCiAJLmlycV9tYXNrCT0gZ3Bpb19pcnFfbWFzaywKIAkuaXJxX3VubWFzawk9IGdwaW9faXJxX3VubWFzaywKQEAgLTE1NDMsNiArMTU4MSw3IEBACiBzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBhdDkxX2dwaW9fdGVtcGxhdGUgPSB7CiAJLnJlcXVlc3QJCT0gYXQ5MV9ncGlvX3JlcXVlc3QsCiAJLmZyZWUJCQk9IGF0OTFfZ3Bpb19mcmVlLAorCS5nZXRfZGlyZWN0aW9uCQk9IGF0OTFfZ3Bpb19nZXRfZGlyZWN0aW9uLAogCS5kaXJlY3Rpb25faW5wdXQJPSBhdDkxX2dwaW9fZGlyZWN0aW9uX2lucHV0LAogCS5nZXQJCQk9IGF0OTFfZ3Bpb19nZXQsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSBhdDkxX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJheXRyYWlsLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1iYXl0cmFpbC5jCmluZGV4IDY2NWI5NmIuLmJmMmIzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJheXRyYWlsLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYmF5dHJhaWwuYwpAQCAtNjAsNiArNjAsMTAgQEAKICNkZWZpbmUgQllUX05HUElPX05DT1JFCQkyOAogI2RlZmluZSBCWVRfTkdQSU9fU1VTCQk0NAogCisjZGVmaW5lIEJZVF9TQ09SRV9BQ1BJX1VJRAkiMSIKKyNkZWZpbmUgQllUX05DT1JFX0FDUElfVUlECSIyIgorI2RlZmluZSBCWVRfU1VTX0FDUElfVUlECSIzIgorCiAvKgogICogQmF5dHJhaWwgZ3BpbyBjb250cm9sbGVyIGNvbnNpc3Qgb2YgdGhyZWUgc2VwYXJhdGUgc3ViLWNvbnRyb2xsZXJzIGNhbGxlZAogICogU0NPUkUsIE5DT1JFIGFuZCBTVVMuIFRoZSBzdWItY29udHJvbGxlcnMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYWNwaSBVSUQuCkBAIC0xMDIsMTcgKzEwNiwxNyBAQAogCiBzdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBieXRfcmFuZ2VzW10gPSB7CiAJewotCQkubmFtZSA9ICIxIiwgLyogbWF0Y2ggd2l0aCBhY3BpIF9VSUQgaW4gcHJvYmUgKi8KKwkJLm5hbWUgPSBCWVRfU0NPUkVfQUNQSV9VSUQsIC8qIG1hdGNoIHdpdGggYWNwaSBfVUlEIGluIHByb2JlICovCiAJCS5ucGlucyA9IEJZVF9OR1BJT19TQ09SRSwKIAkJLnBpbnMgPSBzY29yZV9waW5zLAogCX0sCiAJewotCQkubmFtZSA9ICIyIiwKKwkJLm5hbWUgPSBCWVRfTkNPUkVfQUNQSV9VSUQsCiAJCS5ucGlucyA9IEJZVF9OR1BJT19OQ09SRSwKIAkJLnBpbnMgPSBuY29yZV9waW5zLAogCX0sCiAJewotCQkubmFtZSA9ICIzIiwKKwkJLm5hbWUgPSBCWVRfU1VTX0FDUElfVUlELAogCQkubnBpbnMgPSBCWVRfTkdQSU9fU1VTLAogCQkucGlucyA9IHN1c19waW5zLAogCX0sCkBAIC0xNDUsOSArMTQ5LDQxIEBACiAJcmV0dXJuIHZnLT5yZWdfYmFzZSArIHJlZ19vZmZzZXQgKyByZWc7CiB9CiAKK3N0YXRpYyBib29sIGlzX3NwZWNpYWxfcGluKHN0cnVjdCBieXRfZ3BpbyAqdmcsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwkvKiBTQ09SRSBwaW4gOTItOTMgKi8KKwlpZiAoIXN0cmNtcCh2Zy0+cmFuZ2UtPm5hbWUsIEJZVF9TQ09SRV9BQ1BJX1VJRCkgJiYKKwkJb2Zmc2V0ID49IDkyICYmIG9mZnNldCA8PSA5MykKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBTVVMgcGluIDExLTIxICovCisJaWYgKCFzdHJjbXAodmctPnJhbmdlLT5uYW1lLCBCWVRfU1VTX0FDUElfVUlEKSAmJgorCQlvZmZzZXQgPj0gMTEgJiYgb2Zmc2V0IDw9IDIxKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGludCBieXRfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlzdHJ1Y3QgYnl0X2dwaW8gKnZnID0gdG9fYnl0X2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBieXRfZ3Bpb19yZWcoY2hpcCwgb2Zmc2V0LCBCWVRfQ09ORjBfUkVHKTsKKwl1MzIgdmFsdWU7CisJYm9vbCBzcGVjaWFsOworCisJLyoKKwkgKiBJbiBtb3N0IGNhc2VzLCBmdW5jIHBpbiBtdXggMDAwIG1lYW5zIEdQSU8gZnVuY3Rpb24uCisJICogQnV0LCBzb21lIHBpbnMgbWF5IGhhdmUgZnVuYyBwaW4gbXV4IDAwMSByZXByZXNlbnRzCisJICogR1BJTyBmdW5jdGlvbi4gT25seSBhbGxvdyB1c2VyIHRvIGV4cG9ydCBwaW4gd2l0aAorCSAqIGZ1bmMgcGluIG11eCBwcmVzZXQgYXMgR1BJTyBmdW5jdGlvbiBieSBCSU9TL0ZXLgorCSAqLworCXZhbHVlID0gcmVhZGwocmVnKSAmIEJZVF9QSU5fTVVYOworCXNwZWNpYWwgPSBpc19zcGVjaWFsX3Bpbih2Zywgb2Zmc2V0KTsKKwlpZiAoKHNwZWNpYWwgJiYgdmFsdWUgIT0gMSkgfHwgKCFzcGVjaWFsICYmIHZhbHVlKSkgeworCQlkZXZfZXJyKCZ2Zy0+cGRldi0+ZGV2LAorCQkJInBpbiAldSBjYW5ub3QgYmUgdXNlZCBhcyBHUElPLlxuIiwgb2Zmc2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJcG1fcnVudGltZV9nZXQoJnZnLT5wZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWV4eW5vcy5jCmluZGV4IDE1NWIxYjMuLjA3YzgxMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWV4eW5vcy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWV4eW5vcy5jCkBAIC0xMDQyLDYgKzEwNDIsODggQEAKIAl9LAogfTsKIAorLyogcGluIGJhbmtzIG9mIGV4eW5vczUyNjAgcGluLWNvbnRyb2xsZXIgMCAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rIGV4eW5vczUyNjBfcGluX2JhbmtzMFtdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5URyg0LCAweDAwMCwgImdwYTAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNywgMHgwMjAsICJncGExIiwgMHgwNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MDQwLCAiZ3BhMiIsIDB4MDgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg1LCAweDA2MCwgImdwYjAiLCAweDBjKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwODAsICJncGIxIiwgMHgxMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDUsIDB4MGEwLCAiZ3BiMiIsIDB4MTQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDBjMCwgImdwYjMiLCAweDE4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgwZTAsICJncGI0IiwgMHgxYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MTAwLCAiZ3BiNSIsIDB4MjApLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDEyMCwgImdwZDAiLCAweDI0KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNywgMHgxNDAsICJncGQxIiwgMHgyOCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDUsIDB4MTYwLCAiZ3BkMiIsIDB4MmMpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDE4MCwgImdwZTAiLCAweDMwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNSwgMHgxYTAsICJncGUxIiwgMHgzNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MWMwLCAiZ3BmMCIsIDB4MzgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDFlMCwgImdwZjEiLCAweDNjKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoMiwgMHgyMDAsICJncGswIiwgMHg0MCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRXKDgsIDB4YzAwLCAiZ3B4MCIsIDB4MDApLAorCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweGMyMCwgImdweDEiLCAweDA0KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVFcoOCwgMHhjNDAsICJncHgyIiwgMHgwOCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRXKDgsIDB4YzYwLCAiZ3B4MyIsIDB4MGMpLAorfTsKKworLyogcGluIGJhbmtzIG9mIGV4eW5vczUyNjAgcGluLWNvbnRyb2xsZXIgMSAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rIGV4eW5vczUyNjBfcGluX2JhbmtzMVtdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5URyg3LCAweDAwMCwgImdwYzAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNiwgMHgwMjAsICJncGMxIiwgMHgwNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDcsIDB4MDQwLCAiZ3BjMiIsIDB4MDgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg0LCAweDA2MCwgImdwYzMiLCAweDBjKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwODAsICJncGM0IiwgMHgxMCksCit9OworCisvKiBwaW4gYmFua3Mgb2YgZXh5bm9zNTI2MCBwaW4tY29udHJvbGxlciAyICovCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfcGluX2JhbmsgZXh5bm9zNTI2MF9waW5fYmFua3MyW10gPSB7CisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDcsIDB4MDAwLCAiZ3B6MCIsIDB4MDApLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg0LCAweDAyMCwgImdwejEiLCAweDA0KSwKK307CisKKy8qCisgKiBTYW1zdW5nIHBpbmN0cmwgZHJpdmVyIGRhdGEgZm9yIEV4eW5vczUyNjAgU29DLiBFeHlub3M1MjYwIFNvQyBpbmNsdWRlcworICogdGhyZWUgZ3Bpby9waW4tbXV4L3BpbmNvbmZpZyBjb250cm9sbGVycy4KKyAqLworc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTI2MF9waW5fY3RybFtdID0geworCXsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMCBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1MjYwX3Bpbl9iYW5rczAsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTI2MF9waW5fYmFua3MwKSwKKwkJLmdlaW50X2Nvbgk9IEVYWU5PU19HUElPX0VDT05fT0ZGU0VULAorCQkuZ2VpbnRfbWFzawk9IEVYWU5PU19HUElPX0VNQVNLX09GRlNFVCwKKwkJLmdlaW50X3BlbmQJPSBFWFlOT1NfR1BJT19FUEVORF9PRkZTRVQsCisJCS53ZWludF9jb24JPSBFWFlOT1NfV0tVUF9FQ09OX09GRlNFVCwKKwkJLndlaW50X21hc2sJPSBFWFlOT1NfV0tVUF9FTUFTS19PRkZTRVQsCisJCS53ZWludF9wZW5kCT0gRVhZTk9TX1dLVVBfRVBFTkRfT0ZGU0VULAorCQkuc3ZjCQk9IEVYWU5PU19TVkNfT0ZGU0VULAorCQkuZWludF9ncGlvX2luaXQgPSBleHlub3NfZWludF9ncGlvX2luaXQsCisJCS5laW50X3drdXBfaW5pdCA9IGV4eW5vc19laW50X3drdXBfaW5pdCwKKwkJLmxhYmVsCQk9ICJleHlub3M1MjYwLWdwaW8tY3RybDAiLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMSBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1MjYwX3Bpbl9iYW5rczEsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTI2MF9waW5fYmFua3MxKSwKKwkJLmdlaW50X2Nvbgk9IEVYWU5PU19HUElPX0VDT05fT0ZGU0VULAorCQkuZ2VpbnRfbWFzawk9IEVYWU5PU19HUElPX0VNQVNLX09GRlNFVCwKKwkJLmdlaW50X3BlbmQJPSBFWFlOT1NfR1BJT19FUEVORF9PRkZTRVQsCisJCS5zdmMJCT0gRVhZTk9TX1NWQ19PRkZTRVQsCisJCS5laW50X2dwaW9faW5pdCA9IGV4eW5vc19laW50X2dwaW9faW5pdCwKKwkJLmxhYmVsCQk9ICJleHlub3M1MjYwLWdwaW8tY3RybDEiLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMiBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1MjYwX3Bpbl9iYW5rczIsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTI2MF9waW5fYmFua3MyKSwKKwkJLmdlaW50X2Nvbgk9IEVYWU5PU19HUElPX0VDT05fT0ZGU0VULAorCQkuZ2VpbnRfbWFzawk9IEVYWU5PU19HUElPX0VNQVNLX09GRlNFVCwKKwkJLmdlaW50X3BlbmQJPSBFWFlOT1NfR1BJT19FUEVORF9PRkZTRVQsCisJCS5zdmMJCT0gRVhZTk9TX1NWQ19PRkZTRVQsCisJCS5laW50X2dwaW9faW5pdCA9IGV4eW5vc19laW50X2dwaW9faW5pdCwKKwkJLmxhYmVsCQk9ICJleHlub3M1MjYwLWdwaW8tY3RybDIiLAorCX0sCit9OworCiAvKiBwaW4gYmFua3Mgb2YgZXh5bm9zNTQyMCBwaW4tY29udHJvbGxlciAwICovCiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfcGluX2JhbmsgZXh5bm9zNTQyMF9waW5fYmFua3MwW10gPSB7CiAJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MDAwLCAiZ3B5NyIsIDB4MDApLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1pbXguYwppbmRleCA0Nzc5YjhlLi5lMTE4ZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1pbXguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1pbXguYwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJCQlwaW4tPm11eF9tb2RlIHw9IElPTVVYQ19DT05GSUdfU0lPTjsKIAkJcGluLT5jb25maWcgPSBjb25maWcgJiB+SU1YX1BBRF9TSU9OOwogCi0JCWRldl9kYmcoaW5mby0+ZGV2LCAiJXM6ICVkIDB4JTA4bHgiLCBpbmZvLT5waW5zW2ldLm5hbWUsCisJCWRldl9kYmcoaW5mby0+ZGV2LCAiJXM6ICVkIDB4JTA4bHgiLCBpbmZvLT5waW5zW3Bpbl9pZF0ubmFtZSwKIAkJCQlwaW4tPm11eF9tb2RlLCBwaW4tPmNvbmZpZyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5jCmluZGV4IGVmMmJmMzEuLjM0M2Y0MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCkBAIC01MCw3ICs0OSw2IEBACiAgKiBAZW5hYmxlZF9pcnFzOiAgIEJpdG1hcCBvZiBjdXJyZW50bHkgZW5hYmxlZCBpcnFzLgogICogQGR1YWxfZWRnZV9pcnFzOiBCaXRtYXAgb2YgaXJxcyB0aGF0IG5lZWQgc3cgZW11bGF0ZWQgZHVhbCBlZGdlCiAgKiAgICAgICAgICAgICAgICAgIGRldGVjdGlvbi4KLSAqIEB3YWtlX2lycXM6ICAgICAgQml0bWFwIG9mIGlycXMgd2l0aCByZXF1ZXN0ZWQgYXMgd2FrZXVwIHNvdXJjZS4KICAqIEBzb2M7ICAgICAgICAgICAgUmVmZXJlbmNlIHRvIHNvY19kYXRhIG9mIHBsYXRmb3JtIHNwZWNpZmljIGRhdGEuCiAgKiBAcmVnczogICAgICAgICAgIEJhc2UgYWRkcmVzcyBmb3IgdGhlIFRMTU0gcmVnaXN0ZXIgbWFwLgogICovCkBAIC02NSw3ICs2Myw2IEBACiAKIAlERUNMQVJFX0JJVE1BUChkdWFsX2VkZ2VfaXJxcywgTUFYX05SX0dQSU8pOwogCURFQ0xBUkVfQklUTUFQKGVuYWJsZWRfaXJxcywgTUFYX05SX0dQSU8pOwotCURFQ0xBUkVfQklUTUFQKHdha2VfaXJxcywgTUFYX05SX0dQSU8pOwogCiAJY29uc3Qgc3RydWN0IG1zbV9waW5jdHJsX3NvY19kYXRhICpzb2M7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwpAQCAtMjAzLDQyICsyMDAsMjkgQEAKIHN0YXRpYyBpbnQgbXNtX2NvbmZpZ19yZWcoc3RydWN0IG1zbV9waW5jdHJsICpwY3RybCwKIAkJCSAgY29uc3Qgc3RydWN0IG1zbV9waW5ncm91cCAqZywKIAkJCSAgdW5zaWduZWQgcGFyYW0sCi0JCQkgIHMxNiAqcmVnLAogCQkJICB1bnNpZ25lZCAqbWFzaywKIAkJCSAgdW5zaWduZWQgKmJpdCkKIHsKIAlzd2l0Y2ggKHBhcmFtKSB7CiAJY2FzZSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRToKLQkJKnJlZyA9IGctPmN0bF9yZWc7Ci0JCSpiaXQgPSBnLT5wdWxsX2JpdDsKLQkJKm1hc2sgPSAzOwotCQlicmVhazsKIAljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX0RPV046Ci0JCSpyZWcgPSBnLT5jdGxfcmVnOwotCQkqYml0ID0gZy0+cHVsbF9iaXQ7Ci0JCSptYXNrID0gMzsKLQkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUDoKLQkJKnJlZyA9IGctPmN0bF9yZWc7CiAJCSpiaXQgPSBnLT5wdWxsX2JpdDsKIAkJKm1hc2sgPSAzOwogCQlicmVhazsKIAljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6Ci0JCSpyZWcgPSBnLT5jdGxfcmVnOwogCQkqYml0ID0gZy0+ZHJ2X2JpdDsKIAkJKm1hc2sgPSA3OwogCQlicmVhazsKKwljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgorCQkqYml0ID0gZy0+b2VfYml0OworCQkqbWFzayA9IDE7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIocGN0cmwtPmRldiwgIkludmFsaWQgY29uZmlnIHBhcmFtICUwNHhcbiIsIHBhcmFtKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAKLQlpZiAoKnJlZyA8IDApIHsKLQkJZGV2X2VycihwY3RybC0+ZGV2LCAiQ29uZmlnIHBhcmFtICUwNHggbm90IHN1cHBvcnRlZCBvbiBncm91cCAlc1xuIiwKLQkJCXBhcmFtLCBnLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYxLDggKzI0NSwxMCBAQAogI2RlZmluZSBNU01fUFVMTF9ET1dOCTEKICNkZWZpbmUgTVNNX1BVTExfVVAJMwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbXNtX3JlZ3ZhbF90b19kcml2ZVtdID0geyAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1zbV9kcml2ZV90b19yZWd2YWxbXSA9IHsgLTEsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCAtMSwgNCwgLTEsIDUsIC0xLCA2LCAtMSwgNyB9Oworc3RhdGljIHVuc2lnbmVkIG1zbV9yZWd2YWxfdG9fZHJpdmUodTMyIHZhbCkKK3sKKwlyZXR1cm4gKHZhbCArIDEpICogMjsKK30KIAogc3RhdGljIGludCBtc21fY29uZmlnX2dyb3VwX2dldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCiAJCQkJdW5zaWduZWQgaW50IGdyb3VwLApAQCAtMjc0LDE3ICsyNjAsMTYgQEAKIAl1bnNpZ25lZCBtYXNrOwogCXVuc2lnbmVkIGFyZzsKIAl1bnNpZ25lZCBiaXQ7Ci0JczE2IHJlZzsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tncm91cF07CiAKLQlyZXQgPSBtc21fY29uZmlnX3JlZyhwY3RybCwgZywgcGFyYW0sICZyZWcsICZtYXNrLCAmYml0KTsKKwlyZXQgPSBtc21fY29uZmlnX3JlZyhwY3RybCwgZywgcGFyYW0sICZtYXNrLCAmYml0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgcmVnKTsKKwl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCWFyZyA9ICh2YWwgPj4gYml0KSAmIG1hc2s7CiAKIAkvKiBDb252ZXJ0IHJlZ2lzdGVyIHZhbHVlIHRvIHBpbmNvbmYgdmFsdWUgKi8KQEAgLTI5OSw3ICsyODQsMTUgQEAKIAkJYXJnID0gYXJnID09IE1TTV9QVUxMX1VQOwogCQlicmVhazsKIAljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6Ci0JCWFyZyA9IG1zbV9yZWd2YWxfdG9fZHJpdmVbYXJnXTsKKwkJYXJnID0gbXNtX3JlZ3ZhbF90b19kcml2ZShhcmcpOworCQlicmVhazsKKwljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgorCQkvKiBQaW4gaXMgbm90IG91dHB1dCAqLworCQlpZiAoIWFyZykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKKwkJYXJnID0gISEodmFsICYgQklUKGctPmluX2JpdCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJVbnN1cHBvcnRlZCBjb25maWcgcGFyYW1ldGVyOiAleFxuIiwKQEAgLTMyNCw3ICszMTcsNiBAQAogCXVuc2lnbmVkIG1hc2s7CiAJdW5zaWduZWQgYXJnOwogCXVuc2lnbmVkIGJpdDsKLQlzMTYgcmVnOwogCWludCByZXQ7CiAJdTMyIHZhbDsKIAlpbnQgaTsKQEAgLTMzNSw3ICszMjcsNyBAQAogCQlwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKGNvbmZpZ3NbaV0pOwogCQlhcmcgPSBwaW5jb25mX3RvX2NvbmZpZ19hcmd1bWVudChjb25maWdzW2ldKTsKIAotCQlyZXQgPSBtc21fY29uZmlnX3JlZyhwY3RybCwgZywgcGFyYW0sICZyZWcsICZtYXNrLCAmYml0KTsKKwkJcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmbWFzaywgJmJpdCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMzUyLDEwICszNDQsMjQgQEAKIAkJCWJyZWFrOwogCQljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6CiAJCQkvKiBDaGVjayBmb3IgaW52YWxpZCB2YWx1ZXMgKi8KLQkJCWlmIChhcmcgPj0gQVJSQVlfU0laRShtc21fZHJpdmVfdG9fcmVndmFsKSkKKwkJCWlmIChhcmcgPiAxNiB8fCBhcmcgPCAyIHx8IChhcmcgJSAyKSAhPSAwKQogCQkJCWFyZyA9IC0xOwogCQkJZWxzZQotCQkJCWFyZyA9IG1zbV9kcml2ZV90b19yZWd2YWxbYXJnXTsKKwkJCQlhcmcgPSAoYXJnIC8gMikgLSAxOworCQkJYnJlYWs7CisJCWNhc2UgUElOX0NPTkZJR19PVVRQVVQ6CisJCQkvKiBzZXQgb3V0cHV0IHZhbHVlICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKwkJCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKKwkJCWlmIChhcmcpCisJCQkJdmFsIHw9IEJJVChnLT5vdXRfYml0KTsKKwkJCWVsc2UKKwkJCQl2YWwgJj0gfkJJVChnLT5vdXRfYml0KTsKKwkJCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisKKwkJCS8qIGVuYWJsZSBvdXRwdXQgKi8KKwkJCWFyZyA9IDE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl9lcnIocGN0cmwtPmRldiwgIlVuc3VwcG9ydGVkIGNvbmZpZyBwYXJhbWV0ZXI6ICV4XG4iLApAQCAtMzcwLDEwICszNzYsMTAgQEAKIAkJfQogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIHJlZyk7CisJCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+Y3RsX3JlZyk7CiAJCXZhbCAmPSB+KG1hc2sgPDwgYml0KTsKIAkJdmFsIHw9IGFyZyA8PCBiaXQ7Ci0JCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgcmVnKTsKKwkJd3JpdGVsKHZhbCwgcGN0cmwtPnJlZ3MgKyBnLT5jdGxfcmVnKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTQwMiw4ICs0MDgsNiBAQAogCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tvZmZzZXRdOwotCWlmIChXQVJOX09OKGctPmlvX3JlZyA8IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC00MjQsOCArNDI4LDYgQEAKIAl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbb2Zmc2V0XTsKLQlpZiAoV0FSTl9PTihnLT5pb19yZWcgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNDUyLDggKzQ1NCw2IEBACiAJdTMyIHZhbDsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JaWYgKFdBUk5fT04oZy0+aW9fcmVnIDwgMCkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5pb19yZWcpOwogCXJldHVybiAhISh2YWwgJiBCSVQoZy0+aW5fYml0KSk7CkBAIC00NjcsOCArNDY3LDYgQEAKIAl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbb2Zmc2V0XTsKLQlpZiAoV0FSTl9PTihnLT5pb19yZWcgPCAwKSkKLQkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTUzNCw3ICs1MzIsNyBAQAogCXB1bGwgPSAoY3RsX3JlZyA+PiBnLT5wdWxsX2JpdCkgJiAzOwogCiAJc2VxX3ByaW50ZihzLCAiICUtOHM6ICUtM3MgJWQiLCBnLT5uYW1lLCBpc19vdXQgPyAib3V0IiA6ICJpbiIsIGZ1bmMpOwotCXNlcV9wcmludGYocywgIiAlZG1BIiwgbXNtX3JlZ3ZhbF90b19kcml2ZVtkcml2ZV0pOworCXNlcV9wcmludGYocywgIiAlZG1BIiwgbXNtX3JlZ3ZhbF90b19kcml2ZShkcml2ZSkpOwogCXNlcV9wcmludGYocywgIiAlcyIsIHB1bGxzW3B1bGxdKTsKIH0KIApAQCAtNjE3LDggKzYxNSw2IEBACiAKIAlwY3RybCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW2QtPmh3aXJxXTsKLQlpZiAoV0FSTl9PTihnLT5pbnRyX2NmZ19yZWcgPCAwKSkKLQkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTY0MCw4ICs2MzYsNiBAQAogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JaWYgKFdBUk5fT04oZy0+aW50cl9zdGF0dXNfcmVnIDwgMCkpCi0JCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC02NjcsOCArNjYxLDYgQEAKIAogCXBjdHJsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbZC0+aHdpcnFdOwotCWlmIChXQVJOX09OKGctPmludHJfc3RhdHVzX3JlZyA8IDApKQotCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNjkzLDggKzY4NSw2IEBACiAKIAlwY3RybCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW2QtPmh3aXJxXTsKLQlpZiAoV0FSTl9PTihnLT5pbnRyX2NmZ19yZWcgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNzgzLDIyICs3NzMsMTIgQEAKIHsKIAlzdHJ1Y3QgbXNtX3BpbmN0cmwgKnBjdHJsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbmdwaW87CiAKIAlwY3RybCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCW5ncGlvID0gcGN0cmwtPmNoaXAubmdwaW87CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChvbikgewotCQlpZiAoYml0bWFwX2VtcHR5KHBjdHJsLT53YWtlX2lycXMsIG5ncGlvKSkKLQkJCWVuYWJsZV9pcnFfd2FrZShwY3RybC0+aXJxKTsKLQkJc2V0X2JpdChkLT5od2lycSwgcGN0cmwtPndha2VfaXJxcyk7Ci0JfSBlbHNlIHsKLQkJY2xlYXJfYml0KGQtPmh3aXJxLCBwY3RybC0+d2FrZV9pcnFzKTsKLQkJaWYgKGJpdG1hcF9lbXB0eShwY3RybC0+d2FrZV9pcnFzLCBuZ3BpbykpCi0JCQlkaXNhYmxlX2lycV93YWtlKHBjdHJsLT5pcnEpOwotCX0KKwlpcnFfc2V0X2lycV93YWtlKHBjdHJsLT5pcnEsIG9uKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTg2OSw2ICs4NDksMTIgQEAKIAljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOwogfQogCisvKgorICogVGhpcyBsb2NrIGNsYXNzIHRlbGxzIGxvY2tkZXAgdGhhdCBHUElPIGlycXMgYXJlIGluIGEgZGlmZmVyZW50CisgKiBjYXRlZ29yeSB0aGFuIHRoZWlyIHBhcmVudHMsIHNvIGl0IHdvbid0IHJlcG9ydCBmYWxzZSByZWN1cnNpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZ3Bpb19sb2NrX2NsYXNzOworCiBzdGF0aWMgaW50IG1zbV9ncGlvX2luaXQoc3RydWN0IG1zbV9waW5jdHJsICpwY3RybCkKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOwpAQCAtODc2LDEwICs4NjIsMTQgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCWludCByOworCXVuc2lnbmVkIG5ncGlvID0gcGN0cmwtPnNvYy0+bmdwaW9zOworCisJaWYgKFdBUk5fT04obmdwaW8gPiBNQVhfTlJfR1BJTykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2hpcCA9ICZwY3RybC0+Y2hpcDsKIAljaGlwLT5iYXNlID0gMDsKLQljaGlwLT5uZ3BpbyA9IHBjdHJsLT5zb2MtPm5ncGlvczsKKwljaGlwLT5uZ3BpbyA9IG5ncGlvOwogCWNoaXAtPmxhYmVsID0gZGV2X25hbWUocGN0cmwtPmRldik7CiAJY2hpcC0+ZGV2ID0gcGN0cmwtPmRldjsKIAljaGlwLT5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtOTA3LDYgKzg5Nyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bmdwaW87IGkrKykgewogCQlpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcocGN0cmwtPmRvbWFpbiwgaSk7CisJCWlycV9zZXRfbG9ja2RlcF9jbGFzcyhpcnEsICZncGlvX2xvY2tfY2xhc3MpOwogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmbXNtX2dwaW9faXJxX2NoaXAsIGhhbmRsZV9lZGdlX2lycSk7CiAJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgcGN0cmwpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5oIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtLmgKaW5kZXggMjA2ZTc4MmUuLjhmYmU5ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5oCkBAIC0xMywxMCArMTMsNyBAQAogI2lmbmRlZiBfX1BJTkNUUkxfTVNNX0hfXwogI2RlZmluZSBfX1BJTkNUUkxfTVNNX0hfXwogCi0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL21hY2hpbmUuaD4KK3N0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjOwogCiAvKioKICAqIHN0cnVjdCBtc21fZnVuY3Rpb24gLSBhIHBpbm11eCBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtOHg3NC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtOHg3NC5jCmluZGV4IGY5NDRiZjIuLmRkZTU1MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbTh4NzQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc204eDc0LmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+CiAKICNpbmNsdWRlICJwaW5jdHJsLW1zbS5oIgogCkBAIC00MDYsNiArNDA1LDcgQEAKIAlNU01fTVVYX2Jsc3BfaTJjNiwKIAlNU01fTVVYX2Jsc3BfaTJjMTEsCiAJTVNNX01VWF9ibHNwX3NwaTEsCisJTVNNX01VWF9ibHNwX3NwaTgsCiAJTVNNX01VWF9ibHNwX3VhcnQyLAogCU1TTV9NVVhfYmxzcF91YXJ0OCwKIAlNU01fTVVYX3NsaW1idXMsCkBAIC00MTYsNiArNDE2LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9pMmM2X2dyb3Vwc1tdID0geyAiZ3BpbzI5IiwgImdwaW8zMCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9pMmMxMV9ncm91cHNbXSA9IHsgImdwaW84MyIsICJncGlvODQiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3Bfc3BpMV9ncm91cHNbXSA9IHsgImdwaW8wIiwgImdwaW8xIiwgImdwaW8yIiwgImdwaW8zIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3NwaThfZ3JvdXBzW10gPSB7CisJImdwaW80NSIsICJncGlvNDYiLCAiZ3BpbzQ3IiwgImdwaW80OCIKK307CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDJfZ3JvdXBzW10gPSB7ICJncGlvNCIsICJncGlvNSIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF91YXJ0OF9ncm91cHNbXSA9IHsgImdwaW80NSIsICJncGlvNDYiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNsaW1idXNfZ3JvdXBzW10gPSB7ICJncGlvNzAiLCAiZ3BpbzcxIiB9OwpAQCAtNDI1LDYgKzQyOCw3IEBACiAJRlVOQ1RJT04oYmxzcF9pMmM2KSwKIAlGVU5DVElPTihibHNwX2kyYzExKSwKIAlGVU5DVElPTihibHNwX3NwaTEpLAorCUZVTkNUSU9OKGJsc3Bfc3BpOCksCiAJRlVOQ1RJT04oYmxzcF91YXJ0MiksCiAJRlVOQ1RJT04oYmxzcF91YXJ0OCksCiAJRlVOQ1RJT04oc2xpbWJ1cyksCkBAIC00NzYsMTAgKzQ4MCwxMCBAQAogCVBJTkdST1VQKDQyLCAgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAogCVBJTkdST1VQKDQzLCAgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAogCVBJTkdST1VQKDQ0LCAgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDQ1LCAgTkEsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDYsICBOQSwgYmxzcF91YXJ0OCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0NywgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0OCwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg0NSwgIGJsc3Bfc3BpOCwgYmxzcF91YXJ0OCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg0NiwgIGJsc3Bfc3BpOCwgYmxzcF91YXJ0OCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg0NywgIGJsc3Bfc3BpOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDgsICBibHNwX3NwaTgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAogCVBJTkdST1VQKDQ5LCAgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAogCVBJTkdST1VQKDUwLCAgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAogCVBJTkdST1VQKDUxLCAgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbm9tYWRpay5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbm9tYWRpay5jCmluZGV4IDUzYTExMTEuLmNlYzc3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW5vbWFkaWsuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1ub21hZGlrLmMKQEAgLTIwMzUsMjcgKzIwMzUsMjkgQEAKIAl7fSwKIH07CiAKLXN0YXRpYyBpbnQgbm1rX3BpbmN0cmxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IG5ta19waW5jdHJsX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBubWtfcGluY3RybCAqbnBjdDsKIAotCW5wY3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlucGN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaWYgKCFucGN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBwaW5jdHJsX2ZvcmNlX3NsZWVwKG5wY3QtPnBjdGwpOwogfQogCi1zdGF0aWMgaW50IG5ta19waW5jdHJsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBubWtfcGluY3RybF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBubWtfcGluY3RybCAqbnBjdDsKIAotCW5wY3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlucGN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaWYgKCFucGN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBwaW5jdHJsX2ZvcmNlX2RlZmF1bHQobnBjdC0+cGN0bCk7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBubWtfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMjE0NCwxNyArMjE0NiwxOCBAQAogCS5wcm9iZSA9IG5ta19ncGlvX3Byb2JlLAogfTsKIAorc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG5ta19waW5jdHJsX3BtX29wcywKKwkJCW5ta19waW5jdHJsX3N1c3BlbmQsCisJCQlubWtfcGluY3RybF9yZXN1bWUpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBubWtfcGluY3RybF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5uYW1lID0gInBpbmN0cmwtbm9tYWRpayIsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG5ta19waW5jdHJsX21hdGNoLAorCQkucG0gPSAmbm1rX3BpbmN0cmxfcG1fb3BzLAogCX0sCiAJLnByb2JlID0gbm1rX3BpbmN0cmxfcHJvYmUsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPSBubWtfcGluY3RybF9zdXNwZW5kLAotCS5yZXN1bWUgPSBubWtfcGluY3RybF9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG5ta19ncGlvX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuYwppbmRleCA0N2VjMmU4Li4wMzI0ZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5jCkBAIC0xMTIwLDYgKzExMjAsOCBAQAogCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNHgxMl9waW5fY3RybCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjUwLXBpbmN0cmwiLAogCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNTI1MF9waW5fY3RybCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjYwLXBpbmN0cmwiLAorCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNTI2MF9waW5fY3RybCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDIwLXBpbmN0cmwiLAogCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNTQyMF9waW5fY3RybCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNXB2MjEwLXBpbmN0cmwiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5oIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5oCmluZGV4IDMwNjIyZDkuLmJhYjljMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmgKQEAgLTI1NCw2ICsyNTQsNyBAQAogZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczQyMTBfcGluX2N0cmxbXTsKIGV4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M0eDEyX3Bpbl9jdHJsW107CiBleHRlcm4gc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTI1MF9waW5fY3RybFtdOworZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczUyNjBfcGluX2N0cmxbXTsKIGV4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M1NDIwX3Bpbl9jdHJsW107CiBleHRlcm4gc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgczNjNjR4eF9waW5fY3RybFtdOwogZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIHMzYzI0MTJfcGluX2N0cmxbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLmMKaW5kZXggZGU2NDU5Ni4uODEwNzVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLmMKQEAgLTY2Miw2ICs2NjIsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgUElOX0NPTkZJR19EUklWRV9TVFJFTkdUSDoKIAkJY2FzZSBQSU5fQ09ORklHX1NMRVdfUkFURToKKwkJY2FzZSBQSU5fQ09ORklHX0xPV19QT1dFUl9NT0RFOgogCQlkZWZhdWx0OgogCQkJKmNvbmZpZyA9IGRhdGE7CiAJCQlicmVhazsKQEAgLTY5OSw2ICs3MDAsNyBAQAogCQkJY2FzZSBQSU5fQ09ORklHX0lOUFVUX1NDSE1JVFQ6CiAJCQljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6CiAJCQljYXNlIFBJTl9DT05GSUdfU0xFV19SQVRFOgorCQkJY2FzZSBQSU5fQ09ORklHX0xPV19QT1dFUl9NT0RFOgogCQkJCXNoaWZ0ID0gZmZzKGZ1bmMtPmNvbmZbaV0ubWFzaykgLSAxOwogCQkJCWRhdGEgJj0gfmZ1bmMtPmNvbmZbaV0ubWFzazsKIAkJCQlkYXRhIHw9IChhcmcgPDwgc2hpZnQpICYgZnVuYy0+Y29uZltpXS5tYXNrOwpAQCAtMTEwMSw2ICsxMTAzLDcgQEAKIAkJeyAicGluY3RybC1zaW5nbGUsZHJpdmUtc3RyZW5ndGgiLCBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RILCB9LAogCQl7ICJwaW5jdHJsLXNpbmdsZSxzbGV3LXJhdGUiLCBQSU5fQ09ORklHX1NMRVdfUkFURSwgfSwKIAkJeyAicGluY3RybC1zaW5nbGUsaW5wdXQtc2NobWl0dCIsIFBJTl9DT05GSUdfSU5QVVRfU0NITUlUVCwgfSwKKwkJeyAicGluY3RybC1zaW5nbGUsbG93LXBvd2VyLW1vZGUiLCBQSU5fQ09ORklHX0xPV19QT1dFUl9NT0RFLCB9LAogCX07CiAJc3RydWN0IHBjc19jb25mX3R5cGUgcHJvcDRbXSA9IHsKIAkJeyAicGluY3RybC1zaW5nbGUsYmlhcy1wdWxsdXAiLCBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUCwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCmluZGV4IDMyMGMyNzMuLmJkNzI1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYwpAQCAtMTMsNyArMTMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkZXNjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KQEAgLTI2NiwxMSArMjcxLDU5IEBACiAJc3RydWN0IHN0X3BpbmNvbmYJKnBpbl9jb25mOwogfTsKIAorLyoKKyAqIEVkZ2UgdHJpZ2dlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgaGFyZHdhcmUgbGV2ZWwsIGl0IGlzIHN1cHBvcnRlZCBieQorICogc29mdHdhcmUgYnkgZXhwbG9pdGluZyB0aGUgbGV2ZWwgdHJpZ2dlciBzdXBwb3J0IGluIGhhcmR3YXJlLgorICogU29mdHdhcmUgdXNlcyBhIHZpcnR1YWwgcmVnaXN0ZXIgKEVER0VfQ09ORikgZm9yIGVkZ2UgdHJpZ2dlciBjb25maWd1cmF0aW9uCisgKiBvZiBlYWNoIGdwaW8gcGluIGluIGEgR1BJTyBiYW5rLgorICoKKyAqIEVhY2ggYmFuayBoYXMgYSAzMiBiaXQgRURHRV9DT05GIHJlZ2lzdGVyIHdoaWNoIGlzIGRpdmlkZWQgaW4gdG8gOCBwYXJ0cyBvZgorICogNC1iaXRzLiBFYWNoIDQtYml0IHNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgZWFjaCBwaW4gaW4gYSBncGlvIGJhbmsuCisgKgorICogYml0IGFsbG9jYXRpb24gcGVyIHBpbiBpczoKKyAqIEJpdHM6ICBbMCAtIDNdIHwgWzQgLSA3XSAgWzggLSAxMV0gLi4uIC4uLiAuLi4gLi4uICBbIDI4IC0gMzFdCisgKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgfCAgcGluLTAgIHwgIHBpbi0yIHwgcGluLTMgIHwgLi4uIC4uLiAuLi4gLi4uIHwgcGluIC03IHwKKyAqICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIEEgcGluIGNhbiBoYXZlIG9uZSBvZiBmb2xsb3dpbmcgdGhlIHZhbHVlcyBpbiBpdHMgZWRnZSBjb25maWd1cmF0aW9uIGZpZWxkLgorICoKKyAqCS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglbMC0zXQktIERlc2NyaXB0aW9uCisgKgktLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJMDAwMAktIE5vIGVkZ2UgSVJRLgorICoJMDAwMQktIEZhbGxpbmcgZWRnZSBJUlEuCisgKgkwMDEwCS0gUmlzaW5nIGVkZ2UgSVJRLgorICoJMDAxMQktIFJpc2luZyBhbmQgRmFsbGluZyBlZGdlIElSUS4KKyAqCS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTVF9JUlFfRURHRV9DT05GX0JJVFNfUEVSX1BJTgk0CisjZGVmaW5lIFNUX0lSUV9FREdFX01BU0sJCTB4ZgorI2RlZmluZSBTVF9JUlFfRURHRV9GQUxMSU5HCQlCSVQoMCkKKyNkZWZpbmUgU1RfSVJRX0VER0VfUklTSU5HCQlCSVQoMSkKKyNkZWZpbmUgU1RfSVJRX0VER0VfQk9USAkJKEJJVCgwKSB8IEJJVCgxKSkKKworI2RlZmluZSBTVF9JUlFfUklTSU5HX0VER0VfQ09ORihwaW4pIFwKKwkoU1RfSVJRX0VER0VfUklTSU5HIDw8IChwaW4gKiBTVF9JUlFfRURHRV9DT05GX0JJVFNfUEVSX1BJTikpCisKKyNkZWZpbmUgU1RfSVJRX0ZBTExJTkdfRURHRV9DT05GKHBpbikgXAorCShTVF9JUlFfRURHRV9GQUxMSU5HIDw8IChwaW4gKiBTVF9JUlFfRURHRV9DT05GX0JJVFNfUEVSX1BJTikpCisKKyNkZWZpbmUgU1RfSVJRX0JPVEhfRURHRV9DT05GKHBpbikgXAorCShTVF9JUlFfRURHRV9CT1RIIDw8IChwaW4gKiBTVF9JUlFfRURHRV9DT05GX0JJVFNfUEVSX1BJTikpCisKKyNkZWZpbmUgU1RfSVJRX0VER0VfQ09ORihjb25mLCBwaW4pIFwKKwkoY29uZiA+PiAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pICYgU1RfSVJRX0VER0VfTUFTSykKKwogc3RydWN0IHN0X2dwaW9fYmFuayB7CiAJc3RydWN0IGdwaW9fY2hpcAkJZ3Bpb19jaGlwOwogCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UJcmFuZ2U7CiAJdm9pZCBfX2lvbWVtCQkJKmJhc2U7CiAJc3RydWN0IHN0X3Bpb19jb250cm9sCQlwYzsKKwlzdHJ1Y3QJaXJxX2RvbWFpbgkJKmRvbWFpbjsKKwl1bnNpZ25lZCBsb25nCQkJaXJxX2VkZ2VfY29uZjsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIGxvY2s7CiB9OwogCiBzdHJ1Y3Qgc3RfcGluY3RybCB7CkBAIC0yODQsNiArMzM3LDcgQEAKIAlpbnQJCQkJbmdyb3VwczsKIAlzdHJ1Y3QgcmVnbWFwCQkJKnJlZ21hcDsKIAljb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhCSpkYXRhOworCXZvaWQgX19pb21lbQkJCSppcnFtdXhfYmFzZTsKIH07CiAKIC8qIFNPQyBzcGVjaWZpYyBkYXRhICovCkBAIC0zMzAsMTIgKzM4NCwyNSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgIHN0aWg0MTZfZGF0YSA9IHsKIAkucnRfc3R5bGUJPSBzdF9yZXRpbWVfc3R5bGVfZGVkaWNhdGVkLAogCS5pbnB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKLQkubmlucHV0X2RlbGF5cwk9IDE0LAorCS5uaW5wdXRfZGVsYXlzCT0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCiAJLm91dHB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKLQkubm91dHB1dF9kZWxheXMgPSAxNCwKKwkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKIAkuYWx0ID0gMCwgLm9lID0gNDAsIC5wdSA9IDUwLCAub2QgPSA2MCwgLnJ0ID0gMTAwLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgc3RpaDQwN19mbGFzaGRhdGEgPSB7CisJLnJ0X3N0eWxlCT0gc3RfcmV0aW1lX3N0eWxlX25vbmUsCisJLmlucHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAorCS5uaW5wdXRfZGVsYXlzCT0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCisJLm91dHB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKKwkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKKwkuYWx0ID0gMCwKKwkub2UgPSAtMSwgLyogTm90IEF2YWlsYWJsZSAqLworCS5wdSA9IC0xLCAvKiBOb3QgQXZhaWxhYmxlICovCisJLm9kID0gNjAsCisJLnJ0ID0gMTAwLAorfTsKKwogLyogTG93IGxldmVsIGZ1bmN0aW9ucy4uICovCiBzdGF0aWMgaW5saW5lIGludCBzdF9ncGlvX2JhbmsoaW50IGdwaW8pCiB7CkBAIC0zNTYsMjUgKzQyMywyOSBAQAogCXVuc2lnbmVkIGludCBvZV92YWx1ZSwgcHVfdmFsdWUsIG9kX3ZhbHVlOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IEJJVChwaW4pOwogCi0JcmVnbWFwX2ZpZWxkX3JlYWQob3V0cHV0X2VuYWJsZSwgJm9lX3ZhbHVlKTsKLQlyZWdtYXBfZmllbGRfcmVhZChwdWxsX3VwLCAmcHVfdmFsdWUpOwotCXJlZ21hcF9maWVsZF9yZWFkKG9wZW5fZHJhaW4sICZvZF92YWx1ZSk7CisJaWYgKG91dHB1dF9lbmFibGUpIHsKKwkJcmVnbWFwX2ZpZWxkX3JlYWQob3V0cHV0X2VuYWJsZSwgJm9lX3ZhbHVlKTsKKwkJb2VfdmFsdWUgJj0gfm1hc2s7CisJCWlmIChjb25maWcgJiBTVF9QSU5DT05GX09FKQorCQkJb2VfdmFsdWUgfD0gbWFzazsKKwkJcmVnbWFwX2ZpZWxkX3dyaXRlKG91dHB1dF9lbmFibGUsIG9lX3ZhbHVlKTsKKwl9CiAKLQkvKiBDbGVhciBvbGQgdmFsdWVzICovCi0Jb2VfdmFsdWUgJj0gfm1hc2s7Ci0JcHVfdmFsdWUgJj0gfm1hc2s7Ci0Jb2RfdmFsdWUgJj0gfm1hc2s7CisJaWYgKHB1bGxfdXApIHsKKwkJcmVnbWFwX2ZpZWxkX3JlYWQocHVsbF91cCwgJnB1X3ZhbHVlKTsKKwkJcHVfdmFsdWUgJj0gfm1hc2s7CisJCWlmIChjb25maWcgJiBTVF9QSU5DT05GX1BVKQorCQkJcHVfdmFsdWUgfD0gbWFzazsKKwkJcmVnbWFwX2ZpZWxkX3dyaXRlKHB1bGxfdXAsIHB1X3ZhbHVlKTsKKwl9CiAKLQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9PRSkKLQkJb2VfdmFsdWUgfD0gbWFzazsKLQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9QVSkKLQkJcHVfdmFsdWUgfD0gbWFzazsKLQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9PRCkKLQkJb2RfdmFsdWUgfD0gbWFzazsKLQotCXJlZ21hcF9maWVsZF93cml0ZShvdXRwdXRfZW5hYmxlLCBvZV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3dyaXRlKHB1bGxfdXAsIHB1X3ZhbHVlKTsKLQlyZWdtYXBfZmllbGRfd3JpdGUob3Blbl9kcmFpbiwgb2RfdmFsdWUpOworCWlmIChvcGVuX2RyYWluKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKG9wZW5fZHJhaW4sICZvZF92YWx1ZSk7CisJCW9kX3ZhbHVlICY9IH5tYXNrOworCQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9PRCkKKwkJCW9kX3ZhbHVlIHw9IG1hc2s7CisJCXJlZ21hcF9maWVsZF93cml0ZShvcGVuX2RyYWluLCBvZF92YWx1ZSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBzdF9wY3RsX3NldF9mdW5jdGlvbihzdHJ1Y3Qgc3RfcGlvX2NvbnRyb2wgKnBjLApAQCAtMzg1LDYgKzQ1Niw5IEBACiAJaW50IHBpbiA9IHN0X2dwaW9fcGluKHBpbl9pZCk7CiAJaW50IG9mZnNldCA9IHBpbiAqIDQ7CiAKKwlpZiAoIWFsdCkKKwkJcmV0dXJuOworCiAJcmVnbWFwX2ZpZWxkX3JlYWQoYWx0LCAmdmFsKTsKIAl2YWwgJj0gfigweGYgPDwgb2Zmc2V0KTsKIAl2YWwgfD0gZnVuY3Rpb24gPDwgb2Zmc2V0OwpAQCAtNTIyLDE3ICs1OTYsMjMgQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2VfdmFsdWUsIHB1X3ZhbHVlLCBvZF92YWx1ZTsKIAotCXJlZ21hcF9maWVsZF9yZWFkKHBjLT5vZSwgJm9lX3ZhbHVlKTsKLQlyZWdtYXBfZmllbGRfcmVhZChwYy0+cHUsICZwdV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3JlYWQocGMtPm9kLCAmb2RfdmFsdWUpOworCWlmIChwYy0+b2UpIHsKKwkJcmVnbWFwX2ZpZWxkX3JlYWQocGMtPm9lLCAmb2VfdmFsdWUpOworCQlpZiAob2VfdmFsdWUgJiBCSVQocGluKSkKKwkJCVNUX1BJTkNPTkZfUEFDS19PRSgqY29uZmlnKTsKKwl9CiAKLQlpZiAob2VfdmFsdWUgJiBCSVQocGluKSkKLQkJU1RfUElOQ09ORl9QQUNLX09FKCpjb25maWcpOwotCWlmIChwdV92YWx1ZSAmIEJJVChwaW4pKQotCQlTVF9QSU5DT05GX1BBQ0tfUFUoKmNvbmZpZyk7Ci0JaWYgKG9kX3ZhbHVlICYgQklUKHBpbikpCi0JCVNUX1BJTkNPTkZfUEFDS19PRCgqY29uZmlnKTsKKwlpZiAocGMtPnB1KSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKHBjLT5wdSwgJnB1X3ZhbHVlKTsKKwkJaWYgKHB1X3ZhbHVlICYgQklUKHBpbikpCisJCQlTVF9QSU5DT05GX1BBQ0tfUFUoKmNvbmZpZyk7CisJfQogCisJaWYgKHBjLT5vZCkgeworCQlyZWdtYXBfZmllbGRfcmVhZChwYy0+b2QsICZvZF92YWx1ZSk7CisJCWlmIChvZF92YWx1ZSAmIEJJVChwaW4pKQorCQkJU1RfUElOQ09ORl9QQUNLX09EKCpjb25maWcpOworCX0KIH0KIAogc3RhdGljIGludCBzdF9waW5jb25mX2dldF9yZXRpbWVfcGFja2VkKHN0cnVjdCBzdF9waW5jdHJsICppbmZvLApAQCAtMTA1MSw4ICsxMTMxLDIxIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgc3RfcGFyc2Vfc3lzY2ZncyhzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbywKLQkJaW50IGJhbmssIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2ZpZWxkICpzdF9wY19nZXRfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgYmFuaywKKwkJCQkJICAgIGludCBkYXRhLCBpbnQgbHNiLCBpbnQgbXNiKQoreworCXN0cnVjdCByZWdfZmllbGQgcmVnID0gUkVHX0ZJRUxEKChkYXRhICsgYmFuaykgKiA0LCBsc2IsIG1zYik7CisKKwlpZiAoZGF0YSA8IDApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGRldm1fcmVnbWFwX2ZpZWxkX2FsbG9jKGRldiwgcmVnbWFwLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBzdF9wYXJzZV9zeXNjZmdzKHN0cnVjdCBzdF9waW5jdHJsICppbmZvLCBpbnQgYmFuaywKKwkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAljb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICpkYXRhID0gaW5mby0+ZGF0YTsKIAkvKioKQEAgLTEwNjIsMjkgKzExNTUsMjEgQEAKIAkgKi8KIAlpbnQgbHNiID0gKGJhbmslNCkgKiBTVF9HUElPX1BJTlNfUEVSX0JBTks7CiAJaW50IG1zYiA9IGxzYiArIFNUX0dQSU9fUElOU19QRVJfQkFOSyAtIDE7Ci0Jc3RydWN0IHJlZ19maWVsZCBhbHRfcmVnID0gUkVHX0ZJRUxEKChkYXRhLT5hbHQgKyBiYW5rKSAqIDQsIDAsIDMxKTsKLQlzdHJ1Y3QgcmVnX2ZpZWxkIG9lX3JlZyA9IFJFR19GSUVMRCgoZGF0YS0+b2UgKyBiYW5rLzQpICogNCwgbHNiLCBtc2IpOwotCXN0cnVjdCByZWdfZmllbGQgcHVfcmVnID0gUkVHX0ZJRUxEKChkYXRhLT5wdSArIGJhbmsvNCkgKiA0LCBsc2IsIG1zYik7Ci0Jc3RydWN0IHJlZ19maWVsZCBvZF9yZWcgPSBSRUdfRklFTEQoKGRhdGEtPm9kICsgYmFuay80KSAqIDQsIGxzYiwgbXNiKTsKIAlzdHJ1Y3Qgc3RfcGlvX2NvbnRyb2wgKnBjID0gJmluZm8tPmJhbmtzW2JhbmtdLnBjOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGluZm8tPmRldjsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgID0gaW5mby0+cmVnbWFwOwogCi0JcGMtPmFsdCA9IGRldm1fcmVnbWFwX2ZpZWxkX2FsbG9jKGRldiwgcmVnbWFwLCBhbHRfcmVnKTsKLQlwYy0+b2UgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgb2VfcmVnKTsKLQlwYy0+cHUgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgcHVfcmVnKTsKLQlwYy0+b2QgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgb2RfcmVnKTsKLQotCWlmIChJU19FUlIocGMtPmFsdCkgfHwgSVNfRVJSKHBjLT5vZSkgfHwKLQkJCUlTX0VSUihwYy0+cHUpIHx8IElTX0VSUihwYy0+b2QpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlwYy0+YWx0ID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLCBkYXRhLT5hbHQsIDAsIDMxKTsKKwlwYy0+b2UgPSBzdF9wY19nZXRfdmFsdWUoZGV2LCByZWdtYXAsIGJhbmsvNCwgZGF0YS0+b2UsIGxzYiwgbXNiKTsKKwlwYy0+cHUgPSBzdF9wY19nZXRfdmFsdWUoZGV2LCByZWdtYXAsIGJhbmsvNCwgZGF0YS0+cHUsIGxzYiwgbXNiKTsKKwlwYy0+b2QgPSBzdF9wY19nZXRfdmFsdWUoZGV2LCByZWdtYXAsIGJhbmsvNCwgZGF0YS0+b2QsIGxzYiwgbXNiKTsKIAogCS8qIHJldGltZSBhdmFpYWJsZSBmb3IgYWxsIHBpbnMgYnkgZGVmYXVsdCAqLwogCXBjLT5ydF9waW5fbWFzayA9IDB4ZmY7CiAJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzdCxyZXRpbWUtcGluLW1hc2siLCAmcGMtPnJ0X3Bpbl9tYXNrKTsKIAlzdF9wY3RsX2R0X3NldHVwX3JldGltZShpbmZvLCBiYW5rLCBwYyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiB9CiAKIC8qCkBAIC0xMjAwLDYgKzEyODUsMTk0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3RfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBncGlvX2NoaXBfdG9fYmFuayhjaGlwKTsKKwlpbnQgaXJxID0gLUVOWElPOworCisJaWYgKG9mZnNldCA8IGNoaXAtPm5ncGlvKQorCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGJhbmstPmRvbWFpbiwgb2Zmc2V0KTsKKworCWRldl9pbmZvKGNoaXAtPmRldiwgIiVzOiByZXF1ZXN0IElSUSBmb3IgR1BJTyAlZCwgcmV0dXJuICVkXG4iLAorCQkJCWNoaXAtPmxhYmVsLCBvZmZzZXQgKyBjaGlwLT5iYXNlLCBpcnEpOworCXJldHVybiBpcnE7Cit9CisKK3N0YXRpYyB2b2lkIHN0X2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCXdyaXRlbChCSVQoZC0+aHdpcnEpLCBiYW5rLT5iYXNlICsgUkVHX1BJT19DTFJfUE1BU0spOworfQorCitzdGF0aWMgdm9pZCBzdF9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCXdyaXRlbChCSVQoZC0+aHdpcnEpLCBiYW5rLT5iYXNlICsgUkVHX1BJT19TRVRfUE1BU0spOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHN0X2dwaW9faXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCWlmIChncGlvX2xvY2tfYXNfaXJxKCZiYW5rLT5ncGlvX2NoaXAsIGQtPmh3aXJxKSkKKwkJZGV2X2VycihiYW5rLT5ncGlvX2NoaXAuZGV2LAorCQkJInVuYWJsZSB0byBsb2NrIEhXIElSUSAlbHUgZm9yIElSUVxuIiwKKwkJCWQtPmh3aXJxKTsKKworCXN0X2dwaW9faXJxX3VubWFzayhkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdF9ncGlvX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJc3RfZ3Bpb19pcnFfbWFzayhkKTsKKwlncGlvX3VubG9ja19hc19pcnEoJmJhbmstPmdwaW9fY2hpcCwgZC0+aHdpcnEpOworfQorCitzdGF0aWMgaW50IHN0X2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY29tcCwgcGluID0gZC0+aHdpcnE7CisJdTMyIHZhbDsKKwl1MzIgcGluX2VkZ2VfY29uZiA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCWNvbXAgPSAwOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJY29tcCA9IDA7CisJCXBpbl9lZGdlX2NvbmYgPSBTVF9JUlFfRkFMTElOR19FREdFX0NPTkYocGluKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCWNvbXAgPSAxOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQljb21wID0gMTsKKwkJcGluX2VkZ2VfY29uZiA9IFNUX0lSUV9SSVNJTkdfRURHRV9DT05GKHBpbik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQljb21wID0gc3RfZ3Bpb19nZXQoJmJhbmstPmdwaW9fY2hpcCwgcGluKTsKKwkJcGluX2VkZ2VfY29uZiA9IFNUX0lSUV9CT1RIX0VER0VfQ09ORihwaW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOworCWJhbmstPmlycV9lZGdlX2NvbmYgJj0gIH4oU1RfSVJRX0VER0VfTUFTSyA8PCAoCisJCQkJcGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKTsKKwliYW5rLT5pcnFfZWRnZV9jb25mIHw9IHBpbl9lZGdlX2NvbmY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gcmVhZGwoYmFuay0+YmFzZSArIFJFR19QSU9fUENPTVApOworCXZhbCAmPSB+QklUKHBpbik7CisJdmFsIHw9IChjb21wIDw8IHBpbik7CisJd3JpdGVsKHZhbCwgYmFuay0+YmFzZSArIFJFR19QSU9fUENPTVApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBcyBlZGdlIHRyaWdnZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IGhhcmR3YXJlIGxldmVsLCBpdCBpcyBzdXBwb3J0ZWQgYnkKKyAqIHNvZnR3YXJlIGJ5IGV4cGxvaXRpbmcgdGhlIGxldmVsIHRyaWdnZXIgc3VwcG9ydCBpbiBoYXJkd2FyZS4KKyAqCisgKiBTdGVwcyBmb3IgZGV0ZWN0aW9uIHJhaXNpbmcgZWRnZSBpbnRlcnJ1cHQgaW4gc29mdHdhcmUuCisgKgorICogU3RlcCAxOiBDT05GSUdVUkUgcGluIHRvIGRldGVjdCBsZXZlbCBMT1cgaW50ZXJydXB0cy4KKyAqCisgKiBTdGVwIDI6IERFVEVDVCBsZXZlbCBMT1cgaW50ZXJydXB0IGFuZCBpbiBpcnFtdXgvZ3BpbyBiYW5rIGludGVycnVwdCBoYW5kbGVyLAorICogaWYgdGhlIHZhbHVlIG9mIHBpbiBpcyBsb3csIHRoZW4gQ09ORklHVVJFIHBpbiBmb3IgbGV2ZWwgSElHSCBpbnRlcnJ1cHQuCisgKiBJR05PUkUgY2FsbGluZyB0aGUgYWN0dWFsIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgcGluIGF0IHRoaXMgc3RhZ2UuCisgKgorICogU3RlcCAzOiBERVRFQ1QgbGV2ZWwgSElHSCBpbnRlcnJ1cHQgYW5kIGluIGlycW11eC9ncGlvLWJhbmsgaW50ZXJydXB0IGhhbmRsZXIKKyAqIGlmIHRoZSB2YWx1ZSBvZiBwaW4gaXMgSElHSCwgQ09ORklHVVJFIHBpbiBmb3IgbGV2ZWwgTE9XIGludGVycnVwdCBhbmQgdGhlbgorICogRElTUEFUQ0ggdGhlIGludGVycnVwdCB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXIgb2YgdGhlIHBpbi4KKyAqCisgKgkJIHN0ZXAtMSAgX19fX19fX18gICAgIF9fX19fX19fX18KKyAqCQkJCXwgICAgIHwgc3RlcCAtIDMKKyAqCQkJICAgICAgICB8ICAgICB8CisgKgkJCXN0ZXAgLTIgfF9fX19ffAorICoKKyAqIGZhbGxpbmcgZWRnZSBpcyBhbHNvIGRldGVjdGVkIGludCB0aGUgc2FtZSB3YXkuCisgKgorICovCitzdGF0aWMgdm9pZCBfX2dwaW9faXJxX2hhbmRsZXIoc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuaykKK3sKKwl1bnNpZ25lZCBsb25nIHBvcnRfaW4sIHBvcnRfbWFzaywgcG9ydF9jb21wLCBhY3RpdmVfaXJxczsKKwl1bnNpZ25lZCBsb25nIGJhbmtfZWRnZV9tYXNrLCBmbGFnczsKKwlpbnQgbiwgdmFsLCBlY2ZnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKwliYW5rX2VkZ2VfbWFzayA9IGJhbmstPmlycV9lZGdlX2NvbmY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOworCisJZm9yICg7OykgeworCQlwb3J0X2luID0gcmVhZGwoYmFuay0+YmFzZSArIFJFR19QSU9fUElOKTsKKwkJcG9ydF9jb21wID0gcmVhZGwoYmFuay0+YmFzZSArIFJFR19QSU9fUENPTVApOworCQlwb3J0X21hc2sgPSByZWFkbChiYW5rLT5iYXNlICsgUkVHX1BJT19QTUFTSyk7CisKKwkJYWN0aXZlX2lycXMgPSAocG9ydF9pbiBeIHBvcnRfY29tcCkgJiBwb3J0X21hc2s7CisKKwkJaWYgKGFjdGl2ZV9pcnFzID09IDApCisJCQlicmVhazsKKworCQlmb3JfZWFjaF9zZXRfYml0KG4sICZhY3RpdmVfaXJxcywgQklUU19QRVJfTE9ORykgeworCQkJLyogY2hlY2sgaWYgd2UgYXJlIGRldGVjdGluZyBmYWtlIGVkZ2VzIC4uLiAqLworCQkJZWNmZyA9IFNUX0lSUV9FREdFX0NPTkYoYmFua19lZGdlX21hc2ssIG4pOworCisJCQlpZiAoZWNmZykgeworCQkJCS8qIGVkZ2UgZGV0ZWN0aW9uLiAqLworCQkJCXZhbCA9IHN0X2dwaW9fZ2V0KCZiYW5rLT5ncGlvX2NoaXAsIG4pOworCisJCQkJd3JpdGVsKEJJVChuKSwKKwkJCQkJdmFsID8gYmFuay0+YmFzZSArIFJFR19QSU9fU0VUX1BDT01QIDoKKwkJCQkJYmFuay0+YmFzZSArIFJFR19QSU9fQ0xSX1BDT01QKTsKKworCQkJCWlmIChlY2ZnICE9IFNUX0lSUV9FREdFX0JPVEggJiYKKwkJCQkJISgoZWNmZyAmIFNUX0lSUV9FREdFX0ZBTExJTkcpIF4gdmFsKSkKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnFfZmluZF9tYXBwaW5nKGJhbmstPmRvbWFpbiwgbikpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzdF9ncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCS8qIGludGVycnVwdCBkZWRpY2F0ZWQgcGVyIGJhbmsgKi8KKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKworCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOworCV9fZ3Bpb19pcnFfaGFuZGxlcihiYW5rKTsKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBzdF9ncGlvX2lycW11eF9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9nZXRfY2hpcChpcnEpOworCXN0cnVjdCBzdF9waW5jdHJsICppbmZvID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwlpbnQgbjsKKworCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOworCisJc3RhdHVzID0gcmVhZGwoaW5mby0+aXJxbXV4X2Jhc2UpOworCisJZm9yX2VhY2hfc2V0X2JpdChuLCAmc3RhdHVzLCBTVF9HUElPX1BJTlNfUEVSX0JBTkspCisJCV9fZ3Bpb19pcnFfaGFuZGxlcigmaW5mby0+YmFua3Nbbl0pOworCisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKK30KKwogc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc3RfZ3Bpb190ZW1wbGF0ZSA9IHsKIAkucmVxdWVzdAkJPSBzdF9ncGlvX3JlcXVlc3QsCiAJLmZyZWUJCQk9IHN0X2dwaW9fZnJlZSwKQEAgLTEyMTAsNiArMTQ4MywzNCBAQAogCS5uZ3BpbwkJCT0gU1RfR1BJT19QSU5TX1BFUl9CQU5LLAogCS5vZl9ncGlvX25fY2VsbHMJPSAxLAogCS5vZl94bGF0ZQkJPSBzdF9ncGlvX3hsYXRlLAorCS50b19pcnEJCQk9IHN0X2dwaW9fdG9faXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdF9ncGlvX2lycWNoaXAgPSB7CisJLm5hbWUJCT0gIkdQSU8iLAorCS5pcnFfbWFzawk9IHN0X2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sJPSBzdF9ncGlvX2lycV91bm1hc2ssCisJLmlycV9zZXRfdHlwZQk9IHN0X2dwaW9faXJxX3NldF90eXBlLAorCS5pcnFfc3RhcnR1cAk9IHN0X2dwaW9faXJxX3N0YXJ0dXAsCisJLmlycV9zaHV0ZG93bgk9IHN0X2dwaW9faXJxX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBzdF9ncGlvX2lycV9kb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpoLAorCQkJdW5zaWduZWQgaW50IHZpcnEsIGlycV9od19udW1iZXJfdCBodykKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaC0+aG9zdF9kYXRhOworCisJaXJxX3NldF9jaGlwKHZpcnEsICZzdF9ncGlvX2lycWNoaXApOworCWlycV9zZXRfaGFuZGxlcih2aXJxLCBoYW5kbGVfc2ltcGxlX2lycSk7CisJc2V0X2lycV9mbGFncyh2aXJxLCBJUlFGX1ZBTElEKTsKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBiYW5rKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9kb21haW5fb3BzIHN0X2dwaW9faXJxX29wcyA9IHsKKwkubWFwCT0gc3RfZ3Bpb19pcnFfZG9tYWluX21hcCwKKwkueGxhdGUJPSBpcnFfZG9tYWluX3hsYXRlX3R3b2NlbGwsCiB9OwogCiBzdGF0aWMgaW50IHN0X2dwaW9saWJfcmVnaXN0ZXJfYmFuayhzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbywKQEAgLTEyMTksOCArMTUyMCw4IEBACiAJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UgPSAmYmFuay0+cmFuZ2U7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaW5mby0+ZGV2OwogCWludCBiYW5rX251bSA9IG9mX2FsaWFzX2dldF9pZChucCwgImdwaW8iKTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCWludCBlcnI7CisJc3RydWN0IHJlc291cmNlIHJlcywgaXJxX3JlczsKKwlpbnQgZ3Bpb19pcnEgPSAwLCBlcnIsIGk7CiAKIAlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTIzMyw2ICsxNTM0LDcgQEAKIAliYW5rLT5ncGlvX2NoaXAuYmFzZSA9IGJhbmtfbnVtICogU1RfR1BJT19QSU5TX1BFUl9CQU5LOwogCWJhbmstPmdwaW9fY2hpcC5uZ3BpbyA9IFNUX0dQSU9fUElOU19QRVJfQkFOSzsKIAliYW5rLT5ncGlvX2NoaXAub2Zfbm9kZSA9IG5wOworCXNwaW5fbG9ja19pbml0KCZiYW5rLT5sb2NrKTsKIAogCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAic3QsYmFuay1uYW1lIiwgJnJhbmdlLT5uYW1lKTsKIAliYW5rLT5ncGlvX2NoaXAubGFiZWwgPSByYW5nZS0+bmFtZTsKQEAgLTEyNDgsNiArMTU1MCw1MSBAQAogCX0KIAlkZXZfaW5mbyhkZXYsICIlcyBiYW5rIGFkZGVkLlxuIiwgcmFuZ2UtPm5hbWUpOwogCisJLyoqCisJICogR1BJTyBiYW5rIGNhbiBoYXZlIG9uZSBvZiB0aGUgdHdvIHBvc3NpYmxlIHR5cGVzIG9mCisJICogaW50ZXJydXB0LXdpcmluZ3MuCisJICoKKwkgKiBGaXJzdCB0eXBlIGlzIHZpYSBpcnFtdXgsIHNpbmdsZSBpbnRlcnJ1cHQgaXMgdXNlZCBieSBtdWx0aXBsZQorCSAqIGdwaW8gYmFua3MuIFRoaXMgcmVkdWNlcyBudW1iZXIgb2Ygb3ZlcmFsbCBpbnRlcnJ1cHRzIG51bWJlcnMKKwkgKiByZXF1aXJlZC4gQWxsIHRoZXNlIGJhbmtzIGJlbG9uZyB0byBhIHNpbmdsZSBwaW5jb250cm9sbGVyLgorCSAqCQkgIF9fX19fX19fXworCSAqCQkgfAkgICB8LS0tLT4gW2dwaW8tYmFuayAobikgICAgXQorCSAqCQkgfAkgICB8LS0tLT4gW2dwaW8tYmFuayAobiArIDEpXQorCSAqCVtpcnFOXS0tIHwgaXJxLW11eCB8LS0tLT4gW2dwaW8tYmFuayAobiArIDIpXQorCSAqCQkgfAkgICB8LS0tLT4gW2dwaW8tYmFuayAoLi4uICApXQorCSAqCQkgfF9fX19fX19fX3wtLS0tPiBbZ3Bpby1iYW5rIChuICsgNyldCisJICoKKwkgKiBTZWNvbmQgdHlwZSBoYXMgYSBkZWRpY2F0ZWQgaW50ZXJydXB0IHBlciBlYWNoIGdwaW8gYmFuay4KKwkgKgorCSAqCVtpcnFOXS0tLS0+IFtncGlvLWJhbmsgKG4pXQorCSAqLworCisJaWYgKG9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJmlycV9yZXMpKSB7CisJCWdwaW9faXJxID0gaXJxX3Jlcy5zdGFydDsKKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoZ3Bpb19pcnEsIHN0X2dwaW9faXJxX2hhbmRsZXIpOworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShncGlvX2lycSwgYmFuayk7CisJfQorCisJaWYgKGluZm8tPmlycW11eF9iYXNlID4gMCB8fCBncGlvX2lycSA+IDApIHsKKwkJLyogU2V0dXAgSVJRIGRvbWFpbiAqLworCQliYW5rLT5kb21haW4gID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5wLAorCQkJCQkJU1RfR1BJT19QSU5TX1BFUl9CQU5LLAorCQkJCQkJJnN0X2dwaW9faXJxX29wcywgYmFuayk7CisJCWlmICghYmFuay0+ZG9tYWluKSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhZGQgaXJxIGRvbWFpbiBmb3IgJXNcbiIsCisJCQkJbnAtPmZ1bGxfbmFtZSk7CisJCX0gZWxzZSAgeworCQkJZm9yIChpID0gMDsgaSA8IFNUX0dQSU9fUElOU19QRVJfQkFOSzsgaSsrKSB7CisJCQkJaWYgKGlycV9jcmVhdGVfbWFwcGluZyhiYW5rLT5kb21haW4sIGkpIDwgMCkKKwkJCQkJZGV2X2VycihkZXYsCisJCQkJCQkiRmFpbGVkIHRvIG1hcCBJUlEgJWlcbiIsIGkpOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQlkZXZfaW5mbyhkZXYsICJObyBJUlEgc3VwcG9ydCBmb3IgJXMgYmFua1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNjQsNiArMTYxMSwxMCBAQAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1yZWFyLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1mdmRwLWZlLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1mdmRwLWxpdGUtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXNiYy1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctZnJvbnQtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXJlYXItcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LWZsYXNoLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDA3X2ZsYXNoZGF0YX0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogCkBAIC0xMjc2LDYgKzE2MjcsOCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwogCWludCBncnBfaW5kZXggPSAwOworCWludCBpcnEgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCiAJc3RfcGN0bF9kdF9jaGlsZF9jb3VudChpbmZvLCBucCk7CiAJaWYgKCFpbmZvLT5uYmFua3MpIHsKQEAgLTEzMDYsNiArMTY1OSwyMSBAQAogCX0KIAlpbmZvLT5kYXRhID0gb2ZfbWF0Y2hfbm9kZShzdF9wY3RsX29mX21hdGNoLCBucCktPmRhdGE7CiAKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJaWYgKGlycSA+IDApIHsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAorCQkJCQlJT1JFU09VUkNFX01FTSwgImlycW11eCIpOworCQlpbmZvLT5pcnFtdXhfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCisJCWlmIChJU19FUlIoaW5mby0+aXJxbXV4X2Jhc2UpKQorCQkJcmV0dXJuIFBUUl9FUlIoaW5mby0+aXJxbXV4X2Jhc2UpOworCisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgc3RfZ3Bpb19pcnFtdXhfaGFuZGxlcik7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgaW5mbyk7CisKKwl9CisKIAlwY3RsX2Rlc2MtPm5waW5zID0gaW5mby0+bmJhbmtzICogU1RfR1BJT19QSU5TX1BFUl9CQU5LOwogCXBkZXNjID0JZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQlzaXplb2YoKnBkZXNjKSAqIHBjdGxfZGVzYy0+bnBpbnMsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3VueGktcGlucy5oIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3VueGktcGlucy5oCmluZGV4IDZmZDhkNGQuLjNkNjA2NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN1bnhpLXBpbnMuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdW54aS1waW5zLmgKQEAgLTE5MzIsMjcgKzE5MzIsMjcgQEAKIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEYwLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBEMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBEMSAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTl9QRjEsCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMCIpKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpKSwJCS8qIEQwICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOX1BGMiwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMwIikpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpKSwJCS8qIENMSyAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTl9QRjMsCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMCIpKSwJCS8qIENNRCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBDTUQgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEY0LAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBEMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBEMyAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTl9QRjUsCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMCIpKSwJCS8qIEQyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpKSwJCS8qIEQyICovCiAJLyogSG9sZSAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTl9QRzAsCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMKaW5kZXggZTc2NzM1NS4uNjU0NTgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5jCkBAIC0zOSw2ICszOSw3IEBACiAJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsOwogCiAJY29uc3Qgc3RydWN0IHRlZ3JhX3BpbmN0cmxfc29jX2RhdGEgKnNvYzsKKwljb25zdCBjaGFyICoqZ3JvdXBfcGluczsKIAogCWludCBuYmFua3M7CiAJdm9pZCBfX2lvbWVtICoqcmVnczsKQEAgLTYyMCw2ICs2MjEsOCBAQAogCXN0cnVjdCB0ZWdyYV9wbXggKnBteDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaTsKKwljb25zdCBjaGFyICoqZ3JvdXBfcGluczsKKwlpbnQgZm4sIGduLCBnZm47CiAKIAlwbXggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbXgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBteCkgewpAQCAtNjI5LDYgKzYzMiw0MSBAQAogCXBteC0+ZGV2ID0gJnBkZXYtPmRldjsKIAlwbXgtPnNvYyA9IHNvY19kYXRhOwogCisJLyoKKwkgKiBFYWNoIG11eCBncm91cCB3aWxsIGFwcGVhciBpbiA0IGZ1bmN0aW9ucycgbGlzdCBvZiBncm91cHMuCisJICogVGhpcyBvdmVyLWFsbG9jYXRlcyBzbGlnaHRseSwgc2luY2Ugbm90IGFsbCBncm91cHMgYXJlIG11eCBncm91cHMuCisJICovCisJcG14LT5ncm91cF9waW5zID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCXNvY19kYXRhLT5uZ3JvdXBzICogNCAqIHNpemVvZigqcG14LT5ncm91cF9waW5zKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwbXgtPmdyb3VwX3BpbnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZ3JvdXBfcGlucyA9IHBteC0+Z3JvdXBfcGluczsKKwlmb3IgKGZuID0gMDsgZm4gPCBzb2NfZGF0YS0+bmZ1bmN0aW9uczsgZm4rKykgeworCQlzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gKmZ1bmMgPSAmc29jX2RhdGEtPmZ1bmN0aW9uc1tmbl07CisKKwkJZnVuYy0+Z3JvdXBzID0gZ3JvdXBfcGluczsKKworCQlmb3IgKGduID0gMDsgZ24gPCBzb2NfZGF0YS0+bmdyb3VwczsgZ24rKykgeworCQkJY29uc3Qgc3RydWN0IHRlZ3JhX3Bpbmdyb3VwICpnID0gJnNvY19kYXRhLT5ncm91cHNbZ25dOworCisJCQlpZiAoZy0+bXV4X3JlZyA9PSAtMSkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChnZm4gPSAwOyBnZm4gPCA0OyBnZm4rKykKKwkJCQlpZiAoZy0+ZnVuY3NbZ2ZuXSA9PSBmbikKKwkJCQkJYnJlYWs7CisJCQlpZiAoZ2ZuID09IDQpCisJCQkJY29udGludWU7CisKKwkJCUJVR19PTihncm91cF9waW5zIC0gcG14LT5ncm91cF9waW5zID49CisJCQkJc29jX2RhdGEtPm5ncm91cHMgKiA0KTsKKwkJCSpncm91cF9waW5zKysgPSBnLT5uYW1lOworCQkJZnVuYy0+bmdyb3VwcysrOworCQl9CisJfQorCiAJdGVncmFfcGluY3RybF9ncGlvX3JhbmdlLm5waW5zID0gcG14LT5zb2MtPm5ncGlvczsKIAl0ZWdyYV9waW5jdHJsX2Rlc2MubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCXRlZ3JhX3BpbmN0cmxfZGVzYy5waW5zID0gcG14LT5zb2MtPnBpbnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5oIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuaAppbmRleCA4MTdmNzA2Li42MDUzODMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmgKQEAgLTcyLDcgKzcyLDcgQEAKICAqLwogc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IGNoYXIgKiBjb25zdCAqZ3JvdXBzOworCWNvbnN0IGNoYXIgKipncm91cHM7CiAJdW5zaWduZWQgbmdyb3VwczsKIH07CiAKQEAgLTE5Myw3ICsxOTMsNyBAQAogCXVuc2lnbmVkIG5ncGlvczsKIAljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluczsKIAl1bnNpZ25lZCBucGluczsKLQljb25zdCBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gKmZ1bmN0aW9uczsKKwlzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gKmZ1bmN0aW9uczsKIAl1bnNpZ25lZCBuZnVuY3Rpb25zOwogCWNvbnN0IHN0cnVjdCB0ZWdyYV9waW5ncm91cCAqZ3JvdXBzOwogCXVuc2lnbmVkIG5ncm91cHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTExNC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMTQuYwppbmRleCA5M2M5ZTM4Li42M2ZlNzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTExNC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTE0LmMKQEAgLTEsMTAgKzEsOCBAQAogLyoKLSAqIFBpbmN0cmwgZGF0YSBhbmQgZHJpdmVyIGZvciB0aGUgTlZJRElBIFRlZ3JhMTE0IHBpbm11eAorICogUGluY3RybCBkYXRhIGZvciB0aGUgTlZJRElBIFRlZ3JhMTE0IHBpbm11eAogICoKICAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIEF1dGhvcjogIFByaXRlc2ggUmFpdGhhdGhhIDxwcmFpdGhhdGhhQG52aWRpYS5jb20+Ci0gKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCiAgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMTMsOSArMTEsNiBAQAogICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTIwMyw4ICsxOTgsOCBAQAogI2RlZmluZSBURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1CQlfR1BJTygyNDUpCiAKIC8qIEFsbCBub24tR1BJTyBwaW5zIGZvbGxvdyAqLwotI2RlZmluZSBOVU1fR1BJT1MJKFRFR1JBX1BJTl9TRE1NQzNfQ0xLX0xCX0lOX1BFRTUgKyAxKQotI2RlZmluZSBfUElOKG9mZnNldCkJKE5VTV9HUElPUyArIChvZmZzZXQpKQorI2RlZmluZSBOVU1fR1BJT1MJCQkJKFRFR1JBX1BJTl9TRE1NQzNfQ0xLX0xCX0lOX1BFRTUgKyAxKQorI2RlZmluZSBfUElOKG9mZnNldCkJCQkJKE5VTV9HUElPUyArIChvZmZzZXQpKQogCiAvKiBOb24tR1BJTyBwaW5zICovCiAjZGVmaW5lIFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEJCQlfUElOKDApCkBAIC0yMTIsOCArMjA3LDExIEBACiAjZGVmaW5lIFRFR1JBX1BJTl9QV1JfSU5UX04JCQlfUElOKDIpCiAjZGVmaW5lIFRFR1JBX1BJTl9SRVNFVF9PVVRfTgkJCV9QSU4oMykKICNkZWZpbmUgVEVHUkFfUElOX09XUgkJCQlfUElOKDQpCisjZGVmaW5lIFRFR1JBX1BJTl9KVEFHX1JUQ0sJCQlfUElOKDUpCisjZGVmaW5lIFRFR1JBX1BJTl9DTEtfMzJLX0lOCQkJX1BJTig2KQorI2RlZmluZSBURUdSQV9QSU5fR01JX0NMS19MQgkJCV9QSU4oNykKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICB0ZWdyYTExNF9waW5zW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgdGVncmExMTRfcGluc1tdID0gewogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DTEtfMzJLX09VVF9QQTAsICJDTEtfMzJLX09VVCBQQTAiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fVUFSVDNfQ1RTX05fUEExLCAiVUFSVDNfQ1RTX04gUEExIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDJfRlNfUEEyLCAiREFQMl9GUyBQQTIiKSwKQEAgLTM4NSw5ICszODMsMTIgQEAKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1LCAiU0RNTUMzX0NMS19MQl9JTiBQRUU1IiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NPUkVfUFdSX1JFUSwgIkNPUkVfUFdSX1JFUSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DUFVfUFdSX1JFUSwgIkNQVV9QV1JfUkVRIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX09XUiwgIk9XUiIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QV1JfSU5UX04sICJQV1JfSU5UX04iKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fUkVTRVRfT1VUX04sICJSRVNFVF9PVVRfTiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9PV1IsICJPV1IiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fSlRBR19SVENLLCAiSlRBR19SVENLIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NMS18zMktfSU4sICJDTEtfMzJLX0lOIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0dNSV9DTEtfTEIsICJHTUlfQ0xLX0xCIiksCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2xrXzMya19vdXRfcGEwX3BpbnNbXSA9IHsKQEAgLTEwNzQsMTAgKzEwNzUsNiBAQAogCVRFR1JBX1BJTl9DUFVfUFdSX1JFUSwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBvd3JfcGluc1tdID0gewotCVRFR1JBX1BJTl9PV1IsCi19OwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgcHdyX2ludF9uX3BpbnNbXSA9IHsKIAlURUdSQV9QSU5fUFdSX0lOVF9OLAogfTsKQEAgLTEwODYsNiArMTA4MywyMiBAQAogCVRFR1JBX1BJTl9SRVNFVF9PVVRfTiwKIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBvd3JfcGluc1tdID0geworCVRFR1JBX1BJTl9PV1IsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQganRhZ19ydGNrX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fSlRBR19SVENLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNsa18zMmtfaW5fcGluc1tdID0geworCVRFR1JBX1BJTl9DTEtfMzJLX0lOLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGdtaV9jbGtfbGJfcGluc1tdID0geworCVRFR1JBX1BJTl9HTUlfQ0xLX0xCLAorfTsKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2FvMV9waW5zW10gPSB7CiAJVEVHUkFfUElOX0tCX1JPVzBfUFIwLAogCVRFR1JBX1BJTl9LQl9ST1cxX1BSMSwKQEAgLTExMjcsNyArMTE0MCw2IEBACiAJVEVHUkFfUElOX0dNSV9BRDEzX1BINSwKIAlURUdSQV9QSU5fR01JX0FEMTRfUEg2LAogCVRFR1JBX1BJTl9HTUlfQUQxNV9QSDcsCi0KIAlURUdSQV9QSU5fR01JX0lPUkRZX1BJNSwKIAlURUdSQV9QSU5fR01JX0NTN19OX1BJNiwKIH07CkBAIC0xMTQxLDE1ICsxMTUzLDEyIEBACiAJVEVHUkFfUElOX0dNSV9BRDVfUEc1LAogCVRFR1JBX1BJTl9HTUlfQUQ2X1BHNiwKIAlURUdSQV9QSU5fR01JX0FEN19QRzcsCi0KIAlURUdSQV9QSU5fR01JX1dSX05fUEkwLAogCVRFR1JBX1BJTl9HTUlfT0VfTl9QSTEsCiAJVEVHUkFfUElOX0dNSV9DUzZfTl9QSTMsCiAJVEVHUkFfUElOX0dNSV9SU1RfTl9QSTQsCiAJVEVHUkFfUElOX0dNSV9XQUlUX1BJNywKLQogCVRFR1JBX1BJTl9HTUlfRFFTX1BfUEozLAotCiAJVEVHUkFfUElOX0dNSV9BRFZfTl9QSzAsCiAJVEVHUkFfUElOX0dNSV9DTEtfUEsxLAogCVRFR1JBX1BJTl9HTUlfQ1M0X05fUEsyLApAQCAtMTM0MiwxNCArMTM1MSwzNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2RldjNfcGluc1tdID0gewotCVRFR1JBX1BJTl9DTEszX09VVF9QRUUwLAotCVRFR1JBX1BJTl9DTEszX1JFUV9QRUUxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2NlY19waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfYXQ2X3BpbnNbXSA9IHsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9kYXA1X3BpbnNbXSA9IHsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV91c2JfdmJ1c19lbl9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfYW8zX3BpbnNbXSA9IHsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9odjBfcGluc1tdID0geworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3NkaW80X3BpbnNbXSA9IHsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9hbzBfcGluc1tdID0gewogfTsKIAogZW51bSB0ZWdyYV9tdXggewogCVRFR1JBX01VWF9CTElOSywKIAlURUdSQV9NVVhfQ0VDLAogCVRFR1JBX01VWF9DTERWRlMsCisJVEVHUkFfTVVYX0NMSywKIAlURUdSQV9NVVhfQ0xLMTIsCiAJVEVHUkFfTVVYX0NQVSwKIAlURUdSQV9NVVhfREFQLApAQCAtMTM5NCw2ICsxNDI2LDcgQEAKIAlURUdSQV9NVVhfUlNWRDIsCiAJVEVHUkFfTVVYX1JTVkQzLAogCVRFR1JBX01VWF9SU1ZENCwKKwlURUdSQV9NVVhfUlRDSywKIAlURUdSQV9NVVhfU0RNTUMxLAogCVRFR1JBX01VWF9TRE1NQzIsCiAJVEVHUkFfTVVYX1NETU1DMywKQEAgLTE0MjUsOTQ0ICsxNDU4LDE2IEBACiAJVEVHUkFfTVVYX1ZJX0FMVDMsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsaW5rX2dyb3Vwc1tdID0gewotCSJjbGtfMzJrX291dF9wYTAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZWNfZ3JvdXBzW10gPSB7Ci0JImhkbWlfY2VjX3BlZTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGR2ZnNfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2FkMTBfcGgyIiwKLQkia2Jfcm93N19wcjciLAotCSJrYl9yb3c4X3BzMCIsCi0JImR2ZnNfcHdtX3B4MCIsCi0JImR2ZnNfY2xrX3B4MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsazEyX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfd3Bfbl9wdjMiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNwdV9ncm91cHNbXSA9IHsKLQkiY3B1X3B3cl9yZXEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXBfZ3JvdXBzW10gPSB7Ci0JImNsazFfcmVxX3BlZTIiLAotCSJjbGsyX3JlcV9wY2M1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwMV9ncm91cHNbXSA9IHsKLQkiY2xrMV9yZXFfcGVlMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDJfZ3JvdXBzW10gPSB7Ci0JImNsazFfb3V0X3B3NCIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRldjNfZ3JvdXBzW10gPSB7Ci0JImNsazNfcmVxX3BlZTEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5YV9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19zY2xrX3BwMyIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInBiYjMiLAotCSJwYmI0IiwKLQkicGJiNSIsCi0JInBiYjYiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX2NvbDNfcHEzIiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGlzcGxheWFfYWx0X2dyb3Vwc1tdID0gewotCSJrYl9yb3c2X3ByNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXliX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQkicHUzIiwKLQkicHU0IiwKLQkicHU1IiwKLQkicHU2IiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JImtiX3JvdzNfcHIzIiwKLQkia2Jfcm93NF9wcjQiLAotCSJrYl9yb3c1X3ByNSIsCi0JImtiX3JvdzZfcHI2IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHR2X2dyb3Vwc1tdID0gewotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVtY19kbGxfZ3JvdXBzW10gPSB7Ci0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgxX2dyb3Vwc1tdID0gewotCSJjbGsxX291dF9wdzQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgyX2dyb3Vwc1tdID0gewotCSJjbGsyX291dF9wdzUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgzX2dyb3Vwc1tdID0gewotCSJjbGszX291dF9wZWUwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2dyb3Vwc1tdID0gewotCSJnbWlfd3Bfbl9wYzciLAotCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2FkMTBfcGgyIiwKLQkiZ21pX2FkMTFfcGgzIiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX2FkMTRfcGg2IiwKLQkiZ21pX2FkMTVfcGg3IiwKLQkiZ21pX3dyX25fcGkwIiwKLQkiZ21pX29lX25fcGkxIiwKLQkiZ21pX2NzNl9uX3BpMyIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV9jczBfbl9wajAiLAotCSJnbWlfY3MxX25fcGoyIiwKLQkiZ21pX2Rxc19wX3BqMyIsCi0JImdtaV9hZHZfbl9wazAiLAotCSJnbWlfY2xrX3BrMSIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9hMTZfcGo3IiwKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9hMTlfcGs3IiwKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9hbHRfZ3JvdXBzW10gPSB7Ci0JImdtaV93cF9uX3BjNyIsCi0JImdtaV9jczNfbl9wazQiLAotCSJnbWlfYTE2X3BqNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkYV9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoc2lfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMxX2dyb3Vwc1tdID0gewotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzJfZ3JvdXBzW10gPSB7Ci0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjM19ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmM0X2dyb3Vwc1tdID0gewotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjcHdyX2dyb3Vwc1tdID0gewotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMwX2dyb3Vwc1tdID0gewotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX3NjbGtfcG4zIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMV9ncm91cHNbXSA9IHsKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczJfZ3JvdXBzW10gPSB7Ci0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMzX2dyb3Vwc1tdID0gewotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X3NjbGtfcHA3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzNF9ncm91cHNbXSA9IHsKLQkicGNjMSIsCi0JInBiYjAiLAotCSJwYmI3IiwKLQkicGNjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlyZGFfZ3JvdXBzW10gPSB7Ci0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2JjX2dyb3Vwc1tdID0gewotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW5kX2dyb3Vwc1tdID0gewotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9jczJfbl9wazMiLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfY3M3X25fcGk2IiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV9hZDhfcGgwIiwKLQkiZ21pX2FkOV9waDEiLAotCSJnbWlfYWQxMF9waDIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJnbWlfb2Vfbl9waTEiLAotCSJnbWlfZHFzX3BfcGozIiwKLQkiZ21pX3JzdF9uX3BpNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfYWx0X2dyb3Vwc1tdID0gewotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9yc3Rfbl9waTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvd3JfZ3JvdXBzW10gPSB7Ci0JInB1MCIsCi0JImtiX2NvbDRfcHE0IiwKLQkib3dyIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcG1pX2dyb3Vwc1tdID0gewotCSJwd3JfaW50X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20wX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJwdTMiLAotCSJnbWlfYWQ4X3BoMCIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTFfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInB1NCIsCi0JImdtaV9hZDlfcGgxIiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtMl9ncm91cHNbXSA9IHsKLQkicHU1IiwKLQkiZ21pX2FkMTBfcGgyIiwKLQkia2JfY29sM19wcTMiLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20zX2dyb3Vwc1tdID0gewotCSJwdTYiLAotCSJnbWlfYWQxMV9waDMiLAotCSJzZG1tYzNfY21kX3BhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3cm9uX2dyb3Vwc1tdID0gewotCSJjb3JlX3B3cl9yZXEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZXNldF9vdXRfbl9ncm91cHNbXSA9IHsKLQkicmVzZXRfb3V0X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkMV9ncm91cHNbXSA9IHsKLQkicHYxIiwKLQkiaGRtaV9pbnRfcG43IiwKLQkicHUxIiwKLQkicHUyIiwKLQkiZ21pX3dwX25fcGM3IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jczBfbl9wajAiLAotCSJnbWlfY3MxX25fcGoyIiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDdfYXVkX3B4NyIsCi0KLQkicmVzZXRfb3V0X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkMl9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHYxIiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkiY2xrMl9vdXRfcHc1IiwKLQkiY2xrMl9yZXFfcGNjNSIsCi0JImhkbWlfaW50X3BuNyIsCi0JImRkY19zY2xfcHY0IiwKLQkiZGRjX3NkYV9wdjUiLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi0JInBjYzEiLAotCSJwYmI3IiwKLQkicGNjMiIsCi0JInB3cl9pMmNfc2NsX3B6NiIsCi0JInB3cl9pMmNfc2RhX3B6NyIsCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJzeXNfY2xrX3JlcV9wejUiLAotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JInB3cl9pbnRfbiIsCi0JIm93ciIsCi0JInNwZGlmX291dF9wazUiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi0JInNkbW1jM19jbGtfbGJfaW5fcGVlNSIsCi0JInJlc2V0X291dF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDNfZ3JvdXBzW10gPSB7Ci0JInB2MCIsCi0JInB2MSIsCi0JInNkbW1jMV9jbGtfcHowIiwKLQkiY2xrMl9vdXRfcHc1IiwKLQkiY2xrMl9yZXFfcGNjNSIsCi0JImhkbWlfaW50X3BuNyIsCi0JImRkY19zY2xfcHY0IiwKLQkiZGRjX3NkYV9wdjUiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQkicGNjMSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiNyIsCi0JInBjYzIiLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzlfcHMxIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJvd3IiLAotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMV9vdXRfcHc0IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInNwZGlmX2luX3BrNiIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JImhkbWlfY2VjX3BlZTMiLAotCSJzZG1tYzNfY2Rfbl9wdjIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJyZXNldF9vdXRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQ0X2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdjEiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkicHUwIiwKLQkicHUxIiwKLQkicHUyIiwKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCSJnbWlfYWQwX3BnMCIsCi0JImdtaV9hZDFfcGcxIiwKLQkiZ21pX2FkMl9wZzIiLAotCSJnbWlfYWQzX3BnMyIsCi0JImdtaV9hZDRfcGc0IiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX3JzdF9uX3BpNCIsCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi0JImNhbV9tY2xrX3BjYzAiLAotCSJwY2MxIiwKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkicGJiNyIsCi0JInBjYzIiLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDVfcHE1IiwKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkicHdyX2ludF9uIiwKLQkib3dyIiwKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImNsazFfcmVxX3BlZTIiLAotCSJjbGsxX291dF9wdzQiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi0JImR2ZnNfcHdtX3B4MCIsCi0JImdwaW9feDFfYXVkX3B4MSIsCi0JImdwaW9feDNfYXVkX3B4MyIsCi0JImR2ZnNfY2xrX3B4MiIsCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi0JImdwaW9feDdfYXVkX3B4NyIsCi0JInNkbW1jM19jZF9uX3B2MiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jMV9ncm91cHNbXSA9IHsKLQotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkia2JfY29sNV9wcTUiLAotCSJzZG1tYzFfd3Bfbl9wdjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzJfZ3JvdXBzW10gPSB7Ci0JImdtaV9pb3JkeV9waTUiLAotCSJnbWlfY2xrX3BrMSIsCi0JImdtaV9jczJfbl9wazMiLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV9kcXNfcF9wajMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzNfZ3JvdXBzW10gPSB7Ci0JImtiX2NvbDRfcHE0IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi0JImhkbWlfY2VjX3BlZTMiLAotCSJzZG1tYzNfY2Rfbl9wdjIiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWM0X2dyb3Vwc1tdID0gewotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc29jX2dyb3Vwc1tdID0gewotCSJnbWlfY3MxX25fcGoyIiwKLQkiZ21pX29lX25fcGkxIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiaGRtaV9jZWNfcGVlMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwZGlmX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTFfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImdwaW9feDNfYXVkX3B4MyIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi0JImdwaW9feDdfYXVkX3B4NyIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTJfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLQkia2Jfcm93NF9wcjQiLAotCSJrYl9yb3c1X3ByNSIsCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkzX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkiZ21pX3dhaXRfcGk3IiwKLQkiZ21pX2NzNl9uX3BpMyIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV9hMTlfcGs3IiwKLQkiZ21pX3dyX25fcGkwIiwKLQkic2RtbWMxX3dwX25fcHYzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNV9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19zY2xrX3BwMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTZfZ3JvdXBzW10gPSB7Ci0JImR2ZnNfcHdtX3B4MCIsCi0JImdwaW9feDFfYXVkX3B4MSIsCi0JImdwaW9feDNfYXVkX3B4MyIsCi0JImR2ZnNfY2xrX3B4MiIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c2Nsa19ncm91cHNbXSA9IHsKLQkic3lzX2Nsa19yZXFfcHo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHJhY2VfZ3JvdXBzW10gPSB7Ci0JImdtaV9pb3JkeV9waTUiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9hMTZfcGo3IiwKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9hMTlfcGs3IiwKLQkiZ21pX2Rxc19wX3BqMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRhX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jMV93cF9uX3B2MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRiX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Y19ncm91cHNbXSA9IHsKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0ZF9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkiZ21pX2ExNl9wajciLAotCSJnbWlfYTE3X3BiMCIsCi0JImdtaV9hMThfcGIxIiwKLQkiZ21pX2ExOV9wazciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1bHBpX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiX2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdTYiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImtiX2NvbDBfcHEwIiwKLQkic3BkaWZfaW5fcGs2IiwKLQkidXNiX3ZidXNfZW4wX3BuNCIsCi0JInVzYl92YnVzX2VuMV9wbjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AxX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NjbF9wYmIxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMl9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDNfZ3JvdXBzW10gPSB7Ci0JInBiYjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A0X2dyb3Vwc1tdID0gewotCSJwYmI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNV9ncm91cHNbXSA9IHsKLQkicGJiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDZfZ3JvdXBzW10gPSB7Ci0JInBiYjYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi0JInBiYjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQxX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLQkicGJiMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2FsdDNfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJwYmIwIiwKLX07Ci0KICNkZWZpbmUgRlVOQ1RJT04oZm5hbWUpCQkJCQlcCiAJewkJCQkJCVwKIAkJLm5hbWUgPSAjZm5hbWUsCQkJCVwKLQkJLmdyb3VwcyA9IGZuYW1lIyNfZ3JvdXBzLAkJXAotCQkubmdyb3VwcyA9IEFSUkFZX1NJWkUoZm5hbWUjI19ncm91cHMpLAlcCiAJfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICB0ZWdyYTExNF9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmExMTRfZnVuY3Rpb25zW10gPSB7CiAJRlVOQ1RJT04oYmxpbmspLAogCUZVTkNUSU9OKGNlYyksCiAJRlVOQ1RJT04oY2xkdmZzKSwKKwlGVU5DVElPTihjbGspLAogCUZVTkNUSU9OKGNsazEyKSwKIAlGVU5DVElPTihjcHUpLAogCUZVTkNUSU9OKGRhcCksCkBAIC0yNDA3LDYgKzE1MTIsNyBAQAogCUZVTkNUSU9OKHJzdmQyKSwKIAlGVU5DVElPTihyc3ZkMyksCiAJRlVOQ1RJT04ocnN2ZDQpLAorCUZVTkNUSU9OKHJ0Y2spLAogCUZVTkNUSU9OKHNkbW1jMSksCiAJRlVOQ1RJT04oc2RtbWMyKSwKIAlGVU5DVElPTihzZG1tYzMpLApAQCAtMjQzOCwxMSArMTU0NCwxMSBAQAogCUZVTkNUSU9OKHZpX2FsdDMpLAogfTsKIAotI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX1NUQVJUCQkJMHg4NjgJLyogYmFuayAwICovCi0jZGVmaW5lIFBJTkdST1VQX1JFR19TVEFSVAkJCTB4MzAwMAkvKiBiYW5rIDEgKi8KKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCQkweDg2OAkvKiBiYW5rIDAgKi8KKyNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCQkweDMwMDAJLyogYmFuayAxICovCiAKLSNkZWZpbmUgUElOR1JPVVBfUkVHX1kocikJCQkoKHIpIC0gUElOR1JPVVBfUkVHX1NUQVJUKQotI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQkJCS0xCisjZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpCQktMQogCiAjZGVmaW5lIFBJTkdST1VQKHBnX25hbWUsIGYwLCBmMSwgZjIsIGYzLCBmX3NhZmUsIHIsIG9kLCBpb3IsIHJjdl9zZWwpCVwKIAl7CQkJCQkJCQlcCkBAIC0yNDg0LDEzICsxNTkwLDE0IEBACiAJCS5kcnZ0eXBlX3JlZyA9IC0xLAkJCQkJXAogCX0KIAotI2RlZmluZSBEUlZfUElOR1JPVVBfRFZSVFlQRV9ZKHIpICgocikgLSBEUlZfUElOR1JPVVBfUkVHX1NUQVJUKQotI2RlZmluZSBEUlZfUElOR1JPVVBfRFZSVFlQRV9OKHIpIC0xCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfWShyKQkJKChyKSAtIERSVl9QSU5HUk9VUF9SRUdfQSkKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19OKHIpCQktMQorCiAKICNkZWZpbmUgRFJWX1BJTkdST1VQKHBnX25hbWUsIHIsIGhzbV9iLCBzY2htaXR0X2IsIGxwbWRfYiwJCVwKLQkJCWRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csCQlcCi0JCQlzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3csCQkJXAotCQkJZHJ2dHlwZSkJCQkJCVwKKwkJICAgICBkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LAkJXAorCQkgICAgIHNsd3JfYiwgc2x3cl93LCBzbHdmX2IsIHNsd2ZfdywJCQlcCisJCSAgICAgZHJ2dHlwZSkJCQkJCQlcCiAJewkJCQkJCQkJXAogCQkubmFtZSA9ICJkcml2ZV8iICNwZ19uYW1lLAkJCQlcCiAJCS5waW5zID0gZHJpdmVfIyNwZ19uYW1lIyNfcGlucywJCQkJXApAQCAtMjUwMyw3ICsxNjEwLDcgQEAKIAkJLmxvY2tfcmVnID0gLTEsCQkJCQkJXAogCQkuaW9yZXNldF9yZWcgPSAtMSwJCQkJCVwKIAkJLnJjdl9zZWxfcmVnID0gLTEsCQkJCQlcCi0JCS5kcnZfcmVnID0gRFJWX1BJTkdST1VQX0RWUlRZUEVfWShyKSwJCQlcCisJCS5kcnZfcmVnID0gRFJWX1BJTkdST1VQX1JFR19ZKHIpLAkJCVwKIAkJLmRydl9iYW5rID0gMCwJCQkJCQlcCiAJCS5oc21fYml0ID0gaHNtX2IsCQkJCQlcCiAJCS5zY2htaXR0X2JpdCA9IHNjaG1pdHRfYiwJCQkJXApAQCAtMjUxNiwxNCArMTYyMywxMyBAQAogCQkuc2x3cl93aWR0aCA9IHNsd3JfdywJCQkJCVwKIAkJLnNsd2ZfYml0ID0gc2x3Zl9iLAkJCQkJXAogCQkuc2x3Zl93aWR0aCA9IHNsd2ZfdywJCQkJCVwKLQkJLmRydnR5cGVfcmVnID0gRFJWX1BJTkdST1VQX0RWUlRZUEVfIyNkcnZ0eXBlKHIpLAlcCisJCS5kcnZ0eXBlX3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfIyNkcnZ0eXBlKHIpLAkJXAogCQkuZHJ2dHlwZV9iYW5rID0gMCwJCQkJCVwKIAkJLmRydnR5cGVfYml0ID0gNiwJCQkJCVwKIAl9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfcGluZ3JvdXAgdGVncmExMTRfZ3JvdXBzW10gPSB7CiAJLyogICAgICAgcGdfbmFtZSwgICAgICAgICAgICAgICAgZjAsICAgICAgICAgZjEsICAgICAgICAgZjIsICAgICAgICAgICBmMywgICAgICAgICAgc2FmZSwgICAgIHIsICAgICAgb2QsIGlvciwgcmN2X3NlbCAqLwotCS8qIEZJWE1FOiBGaWxsIGluIGNvcnJlY3QgZGF0YSBpbiBzYWZlIGNvbHVtbiAqLwogCVBJTkdST1VQKHVscGlfZGF0YTBfcG8xLCAgICAgICAgIFNQSTMsICAgICAgIEhTSSwgICAgICAgIFVBUlRBLCAgICAgICAgVUxQSSwgICAgICAgIFVMUEksICAgICAweDMwMDAsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHVscGlfZGF0YTFfcG8yLCAgICAgICAgIFNQSTMsICAgICAgIEhTSSwgICAgICAgIFVBUlRBLCAgICAgICAgVUxQSSwgICAgICAgIFVMUEksICAgICAweDMwMDQsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHVscGlfZGF0YTJfcG8zLCAgICAgICAgIFNQSTMsICAgICAgIEhTSSwgICAgICAgIFVBUlRBLCAgICAgICAgVUxQSSwgICAgICAgIFVMUEksICAgICAweDMwMDgsICBOLCAgTiwgIE4pLApAQCAtMjYzNSw2ICsxNzQxLDcgQEAKIAlQSU5HUk9VUChwYmI2LCAgICAgICAgICAgICAgICAgICBWR1A2LCAgICAgICBESVNQTEFZQSwgICBESVNQTEFZQiwgICAgIFJTVkQ0LCAgICAgICBSU1ZENCwgICAgMHgzMmE0LCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUChwYmI3LCAgICAgICAgICAgICAgICAgICBJMlM0LCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBSU1ZENCwgICAgMHgzMmE4LCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUChwY2MyLCAgICAgICAgICAgICAgICAgICBJMlM0LCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBSU1ZENCwgICAgMHgzMmFjLCAgTiwgIE4sICBOKSwKKwlQSU5HUk9VUChqdGFnX3J0Y2ssICAgICAgICAgICAgICBSVENLLCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBSVENLLCAgICAgMHgzMmIwLCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUChwd3JfaTJjX3NjbF9wejYsICAgICAgICBJMkNQV1IsICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBSU1ZENCwgICAgMHgzMmI0LCAgWSwgIE4sICBOKSwKIAlQSU5HUk9VUChwd3JfaTJjX3NkYV9wejcsICAgICAgICBJMkNQV1IsICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBSU1ZENCwgICAgMHgzMmI4LCAgWSwgIE4sICBOKSwKIAlQSU5HUk9VUChrYl9yb3cwX3ByMCwgICAgICAgICAgICBLQkMsICAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBSU1ZENCwgICAgMHgzMmJjLCAgTiwgIE4sICBOKSwKQEAgLTI2NjEsNiArMTc2OCw3IEBACiAJUElOR1JPVVAoY29yZV9wd3JfcmVxLCAgICAgICAgICAgUFdST04sICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzMyNCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAoY3B1X3B3cl9yZXEsICAgICAgICAgICAgQ1BVLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzMyOCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocHdyX2ludF9uLCAgICAgICAgICAgICAgUE1JLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzMyYywgIE4sICBOLCAgTiksCisJUElOR1JPVVAoY2xrXzMya19pbiwgICAgICAgICAgICAgQ0xLLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgQ0xLLCAgICAgIDB4MzMzMCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAob3dyLCAgICAgICAgICAgICAgICAgICAgT1dSLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzMzNCwgIE4sICBOLCAgWSksCiAJUElOR1JPVVAoZGFwMV9mc19wbjAsICAgICAgICAgICAgSTJTMCwgICAgICAgSERBLCAgICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzMzOCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAoZGFwMV9kaW5fcG4xLCAgICAgICAgICAgSTJTMCwgICAgICAgSERBLCAgICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzMzYywgIE4sICBOLCAgTiksCkBAIC0yNjk3LDM4ICsxODA1LDQ4IEBACiAJUElOR1JPVVAodXNiX3ZidXNfZW4xX3BuNSwgICAgICAgVVNCLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzNmOCwgIFksICBOLCAgTiksCiAJUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9pbl9wZWU1LCAgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzNmYywgIE4sICBOLCAgTiksCiAJUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9vdXRfcGVlNCwgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzQwMCwgIE4sICBOLCAgTiksCisJUElOR1JPVVAoZ21pX2Nsa19sYiwgICAgICAgICAgICAgU0RNTUMyLCAgICAgTkFORCwgICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgR01JLCAgICAgIDB4MzQwNCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocmVzZXRfb3V0X24sICAgICAgICAgICAgUlNWRDEsICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSRVNFVF9PVVRfTiwgUlNWRDMsICAgIDB4MzQwOCwgIE4sICBOLCAgTiksCiAKIAkvKiBwZ19uYW1lLCByLCBoc21fYiwgc2NobWl0dF9iLCBscG1kX2IsIGRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csIHNsd3JfYiwgc2x3cl93LCBzbHdmX2IsIHNsd2ZfdywgZHJ2dHlwZSAqLwotCURSVl9QSU5HUk9VUChhbzEsICAgMHg4NjgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoYW8yLCAgIDB4ODZjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGF0MSwgICAweDg3MCwgIDIsICAzLCAgNCwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAotCURSVl9QSU5HUk9VUChhdDIsICAgMHg4NzQsICAyLCAgMywgIDQsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKLQlEUlZfUElOR1JPVVAoYXQzLCAgIDB4ODc4LCAgMiwgIDMsICA0LCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCi0JRFJWX1BJTkdST1VQKGF0NCwgICAweDg3YywgIDIsICAzLCAgNCwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAotCURSVl9QSU5HUk9VUChhdDUsICAgMHg4ODAsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoY2RldjEsIDB4ODg0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGNkZXYyLCAweDg4OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChkYXAxLCAgMHg4OTAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGFwMiwgIDB4ODk0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGRhcDMsICAweDg5OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChkYXA0LCAgMHg4OWMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGJnLCAgIDB4OGEwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHNkaW8zLCAweDhiMCwgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChzcGksICAgMHg4YjQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAodWFhLCAgIDB4OGI4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVhYiwgICAweDhiYywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUCh1YXJ0MiwgMHg4YzAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAodWFydDMsIDB4OGM0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHNkaW8xLCAweDhlYywgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChkZGMsICAgMHg4ZmMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZ21hLCAgIDB4OTAwLCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCi0JRFJWX1BJTkdST1VQKGdtZSwgICAweDkxMCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChnbWYsICAgMHg5MTQsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZ21nLCAgIDB4OTE4LCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGdtaCwgICAweDkxYywgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChvd3IsICAgMHg5MjAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAodWRhLCAgIDB4OTI0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGFvMSwgICAgICAgICAweDg2OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChhbzIsICAgICAgICAgMHg4NmMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYXQxLCAgICAgICAgIDB4ODcwLCAgMiwgIDMsIC0xLCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCisJRFJWX1BJTkdST1VQKGF0MiwgICAgICAgICAweDg3NCwgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAorCURSVl9QSU5HUk9VUChhdDMsICAgICAgICAgMHg4NzgsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKKwlEUlZfUElOR1JPVVAoYXQ0LCAgICAgICAgIDB4ODdjLCAgMiwgIDMsIC0xLCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCisJRFJWX1BJTkdST1VQKGF0NSwgICAgICAgICAweDg4MCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChjZGV2MSwgICAgICAgMHg4ODQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoY2RldjIsICAgICAgIDB4ODg4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRhcDEsICAgICAgICAweDg5MCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkYXAyLCAgICAgICAgMHg4OTQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZGFwMywgICAgICAgIDB4ODk4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRhcDQsICAgICAgICAweDg5YywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkYmcsICAgICAgICAgMHg4YTAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoc2RpbzMsICAgICAgIDB4OGIwLCAgMiwgIDMsIC0xLCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHNwaSwgICAgICAgICAweDhiNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1YWEsICAgICAgICAgMHg4YjgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWFiLCAgICAgICAgIDB4OGJjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHVhcnQyLCAgICAgICAweDhjMCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1YXJ0MywgICAgICAgMHg4YzQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoc2RpbzEsICAgICAgIDB4OGVjLCAgMiwgIDMsIC0xLCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRkYywgICAgICAgICAweDhmYywgIDIsICAzLCAtMSwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChnbWEsICAgICAgICAgMHg5MDAsICAyLCAgMywgLTEsICAxNCwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZ21lLCAgICAgICAgIDB4OTEwLCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGdtZiwgICAgICAgICAweDkxNCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChnbWcsICAgICAgICAgMHg5MTgsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZ21oLCAgICAgICAgIDB4OTFjLCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKG93ciwgICAgICAgICAweDkyMCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1ZGEsICAgICAgICAgMHg5MjQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZGV2MywgICAgICAgIDB4OTJjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGNlYywgICAgICAgICAweDkzOCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChhdDYsICAgICAgICAgMHg5OTQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKKwlEUlZfUElOR1JPVVAoZGFwNSwgICAgICAgIDB4OTk4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHVzYl92YnVzX2VuLCAweDk5YywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChhbzMsICAgICAgICAgMHg5YTAsICAyLCAgMywgIDQsICAxMiwgIDUsICAtMSwgLTEsICAyOCwgIDIsICAtMSwgLTEsICBOKSwKKwlEUlZfUElOR1JPVVAoaHYwLCAgICAgICAgIDB4OWE0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgLTEsIC0xLCAgMjgsICAyLCAgLTEsIC0xLCAgTiksCisJRFJWX1BJTkdST1VQKHNkaW80LCAgICAgICAweDlhOCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChhbzAsICAgICAgICAgMHg5YWMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfcGluY3RybF9zb2NfZGF0YSB0ZWdyYTExNF9waW5jdHJsID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMjQuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTI0LmMKaW5kZXggYzIwZTBlMS4uNzM3NzM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMjQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTEyNC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFBpbmN0cmwgZGF0YSBmb3IgdGhlIE5WSURJQSBUZWdyYTEyNCBwaW5tdXgKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE5WSURJQSBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgTlZJRElBIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTIxMiw4ICsyMTIsOCBAQAogI2RlZmluZSBURUdSQV9QSU5fUEZGMgkJCQlfR1BJTygyNTApCiAKIC8qIEFsbCBub24tR1BJTyBwaW5zIGZvbGxvdyAqLwotI2RlZmluZSBOVU1fR1BJT1MJKFRFR1JBX1BJTl9QRkYyICsgMSkKLSNkZWZpbmUgX1BJTihvZmZzZXQpCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKKyNkZWZpbmUgTlVNX0dQSU9TCQkJCShURUdSQV9QSU5fUEZGMiArIDEpCisjZGVmaW5lIF9QSU4ob2Zmc2V0KQkJCQkoTlVNX0dQSU9TICsgKG9mZnNldCkpCiAKIC8qIE5vbi1HUElPIHBpbnMgKi8KICNkZWZpbmUgVEVHUkFfUElOX0NPUkVfUFdSX1JFUQkJCV9QSU4oMCkKQEAgLTMyNSwxMyArMzI1LDEzIEBACiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzhfUFMwLCAiS0JfUk9XOCBQUzAiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XOV9QUzEsICJLQl9ST1c5IFBTMSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxMF9QUzIsICJLQl9ST1cxMCBQUzIiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTFfUFMzLCAiS0JfUk9XMTAgUFMzIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzEyX1BTNCwgIktCX1JPVzEwIFBTNCIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxM19QUzUsICJLQl9ST1cxMCBQUzUiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTRfUFM2LCAiS0JfUk9XMTAgUFM2IiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE1X1BTNywgIktCX1JPVzEwIFBTNyIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxNl9QVDAsICJLQl9ST1cxMCBQVDAiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTdfUFQxLCAiS0JfUk9XMTAgUFQxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzExX1BTMywgIktCX1JPVzExIFBTMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxMl9QUzQsICJLQl9ST1cxMiBQUzQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTNfUFM1LCAiS0JfUk9XMTMgUFM1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE0X1BTNiwgIktCX1JPVzE0IFBTNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxNV9QUzcsICJLQl9ST1cxNSBQUzciKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTZfUFQwLCAiS0JfUk9XMTYgUFQwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE3X1BUMSwgIktCX1JPVzE3IFBUMSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HRU4yX0kyQ19TQ0xfUFQ1LCAiR0VOMl9JMkNfU0NMIFBUNSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HRU4yX0kyQ19TREFfUFQ2LCAiR0VOMl9JMkNfU0RBIFBUNiIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzRfQ01EX1BUNywgIlNETU1DNF9DTUQgUFQ3IiksCkBAIC00MDYsMTYgKzQwNiwxNiBAQAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9IRE1JX0NFQ19QRUUzLCAiSERNSV9DRUMgUEVFMyIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzNfQ0xLX0xCX09VVF9QRUU0LCAiU0RNTUMzX0NMS19MQl9PVVQgUEVFNCIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzNfQ0xLX0xCX0lOX1BFRTUsICJTRE1NQzNfQ0xLX0xCX0lOIFBFRTUiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ09SRV9QV1JfUkVRLCAiQ09SRV9QV1JfUkVRIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NQVV9QV1JfUkVRLCAiQ1BVX1BXUl9SRVEiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fT1dSLCAiT1dSIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BXUl9JTlRfTiwgIlBXUl9JTlRfTiIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9SRVNFVF9PVVRfTiwgIlJFU0VUX09VVF9OIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RQX0hQRF9QRkYwLCAiRFBfSFBEIFBGRjAiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fVVNCX1ZCVVNfRU4yX1BGRjEsICJVU0JfVkJVU19FTjIgUEZGMSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QRkYyLCAiUEZGMiIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DTEtfMzJLX0lOLCAiQ0xLXzMyS19JTiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEsICJDT1JFX1BXUl9SRVEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ1BVX1BXUl9SRVEsICJDUFVfUFdSX1JFUSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QV1JfSU5UX04sICJQV1JfSU5UX04iKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fR01JX0NMS19MQiwgIkdNSV9DTEtfTEIiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUkVTRVRfT1VUX04sICJSRVNFVF9PVVRfTiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9PV1IsICJPV1IiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19JTiwgIkNMS18zMktfSU4iKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fSlRBR19SVENLLCAiSlRBR19SVENLIiksCiB9OwogCkBAIC0xMTM4LDYgKzExMzgsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkbW1jM19jbGtfbGJfaW5fcGVlNV9waW5zW10gPSB7CiAJVEVHUkFfUElOX1NETU1DM19DTEtfTEJfSU5fUEVFNSwKIH07CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcF9ocGRfcGZmMF9waW5zW10gPSB7CiAJVEVHUkFfUElOX0RQX0hQRF9QRkYwLAogfTsKQEAgLTExNTgsMjQgKzExNTksMjQgQEAKIAlURUdSQV9QSU5fQ1BVX1BXUl9SRVEsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgb3dyX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fT1dSLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHB3cl9pbnRfbl9waW5zW10gPSB7CiAJVEVHUkFfUElOX1BXUl9JTlRfTiwKIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnbWlfY2xrX2xiX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR01JX0NMS19MQiwKK307CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCByZXNldF9vdXRfbl9waW5zW10gPSB7CiAJVEVHUkFfUElOX1JFU0VUX09VVF9OLAogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNsa18zMmtfaW5fcGluc1tdID0gewotCVRFR1JBX1BJTl9DTEtfMzJLX0lOLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIG93cl9waW5zW10gPSB7CisJVEVHUkFfUElOX09XUiwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBnbWlfY2xrX2xiX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fR01JX0NMS19MQiwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjbGtfMzJrX2luX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0xLXzMyS19JTiwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBqdGFnX3J0Y2tfcGluc1tdID0gewpAQCAtMTQ0MSwxNSArMTQ0MiwxNSBAQAogCVRFR1JBX1BJTl9QRkYyLAogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2NlY19waW5zW10gPSB7Ci0JVEVHUkFfUElOX0hETUlfQ0VDX1BFRTMsCi19OwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfZGV2M19waW5zW10gPSB7CiAJVEVHUkFfUElOX0NMSzNfT1VUX1BFRTAsCiAJVEVHUkFfUElOX0NMSzNfUkVRX1BFRTEsCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfY2VjX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fSERNSV9DRUNfUEVFMywKK307CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9hdDZfcGluc1tdID0gewogCVRFR1JBX1BJTl9QSzEsCiAJVEVHUkFfUElOX1BLMywKQEAgLTE0OTYsOCArMTQ5NywxMCBAQAogCiBlbnVtIHRlZ3JhX211eCB7CiAJVEVHUkFfTVVYX0JMSU5LLAorCVRFR1JBX01VWF9DQ0xBLAogCVRFR1JBX01VWF9DRUMsCiAJVEVHUkFfTVVYX0NMRFZGUywKKwlURUdSQV9NVVhfQ0xLLAogCVRFR1JBX01VWF9DTEsxMiwKIAlURUdSQV9NVVhfQ1BVLAogCVRFR1JBX01VWF9EQVAsCkBAIC0xNTA3LDYgKzE1MTAsNyBAQAogCVRFR1JBX01VWF9ESVNQTEFZQSwKIAlURUdSQV9NVVhfRElTUExBWUFfQUxULAogCVRFR1JBX01VWF9ESVNQTEFZQiwKKwlURUdSQV9NVVhfRFAsCiAJVEVHUkFfTVVYX0RUViwKIAlURUdSQV9NVVhfRVhUUEVSSVBIMSwKIAlURUdSQV9NVVhfRVhUUEVSSVBIMiwKQEAgLTE1MjgsNiArMTUzMiw5IEBACiAJVEVHUkFfTVVYX0lSREEsCiAJVEVHUkFfTVVYX0tCQywKIAlURUdSQV9NVVhfT1dSLAorCVRFR1JBX01VWF9QRSwKKwlURUdSQV9NVVhfUEUwLAorCVRFR1JBX01VWF9QRTEsCiAJVEVHUkFfTVVYX1BNSSwKIAlURUdSQV9NVVhfUFdNMCwKIAlURUdSQV9NVVhfUFdNMSwKQEAgLTE1MzksNiArMTU0Niw4IEBACiAJVEVHUkFfTVVYX1JTVkQyLAogCVRFR1JBX01VWF9SU1ZEMywKIAlURUdSQV9NVVhfUlNWRDQsCisJVEVHUkFfTVVYX1JUQ0ssCisJVEVHUkFfTVVYX1NBVEEsCiAJVEVHUkFfTVVYX1NETU1DMSwKIAlURUdSQV9NVVhfU0RNTUMyLAogCVRFR1JBX01VWF9TRE1NQzMsCkBAIC0xNTUxLDYgKzE1NjAsOCBAQAogCVRFR1JBX01VWF9TUEk0LAogCVRFR1JBX01VWF9TUEk1LAogCVRFR1JBX01VWF9TUEk2LAorCVRFR1JBX01VWF9TWVMsCisJVEVHUkFfTVVYX1RNRFMsCiAJVEVHUkFfTVVYX1RSQUNFLAogCVRFR1JBX01VWF9VQVJUQSwKIAlURUdSQV9NVVhfVUFSVEIsCkBAIC0xNTY5LDExMzQgKzE1ODAsMTkgQEAKIAlURUdSQV9NVVhfVklfQUxUMywKIAlURUdSQV9NVVhfVklNQ0xLMiwKIAlURUdSQV9NVVhfVklNQ0xLMl9BTFQsCi0JVEVHUkFfTVVYX1NBVEEsCi0JVEVHUkFfTVVYX0NDTEEsCi0JVEVHUkFfTVVYX1BFMCwKLQlURUdSQV9NVVhfUEUsCi0JVEVHUkFfTVVYX1BFMSwKLQlURUdSQV9NVVhfRFAsCi0JVEVHUkFfTVVYX1JUQ0ssCi0JVEVHUkFfTVVYX1NZUywKLQlURUdSQV9NVVhfQ0xLLAotCVRFR1JBX01VWF9UTURTLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibGlua19ncm91cHNbXSA9IHsKLQkiY2xrXzMya19vdXRfcGEwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2VjX2dyb3Vwc1tdID0gewotCSJoZG1pX2NlY19wZWUzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xkdmZzX2dyb3Vwc1tdID0gewotCSJwaDIiLAotCSJwaDMiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkiZHZmc19wd21fcHgwIiwKLQkiZHZmc19jbGtfcHgyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xrMTJfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV93cF9uX3B2MyIsCi0JInNkbW1jMV9jbGtfcHowIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3B1X2dyb3Vwc1tdID0gewotCSJjcHVfcHdyX3JlcSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcF9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3BlZTIiLAotCSJjbGsyX3JlcV9wY2M1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwMV9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3BlZTIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXAyX2dyb3Vwc1tdID0gewotCSJkYXBfbWNsazFfcHc0IiwKLQkiZ3Bpb194NF9hdWRfcHg0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGV2M19ncm91cHNbXSA9IHsKLQkiY2xrM19yZXFfcGVlMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJwaDEiLAotCSJwaTQiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX2NvbDNfcHEzIiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGlzcGxheWFfYWx0X2dyb3Vwc1tdID0gewotCSJrYl9yb3c2X3ByNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXliX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfc2Nsa19wcDMiLAotCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0KLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI2IiwKLQotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0KLQkic2RtbWMzX2RhdDNfcGI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHR2X2dyb3Vwc1tdID0gewotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJwaTciLAotCSJwaDAiLAotCSJwaDYiLAotCSJwaDciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgxX2dyb3Vwc1tdID0gewotCSJkYXBfbWNsazFfcHc0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMl9ncm91cHNbXSA9IHsKLQkiY2xrMl9vdXRfcHc1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoM19ncm91cHNbXSA9IHsKLQkiY2xrM19vdXRfcGVlMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0KLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0KLQkicGM3IiwKLQotCSJwZzAiLAotCSJwZzEiLAotCSJwZzIiLAotCSJwZzMiLAotCSJwZzQiLAotCSJwZzUiLAotCSJwZzYiLAotCSJwZzciLAotCi0JInBoMCIsCi0JInBoMSIsCi0JInBoMiIsCi0JInBoMyIsCi0JInBoNCIsCi0JInBoNSIsCi0JInBoNiIsCi0JInBoNyIsCi0KLQkicGkwIiwKLQkicGkxIiwKLQkicGkyIiwKLQkicGkzIiwKLQkicGk0IiwKLQkicGk1IiwKLQkicGk2IiwKLQkicGk3IiwKLQotCSJwajAiLAotCSJwajIiLAotCi0JInBrMCIsCi0JInBrMSIsCi0JInBrMiIsCi0JInBrMyIsCi0JInBrNCIsCi0KLQkicGo3IiwKLQkicGIwIiwKLQkicGIxIiwKLQkicGs3IiwKLQotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0KLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkiZ21pX2Nsa19sYiIsCi0KLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0KLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0KLQkiZHZmc19wd21fcHgwIiwKLQkiZHZmc19jbGtfcHgyIiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQkiZ3Bpb194NF9hdWRfcHg0IiwKLQkiZ3Bpb194NV9hdWRfcHg1IiwKLQkiZ3Bpb194Nl9hdWRfcHg2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2FsdF9ncm91cHNbXSA9IHsKLQkicGM3IiwKLQkicGs0IiwKLQkicGo3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRhX2dyb3Vwc1tdID0gewotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX3NjbGtfcG4zIiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhzaV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzFfZ3JvdXBzW10gPSB7Ci0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkiZ3Bpb193Ml9hdWRfcHcyIiwKLQkiZ3Bpb193M19hdWRfcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMl9ncm91cHNbXSA9IHsKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMzX2dyb3Vwc1tdID0gewotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmM0X2dyb3Vwc1tdID0gewotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjcHdyX2dyb3Vwc1tdID0gewotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMwX2dyb3Vwc1tdID0gewotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX3NjbGtfcG4zIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMV9ncm91cHNbXSA9IHsKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczJfZ3JvdXBzW10gPSB7Ci0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMzX2dyb3Vwc1tdID0gewotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X3NjbGtfcHA3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzNF9ncm91cHNbXSA9IHsKLQkicGNjMSIsCi0JInBiYjYiLAotCSJwYmI3IiwKLQkicGNjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlyZGFfZ3JvdXBzW10gPSB7Ci0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkia2Jfcm93MTFfcHMzIiwKLQkia2Jfcm93MTJfcHM0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2JjX2dyb3Vwc1tdID0gewotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX3JvdzE2X3B0MCIsCi0JImtiX3JvdzE3X3B0MSIsCi0KLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sM19wcTMiLAotCSJrYl9jb2w0X3BxNCIsCi0JImtiX2NvbDVfcHE1IiwKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG93cl9ncm91cHNbXSA9IHsKLQkicHUwIiwKLQkia2JfY29sNF9wcTQiLAotCSJvd3IiLAotCSJzZG1tYzNfY2Rfbl9wdjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbWlfZ3JvdXBzW10gPSB7Ci0JInB3cl9pbnRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTBfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInB1MyIsCi0JInBoMCIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTFfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInB1NCIsCi0JInBoMSIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTJfZ3JvdXBzW10gPSB7Ci0JInB1NSIsCi0JInBoMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtM19ncm91cHNbXSA9IHsKLQkicHU2IiwKLQkicGgzIiwKLQkic2RtbWMzX2NtZF9wYTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3Jvbl9ncm91cHNbXSA9IHsKLQkiY29yZV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVzZXRfb3V0X25fZ3JvdXBzW10gPSB7Ci0JInJlc2V0X291dF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDFfZ3JvdXBzW10gPSB7Ci0JInB2MCIsCi0JInB2MSIsCi0KLQkiaGRtaV9pbnRfcG43IiwKLQkicHUxIiwKLQkicHUyIiwKLQkicGM3IiwKLQkicGk3IiwKLQkicGswIiwKLQkicGowIiwKLQkicGoyIiwKLQkicGsyIiwKLQkicGkzIiwKLQkicGk2IiwKLQotCSJwZzAiLAotCSJwZzEiLAotCSJwZzIiLAotCSJwZzMiLAotCSJwZzQiLAotCSJwZzUiLAotCSJwZzYiLAotCSJwZzciLAotCi0JInBpMCIsCi0JInBpMSIsCi0KLQkiZ3Bpb194N19hdWRfcHg3IiwKLQotCSJyZXNldF9vdXRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQyX2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdjEiLAotCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0KLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCi0JImNsazJfb3V0X3BlZTAiLAotCSJjbGsyX3JlcV9wZWUxIiwKLQkicGM3IiwKLQkicGk1IiwKLQkicGowIiwKLQkicGoyIiwKLQotCSJwazQiLAotCSJwazIiLAotCSJwaTMiLAotCSJwaTYiLAotCSJwZzAiLAotCSJwZzEiLAotCSJwZzUiLAotCSJwZzYiLAotCSJwZzciLAotCi0JInBoNCIsCi0JInBoNSIsCi0JInBqNyIsCi0JInBiMCIsCi0JInBiMSIsCi0JInBrNyIsCi0JInBpMCIsCi0JInBpMSIsCi0KLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJwY2MxIiwKLQkicGJiNiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkianRhZ19ydGNrIiwKLQotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0KLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JInB3cl9pbnRfbiIsCi0JImNsa18zMmtfaW4iLAotCSJvd3IiLAotCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCi0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMF9jbGtyZXFfbl9wZGQyIiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicGV4X2wxX3JzdF9uX3BkZDUiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JImhkbWlfY2VjX3BlZTMiLAotCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi0JInNkbW1jM19jbGtfbGJfaW5fcGVlNSIsCi0JImdtaV9jbGtfbGIiLAotCSJyZXNldF9vdXRfbiIsCi0JImtiX3JvdzE2X3B0MCIsCi0JImtiX3JvdzE3X3B0MSIsCi0JImRwX2hwZF9wZmYwIiwKLQkidXNiX3ZidXNfZW4yX3BmZjEiLAotCSJwZmYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDNfZ3JvdXBzW10gPSB7Ci0JImRhcDNfc2Nsa19wcDMiLAotCSJwdjAiLAotCSJwdjEiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCi0JImRkY19zY2xfcHY0IiwKLQkiZGRjX3NkYV9wdjUiLAotCi0JInB1NiIsCi0KLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfc2Nsa19wcDciLAotCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkiZ3Bpb19wY2MxIiwKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotCSJwYmI1IiwKLQkicGJiNyIsCi0JImp0YWdfcnRjayIsCi0JInB3cl9pMmNfc2NsX3B6NiIsCi0JInB3cl9pMmNfc2RhX3B6NyIsCi0KLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93NF9wcjQiLAotCSJrYl9yb3c1X3ByNSIsCi0JImtiX3JvdzlfcHMxIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkia2Jfcm93MTFfcHMzIiwKLQkia2Jfcm93MTJfcHM0IiwKLQkia2Jfcm93MTVfcHM3IiwKLQotCSJjbGtfMzJrX291dF9wYTAiLAotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JInB3cl9pbnRfbiIsCi0JImNsa18zMmtfaW4iLAotCSJvd3IiLAotCi0JImRhcF9tY2xrMV9wdzQiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCi0JInBleF9sMF9yc3Rfbl9wZGQxIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0KLQkic2RtbWMzX2NkX25fcHYyIiwKLQkidXNiX3ZidXNfZW4wX3BuNCIsCi0JInVzYl92YnVzX2VuMV9wbjUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkicmVzZXRfb3V0X24iLAotCSJrYl9yb3cxNl9wdDAiLAotCSJrYl9yb3cxN19wdDEiLAotCSJkcF9ocGRfcGZmMCIsCi0JInVzYl92YnVzX2VuMl9wZmYxIiwKLQkicGZmMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQ0X2dyb3Vwc1tdID0gewotCSJkYXAzX2RvdXRfcHAyIiwKLQkicHYwIiwKLQkicHYxIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0KLQkicHUwIiwKLQkicHUxIiwKLQkicHUyIiwKLQotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0KLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0KLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCi0JInBpNSIsCi0JInBrMSIsCi0JInBrMiIsCi0JInBnMCIsCi0JInBnMSIsCi0JInBnMiIsCi0JInBnMyIsCi0JInBoNCIsCi0JInBoNSIsCi0JInBiMCIsCi0JInBiMSIsCi0JInBrNyIsCi0JInBpMCIsCi0JInBpMSIsCi0JInBpMiIsCi0KLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCi0JImp0YWdfcnRjayIsCi0JInB3cl9pMmNfc2NsX3B6NiIsCi0JInB3cl9pMmNfc2RhX3B6NyIsCi0KLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93MTNfcHM1IiwKLQkia2Jfcm93MTRfcHM2IiwKLQkia2Jfcm93MTVfcHM3IiwKLQotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2w1X3BxNSIsCi0KLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJjbGtfMzJrX2luIiwKLQkib3dyIiwKLQotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJkYXBfbWNsazFfcmVxX3BlZTIiLAotCSJkYXBfbWNsazFfcHc1IiwKLQotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQotCSJkdmZzX3B3bV9weDAiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDdfYXVkX3B4NyIsCi0KLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF93YWtlX25fcGRkMyIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wxX2Nsa3JlcV9uX3BkZDYiLAotCSJoZG1pX2NlY19wZWUzIiwKLQotCSJzZG1tYzNfY2Rfbl9wdjIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJnbWlfY2xrX2xiIiwKLQotCSJkcF9ocGRfcGZmMCIsCi0JInVzYl92YnVzX2VuMl9wZmYxIiwKLQkicGZmMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jMV9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYyIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInNkbW1jMV93cF9uX3B2MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jMl9ncm91cHNbXSA9IHsKLQkicGk1IiwKLQkicGsxIiwKLQkicGszIiwKLQkicGs0IiwKLQkicGk2IiwKLQkicGg0IiwKLQkicGg1IiwKLQkicGg2IiwKLQkicGg3IiwKLQkicGkyIiwKLQkiY2FtX21jbGtfcGNjMCIsCi0JInBjYzEiLAotCSJwYmIwIiwKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkicGJiNyIsCi0JInBjYzIiLAotCSJnbWlfY2xrX2xiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMzX2dyb3Vwc1tdID0gewotCSJwazAiLAotCSJwY2MyIiwKLQotCSJrYl9jb2w0X3BxNCIsCi0JImtiX2NvbDVfcHE1IiwKLQotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLQotCSJzZG1tYzNfY2Rfbl9wdjIiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWM0X2dyb3Vwc1tdID0gewotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc29jX2dyb3Vwc1tdID0gewotCSJwazAiLAotCSJwajIiLAotCSJrYl9yb3cxNV9wczciLAotCSJjbGtfMzJrX291dF9wYTAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRpZl9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkxX2dyb3Vwc1tdID0gewotCSJ1bHBpX2Nsa19weTAiLAotCSJ1bHBpX2Rpcl9weTEiLAotCSJ1bHBpX254dF9weTIiLAotCSJ1bHBpX3N0cF9weTMiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkyX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0KLQkia2Jfcm93MTNfcHM1IiwKLQkia2Jfcm93MTRfcHM2IiwKLQkia2Jfcm93MTVfcHM3IiwKLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi0JImdwaW9feDdfYXVkX3B4NyIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTNfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk0X2dyb3Vwc1tdID0gewotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0KLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0KLQkicGkzIiwKLQkicGc0IiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQkicGgzIiwKLQkicGk0IiwKLQkic2RtbWMxX3dwX25fcHYzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNV9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19zY2xrX3BwMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTZfZ3JvdXBzW10gPSB7Ci0JImR2ZnNfcHdtX3B4MCIsCi0JImdwaW9feDFfYXVkX3B4MSIsCi0JImdwaW9feDNfYXVkX3B4MyIsCi0JImR2ZnNfY2xrX3B4MiIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYWNlX2dyb3Vwc1tdID0gewotCSJwaTIiLAotCSJwaTQiLAotCSJwaTciLAotCSJwaDAiLAotCSJwaDYiLAotCSJwaDciLAotCSJwZzIiLAotCSJwZzMiLAotCSJwazEiLAotCSJwazMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0YV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0KLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCi0KLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0KLQkia2Jfcm93N19wcjciLAotCSJrYl9yb3c4X3BzMCIsCi0JImtiX3JvdzlfcHMxIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkia2JfY29sM19wcTMiLAotCSJrYl9jb2w0X3BxNCIsCi0KLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzFfd3Bfbl9wdjMiLAotCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRiX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Y19ncm91cHNbXSA9IHsKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJrYl9yb3cxNl9wdDAiLAotCSJrbl9yb3cxN19wdDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0ZF9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkicGo3IiwKLQkicGIwIiwKLQkicGIxIiwKLQkicGs3IiwKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVscGlfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotCSJ1bHBpX2Nsa19weTAiLAotCSJ1bHBpX2Rpcl9weTEiLAotCSJ1bHBpX254dF9weTIiLAotCSJ1bHBpX3N0cF9weTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c2JfZ3JvdXBzW10gPSB7Ci0JInBqMCIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLQkidXNiX3ZidXNfZW4yX3BmZjEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AxX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NjbF9wYmIxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMl9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDNfZ3JvdXBzW10gPSB7Ci0JInBiYjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A0X2dyb3Vwc1tdID0gewotCSJwYmI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNV9ncm91cHNbXSA9IHsKLQkicGJiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDZfZ3JvdXBzW10gPSB7Ci0JInBiYjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2FsdDFfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQzX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmltY2xrMl9ncm91cHNbXSA9IHsKLQkicGJiMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpbWNsazJfYWx0X2dyb3Vwc1tdID0gewotCSJwYmIwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2F0YV9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3JlcV9wZWUyIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JInBmZjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2xhX2dyb3Vwc1tdID0gewotCSJwazMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydGNrX2dyb3Vwc1tdID0gewotCSJqdGFnX3J0Y2siLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZ3JvdXBzW10gPSB7Ci0JImtiX3JvdzNfcHIzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGUwX2dyb3Vwc1tdID0gewotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMF9jbGtyZXFfbl9wZGQyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGVfZ3JvdXBzW10gPSB7Ci0JInBleF93YWtlX25fcGRkMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlMV9ncm91cHNbXSA9IHsKLQkicGV4X2wxX3JzdF9uX3BkZDUiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRwX2dyb3Vwc1tdID0gewotCSJkcF9ocGRfcGZmMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsa19ncm91cHNbXSA9IHsKLQkiY2xrXzMya19pbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRtZHNfZ3JvdXBzW10gPSB7Ci0JInBnNCIsCi0JInBoMSIsCi0JInBoMiIsCiB9OwogCiAjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCi0JCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKLQkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAogCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTEyNF9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmExMjRfZnVuY3Rpb25zW10gPSB7CiAJRlVOQ1RJT04oYmxpbmspLAorCUZVTkNUSU9OKGNjbGEpLAogCUZVTkNUSU9OKGNlYyksCiAJRlVOQ1RJT04oY2xkdmZzKSwKKwlGVU5DVElPTihjbGspLAogCUZVTkNUSU9OKGNsazEyKSwKIAlGVU5DVElPTihjcHUpLAogCUZVTkNUSU9OKGRhcCksCkBAIC0yNzA2LDYgKzE2MDIsNyBAQAogCUZVTkNUSU9OKGRpc3BsYXlhKSwKIAlGVU5DVElPTihkaXNwbGF5YV9hbHQpLAogCUZVTkNUSU9OKGRpc3BsYXliKSwKKwlGVU5DVElPTihkcCksCiAJRlVOQ1RJT04oZHR2KSwKIAlGVU5DVElPTihleHRwZXJpcGgxKSwKIAlGVU5DVElPTihleHRwZXJpcGgyKSwKQEAgLTI3MjcsNiArMTYyNCw5IEBACiAJRlVOQ1RJT04oaXJkYSksCiAJRlVOQ1RJT04oa2JjKSwKIAlGVU5DVElPTihvd3IpLAorCUZVTkNUSU9OKHBlKSwKKwlGVU5DVElPTihwZTApLAorCUZVTkNUSU9OKHBlMSksCiAJRlVOQ1RJT04ocG1pKSwKIAlGVU5DVElPTihwd20wKSwKIAlGVU5DVElPTihwd20xKSwKQEAgLTI3MzgsNiArMTYzOCw4IEBACiAJRlVOQ1RJT04ocnN2ZDIpLAogCUZVTkNUSU9OKHJzdmQzKSwKIAlGVU5DVElPTihyc3ZkNCksCisJRlVOQ1RJT04ocnRjayksCisJRlVOQ1RJT04oc2F0YSksCiAJRlVOQ1RJT04oc2RtbWMxKSwKIAlGVU5DVElPTihzZG1tYzIpLAogCUZVTkNUSU9OKHNkbW1jMyksCkBAIC0yNzUwLDYgKzE2NTIsOCBAQAogCUZVTkNUSU9OKHNwaTQpLAogCUZVTkNUSU9OKHNwaTUpLAogCUZVTkNUSU9OKHNwaTYpLAorCUZVTkNUSU9OKHN5cyksCisJRlVOQ1RJT04odG1kcyksCiAJRlVOQ1RJT04odHJhY2UpLAogCUZVTkNUSU9OKHVhcnRhKSwKIAlGVU5DVElPTih1YXJ0YiksCkBAIC0yNzY4LDIzICsxNjcyLDEzIEBACiAJRlVOQ1RJT04odmlfYWx0MyksCiAJRlVOQ1RJT04odmltY2xrMiksCiAJRlVOQ1RJT04odmltY2xrMl9hbHQpLAotCUZVTkNUSU9OKHNhdGEpLAotCUZVTkNUSU9OKGNjbGEpLAotCUZVTkNUSU9OKHBlMCksCi0JRlVOQ1RJT04ocGUpLAotCUZVTkNUSU9OKHBlMSksCi0JRlVOQ1RJT04oZHApLAotCUZVTkNUSU9OKHJ0Y2spLAotCUZVTkNUSU9OKHN5cyksCi0JRlVOQ1RJT04oY2xrKSwKLQlGVU5DVElPTih0bWRzKSwKIH07CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCTB4ODY4CS8qIGJhbmsgMCAqLwotI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJMHgzMDAwCS8qIGJhbmsgMSAqLworI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX0EJCTB4ODY4CS8qIGJhbmsgMCAqLworI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJCTB4MzAwMAkvKiBiYW5rIDEgKi8KIAotI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKQkoKHIpIC0gUElOR1JPVVBfUkVHX0EpCi0jZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpCS0xCisjZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpCQktMQogCiAjZGVmaW5lIFBJTkdST1VQKHBnX25hbWUsIGYwLCBmMSwgZjIsIGYzLCBmX3NhZmUsIHIsIG9kLCBpb3IsIHJjdl9zZWwpCVwKIAl7CQkJCQkJCQlcCkBAIC0yNzkyLDEyICsxNjg2LDEyIEBACiAJCS5waW5zID0gcGdfbmFtZSMjX3BpbnMsCQkJCQlcCiAJCS5ucGlucyA9IEFSUkFZX1NJWkUocGdfbmFtZSMjX3BpbnMpLAkJCVwKIAkJLmZ1bmNzID0gewkJCQkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjAsCQkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjEsCQkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjIsCQkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjMsCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YwLAkJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjEsCQkJCQlcCisJCQlURUdSQV9NVVhfIyNmMiwJCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YzLAkJCQkJXAogCQl9LAkJCQkJCQlcCi0JCS5mdW5jX3NhZmUgPSBURUdSQV9NVVhfICMjIGZfc2FmZSwJCQlcCisJCS5mdW5jX3NhZmUgPSBURUdSQV9NVVhfIyNmX3NhZmUsCQkJXAogCQkubXV4X3JlZyA9IFBJTkdST1VQX1JFR19ZKHIpLAkJCQlcCiAJCS5tdXhfYmFuayA9IDEsCQkJCQkJXAogCQkubXV4X2JpdCA9IDAsCQkJCQkJXApAQCAtMjgyNiw4ICsxNzIwLDkgQEAKIAkJLmRydnR5cGVfcmVnID0gLTEsCQkJCQlcCiAJfQogCi0jZGVmaW5lIERSVl9QSU5HUk9VUF9EVlJUWVBFX1kocikgKChyKSAtIERSVl9QSU5HUk9VUF9SRUdfQSkKLSNkZWZpbmUgRFJWX1BJTkdST1VQX0RWUlRZUEVfTihyKSAtMQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX1kocikJCSgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfTihyKQkJLTEKKwogCiAjZGVmaW5lIERSVl9QSU5HUk9VUChwZ19uYW1lLCByLCBoc21fYiwgc2NobWl0dF9iLCBscG1kX2IsCQlcCiAJCSAgICAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywJCVwKQEAgLTI4NDUsNyArMTc0MCw3IEBACiAJCS5sb2NrX3JlZyA9IC0xLAkJCQkJCVwKIAkJLmlvcmVzZXRfcmVnID0gLTEsCQkJCQlcCiAJCS5yY3Zfc2VsX3JlZyA9IC0xLAkJCQkJXAotCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9EVlJUWVBFX1kociksCQkJXAorCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfWShyKSwJCQlcCiAJCS5kcnZfYmFuayA9IDAsCQkJCQkJXAogCQkuaHNtX2JpdCA9IGhzbV9iLAkJCQkJXAogCQkuc2NobWl0dF9iaXQgPSBzY2htaXR0X2IsCQkJCVwKQEAgLTI4NTgsNyArMTc1Myw3IEBACiAJCS5zbHdyX3dpZHRoID0gc2x3cl93LAkJCQkJXAogCQkuc2x3Zl9iaXQgPSBzbHdmX2IsCQkJCQlcCiAJCS5zbHdmX3dpZHRoID0gc2x3Zl93LAkJCQkJXAotCQkuZHJ2dHlwZV9yZWcgPSBEUlZfUElOR1JPVVBfRFZSVFlQRV8jI2RydnR5cGUociksCVwKKwkJLmRydnR5cGVfcmVnID0gRFJWX1BJTkdST1VQX1JFR18jI2RydnR5cGUociksCQlcCiAJCS5kcnZ0eXBlX2JhbmsgPSAwLAkJCQkJXAogCQkuZHJ2dHlwZV9iaXQgPSA2LAkJCQkJXAogCX0KQEAgLTI5MDksOCArMTgwNCw4IEBACiAgICAgICAgUElOR1JPVVAocHU0LCAgICAgICAgICAgICAgICAgICAgUFdNMSwgICAgICAgVUFSVEEsICAgICAgR01JLCAgICAgICAgICBESVNQTEFZQiwgICAgUFdNMSwgICAgICAgMHgzMTk0LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChwdTUsICAgICAgICAgICAgICAgICAgICBQV00yLCAgICAgICBVQVJUQSwgICAgICBHTUksICAgICAgICAgIERJU1BMQVlCLCAgICBQV00yLCAgICAgICAweDMxOTgsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHB1NiwgICAgICAgICAgICAgICAgICAgIFBXTTMsICAgICAgIFVBUlRBLCAgICAgIFJTVkQzLCAgICAgICAgR01JLCAgICAgICAgIFJTVkQzLCAgICAgIDB4MzE5YywgIE4sICBOLCAgTiksCi0gICAgICAgUElOR1JPVVAoZ2VuMV9pMmNfc2NsX3BjNCwgICAgICAgSTJDMSwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgSTJDMSwgICAgICAgMHgzMWEwLCAgWSwgIE4sICBOKSwKLSAgICAgICBQSU5HUk9VUChnZW4xX2kyY19zZGFfcGM1LCAgICAgICBJMkMxLCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBJMkMxLCAgICAgICAweDMxYTQsICBZLCAgTiwgIE4pLAorICAgICAgIFBJTkdST1VQKGdlbjFfaTJjX3NkYV9wYzUsICAgICAgIEkyQzEsICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIEkyQzEsICAgICAgIDB4MzFhMCwgIFksICBOLCAgTiksCisgICAgICAgUElOR1JPVVAoZ2VuMV9pMmNfc2NsX3BjNCwgICAgICAgSTJDMSwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgSTJDMSwgICAgICAgMHgzMWE0LCAgWSwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChkYXA0X2ZzX3BwNCwgICAgICAgICAgICBJMlMzLCAgICAgICBHTUksICAgICAgICBEVFYsICAgICAgICAgIFJTVkQ0LCAgICAgICBJMlMzLCAgICAgICAweDMxYTgsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKGRhcDRfZGluX3BwNSwgICAgICAgICAgIEkyUzMsICAgICAgIEdNSSwgICAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIEkyUzMsICAgICAgIDB4MzFhYywgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoZGFwNF9kb3V0X3BwNiwgICAgICAgICAgSTJTMywgICAgICAgR01JLCAgICAgICAgRFRWLCAgICAgICAgICBSU1ZENCwgICAgICAgSTJTMywgICAgICAgMHgzMWIwLCAgTiwgIE4sICBOKSwKQEAgLTI5NjQsOSArMTg1OSw5IEBACiAgICAgICAgUElOR1JPVVAoc2RtbWM0X2RhdDRfcGFhNCwgICAgICAgU0RNTUM0LCAgICAgU1BJMywgICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgU0RNTUM0LCAgICAgMHgzMjcwLCAgTiwgIFksICBOKSwKICAgICAgICBQSU5HUk9VUChzZG1tYzRfZGF0NV9wYWE1LCAgICAgICBTRE1NQzQsICAgICBTUEkzLCAgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzQsICAgICAweDMyNzQsICBOLCAgWSwgIE4pLAogICAgICAgIFBJTkdST1VQKHNkbW1jNF9kYXQ2X3BhYTYsICAgICAgIFNETU1DNCwgICAgIFNQSTMsICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFNETU1DNCwgICAgIDB4MzI3OCwgIE4sICBZLCAgTiksCi0gICAgICAgUElOR1JPVVAoc2RtbWM0X2RhdDdfcGFhNywgICAgICAgU0RNTUM0LCAgICAgUlNWRDEsICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgU0RNTUM0LCAgICAgMHgzMjdjLCAgTiwgIFksICBOKSwKKyAgICAgICBQSU5HUk9VUChzZG1tYzRfZGF0N19wYWE3LCAgICAgICBTRE1NQzQsICAgICBSU1ZEMiwgICAgICBHTUksICAgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzQsICAgICAweDMyN2MsICBOLCAgWSwgIE4pLAogICAgICAgIFBJTkdST1VQKGNhbV9tY2xrX3BjYzAsICAgICAgICAgIFZJLCAgICAgICAgIFZJX0FMVDEsICAgIFZJX0FMVDMsICAgICAgU0RNTUMyLCAgICAgIFZJLCAgICAgICAgIDB4MzI4NCwgIE4sICBOLCAgTiksCi0gICAgICAgUElOR1JPVVAocGNjMSwgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDEsICAgICAgUlNWRDMsICAgICAgICBTRE1NQzIsICAgICAgSTJTNCwgICAgICAgMHgzMjg4LCAgTiwgIE4sICBOKSwKKyAgICAgICBQSU5HUk9VUChwY2MxLCAgICAgICAgICAgICAgICAgICBJMlM0LCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFNETU1DMiwgICAgICBJMlM0LCAgICAgICAweDMyODgsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHBiYjAsICAgICAgICAgICAgICAgICAgIFZHUDYsICAgICAgIFZJTUNMSzIsICAgIFNETU1DMiwgICAgICAgVklNQ0xLMl9BTFQsIFZHUDYsICAgICAgIDB4MzI4YywgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoY2FtX2kyY19zY2xfcGJiMSwgICAgICAgVkdQMSwgICAgICAgSTJDMywgICAgICAgUlNWRDMsICAgICAgICBTRE1NQzIsICAgICAgVkdQMSwgICAgICAgMHgzMjkwLCAgWSwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChjYW1faTJjX3NkYV9wYmIyLCAgICAgICBWR1AyLCAgICAgICBJMkMzLCAgICAgICBSU1ZEMywgICAgICAgIFNETU1DMiwgICAgICBWR1AyLCAgICAgICAweDMyOTQsICBZLCAgTiwgIE4pLApAQCAtMzA0Nyw4ICsxOTQyLDggQEAKICAgICAgICBQSU5HUk9VUChncGlvX3czX2F1ZF9wdzMsICAgICAgICBTUEk2LCAgICAgICBTUEkxLCAgICAgICBTUEkyLCAgICAgICAgIEkyQzEsICAgICAgICBTUEkxLCAgICAgICAweDMzZjAsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHVzYl92YnVzX2VuMF9wbjQsICAgICAgIFVTQiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFVTQiwgICAgICAgIDB4MzNmNCwgIFksICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAodXNiX3ZidXNfZW4xX3BuNSwgICAgICAgVVNCLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgVVNCLCAgICAgICAgMHgzM2Y4LCAgWSwgIE4sICBOKSwKLSAgICAgICBQSU5HUk9VUChzZG1tYzNfY2xrX2xiX291dF9wZWU0LCBTRE1NQzMsICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzMsICAgICAweDMzZmMsICBOLCAgTiwgIE4pLAotICAgICAgIFBJTkdST1VQKHNkbW1jM19jbGtfbGJfaW5fcGVlNSwgIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFNETU1DMywgICAgIDB4MzQwMCwgIE4sICBOLCAgTiksCisgICAgICAgUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9pbl9wZWU1LCAgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUMzLCAgICAgMHgzM2ZjLCAgTiwgIE4sICBOKSwKKyAgICAgICBQSU5HUk9VUChzZG1tYzNfY2xrX2xiX291dF9wZWU0LCBTRE1NQzMsICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzMsICAgICAweDM0MDAsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKGdtaV9jbGtfbGIsICAgICAgICAgICAgIFNETU1DMiwgICAgIFJTVkQyLCAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFNETU1DMiwgICAgIDB4MzQwNCwgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAocmVzZXRfb3V0X24sICAgICAgICAgICAgUlNWRDEsICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSRVNFVF9PVVRfTiwgUlNWRDEsICAgICAgMHgzNDA4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChrYl9yb3cxNl9wdDAsICAgICAgICAgICBLQkMsICAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFVBUlRDLCAgICAgICBLQkMsICAgICAgICAweDM0MGMsICBOLCAgTiwgIE4pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEyMC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEyMC5jCmluZGV4IGZjZmI3ZDAuLmUwYjUwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTIwLmMKQEAgLTE4OTQsNjM3ICsxODk0LDEyIEBACiAJVEVHUkFfTVVYX1hJTywKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWhiX2Nsa19ncm91cHNbXSA9IHsKLQkiY2RldjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhcGJfY2xrX2dyb3Vwc1tdID0gewotCSJjZGV2MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX3N5bmNfZ3JvdXBzW10gPSB7Ci0JImNkZXYxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3J0X2dyb3Vwc1tdID0gewotCSJjcnRwIiwKLQkibG0xIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwMV9ncm91cHNbXSA9IHsKLQkiZGFwMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDJfZ3JvdXBzW10gPSB7Ci0JImRhcDIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXAzX2dyb3Vwc1tdID0gewotCSJkYXAzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwNF9ncm91cHNbXSA9IHsKLQkiZGFwNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDVfZ3JvdXBzW10gPSB7Ci0JImdtZSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2dyb3Vwc1tdID0gewotCSJsY3NuIiwKLQkibGQwIiwKLQkibGQxIiwKLQkibGQxMCIsCi0JImxkMTEiLAotCSJsZDEyIiwKLQkibGQxMyIsCi0JImxkMTQiLAotCSJsZDE1IiwKLQkibGQxNiIsCi0JImxkMTciLAotCSJsZDIiLAotCSJsZDMiLAotCSJsZDQiLAotCSJsZDUiLAotCSJsZDYiLAotCSJsZDciLAotCSJsZDgiLAotCSJsZDkiLAotCSJsZGMiLAotCSJsZGkiLAotCSJsaHAwIiwKLQkibGhwMSIsCi0JImxocDIiLAotCSJsaHMiLAotCSJsbTAiLAotCSJsbTEiLAotCSJscHAiLAotCSJscHcwIiwKLQkibHB3MSIsCi0JImxwdzIiLAotCSJsc2MwIiwKLQkibHNjMSIsCi0JImxzY2siLAotCSJsc2RhIiwKLQkibHNkaSIsCi0JImxzcGkiLAotCSJsdnAwIiwKLQkibHZwMSIsCi0JImx2cyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXliX2dyb3Vwc1tdID0gewotCSJsY3NuIiwKLQkibGQwIiwKLQkibGQxIiwKLQkibGQxMCIsCi0JImxkMTEiLAotCSJsZDEyIiwKLQkibGQxMyIsCi0JImxkMTQiLAotCSJsZDE1IiwKLQkibGQxNiIsCi0JImxkMTciLAotCSJsZDIiLAotCSJsZDMiLAotCSJsZDQiLAotCSJsZDUiLAotCSJsZDYiLAotCSJsZDciLAotCSJsZDgiLAotCSJsZDkiLAotCSJsZGMiLAotCSJsZGkiLAotCSJsaHAwIiwKLQkibGhwMSIsCi0JImxocDIiLAotCSJsaHMiLAotCSJsbTAiLAotCSJsbTEiLAotCSJscHAiLAotCSJscHcwIiwKLQkibHB3MSIsCi0JImxwdzIiLAotCSJsc2MwIiwKLQkibHNjMSIsCi0JImxzY2siLAotCSJsc2RhIiwKLQkibHNkaSIsCi0JImxzcGkiLAotCSJsdnAwIiwKLQkibHZwMSIsCi0JImx2cyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVtY190ZXN0MF9kbGxfZ3JvdXBzW10gPSB7Ci0JImtiY2EiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbWNfdGVzdDFfZGxsX2dyb3Vwc1tdID0gewotCSJrYmNjIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2dyb3Vwc1tdID0gewotCSJhdGEiLAotCSJhdGIiLAotCSJhdGMiLAotCSJhdGQiLAotCSJhdGUiLAotCSJkYXAxIiwKLQkiZGFwMiIsCi0JImRhcDQiLAotCSJnbWEiLAotCSJnbWIiLAotCSJnbWMiLAotCSJnbWQiLAotCSJnbWUiLAotCSJncHUiLAotCSJpcnJ4IiwKLQkiaXJ0eCIsCi0JInB0YSIsCi0JInNwaWEiLAotCSJzcGliIiwKLQkic3BpYyIsCi0JInNwaWQiLAotCSJzcGllIiwKLQkidWNhIiwKLQkidWNiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2ludF9ncm91cHNbXSA9IHsKLQkiZ21iIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRtaV9ncm91cHNbXSA9IHsKLQkiaGRpbnQiLAotCSJscHcwIiwKLQkibHB3MiIsCi0JImxzYzEiLAotCSJsc2NrIiwKLQkibHNkYSIsCi0JImxzcGkiLAotCSJwdGEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNwX2dyb3Vwc1tdID0gewotCSJpMmNwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMV9ncm91cHNbXSA9IHsKLQkicm0iLAotCSJzcGRpIiwKLQkic3BkbyIsCi0JInNwaWciLAotCSJzcGloIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMl9ncm91cHNbXSA9IHsKLQkiZGRjIiwKLQkicHRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjM19ncm91cHNbXSA9IHsKLQkiZHRmIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWRlX2dyb3Vwc1tdID0gewotCSJhdGEiLAotCSJhdGIiLAotCSJhdGMiLAotCSJhdGQiLAotCSJhdGUiLAotCSJnbWIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpcmRhX2dyb3Vwc1tdID0gewotCSJ1YWQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrYmNfZ3JvdXBzW10gPSB7Ci0JImtiY2EiLAotCSJrYmNiIiwKLQkia2JjYyIsCi0JImtiY2QiLAotCSJrYmNlIiwKLQkia2JjZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pb19ncm91cHNbXSA9IHsKLQkia2JjYiIsCi0JImtiY2QiLAotCSJrYmNmIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwaV9oc19ncm91cHNbXSA9IHsKLQkidWFhIiwKLQkidWFiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9ncm91cHNbXSA9IHsKLQkiYXRhIiwKLQkiYXRiIiwKLQkiYXRjIiwKLQkiYXRkIiwKLQkiYXRlIiwKLQkiZ21iIiwKLQkiZ21kIiwKLQkia2JjYSIsCi0JImtiY2IiLAotCSJrYmNjIiwKLQkia2JjZCIsCi0JImtiY2UiLAotCSJrYmNmIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3NjX2dyb3Vwc1tdID0gewotCSJjZGV2MSIsCi0JImNkZXYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3dyX2dyb3Vwc1tdID0gewotCSJrYmNlIiwKLQkib3djIiwKLQkidWFjIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpZV9ncm91cHNbXSA9IHsKLQkiZ3B2IiwKLQkic2x4YSIsCi0JInNseGsiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbGxhX291dF9ncm91cHNbXSA9IHsKLQkiY2RldjEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbGxjX291dDFfZ3JvdXBzW10gPSB7Ci0JImNzdXMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbGxtX291dDFfZ3JvdXBzW10gPSB7Ci0JImNkZXYxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxscF9vdXQyX2dyb3Vwc1tdID0gewotCSJjc3VzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxscF9vdXQzX2dyb3Vwc1tdID0gewotCSJjc3VzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxscF9vdXQ0X2dyb3Vwc1tdID0gewotCSJjZGV2MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9ncm91cHNbXSA9IHsKLQkiZ3B1IiwKLQkic2RiIiwKLQkic2RjIiwKLQkic2RkIiwKLQkidWNiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyX2ludHJfZ3JvdXBzW10gPSB7Ci0JInBtYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3cl9vbl9ncm91cHNbXSA9IHsKLQkicG1jIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDFfZ3JvdXBzW10gPSB7Ci0JImR0YSIsCi0JImR0YiIsCi0JImR0YyIsCi0JImR0ZCIsCi0JImR0ZSIsCi0JImdtZCIsCi0JImdtZSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQyX2dyb3Vwc1tdID0gewotCSJjcnRwIiwKLQkiZGFwMSIsCi0JImRhcDMiLAotCSJkYXA0IiwKLQkiZGRjIiwKLQkiZHRiIiwKLQkiZHRjIiwKLQkiZHRlIiwKLQkiZHRmIiwKLQkiZ3B1NyIsCi0JImdwdiIsCi0JImhkaW50IiwKLQkiaTJjcCIsCi0JIm93YyIsCi0JInJtIiwKLQkic2RpbzEiLAotCSJzcGRpIiwKLQkic3BkbyIsCi0JInVhYyIsCi0JInVjYSIsCi0JInVkYSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQzX2dyb3Vwc1tdID0gewotCSJjcnRwIiwKLQkiZGFwMiIsCi0JImRhcDMiLAotCSJkZGMiLAotCSJncHU3IiwKLQkiZ3B2IiwKLQkiaGRpbnQiLAotCSJpMmNwIiwKLQkibGQxNyIsCi0JImxkYyIsCi0JImxkaSIsCi0JImxocDAiLAotCSJsaHAxIiwKLQkibGhwMiIsCi0JImxtMSIsCi0JImxwcCIsCi0JImxwdzEiLAotCSJsdnAwIiwKLQkibHZwMSIsCi0JIm93YyIsCi0JInBtYyIsCi0JInJtIiwKLQkidWFjIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDRfZ3JvdXBzW10gPSB7Ci0JImF0YSIsCi0JImF0ZSIsCi0JImNydHAiLAotCSJkYXAzIiwKLQkiZGFwNCIsCi0JImRkYyIsCi0JImR0YSIsCi0JImR0YyIsCi0JImR0ZCIsCi0JImR0ZiIsCi0JImdwdSIsCi0JImdwdTciLAotCSJncHYiLAotCSJoZGludCIsCi0JImkyY3AiLAotCSJrYmNlIiwKLQkibGNzbiIsCi0JImxkMCIsCi0JImxkMSIsCi0JImxkMiIsCi0JImxkMyIsCi0JImxkNCIsCi0JImxkNSIsCi0JImxkNiIsCi0JImxkNyIsCi0JImxkOCIsCi0JImxkOSIsCi0JImxkMTAiLAotCSJsZDExIiwKLQkibGQxMiIsCi0JImxkMTMiLAotCSJsZDE0IiwKLQkibGQxNSIsCi0JImxkMTYiLAotCSJsZDE3IiwKLQkibGRjIiwKLQkibGRpIiwKLQkibGhwMCIsCi0JImxocDEiLAotCSJsaHAyIiwKLQkibGhzIiwKLQkibG0wIiwKLQkibHBwIiwKLQkibHB3MSIsCi0JImxzYzAiLAotCSJsc2RpIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJsdnMiLAotCSJvd2MiLAotCSJwbWMiLAotCSJwdGEiLAotCSJybSIsCi0JInNwaWYiLAotCSJ1YWMiLAotCSJ1Y2EiLAotCSJ1Y2IiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydGNrX2dyb3Vwc1tdID0gewotCSJncHU3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RpbzFfZ3JvdXBzW10gPSB7Ci0JInNkaW8xIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RpbzJfZ3JvdXBzW10gPSB7Ci0JImRhcDEiLAotCSJkdGEiLAotCSJkdGQiLAotCSJrYmNhIiwKLQkia2JjYiIsCi0JImtiY2QiLAotCSJzcGRpIiwKLQkic3BkbyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW8zX2dyb3Vwc1tdID0gewotCSJzZGIiLAotCSJzZGMiLAotCSJzZGQiLAotCSJzbHhhIiwKLQkic2x4YyIsCi0JInNseGQiLAotCSJzbHhrIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RpbzRfZ3JvdXBzW10gPSB7Ci0JImF0YiIsCi0JImF0YyIsCi0JImF0ZCIsCi0JImdtYSIsCi0JImdtZSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNmbGFzaF9ncm91cHNbXSA9IHsKLQkiZ21jIiwKLQkiZ21kIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkaWZfZ3JvdXBzW10gPSB7Ci0JInNseGMiLAotCSJzbHhkIiwKLQkic3BkaSIsCi0JInNwZG8iLAotCSJ1YWQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkxX2dyb3Vwc1tdID0gewotCSJkdGIiLAotCSJkdGUiLAotCSJzcGlhIiwKLQkic3BpYiIsCi0JInNwaWMiLAotCSJzcGlkIiwKLQkic3BpZSIsCi0JInNwaWYiLAotCSJ1ZGEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkyX2dyb3Vwc1tdID0gewotCSJzZGIiLAotCSJzbHhhIiwKLQkic2x4YyIsCi0JInNseGQiLAotCSJzbHhrIiwKLQkic3BpYSIsCi0JInNwaWIiLAotCSJzcGljIiwKLQkic3BpZCIsCi0JInNwaWUiLAotCSJzcGlmIiwKLQkic3BpZyIsCi0JInNwaWgiLAotCSJ1YWIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkyX2FsdF9ncm91cHNbXSA9IHsKLQkic3BpZCIsCi0JInNwaWUiLAotCSJzcGlnIiwKLQkic3BpaCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTNfZ3JvdXBzW10gPSB7Ci0JImdtYSIsCi0JImxjc24iLAotCSJsbTAiLAotCSJscHcwIiwKLQkibHB3MiIsCi0JImxzYzEiLAotCSJsc2NrIiwKLQkibHNkYSIsCi0JImxzZGkiLAotCSJzZGMiLAotCSJzZGQiLAotCSJzcGlhIiwKLQkic3BpYiIsCi0JInNwaWMiLAotCSJzcGlmIiwKLQkic3BpZyIsCi0JInNwaWgiLAotCSJ1YWEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk0X2dyb3Vwc1tdID0gewotCSJnbWMiLAotCSJpcnJ4IiwKLQkiaXJ0eCIsCi0JInNseGEiLAotCSJzbHhjIiwKLQkic2x4ZCIsCi0JInNseGsiLAotCSJ1YWQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0cmFjZV9ncm91cHNbXSA9IHsKLQkia2JjYyIsCi0JImtiY2YiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0d2NfZ3JvdXBzW10gPSB7Ci0JImRhcDIiLAotCSJzZGMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0YV9ncm91cHNbXSA9IHsKLQkiZ3B1IiwKLQkiaXJyeCIsCi0JImlydHgiLAotCSJzZGIiLAotCSJzZGQiLAotCSJzZGlvMSIsCi0JInVhYSIsCi0JInVhYiIsCi0JInVhZCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRiX2dyb3Vwc1tdID0gewotCSJpcnJ4IiwKLQkiaXJ0eCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRjX2dyb3Vwc1tdID0gewotCSJ1Y2EiLAotCSJ1Y2IiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0ZF9ncm91cHNbXSA9IHsKLQkiZ21jIiwKLQkidWRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGVfZ3JvdXBzW10gPSB7Ci0JImdtYSIsCi0JInNkaW8xIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWxwaV9ncm91cHNbXSA9IHsKLQkidWFhIiwKLQkidWFiIiwKLQkidWRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImR0YSIsCi0JImR0YiIsCi0JImR0YyIsCi0JImR0ZCIsCi0JImR0ZSIsCi0JImR0ZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX3NlbnNvcl9jbGtfZ3JvdXBzW10gPSB7Ci0JImNzdXMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB4aW9fZ3JvdXBzW10gPSB7Ci0JImxkMCIsCi0JImxkMSIsCi0JImxkMTAiLAotCSJsZDExIiwKLQkibGQxMiIsCi0JImxkMTMiLAotCSJsZDE0IiwKLQkibGQxNSIsCi0JImxkMTYiLAotCSJsZDIiLAotCSJsZDMiLAotCSJsZDQiLAotCSJsZDUiLAotCSJsZDYiLAotCSJsZDciLAotCSJsZDgiLAotCSJsZDkiLAotCSJsaHMiLAotCSJsc2MwIiwKLQkibHNwaSIsCi0JImx2cyIsCi19OwotCiAjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCi0JCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKLQkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAogCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTIwX2Z1bmN0aW9uc1tdID0geworc3RhdGljIHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTIwX2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGFoYl9jbGspLAogCUZVTkNUSU9OKGFwYl9jbGspLAogCUZVTkNUSU9OKGF1ZGlvX3N5bmMpLApAQCAtMjg4MSwxOCArMjI1Niw3IEBACiAJLnByb2JlID0gdGVncmEyMF9waW5jdHJsX3Byb2JlLAogCS5yZW1vdmUgPSB0ZWdyYV9waW5jdHJsX3JlbW92ZSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRlZ3JhMjBfcGluY3RybF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGVncmEyMF9waW5jdHJsX2RyaXZlcik7Ci19Ci1hcmNoX2luaXRjYWxsKHRlZ3JhMjBfcGluY3RybF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHRlZ3JhMjBfcGluY3RybF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRlZ3JhMjBfcGluY3RybF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodGVncmEyMF9waW5jdHJsX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYTIwX3BpbmN0cmxfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBXYXJyZW4gPHN3YXJyZW5AbnZpZGlhLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTlZJRElBIFRlZ3JhMjAgcGluY3RybCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMzAuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMzAuYwppbmRleCAyMzAwZGViLi40MWQyNGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEzMC5jCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBNb3N0IHBpbnMgYWZmZWN0ZWQgYnkgdGhlIHBpbm11eCBjYW4gYWxzbyBiZSBHUElPcy4gRGVmaW5lIHRoZXNlIGZpcnN0LgogICogVGhlc2UgbXVzdCBtYXRjaCBob3cgdGhlIEdQSU8gZHJpdmVyIG5hbWVzL251bWJlcnMgaXRzIHBpbnMuCiAgKi8KLSNkZWZpbmUgX0dQSU8ob2Zmc2V0KQkJCQkob2Zmc2V0KQorI2RlZmluZSBfR1BJTyhvZmZzZXQpCQkJKG9mZnNldCkKIAogI2RlZmluZSBURUdSQV9QSU5fQ0xLXzMyS19PVVRfUEEwCV9HUElPKDApCiAjZGVmaW5lIFRFR1JBX1BJTl9VQVJUM19DVFNfTl9QQTEJX0dQSU8oMSkKQEAgLTI3Nyw4ICsyNzcsOCBAQAogI2RlZmluZSBURUdSQV9QSU5fUEVFNwkJCV9HUElPKDI0NykKIAogLyogQWxsIG5vbi1HUElPIHBpbnMgZm9sbG93ICovCi0jZGVmaW5lIE5VTV9HUElPUwkJCQkoVEVHUkFfUElOX1BFRTcgKyAxKQotI2RlZmluZSBfUElOKG9mZnNldCkJCQkJKE5VTV9HUElPUyArIChvZmZzZXQpKQorI2RlZmluZSBOVU1fR1BJT1MJCQkoVEVHUkFfUElOX1BFRTcgKyAxKQorI2RlZmluZSBfUElOKG9mZnNldCkJCQkoTlVNX0dQSU9TICsgKG9mZnNldCkpCiAKIC8qIE5vbi1HUElPIHBpbnMgKi8KICNkZWZpbmUgVEVHUkFfUElOX0NMS18zMktfSU4JCV9QSU4oMCkKQEAgLTIwMTUsMTI1MyArMjAxNSwxMyBAQAogCVRFR1JBX01VWF9WSV9BTFQyLAogCVRFR1JBX01VWF9WSV9BTFQzLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxpbmtfZ3JvdXBzW10gPSB7Ci0JImNsa18zMmtfb3V0X3BhMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNlY19ncm91cHNbXSA9IHsKLQkiaGRtaV9jZWNfcGVlMyIsCi0JIm93ciIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsa18xMm1fb3V0X2dyb3Vwc1tdID0gewotCSJwdjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGtfMzJrX2luX2dyb3Vwc1tdID0gewotCSJjbGtfMzJrX2luIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY29yZV9wd3JfcmVxX2dyb3Vwc1tdID0gewotCSJjb3JlX3B3cl9yZXEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHVfcHdyX3JlcV9ncm91cHNbXSA9IHsKLQkiY3B1X3B3cl9yZXEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcnRfZ3JvdXBzW10gPSB7Ci0JImNydF9oc3luY19wdjYiLAotCSJjcnRfdnN5bmNfcHY3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwX2dyb3Vwc1tdID0gewotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMl9yZXFfcGNjNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRkcl9ncm91cHNbXSA9IHsKLQkidmlfZDBfcHQ0IiwKLQkidmlfZDFfcGQ1IiwKLQkidmlfZDEwX3B0MiIsCi0JInZpX2QxMV9wdDMiLAotCSJ2aV9kMl9wbDAiLAotCSJ2aV9kM19wbDEiLAotCSJ2aV9kNF9wbDIiLAotCSJ2aV9kNV9wbDMiLAotCSJ2aV9kNl9wbDQiLAotCSJ2aV9kN19wbDUiLAotCSJ2aV9kOF9wbDYiLAotCSJ2aV9kOV9wbDciLAotCSJ2aV9oc3luY19wZDciLAotCSJ2aV92c3luY19wZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXYzX2dyb3Vwc1tdID0gewotCSJjbGszX3JlcV9wZWUxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGlzcGxheWFfZ3JvdXBzW10gPSB7Ci0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfc2Nsa19wcDMiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkibGNkX2NzMF9uX3BuNCIsCi0JImxjZF9jczFfbl9wdzAiLAotCSJsY2RfZDBfcGUwIiwKLQkibGNkX2QxX3BlMSIsCi0JImxjZF9kMTBfcGYyIiwKLQkibGNkX2QxMV9wZjMiLAotCSJsY2RfZDEyX3BmNCIsCi0JImxjZF9kMTNfcGY1IiwKLQkibGNkX2QxNF9wZjYiLAotCSJsY2RfZDE1X3BmNyIsCi0JImxjZF9kMTZfcG0wIiwKLQkibGNkX2QxN19wbTEiLAotCSJsY2RfZDE4X3BtMiIsCi0JImxjZF9kMTlfcG0zIiwKLQkibGNkX2QyX3BlMiIsCi0JImxjZF9kMjBfcG00IiwKLQkibGNkX2QyMV9wbTUiLAotCSJsY2RfZDIyX3BtNiIsCi0JImxjZF9kMjNfcG03IiwKLQkibGNkX2QzX3BlMyIsCi0JImxjZF9kNF9wZTQiLAotCSJsY2RfZDVfcGU1IiwKLQkibGNkX2Q2X3BlNiIsCi0JImxjZF9kN19wZTciLAotCSJsY2RfZDhfcGYwIiwKLQkibGNkX2Q5X3BmMSIsCi0JImxjZF9kYzBfcG42IiwKLQkibGNkX2RjMV9wZDIiLAotCSJsY2RfZGVfcGoxIiwKLQkibGNkX2hzeW5jX3BqMyIsCi0JImxjZF9tMV9wdzEiLAotCSJsY2RfcGNsa19wYjMiLAotCSJsY2RfcHdyMF9wYjIiLAotCSJsY2RfcHdyMV9wYzEiLAotCSJsY2RfcHdyMl9wYzYiLAotCSJsY2Rfc2NrX3B6NCIsCi0JImxjZF9zZGluX3B6MiIsCi0JImxjZF9zZG91dF9wbjUiLAotCSJsY2RfdnN5bmNfcGo0IiwKLQkibGNkX3dyX25fcHozIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGlzcGxheWJfZ3JvdXBzW10gPSB7Ci0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfc2Nsa19wcDMiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkibGNkX2NzMF9uX3BuNCIsCi0JImxjZF9jczFfbl9wdzAiLAotCSJsY2RfZDBfcGUwIiwKLQkibGNkX2QxX3BlMSIsCi0JImxjZF9kMTBfcGYyIiwKLQkibGNkX2QxMV9wZjMiLAotCSJsY2RfZDEyX3BmNCIsCi0JImxjZF9kMTNfcGY1IiwKLQkibGNkX2QxNF9wZjYiLAotCSJsY2RfZDE1X3BmNyIsCi0JImxjZF9kMTZfcG0wIiwKLQkibGNkX2QxN19wbTEiLAotCSJsY2RfZDE4X3BtMiIsCi0JImxjZF9kMTlfcG0zIiwKLQkibGNkX2QyX3BlMiIsCi0JImxjZF9kMjBfcG00IiwKLQkibGNkX2QyMV9wbTUiLAotCSJsY2RfZDIyX3BtNiIsCi0JImxjZF9kMjNfcG03IiwKLQkibGNkX2QzX3BlMyIsCi0JImxjZF9kNF9wZTQiLAotCSJsY2RfZDVfcGU1IiwKLQkibGNkX2Q2X3BlNiIsCi0JImxjZF9kN19wZTciLAotCSJsY2RfZDhfcGYwIiwKLQkibGNkX2Q5X3BmMSIsCi0JImxjZF9kYzBfcG42IiwKLQkibGNkX2RjMV9wZDIiLAotCSJsY2RfZGVfcGoxIiwKLQkibGNkX2hzeW5jX3BqMyIsCi0JImxjZF9tMV9wdzEiLAotCSJsY2RfcGNsa19wYjMiLAotCSJsY2RfcHdyMF9wYjIiLAotCSJsY2RfcHdyMV9wYzEiLAotCSJsY2RfcHdyMl9wYzYiLAotCSJsY2Rfc2NrX3B6NCIsCi0JImxjZF9zZGluX3B6MiIsCi0JImxjZF9zZG91dF9wbjUiLAotCSJsY2RfdnN5bmNfcGo0IiwKLQkibGNkX3dyX25fcHozIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHR2X2dyb3Vwc1tdID0gewotCSJnbWlfYTE3X3BiMCIsCi0JImdtaV9hMThfcGIxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgxX2dyb3Vwc1tdID0gewotCSJjbGsxX291dF9wdzQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgyX2dyb3Vwc1tdID0gewotCSJjbGsyX291dF9wdzUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRwZXJpcGgzX2dyb3Vwc1tdID0gewotCSJjbGszX291dF9wZWUwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2dyb3Vwc1tdID0gewotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX3NjbGtfcG4zIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JImdtaV9hMTZfcGo3IiwKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9hMTlfcGs3IiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV9hZDhfcGgwIiwKLQkiZ21pX2FkOV9waDEiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9jczJfbl9wazMiLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfY3M3X25fcGk2IiwKLQkiZ21pX2Rxc19waTIiLAotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX29lX25fcGkxIiwKLQkiZ21pX3JzdF9uX3BpNCIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV93cF9uX3BjNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJzcGkxX2NzMF9uX3B4NiIsCi0JInNwaTFfbW9zaV9weDQiLAotCSJzcGkxX3Nja19weDUiLAotCSJzcGkyX2NzMF9uX3B4MyIsCi0JInNwaTJfbWlzb19weDEiLAotCSJzcGkyX21vc2lfcHgwIiwKLQkic3BpMl9zY2tfcHgyIiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkidWFydDNfcnhkX3B3NyIsCi0JInVhcnQzX3R4ZF9wdzYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnbWlfYWx0X2dyb3Vwc1tdID0gewotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9jczNfbl9wazQiLAotCSJnbWlfY3M3X25fcGk2IiwKLQkiZ21pX3dwX25fcGM3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRhX2dyb3Vwc1tdID0gewotCSJjbGsxX3JlcV9wZWUyIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF9sMF9wcnNudF9uX3BkZDAiLAotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkicGV4X2wxX3Byc250X25fcGRkNCIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wyX2Nsa3JlcV9uX3BjYzciLAotCSJwZXhfbDJfcHJzbnRfbl9wZGQ3IiwKLQkicGV4X2wyX3JzdF9uX3BjYzYiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotCSJzcGRpZl9pbl9wazYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZGNwX2dyb3Vwc1tdID0gewotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JImxjZF9wd3IwX3BiMiIsCi0JImxjZF9wd3IyX3BjNiIsCi0JImxjZF9zY2tfcHo0IiwKLQkibGNkX3Nkb3V0X3BuNSIsCi0JImxjZF93cl9uX3B6MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkbWlfZ3JvdXBzW10gPSB7Ci0JImhkbWlfaW50X3BuNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhzaV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzFfZ3JvdXBzW10gPSB7Ci0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInNwaTJfY3MxX25fcHcyIiwKLQkic3BpMl9jczJfbl9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMyX2dyb3Vwc1tdID0gewotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzNfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjNF9ncm91cHNbXSA9IHsKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY3B3cl9ncm91cHNbXSA9IHsKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMF9ncm91cHNbXSA9IHsKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczFfZ3JvdXBzW10gPSB7Ci0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMyX2dyb3Vwc1tdID0gewotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX3NjbGtfcHAzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzM19ncm91cHNbXSA9IHsKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczRfZ3JvdXBzW10gPSB7Ci0JInBiYjAiLAotCSJwYmI3IiwKLQkicGNjMSIsCi0JInBjYzIiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9ncm91cHNbXSA9IHsKLQkia2Jfcm93M19wcjMiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrYmNfZ3JvdXBzW10gPSB7Ci0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkia2Jfcm93MTFfcHMzIiwKLQkia2Jfcm93MTJfcHM0IiwKLQkia2Jfcm93MTNfcHM1IiwKLQkia2Jfcm93MTRfcHM2IiwKLQkia2Jfcm93MTVfcHM3IiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pb19ncm91cHNbXSA9IHsKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX3JvdzZfcHI2IiwKLQkia2Jfcm93N19wcjciLAotCSJrYl9yb3c4X3BzMCIsCi0JImtiX3JvdzlfcHMxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9ncm91cHNbXSA9IHsKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV9hZDhfcGgwIiwKLQkiZ21pX2FkOV9waDEiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9jczJfbl9wazMiLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfY3M3X25fcGk2IiwKLQkiZ21pX2Rxc19waTIiLAotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX29lX25fcGkxIiwKLQkiZ21pX3JzdF9uX3BpNCIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV93cF9uX3BjNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkia2Jfcm93MTFfcHMzIiwKLQkia2Jfcm93MTJfcHM0IiwKLQkia2Jfcm93MTNfcHM1IiwKLQkia2Jfcm93MTRfcHM2IiwKLQkia2Jfcm93MTVfcHM3IiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9hbHRfZ3JvdXBzW10gPSB7Ci0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfY3M3X25fcGk2IiwKLQkiZ21pX3JzdF9uX3BpNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG93cl9ncm91cHNbXSA9IHsKLQkicHUwIiwKLQkicHYyIiwKLQkia2Jfcm93NV9wcjUiLAotCSJvd3IiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY2llX2dyb3Vwc1tdID0gewotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF9sMF9wcnNudF9uX3BkZDAiLAotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkicGV4X2wxX3Byc250X25fcGRkNCIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wyX2Nsa3JlcV9uX3BjYzciLAotCSJwZXhfbDJfcHJzbnRfbl9wZGQ3IiwKLQkicGV4X2wyX3JzdF9uX3BjYzYiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20wX2dyb3Vwc1tdID0gewotCSJnbWlfYWQ4X3BoMCIsCi0JInB1MyIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi0JInNkbW1jM19kYXQ1X3BkMCIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTFfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDlfcGgxIiwKLQkicHU0IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDRfcGQxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtMl9ncm91cHNbXSA9IHsKLQkiZ21pX2FkMTBfcGgyIiwKLQkicHU1IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20zX2dyb3Vwc1tdID0gewotCSJnbWlfYWQxMV9waDMiLAotCSJwdTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3cl9pbnRfbl9ncm91cHNbXSA9IHsKLQkicHdyX2ludF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDFfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9jczJfbl9wazMiLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV93cF9uX3BjNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JInB1MSIsCi0JInB1MiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi0JInZpX3BjbGtfcHQwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDJfZ3JvdXBzW10gPSB7Ci0JImNsazFfb3V0X3B3NCIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0JImNsa18zMmtfaW4iLAotCSJjbGtfMzJrX291dF9wYTAiLAotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JImNydF9oc3luY19wdjYiLAotCSJjcnRfdnN5bmNfcHY3IiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19zY2xrX3BwMyIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJwYmIwIiwKLQkicGJiNyIsCi0JInBjYzEiLAotCSJwY2MyIiwKLQkicHYwIiwKLQkicHYxIiwKLQkicHYyIiwKLQkicHYzIiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0JImhkbWlfaW50X3BuNyIsCi0JImp0YWdfcnRja19wdTciLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJwd3JfaW50X24iLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWM0X3JzdF9uX3BjYzMiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnhkX3B3NyIsCi0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1bHBpX2Nsa19weTAiLAotCSJ1bHBpX2Rpcl9weTEiLAotCSJ1bHBpX254dF9weTIiLAotCSJ1bHBpX3N0cF9weTMiLAotCSJ2aV9kMF9wdDQiLAotCSJ2aV9kMTBfcHQyIiwKLQkidmlfZDExX3B0MyIsCi0JInZpX2hzeW5jX3BkNyIsCi0JInZpX3ZzeW5jX3BkNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQzX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NjbF9wYmIxIiwKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi0JImNsazFfb3V0X3B3NCIsCi0JImNsazFfcmVxX3BlZTIiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCSJjbGtfMzJrX2luIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJwYmIwIiwKLQkicGJiNyIsCi0JInBjYzEiLAotCSJwY2MyIiwKLQkicHYwIiwKLQkicHYxIiwKLQkicHYyIiwKLQkicHYzIiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0JImhkbWlfaW50X3BuNyIsCi0JImp0YWdfcnRja19wdTciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3czX3ByMyIsCi0JImxjZF9kMF9wZTAiLAotCSJsY2RfZDFfcGUxIiwKLQkibGNkX2QxMF9wZjIiLAotCSJsY2RfZDExX3BmMyIsCi0JImxjZF9kMTJfcGY0IiwKLQkibGNkX2QxM19wZjUiLAotCSJsY2RfZDE0X3BmNiIsCi0JImxjZF9kMTVfcGY3IiwKLQkibGNkX2QxNl9wbTAiLAotCSJsY2RfZDE3X3BtMSIsCi0JImxjZF9kMThfcG0yIiwKLQkibGNkX2QxOV9wbTMiLAotCSJsY2RfZDJfcGUyIiwKLQkibGNkX2QyMF9wbTQiLAotCSJsY2RfZDIxX3BtNSIsCi0JImxjZF9kMjJfcG02IiwKLQkibGNkX2QyM19wbTciLAotCSJsY2RfZDNfcGUzIiwKLQkibGNkX2Q0X3BlNCIsCi0JImxjZF9kNV9wZTUiLAotCSJsY2RfZDZfcGU2IiwKLQkibGNkX2Q3X3BlNyIsCi0JImxjZF9kOF9wZjAiLAotCSJsY2RfZDlfcGYxIiwKLQkibGNkX2RjMF9wbjYiLAotCSJsY2RfZGMxX3BkMiIsCi0JImxjZF9kZV9wajEiLAotCSJsY2RfaHN5bmNfcGozIiwKLQkibGNkX20xX3B3MSIsCi0JImxjZF9wY2xrX3BiMyIsCi0JImxjZF9wd3IxX3BjMSIsCi0JImxjZF92c3luY19wajQiLAotCSJvd3IiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF9sMF9wcnNudF9uX3BkZDAiLAotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkicGV4X2wxX3Byc250X25fcGRkNCIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wyX2Nsa3JlcV9uX3BjYzciLAotCSJwZXhfbDJfcHJzbnRfbl9wZGQ3IiwKLQkicGV4X2wyX3JzdF9uX3BjYzYiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJwd3JfaW50X24iLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWM0X3JzdF9uX3BjYzMiLAotCSJzeXNfY2xrX3JlcV9wejUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkNF9ncm91cHNbXSA9IHsKLQkiY2xrMV9vdXRfcHc0IiwKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0JImNsa18zMmtfaW4iLAotCSJjbGtfMzJrX291dF9wYTAiLAotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JImNydF9oc3luY19wdjYiLAotCSJjcnRfdnN5bmNfcHY3IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0JImRkY19zY2xfcHY0IiwKLQkiZGRjX3NkYV9wdjUiLAotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQkiZ21pX2ExOV9wazciLAotCSJnbWlfYWQwX3BnMCIsCi0JImdtaV9hZDFfcGcxIiwKLQkiZ21pX2FkMTBfcGgyIiwKLQkiZ21pX2FkMTFfcGgzIiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX2FkMTRfcGg2IiwKLQkiZ21pX2FkMTVfcGg3IiwKLQkiZ21pX2FkMl9wZzIiLAotCSJnbWlfYWQzX3BnMyIsCi0JImdtaV9hZDRfcGc0IiwKLQkiZ21pX2FkNV9wZzUiLAotCSJnbWlfYWQ2X3BnNiIsCi0JImdtaV9hZDdfcGc3IiwKLQkiZ21pX2FkOF9waDAiLAotCSJnbWlfYWQ5X3BoMSIsCi0JImdtaV9hZHZfbl9wazAiLAotCSJnbWlfY2xrX3BrMSIsCi0JImdtaV9jczJfbl9wazMiLAotCSJnbWlfY3M0X25fcGsyIiwKLQkiZ21pX2Rxc19waTIiLAotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX29lX25fcGkxIiwKLQkiZ21pX3JzdF9uX3BpNCIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JInBjYzIiLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJwdjAiLAotCSJwdjEiLAotCSJwdjIiLAotCSJwdjMiLAotCSJoZG1pX2NlY19wZWUzIiwKLQkiaGRtaV9pbnRfcG43IiwKLQkianRhZ19ydGNrX3B1NyIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sM19wcTMiLAotCSJrYl9jb2w0X3BxNCIsCi0JImtiX2NvbDVfcHE1IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93NF9wcjQiLAotCSJsY2RfY3MwX25fcG40IiwKLQkibGNkX2NzMV9uX3B3MCIsCi0JImxjZF9kMF9wZTAiLAotCSJsY2RfZDFfcGUxIiwKLQkibGNkX2QxMF9wZjIiLAotCSJsY2RfZDExX3BmMyIsCi0JImxjZF9kMTJfcGY0IiwKLQkibGNkX2QxM19wZjUiLAotCSJsY2RfZDE0X3BmNiIsCi0JImxjZF9kMTVfcGY3IiwKLQkibGNkX2QxNl9wbTAiLAotCSJsY2RfZDE3X3BtMSIsCi0JImxjZF9kMThfcG0yIiwKLQkibGNkX2QxOV9wbTMiLAotCSJsY2RfZDJfcGUyIiwKLQkibGNkX2QyMF9wbTQiLAotCSJsY2RfZDIxX3BtNSIsCi0JImxjZF9kMjJfcG02IiwKLQkibGNkX2QyM19wbTciLAotCSJsY2RfZDNfcGUzIiwKLQkibGNkX2Q0X3BlNCIsCi0JImxjZF9kNV9wZTUiLAotCSJsY2RfZDZfcGU2IiwKLQkibGNkX2Q3X3BlNyIsCi0JImxjZF9kOF9wZjAiLAotCSJsY2RfZDlfcGYxIiwKLQkibGNkX2RjMF9wbjYiLAotCSJsY2RfZGMxX3BkMiIsCi0JImxjZF9kZV9wajEiLAotCSJsY2RfaHN5bmNfcGozIiwKLQkibGNkX20xX3B3MSIsCi0JImxjZF9wY2xrX3BiMyIsCi0JImxjZF9wd3IxX3BjMSIsCi0JImxjZF9zZGluX3B6MiIsCi0JImxjZF92c3luY19wajQiLAotCSJvd3IiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF9sMF9wcnNudF9uX3BkZDAiLAotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkicGV4X2wxX3Byc250X25fcGRkNCIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wyX2Nsa3JlcV9uX3BjYzciLAotCSJwZXhfbDJfcHJzbnRfbl9wZGQ3IiwKLQkicGV4X2wyX3JzdF9uX3BjYzYiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJwd3JfaW50X24iLAotCSJzcGkxX21pc29fcHg3IiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkidWFydDNfcnhkX3B3NyIsCi0JInVhcnQzX3R4ZF9wdzYiLAotCSJ2aV9kMF9wdDQiLAotCSJ2aV9kMV9wZDUiLAotCSJ2aV9kMTBfcHQyIiwKLQkidmlfZDExX3B0MyIsCi0JInZpX2QyX3BsMCIsCi0JInZpX2QzX3BsMSIsCi0JInZpX2Q0X3BsMiIsCi0JInZpX2Q1X3BsMyIsCi0JInZpX2Q2X3BsNCIsCi0JInZpX2Q3X3BsNSIsCi0JInZpX2Q4X3BsNiIsCi0JInZpX2Q5X3BsNyIsCi0JInZpX2hzeW5jX3BkNyIsCi0JInZpX3BjbGtfcHQwIiwKLQkidmlfdnN5bmNfcGQ2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnRja19ncm91cHNbXSA9IHsKLQkianRhZ19ydGNrX3B1NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNhdGFfZ3JvdXBzW10gPSB7Ci0JImdtaV9jczZfbl9waTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzFfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbGtfcHowIiwKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0M19weTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzJfZ3JvdXBzW10gPSB7Ci0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCSJrYl9yb3cxNV9wczciLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotCSJ2aV9kMV9wZDUiLAotCSJ2aV9kMl9wbDAiLAotCSJ2aV9kM19wbDEiLAotCSJ2aV9kNF9wbDIiLAotCSJ2aV9kNV9wbDMiLAotCSJ2aV9kNl9wbDQiLAotCSJ2aV9kN19wbDUiLAotCSJ2aV9kOF9wbDYiLAotCSJ2aV9kOV9wbDciLAotCSJ2aV9wY2xrX3B0MCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jM19ncm91cHNbXSA9IHsKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi0JInNkbW1jM19kYXQ0X3BkMSIsCi0JInNkbW1jM19kYXQ1X3BkMCIsCi0JInNkbW1jM19kYXQ2X3BkMyIsCi0JInNkbW1jM19kYXQ3X3BkNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jNF9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotCSJjYW1fbWNsa19wY2MwIiwKLQkicGJiMCIsCi0JInBiYjMiLAotCSJwYmI0IiwKLQkicGJiNSIsCi0JInBiYjYiLAotCSJwYmI3IiwKLQkicGNjMSIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJzZG1tYzRfcnN0X25fcGNjMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwZGlmX2dyb3Vwc1tdID0gewotCSJzZG1tYzNfZGF0Nl9wZDMiLAotCSJzZG1tYzNfZGF0N19wZDQiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkxX2dyb3Vwc1tdID0gewotCSJzcGkxX2NzMF9uX3B4NiIsCi0JInNwaTFfbWlzb19weDciLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9ncm91cHNbXSA9IHsKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0NF9wZDEiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJzZG1tYzNfZGF0Nl9wZDMiLAotCSJzZG1tYzNfZGF0N19wZDQiLAotCSJzcGkxX2NzMF9uX3B4NiIsCi0JInNwaTFfbW9zaV9weDQiLAotCSJzcGkxX3Nja19weDUiLAotCSJzcGkyX2NzMF9uX3B4MyIsCi0JInNwaTJfY3MxX25fcHcyIiwKLQkic3BpMl9jczJfbl9wdzMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9hbHRfZ3JvdXBzW10gPSB7Ci0JInNwaTFfY3MwX25fcHg2IiwKLQkic3BpMV9taXNvX3B4NyIsCi0JInNwaTFfbW9zaV9weDQiLAotCSJzcGkxX3Nja19weDUiLAotCSJzcGkyX2NzMV9uX3B3MiIsCi0JInNwaTJfY3MyX25fcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpM19ncm91cHNbXSA9IHsKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic3BpMV9taXNvX3B4NyIsCi0JInNwaTJfY3MwX25fcHgzIiwKLQkic3BpMl9jczFfbl9wdzIiLAotCSJzcGkyX2NzMl9uX3B3MyIsCi0JInNwaTJfbWlzb19weDEiLAotCSJzcGkyX21vc2lfcHgwIiwKLQkic3BpMl9zY2tfcHgyIiwKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk0X2dyb3Vwc1tdID0gewotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JInNkbW1jM19kYXQ0X3BkMSIsCi0JInNkbW1jM19kYXQ1X3BkMCIsCi0JInNkbW1jM19kYXQ2X3BkMyIsCi0JInNkbW1jM19kYXQ3X3BkNCIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNV9ncm91cHNbXSA9IHsKLQkibGNkX2NzMF9uX3BuNCIsCi0JImxjZF9jczFfbl9wdzAiLAotCSJsY2RfcHdyMF9wYjIiLAotCSJsY2RfcHdyMl9wYzYiLAotCSJsY2Rfc2NrX3B6NCIsCi0JImxjZF9zZGluX3B6MiIsCi0JImxjZF9zZG91dF9wbjUiLAotCSJsY2Rfd3Jfbl9wejMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk2X2dyb3Vwc1tdID0gewotCSJzcGkyX2NzMF9uX3B4MyIsCi0JInNwaTJfbWlzb19weDEiLAotCSJzcGkyX21vc2lfcHgwIiwKLQkic3BpMl9zY2tfcHgyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzY2xrX2dyb3Vwc1tdID0gewotCSJzeXNfY2xrX3JlcV9wejUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXN0X2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHJhY2VfZ3JvdXBzW10gPSB7Ci0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGFfZ3JvdXBzW10gPSB7Ci0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0JInNkbW1jMV9jbGtfcHowIiwKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19jbWRfcGE3IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGJfZ3JvdXBzW10gPSB7Ci0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGNfZ3JvdXBzW10gPSB7Ci0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JImdtaV9hMTZfcGo3IiwKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9hMTlfcGs3IiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGVfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9kYXQwX3B5NyIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1bHBpX2dyb3Vwc1tdID0gewotCSJ1bHBpX2Nsa19weTAiLAotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMV9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDJfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AzX2dyb3Vwc1tdID0gewotCSJwYmIzIiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDRfZ3JvdXBzW10gPSB7Ci0JInBiYjQiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNV9ncm91cHNbXSA9IHsKLQkicGJiNSIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A2X2dyb3Vwc1tdID0gewotCSJwYmI2IiwKLQkic2RtbWM0X3JzdF9uX3BjYzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi0JInZpX2QwX3B0NCIsCi0JInZpX2QxX3BkNSIsCi0JInZpX2QxMF9wdDIiLAotCSJ2aV9kMTFfcHQzIiwKLQkidmlfZDJfcGwwIiwKLQkidmlfZDNfcGwxIiwKLQkidmlfZDRfcGwyIiwKLQkidmlfZDVfcGwzIiwKLQkidmlfZDZfcGw0IiwKLQkidmlfZDdfcGw1IiwKLQkidmlfZDhfcGw2IiwKLQkidmlfZDlfcGw3IiwKLQkidmlfaHN5bmNfcGQ3IiwKLQkidmlfbWNsa19wdDEiLAotCSJ2aV9wY2xrX3B0MCIsCi0JInZpX3ZzeW5jX3BkNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2FsdDFfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJ2aV9tY2xrX3B0MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2FsdDJfZ3JvdXBzW10gPSB7Ci0JInZpX21jbGtfcHQxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfYWx0M19ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi0JInZpX21jbGtfcHQxIiwKLX07CiAKICNkZWZpbmUgRlVOQ1RJT04oZm5hbWUpCQkJCQlcCiAJewkJCQkJCVwKIAkJLm5hbWUgPSAjZm5hbWUsCQkJCVwKLQkJLmdyb3VwcyA9IGZuYW1lIyNfZ3JvdXBzLAkJXAotCQkubmdyb3VwcyA9IEFSUkFZX1NJWkUoZm5hbWUjI19ncm91cHMpLAlcCiAJfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMzBfZnVuY3Rpb25zW10gPSB7CitzdGF0aWMgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMzBfZnVuY3Rpb25zW10gPSB7CiAJRlVOQ1RJT04oYmxpbmspLAogCUZVTkNUSU9OKGNlYyksCiAJRlVOQ1RJT04oY2xrXzEybV9vdXQpLApAQCAtMzM0NSwxMSArMjEwNSwxMSBAQAogCUZVTkNUSU9OKHZpX2FsdDMpLAogfTsKIAotI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX0EJMHg4NjgJLyogYmFuayAwICovCi0jZGVmaW5lIFBJTkdST1VQX1JFR19BCQkweDMwMDAJLyogYmFuayAxICovCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfQQkJMHg4NjgJLyogYmFuayAwICovCisjZGVmaW5lIFBJTkdST1VQX1JFR19BCQkJMHgzMDAwCS8qIGJhbmsgMSAqLwogCi0jZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpICgocikgLSBQSU5HUk9VUF9SRUdfQSkKLSNkZWZpbmUgUElOR1JPVVBfUkVHX04ocikgLTEKKyNkZWZpbmUgUElOR1JPVVBfUkVHX1kocikJCSgocikgLSBQSU5HUk9VUF9SRUdfQSkKKyNkZWZpbmUgUElOR1JPVVBfUkVHX04ocikJCS0xCiAKICNkZWZpbmUgUElOR1JPVVAocGdfbmFtZSwgZjAsIGYxLCBmMiwgZjMsIGZfc2FmZSwgciwgb2QsIGlvcikJXAogCXsJCQkJCQkJXApAQCAtMzM1NywxMiArMjExNywxMiBAQAogCQkucGlucyA9IHBnX25hbWUjI19waW5zLAkJCQlcCiAJCS5ucGlucyA9IEFSUkFZX1NJWkUocGdfbmFtZSMjX3BpbnMpLAkJXAogCQkuZnVuY3MgPSB7CQkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYwLAkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjEsCQkJXAotCQkJVEVHUkFfTVVYXyAjIyBmMiwJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYzLAkJCVwKKwkJCVRFR1JBX01VWF8jI2YwLAkJCQlcCisJCQlURUdSQV9NVVhfIyNmMSwJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjIsCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YzLAkJCQlcCiAJCX0sCQkJCQkJXAotCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyAjIyBmX3NhZmUsCQlcCisJCS5mdW5jX3NhZmUgPSBURUdSQV9NVVhfIyNmX3NhZmUsCQlcCiAJCS5tdXhfcmVnID0gUElOR1JPVVBfUkVHX1kociksCQkJXAogCQkubXV4X2JhbmsgPSAxLAkJCQkJXAogCQkubXV4X2JpdCA9IDAsCQkJCQlcCkBAIC0zMzg5LDYgKzIxNDksOSBAQAogCQkuZHJ2dHlwZV9yZWcgPSAtMSwJCQkJXAogCX0KIAorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX1kocikJCSgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfTihyKQkJLTEKKwogI2RlZmluZSBEUlZfUElOR1JPVVAocGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLAlcCiAJCSAgICAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywJXAogCQkgICAgIHNsd3JfYiwgc2x3cl93LCBzbHdmX2IsIHNsd2ZfdykJCVwKQEAgLTM0MDQsNyArMjE2Nyw3IEBACiAJCS5sb2NrX3JlZyA9IC0xLAkJCQkJXAogCQkuaW9yZXNldF9yZWcgPSAtMSwJCQkJXAogCQkucmN2X3NlbF9yZWcgPSAtMSwJCQkJXAotCQkuZHJ2X3JlZyA9ICgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpLAkJXAorCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfWShyKSwJCVwKIAkJLmRydl9iYW5rID0gMCwJCQkJCVwKIAkJLmhzbV9iaXQgPSBoc21fYiwJCQkJXAogCQkuc2NobWl0dF9iaXQgPSBzY2htaXR0X2IsCQkJXApAQCAtMzQyMiw3ICsyMTg1LDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9waW5ncm91cCB0ZWdyYTMwX2dyb3Vwc1tdID0gewogCS8qICAgICAgIHBnX25hbWUsICAgICAgICAgICAgICBmMCwgICAgICAgICAgIGYxLCAgICAgICAgICAgZjIsICAgICAgICAgICBmMywgICAgICAgICAgIHNhZmUsICAgICAgICAgciwgICAgICBvZCwgaW9yICovCi0JLyogRklYTUU6IEZpbGwgaW4gY29ycmVjdCBkYXRhIGluIHNhZmUgY29sdW1uICovCiAJUElOR1JPVVAoY2xrXzMya19vdXRfcGEwLCAgICAgIEJMSU5LLCAgICAgICAgUlNWRDIsICAgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICAgUlNWRDQsICAgICAgICAweDMzMWMsIE4sIE4pLAogCVBJTkdST1VQKHVhcnQzX2N0c19uX3BhMSwgICAgICBVQVJUQywgICAgICAgIFJTVkQyLCAgICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgIFJTVkQ0LCAgICAgICAgMHgzMTdjLCBOLCBOKSwKIAlQSU5HUk9VUChkYXAyX2ZzX3BhMiwgICAgICAgICAgSTJTMSwgICAgICAgICBIREEsICAgICAgICAgIFJTVkQzLCAgICAgICAgR01JLCAgICAgICAgICBSU1ZEMywgICAgICAgIDB4MzM1OCwgTiwgTiksCkBAIC0zNzM1LDYgKzI0OTcsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtcGlubXV4IiwgfSwKIAl7IH0sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdGVncmEzMF9waW5jdHJsX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmEzMF9waW5jdHJsX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewpAQCAtMzc0NSwyMCArMjUwOCw4IEBACiAJLnByb2JlID0gdGVncmEzMF9waW5jdHJsX3Byb2JlLAogCS5yZW1vdmUgPSB0ZWdyYV9waW5jdHJsX3JlbW92ZSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRlZ3JhMzBfcGluY3RybF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGVncmEzMF9waW5jdHJsX2RyaXZlcik7Ci19Ci1hcmNoX2luaXRjYWxsKHRlZ3JhMzBfcGluY3RybF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHRlZ3JhMzBfcGluY3RybF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRlZ3JhMzBfcGluY3RybF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodGVncmEzMF9waW5jdHJsX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYTMwX3BpbmN0cmxfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBXYXJyZW4gPHN3YXJyZW5AbnZpZGlhLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTlZJRElBIFRlZ3JhMzAgcGluY3RybCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhMzBfcGluY3RybF9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkwLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkwLmMKaW5kZXggYzM4MWFlNi4uNDgwOTM3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTAuYwpAQCAtMjI2MCw2ICsyMjYwLDQyIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF90eF9tdXhbXSA9IHsKIAlNU0lPRjBfVFhEX01BUkssCiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMSwgMjMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX2Nsa19iX211eFtdID0geworCU1TSU9GMF9TQ0tfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9iX3BpbnNbXSA9IHsKKwkvKiBTUzEgKi8KKwlSQ0FSX0dQX1BJTigxLCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MxX2JfbXV4W10gPSB7CisJTVNJT0YwX1NTMV9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2JfcGluc1tdID0geworCS8qIFNTMiAqLworCVJDQVJfR1BfUElOKDEsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczJfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU1MyX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigxLCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfYl9tdXhbXSA9IHsKKwlNU0lPRjBfUlhEX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF90eF9iX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigxLCAyOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfYl9tdXhbXSA9IHsKKwlNU0lPRjBfVFhEX0JfTUFSSywKK307CiAvKiAtIE1TSU9GMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX3BpbnNbXSA9IHsKIAkvKiBTQ0sgKi8KQEAgLTIzMDMsNiArMjMzOSw0MiBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfbXV4W10gPSB7CiAJTVNJT0YxX1RYRF9NQVJLLAogfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU0NLX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczFfYl9waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oMCwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMV9iX211eFtdID0geworCU1TSU9GMV9TUzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMl9iX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigwLCAxOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MyX2JfbXV4W10gPSB7CisJTVNJT0YxX1NTMl9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfYl9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMSwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2JfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfYl9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMCwgMjApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2JfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9CX01BUkssCit9OwogLyogLSBNU0lPRjIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19waW5zW10gPSB7CiAJLyogU0NLICovCkBAIC0yMzg5LDYgKzI0NjEsNTggQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3R4X211eFtdID0gewogCU1TSU9GM19UWERfTUFSSywKIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigwLCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19jbGtfYl9tdXhbXSA9IHsKKwlNU0lPRjNfU0NLX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19zeW5jX2JfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigwLCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19zeW5jX2JfbXV4W10gPSB7CisJTVNJT0YzX1NZTkNfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDAsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3J4X2JfbXV4W10gPSB7CisJTVNJT0YzX1JYRF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfdHhfYl9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMCwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfdHhfYl9tdXhbXSA9IHsKKwlNU0lPRjNfVFhEX0JfTUFSSywKK307CisvKiAtIFFTUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfcGluc1tdID0geworCS8qIFNQQ0xLLCBTU0wgKi8KKwlSQ0FSX0dQX1BJTigxLCA0KSwgUkNBUl9HUF9QSU4oMSwgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfbXV4W10gPSB7CisJU1BDTEtfTUFSSywgU1NMX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEgKi8KKwlSQ0FSX0dQX1BJTigxLCA1KSwgUkNBUl9HUF9QSU4oMSwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX211eFtdID0geworCU1PU0lfSU8wX01BUkssIE1JU09fSU8xX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEsIElPMiwgSU8zICovCisJUkNBUl9HUF9QSU4oMSwgNSksIFJDQVJfR1BfUElOKDEsIDYpLCBSQ0FSX0dQX1BJTigxLCA3KSwKKwlSQ0FSX0dQX1BJTigxLCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfbXV4W10gPSB7CisJTU9TSV9JTzBfTUFSSywgTUlTT19JTzFfTUFSSywgSU8yX01BUkssIElPM19NQVJLLAorfTsKIC8qIC0gU0NJRjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2RhdGFfcGluc1tdID0gewogCS8qIFJYLCBUWCAqLwpAQCAtMzIzMSw2ICszMzU1LDEzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVzYjBfbXV4W10gPSB7CiAJVVNCMF9QV0VOX01BUkssIFVTQjBfT1ZDX1ZCVVNfTUFSSywKIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVzYjBfb3ZjX3ZidXNfcGluc1tdID0geworCS8qIE9WQy9WQlVTICovCisJUkNBUl9HUF9QSU4oNSwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXNiMF9vdmNfdmJ1c19tdXhbXSA9IHsKKwlVU0IwX09WQ19WQlVTX01BUkssCit9OwogLyogLSBVU0IxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXNiMV9waW5zW10gPSB7CiAJLyogUFdFTiwgT1ZDICovCkBAIC0zNjUzLDEyICszNzg0LDIyIEBACiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MyKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9yeCksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfdHgpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4X2IpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2NsayksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luYyksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MxKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczIpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4KSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMV9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczJfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcnhfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHhfYiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczEpLApAQCAtMzY3MSw2ICszODEyLDEzIEBACiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjNfc3MyKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mM19yeCksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjNfdHgpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM19zeW5jX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX3R4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9jdHJsKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTIpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9kYXRhNCksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9kYXRhKSwKIAlTSF9QRkNfUElOX0dST1VQKHNjaWYwX2NsayksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9jdHJsKSwKQEAgLTM3ODksNiArMzkzNyw3IEBACiAJU0hfUEZDX1BJTl9HUk9VUCh0cHUwX3RvMiksCiAJU0hfUEZDX1BJTl9HUk9VUCh0cHUwX3RvMyksCiAJU0hfUEZDX1BJTl9HUk9VUCh1c2IwKSwKKwlTSF9QRkNfUElOX0dST1VQKHVzYjBfb3ZjX3ZidXMpLAogCVNIX1BGQ19QSU5fR1JPVVAodXNiMSksCiAJU0hfUEZDX1BJTl9HUk9VUCh1c2IyKSwKIAlWSU5fREFUQV9QSU5fR1JPVVAodmluMF9kYXRhLCAyNCksCkBAIC0zOTQxLDYgKzQwOTAsMTEgQEAKIAkibXNpb2YwX3NzMiIsCiAJIm1zaW9mMF9yeCIsCiAJIm1zaW9mMF90eCIsCisJIm1zaW9mMF9jbGtfYiIsCisJIm1zaW9mMF9zczFfYiIsCisJIm1zaW9mMF9zczJfYiIsCisJIm1zaW9mMF9yeF9iIiwKKwkibXNpb2YwX3R4X2IiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjFfZ3JvdXBzW10gPSB7CkBAIC0zOTUwLDYgKzQxMDQsMTEgQEAKIAkibXNpb2YxX3NzMiIsCiAJIm1zaW9mMV9yeCIsCiAJIm1zaW9mMV90eCIsCisJIm1zaW9mMV9jbGtfYiIsCisJIm1zaW9mMV9zczFfYiIsCisJIm1zaW9mMV9zczJfYiIsCisJIm1zaW9mMV9yeF9iIiwKKwkibXNpb2YxX3R4X2IiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjJfZ3JvdXBzW10gPSB7CkBAIC0zOTY4LDYgKzQxMjcsMTYgQEAKIAkibXNpb2YzX3NzMiIsCiAJIm1zaW9mM19yeCIsCiAJIm1zaW9mM190eCIsCisJIm1zaW9mM19jbGtfYiIsCisJIm1zaW9mM19zeW5jX2IiLAorCSJtc2lvZjNfcnhfYiIsCisJIm1zaW9mM190eF9iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXNwaV9ncm91cHNbXSA9IHsKKwkicXNwaV9jdHJsIiwKKwkicXNwaV9kYXRhMiIsCisJInFzcGlfZGF0YTQiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmMF9ncm91cHNbXSA9IHsKQEAgLTQxMzQsNiArNDMwMyw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiMF9ncm91cHNbXSA9IHsKIAkidXNiMCIsCisJInVzYjBfb3ZjX3ZidXMiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c2IxX2dyb3Vwc1tdID0gewpAQCAtNDIxMyw2ICs0MzgzLDcgQEAKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YxKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YyKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YzKSwKKwlTSF9QRkNfRlVOQ1RJT04ocXNwaSksCiAJU0hfUEZDX0ZVTkNUSU9OKHNjaWYwKSwKIAlTSF9QRkNfRlVOQ1RJT04oc2NpZjEpLAogCVNIX1BGQ19GVU5DVElPTihzY2lmMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMKaW5kZXggNTY3ZDY5MS4uNTE4NmQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTEuYwpAQCAtMTk0NSw2ICsxOTQ1LDUwIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzRfY19tdXhbXSA9IHsKIAlTQ0w0X0NfTUFSSywgU0RBNF9DX01BUkssCiB9OworLyogLSBJMkM3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjN19waW5zW10gPSB7CisJLyogU0NMLCBTREEgKi8KKwlSQ0FSX0dQX1BJTig1LCAxNSksIFJDQVJfR1BfUElOKDUsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfbXV4W10gPSB7CisJU0NMN19NQVJLLCBTREE3X01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X2JfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oMiwgMiksIFJDQVJfR1BfUElOKDIsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjN19iX211eFtdID0geworCVNDTDdfQl9NQVJLLCBTREE3X0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfY19waW5zW10gPSB7CisJLyogU0NMLCBTREEgKi8KKwlSQ0FSX0dQX1BJTig2LCAyOCksIFJDQVJfR1BfUElOKDYsIDI5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfY19tdXhbXSA9IHsKKwlTQ0w3X0NfTUFSSywgU0RBN19DX01BUkssCit9OworLyogLSBJMkM4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjOF9waW5zW10gPSB7CisJLyogU0NMLCBTREEgKi8KKwlSQ0FSX0dQX1BJTig0LCAxMyksIFJDQVJfR1BfUElOKDQsIDE0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfbXV4W10gPSB7CisJU0NMOF9NQVJLLCBTREE4X01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X2JfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oMiwgNCksIFJDQVJfR1BfUElOKDIsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjOF9iX211eFtdID0geworCVNDTDhfQl9NQVJLLCBTREE4X0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfY19waW5zW10gPSB7CisJLyogU0NMLCBTREEgKi8KKwlSQ0FSX0dQX1BJTig2LCAyMiksIFJDQVJfR1BfUElOKDYsIDIzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfY19tdXhbXSA9IHsKKwlTQ0w4X0NfTUFSSywgU0RBOF9DX01BUkssCit9OwogLyogLSBJTlRDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnEwX3BpbnNbXSA9IHsKIAkvKiBJUlEgKi8KQEAgLTIwNTEsNiArMjA5NSw5MiBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfbXV4W10gPSB7CiAJTVNJT0YwX1RYRF9NQVJLLAogfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDAsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU0NLX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zeW5jX2JfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigwLCAxNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19iX211eFtdID0geworCU1TSU9GMF9TWU5DX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfYl9waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oMCwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9iX211eFtdID0geworCU1TSU9GMF9TUzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9iX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigwLCAxOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2JfbXV4W10gPSB7CisJTVNJT0YwX1NTMl9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfYl9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMCwgMjEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2JfbXV4W10gPSB7CisJTVNJT0YwX1JYRF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfYl9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMCwgMjApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2JfbXV4W10gPSB7CisJTVNJT0YwX1RYRF9CX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfY19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNSwgMjYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX2Nsa19jX211eFtdID0geworCU1TSU9GMF9TQ0tfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3N5bmNfY19waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDUsIDI1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zeW5jX2NfbXV4W10gPSB7CisJTVNJT0YwX1NZTkNfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9jX3BpbnNbXSA9IHsKKwkvKiBTUzEgKi8KKwlSQ0FSX0dQX1BJTig1LCAyNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MxX2NfbXV4W10gPSB7CisJTVNJT0YwX1NTMV9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2NfcGluc1tdID0geworCS8qIFNTMiAqLworCVJDQVJfR1BfUElOKDUsIDI4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczJfY19tdXhbXSA9IHsKKwlNU0lPRjBfU1MyX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9yeF9jX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTig1LCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfY19tdXhbXSA9IHsKKwlNU0lPRjBfUlhEX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF90eF9jX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTig1LCAzMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfY19tdXhbXSA9IHsKKwlNU0lPRjBfVFhEX0NfTUFSSywKK307CiAvKiAtIE1TSU9GMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX3BpbnNbXSA9IHsKIAkvKiBTQ0sgKi8KQEAgLTIwOTQsNiArMjIyNCwxNDMgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X211eFtdID0gewogCU1TSU9GMV9UWERfTUFSSywKIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YxX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19iX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMiwgMzApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU1lOQ19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDIsIDMxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczFfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU1MxX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczJfYl9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oNywgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMl9iX211eFtdID0geworCU1TSU9GMV9TUzJfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDcsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9iX211eFtdID0geworCU1TSU9GMV9SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDcsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9iX211eFtdID0geworCU1TSU9GMV9UWERfQl9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2NfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDIsIDE1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfY19tdXhbXSA9IHsKKwlNU0lPRjFfU0NLX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2NfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19jX211eFtdID0geworCU1TSU9GMV9TWU5DX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9jX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigyLCAxOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfY19tdXhbXSA9IHsKKwlNU0lPRjFfUlhEX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9jX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfY19tdXhbXSA9IHsKKwlNU0lPRjFfVFhEX0NfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19kX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigwLCAyOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2RfbXV4W10gPSB7CisJTVNJT0YxX1NDS19EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19kX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMCwgMzApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfZF9tdXhbXSA9IHsKKwlNU0lPRjFfU1lOQ19EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2RfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDAsIDI5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczFfZF9tdXhbXSA9IHsKKwlNU0lPRjFfU1MxX0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9kX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigwLCAyNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfZF9tdXhbXSA9IHsKKwlNU0lPRjFfUlhEX0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9kX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigwLCAyNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfZF9tdXhbXSA9IHsKKwlNU0lPRjFfVFhEX0RfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19lX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTig1LCAxOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2VfbXV4W10gPSB7CisJTVNJT0YxX1NDS19FX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19lX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oNSwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfZV9tdXhbXSA9IHsKKwlNU0lPRjFfU1lOQ19FX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfZV9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oNSwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2VfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9FX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfZV9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oNSwgMjApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2VfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9FX01BUkssCit9OwogLyogLSBNU0lPRjIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19waW5zW10gPSB7CiAJLyogU0NLICovCkBAIC0yMTM3LDYgKzI0MDQsMTk3IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9tdXhbXSA9IHsKIAlNU0lPRjJfVFhEX01BUkssCiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMywgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YyX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19iX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMywgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19iX211eFtdID0geworCU1TSU9GMl9TWU5DX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczFfYl9waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oMywgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MxX2JfbXV4W10gPSB7CisJTVNJT0YyX1NTMV9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MyX2JfcGluc1tdID0geworCS8qIFNTMiAqLworCVJDQVJfR1BfUElOKDMsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMl9iX211eFtdID0geworCU1TSU9GMl9TUzJfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDMsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9iX211eFtdID0geworCU1TSU9GMl9SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDMsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9iX211eFtdID0geworCU1TSU9GMl9UWERfQl9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2NfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDIsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19jX211eFtdID0geworCU1TSU9GMl9TQ0tfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfY19waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDIsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfY19tdXhbXSA9IHsKKwlNU0lPRjJfU1lOQ19DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfY19waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMiwgNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfY19tdXhbXSA9IHsKKwlNU0lPRjJfUlhEX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9jX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigyLCA0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9jX211eFtdID0geworCU1TSU9GMl9UWERfQ19NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2RfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDIsIDE0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfZF9tdXhbXSA9IHsKKwlNU0lPRjJfU0NLX0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2RfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19kX211eFtdID0geworCU1TSU9GMl9TWU5DX0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczFfZF9waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oMiwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMV9kX211eFtdID0geworCU1TSU9GMl9TUzFfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMl9kX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigyLCAxOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MyX2RfbXV4W10gPSB7CisJTVNJT0YyX1NTMl9EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfZF9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMiwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2RfbXV4W10gPSB7CisJTVNJT0YyX1JYRF9EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfZF9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMiwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3R4X2RfbXV4W10gPSB7CisJTVNJT0YyX1RYRF9EX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfZV9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNywgMTUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19lX211eFtdID0geworCU1TSU9GMl9TQ0tfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfZV9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDcsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2VfbXV4W10gPSB7CisJTVNJT0YyX1NZTkNfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2VfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDcsIDE0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9lX211eFtdID0geworCU1TSU9GMl9SWERfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3R4X2VfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDcsIDEzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9lX211eFtdID0geworCU1TSU9GMl9UWERfRV9NQVJLLAorfTsKKy8qIC0gUVNQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfY3RybF9waW5zW10gPSB7CisJLyogU1BDTEssIFNTTCAqLworCVJDQVJfR1BfUElOKDEsIDQpLCBSQ0FSX0dQX1BJTigxLCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfY3RybF9tdXhbXSA9IHsKKwlTUENMS19NQVJLLCBTU0xfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTJfcGluc1tdID0geworCS8qIE1PU0lfSU8wLCBNSVNPX0lPMSAqLworCVJDQVJfR1BfUElOKDEsIDUpLCBSQ0FSX0dQX1BJTigxLCA2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTJfbXV4W10gPSB7CisJTU9TSV9JTzBfTUFSSywgTUlTT19JTzFfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfcGluc1tdID0geworCS8qIE1PU0lfSU8wLCBNSVNPX0lPMSwgSU8yLCBJTzMgKi8KKwlSQ0FSX0dQX1BJTigxLCA1KSwgUkNBUl9HUF9QSU4oMSwgNiksIFJDQVJfR1BfUElOKDEsIDcpLAorCVJDQVJfR1BfUElOKDEsIDgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9tdXhbXSA9IHsKKwlNT1NJX0lPMF9NQVJLLCBNSVNPX0lPMV9NQVJLLCBJTzJfTUFSSywgSU8zX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfY3RybF9iX3BpbnNbXSA9IHsKKwkvKiBTUENMSywgU1NMICovCisJUkNBUl9HUF9QSU4oNiwgMCksIFJDQVJfR1BfUElOKDYsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX2JfbXV4W10gPSB7CisJU1BDTEtfQl9NQVJLLCBTU0xfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9iX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEgKi8KKwlSQ0FSX0dQX1BJTig2LCAxKSwgUkNBUl9HUF9QSU4oNiwgMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX2JfbXV4W10gPSB7CisJTU9TSV9JTzBfQl9NQVJLLCBNSVNPX0lPMV9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X2JfcGluc1tdID0geworCS8qIE1PU0lfSU8wLCBNSVNPX0lPMSwgSU8yLCBJTzMgKi8KKwlSQ0FSX0dQX1BJTig2LCAxKSwgUkNBUl9HUF9QSU4oNiwgMiksIFJDQVJfR1BfUElOKDYsIDMpLAorCVJDQVJfR1BfUElOKDYsIDQpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9iX211eFtdID0geworCVNQQ0xLX0JfTUFSSywgTU9TSV9JTzBfQl9NQVJLLCBNSVNPX0lPMV9CX01BUkssCisJSU8yX0JfTUFSSywgSU8zX0JfTUFSSywgU1NMX0JfTUFSSywKK307CiAvKiAtIFNDSUYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9kYXRhX3BpbnNbXSA9IHsKIAkvKiBSWCwgVFggKi8KQEAgLTMxMjUsNiArMzU4MywxMiBAQAogCVNIX1BGQ19QSU5fR1JPVVAoaTJjNCksCiAJU0hfUEZDX1BJTl9HUk9VUChpMmM0X2IpLAogCVNIX1BGQ19QSU5fR1JPVVAoaTJjNF9jKSwKKwlTSF9QRkNfUElOX0dST1VQKGkyYzcpLAorCVNIX1BGQ19QSU5fR1JPVVAoaTJjN19iKSwKKwlTSF9QRkNfUElOX0dST1VQKGkyYzdfYyksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM4KSwKKwlTSF9QRkNfUElOX0dST1VQKGkyYzhfYiksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM4X2MpLAogCVNIX1BGQ19QSU5fR1JPVVAoaW50Y19pcnEwKSwKIAlTSF9QRkNfUElOX0dST1VQKGludGNfaXJxMSksCiAJU0hfUEZDX1BJTl9HUk9VUChpbnRjX2lycTIpLApAQCAtMzEzOSwxOCArMzYwMyw3NSBAQAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3luY19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX2Nsa19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zeW5jX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMV9jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczJfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfcnhfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfdHhfYyksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfY2xrKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zeW5jKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczEpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luY19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3R4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2Nsa19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zeW5jX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3R4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2Nsa19kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zeW5jX2QpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMV9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeF9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eF9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGtfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luY19lKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeF9lKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eF9lKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9jbGspLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3N5bmMpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMSksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3MyKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9yeCksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHgpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMV9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczJfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcnhfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHhfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3N5bmNfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcnhfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHhfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrX2QpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3N5bmNfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3MxX2QpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMl9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9yeF9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl90eF9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9jbGtfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3luY19lKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9yeF9lKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl90eF9lKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGEyKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTQpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9jdHJsX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9kYXRhMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTRfYiksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9kYXRhKSwKIAlTSF9QRkNfUElOX0dST1VQKHNjaWYwX2RhdGFfYiksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9kYXRhX2MpLApAQCAtMzMzNyw2ICszODU4LDE4IEBACiAJImkyYzRfYyIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzdfZ3JvdXBzW10gPSB7CisJImkyYzciLAorCSJpMmM3X2IiLAorCSJpMmM3X2MiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmM4X2dyb3Vwc1tdID0geworCSJpMmM4IiwKKwkiaTJjOF9iIiwKKwkiaTJjOF9jIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW50Y19ncm91cHNbXSA9IHsKIAkiaW50Y19pcnEwIiwKIAkiaW50Y19pcnExIiwKQEAgLTMzNTgsNiArMzg5MSwxOCBAQAogCSJtc2lvZjBfc3MyIiwKIAkibXNpb2YwX3J4IiwKIAkibXNpb2YwX3R4IiwKKwkibXNpb2YwX2Nsa19iIiwKKwkibXNpb2YwX3N5bmNfYiIsCisJIm1zaW9mMF9zczFfYiIsCisJIm1zaW9mMF9zczJfYiIsCisJIm1zaW9mMF9yeF9iIiwKKwkibXNpb2YwX3R4X2IiLAorCSJtc2lvZjBfY2xrX2MiLAorCSJtc2lvZjBfc3luY19jIiwKKwkibXNpb2YwX3NzMV9jIiwKKwkibXNpb2YwX3NzMl9jIiwKKwkibXNpb2YwX3J4X2MiLAorCSJtc2lvZjBfdHhfYyIsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zaW9mMV9ncm91cHNbXSA9IHsKQEAgLTMzNjcsNiArMzkxMiwyNSBAQAogCSJtc2lvZjFfc3MyIiwKIAkibXNpb2YxX3J4IiwKIAkibXNpb2YxX3R4IiwKKwkibXNpb2YxX2Nsa19iIiwKKwkibXNpb2YxX3N5bmNfYiIsCisJIm1zaW9mMV9zczFfYiIsCisJIm1zaW9mMV9zczJfYiIsCisJIm1zaW9mMV9yeF9iIiwKKwkibXNpb2YxX3R4X2IiLAorCSJtc2lvZjFfY2xrX2MiLAorCSJtc2lvZjFfc3luY19jIiwKKwkibXNpb2YxX3J4X2MiLAorCSJtc2lvZjFfdHhfYyIsCisJIm1zaW9mMV9jbGtfZCIsCisJIm1zaW9mMV9zeW5jX2QiLAorCSJtc2lvZjFfc3MxX2QiLAorCSJtc2lvZjFfcnhfZCIsCisJIm1zaW9mMV90eF9kIiwKKwkibXNpb2YxX2Nsa19lIiwKKwkibXNpb2YxX3N5bmNfZSIsCisJIm1zaW9mMV9yeF9lIiwKKwkibXNpb2YxX3R4X2UiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjJfZ3JvdXBzW10gPSB7CkBAIC0zMzc2LDYgKzM5NDAsMzUgQEAKIAkibXNpb2YyX3NzMiIsCiAJIm1zaW9mMl9yeCIsCiAJIm1zaW9mMl90eCIsCisJIm1zaW9mMl9jbGtfYiIsCisJIm1zaW9mMl9zeW5jX2IiLAorCSJtc2lvZjJfc3MxX2IiLAorCSJtc2lvZjJfc3MyX2IiLAorCSJtc2lvZjJfcnhfYiIsCisJIm1zaW9mMl90eF9iIiwKKwkibXNpb2YyX2Nsa19jIiwKKwkibXNpb2YyX3N5bmNfYyIsCisJIm1zaW9mMl9yeF9jIiwKKwkibXNpb2YyX3R4X2MiLAorCSJtc2lvZjJfY2xrX2QiLAorCSJtc2lvZjJfc3luY19kIiwKKwkibXNpb2YyX3NzMV9kIiwKKwkibXNpb2YyX3NzMl9kIiwKKwkibXNpb2YyX3J4X2QiLAorCSJtc2lvZjJfdHhfZCIsCisJIm1zaW9mMl9jbGtfZSIsCisJIm1zaW9mMl9zeW5jX2UiLAorCSJtc2lvZjJfcnhfZSIsCisJIm1zaW9mMl90eF9lIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXNwaV9ncm91cHNbXSA9IHsKKwkicXNwaV9jdHJsIiwKKwkicXNwaV9kYXRhMiIsCisJInFzcGlfZGF0YTQiLAorCSJxc3BpX2N0cmxfYiIsCisJInFzcGlfZGF0YTJfYiIsCisJInFzcGlfZGF0YTRfYiIsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNjaWYwX2dyb3Vwc1tdID0gewpAQCAtMzU2OCwxMSArNDE2MSwxNCBAQAogCVNIX1BGQ19GVU5DVElPTihpMmMyKSwKIAlTSF9QRkNfRlVOQ1RJT04oaTJjMyksCiAJU0hfUEZDX0ZVTkNUSU9OKGkyYzQpLAorCVNIX1BGQ19GVU5DVElPTihpMmM3KSwKKwlTSF9QRkNfRlVOQ1RJT04oaTJjOCksCiAJU0hfUEZDX0ZVTkNUSU9OKGludGMpLAogCVNIX1BGQ19GVU5DVElPTihtbWMpLAogCVNIX1BGQ19GVU5DVElPTihtc2lvZjApLAogCVNIX1BGQ19GVU5DVElPTihtc2lvZjEpLAogCVNIX1BGQ19GVU5DVElPTihtc2lvZjIpLAorCVNIX1BGQ19GVU5DVElPTihxc3BpKSwKIAlTSF9QRkNfRlVOQ1RJT04oc2NpZjApLAogCVNIX1BGQ19GVU5DVElPTihzY2lmMSksCiAJU0hfUEZDX0ZVTkNUSU9OKHNjaWYyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM2LmMgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNi5jCmluZGV4IDJiOWYzMjAuLmM0ZGQzZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM2LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1hdGxhczYuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBwaW5jdHJsIHBhZHMsIGdyb3VwcywgZnVuY3Rpb25zIGZvciBDU1IgU2lSRmF0bGFzVkkKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE0IENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cAorICogY29tcGFueS4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqLwpAQCAtNTI5LDYgKzUzMCw0MCBAQAogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgdXNwMF9waW5zW10gPSB7IDUxLCA1MiwgNTMsIDU0LCA1NSB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpcmZzb2NfbXV4bWFzayB1c3AwX29ubHlfdXRmc19tdXhtYXNrW10gPSB7CisJeworCQkuZ3JvdXAgPSAxLAorCQkubWFzayA9IEJJVCgxOSkgfCBCSVQoMjApIHwgQklUKDIxKSB8IEJJVCgyMiksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lyZnNvY19wYWRtdXggdXNwMF9vbmx5X3V0ZnNfcGFkbXV4ID0geworCS5tdXhtYXNrX2NvdW50cyA9IEFSUkFZX1NJWkUodXNwMF9vbmx5X3V0ZnNfbXV4bWFzayksCisJLm11eG1hc2sgPSB1c3AwX29ubHlfdXRmc19tdXhtYXNrLAorCS5jdHJscmVnID0gU0lSRlNPQ19SU0NfUElOX01VWCwKKwkuZnVuY21hc2sgPSBCSVQoMSkgfCBCSVQoMikgfCBCSVQoNiksCisJLmZ1bmN2YWwgPSAwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVzcDBfb25seV91dGZzX3BpbnNbXSA9IHsgNTEsIDUyLCA1MywgNTQgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaXJmc29jX211eG1hc2sgdXNwMF9vbmx5X3VyZnNfbXV4bWFza1tdID0geworCXsKKwkJLmdyb3VwID0gMSwKKwkJLm1hc2sgPSBCSVQoMTkpIHwgQklUKDIwKSB8IEJJVCgyMSkgfCBCSVQoMjMpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpcmZzb2NfcGFkbXV4IHVzcDBfb25seV91cmZzX3BhZG11eCA9IHsKKwkubXV4bWFza19jb3VudHMgPSBBUlJBWV9TSVpFKHVzcDBfb25seV91cmZzX211eG1hc2spLAorCS5tdXhtYXNrID0gdXNwMF9vbmx5X3VyZnNfbXV4bWFzaywKKwkuY3RybHJlZyA9IFNJUkZTT0NfUlNDX1BJTl9NVVgsCisJLmZ1bmNtYXNrID0gQklUKDEpIHwgQklUKDIpIHwgQklUKDkpLAorCS5mdW5jdmFsID0gMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1c3AwX29ubHlfdXJmc19waW5zW10gPSB7IDUxLCA1MiwgNTMsIDU1IH07CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lyZnNvY19tdXhtYXNrIHVzcDBfdWFydF9ub3N0cmVhbWN0cmxfbXV4bWFza1tdID0gewogCXsKIAkJLmdyb3VwID0gMSwKQEAgLTkwNSw2ICs5NDAsOCBAQAogCVNJUkZTT0NfUElOX0dST1VQKCJ1c3AwZ3JwIiwgdXNwMF9waW5zKSwKIAlTSVJGU09DX1BJTl9HUk9VUCgidXNwMF91YXJ0X25vc3RyZWFtY3RybF9ncnAiLAogCQkJCQl1c3AwX3VhcnRfbm9zdHJlYW1jdHJsX3BpbnMpLAorCVNJUkZTT0NfUElOX0dST1VQKCJ1c3AwX29ubHlfdXRmc19ncnAiLCB1c3AwX29ubHlfdXRmc19waW5zKSwKKwlTSVJGU09DX1BJTl9HUk9VUCgidXNwMF9vbmx5X3VyZnNfZ3JwIiwgdXNwMF9vbmx5X3VyZnNfcGlucyksCiAJU0lSRlNPQ19QSU5fR1JPVVAoInVzcDFncnAiLCB1c3AxX3BpbnMpLAogCVNJUkZTT0NfUElOX0dST1VQKCJ1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX2dycCIsCiAJCQkJCXVzcDFfdWFydF9ub3N0cmVhbWN0cmxfcGlucyksCkBAIC05NTMsNiArOTkwLDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMF91YXJ0X25vc3RyZWFtY3RybF9ncnBbXSA9IHsKIAkJCQkJInVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c3AwZ3JwW10gPSB7ICJ1c3AwZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c3AwX29ubHlfdXRmc19ncnBbXSA9IHsgInVzcDBfb25seV91dGZzX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMF9vbmx5X3VyZnNfZ3JwW10gPSB7ICJ1c3AwX29ubHlfdXJmc19ncnAiIH07CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMWdycFtdID0geyAidXNwMWdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMV91YXJ0X25vc3RyZWFtY3RybF9ncnBbXSA9IHsKIAkJCQkJInVzcDFfdWFydF9ub3N0cmVhbWN0cmxfZ3JwIiB9OwpAQCAtMTAwMyw2ICsxMDQzLDEwIEBACiAJU0lSRlNPQ19QTVhfRlVOQ1RJT04oInVzcDBfdWFydF9ub3N0cmVhbWN0cmwiLAogCQkJCQkJdXNwMF91YXJ0X25vc3RyZWFtY3RybF9ncnAsCiAJCQkJCQl1c3AwX3VhcnRfbm9zdHJlYW1jdHJsX3BhZG11eCksCisJU0lSRlNPQ19QTVhfRlVOQ1RJT04oInVzcDBfb25seV91dGZzIiwgdXNwMF9vbmx5X3V0ZnNfZ3JwLAorCQkJCQkJdXNwMF9vbmx5X3V0ZnNfcGFkbXV4KSwKKwlTSVJGU09DX1BNWF9GVU5DVElPTigidXNwMF9vbmx5X3VyZnMiLCB1c3AwX29ubHlfdXJmc19ncnAsCisJCQkJCQl1c3AwX29ubHlfdXJmc19wYWRtdXgpLAogCVNJUkZTT0NfUE1YX0ZVTkNUSU9OKCJ1c3AxIiwgdXNwMWdycCwgdXNwMV9wYWRtdXgpLAogCVNJUkZTT0NfUE1YX0ZVTkNUSU9OKCJ1c3AxX3VhcnRfbm9zdHJlYW1jdHJsIiwKIAkJCQkJCXVzcDFfdWFydF9ub3N0cmVhbWN0cmxfZ3JwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1wcmltYTIuYyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtcHJpbWEyLmMKaW5kZXggZGRlMDI4NS4uOGFhNzZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1wcmltYTIuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXByaW1hMi5jCkBAIC0xLDcgKzEsOCBAQAogLyoKICAqIHBpbmN0cmwgcGFkcywgZ3JvdXBzLCBmdW5jdGlvbnMgZm9yIENTUiBTaVJGcHJpbWFJSQogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqIENvcHlyaWdodCAoYykgMjAxMSAtIDIwMTQgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwCisgKiBjb21wYW55LgogICoKICAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jCmluZGV4IDYxN2E0OTEuLjVmM2FkYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jCkBAIC0xLDcgKzEsOCBAQAogLyoKICAqIHBpbm11eCBkcml2ZXIgZm9yIENTUiBTaVJGcHJpbWFJSQogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqIENvcHlyaWdodCAoYykgMjAxMSAtIDIwMTQgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwCisgKiBjb21wYW55LgogICoKICAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKaW5kZXggZGVmYjZhZi4uOTRiYjYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwpAQCAtNjc3Niw4ICs2Nzc2LDkgQEAKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGxfbXV0ZTsKIAlpbnQgcmM7CiAKLQlyYyA9IHNuZF9jYXJkX2NyZWF0ZShhbHNhX2luZGV4LCBhbHNhX2lkLCBUSElTX01PRFVMRSwKLQkJCSAgICBzaXplb2Yoc3RydWN0IHRwYWNwaV9hbHNhX2RhdGEpLCAmY2FyZCk7CisJcmMgPSBzbmRfY2FyZF9uZXcoJnRwYWNwaV9wZGV2LT5kZXYsCisJCQkgIGFsc2FfaW5kZXgsIGFsc2FfaWQsIFRISVNfTU9EVUxFLAorCQkJICBzaXplb2Yoc3RydWN0IHRwYWNwaV9hbHNhX2RhdGEpLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCB8fCAhY2FyZCkgewogCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgQUxTQSBjYXJkIHN0cnVjdHVyZXM6ICVkXG4iLCByYyk7CiAJCXJldHVybiAxOwpAQCAtNjgyOCw3ICs2ODI5LDYgQEAKIAl9CiAJZGF0YS0+Y3RsX211dGVfaWQgPSAmY3RsX211dGUtPmlkOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdHBhY3BpX3BkZXYtPmRldik7CiAJcmMgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIEFMU0EgY2FyZDogJWRcbiIsIHJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvYmlvc2NhbGxzLmMgYi9kcml2ZXJzL3BucC9wbnBiaW9zL2Jpb3NjYWxscy5jCmluZGV4IDc2OWQyNjUuLmRlYjdmNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvYmlvc2NhbGxzLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9iaW9zY2FsbHMuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSAicG5wYmlvcy5oIgogCi1zdGF0aWMgc3RydWN0IHsKK19fdmlzaWJsZSBzdHJ1Y3QgewogCXUxNiBvZmZzZXQ7CiAJdTE2IHNlZ21lbnQ7CiB9IHBucF9iaW9zX2NhbGxwb2ludDsKQEAgLTQxLDYgKzQxLDcgQEAKIAogX19hc21fXygiLnRleHQJCQlcbiIKIAlfX0FMSUdOX1NUUiAiXG4iCisJIi5nbG9ibCBwbnBfYmlvc19jYWxsZnVuY1xuIgogCSJwbnBfYmlvc19jYWxsZnVuYzpcbiIKIAkiCXB1c2hsICVlZHgJXG4iCiAJIglwdXNobCAlZWN4CVxuIgpAQCAtNjYsOSArNjcsOSBAQAogICogYWZ0ZXIgUG5QIEJJT1Mgb29wc2VzLgogICovCiAKLXUzMiBwbnBfYmlvc19mYXVsdF9lc3A7Ci11MzIgcG5wX2Jpb3NfZmF1bHRfZWlwOwotdTMyIHBucF9iaW9zX2lzX3V0dGVyX2NyYXAgPSAwOworX192aXNpYmxlIHUzMiBwbnBfYmlvc19mYXVsdF9lc3A7CitfX3Zpc2libGUgdTMyIHBucF9iaW9zX2ZhdWx0X2VpcDsKK19fdmlzaWJsZSB1MzIgcG5wX2Jpb3NfaXNfdXR0ZXJfY3JhcCA9IDA7CiAKIHN0YXRpYyBzcGlubG9ja190IHBucF9iaW9zX2xvY2s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jIGIvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMKaW5kZXggZmI3MzAwOC4uYmMxZTUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMKKysrIGIvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMKQEAgLTY5OSw4ICs2OTksNiBAQAogCiAJQlVHX09OKCFieXRlcyk7CiAKLQlQUkVQQVJFX1dPUksoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrLCBwczNfdnVhcnRfd29yayk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBieXRlcykgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc2NoZWR1bGVfd29yayAleGggYnl0ZXNcbiIsCkBAIC0xMDUyLDcgKzEwNTAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5yeF9saXN0LmhlYWQpOwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5yeF9saXN0LmxvY2spOwogCi0JSU5JVF9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgTlVMTCk7CisJSU5JVF9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgcHMzX3Z1YXJ0X3dvcmspOwogCXByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyID0gMDsKIAlwcml2LT5yeF9saXN0LndvcmsuZGV2ID0gZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODAwLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODAwLmMKaW5kZXggZDMzM2Y3ZS4uN2E3MjFkNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04MDAuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODAwLmMKQEAgLTMxMCwxMCArMzEwLDggQEAKIAogCXBtODAwX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbTgwMF9kYXRhKSwKIAkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbTgwMF9kYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBwbTgwMF9yZWd1YWx0b3JzIik7CisJaWYgKCFwbTgwMF9kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwbTgwMF9kYXRhLT5tYXAgPSBjaGlwLT5zdWJjaGlwLT5yZWdtYXBfcG93ZXI7CiAJcG04MDBfZGF0YS0+Y2hpcCA9IGNoaXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYwppbmRleCBmNzA0ZDgzLi4zMzc2MzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMKQEAgLTIsNyArMiw3IEBACiAgKiBSZWd1bGF0b3JzIGRyaXZlciBmb3IgTWFydmVsbCA4OFBNODYwNwogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgotICogCUhhb2ppYW4gWmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KKyAqCUhhb2ppYW4gWmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTc4LDcgKzc4LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgQlVDSzNfdGFibGVbXSA9IHsKLSAgICAgICAgICAgICAgMCwgICAyNTAwMCwgICA1MDAwMCwgICA3NTAwMCwgIDEwMDAwMCwgIDEyNTAwMCwgIDE1MDAwMCwgIDE3NTAwMCwKKwkgICAgICAwLCAgIDI1MDAwLCAgIDUwMDAwLCAgIDc1MDAwLCAgMTAwMDAwLCAgMTI1MDAwLCAgMTUwMDAwLCAgMTc1MDAwLAogCSAyMDAwMDAsICAyMjUwMDAsICAyNTAwMDAsICAyNzUwMDAsICAzMDAwMDAsICAzMjUwMDAsICAzNTAwMDAsICAzNzUwMDAsCiAJIDQwMDAwMCwgIDQyNTAwMCwgIDQ1MDAwMCwgIDQ3NTAwMCwgIDUwMDAwMCwgIDUyNTAwMCwgIDU1MDAwMCwgIDU3NTAwMCwKIAkgNjAwMDAwLCAgNjI1MDAwLCAgNjUwMDAwLCAgNjc1MDAwLCAgNzAwMDAwLCAgNzI1MDAwLCAgNzUwMDAwLCAgNzc1MDAwLApAQCAtODksNyArODksNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBCVUNLM19zdXNwZW5kX3RhYmxlW10gPSB7Ci0gICAgICAgICAgICAgIDAsICAgMjUwMDAsICAgNTAwMDAsICAgNzUwMDAsICAxMDAwMDAsICAxMjUwMDAsICAxNTAwMDAsICAxNzUwMDAsCisJICAgICAgMCwgICAyNTAwMCwgICA1MDAwMCwgICA3NTAwMCwgIDEwMDAwMCwgIDEyNTAwMCwgIDE1MDAwMCwgIDE3NTAwMCwKIAkgMjAwMDAwLCAgMjI1MDAwLCAgMjUwMDAwLCAgMjc1MDAwLCAgMzAwMDAwLCAgMzI1MDAwLCAgMzUwMDAwLCAgMzc1MDAwLAogCSA0MDAwMDAsICA0MjUwMDAsICA0NTAwMDAsICA0NzUwMDAsICA1MDAwMDAsICA1MjUwMDAsICA1NTAwMDAsICA1NzUwMDAsCiAJIDYwMDAwMCwgIDYyNTAwMCwgIDY1MDAwMCwgIDY3NTAwMCwgIDcwMDAwMCwgIDcyNTAwMCwgIDc1MDAwMCwgIDc3NTAwMCwKQEAgLTMyMiw3ICszMjIsNyBAQAogCW5wcm9vdCA9IG9mX25vZGVfZ2V0KHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpOwogCWlmICghbnByb290KQogCQlyZXR1cm4gLUVOT0RFVjsKLQlucHJvb3QgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CisJbnByb290ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOwogCWlmICghbnByb290KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBmaW5kIHJlZ3VsYXRvcnMgbm9kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKaW5kZXggNmE3OTMyOC4uMWNkODU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCkBAIC0xMzksNiArMTM5LDE0IEBACiAJICBBUzM3MjIgUE1JQy4gVGhpcyB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciBhbGwgdGhlIHNvZnR3YXJlCiAJICBjb250cm9sbGFibGUgRENEQy9MRE8gcmVndWxhdG9ycy4KIAorY29uZmlnIFJFR1VMQVRPUl9CQ001OTBYWAorCXRyaXN0YXRlICJCcm9hZGNvbSBCQ001OTB4eCBQTVUgUmVndWxhdG9ycyIKKwlkZXBlbmRzIG9uIE1GRF9CQ001OTBYWAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSB2b2x0YWdlIHJlZ3VsYXRvcnMgb24gdGhlCisJICBCQ001OTB4eCBQTVVzLiBUaGlzIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBzb2Z0d2FyZQorCSAgY29udHJvbGxhYmxlIExETy9Td2l0Y2hpbmcgcmVndWxhdG9ycy4KKwogY29uZmlnIFJFR1VMQVRPUl9EQTkwM1gKIAl0cmlzdGF0ZSAiRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDMwL0RBOTAzNCByZWd1bGF0b3JzIgogCWRlcGVuZHMgb24gUE1JQ19EQTkwM1gKQEAgLTM5OSwxMiArNDA3LDEyIEBACiAJIG9uIFBDRjUwNjMzCiAKIGNvbmZpZyBSRUdVTEFUT1JfUEZVWkUxMDAKLQl0cmlzdGF0ZSAiRnJlZXNjYWxlIFBGVVpFMTAwIHJlZ3VsYXRvciBkcml2ZXIiCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBQRlVaRTEwMC9QRlVaRTIwMCByZWd1bGF0b3IgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCi0JICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIHJlZ3VsYXRvcnMgZm91bmQgb24gdGhlIEZyZWVzY2FsZSBQRlVaRTEwMAotCSAgUE1JQy4KKwkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgcmVndWxhdG9ycyBmb3VuZCBvbiB0aGUgRnJlZXNjYWxlCisJICBQRlVaRTEwMC9QRlVaRTIwMCBQTUlDLgogCiBjb25maWcgUkVHVUxBVE9SX1JDNVQ1ODMKIAl0cmlzdGF0ZSAiUklDT0ggUkM1VDU4MyBQb3dlciByZWd1bGF0b3JzIgpAQCAtNDE2LDEzICs0MjQsMjEgQEAKIAkgIHRocm91Z2ggcmVndWxhdG9yIGludGVyZmFjZS4gVGhlIGRldmljZSBzdXBwb3J0cyBtdWx0aXBsZSBEQ0RDL0xETwogCSAgb3V0cHV0cyB3aGljaCBjYW4gYmUgY29udHJvbGxlZCBieSBpMmMgY29tbXVuaWNhdGlvbi4KIAotY29uZmlnIFJFR1VMQVRPUl9TMk1QUzExCi0JdHJpc3RhdGUgIlNhbXN1bmcgUzJNUFMxMSB2b2x0YWdlIHJlZ3VsYXRvciIKK2NvbmZpZyBSRUdVTEFUT1JfUzJNUEEwMQorCXRyaXN0YXRlICJTYW1zdW5nIFMyTVBBMDEgdm9sdGFnZSByZWd1bGF0b3IiCiAJZGVwZW5kcyBvbiBNRkRfU0VDX0NPUkUKIAloZWxwCi0JIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgU2Ftc3VuZyBTMk1QUzExIHZvbHRhZ2Ugb3V0cHV0IHJlZ3VsYXRvcgotCSB2aWEgSTJDIGJ1cy4gUzJNUFMxMSBpcyBjb21wcmlzZWQgb2YgaGlnaCBlZmZpY2llbnQgQnVjayBjb252ZXJ0ZXJzCi0JIGluY2x1ZGluZyBEdWFsLVBoYXNlIEJ1Y2sgY29udmVydGVyLCBCdWNrLUJvb3N0IGNvbnZlcnRlciwgdmFyaW91cyBMRE9zLgorCSBUaGlzIGRyaXZlciBjb250cm9scyBTYW1zdW5nIFMyTVBBMDEgdm9sdGFnZSBvdXRwdXQgcmVndWxhdG9yCisJIHZpYSBJMkMgYnVzLiBTMk1QQTAxIGhhcyAxMCBCdWNrcyBhbmQgMjYgTERPIG91dHB1dHMuCisKK2NvbmZpZyBSRUdVTEFUT1JfUzJNUFMxMQorCXRyaXN0YXRlICJTYW1zdW5nIFMyTVBTMTEvUzJNUFMxNCB2b2x0YWdlIHJlZ3VsYXRvciIKKwlkZXBlbmRzIG9uIE1GRF9TRUNfQ09SRQorCWhlbHAKKwkgVGhpcyBkcml2ZXIgc3VwcG9ydHMgYSBTYW1zdW5nIFMyTVBTMTEvUzJNUFMxNCB2b2x0YWdlIG91dHB1dAorCSByZWd1bGF0b3IgdmlhIEkyQyBidXMuIFRoZSBjaGlwIGlzIGNvbXByaXNlZCBvZiBoaWdoIGVmZmljaWVudCBCdWNrCisJIGNvbnZlcnRlcnMgaW5jbHVkaW5nIER1YWwtUGhhc2UgQnVjayBjb252ZXJ0ZXIsIEJ1Y2stQm9vc3QgY29udmVydGVyLAorCSB2YXJpb3VzIExET3MuCiAKIGNvbmZpZyBSRUdVTEFUT1JfUzVNODc2NwogCXRyaXN0YXRlICJTYW1zdW5nIFM1TTg3NjdBIHZvbHRhZ2UgcmVndWxhdG9yIgpAQCAtNDMyLDYgKzQ0OCwxMiBAQAogCSB2aWEgSTJDIGJ1cy4gUzVNODc2N0EgaGF2ZSA5IEJ1Y2tzIGFuZCAyOCBMRE9zIG91dHB1dCBhbmQKIAkgc3VwcG9ydHMgRFZTIG1vZGUgd2l0aCA4Yml0cyBvZiBvdXRwdXQgdm9sdGFnZSBjb250cm9sLgogCitjb25maWcgUkVHVUxBVE9SX1NUX1BXTQorCXRyaXN0YXRlICJTVE1pY3JvZWxlY3Ryb25pY3MgUFdNIHZvbHRhZ2UgcmVndWxhdG9yIgorCWRlcGVuZHMgb24gQVJDSF9TVEkKKwloZWxwCisJIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFNUJ3MgUFdNIGNvbnRyb2xsZWQgdm9sdGFnZSByZWd1bGF0b3JzLgorCiBjb25maWcgUkVHVUxBVE9SX1RJX0FCQgogCXRyaXN0YXRlICJUSSBBZGFwdGl2ZSBCb2R5IEJpYXMgb24tY2hpcCBMRE8iCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAKQEAgLTUxMyw2ICs1MzUsMTUgQEAKIAkgIHZvbHRhZ2UgcmVndWxhdG9ycy4gSXQgc3VwcG9ydHMgc29mdHdhcmUgYmFzZWQgdm9sdGFnZSBjb250cm9sCiAJICBmb3IgZGlmZmVyZW50IHZvbHRhZ2UgZG9tYWlucwogCitjb25maWcgUkVHVUxBVE9SX1RQUzY1MjE4CisJdHJpc3RhdGUgIlRJIFRQUzY1MjE4IFBvd2VyIHJlZ3VsYXRvcnMiCisJZGVwZW5kcyBvbiBNRkRfVFBTNjUyMTggJiYgT0YKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBUUFM2NTIxOCB2b2x0YWdlIHJlZ3VsYXRvciBjaGlwcy4gVFBTNjUyMTgKKwkgIHByb3ZpZGVzIHNpeCBzdGVwLWRvd24gY29udmVydGVycyBhbmQgb25lIGdlbmVyYWwtcHVycG9zZSBMRE8KKwkgIHZvbHRhZ2UgcmVndWxhdG9ycy4gSXQgc3VwcG9ydHMgc29mdHdhcmUgYmFzZWQgdm9sdGFnZSBjb250cm9sCisJICBmb3IgZGlmZmVyZW50IHZvbHRhZ2UgZG9tYWlucworCiBjb25maWcgUkVHVUxBVE9SX1RQUzY1MjRYCiAJdHJpc3RhdGUgIlRJIFRQUzY1MjRYIFBvd2VyIHJlZ3VsYXRvcnMiCiAJZGVwZW5kcyBvbiBTUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKaW5kZXggOTc5ZjlkZC4uZjBmZTBjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQVJJWk9OQSkgKz0gYXJpem9uYS1taWNzdXBwLm8gYXJpem9uYS1sZG8xLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQVMzNzExKSArPSBhczM3MTEtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQVMzNzIyKSArPSBhczM3MjItcmVndWxhdG9yLm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfQkNNNTkwWFgpICs9IGJjbTU5MHh4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0RBOTAzWCkJKz0gZGE5MDN4Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfREE5MDUyKQkrPSBkYTkwNTItcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfREE5MDU1KQkrPSBkYTkwNTUtcmVndWxhdG9yLm8KQEAgLTU3LDggKzU4LDEwIEBACiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1BDQVApICs9IHBjYXAtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfUENGNTA2MzMpICs9IHBjZjUwNjMzLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1JDNVQ1ODMpICArPSByYzV0NTgzLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1MyTVBBMDEpICs9IHMybXBhMDEubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9TMk1QUzExKSArPSBzMm1wczExLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfUzVNODc2NykgKz0gczVtODc2Ny5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1NUX1BXTSkgKz0gc3QtcHdtLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfU1RXNDgxWF9WTU1DKSArPSBzdHc0ODF4LXZtbWMubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9USV9BQkIpICs9IHRpLWFiYi1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2MTA1WCkgKz0gdHBzNjEwNXgtcmVndWxhdG9yLm8KQEAgLTY3LDYgKzcwLDcgQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUwN1gpICs9IHRwczY1MDd4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MDkwKSArPSB0cHM2NTA5MC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTIxNykgKz0gdHBzNjUyMTctcmVndWxhdG9yLm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUyMTgpICs9IHRwczY1MjE4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MjRYKSArPSB0cHM2NTI0eC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTg2WCkgKz0gdHBzNjU4NngtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjU5MTApICs9IHRwczY1OTEwLXJlZ3VsYXRvci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYwppbmRleCBmNzBhOWJmLi5jODczZWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKQEAgLTk5LDYgKzk5LDcgQEAKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGFhdDI4NzBfbGRvX29wcyA9IHsKIAkubGlzdF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV90YWJsZSwKKwkubWFwX3ZvbHRhZ2UgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfYXNjZW5kLAogCS5zZXRfdm9sdGFnZV9zZWwgPSBhYXQyODcwX2xkb19zZXRfdm9sdGFnZV9zZWwsCiAJLmdldF92b2x0YWdlX3NlbCA9IGFhdDI4NzBfbGRvX2dldF92b2x0YWdlX3NlbCwKIAkuZW5hYmxlID0gYWF0Mjg3MF9sZG9fZW5hYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWN0ODg2NS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FjdDg4NjUtcmVndWxhdG9yLmMKaW5kZXggMDg0Y2MwOC4uYjkyZDdkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYWN0ODg2NS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci5jCkBAIC02Miw3ICs2Miw2IEBACiAjZGVmaW5lCUFDVDg4NjVfVk9MVEFHRV9OVU0JNjQKIAogc3RydWN0IGFjdDg4NjUgewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W0FDVDg4NjVfUkVHX05VTV07CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogfTsKIApAQCAtMjEzLDcgKzIxMiw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAlzdHJ1Y3QgYWN0ODg2NV9yZWd1bGF0b3JfZGF0YSAqcmVndWxhdG9yOwogCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFucCkgewogCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgJ3JlZ3VsYXRvcnMnIHN1Ym5vZGUgaW4gRFRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyMSwxNyArMjIwLDE1IEBACiAKIAltYXRjaGVkID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgbnAsCiAJCQkJYWN0ODg2NV9tYXRjaGVzLCBBUlJBWV9TSVpFKGFjdDg4NjVfbWF0Y2hlcykpOworCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAobWF0Y2hlZCA8PSAwKQogCQlyZXR1cm4gbWF0Y2hlZDsKIAogCXBkYXRhLT5yZWd1bGF0b3JzID0gZGV2bV9remFsbG9jKGRldiwKIAkJCQlzaXplb2Yoc3RydWN0IGFjdDg4NjVfcmVndWxhdG9yX2RhdGEpICoKIAkJCQlBUlJBWV9TSVpFKGFjdDg4NjVfbWF0Y2hlcyksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEtPnJlZ3VsYXRvcnMpIHsKLQkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGFjdDg4NjUgcmVnaXN0b3JcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7CisJaWYgKCFwZGF0YS0+cmVndWxhdG9ycykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcGRhdGEtPm51bV9yZWd1bGF0b3JzID0gbWF0Y2hlZDsKIAlyZWd1bGF0b3IgPSBwZGF0YS0+cmVndWxhdG9yczsKQEAgLTI1OCw3ICsyNTUsNyBAQAogc3RhdGljIGludCBhY3Q4ODY1X3BtaWNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppMmNfaWQpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgYWN0ODg2NV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CkBAIC0yOTIsOCArMjg5LDYgQEAKIAlpZiAoIWFjdDg4NjUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmRldiA9IGFjdDg4NjUtPnJkZXY7Ci0KIAlhY3Q4ODY1LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhY3Q4ODY1X3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIoYWN0ODg2NS0+cmVnbWFwKSkgewogCQllcnJvciA9IFBUUl9FUlIoYWN0ODg2NS0+cmVnbWFwKTsKQEAgLTMxMywxMiArMzA4LDEyIEBACiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IGFjdDg4NjU7CiAJCWNvbmZpZy5yZWdtYXAgPSBhY3Q4ODY1LT5yZWdtYXA7CiAKLQkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKLQkJCQkJCSZhY3Q4ODY1X3JlZ1tpXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpXSkpIHsKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmFjdDg4NjVfcmVnW2ldLAorCQkJCQkgICAgICAgJmNvbmZpZyk7CisJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLAogCQkJCWFjdDg4NjVfcmVnW2lkXS5uYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FuYXRvcC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FuYXRvcC1yZWd1bGF0b3IuYwppbmRleCA4NjJlNjNlLi43YzM5N2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hbmF0b3AtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYW5hdG9wLXJlZ3VsYXRvci5jCkBAIC0zNCw2ICszNCw5IEBACiAjZGVmaW5lIExET19SQU1QX1VQX1VOSVRfSU5fQ1lDTEVTICAgICAgNjQgLyogNjQgY3ljbGVzIHBlciBzdGVwICovCiAjZGVmaW5lIExET19SQU1QX1VQX0ZSRVFfSU5fTUhaICAgICAgICAgMjQgLyogY3ljbGUgYmFzZWQgb24gMjRNIE9TQyAqLwogCisjZGVmaW5lIExET19QT1dFUl9HQVRFCQkJMHgwMAorI2RlZmluZSBMRE9fRkVUX0ZVTExfT04JCQkweDFmCisKIHN0cnVjdCBhbmF0b3BfcmVndWxhdG9yIHsKIAljb25zdCBjaGFyICpuYW1lOwogCXUzMiBjb250cm9sX3JlZzsKQEAgLTQ4LDE5ICs1MSwxMCBAQAogCWludCBtYXhfdm9sdGFnZTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcmRlc2M7CiAJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRkYXRhOworCWJvb2wgYnlwYXNzOworCWludCBzZWw7CiB9OwogCi1zdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfc2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcsCi0JCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQotewotCXN0cnVjdCBhbmF0b3BfcmVndWxhdG9yICphbmF0b3BfcmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZWcpOwotCi0JaWYgKCFhbmF0b3BfcmVnLT5jb250cm9sX3JlZykKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCXJldHVybiByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcsIHNlbGVjdG9yKTsKLX0KLQogc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX3NldF92b2x0YWdlX3RpbWVfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcsCiAJdW5zaWduZWQgaW50IG9sZF9zZWwsCiAJdW5zaWduZWQgaW50IG5ld19zZWwpCkBAIC04NywyNCArODEsMTAxIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnKQorc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnKQoreworCXN0cnVjdCBhbmF0b3BfcmVndWxhdG9yICphbmF0b3BfcmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZWcpOworCWludCBzZWw7CisKKwlzZWwgPSBhbmF0b3BfcmVnLT5ieXBhc3MgPyBMRE9fRkVUX0ZVTExfT04gOiBhbmF0b3BfcmVnLT5zZWw7CisJcmV0dXJuIHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZywgc2VsKTsKK30KKworc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZykKK3sKKwlyZXR1cm4gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnLCBMRE9fUE9XRVJfR0FURSk7Cit9CisKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcpCit7CisJcmV0dXJuIHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZykgIT0gTERPX1BPV0VSX0dBVEU7Cit9CisKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9jb3JlX3NldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnLAorCQkJCQkgICAgICB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciAqYW5hdG9wX3JlZyA9IHJkZXZfZ2V0X2RydmRhdGEocmVnKTsKKwlpbnQgcmV0OworCisJaWYgKGFuYXRvcF9yZWctPmJ5cGFzcyB8fCAhYW5hdG9wX3JlZ21hcF9pc19lbmFibGVkKHJlZykpIHsKKwkJYW5hdG9wX3JlZy0+c2VsID0gc2VsZWN0b3I7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZywgc2VsZWN0b3IpOworCWlmICghcmV0KQorCQlhbmF0b3BfcmVnLT5zZWwgPSBzZWxlY3RvcjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfY29yZV9nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZykKIHsKIAlzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciAqYW5hdG9wX3JlZyA9IHJkZXZfZ2V0X2RydmRhdGEocmVnKTsKIAotCWlmICghYW5hdG9wX3JlZy0+Y29udHJvbF9yZWcpCi0JCXJldHVybiAtRU5PVFNVUFA7CisJaWYgKGFuYXRvcF9yZWctPmJ5cGFzcyB8fCAhYW5hdG9wX3JlZ21hcF9pc19lbmFibGVkKHJlZykpCisJCXJldHVybiBhbmF0b3BfcmVnLT5zZWw7CiAKIAlyZXR1cm4gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnKTsKIH0KIAorc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2dldF9ieXBhc3Moc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZywgYm9vbCAqZW5hYmxlKQoreworCXN0cnVjdCBhbmF0b3BfcmVndWxhdG9yICphbmF0b3BfcmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZWcpOworCWludCBzZWw7CisKKwlzZWwgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcpOworCWlmIChzZWwgPT0gTERPX0ZFVF9GVUxMX09OKQorCQlXQVJOX09OKCFhbmF0b3BfcmVnLT5ieXBhc3MpOworCWVsc2UgaWYgKHNlbCAhPSBMRE9fUE9XRVJfR0FURSkKKwkJV0FSTl9PTihhbmF0b3BfcmVnLT5ieXBhc3MpOworCisJKmVuYWJsZSA9IGFuYXRvcF9yZWctPmJ5cGFzczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX3NldF9ieXBhc3Moc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZywgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgKmFuYXRvcF9yZWcgPSByZGV2X2dldF9kcnZkYXRhKHJlZyk7CisJaW50IHNlbDsKKworCWlmIChlbmFibGUgPT0gYW5hdG9wX3JlZy0+YnlwYXNzKQorCQlyZXR1cm4gMDsKKworCXNlbCA9IGVuYWJsZSA/IExET19GRVRfRlVMTF9PTiA6IGFuYXRvcF9yZWctPnNlbDsKKwlhbmF0b3BfcmVnLT5ieXBhc3MgPSBlbmFibGU7CisKKwlyZXR1cm4gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnLCBzZWwpOworfQorCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYW5hdG9wX3JvcHMgPSB7Ci0JLnNldF92b2x0YWdlX3NlbCA9IGFuYXRvcF9yZWdtYXBfc2V0X3ZvbHRhZ2Vfc2VsLAotCS5zZXRfdm9sdGFnZV90aW1lX3NlbCA9IGFuYXRvcF9yZWdtYXBfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCi0JLmdldF92b2x0YWdlX3NlbCA9IGFuYXRvcF9yZWdtYXBfZ2V0X3ZvbHRhZ2Vfc2VsLAorCS5zZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCiAJLmxpc3Rfdm9sdGFnZSA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAogCS5tYXBfdm9sdGFnZSA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXIsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYW5hdG9wX2NvcmVfcm9wcyA9IHsKKwkuZW5hYmxlID0gYW5hdG9wX3JlZ21hcF9lbmFibGUsCisJLmRpc2FibGUgPSBhbmF0b3BfcmVnbWFwX2Rpc2FibGUsCisJLmlzX2VuYWJsZWQgPSBhbmF0b3BfcmVnbWFwX2lzX2VuYWJsZWQsCisJLnNldF92b2x0YWdlX3NlbCA9IGFuYXRvcF9yZWdtYXBfY29yZV9zZXRfdm9sdGFnZV9zZWwsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsID0gYW5hdG9wX3JlZ21hcF9zZXRfdm9sdGFnZV90aW1lX3NlbCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gYW5hdG9wX3JlZ21hcF9jb3JlX2dldF92b2x0YWdlX3NlbCwKKwkubGlzdF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCisJLm1hcF92b2x0YWdlID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhciwKKwkuZ2V0X2J5cGFzcyA9IGFuYXRvcF9yZWdtYXBfZ2V0X2J5cGFzcywKKwkuc2V0X2J5cGFzcyA9IGFuYXRvcF9yZWdtYXBfc2V0X2J5cGFzcywKK307CisKIHN0YXRpYyBpbnQgYW5hdG9wX3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC0xMTYsNiArMTg3LDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdGRhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCWludCByZXQgPSAwOworCXUzMiB2YWw7CiAKIAlpbml0ZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKGRldiwgbnApOwogCXNyZWcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNyZWcpLCBHRlBfS0VSTkVMKTsKQEAgLTEyNSw3ICsxOTcsNiBAQAogCXNyZWctPm5hbWUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWd1bGF0b3ItbmFtZSIsIE5VTEwpOwogCXJkZXNjID0gJnNyZWctPnJkZXNjOwogCXJkZXNjLT5uYW1lID0gc3JlZy0+bmFtZTsKLQlyZGVzYy0+b3BzID0gJmFuYXRvcF9yb3BzOwogCXJkZXNjLT50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0U7CiAJcmRlc2MtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKQEAgLTE5Nyw2ICsyNjgsMjUgQEAKIAljb25maWcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCWNvbmZpZy5yZWdtYXAgPSBzcmVnLT5hbmF0b3A7CiAKKwkvKiBPbmx5IGNvcmUgcmVndWxhdG9ycyBoYXZlIHRoZSByYW1wIHVwIGRlbGF5IGNvbmZpZ3VyYXRpb24uICovCisJaWYgKHNyZWctPmNvbnRyb2xfcmVnICYmIHNyZWctPmRlbGF5X2JpdF93aWR0aCkgeworCQlyZGVzYy0+b3BzID0gJmFuYXRvcF9jb3JlX3JvcHM7CisKKwkJcmV0ID0gcmVnbWFwX3JlYWQoY29uZmlnLnJlZ21hcCwgcmRlc2MtPnZzZWxfcmVnLCAmdmFsKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVhZCBpbml0aWFsIHN0YXRlXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzcmVnLT5zZWwgPSAodmFsICYgcmRlc2MtPnZzZWxfbWFzaykgPj4gc3JlZy0+dm9sX2JpdF9zaGlmdDsKKwkJaWYgKHNyZWctPnNlbCA9PSBMRE9fRkVUX0ZVTExfT04pIHsKKwkJCXNyZWctPnNlbCA9IDA7CisJCQlzcmVnLT5ieXBhc3MgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJcmRlc2MtPm9wcyA9ICZhbmF0b3Bfcm9wczsKKwl9CisKIAkvKiByZWdpc3RlciByZWd1bGF0b3IgKi8KIAlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoZGV2LCByZGVzYywgJmNvbmZpZyk7CiAJaWYgKElTX0VSUihyZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLWxkbzEuYwppbmRleCA0ZjZjMjA1Li5iMTAzM2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLWxkbzEuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLWxkbzEuYwpAQCAtMTUzLDExICsxNTMsOSBAQAogCiAJLnZzZWxfcmVnID0gQVJJWk9OQV9MRE8xX0NPTlRST0xfMSwKIAkudnNlbF9tYXNrID0gQVJJWk9OQV9MRE8xX1ZTRUxfTUFTSywKLQkuYnlwYXNzX3JlZyA9IEFSSVpPTkFfTERPMV9DT05UUk9MXzEsCi0JLmJ5cGFzc19tYXNrID0gQVJJWk9OQV9MRE8xX0JZUEFTUywKIAkubWluX3VWID0gOTAwMDAwLAotCS51Vl9zdGVwID0gNTAwMDAsCi0JLm5fdm9sdGFnZXMgPSA3LAorCS51Vl9zdGVwID0gMjUwMDAsCisJLm5fdm9sdGFnZXMgPSAxMywKIAkuZW5hYmxlX3RpbWUgPSA1MDAsCiAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKQEAgLTE4OSwxMCArMTg3LDggQEAKIAlpbnQgcmV0OwogCiAJbGRvMSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmxkbzEpLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRvMSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvMSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJbGRvMS0+YXJpem9uYSA9IGFyaXpvbmE7CiAKQEAgLTIwMyw2ICsxOTksNyBAQAogCSAqLwogCXN3aXRjaCAoYXJpem9uYS0+dHlwZSkgewogCWNhc2UgV001MTAyOgorCWNhc2UgV004OTk3OgogCQlkZXNjID0gJmFyaXpvbmFfbGRvMV9oYzsKIAkJbGRvMS0+aW5pdF9kYXRhID0gYXJpem9uYV9sZG8xX2R2ZnM7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1taWNzdXBwLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLW1pY3N1cHAuYwppbmRleCAwMzRlY2U3Li42ZmRkOWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLW1pY3N1cHAuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLW1pY3N1cHAuYwpAQCAtMjA0LDEwICsyMDQsOCBAQAogCWludCByZXQ7CiAKIAltaWNzdXBwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWljc3VwcCksIEdGUF9LRVJORUwpOwotCWlmIChtaWNzdXBwID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFtaWNzdXBwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAltaWNzdXBwLT5hcml6b25hID0gYXJpem9uYTsKIAlJTklUX1dPUksoJm1pY3N1cHAtPmNoZWNrX2NwX3dvcmssIGFyaXpvbmFfbWljc3VwcF9jaGVja19jcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MTEtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MTEtcmVndWxhdG9yLmMKaW5kZXggYzc3YTU4NC4uYjQ3MjgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzExLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcxMS1yZWd1bGF0b3IuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiB7CiAJc3RydWN0IGFzMzcxMV9yZWd1bGF0b3JfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVndWxhdG9ycyA9Ci0JCW9mX2ZpbmRfbm9kZV9ieV9uYW1lKGRldi0+cGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCQlvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoICptYXRjaDsKIAlpbnQgcmV0LCBpOwogCkBAIC0yMjEsNyArMjIxLDYgQEAKIHsKIAlzdHJ1Y3QgYXMzNzExX3JlZ3VsYXRvcl9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCBhczM3MTEgKmFzMzcxMSA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0gey5kZXYgPSAmcGRldi0+ZGV2LH07CiAJc3RydWN0IGFzMzcxMV9yZWd1bGF0b3IgKnJlZyA9IE5VTEw7CiAJc3RydWN0IGFzMzcxMV9yZWd1bGF0b3IgKnJlZ3M7CkBAIC0yNDYsMjIgKzI0NSwxNCBAQAogCiAJcmVncyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBBUzM3MTFfUkVHVUxBVE9SX05VTSAqCiAJCQlzaXplb2Yoc3RydWN0IGFzMzcxMV9yZWd1bGF0b3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlZ3MpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGV4aXRpbmcuLlxuIik7CisJaWYgKCFyZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGlkID0gMCwgcmkgPSBhczM3MTFfcmVnX2luZm87IGlkIDwgQVMzNzExX1JFR1VMQVRPUl9OVU07ICsraWQsIHJpKyspIHsKLQkJcmVnX2RhdGEgPSBwZGF0YS0+aW5pdF9kYXRhW2lkXTsKLQotCQkvKiBObyBuZWVkIHRvIHJlZ2lzdGVyIGlmIHRoZXJlIGlzIG5vIHJlZ3VsYXRvciBkYXRhICovCi0JCWlmICghcmVnX2RhdGEpCi0JCQljb250aW51ZTsKLQogCQlyZWcgPSAmcmVnc1tpZF07CiAJCXJlZy0+cmVnX2luZm8gPSByaTsKIAotCQljb25maWcuaW5pdF9kYXRhID0gcmVnX2RhdGE7CisJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+aW5pdF9kYXRhW2lkXTsKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gcmVnOwogCQljb25maWcucmVnbWFwID0gYXMzNzExLT5yZWdtYXA7CiAJCWNvbmZpZy5vZl9ub2RlID0gb2Zfbm9kZVtpZF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MjItcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MjItcmVndWxhdG9yLmMKaW5kZXggOGIxN2Q3OC4uODU1ODUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzIyLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcyMi1yZWd1bGF0b3IuYwpAQCAtNzE5LDYgKzcxOSw3IEBACiAKIAlyZXQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgbnAsIGFzMzcyMl9yZWd1bGF0b3JfbWF0Y2hlcywKIAkJCUFSUkFZX1NJWkUoYXMzNzIyX3JlZ3VsYXRvcl9tYXRjaGVzKSk7CisJb2Zfbm9kZV9wdXQobnApOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBhcnNpbmcgb2YgcmVndWxhdG9yIG5vZGUgZmFpbGVkOiAlZFxuIiwKIAkJCXJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9iY201OTB4eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2JjbTU5MHh4LXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDhjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9iY201OTB4eC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIEJyb2FkY29tIEJDTTU5MHh4IHJlZ3VsYXRvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTGltaXRlZAorICogQXV0aG9yOiBNYXR0IFBvcnRlciA8bXBvcnRlckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYmNtNTkweHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qIFJlZ2lzdGVyIGRlZnMgKi8KKyNkZWZpbmUgQkNNNTkwWFhfUkZMRE9QTUNUUkwxCTB4NjAKKyNkZWZpbmUgQkNNNTkwWFhfSU9TUjFQTUNUUkwxCTB4N2EKKyNkZWZpbmUgQkNNNTkwWFhfSU9TUjJQTUNUUkwxCTB4N2MKKyNkZWZpbmUgQkNNNTkwWFhfQ1NSUE1DVFJMMQkweDdlCisjZGVmaW5lIEJDTTU5MFhYX1NEU1IxUE1DVFJMMQkweDgyCisjZGVmaW5lIEJDTTU5MFhYX1NEU1IyUE1DVFJMMQkweDg2CisjZGVmaW5lIEJDTTU5MFhYX01TUlBNQ1RSTDEJMHg4YQorI2RlZmluZSBCQ001OTBYWF9WU1JQTUNUUkwxCTB4OGUKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0VOQUJMRQlCSVQoNykKKworI2RlZmluZSBCQ001OTBYWF9SRkxET0NUUkwJMHg5NgorI2RlZmluZSBCQ001OTBYWF9DU1JWT1VUMQkweGMwCisjZGVmaW5lIEJDTTU5MFhYX0xET19WU0VMX01BU0sJR0VOTUFTSyg1LCAzKQorI2RlZmluZSBCQ001OTBYWF9TUl9WU0VMX01BU0sJR0VOTUFTSyg1LCAwKQorCisvKiBMRE8gcmVndWxhdG9yIElEcyAqLworI2RlZmluZSBCQ001OTBYWF9SRUdfUkZMRE8JMAorI2RlZmluZSBCQ001OTBYWF9SRUdfQ0FNTERPMQkxCisjZGVmaW5lIEJDTTU5MFhYX1JFR19DQU1MRE8yCTIKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1NJTUxETzEJMworI2RlZmluZSBCQ001OTBYWF9SRUdfU0lNTERPMgk0CisjZGVmaW5lIEJDTTU5MFhYX1JFR19TRExETwk1CisjZGVmaW5lIEJDTTU5MFhYX1JFR19TRFhMRE8JNgorI2RlZmluZSBCQ001OTBYWF9SRUdfTU1DTERPMQk3CisjZGVmaW5lIEJDTTU5MFhYX1JFR19NTUNMRE8yCTgKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0FVRExETwk5CisjZGVmaW5lIEJDTTU5MFhYX1JFR19NSUNMRE8JMTAKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1VTQkxETwkxMQorI2RlZmluZSBCQ001OTBYWF9SRUdfVklCTERPCTEyCisKKy8qIERDREMgcmVndWxhdG9yIElEcyAqLworI2RlZmluZSBCQ001OTBYWF9SRUdfQ1NSCTEzCisjZGVmaW5lIEJDTTU5MFhYX1JFR19JT1NSMQkxNAorI2RlZmluZSBCQ001OTBYWF9SRUdfSU9TUjIJMTUKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX01TUgkxNgorI2RlZmluZSBCQ001OTBYWF9SRUdfU0RTUjEJMTcKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1NEU1IyCTE4CisjZGVmaW5lIEJDTTU5MFhYX1JFR19WU1IJMTkKKworI2RlZmluZSBCQ001OTBYWF9OVU1fUkVHUwkyMAorCisjZGVmaW5lIEJDTTU5MFhYX1JFR19JU19MRE8obikJKG4gPCBCQ001OTBYWF9SRUdfQ1NSKQorCitzdHJ1Y3QgYmNtNTkweHhfYm9hcmQgeworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpiY201OTB4eF9wbXVfaW5pdF9kYXRhW0JDTTU5MFhYX05VTV9SRUdTXTsKK307CisKKy8qIExETyBncm91cCBBOiBzdXBwb3J0ZWQgdm9sdGFnZXMgaW4gbWljcm92b2x0cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZG9fYV90YWJsZVtdID0geworCTEyMDAwMDAsIDE4MDAwMDAsIDI1MDAwMDAsIDI3MDAwMDAsIDI4MDAwMDAsCisJMjkwMDAwMCwgMzAwMDAwMCwgMzMwMDAwMCwKK307CisKKy8qIExETyBncm91cCBDOiBzdXBwb3J0ZWQgdm9sdGFnZXMgaW4gbWljcm92b2x0cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZG9fY190YWJsZVtdID0geworCTMxMDAwMDAsIDE4MDAwMDAsIDI1MDAwMDAsIDI3MDAwMDAsIDI4MDAwMDAsCisJMjkwMDAwMCwgMzAwMDAwMCwgMzMwMDAwMCwKK307CisKKy8qIERDREMgZ3JvdXAgQ1NSOiBzdXBwb3J0ZWQgdm9sdGFnZXMgaW4gbWljcm92b2x0cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGRjZGNfY3NyX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoODYwMDAwLCAyLCA1MCwgMTAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTM2MDAwMCwgNTEsIDU1LCAyMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg5MDAwMDAsIDU2LCA2MywgMCksCit9OworCisvKiBEQ0RDIGdyb3VwIElPU1IxOiBzdXBwb3J0ZWQgdm9sdGFnZXMgaW4gbWljcm92b2x0cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGRjZGNfaW9zcjFfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg4NjAwMDAsIDIsIDUxLCAxMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxNTAwMDAwLCA1MiwgNTIsIDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTgwMDAwMCwgNTMsIDUzLCAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDkwMDAwMCwgNTQsIDYzLCAwKSwKK307CisKKy8qIERDREMgZ3JvdXAgU0RTUjE6IHN1cHBvcnRlZCB2b2x0YWdlcyBpbiBtaWNyb3ZvbHRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgZGNkY19zZHNyMV9yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDg2MDAwMCwgMiwgNTAsIDEwMDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDEzNDAwMDAsIDUxLCA1MSwgMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg5MDAwMDAsIDUyLCA2MywgMCksCit9OworCitzdHJ1Y3QgYmNtNTkweHhfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp2aW5fbmFtZTsKKwl1OCBuX3ZvbHRhZ2VzOworCWNvbnN0IHVuc2lnbmVkIGludCAqdm9sdF90YWJsZTsKKwl1OCBuX2xpbmVhcl9yYW5nZXM7CisJY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgKmxpbmVhcl9yYW5nZXM7Cit9OworCisjZGVmaW5lIEJDTTU5MFhYX1JFR19UQUJMRShfbmFtZSwgX3RhYmxlKSBcCisJeyBcCisJCS5uYW1lID0gI19uYW1lLCBcCisJCS5uX3ZvbHRhZ2VzID0gQVJSQVlfU0laRShfdGFibGUpLCBcCisJCS52b2x0X3RhYmxlID0gX3RhYmxlLCBcCisJfQorCisjZGVmaW5lIEJDTTU5MFhYX1JFR19SQU5HRVMoX25hbWUsIF9yYW5nZXMpIFwKKwl7IFwKKwkJLm5hbWUgPSAjX25hbWUsIFwKKwkJLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUoX3JhbmdlcyksIFwKKwkJLmxpbmVhcl9yYW5nZXMgPSBfcmFuZ2VzLCBcCisJfQorCitzdGF0aWMgc3RydWN0IGJjbTU5MHh4X2luZm8gYmNtNTkweHhfcmVnc1tdID0geworCUJDTTU5MFhYX1JFR19UQUJMRShyZmxkbywgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShjYW1sZG8xLCBsZG9fY190YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKGNhbWxkbzIsIGxkb19jX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoc2ltbGRvMSwgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShzaW1sZG8yLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKHNkbGRvLCBsZG9fY190YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKHNkeGxkbywgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShtbWNsZG8xLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKG1tY2xkbzIsIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoYXVkbGRvLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKG1pY2xkbywgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRSh1c2JsZG8sIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUodmlibGRvLCBsZG9fY190YWJsZSksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyhjc3IsIGRjZGNfY3NyX3JhbmdlcyksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyhpb3NyMSwgZGNkY19pb3NyMV9yYW5nZXMpLAorCUJDTTU5MFhYX1JFR19SQU5HRVMoaW9zcjIsIGRjZGNfaW9zcjFfcmFuZ2VzKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKG1zciwgZGNkY19pb3NyMV9yYW5nZXMpLAorCUJDTTU5MFhYX1JFR19SQU5HRVMoc2RzcjEsIGRjZGNfc2RzcjFfcmFuZ2VzKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKHNkc3IyLCBkY2RjX2lvc3IxX3JhbmdlcyksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyh2c3IsIGRjZGNfaW9zcjFfcmFuZ2VzKSwKK307CisKK3N0cnVjdCBiY201OTB4eF9yZWcgeworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYmNtNTkweHggKm1mZDsKKwlzdHJ1Y3QgYmNtNTkweHhfaW5mbyAqKmluZm87Cit9OworCitzdGF0aWMgaW50IGJjbTU5MHh4X2dldF92c2VsX3JlZ2lzdGVyKGludCBpZCkKK3sKKwlpZiAoQkNNNTkwWFhfUkVHX0lTX0xETyhpZCkpCisJCXJldHVybiBCQ001OTBYWF9SRkxET0NUUkwgKyBpZDsKKwllbHNlCisJCXJldHVybiBCQ001OTBYWF9DU1JWT1VUMSArIChpZCAtIEJDTTU5MFhYX1JFR19DU1IpICogMzsKK30KKworc3RhdGljIGludCBiY201OTB4eF9nZXRfZW5hYmxlX3JlZ2lzdGVyKGludCBpZCkKK3sKKwlpbnQgcmVnID0gMDsKKworCWlmIChCQ001OTBYWF9SRUdfSVNfTERPKGlkKSkKKwkJcmVnID0gQkNNNTkwWFhfUkZMRE9QTUNUUkwxICsgaWQgKiAyOworCWVsc2UKKwkJc3dpdGNoIChpZCkgeworCQljYXNlIEJDTTU5MFhYX1JFR19DU1I6CisJCQlyZWcgPSBCQ001OTBYWF9DU1JQTUNUUkwxOworCQkJYnJlYWs7CisJCWNhc2UgQkNNNTkwWFhfUkVHX0lPU1IxOgorCQkJcmVnID0gQkNNNTkwWFhfSU9TUjFQTUNUUkwxOworCQkJYnJlYWs7CisJCWNhc2UgQkNNNTkwWFhfUkVHX0lPU1IyOgorCQkJcmVnID0gQkNNNTkwWFhfSU9TUjJQTUNUUkwxOworCQkJYnJlYWs7CisJCWNhc2UgQkNNNTkwWFhfUkVHX01TUjoKKwkJCXJlZyA9IEJDTTU5MFhYX01TUlBNQ1RSTDE7CisJCQlicmVhazsKKwkJY2FzZSBCQ001OTBYWF9SRUdfU0RTUjE6CisJCQlyZWcgPSBCQ001OTBYWF9TRFNSMVBNQ1RSTDE7CisJCQlicmVhazsKKwkJY2FzZSBCQ001OTBYWF9SRUdfU0RTUjI6CisJCQlyZWcgPSBCQ001OTBYWF9TRFNSMlBNQ1RSTDE7CisJCQlicmVhazsKKwkJfTsKKworCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBiY201OTB4eF9vcHNfbGRvID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfdGFibGUsCisJLm1hcF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9pdGVyYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGJjbTU5MHh4X29wc19kY2RjID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorfTsKKworI2RlZmluZSBCQ001OTBYWF9NQVRDSChfbmFtZSwgX2lkKSBcCisJeyBcCisJCS5uYW1lID0gI19uYW1lLCBcCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmJjbTU5MHh4X3JlZ3NbQkNNNTkwWFhfUkVHXyMjX2lkXSwgXAorCX0KKworc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggYmNtNTkweHhfbWF0Y2hlc1tdID0geworCUJDTTU5MFhYX01BVENIKHJmbGRvLCBSRkxETyksCisJQkNNNTkwWFhfTUFUQ0goY2FtbGRvMSwgQ0FNTERPMSksCisJQkNNNTkwWFhfTUFUQ0goY2FtbGRvMiwgQ0FNTERPMiksCisJQkNNNTkwWFhfTUFUQ0goc2ltbGRvMSwgU0lNTERPMSksCisJQkNNNTkwWFhfTUFUQ0goc2ltbGRvMiwgU0lNTERPMiksCisJQkNNNTkwWFhfTUFUQ0goc2RsZG8sIFNETERPKSwKKwlCQ001OTBYWF9NQVRDSChzZHhsZG8sIFNEWExETyksCisJQkNNNTkwWFhfTUFUQ0gobW1jbGRvMSwgTU1DTERPMSksCisJQkNNNTkwWFhfTUFUQ0gobW1jbGRvMiwgTU1DTERPMiksCisJQkNNNTkwWFhfTUFUQ0goYXVkbGRvLCBBVURMRE8pLAorCUJDTTU5MFhYX01BVENIKG1pY2xkbywgTUlDTERPKSwKKwlCQ001OTBYWF9NQVRDSCh1c2JsZG8sIFVTQkxETyksCisJQkNNNTkwWFhfTUFUQ0godmlibGRvLCBWSUJMRE8pLAorCUJDTTU5MFhYX01BVENIKGNzciwgQ1NSKSwKKwlCQ001OTBYWF9NQVRDSChpb3NyMSwgSU9TUjEpLAorCUJDTTU5MFhYX01BVENIKGlvc3IyLCBJT1NSMiksCisJQkNNNTkwWFhfTUFUQ0gobXNyLCBNU1IpLAorCUJDTTU5MFhYX01BVENIKHNkc3IxLCBTRFNSMSksCisJQkNNNTkwWFhfTUFUQ0goc2RzcjIsIFNEU1IyKSwKKwlCQ001OTBYWF9NQVRDSCh2c3IsIFZTUiksCit9OworCitzdGF0aWMgc3RydWN0IGJjbTU5MHh4X2JvYXJkICpiY201OTB4eF9wYXJzZV9kdF9yZWdfZGF0YSgKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqKmJjbTU5MHh4X3JlZ19tYXRjaGVzKQoreworCXN0cnVjdCBiY201OTB4eF9ib2FyZCAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ3VsYXRvcnM7CisJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqbWF0Y2hlcyA9IGJjbTU5MHh4X21hdGNoZXM7CisJaW50IGNvdW50ID0gQVJSQVlfU0laRShiY201OTB4eF9tYXRjaGVzKTsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCFucCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvZiBub2RlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWd1bGF0b3IgYm9hcmQgZGF0YVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW5wID0gb2Zfbm9kZV9nZXQobnApOworCXJlZ3VsYXRvcnMgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgInJlZ3VsYXRvcnMiKTsKKwlpZiAoIXJlZ3VsYXRvcnMpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInJlZ3VsYXRvciBub2RlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaCgmcGRldi0+ZGV2LCByZWd1bGF0b3JzLCBtYXRjaGVzLCBjb3VudCk7CisJb2Zfbm9kZV9wdXQocmVndWxhdG9ycyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgcGFyc2luZyByZWd1bGF0b3IgaW5pdCBkYXRhOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpiY201OTB4eF9yZWdfbWF0Y2hlcyA9IG1hdGNoZXM7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQlpZiAoIW1hdGNoZXNbaWR4XS5pbml0X2RhdGEgfHwgIW1hdGNoZXNbaWR4XS5vZl9ub2RlKQorCQkJY29udGludWU7CisKKwkJZGF0YS0+YmNtNTkweHhfcG11X2luaXRfZGF0YVtpZHhdID0gbWF0Y2hlc1tpZHhdLmluaXRfZGF0YTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBiY201OTB4eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY201OTB4eCAqYmNtNTkweHggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGJjbTU5MHh4X2JvYXJkICpwbXVfZGF0YSA9IE5VTEw7CisJc3RydWN0IGJjbTU5MHh4X3JlZyAqcG11OworCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKKwlzdHJ1Y3QgYmNtNTkweHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqYmNtNTkweHhfcmVnX21hdGNoZXMgPSBOVUxMOworCWludCBpOworCisJcG11X2RhdGEgPSBiY201OTB4eF9wYXJzZV9kdF9yZWdfZGF0YShwZGV2LAorCQkJCQkgICAgICAmYmNtNTkweHhfcmVnX21hdGNoZXMpOworCisJcG11ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbXUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBwbXVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbXUtPm1mZCA9IGJjbTU5MHh4OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG11KTsKKworCXBtdS0+ZGVzYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBCQ001OTBYWF9OVU1fUkVHUyAqCisJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbXUtPmRlc2MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxzIGZvciBkZXNjXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG11LT5pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIEJDTTU5MFhYX05VTV9SRUdTICoKKwkJCXNpemVvZihzdHJ1Y3QgYmNtNTkweHhfaW5mbyAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbXUtPmluZm8pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxzIGZvciBpbmZvXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5mbyA9IGJjbTU5MHh4X3JlZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkNNNTkwWFhfTlVNX1JFR1M7IGkrKywgaW5mbysrKSB7CisJCWlmIChwbXVfZGF0YSkKKwkJCXJlZ19kYXRhID0gcG11X2RhdGEtPmJjbTU5MHh4X3BtdV9pbml0X2RhdGFbaV07CisJCWVsc2UKKwkJCXJlZ19kYXRhID0gTlVMTDsKKworCQkvKiBSZWdpc3RlciB0aGUgcmVndWxhdG9ycyAqLworCQlwbXUtPmluZm9baV0gPSBpbmZvOworCisJCXBtdS0+ZGVzY1tpXS5uYW1lID0gaW5mby0+bmFtZTsKKwkJcG11LT5kZXNjW2ldLnN1cHBseV9uYW1lID0gaW5mby0+dmluX25hbWU7CisJCXBtdS0+ZGVzY1tpXS5pZCA9IGk7CisJCXBtdS0+ZGVzY1tpXS52b2x0X3RhYmxlID0gaW5mby0+dm9sdF90YWJsZTsKKwkJcG11LT5kZXNjW2ldLm5fdm9sdGFnZXMgPSBpbmZvLT5uX3ZvbHRhZ2VzOworCQlwbXUtPmRlc2NbaV0ubGluZWFyX3JhbmdlcyA9IGluZm8tPmxpbmVhcl9yYW5nZXM7CisJCXBtdS0+ZGVzY1tpXS5uX2xpbmVhcl9yYW5nZXMgPSBpbmZvLT5uX2xpbmVhcl9yYW5nZXM7CisKKwkJaWYgKEJDTTU5MFhYX1JFR19JU19MRE8oaSkpIHsKKwkJCXBtdS0+ZGVzY1tpXS5vcHMgPSAmYmNtNTkweHhfb3BzX2xkbzsKKwkJCXBtdS0+ZGVzY1tpXS52c2VsX21hc2sgPSBCQ001OTBYWF9MRE9fVlNFTF9NQVNLOworCQl9IGVsc2UgeworCQkJcG11LT5kZXNjW2ldLm9wcyA9ICZiY201OTB4eF9vcHNfZGNkYzsKKwkJCXBtdS0+ZGVzY1tpXS52c2VsX21hc2sgPSBCQ001OTBYWF9TUl9WU0VMX01BU0s7CisJCX0KKworCQlwbXUtPmRlc2NbaV0udnNlbF9yZWcgPSBiY201OTB4eF9nZXRfdnNlbF9yZWdpc3RlcihpKTsKKwkJcG11LT5kZXNjW2ldLmVuYWJsZV9pc19pbnZlcnRlZCA9IHRydWU7CisJCXBtdS0+ZGVzY1tpXS5lbmFibGVfbWFzayA9IEJDTTU5MFhYX1JFR19FTkFCTEU7CisJCXBtdS0+ZGVzY1tpXS5lbmFibGVfcmVnID0gYmNtNTkweHhfZ2V0X2VuYWJsZV9yZWdpc3RlcihpKTsKKwkJcG11LT5kZXNjW2ldLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKKwkJcG11LT5kZXNjW2ldLm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkJY29uZmlnLmRldiA9IGJjbTU5MHh4LT5kZXY7CisJCWNvbmZpZy5pbml0X2RhdGEgPSByZWdfZGF0YTsKKwkJY29uZmlnLmRyaXZlcl9kYXRhID0gcG11OworCQljb25maWcucmVnbWFwID0gYmNtNTkweHgtPnJlZ21hcDsKKworCQlpZiAoYmNtNTkweHhfcmVnX21hdGNoZXMpCisJCQljb25maWcub2Zfbm9kZSA9IGJjbTU5MHh4X3JlZ19tYXRjaGVzW2ldLm9mX25vZGU7CisKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwbXUtPmRlc2NbaV0sCisJCQkJCSAgICAgICAmY29uZmlnKTsKKwkJaWYgKElTX0VSUihyZGV2KSkgeworCQkJZGV2X2VycihiY201OTB4eC0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgcmVndWxhdG9yXG4iLAorCQkJCXBkZXYtPm5hbWUpOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmNtNTkweHhfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiY201OTB4eC12cmVncyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYmNtNTkweHhfcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY201OTB4eF9yZWd1bGF0b3JfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQkNNNTkweHggdm9sdGFnZSByZWd1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJjbTU5MHh4LXZyZWdzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKaW5kZXggYWZjYTFiYy4uYmFjNDg1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwpAQCAtMjM5OSw2ICsyMzk5LDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgb2xkX21pbl91Viwgb2xkX21heF91VjsKKwlpbnQgY3VycmVudF91VjsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIApAQCAtMjQwOSw2ICsyNDEwLDE5IEBACiAJaWYgKHJlZ3VsYXRvci0+bWluX3VWID09IG1pbl91ViAmJiByZWd1bGF0b3ItPm1heF91ViA9PSBtYXhfdVYpCiAJCWdvdG8gb3V0OwogCisJLyogSWYgd2UncmUgdHJ5aW5nIHRvIHNldCBhIHJhbmdlIHRoYXQgb3ZlcmxhcHMgdGhlIGN1cnJlbnQgdm9sdGFnZSwKKwkgKiByZXR1cm4gc3VjY2VzZnVsbHkgZXZlbiB0aG91Z2ggdGhlIHJlZ3VsYXRvciBkb2VzIG5vdCBzdXBwb3J0CisJICogY2hhbmdpbmcgdGhlIHZvbHRhZ2UuCisJICovCisJaWYgKCEocmRldi0+Y29uc3RyYWludHMtPnZhbGlkX29wc19tYXNrICYgUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFKSkgeworCQljdXJyZW50X3VWID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKKwkJaWYgKG1pbl91ViA8PSBjdXJyZW50X3VWICYmIGN1cnJlbnRfdVYgPD0gbWF4X3VWKSB7CisJCQlyZWd1bGF0b3ItPm1pbl91ViA9IG1pbl91VjsKKwkJCXJlZ3VsYXRvci0+bWF4X3VWID0gbWF4X3VWOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2UgJiYKIAkgICAgIXJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2Vfc2VsKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTItcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTItcmVndWxhdG9yLmMKaW5kZXggM2FkZWFlZi4uZmRiNmVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDUyLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1Mi1yZWd1bGF0b3IuYwpAQCAtMjQwLDYgKzI0MCwzMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZGE5MDUyX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgb2xkX3NlbCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgbmV3X3NlbCkKK3sKKwlzdHJ1Y3QgZGE5MDUyX3JlZ3VsYXRvciAqcmVndWxhdG9yID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGE5MDUyX3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmVndWxhdG9yLT5pbmZvOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWludCByZXQgPSAwOworCisJLyogVGhlIERWQyBjb250cm9sbGVkIExET3MgYW5kIERDRENzIHJhbXAgd2l0aCA2LjI1bVYvwrVzIGFmdGVyIGVuYWJsaW5nCisJICogdGhlIGFjdGl2YXRlIGJpdC4KKwkgKi8KKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBEQTkwNTJfSURfQlVDSzE6CisJY2FzZSBEQTkwNTJfSURfQlVDSzI6CisJY2FzZSBEQTkwNTJfSURfQlVDSzM6CisJY2FzZSBEQTkwNTJfSURfTERPMjoKKwljYXNlIERBOTA1Ml9JRF9MRE8zOgorCQlyZXQgPSAobmV3X3NlbCAtIG9sZF9zZWwpICogaW5mby0+c3RlcF91ViAvIDYyNTA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBkYTkwNTJfZGNkY19vcHMgPSB7CiAJLmdldF9jdXJyZW50X2xpbWl0ID0gZGE5MDUyX2RjZGNfZ2V0X2N1cnJlbnRfbGltaXQsCiAJLnNldF9jdXJyZW50X2xpbWl0ID0gZGE5MDUyX2RjZGNfc2V0X2N1cnJlbnRfbGltaXQsCkBAIC0yNDgsNiArMjczLDcgQEAKIAkubWFwX3ZvbHRhZ2UgPSBkYTkwNTJfbWFwX3ZvbHRhZ2UsCiAJLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAogCS5zZXRfdm9sdGFnZV9zZWwgPSBkYTkwNTJfcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbCwKKwkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwgPSBkYTkwNTJfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsLAogCS5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAogCS5lbmFibGUgPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKIAkuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKQEAgLTI1OCw2ICsyODQsNyBAQAogCS5tYXBfdm9sdGFnZSA9IGRhOTA1Ml9tYXBfdm9sdGFnZSwKIAkuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCiAJLnNldF92b2x0YWdlX3NlbCA9IGRhOTA1Ml9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsLAorCS5zZXRfdm9sdGFnZV90aW1lX3NlbCA9IGRhOTA1Ml9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCiAJLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCiAJLmVuYWJsZSA9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAogCS5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLApAQCAtNDAxLDcgKzQyOCw3IEBACiAJCWlmICghbnByb290KQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJbnByb290ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOworCQlucHJvb3QgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucHJvb3QsICJyZWd1bGF0b3JzIik7CiAJCWlmICghbnByb290KQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1NS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1NS1yZWd1bGF0b3IuYwppbmRleCBiMTRlYmRhLi45NTE2MzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTUtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDU1LXJlZ3VsYXRvci5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDU1L2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDU1L3JlZy5oPgpAQCAtNDQ2LDYgKzQ0OCw5IEBACiAJc3RydWN0IGRhOTA1NV9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJlZ3VsYXRvci0+aW5mbzsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghcGRhdGEpCisJCXJldHVybiAwOworCiAJaWYgKHBkYXRhLT5ncGlvX3JlbiAmJiBwZGF0YS0+Z3Bpb19yZW5baWRdKSB7CiAJCWNoYXIgbmFtZVsxOF07CiAJCWludCBncGlvX211eCA9IHBkYXRhLT5ncGlvX3JlbltpZF07CkBAIC01MzAsNiArNTM1LDU5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIGRhOTA1NV9yZWdfbWF0Y2hlc1tdID0geworCXsgLm5hbWUgPSAiQlVDSzEiLCB9LAorCXsgLm5hbWUgPSAiQlVDSzIiLCB9LAorCXsgLm5hbWUgPSAiTERPMSIsIH0sCisJeyAubmFtZSA9ICJMRE8yIiwgfSwKKwl7IC5uYW1lID0gIkxETzMiLCB9LAorCXsgLm5hbWUgPSAiTERPNCIsIH0sCisJeyAubmFtZSA9ICJMRE81IiwgfSwKKwl7IC5uYW1lID0gIkxETzYiLCB9LAorfTsKKworc3RhdGljIGludCBkYTkwNTVfcmVndWxhdG9yX2R0X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgc3RydWN0IGRhOTA1NV9yZWd1bGF0b3IgKnJlZ3VsYXRvciwKKwkJCQkgICAgc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgKmNvbmZpZywKKwkJCQkgICAgaW50IHJlZ2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnByb290LCAqbnA7CisJaW50IHJldDsKKworCW5wcm9vdCA9IG9mX25vZGVfZ2V0KHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpOworCWlmICghbnByb290KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIG5wLCAmZGE5MDU1X3JlZ19tYXRjaGVzW3JlZ2lkXSwgMSk7CisJb2Zfbm9kZV9wdXQobnByb290KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBtYXRjaGluZyByZWd1bGF0b3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNvbmZpZy0+aW5pdF9kYXRhID0gZGE5MDU1X3JlZ19tYXRjaGVzW3JlZ2lkXS5pbml0X2RhdGE7CisJY29uZmlnLT5vZl9ub2RlID0gZGE5MDU1X3JlZ19tYXRjaGVzW3JlZ2lkXS5vZl9ub2RlOworCisJaWYgKCFjb25maWctPm9mX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZGE5MDU1X3JlZ3VsYXRvcl9kdF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkYTkwNTVfcmVndWxhdG9yICpyZWd1bGF0b3IsCisJCQkJICAgICAgIHN0cnVjdCByZWd1bGF0b3JfY29uZmlnICpjb25maWcsCisJCQkJICAgICAgIGludCByZWdpZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKwogc3RhdGljIGludCBkYTkwNTVfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwpAQCAtNTM4LDkgKzU5Niw2IEBACiAJc3RydWN0IGRhOTA1NV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRhOTA1NS0+ZGV2KTsKIAlpbnQgcmV0LCBpcnE7CiAKLQlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+cmVndWxhdG9yc1twZGV2LT5pZF0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyZWd1bGF0b3IgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBkYTkwNTVfcmVndWxhdG9yKSwKIAkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZWd1bGF0b3IpCkBAIC01NTcsOCArNjEyLDE0IEBACiAJY29uZmlnLmRyaXZlcl9kYXRhID0gcmVndWxhdG9yOwogCWNvbmZpZy5yZWdtYXAgPSBkYTkwNTUtPnJlZ21hcDsKIAotCWlmIChwZGF0YSAmJiBwZGF0YS0+cmVndWxhdG9ycykKKwlpZiAocGRhdGEgJiYgcGRhdGEtPnJlZ3VsYXRvcnMpIHsKIAkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JzW3BkZXYtPmlkXTsKKwl9IGVsc2UgeworCQlyZXQgPSBkYTkwNTVfcmVndWxhdG9yX2R0X2luaXQocGRldiwgcmVndWxhdG9yLCAmY29uZmlnLAorCQkJCQkgICAgICAgcGRldi0+aWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0ID0gZGE5MDU1X2dwaW9faW5pdChyZWd1bGF0b3IsICZjb25maWcsIHBkYXRhLCBwZGV2LT5pZCk7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNjMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNjMtcmVndWxhdG9yLmMKaW5kZXggOTFlOTlhMi4uN2M5NDYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDYzLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA2My1yZWd1bGF0b3IuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiAKIAlzZWwgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyKHJkZXYsIHVWLCB1Vik7CiAJaWYgKHNlbCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gc2VsOwogCiAJc2VsIDw8PSBmZnMocmRldi0+ZGVzYy0+dnNlbF9tYXNrKSAtIDE7CiAKQEAgLTY2Niw3ICs2NjYsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlpbnQgaSwgbiwgbnVtOwogCi0Jbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFub2RlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlZ3VsYXRvcnMgZGV2aWNlIG5vZGUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CkBAIC02NzQsNiArNjc0LDcgQEAKIAogCW51bSA9IG9mX3JlZ3VsYXRvcl9tYXRjaCgmcGRldi0+ZGV2LCBub2RlLCBkYTkwNjNfbWF0Y2hlcywKIAkJCQkgQVJSQVlfU0laRShkYTkwNjNfbWF0Y2hlcykpOworCW9mX25vZGVfcHV0KG5vZGUpOwogCWlmIChudW0gPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBtYXRjaCByZWd1bGF0b3JzXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC03MTAsNyArNzExLDcgQEAKIAkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqKmRhOTA2M19yZWdfbWF0Y2hlcykKIHsKLQlkYTkwNjNfcmVnX21hdGNoZXMgPSBOVUxMOworCSpkYTkwNjNfcmVnX21hdGNoZXMgPSBOVUxMOwogCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogfQogI2VuZGlmCkBAIC03NTYsNyArNzU3LDcgQEAKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiRXJyb3Igd2hpbGUgcmVhZGluZyBCVUNLcyBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByZXQ7CiAJfQogCWJjb3Jlc19tZXJnZWQgPSB2YWwgJiBEQTkwNjNfQkNPUkVfTUVSR0U7CiAJYm1lbV9iaW9fbWVyZ2VkID0gdmFsICYgREE5MDYzX0JVQ0tfTUVSR0U7CkBAIC03NzUsMTAgKzc3Niw4IEBACiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGE5MDYzX3JlZ3VsYXRvcnMpICsKIAkJbl9yZWd1bGF0b3JzICogc2l6ZW9mKHN0cnVjdCBkYTkwNjNfcmVndWxhdG9yKTsKIAlyZWd1bGF0b3JzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghcmVndWxhdG9ycykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBtZW1vcnkgZm9yIHJlZ3VsYXRvcnNcbiIpOworCWlmICghcmVndWxhdG9ycykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcmVndWxhdG9ycy0+bl9yZWd1bGF0b3JzID0gbl9yZWd1bGF0b3JzOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJlZ3VsYXRvcnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MjEwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MjEwLXJlZ3VsYXRvci5jCmluZGV4IDZmNWVjYmUuLjdhMzIwZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTIxMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkyMTAtcmVndWxhdG9yLmMKQEAgLTEzNCwxMSArMTM0LDggQEAKIAlpbnQgZXJyb3I7CiAKIAljaGlwID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBkYTkyMTApLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBjaGlwKSB7Ci0JCWRldl9lcnIoJmkyYy0+ZGV2LAotCQkJIkNhbm5vdCBremFsbG9jIG1lbW9yeSBmb3IgcmVndWxhdG9yIHN0cnVjdHVyZVxuIik7CisJaWYgKCFjaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAljaGlwLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZkYTkyMTBfcmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUihjaGlwLT5yZWdtYXApKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCmluZGV4IDg0NmFjZjIuLjYxN2MxYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCkBAIC0yNjMsNiArMjYzLDggQEAKIAkJCS5vcHMJPSAmZGI4NTAwX3JlZ3VsYXRvcl9vcHMsCiAJCQkudHlwZQk9IFJFR1VMQVRPUl9WT0xUQUdFLAogCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkuZml4ZWRfdVYgPSAxODAwMDAwLAorCQkJLm5fdm9sdGFnZXMgPSAxLAogCQl9LAogCQkuZXhjbHVkZV9mcm9tX3Bvd2VyX3N0YXRlID0gdHJ1ZSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYwppbmRleCBjZTg5Zjc4Li4yZDE2YjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYwpAQCAtNzgsNiArNzgsNyBAQAogdm9pZCB1eDUwMF9yZWd1bGF0b3Jfc3VzcGVuZF9kZWJ1Zyh2b2lkKQogewogCWludCBpOworCiAJZm9yIChpID0gMDsgaSA8IHJkZWJ1Zy5udW1fcmVndWxhdG9yczsgaSsrKQogCQlyZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmRbaV0gPQogCQkJcmRlYnVnLnJlZ3VsYXRvcl9hcnJheVtpXS5pc19lbmFibGVkOwpAQCAtODYsNiArODcsNyBAQAogdm9pZCB1eDUwMF9yZWd1bGF0b3JfcmVzdW1lX2RlYnVnKHZvaWQpCiB7CiAJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgcmRlYnVnLm51bV9yZWd1bGF0b3JzOyBpKyspCiAJCXJkZWJ1Zy5zdGF0ZV9hZnRlcl9zdXNwZW5kW2ldID0KIAkJCXJkZWJ1Zy5yZWd1bGF0b3JfYXJyYXlbaV0uaXNfZW5hYmxlZDsKQEAgLTEyNyw5ICsxMjksOSBAQAogCWludCBpOwogCiAJLyogcHJpbnQgZHVtcCBoZWFkZXIgKi8KLQllcnIgPSBzZXFfcHJpbnRmKHMsICJ1eDUwMC1yZWd1bGF0b3Igc3RhdHVzOlxuIik7CisJZXJyID0gc2VxX3B1dHMocywgInV4NTAwLXJlZ3VsYXRvciBzdGF0dXM6XG4iKTsKIAlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycihkZXYsICJzZXFfcHJpbnRmIG92ZXJmbG93XG4iKTsKKwkJZGV2X2VycihkZXYsICJzZXFfcHV0cyBvdmVyZmxvd1xuIik7CiAKIAllcnIgPSBzZXFfcHJpbnRmKHMsICIlMzFzIDogJThzIDogJThzXG4iLCAiY3VycmVudCIsCiAJCSJiZWZvcmUiLCAiYWZ0ZXIiKTsKQEAgLTIwMiwxOCArMjA0LDEyIEBACiAJcmRlYnVnLm51bV9yZWd1bGF0b3JzID0gbnVtX3JlZ3VsYXRvcnM7CiAKIAlyZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmQgPSBremFsbG9jKG51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkZWJ1Zy5zdGF0ZV9iZWZvcmVfc3VzcGVuZCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc2F2aW5nIHN0YXRlXG4iKTsKKwlpZiAoIXJkZWJ1Zy5zdGF0ZV9iZWZvcmVfc3VzcGVuZCkKIAkJZ290byBleGl0X2Rlc3Ryb3lfcG93ZXJfc3RhdGU7Ci0JfQogCiAJcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmQgPSBremFsbG9jKG51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkZWJ1Zy5zdGF0ZV9hZnRlcl9zdXNwZW5kKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzYXZpbmcgc3RhdGVcbiIpOworCWlmICghcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmQpCiAJCWdvdG8gZXhpdF9mcmVlOwotCX0KIAogCWRieDUwMF9yZWd1bGF0b3JfdGVzdGNhc2UocmVndWxhdG9yX2luZm8sIG51bV9yZWd1bGF0b3JzKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCmluZGV4IGRmOWY0MjUuLjI0MzZkYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYwpAQCAtMjUsNyArMjUsMTEgQEAKIAogc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmR1bW15X3JlZ3VsYXRvcl9yZGV2OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZHVtbXlfaW5pdGRhdGE7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZHVtbXlfaW5pdGRhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkuYWx3YXlzX29uID0gMSwKKwl9LAorfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGR1bW15X29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZmFuNTM1NTUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2ZhbjUzNTU1LmMKaW5kZXggN2NhM2Q5ZS4uNzE0ZmQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZmFuNTM1NTUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9mYW41MzU1NS5jCkBAIC05MCwxMSArOTAsMTEgQEAKIAkJcmV0dXJuIDA7CiAJcmV0ID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcihyZGV2LCB1ViwgdVYpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZGktPnJlZ21hcCwgZGktPnNsZWVwX3JlZywKIAkJCQkJVlNFTF9OU0VMX01BU0ssIHJldCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCS8qIENhY2hlIHRoZSBzbGVlcCB2b2x0YWdlIHNldHRpbmcuCiAJICogTWlnaHQgbm90IGJlIHRoZSByZWFsIHZvbHRhZ2Ugd2hpY2ggaXMgcm91bmRlZCAqLwogCWRpLT5zbGVlcF92b2xfY2FjaGUgPSB1VjsKQEAgLTI0NCwxMCArMjQ0LDkgQEAKIAogCWRpID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBmYW41MzU1NV9kZXZpY2VfaW5mbyksCiAJCQkJCUdGUF9LRVJORUwpOwotCWlmICghZGkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIGluZm8gZGF0YSFcbiIpOworCWlmICghZGkpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCWRpLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZmYW41MzU1NV9yZWdtYXBfY29uZmlnKTsKIAlpZiAoSVNfRVJSKGRpLT5yZWdtYXApKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ21hcCFcbiIpOwpAQCAtMjYwLDE0ICsyNTksMTQgQEAKIAlyZXQgPSByZWdtYXBfcmVhZChkaS0+cmVnbWFwLCBGQU41MzU1NV9JRDEsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjaGlwIElEIVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gcmV0OwogCX0KIAlkaS0+Y2hpcF9pZCA9IHZhbCAmIERJRV9JRDsKIAkvKiBHZXQgY2hpcCByZXZpc2lvbiAqLwogCXJldCA9IHJlZ21hcF9yZWFkKGRpLT5yZWdtYXAsIEZBTjUzNTU1X0lEMiwgJnZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNoaXAgUmV2IVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gcmV0OwogCX0KIAlkaS0+Y2hpcF9yZXYgPSB2YWwgJiBESUVfUkVWOwogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkZBTjUzNTU1IE9wdGlvblslZF0gUmV2WyVkXSBEZXRlY3RlZCFcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9maXhlZC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZml4ZWQuYwppbmRleCA1ZWE2NGI5Li5jNjFmN2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9maXhlZC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMKQEAgLTEzMCwxNyArMTMwLDE1IEBACiAKIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9kYXRhKSwKIAkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoZHJ2ZGF0YSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KKwlpZiAoIWRydmRhdGEpCisJCXJldHVybiAtRU5PTUVNOwogCi0JZHJ2ZGF0YS0+ZGVzYy5uYW1lID0ga3N0cmR1cChjb25maWctPnN1cHBseV9uYW1lLCBHRlBfS0VSTkVMKTsKKwlkcnZkYXRhLT5kZXNjLm5hbWUgPSBkZXZtX2tzdHJkdXAoJnBkZXYtPmRldiwKKwkJCQkJICBjb25maWctPnN1cHBseV9uYW1lLAorCQkJCQkgIEdGUF9LRVJORUwpOwogCWlmIChkcnZkYXRhLT5kZXNjLm5hbWUgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgc3VwcGx5IG5hbWVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWRydmRhdGEtPmRlc2MudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOwogCWRydmRhdGEtPmRlc2Mub3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTE0OSwxMyArMTQ3LDEzIEBACiAJZHJ2ZGF0YS0+ZGVzYy5lbmFibGVfdGltZSA9IGNvbmZpZy0+c3RhcnR1cF9kZWxheTsKIAogCWlmIChjb25maWctPmlucHV0X3N1cHBseSkgewotCQlkcnZkYXRhLT5kZXNjLnN1cHBseV9uYW1lID0ga3N0cmR1cChjb25maWctPmlucHV0X3N1cHBseSwKLQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJZHJ2ZGF0YS0+ZGVzYy5zdXBwbHlfbmFtZSA9IGRldm1fa3N0cmR1cCgmcGRldi0+ZGV2LAorCQkJCQkgICAgY29uZmlnLT5pbnB1dF9zdXBwbHksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkcnZkYXRhLT5kZXNjLnN1cHBseV9uYW1lKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBzdXBwbHlcbiIpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX25hbWU7CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIApAQCAtMTg2LDExICsxODQsMTIgQEAKIAljZmcuZHJpdmVyX2RhdGEgPSBkcnZkYXRhOwogCWNmZy5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKLQlkcnZkYXRhLT5kZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmRydmRhdGEtPmRlc2MsICZjZmcpOworCWRydmRhdGEtPmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkcnZkYXRhLT5kZXNjLAorCQkJCQkgICAgICAgJmNmZyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5kZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHJ2ZGF0YS0+ZGV2KTsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvcjogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2lucHV0OworCQlyZXR1cm4gcmV0OwogCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydmRhdGEpOwpAQCAtMTk5LDI0ICsxOTgsNiBAQAogCQlkcnZkYXRhLT5kZXNjLmZpeGVkX3VWKTsKIAogCXJldHVybiAwOwotCi1lcnJfaW5wdXQ6Ci0Ja2ZyZWUoZHJ2ZGF0YS0+ZGVzYy5zdXBwbHlfbmFtZSk7Ci1lcnJfbmFtZToKLQlrZnJlZShkcnZkYXRhLT5kZXNjLm5hbWUpOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX2ZpeGVkX3ZvbHRhZ2VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGZpeGVkX3ZvbHRhZ2VfZGF0YSAqZHJ2ZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcmVndWxhdG9yX3VucmVnaXN0ZXIoZHJ2ZGF0YS0+ZGV2KTsKLQlrZnJlZShkcnZkYXRhLT5kZXNjLnN1cHBseV9uYW1lKTsKLQlrZnJlZShkcnZkYXRhLT5kZXNjLm5hbWUpOwotCi0JcmV0dXJuIDA7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19PRikKQEAgLTIyOSw3ICsyMTAsNiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByZWd1bGF0b3JfZml4ZWRfdm9sdGFnZV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHJlZ19maXhlZF92b2x0YWdlX3Byb2JlLAotCS5yZW1vdmUJCT0gcmVnX2ZpeGVkX3ZvbHRhZ2VfcmVtb3ZlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYwppbmRleCBjMGExZDAwLi45ODliMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmMKQEAgLTEzNiw3ICsxMzYsNiBAQAogb2ZfZ2V0X2dwaW9fcmVndWxhdG9yX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IGdwaW9fcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnOwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAljb25zdCBjaGFyICpyZWd0eXBlOwogCWludCBwcm9wbGVuLCBncGlvLCBpOwogCWludCByZXQ7CkBAIC0xNzIsMjIgKzE3MSwzNSBAQAogCWlmICghY29uZmlnLT5ncGlvcykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKKwlwcm9wbGVuID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKG5wLCAiZ3Bpb3Mtc3RhdGVzIik7CisJLyogb3B0aW9uYWwgcHJvcGVydHkgKi8KKwlpZiAocHJvcGxlbiA8IDApCisJCXByb3BsZW4gPSAwOworCisJaWYgKHByb3BsZW4gPiAwICYmIHByb3BsZW4gIT0gY29uZmlnLT5ucl9ncGlvcykgeworCQlkZXZfd2FybihkZXYsICJncGlvcyA8LT4gZ3Bpb3Mtc3RhdGVzIG1pc21hdGNoXG4iKTsKKwkJcHJvcGxlbiA9IDA7CisJfQorCiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+bnJfZ3Bpb3M7IGkrKykgewogCQlncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJncGlvcyIsIGkpOwogCQlpZiAoZ3BpbyA8IDApCiAJCQlicmVhazsKIAkJY29uZmlnLT5ncGlvc1tpXS5ncGlvID0gZ3BpbzsKKwkJaWYgKHByb3BsZW4gPiAwKSB7CisJCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgImdwaW9zLXN0YXRlcyIsIGksICZyZXQpOworCQkJaWYgKHJldCkKKwkJCQljb25maWctPmdwaW9zW2ldLmZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfSElHSDsKKwkJfQogCX0KIAogCS8qIEZldGNoIHN0YXRlcy4gKi8KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgInN0YXRlcyIsIE5VTEwpOwotCWlmICghcHJvcCkgeworCXByb3BsZW4gPSBvZl9wcm9wZXJ0eV9jb3VudF91MzJfZWxlbXMobnAsICJzdGF0ZXMiKTsKKwlpZiAocHJvcGxlbiA8IDApIHsKIAkJZGV2X2VycihkZXYsICJObyAnc3RhdGVzJyBwcm9wZXJ0eSBmb3VuZFxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAotCXByb3BsZW4gPSBwcm9wLT5sZW5ndGggLyBzaXplb2YoaW50KTsKLQogCWNvbmZpZy0+c3RhdGVzID0gZGV2bV9remFsbG9jKGRldiwKIAkJCQlzaXplb2Yoc3RydWN0IGdwaW9fcmVndWxhdG9yX3N0YXRlKQogCQkJCSogKHByb3BsZW4gLyAyKSwKQEAgLTE5NiwxMCArMjA4LDEwIEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZm9yIChpID0gMDsgaSA8IHByb3BsZW4gLyAyOyBpKyspIHsKLQkJY29uZmlnLT5zdGF0ZXNbaV0udmFsdWUgPQotCQkJYmUzMl90b19jcHVwKChpbnQgKilwcm9wLT52YWx1ZSArIChpICogMikpOwotCQljb25maWctPnN0YXRlc1tpXS5ncGlvcyA9Ci0JCQliZTMyX3RvX2NwdXAoKGludCAqKXByb3AtPnZhbHVlICsgKGkgKiAyICsgMSkpOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInN0YXRlcyIsIGkgKiAyLAorCQkJCQkgICAmY29uZmlnLT5zdGF0ZXNbaV0udmFsdWUpOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInN0YXRlcyIsIGkgKiAyICsgMSwKKwkJCQkJICAgJmNvbmZpZy0+c3RhdGVzW2ldLmdwaW9zKTsKIAl9CiAJY29uZmlnLT5ucl9zdGF0ZXMgPSBpOwogCkBAIC0yMzksMTAgKzI1MSw4IEBACiAKIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3JfZGF0YSksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRydmRhdGEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIGRhdGFcbiIpOworCWlmIChkcnZkYXRhID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRydmRhdGEtPmRlc2MubmFtZSA9IGtzdHJkdXAoY29uZmlnLT5zdXBwbHlfbmFtZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRydmRhdGEtPmRlc2MubmFtZSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9oZWxwZXJzLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9oZWxwZXJzLmMKaW5kZXggZTIyMWEyNy4uY2JjMzkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvaGVscGVycy5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2hlbHBlcnMuYwpAQCAtMzcsMTAgKzM3LDE3IEBACiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV9pc19pbnZlcnRlZCkKLQkJcmV0dXJuICh2YWwgJiByZGV2LT5kZXNjLT5lbmFibGVfbWFzaykgPT0gMDsKLQllbHNlCi0JCXJldHVybiAodmFsICYgcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2spICE9IDA7CisJdmFsICY9IHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrOworCisJaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV9pc19pbnZlcnRlZCkgeworCQlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX3ZhbCkKKwkJCXJldHVybiB2YWwgIT0gcmRldi0+ZGVzYy0+ZW5hYmxlX3ZhbDsKKwkJcmV0dXJuIHZhbCA9PSAwOworCX0gZWxzZSB7CisJCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfdmFsKQorCQkJcmV0dXJuIHZhbCA9PSByZGV2LT5kZXNjLT5lbmFibGVfdmFsOworCQlyZXR1cm4gdmFsICE9IDA7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwKTsKIApAQCAtNTcsMTAgKzY0LDEzIEBACiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfaXNfaW52ZXJ0ZWQpCi0JCXZhbCA9IDA7Ci0JZWxzZQotCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKKwlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2ludmVydGVkKSB7CisJCXZhbCA9IHJkZXYtPmRlc2MtPmRpc2FibGVfdmFsOworCX0gZWxzZSB7CisJCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV92YWw7CisJCWlmICghdmFsKQorCQkJdmFsID0gcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2s7CisJfQogCiAJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmVuYWJsZV9yZWcsCiAJCQkJICByZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgdmFsKTsKQEAgLTgwLDEwICs5MCwxMyBAQAogewogCXVuc2lnbmVkIGludCB2YWw7CiAKLQlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2ludmVydGVkKQotCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKLQllbHNlCi0JCXZhbCA9IDA7CisJaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV9pc19pbnZlcnRlZCkgeworCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfdmFsOworCQlpZiAoIXZhbCkKKwkJCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrOworCX0gZWxzZSB7CisJCXZhbCA9IHJkZXYtPmRlc2MtPmRpc2FibGVfdmFsOworCX0KIAogCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT5lbmFibGVfcmVnLAogCQkJCSAgcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2ssIHZhbCk7CkBAIC00MTksMTAgKzQzMiwxMyBAQAogewogCXVuc2lnbmVkIGludCB2YWw7CiAKLQlpZiAoZW5hYmxlKQotCQl2YWwgPSByZGV2LT5kZXNjLT5ieXBhc3NfbWFzazsKLQllbHNlCi0JCXZhbCA9IDA7CisJaWYgKGVuYWJsZSkgeworCQl2YWwgPSByZGV2LT5kZXNjLT5ieXBhc3NfdmFsX29uOworCQlpZiAoIXZhbCkKKwkJCXZhbCA9IHJkZXYtPmRlc2MtPmJ5cGFzc19tYXNrOworCX0gZWxzZSB7CisJCXZhbCA9IHJkZXYtPmRlc2MtPmJ5cGFzc192YWxfb2ZmOworCX0KIAogCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT5ieXBhc3NfcmVnLAogCQkJCSAgcmRldi0+ZGVzYy0+YnlwYXNzX21hc2ssIHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jCmluZGV4IDNiMTEwMmIuLjY2ZmQyMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jCkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGkyYywgcmVnKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByZXQ7CiAKIAkqZGVzdCA9IHJldDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2xwODcyeC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbHA4NzJ4LmMKaW5kZXggMmU0NzM0Zi4uMmUwMjJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbHA4NzJ4LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbHA4NzJ4LmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCiAJcmV0ID0gbHA4NzJ4X3JlYWRfYnl0ZShscCwgTFA4NzJYX0dFTkVSQUxfQ0ZHLCAmdmFsKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAogCXZhbCA9ICh2YWwgJiBtYXNrKSA+PiBzaGlmdDsKIAlpZiAodmFsID49IHNpemUpCkBAIC0yMjksNyArMjI5LDcgQEAKIAl1OCBhZGRyLCB2YWw7CiAKIAlpZiAodGltZV9zdGVwX3VzIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiB0aW1lX3N0ZXBfdXM7CiAKIAlzd2l0Y2ggKHJpZCkgewogCWNhc2UgTFA4NzIwX0lEX0xETzEgLi4uIExQODcyMF9JRF9CVUNLOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzcuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LmMKaW5kZXggZTA2MTk1Mi4uZWQ2MGJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzcuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIG1heDE0NTc3LmMgLSBSZWd1bGF0b3IgZHJpdmVyIGZvciB0aGUgTWF4aW0gMTQ1NzcKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQ29weXJpZ2h0IChDKSAyMDEzLDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcwogICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTIyLDEyICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL21heDE0NTc3LXByaXZhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CiAKLXN0cnVjdCBtYXgxNDU3N19yZWd1bGF0b3IgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbWF4MTQ1NzcgKm1heDE0NTc3OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmVndWxhdG9yczsKLX07Ci0KIHN0YXRpYyBpbnQgbWF4MTQ1NzdfcmVnX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJaW50IHJpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTU4Ni5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTU4Ni5jCmluZGV4IGUyNDJkZDMuLmQyM2QwNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE1ODYuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNTg2LmMKQEAgLTQ2LDggKzQ2LDYgQEAKIAogCXVuc2lnbmVkIGludCB2M19jdXJyX3NlbDsKIAl1bnNpZ25lZCBpbnQgdjZfY3Vycl9zZWw7Ci0KLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldlswXTsKIH07CiAKIC8qCkBAIC0xNjIsMTQgKzE2MCwxMiBAQAogc3RhdGljIGludCBtYXgxNTg2X3BtaWNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CiAJc3RydWN0IG1heDE1ODZfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZjbGllbnQtPmRldik7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCXN0cnVjdCBtYXgxNTg2X2RhdGEgKm1heDE1ODY7CiAJaW50IGksIGlkOwogCi0JbWF4MTU4NiA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbWF4MTU4Nl9kYXRhKSArCi0JCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKikgKiAoTUFYMTU4Nl9WNiArIDEpLAorCW1heDE1ODYgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IG1heDE1ODZfZGF0YSksCiAJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIW1heDE1ODYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTg2LDggKzE4Miw5IEBACiAJbWF4MTU4Ni0+djNfY3Vycl9zZWwgPSAyNDsgLyogMS4zViAqLwogCW1heDE1ODYtPnY2X2N1cnJfc2VsID0gMDsKIAotCXJkZXYgPSBtYXgxNTg2LT5yZGV2OwogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3N1YmRldnMgJiYgaSA8PSBNQVgxNTg2X1Y2OyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisKIAkJaWQgPSBwZGF0YS0+c3ViZGV2c1tpXS5pZDsKIAkJaWYgKCFwZGF0YS0+c3ViZGV2c1tpXS5wbGF0Zm9ybV9kYXRhKQogCQkJY29udGludWU7CkBAIC0yMDcsMTIgKzIwNCwxMiBAQAogCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnN1YmRldnNbaV0ucGxhdGZvcm1fZGF0YTsKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gbWF4MTU4NjsKIAotCQlyZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAorCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAogCQkJCQkJICAmbWF4MTU4Nl9yZWdbaWRdLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihyZGV2W2ldKSkgeworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciAlc1xuIiwKIAkJCQltYXgxNTg2X3JlZ1tpZF0ubmFtZSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihyZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY4Ni5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2ODYuYwppbmRleCBhZTAwMWNjLi5lZjFhZjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY4Ni5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3Njg2LmMKQEAgLTY1LDcgKzY1LDYgQEAKIH07CiAKIHN0cnVjdCBtYXg3NzY4Nl9kYXRhIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltNQVg3NzY4Nl9SRUdVTEFUT1JTXTsKIAl1bnNpZ25lZCBpbnQgb3Btb2RlW01BWDc3Njg2X1JFR1VMQVRPUlNdOwogfTsKIApAQCAtNDAwLDcgKzM5OSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAlwbWljX25wID0gaW9kZXYtPmRldi0+b2Zfbm9kZTsKLQlyZWd1bGF0b3JzX25wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUocG1pY19ucCwgInZvbHRhZ2UtcmVndWxhdG9ycyIpOworCXJlZ3VsYXRvcnNfbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwbWljX25wLCAidm9sdGFnZS1yZWd1bGF0b3JzIik7CiAJaWYgKCFyZWd1bGF0b3JzX25wKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIHJlZ3VsYXRvcnMgc3ViLW5vZGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxMCw4ICs0MDksNyBAQAogCXJkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcmRhdGEpICoKIAkJCSAgICAgcGRhdGEtPm51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJkYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWd1bGF0b3IgZGF0YVxuIik7CisJCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnNfbnApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQyNSw2ICs0MjMsNyBAQAogCX0KIAogCXBkYXRhLT5yZWd1bGF0b3JzID0gcmRhdGE7CisJb2Zfbm9kZV9wdXQocmVndWxhdG9yc19ucCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3NCwxNiArNDczLDE4IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWF4Nzc2ODYpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWDc3Njg2X1JFR1VMQVRPUlM7IGkrKykgeworCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwogCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0uaW5pdGRhdGE7CiAJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ub2Zfbm9kZTsKIAogCQltYXg3NzY4Ni0+b3Btb2RlW2ldID0gcmVndWxhdG9yc1tpXS5lbmFibGVfbWFzazsKLQkJbWF4Nzc2ODYtPnJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKIAkJCQkJCSZyZWd1bGF0b3JzW2ldLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihtYXg3NzY4Ni0+cmRldltpXSkpIHsKKwkJaWYgKElTX0VSUihyZGV2KSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgZm9yICVkXG4iLCBpKTsKLQkJCXJldHVybiBQVFJfRVJSKG1heDc3Njg2LT5yZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMuYwppbmRleCA1ZmI4OTlmLi42NTNhNThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLmMKQEAgLTM0LDEzICszNCw2IEBACiAKICNkZWZpbmUgQ0hHSU5fSUxJTV9TVEVQXzIwbUEJCQkyMDAwMAogCi1zdHJ1Y3QgbWF4Nzc2OTNfcG1pY19kZXYgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbWF4Nzc2OTNfZGV2ICppb2RldjsKLQlpbnQgbnVtX3JlZ3VsYXRvcnM7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OwotfTsKLQogLyogQ0hBUkdFUiByZWd1bGF0b3Igb3BzICovCiAvKiBDSEFSR0VSIHJlZ3VsYXRvciB1c2VzIHR3byBiaXRzIGZvciBlbmFibGluZyAqLwogc3RhdGljIGludCBtYXg3NzY5M19jaGdfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKQEAgLTE3MCwxOSArMTYzLDIyIEBACiAJc3RydWN0IG1heDc3NjkzX3JlZ3VsYXRvcl9kYXRhICp0bXA7CiAJaW50IGksIG1hdGNoZWQgPSAwOwogCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShkZXYtPnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+cGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghbnApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcm1hdGNoID0gZGV2bV9remFsbG9jKGRldiwKIAkJIHNpemVvZigqcm1hdGNoKSAqIEFSUkFZX1NJWkUocmVndWxhdG9ycyksIEdGUF9LRVJORUwpOwotCWlmICghcm1hdGNoKQorCWlmICghcm1hdGNoKSB7CisJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVndWxhdG9ycyk7IGkrKykKIAkJcm1hdGNoW2ldLm5hbWUgPSByZWd1bGF0b3JzW2ldLm5hbWU7CiAKIAltYXRjaGVkID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgbnAsIHJtYXRjaCwgQVJSQVlfU0laRShyZWd1bGF0b3JzKSk7CisJb2Zfbm9kZV9wdXQobnApOwogCWlmIChtYXRjaGVkIDw9IDApCiAJCXJldHVybiBtYXRjaGVkOwogCSpyZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqKnJkYXRhKSAqIG1hdGNoZWQsIEdGUF9LRVJORUwpOwpAQCAtMjI5LDcgKzIyNSw2IEBACiBzdGF0aWMgaW50IG1heDc3NjkzX3BtaWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWF4Nzc2OTNfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgbWF4Nzc2OTNfcG1pY19kZXYgKm1heDc3NjkzX3BtaWM7CiAJc3RydWN0IG1heDc3NjkzX3JlZ3VsYXRvcl9kYXRhICpyZGF0YSA9IE5VTEw7CiAJaW50IG51bV9yZGF0YSwgaTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWc7CkBAIC0yNDAsMzkgKzIzNSwyMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltYXg3NzY5M19wbWljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtYXg3NzY5M19wbWljX2RldiksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXg3NzY5M19wbWljKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1heDc3NjkzX3BtaWMtPnJkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKikgKiBudW1fcmRhdGEsCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXg3NzY5M19wbWljLT5yZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1heDc3NjkzX3BtaWMtPmRldiA9ICZwZGV2LT5kZXY7Ci0JbWF4Nzc2OTNfcG1pYy0+aW9kZXYgPSBpb2RldjsKLQltYXg3NzY5M19wbWljLT5udW1fcmVndWxhdG9ycyA9IG51bV9yZGF0YTsKLQogCWNvbmZpZy5kZXYgPSAmcGRldi0+ZGV2OwogCWNvbmZpZy5yZWdtYXAgPSBpb2Rldi0+cmVnbWFwOwotCWNvbmZpZy5kcml2ZXJfZGF0YSA9IG1heDc3NjkzX3BtaWM7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWF4Nzc2OTNfcG1pYyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWF4Nzc2OTNfcG1pYy0+bnVtX3JlZ3VsYXRvcnM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBudW1fcmRhdGE7IGkrKykgewogCQlpbnQgaWQgPSByZGF0YVtpXS5pZDsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAKIAkJY29uZmlnLmluaXRfZGF0YSA9IHJkYXRhW2ldLmluaXRkYXRhOwogCQljb25maWcub2Zfbm9kZSA9IHJkYXRhW2ldLm9mX25vZGU7CiAKLQkJbWF4Nzc2OTNfcG1pYy0+cmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAogCQkJCQkJJnJlZ3VsYXRvcnNbaWRdLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihtYXg3NzY5M19wbWljLT5yZGV2W2ldKSkgewotCQkJZGV2X2VycihtYXg3NzY5M19wbWljLT5kZXYsCisJCWlmIChJU19FUlIocmRldikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgcmVndWxhdG9yLSVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gUFRSX0VSUihtYXg3NzY5M19wbWljLT5yZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKaW5kZXggN2YwNDljOS4uMzE3MmRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYwpAQCAtNDksNyArNDksNiBAQAogI2RlZmluZSBNQVg4NjQ5X1JBTVBfRE9XTgkoMSA8PCAxKQogCiBzdHJ1Y3QgbWF4ODY0OV9yZWd1bGF0b3JfaW5mbyB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYJKnJlZ3VsYXRvcjsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7CiAKQEAgLTE1NCw2ICsxNTMsNyBAQAogewogCXN0cnVjdCBtYXg4NjQ5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwogCXN0cnVjdCBtYXg4NjQ5X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gTlVMTDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVndWxhdG9yOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCXVuc2lnbmVkIGNoYXIgZGF0YTsKQEAgLTIzNCwxMiArMjM0LDEyIEBACiAJY29uZmlnLmRyaXZlcl9kYXRhID0gaW5mbzsKIAljb25maWcucmVnbWFwID0gaW5mby0+cmVnbWFwOwogCi0JaW5mby0+cmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGNkY19kZXNjLAorCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRjZGNfZGVzYywKIAkJCQkJCSAgJmNvbmZpZyk7Ci0JaWYgKElTX0VSUihpbmZvLT5yZWd1bGF0b3IpKSB7CisJaWYgKElTX0VSUihyZWd1bGF0b3IpKSB7CiAJCWRldl9lcnIoaW5mby0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlc1xuIiwKIAkJCWRjZGNfZGVzYy5uYW1lKTsKLQkJcmV0dXJuIFBUUl9FUlIoaW5mby0+cmVndWxhdG9yKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVndWxhdG9yKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYwppbmRleCA4ZDk0ZDNkLi4yZmM0MTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjYwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY2MC5jCkBAIC04MSwxNiArODEsMTcgQEAKIHN0cnVjdCBtYXg4NjYwIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXU4IHNoYWRvd19yZWdzW01BWDg2NjBfTl9SRUdTXTsJCS8qIGFzIGNoaXAgaXMgd3JpdGUgb25seSAqLwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W107CiB9OwogCiBzdGF0aWMgaW50IG1heDg2NjBfd3JpdGUoc3RydWN0IG1heDg2NjAgKm1heDg2NjAsIHU4IHJlZywgdTggbWFzaywgdTggdmFsKQogewotCXN0YXRpYyBjb25zdCB1OCBtYXg4NjYwX2FkZHJlc3Nlc1tNQVg4NjYwX05fUkVHU10gPQotCSAgeyAweDEwLCAweDEyLCAweDIwLCAweDIzLCAweDI0LCAweDI5LCAweDJhLCAweDMyLCAweDMzLCAweDM5LCAweDgwIH07CisJc3RhdGljIGNvbnN0IHU4IG1heDg2NjBfYWRkcmVzc2VzW01BWDg2NjBfTl9SRUdTXSA9IHsKKwkgMHgxMCwgMHgxMiwgMHgyMCwgMHgyMywgMHgyNCwgMHgyOSwgMHgyYSwgMHgzMiwgMHgzMywgMHgzOSwgMHg4MAorCX07CiAKIAlpbnQgcmV0OwogCXU4IHJlZ192YWwgPSAobWF4ODY2MC0+c2hhZG93X3JlZ3NbcmVnXSAmIG1hc2spIHwgdmFsOworCiAJZGV2X3ZkYmcoJm1heDg2NjAtPmNsaWVudC0+ZGV2LCAiV3JpdGluZyByZWcgJTAyeCB3aXRoICUwMnhcbiIsCiAJCQltYXg4NjYwX2FkZHJlc3Nlc1tyZWddLCByZWdfdmFsKTsKIApAQCAtMTEyLDYgKzExMyw3IEBACiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IHZhbCA9IG1heDg2NjAtPnNoYWRvd19yZWdzW01BWDg2NjBfT1ZFUjFdOwogCXU4IG1hc2sgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WMykgPyAxIDogNDsKKwogCXJldHVybiAhISh2YWwgJiBtYXNrKTsKIH0KIApAQCAtMTE5LDYgKzEyMSw3IEBACiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IGJpdCA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1YzKSA/IDEgOiA0OworCiAJcmV0dXJuIG1heDg2NjBfd3JpdGUobWF4ODY2MCwgTUFYODY2MF9PVkVSMSwgMHhmZiwgYml0KTsKIH0KIApAQCAtMTI2LDE1ICsxMjksMTYgQEAKIHsKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTggbWFzayA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1YzKSA/IH4xIDogfjQ7CisKIAlyZXR1cm4gbWF4ODY2MF93cml0ZShtYXg4NjYwLCBNQVg4NjYwX09WRVIxLCBtYXNrLCAwKTsKIH0KIAogc3RhdGljIGludCBtYXg4NjYwX2RjZGNfZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQogCXU4IHJlZyA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1YzKSA/IE1BWDg2NjBfQURUVjIgOiBNQVg4NjYwX1NEVFYyOwogCXU4IHNlbGVjdG9yID0gbWF4ODY2MC0+c2hhZG93X3JlZ3NbcmVnXTsKKwogCXJldHVybiBzZWxlY3RvcjsKIH0KIApAQCAtMjA3LDYgKzIxMSw3IEBACiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IHZhbCA9IG1heDg2NjAtPnNoYWRvd19yZWdzW01BWDg2NjBfT1ZFUjJdOwogCXU4IG1hc2sgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WNikgPyAyIDogNDsKKwogCXJldHVybiAhISh2YWwgJiBtYXNrKTsKIH0KIApAQCAtMjE0LDYgKzIxOSw3IEBACiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IGJpdCA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1Y2KSA/IDIgOiA0OworCiAJcmV0dXJuIG1heDg2NjBfd3JpdGUobWF4ODY2MCwgTUFYODY2MF9PVkVSMiwgMHhmZiwgYml0KTsKIH0KIApAQCAtMjIxLDE1ICsyMjcsMTYgQEAKIHsKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTggbWFzayA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1Y2KSA/IH4yIDogfjQ7CisKIAlyZXR1cm4gbWF4ODY2MF93cml0ZShtYXg4NjYwLCBNQVg4NjYwX09WRVIyLCBtYXNrLCAwKTsKIH0KIAogc3RhdGljIGludCBtYXg4NjYwX2xkbzY3X2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0KIAl1OCBzaGlmdCA9IChyZGV2X2dldF9pZChyZGV2KSA9PSBNQVg4NjYwX1Y2KSA/IDAgOiA0OwogCXU4IHNlbGVjdG9yID0gKG1heDg2NjAtPnNoYWRvd19yZWdzW01BWDg2NjBfTDEyVkNSXSA+PiBzaGlmdCkgJiAweGY7CisKIAlyZXR1cm4gc2VsZWN0b3I7CiB9CiAKQEAgLTMzMCw3ICszMzcsNyBAQAogCXN0cnVjdCBtYXg4NjYwX3N1YmRldl9kYXRhICpzdWI7CiAJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCBybWF0Y2hbQVJSQVlfU0laRShtYXg4NjYwX3JlZyldOwogCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFucCkgewogCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgJ3JlZ3VsYXRvcnMnIHN1Ym5vZGUgaW4gRFRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM0MCw2ICszNDcsNyBAQAogCQlybWF0Y2hbaV0ubmFtZSA9IG1heDg2NjBfcmVnW2ldLm5hbWU7CiAKIAltYXRjaGVkID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgbnAsIHJtYXRjaCwgQVJSQVlfU0laRShybWF0Y2gpKTsKKwlvZl9ub2RlX3B1dChucCk7CiAJaWYgKG1hdGNoZWQgPD0gMCkKIAkJcmV0dXJuIG1hdGNoZWQ7CiAKQEAgLTM3Myw3ICszODEsNiBAQAogc3RhdGljIGludCBtYXg4NjYwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBtYXg4NjYwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKQEAgLTQwNiwxNCArNDEzLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1heDg2NjAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1heDg2NjApICsKLQkJCXNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKSAqIE1BWDg2NjBfVl9FTkQsCi0JCQlHRlBfS0VSTkVMKTsKKwltYXg4NjYwID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXg4NjYwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtYXg4NjYwKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCW1heDg2NjAtPmNsaWVudCA9IGNsaWVudDsKLQlyZGV2ID0gbWF4ODY2MC0+cmRldjsKIAogCWlmIChwZGF0YS0+ZW4zNF9pc19oaWdoKSB7CiAJCS8qIFNpbXVsYXRlIGFsd2F5cyBvbiAqLwpAQCAtNDgxLDYgKzQ4NSw3IEBACiAKIAkvKiBGaW5hbGx5IHJlZ2lzdGVyIGRldmljZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9zdWJkZXZzOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAKIAkJaWQgPSBwZGF0YS0+c3ViZGV2c1tpXS5pZDsKIApAQCAtNDg5LDEzICs0OTQsMTMgQEAKIAkJY29uZmlnLm9mX25vZGUgPSBvZl9ub2RlW2ldOwogCQljb25maWcuZHJpdmVyX2RhdGEgPSBtYXg4NjYwOwogCi0JCXJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsCiAJCQkJCQkgICZtYXg4NjYwX3JlZ1tpZF0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKHJkZXZbaV0pKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHJkZXZbaV0pOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHJkZXYpOwogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJbWF4ODY2MF9yZWdbaWRdLm5hbWUpOwotCQkJcmV0dXJuIFBUUl9FUlIocmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkwNy1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MDctcmVndWxhdG9yLmMKaW5kZXggMGM1ZmU2Yy4uOTYyM2U5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkwNy1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTA3LXJlZ3VsYXRvci5jCkBAIC0zNCw3ICszNCw2IEBACiAKIHN0cnVjdCBtYXg4OTA3X3JlZ3VsYXRvciB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2NbTUFYODkwN19OVU1fUkVHVUxBVE9SU107Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbTUFYODkwN19OVU1fUkVHVUxBVE9SU107CiB9OwogCiAjZGVmaW5lIFJFR19NQkFUVCgpIFwKQEAgLTIzMSw3ICsyMzAsNyBAQAogCWlmICghbnApCiAJCXJldHVybiAwOwogCi0JcmVndWxhdG9ycyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOworCXJlZ3VsYXRvcnMgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3VsYXRvcnMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVndWxhdG9ycyBub2RlIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjkyLDEwICsyOTEsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJcG1pYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBtaWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHBtaWNcbiIpOworCWlmICghcG1pYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG1pYyk7CiAKIAltZW1jcHkocG1pYy0+ZGVzYywgbWF4ODkwN19yZWd1bGF0b3JzLCBzaXplb2YocG1pYy0+ZGVzYykpOwpAQCAtMzExLDYgKzMwOSw4IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1BWDg5MDdfTlVNX1JFR1VMQVRPUlM7IGkrKykgeworCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwogCQljb25maWcuZGV2ID0gcGRldi0+ZGV2LnBhcmVudDsKIAkJaWYgKHBkYXRhKQogCQkJaWRhdGEgPSBwZGF0YS0+aW5pdF9kYXRhW2ldOwpAQCAtMzUwLDEzICszNTAsMTMgQEAKIAkJCQlwbWljLT5kZXNjW2ldLm9wcyA9ICZtYXg4OTA3X291dDV2X2h3Y3RsX29wczsKIAkJfQogCi0JCXBtaWMtPnJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKIAkJCQkJCSZwbWljLT5kZXNjW2ldLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihwbWljLT5yZGV2W2ldKSkgeworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJImZhaWxlZCB0byByZWdpc3RlciAlcyByZWd1bGF0b3JcbiIsCiAJCQkJcG1pYy0+ZGVzY1tpXS5uYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHBtaWMtPnJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jCmluZGV4IDc1OTUxMDcuLmRhZDJiY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYwpAQCAtMzYsOSArMzYsNyBAQAogCiBzdHJ1Y3QgbWF4ODkyNV9yZWd1bGF0b3JfaW5mbyB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjCWRlc2M7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYJKnJlZ3VsYXRvcjsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqaTJjOwotCXN0cnVjdCBtYXg4OTI1X2NoaXAJKmNoaXA7CiAKIAlpbnQJdm9sX3JlZzsKIAlpbnQJZW5hYmxlX3JlZzsKQEAgLTI1MSwxMCArMjQ5LDExIEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucHJvb3QsICpucDsKIAlpbnQgcmNvdW50OworCiAJbnByb290ID0gb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7CiAJaWYgKCFucHJvb3QpCiAJCXJldHVybiAtRU5PREVWOwotCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOworCW5wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOwogCWlmICghbnApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGZpbmQgcmVndWxhdG9ycyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNjQsNyArMjYzLDcgQEAKIAkJCQkmbWF4ODkyNV9yZWd1bGF0b3JfbWF0Y2hlc1tyaWR4XSwgMSk7CiAJb2Zfbm9kZV9wdXQobnApOwogCWlmIChyY291bnQgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIHJjb3VudDsKIAljb25maWctPmluaXRfZGF0YSA9CW1heDg5MjVfcmVndWxhdG9yX21hdGNoZXNbcmlkeF0uaW5pdF9kYXRhOwogCWNvbmZpZy0+b2Zfbm9kZSA9IG1heDg5MjVfcmVndWxhdG9yX21hdGNoZXNbcmlkeF0ub2Zfbm9kZTsKIApAQCAtMzAzLDcgKzMwMiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyaS0+aTJjID0gY2hpcC0+aTJjOwotCXJpLT5jaGlwID0gY2hpcDsKIAogCWNvbmZpZy5kZXYgPSAmcGRldi0+ZGV2OwogCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHJpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCmluZGV4IDc4OGU1YWUuLmQ5MjBmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKQEAgLTQ4LDkgKzQ4LDcgQEAKIAogc3RydWN0IG1heDg5NTJfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBtYXg4OTUyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2CSpyZGV2OwogCiAJYm9vbCB2aWQwOwogCWJvb2wgdmlkMTsKQEAgLTU5LDYgKzU3LDcgQEAKIHN0YXRpYyBpbnQgbWF4ODk1Ml9yZWFkX3JlZyhzdHJ1Y3QgbWF4ODk1Ml9kYXRhICptYXg4OTUyLCB1OCByZWcpCiB7CiAJaW50IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShtYXg4OTUyLT5jbGllbnQsIHJlZyk7CisKIAlpZiAocmV0ID4gMCkKIAkJcmV0ICY9IDB4ZmY7CiAKQEAgLTE0NCwxMCArMTQzLDggQEAKIAlpbnQgaTsKIAogCXBkID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwotCWlmICghcGQpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcGxhdGZvcm0gZGF0YVxuIik7CisJaWYgKCFwZCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcGQtPmdwaW9fdmlkMCA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAibWF4ODk1Mix2aWQtZ3Bpb3MiLCAwKTsKIAlwZC0+Z3Bpb192aWQxID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJtYXg4OTUyLHZpZC1ncGlvcyIsIDEpOwpAQCAtMTk5LDYgKzE5Niw3IEBACiAJc3RydWN0IG1heDg5NTJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZjbGllbnQtPmRldik7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCXN0cnVjdCBtYXg4OTUyX2RhdGEgKm1heDg5NTI7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAKIAlpbnQgcmV0ID0gMCwgZXJyID0gMDsKIApAQCAtMjE5LDEwICsyMTcsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCW1heDg5NTItPmNsaWVudCA9IGNsaWVudDsKLQltYXg4OTUyLT5kZXYgPSAmY2xpZW50LT5kZXY7CiAJbWF4ODk1Mi0+cGRhdGEgPSBwZGF0YTsKIAotCWNvbmZpZy5kZXYgPSBtYXg4OTUyLT5kZXY7CisJY29uZmlnLmRldiA9ICZjbGllbnQtPmRldjsKIAljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnJlZ19kYXRhOwogCWNvbmZpZy5kcml2ZXJfZGF0YSA9IG1heDg5NTI7CiAJY29uZmlnLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOwpAQCAtMjMxLDExICsyMjgsMTEgQEAKIAlpZiAocGRhdGEtPnJlZ19kYXRhLT5jb25zdHJhaW50cy5ib290X29uKQogCQljb25maWcuZW5hX2dwaW9fZmxhZ3MgfD0gR1BJT0ZfT1VUX0lOSVRfSElHSDsKIAotCW1heDg5NTItPnJkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJnJlZ3VsYXRvciwgJmNvbmZpZyk7CisJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJnJlZ3VsYXRvciwgJmNvbmZpZyk7CiAKLQlpZiAoSVNfRVJSKG1heDg5NTItPnJkZXYpKSB7Ci0JCXJldCA9IFBUUl9FUlIobWF4ODk1Mi0+cmRldik7Ci0JCWRldl9lcnIobWF4ODk1Mi0+ZGV2LCAicmVndWxhdG9yIGluaXQgZmFpbGVkICglZClcbiIsIHJldCk7CisJaWYgKElTX0VSUihyZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHJkZXYpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZ3VsYXRvciBpbml0IGZhaWxlZCAoJWQpXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMjYzLDcgKzI2MCw3IEBACiAJCWVyciA9IDM7CiAKIAlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKG1heDg5NTItPmRldiwgIlZJRDAvMSBncGlvIGludmFsaWQ6ICIKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiVklEMC8xIGdwaW8gaW52YWxpZDogIgogCQkJCSJEVlMgbm90IGF2YWlsYWJsZS5cbiIpOwogCQltYXg4OTUyLT52aWQwID0gMDsKIAkJbWF4ODk1Mi0+dmlkMSA9IDA7CkBAIC0yNzQsNyArMjcxLDcgQEAKIAkJLyogRGlzYWJsZSBQdWxsZG93biBvZiBFTiBvbmx5ICovCiAJCW1heDg5NTJfd3JpdGVfcmVnKG1heDg5NTIsIE1BWDg5NTJfUkVHX0NPTlRST0wsIDB4NjApOwogCi0JCWRldl9lcnIobWF4ODk1Mi0+ZGV2LCAiRFZTIG1vZGVzIGRpc2FibGVkIGJlY2F1c2UgVklEMCBhbmQgVklEMSIKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJEVlMgbW9kZXMgZGlzYWJsZWQgYmVjYXVzZSBWSUQwIGFuZCBWSUQxIgogCQkJCSIgZG8gbm90IGhhdmUgcHJvcGVyIGNvbnRyb2xzLlxuIik7CiAJfSBlbHNlIHsKIAkJLyoKQEAgLTMyMSw5ICszMTgsNiBAQAogewogCXN0cnVjdCBtYXg4OTUyX2RhdGEgKm1heDg5NTIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3QgbWF4ODk1Ml9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IG1heDg5NTItPnBkYXRhOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gbWF4ODk1Mi0+cmRldjsKLQotCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHJkZXYpOwogCiAJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3ZpZDApOwogCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb192aWQxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NzMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTczLXJlZ3VsYXRvci5jCmluZGV4IDg5MmFhMWUuLmRiZWRmMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NzMtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk3My1yZWd1bGF0b3IuYwpAQCAtOTMsNyArOTMsNiBAQAogc3RydWN0IG1heDg5NzNfY2hpcCB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlib29sIGVuYWJsZV9leHRlcm5hbF9jb250cm9sOwogCWludCBkdnNfZ3BpbzsKQEAgLTM3OSwxMCArMzc4LDggQEAKIAl9CiAKIAltYXggPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKm1heCksIEdGUF9LRVJORUwpOwotCWlmICghbWF4KSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZm9yIG1heCBmYWlsZWRcbiIpOworCWlmICghbWF4KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAltYXgtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJm1heDg5NzNfcmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUihtYXgtPnJlZ21hcCkpIHsKQEAgLTQ3NCw3ICs0NzEsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCW1heC0+cmRldiA9IHJkZXY7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYwppbmRleCAyZDYxOGZjLi45MGI0YzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCkBAIC0zOCw3ICszOCw2IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBtYXg4OTk3X2RldiAqaW9kZXY7CiAJaW50IG51bV9yZWd1bGF0b3JzOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKIAlpbnQgcmFtcF9kZWxheTsgLyogaW4gbVYvdXMgKi8KIAogCWJvb2wgYnVjazFfZ3Bpb2R2czsKQEAgLTkyNCw3ICs5MjMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZWd1bGF0b3JzX25wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUocG1pY19ucCwgInJlZ3VsYXRvcnMiKTsKKwlyZWd1bGF0b3JzX25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocG1pY19ucCwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3VsYXRvcnNfbnApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGZpbmQgcmVndWxhdG9ycyBzdWItbm9kZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTM3LDcgKzkzNiw2IEBACiAJCQkJcGRhdGEtPm51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJkYXRhKSB7CiAJCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnNfbnApOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWd1bGF0b3IgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTAzMCwxMCArMTAyOCwxMCBAQAogCXN0cnVjdCBtYXg4OTk3X2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBpb2Rldi0+cGRhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgbWF4ODk5N19kYXRhICptYXg4OTk3OwogCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7Ci0JaW50IGksIHJldCwgc2l6ZSwgbnJfZHZzOworCWludCBpLCByZXQsIG5yX2R2czsKIAl1OCBtYXhfYnVjazEgPSAwLCBtYXhfYnVjazIgPSAwLCBtYXhfYnVjazUgPSAwOwogCiAJaWYgKCFwZGF0YSkgewpAQCAtMTA1MiwxMiArMTA1MCw2IEBACiAJaWYgKCFtYXg4OTk3KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKikgKiBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7Ci0JbWF4ODk5Ny0+cmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDg5OTctPnJkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmRldiA9IG1heDg5OTctPnJkZXY7CiAJbWF4ODk5Ny0+ZGV2ID0gJnBkZXYtPmRldjsKIAltYXg4OTk3LT5pb2RldiA9IGlvZGV2OwogCW1heDg5OTctPm51bV9yZWd1bGF0b3JzID0gcGRhdGEtPm51bV9yZWd1bGF0b3JzOwpAQCAtMTIwNSwxMiArMTE5NywxMiBAQAogCQljb25maWcuZHJpdmVyX2RhdGEgPSBtYXg4OTk3OwogCQljb25maWcub2Zfbm9kZSA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLnJlZ19ub2RlOwogCi0JCXJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcmVndWxhdG9yc1tpZF0sCi0JCQkJCQkgICZjb25maWcpOwotCQlpZiAoSVNfRVJSKHJkZXZbaV0pKSB7CisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcmVndWxhdG9yc1tpZF0sCisJCQkJCSAgICAgICAmY29uZmlnKTsKKwkJaWYgKElTX0VSUihyZGV2KSkgewogCQkJZGV2X2VycihtYXg4OTk3LT5kZXYsICJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgZm9yICVkXG4iLAogCQkJCQlpZCk7Ci0JCQlyZXR1cm4gUFRSX0VSUihyZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk4LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk4LmMKaW5kZXggYWUzZjA2NS4uOTYxMDkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5OC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTguYwpAQCAtNDAsNyArNDAsNiBAQAogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IG1heDg5OThfZGV2CSppb2RldjsKIAlpbnQJCQludW1fcmVndWxhdG9yczsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldgkqKnJkZXY7CiAJdTggICAgICAgICAgICAgICAgICAgICAgYnVjazFfdm9sWzRdOyAvKiB2b2x0YWdlcyBmb3Igc2VsZWN0aW9uICovCiAJdTggICAgICAgICAgICAgICAgICAgICAgYnVjazJfdm9sWzJdOwogCXVuc2lnbmVkIGludAkJYnVjazFfaWR4OyAvKiBpbmRleCB0byBsYXN0IGNoYW5nZWQgdm9sdGFnZSAqLwpAQCAtNjc0LDggKzY3MywxMCBAQAogCiAJcmRhdGEgPSBkZXZtX2t6YWxsb2MoaW9kZXYtPmRldiwgc2l6ZW9mKCpyZGF0YSkgKgogCQkJCXBkYXRhLT5udW1fcmVndWxhdG9ycywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZGF0YSkKKwlpZiAoIXJkYXRhKSB7CisJCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnNfbnApOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlwZGF0YS0+cmVndWxhdG9ycyA9IHJkYXRhOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3VsYXRvcnMpOyArK2kpIHsKQEAgLTY5Miw2ICs2OTMsOSBAQAogCX0KIAlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMgPSByZGF0YSAtIHBkYXRhLT5yZWd1bGF0b3JzOwogCisJb2Zfbm9kZV9wdXQocmVnX25wKTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzX25wKTsKKwogCXJldCA9IG1heDg5OThfcG1pY19kdF9wYXJzZV9kdnNfZ3Bpbyhpb2RldiwgcGRhdGEsIHBtaWNfbnApOwogCWlmIChyZXQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzQxLDEwICs3NDUsMTAgQEAKIAlzdHJ1Y3QgbWF4ODk5OF9kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBtYXg4OTk4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gaW9kZXYtPnBkYXRhOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IG1heDg5OThfZGF0YSAqbWF4ODk5ODsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwotCWludCBpLCByZXQsIHNpemU7CisJaW50IGksIHJldDsKIAl1bnNpZ25lZCBpbnQgdjsKIAogCWlmICghcGRhdGEpIHsKQEAgLTc2MywxMiArNzY3LDYgQEAKIAlpZiAoIW1heDg5OTgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKSAqIHBkYXRhLT5udW1fcmVndWxhdG9yczsKLQltYXg4OTk4LT5yZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghbWF4ODk5OC0+cmRldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZGV2ID0gbWF4ODk5OC0+cmRldjsKIAltYXg4OTk4LT5kZXYgPSAmcGRldi0+ZGV2OwogCW1heDg5OTgtPmlvZGV2ID0gaW9kZXY7CiAJbWF4ODk5OC0+bnVtX3JlZ3VsYXRvcnMgPSBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7CkBAIC04NzIsMTMgKzg3MCwxMiBAQAogCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0uaW5pdGRhdGE7CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IG1heDg5OTg7CiAKLQkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCi0JCQkJCQkgICZyZWd1bGF0b3JzW2luZGV4XSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpXSkpIHsKLQkJCXJldCA9IFBUUl9FUlIocmRldltpXSk7CisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcmVndWxhdG9yc1tpbmRleF0sCisJCQkJCSAgICAgICAmY29uZmlnKTsKKwkJaWYgKElTX0VSUihyZGV2KSkgeworCQkJcmV0ID0gUFRSX0VSUihyZGV2KTsKIAkJCWRldl9lcnIobWF4ODk5OC0+ZGV2LCAicmVndWxhdG9yICVzIGluaXQgZmFpbGVkICglZClcbiIsCiAJCQkJCQlyZWd1bGF0b3JzW2luZGV4XS5uYW1lLCByZXQpOwotCQkJcmRldltpXSA9IE5VTEw7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jCmluZGV4IGRhNDg1OTIuLjA1Yjk3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMKQEAgLTE2Nyw4ICsxNjcsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudDsKIAlpbnQgbnVtOwogCi0Jb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7Ci0JcGFyZW50ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlpZiAoIXBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCisJcGFyZW50ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE4Nyw4ICsxODksMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgKmNoaWxkOwogCWludCBpLCBwYXJzZWQgPSAwOwogCi0Jb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7Ci0JcGFyZW50ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlpZiAoIXBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpCisJCXJldHVybiBOVUxMOworCisJcGFyZW50ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3BmdXplMTAwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcGZ1emUxMDAtcmVndWxhdG9yLmMKaW5kZXggYWIxNzRmMjAuLjY3ZTY3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3BmdXplMTAwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3BmdXplMTAwLXJlZ3VsYXRvci5jCkBAIC01Niw2ICs1Niw4IEBACiAjZGVmaW5lIFBGVVpFMTAwX1ZHRU41Vk9MCTB4NzAKICNkZWZpbmUgUEZVWkUxMDBfVkdFTjZWT0wJMHg3MQogCitlbnVtIGNoaXBzIHsgUEZVWkUxMDAsIFBGVVpFMjAwIH07CisKIHN0cnVjdCBwZnV6ZV9yZWd1bGF0b3IgewogCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjOwogCXVuc2lnbmVkIGNoYXIgc3RieV9yZWc7CkBAIC02Myw2ICs2NSw3IEBACiB9OwogCiBzdHJ1Y3QgcGZ1emVfY2hpcCB7CisJaW50CWNoaXBfaWQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGZ1emVfcmVndWxhdG9yIHJlZ3VsYXRvcl9kZXNjc1tQRlVaRTEwMF9NQVhfUkVHVUxBVE9SXTsKQEAgLTc4LDIxICs4MSwyMyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBmdXplX2RldmljZV9pZFtdID0gewotCXsubmFtZSA9ICJwZnV6ZTEwMCJ9LAotCXt9LAorCXsubmFtZSA9ICJwZnV6ZTEwMCIsIC5kcml2ZXJfZGF0YSA9IFBGVVpFMTAwfSwKKwl7Lm5hbWUgPSAicGZ1emUyMDAiLCAuZHJpdmVyX2RhdGEgPSBQRlVaRTIwMH0sCisJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHBmdXplX2RldmljZV9pZCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBmdXplX2R0X2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBmdXplMTAwIiB9LAotCXt9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBmdXplMTAwIiwgLmRhdGEgPSAodm9pZCAqKVBGVVpFMTAwfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxwZnV6ZTIwMCIsIC5kYXRhID0gKHZvaWQgKilQRlVaRTIwMH0sCisJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcGZ1emVfZHRfaWRzKTsKIAogc3RhdGljIGludCBwZnV6ZTEwMF9zZXRfcmFtcF9kZWxheShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHJhbXBfZGVsYXkpCiB7CiAJc3RydWN0IHBmdXplX2NoaXAgKnBmdXplMTAwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgaWQgPSByZGV2LT5kZXNjLT5pZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKIAl1bnNpZ25lZCBpbnQgcmFtcF9iaXRzOwogCWludCByZXQ7CiAKQEAgLTEzOSwxNCArMTQ0LDE0IEBACiAKIH07CiAKLSNkZWZpbmUgUEZVWkUxMDBfRklYRURfUkVHKF9uYW1lLCBiYXNlLCB2b2x0YWdlKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfRklYRURfUkVHKF9jaGlwLCBfbmFtZSwgYmFzZSwgdm9sdGFnZSkJXAorCVtfY2hpcCAjIyBfICMjIF9uYW1lXSA9IHsJXAogCQkuZGVzYyA9IHsJXAogCQkJLm5hbWUgPSAjX25hbWUsCVwKIAkJCS5uX3ZvbHRhZ2VzID0gMSwJXAogCQkJLm9wcyA9ICZwZnV6ZTEwMF9maXhlZF9yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkubWluX3VWID0gKHZvbHRhZ2UpLAlcCiAJCQkuZW5hYmxlX3JlZyA9IChiYXNlKSwJXApAQCAtMTU0LDE0ICsxNTksMTQgQEAKIAkJfSwJXAogCX0KIAotI2RlZmluZSBQRlVaRTEwMF9TV19SRUcoX25hbWUsIGJhc2UsIG1pbiwgbWF4LCBzdGVwKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfU1dfUkVHKF9jaGlwLCBfbmFtZSwgYmFzZSwgbWluLCBtYXgsIHN0ZXApCVwKKwlbX2NoaXAgIyMgXyAjIyBfbmFtZV0gPSB7CVwKIAkJLmRlc2MgPSB7CVwKIAkJCS5uYW1lID0gI19uYW1lLFwKIAkJCS5uX3ZvbHRhZ2VzID0gKChtYXgpIC0gKG1pbikpIC8gKHN0ZXApICsgMSwJXAogCQkJLm9wcyA9ICZwZnV6ZTEwMF9zd19yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkubWluX3VWID0gKG1pbiksCVwKIAkJCS51Vl9zdGVwID0gKHN0ZXApLAlcCkBAIC0xNzIsMTQgKzE3NywxNCBAQAogCQkuc3RieV9tYXNrID0gMHgzZiwJXAogCX0KIAotI2RlZmluZSBQRlVaRTEwMF9TV0JfUkVHKF9uYW1lLCBiYXNlLCBtYXNrLCB2b2x0YWdlcykJXAotCVtQRlVaRTEwMF8gIyMgX25hbWVdID0gewlcCisjZGVmaW5lIFBGVVpFMTAwX1NXQl9SRUcoX2NoaXAsIF9uYW1lLCBiYXNlLCBtYXNrLCB2b2x0YWdlcykJXAorCVtfY2hpcCAjIyBfICMjICBfbmFtZV0gPSB7CVwKIAkJLmRlc2MgPSB7CVwKIAkJCS5uYW1lID0gI19uYW1lLAlcCiAJCQkubl92b2x0YWdlcyA9IEFSUkFZX1NJWkUodm9sdGFnZXMpLAlcCiAJCQkub3BzID0gJnBmdXplMTAwX3N3Yl9yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkudm9sdF90YWJsZSA9IHZvbHRhZ2VzLAlcCiAJCQkudnNlbF9yZWcgPSAoYmFzZSksCVwKQEAgLTE4NywxNCArMTkyLDE0IEBACiAJCX0sCVwKIAl9CiAKLSNkZWZpbmUgUEZVWkUxMDBfVkdFTl9SRUcoX25hbWUsIGJhc2UsIG1pbiwgbWF4LCBzdGVwKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfVkdFTl9SRUcoX2NoaXAsIF9uYW1lLCBiYXNlLCBtaW4sIG1heCwgc3RlcCkJXAorCVtfY2hpcCAjIyBfICMjIF9uYW1lXSA9IHsJXAogCQkuZGVzYyA9IHsJXAogCQkJLm5hbWUgPSAjX25hbWUsCVwKIAkJCS5uX3ZvbHRhZ2VzID0gKChtYXgpIC0gKG1pbikpIC8gKHN0ZXApICsgMSwJXAogCQkJLm9wcyA9ICZwZnV6ZTEwMF9sZG9fcmVndWxhdG9yX29wcywJXAogCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJXAotCQkJLmlkID0gUEZVWkUxMDBfICMjIF9uYW1lLAlcCisJCQkuaWQgPSBfY2hpcCAjIyBfICMjIF9uYW1lLAlcCiAJCQkub3duZXIgPSBUSElTX01PRFVMRSwJXAogCQkJLm1pbl91ViA9IChtaW4pLAlcCiAJCQkudVZfc3RlcCA9IChzdGVwKSwJXApAQCAtMjA3LDI1ICsyMTIsNDUgQEAKIAkJLnN0YnlfbWFzayA9IDB4MjAsCVwKIAl9CiAKKy8qIFBGVVpFMTAwICovCiBzdGF0aWMgc3RydWN0IHBmdXplX3JlZ3VsYXRvciBwZnV6ZTEwMF9yZWd1bGF0b3JzW10gPSB7Ci0JUEZVWkUxMDBfU1dfUkVHKFNXMUFCLCBQRlVaRTEwMF9TVzFBQlZPTCwgMzAwMDAwLCAxODc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dfUkVHKFNXMUMsIFBGVVpFMTAwX1NXMUNWT0wsIDMwMDAwMCwgMTg3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXX1JFRyhTVzIsIFBGVVpFMTAwX1NXMlZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dfUkVHKFNXM0EsIFBGVVpFMTAwX1NXM0FWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXX1JFRyhTVzNCLCBQRlVaRTEwMF9TVzNCVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKLQlQRlVaRTEwMF9TV19SRUcoU1c0LCBQRlVaRTEwMF9TVzRWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXQl9SRUcoU1dCU1QsIFBGVVpFMTAwX1NXQlNUQ09OMSwgMHgzICwgcGZ1emUxMDBfc3dic3QpLAotCVBGVVpFMTAwX1NXQl9SRUcoVlNOVlMsIFBGVVpFMTAwX1ZTTlZTVk9MLCAweDcsIHBmdXplMTAwX3ZzbnZzKSwKLQlQRlVaRTEwMF9GSVhFRF9SRUcoVlJFRkREUiwgUEZVWkUxMDBfVlJFRkREUkNPTiwgNzUwMDAwKSwKLQlQRlVaRTEwMF9WR0VOX1JFRyhWR0VOMSwgUEZVWkUxMDBfVkdFTjFWT0wsIDgwMDAwMCwgMTU1MDAwMCwgNTAwMDApLAotCVBGVVpFMTAwX1ZHRU5fUkVHKFZHRU4yLCBQRlVaRTEwMF9WR0VOMlZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCi0JUEZVWkUxMDBfVkdFTl9SRUcoVkdFTjMsIFBGVVpFMTAwX1ZHRU4zVk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAotCVBGVVpFMTAwX1ZHRU5fUkVHKFZHRU40LCBQRlVaRTEwMF9WR0VONFZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKLQlQRlVaRTEwMF9WR0VOX1JFRyhWR0VONSwgUEZVWkUxMDBfVkdFTjVWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCi0JUEZVWkUxMDBfVkdFTl9SRUcoVkdFTjYsIFBGVVpFMTAwX1ZHRU42Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1cxQUIsIFBGVVpFMTAwX1NXMUFCVk9MLCAzMDAwMDAsIDE4NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUxMDAsIFNXMUMsIFBGVVpFMTAwX1NXMUNWT0wsIDMwMDAwMCwgMTg3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1cyLCBQRlVaRTEwMF9TVzJWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1czQSwgUEZVWkUxMDBfU1czQVZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMTAwLCBTVzNCLCBQRlVaRTEwMF9TVzNCVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUxMDAsIFNXNCwgUEZVWkUxMDBfU1c0Vk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV0JfUkVHKFBGVVpFMTAwLCBTV0JTVCwgUEZVWkUxMDBfU1dCU1RDT04xLCAweDMgLCBwZnV6ZTEwMF9zd2JzdCksCisJUEZVWkUxMDBfU1dCX1JFRyhQRlVaRTEwMCwgVlNOVlMsIFBGVVpFMTAwX1ZTTlZTVk9MLCAweDcsIHBmdXplMTAwX3ZzbnZzKSwKKwlQRlVaRTEwMF9GSVhFRF9SRUcoUEZVWkUxMDAsIFZSRUZERFIsIFBGVVpFMTAwX1ZSRUZERFJDT04sIDc1MDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU4xLCBQRlVaRTEwMF9WR0VOMVZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU4yLCBQRlVaRTEwMF9WR0VOMlZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU4zLCBQRlVaRTEwMF9WR0VOM1ZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTEwMCwgVkdFTjQsIFBGVVpFMTAwX1ZHRU40Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMTAwLCBWR0VONSwgUEZVWkUxMDBfVkdFTjVWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU42LCBQRlVaRTEwMF9WR0VONlZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGZ1emVfcmVndWxhdG9yIHBmdXplMjAwX3JlZ3VsYXRvcnNbXSA9IHsKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUyMDAsIFNXMUFCLCBQRlVaRTEwMF9TVzFBQlZPTCwgMzAwMDAwLCAxODc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMjAwLCBTVzIsIFBGVVpFMTAwX1NXMlZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMjAwLCBTVzNBLCBQRlVaRTEwMF9TVzNBVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUyMDAsIFNXM0IsIFBGVVpFMTAwX1NXM0JWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXQl9SRUcoUEZVWkUyMDAsIFNXQlNULCBQRlVaRTEwMF9TV0JTVENPTjEsIDB4MyAsIHBmdXplMTAwX3N3YnN0KSwKKwlQRlVaRTEwMF9TV0JfUkVHKFBGVVpFMjAwLCBWU05WUywgUEZVWkUxMDBfVlNOVlNWT0wsIDB4NywgcGZ1emUxMDBfdnNudnMpLAorCVBGVVpFMTAwX0ZJWEVEX1JFRyhQRlVaRTIwMCwgVlJFRkREUiwgUEZVWkUxMDBfVlJFRkREUkNPTiwgNzUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjEsIFBGVVpFMTAwX1ZHRU4xVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjIsIFBGVVpFMTAwX1ZHRU4yVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjMsIFBGVVpFMTAwX1ZHRU4zVk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMjAwLCBWR0VONCwgUEZVWkUxMDBfVkdFTjRWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUyMDAsIFZHRU41LCBQRlVaRTEwMF9WR0VONVZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjYsIFBGVVpFMTAwX1ZHRU42Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorfTsKKworc3RhdGljIHN0cnVjdCBwZnV6ZV9yZWd1bGF0b3IgKnBmdXplX3JlZ3VsYXRvcnM7CisKICNpZmRlZiBDT05GSUdfT0YKKy8qIFBGVVpFMTAwICovCiBzdGF0aWMgc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCBwZnV6ZTEwMF9tYXRjaGVzW10gPSB7CiAJeyAubmFtZSA9ICJzdzFhYiIsCX0sCiAJeyAubmFtZSA9ICJzdzFjIiwJfSwKQEAgLTI0NCwyNCArMjY5LDU2IEBACiAJeyAubmFtZSA9ICJ2Z2VuNiIsCX0sCiB9OwogCisvKiBQRlVaRTIwMCAqLworc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggcGZ1emUyMDBfbWF0Y2hlc1tdID0geworCisJeyAubmFtZSA9ICJzdzFhYiIsCX0sCisJeyAubmFtZSA9ICJzdzIiLAl9LAorCXsgLm5hbWUgPSAic3czYSIsCX0sCisJeyAubmFtZSA9ICJzdzNiIiwJfSwKKwl7IC5uYW1lID0gInN3YnN0IiwJfSwKKwl7IC5uYW1lID0gInZzbnZzIiwJfSwKKwl7IC5uYW1lID0gInZyZWZkZHIiLAl9LAorCXsgLm5hbWUgPSAidmdlbjEiLAl9LAorCXsgLm5hbWUgPSAidmdlbjIiLAl9LAorCXsgLm5hbWUgPSAidmdlbjMiLAl9LAorCXsgLm5hbWUgPSAidmdlbjQiLAl9LAorCXsgLm5hbWUgPSAidmdlbjUiLAl9LAorCXsgLm5hbWUgPSAidmdlbjYiLAl9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKnBmdXplX21hdGNoZXM7CisKIHN0YXRpYyBpbnQgcGZ1emVfcGFyc2VfcmVndWxhdG9yc19kdChzdHJ1Y3QgcGZ1emVfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjaGlwLT5kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnBhcmVudDsKIAlpbnQgcmV0OwogCi0JbnAgPSBvZl9ub2RlX2dldChkZXYtPnBhcmVudC0+b2Zfbm9kZSk7CisJbnAgPSBvZl9ub2RlX2dldChkZXYtPm9mX25vZGUpOwogCWlmICghbnApCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhcmVudCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOworCXBhcmVudCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwogCWlmICghcGFyZW50KSB7CiAJCWRldl9lcnIoZGV2LCAicmVndWxhdG9ycyBub2RlIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIHBhcmVudCwgcGZ1emUxMDBfbWF0Y2hlcywKLQkJCQkgQVJSQVlfU0laRShwZnV6ZTEwMF9tYXRjaGVzKSk7CisJc3dpdGNoIChjaGlwLT5jaGlwX2lkKSB7CisJY2FzZSBQRlVaRTIwMDoKKwkJcGZ1emVfbWF0Y2hlcyA9IHBmdXplMjAwX21hdGNoZXM7CisJCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIHBhcmVudCwgcGZ1emUyMDBfbWF0Y2hlcywKKwkJCQkJIEFSUkFZX1NJWkUocGZ1emUyMDBfbWF0Y2hlcykpOworCQlicmVhazsKKworCWNhc2UgUEZVWkUxMDA6CisJZGVmYXVsdDoKKwkJcGZ1emVfbWF0Y2hlcyA9IHBmdXplMTAwX21hdGNoZXM7CisJCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIHBhcmVudCwgcGZ1emUxMDBfbWF0Y2hlcywKKwkJCQkJIEFSUkFZX1NJWkUocGZ1emUxMDBfbWF0Y2hlcykpOworCQlicmVhazsKKwl9CiAKIAlvZl9ub2RlX3B1dChwYXJlbnQpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0yNzUsMTIgKzMzMiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICptYXRjaF9pbml0X2RhdGEoaW50IGluZGV4KQogewotCXJldHVybiBwZnV6ZTEwMF9tYXRjaGVzW2luZGV4XS5pbml0X2RhdGE7CisJcmV0dXJuIHBmdXplX21hdGNoZXNbaW5kZXhdLmluaXRfZGF0YTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hdGNoX29mX25vZGUoaW50IGluZGV4KQogewotCXJldHVybiBwZnV6ZTEwMF9tYXRjaGVzW2luZGV4XS5vZl9ub2RlOworCXJldHVybiBwZnV6ZV9tYXRjaGVzW2luZGV4XS5vZl9ub2RlOwogfQogI2Vsc2UKIHN0YXRpYyBpbnQgcGZ1emVfcGFyc2VfcmVndWxhdG9yc19kdChzdHJ1Y3QgcGZ1emVfY2hpcCAqY2hpcCkKQEAgLTMwOCwxNiArMzY1LDE0IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXN3aXRjaCAodmFsdWUgJiAweDBmKSB7Ci0JLyoKLQkgKiBGcmVlc2NhbGUgbWlzcHJvZ3JhbW1lZCAxLTMlIG9mIHBhcnRzIHByaW9yIHRvIHdlZWsgOCBvZiAyMDEzCi0JICogYXMgSUQ9OAotCSAqLwotCWNhc2UgMHg4OgorCWlmICgoKHZhbHVlICYgMHgwZikgPT0gMHg4KSAmJiAocGZ1emVfY2hpcC0+Y2hpcF9pZCA9PSBQRlVaRTEwMCkpIHsKKwkJLyoKKwkJICogRnJlZXNjYWxlIG1pc3Byb2dyYW1tZWQgMS0zJSBvZiBwYXJ0cyBwcmlvciB0byB3ZWVrIDggb2YgMjAxMworCQkgKiBhcyBJRD04IGluIFBGVVpFMTAwCisJCSAqLwogCQlkZXZfaW5mbyhwZnV6ZV9jaGlwLT5kZXYsICJBc3N1bWluZyBtaXNwcm9ncmFtbWVkIElEPTB4OCIpOwotCWNhc2UgMHgwOgotCQlicmVhazsKLQlkZWZhdWx0OgorCX0gZWxzZSBpZiAoKHZhbHVlICYgMHgwZikgIT0gcGZ1emVfY2hpcC0+Y2hpcF9pZCkgeworCQkvKiBkZXZpY2UgaWQgTk9UIG1hdGNoIHdpdGggeW91ciBzZXR0aW5nICovCiAJCWRldl93YXJuKHBmdXplX2NoaXAtPmRldiwgIklsbGVnYWwgSUQ6ICV4XG4iLCB2YWx1ZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTM1MywxNyArNDA4LDMxIEBACiAJICAgIGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJaW50IGksIHJldDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwl1MzIgcmVndWxhdG9yX251bTsKKwl1MzIgc3dfY2hlY2tfc3RhcnQsIHN3X2NoZWNrX2VuZDsKIAogCXBmdXplX2NoaXAgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnBmdXplX2NoaXApLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZnV6ZV9jaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlmIChjbGllbnQtPmRldi5vZl9ub2RlKSB7CisJCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihwZnV6ZV9kdF9pZHMpLAorCQkJCSZjbGllbnQtPmRldik7CisJCWlmICghbWF0Y2gpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXJyb3I6IE5vIGRldmljZSBtYXRjaCBmb3VuZFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlwZnV6ZV9jaGlwLT5jaGlwX2lkID0gKGludCkobG9uZyltYXRjaC0+ZGF0YTsKKwl9IGVsc2UgaWYgKGlkKSB7CisJCXBmdXplX2NoaXAtPmNoaXBfaWQgPSBpZC0+ZHJpdmVyX2RhdGE7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyBkdHMgbWF0Y2ggb3IgaWQgdGFibGUgbWF0Y2ggZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwZnV6ZV9jaGlwKTsKLQotCW1lbWNweShwZnV6ZV9jaGlwLT5yZWd1bGF0b3JfZGVzY3MsIHBmdXplMTAwX3JlZ3VsYXRvcnMsCi0JCXNpemVvZihwZnV6ZV9jaGlwLT5yZWd1bGF0b3JfZGVzY3MpKTsKLQogCXBmdXplX2NoaXAtPmRldiA9ICZjbGllbnQtPmRldjsKIAogCXBmdXplX2NoaXAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnBmdXplX3JlZ21hcF9jb25maWcpOwpAQCAtMzgwLDExICs0NDksMzQgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKiB1c2UgdGhlIHJpZ2h0IHJlZ3VsYXRvcnMgYWZ0ZXIgaWRlbnRpZnkgdGhlIHJpZ2h0IGRldmljZSAqLworCXN3aXRjaCAocGZ1emVfY2hpcC0+Y2hpcF9pZCkgeworCWNhc2UgUEZVWkUyMDA6CisJCXBmdXplX3JlZ3VsYXRvcnMgPSBwZnV6ZTIwMF9yZWd1bGF0b3JzOworCQlyZWd1bGF0b3JfbnVtID0gQVJSQVlfU0laRShwZnV6ZTIwMF9yZWd1bGF0b3JzKTsKKwkJc3dfY2hlY2tfc3RhcnQgPSBQRlVaRTIwMF9TVzI7CisJCXN3X2NoZWNrX2VuZCA9IFBGVVpFMjAwX1NXM0I7CisJCWJyZWFrOworCisJY2FzZSBQRlVaRTEwMDoKKwlkZWZhdWx0OgorCQlwZnV6ZV9yZWd1bGF0b3JzID0gcGZ1emUxMDBfcmVndWxhdG9yczsKKwkJcmVndWxhdG9yX251bSA9IEFSUkFZX1NJWkUocGZ1emUxMDBfcmVndWxhdG9ycyk7CisJCXN3X2NoZWNrX3N0YXJ0ID0gUEZVWkUxMDBfU1cyOworCQlzd19jaGVja19lbmQgPSBQRlVaRTEwMF9TVzQ7CisJCWJyZWFrOworCX0KKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJwZnV6ZSVzIGZvdW5kLlxuIiwKKwkJKHBmdXplX2NoaXAtPmNoaXBfaWQgPT0gUEZVWkUxMDApID8gIjEwMCIgOiAiMjAwIik7CisKKwltZW1jcHkocGZ1emVfY2hpcC0+cmVndWxhdG9yX2Rlc2NzLCBwZnV6ZV9yZWd1bGF0b3JzLAorCQlzaXplb2YocGZ1emVfY2hpcC0+cmVndWxhdG9yX2Rlc2NzKSk7CisKIAlyZXQgPSBwZnV6ZV9wYXJzZV9yZWd1bGF0b3JzX2R0KHBmdXplX2NoaXApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUEZVWkUxMDBfTUFYX1JFR1VMQVRPUjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHJlZ3VsYXRvcl9udW07IGkrKykgewogCQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhOwogCQlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2M7CiAJCWludCB2YWw7CkBAIC0zOTcsNyArNDg5LDcgQEAKIAkJCWluaXRfZGF0YSA9IG1hdGNoX2luaXRfZGF0YShpKTsKIAogCQkvKiBTVzJ+U1c0IGhpZ2ggYml0IGNoZWNrIGFuZCBtb2RpZnkgdGhlIHZvbHRhZ2UgdmFsdWUgdGFibGUgKi8KLQkJaWYgKGkgPiBQRlVaRTEwMF9TVzFDICYmIGkgPCBQRlVaRTEwMF9TV0JTVCkgeworCQlpZiAoaSA+PSBzd19jaGVja19zdGFydCAmJiBpIDw9IHN3X2NoZWNrX2VuZCkgewogCQkJcmVnbWFwX3JlYWQocGZ1emVfY2hpcC0+cmVnbWFwLCBkZXNjLT52c2VsX3JlZywgJnZhbCk7CiAJCQlpZiAodmFsICYgMHg0MCkgewogCQkJCWRlc2MtPm1pbl91ViA9IDgwMDAwMDsKQEAgLTQxNSw3ICs1MDcsNyBAQAogCQkJZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBkZXNjLCAmY29uZmlnKTsKIAkJaWYgKElTX0VSUihwZnV6ZV9jaGlwLT5yZWd1bGF0b3JzW2ldKSkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWdpc3RlciByZWd1bGF0b3IlcyBmYWlsZWRcbiIsCi0JCQkJcGZ1emUxMDBfcmVndWxhdG9yc1tpXS5kZXNjLm5hbWUpOworCQkJCXBmdXplX3JlZ3VsYXRvcnNbaV0uZGVzYy5uYW1lKTsKIAkJCXJldHVybiBQVFJfRVJSKHBmdXplX2NoaXAtPnJlZ3VsYXRvcnNbaV0pOwogCQl9CiAJfQpAQCAtNDM1LDYgKzUyNyw2IEBACiBtb2R1bGVfaTJjX2RyaXZlcihwZnV6ZV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJSb2JpbiBHb25nIDxiMzgzNDNAZnJlZXNjYWxlLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUmVndWxhdG9yIERyaXZlciBmb3IgRnJlZXNjYWxlIFBGVVpFMTAwIFBNSUMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVndWxhdG9yIERyaXZlciBmb3IgRnJlZXNjYWxlIFBGVVpFMTAwL1BGVVpFMjAwIFBNSUMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9BTElBUygiaTJjOnBmdXplMTAwLXJlZ3VsYXRvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcmM1dDU4My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3JjNXQ1ODMtcmVndWxhdG9yLmMKaW5kZXggYjU4YWZmYi4uNGM0MTRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcmM1dDU4My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9yYzV0NTgzLXJlZ3VsYXRvci5jCkBAIC0xMTksNyArMTE5LDYgQEAKIHsKIAlzdHJ1Y3QgcmM1dDU4MyAqcmM1dDU4MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgcmM1dDU4M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocmM1dDU4My0+ZGV2KTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCXN0cnVjdCByYzV0NTgzX3JlZ3VsYXRvciAqcmVnID0gTlVMTDsKIAlzdHJ1Y3QgcmM1dDU4M19yZWd1bGF0b3IgKnJlZ3M7CkBAIC0xMzUsMTkgKzEzNCwxMSBAQAogCiAJcmVncyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBSQzVUNTgzX1JFR1VMQVRPUl9NQVggKgogCQkJc2l6ZW9mKHN0cnVjdCByYzV0NTgzX3JlZ3VsYXRvciksIEdGUF9LRVJORUwpOwotCWlmICghcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZXhpdGluZy4uXG4iKTsKKwlpZiAoIXJlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCiAJZm9yIChpZCA9IDA7IGlkIDwgUkM1VDU4M19SRUdVTEFUT1JfTUFYOyArK2lkKSB7Ci0JCXJlZ19kYXRhID0gcGRhdGEtPnJlZ19pbml0X2RhdGFbaWRdOwotCi0JCS8qIE5vIG5lZWQgdG8gcmVnaXN0ZXIgaWYgdGhlcmUgaXMgbm8gcmVndWxhdG9yIGRhdGEgKi8KLQkJaWYgKCFyZWdfZGF0YSkKLQkJCWNvbnRpbnVlOwotCiAJCXJlZyA9ICZyZWdzW2lkXTsKIAkJcmkgPSAmcmM1dDU4M19yZWdfaW5mb1tpZF07CiAJCXJlZy0+cmVnX2luZm8gPSByaTsKQEAgLTE2OSw3ICsxNjAsNyBAQAogCiBza2lwX2V4dF9wd3JfY29uZmlnOgogCQljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKLQkJY29uZmlnLmluaXRfZGF0YSA9IHJlZ19kYXRhOworCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnJlZ19pbml0X2RhdGFbaWRdOwogCQljb25maWcuZHJpdmVyX2RhdGEgPSByZWc7CiAJCWNvbmZpZy5yZWdtYXAgPSByYzV0NTgzLT5yZWdtYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3MybXBhMDEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBhMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhiM2FhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvczJtcGEwMS5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wYTAxLmg+CisKKyNkZWZpbmUgUzJNUEEwMV9SRUdVTEFUT1JfQ05UIEFSUkFZX1NJWkUocmVndWxhdG9ycykKKworc3RydWN0IHMybXBhMDFfaW5mbyB7CisJaW50IHJhbXBfZGVsYXkyNDsKKwlpbnQgcmFtcF9kZWxheTM7CisJaW50IHJhbXBfZGVsYXk1OworCWludCByYW1wX2RlbGF5MTY7CisJaW50IHJhbXBfZGVsYXk3OworCWludCByYW1wX2RlbGF5ODkxMDsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3JhbXBfZGVsYXkoaW50IHJhbXBfZGVsYXkpCit7CisJdW5zaWduZWQgY2hhciBjbnQgPSAwOworCisJcmFtcF9kZWxheSAvPSA2MjUwOworCisJd2hpbGUgKHRydWUpIHsKKwkJcmFtcF9kZWxheSA9IHJhbXBfZGVsYXkgPj4gMTsKKwkJaWYgKHJhbXBfZGVsYXkgPT0gMCkKKwkJCWJyZWFrOworCQljbnQrKzsKKwl9CisKKwlpZiAoY250ID4gMykKKwkJY250ID0gMzsKKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgczJtcGEwMV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbmV3X3NlbGVjdG9yKQoreworCXN0cnVjdCBzMm1wYTAxX2luZm8gKnMybXBhMDEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXVuc2lnbmVkIGludCByYW1wX2RlbGF5ID0gMDsKKwlpbnQgb2xkX3ZvbHQsIG5ld192b2x0OworCisJc3dpdGNoIChyZGV2LT5kZXNjLT5pZCkgeworCWNhc2UgUzJNUEEwMV9CVUNLMjoKKwljYXNlIFMyTVBBMDFfQlVDSzQ6CisJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MjQ7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLMzoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkzOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzU6CisJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5NTsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0sxOgorCWNhc2UgUzJNUEEwMV9CVUNLNjoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkxNjsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s3OgorCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTc7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLODoKKwljYXNlIFMyTVBBMDFfQlVDSzk6CisJY2FzZSBTMk1QQTAxX0JVQ0sxMDoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXk4OTEwOworCQlicmVhazsKKwl9CisKKwlpZiAocmFtcF9kZWxheSA9PSAwKQorCQlyYW1wX2RlbGF5ID0gcmRldi0+ZGVzYy0+cmFtcF9kZWxheTsKKworCW9sZF92b2x0ID0gcmRldi0+ZGVzYy0+bWluX3VWICsgKHJkZXYtPmRlc2MtPnVWX3N0ZXAgKiBvbGRfc2VsZWN0b3IpOworCW5ld192b2x0ID0gcmRldi0+ZGVzYy0+bWluX3VWICsgKHJkZXYtPmRlc2MtPnVWX3N0ZXAgKiBuZXdfc2VsZWN0b3IpOworCisJcmV0dXJuIERJVl9ST1VORF9VUChhYnMobmV3X3ZvbHQgLSBvbGRfdm9sdCksIHJhbXBfZGVsYXkpOworfQorCitzdGF0aWMgaW50IHMybXBhMDFfc2V0X3JhbXBfZGVsYXkoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCByYW1wX2RlbGF5KQoreworCXN0cnVjdCBzMm1wYTAxX2luZm8gKnMybXBhMDEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXVuc2lnbmVkIGludCByYW1wX3ZhbCwgcmFtcF9zaGlmdCwgcmFtcF9yZWcgPSBTMk1QQTAxX1JFR19SQU1QMjsKKwl1bnNpZ25lZCBpbnQgcmFtcF9lbmFibGUgPSAxLCBlbmFibGVfc2hpZnQgPSAwOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJkZXYtPmRlc2MtPmlkKSB7CisJY2FzZSBTMk1QQTAxX0JVQ0sxOgorCQllbmFibGVfc2hpZnQgPSBTMk1QQTAxX0JVQ0sxX1JBTVBfRU5fU0hJRlQ7CisJCWlmICghcmFtcF9kZWxheSkgeworCQkJcmFtcF9lbmFibGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmFtcF9kZWxheSA+IHMybXBhMDEtPnJhbXBfZGVsYXkxNikKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXkxNiA9IHJhbXBfZGVsYXk7CisJCWVsc2UKKwkJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MTY7CisKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzE2X1JBTVBfU0hJRlQ7CisJCXJhbXBfcmVnID0gUzJNUEEwMV9SRUdfUkFNUDE7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLMjoKKwkJZW5hYmxlX3NoaWZ0ID0gUzJNUEEwMV9CVUNLMl9SQU1QX0VOX1NISUZUOworCQlpZiAoIXJhbXBfZGVsYXkpIHsKKwkJCXJhbXBfZW5hYmxlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJhbXBfZGVsYXkgPiBzMm1wYTAxLT5yYW1wX2RlbGF5MjQpCisJCQlzMm1wYTAxLT5yYW1wX2RlbGF5MjQgPSByYW1wX2RlbGF5OworCQllbHNlCisJCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTI0OworCisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0syNF9SQU1QX1NISUZUOworCQlyYW1wX3JlZyA9IFMyTVBBMDFfUkVHX1JBTVAxOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzM6CisJCWVuYWJsZV9zaGlmdCA9IFMyTVBBMDFfQlVDSzNfUkFNUF9FTl9TSElGVDsKKwkJaWYgKCFyYW1wX2RlbGF5KSB7CisJCQlyYW1wX2VuYWJsZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXMybXBhMDEtPnJhbXBfZGVsYXkzID0gcmFtcF9kZWxheTsKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzNfUkFNUF9TSElGVDsKKwkJcmFtcF9yZWcgPSBTMk1QQTAxX1JFR19SQU1QMTsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s0OgorCQllbmFibGVfc2hpZnQgPSBTMk1QQTAxX0JVQ0s0X1JBTVBfRU5fU0hJRlQ7CisJCWlmICghcmFtcF9kZWxheSkgeworCQkJcmFtcF9lbmFibGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmFtcF9kZWxheSA+IHMybXBhMDEtPnJhbXBfZGVsYXkyNCkKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXkyNCA9IHJhbXBfZGVsYXk7CisJCWVsc2UKKwkJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MjQ7CisKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzI0X1JBTVBfU0hJRlQ7CisJCXJhbXBfcmVnID0gUzJNUEEwMV9SRUdfUkFNUDE7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLNToKKwkJczJtcGEwMS0+cmFtcF9kZWxheTUgPSByYW1wX2RlbGF5OworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLNV9SQU1QX1NISUZUOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzY6CisJCWlmIChyYW1wX2RlbGF5ID4gczJtcGEwMS0+cmFtcF9kZWxheTE2KQorCQkJczJtcGEwMS0+cmFtcF9kZWxheTE2ID0gcmFtcF9kZWxheTsKKwkJZWxzZQorCQkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkxNjsKKworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLMTZfUkFNUF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s3OgorCQlzMm1wYTAxLT5yYW1wX2RlbGF5NyA9IHJhbXBfZGVsYXk7CisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0s3X1JBTVBfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLODoKKwljYXNlIFMyTVBBMDFfQlVDSzk6CisJY2FzZSBTMk1QQTAxX0JVQ0sxMDoKKwkJaWYgKHJhbXBfZGVsYXkgPiBzMm1wYTAxLT5yYW1wX2RlbGF5ODkxMCkKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXk4OTEwID0gcmFtcF9kZWxheTsKKwkJZWxzZQorCQkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXk4OTEwOworCisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0s4OTEwX1JBTVBfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmICghcmFtcF9lbmFibGUpCisJCWdvdG8gcmFtcF9kaXNhYmxlOworCisJaWYgKGVuYWJsZV9zaGlmdCkgeworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCBTMk1QQTAxX1JFR19SQU1QMSwKKwkJCQkJMSA8PCBlbmFibGVfc2hpZnQsIDEgPDwgZW5hYmxlX3NoaWZ0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcmRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSByYW1wIHJhdGVcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJhbXBfdmFsID0gZ2V0X3JhbXBfZGVsYXkocmFtcF9kZWxheSk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmFtcF9yZWcsIDB4MyA8PCByYW1wX3NoaWZ0LAorCQkJCSAgcmFtcF92YWwgPDwgcmFtcF9zaGlmdCk7CisKK3JhbXBfZGlzYWJsZToKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgUzJNUEEwMV9SRUdfUkFNUDEsCisJCQkJICAxIDw8IGVuYWJsZV9zaGlmdCwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzMm1wYTAxX2xkb19vcHMgPSB7CisJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKKwkubWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhciwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHMybXBhMDFfYnVja19vcHMgPSB7CisJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKKwkubWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhciwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gczJtcGEwMV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCisJLnNldF9yYW1wX2RlbGF5CQk9IHMybXBhMDFfc2V0X3JhbXBfZGVsYXksCit9OworCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2xkbzEobnVtKQl7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUEEwMV9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2xkb19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfTERPX01JTiwJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfTERPX1NURVAxLAkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19sZG8yKG51bSkJewkJXAorCS5uYW1lCQk9ICJMRE8iI251bSwJCQlcCisJLmlkCQk9IFMyTVBBMDFfTERPIyNudW0sCQlcCisJLm9wcwkJPSAmczJtcGEwMV9sZG9fb3BzLAkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0xET19NSU4sCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0xET19TVEVQMiwJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBBMDFfTERPX05fVk9MVEFHRVMsCVwKKwkudnNlbF9yZWcJPSBTMk1QQTAxX1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfTERPX1ZTRUxfTUFTSywJXAorCS5lbmFibGVfcmVnCT0gUzJNUEEwMV9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrMV80KG51bSkJewkJCVwKKwkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSyMjbnVtLAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMSwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDEsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0IxQ1RSTDIgKyAobnVtIC0gMSkgKiAyLAlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CMUNUUkwxICsgKG51bSAtIDEpICogMiwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCQlcCit9CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazUJewkJCQlcCisJLm5hbWUJCT0gIkJVQ0s1IiwJCQkJXAorCS5pZAkJPSBTMk1QQTAxX0JVQ0s1LAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMiwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDEsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0I1Q1RSTDIsCQkJXAorCS52c2VsX21hc2sJPSBTMk1QQTAxX0JVQ0tfVlNFTF9NQVNLLAkJXAorCS5lbmFibGVfcmVnCT0gUzJNUEEwMV9SRUdfQjVDVFJMMSwJCQlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrNl83KG51bSkJewkJCVwKKwkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSyMjbnVtLAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMSwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDEsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0I2Q1RSTDIgKyAobnVtIC0gNikgKiAyLAlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CNkNUUkwxICsgKG51bSAtIDYpICogMiwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCQlcCit9CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazgJewkJCQlcCisJLm5hbWUJCT0gIkJVQ0s4IiwJCQkJXAorCS5pZAkJPSBTMk1QQTAxX0JVQ0s4LAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMiwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDIsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0I4Q1RSTDIsCQkJXAorCS52c2VsX21hc2sJPSBTMk1QQTAxX0JVQ0tfVlNFTF9NQVNLLAkJXAorCS5lbmFibGVfcmVnCT0gUzJNUEEwMV9SRUdfQjhDVFJMMSwJCQlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrOQl7CQkJCVwKKwkubmFtZQkJPSAiQlVDSzkiLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSzksCQkJXAorCS5vcHMJCT0gJnMybXBhMDFfYnVja19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfQlVDS19NSU40LAkJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfQlVDS19TVEVQMiwJCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBBMDFfUkFNUF9ERUxBWSwJCQlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfQjlDVFJMMiwJCQlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19COUNUUkwxLAkJCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QQTAxX0VOQUJMRV9NQVNLCQkJXAorfQorCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2sxMAl7CQkJCVwKKwkubmFtZQkJPSAiQlVDSzEwIiwJCQkJXAorCS5pZAkJPSBTMk1QQTAxX0JVQ0sxMCwJCQlcCisJLm9wcwkJPSAmczJtcGEwMV9idWNrX29wcywJCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQkJXAorCS5taW5fdVYJCT0gUzJNUEEwMV9CVUNLX01JTjMsCQkJXAorCS51Vl9zdGVwCT0gUzJNUEEwMV9CVUNLX1NURVAyLAkJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBBMDFfQlVDS19OX1ZPTFRBR0VTLAkJXAorCS5yYW1wX2RlbGF5CT0gUzJNUEEwMV9SQU1QX0RFTEFZLAkJCVwKKwkudnNlbF9yZWcJPSBTMk1QQTAxX1JFR19CMTBDVFJMMiwJCQlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CMTBDVFJMMSwJCQlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfZGVzYyByZWd1bGF0b3JzW10gPSB7CisJcmVndWxhdG9yX2Rlc2NfbGRvMigxKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDIpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoMyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSg0KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDUpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzIoNiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSg3KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDgpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoOSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxMCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMigxMSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxMiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxMyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxOCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxOSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyMCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyMSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMigyMiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMigyMyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyNCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyNSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyNiksCisJcmVndWxhdG9yX2Rlc2NfYnVjazFfNCgxKSwKKwlyZWd1bGF0b3JfZGVzY19idWNrMV80KDIpLAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQoMyksCisJcmVndWxhdG9yX2Rlc2NfYnVjazFfNCg0KSwKKwlyZWd1bGF0b3JfZGVzY19idWNrNSwKKwlyZWd1bGF0b3JfZGVzY19idWNrNl83KDYpLAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzcoNyksCisJcmVndWxhdG9yX2Rlc2NfYnVjazgsCisJcmVndWxhdG9yX2Rlc2NfYnVjazksCisJcmVndWxhdG9yX2Rlc2NfYnVjazEwLAorfTsKKworc3RhdGljIGludCBzMm1wYTAxX3BtaWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2VjX3BtaWNfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShpb2Rldi0+ZGV2KTsKKwlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHJkYXRhW1MyTVBBMDFfUkVHVUxBVE9SX01BWF07CisJc3RydWN0IGRldmljZV9ub2RlICpyZWdfbnAgPSBOVUxMOworCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKKwlzdHJ1Y3QgczJtcGEwMV9pbmZvICpzMm1wYTAxOworCWludCBpOworCisJczJtcGEwMSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnMybXBhMDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMybXBhMDEpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IFMyTVBBMDFfUkVHVUxBVE9SX0NOVDsgaSsrKQorCQlyZGF0YVtpXS5uYW1lID0gcmVndWxhdG9yc1tpXS5uYW1lOworCisJaWYgKGlvZGV2LT5kZXYtPm9mX25vZGUpIHsKKwkJcmVnX25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoaW9kZXYtPmRldi0+b2Zfbm9kZSwKKwkJCQkJCQkicmVndWxhdG9ycyIpOworCQkJaWYgKCFyZWdfbnApIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSJjb3VsZCBub3QgZmluZCByZWd1bGF0b3JzIHN1Yi1ub2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQlvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVnX25wLCByZGF0YSwKKwkJCQkJCVMyTVBBMDFfUkVHVUxBVE9SX01BWCk7CisJCW9mX25vZGVfcHV0KHJlZ19ucCk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgczJtcGEwMSk7CisKKwljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKKwljb25maWcucmVnbWFwID0gaW9kZXYtPnJlZ21hcF9wbWljOworCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHMybXBhMDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgUzJNUEEwMV9SRUdVTEFUT1JfTUFYOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisJCWlmIChwZGF0YSkKKwkJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKKwkJZWxzZQorCQkJY29uZmlnLmluaXRfZGF0YSA9IHJkYXRhW2ldLmluaXRfZGF0YTsKKworCQlpZiAocmVnX25wKQorCQkJY29uZmlnLm9mX25vZGUgPSByZGF0YVtpXS5vZl9ub2RlOworCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkJJnJlZ3VsYXRvcnNbaV0sICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgZm9yICVkXG4iLAorCQkJCWkpOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgczJtcGEwMV9wbWljX2lkW10gPSB7CisJeyAiczJtcGEwMS1wbWljIiwgMH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHMybXBhMDFfcG1pY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMybXBhMDFfcG1pY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiczJtcGEwMS1wbWljIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBzMm1wYTAxX3BtaWNfcHJvYmUsCisJLmlkX3RhYmxlID0gczJtcGEwMV9wbWljX2lkLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzMm1wYTAxX3BtaWNfZHJpdmVyKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJTYW5nYmVvbSBLaW0gPHNia2ltNzNAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTYWNoaW4gS2FtYXQgPHNhY2hpbi5rYW1hdEBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0FNU1VORyBTMk1QQTAxIFJlZ3VsYXRvciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYwppbmRleCBjZDBiOWUzNS4uNjhmZDU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvczJtcHMxMS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYwpAQCAtMSwxMyArMSwxOCBAQAogLyoKICAqIHMybXBzMTEuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQogICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwogCkBAIC0yNCwxOCArMjksMjEgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTEuaD4KLQotI2RlZmluZSBTMk1QUzExX1JFR1VMQVRPUl9DTlQgQVJSQVlfU0laRShyZWd1bGF0b3JzKQorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaD4KIAogc3RydWN0IHMybXBzMTFfaW5mbyB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbUzJNUFMxMV9SRUdVTEFUT1JfTUFYXTsKLQorCXVuc2lnbmVkIGludCByZGV2X251bTsKIAlpbnQgcmFtcF9kZWxheTI7CiAJaW50IHJhbXBfZGVsYXkzNDsKIAlpbnQgcmFtcF9kZWxheTU7CiAJaW50IHJhbXBfZGVsYXkxNjsKIAlpbnQgcmFtcF9kZWxheTc4MTA7CiAJaW50IHJhbXBfZGVsYXk5OworCS8qCisJICogT25lIGJpdCBmb3IgZWFjaCBTMk1QUzE0IHJlZ3VsYXRvciB3aGV0aGVyIHRoZSBzdXNwZW5kIG1vZGUKKwkgKiB3YXMgZW5hYmxlZC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgczJtcHMxNF9zdXNwZW5kX3N0YXRlOjMwOwogfTsKIAogc3RhdGljIGludCBnZXRfcmFtcF9kZWxheShpbnQgcmFtcF9kZWxheSkKQEAgLTY1LDcgKzczLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmFtcF9kZWxheSA9IDA7CiAJaW50IG9sZF92b2x0LCBuZXdfdm9sdDsKIAotCXN3aXRjaCAocmRldi0+ZGVzYy0+aWQpIHsKKwlzd2l0Y2ggKHJkZXZfZ2V0X2lkKHJkZXYpKSB7CiAJY2FzZSBTMk1QUzExX0JVQ0syOgogCQlyYW1wX2RlbGF5ID0gczJtcHMxMS0+cmFtcF9kZWxheTI7CiAJCWJyZWFrOwpAQCAtMTA1LDcgKzExMyw3IEBACiAJdW5zaWduZWQgaW50IHJhbXBfZW5hYmxlID0gMSwgZW5hYmxlX3NoaWZ0ID0gMDsKIAlpbnQgcmV0OwogCi0Jc3dpdGNoIChyZGV2LT5kZXNjLT5pZCkgeworCXN3aXRjaCAocmRldl9nZXRfaWQocmRldikpIHsKIAljYXNlIFMyTVBTMTFfQlVDSzE6CiAJCWlmIChyYW1wX2RlbGF5ID4gczJtcHMxMS0+cmFtcF9kZWxheTE2KQogCQkJczJtcHMxMS0+cmFtcF9kZWxheTE2ID0gcmFtcF9kZWxheTsKQEAgLTIzNiw3ICsyNDQsNyBAQAogCS5zZXRfcmFtcF9kZWxheQkJPSBzMm1wczExX3NldF9yYW1wX2RlbGF5LAogfTsKIAotI2RlZmluZSByZWd1bGF0b3JfZGVzY19sZG8xKG51bSkJewkJXAorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEobnVtKQl7CQlcCiAJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKIAkuaWQJCT0gUzJNUFMxMV9MRE8jI251bSwJCVwKIAkub3BzCQk9ICZzMm1wczExX2xkb19vcHMsCQlcCkBAIC0yNTAsNyArMjU4LDcgQEAKIAkuZW5hYmxlX3JlZwk9IFMyTVBTMTFfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQlcCiB9Ci0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2xkbzIobnVtKQl7CQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMihudW0pIHsJCVwKIAkubmFtZQkJPSAiTERPIiNudW0sCQkJXAogCS5pZAkJPSBTMk1QUzExX0xETyMjbnVtLAkJXAogCS5vcHMJCT0gJnMybXBzMTFfbGRvX29wcywJCVwKQEAgLTI2NSw3ICsyNzMsNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCVwKIH0KIAotI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrMV80KG51bSkJewkJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMV80KG51bSkgewkJCVwKIAkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCiAJLmlkCQk9IFMyTVBTMTFfQlVDSyMjbnVtLAkJCVwKIAkub3BzCQk9ICZzMm1wczExX2J1Y2tfb3BzLAkJCVwKQEAgLTI4MSw3ICsyODksNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCQlcCiB9CiAKLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazUJewkJCQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazUgewkJCQlcCiAJLm5hbWUJCT0gIkJVQ0s1IiwJCQkJXAogCS5pZAkJPSBTMk1QUzExX0JVQ0s1LAkJCVwKIAkub3BzCQk9ICZzMm1wczExX2J1Y2tfb3BzLAkJCVwKQEAgLTI5Nyw3ICszMDUsNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCQlcCiB9CiAKLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazZfOChudW0pCXsJCQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazZfOChudW0pIHsJCQlcCiAJLm5hbWUJCT0gIkJVQ0siI251bSwJCQkJXAogCS5pZAkJPSBTMk1QUzExX0JVQ0sjI251bSwJCQlcCiAJLm9wcwkJPSAmczJtcHMxMV9idWNrX29wcywJCQlcCkBAIC0zMTMsNyArMzIxLDcgQEAKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQkJXAogfQogCi0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2s5CXsJCQkJXAorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s5IHsJCQkJXAogCS5uYW1lCQk9ICJCVUNLOSIsCQkJCVwKIAkuaWQJCT0gUzJNUFMxMV9CVUNLOSwJCQlcCiAJLm9wcwkJPSAmczJtcHMxMV9idWNrX29wcywJCQlcCkBAIC0zMjksNyArMzM3LDcgQEAKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQkJXAogfQogCi0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2sxMAl7CQkJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMTAgewkJCQlcCiAJLm5hbWUJCT0gIkJVQ0sxMCIsCQkJCVwKIAkuaWQJCT0gUzJNUFMxMV9CVUNLMTAsCQkJXAogCS5vcHMJCT0gJnMybXBzMTFfYnVja19vcHMsCQkJXApAQCAtMzQ1LDcyICszNTMsMjUyIEBACiAJLmVuYWJsZV9tYXNrCT0gUzJNUFMxMV9FTkFCTEVfTUFTSwkJCVwKIH0KIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfZGVzYyByZWd1bGF0b3JzW10gPSB7Ci0JcmVndWxhdG9yX2Rlc2NfbGRvMigxKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDIpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSg0KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDUpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzIoNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSg3KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDgpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoOSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxMCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigxMSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxOCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxOSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyMCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyMSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigyMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigyMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyNCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigyNyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyOCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyOSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzOCksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazFfNCgxKSwKLQlyZWd1bGF0b3JfZGVzY19idWNrMV80KDIpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQoMyksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazFfNCg0KSwKLQlyZWd1bGF0b3JfZGVzY19idWNrNSwKLQlyZWd1bGF0b3JfZGVzY19idWNrNl84KDYpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzgoNyksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazZfOCg4KSwKLQlyZWd1bGF0b3JfZGVzY19idWNrOSwKLQlyZWd1bGF0b3JfZGVzY19idWNrMTAsCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHMybXBzMTFfcmVndWxhdG9yc1tdID0geworCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMigxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSg0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSg3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoOCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDkpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxMCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDExKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDE0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDE3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxOSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDIwKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjEpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMigyMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDIzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjQpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDI2KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzIoMjcpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyOCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDI5KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzApLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDMyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDM1KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDM4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxXzQoMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMV80KDIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazFfNCgzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxXzQoNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s2XzgoNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNl84KDcpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazZfOCg4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s5LAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazEwLAorfTsKKworc3RhdGljIGludCBzMm1wczE0X3JlZ3VsYXRvcl9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHMybXBzMTFfaW5mbyAqczJtcHMxMSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChzMm1wczExLT5zMm1wczE0X3N1c3BlbmRfc3RhdGUgJiAoMSA8PCByZGV2X2dldF9pZChyZGV2KSkpCisJCXZhbCA9IFMyTVBTMTRfRU5BQkxFX1NVU1BFTkQ7CisJZWxzZQorCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT5lbmFibGVfcmVnLAorCQkJcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2ssIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgczJtcHMxNF9yZWd1bGF0b3Jfc2V0X3N1c3BlbmRfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IHMybXBzMTFfaW5mbyAqczJtcHMxMSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisKKwkvKiBMRE8zIHNob3VsZCBiZSBhbHdheXMgb24gYW5kIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuZCBtb2RlICovCisJaWYgKHJkZXZfZ2V0X2lkKHJkZXYpID09IFMyTVBTMTRfTERPMykKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmVuYWJsZV9yZWcsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJczJtcHMxMS0+czJtcHMxNF9zdXNwZW5kX3N0YXRlIHw9ICgxIDw8IHJkZXZfZ2V0X2lkKHJkZXYpKTsKKwkvKgorCSAqIERvbid0IGVuYWJsZSBzdXNwZW5kIG1vZGUgaWYgcmVndWxhdG9yIGlzIGFscmVhZHkgZGlzYWJsZWQgYmVjYXVzZQorCSAqIHRoaXMgd291bGQgZWZmZWN0aXZlbHkgZm9yIGEgc2hvcnQgdGltZSB0dXJuIG9uIHRoZSByZWd1bGF0b3IgYWZ0ZXIKKwkgKiByZXN1bWluZy4KKwkgKiBIb3dldmVyIHdlIHN0aWxsIHdhbnQgdG8gdG9nZ2xlIHRoZSBzdXNwZW5kX3N0YXRlIGJpdCBmb3IgcmVndWxhdG9yCisJICogaW4gY2FzZSBpZiBpdCBnb3QgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZGluZyB0aGUgc3lzdGVtLgorCSAqLworCWlmICghKHZhbCAmIHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKKwkJCXJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLCBTMk1QUzE0X0VOQUJMRV9TVVNQRU5EKTsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHMybXBzMTRfcmVnX29wcyA9IHsKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAorCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSBzMm1wczE0X3JlZ3VsYXRvcl9lbmFibGUsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsLAorCS5zZXRfc3VzcGVuZF9kaXNhYmxlCT0gczJtcHMxNF9yZWd1bGF0b3Jfc2V0X3N1c3BlbmRfZGlzYWJsZSwKK307CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKG51bSkgewkJXAorCS5uYW1lCQk9ICJMRE8iI251bSwJCQlcCisJLmlkCQk9IFMyTVBTMTRfTERPIyNudW0sCQlcCisJLm9wcwkJPSAmczJtcHMxNF9yZWdfb3BzLAkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQlcCisJLm1pbl91VgkJPSBTMk1QUzE0X0xET19NSU5fODAwTVYsCVwKKwkudVZfc3RlcAk9IFMyTVBTMTRfTERPX1NURVBfMjVNViwJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUFMxNF9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIobnVtKSB7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUFMxNF9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wczE0X3JlZ19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBTMTRfTERPX01JTl8xODAwTVYsCVwKKwkudVZfc3RlcAk9IFMyTVBTMTRfTERPX1NURVBfMjVNViwJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUFMxNF9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMobnVtKSB7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUFMxNF9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wczE0X3JlZ19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBTMTRfTERPX01JTl84MDBNViwJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9MRE9fU1RFUF8xMl81TVYsCVwKKwkubl92b2x0YWdlcwk9IFMyTVBTMTRfTERPX05fVk9MVEFHRVMsCVwKKwkudnNlbF9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLnZzZWxfbWFzawk9IFMyTVBTMTRfTERPX1ZTRUxfTUFTSywJXAorCS5lbmFibGVfcmVnCT0gUzJNUFMxNF9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBTMTRfRU5BQkxFX01BU0sJCVwKK30KKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNShudW0pIHsJCQlcCisJLm5hbWUJCT0gIkJVQ0siI251bSwJCQkJXAorCS5pZAkJPSBTMk1QUzE0X0JVQ0sjI251bSwJCQlcCisJLm9wcwkJPSAmczJtcHMxNF9yZWdfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QUzE0X0JVQ0sxMjM1X01JTl82MDBNViwJCVwKKwkudVZfc3RlcAk9IFMyTVBTMTRfQlVDSzEyMzVfU1RFUF82XzI1TVYsCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QUzE0X0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkubGluZWFyX21pbl9zZWwgPSBTMk1QUzE0X0JVQ0sxMjM1X1NUQVJUX1NFTCwJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBTMTRfQlVDS19SQU1QX0RFTEFZLAkJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0IxQ1RSTDIgKyAobnVtIC0gMSkgKiAyLAlcCisJLnZzZWxfbWFzawk9IFMyTVBTMTRfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19CMUNUUkwxICsgKG51bSAtIDEpICogMiwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBTMTRfRU5BQkxFX01BU0sJCQlcCit9CisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazQobnVtKSB7CQkJXAorCS5uYW1lCQk9ICJCVUNLIiNudW0sCQkJCVwKKwkuaWQJCT0gUzJNUFMxNF9CVUNLIyNudW0sCQkJXAorCS5vcHMJCT0gJnMybXBzMTRfcmVnX29wcywJCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQkJXAorCS5taW5fdVYJCT0gUzJNUFMxNF9CVUNLNF9NSU5fMTQwME1WLAkJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9CVUNLNF9TVEVQXzEyXzVNViwJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBTMTRfQlVDS19OX1ZPTFRBR0VTLAkJXAorCS5saW5lYXJfbWluX3NlbCA9IFMyTVBTMTRfQlVDSzRfU1RBUlRfU0VMLAkJXAorCS5yYW1wX2RlbGF5CT0gUzJNUFMxNF9CVUNLX1JBTVBfREVMQVksCQlcCisJLnZzZWxfcmVnCT0gUzJNUFMxNF9SRUdfQjFDVFJMMiArIChudW0gLSAxKSAqIDIsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBTMTRfUkVHX0IxQ1RSTDEgKyAobnVtIC0gMSkgKiAyLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBzMm1wczE0X3JlZ3VsYXRvcnNbXSA9IHsKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8zKDIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8zKDUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMyg2KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMyg5KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMTApLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgxMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDEyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigxNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDE1KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigxNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDE4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoMTkpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgyMCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKDIxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMjIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgyMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDI0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMjUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazEyMzUoMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNSgyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2J1Y2sxMjM1KDMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazQoNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNSg1KSwKIH07CiAKIHN0YXRpYyBpbnQgczJtcHMxMV9wbWljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNlY19wbWljX2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNlY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaW9kZXYtPmRldik7Ci0Jc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCByZGF0YVtTMk1QUzExX1JFR1VMQVRPUl9NQVhdOworCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBpb2Rldi0+cGRhdGE7CisJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqcmRhdGEgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVnX25wID0gTlVMTDsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJc3RydWN0IHMybXBzMTFfaW5mbyAqczJtcHMxMTsKLQlpbnQgaSwgcmV0OworCWludCBpLCByZXQgPSAwOworCWNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yczsKKwllbnVtIHNlY19kZXZpY2VfdHlwZSBkZXZfdHlwZTsKIAogCXMybXBzMTEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzMm1wczExX2luZm8pLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghczJtcHMxMSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkZXZfdHlwZSA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOworCXN3aXRjaCAoZGV2X3R5cGUpIHsKKwljYXNlIFMyTVBTMTFYOgorCQlzMm1wczExLT5yZGV2X251bSA9IEFSUkFZX1NJWkUoczJtcHMxMV9yZWd1bGF0b3JzKTsKKwkJcmVndWxhdG9ycyA9IHMybXBzMTFfcmVndWxhdG9yczsKKwkJYnJlYWs7CisJY2FzZSBTMk1QUzE0WDoKKwkJczJtcHMxMS0+cmRldl9udW0gPSBBUlJBWV9TSVpFKHMybXBzMTRfcmVndWxhdG9ycyk7CisJCXJlZ3VsYXRvcnMgPSBzMm1wczE0X3JlZ3VsYXRvcnM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgZGV2aWNlIHR5cGU6ICV1XG4iLCBkZXZfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKIAlpZiAoIWlvZGV2LT5kZXYtPm9mX25vZGUpIHsKIAkJaWYgKHBkYXRhKSB7CiAJCQlnb3RvIGNvbW1vbl9yZWc7CkBAIC00MjEsMTYgKzYwOSwyMiBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFMyTVBTMTFfUkVHVUxBVE9SX0NOVDsgaSsrKQorCXJkYXRhID0ga3phbGxvYyhzaXplb2YoKnJkYXRhKSAqIHMybXBzMTEtPnJkZXZfbnVtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBzMm1wczExLT5yZGV2X251bTsgaSsrKQogCQlyZGF0YVtpXS5uYW1lID0gcmVndWxhdG9yc1tpXS5uYW1lOwogCi0JcmVnX25wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoaW9kZXYtPmRldi0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlyZWdfbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShpb2Rldi0+ZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVnX25wKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIHJlZ3VsYXRvcnMgc3ViLW5vZGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAJfQogCi0Jb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ19ucCwgcmRhdGEsIFMyTVBTMTFfUkVHVUxBVE9SX01BWCk7CisJb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ19ucCwgcmRhdGEsIHMybXBzMTEtPnJkZXZfbnVtKTsKKwlvZl9ub2RlX3B1dChyZWdfbnApOwogCiBjb21tb25fcmVnOgogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHMybXBzMTEpOwpAQCAtNDM4LDcgKzYzMiw5IEBACiAJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CiAJY29uZmlnLnJlZ21hcCA9IGlvZGV2LT5yZWdtYXBfcG1pYzsKIAljb25maWcuZHJpdmVyX2RhdGEgPSBzMm1wczExOwotCWZvciAoaSA9IDA7IGkgPCBTMk1QUzExX1JFR1VMQVRPUl9NQVg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzMm1wczExLT5yZGV2X251bTsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3I7CisKIAkJaWYgKCFyZWdfbnApIHsKIAkJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKIAkJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ucmVnX25vZGU7CkBAIC00NDcsMjEgKzY0MywyNSBAQAogCQkJY29uZmlnLm9mX25vZGUgPSByZGF0YVtpXS5vZl9ub2RlOwogCQl9CiAKLQkJczJtcHMxMS0+cmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCiAJCQkJCQkmcmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIoczJtcHMxMS0+cmRldltpXSkpIHsKLQkJCXJldCA9IFBUUl9FUlIoczJtcHMxMS0+cmRldltpXSk7CisJCWlmIChJU19FUlIocmVndWxhdG9yKSkgeworCQkJcmV0ID0gUFRSX0VSUihyZWd1bGF0b3IpOwogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVndWxhdG9yIGluaXQgZmFpbGVkIGZvciAlZFxuIiwKIAkJCQlpKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAotCXJldHVybiAwOworb3V0OgorCWtmcmVlKHJkYXRhKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHMybXBzMTFfcG1pY19pZFtdID0gewotCXsgInMybXBzMTEtcG1pYyIsIDB9LAorCXsgInMybXBzMTEtcG1pYyIsIFMyTVBTMTFYfSwKKwl7ICJzMm1wczE0LXBtaWMiLCBTMk1QUzE0WH0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHMybXBzMTFfcG1pY19pZCk7CkBAIC00ODksNSArNjg5LDUgQEAKIAogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCiBNT0RVTEVfQVVUSE9SKCJTYW5nYmVvbSBLaW0gPHNia2ltNzNAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNBTVNVTkcgUzJNUFMxMSBSZWd1bGF0b3IgRHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNBTVNVTkcgUzJNUFMxMS9TMk1QUzE0IFJlZ3VsYXRvciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3M1bTg3NjcuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3M1bTg3NjcuYwppbmRleCBkOTU4ZGZhLi5mMDViYWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9zNW04NzY3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvczVtODc2Ny5jCkBAIC0xMSwxMSArMTEsOCBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgpAQCAtMTcwLDEyICsxNjcsMTEgQEAKIAl7MHgwLCAweDMsIDB4MSwgMHgxfSwgLyogQlVDSzkgKi8KIH07CiAKLXN0YXRpYyBpbnQgczVtODc2N19nZXRfcmVnaXN0ZXIoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCAqcmVnLAotCQkJCWludCAqZW5hYmxlX2N0cmwpCitzdGF0aWMgaW50IHM1bTg3NjdfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcsIGludCByZWdfaWQsCisJCQkJaW50ICpyZWcsIGludCAqZW5hYmxlX2N0cmwpCiB7Ci0JaW50IGksIHJlZ19pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWludCBpOwogCXVuc2lnbmVkIGludCBtb2RlOwotCXN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCiAJc3dpdGNoIChyZWdfaWQpIHsKIAljYXNlIFM1TTg3NjdfTERPMSAuLi4gUzVNODc2N19MRE8yOgpAQCAtMjE0LDUzICsyMTAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHM1bTg3NjdfcmVnX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50IHJldCwgcmVnOwotCWludCBlbmFibGVfY3RybDsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JcmV0ID0gczVtODc2N19nZXRfcmVnaXN0ZXIocmRldiwgJnJlZywgJmVuYWJsZV9jdHJsKTsKLQlpZiAocmV0ID09IC1FSU5WQUwpCi0JCXJldHVybiAxOwotCWVsc2UgaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKHM1bTg3NjctPmlvZGV2LT5yZWdtYXBfcG1pYywgcmVnLCAmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuICh2YWwgJiBTNU04NzY3X0VOQ1RSTF9NQVNLKSA9PSBlbmFibGVfY3RybDsKLX0KLQotc3RhdGljIGludCBzNW04NzY3X3JlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50IHJldCwgcmVnOwotCWludCBlbmFibGVfY3RybDsKLQotCXJldCA9IHM1bTg3NjdfZ2V0X3JlZ2lzdGVyKHJkZXYsICZyZWcsICZlbmFibGVfY3RybCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoczVtODc2Ny0+aW9kZXYtPnJlZ21hcF9wbWljLCByZWcsCi0JCQlTNU04NzY3X0VOQ1RSTF9NQVNLLCBlbmFibGVfY3RybCk7Ci19Ci0KLXN0YXRpYyBpbnQgczVtODc2N19yZWdfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKLXsKLQlzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgcmV0LCByZWcsIGVuYWJsZV9jdHJsOwotCi0JcmV0ID0gczVtODc2N19nZXRfcmVnaXN0ZXIocmRldiwgJnJlZywgJmVuYWJsZV9jdHJsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhzNW04NzY3LT5pb2Rldi0+cmVnbWFwX3BtaWMsIHJlZywKLQkJCVM1TTg3NjdfRU5DVFJMX01BU0ssIH5TNU04NzY3X0VOQ1RSTF9NQVNLKTsKLX0KLQogc3RhdGljIGludCBzNW04NzY3X2dldF92c2VsX3JlZyhpbnQgcmVnX2lkLCBzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3KQogewogCWludCByZWc7CkBAIC00MTAsOSArMzU5LDkgQEAKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHM1bTg3Njdfb3BzID0gewogCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCi0JLmlzX2VuYWJsZWQJCT0gczVtODc2N19yZWdfaXNfZW5hYmxlZCwKLQkuZW5hYmxlCQkJPSBzNW04NzY3X3JlZ19lbmFibGUsCi0JLmRpc2FibGUJCT0gczVtODc2N19yZWdfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAogCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsCT0gczVtODc2N19zZXRfdm9sdGFnZV9zZWwsCiAJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gczVtODc2N19zZXRfdm9sdGFnZV90aW1lX3NlbCwKQEAgLTQyMCw5ICszNjksOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgczVtODc2N19idWNrNzhfb3BzID0gewogCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCi0JLmlzX2VuYWJsZWQJCT0gczVtODc2N19yZWdfaXNfZW5hYmxlZCwKLQkuZW5hYmxlCQkJPSBzNW04NzY3X3JlZ19lbmFibGUsCi0JLmRpc2FibGUJCT0gczVtODc2N19yZWdfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAogCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCiB9OwpAQCAtNDgzLDYgKzQzMiw2NiBAQAogCXM1bTg3NjdfcmVndWxhdG9yX2Rlc2MoQlVDSzkpLAogfTsKIAorLyoKKyAqIEVuYWJsZSBHUElPIGNvbnRyb2wgb3ZlciBCVUNLOSBpbiByZWd1bGF0b3JfY29uZmlnIGZvciB0aGF0IHJlZ3VsYXRvci4KKyAqLworc3RhdGljIHZvaWQgczVtODc2N19yZWd1bGF0b3JfY29uZmlnX2V4dF9jb250cm9sKHN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcsCisJCXN0cnVjdCBzZWNfcmVndWxhdG9yX2RhdGEgKnJkYXRhLAorCQlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnKQoreworCWludCBpLCBtb2RlID0gMDsKKworCWlmIChyZGF0YS0+aWQgIT0gUzVNODc2N19CVUNLOSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgaWYgb3Btb2RlIGZvciByZWd1bGF0b3IgbWF0Y2hlcyBTNU04NzY3X0VOQ1RSTF9VU0VfR1BJTyAqLworCWZvciAoaSA9IDA7IGkgPCBzNW04NzY3LT5udW1fcmVndWxhdG9yczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBzZWNfb3Btb2RlX2RhdGEgKm9wbW9kZSA9ICZzNW04NzY3LT5vcG1vZGVbaV07CisJCWlmIChvcG1vZGUtPmlkID09IHJkYXRhLT5pZCkgeworCQkJbW9kZSA9IHM1bTg3Njdfb3Btb2RlX3JlZ1tyZGF0YS0+aWRdW29wbW9kZS0+bW9kZV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobW9kZSAhPSBTNU04NzY3X0VOQ1RSTF9VU0VfR1BJTykgeworCQlkZXZfd2FybihzNW04NzY3LT5kZXYsCisJCQkJImV4dC1jb250cm9sIGZvciAlczogbWlzbWF0Y2hlZCBvcF9tb2RlICgleCksIGlnbm9yaW5nXG4iLAorCQkJCXJkYXRhLT5yZWdfbm9kZS0+bmFtZSwgbW9kZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWdwaW9faXNfdmFsaWQocmRhdGEtPmV4dF9jb250cm9sX2dwaW8pKSB7CisJCWRldl93YXJuKHM1bTg3NjctPmRldiwKKwkJCQkiZXh0LWNvbnRyb2wgZm9yICVzOiBHUElPIG5vdCB2YWxpZCwgaWdub3JpbmdcbiIsCisJCQkJcmRhdGEtPnJlZ19ub2RlLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWNvbmZpZy0+ZW5hX2dwaW8gPSByZGF0YS0+ZXh0X2NvbnRyb2xfZ3BpbzsKKwljb25maWctPmVuYV9ncGlvX2ZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfSElHSDsKK30KKworLyoKKyAqIFR1cm4gb24gR1BJTyBjb250cm9sIG92ZXIgQlVDSzkuCisgKi8KK3N0YXRpYyBpbnQgczVtODc2N19lbmFibGVfZXh0X2NvbnRyb2woc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NywKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHJldCwgcmVnLCBlbmFibGVfY3RybDsKKworCWlmIChpZCAhPSBTNU04NzY3X0JVQ0s5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHM1bTg3NjdfZ2V0X3JlZ2lzdGVyKHM1bTg3NjcsIGlkLCAmcmVnLCAmZW5hYmxlX2N0cmwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHM1bTg3NjctPmlvZGV2LT5yZWdtYXBfcG1pYywKKwkJCXJlZywgUzVNODc2N19FTkNUUkxfTUFTSywKKwkJCVM1TTg3NjdfRU5DVFJMX1VTRV9HUElPIDw8IFM1TTg3NjdfRU5DVFJMX1NISUZUKTsKK30KKworCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgaW50IHM1bTg3NjdfcG1pY19kdF9wYXJzZV9kdnNfZ3BpbyhzdHJ1Y3Qgc2VjX3BtaWNfZGV2ICppb2RldiwKIAkJCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCkBAIC01MjAsNiArNTI5LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHM1bTg3NjdfcG1pY19kdF9wYXJzZV9leHRfY29udHJvbF9ncGlvKHN0cnVjdCBzZWNfcG1pY19kZXYgKmlvZGV2LAorCQlzdHJ1Y3Qgc2VjX3JlZ3VsYXRvcl9kYXRhICpyZGF0YSwKKwkJc3RydWN0IGRldmljZV9ub2RlICpyZWdfbnApCit7CisJcmRhdGEtPmV4dF9jb250cm9sX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhyZWdfbnAsCisJCQkiczVtODc2NyxwbWljLWV4dC1jb250cm9sLWdwaW9zIiwgMCk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHJkYXRhLT5leHRfY29udHJvbF9ncGlvKSkKKwkJcmRhdGEtPmV4dF9jb250cm9sX2dwaW8gPSAwOworfQorCiBzdGF0aWMgaW50IHM1bTg3NjdfcG1pY19kdF9wYXJzZV9wZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJCQlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewpAQCAtNTQ2LDE5ICs1NjUsMTMgQEAKIAogCXJkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcmRhdGEpICoKIAkJCQlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwotCWlmICghcmRhdGEpIHsKLQkJZGV2X2Vycihpb2Rldi0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlZ3VsYXRvciBkYXRhXG4iKTsKKwlpZiAoIXJkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlybW9kZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJtb2RlKSAqCiAJCQkJcGRhdGEtPm51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJtb2RlKSB7Ci0JCWRldl9lcnIoaW9kZXYtPmRldiwKLQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWd1bGF0b3IgbW9kZVxuIik7CisJaWYgKCFybW9kZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcGRhdGEtPnJlZ3VsYXRvcnMgPSByZGF0YTsKIAlwZGF0YS0+b3Btb2RlID0gcm1vZGU7CkBAIC01NzQsNiArNTg3LDggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJczVtODc2N19wbWljX2R0X3BhcnNlX2V4dF9jb250cm9sX2dwaW8oaW9kZXYsIHJkYXRhLCByZWdfbnApOworCiAJCXJkYXRhLT5pZCA9IGk7CiAJCXJkYXRhLT5pbml0ZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKAogCQkJCQkJJnBkZXYtPmRldiwgcmVnX25wKTsKQEAgLTkyMiw2ICs5MzcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7IGkrKykgewogCQljb25zdCBzdHJ1Y3Qgc2VjX3ZvbHRhZ2VfZGVzYyAqZGVzYzsKIAkJaW50IGlkID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0uaWQ7CisJCWludCBlbmFibGVfcmVnLCBlbmFibGVfdmFsOwogCiAJCWRlc2MgPSByZWdfdm9sdGFnZV9tYXBbaWRdOwogCQlpZiAoZGVzYykgewpAQCAtOTM1LDYgKzk1MSwxMiBAQAogCQkJCXJlZ3VsYXRvcnNbaWRdLnZzZWxfbWFzayA9IDB4M2Y7CiAJCQllbHNlCiAJCQkJcmVndWxhdG9yc1tpZF0udnNlbF9tYXNrID0gMHhmZjsKKworCQkJczVtODc2N19nZXRfcmVnaXN0ZXIoczVtODc2NywgaWQsICZlbmFibGVfcmVnLAorCQkJCQkgICAgICZlbmFibGVfdmFsKTsKKwkJCXJlZ3VsYXRvcnNbaWRdLmVuYWJsZV9yZWcgPSBlbmFibGVfcmVnOworCQkJcmVndWxhdG9yc1tpZF0uZW5hYmxlX21hc2sgPSBTNU04NzY3X0VOQ1RSTF9NQVNLOworCQkJcmVndWxhdG9yc1tpZF0uZW5hYmxlX3ZhbCA9IGVuYWJsZV92YWw7CiAJCX0KIAogCQljb25maWcuZGV2ID0gczVtODc2Ny0+ZGV2OwpAQCAtOTQyLDYgKzk2NCw5IEBACiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHM1bTg3Njc7CiAJCWNvbmZpZy5yZWdtYXAgPSBpb2Rldi0+cmVnbWFwX3BtaWM7CiAJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ucmVnX25vZGU7CisJCWlmIChwZGF0YS0+cmVndWxhdG9yc1tpXS5leHRfY29udHJvbF9ncGlvKQorCQkJczVtODc2N19yZWd1bGF0b3JfY29uZmlnX2V4dF9jb250cm9sKHM1bTg3NjcsCisJCQkJCSZwZGF0YS0+cmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7CiAKIAkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2lkXSwKIAkJCQkJCSAgJmNvbmZpZyk7CkBAIC05NTEsNiArOTc2LDE2IEBACiAJCQkJCWlkKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKworCQlpZiAocGRhdGEtPnJlZ3VsYXRvcnNbaV0uZXh0X2NvbnRyb2xfZ3BpbykgeworCQkJcmV0ID0gczVtODc2N19lbmFibGVfZXh0X2NvbnRyb2woczVtODc2NywgcmRldltpXSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoczVtODc2Ny0+ZGV2LAorCQkJCQkJImZhaWxlZCB0byBlbmFibGUgZ3BpbyBjb250cm9sIG92ZXIgJXM6ICVkXG4iLAorCQkJCQkJcmRldltpXS0+ZGVzYy0+bmFtZSwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9zdC1wd20uYyBiL2RyaXZlcnMvcmVndWxhdG9yL3N0LXB3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjdhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9zdC1wd20uYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIFJlZ3VsYXRvciBkcml2ZXIgZm9yIFNUJ3MgUFdNIFJlZ3VsYXRvcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgLSBTVE1pY3JvZWxlY3Ryb25pY3MgSW5jLgorICoKKyAqIEF1dGhvcjogTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHdtLmg+CisKKyNkZWZpbmUgU1RfUFdNX1JFR19QRVJJT0QgODQ0OAorCitzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9wZGF0YSB7CisJY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjOworCXN0cnVjdCBzdF9wd21fdm9sdGFnZXMgKmR1dHlfY3ljbGVfdGFibGU7Cit9OworCitzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9kYXRhIHsKKwljb25zdCBzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHB3bV9kZXZpY2UgKnB3bTsKKwlib29sIGVuYWJsZWQ7CisJaW50IHN0YXRlOworfTsKKworc3RydWN0IHN0X3B3bV92b2x0YWdlcyB7CisJdW5zaWduZWQgaW50IHVWOworCXVuc2lnbmVkIGludCBkdXR5Y3ljbGU7Cit9OworCitzdGF0aWMgaW50IHN0X3B3bV9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHN0X3B3bV9yZWd1bGF0b3JfZGF0YSAqZHJ2ZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBkcnZkYXRhLT5zdGF0ZTsKK30KKworc3RhdGljIGludCBzdF9wd21fcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQkgICAgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IHN0X3B3bV9yZWd1bGF0b3JfZGF0YSAqZHJ2ZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZHV0eWN5Y2xlOworCWludCByZXQ7CisKKwlkdXR5Y3ljbGUgPSAoU1RfUFdNX1JFR19QRVJJT0QgLyAxMDApICoKKwkJZHJ2ZGF0YS0+cGRhdGEtPmR1dHlfY3ljbGVfdGFibGVbc2VsZWN0b3JdLmR1dHljeWNsZTsKKworCXJldCA9IHB3bV9jb25maWcoZHJ2ZGF0YS0+cHdtLCBkdXR5Y3ljbGUsIFNUX1BXTV9SRUdfUEVSSU9EKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBQV01cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRydmRhdGEtPnN0YXRlID0gc2VsZWN0b3I7CisKKwlpZiAoIWRydmRhdGEtPmVuYWJsZWQpIHsKKwkJcmV0ID0gcHdtX2VuYWJsZShkcnZkYXRhLT5wd20pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgUFdNXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZHJ2ZGF0YS0+ZW5hYmxlZCA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RfcHdtX3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBzdF9wd21fcmVndWxhdG9yX2RhdGEgKmRydmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoc2VsZWN0b3IgPj0gZGV2LT5kZXNjLT5uX3ZvbHRhZ2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkcnZkYXRhLT5wZGF0YS0+ZHV0eV9jeWNsZV90YWJsZVtzZWxlY3Rvcl0udVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzdF9wd21fcmVndWxhdG9yX3ZvbHRhZ2Vfb3BzID0geworCS5zZXRfdm9sdGFnZV9zZWwgPSBzdF9wd21fcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gc3RfcHdtX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWwsCisJLmxpc3Rfdm9sdGFnZSAgICA9IHN0X3B3bV9yZWd1bGF0b3JfbGlzdF92b2x0YWdlLAorCS5tYXBfdm9sdGFnZSAgICAgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfaXRlcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RfcHdtX3ZvbHRhZ2VzIGIyMTA1X2R1dHlfY3ljbGVfdGFibGVbXSA9IHsKKwl7IC51ViA9IDExMTQwMDAsIC5kdXR5Y3ljbGUgPSAwLCAgfSwKKwl7IC51ViA9IDEwOTUwMDAsIC5kdXR5Y3ljbGUgPSAxMCwgfSwKKwl7IC51ViA9IDEwNzYwMDAsIC5kdXR5Y3ljbGUgPSAyMCwgfSwKKwl7IC51ViA9IDEwNTYwMDAsIC5kdXR5Y3ljbGUgPSAzMCwgfSwKKwl7IC51ViA9IDEwMzYwMDAsIC5kdXR5Y3ljbGUgPSA0MCwgfSwKKwl7IC51ViA9IDEwMTYwMDAsIC5kdXR5Y3ljbGUgPSA1MCwgfSwKKwkvKiBXQVJOSU5HOiBWYWx1ZXMgYWJvdmUgNTAlIGR1dHktY3ljbGUgY2F1c2UgYm9vdCBmYWlsdXJlcy4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgYjIxMDVfZGVzYyA9IHsKKwkubmFtZQkJPSAiYjIxMDUtcHdtLXJlZ3VsYXRvciIsCisJLm9wcwkJPSAmc3RfcHdtX3JlZ3VsYXRvcl92b2x0YWdlX29wcywKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5fdm9sdGFnZXMJPSBBUlJBWV9TSVpFKGIyMTA1X2R1dHlfY3ljbGVfdGFibGUpLAorCS5zdXBwbHlfbmFtZSAgICA9ICJwd20iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wd21fcmVndWxhdG9yX3BkYXRhIGIyMTA1X2luZm8gPSB7CisJLmRlc2MJCSAgPSAmYjIxMDVfZGVzYywKKwkuZHV0eV9jeWNsZV90YWJsZSA9IGIyMTA1X2R1dHlfY3ljbGVfdGFibGUsCit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdF9wd21fb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0LGIyMTA1LXB3bS1yZWd1bGF0b3IiLCAuZGF0YSA9ICZiMjEwNV9pbmZvLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdF9wd21fb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHN0X3B3bV9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9kYXRhICpkcnZkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3I7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaDsKKworCWlmICghbnApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRGV2aWNlIFRyZWUgbm9kZSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJb2ZfbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uoc3RfcHdtX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAoIW9mX21hdGNoKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXRjaCBvZiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZHJ2ZGF0YS0+cGRhdGEgPSBvZl9tYXRjaC0+ZGF0YTsKKworCWNvbmZpZy5pbml0X2RhdGEgPSBvZl9nZXRfcmVndWxhdG9yX2luaXRfZGF0YSgmcGRldi0+ZGV2LCBucCk7CisJaWYgKCFjb25maWcuaW5pdF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbmZpZy5vZl9ub2RlID0gbnA7CisJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CisJY29uZmlnLmRyaXZlcl9kYXRhID0gZHJ2ZGF0YTsKKworCWRydmRhdGEtPnB3bSA9IGRldm1fcHdtX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGRydmRhdGEtPnB3bSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBQV01cbiIpOworCQlyZXR1cm4gUFRSX0VSUihkcnZkYXRhLT5wd20pOworCX0KKworCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCSAgICBkcnZkYXRhLT5wZGF0YS0+ZGVzYywgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZWd1bGF0b3IpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXNcbiIsCisJCQlkcnZkYXRhLT5wZGF0YS0+ZGVzYy0+bmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHJlZ3VsYXRvcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0X3B3bV9yZWd1bGF0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJzdC1wd20tcmVndWxhdG9yIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoc3RfcHdtX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IHN0X3B3bV9yZWd1bGF0b3JfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN0X3B3bV9yZWd1bGF0b3JfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1QgUFdNIFJlZ3VsYXRvciBEcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3RfcHdtLXJlZ3VsYXRvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci5jCmluZGV4IGIxODdiNmIuLmEyZGFiYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLmMKQEAgLTU0LDggKzU0LDggQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdGlfYWJiX3JlZyAtIFJlZ2lzdGVyIGRlc2NyaXB0aW9uIGZvciBBQkIgYmxvY2sKLSAqIEBzZXR1cF9yZWc6CQkJc2V0dXAgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZQotICogQGNvbnRyb2xfcmVnOgkJY29udHJvbCByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlCisgKiBAc2V0dXBfb2ZmOgkJCXNldHVwIHJlZ2lzdGVyIG9mZnNldCBmcm9tIGJhc2UKKyAqIEBjb250cm9sX29mZjoJCWNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZQogICogQHNyMl93dGNudF92YWx1ZV9tYXNrOglzZXR1cCByZWdpc3Rlci0gc3IyX3d0Y250X3ZhbHVlIG1hc2sKICAqIEBmYmJfc2VsX21hc2s6CQlzZXR1cCByZWdpc3Rlci0gRkJCIHNlbCBtYXNrCiAgKiBAcmJiX3NlbF9tYXNrOgkJc2V0dXAgcmVnaXN0ZXItIFJCQiBzZWwgbWFzawpAQCAtNjQsOCArNjQsOCBAQAogICogQG9wcF9zZWxfbWFzazoJCWNvbnRyb2wgcmVnaXN0ZXIgLSBtYXNrIGZvciBtb2RlIHRvIG9wZXJhdGUKICAqLwogc3RydWN0IHRpX2FiYl9yZWcgewotCXUzMiBzZXR1cF9yZWc7Ci0JdTMyIGNvbnRyb2xfcmVnOworCXUzMiBzZXR1cF9vZmY7CisJdTMyIGNvbnRyb2xfb2ZmOwogCiAJLyogU2V0dXAgcmVnaXN0ZXIgZmllbGRzICovCiAJdTMyIHNyMl93dGNudF92YWx1ZV9tYXNrOwpAQCAtODMsNiArODMsOCBAQAogICogQHJkZXNjOgkJCXJlZ3VsYXRvciBkZXNjcmlwdG9yCiAgKiBAY2xrOgkJCWNsb2NrKHVzdWFsbHkgc3lzY2xrKSBzdXBwbHlpbmcgQUJCIGJsb2NrCiAgKiBAYmFzZToJCQliYXNlIGFkZHJlc3Mgb2YgQUJCIGJsb2NrCisgKiBAc2V0dXBfcmVnOgkJCXNldHVwIHJlZ2lzdGVyIG9mIEFCQiBibG9jaworICogQGNvbnRyb2xfcmVnOgkJY29udHJvbCByZWdpc3RlciBvZiBBQkIgYmxvY2sKICAqIEBpbnRfYmFzZToJCQlpbnRlcnJ1cHQgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCiAgKiBAZWZ1c2VfYmFzZToJCQkob3B0aW9uYWwpIGVmdXNlIGJhc2UgYWRkcmVzcyBmb3IgQUJCIG1vZGVzCiAgKiBAbGRvX2Jhc2U6CQkJKG9wdGlvbmFsKSBMRE9WQkIgdnNldCBvdmVycmlkZSBiYXNlIGFkZHJlc3MKQEAgLTk5LDYgKzEwMSw4IEBACiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJkZXNjOwogCXN0cnVjdCBjbGsgKmNsazsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CisJdm9pZCBfX2lvbWVtICpzZXR1cF9yZWc7CisJdm9pZCBfX2lvbWVtICpjb250cm9sX3JlZzsKIAl2b2lkIF9faW9tZW0gKmludF9iYXNlOwogCXZvaWQgX19pb21lbSAqZWZ1c2VfYmFzZTsKIAl2b2lkIF9faW9tZW0gKmxkb19iYXNlOwpAQCAtMTE4LDIwICsxMjIsMTggQEAKICAqIHRpX2FiYl9ybXcoKSAtIGhhbmR5IHdyYXBwZXIgdG8gc2V0IHNwZWNpZmljIHJlZ2lzdGVyIGJpdHMKICAqIEBtYXNrOgltYXNrIGZvciByZWdpc3RlciBmaWVsZAogICogQHZhbHVlOgl2YWx1ZSBzaGlmdGVkIHRvIG1hc2sgbG9jYXRpb24gYW5kIHdyaXR0ZW4KLSAqIEBvZmZzZXQ6CW9mZnNldCBvZiByZWdpc3RlcgotICogQGJhc2U6CWJhc2UgYWRkcmVzcworICogQHJlZzoJcmVnaXN0ZXIgYWRkcmVzcwogICoKICAqIFJldHVybjogZmluYWwgcmVnaXN0ZXIgdmFsdWUgKG1heSBiZSB1bnVzZWQpCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIHRpX2FiYl9ybXcodTMyIG1hc2ssIHUzMiB2YWx1ZSwgdTMyIG9mZnNldCwKLQkJCSAgICAgdm9pZCBfX2lvbWVtICpiYXNlKQorc3RhdGljIGlubGluZSB1MzIgdGlfYWJiX3Jtdyh1MzIgbWFzaywgdTMyIHZhbHVlLCB2b2lkIF9faW9tZW0gKnJlZykKIHsKIAl1MzIgdmFsOwogCi0JdmFsID0gcmVhZGwoYmFzZSArIG9mZnNldCk7CisJdmFsID0gcmVhZGwocmVnKTsKIAl2YWwgJj0gfm1hc2s7CiAJdmFsIHw9ICh2YWx1ZSA8PCBfX2ZmcyhtYXNrKSkgJiBtYXNrOwotCXdyaXRlbCh2YWwsIGJhc2UgKyBvZmZzZXQpOworCXdyaXRlbCh2YWwsIHJlZyk7CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtMjYzLDIxICsyNjUsMTkgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXRpX2FiYl9ybXcocmVncy0+ZmJiX3NlbF9tYXNrIHwgcmVncy0+cmJiX3NlbF9tYXNrLCAwLCByZWdzLT5zZXR1cF9yZWcsCi0JCSAgIGFiYi0+YmFzZSk7CisJdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2sgfCByZWdzLT5yYmJfc2VsX21hc2ssIDAsIGFiYi0+c2V0dXBfcmVnKTsKIAogCXN3aXRjaCAoaW5mby0+b3BwX3NlbCkgewogCWNhc2UgVElfQUJCX1NMT1dfT1BQOgotCQl0aV9hYmJfcm13KHJlZ3MtPnJiYl9zZWxfbWFzaywgMSwgcmVncy0+c2V0dXBfcmVnLCBhYmItPmJhc2UpOworCQl0aV9hYmJfcm13KHJlZ3MtPnJiYl9zZWxfbWFzaywgMSwgYWJiLT5zZXR1cF9yZWcpOwogCQlicmVhazsKIAljYXNlIFRJX0FCQl9GQVNUX09QUDoKLQkJdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2ssIDEsIHJlZ3MtPnNldHVwX3JlZywgYWJiLT5iYXNlKTsKKwkJdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2ssIDEsIGFiYi0+c2V0dXBfcmVnKTsKIAkJYnJlYWs7CiAJfQogCiAJLyogcHJvZ3JhbSBuZXh0IHN0YXRlIG9mIEFCQiBsZG8gKi8KLQl0aV9hYmJfcm13KHJlZ3MtPm9wcF9zZWxfbWFzaywgaW5mby0+b3BwX3NlbCwgcmVncy0+Y29udHJvbF9yZWcsCi0JCSAgIGFiYi0+YmFzZSk7CisJdGlfYWJiX3JtdyhyZWdzLT5vcHBfc2VsX21hc2ssIGluZm8tPm9wcF9zZWwsIGFiYi0+Y29udHJvbF9yZWcpOwogCiAJLyoKIAkgKiBwcm9ncmFtIExETyBWQkIgdnNldCBvdmVycmlkZSBpZiBuZWVkZWQgZm9yICFieXBhc3MgbW9kZQpAQCAtMjg4LDcgKzI4OCw3IEBACiAJCXRpX2FiYl9wcm9ncmFtX2xkb3ZiYihkZXYsIGFiYiwgaW5mbyk7CiAKIAkvKiBJbml0aWF0ZSBBQkIgbGRvIGNoYW5nZSAqLwotCXRpX2FiYl9ybXcocmVncy0+b3BwX2NoYW5nZV9tYXNrLCAxLCByZWdzLT5jb250cm9sX3JlZywgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KHJlZ3MtPm9wcF9jaGFuZ2VfbWFzaywgMSwgYWJiLT5jb250cm9sX3JlZyk7CiAKIAkvKiBXYWl0IGZvciBBQkIgTERPIHRvIGNvbXBsZXRlIHRyYW5zaXRpb24gdG8gbmV3IEJpYXMgc2V0dGluZyAqLwogCXJldCA9IHRpX2FiYl93YWl0X3R4ZG9uZShkZXYsIGFiYik7CkBAIC00OTAsOCArNDkwLDcgQEAKIAlkZXZfZGJnKGRldiwgIiVzOiBDbGtfcmF0ZT0lbGQsIHNyMl9jbnQ9MHglMDh4XG4iLCBfX2Z1bmNfXywKIAkJY2xrX2dldF9yYXRlKGFiYi0+Y2xrKSwgc3IyX3d0X2NudF92YWwpOwogCi0JdGlfYWJiX3JtdyhyZWdzLT5zcjJfd3RjbnRfdmFsdWVfbWFzaywgc3IyX3d0X2NudF92YWwsIHJlZ3MtPnNldHVwX3JlZywKLQkJICAgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KHJlZ3MtPnNyMl93dGNudF92YWx1ZV9tYXNrLCBzcjJfd3RfY250X3ZhbCwgYWJiLT5zZXR1cF9yZWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDgsMzIgKzUwNywyNCBAQAogCQkJICAgICBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmluaXRfZGF0YSkKIHsKIAlzdHJ1Y3QgdGlfYWJiX2luZm8gKmluZm87Ci0JY29uc3Qgc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCWNvbnN0IF9fYmUzMiAqYWJiX2luZm87CiAJY29uc3QgdTMyIG51bV92YWx1ZXMgPSA2OwogCWNoYXIgKnBuYW1lID0gInRpLGFiYl9pbmZvIjsKLQl1MzIgbnVtX2VudHJpZXMsIGk7CisJdTMyIGk7CiAJdW5zaWduZWQgaW50ICp2b2x0X3RhYmxlOwotCWludCBtaW5fdVYgPSBJTlRfTUFYLCBtYXhfdVYgPSAwOworCWludCBudW1fZW50cmllcywgbWluX3VWID0gSU5UX01BWCwgbWF4X3VWID0gMDsKIAlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAqYyA9ICZyaW5pdF9kYXRhLT5jb25zdHJhaW50czsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgcG5hbWUsIE5VTEwpOwotCWlmICghcHJvcCkgewotCQlkZXZfZXJyKGRldiwgIk5vICclcycgcHJvcGVydHk/XG4iLCBwbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmICghcHJvcC0+dmFsdWUpIHsKLQkJZGV2X2VycihkZXYsICJFbXB0eSAnJXMnIHByb3BlcnR5P1xuIiwgcG5hbWUpOwotCQlyZXR1cm4gLUVOT0RBVEE7Ci0JfQotCiAJLyoKIAkgKiBFYWNoIGFiYl9pbmZvIGlzIGEgc2V0IG9mIG4tdHVwbGUsIHdoZXJlIG4gaXMgbnVtX3ZhbHVlcywgY29uc2lzdGluZwogCSAqIG9mIHZvbHRhZ2UgYW5kIGEgc2V0IG9mIGRldGVjdGlvbiBsb2dpYyBmb3IgQUJCIGluZm9ybWF0aW9uIGZvciB0aGF0CiAJICogdm9sdGFnZSB0byBhcHBseS4KIAkgKi8KLQludW1fZW50cmllcyA9IHByb3AtPmxlbmd0aCAvIHNpemVvZih1MzIpOworCW51bV9lbnRyaWVzID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKGRldi0+b2Zfbm9kZSwgcG5hbWUpOworCWlmIChudW1fZW50cmllcyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJObyAnJXMnIHByb3BlcnR5P1xuIiwgcG5hbWUpOworCQlyZXR1cm4gbnVtX2VudHJpZXM7CisJfQorCiAJaWYgKCFudW1fZW50cmllcyB8fCAobnVtX2VudHJpZXMgJSBudW1fdmFsdWVzKSkgewogCQlkZXZfZXJyKGRldiwgIkFsbCAnJXMnIGxpc3QgZW50cmllcyBuZWVkICVkIHZhbHNcbiIsIHBuYW1lLAogCQkJbnVtX3ZhbHVlcyk7CkBAIC01NDIsMzggKzUzMywzOCBAQAogCW51bV9lbnRyaWVzIC89IG51bV92YWx1ZXM7CiAKIAlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbmZvKSAqIG51bV9lbnRyaWVzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBpbmZvIHRhYmxlIGZvciAnJXMnIHByb3BlcnR5XG4iLAotCQkJcG5hbWUpOworCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJYWJiLT5pbmZvID0gaW5mbzsKIAogCXZvbHRfdGFibGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YodW5zaWduZWQgaW50KSAqIG51bV9lbnRyaWVzLAogCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2b2x0X3RhYmxlKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgdm9sdGFnZSB0YWJsZSBmb3IgJyVzJyBwcm9wZXJ0eVxuIiwKLQkJCXBuYW1lKTsKKwlpZiAoIXZvbHRfdGFibGUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWFiYi0+cmRlc2Mubl92b2x0YWdlcyA9IG51bV9lbnRyaWVzOwogCWFiYi0+cmRlc2Mudm9sdF90YWJsZSA9IHZvbHRfdGFibGU7CiAJLyogV2UgZG8gbm90IGtub3cgd2hlcmUgdGhlIE9QUCB2b2x0YWdlIGlzIGF0IHRoZSBtb21lbnQgKi8KIAlhYmItPmN1cnJlbnRfaW5mb19pZHggPSAtRUlOVkFMOwogCi0JYWJiX2luZm8gPSBwcm9wLT52YWx1ZTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKywgaW5mbysrLCB2b2x0X3RhYmxlKyspIHsKIAkJdTMyIGVmdXNlX29mZnNldCwgcmJiX21hc2ssIGZiYl9tYXNrLCB2c2V0X21hc2s7CiAJCXUzMiBlZnVzZV92YWw7CiAKIAkJLyogTk9URTogbnVtX3ZhbHVlcyBzaG91bGQgZXF1YWwgdG8gZW50cmllcyBwaWNrZWQgdXAgaGVyZSAqLwotCQkqdm9sdF90YWJsZSA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJaW5mby0+b3BwX3NlbCA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJZWZ1c2Vfb2Zmc2V0ID0gYmUzMl90b19jcHVwKGFiYl9pbmZvKyspOwotCQlyYmJfbWFzayA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJZmJiX21hc2sgPSBiZTMyX3RvX2NwdXAoYWJiX2luZm8rKyk7Ci0JCXZzZXRfbWFzayA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwgaSAqIG51bV92YWx1ZXMsCisJCQkJCSAgIHZvbHRfdGFibGUpOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLAorCQkJCQkgICBpICogbnVtX3ZhbHVlcyArIDEsICZpbmZvLT5vcHBfc2VsKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwKKwkJCQkJICAgaSAqIG51bV92YWx1ZXMgKyAyLCAmZWZ1c2Vfb2Zmc2V0KTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwKKwkJCQkJICAgaSAqIG51bV92YWx1ZXMgKyAzLCAmcmJiX21hc2spOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLAorCQkJCQkgICBpICogbnVtX3ZhbHVlcyArIDQsICZmYmJfbWFzayk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGRldi0+b2Zfbm9kZSwgcG5hbWUsCisJCQkJCSAgIGkgKiBudW1fdmFsdWVzICsgNSwgJnZzZXRfbWFzayk7CiAKIAkJZGV2X2RiZyhkZXYsCiAJCQkiWyVkXXY9JWQgQUJCPSVkIGVmPTB4JXggcmJiPTB4JXggZmJiPTB4JXggdnNldD0weCV4XG4iLApAQCAtNjQ4LDggKzYzOSw4IEBACiAvKiBEZWZhdWx0IEFCQiBibG9jayBvZmZzZXRzLCBJRiB0aGlzIGNoYW5nZXMgaW4gZnV0dXJlLCBjcmVhdGUgbmV3IG9uZSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB0aV9hYmJfcmVnIGFiYl9yZWdzX3YxID0gewogCS8qIFdBUk5JTkc6IHJlZ2lzdGVycyBhcmUgd3JvbmdseSBkb2N1bWVudGVkIGluIFRSTSAqLwotCS5zZXR1cF9yZWcJCT0gMHgwNCwKLQkuY29udHJvbF9yZWcJCT0gMHgwMCwKKwkuc2V0dXBfb2ZmCQk9IDB4MDQsCisJLmNvbnRyb2xfb2ZmCQk9IDB4MDAsCiAKIAkuc3IyX3d0Y250X3ZhbHVlX21hc2sJPSAoMHhmZiA8PCA4KSwKIAkuZmJiX3NlbF9tYXNrCQk9ICgweDAxIDw8IDIpLApAQCAtNjYxLDggKzY1Miw4IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRpX2FiYl9yZWcgYWJiX3JlZ3NfdjIgPSB7Ci0JLnNldHVwX3JlZwkJPSAweDAwLAotCS5jb250cm9sX3JlZwkJPSAweDA0LAorCS5zZXR1cF9vZmYJCT0gMHgwMCwKKwkuY29udHJvbF9vZmYJCT0gMHgwNCwKIAogCS5zcjJfd3RjbnRfdmFsdWVfbWFzawk9ICgweGZmIDw8IDgpLAogCS5mYmJfc2VsX21hc2sJCT0gKDB4MDEgPDwgMiksCkBAIC02NzMsOSArNjY0LDIwIEBACiAJLm9wcF9zZWxfbWFzawkJPSAoMHgwMyA8PCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGlfYWJiX3JlZyBhYmJfcmVnc19nZW5lcmljID0geworCS5zcjJfd3RjbnRfdmFsdWVfbWFzawk9ICgweGZmIDw8IDgpLAorCS5mYmJfc2VsX21hc2sJCT0gKDB4MDEgPDwgMiksCisJLnJiYl9zZWxfbWFzawkJPSAoMHgwMSA8PCAxKSwKKwkuc3IyX2VuX21hc2sJCT0gKDB4MDEgPDwgMCksCisKKwkub3BwX2NoYW5nZV9tYXNrCT0gKDB4MDEgPDwgMiksCisJLm9wcF9zZWxfbWFzawkJPSAoMHgwMyA8PCAwKSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRpX2FiYl9vZl9tYXRjaFtdID0gewogCXsuY29tcGF0aWJsZSA9ICJ0aSxhYmItdjEiLCAuZGF0YSA9ICZhYmJfcmVnc192MX0sCiAJey5jb21wYXRpYmxlID0gInRpLGFiYi12MiIsIC5kYXRhID0gJmFiYl9yZWdzX3YyfSwKKwl7LmNvbXBhdGlibGUgPSAidGksYWJiLXYzIiwgLmRhdGEgPSAmYWJiX3JlZ3NfZ2VuZXJpY30sCiAJeyB9LAogfTsKIApAQCAtNzIyLDExICs3MjQsMjkgQEAKIAlhYmItPnJlZ3MgPSBtYXRjaC0+ZGF0YTsKIAogCS8qIE1hcCBBQkIgcmVzb3VyY2VzICovCi0JcG5hbWUgPSAiYmFzZS1hZGRyZXNzIjsKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBwbmFtZSk7Ci0JYWJiLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGFiYi0+YmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKGFiYi0+YmFzZSk7CisJaWYgKGFiYi0+cmVncy0+c2V0dXBfb2ZmIHx8IGFiYi0+cmVncy0+Y29udHJvbF9vZmYpIHsKKwkJcG5hbWUgPSAiYmFzZS1hZGRyZXNzIjsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcG5hbWUpOworCQlhYmItPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGFiYi0+YmFzZSkpCisJCQlyZXR1cm4gUFRSX0VSUihhYmItPmJhc2UpOworCisJCWFiYi0+c2V0dXBfcmVnID0gYWJiLT5iYXNlICsgYWJiLT5yZWdzLT5zZXR1cF9vZmY7CisJCWFiYi0+Y29udHJvbF9yZWcgPSBhYmItPmJhc2UgKyBhYmItPnJlZ3MtPmNvbnRyb2xfb2ZmOworCisJfSBlbHNlIHsKKwkJcG5hbWUgPSAiY29udHJvbC1hZGRyZXNzIjsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcG5hbWUpOworCQlhYmItPmNvbnRyb2xfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihhYmItPmNvbnRyb2xfcmVnKSkKKwkJCXJldHVybiBQVFJfRVJSKGFiYi0+Y29udHJvbF9yZWcpOworCisJCXBuYW1lID0gInNldHVwLWFkZHJlc3MiOworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBwbmFtZSk7CisJCWFiYi0+c2V0dXBfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihhYmItPnNldHVwX3JlZykpCisJCQlyZXR1cm4gUFRSX0VSUihhYmItPnNldHVwX3JlZyk7CisJfQogCiAJcG5hbWUgPSAiaW50LWFkZHJlc3MiOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sIHBuYW1lKTsKQEAgLTg2MCw3ICs4ODAsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJkZXYpOwogCiAJLyogRW5hYmxlIHRoZSBsZG8gaWYgbm90IGFscmVhZHkgZG9uZSBieSBib290bG9hZGVyICovCi0JdGlfYWJiX3JtdyhhYmItPnJlZ3MtPnNyMl9lbl9tYXNrLCAxLCBhYmItPnJlZ3MtPnNldHVwX3JlZywgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KGFiYi0+cmVncy0+c3IyX2VuX21hc2ssIDEsIGFiYi0+c2V0dXBfcmVnKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNTE2MzItcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYwppbmRleCBiMzc2NGY1Li5mMzFmMjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYwpAQCAtMjI3LDEwICsyMjcsOCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAKIAlwZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxlZCBmb3IgcGxhdGZvcm0gZGF0YVxuIik7CisJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcGRhdGEtPnJlZ19pbml0X2RhdGEgPSBvZl9nZXRfcmVndWxhdG9yX2luaXRfZGF0YShkZXYsIGRldi0+b2Zfbm9kZSk7CiAJaWYgKCFwZGF0YS0+cmVnX2luaXRfZGF0YSkgewpAQCAtMjk5LDEwICsyOTcsOCBAQAogCX0KIAogCXRwcyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqdHBzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cHMpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghdHBzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl0cHMtPmRldiA9ICZjbGllbnQtPmRldjsKIAl0cHMtPmRlc2MubmFtZSA9IGNsaWVudC0+bmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczYyMzYwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMKaW5kZXggYzNmYTE1YS4uYTE2NzIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMKQEAgLTI5OSwxMCArMjk5LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCiAJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGRldiwgIk1lbW9yeSBhbGxvYyBmYWlsZWQgZm9yIHBsYXRmb3JtIGRhdGFcbiIpOworCWlmICghcGRhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXBkYXRhLT5yZWdfaW5pdF9kYXRhID0gb2ZfZ2V0X3JlZ3VsYXRvcl9pbml0X2RhdGEoZGV2LCBkZXYtPm9mX25vZGUpOwogCWlmICghcGRhdGEtPnJlZ19pbml0X2RhdGEpIHsKQEAgLTM3NywxMSArMzc1LDggQEAKIAl9CiAKIAl0cHMgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnRwcyksIEdGUF9LRVJORUwpOwotCWlmICghdHBzKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMoKTogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLAotCQkJCQkJX19mdW5jX18pOworCWlmICghdHBzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl0cHMtPmVuX2Rpc2NoYXJnZSA9IHBkYXRhLT5lbl9kaXNjaGFyZ2U7CiAJdHBzLT5lbl9pbnRlcm5hbF9wdWxsZG4gPSBwZGF0YS0+ZW5faW50ZXJuYWxfcHVsbGRuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwppbmRleCAxNjJhMGZhLi45OGU2NmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwpAQCAtMzU5LDcgKzM1OSw2IEBACiAJLm1hcF92b2x0YWdlID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2FzY2VuZCwKIH07CiAKLSNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHRwczY1MDd4X21hdGNoZXNbXSA9IHsKIAl7IC5uYW1lID0gIlZEQ0RDMSJ9LAogCXsgLm5hbWUgPSAiVkRDREMyIn0sCkBAIC0zODEsMTIgKzM4MCwxMCBAQAogCiAJdHBzX2JvYXJkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHBzX2JvYXJkKSwKIAkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cHNfYm9hcmQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvYyBwZGF0YSBmb3IgcmVndWxhdG9ycy5cbiIpOworCWlmICghdHBzX2JvYXJkKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKLQlyZWd1bGF0b3JzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CisJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVndWxhdG9ycykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWd1bGF0b3Igbm9kZSBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTM5Niw2ICszOTMsNyBAQAogCW1hdGNoZXMgPSB0cHM2NTA3eF9tYXRjaGVzOwogCiAJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ3VsYXRvcnMsIG1hdGNoZXMsIGNvdW50KTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBwYXJzaW5nIHJlZ3VsYXRvciBpbml0IGRhdGE6ICVkXG4iLAogCQkJcmV0KTsKQEAgLTQwNiwxMCArNDA0LDggQEAKIAogCXJlZ19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIChzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEpCiAJCQkJCSogVFBTNjUwN1hfTlVNX1JFR1VMQVRPUiksIEdGUF9LRVJORUwpOwotCWlmICghcmVnX2RhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvYyBpbml0IGRhdGEgZm9yIHJlZ3VsYXRvcnMuXG4iKTsKKwlpZiAoIXJlZ19kYXRhKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAl0cHNfYm9hcmQtPnRwczY1MDd4X3BtaWNfaW5pdF9kYXRhID0gcmVnX2RhdGE7CiAKQEAgLTQyNCwxNSArNDIwLDcgQEAKIAogCXJldHVybiB0cHNfYm9hcmQ7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdHBzNjUwN3hfYm9hcmQgKnRwczY1MDd4X3BhcnNlX2R0X3JlZ19kYXRhKAotCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKip0cHM2NTA3eF9yZWdfbWF0Y2hlcykKLXsKLQkqdHBzNjUwN3hfcmVnX21hdGNoZXMgPSBOVUxMOwotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCisKIHN0YXRpYyBpbnQgdHBzNjUwN3hfcG1pY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB0cHM2NTA3eF9kZXYgKnRwczY1MDd4X2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKQEAgLTQ1Myw5ICs0NDEsMTAgQEAKIAkgKi8KIAogCXRwc19ib2FyZCA9IGRldl9nZXRfcGxhdGRhdGEodHBzNjUwN3hfZGV2LT5kZXYpOwotCWlmICghdHBzX2JvYXJkICYmIHRwczY1MDd4X2Rldi0+ZGV2LT5vZl9ub2RlKQorCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikgJiYgIXRwc19ib2FyZCAmJgorCQl0cHM2NTA3eF9kZXYtPmRldi0+b2Zfbm9kZSkKIAkJdHBzX2JvYXJkID0gdHBzNjUwN3hfcGFyc2VfZHRfcmVnX2RhdGEocGRldiwKLQkJCQkJCSZ0cHM2NTA3eF9yZWdfbWF0Y2hlcyk7CisJCQkJJnRwczY1MDd4X3JlZ19tYXRjaGVzKTsKIAlpZiAoIXRwc19ib2FyZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTQ4MSw3ICs0NzAsNyBAQAogCQl0cHMtPmluZm9baV0gPSBpbmZvOwogCQlpZiAoaW5pdF9kYXRhLT5kcml2ZXJfZGF0YSkgewogCQkJc3RydWN0IHRwczY1MDd4X3JlZ19wbGF0Zm9ybV9kYXRhICpkYXRhID0KLQkJCQkJCQlpbml0X2RhdGEtPmRyaXZlcl9kYXRhOworCQkJCQlpbml0X2RhdGEtPmRyaXZlcl9kYXRhOwogCQkJdHBzLT5pbmZvW2ldLT5kZWZkY2RjX2RlZmF1bHQgPSBkYXRhLT5kZWZkY2RjX2RlZmF1bHQ7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwOTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYwppbmRleCA2NzZmNzU1Li4yZTkyZWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYwpAQCAtMTY4LDE3ICsxNjgsMTMgQEAKIAogCXRwczY1MDkwX3BkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHBzNjUwOTBfcGRhdGEpLAogCQkJCUdGUF9LRVJORUwpOwotCWlmICghdHBzNjUwOTBfcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZvciB0cHM2NTA5MF9wZGF0YSBmYWlsZWRcbiIpOworCWlmICghdHBzNjUwOTBfcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KIAogCXJlZ19wZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBUUFM2NTA5MF9SRUdVTEFUT1JfTUFYICoKIAkJCQlzaXplb2YoKnJlZ19wZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcmVnX3BkYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmb3IgcmVnX3BkYXRhIGZhaWxlZFxuIik7CisJaWYgKCFyZWdfcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KIAogCXJlZ3VsYXRvcnMgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3VsYXRvcnMpIHsKQEAgLTE4OCw2ICsxODQsNyBAQAogCiAJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ3VsYXRvcnMsIHRwczY1MDkwX21hdGNoZXMsCiAJCQlBUlJBWV9TSVpFKHRwczY1MDkwX21hdGNoZXMpKTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiRXJyb3IgcGFyc2luZyByZWd1bGF0b3IgaW5pdCBkYXRhOiAlZFxuIiwgcmV0KTsKQEAgLTI1MiwxMCArMjQ5LDggQEAKIAogCXBtaWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgVFBTNjUwOTBfUkVHVUxBVE9SX01BWCAqIHNpemVvZigqcG1pYyksCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWVtIGFsbG9jIGZvciBwbWljIGZhaWxlZFxuIik7CisJaWYgKCFwbWljKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKG51bSA9IDA7IG51bSA8IFRQUzY1MDkwX1JFR1VMQVRPUl9NQVg7IG51bSsrKSB7CiAJCXRwc19wZGF0YSA9IHRwczY1MDkwX3BkYXRhLT5yZWdfcGRhdGFbbnVtXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE3LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMKaW5kZXggOWVhMWJmMi4uMTBiNzhkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVnczsKIAlpbnQgaSwgY291bnQ7CiAKLQlyZWdzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlyZWdzID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3MpCiAJCXJldHVybiBOVUxMOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAoIXJlZ19tYXRjaGVzW2ldLmluaXRfZGF0YSB8fCAhcmVnX21hdGNoZXNbaV0ub2Zfbm9kZSkKKwkJaWYgKCFyZWdfbWF0Y2hlc1tpXS5vZl9ub2RlKQogCQkJY29udGludWU7CiAKIAkJcGRhdGEtPnRwczY1MjE3X2luaXRfZGF0YVtpXSA9IHJlZ19tYXRjaGVzW2ldLmluaXRfZGF0YTsKQEAgLTIyMiw3ICsyMjIsNiBAQAogewogCXN0cnVjdCB0cHM2NTIxNyAqdHBzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB0cHM2NTIxN19ib2FyZCAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHRwcy0+ZGV2KTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCWludCBpOwpAQCAtMjQzLDE5ICsyNDIsOSBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRwcyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVFBTNjUyMTdfTlVNX1JFR1VMQVRPUjsgaSsrKSB7Ci0KLQkJcmVnX2RhdGEgPSBwZGF0YS0+dHBzNjUyMTdfaW5pdF9kYXRhW2ldOwotCi0JCS8qCi0JCSAqIFJlZ3VsYXRvciBBUEkgaGFuZGxlcyBlbXB0eSBjb25zdHJhaW50cyBidXQgbm90IE5VTEwKLQkJICogY29uc3RyYWludHMKLQkJICovCi0JCWlmICghcmVnX2RhdGEpCi0JCQljb250aW51ZTsKLQogCQkvKiBSZWdpc3RlciB0aGUgcmVndWxhdG9ycyAqLwogCQljb25maWcuZGV2ID0gdHBzLT5kZXY7Ci0JCWNvbmZpZy5pbml0X2RhdGEgPSByZWdfZGF0YTsKKwkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT50cHM2NTIxN19pbml0X2RhdGFbaV07CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHRwczsKIAkJY29uZmlnLnJlZ21hcCA9IHRwcy0+cmVnbWFwOwogCQlpZiAodHBzLT5kZXYtPm9mX25vZGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxOC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzcyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxOC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIHRwczY1MjE4LXJlZ3VsYXRvci5jCisgKgorICogUmVndWxhdG9yIGRyaXZlciBmb3IgVFBTNjUyMTggUE1JQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzZWQgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUyMTguaD4KKworc3RhdGljIHVuc2lnbmVkIGludCB0cHM2NTIxOF9yYW1wX2RlbGF5ID0gNDAwMDsKKworZW51bSB0cHM2NTIxOF9yZWd1bGF0b3JzIHsgRENEQzEsIERDREMyLCBEQ0RDMywgRENEQzQsIERDREM1LCBEQ0RDNiwgTERPMSB9OworCisjZGVmaW5lIFRQUzY1MjE4X1JFR1VMQVRPUihfbmFtZSwgX2lkLCBfb3BzLCBfbiwgX3ZyLCBfdm0sIF9lciwgX2VtLCBfdCwgXAorCQkJICAgIF9sciwgX25scikJCQkJXAorCXsJCQkJCQkJXAorCQkubmFtZQkJCT0gX25hbWUsCQlcCisJCS5pZAkJCT0gX2lkLAkJCVwKKwkJLm9wcwkJCT0gJl9vcHMsCQlcCisJCS5uX3ZvbHRhZ2VzCQk9IF9uLAkJCVwKKwkJLnR5cGUJCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCisJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCQlcCisJCS52c2VsX3JlZwkJPSBfdnIsCQkJXAorCQkudnNlbF9tYXNrCQk9IF92bSwJCQlcCisJCS5lbmFibGVfcmVnCQk9IF9lciwJCQlcCisJCS5lbmFibGVfbWFzawkJPSBfZW0sCQkJXAorCQkudm9sdF90YWJsZQkJPSBfdCwJCQlcCisJCS5saW5lYXJfcmFuZ2VzCQk9IF9sciwJCQlcCisJCS5uX2xpbmVhcl9yYW5nZXMJPSBfbmxyLAkJCVwKKwl9CQkJCQkJCVwKKworI2RlZmluZSBUUFM2NTIxOF9JTkZPKF9pZCwgX25tLCBfbWluLCBfbWF4KQlcCisJewkJCQkJCVwKKwkJLmlkCQk9IF9pZCwJCQlcCisJCS5uYW1lCQk9IF9ubSwJCQlcCisJCS5taW5fdVYJCT0gX21pbiwJCQlcCisJCS5tYXhfdVYJCT0gX21heCwJCQlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgZGNkYzFfZGNkYzJfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg4NTAwMDAsIDB4MCwgMHgzMiwgMTAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTM3NTAwMCwgMHgzMywgMHgzZiwgMjUwMDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGxkbzFfZGNkYzNfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg5MDAwMDAsIDB4MCwgMHgxYSwgMjUwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTYwMDAwMCwgMHgxYiwgMHgzZiwgNTAwMDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGRjZGM0X3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTE3NTAwMCwgMHgwLCAweGYsIDI1MDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1NTAwMDAsIDB4MTAsIDB4MzQsIDUwMDAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBzX2luZm8gdHBzNjUyMThfcG1pY19yZWdzW10gPSB7CisJVFBTNjUyMThfSU5GTygwLCAiRENEQzEiLCA4NTAwMDAsIDE2NzUwMCksCisJVFBTNjUyMThfSU5GTygxLCAiRENEQzIiLCA4NTAwMDAsIDE2NzUwMDApLAorCVRQUzY1MjE4X0lORk8oMiwgIkRDREMzIiwgOTAwMDAwLCAzNDAwMDAwKSwKKwlUUFM2NTIxOF9JTkZPKDMsICJEQ0RDNCIsIDExNzUwMDAsIDM0MDAwMDApLAorCVRQUzY1MjE4X0lORk8oNCwgIkRDREM1IiwgMTAwMDAwMCwgMTAwMDAwMCksCisJVFBTNjUyMThfSU5GTyg1LCAiRENEQzYiLCAxODAwMDAwLCAxODAwMDAwKSwKKwlUUFM2NTIxOF9JTkZPKDYsICJMRE8xIiwgOTAwMDAwLCAzNDAwMDAwKSwKK307CisKKyNkZWZpbmUgVFBTNjUyMThfT0ZfTUFUQ0goY29tcCwgbGFiZWwpIFwKKwl7IFwKKwkJLmNvbXBhdGlibGUgPSBjb21wLCBcCisJCS5kYXRhID0gJmxhYmVsLCBcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxOF9vZl9tYXRjaFtdID0geworCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjMSIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDMV0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjMiIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDMl0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjMyIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDM10pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjNCIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDNF0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjNSIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDNV0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjNiIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDNl0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1sZG8xIiwgdHBzNjUyMThfcG1pY19yZWdzW0xETzFdKSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0cHM2NTIxOF9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcG1pY19zZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCWludCByZXQ7CisJc3RydWN0IHRwczY1MjE4ICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHJpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwkvKiBTZXQgdGhlIHZvbHRhZ2UgYmFzZWQgb24gdnNlbCB2YWx1ZSBhbmQgd3JpdGUgcHJvdGVjdCBsZXZlbCBpcyAyICovCisJcmV0ID0gdHBzNjUyMThfc2V0X2JpdHModHBzLCBkZXYtPmRlc2MtPnZzZWxfcmVnLCBkZXYtPmRlc2MtPnZzZWxfbWFzaywKKwkJCQlzZWxlY3RvciwgVFBTNjUyMThfUFJPVEVDVF9MMSk7CisKKwkvKiBTZXQgR08gYml0IGZvciBEQ0RDMS8yIHRvIGluaXRpYXRlIHZvbHRhZ2UgdHJhbnNpc3Rpb24gKi8KKwlzd2l0Y2ggKHJpZCkgeworCWNhc2UgVFBTNjUyMThfRENEQ18xOgorCWNhc2UgVFBTNjUyMThfRENEQ18yOgorCQlyZXQgPSB0cHM2NTIxOF9zZXRfYml0cyh0cHMsIFRQUzY1MjE4X1JFR19DT05UUkxfU0xFV19SQVRFLAorCQkJCQlUUFM2NTIxOF9TTEVXX1JBVEVfR08sCisJCQkJCVRQUzY1MjE4X1NMRVdfUkFURV9HTywKKwkJCQkJVFBTNjUyMThfUFJPVEVDVF9MMSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcG1pY19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjUyMTggKnRwcyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmlkID0gcmRldl9nZXRfaWQoZGV2KTsKKworCWlmIChyaWQgPCBUUFM2NTIxOF9EQ0RDXzEgfHwgcmlkID4gVFBTNjUyMThfTERPXzEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRW5hYmxlIHRoZSByZWd1bGF0b3IgYW5kIHBhc3N3b3JkIHByb3RlY3Rpb24gaXMgbGV2ZWwgMSAqLworCXJldHVybiB0cHM2NTIxOF9zZXRfYml0cyh0cHMsIGRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKKwkJCQkgZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgZGV2LT5kZXNjLT5lbmFibGVfbWFzaywKKwkJCQkgVFBTNjUyMThfUFJPVEVDVF9MMSk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcG1pY19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1MjE4ICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHJpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwlpZiAocmlkIDwgVFBTNjUyMThfRENEQ18xIHx8IHJpZCA+IFRQUzY1MjE4X0xET18xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpc2FibGUgdGhlIHJlZ3VsYXRvciBhbmQgcGFzc3dvcmQgcHJvdGVjdGlvbiBpcyBsZXZlbCAxICovCisJcmV0dXJuIHRwczY1MjE4X2NsZWFyX2JpdHModHBzLCBkZXYtPmRlc2MtPmVuYWJsZV9yZWcsCisJCQkJICAgZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgVFBTNjUyMThfUFJPVEVDVF9MMSk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfc2V0X3ZvbHRhZ2VfdGltZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwgdW5zaWduZWQgaW50IG5ld19zZWxlY3RvcikKK3sKKwlpbnQgb2xkX3V2LCBuZXdfdXY7CisKKwlvbGRfdXYgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhcl9yYW5nZShyZGV2LCBvbGRfc2VsZWN0b3IpOworCWlmIChvbGRfdXYgPCAwKQorCQlyZXR1cm4gb2xkX3V2OworCisJbmV3X3V2ID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UocmRldiwgbmV3X3NlbGVjdG9yKTsKKwlpZiAobmV3X3V2IDwgMCkKKwkJcmV0dXJuIG5ld191djsKKworCXJldHVybiBESVZfUk9VTkRfVVAoYWJzKG9sZF91diAtIG5ld191diksIHRwczY1MjE4X3JhbXBfZGVsYXkpOworfQorCisvKiBPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBEQ0RDMSwgRENEQzIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB0cHM2NTIxOF9kY2RjMTJfb3BzID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSB0cHM2NTIxOF9wbWljX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSB0cHM2NTIxOF9wbWljX2Rpc2FibGUsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSB0cHM2NTIxOF9wbWljX3NldF92b2x0YWdlX3NlbCwKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5zZXRfdm9sdGFnZV90aW1lX3NlbAk9IHRwczY1MjE4X3NldF92b2x0YWdlX3RpbWVfc2VsLAorfTsKKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gRENEQzMsIERDREM0IGFuZCBMRE8xICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjUyMThfbGRvMV9kY2RjMzRfb3BzID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSB0cHM2NTIxOF9wbWljX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSB0cHM2NTIxOF9wbWljX2Rpc2FibGUsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSB0cHM2NTIxOF9wbWljX3NldF92b2x0YWdlX3NlbCwKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorfTsKKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gRENEQzUsIERDREM2ICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjUyMThfZGNkYzU2X3BtaWNfb3BzID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSB0cHM2NTIxOF9wbWljX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSB0cHM2NTIxOF9wbWljX2Rpc2FibGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcnNbXSA9IHsKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREMxIiwgVFBTNjUyMThfRENEQ18xLCB0cHM2NTIxOF9kY2RjMTJfb3BzLCA2NCwKKwkJCSAgIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREMxLAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9EQ0RDMV9NQVNLLAorCQkJICAgVFBTNjUyMThfUkVHX0VOQUJMRTEsIFRQUzY1MjE4X0VOQUJMRTFfREMxX0VOLCBOVUxMLAorCQkJICAgZGNkYzFfZGNkYzJfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREMyIiwgVFBTNjUyMThfRENEQ18yLCB0cHM2NTIxOF9kY2RjMTJfb3BzLCA2NCwKKwkJCSAgIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREMyLAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9EQ0RDMl9NQVNLLAorCQkJICAgVFBTNjUyMThfUkVHX0VOQUJMRTEsIFRQUzY1MjE4X0VOQUJMRTFfREMyX0VOLCBOVUxMLAorCQkJICAgZGNkYzFfZGNkYzJfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREMzIiwgVFBTNjUyMThfRENEQ18zLCB0cHM2NTIxOF9sZG8xX2RjZGMzNF9vcHMsCisJCQkgICA2NCwgVFBTNjUyMThfUkVHX0NPTlRST0xfRENEQzMsCisJCQkgICBUUFM2NTIxOF9DT05UUk9MX0RDREMzX01BU0ssIFRQUzY1MjE4X1JFR19FTkFCTEUxLAorCQkJICAgVFBTNjUyMThfRU5BQkxFMV9EQzNfRU4sIE5VTEwsCisJCQkgICBsZG8xX2RjZGMzX3JhbmdlcywgMiksCisJVFBTNjUyMThfUkVHVUxBVE9SKCJEQ0RDNCIsIFRQUzY1MjE4X0RDRENfNCwgdHBzNjUyMThfbGRvMV9kY2RjMzRfb3BzLAorCQkJICAgNTMsIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREM0LAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9EQ0RDNF9NQVNLLAorCQkJICAgVFBTNjUyMThfUkVHX0VOQUJMRTEsIFRQUzY1MjE4X0VOQUJMRTFfREM0X0VOLCBOVUxMLAorCQkJICAgZGNkYzRfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREM1IiwgVFBTNjUyMThfRENEQ181LCB0cHM2NTIxOF9kY2RjNTZfcG1pY19vcHMsCisJCQkgICAxLCAtMSwgLTEsIFRQUzY1MjE4X1JFR19FTkFCTEUxLAorCQkJICAgVFBTNjUyMThfRU5BQkxFMV9EQzVfRU4sIE5VTEwsIE5VTEwsIDApLAorCVRQUzY1MjE4X1JFR1VMQVRPUigiRENEQzYiLCBUUFM2NTIxOF9EQ0RDXzYsIHRwczY1MjE4X2RjZGM1Nl9wbWljX29wcywKKwkJCSAgIDEsIC0xLCAtMSwgVFBTNjUyMThfUkVHX0VOQUJMRTEsCisJCQkgICBUUFM2NTIxOF9FTkFCTEUxX0RDNl9FTiwgTlVMTCwgTlVMTCwgMCksCisJVFBTNjUyMThfUkVHVUxBVE9SKCJMRE8xIiwgVFBTNjUyMThfTERPXzEsIHRwczY1MjE4X2xkbzFfZGNkYzM0X29wcywgNjQsCisJCQkgICBUUFM2NTIxOF9SRUdfQ09OVFJPTF9EQ0RDNCwKKwkJCSAgIFRQUzY1MjE4X0NPTlRST0xfTERPMV9NQVNLLCBUUFM2NTIxOF9SRUdfRU5BQkxFMiwKKwkJCSAgIFRQUzY1MjE4X0VOQUJMRTJfTERPMV9FTiwgTlVMTCwgbGRvMV9kY2RjM19yYW5nZXMsCisJCQkgICAyKSwKK307CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1MjE4ICp0cHMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKKwljb25zdCBzdHJ1Y3QgdHBzX2luZm8JKnRlbXBsYXRlOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoOworCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKKwlpbnQgaWQ7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZSh0cHM2NTIxOF9vZl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0ZW1wbGF0ZSA9IG1hdGNoLT5kYXRhOworCWlkID0gdGVtcGxhdGUtPmlkOworCWluaXRfZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKCZwZGV2LT5kZXYsIHBkZXYtPmRldi5vZl9ub2RlKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRwcyk7CisKKwl0cHMtPmluZm9baWRdID0gJnRwczY1MjE4X3BtaWNfcmVnc1tpZF07CisJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CisJY29uZmlnLmluaXRfZGF0YSA9IGluaXRfZGF0YTsKKwljb25maWcuZHJpdmVyX2RhdGEgPSB0cHM7CisJY29uZmlnLnJlZ21hcCA9IHRwcy0+cmVnbWFwOworCisJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2lkXSwgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZGV2KSkgeworCQlkZXZfZXJyKHRwcy0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJlZ3VsYXRvclxuIiwKKwkJCXBkZXYtPm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjUyMThfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0cHM2NTIxOC1wbWljIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRwczY1MjE4X29mX21hdGNoLAorCX0sCisJLnByb2JlID0gdHBzNjUyMThfcmVndWxhdG9yX3Byb2JlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0cHM2NTIxOF9yZWd1bGF0b3JfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSiBLZWVydGh5IDxqLWtlZXJ0aHlAdGkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTIxOCB2b2x0YWdlIHJlZ3VsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHBzNjUyMTgtcG1pYyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyNHgtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYwppbmRleCA5ZjZiZmRhLi41YjQ5NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYwpAQCAtNTkzLDEwICs1OTMsOSBAQAogCX0KIAogCWh3ID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKHN0cnVjdCB0cHM2NTI0eCksIEdGUF9LRVJORUwpOwotCWlmICghaHcpIHsKLQkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgcmVndWxhdG9yIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFodykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgaHcpOwogCiAJbWVtc2V0KGh3LCAwLCBzaXplb2Yoc3RydWN0IHRwczY1MjR4KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jCmluZGV4IDA0ODVkNDcuLjMyZjM4YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jCkBAIC0zNjMsMTAgKzM2Myw4IEBACiAJfQogCiAJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jdGlvbiBmYWlsZWRcbiIpOworCWlmICghcGRhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlpbnQgaWQ7CkBAIC0zOTgsNyArMzk2LDcgQEAKIHsKIAlzdHJ1Y3QgdHBzNjU4NnhfcmVndWxhdG9yICpyaSA9IE5VTEw7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHRwczY1ODZ4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKnRwczY1ODZ4X3JlZ19tYXRjaGVzID0gTlVMTDsKQEAgLTQxOCwxMyArNDE2LDYgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBUUFM2NTg2WF9JRF9NQVhfUkVHVUxBVE9SICoKLQkJCQlzaXplb2YoKnJkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTW1lbW9yeSBhbGxvYyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAl2ZXJzaW9uID0gdHBzNjU4NnhfZ2V0X3ZlcnNpb24ocGRldi0+ZGV2LnBhcmVudCk7CiAKIAlmb3IgKGlkID0gMDsgaWQgPCBUUFM2NTg2WF9JRF9NQVhfUkVHVUxBVE9SOyArK2lkKSB7CkBAIC00NTEsMTIgKzQ0MiwxMSBAQAogCQlpZiAodHBzNjU4NnhfcmVnX21hdGNoZXMpCiAJCQljb25maWcub2Zfbm9kZSA9IHRwczY1ODZ4X3JlZ19tYXRjaGVzW2lkXS5vZl9ub2RlOwogCi0JCXJkZXZbaWRdID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJpLT5kZXNjLAotCQkJCQkJICAgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpZF0pKSB7CisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcmktPmRlc2MsICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yICVzXG4iLAogCQkJCQlyaS0+ZGVzYy5uYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHJkZXZbaWRdKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAKIAkJaWYgKHJlZ19kYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCmluZGV4IGY1MGRkODQuLmZhN2RiODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCkBAIC0xMDExLDExICsxMDExLDggQEAKIAogCXBtaWNfcGxhdF9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG1pY19wbGF0X2RhdGEpLAogCQkJCQlHRlBfS0VSTkVMKTsKLQotCWlmICghcG1pY19wbGF0X2RhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvYyBwZGF0YSBmb3IgcmVndWxhdG9ycy5cbiIpOworCWlmICghcG1pY19wbGF0X2RhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCW5wID0gb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7CiAJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwpAQCAtMTA5OCwxMCArMTA5NSw4IEBACiAJfQogCiAJcG1pYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBtaWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBwbWljXG4iKTsKKwlpZiAoIXBtaWMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBtaWMtPm1mZCA9IHRwczY1OTEwOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBtaWMpOwpAQCAtMTEzMCwyNCArMTEyNSwxOCBAQAogCiAJcG1pYy0+ZGVzYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwbWljLT5udW1fcmVndWxhdG9ycyAqCiAJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljLT5kZXNjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlscyBmb3IgZGVzY1xuIik7CisJaWYgKCFwbWljLT5kZXNjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwbWljLT5pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHBtaWMtPm51bV9yZWd1bGF0b3JzICoKIAkJCXNpemVvZihzdHJ1Y3QgdHBzX2luZm8gKiksIEdGUF9LRVJORUwpOwotCWlmICghcG1pYy0+aW5mbykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHMgZm9yIGluZm9cbiIpOworCWlmICghcG1pYy0+aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcG1pYy0+cmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwbWljLT5udW1fcmVndWxhdG9ycyAqCiAJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiksIEdGUF9LRVJORUwpOwotCWlmICghcG1pYy0+cmRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHMgZm9yIHJkZXZcbiIpOworCWlmICghcG1pYy0+cmRldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IHBtaWMtPm51bV9yZWd1bGF0b3JzICYmIGkgPCBUUFM2NTkxMF9OVU1fUkVHUzsKIAkJCWkrKywgaW5mbysrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM4MDAzMS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jCmluZGV4IDcxZjQ1N2EuLjI2YWE2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJCXJpLT5yaW5mby0+c3RhdGVfcmVnLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gKChyZWdfdmFsICYgVFBTODAwMzFfU1RBVEVfTUFTSykgPT0gVFBTODAwMzFfU1RBVEVfT04pOworCXJldHVybiAocmVnX3ZhbCAmIFRQUzgwMDMxX1NUQVRFX01BU0spID09IFRQUzgwMDMxX1NUQVRFX09OOwogfQogCiBzdGF0aWMgaW50IHRwczgwMDMxX3JlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCkBAIC02OTMsMTAgKzY5Myw4IEBACiAKIAlwbWljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQlUUFM4MDAzMV9SRUdVTEFUT1JfTUFYICogc2l6ZW9mKCpwbWljKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm1lbSBhbGxvYyBmb3IgcG1pYyBmYWlsZWRcbiIpOworCWlmICghcG1pYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChudW0gPSAwOyBudW0gPCBUUFM4MDAzMV9SRUdVTEFUT1JfTUFYOyArK251bSkgewogCQl0cHNfcGRhdGEgPSBwZGF0YS0+cmVndWxhdG9yX3BkYXRhW251bV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYwppbmRleCAwNGNmOWMxLi4wZDg4YTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKQEAgLTQ2OSwxMCArNDY5LDggQEAKIAogCWRjZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgIHNpemVvZihzdHJ1Y3Qgd204MzF4X2RjZGMpLAogCQkJICAgIEdGUF9LRVJORUwpOwotCWlmIChkY2RjID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFkY2RjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkY2RjLT53bTgzMXggPSB3bTgzMXg7CiAKQEAgLTYyMiwxMCArNjIwLDggQEAKIAogCWRjZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfZGNkYyksCiAJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRjZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWRjZGMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRjZGMtPndtODMxeCA9IHdtODMxeDsKIApAQCAtNzUyLDEwICs3NDgsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWRjZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfZGNkYyksIEdGUF9LRVJORUwpOwotCWlmIChkY2RjID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFkY2RjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkY2RjLT53bTgzMXggPSB3bTgzMXg7CiAKQEAgLTg0MiwxMCArODM2LDggQEAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIEVQRSVkXG4iLCBpZCArIDEpOwogCiAJZGNkYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9kY2RjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRjZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWRjZGMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRjZGMtPndtODMxeCA9IHdtODMxeDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWlzaW5rLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYwppbmRleCAwMzM5Yjg4Li43MmUzODVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYwpAQCAtMTY1LDEwICsxNjUsOCBAQAogCiAJaXNpbmsgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfaXNpbmspLAogCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoaXNpbmsgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWlzaW5rKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpc2luay0+d204MzF4ID0gd204MzF4OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKaW5kZXggNDZkNjcwMC4uZWNhMGVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYwpAQCAtMjM1LDEwICsyMzUsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlsZG8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfbGRvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8tPndtODMxeCA9IHdtODMxeDsKIApAQCAtNDQ3LDEwICs0NDUsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlsZG8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfbGRvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8tPndtODMxeCA9IHdtODMxeDsKIApAQCAtNTk0LDEwICs1OTAsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlsZG8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfbGRvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8tPndtODMxeCA9IHdtODMxeDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCmluZGV4IGRlN2I5YzcuLjdlYzdjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKQEAgLTM2MSw3ICszNjEsNyBAQAogCiAJc2VsID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcihyZGV2LCB1ViwgdVYpOwogCWlmIChzZWwgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHNlbDsKIAogCS8qIGFsbCBEQ0RDcyBoYXZlIHNhbWUgbVYgYml0cyAqLwogCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIH5XTTgzNTBfREMxX1ZTRUxfTUFTSzsKQEAgLTU3NCw3ICs1NzQsNyBAQAogCiAJc2VsID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcl9yYW5nZShyZGV2LCB1ViwgdVYpOwogCWlmIChzZWwgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHNlbDsKIAogCS8qIGFsbCBMRE9zIGhhdmUgc2FtZSBtViBiaXRzICovCiAJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgfldNODM1MF9MRE8xX1ZTRUxfTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYwppbmRleCA3MWM1OTExLi5jMjQzNDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCkBAIC0xMzQsMTAgKzEzNCw4IEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWxkbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODk5NF9sZG8pLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRvID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFsZG8pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxkby0+d204OTk0ID0gd204OTk0OwogCWxkby0+c3VwcGx5ID0gd204OTk0X2xkb19jb25zdW1lcltpZF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCBlYmY0MWUyLi5lZTBlODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTMwNCwxMiArMzA0LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGRjc3NibGtfdW5yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQlwdXRfZGV2aWNlKGRldik7Ci19Ci0KIC8qCiAgKiBkZXZpY2UgYXR0cmlidXRlIGZvciBzd2l0Y2hpbmcgc2hhcmVkL25vbnNoYXJlZCAoZXhjbHVzaXZlKQogICogb3BlcmF0aW9uIChzaG93ICsgc3RvcmUpCkBAIC0zOTcsNyArMzkxLDEzIEBACiAJYmxrX2NsZWFudXBfcXVldWUoZGV2X2luZm8tPmRjc3NibGtfcXVldWUpOwogCWRldl9pbmZvLT5nZC0+cXVldWUgPSBOVUxMOwogCXB1dF9kaXNrKGRldl9pbmZvLT5nZCk7Ci0JcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCBkY3NzYmxrX3VucmVnaXN0ZXJfY2FsbGJhY2spOworCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKKworCWlmIChkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihkZXYsIGF0dHIpKSB7CisJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CisJCXB1dF9kZXZpY2UoZGV2KTsKKwl9CisJcmV0dXJuIHJjOwogb3V0OgogCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKaW5kZXggZWI1ZDIyNy4uNWFmN2YwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJCXJhdzMyMTVfZnJlZWxpc3QgPSByZXE7CiAJfQogCi0JY2RldiA9IGNjd19kZXZpY2VfcHJvYmVfY29uc29sZSgpOworCWNkZXYgPSBjY3dfZGV2aWNlX2NyZWF0ZV9jb25zb2xlKCZyYXczMjE1X2Njd19kcml2ZXIpOwogCWlmIChJU19FUlIoY2RldikpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC05MzIsNiArOTMyLDEyIEBACiAJY2Rldi0+aGFuZGxlciA9IHJhdzMyMTVfaXJxOwogCiAJcmF3LT5mbGFncyB8PSBSQVczMjE1X0ZJWEVEOworCWlmIChjY3dfZGV2aWNlX2VuYWJsZV9jb25zb2xlKGNkZXYpKSB7CisJCWNjd19kZXZpY2VfZGVzdHJveV9jb25zb2xlKGNkZXYpOworCQlyYXczMjE1X2ZyZWVfaW5mbyhyYXcpOworCQlyYXczMjE1WzBdID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJLyogUmVxdWVzdCB0aGUgY29uc29sZSBpcnEgKi8KIAlpZiAocmF3MzIxNV9zdGFydHVwKHJhdykgIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCmluZGV4IDY5OWZkM2UuLjc1ZmZlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKQEAgLTcsNiArNyw3IEBACiAgKiAgICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAzLCAyMDA5CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zMCw2ICszMSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmF3MzI3MF9mbiBjb24zMjcwX2ZuOwogCitzdGF0aWMgYm9vbCBhdXRvX3VwZGF0ZSA9IDE7Cittb2R1bGVfcGFyYW0oYXV0b191cGRhdGUsIGJvb2wsIDApOworCiAvKgogICogTWFpbiAzMjcwIGNvbnNvbGUgdmlldyBkYXRhIHN0cnVjdHVyZS4KICAqLwpAQCAtMjA0LDYgKzIwOCw4IEBACiAJc3RydWN0IHN0cmluZyAqcywgKm47CiAJaW50IHJjOwogCisJaWYgKCFhdXRvX3VwZGF0ZSAmJiAhcmF3MzI3MF92aWV3X2FjdGl2ZSgmY3AtPnZpZXcpKQorCQlyZXR1cm47CiAJaWYgKGNwLT52aWV3LmRldikKIAkJcmF3MzI3MF9hY3RpdmF0ZV92aWV3KCZjcC0+dmlldyk7CiAKQEAgLTUyOSw2ICs1MzUsNyBAQAogCWlmICghY3AtPnZpZXcuZGV2KQogCQlyZXR1cm47CiAJcmF3MzI3MF9wbV91bmZyZWV6ZSgmY3AtPnZpZXcpOworCXJhdzMyNzBfYWN0aXZhdGVfdmlldygmY3AtPnZpZXcpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+dmlldy5sb2NrLCBmbGFncyk7CiAJY29uMzI3MF93YWl0X3dyaXRlKGNwKTsKIAljcC0+bnJfdXAgPSAwOwpAQCAtNTc2LDcgKzU4Myw2IEBACiBzdGF0aWMgaW50IF9faW5pdAogY29uMzI3MF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJc3RydWN0IHJhdzMyNzAgKnJwOwogCXZvaWQgKmNidWY7CiAJaW50IGk7CkBAIC01OTEsMTAgKzU5Nyw3IEBACiAJCWNwY21kKCJURVJNIEFVVE9DUiBPRkYiLCBOVUxMLCAwLCBOVUxMKTsKIAl9CiAKLQljZGV2ID0gY2N3X2RldmljZV9wcm9iZV9jb25zb2xlKCk7Ci0JaWYgKElTX0VSUihjZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcnAgPSByYXczMjcwX3NldHVwX2NvbnNvbGUoY2Rldik7CisJcnAgPSByYXczMjcwX3NldHVwX2NvbnNvbGUoKTsKIAlpZiAoSVNfRVJSKHJwKSkKIAkJcmV0dXJuIFBUUl9FUlIocnApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKaW5kZXggMmNkZWMyMS4uOWY4NDlkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYwpAQCAtMjc2LDYgKzI3NiwxNSBAQAogfQogCiBpbnQKK3JhdzMyNzBfdmlld19hY3RpdmUoc3RydWN0IHJhdzMyNzBfdmlldyAqdmlldykKK3sKKwlzdHJ1Y3QgcmF3MzI3MCAqcnAgPSB2aWV3LT5kZXY7CisKKwlyZXR1cm4gcnAgJiYgcnAtPnZpZXcgPT0gdmlldyAmJgorCQkhdGVzdF9iaXQoUkFXMzI3MF9GTEFHU19GUk9aRU4sICZycC0+ZmxhZ3MpOworfQorCitpbnQKIHJhdzMyNzBfc3RhcnQoc3RydWN0IHJhdzMyNzBfdmlldyAqdmlldywgc3RydWN0IHJhdzMyNzBfcmVxdWVzdCAqcnEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc3NiwyMiArNzg1LDM3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfVE4zMjcwX0NPTlNPTEUKKy8qIFRlbnRhdGl2ZSBkZWZpbml0aW9uIC0gc2VlIGJlbG93IGZvciBhY3R1YWwgZGVmaW5pdGlvbi4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2N3X2RyaXZlciByYXczMjcwX2Njd19kcml2ZXI7CisKIC8qCiAgKiBTZXR1cCAzMjcwIGRldmljZSBjb25maWd1cmVkIGFzIGNvbnNvbGUuCiAgKi8KLXN0cnVjdCByYXczMjcwIF9faW5pdCAqcmF3MzI3MF9zZXR1cF9jb25zb2xlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQorc3RydWN0IHJhdzMyNzAgX19pbml0ICpyYXczMjcwX3NldHVwX2NvbnNvbGUodm9pZCkKIHsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCByYXczMjcwICpycDsKIAljaGFyICphc2NlYmM7CiAJaW50IHJjOwogCisJY2RldiA9IGNjd19kZXZpY2VfY3JlYXRlX2NvbnNvbGUoJnJhdzMyNzBfY2N3X2RyaXZlcik7CisJaWYgKElTX0VSUihjZGV2KSkKKwkJcmV0dXJuIEVSUl9DQVNUKGNkZXYpOworCiAJcnAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmF3MzI3MCksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlhc2NlYmMgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CiAJcmMgPSByYXczMjcwX3NldHVwX2RldmljZShjZGV2LCBycCwgYXNjZWJjKTsKIAlpZiAocmMpCiAJCXJldHVybiBFUlJfUFRSKHJjKTsKIAlzZXRfYml0KFJBVzMyNzBfRkxBR1NfQ09OU09MRSwgJnJwLT5mbGFncyk7CisKKwlyYyA9IGNjd19kZXZpY2VfZW5hYmxlX2NvbnNvbGUoY2Rldik7CisJaWYgKHJjKSB7CisJCWNjd19kZXZpY2VfZGVzdHJveV9jb25zb2xlKGNkZXYpOworCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJfQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJwLT5jZGV2KSwgZmxhZ3MpOwogCWRvIHsKIAkJX19yYXczMjcwX3Jlc2V0X2RldmljZShycCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmggYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmgKaW5kZXggN2I3M2ZmOC4uZTFlNDFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5oCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuaApAQCAtMTczLDYgKzE3Myw3IEBACiBpbnQgcmF3MzI3MF9zdGFydF9pcnEoc3RydWN0IHJhdzMyNzBfdmlldyAqLCBzdHJ1Y3QgcmF3MzI3MF9yZXF1ZXN0ICopOwogaW50IHJhdzMyNzBfcmVzZXQoc3RydWN0IHJhdzMyNzBfdmlldyAqKTsKIHN0cnVjdCByYXczMjcwX3ZpZXcgKnJhdzMyNzBfdmlldyhzdHJ1Y3QgcmF3MzI3MF92aWV3ICopOworaW50IHJhdzMyNzBfdmlld19hY3RpdmUoc3RydWN0IHJhdzMyNzBfdmlldyAqKTsKIAogLyogUmVmZXJlbmNlIGNvdW50IGlubGluZXIgZm9yIHZpZXcgc3RydWN0dXJlcy4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTkwLDcgKzE5MSw3IEBACiAJCXdha2VfdXAoJnJhdzMyNzBfd2FpdF9xdWV1ZSk7CiB9CiAKLXN0cnVjdCByYXczMjcwICpyYXczMjcwX3NldHVwX2NvbnNvbGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOworc3RydWN0IHJhdzMyNzAgKnJhdzMyNzBfc2V0dXBfY29uc29sZSh2b2lkKTsKIHZvaWQgcmF3MzI3MF93YWl0X2NvbnNfZGV2KHN0cnVjdCByYXczMjcwICopOwogCiAvKiBOb3RpZmllciBmb3IgZGV2aWNlIGFkZGl0aW9uL3JlbW92YWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfZWFybHkuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfZWFybHkuYwppbmRleCA4MmYyYzM4Li4xNDE5NmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2Vhcmx5LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9lYXJseS5jCkBAIC0yMCw3ICsyMCw5IEBACiAJc3RydWN0CXNjY2JfaGVhZGVyIGhlYWRlcjsJLyogMC03ICovCiAJdTE2CXJubWF4OwkJCS8qIDgtOSAqLwogCXU4CXJuc2l6ZTsJCQkvKiAxMCAqLwotCXU4CV9yZXNlcnZlZDBbMjQgLSAxMV07CS8qIDExLTE1ICovCisJdTgJX3Jlc2VydmVkMFsxNiAtIDExXTsJLyogMTEtMTUgKi8KKwl1MTYJbmNwdXJsOwkJCS8qIDE2LTE3ICovCisJdTgJX3Jlc2VydmVkN1syNCAtIDE4XTsJLyogMTgtMjMgKi8KIAl1OAlsb2FkcGFybVs4XTsJCS8qIDI0LTMxICovCiAJdTgJX3Jlc2VydmVkMVs0OCAtIDMyXTsJLyogMzItNDcgKi8KIAl1NjQJZmFjaWxpdGllczsJCS8qIDQ4LTU1ICovCkBAIC0zMiwxMyArMzQsMTYgQEAKIAl1OAlfcmVzZXJ2ZWQ0WzEwMCAtIDkyXTsJLyogOTItOTkgKi8KIAl1MzIJcm5zaXplMjsJCS8qIDEwMC0xMDMgKi8KIAl1NjQJcm5tYXgyOwkJCS8qIDEwNC0xMTEgKi8KLQl1OAlfcmVzZXJ2ZWQ1WzQwOTYgLSAxMTJdOwkvKiAxMTItNDA5NSAqLworCXU4CV9yZXNlcnZlZDVbMTIwIC0gMTEyXTsJLyogMTEyLTExOSAqLworCXUxNgloY3B1YTsJCQkvKiAxMjAtMTIxICovCisJdTgJX3Jlc2VydmVkNls0MDk2IC0gMTIyXTsJLyogMTIyLTQwOTUgKi8KIH0gX19wYWNrZWQgX19hbGlnbmVkKFBBR0VfU0laRSk7CiAKIHN0YXRpYyBjaGFyIHNjY2JfZWFybHlbUEFHRV9TSVpFXSBfX2FsaWduZWQoUEFHRV9TSVpFKSBfX2luaXRkYXRhOwogc3RhdGljIHVuc2lnbmVkIGludCBzY2xwX2Nvbl9oYXNfdnQyMjAgX19pbml0ZGF0YTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2NscF9jb25faGFzX2xpbmVtb2RlIF9faW5pdGRhdGE7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzY2xwX2hzYV9zaXplOworc3RhdGljIHVuc2lnbmVkIGludCBzY2xwX21heF9jcHU7CiBzdGF0aWMgc3RydWN0IHNjbHBfaXBsX2luZm8gc2NscF9pcGxfaW5mbzsKIAogdTY0IHNjbHBfZmFjaWxpdGllczsKQEAgLTEwMiw2ICsxMDcsMTUgQEAKIAlzY2xwX3J6bSA9IHNjY2ItPnJuc2l6ZSA/IHNjY2ItPnJuc2l6ZSA6IHNjY2ItPnJuc2l6ZTI7CiAJc2NscF9yem0gPDw9IDIwOwogCisJaWYgKCFzY2NiLT5oY3B1YSkgeworCQlpZiAoTUFDSElORV9JU19WTSkKKwkJCXNjbHBfbWF4X2NwdSA9IDY0OworCQllbHNlCisJCQlzY2xwX21heF9jcHUgPSBzY2NiLT5uY3B1cmw7CisJfSBlbHNlIHsKKwkJc2NscF9tYXhfY3B1ID0gc2NjYi0+aGNwdWEgKyAxOworCX0KKwogCS8qIFNhdmUgSVBMIGluZm9ybWF0aW9uICovCiAJc2NscF9pcGxfaW5mby5pc192YWxpZCA9IDE7CiAJaWYgKHNjY2ItPmZsYWdzICYgMHgyKQpAQCAtMTI5LDYgKzE0MywxMSBAQAogCXJldHVybiBzY2xwX3J6bTsKIH0KIAordW5zaWduZWQgaW50IHNjbHBfZ2V0X21heF9jcHUodm9pZCkKK3sKKwlyZXR1cm4gc2NscF9tYXhfY3B1OworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBzY2xwX2ZhY2lsaXRpZXNfZGV0ZWN0KCksIHdoaWNoIGdldHMKICAqIGNhbGxlZCBmcm9tIGVhcmx5LmMgY29kZS4gVGhlIHNjbHBfZmFjaWxpdGllc19kZXRlY3QoKSBmdW5jdGlvbiByZXRyaWV2ZXMKQEAgLTE4NCw5ICsyMDMsOSBAQAogCXNjY2JfaW5pdF9lcV9zaXplKHNjY2IpOwogCWlmIChzY2xwX2NtZF9lYXJseShTQ0xQX0NNRFdfV1JJVEVfRVZFTlRfREFUQSwgc2NjYikpCiAJCXJldHVybiAtRUlPOwotCWlmIChzY2NiLT5ldmJ1Zi5ibGtfY250ICE9IDApCi0JCXJldHVybiAoc2NjYi0+ZXZidWYuYmxrX2NudCAtIDEpICogUEFHRV9TSVpFOwotCXJldHVybiAwOworCWlmIChzY2NiLT5ldmJ1Zi5ibGtfY250ID09IDApCisJCXJldHVybiAwOworCXJldHVybiAoc2NjYi0+ZXZidWYuYmxrX2NudCAtIDEpICogUEFHRV9TSVpFOwogfQogCiBzdGF0aWMgbG9uZyBfX2luaXQgc2NscF9oc2FfY29weV93YWl0KHN0cnVjdCBzY2NiX2hlYWRlciAqc2NjYikKQEAgLTE5NSw2ICsyMTQsOCBAQAogCXNjY2ItPmxlbmd0aCA9IFBBR0VfU0laRTsKIAlpZiAoc2NscF9jbWRfZWFybHkoU0NMUF9DTURXX1JFQURfRVZFTlRfREFUQSwgc2NjYikpCiAJCXJldHVybiAtRUlPOworCWlmICgoKHN0cnVjdCBzZGlhc19zY2NiICopIHNjY2IpLT5ldmJ1Zi5ibGtfY250ID09IDApCisJCXJldHVybiAwOwogCXJldHVybiAoKChzdHJ1Y3Qgc2RpYXNfc2NjYiAqKSBzY2NiKS0+ZXZidWYuYmxrX2NudCAtIDEpICogUEFHRV9TSVpFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYyBiL2RyaXZlcnMvczM5MC9jaW8vYWlycS5jCmluZGV4IGYwNTVkZjAuLjQ0NTU2NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vYWlycS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vYWlycS5jCkBAIC0xODYsNTUgKzE4Niw3MSBAQAogRVhQT1JUX1NZTUJPTChhaXJxX2l2X3JlbGVhc2UpOwogCiAvKioKLSAqIGFpcnFfaXZfYWxsb2NfYml0IC0gYWxsb2NhdGUgYW4gaXJxIGJpdCBmcm9tIGFuIGludGVycnVwdCB2ZWN0b3IKKyAqIGFpcnFfaXZfYWxsb2MgLSBhbGxvY2F0ZSBpcnEgYml0cyBmcm9tIGFuIGludGVycnVwdCB2ZWN0b3IKICAqIEBpdjogcG9pbnRlciB0byBhbiBpbnRlcnJ1cHQgdmVjdG9yIHN0cnVjdHVyZQorICogQG51bTogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGlycSBiaXRzIHRvIGFsbG9jYXRlCiAgKgotICogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgYWxsb2NhdGVkIGlycSwgb3IgLTFVTCBpZiBubyBiaXQKLSAqIGlzIGF2YWlsYWJsZSBvciB0aGUgQUlSUV9JVl9BTExPQyBmbGFnIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQKKyAqIFJldHVybnMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGZpcnN0IGlycSBpbiB0aGUgYWxsb2NhdGVkIGJsb2NrIG9mIGlycXMsCisgKiBvciAtMVVMIGlmIG5vIGJpdCBpcyBhdmFpbGFibGUgb3IgdGhlIEFJUlFfSVZfQUxMT0MgZmxhZyBoYXMgbm90IGJlZW4KKyAqIHNwZWNpZmllZAogICovCi11bnNpZ25lZCBsb25nIGFpcnFfaXZfYWxsb2NfYml0KHN0cnVjdCBhaXJxX2l2ICppdikKK3Vuc2lnbmVkIGxvbmcgYWlycV9pdl9hbGxvYyhzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgbnVtKQogewotCXVuc2lnbmVkIGxvbmcgYml0OworCXVuc2lnbmVkIGxvbmcgYml0LCBpOwogCi0JaWYgKCFpdi0+YXZhaWwpCisJaWYgKCFpdi0+YXZhaWwgfHwgbnVtID09IDApCiAJCXJldHVybiAtMVVMOwogCXNwaW5fbG9jaygmaXYtPmxvY2spOwogCWJpdCA9IGZpbmRfZmlyc3RfYml0X2ludihpdi0+YXZhaWwsIGl2LT5iaXRzKTsKLQlpZiAoYml0IDwgaXYtPmJpdHMpIHsKLQkJY2xlYXJfYml0X2ludihiaXQsIGl2LT5hdmFpbCk7Ci0JCWlmIChiaXQgPj0gaXYtPmVuZCkKLQkJCWl2LT5lbmQgPSBiaXQgKyAxOwotCX0gZWxzZQorCXdoaWxlIChiaXQgKyBudW0gPD0gaXYtPmJpdHMpIHsKKwkJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQkJaWYgKCF0ZXN0X2JpdF9pbnYoYml0ICsgaSwgaXYtPmF2YWlsKSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPj0gbnVtKSB7CisJCQkvKiBGb3VuZCBhIHN1aXRhYmxlIGJsb2NrIG9mIGlycXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCQljbGVhcl9iaXRfaW52KGJpdCArIGksIGl2LT5hdmFpbCk7CisJCQlpZiAoYml0ICsgbnVtID49IGl2LT5lbmQpCisJCQkJaXYtPmVuZCA9IGJpdCArIG51bSArIDE7CisJCQlicmVhazsKKwkJfQorCQliaXQgPSBmaW5kX25leHRfYml0X2ludihpdi0+YXZhaWwsIGl2LT5iaXRzLCBiaXQgKyBpICsgMSk7CisJfQorCWlmIChiaXQgKyBudW0gPiBpdi0+Yml0cykKIAkJYml0ID0gLTFVTDsKIAlzcGluX3VubG9jaygmaXYtPmxvY2spOwogCXJldHVybiBiaXQ7CiAKIH0KLUVYUE9SVF9TWU1CT0woYWlycV9pdl9hbGxvY19iaXQpOworRVhQT1JUX1NZTUJPTChhaXJxX2l2X2FsbG9jKTsKIAogLyoqCi0gKiBhaXJxX2l2X2ZyZWVfYml0IC0gZnJlZSBhbiBpcnEgYml0IG9mIGFuIGludGVycnVwdCB2ZWN0b3IKKyAqIGFpcnFfaXZfZnJlZSAtIGZyZWUgaXJxIGJpdHMgb2YgYW4gaW50ZXJydXB0IHZlY3RvcgogICogQGl2OiBwb2ludGVyIHRvIGludGVycnVwdCB2ZWN0b3Igc3RydWN0dXJlCi0gKiBAYml0OiBudW1iZXIgb2YgdGhlIGlycSBiaXQgdG8gZnJlZQorICogQGJpdDogbnVtYmVyIG9mIHRoZSBmaXJzdCBpcnEgYml0IHRvIGZyZWUKKyAqIEBudW06IG51bWJlciBvZiBjb25zZWN1dGl2ZSBpcnEgYml0cyB0byBmcmVlCiAgKi8KLXZvaWQgYWlycV9pdl9mcmVlX2JpdChzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgYml0KQordm9pZCBhaXJxX2l2X2ZyZWUoc3RydWN0IGFpcnFfaXYgKml2LCB1bnNpZ25lZCBsb25nIGJpdCwgdW5zaWduZWQgbG9uZyBudW0pCiB7Ci0JaWYgKCFpdi0+YXZhaWwpCisJdW5zaWduZWQgbG9uZyBpOworCisJaWYgKCFpdi0+YXZhaWwgfHwgbnVtID09IDApCiAJCXJldHVybjsKIAlzcGluX2xvY2soJml2LT5sb2NrKTsKLQkvKiBDbGVhciAocG9zc2libHkgbGVmdCBvdmVyKSBpbnRlcnJ1cHQgYml0ICovCi0JY2xlYXJfYml0X2ludihiaXQsIGl2LT52ZWN0b3IpOwotCS8qIE1ha2UgdGhlIGJpdCBwb3NpdGlvbiBhdmFpbGFibGUgYWdhaW4gKi8KLQlzZXRfYml0X2ludihiaXQsIGl2LT5hdmFpbCk7Ci0JaWYgKGJpdCA9PSBpdi0+ZW5kIC0gMSkgeworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkvKiBDbGVhciAocG9zc2libHkgbGVmdCBvdmVyKSBpbnRlcnJ1cHQgYml0ICovCisJCWNsZWFyX2JpdF9pbnYoYml0ICsgaSwgaXYtPnZlY3Rvcik7CisJCS8qIE1ha2UgdGhlIGJpdCBwb3NpdGlvbnMgYXZhaWxhYmxlIGFnYWluICovCisJCXNldF9iaXRfaW52KGJpdCArIGksIGl2LT5hdmFpbCk7CisJfQorCWlmIChiaXQgKyBudW0gPj0gaXYtPmVuZCkgewogCQkvKiBGaW5kIG5ldyBlbmQgb2YgYml0LWZpZWxkICovCi0JCXdoaWxlICgtLWl2LT5lbmQgPiAwKQotCQkJaWYgKCF0ZXN0X2JpdF9pbnYoaXYtPmVuZCAtIDEsIGl2LT5hdmFpbCkpCi0JCQkJYnJlYWs7CisJCXdoaWxlIChpdi0+ZW5kID4gMCAmJiAhdGVzdF9iaXRfaW52KGl2LT5lbmQgLSAxLCBpdi0+YXZhaWwpKQorCQkJaXYtPmVuZC0tOwogCX0KIAlzcGluX3VubG9jaygmaXYtPmxvY2spOwogfQotRVhQT1JUX1NZTUJPTChhaXJxX2l2X2ZyZWVfYml0KTsKK0VYUE9SVF9TWU1CT0woYWlycV9pdl9mcmVlKTsKIAogLyoqCiAgKiBhaXJxX2l2X3NjYW4gLSBzY2FuIGludGVycnVwdCB2ZWN0b3IgZm9yIG5vbi16ZXJvIGJpdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCBmZDMzNjdhMS4uZGZkN2JjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMTY4LDE0ICsxNjgsMTIgQEAKICAqIFByb3ZpZGUgYW4gJ3VuZ3JvdXAnIGF0dHJpYnV0ZSBzbyB0aGUgdXNlciBjYW4gcmVtb3ZlIGdyb3VwIGRldmljZXMgbm8KICAqIGxvbmdlciBuZWVkZWQgb3IgYWNjaWRlbnRpYWxseSBjcmVhdGVkLiBTYXZlcyBtZW1vcnkgOikKICAqLwotc3RhdGljIHZvaWQgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjY3dncm91cF91bmdyb3VwKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCiB7Ci0Jc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0KIAltdXRleF9sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZ2Rldi0+ZGV2KSkgewogCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhnZGV2KTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmdkZXYtPmRldik7CiAJCV9fY2N3Z3JvdXBfcmVtb3ZlX2NkZXZfcmVmcyhnZGV2KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwpAQCAtMTk1LDEwICsxOTMsOSBAQAogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBOb3RlIHRoYXQgd2UgY2Fubm90IHVucmVnaXN0ZXIgdGhlIGRldmljZSBmcm9tIG9uZSBvZiBpdHMKLQkgKiBhdHRyaWJ1dGUgbWV0aG9kcywgc28gd2UgaGF2ZSB0byB1c2UgdGhpcyByb3VuZGFib3V0IGFwcHJvYWNoLgotCSAqLwotCXJjID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayk7CisKKwlpZiAoZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYoZGV2LCBhdHRyKSkKKwkJY2N3Z3JvdXBfdW5ncm91cChnZGV2KTsKIG91dDoKIAlpZiAocmMpIHsKIAkJaWYgKHJjICE9IC1FQUdBSU4pCkBAIC0yMjQsNiArMjIxLDE0IEBACiAJTlVMTCwKIH07CiAKK3N0YXRpYyB2b2lkIGNjd2dyb3VwX3VuZ3JvdXBfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dncm91cF9kZXZpY2UsIHVuZ3JvdXBfd29yayk7CisKKwljY3dncm91cF91bmdyb3VwKGdkZXYpOworfQorCiBzdGF0aWMgdm9pZCBjY3dncm91cF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlrZnJlZSh0b19jY3dncm91cGRldihkZXYpKTsKQEAgLTMyMyw2ICszMjgsNyBAQAogCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKIAltdXRleF9pbml0KCZnZGV2LT5yZWdfbXV0ZXgpOwogCW11dGV4X2xvY2soJmdkZXYtPnJlZ19tdXRleCk7CisJSU5JVF9XT1JLKCZnZGV2LT51bmdyb3VwX3dvcmssIGNjd2dyb3VwX3VuZ3JvdXBfd29ya2ZuKTsKIAlnZGV2LT5jb3VudCA9IG51bV9kZXZpY2VzOwogCWdkZXYtPmRldi5idXMgPSAmY2N3Z3JvdXBfYnVzX3R5cGU7CiAJZ2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKQEAgLTQwNCwxMCArNDEwLDEwIEBACiBzdGF0aWMgaW50IGNjd2dyb3VwX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogCQkJICAgICB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRhdGEpOwogCiAJaWYgKGFjdGlvbiA9PSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIpCi0JCWRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIGNjd2dyb3VwX3VuZ3JvdXBfY2FsbGJhY2spOworCQlzY2hlZHVsZV93b3JrKCZnZGV2LT51bmdyb3VwX3dvcmspOwogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYwppbmRleCA3YjI5ZDBiLi4xZDM2NjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2Nfc2NoLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jCkBAIC0xNzMsOCArMTczLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgY2hzY19pbml0X2RiZnModm9pZCkKIHsKLQljaHNjX2RlYnVnX21zZ19pZCA9IGRlYnVnX3JlZ2lzdGVyKCJjaHNjX21zZyIsIDE2LCAxLAotCQkJCQkgICAxNiAqIHNpemVvZihsb25nKSk7CisJY2hzY19kZWJ1Z19tc2dfaWQgPSBkZWJ1Z19yZWdpc3RlcigiY2hzY19tc2ciLCA4LCAxLCA0ICogc2l6ZW9mKGxvbmcpKTsKIAlpZiAoIWNoc2NfZGVidWdfbXNnX2lkKQogCQlnb3RvIG91dDsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3KGNoc2NfZGVidWdfbXNnX2lkLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDhlZTg4YzQuLjllMDU4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTI4LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vY2hwaWQuaD4KICNpbmNsdWRlIDxhc20vYWlycS5oPgogI2luY2x1ZGUgPGFzbS9pc2MuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KICNpbmNsdWRlIDxhc20vZmN4Lmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9jcncuaD4KQEAgLTU0LDcgKzU1LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgY2lvX2RlYnVnX2luaXQodm9pZCkKIHsKLQljaW9fZGVidWdfbXNnX2lkID0gZGVidWdfcmVnaXN0ZXIoImNpb19tc2ciLCAxNiwgMSwgMTYgKiBzaXplb2YobG9uZykpOworCWNpb19kZWJ1Z19tc2dfaWQgPSBkZWJ1Z19yZWdpc3RlcigiY2lvX21zZyIsIDE2LCAxLCAxMSAqIHNpemVvZihsb25nKSk7CiAJaWYgKCFjaW9fZGVidWdfbXNnX2lkKQogCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoY2lvX2RlYnVnX21zZ19pZCwgJmRlYnVnX3NwcmludGZfdmlldyk7CkBAIC02NCw3ICs2NSw3IEBACiAJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAJZGVidWdfcmVnaXN0ZXJfdmlldyhjaW9fZGVidWdfdHJhY2VfaWQsICZkZWJ1Z19oZXhfYXNjaWlfdmlldyk7CiAJZGVidWdfc2V0X2xldmVsKGNpb19kZWJ1Z190cmFjZV9pZCwgMik7Ci0JY2lvX2RlYnVnX2Nyd19pZCA9IGRlYnVnX3JlZ2lzdGVyKCJjaW9fY3J3IiwgMTYsIDEsIDE2ICogc2l6ZW9mKGxvbmcpKTsKKwljaW9fZGVidWdfY3J3X2lkID0gZGVidWdfcmVnaXN0ZXIoImNpb19jcnciLCA4LCAxLCA4ICogc2l6ZW9mKGxvbmcpKTsKIAlpZiAoIWNpb19kZWJ1Z19jcndfaWQpCiAJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAJZGVidWdfcmVnaXN0ZXJfdmlldyhjaW9fZGVidWdfY3J3X2lkLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKQEAgLTU4NCw4ICs1ODUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfZGVzYyAqaXJxX2Rlc2NfaW87Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlvX2ludGVycnVwdCA9IHsKIAkubmFtZQkgPSAiSU8iLAogCS5oYW5kbGVyID0gZG9fY2lvX2ludGVycnVwdCwKQEAgLTU5Niw3ICs1OTUsNiBAQAogCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihJT19JTlRFUlJVUFQsCiAJCQkJICZkdW1teV9pcnFfY2hpcCwgaGFuZGxlX3BlcmNwdV9pcnEpOwogCXNldHVwX2lycShJT19JTlRFUlJVUFQsICZpb19pbnRlcnJ1cHQpOwotCWlycV9kZXNjX2lvID0gaXJxX3RvX2Rlc2MoSU9fSU5URVJSVVBUKTsKIH0KIAogI2lmZGVmIENPTkZJR19DQ1dfQ09OU09MRQpAQCAtNjIzLDcgKzYyMSw3IEBACiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAkJaXJxX2VudGVyKCk7CiAJfQotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShJT19JTlRFUlJVUFQsIGlycV9kZXNjX2lvKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShJT19JTlRFUlJVUFQpOwogCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+aXJxKQogCQlzY2gtPmRyaXZlci0+aXJxKHNjaCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggZTlkNzgzNS4uZDhkOWI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC0xNTcxLDEyICsxNTcxLDI3IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX0NDV19DT05TT0xFCi1zdGF0aWMgaW50IGNjd19kZXZpY2VfY29uc29sZV9lbmFibGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsCi0JCQkJICAgICBzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIHZvaWQgY2N3X2RldmljZV9zZXRfaW50X2NsYXNzKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogeworCXN0cnVjdCBjY3dfZHJpdmVyICpjZHJ2ID0gY2Rldi0+ZHJ2OworCisJLyogTm90ZTogd2UgaW50ZXJwcmV0IGNsYXNzIDAgaW4gdGhpcyBjb250ZXh0IGFzIGFuIHVuaW5pdGlhbGl6ZWQKKwkgKiBmaWVsZCBzaW5jZSBpdCB0cmFuc2xhdGVzIHRvIGEgbm9uLUkvTyBpbnRlcnJ1cHQgY2xhc3MuICovCisJaWYgKGNkcnYtPmludF9jbGFzcyAhPSAwKQorCQljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBjZHJ2LT5pbnRfY2xhc3M7CisJZWxzZQorCQljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBJUlFJT19DSU87Cit9CisKKyNpZmRlZiBDT05GSUdfQ0NXX0NPTlNPTEUKK2ludCBfX2luaXQgY2N3X2RldmljZV9lbmFibGVfY29uc29sZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlpbnQgcmM7CiAKKwlpZiAoIWNkZXYtPmRydiB8fCAhY2Rldi0+aGFuZGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpb19zdWJjaGFubmVsX2luaXRfZmllbGRzKHNjaCk7CiAJcmMgPSBjaW9fY29tbWl0X2NvbmZpZyhzY2gpOwogCWlmIChyYykKQEAgLTE2MDksMTIgKzE2MjQsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0cnVjdCBjY3dfZGV2aWNlICpjY3dfZGV2aWNlX3Byb2JlX2NvbnNvbGUodm9pZCkKK3N0cnVjdCBjY3dfZGV2aWNlICogX19pbml0IGNjd19kZXZpY2VfY3JlYXRlX2NvbnNvbGUoc3RydWN0IGNjd19kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgaW9fc3ViY2hhbm5lbF9wcml2YXRlICppb19wcml2OwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JaW50IHJldDsKIAogCXNjaCA9IGNpb19wcm9iZV9jb25zb2xlKCk7CiAJaWYgKElTX0VSUihzY2gpKQpAQCAtMTYzMSwxOCArMTY0NSwyMyBAQAogCQlrZnJlZShpb19wcml2KTsKIAkJcmV0dXJuIGNkZXY7CiAJfQorCWNkZXYtPmRydiA9IGRydjsKIAlzZXRfaW9fcHJpdmF0ZShzY2gsIGlvX3ByaXYpOwotCXJldCA9IGNjd19kZXZpY2VfY29uc29sZV9lbmFibGUoY2Rldiwgc2NoKTsKLQlpZiAocmV0KSB7Ci0JCXNldF9pb19wcml2YXRlKHNjaCwgTlVMTCk7Ci0JCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKLQkJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKLQkJa2ZyZWUoaW9fcHJpdik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQorCWNjd19kZXZpY2Vfc2V0X2ludF9jbGFzcyhjZGV2KTsKIAlyZXR1cm4gY2RldjsKIH0KIAordm9pZCBfX2luaXQgY2N3X2RldmljZV9kZXN0cm95X2NvbnNvbGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlvX3N1YmNoYW5uZWxfcHJpdmF0ZSAqaW9fcHJpdiA9IHRvX2lvX3ByaXZhdGUoc2NoKTsKKworCXNldF9pb19wcml2YXRlKHNjaCwgTlVMTCk7CisJcHV0X2RldmljZSgmc2NoLT5kZXYpOworCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CisJa2ZyZWUoaW9fcHJpdik7Cit9CisKIC8qKgogICogY2N3X2RldmljZV93YWl0X2lkbGUoKSAtIGJ1c3kgd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBpZGxlCiAgKiBAY2RldjogY2N3IGRldmljZQpAQCAtMTcyNiwxNSArMTc0NSw4IEBACiAJaW50IHJldDsKIAogCWNkZXYtPmRydiA9IGNkcnY7IC8qIHRvIGxldCB0aGUgZHJpdmVyIGNhbGwgX3NldF9vbmxpbmUgKi8KLQkvKiBOb3RlOiB3ZSBpbnRlcnByZXQgY2xhc3MgMCBpbiB0aGlzIGNvbnRleHQgYXMgYW4gdW5pbml0aWFsaXplZAotCSAqIGZpZWxkIHNpbmNlIGl0IHRyYW5zbGF0ZXMgdG8gYSBub24tSS9PIGludGVycnVwdCBjbGFzcy4gKi8KLQlpZiAoY2Rydi0+aW50X2NsYXNzICE9IDApCi0JCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IGNkcnYtPmludF9jbGFzczsKLQllbHNlCi0JCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IElSUUlPX0NJTzsKLQorCWNjd19kZXZpY2Vfc2V0X2ludF9jbGFzcyhjZGV2KTsKIAlyZXQgPSBjZHJ2LT5wcm9iZSA/IGNkcnYtPnByb2JlKGNkZXYpIDogLUVOT0RFVjsKLQogCWlmIChyZXQpIHsKIAkJY2Rldi0+ZHJ2ID0gTlVMTDsKIAkJY2Rldi0+cHJpdmF0ZS0+aW50X2NsYXNzID0gSVJRSU9fQ0lPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IDc5NWVkNjEuLmEwYWZmMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTMzLDggKzMzLDggQEAKIAkvKiAgICAgICAgICAgICAgICAgICBOICBQICBBICAgIE0gIEwgIFYgICAgICAgICAgICAgICAgICAgICAgSCAgKi8KIAlbUUVUSF9EQkZfU0VUVVBdID0geyJxZXRoX3NldHVwIiwKIAkJCQk4LCAxLCAgIDgsIDUsICZkZWJ1Z19oZXhfYXNjaWlfdmlldywgTlVMTH0sCi0JW1FFVEhfREJGX01TR10gICA9IHsicWV0aF9tc2ciLAotCQkJCTgsIDEsIDEyOCwgMywgJmRlYnVnX3NwcmludGZfdmlldywgICBOVUxMfSwKKwlbUUVUSF9EQkZfTVNHXQkgPSB7InFldGhfbXNnIiwgOCwgMSwgMTEgKiBzaXplb2YobG9uZyksIDMsCisJCQkgICAgJmRlYnVnX3NwcmludGZfdmlldywgTlVMTH0sCiAJW1FFVEhfREJGX0NUUkxdICA9IHsicWV0aF9jb250cm9sIiwKIAkJOCwgMSwgUUVUSF9EQkZfQ1RSTF9MRU4sIDUsICZkZWJ1Z19oZXhfYXNjaWlfdmlldywgTlVMTH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKaW5kZXggMWU5ZDZhZC4uYmNkMjIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCkBAIC01ODQsNyArNTg0LDcgQEAKIAlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKIAogCWZvciAodHJ5aW5nX2lycXMgPSBpID0gMCwgbWFzayA9IDE7IGkgPCAxNjsgKytpLCBtYXNrIDw8PSAxKQotCQlpZiAoKG1hc2sgJiBwb3NzaWJsZSkgJiYgKHJlcXVlc3RfaXJxKGksICZwcm9iZV9pbnRyLCBJUlFGX0RJU0FCTEVELCAiTkNSLXByb2JlIiwgTlVMTCkgPT0gMCkpCisJCWlmICgobWFzayAmIHBvc3NpYmxlKSAmJiAocmVxdWVzdF9pcnEoaSwgJnByb2JlX2ludHIsIDAsICJOQ1ItcHJvYmUiLCBOVUxMKSA9PSAwKSkKIAkJCXRyeWluZ19pcnFzIHw9IG1hc2s7CiAKIAl0aW1lb3V0ID0gamlmZmllcyArICgyNTAgKiBIWiAvIDEwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCmluZGV4IDkzMjNkMDUuLmVhYWY4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKQEAgLTEyLDcgKzEyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZm5kZWYgQUFDX0RSSVZFUl9CVUlMRAotIyBkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRCAzMDIwMAorIyBkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRCAzMDMwMAogIyBkZWZpbmUgQUFDX0RSSVZFUl9CUkFOQ0ggIi1tcyIKICNlbmRpZgogI2RlZmluZSBNQVhJTVVNX05VTV9DT05UQUlORVJTCTMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwppbmRleCBkYWRhMzhhLi41YzZhODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCiBzdGF0aWMgaW50IGFhY19yeF9yZXN0YXJ0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldiwgaW50IGJsZWQpCiB7Ci0JdTMyIHZhcjsKKwl1MzIgdmFyID0gMDsKIAogCWlmICghKGRldi0+c3VwcGxlbWVudF9hZGFwdGVyX2luZm8uU3VwcG9ydGVkT3B0aW9uczIgJgogCSAgQUFDX09QVElPTl9NVV9SRVNFVCkgfHwgKGJsZWQgPj0gMCkgfHwgKGJsZWQgPT0gLTIpKSB7CkBAIC01MDAsMTMgKzUwMCwxNCBAQAogCQlpZiAoYmxlZCAmJiAoYmxlZCAhPSAtRVRJTUVET1VUKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoYmxlZCB8fCAodmFyID09IDB4MzgwMzAwMEYpKSB7IC8qIFVTRV9PVEhFUl9NRVRIT0QgKi8KKwlpZiAoYmxlZCAmJiAodmFyID09IDB4MzgwMzAwMEYpKSB7IC8qIFVTRV9PVEhFUl9NRVRIT0QgKi8KIAkJcnhfd3JpdGVsKGRldiwgTVVuaXQucmVzZXJ2ZWQyLCAzKTsKIAkJbXNsZWVwKDUwMDApOyAvKiBEZWxheSA1IHNlY29uZHMgKi8KIAkJdmFyID0gMHgwMDAwMDAwMTsKIAl9Ci0JaWYgKHZhciAhPSAweDAwMDAwMDAxKQorCWlmIChibGVkICYmICh2YXIgIT0gMHgwMDAwMDAwMSkpCiAJCXJldHVybiAtRUlOVkFMOworCXNzbGVlcCg1KTsKIAlpZiAocnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKSAmIEtFUk5FTF9QQU5JQykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHN0YXJ0dXBfdGltZW91dCA8IDMwMCkKQEAgLTY0Niw3ICs2NDcsNyBAQAogCWRldi0+c3luY19tb2RlID0gMDsJLyogc3luYy4gbW9kZSBub3Qgc3VwcG9ydGVkICovCiAJZGV2LT5tc2kgPSBhYWNfbXNpICYmICFwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOwogCWlmIChyZXF1ZXN0X2lycShkZXYtPnBkZXYtPmlycSwgZGV2LT5hX29wcy5hZGFwdGVyX2ludHIsCi0JCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CisJCQlJUlFGX1NIQVJFRCwgImFhY3JhaWQiLCBkZXYpIDwgMCkgewogCQlpZiAoZGV2LT5tc2kpCiAJCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcyVkOiBJbnRlcnJ1cHQgdW5hdmFpbGFibGUuXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKaW5kZXggMjI0NGYzMS4uZTY2NDc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jCkBAIC0zODcsOCArMzg3LDcgQEAKIAkJZ290byBlcnJvcl9pcnE7CiAJZGV2LT5zeW5jX21vZGUgPSAwOwkvKiBzeW5jLiBtb2RlIG5vdCBzdXBwb3J0ZWQgKi8KIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldi0+YV9vcHMuYWRhcHRlcl9pbnRyLAotCQkJSVJRRl9TSEFSRUR8SVJRRl9ESVNBQkxFRCwKLQkJCSJhYWNyYWlkIiwgKHZvaWQgKilkZXYgKSA8IDApIHsKKwkJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsICh2b2lkICopZGV2KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMlZDogSW50ZXJydXB0IHVuYXZhaWxhYmxlLlxuIiwKIAkJCW5hbWUsIGluc3RhbmNlKTsKIAkJZ290byBlcnJvcl9pb3VubWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc3JjLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwppbmRleCA3ZTE3MTA3Li45YzY1YWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJZGV2LT5tc2kgPSBhYWNfbXNpICYmICFwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOwogCiAJaWYgKHJlcXVlc3RfaXJxKGRldi0+cGRldi0+aXJxLCBkZXYtPmFfb3BzLmFkYXB0ZXJfaW50ciwKLQkJCUlSUUZfU0hBUkVEfElSUUZfRElTQUJMRUQsICJhYWNyYWlkIiwgZGV2KSA8IDApIHsKKwkJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CiAKIAkJaWYgKGRldi0+bXNpKQogCQkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CkBAIC04MDQsNyArODA0LDcgQEAKIAkJZ290byBlcnJvcl9pb3VubWFwOwogCWRldi0+bXNpID0gYWFjX21zaSAmJiAhcGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KTsKIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldi0+YV9vcHMuYWRhcHRlcl9pbnRyLAotCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CisJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CiAJCWlmIChkZXYtPm1zaSkKIAkJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOwogCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwppbmRleCAzZjdiNmZlLi5lODZlYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCVNFVFBPUlQoU0lNT0RFMCwgMCk7CiAJU0VUUE9SVChTSU1PREUxLCAwKTsKIAotCWlmKCByZXF1ZXN0X2lycShzaHBudC0+aXJxLCBzd2ludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCWlmIChyZXF1ZXN0X2lycShzaHBudC0+aXJxLCBzd2ludHIsIElSUUZfU0hBUkVELCAiYWhhMTUyeCIsIHNocG50KSkgewogCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIGJ1c3kuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KQEAgLTg5MSw3ICs4OTEsNyBAQAogCVNFVFBPUlQoU1NUQVQwLCAweDdmKTsKIAlTRVRQT1JUKFNTVEFUMSwgMHhlZik7CiAKLQlpZiAoIHJlcXVlc3RfaXJxKHNocG50LT5pcnEsIGludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCWlmIChyZXF1ZXN0X2lycShzaHBudC0+aXJxLCBpbnRyLCBJUlFGX1NIQVJFRCwgImFoYTE1MngiLCBzaHBudCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGZhaWxlZCB0byByZWFzc2lnbiBpcnEgJWQuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtX2luc2Zvcm1hdC5oCmluZGV4IDlkZjllMmMuLjgzNzM0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaApAQCAtMjA5LDcgKzIwOSw2IEBACiAjZGVmaW5lIEFJQ19PUF9KQzE2CTB4OTEwNQogI2RlZmluZSBBSUNfT1BfSk5DMTYJMHg5MjA1CiAjZGVmaW5lIEFJQ19PUF9DQUxMMTYJMHg5MzA1Ci0jZGVmaW5lIEFJQ19PUF9DQUxMMTYJMHg5MzA1CiAKIC8qIFBhZ2UgZXh0ZW5zaW9uIGlzIGxvdyB0aHJlZSBiaXRzIG9mIHNlY29uZCBvcGNvZGUgYnl0ZS4gKi8KICNkZWZpbmUgQUlDX09QX0pNUEYJMHhBMDA1CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCmluZGV4IDRmNmEzMGIuLjY1MmI0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCkBAIC0yNTAwLDE2ICsyNTAwLDE1IEBACiBzdGF0aWMgaW50IGFyY21zcl9pb3BfY29uZmlybShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXVpbnQzMl90IGNkYl9waHlhZGRyLCBjZGJfcGh5YWRkcl9oaTMyOwotCWRtYV9hZGRyX3QgZG1hX2NvaGVyZW50X2hhbmRsZTsKKwogCS8qCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkqKiBoZXJlIHdlIG5lZWQgdG8gdGVsbCBpb3AgMzMxIG91ciBmcmVlY2NiLkhpZ2hQYXJ0CiAJKiogaWYgZnJlZWNjYi5IaWdoUGFydCBpcyBub3QgemVybwogCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJKi8KLQlkbWFfY29oZXJlbnRfaGFuZGxlID0gYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlOwotCWNkYl9waHlhZGRyID0gKHVpbnQzMl90KShkbWFfY29oZXJlbnRfaGFuZGxlKTsKLQljZGJfcGh5YWRkcl9oaTMyID0gKHVpbnQzMl90KSgoY2RiX3BoeWFkZHIgPj4gMTYpID4+IDE2KTsKKwljZGJfcGh5YWRkciA9IGxvd2VyXzMyX2JpdHMoYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlKTsKKwljZGJfcGh5YWRkcl9oaTMyID0gdXBwZXJfMzJfYml0cyhhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUpOwogCWFjYi0+Y2RiX3BoeWFkZHJfaGkzMiA9IGNkYl9waHlhZGRyX2hpMzI7CiAJLyoKIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKaW5kZXggMDliYTE4Ni4uMDU5ZmY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS5jCkBAIC0yOTcxLDcgKzI5NzEsNyBAQAogCWVjLT5pcnFhZGRyCT0gYXNob3N0LT5mYXN0ICsgSU5UX1JFRzsKIAllYy0+aXJxbWFzawk9IDB4MGE7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGFjb3Juc2NzaV9pbnRyLCBJUlFGX0RJU0FCTEVELCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKKwlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGFjb3Juc2NzaV9pbnRyLCAwLCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAogCQkJaG9zdC0+aG9zdF9ubywgYXNob3N0LT5zY3NpLmlycSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYwppbmRleCBiNjc5Nzc4Li5mOGUwNjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8xLmMKKysrIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMS5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIDAsCiAJCQkgICJDdW1hbmFTQ1NJLTEiLCBob3N0KTsKIAlpZiAocmV0KSB7CiAJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMgYi9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMKaW5kZXggNTg5MTVmMi4uYWJjNjZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMi5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzIuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBjdW1hbmFzY3NpXzJfaW50ciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgImN1bWFuYXNjc2kyIiwgaW5mbyk7CisJCQkgIDAsICJjdW1hbmFzY3NpMiIsIGluZm8pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKIAkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGVjLT5pcnEsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMKaW5kZXggYWJjOTU5My4uNWUxYjczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9wb3dlcnRlYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcG93ZXJ0ZWMuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBwb3dlcnRlY3Njc2lfaW50ciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgInBvd2VydGVjIiwgaW5mbyk7CisJCQkgIDAsICJwb3dlcnRlYyIsIGluZm8pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKIAkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGVjLT5pcnEsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYwppbmRleCBhM2U2YzhhM2YuLjI5NmM5MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYwpAQCAtOTAsNiArOTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CkBAIC01NDksOCArNTUwLDEwIEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQl3aGlsZSAoIWluX2lycSgpICYmIGZhbGNvbl9nb3RfbG9jayAmJiBzdGRtYV9vdGhlcnNfd2FpdGluZygpKQotCQlzbGVlcF9vbigmZmFsY29uX2ZhaXJuZXNzX3dhaXQpOworCXdhaXRfZXZlbnRfY21kKGZhbGNvbl9mYWlybmVzc193YWl0LAorCQlpbl9pbnRlcnJ1cHQoKSB8fCAhZmFsY29uX2dvdF9sb2NrIHx8ICFzdGRtYV9vdGhlcnNfd2FpdGluZygpLAorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyksCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKSk7CiAKIAl3aGlsZSAoIWZhbGNvbl9nb3RfbG9jaykgewogCQlpZiAoaW5faXJxKCkpCkBAIC01NjIsNyArNTY1LDEwIEBACiAJCQlmYWxjb25fdHJ5aW5nX2xvY2sgPSAwOwogCQkJd2FrZV91cCgmZmFsY29uX3RyeV93YWl0KTsKIAkJfSBlbHNlIHsKLQkJCXNsZWVwX29uKCZmYWxjb25fdHJ5X3dhaXQpOworCQkJd2FpdF9ldmVudF9jbWQoZmFsY29uX3RyeV93YWl0LAorCQkJCWZhbGNvbl9nb3RfbG9jayAmJiAhZmFsY29uX3RyeWluZ19sb2NrLAorCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKSwKKwkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncykpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCmluZGV4IDJlMjhmNmMuLjFiZmIwYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCkBAIC05OCw2ICs5OCwxNCBAQAogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGNxOwogfTsKIAorc3RydWN0IGJlaXNjc2lfbWNjX3RhZ19zdGF0ZSB7CisjZGVmaW5lIE1DQ19UQUdfU1RBVEVfQ09NUExFVEVEIDB4MDAKKyNkZWZpbmUgTUNDX1RBR19TVEFURV9SVU5OSU5HICAgMHgwMQorI2RlZmluZSBNQ0NfVEFHX1NUQVRFX1RJTUVPVVQgICAweDAyCisJdWludDhfdCB0YWdfc3RhdGU7CisJc3RydWN0IGJlX2RtYV9tZW0gdGFnX21lbV9zdGF0ZTsKK307CisKIHN0cnVjdCBiZV9jdHJsX2luZm8gewogCXU4IF9faW9tZW0gKmNzcjsKIAl1OCBfX2lvbWVtICpkYjsJCS8qIERvb3IgQmVsbCAqLwpAQCAtMTIyLDYgKzEzMCw4IEBACiAJdW5zaWduZWQgc2hvcnQgbWNjX2FsbG9jX2luZGV4OwogCXVuc2lnbmVkIHNob3J0IG1jY19mcmVlX2luZGV4OwogCXVuc2lnbmVkIGludCBtY2NfdGFnX2F2YWlsYWJsZTsKKworCXN0cnVjdCBiZWlzY3NpX21jY190YWdfc3RhdGUgcHRhZ19zdGF0ZVtNQVhfTUNDX0NNRCArIDFdOwogfTsKIAogI2luY2x1ZGUgImJlX2NtZHMuaCIKQEAgLTEyOSw2ICsxMzksNyBAQAogI2RlZmluZSBQQUdFX1NISUZUXzRLIDEyCiAjZGVmaW5lIFBBR0VfU0laRV80SyAoMSA8PCBQQUdFX1NISUZUXzRLKQogI2RlZmluZSBtY2NfdGltZW91dAkJMTIwMDAwIC8qIDEycyB0aW1lb3V0ICovCisjZGVmaW5lIEJFSVNDU0lfTE9HT1VUX1NZTkNfREVMQVkJMjUwCiAKIC8qIFJldHVybnMgbnVtYmVyIG9mIHBhZ2VzIHNwYW5uZWQgYnkgdGhlIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGFkZHIgKi8KICNkZWZpbmUgUEFHRVNfNEtfU1BBTk5FRChfYWRkcmVzcywgc2l6ZSkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKaW5kZXggMzMzODM5MS4uMTQzMmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCkBAIC0xMzgsNyArMTM4LDcgQEAKICAqIEBwaGJhOiBEcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEB0YWc6IFRhZyBmb3IgdGhlIE1CWCBDb21tYW5kCiAgKiBAd3JiOiB0aGUgV1JCIHVzZWQgZm9yIHRoZSBNQlggQ29tbWFuZAotICogQGNtZF9oZHI6IElPQ1RMIEhkciBmb3IgdGhlIE1CWCBDbWQKKyAqIEBtYnhfY21kX21lbTogcHRyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1CWCBDbWQKICAqCiAgKiBXYWl0cyBmb3IgTUJYIGNvbXBsZXRpb24gd2l0aCB0aGUgcGFzc2VkIFRBRy4KICAqCkBAIC0xNDgsMjEgKzE0OCwyNiBAQAogICoqLwogaW50IGJlaXNjc2lfbWNjcV9jb21wbChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCXVpbnQzMl90IHRhZywgc3RydWN0IGJlX21jY193cmIgKip3cmIsCi0JCXZvaWQgKmNtZF9oZHIpCisJCXN0cnVjdCBiZV9kbWFfbWVtICptYnhfY21kX21lbSkKIHsKIAlpbnQgcmMgPSAwOwogCXVpbnQzMl90IG1jY190YWdfcmVzcG9uc2U7CiAJdWludDE2X3Qgc3RhdHVzID0gMCwgYWRkbF9zdGF0dXMgPSAwLCB3cmJfbnVtID0gMDsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqdGVtcF93cmI7Ci0Jc3RydWN0IGJlX2NtZF9yZXFfaGRyICppb2N0bF9oZHI7Ci0Jc3RydWN0IGJlX2NtZF9yZXNwX2hkciAqaW9jdGxfcmVzcF9oZHI7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyICptYnhfaGRyOworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKm1ieF9yZXNwX2hkcjsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKIAogCWlmIChiZWlzY3NpX2Vycm9yKHBoYmEpKSB7CiAJCWZyZWVfbWNjX3RhZygmcGhiYS0+Y3RybCwgdGFnKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRVBFUk07CiAJfQogCisJLyogU2V0IE1CWCBUYWcgc3RhdGUgdG8gQWN0aXZlICovCisJc3Bpbl9sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisJcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gTUNDX1RBR19TVEFURV9SVU5OSU5HOworCXNwaW5fdW5sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisKIAkvKiB3YWl0IGZvciB0aGUgbWNjcSBjb21wbGV0aW9uICovCiAJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKIAkJCQlwaGJhLT5jdHJsLm1jY193YWl0W3RhZ10sCkBAIC0xNzEsNTYgKzE3Niw3MSBAQAogCQkJCUJFSVNDU0lfSE9TVF9NQlhfVElNRU9VVCkpOwogCiAJaWYgKHJjIDw9IDApIHsKKwkJc3RydWN0IGJlX2RtYV9tZW0gKnRhZ19tZW07CisJCS8qIFNldCBNQlggVGFnIHN0YXRlIHRvIHRpbWVvdXQgKi8KKwkJc3Bpbl9sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisJCXBoYmEtPmN0cmwucHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9IE1DQ19UQUdfU1RBVEVfVElNRU9VVDsKKwkJc3Bpbl91bmxvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKworCQkvKiBTdG9yZSByZXNvdXJjZSBhZGRyIHRvIGJlIGZyZWVkIGxhdGVyICovCisJCXRhZ19tZW0gPSAmcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX21lbV9zdGF0ZTsKKwkJaWYgKG1ieF9jbWRfbWVtKSB7CisJCQl0YWdfbWVtLT5zaXplID0gbWJ4X2NtZF9tZW0tPnNpemU7CisJCQl0YWdfbWVtLT52YSA9IG1ieF9jbWRfbWVtLT52YTsKKwkJCXRhZ19tZW0tPmRtYSA9IG1ieF9jbWRfbWVtLT5kbWE7CisJCX0gZWxzZQorCQkJdGFnX21lbS0+c2l6ZSA9IDA7CisKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0VIIHwKIAkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCiAJCQkgICAgIkJDXyVkIDogTUJYIENtZCBDb21wbGV0aW9uIHRpbWVkIG91dFxuIik7Ci0JCXJjID0gLUVCVVNZOwotCi0JCS8qIGRlY3JlbWVudCB0aGUgbWNjcSB1c2VkIGNvdW50ICovCi0JCWF0b21pY19kZWMoJnBoYmEtPmN0cmwubWNjX29iai5xLnVzZWQpOwotCi0JCWdvdG8gcmVsZWFzZV9tY2NfdGFnOwotCX0gZWxzZQorCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSB7CiAJCXJjID0gMDsKKwkJLyogU2V0IE1CWCBUYWcgc3RhdGUgdG8gY29tcGxldGVkICovCisJCXNwaW5fbG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCQlwaGJhLT5jdHJsLnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUgPSBNQ0NfVEFHX1NUQVRFX0NPTVBMRVRFRDsKKwkJc3Bpbl91bmxvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKwl9CiAKIAltY2NfdGFnX3Jlc3BvbnNlID0gcGhiYS0+Y3RybC5tY2NfbnVtdGFnW3RhZ107CiAJc3RhdHVzID0gKG1jY190YWdfcmVzcG9uc2UgJiBDUUVfU1RBVFVTX01BU0spOwogCWFkZGxfc3RhdHVzID0gKChtY2NfdGFnX3Jlc3BvbnNlICYgQ1FFX1NUQVRVU19BRERMX01BU0spID4+CiAJCQlDUUVfU1RBVFVTX0FERExfU0hJRlQpOwogCi0JaWYgKGNtZF9oZHIpIHsKLQkJaW9jdGxfaGRyID0gKHN0cnVjdCBiZV9jbWRfcmVxX2hkciAqKWNtZF9oZHI7CisJaWYgKG1ieF9jbWRfbWVtKSB7CisJCW1ieF9oZHIgPSAoc3RydWN0IGJlX2NtZF9yZXFfaGRyICopbWJ4X2NtZF9tZW0tPnZhOwogCX0gZWxzZSB7CiAJCXdyYl9udW0gPSAobWNjX3RhZ19yZXNwb25zZSAmIENRRV9TVEFUVVNfV1JCX01BU0spID4+CiAJCQkgICBDUUVfU1RBVFVTX1dSQl9TSElGVDsKIAkJdGVtcF93cmIgPSAoc3RydWN0IGJlX21jY193cmIgKilxdWV1ZV9nZXRfd3JiKG1jY3EsIHdyYl9udW0pOwotCQlpb2N0bF9oZHIgPSBlbWJlZGRlZF9wYXlsb2FkKHRlbXBfd3JiKTsKKwkJbWJ4X2hkciA9IGVtYmVkZGVkX3BheWxvYWQodGVtcF93cmIpOwogCiAJCWlmICh3cmIpCiAJCQkqd3JiID0gdGVtcF93cmI7CiAJfQogCiAJaWYgKHN0YXR1cyB8fCBhZGRsX3N0YXR1cykgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAogCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19FSCB8CiAJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAogCQkJICAgICJCQ18lZCA6IE1CWCBDbWQgRmFpbGVkIGZvciAiCiAJCQkgICAgIlN1YnN5cyA6ICVkIE9wY29kZSA6ICVkIHdpdGggIgogCQkJICAgICJTdGF0dXMgOiAlZCBhbmQgRXh0ZF9TdGF0dXMgOiAlZFxuIiwKLQkJCSAgICBpb2N0bF9oZHItPnN1YnN5c3RlbSwKLQkJCSAgICBpb2N0bF9oZHItPm9wY29kZSwKKwkJCSAgICBtYnhfaGRyLT5zdWJzeXN0ZW0sCisJCQkgICAgbWJ4X2hkci0+b3Bjb2RlLAogCQkJICAgIHN0YXR1cywgYWRkbF9zdGF0dXMpOwogCiAJCWlmIChzdGF0dXMgPT0gTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7Ci0JCQlpb2N0bF9yZXNwX2hkciA9IChzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICopIGlvY3RsX2hkcjsKKwkJCW1ieF9yZXNwX2hkciA9IChzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICopIG1ieF9oZHI7CiAJCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsCiAJCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19FSCB8CiAJCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCQkgICAgIkJDXyVkIDogSW5zdWZmaWNlbnQgQnVmZmVyIEVycm9yICIKIAkJCQkgICAgIlJlc3BfTGVuIDogJWQgQWN0dWFsX1Jlc3BfTGVuIDogJWRcbiIsCi0JCQkJICAgIGlvY3RsX3Jlc3BfaGRyLT5yZXNwb25zZV9sZW5ndGgsCi0JCQkJICAgIGlvY3RsX3Jlc3BfaGRyLT5hY3R1YWxfcmVzcF9sZW4pOworCQkJCSAgICBtYnhfcmVzcF9oZHItPnJlc3BvbnNlX2xlbmd0aCwKKwkJCQkgICAgbWJ4X3Jlc3BfaGRyLT5hY3R1YWxfcmVzcF9sZW4pOwogCiAJCQlyYyA9IC1FQUdBSU47CiAJCQlnb3RvIHJlbGVhc2VfbWNjX3RhZzsKQEAgLTMxOSw2ICszMzksNyBAQAogaW50IGJlX21jY19jb21wbF9wcm9jZXNzX2lzcihzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCSAgICBzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCkKIHsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBwY2lfZ2V0X2RydmRhdGEoY3RybC0+cGRldik7CiAJdTE2IGNvbXBsX3N0YXR1cywgZXh0ZF9zdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQgdGFnOwogCkBAIC0zMzgsNyArMzU5LDMyIEBACiAJY3RybC0+bWNjX251bXRhZ1t0YWddIHw9IChjb21wbC0+dGFnMCAmIDB4MDBGRjAwMDApOwogCWN0cmwtPm1jY19udW10YWdbdGFnXSB8PSAoZXh0ZF9zdGF0dXMgJiAweDAwMDAwMEZGKSA8PCA4OwogCWN0cmwtPm1jY19udW10YWdbdGFnXSB8PSAoY29tcGxfc3RhdHVzICYgMHgwMDAwMDBGRik7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tY2Nfd2FpdFt0YWddKTsKKworCWlmIChjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID09IE1DQ19UQUdfU1RBVEVfUlVOTklORykgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0cmwtPm1jY193YWl0W3RhZ10pOworCX0gZWxzZSBpZiAoY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9PSBNQ0NfVEFHX1NUQVRFX1RJTUVPVVQpIHsKKwkJc3RydWN0IGJlX2RtYV9tZW0gKnRhZ19tZW07CisJCXRhZ19tZW0gPSAmY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19tZW1fc3RhdGU7CisKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAorCQkJICAgIEJFSVNDU0lfTE9HX01CT1ggfCBCRUlTQ1NJX0xPR19JTklUIHwKKwkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJDXyVkIDogTUJYIENvbXBsZXRpb24gZm9yIHRpbWVvdXQgQ29tbWFuZCAiCisJCQkgICAgImZyb20gRldcbiIpOworCQkvKiBDaGVjayBpZiBtZW1vcnkgbmVlZHMgdG8gYmUgZnJlZWQgKi8KKwkJaWYgKHRhZ19tZW0tPnNpemUpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIHRhZ19tZW0tPnNpemUsCisJCQkJCSAgICB0YWdfbWVtLT52YSwgdGFnX21lbS0+ZG1hKTsKKworCQkvKiBDaGFuZ2UgdGFnIHN0YXRlICovCisJCXNwaW5fbG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCQljdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gTUNDX1RBR19TVEFURV9DT01QTEVURUQ7CisJCXNwaW5fdW5sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisKKwkJLyogRnJlZSBNQ0MgVGFnICovCisJCWZyZWVfbWNjX3RhZyhjdHJsLCB0YWcpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zNTQsOCArNDAwLDIzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQorLyoqCisgKiBiZTJpc2NzaV9mYWlsX3Nlc3Npb24oKTogQ2xvc2luZyBzZXNzaW9uIHdpdGggYXBwcm9wcmlhdGUgZXJyb3IKKyAqIEBjbHNfc2Vzc2lvbjogcHRyIHRvIHNlc3Npb24KKyAqCisgKiBEZXBlbmRpbmcgb24gYWRhcHRlciBzdGF0ZSBhcHByb3ByaWF0ZSBlcnJvciBmbGFnIGlzIHBhc3NlZC4KKyAqKi8KK3ZvaWQgYmUyaXNjc2lfZmFpbF9zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCiB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KGNsc19zZXNzaW9uKTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOworCXVpbnQzMl90IGlzY3NpX2Vycl9mbGFnOworCisJaWYgKHBoYmEtPnN0YXRlICYgQkVfQURBUFRFUl9TVEFURV9TSFVURE9XTikKKwkJaXNjc2lfZXJyX2ZsYWcgPSBJU0NTSV9FUlJfSU5WQUxJRF9IT1NUOworCWVsc2UKKwkJaXNjc2lfZXJyX2ZsYWcgPSBJU0NTSV9FUlJfQ09OTl9GQUlMRUQ7CisKIAlpc2NzaV9zZXNzaW9uX2ZhaWx1cmUoY2xzX3Nlc3Npb24tPmRkX2RhdGEsIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CiB9CiAKQEAgLTM4NiwxOCArNDQ3LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJlaXNjc2lfY3Ffbm90aWZ5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdTE2IHFpZCwgYm9vbCBhcm0sCi0JCSAgICAgICB1MTYgbnVtX3BvcHBlZCkKLXsKLQl1MzIgdmFsID0gMDsKLQl2YWwgfD0gcWlkICYgREJfQ1FfUklOR19JRF9NQVNLOwotCWlmIChhcm0pCi0JCXZhbCB8PSAxIDw8IERCX0NRX1JFQVJNX1NISUZUOwotCXZhbCB8PSBudW1fcG9wcGVkIDw8IERCX0NRX05VTV9QT1BQRURfU0hJRlQ7Ci0JaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOwotfQotCi0KIGludCBiZWlzY3NpX3Byb2Nlc3NfbWNjKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbDsKQEAgLTQyOCw3ICs0NzcsNyBAQAogCX0KIAogCWlmIChudW0pCi0JCWJlaXNjc2lfY3Ffbm90aWZ5KHBoYmEsIHBoYmEtPmN0cmwubWNjX29iai5jcS5pZCwgdHJ1ZSwgbnVtKTsKKwkJaHdpX3JpbmdfY3FfZGIocGhiYSwgcGhiYS0+Y3RybC5tY2Nfb2JqLmNxLmlkLCBudW0sIDEsIDApOwogCiAJc3Bpbl91bmxvY2tfYmgoJnBoYmEtPmN0cmwubWNjX2NxX2xvY2spOwogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaAppbmRleCA2MjdlYmJlLi43Y2Y3Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAvKioqKioqKioqKiBNQ0MgZG9vciBiZWxsICoqKioqKioqKioqKi8KICNkZWZpbmUgREJfTUNDUV9PRkZTRVQgMHgxNDAKLSNkZWZpbmUgREJfTUNDUV9SSU5HX0lEX01BU0sgMHg3RkYJCS8qIGJpdHMgMCAtIDEwICovCisjZGVmaW5lIERCX01DQ1FfUklOR19JRF9NQVNLIDB4RkZGRgkJLyogYml0cyAwIC0gMTUgKi8KIC8qIE51bWJlciBvZiBlbnRyaWVzIHBvc3RlZCAqLwogI2RlZmluZSBEQl9NQ0NRX05VTV9QT1NURURfU0hJRlQgMTYJCS8qIGJpdHMgMTYgLSAyOSAqLwogCkBAIC03MDksNyArNzA5LDggQEAKIHZvaWQgZnJlZV9tY2NfdGFnKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHVuc2lnbmVkIGludCB0YWcpOwogCiBpbnQgYmVpc2NzaV9tY2NxX2NvbXBsKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJCXVpbnQzMl90IHRhZywgc3RydWN0IGJlX21jY193cmIgKip3cmIsIHZvaWQgKmNtZF92YSk7CisJCQl1aW50MzJfdCB0YWcsIHN0cnVjdCBiZV9tY2Nfd3JiICoqd3JiLAorCQkJc3RydWN0IGJlX2RtYV9tZW0gKm1ieF9jbWRfbWVtKTsKIC8qSVNDU0kgRnVuY3R1aW9ucyAqLwogaW50IGJlX2NtZF9md19pbml0aWFsaXplKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwogaW50IGJlX2NtZF9md191bmluaXQoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCk7CkBAIC0xMDE3LDggKzEwMTgsOCBAQAogCWludCAqdXNlcnNfZmluYWxfc3RhdHVzOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBEQl9ERUZfUERVX1JJTkdfSURfTUFTSwkJMHgzRkYJLyogYml0cyAwIC0gOSAqLwotI2RlZmluZSBEQl9ERUZfUERVX0NRUFJPQ19NQVNLCQkweDNGRkYJLyogYml0cyAwIC0gOSAqLworI2RlZmluZSBEQl9ERUZfUERVX1JJTkdfSURfTUFTSwkweDNGRkYJLyogYml0cyAwIC0gMTMgKi8KKyNkZWZpbmUgREJfREVGX1BEVV9DUVBST0NfTUFTSwkJMHgzRkZGCS8qIGJpdHMgMTYgLSAyOSAqLwogI2RlZmluZSBEQl9ERUZfUERVX1JFQVJNX1NISUZUCQkxNAogI2RlZmluZSBEQl9ERUZfUERVX0VWRU5UX1NISUZUCQkxNQogI2RlZmluZSBEQl9ERUZfUERVX0NRUFJPQ19TSElGVAkJMTYKQEAgLTEzMTcsNCArMTMxOCw1IEBACiB2b2lkIGJlX2NtZF9oZHJfcHJlcGFyZShzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgKnJlcV9oZHIsCiAJCQl1OCBzdWJzeXN0ZW0sIHU4IG9wY29kZSwgaW50IGNtZF9sZW4pOwogCit2b2lkIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKICNlbmRpZiAvKiAhQkVJU0NTSV9DTURTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKaW5kZXggODg5MDY2ZC4uYTNkZjQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogCQlpaG9zdC0+cG9ydF9zcGVlZCA9IElTQ1NJX1BPUlRfU1BFRURfMTBNQlBTOwogCQlicmVhazsKIAljYXNlIEJFMklTQ1NJX0xJTktfU1BFRURfMTAwTUJQUzoKLQkJaWhvc3QtPnBvcnRfc3BlZWQgPSBCRTJJU0NTSV9MSU5LX1NQRUVEXzEwME1CUFM7CisJCWlob3N0LT5wb3J0X3NwZWVkID0gSVNDU0lfUE9SVF9TUEVFRF8xMDBNQlBTOwogCQlicmVhazsKIAljYXNlIEJFMklTQ1NJX0xJTktfU1BFRURfMUdCUFM6CiAJCWlob3N0LT5wb3J0X3NwZWVkID0gSVNDU0lfUE9SVF9TUEVFRF8xR0JQUzsKQEAgLTExNTMsMTYgKzExNTMsMTggQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JcmV0ID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC52YSk7CisJcmV0ID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgJm5vbmVtYl9jbWQpOwogCWlmIChyZXQpIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCwKIAkJCSAgICAiQlNfJWQgOiBtZ210X29wZW5fY29ubmVjdGlvbiBGYWlsZWQiKTsKIAotCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAotCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwkJaWYgKHJldCAhPSAtRUJVU1kpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCiAJCWJlaXNjc2lfZnJlZV9lcChiZWlzY3NpX2VwKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlwdGNwY25jdF9vdXQgPSAoc3RydWN0IHRjcF9jb25uZWN0X2FuZF9vZmZsb2FkX291dCAqKW5vbmVtYl9jbWQudmE7CkBAIC0xMzU5LDYgKzEzNjEsNyBAQAogCWJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsIE5VTEwpOwogCWJlaXNjc2lfY2xvc2VfY29ubihiZWlzY3NpX2VwLCB0Y3BfdXBsb2FkX2ZsYWcpOwogZnJlZV9lcDoKKwltc2xlZXAoQkVJU0NTSV9MT0dPVVRfU1lOQ19ERUxBWSk7CiAJYmVpc2NzaV9mcmVlX2VwKGJlaXNjc2lfZXApOwogCWJlaXNjc2lfdW5iaW5kX2Nvbm5fdG9fY2lkKHBoYmEsIGJlaXNjc2lfZXAtPmVwX2NpZCk7CiAJaXNjc2lfZGVzdHJveV9lbmRwb2ludChiZWlzY3NpX2VwLT5vcGVuaXNjc2lfZXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKaW5kZXggNTY0MmE5Yi4uMGQ4MjIyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCkBAIC0yMjgsMjQgKzIyOCwyNSBAQAogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgKmludl90Ymw7CiAJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAl1bnNpZ25lZCBpbnQgY2lkLCB0YWcsIG51bV9pbnZhbGlkYXRlOworCWludCByYzsKIAogCWNsc19zZXNzaW9uID0gc3RhcmdldF90b19zZXNzaW9uKHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKIAlzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoIWFib3J0ZWRfdGFzayB8fCAhYWJvcnRlZF90YXNrLT5zYykgewogCQkvKiB3ZSByYWNlZCAqLwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CiAKIAlhYm9ydGVkX2lvX3Rhc2sgPSBhYm9ydGVkX3Rhc2stPmRkX2RhdGE7CiAJaWYgKCFhYm9ydGVkX2lvX3Rhc2stPnNjc2lfY21uZCkgewogCQkvKiByYWNlZCBvciBpbnZhbGlkIGNvbW1hbmQgKi8KLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKiBJbnZhbGlkYXRlIFdSQiBQb3N0ZWQgZm9yIHRoaXMgVGFzayAqLwogCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBpbnZsZCwKIAkJICAgICAgYWJvcnRlZF9pb190YXNrLT5wd3JiX2hhbmRsZS0+cHdyYiwKQEAgLTI4NSw5ICsyODYsMTEgQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKLQliZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBub25lbWJfY21kLnZhKTsKLQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAotCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsICZub25lbWJfY21kKTsKKwlpZiAocmMgIT0gLUVCVVNZKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisKIAlyZXR1cm4gaXNjc2lfZWhfYWJvcnQoc2MpOwogfQogCkBAIC0zMDMsMTMgKzMwNiwxNCBAQAogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgKmludl90Ymw7CiAJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAl1bnNpZ25lZCBpbnQgY2lkLCB0YWcsIGksIG51bV9pbnZhbGlkYXRlOworCWludCByYzsKIAogCS8qIGludmFsaWRhdGUgaW9jYnMgKi8KIAljbHNfc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CiAJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICghc2Vzc2lvbi0+bGVhZGNvbm4gfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKQEAgLTMzOCw3ICszNDIsNyBAQAogCQludW1faW52YWxpZGF0ZSsrOwogCQlpbnZfdGJsKys7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpbnZfdGJsID0gcGhiYS0+aW52X3RibDsKIAogCW5vbmVtYl9jbWQudmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsCkBAIC0zNjMsOSArMzY3LDEwIEBACiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC52YSk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKLQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisJcmMgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCAmbm9uZW1iX2NtZCk7CisJaWYgKHJjICE9IC1FQlVTWSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKKwkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOwogCXJldHVybiBpc2NzaV9laF9kZXZpY2VfcmVzZXQoc2MpOwogfQogCkBAIC02NzQsOCArNjc5LDE5IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKLQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKLQkJcmV0ID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgIkNvdWxkIG5vdCBzZXQgUENJIERNQSBNYXNrXG4iKTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsCisJCQkJCQkJICBETUFfQklUX01BU0soMzIpKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgIkNvdWxkIG5vdCBzZXQgUENJIERNQSBNYXNrXG4iKTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwpAQCAtODA0LDE0ICs4MjAsMjMgQEAKIAkJCSAgIHVuc2lnbmVkIGNoYXIgcmVhcm0sIHVuc2lnbmVkIGNoYXIgZXZlbnQpCiB7CiAJdTMyIHZhbCA9IDA7Ci0JdmFsIHw9IGlkICYgREJfRVFfUklOR19JRF9NQVNLOworCiAJaWYgKHJlYXJtKQogCQl2YWwgfD0gMSA8PCBEQl9FUV9SRUFSTV9TSElGVDsKIAlpZiAoY2xyX2ludGVycnVwdCkKIAkJdmFsIHw9IDEgPDwgREJfRVFfQ0xSX1NISUZUOwogCWlmIChldmVudCkKIAkJdmFsIHw9IDEgPDwgREJfRVFfRVZOVF9TSElGVDsKKwogCXZhbCB8PSBudW1fcHJvY2Vzc2VkIDw8IERCX0VRX05VTV9QT1BQRURfU0hJRlQ7CisJLyogU2V0dGluZyBsb3dlciBvcmRlciBFUV9JRCBCaXRzICovCisJdmFsIHw9IChpZCAmIERCX0VRX1JJTkdfSURfTE9XX01BU0spOworCisJLyogU2V0dGluZyBIaWdoZXIgb3JkZXIgRVFfSUQgQml0cyAqLworCXZhbCB8PSAoKChpZCA+PiBEQl9FUV9ISUdIX0ZFSUxEX1NISUZUKSAmCisJCSAgREJfRVFfUklOR19JRF9ISUdIX01BU0spCisJCSAgPDwgREJfRVFfSElHSF9TRVRfU0hJRlQpOworCiAJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9FUV9PRkZTRVQpOwogfQogCkBAIC04NzMsNyArODk4LDYgQEAKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CiAJdW5zaWduZWQgaW50IG51bV9lcV9wcm9jZXNzZWQ7CiAJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwYmVfZXEgPSBkZXZfaWQ7CiAJZXEgPSAmcGJlX2VxLT5xOwpAQCAtODgyLDMxICs5MDYsMTUgQEAKIAogCXBoYmEgPSBwYmVfZXEtPnBoYmE7CiAJbnVtX2VxX3Byb2Nlc3NlZCA9IDA7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgewotCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCi0JCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZwYmVfZXEtPmlvcG9sbCkpCi0JCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGJlX2VxLT5pb3BvbGwpOworCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KKwkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZwYmVfZXEtPmlvcG9sbCkpCisJCQlibGtfaW9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7CiAKLQkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOwotCQkJcXVldWVfdGFpbF9pbmMoZXEpOwotCQkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKLQkJCW51bV9lcV9wcm9jZXNzZWQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KLQkJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJcGJlX2VxLT50b2RvX2NxID0gdHJ1ZTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCQludW1fZXFfcHJvY2Vzc2VkKys7Ci0JCX0KLQotCQlpZiAocGJlX2VxLT50b2RvX2NxKQotCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+d29ya19jcXMpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKKwkJcXVldWVfdGFpbF9pbmMoZXEpOworCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCQludW1fZXFfcHJvY2Vzc2VkKys7CiAJfQogCiAJaWYgKG51bV9lcV9wcm9jZXNzZWQpCkBAIC05MjcsNyArOTM1LDYgQEAKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CiAJc3RydWN0IGJlX2VxX2VudHJ5ICplcWUgPSBOVUxMOwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcTsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgbnVtX21jY2VxX3Byb2Nlc3NlZCwgbnVtX2lvZXFfcHJvY2Vzc2VkOwpAQCAtOTUzLDcyICs5NjAsNDAgQEAKIAogCW51bV9pb2VxX3Byb2Nlc3NlZCA9IDA7CiAJbnVtX21jY2VxX3Byb2Nlc3NlZCA9IDA7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgewotCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCi0JCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJCWlmICgoKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksCi0JCQkgICAgIHJlc291cmNlX2lkKSAvIDMyXSAmCi0JCQkgICAgIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgPT0gbWNjLT5pZCkgewotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJCXBiZV9lcS0+dG9kb19tY2NfY3EgPSB0cnVlOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQotCQkJCQlibGtfaW9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCQkJbnVtX2lvZXFfcHJvY2Vzc2VkKys7Ci0JCQl9Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCX0KLQkJaWYgKG51bV9pb2VxX3Byb2Nlc3NlZCB8fCBudW1fbWNjZXFfcHJvY2Vzc2VkKSB7Ci0JCQlpZiAocGJlX2VxLT50b2RvX21jY19jcSkKLQkJCQlxdWV1ZV93b3JrKHBoYmEtPndxLCAmcGJlX2VxLT53b3JrX2Nxcyk7Ci0KLQkJCWlmICgobnVtX21jY2VxX3Byb2Nlc3NlZCkgJiYgKCFudW1faW9lcV9wcm9jZXNzZWQpKQotCQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKLQkJCQkJICAgICAgKG51bV9pb2VxX3Byb2Nlc3NlZCArCi0JCQkJCSAgICAgICBudW1fbWNjZXFfcHJvY2Vzc2VkKSAsIDEsIDEpOwotCQkJZWxzZQotCQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKLQkJCQkJICAgICAgIChudW1faW9lcV9wcm9jZXNzZWQgKwotCQkJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCksIDAsIDEpOwotCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIElSUV9OT05FOwotCX0gZWxzZSB7Ci0JCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3FbMF07Ci0JCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KLQkJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQotCQkJaWYgKCgoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwKLQkJCSAgICAgcmVzb3VyY2VfaWQpIC8gMzJdICYKLQkJCSAgICAgRVFFX1JFU0lEX01BU0spID4+IDE2KSAhPSBjcS0+aWQpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gdHJ1ZTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJfSBlbHNlIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCQlwYmVfZXEtPnRvZG9fY3EgPSB0cnVlOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQl9Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQorCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKKwkJaWYgKCgoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwKKwkJICAgICByZXNvdXJjZV9pZCkgLyAzMl0gJgorCQkgICAgIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgPT0gbWNjLT5pZCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQludW1fbWNjZXFfcHJvY2Vzc2VkKys7CisJCX0gZWxzZSB7CisJCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQorCQkJCWJsa19pb3BvbGxfc2NoZWQoJnBiZV9lcS0+aW9wb2xsKTsKIAkJCW51bV9pb2VxX3Byb2Nlc3NlZCsrOwogCQl9Ci0JCWlmIChwYmVfZXEtPnRvZG9fY3EgfHwgcGJlX2VxLT50b2RvX21jY19jcSkKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CisJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKKwkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKKwl9CisJaWYgKG51bV9pb2VxX3Byb2Nlc3NlZCB8fCBudW1fbWNjZXFfcHJvY2Vzc2VkKSB7CisJCWlmIChwYmVfZXEtPnRvZG9fbWNjX2NxKQogCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+d29ya19jcXMpOwogCi0JCWlmIChudW1faW9lcV9wcm9jZXNzZWQpIHsKKwkJaWYgKChudW1fbWNjZXFfcHJvY2Vzc2VkKSAmJiAoIW51bV9pb2VxX3Byb2Nlc3NlZCkpCiAJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsCi0JCQkJICAgICAgIG51bV9pb2VxX3Byb2Nlc3NlZCwgMSwgMSk7Ci0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIElSUV9OT05FOwotCX0KKwkJCQkgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKKwkJCQkgICAgICAgbnVtX21jY2VxX3Byb2Nlc3NlZCkgLCAxLCAxKTsKKwkJZWxzZQorCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLAorCQkJCSAgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKKwkJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCksIDAsIDEpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UKKwkJcmV0dXJuIElSUV9OT05FOwogfQogCiBzdGF0aWMgaW50IGJlaXNjc2lfaW5pdF9pcnFzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKQEAgLTEwOTMsMTUgKzEwNjgsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBod2lfcmluZ19jcV9kYihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCit2b2lkIGh3aV9yaW5nX2NxX2RiKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKIAkJCSAgIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IG51bV9wcm9jZXNzZWQsCiAJCQkgICB1bnNpZ25lZCBjaGFyIHJlYXJtLCB1bnNpZ25lZCBjaGFyIGV2ZW50KQogewogCXUzMiB2YWwgPSAwOwotCXZhbCB8PSBpZCAmIERCX0NRX1JJTkdfSURfTUFTSzsKKwogCWlmIChyZWFybSkKIAkJdmFsIHw9IDEgPDwgREJfQ1FfUkVBUk1fU0hJRlQ7CisKIAl2YWwgfD0gbnVtX3Byb2Nlc3NlZCA8PCBEQl9DUV9OVU1fUE9QUEVEX1NISUZUOworCisJLyogU2V0dGluZyBsb3dlciBvcmRlciBDUV9JRCBCaXRzICovCisJdmFsIHw9IChpZCAmIERCX0NRX1JJTkdfSURfTE9XX01BU0spOworCisJLyogU2V0dGluZyBIaWdoZXIgb3JkZXIgQ1FfSUQgQml0cyAqLworCXZhbCB8PSAoKChpZCA+PiBEQl9DUV9ISUdIX0ZFSUxEX1NISUZUKSAmCisJCSAgREJfQ1FfUklOR19JRF9ISUdIX01BU0spCisJCSAgPDwgREJfQ1FfSElHSF9TRVRfU0hJRlQpOworCiAJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOwogfQogCkBAIC0xMTUwLDkgKzExMzUsOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKXBwZHUsIHBidWZmZXIsIGJ1Zl9sZW4pOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM0Miw4ICsxMzI3LDEwIEBACiAJcmVzaWQgPSBjc29sX2NxZS0+cmVzX2NudDsKIAogCWlmICghdGFzay0+c2MpIHsKLQkJaWYgKGlvX3Rhc2stPnNjc2lfY21uZCkKKwkJaWYgKGlvX3Rhc2stPnNjc2lfY21uZCkgewogCQkJc2NzaV9kbWFfdW5tYXAoaW9fdGFzay0+c2NzaV9jbW5kKTsKKwkJCWlvX3Rhc2stPnNjc2lfY21uZCA9IE5VTEw7CisJCX0KIAogCQlyZXR1cm47CiAJfQpAQCAtMTM4MCw2ICsxMzY3LDcgQEAKIAkJY29ubi0+cnhkYXRhX29jdGV0cyArPSByZXNpZDsKIHVubWFwOgogCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJaW9fdGFzay0+c2NzaV9jbW5kID0gTlVMTDsKIAlpc2NzaV9jb21wbGV0ZV9zY3NpX3Rhc2sodGFzaywgZXhwX2NtZHNuLCBtYXhfY21kc24pOwogfQogCkBAIC0xNTY4LDcgKzE1NTYsNyBAQAogCXB3cmIgPSBwd3JiX2hhbmRsZS0+cHdyYjsKIAl0eXBlID0gKChzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICopdGFzay0+ZGRfZGF0YSktPndyYl90eXBlOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBIV0hfVFlQRV9JTzoKIAljYXNlIEhXSF9UWVBFX0lPX1JEOgpAQCAtMTYwNyw3ICsxNTk1LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqaHdpX2dldF9hc3luY19idXN5X2xpc3Qoc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dApAQCAtNDM2MCwxMiArNDM0OCwxNiBAQAogCQlnb3RvIGJvb3RfZnJlZW1lbTsKIAl9CiAKLQlyZXQgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBub25lbWJfY21kLnZhKTsKKwlyZXQgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCAmbm9uZW1iX2NtZCk7CiAJaWYgKHJldCkgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKIAkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfQ09ORklHLAogCQkJICAgICJCTV8lZCA6IGJlaXNjc2lfZ2V0X3Nlc3Npb25faW5mbyBGYWlsZWQiKTsKLQkJZ290byBib290X2ZyZWVtZW07CisKKwkJaWYgKHJldCAhPSAtRUJVU1kpCisJCQlnb3RvIGJvb3RfZnJlZW1lbTsKKwkJZWxzZQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlzZXNzaW9uX3Jlc3AgPSBub25lbWJfY21kLnZhIDsKQEAgLTQ2MjUsNiArNDYxNywxMSBAQAogCQkJc3Bpbl91bmxvY2soJnBoYmEtPmlvX3NnbF9sb2NrKTsKIAkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0gTlVMTDsKIAkJfQorCisJCWlmIChpb190YXNrLT5zY3NpX2NtbmQpIHsKKwkJCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJCQlpb190YXNrLT5zY3NpX2NtbmQgPSBOVUxMOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCFiZWlzY3NpX2Nvbm4tPmxvZ2luX2luX3Byb2dyZXNzKQogCQkJYmVpc2NzaV9mcmVlX21nbXRfdGFza19oYW5kbGVzKGJlaXNjc2lfY29ubiwgdGFzayk7CkBAIC00NjQ2LDkgKzQ2NDMsOSBAQAogCSAqIGxvZ2luL3N0YXJ0dXAgcmVsYXRlZCB0YXNrcy4KIAkgKi8KIAliZWlzY3NpX2Nvbm4tPmxvZ2luX2luX3Byb2dyZXNzID0gMDsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAliZWlzY3NpX2NsZWFudXBfdGFzayh0YXNrKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAKIAlwd3JiX2hhbmRsZSA9IGFsbG9jX3dyYl9oYW5kbGUocGhiYSwgYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkKTsKIApAQCAtNTIxNiwxMSArNTIxMywxMCBAQAogCQl9CiAJcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOwogCi0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkKLQkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKKwkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7CisJfQogCiAJaWYgKHVubG9hZF9zdGF0ZSA9PSBCRUlTQ1NJX0NMRUFOX1VOTE9BRCkgewogCQlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7CkBAIC01MjczLDYgKzUyNjksOCBAQAogCQlyZXR1cm47CiAJfQogCisJcGhiYS0+c3RhdGUgPSBCRV9BREFQVEVSX1NUQVRFX1NIVVRET1dOOworCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihwaGJhLT5zaG9zdCwgYmUyaXNjc2lfZmFpbF9zZXNzaW9uKTsKIAliZWlzY3NpX3F1aWVzY2UocGhiYSwgQkVJU0NTSV9DTEVBTl9VTkxPQUQpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwogfQpAQCAtNTQyOSwzMiArNTQyNywxOCBAQAogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwogCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKIAotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJYmxrX2lvcG9sbF9pbml0KCZwYmVfZXEtPmlvcG9sbCwgYmVfaW9wb2xsX2J1ZGdldCwKLQkJCQkJYmVfaW9wb2xsKTsKLQkJCWJsa19pb3BvbGxfZW5hYmxlKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCX0KLQotCQlpID0gKHBoYmEtPm1zaXhfZW5hYmxlZCkgPyBpIDogMDsKLQkJLyogV29yayBpdGVtIGZvciBNQ0MgaGFuZGxpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgewogCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLCBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkgewotCQkJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLAotCQkJCQkgIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxWzBdOwotCQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLAotCQkJCSAgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwotCQl9CisJCWJsa19pb3BvbGxfaW5pdCgmcGJlX2VxLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsCisJCQkJYmVfaW9wb2xsKTsKKwkJYmxrX2lvcG9sbF9lbmFibGUoJnBiZV9lcS0+aW9wb2xsKTsKIAl9CiAKKwlpID0gKHBoYmEtPm1zaXhfZW5hYmxlZCkgPyBpIDogMDsKKwkvKiBXb3JrIGl0ZW0gZm9yIE1DQyBoYW5kbGluZyAqLworCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOworCiAJcmV0ID0gYmVpc2NzaV9pbml0X2lycXMocGhiYSk7CiAJaWYgKHJldCA8IDApIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCkBAIC01NTk0LDYgKzU1NzgsOCBAQAogCQlwaGJhLT5jdHJsLm1jY190YWdbaV0gPSBpICsgMTsKIAkJcGhiYS0+Y3RybC5tY2NfbnVtdGFnW2kgKyAxXSA9IDA7CiAJCXBoYmEtPmN0cmwubWNjX3RhZ19hdmFpbGFibGUrKzsKKwkJbWVtc2V0KCZwaGJhLT5jdHJsLnB0YWdfc3RhdGVbaV0udGFnX21lbV9zdGF0ZSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmVpc2NzaV9tY2NfdGFnX3N0YXRlKSk7CiAJfQogCiAJcGhiYS0+Y3RybC5tY2NfYWxsb2NfaW5kZXggPSBwaGJhLT5jdHJsLm1jY19mcmVlX2luZGV4ID0gMDsKQEAgLTU2MTQsMzIgKzU2MDAsMTggQEAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJCWJsa19pb3BvbGxfaW5pdCgmcGJlX2VxLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsCi0JCQkJCWJlX2lvcG9sbCk7Ci0JCQlibGtfaW9wb2xsX2VuYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwotCQl9Ci0KLQkJaSA9IChwaGJhLT5tc2l4X2VuYWJsZWQpID8gaSA6IDA7Ci0JCS8qIFdvcmsgaXRlbSBmb3IgTUNDIGhhbmRsaW5nICovCisJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKIAkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwotCX0gZWxzZSB7Ci0JCWlmIChwaGJhLT5tc2l4X2VuYWJsZWQpIHsKLQkJCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykgewotCQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywKLQkJCQkJICBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbMF07Ci0JCQkJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLAotCQkJCQkgIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQkJCX0KKwkJYmxrX2lvcG9sbF9pbml0KCZwYmVfZXEtPmlvcG9sbCwgYmVfaW9wb2xsX2J1ZGdldCwKKwkJCQliZV9pb3BvbGwpOworCQlibGtfaW9wb2xsX2VuYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwogCX0KIAorCWkgPSAocGhiYS0+bXNpeF9lbmFibGVkKSA/IGkgOiAwOworCS8qIFdvcmsgaXRlbSBmb3IgTUNDIGhhbmRsaW5nICovCisJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07CisJSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLCBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7CisKIAlyZXQgPSBiZWlzY3NpX2luaXRfaXJxcyhwaGJhKTsKIAlpZiAocmV0IDwgMCkgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKQEAgLTU2NjgsMTEgKzU2NDAsMTAgQEAKIAogZnJlZV9ibGtlbmJsZDoKIAlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkKLQkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKKwkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7CisJfQogZnJlZV90d3E6CiAJYmVpc2NzaV9jbGVhbl9wb3J0KHBoYmEpOwogCWJlaXNjc2lfZnJlZV9tZW0ocGhiYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaAppbmRleCAzMWZhMjdiLi45MzgwYjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJCSJiZTJpc2NzaSIKLSNkZWZpbmUgQlVJTERfU1RSCQkiMTAuMC42NTkuMCIKKyNkZWZpbmUgQlVJTERfU1RSCQkiMTAuMi4xMjUuMCIKICNkZWZpbmUgQkVfTkFNRQkJCSJFbXVsZXggT25lQ29ubmVjdCIgXAogCQkJCSJPcGVuLWlTQ1NJIERyaXZlciB2ZXJzaW9uIiBCVUlMRF9TVFIKICNkZWZpbmUgRFJWX0RFU0MJCUJFX05BTUUgIiAiICJEcml2ZXIiCkBAIC05Nyw5ICs5NywxNCBAQAogCiAjZGVmaW5lIElOVkFMSURfU0VTU19IQU5ETEUJMHhGRkZGRkZGRgogCisvKioKKyAqIEFkYXB0ZXIgU3RhdGVzCisgKiovCiAjZGVmaW5lIEJFX0FEQVBURVJfTElOS19VUAkweDAwMQogI2RlZmluZSBCRV9BREFQVEVSX0xJTktfRE9XTgkweDAwMgogI2RlZmluZSBCRV9BREFQVEVSX1BDSV9FUlIJMHgwMDQKKyNkZWZpbmUgQkVfQURBUFRFUl9TVEFURV9TSFVURE9XTgkweDAwOAorCiAKICNkZWZpbmUgQkVJU0NTSV9DTEVBTl9VTkxPQUQJMHgwMQogI2RlZmluZSBCRUlTQ1NJX0VFSF9VTkxPQUQJMHgwMgpAQCAtMTM1LDExICsxNDAsMTUgQEAKICNkZWZpbmUgREJfUlhVTFAwX09GRlNFVCAweEEwCiAvKioqKioqKioqIEV2ZW50IFEgZG9vciBiZWxsICoqKioqKioqKioqKiovCiAjZGVmaW5lIERCX0VRX09GRlNFVAkJCURCX0NRX09GRlNFVAotI2RlZmluZSBEQl9FUV9SSU5HX0lEX01BU0sJCTB4MUZGCS8qIGJpdHMgMCAtIDggKi8KKyNkZWZpbmUgREJfRVFfUklOR19JRF9MT1dfTUFTSwkJMHgxRkYJLyogYml0cyAwIC0gOCAqLwogLyogQ2xlYXIgdGhlIGludGVycnVwdCBmb3IgdGhpcyBlcSAqLwogI2RlZmluZSBEQl9FUV9DTFJfU0hJRlQJCQkoOSkJLyogYml0IDkgKi8KIC8qIE11c3QgYmUgMSAqLwogI2RlZmluZSBEQl9FUV9FVk5UX1NISUZUCQkoMTApCS8qIGJpdCAxMCAqLworLyogSGlnaGVyIE9yZGVyIEVRX0lEIGJpdCAqLworI2RlZmluZSBEQl9FUV9SSU5HX0lEX0hJR0hfTUFTSwkweDFGIC8qIGJpdHMgMTEgLSAxNSAqLworI2RlZmluZSBEQl9FUV9ISUdIX1NFVF9TSElGVAkxMQorI2RlZmluZSBEQl9FUV9ISUdIX0ZFSUxEX1NISUZUCTkKIC8qIE51bWJlciBvZiBldmVudCBlbnRyaWVzIHByb2Nlc3NlZCAqLwogI2RlZmluZSBEQl9FUV9OVU1fUE9QUEVEX1NISUZUCQkoMTYpCS8qIGJpdHMgMTYgLSAyOCAqLwogLyogUmVhcm0gYml0ICovCkBAIC0xNDcsNyArMTU2LDEyIEBACiAKIC8qKioqKioqKiogQ29tcGwgUSBkb29yIGJlbGwgKioqKioqKioqKioqKi8KICNkZWZpbmUgREJfQ1FfT0ZGU0VUCQkJMHgxMjAKLSNkZWZpbmUgREJfQ1FfUklOR19JRF9NQVNLCQkweDNGRgkvKiBiaXRzIDAgLSA5ICovCisjZGVmaW5lIERCX0NRX1JJTkdfSURfTE9XX01BU0sJCTB4M0ZGCS8qIGJpdHMgMCAtIDkgKi8KKy8qIEhpZ2hlciBPcmRlciBDUV9JRCBiaXQgKi8KKyNkZWZpbmUgREJfQ1FfUklOR19JRF9ISUdIX01BU0sJMHgxRiAvKiBiaXRzIDExIC0gMTUgKi8KKyNkZWZpbmUgREJfQ1FfSElHSF9TRVRfU0hJRlQJMTEKKyNkZWZpbmUgREJfQ1FfSElHSF9GRUlMRF9TSElGVAkxMAorCiAvKiBOdW1iZXIgb2YgZXZlbnQgZW50cmllcyBwcm9jZXNzZWQgKi8KICNkZWZpbmUgREJfQ1FfTlVNX1BPUFBFRF9TSElGVAkJKDE2KQkvKiBiaXRzIDE2IC0gMjggKi8KIC8qIFJlYXJtIGJpdCAqLwpAQCAtODIxLDYgKzgzNSw5IEBACiB2b2lkIGJlaXNjc2lfZnJlZV9tZ210X3Rhc2tfaGFuZGxlcyhzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCiAJCQkJICAgICBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayk7CiAKK3ZvaWQgaHdpX3JpbmdfY3FfZGIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkgICAgIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IG51bV9wcm9jZXNzZWQsCisJCSAgICAgdW5zaWduZWQgY2hhciByZWFybSwgdW5zaWduZWQgY2hhciBldmVudCk7CiBzdGF0aWMgaW5saW5lIGJvb2wgYmVpc2NzaV9lcnJvcihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJcmV0dXJuIHBoYmEtPnVlX2RldGVjdGVkIHx8IHBoYmEtPmZ3X3RpbWVvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYwppbmRleCBiMmZjYWM3Li4wODhiZGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMKQEAgLTgyOCwyMiArODI4LDI1IEBACiAJYmVfbWNjX25vdGlmeShwaGJhKTsKIAlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAotCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC0+dmEpOwotCWlmIChyYykgewotCQkvKiBDaGVjayBpZiB0aGUgSU9DVEwgbmVlZHMgdG8gYmUgcmUtaXNzdWVkICovCi0JCWlmIChyYyA9PSAtRUFHQUlOKQotCQkJcmV0dXJuIHJjOwotCi0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCi0JCQkgICAgIkJHXyVkIDogbWdtdF9leGVjX25vbmVtYl9jbWQgRmFpbGVkIHN0YXR1c1xuIik7Ci0KLQkJZ290byBmcmVlX2NtZDsKLQl9CisJcmMgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBub25lbWJfY21kKTsKIAogCWlmIChyZXNwX2J1ZikKIAkJbWVtY3B5KHJlc3BfYnVmLCBub25lbWJfY21kLT52YSwgcmVzcF9idWZfbGVuKTsKIAorCWlmIChyYykgeworCQkvKiBDaGVjayBpZiB0aGUgTUJYIENtZCBuZWVkcyB0byBiZSByZS1pc3N1ZWQgKi8KKwkJaWYgKHJjID09IC1FQUdBSU4pCisJCQlyZXR1cm4gcmM7CisKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAorCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCisJCQkgICAgIkJHXyVkIDogbWdtdF9leGVjX25vbmVtYl9jbWQgRmFpbGVkIHN0YXR1c1xuIik7CisKKwkJaWYgKHJjICE9IC1FQlVTWSkKKwkJCWdvdG8gZnJlZV9jbWQ7CisJCWVsc2UKKwkJCXJldHVybiByYzsKKwl9CiBmcmVlX2NtZDoKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIG5vbmVtYl9jbWQtPnNpemUsCiAJCQkgICAgbm9uZW1iX2NtZC0+dmEsIG5vbmVtYl9jbWQtPmRtYSk7CkBAIC0xMzQ4LDcgKzEzNTEsNiBAQAogewogCWludCByYzsKIAl1bnNpZ25lZCBpbnQgdGFnOwotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSBOVUxMOwogCiAJdGFnID0gYmVfY21kX3NldF92bGFuKHBoYmEsIHZsYW5fdGFnKTsKIAlpZiAoIXRhZykgewpAQCAtMTM1OCw3ICsxMzYwLDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsICZ3cmIsIE5VTEwpOworCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJICAgIChCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKaW5kZXggNjUxODBlMS4uMzE1ZDZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKQEAgLTM4NzgsNyArMzg3OCw3IEBACiAJCWJmYV90cmMoc2ZwLCBzZnAtPmRhdGFfdmFsaWQpOwogCQlpZiAoc2ZwLT5kYXRhX3ZhbGlkKSB7CiAJCQl1MzIJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2ZwX21lbV9zKTsKLQkJCXU4ICpkZXMgPSAodTggKikgJihzZnAtPnNmcG1lbS0+c3JsaWRfYmFzZSk7CisJCQl1OCAqZGVzID0gKHU4ICopICYoc2ZwLT5zZnBtZW0pOwogCQkJbWVtY3B5KGRlcywgc2ZwLT5kYnVmX2t2YSwgc2l6ZSk7CiAJCX0KIAkJLyoKQEAgLTY4NTEsNyArNjg1MSw3IEBACiBiZmFfZmxhc2hfc3RhdHVzX3JlYWQodm9pZCBfX2lvbWVtICpwY2lfYmFyKQogewogCXVuaW9uIGJmYV9mbGFzaF9kZXZfc3RhdHVzX3JlZ191CWRldl9zdGF0dXM7Ci0JdTMyCQkJCXN0YXR1czsKKwlpbnQJCQkJc3RhdHVzOwogCXUzMgkJCXJldF9zdGF0dXM7CiAJaW50CQkJCWk7CiAKQEAgLTY4OTksNyArNjg5OSw3IEBACiBiZmFfZmxhc2hfcmVhZF9zdGFydCh2b2lkIF9faW9tZW0gKnBjaV9iYXIsIHUzMiBvZmZzZXQsIHUzMiBsZW4sCiAJCQkgY2hhciAqYnVmKQogewotCXUzMiBzdGF0dXM7CisJaW50IHN0YXR1czsKIAogCS8qCiAJICogbGVuIG11c3QgYmUgbXV0aXBsZSBvZiA0IGFuZCBub3QgZXhjZWVkaW5nIGZpZm8gc2l6ZQpAQCAtNzAwNiw3ICs3MDA2LDcgQEAKIAl3aGlsZSAoIWJmYV9yYXdfc2VtX2dldChiYXIpKSB7CiAJCWlmICgtLW4gPD0gMCkKIAkJCXJldHVybiBCRkFfU1RBVFVTX0JBREZMQVNIOwotCQl1ZGVsYXkoMTAwMDApOworCQltZGVsYXkoMTApOwogCX0KIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KQEAgLTcwMjEsNyArNzAyMSw4IEBACiBiZmFfZmxhc2hfcmF3X3JlYWQodm9pZCBfX2lvbWVtICpwY2lfYmFyLCB1MzIgb2Zmc2V0LCBjaGFyICpidWYsCiAJCSAgICAgICB1MzIgbGVuKQogewotCXUzMiBuLCBzdGF0dXM7CisJdTMyIG47CisJaW50IHN0YXR1czsKIAl1MzIgb2ZmLCBsLCBzLCByZXNpZHVlLCBmaWZvX3N6OwogCiAJcmVzaWR1ZSA9IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYwppbmRleCAxNTdmNjA0Li44OTk0ZmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCkBAIC0yMzA0LDggKzIzMDQsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAotCWlmIChiZmFfZmNwb3J0X2lzX2Rwb3J0KCZiZmFkLT5iZmEpKQorCWlmIChiZmFfZmNwb3J0X2lzX2Rwb3J0KCZiZmFkLT5iZmEpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gQkZBX1NUQVRVU19EUE9SVF9FUlI7CisJfQogCiAJaWYgKChmY3BvcnQtPmNmZy50b3BvbG9neSA9PSBCRkFfUE9SVF9UT1BPTE9HWV9MT09QKSB8fAogCQkoZmNwb3J0LT50b3BvbG9neSA9PSBCRkFfUE9SVF9UT1BPTE9HWV9MT09QKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKaW5kZXggOTk2N2Y5Yy4uZjA2NzMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKQEAgLTczLDkgKzczLDE0IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIEJGSV9JT0lNX1NUU19BQk9SVEVEOgogCWNhc2UgQkZJX0lPSU1fU1RTX1RJTUVET1VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJY21uZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChob3N0X3N0YXR1cywgMCk7CisJCWJyZWFrOwogCWNhc2UgQkZJX0lPSU1fU1RTX1BBVEhUT1Y6CisJCWhvc3Rfc3RhdHVzID0gRElEX1RSQU5TUE9SVF9ESVNSVVBURUQ7CisJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoaG9zdF9zdGF0dXMsIDApOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKIAkJY21uZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChob3N0X3N0YXR1cywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaAppbmRleCAxZWJmM2ZiLi42YTk3NjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKQEAgLTY0LDcgKzY0LDcgQEAKICNpbmNsdWRlICJibngyZmNfY29uc3RhbnRzLmgiCiAKICNkZWZpbmUgQk5YMkZDX05BTUUJCSJibngyZmMiCi0jZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMi40LjEiCisjZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMi40LjIiCiAKICNkZWZpbmUgUEZYCQkJImJueDJmYzogIgogCkBAIC0zNjcsNiArMzY3LDcgQEAKIAlhdG9taWNfdCBudW1fYWN0aXZlX2lvczsKIAl1MzIgZmx1c2hfaW5fcHJvZzsKIAl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKKwl1bnNpZ25lZCBsb25nIHJldHJ5X2RlbGF5X3RpbWVzdGFtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfdGFza19saXN0OwogCXN0cnVjdCBibngyZmNfY21kICpwZW5kaW5nX3F1ZXVlW0JOWDJGQ19TUV9XUUVTX01BWCsxXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9jbWRfcXVldWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKaW5kZXggOWI5NDg1MC4uNjI4N2Y2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueDJmYyIKICNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCUJOWDJGQ19WRVJTSU9OCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiU2VwIDE3LCAyMDEzIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkRlYyAxMSwgMjAxMyIKIAogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQpAQCAtODUwLDYgKzg1MCw5IEBACiAJCQkJX19ibngyZmNfZGVzdHJveShpbnRlcmZhY2UpOwogCQl9CiAJCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKKworCQkvKiBFbnN1cmUgQUxMIGRlc3Ryb3kgd29yayBoYXMgYmVlbiBjb21wbGV0ZWQgYmVmb3JlIHJldHVybiAqLworCQlmbHVzaF93b3JrcXVldWUoYm54MmZjX3dxKTsKIAkJcmV0dXJuOwogCiAJZGVmYXVsdDoKQEAgLTIzODksNiArMjM5Miw5IEBACiAJCQlfX2JueDJmY19kZXN0cm95KGludGVyZmFjZSk7CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCisJLyogRW5zdXJlIEFMTCBkZXN0cm95IHdvcmsgaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZSByZXR1cm4gKi8KKwlmbHVzaF93b3JrcXVldWUoYm54MmZjX3dxKTsKKwogCWJueDJmY191bHBfc3RvcChoYmEpOwogCS8qIHVucmVnaXN0ZXIgY25pYyBkZXZpY2UgKi8KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19DTklDX1JFR0lTVEVSRUQsICZoYmEtPnJlZ193aXRoX2NuaWMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKaW5kZXggZWQ4ODA4OS4uMzJhNWUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCkBAIC01OTQsMTMgKzU5NCwxMyBAQAogCQltcF9yZXEtPm1wX3Jlc3BfYmQgPSBOVUxMOwogCX0KIAlpZiAobXBfcmVxLT5yZXFfYnVmKSB7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkgICAgIG1wX3JlcS0+cmVxX2J1ZiwKIAkJCQkgICAgIG1wX3JlcS0+cmVxX2J1Zl9kbWEpOwogCQltcF9yZXEtPnJlcV9idWYgPSBOVUxMOwogCX0KIAlpZiAobXBfcmVxLT5yZXNwX2J1ZikgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICAgICBtcF9yZXEtPnJlc3BfYnVmLAogCQkJCSAgICAgbXBfcmVxLT5yZXNwX2J1Zl9kbWEpOwogCQltcF9yZXEtPnJlc3BfYnVmID0gTlVMTDsKQEAgLTYyMiw3ICs2MjIsNyBAQAogCiAJbXBfcmVxLT5yZXFfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY3BfY21uZCk7CiAJaW9fcmVxLT5kYXRhX3hmZXJfbGVuID0gbXBfcmVxLT5yZXFfbGVuOwotCW1wX3JlcS0+cmVxX2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCW1wX3JlcS0+cmVxX2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCSAgICAgJm1wX3JlcS0+cmVxX2J1Zl9kbWEsCiAJCQkJCSAgICAgR0ZQX0FUT01JQyk7CiAJaWYgKCFtcF9yZXEtPnJlcV9idWYpIHsKQEAgLTYzMSw3ICs2MzEsNyBAQAogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCW1wX3JlcS0+cmVzcF9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwltcF9yZXEtPnJlc3BfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkJICAgICAgJm1wX3JlcS0+cmVzcF9idWZfZG1hLAogCQkJCQkgICAgICBHRlBfQVRPTUlDKTsKIAlpZiAoIW1wX3JlcS0+cmVzcF9idWYpIHsKQEAgLTYzOSw4ICs2MzksOCBAQAogCQlibngyZmNfZnJlZV9tcF9yZXNjKGlvX3JlcSk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQotCW1lbXNldChtcF9yZXEtPnJlcV9idWYsIDAsIFBBR0VfU0laRSk7Ci0JbWVtc2V0KG1wX3JlcS0+cmVzcF9idWYsIDAsIFBBR0VfU0laRSk7CisJbWVtc2V0KG1wX3JlcS0+cmVxX2J1ZiwgMCwgQ05JQ19QQUdFX1NJWkUpOworCW1lbXNldChtcF9yZXEtPnJlc3BfYnVmLCAwLCBDTklDX1BBR0VfU0laRSk7CiAKIAkvKiBBbGxvY2F0ZSBhbmQgbWFwIG1wX3JlcV9iZCBhbmQgbXBfcmVzcF9iZCAqLwogCXN6ID0gc2l6ZW9mKHN0cnVjdCBmY29lX2JkX2N0eCk7CkBAIC02NjUsNyArNjY1LDcgQEAKIAltcF9yZXFfYmQgPSBtcF9yZXEtPm1wX3JlcV9iZDsKIAltcF9yZXFfYmQtPmJ1Zl9hZGRyX2xvID0gKHUzMilhZGRyICYgMHhmZmZmZmZmZjsKIAltcF9yZXFfYmQtPmJ1Zl9hZGRyX2hpID0gKHUzMikoKHU2NClhZGRyID4+IDMyKTsKLQltcF9yZXFfYmQtPmJ1Zl9sZW4gPSBQQUdFX1NJWkU7CisJbXBfcmVxX2JkLT5idWZfbGVuID0gQ05JQ19QQUdFX1NJWkU7CiAJbXBfcmVxX2JkLT5mbGFncyA9IDA7CiAKIAkvKgpAQCAtNjc3LDcgKzY3Nyw3IEBACiAJYWRkciA9IG1wX3JlcS0+cmVzcF9idWZfZG1hOwogCW1wX3Jlc3BfYmQtPmJ1Zl9hZGRyX2xvID0gKHUzMilhZGRyICYgMHhmZmZmZmZmZjsKIAltcF9yZXNwX2JkLT5idWZfYWRkcl9oaSA9ICh1MzIpKCh1NjQpYWRkciA+PiAzMik7Ci0JbXBfcmVzcF9iZC0+YnVmX2xlbiA9IFBBR0VfU0laRTsKKwltcF9yZXNwX2JkLT5idWZfbGVuID0gQ05JQ19QQUdFX1NJWkU7CiAJbXBfcmVzcF9iZC0+ZmxhZ3MgPSAwOwogCiAJcmV0dXJuIFNVQ0NFU1M7CkBAIC0xODcxLDcgKzE4NzEsMTUgQEAKIAkJcmMgPSBTQ1NJX01MUVVFVUVfVEFSR0VUX0JVU1k7CiAJCWdvdG8gZXhpdF9xY21kOwogCX0KLQorCWlmICh0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCkpIHsKKwkJCXRndC0+cmV0cnlfZGVsYXlfdGltZXN0YW1wID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHJldHJ5X2RlbGF5IHRpbWVyIGlzIGFjdGl2ZSwgZmxvdyBvZmYgdGhlIE1MICovCisJCQlyYyA9IFNDU0lfTUxRVUVVRV9UQVJHRVRfQlVTWTsKKwkJCWdvdG8gZXhpdF9xY21kOworCQl9CisJfQogCWlvX3JlcSA9IGJueDJmY19jbWRfYWxsb2ModGd0KTsKIAlpZiAoIWlvX3JlcSkgewogCQlyYyA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CkBAIC0xOTYxLDYgKzE5NjksMTUgQEAKIAkJCQkgIiBmY3BfcmVzaWQgPSAweCV4XG4iLAogCQkJCWlvX3JlcS0+Y2RiX3N0YXR1cywgaW9fcmVxLT5mY3BfcmVzaWQpOwogCQkJc2NfY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IGlvX3JlcS0+Y2RiX3N0YXR1czsKKworCQkJaWYgKGlvX3JlcS0+Y2RiX3N0YXR1cyA9PSBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMIHx8CisJCQkgICAgaW9fcmVxLT5jZGJfc3RhdHVzID09IFNBTV9TVEFUX0JVU1kpIHsKKwkJCQkvKiBTZXQgdGhlIGppZmZpZXMgKyByZXRyeV9kZWxheV90aW1lciAqIDEwMG1zCisJCQkJICAgZm9yIHRoZSBycG9ydC90Z3QgKi8KKwkJCQl0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCA9IGppZmZpZXMgKworCQkJCQlmY3BfcnNwLT5yZXRyeV9kZWxheV90aW1lciAqIEhaIC8gMTA7CisJCQl9CisKIAkJfQogCQlpZiAoaW9fcmVxLT5mY3BfcmVzaWQpCiAJCQlzY3NpX3NldF9yZXNpZChzY19jbWQsIGlvX3JlcS0+ZmNwX3Jlc2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKaW5kZXggNGQ5MzE3Ny4uNjg3MGNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKQEAgLTM4Niw2ICszODYsNyBAQAogCXRndC0+cnFfcHJvZF9pZHggPSAweDgwMDA7CiAJdGd0LT5ycV9jb25zX2lkeCA9IDA7CiAJYXRvbWljX3NldCgmdGd0LT5udW1fYWN0aXZlX2lvcywgMCk7CisJdGd0LT5yZXRyeV9kZWxheV90aW1lc3RhbXAgPSAwOwogCiAJaWYgKHJkYXRhLT5mbGFncyAmIEZDX1JQX0ZMQUdTX1JFVFJZICYmCiAJICAgIHJkYXRhLT5pZHMucm9sZXMgJiBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQgJiYKQEAgLTY3Myw3ICs2NzQsOCBAQAogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBTUSAqLwogCXRndC0+c3FfbWVtX3NpemUgPSB0Z3QtPm1heF9zcWVzICogQk5YMkZDX1NRX1dRRV9TSVpFOwotCXRndC0+c3FfbWVtX3NpemUgPSAodGd0LT5zcV9tZW1fc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJdGd0LT5zcV9tZW1fc2l6ZSA9ICh0Z3QtPnNxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYKKwkJCSAgIENOSUNfUEFHRV9NQVNLOwogCiAJdGd0LT5zcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5zcV9tZW1fc2l6ZSwKIAkJCQkgICAgICZ0Z3QtPnNxX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC02ODYsNyArNjg4LDggQEAKIAogCS8qIEFsbG9jYXRlIGFuZCBtYXAgQ1EgKi8KIAl0Z3QtPmNxX21lbV9zaXplID0gdGd0LT5tYXhfY3FlcyAqIEJOWDJGQ19DUV9XUUVfU0laRTsKLQl0Z3QtPmNxX21lbV9zaXplID0gKHRndC0+Y3FfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCXRndC0+Y3FfbWVtX3NpemUgPSAodGd0LT5jcV9tZW1fc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmCisJCQkgICBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+Y3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+Y3FfbWVtX3NpemUsCiAJCQkJICAgICAmdGd0LT5jcV9kbWEsIEdGUF9LRVJORUwpOwpAQCAtNjk5LDcgKzcwMiw4IEBACiAKIAkvKiBBbGxvY2F0ZSBhbmQgbWFwIFJRIGFuZCBSUSBQQkwgKi8KIAl0Z3QtPnJxX21lbV9zaXplID0gdGd0LT5tYXhfcnFlcyAqIEJOWDJGQ19SUV9XUUVfU0laRTsKLQl0Z3QtPnJxX21lbV9zaXplID0gKHRndC0+cnFfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCXRndC0+cnFfbWVtX3NpemUgPSAodGd0LT5ycV9tZW1fc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmCisJCQkgICBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+cnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+cnFfbWVtX3NpemUsCiAJCQkJCSZ0Z3QtPnJxX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC03MTAsOCArNzE0LDkgQEAKIAl9CiAJbWVtc2V0KHRndC0+cnEsIDAsIHRndC0+cnFfbWVtX3NpemUpOwogCi0JdGd0LT5ycV9wYmxfc2l6ZSA9ICh0Z3QtPnJxX21lbV9zaXplIC8gUEFHRV9TSVpFKSAqIHNpemVvZih2b2lkICopOwotCXRndC0+cnFfcGJsX3NpemUgPSAodGd0LT5ycV9wYmxfc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJdGd0LT5ycV9wYmxfc2l6ZSA9ICh0Z3QtPnJxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CisJdGd0LT5ycV9wYmxfc2l6ZSA9ICh0Z3QtPnJxX3BibF9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYKKwkJCSAgIENOSUNfUEFHRV9NQVNLOwogCiAJdGd0LT5ycV9wYmwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+cnFfcGJsX3NpemUsCiAJCQkJCSAmdGd0LT5ycV9wYmxfZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTcyMiw3ICs3MjcsNyBAQAogCX0KIAogCW1lbXNldCh0Z3QtPnJxX3BibCwgMCwgdGd0LT5ycV9wYmxfc2l6ZSk7Ci0JbnVtX3BhZ2VzID0gdGd0LT5ycV9tZW1fc2l6ZSAvIFBBR0VfU0laRTsKKwludW1fcGFnZXMgPSB0Z3QtPnJxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkU7CiAJcGFnZSA9IHRndC0+cnFfZG1hOwogCXBibCA9ICh1MzIgKil0Z3QtPnJxX3BibDsKIApAQCAtNzMxLDEzICs3MzYsMTMgQEAKIAkJcGJsKys7CiAJCSpwYmwgPSAodTMyKSgodTY0KXBhZ2UgPj4gMzIpOwogCQlwYmwrKzsKLQkJcGFnZSArPSBQQUdFX1NJWkU7CisJCXBhZ2UgKz0gQ05JQ19QQUdFX1NJWkU7CiAJfQogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBYRkVSUSAqLwogCXRndC0+eGZlcnFfbWVtX3NpemUgPSB0Z3QtPm1heF9zcWVzICogQk5YMkZDX1hGRVJRX1dRRV9TSVpFOwotCXRndC0+eGZlcnFfbWVtX3NpemUgPSAodGd0LT54ZmVycV9tZW1fc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJgotCQkJICAgICAgIFBBR0VfTUFTSzsKKwl0Z3QtPnhmZXJxX21lbV9zaXplID0gKHRndC0+eGZlcnFfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJgorCQkJICAgICAgIENOSUNfUEFHRV9NQVNLOwogCiAJdGd0LT54ZmVycSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT54ZmVycV9tZW1fc2l6ZSwKIAkJCQkJJnRndC0+eGZlcnFfZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTc1MCw4ICs3NTUsOCBAQAogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBDT05GUSAmIENPTkZRIFBCTCAqLwogCXRndC0+Y29uZnFfbWVtX3NpemUgPSB0Z3QtPm1heF9zcWVzICogQk5YMkZDX0NPTkZRX1dRRV9TSVpFOwotCXRndC0+Y29uZnFfbWVtX3NpemUgPSAodGd0LT5jb25mcV9tZW1fc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJgotCQkJICAgICAgIFBBR0VfTUFTSzsKKwl0Z3QtPmNvbmZxX21lbV9zaXplID0gKHRndC0+Y29uZnFfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJgorCQkJICAgICAgIENOSUNfUEFHRV9NQVNLOwogCiAJdGd0LT5jb25mcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5jb25mcV9tZW1fc2l6ZSwKIAkJCQkJJnRndC0+Y29uZnFfZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTc2Myw5ICs3NjgsOSBAQAogCW1lbXNldCh0Z3QtPmNvbmZxLCAwLCB0Z3QtPmNvbmZxX21lbV9zaXplKTsKIAogCXRndC0+Y29uZnFfcGJsX3NpemUgPQotCQkodGd0LT5jb25mcV9tZW1fc2l6ZSAvIFBBR0VfU0laRSkgKiBzaXplb2Yodm9pZCAqKTsKKwkJKHRndC0+Y29uZnFfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRSkgKiBzaXplb2Yodm9pZCAqKTsKIAl0Z3QtPmNvbmZxX3BibF9zaXplID0KLQkJKHRndC0+Y29uZnFfcGJsX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkodGd0LT5jb25mcV9wYmxfc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmIENOSUNfUEFHRV9NQVNLOwogCiAJdGd0LT5jb25mcV9wYmwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsCiAJCQkJCSAgICB0Z3QtPmNvbmZxX3BibF9zaXplLApAQCAtNzc3LDcgKzc4Miw3IEBACiAJfQogCiAJbWVtc2V0KHRndC0+Y29uZnFfcGJsLCAwLCB0Z3QtPmNvbmZxX3BibF9zaXplKTsKLQludW1fcGFnZXMgPSB0Z3QtPmNvbmZxX21lbV9zaXplIC8gUEFHRV9TSVpFOworCW51bV9wYWdlcyA9IHRndC0+Y29uZnFfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRTsKIAlwYWdlID0gdGd0LT5jb25mcV9kbWE7CiAJcGJsID0gKHUzMiAqKXRndC0+Y29uZnFfcGJsOwogCkBAIC03ODYsNyArNzkxLDcgQEAKIAkJcGJsKys7CiAJCSpwYmwgPSAodTMyKSgodTY0KXBhZ2UgPj4gMzIpOwogCQlwYmwrKzsKLQkJcGFnZSArPSBQQUdFX1NJWkU7CisJCXBhZ2UgKz0gQ05JQ19QQUdFX1NJWkU7CiAJfQogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBDb25uREIgKi8KQEAgLTgwNSw4ICs4MTAsOCBAQAogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBMQ1EgKi8KIAl0Z3QtPmxjcV9tZW1fc2l6ZSA9ICh0Z3QtPm1heF9zcWVzICsgOCkgKiBCTlgyRkNfU1FfV1FFX1NJWkU7Ci0JdGd0LT5sY3FfbWVtX3NpemUgPSAodGd0LT5sY3FfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYKLQkJCSAgICAgUEFHRV9NQVNLOworCXRndC0+bGNxX21lbV9zaXplID0gKHRndC0+bGNxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYKKwkJCSAgICAgQ05JQ19QQUdFX01BU0s7CiAKIAl0Z3QtPmxjcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5sY3FfbWVtX3NpemUsCiAJCQkJICAgICAgJnRndC0+bGNxX2RtYSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKaW5kZXggZTRjZjIzZC4uYjVmZmQyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwpAQCAtNjEsNyArNjEsNyBAQAogCSAqIHlpZWxkIGludGVncmFsIG51bSBvZiBwYWdlIGJ1ZmZlcnMKIAkgKi8KIAkvKiBhZGp1c3QgU1EgKi8KLQludW1fZWxlbWVudHNfcGVyX3BnID0gUEFHRV9TSVpFIC8gQk5YMklfU1FfV1FFX1NJWkU7CisJbnVtX2VsZW1lbnRzX3Blcl9wZyA9IENOSUNfUEFHRV9TSVpFIC8gQk5YMklfU1FfV1FFX1NJWkU7CiAJaWYgKGhiYS0+bWF4X3NxZXMgPCBudW1fZWxlbWVudHNfcGVyX3BnKQogCQloYmEtPm1heF9zcWVzID0gbnVtX2VsZW1lbnRzX3Blcl9wZzsKIAllbHNlIGlmIChoYmEtPm1heF9zcWVzICUgbnVtX2VsZW1lbnRzX3Blcl9wZykKQEAgLTY5LDcgKzY5LDcgQEAKIAkJCQkgfihudW1fZWxlbWVudHNfcGVyX3BnIC0gMSk7CiAKIAkvKiBhZGp1c3QgQ1EgKi8KLQludW1fZWxlbWVudHNfcGVyX3BnID0gUEFHRV9TSVpFIC8gQk5YMklfQ1FFX1NJWkU7CisJbnVtX2VsZW1lbnRzX3Blcl9wZyA9IENOSUNfUEFHRV9TSVpFIC8gQk5YMklfQ1FFX1NJWkU7CiAJaWYgKGhiYS0+bWF4X2NxZXMgPCBudW1fZWxlbWVudHNfcGVyX3BnKQogCQloYmEtPm1heF9jcWVzID0gbnVtX2VsZW1lbnRzX3Blcl9wZzsKIAllbHNlIGlmIChoYmEtPm1heF9jcWVzICUgbnVtX2VsZW1lbnRzX3Blcl9wZykKQEAgLTc3LDcgKzc3LDcgQEAKIAkJCQkgfihudW1fZWxlbWVudHNfcGVyX3BnIC0gMSk7CiAKIAkvKiBhZGp1c3QgUlEgKi8KLQludW1fZWxlbWVudHNfcGVyX3BnID0gUEFHRV9TSVpFIC8gQk5YMklfUlFfV1FFX1NJWkU7CisJbnVtX2VsZW1lbnRzX3Blcl9wZyA9IENOSUNfUEFHRV9TSVpFIC8gQk5YMklfUlFfV1FFX1NJWkU7CiAJaWYgKGhiYS0+bWF4X3JxZXMgPCBudW1fZWxlbWVudHNfcGVyX3BnKQogCQloYmEtPm1heF9ycWVzID0gbnVtX2VsZW1lbnRzX3Blcl9wZzsKIAllbHNlIGlmIChoYmEtPm1heF9ycWVzICUgbnVtX2VsZW1lbnRzX3Blcl9wZykKQEAgLTk1OSw3ICs5NTksNyBAQAogCiAJLyogU1EgcGFnZSB0YWJsZSAqLwogCW1lbXNldChlcC0+cXAuc3FfcGd0YmxfdmlydCwgMCwgZXAtPnFwLnNxX3BndGJsX3NpemUpOwotCW51bV9wYWdlcyA9IGVwLT5xcC5zcV9tZW1fc2l6ZSAvIFBBR0VfU0laRTsKKwludW1fcGFnZXMgPSBlcC0+cXAuc3FfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRTsKIAlwYWdlID0gZXAtPnFwLnNxX3BoeXM7CiAKIAlpZiAoY25pY19kZXZfMTBnKQpAQCAtOTczLDcgKzk3Myw3IEBACiAJCQlwdGJsKys7CiAJCQkqcHRibCA9ICh1MzIpICgodTY0KSBwYWdlID4+IDMyKTsKIAkJCXB0YmwrKzsKLQkJCXBhZ2UgKz0gUEFHRV9TSVpFOworCQkJcGFnZSArPSBDTklDX1BBR0VfU0laRTsKIAkJfSBlbHNlIHsKIAkJCS8qIFBURSBpcyB3cml0dGVuIGluIGJpZyBlbmRpYW4gZm9ybWF0IGZvcgogCQkJICogNTcwNi81NzA4LzU3MDkgZGV2aWNlcyAqLwpAQCAtOTgxLDEzICs5ODEsMTMgQEAKIAkJCXB0YmwrKzsKIAkJCSpwdGJsID0gKHUzMikgcGFnZTsKIAkJCXB0YmwrKzsKLQkJCXBhZ2UgKz0gUEFHRV9TSVpFOworCQkJcGFnZSArPSBDTklDX1BBR0VfU0laRTsKIAkJfQogCX0KIAogCS8qIFJRIHBhZ2UgdGFibGUgKi8KIAltZW1zZXQoZXAtPnFwLnJxX3BndGJsX3ZpcnQsIDAsIGVwLT5xcC5ycV9wZ3RibF9zaXplKTsKLQludW1fcGFnZXMgPSBlcC0+cXAucnFfbWVtX3NpemUgLyBQQUdFX1NJWkU7CisJbnVtX3BhZ2VzID0gZXAtPnFwLnJxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkU7CiAJcGFnZSA9IGVwLT5xcC5ycV9waHlzOwogCiAJaWYgKGNuaWNfZGV2XzEwZykKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAJCQlwdGJsKys7CiAJCQkqcHRibCA9ICh1MzIpICgodTY0KSBwYWdlID4+IDMyKTsKIAkJCXB0YmwrKzsKLQkJCXBhZ2UgKz0gUEFHRV9TSVpFOworCQkJcGFnZSArPSBDTklDX1BBR0VfU0laRTsKIAkJfSBlbHNlIHsKIAkJCS8qIFBURSBpcyB3cml0dGVuIGluIGJpZyBlbmRpYW4gZm9ybWF0IGZvcgogCQkJICogNTcwNi81NzA4LzU3MDkgZGV2aWNlcyAqLwpAQCAtMTAwOSwxMyArMTAwOSwxMyBAQAogCQkJcHRibCsrOwogCQkJKnB0YmwgPSAodTMyKSBwYWdlOwogCQkJcHRibCsrOwotCQkJcGFnZSArPSBQQUdFX1NJWkU7CisJCQlwYWdlICs9IENOSUNfUEFHRV9TSVpFOwogCQl9CiAJfQogCiAJLyogQ1EgcGFnZSB0YWJsZSAqLwogCW1lbXNldChlcC0+cXAuY3FfcGd0YmxfdmlydCwgMCwgZXAtPnFwLmNxX3BndGJsX3NpemUpOwotCW51bV9wYWdlcyA9IGVwLT5xcC5jcV9tZW1fc2l6ZSAvIFBBR0VfU0laRTsKKwludW1fcGFnZXMgPSBlcC0+cXAuY3FfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRTsKIAlwYWdlID0gZXAtPnFwLmNxX3BoeXM7CiAKIAlpZiAoY25pY19kZXZfMTBnKQpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAkJCXB0YmwrKzsKIAkJCSpwdGJsID0gKHUzMikgKCh1NjQpIHBhZ2UgPj4gMzIpOwogCQkJcHRibCsrOwotCQkJcGFnZSArPSBQQUdFX1NJWkU7CisJCQlwYWdlICs9IENOSUNfUEFHRV9TSVpFOwogCQl9IGVsc2UgewogCQkJLyogUFRFIGlzIHdyaXR0ZW4gaW4gYmlnIGVuZGlhbiBmb3JtYXQgZm9yCiAJCQkgKiA1NzA2LzU3MDgvNTcwOSBkZXZpY2VzICovCkBAIC0xMDM3LDcgKzEwMzcsNyBAQAogCQkJcHRibCsrOwogCQkJKnB0YmwgPSAodTMyKSBwYWdlOwogCQkJcHRibCsrOwotCQkJcGFnZSArPSBQQUdFX1NJWkU7CisJCQlwYWdlICs9IENOSUNfUEFHRV9TSVpFOwogCQl9CiAJfQogfQpAQCAtMTA2NCwxMSArMTA2NCwxMSBAQAogCS8qIEFsbG9jYXRlIHBhZ2UgdGFibGUgbWVtb3J5IGZvciBTUSB3aGljaCBpcyBwYWdlIGFsaWduZWQgKi8KIAllcC0+cXAuc3FfbWVtX3NpemUgPSBoYmEtPm1heF9zcWVzICogQk5YMklfU1FfV1FFX1NJWkU7CiAJZXAtPnFwLnNxX21lbV9zaXplID0KLQkJKGVwLT5xcC5zcV9tZW1fc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJCShlcC0+cXAuc3FfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAllcC0+cXAuc3FfcGd0Ymxfc2l6ZSA9Ci0JCShlcC0+cXAuc3FfbWVtX3NpemUgLyBQQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CisJCShlcC0+cXAuc3FfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRSkgKiBzaXplb2Yodm9pZCAqKTsKIAllcC0+cXAuc3FfcGd0Ymxfc2l6ZSA9Ci0JCShlcC0+cXAuc3FfcGd0Ymxfc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJCShlcC0+cXAuc3FfcGd0Ymxfc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmIENOSUNfUEFHRV9NQVNLOwogCiAJZXAtPnFwLnNxX3BndGJsX3ZpcnQgPQogCQlkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIGVwLT5xcC5zcV9wZ3RibF9zaXplLApAQCAtMTEwMSwxMSArMTEwMSwxMSBAQAogCS8qIEFsbG9jYXRlIHBhZ2UgdGFibGUgbWVtb3J5IGZvciBDUSB3aGljaCBpcyBwYWdlIGFsaWduZWQgKi8KIAllcC0+cXAuY3FfbWVtX3NpemUgPSBoYmEtPm1heF9jcWVzICogQk5YMklfQ1FFX1NJWkU7CiAJZXAtPnFwLmNxX21lbV9zaXplID0KLQkJKGVwLT5xcC5jcV9tZW1fc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJCShlcC0+cXAuY3FfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAllcC0+cXAuY3FfcGd0Ymxfc2l6ZSA9Ci0JCShlcC0+cXAuY3FfbWVtX3NpemUgLyBQQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CisJCShlcC0+cXAuY3FfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRSkgKiBzaXplb2Yodm9pZCAqKTsKIAllcC0+cXAuY3FfcGd0Ymxfc2l6ZSA9Ci0JCShlcC0+cXAuY3FfcGd0Ymxfc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJCShlcC0+cXAuY3FfcGd0Ymxfc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmIENOSUNfUEFHRV9NQVNLOwogCiAJZXAtPnFwLmNxX3BndGJsX3ZpcnQgPQogCQlkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIGVwLT5xcC5jcV9wZ3RibF9zaXplLApAQCAtMTE0NCwxMSArMTE0NCwxMSBAQAogCS8qIEFsbG9jYXRlIHBhZ2UgdGFibGUgbWVtb3J5IGZvciBSUSB3aGljaCBpcyBwYWdlIGFsaWduZWQgKi8KIAllcC0+cXAucnFfbWVtX3NpemUgPSBoYmEtPm1heF9ycWVzICogQk5YMklfUlFfV1FFX1NJWkU7CiAJZXAtPnFwLnJxX21lbV9zaXplID0KLQkJKGVwLT5xcC5ycV9tZW1fc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJCShlcC0+cXAucnFfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAllcC0+cXAucnFfcGd0Ymxfc2l6ZSA9Ci0JCShlcC0+cXAucnFfbWVtX3NpemUgLyBQQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CisJCShlcC0+cXAucnFfbWVtX3NpemUgLyBDTklDX1BBR0VfU0laRSkgKiBzaXplb2Yodm9pZCAqKTsKIAllcC0+cXAucnFfcGd0Ymxfc2l6ZSA9Ci0JCShlcC0+cXAucnFfcGd0Ymxfc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0s7CisJCShlcC0+cXAucnFfcGd0Ymxfc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmIENOSUNfUEFHRV9NQVNLOwogCiAJZXAtPnFwLnJxX3BndGJsX3ZpcnQgPQogCQlkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIGVwLT5xcC5ycV9wZ3RibF9zaXplLApAQCAtMTI3MCw3ICsxMjcwLDcgQEAKIAlibngyaV9hZGp1c3RfcXBfc2l6ZShoYmEpOwogCiAJaXNjc2lfaW5pdC5mbGFncyA9Ci0JCUlTQ1NJX1BBR0VfU0laRV80SyA8PCBJU0NTSV9LV1FFX0lOSVQxX1BBR0VfU0laRV9TSElGVDsKKwkJKENOSUNfUEFHRV9CSVRTIC0gOCkgPDwgSVNDU0lfS1dRRV9JTklUMV9QQUdFX1NJWkVfU0hJRlQ7CiAJaWYgKGVuX3RjcF9kYWNrKQogCQlpc2NzaV9pbml0LmZsYWdzIHw9IElTQ1NJX0tXUUVfSU5JVDFfREVMQVlFRF9BQ0tfRU5BQkxFOwogCWlzY3NpX2luaXQucmVzZXJ2ZWQwID0gMDsKQEAgLTEyODgsMTUgKzEyODgsMTUgQEAKIAkJCSgoaGJhLT5udW1fY2NlbGwgJiAweEZGRkYpIHwgKGhiYS0+bWF4X3NxZXMgPDwgMTYpKTsKIAlpc2NzaV9pbml0Lm51bV9jY2VsbHNfcGVyX2Nvbm4gPSBoYmEtPm51bV9jY2VsbDsKIAlpc2NzaV9pbml0Lm51bV90YXNrc19wZXJfY29ubiA9IGhiYS0+bWF4X3NxZXM7Ci0JaXNjc2lfaW5pdC5zcV93cWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gQk5YMklfU1FfV1FFX1NJWkU7CisJaXNjc2lfaW5pdC5zcV93cWVzX3Blcl9wYWdlID0gQ05JQ19QQUdFX1NJWkUgLyBCTlgySV9TUV9XUUVfU0laRTsKIAlpc2NzaV9pbml0LnNxX251bV93cWVzID0gaGJhLT5tYXhfc3FlczsKIAlpc2NzaV9pbml0LmNxX2xvZ193cWVzX3Blcl9wYWdlID0KLQkJKHU4KSBibngyaV9wb3dlcl9vZjIoUEFHRV9TSVpFIC8gQk5YMklfQ1FFX1NJWkUpOworCQkodTgpIGJueDJpX3Bvd2VyX29mMihDTklDX1BBR0VfU0laRSAvIEJOWDJJX0NRRV9TSVpFKTsKIAlpc2NzaV9pbml0LmNxX251bV93cWVzID0gaGJhLT5tYXhfY3FlczsKIAlpc2NzaV9pbml0LmNxX251bV9wYWdlcyA9IChoYmEtPm1heF9jcWVzICogQk5YMklfQ1FFX1NJWkUgKwotCQkJCSAgIChQQUdFX1NJWkUgLSAxKSkgLyBQQUdFX1NJWkU7CisJCQkJICAgKENOSUNfUEFHRV9TSVpFIC0gMSkpIC8gQ05JQ19QQUdFX1NJWkU7CiAJaXNjc2lfaW5pdC5zcV9udW1fcGFnZXMgPSAoaGJhLT5tYXhfc3FlcyAqIEJOWDJJX1NRX1dRRV9TSVpFICsKLQkJCQkgICAoUEFHRV9TSVpFIC0gMSkpIC8gUEFHRV9TSVpFOworCQkJCSAgIChDTklDX1BBR0VfU0laRSAtIDEpKSAvIENOSUNfUEFHRV9TSVpFOwogCWlzY3NpX2luaXQucnFfYnVmZmVyX3NpemUgPSBCTlgySV9SUV9XUUVfU0laRTsKIAlpc2NzaV9pbml0LnJxX251bV93cWVzID0gaGJhLT5tYXhfcnFlczsKIApAQCAtMTM2MSw3ICsxMzYxLDcgQEAKIAl1MzIgZGF0YWxlbiA9IDA7CiAKIAlyZXNwX2NxZSA9IChzdHJ1Y3QgYm54MmlfY21kX3Jlc3BvbnNlICopY3FlOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJCSByZXNwX2NxZS0+aXR0ICYgSVNDU0lfQ01EX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCkBAIC0xNDMyLDcgKzE0MzIsNyBAQAogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLAogCQkJICAgICBjb25uLT5kYXRhLCBkYXRhbGVuKTsKIGZhaWw6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNDU3LDcgKzE0NTcsNyBAQAogCWludCBwYWRfbGVuOwogCiAJbG9naW4gPSAoc3RydWN0IGJueDJpX2xvZ2luX3Jlc3BvbnNlICopIGNxZTsKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwKIAkJCQkgbG9naW4tPml0dCAmIElTQ1NJX0xPR0lOX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCkBAIC0xNTAwLDcgKzE1MDAsNyBAQAogCQlibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYnVmLAogCQlibngyaV9jb25uLT5nZW5fcGR1LnJlc3Bfd3JfcHRyIC0gYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2J1Zik7CiBkb25lOgotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUyNSw3ICsxNTI1LDcgQEAKIAlpbnQgcGFkX2xlbjsKIAogCXRleHQgPSAoc3RydWN0IGJueDJpX3RleHRfcmVzcG9uc2UgKikgY3FlOwotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLCB0ZXh0LT5pdHQgJiBJU0NTSV9MT0dJTl9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrKQogCQlnb3RvIGRvbmU7CkBAIC0xNTYxLDcgKzE1NjEsNyBAQAogCQkJICAgICBibngyaV9jb25uLT5nZW5fcGR1LnJlc3Bfd3JfcHRyIC0KIAkJCSAgICAgYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2J1Zik7CiBkb25lOgotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4NCw3ICsxNTg0LDcgQEAKIAlzdHJ1Y3QgaXNjc2lfdG1fcnNwICpyZXNwX2hkcjsKIAogCXRtZl9jcWUgPSAoc3RydWN0IGJueDJpX3RtZl9yZXNwb25zZSAqKWNxZTsKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwKIAkJCQkgdG1mX2NxZS0+aXR0ICYgSVNDU0lfVE1GX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCkBAIC0xNjAwLDcgKzE2MDAsNyBAQAogCiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKilyZXNwX2hkciwgTlVMTCwgMCk7CiBkb25lOgotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYyMyw3ICsxNjIzLDcgQEAKIAlzdHJ1Y3QgaXNjc2lfbG9nb3V0X3JzcCAqcmVzcF9oZHI7CiAKIAlsb2dvdXQgPSAoc3RydWN0IGJueDJpX2xvZ291dF9yZXNwb25zZSAqKSBjcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCiAJCQkJIGxvZ291dC0+aXR0ICYgSVNDU0lfTE9HT1VUX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCkBAIC0xNjQ3LDcgKzE2NDcsNyBAQAogCiAJYm54MmlfY29ubi0+ZXAtPnN0YXRlID0gRVBfU1RBVEVfTE9HT1VUX1JFU1BfUkNWRDsKIGRvbmU6Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNjY4LDEyICsxNjY4LDEyIEBACiAJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAKIAlub3BfaW4gPSAoc3RydWN0IGJueDJpX25vcF9pbl9tc2cgKiljcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCiAJCQkJIG5vcF9pbi0+aXR0ICYgSVNDU0lfTk9QX0lOX01TR19JTkRFWCk7CiAJaWYgKHRhc2spCiAJCV9faXNjc2lfcHV0X3Rhc2sodGFzayk7Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiAvKioKQEAgLTE3MTIsNyArMTcxMiw3IEBACiAKIAlub3BfaW4gPSAoc3RydWN0IGJueDJpX25vcF9pbl9tc2cgKiljcWU7CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAloZHIgPSAoc3RydWN0IGlzY3NpX25vcGluICopJmJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9oZHI7CiAJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKIAloZHItPm9wY29kZSA9IG5vcF9pbi0+b3BfY29kZTsKQEAgLTE3MzgsNyArMTczOCw3IEBACiAJfQogZG9uZToKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKWhkciwgTlVMTCwgMCk7Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCiAJcmV0dXJuIHRndF9hc3luY19ub3A7CiB9CkBAIC0xNzcxLDcgKzE3NzEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmVzcF9oZHIgPSAoc3RydWN0IGlzY3NpX2FzeW5jICopICZibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfaGRyOwogCW1lbXNldChyZXNwX2hkciwgMCwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKIAlyZXNwX2hkci0+b3Bjb2RlID0gYXN5bmNfY3FlLT5vcF9jb2RlOwpAQCAtMTc5MCw3ICsxNzkwLDcgQEAKIAogCV9faXNjc2lfY29tcGxldGVfcGR1KGJueDJpX2Nvbm4tPmNsc19jb25uLT5kZF9kYXRhLAogCQkJICAgICAoc3RydWN0IGlzY3NpX2hkciAqKXJlc3BfaGRyLCBOVUxMLCAwKTsKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiB9CiAKIApAQCAtMTgxNyw3ICsxODE3LDcgQEAKIAl9IGVsc2UKIAkJYm54MmlfdW5zb2xfcGR1X2FkanVzdF9ycShibngyaV9jb25uKTsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCWhkciA9IChzdHJ1Y3QgaXNjc2lfcmVqZWN0ICopICZibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfaGRyOwogCW1lbXNldChoZHIsIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CiAJaGRyLT5vcGNvZGUgPSByZWplY3QtPm9wX2NvZGU7CkBAIC0xODI4LDcgKzE4MjgsNyBAQAogCWhkci0+ZmZmZmZmZmYgPSBjcHVfdG9fYmUzMihSRVNFUlZFRF9JVFQpOwogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLCBjb25uLT5kYXRhLAogCQkJICAgICByZWplY3QtPmRhdGFfbGVuZ3RoKTsKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiB9CiAKIC8qKgpAQCAtMTg0OCwxMyArMTg0OCwxMyBAQAogCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOwogCiAJY21kX2NsZWFuX3JzcCA9IChzdHJ1Y3QgYm54MmlfY2xlYW51cF9yZXNwb25zZSAqKWNxZTsKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwKIAkJCWNtZF9jbGVhbl9yc3AtPml0dCAmIElTQ1NJX0NMRUFOVVBfUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzaykKIAkJcHJpbnRrKEtFUk5fQUxFUlQgImJueDJpOiBjbWQgY2xlYW4gSVRUICV4IG5vdCBhY3RpdmVcbiIsCiAJCQljbWRfY2xlYW5fcnNwLT5pdHQgJiBJU0NTSV9DTEVBTlVQX1JFU1BPTlNFX0lOREVYKTsKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJY29tcGxldGUoJmJueDJpX2Nvbm4tPmNtZF9jbGVhbnVwX2NtcGwpOwogfQogCkBAIC0xOTIxLDExICsxOTIxLDExIEBACiAJaW50IHJjID0gMDsKIAlpbnQgY3B1OwogCi0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGJueDJpX2Nvbm4tPmNsc19jb25uLT5kZF9kYXRhLAogCQkJCSBjcWUtPml0dCAmIElTQ1NJX0NNRF9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrIHx8ICF0YXNrLT5zYykgewotCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc2MgPSB0YXNrLT5zYzsKQEAgLTE5MzUsNyArMTkzNSw3IEBACiAJZWxzZQogCQljcHUgPSBzYy0+cmVxdWVzdC0+Y3B1OwogCi0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCiAJcCA9ICZwZXJfY3B1KGJueDJpX3BlcmNwdSwgY3B1KTsKIAlzcGluX2xvY2soJnAtPnBfd29ya19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMKaW5kZXggODU0ZGFkNy4uMTY2NTQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMKQEAgLTUyNSw3ICs1MjUsNyBAQAogCXN0cnVjdCBpc2NzaV9iZCAqbXBfYmR0OwogCXU2NCBhZGRyOwogCi0JaGJhLT5tcF9iZF90YmwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwloYmEtPm1wX2JkX3RibCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCSAgICAmaGJhLT5tcF9iZF9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghaGJhLT5tcF9iZF90YmwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgTWlkZGxlIFBhdGggQkRUXG4iKTsKQEAgLTUzMywxMSArNTMzLDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWhiYS0+ZHVtbXlfYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJaGJhLT5kdW1teV9idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsCisJCQkJCSAgICAgICBDTklDX1BBR0VfU0laRSwKIAkJCQkJICAgICAgICZoYmEtPmR1bW15X2J1Zl9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghaGJhLT5kdW1teV9idWZmZXIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gYWxsb2MgTWlkZGxlIFBhdGggRHVtbXkgQnVmZmVyXG4iKTsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCSAgaGJhLT5tcF9iZF90YmwsIGhiYS0+bXBfYmRfZG1hKTsKIAkJaGJhLT5tcF9iZF90YmwgPSBOVUxMOwogCQlyYyA9IC0xOwpAQCAtNTQ4LDcgKzU0OSw3IEBACiAJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBoYmEtPmR1bW15X2J1Zl9kbWE7CiAJbXBfYmR0LT5idWZmZXJfYWRkcl9sbyA9IGFkZHIgJiAweGZmZmZmZmZmOwogCW1wX2JkdC0+YnVmZmVyX2FkZHJfaGkgPSBhZGRyID4+IDMyOwotCW1wX2JkdC0+YnVmZmVyX2xlbmd0aCA9IFBBR0VfU0laRTsKKwltcF9iZHQtPmJ1ZmZlcl9sZW5ndGggPSBDTklDX1BBR0VfU0laRTsKIAltcF9iZHQtPmZsYWdzID0gSVNDU0lfQkRfTEFTVF9JTl9CRF9DSEFJTiB8CiAJCQlJU0NTSV9CRF9GSVJTVF9JTl9CRF9DSEFJTjsKIG91dDoKQEAgLTU2NSwxMiArNTY2LDEyIEBACiBzdGF0aWMgdm9pZCBibngyaV9mcmVlX21wX2JkdChzdHJ1Y3QgYm54MmlfaGJhICpoYmEpCiB7CiAJaWYgKGhiYS0+bXBfYmRfdGJsKSB7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkgIGhiYS0+bXBfYmRfdGJsLCBoYmEtPm1wX2JkX2RtYSk7CiAJCWhiYS0+bXBfYmRfdGJsID0gTlVMTDsKIAl9CiAJaWYgKGhiYS0+ZHVtbXlfYnVmZmVyKSB7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkgIGhiYS0+ZHVtbXlfYnVmZmVyLCBoYmEtPmR1bW15X2J1Zl9kbWEpOwogCQloYmEtPmR1bW15X2J1ZmZlciA9IE5VTEw7CiAJfQpAQCAtOTM0LDE0ICs5MzUsMTQgQEAKIAkJCQkJICAgIHN0cnVjdCBibngyaV9jb25uICpibngyaV9jb25uKQogewogCWlmIChibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYmRfdGJsKSB7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkgIGJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9iZF90YmwsCiAJCQkJICBibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYmRfZG1hKTsKIAkJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2JkX3RibCA9IE5VTEw7CiAJfQogCiAJaWYgKGJueDJpX2Nvbm4tPmdlbl9wZHUucmVxX2JkX3RibCkgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICBibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwsCiAJCQkJICBibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF9kbWEpOwogCQlibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwgPSBOVUxMOwpAQCAtOTk4LDEzICs5OTksMTMgQEAKIAlibngyaV9jb25uLT5nZW5fcGR1LnJlc3Bfd3JfcHRyID0gYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2J1ZjsKIAogCWJueDJpX2Nvbm4tPmdlbl9wZHUucmVxX2JkX3RibCA9Ci0JCWRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCSAgICZibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF9kbWEsIEdGUF9LRVJORUwpOwogCWlmIChibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwgPT0gTlVMTCkKIAkJZ290byBsb2dpbl9yZXFfYmRfdGJsX2ZhaWx1cmU7CiAKIAlibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYmRfdGJsID0KLQkJZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICAgJmJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9iZF9kbWEsCiAJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKGJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9iZF90YmwgPT0gTlVMTCkKQEAgLTEwMTMsNyArMTAxNCw3IEBACiAJcmV0dXJuIDA7CiAKIGxvZ2luX3Jlc3BfYmRfdGJsX2ZhaWx1cmU6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkgIGJueDJpX2Nvbm4tPmdlbl9wZHUucmVxX2JkX3RibCwKIAkJCSAgYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfZG1hKTsKIAlibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwgPSBOVUxMOwpAQCAtMTE2OSwxMCArMTE3MCwxMCBAQAogCWlmICh0YXNrLT5zdGF0ZSA9PSBJU0NTSV9UQVNLX0FCUlRfVE1GKSB7CiAJCWJueDJpX3NlbmRfY21kX2NsZWFudXBfcmVxKGhiYSwgdGFzay0+ZGRfZGF0YSk7CiAKLQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZibngyaV9jb25uLT5jbWRfY2xlYW51cF9jbXBsLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoSVNDU0lfQ01EX0NMRUFOVVBfVElNRU9VVCkpOwotCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJfQogCWJueDJpX2lzY3NpX3VubWFwX3NnX2xpc3QodGFzay0+ZGRfZGF0YSk7CiB9CkBAIC0yMDU5LDcgKzIwNjAsNyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChzZXNzaW9uKSB7Ci0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaWYgKGJueDJpX2VwLT5zdGF0ZSAhPSBFUF9TVEFURV9UQ1BfRklOX1JDVkQpIHsKIAkJCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHSU5HX09VVCkgewogCQkJCWlmIChibngyaV9lcC0+c3RhdGUgPT0gRVBfU1RBVEVfTE9HT1VUX1NFTlQpIHsKQEAgLTIwNzUsNyArMjA3Niw3IEBACiAJCX0gZWxzZQogCQkJY2xvc2UgPSAxOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJfQogCiAJYm54MmlfZXAtPnN0YXRlID0gRVBfU1RBVEVfRElTQ09OTl9TVEFSVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCmluZGV4IDVhOWY4NDIuLmU4ZWU1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwpAQCAtMTc1LDUyICsxNzUsNiBAQAogCQkJc2l6ZW9mKHN0cnVjdCBmd19vZmxkX3R4X2RhdGFfd3IpKTsKIH0KIAotCi0jZGVmaW5lIFZMQU5fTk9ORSAweGZmZgotI2RlZmluZSBGSUxURVJfU0VMX1ZMQU5fTk9ORSAweGZmZmYKLSNkZWZpbmUgRklMVEVSX1NFTF9XSURUSF9QX0ZDICgzKzEpIC8qIHBvcnQgdXNlcyAzIGJpdHMsIEZDb0Ugb25lIGJpdCAqLwotI2RlZmluZSBGSUxURVJfU0VMX1dJRFRIX1ZJTl9QX0ZDIFwKLQkoNiArIDcgKyBGSUxURVJfU0VMX1dJRFRIX1BfRkMpIC8qIDYgYml0cyBhcmUgdW51c2VkLCBWRiB1c2VzIDcgYml0cyovCi0jZGVmaW5lIEZJTFRFUl9TRUxfV0lEVEhfVEFHX1BfRkMgXAotCSgzICsgRklMVEVSX1NFTF9XSURUSF9WSU5fUF9GQykgLyogUEYgdXNlcyAzIGJpdHMgKi8KLSNkZWZpbmUgRklMVEVSX1NFTF9XSURUSF9WTERfVEFHX1BfRkMgKDEgKyBGSUxURVJfU0VMX1dJRFRIX1RBR19QX0ZDKQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNlbGVjdF9udHVwbGUoc3RydWN0IGN4Z2JpX2RldmljZSAqY2RldiwKLQkJCQlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQpCi17Ci0Jc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGRpID0gY3hnYmlfY2Rldl9wcml2KGNkZXYpOwotCXVuc2lnbmVkIGludCBudHVwbGUgPSAwOwotCXUzMiB2aWlkOwotCi0Jc3dpdGNoIChsbGRpLT5maWx0X21vZGUpIHsKLQotCS8qIGRlZmF1bHQgZmlsdGVyIG1vZGUgKi8KLQljYXNlIEhXX1RQTF9GUl9NVF9QUl9JVl9QX0ZDOgotCQlpZiAobDJ0LT52bGFuID09IFZMQU5fTk9ORSkKLQkJCW50dXBsZSB8PSBGSUxURVJfU0VMX1ZMQU5fTk9ORSA8PCBGSUxURVJfU0VMX1dJRFRIX1BfRkM7Ci0JCWVsc2UgewotCQkJbnR1cGxlIHw9IGwydC0+dmxhbiA8PCBGSUxURVJfU0VMX1dJRFRIX1BfRkM7Ci0JCQludHVwbGUgfD0gMSA8PCBGSUxURVJfU0VMX1dJRFRIX1ZMRF9UQUdfUF9GQzsKLQkJfQotCQludHVwbGUgfD0gbDJ0LT5scG9ydCA8PCBTX1BPUlQgfCBJUFBST1RPX1RDUCA8PAotCQkJICBGSUxURVJfU0VMX1dJRFRIX1ZMRF9UQUdfUF9GQzsKLQkJYnJlYWs7Ci0JY2FzZSBIV19UUExfRlJfTVRfUFJfT1ZfUF9GQzogewotCQl2aWlkID0gY3hnYjRfcG9ydF92aWlkKGwydC0+bmVpZ2gtPmRldik7Ci0KLQkJbnR1cGxlIHw9IEZXX1ZJSURfVklOX0dFVCh2aWlkKSA8PCBGSUxURVJfU0VMX1dJRFRIX1BfRkM7Ci0JCW50dXBsZSB8PSBGV19WSUlEX1BGTl9HRVQodmlpZCkgPDwgRklMVEVSX1NFTF9XSURUSF9WSU5fUF9GQzsKLQkJbnR1cGxlIHw9IEZXX1ZJSURfVklWTERfR0VUKHZpaWQpIDw8IEZJTFRFUl9TRUxfV0lEVEhfVEFHX1BfRkM7Ci0JCW50dXBsZSB8PSBsMnQtPmxwb3J0IDw8IFNfUE9SVCB8IElQUFJPVE9fVENQIDw8Ci0JCQkgIEZJTFRFUl9TRUxfV0lEVEhfVkxEX1RBR19QX0ZDOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBudHVwbGU7Ci19Ci0KIHN0YXRpYyB2b2lkIHNlbmRfYWN0X29wZW5fcmVxKHN0cnVjdCBjeGdiaV9zb2NrICpjc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJc3RydWN0IGwydF9lbnRyeSAqZSkKIHsKQEAgLTI0OCw4ICsyMDIsNiBAQAogCQlzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqcmVxID0KIAkJCQkoc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEgKilza2ItPmhlYWQ7CiAKLQkJcmVxID0gKHN0cnVjdCBjcGxfYWN0X29wZW5fcmVxICopc2tiLT5oZWFkOwotCiAJCUlOSVRfVFBfV1IocmVxLCAwKTsKIAkJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUNUX09QRU5fUkVRLAogCQkJCQlxaWRfYXRpZCkpOwpAQCAtMjU4LDcgKzIxMCw5IEBACiAJCXJlcS0+bG9jYWxfaXAgPSBjc2stPnNhZGRyLnNpbl9hZGRyLnNfYWRkcjsKIAkJcmVxLT5wZWVyX2lwID0gY3NrLT5kYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJCXJlcS0+b3B0MCA9IGNwdV90b19iZTY0KG9wdDApOwotCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTMyKHNlbGVjdF9udHVwbGUoY3NrLT5jZGV2LCBjc2stPmwydCkpOworCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTMyKGN4Z2I0X3NlbGVjdF9udHVwbGUoCisJCQkJCWNzay0+Y2Rldi0+cG9ydHNbY3NrLT5wb3J0X2lkXSwKKwkJCQkJY3NrLT5sMnQpKTsKIAkJb3B0MiB8PSAxIDw8IDIyOwogCQlyZXEtPm9wdDIgPSBjcHVfdG9fYmUzMihvcHQyKTsKIApAQCAtMjcxLDggKzIyNSw2IEBACiAJCXN0cnVjdCBjcGxfdDVfYWN0X29wZW5fcmVxICpyZXEgPQogCQkJCShzdHJ1Y3QgY3BsX3Q1X2FjdF9vcGVuX3JlcSAqKXNrYi0+aGVhZDsKIAotCQlyZXEgPSAoc3RydWN0IGNwbF90NV9hY3Rfb3Blbl9yZXEgKilza2ItPmhlYWQ7Ci0KIAkJSU5JVF9UUF9XUihyZXEsIDApOwogCQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQ1RfT1BFTl9SRVEsCiAJCQkJCXFpZF9hdGlkKSk7CkBAIC0yODEsNyArMjMzLDEwIEBACiAJCXJlcS0+bG9jYWxfaXAgPSBjc2stPnNhZGRyLnNpbl9hZGRyLnNfYWRkcjsKIAkJcmVxLT5wZWVyX2lwID0gY3NrLT5kYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJCXJlcS0+b3B0MCA9IGNwdV90b19iZTY0KG9wdDApOwotCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTMyKHNlbGVjdF9udHVwbGUoY3NrLT5jZGV2LCBjc2stPmwydCkpOworCQlyZXEtPnBhcmFtcyA9IGNwdV90b19iZTY0KFZfRklMVEVSX1RVUExFKAorCQkJCWN4Z2I0X3NlbGVjdF9udHVwbGUoCisJCQkJCWNzay0+Y2Rldi0+cG9ydHNbY3NrLT5wb3J0X2lkXSwKKwkJCQkJY3NrLT5sMnQpKSk7CiAJCW9wdDIgfD0gMSA8PCAzMTsKIAkJcmVxLT5vcHQyID0gY3B1X3RvX2JlMzIob3B0Mik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kdGMuYyBiL2RyaXZlcnMvc2NzaS9kdGMuYwppbmRleCBkMDFmMDE2Li5lYjI5ZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZHRjLmMKKysrIGIvZHJpdmVycy9zY3NpL2R0Yy5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJLyogV2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQsIGl0IHdpbGwgc29tZXRpbWVzIGhhbmcgd2hlbiBkb2luZyBoZWF2eQogCQkgKiByZWFkcy4gU28gYmV0dGVyIG5vdCBlbmFibGUgdGhlbSB1bnRpbCBJIGZpbmdlciBpdCBvdXQuICovCiAJCWlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpCi0JCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgZHRjX2ludHIsIElSUUZfRElTQUJMRUQsCisJCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgZHRjX2ludHIsIDAsCiAJCQkJCSJkdGMiLCBpbnN0YW5jZSkpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CiAJCQkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZWF0YS5jIGIvZHJpdmVycy9zY3NpL2VhdGEuYwppbmRleCA5NGRlODg5Li5lYmY1NzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZWF0YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9lYXRhLmMKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAKIAkvKiBCb2FyZCBkZXRlY3RlZCwgYWxsb2NhdGUgaXRzIElSUSAqLwogCWlmIChyZXF1ZXN0X2lycShpcnEsIGRvX2ludGVycnVwdF9oYW5kbGVyLAotCQkJSVJRRl9ESVNBQkxFRCB8ICgoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwKSwKKwkJCShzdWJ2ZXJzaW9uID09IEVTQSkgPyBJUlFGX1NIQVJFRCA6IDAsCiAJCQlkcml2ZXJfbmFtZSwgKHZvaWQgKikmc2hhW2pdKSkgewogCQlwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBkZXRhY2hpbmcuXG4iLCBuYW1lLAogCQkgICAgICAgaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKaW5kZXggMTY2MzE3My4uODMxOWQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICghcmVnX0lSUVtnYy0+SVJRXSkgewkvKiBJbnRlcnJ1cHQgYWxyZWFkeSByZWdpc3RlcmVkID8gKi8KLQkJaWYgKCFyZXF1ZXN0X2lycShnYy0+SVJRLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwgIkVBVEEtUElPIiwgc2gpKSB7CisJCWlmICghcmVxdWVzdF9pcnEoZ2MtPklSUSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIDAsICJFQVRBLVBJTyIsIHNoKSkgewogCQkJcmVnX0lSUVtnYy0+SVJRXSsrOwogCQkJaWYgKCFnYy0+SVJRX1RSKQogCQkJCXJlZ19JUlFMW2djLT5JUlFdID0gMTsJLyogSVJRIGlzIGVkZ2UgdHJpZ2dlcmVkICovCkBAIC05MjEsNyArOTIxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhJUlE7IGkrKykKIAkJaWYgKHJlZ19JUlFbaV0pCi0JCQlyZXF1ZXN0X2lycShpLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwgIkVBVEEtUElPIiwgTlVMTCk7CisJCQlyZXF1ZXN0X2lycShpLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgMCwgIkVBVEEtUElPIiwgTlVMTCk7CiAKIAlIQkFfcHRyID0gZmlyc3RfSEJBOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9pbml0LmMgYi9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9pbml0LmMKaW5kZXggYjk3NTBlMi4uNjc3NjkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2luaXQuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAKIHN0YXRpYyB2b2lkIGVzYXMycl9jbGFpbV9pbnRlcnJ1cHRzKHN0cnVjdCBlc2FzMnJfYWRhcHRlciAqYSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gSVJRRl9ESVNBQkxFRDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCWlmIChhLT5pbnRyX21vZGUgPT0gSU5UUl9NT0RFX0xFR0FDWSkKIAkJZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9sb2cuYyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2xvZy5jCmluZGV4IDliZjI4NWQuLmE4MjAzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2xvZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2xvZy5jCkBAIC0xNjUsMTMgKzE2NSw5IEBACiAKIAkJLyoKIAkJICogUHV0IGEgbGluZSBicmVhayBhdCB0aGUgZW5kIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHNvIHRoYXQKLQkJICogd2UgZG9uJ3Qgd2luZCB1cCB3aXRoIHJ1bi1vbiBtZXNzYWdlcy4gIG9ubHkgYXBwZW5kIGlmIHRoZXJlCi0JCSAqIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyLgorCQkgKiB3ZSBkb24ndCB3aW5kIHVwIHdpdGggcnVuLW9uIG1lc3NhZ2VzLgogCQkgKi8KLQkJaWYgKHN0cmxlbihldmVudF9idWZmZXIpIDwgYnVmbGVuKQotCQkJc3RyY2F0KGJ1ZmZlciwgIlxuIik7Ci0KLQkJcHJpbnRrKGV2ZW50X2J1ZmZlcik7CisJCXByaW50aygiJXNcbiIsIGV2ZW50X2J1ZmZlcik7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRfYnVmZmVyX2xvY2ssIGZsYWdzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMKaW5kZXggNWNlYzZjNi4uNzE3NjM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKIAkJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKIAkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBnZW5lcmljX05DUjUzODBfaW50ciwKLQkJCQkJSVJRRl9ESVNBQkxFRCwgIk5DUjUzODAiLCBpbnN0YW5jZSkpIHsKKwkJCQkJMCwgIk5DUjUzODAiLCBpbnN0YW5jZSkpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOwogCQkJCWluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGguYyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKaW5kZXggY2U1ZWYwMTkwLi4wZjFhZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ2R0aC5jCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKQEAgLTQ3MTEsNyArNDcxMSw3IEBACiAJcHJpbnRrKCJDb25maWd1cmluZyBHRFQtSVNBIEhBIGF0IEJJT1MgMHglMDVYIElSUSAldSBEUlEgJXVcbiIsCiAJCWlzYV9iaW9zLCBoYS0+aXJxLCBoYS0+ZHJxKTsKIAotCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJnZHRoIiwgaGEpOworCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIDAsICJnZHRoIiwgaGEpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoIkdEVC1JU0E6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOwogCQlnb3RvIG91dF9ob3N0X3B1dDsKQEAgLTQ4NDMsNyArNDg0Myw3IEBACiAJcHJpbnRrKCJDb25maWd1cmluZyBHRFQtRUlTQSBIQSBhdCBTbG90ICVkIElSUSAldVxuIiwKIAkJZWlzYV9zbG90ID4+IDEyLCBoYS0+aXJxKTsKIAotCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJnZHRoIiwgaGEpOworCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsIDAsICJnZHRoIiwgaGEpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoIkdEVC1FSVNBOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKIAkJZ290byBvdXRfaG9zdF9wdXQ7CkBAIC00OTc5LDcgKzQ5NzksNyBAQAogCQloYS0+aXJxKTsKIAogCWVycm9yID0gcmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgImdkdGgiLCBoYSk7CisJCQkJSVJRRl9TSEFSRUQsICJnZHRoIiwgaGEpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoIkdEVC1QQ0k6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOwogCQlnb3RvIG91dF9ob3N0X3B1dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggZjI4ZWEwNy4uM2NiYjU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTM5OCw3ICszOTgsNyBAQAogCXNob3N0LT5vcmRlcmVkX3RhZyA9IHNodC0+b3JkZXJlZF90YWc7CiAJc2hvc3QtPm5vX3dyaXRlX3NhbWUgPSBzaHQtPm5vX3dyaXRlX3NhbWU7CiAKLQlpZiAoc2hvc3RfZWhfZGVhZGxpbmUgPT0gLTEpCisJaWYgKHNob3N0X2VoX2RlYWRsaW5lID09IC0xIHx8ICFzaHQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlcikKIAkJc2hvc3QtPmVoX2RlYWRsaW5lID0gLTE7CiAJZWxzZSBpZiAoKHVsb25nKSBzaG9zdF9laF9kZWFkbGluZSAqIEhaID4gSU5UX01BWCkgewogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBzaG9zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmMgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCmluZGV4IDg2ODMxOGEuLjhjZjRhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwc2EuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgICBEaXNrIEFycmF5IGRyaXZlciBmb3IgSFAgU21hcnQgQXJyYXkgU0FTIGNvbnRyb2xsZXJzCi0gKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAwOSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMTQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqCiAgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ3LDEzICs0NywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSAiaHBzYV9jbWQuaCIKICNpbmNsdWRlICJocHNhLmgiCiAKIC8qIEhQU0FfRFJJVkVSX1ZFUlNJT04gbXVzdCBiZSAzIGJ5dGUgdmFsdWVzICgwLTI1NSkgc2VwYXJhdGVkIGJ5ICcuJyAqLwotI2RlZmluZSBIUFNBX0RSSVZFUl9WRVJTSU9OICIzLjQuMC0xIgorI2RlZmluZSBIUFNBX0RSSVZFUl9WRVJTSU9OICIzLjQuNC0xIgogI2RlZmluZSBEUklWRVJfTkFNRSAiSFAgSFBTQSBEcml2ZXIgKHYgIiBIUFNBX0RSSVZFUl9WRVJTSU9OICIpIgogI2RlZmluZSBIUFNBICJocHNhIgogCkBAIC0xMTgsNiArMTE4LDExIEBACiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NJLCAgICAgMHgxMDNDLCAweDIxQzd9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTSSwgICAgIDB4MTAzQywgMHgyMUM4fSwKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0ksICAgICAweDEwM0MsIDB4MjFDOX0sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA3Nn0sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA4N30sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA3RH0sCisJe1BDSV9WRU5ET1JfSURfSFBfM1BBUiwgMHgwMDc1LCAweDE1OTAsIDB4MDA4OH0sCisJe1BDSV9WRU5ET1JfSURfSFAsIDB4MzMzZiwgMHgxMDNjLCAweDMzM2Z9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0FOWV9JRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkJUENJX0NMQVNTX1NUT1JBR0VfUkFJRCA8PCA4LCAweGZmZmYgPDwgOCwgMH0sCiAJezAsfQpAQCAtMTYzLDYgKzE2OCwxMSBAQAogCXsweDIxQzcxMDNDLCAiU21hcnQgQXJyYXkiLCAmU0E1X2FjY2Vzc30sCiAJezB4MjFDODEwM0MsICJTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzfSwKIAl7MHgyMUM5MTAzQywgIlNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAorCXsweDAwNzYxNTkwLCAiSFAgU3RvcmFnZSBQMTIyNCBBcnJheSBDb250cm9sbGVyIiwgJlNBNV9hY2Nlc3N9LAorCXsweDAwODcxNTkwLCAiSFAgU3RvcmFnZSBQMTIyNGUgQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKKwl7MHgwMDdEMTU5MCwgIkhQIFN0b3JhZ2UgUDEyMjggQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKKwl7MHgwMDg4MTU5MCwgIkhQIFN0b3JhZ2UgUDEyMjhlIEFycmF5IENvbnRyb2xsZXIiLCAmU0E1X2FjY2Vzc30sCisJezB4MzMzZjEwM2MsICJIUCBTdG9yYWdlV29ya3MgMTIxMG0gQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKIAl7MHhGRkZGMTAzQywgIlVua25vd24gU21hcnQgQXJyYXkiLCAmU0E1X2FjY2Vzc30sCiB9OwogCkBAIC0xODIsOCArMTkyLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgQ29tbWFuZExpc3QgKmNtZF9hbGxvYyhzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIHN0YXRpYyBzdHJ1Y3QgQ29tbWFuZExpc3QgKmNtZF9zcGVjaWFsX2FsbG9jKHN0cnVjdCBjdGxyX2luZm8gKmgpOwogc3RhdGljIGludCBmaWxsX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHU4IGNtZCwgc3RydWN0IGN0bHJfaW5mbyAqaCwKLQl2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwgdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHUxNiBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKIAlpbnQgY21kX3R5cGUpOworI2RlZmluZSBWUERfUEFHRSAoMSA8PCA4KQogCiBzdGF0aWMgaW50IGhwc2Ffc2NzaV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKmgsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBzdGF0aWMgdm9pZCBocHNhX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqKTsKQEAgLTIwNCw3ICsyMTUsNyBAQAogCXN0cnVjdCBDb21tYW5kTGlzdCAqYyk7CiAvKiBwZXJmb3JtYW50IG1vZGUgaGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgY2FsY19idWNrZXRfbWFwKGludCAqYnVja2V0LCBpbnQgbnVtX2J1Y2tldHMsCi0JaW50IG5zZ3MsIGludCAqYnVja2V0X21hcCk7CisJaW50IG5zZ3MsIGludCBtaW5fYmxvY2tzLCBpbnQgKmJ1Y2tldF9tYXApOwogc3RhdGljIHZvaWQgaHBzYV9wdXRfY3Rscl9pbnRvX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIHN0YXRpYyBpbmxpbmUgdTMyIG5leHRfY29tbWFuZChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1OCBxKTsKIHN0YXRpYyBpbnQgaHBzYV9maW5kX2NmZ19hZGRycyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICp2YWRkciwKQEAgLTIxNiw4ICsyMjcsMTQgQEAKIHN0YXRpYyBpbnQgaHBzYV93YWl0X2Zvcl9ib2FyZF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICp2YWRkciwKIAkJCQkgICAgIGludCB3YWl0X2Zvcl9yZWFkeSk7CiBzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpOworc3RhdGljIHZvaWQgaHBzYV93YWl0X2Zvcl9tb2RlX2NoYW5nZV9hY2soc3RydWN0IGN0bHJfaW5mbyAqaCk7CiAjZGVmaW5lIEJPQVJEX05PVF9SRUFEWSAwCiAjZGVmaW5lIEJPQVJEX1JFQURZIDEKK3N0YXRpYyB2b2lkIGhwc2FfZHJhaW5fYWNjZWxfY29tbWFuZHMoc3RydWN0IGN0bHJfaW5mbyAqaCk7CitzdGF0aWMgdm9pZCBocHNhX2ZsdXNoX2NhY2hlKHN0cnVjdCBjdGxyX2luZm8gKmgpOworc3RhdGljIGludCBocHNhX3Njc2lfaW9hY2NlbF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1MzIgaW9hY2NlbF9oYW5kbGUsIHU4ICpjZGIsIGludCBjZGJfbGVuLAorCXU4ICpzY3NpM2FkZHIpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjdGxyX2luZm8gKnNkZXZfdG9faGJhKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKQEAgLTI4MCw2ICsyOTcsNTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHNzaXplX3QgaG9zdF9zdG9yZV9ocF9zc2Rfc21hcnRfcGF0aF9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgc3RhdHVzLCBsZW47CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJY2hhciB0bXBidWZbMTBdOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlsZW4gPSBjb3VudCA+IHNpemVvZih0bXBidWYpIC0gMSA/IHNpemVvZih0bXBidWYpIC0gMSA6IGNvdW50OworCXN0cm5jcHkodG1wYnVmLCBidWYsIGxlbik7CisJdG1wYnVmW2xlbl0gPSAnXDAnOworCWlmIChzc2NhbmYodG1wYnVmLCAiJWQiLCAmc3RhdHVzKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwloID0gc2hvc3RfdG9faGJhKHNob3N0KTsKKwloLT5hY2Npb3BhdGhfc3RhdHVzID0gISFzdGF0dXM7CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJImhwc2E6IEhQIFNTRCBTbWFydCBQYXRoICVzIHZpYSBzeXNmcyB1cGRhdGUuXG4iLAorCQloLT5hY2Npb3BhdGhfc3RhdHVzID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X3N0b3JlX3JhaWRfb2ZmbG9hZF9kZWJ1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBkZWJ1Z19sZXZlbCwgbGVuOworCXN0cnVjdCBjdGxyX2luZm8gKmg7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCWNoYXIgdG1wYnVmWzEwXTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJbGVuID0gY291bnQgPiBzaXplb2YodG1wYnVmKSAtIDEgPyBzaXplb2YodG1wYnVmKSAtIDEgOiBjb3VudDsKKwlzdHJuY3B5KHRtcGJ1ZiwgYnVmLCBsZW4pOworCXRtcGJ1ZltsZW5dID0gJ1wwJzsKKwlpZiAoc3NjYW5mKHRtcGJ1ZiwgIiVkIiwgJmRlYnVnX2xldmVsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGVidWdfbGV2ZWwgPCAwKQorCQlkZWJ1Z19sZXZlbCA9IDA7CisJaCA9IHNob3N0X3RvX2hiYShzaG9zdCk7CisJaC0+cmFpZF9vZmZsb2FkX2RlYnVnID0gZGVidWdfbGV2ZWw7CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImhwc2E6IFNldCByYWlkX29mZmxvYWRfZGVidWcgbGV2ZWwgPSAlZFxuIiwKKwkJaC0+cmFpZF9vZmZsb2FkX2RlYnVnKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGhvc3Rfc3RvcmVfcmVzY2FuKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQpAQCAtMzI3LDYgKzM5MywxNyBAQAogCQkJInBlcmZvcm1hbnQiIDogInNpbXBsZSIpOwogfQogCitzdGF0aWMgc3NpemVfdCBob3N0X3Nob3dfaHBfc3NkX3NtYXJ0X3BhdGhfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjdGxyX2luZm8gKmg7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCisJaCA9IHNob3N0X3RvX2hiYShzaG9zdCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMzAsICJIUCBTU0QgU21hcnQgUGF0aCAlc1xuIiwKKwkJKGgtPmFjY2lvcGF0aF9zdGF0dXMgPT0gMSkgPyAgImVuYWJsZWQiIDogImRpc2FibGVkIik7Cit9CisKIC8qIExpc3Qgb2YgY29udHJvbGxlcnMgd2hpY2ggY2Fubm90IGJlIGhhcmQgcmVzZXQgb24ga2V4ZWMgd2l0aCByZXNldF9kZXZpY2VzICovCiBzdGF0aWMgdTMyIHVucmVzZXR0YWJsZV9jb250cm9sbGVyW10gPSB7CiAJMHgzMjRhMTAzQywgLyogU21hcnQgQXJyYXkgUDcxMm0gKi8KQEAgLTQxNiw2ICs0OTMsMTMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpyYWlkX2xhYmVsW10gPSB7ICIwIiwgIjQiLCAiMSgxKzApIiwgIjUiLCAiNSsxIiwgIkFERyIsCiAJIjEoQURNKSIsICJVTktOT1dOIgogfTsKKyNkZWZpbmUgSFBTQV9SQUlEXzAJMAorI2RlZmluZSBIUFNBX1JBSURfNAkxCisjZGVmaW5lIEhQU0FfUkFJRF8xCTIJLyogYWxzbyB1c2VkIGZvciBSQUlEIDEwICovCisjZGVmaW5lIEhQU0FfUkFJRF81CTMJLyogYWxzbyB1c2VkIGZvciBSQUlEIDUwICovCisjZGVmaW5lIEhQU0FfUkFJRF81MQk0CisjZGVmaW5lIEhQU0FfUkFJRF82CTUJLyogYWxzbyB1c2VkIGZvciBSQUlEIDYwICovCisjZGVmaW5lIEhQU0FfUkFJRF9BRE0JNgkvKiBhbHNvIHVzZWQgZm9yIFJBSUQgMSswIEFETSAqLwogI2RlZmluZSBSQUlEX1VOS05PV04gKEFSUkFZX1NJWkUocmFpZF9sYWJlbCkgLSAxKQogCiBzdGF0aWMgc3NpemVfdCByYWlkX2xldmVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtNTA0LDEwICs1ODgsMzkgQEAKIAkJCXNuWzEyXSwgc25bMTNdLCBzblsxNF0sIHNuWzE1XSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGhvc3Rfc2hvd19ocF9zc2Rfc21hcnRfcGF0aF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqaGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZsb2FkX2VuYWJsZWQ7CisKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwloID0gc2Rldl90b19oYmEoc2Rldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwloZGV2ID0gc2Rldi0+aG9zdGRhdGE7CisJaWYgKCFoZGV2KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW9mZmxvYWRfZW5hYmxlZCA9IGhkZXYtPm9mZmxvYWRfZW5hYmxlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlZFxuIiwgb2ZmbG9hZF9lbmFibGVkKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKHJhaWRfbGV2ZWwsIFNfSVJVR08sIHJhaWRfbGV2ZWxfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobHVuaWQsIFNfSVJVR08sIGx1bmlkX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHVuaXF1ZV9pZCwgU19JUlVHTywgdW5pcXVlX2lkX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHJlc2NhbiwgU19JV1VTUiwgTlVMTCwgaG9zdF9zdG9yZV9yZXNjYW4pOworc3RhdGljIERFVklDRV9BVFRSKGhwX3NzZF9zbWFydF9wYXRoX2VuYWJsZWQsIFNfSVJVR08sCisJCQlob3N0X3Nob3dfaHBfc3NkX3NtYXJ0X3BhdGhfZW5hYmxlZCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaHBfc3NkX3NtYXJ0X3BhdGhfc3RhdHVzLCBTX0lXVVNSfFNfSVJVR098U19JUk9USCwKKwkJaG9zdF9zaG93X2hwX3NzZF9zbWFydF9wYXRoX3N0YXR1cywKKwkJaG9zdF9zdG9yZV9ocF9zc2Rfc21hcnRfcGF0aF9zdGF0dXMpOworc3RhdGljIERFVklDRV9BVFRSKHJhaWRfb2ZmbG9hZF9kZWJ1ZywgU19JV1VTUiwgTlVMTCwKKwkJCWhvc3Rfc3RvcmVfcmFpZF9vZmZsb2FkX2RlYnVnKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihmaXJtd2FyZV9yZXZpc2lvbiwgU19JUlVHTywKIAlob3N0X3Nob3dfZmlybXdhcmVfcmV2aXNpb24sIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGNvbW1hbmRzX291dHN0YW5kaW5nLCBTX0lSVUdPLApAQCAtNTIxLDYgKzYzNCw3IEBACiAJJmRldl9hdHRyX3JhaWRfbGV2ZWwsCiAJJmRldl9hdHRyX2x1bmlkLAogCSZkZXZfYXR0cl91bmlxdWVfaWQsCisJJmRldl9hdHRyX2hwX3NzZF9zbWFydF9wYXRoX2VuYWJsZWQsCiAJTlVMTCwKIH07CiAKQEAgLTUzMCw2ICs2NDQsOCBAQAogCSZkZXZfYXR0cl9jb21tYW5kc19vdXRzdGFuZGluZywKIAkmZGV2X2F0dHJfdHJhbnNwb3J0X21vZGUsCiAJJmRldl9hdHRyX3Jlc2V0dGFibGUsCisJJmRldl9hdHRyX2hwX3NzZF9zbWFydF9wYXRoX3N0YXR1cywKKwkmZGV2X2F0dHJfcmFpZF9vZmZsb2FkX2RlYnVnLAogCU5VTEwsCiB9OwogCkBAIC01NzAsNiArNjg2LDkgQEAKIAlzdHJ1Y3QgcmVwbHlfcG9vbCAqcnEgPSAmaC0+cmVwbHlfcXVldWVbcV07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChoLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpCisJCXJldHVybiBoLT5hY2Nlc3MuY29tbWFuZF9jb21wbGV0ZWQoaCwgcSk7CisKIAlpZiAodW5saWtlbHkoIShoLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19QZXJmb3JtYW50KSkpCiAJCXJldHVybiBoLT5hY2Nlc3MuY29tbWFuZF9jb21wbGV0ZWQoaCwgcSk7CiAKQEAgLTU5MCw2ICs3MDksMzIgQEAKIAlyZXR1cm4gYTsKIH0KIAorLyoKKyAqIFRoZXJlIGFyZSBzb21lIHNwZWNpYWwgYml0cyBpbiB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlCisgKiBjb21tYW5kIHRoYXQgd2UgaGF2ZSB0byBzZXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGtub3cKKyAqIGhvdyB0byBwcm9jZXNzIHRoZSBjb21tYW5kOgorICoKKyAqIE5vcm1hbCBwZXJmb3JtYW50IG1vZGU6CisgKiBiaXQgMDogMSBtZWFucyBwZXJmb3JtYW50IG1vZGUsIDAgbWVhbnMgc2ltcGxlIG1vZGUuCisgKiBiaXRzIDEtMyA9IGJsb2NrIGZldGNoIHRhYmxlIGVudHJ5CisgKiBiaXRzIDQtNiA9IGNvbW1hbmQgdHlwZSAoPT0gMCkKKyAqCisgKiBpb2FjY2VsMSBtb2RlOgorICogYml0IDAgPSAicGVyZm9ybWFudCBtb2RlIiBiaXQuCisgKiBiaXRzIDEtMyA9IGJsb2NrIGZldGNoIHRhYmxlIGVudHJ5CisgKiBiaXRzIDQtNiA9IGNvbW1hbmQgdHlwZSAoPT0gMTEwKQorICogKGNvbW1hbmQgdHlwZSBpcyBuZWVkZWQgYmVjYXVzZSBpb2FjY2VsMSBtb2RlCisgKiBjb21tYW5kcyBhcmUgc3VibWl0dGVkIHRocm91Z2ggdGhlIHNhbWUgcmVnaXN0ZXIgYXMgbm9ybWFsCisgKiBtb2RlIGNvbW1hbmRzLCBzbyB0aGlzIGlzIGhvdyB0aGUgY29udHJvbGxlciBrbm93cyB3aGV0aGVyCisgKiB0aGUgY29tbWFuZCBpcyBub3JtYWwgbW9kZSBvciBpb2FjY2VsMSBtb2RlLikKKyAqCisgKiBpb2FjY2VsMiBtb2RlOgorICogYml0IDAgPSAicGVyZm9ybWFudCBtb2RlIiBiaXQuCisgKiBiaXRzIDEtNCA9IGJsb2NrIGZldGNoIHRhYmxlIGVudHJ5IChub3RlIGV4dHJhIGJpdCkKKyAqIGJpdHMgNC02ID0gbm90IG5lZWRlZCwgYmVjYXVzZSBpb2FjY2VsMiBtb2RlIGhhcworICogYSBzZXBhcmF0ZSBzcGVjaWFsIHJlZ2lzdGVyIGZvciBzdWJtaXR0aW5nIGNvbW1hbmRzLgorICovCisKIC8qIHNldF9wZXJmb3JtYW50X21vZGU6IE1vZGlmeSB0aGUgdGFnIGZvciBjY2lzcyBwZXJmb3JtYW50CiAgKiBzZXQgYml0IDAgZm9yIHB1bGwgbW9kZWwsIGJpdHMgMy0xIGZvciBibG9jayBmZXRjaAogICogcmVnaXN0ZXIgbnVtYmVyCkBAIC01OTgsMTIgKzc0Myw0NyBAQAogewogCWlmIChsaWtlbHkoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCkpIHsKIAkJYy0+YnVzYWRkciB8PSAxIHwgKGgtPmJsb2NrRmV0Y2hUYWJsZVtjLT5IZWFkZXIuU0dMaXN0XSA8PCAxKTsKLQkJaWYgKGxpa2VseShoLT5tc2l4X3ZlY3RvcikpCisJCWlmIChsaWtlbHkoaC0+bXNpeF92ZWN0b3IgPiAwKSkKIAkJCWMtPkhlYWRlci5SZXBseVF1ZXVlID0KIAkJCQlyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICUgaC0+bnJlcGx5X3F1ZXVlczsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9pb2FjY2VsMV9wZXJmb3JtYW50X21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYykKK3sKKwlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqY3AgPSAmaC0+aW9hY2NlbF9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHRvIHBvc3QgdGhlIHJlcGx5IHRvIHRoZSBxdWV1ZSBmb3IgdGhpcworCSAqIHByb2Nlc3Nvci4gIFRoaXMgc2VlbXMgdG8gZ2l2ZSB0aGUgYmVzdCBJL08gdGhyb3VnaHB1dC4KKwkgKi8KKwljcC0+UmVwbHlRdWV1ZSA9IHNtcF9wcm9jZXNzb3JfaWQoKSAlIGgtPm5yZXBseV9xdWV1ZXM7CisJLyogU2V0IHRoZSBiaXRzIGluIHRoZSBhZGRyZXNzIHNlbnQgZG93biB0byBpbmNsdWRlOgorCSAqICAtIHBlcmZvcm1hbnQgbW9kZSBiaXQgKGJpdCAwKQorCSAqICAtIHB1bGwgY291bnQgKGJpdHMgMS0zKQorCSAqICAtIGNvbW1hbmQgdHlwZSAoYml0cyA0LTYpCisJICovCisJYy0+YnVzYWRkciB8PSAxIHwgKGgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZVtjLT5IZWFkZXIuU0dMaXN0XSA8PCAxKSB8CisJCQkJCUlPQUNDRUwxX0JVU0FERFJfQ01EVFlQRTsKK30KKworc3RhdGljIHZvaWQgc2V0X2lvYWNjZWwyX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQkJCQkJc3RydWN0IENvbW1hbmRMaXN0ICpjKQoreworCXN0cnVjdCBpb19hY2NlbDJfY21kICpjcCA9ICZoLT5pb2FjY2VsMl9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHRvIHBvc3QgdGhlIHJlcGx5IHRvIHRoZSBxdWV1ZSBmb3IgdGhpcworCSAqIHByb2Nlc3Nvci4gIFRoaXMgc2VlbXMgdG8gZ2l2ZSB0aGUgYmVzdCBJL08gdGhyb3VnaHB1dC4KKwkgKi8KKwljcC0+cmVwbHlfcXVldWUgPSBzbXBfcHJvY2Vzc29yX2lkKCkgJSBoLT5ucmVwbHlfcXVldWVzOworCS8qIFNldCB0aGUgYml0cyBpbiB0aGUgYWRkcmVzcyBzZW50IGRvd24gdG8gaW5jbHVkZToKKwkgKiAgLSBwZXJmb3JtYW50IG1vZGUgYml0IG5vdCB1c2VkIGluIGlvYWNjZWwgbW9kZSAyCisJICogIC0gcHVsbCBjb3VudCAoYml0cyAwLTMpCisJICogIC0gY29tbWFuZCB0eXBlIGlzbid0IG5lZWRlZCBmb3IgaW9hY2NlbDIKKwkgKi8KKwljLT5idXNhZGRyIHw9IChoLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGVbY3AtPnNnX2NvdW50XSk7Cit9CisKIHN0YXRpYyBpbnQgaXNfZmlybXdhcmVfZmxhc2hfY21kKHU4ICpjZGIpCiB7CiAJcmV0dXJuIGNkYlswXSA9PSBCTUlDX1dSSVRFICYmIGNkYls2XSA9PSBCTUlDX0ZMQVNIX0ZJUk1XQVJFOwpAQCAtNjM4LDcgKzgxOCwxNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzZXRfcGVyZm9ybWFudF9tb2RlKGgsIGMpOworCXN3aXRjaCAoYy0+Y21kX3R5cGUpIHsKKwljYXNlIENNRF9JT0FDQ0VMMToKKwkJc2V0X2lvYWNjZWwxX3BlcmZvcm1hbnRfbW9kZShoLCBjKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfSU9BQ0NFTDI6CisJCXNldF9pb2FjY2VsMl9wZXJmb3JtYW50X21vZGUoaCwgYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNldF9wZXJmb3JtYW50X21vZGUoaCwgYyk7CisJfQogCWRpYWxfZG93bl9sb2NrdXBfZGV0ZWN0aW9uX2R1cmluZ19md19mbGFzaChoLCBjKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOwogCWFkZFEoJmgtPnJlcVEsIGMpOwpAQCAtNzgyLDYgKzk3MSwxNCBAQAogCiAJLyogUmFpZCBsZXZlbCBjaGFuZ2VkLiAqLwogCWgtPmRldltlbnRyeV0tPnJhaWRfbGV2ZWwgPSBuZXdfZW50cnktPnJhaWRfbGV2ZWw7CisKKwkvKiBSYWlkIG9mZmxvYWQgcGFyYW1ldGVycyBjaGFuZ2VkLiAqLworCWgtPmRldltlbnRyeV0tPm9mZmxvYWRfY29uZmlnID0gbmV3X2VudHJ5LT5vZmZsb2FkX2NvbmZpZzsKKwloLT5kZXZbZW50cnldLT5vZmZsb2FkX2VuYWJsZWQgPSBuZXdfZW50cnktPm9mZmxvYWRfZW5hYmxlZDsKKwloLT5kZXZbZW50cnldLT5pb2FjY2VsX2hhbmRsZSA9IG5ld19lbnRyeS0+aW9hY2NlbF9oYW5kbGU7CisJaC0+ZGV2W2VudHJ5XS0+b2ZmbG9hZF90b19taXJyb3IgPSBuZXdfZW50cnktPm9mZmxvYWRfdG9fbWlycm9yOworCWgtPmRldltlbnRyeV0tPnJhaWRfbWFwID0gbmV3X2VudHJ5LT5yYWlkX21hcDsKKwogCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICIlcyBkZXZpY2UgYyVkYiVkdCVkbCVkIHVwZGF0ZWQuXG4iLAogCQlzY3NpX2RldmljZV90eXBlKG5ld19lbnRyeS0+ZGV2dHlwZSksIGhvc3RubywgbmV3X2VudHJ5LT5idXMsCiAJCW5ld19lbnRyeS0+dGFyZ2V0LCBuZXdfZW50cnktPmx1bik7CkBAIC05MDIsNiArMTA5OSwxMCBAQAogCSAqLwogCWlmIChkZXYxLT5yYWlkX2xldmVsICE9IGRldjItPnJhaWRfbGV2ZWwpCiAJCXJldHVybiAxOworCWlmIChkZXYxLT5vZmZsb2FkX2NvbmZpZyAhPSBkZXYyLT5vZmZsb2FkX2NvbmZpZykKKwkJcmV0dXJuIDE7CisJaWYgKGRldjEtPm9mZmxvYWRfZW5hYmxlZCAhPSBkZXYyLT5vZmZsb2FkX2VuYWJsZWQpCisJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCkBAIC05MzIsNiArMTEzMyw5IEBACiAJCQkJCXJldHVybiBERVZJQ0VfVVBEQVRFRDsKIAkJCQlyZXR1cm4gREVWSUNFX1NBTUU7CiAJCQl9IGVsc2UgeworCQkJCS8qIEtlZXAgb2ZmbGluZSBkZXZpY2VzIG9mZmxpbmUgKi8KKwkJCQlpZiAobmVlZGxlLT52b2x1bWVfb2ZmbGluZSkKKwkJCQkJcmV0dXJuIERFVklDRV9OT1RfRk9VTkQ7CiAJCQkJcmV0dXJuIERFVklDRV9DSEFOR0VEOwogCQkJfQogCQl9CkBAIC05NDAsNiArMTE0NCwxMTAgQEAKIAlyZXR1cm4gREVWSUNFX05PVF9GT1VORDsKIH0KIAorc3RhdGljIHZvaWQgaHBzYV9tb25pdG9yX29mZmxpbmVfZGV2aWNlKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10pCit7CisJc3RydWN0IG9mZmxpbmVfZGV2aWNlX2VudHJ5ICpkZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIENoZWNrIHRvIHNlZSBpZiBkZXZpY2UgaXMgYWxyZWFkeSBvbiB0aGUgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZoLT5vZmZsaW5lX2RldmljZV9saXN0LCBvZmZsaW5lX2xpc3QpIHsKKwkJaWYgKG1lbWNtcChkZXZpY2UtPnNjc2kzYWRkciwgc2NzaTNhZGRyLAorCQkJc2l6ZW9mKGRldmljZS0+c2NzaTNhZGRyKSkgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCS8qIERldmljZSBpcyBub3Qgb24gdGhlIGxpc3QsIGFkZCBpdC4gKi8KKwlkZXZpY2UgPSBrbWFsbG9jKHNpemVvZigqZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2UpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm91dCBvZiBtZW1vcnkgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkoZGV2aWNlLT5zY3NpM2FkZHIsIHNjc2kzYWRkciwgc2l6ZW9mKGRldmljZS0+c2NzaTNhZGRyKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPm9mZmxpbmVfbGlzdCwgJmgtPm9mZmxpbmVfZGV2aWNlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKK30KKworLyogUHJpbnQgYSBtZXNzYWdlIGV4cGxhaW5pbmcgdmFyaW91cyBvZmZsaW5lIHZvbHVtZSBzdGF0ZXMgKi8KK3N0YXRpYyB2b2lkIGhwc2Ffc2hvd192b2x1bWVfc3RhdHVzKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqc2QpCit7CisJaWYgKHNkLT52b2x1bWVfb2ZmbGluZSA9PSBIUFNBX1ZQRF9MVl9TVEFUVVNfVU5TVVBQT1JURUQpCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSB0aHJvdWdoIHZpdGFsIHByb2R1Y3QgZGF0YSBwYWdlcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwlzd2l0Y2ggKHNkLT52b2x1bWVfb2ZmbGluZSkgeworCWNhc2UgSFBTQV9MVl9PSzoKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfRVJBU0U6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyB1bmRlcmdvaW5nIGJhY2tncm91bmQgZXJhc2UgcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfUlBJOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgdW5kZXJnb2luZyByYXBpZCBwYXJpdHkgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1BFTkRJTkdfUlBJOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIHF1ZXVlZCBmb3IgcmFwaWQgcGFyaXR5IGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4iLAorCQkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9OT19LRVk6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBiZWNhdXNlIGtleSBpcyBub3QgcHJlc2VudC5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1BMQUlOVEVYVF9JTl9FTkNSWVBUX09OTFlfQ09OVFJPTExFUjoKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIG5vdCBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBiZWNhdXNlIGNvbnRyb2xsZXIgaXMgaW4gZW5jcnlwdGlvbi1vbmx5IG1vZGUuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT046CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyB1bmRlcmdvaW5nIGVuY3J5cHRpb24gcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfRU5DUllQVElPTl9SRUtFWUlORzoKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIHVuZGVyZ29pbmcgZW5jcnlwdGlvbiByZS1rZXlpbmcgcHJvY2Vzcy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9JTl9OT05fRU5DUllQVEVEX0NPTlRST0xMRVI6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBiZWNhdXNlIGNvbnRyb2xsZXIgZG9lcyBub3QgaGF2ZSBlbmNyeXB0aW9uIGVuYWJsZWQuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9QRU5ESU5HX0VOQ1JZUFRJT046CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBwZW5kaW5nIG1pZ3JhdGlvbiB0byBlbmNyeXB0ZWQgc3RhdGUsIGJ1dCBwcm9jZXNzIGhhcyBub3Qgc3RhcnRlZC5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJY2FzZSBIUFNBX0xWX1BFTkRJTkdfRU5DUllQVElPTl9SRUtFWUlORzoKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIGVuY3J5cHRlZCBhbmQgaXMgcGVuZGluZyBlbmNyeXB0aW9uIHJla2V5aW5nLlxuIiwKKwkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCXNkLT5idXMsIHNkLT50YXJnZXQsIHNkLT5sdW4pOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGFkanVzdF9ocHNhX3Njc2lfdGFibGUoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IGhvc3RubywKIAlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpzZFtdLCBpbnQgbnNkcykKIHsKQEAgLTEwMDQsNiArMTMxMiwyMCBAQAogCWZvciAoaSA9IDA7IGkgPCBuc2RzOyBpKyspIHsKIAkJaWYgKCFzZFtpXSkgLyogaWYgYWxyZWFkeSBhZGRlZCBhYm92ZS4gKi8KIAkJCWNvbnRpbnVlOworCisJCS8qIERvbid0IGFkZCBkZXZpY2VzIHdoaWNoIGFyZSBOT1QgUkVBRFksIEZPUk1BVCBJTiBQUk9HUkVTUworCQkgKiBhcyB0aGUgU0NTSSBtaWQtbGF5ZXIgZG9lcyBub3QgaGFuZGxlIHN1Y2ggZGV2aWNlcyB3ZWxsLgorCQkgKiBJdCByZWxlbnRsZXNzbHkgbG9vcHMgc2VuZGluZyBUVVIgYXQgM0h6LCB0aGVuIFJFQUQoMTApCisJCSAqIGF0IDE2MEh6LCBhbmQgcHJldmVudHMgdGhlIHN5c3RlbSBmcm9tIGNvbWluZyB1cC4KKwkJICovCisJCWlmIChzZFtpXS0+dm9sdW1lX29mZmxpbmUpIHsKKwkJCWhwc2Ffc2hvd192b2x1bWVfc3RhdHVzKGgsIHNkW2ldKTsKKwkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJjJWRiJWR0JWRsJWQ6IHRlbXBvcmFyaWx5IG9mZmxpbmVcbiIsCisJCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJCXNkW2ldLT5idXMsIHNkW2ldLT50YXJnZXQsIHNkW2ldLT5sdW4pOworCQkJY29udGludWU7CisJCX0KKwogCQlkZXZpY2VfY2hhbmdlID0gaHBzYV9zY3NpX2ZpbmRfZW50cnkoc2RbaV0sIGgtPmRldiwKIAkJCQkJaC0+bmRldmljZXMsICZlbnRyeSk7CiAJCWlmIChkZXZpY2VfY2hhbmdlID09IERFVklDRV9OT1RfRk9VTkQpIHsKQEAgLTEwMjIsNiArMTM0NCwxNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5kZXZsb2NrLCBmbGFncyk7CiAKKwkvKiBNb25pdG9yIGRldmljZXMgd2hpY2ggYXJlIGluIG9uZSBvZiBzZXZlcmFsIE5PVCBSRUFEWSBzdGF0ZXMgdG8gYmUKKwkgKiBicm91Z2h0IG9ubGluZSBsYXRlci4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aG91dCBob2xkaW5nIGgtPmRldmxvY2ssCisJICogc28gZG9uJ3QgdG91Y2ggaC0+ZGV2W10KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnNkczsgaSsrKSB7CisJCWlmICghc2RbaV0pIC8qIGlmIGFscmVhZHkgYWRkZWQgYWJvdmUuICovCisJCQljb250aW51ZTsKKwkJaWYgKHNkW2ldLT52b2x1bWVfb2ZmbGluZSkKKwkJCWhwc2FfbW9uaXRvcl9vZmZsaW5lX2RldmljZShoLCBzZFtpXS0+c2NzaTNhZGRyKTsKKwl9CisKIAkvKiBEb24ndCBub3RpZnkgc2NzaSBtaWQgbGF5ZXIgb2YgYW55IGNoYW5nZXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAogCSAqIChvciBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcykgc2NzaV9zY2FuX2hvc3Qgd2lsbCBkbyBpdCBsYXRlciB0aGUKIAkgKiBmaXJzdCB0aW1lIHRocm91Z2guCkBAIC0xMTg3LDExICsxNTIwLDE2MyBAQAogCXBjaV91bm1hcF9zaW5nbGUoaC0+cGRldiwgdGVtcDY0LnZhbCwgY2hhaW5fc2ctPkxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiB9CiAKKworLyogRGVjb2RlIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGVycm9ycyBvbiBpb2FjY2VsMiBwYXRoLgorICogUmV0dXJuIDEgZm9yIGFueSBlcnJvciB0aGF0IHNob3VsZCBnZW5lcmF0ZSBhIFJBSUQgcGF0aCByZXRyeS4KKyAqIFJldHVybiAwIGZvciBlcnJvcnMgdGhhdCBkb24ndCByZXF1aXJlIGEgUkFJRCBwYXRoIHJldHJ5LgorICovCitzdGF0aWMgaW50IGhhbmRsZV9pb2FjY2VsX21vZGUyX2Vycm9yKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYywKKwkJCQkJc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJCQlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqYzIpCit7CisJaW50IGRhdGFfbGVuOworCWludCByZXRyeSA9IDA7CisKKwlzd2l0Y2ggKGMyLT5lcnJvcl9kYXRhLnNlcnZfcmVzcG9uc2UpIHsKKwljYXNlIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfQ09NUExFVEU6CisJCXN3aXRjaCAoYzItPmVycm9yX2RhdGEuc3RhdHVzKSB7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9HT09EOgorCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9DSEtfQ09ORDoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggY2hlY2sgY29uZGl0aW9uLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJCWlmIChjMi0+ZXJyb3JfZGF0YS5kYXRhX3ByZXNlbnQgIT0KKwkJCQkJSU9BQ0NFTDJfU0VOU0VfREFUQV9QUkVTRU5UKQorCQkJCWJyZWFrOworCQkJLyogY29weSB0aGUgc2Vuc2UgZGF0YSAqLworCQkJZGF0YV9sZW4gPSBjMi0+ZXJyb3JfZGF0YS5zZW5zZV9kYXRhX2xlbjsKKwkJCWlmIChkYXRhX2xlbiA+IFNDU0lfU0VOU0VfQlVGRkVSU0laRSkKKwkJCQlkYXRhX2xlbiA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwkJCWlmIChkYXRhX2xlbiA+IHNpemVvZihjMi0+ZXJyb3JfZGF0YS5zZW5zZV9kYXRhX2J1ZmYpKQorCQkJCWRhdGFfbGVuID0KKwkJCQkJc2l6ZW9mKGMyLT5lcnJvcl9kYXRhLnNlbnNlX2RhdGFfYnVmZik7CisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsCisJCQkJYzItPmVycm9yX2RhdGEuc2Vuc2VfZGF0YV9idWZmLCBkYXRhX2xlbik7CisJCQljbWQtPnJlc3VsdCB8PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX0JVU1k6CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogdGFzayBjb21wbGV0ZSB3aXRoIEJVU1kgc3RhdHVzLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJCXJldHJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfUkVTX0NPTjoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggcmVzZXJ2YXRpb24gY29uZmxpY3QuXG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQkJcmV0cnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9TRVRfRlVMTDoKKwkJCS8qIE1ha2Ugc2NzaSBtaWRsYXllciBkbyB1bmxpbWl0ZWQgcmV0cmllcyAqLworCQkJY21kLT5yZXN1bHQgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9BQk9SVEVEOgorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHRhc2sgY29tcGxldGUgd2l0aCBhYm9ydGVkIHN0YXR1cy5cbiIsCisJCQkJIkhQIFNTRCBTbWFydCBQYXRoIik7CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggdW5yZWNvZ25pemVkIHN0YXR1czogMHglMDJ4XG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIsIGMyLT5lcnJvcl9kYXRhLnN0YXR1cyk7CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfRkFJTFVSRToKKwkJLyogZG9uJ3QgZXhwZWN0IHRvIGdldCBoZXJlLiAqLworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJInVuZXhwZWN0ZWQgZGVsaXZlcnkgb3IgdGFyZ2V0IGZhaWx1cmUsIHN0YXR1cyA9IDB4JTAyeFxuIiwKKwkJCWMyLT5lcnJvcl9kYXRhLnN0YXR1cyk7CisJCXJldHJ5ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9DT01QTEVURToKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9TVUNDRVNTOgorCQlicmVhazsKKwljYXNlIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfVE1GX1JFSkVDVEVEOgorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uIHJlamVjdGVkLlxuIik7CisJCXJldHJ5ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9XUk9OR19MVU46CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJ0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24gaW52YWxpZCBMVU5cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJIiVzOiBVbnJlY29nbml6ZWQgc2VydmVyIHJlc3BvbnNlOiAweCUwMnhcbiIsCisJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiLAorCQkJYzItPmVycm9yX2RhdGEuc2Vydl9yZXNwb25zZSk7CisJCXJldHJ5ID0gMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHJ5OwkvKiByZXRyeSBvbiByYWlkIHBhdGg/ICovCit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaW9hY2NlbDJfY29tcGxldGlvbihzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2KQoreworCXN0cnVjdCBpb19hY2NlbDJfY21kICpjMiA9ICZoLT5pb2FjY2VsMl9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJaW50IHJhaWRfcmV0cnkgPSAwOworCisJLyogY2hlY2sgZm9yIGdvb2Qgc3RhdHVzICovCisJaWYgKGxpa2VseShjMi0+ZXJyb3JfZGF0YS5zZXJ2X3Jlc3BvbnNlID09IDAgJiYKKwkJCWMyLT5lcnJvcl9kYXRhLnN0YXR1cyA9PSAwKSkgeworCQljbWRfZnJlZShoLCBjKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFueSBSQUlEIG9mZmxvYWQgZXJyb3IgcmVzdWx0cyBpbiByZXRyeSB3aGljaCB3aWxsIHVzZQorCSAqIHRoZSBub3JtYWwgSS9PIHBhdGggc28gdGhlIGNvbnRyb2xsZXIgY2FuIGhhbmRsZSB3aGF0ZXZlcidzCisJICogd3JvbmcuCisJICovCisJaWYgKGlzX2xvZ2ljYWxfZGV2X2FkZHJfbW9kZShkZXYtPnNjc2kzYWRkcikgJiYKKwkJYzItPmVycm9yX2RhdGEuc2Vydl9yZXNwb25zZSA9PQorCQkJSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9GQUlMVVJFKSB7CisJCWlmIChjMi0+ZXJyb3JfZGF0YS5zdGF0dXMgPT0KKwkJCUlPQUNDRUwyX1NUQVRVU19TUl9JT0FDQ0VMX0RJU0FCTEVEKQorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFBhdGggaXMgdW5hdmFpbGFibGUsIHJldHJ5aW5nIG9uIHN0YW5kYXJkIHBhdGguXG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQllbHNlCisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogRXJyb3IgMHglMDJ4LCByZXRyeWluZyBvbiBzdGFuZGFyZCBwYXRoLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiLCBjMi0+ZXJyb3JfZGF0YS5zdGF0dXMpOworCisJCWRldi0+b2ZmbG9hZF9lbmFibGVkID0gMDsKKwkJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAxOwkvKiBzY2hlZHVsZSBjb250cm9sbGVyIGZvciBhIHJlc2NhbiAqLworCQljbWQtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworCQljbWRfZnJlZShoLCBjKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJcmV0dXJuOworCX0KKwlyYWlkX3JldHJ5ID0gaGFuZGxlX2lvYWNjZWxfbW9kZTJfZXJyb3IoaCwgYywgY21kLCBjMik7CisJLyogSWYgZXJyb3IgZm91bmQsIGRpc2FibGUgU21hcnQgUGF0aCwgc2NoZWR1bGUgYSByZXNjYW4sCisJICogYW5kIGZvcmNlIGEgcmV0cnkgb24gdGhlIHN0YW5kYXJkIHBhdGguCisJICovCisJaWYgKHJhaWRfcmV0cnkpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIiVzOiBSZXRyeWluZyBvbiBzdGFuZGFyZCBwYXRoLlxuIiwKKwkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQlkZXYtPm9mZmxvYWRfZW5hYmxlZCA9IDA7IC8qIERpc2FibGUgU21hcnQgUGF0aCAqLworCQloLT5kcnZfcmVxX3Jlc2NhbiA9IDE7CSAgLyogc2NoZWR1bGUgY29udHJvbGxlciByZXNjYW4gKi8KKwkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwl9CisJY21kX2ZyZWUoaCwgYyk7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKK30KKwogc3RhdGljIHZvaWQgY29tcGxldGVfc2NzaV9jb21tYW5kKHN0cnVjdCBDb21tYW5kTGlzdCAqY3ApCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCXN0cnVjdCBjdGxyX2luZm8gKmg7CiAJc3RydWN0IEVycm9ySW5mbyAqZWk7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2OwogCiAJdW5zaWduZWQgY2hhciBzZW5zZV9rZXk7CiAJdW5zaWduZWQgY2hhciBhc2M7ICAgICAgLyogYWRkaXRpb25hbCBzZW5zZSBjb2RlICovCkBAIC0xMjAxLDEzICsxNjg2LDE5IEBACiAJZWkgPSBjcC0+ZXJyX2luZm87CiAJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY3AtPnNjc2lfY21kOwogCWggPSBjcC0+aDsKKwlkZXYgPSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CiAKIAlzY3NpX2RtYV91bm1hcChjbWQpOyAvKiB1bmRvIHRoZSBETUEgbWFwcGluZ3MgKi8KLQlpZiAoY3AtPkhlYWRlci5TR1RvdGFsID4gaC0+bWF4X2NtZF9zZ19lbnRyaWVzKQorCWlmICgoY3AtPmNtZF90eXBlID09IENNRF9TQ1NJKSAmJgorCQkoY3AtPkhlYWRlci5TR1RvdGFsID4gaC0+bWF4X2NtZF9zZ19lbnRyaWVzKSkKIAkJaHBzYV91bm1hcF9zZ19jaGFpbl9ibG9jayhoLCBjcCk7CiAKIAljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOyAJCS8qIGhvc3QgYnl0ZSAqLwogCWNtZC0+cmVzdWx0IHw9IChDT01NQU5EX0NPTVBMRVRFIDw8IDgpOwkvKiBtc2cgYnl0ZSAqLworCisJaWYgKGNwLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDIpCisJCXJldHVybiBwcm9jZXNzX2lvYWNjZWwyX2NvbXBsZXRpb24oaCwgY3AsIGNtZCwgZGV2KTsKKwogCWNtZC0+cmVzdWx0IHw9IGVpLT5TY3NpU3RhdHVzOwogCiAJLyogY29weSB0aGUgc2Vuc2UgZGF0YSB3aGV0aGVyIHdlIG5lZWQgdG8gb3Igbm90LiAqLwpAQCAtMTIyNyw2ICsxNzE4LDMyIEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBGb3IgSS9PIGFjY2VsZXJhdG9yIGNvbW1hbmRzLCBjb3B5IG92ZXIgc29tZSBmaWVsZHMgdG8gdGhlIG5vcm1hbAorCSAqIENJU1MgaGVhZGVyIHVzZWQgYmVsb3cgZm9yIGVycm9yIGhhbmRsaW5nLgorCSAqLworCWlmIChjcC0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwxKSB7CisJCXN0cnVjdCBpb19hY2NlbDFfY21kICpjID0gJmgtPmlvYWNjZWxfY21kX3Bvb2xbY3AtPmNtZGluZGV4XTsKKwkJY3AtPkhlYWRlci5TR0xpc3QgPSBjcC0+SGVhZGVyLlNHVG90YWwgPSBzY3NpX3NnX2NvdW50KGNtZCk7CisJCWNwLT5SZXF1ZXN0LkNEQkxlbiA9IGMtPmlvX2ZsYWdzICYgSU9BQ0NFTDFfSU9GTEFHU19DREJMRU5fTUFTSzsKKwkJY3AtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5UYWcubG93ZXI7CisJCWNwLT5IZWFkZXIuVGFnLnVwcGVyID0gYy0+VGFnLnVwcGVyOworCQltZW1jcHkoY3AtPkhlYWRlci5MVU4uTHVuQWRkckJ5dGVzLCBjLT5DSVNTX0xVTiwgOCk7CisJCW1lbWNweShjcC0+UmVxdWVzdC5DREIsIGMtPkNEQiwgY3AtPlJlcXVlc3QuQ0RCTGVuKTsKKworCQkvKiBBbnkgUkFJRCBvZmZsb2FkIGVycm9yIHJlc3VsdHMgaW4gcmV0cnkgd2hpY2ggd2lsbCB1c2UKKwkJICogdGhlIG5vcm1hbCBJL08gcGF0aCBzbyB0aGUgY29udHJvbGxlciBjYW4gaGFuZGxlIHdoYXRldmVyJ3MKKwkJICogd3JvbmcuCisJCSAqLworCQlpZiAoaXNfbG9naWNhbF9kZXZfYWRkcl9tb2RlKGRldi0+c2NzaTNhZGRyKSkgeworCQkJaWYgKGVpLT5Db21tYW5kU3RhdHVzID09IENNRF9JT0FDQ0VMX0RJU0FCTEVEKQorCQkJCWRldi0+b2ZmbG9hZF9lbmFibGVkID0gMDsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisJCQljbWRfZnJlZShoLCBjcCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJLyogYW4gZXJyb3IgaGFzIG9jY3VycmVkICovCiAJc3dpdGNoIChlaS0+Q29tbWFuZFN0YXR1cykgewogCkBAIC0xMzg5LDYgKzE5MDYsMTQgQEAKIAkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CiAJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJDb21tYW5kIHVuYWJvcnRhYmxlXG4iKTsKIAkJYnJlYWs7CisJY2FzZSBDTURfSU9BQ0NFTF9ESVNBQkxFRDoKKwkJLyogVGhpcyBvbmx5IGhhbmRsZXMgdGhlIGRpcmVjdCBwYXNzLXRocm91Z2ggY2FzZSBzaW5jZSBSQUlECisJCSAqIG9mZmxvYWQgaXMgaGFuZGxlZCBhYm92ZS4gIEp1c3QgYXR0ZW1wdCBhIHJldHJ5LgorCQkgKi8KKwkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiY3AgJXAgaGFkIEhQIFNTRCBTbWFydCBQYXRoIGVycm9yXG4iLCBjcCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY3AgJXAgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJXhcbiIsCkBAIC0xNDM4LDYgKzE5NjMsNyBAQAogCWNwLT5TR1swXS5BZGRyLnVwcGVyID0KIAkgICh1MzIpICgoYWRkcjY0ID4+IDMyKSAmICh1NjQpIDB4MDAwMDAwMDBGRkZGRkZGRik7CiAJY3AtPlNHWzBdLkxlbiA9IGJ1ZmxlbjsKKwljcC0+U0dbMF0uRXh0ID0gSFBTQV9TR19MQVNUOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCiAJY3AtPkhlYWRlci5TR0xpc3QgPSAodTgpIDE7ICAgLyogbm8uIFNHcyBjb250aWcgaW4gdGhpcyBjbWQgKi8KIAljcC0+SGVhZGVyLlNHVG90YWwgPSAodTE2KSAxOyAvKiB0b3RhbCBzZ3MgaW4gdGhpcyBjbWQgbGlzdCAqLwogCXJldHVybiAwOwpAQCAtMTQ5MCwxNyArMjAxNiwzNyBAQAogCWhwc2FfcGNpX3VubWFwKGgtPnBkZXYsIGMsIDEsIGRhdGFfZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIHZvaWQgaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihzdHJ1Y3QgQ29tbWFuZExpc3QgKmNwKQorc3RhdGljIHZvaWQgaHBzYV9wcmludF9jbWQoc3RydWN0IGN0bHJfaW5mbyAqaCwgY2hhciAqdHh0LAorCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYykKIHsKLQlzdHJ1Y3QgRXJyb3JJbmZvICplaTsKLQlzdHJ1Y3QgZGV2aWNlICpkID0gJmNwLT5oLT5wZGV2LT5kZXY7CisJY29uc3QgdTggKmNkYiA9IGMtPlJlcXVlc3QuQ0RCOworCWNvbnN0IHU4ICpsdW4gPSBjLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlczsKIAotCWVpID0gY3AtPmVycl9pbmZvOworCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICIlczogTFVOOiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IgorCSIgQ0RCOiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCXR4dCwgbHVuWzBdLCBsdW5bMV0sIGx1blsyXSwgbHVuWzNdLAorCQlsdW5bNF0sIGx1bls1XSwgbHVuWzZdLCBsdW5bN10sCisJCWNkYlswXSwgY2RiWzFdLCBjZGJbMl0sIGNkYlszXSwKKwkJY2RiWzRdLCBjZGJbNV0sIGNkYls2XSwgY2RiWzddLAorCQljZGJbOF0sIGNkYls5XSwgY2RiWzEwXSwgY2RiWzExXSwKKwkJY2RiWzEyXSwgY2RiWzEzXSwgY2RiWzE0XSwgY2RiWzE1XSk7Cit9CisKK3N0YXRpYyB2b2lkIGhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3Ioc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCXN0cnVjdCBDb21tYW5kTGlzdCAqY3ApCit7CisJY29uc3Qgc3RydWN0IEVycm9ySW5mbyAqZWkgPSBjcC0+ZXJyX2luZm87CisJc3RydWN0IGRldmljZSAqZCA9ICZjcC0+aC0+cGRldi0+ZGV2OworCWNvbnN0IHU4ICpzZCA9IGVpLT5TZW5zZUluZm87CisKIAlzd2l0Y2ggKGVpLT5Db21tYW5kU3RhdHVzKSB7CiAJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJZGV2X3dhcm4oZCwgImNtZCAlcCBoYXMgY29tcGxldGVkIHdpdGggZXJyb3JzXG4iLCBjcCk7Ci0JCWRldl93YXJuKGQsICJjbWQgJXAgaGFzIFNDU0kgU3RhdHVzID0gJXhcbiIsIGNwLAotCQkJCWVpLT5TY3NpU3RhdHVzKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgIlNDU0kgc3RhdHVzIiwgY3ApOworCQlpZiAoZWktPlNjc2lTdGF0dXMgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKQorCQkJZGV2X3dhcm4oZCwgIlNDU0kgU3RhdHVzID0gMDIsIFNlbnNlIGtleSA9ICUwMngsIEFTQyA9ICUwMngsIEFTQ1EgPSAlMDJ4XG4iLAorCQkJCXNkWzJdICYgMHgwZiwgc2RbMTJdLCBzZFsxM10pOworCQllbHNlCisJCQlkZXZfd2FybihkLCAiU0NTSSBTdGF0dXMgPSAlMDJ4XG4iLCBlaS0+U2NzaVN0YXR1cyk7CiAJCWlmIChlaS0+U2NzaVN0YXR1cyA9PSAwKQogCQkJZGV2X3dhcm4oZCwgIlNDU0kgc3RhdHVzIGlzIGFibm9ybWFsbHkgemVyby4gICIKIAkJCSIocHJvYmFibHkgaW5kaWNhdGVzIHNlbGVjdGlvbiB0aW1lb3V0ICIKQEAgLTE1MDgsNTQgKzIwNTQsNTEgQEAKIAkJCSJmaXJtd2FyZSBidWcsIGNpcmNhIEp1bHksIDIwMDEuKVxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0RBVEFfVU5ERVJSVU46IC8qIGxldCBtaWQgbGF5ZXIgaGFuZGxlIGl0LiAqLwotCQkJZGV2X2luZm8oZCwgIlVOREVSUlVOXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfREFUQV9PVkVSUlVOOgotCQlkZXZfd2FybihkLCAiY3AgJXAgaGFzIGNvbXBsZXRlZCB3aXRoIGRhdGEgb3ZlcnJ1blxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAib3ZlcnJ1biBjb25kaXRpb24iLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0lOVkFMSUQ6IHsKIAkJLyogY29udHJvbGxlciB1bmZvcnR1bmF0ZWx5IHJlcG9ydHMgU0NTSSBwYXNzdGhydSdzCiAJCSAqIHRvIG5vbi1leGlzdGVudCB0YXJnZXRzIGFzIGludmFsaWQgY29tbWFuZHMuCiAJCSAqLwotCQlkZXZfd2FybihkLCAiY3AgJXAgaXMgcmVwb3J0ZWQgaW52YWxpZCAocHJvYmFibHkgbWVhbnMgIgotCQkJInRhcmdldCBkZXZpY2Ugbm8gbG9uZ2VyIHByZXNlbnQpXG4iLCBjcCk7Ci0JCS8qIHByaW50X2J5dGVzKCh1bnNpZ25lZCBjaGFyICopIGNwLCBzaXplb2YoKmNwKSwgMSwgMCk7Ci0JCXByaW50X2NtZChjcCk7ICAqLworCQlocHNhX3ByaW50X2NtZChoLCAiaW52YWxpZCBjb21tYW5kIiwgY3ApOworCQlkZXZfd2FybihkLCAicHJvYmFibHkgbWVhbnMgZGV2aWNlIG5vIGxvbmdlciBwcmVzZW50XG4iKTsKIAkJfQogCQlicmVhazsKIAljYXNlIENNRF9QUk9UT0NPTF9FUlI6Ci0JCWRldl93YXJuKGQsICJjcCAlcCBoYXMgcHJvdG9jb2wgZXJyb3IgXG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJwcm90b2NvbCBlcnJvciIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfSEFSRFdBUkVfRVJSOgotCQkvKiBjbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsgKi8KLQkJZGV2X3dhcm4oZCwgImNwICVwIGhhZCBoYXJkd2FyZSBlcnJvclxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAiaGFyZHdhcmUgZXJyb3IiLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0NPTk5FQ1RJT05fTE9TVDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIGhhZCBjb25uZWN0aW9uIGxvc3RcbiIsIGNwKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgImNvbm5lY3Rpb24gbG9zdCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfQUJPUlRFRDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIHdhcyBhYm9ydGVkXG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJhYm9ydGVkIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9BQk9SVF9GQUlMRUQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCByZXBvcnRzIGFib3J0IGZhaWxlZFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAiYWJvcnQgZmFpbGVkIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9VTlNPTElDSVRFRF9BQk9SVDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIGFib3J0ZWQgZHVlIHRvIGFuIHVuc29saWNpdGVkIGFib3J0XG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJ1bnNvbGljaXRlZCBhYm9ydCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfVElNRU9VVDoKLQkJZGV2X3dhcm4oZCwgImNwICVwIHRpbWVkIG91dFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAidGltZWQgb3V0IiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9VTkFCT1JUQUJMRToKLQkJZGV2X3dhcm4oZCwgIkNvbW1hbmQgdW5hYm9ydGFibGVcbiIpOworCQlocHNhX3ByaW50X2NtZChoLCAidW5hYm9ydGFibGUiLCBjcCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCByZXR1cm5lZCB1bmtub3duIHN0YXR1cyAleFxuIiwgY3AsCisJCWhwc2FfcHJpbnRfY21kKGgsICJ1bmtub3duIHN0YXR1cyIsIGNwKTsKKwkJZGV2X3dhcm4oZCwgIlVua25vd24gY29tbWFuZCBzdGF0dXMgJXhcbiIsCiAJCQkJZWktPkNvbW1hbmRTdGF0dXMpOwogCX0KIH0KIAogc3RhdGljIGludCBocHNhX3Njc2lfZG9faW5xdWlyeShzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCi0JCQl1bnNpZ25lZCBjaGFyIHBhZ2UsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCXUxNiBwYWdlLCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCQl1bnNpZ25lZCBjaGFyIGJ1ZnNpemUpCiB7CiAJaW50IHJjID0gSU9fT0s7CkBAIC0xNTc3LDcgKzIxMjAsNyBAQAogCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX3dpdGhfcmV0cnkoaCwgYywgUENJX0RNQV9GUk9NREVWSUNFKTsKIAllaSA9IGMtPmVycl9pbmZvOwogCWlmIChlaS0+Q29tbWFuZFN0YXR1cyAhPSAwICYmIGVpLT5Db21tYW5kU3RhdHVzICE9IENNRF9EQVRBX1VOREVSUlVOKSB7Ci0JCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoYyk7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CiAJCXJjID0gLTE7CiAJfQogb3V0OgpAQCAtMTU4NSw3ICsyMTI4LDM5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGhwc2Ffc2VuZF9yZXNldChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIpCitzdGF0aWMgaW50IGhwc2FfYm1pY19jdHJsX21vZGVfc2Vuc2Uoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCB1bnNpZ25lZCBjaGFyIHBhZ2UsCisJCXN0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycyAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlpbnQgcmMgPSBJT19PSzsKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CisJc3RydWN0IEVycm9ySW5mbyAqZWk7CisKKwljID0gY21kX3NwZWNpYWxfYWxsb2MoaCk7CisKKwlpZiAoYyA9PSBOVUxMKSB7CQkJLyogdHJvdWJsZS4uLiAqLworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY21kX3NwZWNpYWxfYWxsb2MgcmV0dXJuZWQgTlVMTCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZmlsbF9jbWQoYywgQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlMsIGgsIGJ1ZiwgYnVmc2l6ZSwKKwkJCXBhZ2UsIHNjc2kzYWRkciwgVFlQRV9DTUQpKSB7CisJCXJjID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF93aXRoX3JldHJ5KGgsIGMsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZWkgPSBjLT5lcnJfaW5mbzsKKwlpZiAoZWktPkNvbW1hbmRTdGF0dXMgIT0gMCAmJiBlaS0+Q29tbWFuZFN0YXR1cyAhPSBDTURfREFUQV9VTkRFUlJVTikgeworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOworCQlyYyA9IC0xOworCX0KK291dDoKKwljbWRfc3BlY2lhbF9mcmVlKGgsIGMpOworCXJldHVybiByYzsKKwl9CisKK3N0YXRpYyBpbnQgaHBzYV9zZW5kX3Jlc2V0KHN0cnVjdCBjdGxyX2luZm8gKmgsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKKwl1OCByZXNldF90eXBlKQogewogCWludCByYyA9IElPX09LOwogCXN0cnVjdCBDb21tYW5kTGlzdCAqYzsKQEAgLTE1OTksMTQgKzIxNzQsMTUgQEAKIAl9CiAKIAkvKiBmaWxsX2NtZCBjYW4ndCBmYWlsIGhlcmUsIG5vIGRhdGEgYnVmZmVyIHRvIG1hcC4gKi8KLQkodm9pZCkgZmlsbF9jbWQoYywgSFBTQV9ERVZJQ0VfUkVTRVRfTVNHLCBoLAotCQkJTlVMTCwgMCwgMCwgc2NzaTNhZGRyLCBUWVBFX01TRyk7CisJKHZvaWQpIGZpbGxfY21kKGMsIEhQU0FfREVWSUNFX1JFU0VUX01TRywgaCwgTlVMTCwgMCwgMCwKKwkJCXNjc2kzYWRkciwgVFlQRV9NU0cpOworCWMtPlJlcXVlc3QuQ0RCWzFdID0gcmVzZXRfdHlwZTsgLyogZmlsbF9jbWQgZGVmYXVsdHMgdG8gTFVOIHJlc2V0ICovCiAJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKIAkvKiBubyB1bm1hcCBuZWVkZWQgaGVyZSBiZWNhdXNlIG5vIGRhdGEgeGZlci4gKi8KIAogCWVpID0gYy0+ZXJyX2luZm87CiAJaWYgKGVpLT5Db21tYW5kU3RhdHVzICE9IDApIHsKLQkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihjKTsKKwkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihoLCBjKTsKIAkJcmMgPSAtMTsKIAl9CiAJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKQEAgLTE2MjMsNyArMjE5OSw3IEBACiAJYnVmID0ga3phbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybjsKLQlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgMHhDMSwgYnVmLCA2NCk7CisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgMHhDMSwgYnVmLCA2NCk7CiAJaWYgKHJjID09IDApCiAJCSpyYWlkX2xldmVsID0gYnVmWzhdOwogCWlmICgqcmFpZF9sZXZlbCA+IFJBSURfVU5LTk9XTikKQEAgLTE2MzIsNiArMjIwOCwyMDQgQEAKIAlyZXR1cm47CiB9CiAKKyNkZWZpbmUgSFBTQV9NQVBfREVCVUcKKyNpZmRlZiBIUFNBX01BUF9ERUJVRworc3RhdGljIHZvaWQgaHBzYV9kZWJ1Z19tYXBfYnVmZihzdHJ1Y3QgY3Rscl9pbmZvICpoLCBpbnQgcmMsCisJCQkJc3RydWN0IHJhaWRfbWFwX2RhdGEgKm1hcF9idWZmKQoreworCXN0cnVjdCByYWlkX21hcF9kaXNrX2RhdGEgKmRkID0gJm1hcF9idWZmLT5kYXRhWzBdOworCWludCBtYXAsIHJvdywgY29sOworCXUxNiBtYXBfY250LCByb3dfY250LCBkaXNrc19wZXJfcm93OworCisJaWYgKHJjICE9IDApCisJCXJldHVybjsKKworCS8qIFNob3cgZGV0YWlscyBvbmx5IGlmIGRlYnVnZ2luZyBoYXMgYmVlbiBhY3RpdmF0ZWQuICovCisJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA8IDIpCisJCXJldHVybjsKKworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJzdHJ1Y3R1cmVfc2l6ZSA9ICV1XG4iLAorCQkJCWxlMzJfdG9fY3B1KG1hcF9idWZmLT5zdHJ1Y3R1cmVfc2l6ZSkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJ2b2x1bWVfYmxrX3NpemUgPSAldVxuIiwKKwkJCWxlMzJfdG9fY3B1KG1hcF9idWZmLT52b2x1bWVfYmxrX3NpemUpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAidm9sdW1lX2Jsa19jbnQgPSAweCVsbHhcbiIsCisJCQlsZTY0X3RvX2NwdShtYXBfYnVmZi0+dm9sdW1lX2Jsa19jbnQpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAicGh5c2ljYWxCbG9ja1NoaWZ0ID0gJXVcbiIsCisJCQltYXBfYnVmZi0+cGh5c19ibGtfc2hpZnQpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJwYXJpdHlfcm90YXRpb25fc2hpZnQgPSAldVxuIiwKKwkJCW1hcF9idWZmLT5wYXJpdHlfcm90YXRpb25fc2hpZnQpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJzdHJpcF9zaXplID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+c3RyaXBfc2l6ZSkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJkaXNrX3N0YXJ0aW5nX2JsayA9IDB4JWxseFxuIiwKKwkJCWxlNjRfdG9fY3B1KG1hcF9idWZmLT5kaXNrX3N0YXJ0aW5nX2JsaykpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJkaXNrX2Jsa19jbnQgPSAweCVsbHhcbiIsCisJCQlsZTY0X3RvX2NwdShtYXBfYnVmZi0+ZGlza19ibGtfY250KSk7CisJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImRhdGFfZGlza3NfcGVyX3JvdyA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPmRhdGFfZGlza3NfcGVyX3JvdykpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJtZXRhZGF0YV9kaXNrc19wZXJfcm93ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+bWV0YWRhdGFfZGlza3NfcGVyX3JvdykpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJyb3dfY250ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+cm93X2NudCkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJsYXlvdXRfbWFwX2NvdW50ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+bGF5b3V0X21hcF9jb3VudCkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJmbGFncyA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPmZsYWdzKSk7CisJaWYgKG1hcF9idWZmLT5mbGFncyAmIFJBSURfTUFQX0ZMQUdfRU5DUllQVF9PTikKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImVuY3J5cHl0aW9uID0gT05cbiIpOworCWVsc2UKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImVuY3J5cHl0aW9uID0gT0ZGXG4iKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiZGVraW5kZXggPSAldVxuIiwKKwkJCWxlMTZfdG9fY3B1KG1hcF9idWZmLT5kZWtpbmRleCkpOworCisJbWFwX2NudCA9IGxlMTZfdG9fY3B1KG1hcF9idWZmLT5sYXlvdXRfbWFwX2NvdW50KTsKKwlmb3IgKG1hcCA9IDA7IG1hcCA8IG1hcF9jbnQ7IG1hcCsrKSB7CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJNYXAldTpcbiIsIG1hcCk7CisJCXJvd19jbnQgPSBsZTE2X3RvX2NwdShtYXBfYnVmZi0+cm93X2NudCk7CisJCWZvciAocm93ID0gMDsgcm93IDwgcm93X2NudDsgcm93KyspIHsKKwkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICIgIFJvdyV1OlxuIiwgcm93KTsKKwkJCWRpc2tzX3Blcl9yb3cgPQorCQkJCWxlMTZfdG9fY3B1KG1hcF9idWZmLT5kYXRhX2Rpc2tzX3Blcl9yb3cpOworCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBkaXNrc19wZXJfcm93OyBjb2wrKywgZGQrKykKKwkJCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJCQkiICAgIEQlMDJ1OiBoPTB4JTA0eCB4b3I9JXUsJXVcbiIsCisJCQkJCWNvbCwgZGQtPmlvYWNjZWxfaGFuZGxlLAorCQkJCQlkZC0+eG9yX211bHRbMF0sIGRkLT54b3JfbXVsdFsxXSk7CisJCQlkaXNrc19wZXJfcm93ID0KKwkJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+bWV0YWRhdGFfZGlza3NfcGVyX3Jvdyk7CisJCQlmb3IgKGNvbCA9IDA7IGNvbCA8IGRpc2tzX3Blcl9yb3c7IGNvbCsrLCBkZCsrKQorCQkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkJCSIgICAgTSUwMnU6IGg9MHglMDR4IHhvcj0ldSwldVxuIiwKKwkJCQkJY29sLCBkZC0+aW9hY2NlbF9oYW5kbGUsCisJCQkJCWRkLT54b3JfbXVsdFswXSwgZGQtPnhvcl9tdWx0WzFdKTsKKwkJfQorCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBocHNhX2RlYnVnX21hcF9idWZmKF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBpbnQgcmMsCisJCQlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBzdHJ1Y3QgcmFpZF9tYXBfZGF0YSAqbWFwX2J1ZmYpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBocHNhX2dldF9yYWlkX21hcChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqdGhpc19kZXZpY2UpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CisJc3RydWN0IEVycm9ySW5mbyAqZWk7CisKKwljID0gY21kX3NwZWNpYWxfYWxsb2MoaCk7CisJaWYgKGMgPT0gTlVMTCkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY21kX3NwZWNpYWxfYWxsb2MgcmV0dXJuZWQgTlVMTCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGZpbGxfY21kKGMsIEhQU0FfR0VUX1JBSURfTUFQLCBoLCAmdGhpc19kZXZpY2UtPnJhaWRfbWFwLAorCQkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5yYWlkX21hcCksIDAsCisJCQlzY3NpM2FkZHIsIFRZUEVfQ01EKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiT3V0IG9mIG1lbW9yeSBpbiBocHNhX2dldF9yYWlkX21hcCgpXG4iKTsKKwkJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX3dpdGhfcmV0cnkoaCwgYywgUENJX0RNQV9GUk9NREVWSUNFKTsKKwllaSA9IGMtPmVycl9pbmZvOworCWlmIChlaS0+Q29tbWFuZFN0YXR1cyAhPSAwICYmIGVpLT5Db21tYW5kU3RhdHVzICE9IENNRF9EQVRBX1VOREVSUlVOKSB7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CisJCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CisJCXJldHVybiAtMTsKKwl9CisJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKKworCS8qIEB0b2RvIGluIHRoZSBmdXR1cmUsIGR5bmFtaWNhbGx5IGFsbG9jYXRlIFJBSUQgbWFwIG1lbW9yeSAqLworCWlmIChsZTMyX3RvX2NwdSh0aGlzX2RldmljZS0+cmFpZF9tYXAuc3RydWN0dXJlX3NpemUpID4KKwkJCQlzaXplb2YodGhpc19kZXZpY2UtPnJhaWRfbWFwKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiUkFJRCBtYXAgc2l6ZSBpcyB0b28gbGFyZ2UhXG4iKTsKKwkJcmMgPSAtMTsKKwl9CisJaHBzYV9kZWJ1Z19tYXBfYnVmZihoLCByYywgJnRoaXNfZGV2aWNlLT5yYWlkX21hcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGhwc2FfdnBkX3BhZ2Vfc3VwcG9ydGVkKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSwgdTggcGFnZSkKK3sKKwlpbnQgcmM7CisJaW50IGk7CisJaW50IHBhZ2VzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgYnVmc2l6ZTsKKworCWJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHBhZ2UgbGlzdCBmaXJzdCAqLworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLAorCQkJCVZQRF9QQUdFIHwgSFBTQV9WUERfU1VQUE9SVEVEX1BBR0VTLAorCQkJCWJ1ZiwgSFBTQV9WUERfSEVBREVSX1NaKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBleGl0X3Vuc3VwcG9ydGVkOworCXBhZ2VzID0gYnVmWzNdOworCWlmICgocGFnZXMgKyBIUFNBX1ZQRF9IRUFERVJfU1opIDw9IDI1NSkKKwkJYnVmc2l6ZSA9IHBhZ2VzICsgSFBTQV9WUERfSEVBREVSX1NaOworCWVsc2UKKwkJYnVmc2l6ZSA9IDI1NTsKKworCS8qIEdldCB0aGUgd2hvbGUgVlBEIHBhZ2UgbGlzdCAqLworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLAorCQkJCVZQRF9QQUdFIHwgSFBTQV9WUERfU1VQUE9SVEVEX1BBR0VTLAorCQkJCWJ1ZiwgYnVmc2l6ZSk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZXhpdF91bnN1cHBvcnRlZDsKKworCXBhZ2VzID0gYnVmWzNdOworCWZvciAoaSA9IDE7IGkgPD0gcGFnZXM7IGkrKykKKwkJaWYgKGJ1ZlszICsgaV0gPT0gcGFnZSkKKwkJCWdvdG8gZXhpdF9zdXBwb3J0ZWQ7CitleGl0X3Vuc3VwcG9ydGVkOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7CitleGl0X3N1cHBvcnRlZDoKKwlrZnJlZShidWYpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocHNhX2dldF9pb2FjY2VsX3N0YXR1cyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqdGhpc19kZXZpY2UpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1OCBpb2FjY2VsX3N0YXR1czsKKworCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2NvbmZpZyA9IDA7CisJdGhpc19kZXZpY2UtPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisKKwlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCWlmICghaHBzYV92cGRfcGFnZV9zdXBwb3J0ZWQoaCwgc2NzaTNhZGRyLCBIUFNBX1ZQRF9MVl9JT0FDQ0VMX1NUQVRVUykpCisJCWdvdG8gb3V0OworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLAorCQkJVlBEX1BBR0UgfCBIUFNBX1ZQRF9MVl9JT0FDQ0VMX1NUQVRVUywgYnVmLCA2NCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCisjZGVmaW5lIElPQUNDRUxfU1RBVFVTX0JZVEUgNAorI2RlZmluZSBPRkZMT0FEX0NPTkZJR1VSRURfQklUIDB4MDEKKyNkZWZpbmUgT0ZGTE9BRF9FTkFCTEVEX0JJVCAweDAyCisJaW9hY2NlbF9zdGF0dXMgPSBidWZbSU9BQ0NFTF9TVEFUVVNfQllURV07CisJdGhpc19kZXZpY2UtPm9mZmxvYWRfY29uZmlnID0KKwkJISEoaW9hY2NlbF9zdGF0dXMgJiBPRkZMT0FEX0NPTkZJR1VSRURfQklUKTsKKwlpZiAodGhpc19kZXZpY2UtPm9mZmxvYWRfY29uZmlnKSB7CisJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPQorCQkJISEoaW9hY2NlbF9zdGF0dXMgJiBPRkZMT0FEX0VOQUJMRURfQklUKTsKKwkJaWYgKGhwc2FfZ2V0X3JhaWRfbWFwKGgsIHNjc2kzYWRkciwgdGhpc19kZXZpY2UpKQorCQkJdGhpc19kZXZpY2UtPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisJfQorb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuOworfQorCiAvKiBHZXQgdGhlIGRldmljZSBpZCBmcm9tIGlucXVpcnkgcGFnZSAweDgzICovCiBzdGF0aWMgaW50IGhwc2FfZ2V0X2RldmljZV9pZChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCiAJdW5zaWduZWQgY2hhciAqZGV2aWNlX2lkLCBpbnQgYnVmbGVuKQpAQCAtMTY0NCw3ICsyNDE4LDcgQEAKIAlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC0xOwotCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLCAweDgzLCBidWYsIDY0KTsKKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgVlBEX1BBR0UgfCAweDgzLCBidWYsIDY0KTsKIAlpZiAocmMgPT0gMCkKIAkJbWVtY3B5KGRldmljZV9pZCwgJmJ1Zls4XSwgYnVmbGVuKTsKIAlrZnJlZShidWYpOwpAQCAtMTY3OCw4ICsyNDUyLDE2IEBACiAJZWkgPSBjLT5lcnJfaW5mbzsKIAlpZiAoZWktPkNvbW1hbmRTdGF0dXMgIT0gMCAmJgogCSAgICBlaS0+Q29tbWFuZFN0YXR1cyAhPSBDTURfREFUQV9VTkRFUlJVTikgewotCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGMpOworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOwogCQlyYyA9IC0xOworCX0gZWxzZSB7CisJCWlmIChidWYtPmV4dGVuZGVkX3Jlc3BvbnNlX2ZsYWcgIT0gZXh0ZW5kZWRfcmVzcG9uc2UpIHsKKwkJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwKKwkJCQkicmVwb3J0IGx1bnMgcmVxdWVzdGVkIGZvcm1hdCAldSwgZ290ICV1XG4iLAorCQkJCWV4dGVuZGVkX3Jlc3BvbnNlLAorCQkJCWJ1Zi0+ZXh0ZW5kZWRfcmVzcG9uc2VfZmxhZyk7CisJCQlyYyA9IC0xOworCQl9CiAJfQogb3V0OgogCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CkBAIC0xNzA3LDYgKzI0ODksMTE3IEBACiAJZGV2aWNlLT5sdW4gPSBsdW47CiB9CiAKKy8qIFVzZSBWUEQgaW5xdWlyeSB0byBnZXQgZGV0YWlscyBvZiB2b2x1bWUgc3RhdHVzICovCitzdGF0aWMgaW50IGhwc2FfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCQkJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSkKK3sKKwlpbnQgcmM7CisJaW50IHN0YXR1czsKKwlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEhQU0FfVlBEX0xWX1NUQVRVU19VTlNVUFBPUlRFRDsKKworCS8qIERvZXMgY29udHJvbGxlciBoYXZlIFZQRCBmb3IgbG9naWNhbCB2b2x1bWUgc3RhdHVzPyAqLworCWlmICghaHBzYV92cGRfcGFnZV9zdXBwb3J0ZWQoaCwgc2NzaTNhZGRyLCBIUFNBX1ZQRF9MVl9TVEFUVVMpKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJMb2dpY2FsIHZvbHVtZSBzdGF0dXMgVlBEIHBhZ2UgaXMgdW5zdXBwb3J0ZWQuXG4iKTsKKwkJZ290byBleGl0X2ZhaWxlZDsKKwl9CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIFZQRCByZXR1cm4gYnVmZmVyICovCisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgSFBTQV9WUERfTFZfU1RBVFVTLAorCQkJCQlidWYsIEhQU0FfVlBEX0hFQURFUl9TWik7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkxvZ2ljYWwgdm9sdW1lIHN0YXR1cyBWUEQgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKwkJZ290byBleGl0X2ZhaWxlZDsKKwl9CisJc2l6ZSA9IGJ1ZlszXTsKKworCS8qIE5vdyBnZXQgdGhlIHdob2xlIFZQRCBidWZmZXIgKi8KKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgVlBEX1BBR0UgfCBIUFNBX1ZQRF9MVl9TVEFUVVMsCisJCQkJCWJ1Ziwgc2l6ZSArIEhQU0FfVlBEX0hFQURFUl9TWik7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkxvZ2ljYWwgdm9sdW1lIHN0YXR1cyBWUEQgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKwkJZ290byBleGl0X2ZhaWxlZDsKKwl9CisJc3RhdHVzID0gYnVmWzRdOyAvKiBzdGF0dXMgYnl0ZSAqLworCisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gc3RhdHVzOworZXhpdF9mYWlsZWQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gSFBTQV9WUERfTFZfU1RBVFVTX1VOU1VQUE9SVEVEOworfQorCisvKiBEZXRlcm1pbmUgb2ZmbGluZSBzdGF0dXMgb2YgYSB2b2x1bWUuCisgKiBSZXR1cm4gZWl0aGVyOgorICogIDAgKG5vdCBvZmZsaW5lKQorICogLTEgKG9mZmxpbmUgZm9yIHVua25vd24gcmVhc29ucykKKyAqICAjIChpbnRlZ2VyIGNvZGUgaW5kaWNhdGluZyBvbmUgb2Ygc2V2ZXJhbCBOT1QgUkVBRFkgc3RhdGVzCisgKiAgICAgZGVzY3JpYmluZyB3aHkgYSB2b2x1bWUgaXMgdG8gYmUga2VwdCBvZmZsaW5lKQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBocHNhX3ZvbHVtZV9vZmZsaW5lKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10pCit7CisJc3RydWN0IENvbW1hbmRMaXN0ICpjOworCXVuc2lnbmVkIGNoYXIgKnNlbnNlLCBzZW5zZV9rZXksIGFzYywgYXNjcTsKKwlpbnQgbGRzdGF0ID0gMDsKKwl1MTYgY21kX3N0YXR1czsKKwl1OCBzY3NpX3N0YXR1czsKKyNkZWZpbmUgQVNDX0xVTl9OT1RfUkVBRFkgMHgwNAorI2RlZmluZSBBU0NRX0xVTl9OT1RfUkVBRFlfRk9STUFUX0lOX1BST0dSRVNTIDB4MDQKKyNkZWZpbmUgQVNDUV9MVU5fTk9UX1JFQURZX0lOSVRJQUxJWklOR19DTURfUkVRIDB4MDIKKworCWMgPSBjbWRfYWxsb2MoaCk7CisJaWYgKCFjKQorCQlyZXR1cm4gMDsKKwkodm9pZCkgZmlsbF9jbWQoYywgVEVTVF9VTklUX1JFQURZLCBoLCBOVUxMLCAwLCAwLCBzY3NpM2FkZHIsIFRZUEVfQ01EKTsKKwlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlKGgsIGMpOworCXNlbnNlID0gYy0+ZXJyX2luZm8tPlNlbnNlSW5mbzsKKwlzZW5zZV9rZXkgPSBzZW5zZVsyXTsKKwlhc2MgPSBzZW5zZVsxMl07CisJYXNjcSA9IHNlbnNlWzEzXTsKKwljbWRfc3RhdHVzID0gYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXM7CisJc2NzaV9zdGF0dXMgPSBjLT5lcnJfaW5mby0+U2NzaVN0YXR1czsKKwljbWRfZnJlZShoLCBjKTsKKwkvKiBJcyB0aGUgdm9sdW1lICdub3QgcmVhZHknPyAqLworCWlmIChjbWRfc3RhdHVzICE9IENNRF9UQVJHRVRfU1RBVFVTIHx8CisJCXNjc2lfc3RhdHVzICE9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTiB8fAorCQlzZW5zZV9rZXkgIT0gTk9UX1JFQURZIHx8CisJCWFzYyAhPSBBU0NfTFVOX05PVF9SRUFEWSkgIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSByZWFzb24gZm9yIG5vdCByZWFkeSBzdGF0ZSAqLworCWxkc3RhdCA9IGhwc2FfZ2V0X3ZvbHVtZV9zdGF0dXMoaCwgc2NzaTNhZGRyKTsKKworCS8qIEtlZXAgdm9sdW1lIG9mZmxpbmUgaW4gY2VydGFpbiBjYXNlczogKi8KKwlzd2l0Y2ggKGxkc3RhdCkgeworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VSQVNFOgorCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX1JQSToKKwljYXNlIEhQU0FfTFZfUEVORElOR19SUEk6CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9OT19LRVk6CisJY2FzZSBIUFNBX0xWX1BMQUlOVEVYVF9JTl9FTkNSWVBUX09OTFlfQ09OVFJPTExFUjoKKwljYXNlIEhQU0FfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OOgorCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT05fUkVLRVlJTkc6CisJY2FzZSBIUFNBX0xWX0VOQ1JZUFRFRF9JTl9OT05fRU5DUllQVEVEX0NPTlRST0xMRVI6CisJCXJldHVybiBsZHN0YXQ7CisJY2FzZSBIUFNBX1ZQRF9MVl9TVEFUVVNfVU5TVVBQT1JURUQ6CisJCS8qIElmIFZQRCBzdGF0dXMgcGFnZSBpc24ndCBhdmFpbGFibGUsCisJCSAqIHVzZSBBU0MvQVNDUSB0byBkZXRlcm1pbmUgc3RhdGUKKwkJICovCisJCWlmICgoYXNjcSA9PSBBU0NRX0xVTl9OT1RfUkVBRFlfRk9STUFUX0lOX1BST0dSRVNTKSB8fAorCQkJKGFzY3EgPT0gQVNDUV9MVU5fTk9UX1JFQURZX0lOSVRJQUxJWklOR19DTURfUkVRKSkKKwkJCXJldHVybiBsZHN0YXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBocHNhX3VwZGF0ZV9kZXZpY2VfaW5mbyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAogCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10sIHN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnRoaXNfZGV2aWNlLAogCXVuc2lnbmVkIGNoYXIgKmlzX09CRFJfZGV2aWNlKQpAQCAtMTc0NSwxMCArMjYzOCwxOCBAQAogCQlzaXplb2YodGhpc19kZXZpY2UtPmRldmljZV9pZCkpOwogCiAJaWYgKHRoaXNfZGV2aWNlLT5kZXZ0eXBlID09IFRZUEVfRElTSyAmJgotCQlpc19sb2dpY2FsX2Rldl9hZGRyX21vZGUoc2NzaTNhZGRyKSkKKwkJaXNfbG9naWNhbF9kZXZfYWRkcl9tb2RlKHNjc2kzYWRkcikpIHsKIAkJaHBzYV9nZXRfcmFpZF9sZXZlbChoLCBzY3NpM2FkZHIsICZ0aGlzX2RldmljZS0+cmFpZF9sZXZlbCk7Ci0JZWxzZQorCQlpZiAoaC0+Zndfc3VwcG9ydCAmIE1JU0NfRldfUkFJRF9PRkZMT0FEX0JBU0lDKQorCQkJaHBzYV9nZXRfaW9hY2NlbF9zdGF0dXMoaCwgc2NzaTNhZGRyLCB0aGlzX2RldmljZSk7CisJCXRoaXNfZGV2aWNlLT52b2x1bWVfb2ZmbGluZSA9CisJCQlocHNhX3ZvbHVtZV9vZmZsaW5lKGgsIHNjc2kzYWRkcik7CisJfSBlbHNlIHsKIAkJdGhpc19kZXZpY2UtPnJhaWRfbGV2ZWwgPSBSQUlEX1VOS05PV047CisJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2NvbmZpZyA9IDA7CisJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCQl0aGlzX2RldmljZS0+dm9sdW1lX29mZmxpbmUgPSAwOworCX0KIAogCWlmIChpc19PQkRSX2RldmljZSkgewogCQkvKiBTZWUgaWYgdGhpcyBpcyBhIE9uZS1CdXR0b24tRGlzYXN0ZXItUmVjb3ZlcnkgZGV2aWNlCkBAIC0xODc4LDYgKzI3NzksMTA1IEBACiB9CiAKIC8qCisgKiBHZXQgYWRkcmVzcyBvZiBwaHlzaWNhbCBkaXNrIHVzZWQgZm9yIGFuIGlvYWNjZWwyIG1vZGUgY29tbWFuZDoKKyAqCTEuIEV4dHJhY3QgaW9hY2NlbDIgaGFuZGxlIGZyb20gdGhlIGNvbW1hbmQuCisgKgkyLiBGaW5kIGEgbWF0Y2hpbmcgaW9hY2NlbDIgaGFuZGxlIGZyb20gbGlzdCBvZiBwaHlzaWNhbCBkaXNrcy4KKyAqCTMuIFJldHVybjoKKyAqCQkxIGFuZCBzZXQgc2NzaTNhZGRyIHRvIGFkZHJlc3Mgb2YgbWF0Y2hpbmcgcGh5c2ljYWwKKyAqCQkwIGlmIG5vIG1hdGNoaW5nIHBoeXNpY2FsIGRpc2sgd2FzIGZvdW5kLgorICovCitzdGF0aWMgaW50IGhwc2FfZ2V0X3BkaXNrX29mX2lvYWNjZWwyKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICppb2FjY2VsMl9jbWRfdG9fYWJvcnQsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkcikKK3sKKwlzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICpwaHlzaWNhbHMgPSBOVUxMOworCWludCByZXNwb25zZXNpemUgPSAyNDsJLyogc2l6ZSBvZiBwaHlzaWNhbCBleHRlbmRlZCByZXNwb25zZSAqLworCWludCBleHRlbmRlZCA9IDI7CS8qIGZsYWcgZm9yY2VzIHJlcG9ydGluZyAnb3RoZXIgZGV2IGluZm8nLiAqLworCWludCByZXBvcnRzaXplID0gc2l6ZW9mKCpwaHlzaWNhbHMpICsgSFBTQV9NQVhfUEhZU19MVU4gKiByZXNwb25zZXNpemU7CisJdTMyIG5waHlzaWNhbHMgPSAwOwkvKiBudW1iZXIgb2YgcmVwb3J0ZWQgcGh5c2ljYWwgZGV2cyAqLworCWludCBmb3VuZCA9IDA7CQkvKiBmb3VuZCBtYXRjaCAoMSkgb3Igbm90ICgwKSAqLworCXUzMiBmaW5kOwkJLyogaGFuZGxlIHdlIG5lZWQgdG8gbWF0Y2ggKi8KKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOwkvKiBzY3NpIGNvbW1hbmQgd2l0aGluIHJlcXVlc3QgYmVpbmcgYWJvcnRlZCAqLworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmQ7IC8qIGRldmljZSBvZiByZXF1ZXN0IGJlaW5nIGFib3J0ZWQgKi8KKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqYzJhOyAvKiBpb2FjY2VsMiBjb21tYW5kIHRvIGFib3J0ICovCisJdTMyIGl0X25leHVzOwkJLyogNCBieXRlIGRldmljZSBoYW5kbGUgZm9yIHRoZSBpb2FjY2VsMiBjbWQgKi8KKwl1MzIgc2NzaV9uZXh1czsJCS8qIDQgYnl0ZSBkZXZpY2UgaGFuZGxlIGZvciB0aGUgaW9hY2NlbDIgY21kICovCisKKwlpZiAoaW9hY2NlbDJfY21kX3RvX2Fib3J0LT5jbWRfdHlwZSAhPSBDTURfSU9BQ0NFTDIpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCisJLyogcG9pbnQgdG8gdGhlIGlvYWNjZWwyIGRldmljZSBoYW5kbGUgKi8KKwljMmEgPSAmaC0+aW9hY2NlbDJfY21kX3Bvb2xbaW9hY2NlbDJfY21kX3RvX2Fib3J0LT5jbWRpbmRleF07CisJaWYgKGMyYSA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KKworCXNjbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBpb2FjY2VsMl9jbWRfdG9fYWJvcnQtPnNjc2lfY21kOworCWlmIChzY21kID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCisJZCA9IHNjbWQtPmRldmljZS0+aG9zdGRhdGE7CisJaWYgKGQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIG5vIG1hdGNoICovCisKKwlpdF9uZXh1cyA9IGNwdV90b19sZTMyKCh1MzIpIGQtPmlvYWNjZWxfaGFuZGxlKTsKKwlzY3NpX25leHVzID0gY3B1X3RvX2xlMzIoKHUzMikgYzJhLT5zY3NpX25leHVzKTsKKwlmaW5kID0gYzJhLT5zY3NpX25leHVzOworCisJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA+IDApCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiJXM6IHNjc2lfbmV4dXM6MHglMDh4IGRldmljZSBpZDogMHglMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJX19mdW5jX18sIHNjc2lfbmV4dXMsCisJCQlkLT5kZXZpY2VfaWRbMF0sIGQtPmRldmljZV9pZFsxXSwgZC0+ZGV2aWNlX2lkWzJdLAorCQkJZC0+ZGV2aWNlX2lkWzNdLCBkLT5kZXZpY2VfaWRbNF0sIGQtPmRldmljZV9pZFs1XSwKKwkJCWQtPmRldmljZV9pZFs2XSwgZC0+ZGV2aWNlX2lkWzddLCBkLT5kZXZpY2VfaWRbOF0sCisJCQlkLT5kZXZpY2VfaWRbOV0sIGQtPmRldmljZV9pZFsxMF0sIGQtPmRldmljZV9pZFsxMV0sCisJCQlkLT5kZXZpY2VfaWRbMTJdLCBkLT5kZXZpY2VfaWRbMTNdLCBkLT5kZXZpY2VfaWRbMTRdLAorCQkJZC0+ZGV2aWNlX2lkWzE1XSk7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgcGh5c2ljYWwgZGV2aWNlcyAqLworCXBoeXNpY2FscyA9IGt6YWxsb2MocmVwb3J0c2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhwc2Ffc2NzaV9kb19yZXBvcnRfcGh5c19sdW5zKGgsIChzdHJ1Y3QgUmVwb3J0TFVOZGF0YSAqKSBwaHlzaWNhbHMsCisJCXJlcG9ydHNpemUsIGV4dGVuZGVkKSkgeworCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsCisJCQkiQ2FuJ3QgbG9va3VwICVzIGRldmljZSBoYW5kbGU6IHJlcG9ydCBwaHlzaWNhbCBMVU5zIGZhaWxlZC5cbiIsCisJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJa2ZyZWUocGh5c2ljYWxzKTsKKwkJcmV0dXJuIDA7CisJfQorCW5waHlzaWNhbHMgPSBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKilwaHlzaWNhbHMtPkxVTkxpc3RMZW5ndGgpKSAvCisJCQkJCQkJcmVzcG9uc2VzaXplOworCisKKwkvKiBmaW5kIGlvYWNjZWwyIGhhbmRsZSBpbiBsaXN0IG9mIHBoeXNpY2FsczogKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnBoeXNpY2FsczsgaSsrKSB7CisJCS8qIGhhbmRsZSBpcyBpbiBieXRlcyAyOC0zMSBvZiBlYWNoIGx1biAqLworCQlpZiAobWVtY21wKCYoKHN0cnVjdCBSZXBvcnRFeHRlbmRlZExVTmRhdGEgKikKKwkJCQlwaHlzaWNhbHMpLT5MVU5baV1bMjBdLCAmZmluZCwgNCkgIT0gMCkgeworCQkJY29udGludWU7IC8qIGRpZG4ndCBtYXRjaCAqLworCQl9CisJCWZvdW5kID0gMTsKKwkJbWVtY3B5KHNjc2kzYWRkciwgJigoc3RydWN0IFJlcG9ydEV4dGVuZGVkTFVOZGF0YSAqKQorCQkJCQlwaHlzaWNhbHMpLT5MVU5baV1bMF0sIDgpOworCQlpZiAoaC0+cmFpZF9vZmZsb2FkX2RlYnVnID4gMCkKKwkJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTZWFyY2hlZCBoPTB4JTA4eCwgRm91bmQgaD0weCUwOHgsIHNjc2lhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkJX19mdW5jX18sIGZpbmQsCisJCQkJKChzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICopCisJCQkJCXBoeXNpY2FscyktPkxVTltpXVsyMF0sCisJCQkJc2NzaTNhZGRyWzBdLCBzY3NpM2FkZHJbMV0sIHNjc2kzYWRkclsyXSwKKwkJCQlzY3NpM2FkZHJbM10sIHNjc2kzYWRkcls0XSwgc2NzaTNhZGRyWzVdLAorCQkJCXNjc2kzYWRkcls2XSwgc2NzaTNhZGRyWzddKTsKKwkJYnJlYWs7IC8qIGZvdW5kIGl0ICovCisJfQorCisJa2ZyZWUocGh5c2ljYWxzKTsKKwlpZiAoZm91bmQpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisKK30KKy8qCiAgKiBEbyBDSVNTX1JFUE9SVF9QSFlTIGFuZCBDSVNTX1JFUE9SVF9MT0cuICBEYXRhIGlzIHJldHVybmVkIGluIHBoeXNkZXYsCiAgKiBsb2dkZXYuICBUaGUgbnVtYmVyIG9mIGx1bnMgaW4gcGh5c2RldiBhbmQgbG9nZGV2IGFyZSByZXR1cm5lZCBpbgogICogKm5waHlzaWNhbHMgYW5kICpubG9naWNhbHMsIHJlc3BlY3RpdmVseS4KQEAgLTE4ODUsMTQgKzI4ODUsMjYgQEAKICAqLwogc3RhdGljIGludCBocHNhX2dhdGhlcl9sdW5faW5mbyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAogCWludCByZXBvcnRsdW5zaXplLAotCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpwaHlzZGV2LCB1MzIgKm5waHlzaWNhbHMsCisJc3RydWN0IFJlcG9ydExVTmRhdGEgKnBoeXNkZXYsIHUzMiAqbnBoeXNpY2FscywgaW50ICpwaHlzaWNhbF9tb2RlLAogCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpsb2dkZXYsIHUzMiAqbmxvZ2ljYWxzKQogewotCWlmIChocHNhX3Njc2lfZG9fcmVwb3J0X3BoeXNfbHVucyhoLCBwaHlzZGV2LCByZXBvcnRsdW5zaXplLCAwKSkgeworCWludCBwaHlzaWNhbF9lbnRyeV9zaXplID0gODsKKworCSpwaHlzaWNhbF9tb2RlID0gMDsKKworCS8qIEZvciBJL08gYWNjZWxlcmF0b3IgbW9kZSB3ZSBuZWVkIHRvIHJlYWQgcGh5c2ljYWwgZGV2aWNlIGhhbmRsZXMgKi8KKwlpZiAoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxIHx8CisJCWgtPnRyYW5zTWV0aG9kICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikgeworCQkqcGh5c2ljYWxfbW9kZSA9IEhQU0FfUkVQT1JUX1BIWVNfRVhURU5ERUQ7CisJCXBoeXNpY2FsX2VudHJ5X3NpemUgPSAyNDsKKwl9CisJaWYgKGhwc2Ffc2NzaV9kb19yZXBvcnRfcGh5c19sdW5zKGgsIHBoeXNkZXYsIHJlcG9ydGx1bnNpemUsCisJCQkJCQkJKnBoeXNpY2FsX21vZGUpKSB7CiAJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwgInJlcG9ydCBwaHlzaWNhbCBMVU5zIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCSpucGh5c2ljYWxzID0gYmUzMl90b19jcHUoKigoX19iZTMyICopcGh5c2Rldi0+TFVOTGlzdExlbmd0aCkpIC8gODsKKwkqbnBoeXNpY2FscyA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKXBoeXNkZXYtPkxVTkxpc3RMZW5ndGgpKSAvCisJCQkJCQkJcGh5c2ljYWxfZW50cnlfc2l6ZTsKIAlpZiAoKm5waHlzaWNhbHMgPiBIUFNBX01BWF9QSFlTX0xVTikgewogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAibWF4aW11bSBwaHlzaWNhbCBMVU5zICglZCkgZXhjZWVkZWQuIgogCQkJIiAgJWQgTFVOcyBpZ25vcmVkLlxuIiwgSFBTQV9NQVhfUEhZU19MVU4sCkBAIC0xOTIzLDcgKzI5MzUsOCBAQAogfQogCiB1OCAqZmlndXJlX2x1bmFkZHJieXRlcyhzdHJ1Y3QgY3Rscl9pbmZvICpoLCBpbnQgcmFpZF9jdGxyX3Bvc2l0aW9uLCBpbnQgaSwKLQlpbnQgbnBoeXNpY2FscywgaW50IG5sb2dpY2Fscywgc3RydWN0IFJlcG9ydExVTmRhdGEgKnBoeXNkZXZfbGlzdCwKKwlpbnQgbnBoeXNpY2FscywgaW50IG5sb2dpY2FscywKKwlzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICpwaHlzZGV2X2xpc3QsCiAJc3RydWN0IFJlcG9ydExVTmRhdGEgKmxvZ2Rldl9saXN0KQogewogCS8qIEhlbHBlciBmdW5jdGlvbiwgZmlndXJlIG91dCB3aGVyZSB0aGUgTFVOIElEIGluZm8gaXMgY29taW5nIGZyb20KQEAgLTE5NDcsNiArMjk2MCwyNCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGhwc2FfaGJhX21vZGVfZW5hYmxlZChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWludCByYzsKKwlzdHJ1Y3QgYm1pY19jb250cm9sbGVyX3BhcmFtZXRlcnMgKmN0bHJfcGFyYW1zOworCWN0bHJfcGFyYW1zID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJtaWNfY29udHJvbGxlcl9wYXJhbWV0ZXJzKSwKKwkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWN0bHJfcGFyYW1zKQorCQlyZXR1cm4gMDsKKwlyYyA9IGhwc2FfYm1pY19jdHJsX21vZGVfc2Vuc2UoaCwgUkFJRF9DVExSX0xVTklELCAwLCBjdGxyX3BhcmFtcywKKwkJc2l6ZW9mKHN0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycykpOworCWlmIChyYyAhPSAwKSB7CisJCWtmcmVlKGN0bHJfcGFyYW1zKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBjdGxyX3BhcmFtcy0+bnZyYW1fZmxhZ3MgJiAoMSA8PCAzKSA/IDEgOiAwOworfQorCiBzdGF0aWMgdm9pZCBocHNhX3VwZGF0ZV9zY3NpX2RldmljZXMoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IGhvc3RubykKIHsKIAkvKiB0aGUgaWRlYSBoZXJlIGlzIHdlIGNvdWxkIGdldCBub3RpZmllZApAQCAtMTk1OSwxNiArMjk5MCwxOCBAQAogCSAqIHRlbGwgd2hpY2ggZGV2aWNlcyB3ZSBhbHJlYWR5IGtub3cgYWJvdXQsIHZzLiBuZXcKIAkgKiBkZXZpY2VzLCB2cy4gIGRpc2FwcGVhcmluZyBkZXZpY2VzLgogCSAqLwotCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpwaHlzZGV2X2xpc3QgPSBOVUxMOworCXN0cnVjdCBSZXBvcnRFeHRlbmRlZExVTmRhdGEgKnBoeXNkZXZfbGlzdCA9IE5VTEw7CiAJc3RydWN0IFJlcG9ydExVTmRhdGEgKmxvZ2Rldl9saXN0ID0gTlVMTDsKIAl1MzIgbnBoeXNpY2FscyA9IDA7CiAJdTMyIG5sb2dpY2FscyA9IDA7CisJaW50IHBoeXNpY2FsX21vZGUgPSAwOwogCXUzMiBuZGV2X2FsbG9jYXRlZCA9IDA7CiAJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqKmN1cnJlbnRzZCwgKnRoaXNfZGV2aWNlLCAqdG1wZGV2aWNlOwogCWludCBuY3VycmVudCA9IDA7Ci0JaW50IHJlcG9ydGx1bnNpemUgPSBzaXplb2YoKnBoeXNkZXZfbGlzdCkgKyBIUFNBX01BWF9QSFlTX0xVTiAqIDg7CisJaW50IHJlcG9ydGx1bnNpemUgPSBzaXplb2YoKnBoeXNkZXZfbGlzdCkgKyBIUFNBX01BWF9QSFlTX0xVTiAqIDI0OwogCWludCBpLCBuX2V4dF90YXJnZXRfZGV2cywgbmRldnNfdG9fYWxsb2NhdGU7CiAJaW50IHJhaWRfY3Rscl9wb3NpdGlvbjsKKwl1OCByZXNjYW5faGJhX21vZGU7CiAJREVDTEFSRV9CSVRNQVAobHVuemVyb2JpdHMsIE1BWF9FWFRfVEFSR0VUUyk7CiAKIAljdXJyZW50c2QgPSBremFsbG9jKHNpemVvZigqY3VycmVudHNkKSAqIEhQU0FfTUFYX0RFVklDRVMsIEdGUF9LRVJORUwpOwpAQCAtMTk4Miw4ICszMDE1LDE4IEBACiAJfQogCW1lbXNldChsdW56ZXJvYml0cywgMCwgc2l6ZW9mKGx1bnplcm9iaXRzKSk7CiAKLQlpZiAoaHBzYV9nYXRoZXJfbHVuX2luZm8oaCwgcmVwb3J0bHVuc2l6ZSwgcGh5c2Rldl9saXN0LCAmbnBoeXNpY2FscywKLQkJCWxvZ2Rldl9saXN0LCAmbmxvZ2ljYWxzKSkKKwlyZXNjYW5faGJhX21vZGUgPSBocHNhX2hiYV9tb2RlX2VuYWJsZWQoaCk7CisKKwlpZiAoIWgtPmhiYV9tb2RlX2VuYWJsZWQgJiYgcmVzY2FuX2hiYV9tb2RlKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiSEJBIG1vZGUgZW5hYmxlZFxuIik7CisJZWxzZSBpZiAoaC0+aGJhX21vZGVfZW5hYmxlZCAmJiAhcmVzY2FuX2hiYV9tb2RlKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiSEJBIG1vZGUgZGlzYWJsZWRcbiIpOworCisJaC0+aGJhX21vZGVfZW5hYmxlZCA9IHJlc2Nhbl9oYmFfbW9kZTsKKworCWlmIChocHNhX2dhdGhlcl9sdW5faW5mbyhoLCByZXBvcnRsdW5zaXplLAorCQkJKHN0cnVjdCBSZXBvcnRMVU5kYXRhICopIHBoeXNkZXZfbGlzdCwgJm5waHlzaWNhbHMsCisJCQkmcGh5c2ljYWxfbW9kZSwgbG9nZGV2X2xpc3QsICZubG9naWNhbHMpKQogCQlnb3RvIG91dDsKIAogCS8qIFdlIG1pZ2h0IHNlZSB1cCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9naWNhbCBhbmQgcGh5c2ljYWwgZGlza3MKQEAgLTIwNjQsOSArMzEwNywyOCBAQAogCQkJCW5jdXJyZW50Kys7CiAJCQlicmVhazsKIAkJY2FzZSBUWVBFX0RJU0s6Ci0JCQlpZiAoaSA8IG5waHlzaWNhbHMpCisJCQlpZiAoaC0+aGJhX21vZGVfZW5hYmxlZCkgeworCQkJCS8qIG5ldmVyIHVzZSByYWlkIG1hcHBlciBpbiBIQkEgbW9kZSAqLworCQkJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCQkJCW5jdXJyZW50Kys7CiAJCQkJYnJlYWs7Ci0JCQluY3VycmVudCsrOworCQkJfSBlbHNlIGlmIChoLT5hY2Npb3BhdGhfc3RhdHVzKSB7CisJCQkJaWYgKGkgPj0gbnBoeXNpY2FscykgeworCQkJCQluY3VycmVudCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChpIDwgbnBoeXNpY2FscykKKwkJCQkJYnJlYWs7CisJCQkJbmN1cnJlbnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwaHlzaWNhbF9tb2RlID09IEhQU0FfUkVQT1JUX1BIWVNfRVhURU5ERUQpIHsKKwkJCQltZW1jcHkoJnRoaXNfZGV2aWNlLT5pb2FjY2VsX2hhbmRsZSwKKwkJCQkJJmx1bmFkZHJieXRlc1syMF0sCisJCQkJCXNpemVvZih0aGlzX2RldmljZS0+aW9hY2NlbF9oYW5kbGUpKTsKKwkJCQluY3VycmVudCsrOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFlQRV9UQVBFOgogCQljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CkBAIC0yMTM2LDcgKzMxOTgsNyBAQAogCQljdXJyX3NnLT5BZGRyLmxvd2VyID0gKHUzMikgKGFkZHI2NCAmIDB4MEZGRkZGRkZGVUxMKTsKIAkJY3Vycl9zZy0+QWRkci51cHBlciA9ICh1MzIpICgoYWRkcjY0ID4+IDMyKSAmIDB4MEZGRkZGRkZGVUxMKTsKIAkJY3Vycl9zZy0+TGVuID0gbGVuOwotCQljdXJyX3NnLT5FeHQgPSAwOyAgLyogd2UgYXJlIG5vdCBjaGFpbmluZyAqLworCQljdXJyX3NnLT5FeHQgPSAoaSA8IHNjc2lfc2dfY291bnQoY21kKSAtIDEpID8gMCA6IEhQU0FfU0dfTEFTVDsKIAkJY3Vycl9zZysrOwogCX0KIApAQCAtMjE2MCw2ICszMjIyLDcyNiBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIElPX0FDQ0VMX0lORUxJR0lCTEUgKDEpCitzdGF0aWMgaW50IGZpeHVwX2lvYWNjZWxfY2RiKHU4ICpjZGIsIGludCAqY2RiX2xlbikKK3sKKwlpbnQgaXNfd3JpdGUgPSAwOworCXUzMiBibG9jazsKKwl1MzIgYmxvY2tfY250OworCisJLyogUGVyZm9ybSBzb21lIENEQiBmaXh1cHMgaWYgbmVlZGVkIHVzaW5nIDEwIGJ5dGUgcmVhZHMvd3JpdGVzIG9ubHkgKi8KKwlzd2l0Y2ggKGNkYlswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEyOgorCQlpc193cml0ZSA9IDE7CisJY2FzZSBSRUFEXzY6CisJY2FzZSBSRUFEXzEyOgorCQlpZiAoKmNkYl9sZW4gPT0gNikgeworCQkJYmxvY2sgPSAoKCh1MzIpIGNkYlsyXSkgPDwgOCkgfCBjZGJbM107CisJCQlibG9ja19jbnQgPSBjZGJbNF07CisJCX0gZWxzZSB7CisJCQlCVUdfT04oKmNkYl9sZW4gIT0gMTIpOworCQkJYmxvY2sgPSAoKCh1MzIpIGNkYlsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1MzIpIGNkYlszXSkgPDwgMTYpIHwKKwkJCQkoKCh1MzIpIGNkYls0XSkgPDwgOCkgfAorCQkJCWNkYls1XTsKKwkJCWJsb2NrX2NudCA9CisJCQkJKCgodTMyKSBjZGJbNl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjZGJbN10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjZGJbOF0pIDw8IDgpIHwKKwkJCQljZGJbOV07CisJCX0KKwkJaWYgKGJsb2NrX2NudCA+IDB4ZmZmZikKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJCWNkYlswXSA9IGlzX3dyaXRlID8gV1JJVEVfMTAgOiBSRUFEXzEwOworCQljZGJbMV0gPSAwOworCQljZGJbMl0gPSAodTgpIChibG9jayA+PiAyNCk7CisJCWNkYlszXSA9ICh1OCkgKGJsb2NrID4+IDE2KTsKKwkJY2RiWzRdID0gKHU4KSAoYmxvY2sgPj4gOCk7CisJCWNkYls1XSA9ICh1OCkgKGJsb2NrKTsKKwkJY2RiWzZdID0gMDsKKwkJY2RiWzddID0gKHU4KSAoYmxvY2tfY250ID4+IDgpOworCQljZGJbOF0gPSAodTgpIChibG9ja19jbnQpOworCQljZGJbOV0gPSAwOworCQkqY2RiX2xlbiA9IDEwOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWwxX3F1ZXVlX2NvbW1hbmQoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiBpb2FjY2VsX2hhbmRsZSwgdTggKmNkYiwgaW50IGNkYl9sZW4sCisJdTggKnNjc2kzYWRkcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBjLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqY3AgPSAmaC0+aW9hY2NlbF9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgdG90YWxfbGVuID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXU2NCBhZGRyNjQ7CisJaW50IHVzZV9zZywgaTsKKwlzdHJ1Y3QgU0dEZXNjcmlwdG9yICpjdXJyX3NnOworCXUzMiBjb250cm9sID0gSU9BQ0NFTDFfQ09OVFJPTF9TSU1QTEVRVUVVRTsKKworCS8qIFRPRE86IGltcGxlbWVudCBjaGFpbmluZyBzdXBwb3J0ICovCisJaWYgKHNjc2lfc2dfY291bnQoY21kKSA+IGgtPmlvYWNjZWxfbWF4c2cpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJQlVHX09OKGNtZC0+Y21kX2xlbiA+IElPQUNDRUwxX0lPRkxBR1NfQ0RCTEVOX01BWCk7CisKKwlpZiAoZml4dXBfaW9hY2NlbF9jZGIoY2RiLCAmY2RiX2xlbikpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJYy0+Y21kX3R5cGUgPSBDTURfSU9BQ0NFTDE7CisKKwkvKiBBZGp1c3QgdGhlIERNQSBhZGRyZXNzIHRvIHBvaW50IHRvIHRoZSBhY2NlbGVyYXRlZCBjb21tYW5kIGJ1ZmZlciAqLworCWMtPmJ1c2FkZHIgPSAodTMyKSBoLT5pb2FjY2VsX2NtZF9wb29sX2RoYW5kbGUgKworCQkJCShjLT5jbWRpbmRleCAqIHNpemVvZigqY3ApKTsKKwlCVUdfT04oYy0+YnVzYWRkciAmIDB4MDAwMDAwN0YpOworCisJdXNlX3NnID0gc2NzaV9kbWFfbWFwKGNtZCk7CisJaWYgKHVzZV9zZyA8IDApCisJCXJldHVybiB1c2Vfc2c7CisKKwlpZiAodXNlX3NnKSB7CisJCWN1cnJfc2cgPSBjcC0+U0c7CisJCXNjc2lfZm9yX2VhY2hfc2coY21kLCBzZywgdXNlX3NnLCBpKSB7CisJCQlhZGRyNjQgPSAodTY0KSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlsZW4gID0gc2dfZG1hX2xlbihzZyk7CisJCQl0b3RhbF9sZW4gKz0gbGVuOworCQkJY3Vycl9zZy0+QWRkci5sb3dlciA9ICh1MzIpIChhZGRyNjQgJiAweDBGRkZGRkZGRlVMTCk7CisJCQljdXJyX3NnLT5BZGRyLnVwcGVyID0KKwkJCQkodTMyKSAoKGFkZHI2NCA+PiAzMikgJiAweDBGRkZGRkZGRlVMTCk7CisJCQljdXJyX3NnLT5MZW4gPSBsZW47CisKKwkJCWlmIChpID09IChzY3NpX3NnX2NvdW50KGNtZCkgLSAxKSkKKwkJCQljdXJyX3NnLT5FeHQgPSBIUFNBX1NHX0xBU1Q7CisJCQllbHNlCisJCQkJY3Vycl9zZy0+RXh0ID0gMDsgIC8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KKwkJCWN1cnJfc2crKzsKKwkJfQorCisJCXN3aXRjaCAoY21kLT5zY19kYXRhX2RpcmVjdGlvbikgeworCQljYXNlIERNQV9UT19ERVZJQ0U6CisJCQljb250cm9sIHw9IElPQUNDRUwxX0NPTlRST0xfREFUQV9PVVQ7CisJCQlicmVhazsKKwkJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCQljb250cm9sIHw9IElPQUNDRUwxX0NPTlRST0xfREFUQV9JTjsKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJY29udHJvbCB8PSBJT0FDQ0VMMV9DT05UUk9MX05PREFUQVhGRVI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwgInVua25vd24gZGF0YSBkaXJlY3Rpb246ICVkXG4iLAorCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJY29udHJvbCB8PSBJT0FDQ0VMMV9DT05UUk9MX05PREFUQVhGRVI7CisJfQorCisJYy0+SGVhZGVyLlNHTGlzdCA9IHVzZV9zZzsKKwkvKiBGaWxsIG91dCB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgdG8gc3VibWl0ICovCisJY3AtPmRldl9oYW5kbGUgPSBpb2FjY2VsX2hhbmRsZSAmIDB4RkZGRjsKKwljcC0+dHJhbnNmZXJfbGVuID0gdG90YWxfbGVuOworCWNwLT5pb19mbGFncyA9IElPQUNDRUwxX0lPRkxBR1NfSU9fUkVRIHwKKwkJCShjZGJfbGVuICYgSU9BQ0NFTDFfSU9GTEFHU19DREJMRU5fTUFTSyk7CisJY3AtPmNvbnRyb2wgPSBjb250cm9sOworCW1lbWNweShjcC0+Q0RCLCBjZGIsIGNkYl9sZW4pOworCW1lbWNweShjcC0+Q0lTU19MVU4sIHNjc2kzYWRkciwgOCk7CisJLyogVGFnIHdhcyBhbHJlYWR5IHNldCBhdCBpbml0IHRpbWUuICovCisJZW5xdWV1ZV9jbWRfYW5kX3N0YXJ0X2lvKGgsIGMpOworCXJldHVybiAwOworfQorCisvKgorICogUXVldWUgYSBjb21tYW5kIGRpcmVjdGx5IHRvIGEgZGV2aWNlIGJlaGluZCB0aGUgY29udHJvbGxlciB1c2luZyB0aGUKKyAqIEkvTyBhY2NlbGVyYXRvciBwYXRoLgorICovCitzdGF0aWMgaW50IGhwc2Ffc2NzaV9pb2FjY2VsX2RpcmVjdF9tYXAoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJcmV0dXJuIGhwc2Ffc2NzaV9pb2FjY2VsX3F1ZXVlX2NvbW1hbmQoaCwgYywgZGV2LT5pb2FjY2VsX2hhbmRsZSwKKwkJY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4sIGRldi0+c2NzaTNhZGRyKTsKK30KKworLyoKKyAqIFNldCBlbmNyeXB0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBpb2FjY2VsMiByZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkIHNldF9lbmNyeXB0X2lvYWNjZWwyKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCBzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqY3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCByYWlkX21hcF9kYXRhICptYXAgPSAmZGV2LT5yYWlkX21hcDsKKwl1NjQgZmlyc3RfYmxvY2s7CisKKwlCVUdfT04oIShkZXYtPm9mZmxvYWRfY29uZmlnICYmIGRldi0+b2ZmbG9hZF9lbmFibGVkKSk7CisKKwkvKiBBcmUgd2UgZG9pbmcgZW5jcnlwdGlvbiBvbiB0aGlzIGRldmljZSAqLworCWlmICghKG1hcC0+ZmxhZ3MgJiBSQUlEX01BUF9GTEFHX0VOQ1JZUFRfT04pKQorCQlyZXR1cm47CisJLyogU2V0IHRoZSBkYXRhIGVuY3J5cHRpb24ga2V5IGluZGV4LiAqLworCWNwLT5kZWtpbmRleCA9IG1hcC0+ZGVraW5kZXg7CisKKwkvKiBTZXQgdGhlIGVuY3J5cHRpb24gZW5hYmxlIGZsYWcsIGVuY29kZWQgaW50byBkaXJlY3Rpb24gZmllbGQuICovCisJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJFQ1RJT05fRU5DUllQVF9NQVNLOworCisJLyogU2V0IGVuY3J5cHRpb24gdHdlYWsgdmFsdWVzIGJhc2VkIG9uIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcworCSAqIElmIGJsb2NrIHNpemUgaXMgNTEyLCB0d2VhayB2YWx1ZSBpcyBMQkEuCisJICogRm9yIG90aGVyIGJsb2NrIHNpemVzLCB0d2VhayBpcyAoTEJBICogYmxvY2sgc2l6ZSkvIDUxMikKKwkgKi8KKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCS8qIFJlcXVpcmVkPyA2LWJ5dGUgY2RicyBlbGltaW5hdGVkIGJ5IGZpeHVwX2lvYWNjZWxfY2RiICovCisJY2FzZSBXUklURV82OgorCWNhc2UgUkVBRF82OgorCQlpZiAobWFwLT52b2x1bWVfYmxrX3NpemUgPT0gNTEyKSB7CisJCQljcC0+dHdlYWtfbG93ZXIgPQorCQkJCSgoKHUzMikgY21kLT5jbW5kWzJdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFszXTsKKwkJCWNwLT50d2Vha191cHBlciA9IDA7CisJCX0gZWxzZSB7CisJCQlmaXJzdF9ibG9jayA9CisJCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzNdOworCQkJZmlyc3RfYmxvY2sgPSAoZmlyc3RfYmxvY2sgKiBtYXAtPnZvbHVtZV9ibGtfc2l6ZSkvNTEyOworCQkJY3AtPnR3ZWFrX2xvd2VyID0gKHUzMilmaXJzdF9ibG9jazsKKwkJCWNwLT50d2Vha191cHBlciA9ICh1MzIpKGZpcnN0X2Jsb2NrID4+IDMyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdSSVRFXzEwOgorCWNhc2UgUkVBRF8xMDoKKwkJaWYgKG1hcC0+dm9sdW1lX2Jsa19zaXplID09IDUxMikgeworCQkJY3AtPnR3ZWFrX2xvd2VyID0KKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFszXSkgPDwgMTYpIHwKKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbNV07CisJCQljcC0+dHdlYWtfdXBwZXIgPSAwOworCQl9IGVsc2UgeworCQkJZmlyc3RfYmxvY2sgPQorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCAyNCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs1XTsKKwkJCWZpcnN0X2Jsb2NrID0gKGZpcnN0X2Jsb2NrICogbWFwLT52b2x1bWVfYmxrX3NpemUpLzUxMjsKKwkJCWNwLT50d2Vha19sb3dlciA9ICh1MzIpZmlyc3RfYmxvY2s7CisJCQljcC0+dHdlYWtfdXBwZXIgPSAodTMyKShmaXJzdF9ibG9jayA+PiAzMik7CisJCX0KKwkJYnJlYWs7CisJLyogUmVxdWlyZWQ/IDEyLWJ5dGUgY2RicyBlbGltaW5hdGVkIGJ5IGZpeHVwX2lvYWNjZWxfY2RiICovCisJY2FzZSBXUklURV8xMjoKKwljYXNlIFJFQURfMTI6CisJCWlmIChtYXAtPnZvbHVtZV9ibGtfc2l6ZSA9PSA1MTIpIHsKKwkJCWNwLT50d2Vha19sb3dlciA9CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0X2Jsb2NrID0KKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgMTYpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbNV07CisJCQlmaXJzdF9ibG9jayA9IChmaXJzdF9ibG9jayAqIG1hcC0+dm9sdW1lX2Jsa19zaXplKS81MTI7CisJCQljcC0+dHdlYWtfbG93ZXIgPSAodTMyKWZpcnN0X2Jsb2NrOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gKHUzMikoZmlyc3RfYmxvY2sgPj4gMzIpOworCQl9CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTY6CisJY2FzZSBSRUFEXzE2OgorCQlpZiAobWFwLT52b2x1bWVfYmxrX3NpemUgPT0gNTEyKSB7CisJCQljcC0+dHdlYWtfbG93ZXIgPQorCQkJCSgoKHUzMikgY21kLT5jbW5kWzZdKSA8PCAyNCkgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzddKSA8PCAxNikgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs5XTsKKwkJCWNwLT50d2Vha191cHBlciA9CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQl9IGVsc2UgeworCQkJZmlyc3RfYmxvY2sgPQorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCA1NikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCA0OCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA0MCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzVdKSA8PCAzMikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzZdKSA8PCAyNCkgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzddKSA8PCAxNikgfAorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs5XTsKKwkJCWZpcnN0X2Jsb2NrID0gKGZpcnN0X2Jsb2NrICogbWFwLT52b2x1bWVfYmxrX3NpemUpLzUxMjsKKwkJCWNwLT50d2Vha19sb3dlciA9ICh1MzIpZmlyc3RfYmxvY2s7CisJCQljcC0+dHdlYWtfdXBwZXIgPSAodTMyKShmaXJzdF9ibG9jayA+PiAzMik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaC0+cGRldi0+ZGV2LAorCQkJIkVSUk9SOiAlczogSU9BQ0NFTCByZXF1ZXN0IENEQiBzaXplIG5vdCBzdXBwb3J0ZWQgZm9yIGVuY3J5cHRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCUJVRygpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWwyX3F1ZXVlX2NvbW1hbmQoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiBpb2FjY2VsX2hhbmRsZSwgdTggKmNkYiwgaW50IGNkYl9sZW4sCisJdTggKnNjc2kzYWRkcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBjLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqY3AgPSAmaC0+aW9hY2NlbDJfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCXN0cnVjdCBpb2FjY2VsMl9zZ19lbGVtZW50ICpjdXJyX3NnOworCWludCB1c2Vfc2csIGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1NjQgYWRkcjY0OworCXUzMiBsZW47CisJdTMyIHRvdGFsX2xlbiA9IDA7CisKKwlpZiAoc2NzaV9zZ19jb3VudChjbWQpID4gaC0+aW9hY2NlbF9tYXhzZykKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwlpZiAoZml4dXBfaW9hY2NlbF9jZGIoY2RiLCAmY2RiX2xlbikpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCWMtPmNtZF90eXBlID0gQ01EX0lPQUNDRUwyOworCS8qIEFkanVzdCB0aGUgRE1BIGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIGFjY2VsZXJhdGVkIGNvbW1hbmQgYnVmZmVyICovCisJYy0+YnVzYWRkciA9ICh1MzIpIGgtPmlvYWNjZWwyX2NtZF9wb29sX2RoYW5kbGUgKworCQkJCShjLT5jbWRpbmRleCAqIHNpemVvZigqY3ApKTsKKwlCVUdfT04oYy0+YnVzYWRkciAmIDB4MDAwMDAwN0YpOworCisJbWVtc2V0KGNwLCAwLCBzaXplb2YoKmNwKSk7CisJY3AtPklVX3R5cGUgPSBJT0FDQ0VMMl9JVV9UWVBFOworCisJdXNlX3NnID0gc2NzaV9kbWFfbWFwKGNtZCk7CisJaWYgKHVzZV9zZyA8IDApCisJCXJldHVybiB1c2Vfc2c7CisKKwlpZiAodXNlX3NnKSB7CisJCUJVR19PTih1c2Vfc2cgPiBJT0FDQ0VMMl9NQVhTR0VOVFJJRVMpOworCQljdXJyX3NnID0gY3AtPnNnOworCQlzY3NpX2Zvcl9lYWNoX3NnKGNtZCwgc2csIHVzZV9zZywgaSkgeworCQkJYWRkcjY0ID0gKHU2NCkgc2dfZG1hX2FkZHJlc3Moc2cpOworCQkJbGVuICA9IHNnX2RtYV9sZW4oc2cpOworCQkJdG90YWxfbGVuICs9IGxlbjsKKwkJCWN1cnJfc2ctPmFkZHJlc3MgPSBjcHVfdG9fbGU2NChhZGRyNjQpOworCQkJY3Vycl9zZy0+bGVuZ3RoID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJCWN1cnJfc2ctPnJlc2VydmVkWzBdID0gMDsKKwkJCWN1cnJfc2ctPnJlc2VydmVkWzFdID0gMDsKKwkJCWN1cnJfc2ctPnJlc2VydmVkWzJdID0gMDsKKwkJCWN1cnJfc2ctPmNoYWluX2luZGljYXRvciA9IDA7CisJCQljdXJyX3NnKys7CisJCX0KKworCQlzd2l0Y2ggKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwkJY2FzZSBETUFfVE9fREVWSUNFOgorCQkJY3AtPmRpcmVjdGlvbiAmPSB+SU9BQ0NFTDJfRElSRUNUSU9OX01BU0s7CisJCQljcC0+ZGlyZWN0aW9uIHw9IElPQUNDRUwyX0RJUl9EQVRBX09VVDsKKwkJCWJyZWFrOworCQljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJCWNwLT5kaXJlY3Rpb24gJj0gfklPQUNDRUwyX0RJUkVDVElPTl9NQVNLOworCQkJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJfREFUQV9JTjsKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJY3AtPmRpcmVjdGlvbiAmPSB+SU9BQ0NFTDJfRElSRUNUSU9OX01BU0s7CisJCQljcC0+ZGlyZWN0aW9uIHw9IElPQUNDRUwyX0RJUl9OT19EQVRBOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJ1bmtub3duIGRhdGEgZGlyZWN0aW9uOiAlZFxuIiwKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCUJVRygpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQljcC0+ZGlyZWN0aW9uICY9IH5JT0FDQ0VMMl9ESVJFQ1RJT05fTUFTSzsKKwkJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJfTk9fREFUQTsKKwl9CisKKwkvKiBTZXQgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLCBpZiBuZWNlc3NhcnkgKi8KKwlzZXRfZW5jcnlwdF9pb2FjY2VsMihoLCBjLCBjcCk7CisKKwljcC0+c2NzaV9uZXh1cyA9IGlvYWNjZWxfaGFuZGxlOworCWNwLT5UYWcgPSAoYy0+Y21kaW5kZXggPDwgRElSRUNUX0xPT0tVUF9TSElGVCkgfAorCQkJCURJUkVDVF9MT09LVVBfQklUOworCW1lbWNweShjcC0+Y2RiLCBjZGIsIHNpemVvZihjcC0+Y2RiKSk7CisKKwkvKiBmaWxsIGluIHNnIGVsZW1lbnRzICovCisJY3AtPnNnX2NvdW50ID0gKHU4KSB1c2Vfc2c7CisKKwljcC0+ZGF0YV9sZW4gPSBjcHVfdG9fbGUzMih0b3RhbF9sZW4pOworCWNwLT5lcnJfcHRyID0gY3B1X3RvX2xlNjQoYy0+YnVzYWRkciArCisJCQlvZmZzZXRvZihzdHJ1Y3QgaW9fYWNjZWwyX2NtZCwgZXJyb3JfZGF0YSkpOworCWNwLT5lcnJfbGVuID0gY3B1X3RvX2xlMzIoKHUzMikgc2l6ZW9mKGNwLT5lcnJvcl9kYXRhKSk7CisKKwllbnF1ZXVlX2NtZF9hbmRfc3RhcnRfaW8oaCwgYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBRdWV1ZSBhIGNvbW1hbmQgdG8gdGhlIGNvcnJlY3QgSS9PIGFjY2VsZXJhdG9yIHBhdGguCisgKi8KK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWxfcXVldWVfY29tbWFuZChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBDb21tYW5kTGlzdCAqYywgdTMyIGlvYWNjZWxfaGFuZGxlLCB1OCAqY2RiLCBpbnQgY2RiX2xlbiwKKwl1OCAqc2NzaTNhZGRyKQoreworCWlmIChoLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpCisJCXJldHVybiBocHNhX3Njc2lfaW9hY2NlbDFfcXVldWVfY29tbWFuZChoLCBjLCBpb2FjY2VsX2hhbmRsZSwKKwkJCQkJCWNkYiwgY2RiX2xlbiwgc2NzaTNhZGRyKTsKKwllbHNlCisJCXJldHVybiBocHNhX3Njc2lfaW9hY2NlbDJfcXVldWVfY29tbWFuZChoLCBjLCBpb2FjY2VsX2hhbmRsZSwKKwkJCQkJCWNkYiwgY2RiX2xlbiwgc2NzaTNhZGRyKTsKK30KKworc3RhdGljIHZvaWQgcmFpZF9tYXBfaGVscGVyKHN0cnVjdCByYWlkX21hcF9kYXRhICptYXAsCisJCWludCBvZmZsb2FkX3RvX21pcnJvciwgdTMyICptYXBfaW5kZXgsIHUzMiAqY3VycmVudF9ncm91cCkKK3sKKwlpZiAob2ZmbG9hZF90b19taXJyb3IgPT0gMCkgIHsKKwkJLyogdXNlIHBoeXNpY2FsIGRpc2sgaW4gdGhlIGZpcnN0IG1pcnJvcmVkIGdyb3VwLiAqLworCQkqbWFwX2luZGV4ICU9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlyZXR1cm47CisJfQorCWRvIHsKKwkJLyogZGV0ZXJtaW5lIG1pcnJvciBncm91cCB0aGF0ICptYXBfaW5kZXggaW5kaWNhdGVzICovCisJCSpjdXJyZW50X2dyb3VwID0gKm1hcF9pbmRleCAvIG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlpZiAob2ZmbG9hZF90b19taXJyb3IgPT0gKmN1cnJlbnRfZ3JvdXApCisJCQljb250aW51ZTsKKwkJaWYgKCpjdXJyZW50X2dyb3VwIDwgKG1hcC0+bGF5b3V0X21hcF9jb3VudCAtIDEpKSB7CisJCQkvKiBzZWxlY3QgbWFwIGluZGV4IGZyb20gbmV4dCBncm91cCAqLworCQkJKm1hcF9pbmRleCArPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJCSgqY3VycmVudF9ncm91cCkrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIHNlbGVjdCBtYXAgaW5kZXggZnJvbSBmaXJzdCBncm91cCAqLworCQkJKm1hcF9pbmRleCAlPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJCSpjdXJyZW50X2dyb3VwID0gMDsKKwkJfQorCX0gd2hpbGUgKG9mZmxvYWRfdG9fbWlycm9yICE9ICpjdXJyZW50X2dyb3VwKTsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gcGVyZm9ybSBvZmZsb2FkIFJBSUQgbWFwcGluZyBmb3IgYSBsb2dpY2FsIHZvbHVtZSBJL08uCisgKi8KK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWxfcmFpZF9tYXAoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCByYWlkX21hcF9kYXRhICptYXAgPSAmZGV2LT5yYWlkX21hcDsKKwlzdHJ1Y3QgcmFpZF9tYXBfZGlza19kYXRhICpkZCA9ICZtYXAtPmRhdGFbMF07CisJaW50IGlzX3dyaXRlID0gMDsKKwl1MzIgbWFwX2luZGV4OworCXU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jazsKKwl1MzIgYmxvY2tfY250OworCXUzMiBibG9ja3NfcGVyX3JvdzsKKwl1NjQgZmlyc3Rfcm93LCBsYXN0X3JvdzsKKwl1MzIgZmlyc3Rfcm93X29mZnNldCwgbGFzdF9yb3dfb2Zmc2V0OworCXUzMiBmaXJzdF9jb2x1bW4sIGxhc3RfY29sdW1uOworCXU2NCByMF9maXJzdF9yb3csIHIwX2xhc3Rfcm93OworCXUzMiByNW9yNl9ibG9ja3NfcGVyX3JvdzsKKwl1NjQgcjVvcjZfZmlyc3Rfcm93LCByNW9yNl9sYXN0X3JvdzsKKwl1MzIgcjVvcjZfZmlyc3Rfcm93X29mZnNldCwgcjVvcjZfbGFzdF9yb3dfb2Zmc2V0OworCXUzMiByNW9yNl9maXJzdF9jb2x1bW4sIHI1b3I2X2xhc3RfY29sdW1uOworCXUzMiB0b3RhbF9kaXNrc19wZXJfcm93OworCXUzMiBzdHJpcGVzaXplOworCXUzMiBmaXJzdF9ncm91cCwgbGFzdF9ncm91cCwgY3VycmVudF9ncm91cDsKKwl1MzIgbWFwX3JvdzsKKwl1MzIgZGlza19oYW5kbGU7CisJdTY0IGRpc2tfYmxvY2s7CisJdTMyIGRpc2tfYmxvY2tfY250OworCXU4IGNkYlsxNl07CisJdTggY2RiX2xlbjsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJdTY0IHRtcGRpdjsKKyNlbmRpZgorCWludCBvZmZsb2FkX3RvX21pcnJvcjsKKworCUJVR19PTighKGRldi0+b2ZmbG9hZF9jb25maWcgJiYgZGV2LT5vZmZsb2FkX2VuYWJsZWQpKTsKKworCS8qIGNoZWNrIGZvciB2YWxpZCBvcGNvZGUsIGdldCBMQkEgYW5kIGJsb2NrIGNvdW50ICovCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwljYXNlIFdSSVRFXzY6CisJCWlzX3dyaXRlID0gMTsKKwljYXNlIFJFQURfNjoKKwkJZmlyc3RfYmxvY2sgPQorCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFszXTsKKwkJYmxvY2tfY250ID0gY21kLT5jbW5kWzRdOworCQlicmVhazsKKwljYXNlIFdSSVRFXzEwOgorCQlpc193cml0ZSA9IDE7CisJY2FzZSBSRUFEXzEwOgorCQlmaXJzdF9ibG9jayA9CisJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFs1XTsKKwkJYmxvY2tfY250ID0KKwkJCSgoKHUzMikgY21kLT5jbW5kWzddKSA8PCA4KSB8CisJCQljbWQtPmNtbmRbOF07CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTI6CisJCWlzX3dyaXRlID0gMTsKKwljYXNlIFJFQURfMTI6CisJCWZpcnN0X2Jsb2NrID0KKwkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCAyNCkgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJY21kLT5jbW5kWzVdOworCQlibG9ja19jbnQgPQorCQkJKCgodTMyKSBjbWQtPmNtbmRbNl0pIDw8IDI0KSB8CisJCQkoKCh1MzIpIGNtZC0+Y21uZFs3XSkgPDwgMTYpIHwKKwkJCSgoKHUzMikgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCWNtZC0+Y21uZFs5XTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV8xNjoKKwkJaXNfd3JpdGUgPSAxOworCWNhc2UgUkVBRF8xNjoKKwkJZmlyc3RfYmxvY2sgPQorCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDU2KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgNDgpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA0MCkgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbNV0pIDw8IDMyKSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFs2XSkgPDwgMjQpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzddKSA8PCAxNikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbOF0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFs5XTsKKwkJYmxvY2tfY250ID0KKwkJCSgoKHUzMikgY21kLT5jbW5kWzEwXSkgPDwgMjQpIHwKKwkJCSgoKHUzMikgY21kLT5jbW5kWzExXSkgPDwgMTYpIHwKKwkJCSgoKHUzMikgY21kLT5jbW5kWzEyXSkgPDwgOCkgfAorCQkJY21kLT5jbW5kWzEzXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7IC8qIHByb2Nlc3MgdmlhIG5vcm1hbCBJL08gcGF0aCAqLworCX0KKwlCVUdfT04oYmxvY2tfY250ID09IDApOworCWxhc3RfYmxvY2sgPSBmaXJzdF9ibG9jayArIGJsb2NrX2NudCAtIDE7CisKKwkvKiBjaGVjayBmb3Igd3JpdGUgdG8gbm9uLVJBSUQtMCAqLworCWlmIChpc193cml0ZSAmJiBkZXYtPnJhaWRfbGV2ZWwgIT0gMCkKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBibG9jayBvciB3cmFwYXJvdW5kICovCisJaWYgKGxhc3RfYmxvY2sgPj0gbWFwLT52b2x1bWVfYmxrX2NudCB8fCBsYXN0X2Jsb2NrIDwgZmlyc3RfYmxvY2spCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJLyogY2FsY3VsYXRlIHN0cmlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QgKi8KKwlibG9ja3NfcGVyX3JvdyA9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93ICogbWFwLT5zdHJpcF9zaXplOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkodm9pZCkgZG9fZGl2KHRtcGRpdiwgYmxvY2tzX3Blcl9yb3cpOworCWZpcnN0X3JvdyA9IHRtcGRpdjsKKwl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCSh2b2lkKSBkb19kaXYodG1wZGl2LCBibG9ja3NfcGVyX3Jvdyk7CisJbGFzdF9yb3cgPSB0bXBkaXY7CisJZmlyc3Rfcm93X29mZnNldCA9ICh1MzIpIChmaXJzdF9ibG9jayAtIChmaXJzdF9yb3cgKiBibG9ja3NfcGVyX3JvdykpOworCWxhc3Rfcm93X29mZnNldCA9ICh1MzIpIChsYXN0X2Jsb2NrIC0gKGxhc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwl0bXBkaXYgPSBmaXJzdF9yb3dfb2Zmc2V0OworCSh2b2lkKSBkb19kaXYodG1wZGl2LCAgbWFwLT5zdHJpcF9zaXplKTsKKwlmaXJzdF9jb2x1bW4gPSB0bXBkaXY7CisJdG1wZGl2ID0gbGFzdF9yb3dfb2Zmc2V0OworCSh2b2lkKSBkb19kaXYodG1wZGl2LCBtYXAtPnN0cmlwX3NpemUpOworCWxhc3RfY29sdW1uID0gdG1wZGl2OworI2Vsc2UKKwlmaXJzdF9yb3cgPSBmaXJzdF9ibG9jayAvIGJsb2Nrc19wZXJfcm93OworCWxhc3Rfcm93ID0gbGFzdF9ibG9jayAvIGJsb2Nrc19wZXJfcm93OworCWZpcnN0X3Jvd19vZmZzZXQgPSAodTMyKSAoZmlyc3RfYmxvY2sgLSAoZmlyc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwlsYXN0X3Jvd19vZmZzZXQgPSAodTMyKSAobGFzdF9ibG9jayAtIChsYXN0X3JvdyAqIGJsb2Nrc19wZXJfcm93KSk7CisJZmlyc3RfY29sdW1uID0gZmlyc3Rfcm93X29mZnNldCAvIG1hcC0+c3RyaXBfc2l6ZTsKKwlsYXN0X2NvbHVtbiA9IGxhc3Rfcm93X29mZnNldCAvIG1hcC0+c3RyaXBfc2l6ZTsKKyNlbmRpZgorCisJLyogaWYgdGhpcyBpc24ndCBhIHNpbmdsZSByb3cvY29sdW1uIHRoZW4gZ2l2ZSB0byB0aGUgY29udHJvbGxlciAqLworCWlmICgoZmlyc3Rfcm93ICE9IGxhc3Rfcm93KSB8fCAoZmlyc3RfY29sdW1uICE9IGxhc3RfY29sdW1uKSkKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwkvKiBwcm9jZWVkaW5nIHdpdGggZHJpdmVyIG1hcHBpbmcgKi8KKwl0b3RhbF9kaXNrc19wZXJfcm93ID0gbWFwLT5kYXRhX2Rpc2tzX3Blcl9yb3cgKworCQkJCW1hcC0+bWV0YWRhdGFfZGlza3NfcGVyX3JvdzsKKwltYXBfcm93ID0gKCh1MzIpKGZpcnN0X3JvdyA+PiBtYXAtPnBhcml0eV9yb3RhdGlvbl9zaGlmdCkpICUKKwkJCQltYXAtPnJvd19jbnQ7CisJbWFwX2luZGV4ID0gKG1hcF9yb3cgKiB0b3RhbF9kaXNrc19wZXJfcm93KSArIGZpcnN0X2NvbHVtbjsKKworCXN3aXRjaCAoZGV2LT5yYWlkX2xldmVsKSB7CisJY2FzZSBIUFNBX1JBSURfMDoKKwkJYnJlYWs7IC8qIG5vdGhpbmcgc3BlY2lhbCB0byBkbyAqLworCWNhc2UgSFBTQV9SQUlEXzE6CisJCS8qIEhhbmRsZXMgbG9hZCBiYWxhbmNlIGFjcm9zcyBSQUlEIDEgbWVtYmVycy4KKwkJICogKDItZHJpdmUgUjEgYW5kIFIxMCB3aXRoIGV2ZW4gIyBvZiBkcml2ZXMuKQorCQkgKiBBcHByb3ByaWF0ZSBmb3IgU1NEcywgbm90IG9wdGltYWwgZm9yIEhERHMKKwkJICovCisJCUJVR19PTihtYXAtPmxheW91dF9tYXBfY291bnQgIT0gMik7CisJCWlmIChkZXYtPm9mZmxvYWRfdG9fbWlycm9yKQorCQkJbWFwX2luZGV4ICs9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlkZXYtPm9mZmxvYWRfdG9fbWlycm9yID0gIWRldi0+b2ZmbG9hZF90b19taXJyb3I7CisJCWJyZWFrOworCWNhc2UgSFBTQV9SQUlEX0FETToKKwkJLyogSGFuZGxlcyBOLXdheSBtaXJyb3JzICAoUjEtQURNKQorCQkgKiBhbmQgUjEwIHdpdGggIyBvZiBkcml2ZXMgZGl2aXNpYmxlIGJ5IDMuKQorCQkgKi8KKwkJQlVHX09OKG1hcC0+bGF5b3V0X21hcF9jb3VudCAhPSAzKTsKKworCQlvZmZsb2FkX3RvX21pcnJvciA9IGRldi0+b2ZmbG9hZF90b19taXJyb3I7CisJCXJhaWRfbWFwX2hlbHBlcihtYXAsIG9mZmxvYWRfdG9fbWlycm9yLAorCQkJCSZtYXBfaW5kZXgsICZjdXJyZW50X2dyb3VwKTsKKwkJLyogc2V0IG1pcnJvciBncm91cCB0byB1c2UgbmV4dCB0aW1lICovCisJCW9mZmxvYWRfdG9fbWlycm9yID0KKwkJCShvZmZsb2FkX3RvX21pcnJvciA+PSBtYXAtPmxheW91dF9tYXBfY291bnQgLSAxKQorCQkJPyAwIDogb2ZmbG9hZF90b19taXJyb3IgKyAxOworCQkvKiBGSVhNRTogcmVtb3ZlIGFmdGVyIGRlYnVnL2RldiAqLworCQlCVUdfT04ob2ZmbG9hZF90b19taXJyb3IgPj0gbWFwLT5sYXlvdXRfbWFwX2NvdW50KTsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJERUJVRzogVXNpbmcgcGh5c2ljYWwgZGlzayBtYXAgaW5kZXggJWQgZnJvbSBtaXJyb3IgZ3JvdXAgJWRcbiIsCisJCQltYXBfaW5kZXgsIG9mZmxvYWRfdG9fbWlycm9yKTsKKwkJZGV2LT5vZmZsb2FkX3RvX21pcnJvciA9IG9mZmxvYWRfdG9fbWlycm9yOworCQkvKiBBdm9pZCBkaXJlY3QgdXNlIG9mIGRldi0+b2ZmbG9hZF90b19taXJyb3Igd2l0aGluIHRoaXMKKwkJICogZnVuY3Rpb24gc2luY2UgbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBzaW11bHRhbmVvdXNseQorCQkgKiBpbmNyZW1lbnQgaXQgYmV5b25kIHRoZSByYW5nZSBvZiBkZXYtPmxheW91dF9tYXBfY291bnQgLTEuCisJCSAqLworCQlicmVhazsKKwljYXNlIEhQU0FfUkFJRF81OgorCWNhc2UgSFBTQV9SQUlEXzY6CisJCWlmIChtYXAtPmxheW91dF9tYXBfY291bnQgPD0gMSkKKwkJCWJyZWFrOworCisJCS8qIFZlcmlmeSBmaXJzdCBhbmQgbGFzdCBibG9jayBhcmUgaW4gc2FtZSBSQUlEIGdyb3VwICovCisJCXI1b3I2X2Jsb2Nrc19wZXJfcm93ID0KKwkJCW1hcC0+c3RyaXBfc2l6ZSAqIG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93OworCQlCVUdfT04ocjVvcjZfYmxvY2tzX3Blcl9yb3cgPT0gMCk7CisJCXN0cmlwZXNpemUgPSByNW9yNl9ibG9ja3NfcGVyX3JvdyAqIG1hcC0+bGF5b3V0X21hcF9jb3VudDsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCXRtcGRpdiA9IGZpcnN0X2Jsb2NrOworCQlmaXJzdF9ncm91cCA9IGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQl0bXBkaXYgPSBmaXJzdF9ncm91cDsKKwkJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJZmlyc3RfZ3JvdXAgPSB0bXBkaXY7CisJCXRtcGRpdiA9IGxhc3RfYmxvY2s7CisJCWxhc3RfZ3JvdXAgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gbGFzdF9ncm91cDsKKwkJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJbGFzdF9ncm91cCA9IHRtcGRpdjsKKyNlbHNlCisJCWZpcnN0X2dyb3VwID0gKGZpcnN0X2Jsb2NrICUgc3RyaXBlc2l6ZSkgLyByNW9yNl9ibG9ja3NfcGVyX3JvdzsKKwkJbGFzdF9ncm91cCA9IChsYXN0X2Jsb2NrICUgc3RyaXBlc2l6ZSkgLyByNW9yNl9ibG9ja3NfcGVyX3JvdzsKKyNlbmRpZgorCQlpZiAoZmlyc3RfZ3JvdXAgIT0gbGFzdF9ncm91cCkKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJCS8qIFZlcmlmeSByZXF1ZXN0IGlzIGluIGEgc2luZ2xlIHJvdyBvZiBSQUlEIDUvNiAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwkJdG1wZGl2ID0gZmlyc3RfYmxvY2s7CisJCSh2b2lkKSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJZmlyc3Rfcm93ID0gcjVvcjZfZmlyc3Rfcm93ID0gcjBfZmlyc3Rfcm93ID0gdG1wZGl2OworCQl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCQkodm9pZCkgZG9fZGl2KHRtcGRpdiwgc3RyaXBlc2l6ZSk7CisJCXI1b3I2X2xhc3Rfcm93ID0gcjBfbGFzdF9yb3cgPSB0bXBkaXY7CisjZWxzZQorCQlmaXJzdF9yb3cgPSByNW9yNl9maXJzdF9yb3cgPSByMF9maXJzdF9yb3cgPQorCQkJCQkJZmlyc3RfYmxvY2sgLyBzdHJpcGVzaXplOworCQlyNW9yNl9sYXN0X3JvdyA9IHIwX2xhc3Rfcm93ID0gbGFzdF9ibG9jayAvIHN0cmlwZXNpemU7CisjZW5kaWYKKwkJaWYgKHI1b3I2X2ZpcnN0X3JvdyAhPSByNW9yNl9sYXN0X3JvdykKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisKKwkJLyogVmVyaWZ5IHJlcXVlc3QgaXMgaW4gYSBzaW5nbGUgY29sdW1uICovCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkJZmlyc3Rfcm93X29mZnNldCA9IGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQl0bXBkaXYgPSBmaXJzdF9yb3dfb2Zmc2V0OworCQlmaXJzdF9yb3dfb2Zmc2V0ID0gKHUzMikgZG9fZGl2KHRtcGRpdiwgcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCQlyNW9yNl9maXJzdF9yb3dfb2Zmc2V0ID0gZmlyc3Rfcm93X29mZnNldDsKKwkJdG1wZGl2ID0gbGFzdF9ibG9jazsKKwkJcjVvcjZfbGFzdF9yb3dfb2Zmc2V0ID0gZG9fZGl2KHRtcGRpdiwgc3RyaXBlc2l6ZSk7CisJCXRtcGRpdiA9IHI1b3I2X2xhc3Rfcm93X29mZnNldDsKKwkJcjVvcjZfbGFzdF9yb3dfb2Zmc2V0ID0gZG9fZGl2KHRtcGRpdiwgcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCQl0bXBkaXYgPSByNW9yNl9maXJzdF9yb3dfb2Zmc2V0OworCQkodm9pZCkgZG9fZGl2KHRtcGRpdiwgbWFwLT5zdHJpcF9zaXplKTsKKwkJZmlyc3RfY29sdW1uID0gcjVvcjZfZmlyc3RfY29sdW1uID0gdG1wZGl2OworCQl0bXBkaXYgPSByNW9yNl9sYXN0X3Jvd19vZmZzZXQ7CisJCSh2b2lkKSBkb19kaXYodG1wZGl2LCBtYXAtPnN0cmlwX3NpemUpOworCQlyNW9yNl9sYXN0X2NvbHVtbiA9IHRtcGRpdjsKKyNlbHNlCisJCWZpcnN0X3Jvd19vZmZzZXQgPSByNW9yNl9maXJzdF9yb3dfb2Zmc2V0ID0KKwkJCSh1MzIpKChmaXJzdF9ibG9jayAlIHN0cmlwZXNpemUpICUKKwkJCQkJCXI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKworCQlyNW9yNl9sYXN0X3Jvd19vZmZzZXQgPQorCQkJKHUzMikoKGxhc3RfYmxvY2sgJSBzdHJpcGVzaXplKSAlCisJCQkJCQlyNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisKKwkJZmlyc3RfY29sdW1uID0gcjVvcjZfZmlyc3RfY29sdW1uID0KKwkJCXI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQgLyBtYXAtPnN0cmlwX3NpemU7CisJCXI1b3I2X2xhc3RfY29sdW1uID0KKwkJCXI1b3I2X2xhc3Rfcm93X29mZnNldCAvIG1hcC0+c3RyaXBfc2l6ZTsKKyNlbmRpZgorCQlpZiAocjVvcjZfZmlyc3RfY29sdW1uICE9IHI1b3I2X2xhc3RfY29sdW1uKQorCQkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisKKwkJLyogUmVxdWVzdCBpcyBlbGlnaWJsZSAqLworCQltYXBfcm93ID0gKCh1MzIpKGZpcnN0X3JvdyA+PiBtYXAtPnBhcml0eV9yb3RhdGlvbl9zaGlmdCkpICUKKwkJCW1hcC0+cm93X2NudDsKKworCQltYXBfaW5kZXggPSAoZmlyc3RfZ3JvdXAgKgorCQkJKG1hcC0+cm93X2NudCAqIHRvdGFsX2Rpc2tzX3Blcl9yb3cpKSArCisJCQkobWFwX3JvdyAqIHRvdGFsX2Rpc2tzX3Blcl9yb3cpICsgZmlyc3RfY29sdW1uOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKwl9CisKKwlkaXNrX2hhbmRsZSA9IGRkW21hcF9pbmRleF0uaW9hY2NlbF9oYW5kbGU7CisJZGlza19ibG9jayA9IG1hcC0+ZGlza19zdGFydGluZ19ibGsgKyAoZmlyc3Rfcm93ICogbWFwLT5zdHJpcF9zaXplKSArCisJCQkoZmlyc3Rfcm93X29mZnNldCAtIChmaXJzdF9jb2x1bW4gKiBtYXAtPnN0cmlwX3NpemUpKTsKKwlkaXNrX2Jsb2NrX2NudCA9IGJsb2NrX2NudDsKKworCS8qIGhhbmRsZSBkaWZmZXJpbmcgbG9naWNhbC9waHlzaWNhbCBibG9jayBzaXplcyAqLworCWlmIChtYXAtPnBoeXNfYmxrX3NoaWZ0KSB7CisJCWRpc2tfYmxvY2sgPDw9IG1hcC0+cGh5c19ibGtfc2hpZnQ7CisJCWRpc2tfYmxvY2tfY250IDw8PSBtYXAtPnBoeXNfYmxrX3NoaWZ0OworCX0KKwlCVUdfT04oZGlza19ibG9ja19jbnQgPiAweGZmZmYpOworCisJLyogYnVpbGQgdGhlIG5ldyBDREIgZm9yIHRoZSBwaHlzaWNhbCBkaXNrIEkvTyAqLworCWlmIChkaXNrX2Jsb2NrID4gMHhmZmZmZmZmZikgeworCQljZGJbMF0gPSBpc193cml0ZSA/IFdSSVRFXzE2IDogUkVBRF8xNjsKKwkJY2RiWzFdID0gMDsKKwkJY2RiWzJdID0gKHU4KSAoZGlza19ibG9jayA+PiA1Nik7CisJCWNkYlszXSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gNDgpOworCQljZGJbNF0gPSAodTgpIChkaXNrX2Jsb2NrID4+IDQwKTsKKwkJY2RiWzVdID0gKHU4KSAoZGlza19ibG9jayA+PiAzMik7CisJCWNkYls2XSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gMjQpOworCQljZGJbN10gPSAodTgpIChkaXNrX2Jsb2NrID4+IDE2KTsKKwkJY2RiWzhdID0gKHU4KSAoZGlza19ibG9jayA+PiA4KTsKKwkJY2RiWzldID0gKHU4KSAoZGlza19ibG9jayk7CisJCWNkYlsxMF0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiAyNCk7CisJCWNkYlsxMV0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiAxNik7CisJCWNkYlsxMl0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiA4KTsKKwkJY2RiWzEzXSA9ICh1OCkgKGRpc2tfYmxvY2tfY250KTsKKwkJY2RiWzE0XSA9IDA7CisJCWNkYlsxNV0gPSAwOworCQljZGJfbGVuID0gMTY7CisJfSBlbHNlIHsKKwkJY2RiWzBdID0gaXNfd3JpdGUgPyBXUklURV8xMCA6IFJFQURfMTA7CisJCWNkYlsxXSA9IDA7CisJCWNkYlsyXSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gMjQpOworCQljZGJbM10gPSAodTgpIChkaXNrX2Jsb2NrID4+IDE2KTsKKwkJY2RiWzRdID0gKHU4KSAoZGlza19ibG9jayA+PiA4KTsKKwkJY2RiWzVdID0gKHU4KSAoZGlza19ibG9jayk7CisJCWNkYls2XSA9IDA7CisJCWNkYls3XSA9ICh1OCkgKGRpc2tfYmxvY2tfY250ID4+IDgpOworCQljZGJbOF0gPSAodTgpIChkaXNrX2Jsb2NrX2NudCk7CisJCWNkYls5XSA9IDA7CisJCWNkYl9sZW4gPSAxMDsKKwl9CisJcmV0dXJuIGhwc2Ffc2NzaV9pb2FjY2VsX3F1ZXVlX2NvbW1hbmQoaCwgYywgZGlza19oYW5kbGUsIGNkYiwgY2RiX2xlbiwKKwkJCQkJCWRldi0+c2NzaTNhZGRyKTsKK30KIAogc3RhdGljIGludCBocHNhX3Njc2lfcXVldWVfY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqY21kLAogCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQpAQCAtMjE2OSw2ICszOTUxLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcls4XTsKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOwogCiAJLyogR2V0IHRoZSBwdHIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlIG91dCBvZiBjbWQtPmhvc3QuICovCiAJaCA9IHNkZXZfdG9faGJhKGNtZC0+ZGV2aWNlKTsKQEAgLTIyMDMsNiArMzk4NiwzMiBAQAogCiAJYy0+Y21kX3R5cGUgPSBDTURfU0NTSTsKIAljLT5zY3NpX2NtZCA9IGNtZDsKKworCS8qIENhbGwgYWx0ZXJuYXRlIHN1Ym1pdCByb3V0aW5lIGZvciBJL08gYWNjZWxlcmF0ZWQgY29tbWFuZHMuCisJICogUmV0cmllcyBhbHdheXMgZ28gZG93biB0aGUgbm9ybWFsIEkvTyBwYXRoLgorCSAqLworCWlmIChsaWtlbHkoY21kLT5yZXRyaWVzID09IDAgJiYKKwkJY21kLT5yZXF1ZXN0LT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9GUyAmJgorCQloLT5hY2Npb3BhdGhfc3RhdHVzKSkgeworCQlpZiAoZGV2LT5vZmZsb2FkX2VuYWJsZWQpIHsKKwkJCXJjID0gaHBzYV9zY3NpX2lvYWNjZWxfcmFpZF9tYXAoaCwgYyk7CisJCQlpZiAocmMgPT0gMCkKKwkJCQlyZXR1cm4gMDsgLyogU2VudCBvbiBpb2FjY2VsIHBhdGggKi8KKwkJCWlmIChyYyA8IDApIHsgICAvKiBzY3NpX2RtYV9tYXAgZmFpbGVkLiAqLworCQkJCWNtZF9mcmVlKGgsIGMpOworCQkJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQkJfQorCQl9IGVsc2UgaWYgKGRldi0+aW9hY2NlbF9oYW5kbGUpIHsKKwkJCXJjID0gaHBzYV9zY3NpX2lvYWNjZWxfZGlyZWN0X21hcChoLCBjKTsKKwkJCWlmIChyYyA9PSAwKQorCQkJCXJldHVybiAwOyAvKiBTZW50IG9uIGRpcmVjdCBtYXAgcGF0aCAqLworCQkJaWYgKHJjIDwgMCkgeyAgIC8qIHNjc2lfZG1hX21hcCBmYWlsZWQuICovCisJCQkJY21kX2ZyZWUoaCwgYyk7CisJCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCQl9CisJCX0KKwl9CisKIAljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7ICAvKiB1bnVzZWQgaW4gc2ltcGxlIG1vZGUgKi8KIAltZW1jcHkoJmMtPkhlYWRlci5MVU4uTHVuQWRkckJ5dGVzWzBdLCAmc2NzaTNhZGRyWzBdLCA4KTsKIAljLT5IZWFkZXIuVGFnLmxvd2VyID0gKGMtPmNtZGluZGV4IDw8IERJUkVDVF9MT09LVVBfU0hJRlQpOwpAQCAtMjI2MiwxMSArNDA3MSwzOCBAQAogCiBzdGF0aWMgREVGX1NDU0lfUUNNRChocHNhX3Njc2lfcXVldWVfY29tbWFuZCkKIAorc3RhdGljIGludCBkb19ub3Rfc2Nhbl9pZl9jb250cm9sbGVyX2xvY2tlZF91cChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIERvbid0IGxldCByZXNjYW5zIGJlIGluaXRpYXRlZCBvbiBhIGNvbnRyb2xsZXIga25vd24KKwkgKiB0byBiZSBsb2NrZWQgdXAuICBJZiB0aGUgY29udHJvbGxlciBsb2NrcyB1cCAqZHVyaW5nKgorCSAqIGEgcmVzY2FuLCB0aGF0IHRocmVhZCBpcyBwcm9iYWJseSBob3NlZCwgYnV0IGF0IGxlYXN0CisJICogd2UgY2FuIHByZXZlbnQgbmV3IHJlc2NhbiB0aHJlYWRzIGZyb20gcGlsaW5nIHVwIG9uIGEKKwkgKiBsb2NrZWQgdXAgY29udHJvbGxlci4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShoLT5sb2NrdXBfZGV0ZWN0ZWQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPnNjYW5fbG9jaywgZmxhZ3MpOworCQloLT5zY2FuX2ZpbmlzaGVkID0gMTsKKwkJd2FrZV91cF9hbGwoJmgtPnNjYW5fd2FpdF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPnNjYW5fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBocHNhX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2gpCiB7CiAJc3RydWN0IGN0bHJfaW5mbyAqaCA9IHNob3N0X3RvX2hiYShzaCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChkb19ub3Rfc2Nhbl9pZl9jb250cm9sbGVyX2xvY2tlZF91cChoKSkKKwkJcmV0dXJuOworCiAJLyogd2FpdCB1bnRpbCBhbnkgc2NhbiBhbHJlYWR5IGluIHByb2dyZXNzIGlzIGZpbmlzaGVkLiAqLwogCXdoaWxlICgxKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKQEAgLTIyODMsNiArNDExOSw5IEBACiAJaC0+c2Nhbl9maW5pc2hlZCA9IDA7IC8qIG1hcmsgc2NhbiBhcyBpbiBwcm9ncmVzcyAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPnNjYW5fbG9jaywgZmxhZ3MpOwogCisJaWYgKGRvX25vdF9zY2FuX2lmX2NvbnRyb2xsZXJfbG9ja2VkX3VwKGgpKQorCQlyZXR1cm47CisKIAlocHNhX3VwZGF0ZV9zY3NpX2RldmljZXMoaCwgaC0+c2NzaV9ob3N0LT5ob3N0X25vKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKQEAgLTIzNDYsNyArNDE4NSwxMCBAQAogCXNoLT5tYXhfbHVuID0gSFBTQV9NQVhfTFVOOwogCXNoLT5tYXhfaWQgPSBIUFNBX01BWF9MVU47CiAJc2gtPmNhbl9xdWV1ZSA9IGgtPm5yX2NtZHM7Ci0Jc2gtPmNtZF9wZXJfbHVuID0gaC0+bnJfY21kczsKKwlpZiAoaC0+aGJhX21vZGVfZW5hYmxlZCkKKwkJc2gtPmNtZF9wZXJfbHVuID0gNzsKKwllbHNlCisJCXNoLT5jbWRfcGVyX2x1biA9IGgtPm5yX2NtZHM7CiAJc2gtPnNnX3RhYmxlc2l6ZSA9IGgtPm1heHNnZW50cmllczsKIAloLT5zY3NpX2hvc3QgPSBzaDsKIAlzaC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZykgaDsKQEAgLTIzNzIsNyArNDIxNCw3IEBACiBzdGF0aWMgaW50IHdhaXRfZm9yX2RldmljZV90b19iZWNvbWVfcmVhZHkoc3RydWN0IGN0bHJfaW5mbyAqaCwKIAl1bnNpZ25lZCBjaGFyIGx1bmFkZHJbXSkKIHsKLQlpbnQgcmMgPSAwOworCWludCByYzsKIAlpbnQgY291bnQgPSAwOwogCWludCB3YWl0dGltZSA9IDE7IC8qIHNlY29uZHMgKi8KIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CkBAIC0yMzkyLDYgKzQyMzQsNyBAQAogCQkgKi8KIAkJbXNsZWVwKDEwMDAgKiB3YWl0dGltZSk7CiAJCWNvdW50Kys7CisJCXJjID0gMDsgLyogRGV2aWNlIHJlYWR5LiAqLwogCiAJCS8qIEluY3JlYXNlIHdhaXQgdGltZSB3aXRoIGVhY2ggdHJ5LCB1cCB0byBhIHBvaW50LiAqLwogCQlpZiAod2FpdHRpbWUgPCBIUFNBX01BWF9XQUlUX0lOVEVSVkFMX1NFQ1MpCkBAIC0yNDQ4LDcgKzQyOTEsNyBAQAogCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJyZXNldHRpbmcgZGV2aWNlICVkOiVkOiVkOiVkXG4iLAogCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sIGRldi0+YnVzLCBkZXYtPnRhcmdldCwgZGV2LT5sdW4pOwogCS8qIHNlbmQgYSByZXNldCB0byB0aGUgU0NTSSBMVU4gd2hpY2ggdGhlIGNvbW1hbmQgd2FzIHNlbnQgdG8gKi8KLQlyYyA9IGhwc2Ffc2VuZF9yZXNldChoLCBkZXYtPnNjc2kzYWRkcik7CisJcmMgPSBocHNhX3NlbmRfcmVzZXQoaCwgZGV2LT5zY3NpM2FkZHIsIEhQU0FfUkVTRVRfVFlQRV9MVU4pOwogCWlmIChyYyA9PSAwICYmIHdhaXRfZm9yX2RldmljZV90b19iZWNvbWVfcmVhZHkoaCwgZGV2LT5zY3NpM2FkZHIpID09IDApCiAJCXJldHVybiBTVUNDRVNTOwogCkBAIC0yNDcxLDEyICs0MzE0LDM2IEBACiAJdGFnWzddID0gb3JpZ2luYWxfdGFnWzRdOwogfQogCitzdGF0aWMgdm9pZCBocHNhX2dldF90YWcoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiAqdGFnbG93ZXIsIHUzMiAqdGFndXBwZXIpCit7CisJaWYgKGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSkgeworCQlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqY20xID0gKHN0cnVjdCBpb19hY2NlbDFfY21kICopCisJCQkmaC0+aW9hY2NlbF9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJCSp0YWd1cHBlciA9IGNtMS0+VGFnLnVwcGVyOworCQkqdGFnbG93ZXIgPSBjbTEtPlRhZy5sb3dlcjsKKwkJcmV0dXJuOworCX0KKwlpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyKSB7CisJCXN0cnVjdCBpb19hY2NlbDJfY21kICpjbTIgPSAoc3RydWN0IGlvX2FjY2VsMl9jbWQgKikKKwkJCSZoLT5pb2FjY2VsMl9jbWRfcG9vbFtjLT5jbWRpbmRleF07CisJCS8qIHVwcGVyIHRhZyBub3QgdXNlZCBpbiBpb2FjY2VsMiBtb2RlICovCisJCW1lbXNldCh0YWd1cHBlciwgMCwgc2l6ZW9mKCp0YWd1cHBlcikpOworCQkqdGFnbG93ZXIgPSBjbTItPlRhZzsKKwkJcmV0dXJuOworCX0KKwkqdGFndXBwZXIgPSBjLT5IZWFkZXIuVGFnLnVwcGVyOworCSp0YWdsb3dlciA9IGMtPkhlYWRlci5UYWcubG93ZXI7Cit9CisKKwogc3RhdGljIGludCBocHNhX3NlbmRfYWJvcnQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAogCXN0cnVjdCBDb21tYW5kTGlzdCAqYWJvcnQsIGludCBzd2l6emxlKQogewogCWludCByYyA9IElPX09LOwogCXN0cnVjdCBDb21tYW5kTGlzdCAqYzsKIAlzdHJ1Y3QgRXJyb3JJbmZvICplaTsKKwl1MzIgdGFndXBwZXIsIHRhZ2xvd2VyOwogCiAJYyA9IGNtZF9zcGVjaWFsX2FsbG9jKGgpOwogCWlmIChjID09IE5VTEwpIHsJLyogdHJvdWJsZS4uLiAqLwpAQCAtMjQ5MCw4ICs0MzU3LDkgQEAKIAlpZiAoc3dpenpsZSkKIAkJc3dpenpsZV9hYm9ydF90YWcoJmMtPlJlcXVlc3QuQ0RCWzRdKTsKIAlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlKGgsIGMpOworCWhwc2FfZ2V0X3RhZyhoLCBhYm9ydCwgJnRhZ2xvd2VyLCAmdGFndXBwZXIpOwogCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIiVzOiBUYWc6MHglMDh4OiUwOHg6IGRvX3NpbXBsZV9jbWRfY29yZSBjb21wbGV0ZWQuXG4iLAotCQlfX2Z1bmNfXywgYWJvcnQtPkhlYWRlci5UYWcudXBwZXIsIGFib3J0LT5IZWFkZXIuVGFnLmxvd2VyKTsKKwkJX19mdW5jX18sIHRhZ3VwcGVyLCB0YWdsb3dlcik7CiAJLyogbm8gdW5tYXAgbmVlZGVkIGhlcmUgYmVjYXVzZSBubyBkYXRhIHhmZXIuICovCiAKIAllaSA9IGMtPmVycl9pbmZvOwpAQCAtMjUwMywxNSArNDM3MSwxNCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICIlczogVGFnOjB4JTA4eDolMDh4OiBpbnRlcnByZXRpbmcgZXJyb3IuXG4iLAotCQkJX19mdW5jX18sIGFib3J0LT5IZWFkZXIuVGFnLnVwcGVyLAotCQkJYWJvcnQtPkhlYWRlci5UYWcubG93ZXIpOwotCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGMpOworCQkJX19mdW5jX18sIHRhZ3VwcGVyLCB0YWdsb3dlcik7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CiAJCXJjID0gLTE7CiAJCWJyZWFrOwogCX0KIAljbWRfc3BlY2lhbF9mcmVlKGgsIGMpOwotCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIiVzOiBUYWc6MHglMDh4OiUwOHg6IEZpbmlzaGVkLlxuIiwgX19mdW5jX18sCi0JCWFib3J0LT5IZWFkZXIuVGFnLnVwcGVyLCBhYm9ydC0+SGVhZGVyLlRhZy5sb3dlcik7CisJZGV2X2RiZygmaC0+cGRldi0+ZGV2LCAiJXM6IFRhZzoweCUwOHg6JTA4eDogRmluaXNoZWQuXG4iLAorCQlfX2Z1bmNfXywgdGFndXBwZXIsIHRhZ2xvd2VyKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTI1NjUsNiArNDQzMiw4MyBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBpb2FjY2VsMiBwYXRoIGZpcm13YXJlIGNhbm5vdCBoYW5kbGUgYWJvcnQgdGFzayByZXF1ZXN0cy4KKyAqIENoYW5nZSBhYm9ydCByZXF1ZXN0cyB0byBwaHlzaWNhbCB0YXJnZXQgcmVzZXQsIGFuZCBzZW5kIHRvIHRoZQorICogYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwgZGlzayB1c2VkIGZvciB0aGUgaW9hY2NlbCAyIGNvbW1hbmQuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIChJT19PSykKKyAqCSAtMSBvbiBmYWlsdXJlCisgKi8KKworc3RhdGljIGludCBocHNhX3NlbmRfcmVzZXRfYXNfYWJvcnRfaW9hY2NlbDIoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwl1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsIHN0cnVjdCBDb21tYW5kTGlzdCAqYWJvcnQpCit7CisJaW50IHJjID0gSU9fT0s7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsgLyogc2NzaSBjb21tYW5kIHdpdGhpbiByZXF1ZXN0IGJlaW5nIGFib3J0ZWQgKi8KKwlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpkZXY7IC8qIGRldmljZSB0byB3aGljaCBzY3NpIGNtZCB3YXMgc2VudCAqLworCXVuc2lnbmVkIGNoYXIgcGh5c19zY3NpM2FkZHJbOF07IC8qIGFkZHIgb2YgcGh5cyBkaXNrIHdpdGggdm9sdW1lICovCisJdW5zaWduZWQgY2hhciAqcHNhID0gJnBoeXNfc2NzaTNhZGRyWzBdOworCisJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgaHBzYSBsb2dpY2FsIGRldmljZS4gKi8KKwlzY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgYWJvcnQtPnNjc2lfY21kOworCWRldiA9IChzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICopKHNjbWQtPmRldmljZS0+aG9zdGRhdGEpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCBhYm9ydDogbm8gZGV2aWNlIHBvaW50ZXIgZm9yIGNvbW1hbmQuXG4iKTsKKwkJCXJldHVybiAtMTsgLyogbm90IGFib3J0YWJsZSAqLworCX0KKworCWlmIChoLT5yYWlkX29mZmxvYWRfZGVidWcgPiAwKQorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIlJlc2V0IGFzIGFib3J0OiBBYm9ydCByZXF1ZXN0ZWQgb24gQyVkOkIlZDpUJWQ6TCVkIHNjc2kzYWRkciAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLCBkZXYtPmJ1cywgZGV2LT50YXJnZXQsIGRldi0+bHVuLAorCQkJc2NzaTNhZGRyWzBdLCBzY3NpM2FkZHJbMV0sIHNjc2kzYWRkclsyXSwgc2NzaTNhZGRyWzNdLAorCQkJc2NzaTNhZGRyWzRdLCBzY3NpM2FkZHJbNV0sIHNjc2kzYWRkcls2XSwgc2NzaTNhZGRyWzddKTsKKworCWlmICghZGV2LT5vZmZsb2FkX2VuYWJsZWQpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJDYW4ndCBhYm9ydDogZGV2aWNlIGlzIG5vdCBvcGVyYXRpbmcgaW4gSFAgU1NEIFNtYXJ0IFBhdGggbW9kZS5cbiIpOworCQlyZXR1cm4gLTE7IC8qIG5vdCBhYm9ydGFibGUgKi8KKwl9CisKKwkvKiBJbmNvbWluZyBzY3NpM2FkZHIgaXMgbG9naWNhbCBhZGRyLiBXZSBuZWVkIHBoeXNpY2FsIGRpc2sgYWRkci4gKi8KKwlpZiAoIWhwc2FfZ2V0X3BkaXNrX29mX2lvYWNjZWwyKGgsIGFib3J0LCBwc2EpKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJDYW4ndCBhYm9ydDogRmFpbGVkIGxvb2t1cCBvZiBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAtMTsgLyogbm90IGFib3J0YWJsZSAqLworCX0KKworCS8qIHNlbmQgdGhlIHJlc2V0ICovCisJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA+IDApCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiUmVzZXQgYXMgYWJvcnQ6IFJlc2V0dGluZyBwaHlzaWNhbCBkZXZpY2UgYXQgc2NzaTNhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlwc2FbMF0sIHBzYVsxXSwgcHNhWzJdLCBwc2FbM10sCisJCQlwc2FbNF0sIHBzYVs1XSwgcHNhWzZdLCBwc2FbN10pOworCXJjID0gaHBzYV9zZW5kX3Jlc2V0KGgsIHBzYSwgSFBTQV9SRVNFVF9UWVBFX1RBUkdFVCk7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJSZXNldCBhcyBhYm9ydDogRmFpbGVkIG9uIHBoeXNpY2FsIGRldmljZSBhdCBzY3NpM2FkZHIgMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCXBzYVswXSwgcHNhWzFdLCBwc2FbMl0sIHBzYVszXSwKKwkJCXBzYVs0XSwgcHNhWzVdLCBwc2FbNl0sIHBzYVs3XSk7CisJCXJldHVybiByYzsgLyogZmFpbGVkIHRvIHJlc2V0ICovCisJfQorCisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIHJlY292ZXIgKi8KKwlpZiAod2FpdF9mb3JfZGV2aWNlX3RvX2JlY29tZV9yZWFkeShoLCBwc2EpICE9IDApIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJSZXNldCBhcyBhYm9ydDogRmFpbGVkOiBEZXZpY2UgbmV2ZXIgcmVjb3ZlcmVkIGZyb20gcmVzZXQ6IDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlwc2FbMF0sIHBzYVsxXSwgcHNhWzJdLCBwc2FbM10sCisJCQlwc2FbNF0sIHBzYVs1XSwgcHNhWzZdLCBwc2FbN10pOworCQlyZXR1cm4gLTE7ICAvKiBmYWlsZWQgdG8gcmVjb3ZlciAqLworCX0KKworCS8qIGRldmljZSByZWNvdmVyZWQgKi8KKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkiUmVzZXQgYXMgYWJvcnQ6IERldmljZSByZWNvdmVyZWQgZnJvbSByZXNldDogc2NzaTNhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCXBzYVswXSwgcHNhWzFdLCBwc2FbMl0sIHBzYVszXSwKKwkJcHNhWzRdLCBwc2FbNV0sIHBzYVs2XSwgcHNhWzddKTsKKworCXJldHVybiByYzsgLyogc3VjY2VzcyAqLworfQorCiAvKiBTb21lIFNtYXJ0IEFycmF5cyBuZWVkIHRoZSBhYm9ydCB0YWcgc3dpenpsZWQsIGFuZCBzb21lIGRvbid0LiAgSXQncyBoYXJkIHRvCiAgKiB0ZWxsIHdoaWNoIGtpbmQgd2UncmUgZGVhbGluZyB3aXRoLCBzbyB3ZSBzZW5kIHRoZSBhYm9ydCBib3RoIHdheXMuICBUaGVyZQogICogc2hvdWxkbid0IGJlIGFueSBjb2xsaXNpb25zIGJldHdlZW4gc3dpenpsZWQgYW5kIHVuc3dpenpsZWQgdGFncyBkdWUgdG8gdGhlCkBAIC0yNTc4LDYgKzQ1MjIsMTQgQEAKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CiAJaW50IHJjID0gMCwgcmMyID0gMDsKIAorCS8qIGlvY2NlbGVyYXRvciBtb2RlIDIgY29tbWFuZHMgc2hvdWxkIGJlIGFib3J0ZWQgdmlhIHRoZQorCSAqIGFjY2VsZXJhdGVkIHBhdGgsIHNpbmNlIFJBSUQgcGF0aCBpcyB1bmF3YXJlIG9mIHRoZXNlIGNvbW1hbmRzLAorCSAqIGJ1dCB1bmRlcmx5aW5nIGZpcm13YXJlIGNhbid0IGhhbmRsZSBhYm9ydCBUTUYuCisJICogQ2hhbmdlIGFib3J0IHRvIHBoeXNpY2FsIGRldmljZSByZXNldC4KKwkgKi8KKwlpZiAoYWJvcnQtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMikKKwkJcmV0dXJuIGhwc2Ffc2VuZF9yZXNldF9hc19hYm9ydF9pb2FjY2VsMihoLCBzY3NpM2FkZHIsIGFib3J0KTsKKwogCS8qIHdlIGRvIG5vdCBleHBlY3QgdG8gZmluZCB0aGUgc3dpenpsZWQgdGFnIGluIG91ciBxdWV1ZSwgYnV0CiAJICogY2hlY2sgYW55d2F5IGp1c3QgdG8gYmUgc3VyZSB0aGUgYXNzdW1wdGlvbnMgd2hpY2ggbWFrZSB0aGlzCiAJICogdGhlIGNhc2UgaGF2ZW4ndCBiZWNvbWUgd3JvbmcuCkBAIC0yNjE2LDYgKzQ1NjgsNyBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmFzOwkvKiBwdHIgdG8gc2NzaSBjbWQgaW5zaWRlIGFib3J0ZWQgY29tbWFuZC4gKi8KIAljaGFyIG1zZ1syNTZdOwkJLyogRm9yIGRlYnVnIG1lc3NhZ2luZy4gKi8KIAlpbnQgbWwgPSAwOworCXUzMiB0YWd1cHBlciwgdGFnbG93ZXI7CiAKIAkvKiBGaW5kIHRoZSBjb250cm9sbGVyIG9mIHRoZSBjb21tYW5kIHRvIGJlIGFib3J0ZWQgKi8KIAloID0gc2Rldl90b19oYmEoc2MtPmRldmljZSk7CkBAIC0yNjQ4LDkgKzQ2MDEsOCBAQAogCQkJCW1zZyk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQotCi0JbWwgKz0gc3ByaW50Zihtc2crbWwsICJUYWc6MHglMDh4OiUwOHggIiwKLQkJYWJvcnQtPkhlYWRlci5UYWcudXBwZXIsIGFib3J0LT5IZWFkZXIuVGFnLmxvd2VyKTsKKwlocHNhX2dldF90YWcoaCwgYWJvcnQsICZ0YWdsb3dlciwgJnRhZ3VwcGVyKTsKKwltbCArPSBzcHJpbnRmKG1zZyttbCwgIlRhZzoweCUwOHg6JTA4eCAiLCB0YWd1cHBlciwgdGFnbG93ZXIpOwogCWFzICA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGFib3J0LT5zY3NpX2NtZDsKIAlpZiAoYXMgIT0gTlVMTCkKIAkJbWwgKz0gc3ByaW50Zihtc2crbWwsICJDb21tYW5kOjB4JXggU046MHglbHggIiwKQEAgLTI3NzYsNiArNDcyOCw3IEBACiAJCXJldHVybiBOVUxMOwogCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKIAorCWMtPmNtZF90eXBlID0gQ01EX1NDU0k7CiAJYy0+Y21kaW5kZXggPSAtMTsKIAogCWMtPmVycl9pbmZvID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaC0+cGRldiwgc2l6ZW9mKCpjLT5lcnJfaW5mbyksCkBAIC0zMDM4LDcgKzQ5OTEsNyBAQAogCQljLT5TR1swXS5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwogCQljLT5TR1swXS5BZGRyLnVwcGVyID0gdGVtcDY0LnZhbDMyLnVwcGVyOwogCQljLT5TR1swXS5MZW4gPSBpb2NvbW1hbmQuYnVmX3NpemU7Ci0JCWMtPlNHWzBdLkV4dCA9IDA7IC8qIHdlIGFyZSBub3QgY2hhaW5pbmcqLworCQljLT5TR1swXS5FeHQgPSBIUFNBX1NHX0xBU1Q7IC8qIHdlIGFyZSBub3QgY2hhaW5pbmcqLwogCX0KIAlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlX2lmX25vX2xvY2t1cChoLCBjKTsKIAlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkKQEAgLTMxNjgsOCArNTEyMSw3IEBACiAJCQljLT5TR1tpXS5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwogCQkJYy0+U0dbaV0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKIAkJCWMtPlNHW2ldLkxlbiA9IGJ1ZmZfc2l6ZVtpXTsKLQkJCS8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KLQkJCWMtPlNHW2ldLkV4dCA9IDA7CisJCQljLT5TR1tpXS5FeHQgPSBpIDwgc2dfdXNlZCAtIDEgPyAwIDogSFBTQV9TR19MQVNUOwogCQl9CiAJfQogCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmVfaWZfbm9fbG9ja3VwKGgsIGMpOwpAQCAtMzMwNCw3ICs1MjU2LDcgQEAKIH0KIAogc3RhdGljIGludCBmaWxsX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHU4IGNtZCwgc3RydWN0IGN0bHJfaW5mbyAqaCwKLQl2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwgdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHUxNiBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKIAlpbnQgY21kX3R5cGUpCiB7CiAJaW50IHBjaV9kaXIgPSBYRkVSX05PTkU7CkBAIC0zMzI3LDkgKzUyNzksOSBAQAogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIEhQU0FfSU5RVUlSWToKIAkJCS8qIGFyZSB3ZSB0cnlpbmcgdG8gcmVhZCBhIHZpdGFsIHByb2R1Y3QgcGFnZSAqLwotCQkJaWYgKHBhZ2VfY29kZSAhPSAwKSB7CisJCQlpZiAocGFnZV9jb2RlICYgVlBEX1BBR0UpIHsKIAkJCQljLT5SZXF1ZXN0LkNEQlsxXSA9IDB4MDE7Ci0JCQkJYy0+UmVxdWVzdC5DREJbMl0gPSBwYWdlX2NvZGU7CisJCQkJYy0+UmVxdWVzdC5DREJbMl0gPSAocGFnZV9jb2RlICYgMHhmZik7CiAJCQl9CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDY7CiAJCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7CkBAIC0zMzY5LDYgKzUzMjEsMjggQEAKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX05PTkU7CiAJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOwogCQkJYnJlYWs7CisJCWNhc2UgSFBTQV9HRVRfUkFJRF9NQVA6CisJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEyOworCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKKwkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CisJCQljLT5SZXF1ZXN0LkNEQlswXSA9IEhQU0FfQ0lTU19SRUFEOworCQkJYy0+UmVxdWVzdC5DREJbMV0gPSBjbWQ7CisJCQljLT5SZXF1ZXN0LkNEQls2XSA9IChzaXplID4+IDI0KSAmIDB4RkY7IC8qIE1TQiAqLworCQkJYy0+UmVxdWVzdC5DREJbN10gPSAoc2l6ZSA+PiAxNikgJiAweEZGOworCQkJYy0+UmVxdWVzdC5DREJbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7CisJCQljLT5SZXF1ZXN0LkNEQls5XSA9IHNpemUgJiAweEZGOworCQkJYnJlYWs7CisJCWNhc2UgQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlM6CisJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEwOworCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKKwkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CisJCQljLT5SZXF1ZXN0LkNEQlswXSA9IEJNSUNfUkVBRDsKKwkJCWMtPlJlcXVlc3QuQ0RCWzZdID0gQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlM7CisJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChzaXplID4+IDE2KSAmIDB4RkY7CisJCQljLT5SZXF1ZXN0LkNEQls4XSA9IChzaXplID4+IDgpICYgMHhGRjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgInVua25vd24gY29tbWFuZCAweCVjXG4iLCBjbWQpOwogCQkJQlVHKCk7CkBAIC0zNTYyLDcgKzU1MzYsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKIAogCWRpYWxfdXBfbG9ja3VwX2RldGVjdGlvbl9vbl9md19mbGFzaF9jb21wbGV0ZShjLT5oLCBjKTsKLQlpZiAobGlrZWx5KGMtPmNtZF90eXBlID09IENNRF9TQ1NJKSkKKwlpZiAobGlrZWx5KGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSB8fCBjLT5jbWRfdHlwZSA9PSBDTURfU0NTSQorCQkJfHwgYy0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyKSkKIAkJY29tcGxldGVfc2NzaV9jb21tYW5kKGMpOwogCWVsc2UgaWYgKGMtPmNtZF90eXBlID09IENNRF9JT0NUTF9QRU5EKQogCQljb21wbGV0ZShjLT53YWl0aW5nKTsKQEAgLTQxNjksMjEgKzYxNDQsMjQgQEAKIAkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KGgtPnBkZXYsIFBDSV9DQVBfSURfTVNJWCkpIHsKIAkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgIk1TSVhcbiIpOworCQloLT5tc2l4X3ZlY3RvciA9IE1BWF9SRVBMWV9RVUVVRVM7CiAJCWVyciA9IHBjaV9lbmFibGVfbXNpeChoLT5wZGV2LCBocHNhX21zaXhfZW50cmllcywKLQkJCQkJCU1BWF9SRVBMWV9RVUVVRVMpOwotCQlpZiAoIWVycikgewotCQkJZm9yIChpID0gMDsgaSA8IE1BWF9SRVBMWV9RVUVVRVM7IGkrKykKLQkJCQloLT5pbnRyW2ldID0gaHBzYV9tc2l4X2VudHJpZXNbaV0udmVjdG9yOwotCQkJaC0+bXNpeF92ZWN0b3IgPSAxOwotCQkJcmV0dXJuOwotCQl9CisJCQkJICAgICAgaC0+bXNpeF92ZWN0b3IpOwogCQlpZiAoZXJyID4gMCkgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm9ubHkgJWQgTVNJLVggdmVjdG9ycyAiCiAJCQkgICAgICAgImF2YWlsYWJsZVxuIiwgZXJyKTsKLQkJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKKwkJCWgtPm1zaXhfdmVjdG9yID0gZXJyOworCQkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KGgtPnBkZXYsIGhwc2FfbXNpeF9lbnRyaWVzLAorCQkJCQkgICAgICBoLT5tc2l4X3ZlY3Rvcik7CisJCX0KKwkJaWYgKCFlcnIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBoLT5tc2l4X3ZlY3RvcjsgaSsrKQorCQkJCWgtPmludHJbaV0gPSBocHNhX21zaXhfZW50cmllc1tpXS52ZWN0b3I7CisJCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsCiAJCQkgICAgICAgZXJyKTsKKwkJCWgtPm1zaXhfdmVjdG9yID0gMDsKIAkJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKIAkJfQogCX0KQEAgLTQzMzYsNiArNjMxNCw3IEBACiAJaHBzYV9nZXRfbWF4X3BlcmZfbW9kZV9jbWRzKGgpOwogCWgtPm5yX2NtZHMgPSBoLT5tYXhfY29tbWFuZHMgLSA0OyAvKiBBbGxvdyByb29tIGZvciBzb21lIGlvY3RscyAqLwogCWgtPm1heHNnZW50cmllcyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPk1heFNjYXR0ZXJHYXRoZXJFbGVtZW50cykpOworCWgtPmZ3X3N1cHBvcnQgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5taXNjX2Z3X3N1cHBvcnQpKTsKIAkvKgogCSAqIExpbWl0IGluLWNvbW1hbmQgcy9nIGVsZW1lbnRzIHRvIDMyIHNhdmUgZG1hJ2FibGUgbWVtb3J5LgogCSAqIEhvd3ZldmVyIHNwZWMgc2F5cyBpZiAwLCB1c2UgMzEKQEAgLTQzNTIsNiArNjMzMSwxMCBAQAogCiAJLyogRmluZCBvdXQgd2hhdCB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYW5kIGNhY2hlICovCiAJaC0+VE1GU3VwcG9ydEZsYWdzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+VE1GU3VwcG9ydEZsYWdzKSk7CisJaWYgKCEoSFBTQVRNRl9QSFlTX1RBU0tfQUJPUlQgJiBoLT5UTUZTdXBwb3J0RmxhZ3MpKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiUGh5c2ljYWwgYWJvcnRzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWlmICghKEhQU0FUTUZfTE9HX1RBU0tfQUJPUlQgJiBoLT5UTUZTdXBwb3J0RmxhZ3MpKQorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTG9naWNhbCBhYm9ydHMgbm90IHN1cHBvcnRlZFxuIik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBocHNhX0NJU1Nfc2lnbmF0dXJlX3ByZXNlbnQoc3RydWN0IGN0bHJfaW5mbyAqaCkKQEAgLTQzOTAsNiArNjM3MywyMyBAQAogCXdyaXRlbChkbWFfcHJlZmV0Y2gsIGgtPnZhZGRyICsgSTJPX0RNQTFfQ0ZHKTsKIH0KIAorc3RhdGljIHZvaWQgaHBzYV93YWl0X2Zvcl9jbGVhcl9ldmVudF9ub3RpZnlfYWNrKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaW50IGk7CisJdTMyIGRvb3JiZWxsX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogd2FpdCB1bnRpbCB0aGUgY2xlYXJfZXZlbnRfbm90aWZ5IGJpdCA2IGlzIGNsZWFyZWQgYnkgY29udHJvbGxlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTkZJR19XQUlUOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJZG9vcmJlbGxfdmFsdWUgPSByZWFkbChoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCEoZG9vcmJlbGxfdmFsdWUgJiBET09SQkVMTF9DTEVBUl9FVkVOVFMpKQorCQkJYnJlYWs7CisJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KKwkJbXNsZWVwKDIwKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGhwc2Ffd2FpdF9mb3JfbW9kZV9jaGFuZ2VfYWNrKHN0cnVjdCBjdGxyX2luZm8gKmgpCiB7CiAJaW50IGk7CkBAIC00NDIwLDE4ICs2NDIwLDIwIEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAKIAloLT5tYXhfY29tbWFuZHMgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5DbWRzT3V0TWF4KSk7CisKIAkvKiBVcGRhdGUgdGhlIGZpZWxkLCBhbmQgdGhlbiByaW5nIHRoZSBkb29yYmVsbCAqLwogCXdyaXRlbChDRkdUQkxfVHJhbnNfU2ltcGxlLCAmKGgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuVHJhbnNwb3J0UmVxdWVzdCkpOworCXdyaXRlbCgwLCAmaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5jb21tYW5kX3Bvb2xfYWRkcl9oaSk7CiAJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKIAlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKIAlwcmludF9jZmdfdGFibGUoJmgtPnBkZXYtPmRldiwgaC0+Y2ZndGFibGUpOwotCWlmICghKHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSkpICYgQ0ZHVEJMX1RyYW5zX1NpbXBsZSkpIHsKLQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKLQkJCSJ1bmFibGUgdG8gZ2V0IGJvYXJkIGludG8gc2ltcGxlIG1vZGVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJaWYgKCEocmVhZGwoJihoLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkKKwkJZ290byBlcnJvcjsKIAloLT50cmFuc01ldGhvZCA9IENGR1RCTF9UcmFuc19TaW1wbGU7CiAJcmV0dXJuIDA7CitlcnJvcjoKKwlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIHNpbXBsZSBtb2RlXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIGludCBocHNhX3BjaV9pbml0KHN0cnVjdCBjdGxyX2luZm8gKmgpCkBAIC00NTc3LDExICs2NTc5LDE5IEBACiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKIAkJCSAgICBoLT5ucl9jbWRzICogc2l6ZW9mKHN0cnVjdCBDb21tYW5kTGlzdCksCiAJCQkgICAgaC0+Y21kX3Bvb2wsIGgtPmNtZF9wb29sX2RoYW5kbGUpOworCWlmIChoLT5pb2FjY2VsMl9jbWRfcG9vbCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LAorCQkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbDJfY21kX3Bvb2wpLAorCQkJaC0+aW9hY2NlbDJfY21kX3Bvb2wsIGgtPmlvYWNjZWwyX2NtZF9wb29sX2RoYW5kbGUpOwogCWlmIChoLT5lcnJpbmZvX3Bvb2wpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKIAkJCSAgICBoLT5ucl9jbWRzICogc2l6ZW9mKHN0cnVjdCBFcnJvckluZm8pLAogCQkJICAgIGgtPmVycmluZm9fcG9vbCwKIAkJCSAgICBoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7CisJaWYgKGgtPmlvYWNjZWxfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2Yoc3RydWN0IGlvX2FjY2VsMV9jbWQpLAorCQkJaC0+aW9hY2NlbF9jbWRfcG9vbCwgaC0+aW9hY2NlbF9jbWRfcG9vbF9kaGFuZGxlKTsKIH0KIAogc3RhdGljIGludCBocHNhX3JlcXVlc3RfaXJxKHN0cnVjdCBjdGxyX2luZm8gKmgsCkBAIC00NTk3LDE1ICs2NjA3LDE1IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9SRVBMWV9RVUVVRVM7IGkrKykKIAkJaC0+cVtpXSA9ICh1OCkgaTsKIAotCWlmIChoLT5pbnRyX21vZGUgPT0gUEVSRl9NT0RFX0lOVCAmJiBoLT5tc2l4X3ZlY3RvcikgeworCWlmIChoLT5pbnRyX21vZGUgPT0gUEVSRl9NT0RFX0lOVCAmJiBoLT5tc2l4X3ZlY3RvciA+IDApIHsKIAkJLyogSWYgcGVyZm9ybWFudCBtb2RlIGFuZCBNU0ktWCwgdXNlIG11bHRpcGxlIHJlcGx5IHF1ZXVlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFUExZX1FVRVVFUzsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaC0+bXNpeF92ZWN0b3I7IGkrKykKIAkJCXJjID0gcmVxdWVzdF9pcnEoaC0+aW50cltpXSwgbXNpeGhhbmRsZXIsCiAJCQkJCTAsIGgtPmRldm5hbWUsCiAJCQkJCSZoLT5xW2ldKTsKIAl9IGVsc2UgewogCQkvKiBVc2Ugc2luZ2xlIHJlcGx5IHBvb2wgKi8KLQkJaWYgKGgtPm1zaXhfdmVjdG9yIHx8IGgtPm1zaV92ZWN0b3IpIHsKKwkJaWYgKGgtPm1zaXhfdmVjdG9yID4gMCB8fCBoLT5tc2lfdmVjdG9yKSB7CiAJCQlyYyA9IHJlcXVlc3RfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwKIAkJCQltc2l4aGFuZGxlciwgMCwgaC0+ZGV2bmFtZSwKIAkJCQkmaC0+cVtoLT5pbnRyX21vZGVdKTsKQEAgLTQ2NTgsNyArNjY2OCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFUExZX1FVRVVFUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBoLT5tc2l4X3ZlY3RvcjsgaSsrKQogCQlmcmVlX2lycShoLT5pbnRyW2ldLCAmaC0+cVtpXSk7CiB9CiAKQEAgLTQ2ODEsNiArNjY5MSw3IEBACiAJaHBzYV9mcmVlX2lycXNfYW5kX2Rpc2FibGVfbXNpeChoKTsKIAlocHNhX2ZyZWVfc2dfY2hhaW5fYmxvY2tzKGgpOwogCWhwc2FfZnJlZV9jbWRfcG9vbChoKTsKKwlrZnJlZShoLT5pb2FjY2VsMV9ibG9ja0ZldGNoVGFibGUpOwogCWtmcmVlKGgtPmJsb2NrRmV0Y2hUYWJsZSk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LCBoLT5yZXBseV9wb29sX3NpemUsCiAJCWgtPnJlcGx5X3Bvb2wsIGgtPnJlcGx5X3Bvb2xfZGhhbmRsZSk7CkBAIC00NzYwLDYgKzY3NzEsOTIgQEAKIAloLT5sYXN0X2hlYXJ0YmVhdF90aW1lc3RhbXAgPSBub3c7CiB9CiAKK3N0YXRpYyB2b2lkIGhwc2FfYWNrX2N0bHJfZXZlbnRzKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaW50IGk7CisJY2hhciAqZXZlbnRfdHlwZTsKKworCS8qIENsZWFyIHRoZSBkcml2ZXItcmVxdWVzdGVkIHJlc2NhbiBmbGFnICovCisJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAwOworCisJLyogQXNrIHRoZSBjb250cm9sbGVyIHRvIGNsZWFyIHRoZSBldmVudHMgd2UncmUgaGFuZGxpbmcuICovCisJaWYgKChoLT50cmFuc01ldGhvZCAmIChDRkdUQkxfVHJhbnNfaW9fYWNjZWwxCisJCQl8IENGR1RCTF9UcmFuc19pb19hY2NlbDIpKSAmJgorCQkoaC0+ZXZlbnRzICYgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9TVEFURV9DSEFOR0UgfHwKKwkJIGgtPmV2ZW50cyAmIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfQ09ORklHX0NIQU5HRSkpIHsKKworCQlpZiAoaC0+ZXZlbnRzICYgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9TVEFURV9DSEFOR0UpCisJCQlldmVudF90eXBlID0gInN0YXRlIGNoYW5nZSI7CisJCWlmIChoLT5ldmVudHMgJiBIUFNBX0VWRU5UX05PVElGWV9BQ0NFTF9JT19QQVRIX0NPTkZJR19DSEFOR0UpCisJCQlldmVudF90eXBlID0gImNvbmZpZ3VyYXRpb24gY2hhbmdlIjsKKwkJLyogU3RvcCBzZW5kaW5nIG5ldyBSQUlEIG9mZmxvYWQgcmVxcyB2aWEgdGhlIElPIGFjY2VsZXJhdG9yICovCisJCXNjc2lfYmxvY2tfcmVxdWVzdHMoaC0+c2NzaV9ob3N0KTsKKwkJZm9yIChpID0gMDsgaSA8IGgtPm5kZXZpY2VzOyBpKyspCisJCQloLT5kZXZbaV0tPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisJCWhwc2FfZHJhaW5fYWNjZWxfY29tbWFuZHMoaCk7CisJCS8qIFNldCAnYWNjZWxlcmF0b3IgcGF0aCBjb25maWcgY2hhbmdlJyBiaXQgKi8KKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJBY2tub3dsZWRnaW5nIGV2ZW50OiAweCUwOHggKEhQIFNTRCBTbWFydCBQYXRoICVzKVxuIiwKKwkJCWgtPmV2ZW50cywgZXZlbnRfdHlwZSk7CisJCXdyaXRlbChoLT5ldmVudHMsICYoaC0+Y2ZndGFibGUtPmNsZWFyX2V2ZW50X25vdGlmeSkpOworCQkvKiBTZXQgdGhlICJjbGVhciBldmVudCBub3RpZnkgZmllbGQgdXBkYXRlIiBiaXQgNiAqLworCQl3cml0ZWwoRE9PUkJFTExfQ0xFQVJfRVZFTlRTLCBoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJCS8qIFdhaXQgdW50aWwgY3RsciBjbGVhcnMgJ2NsZWFyIGV2ZW50IG5vdGlmeSBmaWVsZCcsIGJpdCA2ICovCisJCWhwc2Ffd2FpdF9mb3JfY2xlYXJfZXZlbnRfbm90aWZ5X2FjayhoKTsKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGgtPnNjc2lfaG9zdCk7CisJfSBlbHNlIHsKKwkJLyogQWNrbm93bGVkZ2UgY29udHJvbGxlciBub3RpZmljYXRpb24gZXZlbnRzLiAqLworCQl3cml0ZWwoaC0+ZXZlbnRzLCAmKGgtPmNmZ3RhYmxlLT5jbGVhcl9ldmVudF9ub3RpZnkpKTsKKwkJd3JpdGVsKERPT1JCRUxMX0NMRUFSX0VWRU5UUywgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQlocHNhX3dhaXRfZm9yX2NsZWFyX2V2ZW50X25vdGlmeV9hY2soaCk7CisjaWYgMAorCQl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKKyNlbmRpZgorCX0KKwlyZXR1cm47Cit9CisKKy8qIENoZWNrIGEgcmVnaXN0ZXIgb24gdGhlIGNvbnRyb2xsZXIgdG8gc2VlIGlmIHRoZXJlIGFyZSBjb25maWd1cmF0aW9uCisgKiBjaGFuZ2VzIChhZGRlZC9jaGFuZ2VkL3JlbW92ZWQgbG9naWNhbCBkcml2ZXMsIGV0Yy4pIHdoaWNoIG1lYW4gdGhhdAorICogd2Ugc2hvdWxkIHJlc2NhbiB0aGUgY29udHJvbGxlciBmb3IgZGV2aWNlcy4KKyAqIEFsc28gY2hlY2sgZmxhZyBmb3IgZHJpdmVyLWluaXRpYXRlZCByZXNjYW4uCisgKi8KK3N0YXRpYyBpbnQgaHBzYV9jdGxyX25lZWRzX3Jlc2NhbihzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWlmIChoLT5kcnZfcmVxX3Jlc2NhbikKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShoLT5md19zdXBwb3J0ICYgTUlTQ19GV19FVkVOVF9OT1RJRlkpKQorCQlyZXR1cm4gMDsKKworCWgtPmV2ZW50cyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPmV2ZW50X25vdGlmeSkpOworCXJldHVybiBoLT5ldmVudHMgJiBSRVNDQU5fUkVRVUlSRURfRVZFTlRfQklUUzsKK30KKworLyoKKyAqIENoZWNrIGlmIGFueSBvZiB0aGUgb2ZmbGluZSBkZXZpY2VzIGhhdmUgYmVjb21lIHJlYWR5CisgKi8KK3N0YXRpYyBpbnQgaHBzYV9vZmZsaW5lX2RldmljZXNfcmVhZHkoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBvZmZsaW5lX2RldmljZV9lbnRyeSAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgdG1wLCAmaC0+b2ZmbGluZV9kZXZpY2VfbGlzdCkgeworCQlkID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3Qgb2ZmbGluZV9kZXZpY2VfZW50cnksCisJCQkJb2ZmbGluZV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCQlpZiAoIWhwc2Ffdm9sdW1lX29mZmxpbmUoaCwgZC0+c2NzaTNhZGRyKSkKKwkJCXJldHVybiAxOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHZvaWQgaHBzYV9tb25pdG9yX2N0bHJfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDc2OCw2ICs2ODY1LDE1IEBACiAJZGV0ZWN0X2NvbnRyb2xsZXJfbG9ja3VwKGgpOwogCWlmIChoLT5sb2NrdXBfZGV0ZWN0ZWQpCiAJCXJldHVybjsKKworCWlmIChocHNhX2N0bHJfbmVlZHNfcmVzY2FuKGgpIHx8IGhwc2Ffb2ZmbGluZV9kZXZpY2VzX3JlYWR5KGgpKSB7CisJCXNjc2lfaG9zdF9nZXQoaC0+c2NzaV9ob3N0KTsKKwkJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAwOworCQlocHNhX2Fja19jdGxyX2V2ZW50cyhoKTsKKwkJaHBzYV9zY2FuX3N0YXJ0KGgtPnNjc2lfaG9zdCk7CisJCXNjc2lfaG9zdF9wdXQoaC0+c2NzaV9ob3N0KTsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOwogCWlmIChoLT5yZW1vdmVfaW5fcHJvZ3Jlc3MpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOwpAQCAtNDgwNyw3ICs2OTEzLDcgQEAKIAkgKiB0aGUgNSBsb3dlciBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSB1c2VkIGJ5IHRoZSBoYXJkd2FyZS4gYW5kIGJ5CiAJICogdGhlIGRyaXZlci4gIFNlZSBjb21tZW50cyBpbiBocHNhLmggZm9yIG1vcmUgaW5mby4KIAkgKi8KLSNkZWZpbmUgQ09NTUFORExJU1RfQUxJR05NRU5UIDMyCisjZGVmaW5lIENPTU1BTkRMSVNUX0FMSUdOTUVOVCAxMjgKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBDb21tYW5kTGlzdCkgJSBDT01NQU5ETElTVF9BTElHTk1FTlQpOwogCWggPSBremFsbG9jKHNpemVvZigqaCksIEdGUF9LRVJORUwpOwogCWlmICghaCkKQEAgLTQ4MTcsNyArNjkyMyw5IEBACiAJaC0+aW50cl9tb2RlID0gaHBzYV9zaW1wbGVfbW9kZSA/IFNJTVBMRV9NT0RFX0lOVCA6IFBFUkZfTU9ERV9JTlQ7CiAJSU5JVF9MSVNUX0hFQUQoJmgtPmNtcFEpOwogCUlOSVRfTElTVF9IRUFEKCZoLT5yZXFRKTsKKwlJTklUX0xJU1RfSEVBRCgmaC0+b2ZmbGluZV9kZXZpY2VfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmgtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZoLT5vZmZsaW5lX2RldmljZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaC0+c2Nhbl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaC0+cGFzc3RocnVfY291bnRfbG9jayk7CiAJcmMgPSBocHNhX3BjaV9pbml0KGgpOwpAQCAtNDg1OSw2ICs2OTY3LDcgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoKTsKIAloLT5uZGV2aWNlcyA9IDA7CisJaC0+aGJhX21vZGVfZW5hYmxlZCA9IDA7CiAJaC0+c2NzaV9ob3N0ID0gTlVMTDsKIAlzcGluX2xvY2tfaW5pdCgmaC0+ZGV2bG9jayk7CiAJaHBzYV9wdXRfY3Rscl9pbnRvX3BlcmZvcm1hbnRfbW9kZShoKTsKQEAgLTQ5MTgsNiArNzAyNywxMSBAQAogCQlnb3RvIHJlaW5pdF9hZnRlcl9zb2Z0X3Jlc2V0OwogCX0KIAorCQkvKiBFbmFibGUgQWNjZWxlcmF0ZWQgSU8gcGF0aCBhdCBkcml2ZXIgbGF5ZXIgKi8KKwkJaC0+YWNjaW9wYXRoX3N0YXR1cyA9IDE7CisKKwloLT5kcnZfcmVxX3Jlc2NhbiA9IDA7CisKIAkvKiBUdXJuIHRoZSBpbnRlcnJ1cHRzIG9uIHNvIHdlIGNhbiBzZXJ2aWNlIHJlcXVlc3RzICovCiAJaC0+YWNjZXNzLnNldF9pbnRyX21hc2soaCwgSFBTQV9JTlRSX09OKTsKIApAQCAtNTAzNCw2ICs3MTQ4LDggQEAKIAkJaC0+cmVwbHlfcG9vbCwgaC0+cmVwbHlfcG9vbF9kaGFuZGxlKTsKIAlrZnJlZShoLT5jbWRfcG9vbF9iaXRzKTsKIAlrZnJlZShoLT5ibG9ja0ZldGNoVGFibGUpOworCWtmcmVlKGgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZSk7CisJa2ZyZWUoaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlKTsKIAlrZnJlZShoLT5oYmFfaW5xdWlyeV9kYXRhKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKQEAgLTUwNzQsMjAgKzcxOTAsMTcgQEAKICAqIGJpdHMgb2YgdGhlIGNvbW1hbmQgYWRkcmVzcy4KICAqLwogc3RhdGljIHZvaWQgIGNhbGNfYnVja2V0X21hcChpbnQgYnVja2V0W10sIGludCBudW1fYnVja2V0cywKLQlpbnQgbnNncywgaW50ICpidWNrZXRfbWFwKQorCWludCBuc2dzLCBpbnQgbWluX2Jsb2NrcywgaW50ICpidWNrZXRfbWFwKQogewogCWludCBpLCBqLCBiLCBzaXplOwogCi0JLyogZXZlbiBhIGNvbW1hbmQgd2l0aCAwIFNHcyByZXF1aXJlcyA0IGJsb2NrcyAqLwotI2RlZmluZSBNSU5JTVVNX1RSQU5TRkVSX0JMT0NLUyA0Ci0jZGVmaW5lIE5VTV9CVUNLRVRTIDgKIAkvKiBOb3RlLCBidWNrZXRfbWFwIG11c3QgaGF2ZSBuc2dzKzEgZW50cmllcy4gKi8KIAlmb3IgKGkgPSAwOyBpIDw9IG5zZ3M7IGkrKykgewogCQkvKiBDb21wdXRlIHNpemUgb2YgYSBjb21tYW5kIHdpdGggaSBTRyBlbnRyaWVzICovCi0JCXNpemUgPSBpICsgTUlOSU1VTV9UUkFOU0ZFUl9CTE9DS1M7CisJCXNpemUgPSBpICsgbWluX2Jsb2NrczsKIAkJYiA9IG51bV9idWNrZXRzOyAvKiBBc3N1bWUgdGhlIGJpZ2dlc3QgYnVja2V0ICovCiAJCS8qIEZpbmQgdGhlIGJ1Y2tldCB0aGF0IGlzIGp1c3QgYmlnIGVub3VnaCAqLwotCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBudW1fYnVja2V0czsgaisrKSB7CiAJCQlpZiAoYnVja2V0W2pdID49IHNpemUpIHsKIAkJCQliID0gajsKIAkJCQlicmVhazsKQEAgLTUwOTgsMTAgKzcyMTEsMTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGhwc2FfZW50ZXJfcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgsIHUzMiB1c2Vfc2hvcnRfdGFncykKK3N0YXRpYyB2b2lkIGhwc2FfZW50ZXJfcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgsIHUzMiB0cmFuc19zdXBwb3J0KQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfdmFsdWU7CisJdW5zaWduZWQgbG9uZyB0cmFuc01ldGhvZCA9IENGR1RCTF9UcmFuc19QZXJmb3JtYW50IHwKKwkJCSh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzKSB8CisJCQkJQ0ZHVEJMX1RyYW5zX2VuYWJsZV9kaXJlY3RlZF9tc2l4IHwKKwkJCSh0cmFuc19zdXBwb3J0ICYgKENGR1RCTF9UcmFuc19pb19hY2NlbDEgfAorCQkJCUNGR1RCTF9UcmFuc19pb19hY2NlbDIpKTsKKwlzdHJ1Y3QgYWNjZXNzX21ldGhvZCBhY2Nlc3MgPSBTQTVfcGVyZm9ybWFudF9hY2Nlc3M7CiAKIAkvKiBUaGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkLiAgVGhlcmUgYXJlIDggcmVnaXN0ZXJzIG9uCiAJICogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2Ugd3JpdGUgdG8gdG8gdGVsbCBpdCA4IGRpZmZlcmVudApAQCAtNTEyMSw2ICs3MjQwLDE2IEBACiAJICogc2l6ZXMgZm9yIHNtYWxsIGNvbW1hbmRzLCBhbmQgZmV3ZXIgc2l6ZXMgZm9yIGxhcmdlciBjb21tYW5kcy4KIAkgKi8KIAlpbnQgYmZ0WzhdID0gezUsIDYsIDgsIDEwLCAxMiwgMjAsIDI4LCBTR19FTlRSSUVTX0lOX0NNRCArIDR9OworI2RlZmluZSBNSU5fSU9BQ0NFTDJfQkZUX0VOVFJZIDUKKyNkZWZpbmUgSFBTQV9JT0FDQ0VMMl9IRUFERVJfU1ogNAorCWludCBiZnQyWzE2XSA9IHtNSU5fSU9BQ0NFTDJfQkZUX0VOVFJZLCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLAorCQkJMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksCisJCQlIUFNBX0lPQUNDRUwyX0hFQURFUl9TWiArIElPQUNDRUwyX01BWFNHRU5UUklFU307CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYmZ0MikgIT0gMTYpOworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGJmdCkgIT0gOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpb19hY2NlbDJfY21kLCBzZykgPgorCQkJCSAxNiAqIE1JTl9JT0FDQ0VMMl9CRlRfRU5UUlkpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlvYWNjZWwyX3NnX2VsZW1lbnQpICE9IDE2KTsKIAlCVUlMRF9CVUdfT04oMjggPiBTR19FTlRSSUVTX0lOX0NNRCArIDQpOwogCS8qICA1ID0gMSBzL2cgZW50cnkgb3IgNGsKIAkgKiAgNiA9IDIgcy9nIGVudHJ5IG9yIDhrCkBAIC01MTMzLDcgKzcyNjIsNyBAQAogCiAJYmZ0WzddID0gU0dfRU5UUklFU19JTl9DTUQgKyA0OwogCWNhbGNfYnVja2V0X21hcChiZnQsIEFSUkFZX1NJWkUoYmZ0KSwKLQkJCQlTR19FTlRSSUVTX0lOX0NNRCwgaC0+YmxvY2tGZXRjaFRhYmxlKTsKKwkJCQlTR19FTlRSSUVTX0lOX0NNRCwgNCwgaC0+YmxvY2tGZXRjaFRhYmxlKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQl3cml0ZWwoYmZ0W2ldLCAmaC0+dHJhbnN0YWJsZS0+QmxvY2tGZXRjaFtpXSk7CiAKQEAgLTUxNTAsOSArNzI3OSwyMiBAQAogCQkJJmgtPnRyYW5zdGFibGUtPlJlcFFBZGRyW2ldLmxvd2VyKTsKIAl9CiAKLQl3cml0ZWwoQ0ZHVEJMX1RyYW5zX1BlcmZvcm1hbnQgfCB1c2Vfc2hvcnRfdGFncyB8Ci0JCUNGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeCwKLQkJJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwl3cml0ZWwoMCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuY29tbWFuZF9wb29sX2FkZHJfaGkpOworCXdyaXRlbCh0cmFuc01ldGhvZCwgJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwkvKgorCSAqIGVuYWJsZSBvdXRib3VuZCBpbnRlcnJ1cHQgY29hbGVzY2luZyBpbiBhY2NlbGVyYXRvciBtb2RlOworCSAqLworCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgeworCQlhY2Nlc3MgPSBTQTVfaW9hY2NlbF9tb2RlMV9hY2Nlc3M7CisJCXdyaXRlbCgxMCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludERlbGF5KTsKKwkJd3JpdGVsKDQsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnRDb3VudCk7CisJfSBlbHNlIHsKKwkJaWYgKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSB7CisJCQlhY2Nlc3MgPSBTQTVfaW9hY2NlbF9tb2RlMl9hY2Nlc3M7CisJCQl3cml0ZWwoMTAsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnREZWxheSk7CisJCQl3cml0ZWwoNCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KTsKKwkJfQorCX0KIAl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOwogCWhwc2Ffd2FpdF9mb3JfbW9kZV9jaGFuZ2VfYWNrKGgpOwogCXJlZ2lzdGVyX3ZhbHVlID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSk7CkBAIC01MTYyLDIzICs3MzA0LDE4NiBAQAogCQlyZXR1cm47CiAJfQogCS8qIENoYW5nZSB0aGUgYWNjZXNzIG1ldGhvZHMgdG8gdGhlIHBlcmZvcm1hbnQgYWNjZXNzIG1ldGhvZHMgKi8KLQloLT5hY2Nlc3MgPSBTQTVfcGVyZm9ybWFudF9hY2Nlc3M7Ci0JaC0+dHJhbnNNZXRob2QgPSBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudDsKKwloLT5hY2Nlc3MgPSBhY2Nlc3M7CisJaC0+dHJhbnNNZXRob2QgPSB0cmFuc01ldGhvZDsKKworCWlmICghKCh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgfHwKKwkJKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSkpCisJCXJldHVybjsKKworCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgeworCQkvKiBTZXQgdXAgSS9PIGFjY2VsZXJhdG9yIG1vZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IGgtPm5yZXBseV9xdWV1ZXM7IGkrKykgeworCQkJd3JpdGVsKGksIGgtPnZhZGRyICsgSU9BQ0NFTF9NT0RFMV9SRVBMWV9RVUVVRV9JTkRFWCk7CisJCQloLT5yZXBseV9xdWV1ZVtpXS5jdXJyZW50X2VudHJ5ID0KKwkJCQlyZWFkbChoLT52YWRkciArIElPQUNDRUxfTU9ERTFfUFJPRFVDRVJfSU5ERVgpOworCQl9CisJCWJmdFs3XSA9IGgtPmlvYWNjZWxfbWF4c2cgKyA4OworCQljYWxjX2J1Y2tldF9tYXAoYmZ0LCBBUlJBWV9TSVpFKGJmdCksIGgtPmlvYWNjZWxfbWF4c2csIDgsCisJCQkJaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlKTsKKworCQkvKiBpbml0aWFsaXplIGFsbCByZXBseSBxdWV1ZSBlbnRyaWVzIHRvIHVudXNlZCAqLworCQltZW1zZXQoaC0+cmVwbHlfcG9vbCwgKHU4KSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRCwKKwkJCQloLT5yZXBseV9wb29sX3NpemUpOworCisJCS8qIHNldCBhbGwgdGhlIGNvbnN0YW50IGZpZWxkcyBpbiB0aGUgYWNjZWxlcmF0b3IgY29tbWFuZAorCQkgKiBmcmFtZXMgb25jZSBhdCBpbml0IHRpbWUgdG8gc2F2ZSBDUFUgY3ljbGVzIGxhdGVyLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGgtPm5yX2NtZHM7IGkrKykgeworCQkJc3RydWN0IGlvX2FjY2VsMV9jbWQgKmNwID0gJmgtPmlvYWNjZWxfY21kX3Bvb2xbaV07CisKKwkJCWNwLT5mdW5jdGlvbiA9IElPQUNDRUwxX0ZVTkNUSU9OX1NDU0lJTzsKKwkJCWNwLT5lcnJfaW5mbyA9ICh1MzIpIChoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSArCisJCQkJCShpICogc2l6ZW9mKHN0cnVjdCBFcnJvckluZm8pKSk7CisJCQljcC0+ZXJyX2luZm9fbGVuID0gc2l6ZW9mKHN0cnVjdCBFcnJvckluZm8pOworCQkJY3AtPnNnbF9vZmZzZXQgPSBJT0FDQ0VMMV9TR0xPRkZTRVQ7CisJCQljcC0+aG9zdF9jb250ZXh0X2ZsYWdzID0gSU9BQ0NFTDFfSENGTEFHU19DSVNTX0ZPUk1BVDsKKwkJCWNwLT50aW1lb3V0X3NlYyA9IDA7CisJCQljcC0+UmVwbHlRdWV1ZSA9IDA7CisJCQljcC0+VGFnLmxvd2VyID0gKGkgPDwgRElSRUNUX0xPT0tVUF9TSElGVCkgfAorCQkJCQkJRElSRUNUX0xPT0tVUF9CSVQ7CisJCQljcC0+VGFnLnVwcGVyID0gMDsKKwkJCWNwLT5ob3N0X2FkZHIubG93ZXIgPQorCQkJCSh1MzIpIChoLT5pb2FjY2VsX2NtZF9wb29sX2RoYW5kbGUgKworCQkJCQkoaSAqIHNpemVvZihzdHJ1Y3QgaW9fYWNjZWwxX2NtZCkpKTsKKwkJCWNwLT5ob3N0X2FkZHIudXBwZXIgPSAwOworCQl9CisJfSBlbHNlIGlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikgeworCQl1NjQgY2ZnX29mZnNldCwgY2ZnX2Jhc2VfYWRkcl9pbmRleDsKKwkJdTMyIGJmdDJfb2Zmc2V0LCBjZmdfYmFzZV9hZGRyOworCQlpbnQgcmM7CisKKwkJcmMgPSBocHNhX2ZpbmRfY2ZnX2FkZHJzKGgtPnBkZXYsIGgtPnZhZGRyLCAmY2ZnX2Jhc2VfYWRkciwKKwkJCSZjZmdfYmFzZV9hZGRyX2luZGV4LCAmY2ZnX29mZnNldCk7CisJCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW9fYWNjZWwyX2NtZCwgc2cpICE9IDY0KTsKKwkJYmZ0MlsxNV0gPSBoLT5pb2FjY2VsX21heHNnICsgSFBTQV9JT0FDQ0VMMl9IRUFERVJfU1o7CisJCWNhbGNfYnVja2V0X21hcChiZnQyLCBBUlJBWV9TSVpFKGJmdDIpLCBoLT5pb2FjY2VsX21heHNnLAorCQkJCTQsIGgtPmlvYWNjZWwyX2Jsb2NrRmV0Y2hUYWJsZSk7CisJCWJmdDJfb2Zmc2V0ID0gcmVhZGwoJmgtPmNmZ3RhYmxlLT5pb19hY2NlbF9yZXF1ZXN0X3NpemVfb2Zmc2V0KTsKKwkJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBDZmdUYWJsZSwKKwkJCQlpb19hY2NlbF9yZXF1ZXN0X3NpemVfb2Zmc2V0KSAhPSAweGI4KTsKKwkJaC0+aW9hY2NlbDJfYmZ0Ml9yZWdzID0KKwkJCXJlbWFwX3BjaV9tZW0ocGNpX3Jlc291cmNlX3N0YXJ0KGgtPnBkZXYsCisJCQkJCWNmZ19iYXNlX2FkZHJfaW5kZXgpICsKKwkJCQkJY2ZnX29mZnNldCArIGJmdDJfb2Zmc2V0LAorCQkJCQlBUlJBWV9TSVpFKGJmdDIpICoKKwkJCQkJc2l6ZW9mKCpoLT5pb2FjY2VsMl9iZnQyX3JlZ3MpKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmZ0Mik7IGkrKykKKwkJCXdyaXRlbChiZnQyW2ldLCAmaC0+aW9hY2NlbDJfYmZ0Ml9yZWdzW2ldKTsKKwl9CisJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKKwlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKK30KKworc3RhdGljIGludCBocHNhX2FsbG9jX2lvYWNjZWxfY21kX2FuZF9iZnQoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwloLT5pb2FjY2VsX21heHNnID0KKwkJcmVhZGwoJihoLT5jZmd0YWJsZS0+aW9fYWNjZWxfbWF4X2VtYmVkZGVkX3NnX2NvdW50KSk7CisJaWYgKGgtPmlvYWNjZWxfbWF4c2cgPiBJT0FDQ0VMMV9NQVhTR0VOVFJJRVMpCisJCWgtPmlvYWNjZWxfbWF4c2cgPSBJT0FDQ0VMMV9NQVhTR0VOVFJJRVM7CisKKwkvKiBDb21tYW5kIHN0cnVjdHVyZXMgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTI4LWJ5dGUgYm91bmRhcnkKKwkgKiBiZWNhdXNlIHRoZSA3IGxvd2VyIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXJlIHVzZWQgYnkgdGhlCisJICogaGFyZHdhcmUuCisJICovCisjZGVmaW5lIElPQUNDRUwxX0NPTU1BTkRMSVNUX0FMSUdOTUVOVCAxMjgKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpb19hY2NlbDFfY21kKSAlCisJCQlJT0FDQ0VMMV9DT01NQU5ETElTVF9BTElHTk1FTlQpOworCWgtPmlvYWNjZWxfY21kX3Bvb2wgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LAorCQkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbF9jbWRfcG9vbCksCisJCQkmKGgtPmlvYWNjZWxfY21kX3Bvb2xfZGhhbmRsZSkpOworCisJaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlID0KKwkJa21hbGxvYygoKGgtPmlvYWNjZWxfbWF4c2cgKyAxKSAqCisJCQkJc2l6ZW9mKHUzMikpLCBHRlBfS0VSTkVMKTsKKworCWlmICgoaC0+aW9hY2NlbF9jbWRfcG9vbCA9PSBOVUxMKSB8fAorCQkoaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlID09IE5VTEwpKQorCQlnb3RvIGNsZWFuX3VwOworCisJbWVtc2V0KGgtPmlvYWNjZWxfY21kX3Bvb2wsIDAsCisJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWxfY21kX3Bvb2wpKTsKKwlyZXR1cm4gMDsKKworY2xlYW5fdXA6CisJaWYgKGgtPmlvYWNjZWxfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWxfY21kX3Bvb2wpLAorCQkJaC0+aW9hY2NlbF9jbWRfcG9vbCwgaC0+aW9hY2NlbF9jbWRfcG9vbF9kaGFuZGxlKTsKKwlrZnJlZShoLT5pb2FjY2VsMV9ibG9ja0ZldGNoVGFibGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlvYWNjZWwyX2FsbG9jX2NtZHNfYW5kX2JmdChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCS8qIEFsbG9jYXRlIGlvYWNjZWwyIG1vZGUgY29tbWFuZCBibG9ja3MgYW5kIGJsb2NrIGZldGNoIHRhYmxlICovCisKKwloLT5pb2FjY2VsX21heHNnID0KKwkJcmVhZGwoJihoLT5jZmd0YWJsZS0+aW9fYWNjZWxfbWF4X2VtYmVkZGVkX3NnX2NvdW50KSk7CisJaWYgKGgtPmlvYWNjZWxfbWF4c2cgPiBJT0FDQ0VMMl9NQVhTR0VOVFJJRVMpCisJCWgtPmlvYWNjZWxfbWF4c2cgPSBJT0FDQ0VMMl9NQVhTR0VOVFJJRVM7CisKKyNkZWZpbmUgSU9BQ0NFTDJfQ09NTUFORExJU1RfQUxJR05NRU5UIDEyOAorCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlvX2FjY2VsMl9jbWQpICUKKwkJCUlPQUNDRUwyX0NPTU1BTkRMSVNUX0FMSUdOTUVOVCk7CisJaC0+aW9hY2NlbDJfY21kX3Bvb2wgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LAorCQkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbDJfY21kX3Bvb2wpLAorCQkJJihoLT5pb2FjY2VsMl9jbWRfcG9vbF9kaGFuZGxlKSk7CisKKwloLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGUgPQorCQlrbWFsbG9jKCgoaC0+aW9hY2NlbF9tYXhzZyArIDEpICoKKwkJCQlzaXplb2YodTMyKSksIEdGUF9LRVJORUwpOworCisJaWYgKChoLT5pb2FjY2VsMl9jbWRfcG9vbCA9PSBOVUxMKSB8fAorCQkoaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlID09IE5VTEwpKQorCQlnb3RvIGNsZWFuX3VwOworCisJbWVtc2V0KGgtPmlvYWNjZWwyX2NtZF9wb29sLCAwLAorCQloLT5ucl9jbWRzICogc2l6ZW9mKCpoLT5pb2FjY2VsMl9jbWRfcG9vbCkpOworCXJldHVybiAwOworCitjbGVhbl91cDoKKwlpZiAoaC0+aW9hY2NlbDJfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWwyX2NtZF9wb29sKSwKKwkJCWgtPmlvYWNjZWwyX2NtZF9wb29sLCBoLT5pb2FjY2VsMl9jbWRfcG9vbF9kaGFuZGxlKTsKKwlrZnJlZShoLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGUpOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBocHNhX3B1dF9jdGxyX2ludG9fcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgpCiB7CiAJdTMyIHRyYW5zX3N1cHBvcnQ7CisJdW5zaWduZWQgbG9uZyB0cmFuc01ldGhvZCA9IENGR1RCTF9UcmFuc19QZXJmb3JtYW50IHwKKwkJCQkJQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzOwogCWludCBpOwogCiAJaWYgKGhwc2Ffc2ltcGxlX21vZGUpCiAJCXJldHVybjsKIAorCS8qIENoZWNrIGZvciBJL08gYWNjZWxlcmF0b3IgbW9kZSBzdXBwb3J0ICovCisJaWYgKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxKSB7CisJCXRyYW5zTWV0aG9kIHw9IENGR1RCTF9UcmFuc19pb19hY2NlbDEgfAorCQkJCUNGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeDsKKwkJaWYgKGhwc2FfYWxsb2NfaW9hY2NlbF9jbWRfYW5kX2JmdChoKSkKKwkJCWdvdG8gY2xlYW5fdXA7CisJfSBlbHNlIHsKKwkJaWYgKHRyYW5zX3N1cHBvcnQgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSB7CisJCQkJdHJhbnNNZXRob2QgfD0gQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMiB8CisJCQkJQ0ZHVEJMX1RyYW5zX2VuYWJsZV9kaXJlY3RlZF9tc2l4OworCQlpZiAoaW9hY2NlbDJfYWxsb2NfY21kc19hbmRfYmZ0KGgpKQorCQkJZ290byBjbGVhbl91cDsKKwkJfQorCX0KKworCS8qIFRPRE8sIGNoZWNrIHRoYXQgdGhpcyBuZXh0IGxpbmUgaC0+bnJlcGx5X3F1ZXVlcyBpcyBjb3JyZWN0ICovCiAJdHJhbnNfc3VwcG9ydCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydFN1cHBvcnQpKTsKIAlpZiAoISh0cmFuc19zdXBwb3J0ICYgUEVSRk9STUFOVF9NT0RFKSkKIAkJcmV0dXJuOwogCi0JaC0+bnJlcGx5X3F1ZXVlcyA9IGgtPm1zaXhfdmVjdG9yID8gTUFYX1JFUExZX1FVRVVFUyA6IDE7CisJaC0+bnJlcGx5X3F1ZXVlcyA9IGgtPm1zaXhfdmVjdG9yID4gMCA/IGgtPm1zaXhfdmVjdG9yIDogMTsKIAlocHNhX2dldF9tYXhfcGVyZl9tb2RlX2NtZHMoaCk7CiAJLyogUGVyZm9ybWFudCBtb2RlIHJpbmcgYnVmZmVyIGFuZCBzdXBwb3J0aW5nIGRhdGEgc3RydWN0dXJlcyAqLwogCWgtPnJlcGx5X3Bvb2xfc2l6ZSA9IGgtPm1heF9jb21tYW5kcyAqIHNpemVvZih1NjQpICogaC0+bnJlcGx5X3F1ZXVlczsKQEAgLTUyMDAsOSArNzUwNSw3IEBACiAJCXx8IChoLT5ibG9ja0ZldGNoVGFibGUgPT0gTlVMTCkpCiAJCWdvdG8gY2xlYW5fdXA7CiAKLQlocHNhX2VudGVyX3BlcmZvcm1hbnRfbW9kZShoLAotCQl0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzKTsKLQorCWhwc2FfZW50ZXJfcGVyZm9ybWFudF9tb2RlKGgsIHRyYW5zX3N1cHBvcnQpOwogCXJldHVybjsKIAogY2xlYW5fdXA6CkBAIC01MjEyLDYgKzc1MTUsMzEgQEAKIAlrZnJlZShoLT5ibG9ja0ZldGNoVGFibGUpOwogfQogCitzdGF0aWMgaW50IGlzX2FjY2VsZXJhdGVkX2NtZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJcmV0dXJuIGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSB8fCBjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDI7Cit9CisKK3N0YXRpYyB2b2lkIGhwc2FfZHJhaW5fYWNjZWxfY29tbWFuZHMoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGFjY2VsX2NtZHNfb3V0OworCisJZG8geyAvKiB3YWl0IGZvciBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMgdG8gZHJhaW4gb3V0ICovCisJCWFjY2VsX2NtZHNfb3V0ID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaC0+Y21wUSwgbGlzdCkKKwkJCWFjY2VsX2NtZHNfb3V0ICs9IGlzX2FjY2VsZXJhdGVkX2NtZChjKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaC0+cmVxUSwgbGlzdCkKKwkJCWFjY2VsX2NtZHNfb3V0ICs9IGlzX2FjY2VsZXJhdGVkX2NtZChjKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCQlpZiAoYWNjZWxfY21kc19vdXQgPD0gMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMTAwKTsKKwl9IHdoaWxlICgxKTsKK30KKwogLyoKICAqICBUaGlzIGlzIGl0LiAgUmVnaXN0ZXIgdGhlIFBDSSBkcml2ZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjYXJkcyB3ZSBjb250cm9sCiAgKiAgdGhlIE9TIHdpbGwgY2FsbCBvdXIgcmVnaXN0ZXJlZCByb3V0aW5lcyB3aGVuIGl0IGZpbmRzIG9uZSBvZiBvdXIgY2FyZHMuCkBAIC01MjI2LDUgKzc1NTQsODMgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhwc2FfcGNpX2RyaXZlcik7CiB9CiAKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHZlcmlmeV9vZmZzZXRzKHZvaWQpCit7CisjZGVmaW5lIFZFUklGWV9PRkZTRVQobWVtYmVyLCBvZmZzZXQpIFwKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHJhaWRfbWFwX2RhdGEsIG1lbWJlcikgIT0gb2Zmc2V0KQorCisJVkVSSUZZX09GRlNFVChzdHJ1Y3R1cmVfc2l6ZSwgMCk7CisJVkVSSUZZX09GRlNFVCh2b2x1bWVfYmxrX3NpemUsIDQpOworCVZFUklGWV9PRkZTRVQodm9sdW1lX2Jsa19jbnQsIDgpOworCVZFUklGWV9PRkZTRVQocGh5c19ibGtfc2hpZnQsIDE2KTsKKwlWRVJJRllfT0ZGU0VUKHBhcml0eV9yb3RhdGlvbl9zaGlmdCwgMTcpOworCVZFUklGWV9PRkZTRVQoc3RyaXBfc2l6ZSwgMTgpOworCVZFUklGWV9PRkZTRVQoZGlza19zdGFydGluZ19ibGssIDIwKTsKKwlWRVJJRllfT0ZGU0VUKGRpc2tfYmxrX2NudCwgMjgpOworCVZFUklGWV9PRkZTRVQoZGF0YV9kaXNrc19wZXJfcm93LCAzNik7CisJVkVSSUZZX09GRlNFVChtZXRhZGF0YV9kaXNrc19wZXJfcm93LCAzOCk7CisJVkVSSUZZX09GRlNFVChyb3dfY250LCA0MCk7CisJVkVSSUZZX09GRlNFVChsYXlvdXRfbWFwX2NvdW50LCA0Mik7CisJVkVSSUZZX09GRlNFVChmbGFncywgNDQpOworCVZFUklGWV9PRkZTRVQoZGVraW5kZXgsIDQ2KTsKKwkvKiBWRVJJRllfT0ZGU0VUKHJlc2VydmVkLCA0OCAqLworCVZFUklGWV9PRkZTRVQoZGF0YSwgNjQpOworCisjdW5kZWYgVkVSSUZZX09GRlNFVAorCisjZGVmaW5lIFZFUklGWV9PRkZTRVQobWVtYmVyLCBvZmZzZXQpIFwKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGlvX2FjY2VsMl9jbWQsIG1lbWJlcikgIT0gb2Zmc2V0KQorCisJVkVSSUZZX09GRlNFVChJVV90eXBlLCAwKTsKKwlWRVJJRllfT0ZGU0VUKGRpcmVjdGlvbiwgMSk7CisJVkVSSUZZX09GRlNFVChyZXBseV9xdWV1ZSwgMik7CisJLyogVkVSSUZZX09GRlNFVChyZXNlcnZlZDEsIDMpOyAgKi8KKwlWRVJJRllfT0ZGU0VUKHNjc2lfbmV4dXMsIDQpOworCVZFUklGWV9PRkZTRVQoVGFnLCA4KTsKKwlWRVJJRllfT0ZGU0VUKGNkYiwgMTYpOworCVZFUklGWV9PRkZTRVQoY2Npc3NfbHVuLCAzMik7CisJVkVSSUZZX09GRlNFVChkYXRhX2xlbiwgNDApOworCVZFUklGWV9PRkZTRVQoY21kX3ByaW9yaXR5X3Rhc2tfYXR0ciwgNDQpOworCVZFUklGWV9PRkZTRVQoc2dfY291bnQsIDQ1KTsKKwkvKiBWRVJJRllfT0ZGU0VUKHJlc2VydmVkMyAqLworCVZFUklGWV9PRkZTRVQoZXJyX3B0ciwgNDgpOworCVZFUklGWV9PRkZTRVQoZXJyX2xlbiwgNTYpOworCS8qIFZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ0ICAqLworCVZFUklGWV9PRkZTRVQoc2csIDY0KTsKKworI3VuZGVmIFZFUklGWV9PRkZTRVQKKworI2RlZmluZSBWRVJJRllfT0ZGU0VUKG1lbWJlciwgb2Zmc2V0KSBcCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpb19hY2NlbDFfY21kLCBtZW1iZXIpICE9IG9mZnNldCkKKworCVZFUklGWV9PRkZTRVQoZGV2X2hhbmRsZSwgMHgwMCk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDEsIDB4MDIpOworCVZFUklGWV9PRkZTRVQoZnVuY3Rpb24sIDB4MDMpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQyLCAweDA0KTsKKwlWRVJJRllfT0ZGU0VUKGVycl9pbmZvLCAweDBDKTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkMywgMHgxMCk7CisJVkVSSUZZX09GRlNFVChlcnJfaW5mb19sZW4sIDB4MTIpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ0LCAweDEzKTsKKwlWRVJJRllfT0ZGU0VUKHNnbF9vZmZzZXQsIDB4MTQpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ1LCAweDE1KTsKKwlWRVJJRllfT0ZGU0VUKHRyYW5zZmVyX2xlbiwgMHgxQyk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDYsIDB4MjApOworCVZFUklGWV9PRkZTRVQoaW9fZmxhZ3MsIDB4MjQpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ3LCAweDI2KTsKKwlWRVJJRllfT0ZGU0VUKExVTiwgMHgzNCk7CisJVkVSSUZZX09GRlNFVChjb250cm9sLCAweDNDKTsKKwlWRVJJRllfT0ZGU0VUKENEQiwgMHg0MCk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDgsIDB4NTApOworCVZFUklGWV9PRkZTRVQoaG9zdF9jb250ZXh0X2ZsYWdzLCAweDYwKTsKKwlWRVJJRllfT0ZGU0VUKHRpbWVvdXRfc2VjLCAweDYyKTsKKwlWRVJJRllfT0ZGU0VUKFJlcGx5UXVldWUsIDB4NjQpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ5LCAweDY1KTsKKwlWRVJJRllfT0ZGU0VUKFRhZywgMHg2OCk7CisJVkVSSUZZX09GRlNFVChob3N0X2FkZHIsIDB4NzApOworCVZFUklGWV9PRkZTRVQoQ0lTU19MVU4sIDB4NzgpOworCVZFUklGWV9PRkZTRVQoU0csIDB4NzggKyA4KTsKKyN1bmRlZiBWRVJJRllfT0ZGU0VUCit9CisKIG1vZHVsZV9pbml0KGhwc2FfaW5pdCk7CiBtb2R1bGVfZXhpdChocHNhX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuaCBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKaW5kZXggMDFjMzI4My4uNDQyMzVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICAgIERpc2sgQXJyYXkgZHJpdmVyIGZvciBIUCBTbWFydCBBcnJheSBTQVMgY29udHJvbGxlcnMKLSAqICAgIENvcHlyaWdodCAyMDAwLCAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAxNCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgogICoKICAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDYsNiArNDYsMTUgQEAKIAl1bnNpZ25lZCBjaGFyIHZlbmRvcls4XTsgICAgICAgIC8qIGJ5dGVzIDgtMTUgb2YgaW5xdWlyeSBkYXRhICovCiAJdW5zaWduZWQgY2hhciBtb2RlbFsxNl07ICAgICAgICAvKiBieXRlcyAxNi0zMSBvZiBpbnF1aXJ5IGRhdGEgKi8KIAl1bnNpZ25lZCBjaGFyIHJhaWRfbGV2ZWw7CS8qIGZyb20gaW5xdWlyeSBwYWdlIDB4QzEgKi8KKwl1bnNpZ25lZCBjaGFyIHZvbHVtZV9vZmZsaW5lOwkvKiBkaXNjb3ZlcmVkIHZpYSBUVVIgb3IgVlBEICovCisJdTMyIGlvYWNjZWxfaGFuZGxlOworCWludCBvZmZsb2FkX2NvbmZpZzsJCS8qIEkvTyBhY2NlbCBSQUlEIG9mZmxvYWQgY29uZmlndXJlZCAqLworCWludCBvZmZsb2FkX2VuYWJsZWQ7CQkvKiBJL08gYWNjZWwgUkFJRCBvZmZsb2FkIGVuYWJsZWQgKi8KKwlpbnQgb2ZmbG9hZF90b19taXJyb3I7CQkvKiBTZW5kIG5leHQgSS9PIGFjY2VsZXJhdG9yIFJBSUQKKwkJCQkJICogb2ZmbG9hZCByZXF1ZXN0IHRvIG1pcnJvciBkcml2ZQorCQkJCQkgKi8KKwlzdHJ1Y3QgcmFpZF9tYXBfZGF0YSByYWlkX21hcDsJLyogSS9PIGFjY2VsZXJhdG9yIFJBSUQgbWFwICovCisKIH07CiAKIHN0cnVjdCByZXBseV9wb29sIHsKQEAgLTU1LDYgKzY0LDQ2IEBACiAJdTMyIGN1cnJlbnRfZW50cnk7CiB9OwogCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycyB7CisJdTggICBsZWRfZmxhZ3M7CisJdTggICBlbmFibGVfY29tbWFuZF9saXN0X3ZlcmlmaWNhdGlvbjsKKwl1OCAgIGJhY2tlZF9vdXRfd3JpdGVfZHJpdmVzOworCXUxNiAgc3RyaXBlc19mb3JfcGFyaXR5OworCXU4ICAgcGFyaXR5X2Rpc3RyaWJ1dGlvbl9tb2RlX2ZsYWdzOworCXUxNiAgbWF4X2RyaXZlcl9yZXF1ZXN0czsKKwl1MTYgIGVsZXZhdG9yX3RyZW5kX2NvdW50OworCXU4ICAgZGlzYWJsZV9lbGV2YXRvcjsKKwl1OCAgIGZvcmNlX3NjYW5fY29tcGxldGU7CisJdTggICBzY3NpX3RyYW5zZmVyX21vZGU7CisJdTggICBmb3JjZV9uYXJyb3c7CisJdTggICByZWJ1aWxkX3ByaW9yaXR5OworCXU4ICAgZXhwYW5kX3ByaW9yaXR5OworCXU4ICAgaG9zdF9zZGJfYXNpY19maXg7CisJdTggICBwZHBpX2J1cnN0X2Zyb21faG9zdF9kaXNhYmxlZDsKKwljaGFyIHNvZnR3YXJlX25hbWVbNjRdOworCWNoYXIgaGFyZHdhcmVfbmFtZVszMl07CisJdTggICBicmlkZ2VfcmV2aXNpb247CisJdTggICBzbmFwc2hvdF9wcmlvcml0eTsKKwl1MzIgIG9zX3NwZWNpZmljOworCXU4ICAgcG9zdF9wcm9tcHRfdGltZW91dDsKKwl1OCAgIGF1dG9tYXRpY19kcml2ZV9zbGFtbWluZzsKKwl1OCAgIHJlc2VydmVkMTsKKwl1OCAgIG52cmFtX2ZsYWdzOworCXU4ICAgY2FjaGVfbnZyYW1fZmxhZ3M7CisJdTggICBkcml2ZV9jb25maWdfZmxhZ3M7CisJdTE2ICByZXNlcnZlZDI7CisJdTggICB0ZW1wX3dhcm5pbmdfbGV2ZWw7CisJdTggICB0ZW1wX3NodXRkb3duX2xldmVsOworCXU4ICAgdGVtcF9jb25kaXRpb25fcmVzZXQ7CisJdTggICBtYXhfY29hbGVzY2VfY29tbWFuZHM7CisJdTMyICBtYXhfY29hbGVzY2VfZGVsYXk7CisJdTggICBvcmNhX3Bhc3N3b3JkWzRdOworCXU4ICAgYWNjZXNzX2lkWzE2XTsKKwl1OCAgIHJlc2VydmVkWzM1Nl07Cit9OworI3ByYWdtYSBwYWNrKCkKKwogc3RydWN0IGN0bHJfaW5mbyB7CiAJaW50CWN0bHI7CiAJY2hhcglkZXZuYW1lWzhdOwpAQCAtODAsNiArMTI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgbXNpX3ZlY3RvcjsKIAlpbnQgaW50cl9tb2RlOyAvKiBlaXRoZXIgUEVSRl9NT0RFX0lOVCBvciBTSU1QTEVfTU9ERV9JTlQgKi8KIAlzdHJ1Y3QgYWNjZXNzX21ldGhvZCBhY2Nlc3M7CisJY2hhciBoYmFfbW9kZV9lbmFibGVkOwogCiAJLyogcXVldWUgYW5kIHF1ZXVlIEluZm8gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJlcVE7CkBAIC05NSw2ICsxNDUsMTAgQEAKIAkvKiBwb2ludGVycyB0byBjb21tYW5kIGFuZCBlcnJvciBpbmZvIHBvb2wgKi8KIAlzdHJ1Y3QgQ29tbWFuZExpc3QgCSpjbWRfcG9vbDsKIAlkbWFfYWRkcl90CQljbWRfcG9vbF9kaGFuZGxlOworCXN0cnVjdCBpb19hY2NlbDFfY21kCSppb2FjY2VsX2NtZF9wb29sOworCWRtYV9hZGRyX3QJCWlvYWNjZWxfY21kX3Bvb2xfZGhhbmRsZTsKKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZAkqaW9hY2NlbDJfY21kX3Bvb2w7CisJZG1hX2FkZHJfdAkJaW9hY2NlbDJfY21kX3Bvb2xfZGhhbmRsZTsKIAlzdHJ1Y3QgRXJyb3JJbmZvIAkqZXJyaW5mb19wb29sOwogCWRtYV9hZGRyX3QJCWVycmluZm9fcG9vbF9kaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgIAkJKmNtZF9wb29sX2JpdHM7CkBAIC0xMjgsNyArMTgyLDE0IEBACiAJdTggbnJlcGx5X3F1ZXVlczsKIAlkbWFfYWRkcl90IHJlcGx5X3Bvb2xfZGhhbmRsZTsKIAl1MzIgKmJsb2NrRmV0Y2hUYWJsZTsKKwl1MzIgKmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZTsKKwl1MzIgKmlvYWNjZWwyX2Jsb2NrRmV0Y2hUYWJsZTsKKwl1MzIgKmlvYWNjZWwyX2JmdDJfcmVnczsKIAl1bnNpZ25lZCBjaGFyICpoYmFfaW5xdWlyeV9kYXRhOworCXUzMiBkcml2ZXJfc3VwcG9ydDsKKwl1MzIgZndfc3VwcG9ydDsKKwlpbnQgaW9hY2NlbF9zdXBwb3J0OworCWludCBpb2FjY2VsX21heHNnOwogCXU2NCBsYXN0X2ludHJfdGltZXN0YW1wOwogCXUzMiBsYXN0X2hlYXJ0YmVhdDsKIAl1NjQgbGFzdF9oZWFydGJlYXRfdGltZXN0YW1wOwpAQCAtMTYxLDcgKzIyMiwzNSBAQAogI2RlZmluZSBIUFNBVE1GX0xPR19RUllfVEFTSyAgICAoMSA8PCAyMykKICNkZWZpbmUgSFBTQVRNRl9MT0dfUVJZX1RTRVQgICAgKDEgPDwgMjQpCiAjZGVmaW5lIEhQU0FUTUZfTE9HX1FSWV9BU1lOQyAgICgxIDw8IDI1KQorCXUzMiBldmVudHM7CisjZGVmaW5lIENUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UCQkJCSgxIDw8IDApCisjZGVmaW5lIENUTFJfRU5DTE9TVVJFX0hPVF9QTFVHX0VWRU5UCQkJKDEgPDwgMSkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfUEhZU0lDQUxfRFJWCQkoMSA8PCA0KQorI2RlZmluZSBDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9MT0dJQ0FMX0RSVgkJKDEgPDwgNSkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfUkVEVU5EQU5UX0NOVFJMCQkoMSA8PCA2KQorI2RlZmluZSBDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9BSU9fRU5BQkxFRF9ESVNBQkxFRAkoMSA8PCAzMCkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfQUlPX0NPTkZJR19DSEFOR0UJKDEgPDwgMzEpCisKKyNkZWZpbmUgUkVTQ0FOX1JFUVVJUkVEX0VWRU5UX0JJVFMgXAorCQkoQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlQgfCBcCisJCUNUTFJfRU5DTE9TVVJFX0hPVF9QTFVHX0VWRU5UIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9QSFlTSUNBTF9EUlYgfCBcCisJCUNUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX0xPR0lDQUxfRFJWIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9SRURVTkRBTlRfQ05UUkwgfCBcCisJCUNUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX0FJT19FTkFCTEVEX0RJU0FCTEVEIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9BSU9fQ09ORklHX0NIQU5HRSkKKwlzcGlubG9ja190IG9mZmxpbmVfZGV2aWNlX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBvZmZsaW5lX2RldmljZV9saXN0OworCWludAlhY2Npb3BhdGhfc3RhdHVzOworCWludAlkcnZfcmVxX3Jlc2NhbjsJLyogZmxhZyBmb3IgZHJpdmVyIHRvIHJlcXVlc3QgcmVzY2FuIGV2ZW50ICovCisJaW50CXJhaWRfb2ZmbG9hZF9kZWJ1ZzsKIH07CisKK3N0cnVjdCBvZmZsaW5lX2RldmljZV9lbnRyeSB7CisJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbOF07CisJc3RydWN0IGxpc3RfaGVhZCBvZmZsaW5lX2xpc3Q7Cit9OworCiAjZGVmaW5lIEhQU0FfQUJPUlRfTVNHIDAKICNkZWZpbmUgSFBTQV9ERVZJQ0VfUkVTRVRfTVNHIDEKICNkZWZpbmUgSFBTQV9SRVNFVF9UWVBFX0NPTlRST0xMRVIgMHgwMApAQCAtMjQyLDYgKzMzMSwxNCBAQAogCiAjZGVmaW5lIEhQU0FfSU5UUl9PTiAJMQogI2RlZmluZSBIUFNBX0lOVFJfT0ZGCTAKKworLyoKKyAqIEluYm91bmQgUG9zdCBRdWV1ZSBvZmZzZXRzIGZvciBJTyBBY2NlbGVyYXRvciBNb2RlIDIKKyAqLworI2RlZmluZSBJT0FDQ0VMMl9JTkJPVU5EX1BPU1RRXzMyCTB4NDgKKyNkZWZpbmUgSU9BQ0NFTDJfSU5CT1VORF9QT1NUUV82NF9MT1cJMHhkMAorI2RlZmluZSBJT0FDQ0VMMl9JTkJPVU5EX1BPU1RRXzY0X0hJCTB4ZDQKKwogLyoKIAlTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBoYXJkd2FyZQogKi8KQEAgLTI1NCw2ICszNTEsMTggQEAKIAkodm9pZCkgcmVhZGwoaC0+dmFkZHIgKyBTQTVfU0NSQVRDSFBBRF9PRkZTRVQpOwogfQogCitzdGF0aWMgdm9pZCBTQTVfc3VibWl0X2NvbW1hbmRfaW9hY2NlbDIoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJZGV2X2RiZygmaC0+cGRldi0+ZGV2LCAiU2VuZGluZyAleCwgdGFnID0gJXhcbiIsIGMtPmJ1c2FkZHIsCisJCWMtPkhlYWRlci5UYWcubG93ZXIpOworCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDIpCisJCXdyaXRlbChjLT5idXNhZGRyLCBoLT52YWRkciArIElPQUNDRUwyX0lOQk9VTkRfUE9TVFFfMzIpOworCWVsc2UKKwkJd3JpdGVsKGMtPmJ1c2FkZHIsIGgtPnZhZGRyICsgU0E1X1JFUVVFU1RfUE9SVF9PRkZTRVQpOworCSh2b2lkKSByZWFkbChoLT52YWRkciArIFNBNV9TQ1JBVENIUEFEX09GRlNFVCk7Cit9CisKIC8qCiAgKiAgVGhpcyBjYXJkIGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUgb3RoZXIgY2FyZHMuCiAgKiAgIDAgdHVybnMgaW50ZXJydXB0cyBvbi4uLgpAQCAtMzg3LDYgKzQ5Niw1MCBAQAogCXJldHVybiByZWdpc3Rlcl92YWx1ZSAmIFNBNV9PVVREQl9TVEFUVVNfUEVSRl9CSVQ7CiB9CiAKKyNkZWZpbmUgU0E1X0lPQUNDRUxfTU9ERTFfSU5UUl9TVEFUVVNfQ01QX0JJVCAgICAweDEwMAorCitzdGF0aWMgYm9vbCBTQTVfaW9hY2NlbF9tb2RlMV9pbnRyX3BlbmRpbmcoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX3ZhbHVlID0gcmVhZGwoaC0+dmFkZHIgKyBTQTVfSU5UUl9TVEFUVVMpOworCisJcmV0dXJuIChyZWdpc3Rlcl92YWx1ZSAmIFNBNV9JT0FDQ0VMX01PREUxX0lOVFJfU1RBVFVTX0NNUF9CSVQpID8KKwkJdHJ1ZSA6IGZhbHNlOworfQorCisjZGVmaW5lIElPQUNDRUxfTU9ERTFfUkVQTFlfUVVFVUVfSU5ERVggIDB4MUEwCisjZGVmaW5lIElPQUNDRUxfTU9ERTFfUFJPRFVDRVJfSU5ERVggICAgIDB4MUI4CisjZGVmaW5lIElPQUNDRUxfTU9ERTFfQ09OU1VNRVJfSU5ERVggICAgIDB4MUJDCisjZGVmaW5lIElPQUNDRUxfTU9ERTFfUkVQTFlfVU5VU0VEICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRlVMTAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBTQTVfaW9hY2NlbF9tb2RlMV9jb21wbGV0ZWQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdTggcSkKK3sKKwl1NjQgcmVnaXN0ZXJfdmFsdWU7CisJc3RydWN0IHJlcGx5X3Bvb2wgKnJxID0gJmgtPnJlcGx5X3F1ZXVlW3FdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlCVUdfT04ocSA+PSBoLT5ucmVwbHlfcXVldWVzKTsKKworCXJlZ2lzdGVyX3ZhbHVlID0gcnEtPmhlYWRbcnEtPmN1cnJlbnRfZW50cnldOworCWlmIChyZWdpc3Rlcl92YWx1ZSAhPSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRCkgeworCQlycS0+aGVhZFtycS0+Y3VycmVudF9lbnRyeV0gPSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRDsKKwkJaWYgKCsrcnEtPmN1cnJlbnRfZW50cnkgPT0gcnEtPnNpemUpCisJCQlycS0+Y3VycmVudF9lbnRyeSA9IDA7CisJCS8qCisJCSAqIEB0b2RvCisJCSAqCisJCSAqIERvbid0IHJlYWxseSBuZWVkIHRvIHdyaXRlIHRoZSBuZXcgaW5kZXggYWZ0ZXIgZWFjaCBjb21tYW5kLAorCQkgKiBidXQgd2l0aCBjdXJyZW50IGRyaXZlciBkZXNpZ24gdGhpcyBpcyBlYXNpZXN0LgorCQkgKi8KKwkJd21iKCk7CisJCXdyaXRlbCgocSA8PCAyNCkgfCBycS0+Y3VycmVudF9lbnRyeSwgaC0+dmFkZHIgKworCQkJCUlPQUNDRUxfTU9ERTFfQ09OU1VNRVJfSU5ERVgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCQloLT5jb21tYW5kc19vdXRzdGFuZGluZy0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAodW5zaWduZWQgbG9uZykgcmVnaXN0ZXJfdmFsdWU7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYWNjZXNzX21ldGhvZCBTQTVfYWNjZXNzID0gewogCVNBNV9zdWJtaXRfY29tbWFuZCwKIAlTQTVfaW50cl9tYXNrLApAQCAtMzk1LDYgKzU0OCwyMiBAQAogCVNBNV9jb21wbGV0ZWQsCiB9OwogCitzdGF0aWMgc3RydWN0IGFjY2Vzc19tZXRob2QgU0E1X2lvYWNjZWxfbW9kZTFfYWNjZXNzID0geworCVNBNV9zdWJtaXRfY29tbWFuZCwKKwlTQTVfcGVyZm9ybWFudF9pbnRyX21hc2ssCisJU0E1X2ZpZm9fZnVsbCwKKwlTQTVfaW9hY2NlbF9tb2RlMV9pbnRyX3BlbmRpbmcsCisJU0E1X2lvYWNjZWxfbW9kZTFfY29tcGxldGVkLAorfTsKKworc3RhdGljIHN0cnVjdCBhY2Nlc3NfbWV0aG9kIFNBNV9pb2FjY2VsX21vZGUyX2FjY2VzcyA9IHsKKwlTQTVfc3VibWl0X2NvbW1hbmRfaW9hY2NlbDIsCisJU0E1X3BlcmZvcm1hbnRfaW50cl9tYXNrLAorCVNBNV9maWZvX2Z1bGwsCisJU0E1X3BlcmZvcm1hbnRfaW50cl9wZW5kaW5nLAorCVNBNV9wZXJmb3JtYW50X2NvbXBsZXRlZCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgYWNjZXNzX21ldGhvZCBTQTVfcGVyZm9ybWFudF9hY2Nlc3MgPSB7CiAJU0E1X3N1Ym1pdF9jb21tYW5kLAogCVNBNV9wZXJmb3JtYW50X2ludHJfbWFzaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oIGIvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKaW5kZXggYmZjOGM0ZS4uYjVjYzcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKKysrIGIvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogICAgRGlzayBBcnJheSBkcml2ZXIgZm9yIEhQIFNtYXJ0IEFycmF5IFNBUyBjb250cm9sbGVycwotICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDkgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqICAgIENvcHlyaWdodCAyMDAwLCAyMDE0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCiAgKgogICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIFNFTlNFSU5GT0JZVEVTICAgICAgICAgIDMyIC8qIG1heSB2YXJ5IGJldHdlZW4gaGJhcyAqLwogI2RlZmluZSBTR19FTlRSSUVTX0lOX0NNRAkzMiAvKiBNYXggU0cgZW50cmllcyBleGNsdWRpbmcgY2hhaW4gYmxvY2tzICovCiAjZGVmaW5lIEhQU0FfU0dfQ0hBSU4JCTB4ODAwMDAwMDAKKyNkZWZpbmUgSFBTQV9TR19MQVNUCQkweDQwMDAwMDAwCiAjZGVmaW5lIE1BWFJFUExZUVMgICAgICAgICAgICAgIDI1NgogCiAvKiBDb21tYW5kIFN0YXR1cyB2YWx1ZSAqLwpAQCAtNDEsNiArNDIsOCBAQAogI2RlZmluZSBDTURfVU5TT0xJQ0lURURfQUJPUlQgICAweDAwMEEKICNkZWZpbmUgQ01EX1RJTUVPVVQgICAgICAgICAgICAgMHgwMDBCCiAjZGVmaW5lIENNRF9VTkFCT1JUQUJMRQkJMHgwMDBDCisjZGVmaW5lIENNRF9JT0FDQ0VMX0RJU0FCTEVECTB4MDAwRQorCiAKIC8qIFVuaXQgQXR0ZW50aW9ucyBBU0MncyBhcyBkZWZpbmVkIGZvciB0aGUgTVNBMjAxMnNhICovCiAjZGVmaW5lIFBPV0VSX09SX1JFU0VUCQkJMHgyOQpAQCAtNzksOCArODIsOSBAQAogI2RlZmluZSBBVFRSX0FDQSAgICAgICAgICAgICAgICAweDA3CiAKIC8qIGNkYiB0eXBlICovCi0jZGVmaW5lIFRZUEVfQ01ECQkJCTB4MDAKLSNkZWZpbmUgVFlQRV9NU0cJCQkJMHgwMQorI2RlZmluZSBUWVBFX0NNRAkJMHgwMAorI2RlZmluZSBUWVBFX01TRwkJMHgwMQorI2RlZmluZSBUWVBFX0lPQUNDRUwyX0NNRAkweDgxIC8qIDB4ODEgaXMgbm90IHVzZWQgYnkgaGFyZHdhcmUgKi8KIAogLyogTWVzc2FnZSBUeXBlcyAgKi8KICNkZWZpbmUgSFBTQV9UQVNLX01BTkFHRU1FTlQgICAgMHgwMApAQCAtMTI1LDkgKzEyOSwxMiBAQAogI2RlZmluZSBDRkdUQkxfQWNjQ21kcyAgICAgICAgICAweDAwMDAwMDAxbAogI2RlZmluZSBET09SQkVMTF9DVExSX1JFU0VUCTB4MDAwMDAwMDRsCiAjZGVmaW5lIERPT1JCRUxMX0NUTFJfUkVTRVQyCTB4MDAwMDAwMjBsCisjZGVmaW5lIERPT1JCRUxMX0NMRUFSX0VWRU5UUwkweDAwMDAwMDQwbAogCiAjZGVmaW5lIENGR1RCTF9UcmFuc19TaW1wbGUgICAgIDB4MDAwMDAwMDJsCiAjZGVmaW5lIENGR1RCTF9UcmFuc19QZXJmb3JtYW50IDB4MDAwMDAwMDRsCisjZGVmaW5lIENGR1RCTF9UcmFuc19pb19hY2NlbDEJMHgwMDAwMDA4MGwKKyNkZWZpbmUgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMgkweDAwMDAwMTAwbAogI2RlZmluZSBDRkdUQkxfVHJhbnNfdXNlX3Nob3J0X3RhZ3MgMHgyMDAwMDAwMGwKICNkZWZpbmUgQ0ZHVEJMX1RyYW5zX2VuYWJsZV9kaXJlY3RlZF9tc2l4ICgxIDw8IDMwKQogCkBAIC0xMzUsNiArMTQyLDI4IEBACiAjZGVmaW5lIENGR1RCTF9CdXNUeXBlX1VsdHJhMyAgIDB4MDAwMDAwMDJsCiAjZGVmaW5lIENGR1RCTF9CdXNUeXBlX0ZpYnJlMUcgIDB4MDAwMDAxMDBsCiAjZGVmaW5lIENGR1RCTF9CdXNUeXBlX0ZpYnJlMkcgIDB4MDAwMDAyMDBsCisKKy8qIFZQRCBJbnF1aXJ5IHR5cGVzICovCisjZGVmaW5lIEhQU0FfVlBEX1NVUFBPUlRFRF9QQUdFUyAgICAgICAgMHgwMAorI2RlZmluZSBIUFNBX1ZQRF9MVl9ERVZJQ0VfR0VPTUVUUlkgICAgIDB4QzEKKyNkZWZpbmUgSFBTQV9WUERfTFZfSU9BQ0NFTF9TVEFUVVMgICAgICAweEMyCisjZGVmaW5lIEhQU0FfVlBEX0xWX1NUQVRVUwkJMHhDMworI2RlZmluZSBIUFNBX1ZQRF9IRUFERVJfU1ogICAgICAgICAgICAgIDQKKworLyogTG9naWNhbCB2b2x1bWUgc3RhdGVzICovCisjZGVmaW5lIEhQU0FfVlBEX0xWX1NUQVRVU19VTlNVUFBPUlRFRAkJCS0xCisjZGVmaW5lIEhQU0FfTFZfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBIUFNBX0xWX1VOREVSR09JTkdfRVJBU0UJCQkweDBGCisjZGVmaW5lIEhQU0FfTFZfVU5ERVJHT0lOR19SUEkJCQkJMHgxMgorI2RlZmluZSBIUFNBX0xWX1BFTkRJTkdfUlBJCQkJCTB4MTMKKyNkZWZpbmUgSFBTQV9MVl9FTkNSWVBURURfTk9fS0VZCQkJMHgxNAorI2RlZmluZSBIUFNBX0xWX1BMQUlOVEVYVF9JTl9FTkNSWVBUX09OTFlfQ09OVFJPTExFUgkweDE1CisjZGVmaW5lIEhQU0FfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OCQkJMHgxNgorI2RlZmluZSBIUFNBX0xWX1VOREVSR09JTkdfRU5DUllQVElPTl9SRUtFWUlORwkJMHgxNworI2RlZmluZSBIUFNBX0xWX0VOQ1JZUFRFRF9JTl9OT05fRU5DUllQVEVEX0NPTlRST0xMRVIJMHgxOAorI2RlZmluZSBIUFNBX0xWX1BFTkRJTkdfRU5DUllQVElPTgkJCTB4MTkKKyNkZWZpbmUgSFBTQV9MVl9QRU5ESU5HX0VOQ1JZUFRJT05fUkVLRVlJTkcJCTB4MUEKKwogc3RydWN0IHZhbHMzMiB7CiAJdTMyICAgbG93ZXI7CiAJdTMyICAgdXBwZXI7CkBAIC0xNjIsOSArMTkxLDUwIEBACiAKICNkZWZpbmUgSFBTQV9SRVBPUlRfTE9HIDB4YzIgICAgLyogUmVwb3J0IExvZ2ljYWwgTFVOcyAqLwogI2RlZmluZSBIUFNBX1JFUE9SVF9QSFlTIDB4YzMgICAvKiBSZXBvcnQgUGh5c2ljYWwgTFVOcyAqLworI2RlZmluZSBIUFNBX1JFUE9SVF9QSFlTX0VYVEVOREVEIDB4MDIKKyNkZWZpbmUgSFBTQV9DSVNTX1JFQUQJMHhjMAkvKiBDSVNTIFJlYWQgKi8KKyNkZWZpbmUgSFBTQV9HRVRfUkFJRF9NQVAgMHhjOAkvKiBDSVNTIEdldCBSQUlEIExheW91dCBNYXAgKi8KKworI2RlZmluZSBSQUlEX01BUF9NQVhfRU5UUklFUyAgIDI1NgorCitzdHJ1Y3QgcmFpZF9tYXBfZGlza19kYXRhIHsKKwl1MzIgICBpb2FjY2VsX2hhbmRsZTsgICAgICAgICAvKio8IEhhbmRsZSB0byBhY2Nlc3MgdGhpcyBkaXNrIHZpYSB0aGUKKwkJCQkJKiAgSS9PIGFjY2VsZXJhdG9yICovCisJdTggICAgeG9yX211bHRbMl07ICAgICAgICAgICAgLyoqPCBYT1IgbXVsdGlwbGllcnMgZm9yIHRoaXMgcG9zaXRpb24sCisJCQkJCSogIHZhbGlkIGZvciBkYXRhIGRpc2tzIG9ubHkgKi8KKwl1OCAgICByZXNlcnZlZFsyXTsKK307CisKK3N0cnVjdCByYWlkX21hcF9kYXRhIHsKKwl1MzIgICBzdHJ1Y3R1cmVfc2l6ZTsJCS8qIFNpemUgb2YgZW50aXJlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworCXUzMiAgIHZvbHVtZV9ibGtfc2l6ZTsJCS8qIGJ5dGVzIC8gYmxvY2sgaW4gdGhlIHZvbHVtZSAqLworCXU2NCAgIHZvbHVtZV9ibGtfY250OwkJLyogbG9naWNhbCBibG9ja3Mgb24gdGhlIHZvbHVtZSAqLworCXU4ICAgIHBoeXNfYmxrX3NoaWZ0OwkJLyogU2hpZnQgZmFjdG9yIHRvIGNvbnZlcnQgYmV0d2VlbgorCQkJCQkgKiB1bml0cyBvZiBsb2dpY2FsIGJsb2NrcyBhbmQgcGh5c2ljYWwKKwkJCQkJICogZGlzayBibG9ja3MgKi8KKwl1OCAgICBwYXJpdHlfcm90YXRpb25fc2hpZnQ7CS8qIFNoaWZ0IGZhY3RvciB0byBjb252ZXJ0IGJldHdlZW4gdW5pdHMKKwkJCQkJICogb2YgbG9naWNhbCBzdHJpcGVzIGFuZCBwaHlzaWNhbAorCQkJCQkgKiBzdHJpcGVzICovCisJdTE2ICAgc3RyaXBfc2l6ZTsJCS8qIGJsb2NrcyB1c2VkIG9uIGVhY2ggZGlzayAvIHN0cmlwZSAqLworCXU2NCAgIGRpc2tfc3RhcnRpbmdfYmxrOwkvKiBGaXJzdCBkaXNrIGJsb2NrIHVzZWQgaW4gdm9sdW1lICovCisJdTY0ICAgZGlza19ibGtfY250OwkJLyogZGlzayBibG9ja3MgdXNlZCBieSB2b2x1bWUgLyBkaXNrICovCisJdTE2ICAgZGF0YV9kaXNrc19wZXJfcm93OwkvKiBkYXRhIGRpc2sgZW50cmllcyAvIHJvdyBpbiB0aGUgbWFwICovCisJdTE2ICAgbWV0YWRhdGFfZGlza3NfcGVyX3JvdzsJLyogbWlycm9yL3Bhcml0eSBkaXNrIGVudHJpZXMgLyByb3cKKwkJCQkJICogaW4gdGhlIG1hcCAqLworCXUxNiAgIHJvd19jbnQ7CQkJLyogcm93cyBpbiBlYWNoIGxheW91dCBtYXAgKi8KKwl1MTYgICBsYXlvdXRfbWFwX2NvdW50OwkJLyogbGF5b3V0IG1hcHMgKDEgbWFwIHBlciBtaXJyb3IvcGFyaXR5CisJCQkJCSAqIGdyb3VwKSAqLworCXUxNiAgIGZsYWdzOwkJCS8qIEJpdCAwIHNldCBpZiBlbmNyeXB0aW9uIGVuYWJsZWQgKi8KKyNkZWZpbmUgUkFJRF9NQVBfRkxBR19FTkNSWVBUX09OICAweDAxCisJdTE2ICAgZGVraW5kZXg7CQkJLyogRGF0YSBlbmNyeXB0aW9uIGtleSBpbmRleC4gKi8KKwl1OCAgICByZXNlcnZlZFsxNl07CisJc3RydWN0IHJhaWRfbWFwX2Rpc2tfZGF0YSBkYXRhW1JBSURfTUFQX01BWF9FTlRSSUVTXTsKK307CisKIHN0cnVjdCBSZXBvcnRMVU5kYXRhIHsKIAl1OCBMVU5MaXN0TGVuZ3RoWzRdOwotCXUzMiByZXNlcnZlZDsKKwl1OCBleHRlbmRlZF9yZXNwb25zZV9mbGFnOworCXU4IHJlc2VydmVkWzNdOwogCXU4IExVTltIUFNBX01BWF9MVU5dWzhdOwogfTsKIApAQCAtMTg3LDYgKzI1Nyw3IEBACiAjZGVmaW5lIEJNSUNfQ0FDSEVfRkxVU0ggMHhjMgogI2RlZmluZSBIUFNBX0NBQ0hFX0ZMVVNIIDB4MDEJLyogQzIgd2FzIGFscmVhZHkgYmVpbmcgdXNlZCBieSBIUFNBICovCiAjZGVmaW5lIEJNSUNfRkxBU0hfRklSTVdBUkUgMHhGNworI2RlZmluZSBCTUlDX1NFTlNFX0NPTlRST0xMRVJfUEFSQU1FVEVSUyAweDY0CiAKIC8qIENvbW1hbmQgTGlzdCBTdHJ1Y3R1cmUgKi8KIHVuaW9uIFNDU0kzQWRkciB7CkBAIC0yODMsNiArMzU0LDggQEAKIC8qIENvbW1hbmQgdHlwZXMgKi8KICNkZWZpbmUgQ01EX0lPQ1RMX1BFTkQgIDB4MDEKICNkZWZpbmUgQ01EX1NDU0kJMHgwMworI2RlZmluZSBDTURfSU9BQ0NFTDEJMHgwNAorI2RlZmluZSBDTURfSU9BQ0NFTDIJMHgwNQogCiAjZGVmaW5lIERJUkVDVF9MT09LVVBfU0hJRlQgNQogI2RlZmluZSBESVJFQ1RfTE9PS1VQX0JJVCAweDEwCkBAIC0zMTQsNyArMzg3LDYgQEAKIAlpbnQJCQkgICBjbWRfdHlwZTsKIAlsb25nCQkJICAgY21kaW5kZXg7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqd2FpdGluZzsKIAl2b2lkICAgKnNjc2lfY21kOwogCkBAIC0zMjcsMTYgKzM5OSwxODMgQEAKICAqLwogI2RlZmluZSBJU18zMl9CSVQgKCg4IC0gc2l6ZW9mKGxvbmcpKS80KQogI2RlZmluZSBJU182NF9CSVQgKCFJU18zMl9CSVQpCi0jZGVmaW5lIFBBRF8zMiAoNCkKLSNkZWZpbmUgUEFEXzY0ICg0KQorI2RlZmluZSBQQURfMzIgKDQwKQorI2RlZmluZSBQQURfNjQgKDEyKQogI2RlZmluZSBDT01NQU5ETElTVF9QQUQgKElTXzMyX0JJVCAqIFBBRF8zMiArIElTXzY0X0JJVCAqIFBBRF82NCkKIAl1OCBwYWRbQ09NTUFORExJU1RfUEFEXTsKIH07CiAKKy8qIE1heCBTL0cgZWxlbWVudHMgaW4gSS9PIGFjY2VsZXJhdG9yIGNvbW1hbmQgKi8KKyNkZWZpbmUgSU9BQ0NFTDFfTUFYU0dFTlRSSUVTICAgICAgICAgICAyNAorI2RlZmluZSBJT0FDQ0VMMl9NQVhTR0VOVFJJRVMJCTI4CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIEkvTyBhY2NlbGVyYXRvciAobW9kZSAxKSBjb21tYW5kcy4KKyAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIDEyOC1ieXRlIGFsaWduZWQgaW4gc2l6ZS4KKyAqLworc3RydWN0IGlvX2FjY2VsMV9jbWQgeworCXUxNiBkZXZfaGFuZGxlOwkJCS8qIDB4MDAgLSAweDAxICovCisJdTggIHJlc2VydmVkMTsJCQkvKiAweDAyICovCisJdTggIGZ1bmN0aW9uOwkJCS8qIDB4MDMgKi8KKwl1OCAgcmVzZXJ2ZWQyWzhdOwkJLyogMHgwNCAtIDB4MEIgKi8KKwl1MzIgZXJyX2luZm87CQkJLyogMHgwQyAtIDB4MEYgKi8KKwl1OCAgcmVzZXJ2ZWQzWzJdOwkJLyogMHgxMCAtIDB4MTEgKi8KKwl1OCAgZXJyX2luZm9fbGVuOwkJLyogMHgxMiAqLworCXU4ICByZXNlcnZlZDQ7CQkJLyogMHgxMyAqLworCXU4ICBzZ2xfb2Zmc2V0OwkJCS8qIDB4MTQgKi8KKwl1OCAgcmVzZXJ2ZWQ1WzddOwkJLyogMHgxNSAtIDB4MUIgKi8KKwl1MzIgdHJhbnNmZXJfbGVuOwkJLyogMHgxQyAtIDB4MUYgKi8KKwl1OCAgcmVzZXJ2ZWQ2WzRdOwkJLyogMHgyMCAtIDB4MjMgKi8KKwl1MTYgaW9fZmxhZ3M7CQkJLyogMHgyNCAtIDB4MjUgKi8KKwl1OCAgcmVzZXJ2ZWQ3WzE0XTsJCS8qIDB4MjYgLSAweDMzICovCisJdTggIExVTls4XTsJCQkvKiAweDM0IC0gMHgzQiAqLworCXUzMiBjb250cm9sOwkJCS8qIDB4M0MgLSAweDNGICovCisJdTggIENEQlsxNl07CQkJLyogMHg0MCAtIDB4NEYgKi8KKwl1OCAgcmVzZXJ2ZWQ4WzE2XTsJCS8qIDB4NTAgLSAweDVGICovCisJdTE2IGhvc3RfY29udGV4dF9mbGFnczsJCS8qIDB4NjAgLSAweDYxICovCisJdTE2IHRpbWVvdXRfc2VjOwkJLyogMHg2MiAtIDB4NjMgKi8KKwl1OCAgUmVwbHlRdWV1ZTsJCQkvKiAweDY0ICovCisJdTggIHJlc2VydmVkOVszXTsJCS8qIDB4NjUgLSAweDY3ICovCisJc3RydWN0IHZhbHMzMiBUYWc7CQkvKiAweDY4IC0gMHg2RiAqLworCXN0cnVjdCB2YWxzMzIgaG9zdF9hZGRyOwkvKiAweDcwIC0gMHg3NyAqLworCXU4ICBDSVNTX0xVTls4XTsJCS8qIDB4NzggLSAweDdGICovCisJc3RydWN0IFNHRGVzY3JpcHRvciBTR1tJT0FDQ0VMMV9NQVhTR0VOVFJJRVNdOworI2RlZmluZSBJT0FDQ0VMMV9QQURfNjQgMAorI2RlZmluZSBJT0FDQ0VMMV9QQURfMzIgMAorI2RlZmluZSBJT0FDQ0VMMV9QQUQgKElTXzMyX0JJVCAqIElPQUNDRUwxX1BBRF8zMiArIFwKKwkJCUlTXzY0X0JJVCAqIElPQUNDRUwxX1BBRF82NCkKKwl1OCBwYWRbSU9BQ0NFTDFfUEFEXTsKK307CisKKyNkZWZpbmUgSU9BQ0NFTDFfRlVOQ1RJT05fU0NTSUlPICAgICAgICAweDAwCisjZGVmaW5lIElPQUNDRUwxX1NHTE9GRlNFVCAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBJT0FDQ0VMMV9JT0ZMQUdTX0lPX1JFUSAgICAgICAgIDB4NDAwMAorI2RlZmluZSBJT0FDQ0VMMV9JT0ZMQUdTX0NEQkxFTl9NQVNLICAgIDB4MDAxRgorI2RlZmluZSBJT0FDQ0VMMV9JT0ZMQUdTX0NEQkxFTl9NQVggICAgIDE2CisKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9OT0RBVEFYRkVSICAgICAweDAwMDAwMDAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfREFUQV9PVVQgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX0RBVEFfSU4gICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9UQVNLUFJJT19NQVNLICAweDAwMDA3ODAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfVEFTS1BSSU9fU0hJRlQgMTEKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9TSU1QTEVRVUVVRSAgICAweDAwMDAwMDAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfSEVBRE9GUVVFVUUgICAgMHgwMDAwMDEwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX09SREVSRURRVUVVRSAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9BQ0EgICAgICAgICAgICAweDAwMDAwNDAwCisKKyNkZWZpbmUgSU9BQ0NFTDFfSENGTEFHU19DSVNTX0ZPUk1BVCAgICAweDAwMTMKKworI2RlZmluZSBJT0FDQ0VMMV9CVVNBRERSX0NNRFRZUEUgICAgICAgIDB4MDAwMDAwNjAKKworc3RydWN0IGlvYWNjZWwyX3NnX2VsZW1lbnQgeworCXU2NCBhZGRyZXNzOworCXUzMiBsZW5ndGg7CisJdTggcmVzZXJ2ZWRbM107CisJdTggY2hhaW5faW5kaWNhdG9yOworI2RlZmluZSBJT0FDQ0VMMl9DSEFJTiAweDgwCit9OworCisvKgorICogU0NTSSBSZXNwb25zZSBGb3JtYXQgc3RydWN0dXJlIGZvciBJTyBBY2NlbGVyYXRvciBNb2RlIDIKKyAqLworc3RydWN0IGlvX2FjY2VsMl9zY3NpX3Jlc3BvbnNlIHsKKwl1OCBJVV90eXBlOworI2RlZmluZSBJT0FDQ0VMMl9JVV9UWVBFX1NSRgkJCTB4NjAKKwl1OCByZXNlcnZlZDFbM107CisJdTggcmVxX2lkWzRdOwkJLyogcmVxdWVzdCBpZGVudGlmaWVyICovCisJdTggcmVzZXJ2ZWQyWzRdOworCXU4IHNlcnZfcmVzcG9uc2U7CQkvKiBzZXJ2aWNlIHJlc3BvbnNlICovCisjZGVmaW5lIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfQ09NUExFVEUJCTB4MDAwCisjZGVmaW5lIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfRkFJTFVSRQkJMHgwMDEKKyNkZWZpbmUgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfQ09NUExFVEUJMHgwMDIKKyNkZWZpbmUgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfU1VDQ0VTUwkweDAwMworI2RlZmluZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9SRUpFQ1RFRAkweDAwNAorI2RlZmluZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9XUk9OR19MVU4JMHgwMDUKKwl1OCBzdGF0dXM7CQkJLyogc3RhdHVzICovCisjZGVmaW5lIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfR09PRAkweDAwCisjZGVmaW5lIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfQ0hLX0NPTkQJMHgwMgorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX0JVU1kJMHgwOAorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX1JFU19DT04JMHgxOAorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX1NFVF9GVUxMCTB4MjgKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9BQk9SVEVECTB4NDAKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX0lPQUNDRUxfRElTQUJMRUQJMHgwRQorCXU4IGRhdGFfcHJlc2VudDsJCS8qIGxvdyAyIGJpdHMgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfTk9fREFUQVBSRVNFTlQJCTB4MDAwCisjZGVmaW5lIElPQUNDRUwyX1JFU1BPTlNFX0RBVEFQUkVTRU5UCTB4MDAxCisjZGVmaW5lIElPQUNDRUwyX1NFTlNFX0RBVEFfUFJFU0VOVAkweDAwMgorI2RlZmluZSBJT0FDQ0VMMl9SRVNFUlZFRAkJMHgwMDMKKwl1OCBzZW5zZV9kYXRhX2xlbjsJCS8qIHNlbnNlL3Jlc3BvbnNlIGRhdGEgbGVuZ3RoICovCisJdTggcmVzaWRfY250WzRdOwkJLyogcmVzaWR1YWwgY291bnQgKi8KKwl1OCBzZW5zZV9kYXRhX2J1ZmZbMzJdOwkJLyogc2Vuc2UvcmVzcG9uc2UgZGF0YSBidWZmZXIgKi8KK307CisKKyNkZWZpbmUgSU9BQ0NFTDJfNjRfUEFEIDc2CisjZGVmaW5lIElPQUNDRUwyXzMyX1BBRCA3NgorI2RlZmluZSBJT0FDQ0VMMl9QQUQgKElTXzMyX0JJVCAqIElPQUNDRUwyXzMyX1BBRCArIFwKKwkJCUlTXzY0X0JJVCAqIElPQUNDRUwyXzY0X1BBRCkKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIEkvTyBhY2NlbGVyYXRvciAobW9kZSAyIG9yIG0yKSBjb21tYW5kcy4KKyAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIDEyOC1ieXRlIGFsaWduZWQgaW4gc2l6ZS4KKyAqLworc3RydWN0IGlvX2FjY2VsMl9jbWQgeworCXU4ICBJVV90eXBlOwkJCS8qIElVIFR5cGUgKi8KKwl1OCAgZGlyZWN0aW9uOwkJCS8qIGRpcmVjdGlvbiwgbWVtdHlwZSwgYW5kIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgSU9BQ0NFTDJfRElSRUNUSU9OX01BU0sJCTB4MDMgLyogYml0cyAwLDE6IGRpcmVjdGlvbiAgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfRElSRUNUSU9OX01FTVRZUEVfTUFTSwkweDA0IC8qIGJpdCAyOiBtZW10eXBlIHNvdXJjZS9kZXN0ICovCisJCQkJCSAgICAgLyogICAgIDBiPVBDSWUsIDFiPUREUiAqLworI2RlZmluZSBJT0FDQ0VMMl9ESVJFQ1RJT05fRU5DUllQVF9NQVNLCTB4MDggLyogYml0IDM6IGVuY3J5cHRpb24gZmxhZyAqLworCQkJCQkgICAgIC8qICAgICAwPW9mZiwgMT1vbiAqLworCXU4ICByZXBseV9xdWV1ZTsJCS8qIFJlcGx5IFF1ZXVlIElEICovCisJdTggIHJlc2VydmVkMTsJCQkvKiBSZXNlcnZlZCAqLworCXUzMiBzY3NpX25leHVzOwkJCS8qIERldmljZSBIYW5kbGUgKi8KKwl1MzIgVGFnOwkJCS8qIGNjaXNzIHRhZywgbG93ZXIgNCBieXRlcyBvbmx5ICovCisJdTMyIHR3ZWFrX2xvd2VyOwkJLyogRW5jcnlwdGlvbiB0d2VhaywgbG93ZXIgNCBieXRlcyAqLworCXU4ICBjZGJbMTZdOwkJCS8qIFNDU0kgQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrICovCisJdTggIGNjaXNzX2x1bls4XTsJCS8qIDggYnl0ZSBTQ1NJIGFkZHJlc3MgKi8KKwl1MzIgZGF0YV9sZW47CQkJLyogVG90YWwgYnl0ZXMgdG8gdHJhbnNmZXIgKi8KKwl1OCAgY21kX3ByaW9yaXR5X3Rhc2tfYXR0cjsJLyogcHJpb3JpdHkgYW5kIHRhc2sgYXR0cnMgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfUFJJT1JJVFlfTUFTSyAweDc4CisjZGVmaW5lIElPQUNDRUwyX0FUVFJfTUFTSyAweDA3CisJdTggIHNnX2NvdW50OwkJCS8qIE51bWJlciBvZiBzZyBlbGVtZW50cyAqLworCXUxNiBkZWtpbmRleDsJCQkvKiBEYXRhIGVuY3J5cHRpb24ga2V5IGluZGV4ICovCisJdTY0IGVycl9wdHI7CQkJLyogRXJyb3IgUG9pbnRlciAqLworCXUzMiBlcnJfbGVuOwkJCS8qIEVycm9yIExlbmd0aCovCisJdTMyIHR3ZWFrX3VwcGVyOwkJLyogRW5jcnlwdGlvbiB0d2VhaywgdXBwZXIgNCBieXRlcyAqLworCXN0cnVjdCBpb2FjY2VsMl9zZ19lbGVtZW50IHNnW0lPQUNDRUwyX01BWFNHRU5UUklFU107CisJc3RydWN0IGlvX2FjY2VsMl9zY3NpX3Jlc3BvbnNlIGVycm9yX2RhdGE7CisJdTggcGFkW0lPQUNDRUwyX1BBRF07Cit9OworCisvKgorICogZGVmaW5lcyBmb3IgTW9kZSAyIGNvbW1hbmQgc3RydWN0CisgKiBGSVhNRTogdGhpcyBjYW4ndCBiZSBhbGwgSSBuZWVkIG1mbQorICovCisjZGVmaW5lIElPQUNDRUwyX0lVX1RZUEUJMHg0MAorI2RlZmluZSBJT0FDQ0VMMl9JVV9UTUZfVFlQRQkweDQxCisjZGVmaW5lIElPQUNDRUwyX0RJUl9OT19EQVRBCTB4MDAKKyNkZWZpbmUgSU9BQ0NFTDJfRElSX0RBVEFfSU4JMHgwMQorI2RlZmluZSBJT0FDQ0VMMl9ESVJfREFUQV9PVVQJMHgwMgorLyoKKyAqIFNDU0kgVGFzayBNYW5hZ2VtZW50IFJlcXVlc3QgZm9ybWF0IGZvciBBY2NlbGVyYXRvciBNb2RlIDIKKyAqLworc3RydWN0IGhwc2FfdG1mX3N0cnVjdCB7CisJdTggaXVfdHlwZTsJCS8qIEluZm9ybWF0aW9uIFVuaXQgVHlwZSAqLworCXU4IHJlcGx5X3F1ZXVlOwkJLyogUmVwbHkgUXVldWUgSUQgKi8KKwl1OCB0bWY7CQkJLyogVGFzayBNYW5hZ2VtZW50IEZ1bmN0aW9uICovCisJdTggcmVzZXJ2ZWQxOwkJLyogYnl0ZSAzIFJlc2VydmVkICovCisJdTMyIGl0X25leHVzOwkJLyogU0NTSSBJLVQgTmV4dXMgKi8KKwl1OCBsdW5faWRbOF07CQkvKiBMVU4gSUQgZm9yIFRNRiByZXF1ZXN0ICovCisJc3RydWN0IHZhbHMzMiBUYWc7CS8qIGNjaXNzIHRhZyBhc3NvY2lhdGVkIHcvIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgdmFsczMyIGFib3J0X3RhZzsvKiBjY2lzcyB0YWcgb2YgU0NTSSBjbWQgb3IgdGFzayB0byBhYm9ydCAqLworCXU2NCBlcnJvcl9wdHI7CQkvKiBFcnJvciBQb2ludGVyICovCisJdTMyIGVycm9yX2xlbjsJCS8qIEVycm9yIExlbmd0aCAqLworfTsKKwogLyogQ29uZmlndXJhdGlvbiBUYWJsZSBTdHJ1Y3R1cmUgKi8KIHN0cnVjdCBIb3N0V3JpdGUgewogCXUzMiBUcmFuc3BvcnRSZXF1ZXN0OwotCXUzMiBSZXNlcnZlZDsKKwl1MzIgY29tbWFuZF9wb29sX2FkZHJfaGk7CiAJdTMyIENvYWxJbnREZWxheTsKIAl1MzIgQ29hbEludENvdW50OwogfTsKQEAgLTM0NCw2ICs1ODMsOSBAQAogI2RlZmluZSBTSU1QTEVfTU9ERSAgICAgMHgwMgogI2RlZmluZSBQRVJGT1JNQU5UX01PREUgMHgwNAogI2RlZmluZSBNRU1RX01PREUgICAgICAgMHgwOAorI2RlZmluZSBJT0FDQ0VMX01PREVfMSAgMHg4MAorCisjZGVmaW5lIERSSVZFUl9TVVBQT1JUX1VBX0VOQUJMRSAgICAgICAgMHgwMDAwMDAwMQogCiBzdHJ1Y3QgQ2ZnVGFibGUgewogCXU4ICAgICAgICAgICAgU2lnbmF0dXJlWzRdOwpAQCAtMzczLDggKzYxNSwxOCBAQAogCXUzMgkJbWlzY19md19zdXBwb3J0OyAvKiBvZmZzZXQgMHg3OCAqLwogI2RlZmluZQkJCU1JU0NfRldfRE9PUkJFTExfUkVTRVQgKDB4MDIpCiAjZGVmaW5lCQkJTUlTQ19GV19ET09SQkVMTF9SRVNFVDIgKDB4MDEwKQorI2RlZmluZQkJCU1JU0NfRldfUkFJRF9PRkZMT0FEX0JBU0lDICgweDAyMCkKKyNkZWZpbmUJCQlNSVNDX0ZXX0VWRU5UX05PVElGWSAoMHgwODApCiAJdTgJCWRyaXZlcl92ZXJzaW9uWzMyXTsKLQorCXUzMiAgICAgICAgICAgICBtYXhfY2FjaGVkX3dyaXRlX3NpemU7CisJdTggICAgICAgICAgICAgIGRyaXZlcl9zY3JhdGNocGFkWzE2XTsKKwl1MzIgICAgICAgICAgICAgbWF4X2Vycm9yX2luZm9fbGVuZ3RoOworCXUzMgkJaW9fYWNjZWxfbWF4X2VtYmVkZGVkX3NnX2NvdW50OworCXUzMgkJaW9fYWNjZWxfcmVxdWVzdF9zaXplX29mZnNldDsKKwl1MzIJCWV2ZW50X25vdGlmeTsKKyNkZWZpbmUgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9TVEFURV9DSEFOR0UgKDEgPDwgMzApCisjZGVmaW5lIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfQ09ORklHX0NIQU5HRSAoMSA8PCAzMSkKKwl1MzIJCWNsZWFyX2V2ZW50X25vdGlmeTsKIH07CiAKICNkZWZpbmUgTlVNX0JMT0NLRkVUQ0hfRU5UUklFUyA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCmluZGV4IGJmOWVjYTguLjU2ZjhhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCkBAIC01ODksNyArNTg5LDcgQEAKIAl9CiAKIAllcnIgPSByZXF1ZXN0X2lycSh2cG9ydC0+ZG1hX2Rldi0+aXJxLCAmaWJtdnN0Z3RfaW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVELCAiaWJtdnN0Z3QiLCB0YXJnZXQpOworCQkJICAwLCAiaWJtdnN0Z3QiLCB0YXJnZXQpOwogCWlmIChlcnIpCiAJCWdvdG8gcmVxX2lycV9mYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pbjIwMDAuYyBiL2RyaXZlcnMvc2NzaS9pbjIwMDAuYwppbmRleCBiZjAyODIxLi5iMWM0ZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaW4yMDAwLmMKKysrIGIvZHJpdmVycy9zY3NpL2luMjAwMC5jCkBAIC0yMDE1LDcgKzIwMTUsNyBAQAogCQl3cml0ZTFfaW8oMCwgSU9fRklGT19SRUFEKTsJLyogc3RhcnQgZmlmbyBvdXQgaW4gcmVhZCBtb2RlICovCiAJCXdyaXRlMV9pbygwLCBJT19JTlRSX01BU0spOwkvKiBhbGxvdyBhbGwgaW50cyAqLwogCQl4ID0gaW50X3RhYlsoc3dpdGNoZXMgJiAoU1dfSU5UMCB8IFNXX0lOVDEpKSA+PiBTV19JTlRfU0hJRlRdOwotCQlpZiAocmVxdWVzdF9pcnEoeCwgaW4yMDAwX2ludHIsIElSUUZfRElTQUJMRUQsICJpbjIwMDAiLCBpbnN0YW5jZSkpIHsKKwkJaWYgKHJlcXVlc3RfaXJxKHgsIGluMjAwMF9pbnRyLCAwLCAiaW4yMDAwIiwgaW5zdGFuY2UpKSB7CiAJCQlwcmludGsoImluMjAwMF9kZXRlY3Q6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlEuXG4iKTsKIAkJCWRldGVjdF9jb3VudC0tOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmMgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKaW5kZXggMjgwZDVhZi4uZTVkYWU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2luaXRpby5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwpAQCAtMjkzMSw3ICsyOTMxLDcgQEAKIAlzaG9zdC0+YmFzZSA9IGhvc3QtPmFkZHI7CiAJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IFRPVEFMX1NHX0VOVFJZOwogCi0JZXJyb3IgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGk5MXVfaW50ciwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgImk5MXUiLCBzaG9zdCk7CisJZXJyb3IgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGk5MXVfaW50ciwgSVJRRl9TSEFSRUQsICJpOTF1Iiwgc2hvc3QpOwogCWlmIChlcnJvciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5pdGlvOiBVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCWdvdG8gb3V0X2ZyZWVfc2NiczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwppbmRleCAzZjViNTZhLi45MjRiMGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC0xMTQzLDYgKzExNDMsNyBAQAogCXJlcy0+YWRkX3RvX21sID0gMDsKIAlyZXMtPmRlbF9mcm9tX21sID0gMDsKIAlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAwOworCXJlcy0+cmVzZXRfb2NjdXJyZWQgPSAwOwogCXJlcy0+c2RldiA9IE5VTEw7CiAJcmVzLT5zYXRhX3BvcnQgPSBOVUxMOwogCkBAIC0yMzY3LDYgKzIzNjgsNDIgQEAKIH0KIAogLyoqCisgKiBpcHJfbG9nX3NpczY0X2RldmljZV9lcnJvciAtIExvZyBhIGNhY2hlIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ19zaXM2NF9kZXZpY2VfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCQkgc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiKQoreworCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIxX2Vycm9yICplcnJvcjsKKwljaGFyIGJ1ZmZlcltJUFJfTUFYX1JFU19QQVRIX0xFTkdUSF07CisKKwllcnJvciA9ICZob3N0cmNiLT5oY2FtLnUuZXJyb3I2NC51LnR5cGVfMjFfZXJyb3I7CisKKwlpcHJfZXJyKCItLS0tLUZhaWxpbmcgRGV2aWNlIEluZm9ybWF0aW9uLS0tLS1cbiIpOworCWlwcl9lcnIoIldvcmxkIFdpZGUgVW5pcXVlIElEOiAlMDhYJTA4WCUwOFglMDhYXG4iLAorCQliZTMyX3RvX2NwdShlcnJvci0+d3duWzBdKSwgYmUzMl90b19jcHUoZXJyb3ItPnd3blsxXSksCisJCSBiZTMyX3RvX2NwdShlcnJvci0+d3duWzJdKSwgYmUzMl90b19jcHUoZXJyb3ItPnd3blszXSkpOworCWlwcl9lcnIoIkRldmljZSBSZXNvdXJjZSBQYXRoOiAlc1xuIiwKKwkJX19pcHJfZm9ybWF0X3Jlc19wYXRoKGVycm9yLT5yZXNfcGF0aCwKKwkJCQkgICAgICBidWZmZXIsIHNpemVvZihidWZmZXIpKSk7CisJZXJyb3ItPnByaW1hcnlfcHJvYmxlbV9kZXNjW3NpemVvZihlcnJvci0+cHJpbWFyeV9wcm9ibGVtX2Rlc2MpIC0gMV0gPSAnXDAnOworCWVycm9yLT5zZWNvbmRfcHJvYmxlbV9kZXNjW3NpemVvZihlcnJvci0+c2Vjb25kX3Byb2JsZW1fZGVzYykgLSAxXSA9ICdcMCc7CisJaXByX2VycigiUHJpbWFyeSBQcm9ibGVtIERlc2NyaXB0aW9uOiAlc1xuIiwgZXJyb3ItPnByaW1hcnlfcHJvYmxlbV9kZXNjKTsKKwlpcHJfZXJyKCJTZWNvbmRhcnkgUHJvYmxlbSBEZXNjcmlwdGlvbjogICVzXG4iLCBlcnJvci0+c2Vjb25kX3Byb2JsZW1fZGVzYyk7CisJaXByX2VycigiU0NTSSBTZW5zZSBEYXRhOlxuIik7CisJaXByX2xvZ19oZXhfZGF0YShpb2FfY2ZnLCBlcnJvci0+c2Vuc2VfZGF0YSwgc2l6ZW9mKGVycm9yLT5zZW5zZV9kYXRhKSk7CisJaXByX2VycigiU0NTSSBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2s6IFxuIik7CisJaXByX2xvZ19oZXhfZGF0YShpb2FfY2ZnLCBlcnJvci0+Y2RiLCBzaXplb2YoZXJyb3ItPmNkYikpOworCisJaXByX2VycigiQWRkaXRpb25hbCBJT0EgRGF0YTpcbiIpOworCWlwcl9sb2dfaGV4X2RhdGEoaW9hX2NmZywgZXJyb3ItPmlvYV9kYXRhLCBiZTMyX3RvX2NwdShlcnJvci0+bGVuZ3RoX29mX2Vycm9yKSk7Cit9CisKKy8qKgogICogaXByX2dldF9lcnJvciAtIEZpbmQgdGhlIHNwZWNmaWVkIElPQVNDIGluIHRoZSBpcHJfZXJyb3JfdGFibGUuCiAgKiBAaW9hc2M6CUlPQVNDCiAgKgpAQCAtMjQ2Nyw2ICsyNTA0LDkgQEAKIAljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIwOgogCQlpcHJfbG9nX2ZhYnJpY19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKIAkJYnJlYWs7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yMToKKwkJaXByX2xvZ19zaXM2NF9kZXZpY2VfZXJyb3IoaW9hX2NmZywgaG9zdHJjYik7CisJCWJyZWFrOwogCWNhc2UgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjM6CiAJCWlwcl9sb2dfc2lzNjRfY29uZmlnX2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOwogCQlicmVhazsKQEAgLTM2MzAsMTYgKzM2NzAsMTQgQEAKIAkJcmV0dXJuIHN0cmxlbihidWYpOwogCX0KIAotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQgJiYgaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJgotCQkJaW9hX2NmZy0+c2lzNjQgJiYgaW9hX2NmZy0+bnZlY3RvcnMgPiAxKSB7CisJaWYgKGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYgaW9hX2NmZy0+c2lzNjQgJiYgaW9hX2NmZy0+bnZlY3RvcnMgPiAxKSB7CiAJCWZvciAoaSA9IDE7IGkgPCBpb2FfY2ZnLT5ocnJxX251bTsgaSsrKQogCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCk7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCA9IHVzZXJfaW9wb2xsX3dlaWdodDsKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlmb3IgKGkgPSAxOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewogCQkJYmxrX2lvcG9sbF9pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCwKIAkJCQkJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCwgaXByX2lvcG9sbCk7CkBAIC01MDE1LDYgKzUwNTMsNyBAQAogCX0gZWxzZQogCQlyYyA9IGlwcl9kZXZpY2VfcmVzZXQoaW9hX2NmZywgcmVzKTsKIAlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAwOworCXJlcy0+cmVzZXRfb2NjdXJyZWQgPSAxOwogCiAJTEVBVkU7CiAJcmV0dXJuIHJjID8gRkFJTEVEIDogU1VDQ0VTUzsKQEAgLTU0ODQsOCArNTUyMyw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlpZiAoKGJlMzJfdG9fY3B1KCpocnJxLT5ocnJxX2N1cnIpICYgSVBSX0hSUlFfVE9HR0xFX0JJVCkgPT0KIAkJICAgICAgIGhycnEtPnRvZ2dsZV9iaXQpIHsKIAkJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZocnJxLT5pb3BvbGwpKQpAQCAtNjE4Myw4ICs2MjIxLDEwIEBACiAJCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX05PX1VMRU5fQ0hLOwogCiAJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfTk9fTElOS19ERVNDOwotCQlpZiAoaXByX2lzX2dzY3NpKHJlcykpCisJCWlmIChpcHJfaXNfZ3Njc2kocmVzKSAmJiByZXMtPnJlc2V0X29jY3VycmVkKSB7CisJCQlyZXMtPnJlc2V0X29jY3VycmVkID0gMDsKIAkJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBJUFJfRkxBR1NfTE9fREVMQVlfQUZURVJfUlNUOworCQl9CiAJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBJUFJfRkxBR1NfTE9fQUxJR05FRF9CRlI7CiAJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBpcHJfZ2V0X3Rhc2tfYXR0cmlidXRlcyhzY3NpX2NtZCk7CiAJfQpAQCAtODY0MSw2ICs4NjgxLDI1IEBACiB9CiAKIC8qKgorICogaXByX3BjaV9tbWlvX2VuYWJsZWQgLSBDYWxsZWQgd2hlbiBNTUlPIGhhcyBiZWVuIHJlLWVuYWJsZWQKKyAqIEBwZGV2OglQQ0kgZGV2aWNlIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHRlbGwgdXMgdGhhdCB0aGUgTU1JTworICogYWNjZXNzIHRvIHRoZSBJT0EgaGFzIGJlZW4gcmVzdG9yZWQKKyAqLworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgaXByX3BjaV9tbWlvX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKCFpb2FfY2ZnLT5wcm9iZV9kb25lKQorCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworfQorCisvKioKICAqIGlwcl9wY2lfZnJvemVuIC0gQ2FsbGVkIHdoZW4gc2xvdCBoYXMgZXhwZXJpZW5jZWQgYSBQQ0kgYnVzIGVycm9yLgogICogQHBkZXY6CVBDSSBkZXZpY2Ugc3RydWN0CiAgKgpAQCAtODY1NCw3ICs4NzEzLDggQEAKIAlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlfaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBpcHJfcmVzZXRfZnJlZXplLCBJUFJfU0hVVERPV05fTk9ORSk7CisJaWYgKGlvYV9jZmctPnByb2JlX2RvbmUpCisJCV9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIGlwcl9yZXNldF9mcmVlemUsIElQUl9TSFVURE9XTl9OT05FKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogfQogCkBAIC04NjcyLDExICs4NzMyLDE0IEBACiAJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGlvYV9jZmctPm5lZWRzX3dhcm1fcmVzZXQpCi0JCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOwotCWVsc2UKLQkJX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgaXByX3Jlc2V0X3Jlc3RvcmVfY2ZnX3NwYWNlLAotCQkJCQlJUFJfU0hVVERPV05fTk9ORSk7CisJaWYgKGlvYV9jZmctPnByb2JlX2RvbmUpIHsKKwkJaWYgKGlvYV9jZmctPm5lZWRzX3dhcm1fcmVzZXQpCisJCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKKwkJZWxzZQorCQkJX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgaXByX3Jlc2V0X3Jlc3RvcmVfY2ZnX3NwYWNlLAorCQkJCQkJSVBSX1NIVVRET1dOX05PTkUpOworCX0gZWxzZQorCQl3YWtlX3VwX2FsbCgmaW9hX2NmZy0+ZWVoX3dhaXRfcSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOwogfQpAQCAtODY5NSwxNyArODc1OCwyMCBAQAogCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBXQUlUX0ZPUl9EVU1QKQotCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBBQk9SVF9EVU1QOwotCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgPSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTIC0gMTsKLQlpb2FfY2ZnLT5pbl9pb2FfYnJpbmdkb3duID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewotCQlzcGluX2xvY2soJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOwotCQlpb2FfY2ZnLT5ocnJxW2ldLmFsbG93X2NtZHMgPSAwOwotCQlzcGluX3VubG9jaygmaW9hX2NmZy0+aHJycVtpXS5fbG9jayk7Ci0JfQotCXdtYigpOwotCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCWlmIChpb2FfY2ZnLT5wcm9iZV9kb25lKSB7CisJCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gV0FJVF9GT1JfRFVNUCkKKwkJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CisJCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgPSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTIC0gMTsKKwkJaW9hX2NmZy0+aW5faW9hX2JyaW5nZG93biA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBpb2FfY2ZnLT5ocnJxX251bTsgaSsrKSB7CisJCQlzcGluX2xvY2soJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOworCQkJaW9hX2NmZy0+aHJycVtpXS5hbGxvd19jbWRzID0gMDsKKwkJCXNwaW5fdW5sb2NrKCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKKwkJfQorCQl3bWIoKTsKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJfSBlbHNlCisJCXdha2VfdXBfYWxsKCZpb2FfY2ZnLT5lZWhfd2FpdF9xKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogfQogCkBAIC04NzI1LDcgKzg3OTEsNyBAQAogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIHBjaV9jaGFubmVsX2lvX2Zyb3plbjoKIAkJaXByX3BjaV9mcm96ZW4ocGRldik7Ci0JCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVI7CiAJY2FzZSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmU6CiAJCWlwcl9wY2lfcGVybV9mYWlsdXJlKHBkZXYpOwogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKQEAgLTg3NTUsNiArODgyMSw3IEBACiAJRU5URVI7CiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOwogCWRldl9kYmcoJmlvYV9jZmctPnBkZXYtPmRldiwgImlvYV9jZmcgYWR4OiAweCVwXG4iLCBpb2FfY2ZnKTsKKwlpb2FfY2ZnLT5wcm9iZV9kb25lID0gMTsKIAlpZiAoaW9hX2NmZy0+bmVlZHNfaGFyZF9yZXNldCkgewogCQlpb2FfY2ZnLT5uZWVkc19oYXJkX3Jlc2V0ID0gMDsKIAkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CkBAIC05MDMwLDE2ICs5MDk3LDYgQEAKIAlpZiAoIWlvYV9jZmctPnZwZF9jYnMpCiAJCWdvdG8gb3V0X2ZyZWVfcmVzX2VudHJpZXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aHJycVtpXS5ocnJxX2ZyZWVfcSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ocnJxW2ldLmhycnFfcGVuZGluZ19xKTsKLQkJc3Bpbl9sb2NrX2luaXQoJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOwotCQlpZiAoaSA9PSAwKQotCQkJaW9hX2NmZy0+aHJycVtpXS5sb2NrID0gaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrOwotCQllbHNlCi0JCQlpb2FfY2ZnLT5ocnJxW2ldLmxvY2sgPSAmaW9hX2NmZy0+aHJycVtpXS5fbG9jazsKLQl9Ci0KIAlpZiAoaXByX2FsbG9jX2NtZF9ibGtzKGlvYV9jZmcpKQogCQlnb3RvIG91dF9mcmVlX3ZwZF9jYnM7CiAKQEAgLTkxNDAsNjEgKzkxOTcsMTggQEAKIH0KIAogLyoqCi0gKiBpcHJfaW5pdF9pb2FfY2ZnIC0gSW5pdGlhbGl6ZSBJT0EgY29uZmlnIHN0cnVjdAorICogaXByX2luaXRfcmVncyAtIEluaXRpYWxpemUgSU9BIHJlZ2lzdGVycwogICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0Ci0gKiBAaG9zdDoJCXNjc2kgaG9zdCBzdHJ1Y3QKLSAqIEBwZGV2OgkJUENJIGRldiBzdHJ1Y3QKICAqCiAgKiBSZXR1cm4gdmFsdWU6Ci0gKiAJbm9uZQorICoJbm9uZQogICoqLwotc3RhdGljIHZvaWQgaXByX2luaXRfaW9hX2NmZyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCi0JCQkgICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgaXByX2luaXRfcmVncyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCiB7CiAJY29uc3Qgc3RydWN0IGlwcl9pbnRlcnJ1cHRfb2Zmc2V0cyAqcDsKIAlzdHJ1Y3QgaXByX2ludGVycnVwdHMgKnQ7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCi0JaW9hX2NmZy0+aG9zdCA9IGhvc3Q7Ci0JaW9hX2NmZy0+cGRldiA9IHBkZXY7Ci0JaW9hX2NmZy0+bG9nX2xldmVsID0gaXByX2xvZ19sZXZlbDsKLQlpb2FfY2ZnLT5kb29yYmVsbCA9IElQUl9ET09SQkVMTDsKLQlzcHJpbnRmKGlvYV9jZmctPmV5ZV9jYXRjaGVyLCBJUFJfRVlFQ0FUQ0hFUik7Ci0Jc3ByaW50Zihpb2FfY2ZnLT50cmFjZV9zdGFydCwgSVBSX1RSQUNFX1NUQVJUX0xBQkVMKTsKLQlzcHJpbnRmKGlvYV9jZmctPmNmZ190YWJsZV9zdGFydCwgSVBSX0NGR19UQkxfU1RBUlQpOwotCXNwcmludGYoaW9hX2NmZy0+cmVzb3VyY2VfdGFibGVfbGFiZWwsIElQUl9SRVNfVEFCTEVfTEFCRUwpOwotCXNwcmludGYoaW9hX2NmZy0+aXByX2hjYW1fbGFiZWwsIElQUl9IQ0FNX0xBQkVMKTsKLQlzcHJpbnRmKGlvYV9jZmctPmlwcl9jbWRfbGFiZWwsIElQUl9DTURfTEFCRUwpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfZnJlZV9xKTsKLQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aG9zdHJjYl9wZW5kaW5nX3EpOwotCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5mcmVlX3Jlc19xKTsKLQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+dXNlZF9yZXNfcSk7Ci0JSU5JVF9XT1JLKCZpb2FfY2ZnLT53b3JrX3EsIGlwcl93b3JrZXJfdGhyZWFkKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5yZXNldF93YWl0X3EpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlvYV9jZmctPm1zaV93YWl0X3EpOwotCWlvYV9jZmctPnNkdF9zdGF0ZSA9IElOQUNUSVZFOwotCi0JaXByX2luaXRpYWxpemVfYnVzX2F0dHIoaW9hX2NmZyk7Ci0JaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gaXByX21heF9kZXZzOwotCi0JaWYgKGlvYV9jZmctPnNpczY0KSB7Ci0JCWhvc3QtPm1heF9pZCA9IElQUl9NQVhfU0lTNjRfVEFSR0VUU19QRVJfQlVTOwotCQlob3N0LT5tYXhfbHVuID0gSVBSX01BWF9TSVM2NF9MVU5TX1BFUl9UQVJHRVQ7Ci0JCWlmIChpcHJfbWF4X2RldnMgPiBJUFJfTUFYX1NJUzY0X0RFVlMpCi0JCQlpb2FfY2ZnLT5tYXhfZGV2c19zdXBwb3J0ZWQgPSBJUFJfTUFYX1NJUzY0X0RFVlM7Ci0JfSBlbHNlIHsKLQkJaG9zdC0+bWF4X2lkID0gSVBSX01BWF9OVU1fVEFSR0VUU19QRVJfQlVTOwotCQlob3N0LT5tYXhfbHVuID0gSVBSX01BWF9OVU1fTFVOU19QRVJfVEFSR0VUOwotCQlpZiAoaXByX21heF9kZXZzID4gSVBSX01BWF9QSFlTSUNBTF9ERVZTKQotCQkJaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gSVBSX01BWF9QSFlTSUNBTF9ERVZTOwotCX0KLQlob3N0LT5tYXhfY2hhbm5lbCA9IElQUl9NQVhfQlVTX1RPX1NDQU47Ci0JaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKLQlob3N0LT5tYXhfY21kX2xlbiA9IElQUl9NQVhfQ0RCX0xFTjsKLQlob3N0LT5jYW5fcXVldWUgPSBpb2FfY2ZnLT5tYXhfY21kczsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgaW9hX2NmZyk7Ci0KIAlwID0gJmlvYV9jZmctPmNoaXBfY2ZnLT5yZWdzOwogCXQgPSAmaW9hX2NmZy0+cmVnczsKIAliYXNlID0gaW9hX2NmZy0+aGR3X2RtYV9yZWdzOwpAQCAtOTIyNSw2ICs5MjM5LDc5IEBACiB9CiAKIC8qKgorICogaXByX2luaXRfaW9hX2NmZyAtIEluaXRpYWxpemUgSU9BIGNvbmZpZyBzdHJ1Y3QKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3Q6CQlzY3NpIGhvc3Qgc3RydWN0CisgKiBAcGRldjoJCVBDSSBkZXYgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0X2lvYV9jZmcoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgaTsKKworCWlvYV9jZmctPmhvc3QgPSBob3N0OworCWlvYV9jZmctPnBkZXYgPSBwZGV2OworCWlvYV9jZmctPmxvZ19sZXZlbCA9IGlwcl9sb2dfbGV2ZWw7CisJaW9hX2NmZy0+ZG9vcmJlbGwgPSBJUFJfRE9PUkJFTEw7CisJc3ByaW50Zihpb2FfY2ZnLT5leWVfY2F0Y2hlciwgSVBSX0VZRUNBVENIRVIpOworCXNwcmludGYoaW9hX2NmZy0+dHJhY2Vfc3RhcnQsIElQUl9UUkFDRV9TVEFSVF9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5jZmdfdGFibGVfc3RhcnQsIElQUl9DRkdfVEJMX1NUQVJUKTsKKwlzcHJpbnRmKGlvYV9jZmctPnJlc291cmNlX3RhYmxlX2xhYmVsLCBJUFJfUkVTX1RBQkxFX0xBQkVMKTsKKwlzcHJpbnRmKGlvYV9jZmctPmlwcl9oY2FtX2xhYmVsLCBJUFJfSENBTV9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5pcHJfY21kX2xhYmVsLCBJUFJfQ01EX0xBQkVMKTsKKworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfcGVuZGluZ19xKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPnVzZWRfcmVzX3EpOworCUlOSVRfV09SSygmaW9hX2NmZy0+d29ya19xLCBpcHJfd29ya2VyX3RocmVhZCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5tc2lfd2FpdF9xKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5lZWhfd2FpdF9xKTsKKwlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBJTkFDVElWRTsKKworCWlwcl9pbml0aWFsaXplX2J1c19hdHRyKGlvYV9jZmcpOworCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IGlwcl9tYXhfZGV2czsKKworCWlmIChpb2FfY2ZnLT5zaXM2NCkgeworCQlob3N0LT5tYXhfaWQgPSBJUFJfTUFYX1NJUzY0X1RBUkdFVFNfUEVSX0JVUzsKKwkJaG9zdC0+bWF4X2x1biA9IElQUl9NQVhfU0lTNjRfTFVOU19QRVJfVEFSR0VUOworCQlpZiAoaXByX21heF9kZXZzID4gSVBSX01BWF9TSVM2NF9ERVZTKQorCQkJaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gSVBSX01BWF9TSVM2NF9ERVZTOworCQlpb2FfY2ZnLT5jZmdfdGFibGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfaGRyNjQpCisJCQkJCSAgICsgKChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnk2NCkKKwkJCQkJICAgICAgICogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOworCX0gZWxzZSB7CisJCWhvc3QtPm1heF9pZCA9IElQUl9NQVhfTlVNX1RBUkdFVFNfUEVSX0JVUzsKKwkJaG9zdC0+bWF4X2x1biA9IElQUl9NQVhfTlVNX0xVTlNfUEVSX1RBUkdFVDsKKwkJaWYgKGlwcl9tYXhfZGV2cyA+IElQUl9NQVhfUEhZU0lDQUxfREVWUykKKwkJCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IElQUl9NQVhfUEhZU0lDQUxfREVWUzsKKwkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcikKKwkJCQkJICAgKyAoKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSkKKwkJCQkJICAgICAgICogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOworCX0KKworCWhvc3QtPm1heF9jaGFubmVsID0gSVBSX01BWF9CVVNfVE9fU0NBTjsKKwlob3N0LT51bmlxdWVfaWQgPSBob3N0LT5ob3N0X25vOworCWhvc3QtPm1heF9jbWRfbGVuID0gSVBSX01BWF9DREJfTEVOOworCWhvc3QtPmNhbl9xdWV1ZSA9IGlvYV9jZmctPm1heF9jbWRzOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpb2FfY2ZnKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlvYV9jZmctPmhycnEpOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhycnFbaV0uaHJycV9mcmVlX3EpOworCQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aHJycVtpXS5ocnJxX3BlbmRpbmdfcSk7CisJCXNwaW5fbG9ja19pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKKwkJaWYgKGkgPT0gMCkKKwkJCWlvYV9jZmctPmhycnFbaV0ubG9jayA9IGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jazsKKwkJZWxzZQorCQkJaW9hX2NmZy0+aHJycVtpXS5sb2NrID0gJmlvYV9jZmctPmhycnFbaV0uX2xvY2s7CisJfQorfQorCisvKioKICAqIGlwcl9nZXRfY2hpcF9pbmZvIC0gRmluZCBhZGFwdGVyIGNoaXAgaW5mb3JtYXRpb24KICAqIEBkZXZfaWQ6CQlQQ0kgZGV2aWNlIGlkIHN0cnVjdAogICoKQEAgLTkyNDMsNTQgKzkzMzAsNjMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyoqCisgKiBpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeSAtIFdhaXQgZm9yIGFueSBQQ0kgZXJyb3IgcmVjb3ZlcnkgdG8gY29tcGxldGUKKyAqCQkJCQkJZHVyaW5nIHByb2JlIHRpbWUKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlOb25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpb2FfY2ZnLT5wZGV2OworCisJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUocGRldikpIHsKKwkJd2FpdF9ldmVudF90aW1lb3V0KGlvYV9jZmctPmVlaF93YWl0X3EsCisJCQkJICAgIXBjaV9jaGFubmVsX29mZmxpbmUocGRldiksCisJCQkJICAgSVBSX1BDSV9FUlJPUl9SRUNPVkVSWV9USU1FT1VUKTsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJfQorfQorCiBzdGF0aWMgaW50IGlwcl9lbmFibGVfbXNpeChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCiB7CiAJc3RydWN0IG1zaXhfZW50cnkgZW50cmllc1tJUFJfTUFYX01TSVhfVkVDVE9SU107Ci0JaW50IGksIGVyciwgdmVjdG9yczsKKwlpbnQgaSwgdmVjdG9yczsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVudHJpZXMpOyArK2kpCiAJCWVudHJpZXNbaV0uZW50cnkgPSBpOwogCi0JdmVjdG9ycyA9IGlwcl9udW1iZXJfb2ZfbXNpeDsKLQotCXdoaWxlICgoZXJyID0gcGNpX2VuYWJsZV9tc2l4KGlvYV9jZmctPnBkZXYsIGVudHJpZXMsIHZlY3RvcnMpKSA+IDApCi0JCQl2ZWN0b3JzID0gZXJyOwotCi0JaWYgKGVyciA8IDApIHsKLQkJcGNpX2Rpc2FibGVfbXNpeChpb2FfY2ZnLT5wZGV2KTsKLQkJcmV0dXJuIGVycjsKKwl2ZWN0b3JzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGlvYV9jZmctPnBkZXYsCisJCQkJCWVudHJpZXMsIDEsIGlwcl9udW1iZXJfb2ZfbXNpeCk7CisJaWYgKHZlY3RvcnMgPCAwKSB7CisJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOworCQlyZXR1cm4gdmVjdG9yczsKIAl9CiAKLQlpZiAoIWVycikgewotCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yczsgaSsrKQotCQkJaW9hX2NmZy0+dmVjdG9yc19pbmZvW2ldLnZlYyA9IGVudHJpZXNbaV0udmVjdG9yOwotCQlpb2FfY2ZnLT5udmVjdG9ycyA9IHZlY3RvcnM7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JzOyBpKyspCisJCWlvYV9jZmctPnZlY3RvcnNfaW5mb1tpXS52ZWMgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwlpb2FfY2ZnLT5udmVjdG9ycyA9IHZlY3RvcnM7CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlwcl9lbmFibGVfbXNpKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKIHsKLQlpbnQgaSwgZXJyLCB2ZWN0b3JzOworCWludCBpLCB2ZWN0b3JzOwogCi0JdmVjdG9ycyA9IGlwcl9udW1iZXJfb2ZfbXNpeDsKLQotCXdoaWxlICgoZXJyID0gcGNpX2VuYWJsZV9tc2lfYmxvY2soaW9hX2NmZy0+cGRldiwgdmVjdG9ycykpID4gMCkKLQkJCXZlY3RvcnMgPSBlcnI7Ci0KLQlpZiAoZXJyIDwgMCkgewotCQlwY2lfZGlzYWJsZV9tc2koaW9hX2NmZy0+cGRldik7Ci0JCXJldHVybiBlcnI7CisJdmVjdG9ycyA9IHBjaV9lbmFibGVfbXNpX3JhbmdlKGlvYV9jZmctPnBkZXYsIDEsIGlwcl9udW1iZXJfb2ZfbXNpeCk7CisJaWYgKHZlY3RvcnMgPCAwKSB7CisJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOworCQlyZXR1cm4gdmVjdG9yczsKIAl9CiAKLQlpZiAoIWVycikgewotCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yczsgaSsrKQotCQkJaW9hX2NmZy0+dmVjdG9yc19pbmZvW2ldLnZlYyA9IGlvYV9jZmctPnBkZXYtPmlycSArIGk7Ci0JCWlvYV9jZmctPm52ZWN0b3JzID0gdmVjdG9yczsKLQl9CisJZm9yIChpID0gMDsgaSA8IHZlY3RvcnM7IGkrKykKKwkJaW9hX2NmZy0+dmVjdG9yc19pbmZvW2ldLnZlYyA9IGlvYV9jZmctPnBkZXYtPmlycSArIGk7CisJaW9hX2NmZy0+bnZlY3RvcnMgPSB2ZWN0b3JzOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbmFtZV9tc2lfdmVjdG9ycyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCkBAIC05MzU1LDcgKzk0NTEsNyBAQAogICogaXByX3Rlc3RfbXNpIC0gVGVzdCBmb3IgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKE1TSSkgc3VwcG9ydC4KICAqIEBwZGV2OgkJUENJIGRldmljZSBzdHJ1Y3QKICAqCi0gKiBEZXNjcmlwdGlvbjogVGhlIHJldHVybiB2YWx1ZSBmcm9tIHBjaV9lbmFibGVfbXNpKCkgY2FuIG5vdCBhbHdheXMgYmUKKyAqIERlc2NyaXB0aW9uOiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gcGNpX2VuYWJsZV9tc2lfcmFuZ2UoKSBjYW4gbm90IGFsd2F5cyBiZQogICogdHJ1c3RlZC4gIFRoaXMgcm91dGluZSBzZXRzIHVwIGFuZCBpbml0aWF0ZXMgYSB0ZXN0IGludGVycnVwdCB0byBkZXRlcm1pbmUKICAqIGlmIHRoZSBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQgdmlhIHRoZSBpcHJfdGVzdF9pbnRyKCkgc2VydmljZSByb3V0aW5lLgogICogSWYgdGhlIHRlc3RzIGZhaWxzLCB0aGUgZHJpdmVyIHdpbGwgZmFsbCBiYWNrIHRvIExTSS4KQEAgLTk0MzQsMTkgKzk1MzAsMTMgQEAKIAogCUVOVEVSOwogCi0JaWYgKChyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIGFkYXB0ZXJcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRm91bmQgSU9BIHdpdGggSVJROiAlZFxuIiwgcGRldi0+aXJxKTsKLQogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCppb2FfY2ZnKSk7CiAKIAlpZiAoIWhvc3QpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FsbCB0byBzY3NpX2hvc3RfYWxsb2MgZmFpbGVkIVxuIik7CiAJCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRfZGlzYWJsZTsKKwkJZ290byBvdXQ7CiAJfQogCiAJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilob3N0LT5ob3N0ZGF0YTsKQEAgLTk0NzYsNiArOTU2Niw4IEBACiAKIAlpb2FfY2ZnLT5yZXZpZCA9IHBkZXYtPnJldmlzaW9uOwogCisJaXByX2luaXRfaW9hX2NmZyhpb2FfY2ZnLCBob3N0LCBwZGV2KTsKKwogCWlwcl9yZWdzX3BjaSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAogCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBJUFJfTkFNRSk7CkBAIC05NDg1LDIyICs5NTc3LDM1IEBACiAJCWdvdG8gb3V0X3Njc2lfaG9zdF9wdXQ7CiAJfQogCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyYyB8fCBwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJCX0KKworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBlbmFibGUgYWRhcHRlclxuIik7CisJCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwkJfQorCX0KKwogCWlwcl9yZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCiAJaWYgKCFpcHJfcmVncykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiQ291bGRuJ3QgbWFwIG1lbW9yeSByYW5nZSBvZiByZWdpc3RlcnNcbiIpOwogCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwkJZ290byBvdXRfZGlzYWJsZTsKIAl9CiAKIAlpb2FfY2ZnLT5oZHdfZG1hX3JlZ3MgPSBpcHJfcmVnczsKIAlpb2FfY2ZnLT5oZHdfZG1hX3JlZ3NfcGNpID0gaXByX3JlZ3NfcGNpOwogCWlvYV9jZmctPmlvYV9tYWlsYm94ID0gaW9hX2NmZy0+Y2hpcF9jZmctPm1haWxib3ggKyBpcHJfcmVnczsKIAotCWlwcl9pbml0X2lvYV9jZmcoaW9hX2NmZywgaG9zdCwgcGRldik7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlpcHJfaW5pdF9yZWdzKGlvYV9jZmcpOwogCiAJaWYgKGlvYV9jZmctPnNpczY0KSB7CiAJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKQEAgLTk1MDgsNyArOTYxMyw2IEBACiAJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IDY0IGJpdCBQQ0kgRE1BIG1hc2tcbiIpOwogCQkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQl9Ci0KIAl9IGVsc2UKIAkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCkBAIC05NTIyLDEwICs5NjI2LDE1IEBACiAKIAlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyaXRlIG9mIGNhY2hlIGxpbmUgc2l6ZSBmYWlsZWRcbiIpOworCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKIAkJcmMgPSAtRUlPOwogCQlnb3RvIGNsZWFudXBfbm9tZW07CiAJfQogCisJLyogSXNzdWUgTU1JTyByZWFkIHRvIGVuc3VyZSBjYXJkIGlzIG5vdCBpbiBFRUggKi8KKwlpbnRlcnJ1cHRzID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKTsKKwlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwogCWlmIChpcHJfbnVtYmVyX29mX21zaXggPiBJUFJfTUFYX01TSVhfVkVDVE9SUykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUaGUgbWF4IG51bWJlciBvZiBNU0lYIGlzICVkXG4iLAogCQkJSVBSX01BWF9NU0lYX1ZFQ1RPUlMpOwpAQCAtOTU0NCwxMCArOTY1MywyMiBAQAogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBNU0kuXG4iKTsKIAl9CiAKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOworCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUocGRldikpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X21zaV9kaXNhYmxlOworCQl9CisJfQorCiAJaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSSB8fAogCSAgICBpb2FfY2ZnLT5pbnRyX2ZsYWcgPT0gSVBSX1VTRV9NU0lYKSB7CiAJCXJjID0gaXByX3Rlc3RfbXNpKGlvYV9jZmcsIHBkZXYpOwogCQlpZiAocmMgPT0gLUVPUE5PVFNVUFApIHsKKwkJCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOwogCQkJaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSSkgewogCQkJCWlvYV9jZmctPmludHJfZmxhZyAmPSB+SVBSX1VTRV9NU0k7CiAJCQkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwpAQCAtOTU3NywzMCArOTY5OCwxMiBAQAogCQkJCSh1bnNpZ25lZCBpbnQpbnVtX29ubGluZV9jcHVzKCksCiAJCQkJKHVuc2lnbmVkIGludClJUFJfTUFYX0hSUlFfTlVNKTsKIAotCS8qIFNhdmUgYXdheSBQQ0kgY29uZmlnIHNwYWNlIGZvciB1c2UgZm9sbG93aW5nIElPQSByZXNldCAqLwotCXJjID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0KLQlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSSBjb25maWcgc3BhY2VcbiIpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0X21zaV9kaXNhYmxlOwotCX0KLQogCWlmICgocmMgPSBpcHJfc2F2ZV9wY2l4X2NtZF9yZWcoaW9hX2NmZykpKQogCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKIAogCWlmICgocmMgPSBpcHJfc2V0X3BjaXhfY21kX3JlZyhpb2FfY2ZnKSkpCiAJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCi0JaWYgKGlvYV9jZmctPnNpczY0KQotCQlpb2FfY2ZnLT5jZmdfdGFibGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfaGRyNjQpCi0JCQkJKyAoKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeTY0KQotCQkJCSogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOwotCWVsc2UKLQkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcikKLQkJCQkrICgoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5KQotCQkJCSogaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkKSkpOwotCiAJcmMgPSBpcHJfYWxsb2NfbWVtKGlvYV9jZmcpOwogCWlmIChyYyA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LApAQCAtOTYwOCw2ICs5NzExLDE1IEBACiAJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCX0KIAorCS8qIFNhdmUgYXdheSBQQ0kgY29uZmlnIHNwYWNlIGZvciB1c2UgZm9sbG93aW5nIElPQSByZXNldCAqLworCXJjID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSSBjb25maWcgc3BhY2VcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gY2xlYW51cF9ub2xvZzsKKwl9CisKIAkvKgogCSAqIElmIEhSUlEgdXBkYXRlZCBpbnRlcnJ1cHQgaXMgbm90IG1hc2tlZCwgb3IgcmVzZXQgYWxlcnQgaXMgc2V0LAogCSAqIHRoZSBjYXJkIGlzIGluIGFuIHVua25vd24gc3RhdGUgYW5kIG5lZWRzIGEgaGFyZCByZXNldApAQCAtOTY2NCwxOCArOTc3NiwxOSBAQAogY2xlYW51cF9ub2xvZzoKIAlpcHJfZnJlZV9tZW0oaW9hX2NmZyk7CiBvdXRfbXNpX2Rpc2FibGU6CisJaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkoaW9hX2NmZyk7CiAJaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSSkKIAkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCWVsc2UgaWYgKGlvYV9jZmctPmludHJfZmxhZyA9PSBJUFJfVVNFX01TSVgpCiAJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CiBjbGVhbnVwX25vbWVtOgogCWlvdW5tYXAoaXByX3JlZ3MpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogb3V0X3JlbGVhc2VfcmVnaW9uczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogb3V0X3Njc2lfaG9zdF9wdXQ6CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKLW91dF9kaXNhYmxlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlnb3RvIG91dDsKIH0KIApAQCAtOTg1OSw4ICs5OTcyLDcgQEAKIAlpb2FfY2ZnLT5ob3N0LT5tYXhfY2hhbm5lbCA9IElQUl9WU0VUX0JVUzsKIAlpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ID0gaW9hX2NmZy0+Y2hpcF9jZmctPmlvcG9sbF93ZWlnaHQ7CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlmb3IgKGkgPSAxOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgewogCQkJYmxrX2lvcG9sbF9pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCwKIAkJCQkJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCwgaXByX2lvcG9sbCk7CkBAIC05ODg5LDggKzEwMDAxLDcgQEAKIAlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCAmJiBpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmCi0JCQlpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKKwlpZiAoaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJiBpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKIAkJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCA9IDA7CiAJCWZvciAoaSA9IDE7IGkgPCBpb2FfY2ZnLT5ocnJxX251bTsgaSsrKQogCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZpb2FfY2ZnLT5ocnJxW2ldLmlvcG9sbCk7CkBAIC05OTk0LDYgKzEwMTA1LDggQEAKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdEOSwgMCwgMCwgMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0RBLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3RUIsIDAsIDAsIDAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdFQywgMCwgMCwgMCB9LApAQCAtMTAwMDUsMTIgKzEwMTE4LDE5IEBACiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdFRiwgMCwgMCwgMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKIAkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0YwLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzJDQ0EsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfMkNEMiwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF8yQ0NELCAwLCAwLCAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlwcl9wY2lfdGFibGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBpcHJfZXJyX2hhbmRsZXIgPSB7CiAJLmVycm9yX2RldGVjdGVkID0gaXByX3BjaV9lcnJvcl9kZXRlY3RlZCwKKwkubW1pb19lbmFibGVkID0gaXByX3BjaV9tbWlvX2VuYWJsZWQsCiAJLnNsb3RfcmVzZXQgPSBpcHJfcGNpX3Nsb3RfcmVzZXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmggYi9kcml2ZXJzL3Njc2kvaXByLmgKaW5kZXggOWNlMzhhMi4uMzFlZDEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5oCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuaApAQCAtMTAxLDEyICsxMDEsMTYgQEAKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RDcgICAgMHgwM0ZGCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0Q4ICAgIDB4MDNGRQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdEOSAgICAweDA0NkQKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3REEgICAgMHgwNENBCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0VCICAgIDB4MDQ3NAogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdFQyAgICAweDA0NzUKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RUQgICAgMHgwNDk5CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0VFICAgIDB4MDQ5QQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdFRiAgICAweDA0OUIKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RjAgICAgMHgwNDlDCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF8yQ0NBCTB4MDRDNworI2RlZmluZSBJUFJfU1VCU19ERVZfSURfMkNEMgkweDA0QzgKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzJDQ0QJMHgwNEM5CiAjZGVmaW5lIElQUl9OQU1FCQkJCSJpcHIiCiAKIC8qCkBAIC0yMzAsNiArMjM0LDcgQEAKICNkZWZpbmUgSVBSX1dBSVRfRk9SX1JFU0VUX1RJTUVPVVQJCSgyICogSFopCiAjZGVmaW5lIElQUl9DSEVDS19GT1JfUkVTRVRfVElNRU9VVAkJKEhaIC8gMTApCiAjZGVmaW5lIElQUl9XQUlUX0ZPUl9CSVNUX1RJTUVPVVQJCSgyICogSFopCisjZGVmaW5lIElQUl9QQ0lfRVJST1JfUkVDT1ZFUllfVElNRU9VVAkoMTIwICogSFopCiAjZGVmaW5lIElQUl9QQ0lfUkVTRVRfVElNRU9VVAkJCShIWiAvIDIpCiAjZGVmaW5lIElQUl9TSVMzMl9EVU1QX1RJTUVPVVQJCQkoMTUgKiBIWikKICNkZWZpbmUgSVBSX1NJUzY0X0RVTVBfVElNRU9VVAkJCSg0MCAqIEhaKQpAQCAtODk3LDYgKzkwMiwxOCBAQAogCV9fYmUzMiBpb2FfZGF0YVsyMzZdOwogfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKIAorc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMjFfZXJyb3IgeworCV9fYmUzMiB3d25bNF07CisJdTggcmVzX3BhdGhbOF07CisJdTggcHJpbWFyeV9wcm9ibGVtX2Rlc2NbMzJdOworCXU4IHNlY29uZF9wcm9ibGVtX2Rlc2NbMzJdOworCV9fYmUzMiBzZW5zZV9kYXRhWzhdOworCV9fYmUzMiBjZGJbNF07CisJX19iZTMyIHJlc2lkdWFsX3RyYW5zX2xlbmd0aDsKKwlfX2JlMzIgbGVuZ3RoX29mX2Vycm9yOworCV9fYmUzMiBpb2FfZGF0YVsyMzZdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKwogc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDJfZXJyb3IgewogCXN0cnVjdCBpcHJfdnBkIGlvYV92cGQ7CiAJc3RydWN0IGlwcl92cGQgY2ZjX3ZwZDsKQEAgLTExMjYsNiArMTE0Myw3IEBACiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlX2ZmX2Vycm9yIHR5cGVfZmZfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzEyX2Vycm9yIHR5cGVfMTJfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzE3X2Vycm9yIHR5cGVfMTdfZXJyb3I7CisJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIxX2Vycm9yIHR5cGVfMjFfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIzX2Vycm9yIHR5cGVfMjNfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzI0X2Vycm9yIHR5cGVfMjRfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzMwX2Vycm9yIHR5cGVfMzBfZXJyb3I7CkBAIC0xMTY5LDYgKzExODcsNyBAQAogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8xNgkJCQkweDE2CiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzE3CQkJCTB4MTcKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjAJCQkJMHgyMAorI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yMQkJCQkweDIxCiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIzCQkJCTB4MjMKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjQJCQkJMHgyNAogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yNgkJCQkweDI2CkBAIC0xMjUyLDYgKzEyNzEsNyBAQAogCXU4IGFkZF90b19tbDoxOwogCXU4IGRlbF9mcm9tX21sOjE7CiAJdTggcmVzZXR0aW5nX2RldmljZToxOworCXU4IHJlc2V0X29jY3VycmVkOjE7CiAKIAl1MzIgYnVzOwkJLyogQUtBIGNoYW5uZWwgKi8KIAl1MzIgdGFyZ2V0OwkJLyogQUtBIGlkICovCkBAIC0xNDQxLDYgKzE0NjEsNyBAQAogCXU4IGR1bXBfdGltZW91dDoxOwogCXU4IGNmZ19sb2NrZWQ6MTsKIAl1OCBjbGVhcl9pc3I6MTsKKwl1OCBwcm9iZV9kb25lOjE7CiAKIAl1OCByZXZpZDsKIApAQCAtMTUxOSw2ICsxNTQwLDcgQEAKIAogCXdhaXRfcXVldWVfaGVhZF90IHJlc2V0X3dhaXRfcTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBtc2lfd2FpdF9xOworCXdhaXRfcXVldWVfaGVhZF90IGVlaF93YWl0X3E7CiAKIAlzdHJ1Y3QgaXByX2R1bXAgKmR1bXA7CiAJZW51bSBpcHJfc2R0X3N0YXRlIHNkdF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwppbmRleCBkMjVkMGQ4Li42OTViMzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCkBAIC02Niw3ICs2Niw3IEBACiAjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgogCiAjZGVmaW5lIE1BSiAxCi0jZGVmaW5lIE1JTiAxCisjZGVmaW5lIE1JTiAyCiAjZGVmaW5lIEJVSUxEIDAKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoTUFKKSAiLiIgX19zdHJpbmdpZnkoTUlOKSAiLiIgXAogCV9fc3RyaW5naWZ5KEJVSUxEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCmluZGV4IDk5ZDI5MzAuLjU2ZTM4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKQEAgLTI3MjMsMTMgKzI3MjMsOSBAQAogCW1lbWNweShyZXNwLT5lbmRpbmdfZmlzLCBmaXMsIHNpemVvZigqZmlzKSk7CiAJdHMtPmJ1Zl92YWxpZF9zaXplID0gc2l6ZW9mKCpyZXNwKTsKIAotCS8qIElmIHRoZSBkZXZpY2UgZmF1bHQgYml0IGlzIHNldCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCB0aGVuCi0JICogc2V0IHRoZSBzZW5zZSBkYXRhIGFuZCByZXR1cm4uCi0JICovCi0JaWYgKGZpcy0+c3RhdHVzICYgQVRBX0RGKQorCS8qIElmIGFuIGVycm9yIGlzIGZsYWdnZWQgbGV0IGxpYmF0YSBkZWNvZGUgdGhlIGZpcyAqLworCWlmIChhY19lcnJfbWFzayhmaXMtPnN0YXR1cykpCiAJCXRzLT5zdGF0ID0gU0FTX1BST1RPX1JFU1BPTlNFOwotCWVsc2UgaWYgKGZpcy0+c3RhdHVzICYgQVRBX0VSUikKLQkJdHMtPnN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJZWxzZQogCQl0cy0+c3RhdCA9IFNBTV9TVEFUX0dPT0Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV9ib290X3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfYm9vdF9zeXNmcy5jCmluZGV4IDE0YzFjOGYuLjY4MGJmNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV9ib290X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX2Jvb3Rfc3lzZnMuYwpAQCAtNDkwLDUgKzQ5MCw2IEBACiAJCWlzY3NpX2Jvb3RfcmVtb3ZlX2tvYmooYm9vdF9rb2JqKTsKIAogCWtzZXRfdW5yZWdpc3Rlcihib290X2tzZXQtPmtzZXQpOworCWtmcmVlKGJvb3Rfa3NldCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9ib290X2Rlc3Ryb3lfa3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKaW5kZXggYWRkNmQxNS4uYmZiNmQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwpAQCAtNTkzLDkgKzU5Myw5IEBACiAJaXNjc2lfc3dfdGNwX2Nvbm5fcmVzdG9yZV9jYWxsYmFja3MoY29ubik7CiAJc29ja19wdXQoc29jay0+c2spOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJdGNwX3N3X2Nvbm4tPnNvY2sgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlzb2NrZmRfcHV0KHNvY2spOwogfQogCkBAIC02NjMsMTAgKzY2MywxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9zb2NrZXQ7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKiBiaW5kIGlTQ1NJIGNvbm5lY3Rpb24gYW5kIHNvY2tldCAqLwogCXRjcF9zd19jb25uLT5zb2NrID0gc29jazsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAkvKiBzZXR1cCBTb2NrZXQgcGFyYW1ldGVycyAqLwogCXNrID0gc29jay0+c2s7CkBAIC03MjYsMTQgKzcyNiwxNCBAQAogCXN3aXRjaChwYXJhbSkgewogCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgogCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgotCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmICghdGNwX3N3X2Nvbm4gfHwgIXRjcF9zd19jb25uLT5zb2NrKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCXJldHVybiAtRU5PVENPTk47CiAJCX0KIAkJcmMgPSBrZXJuZWxfZ2V0cGVlcm5hbWUodGNwX3N3X2Nvbm4tPnNvY2ssCiAJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmxlbik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIApAQCAtNzU5LDIzICs3NTksMjYgQEAKIAogCXN3aXRjaCAocGFyYW0pIHsKIAljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTOgotCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlpZiAoIXNlc3Npb24pCisJCQlyZXR1cm4gLUVOT1RDT05OOworCisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJY29ubiA9IHNlc3Npb24tPmxlYWRjb25uOwogCQlpZiAoIWNvbm4pIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQkJcmV0dXJuIC1FTk9UQ09OTjsKIAkJfQogCQl0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CiAKIAkJdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKIAkJaWYgKCF0Y3Bfc3dfY29ubi0+c29jaykgewotCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCQlyZXR1cm4gLUVOT1RDT05OOwogCQl9CiAKIAkJcmMgPSBrZXJuZWxfZ2V0c29ja25hbWUodGNwX3N3X2Nvbm4tPnNvY2ssCiAJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmxlbik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwppbmRleCA0MDQ2MjQxLi41Yjg2MDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwpAQCAtMTEwLDE2ICsxMTAsOCBAQAogCQlzZXNzaW9uLT5leHBfY21kc24gPSBleHBfY21kc247CiAKIAlpZiAobWF4X2NtZHNuICE9IHNlc3Npb24tPm1heF9jbWRzbiAmJgotCSAgICAhaXNjc2lfc25hX2x0KG1heF9jbWRzbiwgc2Vzc2lvbi0+bWF4X2NtZHNuKSkgeworCSAgICAhaXNjc2lfc25hX2x0KG1heF9jbWRzbiwgc2Vzc2lvbi0+bWF4X2NtZHNuKSkKIAkJc2Vzc2lvbi0+bWF4X2NtZHNuID0gbWF4X2NtZHNuOwotCQkvKgotCQkgKiBpZiB0aGUgd2luZG93IGNsb3NlZCB3aXRoIElPIHF1ZXVlZCwgdGhlbiBraWNrIHRoZQotCQkgKiB4bWl0IHRocmVhZAotCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZzZXNzaW9uLT5sZWFkY29ubi0+Y21kcXVldWUpIHx8Ci0JCSAgICAhbGlzdF9lbXB0eSgmc2Vzc2lvbi0+bGVhZGNvbm4tPm1nbXRxdWV1ZSkpCi0JCQlpc2NzaV9jb25uX3F1ZXVlX3dvcmsoc2Vzc2lvbi0+bGVhZGNvbm4pOwotCX0KIH0KIAogdm9pZCBpc2NzaV91cGRhdGVfY21kc24oc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBpc2NzaV9ub3BpbiAqaGRyKQpAQCAtNDgxLDcgKzQ3Myw3IEBACiAgKiBpc2NzaV9mcmVlX3Rhc2sgLSBmcmVlIGEgdGFzawogICogQHRhc2s6IGlzY3NpIGNtZCB0YXNrCiAgKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzZXNzaW9uIGxvY2suCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gYmFja19sb2NrLgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzY3NpIGNvbW1hbmQgdG8gc2NzaS1tbCBvciBjbGVhbnMKICAqIHVwIG1nbXQgdGFza3MgdGhlbiByZXR1cm5zIHRoZSB0YXNrIHRvIHRoZSBwb29sLgogICovCkBAIC01MzUsOSArNTI3LDEwIEBACiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSB0YXNrLT5jb25uLT5zZXNzaW9uOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkvKiByZWd1bGFyIFJYIHBhdGggdXNlcyBiYWNrX2xvY2sgKi8KKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJX19pc2NzaV9wdXRfdGFzayh0YXNrKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9wdXRfdGFzayk7CiAKQEAgLTU0Niw3ICs1MzksNyBAQAogICogQHRhc2s6IGlzY3NpIGNtZCB0YXNrCiAgKiBAc3RhdGU6IHN0YXRlIHRvIGNvbXBsZXRlIHRhc2sgd2l0aAogICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2Vzc2lvbiBsb2NrLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzZXNzaW9uIGJhY2tfbG9jay4KICAqLwogc3RhdGljIHZvaWQgaXNjc2lfY29tcGxldGVfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgaW50IHN0YXRlKQogewpAQCAtNTg1LDcgKzU3OCw3IEBACiAgKiBUaGlzIGlzIHVzZWQgd2hlbiBkcml2ZXJzIGRvIG5vdCBuZWVkIG9yIGNhbm5vdCBwZXJmb3JtCiAgKiBsb3dlciBsZXZlbCBwZHUgcHJvY2Vzc2luZy4KICAqCi0gKiBDYWxsZWQgd2l0aCBzZXNzaW9uIGxvY2sKKyAqIENhbGxlZCB3aXRoIHNlc3Npb24gYmFja19sb2NrCiAgKi8KIHZvaWQgaXNjc2lfY29tcGxldGVfc2NzaV90YXNrKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLAogCQkJICAgICAgdWludDMyX3QgZXhwX2NtZHNuLCB1aW50MzJfdCBtYXhfY21kc24pCkBAIC02MDIsNyArNTk1LDcgQEAKIAogCiAvKgotICogc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZCBhbmQgaWYgbm90IGNhbGxlZCBmb3IgYSB0YXNrIHRoYXQgaXMKKyAqIHNlc3Npb24gYmFja19sb2NrIG11c3QgYmUgaGVsZCBhbmQgaWYgbm90IGNhbGxlZCBmb3IgYSB0YXNrIHRoYXQgaXMKICAqIHN0aWxsIHBlbmRpbmcgb3IgZnJvbSB0aGUgeG1pdCB0aHJlYWQsIHRoZW4geG1pdCB0aHJlYWQgbXVzdAogICogYmUgc3VzcGVuZGVkLgogICovCkBAIC02NDIsNyArNjM1LDEwIEBACiAJCXNjc2lfaW4oc2MpLT5yZXNpZCA9IHNjc2lfaW4oc2MpLT5sZW5ndGg7CiAJfQogCisJLyogcmVndWxhciBSWCBwYXRoIHVzZXMgYmFja19sb2NrICovCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCWlzY3NpX2NvbXBsZXRlX3Rhc2sodGFzaywgc3RhdGUpOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiBzdGF0aWMgaW50IGlzY3NpX3ByZXBfbWdtdF90YXNrKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLApAQCAtNzgwLDcgKzc3NiwxMCBAQAogCXJldHVybiB0YXNrOwogCiBmcmVlX3Rhc2s6CisJLyogcmVndWxhciBSWCBwYXRoIHVzZXMgYmFja19sb2NrICovCisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCV9faXNjc2lfcHV0X3Rhc2sodGFzayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTc5MSwxMCArNzkwLDEwIEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCWludCBlcnIgPSAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFfX2lzY3NpX2Nvbm5fc2VuZF9wZHUoY29ubiwgaGRyLCBkYXRhLCBkYXRhX3NpemUpKQogCQllcnIgPSAtRVBFUk07Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jb25uX3NlbmRfcGR1KTsKQEAgLTEwMTMsMTMgKzEwMTIsMTMgQEAKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCiAJCQkJICAicGR1IChvcCAweCV4IGl0dCAweCV4KSByZWplY3RlZCAiCiAJCQkJICAiZHVlIHRvIERhdGFEaWdlc3QgZXJyb3IuXG4iLAotCQkJCSAgcmVqZWN0ZWRfcGR1Lml0dCwgb3Bjb2RlKTsKKwkJCQkgIG9wY29kZSwgcmVqZWN0ZWRfcGR1Lml0dCk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfUkVBU09OX0lNTV9DTURfUkVKRUNUOgogCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKIAkJCQkgICJwZHUgKG9wIDB4JXggaXR0IDB4JXgpIHJlamVjdGVkLiBUb28gbWFueSAiCiAJCQkJICAiaW1tZWRpYXRlIGNvbW1hbmRzLlxuIiwKLQkJCQkgIHJlamVjdGVkX3BkdS5pdHQsIG9wY29kZSk7CisJCQkJICBvcGNvZGUsIHJlamVjdGVkX3BkdS5pdHQpOwogCQkvKgogCQkgKiBXZSBvbmx5IHNlbmQgb25lIFRNRiBhdCBhIHRpbWUgc28gaWYgdGhlIHRhcmdldCBjb3VsZCBub3QKIAkJICogaGFuZGxlIGl0LCB0aGVuIGl0IHNob3VsZCBnZXQgZml4ZWQgKFJGQyBtYW5kYXRlcyB0aGF0CkBAIC0xMDMxLDE0ICsxMDMwLDE5IEBACiAJCWlmIChvcGNvZGUgIT0gSVNDU0lfT1BfTk9PUF9PVVQpCiAJCQlyZXR1cm4gMDsKIAotCQkgaWYgKHJlamVjdGVkX3BkdS5pdHQgPT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkKKwkJIGlmIChyZWplY3RlZF9wZHUuaXR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpIHsKIAkJCS8qCiAJCQkgKiBub3Atb3V0IGluIHJlc3BvbnNlIHRvIHRhcmdldCdzIG5vcC1vdXQgcmVqZWN0ZWQuCiAJCQkgKiBKdXN0IHJlc2VuZC4KIAkJCSAqLworCQkJLyogSW4gUlggcGF0aCB3ZSBhcmUgdW5kZXIgYmFjayBsb2NrICovCisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKKwkJCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCWlzY3NpX3NlbmRfbm9wb3V0KGNvbm4sCiAJCQkJCSAgKHN0cnVjdCBpc2NzaV9ub3BpbiopJnJlamVjdGVkX3BkdSk7Ci0JCWVsc2UgeworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CisJCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CisJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKIAkJCS8qCiAJCQkgKiBPdXIgbm9wIGFzIHBpbmcgZ290IGRyb3BwZWQuIFdlIGtub3cgdGhlIHRhcmdldApAQCAtMTA1OSw4ICsxMDYzLDggQEAKIAlkZWZhdWx0OgogCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKIAkJCQkgICJwZHUgKG9wIDB4JXggaXR0IDB4JXgpIHJlamVjdGVkLiBSZWFzb24gIgotCQkJCSAgImNvZGUgMHgleFxuIiwgcmVqZWN0ZWRfcGR1Lml0dCwKLQkJCQkgIHJlamVjdGVkX3BkdS5vcGNvZGUsIHJlamVjdC0+cmVhc29uKTsKKwkJCQkgICJjb2RlIDB4JXhcbiIsIHJlamVjdGVkX3BkdS5vcGNvZGUsCisJCQkJICByZWplY3RlZF9wZHUuaXR0LCByZWplY3QtPnJlYXNvbik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmM7CkBAIC0xMDc0LDcgKzEwNzgsNyBAQAogICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgbWdtdCB0YXNrcyBsaWtlIGxvZ2luIGFuZCBub3BzLCBvciBpZgogICogdGhlIExERCdzIGl0dCBzcGFjZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzZXNzaW9uIGFnZS4KICAqCi0gKiBUaGUgc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZC4KKyAqIFRoZSBzZXNzaW9uIGJhY2tfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KIHN0cnVjdCBpc2NzaV90YXNrICppc2NzaV9pdHRfdG9fdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgaXR0X3QgaXR0KQogewpAQCAtMTEwMyw3ICsxMTA3LDcgQEAKICAqIEBkYXRhbGVuOiBsZW4gb2YgZGF0YSBidWZmZXIKICAqCiAgKiBDb21wbGV0ZXMgcGR1IHByb2Nlc3NpbmcgYnkgZnJlZWluZyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBhdAotICogcXVldWVjb21tYW5kIG9yIHNlbmQgZ2VuZXJpYy4gc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZCBhbmQgdmVyaWZ5CisgKiBxdWV1ZWNvbW1hbmQgb3Igc2VuZCBnZW5lcmljLiBzZXNzaW9uIGJhY2tfbG9jayBtdXN0IGJlIGhlbGQgYW5kIHZlcmlmeQogICogaXR0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KICAqLwogaW50IF9faXNjc2lfY29tcGxldGVfcGR1KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfaGRyICpoZHIsCkBAIC0xMTQwLDcgKzExNDQsMTIgQEAKIAkJCWlmIChoZHItPnR0dCA9PSBjcHVfdG9fYmUzMihJU0NTSV9SRVNFUlZFRF9UQUcpKQogCQkJCWJyZWFrOwogCisJCQkvKiBJbiBSWCBwYXRoIHdlIGFyZSB1bmRlciBiYWNrIGxvY2sgKi8KKwkJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOworCQkJc3Bpbl9sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQkJaXNjc2lfc2VuZF9ub3BvdXQoY29ubiwgKHN0cnVjdCBpc2NzaV9ub3BpbiopaGRyKTsKKwkJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOworCQkJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfUkVKRUNUOgogCQkJcmMgPSBpc2NzaV9oYW5kbGVfcmVqZWN0KGNvbm4sIGhkciwgZGF0YSwgZGF0YWxlbik7CkBAIC0xMjQ3LDkgKzEyNTYsOSBAQAogewogCWludCByYzsKIAotCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCXJjID0gX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBkYXRhLCBkYXRhbGVuKTsKLQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY29tcGxldGVfcGR1KTsKQEAgLTEyOTMsNyArMTMwMiw3IEBACiAgKgogICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgY21kIHRhc2tzLgogICoKLSAqIFRoZSBzZXNzaW9uIGxvY2sgbXVzdCBiZSBoZWxkLgorICogVGhlIHNlc3Npb24gYmFja19sb2NrIG11c3QgYmUgaGVsZC4KICAqLwogc3RydWN0IGlzY3NpX3Rhc2sgKmlzY3NpX2l0dF90b19jdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgaXR0X3QgaXR0KQogewpAQCAtMTMyMywxNSArMTMzMiwxNSBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfVEVSTUlOQVRFIHx8ICFjb25uKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlkZXYgPSBnZXRfZGV2aWNlKCZjb25uLT5jbHNfY29ubi0+ZGV2KTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFkZXYpCiAJICAgICAgICByZXR1cm47CiAJLyoKQEAgLTEzNTEsMTUgKzEzNjAsMTUgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfRkFJTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoY29ubi0+c3RvcF9zdGFnZSA9PSAwKQogCQlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX0ZBSUxFRDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlzZXRfYml0KElTQ1NJX1NVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF90eCk7CiAJc2V0X2JpdChJU0NTSV9TVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfcngpOwpAQCAtMTM5MywxNSArMTQwMiwxOCBAQAogCQlyZXR1cm4gLUVOT0RBVEE7CiAKIAlfX2lzY3NpX2dldF90YXNrKHRhc2spOwotCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyYyA9IGNvbm4tPnNlc3Npb24tPnR0LT54bWl0X3Rhc2sodGFzayk7Ci0Jc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFyYykgewogCQkvKiBkb25lIHdpdGggdGhpcyB0YXNrICovCiAJCXRhc2stPmxhc3RfeGZlciA9IGppZmZpZXM7CiAJCWNvbm4tPnRhc2sgPSBOVUxMOwogCX0KKwkvKiByZWd1bGFyIFJYIHBhdGggdXNlcyBiYWNrX2xvY2sgKi8KKwlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJX19pc2NzaV9wdXRfdGFzayh0YXNrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0MTAsNyArMTQyMiw3IEBACiAgKiBAdGFzazogdGFzayB0byByZXF1ZXVlCiAgKgogICogTExEcyB0aGF0IG5lZWQgdG8gcnVuIGEgdGFzayBmcm9tIHRoZSBzZXNzaW9uIHdvcmtxdWV1ZSBzaG91bGQgY2FsbAotICogdGhpcy4gVGhlIHNlc3Npb24gbG9jayBtdXN0IGJlIGhlbGQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgKiB0aGlzLiBUaGUgc2Vzc2lvbiBmcndkX2xvY2sgbXVzdCBiZSBoZWxkLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICogYnkgc29mdHdhcmUgZHJpdmVycy4KICAqLwogdm9pZCBpc2NzaV9yZXF1ZXVlX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCkBAIC0xNDQxLDEwICsxNDUzLDEwIEBACiAJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAJaW50IHJjID0gMDsKIAotCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICh0ZXN0X2JpdChJU0NTSV9TVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfdHgpKSB7CiAJCUlTQ1NJX0RCR19TRVNTSU9OKGNvbm4tPnNlc3Npb24sICJUeCBzdXNwZW5kZWQhXG4iKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIC1FTk9EQVRBOwogCX0KIApAQCAtMTQ2NSw3ICsxNDc3LDEwIEBACiAJCQkJCSBzdHJ1Y3QgaXNjc2lfdGFzaywgcnVubmluZyk7CiAJCWxpc3RfZGVsX2luaXQoJmNvbm4tPnRhc2stPnJ1bm5pbmcpOwogCQlpZiAoaXNjc2lfcHJlcF9tZ210X3Rhc2soY29ubiwgY29ubi0+dGFzaykpIHsKKwkJCS8qIHJlZ3VsYXIgUlggcGF0aCB1c2VzIGJhY2tfbG9jayAqLworCQkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJX19pc2NzaV9wdXRfdGFzayhjb25uLT50YXNrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJY29ubi0+dGFzayA9IE5VTEw7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTUyNywxMSArMTU0MiwxMSBAQAogCQlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPm1nbXRxdWV1ZSkpCiAJCQlnb3RvIGNoZWNrX21nbXQ7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyZXR1cm4gLUVOT0RBVEE7CiAKIGRvbmU6Ci0Jc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCXJldHVybiByYzsKIH0KIApAQCAtMTYwMCw3ICsxNjE1LDcgQEAKIAogCWNsc19zZXNzaW9uID0gc3RhcmdldF90b19zZXNzaW9uKHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKIAlzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlyZWFzb24gPSBpc2NzaV9zZXNzaW9uX2Noa3JlYWR5KGNsc19zZXNzaW9uKTsKIAlpZiAocmVhc29uKSB7CkBAIC0xNjg2LDEzICsxNzAxLDEzIEBACiAJfQogCiAJc2Vzc2lvbi0+cXVldWVkX2NtZHNuKys7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXJldHVybiAwOwogCiBwcmVwZF9yZWplY3Q6CiAJaXNjc2lfY29tcGxldGVfdGFzayh0YXNrLCBJU0NTSV9UQVNLX1JFUVVFVUVfU0NTSVEpOwogcmVqZWN0OgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlJU0NTSV9EQkdfU0VTU0lPTihzZXNzaW9uLCAiY21kIDB4JXggcmVqZWN0ZWQgKCVkKVxuIiwKIAkJCSAgc2MtPmNtbmRbMF0sIHJlYXNvbik7CiAJcmV0dXJuIFNDU0lfTUxRVUVVRV9UQVJHRVRfQlVTWTsKQEAgLTE3MDAsNyArMTcxNSw3IEBACiBwcmVwZF9mYXVsdDoKIAlpc2NzaV9jb21wbGV0ZV90YXNrKHRhc2ssIElTQ1NJX1RBU0tfUkVRVUVVRV9TQ1NJUSk7CiBmYXVsdDoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJSVNDU0lfREJHX1NFU1NJT04oc2Vzc2lvbiwgImlzY3NpOiBjbWQgMHgleCBpcyBub3QgcXVldWVkICglZClcbiIsCiAJCQkgIHNjLT5jbW5kWzBdLCByZWFzb24pOwogCWlmICghc2NzaV9iaWRpX2NtbmQoc2MpKQpAQCAtMTc0OCwxNCArMTc2MywxNCBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gKHN0cnVjdCBpc2NzaV9jb25uICopZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoY29ubi0+dG1mX3N0YXRlID09IFRNRl9RVUVVRUQpIHsKIAkJY29ubi0+dG1mX3N0YXRlID0gVE1GX1RJTUVET1VUOwogCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInRtZiB0aW1lZG91dFxuIik7CiAJCS8qIHVuYmxvY2sgZWhfYWJvcnQoKSAqLwogCQl3YWtlX3VwKCZjb25uLT5laHdhaXQpOwogCX0KLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgaXNjc2lfZXhlY190YXNrX21nbXRfZm4oc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sCkBAIC0xNzY4LDEwICsxNzgzLDEwIEBACiAJdGFzayA9IF9faXNjc2lfY29ubl9zZW5kX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKWhkciwKIAkJCQkgICAgICBOVUxMLCAwKTsKIAlpZiAoIXRhc2spIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJDb3VsZCBub3Qgc2VuZCBUTUYuXG4iKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7Ci0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJY29ubi0+dG1mY21kX3BkdXNfY250Kys7CkBAIC0xNzgxLDcgKzE3OTYsNyBAQAogCWFkZF90aW1lcigmY29ubi0+dG1mX3RpbWVyKTsKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInRtZiBzZXQgdGltZW91dFxuIik7CiAKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAKIAkvKgpAQCAtMTgwMCw3ICsxODE1LDcgQEAKIAlkZWxfdGltZXJfc3luYygmY29ubi0+dG1mX3RpbWVyKTsKIAogCW11dGV4X2xvY2soJnNlc3Npb24tPmVoX211dGV4KTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKiBpZiB0aGUgc2Vzc2lvbiBkcm9wcyBpdCB3aWxsIGNsZWFuIHVwIHRoZSB0YXNrICovCiAJaWYgKGFnZSAhPSBzZXNzaW9uLT5hZ2UgfHwKIAkgICAgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKQpAQCAtMTgzNyw3ICsxODUyLDcgQEAKICAqIGlzY3NpX3N1c3BlbmRfcXVldWUgLSBzdXNwZW5kIGlzY3NpX3F1ZXVlY29tbWFuZAogICogQGNvbm46IGlzY3NpIGNvbm4gdG8gc3RvcCBxdWV1ZWluZyBJTyBvbgogICoKLSAqIFRoaXMgZ3JhYnMgdGhlIHNlc3Npb24gbG9jayB0byBtYWtlIHN1cmUgbm8gb25lIGlzIGluCisgKiBUaGlzIGdyYWJzIHRoZSBzZXNzaW9uIGZyd2RfbG9jayB0byBtYWtlIHN1cmUgbm8gb25lIGlzIGluCiAgKiB4bWl0X3Rhc2svcXVldWVjb21tYW5kLCBhbmQgdGhlbiBzZXRzIHN1c3BlbmQgdG8gcHJldmVudAogICogbmV3IGNvbW1hbmRzIGZyb20gYmVpbmcgcXVldWVkLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkCiAgKiBieSBvZmZsb2FkIGRyaXZlcnMgdGhhdCBuZWVkIHRvIHN5bmMgYSBwYXRoIGxpa2UgZXAgZGlzY29ubmVjdApAQCAtMTg0Niw5ICsxODYxLDkgQEAKICAqLwogdm9pZCBpc2NzaV9zdXNwZW5kX3F1ZXVlKHN0cnVjdCBpc2NzaV9jb25uICpjb25uKQogewotCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCXNldF9iaXQoSVNDU0lfU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3R4KTsKLQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zdXNwZW5kX3F1ZXVlKTsKIApAQCAtMTkwNyw3ICsxOTIyLDcgQEAKIAogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAic2NzaSBjbWQgJXAgdGltZWRvdXRcbiIsIHNjKTsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXRhc2sgPSAoc3RydWN0IGlzY3NpX3Rhc2sgKilzYy0+U0NwLnB0cjsKIAlpZiAoIXRhc2spIHsKIAkJLyoKQEAgLTIwMjEsNyArMjAzNiw3IEBACiBkb25lOgogCWlmICh0YXNrKQogCQl0YXNrLT5sYXN0X3RpbWVvdXQgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInJldHVybiAlc1xuIiwgcmMgPT0gQkxLX0VIX1JFU0VUX1RJTUVSID8KIAkJICAgICAidGltZXIgcmVzZXQiIDogIm5oIik7CiAJcmV0dXJuIHJjOwpAQCAtMjAzMyw3ICsyMDQ4LDcgQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAJdW5zaWduZWQgbG9uZyByZWN2X3RpbWVvdXQsIG5leHRfdGltZW91dCA9IDAsIGxhc3RfcmVjdjsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmIChzZXNzaW9uLT5zdGF0ZSAhPSBJU0NTSV9TVEFURV9MT0dHRURfSU4pCiAJCWdvdG8gZG9uZTsKIApAQCAtMjA1MCw3ICsyMDY1LDcgQEAKIAkJCQkgICJsYXN0IHBpbmcgJWx1LCBub3cgJWx1XG4iLAogCQkJCSAgY29ubi0+cGluZ190aW1lb3V0LCBjb25uLT5yZWN2X3RpbWVvdXQsCiAJCQkJICBsYXN0X3JlY3YsIGNvbm4tPmxhc3RfcGluZywgamlmZmllcyk7Ci0JCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCQlyZXR1cm47CiAJfQpAQCAtMjA2Niw3ICsyMDgxLDcgQEAKIAlJU0NTSV9EQkdfQ09OTihjb25uLCAiU2V0dGluZyBuZXh0IHRtbyAlbHVcbiIsIG5leHRfdGltZW91dCk7CiAJbW9kX3RpbWVyKCZjb25uLT50cmFuc3BvcnRfdGltZXIsIG5leHRfdGltZW91dCk7CiBkb25lOgotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaXNjc2lfcHJlcF9hYm9ydF90YXNrX3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywKQEAgLTIwOTYsNyArMjExMSw3IEBACiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJhYm9ydGluZyBzYyAlcFxuIiwgc2MpOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCS8qCiAJICogaWYgc2Vzc2lvbiB3YXMgSVNDU0lfU1RBVEVfSU5fUkVDT1ZFUlkgdGhlbiB3ZSBtYXkgbm90IGhhdmUKIAkgKiBnb3QgdGhlIGNvbW1hbmQuCkBAIC0yMTA0LDcgKzIxMTksNyBAQAogCWlmICghc2MtPlNDcC5wdHIpIHsKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sICJzYyBuZXZlciByZWFjaGVkIGlzY3NpIGxheWVyIG9yICIKIAkJCQkgICAgICAiaXQgY29tcGxldGVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CkBAIC0yMTE1LDcgKzIxMzAsNyBAQAogCSAqLwogCWlmICghc2Vzc2lvbi0+bGVhZGNvbm4gfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOIHx8CiAJICAgIHNjLT5TQ3AucGhhc2UgIT0gc2Vzc2lvbi0+YWdlKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgImZhaWxpbmcgYWJvcnQgZHVlIHRvIGRyb3BwZWQgIgogCQkJCSAgInNlc3Npb24uXG4iKTsKQEAgLTIxNTYsNyArMjE3MSw3IEBACiAKIAlzd2l0Y2ggKGNvbm4tPnRtZl9zdGF0ZSkgewogCWNhc2UgVE1GX1NVQ0NFU1M6Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCS8qCiAJCSAqIHN0b3AgdHggc2lkZSBpbmNhc2UgdGhlIHRhcmdldCBoYWQgc2VudCBhIGFib3J0IHJzcCBidXQKIAkJICogdGhlIGluaXRpYXRvciB3YXMgc3RpbGwgd3JpdGluZyBvdXQgZGF0YS4KQEAgLTIxNjcsMTUgKzIxODIsMTUgQEAKIAkJICogZ29vZCBhbmQgaGF2ZSBuZXZlciBzZW50IHVzIGEgc3VjY2Vzc2Z1bCB0bWYgcmVzcG9uc2UKIAkJICogdGhlbiBzZW50IG1vcmUgZGF0YSBmb3IgdGhlIGNtZC4KIAkJICovCi0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJZmFpbF9zY3NpX3Rhc2sodGFzaywgRElEX0FCT1JUKTsKIAkJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7CiAJCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX3N0YXJ0X3R4KGNvbm4pOwogCQlnb3RvIHN1Y2Nlc3NfdW5sb2NrZWQ7CiAJY2FzZSBUTUZfVElNRURPVVQ6Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfU0NTSV9FSF9TRVNTSU9OX1JTVCk7CiAJCWdvdG8gZmFpbGVkX3VubG9ja2VkOwogCWNhc2UgVE1GX05PVF9GT1VORDoKQEAgLTIxOTQsNyArMjIwOSw3IEBACiAJfQogCiBzdWNjZXNzOgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIHN1Y2Nlc3NfdW5sb2NrZWQ6CiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJhYm9ydCBzdWNjZXNzIFtzYyAlcCBpdHQgMHgleF1cbiIsCiAJCSAgICAgc2MsIHRhc2stPml0dCk7CkBAIC0yMjAyLDcgKzIyMTcsNyBAQAogCXJldHVybiBTVUNDRVNTOwogCiBmYWlsZWQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogZmFpbGVkX3VubG9ja2VkOgogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAiYWJvcnQgZmFpbGVkIFtzYyAlcCBpdHQgMHgleF1cbiIsIHNjLAogCQkgICAgIHRhc2sgPyB0YXNrLT5pdHQgOiAwKTsKQEAgLTIyMzUsNyArMjI1MCw3IEBACiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJMVSBSZXNldCBbc2MgJXAgbHVuICV1XVxuIiwgc2MsIHNjLT5kZXZpY2UtPmx1bik7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyoKIAkgKiBKdXN0IGNoZWNrIGlmIHdlIGFyZSBub3QgbG9nZ2VkIGluLiBXZSBjYW5ub3QgY2hlY2sgZm9yCiAJICogdGhlIHBoYXNlIGJlY2F1c2UgdGhlIHJlc2V0IGNvdWxkIGNvbWUgZnJvbSBhIGlvY3RsLgpAQCAtMjI2Miw3ICsyMjc3LDcgQEAKIAljYXNlIFRNRl9TVUNDRVNTOgogCQlicmVhazsKIAljYXNlIFRNRl9USU1FRE9VVDoKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9TQ1NJX0VIX1NFU1NJT05fUlNUKTsKIAkJZ290byBkb25lOwogCWRlZmF1bHQ6CkBAIC0yMjcxLDIxICsyMjg2LDIxIEBACiAJfQogCiAJcmMgPSBTVUNDRVNTOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwogCWZhaWxfc2NzaV90YXNrcyhjb25uLCBzYy0+ZGV2aWNlLT5sdW4sIERJRF9FUlJPUik7CiAJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJaXNjc2lfc3RhcnRfdHgoY29ubik7CiAJZ290byBkb25lOwogCiB1bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogZG9uZToKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgImRldiByZXNldCByZXN1bHQgPSAlc1xuIiwKIAkJICAgICByYyA9PSBTVUNDRVNTID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpOwpAQCAtMjI5OCwxMyArMjMxMywxMyBAQAogewogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7CiAJCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU1RBVEVfUkVDT1ZFUllfRkFJTEVEOwogCQlpZiAoc2Vzc2lvbi0+bGVhZGNvbm4pCiAJCQl3YWtlX3VwKCZzZXNzaW9uLT5sZWFkY29ubi0+ZWh3YWl0KTsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCk7CiAKQEAgLTIzMjYsMTkgKzIzNDEsMTkgQEAKIAljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX1RFUk1JTkFURSkgewogZmFpbGVkOgogCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwKIAkJCSAgICAgImZhaWxpbmcgc2Vzc2lvbiByZXNldDogQ291bGQgbm90IGxvZyBiYWNrIGludG8gIgogCQkJICAgICAiJXMsICVzIFthZ2UgJWRdXG4iLCBzZXNzaW9uLT50YXJnZXRuYW1lLAogCQkJICAgICBjb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MsIHNlc3Npb24tPmFnZSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAkvKgogCSAqIHdlIGRyb3AgdGhlIGxvY2sgaGVyZSBidXQgdGhlIGxlYWRjb25uIGNhbm5vdCBiZSBkZXN0b3llZCB3aGlsZQpAQCAtMjM1NSwxNCArMjM3MCwxNCBAQAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHRURfSU4pIHsKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sCiAJCQkgICAgICJzZXNzaW9uIHJlc2V0IHN1Y2NlZWRlZCBmb3IgJXMsJXNcbiIsCiAJCQkgICAgIHNlc3Npb24tPnRhcmdldG5hbWUsIGNvbm4tPnBlcnNpc3RlbnRfYWRkcmVzcyk7CiAJfSBlbHNlCiAJCWdvdG8gZmFpbGVkOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KQEAgLTIzOTgsNyArMjQxMyw3IEBACiAJCSAgICAgc2Vzc2lvbi0+dGFyZ2V0bmFtZSk7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyoKIAkgKiBKdXN0IGNoZWNrIGlmIHdlIGFyZSBub3QgbG9nZ2VkIGluLiBXZSBjYW5ub3QgY2hlY2sgZm9yCiAJICogdGhlIHBoYXNlIGJlY2F1c2UgdGhlIHJlc2V0IGNvdWxkIGNvbWUgZnJvbSBhIGlvY3RsLgpAQCAtMjQyNSw3ICsyNDQwLDcgQEAKIAljYXNlIFRNRl9TVUNDRVNTOgogCQlicmVhazsKIAljYXNlIFRNRl9USU1FRE9VVDoKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9TQ1NJX0VIX1NFU1NJT05fUlNUKTsKIAkJZ290byBkb25lOwogCWRlZmF1bHQ6CkBAIC0yNDM0LDIxICsyNDQ5LDIxIEBACiAJfQogCiAJcmMgPSBTVUNDRVNTOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAltZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwogCWZhaWxfc2NzaV90YXNrcyhjb25uLCAtMSwgRElEX0VSUk9SKTsKIAljb25uLT50bWZfc3RhdGUgPSBUTUZfSU5JVElBTDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlpc2NzaV9zdGFydF90eChjb25uKTsKIAlnb3RvIGRvbmU7CiAKIHVubG9jazoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiBkb25lOgogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAidGd0ICVzIHJlc2V0IHJlc3VsdCA9ICVzXG4iLCBzZXNzaW9uLT50YXJnZXRuYW1lLAogCQkgICAgIHJjID09IFNVQ0NFU1MgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIik7CkBAIC0yNzQ2LDggKzI3NjEsMTAgQEAKIAlzZXNzaW9uLT5tYXhfcjJ0ID0gMTsKIAlzZXNzaW9uLT50dCA9IGlzY3NpdDsKIAlzZXNzaW9uLT5kZF9kYXRhID0gY2xzX3Nlc3Npb24tPmRkX2RhdGEgKyBzaXplb2YoKnNlc3Npb24pOworCiAJbXV0ZXhfaW5pdCgmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19pbml0KCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAogCS8qIGluaXRpYWxpemUgU0NTSSBQRFUgY29tbWFuZHMgcG9vbCAqLwogCWlmIChpc2NzaV9wb29sX2luaXQoJnNlc3Npb24tPmNtZHBvb2wsIHNlc3Npb24tPmNtZHNfbWF4LApAQCAtMjg2MSwxNCArMjg3OCwxNCBAQAogCUlOSVRfV09SSygmY29ubi0+eG1pdHdvcmssIGlzY3NpX3htaXR3b3JrZXIpOwogCiAJLyogYWxsb2NhdGUgbG9naW5fdGFzayB1c2VkIGZvciB0aGUgbG9naW4vdGV4dCBzZXF1ZW5jZXMgKi8KLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoIWtmaWZvX291dCgmc2Vzc2lvbi0+Y21kcG9vbC5xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmNvbm4tPmxvZ2luX3Rhc2ssCiAJCQkgc2l6ZW9mKHZvaWQqKSkpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJZ290byBsb2dpbl90YXNrX2FsbG9jX2ZhaWw7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWRhdGEgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCiAJCQkJCSBnZXRfb3JkZXIoSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4pKTsKQEAgLTI5MDUsNyArMjkyMiw3IEBACiAKIAlkZWxfdGltZXJfc3luYygmY29ubi0+dHJhbnNwb3J0X3RpbWVyKTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWNvbm4tPmNfc3RhZ2UgPSBJU0NTSV9DT05OX0NMRUFOVVBfV0FJVDsKIAlpZiAoc2Vzc2lvbi0+bGVhZGNvbm4gPT0gY29ubikgewogCQkvKgpAQCAtMjkxNCw3ICsyOTMxLDcgQEAKIAkJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9URVJNSU5BVEU7CiAJCXdha2VfdXAoJmNvbm4tPmVod2FpdCk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCS8qCiAJICogQmxvY2sgdW50aWwgYWxsIGluLXByb2dyZXNzIGNvbW1hbmRzIGZvciB0aGlzIGNvbm5lY3Rpb24KQEAgLTI5NDEsMTYgKzI5NTgsMTkgQEAKIAkvKiBmbHVzaCBxdWV1ZWQgdXAgd29yayBiZWNhdXNlIHdlIGZyZWUgdGhlIGNvbm5lY3Rpb24gYmVsb3cgKi8KIAlpc2NzaV9zdXNwZW5kX3R4KGNvbm4pOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgY29ubi0+ZGF0YSwKIAkJICAgZ2V0X29yZGVyKElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOKSk7CiAJa2ZyZWUoY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzKTsKIAlrZnJlZShjb25uLT5sb2NhbF9pcGFkZHIpOworCS8qIHJlZ3VsYXIgUlggcGF0aCB1c2VzIGJhY2tfbG9jayAqLworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlrZmlmb19pbigmc2Vzc2lvbi0+Y21kcG9vbC5xdWV1ZSwgKHZvaWQqKSZjb25uLT5sb2dpbl90YXNrLAogCQkgICAgc2l6ZW9mKHZvaWQqKSk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJaWYgKHNlc3Npb24tPmxlYWRjb25uID09IGNvbm4pCiAJCXNlc3Npb24tPmxlYWRjb25uID0gTlVMTDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlpc2NzaV9kZXN0cm95X2Nvbm4oY2xzX2Nvbm4pOwogfQpAQCAtMjk4Nyw3ICszMDA3LDcgQEAKIAkJY29ubi0+cGluZ190aW1lb3V0ID0gNTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAljb25uLT5jX3N0YWdlID0gSVNDU0lfQ09OTl9TVEFSVEVEOwogCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOOwogCXNlc3Npb24tPnF1ZXVlZF9jbWRzbiA9IHNlc3Npb24tPmNtZHNuOwpAQCAtMzAxNiw3ICszMDM2LDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJaXNjc2lfdW5ibG9ja19zZXNzaW9uKHNlc3Npb24tPmNsc19zZXNzaW9uKTsKIAl3YWtlX3VwKCZjb25uLT5laHdhaXQpOwpAQCAtMzA1NSw5ICszMDc1LDkgQEAKIAlpbnQgb2xkX3N0b3Bfc3RhZ2U7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKGNvbm4tPnN0b3Bfc3RhZ2UgPT0gU1RPUF9DT05OX1RFUk0pIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAJCXJldHVybjsKIAl9CkBAIC0zMDc0LDE0ICszMDk0LDE0IEBACiAKIAlvbGRfc3RvcF9zdGFnZSA9IGNvbm4tPnN0b3Bfc3RhZ2U7CiAJY29ubi0+c3RvcF9zdGFnZSA9IGZsYWc7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJZGVsX3RpbWVyX3N5bmMoJmNvbm4tPnRyYW5zcG9ydF90aW1lcik7CiAJaXNjc2lfc3VzcGVuZF90eChjb25uKTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWNvbm4tPmNfc3RhZ2UgPSBJU0NTSV9DT05OX1NUT1BQRUQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJLyoKIAkgKiBmb3IgY29ubmVjdGlvbiBsZXZlbCByZWNvdmVyeSB3ZSBzaG91bGQgbm90IGNhbGN1bGF0ZQpAQCAtMzEwMiwxMSArMzEyMiwxMSBAQAogCS8qCiAJICogZmx1c2ggcXVldWVzLgogCSAqLwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWZhaWxfc2NzaV90YXNrcyhjb25uLCAtMSwgRElEX1RSQU5TUE9SVF9ESVNSVVBURUQpOwogCWZhaWxfbWdtdF90YXNrcyhzZXNzaW9uLCBjb25uKTsKIAltZW1zZXQoJmNvbm4tPnRtaGRyLCAwLCBzaXplb2YoY29ubi0+dG1oZHIpKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiB9CiAKQEAgLTMxMzMsMTAgKzMxNTMsMTAgQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoaXNfbGVhZGluZykKIAkJc2Vzc2lvbi0+bGVhZGNvbm4gPSBjb25uOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCS8qCiAJICogVW5ibG9jayB4bWl0d29ya2VyKCksIExvZ2luIFBoYXNlIHdpbGwgcGFzcyB0aHJvdWdoLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCmluZGV4IDFkNThkNTMuLjYwY2I2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogICogaXNjc2lfdGNwX2NsZWFudXBfdGFzayAtIGZyZWUgdGNwX3Rhc2sgcmVzb3VyY2VzCiAgKiBAdGFzazogaXNjc2kgdGFzawogICoKLSAqIG11c3QgYmUgY2FsbGVkIHdpdGggc2Vzc2lvbiBsb2NrCisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gYmFja19sb2NrCiAgKi8KIHZvaWQgaXNjc2lfdGNwX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKQEAgLTQ1Nyw2ICs0NTcsNyBAQAogCWlmICghdGFzay0+c2MpCiAJCXJldHVybjsKIAorCXNwaW5fbG9ja19iaCgmdGNwX3Rhc2stPnF1ZXVlMnBvb2wpOwogCS8qIGZsdXNoIHRhc2sncyByMnQgcXVldWVzICovCiAJd2hpbGUgKGtmaWZvX291dCgmdGNwX3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSkpIHsKIAkJa2ZpZm9faW4oJnRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKQEAgLTQ3MCw2ICs0NzEsNyBAQAogCQkJICAgIHNpemVvZih2b2lkKikpOwogCQl0Y3BfdGFzay0+cjJ0ID0gTlVMTDsKIAl9CisJc3Bpbl91bmxvY2tfYmgoJnRjcF90YXNrLT5xdWV1ZTJwb29sKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2spOwogCkBAIC01MjksNiArNTMxLDggQEAKIAlzdHJ1Y3QgaXNjc2lfcjJ0X3JzcCAqcmhkciA9IChzdHJ1Y3QgaXNjc2lfcjJ0X3JzcCAqKXRjcF9jb25uLT5pbi5oZHI7CiAJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQ7CiAJaW50IHIydHNuID0gYmUzMl90b19jcHUocmhkci0+cjJ0c24pOworCXUzMiBkYXRhX2xlbmd0aDsKKwl1MzIgZGF0YV9vZmZzZXQ7CiAJaW50IHJjOwogCiAJaWYgKHRjcF9jb25uLT5pbi5kYXRhbGVuKSB7CkBAIC01NTQsMzkgKzU1OCw0MCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyYyA9IGtmaWZvX291dCgmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKKwlkYXRhX2xlbmd0aCA9IGJlMzJfdG9fY3B1KHJoZHItPmRhdGFfbGVuZ3RoKTsKKwlpZiAoZGF0YV9sZW5ndGggPT0gMCkgeworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOworCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47CisJfQorCisJaWYgKGRhdGFfbGVuZ3RoID4gc2Vzc2lvbi0+bWF4X2J1cnN0KQorCQlJU0NTSV9EQkdfVENQKGNvbm4sICJpbnZhbGlkIFIyVCB3aXRoIGRhdGEgbGVuICV1IGFuZCBtYXggIgorCQkJICAgICAgImJ1cnN0ICV1LiBBdHRlbXB0aW5nIHRvIGV4ZWN1dGUgcmVxdWVzdC5cbiIsCisJCQkgICAgICBkYXRhX2xlbmd0aCwgc2Vzc2lvbi0+bWF4X2J1cnN0KTsKKworCWRhdGFfb2Zmc2V0ID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9vZmZzZXQpOworCWlmIChkYXRhX29mZnNldCArIGRhdGFfbGVuZ3RoID4gc2NzaV9vdXQodGFzay0+c2MpLT5sZW5ndGgpIHsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBSMlQgd2l0aCBkYXRhIGxlbiAldSBhdCBvZmZzZXQgJXUgIgorCQkJCSAgImFuZCB0b3RhbCBsZW5ndGggJWRcbiIsIGRhdGFfbGVuZ3RoLAorCQkJCSAgZGF0YV9vZmZzZXQsIHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKTsKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOworCX0KKworCXNwaW5fbG9jaygmdGNwX3Rhc2stPnBvb2wycXVldWUpOworCXJjID0ga2ZpZm9fb3V0KCZ0Y3BfdGFzay0+cjJ0cG9vbC5xdWV1ZSwgKHZvaWQgKikmcjJ0LCBzaXplb2Yodm9pZCAqKSk7CiAJaWYgKCFyYykgewogCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBSMlQuICIKIAkJCQkgICJUYXJnZXQgaGFzIHNlbnQgbW9yZSBSMlRzIHRoYW4gaXQgIgogCQkJCSAgIm5lZ290aWF0ZWQgZm9yIG9yIGRyaXZlciBoYXMgbGVha2VkLlxuIik7CisJCXNwaW5fdW5sb2NrKCZ0Y3BfdGFzay0+cG9vbDJxdWV1ZSk7CiAJCXJldHVybiBJU0NTSV9FUlJfUFJPVE87CiAJfQogCiAJcjJ0LT5leHBfc3RhdHNuID0gcmhkci0+c3RhdHNuOwotCXIydC0+ZGF0YV9sZW5ndGggPSBiZTMyX3RvX2NwdShyaGRyLT5kYXRhX2xlbmd0aCk7Ci0JaWYgKHIydC0+ZGF0YV9sZW5ndGggPT0gMCkgewotCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKLQkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOwotCQlrZmlmb19pbigmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAotCQkJICAgIHNpemVvZih2b2lkKikpOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQotCi0JaWYgKHIydC0+ZGF0YV9sZW5ndGggPiBzZXNzaW9uLT5tYXhfYnVyc3QpCi0JCUlTQ1NJX0RCR19UQ1AoY29ubiwgImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYW5kIG1heCAiCi0JCQkgICAgICAiYnVyc3QgJXUuIEF0dGVtcHRpbmcgdG8gZXhlY3V0ZSByZXF1ZXN0LlxuIiwKLQkJCSAgICAgIHIydC0+ZGF0YV9sZW5ndGgsIHNlc3Npb24tPm1heF9idXJzdCk7Ci0KLQlyMnQtPmRhdGFfb2Zmc2V0ID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9vZmZzZXQpOwotCWlmIChyMnQtPmRhdGFfb2Zmc2V0ICsgcjJ0LT5kYXRhX2xlbmd0aCA+IHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKSB7Ci0JCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAotCQkJCSAgImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYXQgb2Zmc2V0ICV1ICIKLQkJCQkgICJhbmQgdG90YWwgbGVuZ3RoICVkXG4iLCByMnQtPmRhdGFfbGVuZ3RoLAotCQkJCSAgcjJ0LT5kYXRhX29mZnNldCwgc2NzaV9vdXQodGFzay0+c2MpLT5sZW5ndGgpOwotCQlrZmlmb19pbigmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAotCQkJICAgIHNpemVvZih2b2lkKikpOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQorCXIydC0+ZGF0YV9sZW5ndGggPSBkYXRhX2xlbmd0aDsKKwlyMnQtPmRhdGFfb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAKIAlyMnQtPnR0dCA9IHJoZHItPnR0dDsgLyogbm8gZmxpcCAqLwogCXIydC0+ZGF0YXNuID0gMDsKQEAgLTU5NSw2ICs2MDAsNyBAQAogCXRjcF90YXNrLT5leHBfZGF0YXNuID0gcjJ0c24gKyAxOwogCWtmaWZvX2luKCZ0Y3BfdGFzay0+cjJ0cXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKIAljb25uLT5yMnRfcGR1c19jbnQrKzsKKwlzcGluX3VubG9jaygmdGNwX3Rhc2stPnBvb2wycXVldWUpOwogCiAJaXNjc2lfcmVxdWV1ZV90YXNrKHRhc2spOwogCXJldHVybiAwOwpAQCAtNjY3LDE0ICs2NzMsMTQgQEAKIAogCXN3aXRjaChvcGNvZGUpIHsKIAljYXNlIElTQ1NJX09QX1NDU0lfREFUQV9JTjoKLQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQl0YXNrID0gaXNjc2lfaXR0X3RvX2N0YXNrKGNvbm4sIGhkci0+aXR0KTsKIAkJaWYgKCF0YXNrKQogCQkJcmMgPSBJU0NTSV9FUlJfQkFEX0lUVDsKIAkJZWxzZQogCQkJcmMgPSBpc2NzaV90Y3BfZGF0YV9pbihjb25uLCB0YXNrKTsKIAkJaWYgKHJjKSB7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTcwNywxMSArNzEzLDExIEBACiAJCQkJCQkgICB0Y3BfY29ubi0+aW4uZGF0YWxlbiwKIAkJCQkJCSAgIGlzY3NpX3RjcF9wcm9jZXNzX2RhdGFfaW4sCiAJCQkJCQkgICByeF9oYXNoKTsKLQkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJCXJjID0gX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBOVUxMLCAwKTsKLQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9PUF9TQ1NJX0NNRF9SU1A6CiAJCWlmICh0Y3BfY29ubi0+aW4uZGF0YWxlbikgewpAQCAtNzIxLDE4ICs3MjcsMjAgQEAKIAkJcmMgPSBpc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBOVUxMLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9PUF9SMlQ6Ci0JCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJdGFzayA9IGlzY3NpX2l0dF90b19jdGFzayhjb25uLCBoZHItPml0dCk7CisJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCQlpZiAoIXRhc2spCiAJCQlyYyA9IElTQ1NJX0VSUl9CQURfSVRUOwogCQllbHNlIGlmIChhaHNsZW4pCiAJCQlyYyA9IElTQ1NJX0VSUl9BSFNMRU47CiAJCWVsc2UgaWYgKHRhc2stPnNjLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCQl0YXNrLT5sYXN0X3hmZXIgPSBqaWZmaWVzOworCQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCQkJcmMgPSBpc2NzaV90Y3BfcjJ0X3JzcChjb25uLCB0YXNrKTsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCQl9IGVsc2UKIAkJCXJjID0gSVNDU0lfRVJSX1BST1RPOwotCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfTE9HSU5fUlNQOgogCWNhc2UgSVNDU0lfT1BfVEVYVF9SU1A6CkBAIC05ODAsMTQgKzk4OCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IGlzY3NpX3IydF9pbmZvICppc2NzaV90Y3BfZ2V0X2N1cnJfcjJ0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQogewotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKIAlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8gKnIydCA9IE5VTEw7CiAKIAlpZiAoaXNjc2lfdGFza19oYXNfdW5zb2xfZGF0YSh0YXNrKSkKIAkJcjJ0ID0gJnRhc2stPnVuc29sX3IydDsKIAllbHNlIHsKLQkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0Y3BfdGFzay0+cXVldWUycG9vbCk7CiAJCWlmICh0Y3BfdGFzay0+cjJ0KSB7CiAJCQlyMnQgPSB0Y3BfdGFzay0+cjJ0OwogCQkJLyogQ29udGludWUgd2l0aCB0aGlzIFIyVD8gKi8KQEAgLTEwMDksNyArMTAxNiw3IEBACiAJCQllbHNlCiAJCQkJcjJ0ID0gdGNwX3Rhc2stPnIydDsKIAkJfQotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0Y3BfdGFzay0+cXVldWUycG9vbCk7CiAJfQogCiAJcmV0dXJuIHIydDsKQEAgLTExMzksNiArMTE0Niw4IEBACiAJCQlpc2NzaV9wb29sX2ZyZWUoJnRjcF90YXNrLT5yMnRwb29sKTsKIAkJCWdvdG8gcjJ0X2FsbG9jX2ZhaWw7CiAJCX0KKwkJc3Bpbl9sb2NrX2luaXQoJnRjcF90YXNrLT5wb29sMnF1ZXVlKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnRjcF90YXNrLT5xdWV1ZTJwb29sKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMKaW5kZXggZDI4OTU4My4uNzY2MDk4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMKQEAgLTcwMCw0NiArNzAwLDI2IEBACiAKIH0KIAotc3RhdGljIGJvb2wgc2FzX2F0YV9mbHVzaF9wbV9laChzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0LCBjb25zdCBjaGFyICpmdW5jKQorc3RhdGljIHZvaWQgc2FzX2F0YV9mbHVzaF9wbV9laChzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0LCBjb25zdCBjaGFyICpmdW5jKQogewogCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsICpuOwotCWJvb2wgcmV0cnkgPSBmYWxzZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIG4sICZwb3J0LT5kZXZfbGlzdCwgZGV2X2xpc3Rfbm9kZSkgewotCQlpbnQgcmM7Ci0KIAkJaWYgKCFkZXZfaXNfc2F0YShkZXYpKQogCQkJY29udGludWU7CiAKIAkJc2FzX2F0YV93YWl0X2VoKGRldik7Ci0JCXJjID0gZGV2LT5zYXRhX2Rldi5wbV9yZXN1bHQ7Ci0JCWlmIChyYyA9PSAtRUFHQUlOKQotCQkJcmV0cnkgPSB0cnVlOwotCQllbHNlIGlmIChyYykgewotCQkJLyogc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhCi0JCQkgKiAtPnBvcnRfe3N1c3BlbmR8cmVzdW1lfSByb3V0aW5lIGluIG91cgotCQkJICogIGF0YV9wb3J0IG9wcywgYW5kIG5vIGVudGFuZ2xlbWVudHMgd2l0aAotCQkJICogIGFjcGksIHN1c3BlbmQgc2hvdWxkIGp1c3QgYmUgbWVjaGFuaWNhbCB0cmlwCi0JCQkgKiAgdGhyb3VnaCBlaCwgY2F0Y2ggY2FzZXMgd2hlcmUgdGhlc2UKLQkJCSAqICBhc3N1bXB0aW9ucyBhcmUgaW52YWxpZGF0ZWQKLQkJCSAqLwotCQkJV0FSTl9PTkNFKDEsICJmYWlsZWQgJXMgJXMgZXJyb3I6ICVkXG4iLCBmdW5jLAotCQkJCSBkZXZfbmFtZSgmZGV2LT5ycGh5LT5kZXYpLCByYyk7Ci0JCX0KIAogCQkvKiBpZiBsaWJhdGEgZmFpbGVkIHRvIHBvd2VyIG1hbmFnZSB0aGUgZGV2aWNlLCB0ZWFyIGl0IGRvd24gKi8KIAkJaWYgKGF0YV9kZXZfZGlzYWJsZWQoc2FzX3RvX2F0YV9kZXYoZGV2KSkpCiAJCQlzYXNfZmFpbF9wcm9iZShkZXYsIGZ1bmMsIC1FTk9ERVYpOwogCX0KLQotCXJldHVybiByZXRyeTsKIH0KIAogdm9pZCBzYXNfc3VzcGVuZF9zYXRhKHN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldjsKIAotIHJldHJ5OgogCW11dGV4X2xvY2soJnBvcnQtPmhhLT5kaXNjb19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwb3J0LT5kZXZfbGlzdCwgZGV2X2xpc3Rfbm9kZSkgewogCQlzdHJ1Y3Qgc2F0YV9kZXZpY2UgKnNhdGE7CkBAIC03NTEsMjAgKzczMSwxNyBAQAogCQlpZiAoc2F0YS0+YXAtPnBtX21lc2cuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkKIAkJCWNvbnRpbnVlOwogCi0JCXNhdGEtPnBtX3Jlc3VsdCA9IC1FSU87Ci0JCWF0YV9zYXNfcG9ydF9hc3luY19zdXNwZW5kKHNhdGEtPmFwLCAmc2F0YS0+cG1fcmVzdWx0KTsKKwkJYXRhX3Nhc19wb3J0X3N1c3BlbmQoc2F0YS0+YXApOwogCX0KIAltdXRleF91bmxvY2soJnBvcnQtPmhhLT5kaXNjb19tdXRleCk7CiAKLQlpZiAoc2FzX2F0YV9mbHVzaF9wbV9laChwb3J0LCBfX2Z1bmNfXykpCi0JCWdvdG8gcmV0cnk7CisJc2FzX2F0YV9mbHVzaF9wbV9laChwb3J0LCBfX2Z1bmNfXyk7CiB9CiAKIHZvaWQgc2FzX3Jlc3VtZV9zYXRhKHN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldjsKIAotIHJldHJ5OgogCW11dGV4X2xvY2soJnBvcnQtPmhhLT5kaXNjb19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwb3J0LT5kZXZfbGlzdCwgZGV2X2xpc3Rfbm9kZSkgewogCQlzdHJ1Y3Qgc2F0YV9kZXZpY2UgKnNhdGE7CkBAIC03NzYsMTMgKzc1MywxMSBAQAogCQlpZiAoc2F0YS0+YXAtPnBtX21lc2cuZXZlbnQgPT0gUE1fRVZFTlRfT04pCiAJCQljb250aW51ZTsKIAotCQlzYXRhLT5wbV9yZXN1bHQgPSAtRUlPOwotCQlhdGFfc2FzX3BvcnRfYXN5bmNfcmVzdW1lKHNhdGEtPmFwLCAmc2F0YS0+cG1fcmVzdWx0KTsKKwkJYXRhX3Nhc19wb3J0X3Jlc3VtZShzYXRhLT5hcCk7CiAJfQogCW11dGV4X3VubG9jaygmcG9ydC0+aGEtPmRpc2NvX211dGV4KTsKIAotCWlmIChzYXNfYXRhX2ZsdXNoX3BtX2VoKHBvcnQsIF9fZnVuY19fKSkKLQkJZ290byByZXRyeTsKKwlzYXNfYXRhX2ZsdXNoX3BtX2VoKHBvcnQsIF9fZnVuY19fKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IGRhM2FlZTEuLjI1ZDBmMTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwpAQCAtODYyLDcgKzg2Miw3IEBACiAKIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzYXNfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXNjbWRfcHJpbnRrKEtFUk5fREVCVUcsIGNtZCwgImNvbW1hbmQgJXAgdGltZWQgb3V0XG4iLCBjbWQpOworCXNjbWRfZGJnKGNtZCwgImNvbW1hbmQgJXAgdGltZWQgb3V0XG4iLCBjbWQpOwogCiAJcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaAppbmRleCA0ZTFiNzVjLi45NGEzY2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCkBAIC03Myw4ICs3Myw2IEBACiAgKi8KIC8qIDEgU2Vjb25kICovCiAjZGVmaW5lIFFVRVVFX1JBTVBfRE9XTl9JTlRFUlZBTAkobXNlY3NfdG9famlmZmllcygxMDAwICogMSkpCi0vKiA1IG1pbnV0ZXMgKi8KLSNkZWZpbmUgUVVFVUVfUkFNUF9VUF9JTlRFUlZBTAkJKG1zZWNzX3RvX2ppZmZpZXMoMTAwMCAqIDMwMCkpCiAKIC8qIE51bWJlciBvZiBleGNoYW5nZXMgcmVzZXJ2ZWQgZm9yIGRpc2NvdmVyeSB0byBjb21wbGV0ZSAqLwogI2RlZmluZSBMUEZDX0RJU0NfSU9DQl9CVUZGX0NPVU5UIDIwCkBAIC03MjIsNiArNzIwLDIwIEBACiAJdWludDMyX3QgY2ZnX2hiYV9xdWV1ZV9kZXB0aDsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2hiYV9yZXNldDsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2hiYV9oZWFydGJlYXQ7CisJdWludDMyX3QgY2ZnX2ZvZjsKKwl1aW50MzJfdCBjZmdfRW5hYmxlWExhbmU7CisJdWludDhfdCBjZmdfb2FzX3RndF93d3BuWzhdOworCXVpbnQ4X3QgY2ZnX29hc192cHRfd3dwbls4XTsKKwl1aW50MzJfdCBjZmdfb2FzX2x1bl9zdGF0ZTsKKyNkZWZpbmUgT0FTX0xVTl9FTkFCTEUJMQorI2RlZmluZSBPQVNfTFVOX0RJU0FCTEUJMAorCXVpbnQzMl90IGNmZ19vYXNfbHVuX3N0YXR1czsKKyNkZWZpbmUgT0FTX0xVTl9TVEFUVVNfRVhJU1RTCTB4MDEKKwl1aW50MzJfdCBjZmdfb2FzX2ZsYWdzOworI2RlZmluZSBPQVNfRklORF9BTllfVlBPUlQJMHgwMQorI2RlZmluZSBPQVNfRklORF9BTllfVEFSR0VUCTB4MDIKKyNkZWZpbmUgT0FTX0xVTl9WQUxJRAkweDA0CisJdWludDMyX3QgY2ZnX1hMYW5lUHJpb3JpdHk7CiAJdWludDMyX3QgY2ZnX2VuYWJsZV9iZzsKIAl1aW50MzJfdCBjZmdfaG9zdG1lbV9oZ3A7CiAJdWludDMyX3QgY2ZnX2xvZ192ZXJib3NlOwpAQCAtNzMwLDYgKzc0Miw3IEBACiAJdWludDMyX3QgY2ZnX3JlcXVlc3RfZmlybXdhcmVfdXBncmFkZTsKIAl1aW50MzJfdCBjZmdfaW9jYl9jbnQ7CiAJdWludDMyX3QgY2ZnX3N1cHByZXNzX2xpbmtfdXA7CisJdWludDMyX3QgY2ZnX3JycV94cmlfYml0bWFwX3N6OwogI2RlZmluZSBMUEZDX0lOSVRJQUxJWkVfTElOSyAgICAgICAgICAgICAgMAkvKiBkbyBub3JtYWwgaW5pdF9saW5rIG1ib3ggKi8KICNkZWZpbmUgTFBGQ19ERUxBWV9JTklUX0xJTksgICAgICAgICAgICAgIDEJLyogbGF5ZXJlZCBkcml2ZXIgaG9sZCBvZmYgKi8KICNkZWZpbmUgTFBGQ19ERUxBWV9JTklUX0xJTktfSU5ERUZJTklURUxZIDIJLyogd2FpdCwgbWFudWFsIGludGVydmVudGlvbiAqLwpAQCAtODM1LDYgKzg0OCw3IEBACiAJbWVtcG9vbF90ICptYm94X21lbV9wb29sOwogCW1lbXBvb2xfdCAqbmxwX21lbV9wb29sOwogCW1lbXBvb2xfdCAqcnJxX3Bvb2w7CisJbWVtcG9vbF90ICphY3RpdmVfcnJxX3Bvb2w7CiAKIAlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzIGxpbmtfc3RhdHM7CiAJZW51bSBpbnRyX3R5cGVfdCBpbnRyX3R5cGU7CkBAIC04NjksNyArODgzLDYgQEAKIAlhdG9taWNfdCBudW1fY21kX3N1Y2Nlc3M7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3JzcmNfZXJyb3JfdGltZTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfcmFtcF9kb3duX3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3JhbXBfdXBfdGltZTsKICNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCiAJc3RydWN0IGRlbnRyeSAqaGJhX2RlYnVnZnNfcm9vdDsKIAlhdG9taWNfdCBkZWJ1Z2ZzX3Zwb3J0X2NvdW50OwpAQCAtOTcxLDYgKzk4NCw5IEBACiAJYXRvbWljX3Qgc2Rldl9jbnQ7CiAJdWludDhfdCBmaXBzX3NwZWNfcmV2OwogCXVpbnQ4X3QgZmlwc19sZXZlbDsKKwlzcGlubG9ja190IGRldmljZWxvY2s7CS8qIGxvY2sgZm9yIGx1bnMgbGlzdCAqLworCW1lbXBvb2xfdCAqZGV2aWNlX2RhdGFfbWVtX3Bvb2w7CisJc3RydWN0IGxpc3RfaGVhZCBsdW5zOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgU2NzaV9Ib3N0ICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKaW5kZXggMDA2NTZmYy4uOGQ1YjZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKQEAgLTUyOSw2ICs1MjksMjcgQEAKIH0KIAogLyoqCisgKiBscGZjX29hc19zdXBwb3J0ZWRfc2hvdyAtIFJldHVybiB3aGV0aGVyIG9yIG5vdCBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UKKyAqCQkJICAgIChPQVMpIGlzIHN1cHBvcnRlZC4KKyAqIEBkZXY6IGNsYXNzIHVudXNlZCB2YXJpYWJsZS4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IG9uIHJldHVybiBjb250YWlucyB0aGUgbW9kdWxlIGRlc2NyaXB0aW9uIHRleHQuCisgKgorICogUmV0dXJuczogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX3N1cHBvcnRlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJcGhiYS0+c2xpNF9oYmEucGNfc2xpNF9wYXJhbXMub2FzX3N1cHBvcnRlZCk7Cit9CisKKy8qKgogICogbHBmY19saW5rX3N0YXRlX3N0b3JlIC0gVHJhbnNpdGlvbiB0aGUgbGlua19zdGF0ZSBvbiBhbiBIQkEgcG9ydAogICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCiAgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCkBAIC0yMDQxLDkgKzIwNjIsNTMgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihscGZjX3NyaW92X2h3X21heF92aXJ0Zm4sIFNfSVJVR08sCiAJCSAgIGxwZmNfc3Jpb3ZfaHdfbWF4X3ZpcnRmbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwcm90b2NvbCwgU19JUlVHTywgbHBmY19zbGk0X3Byb3RvY29sX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGxwZmNfeGxhbmVfc3VwcG9ydGVkLCBTX0lSVUdPLCBscGZjX29hc19zdXBwb3J0ZWRfc2hvdywKKwkJICAgTlVMTCk7CiAKIHN0YXRpYyBjaGFyICpscGZjX3NvZnRfd3duX2tleSA9ICJDOTlHNzFTTDgwMzJBIjsKKyNkZWZpbmUgV1dOX1NaIDgKKy8qKgorICogbHBmY193d25fc2V0IC0gQ29udmVydCBzdHJpbmcgdG8gdGhlIDggYnl0ZSBXV04gdmFsdWUuCisgKiBAYnVmOiBXV04gc3RyaW5nLgorICogQGNudDogTGVuZ3RoIG9mIHN0cmluZy4KKyAqIEB3d246IEFycmF5IHRvIHJlY2VpdmUgY29udmVydGVkIHd3biB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zOgorICogLUVJTlZBTCBpZiB0aGUgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCB3d24KKyAqIDAgc3VjY2VzcworICoqLworc3RhdGljIHNpemVfdAorbHBmY193d25fc2V0KGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNudCwgY2hhciB3d25bXSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKIAorCS8qIENvdW50IG1heSBpbmNsdWRlIGEgTEYgYXQgZW5kIG9mIHN0cmluZyAqLworCWlmIChidWZbY250LTFdID09ICdcbicpCisJCWNudC0tOworCisJaWYgKChjbnQgPCAxNikgfHwgKGNudCA+IDE4KSB8fCAoKGNudCA9PSAxNykgJiYgKCpidWYrKyAhPSAneCcpKSB8fAorCSAgICAoKGNudCA9PSAxOCkgJiYgKCgqYnVmKysgIT0gJzAnKSB8fCAoKmJ1ZisrICE9ICd4JykpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQod3duLCAwLCBXV05fU1opOworCisJLyogVmFsaWRhdGUgYW5kIHN0b3JlIHRoZSBuZXcgbmFtZSAqLworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoKCpidWYgPj0gJ2EnKSAmJiAoKmJ1ZiA8PSAnZicpKQorCQkJaiA9ICgoaiA8PCA0KSB8ICgoKmJ1ZisrIC0gJ2EnKSArIDEwKSk7CisJCWVsc2UgaWYgKCgqYnVmID49ICdBJykgJiYgKCpidWYgPD0gJ0YnKSkKKwkJCWogPSAoKGogPDwgNCkgfCAoKCpidWYrKyAtICdBJykgKyAxMCkpOworCQllbHNlIGlmICgoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykpCisJCQlqID0gKChqIDw8IDQpIHwgKCpidWYrKyAtICcwJykpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGkgJSAyKSB7CisJCQl3d25baS8yXSA9IGogJiAweGZmOworCQkJaiA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CiAvKioKICAqIGxwZmNfc29mdF93d25fZW5hYmxlX3N0b3JlIC0gQWxsb3dzIHNldHRpbmcgb2YgdGhlIHd3biBpZiB0aGUga2V5IGlzIHZhbGlkCiAgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KQEAgLTIxMzIsOSArMjE5Nyw5IEBACiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOwogCXN0cnVjdCBjb21wbGV0aW9uIG9ubGluZV9jb21wbDsKLQlpbnQgc3RhdDE9MCwgc3RhdDI9MDsKLQl1bnNpZ25lZCBpbnQgaSwgaiwgY250PWNvdW50OwotCXU4IHd3cG5bOF07CisJaW50IHN0YXQxID0gMCwgc3RhdDIgPSAwOworCXVuc2lnbmVkIGludCBjbnQgPSBjb3VudDsKKwl1OCB3d3BuW1dXTl9TWl07CiAJaW50IHJjOwogCiAJaWYgKCFwaGJhLT5jZmdfZW5hYmxlX2hiYV9yZXNldCkKQEAgLTIxNDksMjkgKzIyMTQsMTkgQEAKIAlpZiAoYnVmW2NudC0xXSA9PSAnXG4nKQogCQljbnQtLTsKIAotCWlmICghcGhiYS0+c29mdF93d25fZW5hYmxlIHx8IChjbnQgPCAxNikgfHwgKGNudCA+IDE4KSB8fAotCSAgICAoKGNudCA9PSAxNykgJiYgKCpidWYrKyAhPSAneCcpKSB8fAotCSAgICAoKGNudCA9PSAxOCkgJiYgKCgqYnVmKysgIT0gJzAnKSB8fCAoKmJ1ZisrICE9ICd4JykpKSkKKwlpZiAoIXBoYmEtPnNvZnRfd3duX2VuYWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBsb2NrIHNldHRpbmcgd3dwbiwgd3dubiBkb3duICovCiAJcGhiYS0+c29mdF93d25fZW5hYmxlID0gMDsKIAotCW1lbXNldCh3d3BuLCAwLCBzaXplb2Yod3dwbikpOwotCi0JLyogVmFsaWRhdGUgYW5kIHN0b3JlIHRoZSBuZXcgbmFtZSAqLwotCWZvciAoaT0wLCBqPTA7IGkgPCAxNjsgaSsrKSB7Ci0JCWludCB2YWx1ZTsKLQotCQl2YWx1ZSA9IGhleF90b19iaW4oKmJ1ZisrKTsKLQkJaWYgKHZhbHVlID49IDApCi0JCQlqID0gKGogPDwgNCkgfCB2YWx1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChpICUgMikgewotCQkJd3dwbltpLzJdID0gaiAmIDB4ZmY7Ci0JCQlqID0gMDsKLQkJfQorCXJjID0gbHBmY193d25fc2V0KGJ1ZiwgY250LCB3d3BuKTsKKwlpZiAoIXJjKSB7CisJCS8qIG5vdCBhYmxlIHRvIHNldCB3d3BuLCB1bmxvY2sgaXQgKi8KKwkJcGhiYS0+c29mdF93d25fZW5hYmxlID0gMTsKKwkJcmV0dXJuIHJjOwogCX0KKwogCXBoYmEtPmNmZ19zb2Z0X3d3cG4gPSB3d25fdG9fdTY0KHd3cG4pOwogCWZjX2hvc3RfcG9ydF9uYW1lKHNob3N0KSA9IHBoYmEtPmNmZ19zb2Z0X3d3cG47CiAJaWYgKHBoYmEtPmNmZ19zb2Z0X3d3bm4pCkBAIC0yMTk4LDcgKzIyNTMsNyBAQAogCQkJCSJyZWluaXQgYWRhcHRlciAtICVkXG4iLCBzdGF0Mik7CiAJcmV0dXJuIChzdGF0MSB8fCBzdGF0MikgPyAtRUlPIDogY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIobHBmY19zb2Z0X3d3cG4sIFNfSVJVR08gfCBTX0lXVVNSLFwKK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3NvZnRfd3dwbiwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgIGxwZmNfc29mdF93d3BuX3Nob3csIGxwZmNfc29mdF93d3BuX3N0b3JlKTsKIAogLyoqCkBAIC0yMjM1LDM5ICsyMjkwLDI1IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOwogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOwotCXVuc2lnbmVkIGludCBpLCBqLCBjbnQ9Y291bnQ7Ci0JdTggd3dubls4XTsKKwl1bnNpZ25lZCBpbnQgY250ID0gY291bnQ7CisJdTggd3dubltXV05fU1pdOworCWludCByYzsKIAogCS8qIGNvdW50IG1heSBpbmNsdWRlIGEgTEYgYXQgZW5kIG9mIHN0cmluZyAqLwogCWlmIChidWZbY250LTFdID09ICdcbicpCiAJCWNudC0tOwogCi0JaWYgKCFwaGJhLT5zb2Z0X3d3bl9lbmFibGUgfHwgKGNudCA8IDE2KSB8fCAoY250ID4gMTgpIHx8Ci0JICAgICgoY250ID09IDE3KSAmJiAoKmJ1ZisrICE9ICd4JykpIHx8Ci0JICAgICgoY250ID09IDE4KSAmJiAoKCpidWYrKyAhPSAnMCcpIHx8ICgqYnVmKysgIT0gJ3gnKSkpKQorCWlmICghcGhiYS0+c29mdF93d25fZW5hYmxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qCi0JICogQWxsb3cgd3dubiB0byBiZSBzZXQgbWFueSB0aW1lcywgYXMgbG9uZyBhcyB0aGUgZW5hYmxlIGlzIHNldC4KLQkgKiBIb3dldmVyLCBvbmNlIHRoZSB3d3BuIGlzIHNldCwgZXZlcnl0aGluZyBsb2Nrcy4KLQkgKi8KLQotCW1lbXNldCh3d25uLCAwLCBzaXplb2Yod3dubikpOwotCi0JLyogVmFsaWRhdGUgYW5kIHN0b3JlIHRoZSBuZXcgbmFtZSAqLwotCWZvciAoaT0wLCBqPTA7IGkgPCAxNjsgaSsrKSB7Ci0JCWludCB2YWx1ZTsKLQotCQl2YWx1ZSA9IGhleF90b19iaW4oKmJ1ZisrKTsKLQkJaWYgKHZhbHVlID49IDApCi0JCQlqID0gKGogPDwgNCkgfCB2YWx1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChpICUgMikgewotCQkJd3dubltpLzJdID0gaiAmIDB4ZmY7Ci0JCQlqID0gMDsKLQkJfQorCXJjID0gbHBmY193d25fc2V0KGJ1ZiwgY250LCB3d25uKTsKKwlpZiAoIXJjKSB7CisJCS8qIEFsbG93IHd3bm4gdG8gYmUgc2V0IG1hbnkgdGltZXMsIGFzIGxvbmcgYXMgdGhlIGVuYWJsZQorCQkgKiBpcyBzZXQuIEhvd2V2ZXIsIG9uY2UgdGhlIHd3cG4gaXMgc2V0LCBldmVyeXRoaW5nIGxvY2tzLgorCQkgKi8KKwkJcmV0dXJuIHJjOwogCX0KKwogCXBoYmEtPmNmZ19zb2Z0X3d3bm4gPSB3d25fdG9fdTY0KHd3bm4pOwogCiAJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBoYmEtPnBjaWRldi0+ZGV2LApAQCAtMjI3Niw5ICsyMzE3LDQzOCBAQAogCiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKGxwZmNfc29mdF93d25uLCBTX0lSVUdPIHwgU19JV1VTUixcCitzdGF0aWMgREVWSUNFX0FUVFIobHBmY19zb2Z0X3d3bm4sIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICBscGZjX3NvZnRfd3dubl9zaG93LCBscGZjX3NvZnRfd3dubl9zdG9yZSk7CiAKKy8qKgorICogbHBmY19vYXNfdGd0X3Nob3cgLSBSZXR1cm4gd3dwbiBvZiB0YXJnZXQgd2hvc2UgbHVucyBtYXliZSBlbmFibGVkIGZvcgorICoJCSAgICAgIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqIHZhbHVlIG9mIGNvdW50CisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfdGd0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglbGx4XG4iLAorCQkJd3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3RndF93d3BuKSk7Cit9CisKKy8qKgorICogbHBmY19vYXNfdGd0X3N0b3JlIC0gU3RvcmUgd3dwbiBvZiB0YXJnZXQgd2hvc2UgbHVucyBtYXliZSBlbmFibGVkIGZvcgorICoJCSAgICAgIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKiBAY291bnQ6IFNpemUgb2YgdGhlIGRhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAtRUlOVkFMIGNvdW50IGlzIGludmFsaWQsIGludmFsaWQgd3dwbiBieXRlIGludmFsaWQKKyAqIC1FUEVSTSBvYXMgaXMgbm90IHN1cHBvcnRlZCBieSBoYmEKKyAqIHZhbHVlIG9mIGNvdW50IG9uIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc190Z3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCXVuc2lnbmVkIGludCBjbnQgPSBjb3VudDsKKwl1aW50OF90IHd3cG5bV1dOX1NaXTsKKwlpbnQgcmM7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIGNvdW50IG1heSBpbmNsdWRlIGEgTEYgYXQgZW5kIG9mIHN0cmluZyAqLworCWlmIChidWZbY250LTFdID09ICdcbicpCisJCWNudC0tOworCisJcmMgPSBscGZjX3d3bl9zZXQoYnVmLCBjbnQsIHd3cG4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbWVtY3B5KHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4sIHd3cG4sICg4ICogc2l6ZW9mKHVpbnQ4X3QpKSk7CisJbWVtY3B5KHBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X3RndF93d3BuLCB3d3BuLCAoOCAqIHNpemVvZih1aW50OF90KSkpOworCWlmICh3d25fdG9fdTY0KHd3cG4pID09IDApCisJCXBoYmEtPmNmZ19vYXNfZmxhZ3MgfD0gT0FTX0ZJTkRfQU5ZX1RBUkdFVDsKKwllbHNlCisJCXBoYmEtPmNmZ19vYXNfZmxhZ3MgJj0gfk9BU19GSU5EX0FOWV9UQVJHRVQ7CisJcGhiYS0+Y2ZnX29hc19mbGFncyAmPSB+T0FTX0xVTl9WQUxJRDsKKwlwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF9sdW4gPSBGSU5EX0ZJUlNUX09BU19MVU47CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfeGxhbmVfdGd0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgbHBmY19vYXNfdGd0X3Nob3csIGxwZmNfb2FzX3RndF9zdG9yZSk7CisKKy8qKgorICogbHBmY19vYXNfdnB0X3Nob3cgLSBSZXR1cm4gd3dwbiBvZiB2cG9ydCB3aG9zZSB0YXJnZXRzIG1heWJlIGVuYWJsZWQKKyAqCQkgICAgICBmb3IgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogdmFsdWUgb2YgY291bnQgb24gc3VjY2VzcworICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX3ZwdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JWxseFxuIiwKKwkJCXd3bl90b191NjQocGhiYS0+Y2ZnX29hc192cHRfd3dwbikpOworfQorCisvKioKKyAqIGxwZmNfb2FzX3ZwdF9zdG9yZSAtIFN0b3JlIHd3cG4gb2YgdnBvcnQgd2hvc2UgdGFyZ2V0cyBtYXliZSBlbmFibGVkCisgKgkJICAgICAgZm9yIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKiBAY291bnQ6IFNpemUgb2YgdGhlIGRhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAtRUlOVkFMIGNvdW50IGlzIGludmFsaWQsIGludmFsaWQgd3dwbiBieXRlIGludmFsaWQKKyAqIC1FUEVSTSBvYXMgaXMgbm90IHN1cHBvcnRlZCBieSBoYmEKKyAqIHZhbHVlIG9mIGNvdW50IG9uIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc192cHRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCXVuc2lnbmVkIGludCBjbnQgPSBjb3VudDsKKwl1aW50OF90IHd3cG5bV1dOX1NaXTsKKwlpbnQgcmM7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIGNvdW50IG1heSBpbmNsdWRlIGEgTEYgYXQgZW5kIG9mIHN0cmluZyAqLworCWlmIChidWZbY250LTFdID09ICdcbicpCisJCWNudC0tOworCisJcmMgPSBscGZjX3d3bl9zZXQoYnVmLCBjbnQsIHd3cG4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbWVtY3B5KHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4sIHd3cG4sICg4ICogc2l6ZW9mKHVpbnQ4X3QpKSk7CisJbWVtY3B5KHBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X3ZwdF93d3BuLCB3d3BuLCAoOCAqIHNpemVvZih1aW50OF90KSkpOworCWlmICh3d25fdG9fdTY0KHd3cG4pID09IDApCisJCXBoYmEtPmNmZ19vYXNfZmxhZ3MgfD0gT0FTX0ZJTkRfQU5ZX1ZQT1JUOworCWVsc2UKKwkJcGhiYS0+Y2ZnX29hc19mbGFncyAmPSB+T0FTX0ZJTkRfQU5ZX1ZQT1JUOworCXBoYmEtPmNmZ19vYXNfZmxhZ3MgJj0gfk9BU19MVU5fVkFMSUQ7CisJcGhiYS0+c2xpNF9oYmEub2FzX25leHRfbHVuID0gRklORF9GSVJTVF9PQVNfTFVOOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3hsYW5lX3ZwdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGxwZmNfb2FzX3ZwdF9zaG93LCBscGZjX29hc192cHRfc3RvcmUpOworCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zdGF0ZV9zaG93IC0gUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIChlbmFibGVkIG9yIGRpc2FibGVkKQorICoJCQkgICAgb2Ygd2hldGhlciBsdW5zIHdpbGwgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICoJCQkgICAgZm9yIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqIHNpemUgb2YgZm9ybWF0dGVkIHN0cmluZy4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19sdW5fc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBwaGJhLT5jZmdfb2FzX2x1bl9zdGF0ZSk7Cit9CisKKy8qKgorICogbHBmY19vYXNfbHVuX3N0YXRlX3N0b3JlIC0gU3RvcmUgdGhlIHN0YXRlIChlbmFibGVkIG9yIGRpc2FibGVkKQorICoJCQkgICAgb2Ygd2hldGhlciBsdW5zIHdpbGwgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICoJCQkgICAgZm9yIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKiBAY291bnQ6IFNpemUgb2YgdGhlIGRhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAtRUlOVkFMIGNvdW50IGlzIGludmFsaWQsIGludmFsaWQgd3dwbiBieXRlIGludmFsaWQKKyAqIC1FUEVSTSBvYXMgaXMgbm90IHN1cHBvcnRlZCBieSBoYmEKKyAqIHZhbHVlIG9mIGNvdW50IG9uIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19sdW5fc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisJaW50IHZhbCA9IDA7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICghaXNkaWdpdChidWZbMF0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmdmFsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsICE9IDApICYmICh2YWwgIT0gMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGhiYS0+Y2ZnX29hc19sdW5fc3RhdGUgPSB2YWw7CisKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY194bGFuZV9sdW5fc3RhdGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBscGZjX29hc19sdW5fc3RhdGVfc2hvdywgbHBmY19vYXNfbHVuX3N0YXRlX3N0b3JlKTsKKworLyoqCisgKiBscGZjX29hc19sdW5fc3RhdHVzX3Nob3cgLSBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgT3B0aW1pemVkIEFjY2VzcworICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2UgKE9BUykgbHVuIHJldHVybmVkIGJ5IHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxwZmNfb2FzX2x1bl9zaG93IGZ1bmN0aW9uLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqIHNpemUgb2YgZm9ybWF0dGVkIHN0cmluZy4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19sdW5fc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJaWYgKCEocGhiYS0+Y2ZnX29hc19mbGFncyAmIE9BU19MVU5fVkFMSUQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBwaGJhLT5jZmdfb2FzX2x1bl9zdGF0dXMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfeGxhbmVfbHVuX3N0YXR1cywgU19JUlVHTywKKwkJICAgbHBmY19vYXNfbHVuX3N0YXR1c19zaG93LCBOVUxMKTsKKworCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zdGF0ZV9zZXQgLSBlbmFibGUgb3IgZGlzYWJsZSBhIGx1biBmb3IgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlCisgKgkJCSAgIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAcGhiYTogbHBmY19oYmEgcG9pbnRlci4KKyAqIEBuZGxwOiBwb2ludGVyIHRvIGZjcCB0YXJnZXQgbm9kZS4KKyAqIEBsdW46IHRoZSBmYyBsdW4gZm9yIHNldHRpbmcgb2FzIHN0YXRlLgorICogQG9hc19zdGF0ZTogdGhlIG9hcyBzdGF0ZSB0byBiZSBzZXQgdG8gdGhlIGx1bi4KKyAqCisgKiBSZXR1cm5zOgorICogU1VDQ0VTUyA6IDAKKyAqIC1FUEVSTSBPQVMgaXMgbm90IGVuYWJsZWQgb3Igbm90IHN1cHBvcnRlZCBieSB0aGlzIHBvcnQuCisgKgorICovCitzdGF0aWMgc2l6ZV90CitscGZjX29hc19sdW5fc3RhdGVfc2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDhfdCB2cHRfd3dwbltdLAorCQkgICAgICAgdWludDhfdCB0Z3Rfd3dwbltdLCB1aW50NjRfdCBsdW4sIHVpbnQzMl90IG9hc19zdGF0ZSkKK3sKKworCWludCByYyA9IDA7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChvYXNfc3RhdGUpIHsKKwkJaWYgKCFscGZjX2VuYWJsZV9vYXNfbHVuKHBoYmEsIChzdHJ1Y3QgbHBmY19uYW1lICopdnB0X3d3cG4sCisJCQkJCSAoc3RydWN0IGxwZmNfbmFtZSAqKXRndF93d3BuLCBsdW4pKQorCQkJcmMgPSAtRU5PTUVNOworCX0gZWxzZSB7CisJCWxwZmNfZGlzYWJsZV9vYXNfbHVuKHBoYmEsIChzdHJ1Y3QgbHBmY19uYW1lICopdnB0X3d3cG4sCisJCQkJICAgICAoc3RydWN0IGxwZmNfbmFtZSAqKXRndF93d3BuLCBsdW4pOworCX0KKwlyZXR1cm4gcmM7CisKK30KKworLyoqCisgKiBscGZjX29hc19sdW5fZ2V0X25leHQgLSBnZXQgdGhlIG5leHQgbHVuIHRoYXQgaGFzIGJlZW4gZW5hYmxlZCBmb3IgT3B0aW1pemVkCisgKgkJCSAgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBwaGJhOiBscGZjX2hiYSBwb2ludGVyLgorICogQHZwdF93d3BuOiB3d3BuIG9mIHRoZSB2cG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGx1bgorICogQHRndF93d3BuOiB3d3BuIG9mIHRoZSB0YXJnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBsdW4KKyAqIEBsdW5fc3RhdHVzOiBzdGF0dXMgb2YgdGhlIGx1biByZXR1cm5lZCBsdW4KKyAqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBvciBuZXh0IGx1biBlbmFibGVkIGZvciBPQVMgb3BlcmF0aW9ucyBmb3IgdGhlIHZwb3J0L3RhcmdldAorICogc3BlY2lmaWVkLiAgSWYgYSBsdW4gaXMgZm91bmQsIGl0cyB2cG9ydCB3d3BuLCB0YXJnZXQgd3dwbiBhbmQgc3RhdHVzIGlzCisgKiByZXR1cm5lZC4gIElmIHRoZSBsdW4gaXMgbm90IGZvdW5kLCBOT1RfT0FTX0VOQUJMRURfTFVOIGlzIHJldHVybmVkLgorICoKKyAqIFJldHVybjoKKyAqIGx1biB0aGF0IGlzIE9BUyBlbmFibGVkIGZvciB0aGUgdnBvcnQvdGFyZ2V0CisgKiBOT1RfT0FTX0VOQUJMRURfTFVOIHdoZW4gbm8gb2FzIGVuYWJsZWQgbHVuIGZvdW5kLgorICovCitzdGF0aWMgdWludDY0X3QKK2xwZmNfb2FzX2x1bl9nZXRfbmV4dChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQ4X3QgdnB0X3d3cG5bXSwKKwkJICAgICAgdWludDhfdCB0Z3Rfd3dwbltdLCB1aW50MzJfdCAqbHVuX3N0YXR1cykKK3sKKwl1aW50NjRfdCBmb3VuZF9sdW47CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICF2cHRfd3dwbiB8fCAhdGd0X3d3cG4pCisJCXJldHVybiBOT1RfT0FTX0VOQUJMRURfTFVOOworCWlmIChscGZjX2ZpbmRfbmV4dF9vYXNfbHVuKHBoYmEsIChzdHJ1Y3QgbHBmY19uYW1lICopCisJCQkJICAgcGhiYS0+c2xpNF9oYmEub2FzX25leHRfdnB0X3d3cG4sCisJCQkJICAgKHN0cnVjdCBscGZjX25hbWUgKikKKwkJCQkgICBwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF90Z3Rfd3dwbiwKKwkJCQkgICAmcGhiYS0+c2xpNF9oYmEub2FzX25leHRfbHVuLAorCQkJCSAgIChzdHJ1Y3QgbHBmY19uYW1lICopdnB0X3d3cG4sCisJCQkJICAgKHN0cnVjdCBscGZjX25hbWUgKil0Z3Rfd3dwbiwKKwkJCQkgICAmZm91bmRfbHVuLCBsdW5fc3RhdHVzKSkKKwkJcmV0dXJuIGZvdW5kX2x1bjsKKwllbHNlCisJCXJldHVybiBOT1RfT0FTX0VOQUJMRURfTFVOOworfQorCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zdGF0ZV9jaGFuZ2UgLSBlbmFibGUvZGlzYWJsZSBhIGx1biBmb3IgT0FTIG9wZXJhdGlvbnMKKyAqIEBwaGJhOiBscGZjX2hiYSBwb2ludGVyLgorICogQHZwdF93d3BuOiB2cG9ydCB3d3BuIGJ5IHJlZmVyZW5jZS4KKyAqIEB0Z3Rfd3dwbjogdGFyZ2V0IHd3cG4gYnkgcmVmZXJlbmNlLgorICogQGx1bjogdGhlIGZjIGx1biBmb3Igc2V0dGluZyBvYXMgc3RhdGUuCisgKiBAb2FzX3N0YXRlOiB0aGUgb2FzIHN0YXRlIHRvIGJlIHNldCB0byB0aGUgb2FzX2x1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZW5hYmxlcyAoT0FTX0xVTl9FTkFCTEUpIG9yIGRpc2FibGVzIChPQVNfTFVOX0RJU0FCTEUpCisgKiBhIGx1biBmb3IgT0FTIG9wZXJhdGlvbnMuCisgKgorICogUmV0dXJuOgorICogU1VDQ0VTUzogMAorICogLUVOT01FTTogZmFpbGVkIHRvIGVuYWJsZSBhbiBsdW4gZm9yIE9BUyBvcGVyYXRpb25zCisgKiAtRVBFUk06IE9BUyBpcyBub3QgZW5hYmxlZAorICovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfbHVuX3N0YXRlX2NoYW5nZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQ4X3QgdnB0X3d3cG5bXSwKKwkJCSAgdWludDhfdCB0Z3Rfd3dwbltdLCB1aW50NjRfdCBsdW4sCisJCQkgIHVpbnQzMl90IG9hc19zdGF0ZSkKK3sKKworCWludCByYzsKKworCXJjID0gbHBmY19vYXNfbHVuX3N0YXRlX3NldChwaGJhLCB2cHRfd3dwbiwgdGd0X3d3cG4sIGx1biwKKwkJCQkJb2FzX3N0YXRlKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogbHBmY19vYXNfbHVuX3Nob3cgLSBSZXR1cm4gb2FzIGVuYWJsZWQgbHVucyBmcm9tIGEgY2hvc2VuIHRhcmdldAorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgYSBsdW4gZW5hYmxlZCBmb3IgT0FTIGVhY2ggdGltZSB0aGUgZnVuY3Rpb24KKyAqIGlzIGNhbGxlZC4KKyAqCisgKiBSZXR1cm5zOgorICogU1VDQ0VTUzogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICogLUVGQVVMVDogdGFyZ2V0IG9yIHZwb3J0IHd3cG4gd2FzIG5vdCBzZXQgcHJvcGVybHkuCisgKiAtRVBFUk06IG9hcyBpcyBub3QgZW5hYmxlZC4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19sdW5fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisKKwl1aW50NjRfdCBvYXNfbHVuOworCWludCBsZW4gPSAwOworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAod3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3ZwdF93d3BuKSA9PSAwKQorCQlpZiAoIShwaGJhLT5jZmdfb2FzX2ZsYWdzICYgT0FTX0ZJTkRfQU5ZX1ZQT1JUKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHd3bl90b191NjQocGhiYS0+Y2ZnX29hc190Z3Rfd3dwbikgPT0gMCkKKwkJaWYgKCEocGhiYS0+Y2ZnX29hc19mbGFncyAmIE9BU19GSU5EX0FOWV9UQVJHRVQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlvYXNfbHVuID0gbHBmY19vYXNfbHVuX2dldF9uZXh0KHBoYmEsIHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4sCisJCQkJCXBoYmEtPmNmZ19vYXNfdGd0X3d3cG4sCisJCQkJCSZwaGJhLT5jZmdfb2FzX2x1bl9zdGF0dXMpOworCWlmIChvYXNfbHVuICE9IE5PVF9PQVNfRU5BQkxFRF9MVU4pCisJCXBoYmEtPmNmZ19vYXNfZmxhZ3MgfD0gT0FTX0xVTl9WQUxJRDsKKworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICIweCVsbHgiLCBvYXNfbHVuKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogbHBmY19vYXNfbHVuX3N0b3JlIC0gU2V0cyB0aGUgT0FTIHN0YXRlIGZvciBsdW4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgT0FTIHN0YXRlIGZvciBsdW4uICBCZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsCisgKiB0aGUgdnBvcnQgd3dwbiwgdGFyZ2V0IHd3cG4sIGFuZCBvYXMgc3RhdGUgbmVlZCB0byBiZSBzZXQuCisgKgorICogUmV0dXJuczoKKyAqIFNVQ0NFU1M6IHNpemUgb2YgZm9ybWF0dGVkIHN0cmluZy4KKyAqIC1FRkFVTFQ6IHRhcmdldCBvciB2cG9ydCB3d3BuIHdhcyBub3Qgc2V0IHByb3Blcmx5LgorICogLUVQRVJNOiBvYXMgaXMgbm90IGVuYWJsZWQuCisgKiBzaXplIG9mIGZvcm1hdHRlZCBzdHJpbmcuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfbHVuX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKwl1aW50NjRfdCBzY3NpX2x1bjsKKwlzc2l6ZV90IHJjOworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAod3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3ZwdF93d3BuKSA9PSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4pID09IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCFpc2RpZ2l0KGJ1ZlswXSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNzY2FuZihidWYsICIweCVsbHgiLCAmc2NzaV9sdW4pICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCisJCQkiMzM3MiBUcnkgdG8gc2V0IHZwb3J0IDB4JWxseCB0YXJnZXQgMHglbGx4IGx1bjolbGxkICIKKwkJCSJ3aXRoIG9hcyBzZXQgdG8gJWRcbiIsCisJCQl3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4pLAorCQkJd3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3RndF93d3BuKSwgc2NzaV9sdW4sCisJCQlwaGJhLT5jZmdfb2FzX2x1bl9zdGF0ZSk7CisKKwlyYyA9IGxwZmNfb2FzX2x1bl9zdGF0ZV9jaGFuZ2UocGhiYSwgcGhiYS0+Y2ZnX29hc192cHRfd3dwbiwKKwkJCQkJICAgcGhiYS0+Y2ZnX29hc190Z3Rfd3dwbiwgc2NzaV9sdW4sCisJCQkJCSAgIHBoYmEtPmNmZ19vYXNfbHVuX3N0YXRlKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfeGxhbmVfbHVuLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgbHBmY19vYXNfbHVuX3Nob3csIGxwZmNfb2FzX2x1bl9zdG9yZSk7CiAKIHN0YXRpYyBpbnQgbHBmY19wb2xsID0gMDsKIG1vZHVsZV9wYXJhbShscGZjX3BvbGwsIGludCwgU19JUlVHTyk7CkBAIC0zODE4LDcgKzQyODgsNyBAQAogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOwogCXN0cnVjdCBscGZjX3ZlY3Rvcl9tYXBfaW5mbyAqY3B1cDsKLQlpbnQgIGlkeCwgbGVuID0gMDsKKwlpbnQgIGxlbiA9IDA7CiAKIAlpZiAoKHBoYmEtPnNsaV9yZXYgIT0gTFBGQ19TTElfUkVWNCkgfHwKIAkgICAgKHBoYmEtPmludHJfdHlwZSAhPSBNU0lYKSkKQEAgLTM4NDYsMjMgKzQzMTYsMzkgQEAKIAkJYnJlYWs7CiAJfQogCi0JY3B1cCA9IHBoYmEtPnNsaTRfaGJhLmNwdV9tYXA7Ci0JZm9yIChpZHggPSAwOyBpZHggPCBwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHU7IGlkeCsrKSB7CisJd2hpbGUgKHBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUgPCBwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHUpIHsKKwkJY3B1cCA9ICZwaGJhLT5zbGk0X2hiYS5jcHVfbWFwW3BoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHVdOworCisJCS8qIG1hcmdpbiBzaG91bGQgZml0IGluIHRoaXMgYW5kIHRoZSB0cnVuY2F0ZWQgbWVzc2FnZSAqLwogCQlpZiAoY3B1cC0+aXJxID09IExQRkNfVkVDVE9SX01BUF9FTVBUWSkKIAkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sCiAJCQkJCSJDUFUgJTAyZCBpb19jaGFuICUwMmQgIgogCQkJCQkicGh5c2lkICVkIGNvcmVpZCAlZFxuIiwKLQkJCQkJaWR4LCBjcHVwLT5jaGFubmVsX2lkLCBjcHVwLT5waHlzX2lkLAorCQkJCQlwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1LAorCQkJCQljcHVwLT5jaGFubmVsX2lkLCBjcHVwLT5waHlzX2lkLAogCQkJCQljcHVwLT5jb3JlX2lkKTsKIAkJZWxzZQogCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwKIAkJCQkJIkNQVSAlMDJkIGlvX2NoYW4gJTAyZCAiCiAJCQkJCSJwaHlzaWQgJWQgY29yZWlkICVkIElSUSAlZFxuIiwKLQkJCQkJaWR4LCBjcHVwLT5jaGFubmVsX2lkLCBjcHVwLT5waHlzX2lkLAorCQkJCQlwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1LAorCQkJCQljcHVwLT5jaGFubmVsX2lkLCBjcHVwLT5waHlzX2lkLAogCQkJCQljcHVwLT5jb3JlX2lkLCBjcHVwLT5pcnEpOwogCi0JCWNwdXArKzsKKwkJcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSsrOworCisJCS8qIGRpc3BsYXkgbWF4IG51bWJlciBvZiBDUFVzIGtlZXBpbmcgc29tZSBtYXJnaW4gKi8KKwkJaWYgKHBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUgPAorCQkJCXBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdSAmJgorCQkJCShsZW4gPj0gKFBBR0VfU0laRSAtIDY0KSkpIHsKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJtb3JlLi4uXG4iKTsKKwkJCWJyZWFrOworCQl9CiAJfQorCisJaWYgKHBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUgPT0gcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1KQorCQlwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1ID0gMDsKKwogCXJldHVybiBsZW47CiB9CiAKQEAgLTQxNTcsNiArNDY0MywyMSBAQAogTFBGQ19BVFRSX1IoZW5hYmxlX2hiYV9oZWFydGJlYXQsIDAsIDAsIDEsICJFbmFibGUgSEJBIEhlYXJ0YmVhdC4iKTsKIAogLyoKKyMgbHBmY19FbmFibGVYTGFuZTogRW5hYmxlIEV4cHJlc3MgTGFuZSBGZWF0dXJlCisjICAgICAgMHgwICAgRXhwcmVzcyBMYW5lIEZlYXR1cmUgZGlzYWJsZWQKKyMgICAgICAweDEgICBFeHByZXNzIExhbmUgRmVhdHVyZSBlbmFibGVkCisjIFZhbHVlIHJhbmdlIGlzIFswLDFdLiBEZWZhdWx0IHZhbHVlIGlzIDAuCisqLworTFBGQ19BVFRSX1IoRW5hYmxlWExhbmUsIDAsIDAsIDEsICJFbmFibGUgRXhwcmVzcyBMYW5lIEZlYXR1cmUuIik7CisKKy8qCisjIGxwZmNfWExhbmVQcmlvcml0eTogIERlZmluZSBDU19DVEwgcHJpb3JpdHkgZm9yIEV4cHJlc3MgTGFuZSBGZWF0dXJlCisjICAgICAgIDB4MCAtIDB4N2YgID0gQ1NfQ1RMIGZpZWxkIGluIEZDIGhlYWRlciAoaGlnaCA3IGJpdHMpCisjIFZhbHVlIHJhbmdlIGlzIFsweDAsMHg3Zl0uIERlZmF1bHQgdmFsdWUgaXMgMAorKi8KK0xQRkNfQVRUUl9SKFhMYW5lUHJpb3JpdHksIDAsIDB4MCwgMHg3ZiwgIkNTX0NUTCBmb3IgRXhwcmVzcyBMYW5lIEZlYXR1cmUuIik7CisKKy8qCiAjIGxwZmNfZW5hYmxlX2JnOiBFbmFibGUgQmxvY2tHdWFyZCAoRW11bGV4J3MgSW1wbGVtZW50YXRpb24gb2YgVDEwLURJRikKICMgICAgICAgMCAgPSBCbG9ja0d1YXJkIGRpc2FibGVkIChkZWZhdWx0KQogIyAgICAgICAxICA9IEJsb2NrR3VhcmQgZW5hYmxlZApAQCAtNDMxNyw2ICs0ODE4LDEzIEBACiAJJmRldl9hdHRyX2xwZmNfc29mdF93d25fZW5hYmxlLAogCSZkZXZfYXR0cl9scGZjX2VuYWJsZV9oYmFfcmVzZXQsCiAJJmRldl9hdHRyX2xwZmNfZW5hYmxlX2hiYV9oZWFydGJlYXQsCisJJmRldl9hdHRyX2xwZmNfRW5hYmxlWExhbmUsCisJJmRldl9hdHRyX2xwZmNfWExhbmVQcmlvcml0eSwKKwkmZGV2X2F0dHJfbHBmY194bGFuZV9sdW4sCisJJmRldl9hdHRyX2xwZmNfeGxhbmVfdGd0LAorCSZkZXZfYXR0cl9scGZjX3hsYW5lX3ZwdCwKKwkmZGV2X2F0dHJfbHBmY194bGFuZV9sdW5fc3RhdGUsCisJJmRldl9hdHRyX2xwZmNfeGxhbmVfbHVuX3N0YXR1cywKIAkmZGV2X2F0dHJfbHBmY19zZ19zZWdfY250LAogCSZkZXZfYXR0cl9scGZjX21heF9zY3NpY21wbF90aW1lLAogCSZkZXZfYXR0cl9scGZjX3N0YXRfZGF0YV9jdHJsLApAQCAtNDMzNSw2ICs0ODQzLDcgQEAKIAkmZGV2X2F0dHJfbHBmY19kc3MsCiAJJmRldl9hdHRyX2xwZmNfc3Jpb3ZfaHdfbWF4X3ZpcnRmbiwKIAkmZGV2X2F0dHJfcHJvdG9jb2wsCisJJmRldl9hdHRyX2xwZmNfeGxhbmVfc3VwcG9ydGVkLAogCU5VTEwsCiB9OwogCkBAIC01Mjk2LDExICs1ODA1LDIwIEBACiAJbHBmY19mY3BfaW9fY2hhbm5lbF9pbml0KHBoYmEsIGxwZmNfZmNwX2lvX2NoYW5uZWwpOwogCWxwZmNfZW5hYmxlX2hiYV9yZXNldF9pbml0KHBoYmEsIGxwZmNfZW5hYmxlX2hiYV9yZXNldCk7CiAJbHBmY19lbmFibGVfaGJhX2hlYXJ0YmVhdF9pbml0KHBoYmEsIGxwZmNfZW5hYmxlX2hiYV9oZWFydGJlYXQpOworCWxwZmNfRW5hYmxlWExhbmVfaW5pdChwaGJhLCBscGZjX0VuYWJsZVhMYW5lKTsKKwlpZiAocGhiYS0+c2xpX3JldiAhPSBMUEZDX1NMSV9SRVY0KQorCQlwaGJhLT5jZmdfRW5hYmxlWExhbmUgPSAwOworCWxwZmNfWExhbmVQcmlvcml0eV9pbml0KHBoYmEsIGxwZmNfWExhbmVQcmlvcml0eSk7CisJbWVtc2V0KHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4sIDAsICg4ICogc2l6ZW9mKHVpbnQ4X3QpKSk7CisJbWVtc2V0KHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4sIDAsICg4ICogc2l6ZW9mKHVpbnQ4X3QpKSk7CisJcGhiYS0+Y2ZnX29hc19sdW5fc3RhdGUgPSAwOworCXBoYmEtPmNmZ19vYXNfbHVuX3N0YXR1cyA9IDA7CisJcGhiYS0+Y2ZnX29hc19mbGFncyA9IDA7CiAJbHBmY19lbmFibGVfYmdfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9iZyk7CiAJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKIAkJcGhiYS0+Y2ZnX3BvbGwgPSAwOwogCWVsc2UKLQlwaGJhLT5jZmdfcG9sbCA9IGxwZmNfcG9sbDsKKwkJcGhiYS0+Y2ZnX3BvbGwgPSBscGZjX3BvbGw7CiAJcGhiYS0+Y2ZnX3NvZnRfd3dubiA9IDBMOwogCXBoYmEtPmNmZ19zb2Z0X3d3cG4gPSAwTDsKIAlscGZjX3NnX3NlZ19jbnRfaW5pdChwaGJhLCBscGZjX3NnX3NlZ19jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKaW5kZXggODIxMzRkMjAuLmNhMmY0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYwpAQCAtNDE1Myw2ICs0MTUzLDcgQEAKIAkJaWYgKHN1YnN5cyA9PSBTTElfQ09ORklHX1NVQlNZU19GQ09FKSB7CiAJCQlzd2l0Y2ggKG9wY29kZSkgewogCQkJY2FzZSBGQ09FX09QQ09ERV9SRUFEX0ZDRjoKKwkJCWNhc2UgRkNPRV9PUENPREVfR0VUX0RQT1JUX1JFU1VMVFM6CiAJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0xJQkRGQywKIAkJCQkJCSIyOTU3IEhhbmRsZWQgU0xJX0NPTkZJRyAiCiAJCQkJCQkic3Vic3lzX2Zjb2UsIG9wY29kZTp4JXhcbiIsCkBAIC00MTYxLDYgKzQxNjIsOCBAQAogCQkJCQkJCW5lbWJfbXNlLCBkbWFidWYpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBGQ09FX09QQ09ERV9BRERfRkNGOgorCQkJY2FzZSBGQ09FX09QQ09ERV9TRVRfRFBPUlRfTU9ERToKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9GQ09FX0xJTktfRElBR19TVEFURToKIAkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTElCREZDLAogCQkJCQkJIjI5NTggSGFuZGxlZCBTTElfQ09ORklHICIKIAkJCQkJCSJzdWJzeXNfZmNvZSwgb3Bjb2RlOngleFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5oCmluZGV4IDY3ZjdkMGEuLmE5NGQ0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuaApAQCAtMjMxLDYgKzIzMSw4IEBACiAjZGVmaW5lIFNMSV9DT05GSUdfU1VCU1lTX0ZDT0UJCTB4MEMKICNkZWZpbmUgRkNPRV9PUENPREVfUkVBRF9GQ0YJCTB4MDgKICNkZWZpbmUgRkNPRV9PUENPREVfQUREX0ZDRgkJMHgwOQorI2RlZmluZSBGQ09FX09QQ09ERV9TRVRfRFBPUlRfTU9ERQkweDI3CisjZGVmaW5lIEZDT0VfT1BDT0RFX0dFVF9EUE9SVF9SRVNVTFRTCTB4MjgKIH07CiAKIHN0cnVjdCBscGZjX3NsaV9jb25maWdfZW1iMV9zdWJzeXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAppbmRleCBjZGEwNzZhLi5hZGRhMGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaApAQCAtMTg3LDYgKzE4NywxMSBAQAogdm9pZCBscGZjX29mZmxpbmUoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3Jlc2V0X2hiYShzdHJ1Y3QgbHBmY19oYmEgKik7CiAKK2ludCBscGZjX2ZvZl9xdWV1ZV9jcmVhdGUoc3RydWN0IGxwZmNfaGJhICopOworaW50IGxwZmNfZm9mX3F1ZXVlX3NldHVwKHN0cnVjdCBscGZjX2hiYSAqKTsKK2ludCBscGZjX2ZvZl9xdWV1ZV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqKTsKK2lycXJldHVybl90IGxwZmNfc2xpNF9mb2ZfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqKTsKKwogaW50IGxwZmNfc2xpX3NldHVwKHN0cnVjdCBscGZjX2hiYSAqKTsKIGludCBscGZjX3NsaV9xdWV1ZV9zZXR1cChzdHJ1Y3QgbHBmY19oYmEgKik7CiAKQEAgLTI0Miw2ICsyNDcsNyBAQAogdm9pZCBscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrKHN0cnVjdCBscGZjX2hiYSAqKTsKIAogaW50IGxwZmNfbWVtX2FsbG9jKHN0cnVjdCBscGZjX2hiYSAqLCBpbnQgYWxpZ24pOworaW50IGxwZmNfbWVtX2FsbG9jX2FjdGl2ZV9ycnFfcG9vbF9zNChzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfbWVtX2ZyZWUoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX21lbV9mcmVlX2FsbChzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfc3RvcF92cG9ydF90aW1lcnMoc3RydWN0IGxwZmNfdnBvcnQgKik7CkBAIC0zOTksNyArNDA1LDYgQEAKIHZvaWQgbHBmY191bmJsb2NrX2ZhYnJpY19pb2NicyhzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfcmFtcGRvd25fcXVldWVfZGVwdGgoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3JhbXBfZG93bl9xdWV1ZV9oYW5kbGVyKHN0cnVjdCBscGZjX2hiYSAqKTsKLXZvaWQgbHBmY19yYW1wX3VwX3F1ZXVlX2hhbmRsZXIoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3Njc2lfZGV2X2Jsb2NrKHN0cnVjdCBscGZjX2hiYSAqKTsKIAogdm9pZApAQCAtNDcxLDMgKzQ3NiwyMCBAQAogdWludDMyX3QgbHBmY19zbGlfcG9ydF9zcGVlZF9nZXQoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpNF9yZXF1ZXN0X2Zpcm13YXJlX3VwZGF0ZShzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDhfdCk7CiB2b2lkIGxwZmNfc2xpNF9vZmZsaW5lX2VyYXR0KHN0cnVjdCBscGZjX2hiYSAqKTsKKworc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmxwZmNfY3JlYXRlX2RldmljZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqLAorCQkJCQkJc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJCQkJc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJCQkJdWludDY0X3QsIGJvb2wpOwordm9pZCBscGZjX2RlbGV0ZV9kZXZpY2VfZGF0YShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEqKTsKK3N0cnVjdCBscGZjX2RldmljZV9kYXRhICpfX2xwZmNfZ2V0X2RldmljZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCQlzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkJCXN0cnVjdCBscGZjX25hbWUgKiwgdWludDY0X3QpOworYm9vbCBscGZjX2VuYWJsZV9vYXNfbHVuKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkgc3RydWN0IGxwZmNfbmFtZSAqLCB1aW50NjRfdCk7Citib29sIGxwZmNfZGlzYWJsZV9vYXNfbHVuKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkgIHN0cnVjdCBscGZjX25hbWUgKiwgdWludDY0X3QpOworYm9vbCBscGZjX2ZpbmRfbmV4dF9vYXNfbHVuKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkgICAgc3RydWN0IGxwZmNfbmFtZSAqLCB1aW50NjRfdCAqLCBzdHJ1Y3QgbHBmY19uYW1lICosCisJCQkgICAgc3RydWN0IGxwZmNfbmFtZSAqLCB1aW50NjRfdCAqLCB1aW50MzJfdCAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMKaW5kZXggYjgwMGNjOS4uODI4YzA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMKQEAgLTIyODAsNiArMjI4MCwxMDQgQEAKIAkJfQogCX0KIAorCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCS8qIEZPRiBFUSAqLworCQlxcCA9IHBoYmEtPnNsaTRfaGJhLmZvZl9lcTsKKwkJaWYgKCFxcCkKKwkJCWdvdG8gb3V0OworCisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCSJcbkZPRiBFUSBpbmZvOiAiCisJCQkiRVEtU1RBVFttYXg6eCV4IG5vRTp4JXggIgorCQkJImJzOngleCBwcm9jOnglbGx4XVxuIiwKKwkJCXFwLT5xX2NudF8xLCBxcC0+cV9jbnRfMiwKKwkJCXFwLT5xX2NudF8zLCAodW5zaWduZWQgbG9uZyBsb25nKXFwLT5xX2NudF80KTsKKworCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkiRVFJRFslMDJkXSwgIgorCQkJIlFFLUNOVFslMDRkXSwgUUUtU0laRVslMDRkXSwgIgorCQkJIkhPU1QtSURYWyUwNGRdLCBQT1JULUlEWFslMDRkXSIsCisJCQlxcC0+cXVldWVfaWQsCisJCQlxcC0+ZW50cnlfY291bnQsCisJCQlxcC0+ZW50cnlfc2l6ZSwKKwkJCXFwLT5ob3N0X2luZGV4LAorCQkJcXAtPmhiYV9pbmRleCk7CisKKwkJLyogUmVzZXQgbWF4IGNvdW50ZXIgKi8KKwkJcXAtPkVRX21heF9lcWUgPSAwOworCisJCWxlbiArPSAgc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sICJcbiIpOworCQlpZiAobGVuID49IG1heF9jbnQpCisJCQlnb3RvIHRvb19iaWc7CisJfQorCisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgeworCisJCS8qIE9BUyBDUSAqLworCQlxcCA9IHBoYmEtPnNsaTRfaGJhLm9hc19jcTsKKwkJaWYgKHFwKSB7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJCSJcdE9BUyBDUSBpbmZvOiAiKTsKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkJIkFzc29jRVFJRFslMDJkXTogIgorCQkJCSJDUSBTVEFUW21heDp4JXggcmVsdzp4JXggIgorCQkJCSJ4YWJ0OngleCB3cTp4JWxseF1cbiIsCisJCQkJcXAtPmFzc29jX3FpZCwKKwkJCQlxcC0+cV9jbnRfMSwgcXAtPnFfY250XzIsCisJCQkJcXAtPnFfY250XzMsICh1bnNpZ25lZCBsb25nIGxvbmcpcXAtPnFfY250XzQpOworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRDUUlEWyUwMmRdLCAiCisJCQkJIlFFLUNOVFslMDRkXSwgUUUtU0laRVslMDRkXSwgIgorCQkJCSJIT1NULUlEWFslMDRkXSwgUE9SVC1JRFhbJTA0ZF0iLAorCQkJCXFwLT5xdWV1ZV9pZCwgcXAtPmVudHJ5X2NvdW50LAorCQkJCXFwLT5lbnRyeV9zaXplLCBxcC0+aG9zdF9pbmRleCwKKwkJCQlxcC0+aGJhX2luZGV4KTsKKworCQkJLyogUmVzZXQgbWF4IGNvdW50ZXIgKi8KKwkJCXFwLT5DUV9tYXhfY3FlID0gMDsKKworCQkJbGVuICs9ICBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sICJcbiIpOworCQkJaWYgKGxlbiA+PSBtYXhfY250KQorCQkJCWdvdG8gdG9vX2JpZzsKKwkJfQorCisJCS8qIE9BUyBXUSAqLworCQlxcCA9IHBoYmEtPnNsaTRfaGJhLm9hc193cTsKKwkJaWYgKHFwKSB7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJCSJcdFx0T0FTIFdRIGluZm86ICIpOworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCQkiQXNzb2NDUUlEWyUwMmRdOiAiCisJCQkJIldRLVNUQVRbb2Zsb3c6eCV4IHBvc3RlZDp4JWxseF1cbiIsCisJCQkJcXAtPmFzc29jX3FpZCwKKwkJCQlxcC0+cV9jbnRfMSwgKHVuc2lnbmVkIGxvbmcgbG9uZylxcC0+cV9jbnRfNCk7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJCSJcdFx0V1FJRFslMDJkXSwgIgorCQkJCSJRRS1DTlRbJTA0ZF0sIFFFLVNJWkVbJTA0ZF0sICIKKwkJCQkiSE9TVC1JRFhbJTA0ZF0sIFBPUlQtSURYWyUwNGRdIiwKKwkJCQlxcC0+cXVldWVfaWQsCisJCQkJcXAtPmVudHJ5X2NvdW50LAorCQkJCXFwLT5lbnRyeV9zaXplLAorCQkJCXFwLT5ob3N0X2luZGV4LAorCQkJCXFwLT5oYmFfaW5kZXgpOworCisJCQlsZW4gKz0gIHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwgIlxuIik7CisJCQlpZiAobGVuID49IG1heF9jbnQpCisJCQkJZ290byB0b29fYmlnOworCQl9CisJfQorb3V0OgogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYnVmZmVyLCBsZW4pOwogCkBAIC0zOTI3LDYgKzQwMjUsNyBAQAogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJY2hhciBuYW1lWzY0XTsKIAl1aW50MzJfdCBudW0sIGk7CisJYm9vbCBwcG9ydF9zZXR1cCA9IGZhbHNlOwogCiAJaWYgKCFscGZjX2RlYnVnZnNfZW5hYmxlKQogCQlyZXR1cm47CkBAIC0zOTQ3LDYgKzQwNDYsNyBAQAogCS8qIFNldHVwIGZ1bmNYIGRpcmVjdG9yeSBmb3Igc3BlY2lmaWMgSEJBIFBDSSBmdW5jdGlvbiAqLwogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImZuJWQiLCBwaGJhLT5icmRfbm8pOwogCWlmICghcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCkgeworCQlwcG9ydF9zZXR1cCA9IHRydWU7CiAJCXBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QgPQogCQkJZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIGxwZmNfZGVidWdmc19yb290KTsKIAkJaWYgKCFwaGJhLT5oYmFfZGVidWdmc19yb290KSB7CkBAIC00MjM5LDYgKzQzMzksMTQgQEAKIAl9CiAKIAkvKgorCSAqIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBpcyBmb3IgYWRkaXRpb25hbCBkaXJlY3Rvcmllcy9maWxlcyBmb3IgdGhlCisJICogcGh5c2ljYWwgcG9ydC4KKwkgKi8KKworCWlmICghcHBvcnRfc2V0dXApCisJCWdvdG8gZGVidWdfZmFpbGVkOworCisJLyoKIAkgKiBpRGlhZyBkZWJ1Z2ZzIHJvb3QgZW50cnkgcG9pbnRzIGZvciBTTEk0IGRldmljZSBvbmx5CiAJICovCiAJaWYgKHBoYmEtPnNsaV9yZXYgPCBMUEZDX1NMSV9SRVY0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Rpc2MuaAppbmRleCBlNDA5YmE1Li4xYTZmZTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Rpc2MuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Rpc2MuaApAQCAtMTE2LDcgKzExNiw3IEBACiAJYXRvbWljX3QgY21kX3BlbmRpbmc7CiAJdWludDMyX3QgY21kX3FkZXB0aDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfY2hhbmdlX3RpbWU7Ci0Jc3RydWN0IGxwZmNfbm9kZV9ycnFzIGFjdGl2ZV9ycnFzOworCXVuc2lnbmVkIGxvbmcgKmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXA7CiAJc3RydWN0IGxwZmNfc2NzaWNtZF9ia3QgKmxhdF9kYXRhOwkvKiBMYXRlbmN5IGRhdGEgKi8KIH07CiBzdHJ1Y3QgbHBmY19ub2RlX3JycSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwppbmRleCAxMTA0NDVmLi42MjRmZTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTE1MTYsNyArMTUxNiw3IEBACiAJdWludDMyX3QgcmMsIGtlZXBESUQgPSAwOwogCWludCAgcHV0X25vZGU7CiAJaW50ICBwdXRfcnBvcnQ7Ci0Jc3RydWN0IGxwZmNfbm9kZV9ycnFzIHJycTsKKwl1bnNpZ25lZCBsb25nICphY3RpdmVfcnJxc194cmlfYml0bWFwID0gTlVMTDsKIAogCS8qIEZhYnJpYyBub2RlcyBjYW4gaGF2ZSB0aGUgc2FtZSBXV1BOIHNvIHdlIGRvbid0IGJvdGhlciBzZWFyY2hpbmcKIAkgKiBieSBXV1BOLiAgSnVzdCByZXR1cm4gdGhlIG5kbHAgdGhhdCB3YXMgZ2l2ZW4gdG8gdXMuCkBAIC0xNTM0LDcgKzE1MzQsMTMgQEAKIAogCWlmIChuZXdfbmRscCA9PSBuZGxwICYmIE5MUF9DSEtfTk9ERV9BQ1QobmV3X25kbHApKQogCQlyZXR1cm4gbmRscDsKLQltZW1zZXQoJnJycS54cmlfYml0bWFwLCAwLCBzaXplb2YobmV3X25kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSB7CisJCWFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAgPSBtZW1wb29sX2FsbG9jKHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCwKKwkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQltZW1zZXQoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwgMCwKKwkJCSAgICAgICBwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3opOworCX0KIAogCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0VMUywKIAkJICIzMTc4IFBMT0dJIGNvbmZpcm06IG5kbHAgJXAgeCV4OiBuZXdfbmRscCAlcFxuIiwKQEAgLTE1NDMsNDEgKzE1NDksNTggQEAKIAlpZiAoIW5ld19uZGxwKSB7CiAJCXJjID0gbWVtY21wKCZuZGxwLT5ubHBfcG9ydG5hbWUsIG5hbWUsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKLQkJaWYgKCFyYykKKwkJaWYgKCFyYykgeworCQkJaWYgKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQkJbWVtcG9vbF9mcmVlKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkJCSAgICAgcGhiYS0+YWN0aXZlX3JycV9wb29sKTsKIAkJCXJldHVybiBuZGxwOworCQl9CiAJCW5ld19uZGxwID0gbWVtcG9vbF9hbGxvYyhwaGJhLT5ubHBfbWVtX3Bvb2wsIEdGUF9BVE9NSUMpOwotCQlpZiAoIW5ld19uZGxwKQorCQlpZiAoIW5ld19uZGxwKSB7CisJCQlpZiAoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCQltZW1wb29sX2ZyZWUoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCQkJICAgICBwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpOwogCQkJcmV0dXJuIG5kbHA7CisJCX0KIAkJbHBmY19ubHBfaW5pdCh2cG9ydCwgbmV3X25kbHAsIG5kbHAtPm5scF9ESUQpOwogCX0gZWxzZSBpZiAoIU5MUF9DSEtfTk9ERV9BQ1QobmV3X25kbHApKSB7CiAJCXJjID0gbWVtY21wKCZuZGxwLT5ubHBfcG9ydG5hbWUsIG5hbWUsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKLQkJaWYgKCFyYykKKwkJaWYgKCFyYykgeworCQkJaWYgKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQkJbWVtcG9vbF9mcmVlKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkJCSAgICAgcGhiYS0+YWN0aXZlX3JycV9wb29sKTsKIAkJCXJldHVybiBuZGxwOworCQl9CiAJCW5ld19uZGxwID0gbHBmY19lbmFibGVfbm9kZSh2cG9ydCwgbmV3X25kbHAsCiAJCQkJCQlOTFBfU1RFX1VOVVNFRF9OT0RFKTsKLQkJaWYgKCFuZXdfbmRscCkKKwkJaWYgKCFuZXdfbmRscCkgeworCQkJaWYgKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQkJbWVtcG9vbF9mcmVlKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkJCSAgICAgcGhiYS0+YWN0aXZlX3JycV9wb29sKTsKIAkJCXJldHVybiBuZGxwOworCQl9CiAJCWtlZXBESUQgPSBuZXdfbmRscC0+bmxwX0RJRDsKLQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKLQkJCW1lbWNweSgmcnJxLnhyaV9iaXRtYXAsCi0JCQkJJm5ld19uZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwLAotCQkJCXNpemVvZihuZXdfbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpOworCQlpZiAoKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgJiYgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCW1lbWNweShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIG5ld19uZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIHBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeik7CiAJfSBlbHNlIHsKIAkJa2VlcERJRCA9IG5ld19uZGxwLT5ubHBfRElEOwotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQotCQkJbWVtY3B5KCZycnEueHJpX2JpdG1hcCwKLQkJCQkmbmV3X25kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXAsCi0JCQkJc2l6ZW9mKG5ld19uZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSk7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQgJiYKKwkJICAgIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQltZW1jcHkoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBuZXdfbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3opOwogCX0KIAogCWxwZmNfdW5yZWdfcnBpKHZwb3J0LCBuZXdfbmRscCk7CiAJbmV3X25kbHAtPm5scF9ESUQgPSBuZGxwLT5ubHBfRElEOwogCW5ld19uZGxwLT5ubHBfcHJldl9zdGF0ZSA9IG5kbHAtPm5scF9wcmV2X3N0YXRlOwogCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCi0JCW1lbWNweShuZXdfbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCwKLQkJCSZuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwLAotCQkJc2l6ZW9mKG5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKTsKKwkJbWVtY3B5KG5ld19uZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkgICAgICAgbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJICAgICAgIHBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeik7CiAKIAlpZiAobmRscC0+bmxwX2ZsYWcgJiBOTFBfTlBSXzJCX0RJU0MpCiAJCW5ld19uZGxwLT5ubHBfZmxhZyB8PSBOTFBfTlBSXzJCX0RJU0M7CkBAIC0xNjE5LDEwICsxNjQyLDExIEBACiAKIAkJLyogVHdvIG5kbHBzIGNhbm5vdCBoYXZlIHRoZSBzYW1lIGRpZCBvbiB0aGUgbm9kZWxpc3QgKi8KIAkJbmRscC0+bmxwX0RJRCA9IGtlZXBESUQ7Ci0JCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCi0JCQltZW1jcHkoJm5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXAsCi0JCQkJJnJycS54cmlfYml0bWFwLAotCQkJCXNpemVvZihuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSk7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQgJiYKKwkJICAgIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQltZW1jcHkobmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIHBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeik7CiAJCWxwZmNfZHJvcF9ub2RlKHZwb3J0LCBuZGxwKTsKIAl9CiAJZWxzZSB7CkBAIC0xNjM0LDEwICsxNjU4LDExIEBACiAKIAkJLyogVHdvIG5kbHBzIGNhbm5vdCBoYXZlIHRoZSBzYW1lIGRpZCAqLwogCQluZGxwLT5ubHBfRElEID0ga2VlcERJRDsKLQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKLQkJCW1lbWNweSgmbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCwKLQkJCQkmcnJxLnhyaV9iaXRtYXAsCi0JCQkJc2l6ZW9mKG5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKTsKKwkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCAmJgorCQkgICAgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJCW1lbWNweShuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6KTsKIAogCQkvKiBTaW5jZSB3ZSBhcmUgc3dhcHBpbmcgdGhlIG5kbHAgcGFzc2VkIGluIHdpdGggdGhlIG5ldyBvbmUKIAkJICogYW5kIHRoZSBkaWQgaGFzIGFscmVhZHkgYmVlbiBzd2FwcGVkLCBjb3B5IG92ZXIgc3RhdGUuCkBAIC0xNjY4LDYgKzE2OTMsMTAgQEAKIAkJCQlwdXRfZGV2aWNlKCZycG9ydC0+ZGV2KTsKIAkJfQogCX0KKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0ICYmCisJICAgIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCW1lbXBvb2xfZnJlZShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICBwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpOwogCXJldHVybiBuZXdfbmRscDsKIH0KIApAQCAtMjc3Miw2ICsyODAxLDcgQEAKIAkvKiBUaGlzIHdpbGwgY2F1c2UgdGhlIGNhbGxiYWNrLWZ1bmN0aW9uIGxwZmNfY21wbF9lbHNfY21kIHRvCiAJICogdHJpZ2dlciB0aGUgcmVsZWFzZSBvZiBub2RlLgogCSAqLworCiAJbHBmY19ubHBfcHV0KG5kbHApOwogCXJldHVybiAwOwogfQpAQCAtNjE5MywxMSArNjIyMywxMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZwb3J0LT53b3JrX3BvcnRfbG9jaywgaWZsYWcpOwogCXRtb19wb3N0ZWQgPSB2cG9ydC0+d29ya19wb3J0X2V2ZW50cyAmIFdPUktFUl9FTFNfVE1POwotCWlmICghdG1vX3Bvc3RlZCkKKwlpZiAoKCF0bW9fcG9zdGVkKSAmJiAoISh2cG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkpCiAJCXZwb3J0LT53b3JrX3BvcnRfZXZlbnRzIHw9IFdPUktFUl9FTFNfVE1POwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwb3J0LT53b3JrX3BvcnRfbG9jaywgaWZsYWcpOwogCi0JaWYgKCF0bW9fcG9zdGVkKQorCWlmICgoIXRtb19wb3N0ZWQpICYmICghKHZwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKSkKIAkJbHBmY193b3JrZXJfd2FrZV91cChwaGJhKTsKIAlyZXR1cm47CiB9CkBAIC02MjIzLDE5ICs2MjUzLDI2IEBACiAJdWludDMyX3QgZWxzX2NvbW1hbmQgPSAwOwogCXVpbnQzMl90IHRpbWVvdXQ7CiAJdWludDMyX3QgcmVtb3RlX0lEID0gMHhmZmZmZmZmZjsKLQlMSVNUX0hFQUQodHhjbXBscV9jb21wbGV0aW9ucyk7CiAJTElTVF9IRUFEKGFib3J0X2xpc3QpOwogCiAKIAl0aW1lb3V0ID0gKHVpbnQzMl90KShwaGJhLT5mY19yYXRvdiA8PCAxKTsKIAogCXByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddOwotCisJaWYgKChwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkKKwkJcmV0dXJuOwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCWxpc3Rfc3BsaWNlX2luaXQoJnByaW5nLT50eGNtcGxxLCAmdHhjbXBscV9jb21wbGV0aW9ucyk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX2xvY2soJnByaW5nLT5yaW5nX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnR4Y21wbHFfY29tcGxldGlvbnMsIGxpc3QpIHsKKwlpZiAoKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKSB7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCQlzcGluX3VubG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmcHJpbmctPnR4Y21wbHEsIGxpc3QpIHsKIAkJY21kID0gJnBpb2NiLT5pb2NiOwogCiAJCWlmICgocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fTElCREZDKSAhPSAwIHx8CkBAIC02Mjc0LDExICs2MzExLDEyIEBACiAJCX0KIAkJbGlzdF9hZGRfdGFpbCgmcGlvY2ItPmRsaXN0LCAmYWJvcnRfbGlzdCk7CiAJfQotCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCWxpc3Rfc3BsaWNlKCZ0eGNtcGxxX2NvbXBsZXRpb25zLCAmcHJpbmctPnR4Y21wbHEpOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fdW5sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJmFib3J0X2xpc3QsIGRsaXN0KSB7CisJCWNtZCA9ICZwaW9jYi0+aW9jYjsKIAkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19FTFMsCiAJCQkgIjAxMjcgRUxTIHRpbWVvdXQgRGF0YTogeCV4IHgleCB4JXggIgogCQkJICJ4JXhcbiIsIGVsc19jb21tYW5kLApAQCAtNjI5MCw4ICs2MzI4LDkgQEAKIAl9CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddLnR4Y21wbHEpKQotCQltb2RfdGltZXIoJnZwb3J0LT5lbHNfdG1vZnVuYywKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCAqIHRpbWVvdXQpKTsKKwkJaWYgKCEocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpCisJCQltb2RfdGltZXIoJnZwb3J0LT5lbHNfdG1vZnVuYywKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDAgKiB0aW1lb3V0KSk7CiB9CiAKIC8qKgpAQCAtNjMxNywxNSArNjM1Niw1MCBAQAogdm9pZAogbHBmY19lbHNfZmx1c2hfY21kKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCkKIHsKLQlMSVNUX0hFQUQoY29tcGxldGlvbnMpOworCUxJU1RfSEVBRChhYm9ydF9saXN0KTsKIAlzdHJ1Y3QgbHBmY19oYmEgICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddOwogCXN0cnVjdCBscGZjX2lvY2JxICp0bXBfaW9jYiwgKnBpb2NiOwogCUlPQ0JfdCAqY21kID0gTlVMTDsKIAogCWxwZmNfZmFicmljX2Fib3J0X3Zwb3J0KHZwb3J0KTsKKwkvKgorCSAqIEZvciBTTEkzLCBvbmx5IHRoZSBoYmFsb2NrIGlzIHJlcXVpcmVkLiAgQnV0IFNMSTQgbmVlZHMgdG8gY29vcmRpbmF0ZQorCSAqIHdpdGggdGhlIHJpbmcgaW5zZXJ0IG9wZXJhdGlvbi4gIEJlY2F1c2UgbHBmY19zbGlfaXNzdWVfYWJvcnRfaW90YWcKKwkgKiB1bHRpbWF0ZWx5IGdyYWJzIHRoZSByaW5nX2xvY2ssIHRoZSBkcml2ZXIgbXVzdCBzcGxpY2UgdGhlIGxpc3QgaW50bworCSAqIGEgd29ya2luZyBsaXN0IGFuZCByZWxlYXNlIHRoZSBsb2NrcyBiZWZvcmUgY2FsbGluZyB0aGUgYWJvcnQuCisJICovCisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl9sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhjbXBscSwgbGlzdCkgeworCQlpZiAocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fTElCREZDKQorCQkJY29udGludWU7CisKKwkJaWYgKHBpb2NiLT52cG9ydCAhPSB2cG9ydCkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2FkZF90YWlsKCZwaW9jYi0+ZGxpc3QsICZhYm9ydF9saXN0KTsKKwl9CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl91bmxvY2soJnByaW5nLT5yaW5nX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJLyogQWJvcnQgZWFjaCBpb2NiIG9uIHRoZSBhYm9ydGVkIGxpc3QgYW5kIHJlbW92ZSB0aGUgZGxpc3QgbGlua3MuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJmFib3J0X2xpc3QsIGRsaXN0KSB7CisJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQlsaXN0X2RlbF9pbml0KCZwaW9jYi0+ZGxpc3QpOworCQlscGZjX3NsaV9pc3N1ZV9hYm9ydF9pb3RhZyhwaGJhLCBwcmluZywgcGlvY2IpOworCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmFib3J0X2xpc3QpKQorCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0VMUywKKwkJCQkgIjMzODcgYWJvcnQgbGlzdCBmb3IgdHhxIG5vdCBlbXB0eVxuIik7CisJSU5JVF9MSVNUX0hFQUQoJmFib3J0X2xpc3QpOwogCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl9sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhxLCBsaXN0KSB7CiAJCWNtZCA9ICZwaW9jYi0+aW9jYjsKIApAQCAtNjM0MywyNCArNjQxNywxNiBAQAogCQlpZiAocGlvY2ItPnZwb3J0ICE9IHZwb3J0KQogCQkJY29udGludWU7CiAKLQkJbGlzdF9tb3ZlX3RhaWwoJnBpb2NiLT5saXN0LCAmY29tcGxldGlvbnMpOworCQlsaXN0X2RlbF9pbml0KCZwaW9jYi0+bGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBpb2NiLT5saXN0LCAmYWJvcnRfbGlzdCk7CiAJfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnByaW5nLT50eGNtcGxxLCBsaXN0KSB7Ci0JCWlmIChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19MSUJERkMpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHBpb2NiLT52cG9ydCAhPSB2cG9ydCkKLQkJCWNvbnRpbnVlOwotCi0JCWxwZmNfc2xpX2lzc3VlX2Fib3J0X2lvdGFnKHBoYmEsIHByaW5nLCBwaW9jYik7Ci0JfQorCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fdW5sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCiAJLyogQ2FuY2VsbCBhbGwgdGhlIElPQ0JzIGZyb20gdGhlIGNvbXBsZXRpb25zIGxpc3QgKi8KLQlscGZjX3NsaV9jYW5jZWxfaW9jYnMocGhiYSwgJmNvbXBsZXRpb25zLCBJT1NUQVRfTE9DQUxfUkVKRUNULAotCQkJICAgICAgSU9FUlJfU0xJX0FCT1JURUQpOworCWxwZmNfc2xpX2NhbmNlbF9pb2NicyhwaGJhLCAmYWJvcnRfbGlzdCwKKwkJCSAgICAgIElPU1RBVF9MT0NBTF9SRUpFQ1QsIElPRVJSX1NMSV9BQk9SVEVEKTsKIAogCXJldHVybjsKIH0KQEAgLTYzODUsMzUgKzY0NTEsOSBAQAogdm9pZAogbHBmY19lbHNfZmx1c2hfYWxsX2NtZChzdHJ1Y3QgbHBmY19oYmEgICpwaGJhKQogewotCUxJU1RfSEVBRChjb21wbGV0aW9ucyk7Ci0Jc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddOwotCXN0cnVjdCBscGZjX2lvY2JxICp0bXBfaW9jYiwgKnBpb2NiOwotCUlPQ0JfdCAqY21kID0gTlVMTDsKLQotCWxwZmNfZmFicmljX2Fib3J0X2hiYShwaGJhKTsKLQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmcHJpbmctPnR4cSwgbGlzdCkgewotCQljbWQgPSAmcGlvY2ItPmlvY2I7Ci0JCWlmIChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19MSUJERkMpCi0JCQljb250aW51ZTsKLQkJLyogRG8gbm90IGZsdXNoIG91dCB0aGUgUVVFX1JJTkcgYW5kIEFCT1JUL0NMT1NFIGlvY2JzICovCi0JCWlmIChjbWQtPnVscENvbW1hbmQgPT0gQ01EX1FVRV9SSU5HX0JVRl9DTiB8fAotCQkgICAgY21kLT51bHBDb21tYW5kID09IENNRF9RVUVfUklOR19CVUY2NF9DTiB8fAotCQkgICAgY21kLT51bHBDb21tYW5kID09IENNRF9DTE9TRV9YUklfQ04gfHwKLQkJICAgIGNtZC0+dWxwQ29tbWFuZCA9PSBDTURfQUJPUlRfWFJJX0NOKQotCQkJY29udGludWU7Ci0JCWxpc3RfbW92ZV90YWlsKCZwaW9jYi0+bGlzdCwgJmNvbXBsZXRpb25zKTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnByaW5nLT50eGNtcGxxLCBsaXN0KSB7Ci0JCWlmIChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19MSUJERkMpCi0JCQljb250aW51ZTsKLQkJbHBmY19zbGlfaXNzdWVfYWJvcnRfaW90YWcocGhiYSwgcHJpbmcsIHBpb2NiKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQotCS8qIENhbmNlbCBhbGwgdGhlIElPQ0JzIGZyb20gdGhlIGNvbXBsZXRpb25zIGxpc3QgKi8KLQlscGZjX3NsaV9jYW5jZWxfaW9jYnMocGhiYSwgJmNvbXBsZXRpb25zLCBJT1NUQVRfTE9DQUxfUkVKRUNULAotCQkJICAgICAgSU9FUlJfU0xJX0FCT1JURUQpOworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwb3J0LCAmcGhiYS0+cG9ydF9saXN0LCBsaXN0ZW50cnkpCisJCWxwZmNfZWxzX2ZsdXNoX2NtZCh2cG9ydCk7CiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCmluZGV4IDg4M2VhMmQuLjU5YjUxYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCkBAIC02NzQsOCArNjc0LDYgQEAKIAkJCQlscGZjX2ZkbWlfdGltZW91dF9oYW5kbGVyKHZwb3J0KTsKIAkJCWlmICh3b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX1JBTVBfRE9XTl9RVUVVRSkKIAkJCQlscGZjX3JhbXBfZG93bl9xdWV1ZV9oYW5kbGVyKHBoYmEpOwotCQkJaWYgKHdvcmtfcG9ydF9ldmVudHMgJiBXT1JLRVJfUkFNUF9VUF9RVUVVRSkKLQkJCQlscGZjX3JhbXBfdXBfcXVldWVfaGFuZGxlcihwaGJhKTsKIAkJCWlmICh3b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX0RFTEFZRURfRElTQ19UTU8pCiAJCQkJbHBmY19kZWxheWVkX2Rpc2NfdGltZW91dF9oYW5kbGVyKHZwb3J0KTsKIAkJfQpAQCAtMjU0NSw4ICsyNTQzLDExIEBACiAJaWYgKCFuZXdfZmNmX3JlY29yZCkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRklQLAogCQkJCSIyNzY2IE1haWxib3ggY29tbWFuZCBSRUFEX0ZDRl9SRUNPUkQgIgotCQkJCSJmYWlsZWQgdG8gcmV0cmlldmUgYSBGQ0YgcmVjb3JkLlxuIik7Ci0JCWdvdG8gZXJyb3Jfb3V0OworCQkJCSJmYWlsZWQgdG8gcmV0cmlldmUgYSBGQ0YgcmVjb3JkLiAiCisJCQkJImhiYV9mbGcgeCV4IGZjZl9mbGcgeCV4XG4iLCBwaGJhLT5oYmFfZmxhZywKKwkJCQlwaGJhLT5mY2YuZmNmX2ZsYWcpOworCQlscGZjX3VucmVnaXN0ZXJfZmNmX3Jlc2NhbihwaGJhKTsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogR2V0IHRoZSBuZWVkZWQgcGFyYW1ldGVycyBmcm9tIEZDRiByZWNvcmQgKi8KQEAgLTM5NzMsNyArMzk3NCwxMCBAQAogCQl2cG9ydC0+ZmNfbWFwX2NudCArPSBjb3VudDsKIAkJYnJlYWs7CiAJY2FzZSBOTFBfU1RFX05QUl9OT0RFOgotCQl2cG9ydC0+ZmNfbnByX2NudCArPSBjb3VudDsKKwkJaWYgKHZwb3J0LT5mY19ucHJfY250ID09IDAgJiYgY291bnQgPT0gLTEpCisJCQl2cG9ydC0+ZmNfbnByX2NudCA9IDA7CisJCWVsc2UKKwkJCXZwb3J0LT5mY19ucHJfY250ICs9IGNvdW50OwogCQlicmVhazsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwpAQCAtNDE4MCw2ICs0MTg0LDcgQEAKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAl1aW50MzJfdCBkaWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nICphY3RpdmVfcnJxc194cmlfYml0bWFwID0gTlVMTDsKIAogCWlmICghbmRscCkKIAkJcmV0dXJuIE5VTEw7CkBAIC00MjA4LDEyICs0MjEzLDE3IEBACiAKIAkvKiBLZWVwIHRoZSBvcmlnaW5hbCBESUQgKi8KIAlkaWQgPSBuZGxwLT5ubHBfRElEOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCWFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAgPSBuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwOwogCiAJLyogcmUtaW5pdGlhbGl6ZSBuZGxwIGV4Y2VwdCBvZiBuZGxwIGxpbmtlZCBsaXN0IHBvaW50ZXIgKi8KIAltZW1zZXQoKCgoY2hhciAqKW5kbHApICsgc2l6ZW9mIChzdHJ1Y3QgbGlzdF9oZWFkKSksIDAsCiAJCXNpemVvZiAoc3RydWN0IGxwZmNfbm9kZWxpc3QpIC0gc2l6ZW9mIChzdHJ1Y3QgbGlzdF9oZWFkKSk7CiAJbHBmY19pbml0aWFsaXplX25vZGUodnBvcnQsIG5kbHAsIGRpZCk7CiAKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQluZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwID0gYWN0aXZlX3JycXNfeHJpX2JpdG1hcDsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPm5kbHBfbG9jaywgZmxhZ3MpOwogCWlmICh2cG9ydC0+cGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQogCQluZGxwLT5ubHBfcnBpID0gbHBmY19zbGk0X2FsbG9jX3JwaSh2cG9ydC0+cGhiYSk7CkBAIC00Nzk5LDkgKzQ4MDksMTAgQEAKIAkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3JwaSAmIDB4ZmYpKTsKIAkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX05PREUsCiAJCQkJCSAiMDkyOSBGSU5EIG5vZGUgRElEICIKLQkJCQkJICJEYXRhOiB4JXAgeCV4IHgleCB4JXhcbiIsCisJCQkJCSAiRGF0YTogeCVwIHgleCB4JXggeCV4ICVwXG4iLAogCQkJCQkgbmRscCwgbmRscC0+bmxwX0RJRCwKLQkJCQkJIG5kbHAtPm5scF9mbGFnLCBkYXRhMSk7CisJCQkJCSBuZGxwLT5ubHBfZmxhZywgZGF0YTEsCisJCQkJCSBuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwKTsKIAkJCXJldHVybiBuZGxwOwogCQl9CiAJfQpAQCAtNTYxOCw4ICs1NjI5LDEzIEBACiAKIAlscGZjX2luaXRpYWxpemVfbm9kZSh2cG9ydCwgbmRscCwgZGlkKTsKIAlJTklUX0xJU1RfSEVBRCgmbmRscC0+bmxwX2xpc3RwKTsKLQlpZiAodnBvcnQtPnBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwlpZiAodnBvcnQtPnBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgewogCQluZGxwLT5ubHBfcnBpID0gbHBmY19zbGk0X2FsbG9jX3JwaSh2cG9ydC0+cGhiYSk7CisJCW5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAgPQorCQkJCW1lbXBvb2xfYWxsb2ModnBvcnQtPnBoYmEtPmFjdGl2ZV9ycnFfcG9vbCwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJfQorCiAKIAogCWxwZmNfZGVidWdmc19kaXNjX3RyYyh2cG9ydCwgTFBGQ19ESVNDX1RSQ19OT0RFLApAQCAtNTY2NCw2ICs1NjgwLDkgQEAKIAkvKiBmcmVlIG5kbHAgbWVtb3J5IGZvciBmaW5hbCBuZGxwIHJlbGVhc2UgKi8KIAlpZiAoTkxQX0NIS19GUkVFX1JFUShuZGxwKSkgewogCQlrZnJlZShuZGxwLT5sYXRfZGF0YSk7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCQltZW1wb29sX2ZyZWUobmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCQkgICAgIG5kbHAtPnBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CiAJCW1lbXBvb2xfZnJlZShuZGxwLCBuZGxwLT5waGJhLT5ubHBfbWVtX3Bvb2wpOwogCX0KIH0KQEAgLTYxNzAsMTAgKzYxODksNiBAQAogCiAJCW1lbWNweSgmY29ubl9lbnRyeS0+Y29ubl9yZWMsICZjb25uX3JlY1tpXSwKIAkJCXNpemVvZihzdHJ1Y3QgbHBmY19mY2ZfY29ubl9yZWMpKTsKLQkJY29ubl9lbnRyeS0+Y29ubl9yZWMudmxhbl90YWcgPQotCQkJY29ubl9lbnRyeS0+Y29ubl9yZWMudmxhbl90YWc7Ci0JCWNvbm5fZW50cnktPmNvbm5fcmVjLmZsYWdzID0KLQkJCWNvbm5fZW50cnktPmNvbm5fcmVjLmZsYWdzOwogCQlsaXN0X2FkZF90YWlsKCZjb25uX2VudHJ5LT5saXN0LAogCQkJJnBoYmEtPmZjZl9jb25uX3JlY19saXN0KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKaW5kZXggNmY5MjdkMy4uM2Q5NDM4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaApAQCAtNDUsNiArNDUsNyBAQAogI2RlZmluZSBMUEZDX0VYVFJBX1JJTkcgICAgICAgICAgMQkvKiByaW5nIDEgZm9yIG90aGVyIHByb3RvY29scyAqLwogI2RlZmluZSBMUEZDX0VMU19SSU5HICAgICAgICAgICAgMgkvKiByaW5nIDIgZm9yIEVMUyBjb21tYW5kcyAqLwogI2RlZmluZSBMUEZDX0ZDUF9ORVhUX1JJTkcgICAgICAgMworI2RlZmluZSBMUEZDX0ZDUF9PQVNfUklORyAgICAgICAgMwogCiAjZGVmaW5lIFNMSTJfSU9DQl9DTURfUjBfRU5UUklFUyAgICAxNzIJLyogU0xJLTIgRkNQIGNvbW1hbmQgcmluZyBlbnRyaWVzICovCiAjZGVmaW5lIFNMSTJfSU9DQl9SU1BfUjBfRU5UUklFUyAgICAxMzQJLyogU0xJLTIgRkNQIHJlc3BvbnNlIHJpbmcgZW50cmllcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKaW5kZXggNTQ2NGIxMS4uZmQ3OWY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCkBAIC0yNjE2LDYgKzI2MTYsOSBAQAogI2RlZmluZSBjZmdfcGh3cV9TSElGVAkJCQkxNQogI2RlZmluZSBjZmdfcGh3cV9NQVNLCQkJCTB4MDAwMDAwMDEKICNkZWZpbmUgY2ZnX3Bod3FfV09SRAkJCQl3b3JkMTIKKyNkZWZpbmUgY2ZnX29hc19TSElGVAkJCQkyNQorI2RlZmluZSBjZmdfb2FzX01BU0sJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBjZmdfb2FzX1dPUkQJCQkJd29yZDEyCiAjZGVmaW5lIGNmZ19sb29wYmtfc2NvcGVfU0hJRlQJCQkyOAogI2RlZmluZSBjZmdfbG9vcGJrX3Njb3BlX01BU0sJCQkweDAwMDAwMDBmCiAjZGVmaW5lIGNmZ19sb29wYmtfc2NvcGVfV09SRAkJCXdvcmQxMgpAQCAtMzMyMiw2ICszMzI1LDkgQEAKICNkZWZpbmUgd3FlX2ViZGVfY250X1NISUZUICAgIDAKICNkZWZpbmUgd3FlX2ViZGVfY250X01BU0sgICAgIDB4MDAwMDAwMGYKICNkZWZpbmUgd3FlX2ViZGVfY250X1dPUkQgICAgIHdvcmQxMAorI2RlZmluZSB3cWVfb2FzX1NISUZUICAgICAgICAgNgorI2RlZmluZSB3cWVfb2FzX01BU0sgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSB3cWVfb2FzX1dPUkQgICAgICAgICAgd29yZDEwCiAjZGVmaW5lIHdxZV9sZW5sb2NfU0hJRlQgICAgICA3CiAjZGVmaW5lIHdxZV9sZW5sb2NfTUFTSyAgICAgICAweDAwMDAwMDAzCiAjZGVmaW5lIHdxZV9sZW5sb2NfV09SRCAgICAgICB3b3JkMTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggNjhjOTRjYy4uNjM1ZWViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTgwLDYgKzgwLDcgQEAKIHN0YXRpYyB2b2lkIGxwZmNfc2xpNF9jcV9ldmVudF9yZWxlYXNlX2FsbChzdHJ1Y3QgbHBmY19oYmEgKik7CiBzdGF0aWMgdm9pZCBscGZjX3NsaTRfZGlzYWJsZV9pbnRyKHN0cnVjdCBscGZjX2hiYSAqKTsKIHN0YXRpYyB1aW50MzJfdCBscGZjX3NsaTRfZW5hYmxlX2ludHIoc3RydWN0IGxwZmNfaGJhICosIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkIGxwZmNfc2xpNF9vYXNfdmVyaWZ5KHN0cnVjdCBscGZjX2hiYSAqcGhiYSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmxwZmNfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmxwZmNfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKQEAgLTEwMDUsOSArMTAwNiwxNCBAQAogCiAJcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKilwdHI7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPnBwb3J0LT53b3JrX3BvcnRfbG9jaywgaWZsYWcpOwotCXBoYmEtPmhiYV9mbGFnIHw9IEhCQV9SUlFfQUNUSVZFOworCWlmICghKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKQorCQlwaGJhLT5oYmFfZmxhZyB8PSBIQkFfUlJRX0FDVElWRTsKKwllbHNlCisJCXBoYmEtPmhiYV9mbGFnICY9IH5IQkFfUlJRX0FDVElWRTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5wcG9ydC0+d29ya19wb3J0X2xvY2ssIGlmbGFnKTsKLQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOworCisJaWYgKCEocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpCisJCWxwZmNfd29ya2VyX3dha2VfdXAocGhiYSk7CiB9CiAKIC8qKgpAQCAtMTQ2OCw3ICsxNDc0LDggQEAKICAqIGZvciBoYW5kbGluZyBwb3NzaWJsZSBwb3J0IHJlc291cmNlIGNoYW5nZS4KICAqKi8KIHN0YXRpYyBpbnQKLWxwZmNfc2xpNF9wb3J0X3N0YV9mbl9yZXNldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGludCBtYnhfYWN0aW9uKQorbHBmY19zbGk0X3BvcnRfc3RhX2ZuX3Jlc2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgaW50IG1ieF9hY3Rpb24sCisJCQkgICAgYm9vbCBlbl9ybl9tc2cpCiB7CiAJaW50IHJjOwogCXVpbnQzMl90IGludHJfbW9kZTsKQEAgLTE0ODAsOSArMTQ4NywxMCBAQAogCXJjID0gbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHBoYmEpOwogCWlmICghcmMpIHsKIAkJLyogbmVlZCByZXNldDogYXR0ZW1wdCBmb3IgcG9ydCByZWNvdmVyeSAqLwotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCSIyODg3IFJlc2V0IE5lZWRlZDogQXR0ZW1wdGluZyBQb3J0ICIKLQkJCQkiUmVjb3ZlcnkuLi5cbiIpOworCQlpZiAoZW5fcm5fbXNnKQorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkJIjI4ODcgUmVzZXQgTmVlZGVkOiBBdHRlbXB0aW5nIFBvcnQgIgorCQkJCQkiUmVjb3ZlcnkuLi5cbiIpOwogCQlscGZjX29mZmxpbmVfcHJlcChwaGJhLCBtYnhfYWN0aW9uKTsKIAkJbHBmY19vZmZsaW5lKHBoYmEpOwogCQkvKiByZWxlYXNlIGludGVycnVwdCBmb3IgcG9zc2libGUgcmVzb3VyY2UgY2hhbmdlICovCkBAIC0xNTIyLDYgKzE1MzAsNyBAQAogCXVpbnQzMl90IHJlZ19lcnIxLCByZWdfZXJyMjsKIAl1aW50MzJfdCB1ZXJybG9fcmVnLCB1ZW1hc2tsb19yZWc7CiAJdWludDMyX3QgcGNpX3JkX3JjMSwgcGNpX3JkX3JjMjsKKwlib29sIGVuX3JuX21zZyA9IHRydWU7CiAJaW50IHJjOwogCiAJLyogSWYgdGhlIHBjaSBjaGFubmVsIGlzIG9mZmxpbmUsIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMsIHNpbmNlCkBAIC0xNTcyLDEwICsxNTgxLDEyIEBACiAJCQlicmVhazsKIAkJfQogCQlpZiAocmVnX2VycjEgPT0gU0xJUE9SVF9FUlIxX1JFR19FUlJfQ09ERV8yICYmCi0JCSAgICByZWdfZXJyMiA9PSBTTElQT1JUX0VSUjJfUkVHX0ZXX1JFU1RBUlQpCisJCSAgICByZWdfZXJyMiA9PSBTTElQT1JUX0VSUjJfUkVHX0ZXX1JFU1RBUlQpIHsKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJCSIzMTQzIFBvcnQgRG93bjogRmlybXdhcmUgUmVzdGFydGVkXG4iKTsKLQkJZWxzZSBpZiAocmVnX2VycjEgPT0gU0xJUE9SVF9FUlIxX1JFR19FUlJfQ09ERV8yICYmCisJCQkJCSIzMTQzIFBvcnQgRG93bjogRmlybXdhcmUgVXBkYXRlICIKKwkJCQkJIkRldGVjdGVkXG4iKTsKKwkJCWVuX3JuX21zZyA9IGZhbHNlOworCQl9IGVsc2UgaWYgKHJlZ19lcnIxID09IFNMSVBPUlRfRVJSMV9SRUdfRVJSX0NPREVfMiAmJgogCQkJIHJlZ19lcnIyID09IFNMSVBPUlRfRVJSMl9SRUdfRk9SQ0VEX0RVTVApCiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCQkiMzE0NCBQb3J0IERvd246IERlYnVnIER1bXBcbiIpOwpAQCAtMTU4NSw3ICsxNTk2LDggQEAKIAkJCQkJIjMxNDUgUG9ydCBEb3duOiBQcm92aXNpb25pbmdcbiIpOwogCiAJCS8qIENoZWNrIHBvcnQgc3RhdHVzIHJlZ2lzdGVyIGZvciBmdW5jdGlvbiByZXNldCAqLwotCQlyYyA9IGxwZmNfc2xpNF9wb3J0X3N0YV9mbl9yZXNldChwaGJhLCBMUEZDX01CWF9OT19XQUlUKTsKKwkJcmMgPSBscGZjX3NsaTRfcG9ydF9zdGFfZm5fcmVzZXQocGhiYSwgTFBGQ19NQlhfTk9fV0FJVCwKKwkJCQllbl9ybl9tc2cpOwogCQlpZiAocmMgPT0gMCkgewogCQkJLyogZG9uJ3QgcmVwb3J0IGV2ZW50IG9uIGZvcmNlZCBkZWJ1ZyBkdW1wICovCiAJCQlpZiAocmVnX2VycjEgPT0gU0xJUE9SVF9FUlIxX1JFR19FUlJfQ09ERV8yICYmCkBAIC00ODU2LDYgKzQ4NjgsNyBAQAogCXVpbnQ4X3QgcG5fcGFnZVtMUEZDX01BWF9TVVBQT1JURURfUEFHRVNdID0gezB9OwogCXN0cnVjdCBscGZjX21xZSAqbXFlOwogCWludCBsb25nczsKKwlpbnQgZm9mX3ZlY3RvcnMgPSAwOwogCiAJLyogR2V0IGFsbCB0aGUgbW9kdWxlIHBhcmFtcyBmb3IgY29uZmlndXJpbmcgdGhpcyBob3N0ICovCiAJbHBmY19nZXRfY2ZncGFyYW0ocGhiYSk7CkBAIC01MDYxLDYgKzUwNzQsOSBAQAogCXJjID0gbHBmY19zbGk0X3JlYWRfY29uZmlnKHBoYmEpOwogCWlmICh1bmxpa2VseShyYykpCiAJCWdvdG8gb3V0X2ZyZWVfYnNtYng7CisJcmMgPSBscGZjX21lbV9hbGxvY19hY3RpdmVfcnJxX3Bvb2xfczQocGhiYSk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZ290byBvdXRfZnJlZV9ic21ieDsKIAogCS8qIElGIFR5cGUgMCBwb3J0cyBnZXQgaW5pdGlhbGl6ZWQgbm93LiAqLwogCWlmIChiZl9nZXQobHBmY19zbGlfaW50Zl9pZl90eXBlLCAmcGhiYS0+c2xpNF9oYmEuc2xpX2ludGYpID09CkBAIC01MTE4LDYgKzUxMzQsMTIgQEAKIAkJfQogCX0KIAltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOworCisJLyogVmVyaWZ5IE9BUyBpcyBzdXBwb3J0ZWQgKi8KKwlscGZjX3NsaTRfb2FzX3ZlcmlmeShwaGJhKTsKKwlpZiAocGhiYS0+Y2ZnX2ZvZikKKwkJZm9mX3ZlY3RvcnMgPSAxOworCiAJLyogVmVyaWZ5IGFsbCB0aGUgU0xJNCBxdWV1ZXMgKi8KIAlyYyA9IGxwZmNfc2xpNF9xdWV1ZV92ZXJpZnkocGhiYSk7CiAJaWYgKHJjKQpAQCAtNTE1OSw3ICs1MTgxLDggQEAKIAogCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGwgPQogCQkJa3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX2ZjcF9lcV9oZGwpICoKLQkJCSAgICBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKwkJCSAgICAoZm9mX3ZlY3RvcnMgKyBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwpKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGwpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkiMjU3MiBGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciAiCkBAIC01MTY5LDcgKzUxOTIsOCBAQAogCX0KIAogCXBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllcyA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkgKgotCQkJCSAgICAgIHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCksIEdGUF9LRVJORUwpOworCQkJCSAgKGZvZl92ZWN0b3JzICsKKwkJCQkgICBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXMpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkiMjU3MyBGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciBtc2kteCAiCkBAIC01MjY3LDYgKzUyOTEsNyBAQAogCWtmcmVlKHBoYmEtPnNsaTRfaGJhLmNwdV9tYXApOwogCXBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdSA9IDA7CiAJcGhiYS0+c2xpNF9oYmEubnVtX29ubGluZV9jcHUgPSAwOworCXBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUgPSAwOwogCiAJLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtc2kteCBpbnRlcnJ1cHQgdmVjdG9yIGVudHJpZXMgKi8KIAlrZnJlZShwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXMpOwpAQCAtNTM5MCw2ICs1NDE1LDEwIEBACiAJLyogSW5pdGlhbGl6ZSBGQ0YgY29ubmVjdGlvbiByZWMgbGlzdCAqLwogCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5mY2ZfY29ubl9yZWNfbGlzdCk7CiAKKwkvKiBJbml0aWFsaXplIE9BUyBjb25maWd1cmF0aW9uIGxpc3QgKi8KKwlzcGluX2xvY2tfaW5pdCgmcGhiYS0+ZGV2aWNlbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnBoYmEtPmx1bnMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4MTYsNiArNjg0NSw3IEBACiAJaW50IGNmZ19mY3BfaW9fY2hhbm5lbDsKIAl1aW50MzJfdCBjcHU7CiAJdWludDMyX3QgaSA9IDA7CisJaW50IGZvZl92ZWN0b3JzID0gcGhiYS0+Y2ZnX2ZvZiA/IDEgOiAwOwogCiAJLyoKIAkgKiBTYW5pdHkgY2hlY2sgZm9yIGNvbmZpZ3VyZWQgcXVldWUgcGFyYW1ldGVycyBhZ2FpbnN0IHRoZSBydW4tdGltZQpAQCAtNjgzMiw2ICs2ODYyLDcgQEAKIAl9CiAJcGhiYS0+c2xpNF9oYmEubnVtX29ubGluZV9jcHUgPSBpOwogCXBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdSA9IGxwZmNfcHJlc2VudF9jcHU7CisJcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSA9IDA7CiAKIAlpZiAoaSA8IGNmZ19mY3BfaW9fY2hhbm5lbCkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwKQEAgLTY4NDIsNyArNjg3Myw3IEBACiAJCWNmZ19mY3BfaW9fY2hhbm5lbCA9IGk7CiAJfQogCi0JaWYgKGNmZ19mY3BfaW9fY2hhbm5lbCA+CisJaWYgKGNmZ19mY3BfaW9fY2hhbm5lbCArIGZvZl92ZWN0b3JzID4KIAkgICAgcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfZXEpIHsKIAkJaWYgKHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ubWF4X2VxIDwKIAkJICAgIExQRkNfRkNQX0lPX0NIQU5fTUlOKSB7CkBAIC02ODU5LDcgKzY4OTAsOCBAQAogCQkJCSJhdmFpbGFibGUgRVFzOiBmcm9tICVkIHRvICVkXG4iLAogCQkJCWNmZ19mY3BfaW9fY2hhbm5lbCwKIAkJCQlwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF9lcSk7Ci0JCWNmZ19mY3BfaW9fY2hhbm5lbCA9IHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ubWF4X2VxOworCQljZmdfZmNwX2lvX2NoYW5uZWwgPSBwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF9lcSAtCisJCQlmb2ZfdmVjdG9yczsKIAl9CiAKIAkvKiBUaGUgYWN0dWFsIG51bWJlciBvZiBGQ1AgZXZlbnQgcXVldWVzIGFkb3B0ZWQgKi8KQEAgLTcwNzAsNiArNzEwMiw5IEBACiAJfQogCXBoYmEtPnNsaTRfaGJhLmRhdF9ycSA9IHFkZXNjOwogCisJLyogQ3JlYXRlIHRoZSBRdWV1ZXMgbmVlZGVkIGZvciBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIG9wZXJhdGlvbnMgKi8KKwlpZiAocGhiYS0+Y2ZnX2ZvZikKKwkJbHBmY19mb2ZfcXVldWVfY3JlYXRlKHBoYmEpOwogCXJldHVybiAwOwogCiBvdXRfZXJyb3I6CkBAIC03MDk0LDYgKzcxMjksOSBAQAogewogCWludCBpZHg7CiAKKwlpZiAocGhiYS0+Y2ZnX2ZvZikKKwkJbHBmY19mb2ZfcXVldWVfZGVzdHJveShwaGJhKTsKKwogCWlmIChwaGJhLT5zbGk0X2hiYS5oYmFfZXEgIT0gTlVMTCkgewogCQkvKiBSZWxlYXNlIEhCQSBldmVudCBxdWV1ZSAqLwogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbDsgaWR4KyspIHsKQEAgLTc0NzgsOCArNzUxNiwyMCBAQAogCQkJcGhiYS0+c2xpNF9oYmEuaGRyX3JxLT5xdWV1ZV9pZCwKIAkJCXBoYmEtPnNsaTRfaGJhLmRhdF9ycS0+cXVldWVfaWQsCiAJCQlwaGJhLT5zbGk0X2hiYS5lbHNfY3EtPnF1ZXVlX2lkKTsKKworCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCXJjID0gbHBmY19mb2ZfcXVldWVfc2V0dXAocGhiYSk7CisJCWlmIChyYykgeworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkJIjA1NDkgRmFpbGVkIHNldHVwIG9mIEZPRiBRdWV1ZXM6ICIKKwkJCQkJInJjID0gMHgleFxuIiwgcmMpOworCQkJZ290byBvdXRfZGVzdHJveV9lbHNfcnE7CisJCX0KKwl9CiAJcmV0dXJuIDA7CiAKK291dF9kZXN0cm95X2Vsc19ycToKKwlscGZjX3JxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuaGRyX3JxLCBwaGJhLT5zbGk0X2hiYS5kYXRfcnEpOwogb3V0X2Rlc3Ryb3lfZWxzX3dxOgogCWxwZmNfd3FfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5lbHNfd3EpOwogb3V0X2Rlc3Ryb3lfbWJ4X3dxOgpAQCAtNzUxOCw2ICs3NTY4LDkgQEAKIHsKIAlpbnQgZmNwX3FpZHg7CiAKKwkvKiBVbnNldCB0aGUgcXVldWVzIGNyZWF0ZWQgZm9yIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgb3BlcmF0aW9ucyAqLworCWlmIChwaGJhLT5jZmdfZm9mKQorCQlscGZjX2ZvZl9xdWV1ZV9kZXN0cm95KHBoYmEpOwogCS8qIFVuc2V0IG1haWxib3ggY29tbWFuZCB3b3JrIHF1ZXVlICovCiAJbHBmY19tcV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLm1ieF93cSk7CiAJLyogVW5zZXQgRUxTIHdvcmsgcXVldWUgKi8KQEAgLTg2MzUsNiArODY4OCwxMCBAQAogCiAJLyogQ29uZmlndXJlIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlICovCiAJdmVjdG9ycyA9IHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbDsKKwlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQlwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLmVudHJ5ID0gaW5kZXg7CisJCXZlY3RvcnMrKzsKKwl9CiBlbmFibGVfbXNpeF92ZWN0b3JzOgogCXJjID0gcGNpX2VuYWJsZV9tc2l4KHBoYmEtPnBjaWRldiwgcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzLAogCQkJICAgICB2ZWN0b3JzKTsKQEAgLTg2NjQsNyArODcyMSwxNSBAQAogCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5pZHggPSBpbmRleDsKIAkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0ucGhiYSA9IHBoYmE7CiAJCWF0b21pY19zZXQoJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLmZjcF9lcV9pbl91c2UsIDEpOwotCQlyYyA9IHJlcXVlc3RfaXJxKHBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllc1tpbmRleF0udmVjdG9yLAorCQlpZiAocGhiYS0+Y2ZnX2ZvZiAmJiAoaW5kZXggPT0gKHZlY3RvcnMgLSAxKSkpCisJCQlyYyA9IHJlcXVlc3RfaXJxKAorCQkJCXBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllc1tpbmRleF0udmVjdG9yLAorCQkJCSAmbHBmY19zbGk0X2ZvZl9pbnRyX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJCSAoY2hhciAqKSZwaGJhLT5zbGk0X2hiYS5oYW5kbGVyX25hbWVbaW5kZXhdLAorCQkJCSAmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0pOworCQllbHNlCisJCQlyYyA9IHJlcXVlc3RfaXJxKAorCQkJCXBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllc1tpbmRleF0udmVjdG9yLAogCQkJCSAmbHBmY19zbGk0X2hiYV9pbnRyX2hhbmRsZXIsIElSUUZfU0hBUkVELAogCQkJCSAoY2hhciAqKSZwaGJhLT5zbGk0X2hiYS5oYW5kbGVyX25hbWVbaW5kZXhdLAogCQkJCSAmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0pOwpAQCAtODY3Niw2ICs4NzQxLDkgQEAKIAkJfQogCX0KIAorCWlmIChwaGJhLT5jZmdfZm9mKQorCQl2ZWN0b3JzLS07CisKIAlpZiAodmVjdG9ycyAhPSBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkiMzIzOCBSZWR1Y2luZyBJTyBjaGFubmVscyB0byBtYXRjaCBudW1iZXIgb2YgIgpAQCAtODcyMSw3ICs4Nzg5LDEwIEBACiAJCWZyZWVfaXJxKHBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllc1tpbmRleF0udmVjdG9yLAogCQkJICZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XSk7CiAJfQotCisJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJZnJlZV9pcnEocGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3IsCisJCQkgJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdKTsKKwl9CiAJLyogRGlzYWJsZSBNU0ktWCAqLwogCXBjaV9kaXNhYmxlX21zaXgocGhiYS0+cGNpZGV2KTsKIApAQCAtODc3MSw2ICs4ODQyLDEwIEBACiAJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLnBoYmEgPSBwaGJhOwogCX0KIAorCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLmlkeCA9IGluZGV4OworCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5waGJhID0gcGhiYTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg4NTMsNiArODkyOCwxMiBAQAogCQkJCWF0b21pY19zZXQoJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLgogCQkJCQlmY3BfZXFfaW5fdXNlLCAxKTsKIAkJCX0KKwkJCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCQkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0uaWR4ID0gaW5kZXg7CisJCQkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0ucGhiYSA9IHBoYmE7CisJCQkJYXRvbWljX3NldCgmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0uCisJCQkJCWZjcF9lcV9pbl91c2UsIDEpOworCQkJfQogCQl9CiAJfQogCXJldHVybiBpbnRyX21vZGU7CkBAIC05MTYzLDYgKzkyNDQsNyBAQAogCQlwaGJhLT5zbGkzX29wdGlvbnMgJj0gfkxQRkNfU0xJNF9QSFdRX0VOQUJMRUQ7CiAJc2xpNF9wYXJhbXMtPnNnZV9zdXBwX2xlbiA9IG1ieF9zbGk0X3BhcmFtZXRlcnMtPnNnZV9zdXBwX2xlbjsKIAlzbGk0X3BhcmFtcy0+bG9vcGJrX3Njb3BlID0gYmZfZ2V0KGxvb3Bia19zY29wZSwgbWJ4X3NsaTRfcGFyYW1ldGVycyk7CisJc2xpNF9wYXJhbXMtPm9hc19zdXBwb3J0ZWQgPSBiZl9nZXQoY2ZnX29hcywgbWJ4X3NsaTRfcGFyYW1ldGVycyk7CiAJc2xpNF9wYXJhbXMtPmNxdiA9IGJmX2dldChjZmdfY3F2LCBtYnhfc2xpNF9wYXJhbWV0ZXJzKTsKIAlzbGk0X3BhcmFtcy0+bXF2ID0gYmZfZ2V0KGNmZ19tcXYsIG1ieF9zbGk0X3BhcmFtZXRlcnMpOwogCXNsaTRfcGFyYW1zLT53cXYgPSBiZl9nZXQoY2ZnX3dxdiwgbWJ4X3NsaTRfcGFyYW1ldGVycyk7CkBAIC0xMDc5Niw2ICsxMDg3OCwxNjkgQEAKIAlyZXR1cm47CiB9CiAKKy8qKgorICogbHBmY19zbGk0X29hc192ZXJpZnkgLSBWZXJpZnkgT0FTIGlzIHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXIKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdG8gc2VlIGlmIE9BUyBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgYWRhcHRlci4gSWYKKyAqIHN1cHBvcnRlZCwgdGhlIGNvbmZpZ3VyZSBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIGZsYWcgaXMgc2V0LiAgT3RoZXJ3aXNlLAorICogdGhlIGVuYWJsZSBvYXMgZmxhZyBpcyBjbGVhcmVkIGFuZCB0aGUgcG9vbCBjcmVhdGVkIGZvciBPQVMgZGV2aWNlIGRhdGEKKyAqIGlzIGRlc3Ryb3llZC4KKyAqCisgKiovCit2b2lkCitscGZjX3NsaTRfb2FzX3ZlcmlmeShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisKKwlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuOworCisJaWYgKHBoYmEtPnNsaTRfaGJhLnBjX3NsaTRfcGFyYW1zLm9hc19zdXBwb3J0ZWQpIHsKKwkJcGhiYS0+Y2ZnX2ZvZiA9IDE7CisJfSBlbHNlIHsKKwkJcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lID0gMDsKKwkJaWYgKHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKQorCQkJbWVtcG9vbF9kZXN0cm95KHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKTsKKwkJcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wgPSBOVUxMOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBscGZjX2ZvZl9xdWV1ZV9zZXR1cCAtIFNldCB1cCBhbGwgdGhlIGZvZiBxdWV1ZXMKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIHNldCB1cCBhbGwgdGhlIGZvZiBxdWV1ZXMgZm9yIHRoZSBGQyBIQkEKKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBSZXR1cm4gY29kZXMKKyAqICAgICAgMCAtIHN1Y2Nlc3NmdWwKKyAqICAgICAgLUVOT01FTSAtIE5vIGF2YWlsYWJsZSBtZW1vcnkKKyAqKi8KK2ludAorbHBmY19mb2ZfcXVldWVfc2V0dXAoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCXN0cnVjdCBscGZjX3NsaSAqcHNsaSA9ICZwaGJhLT5zbGk7CisJaW50IHJjOworCisJcmMgPSBscGZjX2VxX2NyZWF0ZShwaGJhLCBwaGJhLT5zbGk0X2hiYS5mb2ZfZXEsIExQRkNfTUFYX0lNQVgpOworCWlmIChyYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSB7CisKKwkJcmMgPSBscGZjX2NxX2NyZWF0ZShwaGJhLCBwaGJhLT5zbGk0X2hiYS5vYXNfY3EsCisJCQkJICAgIHBoYmEtPnNsaTRfaGJhLmZvZl9lcSwgTFBGQ19XQ1EsIExQRkNfRkNQKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXRfb2FzX2NxOworCisJCXJjID0gbHBmY193cV9jcmVhdGUocGhiYSwgcGhiYS0+c2xpNF9oYmEub2FzX3dxLAorCQkJCSAgICBwaGJhLT5zbGk0X2hiYS5vYXNfY3EsIExQRkNfRkNQKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXRfb2FzX3dxOworCisJCXBoYmEtPnNsaTRfaGJhLm9hc19jcS0+cHJpbmcgPSAmcHNsaS0+cmluZ1tMUEZDX0ZDUF9PQVNfUklOR107CisJCXBoYmEtPnNsaTRfaGJhLm9hc19yaW5nID0gJnBzbGktPnJpbmdbTFBGQ19GQ1BfT0FTX1JJTkddOworCX0KKworCXJldHVybiAwOworCitvdXRfb2FzX3dxOgorCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCWxwZmNfY3FfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5vYXNfY3EpOworb3V0X29hc19jcToKKwlscGZjX2VxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuZm9mX2VxKTsKKwlyZXR1cm4gcmM7CisKK30KKworLyoqCisgKiBscGZjX2ZvZl9xdWV1ZV9jcmVhdGUgLSBDcmVhdGUgYWxsIHRoZSBmb2YgcXVldWVzCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0byBhbGxvY2F0ZSBhbGwgdGhlIGZvZiBxdWV1ZXMgZm9yIHRoZSBGQyBIQkEKKyAqIG9wZXJhdGlvbi4gRm9yIGVhY2ggU0xJNCBxdWV1ZSB0eXBlLCB0aGUgcGFyYW1ldGVycyBzdWNoIGFzIHF1ZXVlIGVudHJ5CisgKiBjb3VudCAocXVldWUgZGVwdGgpIHNoYWxsIGJlIHRha2VuIGZyb20gdGhlIG1vZHVsZSBwYXJhbWV0ZXIuIEZvciBub3csCisgKiB3ZSBqdXN0IHVzZSBzb21lIGNvbnN0YW50IG51bWJlciBhcyBwbGFjZSBob2xkZXIuCisgKgorICogUmV0dXJuIGNvZGVzCisgKiAgICAgIDAgLSBzdWNjZXNzZnVsCisgKiAgICAgIC1FTk9NRU0gLSBObyBhdmFpbGJsZSBtZW1vcnkKKyAqICAgICAgLUVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCisgKiovCitpbnQKK2xwZmNfZm9mX3F1ZXVlX2NyZWF0ZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJc3RydWN0IGxwZmNfcXVldWUgKnFkZXNjOworCisJLyogQ3JlYXRlIEZPRiBFUSAqLworCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmVxX2VzaXplLAorCQkJCSAgICAgIHBoYmEtPnNsaTRfaGJhLmVxX2Vjb3VudCk7CisJaWYgKCFxZGVzYykKKwkJZ290byBvdXRfZXJyb3I7CisKKwlwaGJhLT5zbGk0X2hiYS5mb2ZfZXEgPSBxZGVzYzsKKworCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpIHsKKworCQkvKiBDcmVhdGUgT0FTIENRICovCisJCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmNxX2VzaXplLAorCQkJCQkJICAgICAgcGhiYS0+c2xpNF9oYmEuY3FfZWNvdW50KTsKKwkJaWYgKCFxZGVzYykKKwkJCWdvdG8gb3V0X2Vycm9yOworCisJCXBoYmEtPnNsaTRfaGJhLm9hc19jcSA9IHFkZXNjOworCisJCS8qIENyZWF0ZSBPQVMgV1EgKi8KKwkJcWRlc2MgPSBscGZjX3NsaTRfcXVldWVfYWxsb2MocGhiYSwgcGhiYS0+c2xpNF9oYmEud3FfZXNpemUsCisJCQkJCSAgICAgIHBoYmEtPnNsaTRfaGJhLndxX2Vjb3VudCk7CisJCWlmICghcWRlc2MpCisJCQlnb3RvIG91dF9lcnJvcjsKKworCQlwaGJhLT5zbGk0X2hiYS5vYXNfd3EgPSBxZGVzYzsKKworCX0KKwlyZXR1cm4gMDsKKworb3V0X2Vycm9yOgorCWxwZmNfZm9mX3F1ZXVlX2Rlc3Ryb3kocGhiYSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogbHBmY19mb2ZfcXVldWVfZGVzdHJveSAtIERlc3Ryb3kgYWxsIHRoZSBmb2YgcXVldWVzCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0byByZWxlYXNlIGFsbCB0aGUgU0xJNCBxdWV1ZXMgd2l0aCB0aGUgRkMgSEJBCisgKiBvcGVyYXRpb24uCisgKgorICogUmV0dXJuIGNvZGVzCisgKiAgICAgIDAgLSBzdWNjZXNzZnVsCisgKiovCitpbnQKK2xwZmNfZm9mX3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCS8qIFJlbGVhc2UgRk9GIEV2ZW50IHF1ZXVlICovCisJaWYgKHBoYmEtPnNsaTRfaGJhLmZvZl9lcSAhPSBOVUxMKSB7CisJCWxwZmNfc2xpNF9xdWV1ZV9mcmVlKHBoYmEtPnNsaTRfaGJhLmZvZl9lcSk7CisJCXBoYmEtPnNsaTRfaGJhLmZvZl9lcSA9IE5VTEw7CisJfQorCisJLyogUmVsZWFzZSBPQVMgQ29tcGxldGlvbiBxdWV1ZSAqLworCWlmIChwaGJhLT5zbGk0X2hiYS5vYXNfY3EgIT0gTlVMTCkgeworCQlscGZjX3NsaTRfcXVldWVfZnJlZShwaGJhLT5zbGk0X2hiYS5vYXNfY3EpOworCQlwaGJhLT5zbGk0X2hiYS5vYXNfY3EgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgT0FTIFdvcmsgcXVldWUgKi8KKwlpZiAocGhiYS0+c2xpNF9oYmEub2FzX3dxICE9IE5VTEwpIHsKKwkJbHBmY19zbGk0X3F1ZXVlX2ZyZWUocGhiYS0+c2xpNF9oYmEub2FzX3dxKTsKKwkJcGhiYS0+c2xpNF9oYmEub2FzX3dxID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBscGZjX2lkX3RhYmxlW10gPSB7CiAJe1BDSV9WRU5ET1JfSURfRU1VTEVYLCBQQ0lfREVWSUNFX0lEX1ZJUEVSLAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWVtLmMKaW5kZXggODEyZDBjZC4uZWQ0MTlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21lbS5jCkBAIC0zOCwxMCArMzgsMjkgQEAKICNpbmNsdWRlICJscGZjX3Njc2kuaCIKICNpbmNsdWRlICJscGZjLmgiCiAjaW5jbHVkZSAibHBmY19jcnRuLmgiCisjaW5jbHVkZSAibHBmY19sb2dtc2cuaCIKIAogI2RlZmluZSBMUEZDX01CVUZfUE9PTF9TSVpFICAgICA2NCAgICAgIC8qIG1heCBlbGVtZW50cyBpbiBNQlVGIHNhZmV0eSBwb29sICovCiAjZGVmaW5lIExQRkNfTUVNX1BPT0xfU0laRSAgICAgIDY0ICAgICAgLyogbWF4IGVsZW0gaW4gbm9uLURNQSBzYWZldHkgcG9vbCAqLworI2RlZmluZSBMUEZDX0RFVklDRV9EQVRBX1BPT0xfU0laRSA2NCAgIC8qIG1heCBlbGVtZW50cyBpbiBkZXZpY2UgZGF0YSBwb29sICovCiAKK2ludAorbHBmY19tZW1fYWxsb2NfYWN0aXZlX3JycV9wb29sX3M0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkgeworCXNpemVfdCBieXRlczsKKwlpbnQgbWF4X3hyaSA9IHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ubWF4X3hyaTsKKworCWlmIChtYXhfeHJpIDw9IDApCisJCXJldHVybiAtRU5PTUVNOworCWJ5dGVzID0gKChCSVRTX1BFUl9MT05HIC0gMSArIG1heF94cmkpIC8gQklUU19QRVJfTE9ORykgKgorCQkgIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3ogPSBieXRlczsKKwlwaGJhLT5hY3RpdmVfcnJxX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woTFBGQ19NRU1fUE9PTF9TSVpFLAorCQkJCQkJCSAgICBieXRlcyk7CisJaWYgKCFwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpCisJCXJldHVybiAtRU5PTUVNOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogbHBmY19tZW1fYWxsb2MgLSBjcmVhdGUgYW5kIGFsbG9jYXRlIGFsbCBQQ0kgYW5kIG1lbW9yeSBwb29scwpAQCAtMTQ2LDYgKzE2NSwxNiBAQAogCQlwaGJhLT5scGZjX2RyYl9wb29sID0gTlVMTDsKIAl9CiAKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSB7CisJCXBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sID0gbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKAorCQkJCQlMUEZDX0RFVklDRV9EQVRBX1BPT0xfU0laRSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBscGZjX2RldmljZV9kYXRhKSk7CisJCWlmICghcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpCisJCQlnb3RvIGZhaWxfZnJlZV9ocmJfcG9vbDsKKwl9IGVsc2UgeworCQlwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCA9IE5VTEw7CisJfQorCiAJcmV0dXJuIDA7CiAgZmFpbF9mcmVlX2hyYl9wb29sOgogCXBjaV9wb29sX2Rlc3Ryb3kocGhiYS0+bHBmY19ocmJfcG9vbCk7CkBAIC0xODgsNiArMjE3LDcgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbHBmY19kbWFfcG9vbCAqcG9vbCA9ICZwaGJhLT5scGZjX21idWZfc2FmZXR5X3Bvb2w7CisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmRldmljZV9kYXRhOwogCiAJLyogRnJlZSBIQlEgcG9vbHMgKi8KIAlscGZjX3NsaV9oYnFidWZfZnJlZV9hbGwocGhiYSk7CkBAIC0yMDksNiArMjM5LDEwIEBACiAJLyogRnJlZSBOTFAgbWVtb3J5IHBvb2wgKi8KIAltZW1wb29sX2Rlc3Ryb3kocGhiYS0+bmxwX21lbV9wb29sKTsKIAlwaGJhLT5ubHBfbWVtX3Bvb2wgPSBOVUxMOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQgJiYgcGhiYS0+YWN0aXZlX3JycV9wb29sKSB7CisJCW1lbXBvb2xfZGVzdHJveShwaGJhLT5hY3RpdmVfcnJxX3Bvb2wpOworCQlwaGJhLT5hY3RpdmVfcnJxX3Bvb2wgPSBOVUxMOworCX0KIAogCS8qIEZyZWUgbWJveCBtZW1vcnkgcG9vbCAqLwogCW1lbXBvb2xfZGVzdHJveShwaGJhLT5tYm94X21lbV9wb29sKTsKQEAgLTIyNyw2ICsyNjEsMTkgQEAKIAlwY2lfcG9vbF9kZXN0cm95KHBoYmEtPmxwZmNfc2NzaV9kbWFfYnVmX3Bvb2wpOwogCXBoYmEtPmxwZmNfc2NzaV9kbWFfYnVmX3Bvb2wgPSBOVUxMOwogCisJLyogRnJlZSBEZXZpY2UgRGF0YSBtZW1vcnkgcG9vbCAqLworCWlmIChwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCkgeworCQkvKiBFbnN1cmUgYWxsIG9iamVjdHMgaGF2ZSBiZWVuIHJldHVybmVkIHRvIHRoZSBwb29sICovCisJCXdoaWxlICghbGlzdF9lbXB0eSgmcGhiYS0+bHVucykpIHsKKwkJCWRldmljZV9kYXRhID0gbGlzdF9maXJzdF9lbnRyeSgmcGhiYS0+bHVucywKKwkJCQkJCSAgICAgICBzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSwKKwkJCQkJCSAgICAgICBsaXN0ZW50cnkpOworCQkJbGlzdF9kZWwoJmRldmljZV9kYXRhLT5saXN0ZW50cnkpOworCQkJbWVtcG9vbF9mcmVlKGRldmljZV9kYXRhLCBwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCk7CisJCX0KKwkJbWVtcG9vbF9kZXN0cm95KHBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKTsKKwl9CisJcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wgPSBOVUxMOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKaW5kZXggYWJjMzYxMi4uYzM0MmY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCkBAIC0yMDMsOCArMjAzLDYgQEAKIGludAogbHBmY19lbHNfYWJvcnQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscCkKIHsKLQlMSVNUX0hFQUQoY29tcGxldGlvbnMpOwotCUxJU1RfSEVBRCh0eGNtcGxxX2NvbXBsZXRpb25zKTsKIAlMSVNUX0hFQUQoYWJvcnRfbGlzdCk7CiAJc3RydWN0IGxwZmNfc2xpICAqcHNsaSA9ICZwaGJhLT5zbGk7CiAJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBzbGktPnJpbmdbTFBGQ19FTFNfUklOR107CkBAIC0yMTYsMzIgKzIxNCwyNyBAQAogCQkJICJEYXRhOiB4JXggeCV4IHgleFxuIiwKIAkJCSBuZGxwLT5ubHBfRElELCBuZGxwLT5ubHBfZmxhZywgbmRscC0+bmxwX3N0YXRlLAogCQkJIG5kbHAtPm5scF9ycGkpOwotCisJLyogQ2xlYW4gdXAgYWxsIGZhYnJpYyBJT3MgZmlyc3QuKi8KIAlscGZjX2ZhYnJpY19hYm9ydF9ucG9ydChuZGxwKTsKIAotCS8qIEZpcnN0IGNoZWNrIHRoZSB0eHEgKi8KKwkvKgorCSAqIExvY2sgdGhlIEVMUyByaW5nIHR4Y21wbHEgZm9yIFNMSTMvU0xJNCBhbmQgYnVpbGQgYSBsb2NhbCBsaXN0CisJICogb2YgYWxsIEVMUyBJT3MgdGhhdCBuZWVkIGFuIEFCVFMuICBUaGUgSU9zIG5lZWQgdG8gc3RheSBvbiB0aGUKKwkgKiB0eGNtcGxxIHNvIHRoYXQgdGhlIGFib3J0IG9wZXJhdGlvbiBjb21wbGV0ZXMgdGhlbSBzdWNjZXNzZnVsbHkuCisJICovCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvY2IsIG5leHRfaW9jYiwgJnByaW5nLT50eHEsIGxpc3QpIHsKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIGlvY2IgbWF0Y2hlcyB0aGUgbnBvcnQgd2UgYXJlIGxvb2tpbmcgZm9yICovCi0JCWlmIChscGZjX2NoZWNrX3NsaV9uZGxwKHBoYmEsIHByaW5nLCBpb2NiLCBuZGxwKSkgewotCQkJLyogSXQgbWF0Y2hlcywgc28gZGVxdWUgYW5kIGNhbGwgY29tcGwgd2l0aCBhbnAgZXJyb3IgKi8KLQkJCWxpc3RfbW92ZV90YWlsKCZpb2NiLT5saXN0LCAmY29tcGxldGlvbnMpOwotCQl9Ci0JfQotCi0JLyogTmV4dCBjaGVjayB0aGUgdHhjbXBscSAqLwotCWxpc3Rfc3BsaWNlX2luaXQoJnByaW5nLT50eGNtcGxxLCAmdHhjbXBscV9jb21wbGV0aW9ucyk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb2NiLCBuZXh0X2lvY2IsICZ0eGNtcGxxX2NvbXBsZXRpb25zLCBsaXN0KSB7Ci0JCS8qIENoZWNrIHRvIHNlZSBpZiBpb2NiIG1hdGNoZXMgdGhlIG5wb3J0IHdlIGFyZSBsb29raW5nIGZvciAqLworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fbG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvY2IsIG5leHRfaW9jYiwgJnByaW5nLT50eGNtcGxxLCBsaXN0KSB7CisJLyogQWRkIHRvIGFib3J0X2xpc3Qgb24gb24gTkRMUCBtYXRjaC4gKi8KIAkJaWYgKGxwZmNfY2hlY2tfc2xpX25kbHAocGhiYSwgcHJpbmcsIGlvY2IsIG5kbHApKQogCQkJbGlzdF9hZGRfdGFpbCgmaW9jYi0+ZGxpc3QsICZhYm9ydF9saXN0KTsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JbGlzdF9zcGxpY2UoJnR4Y21wbHFfY29tcGxldGlvbnMsICZwcmluZy0+dHhjbXBscSk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl91bmxvY2soJnByaW5nLT5yaW5nX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKKwkvKiBBYm9ydCB0aGUgdGFyZ2V0ZWQgSU9zIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBhYm9ydCBsaXN0LiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb2NiLCBuZXh0X2lvY2IsICZhYm9ydF9saXN0LCBkbGlzdCkgewogCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCQlsaXN0X2RlbF9pbml0KCZpb2NiLT5kbGlzdCk7CkBAIC0yNDksOSArMjQyLDI4IEBACiAJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCX0KIAorCUlOSVRfTElTVF9IRUFEKCZhYm9ydF9saXN0KTsKKworCS8qIE5vdyBwcm9jZXNzIHRoZSB0eHEgKi8KKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX2xvY2soJnByaW5nLT5yaW5nX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvY2IsIG5leHRfaW9jYiwgJnByaW5nLT50eHEsIGxpc3QpIHsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIGlvY2IgbWF0Y2hlcyB0aGUgbnBvcnQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJCWlmIChscGZjX2NoZWNrX3NsaV9uZGxwKHBoYmEsIHByaW5nLCBpb2NiLCBuZGxwKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmaW9jYi0+bGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZpb2NiLT5saXN0LCAmYWJvcnRfbGlzdCk7CisJCX0KKwl9CisKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX3VubG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwogCS8qIENhbmNlbCBhbGwgdGhlIElPQ0JzIGZyb20gdGhlIGNvbXBsZXRpb25zIGxpc3QgKi8KLQlscGZjX3NsaV9jYW5jZWxfaW9jYnMocGhiYSwgJmNvbXBsZXRpb25zLCBJT1NUQVRfTE9DQUxfUkVKRUNULAotCQkJICAgICAgSU9FUlJfU0xJX0FCT1JURUQpOworCWxwZmNfc2xpX2NhbmNlbF9pb2NicyhwaGJhLCAmYWJvcnRfbGlzdCwKKwkJCSAgICAgIElPU1RBVF9MT0NBTF9SRUpFQ1QsIElPRVJSX1NMSV9BQk9SVEVEKTsKIAogCWxwZmNfY2FuY2VsX3JldHJ5X2RlbGF5X3RtbyhwaGJhLT5wcG9ydCwgbmRscCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCmluZGV4IGIyZWRlMDUuLjQ2MjQ1M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCkBAIC02OCw2ICs2OCwxNyBAQAogCV9fYmUzMiByZWZfdGFnOyAgICAgICAgIC8qIFRhcmdldCBMQkEgb3IgaW5kaXJlY3QgTEJBICovCiB9OwogCitzdGF0aWMgc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqCitscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAodnBvcnQtPnBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuICgoc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKilzZGV2LT5ob3N0ZGF0YSktPnJwb3J0X2RhdGE7CisJZWxzZQorCQlyZXR1cm4gKHN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKilzZGV2LT5ob3N0ZGF0YTsKK30KKwogc3RhdGljIHZvaWQKIGxwZmNfcmVsZWFzZV9zY3NpX2J1Zl9zNChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3Njc2lfYnVmICpwc2IpOwogc3RhdGljIHZvaWQKQEAgLTMwNCw5ICszMTUsMjcgQEAKIAl1bnNpZ25lZCBsb25nIG5ld19xdWV1ZV9kZXB0aCwgb2xkX3F1ZXVlX2RlcHRoOwogCiAJb2xkX3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGg7Ci0Jc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgU0NTSV9RREVQVEhfREVGQVVMVDoKKwkJLyogY2hhbmdlIHJlcXVlc3QgZnJvbSBzeXNmcywgZmFsbCB0aHJvdWdoICovCisJY2FzZSBTQ1NJX1FERVBUSF9SQU1QX1VQOgorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgcWRlcHRoKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1FERVBUSF9RRlVMTDoKKwkJaWYgKHNjc2lfdHJhY2tfcXVldWVfZnVsbChzZGV2LCBxZGVwdGgpID09IDApCisJCQlyZXR1cm4gc2Rldi0+cXVldWVfZGVwdGg7CisKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfRkNQLAorCQkJCSAiMDcxMSBkZXRlY3RlZCBxdWV1ZSBmdWxsIC0gbHVuIHF1ZXVlICIKKwkJCQkgImRlcHRoIGFkanVzdGVkIHRvICVkLlxuIiwgc2Rldi0+cXVldWVfZGVwdGgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCiAJbmV3X3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGg7Ci0JcmRhdGEgPSBzZGV2LT5ob3N0ZGF0YTsKKwlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKHNkZXYpOwogCWlmIChyZGF0YSkKIAkJbHBmY19zZW5kX3NkZXZfcXVldWVkZXB0aF9jaGFuZ2VfZXZlbnQocGhiYSwgdnBvcnQsCiAJCQkJCQkgICAgICAgcmRhdGEtPnBub2RlLCBzZGV2LT5sdW4sCkBAIC0zNzcsNTAgKzQwNiw2IEBACiB9CiAKIC8qKgotICogbHBmY19yYW1wdXBfcXVldWVfZGVwdGggLSBQb3N0IFJBTVBfVVBfUVVFVUUgZXZlbnQgZm9yIHdvcmtlciB0aHJlYWQKLSAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCi0gKgotICogVGhpcyByb3V0aW5lIHBvc3QgV09SS0VSX1JBTVBfVVBfUVVFVUUgZXZlbnQgZm9yIEBwaGJhIHZwb3J0LiBUaGlzIHJvdXRpbmUKLSAqIHBvc3QgYXQgbW9zdCAxIGV2ZW50IGV2ZXJ5IDUgbWludXRlIGFmdGVyIGxhc3RfcmFtcF91cF90aW1lIG9yCi0gKiBsYXN0X3JzcmNfZXJyb3JfdGltZS4gIFRoaXMgcm91dGluZSB3YWtlcyB1cCB3b3JrZXIgdGhyZWFkIG9mIEBwaGJhCi0gKiB0byBwcm9jZXNzIFdPUktFUl9SQU1fRE9XTl9FVkVOVCBldmVudC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG5vIGxvY2sgaGVsZC4KLSAqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotbHBmY19yYW1wdXBfcXVldWVfZGVwdGgoc3RydWN0IGxwZmNfdnBvcnQgICp2cG9ydCwKLQkJCXVpbnQzMl90IHF1ZXVlX2RlcHRoKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7Ci0JdWludDMyX3QgZXZ0X3Bvc3RlZDsKLQlhdG9taWNfaW5jKCZwaGJhLT5udW1fY21kX3N1Y2Nlc3MpOwotCi0JaWYgKHZwb3J0LT5jZmdfbHVuX3F1ZXVlX2RlcHRoIDw9IHF1ZXVlX2RlcHRoKQotCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywKLQkJCXBoYmEtPmxhc3RfcmFtcF91cF90aW1lICsgUVVFVUVfUkFNUF9VUF9JTlRFUlZBTCkgfHwKLQkgICAgdGltZV9iZWZvcmUoamlmZmllcywKLQkJCXBoYmEtPmxhc3RfcnNyY19lcnJvcl90aW1lICsgUVVFVUVfUkFNUF9VUF9JTlRFUlZBTCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCXBoYmEtPmxhc3RfcmFtcF91cF90aW1lID0gamlmZmllczsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrLCBmbGFncyk7Ci0JZXZ0X3Bvc3RlZCA9IHBoYmEtPnBwb3J0LT53b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX1JBTVBfVVBfUVVFVUU7Ci0JaWYgKCFldnRfcG9zdGVkKQotCQlwaGJhLT5wcG9ydC0+d29ya19wb3J0X2V2ZW50cyB8PSBXT1JLRVJfUkFNUF9VUF9RVUVVRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5wcG9ydC0+d29ya19wb3J0X2xvY2ssIGZsYWdzKTsKLQotCWlmICghZXZ0X3Bvc3RlZCkKLQkJbHBmY193b3JrZXJfd2FrZV91cChwaGJhKTsKLQlyZXR1cm47Ci19Ci0KLS8qKgogICogbHBmY19yYW1wX2Rvd25fcXVldWVfaGFuZGxlciAtIFdPUktFUl9SQU1QX0RPV05fUVVFVUUgZXZlbnQgaGFuZGxlcgogICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KICAqCkBAIC00NzIsNDEgKzQ1Nyw2IEBACiB9CiAKIC8qKgotICogbHBmY19yYW1wX3VwX3F1ZXVlX2hhbmRsZXIgLSBXT1JLRVJfUkFNUF9VUF9RVUVVRSBldmVudCBoYW5kbGVyCi0gKiBAcGhiYTogVGhlIEhiYSBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgotICoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gIHByb2Nlc3MgV09SS0VSX1JBTVBfVVBfUVVFVUUgZXZlbnQgZm9yIHdvcmtlcgotICogdGhyZWFkLlRoaXMgcm91dGluZSBpbmNyZWFzZXMgcXVldWUgZGVwdGggZm9yIGFsbCBzY3NpIGRldmljZSBvbiBlYWNoIHZwb3J0Ci0gKiBhc3NvY2lhdGVkIHdpdGggQHBoYmEgYnkgMS4gVGhpcyByb3V0aW5lIGFsc28gc2V0cyBAcGhiYSBudW1fcnNyY19lcnIgYW5kCi0gKiBudW1fY21kX3N1Y2Nlc3MgdG8gemVyby4KLSAqKi8KLXZvaWQKLWxwZmNfcmFtcF91cF9xdWV1ZV9oYW5kbGVyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKLXsKLQlzdHJ1Y3QgbHBmY192cG9ydCAqKnZwb3J0czsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3Q7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCWludCBpOwotCi0JdnBvcnRzID0gbHBmY19jcmVhdGVfdnBvcnRfd29ya19hcnJheShwaGJhKTsKLQlpZiAodnBvcnRzICE9IE5VTEwpCi0JCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bWF4X3Zwb3J0cyAmJiB2cG9ydHNbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCQlzaG9zdCA9IGxwZmNfc2hvc3RfZnJvbV92cG9ydCh2cG9ydHNbaV0pOwotCQkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7Ci0JCQkJaWYgKHZwb3J0c1tpXS0+Y2ZnX2x1bl9xdWV1ZV9kZXB0aCA8PQotCQkJCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCkKLQkJCQkJY29udGludWU7Ci0JCQkJbHBmY19jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwKLQkJCQkJCQlzZGV2LT5xdWV1ZV9kZXB0aCsxLAotCQkJCQkJCVNDU0lfUURFUFRIX1JBTVBfVVApOwotCQkJfQotCQl9Ci0JbHBmY19kZXN0cm95X3Zwb3J0X3dvcmtfYXJyYXkocGhiYSwgdnBvcnRzKTsKLQlhdG9taWNfc2V0KCZwaGJhLT5udW1fcnNyY19lcnIsIDApOwotCWF0b21pY19zZXQoJnBoYmEtPm51bV9jbWRfc3VjY2VzcywgMCk7Ci19Ci0KLS8qKgogICogbHBmY19zY3NpX2Rldl9ibG9jayAtIHNldCBhbGwgc2NzaSBob3N0cyB0byBibG9jayBzdGF0ZQogICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgogICoKQEAgLTE1MDIsNyArMTQ1Miw3IEBACiAJfQogCiAJLyogTmV4dCBjaGVjayBpZiB3ZSBuZWVkIHRvIG1hdGNoIHRoZSByZW1vdGUgTlBvcnRJRCBvciBXV1BOICovCi0JcmRhdGEgPSBzYy0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKHNjLT5kZXZpY2UpOwogCWlmIChyZGF0YSAmJiByZGF0YS0+cG5vZGUpIHsKIAkJbmRscCA9IHJkYXRhLT5wbm9kZTsKIApAQCAtMzUwNyw2ICszNDU3LDE0IEBACiAJICogd2UgbmVlZCB0byBzZXQgd29yZCA0IG9mIElPQ0IgaGVyZQogCSAqLwogCWlvY2JfY21kLT51bi5mY3BpLmZjcGlfcGFybSA9IHNjc2lfYnVmZmxlbihzY3NpX2NtbmQpOworCisJLyoKKwkgKiBJZiB0aGUgT0FTIGRyaXZlciBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSBsdW4gaXMgZW5hYmxlZCBmb3IKKwkgKiBPQVMsIHNldCB0aGUgb2FzIGlvY2IgcmVsYXRlZCBmbGFncy4KKwkgKi8KKwlpZiAoKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgJiYgKChzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqKQorCQlzY3NpX2NtbmQtPmRldmljZS0+aG9zdGRhdGEpLT5vYXNfZW5hYmxlZCkKKwkJbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiX2ZsYWcgfD0gTFBGQ19JT19PQVM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwMjEsNyArMzk3OSw2IEBACiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlID0gcmRhdGEtPnBub2RlOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlpbnQgcmVzdWx0OwotCXN0cnVjdCBzY3NpX2RldmljZSAqdG1wX3NkZXY7CiAJaW50IGRlcHRoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxwZmNfZmFzdF9wYXRoX2V2ZW50ICpmYXN0X3BhdGhfZXZ0OwpAQCAtNDI2NiwzMiArNDIyMyw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXJlc3VsdCkKLQkJbHBmY19yYW1wdXBfcXVldWVfZGVwdGgodnBvcnQsIHF1ZXVlX2RlcHRoKTsKLQotCS8qCi0JICogQ2hlY2sgZm9yIHF1ZXVlIGZ1bGwuICBJZiB0aGUgbHVuIGlzIHJlcG9ydGluZyBxdWV1ZSBmdWxsLCB0aGVuCi0JICogYmFjayBvZmYgdGhlIGx1biBxdWV1ZSBkZXB0aCB0byBwcmV2ZW50IHRhcmdldCBvdmVybG9hZHMuCi0JICovCi0JaWYgKHJlc3VsdCA9PSBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMICYmIHBub2RlICYmCi0JICAgIE5MUF9DSEtfTk9ERV9BQ1QocG5vZGUpKSB7Ci0JCXNob3N0X2Zvcl9lYWNoX2RldmljZSh0bXBfc2Rldiwgc2hvc3QpIHsKLQkJCWlmICh0bXBfc2Rldi0+aWQgIT0gc2NzaV9pZCkKLQkJCQljb250aW51ZTsKLQkJCWRlcHRoID0gc2NzaV90cmFja19xdWV1ZV9mdWxsKHRtcF9zZGV2LAotCQkJCQkJICAgICAgdG1wX3NkZXYtPnF1ZXVlX2RlcHRoLTEpOwotCQkJaWYgKGRlcHRoIDw9IDApCi0JCQkJY29udGludWU7Ci0JCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19GQ1AsCi0JCQkJCSAiMDcxMSBkZXRlY3RlZCBxdWV1ZSBmdWxsIC0gbHVuIHF1ZXVlICIKLQkJCQkJICJkZXB0aCBhZGp1c3RlZCB0byAlZC5cbiIsIGRlcHRoKTsKLQkJCWxwZmNfc2VuZF9zZGV2X3F1ZXVlZGVwdGhfY2hhbmdlX2V2ZW50KHBoYmEsIHZwb3J0LAotCQkJCQkJCSAgICAgICBwbm9kZSwKLQkJCQkJCQkgICAgICAgdG1wX3NkZXYtPmx1biwKLQkJCQkJCQkgICAgICAgZGVwdGgrMSwgZGVwdGgpOwotCQl9Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKIAlscGZjX2NtZC0+cENtZCA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwpAQCAtNDQ5Miw2ICs0NDIzLDggQEAKIAl9CiAJcGlvY2ItPnVscEZDUDJSY3Z5ID0gKG5kbHAtPm5scF9mY3BfaW5mbyAmIE5MUF9GQ1BfMl9ERVZJQ0UpID8gMSA6IDA7CiAJcGlvY2ItPnVscENsYXNzID0gKG5kbHAtPm5scF9mY3BfaW5mbyAmIDB4MGYpOworCXBpb2NiLT51bHBQVSA9IDA7CisJcGlvY2ItPnVuLmZjcGkuZmNwaV9wYXJtID0gMDsKIAogCS8qIHVscFRpbWVvdXQgaXMgb25seSBvbmUgYnl0ZSAqLwogCWlmIChscGZjX2NtZC0+dGltZW91dCA+IDB4ZmYpIHsKQEAgLTQ2OTEsMTIgKzQ2MjQsMTMgQEAKIHsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7Ci0Jc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGEgPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhOwogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwOwogCXN0cnVjdCBscGZjX3Njc2lfYnVmICpscGZjX2NtZDsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChjbW5kLT5kZXZpY2UpKTsKIAlpbnQgZXJyOwogCisJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShjbW5kLT5kZXZpY2UpOwogCWVyciA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KTsKIAlpZiAoZXJyKSB7CiAJCWNtbmQtPnJlc3VsdCA9IGVycjsKQEAgLTQ3ODIsNiArNDcxNiwyNCBAQAogCQkJCSAgJmxwZmNfY21kLT5jdXJfaW9jYnEsIFNMSV9JT0NCX1JFVF9JT0NCKTsKIAlpZiAoZXJyKSB7CiAJCWF0b21pY19kZWMoJm5kbHAtPmNtZF9wZW5kaW5nKTsKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRkNQLAorCQkJCSAiMzM3NiBGQ1AgY291bGQgbm90IGlzc3VlIElPQ0IgZXJyICV4IgorCQkJCSAiRkNQIGNtZCB4JXggPCVkLyVkPiAiCisJCQkJICJzaWQ6IHgleCBkaWQ6IHgleCBveGlkOiB4JXggIgorCQkJCSAiRGF0YTogeCV4IHgleCB4JXggeCV4XG4iLAorCQkJCSBlcnIsIGNtbmQtPmNtbmRbMF0sCisJCQkJIGNtbmQtPmRldmljZSA/IGNtbmQtPmRldmljZS0+aWQgOiAweGZmZmYsCisJCQkJIGNtbmQtPmRldmljZSA/IGNtbmQtPmRldmljZS0+bHVuIDogMHhmZmZmLAorCQkJCSB2cG9ydC0+ZmNfbXlESUQsIG5kbHAtPm5scF9ESUQsCisJCQkJIHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCA/CisJCQkJIGxwZmNfY21kLT5jdXJfaW9jYnEuc2xpNF94cml0YWcgOiAweGZmZmYsCisJCQkJIGxwZmNfY21kLT5jdXJfaW9jYnEuaW9jYi51bHBDb250ZXh0LAorCQkJCSBscGZjX2NtZC0+Y3VyX2lvY2JxLmlvY2IudWxwSW9UYWcsCisJCQkJIGxwZmNfY21kLT5jdXJfaW9jYnEuaW9jYi51bHBUaW1lb3V0LAorCQkJCSAodWludDMyX3QpCisJCQkJIChjbW5kLT5yZXF1ZXN0LT50aW1lb3V0IC8gMTAwMCkpOworCisKIAkJZ290byBvdXRfaG9zdF9idXN5X2ZyZWVfYnVmOwogCX0KIAlpZiAocGhiYS0+Y2ZnX3BvbGwgJiBFTkFCTEVfRkNQX1JJTkdfUE9MTElORykgewpAQCAtNTE2MSwxMCArNTExMywxMSBAQAogc3RhdGljIGludAogbHBmY19jaGtfdGd0X21hcHBlZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCiB7Ci0Jc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGEgPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhOwogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpwbm9kZTsKIAl1bnNpZ25lZCBsb25nIGxhdGVyOwogCisJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShjbW5kLT5kZXZpY2UpOwogCWlmICghcmRhdGEpIHsKIAkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRkNQLAogCQkJIjA3OTcgVGd0IE1hcCBycG9ydCBmYWlsdXJlOiByZGF0YSB4JXBcbiIsIHJkYXRhKTsKQEAgLTUxODIsNyArNTEzNSw3IEBACiAJCWlmIChwbm9kZS0+bmxwX3N0YXRlID09IE5MUF9TVEVfTUFQUEVEX05PREUpCiAJCQlyZXR1cm4gU1VDQ0VTUzsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyg1MDApKTsKLQkJcmRhdGEgPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCQlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKGNtbmQtPmRldmljZSk7CiAJCWlmICghcmRhdGEpCiAJCQlyZXR1cm4gRkFJTEVEOwogCQlwbm9kZSA9IHJkYXRhLT5wbm9kZTsKQEAgLTUyNTQsMTMgKzUyMDcsMTQgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBjbW5kLT5kZXZpY2UtPmhvc3Q7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YTsKLQlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGE7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlOwogCXVuc2lnbmVkIHRndF9pZCA9IGNtbmQtPmRldmljZS0+aWQ7CiAJdW5zaWduZWQgaW50IGx1bl9pZCA9IGNtbmQtPmRldmljZS0+bHVuOwogCXN0cnVjdCBscGZjX3Njc2lfZXZlbnRfaGVhZGVyIHNjc2lfZXZlbnQ7CiAJaW50IHN0YXR1czsKIAorCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2UoY21uZC0+ZGV2aWNlKTsKIAlpZiAoIXJkYXRhKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRkNQLAogCQkJIjA3OTggRGV2aWNlIFJlc2V0IHJwb3J0IGZhaWx1cmU6IHJkYXRhIHglcFxuIiwgcmRhdGEpOwpAQCAtNTMyMywxMyArNTI3NywxNCBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwotCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YTsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGU7CiAJdW5zaWduZWQgdGd0X2lkID0gY21uZC0+ZGV2aWNlLT5pZDsKIAl1bnNpZ25lZCBpbnQgbHVuX2lkID0gY21uZC0+ZGV2aWNlLT5sdW47CiAJc3RydWN0IGxwZmNfc2NzaV9ldmVudF9oZWFkZXIgc2NzaV9ldmVudDsKIAlpbnQgc3RhdHVzOwogCisJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShjbW5kLT5kZXZpY2UpOwogCWlmICghcmRhdGEpIHsKIAkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19GQ1AsCiAJCQkiMDc5OSBUYXJnZXQgUmVzZXQgcnBvcnQgZmFpbHVyZTogcmRhdGEgeCVwXG4iLCByZGF0YSk7CkBAIC01NTI5LDExICs1NDg0LDQ1IEBACiAJdWludDMyX3QgbnVtX3RvX2FsbG9jID0gMDsKIAlpbnQgbnVtX2FsbG9jYXRlZCA9IDA7CiAJdWludDMyX3Qgc2Rldl9jbnQ7CisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmRldmljZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxwZmNfbmFtZSB0YXJnZXRfd3dwbjsKIAogCWlmICghcnBvcnQgfHwgZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpKQogCQlyZXR1cm4gLUVOWElPOwogCi0Jc2Rldi0+aG9zdGRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSB7CisKKwkJLyoKKwkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBsdW4KKwkJICogZXhpc3RzLiAgSWYgbm90LCBjcmVhdGUgb25lLgorCQkgKi8KKworCQl1NjRfdG9fd3duKHJwb3J0LT5wb3J0X25hbWUsIHRhcmdldF93d3BuLnUud3duKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJZGV2aWNlX2RhdGEgPSBfX2xwZmNfZ2V0X2RldmljZV9kYXRhKHBoYmEsCisJCQkJCQkgICAgICZwaGJhLT5sdW5zLAorCQkJCQkJICAgICAmdnBvcnQtPmZjX3BvcnRuYW1lLAorCQkJCQkJICAgICAmdGFyZ2V0X3d3cG4sCisJCQkJCQkgICAgIHNkZXYtPmx1bik7CisJCWlmICghZGV2aWNlX2RhdGEpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJCWRldmljZV9kYXRhID0gbHBmY19jcmVhdGVfZGV2aWNlX2RhdGEocGhiYSwKKwkJCQkJCQkmdnBvcnQtPmZjX3BvcnRuYW1lLAorCQkJCQkJCSZ0YXJnZXRfd3dwbiwKKwkJCQkJCQlzZGV2LT5sdW4sIHRydWUpOworCQkJaWYgKCFkZXZpY2VfZGF0YSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZkZXZpY2VfZGF0YS0+bGlzdGVudHJ5LCAmcGhiYS0+bHVucyk7CisJCX0KKwkJZGV2aWNlX2RhdGEtPnJwb3J0X2RhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwkJZGV2aWNlX2RhdGEtPmF2YWlsYWJsZSA9IHRydWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJc2Rldi0+aG9zdGRhdGEgPSBkZXZpY2VfZGF0YTsKKwl9IGVsc2UgeworCQlzZGV2LT5ob3N0ZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCX0KIAlzZGV2X2NudCA9IGF0b21pY19pbmNfcmV0dXJuKCZwaGJhLT5zZGV2X2NudCk7CiAKIAkvKgpAQCAtNTYyMywxMSArNTYxMiwzNDQgQEAKIHsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpkZXZpY2VfZGF0YSA9IHNkZXYtPmhvc3RkYXRhOworCiAJYXRvbWljX2RlYygmcGhiYS0+c2Rldl9jbnQpOworCWlmICgocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSAmJiAoZGV2aWNlX2RhdGEpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCWRldmljZV9kYXRhLT5hdmFpbGFibGUgPSBmYWxzZTsKKwkJaWYgKCFkZXZpY2VfZGF0YS0+b2FzX2VuYWJsZWQpCisJCQlscGZjX2RlbGV0ZV9kZXZpY2VfZGF0YShwaGJhLCBkZXZpY2VfZGF0YSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwl9CiAJc2Rldi0+aG9zdGRhdGEgPSBOVUxMOwogCXJldHVybjsKIH0KIAorLyoqCisgKiBscGZjX2NyZWF0ZV9kZXZpY2VfZGF0YSAtIGNyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGRldmljZSBkYXRhIHN0cnVjdHVyZSBmb3IgT0FTCisgKiBAcGhhOiBQb2ludGVyIHRvIGhvc3QgYnVzIGFkYXB0ZXIgc3RydWN0dXJlLgorICogQHZwb3J0X3d3cG46IFBvaW50ZXIgdG8gdnBvcnQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAdGFyZ2V0X3d3cG46IFBvaW50ZXIgdG8gdGFyZ2V0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQGx1bjogTHVuIG9uIHRhcmdldAorICogQGF0b21pY19jcmVhdGU6IEZsYWcgdG8gaW5kaWNhdGUgaWYgbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgdXNpbmcgdGhlCisgKgkJICBHRlBfQVRPTUlDIGZsYWcgb3Igbm90LgorICoKKyAqIFRoaXMgcm91dGluZSBjcmVhdGVzIGEgZGV2aWNlIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdpbGwgY29udGFpbiBpZGVudGlmeWluZworICogaW5mb3JtYXRpb24gZm9yIHRoZSBkZXZpY2UgKGhvc3Qgd3dwbiwgdGFyZ2V0IHd3cG4sIGx1biksIHN0YXRlIG9mIE9BUywKKyAqIHdoZXRoZXIgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIGx1biBpcyBhdmFpbGFibGUgYnkgdGhlIHN5c3RlbSwKKyAqIGFuZCBwb2ludGVyIHRvIHRoZSBycG9ydCBkYXRhLgorICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgTlVMTCAtIEVycm9yCisgKiAgIFBvaW50ZXIgdG8gbHBmY19kZXZpY2VfZGF0YSAtIFN1Y2Nlc3MKKyAqKi8KK3N0cnVjdCBscGZjX2RldmljZV9kYXRhKgorbHBmY19jcmVhdGVfZGV2aWNlX2RhdGEoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19uYW1lICp2cG9ydF93d3BuLAorCQkJc3RydWN0IGxwZmNfbmFtZSAqdGFyZ2V0X3d3cG4sIHVpbnQ2NF90IGx1biwKKwkJCWJvb2wgYXRvbWljX2NyZWF0ZSkKK3sKKworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpsdW5faW5mbzsKKwlpbnQgbWVtb3J5X2ZsYWdzOworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhdnBvcnRfd3dwbiB8fCAhdGFyZ2V0X3d3cG4gIHx8CisJICAgICEocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBdHRlbXB0IHRvIGNyZWF0ZSB0aGUgZGV2aWNlIGRhdGEgdG8gY29udGFpbiBsdW4gaW5mbyAqLworCisJaWYgKGF0b21pY19jcmVhdGUpCisJCW1lbW9yeV9mbGFncyA9IEdGUF9BVE9NSUM7CisJZWxzZQorCQltZW1vcnlfZmxhZ3MgPSBHRlBfS0VSTkVMOworCWx1bl9pbmZvID0gbWVtcG9vbF9hbGxvYyhwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCwgbWVtb3J5X2ZsYWdzKTsKKwlpZiAoIWx1bl9pbmZvKQorCQlyZXR1cm4gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmbHVuX2luZm8tPmxpc3RlbnRyeSk7CisJbHVuX2luZm8tPnJwb3J0X2RhdGEgID0gTlVMTDsKKwltZW1jcHkoJmx1bl9pbmZvLT5kZXZpY2VfaWQudnBvcnRfd3dwbiwgdnBvcnRfd3dwbiwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwltZW1jcHkoJmx1bl9pbmZvLT5kZXZpY2VfaWQudGFyZ2V0X3d3cG4sIHRhcmdldF93d3BuLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCWx1bl9pbmZvLT5kZXZpY2VfaWQubHVuID0gbHVuOworCWx1bl9pbmZvLT5vYXNfZW5hYmxlZCA9IGZhbHNlOworCWx1bl9pbmZvLT5hdmFpbGFibGUgPSBmYWxzZTsKKwlyZXR1cm4gbHVuX2luZm87Cit9CisKKy8qKgorICogbHBmY19kZWxldGVfZGV2aWNlX2RhdGEgLSBmcmVlcyBhIGRldmljZSBkYXRhIHN0cnVjdHVyZSBmb3IgT0FTCisgKiBAcGhhOiBQb2ludGVyIHRvIGhvc3QgYnVzIGFkYXB0ZXIgc3RydWN0dXJlLgorICogQGx1bl9pbmZvOiBQb2ludGVyIHRvIGRldmljZSBkYXRhIHN0cnVjdHVyZSB0byBmcmVlLgorICoKKyAqIFRoaXMgcm91dGluZSBmcmVlcyB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgZGV2aWNlIGRhdGEgc3RydWN0dXJlIHBhc3NlZC4KKyAqCisgKiovCit2b2lkCitscGZjX2RlbGV0ZV9kZXZpY2VfZGF0YShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCisJCQlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHVuX2luZm8pCit7CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICFsdW5faW5mbyAgfHwKKwkgICAgIShwaGJhLT5jZmdfRW5hYmxlWExhbmUpKQorCQlyZXR1cm47CisKKwlpZiAoIWxpc3RfZW1wdHkoJmx1bl9pbmZvLT5saXN0ZW50cnkpKQorCQlsaXN0X2RlbCgmbHVuX2luZm8tPmxpc3RlbnRyeSk7CisJbWVtcG9vbF9mcmVlKGx1bl9pbmZvLCBwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIF9fbHBmY19nZXRfZGV2aWNlX2RhdGEgLSByZXR1cm5zIHRoZSBkZXZpY2UgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBsdW4KKyAqIEBwaGE6IFBvaW50ZXIgdG8gaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAbGlzdDogUG9pbnQgdG8gbGlzdCB0byBzZWFyY2guCisgKiBAdnBvcnRfd3dwbjogUG9pbnRlciB0byB2cG9ydCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEB0YXJnZXRfd3dwbjogUG9pbnRlciB0byB0YXJnZXQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAbHVuOiBMdW4gb24gdGFyZ2V0CisgKgorICogVGhpcyByb3V0aW5lIHNlYXJjaGVzIHRoZSBsaXN0IHBhc3NlZCBmb3IgdGhlIHNwZWNpZmllZCBsdW4ncyBkZXZpY2UgZGF0YS4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaG9sZCBsb2NrcywgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIKKyAqIHRvIGVuc3VyZSB0aGUgcHJvcGVyIGxvY2sgaXMgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGUgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIGNvZGVzOgorICogICBOVUxMIC0gRXJyb3IKKyAqICAgUG9pbnRlciB0byBscGZjX2RldmljZV9kYXRhIC0gU3VjY2VzcworICoqLworc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEqCitfX2xwZmNfZ2V0X2RldmljZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJICAgICAgIHN0cnVjdCBscGZjX25hbWUgKnZwb3J0X3d3cG4sCisJCSAgICAgICBzdHJ1Y3QgbHBmY19uYW1lICp0YXJnZXRfd3dwbiwgdWludDY0X3QgbHVuKQoreworCisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmx1bl9pbmZvOworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhbGlzdCB8fCAhdnBvcnRfd3dwbiB8fCAhdGFyZ2V0X3d3cG4gfHwKKwkgICAgIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGx1biBpcyBhbHJlYWR5IGVuYWJsZWQgZm9yIE9BUy4gKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobHVuX2luZm8sIGxpc3QsIGxpc3RlbnRyeSkgeworCQlpZiAoKG1lbWNtcCgmbHVuX2luZm8tPmRldmljZV9pZC52cG9ydF93d3BuLCB2cG9ydF93d3BuLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSkgPT0gMCkgJiYKKwkJICAgIChtZW1jbXAoJmx1bl9pbmZvLT5kZXZpY2VfaWQudGFyZ2V0X3d3cG4sIHRhcmdldF93d3BuLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSkgPT0gMCkgJiYKKwkJICAgIChsdW5faW5mby0+ZGV2aWNlX2lkLmx1biA9PSBsdW4pKQorCQkJcmV0dXJuIGx1bl9pbmZvOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGxwZmNfZmluZF9uZXh0X29hc19sdW4gLSBzZWFyY2hlcyBmb3IgdGhlIG5leHQgb2FzIGx1bgorICogQHBoYTogUG9pbnRlciB0byBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEB2cG9ydF93d3BuOiBQb2ludGVyIHRvIHZwb3J0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQHRhcmdldF93d3BuOiBQb2ludGVyIHRvIHRhcmdldCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEBzdGFydGluZ19sdW46IFBvaW50ZXIgdG8gdGhlIGx1biB0byBzdGFydCBzZWFyY2hpbmcgZm9yCisgKiBAZm91bmRfdnBvcnRfd3dwbjogUG9pbnRlciB0byB0aGUgZm91bmQgbHVuJ3MgdnBvcnQgd3dwbiBpbmZvcm1hdGlvbgorICogQGZvdW5kX3RhcmdldF93d3BuOiBQb2ludGVyIHRvIHRoZSBmb3VuZCBsdW4ncyB0YXJnZXQgd3dwbiBpbmZvcm1hdGlvbgorICogQGZvdW5kX2x1bjogUG9pbnRlciB0byB0aGUgZm91bmQgbHVuLgorICogQGZvdW5kX2x1bl9zdGF0dXM6IFBvaW50ZXIgdG8gc3RhdHVzIG9mIHRoZSBmb3VuZCBsdW4uCisgKgorICogVGhpcyByb3V0aW5lIHNlYXJjaGVzIHRoZSBsdW5zIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbHVuCisgKiBvciB0aGUgZmlyc3QgbHVuIGZvciB0aGUgdnBvcnQvdGFyZ2V0LiAgSWYgdGhlIHZwb3J0IHd3cG4gY29udGFpbnMKKyAqIGEgemVybyB2YWx1ZSB0aGVuIGEgc3BlY2lmaWMgdnBvcnQgaXMgbm90IHNwZWNpZmllZC4gSW4gdGhpcyBjYXNlCisgKiBhbnkgdnBvcnQgd2hpY2ggY29udGFpbnMgdGhlIGx1biB3aWxsIGJlIGNvbnNpZGVyZWQgYSBtYXRjaC4gIElmIHRoZQorICogdGFyZ2V0IHd3cG4gY29udGFpbnMgYSB6ZXJvIHZhbHVlIHRoZW4gYSBzcGVjaWZpYyB0YXJnZXQgaXMgbm90IHNwZWNpZmllZC4KKyAqIEluIHRoaXMgY2FzZSBhbnkgdGFyZ2V0IHdoaWNoIGNvbnRhaW5zIHRoZSBsdW4gd2lsbCBiZSBjb25zaWRlcmVkIGEKKyAqIG1hdGNoLiAgSWYgdGhlIGx1biBpcyBmb3VuZCwgdGhlIGx1biwgdnBvcnQgd3dwbiwgdGFyZ2V0IHd3cG4gYW5kIGx1biBzdGF0dXMKKyAqIGFyZSByZXR1cm5lZC4gIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gcmV0dXJuIHRoZSBuZXh0IGx1biBpZiBhdmFpbGFibGUuCisgKiBJZiB0aGUgbmV4dCBsdW4gaXMgbm90IGZvdW5kLCBzdGFydGluZ19sdW4gcGFyYW1ldGVyIHdpbGwgYmUgc2V0IHRvCisgKiBOT19NT1JFX09BU19MVU4uCisgKgorICogUmV0dXJuIGNvZGVzOgorICogICBub24tMCAtIEVycm9yCisgKiAgIDAgLSBTdWNjZXNzCisgKiovCitib29sCitscGZjX2ZpbmRfbmV4dF9vYXNfbHVuKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfbmFtZSAqdnBvcnRfd3dwbiwKKwkJICAgICAgIHN0cnVjdCBscGZjX25hbWUgKnRhcmdldF93d3BuLCB1aW50NjRfdCAqc3RhcnRpbmdfbHVuLAorCQkgICAgICAgc3RydWN0IGxwZmNfbmFtZSAqZm91bmRfdnBvcnRfd3dwbiwKKwkJICAgICAgIHN0cnVjdCBscGZjX25hbWUgKmZvdW5kX3RhcmdldF93d3BuLAorCQkgICAgICAgdWludDY0X3QgKmZvdW5kX2x1biwKKwkJICAgICAgIHVpbnQzMl90ICpmb3VuZF9sdW5fc3RhdHVzKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHVuX2luZm87CisJc3RydWN0IGxwZmNfZGV2aWNlX2lkICpkZXZpY2VfaWQ7CisJdWludDY0X3QgbHVuOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIXZwb3J0X3d3cG4gfHwgIXRhcmdldF93d3BuIHx8CisJICAgICFzdGFydGluZ19sdW4gfHwgIWZvdW5kX3Zwb3J0X3d3cG4gfHwKKwkgICAgIWZvdW5kX3RhcmdldF93d3BuIHx8ICFmb3VuZF9sdW4gfHwgIWZvdW5kX2x1bl9zdGF0dXMgfHwKKwkgICAgKCpzdGFydGluZ19sdW4gPT0gTk9fTU9SRV9PQVNfTFVOKSB8fAorCSAgICAhcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsdW4gPSAqc3RhcnRpbmdfbHVuOworCSpmb3VuZF9sdW4gPSBOT19NT1JFX09BU19MVU47CisJKnN0YXJ0aW5nX2x1biA9IE5PX01PUkVfT0FTX0xVTjsKKworCS8qIFNlYXJjaCBmb3IgbHVuIG9yIHRoZSBsdW4gY2xvc2V0IGluIHZhbHVlICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobHVuX2luZm8sICZwaGJhLT5sdW5zLCBsaXN0ZW50cnkpIHsKKwkJaWYgKCgod3duX3RvX3U2NCh2cG9ydF93d3BuLT51Lnd3bikgPT0gMCkgfHwKKwkJICAgICAobWVtY21wKCZsdW5faW5mby0+ZGV2aWNlX2lkLnZwb3J0X3d3cG4sIHZwb3J0X3d3cG4sCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKSA9PSAwKSkgJiYKKwkJICAgICgod3duX3RvX3U2NCh0YXJnZXRfd3dwbi0+dS53d24pID09IDApIHx8CisJCSAgICAgKG1lbWNtcCgmbHVuX2luZm8tPmRldmljZV9pZC50YXJnZXRfd3dwbiwgdGFyZ2V0X3d3cG4sCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKSA9PSAwKSkgJiYKKwkJICAgIChsdW5faW5mby0+b2FzX2VuYWJsZWQpKSB7CisJCQlkZXZpY2VfaWQgPSAmbHVuX2luZm8tPmRldmljZV9pZDsKKwkJCWlmICgoIWZvdW5kKSAmJgorCQkJICAgICgobHVuID09IEZJTkRfRklSU1RfT0FTX0xVTikgfHwKKwkJCSAgICAgKGRldmljZV9pZC0+bHVuID09IGx1bikpKSB7CisJCQkJKmZvdW5kX2x1biA9IGRldmljZV9pZC0+bHVuOworCQkJCW1lbWNweShmb3VuZF92cG9ydF93d3BuLAorCQkJCSAgICAgICAmZGV2aWNlX2lkLT52cG9ydF93d3BuLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCQkJCW1lbWNweShmb3VuZF90YXJnZXRfd3dwbiwKKwkJCQkgICAgICAgJmRldmljZV9pZC0+dGFyZ2V0X3d3cG4sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJCQkJaWYgKGx1bl9pbmZvLT5hdmFpbGFibGUpCisJCQkJCSpmb3VuZF9sdW5fc3RhdHVzID0KKwkJCQkJCU9BU19MVU5fU1RBVFVTX0VYSVNUUzsKKwkJCQllbHNlCisJCQkJCSpmb3VuZF9sdW5fc3RhdHVzID0gMDsKKwkJCQlpZiAocGhiYS0+Y2ZnX29hc19mbGFncyAmIE9BU19GSU5EX0FOWV9WUE9SVCkKKwkJCQkJbWVtc2V0KHZwb3J0X3d3cG4sIDB4MCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJCQkJaWYgKHBoYmEtPmNmZ19vYXNfZmxhZ3MgJiBPQVNfRklORF9BTllfVEFSR0VUKQorCQkJCQltZW1zZXQodGFyZ2V0X3d3cG4sIDB4MCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJCQkJZm91bmQgPSB0cnVlOworCQkJfSBlbHNlIGlmIChmb3VuZCkgeworCQkJCSpzdGFydGluZ19sdW4gPSBkZXZpY2VfaWQtPmx1bjsKKwkJCQltZW1jcHkodnBvcnRfd3dwbiwgJmRldmljZV9pZC0+dnBvcnRfd3dwbiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwkJCQltZW1jcHkodGFyZ2V0X3d3cG4sICZkZXZpY2VfaWQtPnRhcmdldF93d3BuLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qKgorICogbHBmY19lbmFibGVfb2FzX2x1biAtIGVuYWJsZXMgYSBsdW4gZm9yIE9BUyBvcGVyYXRpb25zCisgKiBAcGhhOiBQb2ludGVyIHRvIGhvc3QgYnVzIGFkYXB0ZXIgc3RydWN0dXJlLgorICogQHZwb3J0X3d3cG46IFBvaW50ZXIgdG8gdnBvcnQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAdGFyZ2V0X3d3cG46IFBvaW50ZXIgdG8gdGFyZ2V0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQGx1bjogTHVuCisgKgorICogVGhpcyByb3V0aW5lIGVuYWJsZXMgYSBsdW4gZm9yIG9hcyBvcGVyYXRpb25zLiAgVGhlIHJvdXRpbmVzIGRvZXMgc28gYnkKKyAqIGRvaW5nIHRoZSBmb2xsb3dpbmcgOgorICoKKyAqICAgMSkgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZGV2aWNlIGRhdGEgZm9yIHRoZSBsdW4gaGFzIGJlZW4gY3JlYXRlZC4KKyAqICAgMikgSWYgZm91bmQsIHNldHMgdGhlIE9BUyBlbmFibGVkIGZsYWcgaWYgbm90IHNldCBhbmQgcmV0dXJucy4KKyAqICAgMykgT3RoZXJ3aXNlLCBjcmVhdGVzIGEgZGV2aWNlIGRhdGEgc3RydWN0dXJlLgorICogICA0KSBJZiBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgaW5kaWNhdGVzIHRoZSBkZXZpY2UgZGF0YSBpcyBmb3IgYW4gT0FTIGx1biwKKyAqICAgaW5kaWNhdGVzIHRoZSBsdW4gaXMgbm90IGF2YWlsYWJsZSBhbmQgYWRkIHRvIHRoZSBsaXN0IG9mIGx1bnMuCisgKgorICogUmV0dXJuIGNvZGVzOgorICogICBmYWxzZSAtIEVycm9yCisgKiAgIHRydWUgLSBTdWNjZXNzCisgKiovCitib29sCitscGZjX2VuYWJsZV9vYXNfbHVuKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfbmFtZSAqdnBvcnRfd3dwbiwKKwkJICAgIHN0cnVjdCBscGZjX25hbWUgKnRhcmdldF93d3BuLCB1aW50NjRfdCBsdW4pCit7CisKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHVuX2luZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIXZwb3J0X3d3cG4gfHwgIXRhcmdldF93d3BuIHx8CisJICAgICFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGRldmljZSBkYXRhIGZvciB0aGUgbHVuIGhhcyBiZWVuIGNyZWF0ZWQgKi8KKwlsdW5faW5mbyA9IF9fbHBmY19nZXRfZGV2aWNlX2RhdGEocGhiYSwgJnBoYmEtPmx1bnMsIHZwb3J0X3d3cG4sCisJCQkJCSAgdGFyZ2V0X3d3cG4sIGx1bik7CisJaWYgKGx1bl9pbmZvKSB7CisJCWlmICghbHVuX2luZm8tPm9hc19lbmFibGVkKQorCQkJbHVuX2luZm8tPm9hc19lbmFibGVkID0gdHJ1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBDcmVhdGUgYW4gbHVuIGluZm8gc3RydWN0dXJlIGFuZCBhZGQgdG8gbGlzdCBvZiBsdW5zICovCisJbHVuX2luZm8gPSBscGZjX2NyZWF0ZV9kZXZpY2VfZGF0YShwaGJhLCB2cG9ydF93d3BuLCB0YXJnZXRfd3dwbiwgbHVuLAorCQkJCQkgICBmYWxzZSk7CisJaWYgKGx1bl9pbmZvKSB7CisJCWx1bl9pbmZvLT5vYXNfZW5hYmxlZCA9IHRydWU7CisJCWx1bl9pbmZvLT5hdmFpbGFibGUgPSBmYWxzZTsKKwkJbGlzdF9hZGRfdGFpbCgmbHVuX2luZm8tPmxpc3RlbnRyeSwgJnBoYmEtPmx1bnMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCXJldHVybiB0cnVlOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGxwZmNfZGlzYWJsZV9vYXNfbHVuIC0gZGlzYWJsZXMgYSBsdW4gZm9yIE9BUyBvcGVyYXRpb25zCisgKiBAcGhhOiBQb2ludGVyIHRvIGhvc3QgYnVzIGFkYXB0ZXIgc3RydWN0dXJlLgorICogQHZwb3J0X3d3cG46IFBvaW50ZXIgdG8gdnBvcnQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAdGFyZ2V0X3d3cG46IFBvaW50ZXIgdG8gdGFyZ2V0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQGx1bjogTHVuCisgKgorICogVGhpcyByb3V0aW5lIGRpc2FibGVzIGEgbHVuIGZvciBvYXMgb3BlcmF0aW9ucy4gIFRoZSByb3V0aW5lcyBkb2VzIHNvIGJ5CisgKiBkb2luZyB0aGUgZm9sbG93aW5nIDoKKyAqCisgKiAgIDEpIENoZWNrcyB0byBzZWUgaWYgdGhlIGRldmljZSBkYXRhIGZvciB0aGUgbHVuIGlzIGNyZWF0ZWQuCisgKiAgIDIpIElmIHByZXNlbnQsIGNsZWFycyB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoaXMgbHVuIGlzIGZvciBPQVMuCisgKiAgIDMpIElmIHRoZSBsdW4gaXMgbm90IGF2YWlsYWJsZSBieSB0aGUgc3lzdGVtLCB0aGUgZGV2aWNlIGRhdGEgaXMKKyAqICAgZnJlZWQuCisgKgorICogUmV0dXJuIGNvZGVzOgorICogICBmYWxzZSAtIEVycm9yCisgKiAgIHRydWUgLSBTdWNjZXNzCisgKiovCitib29sCitscGZjX2Rpc2FibGVfb2FzX2x1bihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX25hbWUgKnZwb3J0X3d3cG4sCisJCSAgICAgc3RydWN0IGxwZmNfbmFtZSAqdGFyZ2V0X3d3cG4sIHVpbnQ2NF90IGx1bikKK3sKKworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpsdW5faW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhdnBvcnRfd3dwbiB8fCAhdGFyZ2V0X3d3cG4gfHwKKwkgICAgIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbHVuIGlzIGF2YWlsYWJsZS4gKi8KKwlsdW5faW5mbyA9IF9fbHBmY19nZXRfZGV2aWNlX2RhdGEocGhiYSwKKwkJCQkJICAmcGhiYS0+bHVucywgdnBvcnRfd3dwbiwKKwkJCQkJICB0YXJnZXRfd3dwbiwgbHVuKTsKKwlpZiAobHVuX2luZm8pIHsKKwkJbHVuX2luZm8tPm9hc19lbmFibGVkID0gZmFsc2U7CisJCWlmICghbHVuX2luZm8tPmF2YWlsYWJsZSkKKwkJCWxwZmNfZGVsZXRlX2RldmljZV9kYXRhKHBoYmEsIGx1bl9pbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJcmV0dXJuIGZhbHNlOworfQogCiBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGxwZmNfdGVtcGxhdGUgPSB7CiAJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oCmluZGV4IDg1MmZmN2QuLjAxMjBiZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oCkBAIC00MSw2ICs0MSwyMCBAQAogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpwbm9kZTsJLyogUG9pbnRlciB0byB0aGUgbm9kZSBzdHJ1Y3R1cmUuICovCiB9OwogCitzdHJ1Y3QgbHBmY19kZXZpY2VfaWQgeworCXN0cnVjdCBscGZjX25hbWUgdnBvcnRfd3dwbjsKKwlzdHJ1Y3QgbHBmY19uYW1lIHRhcmdldF93d3BuOworCXVpbnQ2NF90IGx1bjsKK307CisKK3N0cnVjdCBscGZjX2RldmljZV9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RlbnRyeTsKKwlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpycG9ydF9kYXRhOworCXN0cnVjdCBscGZjX2RldmljZV9pZCBkZXZpY2VfaWQ7CisJYm9vbCBvYXNfZW5hYmxlZDsKKwlib29sIGF2YWlsYWJsZTsKK307CisKIHN0cnVjdCBmY3BfcnNwIHsKIAl1aW50MzJfdCByc3BSc3ZkMTsJLyogRkMgV29yZCAwLCBieXRlIDA6MyAqLwogCXVpbnQzMl90IHJzcFJzdmQyOwkvKiBGQyBXb3JkIDEsIGJ5dGUgMDozICovCkBAIC0xNjYsMyArMTgwLDcgQEAKICNkZWZpbmUgTFBGQ19TQ1NJX0RNQV9FWFRfU0laRSAyNjQKICNkZWZpbmUgTFBGQ19CUExfU0laRSAgICAgICAgICAxMDI0CiAjZGVmaW5lIE1EQUNfRElSRUNUX0NNRCAgICAgICAgICAgICAgICAgIDB4MjIKKworI2RlZmluZSBGSU5EX0ZJUlNUX09BU19MVU4JCSAwCisjZGVmaW5lIE5PX01PUkVfT0FTX0xVTgkJCS0xCisjZGVmaW5lIE5PVF9PQVNfRU5BQkxFRF9MVU4JCU5PX01PUkVfT0FTX0xVTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKaW5kZXggOGY1ODBmZC4uNmJiNTFmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJaWYgKCFuZGxwKQogCQlnb3RvIG91dDsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoeHJpdGFnLCBuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSkgeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoeHJpdGFnLCBuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwKSkgewogCQlycnEtPnNlbmRfcnJxID0gMDsKIAkJcnJxLT54cml0YWcgPSAwOwogCQlycnEtPnJycV9zdG9wX3RpbWUgPSAwOwpAQCAtNjc4LDcgKzY3OCw4IEBACiAJCQluZXh0X3RpbWUgPSBycnEtPnJycV9zdG9wX3RpbWU7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZwaGJhLT5hY3RpdmVfcnJxX2xpc3QpKQorCWlmICgoIWxpc3RfZW1wdHkoJnBoYmEtPmFjdGl2ZV9ycnFfbGlzdCkpICYmCisJICAgICghKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKSkKIAkJbW9kX3RpbWVyKCZwaGJhLT5ycnFfdG1yLCBuZXh0X3RpbWUpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycnEsIG5leHRycnEsICZzZW5kX3JycSwgbGlzdCkgewogCQlsaXN0X2RlbCgmcnJxLT5saXN0KTsKQEAgLTc5Miw3ICs3OTMsOSBAQAogCQlsaXN0X2RlbCgmcnJxLT5saXN0KTsKIAkJbHBmY19jbHJfcnJxX2FjdGl2ZShwaGJhLCBycnEtPnhyaXRhZywgcnJxKTsKIAl9Ci0JaWYgKCFsaXN0X2VtcHR5KCZwaGJhLT5hY3RpdmVfcnJxX2xpc3QpKQorCWlmICgoIWxpc3RfZW1wdHkoJnBoYmEtPmFjdGl2ZV9ycnFfbGlzdCkpICYmCisJICAgICghKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKSkKKwogCQltb2RfdGltZXIoJnBoYmEtPnJycV90bXIsIG5leHRfdGltZSk7CiB9CiAKQEAgLTgxMyw3ICs4MTYsOSBAQAogewogCWlmICghbmRscCkKIAkJcmV0dXJuIDA7Ci0JaWYgKHRlc3RfYml0KHhyaXRhZywgbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpCisJaWYgKCFuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQlyZXR1cm4gMDsKKwlpZiAodGVzdF9iaXQoeHJpdGFnLCBuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwKSkKIAkJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIDA7CkBAIC04NjMsNyArODY4LDEwIEBACiAJaWYgKG5kbHAtPnZwb3J0ICYmIChuZGxwLT52cG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAodGVzdF9hbmRfc2V0X2JpdCh4cml0YWcsIG5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKQorCWlmICghbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCh4cml0YWcsIG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApKQogCQlnb3RvIG91dDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7CkBAIC0xMzE4LDcgKzEzMjYsOCBAQAogCiAJaWYgKCh1bmxpa2VseShwcmluZy0+cmluZ25vID09IExQRkNfRUxTX1JJTkcpKSAmJgogCSAgIChwaW9jYi0+aW9jYi51bHBDb21tYW5kICE9IENNRF9BQk9SVF9YUklfQ04pICYmCi0JICAgKHBpb2NiLT5pb2NiLnVscENvbW1hbmQgIT0gQ01EX0NMT1NFX1hSSV9DTikpIHsKKwkgICAocGlvY2ItPmlvY2IudWxwQ29tbWFuZCAhPSBDTURfQ0xPU0VfWFJJX0NOKSAmJgorCSAoIShwaW9jYi0+dnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpKSB7CiAJCWlmICghcGlvY2ItPnZwb3J0KQogCQkJQlVHKCk7CiAJCWVsc2UKQEAgLTQ5NzEsMTIgKzQ5ODAsMTkgQEAKIAkJCQkJICAgICBMUEZDX1FVRVVFX1JFQVJNKTsKIAkJfSB3aGlsZSAoKytmY3BfZXFpZHggPCBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwpOwogCX0KKworCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCWxwZmNfc2xpNF9jcV9yZWxlYXNlKHBoYmEtPnNsaTRfaGJhLm9hc19jcSwgTFBGQ19RVUVVRV9SRUFSTSk7CisKIAlpZiAocGhiYS0+c2xpNF9oYmEuaGJhX2VxKSB7CiAJCWZvciAoZmNwX2VxaWR4ID0gMDsgZmNwX2VxaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsOwogCQkgICAgIGZjcF9lcWlkeCsrKQogCQkJbHBmY19zbGk0X2VxX3JlbGVhc2UocGhiYS0+c2xpNF9oYmEuaGJhX2VxW2ZjcF9lcWlkeF0sCiAJCQkJCSAgICAgTFBGQ19RVUVVRV9SRUFSTSk7CiAJfQorCisJaWYgKHBoYmEtPmNmZ19mb2YpCisJCWxwZmNfc2xpNF9lcV9yZWxlYXNlKHBoYmEtPnNsaTRfaGJhLmZvZl9lcSwgTFBGQ19RVUVVRV9SRUFSTSk7CiB9CiAKIC8qKgpAQCAtODAzMiw3ICs4MDQ4LDggQEAKIAlzdHJ1Y3QgbHBmY192ZWN0b3JfbWFwX2luZm8gKmNwdXA7CiAJaW50IGNoYW5uLCBjcHU7CiAKLQlpZiAocGhiYS0+Y2ZnX2ZjcF9pb19zY2hlZCA9PSBMUEZDX0ZDUF9TQ0hFRF9CWV9DUFUpIHsKKwlpZiAocGhiYS0+Y2ZnX2ZjcF9pb19zY2hlZCA9PSBMUEZDX0ZDUF9TQ0hFRF9CWV9DUFUKKwkgICAgJiYgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsID4gMSkgewogCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCWlmIChjcHUgPCBwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHUpIHsKIAkJCWNwdXAgPSBwaGJhLT5zbGk0X2hiYS5jcHVfbWFwOwpAQCAtODI1MCw2ICs4MjY3LDE0IEBACiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgMCk7CiAJCWJmX3NldCh3cWVfcHUsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgaW9jYnEtPmlvY2IudWxwUFUpOwogCQliZl9zZXQod3FlX2RiZGUsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgMSk7CisJCWlmIChpb2NicS0+aW9jYl9mbGFnICYgTFBGQ19JT19PQVMpIHsKKwkJCWJmX3NldCh3cWVfb2FzLCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIDEpOworCQkJaWYgKHBoYmEtPmNmZ19YTGFuZVByaW9yaXR5KSB7CisJCQkJYmZfc2V0KHdxZV9jY3BlLCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIDEpOworCQkJCWJmX3NldCh3cWVfY2NwLCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sCisJCQkJICAgICAgIChwaGJhLT5jZmdfWExhbmVQcmlvcml0eSA8PCAxKSk7CisJCQl9CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDTURfRkNQX0lSRUFENjRfQ1I6CiAJCS8qIHdvcmQzIGlvY2I9aW90YWcgd3FlPXBheWxvYWRfb2Zmc2V0X2xlbiAqLwpAQCAtODI3MSw2ICs4Mjk2LDE0IEBACiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCAwKTsKIAkJYmZfc2V0KHdxZV9wdSwgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sIGlvY2JxLT5pb2NiLnVscFBVKTsKIAkJYmZfc2V0KHdxZV9kYmRlLCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwgMSk7CisJCWlmIChpb2NicS0+aW9jYl9mbGFnICYgTFBGQ19JT19PQVMpIHsKKwkJCWJmX3NldCh3cWVfb2FzLCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwgMSk7CisJCQlpZiAocGhiYS0+Y2ZnX1hMYW5lUHJpb3JpdHkpIHsKKwkJCQliZl9zZXQod3FlX2NjcGUsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCAxKTsKKwkJCQliZl9zZXQod3FlX2NjcCwgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sCisJCQkJICAgICAgIChwaGJhLT5jZmdfWExhbmVQcmlvcml0eSA8PCAxKSk7CisJCQl9CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDTURfRkNQX0lDTU5ENjRfQ1I6CiAJCS8qIHdvcmQzIGlvY2I9aW90YWcgd3FlPXBheWxvYWRfb2Zmc2V0X2xlbiAqLwpAQCAtODI5MSw2ICs4MzI0LDE0IEBACiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sIDApOwogCQliZl9zZXQod3FlX2VycCwgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwKIAkJICAgICAgIGlvY2JxLT5pb2NiLnVscEZDUDJSY3Z5KTsKKwkJaWYgKGlvY2JxLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX09BUykgeworCQkJYmZfc2V0KHdxZV9vYXMsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sIDEpOworCQkJaWYgKHBoYmEtPmNmZ19YTGFuZVByaW9yaXR5KSB7CisJCQkJYmZfc2V0KHdxZV9jY3BlLCAmd3FlLT5mY3BfaWNtZC53cWVfY29tLCAxKTsKKwkJCQliZl9zZXQod3FlX2NjcCwgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwKKwkJCQkgICAgICAgKHBoYmEtPmNmZ19YTGFuZVByaW9yaXR5IDw8IDEpKTsKKwkJCX0KKwkJfQogCQlicmVhazsKIAljYXNlIENNRF9HRU5fUkVRVUVTVDY0X0NSOgogCQkvKiBGb3IgdGhpcyBjb21tYW5kIGNhbGN1bGF0ZSB0aGUgeG1pdCBsZW5ndGggb2YgdGhlCkBAIC04NTIzLDYgKzg1NjQsNyBAQAogewogCXN0cnVjdCBscGZjX3NnbHEgKnNnbHE7CiAJdW5pb24gbHBmY193cWUgd3FlOworCXN0cnVjdCBscGZjX3F1ZXVlICp3cTsKIAlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbcmluZ19udW1iZXJdOwogCiAJaWYgKHBpb2NiLT5zbGk0X3hyaXRhZyA9PSBOT19YUkkpIHsKQEAgLTg1NzUsMTEgKzg2MTcsMTQgQEAKIAkJcmV0dXJuIElPQ0JfRVJST1I7CiAKIAlpZiAoKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0ZDUCkgfHwKLQkJKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX1VTRV9GQ1BXUUlEWCkpIHsKLQkJaWYgKHVubGlrZWx5KCFwaGJhLT5zbGk0X2hiYS5mY3Bfd3EpKQotCQkJcmV0dXJuIElPQ0JfRVJST1I7Ci0JCWlmIChscGZjX3NsaTRfd3FfcHV0KHBoYmEtPnNsaTRfaGJhLmZjcF93cVtwaW9jYi0+ZmNwX3dxaWR4XSwKLQkJCQkgICAgICZ3cWUpKQorCSAgICAocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfVVNFX0ZDUFdRSURYKSkgeworCQlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSB8fCAoIShwaW9jYi0+aW9jYl9mbGFnICYKKwkJCUxQRkNfSU9fT0FTKSkpIHsKKwkJCXdxID0gcGhiYS0+c2xpNF9oYmEuZmNwX3dxW3Bpb2NiLT5mY3Bfd3FpZHhdOworCQl9IGVsc2UgeworCQkJd3EgPSBwaGJhLT5zbGk0X2hiYS5vYXNfd3E7CisJCX0KKwkJaWYgKGxwZmNfc2xpNF93cV9wdXQod3EsICZ3cWUpKQogCQkJcmV0dXJuIElPQ0JfRVJST1I7CiAJfSBlbHNlIHsKIAkJaWYgKHVubGlrZWx5KCFwaGJhLT5zbGk0X2hiYS5lbHNfd3EpKQpAQCAtODY2OSwxMiArODcxNCwyMCBAQAogCiAJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgewogCQlpZiAocGlvY2ItPmlvY2JfZmxhZyAmICBMUEZDX0lPX0ZDUCkgewotCQkJaWYgKHVubGlrZWx5KCFwaGJhLT5zbGk0X2hiYS5mY3Bfd3EpKQotCQkJCXJldHVybiBJT0NCX0VSUk9SOwotCQkJaWR4ID0gbHBmY19zbGk0X3NjbWRfdG9fd3FpZHhfZGlzdHIocGhiYSk7Ci0JCQlwaW9jYi0+ZmNwX3dxaWR4ID0gaWR4OwotCQkJcmluZ19udW1iZXIgPSBNQVhfU0xJM19DT05GSUdVUkVEX1JJTkdTICsgaWR4OwotCisJCQlpZiAoIXBoYmEtPmNmZ19FbmFibGVYTGFuZSB8fCAoIShwaW9jYi0+aW9jYl9mbGFnICYKKwkJCQlMUEZDX0lPX09BUykpKSB7CisJCQkJaWYgKHVubGlrZWx5KCFwaGJhLT5zbGk0X2hiYS5mY3Bfd3EpKQorCQkJCQlyZXR1cm4gSU9DQl9FUlJPUjsKKwkJCQlpZHggPSBscGZjX3NsaTRfc2NtZF90b193cWlkeF9kaXN0cihwaGJhKTsKKwkJCQlwaW9jYi0+ZmNwX3dxaWR4ID0gaWR4OworCQkJCXJpbmdfbnVtYmVyID0gTUFYX1NMSTNfQ09ORklHVVJFRF9SSU5HUyArIGlkeDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHVubGlrZWx5KCFwaGJhLT5zbGk0X2hiYS5vYXNfd3EpKQorCQkJCQlyZXR1cm4gSU9DQl9FUlJPUjsKKwkJCQlpZHggPSAwOworCQkJCXBpb2NiLT5mY3Bfd3FpZHggPSAwOworCQkJCXJpbmdfbnVtYmVyID0gIExQRkNfRkNQX09BU19SSU5HOworCQkJfQogCQkJcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbcmluZ19udW1iZXJdOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaW5nLT5yaW5nX2xvY2ssIGlmbGFncyk7CiAJCQlyYyA9IF9fbHBmY19zbGlfaXNzdWVfaW9jYihwaGJhLCByaW5nX251bWJlciwgcGlvY2IsCkBAIC0xMjEzMiw2ICsxMjE4NSwxNzUgQEAKIAlscGZjX3NsaTRfZXFfcmVsZWFzZShlcSwgTFBGQ19RVUVVRV9SRUFSTSk7CiB9CiAKKworLyoqCisgKiBscGZjX3NsaTRfZm9mX2hhbmRsZV9lcWUgLSBQcm9jZXNzIGEgRmxhc2ggT3B0aW1pemVkIEZhYnJpYyBldmVudCBxdWV1ZQorICoJCQkgICAgIGVudHJ5CisgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCisgKiBAZXFlOiBQb2ludGVyIHRvIGZhc3QtcGF0aCBldmVudCBxdWV1ZSBlbnRyeS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcHJvY2VzcyBhIGV2ZW50IHF1ZXVlIGVudHJ5IGZyb20gdGhlIEZsYXNoIE9wdGltaXplZCBGYWJyaWMKKyAqIGV2ZW50IHF1ZXVlLiAgSXQgd2lsbCBjaGVjayB0aGUgTWFqb3JDb2RlIGFuZCBNaW5vckNvZGUgdG8gZGV0ZXJtaW5lIHRoaXMKKyAqIGlzIGZvciBhIGNvbXBsZXRpb24gZXZlbnQgb24gYSBjb21wbGV0aW9uIHF1ZXVlLCBpZiBub3QsIGFuIGVycm9yIHNoYWxsIGJlCisgKiBsb2dnZWQgYW5kIGp1c3QgcmV0dXJuLiBPdGhlcndpc2UsIGl0IHdpbGwgZ2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nCisgKiBjb21wbGV0aW9uIHF1ZXVlIGFuZCBwcm9jZXNzIGFsbCB0aGUgZW50cmllcyBvbiB0aGUgY29tcGxldGlvbiBxdWV1ZSwgcmVhcm0KKyAqIHRoZSBjb21wbGV0aW9uIHF1ZXVlLCBhbmQgdGhlbiByZXR1cm4uCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19zbGk0X2ZvZl9oYW5kbGVfZXFlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfZXFlICplcWUpCit7CisJc3RydWN0IGxwZmNfcXVldWUgKmNxOworCXN0cnVjdCBscGZjX2NxZSAqY3FlOworCWJvb2wgd29ya3Bvc3RlZCA9IGZhbHNlOworCXVpbnQxNl90IGNxaWQ7CisJaW50IGVjb3VudCA9IDA7CisKKwlpZiAodW5saWtlbHkoYmZfZ2V0X2xlMzIobHBmY19lcWVfbWFqb3JfY29kZSwgZXFlKSAhPSAwKSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJIjkxNDcgTm90IGEgdmFsaWQgY29tcGxldGlvbiAiCisJCQkJImV2ZW50OiBtYWpvcmNvZGU9eCV4LCBtaW5vcmNvZGU9eCV4XG4iLAorCQkJCWJmX2dldF9sZTMyKGxwZmNfZXFlX21ham9yX2NvZGUsIGVxZSksCisJCQkJYmZfZ2V0X2xlMzIobHBmY19lcWVfbWlub3JfY29kZSwgZXFlKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgY29ycmVzcG9uZGluZyBDUSAqLworCWNxaWQgPSBiZl9nZXRfbGUzMihscGZjX2VxZV9yZXNvdXJjZV9pZCwgZXFlKTsKKworCS8qIE5leHQgY2hlY2sgZm9yIE9BUyAqLworCWNxID0gcGhiYS0+c2xpNF9oYmEub2FzX2NxOworCWlmICh1bmxpa2VseSghY3EpKSB7CisJCWlmIChwaGJhLT5zbGkuc2xpX2ZsYWcgJiBMUEZDX1NMSV9BQ1RJVkUpCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJCSI5MTQ4IE9BUyBjb21wbGV0aW9uIHF1ZXVlICIKKwkJCQkJImRvZXMgbm90IGV4aXN0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShjcWlkICE9IGNxLT5xdWV1ZV9pZCkpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCSI5MTQ5IE1pc3MtbWF0Y2hlZCBmYXN0LXBhdGggY29tcGwgIgorCQkJCSJxdWV1ZSBpZDogZXFjcWlkPSVkLCBmY3BjcWlkPSVkXG4iLAorCQkJCWNxaWQsIGNxLT5xdWV1ZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCB0aGUgZW50cmllcyB0byB0aGUgT0FTIENRICovCisJd2hpbGUgKChjcWUgPSBscGZjX3NsaTRfY3FfZ2V0KGNxKSkpIHsKKwkJd29ya3Bvc3RlZCB8PSBscGZjX3NsaTRfZnBfaGFuZGxlX3djcWUocGhiYSwgY3EsIGNxZSk7CisJCWlmICghKCsrZWNvdW50ICUgY3EtPmVudHJ5X3JlcG9zdCkpCisJCQlscGZjX3NsaTRfY3FfcmVsZWFzZShjcSwgTFBGQ19RVUVVRV9OT0FSTSk7CisJfQorCisJLyogVHJhY2sgdGhlIG1heCBudW1iZXIgb2YgQ1FFcyBwcm9jZXNzZWQgaW4gMSBFUSAqLworCWlmIChlY291bnQgPiBjcS0+Q1FfbWF4X2NxZSkKKwkJY3EtPkNRX21heF9jcWUgPSBlY291bnQ7CisKKwkvKiBDYXRjaCB0aGUgbm8gY3EgZW50cnkgY29uZGl0aW9uICovCisJaWYgKHVubGlrZWx5KGVjb3VudCA9PSAwKSkKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCSI5MTUzIE5vIGVudHJ5IGZyb20gZmFzdC1wYXRoIGNvbXBsZXRpb24gIgorCQkJCSJxdWV1ZSBmY3BjcWlkPSVkXG4iLCBjcS0+cXVldWVfaWQpOworCisJLyogSW4gYW55IGNhc2UsIGZsYXNoIGFuZCByZS1hcm0gdGhlIENRICovCisJbHBmY19zbGk0X2NxX3JlbGVhc2UoY3EsIExQRkNfUVVFVUVfUkVBUk0pOworCisJLyogd2FrZSB1cCB3b3JrZXIgdGhyZWFkIGlmIHRoZXJlIGFyZSB3b3JrcyB0byBiZSBkb25lICovCisJaWYgKHdvcmtwb3N0ZWQpCisJCWxwZmNfd29ya2VyX3dha2VfdXAocGhiYSk7Cit9CisKKy8qKgorICogbHBmY19zbGk0X2ZvZl9pbnRyX2hhbmRsZXIgLSBIQkEgaW50ZXJydXB0IGhhbmRsZXIgdG8gU0xJLTQgZGV2aWNlCisgKiBAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyLgorICogQGRldl9pZDogVGhlIGRldmljZSBjb250ZXh0IHBvaW50ZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBkaXJlY3RseSBjYWxsZWQgZnJvbSB0aGUgUENJIGxheWVyIGFzIGFuIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lIHdoZW4gZGV2aWNlIHdpdGggU0xJLTQgaW50ZXJmYWNlIHNwZWMgaXMgZW5hYmxlZCB3aXRoCisgKiBNU0ktWCBtdWx0aS1tZXNzYWdlIGludGVycnVwdCBtb2RlIGFuZCB0aGVyZSBpcyBhIEZsYXNoIE9wdGltaXplZCBGYWJyaWMKKyAqIElPQ0IgcmluZyBldmVudCBpbiB0aGUgSEJBLiBIb3dldmVyLCB3aGVuIHRoZSBkZXZpY2UgaXMgZW5hYmxlZCB3aXRoIGVpdGhlcgorICogTVNJIG9yIFBpbi1JUlEgaW50ZXJydXB0IG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlCisgKiBkZXZpY2UtbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuIFdoZW4gdGhlIFBDSSBzbG90IGlzIGluIGVycm9yIHJlY292ZXJ5CisgKiBvciB0aGUgSEJBIGlzIHVuZGVyZ29pbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIG5vdAorICogcHJvY2VzcyB0aGUgaW50ZXJydXB0LiBUaGUgRmxhc2ggT3B0aW1pemVkIEZhYnJpYyByaW5nIGV2ZW50IGFyZSBoYW5kbGVkIGluCisgKiB0aGUgaW50cnJ1cHQgY29udGV4dC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBhbnkgbG9jayBoZWxkLgorICogSXQgZ2V0cyB0aGUgaGJhbG9jayB0byBhY2Nlc3MgYW5kIHVwZGF0ZSBTTEkgZGF0YSBzdHJ1Y3R1cmVzLiBOb3RlIHRoYXQsCisgKiB0aGUgRVEgdG8gQ1EgYXJlIG9uZS10by1vbmUgbWFwIHN1Y2ggdGhhdCB0aGUgRVEgaW5kZXggaXMKKyAqIGVxdWFsIHRvIHRoYXQgb2YgQ1EgaW5kZXguCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIElSUV9IQU5ETEVEIHdoZW4gaW50ZXJydXB0IGlzIGhhbmRsZWQgZWxzZSBpdAorICogcmV0dXJucyBJUlFfTk9ORS4KKyAqKi8KK2lycXJldHVybl90CitscGZjX3NsaTRfZm9mX2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhOworCXN0cnVjdCBscGZjX2ZjcF9lcV9oZGwgKmZjcF9lcV9oZGw7CisJc3RydWN0IGxwZmNfcXVldWUgKmVxOworCXN0cnVjdCBscGZjX2VxZSAqZXFlOworCXVuc2lnbmVkIGxvbmcgaWZsYWc7CisJaW50IGVjb3VudCA9IDA7CisJdWludDMyX3QgZXFpZHg7CisKKwkvKiBHZXQgdGhlIGRyaXZlcidzIHBoYmEgc3RydWN0dXJlIGZyb20gdGhlIGRldl9pZCAqLworCWZjcF9lcV9oZGwgPSAoc3RydWN0IGxwZmNfZmNwX2VxX2hkbCAqKWRldl9pZDsKKwlwaGJhID0gZmNwX2VxX2hkbC0+cGhiYTsKKwllcWlkeCA9IGZjcF9lcV9oZGwtPmlkeDsKKworCWlmICh1bmxpa2VseSghcGhiYSkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIEdldCB0byB0aGUgRVEgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZlY3RvciAqLworCWVxID0gcGhiYS0+c2xpNF9oYmEuZm9mX2VxOworCWlmICh1bmxpa2VseSghZXEpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBDaGVjayBkZXZpY2Ugc3RhdGUgZm9yIGhhbmRsaW5nIGludGVycnVwdCAqLworCWlmICh1bmxpa2VseShscGZjX2ludHJfc3RhdGVfY2hlY2socGhiYSkpKSB7CisJCWVxLT5FUV9iYWRzdGF0ZSsrOworCQkvKiBDaGVjayBhZ2FpbiBmb3IgbGlua19zdGF0ZSB3aXRoIGxvY2sgaGVsZCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOworCQlpZiAocGhiYS0+bGlua19zdGF0ZSA8IExQRkNfTElOS19ET1dOKQorCQkJLyogRmx1c2gsIGNsZWFyIGludGVycnVwdCwgYW5kIHJlYXJtIHRoZSBFUSAqLworCQkJbHBmY19zbGk0X2VxX2ZsdXNoKHBoYmEsIGVxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyoKKwkgKiBQcm9jZXNzIGFsbCB0aGUgZXZlbnQgb24gRkNQIGZhc3QtcGF0aCBFUQorCSAqLworCXdoaWxlICgoZXFlID0gbHBmY19zbGk0X2VxX2dldChlcSkpKSB7CisJCWxwZmNfc2xpNF9mb2ZfaGFuZGxlX2VxZShwaGJhLCBlcWUpOworCQlpZiAoISgrK2Vjb3VudCAlIGVxLT5lbnRyeV9yZXBvc3QpKQorCQkJbHBmY19zbGk0X2VxX3JlbGVhc2UoZXEsIExQRkNfUVVFVUVfTk9BUk0pOworCQllcS0+RVFfcHJvY2Vzc2VkKys7CisJfQorCisJLyogVHJhY2sgdGhlIG1heCBudW1iZXIgb2YgRVFFcyBwcm9jZXNzZWQgaW4gMSBpbnRyICovCisJaWYgKGVjb3VudCA+IGVxLT5FUV9tYXhfZXFlKQorCQllcS0+RVFfbWF4X2VxZSA9IGVjb3VudDsKKworCisJaWYgKHVubGlrZWx5KGVjb3VudCA9PSAwKSkgeworCQllcS0+RVFfbm9fZW50cnkrKzsKKworCQlpZiAocGhiYS0+aW50cl90eXBlID09IE1TSVgpCisJCQkvKiBNU0ktWCB0cmVhdGVkIGludGVycnVwdCBzZXJ2ZWQgYXMgbm8gRVEgc2hhcmUgSU5UICovCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfU0xJLAorCQkJCQkiOTE0NSBNU0ktWCBpbnRlcnJ1cHQgd2l0aCBubyBFUUVcbiIpOworCQllbHNlIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkJIjkxNDYgSVNSIGludGVycnVwdCB3aXRoIG5vIEVRRVxuIik7CisJCQkvKiBOb24gTVNJLVggdHJlYXRlZCBvbiBpbnRlcnJ1cHQgYXMgRVEgc2hhcmUgSU5UICovCisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwl9CisJLyogQWx3YXlzIGNsZWFyIGFuZCByZS1hcm0gdGhlIGZhc3QtcGF0aCBFUSAqLworCWxwZmNfc2xpNF9lcV9yZWxlYXNlKGVxLCBMUEZDX1FVRVVFX1JFQVJNKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIC8qKgogICogbHBmY19zbGk0X2hiYV9pbnRyX2hhbmRsZXIgLSBIQkEgaW50ZXJydXB0IGhhbmRsZXIgdG8gU0xJLTQgZGV2aWNlCiAgKiBAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyLgpAQCAtMTIyODcsNiArMTI1MDksMTMgQEAKIAkJCWhiYV9oYW5kbGVkIHw9IHRydWU7CiAJfQogCisJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJaGJhX2lycV9yYyA9IGxwZmNfc2xpNF9mb2ZfaW50cl9oYW5kbGVyKGlycSwKKwkJCQkJJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbMF0pOworCQlpZiAoaGJhX2lycV9yYyA9PSBJUlFfSEFORExFRCkKKwkJCWhiYV9oYW5kbGVkIHw9IHRydWU7CisJfQorCiAJcmV0dXJuIChoYmFfaGFuZGxlZCA9PSB0cnVlKSA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9IC8qIGxwZmNfc2xpNF9pbnRyX2hhbmRsZXIgKi8KIApAQCAtMTY1NDQsNyArMTY3NzMsNyBAQAogewogCUxJU1RfSEVBRChjb21wbGV0aW9ucyk7CiAJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddOwotCXN0cnVjdCBscGZjX2lvY2JxICpwaW9jYnEgPSAwOworCXN0cnVjdCBscGZjX2lvY2JxICpwaW9jYnEgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgaWZsYWdzID0gMDsKIAljaGFyICpmYWlsX21zZyA9IE5VTEw7CiAJc3RydWN0IGxwZmNfc2dscSAqc2dscTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCmluZGV4IDZiMGYyNDcuLjZmMDQwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaApAQCAtNzgsNiArNzgsOCBAQAogI2RlZmluZSBMUEZDX0ZJUF9FTFNfSURfTUFTSwkweGMwMDAJLyogRUxTX0lEIHJhbmdlIDAtMywgbm9uLXNoaWZ0ZWQgbWFzayAqLwogI2RlZmluZSBMUEZDX0ZJUF9FTFNfSURfU0hJRlQJMTQKIAorI2RlZmluZSBMUEZDX0lPX09BUwkJMHgxMDAwMCAvKiBPQVMgRkNQIElPICovCisKIAl1aW50MzJfdCBkcnZyVGltZW91dDsJLyogZHJpdmVyIHRpbWVvdXQgaW4gc2Vjb25kcyAqLwogCXVpbnQzMl90IGZjcF93cWlkeDsJLyogaW5kZXggdG8gRkNQIHdvcmsgcXVldWUgKi8KIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQ7LyogdmlydHVhbCBwb3J0IHBvaW50ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKaW5kZXggMjk4YzhjZC4uOWI4Y2RhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKQEAgLTM5LDYgKzM5LDEwIEBACiAjZGVmaW5lIExQRkNfRkNQX0lPX0NIQU5fTUlOICAgICAgIDEKICNkZWZpbmUgTFBGQ19GQ1BfSU9fQ0hBTl9NQVggICAgICAgMTYKIAorLyogTnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgZm9yIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgKEZPRikgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIExQRkNfRk9GX0lPX0NIQU5fTlVNICAgICAgIDEKKwogLyoKICAqIFByb3ZpZGUgdGhlIGRlZmF1bHQgRkNGIFJlY29yZCBhdHRyaWJ1dGVzIHVzZWQgYnkgdGhlIGRyaXZlcgogICogd2hlbiBub25GSVAgbW9kZSBpcyBjb25maWd1cmVkIGFuZCB0aGVyZSBpcyBubyBvdGhlciBkZWZhdWx0CkBAIC0zOTksNiArNDAzLDcgQEAKIAl1aW50MzJfdCBpZl9wYWdlX3N6OwogCXVpbnQzMl90IHJxX2RiX3dpbmRvdzsKIAl1aW50MzJfdCBsb29wYmtfc2NvcGU7CisJdWludDMyX3Qgb2FzX3N1cHBvcnRlZDsKIAl1aW50MzJfdCBlcV9wYWdlc19tYXg7CiAJdWludDMyX3QgZXFlX3NpemU7CiAJdWludDMyX3QgY3FfcGFnZXNfbWF4OwpAQCAtNDM5LDYgKzQ0NCw4IEBACiAJdWludDhfdCBsbmtfbm87CiB9OwogCisjZGVmaW5lIExQRkNfU0xJNF9IQU5ETEVSX0NOVAkJKExQRkNfRkNQX0lPX0NIQU5fTUFYKyBcCisJCQkJCSBMUEZDX0ZPRl9JT19DSEFOX05VTSkKICNkZWZpbmUgTFBGQ19TTEk0X0hBTkRMRVJfTkFNRV9TWgkxNgogCiAvKiBVc2VkIGZvciBJUlEgdmVjdG9yIHRvIENQVSBtYXBwaW5nICovCkBAIC01MDcsNyArNTE0LDcgQEAKIAlzdHJ1Y3QgbHBmY19yZWdpc3RlciBzbGlfaW50ZjsKIAlzdHJ1Y3QgbHBmY19wY19zbGk0X3BhcmFtcyBwY19zbGk0X3BhcmFtczsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwotCXVpbnQ4X3QgaGFuZGxlcl9uYW1lW0xQRkNfRkNQX0lPX0NIQU5fTUFYXVtMUEZDX1NMSTRfSEFORExFUl9OQU1FX1NaXTsKKwl1aW50OF90IGhhbmRsZXJfbmFtZVtMUEZDX1NMSTRfSEFORExFUl9DTlRdW0xQRkNfU0xJNF9IQU5ETEVSX05BTUVfU1pdOwogCXN0cnVjdCBscGZjX2ZjcF9lcV9oZGwgKmZjcF9lcV9oZGw7IC8qIEZDUCBwZXItV1EgaGFuZGxlICovCiAKIAkvKiBQb2ludGVycyB0byB0aGUgY29uc3RydWN0ZWQgU0xJNCBxdWV1ZXMgKi8KQEAgLTUyNyw2ICs1MzQsMTcgQEAKIAl1aW50MzJfdCB1bHAwX21vZGU7CS8qIFVMUDAgcHJvdG9jb2wgbW9kZSAqLwogCXVpbnQzMl90IHVscDFfbW9kZTsJLyogVUxQMSBwcm90b2NvbCBtb2RlICovCiAKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqZm9mX2VxOyAvKiBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIEV2ZW50IHF1ZXVlICovCisKKwkvKiBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2Ugc3BlY2lmaWMgcXVldWVzL3N0cnVjdHVyZXMgKi8KKworCXN0cnVjdCBscGZjX3F1ZXVlICpvYXNfY3E7IC8qIE9BUyBjb21wbGV0aW9uIHF1ZXVlICovCisJc3RydWN0IGxwZmNfcXVldWUgKm9hc193cTsgLyogT0FTIFdvcmsgcXVldWUgKi8KKwlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqb2FzX3Jpbmc7CisJdWludDY0X3Qgb2FzX25leHRfbHVuOworCXVpbnQ4X3Qgb2FzX25leHRfdGd0X3d3cG5bOF07CisJdWludDhfdCBvYXNfbmV4dF92cHRfd3dwbls4XTsKKwogCS8qIFNldHVwIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIHF1ZXVlIHBhcmFtZXRlcnMgKi8KIAlpbnQgZXFfZXNpemU7CiAJaW50IGVxX2Vjb3VudDsKQEAgLTU4OSw2ICs2MDcsNyBAQAogCXN0cnVjdCBscGZjX3ZlY3Rvcl9tYXBfaW5mbyAqY3B1X21hcDsKIAl1aW50MTZfdCBudW1fb25saW5lX2NwdTsKIAl1aW50MTZfdCBudW1fcHJlc2VudF9jcHU7CisJdWludDE2X3QgY3Vycl9kaXNwX2NwdTsKIH07CiAKIGVudW0gbHBmY19zZ2VfdHlwZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCmluZGV4IGUzMDk0YzQuLmUzMmNiZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgcGFja2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4zLjQzIgorI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuNDUiCiAjZGVmaW5lIExQRkNfRFJJVkVSX05BTUUJCSJscGZjIgogCiAvKiBVc2VkIGZvciBTTEkgMi8zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCmluZGV4IDgxNmRiMTIuLmI3NzcwNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCkBAIC01MzEsMTMgKzUzMSw2IEBACiAJaW50CXRhcmdldCA9IDA7CiAJaW50CWxkcnZfbnVtID0gMDsgICAvKiBsb2dpY2FsIGRyaXZlIG51bWJlciAqLwogCi0KLQkvKgotCSAqIGZpbHRlciB0aGUgaW50ZXJuYWwgYW5kIGlvY3RsIGNvbW1hbmRzCi0JICovCi0JaWYoKGNtZC0+Y21uZFswXSA9PSBNRUdBX0lOVEVSTkFMX0NNRCkpCi0JCXJldHVybiAoc2NiX3QgKiljbWQtPmhvc3Rfc2NyaWJibGU7Ci0KIAkvKgogCSAqIFdlIGtub3cgd2hhdCBjaGFubmVscyBvdXIgbG9naWNhbCBkcml2ZXMgYXJlIG9uIC0gbWVnYV9maW5kX2NhcmQoKQogCSAqLwpAQCAtMTQzOSwxOSArMTQzMiwyMiBAQAogCiAJCWNtZGlkID0gY29tcGxldGVkW2ldOwogCi0JCWlmKCBjbWRpZCA9PSBDTURJRF9JTlRfQ01EUyApIHsgLyogaW50ZXJuYWwgY29tbWFuZCAqLworCQkvKgorCQkgKiBPbmx5IGZyZWUgU0NCcyBmb3IgdGhlIGNvbW1hbmRzIGNvbWluZyBkb3duIGZyb20gdGhlCisJCSAqIG1pZC1sYXllciwgbm90IGZvciB3aGljaCB3ZXJlIGlzc3VlZCBpbnRlcm5hbGx5CisJCSAqCisJCSAqIEZvciBpbnRlcm5hbCBjb21tYW5kLCByZXN0b3JlIHRoZSBzdGF0dXMgcmV0dXJuZWQgYnkgdGhlCisJCSAqIGZpcm13YXJlIHNvIHRoYXQgdXNlciBjYW4gaW50ZXJwcmV0IGl0LgorCQkgKi8KKwkJaWYgKGNtZGlkID09IENNRElEX0lOVF9DTURTKSB7CiAJCQlzY2IgPSAmYWRhcHRlci0+aW50X3NjYjsKLQkJCWNtZCA9IHNjYi0+Y21kOwotCQkJbWJveCA9IChtYm94X3QgKilzY2ItPnJhd19tYm94OwogCi0JCQkvKgotCQkJICogSW50ZXJuYWwgY29tbWFuZCBpbnRlcmZhY2UgZG8gbm90IGZpcmUgdGhlIGV4dGVuZGVkCi0JCQkgKiBwYXNzdGhydSBvciA2NC1iaXQgcGFzc3RocnUKLQkJCSAqLwotCQkJcHRocnUgPSBzY2ItPnB0aHJ1OworCQkJbGlzdF9kZWxfaW5pdCgmc2NiLT5saXN0KTsKKwkJCXNjYi0+c3RhdGUgPSBTQ0JfRlJFRTsKIAotCQl9Ci0JCWVsc2UgeworCQkJYWRhcHRlci0+aW50X3N0YXR1cyA9IHN0YXR1czsKKwkJCWNvbXBsZXRlKCZhZGFwdGVyLT5pbnRfd2FpdHEpOworCQl9IGVsc2UgewogCQkJc2NiID0gJmFkYXB0ZXItPnNjYl9saXN0W2NtZGlkXTsKIAogCQkJLyoKQEAgLTE2NDAsMjUgKzE2MzYsNyBAQAogCQkJCWNtZC0+cmVzdWx0IHw9IChESURfQkFEX1RBUkdFVCA8PCAxNil8c3RhdHVzOwogCQl9CiAKLQkJLyoKLQkJICogT25seSBmcmVlIFNDQnMgZm9yIHRoZSBjb21tYW5kcyBjb21pbmcgZG93biBmcm9tIHRoZQotCQkgKiBtaWQtbGF5ZXIsIG5vdCBmb3Igd2hpY2ggd2VyZSBpc3N1ZWQgaW50ZXJuYWxseQotCQkgKgotCQkgKiBGb3IgaW50ZXJuYWwgY29tbWFuZCwgcmVzdG9yZSB0aGUgc3RhdHVzIHJldHVybmVkIGJ5IHRoZQotCQkgKiBmaXJtd2FyZSBzbyB0aGF0IHVzZXIgY2FuIGludGVycHJldCBpdC4KLQkJICovCi0JCWlmKCBjbWRpZCA9PSBDTURJRF9JTlRfQ01EUyApIHsgLyogaW50ZXJuYWwgY29tbWFuZCAqLwotCQkJY21kLT5yZXN1bHQgPSBzdGF0dXM7Ci0KLQkJCS8qCi0JCQkgKiBSZW1vdmUgdGhlIGludGVybmFsIGNvbW1hbmQgZnJvbSB0aGUgcGVuZGluZyBsaXN0Ci0JCQkgKi8KLQkJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7Ci0JCQlzY2ItPnN0YXRlID0gU0NCX0ZSRUU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltZWdhX2ZyZWVfc2NiKGFkYXB0ZXIsIHNjYik7Ci0JCX0KKwkJbWVnYV9mcmVlX3NjYihhZGFwdGVyLCBzY2IpOwogCiAJCS8qIEFkZCBTY3NpX0NvbW1hbmQgdG8gZW5kIG9mIGNvbXBsZXRlZCBxdWV1ZSAqLwogCQlsaXN0X2FkZF90YWlsKFNDU0lfTElTVChjbWQpLCAmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QpOwpAQCAtNDEzMywyMyArNDExMSwxNSBAQAogICogVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHBhc3N0aHJ1IHN0cnVjdHVyZSBpZiB0aGUgY29tbWFuZAogICogdG8gYmUgZmlyZWQgaXMgYSBwYXNzdGhydSBjb21tYW5kCiAgKgotICogbG9ja3Njb3BlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgYWNxdWlyZWQgdGhlIGxvY2suIE9mCi0gKiBjb3Vyc2UsIHRoZSBjYWxsZXIgbXVzdCBrbm93IHdoaWNoIGxvY2sgd2UgYXJlIHRhbGtpbmcgYWJvdXQuCi0gKgogICogTm90ZTogcGFyYW1ldGVyICdwdGhydScgaXMgbnVsbCBmb3Igbm9uLXBhc3N0aHJ1IGNvbW1hbmRzLgogICovCiBzdGF0aWMgaW50CiBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlcl90ICphZGFwdGVyLCBtZWdhY21kX3QgKm1jLCBtZWdhX3Bhc3N0aHJ1ICpwdGhydSkKIHsKLQlTY3NpX0NtbmQJKnNjbWQ7Ci0Jc3RydWN0CXNjc2lfZGV2aWNlICpzZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2NiX3QJKnNjYjsKIAlpbnQJcnZhbDsKIAotCXNjbWQgPSBzY3NpX2FsbG9jYXRlX2NvbW1hbmQoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzY21kKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCS8qCiAJICogVGhlIGludGVybmFsIGNvbW1hbmRzIHNoYXJlIG9uZSBjb21tYW5kIGlkIGFuZCBoZW5jZSBhcmUKIAkgKiBzZXJpYWxpemVkLiBUaGlzIGlzIHNvIGJlY2F1c2Ugd2Ugd2FudCB0byByZXNlcnZlIG1heGltdW0gbnVtYmVyIG9mCkBAIC00MTYwLDczICs0MTMwLDQ1IEBACiAJc2NiID0gJmFkYXB0ZXItPmludF9zY2I7CiAJbWVtc2V0KHNjYiwgMCwgc2l6ZW9mKHNjYl90KSk7CiAKLQlzZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0Jc2NtZC0+ZGV2aWNlID0gc2RldjsKLQotCW1lbXNldChhZGFwdGVyLT5pbnRfY2RiLCAwLCBzaXplb2YoYWRhcHRlci0+aW50X2NkYikpOwotCXNjbWQtPmNtbmQgPSBhZGFwdGVyLT5pbnRfY2RiOwotCXNjbWQtPmRldmljZS0+aG9zdCA9IGFkYXB0ZXItPmhvc3Q7Ci0Jc2NtZC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopc2NiOwotCXNjbWQtPmNtbmRbMF0gPSBNRUdBX0lOVEVSTkFMX0NNRDsKLQotCXNjYi0+c3RhdGUgfD0gU0NCX0FDVElWRTsKLQlzY2ItPmNtZCA9IHNjbWQ7CisJc2NiLT5pZHggPSBDTURJRF9JTlRfQ01EUzsKKwlzY2ItPnN0YXRlIHw9IFNDQl9BQ1RJVkUgfCBTQ0JfUEVORFE7CiAKIAltZW1jcHkoc2NiLT5yYXdfbWJveCwgbWMsIHNpemVvZihtZWdhY21kX3QpKTsKIAogCS8qCiAJICogSXMgaXQgYSBwYXNzdGhydSBjb21tYW5kCiAJICovCi0JaWYoIG1jLT5jbWQgPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVICkgewotCisJaWYgKG1jLT5jbWQgPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVKQogCQlzY2ItPnB0aHJ1ID0gcHRocnU7Ci0JfQogCi0Jc2NiLT5pZHggPSBDTURJRF9JTlRfQ01EUzsKLQotCW1lZ2FyYWlkX3F1ZXVlX2xjayhzY21kLCBtZWdhX2ludGVybmFsX2RvbmUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmc2NiLT5saXN0LCAmYWRhcHRlci0+cGVuZGluZ19saXN0KTsKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBIQkEgaXMgaW4gcXVpZXNjZW50IHN0YXRlLCBlLmcuLCBkdXJpbmcgYQorCSAqIGRlbGV0ZSBsb2dpY2FsIGRyaXZlIG9wZXJ0aW9uLiBJZiBpdCBpcywgZG9uJ3QgcnVuCisJICogdGhlIHBlbmRpbmdfbGlzdC4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnF1aWVzY2VudCkgPT0gMCkKKwkJbWVnYV9ydW5wZW5kcShhZGFwdGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhZGFwdGVyLT5pbnRfd2FpdHEpOwogCi0JcnZhbCA9IHNjbWQtPnJlc3VsdDsKLQltYy0+c3RhdHVzID0gc2NtZC0+cmVzdWx0OwotCWtmcmVlKHNkZXYpOworCW1jLT5zdGF0dXMgPSBydmFsID0gYWRhcHRlci0+aW50X3N0YXR1czsKIAogCS8qCiAJICogUHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIGZvciBhbGwgZmFpbGVkIGNvbW1hbmRzLiBBcHBsaWNhdGlvbnMgY2FuIHVzZQogCSAqIHRoaXMgaW5mb3JtYXRpb24uCiAJICovCi0JaWYoIHNjbWQtPnJlc3VsdCAmJiB0cmFjZV9sZXZlbCApIHsKKwlpZiAocnZhbCAmJiB0cmFjZV9sZXZlbCkgewogCQlwcmludGsoIm1lZ2FyYWlkOiBjbWQgWyV4LCAleCwgJXhdIHN0YXR1czpbJXhdXG4iLAotCQkJbWMtPmNtZCwgbWMtPm9wY29kZSwgbWMtPnN1Ym9wY29kZSwgc2NtZC0+cmVzdWx0KTsKKwkJCW1jLT5jbWQsIG1jLT5vcGNvZGUsIG1jLT5zdWJvcGNvZGUsIHJ2YWwpOwogCX0KIAogCW11dGV4X3VubG9jaygmYWRhcHRlci0+aW50X210eCk7Ci0KLQlzY3NpX2ZyZWVfY29tbWFuZChHRlBfS0VSTkVMLCBzY21kKTsKLQogCXJldHVybiBydmFsOwogfQogCi0KLS8qKgotICogbWVnYV9pbnRlcm5hbF9kb25lKCkKLSAqIEBzY21kIC0gaW50ZXJuYWwgc2NzaSBjb21tYW5kCi0gKgotICogQ2FsbGJhY2sgcm91dGluZSBmb3IgaW50ZXJuYWwgY29tbWFuZHMuCi0gKi8KLXN0YXRpYyB2b2lkCi1tZWdhX2ludGVybmFsX2RvbmUoU2NzaV9DbW5kICpzY21kKQotewotCWFkYXB0ZXJfdAkqYWRhcHRlcjsKLQotCWFkYXB0ZXIgPSAoYWRhcHRlcl90ICopc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLQotCWNvbXBsZXRlKCZhZGFwdGVyLT5pbnRfd2FpdHEpOwotCi19Ci0KLQogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbWVnYXJhaWRfdGVtcGxhdGUgPSB7CiAJLm1vZHVsZQkJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJCT0gIk1lZ2FSQUlEIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKaW5kZXggNGQwY2U0ZS4uNTA4ZDY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKQEAgLTg1MywxMCArODUzLDEwIEBACiAKIAl1OAlzZ2xlbjsJLyogZi93IHN1cHBvcnRlZCBzY2F0dGVyLWdhdGhlciBsaXN0IGxlbmd0aCAqLwogCi0JdW5zaWduZWQgY2hhciBpbnRfY2RiW01BWF9DT01NQU5EX1NJWkVdOwogCXNjYl90CQkJaW50X3NjYjsKIAlzdHJ1Y3QgbXV0ZXgJCWludF9tdHg7CS8qIFRvIHN5bmNocm9uaXplIHRoZSBpbnRlcm5hbAogCQkJCQkJY29tbWFuZHMgKi8KKwlpbnQJCQlpbnRfc3RhdHVzOwkvKiBzdGF0dXMgb2YgaW50ZXJuYWwgY21kICovCiAJc3RydWN0IGNvbXBsZXRpb24JaW50X3dhaXRxOwkvKiB3YWl0IHF1ZXVlIGZvciBpbnRlcm5hbAogCQkJCQkJIGNtZHMgKi8KIApAQCAtMTAwNCw3ICsxMDA0LDYgQEAKIHN0YXRpYyBpbnQgbWVnYV9kb19kZWxfbG9nZHJ2KGFkYXB0ZXJfdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgbWVnYV9nZXRfbWF4X3NnbChhZGFwdGVyX3QgKik7CiBzdGF0aWMgaW50IG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyX3QgKiwgbWVnYWNtZF90ICosIG1lZ2FfcGFzc3RocnUgKik7Ci1zdGF0aWMgdm9pZCBtZWdhX2ludGVybmFsX2RvbmUoU2NzaV9DbW5kICopOwogc3RhdGljIGludCBtZWdhX3N1cHBvcnRfY2x1c3RlcihhZGFwdGVyX3QgKik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYwppbmRleCBkZmZmZDBmLi5hNzA2OTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYwpAQCAtNDg2LDYgKzQ4Niw4IEBACiAKIAlwdGhydTMyLT5kYXRheGZlcmFkZHIJPSBraW9jLT5idWZfcGFkZHI7CiAJaWYgKGtpb2MtPmRhdGFfZGlyICYgVUlPQ19XUikgeworCQlpZiAocHRocnUzMi0+ZGF0YXhmZXJsZW4gPiBraW9jLT54ZmVybGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChjb3B5X2Zyb21fdXNlcihraW9jLT5idWZfdmFkZHIsIGtpb2MtPnVzZXJfZGF0YSwKIAkJCQkJCXB0aHJ1MzItPmRhdGF4ZmVybGVuKSkgewogCQkJcmV0dXJuICgtRUZBVUxUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaAppbmRleCAzNDQ1MmVhLi4zMjE2NmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCkBAIC0zMyw5ICszMyw5IEBACiAvKgogICogTWVnYVJBSUQgU0FTIERyaXZlciBtZXRhIGRhdGEKICAqLwotI2RlZmluZSBNRUdBU0FTX1ZFUlNJT04JCQkJIjA2LjcwMC4wNi4wMC1yYzEiCi0jZGVmaW5lIE1FR0FTQVNfUkVMREFURQkJCQkiQXVnLiAzMSwgMjAxMyIKLSNkZWZpbmUgTUVHQVNBU19FWFRfVkVSU0lPTgkJCSJTYXQuIEF1Zy4gMzEgMTc6MDA6MDAgUERUIDIwMTMiCisjZGVmaW5lIE1FR0FTQVNfVkVSU0lPTgkJCQkiMDYuODAzLjAxLjAwLXJjMSIKKyNkZWZpbmUgTUVHQVNBU19SRUxEQVRFCQkJCSJNYXIuIDEwLCAyMDE0IgorI2RlZmluZSBNRUdBU0FTX0VYVF9WRVJTSU9OCQkJIk1vbi4gTWFyLiAxMCAxNzowMDowMCBQRFQgMjAxNCIKIAogLyoKICAqIERldmljZSBJRHMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWQkJMHgwMDczCiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkJCTB4MDA3MQogI2RlZmluZQlQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04JCTB4MDA1YgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEJCTB4MDAyZgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSCQkweDAwNWQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRlVSWQkJCTB4MDA1ZgogCkBAIC01NTksNyArNTYwLDggQEAKIAkJdTggUENJRToxOwogCQl1OCBpU0NTSToxOwogCQl1OCBTQVNfM0c6MTsKLQkJdTggcmVzZXJ2ZWRfMDo0OworCQl1OCBTUklPVjoxOworCQl1OCByZXNlcnZlZF8wOjM7CiAJCXU4IHJlc2VydmVkXzFbNl07CiAJCXU4IHBvcnRfY291bnQ7CiAJCXU2NCBwb3J0X2FkZHJbOF07CkBAIC04MzksNyArODQxLDEyIEBACiAKIAlzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyo3QTRoICovCiAjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLQkJdTMyICAgICByZXNlcnZlZDoxMTsKKwkJdTMyICAgICByZXNlcnZlZDo1OworCQl1MzIJYWN0aXZlUGFzc2l2ZToyOworCQl1MzIJc3VwcG9ydENvbmZpZ0F1dG9CYWxhbmNlOjE7CisJCXUzMgltcGlvOjE7CisJCXUzMglzdXBwb3J0RGF0YUxEb25TU0NBcnJheToxOworCQl1MzIJc3VwcG9ydFBvaW50SW5UaW1lUHJvZ3Jlc3M6MTsKIAkJdTMyICAgICBzdXBwb3J0VW5ldmVuU3BhbnM6MTsKIAkJdTMyICAgICBkZWRpY2F0ZWRIb3RTcGFyZXNMaW1pdGVkOjE7CiAJCXUzMiAgICAgaGVhZGxlc3NNb2RlOjE7CkBAIC04ODYsNyArODkzLDEyIEBACiAKIAogCQl1MzIgICAgIHN1cHBvcnRVbmV2ZW5TcGFuczoxOwotCQl1MzIgICAgIHJlc2VydmVkOjExOworCQl1MzIJc3VwcG9ydFBvaW50SW5UaW1lUHJvZ3Jlc3M6MTsKKwkJdTMyCXN1cHBvcnREYXRhTERvblNTQ0FycmF5OjE7CisJCXUzMgltcGlvOjE7CisJCXUzMglzdXBwb3J0Q29uZmlnQXV0b0JhbGFuY2U6MTsKKwkJdTMyCWFjdGl2ZVBhc3NpdmU6MjsKKwkJdTMyICAgICByZXNlcnZlZDo1OwogI2VuZGlmCiAJfSBhZGFwdGVyT3BlcmF0aW9uczI7CiAKQEAgLTkxNCw4ICs5MjYsMTQgQEAKIAl9IGNsdXN0ZXI7CiAKIAljaGFyIGNsdXN0ZXJJZFsxNl07ICAgICAgICAgICAgICAgICAgICAgLyo3RDRoICovCisJc3RydWN0IHsKKwkJdTggIG1heFZGc1N1cHBvcnRlZDsgICAgICAgICAgICAvKjB4N0U0Ki8KKwkJdTggIG51bVZGc0VuYWJsZWQ7ICAgICAgICAgICAgICAvKjB4N0U1Ki8KKwkJdTggIHJlcXVlc3RvcklkOyAgICAgICAgICAgICAgICAvKjB4N0U2IDA6UEYsIDE6VkYxLCAyOlZGMiovCisJCXU4ICByZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyoweDdFNyovCisJfSBpb3Y7CiAKLQl1OCAgICAgICAgICBwYWRbMHg4MDAtMHg3RTRdOyAgICAgICAgICAgLyo3RTQgKi8KKwl1OCAgICAgICAgICBwYWRbMHg4MDAtMHg3RThdOyAgICAgICAgICAgLyoweDdFOCBwYWQgdG8gMmsgKi8KIH0gX19wYWNrZWQ7CiAKIC8qCkBAIC05ODYsNyArMTAwNCw5IEBACiAKICNkZWZpbmUgTUZJX09CX0lOVFJfU1RBVFVTX01BU0sJCQkweDAwMDAwMDAyCiAjZGVmaW5lIE1GSV9QT0xMX1RJTUVPVVRfU0VDUwkJCTYwCi0KKyNkZWZpbmUgTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYJKDUgKiBIWikKKyNkZWZpbmUgTUVHQVNBU19PQ1JfU0VUVExFX1RJTUVfVkYJCSgxMDAwICogMzApCisjZGVmaW5lIE1FR0FTQVNfUk9VVElORV9XQUlUX1RJTUVfVkYJCTMwMAogI2RlZmluZSBNRklfUkVQTFlfMTA3OF9NRVNTQUdFX0lOVEVSUlVQVAkweDgwMDAwMDAwCiAjZGVmaW5lIE1GSV9SRVBMWV9HRU4yX01FU1NBR0VfSU5URVJSVVBUCTB4MDAwMDAwMDEKICNkZWZpbmUgTUZJX0dFTjJfRU5BQkxFX0lOVEVSUlVQVF9NQVNLCQkoMHgwMDAwMDAwMSB8IDB4MDAwMDAwMDQpCkBAIC0xMzQ3LDkgKzEzNjcsMTUgQEAKIHVuaW9uIG1lZ2FzYXNfZXZ0X2NsYXNzX2xvY2FsZSB7CiAKIAlzdHJ1Y3QgeworI2lmbmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKIAkJdTE2IGxvY2FsZTsKIAkJdTggcmVzZXJ2ZWQ7CiAJCXM4IGNsYXNzOworI2Vsc2UKKwkJczggY2xhc3M7CisJCXU4IHJlc2VydmVkOworCQl1MTYgbG9jYWxlOworI2VuZGlmCiAJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVtYmVyczsKIAogCXUzMiB3b3JkOwpAQCAtMTUyMyw2ICsxNTQ5LDEyIEBACiAJZG1hX2FkZHJfdCBwcm9kdWNlcl9oOwogCXUzMiAqY29uc3VtZXI7CiAJZG1hX2FkZHJfdCBjb25zdW1lcl9oOworCXN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiAqdmZfYWZmaWxpYXRpb247CisJZG1hX2FkZHJfdCB2Zl9hZmZpbGlhdGlvbl9oOworCXN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEgKnZmX2FmZmlsaWF0aW9uXzExMTsKKwlkbWFfYWRkcl90IHZmX2FmZmlsaWF0aW9uXzExMV9oOworCXN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNICpoYl9ob3N0X21lbTsKKwlkbWFfYWRkcl90IGhiX2hvc3RfbWVtX2g7CiAKIAl1MzIgKnJlcGx5X3F1ZXVlOwogCWRtYV9hZGRyX3QgcmVwbHlfcXVldWVfaDsKQEAgLTE1OTgsMTAgKzE2MzAsNzMgQEAKIAl1bnNpZ25lZCBsb25nIGJhcjsKIAlsb25nIHJlc2V0X2ZsYWdzOwogCXN0cnVjdCBtdXRleCByZXNldF9tdXRleDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzcmlvdl9oZWFydGJlYXRfdGltZXI7CisJY2hhciBza2lwX2hlYXJ0YmVhdF90aW1lcl9kZWw7CisJdTggcmVxdWVzdG9ySWQ7CisJdTY0IGluaXRpYXRvcl9zYXNfYWRkcmVzczsKKwl1NjQgbGRfc2FzX2FkZHJlc3NbNjRdOworCWNoYXIgUGxhc21hRlcxMTE7CisJY2hhciBtcGlvOwogCWludCB0aHJvdHRsZXF1ZXVlZGVwdGg7CiAJdTggbWFza19pbnRlcnJ1cHRzOwogCXU4IGlzX2ltcjsKIH07CitzdHJ1Y3QgTVJfTERfVkZfTUFQIHsKKwl1MzIgc2l6ZTsKKwl1bmlvbiBNUl9MRF9SRUYgcmVmOworCXU4IGxkVmZDb3VudDsKKwl1OCByZXNlcnZlZFs2XTsKKwl1OCBwb2xpY3lbMV07Cit9OworCitzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04geworCXUzMiBzaXplOworCXU4IGxkQ291bnQ7CisJdTggdmZDb3VudDsKKwl1OCB0aGlzVmY7CisJdTggcmVzZXJ2ZWRbOV07CisJc3RydWN0IE1SX0xEX1ZGX01BUCBtYXBbMV07Cit9OworCisvKiBQbGFzbWEgMS4xMSBGVyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgSU9WXzExMV9PRkZTRVQgMHg3Q0UKKyNkZWZpbmUgTUFYX1ZJUlRVQUxfRlVOQ1RJT05TIDgKKworc3RydWN0IElPVl8xMTEgeworCXU4IG1heFZGc1N1cHBvcnRlZDsKKwl1OCBudW1WRnNFbmFibGVkOworCXU4IHJlcXVlc3RvcklkOworCXU4IHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IE1SX0xEX1ZGX01BUF8xMTEgeworCXU4IHRhcmdldElkOworCXU4IHJlc2VydmVkWzNdOworCXU4IHBvbGljeVtNQVhfVklSVFVBTF9GVU5DVElPTlNdOworfTsKKworc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSB7CisJdTggdmRDb3VudDsKKwl1OCB2ZkNvdW50OworCXU4IHRoaXNWZjsKKwl1OCByZXNlcnZlZFs1XTsKKwlzdHJ1Y3QgTVJfTERfVkZfTUFQXzExMSBtYXBbTUFYX0xPR0lDQUxfRFJJVkVTXTsKK307CisKK3N0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNIHsKKwlzdHJ1Y3QgeworCQl1MzIgZndDb3VudGVyOwkvKiBGaXJtd2FyZSBoZWFydCBiZWF0IGNvdW50ZXIgKi8KKwkJc3RydWN0IHsKKwkJCXUzMiBkZWJ1Z21vZGU6MTsgLyogMT1GaXJtd2FyZSBpcyBpbiBkZWJ1ZyBtb2RlLgorCQkJCQkgICAgSGVhcnQgYmVhdCB3aWxsIG5vdCBiZSB1cGRhdGVkLiAqLworCQkJdTMyIHJlc2VydmVkOjMxOworCQl9IGRlYnVnOworCQl1MzIgcmVzZXJ2ZWRfZndbNl07CisJCXUzMiBkcml2ZXJDb3VudGVyOyAvKiBEcml2ZXIgaGVhcnQgYmVhdCBjb3VudGVyLiAgMHgyMCAqLworCQl1MzIgcmVzZXJ2ZWRfZHJpdmVyWzddOworCX0gSEI7CisJdTggcGFkWzB4NDAwLTB4NDBdOworfTsKIAogZW51bSB7CiAJTUVHQVNBU19IQkFfT1BFUkFUSU9OQUwJCQk9IDAsCkBAIC0xNjA5LDYgKzE3MDQsNyBAQAogCU1FR0FTQVNfQURQUkVTRVRfU01fRldfUkVTRVRfU1VDQ0VTUwk9IDIsCiAJTUVHQVNBU19BRFBSRVNFVF9TTV9PUEVSQVRJT05BTAkJPSAzLAogCU1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1IJCT0gNCwKKwlNRUdBU0FTX0FEUFJFU0VUX1NNX1BPTExJTkcJCT0gNSwKIAlNRUdBU0FTX0FEUFJFU0VUX0lOUFJPR19TSUdOCQk9IDB4REVBRERFQUQsCiB9OwogCkBAIC0xNzI4LDcgKzE4MjQsNyBAQAogCQkgICAgc3RydWN0IElPX1JFUVVFU1RfSU5GTyAqaW9faW5mbywKIAkJICAgIHN0cnVjdCBSQUlEX0NPTlRFWFQgKnBSQUlEX0NvbnRleHQsCiAJCSAgICBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXAsIHU4ICoqcmFpZExVTik7Ci11MTYgTVJfVGFyZ2V0SWRUb0xkR2V0KHUzMiBsZFRndElkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwordTggTVJfVGFyZ2V0SWRUb0xkR2V0KHUzMiBsZFRndElkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwogc3RydWN0IE1SX0xEX1JBSUQgKk1SX0xkUmFpZEdldCh1MzIgbGQsIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCk7CiB1MTYgTVJfQXJQZEdldCh1MzIgYXIsIHUzMiBhcm0sIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCk7CiB1MTYgTVJfTGRTcGFuQXJyYXlHZXQodTMyIGxkLCB1MzIgc3Bhbiwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKaW5kZXggM2I3YWQxMC4uZDg0ZDAyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICoKICAqICBGSUxFOiBtZWdhcmFpZF9zYXNfYmFzZS5jCi0gKiAgVmVyc2lvbiA6IDA2LjcwMC4wNi4wMC1yYzEKKyAqICBWZXJzaW9uIDogMDYuODAzLjAxLjAwLXJjMQogICoKICAqICBBdXRob3JzOiBMU0kgQ29ycG9yYXRpb24KICAqICAgICAgICAgICBTcmVlbml2YXMgQmFnYWxrb3RlCkBAIC03NSw2ICs3NSwxMCBAQAogbW9kdWxlX3BhcmFtKG1zaXhfdmVjdG9ycywgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobXNpeF92ZWN0b3JzLCAiTVNJLVggbWF4IHZlY3RvciBjb3VudC4gRGVmYXVsdDogU2V0IGJ5IEZXIik7CiAKK3N0YXRpYyBpbnQgYWxsb3dfdmZfaW9jdGxzOworbW9kdWxlX3BhcmFtKGFsbG93X3ZmX2lvY3RscywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoYWxsb3dfdmZfaW9jdGxzLCAiQWxsb3cgaW9jdGxzIGluIFNSLUlPViBWRiBtb2RlLiBEZWZhdWx0OiAwIik7CisKIHN0YXRpYyBpbnQgdGhyb3R0bGVxdWV1ZWRlcHRoID0gTUVHQVNBU19USFJPVFRMRV9RVUVVRV9ERVBUSDsKIG1vZHVsZV9wYXJhbSh0aHJvdHRsZXF1ZXVlZGVwdGgsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHRocm90dGxlcXVldWVkZXB0aCwKQEAgLTEyMiw2ICsxMjYsOCBAQAogCS8qIHhzY2FsZSBJT1AgKi8KIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKX0sCiAJLyogRnVzaW9uICovCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSl9LAorCS8qIFBsYXNtYSAqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKX0sCiAJLyogSW52YWRlciAqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKX0sCkBAIC0xMzIsNyArMTM4LDcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtZWdhc2FzX3BjaV90YWJsZSk7CiAKIHN0YXRpYyBpbnQgbWVnYXNhc19tZ210X21ham9ybm87Ci1zdGF0aWMgc3RydWN0IG1lZ2FzYXNfbWdtdF9pbmZvIG1lZ2FzYXNfbWdtdF9pbmZvOworc3RydWN0IG1lZ2FzYXNfbWdtdF9pbmZvIG1lZ2FzYXNfbWdtdF9pbmZvOwogc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICptZWdhc2FzX2FzeW5jX3F1ZXVlOwogc3RhdGljIERFRklORV9NVVRFWChtZWdhc2FzX2FzeW5jX3F1ZXVlX211dGV4KTsKIApAQCAtMTcxLDEwICsxNzcsMTUgQEAKIGludAogbWVnYXNhc19zeW5jX21hcF9pbmZvKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CiBpbnQKLXdhaXRfYW5kX3BvbGwoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCk7Cit3YWl0X2FuZF9wb2xsKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQsCisJaW50IHNlY29uZHMpOwogdm9pZCBtZWdhc2FzX3Jlc2V0X3JlcGx5X2Rlc2Moc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKLWludCBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitpbnQgbWVnYXNhc19yZXNldF9mdXNpb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBpb3RpbWVvdXQpOwogdm9pZCBtZWdhc2FzX2Z1c2lvbl9vY3Jfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBpbnQgbWVnYXNhc19nZXRfbGRfdmZfYWZmaWxpYXRpb24oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJCQkgaW50IGluaXRpYWwpOworaW50IG1lZ2FzYXNfY2hlY2tfbXBpb19wYXRocyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpOwogCiB2b2lkCiBtZWdhc2FzX2lzc3VlX2RjbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCkKQEAgLTIyNCw2ICsyMzUsNyBAQAogCWNtZC0+c2NtZCA9IE5VTEw7CiAJY21kLT5mcmFtZV9jb3VudCA9IDA7CiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgJiYKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSAmJgogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSAmJgogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSAmJgogCSAgICAocmVzZXRfZGV2aWNlcykpCkBAIC04NzcsNiArODg5LDcgQEAKIGludAogbWVnYXNhc19pc3N1ZV9wb2xsZWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCkKIHsKKwlpbnQgc2Vjb25kczsKIAogCXN0cnVjdCBtZWdhc2FzX2hlYWRlciAqZnJhbWVfaGRyID0gJmNtZC0+ZnJhbWUtPmhkcjsKIApAQCAtODkxLDEzICs5MDQsMTggQEAKIAkvKgogCSAqIFdhaXQgZm9yIGNtZF9zdGF0dXMgdG8gY2hhbmdlCiAJICovCi0JcmV0dXJuIHdhaXRfYW5kX3BvbGwoaW5zdGFuY2UsIGNtZCk7CisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkKKwkJc2Vjb25kcyA9IE1FR0FTQVNfUk9VVElORV9XQUlUX1RJTUVfVkY7CisJZWxzZQorCQlzZWNvbmRzID0gTUZJX1BPTExfVElNRU9VVF9TRUNTOworCXJldHVybiB3YWl0X2FuZF9wb2xsKGluc3RhbmNlLCBjbWQsIHNlY29uZHMpOwogfQogCiAvKioKICAqIG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQgLQlTeW5jaHJvbm91cyB3cmFwcGVyIGFyb3VuZCByZWd1bGFyIEZXIGNtZHMKICAqIEBpbnN0YW5jZToJCQlBZGFwdGVyIHNvZnQgc3RhdGUKICAqIEBjbWQ6CQkJQ29tbWFuZCB0byBiZSBpc3N1ZWQKKyAqIEB0aW1lb3V0OgkJCVRpbWVvdXQgaW4gc2Vjb25kcwogICoKICAqIFRoaXMgZnVuY3Rpb24gd2FpdHMgb24gYW4gZXZlbnQgZm9yIHRoZSBjb21tYW5kIHRvIGJlIHJldHVybmVkIGZyb20gSVNSLgogICogTWF4IHdhaXQgdGltZSBpcyBNRUdBU0FTX0lOVEVSTkFMX0NNRF9XQUlUX1RJTUUgc2VjcwpAQCAtOTA1LDEzICs5MjMsMjAgQEAKICAqLwogc3RhdGljIGludAogbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCQkgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQorCQkJICBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCwgaW50IHRpbWVvdXQpCiB7CisJaW50IHJldCA9IDA7CiAJY21kLT5jbWRfc3RhdHVzID0gRU5PREFUQTsKIAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmlzc3VlX2RjbWQoaW5zdGFuY2UsIGNtZCk7Ci0KLQl3YWl0X2V2ZW50KGluc3RhbmNlLT5pbnRfY21kX3dhaXRfcSwgY21kLT5jbWRfc3RhdHVzICE9IEVOT0RBVEEpOworCWlmICh0aW1lb3V0KSB7CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChpbnN0YW5jZS0+aW50X2NtZF93YWl0X3EsCisJCQkJY21kLT5jbWRfc3RhdHVzICE9IEVOT0RBVEEsIHRpbWVvdXQgKiBIWik7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXdhaXRfZXZlbnQoaW5zdGFuY2UtPmludF9jbWRfd2FpdF9xLAorCQkJCWNtZC0+Y21kX3N0YXR1cyAhPSBFTk9EQVRBKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTIwLDE4ICs5NDUsMjAgQEAKICAqIG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQgLQlBYm9ydHMgcHJldmlvdXNseSBpc3N1ZWQgY21kCiAgKiBAaW5zdGFuY2U6CQkJCUFkYXB0ZXIgc29mdCBzdGF0ZQogICogQGNtZF90b19hYm9ydDoJCQlQcmV2aW91c2x5IGlzc3VlZCBjbWQgdG8gYmUgYWJvcnRlZAorICogQHRpbWVvdXQ6CQkJCVRpbWVvdXQgaW4gc2Vjb25kcwogICoKLSAqIE1GSSBmaXJtd2FyZSBjYW4gYWJvcnQgcHJldmlvdXNseSBpc3N1ZWQgQUVOIGNvbW1hbmQgKGF1dG9tYXRpYyBldmVudAorICogTUZJIGZpcm13YXJlIGNhbiBhYm9ydCBwcmV2aW91c2x5IGlzc3VlZCBBRU4gY29tYW1uZCAoYXV0b21hdGljIGV2ZW50CiAgKiBub3RpZmljYXRpb24pLiBUaGUgbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZCgpIGlzc3VlcyBzdWNoIGFib3J0CiAgKiBjbWQgYW5kIHdhaXRzIGZvciByZXR1cm4gc3RhdHVzLgogICogTWF4IHdhaXQgdGltZSBpcyBNRUdBU0FTX0lOVEVSTkFMX0NNRF9XQUlUX1RJTUUgc2VjcwogICovCiBzdGF0aWMgaW50CiBtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKLQkJCQlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZF90b19hYm9ydCkKKwkJCQlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZF90b19hYm9ydCwgaW50IHRpbWVvdXQpCiB7CiAJc3RydWN0IG1lZ2FzYXNfY21kICpjbWQ7CiAJc3RydWN0IG1lZ2FzYXNfYWJvcnRfZnJhbWUgKmFib3J0X2ZyOworCWludCByZXQgPSAwOwogCiAJY21kID0gbWVnYXNhc19nZXRfY21kKGluc3RhbmNlKTsKIApAQCAtOTU3LDEwICs5ODQsMTggQEAKIAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmlzc3VlX2RjbWQoaW5zdGFuY2UsIGNtZCk7CiAKLQkvKgotCSAqIFdhaXQgZm9yIHRoaXMgY21kIHRvIGNvbXBsZXRlCi0JICovCi0Jd2FpdF9ldmVudChpbnN0YW5jZS0+YWJvcnRfY21kX3dhaXRfcSwgY21kLT5jbWRfc3RhdHVzICE9IDB4RkYpOworCWlmICh0aW1lb3V0KSB7CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChpbnN0YW5jZS0+YWJvcnRfY21kX3dhaXRfcSwKKwkJCQljbWQtPmNtZF9zdGF0dXMgIT0gRU5PREFUQSwgdGltZW91dCAqIEhaKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRldl9lcnIoJmluc3RhbmNlLT5wZGV2LT5kZXYsICJDb21tYW5kIHRpbWVkb3V0IgorCQkJCSJmcm9tICVzXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZQorCQl3YWl0X2V2ZW50KGluc3RhbmNlLT5hYm9ydF9jbWRfd2FpdF9xLAorCQkJCWNtZC0+Y21kX3N0YXR1cyAhPSBFTk9EQVRBKTsKKwogCWNtZC0+c3luY19jbWQgPSAwOwogCiAJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOwpAQCAtMTUxNCw5ICsxNTQ5LDIzIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7CiAKKwkvKiBDaGVjayBmb3IgYW4gbXBpbyBwYXRoIGFuZCBhZGp1c3QgYmVoYXZpb3IgKi8KKwlpZiAoaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID09IE1FR0FTQVNfQURQUkVTRVRfU01fSU5GQVVMVCkgeworCQlpZiAobWVnYXNhc19jaGVja19tcGlvX3BhdGhzKGluc3RhbmNlLCBzY21kKSA9PQorCQkgICAgKERJRF9SRVNFVCA8PCAxNikpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5oYmFfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKKwkJCXNjbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJZG9uZShzY21kKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCiAJaWYgKGluc3RhbmNlLT5hZHByZWNvdmVyeSA9PSBNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5oYmFfbG9jaywgZmxhZ3MpOwotCQlzY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXNjbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQlkb25lKHNjbWQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNjQxLDkgKzE2OTAsMTQgQEAKIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKSB7CiAJCXdyaXRlbChNRklfU1RPUF9BRFAsICZpbnN0YW5jZS0+cmVnX3NldC0+ZG9vcmJlbGwpOworCQkvKiBGbHVzaCAqLworCQlyZWFkbCgmaW5zdGFuY2UtPnJlZ19zZXQtPmRvb3JiZWxsKTsKKwkJaWYgKGluc3RhbmNlLT5tcGlvICYmIGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkKKwkJCW1lbXNldChpbnN0YW5jZS0+bGRfaWRzLCAweGZmLCBNRUdBU0FTX01BWF9MRF9JRFMpOwogCX0gZWxzZSB7CiAJCXdyaXRlbChNRklfU1RPUF9BRFAsICZpbnN0YW5jZS0+cmVnX3NldC0+aW5ib3VuZF9kb29yYmVsbCk7CiAJfQpAQCAtMTczMCw2ICsxNzg0LDI1IEBACiAJbWVnYXNhc19jaGVja19hbmRfcmVzdG9yZV9xdWV1ZV9kZXB0aChpbnN0YW5jZSk7CiB9CiAKKy8qKgorICogbWVnYXNhc19zdGFydF90aW1lciAtIEluaXRpYWxpemVzIGEgdGltZXIgb2JqZWN0CisgKiBAaW5zdGFuY2U6CQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqIEB0aW1lcjoJCXRpbWVyIG9iamVjdCB0byBiZSBpbml0aWFsaXplZAorICogQGZuOgkJCXRpbWVyIGZ1bmN0aW9uCisgKiBAaW50ZXJ2YWw6CQl0aW1lIGludGVydmFsIGJldHdlZW4gdGltZXIgZnVuY3Rpb24gY2FsbAorICoKKyAqLwordm9pZCBtZWdhc2FzX3N0YXJ0X3RpbWVyKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCXZvaWQgKmZuLCB1bnNpZ25lZCBsb25nIGludGVydmFsKQoreworCWluaXRfdGltZXIodGltZXIpOworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIGludGVydmFsOworCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2U7CisJdGltZXItPmZ1bmN0aW9uID0gZm47CisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKwogc3RhdGljIHZvaWQKIG1lZ2FzYXNfaW50ZXJuYWxfcmVzZXRfZGVmZXJfY21kcyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwogCkBAIC0xNzUyLDYgKzE4MjUsMjk1IEBACiAJcHJvY2Vzc19md19zdGF0ZV9jaGFuZ2Vfd3EoJmluc3RhbmNlLT53b3JrX2luaXQpOwogfQogCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBjdXJyZW50IFNSLUlPViBMRC9WRiBhZmZpbGlhdGlvbiAqLworc3RhdGljIGludCBtZWdhc2FzX2dldF9sZF92Zl9hZmZpbGlhdGlvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJaW50IGluaXRpYWwpCit7CisJc3RydWN0IG1lZ2FzYXNfY21kICpjbWQ7CisJc3RydWN0IG1lZ2FzYXNfZGNtZF9mcmFtZSAqZGNtZDsKKwlzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04gKm5ld19hZmZpbGlhdGlvbiA9IE5VTEw7CisJc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSAqbmV3X2FmZmlsaWF0aW9uXzExMSA9IE5VTEw7CisJc3RydWN0IE1SX0xEX1ZGX01BUCAqbmV3bWFwID0gTlVMTCwgKnNhdmVkbWFwID0gTlVMTDsKKwlkbWFfYWRkcl90IG5ld19hZmZpbGlhdGlvbl9oOworCWRtYV9hZGRyX3QgbmV3X2FmZmlsaWF0aW9uXzExMV9oOworCWludCBsZCwgcmV0dmFsID0gMDsKKwl1OCB0aGlzVmY7CisKKwljbWQgPSBtZWdhc2FzX2dldF9jbWQoaW5zdGFuY2UpOworCisJaWYgKCFjbWQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IG1lZ2FzYXNfZ2V0X2xkX3ZmXyIKKwkJICAgICAgICJhZmZpbGlhdGlvbjogRmFpbGVkIHRvIGdldCBjbWQgZm9yIHNjc2klZC5cbiIsCisJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRjbWQgPSAmY21kLT5mcmFtZS0+ZGNtZDsKKworCWlmICghaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uICYmICFpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogQ291bGRuJ3QgZ2V0IExEL1ZGICIKKwkJICAgICAgICJhZmZpbGlhdGlvbiBmb3Igc2NzaSVkLlxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpbml0aWFsKQorCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJbWVtc2V0KGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEsIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpKTsKKwkJZWxzZQorCQkJbWVtc2V0KGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbiwgMCwKKwkJCSAgICAgICAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pKTsKKwllbHNlIHsKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCW5ld19hZmZpbGlhdGlvbl8xMTEgPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGluc3RhbmNlLT5wZGV2LAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSksCisJCQkJCQkgICAgICZuZXdfYWZmaWxpYXRpb25fMTExX2gpOworCQllbHNlCisJCQluZXdfYWZmaWxpYXRpb24gPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGluc3RhbmNlLT5wZGV2LAorCQkJCQkJICAgICAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKSwKKwkJCQkJCSAgICAgJm5ld19hZmZpbGlhdGlvbl9oKTsKKwkJaWYgKCFuZXdfYWZmaWxpYXRpb24gJiYgIW5ld19hZmZpbGlhdGlvbl8xMTEpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBTUi1JT1Y6IENvdWxkbid0IGFsbG9jYXRlICIKKwkJCSAgICAgICAibWVtb3J5IGZvciBuZXcgYWZmaWxpYXRpb24gZm9yIHNjc2klZC5cbiIsCisJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCW1lbXNldChuZXdfYWZmaWxpYXRpb25fMTExLCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSk7CisJCWVsc2UKKwkJCW1lbXNldChuZXdfYWZmaWxpYXRpb24sIDAsIChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTikpOworCX0KKworCW1lbXNldChkY21kLT5tYm94LmIsIDAsIE1GSV9NQk9YX1NJWkUpOworCisJZGNtZC0+Y21kID0gTUZJX0NNRF9EQ01EOworCWRjbWQtPmNtZF9zdGF0dXMgPSAweEZGOworCWRjbWQtPnNnZV9jb3VudCA9IDE7CisJZGNtZC0+ZmxhZ3MgPSBNRklfRlJBTUVfRElSX0JPVEg7CisJZGNtZC0+dGltZW91dCA9IDA7CisJZGNtZC0+cGFkXzAgPSAwOworCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpIHsKKwkJZGNtZC0+ZGF0YV94ZmVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKTsKKwkJZGNtZC0+b3Bjb2RlID0gTVJfRENNRF9MRF9WRl9NQVBfR0VUX0FMTF9MRFNfMTExOworCX0gZWxzZSB7CisJCWRjbWQtPmRhdGFfeGZlcl9sZW4gPSAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTik7CisJCWRjbWQtPm9wY29kZSA9IE1SX0RDTURfTERfVkZfTUFQX0dFVF9BTExfTERTOworCX0KKworCWlmIChpbml0aWFsKSB7CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0KKwkJCSAgaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMV9oOworCQllbHNlCisJCQlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0KKwkJCSAgaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uX2g7CisJfSBlbHNlIHsKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPSBuZXdfYWZmaWxpYXRpb25fMTExX2g7CisJCWVsc2UKKwkJCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPSBuZXdfYWZmaWxpYXRpb25faDsKKwl9CisJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJZGNtZC0+c2dsLnNnZTMyWzBdLmxlbmd0aCA9CisJCSAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpOworCWVsc2UKKwkJZGNtZC0+c2dsLnNnZTMyWzBdLmxlbmd0aCA9IChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQlzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogR2V0dGluZyBMRC9WRiBhZmZpbGlhdGlvbiBmb3IgIgorCSAgICAgICAic2NzaSVkXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisKKwltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQsIDApOworCisJaWYgKGRjbWQtPmNtZF9zdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBMRC9WRiBhZmZpbGlhdGlvbiBEQ01EIgorCQkgICAgICAgIiBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCBmb3Igc2NzaSVkLlxuIiwKKwkJICAgICAgIGRjbWQtPmNtZF9zdGF0dXMsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dmFsID0gMTsgLyogRG8gYSBzY2FuIGlmIHdlIGNvdWxkbid0IGdldCBhZmZpbGlhdGlvbiAqLworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWluaXRpYWwpIHsKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkgeworCQkJaWYgKCFuZXdfYWZmaWxpYXRpb25fMTExLT52ZENvdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBHb3QgbmV3ICIKKwkJCQkgICAgICAgIkxEL1ZGIGFmZmlsaWF0aW9uIGZvciBwYXNzaXZlIHBhdGggIgorCQkJCSAgICAgICAiZm9yIHNjc2klZC5cbiIsCisJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQlyZXR2YWwgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdGhpc1ZmID0gbmV3X2FmZmlsaWF0aW9uXzExMS0+dGhpc1ZmOworCQkJZm9yIChsZCA9IDAgOyBsZCA8IG5ld19hZmZpbGlhdGlvbl8xMTEtPnZkQ291bnQ7IGxkKyspCisJCQkJaWYgKGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEtPm1hcFtsZF0ucG9saWN5W3RoaXNWZl0gIT0gbmV3X2FmZmlsaWF0aW9uXzExMS0+bWFwW2xkXS5wb2xpY3lbdGhpc1ZmXSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6ICIKKwkJCQkJICAgICAgICJHb3QgbmV3IExEL1ZGIGFmZmlsaWF0aW9uICIKKwkJCQkJICAgICAgICJmb3Igc2NzaSVkLlxuIiwKKwkJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJbWVtY3B5KGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEsCisJCQkJCSAgICAgICBuZXdfYWZmaWxpYXRpb25fMTExLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpKTsKKwkJCQkJcmV0dmFsID0gMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFuZXdfYWZmaWxpYXRpb24tPmxkQ291bnQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IEdvdCBuZXcgIgorCQkJCSAgICAgICAiTEQvVkYgYWZmaWxpYXRpb24gZm9yIHBhc3NpdmUgIgorCQkJCSAgICAgICAicGF0aCBmb3Igc2NzaSVkLlxuIiwKKwkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCXJldHZhbCA9IDE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQluZXdtYXAgPSBuZXdfYWZmaWxpYXRpb24tPm1hcDsKKwkJCXNhdmVkbWFwID0gaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uLT5tYXA7CisJCQl0aGlzVmYgPSBuZXdfYWZmaWxpYXRpb24tPnRoaXNWZjsKKwkJCWZvciAobGQgPSAwIDsgbGQgPCBuZXdfYWZmaWxpYXRpb24tPmxkQ291bnQ7IGxkKyspIHsKKwkJCQlpZiAoc2F2ZWRtYXAtPnBvbGljeVt0aGlzVmZdICE9CisJCQkJICAgIG5ld21hcC0+cG9saWN5W3RoaXNWZl0pIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiAiCisJCQkJCSAgICAgICAiR290IG5ldyBMRC9WRiBhZmZpbGlhdGlvbiAiCisJCQkJCSAgICAgICAiZm9yIHNjc2klZC5cbiIsCisJCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCW1lbWNweShpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24sCisJCQkJCSAgICAgICBuZXdfYWZmaWxpYXRpb24sCisJCQkJCSAgICAgICBuZXdfYWZmaWxpYXRpb24tPnNpemUpOworCQkJCQlyZXR2YWwgPSAxOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJc2F2ZWRtYXAgPSAoc3RydWN0IE1SX0xEX1ZGX01BUCAqKQorCQkJCQkoKHVuc2lnbmVkIGNoYXIgKilzYXZlZG1hcCArCisJCQkJCSBzYXZlZG1hcC0+c2l6ZSk7CisJCQkJbmV3bWFwID0gKHN0cnVjdCBNUl9MRF9WRl9NQVAgKikKKwkJCQkJKCh1bnNpZ25lZCBjaGFyICopbmV3bWFwICsKKwkJCQkJIG5ld21hcC0+c2l6ZSk7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJaWYgKG5ld19hZmZpbGlhdGlvbikgeworCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSwKKwkJCQkJICAgIG5ld19hZmZpbGlhdGlvbl8xMTEsCisJCQkJCSAgICBuZXdfYWZmaWxpYXRpb25fMTExX2gpOworCQllbHNlCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGluc3RhbmNlLT5wZGV2LAorCQkJCQkgICAgKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pLAorCQkJCQkgICAgbmV3X2FmZmlsaWF0aW9uLCBuZXdfYWZmaWxpYXRpb25faCk7CisJfQorCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCB0ZWxsIEZXIHRvIHN0YXJ0IHRoZSBTUi1JT1YgaGVhcnRiZWF0ICovCitpbnQgbWVnYXNhc19zcmlvdl9zdGFydF9oZWFydGJlYXQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJCQkgaW50IGluaXRpYWwpCit7CisJc3RydWN0IG1lZ2FzYXNfY21kICpjbWQ7CisJc3RydWN0IG1lZ2FzYXNfZGNtZF9mcmFtZSAqZGNtZDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWNtZCA9IG1lZ2FzYXNfZ2V0X2NtZChpbnN0YW5jZSk7CisKKwlpZiAoIWNtZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogbWVnYXNhc19zcmlvdl9zdGFydF9oZWFydGJlYXQ6ICIKKwkJICAgICAgICJGYWlsZWQgdG8gZ2V0IGNtZCBmb3Igc2NzaSVkLlxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGNtZCA9ICZjbWQtPmZyYW1lLT5kY21kOworCisJaWYgKGluaXRpYWwpIHsKKwkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtID0KKwkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGluc3RhbmNlLT5wZGV2LAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSksCisJCQkJCSAgICAgJmluc3RhbmNlLT5oYl9ob3N0X21lbV9oKTsKKwkJaWYgKCFpbnN0YW5jZS0+aGJfaG9zdF9tZW0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBTUi1JT1Y6IENvdWxkbid0IGFsbG9jYXRlIgorCQkJICAgICAgICIgbWVtb3J5IGZvciBoZWFydGJlYXQgaG9zdCBtZW1vcnkgZm9yICIKKwkJCSAgICAgICAic2NzaSVkLlxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbXNldChpbnN0YW5jZS0+aGJfaG9zdF9tZW0sIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0pKTsKKwl9CisKKwltZW1zZXQoZGNtZC0+bWJveC5iLCAwLCBNRklfTUJPWF9TSVpFKTsKKworCWRjbWQtPm1ib3guc1swXSA9IHNpemVvZihzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSk7CisJZGNtZC0+Y21kID0gTUZJX0NNRF9EQ01EOworCWRjbWQtPmNtZF9zdGF0dXMgPSAweEZGOworCWRjbWQtPnNnZV9jb3VudCA9IDE7CisJZGNtZC0+ZmxhZ3MgPSBNRklfRlJBTUVfRElSX0JPVEg7CisJZGNtZC0+dGltZW91dCA9IDA7CisJZGNtZC0+cGFkXzAgPSAwOworCWRjbWQtPmRhdGFfeGZlcl9sZW4gPSBzaXplb2Yoc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0pOworCWRjbWQtPm9wY29kZSA9IE1SX0RDTURfQ1RSTF9TSEFSRURfSE9TVF9NRU1fQUxMT0M7CisJZGNtZC0+c2dsLnNnZTMyWzBdLnBoeXNfYWRkciA9IGluc3RhbmNlLT5oYl9ob3N0X21lbV9oOworCWRjbWQtPnNnbC5zZ2UzMlswXS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0pOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBTdGFydGluZyBoZWFydGJlYXQgZm9yIHNjc2klZFxuIiwKKwkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCisJaWYgKCFtZWdhc2FzX2lzc3VlX3BvbGxlZChpbnN0YW5jZSwgY21kKSkgeworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogTVJfRENNRF9DVFJMX1NIQVJFRF9IT1NUIgorCQkgICAgICAgIl9NRU1fQUxMT0MgRENNRCB0aW1lZCBvdXQgZm9yIHNjc2klZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dmFsID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisKKwlpZiAoZGNtZC0+Y21kX3N0YXR1cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IE1SX0RDTURfQ1RSTF9TSEFSRURfSE9TVCIKKwkJICAgICAgICJfTUVNX0FMTE9DIERDTUQgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXggZm9yIHNjc2klZFxuIiwKKwkJICAgICAgIGRjbWQtPmNtZF9zdGF0dXMsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHZhbCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEhhbmRsZXIgZm9yIFNSLUlPViBoZWFydGJlYXQgKi8KK3ZvaWQgbWVnYXNhc19zcmlvdl9oZWFydGJlYXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGluc3RhbmNlX2FkZHIpCit7CisJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0KKwkJKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICopaW5zdGFuY2VfYWRkcjsKKworCWlmIChpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmZ3Q291bnRlciAhPQorCSAgICBpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmRyaXZlckNvdW50ZXIpIHsKKwkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5kcml2ZXJDb3VudGVyID0KKwkJCWluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZndDb3VudGVyOworCQltb2RfdGltZXIoJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIsCisJCQkgIGppZmZpZXMgKyBNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBIZWFydGJlYXQgbmV2ZXIgIgorCQkgICAgICAgImNvbXBsZXRlZCBmb3Igc2NzaSVkXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT53b3JrX2luaXQpOworCX0KK30KKwogLyoqCiAgKiBtZWdhc2FzX3dhaXRfZm9yX291dHN0YW5kaW5nIC0JV2FpdCBmb3IgYWxsIG91dHN0YW5kaW5nIGNtZHMKICAqIEBpbnN0YW5jZToJCQkJQWRhcHRlciBzb2Z0IHN0YXRlCkBAIC0yMDE0LDkgKzIzNzYsMTAgQEAKIAkgKiBGaXJzdCB3YWl0IGZvciBhbGwgY29tbWFuZHMgdG8gY29tcGxldGUKIAkgKi8KIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKQotCQlyZXQgPSBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzY21kLT5kZXZpY2UtPmhvc3QpOworCQlyZXQgPSBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzY21kLT5kZXZpY2UtPmhvc3QsIDEpOwogCWVsc2UKIAkJcmV0ID0gbWVnYXNhc19nZW5lcmljX3Jlc2V0KHNjbWQpOwogCkBAIC0yNzMxLDYgKzMwOTQsOCBAQAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkJUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAorCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKSB7CkBAIC0yNzU1LDYgKzMxMjAsOCBAQAogCQkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkgICAgIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKIAkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CisJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkgewpAQCAtMjc4MCw2ICszMTQ3LDggQEAKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZQogCQkJCQk9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UKKwkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAorCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlCiAJCQkJCT09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UKIAkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpIHsKQEAgLTI3ODgsNiArMzE1Nyw4IEBACiAJCQkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKIAkJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCQkJUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAorCQkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCQlQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCQkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCQlQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkgewpAQCAtMzAxNCw2ICszMzg1LDcgQEAKIAkJY21kLT5mcmFtZS0+aW8uY29udGV4dCA9IGNwdV90b19sZTMyKGNtZC0+aW5kZXgpOwogCQljbWQtPmZyYW1lLT5pby5wYWRfMCA9IDA7CiAJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pICYmCisJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpICYmCiAJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSAmJgogCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkgJiYKIAkJICAgIChyZXNldF9kZXZpY2VzKSkKQEAgLTM2MjAsNiArMzk5Miw3IEBACiAJc3RydWN0IG1lZ2FzYXNfY3RybF9pbmZvICpjdHJsX2luZm87CiAJdW5zaWduZWQgbG9uZyBiYXJfbGlzdDsKIAlpbnQgaSwgbG9vcCwgZndfbXNpeF9jb3VudCA9IDA7CisJc3RydWN0IElPVl8xMTEgKmlvdlB0cjsKIAogCS8qIEZpbmQgZmlyc3QgbWVtb3J5IGJhciAqLwogCWJhcl9saXN0ID0gcGNpX3NlbGVjdF9iYXJzKGluc3RhbmNlLT5wZGV2LCBJT1JFU09VUkNFX01FTSk7CkBAIC0zNjQyLDYgKzQwMTUsNyBAQAogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVSWToKIAkJaW5zdGFuY2UtPmluc3RhbmNldCA9ICZtZWdhc2FzX2luc3RhbmNlX3RlbXBsYXRlX2Z1c2lvbjsKQEAgLTM2OTYsNyArNDA3MCw4IEBACiAJCXNjcmF0Y2hfcGFkXzIgPSByZWFkbAogCQkJKCZpbnN0YW5jZS0+cmVnX3NldC0+b3V0Ym91bmRfc2NyYXRjaF9wYWRfMik7CiAJCS8qIENoZWNrIG1heCBNU0ktWCB2ZWN0b3JzICovCi0JCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgeworCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSkgewogCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IChzY3JhdGNoX3BhZF8yCiAJCQkJJiBNUl9NQVhfUkVQTFlfUVVFVUVTX09GRlNFVCkgKyAxOwogCQkJZndfbXNpeF9jb3VudCA9IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7CkBAIC0zNzYzLDcgKzQxMzgsMTAgQEAKIAogCW1lbXNldChpbnN0YW5jZS0+cGRfbGlzdCwgMCAsCiAJCShNRUdBU0FTX01BWF9QRCAqIHNpemVvZihzdHJ1Y3QgbWVnYXNhc19wZF9saXN0KSkpOwotCW1lZ2FzYXNfZ2V0X3BkX2xpc3QoaW5zdGFuY2UpOworCWlmIChtZWdhc2FzX2dldF9wZF9saXN0KGluc3RhbmNlKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZWdhc2FzOiBmYWlsZWQgdG8gZ2V0IFBEIGxpc3RcbiIpOworCQlnb3RvIGZhaWxfaW5pdF9hZGFwdGVyOworCX0KIAogCW1lbXNldChpbnN0YW5jZS0+bGRfaWRzLCAweGZmLCBNRUdBU0FTX01BWF9MRF9JRFMpOwogCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCkBAIC0zODA3LDYgKzQxODUsNyBAQAogCQljdHJsX2luZm8tPnByb3BlcnRpZXMuT25PZmZQcm9wZXJ0aWVzLmRpc2FibGVPbmxpbmVDdHJsUmVzZXQ7CiAJCS8qIGFkYXB0ZXJPcGVyYXRpb25zMiBhcmUgY29udmVydGVkIGludG8gQ1BVIGFyY2gqLwogCQlsZTMyX3RvX2NwdXMoKHUzMiAqKSZjdHJsX2luZm8tPmFkYXB0ZXJPcGVyYXRpb25zMik7CisJCWluc3RhbmNlLT5tcGlvID0gY3RybF9pbmZvLT5hZGFwdGVyT3BlcmF0aW9uczIubXBpbzsKIAkJaW5zdGFuY2UtPlVuZXZlblNwYW5TdXBwb3J0ID0KIAkJCWN0cmxfaW5mby0+YWRhcHRlck9wZXJhdGlvbnMyLnN1cHBvcnRVbmV2ZW5TcGFuczsKIAkJaWYgKGluc3RhbmNlLT5VbmV2ZW5TcGFuU3VwcG9ydCkgewpAQCAtMzgxOSw2ICs0MTk4LDIwIEBACiAJCQkJZnVzaW9uLT5mYXN0X3BhdGhfaW8gPSAwOwogCiAJCX0KKwkJaWYgKGN0cmxfaW5mby0+aG9zdF9pbnRlcmZhY2UuU1JJT1YpIHsKKwkJCWlmICghY3RybF9pbmZvLT5hZGFwdGVyT3BlcmF0aW9uczIuYWN0aXZlUGFzc2l2ZSkKKwkJCQlpbnN0YW5jZS0+UGxhc21hRlcxMTEgPSAxOworCisJCQlpZiAoIWluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCQlpbnN0YW5jZS0+cmVxdWVzdG9ySWQgPQorCQkJCQljdHJsX2luZm8tPmlvdi5yZXF1ZXN0b3JJZDsKKwkJCWVsc2UgeworCQkJCWlvdlB0ciA9IChzdHJ1Y3QgSU9WXzExMSAqKSgodW5zaWduZWQgY2hhciAqKWN0cmxfaW5mbyArIElPVl8xMTFfT0ZGU0VUKTsKKwkJCQlpbnN0YW5jZS0+cmVxdWVzdG9ySWQgPSBpb3ZQdHItPnJlcXVlc3RvcklkOworCQkJfQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBJIGFtIFZGICIKKwkJCSAgICAgICAicmVxdWVzdG9ySWQgJWRcbiIsIGluc3RhbmNlLT5yZXF1ZXN0b3JJZCk7CisJCX0KIAl9CiAJaW5zdGFuY2UtPm1heF9zZWN0b3JzX3Blcl9yZXEgPSBpbnN0YW5jZS0+bWF4X251bV9zZ2UgKgogCQkJCQkJUEFHRV9TSVpFIC8gNTEyOwpAQCAtMzg1MSw2ICs0MjQ0LDE3IEBACiAJdGFza2xldF9pbml0KCZpbnN0YW5jZS0+aXNyX3Rhc2tsZXQsIGluc3RhbmNlLT5pbnN0YW5jZXQtPnRhc2tsZXQsCiAJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlKTsKIAorCS8qIExhdW5jaCBTUi1JT1YgaGVhcnRiZWF0IHRpbWVyICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkgeworCQlpZiAoIW1lZ2FzYXNfc3Jpb3Zfc3RhcnRfaGVhcnRiZWF0KGluc3RhbmNlLCAxKSkKKwkJCW1lZ2FzYXNfc3RhcnRfdGltZXIoaW5zdGFuY2UsCisJCQkJCSAgICAmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lciwKKwkJCQkJICAgIG1lZ2FzYXNfc3Jpb3ZfaGVhcnRiZWF0X2hhbmRsZXIsCisJCQkJCSAgICBNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRik7CisJCWVsc2UKKwkJCWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwgPSAxOworCX0KKwogCXJldHVybiAwOwogCiBmYWlsX2luaXRfYWRhcHRlcjoKQEAgLTM5MzMsMTYgKzQzMzcsMTkgQEAKIAlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0gY3B1X3RvX2xlMzIoZWxfaW5mb19oKTsKIAlkY21kLT5zZ2wuc2dlMzJbMF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX2V2dF9sb2dfaW5mbykpOwogCi0JbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kKTsKLQotCS8qCi0JICogQ29weSB0aGUgZGF0YSBiYWNrIGludG8gY2FsbGVycyBidWZmZXIKLQkgKi8KLQllbGktPm5ld2VzdF9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+bmV3ZXN0X3NlcV9udW0pOwotCWVsaS0+b2xkZXN0X3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5vbGRlc3Rfc2VxX251bSk7Ci0JZWxpLT5jbGVhcl9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+Y2xlYXJfc2VxX251bSk7Ci0JZWxpLT5zaHV0ZG93bl9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+c2h1dGRvd25fc2VxX251bSk7Ci0JZWxpLT5ib290X3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5ib290X3NlcV9udW0pOworCWlmIChtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQsIDMwKSkKKwkJZGV2X2VycigmaW5zdGFuY2UtPnBkZXYtPmRldiwgIkNvbW1hbmQgdGltZWRvdXQiCisJCQkiZnJvbSAlc1xuIiwgX19mdW5jX18pOworCWVsc2UgeworCQkvKgorCQkgKiBDb3B5IHRoZSBkYXRhIGJhY2sgaW50byBjYWxsZXJzIGJ1ZmZlcgorCQkgKi8KKwkJZWxpLT5uZXdlc3Rfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPm5ld2VzdF9zZXFfbnVtKTsKKwkJZWxpLT5vbGRlc3Rfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPm9sZGVzdF9zZXFfbnVtKTsKKwkJZWxpLT5jbGVhcl9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+Y2xlYXJfc2VxX251bSk7CisJCWVsaS0+c2h1dGRvd25fc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPnNodXRkb3duX3NlcV9udW0pOworCQllbGktPmJvb3Rfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPmJvb3Rfc2VxX251bSk7CisJfQogCiAJcGNpX2ZyZWVfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwgc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX2V2dF9sb2dfaW5mbyksCiAJCQkgICAgZWxfaW5mbywgZWxfaW5mb19oKTsKQEAgLTQwMTgsNyArNDQyNSw3IEBACiAJCQlpbnN0YW5jZS0+YWVuX2NtZC0+YWJvcnRfYWVuID0gMTsKIAkJCXJldF92YWwgPSBtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kKGluc3RhbmNlLAogCQkJCQkJCQkgIGluc3RhbmNlLT4KLQkJCQkJCQkJICBhZW5fY21kKTsKKwkJCQkJCQkJICBhZW5fY21kLCAzMCk7CiAKIAkJCWlmIChyZXRfdmFsKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byBhYm9ydCAiCkBAIC00MTYwLDYgKzQ1NjcsNyBAQAogCiAJLyogRnVzaW9uIG9ubHkgc3VwcG9ydHMgaG9zdCByZXNldCAqLwogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpIHsKIAkJaG9zdC0+aG9zdHQtPmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gTlVMTDsKQEAgLTQxOTcsNiArNDYwNSwxOSBAQAogCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSAhPSAwKQogCQkJZ290byBmYWlsX3NldF9kbWFfbWFzazsKIAl9CisJLyoKKwkgKiBFbnN1cmUgdGhhdCBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgaW4gMzItYml0CisJICogbWVtb3J5LgorCSAqLworCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgIT0gMCkgeworCQkvKiBUcnkgMzJiaXQgRE1BIG1hc2sgYW5kIDMyIGJpdCBDb25zaXN0ZW50IGRtYSBtYXNrICovCisJCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKQorCQkJJiYgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzZXQgMzJiaXQgRE1BIG1hc2siCisJCQkJImFuZCAzMiBiaXQgY29uc2lzdGVudCBtYXNrXG4iKTsKKwkJZWxzZQorCQkJZ290byBmYWlsX3NldF9kbWFfbWFzazsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtNDIxMiw3ICs0NjMzLDcgQEAKIHN0YXRpYyBpbnQgbWVnYXNhc19wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcnZhbCwgcG9zLCBpLCBqOworCWludCBydmFsLCBwb3MsIGksIGosIGNwdTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKIAl1MTYgY29udHJvbCA9IDA7CkBAIC00MjcyLDYgKzQ2OTMsNyBAQAogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVSWToKIAl7CkBAIC00MzY4LDYgKzQ3OTAsNyBAQAogCWluc3RhbmNlLT5VbmV2ZW5TcGFuU3VwcG9ydCA9IDA7CiAKIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKQogCQlJTklUX1dPUksoJmluc3RhbmNlLT53b3JrX2luaXQsIG1lZ2FzYXNfZnVzaW9uX29jcl93cSk7CkBAIC00MzgwLDEyICs0ODAzLDMzIEBACiAJaWYgKG1lZ2FzYXNfaW5pdF9mdyhpbnN0YW5jZSkpCiAJCWdvdG8gZmFpbF9pbml0X21maTsKIAorCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpIHsKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkgeworCQkJaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpLAorCQkJCQkJICAgICAmaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMV9oKTsKKwkJCWlmICghaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBDYW4ndCBhbGxvY2F0ZSAiCisJCQkJICAgICAgICJtZW1vcnkgZm9yIFZGIGFmZmlsaWF0aW9uIGJ1ZmZlclxuIik7CisJCX0gZWxzZSB7CisJCQlpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24gPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCQkgICAgIChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pLAorCQkJCQkJICAgICAmaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uX2gpOworCQkJaWYgKCFpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24pCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogQ2FuJ3QgYWxsb2NhdGUgIgorCQkJCSAgICAgICAibWVtb3J5IGZvciBWRiBhZmZpbGlhdGlvbiBidWZmZXJcbiIpOworCQl9CisJfQorCiByZXRyeV9pcnFfcmVnaXN0ZXI6CiAJLyoKIAkgKiBSZWdpc3RlciBJUlEKIAkgKi8KIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykgewotCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKIAkJCWluc3RhbmNlLT5pcnFfY29udGV4dFtpXS5pbnN0YW5jZSA9IGluc3RhbmNlOwogCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLk1TSXhJbmRleCA9IGk7CiAJCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCkBAIC00Mzk0LDE0ICs0ODM4LDIyIEBACiAJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byAiCiAJCQkJICAgICAgICJyZWdpc3RlciBJUlEgZm9yIHZlY3RvciAlZC5cbiIsIGkpOwotCQkJCWZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykKKwkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbal0udmVjdG9yLCBOVUxMKTsKIAkJCQkJZnJlZV9pcnEoCiAJCQkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2pdLnZlY3RvciwKIAkJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbal0pOworCQkJCX0KIAkJCQkvKiBSZXRyeSBpcnEgcmVnaXN0ZXIgZm9yIElPX0FQSUMgKi8KIAkJCQlpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID0gMDsKIAkJCQlnb3RvIHJldHJ5X2lycV9yZWdpc3RlcjsKIAkJCX0KKwkJCWlmIChpcnFfc2V0X2FmZmluaXR5X2hpbnQoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJZ2V0X2NwdV9tYXNrKGNwdSkpKQorCQkJCWRldl9lcnIoJmluc3RhbmNlLT5wZGV2LT5kZXYsICJFcnJvciBzZXR0aW5nIgorCQkJCQkiYWZmaW5pdHkgaGludCBmb3IgY3B1ICVkXG4iLCBjcHUpOworCQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X29ubGluZV9tYXNrKTsKIAkJfQogCX0gZWxzZSB7CiAJCWluc3RhbmNlLT5pcnFfY29udGV4dFswXS5pbnN0YW5jZSA9IGluc3RhbmNlOwpAQCAtNDQ1NSwxMyArNDkwNywxNyBAQAogCiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlKTsKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKLQkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwgTlVMTCk7CiAJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKIAkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJCX0KIAllbHNlCiAJCWZyZWVfaXJxKGluc3RhbmNlLT5wZGV2LT5pcnEsICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0pOwogZmFpbF9pcnE6CiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkKIAkJbWVnYXNhc19yZWxlYXNlX2Z1c2lvbihpbnN0YW5jZSk7CkBAIC00NTIyLDcgKzQ5NzgsOSBAQAogCWRjbWQtPm9wY29kZSA9IGNwdV90b19sZTMyKE1SX0RDTURfQ1RSTF9DQUNIRV9GTFVTSCk7CiAJZGNtZC0+bWJveC5iWzBdID0gTVJfRkxVU0hfQ1RSTF9DQUNIRSB8IE1SX0ZMVVNIX0RJU0tfQ0FDSEU7CiAKLQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQpOworCWlmIChtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQsIDMwKSkKKwkJZGV2X2VycigmaW5zdGFuY2UtPnBkZXYtPmRldiwgIkNvbW1hbmQgdGltZWRvdXQiCisJCQkiIGZyb20gJXNcbiIsIF9fZnVuY19fKTsKIAogCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKIApAQCAtNDU0OSwxMCArNTAwNywxMSBAQAogCQlyZXR1cm47CiAKIAlpZiAoaW5zdGFuY2UtPmFlbl9jbWQpCi0JCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQoaW5zdGFuY2UsIGluc3RhbmNlLT5hZW5fY21kKTsKKwkJbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZChpbnN0YW5jZSwKKwkJCWluc3RhbmNlLT5hZW5fY21kLCAzMCk7CiAJaWYgKGluc3RhbmNlLT5tYXBfdXBkYXRlX2NtZCkKIAkJbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZChpbnN0YW5jZSwKLQkJCQkJCWluc3RhbmNlLT5tYXBfdXBkYXRlX2NtZCk7CisJCQlpbnN0YW5jZS0+bWFwX3VwZGF0ZV9jbWQsIDMwKTsKIAlkY21kID0gJmNtZC0+ZnJhbWUtPmRjbWQ7CiAKIAltZW1zZXQoZGNtZC0+bWJveC5iLCAwLCBNRklfTUJPWF9TSVpFKTsKQEAgLTQ1NjYsNyArNTAyNSw5IEBACiAJZGNtZC0+ZGF0YV94ZmVyX2xlbiA9IDA7CiAJZGNtZC0+b3Bjb2RlID0gY3B1X3RvX2xlMzIob3Bjb2RlKTsKIAotCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCk7CisJaWYgKG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCwgMzApKQorCQlkZXZfZXJyKCZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiQ29tbWFuZCB0aW1lZG91dCIKKwkJCSJmcm9tICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CiAKQEAgLTQ1OTAsNiArNTA1MSwxMCBAQAogCWhvc3QgPSBpbnN0YW5jZS0+aG9zdDsKIAlpbnN0YW5jZS0+dW5sb2FkID0gMTsKIAorCS8qIFNodXRkb3duIFNSLUlPViBoZWFydGJlYXQgdGltZXIgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmICFpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsKQorCQlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lcik7CisKIAltZWdhc2FzX2ZsdXNoX2NhY2hlKGluc3RhbmNlKTsKIAltZWdhc2FzX3NodXRkb3duX2NvbnRyb2xsZXIoaW5zdGFuY2UsIE1SX0RDTURfSElCRVJOQVRFX1NIVVRET1dOKTsKIApAQCAtNDYwNiw5ICs1MDcxLDEyIEBACiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlKTsKIAogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQotCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLCBOVUxMKTsKIAkJCWZyZWVfaXJxKGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAogCQkJCSAmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKTsKKwkJfQogCWVsc2UKIAkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCkBAIC00NjI5LDcgKzUwOTcsNyBAQAogc3RhdGljIGludAogbWVnYXNhc19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JaW50IHJ2YWwsIGksIGo7CisJaW50IHJ2YWwsIGksIGosIGNwdTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKIApAQCAtNDY3Myw2ICs1MTQxLDcgQEAKIAogCXN3aXRjaCAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OOgorCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfUExBU01BOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUjoKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlk6CiAJewpAQCAtNDcwMSw2ICs1MTcwLDcgQEAKIAkgKiBSZWdpc3RlciBJUlEKIAkgKi8KIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykgeworCQljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CiAJCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CiAJCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0uaW5zdGFuY2UgPSBpbnN0YW5jZTsKIAkJCWluc3RhbmNlLT5pcnFfY29udGV4dFtpXS5NU0l4SW5kZXggPSBpOwpAQCAtNDcxMCwxMiArNTE4MCwyMSBAQAogCQkJCQkmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGYWlsZWQgdG8gIgogCQkJCSAgICAgICAicmVnaXN0ZXIgSVJRIGZvciB2ZWN0b3IgJWQuXG4iLCBpKTsKLQkJCQlmb3IgKGogPSAwIDsgaiA8IGkgOyBqKyspCisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2pdLnZlY3RvciwgTlVMTCk7CiAJCQkJCWZyZWVfaXJxKAogCQkJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtqXS52ZWN0b3IsCiAJCQkJCQkmaW5zdGFuY2UtPmlycV9jb250ZXh0W2pdKTsKKwkJCQl9CiAJCQkJZ290byBmYWlsX2lycTsKIAkJCX0KKworCQkJaWYgKGlycV9zZXRfYWZmaW5pdHlfaGludChpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQlnZXRfY3B1X21hc2soY3B1KSkpCisJCQkJZGV2X2VycigmaW5zdGFuY2UtPnBkZXYtPmRldiwgIkVycm9yIHNldHRpbmciCisJCQkJCSJhZmZpbml0eSBoaW50IGZvciBjcHUgJWRcbiIsIGNwdSk7CisJCQljcHUgPSBjcHVtYXNrX25leHQoY3B1LCBjcHVfb25saW5lX21hc2spOwogCQl9CiAJfSBlbHNlIHsKIAkJaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdLmluc3RhbmNlID0gaW5zdGFuY2U7CkBAIC00NzI4LDYgKzUyMDcsMTcgQEAKIAkJfQogCX0KIAorCS8qIFJlLWxhdW5jaCBTUi1JT1YgaGVhcnRiZWF0IHRpbWVyICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkgeworCQlpZiAoIW1lZ2FzYXNfc3Jpb3Zfc3RhcnRfaGVhcnRiZWF0KGluc3RhbmNlLCAwKSkKKwkJCW1lZ2FzYXNfc3RhcnRfdGltZXIoaW5zdGFuY2UsCisJCQkJCSAgICAmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lciwKKwkJCQkJICAgIG1lZ2FzYXNfc3Jpb3ZfaGVhcnRiZWF0X2hhbmRsZXIsCisJCQkJCSAgICBNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRik7CisJCWVsc2UKKwkJCWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwgPSAxOworCX0KKwogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlKTsKIAlpbnN0YW5jZS0+dW5sb2FkID0gMDsKIApAQCAtNDc4Miw2ICs1MjcyLDEwIEBACiAJaG9zdCA9IGluc3RhbmNlLT5ob3N0OwogCWZ1c2lvbiA9IGluc3RhbmNlLT5jdHJsX2NvbnRleHQ7CiAKKwkvKiBTaHV0ZG93biBTUi1JT1YgaGVhcnRiZWF0IHRpbWVyICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiAhaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCkKKwkJZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIpOworCiAJc2NzaV9yZW1vdmVfaG9zdChpbnN0YW5jZS0+aG9zdCk7CiAJbWVnYXNhc19mbHVzaF9jYWNoZShpbnN0YW5jZSk7CiAJbWVnYXNhc19zaHV0ZG93bl9jb250cm9sbGVyKGluc3RhbmNlLCBNUl9EQ01EX0NUUkxfU0hVVERPV04pOwpAQCAtNDc5Myw2ICs1Mjg3LDkgQEAKIAkJaW5zdGFuY2UtPmV2ID0gTlVMTDsKIAl9CiAKKwkvKiBjYW5jZWwgYWxsIHdhaXQgZXZlbnRzICovCisJd2FrZV91cF9hbGwoJmluc3RhbmNlLT5pbnRfY21kX3dhaXRfcSk7CisKIAl0YXNrbGV0X2tpbGwoJmluc3RhbmNlLT5pc3JfdGFza2xldCk7CiAKIAkvKgpAQCAtNDgxMSw5ICs1MzA4LDEyIEBACiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlKTsKIAogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQotCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLCBOVUxMKTsKIAkJCWZyZWVfaXJxKGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAogCQkJCSAmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKTsKKwkJfQogCWVsc2UKIAkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCkBAIC00ODIxLDYgKzUzMjEsNyBAQAogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVSWToKIAkJbWVnYXNhc19yZWxlYXNlX2Z1c2lvbihpbnN0YW5jZSk7CkBAIC00ODQ3LDYgKzUzNDgsMjQgQEAKIAlpZiAoaW5zdGFuY2UtPmV2dF9kZXRhaWwpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX2V2dF9kZXRhaWwpLAogCQkJCWluc3RhbmNlLT5ldnRfZGV0YWlsLCBpbnN0YW5jZS0+ZXZ0X2RldGFpbF9oKTsKKworCWlmIChpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24pCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiksCisJCQkJICAgIGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbiwKKwkJCQkgICAgaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uX2gpOworCisJaWYgKGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpLAorCQkJCSAgICBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExLAorCQkJCSAgICBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExX2gpOworCisJaWYgKGluc3RhbmNlLT5oYl9ob3N0X21lbSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0pLAorCQkJCSAgICBpbnN0YW5jZS0+aGJfaG9zdF9tZW0sCisJCQkJICAgIGluc3RhbmNlLT5oYl9ob3N0X21lbV9oKTsKKwogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CkBAIC00ODY4LDkgKzUzODcsMTIgQEAKIAltZWdhc2FzX3NodXRkb3duX2NvbnRyb2xsZXIoaW5zdGFuY2UsIE1SX0RDTURfQ1RSTF9TSFVURE9XTik7CiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlKTsKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKLQkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwgTlVMTCk7CiAJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKIAkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJCX0KIAllbHNlCiAJCWZyZWVfaXJxKGluc3RhbmNlLT5wZGV2LT5pcnEsICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0pOwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQpAQCAtNTA0NSw3ICs1NTY3LDcgQEAKIAkgKiBjbWQgdG8gdGhlIFNDU0kgbWlkLWxheWVyCiAJICovCiAJY21kLT5zeW5jX2NtZCA9IDE7Ci0JbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kKTsKKwltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQsIDApOwogCWNtZC0+c3luY19jbWQgPSAwOwogCiAJLyoKQEAgLTUxMzIsNiArNTY1NCwxNiBAQAogCQlnb3RvIG91dF9rZnJlZV9pb2M7CiAJfQogCisJLyogQWRqdXN0IGlvY3RsIHdhaXQgdGltZSBmb3IgVkYgbW9kZSAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpCisJCXdhaXRfdGltZSA9IE1FR0FTQVNfUk9VVElORV9XQUlUX1RJTUVfVkY7CisKKwkvKiBCbG9jayBpb2N0bHMgaW4gVkYgbW9kZSAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgIWFsbG93X3ZmX2lvY3RscykgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2tmcmVlX2lvYzsKKwl9CisKIAlpZiAoaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID09IE1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb250cm9sbGVyIGluIGNyaXQgZXJyb3JcbiIpOwogCQllcnJvciA9IC1FTk9ERVY7CkBAIC01NDQxLDcgKzU5NzMsNyBAQAogCXUxNiAgICAgcGRfaW5kZXggPSAwOwogCXUxNglsZF9pbmRleCA9IDA7CiAJaW50ICAgICBpLCBqLCBkb3NjYW4gPSAwOwotCXUzMiBzZXFfbnVtOworCXUzMiBzZXFfbnVtLCB3YWl0X3RpbWUgPSBNRUdBU0FTX1JFU0VUX1dBSVRfVElNRTsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoIWluc3RhbmNlKSB7CkBAIC01NDQ5LDYgKzU5ODEsMjMgQEAKIAkJa2ZyZWUoZXYpOwogCQlyZXR1cm47CiAJfQorCisJLyogQWRqdXN0IGV2ZW50IHdvcmtxdWV1ZSB0aHJlYWQgd2FpdCB0aW1lIGZvciBWRiBtb2RlICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkKKwkJd2FpdF90aW1lID0gTUVHQVNBU19ST1VUSU5FX1dBSVRfVElNRV9WRjsKKworCS8qIERvbid0IHJ1biB0aGUgZXZlbnQgd29ya3F1ZXVlIHRocmVhZCBpZiBPQ1IgaXMgcnVubmluZyAqLworCWZvciAoaSA9IDA7IGkgPCB3YWl0X3RpbWU7IGkrKykgeworCQlpZiAoaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID09IE1FR0FTQVNfSEJBX09QRVJBVElPTkFMKQorCQkJYnJlYWs7CisJCWlmICghKGkgJSBNRUdBU0FTX1JFU0VUX05PVElDRV9JTlRFUlZBTCkpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAibWVnYXNhczogJXMgd2FpdGluZyBmb3IgIgorCQkJICAgICAgICJjb250cm9sbGVyIHJlc2V0IHRvIGZpbmlzaCBmb3Igc2NzaSVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCX0KKwkJbXNsZWVwKDEwMDApOworCX0KKwogCWluc3RhbmNlLT5ldiA9IE5VTEw7CiAJaG9zdCA9IGluc3RhbmNlLT5ob3N0OwogCWlmIChpbnN0YW5jZS0+ZXZ0X2RldGFpbCkgewpAQCAtNTUxNSw2NSArNjA2NCw2NCBAQAogCQljYXNlIE1SX0VWVF9MRF9PRkZMSU5FOgogCQljYXNlIE1SX0VWVF9DRkdfQ0xFQVJFRDoKIAkJY2FzZSBNUl9FVlRfTERfREVMRVRFRDoKLQkJCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCi0JCQkJCU1SX0xEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUKSkKLQkJCQltZWdhc2FzX2dldF9sZF9saXN0KGluc3RhbmNlKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9MRF9DSEFOTkVMUzsgaSsrKSB7Ci0JCQkJZm9yIChqID0gMDsKLQkJCQlqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOwotCQkJCWorKykgeworCQkJaWYgKCFpbnN0YW5jZS0+cmVxdWVzdG9ySWQgfHwKKwkJCSAgICAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmCisJCQkgICAgIG1lZ2FzYXNfZ2V0X2xkX3ZmX2FmZmlsaWF0aW9uKGluc3RhbmNlLCAwKSkpIHsKKwkJCQlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLAorCQkJCQkJCSAgTVJfTERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1QpKQorCQkJCQltZWdhc2FzX2dldF9sZF9saXN0KGluc3RhbmNlKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfTERfQ0hBTk5FTFM7IGkrKykgeworCQkJCQlmb3IgKGogPSAwOworCQkJCQkgICAgIGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7CisJCQkJCSAgICAgaisrKSB7CiAKLQkJCQlsZF9pbmRleCA9Ci0JCQkJKGkgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsgajsKKwkJCQkJCWxkX2luZGV4ID0KKwkJCQkJCQkoaSAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKyBqOwogCi0JCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwKLQkJCQkJTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLAotCQkJCQlqLAotCQkJCQkwKTsKKwkJCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsIE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwgaiwgMCk7CiAKLQkJCQlpZiAoaW5zdGFuY2UtPmxkX2lkc1tsZF9pbmRleF0gIT0gMHhmZikgewotCQkJCQlpZiAoc2RldjEpIHsKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoc2RldjEpIHsKLQkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7Ci0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRvc2NhbiA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBNUl9FVlRfTERfQ1JFQVRFRDoKLQkJCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCi0JCQkJCU1SX0xEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUKSkKLQkJCQltZWdhc2FzX2dldF9sZF9saXN0KGluc3RhbmNlKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9MRF9DSEFOTkVMUzsgaSsrKSB7Ci0JCQkJZm9yIChqID0gMDsKLQkJCQkJaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsKLQkJCQkJaisrKSB7Ci0JCQkJCWxkX2luZGV4ID0KLQkJCQkJKGkgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsgajsKLQotCQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LAotCQkJCQkJTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLAotCQkJCQkJaiwgMCk7Ci0KLQkJCQkJaWYgKGluc3RhbmNlLT5sZF9pZHNbbGRfaW5kZXhdICE9Ci0JCQkJCQkJCTB4ZmYpIHsKLQkJCQkJCWlmICghc2RldjEpIHsKLQkJCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwKLQkJCQkJCU1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwKLQkJCQkJCQkJaiwgMCk7CisJCQkJCQlpZiAoaW5zdGFuY2UtPmxkX2lkc1tsZF9pbmRleF0KKwkJCQkJCSAgICAhPSAweGZmKSB7CisJCQkJCQkJaWYgKHNkZXYxKQorCQkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoc2RldjEpIHsKKwkJCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYxKTsKKwkJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJaWYgKHNkZXYxKSB7Ci0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCX0KKwkJCQlkb3NjYW4gPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTVJfRVZUX0xEX0NSRUFURUQ6CisJCQlpZiAoIWluc3RhbmNlLT5yZXF1ZXN0b3JJZCB8fAorCQkJICAgIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYKKwkJCSAgICAgbWVnYXNhc19nZXRfbGRfdmZfYWZmaWxpYXRpb24oaW5zdGFuY2UsIDApKSkgeworCQkJCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCisJCQkJCQkJICBNUl9MRF9RVUVSWV9UWVBFX0VYUE9TRURfVE9fSE9TVCkpCisJCQkJCW1lZ2FzYXNfZ2V0X2xkX2xpc3QoaW5zdGFuY2UpOworCQkJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9MRF9DSEFOTkVMUzsgaSsrKSB7CisJCQkJCWZvciAoaiA9IDA7CisJCQkJCSAgICAgaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsKKwkJCQkJICAgICBqKyspIHsKKwkJCQkJCWxkX2luZGV4ID0KKwkJCQkJCQkoaSAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKyBqOworCisJCQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksIGosIDApOworCisJCQkJCQlpZiAoaW5zdGFuY2UtPmxkX2lkc1tsZF9pbmRleF0KKwkJCQkJCSAgICAhPSAweGZmKSB7CisJCQkJCQkJaWYgKCFzZGV2MSkKKwkJCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGhvc3QsIE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwgaiwgMCk7CisJCQkJCQl9CisJCQkJCQlpZiAoc2RldjEpCisJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKIAkJCQkJfQogCQkJCX0KKwkJCQlkb3NjYW4gPSAwOwogCQkJfQotCQkJZG9zY2FuID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIE1SX0VWVF9DVFJMX0hPU1RfQlVTX1NDQU5fUkVRVUVTVEVEOgogCQljYXNlIE1SX0VWVF9GT1JFSUdOX0NGR19JTVBPUlRFRDoKQEAgLTU1OTEsNTAgKzYxMzksNTUgQEAKIAl9CiAKIAlpZiAoZG9zY2FuKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInNjYW5uaW5nIC4uLlxuIik7Ci0JCW1lZ2FzYXNfZ2V0X3BkX2xpc3QoaW5zdGFuY2UpOwotCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFM7IGkrKykgewotCQkJZm9yIChqID0gMDsgaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsgaisrKSB7Ci0JCQkJcGRfaW5kZXggPSBpKk1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCArIGo7Ci0JCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwgaSwgaiwgMCk7Ci0JCQkJaWYgKGluc3RhbmNlLT5wZF9saXN0W3BkX2luZGV4XS5kcml2ZVN0YXRlID09Ci0JCQkJCQkJTVJfUERfU1RBVEVfU1lTVEVNKSB7Ci0JCQkJCWlmICghc2RldjEpIHsKLQkJCQkJCXNjc2lfYWRkX2RldmljZShob3N0LCBpLCBqLCAwKTsKLQkJCQkJfQotCQkJCQlpZiAoc2RldjEpCi0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChzZGV2MSkgewotCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYxKTsKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCXByaW50ayhLRVJOX0lORk8gIm1lZ2FyYWlkX3Nhczogc2Nhbm5pbmcgZm9yIHNjc2klZC4uLlxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJaWYgKG1lZ2FzYXNfZ2V0X3BkX2xpc3QoaW5zdGFuY2UpID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUzsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsgaisrKSB7CisJCQkJCXBkX2luZGV4ID0gaSpNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwgKyBqOworCQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LCBpLCBqLCAwKTsKKwkJCQkJaWYgKGluc3RhbmNlLT5wZF9saXN0W3BkX2luZGV4XS5kcml2ZVN0YXRlID09CisJCQkJCSAgICBNUl9QRF9TVEFURV9TWVNURU0pIHsKKwkJCQkJCWlmICghc2RldjEpIHsKKwkJCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwgaSwgaiwgMCk7CisJCQkJCQl9CisJCQkJCQlpZiAoc2RldjEpCisJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChzZGV2MSkgeworCQkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7CisJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQogCi0JCWlmIChtZWdhc2FzX2xkX2xpc3RfcXVlcnkoaW5zdGFuY2UsCi0JCQkJCSAgTVJfTERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1QpKQotCQkJbWVnYXNhc19nZXRfbGRfbGlzdChpbnN0YW5jZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX01BWF9MRF9DSEFOTkVMUzsgaSsrKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOyBqKyspIHsKLQkJCQlsZF9pbmRleCA9Ci0JCQkJKGkgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsgajsKKwkJaWYgKCFpbnN0YW5jZS0+cmVxdWVzdG9ySWQgfHwKKwkJICAgIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYKKwkJICAgICBtZWdhc2FzX2dldF9sZF92Zl9hZmZpbGlhdGlvbihpbnN0YW5jZSwgMCkpKSB7CisJCQlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLAorCQkJCQkJICBNUl9MRF9RVUVSWV9UWVBFX0VYUE9TRURfVE9fSE9TVCkpCisJCQkJbWVnYXNhc19nZXRfbGRfbGlzdChpbnN0YW5jZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfTERfQ0hBTk5FTFM7IGkrKykgeworCQkJCWZvciAoaiA9IDA7IGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7CisJCQkJICAgICBqKyspIHsKKwkJCQkJbGRfaW5kZXggPQorCQkJCQkJKGkgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsgajsKIAotCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsCi0JCQkJCU1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwgaiwgMCk7Ci0JCQkJaWYgKGluc3RhbmNlLT5sZF9pZHNbbGRfaW5kZXhdICE9IDB4ZmYpIHsKLQkJCQkJaWYgKCFzZGV2MSkgewotCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGhvc3QsCi0JCQkJCQlNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksCi0JCQkJCQkJCWosIDApOworCQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LAorCQkJCQkJCQkgICBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksIGosIDApOworCQkJCQlpZiAoaW5zdGFuY2UtPmxkX2lkc1tsZF9pbmRleF0KKwkJCQkJICAgICE9IDB4ZmYpIHsKKwkJCQkJCWlmICghc2RldjEpCisJCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGhvc3QsIE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwgaiwgMCk7CisJCQkJCQllbHNlCisJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoc2RldjEpIHsKLQkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7Ci0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQkJaWYgKHNkZXYxKSB7CisJCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYxKTsKKwkJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCmluZGV4IGUyNGI2ZWIuLjA4MWJmZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKQEAgLTE0MywxMiArMTQzLDEyIEBACiAKIHUxNiBNUl9HZXRMRFRndElkKHUzMiBsZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKQogewotCXJldHVybiBtYXAtPnJhaWRNYXAubGRTcGFuTWFwW2xkXS5sZFJhaWQudGFyZ2V0SWQ7CisJcmV0dXJuIGxlMTZfdG9fY3B1KG1hcC0+cmFpZE1hcC5sZFNwYW5NYXBbbGRdLmxkUmFpZC50YXJnZXRJZCk7CiB9CiAKLXUxNiBNUl9UYXJnZXRJZFRvTGRHZXQodTMyIGxkVGd0SWQsIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCkKK3U4IE1SX1RhcmdldElkVG9MZEdldCh1MzIgbGRUZ3RJZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKQogewotCXJldHVybiBsZTE2X3RvX2NwdShtYXAtPnJhaWRNYXAubGRUZ3RJZFRvTGRbbGRUZ3RJZF0pOworCXJldHVybiBtYXAtPnJhaWRNYXAubGRUZ3RJZFRvTGRbbGRUZ3RJZF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgTVJfTERfU1BBTiAqTVJfTGRTcGFuUHRyR2V0KHUzMiBsZCwgdTMyIHNwYW4sCkBAIC05NzUsNyArOTc1LDEwIEBACiAJCQlyZWdTaXplICs9IHN0cmlwU2l6ZTsKIAl9CiAKLQlwUkFJRF9Db250ZXh0LT50aW1lb3V0VmFsdWUgICAgID0gY3B1X3RvX2xlMTYobWFwLT5yYWlkTWFwLmZwUGRJb1RpbWVvdXRTZWMpOworCXBSQUlEX0NvbnRleHQtPnRpbWVvdXRWYWx1ZSA9CisJCWNwdV90b19sZTE2KHJhaWQtPmZwSW9UaW1lb3V0Rm9yTGQgPworCQkJICAgIHJhaWQtPmZwSW9UaW1lb3V0Rm9yTGQgOgorCQkJICAgIG1hcC0+cmFpZE1hcC5mcFBkSW9UaW1lb3V0U2VjKTsKIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpCiAJCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tGbGFncyA9IChpc1JlYWQpID8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCmluZGV4IGY2NTU1OTIuLjIyNjAwNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYwpAQCAtNjIsNyArNjIsOCBAQAogCQkgICAgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLCB1OCBhbHRfc3RhdHVzKTsKIGludCBtZWdhc2FzX2lzX2xkaW8oc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIGludAotd2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKTsKK3dhaXRfYW5kX3BvbGwoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCwKKwkgICAgICBpbnQgc2Vjb25kcyk7CiAKIHZvaWQKIG1lZ2FzYXNfcmV0dXJuX2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKTsKQEAgLTgxLDYgKzgyLDEzIEBACiB2b2lkIG1lZ2FyYWlkX3Nhc19raWxsX2hiYShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwogCiBleHRlcm4gdTMyIG1lZ2FzYXNfZGJnX2x2bDsKK3ZvaWQgbWVnYXNhc19zcmlvdl9oZWFydGJlYXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGluc3RhbmNlX2FkZHIpOworaW50IG1lZ2FzYXNfc3Jpb3Zfc3RhcnRfaGVhcnRiZWF0KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCQkgIGludCBpbml0aWFsKTsKK3ZvaWQgbWVnYXNhc19zdGFydF90aW1lcihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsCisJCQkgdm9pZCAqZm4sIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpOworZXh0ZXJuIHN0cnVjdCBtZWdhc2FzX21nbXRfaW5mbyBtZWdhc2FzX21nbXRfaW5mbzsKIGV4dGVybiBpbnQgcmVzZXR3YWl0dGltZTsKIAogLyoqCkBAIC01NDksMTIgKzU1NywxMyBAQAogICogRm9yIHBvbGxpbmcsIE1GSSByZXF1aXJlcyB0aGUgY21kX3N0YXR1cyB0byBiZSBzZXQgdG8gMHhGRiBiZWZvcmUgcG9zdGluZy4KICAqLwogaW50Ci13YWl0X2FuZF9wb2xsKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCit3YWl0X2FuZF9wb2xsKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQsCisJaW50IHNlY29uZHMpCiB7CiAJaW50IGk7CiAJc3RydWN0IG1lZ2FzYXNfaGVhZGVyICpmcmFtZV9oZHIgPSAmY21kLT5mcmFtZS0+aGRyOwogCi0JdTMyIG1zZWNzID0gTUZJX1BPTExfVElNRU9VVF9TRUNTICogMTAwMDsKKwl1MzIgbXNlY3MgPSBzZWNvbmRzICogMTAwMDsKIAogCS8qCiAJICogV2FpdCBmb3IgY21kX3N0YXR1cyB0byBjaGFuZ2UKQEAgLTU4NSw3ICs1OTQsNyBAQAogCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kOwogCXU4IHJldDsKIAlzdHJ1Y3QgZnVzaW9uX2NvbnRleHQgKmZ1c2lvbjsKLQl1bmlvbiBNRUdBU0FTX1JFUVVFU1RfREVTQ1JJUFRPUl9VTklPTiAqcmVxX2Rlc2M7CisJdW5pb24gTUVHQVNBU19SRVFVRVNUX0RFU0NSSVBUT1JfVU5JT04gcmVxX2Rlc2M7CiAJaW50IGk7CiAJc3RydWN0IG1lZ2FzYXNfaGVhZGVyICpmcmFtZV9oZHI7CiAKQEAgLTY0NCwxOCArNjUzLDE4IEBACiAJLyogQ29udmVydCBjYXBhYmlsaXR5IHRvIExFMzIgKi8KIAljcHVfdG9fbGUzMnMoKHUzMiAqKSZpbml0X2ZyYW1lLT5kcml2ZXJfb3BlcmF0aW9ucy5tZmlfY2FwYWJpbGl0aWVzKTsKIAotCWluaXRfZnJhbWUtPnF1ZXVlX2luZm9fbmV3X3BoeXNfYWRkcl9sbyA9IGNwdV90b19sZTMyKCh1MzIpaW9jX2luaXRfaGFuZGxlKTsKKwlpbml0X2ZyYW1lLT5xdWV1ZV9pbmZvX25ld19waHlzX2FkZHJfaGkgPQorCQljcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGlvY19pbml0X2hhbmRsZSkpOworCWluaXRfZnJhbWUtPnF1ZXVlX2luZm9fbmV3X3BoeXNfYWRkcl9sbyA9CisJCWNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoaW9jX2luaXRfaGFuZGxlKSk7CiAJaW5pdF9mcmFtZS0+ZGF0YV94ZmVyX2xlbiA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgTVBJMl9JT0NfSU5JVF9SRVFVRVNUKSk7CiAKLQlyZXFfZGVzYyA9Ci0JICAodW5pb24gTUVHQVNBU19SRVFVRVNUX0RFU0NSSVBUT1JfVU5JT04gKilmdXNpb24tPnJlcV9mcmFtZXNfZGVzYzsKLQotCXJlcV9kZXNjLT5Xb3JkcyA9IDA7Ci0JcmVxX2Rlc2MtPk1GQUlvLlJlcXVlc3RGbGFncyA9CisJcmVxX2Rlc2MuV29yZHMgPSAwOworCXJlcV9kZXNjLk1GQUlvLlJlcXVlc3RGbGFncyA9CiAJCShNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19NRkEgPDwKIAkJIE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX1RZUEVfU0hJRlQpOwotCWNwdV90b19sZTMycygodTMyICopJnJlcV9kZXNjLT5NRkFJbyk7Ci0JcmVxX2Rlc2MtPldvcmRzIHw9IGNwdV90b19sZTY0KGNtZC0+ZnJhbWVfcGh5c19hZGRyKTsKKwljcHVfdG9fbGUzMnMoKHUzMiAqKSZyZXFfZGVzYy5NRkFJbyk7CisJcmVxX2Rlc2MuV29yZHMgfD0gY3B1X3RvX2xlNjQoY21kLT5mcmFtZV9waHlzX2FkZHIpOwogCiAJLyoKIAkgKiBkaXNhYmxlIHRoZSBpbnRyIGJlZm9yZSBmaXJpbmcgdGhlIGluaXQgZnJhbWUKQEAgLTY2OSwxMCArNjc4LDEwIEBACiAJCQlicmVhazsKIAl9CiAKLQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChpbnN0YW5jZSwgcmVxX2Rlc2MtPnUubG93LAotCQkJCSAgICAgIHJlcV9kZXNjLT51LmhpZ2gsIGluc3RhbmNlLT5yZWdfc2V0KTsKKwlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChpbnN0YW5jZSwgcmVxX2Rlc2MudS5sb3csCisJCQkJICAgICAgcmVxX2Rlc2MudS5oaWdoLCBpbnN0YW5jZS0+cmVnX3NldCk7CiAKLQl3YWl0X2FuZF9wb2xsKGluc3RhbmNlLCBjbWQpOworCXdhaXRfYW5kX3BvbGwoaW5zdGFuY2UsIGNtZCwgTUZJX1BPTExfVElNRU9VVF9TRUNTKTsKIAogCWZyYW1lX2hkciA9ICZjbWQtPmZyYW1lLT5oZHI7CiAJaWYgKGZyYW1lX2hkci0+Y21kX3N0YXR1cyAhPSAwKSB7CkBAIC03MjMsNyArNzMyLDcgQEAKIAogCWlmICghZnVzaW9uKSB7CiAJCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRU5YSU87CiAJfQogCiAJZGNtZCA9ICZjbWQtPmZyYW1lLT5kY21kOwpAQCAtMTYwNCwxMyArMTYxMywxNSBAQAogCQkJTVJfUkFJRF9DVFhfUkFJRF9GTEFHU19JT19TVUJfVFlQRV9TSElGVDsKIAkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkKLQkJCWlvX3JlcXVlc3QtPklvRmxhZ3MgfD0KLQkJCQlNUEkyNV9TQVNfREVWSUNFMF9GTEFHU19FTkFCTEVEX0ZBU1RfUEFUSDsKKwkJCWlvX3JlcXVlc3QtPklvRmxhZ3MgfD0gY3B1X3RvX2xlMTYoCisJCQkJTVBJMjVfU0FTX0RFVklDRTBfRkxBR1NfRU5BQkxFRF9GQVNUX1BBVEgpOwogCQljbWQtPnJlcXVlc3RfZGVzYy0+U0NTSUlPLlJlcXVlc3RGbGFncyA9CiAJCQkoTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfSElHSF9QUklPUklUWSA8PAogCQkJIE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX1RZUEVfU0hJRlQpOwogCQljbWQtPnJlcXVlc3RfZGVzYy0+U0NTSUlPLkRldkhhbmRsZSA9CiAJCQlsb2NhbF9tYXBfcHRyLT5yYWlkTWFwLmRldkhuZGxJbmZvW2RldmljZV9pZF0uY3VyRGV2SGRsOworCQljbWQtPnJlcXVlc3RfZGVzYy0+U0NTSUlPLk1TSXhJbmRleCA9CisJCQlpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID8gc21wX3Byb2Nlc3Nvcl9pZCgpICUgaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA6IDA7CiAJCS8qCiAJCSAqIElmIHRoZSBjb21tYW5kIGlzIGZvciB0aGUgdGFwZSBkZXZpY2UsIHNldCB0aGUKIAkJICogRlAgdGltZW91dCB0byB0aGUgb3MgbGF5ZXIgdGltZW91dCB2YWx1ZS4KQEAgLTE3NzAsNyArMTc4MSw4IEBACiAKIAlpZiAoaW5kZXggPj0gaW5zdGFuY2UtPm1heF9md19jbWRzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWVnYXNhczogSW52YWxpZCBTTUlEICgweCV4KXJlcXVlc3QgZm9yICIKLQkJICAgICAgICJkZXNjcmlwdG9yXG4iLCBpbmRleCk7CisJCSAgICAgICAiZGVzY3JpcHRvciBmb3Igc2NzaSVkXG4iLCBpbmRleCwKKwkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZ1c2lvbiA9IGluc3RhbmNlLT5jdHJsX2NvbnRleHQ7CkBAIC0yMDM4LDggKzIwNTAsMTEgQEAKIAkJLyogSWYgd2UgZGlkbid0IGNvbXBsZXRlIGFueSBjb21tYW5kcywgY2hlY2sgZm9yIEZXIGZhdWx0ICovCiAJCWZ3X3N0YXRlID0gaW5zdGFuY2UtPmluc3RhbmNldC0+cmVhZF9md19zdGF0dXNfcmVnKAogCQkJaW5zdGFuY2UtPnJlZ19zZXQpICYgTUZJX1NUQVRFX01BU0s7Ci0JCWlmIChmd19zdGF0ZSA9PSBNRklfU1RBVEVfRkFVTFQpCisJCWlmIChmd19zdGF0ZSA9PSBNRklfU1RBVEVfRkFVTFQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogSW9wMlN5c0Rvb3JiZWxsSW50IgorCQkJICAgICAgICJmb3Igc2NzaSVkXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQlzY2hlZHVsZV93b3JrKCZpbnN0YW5jZS0+d29ya19pbml0KTsKKwkJfQogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTIyMTAsOSArMjIyNSwxMCBAQAogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBvdXRzdGFuZGluZyBjb21tYW5kcyBvbiBmdXNpb24gdG8gY29tcGxldGUgKi8KLWludCBtZWdhc2FzX3dhaXRfZm9yX291dHN0YW5kaW5nX2Z1c2lvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpCitpbnQgbWVnYXNhc193YWl0X2Zvcl9vdXRzdGFuZGluZ19mdXNpb24oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJCQlpbnQgaW90aW1lb3V0LCBpbnQgKmNvbnZlcnQpCiB7Ci0JaW50IGksIG91dHN0YW5kaW5nLCByZXR2YWwgPSAwOworCWludCBpLCBvdXRzdGFuZGluZywgcmV0dmFsID0gMCwgaGJfc2Vjb25kc19taXNzZWQgPSAwOwogCXUzMiBmd19zdGF0ZTsKIAogCWZvciAoaSA9IDA7IGkgPCByZXNldHdhaXR0aW1lOyBpKyspIHsKQEAgLTIyMjEsMTAgKzIyMzcsNDAgQEAKIAkJCWluc3RhbmNlLT5yZWdfc2V0KSAmIE1GSV9TVEFURV9NQVNLOwogCQlpZiAoZndfc3RhdGUgPT0gTUZJX1NUQVRFX0ZBVUxUKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBGb3VuZCBGVyBpbiBGQVVMVCBzdGF0ZSwiCi0JCQkgICAgICAgIiB3aWxsIHJlc2V0IGFkYXB0ZXIuXG4iKTsKKwkJCSAgICAgICAiIHdpbGwgcmVzZXQgYWRhcHRlciBzY3NpJWQuXG4iLAorCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCXJldHZhbCA9IDE7CiAJCQlnb3RvIG91dDsKIAkJfQorCQkvKiBJZiBTUi1JT1YgVkYgbW9kZSAmIGhlYXJ0YmVhdCB0aW1lb3V0LCBkb24ndCB3YWl0ICovCisJCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgIWlvdGltZW91dCkgeworCQkJcmV0dmFsID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogSWYgU1ItSU9WIFZGIG1vZGUgJiBJL08gdGltZW91dCwgY2hlY2sgZm9yIEhCIHRpbWVvdXQgKi8KKwkJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiBpb3RpbWVvdXQpIHsKKwkJCWlmIChpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmZ3Q291bnRlciAhPQorCQkJICAgIGluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZHJpdmVyQ291bnRlcikgeworCQkJCWluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZHJpdmVyQ291bnRlciA9CisJCQkJCWluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZndDb3VudGVyOworCQkJCWhiX3NlY29uZHNfbWlzc2VkID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaGJfc2Vjb25kc19taXNzZWQrKzsKKwkJCQlpZiAoaGJfc2Vjb25kc19taXNzZWQgPT0KKwkJCQkgICAgKE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGL0haKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IgorCQkJCQkgICAgICAgIiBIZWFydGJlYXQgbmV2ZXIgY29tcGxldGVkICIKKwkJCQkJICAgICAgICIgd2hpbGUgcG9sbGluZyBkdXJpbmcgSS9PICIKKwkJCQkJICAgICAgICIgdGltZW91dCBoYW5kbGluZyBmb3IgIgorCQkJCQkgICAgICAgInNjc2klZC5cbiIsCisJCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCSAgICAgICAqY29udmVydCA9IDE7CisJCQkJCSAgICAgICByZXR2YWwgPSAxOworCQkJCQkgICAgICAgZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CiAKIAkJb3V0c3RhbmRpbmcgPSBhdG9taWNfcmVhZCgmaW5zdGFuY2UtPmZ3X291dHN0YW5kaW5nKTsKIAkJaWYgKCFvdXRzdGFuZGluZykKQEAgLTIyMzIsNyArMjI3OCw4IEBACiAKIAkJaWYgKCEoaSAlIE1FR0FTQVNfUkVTRVRfTk9USUNFX0lOVEVSVkFMKSkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJtZWdhc2FzOiBbJTJkXXdhaXRpbmcgZm9yICVkICIKLQkJCSAgICAgICAiY29tbWFuZHMgdG8gY29tcGxldGVcbiIsIGksIG91dHN0YW5kaW5nKTsKKwkJCSAgICAgICAiY29tbWFuZHMgdG8gY29tcGxldGUgZm9yIHNjc2klZFxuIiwgaSwKKwkJCSAgICAgICBvdXRzdGFuZGluZywgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJbWVnYXNhc19jb21wbGV0ZV9jbWRfZHBjX2Z1c2lvbigKIAkJCQkodW5zaWduZWQgbG9uZylpbnN0YW5jZSk7CiAJCX0KQEAgLTIyNDEsNyArMjI4OCw4IEBACiAKIAlpZiAoYXRvbWljX3JlYWQoJmluc3RhbmNlLT5md19vdXRzdGFuZGluZykpIHsKIAkJcHJpbnRrKCJtZWdhcmFpZF9zYXM6IHBlbmRpbmcgY29tbWFuZHMgcmVtYWluIGFmdGVyIHdhaXRpbmcsICIKLQkJICAgICAgICJ3aWxsIHJlc2V0IGFkYXB0ZXIuXG4iKTsKKwkJICAgICAgICJ3aWxsIHJlc2V0IGFkYXB0ZXIgc2NzaSVkLlxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJcmV0dmFsID0gMTsKIAl9CiBvdXQ6CkBAIC0yMjYzLDEwICsyMzExLDM0IEBACiAJCXJlcGx5X2Rlc2MtPldvcmRzID0gVUxMT05HX01BWDsKIH0KIAotLyogQ29yZSBmdXNpb24gcmVzZXQgZnVuY3Rpb24gKi8KLWludCBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKKy8qIENoZWNrIGZvciBhIHNlY29uZCBwYXRoIHRoYXQgaXMgY3VycmVudGx5IFVQICovCitpbnQgbWVnYXNhc19jaGVja19tcGlvX3BhdGhzKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewotCWludCByZXR2YWwgPSBTVUNDRVNTLCBpLCBqLCByZXRyeSA9IDA7CisJaW50IGksIGosIHJldHZhbCA9IChESURfUkVTRVQgPDwgMTYpOworCisJaWYgKGluc3RhbmNlLT5tcGlvICYmIGluc3RhbmNlLT5yZXF1ZXN0b3JJZCkgeworCQlmb3IgKGkgPSAwIDsgaSA8IE1BWF9NR01UX0FEQVBURVJTIDsgaSsrKQorCQkJZm9yIChqID0gMCA7IGogPCBNQVhfTE9HSUNBTF9EUklWRVM7IGorKykKKwkJCQlpZiAobWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0gJiYKKwkJCQkgICAgKG1lZ2FzYXNfbWdtdF9pbmZvLmluc3RhbmNlW2ldICE9IGluc3RhbmNlKSAmJgorCQkJCSAgICBtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXS0+bXBpbyAmJgorCQkJCSAgICBtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXS0+cmVxdWVzdG9ySWQKKwkJCQkgICAgJiYKKwkJCQkgICAgKG1lZ2FzYXNfbWdtdF9pbmZvLmluc3RhbmNlW2ldLT5sZF9pZHNbal0KKwkJCQkgICAgID09IHNjbWQtPmRldmljZS0+aWQpKSB7CisJCQkJCSAgICByZXR2YWwgPSAoRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCQkJCQkgICAgZ290byBvdXQ7CisJCQkJfQorCX0KK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBDb3JlIGZ1c2lvbiByZXNldCBmdW5jdGlvbiAqLworaW50IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgaW90aW1lb3V0KQoreworCWludCByZXR2YWwgPSBTVUNDRVNTLCBpLCBqLCByZXRyeSA9IDAsIGNvbnZlcnQgPSAwOwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKIAlzdHJ1Y3QgbWVnYXNhc19jbWRfZnVzaW9uICpjbWRfZnVzaW9uOwogCXN0cnVjdCBmdXNpb25fY29udGV4dCAqZnVzaW9uOwpAQCAtMjI3NywyOCArMjM0OSwzOSBAQAogCWluc3RhbmNlID0gKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICopc2hvc3QtPmhvc3RkYXRhOwogCWZ1c2lvbiA9IGluc3RhbmNlLT5jdHJsX2NvbnRleHQ7CiAKKwltdXRleF9sb2NrKCZpbnN0YW5jZS0+cmVzZXRfbXV0ZXgpOworCiAJaWYgKGluc3RhbmNlLT5hZHByZWNvdmVyeSA9PSBNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogSGFyZHdhcmUgY3JpdGljYWwgZXJyb3IsICIKLQkJICAgICAgICJyZXR1cm5pbmcgRkFJTEVELlxuIik7CisJCSAgICAgICAicmV0dXJuaW5nIEZBSUxFRCBmb3Igc2NzaSVkLlxuIiwKKwkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKLQltdXRleF9sb2NrKCZpbnN0YW5jZS0+cmVzZXRfbXV0ZXgpOworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgIWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwpCisJCWRlbF90aW1lcl9zeW5jKCZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyKTsKIAlzZXRfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULCAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKTsKLQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0FEUFJFU0VUX1NNX0lORkFVTFQ7CisJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19BRFBSRVNFVF9TTV9QT0xMSU5HOwogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZSk7CiAJbXNsZWVwKDEwMDApOwogCiAJLyogRmlyc3QgdHJ5IHdhaXRpbmcgZm9yIGNvbW1hbmRzIHRvIGNvbXBsZXRlICovCi0JaWYgKG1lZ2FzYXNfd2FpdF9mb3Jfb3V0c3RhbmRpbmdfZnVzaW9uKGluc3RhbmNlKSkgeworCWlmIChtZWdhc2FzX3dhaXRfZm9yX291dHN0YW5kaW5nX2Z1c2lvbihpbnN0YW5jZSwgaW90aW1lb3V0LAorCQkJCQkJJmNvbnZlcnQpKSB7CisJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfQURQUkVTRVRfU01fSU5GQVVMVDsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiByZXNldHRpbmcgZnVzaW9uICIKLQkJICAgICAgICJhZGFwdGVyLlxuIik7CisJCSAgICAgICAiYWRhcHRlciBzY3NpJWQuXG4iLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCWlmIChjb252ZXJ0KQorCQkJaW90aW1lb3V0ID0gMDsKKwogCQkvKiBOb3cgcmV0dXJuIGNvbW1hbmRzIGJhY2sgdG8gdGhlIE9TICovCiAJCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1heF9md19jbWRzOyBpKyspIHsKIAkJCWNtZF9mdXNpb24gPSBmdXNpb24tPmNtZF9saXN0W2ldOwogCQkJaWYgKGNtZF9mdXNpb24tPnNjbWQpIHsKIAkJCQlzY3NpX2RtYV91bm1hcChjbWRfZnVzaW9uLT5zY21kKTsKLQkJCQljbWRfZnVzaW9uLT5zY21kLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJCQljbWRfZnVzaW9uLT5zY21kLT5yZXN1bHQgPQorCQkJCQltZWdhc2FzX2NoZWNrX21waW9fcGF0aHMoaW5zdGFuY2UsCisJCQkJCQkJCSBjbWRfZnVzaW9uLT5zY21kKTsKIAkJCQljbWRfZnVzaW9uLT5zY21kLT5zY3NpX2RvbmUoY21kX2Z1c2lvbi0+c2NtZCk7CiAJCQkJbWVnYXNhc19yZXR1cm5fY21kX2Z1c2lvbihpbnN0YW5jZSwgY21kX2Z1c2lvbik7CiAJCQkJYXRvbWljX2RlYygmaW5zdGFuY2UtPmZ3X291dHN0YW5kaW5nKTsKQEAgLTIzMTMsMTMgKzIzOTYsNjcgQEAKIAkJICAgIChhYnNfc3RhdGUgPT0gTUZJX1NUQVRFX0ZBVUxUICYmICFyZXNldF9hZGFwdGVyKSkgewogCQkJLyogUmVzZXQgbm90IHN1cHBvcnRlZCwga2lsbCBhZGFwdGVyICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IFJlc2V0IG5vdCBzdXBwb3J0ZWQiCi0JCQkgICAgICAgIiwga2lsbGluZyBhZGFwdGVyLlxuIik7CisJCQkgICAgICAgIiwga2lsbGluZyBhZGFwdGVyIHNjc2klZC5cbiIsCisJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJbWVnYXJhaWRfc2FzX2tpbGxfaGJhKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwgPSAxOwogCQkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUjsKIAkJCXJldHZhbCA9IEZBSUxFRDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJLyogTGV0IFNSLUlPViBWRiAmIFBGIHN5bmMgdXAgaWYgdGhlcmUgd2FzIGEgSEIgZmFpbHVyZSAqLworCQlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmICFpb3RpbWVvdXQpIHsKKwkJCW1zbGVlcChNRUdBU0FTX09DUl9TRVRUTEVfVElNRV9WRik7CisJCQkvKiBMb29rIGZvciBhIGxhdGUgSEIgdXBkYXRlIGFmdGVyIFZGIHNldHRsZSB0aW1lICovCisJCQlpZiAoYWJzX3N0YXRlID09IE1GSV9TVEFURV9PUEVSQVRJT05BTCAmJgorCQkJICAgIChpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmZ3Q291bnRlciAhPQorCQkJICAgICBpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmRyaXZlckNvdW50ZXIpKSB7CisJCQkJCWluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZHJpdmVyQ291bnRlciA9CisJCQkJCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmZ3Q291bnRlcjsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiIKKwkJCQkJICAgICAgICJMYXRlIEZXIGhlYXJ0YmVhdCB1cGRhdGUgZm9yICIKKwkJCQkJICAgICAgICJzY3NpJWQuXG4iLAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJbiBWRiBtb2RlLCBmaXJzdCBwb2xsIGZvciBGVyByZWFkeSAqLworCQkJCWZvciAoaSA9IDA7CisJCQkJICAgICBpIDwgKE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FICogMTAwMCk7CisJCQkJICAgICBpICs9IDIwKSB7CisJCQkJCXN0YXR1c19yZWcgPQorCQkJCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+CisJCQkJCQlyZWFkX2Z3X3N0YXR1c19yZWcoCisJCQkJCQkJaW5zdGFuY2UtPnJlZ19zZXQpOworCQkJCQlhYnNfc3RhdGUgPSBzdGF0dXNfcmVnICYKKwkJCQkJCU1GSV9TVEFURV9NQVNLOworCQkJCQlpZiAoYWJzX3N0YXRlID09IE1GSV9TVEFURV9SRUFEWSkgeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhcyIKKwkJCQkJCSAgICAgICAiOiBTUi1JT1Y6IEZXIHdhcyBmb3VuZCIKKwkJCQkJCSAgICAgICAidG8gYmUgaW4gcmVhZHkgc3RhdGUgIgorCQkJCQkJICAgICAgICJmb3Igc2NzaSVkLlxuIiwKKwkJCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQltc2xlZXAoMjApOworCQkJCX0KKwkJCQlpZiAoYWJzX3N0YXRlICE9IE1GSV9TVEFURV9SRUFEWSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6ICIKKwkJCQkJICAgICAgICJGVyBub3QgaW4gcmVhZHkgc3RhdGUgYWZ0ZXIgJWQiCisJCQkJCSAgICAgICAiIHNlY29uZHMgZm9yIHNjc2klZCwgc3RhdHVzX3JlZyA9ICIKKwkJCQkJICAgICAgICIweCV4LlxuIiwKKwkJCQkJICAgICAgIE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FLAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8sCisJCQkJCSAgICAgICBzdGF0dXNfcmVnKTsKKwkJCQkJbWVnYXJhaWRfc2FzX2tpbGxfaGJhKGluc3RhbmNlKTsKKwkJCQkJaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCA9IDE7CisJCQkJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9CisJCQkJCQlNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SOworCQkJCQlyZXR2YWwgPSBGQUlMRUQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCiAJCS8qIE5vdyB0cnkgdG8gcmVzZXQgdGhlIGNoaXAgKi8KIAkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfRlVTSU9OX01BWF9SRVNFVF9UUklFUzsgaSsrKSB7CiAJCQl3cml0ZWwoTVBJMl9XUlNFUV9GTFVTSF9LRVlfVkFMVUUsCkBAIC0yMzQ2LDcgKzI0ODMsOSBAQAogCQkJCXJlYWRsKCZpbnN0YW5jZS0+cmVnX3NldC0+ZnVzaW9uX2hvc3RfZGlhZyk7CiAJCQkJaWYgKHJldHJ5KysgPT0gMTAwKSB7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogIgotCQkJCQkgICAgICAgIkhvc3QgZGlhZyB1bmxvY2sgZmFpbGVkIVxuIik7CisJCQkJCSAgICAgICAiSG9zdCBkaWFnIHVubG9jayBmYWlsZWQhICIKKwkJCQkJICAgICAgICJmb3Igc2NzaSVkXG4iLAorCQkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0yMzY4LDcgKzI1MDcsOCBAQAogCQkJCWlmIChyZXRyeSsrID09IDEwMDApIHsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiAiCiAJCQkJCSAgICAgICAiRGlhZyByZXNldCBhZGFwdGVyIG5ldmVyICIKLQkJCQkJICAgICAgICJjbGVhcmVkIVxuIik7CisJCQkJCSAgICAgICAiY2xlYXJlZCBmb3Igc2NzaSVkIVxuIiwKKwkJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMjM5MCwyOSArMjUzMCwyOSBAQAogCQkJaWYgKGFic19zdGF0ZSA8PSBNRklfU1RBVEVfRldfSU5JVCkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogZmlybXdhcmUgIgogCQkJCSAgICAgICAic3RhdGUgPCBNRklfU1RBVEVfRldfSU5JVCwgc3RhdGUgPSAiCi0JCQkJICAgICAgICIweCV4XG4iLCBhYnNfc3RhdGUpOworCQkJCSAgICAgICAiMHgleCBmb3Igc2NzaSVkXG4iLCBhYnNfc3RhdGUsCisJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJLyogV2FpdCBmb3IgRlcgdG8gYmVjb21lIHJlYWR5ICovCiAJCQlpZiAobWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KGluc3RhbmNlLCAxKSkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogRmFpbGVkIHRvICIKLQkJCQkgICAgICAgInRyYW5zaXRpb24gY29udHJvbGxlciB0byByZWFkeS5cbiIpOworCQkJCSAgICAgICAidHJhbnNpdGlvbiBjb250cm9sbGVyIHRvIHJlYWR5ICIKKwkJCQkgICAgICAgImZvciBzY3NpJWQuXG4iLAorCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCW1lZ2FzYXNfcmVzZXRfcmVwbHlfZGVzYyhpbnN0YW5jZSk7CiAJCQlpZiAobWVnYXNhc19pb2NfaW5pdF9mdXNpb24oaW5zdGFuY2UpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiAiCi0JCQkJICAgICAgICJtZWdhc2FzX2lvY19pbml0X2Z1c2lvbigpIGZhaWxlZCFcbiIpOworCQkJCSAgICAgICAibWVnYXNhc19pb2NfaW5pdF9mdXNpb24oKSBmYWlsZWQhIgorCQkJCSAgICAgICAiIGZvciBzY3NpJWRcbiIsCisJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJY2xlYXJfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULAotCQkJCSAgJmluc3RhbmNlLT5yZXNldF9mbGFncyk7Ci0JCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZSk7Ci0JCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0hCQV9PUEVSQVRJT05BTDsKLQogCQkJLyogUmUtZmlyZSBtYW5hZ2VtZW50IGNvbW1hbmRzICovCiAJCQlmb3IgKGogPSAwIDsgaiA8IGluc3RhbmNlLT5tYXhfZndfY21kczsgaisrKSB7CiAJCQkJY21kX2Z1c2lvbiA9IGZ1c2lvbi0+Y21kX2xpc3Rbal07CkBAIC0yNDIyLDcgKzI1NjIsNyBAQAogCQkJCQlpbnN0YW5jZS0+CiAJCQkJCWNtZF9saXN0W2NtZF9mdXNpb24tPnN5bmNfY21kX2lkeF07CiAJCQkJCWlmIChjbWRfbWZpLT5mcmFtZS0+ZGNtZC5vcGNvZGUgPT0KLQkJCQkJICAgIE1SX0RDTURfTERfTUFQX0dFVF9JTkZPKSB7CisJCQkJCSAgICBjcHVfdG9fbGUzMihNUl9EQ01EX0xEX01BUF9HRVRfSU5GTykpIHsKIAkJCQkJCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwKIAkJCQkJCQkJICAgY21kX21maSk7CiAJCQkJCQltZWdhc2FzX3JldHVybl9jbWRfZnVzaW9uKApAQCAtMjQzMywxMSArMjU3MywxNSBAQAogCQkJCQkJCWluc3RhbmNlLAogCQkJCQkJCWNtZF9tZmktPmNvbnRleHQuc21pZAogCQkJCQkJCS0xKTsKLQkJCQkJCWlmICghcmVxX2Rlc2MpCisJCQkJCQlpZiAoIXJlcV9kZXNjKSB7CiAJCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCQkJCSAgICAgICAicmVxX2Rlc2MgTlVMTCIKLQkJCQkJCQkgICAgICAgIlxuIik7Ci0JCQkJCQllbHNlIHsKKwkJCQkJCQkgICAgICAgIiBmb3Igc2NzaSVkXG4iLAorCQkJCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCQkJLyogUmV0dXJuIGxlYWtlZCBNUFQKKwkJCQkJCQkgICBmcmFtZSAqLworCQkJCQkJCW1lZ2FzYXNfcmV0dXJuX2NtZF9mdXNpb24oaW5zdGFuY2UsIGNtZF9mdXNpb24pOworCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT4KIAkJCQkJCQlmaXJlX2NtZChpbnN0YW5jZSwKIAkJCQkJCQkJIHJlcV9kZXNjLT4KQEAgLTI0NTEsNiArMjU5NSwxMSBAQAogCQkJCX0KIAkJCX0KIAorCQkJY2xlYXJfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULAorCQkJCSAgJmluc3RhbmNlLT5yZXNldF9mbGFncyk7CisJCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZSk7CisJCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0hCQV9PUEVSQVRJT05BTDsKKwogCQkJLyogUmVzZXQgbG9hZCBiYWxhbmNlIGluZm8gKi8KIAkJCW1lbXNldChmdXNpb24tPmxvYWRfYmFsYW5jZV9pbmZvLCAwLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgTERfTE9BRF9CQUxBTkNFX0lORk8pCkBAIC0yNDU5LDE4ICsyNjA4LDM5IEBACiAJCQlpZiAoIW1lZ2FzYXNfZ2V0X21hcF9pbmZvKGluc3RhbmNlKSkKIAkJCQltZWdhc2FzX3N5bmNfbWFwX2luZm8oaW5zdGFuY2UpOwogCisJCQkvKiBSZXN0YXJ0IFNSLUlPViBoZWFydGJlYXQgKi8KKwkJCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpIHsKKwkJCQlpZiAoIW1lZ2FzYXNfc3Jpb3Zfc3RhcnRfaGVhcnRiZWF0KGluc3RhbmNlLCAwKSkKKwkJCQkJbWVnYXNhc19zdGFydF90aW1lcihpbnN0YW5jZSwKKwkJCQkJCQkgICAgJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIsCisJCQkJCQkJICAgIG1lZ2FzYXNfc3Jpb3ZfaGVhcnRiZWF0X2hhbmRsZXIsCisJCQkJCQkJICAgIE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGKTsKKwkJCQllbHNlCisJCQkJCWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwgPSAxOworCQkJfQorCiAJCQkvKiBBZGFwdGVyIHJlc2V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogUmVzZXQgIgotCQkJICAgICAgICJzdWNjZXNzZnVsLlxuIik7CisJCQkgICAgICAgInN1Y2Nlc3NmdWwgZm9yIHNjc2klZC5cbiIsCisJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJcmV0dmFsID0gU1VDQ0VTUzsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCS8qIFJlc2V0IGZhaWxlZCwga2lsbCB0aGUgYWRhcHRlciAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IFJlc2V0IGZhaWxlZCwga2lsbGluZyAiCi0JCSAgICAgICAiYWRhcHRlci5cbiIpOworCQkgICAgICAgImFkYXB0ZXIgc2NzaSVkLlxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQltZWdhcmFpZF9zYXNfa2lsbF9oYmEoaW5zdGFuY2UpOworCQlpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsID0gMTsKKwkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUjsKIAkJcmV0dmFsID0gRkFJTEVEOwogCX0gZWxzZSB7CisJCS8qIEZvciBWRjogUmVzdGFydCBIQiB0aW1lciBpZiB3ZSBkaWRuJ3QgT0NSICovCisJCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpIHsKKwkJCW1lZ2FzYXNfc3RhcnRfdGltZXIoaW5zdGFuY2UsCisJCQkJCSAgICAmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lciwKKwkJCQkJICAgIG1lZ2FzYXNfc3Jpb3ZfaGVhcnRiZWF0X2hhbmRsZXIsCisJCQkJCSAgICBNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRik7CisJCX0KIAkJY2xlYXJfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULCAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKTsKIAkJaW5zdGFuY2UtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIoaW5zdGFuY2UpOwogCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0hCQV9PUEVSQVRJT05BTDsKQEAgLTI0ODcsNyArMjY1Nyw3IEBACiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlLCB3b3JrX2luaXQpOwogCi0JbWVnYXNhc19yZXNldF9mdXNpb24oaW5zdGFuY2UtPmhvc3QpOworCW1lZ2FzYXNfcmVzZXRfZnVzaW9uKGluc3RhbmNlLT5ob3N0LCAwKTsKIH0KIAogc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2VfdGVtcGxhdGUgbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZV9mdXNpb24gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaAppbmRleCAzNWE1MTM5Li5lNzZhZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmgKQEAgLTQ4NSw2ICs0ODUsOSBAQAogI2RlZmluZSBNQVhfUEhZU0lDQUxfREVWSUNFUyAyNTYKICNkZWZpbmUgTUFYX1JBSURNQVBfUEhZU0lDQUxfREVWSUNFUyAoTUFYX1BIWVNJQ0FMX0RFVklDRVMpCiAjZGVmaW5lIE1SX0RDTURfTERfTUFQX0dFVF9JTkZPICAgICAgICAgICAgIDB4MDMwMGUxMDEKKyNkZWZpbmUgTVJfRENNRF9DVFJMX1NIQVJFRF9IT1NUX01FTV9BTExPQyAgMHgwMTBlODQ4NSAgIC8qIFNSLUlPViBIQiBhbGxvYyovCisjZGVmaW5lIE1SX0RDTURfTERfVkZfTUFQX0dFVF9BTExfTERTXzExMSAgIDB4MDMyMDAyMDAKKyNkZWZpbmUgTVJfRENNRF9MRF9WRl9NQVBfR0VUX0FMTF9MRFMgICAgICAgMHgwMzE1MDIwMAogCiBzdHJ1Y3QgTVJfREVWX0hBTkRMRV9JTkZPIHsKIAl1MTYgICAgIGN1ckRldkhkbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wYXMxNi5jIGIvZHJpdmVycy9zY3NpL3BhczE2LmMKaW5kZXggNjJmMWE2MC4uMGQ3OGE0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BhczE2LmMKKysrIGIvZHJpdmVycy9zY3NpL3BhczE2LmMKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCSAgICBpbnN0YW5jZS0+aXJxID0gTkNSNTM4MF9wcm9iZV9pcnEoaW5zdGFuY2UsIFBBUzE2X0lSUVMpOwogCiAJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkgCi0JICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBwYXMxNl9pbnRyLCBJUlFGX0RJU0FCTEVELAorCSAgICBpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgcGFzMTZfaW50ciwgMCwKIAkJCSAgICAicGFzMTYiLCBpbnN0YW5jZSkpIHsKIAkJcHJpbnRrKCJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgCiAJCSAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9jdGwuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2N0bC5jCmluZGV4IGEwNGI0ZmYuLjI4YjRlODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2N0bC5jCkBAIC0zMjMsMjQgKzMyMywxNyBAQAogCWludCBvZmZzZXQ7CiAJY2hhciAqc3RyID0gYnVmOwogCWludCBzdGFydCA9IDA7Ci0jZGVmaW5lIElCX01FTU1BUChjKQkJXAotCQkoKih1MzIgKikoKHU4ICopcG04MDAxX2hhLT4JCVwKLQkJbWVtb3J5TWFwLnJlZ2lvbltJQl0udmlydF9wdHIgKwkJXAorI2RlZmluZSBJQl9NRU1NQVAoYykJXAorCQkoKih1MzIgKikoKHU4ICopcG04MDAxX2hhLT4JXAorCQltZW1vcnlNYXAucmVnaW9uW0lCXS52aXJ0X3B0ciArCVwKIAkJcG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0ICsgKGMpKSkKIAogCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgSUJfT0JfUkVBRF9USU1FUzsgb2Zmc2V0KyspIHsKLQkJaWYgKHBtODAwMV9oYS0+Y2hpcF9pZCAhPSBjaGlwXzgwMDEpCi0JCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHhcbiIsIElCX01FTU1BUChzdGFydCkpOwotCQllbHNlCi0JCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHhcbiIsIElCX01FTU1BUChzdGFydCkpOworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHhcbiIsIElCX01FTU1BUChzdGFydCkpOwogCQlzdGFydCA9IHN0YXJ0ICsgNDsKIAl9CiAJcG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0ICs9IFNZU0ZTX09GRlNFVDsKLQlpZiAoKCgocG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0KSAlIChQTTgwWFhfSUJfT0JfUVVFVUVfU0laRSkpID09IDApCi0JCSYmIChwbTgwMDFfaGEtPmNoaXBfaWQgIT0gY2hpcF84MDAxKSkKLQkJcG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0ID0gMDsKLQlpZiAoKCgocG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0KSAlIChQTTgwMDFfSUJfT0JfUVVFVUVfU0laRSkpID09IDApCi0JCSYmIChwbTgwMDFfaGEtPmNoaXBfaWQgPT0gY2hpcF84MDAxKSkKKwlpZiAoKChwbTgwMDFfaGEtPmV2dGxvZ19pYl9vZmZzZXQpICUgKFBNODBYWF9JQl9PQl9RVUVVRV9TSVpFKSkgPT0gMCkKIAkJcG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0ID0gMDsKIAogCXJldHVybiBzdHIgLSBidWY7CkBAIC0zNjMsMjQgKzM1NiwxNyBAQAogCWludCBvZmZzZXQ7CiAJY2hhciAqc3RyID0gYnVmOwogCWludCBzdGFydCA9IDA7Ci0jZGVmaW5lIE9CX01FTU1BUChjKQkJXAotCQkoKih1MzIgKikoKHU4ICopcG04MDAxX2hhLT4JCVwKLQkJbWVtb3J5TWFwLnJlZ2lvbltPQl0udmlydF9wdHIgKwkJXAorI2RlZmluZSBPQl9NRU1NQVAoYykJXAorCQkoKih1MzIgKikoKHU4ICopcG04MDAxX2hhLT4JXAorCQltZW1vcnlNYXAucmVnaW9uW09CXS52aXJ0X3B0ciArCVwKIAkJcG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0ICsgKGMpKSkKIAogCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgSUJfT0JfUkVBRF9USU1FUzsgb2Zmc2V0KyspIHsKLQkJaWYgKHBtODAwMV9oYS0+Y2hpcF9pZCAhPSBjaGlwXzgwMDEpCi0JCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHhcbiIsIE9CX01FTU1BUChzdGFydCkpOwotCQllbHNlCi0JCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHhcbiIsIE9CX01FTU1BUChzdGFydCkpOworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHhcbiIsIE9CX01FTU1BUChzdGFydCkpOwogCQlzdGFydCA9IHN0YXJ0ICsgNDsKIAl9CiAJcG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0ICs9IFNZU0ZTX09GRlNFVDsKLQlpZiAoKCgocG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0KSAlIChQTTgwWFhfSUJfT0JfUVVFVUVfU0laRSkpID09IDApCi0JCQkmJiAocG04MDAxX2hhLT5jaGlwX2lkICE9IGNoaXBfODAwMSkpCi0JCXBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCA9IDA7Ci0JaWYgKCgoKHBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCkgJSAoUE04MDAxX0lCX09CX1FVRVVFX1NJWkUpKSA9PSAwKQotCQkJJiYgKHBtODAwMV9oYS0+Y2hpcF9pZCA9PSBjaGlwXzgwMDEpKQorCWlmICgoKHBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCkgJSAoUE04MFhYX0lCX09CX1FVRVVFX1NJWkUpKSA9PSAwKQogCQlwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQgPSAwOwogCiAJcmV0dXJuIHN0ciAtIGJ1ZjsKQEAgLTQ2Niw3ICs0NTIsNyBAQAogc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9mYXRhbF9sb2dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0JdTMyIGNvdW50OworCXNzaXplX3QgY291bnQ7CiAKIAljb3VudCA9IHBtODB4eF9nZXRfZmF0YWxfZHVtcChjZGV2LCBhdHRyLCBidWYpOwogCXJldHVybiBjb3VudDsKQEAgLTQ4NCw3ICs0NzAsNyBAQAogc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9nc21fbG9nX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXUzMiBjb3VudDsKKwlzc2l6ZV90IGNvdW50OwogCiAJY291bnQgPSBwbTgwMDFfZ2V0X2dzbV9kdW1wKGNkZXYsIFNZU0ZTX09GRlNFVCwgYnVmKTsKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jCmluZGV4IDBhMTI5NmEuLmE5N2JlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jCkBAIC02NDQsNyArNjQ0LDcgQEAKIAlwY2lfcmVhZF9jb25maWdfd29yZChwbTgwMDFfaGEtPnBkZXYsIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2VpZCk7CiAJLyogODA4MSBjb250cm9sbGVycyBuZWVkIEJBUiBzaGlmdCB0byBhY2Nlc3MgTVBJIHNwYWNlCiAJKiBhcyB0aGlzIGlzIHNoYXJlZCB3aXRoIEJJT1MgZGF0YSAqLwotCWlmIChkZXZpY2VpZCA9PSAweDgwODEpIHsKKwlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxIHx8IGRldmljZWlkID09IDB4MDA0MikgewogCQlpZiAoLTEgPT0gcG04MDAxX2JhcjRfc2hpZnQocG04MDAxX2hhLCBHU01fU01fQkFTRSkpIHsKIAkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCiAJCQkJcG04MDAxX3ByaW50aygiU2hpZnQgQmFyNCB0byAweCV4IGZhaWxlZFxuIiwKQEAgLTY3Myw3ICs2NzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBQTTgwMDFfTUFYX09VVEJfTlVNOyBpKyspCiAJCXVwZGF0ZV9vdXRibmRfcXVldWVfdGFibGUocG04MDAxX2hhLCBpKTsKIAkvKiA4MDgxIGNvbnRyb2xsZXIgZG9ub3QgcmVxdWlyZSB0aGVzZSBvcGVyYXRpb25zICovCi0JaWYgKGRldmljZWlkICE9IDB4ODA4MSkgeworCWlmIChkZXZpY2VpZCAhPSAweDgwODEgJiYgZGV2aWNlaWQgIT0gMHgwMDQyKSB7CiAJCW1waV9zZXRfcGh5c19nM193aXRoX3NzYyhwbTgwMDFfaGEsIDApOwogCQkvKiA3LT4xMzBtcywgMzQtPjUwMG1zLCAxMTktPjEuNXMgKi8KIAkJbXBpX3NldF9vcGVuX3JldHJ5X2ludGVydmFsX3JlZyhwbTgwMDFfaGEsIDExOSk7CkBAIC03MDEsNyArNzAxLDcgQEAKIAl1MzIgZ3N0X2xlbl9tcGlzdGF0ZTsKIAl1MTYgZGV2aWNlaWQ7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocG04MDAxX2hhLT5wZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlaWQpOwotCWlmIChkZXZpY2VpZCA9PSAweDgwODEpIHsKKwlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxIHx8IGRldmljZWlkID09IDB4MDA0MikgewogCQlpZiAoLTEgPT0gcG04MDAxX2JhcjRfc2hpZnQocG04MDAxX2hhLCBHU01fU01fQkFTRSkpIHsKIAkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCiAJCQkJcG04MDAxX3ByaW50aygiU2hpZnQgQmFyNCB0byAweCV4IGZhaWxlZFxuIiwKQEAgLTI1MDIsMTEgKzI1MDIsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LyppbiBvcmRlciB0byBmb3JjZSBDUFUgb3JkZXJpbmcqLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yNTIyLDExICsyNTE4LDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yNTUwLDExICsyNTQyLDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9TVFBfUkVTT1VSQ0VTX0JVU1kpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LyogZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yNjE3LDExICsyNjA1LDcgQEAKIAkJCQkgICAgSU9fRFNfTk9OX09QRVJBVElPTkFMKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yNjQxLDExICsyNjI1LDcgQEAKIAkJCQkgICAgSU9fRFNfSU5fRVJST1IpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI2NzQsMjAgKzI2NTQsOSBAQAogCQkJIiByZXNwIDB4JXggc3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyIVxuIiwKIAkJCXQsIHN0YXR1cywgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CiAJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCX0gZWxzZSBpZiAodC0+dWxkZF90YXNrKSB7CisJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qIGRpdHRvICovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCX0gZWxzZSBpZiAoIXQtPnVsZGRfdGFzaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LypkaXR0byovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCX0KIH0KIApAQCAtMjc5NiwxMSArMjc2NSw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjkwOSwyMCArMjg3NCw5IEBACiAJCQkiIHJlc3AgMHgleCBzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIhXG4iLAogCQkJdCwgZXZlbnQsIHRzLT5yZXNwLCB0cy0+c3RhdCkpOwogCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQl9IGVsc2UgaWYgKHQtPnVsZGRfdGFzaykgeworCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKiBkaXR0byAqLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQl9IGVsc2UgaWYgKCF0LT51bGRkX3Rhc2spIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qZGl0dG8qLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAl9CiB9CiAKQEAgLTQ0NjcsMjMgKzQ0MjEsMTEgQEAKIAkJCQkJIiBzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIgIgogCQkJCQkiXG4iLCB0YXNrLCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKIAkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgdGFnKTsKLQkJCX0gZWxzZSBpZiAodGFzay0+dWxkZF90YXNrKSB7CisJCQl9IGVsc2UgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywKIAkJCQkJCQlmbGFncyk7Ci0JCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIHRhZyk7Ci0JCQkJbWIoKTsvKiBkaXR0byAqLwotCQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCQl0YXNrLT50YXNrX2RvbmUodGFzayk7Ci0JCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAoIXRhc2stPnVsZGRfdGFzaykgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywKLQkJCQkJCQlmbGFncyk7Ci0JCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIHRhZyk7Ci0JCQkJbWIoKTsvKmRpdHRvKi8KLQkJCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQkJdGFzay0+dGFza19kb25lKHRhc2spOwotCQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHRhc2ssCisJCQkJCQkJCWNjYiwgdGFnKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtNTAyMCw3ICs0OTYyLDcgQEAKIAkvKiBjaGVjayBtYXggaXMgMSBNYnl0ZXMgKi8KIAlpZiAoKGxlbmd0aCA+IDB4MTAwMDAwKSB8fCAoZ3NtX2R1bXBfb2Zmc2V0ICYgMykgfHwKIAkJKChnc21fZHVtcF9vZmZzZXQgKyBsZW5ndGgpID4gMHgxMDAwMDAwKSkKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAocG04MDAxX2hhLT5jaGlwX2lkID09IGNoaXBfODAwMSkKIAkJYmFyID0gMjsKQEAgLTUwNDgsMTIgKzQ5OTAsMTIgQEAKIAkJCQlnc21fYmFzZSA9IEdTTV9CQVNFOwogCQkJCWlmICgtMSA9PSBwbTgwMDFfYmFyNF9zaGlmdChwbTgwMDFfaGEsCiAJCQkJCQkoZ3NtX2Jhc2UgKyBzaGlmdF92YWx1ZSkpKQotCQkJCQlyZXR1cm4gMTsKKwkJCQkJcmV0dXJuIC1FSU87CiAJCQl9IGVsc2UgewogCQkJCWdzbV9iYXNlID0gMDsKIAkJCQlpZiAoLTEgPT0gcG04MHh4X2JhcjRfc2hpZnQocG04MDAxX2hhLAogCQkJCQkJKGdzbV9iYXNlICsgc2hpZnRfdmFsdWUpKSkKLQkJCQkJcmV0dXJuIDE7CisJCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJZ3NtX2R1bXBfb2Zmc2V0ID0gKGdzbV9kdW1wX29mZnNldCArIG9mZnNldCkgJgogCQkJCQkJMHhGRkZGMDAwMDsKQEAgLTUwNzIsMTMgKzUwMTQsOCBAQAogCQlkaXJlY3RfZGF0YSArPSBzcHJpbnRmKGRpcmVjdF9kYXRhLCAiJTA4eCAiLCB2YWx1ZSk7CiAJfQogCS8qIFNoaWZ0IGJhY2sgdG8gQkFSNCBvcmlnaW5hbCBhZGRyZXNzICovCi0JaWYgKHBtODAwMV9oYS0+Y2hpcF9pZCA9PSBjaGlwXzgwMDEpIHsKLQkJaWYgKC0xID09IHBtODAwMV9iYXI0X3NoaWZ0KHBtODAwMV9oYSwgMCkpCi0JCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlpZiAoLTEgPT0gcG04MHh4X2JhcjRfc2hpZnQocG04MDAxX2hhLCAwKSkKLQkJCXJldHVybiAxOwotCX0KKwlpZiAoLTEgPT0gcG04MDAxX2JhcjRfc2hpZnQocG04MDAxX2hhLCAwKSkKKwkJCXJldHVybiAtRUlPOwogCXBtODAwMV9oYS0+ZmF0YWxfZm9yZW5zaWNfc2hpZnRfb2Zmc2V0ICs9IDEwMjQ7CiAKIAlpZiAocG04MDAxX2hhLT5mYXRhbF9mb3JlbnNpY19zaGlmdF9vZmZzZXQgPj0gMHgxMDAwMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMKaW5kZXggNzNhMTIwZC4uYzRmMzFiMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMKQEAgLTYyNSw3ICs2MjUsNyBAQAogCXBtODAwMV9oYS0+bnZtZF9jb21wbGV0aW9uID0gJmNvbXBsZXRpb247CiAKIAlpZiAocG04MDAxX2hhLT5jaGlwX2lkID09IGNoaXBfODAwMSkgewotCQlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxKSB7CisJCWlmIChkZXZpY2VpZCA9PSAweDgwODEgfHwgZGV2aWNlaWQgPT0gMHgwMDQyKSB7CiAJCQlwYXlsb2FkLm1pbm9yX2Z1bmN0aW9uID0gNDsKIAkJCXBheWxvYWQubGVuZ3RoID0gNDA5NjsKIAkJfSBlbHNlIHsKQEAgLTY0Niw2ICs2NDYsOSBAQAogCQkJaWYgKGRldmljZWlkID09IDB4ODA4MSkKIAkJCQlwbTgwMDFfaGEtPnNhc19hZGRyW2pdID0KIAkJCQkJcGF5bG9hZC5mdW5jX3NwZWNpZmljWzB4NzA0ICsgaV07CisJCQllbHNlIGlmIChkZXZpY2VpZCA9PSAweDAwNDIpCisJCQkJcG04MDAxX2hhLT5zYXNfYWRkcltqXSA9CisJCQkJCXBheWxvYWQuZnVuY19zcGVjaWZpY1sweDAxMCArIGldOwogCQl9IGVsc2UKIAkJCXBtODAwMV9oYS0+c2FzX2FkZHJbal0gPQogCQkJCQlwYXlsb2FkLmZ1bmNfc3BlY2lmaWNbMHg4MDQgKyBpXTsKQEAgLTcxMywxMSArNzE2LDkgQEAKIAkvKiBTUEN2IGNvbnRyb2xsZXJzIHN1cHBvcnRzIDY0IG1zaS14ICovCiAJaWYgKHBtODAwMV9oYS0+Y2hpcF9pZCA9PSBjaGlwXzgwMDEpIHsKIAkJbnVtYmVyX29mX2ludHIgPSAxOwotCQlmbGFnIHw9IElSUUZfRElTQUJMRUQ7CiAJfSBlbHNlIHsKIAkJbnVtYmVyX29mX2ludHIgPSBQTTgwMDFfTUFYX01TSVhfVkVDOwogCQlmbGFnICY9IH5JUlFGX1NIQVJFRDsKLQkJZmxhZyB8PSBJUlFGX0RJU0FCTEVEOwogCX0KIAogCW1heF9lbnRyeSA9IHNpemVvZihwbTgwMDFfaGEtPm1zaXhfZW50cmllcykgLwpAQCAtMTA3MiwxMCArMTA3Myw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwbTgwMDFfcGNpX3RhYmxlW10gPSB7CiAJeyBQQ0lfVkRFVklDRShQTUNfU2llcnJhLCAweDgwMDEpLCBjaGlwXzgwMDEgfSwKLQl7Ci0JCVBDSV9ERVZJQ0UoMHgxMTdjLCAweDAwNDIpLAotCQkuZHJpdmVyX2RhdGEgPSBjaGlwXzgwMDEKLQl9LAorCXsgUENJX1ZERVZJQ0UoQVRUTywgMHgwMDQyKSwgY2hpcF84MDAxIH0sCiAJLyogU3VwcG9ydCBmb3IgU1BDL1NQQ3YvU1BDdmUgY29udHJvbGxlcnMgKi8KIAl7IFBDSV9WREVWSUNFKEFEQVBURUMyLCAweDgwMDEpLCBjaGlwXzgwMDEgfSwKIAl7IFBDSV9WREVWSUNFKFBNQ19TaWVycmEsIDB4ODAwOCksIGNoaXBfODAwOCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwppbmRleCBmNTBhYzQ0Li44YTQ0YmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwpAQCAtNDM0LDYgKzQzNCw3IEBACiAJCWNjYi0+bl9lbGVtID0gbl9lbGVtOwogCQljY2ItPmNjYl90YWcgPSB0YWc7CiAJCWNjYi0+dGFzayA9IHQ7CisJCWNjYi0+ZGV2aWNlID0gcG04MDAxX2RldjsKIAkJc3dpdGNoICh0LT50YXNrX3Byb3RvKSB7CiAJCWNhc2UgU0FTX1BST1RPQ09MX1NNUDoKIAkJCXJjID0gcG04MDAxX3Rhc2tfcHJlcF9zbXAocG04MDAxX2hhLCBjY2IpOwpAQCAtODY1LDEzICs4NjYsMTEgQEAKIHN0YXRpYyB2b2lkIHBtODAwMV9kZXZfZ29uZV9ub3RpZnkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1MzIgdGFnOwogCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYTsKIAlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2RldiA9IGRldi0+bGxkZF9kZXY7CiAKIAlwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG04MDAxX2hhLT5sb2NrLCBmbGFncyk7Ci0JcG04MDAxX3RhZ19hbGxvYyhwbTgwMDFfaGEsICZ0YWcpOwogCWlmIChwbTgwMDFfZGV2KSB7CiAJCXUzMiBkZXZpY2VfaWQgPSBwbTgwMDFfZGV2LT5kZXZpY2VfaWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKaW5kZXggNmM1ZmQ1ZS4uMWVlMDZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKQEAgLTcwOCw1ICs3MDgsMTcgQEAKIC8qIGN0bCBzaGFyZWQgQVBJICovCiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnBtODAwMV9ob3N0X2F0dHJzW107CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYiwKKwkJCXUzMiBjY2JfaWR4KQoreworCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCBjY2JfaWR4KTsKKwlzbXBfbWIoKTsgLyppbiBvcmRlciB0byBmb3JjZSBDUFUgb3JkZXJpbmcqLworCXNwaW5fdW5sb2NrKCZwbTgwMDFfaGEtPmxvY2spOworCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKKwlzcGluX2xvY2soJnBtODAwMV9oYS0+bG9jayk7Cit9CisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODB4eF9od2kuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MHh4X2h3aS5jCmluZGV4IGM5NTBkYzUuLmQ3MDU4N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MHh4X2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MHh4X2h3aS5jCkBAIC05MSw3ICs5MSw2IEBACiAJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CiAJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOwogCXZvaWQgX19pb21lbSAqZmF0YWxfdGFibGVfYWRkcmVzcyA9IHBtODAwMV9oYS0+ZmF0YWxfdGJsX2FkZHI7Ci0JdTMyIHN0YXR1cyA9IDE7CiAJdTMyIGFjY3VtX2xlbiAsIHJlZ192YWwsIGluZGV4LCAqdGVtcDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXU4ICpkaXJlY3RfZGF0YTsKQEAgLTExMSwxMyArMTEwLDEwIEBACiAJCWRpcmVjdF9kYXRhID0gKHU4ICopZmF0YWxfZXJyb3JfZGF0YTsKIAkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfdHlwZSA9IFRZUEVfTk9OX0ZBVEFMOwogCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2xlbiA9IFNZU0ZTX09GRlNFVDsKLQkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9vZmZzZXQgPSAwOwogCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYucmVhZF9sZW4gPSAwOwogCiAJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfZGF0YSA9IGRpcmVjdF9kYXRhOwotCX0KIAotCWlmIChwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X29mZnNldCA9PSAwKSB7CiAJCS8qIHN0YXJ0IHRvIGdldCBkYXRhICovCiAJCS8qIFByb2dyYW0gdGhlIE1FTUJBU0UgSUkgU2hpZnRpbmcgUmVnaXN0ZXIgd2l0aCAweDAwLiovCiAJCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMCwgTUVNQkFTRV9JSV9TSElGVF9SRUdJU1RFUiwKQEAgLTEyNiw2ICsxMjIsNyBAQAogCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2ZhdGFsX3N0ZXAgPSAwOwogCQlwbTgwMDFfaGEtPmZhdGFsX2Jhcl9sb2MgPSAwOwogCX0KKwogCS8qIFJlYWQgdW50aWwgYWNjdW1fbGVuIGlzIHJldHJpdmVkICovCiAJYWNjdW1fbGVuID0gcG04MDAxX21yMzIoZmF0YWxfdGFibGVfYWRkcmVzcywKIAkJCQlNUElfRkFUQUxfRURVTVBfVEFCTEVfQUNDVU1fTEVOKTsKQEAgLTEzNSw3ICsxMzIsNyBAQAogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKIAkJCXBtODAwMV9wcmludGsoIlBvc3NpYmxlIFBDSSBpc3N1ZSAweCV4IG5vdCBleHBlY3RlZFxuIiwKIAkJCQlhY2N1bV9sZW4pKTsKLQkJcmV0dXJuIHN0YXR1czsKKwkJcmV0dXJuIC1FSU87CiAJfQogCWlmIChhY2N1bV9sZW4gPT0gMCB8fCBhY2N1bV9sZW4gPj0gMHgxMDAwMDApIHsKIAkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9kYXRhICs9CkBAIC0xNzgsNyArMTc1LDYgQEAKIAkJCXBtODAwMV9oYS0+Zm9yZW5zaWNfZmF0YWxfc3RlcCA9IDE7CiAJCQlwbTgwMDFfaGEtPmZhdGFsX2ZvcmVuc2ljX3NoaWZ0X29mZnNldCA9IDA7CiAJCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2xhc3Rfb2Zmc2V0CT0gMDsKLQkJCXN0YXR1cyA9IDA7CiAJCQlyZXR1cm4gKGNoYXIgKilwbTgwMDFfaGEtPgogCQkJCWZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2RhdGEgLQogCQkJCShjaGFyICopYnVmOwpAQCAtMTk0LDcgKzE5MCw2IEBACiAJCQkJCWZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2RhdGEsCiAJCQkJCSIlMDh4ICIsICoodGVtcCArIGluZGV4KSk7CiAJCQl9Ci0JCQlzdGF0dXMgPSAwOwogCQkJcmV0dXJuIChjaGFyICopcG04MDAxX2hhLT4KIAkJCQlmb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9kYXRhIC0KIAkJCQkoY2hhciAqKWJ1ZjsKQEAgLTIxNCw3ICsyMDksNiBAQAogCQlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDAsIE1FTUJBU0VfSUlfU0hJRlRfUkVHSVNURVIsCiAJCQlwbTgwMDFfaGEtPmZhdGFsX2ZvcmVuc2ljX3NoaWZ0X29mZnNldCk7CiAJCXBtODAwMV9oYS0+ZmF0YWxfYmFyX2xvYyA9IDA7Ci0JCXN0YXR1cyA9IDA7CiAJCXJldHVybiAoY2hhciAqKXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfZGF0YSAtCiAJCQkoY2hhciAqKWJ1ZjsKIAl9CkBAIC0yMzksNyArMjMzLDcgQEAKIAkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCiAJCQlwbTgwMDFfcHJpbnRrKCJUSU1FT1VUOk1FTUJBU0VfSUlfU0hJRlRfUkVHSVNURVIiCiAJCQkiID0gMHgleFxuIiwgcmVnX3ZhbCkpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAogCQkvKiBSZWFkIHRoZSBuZXh0IDY0SyBvZiB0aGUgZGVidWcgZGF0YS4gKi8KQEAgLTI1OSw3ICsyNTMsNiBAQAogCQkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9sZW4gPSAgMDsKIAkJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3Rfb2Zmc2V0ID0gMDsKIAkJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5yZWFkX2xlbiA9IDA7Ci0JCQlzdGF0dXMgPSAwOwogCQl9CiAJfQogCkBAIC0yMTc1LDExICsyMTY4LDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjE5NSwxMSArMjE4NCw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjIyMSwxMSArMjIwNiw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfU1RQX1JFU09VUkNFU19CVVNZKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qIGRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjI4OCwxMSArMjI2OSw3IEBACiAJCQkJCUlPX0RTX05PTl9PUEVSQVRJT05BTCk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjMxMiwxMSArMjI4OSw3IEBACiAJCQkJCUlPX0RTX0lOX0VSUk9SKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yMzQ1LDIwICsyMzE4LDkgQEAKIAkJCSIgcmVzcCAweCV4IHN0YXQgMHgleCBidXQgYWJvcnRlZCBieSB1cHBlciBsYXllciFcbiIsCiAJCQl0LCBzdGF0dXMsIHRzLT5yZXNwLCB0cy0+c3RhdCkpOwogCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQl9IGVsc2UgaWYgKHQtPnVsZGRfdGFzaykgeworCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKiBkaXR0byAqLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQl9IGVsc2UgaWYgKCF0LT51bGRkX3Rhc2spIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qZGl0dG8qLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAl9CiB9CiAKQEAgLTI0NzAsMTEgKzI0MzIsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI1OTYsMjAgKzI1NTQsOSBAQAogCQkJIiByZXNwIDB4JXggc3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyIVxuIiwKIAkJCXQsIGV2ZW50LCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKIAkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JfSBlbHNlIGlmICh0LT51bGRkX3Rhc2spIHsKKwl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LyogZGl0dG8gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JfSBlbHNlIGlmICghdC0+dWxkZF90YXNrKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKmRpdHRvKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJfQogfQogCkBAIC00MzA0LDIzICs0MjUxLDExIEBACiAJCQkJCSJcbiIsIHRhc2ssIHRzLT5yZXNwLCB0cy0+c3RhdCkpOwogCQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCB0YWcpOwogCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmICh0YXNrLT51bGRkX3Rhc2spIHsKKwkJCX0gZWxzZSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLAogCQkJCQkJCWZsYWdzKTsKLQkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgdGFnKTsKLQkJCQltYigpOy8qIGRpdHRvICovCi0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQkJCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmICghdGFzay0+dWxkZF90YXNrKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLAotCQkJCQkJCWZsYWdzKTsKLQkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgdGFnKTsKLQkJCQltYigpOy8qZGl0dG8qLwotCQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCQl0YXNrLT50YXNrX2RvbmUodGFzayk7Ci0JCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdGFzaywKKwkJCQkJCQkJY2NiLCB0YWcpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwppbmRleCA5N2RhYmQzLi4xNTgwMjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKQEAgLTM3OSwxNCArMzc5LDcgQEAKICNkZWZpbmUgIERFQlVHX1BSSU5UX05WUkFNCTAKICNkZWZpbmUgIERFQlVHX1FMQTEyODAJCTAKIAotLyoKLSAqIFRoZSBTR0kgVklTV1MgaXMgYnJva2VuIGFuZCBkb2Vzbid0IHN1cHBvcnQgTU1JTyA7LSgKLSAqLwotI2lmZGVmIENPTkZJR19YODZfVklTV1MKLSNkZWZpbmUJTUVNT1JZX01BUFBFRF9JTwkwCi0jZWxzZQogI2RlZmluZQlNRU1PUllfTUFQUEVEX0lPCTEKLSNlbmRpZgogCiAjaW5jbHVkZSAicWxhMTI4MC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlCmluZGV4IGZmMGZjN2MuLjQ0ZGVmNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogcWxhMnh4eC15IDo9IHFsYV9vcy5vIHFsYV9pbml0Lm8gcWxhX21ieC5vIHFsYV9pb2NiLm8gcWxhX2lzci5vIHFsYV9ncy5vIFwKIAkJcWxhX2RiZy5vIHFsYV9zdXAubyBxbGFfYXR0ci5vIHFsYV9taWQubyBxbGFfZGZzLm8gcWxhX2JzZy5vIFwKLSAgICAgICAgcWxhX254Lm8gcWxhX21yLm8gcWxhX254Mi5vIHFsYV90YXJnZXQubworCQlxbGFfbngubyBxbGFfbXIubyBxbGFfbngyLm8gcWxhX3RhcmdldC5vIHFsYV90bXBsLm8KIAogb2JqLSQoQ09ORklHX1NDU0lfUUxBX0ZDKSArPSBxbGEyeHh4Lm8KIG9iai0kKENPTkZJR19UQ01fUUxBMlhYWCkgKz0gdGNtX3FsYTJ4eHgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggNGEwZDdjOS4uMDdiZWZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC0xNDcsNiArMTQ3LDkyIEBACiB9OwogCiBzdGF0aWMgc3NpemVfdAorcWxhMngwMF9zeXNmc19yZWFkX2Z3X2R1bXBfdGVtcGxhdGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSB8fCAhaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuKQorCQlyZXR1cm4gMDsKKworCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwZTIsCisJICAgICJjaHVuayA8LSBvZmY9JWxseCBjb3VudD0lenhcbiIsIG9mZiwgY291bnQpOworCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLAorCSAgICBoYS0+ZndfZHVtcF90ZW1wbGF0ZSwgaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfc3lzZnNfd3JpdGVfZndfZHVtcF90ZW1wbGF0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCBzaXplOworCisJaWYgKG9mZiA9PSAwKSB7CisJCWlmIChoYS0+ZndfZHVtcCkKKwkJCXZmcmVlKGhhLT5md19kdW1wKTsKKwkJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCisJCWhhLT5md19kdW1wID0gTlVMTDsKKwkJaGEtPmZ3X2R1bXBfbGVuID0gMDsKKwkJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCQloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOworCisJCXNpemUgPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZShidWYpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MGQxLAorCQkgICAgIi0+IGFsbG9jYXRpbmcgZndkdCAoJXggYnl0ZXMpLi4uXG4iLCBzaXplKTsKKwkJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSB2bWFsbG9jKHNpemUpOworCQlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlKSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MGQyLAorCQkJICAgICJGYWlsZWQgYWxsb2NhdGUgZndkdCAoJXggYnl0ZXMpLlxuIiwgc2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSBzaXplOworCX0KKworCWlmIChvZmYgKyBjb3VudCA+IGhhLT5md19kdW1wX3RlbXBsYXRlX2xlbikgeworCQljb3VudCA9IGhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiAtIG9mZjsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzBkMywKKwkJICAgICJjaHVuayAtPiB0cnVuY2F0aW5nIHRvICV6eCBieXRlcy5cbiIsIGNvdW50KTsKKwl9CisKKwlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MGQ0LAorCSAgICAiY2h1bmsgLT4gb2ZmPSVsbHggY291bnQ9JXp4XG4iLCBvZmYsIGNvdW50KTsKKwltZW1jcHkoaGEtPmZ3X2R1bXBfdGVtcGxhdGUgKyBvZmYsIGJ1ZiwgY291bnQpOworCisJaWYgKG9mZiArIGNvdW50ID09IGhhLT5md19kdW1wX3RlbXBsYXRlX2xlbikgeworCQlzaXplID0gcWxhMjd4eF9md2R0X2NhbGN1bGF0ZV9kdW1wX3NpemUodmhhKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzBkNSwKKwkJICAgICItPiBhbGxvY2F0aW5nIGZ3ZHVtcCAoJXggYnl0ZXMpLi4uXG4iLCBzaXplKTsKKwkJaGEtPmZ3X2R1bXAgPSB2bWFsbG9jKHNpemUpOworCQlpZiAoIWhhLT5md19kdW1wKSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MGQ2LAorCQkJICAgICJGYWlsZWQgYWxsb2NhdGUgZndkdW1wICgleCBieXRlcykuXG4iLCBzaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWhhLT5md19kdW1wX2xlbiA9IHNpemU7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHN5c2ZzX2Z3X2R1bXBfdGVtcGxhdGVfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAiZndfZHVtcF90ZW1wbGF0ZSIsCisJCS5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBxbGEyeDAwX3N5c2ZzX3JlYWRfZndfZHVtcF90ZW1wbGF0ZSwKKwkud3JpdGUgPSBxbGEyeDAwX3N5c2ZzX3dyaXRlX2Z3X2R1bXBfdGVtcGxhdGUsCit9OworCitzdGF0aWMgc3NpemVfdAogcWxhMngwMF9zeXNmc19yZWFkX252cmFtKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCSBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJCQkgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCkBAIC0yNDEsMTIgKzMyNywxNyBAQAogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKIAkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzc2l6ZV90IHJ2YWwgPSAwOwogCiAJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NSRUFESU5HKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLCBoYS0+b3B0cm9tX2J1ZmZlciwKLQkJCQkJaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CisJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CisJcnZhbCA9IG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsIGhhLT5vcHRyb21fYnVmZmVyLAorCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKKwltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOworCisJcmV0dXJuIHJ2YWw7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0yNjUsNyArMzU2LDkgQEAKIAlpZiAob2ZmICsgY291bnQgPiBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKQogCQljb3VudCA9IGhhLT5vcHRyb21fcmVnaW9uX3NpemUgLSBvZmY7CiAKKwltdXRleF9sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAltZW1jcHkoJmhhLT5vcHRyb21fYnVmZmVyW29mZl0sIGJ1ZiwgY291bnQpOworCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yODgsMTAgKzM4MSwxMCBAQAogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKIAkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQogCXVpbnQzMl90IHN0YXJ0ID0gMDsKIAl1aW50MzJfdCBzaXplID0gaGEtPm9wdHJvbV9zaXplOwogCWludCB2YWwsIHZhbGlkOworCXNzaXplX3QgcnZhbCA9IGNvdW50OwogCiAJaWYgKG9mZikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDQsMTIgKzM5NywxNCBAQAogCWlmIChzdGFydCA+IGhhLT5vcHRyb21fc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltdXRleF9sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgMDoKIAkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NSRUFESU5HICYmCi0JCSAgICBoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV1JJVElORykKLQkJCXJldHVybiAtRUlOVkFMOwotCisJCSAgICBoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV1JJVElORykgeworCQkJcnZhbCA9ICAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKIAogCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDYxLApAQCAtMzIwLDggKzQxNSwxMCBAQAogCQloYS0+b3B0cm9tX2J1ZmZlciA9IE5VTEw7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV0FJVElORykgeworCQkJcnZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCWhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0ID0gc3RhcnQ7CiAJCWhhLT5vcHRyb21fcmVnaW9uX3NpemUgPSBzdGFydCArIHNpemUgPiBoYS0+b3B0cm9tX3NpemUgPwpAQCAtMzM1LDEzICs0MzIsMTUgQEAKIAkJCSAgICAiKCV4KS5cbiIsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlydmFsID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDYzLAogCQkJICAgICJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBOVlJBTSB1cGRhdGUuXG4iKTsKLQkJCXJldHVybiAtRUFHQUlOOworCQkJcnZhbCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjQsCkBAIC0zNTMsOCArNDUyLDEwIEBACiAJCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV0FJVElORykgeworCQkJcnZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gYmUgbW9yZSByZXN0cmljdGl2ZSBvbiB3aGljaCBGTEFTSCByZWdpb25zIGFyZQpAQCAtMzg4LDcgKzQ4OSw4IEBACiAJCWlmICghdmFsaWQpIHsKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjUsCiAJCQkgICAgIkludmFsaWQgc3RhcnQgcmVnaW9uIDB4JXgvMHgleC5cbiIsIHN0YXJ0LCBzaXplKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcnZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCWhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0ID0gc3RhcnQ7CkBAIC00MDMsNyArNTA1LDggQEAKIAkJCSAgICAiKCV4KVxuIiwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJ2YWwgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDY3LApAQCAtNDEzLDEzICs1MTYsMTYgQEAKIAkJbWVtc2V0KGhhLT5vcHRyb21fYnVmZmVyLCAwLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXUklUSU5HKSB7CisJCQlydmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDY4LAogCQkJICAgICJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBmbGFzaCB1cGRhdGUuXG4iKTsKLQkJCXJldHVybiAtRUFHQUlOOworCQkJcnZhbCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjksCkBAIC00MzAsOSArNTM2LDEyIEBACiAJCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQlydmFsID0gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIGNvdW50OworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKKwlyZXR1cm4gcnZhbDsKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHN5c2ZzX29wdHJvbV9jdGxfYXR0ciA9IHsKQEAgLTgyMiw2ICs5MzEsNyBAQAogCWludCBpczRHQnBfb25seTsKIH0gYmluX2ZpbGVfZW50cmllc1tdID0gewogCXsgImZ3X2R1bXAiLCAmc3lzZnNfZndfZHVtcF9hdHRyLCB9LAorCXsgImZ3X2R1bXBfdGVtcGxhdGUiLCAmc3lzZnNfZndfZHVtcF90ZW1wbGF0ZV9hdHRyLCAweDI3IH0sCiAJeyAibnZyYW0iLCAmc3lzZnNfbnZyYW1fYXR0ciwgfSwKIAl7ICJvcHRyb20iLCAmc3lzZnNfb3B0cm9tX2F0dHIsIH0sCiAJeyAib3B0cm9tX2N0bCIsICZzeXNmc19vcHRyb21fY3RsX2F0dHIsIH0sCkBAIC04NDcsNiArOTU3LDggQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoaXRlci0+aXM0R0JwX29ubHkgPT0gMyAmJiAhKElTX0NOQV9DQVBBQkxFKHZoYS0+aHcpKSkKIAkJCWNvbnRpbnVlOworCQlpZiAoaXRlci0+aXM0R0JwX29ubHkgPT0gMHgyNyAmJiAhSVNfUUxBMjdYWCh2aGEtPmh3KSkKKwkJCWNvbnRpbnVlOwogCiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCiAJCSAgICBpdGVyLT5hdHRyKTsKQEAgLTExODcsNyArMTI5OSw3IEBACiAJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JaWYgKCFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkpCisJaWYgKCFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkgJiYgIUlTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiXG4iKTsKIAogCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZC4lMDJkLiUwMmQgKCVkKVxuIiwKQEAgLTEzOTEsNiArMTUwMywzNyBAQAogCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2l6ZSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX2FsbG93X2NuYV9md19kdW1wX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCisJaWYgKCFJU19QM1BfVFlQRSh2aGEtPmh3KSkKKwkJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIlxuIik7CisJZWxzZQorCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCSAgICB2aGEtPmh3LT5hbGxvd19jbmFfZndfZHVtcCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9hbGxvd19jbmFfZndfZHVtcF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlpbnQgdmFsID0gMDsKKworCWlmICghSVNfUDNQX1RZUEUodmhhLT5odykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZ2YWwpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJdmhhLT5ody0+YWxsb3dfY25hX2Z3X2R1bXAgPSB2YWwgIT0gMDsKKworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKGRyaXZlcl92ZXJzaW9uLCBTX0lSVUdPLCBxbGEyeDAwX2RydnJfdmVyc2lvbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihmd192ZXJzaW9uLCBTX0lSVUdPLCBxbGEyeDAwX2Z3X3ZlcnNpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc2VyaWFsX251bSwgU19JUlVHTywgcWxhMngwMF9zZXJpYWxfbnVtX3Nob3csIE5VTEwpOwpAQCAtMTQzMiw2ICsxNTc1LDkgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihkaWFnX3JlcXVlc3RzLCBTX0lSVUdPLCBxbGEyeDAwX2RpYWdfcmVxdWVzdHNfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZGlhZ19tZWdhYnl0ZXMsIFNfSVJVR08sIHFsYTJ4MDBfZGlhZ19tZWdhYnl0ZXNfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZndfZHVtcF9zaXplLCBTX0lSVUdPLCBxbGEyeDAwX2Z3X2R1bXBfc2l6ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGxvd19jbmFfZndfZHVtcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHFsYTJ4MDBfYWxsb3dfY25hX2Z3X2R1bXBfc2hvdywKKwkJICAgcWxhMngwMF9hbGxvd19jbmFfZndfZHVtcF9zdG9yZSk7CiAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpxbGEyeDAwX2hvc3RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfZHJpdmVyX3ZlcnNpb24sCkBAIC0xNDY0LDYgKzE2MTAsNyBAQAogCSZkZXZfYXR0cl9kaWFnX3JlcXVlc3RzLAogCSZkZXZfYXR0cl9kaWFnX21lZ2FieXRlcywKIAkmZGV2X2F0dHJfZndfZHVtcF9zaXplLAorCSZkZXZfYXR0cl9hbGxvd19jbmFfZndfZHVtcCwKIAlOVUxMLAogfTsKIApAQCAtMTUwOSw2ICsxNjU2LDkgQEAKIAljYXNlIFBPUlRfU1BFRURfMTZHQjoKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMTZHQklUOwogCQlicmVhazsKKwljYXNlIFBPUlRfU1BFRURfMzJHQjoKKwkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMzJHQklUOworCQlicmVhazsKIAl9CiAJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBzcGVlZDsKIH0KQEAgLTIxNjAsNiArMjMxMCw5IEBACiAJZWxzZSBpZiAoSVNfUUxBRlgwMChoYSkpCiAJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzhHQklUIHwgRkNfUE9SVFNQRUVEXzRHQklUIHwKIAkJICAgIEZDX1BPUlRTUEVFRF8yR0JJVCB8IEZDX1BPUlRTUEVFRF8xR0JJVDsKKwllbHNlIGlmIChJU19RTEEyN1hYKGhhKSkKKwkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMzJHQklUIHwgRkNfUE9SVFNQRUVEXzE2R0JJVCB8CisJCSAgICBGQ19QT1JUU1BFRURfOEdCSVQ7CiAJZWxzZQogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8xR0JJVDsKIAlmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHModmhhLT5ob3N0KSA9IHNwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCmluZGV4IGYxNWQwM2UuLjcxZmYzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKQEAgLTE0MzcsOSArMTQzNywxMiBAQAogCWlmIChoYS0+ZmxhZ3MubmljX2NvcmVfcmVzZXRfaGRscl9hY3RpdmUpCiAJCXJldHVybiAtRUJVU1k7CiAKKwltdXRleF9sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAlydmFsID0gcWxhMngwMF9vcHRyb21fc2V0dXAoYnNnX2pvYiwgdmhhLCAwKTsKLQlpZiAocnZhbCkKKwlpZiAocnZhbCkgeworCQltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCQlyZXR1cm4gcnZhbDsKKwl9CiAKIAloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCBoYS0+b3B0cm9tX2J1ZmZlciwKIAkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwpAQCAtMTQ1Myw2ICsxNDU2LDcgQEAKIAl2ZnJlZShoYS0+b3B0cm9tX2J1ZmZlcik7CiAJaGEtPm9wdHJvbV9idWZmZXIgPSBOVUxMOwogCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7CisJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAlic2dfam9iLT5qb2JfZG9uZShic2dfam9iKTsKIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTE0NjUsOSArMTQ2OSwxMiBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWludCBydmFsID0gMDsKIAorCW11dGV4X2xvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCXJ2YWwgPSBxbGEyeDAwX29wdHJvbV9zZXR1cChic2dfam9iLCB2aGEsIDEpOwotCWlmIChydmFsKQorCWlmIChydmFsKSB7CisJCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJCXJldHVybiBydmFsOworCX0KIAogCS8qIFNldCB0aGUgaXNwODJ4eF9ub19tZF9jYXAgbm90IHRvIGNhcHR1cmUgbWluaWR1bXAgKi8KIAloYS0+ZmxhZ3MuaXNwODJ4eF9ub19tZF9jYXAgPSAxOwpAQCAtMTQ4Myw2ICsxNDkwLDcgQEAKIAl2ZnJlZShoYS0+b3B0cm9tX2J1ZmZlcik7CiAJaGEtPm9wdHJvbV9idWZmZXIgPSBOVUxMOwogCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7CisJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAlic2dfam9iLT5qb2JfZG9uZShic2dfam9iKTsKIAlyZXR1cm4gcnZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCBmNjEwM2Y1Li45NzI1NWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0xMSwxMyArMTEsMTUgQEAKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIHwgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICB8ICAgTGFzdCBWYWx1ZSBVc2VkICB8ICAgICBIb2xlcwl8CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IE1vZHVsZSBJbml0IGFuZCBQcm9iZSAgICAgICAgfCAgICAgICAweDAxNWIgICAgICAgfCAweDRiLDB4YmEsMHhmYSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDB4MDE1YQl8Ci0gKiB8IE1haWxib3ggY29tbWFuZHMgICAgICAgICAgICAgfCAgICAgICAweDExODcgICAgICAgfCAweDExMWEtMHgxMTFiICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDExNTUtMHgxMTU4ICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDEwMTgtMHgxMDE5ICB8CisgKiB8IE1vZHVsZSBJbml0IGFuZCBQcm9iZSAgICAgICAgfCAgICAgICAweDAxN2QgICAgICAgfCAweDAwNGIsMHgwMTQxCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MDE0NCwweDAxNDYJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgwMTViLTB4MDE2MAl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDAxNmUtMHgwMTcwCXwKKyAqIHwgTWFpbGJveCBjb21tYW5kcyAgICAgICAgICAgICB8ICAgICAgIDB4MTE4NyAgICAgICB8IDB4MTAxOC0weDEwMTkJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMGNhICAgICAgICAgfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMTE1LTB4MTExNiAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMGNhCQl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDExMWEtMHgxMTFiCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTE1NS0weDExNTggIHwKICAqIHwgRGV2aWNlIERpc2NvdmVyeSAgICAgICAgICAgICB8ICAgICAgIDB4MjA5NSAgICAgICB8IDB4MjAyMC0weDIwMjIsIHwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MjAxMS0weDIwMTIsIHwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MjAxNiAgICAgICAgIHwKQEAgLTMyLDE4ICszNCwxNyBAQAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg1MDQ3LDB4NTA1MiAgfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg1MDg0LDB4NTA3NQl8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDUwM2QsMHg1MDQ0ICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDUwN2IJCXwKICAqIHwgVGltZXIgUm91dGluZXMgICAgICAgICAgICAgICB8ICAgICAgIDB4NjAxMiAgICAgICB8ICAgICAgICAgICAgICAgIHwKLSAqIHwgVXNlciBTcGFjZSBJbnRlcmFjdGlvbnMgICAgICB8ICAgICAgIDB4NzBlMSAgICAgICB8IDB4NzAxOCwweDcwMmUsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzAyMCwweDcwMjQsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzAzOSwweDcwNDUsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzA3My0weDcwNzUsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzA3YiwweDcwOGMsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBhNSwweDcwYTYsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBhOCwweDcwYWIsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBhZC0weDcwYWUsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBkMS0weDcwZGIsIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzA0NywweDcwM2IJfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg3MGRlLTB4NzBkZiwgfAorICogfCBVc2VyIFNwYWNlIEludGVyYWN0aW9ucyAgICAgIHwgICAgICAgMHg3MGUyICAgICAgIHwgMHg3MDE4LDB4NzAyZSAgfAorICogfAkJCQkgIHwJCSAgICAgICB8IDB4NzAyMCwweDcwMjQgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzAzOSwweDcwNDUgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzA3My0weDcwNzUgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBhNS0weDcwYTYgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBhOCwweDcwYWIgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBhZC0weDcwYWUgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBkNy0weDcwZGIgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBkZS0weDcwZGYgIHwKICAqIHwgVGFzayBNYW5hZ2VtZW50ICAgICAgICAgICAgICB8ICAgICAgIDB4ODAzZCAgICAgICB8IDB4ODAyNS0weDgwMjYgIHwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4ODAwYiwweDgwMzkgIHwKICAqIHwgQUVSL0VFSCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4OTAxMSAgICAgICB8CQl8CkBAIC01OSw3ICs2MCwxMSBAQAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhiMTNjLTB4YjE0MCAgfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhiMTQ5CQl8CiAgKiB8IE11bHRpUSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweGMwMGMgICAgICAgfAkJfAotICogfCBNaXNjICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHhkMDEwICAgICAgIHwJCXwKKyAqIHwgTWlzYyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4ZDJmZiAgICAgICB8IDB4ZDAxNy0weGQwMTkJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhkMDIwCQl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGQwMmUtMHhkMGZmCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4ZDEwMS0weGQxZmUJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhkMjEyLTB4ZDJmZQl8CiAgKiB8IFRhcmdldCBNb2RlCQkgIHwJICAweGUwNzAgICAgICAgfCAweGUwMjEJCXwKICAqIHwgVGFyZ2V0IE1vZGUgTWFuYWdlbWVudAkgIHwJICAweGYwNzIgICAgICAgfCAweGYwMDItMHhmMDAzCXwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4ZjA0Ni0weGYwNDkgIHwKQEAgLTEwNCw3ICsxMDksODcgQEAKIAlyZXR1cm4gcHRyICsgKHJzcC0+bGVuZ3RoICogc2l6ZW9mKHJlc3BvbnNlX3QpKTsKIH0KIAotc3RhdGljIGludAoraW50CitxbGEyN3h4X2R1bXBfbXBpX3JhbShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCAqcmFtLAorCXVpbnQzMl90IHJhbV9kd29yZHMsIHZvaWQgKipueHQpCit7CisJaW50IHJ2YWw7CisJdWludDMyX3QgY250LCBzdGF0LCB0aW1lciwgZHdvcmRzLCBpZHg7CisJdWludDE2X3QgbWIwLCBtYjE7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CisJZG1hX2FkZHJfdCBkdW1wX2RtYSA9IGhhLT5naWRfbGlzdF9kbWE7CisJdWludDMyX3QgKmR1bXAgPSAodWludDMyX3QgKiloYS0+Z2lkX2xpc3Q7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisJbWIwID0gMDsKKworCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MCwgTUJDX0xPQURfRFVNUF9NUElfUkFNKTsKKwljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCWR3b3JkcyA9IHFsYTJ4MDBfZ2lkX2xpc3Rfc2l6ZShoYSkgLyA0OworCWZvciAoY250ID0gMDsgY250IDwgcmFtX2R3b3JkcyAmJiBydmFsID09IFFMQV9TVUNDRVNTOworCSAgICBjbnQgKz0gZHdvcmRzLCBhZGRyICs9IGR3b3JkcykgeworCQlpZiAoY250ICsgZHdvcmRzID4gcmFtX2R3b3JkcykKKwkJCWR3b3JkcyA9IHJhbV9kd29yZHMgLSBjbnQ7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3gxLCBMU1coYWRkcikpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDgsIE1TVyhhZGRyKSk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3gyLCBNU1coZHVtcF9kbWEpKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3gzLCBMU1coZHVtcF9kbWEpKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g2LCBNU1coTVNEKGR1bXBfZG1hKSkpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDcsIExTVyhNU0QoZHVtcF9kbWEpKSk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g0LCBNU1coZHdvcmRzKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NSwgTFNXKGR3b3JkcykpOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94OSwgMCk7CisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfU0VUX0hPU1RfSU5UKTsKKworCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAwOworCQlmb3IgKHRpbWVyID0gNjAwMDAwMDsgdGltZXI7IHRpbWVyLS0pIHsKKwkJCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCisJCQlzdGF0ID0gUkRfUkVHX0RXT1JEKCZyZWctPmhvc3Rfc3RhdHVzKTsKKwkJCWlmIChzdGF0ICYgSFNSWF9SSVNDX0lOVCkgeworCQkJCXN0YXQgJj0gMHhmZjsKKworCQkJCWlmIChzdGF0ID09IDB4MSB8fCBzdGF0ID09IDB4MiB8fAorCQkJCSAgICBzdGF0ID09IDB4MTAgfHwgc3RhdCA9PSAweDExKSB7CisJCQkJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwKKwkJCQkJICAgICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJCQkJbWIwID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDApOworCQkJCQltYjEgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSk7CisKKwkJCQkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLAorCQkJCQkgICAgSENDUlhfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBDbGVhciB0aGlzIGludHI7IGl0IHdhc24ndCBhIG1haWxib3ggaW50ciAqLworCQkJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfQ0xSX1JJU0NfSU5UKTsKKwkJCQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CisJCQl9CisJCQl1ZGVsYXkoNSk7CisJCX0KKwkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMTsKKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncykpIHsKKwkJCXJ2YWwgPSBtYjAgJiBNQlNfTUFTSzsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgZHdvcmRzOyBpZHgrKykKKwkJCQlyYW1bY250ICsgaWR4XSA9IElTX1FMQTI3WFgoaGEpID8KKwkJCQkgICAgbGUzMl90b19jcHUoZHVtcFtpZHhdKSA6IHN3YWIzMihkdW1wW2lkeF0pOworCQl9IGVsc2UgeworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKwl9CisKKwkqbnh0ID0gcnZhbCA9PSBRTEFfU1VDQ0VTUyA/ICZyYW1bY250XSA6IE5VTEw7CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAogcWxhMjR4eF9kdW1wX3JhbShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCAqcmFtLAogICAgIHVpbnQzMl90IHJhbV9kd29yZHMsIHZvaWQgKipueHQpCiB7CkBAIC0xMzksNiArMjI0LDcgQEAKIAkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g1LCBMU1coZHdvcmRzKSk7CiAJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfU0VUX0hPU1RfSU5UKTsKIAorCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAwOwogCQlmb3IgKHRpbWVyID0gNjAwMDAwMDsgdGltZXI7IHRpbWVyLS0pIHsKIAkJCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCiAJCQlzdGF0ID0gUkRfUkVHX0RXT1JEKCZyZWctPmhvc3Rfc3RhdHVzKTsKQEAgLTE2NCwxMSArMjUwLDEzIEBACiAJCQl9CiAJCQl1ZGVsYXkoNSk7CiAJCX0KKwkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMTsKIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncykpIHsKIAkJCXJ2YWwgPSBtYjAgJiBNQlNfTUFTSzsKIAkJCWZvciAoaWR4ID0gMDsgaWR4IDwgZHdvcmRzOyBpZHgrKykKLQkJCQlyYW1bY250ICsgaWR4XSA9IHN3YWIzMihkdW1wW2lkeF0pOworCQkJCXJhbVtjbnQgKyBpZHhdID0gSVNfUUxBMjdYWChoYSkgPworCQkJCSAgICBsZTMyX3RvX2NwdShkdW1wW2lkeF0pIDogc3dhYjMyKGR1bXBbaWR4XSk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfQpAQCAtMjA4LDcgKzI5Niw3IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK2ludAogcWxhMjR4eF9wYXVzZV9yaXNjKHN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnKQogewogCWludCBydmFsID0gUUxBX1NVQ0NFU1M7CkBAIC0yMjcsNyArMzE1LDcgQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAotc3RhdGljIGludAoraW50CiBxbGEyNHh4X3NvZnRfcmVzZXQoc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOwpAQCAtNTM3LDcgKzYyNSw3IEBACiAJc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4gKm1xID0gcHRyOwogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CiAKLQlpZiAoIWhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkKKwlpZiAoIWhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuIHB0cjsKIAogCW1xID0gcHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCmluZGV4IDM1ZTIwYjQuLmNjOTYxMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKQEAgLTM0OCwzICszNDgsMTAgQEAKICNkZWZpbmUgcWxfZGJnX3RndAkweDAwMDA0MDAwIC8qIFRhcmdldCBtb2RlICovCiAjZGVmaW5lIHFsX2RiZ190Z3RfbWd0CTB4MDAwMDIwMDAgLyogVGFyZ2V0IG1vZGUgbWFuYWdlbWVudCAqLwogI2RlZmluZSBxbF9kYmdfdGd0X3RtcgkweDAwMDAxMDAwIC8qIFRhcmdldCBtb2RlIHRhc2sgbWFuYWdlbWVudCAqLworCitleHRlcm4gaW50IHFsYTI3eHhfZHVtcF9tcGlfcmFtKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MzJfdCwgdWludDMyX3QgKiwKKwl1aW50MzJfdCwgdm9pZCAqKik7CitleHRlcm4gaW50IHFsYTI0eHhfZHVtcF9yYW0oc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQzMl90LCB1aW50MzJfdCAqLAorCXVpbnQzMl90LCB2b2lkICoqKTsKK2V4dGVybiBpbnQgcWxhMjR4eF9wYXVzZV9yaXNjKHN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqKTsKK2V4dGVybiBpbnQgcWxhMjR4eF9zb2Z0X3Jlc2V0KHN0cnVjdCBxbGFfaHdfZGF0YSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCAyNjY3MjRiLi42YTEwNjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC02NTQsNyArNjU0LDcgQEAKIAkJc3RydWN0IGRldmljZV9yZWdfMjV4eG1xIGlzcDI1bXE7CiAJCXN0cnVjdCBkZXZpY2VfcmVnXzgyeHggaXNwODI7CiAJCXN0cnVjdCBkZXZpY2VfcmVnX2Z4MDAgaXNwZngwMDsKLX0gZGV2aWNlX3JlZ190OworfSBfX2lvbWVtIGRldmljZV9yZWdfdDsKIAogI2RlZmluZSBJU1BfUkVRX1FfSU4oaGEsIHJlZykgXAogCShJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSA/IFwKQEAgLTgwOCw3ICs4MDgsNyBAQAogCQkJCQkgICBOb3RpZmljYXRpb24gKi8KICNkZWZpbmUgTUJBX0ZXX1BPTExfU1RBVEUJMHg4NjAwICAvKiBGaXJtd2FyZSBpbiBwb2xsIGRpYWdub3N0aWMgc3RhdGUgKi8KICNkZWZpbmUgTUJBX0ZXX1JFU0VUX0ZDVAkweDg1MDIJLyogRmlybXdhcmUgcmVzZXQgZmFjdG9yeSBkZWZhdWx0cyAqLwotCisjZGVmaW5lIE1CQV9GV19JTklUX0lOUFJPR1JFU1MJMHg4NTAwCS8qIEZpcm13YXJlIGJvb3QgaW4gcHJvZ3Jlc3MgKi8KIC8qIDgzWFggRkNvRSBzcGVjaWZpYyAqLwogI2RlZmluZSBNQkFfSURDX0FFTgkJMHg4MjAwICAvKiBGQ29FOiBOSUMgQ29yZSBzdGF0ZSBjaGFuZ2UgQUVOICovCiAKQEAgLTkzOCw2ICs5MzgsNyBAQAogICovCiAjZGVmaW5lIE1CQ19XUklURV9TRVJERVMJCTB4MwkvKiBXcml0ZSBzZXJkZXMgd29yZC4gKi8KICNkZWZpbmUgTUJDX1JFQURfU0VSREVTCQkJMHg0CS8qIFJlYWQgc2VyZGVzIHdvcmQuICovCisjZGVmaW5lIE1CQ19MT0FEX0RVTVBfTVBJX1JBTQkJMHg1CS8qIExvYWQvRHVtcCBNUEkgUkFNLiAqLwogI2RlZmluZSBNQkNfU0VSREVTX1BBUkFNUwkJMHgxMAkvKiBTZXJkZXMgVHggUGFyYW1ldGVycy4gKi8KICNkZWZpbmUgTUJDX0dFVF9JT0NCX1NUQVRVUwkJMHgxMgkvKiBHZXQgSU9DQiBzdGF0dXMgY29tbWFuZC4gKi8KICNkZWZpbmUgTUJDX1BPUlRfUEFSQU1TCQkJMHgxQQkvKiBQb3J0IGlETUEgUGFyYW1ldGVycy4gKi8KQEAgLTExOTcsMzAgKzExOTgsNiBAQAogCXVpbnQ4X3QgIHJlc2VydmVkXzNbMjZdOwogfSBpbml0X2NiX3Q7CiAKLQotc3RydWN0IGluaXRfY2JfZnggewotCXVpbnQxNl90CXZlcnNpb247Ci0JdWludDE2X3QJcmVzZXJ2ZWRfMVsxM107Ci0JX19sZTE2CQlyZXF1ZXN0X3Ffb3V0cG9pbnRlcjsKLQlfX2xlMTYJCXJlc3BvbnNlX3FfaW5wb2ludGVyOwotCXVpbnQxNl90CXJlc2VydmVkXzJbMl07Ci0JX19sZTE2CQlyZXNwb25zZV9xX2xlbmd0aDsKLQlfX2xlMTYJCXJlcXVlc3RfcV9sZW5ndGg7Ci0JdWludDE2X3QJcmVzZXJ2ZWRfM1syXTsKLQlfX2xlMzIJCXJlcXVlc3RfcV9hZGRyZXNzWzJdOwotCV9fbGUzMgkJcmVzcG9uc2VfcV9hZGRyZXNzWzJdOwotCXVpbnQxNl90CXJlc2VydmVkXzRbNF07Ci0JdWludDhfdAkJcmVzcG9uc2VfcV9tc2l2ZWM7Ci0JdWludDhfdAkJcmVzZXJ2ZWRfNVsxOV07Ci0JdWludDE2X3QJaW50ZXJydXB0X2RlbGF5X3RpbWVyOwotCXVpbnQxNl90CXJlc2VydmVkXzY7Ci0JdWludDMyX3QJZndvcHRpb25zMTsKLQl1aW50MzJfdAlmd29wdGlvbnMyOwotCXVpbnQzMl90CWZ3b3B0aW9uczM7Ci0JdWludDhfdAkJcmVzZXJ2ZWRfN1syNF07Ci19OwotCi0KIC8qCiAgKiBHZXQgTGluayBTdGF0dXMgbWFpbGJveCBjb21tYW5kIHJldHVybiBidWZmZXIuCiAgKi8KQEAgLTIxNzIsNiArMjE0OSw3IEBACiAjZGVmaW5lIEZETUlfUE9SVF9TUEVFRF80R0IJCTB4OAogI2RlZmluZSBGRE1JX1BPUlRfU1BFRURfOEdCCQkweDEwCiAjZGVmaW5lIEZETUlfUE9SVF9TUEVFRF8xNkdCCQkweDIwCisjZGVmaW5lIEZETUlfUE9SVF9TUEVFRF8zMkdCCQkweDQwCiAjZGVmaW5lIEZETUlfUE9SVF9TUEVFRF9VTktOT1dOCQkweDgwMDAKIAogc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyIHsKQEAgLTI2ODAsNyArMjY1OCw3IEBACiAjZGVmaW5lIFFMQV9NUV9TSVpFIDMyCiAjZGVmaW5lIFFMQV9NQVhfUVVFVUVTIDI1NgogI2RlZmluZSBJU1BfUVVFX1JFRyhoYSwgaWQpIFwKLQkoKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkgPyBcCisJKChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpID8gXAogCSAoKHZvaWQgX19pb21lbSAqKWhhLT5tcWlvYmFzZSArIChRTEFfUVVFX1BBR0UgKiBpZCkpIDpcCiAJICgodm9pZCBfX2lvbWVtICopaGEtPmlvYmFzZSkpCiAjZGVmaW5lIFFMQV9SRVFfUVVFX0lEKHRhZykgXApAQCAtMjgxOCw3ICsyNzk2LDYgQEAKIAkJdWludDMyX3QJZmFjX3N1cHBvcnRlZAkJOjE7CiAKIAkJdWludDMyX3QJY2hpcF9yZXNldF9kb25lCQk6MTsKLQkJdWludDMyX3QJcG9ydDAJCQk6MTsKIAkJdWludDMyX3QJcnVubmluZ19nb2xkX2Z3CQk6MTsKIAkJdWludDMyX3QJZWVoX2J1c3kJCToxOwogCQl1aW50MzJfdAljcHVfYWZmaW5pdHlfZW5hYmxlZAk6MTsKQEAgLTI4NDksNyArMjgyNiw3IEBACiAJc3BpbmxvY2tfdAloYXJkd2FyZV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAlpbnQJCWJhcnM7CiAJaW50CQltZW1fb25seTsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqaW9iYXNlOyAgICAgICAgICAgLyogQmFzZSBJL08gYWRkcmVzcyAqLworCWRldmljZV9yZWdfdCAqaW9iYXNlOyAgICAgICAgICAgLyogQmFzZSBJL08gYWRkcmVzcyAqLwogCXJlc291cmNlX3NpemVfdCBwaW9fYWRkcmVzczsKIAogI2RlZmluZSBNSU5fSU9CQVNFX0xFTiAgICAgICAgICAweDEwMApAQCAtMjg2OCw4ICsyODQ1LDggQEAKIAl1aW50MzJfdAkJcnNwX3F1ZV9vZmY7CiAKIAkvKiBNdWx0aSBxdWV1ZSBkYXRhIHN0cnVjdHMgKi8KLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqbXFpb2Jhc2U7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKm1zaXhiYXNlOworCWRldmljZV9yZWdfdCAqbXFpb2Jhc2U7CisJZGV2aWNlX3JlZ190ICptc2l4YmFzZTsKIAl1aW50MTZfdCAgICAgICAgbXNpeF9jb3VudDsKIAl1aW50OF90ICAgICAgICAgbXFlbmFibGU7CiAJc3RydWN0IHJlcV9xdWUgKipyZXFfcV9tYXA7CkBAIC0yOTA1LDYgKzI4ODIsNyBAQAogI2RlZmluZSBQT1JUX1NQRUVEXzRHQiAgMHgwMwogI2RlZmluZSBQT1JUX1NQRUVEXzhHQiAgMHgwNAogI2RlZmluZSBQT1JUX1NQRUVEXzE2R0IgMHgwNQorI2RlZmluZSBQT1JUX1NQRUVEXzMyR0IgMHgwNgogI2RlZmluZSBQT1JUX1NQRUVEXzEwR0IJMHgxMwogCXVpbnQxNl90CWxpbmtfZGF0YV9yYXRlOyAgICAgICAgIC8qIEYvVyBvcGVyYXRpbmcgc3BlZWQgKi8KIApAQCAtMjkyOCw2ICsyOTA2LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAwMQkweDgwMDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAzMQkweDgwMzEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjAzMQkweDIwMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjA3MQkweDIwNzEKIAl1aW50MzJfdAlkZXZpY2VfdHlwZTsKICNkZWZpbmUgRFRfSVNQMjEwMCAgICAgICAgICAgICAgICAgICAgICBCSVRfMAogI2RlZmluZSBEVF9JU1AyMjAwICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCkBAIC0yOTQ4LDcgKzI5MjcsOCBAQAogI2RlZmluZSBEVF9JU1A4MDMxCQkJQklUXzE2CiAjZGVmaW5lIERUX0lTUEZYMDAJCQlCSVRfMTcKICNkZWZpbmUgRFRfSVNQODA0NAkJCUJJVF8xOAotI2RlZmluZSBEVF9JU1BfTEFTVAkJCShEVF9JU1A4MDQ0IDw8IDEpCisjZGVmaW5lIERUX0lTUDIwNzEJCQlCSVRfMTkKKyNkZWZpbmUgRFRfSVNQX0xBU1QJCQkoRFRfSVNQMjA3MSA8PCAxKQogCiAjZGVmaW5lIERUX1QxMF9QSSAgICAgICAgICAgICAgICAgICAgICAgQklUXzI1CiAjZGVmaW5lIERUX0lJRE1BICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI2CkBAIC0yOTc4LDYgKzI5NTgsNyBAQAogI2RlZmluZSBJU19RTEEyMDMxKGhhKQkoRFRfTUFTSyhoYSkgJiBEVF9JU1AyMDMxKQogI2RlZmluZSBJU19RTEE4MDMxKGhhKQkoRFRfTUFTSyhoYSkgJiBEVF9JU1A4MDMxKQogI2RlZmluZSBJU19RTEFGWDAwKGhhKQkoRFRfTUFTSyhoYSkgJiBEVF9JU1BGWDAwKQorI2RlZmluZSBJU19RTEEyMDcxKGhhKQkoRFRfTUFTSyhoYSkgJiBEVF9JU1AyMDcxKQogCiAjZGVmaW5lIElTX1FMQTIzWFgoaGEpICAoSVNfUUxBMjMwMChoYSkgfHwgSVNfUUxBMjMxMihoYSkgfHwgSVNfUUxBMjMyMihoYSkgfHwgXAogCQkJSVNfUUxBNjMxMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpCkBAIC0yOTg2LDYgKzI5NjcsNyBAQAogI2RlZmluZSBJU19RTEEyNVhYKGhhKSAgKElTX1FMQTI1MzIoaGEpKQogI2RlZmluZSBJU19RTEE4M1hYKGhhKQkoSVNfUUxBMjAzMShoYSkgfHwgSVNfUUxBODAzMShoYSkpCiAjZGVmaW5lIElTX1FMQTg0WFgoaGEpICAoSVNfUUxBODQzMihoYSkpCisjZGVmaW5lIElTX1FMQTI3WFgoaGEpICAoSVNfUUxBMjA3MShoYSkpCiAjZGVmaW5lIElTX1FMQTI0WFhfVFlQRShoYSkgICAgIChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEE1NFhYKGhhKSB8fCBcCiAJCQkJSVNfUUxBODRYWChoYSkpCiAjZGVmaW5lIElTX0NOQV9DQVBBQkxFKGhhKQkoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODJYWChoYSkgfHwgXApAQCAtMjk5NCwxMSArMjk3NiwxMyBAQAogI2RlZmluZSBJU19RTEEyWFhYX01JRFRZUEUoaGEpCShJU19RTEEyNFhYKGhhKSB8fCBJU19RTEE4NFhYKGhhKSB8fCBcCiAJCQkJSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwgXAogCQkJCUlTX1FMQTgyWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8IFwKLQkJCQlJU19RTEE4MDQ0KGhhKSkKKwkJCQlJU19RTEE4MDQ0KGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKICNkZWZpbmUgSVNfTVNJWF9OQUNLX0NBUEFCTEUoaGEpIChJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkKICNkZWZpbmUgSVNfTk9QT0xMSU5HX1RZUEUoaGEpCShJU19RTEE4MVhYKGhhKSAmJiAoaGEpLT5mbGFncy5tc2l4X2VuYWJsZWQpCi0jZGVmaW5lIElTX0ZBQ19SRVFVSVJFRChoYSkJKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKQotI2RlZmluZSBJU19OT0NBQ0hFX1ZQRF9UWVBFKGhhKQkoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpCisjZGVmaW5lIElTX0ZBQ19SRVFVSVJFRChoYSkJKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8IFwKKwkJCQlJU19RTEEyN1hYKGhhKSkKKyNkZWZpbmUgSVNfTk9DQUNIRV9WUERfVFlQRShoYSkJKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8IFwKKwkJCQlJU19RTEEyN1hYKGhhKSkKICNkZWZpbmUgSVNfQUxPR0lPX0NBUEFCTEUoaGEpCShJU19RTEEyM1hYKGhhKSB8fCBJU19GV0kyX0NBUEFCTEUoaGEpKQogCiAjZGVmaW5lIElTX1QxMF9QSV9DQVBBQkxFKGhhKSAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX1QxMF9QSSkKQEAgLTMwMDgsNyArMjk5Miw4IEBACiAjZGVmaW5lIElTX09FTV8wMDEoaGEpICAgICAgICAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX09FTV8wMDEpCiAjZGVmaW5lIEhBU19FWFRFTkRFRF9JRFMoaGEpICAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0VYVEVOREVEX0lEUykKICNkZWZpbmUgSVNfQ1Q2X1NVUFBPUlRFRChoYSkJKChoYSktPmRldmljZV90eXBlICYgRFRfQ1Q2X1NVUFBPUlRFRCkKLSNkZWZpbmUgSVNfTVFVRV9DQVBBQkxFKGhhKQkoKGhhKS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpCisjZGVmaW5lIElTX01RVUVfQ0FQQUJMRShoYSkJKChoYSktPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IFwKKwkJCQlJU19RTEEyN1hYKGhhKSkKICNkZWZpbmUgSVNfQklESV9DQVBBQkxFKGhhKQkoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTIwMzEoaGEpKSkKIC8qIEJpdCAyMSBvZiBmd19hdHRyaWJ1dGVzIGRlY2lkZXMgdGhlIE1DVFAgY2FwYWJpbGl0aWVzICovCiAjZGVmaW5lIElTX01DVFBfQ0FQQUJMRShoYSkJKElTX1FMQTIwMzEoaGEpICYmIFwKQEAgLTMxMzMsNiArMzExOCw5IEBACiAJdWludDE2X3QJZndfeGNiX2NvdW50OwogCXVpbnQxNl90CWZ3X2lvY2JfY291bnQ7CiAKKwl1aW50MzJfdAlmd19zaGFyZWRfcmFtX3N0YXJ0OworCXVpbnQzMl90CWZ3X3NoYXJlZF9yYW1fZW5kOworCiAJdWludDE2X3QJZndfb3B0aW9uc1sxNl07ICAgICAgICAgLyogc2xvdHM6IDEsMiwzLDEwLDExICovCiAJdWludDhfdAkJZndfc2VyaWFsbGlua19vcHRpb25zWzRdOwogCXVpbnQxNl90CWZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzRdOwpAQCAtMzE0MSw2ICszMTI5LDkgQEAKIAl1aW50MzJfdAltcGlfY2FwYWJpbGl0aWVzOwogCXVpbnQ4X3QJCXBoeV92ZXJzaW9uWzNdOwogCisJLyogRmlybXdhcmUgZHVtcCB0ZW1wbGF0ZSAqLworCXZvaWQJCSpmd19kdW1wX3RlbXBsYXRlOworCXVpbnQzMl90CWZ3X2R1bXBfdGVtcGxhdGVfbGVuOwogCS8qIEZpcm13YXJlIGR1bXAgaW5mb3JtYXRpb24uICovCiAJc3RydWN0IHFsYTJ4eHhfZndfZHVtcCAqZndfZHVtcDsKIAl1aW50MzJfdAlmd19kdW1wX2xlbjsKQEAgLTMxODMsNiArMzE3NCw3IEBACiAjZGVmaW5lIFFMQV9TV1JJVElORwkyCiAJdWludDMyX3QJb3B0cm9tX3JlZ2lvbl9zdGFydDsKIAl1aW50MzJfdAlvcHRyb21fcmVnaW9uX3NpemU7CisJc3RydWN0IG11dGV4CW9wdHJvbV9tdXRleDsKIAogLyogUENJIGV4cGFuc2lvbiBST00gaW1hZ2UgaW5mb3JtYXRpb24uICovCiAjZGVmaW5lIFJPTV9DT0RFX1RZUEVfQklPUwkwCkBAIC0zMzA5LDYgKzMzMDEsNyBAQAogCXN0cnVjdCBtcl9kYXRhX2Z4MDAgbXI7CiAKIAlzdHJ1Y3QgcWx0X2h3X2RhdGEgdGd0OworCWludAlhbGxvd19jbmFfZndfZHVtcDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKaW5kZXggNzkyYTI5Mi4uMzJhYjgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwpAQCAtMTE0LDcgKzExNCw4IEBACiB7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkpCisJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpICYmCisJICAgICFJU19RTEEyN1hYKGhhKSkKIAkJZ290byBvdXQ7CiAJaWYgKCFoYS0+ZmNlKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKaW5kZXggNjEwZDNhYTkuLjNhNzM1M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCkBAIC0xMzc4LDYgKzEzNzgsMTAgQEAKICNkZWZpbmUgRkxUX1JFR19OVlJBTV8wCQkweDE1CiAjZGVmaW5lIEZMVF9SRUdfVlBEXzEJCTB4MTYKICNkZWZpbmUgRkxUX1JFR19OVlJBTV8xCQkweDE3CisjZGVmaW5lIEZMVF9SRUdfVlBEXzIJCTB4RDQKKyNkZWZpbmUgRkxUX1JFR19OVlJBTV8yCQkweEQ1CisjZGVmaW5lIEZMVF9SRUdfVlBEXzMJCTB4RDYKKyNkZWZpbmUgRkxUX1JFR19OVlJBTV8zCQkweEQ3CiAjZGVmaW5lIEZMVF9SRUdfRkRUCQkweDFhCiAjZGVmaW5lIEZMVF9SRUdfRkxUCQkweDFjCiAjZGVmaW5lIEZMVF9SRUdfSFdfRVZFTlRfMAkweDFkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggMWY0MjY2Mi4uZTY2NWU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMzMwLDYgKzMzMCw3IEBACiAgICAgZG1hX2FkZHJfdCk7CiAKIGV4dGVybiBpbnQgcWxhMjR4eF9hYm9ydF9jb21tYW5kKHNyYl90ICopOworZXh0ZXJuIGludCBxbGEyNHh4X2FzeW5jX2Fib3J0X2NvbW1hbmQoc3JiX3QgKik7CiBleHRlcm4gaW50CiBxbGEyNHh4X2Fib3J0X3RhcmdldChzdHJ1Y3QgZmNfcG9ydCAqLCB1bnNpZ25lZCBpbnQsIGludCk7CiBleHRlcm4gaW50CkBAIC01MTEsNiArNTEyLDE2IEBACiBleHRlcm4gdm9pZCBxbGEyNHh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyNXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGE4MXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGE4Mnh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGE4MDQ0X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CisKK2V4dGVybiB2b2lkIHFsYTI3eHhfZndkdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworZXh0ZXJuIHVsb25nIHFsYTI3eHhfZndkdF9jYWxjdWxhdGVfZHVtcF9zaXplKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworZXh0ZXJuIGludCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQodm9pZCAqKTsKK2V4dGVybiB1bG9uZyBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZSh2b2lkICopOworZXh0ZXJuIGNvbnN0IHZvaWQgKnFsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0KHZvaWQpOworZXh0ZXJuIHVsb25nIHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0X3NpemUodm9pZCk7CisKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9idWZmZXIodWludDhfdCAqLCB1aW50MzJfdCk7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfYnVmZmVyX3ppcHBlZCh1aW50OF90ICosIHVpbnQzMl90KTsKQEAgLTU5NCw3ICs2MDUsNiBAQAogZXh0ZXJuIGlycXJldHVybl90IHFsYWZ4MDBfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqKTsKIGV4dGVybiB2b2lkIHFsYWZ4MDBfZW5hYmxlX2ludHJzKHN0cnVjdCBxbGFfaHdfZGF0YSAqKTsKIGV4dGVybiB2b2lkIHFsYWZ4MDBfZGlzYWJsZV9pbnRycyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7Ci1leHRlcm4gaW50IHFsYWZ4MDBfYWJvcnRfY29tbWFuZChzcmJfdCAqKTsKIGV4dGVybiBpbnQgcWxhZngwMF9hYm9ydF90YXJnZXQoZmNfcG9ydF90ICosIHVuc2lnbmVkIGludCwgaW50KTsKIGV4dGVybiBpbnQgcWxhZngwMF9sdW5fcmVzZXQoZmNfcG9ydF90ICosIHVuc2lnbmVkIGludCwgaW50KTsKIGV4dGVybiBpbnQgcWxhZngwMF9zdGFydF9zY3NpKHNyYl90ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwppbmRleCBjZDQ3ZjFiLi5lMzc3ZjlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKQEAgLTE1MzIsNiArMTUzMiwxMCBAQAogCWlmIChJU19DTkFfQ0FQQUJMRShoYSkpCiAJCWVpdGVyLT5hLnN1cF9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoCiAJCSAgICBGRE1JX1BPUlRfU1BFRURfMTBHQik7CisJZWxzZSBpZiAoSVNfUUxBMjdYWChoYSkpCisJCWVpdGVyLT5hLnN1cF9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoCisJCSAgICBGRE1JX1BPUlRfU1BFRURfMzJHQnxGRE1JX1BPUlRfU1BFRURfMTZHQnwKKwkJICAgIEZETUlfUE9SVF9TUEVFRF84R0IpOwogCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKQogCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKAogCQkgICAgRkRNSV9QT1JUX1NQRUVEXzFHQnxGRE1JX1BPUlRfU1BFRURfMkdCfApAQCAtMTU4MCw2ICsxNTg0LDEwIEBACiAJCWVpdGVyLT5hLmN1cl9zcGVlZCA9CiAJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9TUEVFRF8xNkdCKTsKIAkJYnJlYWs7CisJY2FzZSBQT1JUX1NQRUVEXzMyR0I6CisJCWVpdGVyLT5hLmN1cl9zcGVlZCA9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9TUEVFRF8zMkdCKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZWl0ZXItPmEuY3VyX3NwZWVkID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX1NQRUVEX1VOS05PV04pOwpAQCAtMTg4OSw2ICsxODk3LDkgQEAKIAkJCWNhc2UgQklUXzEwOgogCQkJCWxpc3RbaV0uZnBfc3BlZWQgPSBQT1JUX1NQRUVEXzE2R0I7CiAJCQkJYnJlYWs7CisJCQljYXNlIEJJVF84OgorCQkJCWxpc3RbaV0uZnBfc3BlZWQgPSBQT1JUX1NQRUVEXzMyR0I7CisJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNWIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCBlN2U1ZjRmLi4zOGFlYjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTI3MSw1NiArMjcxLDQ2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeDAwX2FzeW5jX3RtX2NtZF9kb25lKHZvaWQgKmRhdGEsIHZvaWQgKnB0ciwgaW50IHJlcykKK3FsYTJ4MDBfdG1mX2lvY2JfdGltZW91dCh2b2lkICpkYXRhKQoreworCXNyYl90ICpzcCA9IChzcmJfdCAqKWRhdGE7CisJc3RydWN0IHNyYl9pb2NiICp0bWYgPSAmc3AtPnUuaW9jYl9jbWQ7CisKKwl0bWYtPnUudG1mLmNvbXBfc3RhdHVzID0gQ1NfVElNRU9VVDsKKwljb21wbGV0ZSgmdG1mLT51LnRtZi5jb21wKTsKK30KKworc3RhdGljIHZvaWQKK3FsYTJ4MDBfdG1mX3NwX2RvbmUodm9pZCAqZGF0YSwgdm9pZCAqcHRyLCBpbnQgcmVzKQogewogCXNyYl90ICpzcCA9IChzcmJfdCAqKXB0cjsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKmlvY2IgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IChzY3NpX3FsYV9ob3N0X3QgKilkYXRhOwotCXVpbnQzMl90IGZsYWdzOwotCXVpbnQxNl90IGx1bjsKLQlpbnQgcnZhbDsKLQotCWlmICghdGVzdF9iaXQoVU5MT0FESU5HLCAmdmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCWZsYWdzID0gaW9jYi0+dS50bWYuZmxhZ3M7Ci0JCWx1biA9ICh1aW50MTZfdClpb2NiLT51LnRtZi5sdW47Ci0KLQkJLyogSXNzdWUgTWFya2VyIElPQ0IgKi8KLQkJcnZhbCA9IHFsYTJ4MDBfbWFya2VyKHZoYSwgdmhhLT5ody0+cmVxX3FfbWFwWzBdLAotCQkJdmhhLT5ody0+cnNwX3FfbWFwWzBdLCBzcC0+ZmNwb3J0LT5sb29wX2lkLCBsdW4sCi0JCQlmbGFncyA9PSBUQ0ZfTFVOX1JFU0VUID8gTUtfU1lOQ19JRF9MVU4gOiBNS19TWU5DX0lEKTsKLQotCQlpZiAoKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHx8IGlvY2ItPnUudG1mLmRhdGEpIHsKLQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDMwLAotCQkJICAgICJUTSBJT0NCIGZhaWxlZCAoJXgpLlxuIiwgcnZhbCk7Ci0JCX0KLQl9Ci0Jc3AtPmZyZWUoc3AtPmZjcG9ydC0+dmhhLCBzcCk7CisJc3RydWN0IHNyYl9pb2NiICp0bWYgPSAmc3AtPnUuaW9jYl9jbWQ7CisJY29tcGxldGUoJnRtZi0+dS50bWYuY29tcCk7CiB9CiAKIGludAotcWxhMngwMF9hc3luY190bV9jbWQoZmNfcG9ydF90ICpmY3BvcnQsIHVpbnQzMl90IHRtX2ZsYWdzLCB1aW50MzJfdCBsdW4sCitxbGEyeDAwX2FzeW5jX3RtX2NtZChmY19wb3J0X3QgKmZjcG9ydCwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IGx1biwKIAl1aW50MzJfdCB0YWcpCiB7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IGZjcG9ydC0+dmhhOworCXN0cnVjdCBzcmJfaW9jYiAqdG1faW9jYjsKIAlzcmJfdCAqc3A7Ci0Jc3RydWN0IHNyYl9pb2NiICp0Y2Y7Ci0JaW50IHJ2YWw7CisJaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJc3AgPSBxbGEyeDAwX2dldF9zcCh2aGEsIGZjcG9ydCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcCkKIAkJZ290byBkb25lOwogCisJdG1faW9jYiA9ICZzcC0+dS5pb2NiX2NtZDsKIAlzcC0+dHlwZSA9IFNSQl9UTV9DTUQ7CiAJc3AtPm5hbWUgPSAidG1mIjsKLQlxbGEyeDAwX2luaXRfdGltZXIoc3AsIHFsYTJ4MDBfZ2V0X2FzeW5jX3RpbWVvdXQodmhhKSArIDIpOwotCi0JdGNmID0gJnNwLT51LmlvY2JfY21kOwotCXRjZi0+dS50bWYuZmxhZ3MgPSB0bV9mbGFnczsKLQl0Y2YtPnUudG1mLmx1biA9IGx1bjsKLQl0Y2YtPnUudG1mLmRhdGEgPSB0YWc7Ci0JdGNmLT50aW1lb3V0ID0gcWxhMngwMF9hc3luY19pb2NiX3RpbWVvdXQ7Ci0Jc3AtPmRvbmUgPSBxbGEyeDAwX2FzeW5jX3RtX2NtZF9kb25lOworCXFsYTJ4MDBfaW5pdF90aW1lcihzcCwgcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpKTsKKwl0bV9pb2NiLT51LnRtZi5mbGFncyA9IGZsYWdzOworCXRtX2lvY2ItPnUudG1mLmx1biA9IGx1bjsKKwl0bV9pb2NiLT51LnRtZi5kYXRhID0gdGFnOworCXNwLT5kb25lID0gcWxhMngwMF90bWZfc3BfZG9uZTsKKwl0bV9pb2NiLT50aW1lb3V0ID0gcWxhMngwMF90bWZfaW9jYl90aW1lb3V0OworCWluaXRfY29tcGxldGlvbigmdG1faW9jYi0+dS50bWYuY29tcCk7CiAKIAlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCkBAIC0zMzAsMTQgKzMyMCwxMjEgQEAKIAkgICAgIkFzeW5jLXRtZiBoZGw9JXggbG9vcC1pZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKIAkgICAgc3AtPmhhbmRsZSwgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCiAJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKLQlyZXR1cm4gcnZhbDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRtX2lvY2ItPnUudG1mLmNvbXApOworCisJcnZhbCA9IHRtX2lvY2ItPnUudG1mLmNvbXBfc3RhdHVzID09IENTX0NPTVBMRVRFID8KKwkgICAgUUxBX1NVQ0NFU1MgOiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJaWYgKChydmFsICE9IFFMQV9TVUNDRVNTKSB8fCB0bV9pb2NiLT51LnRtZi5kYXRhKSB7CisJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDMwLAorCQkgICAgIlRNIElPQ0IgZmFpbGVkICgleCkuXG4iLCBydmFsKTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KFVOTE9BRElORywgJnZoYS0+ZHBjX2ZsYWdzKSAmJiAhSVNfUUxBRlgwMCh2aGEtPmh3KSkgeworCQlmbGFncyA9IHRtX2lvY2ItPnUudG1mLmZsYWdzOworCQlsdW4gPSAodWludDE2X3QpdG1faW9jYi0+dS50bWYubHVuOworCisJCS8qIElzc3VlIE1hcmtlciBJT0NCICovCisJCXFsYTJ4MDBfbWFya2VyKHZoYSwgdmhhLT5ody0+cmVxX3FfbWFwWzBdLAorCQkgICAgdmhhLT5ody0+cnNwX3FfbWFwWzBdLCBzcC0+ZmNwb3J0LT5sb29wX2lkLCBsdW4sCisJCSAgICBmbGFncyA9PSBUQ0ZfTFVOX1JFU0VUID8gTUtfU1lOQ19JRF9MVU4gOiBNS19TWU5DX0lEKTsKKwl9CiAKIGRvbmVfZnJlZV9zcDoKLQlzcC0+ZnJlZShmY3BvcnQtPnZoYSwgc3ApOworCXNwLT5mcmVlKHZoYSwgc3ApOwogZG9uZToKIAlyZXR1cm4gcnZhbDsKIH0KIAorc3RhdGljIHZvaWQKK3FsYTI0eHhfYWJvcnRfaW9jYl90aW1lb3V0KHZvaWQgKmRhdGEpCit7CisJc3JiX3QgKnNwID0gKHNyYl90ICopZGF0YTsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKmFidCA9ICZzcC0+dS5pb2NiX2NtZDsKKworCWFidC0+dS5hYnQuY29tcF9zdGF0dXMgPSBDU19USU1FT1VUOworCWNvbXBsZXRlKCZhYnQtPnUuYWJ0LmNvbXApOworfQorCitzdGF0aWMgdm9pZAorcWxhMjR4eF9hYm9ydF9zcF9kb25lKHZvaWQgKmRhdGEsIHZvaWQgKnB0ciwgaW50IHJlcykKK3sKKwlzcmJfdCAqc3AgPSAoc3JiX3QgKilwdHI7CisJc3RydWN0IHNyYl9pb2NiICphYnQgPSAmc3AtPnUuaW9jYl9jbWQ7CisKKwljb21wbGV0ZSgmYWJ0LT51LmFidC5jb21wKTsKK30KKworc3RhdGljIGludAorcWxhMjR4eF9hc3luY19hYm9ydF9jbWQoc3JiX3QgKmNtZF9zcCkKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IGNtZF9zcC0+ZmNwb3J0LT52aGE7CisJZmNfcG9ydF90ICpmY3BvcnQgPSBjbWRfc3AtPmZjcG9ydDsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKmFidF9pb2NiOworCXNyYl90ICpzcDsKKwlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlzcCA9IHFsYTJ4MDBfZ2V0X3NwKHZoYSwgZmNwb3J0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwKQorCQlnb3RvIGRvbmU7CisKKwlhYnRfaW9jYiA9ICZzcC0+dS5pb2NiX2NtZDsKKwlzcC0+dHlwZSA9IFNSQl9BQlRfQ01EOworCXNwLT5uYW1lID0gImFib3J0IjsKKwlxbGEyeDAwX2luaXRfdGltZXIoc3AsIHFsYTJ4MDBfZ2V0X2FzeW5jX3RpbWVvdXQodmhhKSk7CisJYWJ0X2lvY2ItPnUuYWJ0LmNtZF9obmRsID0gY21kX3NwLT5oYW5kbGU7CisJc3AtPmRvbmUgPSBxbGEyNHh4X2Fib3J0X3NwX2RvbmU7CisJYWJ0X2lvY2ItPnRpbWVvdXQgPSBxbGEyNHh4X2Fib3J0X2lvY2JfdGltZW91dDsKKwlpbml0X2NvbXBsZXRpb24oJmFidF9pb2NiLT51LmFidC5jb21wKTsKKworCXJ2YWwgPSBxbGEyeDAwX3N0YXJ0X3NwKHNwKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBkb25lX2ZyZWVfc3A7CisKKwlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA3YywKKwkgICAgIkFib3J0IGNvbW1hbmQgaXNzdWVkIC0gaGRsPSV4LCB0YXJnZXRfaWQ9JXhcbiIsCisJICAgIGNtZF9zcC0+aGFuZGxlLCBmY3BvcnQtPnRndF9pZCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhYnRfaW9jYi0+dS5hYnQuY29tcCk7CisKKwlydmFsID0gYWJ0X2lvY2ItPnUuYWJ0LmNvbXBfc3RhdHVzID09IENTX0NPTVBMRVRFID8KKwkgICAgUUxBX1NVQ0NFU1MgOiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCitkb25lX2ZyZWVfc3A6CisJc3AtPmZyZWUodmhhLCBzcCk7Citkb25lOgorCXJldHVybiBydmFsOworfQorCitpbnQKK3FsYTI0eHhfYXN5bmNfYWJvcnRfY29tbWFuZChzcmJfdCAqc3ApCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzID0gMDsKKworCXVpbnQzMl90CWhhbmRsZTsKKwlmY19wb3J0X3QJKmZjcG9ydCA9IHNwLT5mY3BvcnQ7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IGZjcG9ydC0+dmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWZvciAoaGFuZGxlID0gMTsgaGFuZGxlIDwgcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kczsgaGFuZGxlKyspIHsKKwkJaWYgKHJlcS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID09IHNwKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJaWYgKGhhbmRsZSA9PSByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzKSB7CisJCS8qIENvbW1hbmQgbm90IGZvdW5kLiAqLworCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisJaWYgKHNwLT50eXBlID09IFNSQl9GWElPQ0JfRENNRCkKKwkJcmV0dXJuIHFsYWZ4MDBfZnhfZGlzYyh2aGEsICZ2aGEtPmh3LT5tci5mY3BvcnQsCisJCSAgICBGWERJU0NfQUJPUlRfSU9DVEwpOworCisJcmV0dXJuIHFsYTI0eHhfYXN5bmNfYWJvcnRfY21kKHNwKTsKK30KKwogdm9pZAogcWxhMngwMF9hc3luY19sb2dpbl9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0LAogICAgIHVpbnQxNl90ICpkYXRhKQpAQCAtMTM3OSw3ICsxNDc2LDEyIEBACiAJfQogCiAJaGEtPmZ3X2R1bXBlZCA9IDA7Ci0JZml4ZWRfc2l6ZSA9IG1lbV9zaXplID0gZWZ0X3NpemUgPSBmY2Vfc2l6ZSA9IG1xX3NpemUgPSAwOworCWR1bXBfc2l6ZSA9IGZpeGVkX3NpemUgPSBtZW1fc2l6ZSA9IGVmdF9zaXplID0gZmNlX3NpemUgPSBtcV9zaXplID0gMDsKKwlyZXFfcV9zaXplID0gcnNwX3Ffc2l6ZSA9IDA7CisKKwlpZiAoSVNfUUxBMjdYWChoYSkpCisJCWdvdG8gdHJ5X2ZjZTsKKwogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewogCQlmaXhlZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyMTAwX2Z3X2R1bXApOwogCX0gZWxzZSBpZiAoSVNfUUxBMjNYWChoYSkpIHsKQEAgLTEzOTUsNiArMTQ5Nyw3IEBACiAJCQlmaXhlZF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHFsYTI1eHhfZndfZHVtcCwgZXh0X21lbSk7CiAJCWVsc2UKIAkJCWZpeGVkX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgcWxhMjR4eF9md19kdW1wLCBleHRfbWVtKTsKKwogCQltZW1fc2l6ZSA9IChoYS0+ZndfbWVtb3J5X3NpemUgLSAweDEwMDAwMCArIDEpICoKIAkJICAgIHNpemVvZih1aW50MzJfdCk7CiAJCWlmIChoYS0+bXFlbmFibGUpIHsKQEAgLTE0MTIsOSArMTUxNSwxNiBAQAogCQlpZiAoaGEtPnRndC5hdGlvX3JpbmcpCiAJCQltcV9zaXplICs9IGhhLT50Z3QuYXRpb19xX2xlbmd0aCAqIHNpemVvZihyZXF1ZXN0X3QpOwogCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEZpYnJlIENoYW5uZWwgRXZlbnQgQnVmZmVyLiAqLwotCQlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkpCisJCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSAmJgorCQkgICAgIUlTX1FMQTI3WFgoaGEpKQogCQkJZ290byB0cnlfZWZ0OwogCit0cnlfZmNlOgorCQlpZiAoaGEtPmZjZSkKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkJICAgIEZDRV9TSVpFLCBoYS0+ZmNlLCBoYS0+ZmNlX2RtYSk7CisKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBGaWJyZSBDaGFubmVsIEV2ZW50IEJ1ZmZlci4gKi8KIAkJdGMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEZDRV9TSVpFLCAmdGNfZG1hLAogCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGMpIHsKQEAgLTE0NDIsNyArMTU1MiwxMiBAQAogCQloYS0+ZmxhZ3MuZmNlX2VuYWJsZWQgPSAxOwogCQloYS0+ZmNlX2RtYSA9IHRjX2RtYTsKIAkJaGEtPmZjZSA9IHRjOworCiB0cnlfZWZ0OgorCQlpZiAoaGEtPmVmdCkKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkJICAgIEVGVF9TSVpFLCBoYS0+ZWZ0LCBoYS0+ZWZ0X2RtYSk7CisKIAkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBFeHRlbmRlZCBUcmFjZSBCdWZmZXIuICovCiAJCXRjID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBFRlRfU0laRSwgJnRjX2RtYSwKIAkJICAgIEdGUF9LRVJORUwpOwpAQCAtMTQ2OSwxNSArMTU4NCwyOCBAQAogCQloYS0+ZWZ0X2RtYSA9IHRjX2RtYTsKIAkJaGEtPmVmdCA9IHRjOwogCX0KKwogY29udF9hbGxvYzoKKwlpZiAoSVNfUUxBMjdYWChoYSkpIHsKKwkJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBiYSwKKwkJCSAgICAiRmFpbGVkIG1pc3NpbmcgZndkdW1wIHRlbXBsYXRlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlkdW1wX3NpemUgPSBxbGEyN3h4X2Z3ZHRfY2FsY3VsYXRlX2R1bXBfc2l6ZSh2aGEpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGZhLAorCQkgICAgIi0+IGFsbG9jYXRpbmcgZndkdW1wICgleCBieXRlcykuLi5cbiIsIGR1bXBfc2l6ZSk7CisJCWdvdG8gYWxsb2NhdGU7CisJfQorCiAJcmVxX3Ffc2l6ZSA9IHJlcS0+bGVuZ3RoICogc2l6ZW9mKHJlcXVlc3RfdCk7CiAJcnNwX3Ffc2l6ZSA9IHJzcC0+bGVuZ3RoICogc2l6ZW9mKHJlc3BvbnNlX3QpOwotCiAJZHVtcF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHFsYTJ4eHhfZndfZHVtcCwgaXNwKTsKIAlkdW1wX3NpemUgKz0gZml4ZWRfc2l6ZSArIG1lbV9zaXplICsgcmVxX3Ffc2l6ZSArIHJzcF9xX3NpemUgKyBlZnRfc2l6ZTsKIAloYS0+Y2hhaW5fb2Zmc2V0ID0gZHVtcF9zaXplOwogCWR1bXBfc2l6ZSArPSBtcV9zaXplICsgZmNlX3NpemU7CiAKK2FsbG9jYXRlOgogCWhhLT5md19kdW1wID0gdm1hbGxvYyhkdW1wX3NpemUpOwogCWlmICghaGEtPmZ3X2R1bXApIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBjNCwKQEAgLTE0OTksMTAgKzE2MjcsMTMgQEAKIAkJfQogCQlyZXR1cm47CiAJfQorCWhhLT5md19kdW1wX2xlbiA9IGR1bXBfc2l6ZTsKIAlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGM1LAogCSAgICAiQWxsb2NhdGVkICglZCBLQikgZm9yIGZpcm13YXJlIGR1bXAuXG4iLCBkdW1wX3NpemUgLyAxMDI0KTsKIAotCWhhLT5md19kdW1wX2xlbiA9IGR1bXBfc2l6ZTsKKwlpZiAoSVNfUUxBMjdYWChoYSkpCisJCXJldHVybjsKKwogCWhhLT5md19kdW1wLT5zaWduYXR1cmVbMF0gPSAnUSc7CiAJaGEtPmZ3X2R1bXAtPnNpZ25hdHVyZVsxXSA9ICdMJzsKIAloYS0+ZndfZHVtcC0+c2lnbmF0dXJlWzJdID0gJ0cnOwpAQCAtMTcxOCw5ICsxODQ5LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAl9CiAKLQlpZiAoSVNfUUxBODNYWChoYSkpCi0JCWdvdG8gc2tpcF9mYWNfY2hlY2s7Ci0KIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUyAmJiBJU19GQUNfUkVRVUlSRUQoaGEpKSB7CiAJCXVpbnQzMl90IHNpemU7CiAKQEAgLTE3MzMsOCArMTg2MSw4IEBACiAJCQkgICAgIlVuc3VwcG9ydGVkIEZBQyBmaXJtd2FyZSAoJWQuJTAyZC4lMDJkKS5cbiIsCiAJCQkgICAgaGEtPmZ3X21ham9yX3ZlcnNpb24sIGhhLT5md19taW5vcl92ZXJzaW9uLAogCQkJICAgIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKLXNraXBfZmFjX2NoZWNrOgotCQkJaWYgKElTX1FMQTgzWFgoaGEpKSB7CisKKwkJCWlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQkJCWhhLT5mbGFncy5mYWNfc3VwcG9ydGVkID0gMDsKIAkJCQlydmFsID0gUUxBX1NVQ0NFU1M7CiAJCQl9CkBAIC0xOTMzLDcgKzIwNjEsNyBAQAogCWljYi0+YXRpb19xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPnRndC5hdGlvX2RtYSkpOwogCWljYi0+YXRpb19xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnRndC5hdGlvX2RtYSkpOwogCi0JaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkgeworCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJaWNiLT5xb3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KFFMQV9ERUZBVUxUX1FVRV9RT1MpOwogCQlpY2ItPnJpZCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYocmlkKTsKIAkJaWYgKGhhLT5mbGFncy5tc2l4X2VuYWJsZWQpIHsKQEAgLTQ3OTIsMTMgKzQ5MjAsMTQgQEAKIAludiA9IGhhLT5udnJhbTsKIAogCS8qIERldGVybWluZSBOVlJBTSBzdGFydGluZyBhZGRyZXNzLiAqLwotCWlmIChoYS0+ZmxhZ3MucG9ydDApIHsKKwlpZiAoaGEtPnBvcnRfbm8gPT0gMCkgewogCQloYS0+bnZyYW1fYmFzZSA9IEZBX05WUkFNX0ZVTkMwX0FERFI7CiAJCWhhLT52cGRfYmFzZSA9IEZBX05WUkFNX1ZQRDBfQUREUjsKIAl9IGVsc2UgewogCQloYS0+bnZyYW1fYmFzZSA9IEZBX05WUkFNX0ZVTkMxX0FERFI7CiAJCWhhLT52cGRfYmFzZSA9IEZBX05WUkFNX1ZQRDFfQUREUjsKIAl9CisKIAloYS0+bnZyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnZyYW1fMjR4eCk7CiAJaGEtPnZwZF9zaXplID0gRkFfTlZSQU1fVlBEX1NJWkU7CiAKQEAgLTQ4NDIsNyArNDk3MSw3IEBACiAJCW52LT5leGNoYW5nZV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CiAJCW52LT5oYXJkX2FkZHJlc3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEyNCk7CiAJCW52LT5wb3J0X25hbWVbMF0gPSAweDIxOwotCQludi0+cG9ydF9uYW1lWzFdID0gMHgwMCArIGhhLT5wb3J0X25vOworCQludi0+cG9ydF9uYW1lWzFdID0gMHgwMCArIGhhLT5wb3J0X25vICsgMTsKIAkJbnYtPnBvcnRfbmFtZVsyXSA9IDB4MDA7CiAJCW52LT5wb3J0X25hbWVbM10gPSAweGUwOwogCQludi0+cG9ydF9uYW1lWzRdID0gMHg4YjsKQEAgLTUxMTcsNiArNTI0Niw5OSBAQAogCQlzZWdtZW50cy0tOwogCX0KIAorCWlmICghSVNfUUxBMjdYWChoYSkpCisJCXJldHVybiBydmFsOworCisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CisKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTYxLAorCSAgICAiTG9hZGluZyBmd2R1bXAgdGVtcGxhdGUgZnJvbSAleFxuIiwgZmFkZHIpOworCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIGZhZGRyLCA3KTsKKwlyaXNjX3NpemUgPSBiZTMyX3RvX2NwdShkY29kZVsyXSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE2MiwKKwkgICAgIi0+IGFycmF5IHNpemUgJXggZHdvcmRzXG4iLCByaXNjX3NpemUpOworCWlmIChyaXNjX3NpemUgPT0gMCB8fCByaXNjX3NpemUgPT0gfjApCisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKworCWRsZW4gPSAocmlzY19zaXplIC0gOCkgKiBzaXplb2YoKmRjb2RlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTYzLAorCSAgICAiLT4gdGVtcGxhdGUgYWxsb2NhdGluZyAleCBieXRlcy4uLlxuIiwgZGxlbik7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSB2bWFsbG9jKGRsZW4pOworCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2NCwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIGFsbG9jYXRlICV4IGJ5dGVzLlxuIiwgcmlzY19zaXplKTsKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCX0KKworCWZhZGRyICs9IDc7CisJcmlzY19zaXplIC09IDg7CisJZGNvZGUgPSBoYS0+ZndfZHVtcF90ZW1wbGF0ZTsKKwlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YSh2aGEsIGRjb2RlLCBmYWRkciwgcmlzY19zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmlzY19zaXplOyBpKyspCisJCWRjb2RlW2ldID0gbGUzMl90b19jcHUoZGNvZGVbaV0pOworCisJaWYgKCFxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQoZGNvZGUpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNjUsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSB2YWxpZGF0ZVxuIik7CisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKwl9CisKKwlkbGVuID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUoZGNvZGUpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNjYsCisJICAgICItPiB0ZW1wbGF0ZSBzaXplICV4IGJ5dGVzXG4iLCBkbGVuKTsKKwlpZiAoZGxlbiA+IHJpc2Nfc2l6ZSAqIHNpemVvZigqZGNvZGUpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNjcsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSBleGNlZWRzIGFycmF5IGJ5ICV4IGJ5dGVzXG4iLAorCQkgICAgKHVpbnQzMl90KShkbGVuIC0gcmlzY19zaXplICogc2l6ZW9mKCpkY29kZSkpKTsKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCX0KKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSBkbGVuOworCXJldHVybiBydmFsOworCitkZWZhdWx0X3RlbXBsYXRlOgorCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNjgsICJVc2luZyBkZWZhdWx0IGZ3ZHVtcCB0ZW1wbGF0ZVxuIik7CisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CisKKwlkbGVuID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHRfc2l6ZSgpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNjksCisJICAgICItPiB0ZW1wbGF0ZSBhbGxvY2F0aW5nICV4IGJ5dGVzLi4uXG4iLCBkbGVuKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IHZtYWxsb2MoZGxlbik7CisJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTZhLAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgYWxsb2NhdGUgJXggYnl0ZXMuXG4iLCByaXNjX3NpemUpOworCQlnb3RvIGZhaWxlZF90ZW1wbGF0ZTsKKwl9CisKKwlkY29kZSA9IGhhLT5md19kdW1wX3RlbXBsYXRlOworCXJpc2Nfc2l6ZSA9IGRsZW4gLyBzaXplb2YoKmRjb2RlKTsKKwltZW1jcHkoZGNvZGUsIHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0KCksIGRsZW4pOworCWZvciAoaSA9IDA7IGkgPCByaXNjX3NpemU7IGkrKykKKwkJZGNvZGVbaV0gPSBiZTMyX3RvX2NwdShkY29kZVtpXSk7CisKKwlpZiAoIXFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2YiwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIHZhbGlkYXRlXG4iKTsKKwkJZ290byBmYWlsZWRfdGVtcGxhdGU7CisJfQorCisJZGxlbiA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTZjLAorCSAgICAiLT4gdGVtcGxhdGUgc2l6ZSAleCBieXRlc1xuIiwgZGxlbik7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gZGxlbjsKKwlyZXR1cm4gcnZhbDsKKworZmFpbGVkX3RlbXBsYXRlOgorCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNmQsICJGYWlsZWQgZGVmYXVsdCBmd2R1bXAgdGVtcGxhdGVcbiIpOworCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOwogCXJldHVybiBydmFsOwogfQogCkBAIC01MjMxLDcgKzU0NTMsOCBAQAogCXVpbnQzMl90IHJpc2Nfc2l6ZTsKIAl1aW50MzJfdCBpOwogCXN0cnVjdCBmd19ibG9iICpibG9iOwotCXVpbnQzMl90ICpmd2NvZGUsIGZ3Y2xlbjsKKwljb25zdCB1aW50MzJfdCAqZndjb2RlOworCXVpbnQzMl90IGZ3Y2xlbjsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIApAQCAtNTI2Myw3ICs1NDg2LDcgQEAKIAkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOTMsCiAJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgKCVaZCkuXG4iLAogCQkgICAgYmxvYi0+ZnctPnNpemUpOwotCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OworCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJZGNvZGVbaV0gPSBiZTMyX3RvX2NwdShmd2NvZGVbaSArIDRdKTsKQEAgLTUyNzcsNyArNTUwMCw3IEBACiAJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDk1LAogCQkgICAgIkZpcm13YXJlIGRhdGE6ICUwOHggJTA4eCAlMDh4ICUwOHguXG4iLAogCQkgICAgZGNvZGVbMF0sIGRjb2RlWzFdLCBkY29kZVsyXSwgZGNvZGVbM10pOwotCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OworCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAKIAl3aGlsZSAoc2VnbWVudHMgJiYgcnZhbCA9PSBRTEFfU1VDQ0VTUykgewpAQCAtNTI5MSw4ICs1NTE0LDcgQEAKIAkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDk2LAogCQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSAiCiAJCQkgICAgIiglWmQpLlxuIiwgYmxvYi0+ZnctPnNpemUpOwotCi0JCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OworCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0KIAogCQlmcmFnbWVudCA9IDA7CkBAIC01MzI2LDEwICs1NTQ4LDEwMCBAQAogCQkvKiBOZXh0IHNlZ21lbnQuICovCiAJCXNlZ21lbnRzLS07CiAJfQorCisJaWYgKCFJU19RTEEyN1hYKGhhKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKKworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDE3MSwKKwkgICAgIkxvYWRpbmcgZndkdW1wIHRlbXBsYXRlIGZyb20gJXhcbiIsCisJICAgICh1aW50MzJfdCkoKHZvaWQgKilmd2NvZGUgLSAodm9pZCAqKWJsb2ItPmZ3LT5kYXRhKSk7CisJcmlzY19zaXplID0gYmUzMl90b19jcHUoZndjb2RlWzJdKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgxNzIsCisJICAgICItPiBhcnJheSBzaXplICV4IGR3b3Jkc1xuIiwgcmlzY19zaXplKTsKKwlpZiAocmlzY19zaXplID09IDAgfHwgcmlzY19zaXplID09IH4wKQorCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisKKwlkbGVuID0gKHJpc2Nfc2l6ZSAtIDgpICogc2l6ZW9mKCpmd2NvZGUpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNzMsCisJICAgICItPiB0ZW1wbGF0ZSBhbGxvY2F0aW5nICV4IGJ5dGVzLi4uXG4iLCBkbGVuKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IHZtYWxsb2MoZGxlbik7CisJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTc0LAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgYWxsb2NhdGUgJXggYnl0ZXMuXG4iLCByaXNjX3NpemUpOworCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisJfQorCisJZndjb2RlICs9IDc7CisJcmlzY19zaXplIC09IDg7CisJZGNvZGUgPSBoYS0+ZndfZHVtcF90ZW1wbGF0ZTsKKwlmb3IgKGkgPSAwOyBpIDwgcmlzY19zaXplOyBpKyspCisJCWRjb2RlW2ldID0gbGUzMl90b19jcHUoZndjb2RlW2ldKTsKKworCWlmICghcWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKGRjb2RlKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTc1LAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgdmFsaWRhdGVcbiIpOworCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisJfQorCisJZGxlbiA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKGRjb2RlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTc2LAorCSAgICAiLT4gdGVtcGxhdGUgc2l6ZSAleCBieXRlc1xuIiwgZGxlbik7CisJaWYgKGRsZW4gPiByaXNjX3NpemUgKiBzaXplb2YoKmZ3Y29kZSkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3NywKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIGV4Y2VlZHMgYXJyYXkgYnkgJXggYnl0ZXNcbiIsCisJCSAgICAodWludDMyX3QpKGRsZW4gLSByaXNjX3NpemUgKiBzaXplb2YoKmZ3Y29kZSkpKTsKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCX0KKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSBkbGVuOwogCXJldHVybiBydmFsOwogCi1mYWlsX2Z3X2ludGVncml0eToKLQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKK2RlZmF1bHRfdGVtcGxhdGU6CisJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3OCwgIlVzaW5nIGRlZmF1bHQgZndkdW1wIHRlbXBsYXRlXG4iKTsKKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKKworCWRsZW4gPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdF9zaXplKCk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE3OSwKKwkgICAgIi0+IHRlbXBsYXRlIGFsbG9jYXRpbmcgJXggYnl0ZXMuLi5cbiIsIGRsZW4pOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gdm1hbGxvYyhkbGVuKTsKKwlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxN2EsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSBhbGxvY2F0ZSAleCBieXRlcy5cbiIsIHJpc2Nfc2l6ZSk7CisJCWdvdG8gZmFpbGVkX3RlbXBsYXRlOworCX0KKworCWRjb2RlID0gaGEtPmZ3X2R1bXBfdGVtcGxhdGU7CisJcmlzY19zaXplID0gZGxlbiAvIHNpemVvZigqZndjb2RlKTsKKwlmd2NvZGUgPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdCgpOworCWZvciAoaSA9IDA7IGkgPCByaXNjX3NpemU7IGkrKykKKwkJZGNvZGVbaV0gPSBiZTMyX3RvX2NwdShmd2NvZGVbaV0pOworCisJaWYgKCFxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxN2IsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSB2YWxpZGF0ZVxuIik7CisJCWdvdG8gZmFpbGVkX3RlbXBsYXRlOworCX0KKworCWRsZW4gPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE3YywKKwkgICAgIi0+IHRlbXBsYXRlIHNpemUgJXggYnl0ZXNcbiIsIGRsZW4pOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IGRsZW47CisJcmV0dXJuIHJ2YWw7CisKK2ZhaWxlZF90ZW1wbGF0ZToKKwlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTdkLCAiRmFpbGVkIGRlZmF1bHQgZndkdW1wIHRlbXBsYXRlXG4iKTsKKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKKwlyZXR1cm4gcnZhbDsKIH0KIAogaW50CkBAIC01NjA1LDcgKzU5MTcsNyBAQAogCQludi0+ZXhlY3V0aW9uX3Rocm90dGxlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweEZGRkYpOwogCQludi0+ZXhjaGFuZ2VfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOwogCQludi0+cG9ydF9uYW1lWzBdID0gMHgyMTsKLQkJbnYtPnBvcnRfbmFtZVsxXSA9IDB4MDAgKyBoYS0+cG9ydF9ubzsKKwkJbnYtPnBvcnRfbmFtZVsxXSA9IDB4MDAgKyBoYS0+cG9ydF9ubyArIDE7CiAJCW52LT5wb3J0X25hbWVbMl0gPSAweDAwOwogCQludi0+cG9ydF9uYW1lWzNdID0gMHhlMDsKIAkJbnYtPnBvcnRfbmFtZVs0XSA9IDB4OGI7CkBAIC01NjM5LDcgKzU5NTEsNyBAQAogCQludi0+ZW5vZGVfbWFjWzJdID0gMHhERDsKIAkJbnYtPmVub2RlX21hY1szXSA9IDB4MDQ7CiAJCW52LT5lbm9kZV9tYWNbNF0gPSAweDA1OwotCQludi0+ZW5vZGVfbWFjWzVdID0gMHgwNiArIGhhLT5wb3J0X25vOworCQludi0+ZW5vZGVfbWFjWzVdID0gMHgwNiArIGhhLT5wb3J0X25vICsgMTsKIAogCQlydmFsID0gMTsKIAl9CkBAIC01Njc3LDcgKzU5ODksNyBAQAogCQlpY2ItPmVub2RlX21hY1syXSA9IDB4REQ7CiAJCWljYi0+ZW5vZGVfbWFjWzNdID0gMHgwNDsKIAkJaWNiLT5lbm9kZV9tYWNbNF0gPSAweDA1OwotCQlpY2ItPmVub2RlX21hY1s1XSA9IDB4MDYgKyBoYS0+cG9ydF9ubzsKKwkJaWNiLT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgaGEtPnBvcnRfbm8gKyAxOwogCX0KIAogCS8qIFVzZSBleHRlbmRlZC1pbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLiAqLwpAQCAtNTc4MCw3ICs2MDkyLDcgQEAKIAkJaGEtPmxvZ2luX3JldHJ5X2NvdW50ID0gcWwyeGxvZ2lucmV0cnljb3VudDsKIAogCS8qIGlmIG5vdCBydW5uaW5nIE1TSS1YIHdlIG5lZWQgaGFuZHNoYWtpbmcgb24gaW50ZXJydXB0cyAqLwotCWlmICghdmhhLT5ody0+ZmxhZ3MubXNpeF9lbmFibGVkICYmIElTX1FMQTgzWFgoaGEpKQorCWlmICghdmhhLT5ody0+ZmxhZ3MubXNpeF9lbmFibGVkICYmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkpCiAJCWljYi0+ZmlybXdhcmVfb3B0aW9uc18yIHw9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzIyKTsKIAogCS8qIEVuYWJsZSBaSU8uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwppbmRleCA0NmI5MzA3Li5lNjA3NTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKQEAgLTQ4OCw3ICs0ODgsNyBAQAogCQkJcmVxLT5yaW5nX3B0cisrOwogCiAJCS8qIFNldCBjaGlwIG5ldyByaW5nIGluZGV4LiAqLwotCQlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKSB7CisJCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJCVdSVF9SRUdfRFdPUkQocmVxLT5yZXFfcV9pbiwgcmVxLT5yaW5nX2luZGV4KTsKIAkJCVJEX1JFR19EV09SRF9SRUxBWEVEKCZoYS0+aW9iYXNlLT5pc3AyNC5oY2NyKTsKIAkJfSBlbHNlIGlmIChJU19RTEFGWDAwKGhhKSkgewpAQCAtNTI0LDcgKzUyNCw2IEBACiB7CiAJbXJrX2VudHJ5X3QgKm1yazsKIAlzdHJ1Y3QgbXJrX2VudHJ5XzI0eHggKm1yazI0ID0gTlVMTDsKLQlzdHJ1Y3QgbXJrX2VudHJ5X2Z4MDAgKm1ya2Z4ID0gTlVMTDsKIAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwpAQCAtNTQxLDE1ICs1NDAsNyBAQAogCW1yay0+ZW50cnlfdHlwZSA9IE1BUktFUl9UWVBFOwogCW1yay0+bW9kaWZpZXIgPSB0eXBlOwogCWlmICh0eXBlICE9IE1LX1NZTkNfQUxMKSB7Ci0JCWlmIChJU19RTEFGWDAwKGhhKSkgewotCQkJbXJrZnggPSAoc3RydWN0IG1ya19lbnRyeV9meDAwICopIG1yazsKLQkJCW1ya2Z4LT5oYW5kbGUgPSBNQUtFX0hBTkRMRShyZXEtPmlkLCBtcmtmeC0+aGFuZGxlKTsKLQkJCW1ya2Z4LT5oYW5kbGVfaGkgPSAwOwotCQkJbXJrZngtPnRndF9pZCA9IGNwdV90b19sZTE2KGxvb3BfaWQpOwotCQkJbXJrZngtPmx1blsxXSA9IExTQihsdW4pOwotCQkJbXJrZngtPmx1blsyXSA9IE1TQihsdW4pOwotCQkJaG9zdF90b19mY3Bfc3dhcChtcmtmeC0+bHVuLCBzaXplb2YobXJrZngtPmx1bikpOwotCQl9IGVsc2UgaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKKwkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJCW1yazI0ID0gKHN0cnVjdCBtcmtfZW50cnlfMjR4eCAqKSBtcms7CiAJCQltcmsyNC0+bnBvcnRfaGFuZGxlID0gY3B1X3RvX2xlMTYobG9vcF9pZCk7CiAJCQltcmsyNC0+bHVuWzFdID0gTFNCKGx1bik7CkBAIC0xODIzLDcgKzE4MTQsNyBAQAogCiAJLyogQ2hlY2sgZm9yIHJvb20gaW4gb3V0c3RhbmRpbmcgY29tbWFuZCBsaXN0LiAqLwogCWhhbmRsZSA9IHJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQ7Ci0JZm9yIChpbmRleCA9IDE7IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHM7IGluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzOyBpbmRleCsrKSB7CiAJCWhhbmRsZSsrOwogCQlpZiAoaGFuZGxlID09IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHMpCiAJCQloYW5kbGUgPSAxOwpAQCAtMTg0OCw3ICsxODM5LDcgQEAKIHNraXBfY21kX2FycmF5OgogCS8qIENoZWNrIGZvciByb29tIG9uIHJlcXVlc3QgcXVldWUuICovCiAJaWYgKHJlcS0+Y250IDwgcmVxX2NudCkgewotCQlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKQorCQlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQkJY250ID0gUkRfUkVHX0RXT1JEKCZyZWctPmlzcDI1bXEucmVxX3Ffb3V0KTsKIAkJZWxzZSBpZiAoSVNfUDNQX1RZUEUoaGEpKQogCQkJY250ID0gUkRfUkVHX0RXT1JEKCZyZWctPmlzcDgyLnJlcV9xX291dCk7CkBAIC0yNTk0LDYgKzI1ODUsMjkgQEAKIAlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIH0KIAordm9pZAorcWxhMjR4eF9hYm9ydF9pb2NiKHNyYl90ICpzcCwgc3RydWN0IGFib3J0X2VudHJ5XzI0eHggKmFidF9pb2NiKQoreworCXN0cnVjdCBzcmJfaW9jYiAqYWlvID0gJnNwLT51LmlvY2JfY21kOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc3AtPmZjcG9ydC0+dmhhOworCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKKworCW1lbXNldChhYnRfaW9jYiwgMCwgc2l6ZW9mKHN0cnVjdCBhYm9ydF9lbnRyeV8yNHh4KSk7CisJYWJ0X2lvY2ItPmVudHJ5X3R5cGUgPSBBQk9SVF9JT0NCX1RZUEU7CisJYWJ0X2lvY2ItPmVudHJ5X2NvdW50ID0gMTsKKwlhYnRfaW9jYi0+aGFuZGxlID0gY3B1X3RvX2xlMzIoTUFLRV9IQU5ETEUocmVxLT5pZCwgc3AtPmhhbmRsZSkpOworCWFidF9pb2NiLT5ucG9ydF9oYW5kbGUgPSBjcHVfdG9fbGUxNihzcC0+ZmNwb3J0LT5sb29wX2lkKTsKKwlhYnRfaW9jYi0+aGFuZGxlX3RvX2Fib3J0ID0KKwkgICAgY3B1X3RvX2xlMzIoTUFLRV9IQU5ETEUocmVxLT5pZCwgYWlvLT51LmFidC5jbWRfaG5kbCkpOworCWFidF9pb2NiLT5wb3J0X2lkWzBdID0gc3AtPmZjcG9ydC0+ZF9pZC5iLmFsX3BhOworCWFidF9pb2NiLT5wb3J0X2lkWzFdID0gc3AtPmZjcG9ydC0+ZF9pZC5iLmFyZWE7CisJYWJ0X2lvY2ItPnBvcnRfaWRbMl0gPSBzcC0+ZmNwb3J0LT5kX2lkLmIuZG9tYWluOworCWFidF9pb2NiLT52cF9pbmRleCA9IHZoYS0+dnBfaWR4OworCWFidF9pb2NiLT5yZXFfcXVlX25vID0gY3B1X3RvX2xlMTYocmVxLT5pZCk7CisJLyogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZmlybXdhcmUgKi8KKwl3bWIoKTsKK30KKwogaW50CiBxbGEyeDAwX3N0YXJ0X3NwKHNyYl90ICpzcCkKIHsKQEAgLTI2NDcsNyArMjY2MSw5IEBACiAJCXFsYWZ4MDBfZnhkaXNjX2lvY2Ioc3AsIHBrdCk7CiAJCWJyZWFrOwogCWNhc2UgU1JCX0FCVF9DTUQ6Ci0JCXFsYWZ4MDBfYWJvcnRfaW9jYihzcCwgcGt0KTsKKwkJSVNfUUxBRlgwMChoYSkgPworCQkJcWxhZngwMF9hYm9ydF9pb2NiKHNwLCBwa3QpIDoKKwkJCXFsYTI0eHhfYWJvcnRfaW9jYihzcCwgcGt0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggMGExZGNiNC4uOTUzMTRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMzU2LDE1ICszNTYsMTYgQEAKIGNvbnN0IGNoYXIgKgogcWxhMngwMF9nZXRfbGlua19zcGVlZF9zdHIoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3Qgc3BlZWQpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsaW5rX3NwZWVkc1tdID0gewotCQkiMSIsICIyIiwgIj8iLCAiNCIsICI4IiwgIjE2IiwgIjEwIgorCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsaW5rX3NwZWVkc1tdID0geworCQkiMSIsICIyIiwgIj8iLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjEwIgogCX07CisjZGVmaW5lCVFMQV9MQVNUX1NQRUVECTcKIAogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKIAkJcmV0dXJuIGxpbmtfc3BlZWRzWzBdOwogCWVsc2UgaWYgKHNwZWVkID09IDB4MTMpCi0JCXJldHVybiBsaW5rX3NwZWVkc1s2XTsKLQllbHNlIGlmIChzcGVlZCA8IDYpCisJCXJldHVybiBsaW5rX3NwZWVkc1tRTEFfTEFTVF9TUEVFRF07CisJZWxzZSBpZiAoc3BlZWQgPCBRTEFfTEFTVF9TUEVFRCkKIAkJcmV0dXJuIGxpbmtfc3BlZWRzW3NwZWVkXTsKIAllbHNlCiAJCXJldHVybiBsaW5rX3NwZWVkc1tMU19VTktOT1dOXTsKQEAgLTY0OSw3ICs2NTAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgTUJBX1NZU1RFTV9FUlI6CQkvKiBTeXN0ZW0gRXJyb3IgKi8KLQkJbWJ4ID0gKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKSA/CisJCW1ieCA9IChJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgPwogCQkJUkRfUkVHX1dPUkQoJnJlZzI0LT5tYWlsYm94NykgOiAwOwogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDAzLAogCQkgICAgIklTUCBTeXN0ZW0gRXJyb3IgLSBtYngxPSV4aCBtYngyPSV4aCBtYngzPSV4aCAiCkBAIC02NjYsNyArNjY3LDcgQEAKIAkJCQl2aGEtPmRldmljZV9mbGFncyB8PSBERkxHX0RFVl9GQUlMRUQ7CiAJCQl9IGVsc2UgewogCQkJCS8qIENoZWNrIHRvIHNlZSBpZiBNUEkgdGltZW91dCBvY2N1cnJlZCAqLwotCQkJCWlmICgobWJ4ICYgTUJYXzMpICYmIChoYS0+ZmxhZ3MucG9ydDApKQorCQkJCWlmICgobWJ4ICYgTUJYXzMpICYmIChoYS0+cG9ydF9ubyA9PSAwKSkKIAkJCQkJc2V0X2JpdChNUElfUkVTRVRfTkVFREVELAogCQkJCQkgICAgJnZoYS0+ZHBjX2ZsYWdzKTsKIApAQCAtMTQ5Nyw4ICsxNDk4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXFsYTI0eHhfdG1faW9jYl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSwKLSAgICBzdHJ1Y3QgdHNrX21nbXRfZW50cnkgKnRzaykKK3FsYTI0eHhfdG1faW9jYl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSwgdm9pZCAqdHNrKQogewogCWNvbnN0IGNoYXIgZnVuY1tdID0gIlRNRi1JT0NCIjsKIAljb25zdCBjaGFyICp0eXBlOwpAQCAtMTUwNiw3ICsxNTA2LDYgQEAKIAlzcmJfdCAqc3A7CiAJc3RydWN0IHNyYl9pb2NiICppb2NiOwogCXN0cnVjdCBzdHNfZW50cnlfMjR4eCAqc3RzID0gKHN0cnVjdCBzdHNfZW50cnlfMjR4eCAqKXRzazsKLQlpbnQgZXJyb3IgPSAxOwogCiAJc3AgPSBxbGEyeDAwX2dldF9zcF9mcm9tX2hhbmRsZSh2aGEsIGZ1bmMsIHJlcSwgdHNrKTsKIAlpZiAoIXNwKQpAQCAtMTUxNSwzNyArMTUxNCwzNSBAQAogCWlvY2IgPSAmc3AtPnUuaW9jYl9jbWQ7CiAJdHlwZSA9IHNwLT5uYW1lOwogCWZjcG9ydCA9IHNwLT5mY3BvcnQ7CisJaW9jYi0+dS50bWYuZGF0YSA9IFFMQV9TVUNDRVNTOwogCiAJaWYgKHN0cy0+ZW50cnlfc3RhdHVzKSB7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzOCwKIAkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCBlbnRyeS1zdGF0dXMoJXgpLlxuIiwKIAkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+ZW50cnlfc3RhdHVzKTsKKwkJaW9jYi0+dS50bWYuZGF0YSA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChzdHMtPmNvbXBfc3RhdHVzICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzOSwKIAkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCBjb21wbGV0aW9uIHN0YXR1cygleCkuXG4iLAogCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5jb21wX3N0YXR1cyk7Ci0JfSBlbHNlIGlmICghKGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpICYKKwkJaW9jYi0+dS50bWYuZGF0YSA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIGlmICgobGUxNl90b19jcHUoc3RzLT5zY3NpX3N0YXR1cykgJgogCSAgICBTU19SRVNQT05TRV9JTkZPX0xFTl9WQUxJRCkpIHsKLQkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDNhLAotCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IG5vIHJlc3BvbnNlIGluZm8oJXgpLlxuIiwKLQkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+c2NzaV9zdGF0dXMpOwotCX0gZWxzZSBpZiAobGUzMl90b19jcHUoc3RzLT5yc3BfZGF0YV9sZW4pIDwgNCkgewotCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwM2IsCi0JCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggbm90IGVub3VnaCByZXNwb25zZSglZCkuXG4iLAotCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5yc3BfZGF0YV9sZW4pOwotCX0gZWxzZSBpZiAoc3RzLT5kYXRhWzNdKSB7Ci0JCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzYywKLQkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCByZXNwb25zZSgleCkuXG4iLAotCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5kYXRhWzNdKTsKLQl9IGVsc2UgewotCQllcnJvciA9IDA7CisJCWlmIChsZTMyX3RvX2NwdShzdHMtPnJzcF9kYXRhX2xlbikgPCA0KSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwM2IsCisJCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IG5vdCBlbm91Z2ggcmVzcG9uc2UoJWQpLlxuIiwKKwkJCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPnJzcF9kYXRhX2xlbik7CisJCX0gZWxzZSBpZiAoc3RzLT5kYXRhWzNdKSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwM2MsCisJCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IHJlc3BvbnNlKCV4KS5cbiIsCisJCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5kYXRhWzNdKTsKKwkJaW9jYi0+dS50bWYuZGF0YSA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KIAl9CiAKLQlpZiAoZXJyb3IpIHsKLQkJaW9jYi0+dS50bWYuZGF0YSA9IGVycm9yOworCWlmIChpb2NiLT51LnRtZi5kYXRhICE9IFFMQV9TVUNDRVNTKQogCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfYXN5bmMgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4NTA1NSwKIAkJICAgICh1aW50OF90ICopc3RzLCBzaXplb2YoKnN0cykpOwotCX0KIAogCXNwLT5kb25lKHZoYSwgc3AsIDApOwogfQpAQCAtMjAyNSw2ICsyMDIyLDEyIEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBUYXNrIE1hbmFnZW1lbnQgY29tcGxldGlvbi4gKi8KKwlpZiAoc3AtPnR5cGUgPT0gU1JCX1RNX0NNRCkgeworCQlxbGEyNHh4X3RtX2lvY2JfZW50cnkodmhhLCByZXEsIHBrdCk7CisJCXJldHVybjsKKwl9CisKIAkvKiBGYXN0IHBhdGggY29tcGxldGlvbi4gKi8KIAlpZiAoY29tcF9zdGF0dXMgPT0gQ1NfQ09NUExFVEUgJiYgc2NzaV9zdGF0dXMgPT0gMCkgewogCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QodmhhLCByZXEsIGhhbmRsZSk7CkBAIC0yNDI1LDYgKzI0MjgsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitxbGEyNHh4X2Fib3J0X2lvY2JfZW50cnkoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsCisJc3RydWN0IGFib3J0X2VudHJ5XzI0eHggKnBrdCkKK3sKKwljb25zdCBjaGFyIGZ1bmNbXSA9ICJBQlRfSU9DQiI7CisJc3JiX3QgKnNwOworCXN0cnVjdCBzcmJfaW9jYiAqYWJ0OworCisJc3AgPSBxbGEyeDAwX2dldF9zcF9mcm9tX2hhbmRsZSh2aGEsIGZ1bmMsIHJlcSwgcGt0KTsKKwlpZiAoIXNwKQorCQlyZXR1cm47CisKKwlhYnQgPSAmc3AtPnUuaW9jYl9jbWQ7CisJYWJ0LT51LmFidC5jb21wX3N0YXR1cyA9IGxlMzJfdG9fY3B1KHBrdC0+bnBvcnRfaGFuZGxlKTsKKwlzcC0+ZG9uZSh2aGEsIHNwLCAwKTsKK30KKwogLyoqCiAgKiBxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoKSAtIFByb2Nlc3MgcmVzcG9uc2UgcXVldWUgZW50cmllcy4KICAqIEBoYTogU0NTSSBkcml2ZXIgSEEgY29udGV4dApAQCAtMjQ3NCwxMCArMjQ5NCw2IEBACiAJCQlxbGEyNHh4X2xvZ2lvX2VudHJ5KHZoYSwgcnNwLT5yZXEsCiAJCQkgICAgKHN0cnVjdCBsb2dpb19lbnRyeV8yNHh4ICopcGt0KTsKIAkJCWJyZWFrOwotCQljYXNlIFRTS19NR01UX0lPQ0JfVFlQRToKLQkJCXFsYTI0eHhfdG1faW9jYl9lbnRyeSh2aGEsIHJzcC0+cmVxLAotCQkJICAgIChzdHJ1Y3QgdHNrX21nbXRfZW50cnkgKilwa3QpOwotCQkJYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDVF9JT0NCX1RZUEU6CiAJCQlxbGEyNHh4X2Vsc19jdF9lbnRyeSh2aGEsIHJzcC0+cmVxLCBwa3QsIENUX0lPQ0JfVFlQRSk7CiAJCQlicmVhazsKQEAgLTI0OTcsNiArMjUxMywxMCBAQAogCQkJICogZnJvbSBmYWxsaW5nIGludG8gZGVmYXVsdCBjYXNlCiAJCQkgKi8KIAkJCWJyZWFrOworCQljYXNlIEFCT1JUX0lPQ0JfVFlQRToKKwkJCXFsYTI0eHhfYWJvcnRfaW9jYl9lbnRyeSh2aGEsIHJzcC0+cmVxLAorCQkJICAgIChzdHJ1Y3QgYWJvcnRfZW50cnlfMjR4eCAqKXBrdCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIFR5cGUgTm90IFN1cHBvcnRlZC4gKi8KIAkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDQyLApAQCAtMjUyNSw3ICsyNTQ1LDggQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAotCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSkKKwlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkgJiYKKwkgICAgIUlTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm47CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CkBAIC0yOTc5LDcgKzMwMDAsNyBAQAogCX0KIAogCS8qIEVuYWJsZSBNU0ktWCB2ZWN0b3IgZm9yIHJlc3BvbnNlIHF1ZXVlIHVwZGF0ZSBmb3IgcXVldWUgMCAqLwotCWlmIChJU19RTEE4M1hYKGhhKSkgeworCWlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQlpZiAoaGEtPm1zaXhiYXNlICYmIGhhLT5tcWlvYmFzZSAmJgogCQkgICAgKGhhLT5tYXhfcnNwX3F1ZXVlcyA+IDEgfHwgaGEtPm1heF9yZXFfcXVldWVzID4gMSkpCiAJCQloYS0+bXFlbmFibGUgPSAxOwpAQCAtMzAwMywxMiArMzAyNCwxMyBAQAogcWxhMngwMF9yZXF1ZXN0X2lycXMoc3RydWN0IHFsYV9od19kYXRhICpoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCkKIHsKIAlpbnQgcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlkZXZpY2VfcmVnX3QgKnJlZyA9IGhhLT5pb2Jhc2U7CiAJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJLyogSWYgcG9zc2libGUsIGVuYWJsZSBNU0ktWC4gKi8KIAlpZiAoIUlTX1FMQTI0MzIoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkgJiYKLQkJIUlTX0NOQV9DQVBBQkxFKGhhKSAmJiAhSVNfUUxBMjAzMShoYSkgJiYgIUlTX1FMQUZYMDAoaGEpKQorCSAgICAhSVNfQ05BX0NBUEFCTEUoaGEpICYmICFJU19RTEEyMDMxKGhhKSAmJiAhSVNfUUxBRlgwMChoYSkgJiYKKwkgICAgIUlTX1FMQTI3WFgoaGEpKQogCQlnb3RvIHNraXBfbXNpOwogCiAJaWYgKGhhLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfSFAgJiYKQEAgLTMwNDMsNyArMzA2NSw4IEBACiAJICAgICJGYWxsaW5nIGJhY2stdG8gTVNJIG1vZGUgLSVkLlxuIiwgcmV0KTsKIAogCWlmICghSVNfUUxBMjRYWChoYSkgJiYgIUlTX1FMQTI1MzIoaGEpICYmICFJU19RTEE4NDMyKGhhKSAmJgotCSAgICAhSVNfUUxBODAwMShoYSkgJiYgIUlTX1AzUF9UWVBFKGhhKSAmJiAhSVNfUUxBRlgwMChoYSkpCisJICAgICFJU19RTEE4MDAxKGhhKSAmJiAhSVNfUDNQX1RZUEUoaGEpICYmICFJU19RTEFGWDAwKGhhKSAmJgorCSAgICAhSVNfUUxBMjdYWChoYSkpCiAJCWdvdG8gc2tpcF9tc2k7CiAKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShoYS0+cGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKaW5kZXggYjk0NTExYS4uMjUyODcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtMzUsNyArMzUsNyBAQAogewogCWludAkJcnZhbDsKIAl1bnNpZ25lZCBsb25nICAgIGZsYWdzID0gMDsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOworCWRldmljZV9yZWdfdCAqcmVnOwogCXVpbnQ4X3QJCWFib3J0X2FjdGl2ZTsKIAl1aW50OF90CQlpb19sb2NrX29uOwogCXVpbnQxNl90CWNvbW1hbmQgPSAwOwpAQCAtNDY4LDcgKzQ2OCw4IEBACiAJCW1jcC0+bWJbMV0gPSBNU1cocmlzY19hZGRyKTsKIAkJbWNwLT5tYlsyXSA9IExTVyhyaXNjX2FkZHIpOwogCQltY3AtPm1iWzNdID0gMDsKLQkJaWYgKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKSB7CisJCWlmIChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fAorCQkgICAgSVNfUUxBMjdYWChoYSkpIHsKIAkJCXN0cnVjdCBudnJhbV84MXh4ICpudiA9IGhhLT5udnJhbTsKIAkJCW1jcC0+bWJbNF0gPSAobnYtPmVuaGFuY2VkX2ZlYXR1cmVzICYKIAkJCSAgICBFWFRFTkRFRF9CQl9DUkVESVRTKTsKQEAgLTUzOSw2ICs1NDAsOCBAQAogCQltY3AtPmluX21iIHw9IE1CWF8xM3xNQlhfMTJ8TUJYXzExfE1CWF8xMHxNQlhfOXxNQlhfODsKIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMTd8TUJYXzE2fE1CWF8xNTsKKwlpZiAoSVNfUUxBMjdYWChoYSkpCisJCW1jcC0+aW5fbWIgfD0gTUJYXzIxfE1CWF8yMHxNQlhfMTl8TUJYXzE4OwogCW1jcC0+ZmxhZ3MgPSAwOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CkBAIC01NzQsNiArNTc3LDEwIEBACiAJCSAgICAiJXM6IEV4dF9Gd0F0dHJpYnV0ZXMgVXBwZXI6IDB4JXgsIExvd2VyOiAweCV4LlxuIiwKIAkJICAgIF9fZnVuY19fLCBtY3AtPm1iWzE3XSwgbWNwLT5tYlsxNl0pOwogCX0KKwlpZiAoSVNfUUxBMjdYWChoYSkpIHsKKwkJaGEtPmZ3X3NoYXJlZF9yYW1fc3RhcnQgPSAobWNwLT5tYlsxOV0gPDwgMTYpIHwgbWNwLT5tYlsxOF07CisJCWhhLT5md19zaGFyZWRfcmFtX2VuZCA9IChtY3AtPm1iWzIxXSA8PCAxNikgfCBtY3AtPm1iWzIwXTsKKwl9CiAKIGZhaWxlZDoKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewpAQCAtMTIyNSw3ICsxMjMyLDcgQEAKIAl9CiAJLyogMSBhbmQgMiBzaG91bGQgbm9ybWFsbHkgYmUgY2FwdHVyZWQuICovCiAJbWNwLT5pbl9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOwotCWlmIChJU19RTEE4M1hYKGhhKSkKKwlpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCS8qIG1iMyBpcyBhZGRpdGlvbmFsIGluZm8gYWJvdXQgdGhlIGluc3RhbGxlZCBTRlAuICovCiAJCW1jcC0+aW5fbWIgIHw9IE1CWF8zOwogCW1jcC0+YnVmX3NpemUgPSBzaXplOwpAQCAtMjM0OSw3ICsyMzU2LDcgQEAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9SRVNPVVJDRV9DT1VOVFM7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzExfE1CWF8xMHxNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKLQlpZiAoSVNfUUxBODFYWCh2aGEtPmh3KSB8fCBJU19RTEE4M1hYKHZoYS0+aHcpKQorCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpIHx8IElTX1FMQTgzWFgodmhhLT5odykgfHwgSVNfUUxBMjdYWCh2aGEtPmh3KSkKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMTI7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IDA7CkBAIC0yNTkwLDYgKzI1OTcsOSBAQAogCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX3ZlcmJvc2UsIHZoYSwgMHgxMDhjLAogCSAgICAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAorCWlmIChxbDJ4YXN5bmN0bWZlbmFibGUpCisJCXJldHVybiBxbGEyNHh4X2FzeW5jX2Fib3J0X2NvbW1hbmQoc3ApOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJZm9yIChoYW5kbGUgPSAxOyBoYW5kbGUgPCByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzOyBoYW5kbGUrKykgewogCQlpZiAocmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPT0gc3ApCkBAIC0zMDMyLDcgKzMwNDIsNyBAQAogCSAgICAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmICghSVNfUUxBMjVYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODFYWCh2aGEtPmh3KSAmJgotCSAgICAhSVNfUUxBODNYWCh2aGEtPmh3KSkKKwkgICAgIUlTX1FMQTgzWFgodmhhLT5odykgJiYgIUlTX1FMQTI3WFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUodmhhLT5ody0+cGRldikpKQpAQCAtMzY2Miw3ICszNjcyLDcgQEAKIAltY3AtPm1iWzEyXSA9IHJlcS0+cW9zOwogCW1jcC0+bWJbMTFdID0gcmVxLT52cF9pZHg7CiAJbWNwLT5tYlsxM10gPSByZXEtPnJpZDsKLQlpZiAoSVNfUUxBODNYWChoYSkpCisJaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQltY3AtPm1iWzE1XSA9IDA7CiAKIAltY3AtPm1iWzRdID0gcmVxLT5pZDsKQEAgLTM2NzYsOSArMzY4Niw5IEBACiAJbWNwLT5mbGFncyA9IE1CWF9ETUFfT1VUOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTICogMjsKIAotCWlmIChJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkKKwlpZiAoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCW1jcC0+aW5fbWIgfD0gTUJYXzE7Ci0JaWYgKElTX1FMQTgzWFgoaGEpKSB7CisJaWYgKElTX1FMQTgzWFgoaGEpIHx8ICFJU19RTEEyN1hYKGhhKSkgewogCQltY3AtPm91dF9tYiB8PSBNQlhfMTU7CiAJCS8qIGRlYnVnIHEgY3JlYXRlIGlzc3VlIGluIFNSLUlPViAqLwogCQltY3AtPmluX21iIHw9IE1CWF85IHwgTUJYXzggfCBNQlhfNzsKQEAgLTM2ODcsNyArMzY5Nyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJaWYgKCEocmVxLT5vcHRpb25zICYgQklUXzApKSB7CiAJCVdSVF9SRUdfRFdPUkQocmVxLT5yZXFfcV9pbiwgMCk7Ci0JCWlmICghSVNfUUxBODNYWChoYSkpCisJCWlmICghSVNfUUxBODNYWChoYSkgfHwgIUlTX1FMQTI3WFgoaGEpKQogCQkJV1JUX1JFR19EV09SRChyZXEtPnJlcV9xX291dCwgMCk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC0zNzI1LDcgKzM3MzUsNyBAQAogCW1jcC0+bWJbNV0gPSByc3AtPmxlbmd0aDsKIAltY3AtPm1iWzE0XSA9IHJzcC0+bXNpeC0+ZW50cnk7CiAJbWNwLT5tYlsxM10gPSByc3AtPnJpZDsKLQlpZiAoSVNfUUxBODNYWChoYSkpCisJaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQltY3AtPm1iWzE1XSA9IDA7CiAKIAltY3AtPm1iWzRdID0gcnNwLT5pZDsKQEAgLTM3NDIsNyArMzc1Miw3IEBACiAJaWYgKElTX1FMQTgxWFgoaGEpKSB7CiAJCW1jcC0+b3V0X21iIHw9IE1CWF8xMnxNQlhfMTF8TUJYXzEwOwogCQltY3AtPmluX21iIHw9IE1CWF8xOwotCX0gZWxzZSBpZiAoSVNfUUxBODNYWChoYSkpIHsKKwl9IGVsc2UgaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCW1jcC0+b3V0X21iIHw9IE1CWF8xNXxNQlhfMTJ8TUJYXzExfE1CWF8xMDsKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMTsKIAkJLyogZGVidWcgcSBjcmVhdGUgaXNzdWUgaW4gU1ItSU9WICovCkBAIC0zODA5LDcgKzM4MTksOCBAQAogCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX3ZlcmJvc2UsIHZoYSwgMHgxMGRjLAogCSAgICAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAotCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODNYWCh2aGEtPmh3KSkKKwlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykgJiYgIUlTX1FMQTgzWFgodmhhLT5odykgJiYKKwkgICAgIUlTX1FMQTI3WFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJbWNwLT5tYlswXSA9IE1CQ19GTEFTSF9BQ0NFU1NfQ1RSTDsKQEAgLTM4NDAsNyArMzg1MSw4IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpICYmICFJU19RTEE4M1hYKHZoYS0+aHcpKQorCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODNYWCh2aGEtPmh3KSAmJgorCSAgICAhSVNfUUxBMjdYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ192ZXJib3NlLCB2aGEsIDB4MTBkZiwKQEAgLTM4NzQsNyArMzg4Niw4IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpICYmICFJU19RTEE4M1hYKHZoYS0+aHcpKQorCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODNYWCh2aGEtPmh3KSAmJgorCSAgICAhSVNfUUxBMjdYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ192ZXJib3NlLCB2aGEsIDB4MTBlMiwKQEAgLTQ1NDUsNyArNDU1OCw3IEBACiAJbWNwLT5tYlsxXSA9IDA7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzJ8TUJYXzF8TUJYXzA7Ci0JaWYgKElTX1FMQTgzWFgoaGEpKQorCWlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMzsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKQEAgLTQ1NzQsNyArNDU4Nyw4IEBACiAJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfdmVyYm9zZSwgdmhhLCAweDExMDksCiAJICAgICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCi0JaWYgKCFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkgJiYgIUlTX1FMQTgwNDQoaGEpKQorCWlmICghSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpICYmICFJU19RTEE4MDQ0KGhhKSAmJgorCSAgICAhSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1BPUlRfQ09ORklHOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC01MDcwLDcgKzUwODQsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCWlmICghSVNfUUxBODNYWChoYSkpCisJaWYgKCFJU19RTEE4M1hYKGhhKSAmJiAhSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfdmVyYm9zZSwgdmhhLCAweDExMzAsCkBAIC01MTQ1LDcgKzUxNTksNyBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXVuc2lnbmVkIGxvbmcgcmV0cnlfbWF4X3RpbWUgPSBqaWZmaWVzICsgKDIgKiBIWik7CiAKLQlpZiAoIUlTX1FMQTgzWFgoaGEpKQorCWlmICghSVNfUUxBODNYWChoYSkgJiYgIUlTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTE0YiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKaW5kZXggYTcyZGY3MC4uZjBhODUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwpAQCAtNjMwLDcgKzYzMCw3IEBACiAJc3RydWN0IHJlcV9xdWUgKnJlcSA9IE5VTEw7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAl1aW50MTZfdCBxdWVfaWQgPSAwOwotCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJZGV2aWNlX3JlZ190ICpyZWc7CiAJdWludDMyX3QgY250OwogCiAJcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlcV9xdWUpLCBHRlBfS0VSTkVMKTsKQEAgLTc1NCw3ICs3NTQsNyBAQAogCXN0cnVjdCByc3BfcXVlICpyc3AgPSBOVUxMOwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJdWludDE2X3QgcXVlX2lkID0gMDsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOworCWRldmljZV9yZWdfdCAqcmVnOwogCiAJcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzcF9xdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAocnNwID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmMKaW5kZXggYmE2ZjhiMS4uMGFhZjZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmMKQEAgLTQwLDcgKzQwLDcgQEAKIHsKIAlpbnQJCXJ2YWw7CiAJdW5zaWduZWQgbG9uZyAgICBmbGFncyA9IDA7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlkZXZpY2VfcmVnX3QgKnJlZzsKIAl1aW50OF90CQlhYm9ydF9hY3RpdmU7CiAJdWludDhfdAkJaW9fbG9ja19vbjsKIAl1aW50MTZfdAljb21tYW5kID0gMDsKQEAgLTYzMSwyMCArNjMxLDYgQEAKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ19meDAwIF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3BmeDAwOwotCXN0cnVjdCBpbml0X2NiX2Z4ICppY2I7Ci0Jc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07Ci0Jc3RydWN0IHJzcF9xdWUgKnJzcCA9IGhhLT5yc3BfcV9tYXBbMF07Ci0KLQkvKiBTZXR1cCByaW5nIHBhcmFtZXRlcnMgaW4gaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4gKi8KLQlpY2IgPSAoc3RydWN0IGluaXRfY2JfZnggKiloYS0+aW5pdF9jYjsKLQlpY2ItPnJlcXVlc3RfcV9vdXRwb2ludGVyID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKLQlpY2ItPnJlc3BvbnNlX3FfaW5wb2ludGVyID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKLQlpY2ItPnJlcXVlc3RfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihyZXEtPmxlbmd0aCk7Ci0JaWNiLT5yZXNwb25zZV9xX2xlbmd0aCA9IGNwdV90b19sZTE2KHJzcC0+bGVuZ3RoKTsKLQlpY2ItPnJlcXVlc3RfcV9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKHJlcS0+ZG1hKSk7Ci0JaWNiLT5yZXF1ZXN0X3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChyZXEtPmRtYSkpOwotCWljYi0+cmVzcG9uc2VfcV9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKHJzcC0+ZG1hKSk7Ci0JaWNiLT5yZXNwb25zZV9xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QocnNwLT5kbWEpKTsKIAogCVdSVF9SRUdfRFdPUkQoJnJlZy0+cmVxX3FfaW4sIDApOwogCVdSVF9SRUdfRFdPUkQoJnJlZy0+cmVxX3Ffb3V0LCAwKTsKQEAgLTY5OSw3OCArNjg1LDE2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQKLXFsYWZ4MDBfdG1mX2lvY2JfdGltZW91dCh2b2lkICpkYXRhKQotewotCXNyYl90ICpzcCA9IChzcmJfdCAqKWRhdGE7Ci0Jc3RydWN0IHNyYl9pb2NiICp0bWYgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0KLQl0bWYtPnUudG1mLmNvbXBfc3RhdHVzID0gY3B1X3RvX2xlMTYoKHVpbnQxNl90KUNTX1RJTUVPVVQpOwotCWNvbXBsZXRlKCZ0bWYtPnUudG1mLmNvbXApOwotfQotCi1zdGF0aWMgdm9pZAotcWxhZngwMF90bWZfc3BfZG9uZSh2b2lkICpkYXRhLCB2b2lkICpwdHIsIGludCByZXMpCi17Ci0Jc3JiX3QgKnNwID0gKHNyYl90ICopcHRyOwotCXN0cnVjdCBzcmJfaW9jYiAqdG1mID0gJnNwLT51LmlvY2JfY21kOwotCi0JY29tcGxldGUoJnRtZi0+dS50bWYuY29tcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXFsYWZ4MDBfYXN5bmNfdG1fY21kKGZjX3BvcnRfdCAqZmNwb3J0LCB1aW50MzJfdCBmbGFncywKLQkJICAgICB1aW50MzJfdCBsdW4sIHVpbnQzMl90IHRhZykKLXsKLQlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IGZjcG9ydC0+dmhhOwotCXN0cnVjdCBzcmJfaW9jYiAqdG1faW9jYjsKLQlzcmJfdCAqc3A7Ci0JaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCi0Jc3AgPSBxbGEyeDAwX2dldF9zcCh2aGEsIGZjcG9ydCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcCkKLQkJZ290byBkb25lOwotCi0JdG1faW9jYiA9ICZzcC0+dS5pb2NiX2NtZDsKLQlzcC0+dHlwZSA9IFNSQl9UTV9DTUQ7Ci0Jc3AtPm5hbWUgPSAidG1mIjsKLQlxbGEyeDAwX2luaXRfdGltZXIoc3AsIHFsYTJ4MDBfZ2V0X2FzeW5jX3RpbWVvdXQodmhhKSk7Ci0JdG1faW9jYi0+dS50bWYuZmxhZ3MgPSBmbGFnczsKLQl0bV9pb2NiLT51LnRtZi5sdW4gPSBsdW47Ci0JdG1faW9jYi0+dS50bWYuZGF0YSA9IHRhZzsKLQlzcC0+ZG9uZSA9IHFsYWZ4MDBfdG1mX3NwX2RvbmU7Ci0JdG1faW9jYi0+dGltZW91dCA9IHFsYWZ4MDBfdG1mX2lvY2JfdGltZW91dDsKLQlpbml0X2NvbXBsZXRpb24oJnRtX2lvY2ItPnUudG1mLmNvbXApOwotCi0JcnZhbCA9IHFsYTJ4MDBfc3RhcnRfc3Aoc3ApOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQotCQlnb3RvIGRvbmVfZnJlZV9zcDsKLQotCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDdiLAotCSAgICAiVGFzayBtYW5hZ2VtZW50IGNvbW1hbmQgaXNzdWVkIHRhcmdldF9pZD0leFxuIiwKLQkgICAgZmNwb3J0LT50Z3RfaWQpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmdG1faW9jYi0+dS50bWYuY29tcCk7Ci0KLQlydmFsID0gdG1faW9jYi0+dS50bWYuY29tcF9zdGF0dXMgPT0gQ1NfQ09NUExFVEUgPwotCSAgICBRTEFfU1VDQ0VTUyA6IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0KLWRvbmVfZnJlZV9zcDoKLQlzcC0+ZnJlZSh2aGEsIHNwKTsKLWRvbmU6Ci0JcmV0dXJuIHJ2YWw7Ci19Ci0KIGludAogcWxhZngwMF9hYm9ydF90YXJnZXQoZmNfcG9ydF90ICpmY3BvcnQsIHVuc2lnbmVkIGludCBsLCBpbnQgdGFnKQogewotCXJldHVybiBxbGFmeDAwX2FzeW5jX3RtX2NtZChmY3BvcnQsIFRDRl9UQVJHRVRfUkVTRVQsIGwsIHRhZyk7CisJcmV0dXJuIHFsYTJ4MDBfYXN5bmNfdG1fY21kKGZjcG9ydCwgVENGX1RBUkdFVF9SRVNFVCwgbCwgdGFnKTsKIH0KIAogaW50CiBxbGFmeDAwX2x1bl9yZXNldChmY19wb3J0X3QgKmZjcG9ydCwgdW5zaWduZWQgaW50IGwsIGludCB0YWcpCiB7Ci0JcmV0dXJuIHFsYWZ4MDBfYXN5bmNfdG1fY21kKGZjcG9ydCwgVENGX0xVTl9SRVNFVCwgbCwgdGFnKTsKKwlyZXR1cm4gcWxhMngwMF9hc3luY190bV9jbWQoZmNwb3J0LCBUQ0ZfTFVOX1JFU0VULCBsLCB0YWcpOwogfQogCiBpbnQKQEAgLTk5Nyw2ICs5MjEsOSBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKKwkJCWlmICgoYWVubWJ4ICYgMHhGRjAwKSA9PSBNQkFfRldfSU5JVF9JTlBST0dSRVNTKQorCQkJCWJyZWFrOworCiAJCQkvKiBJZiBmdyBpcyBhcHBhcmVudGx5IG5vdCByZWFkeS4gSW4gb3JkZXIgdG8gY29udGludWUsCiAJCQkgKiB3ZSBtaWdodCBuZWVkIHRvIGlzc3VlIE1ib3ggY21kLCBidXQgdGhlIHByb2JsZW0gaXMKIAkJCSAqIHRoYXQgdGhlIERvb3JCZWxsIHZlY3RvciB2YWx1ZXMgdGhhdCBjb21lIHdpdGggdGhlCkBAIC0yMDE0LDcgKzE5NDEsOCBAQAogCQltZW1jcHkodmhhLT5ody0+Z2lkX2xpc3QsIHBpbmZvLCBRTEFGWDAwX1RHVF9OT0RFX0xJU1RfU0laRSk7CiAJfSBlbHNlIGlmIChmeF90eXBlID09IEZYRElTQ19BQk9SVF9JT0NUTCkKIAkJZmRpc2MtPnUuZnhpb2NiLnJlc3VsdCA9Ci0JCSAgICAoZmRpc2MtPnUuZnhpb2NiLnJlc3VsdCA9PSBjcHVfdG9fbGUzMigweDY4KSkgPworCQkgICAgKGZkaXNjLT51LmZ4aW9jYi5yZXN1bHQgPT0KKwkJCWNwdV90b19sZTMyKFFMQUZYMDBfSU9DVExfSUNPQl9BQk9SVF9TVUNDRVNTKSkgPwogCQkgICAgY3B1X3RvX2xlMzIoUUxBX1NVQ0NFU1MpIDogY3B1X3RvX2xlMzIoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CiAKIAlydmFsID0gbGUzMl90b19jcHUoZmRpc2MtPnUuZnhpb2NiLnJlc3VsdCk7CkBAIC0yMDM0LDk0ICsxOTYyLDYgQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAotc3RhdGljIHZvaWQKLXFsYWZ4MDBfYWJvcnRfaW9jYl90aW1lb3V0KHZvaWQgKmRhdGEpCi17Ci0Jc3JiX3QgKnNwID0gKHNyYl90ICopZGF0YTsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKmFidCA9ICZzcC0+dS5pb2NiX2NtZDsKLQotCWFidC0+dS5hYnQuY29tcF9zdGF0dXMgPSBjcHVfdG9fbGUxNigodWludDE2X3QpQ1NfVElNRU9VVCk7Ci0JY29tcGxldGUoJmFidC0+dS5hYnQuY29tcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1xbGFmeDAwX2Fib3J0X3NwX2RvbmUodm9pZCAqZGF0YSwgdm9pZCAqcHRyLCBpbnQgcmVzKQotewotCXNyYl90ICpzcCA9IChzcmJfdCAqKXB0cjsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKmFidCA9ICZzcC0+dS5pb2NiX2NtZDsKLQotCWNvbXBsZXRlKCZhYnQtPnUuYWJ0LmNvbXApOwotfQotCi1zdGF0aWMgaW50Ci1xbGFmeDAwX2FzeW5jX2FidF9jbWQoc3JiX3QgKmNtZF9zcCkKLXsKLQlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IGNtZF9zcC0+ZmNwb3J0LT52aGE7Ci0JZmNfcG9ydF90ICpmY3BvcnQgPSBjbWRfc3AtPmZjcG9ydDsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKmFidF9pb2NiOwotCXNyYl90ICpzcDsKLQlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0KLQlzcCA9IHFsYTJ4MDBfZ2V0X3NwKHZoYSwgZmNwb3J0LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNwKQotCQlnb3RvIGRvbmU7Ci0KLQlhYnRfaW9jYiA9ICZzcC0+dS5pb2NiX2NtZDsKLQlzcC0+dHlwZSA9IFNSQl9BQlRfQ01EOwotCXNwLT5uYW1lID0gImFib3J0IjsKLQlxbGEyeDAwX2luaXRfdGltZXIoc3AsIEZYRElTQ19USU1FT1VUKTsKLQlhYnRfaW9jYi0+dS5hYnQuY21kX2huZGwgPSBjbWRfc3AtPmhhbmRsZTsKLQlzcC0+ZG9uZSA9IHFsYWZ4MDBfYWJvcnRfc3BfZG9uZTsKLQlhYnRfaW9jYi0+dGltZW91dCA9IHFsYWZ4MDBfYWJvcnRfaW9jYl90aW1lb3V0OwotCWluaXRfY29tcGxldGlvbigmYWJ0X2lvY2ItPnUuYWJ0LmNvbXApOwotCi0JcnZhbCA9IHFsYTJ4MDBfc3RhcnRfc3Aoc3ApOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQotCQlnb3RvIGRvbmVfZnJlZV9zcDsKLQotCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDdjLAotCSAgICAiQWJvcnQgY29tbWFuZCBpc3N1ZWQgLSBoZGw9JXgsIHRhcmdldF9pZD0leFxuIiwKLQkgICAgY21kX3NwLT5oYW5kbGUsIGZjcG9ydC0+dGd0X2lkKTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFidF9pb2NiLT51LmFidC5jb21wKTsKLQotCXJ2YWwgPSBhYnRfaW9jYi0+dS5hYnQuY29tcF9zdGF0dXMgPT0gQ1NfQ09NUExFVEUgPwotCSAgICBRTEFfU1VDQ0VTUyA6IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0KLWRvbmVfZnJlZV9zcDoKLQlzcC0+ZnJlZSh2aGEsIHNwKTsKLWRvbmU6Ci0JcmV0dXJuIHJ2YWw7Ci19Ci0KLWludAotcWxhZngwMF9hYm9ydF9jb21tYW5kKHNyYl90ICpzcCkKLXsKLQl1bnNpZ25lZCBsb25nICAgZmxhZ3MgPSAwOwotCi0JdWludDMyX3QJaGFuZGxlOwotCWZjX3BvcnRfdAkqZmNwb3J0ID0gc3AtPmZjcG9ydDsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gZmNwb3J0LT52aGE7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+cmVxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JZm9yIChoYW5kbGUgPSAxOyBoYW5kbGUgPCBERUZBVUxUX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBoYW5kbGUrKykgewotCQlpZiAocmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPT0gc3ApCi0JCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlpZiAoaGFuZGxlID09IERFRkFVTFRfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKLQkJLyogQ29tbWFuZCBub3QgZm91bmQuICovCi0JCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCX0KLQlpZiAoc3AtPnR5cGUgPT0gU1JCX0ZYSU9DQl9EQ01EKQotCQlyZXR1cm4gcWxhZngwMF9meF9kaXNjKHZoYSwgJnZoYS0+aHctPm1yLmZjcG9ydCwKLQkJICAgIEZYRElTQ19BQk9SVF9JT0NUTCk7Ci0KLQlyZXR1cm4gcWxhZngwMF9hc3luY19hYnRfY21kKHNwKTsKLX0KLQogLyoKICAqIHFsYWZ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyCiAgKiAgICAgIEluaXRpYWxpemUgYm9hcmQuCkBAIC0yMTUwLDcgKzE5OTAsNiBAQAogCXZoYS0+ZGV2aWNlX2ZsYWdzID0gREZMR19OT19DQUJMRTsKIAl2aGEtPmRwY19mbGFncyA9IDA7CiAJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOwotCXZoYS0+bWFya2VyX25lZWRlZCA9IDA7CiAJaGEtPmlzcF9hYm9ydF9jbnQgPSAwOwogCWhhLT5iZWFjb25fYmxpbmtfbGVkID0gMDsKIApAQCAtMjM1NCw4ICsyMTkzLDcgQEAKIAkJZnN0YXR1cy5pb2N0bF9mbGFncyA9IHBrdC0+ZndfaW90Y2xfZmxhZ3M7CiAJCWZzdGF0dXMuaW9jdGxfZGF0YSA9IHBrdC0+ZGF0YXdvcmRfcjsKIAkJZnN0YXR1cy5hZGFwaWQgPSBwa3QtPmFkYXBpZDsKLQkJZnN0YXR1cy5hZGFwaWRfaGkgPSBwa3QtPmFkYXBpZF9oaTsKLQkJZnN0YXR1cy5yZXNlcnZlZF8yID0gcGt0LT5yZXNlcnZlZF8xOworCQlmc3RhdHVzLnJlc2VydmVkXzIgPSBwa3QtPmRhdGF3b3JkX3JfZXh0cmE7CiAJCWZzdGF0dXMucmVzX2NvdW50ID0gcGt0LT5yZXNpZHVhbGxlbjsKIAkJZnN0YXR1cy5zdGF0dXMgPSBwa3QtPnN0YXR1czsKIAkJZnN0YXR1cy5zZXFfbnVtYmVyID0gcGt0LT5zZXFfbm87CkBAIC0yODA0LDcgKzI2NDIsNyBAQAogCXNyYl90ICpzcDsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAljb25zdCBjaGFyIGZ1bmNbXSA9ICJFUlJPUi1JT0NCIjsKLQl1aW50MTZfdCBxdWUgPSBNU1cocGt0LT5oYW5kbGUpOworCXVpbnQxNl90IHF1ZSA9IDA7CiAJc3RydWN0IHJlcV9xdWUgKnJlcSA9IE5VTEw7CiAJaW50IHJlcyA9IERJRF9FUlJPUiA8PCAxNjsKIApAQCAtMjgzMywxNiArMjY3MSwyMiBAQAogewogCXN0cnVjdCBzdHNfZW50cnlfZngwMCAqcGt0OwogCXJlc3BvbnNlX3QgKmxwdHI7CisJdWludDE2X3QgbHJlcV9xX2luID0gMDsKKwl1aW50MTZfdCBscmVxX3Ffb3V0ID0gMDsKIAotCXdoaWxlIChSRF9SRUdfRFdPUkQoKHZvaWQgX19pb21lbSAqKSYocnNwLT5yaW5nX3B0ci0+c2lnbmF0dXJlKSkgIT0KLQkgICAgUkVTUE9OU0VfUFJPQ0VTU0VEKSB7CisJbHJlcV9xX2luID0gUkRfUkVHX0RXT1JEKHJzcC0+cnNwX3FfaW4pOworCWxyZXFfcV9vdXQgPSBSRF9SRUdfRFdPUkQocnNwLT5yc3BfcV9vdXQpOworCisJd2hpbGUgKGxyZXFfcV9pbiAhPSBscmVxX3Ffb3V0KSB7CiAJCWxwdHIgPSByc3AtPnJpbmdfcHRyOwogCQltZW1jcHlfZnJvbWlvKHJzcC0+cnNwX3BrdCwgKHZvaWQgX19pb21lbSAqKWxwdHIsCiAJCSAgICBzaXplb2YocnNwLT5yc3BfcGt0KSk7CiAJCXBrdCA9IChzdHJ1Y3Qgc3RzX2VudHJ5X2Z4MDAgKilyc3AtPnJzcF9wa3Q7CiAKIAkJcnNwLT5yaW5nX2luZGV4Kys7CisJCWxyZXFfcV9vdXQrKzsKIAkJaWYgKHJzcC0+cmluZ19pbmRleCA9PSByc3AtPmxlbmd0aCkgeworCQkJbHJlcV9xX291dCA9IDA7CiAJCQlyc3AtPnJpbmdfaW5kZXggPSAwOwogCQkJcnNwLT5yaW5nX3B0ciA9IHJzcC0+cmluZzsKIAkJfSBlbHNlIHsKQEAgLTI4NTQsNyArMjY5OCw2IEBACiAJCQlxbGFmeDAwX2Vycm9yX2VudHJ5KHZoYSwgcnNwLAogCQkJICAgIChzdHJ1Y3Qgc3RzX2VudHJ5X2Z4MDAgKilwa3QsIHBrdC0+ZW50cnlfc3RhdHVzLAogCQkJICAgIHBrdC0+ZW50cnlfdHlwZSk7Ci0JCQlnb3RvIG5leHRfaXRlcjsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTI4ODgsMTAgKzI3MzEsNiBAQAogCQkJICAgIHBrdC0+ZW50cnlfdHlwZSwgcGt0LT5lbnRyeV9zdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KLW5leHRfaXRlcjoKLQkJV1JUX1JFR19EV09SRCgodm9pZCBfX2lvbWVtICopJmxwdHItPnNpZ25hdHVyZSwKLQkJICAgIFJFU1BPTlNFX1BST0NFU1NFRCk7Ci0JCXdtYigpOwogCX0KIAogCS8qIEFkanVzdCByaW5nIGluZGV4ICovCkBAIC0yOTI2LDkgKzI3NjUsOSBAQAogCQlicmVhazsKIAogCWNhc2UgUUxBRlgwMF9NQkFfUE9SVF9VUERBVEU6CQkvKiBQb3J0IGRhdGFiYXNlIHVwZGF0ZSAqLwotCQloYS0+YWVubWJbMV0gPSBSRF9SRUdfV09SRCgmcmVnLT5hZW5tYWlsYm94MSk7Ci0JCWhhLT5hZW5tYlsyXSA9IFJEX1JFR19XT1JEKCZyZWctPmFlbm1haWxib3gyKTsKLQkJaGEtPmFlbm1iWzNdID0gUkRfUkVHX1dPUkQoJnJlZy0+YWVubWFpbGJveDMpOworCQloYS0+YWVubWJbMV0gPSBSRF9SRUdfRFdPUkQoJnJlZy0+YWVubWFpbGJveDEpOworCQloYS0+YWVubWJbMl0gPSBSRF9SRUdfRFdPUkQoJnJlZy0+YWVubWFpbGJveDIpOworCQloYS0+YWVubWJbM10gPSBSRF9SRUdfRFdPUkQoJnJlZy0+YWVubWFpbGJveDMpOwogCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA3NywKIAkJICAgICJBc3luY2hyb25vdXMgcG9ydCBVcGRhdGUgcmVjZWl2ZWQgIgogCQkgICAgImFlbm1iWzBdOiAleCwgYWVubWJbMV06ICV4LCBhZW5tYlsyXTogJXgsIGFlbm1iWzNdOiAleFxuIiwKQEAgLTI5ODUsNyArMjgyNCw3IEBACiBxbGFmeDAwX21ieF9jb21wbGV0aW9uKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCBtYjApCiB7CiAJdWludDE2X3QJY250OwotCXVpbnQxNl90IF9faW9tZW0gKndwdHI7CisJdWludDMyX3QgX19pb21lbSAqd3B0cjsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ19meDAwIF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3BmeDAwOwogCkBAIC0yOTk1LDEwICsyODM0LDEwIEBACiAJLyogTG9hZCByZXR1cm4gbWFpbGJveCByZWdpc3RlcnMuICovCiAJaGEtPmZsYWdzLm1ib3hfaW50ID0gMTsKIAloYS0+bWFpbGJveF9vdXQzMlswXSA9IG1iMDsKLQl3cHRyID0gKHVpbnQxNl90IF9faW9tZW0gKikmcmVnLT5tYWlsYm94MTc7CisJd3B0ciA9ICh1aW50MzJfdCBfX2lvbWVtICopJnJlZy0+bWFpbGJveDE3OwogCiAJZm9yIChjbnQgPSAxOyBjbnQgPCBoYS0+bWJ4X2NvdW50OyBjbnQrKykgewotCQloYS0+bWFpbGJveF9vdXQzMltjbnRdID0gUkRfUkVHX1dPUkQod3B0cik7CisJCWhhLT5tYWlsYm94X291dDMyW2NudF0gPSBSRF9SRUdfRFdPUkQod3B0cik7CiAJCXdwdHIrKzsKIAl9CiB9CkBAIC0zMDI1LDYgKzI4NjQsNyBAQAogCXN0cnVjdCByc3BfcXVlICpyc3A7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl1aW50MzJfdCBjbHJfaW50ciA9IDA7CisJdWludDMyX3QgaW50cl9zdGF0ID0gMDsKIAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKQEAgLTMwNDYsMzQgKzI4ODYsMjYgQEAKIAkJc3RhdCA9IFFMQUZYMDBfUkRfSU5UUl9SRUcoaGEpOwogCQlpZiAocWxhMngwMF9jaGVja19yZWdfZm9yX2Rpc2Nvbm5lY3QodmhhLCBzdGF0KSkKIAkJCWJyZWFrOwotCQlpZiAoKHN0YXQgJiBRTEFGWDAwX0hTVF9JTlRfU1RTX0JJVFMpID09IDApCisJCWludHJfc3RhdCA9IHN0YXQgJiBRTEFGWDAwX0hTVF9JTlRfU1RTX0JJVFM7CisJCWlmICghaW50cl9zdGF0KQogCQkJYnJlYWs7CiAKLQkJc3dpdGNoIChzdGF0ICYgUUxBRlgwMF9IU1RfSU5UX1NUU19CSVRTKSB7Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX01CX0NNUExUOgotCQljYXNlIFFMQUZYMDBfSU5UUl9NQl9SU1BfQ01QTFQ6Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX01CX0FTWU5DX0NNUExUOgotCQljYXNlIFFMQUZYMDBfSU5UUl9BTExfQ01QTFQ6CisJCWlmIChzdGF0ICYgUUxBRlgwMF9JTlRSX01CX0NNUExUKSB7CiAJCQltYlswXSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gxNik7CiAJCQlxbGFmeDAwX21ieF9jb21wbGV0aW9uKHZoYSwgbWJbMF0pOwogCQkJc3RhdHVzIHw9IE1CWF9JTlRFUlJVUFQ7CiAJCQljbHJfaW50ciB8PSBRTEFGWDAwX0lOVFJfTUJfQ01QTFQ7Ci0JCQlicmVhazsKLQkJY2FzZSBRTEFGWDAwX0lOVFJfQVNZTkNfQ01QTFQ6Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX1JTUF9BU1lOQ19DTVBMVDoKKwkJfQorCQlpZiAoaW50cl9zdGF0ICYgUUxBRlgwMF9JTlRSX0FTWU5DX0NNUExUKSB7CiAJCQloYS0+YWVubWJbMF0gPSBSRF9SRUdfV09SRCgmcmVnLT5hZW5tYWlsYm94MCk7CiAJCQlxbGFmeDAwX2FzeW5jX2V2ZW50KHZoYSk7CiAJCQljbHJfaW50ciB8PSBRTEFGWDAwX0lOVFJfQVNZTkNfQ01QTFQ7Ci0JCQlicmVhazsKLQkJY2FzZSBRTEFGWDAwX0lOVFJfUlNQX0NNUExUOgorCQl9CisJCWlmIChpbnRyX3N0YXQgJiBRTEFGWDAwX0lOVFJfUlNQX0NNUExUKSB7CiAJCQlxbGFmeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUodmhhLCByc3ApOwogCQkJY2xyX2ludHIgfD0gUUxBRlgwMF9JTlRSX1JTUF9DTVBMVDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwN2EsCi0JCQkgICAgIlVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwgc3RhdCk7Ci0JCQlicmVhazsKIAkJfQorCiAJCVFMQUZYMDBfQ0xSX0lOVFJfUkVHKGhhLCBjbHJfaW50cik7CiAJCVFMQUZYMDBfUkRfSU5UUl9SRUcoaGEpOwogCX0KQEAgLTMyMjMsMTcgKzMwNTUsNiBAQAogCS8qIFNvIHdlIGtub3cgd2UgaGF2ZW4ndCBwY2lfbWFwJ2VkIGFueXRoaW5nIHlldCAqLwogCXRvdF9kc2RzID0gMDsKIAotCS8qIEZvcmNpbmcgbWFya2VyIG5lZWRlZCBmb3Igbm93ICovCi0JdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKLQotCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkICovCi0JaWYgKHZoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7Ci0JCWlmIChxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KLQkJICAgIFFMQV9TVUNDRVNTKQotCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JCXZoYS0+bWFya2VyX25lZWRlZCA9IDA7Ci0JfQotCiAJLyogQWNxdWlyZSByaW5nIHNwZWNpZmljIGxvY2sgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtMzI4NCw3ICszMTA1LDkgQEAKIAltZW1zZXQoJmxjbWRfcGt0LCAwLCBSRVFVRVNUX0VOVFJZX1NJWkUpOwogCiAJbGNtZF9wa3QuaGFuZGxlID0gTUFLRV9IQU5ETEUocmVxLT5pZCwgc3AtPmhhbmRsZSk7Ci0JbGNtZF9wa3QuaGFuZGxlX2hpID0gMDsKKwlsY21kX3BrdC5yZXNlcnZlZF8wID0gMDsKKwlsY21kX3BrdC5wb3J0X3BhdGhfY3RybCA9IDA7CisJbGNtZF9wa3QucmVzZXJ2ZWRfMSA9IDA7CiAJbGNtZF9wa3QuZHNlZ19jb3VudCA9IGNwdV90b19sZTE2KHRvdF9kc2RzKTsKIAlsY21kX3BrdC50Z3RfaWR4ID0gY3B1X3RvX2xlMTYoc3AtPmZjcG9ydC0+dGd0X2lkKTsKIApAQCAtMzM2NCw4ICszMTg3LDcgQEAKIAl0bV9pb2NiLmVudHJ5X3R5cGUgPSBUU0tfTUdNVF9JT0NCX1RZUEVfRlgwMDsKIAl0bV9pb2NiLmVudHJ5X2NvdW50ID0gMTsKIAl0bV9pb2NiLmhhbmRsZSA9IGNwdV90b19sZTMyKE1BS0VfSEFORExFKHJlcS0+aWQsIHNwLT5oYW5kbGUpKTsKLQl0bV9pb2NiLmhhbmRsZV9oaSA9IDA7Ci0JdG1faW9jYi50aW1lb3V0ID0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpICsgMik7CisJdG1faW9jYi5yZXNlcnZlZF8wID0gMDsKIAl0bV9pb2NiLnRndF9pZCA9IGNwdV90b19sZTE2KHNwLT5mY3BvcnQtPnRndF9pZCk7CiAJdG1faW9jYi5jb250cm9sX2ZsYWdzID0gY3B1X3RvX2xlMzIoZnhpby0+dS50bWYuZmxhZ3MpOwogCWlmICh0bV9pb2NiLmNvbnRyb2xfZmxhZ3MgPT0gY3B1X3RvX2xlMzIoKHVpbnQzMl90KVRDRl9MVU5fUkVTRVQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5oCmluZGV4IDZjZDcwNzIuLmU1MjlkZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5oCkBAIC0yMiwxMyArMjIsMTYgQEAKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KIAogCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCi0JdWludDMyX3QgaGFuZGxlX2hpOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMDsKKwl1aW50OF90IHBvcnRfcGF0aF9jdHJsOworCXVpbnQxNl90IHJlc2VydmVkXzE7CiAKIAlfX2xlMTYgdGd0X2lkeDsJCS8qIFRhcmdldCBJZHguICovCiAJdWludDE2X3QgdGltZW91dDsJCS8qIENvbW1hbmQgdGltZW91dC4gKi8KIAogCV9fbGUxNiBkc2VnX2NvdW50OwkJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLwotCXVpbnQxNl90IHNjc2lfcnNwX2RzZF9sZW47CisJdWludDhfdAlzY3NpX3JzcF9kc2RfbGVuOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMjsKIAogCXN0cnVjdCBzY3NpX2x1biBsdW47CQkvKiBMVU4gKExFKS4gKi8KIApAQCAtNDcsMzAgKzUwLDYgQEAKIAl1aW50MzJfdCBkc2VnXzBfbGVuOwkJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLwogfTsKIAotLyoKLSAqIElTUCBxdWV1ZSAtIG1hcmtlciBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSAqLwotc3RydWN0IG1ya19lbnRyeV9meDAwIHsKLQl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLwotCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KLQl1aW50OF90IGhhbmRsZV9jb3VudDsJCS8qIEhhbmRsZSBjb3VudC4gKi8KLQl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KLQotCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCi0JdWludDMyX3QgaGFuZGxlX2hpOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQotCXVpbnQxNl90IHRndF9pZDsJCS8qIFRhcmdldCBJRC4gKi8KLQotCXVpbnQ4X3QgbW9kaWZpZXI7CQkvKiBNb2RpZmllciAoNy0wKS4gKi8KLQl1aW50OF90IHJlc2VydmVkXzE7Ci0KLQl1aW50OF90IHJlc2VydmVkXzJbNV07Ci0KLQl1aW50OF90IGx1bls4XTsJCQkvKiBGQ1AgTFVOIChCRSkuICovCi0JdWludDhfdCByZXNlcnZlZF8zWzM2XTsKLX07Ci0KLQogI2RlZmluZQlTVEFUVVNfVFlQRV9GWDAwCTB4MDEJCS8qIFN0YXR1cyBlbnRyeS4gKi8KIHN0cnVjdCBzdHNfZW50cnlfZngwMCB7CiAJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KQEAgLTc5LDcgKzU4LDcgQEAKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KIAogCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCi0JdWludDMyX3QgaGFuZGxlX2hpOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8zOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KIAogCV9fbGUxNiBjb21wX3N0YXR1czsJCS8qIENvbXBsZXRpb24gc3RhdHVzLiAqLwogCXVpbnQxNl90IHJlc2VydmVkXzA7CQkvKiBPWF9JRCB1c2VkIGJ5IHRoZSBmaXJtd2FyZS4gKi8KQEAgLTEwMiw3ICs4MSw3IEBACiAKIHN0cnVjdCBtdWx0aV9zdHNfZW50cnlfZngwMCB7CiAJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KLQl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCBoYW5kbGVfY291bnQ7CiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CiAKQEAgLTExOCwxNSArOTcsMTMgQEAKIAogCV9fbGUzMiBoYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwogCi0JdWludDMyX3QgaGFuZGxlX2hpOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8wOwogCiAJX19sZTE2IHRndF9pZDsJCS8qIFRhcmdldCBJZHguICovCiAKIAl1aW50MTZfdCByZXNlcnZlZF8xOwotCi0JdWludDE2X3QgZGVsYXk7CQkJLyogQWN0aXZpdHkgZGVsYXkgaW4gc2Vjb25kcy4gKi8KLQotCV9fbGUxNiB0aW1lb3V0OwkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCXVpbnQxNl90IHJlc2VydmVkXzM7CisJdWludDE2X3QgcmVzZXJ2ZWRfNDsKIAogCXN0cnVjdCBzY3NpX2x1biBsdW47CQkvKiBMVU4gKExFKS4gKi8KIApAQCAtMTQ0LDEzICsxMjEsMTMgQEAKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KIAogCV9fbGUzMiBoYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwotCV9fbGUzMiBoYW5kbGVfaGk7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCV9fbGUzMiByZXNlcnZlZF8wOwogCiAJX19sZTE2IHRndF9pZF9zdHM7CQkvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KIAlfX2xlMTYgb3B0aW9uczsKIAogCV9fbGUzMiBhYm9ydF9oYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwotCV9fbGUzMiBhYm9ydF9oYW5kbGVfaGk7CS8qIFN5c3RlbSBoYW5kbGUuICovCisJX19sZTMyIHJlc2VydmVkXzI7CiAKIAlfX2xlMTYgcmVxX3F1ZV9ubzsKIAl1aW50OF90IHJlc2VydmVkXzFbMzhdOwpAQCAtMTcxLDggKzE0OCw3IEBACiAKIAlfX2xlMzIgZGF0YXdvcmRfcjsJCS8qIERhdGEgd29yZCByZXR1cm5lZCAqLwogCXVpbnQzMl90IGFkYXBpZDsJCS8qIEFkYXB0ZXIgSUQgKi8KLQl1aW50MzJfdCBhZGFwaWRfaGk7CQkvKiBBZGFwdGVyIElEIGhpZ2ggKi8KLQl1aW50MzJfdCByZXNlcnZlZF8xOworCXVpbnQzMl90IGRhdGF3b3JkX3JfZXh0cmE7CiAKIAlfX2xlMzIgc2VxX25vOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMlsyMF07CkBAIC0zNjAsMTEgKzMzNiw3IEBACiAKICNkZWZpbmUgUUxBRlgwMF9JTlRSX01CX0NNUExUCQkweDEKICNkZWZpbmUgUUxBRlgwMF9JTlRSX1JTUF9DTVBMVAkJMHgyCi0jZGVmaW5lIFFMQUZYMDBfSU5UUl9NQl9SU1BfQ01QTFQJMHgzCiAjZGVmaW5lIFFMQUZYMDBfSU5UUl9BU1lOQ19DTVBMVAkweDQKLSNkZWZpbmUgUUxBRlgwMF9JTlRSX01CX0FTWU5DX0NNUExUCTB4NQotI2RlZmluZSBRTEFGWDAwX0lOVFJfUlNQX0FTWU5DX0NNUExUCTB4NgotI2RlZmluZSBRTEFGWDAwX0lOVFJfQUxMX0NNUExUCQkweDcKIAogI2RlZmluZSBRTEFGWDAwX01CQV9TWVNURU1fRVJSCQkweDgwMDIKICNkZWZpbmUgUUxBRlgwMF9NQkFfVEVNUF9PVkVSCQkweDgwMDUKQEAgLTU0OCw0ICs1MjAsNyBAQAogLyogTWF4IGNvbm5jdXJyZW50IElPcyB0aGF0IGNhbiBiZSBxdWV1ZWQgKi8KICNkZWZpbmUgUUxBRlgwMF9NQVhfQ0FOUVVFVUUJCTEwMjQKIAorLyogSU9DVEwgSU9DQiBhYm9ydCBzdWNjZXNzICovCisjZGVmaW5lIFFMQUZYMDBfSU9DVExfSUNPQl9BQk9SVF9TVUNDRVNTCTB4NjgKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCmluZGV4IDFlNmJhNGEuLjU1MTFlMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCkBAIC0xNjY0LDEwICsxNjY0LDEwIEBACiAJLyogTWFwcGluZyBvZiBJTyBiYXNlIHBvaW50ZXIgKi8KIAlpZiAoSVNfUUxBODA0NChoYSkpIHsKIAkJaGEtPmlvYmFzZSA9Ci0JCSAgICAoZGV2aWNlX3JlZ190IF9faW9tZW0gKikoKHVpbnQ4X3QgKiloYS0+bnhfcGNpYmFzZSk7CisJCSAgICAoZGV2aWNlX3JlZ190ICopKCh1aW50OF90ICopaGEtPm54X3BjaWJhc2UpOwogCX0gZWxzZSBpZiAoSVNfUUxBODJYWChoYSkpIHsKIAkJaGEtPmlvYmFzZSA9Ci0JCSAgICAoZGV2aWNlX3JlZ190IF9faW9tZW0gKikoKHVpbnQ4X3QgKiloYS0+bnhfcGNpYmFzZSArCisJCSAgICAoZGV2aWNlX3JlZ190ICopKCh1aW50OF90ICopaGEtPm54X3BjaWJhc2UgKwogCQkJMHhiYzAwMCArIChoYS0+cGRldi0+ZGV2Zm4gPDwgMTEpKTsKIAl9CiAKQEAgLTQ1MDIsMyArNDUwMiwyMCBAQAogCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAJcmV0dXJuIHJ2YWw7CiB9CisKK3ZvaWQKK3FsYTgyeHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWlmICghaGEtPmFsbG93X2NuYV9md19kdW1wKQorCQlyZXR1cm47CisKKwlzY3NpX2Jsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CisJaGEtPmZsYWdzLmlzcDgyeHhfbm9fbWRfY2FwID0gMTsKKwlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKKwlxbGE4Mnh4X3NldF9yZXNldF9vd25lcih2aGEpOworCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CisJcWxhMngwMF93YWl0X2Zvcl9jaGlwX3Jlc2V0KHZoYSk7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbngyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbngyLmMKaW5kZXggZjYwOTg5ZC4uODZjZjEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254Mi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueDIuYwpAQCAtMTU3OCw4ICsxNTc4LDggQEAKIAkJZG8gewogCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZGV2X2luaXRfdGltZW91dCkpIHsKIAkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMGM0LAotCQkJCSAgICAiJXM6IE5vbiBSZXNldCBvd25lciBERVYgSU5JVCAiCi0JCQkJICAgICJUSU1FT1VUIVxuIiwgX19mdW5jX18pOworCQkJCSAgICAiJXM6IE5vbiBSZXNldCBvd25lcjogUmVzZXQgQWNrIFRpbWVvdXQhXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIwMTQsOCArMjAxNCw2IEBACiAKIAkvKiBkb24ndCBwb2xsIGlmIHJlc2V0IGlzIGdvaW5nIG9uIG9yIEZXIGhhbmcgaW4gcXVpZXNjZW50IHN0YXRlICovCiAJaWYgKCEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpKSB7CiAJCWRldl9zdGF0ZSA9IHFsYTgwNDRfcmRfZGlyZWN0KHZoYSwgUUxBODA0NF9DUkJfREVWX1NUQVRFX0lOREVYKTsKIApAQCAtMzcxNSwzICszNzEzLDE5IEBACiAJcmV0dXJuIHJ2YWw7CiB9CiAKK3ZvaWQKK3FsYTgwNDRfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWlmICghaGEtPmFsbG93X2NuYV9md19kdW1wKQorCQlyZXR1cm47CisKKwlzY3NpX2Jsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CisJaGEtPmZsYWdzLmlzcDgyeHhfbm9fbWRfY2FwID0gMTsKKwlxbGE4MDQ0X2lkY19sb2NrKGhhKTsKKwlxbGE4Mnh4X3NldF9yZXNldF9vd25lcih2aGEpOworCXFsYTgwNDRfaWRjX3VubG9jayhoYSk7CisJcWxhMngwMF93YWl0X2Zvcl9jaGlwX3Jlc2V0KHZoYSk7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCmluZGV4IDg5YTUzMDAuLjE5ZTk5Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCkBAIC0xMjAsMTUgKzEyMCwxNyBAQAogaW50IHFsMnhlbmFibGVkaWYgPSAyOwogbW9kdWxlX3BhcmFtKHFsMnhlbmFibGVkaWYsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhlbmFibGVkaWYsCi0JCSIgRW5hYmxlIFQxMC1DUkMtRElGICIKLQkJIiBEZWZhdWx0IGlzIDAgLSBObyBESUYgU3VwcG9ydC4gMSAtIEVuYWJsZSBpdCIKLQkJIiwgMiAtIEVuYWJsZSBESUYgZm9yIGFsbCB0eXBlcywgZXhjZXB0IFR5cGUgMC4iKTsKKwkJIiBFbmFibGUgVDEwLUNSQy1ESUY6XG4iCisJCSIgRGVmYXVsdCBpcyAyLlxuIgorCQkiICAwIC0tIE5vIERJRiBTdXBwb3J0XG4iCisJCSIgIDEgLS0gRW5hYmxlIERJRiBmb3IgYWxsIHR5cGVzXG4iCisJCSIgIDIgLS0gRW5hYmxlIERJRiBmb3IgYWxsIHR5cGVzLCBleGNlcHQgVHlwZSAwLlxuIik7CiAKIGludCBxbDJ4ZW5hYmxlaGJhX2Vycl9jaGsgPSAyOwogbW9kdWxlX3BhcmFtKHFsMnhlbmFibGVoYmFfZXJyX2NoaywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZW5hYmxlaGJhX2Vycl9jaGssCiAJCSIgRW5hYmxlIFQxMC1DUkMtRElGIEVycm9yIGlzb2xhdGlvbiBieSBIQkE6XG4iCi0JCSIgRGVmYXVsdCBpcyAxLlxuIgorCQkiIERlZmF1bHQgaXMgMi5cbiIKIAkJIiAgMCAtLSBFcnJvciBpc29sYXRpb24gZGlzYWJsZWRcbiIKIAkJIiAgMSAtLSBFcnJvciBpc29sYXRpb24gZW5hYmxlZCBvbmx5IGZvciBESVggVHlwZSAwXG4iCiAJCSIgIDIgLS0gRXJyb3IgaXNvbGF0aW9uIGVuYWJsZWQgZm9yIGFsbCBUeXBlc1xuIik7CkBAIC0xOTc1LDcgKzE5NzcsNyBAQAogCS5wcmVwX21zX2ZkbWlfaW9jYgk9IHFsYTI0eHhfcHJlcF9tc19mZG1pX2lvY2IsCiAJLnJlYWRfbnZyYW0JCT0gcWxhMjR4eF9yZWFkX252cmFtX2RhdGEsCiAJLndyaXRlX252cmFtCQk9IHFsYTI0eHhfd3JpdGVfbnZyYW1fZGF0YSwKLQkuZndfZHVtcAkJPSBxbGEyNHh4X2Z3X2R1bXAsCisJLmZ3X2R1bXAJCT0gcWxhODJ4eF9md19kdW1wLAogCS5iZWFjb25fb24JCT0gcWxhODJ4eF9iZWFjb25fb24sCiAJLmJlYWNvbl9vZmYJCT0gcWxhODJ4eF9iZWFjb25fb2ZmLAogCS5iZWFjb25fYmxpbmsJCT0gTlVMTCwKQEAgLTIwMTMsMTEgKzIwMTUsMTEgQEAKIAkucHJlcF9tc19mZG1pX2lvY2IJPSBxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiLAogCS5yZWFkX252cmFtCQk9IE5VTEwsCiAJLndyaXRlX252cmFtCQk9IE5VTEwsCi0JLmZ3X2R1bXAJCT0gcWxhMjR4eF9md19kdW1wLAorCS5md19kdW1wCQk9IHFsYTgwNDRfZndfZHVtcCwKIAkuYmVhY29uX29uCQk9IHFsYTgyeHhfYmVhY29uX29uLAogCS5iZWFjb25fb2ZmCQk9IHFsYTgyeHhfYmVhY29uX29mZiwKIAkuYmVhY29uX2JsaW5rCQk9IE5VTEwsCi0JLnJlYWRfb3B0cm9tCQk9IHFsYTgyeHhfcmVhZF9vcHRyb21fZGF0YSwKKwkucmVhZF9vcHRyb20JCT0gcWxhODA0NF9yZWFkX29wdHJvbV9kYXRhLAogCS53cml0ZV9vcHRyb20JCT0gcWxhODA0NF93cml0ZV9vcHRyb21fZGF0YSwKIAkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGE4Mnh4X2dldF9mbGFzaF92ZXJzaW9uLAogCS5zdGFydF9zY3NpICAgICAgICAgICAgID0gcWxhODJ4eF9zdGFydF9zY3NpLApAQCAtMjA3OCw3ICsyMDgwLDcgQEAKIAkuaW50cl9oYW5kbGVyCQk9IHFsYWZ4MDBfaW50cl9oYW5kbGVyLAogCS5lbmFibGVfaW50cnMJCT0gcWxhZngwMF9lbmFibGVfaW50cnMsCiAJLmRpc2FibGVfaW50cnMJCT0gcWxhZngwMF9kaXNhYmxlX2ludHJzLAotCS5hYm9ydF9jb21tYW5kCQk9IHFsYWZ4MDBfYWJvcnRfY29tbWFuZCwKKwkuYWJvcnRfY29tbWFuZAkJPSBxbGEyNHh4X2FzeW5jX2Fib3J0X2NvbW1hbmQsCiAJLnRhcmdldF9yZXNldAkJPSBxbGFmeDAwX2Fib3J0X3RhcmdldCwKIAkubHVuX3Jlc2V0CQk9IHFsYWZ4MDBfbHVuX3Jlc2V0LAogCS5mYWJyaWNfbG9naW4JCT0gTlVMTCwKQEAgLTIxMDIsNiArMjEwNCw0NCBAQAogCS5pbml0aWFsaXplX2FkYXB0ZXIJPSBxbGFmeDAwX2luaXRpYWxpemVfYWRhcHRlciwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXNwX29wZXJhdGlvbnMgcWxhMjd4eF9pc3Bfb3BzID0geworCS5wY2lfY29uZmlnCQk9IHFsYTI1eHhfcGNpX2NvbmZpZywKKwkucmVzZXRfY2hpcAkJPSBxbGEyNHh4X3Jlc2V0X2NoaXAsCisJLmNoaXBfZGlhZwkJPSBxbGEyNHh4X2NoaXBfZGlhZywKKwkuY29uZmlnX3JpbmdzCQk9IHFsYTI0eHhfY29uZmlnX3JpbmdzLAorCS5yZXNldF9hZGFwdGVyCQk9IHFsYTI0eHhfcmVzZXRfYWRhcHRlciwKKwkubnZyYW1fY29uZmlnCQk9IHFsYTgxeHhfbnZyYW1fY29uZmlnLAorCS51cGRhdGVfZndfb3B0aW9ucwk9IHFsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMsCisJLmxvYWRfcmlzYwkJPSBxbGE4MXh4X2xvYWRfcmlzYywKKwkucGNpX2luZm9fc3RyCQk9IHFsYTI0eHhfcGNpX2luZm9fc3RyLAorCS5md192ZXJzaW9uX3N0cgkJPSBxbGEyNHh4X2Z3X3ZlcnNpb25fc3RyLAorCS5pbnRyX2hhbmRsZXIJCT0gcWxhMjR4eF9pbnRyX2hhbmRsZXIsCisJLmVuYWJsZV9pbnRycwkJPSBxbGEyNHh4X2VuYWJsZV9pbnRycywKKwkuZGlzYWJsZV9pbnRycwkJPSBxbGEyNHh4X2Rpc2FibGVfaW50cnMsCisJLmFib3J0X2NvbW1hbmQJCT0gcWxhMjR4eF9hYm9ydF9jb21tYW5kLAorCS50YXJnZXRfcmVzZXQJCT0gcWxhMjR4eF9hYm9ydF90YXJnZXQsCisJLmx1bl9yZXNldAkJPSBxbGEyNHh4X2x1bl9yZXNldCwKKwkuZmFicmljX2xvZ2luCQk9IHFsYTI0eHhfbG9naW5fZmFicmljLAorCS5mYWJyaWNfbG9nb3V0CQk9IHFsYTI0eHhfZmFicmljX2xvZ291dCwKKwkuY2FsY19yZXFfZW50cmllcwk9IE5VTEwsCisJLmJ1aWxkX2lvY2JzCQk9IE5VTEwsCisJLnByZXBfbXNfaW9jYgkJPSBxbGEyNHh4X3ByZXBfbXNfaW9jYiwKKwkucHJlcF9tc19mZG1pX2lvY2IJPSBxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiLAorCS5yZWFkX252cmFtCQk9IE5VTEwsCisJLndyaXRlX252cmFtCQk9IE5VTEwsCisJLmZ3X2R1bXAJCT0gcWxhMjd4eF9md2R1bXAsCisJLmJlYWNvbl9vbgkJPSBxbGEyNHh4X2JlYWNvbl9vbiwKKwkuYmVhY29uX29mZgkJPSBxbGEyNHh4X2JlYWNvbl9vZmYsCisJLmJlYWNvbl9ibGluawkJPSBxbGE4M3h4X2JlYWNvbl9ibGluaywKKwkucmVhZF9vcHRyb20JCT0gcWxhMjV4eF9yZWFkX29wdHJvbV9kYXRhLAorCS53cml0ZV9vcHRyb20JCT0gcWxhMjR4eF93cml0ZV9vcHRyb21fZGF0YSwKKwkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGEyNHh4X2dldF9mbGFzaF92ZXJzaW9uLAorCS5zdGFydF9zY3NpCQk9IHFsYTI0eHhfZGlmX3N0YXJ0X3Njc2ksCisJLmFib3J0X2lzcAkJPSBxbGEyeDAwX2Fib3J0X2lzcCwKKwkuaW9zcGFjZV9jb25maWcJCT0gcWxhODN4eF9pb3NwYWNlX2NvbmZpZywKKwkuaW5pdGlhbGl6ZV9hZGFwdGVyCT0gcWxhMngwMF9pbml0aWFsaXplX2FkYXB0ZXIsCit9OworCiBzdGF0aWMgaW5saW5lIHZvaWQKIHFsYTJ4MDBfc2V0X2lzcF9mbGFncyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewpAQCAtMjIyMywyMSArMjI2MywyOSBAQAogCWNhc2UgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQRjAwMToKIAkJaGEtPmRldmljZV90eXBlIHw9IERUX0lTUEZYMDA7CiAJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjA3MToKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0lTUDIwNzE7CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9aSU9fU1VQUE9SVEVEOworCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfRldJMjsKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0lJRE1BOworCQloYS0+Zndfc3Jpc2NfYWRkcmVzcyA9IFJJU0NfU1RBUlRfQUREUkVTU18yNDAwOworCQlicmVhazsKIAl9CiAKIAlpZiAoSVNfUUxBODJYWChoYSkpCi0JCWhhLT5wb3J0X25vID0gIShoYS0+cG9ydG51bSAmIDEpOwotCWVsc2UKKwkJaGEtPnBvcnRfbm8gPSBoYS0+cG9ydG51bSAmIDE7CisJZWxzZSB7CiAJCS8qIEdldCBhZGFwdGVyIHBoeXNpY2FsIHBvcnQgbm8gZnJvbSBpbnRlcnJ1cHQgcGluIHJlZ2lzdGVyLiAqLwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShoYS0+cGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZoYS0+cG9ydF9ubyk7CisJCWlmIChJU19RTEEyN1hYKGhhKSkKKwkJCWhhLT5wb3J0X25vLS07CisJCWVsc2UKKwkJCWhhLT5wb3J0X25vID0gIShoYS0+cG9ydF9ubyAmIDEpOworCX0KIAotCWlmIChoYS0+cG9ydF9ubyAmIDEpCi0JCWhhLT5mbGFncy5wb3J0MCA9IDE7Ci0JZWxzZQotCQloYS0+ZmxhZ3MucG9ydDAgPSAwOwogCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMGIsCiAJICAgICJkZXZpY2VfdHlwZT0weCV4IHBvcnQ9JWQgZndfc3Jpc2NfYWRkcmVzcz0weCV4LlxuIiwKLQkgICAgaGEtPmRldmljZV90eXBlLCBoYS0+ZmxhZ3MucG9ydDAsIGhhLT5md19zcmlzY19hZGRyZXNzKTsKKwkgICAgaGEtPmRldmljZV90eXBlLCBoYS0+cG9ydF9ubywgaGEtPmZ3X3NyaXNjX2FkZHJlc3MpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjI5Nyw3ICsyMzQ1LDggQEAKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIwMzEgfHwKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMzEgfHwKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUEYwMDEgfHwKLQkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwNDQpIHsKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwNDQgfHwKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIwNzEpIHsKIAkJYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSk7CiAJCW1lbV9vbmx5ID0gMTsKIAkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDA3LApAQCAtMjMzNCwxMyArMjM4MywxNCBAQAogCXNwaW5fbG9ja19pbml0KCZoYS0+aGFyZHdhcmVfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmhhLT52cG9ydF9zbG9jayk7CiAJbXV0ZXhfaW5pdCgmaGEtPnNlbGZsb2dpbl9sb2NrKTsKKwltdXRleF9pbml0KCZoYS0+b3B0cm9tX211dGV4KTsKIAogCS8qIFNldCBJU1AtdHlwZSBpbmZvcm1hdGlvbi4gKi8KIAlxbGEyeDAwX3NldF9pc3BfZmxhZ3MoaGEpOwogCiAJLyogU2V0IEVFSCByZXNldCB0eXBlIHRvIGZ1bmRhbWVudGFsIGlmIHJlcXVpcmVkIGJ5IGhiYSAqLwogCWlmIChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fAotCSAgICBJU19RTEE4M1hYKGhhKSkKKwkgICAgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCXBkZXYtPm5lZWRzX2ZyZXNldCA9IDE7CiAKIAloYS0+cHJldl90b3BvbG9neSA9IDA7CkBAIC0yNDg4LDcgKzI1MzgsNiBAQAogCQloYS0+YWVuX21ieF9jb3VudCA9IEFFTl9NQUlMQk9YX1JFR0lTVEVSX0NPVU5UX0ZYMDA7CiAJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF9GWDAwOwogCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UX0ZYMDA7Ci0JCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2Yoc3RydWN0IGluaXRfY2JfZngpOwogCQloYS0+aXNwX29wcyA9ICZxbGFmeDAwX2lzcF9vcHM7CiAJCWhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSAzMDsgLyogZGVmYXVsdCB2YWx1ZSAqLwogCQloYS0+bXIuZndfaGJ0X2NudCA9IFFMQUZYMDBfSEVBUlRCRUFUX0lOVEVSVkFMOwpAQCAtMjQ5Nyw2ICsyNTQ2LDIyIEBACiAJCWhhLT5tci5md19oYnRfZW4gPSAxOwogCQloYS0+bXIuaG9zdF9pbmZvX3Jlc2VuZCA9IGZhbHNlOwogCQloYS0+bXIuaGluZm9fcmVzZW5kX3RpbWVyX3RpY2sgPSBRTEFGWDAwX0hJTkZPX1JFU0VORF9JTlRFUlZBTDsKKwl9IGVsc2UgaWYgKElTX1FMQTI3WFgoaGEpKSB7CisJCWhhLT5wb3J0bnVtID0gUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKwkJaGEtPm1heF9maWJyZV9kZXZpY2VzID0gTUFYX0ZJQlJFX0RFVklDRVNfMjQwMDsKKwkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CisJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOworCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7CisJCWhhLT5tYXhfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjMwMDsKKwkJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWlkX2luaXRfY2JfODF4eCk7CisJCWhhLT5naWRfbGlzdF9pbmZvX3NpemUgPSA4OworCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV84M1hYOworCQloYS0+bnZyYW1fbnBpdl9zaXplID0gUUxBX01BWF9WUE9SVFNfUUxBMjVYWDsKKwkJaGEtPmlzcF9vcHMgPSAmcWxhMjd4eF9pc3Bfb3BzOworCQloYS0+Zmxhc2hfY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9DT05GXzgxWFg7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0RBVEFfODFYWDsKKwkJaGEtPm52cmFtX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5udnJhbV9kYXRhX29mZiA9IH4wOwogCX0KIAogCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIHBkZXYsIDB4MDAxZSwKQEAgLTI1MzYsNyArMjYwMSw3IEBACiAJICAgIGhhLT5mbGFncy5lbmFibGVfNjRiaXRfYWRkcmVzc2luZyA/ICJlbmFibGUiIDoKIAkgICAgImRpc2FibGUiKTsKIAlyZXQgPSBxbGEyeDAwX21lbV9hbGxvYyhoYSwgcmVxX2xlbmd0aCwgcnNwX2xlbmd0aCwgJnJlcSwgJnJzcCk7Ci0JaWYgKCFyZXQpIHsKKwlpZiAocmV0KSB7CiAJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBwZGV2LCAweDAwMzEsCiAJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciwgYWJvcnRpbmcuXG4iKTsKIApAQCAtMjU2MSwxMCArMjYyNiw2IEBACiAKIAlob3N0ID0gYmFzZV92aGEtPmhvc3Q7CiAJYmFzZV92aGEtPnJlcSA9IHJlcTsKLQlpZiAoSVNfUUxBRlgwMChoYSkpCi0JCWhvc3QtPmNhbl9xdWV1ZSA9IFFMQUZYMDBfTUFYX0NBTlFVRVVFOwotCWVsc2UKLQkJaG9zdC0+Y2FuX3F1ZXVlID0gcmVxLT5sZW5ndGggKyAxMjg7CiAJaWYgKElTX1FMQTJYWFhfTUlEVFlQRShoYSkpCiAJCWJhc2VfdmhhLT5tZ210X3N2cl9sb29wX2lkID0gMTAgKyBiYXNlX3ZoYS0+dnBfaWR4OwogCWVsc2UKQEAgLTI1ODcsMTEgKzI2NDgsNiBAQAogCQlpZiAoIUlTX1FMQTgyWFgoaGEpKQogCQkJaG9zdC0+c2dfdGFibGVzaXplID0gUUxBX1NHX0FMTDsKIAl9Ci0JcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMDMyLAotCSAgICAiY2FuX3F1ZXVlPSVkLCByZXE9JXAsICIKLQkgICAgIm1nbXRfc3ZyX2xvb3BfaWQ9JWQsIHNnX3RhYmxlc2l6ZT0lZC5cbiIsCi0JICAgIGhvc3QtPmNhbl9xdWV1ZSwgYmFzZV92aGEtPnJlcSwKLQkgICAgYmFzZV92aGEtPm1nbXRfc3ZyX2xvb3BfaWQsIGhvc3QtPnNnX3RhYmxlc2l6ZSk7CiAJaG9zdC0+bWF4X2lkID0gaGEtPm1heF9maWJyZV9kZXZpY2VzOwogCWhvc3QtPmNtZF9wZXJfbHVuID0gMzsKIAlob3N0LT51bmlxdWVfaWQgPSBob3N0LT5ob3N0X25vOwpAQCAtMjY0Niw3ICsyNzAyLDcgQEAKIAlyZXEtPnJlcV9xX291dCA9ICZoYS0+aW9iYXNlLT5pc3AyNC5yZXFfcV9vdXQ7CiAJcnNwLT5yc3BfcV9pbiA9ICZoYS0+aW9iYXNlLT5pc3AyNC5yc3BfcV9pbjsKIAlyc3AtPnJzcF9xX291dCA9ICZoYS0+aW9iYXNlLT5pc3AyNC5yc3BfcV9vdXQ7Ci0JaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkgeworCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJcmVxLT5yZXFfcV9pbiA9ICZoYS0+bXFpb2Jhc2UtPmlzcDI1bXEucmVxX3FfaW47CiAJCXJlcS0+cmVxX3Ffb3V0ID0gJmhhLT5tcWlvYmFzZS0+aXNwMjVtcS5yZXFfcV9vdXQ7CiAJCXJzcC0+cnNwX3FfaW4gPSAmaGEtPm1xaW9iYXNlLT5pc3AyNW1xLnJzcF9xX2luOwpAQCAtMjcwNyw2ICsyNzYzLDE2IEBACiAJCWdvdG8gcHJvYmVfZmFpbGVkOwogCX0KIAorCWlmIChJU19RTEFGWDAwKGhhKSkKKwkJaG9zdC0+Y2FuX3F1ZXVlID0gUUxBRlgwMF9NQVhfQ0FOUVVFVUU7CisJZWxzZQorCQlob3N0LT5jYW5fcXVldWUgPSByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzIC0gMTA7CisKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwMzIsCisJICAgICJjYW5fcXVldWU9JWQsIHJlcT0lcCwgbWdtdF9zdnJfbG9vcF9pZD0lZCwgc2dfdGFibGVzaXplPSVkLlxuIiwKKwkgICAgaG9zdC0+Y2FuX3F1ZXVlLCBiYXNlX3ZoYS0+cmVxLAorCSAgICBiYXNlX3ZoYS0+bWdtdF9zdnJfbG9vcF9pZCwgaG9zdC0+c2dfdGFibGVzaXplKTsKKwogCWlmIChoYS0+bXFlbmFibGUpIHsKIAkJaWYgKHFsYTI1eHhfc2V0dXBfbW9kZShiYXNlX3ZoYSkpIHsKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MDBlYywKQEAgLTI4ODcsOSArMjk1Myw5IEBACiBpb3NwYWNlX2NvbmZpZ19mYWlsZWQ6CiAJaWYgKElTX1AzUF9UWVBFKGhhKSkgewogCQlpZiAoIWhhLT5ueF9wY2liYXNlKQotCQkJaW91bm1hcCgoZGV2aWNlX3JlZ190IF9faW9tZW0gKiloYS0+bnhfcGNpYmFzZSk7CisJCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgKiloYS0+bnhfcGNpYmFzZSk7CiAJCWlmICghcWwyeGRid3IpCi0JCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgX19pb21lbSAqKWhhLT5ueGRiX3dyX3B0cik7CisJCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgKiloYS0+bnhkYl93cl9wdHIpOwogCX0gZWxzZSB7CiAJCWlmIChoYS0+aW9iYXNlKQogCQkJaW91bm1hcChoYS0+aW9iYXNlKTsKQEAgLTMwMjAsOSArMzA4Niw5IEBACiB7CiAJaWYgKElTX1FMQTgyWFgoaGEpKSB7CiAKLQkJaW91bm1hcCgoZGV2aWNlX3JlZ190IF9faW9tZW0gKiloYS0+bnhfcGNpYmFzZSk7CisJCWlvdW5tYXAoKGRldmljZV9yZWdfdCAqKWhhLT5ueF9wY2liYXNlKTsKIAkJaWYgKCFxbDJ4ZGJ3cikKLQkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCBfX2lvbWVtICopaGEtPm54ZGJfd3JfcHRyKTsKKwkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCAqKWhhLT5ueGRiX3dyX3B0cik7CiAJfSBlbHNlIHsKIAkJaWYgKGhhLT5pb2Jhc2UpCiAJCQlpb3VubWFwKGhhLT5pb2Jhc2UpOwpAQCAtMzAzMyw3ICszMDk5LDcgQEAKIAkJaWYgKGhhLT5tcWlvYmFzZSkKIAkJCWlvdW5tYXAoaGEtPm1xaW9iYXNlKTsKIAotCQlpZiAoSVNfUUxBODNYWChoYSkgJiYgaGEtPm1zaXhiYXNlKQorCQlpZiAoKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSAmJiBoYS0+bXNpeGJhc2UpCiAJCQlpb3VubWFwKGhhLT5tc2l4YmFzZSk7CiAJfQogfQpAQCAtMzQ0Nyw3ICszNTEzLDcgQEAKIAkJaGEtPm5waXZfaW5mbyA9IE5VTEw7CiAKIAkvKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBFWC1JTklULUNCLiAqLwotCWlmIChJU19DTkFfQ0FQQUJMRShoYSkgfHwgSVNfUUxBMjAzMShoYSkpIHsKKwlpZiAoSVNfQ05BX0NBUEFCTEUoaGEpIHx8IElTX1FMQTIwMzEoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCWhhLT5leF9pbml0X2NiID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCiAJCSAgICAmaGEtPmV4X2luaXRfY2JfZG1hKTsKIAkJaWYgKCFoYS0+ZXhfaW5pdF9jYikKQEAgLTM0NzgsMTAgKzM1NDQsMTAgQEAKIAllbHNlIHsKIAkJcWxhMngwMF9zZXRfcmVzZXJ2ZWRfbG9vcF9pZHMoaGEpOwogCQlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMTIzLAotCQkgICAgImxvb3BfaWRfbWFwPSVwLiBcbiIsIGhhLT5sb29wX2lkX21hcCk7CisJCSAgICAibG9vcF9pZF9tYXA9JXAuXG4iLCBoYS0+bG9vcF9pZF9tYXApOwogCX0KIAotCXJldHVybiAxOworCXJldHVybiAwOwogCiBmYWlsX2FzeW5jX3BkOgogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIGhhLT5leF9pbml0X2NiLCBoYS0+ZXhfaW5pdF9jYl9kbWEpOwpAQCAtMzU2MiwyMiArMzYyOCwyOCBAQAogcWxhMngwMF9mcmVlX2Z3X2R1bXAoc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlpZiAoaGEtPmZjZSkKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEZDRV9TSVpFLCBoYS0+ZmNlLAotCQkgICAgaGEtPmZjZV9kbWEpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIEZDRV9TSVpFLCBoYS0+ZmNlLCBoYS0+ZmNlX2RtYSk7CiAKLQlpZiAoaGEtPmZ3X2R1bXApIHsKLQkJaWYgKGhhLT5lZnQpCi0JCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJCSAgICBudG9obChoYS0+ZndfZHVtcC0+ZWZ0X3NpemUpLCBoYS0+ZWZ0LCBoYS0+ZWZ0X2RtYSk7CisJaWYgKGhhLT5lZnQpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgRUZUX1NJWkUsIGhhLT5lZnQsIGhhLT5lZnRfZG1hKTsKKworCWlmIChoYS0+ZndfZHVtcCkKIAkJdmZyZWUoaGEtPmZ3X2R1bXApOwotCX0KKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwogCWhhLT5mY2UgPSBOVUxMOwogCWhhLT5mY2VfZG1hID0gMDsKIAloYS0+ZWZ0ID0gTlVMTDsKIAloYS0+ZWZ0X2RtYSA9IDA7Ci0JaGEtPmZ3X2R1bXAgPSBOVUxMOwogCWhhLT5md19kdW1wZWQgPSAwOwogCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOworCWhhLT5md19kdW1wID0gTlVMTDsKKwloYS0+ZndfZHVtcF9sZW4gPSAwOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOwogfQogCiAvKgpAQCAtNTI0Miw3ICs1MzE0LDcgQEAKIAogLyogRmlybXdhcmUgaW50ZXJmYWNlIHJvdXRpbmVzLiAqLwogCi0jZGVmaW5lIEZXX0JMT0JTCTEwCisjZGVmaW5lIEZXX0JMT0JTCTExCiAjZGVmaW5lIEZXX0lTUDIxWFgJMAogI2RlZmluZSBGV19JU1AyMlhYCTEKICNkZWZpbmUgRldfSVNQMjMwMAkyCkBAIC01MjUzLDYgKzUzMjUsNyBAQAogI2RlZmluZSBGV19JU1A4MlhYCTcKICNkZWZpbmUgRldfSVNQMjAzMQk4CiAjZGVmaW5lIEZXX0lTUDgwMzEJOQorI2RlZmluZSBGV19JU1AyMDcxCTEwCiAKICNkZWZpbmUgRldfRklMRV9JU1AyMVhYCSJxbDIxMDBfZncuYmluIgogI2RlZmluZSBGV19GSUxFX0lTUDIyWFgJInFsMjIwMF9mdy5iaW4iCkBAIC01MjY0LDYgKzUzMzcsOCBAQAogI2RlZmluZSBGV19GSUxFX0lTUDgyWFgJInFsODIwMF9mdy5iaW4iCiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjAzMQkicWwyNjAwX2Z3LmJpbiIKICNkZWZpbmUgRldfRklMRV9JU1A4MDMxCSJxbDgzMDBfZncuYmluIgorI2RlZmluZSBGV19GSUxFX0lTUDIwNzEJInFsMjcwMF9mdy5iaW4iCisKIAogc3RhdGljIERFRklORV9NVVRFWChxbGFfZndfbG9jayk7CiAKQEAgLTUyNzgsNiArNTM1Myw3IEBACiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQODJYWCwgfSwKIAl7IC5uYW1lID0gRldfRklMRV9JU1AyMDMxLCB9LAogCXsgLm5hbWUgPSBGV19GSUxFX0lTUDgwMzEsIH0sCisJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjA3MSwgfSwKIH07CiAKIHN0cnVjdCBmd19ibG9iICoKQEAgLTUzMDYsNiArNTM4Miw4IEBACiAJCWJsb2IgPSAmcWxhX2Z3X2Jsb2JzW0ZXX0lTUDIwMzFdOwogCX0gZWxzZSBpZiAoSVNfUUxBODAzMShoYSkpIHsKIAkJYmxvYiA9ICZxbGFfZndfYmxvYnNbRldfSVNQODAzMV07CisJfSBlbHNlIGlmIChJU19RTEEyMDcxKGhhKSkgeworCQlibG9iID0gJnFsYV9md19ibG9ic1tGV19JU1AyMDcxXTsKIAl9IGVsc2UgewogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01NjM1LDYgKzU3MTMsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAzMSkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUEYwMDEpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDQ0KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjA3MSkgfSwKIAl7IDAgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWxhMnh4eF9wY2lfdGJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwppbmRleCBiZDU2Y2RlLi5mMjgxMjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCkBAIC01NjgsNyArNTY4LDcgQEAKIAllbHNlIGlmIChJU19QM1BfVFlQRShoYSkpIHsKIAkJKnN0YXJ0ID0gRkFfRkxBU0hfTEFZT1VUX0FERFJfODI7CiAJCWdvdG8gZW5kOwotCX0gZWxzZSBpZiAoSVNfUUxBODNYWChoYSkpIHsKKwl9IGVsc2UgaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCSpzdGFydCA9IEZBX0ZMQVNIX0xBWU9VVF9BRERSXzgzOwogCQlnb3RvIGVuZDsKIAl9CkBAIC02ODIsNyArNjgyLDcgQEAKIAkvKiBBc3NpZ24gRkNQIHByaW8gcmVnaW9uIHNpbmNlIG9sZGVyIGFkYXB0ZXJzIG1heSBub3QgaGF2ZSBGTFQsIG9yCiAJICAgRkNQIHByaW8gcmVnaW9uIGluIGl0J3MgRkxULgogCSAqLwotCWhhLT5mbHRfcmVnaW9uX2ZjcF9wcmlvID0gaGEtPmZsYWdzLnBvcnQwID8KKwloYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyA9IChoYS0+cG9ydF9ubyA9PSAwKSA/CiAJICAgIGZjcF9wcmlvX2NmZzBbZGVmXSA6IGZjcF9wcmlvX2NmZzFbZGVmXTsKIAogCWhhLT5mbHRfcmVnaW9uX2ZsdCA9IGZsdF9hZGRyOwpAQCAtNzQzLDQ3ICs3NDMsNzEgQEAKIAkJCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IHN0YXJ0OwogCQkJaWYgKElTX1AzUF9UWVBFKGhhKSkKIAkJCQlicmVhazsKLQkJCWlmIChoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMCkKIAkJCQloYS0+Zmx0X3JlZ2lvbl92cGQgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfVlBEXzE6CiAJCQlpZiAoSVNfUDNQX1RZUEUoaGEpIHx8IElTX1FMQTgwMzEoaGEpKQogCQkJCWJyZWFrOwotCQkJaWYgKCFoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMSkKKwkJCQloYS0+Zmx0X3JlZ2lvbl92cGQgPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfVlBEXzI6CisJCQlpZiAoIUlTX1FMQTI3WFgoaGEpKQorCQkJCWJyZWFrOworCQkJaWYgKGhhLT5wb3J0X25vID09IDIpCisJCQkJaGEtPmZsdF9yZWdpb25fdnBkID0gc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX1ZQRF8zOgorCQkJaWYgKCFJU19RTEEyN1hYKGhhKSkKKwkJCQlicmVhazsKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAzKQogCQkJCWhhLT5mbHRfcmVnaW9uX3ZwZCA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OVlJBTV8wOgogCQkJaWYgKElTX1FMQTgwMzEoaGEpKQogCQkJCWJyZWFrOwotCQkJaWYgKGhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAwKQogCQkJCWhhLT5mbHRfcmVnaW9uX252cmFtID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX05WUkFNXzE6CiAJCQlpZiAoSVNfUUxBODAzMShoYSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoIWhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAxKQorCQkJCWhhLT5mbHRfcmVnaW9uX252cmFtID0gc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX05WUkFNXzI6CisJCQlpZiAoIUlTX1FMQTI3WFgoaGEpKQorCQkJCWJyZWFrOworCQkJaWYgKGhhLT5wb3J0X25vID09IDIpCisJCQkJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfTlZSQU1fMzoKKwkJCWlmICghSVNfUUxBMjdYWChoYSkpCisJCQkJYnJlYWs7CisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMykKIAkJCQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19GRFQ6CiAJCQloYS0+Zmx0X3JlZ2lvbl9mZHQgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfTlBJVl9DT05GXzA6Ci0JCQlpZiAoaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDApCiAJCQkJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX05QSVZfQ09ORl8xOgotCQkJaWYgKCFoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMSkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfR09MRF9GVzoKIAkJCWhhLT5mbHRfcmVnaW9uX2dvbGRfZncgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfRkNQX1BSSU9fMDoKLQkJCWlmIChoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMCkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19GQ1BfUFJJT18xOgotCQkJaWYgKCFoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMSkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19CT09UX0NPREVfODJYWDoKQEAgLTgxMywxMyArODM3LDEzIEBACiAJCWNhc2UgRkxUX1JFR19GQ09FX05WUkFNXzA6CiAJCQlpZiAoIShJU19RTEE4MDMxKGhhKSB8fCBJU19RTEE4MDQ0KGhhKSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDApCiAJCQkJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfRkNPRV9OVlJBTV8xOgogCQkJaWYgKCEoSVNfUUxBODAzMShoYSkgfHwgSVNfUUxBODA0NChoYSkpKQogCQkJCWJyZWFrOwotCQkJaWYgKCFoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMSkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCX0KQEAgLTgzMiwxMiArODU2LDEyIEBACiAJaGEtPmZsdF9yZWdpb25fZncgPSBkZWZfZndbZGVmXTsKIAloYS0+Zmx0X3JlZ2lvbl9ib290ID0gZGVmX2Jvb3RbZGVmXTsKIAloYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gPSBkZWZfdnBkX252cmFtW2RlZl07Ci0JaGEtPmZsdF9yZWdpb25fdnBkID0gaGEtPmZsYWdzLnBvcnQwID8KKwloYS0+Zmx0X3JlZ2lvbl92cGQgPSAoaGEtPnBvcnRfbm8gPT0gMCkgPwogCSAgICBkZWZfdnBkMFtkZWZdIDogZGVmX3ZwZDFbZGVmXTsKLQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IGhhLT5mbGFncy5wb3J0MCA/CisJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSAoaGEtPnBvcnRfbm8gPT0gMCkgPwogCSAgICBkZWZfbnZyYW0wW2RlZl0gOiBkZWZfbnZyYW0xW2RlZl07CiAJaGEtPmZsdF9yZWdpb25fZmR0ID0gZGVmX2ZkdFtkZWZdOwotCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IGhhLT5mbGFncy5wb3J0MCA/CisJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gKGhhLT5wb3J0X25vID09IDApID8KIAkgICAgZGVmX25waXZfY29uZjBbZGVmXSA6IGRlZl9ucGl2X2NvbmYxW2RlZl07CiBkb25lOgogCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNGEsCkBAIC05ODksNyArMTAxMyw3IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIUlTX1FMQTI0WFhfVFlQRShoYSkgJiYgIUlTX1FMQTI1WFgoaGEpICYmCi0JICAgICFJU19DTkFfQ0FQQUJMRShoYSkgJiYgIUlTX1FMQTIwMzEoaGEpKQorCSAgICAhSVNfQ05BX0NBUEFCTEUoaGEpICYmICFJU19RTEEyMDMxKGhhKSAmJiAhSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAogCXJldCA9IHFsYTJ4eHhfZmluZF9mbHRfc3RhcnQodmhhLCAmZmx0X2FkZHIpOwpAQCAtMTE5Miw3ICsxMjE2LDggQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCS8qIFByZXBhcmUgYnVyc3QtY2FwYWJsZSB3cml0ZSBvbiBzdXBwb3J0ZWQgSVNQcy4gKi8KLQlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKSAmJgorCWlmICgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwKKwkgICAgSVNfUUxBMjdYWChoYSkpICYmCiAJICAgICEoZmFkZHIgJiAweGZmZikgJiYgZHdvcmRzID4gT1BUUk9NX0JVUlNUX0RXT1JEUykgewogCQlvcHRyb20gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIE9QVFJPTV9CVVJTVF9TSVpFLAogCQkgICAgJm9wdHJvbV9kbWEsIEdGUF9LRVJORUwpOwpAQCAtMTY3NSw3ICsxNzAwLDcgQEAKIAlpZiAoIUlTX1FMQTgzWFgoaGEpKQogCQlnb3RvIG91dDsKIAotCWlmIChoYS0+ZmxhZ3MucG9ydDApCisJaWYgKGhhLT5wb3J0X25vID09IDApCiAJCWxlZF9zZWxlY3RfdmFsdWUgPSBRTEE4M1hYX0xFRF9QT1JUMDsKIAllbHNlCiAJCWxlZF9zZWxlY3RfdmFsdWUgPSBRTEE4M1hYX0xFRF9QT1JUMTsKQEAgLTIzMzIsNyArMjM1Nyw3IEBACiAJCQkJICovCiAJCQkJcmVzdF9hZGRyID0gMHhmZmZmOwogCQkJCXNlY19tYXNrID0gMHgxMDAwMDsKLQkJCQlicmVhazsgICAKKwkJCQlicmVhazsKIAkJCX0KIAkJCS8qCiAJCQkgKiBTVCBtMjl3MDEwYiBwYXJ0IC0gMTZrYiBzZWN0b3Igc2l6ZQpAQCAtMjU1OCw3ICsyNTgzLDcgQEAKIAl1aW50MzJfdCBmYWRkciwgbGVmdCwgYnVyc3Q7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpCisJaWYgKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQlnb3RvIHRyeV9mYXN0OwogCWlmIChvZmZzZXQgJiAweGZmZikKIAkJZ290byBzbG93X3JlYWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdG1wbC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RtcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA0ZTliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RtcGwuYwpAQCAtMCwwICsxLDkwOSBAQAorLyoKKyAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMyBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorI2luY2x1ZGUgInFsYV90bXBsLmgiCisKKy8qIG5vdGUgZGVmYXVsdCB0ZW1wbGF0ZSBpcyBpbiBiaWcgZW5kaWFuICovCitzdGF0aWMgY29uc3QgdWludDMyX3QgcWwyN3h4X2Z3ZHRfZGVmYXVsdF90ZW1wbGF0ZVtdID0geworCTB4NjMwMDAwMDAsIDB4YTQwMDAwMDAsIDB4N2MwNTAwMDAsIDB4MDAwMDAwMDAsCisJMHgzMDAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMDAwMDAwMCwgMHhjMDQwNmViNCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwNDAxMDAwMCwgMHgxNDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAyMDAwMDAwLCAweDQ0MDAwMDAwLCAweDA5MDEwMDAwLCAweDEwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDEwMTAwMDAsIDB4MWMwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDYwMDAwMCwgMHgwMDAwMDAwMCwKKwkweGMwMDAwMDAwLCAweDAxMDEwMDAwLCAweDFjMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4MDA2MDAwMDAsIDB4MDAwMDAwMDAsIDB4Y2MwMDAwMDAsCisJMHgwMTAxMDAwMCwgMHgxYzAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDEwNjAwMDAwLCAweDAwMDAwMDAwLCAweGQ0MDAwMDAwLCAweDAxMDEwMDAwLAorCTB4MWMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsCisJMHgwMDAwMDA2MCwgMHhmMDAwMDAwMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwNzAwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgxMDcwMDAwMCwgMHgwNDEwMDBjMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDQwNzAwMDAwLCAweDA0MTAwMGMwLAorCTB4MDEwMTAwMDAsIDB4MWMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgwMDdjMDAwMCwgMHgwMTAwMDAwMCwgMHhjMDAwMDAwMCwgMHgwMDAxMDAwMCwKKwkweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwN2MwMDAwLAorCTB4MDQwMzAwYzQsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMjAwMDAwMCwgMHgwMDdjMDAwMCwgMHgwNDAxMDBjMCwgMHgwMTAxMDAwMCwKKwkweDFjMDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwN2MwMDAwLAorCTB4MDAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDdjMDAwMCwgMHgwNDIwMDAwMCwKKwkweDBiMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MGMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDAwMGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwMTBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDIwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDAzMGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwNDBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDUwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDA2MGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwNzBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDgwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDA5MGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwYTBiMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDBhMDAwMDAwLCAweDA0MDEwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgwYTAwMDAwMCwgMHgwNDIwMDA4MCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwYmUwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgxMGJlMDAwMCwgMHgwNDEwMDBjMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDIwYmUwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgzMGJlMDAwMCwgMHgwNDEwMDBjMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwYjAwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgxMGIwMDAwMCwgMHgwNDEwMDBjMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDIwYjAwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgzMGIwMDAwMCwgMHgwNDEwMDBjMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwMzAwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgxMDMwMDAwMCwgMHgwNDEwMDBjMCwgMHgwMDAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDIwMzAwMDAwLCAweDA0MTAwMGMwLAorCTB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgzMDMwMDAwMCwgMHgwNDEwMDBjMCwgMHgwYTAxMDAwMCwgMHgxMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDA2MDEwMDAwLCAweDFjMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDAyMDAsCisJMHhmZjIzMDIwMCwgMHgwNjAxMDAwMCwgMHgxYzAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAyMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwMDAxMDAwLCAweDAwMDAwMDAwLAorCTB4MDcwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwNzAxMDAwMCwgMHgxODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MDcwMTAwMDAsIDB4MTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMzAwMDAwMCwgMHgwZDAxMDAwMCwgMHgxNDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAwMDAwMDAwLCAweGZmMDAwMDAwLAorCTB4MTAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwODAsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCitxbGEyN3h4X2lzcF9yZWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKK3sKKwlyZXR1cm4gJnZoYS0+aHctPmlvYmFzZS0+aXNwMjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9pbnNlcnQxNih1aW50MTZfdCB2YWx1ZSwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCWlmIChidWYpIHsKKwkJYnVmICs9ICpsZW47CisJCSooX19sZTE2ICopYnVmID0gY3B1X3RvX2xlMTYodmFsdWUpOworCX0KKwkqbGVuICs9IHNpemVvZih2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9pbnNlcnQzMih1aW50MzJfdCB2YWx1ZSwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCWlmIChidWYpIHsKKwkJYnVmICs9ICpsZW47CisJCSooX19sZTMyICopYnVmID0gY3B1X3RvX2xlMzIodmFsdWUpOworCX0KKwkqbGVuICs9IHNpemVvZih2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9pbnNlcnRidWYodm9pZCAqbWVtLCB1bG9uZyBzaXplLCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWxvbmcgY250ID0gc2l6ZTsKKworCWlmIChidWYgJiYgbWVtKSB7CisJCWJ1ZiArPSAqbGVuOworCQl3aGlsZSAoY250ID49IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCSooX19sZTMyICopYnVmID0gY3B1X3RvX2xlMzJwKG1lbSk7CisJCQlidWYgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCW1lbSArPSBzaXplb2YodWludDMyX3QpOworCQkJY250IC09IHNpemVvZih1aW50MzJfdCk7CisJCX0KKwkJaWYgKGNudCkKKwkJCW1lbWNweShidWYsIG1lbSwgY250KTsKKwl9CisJKmxlbiArPSBzaXplOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfcmVhZDgodm9pZCAqd2luZG93LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWludDhfdCB2YWx1ZSA9IH4wOworCisJaWYgKGJ1ZikgeworCQl2YWx1ZSA9IFJEX1JFR19CWVRFKChfX2lvbWVtIHZvaWQgKil3aW5kb3cpOworCQlxbF9kYmcocWxfZGJnX21pc2MsIE5VTEwsIDB4ZDAxMSwKKwkJICAgICIlczogLT4gJXhcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJfQorCXFsYTI3eHhfaW5zZXJ0MzIodmFsdWUsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3JlYWQxNih2b2lkICp3aW5kb3csIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1aW50MTZfdCB2YWx1ZSA9IH4wOworCisJaWYgKGJ1ZikgeworCQl2YWx1ZSA9IFJEX1JFR19XT1JEKChfX2lvbWVtIHZvaWQgKil3aW5kb3cpOworCQlxbF9kYmcocWxfZGJnX21pc2MsIE5VTEwsIDB4ZDAxMiwKKwkJICAgICIlczogLT4gJXhcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJfQorCXFsYTI3eHhfaW5zZXJ0MzIodmFsdWUsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3JlYWQzMih2b2lkICp3aW5kb3csIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1aW50MzJfdCB2YWx1ZSA9IH4wOworCisJaWYgKGJ1ZikgeworCQl2YWx1ZSA9IFJEX1JFR19EV09SRCgoX19pb21lbSB2b2lkICopd2luZG93KTsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCBOVUxMLCAweGQwMTMsCisJCSAgICAiJXM6IC0+ICV4XG4iLCBfX2Z1bmNfXywgdmFsdWUpOworCX0KKwlxbGEyN3h4X2luc2VydDMyKHZhbHVlLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAoKnFsYTI3eHhfcmVhZF92ZWN0b3IodWludCB3aWR0aCkpKHZvaWQgKiwgdm9pZCAqLCB1bG9uZyAqKQoreworCXJldHVybgorCSAgICAod2lkdGggPT0gMSkgPyBxbGEyN3h4X3JlYWQ4IDoKKwkgICAgKHdpZHRoID09IDIpID8gcWxhMjd4eF9yZWFkMTYgOgorCQkJICAgcWxhMjd4eF9yZWFkMzI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9yZWFkX3JlZyhfX2lvbWVtIHN0cnVjdCBkZXZpY2VfcmVnXzI0eHggKnJlZywKKwl1aW50IG9mZnNldCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXZvaWQgKndpbmRvdyA9ICh2b2lkICopcmVnICsgb2Zmc2V0OworCisJaWYgKGJ1ZikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIE5VTEwsIDB4ZDAxNCwKKwkJICAgICIlczogQCV4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0KTsKKwl9CisJcWxhMjd4eF9pbnNlcnQzMihvZmZzZXQsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X3JlYWQzMih3aW5kb3csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3dyaXRlX3JlZyhfX2lvbWVtIHN0cnVjdCBkZXZpY2VfcmVnXzI0eHggKnJlZywKKwl1aW50IG9mZnNldCwgdWludDMyX3QgZGF0YSwgdm9pZCAqYnVmKQoreworCV9faW9tZW0gdm9pZCAqd2luZG93ID0gcmVnICsgb2Zmc2V0OworCisJaWYgKGJ1ZikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIE5VTEwsIDB4ZDAxNSwKKwkJICAgICIlczogQCV4IDwtICV4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCBkYXRhKTsKKwkJV1JUX1JFR19EV09SRCh3aW5kb3csIGRhdGEpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3JlYWRfd2luZG93KF9faW9tZW0gc3RydWN0IGRldmljZV9yZWdfMjR4eCAqcmVnLAorCXVpbnQzMl90IGJhc2UsIHVpbnQgb2Zmc2V0LCB1aW50IGNvdW50LCB1aW50IHdpZHRoLCB2b2lkICpidWYsCisJdWxvbmcgKmxlbikKK3sKKwl2b2lkICp3aW5kb3cgPSAodm9pZCAqKXJlZyArIG9mZnNldDsKKwl2b2lkICgqcmVhZG4pKHZvaWQgKiwgdm9pZCAqLCB1bG9uZyAqKSA9IHFsYTI3eHhfcmVhZF92ZWN0b3Iod2lkdGgpOworCisJaWYgKGJ1ZikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIE5VTEwsIDB4ZDAxNiwKKwkJICAgICIlczogYmFzZT0leCBvZmZzZXQ9JXggY291bnQ9JXggd2lkdGg9JXhcbiIsCisJCSAgICBfX2Z1bmNfXywgYmFzZSwgb2Zmc2V0LCBjb3VudCwgd2lkdGgpOworCX0KKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIElPQkFTRV9BRERSLCBiYXNlLCBidWYpOworCXdoaWxlIChjb3VudC0tKSB7CisJCXFsYTI3eHhfaW5zZXJ0MzIoYmFzZSwgYnVmLCBsZW4pOworCQlyZWFkbih3aW5kb3csIGJ1ZiwgbGVuKTsKKwkJd2luZG93ICs9IHdpZHRoOworCQliYXNlICs9IHdpZHRoOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3NraXBfZW50cnkoc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYpCit7CisJaWYgKGJ1ZikKKwkJZW50LT5oZHIuZHJpdmVyX2ZsYWdzIHw9IERSSVZFUl9GTEFHX1NLSVBfRU5UUlk7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQxMDAsCisJICAgICIlczogbm9wIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNTUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMWZmLAorCSAgICAiJXM6IGVuZCBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisKKwkvKiB0ZXJtaW5hdGUgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNTYoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwMCwKKwkgICAgIiVzOiByZGlvIHQxIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF9yZWFkX3dpbmRvdyhyZWcsIGVudC0+dDI1Ni5iYXNlX2FkZHIsIGVudC0+dDI1Ni5wY2lfb2Zmc2V0LAorCSAgICBlbnQtPnQyNTYucmVnX2NvdW50LCBlbnQtPnQyNTYucmVnX3dpZHRoLCBidWYsIGxlbik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjU3KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDEsCisJICAgICIlczogd3JpbyB0MSBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgSU9CQVNFX0FERFIsIGVudC0+dDI1Ny5iYXNlX2FkZHIsIGJ1Zik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBlbnQtPnQyNTcucGNpX29mZnNldCwgZW50LT50MjU3LndyaXRlX2RhdGEsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjU4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDIsCisJICAgICIlczogcmRpbyB0MiBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgZW50LT50MjU4LmJhbmtzZWxfb2Zmc2V0LCBlbnQtPnQyNTguYmFuaywgYnVmKTsKKwlxbGEyN3h4X3JlYWRfd2luZG93KHJlZywgZW50LT50MjU4LmJhc2VfYWRkciwgZW50LT50MjU4LnBjaV9vZmZzZXQsCisJICAgIGVudC0+dDI1OC5yZWdfY291bnQsIGVudC0+dDI1OC5yZWdfd2lkdGgsIGJ1ZiwgbGVuKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNTkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwMywKKwkgICAgIiVzOiB3cmlvIHQyIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBJT0JBU0VfQUREUiwgZW50LT50MjU5LmJhc2VfYWRkciwgYnVmKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIGVudC0+dDI1OS5iYW5rc2VsX29mZnNldCwgZW50LT50MjU5LmJhbmssIGJ1Zik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBlbnQtPnQyNTkucGNpX29mZnNldCwgZW50LT50MjU5LndyaXRlX2RhdGEsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjYwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDQsCisJICAgICIlczogcmRwY2kgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3JlYWRfcmVnKHJlZywgZW50LT50MjYwLnBjaV9hZGRyLCBidWYsIGxlbik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjYxKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDUsCisJICAgICIlczogd3JwY2kgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIGVudC0+dDI2MS5wY2lfYWRkciwgZW50LT50MjYxLndyaXRlX2RhdGEsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjYyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWxvbmcgZHdvcmRzOworCXVsb25nIHN0YXJ0OworCXVsb25nIGVuZDsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDYsCisJICAgICIlczogcmRyYW0oJXgpIFslbHhdXG4iLCBfX2Z1bmNfXywgZW50LT50MjYyLnJhbV9hcmVhLCAqbGVuKTsKKwlzdGFydCA9IGVudC0+dDI2Mi5zdGFydF9hZGRyOworCWVuZCA9IGVudC0+dDI2Mi5lbmRfYWRkcjsKKworCWlmIChlbnQtPnQyNjIucmFtX2FyZWEgPT0gVDI2Ml9SQU1fQVJFQV9DUklUSUNBTF9SQU0pIHsKKwkJOworCX0gZWxzZSBpZiAoZW50LT50MjYyLnJhbV9hcmVhID09IFQyNjJfUkFNX0FSRUFfRVhURVJOQUxfUkFNKSB7CisJCWVuZCA9IHZoYS0+aHctPmZ3X21lbW9yeV9zaXplOworCQlpZiAoYnVmKQorCQkJZW50LT50MjYyLmVuZF9hZGRyID0gZW5kOworCX0gZWxzZSBpZiAoZW50LT50MjYyLnJhbV9hcmVhID09IFQyNjJfUkFNX0FSRUFfU0hBUkVEX1JBTSkgeworCQlzdGFydCA9IHZoYS0+aHctPmZ3X3NoYXJlZF9yYW1fc3RhcnQ7CisJCWVuZCA9IHZoYS0+aHctPmZ3X3NoYXJlZF9yYW1fZW5kOworCQlpZiAoYnVmKSB7CisJCQllbnQtPnQyNjIuc3RhcnRfYWRkciA9IHN0YXJ0OworCQkJZW50LT50MjYyLmVuZF9hZGRyID0gZW5kOworCQl9CisJfSBlbHNlIGlmIChlbnQtPnQyNjIucmFtX2FyZWEgPT0gVDI2Ml9SQU1fQVJFQV9ERFJfUkFNKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjEsCisJCSAgICAiJXM6IHVuc3VwcG9ydGVkIGRkciByYW1cbiIsIF9fZnVuY19fKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjIsCisJCSAgICAiJXM6IHVua25vd24gYXJlYSAldVxuIiwgX19mdW5jX18sIGVudC0+dDI2Mi5yYW1fYXJlYSk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoZW5kIDwgc3RhcnQpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyMywKKwkJICAgICIlczogYmFkIHJhbmdlIChzdGFydD0leCBlbmQ9JXgpXG4iLCBfX2Z1bmNfXywKKwkJICAgIGVudC0+dDI2Mi5lbmRfYWRkciwgZW50LT50MjYyLnN0YXJ0X2FkZHIpOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCQlnb3RvIGRvbmU7CisJfQorCisJZHdvcmRzID0gZW5kIC0gc3RhcnQgKyAxOworCWlmIChidWYpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyNCwKKwkJICAgICIlczogQCVseCAtPiAoJWx4IGR3b3JkcylcbiIsIF9fZnVuY19fLCBzdGFydCwgZHdvcmRzKTsKKwkJYnVmICs9ICpsZW47CisJCXFsYTI0eHhfZHVtcF9yYW0odmhhLT5odywgc3RhcnQsIGJ1ZiwgZHdvcmRzLCAmYnVmKTsKKwl9CisJKmxlbiArPSBkd29yZHMgKiBzaXplb2YodWludDMyX3QpOworZG9uZToKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjYzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWludCBjb3VudCA9IDA7CisJdWludCBpOworCXVpbnQgbGVuZ3RoOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwNywKKwkgICAgIiVzOiBnZXRxKCV4KSBbJWx4XVxuIiwgX19mdW5jX18sIGVudC0+dDI2My5xdWV1ZV90eXBlLCAqbGVuKTsKKwlpZiAoZW50LT50MjYzLnF1ZXVlX3R5cGUgPT0gVDI2M19RVUVVRV9UWVBFX1JFUSkgeworCQlmb3IgKGkgPSAwOyBpIDwgdmhhLT5ody0+bWF4X3JlcV9xdWV1ZXM7IGkrKykgeworCQkJc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+aHctPnJlcV9xX21hcFtpXTsKKwkJCWlmIChyZXEgfHwgIWJ1ZikgeworCQkJCWxlbmd0aCA9IHJlcSA/CisJCQkJICAgIHJlcS0+bGVuZ3RoIDogUkVRVUVTVF9FTlRSWV9DTlRfMjRYWDsKKwkJCQlxbGEyN3h4X2luc2VydDE2KGksIGJ1ZiwgbGVuKTsKKwkJCQlxbGEyN3h4X2luc2VydDE2KGxlbmd0aCwgYnVmLCBsZW4pOworCQkJCXFsYTI3eHhfaW5zZXJ0YnVmKHJlcSA/IHJlcS0+cmluZyA6IE5VTEwsCisJCQkJICAgIGxlbmd0aCAqIHNpemVvZigqcmVxLT5yaW5nKSwgYnVmLCBsZW4pOworCQkJCWNvdW50Kys7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGVudC0+dDI2My5xdWV1ZV90eXBlID09IFQyNjNfUVVFVUVfVFlQRV9SU1ApIHsKKwkJZm9yIChpID0gMDsgaSA8IHZoYS0+aHctPm1heF9yc3BfcXVldWVzOyBpKyspIHsKKwkJCXN0cnVjdCByc3BfcXVlICpyc3AgPSB2aGEtPmh3LT5yc3BfcV9tYXBbaV07CisJCQlpZiAocnNwIHx8ICFidWYpIHsKKwkJCQlsZW5ndGggPSByc3AgPworCQkJCSAgICByc3AtPmxlbmd0aCA6IFJFU1BPTlNFX0VOVFJZX0NOVF9NUTsKKwkJCQlxbGEyN3h4X2luc2VydDE2KGksIGJ1ZiwgbGVuKTsKKwkJCQlxbGEyN3h4X2luc2VydDE2KGxlbmd0aCwgYnVmLCBsZW4pOworCQkJCXFsYTI3eHhfaW5zZXJ0YnVmKHJzcCA/IHJzcC0+cmluZyA6IE5VTEwsCisJCQkJICAgIGxlbmd0aCAqIHNpemVvZigqcnNwLT5yaW5nKSwgYnVmLCBsZW4pOworCQkJCWNvdW50Kys7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGVudC0+dDI2My5xdWV1ZV90eXBlID09IFQyNjNfUVVFVUVfVFlQRV9BVElPKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjUsCisJCSAgICAiJXM6IHVuc3VwcG9ydGVkIGF0aW8gcXVldWVcbiIsIF9fZnVuY19fKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjYsCisJCSAgICAiJXM6IHVua25vd24gcXVldWUgJXVcbiIsIF9fZnVuY19fLCBlbnQtPnQyNjMucXVldWVfdHlwZSk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYnVmKQorCQllbnQtPnQyNjMubnVtX3F1ZXVlcyA9IGNvdW50OworZG9uZToKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjY0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwOCwKKwkgICAgIiVzOiBnZXRmY2UgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlpZiAodmhhLT5ody0+ZmNlKSB7CisJCWlmIChidWYpIHsKKwkJCWVudC0+dDI2NC5mY2VfdHJhY2Vfc2l6ZSA9IEZDRV9TSVpFOworCQkJZW50LT50MjY0LndyaXRlX3BvaW50ZXIgPSB2aGEtPmh3LT5mY2Vfd3I7CisJCQllbnQtPnQyNjQuYmFzZV9wb2ludGVyID0gdmhhLT5ody0+ZmNlX2RtYTsKKwkJCWVudC0+dDI2NC5mY2VfZW5hYmxlX21iMCA9IHZoYS0+aHctPmZjZV9tYlswXTsKKwkJCWVudC0+dDI2NC5mY2VfZW5hYmxlX21iMiA9IHZoYS0+aHctPmZjZV9tYlsyXTsKKwkJCWVudC0+dDI2NC5mY2VfZW5hYmxlX21iMyA9IHZoYS0+aHctPmZjZV9tYlszXTsKKwkJCWVudC0+dDI2NC5mY2VfZW5hYmxlX21iNCA9IHZoYS0+aHctPmZjZV9tYls0XTsKKwkJCWVudC0+dDI2NC5mY2VfZW5hYmxlX21iNSA9IHZoYS0+aHctPmZjZV9tYls1XTsKKwkJCWVudC0+dDI2NC5mY2VfZW5hYmxlX21iNiA9IHZoYS0+aHctPmZjZV9tYls2XTsKKwkJfQorCQlxbGEyN3h4X2luc2VydGJ1Zih2aGEtPmh3LT5mY2UsIEZDRV9TSVpFLCBidWYsIGxlbik7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyNywKKwkJICAgICIlczogbWlzc2luZyBmY2VcbiIsIF9fZnVuY19fKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjY1KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDksCisJICAgICIlczogcGF1c2UgcmlzYyBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCWlmIChidWYpCisJCXFsYTI0eHhfcGF1c2VfcmlzYyhyZWcpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMGEsCisJICAgICIlczogcmVzZXQgcmlzYyBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCWlmIChidWYpCisJCXFsYTI0eHhfc29mdF9yZXNldCh2aGEtPmh3KTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwYiwKKwkgICAgIiVzOiBkaXMgaW50ciBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgZW50LT50MjY3LnBjaV9vZmZzZXQsIGVudC0+dDI2Ny5kYXRhLCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2OChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMGMsCisJICAgICIlczogZ2V0aGIoJXgpIFslbHhdXG4iLCBfX2Z1bmNfXywgZW50LT50MjY4LmJ1Zl90eXBlLCAqbGVuKTsKKwlpZiAoZW50LT50MjY4LmJ1Zl90eXBlID09IFQyNjhfQlVGX1RZUEVfRVhURF9UUkFDRSkgeworCQlpZiAodmhhLT5ody0+ZWZ0KSB7CisJCQlpZiAoYnVmKSB7CisJCQkJZW50LT50MjY4LmJ1Zl9zaXplID0gRUZUX1NJWkU7CisJCQkJZW50LT50MjY4LnN0YXJ0X2FkZHIgPSB2aGEtPmh3LT5lZnRfZG1hOworCQkJfQorCQkJcWxhMjd4eF9pbnNlcnRidWYodmhhLT5ody0+ZWZ0LCBFRlRfU0laRSwgYnVmLCBsZW4pOworCQl9IGVsc2UgeworCQkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyOCwKKwkJCSAgICAiJXM6IG1pc3NpbmcgZWZ0XG4iLCBfX2Z1bmNfXyk7CisJCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCQl9CisJfSBlbHNlIGlmIChlbnQtPnQyNjguYnVmX3R5cGUgPT0gVDI2OF9CVUZfVFlQRV9FWENIX0JVRk9GRikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDI5LAorCQkgICAgIiVzOiB1bnN1cHBvcnRlZCBleGNoYW5nZSBvZmZsb2FkIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCX0gZWxzZSBpZiAoZW50LT50MjY4LmJ1Zl90eXBlID09IFQyNjhfQlVGX1RZUEVfRVhURF9MT0dJTikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDJhLAorCQkgICAgIiVzOiB1bnN1cHBvcnRlZCBleHRlbmRlZCBsb2dpbiBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwl9IGVsc2UgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDJiLAorCQkgICAgIiVzOiB1bmtub3duIGJ1ZiAleFxuIiwgX19mdW5jX18sIGVudC0+dDI2OC5idWZfdHlwZSk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2OShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMGQsCisJICAgICIlczogc2NyYXRjaCBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfaW5zZXJ0MzIoMHhhYWFhYWFhYSwgYnVmLCBsZW4pOworCXFsYTI3eHhfaW5zZXJ0MzIoMHhiYmJiYmJiYiwgYnVmLCBsZW4pOworCXFsYTI3eHhfaW5zZXJ0MzIoMHhjY2NjY2NjYywgYnVmLCBsZW4pOworCXFsYTI3eHhfaW5zZXJ0MzIoMHhkZGRkZGRkZCwgYnVmLCBsZW4pOworCXFsYTI3eHhfaW5zZXJ0MzIoKmxlbiArIHNpemVvZih1aW50MzJfdCksIGJ1ZiwgbGVuKTsKKwlpZiAoYnVmKQorCQllbnQtPnQyNjkuc2NyYXRjaF9zaXplID0gNSAqIHNpemVvZih1aW50MzJfdCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjcwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKwl2b2lkICp3aW5kb3cgPSAodm9pZCAqKXJlZyArIDB4YzQ7CisJdWxvbmcgZHdvcmRzID0gZW50LT50MjcwLmNvdW50OworCXVsb25nIGFkZHIgPSBlbnQtPnQyNzAuYWRkcjsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMGUsCisJICAgICIlczogcmRyZW1yZWcgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIElPQkFTRV9BRERSLCAweDQwLCBidWYpOworCXdoaWxlIChkd29yZHMtLSkgeworCQlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIDB4YzAsIGFkZHJ8MHg4MDAwMDAwMCwgYnVmKTsKKwkJcWxhMjd4eF9yZWFkX3JlZyhyZWcsIDB4YzQsIGJ1ZiwgbGVuKTsKKwkJcWxhMjd4eF9pbnNlcnQzMihhZGRyLCBidWYsIGxlbik7CisJCXFsYTI3eHhfcmVhZDMyKHdpbmRvdywgYnVmLCBsZW4pOworCQlhZGRyKys7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisJdWxvbmcgYWRkciA9IGVudC0+dDI3MS5hZGRyOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIwZiwKKwkgICAgIiVzOiB3cnJlbXJlZyBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgSU9CQVNFX0FERFIsIDB4NDAsIGJ1Zik7CisJcWxhMjd4eF9yZWFkX3JlZyhyZWcsIDB4YzQsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X2luc2VydDMyKGFkZHIsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIDB4YzAsIGFkZHIsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjcyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWxvbmcgZHdvcmRzID0gZW50LT50MjcyLmNvdW50OworCXVsb25nIHN0YXJ0ID0gZW50LT50MjcyLmFkZHI7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjEwLAorCSAgICAiJXM6IHJkcmVtcmFtIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJaWYgKGJ1ZikgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDJjLAorCQkgICAgIiVzOiBAJWx4IC0+ICglbHggZHdvcmRzKVxuIiwgX19mdW5jX18sIHN0YXJ0LCBkd29yZHMpOworCQlidWYgKz0gKmxlbjsKKwkJcWxhMjd4eF9kdW1wX21waV9yYW0odmhhLT5odywgc3RhcnQsIGJ1ZiwgZHdvcmRzLCAmYnVmKTsKKwl9CisJKmxlbiArPSBkd29yZHMgKiBzaXplb2YodWludDMyX3QpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVsb25nIGR3b3JkcyA9IGVudC0+dDI3My5jb3VudDsKKwl1bG9uZyBhZGRyID0gZW50LT50MjczLmFkZHI7CisJdWludDMyX3QgdmFsdWU7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjExLAorCSAgICAiJXM6IHBjaWNmZyBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXdoaWxlIChkd29yZHMtLSkgeworCQl2YWx1ZSA9IH4wOworCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHZoYS0+aHctPnBkZXYsIGFkZHIsICZ2YWx1ZSkpCisJCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDJkLAorCQkJICAgICIlczogZmFpbGVkIHBjaWNmZyByZWFkIGF0ICVseFxuIiwgX19mdW5jX18sIGFkZHIpOworCQlxbGEyN3h4X2luc2VydDMyKGFkZHIsIGJ1ZiwgbGVuKTsKKwkJcWxhMjd4eF9pbnNlcnQzMih2YWx1ZSwgYnVmLCBsZW4pOworCQlhZGRyICs9IDQ7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfb3RoZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMmZmLAorCSAgICAiJXM6IHR5cGUgJXggWyVseF1cbiIsIF9fZnVuY19fLCBlbnQtPmhkci5lbnRyeV90eXBlLCAqbGVuKTsKKwlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5X2NhbGwgeworCWludCB0eXBlOworCWludCAoKmNhbGwpKAorCSAgICBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLAorCSAgICBzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICosCisJICAgIHZvaWQgKiwKKwkgICAgdWxvbmcgKik7Cit9OworCitzdGF0aWMgc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeV9jYWxsIHFsMjd4eF9md2R0X2VudHJ5X2NhbGxfbGlzdFtdID0geworCXsgRU5UUllfVFlQRV9OT1AJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QwICAgIH0gLAorCXsgRU5UUllfVFlQRV9UTVBfRU5ECQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjU1ICB9ICwKKwl7IEVOVFJZX1RZUEVfUkRfSU9CX1QxCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjU2ICB9ICwKKwl7IEVOVFJZX1RZUEVfV1JfSU9CX1QxCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjU3ICB9ICwKKwl7IEVOVFJZX1RZUEVfUkRfSU9CX1QyCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjU4ICB9ICwKKwl7IEVOVFJZX1RZUEVfV1JfSU9CX1QyCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjU5ICB9ICwKKwl7IEVOVFJZX1RZUEVfUkRfUENJCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjYwICB9ICwKKwl7IEVOVFJZX1RZUEVfV1JfUENJCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjYxICB9ICwKKwl7IEVOVFJZX1RZUEVfUkRfUkFNCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjYyICB9ICwKKwl7IEVOVFJZX1RZUEVfR0VUX1FVRVVFCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjYzICB9ICwKKwl7IEVOVFJZX1RZUEVfR0VUX0ZDRQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NCAgfSAsCisJeyBFTlRSWV9UWVBFX1BTRV9SSVNDCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjY1ICB9ICwKKwl7IEVOVFJZX1RZUEVfUlNUX1JJU0MJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjYgIH0gLAorCXsgRU5UUllfVFlQRV9ESVNfSU5UUgkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NyAgfSAsCisJeyBFTlRSWV9UWVBFX0dFVF9IQlVGCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjY4ICB9ICwKKwl7IEVOVFJZX1RZUEVfU0NSQVRDSAkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2OSAgfSAsCisJeyBFTlRSWV9UWVBFX1JEUkVNUkVHCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjcwICB9ICwKKwl7IEVOVFJZX1RZUEVfV1JSRU1SRUcJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNzEgIH0gLAorCXsgRU5UUllfVFlQRV9SRFJFTVJBTQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MiAgfSAsCisJeyBFTlRSWV9UWVBFX1BDSUNGRwkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MyAgfSAsCisJeyAtMQkJCQksIHFsYTI3eHhfZndkdF9lbnRyeV9vdGhlciB9Cit9OworCitzdGF0aWMgaW5saW5lIGludCAoKnFsYTI3eHhfZmluZF9lbnRyeShpbnQgdHlwZSkpCisJKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKiwgdm9pZCAqLCB1bG9uZyAqKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnlfY2FsbCAqbGlzdCA9IHFsMjd4eF9md2R0X2VudHJ5X2NhbGxfbGlzdDsKKworCXdoaWxlIChsaXN0LT50eXBlICE9IC0xICYmIGxpc3QtPnR5cGUgIT0gdHlwZSkKKwkJbGlzdCsrOworCisJcmV0dXJuIGxpc3QtPmNhbGw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitxbGEyN3h4X25leHRfZW50cnkodm9pZCAqcCkKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQgPSBwOworCisJcmV0dXJuIHAgKyBlbnQtPmhkci5lbnRyeV9zaXplOworfQorCitzdGF0aWMgdm9pZAorcWxhMjd4eF93YWxrX3RlbXBsYXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wLCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50ID0gKHZvaWQgKil0bXAgKyB0bXAtPmVudHJ5X29mZnNldDsKKwl1bG9uZyBjb3VudCA9IHRtcC0+ZW50cnlfY291bnQ7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDFhLAorCSAgICAiJXM6IGVudHJ5IGNvdW50ICVseFxuIiwgX19mdW5jX18sIGNvdW50KTsKKwl3aGlsZSAoY291bnQtLSkgeworCQlpZiAocWxhMjd4eF9maW5kX2VudHJ5KGVudC0+aGRyLmVudHJ5X3R5cGUpKHZoYSwgZW50LCBidWYsIGxlbikpCisJCQlicmVhazsKKwkJZW50ID0gcWxhMjd4eF9uZXh0X2VudHJ5KGVudCk7CisJfQorCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMWIsCisJICAgICIlczogbGVuPSVseFxuIiwgX19mdW5jX18sICpsZW4pOworfQorCitzdGF0aWMgdm9pZAorcWxhMjd4eF90aW1lX3N0YW1wKHN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCkKK3sKKwl0bXAtPmNhcHR1cmVfdGltZXN0YW1wID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQKK3FsYTI3eHhfZHJpdmVyX2luZm8oc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wKQoreworCXVpbnQ4X3QgdltdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisJaW50IHJ2YWwgPSAwOworCisJcnZhbCA9IHNzY2FuZihxbGEyeDAwX3ZlcnNpb25fc3RyLCAiJWhodS4laGh1LiVoaHUuJWhodS4laGh1LiVoaHUiLAorCSAgICB2KzAsIHYrMSwgdisyLCB2KzMsIHYrNCwgdis1KTsKKworCXRtcC0+ZHJpdmVyX2luZm9bMF0gPSB2WzNdIDw8IDI0IHwgdlsyXSA8PCAxNiB8IHZbMV0gPDwgOCB8IHZbMF07CisJdG1wLT5kcml2ZXJfaW5mb1sxXSA9IHZbNV0gPDwgOCB8IHZbNF07CisJdG1wLT5kcml2ZXJfaW5mb1syXSA9IDB4MTIzNDU2Nzg7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyN3h4X2Zpcm13YXJlX2luZm8oc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wLAorCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCit7CisJdG1wLT5maXJtd2FyZV92ZXJzaW9uWzBdID0gdmhhLT5ody0+ZndfbWFqb3JfdmVyc2lvbjsKKwl0bXAtPmZpcm13YXJlX3ZlcnNpb25bMV0gPSB2aGEtPmh3LT5md19taW5vcl92ZXJzaW9uOworCXRtcC0+ZmlybXdhcmVfdmVyc2lvblsyXSA9IHZoYS0+aHctPmZ3X3N1Ym1pbm9yX3ZlcnNpb247CisJdG1wLT5maXJtd2FyZV92ZXJzaW9uWzNdID0KKwkgICAgdmhhLT5ody0+ZndfYXR0cmlidXRlc19oIDw8IDE2IHwgdmhhLT5ody0+ZndfYXR0cmlidXRlczsKKwl0bXAtPmZpcm13YXJlX3ZlcnNpb25bNF0gPQorCSAgICB2aGEtPmh3LT5md19hdHRyaWJ1dGVzX2V4dFsxXSA8PCAxNiB8IHZoYS0+aHctPmZ3X2F0dHJpYnV0ZXNfZXh0WzBdOworfQorCitzdGF0aWMgdm9pZAorcWwyN3h4X2VkaXRfdGVtcGxhdGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXApCit7CisJcWxhMjd4eF90aW1lX3N0YW1wKHRtcCk7CisJcWxhMjd4eF9kcml2ZXJfaW5mbyh0bXApOworCXFsYTI3eHhfZmlybXdhcmVfaW5mbyh0bXAsIHZoYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK3FsYTI3eHhfdGVtcGxhdGVfY2hlY2tzdW0odm9pZCAqcCwgdWxvbmcgc2l6ZSkKK3sKKwl1aW50MzJfdCAqYnVmID0gcDsKKwl1aW50NjRfdCBzdW0gPSAwOworCisJc2l6ZSAvPSBzaXplb2YoKmJ1Zik7CisKKwl3aGlsZSAoc2l6ZS0tKQorCQlzdW0gKz0gKmJ1ZisrOworCisJc3VtID0gKHN1bSAmIDB4ZmZmZmZmZmYpICsgKHN1bSA+PiAzMik7CisKKwlyZXR1cm4gfnN1bTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3FsYTI3eHhfdmVyaWZ5X3RlbXBsYXRlX2NoZWNrc3VtKHN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCkKK3sKKwlyZXR1cm4gcWxhMjd4eF90ZW1wbGF0ZV9jaGVja3N1bSh0bXAsIHRtcC0+dGVtcGxhdGVfc2l6ZSkgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3FsYTI3eHhfdmVyaWZ5X3RlbXBsYXRlX2hlYWRlcihzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXApCit7CisJcmV0dXJuIHRtcC0+dGVtcGxhdGVfdHlwZSA9PSBURU1QTEFURV9UWVBFX0ZXRFVNUDsKK30KKworc3RhdGljIHZvaWQKK3FsYTI3eHhfZXhlY3V0ZV9md2R0X3RlbXBsYXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wID0gdmhhLT5ody0+ZndfZHVtcF90ZW1wbGF0ZTsKKwl1bG9uZyBsZW47CisKKwlpZiAocWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKHRtcCkpIHsKKwkJbGVuID0gdG1wLT50ZW1wbGF0ZV9zaXplOworCQl0bXAgPSBtZW1jcHkodmhhLT5ody0+ZndfZHVtcCwgdG1wLCBsZW4pOworCQlxbDI3eHhfZWRpdF90ZW1wbGF0ZSh2aGEsIHRtcCk7CisJCXFsYTI3eHhfd2Fsa190ZW1wbGF0ZSh2aGEsIHRtcCwgdG1wLCAmbGVuKTsKKwkJdmhhLT5ody0+ZndfZHVtcF9sZW4gPSBsZW47CisJCXZoYS0+aHctPmZ3X2R1bXBlZCA9IDE7CisJfQorfQorCit1bG9uZworcWxhMjd4eF9md2R0X2NhbGN1bGF0ZV9kdW1wX3NpemUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXAgPSB2aGEtPmh3LT5md19kdW1wX3RlbXBsYXRlOworCXVsb25nIGxlbiA9IDA7CisKKwlpZiAocWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKHRtcCkpIHsKKwkJbGVuID0gdG1wLT50ZW1wbGF0ZV9zaXplOworCQlxbGEyN3h4X3dhbGtfdGVtcGxhdGUodmhhLCB0bXAsIE5VTEwsICZsZW4pOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3Vsb25nCitxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZSh2b2lkICpwKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCA9IHA7CisKKwlyZXR1cm4gdG1wLT50ZW1wbGF0ZV9zaXplOworfQorCit1bG9uZworcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHRfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2YocWwyN3h4X2Z3ZHRfZGVmYXVsdF90ZW1wbGF0ZSk7Cit9CisKK2NvbnN0IHZvaWQgKgorcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHQodm9pZCkKK3sKKwlyZXR1cm4gcWwyN3h4X2Z3ZHRfZGVmYXVsdF90ZW1wbGF0ZTsKK30KKworaW50CitxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQodm9pZCAqcCkKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXAgPSBwOworCisJaWYgKCFxbGEyN3h4X3ZlcmlmeV90ZW1wbGF0ZV9oZWFkZXIodG1wKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIE5VTEwsIDB4ZDAxYywKKwkJICAgICIlczogdGVtcGxhdGUgdHlwZSAleFxuIiwgX19mdW5jX18sIHRtcC0+dGVtcGxhdGVfdHlwZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIXFsYTI3eHhfdmVyaWZ5X3RlbXBsYXRlX2NoZWNrc3VtKHRtcCkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBOVUxMLCAweGQwMWQsCisJCSAgICAiJXM6IGZhaWxlZCB0ZW1wbGF0ZSBjaGVja3N1bVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK3FsYTI3eHhfZndkdW1wKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgaGFyZHdhcmVfbG9ja2VkKQoreworCXVsb25nIGZsYWdzID0gMDsKKworCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmhhLT5ody0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJaWYgKCF2aGEtPmh3LT5md19kdW1wKQorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDFlLCAiZndkdW1wIGJ1ZmZlciBtaXNzaW5nLlxuIik7CisJZWxzZSBpZiAoIXZoYS0+aHctPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMWYsICJmd2R1bXAgdGVtcGxhdGUgbWlzc2luZy5cbiIpOworCWVsc2UKKwkJcWxhMjd4eF9leGVjdXRlX2Z3ZHRfdGVtcGxhdGUodmhhKTsKKworCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGEtPmh3LT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdG1wbC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RtcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQyZmZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RtcGwuaApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMyBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19RTEFfRE1QMjdfSF9fCisjZGVmaW5lCV9fUUxBX0RNUDI3X0hfXworCisjZGVmaW5lIElPQkFTRV9BRERSCW9mZnNldG9mKHN0cnVjdCBkZXZpY2VfcmVnXzI0eHgsIGlvYmFzZV9hZGRyKQorCitzdHJ1Y3QgX19wYWNrZWQgcWxhMjd4eF9md2R0X3RlbXBsYXRlIHsKKwl1aW50MzJfdCB0ZW1wbGF0ZV90eXBlOworCXVpbnQzMl90IGVudHJ5X29mZnNldDsKKwl1aW50MzJfdCB0ZW1wbGF0ZV9zaXplOworCXVpbnQzMl90IHJlc2VydmVkXzE7CisKKwl1aW50MzJfdCBlbnRyeV9jb3VudDsKKwl1aW50MzJfdCB0ZW1wbGF0ZV92ZXJzaW9uOworCXVpbnQzMl90IGNhcHR1cmVfdGltZXN0YW1wOworCXVpbnQzMl90IHRlbXBsYXRlX2NoZWNrc3VtOworCisJdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwl1aW50MzJfdCBkcml2ZXJfaW5mb1szXTsKKworCXVpbnQzMl90IHNhdmVkX3N0YXRlWzE2XTsKKworCXVpbnQzMl90IHJlc2VydmVkXzNbOF07CisJdWludDMyX3QgZmlybXdhcmVfdmVyc2lvbls1XTsKK307CisKKyNkZWZpbmUgVEVNUExBVEVfVFlQRV9GV0RVTVAJCTk5CisKKyNkZWZpbmUgRU5UUllfVFlQRV9OT1AJCQkwCisjZGVmaW5lIEVOVFJZX1RZUEVfVE1QX0VORAkJMjU1CisjZGVmaW5lIEVOVFJZX1RZUEVfUkRfSU9CX1QxCQkyNTYKKyNkZWZpbmUgRU5UUllfVFlQRV9XUl9JT0JfVDEJCTI1NworI2RlZmluZSBFTlRSWV9UWVBFX1JEX0lPQl9UMgkJMjU4CisjZGVmaW5lIEVOVFJZX1RZUEVfV1JfSU9CX1QyCQkyNTkKKyNkZWZpbmUgRU5UUllfVFlQRV9SRF9QQ0kJCTI2MAorI2RlZmluZSBFTlRSWV9UWVBFX1dSX1BDSQkJMjYxCisjZGVmaW5lIEVOVFJZX1RZUEVfUkRfUkFNCQkyNjIKKyNkZWZpbmUgRU5UUllfVFlQRV9HRVRfUVVFVUUJCTI2MworI2RlZmluZSBFTlRSWV9UWVBFX0dFVF9GQ0UJCTI2NAorI2RlZmluZSBFTlRSWV9UWVBFX1BTRV9SSVNDCQkyNjUKKyNkZWZpbmUgRU5UUllfVFlQRV9SU1RfUklTQwkJMjY2CisjZGVmaW5lIEVOVFJZX1RZUEVfRElTX0lOVFIJCTI2NworI2RlZmluZSBFTlRSWV9UWVBFX0dFVF9IQlVGCQkyNjgKKyNkZWZpbmUgRU5UUllfVFlQRV9TQ1JBVENICQkyNjkKKyNkZWZpbmUgRU5UUllfVFlQRV9SRFJFTVJFRwkJMjcwCisjZGVmaW5lIEVOVFJZX1RZUEVfV1JSRU1SRUcJCTI3MQorI2RlZmluZSBFTlRSWV9UWVBFX1JEUkVNUkFNCQkyNzIKKyNkZWZpbmUgRU5UUllfVFlQRV9QQ0lDRkcJCTI3MworCisjZGVmaW5lIENBUFRVUkVfRkxBR19QSFlTX09OTFkJCUJJVF8wCisjZGVmaW5lIENBUFRVUkVfRkxBR19QSFlTX1ZJUlQJCUJJVF8xCisKKyNkZWZpbmUgRFJJVkVSX0ZMQUdfU0tJUF9FTlRSWQkJQklUXzcKKworc3RydWN0IF9fcGFja2VkIHFsYTI3eHhfZndkdF9lbnRyeSB7CisJc3RydWN0IF9fcGFja2VkIHsKKwkJdWludDMyX3QgZW50cnlfdHlwZTsKKwkJdWludDMyX3QgZW50cnlfc2l6ZTsKKwkJdWludDMyX3QgcmVzZXJ2ZWRfMTsKKworCQl1aW50OF90ICBjYXB0dXJlX2ZsYWdzOworCQl1aW50OF90ICByZXNlcnZlZF8yWzJdOworCQl1aW50OF90ICBkcml2ZXJfZmxhZ3M7CisJfSBoZHI7CisJdW5pb24gX19wYWNrZWQgeworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQl9IHQwOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCX0gdDI1NTsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYmFzZV9hZGRyOworCQkJdWludDhfdCAgcmVnX3dpZHRoOworCQkJdWludDE2X3QgcmVnX2NvdW50OworCQkJdWludDhfdCAgcGNpX29mZnNldDsKKwkJfSB0MjU2OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBiYXNlX2FkZHI7CisJCQl1aW50MzJfdCB3cml0ZV9kYXRhOworCQkJdWludDhfdCAgcGNpX29mZnNldDsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworCQl9IHQyNTc7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGJhc2VfYWRkcjsKKwkJCXVpbnQ4X3QgIHJlZ193aWR0aDsKKwkJCXVpbnQxNl90IHJlZ19jb3VudDsKKwkJCXVpbnQ4X3QgIHBjaV9vZmZzZXQ7CisJCQl1aW50OF90ICBiYW5rc2VsX29mZnNldDsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworCQkJdWludDMyX3QgYmFuazsKKwkJfSB0MjU4OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBiYXNlX2FkZHI7CisJCQl1aW50MzJfdCB3cml0ZV9kYXRhOworCQkJdWludDhfdCAgcmVzZXJ2ZWRbMl07CisJCQl1aW50OF90ICBwY2lfb2Zmc2V0OworCQkJdWludDhfdCAgYmFua3NlbF9vZmZzZXQ7CisJCQl1aW50MzJfdCBiYW5rOworCQl9IHQyNTk7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQ4X3QgcGNpX2FkZHI7CisJCQl1aW50OF90IHJlc2VydmVkWzNdOworCQl9IHQyNjA7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQ4X3QgcGNpX2FkZHI7CisJCQl1aW50OF90IHJlc2VydmVkWzNdOworCQkJdWludDMyX3Qgd3JpdGVfZGF0YTsKKwkJfSB0MjYxOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50OF90ICByYW1fYXJlYTsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworCQkJdWludDMyX3Qgc3RhcnRfYWRkcjsKKwkJCXVpbnQzMl90IGVuZF9hZGRyOworCQl9IHQyNjI7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IG51bV9xdWV1ZXM7CisJCQl1aW50OF90ICBxdWV1ZV90eXBlOworCQkJdWludDhfdCAgcmVzZXJ2ZWRbM107CisJCX0gdDI2MzsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgZmNlX3RyYWNlX3NpemU7CisJCQl1aW50NjRfdCB3cml0ZV9wb2ludGVyOworCQkJdWludDY0X3QgYmFzZV9wb2ludGVyOworCQkJdWludDMyX3QgZmNlX2VuYWJsZV9tYjA7CisJCQl1aW50MzJfdCBmY2VfZW5hYmxlX21iMjsKKwkJCXVpbnQzMl90IGZjZV9lbmFibGVfbWIzOworCQkJdWludDMyX3QgZmNlX2VuYWJsZV9tYjQ7CisJCQl1aW50MzJfdCBmY2VfZW5hYmxlX21iNTsKKwkJCXVpbnQzMl90IGZjZV9lbmFibGVfbWI2OworCQl9IHQyNjQ7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJfSB0MjY1OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCX0gdDI2NjsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDhfdCAgcGNpX29mZnNldDsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworCQkJdWludDMyX3QgZGF0YTsKKwkJfSB0MjY3OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50OF90ICBidWZfdHlwZTsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworCQkJdWludDMyX3QgYnVmX3NpemU7CisJCQl1aW50NjRfdCBzdGFydF9hZGRyOworCQl9IHQyNjg7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IHNjcmF0Y2hfc2l6ZTsKKwkJfSB0MjY5OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBhZGRyOworCQkJdWludDMyX3QgY291bnQ7CisJCX0gdDI3MDsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYWRkcjsKKwkJCXVpbnQzMl90IGRhdGE7CisJCX0gdDI3MTsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYWRkcjsKKwkJCXVpbnQzMl90IGNvdW50OworCQl9IHQyNzI7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGFkZHI7CisJCQl1aW50MzJfdCBjb3VudDsKKwkJfSB0MjczOworCX07Cit9OworCisjZGVmaW5lIFQyNjJfUkFNX0FSRUFfQ1JJVElDQUxfUkFNCTEKKyNkZWZpbmUgVDI2Ml9SQU1fQVJFQV9FWFRFUk5BTF9SQU0JMgorI2RlZmluZSBUMjYyX1JBTV9BUkVBX1NIQVJFRF9SQU0JMworI2RlZmluZSBUMjYyX1JBTV9BUkVBX0REUl9SQU0JCTQKKworI2RlZmluZSBUMjYzX1FVRVVFX1RZUEVfUkVRCQkxCisjZGVmaW5lIFQyNjNfUVVFVUVfVFlQRV9SU1AJCTIKKyNkZWZpbmUgVDI2M19RVUVVRV9UWVBFX0FUSU8JCTMKKworI2RlZmluZSBUMjY4X0JVRl9UWVBFX0VYVERfVFJBQ0UJMQorI2RlZmluZSBUMjY4X0JVRl9UWVBFX0VYQ0hfQlVGT0ZGCTIKKyNkZWZpbmUgVDI2OF9CVUZfVFlQRV9FWFREX0xPR0lOCTMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCAzMWQxOTUzLi5lMzZiOTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTcsOSArNyw5IEBACiAvKgogICogRHJpdmVyIHZlcnNpb24KICAqLwotI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wNi4wMC4xMi1rIgorI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wNy4wMC4wMi1rIgogCiAjZGVmaW5lIFFMQV9EUklWRVJfTUFKT1JfVkVSCTgKLSNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJNgorI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgk3CiAjZGVmaW5lIFFMQV9EUklWRVJfUEFUQ0hfVkVSCTAKICNkZWZpbmUgUUxBX0RSSVZFUl9CRVRBX1ZFUgkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfODN4eC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0XzgzeHguYwppbmRleCA5MTkyODQ4Li4yZWJhMzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfODN4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF84M3h4LmMKQEAgLTEzMDQsMTIgKzEzMDQsMjQgQEAKIHN0YXRpYyBpbnQgcWxhNF84M3h4X3Jlc3RhcnQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCWludCByZXRfdmFsID0gUUxBX1NVQ0NFU1M7CisJdWludDMyX3QgaWRjX2N0cmw7CiAKIAlxbGE0XzgzeHhfcHJvY2Vzc19zdG9wX3NlcShoYSk7CiAKLQkvKiBDb2xsZWN0IG1pbmlkdW1wKi8KLQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChBRl84M1hYX05PX0ZXX0RVTVAsICZoYS0+ZmxhZ3MpKQorCS8qCisJICogQ29sbGVjdCBtaW5pZHVtcC4KKwkgKiBJZiBJRENfQ1RSTCBCSVQxIGlzIHNldCwgY2xlYXIgaXQgb24gZ29pbmcgdG8gSU5JVCBzdGF0ZSBhbmQKKwkgKiBkb24ndCBjb2xsZWN0IG1pbmlkdW1wCisJICovCisJaWRjX2N0cmwgPSBxbGE0XzgzeHhfcmRfcmVnKGhhLCBRTEE4M1hYX0lEQ19EUlZfQ1RSTCk7CisJaWYgKGlkY19jdHJsICYgR1JBQ0VGVUxfUkVTRVRfQklUMSkgeworCQlxbGE0XzgzeHhfd3JfcmVnKGhhLCBRTEE4M1hYX0lEQ19EUlZfQ1RSTCwKKwkJCQkgKGlkY19jdHJsICYgfkdSQUNFRlVMX1JFU0VUX0JJVDEpKTsKKwkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IEdyYWNlZnVsIFJFU0VUOiBOb3QgY29sbGVjdGluZyBtaW5pZHVtcFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwl9IGVsc2UgewogCQlxbGE0Xzh4eHhfZ2V0X21pbmlkdW1wKGhhKTsKKwl9CiAKIAlxbGE0XzgzeHhfcHJvY2Vzc19pbml0X3NlcShoYSk7CiAKQEAgLTE2NjQsMyArMTY3NiwyMyBAQAogCV9fcWxhNF84M3h4X2Rpc2FibGVfcGF1c2UoaGEpOwogCWhhLT5pc3Bfb3BzLT5pZGNfdW5sb2NrKGhhKTsKIH0KKworLyoqCisgKiBxbGE0XzgzeHhfaXNfZGV0YWNoZWQgLSBDaGVjayBpZiB3ZSBhcmUgbWFya2VkIGludmlzaWJsZS4KKyAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgorICoqLworaW50IHFsYTRfODN4eF9pc19kZXRhY2hlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3QgZHJ2X2FjdGl2ZTsKKworCWRydl9hY3RpdmUgPSBxbGE0Xzh4eHhfcmRfZGlyZWN0KGhhLCBRTEE4WFhYX0NSQl9EUlZfQUNUSVZFKTsKKworCWlmICh0ZXN0X2JpdChBRl9JTklUX0RPTkUsICZoYS0+ZmxhZ3MpICYmCisJICAgICEoZHJ2X2FjdGl2ZSAmICgxIDw8IGhhLT5mdW5jX251bSkpKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogZHJ2X2FjdGl2ZSA9IDB4JVhcbiIsCisJCQkJICBfX2Z1bmNfXywgZHJ2X2FjdGl2ZSkpOworCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFFMQV9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ic2cuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ic2cuYwppbmRleCAwNGEwMDI3Li45ZjkyY2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkJCQkJCShoYS0+aWRjX2V4dGVuZF90bW8gKiBIWikpKSB7CiAJCQkJaGEtPm5vdGlmeV9pZGNfY29tcCA9IDA7CiAJCQkJaGEtPm5vdGlmeV9saW5rX3VwX2NvbXAgPSAwOwotCQkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBJREMgQ29tcGxldGUgbm90aWZpY2F0aW9uIG5vdCByZWNlaXZlZCIsCisJCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IEFib3J0aW5nOiBJREMgQ29tcGxldGUgbm90aWZpY2F0aW9uIG5vdCByZWNlaXZlZCIsCiAJCQkJCSAgIF9fZnVuY19fKTsKIAkJCQlzdGF0dXMgPSBRTEFfRVJST1I7CiAJCQkJZ290byBleGl0X3dhaXQ7CkBAIC01MzgsNyArNTM4LDcgQEAKIAkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmhhLT5saW5rX3VwX2NvbXAsCiAJCQkJCQkgKElEQ19DT01QX1RPViAqIEhaKSkpIHsKIAkJCWhhLT5ub3RpZnlfbGlua191cF9jb21wID0gMDsKLQkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBMSU5LIFVQIG5vdGlmaWNhdGlvbiBub3QgcmVjZWl2ZWQiLAorCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IEFib3J0aW5nOiBMSU5LIFVQIG5vdGlmaWNhdGlvbiBub3QgcmVjZWl2ZWQiLAogCQkJCSAgIF9fZnVuY19fKTsKIAkJCXN0YXR1cyA9IFFMQV9FUlJPUjsKIAkJCWdvdG8gZXhpdF93YWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCmluZGV4IGFhNjdiYjkuLjczYTUwMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKQEAgLTE5NCw3ICsxOTQsNyBAQAogI2RlZmluZSBBREFQVEVSX0lOSVRfVE9WCQkzMAogI2RlZmluZSBBREFQVEVSX1JFU0VUX1RPVgkJMTgwCiAjZGVmaW5lIEVYVEVORF9DTURfVE9WCQkJNjAKLSNkZWZpbmUgV0FJVF9DTURfVE9WCQkJMzAKKyNkZWZpbmUgV0FJVF9DTURfVE9WCQkJNQogI2RlZmluZSBFSF9XQUlUX0NNRF9UT1YJCQkxMjAKICNkZWZpbmUgRklSTVdBUkVfVVBfVE9WCQkJNjAKICNkZWZpbmUgUkVTRVRfRklSTVdBUkVfVE9WCQkzMApAQCAtMjk3LDYgKzI5Nyw4IEBACiAKIAkvKiBEcml2ZXIgUmUtbG9naW4gICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsJCSAgLyogRERCIEZsYWdzICovCisjZGVmaW5lIEREQl9DT05OX0NMT1NFX0ZBSUxVUkUJCTAgLyogMHgwMDAwMDAwMSAqLworCiAJdWludDE2X3QgZGVmYXVsdF9yZWxvZ2luX3RpbWVvdXQ7IC8qICBNYXggdGltZSB0byB3YWl0IGZvcgogCQkJCQkgICAqICByZWxvZ2luIHRvIGNvbXBsZXRlICovCiAJYXRvbWljX3QgcmV0cnlfcmVsb2dpbl90aW1lcjsJICAvKiBNaW4gVGltZSBiZXR3ZWVuIHJlbG9naW5zCkBAIC01ODAsNyArNTgyLDYgQEAKICNkZWZpbmUgQUZfODJYWF9GV19EVU1QRUQJCTI0IC8qIDB4MDEwMDAwMDAgKi8KICNkZWZpbmUgQUZfOFhYWF9SU1RfT1dORVIJCTI1IC8qIDB4MDIwMDAwMDAgKi8KICNkZWZpbmUgQUZfODJYWF9EVU1QX1JFQURJTkcJCTI2IC8qIDB4MDQwMDAwMDAgKi8KLSNkZWZpbmUgQUZfODNYWF9OT19GV19EVU1QCQkyNyAvKiAweDA4MDAwMDAwICovCiAjZGVmaW5lIEFGXzgzWFhfSU9DQl9JTlRSX09OCQkyOCAvKiAweDEwMDAwMDAwICovCiAjZGVmaW5lIEFGXzgzWFhfTUJPWF9JTlRSX09OCQkyOSAvKiAweDIwMDAwMDAwICovCiAKQEAgLTU5NSwxMCArNTk2LDEwIEBACiAjZGVmaW5lIERQQ19BRU4JCQkJOSAvKiAweDAwMDAwMjAwICovCiAjZGVmaW5lIERQQ19HRVRfREhDUF9JUF9BRERSCQkxNSAvKiAweDAwMDA4MDAwICovCiAjZGVmaW5lIERQQ19MSU5LX0NIQU5HRUQJCTE4IC8qIDB4MDAwNDAwMDAgKi8KLSNkZWZpbmUgRFBDX1JFU0VUX0FDVElWRQkJMjAgLyogMHgwMDA0MDAwMCAqLwotI2RlZmluZSBEUENfSEFfVU5SRUNPVkVSQUJMRQkJMjEgLyogMHgwMDA4MDAwMCBJU1AtODJ4eCBvbmx5Ki8KLSNkZWZpbmUgRFBDX0hBX05FRURfUVVJRVNDRU5UCQkyMiAvKiAweDAwMTAwMDAwIElTUC04Mnh4IG9ubHkqLwotI2RlZmluZSBEUENfUE9TVF9JRENfQUNLCQkyMyAvKiAweDAwMjAwMDAwICovCisjZGVmaW5lIERQQ19SRVNFVF9BQ1RJVkUJCTIwIC8qIDB4MDAxMDAwMDAgKi8KKyNkZWZpbmUgRFBDX0hBX1VOUkVDT1ZFUkFCTEUJCTIxIC8qIDB4MDAyMDAwMDAgSVNQLTgyeHggb25seSovCisjZGVmaW5lIERQQ19IQV9ORUVEX1FVSUVTQ0VOVAkJMjIgLyogMHgwMDQwMDAwMCBJU1AtODJ4eCBvbmx5Ki8KKyNkZWZpbmUgRFBDX1BPU1RfSURDX0FDSwkJMjMgLyogMHgwMDgwMDAwMCAqLwogI2RlZmluZSBEUENfUkVTVE9SRV9BQ0IJCQkyNCAvKiAweDAxMDAwMDAwICovCiAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OyAvKiBwb2ludGVyIHRvIGhvc3QgZGF0YSAqLwpAQCAtNzY4LDYgKzc2OSw3IEBACiAJdWludDMyX3QgZndfZHVtcF9jYXB0dXJlX21hc2s7CiAJdm9pZCAqZndfZHVtcF90bXBsdF9oZHI7CiAJdWludDMyX3QgZndfZHVtcF90bXBsdF9zaXplOworCXVpbnQzMl90IGZ3X2R1bXBfc2tpcF9zaXplOwogCiAJc3RydWN0IGNvbXBsZXRpb24gbWJ4X2ludHJfY29tcDsKIApAQCAtOTEwLDcgKzkxMiw4IEBACiBzdGF0aWMgaW5saW5lIGludCBpc19hZXJfc3VwcG9ydGVkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlyZXR1cm4gKChoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMjIpIHx8Ci0JCShoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgzMjQpKTsKKwkJKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODMyNCkgfHwKKwkJKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODA0MikpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhZGFwdGVyX3VwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKaW5kZXggOGQ0MDkyYi4uMjA5ODUzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKQEAgLTM5MCw2ICszOTAsNyBAQAogI2RlZmluZSBNQk9YX0NNRF9DTEVBUl9EQVRBQkFTRV9FTlRSWQkJMHgwMDMxCiAjZGVmaW5lIE1CT1hfQ01EX0NPTk5fT1BFTgkJCTB4MDA3NAogI2RlZmluZSBNQk9YX0NNRF9DT05OX0NMT1NFX1NFU1NfTE9HT1VUCQkweDAwNTYKKyNkZWZpbmUgRERCX05PVF9MT0dHRURfSU4JCQkweDA5CiAjZGVmaW5lIExPR09VVF9PUFRJT05fQ0xPU0VfU0VTU0lPTgkJMHgwMDAyCiAjZGVmaW5lIExPR09VVF9PUFRJT05fUkVMT0dJTgkJCTB4MDAwNAogI2RlZmluZSBMT0dPVVRfT1BUSU9OX0ZSRUVfRERCCQkJMHgwMDA4CkBAIC01MDUsOSArNTA2LDkgQEAKICNkZWZpbmUgTUJPWF9BU1RTX1JFU1BPTlNFX1FVRVVFX0ZVTEwJCTB4ODAyOAogI2RlZmluZSBNQk9YX0FTVFNfSVBfQUREUl9TVEFURV9DSEFOR0VECQkweDgwMjkKICNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfREVGQVVMVF9ST1VURVJfQ0hBTkdFRAkweDgwMkEKLSNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfUFJFRklYX0VYUElSRUQJCTB4ODAyQgotI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9ORF9QUkVGSVhfSUdOT1JFRAkweDgwMkMKLSNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfTENMX1BSRUZJWF9JR05PUkVECTB4ODAyRAorI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9MSU5LX01UVV9DSEFOR0UJCTB4ODAyQgorI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9BVVRPX1BSRUZJWF9JR05PUkVECTB4ODAyQworI2RlZmluZSBNQk9YX0FTVFNfSVBWNl9ORF9MT0NBTF9QUkVGSVhfSUdOT1JFRAkweDgwMkQKICNkZWZpbmUgTUJPWF9BU1RTX0lDTVBWNl9FUlJPUl9NU0dfUkNWRAkJMHg4MDJFCiAjZGVmaW5lIE1CT1hfQVNUU19JTklUSUFMSVpBVElPTl9GQUlMRUQJCTB4ODAzMQogI2RlZmluZSBNQk9YX0FTVFNfU1lTVEVNX1dBUk5JTkdfRVZFTlQJCTB4ODAzNgpAQCAtNTI4LDE0ICs1MjksMTQgQEAKICNkZWZpbmUgQUNCX0NPTkZJR19ESVNBQkxFCQkweDAwCiAjZGVmaW5lIEFDQl9DT05GSUdfU0VUCQkJMHgwMQogCi0vKiBBQ0IgU3RhdGUgRGVmaW5lcyAqLwotI2RlZmluZSBBQ0JfU1RBVEVfVU5DT05GSUdVUkVECTB4MDAKLSNkZWZpbmUgQUNCX1NUQVRFX0lOVkFMSUQJMHgwMQotI2RlZmluZSBBQ0JfU1RBVEVfQUNRVUlSSU5HCTB4MDIKLSNkZWZpbmUgQUNCX1NUQVRFX1RFTlRBVElWRQkweDAzCi0jZGVmaW5lIEFDQl9TVEFURV9ERVBSSUNBVEVECTB4MDQKLSNkZWZpbmUgQUNCX1NUQVRFX1ZBTElECQkweDA1Ci0jZGVmaW5lIEFDQl9TVEFURV9ESVNBQkxJTkcJMHgwNgorLyogQUNCL0lQIEFkZHJlc3MgU3RhdGUgRGVmaW5lcyAqLworI2RlZmluZSBJUF9BRERSU1RBVEVfVU5DT05GSUdVUkVECTAKKyNkZWZpbmUgSVBfQUREUlNUQVRFX0lOVkFMSUQJCTEKKyNkZWZpbmUgSVBfQUREUlNUQVRFX0FDUVVJUklORwkJMgorI2RlZmluZSBJUF9BRERSU1RBVEVfVEVOVEFUSVZFCQkzCisjZGVmaW5lIElQX0FERFJTVEFURV9ERVBSSUNBVEVECQk0CisjZGVmaW5lIElQX0FERFJTVEFURV9QUkVGRVJSRUQJCTUKKyNkZWZpbmUgSVBfQUREUlNUQVRFX0RJU0FCTElORwkJNgogCiAvKiBGTEFTSCBvZmZzZXRzICovCiAjZGVmaW5lIEZMQVNIX1NFR01FTlRfSUZDQgkweDA0MDAwMDAwCkBAIC02OTgsMTQgKzY5OSw2IEBACiAJdWludDhfdCBpcHY2X2xua19sY2xfYWRkcl9zdGF0ZTsvKiAyMjIgKi8KIAl1aW50OF90IGlwdjZfYWRkcjBfc3RhdGU7CS8qIDIyMyAqLwogCXVpbnQ4X3QgaXB2Nl9hZGRyMV9zdGF0ZTsJLyogMjI0ICovCi0jZGVmaW5lIElQX0FERFJTVEFURV9VTkNPTkZJR1VSRUQJMAotI2RlZmluZSBJUF9BRERSU1RBVEVfSU5WQUxJRAkJMQotI2RlZmluZSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HCQkyCi0jZGVmaW5lIElQX0FERFJTVEFURV9URU5UQVRJVkUJCTMKLSNkZWZpbmUgSVBfQUREUlNUQVRFX0RFUFJJQ0FURUQJCTQKLSNkZWZpbmUgSVBfQUREUlNUQVRFX1BSRUZFUlJFRAkJNQotI2RlZmluZSBJUF9BRERSU1RBVEVfRElTQUJMSU5HCQk2Ci0KIAl1aW50OF90IGlwdjZfZGZsdF9ydHJfc3RhdGU7ICAgIC8qIDIyNSAqLwogI2RlZmluZSBJUFY2X1JUUlNUQVRFX1VOS05PV04gICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBJUFY2X1JUUlNUQVRFX01BTlVBTCAgICAgICAgICAgICAgICAgICAgMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKaW5kZXggZDY3YzUwZS4uYjFhMTljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCkBAIC0yNzksNiArMjc5LDggQEAKIHVpbnQ4X3QgcWxhNHh4eF9zZXRfaXBhZGRyX3N0YXRlKHVpbnQ4X3QgZndfaXBhZGRyX3N0YXRlKTsKIGludCBxbGE0XzgzeHhfZ2V0X3BvcnRfY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKmNvbmZpZyk7CiBpbnQgcWxhNF84M3h4X3NldF9wb3J0X2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICpjb25maWcpOworaW50IHFsYTRfOHh4eF9jaGVja19pbml0X2FkYXB0ZXJfcmV0cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK2ludCBxbGE0XzgzeHhfaXNfZGV0YWNoZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIAogZXh0ZXJuIGludCBxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKIGV4dGVybiBpbnQgcWw0eGRvbnRyZXNldGhiYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCmluZGV4IDc0NTZlZWIuLjI4ZmJlY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYwpAQCAtOTU5LDEzICs5NTksOCBAQAogCQlxbGE0eHh4X2J1aWxkX2RkYl9saXN0KGhhLCBpc19yZXNldCk7CiAKIAlzZXRfYml0KEFGX09OTElORSwgJmhhLT5mbGFncyk7Ci1leGl0X2luaXRfaGJhOgotCWlmIChpc19xbGE4MFhYKGhhKSAmJiAoc3RhdHVzID09IFFMQV9FUlJPUikpIHsKLQkJLyogU2luY2UgaW50ZXJydXB0cyBhcmUgcmVnaXN0ZXJlZCBpbiBzdGFydF9maXJtd2FyZSBmb3IKLQkJICogODBYWCwgcmVsZWFzZSB0aGVtIGhlcmUgaWYgaW5pdGlhbGl6ZV9hZGFwdGVyIGZhaWxzICovCi0JCXFsYTR4eHhfZnJlZV9pcnFzKGhhKTsKLQl9CiAKK2V4aXRfaW5pdF9oYmE6CiAJREVCVUcyKHByaW50aygic2NzaSVsZDogaW5pdGlhbGl6ZSBhZGFwdGVyOiAlc1xuIiwgaGEtPmhvc3Rfbm8sCiAJICAgIHN0YXR1cyA9PSBRTEFfRVJST1IgPyAiRkFJTEVEIiA6ICJTVUNDRUVERUQiKSk7CiAJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYwppbmRleCBhM2M4YmM3Li5iMTkyNWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCkBAIC0zODUsOSArMzg1LDkgQEAKIAogCWNsc19jb25uID0gZGRiX2VudHJ5LT5jb25uOwogCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKLQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwgaXR0KTsKLQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAKIAlpZiAodGFzayA9PSBOVUxMKSB7CiAJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IFRhc2sgaXMgTlVMTFxuIiwgX19mdW5jX18pOwpAQCAtNjM1LDYgKzYzNSwxOCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcWxhNHh4eF9kZWZhdWx0X3JvdXRlcl9jaGFuZ2VkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkJICAgdWludDMyX3QgKm1ib3hfc3RzKQoreworCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIuczZfYWRkcjMyWzBdLAorCSAgICAgICAmbWJveF9zdHNbMl0sIHNpemVvZih1aW50MzJfdCkpOworCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIuczZfYWRkcjMyWzFdLAorCSAgICAgICAmbWJveF9zdHNbM10sIHNpemVvZih1aW50MzJfdCkpOworCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIuczZfYWRkcjMyWzJdLAorCSAgICAgICAmbWJveF9zdHNbNF0sIHNpemVvZih1aW50MzJfdCkpOworCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIuczZfYWRkcjMyWzNdLAorCSAgICAgICAmbWJveF9zdHNbNV0sIHNpemVvZih1aW50MzJfdCkpOworfQogCiAvKioKICAqIHFsYTR4eHhfaXNyX2RlY29kZV9tYWlsYm94IC0gZGVjb2RlcyBtYWlsYm94IHN0YXR1cwpAQCAtNzgxLDI3ICs3OTMsNDQgQEAKIAkJCQkJCSAgICBtYm94X3N0c1szXSk7CiAJCQkvKiBtYm94X3N0c1syXSA9IE9sZCBBQ0Igc3RhdGUKIAkJCSAqIG1ib3hfc3RzWzNdID0gbmV3IEFDQiBzdGF0ZSAqLwotCQkJaWYgKChtYm94X3N0c1szXSA9PSBBQ0JfU1RBVEVfVkFMSUQpICYmCi0JCQkgICAgKChtYm94X3N0c1syXSA9PSBBQ0JfU1RBVEVfVEVOVEFUSVZFKSB8fAotCQkJICAgIChtYm94X3N0c1syXSA9PSBBQ0JfU1RBVEVfQUNRVUlSSU5HKSkpIHsKKwkJCWlmICgobWJveF9zdHNbM10gPT0gSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkgJiYKKwkJCSAgICAoKG1ib3hfc3RzWzJdID09IElQX0FERFJTVEFURV9URU5UQVRJVkUpIHx8CisJCQkgICAgIChtYm94X3N0c1syXSA9PSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKSkpIHsKIAkJCQlzZXRfYml0KERQQ19HRVRfREhDUF9JUF9BRERSLCAmaGEtPmRwY19mbGFncyk7Ci0JCQl9IGVsc2UgaWYgKChtYm94X3N0c1szXSA9PSBBQ0JfU1RBVEVfQUNRVUlSSU5HKSAmJgotCQkJCSAgIChtYm94X3N0c1syXSA9PSBBQ0JfU1RBVEVfVkFMSUQpKSB7CisJCQl9IGVsc2UgaWYgKChtYm94X3N0c1szXSA9PSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKSAmJgorCQkJCSAgIChtYm94X3N0c1syXSA9PSBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSkgewogCQkJCWlmIChpc19xbGE4MFhYKGhhKSkKIAkJCQkJc2V0X2JpdChEUENfUkVTRVRfSEFfRldfQ09OVEVYVCwKIAkJCQkJCSZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQllbHNlCiAJCQkJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7Ci0JCQl9IGVsc2UgaWYgKG1ib3hfc3RzWzNdID09IEFDQl9TVEFURV9ESVNBQkxJTkcpIHsKKwkJCX0gZWxzZSBpZiAobWJveF9zdHNbM10gPT0gSVBfQUREUlNUQVRFX0RJU0FCTElORykgewogCQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBBQ0IgaW4gZGlzYWJsaW5nIHN0YXRlXG4iLAogCQkJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18pOwotCQkJfSBlbHNlIGlmICgobWJveF9zdHNbM10gPT0gQUNCX1NUQVRFX1VOQ09ORklHVVJFRCkpIHsKKwkJCX0gZWxzZSBpZiAobWJveF9zdHNbM10gPT0gSVBfQUREUlNUQVRFX1VOQ09ORklHVVJFRCkgewogCQkJCWNvbXBsZXRlKCZoYS0+ZGlzYWJsZV9hY2JfY29tcCk7CiAJCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEFDQiBzdGF0ZSB1bmNvbmZpZ3VyZWRcbiIsCiAJCQkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCQlicmVhazsKIAorCQljYXNlIE1CT1hfQVNUU19JUFY2X0xJTktfTVRVX0NIQU5HRToKKwkJY2FzZSBNQk9YX0FTVFNfSVBWNl9BVVRPX1BSRUZJWF9JR05PUkVEOgorCQljYXNlIE1CT1hfQVNUU19JUFY2X05EX0xPQ0FMX1BSRUZJWF9JR05PUkVEOgorCQkJLyogTm8gYWN0aW9uICovCisJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogQUVOICUwNHhcbiIsCisJCQkJCSAgaGEtPmhvc3Rfbm8sIG1ib3hfc3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE1CT1hfQVNUU19JQ01QVjZfRVJST1JfTVNHX1JDVkQ6CisJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCQkgICJzY3NpJWxkOiBBRU4gJTA0eCwgSVB2NiBFUlJPUiwgIgorCQkJCQkgICJtYm94X3N0c1sxXT0lMDh4LCBtYm94X3N0c1syXT0lMDh4LCBtYm94X3N0c1szfT0lMDh4LCBtYm94X3N0c1s0XT0lMDh4IG1ib3hfc3RzWzVdPSUwOHhcbiIsCisJCQkJCSAgaGEtPmhvc3Rfbm8sIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSwKKwkJCQkJICBtYm94X3N0c1syXSwgbWJveF9zdHNbM10sIG1ib3hfc3RzWzRdLAorCQkJCQkgIG1ib3hfc3RzWzVdKSk7CisJCQlicmVhazsKKwogCQljYXNlIE1CT1hfQVNUU19NQUNfQUREUkVTU19DSEFOR0VEOgogCQljYXNlIE1CT1hfQVNUU19ETlM6CiAJCQkvKiBObyBhY3Rpb24gKi8KQEAgLTkzOSw2ICs5NjgsNyBAQAogCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJCQkJICAic2NzaSVsZDogQUVOICUwNHggUmVjZWl2ZWQgSVB2NiBkZWZhdWx0IHJvdXRlciBjaGFuZ2VkIG5vdGlmaWNhdGlvblxuIiwKIAkJCQkJICBoYS0+aG9zdF9ubywgbWJveF9zdHNbMF0pKTsKKwkJCXFsYTR4eHhfZGVmYXVsdF9yb3V0ZXJfY2hhbmdlZChoYSwgbWJveF9zdHMpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNQk9YX0FTVFNfSURDX1RJTUVfRVhURU5EX05PVElGSUNBVElPTjoKQEAgLTEwMjIsNyArMTA1Miw4IEBACiAgICAgdWludDMyX3QgaW50cl9zdGF0dXMpCiB7CiAJLyogUHJvY2VzcyByZXNwb25zZSBxdWV1ZSBpbnRlcnJ1cHQuICovCi0JaWYgKGludHJfc3RhdHVzICYgSFNSWF9SSVNDX0lPQ0JfSU5UKQorCWlmICgoaW50cl9zdGF0dXMgJiBIU1JYX1JJU0NfSU9DQl9JTlQpICYmCisJICAgIHRlc3RfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncykpCiAJCXFsYTR4eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CiAKIAkvKiBQcm9jZXNzIG1haWxib3gvYXN5bmNoIGV2ZW50IGludGVycnVwdC4qLwpAQCAtMTM5OSw2ICsxNDMwLDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkZXZfaWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW50cl9zdGF0dXM7CiAJdWludDMyX3QgaXZhbCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTE0MTIsOCArMTQ0NCwxNSBAQAogCQlxbGE0eHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOwogCQl3cml0ZWwoMCwgJmhhLT5xbGE0XzgzeHhfcmVnLT5pb2NiX2ludF9tYXNrKTsKIAl9IGVsc2UgewotCQlxbGE0eHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOwotCQl3cml0ZWwoMCwgJmhhLT5xbGE0XzgyeHhfcmVnLT5ob3N0X2ludCk7CisJCWludHJfc3RhdHVzID0gcmVhZGwoJmhhLT5xbGE0XzgyeHhfcmVnLT5ob3N0X3N0YXR1cyk7CisJCWlmIChpbnRyX3N0YXR1cyAmIEhTUlhfUklTQ19JT0NCX0lOVCkgeworCQkJcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKwkJCXdyaXRlbCgwLCAmaGEtPnFsYTRfODJ4eF9yZWctPmhvc3RfaW50KTsKKwkJfSBlbHNlIHsKKwkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBzcHVyaW91cyBpb2NiIGludGVycnVwdC4uLlxuIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJCQlnb3RvIGV4aXRfbXNpeF9yc3BfcTsKKwkJfQogCX0KIAloYS0+aXNyX2NvdW50Kys7CiBleGl0X21zaXhfcnNwX3E6CkBAIC0xNDg4LDYgKzE1MjcsNyBAQAogaW50IHFsYTR4eHhfcmVxdWVzdF9pcnFzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlpbnQgcmV0OworCWludCBydmFsID0gUUxBX0VSUk9SOwogCiAJaWYgKGlzX3FsYTQwWFgoaGEpKQogCQlnb3RvIHRyeV9pbnR4OwpAQCAtMTU2OCw5ICsxNjA4LDEwIEBACiAJc2V0X2JpdChBRl9JUlFfQVRUQUNIRUQsICZoYS0+ZmxhZ3MpOwogCWhhLT5ob3N0LT5pcnEgPSBoYS0+cGRldi0+aXJxOwogCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBpcnEgJWQgYXR0YWNoZWRcbiIsCi0JICAgIF9fZnVuY19fLCBoYS0+cGRldi0+aXJxKTsKKwkJICAgX19mdW5jX18sIGhhLT5wZGV2LT5pcnEpOworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIGlycV9ub3RfYXR0YWNoZWQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcnZhbDsKIH0KIAogdm9pZCBxbGE0eHh4X2ZyZWVfaXJxcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKaW5kZXggOWFlOGNhMy4uMGE2Yjc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwpAQCAtMjEyLDkgKzIxMiw4IEBACiAJCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CiAJCQlnb3RvIG1ib3hfZXhpdDsKIAkJfQotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBNYWlsYm94IENtZCAweCUwOFggdGltZWQgb3V0IC4uLiwiCi0JCQkgICAgICAiIFNjaGVkdWxpbmcgQWRhcHRlciBSZXNldFxuIiwgaGEtPmhvc3Rfbm8sCi0JCQkgICAgICBtYnhfY21kWzBdKSk7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2klbGQ6IE1haWxib3ggQ21kIDB4JTA4WCB0aW1lZCBvdXQsIFNjaGVkdWxpbmcgQWRhcHRlciBSZXNldFxuIiwKKwkJCSAgIGhhLT5ob3N0X25vLCBtYnhfY21kWzBdKTsKIAkJaGEtPm1haWxib3hfdGltZW91dF9jb3VudCsrOwogCQltYnhfc3RzWzBdID0gKC0xKTsKIAkJc2V0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTI1MSwxNSArMjUwLDE2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQk9YX1NUU19CVVNZOgotCQlERUJVRzIoIHByaW50aygic2NzaSVsZDogJXM6IENtZCA9ICUwOFgsIElTUCBCVVNZXG4iLAotCQkJICAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgbWJ4X2NtZFswXSkpOworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpJWxkOiAlczogQ21kID0gJTA4WCwgSVNQIEJVU1lcbiIsCisJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIG1ieF9jbWRbMF0pOwogCQloYS0+bWFpbGJveF90aW1lb3V0X2NvdW50Kys7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6ICoqKiogRkFJTEVELCBjbWQgPSAlMDhYLCAiCi0JCQkgICAgICAic3RzID0gJTA4WCAqKioqXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCi0JCQkgICAgICBtYnhfY21kWzBdLCBtYnhfc3RzWzBdKSk7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2klbGQ6ICVzOiBGQUlMRUQsIE1CT1ggQ01EID0gJTA4WCwgTUJPWCBTVFMgPSAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIG1ieF9jbWRbMF0sIG1ieF9zdHNbMF0sCisJCQkgICBtYnhfc3RzWzFdLCBtYnhfc3RzWzJdLCBtYnhfc3RzWzNdLCBtYnhfc3RzWzRdLAorCQkJICAgbWJ4X3N0c1s1XSwgbWJ4X3N0c1s2XSwgbWJ4X3N0c1s3XSk7CiAJCWJyZWFrOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMzgzLDcgKzM4Myw2IEBACiAJbWJveF9jbWRbMl0gPSBMU0RXKGluaXRfZndfY2JfZG1hKTsKIAltYm94X2NtZFszXSA9IE1TRFcoaW5pdF9md19jYl9kbWEpOwogCW1ib3hfY21kWzRdID0gc2l6ZW9mKHN0cnVjdCBhZGRyX2N0cmxfYmxrKTsKLQltYm94X2NtZFs1XSA9IChJRkNCX1ZFUl9NQVggPDwgOCkgfCBJRkNCX1ZFUl9NSU47CiAKIAlpZiAocWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDYsIDYsIG1ib3hfY21kLCBtYm94X3N0cykgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKQEAgLTY0OCw5ICs2NDcsNiBAQAogCQlnb3RvIGV4aXRfaW5pdF9md19jYjsKIAl9CiAKLQkvKiBJbml0aWFsaXplIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHF1ZXVlcy4gKi8KLQlxbGE0eHh4X2luaXRfcmluZ3MoaGEpOwotCiAJLyogRmlsbCBpbiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWUgaW5mb3JtYXRpb24uICovCiAJaW5pdF9md19jYi0+cnFxX2NvbnN1bWVyX2lkeCA9IGNwdV90b19sZTE2KGhhLT5yZXF1ZXN0X291dCk7CiAJaW5pdF9md19jYi0+Y29tcHFfcHJvZHVjZXJfaWR4ID0gY3B1X3RvX2xlMTYoaGEtPnJlc3BvbnNlX2luKTsKQEAgLTEwMDIsNiArOTk4LDEwIEBACiAJCQkJICAiJXM6IE1CT1hfQ01EX0NPTk5fQ0xPU0VfU0VTU19MT0dPVVQgIgogCQkJCSAgImZhaWxlZCBzdHMgJTA0WCAlMDRYIiwgX19mdW5jX18sCiAJCQkJICBtYm94X3N0c1swXSwgbWJveF9zdHNbMV0pKTsKKwkJaWYgKChtYm94X3N0c1swXSA9PSBNQk9YX1NUU19DT01NQU5EX0VSUk9SKSAmJgorCQkgICAgKG1ib3hfc3RzWzFdID09IEREQl9OT1RfTE9HR0VEX0lOKSkgeworCQkJc2V0X2JpdChEREJfQ09OTl9DTE9TRV9GQUlMVVJFLCAmZGRiX2VudHJ5LT5mbGFncyk7CisJCX0KIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTkxOCw2ICsxOTE4LDcgQEAKIAkJCQkgIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSwgbWJveF9zdHNbMl0pKTsKIAl9IGVsc2UgewogCQlpZiAoaXNfcWxhODA0MihoYSkgJiYKKwkJICAgIHRlc3RfYml0KERQQ19QT1NUX0lEQ19BQ0ssICZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkgICAgKG1ib3hfc3RzWzBdICE9IE1CT1hfU1RTX0NPTU1BTkRfQ09NUExFVEUpKSB7CiAJCQkvKgogCQkJICogRGlzYWJsZSBBQ0IgbWFpbGJveCBjb21tYW5kIHRha2VzIHRpbWUgdG8gY29tcGxldGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmMKaW5kZXggZDAwMTIwMi4uNjMzMjhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmMKQEAgLTIzODMsNiArMjM4MywxMSBAQAogCQkJICAic2NzaSglbGQpOiBTa2lwcGluZyBlbnRyeVslZF06IEVUWVBFWzB4JXhdLUVMRVZFTFsweCV4XVxuIiwKIAkJCSAgaGEtPmhvc3Rfbm8sIGluZGV4LCBlbnRyeV9oZHItPmVudHJ5X3R5cGUsCiAJCQkgIGVudHJ5X2hkci0+ZF9jdHJsLmVudHJ5X2NhcHR1cmVfbWFzaykpOworCS8qIElmIGRyaXZlciBlbmNvdW50ZXJzIGEgbmV3IGVudHJ5IHR5cGUgdGhhdCBpdCBjYW5ub3QgcHJvY2VzcywKKwkgKiBpdCBzaG91bGQganVzdCBza2lwIHRoZSBlbnRyeSBhbmQgYWRqdXN0IHRoZSB0b3RhbCBidWZmZXIgc2l6ZSBieQorCSAqIGZyb20gc3VidHJhY3RpbmcgdGhlIHNraXBwZWQgYnl0ZXMgZnJvbSBpdAorCSAqLworCWhhLT5md19kdW1wX3NraXBfc2l6ZSArPSBlbnRyeV9oZHItPmVudHJ5X2NhcHR1cmVfc2l6ZTsKIH0KIAogLyogSVNQODN4eCBmdW5jdGlvbnMgdG8gcHJvY2VzcyBuZXcgbWluaWR1bXAgZW50cmllcy4uLiAqLwpAQCAtMjU5MCw2ICsyNTk1LDcgQEAKIAl1aW50NjRfdCBub3c7CiAJdWludDMyX3QgdGltZXN0YW1wOwogCisJaGEtPmZ3X2R1bXBfc2tpcF9zaXplID0gMDsKIAlpZiAoIWhhLT5md19kdW1wKSB7CiAJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzKCVsZCkgTm8gYnVmZmVyIHRvIGR1bXBcbiIsCiAJCQkgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pOwpAQCAtMjc2MSw3ICsyNzY3LDcgQEAKIAkJCQkgZW50cnlfaGRyLT5lbnRyeV9zaXplKTsKIAl9CiAKLQlpZiAoZGF0YV9jb2xsZWN0ZWQgIT0gaGEtPmZ3X2R1bXBfc2l6ZSkgeworCWlmICgoZGF0YV9jb2xsZWN0ZWQgKyBoYS0+ZndfZHVtcF9za2lwX3NpemUpICE9IGhhLT5md19kdW1wX3NpemUpIHsKIAkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJICAgIkR1bXAgZGF0YSBtaXNtYXRjaDogRGF0YSBjb2xsZWN0ZWQ6IFsweCV4XSwgdG90YWxfZGF0YV9zaXplOlsweCV4XVxuIiwKIAkJCSAgIGRhdGFfY29sbGVjdGVkLCBoYS0+ZndfZHVtcF9zaXplKTsKQEAgLTI4MjAsNjMgKzI4MjYsMzUgQEAKIGludCBxbGE0Xzh4eHhfZGV2aWNlX2Jvb3RzdHJhcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJaW50IHJ2YWwgPSBRTEFfRVJST1I7Ci0JaW50IGksIHRpbWVvdXQ7Ci0JdWludDMyX3Qgb2xkX2NvdW50LCBjb3VudCwgaWRjX2N0cmw7Ci0JaW50IG5lZWRfcmVzZXQgPSAwLCBwZWdfc3R1Y2sgPSAxOworCWludCBpOworCXVpbnQzMl90IG9sZF9jb3VudCwgY291bnQ7CisJaW50IG5lZWRfcmVzZXQgPSAwOwogCiAJbmVlZF9yZXNldCA9IGhhLT5pc3Bfb3BzLT5uZWVkX3Jlc2V0KGhhKTsKLQlvbGRfY291bnQgPSBxbGE0Xzh4eHhfcmRfZGlyZWN0KGhhLCBRTEE4WFhYX1BFR19BTElWRV9DT1VOVEVSKTsKLQotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCXRpbWVvdXQgPSBtc2xlZXBfaW50ZXJydXB0aWJsZSgyMDApOwotCQlpZiAodGltZW91dCkgewotCQkJcWxhNF84eHh4X3dyX2RpcmVjdChoYSwgUUxBOFhYWF9DUkJfREVWX1NUQVRFLAotCQkJCQkgICAgUUxBOFhYWF9ERVZfRkFJTEVEKTsKLQkJCXJldHVybiBydmFsOwotCQl9Ci0KLQkJY291bnQgPSBxbGE0Xzh4eHhfcmRfZGlyZWN0KGhhLCBRTEE4WFhYX1BFR19BTElWRV9DT1VOVEVSKTsKLQkJaWYgKGNvdW50ICE9IG9sZF9jb3VudCkKLQkJCXBlZ19zdHVjayA9IDA7Ci0JfQogCiAJaWYgKG5lZWRfcmVzZXQpIHsKIAkJLyogV2UgYXJlIHRyeWluZyB0byBwZXJmb3JtIGEgcmVjb3ZlcnkgaGVyZS4gKi8KLQkJaWYgKHBlZ19zdHVjaykKKwkJaWYgKHRlc3RfYml0KEFGX0ZXX1JFQ09WRVJZLCAmaGEtPmZsYWdzKSkKIAkJCWhhLT5pc3Bfb3BzLT5yb21fbG9ja19yZWNvdmVyeShoYSk7Ci0JCWdvdG8gZGV2X2luaXRpYWxpemU7CiAJfSBlbHNlICB7Ci0JCS8qIFN0YXJ0IG9mIGRheSBmb3IgdGhpcyBoYSBjb250ZXh0LiAqLwotCQlpZiAocGVnX3N0dWNrKSB7Ci0JCQkvKiBFaXRoZXIgd2UgYXJlIHRoZSBmaXJzdCBvciByZWNvdmVyeSBpbiBwcm9ncmVzcy4gKi8KLQkJCWhhLT5pc3Bfb3BzLT5yb21fbG9ja19yZWNvdmVyeShoYSk7Ci0JCQlnb3RvIGRldl9pbml0aWFsaXplOwotCQl9IGVsc2UgewotCQkJLyogRmlybXdhcmUgYWxyZWFkeSBydW5uaW5nLiAqLwotCQkJcnZhbCA9IFFMQV9TVUNDRVNTOwotCQkJZ290byBkZXZfcmVhZHk7CisJCW9sZF9jb3VudCA9IHFsYTRfOHh4eF9yZF9kaXJlY3QoaGEsIFFMQThYWFhfUEVHX0FMSVZFX0NPVU5URVIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJbXNsZWVwKDIwMCk7CisJCQljb3VudCA9IHFsYTRfOHh4eF9yZF9kaXJlY3QoaGEsCisJCQkJCQkgICAgUUxBOFhYWF9QRUdfQUxJVkVfQ09VTlRFUik7CisJCQlpZiAoY291bnQgIT0gb2xkX2NvdW50KSB7CisJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOworCQkJCWdvdG8gZGV2X3JlYWR5OworCQkJfQogCQl9CisJCWhhLT5pc3Bfb3BzLT5yb21fbG9ja19yZWNvdmVyeShoYSk7CiAJfQogCi1kZXZfaW5pdGlhbGl6ZToKIAkvKiBzZXQgdG8gREVWX0lOSVRJQUxJWklORyAqLwogCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBJTklUSUFMSVpJTkdcbiIpOwogCXFsYTRfOHh4eF93cl9kaXJlY3QoaGEsIFFMQThYWFhfQ1JCX0RFVl9TVEFURSwKIAkJCSAgICBRTEE4WFhYX0RFVl9JTklUSUFMSVpJTkcpOwogCi0JLyoKLQkgKiBGb3IgSVNQODMyNCBhbmQgSVNQODA0MiwgaWYgSURDX0NUUkwgR1JBQ0VGVUxfUkVTRVRfQklUMSBpcyBzZXQsCi0JICogcmVzZXQgaXQgYWZ0ZXIgZGV2aWNlIGdvZXMgdG8gSU5JVCBzdGF0ZS4KLQkgKi8KLQlpZiAoaXNfcWxhODAzMihoYSkgfHwgaXNfcWxhODA0MihoYSkpIHsKLQkJaWRjX2N0cmwgPSBxbGE0XzgzeHhfcmRfcmVnKGhhLCBRTEE4M1hYX0lEQ19EUlZfQ1RSTCk7Ci0JCWlmIChpZGNfY3RybCAmIEdSQUNFRlVMX1JFU0VUX0JJVDEpIHsKLQkJCXFsYTRfODN4eF93cl9yZWcoaGEsIFFMQTgzWFhfSURDX0RSVl9DVFJMLAotCQkJCQkgKGlkY19jdHJsICYgfkdSQUNFRlVMX1JFU0VUX0JJVDEpKTsKLQkJCXNldF9iaXQoQUZfODNYWF9OT19GV19EVU1QLCAmaGEtPmZsYWdzKTsKLQkJfQotCX0KLQogCWhhLT5pc3Bfb3BzLT5pZGNfdW5sb2NrKGhhKTsKIAogCWlmIChpc19xbGE4MDIyKGhhKSkKQEAgLTMyMDksNiArMzE4NywxMCBAQAogCiAJcmV0dmFsID0gcWxhNF84eHh4X2RldmljZV9zdGF0ZV9oYW5kbGVyKGhhKTsKIAorCS8qIEluaXRpYWxpemUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWVzLiAqLworCWlmIChyZXR2YWwgPT0gUUxBX1NVQ0NFU1MpCisJCXFsYTR4eHhfaW5pdF9yaW5ncyhoYSk7CisKIAlpZiAocmV0dmFsID09IFFMQV9TVUNDRVNTICYmICF0ZXN0X2JpdChBRl9JUlFfQVRUQUNIRUQsICZoYS0+ZmxhZ3MpKQogCQlyZXR2YWwgPSBxbGE0eHh4X3JlcXVlc3RfaXJxcyhoYSk7CiAKQEAgLTM4MzYsMyArMzgxOCwyNCBAQAogbXNpeF9vdXQ6CiAJcmV0dXJuIHJldDsKIH0KKworaW50IHFsYTRfOHh4eF9jaGVja19pbml0X2FkYXB0ZXJfcmV0cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKworCS8qIERvbnQgcmV0cnkgYWRhcHRlciBpbml0aWFsaXphdGlvbiBpZiBJUlEgYWxsb2NhdGlvbiBmYWlsZWQgKi8KKwlpZiAoIXRlc3RfYml0KEFGX0lSUV9BVFRBQ0hFRCwgJmhhLT5mbGFncykpIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IFNraXBwaW5nIHJldHJ5IG9mIGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gYXMgSVJRcyBhcmUgbm90IGF0dGFjaGVkXG4iLAorCQkJICAgX19mdW5jX18pOworCQlzdGF0dXMgPSBRTEFfRVJST1I7CisJCWdvdG8gZXhpdF9pbml0X2FkYXB0ZXJfZmFpbHVyZTsKKwl9CisKKwkvKiBTaW5jZSBpbnRlcnJ1cHRzIGFyZSByZWdpc3RlcmVkIGluIHN0YXJ0X2Zpcm13YXJlIGZvcgorCSAqIDh4eHgsIHJlbGVhc2UgdGhlbSBoZXJlIGlmIGluaXRpYWxpemVfYWRhcHRlciBmYWlscworCSAqIGFuZCByZXRyeSBhZGFwdGVyIGluaXRpYWxpemF0aW9uICovCisJcWxhNHh4eF9mcmVlX2lycXMoaGEpOworCitleGl0X2luaXRfYWRhcHRlcl9mYWlsdXJlOgorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCmluZGV4IGMyMWFkYzMuLjQ1OWI5ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCkBAIC0xNjcwLDE2ICsxNjcwLDEzIEBACiAJc3RydWN0IHNvY2thZGRyX2luICphZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2OwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCWlmICghc2hvc3QpIHsKIAkJcmV0ID0gLUVOWElPOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzaG9zdCBpcyBOVUxMXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBzaG9zdCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCiAJaGEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwotCiAJZXAgPSBpc2NzaV9jcmVhdGVfZW5kcG9pbnQoc2l6ZW9mKHN0cnVjdCBxbGFfZW5kcG9pbnQpKTsKIAlpZiAoIWVwKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xNjk5LDYgKzE2OTYsOSBAQAogCQlhZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnFsYV9lcC0+ZHN0X2FkZHI7CiAJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogJXBJNlxuIiwgX19mdW5jX18sCiAJCQkJICAoY2hhciAqKSZhZGRyNi0+c2luNl9hZGRyKSk7CisJfSBlbHNlIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IEludmFsaWQgZW5kcG9pbnRcbiIsCisJCQkgICBfX2Z1bmNfXyk7CiAJfQogCiAJcWxhX2VwLT5ob3N0ID0gc2hvc3Q7CkBAIC0xNzEyLDkgKzE3MTIsOSBAQAogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAlpbnQgcmV0ID0gMDsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKIAloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CisJREVCVUcyKHByX2luZm9fcmF0ZWxpbWl0ZWQoIiVzOiBob3N0OiAlbGRcbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOwogCiAJaWYgKGFkYXB0ZXJfdXAoaGEpICYmICF0ZXN0X2JpdChBRl9CVUlMRF9EREJfTElTVCwgJmhhLT5mbGFncykpCiAJCXJldCA9IDE7CkBAIC0xNzI0LDcgKzE3MjQsMTMgQEAKIAogc3RhdGljIHZvaWQgcWxhNHh4eF9lcF9kaXNjb25uZWN0KHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXApCiB7Ci0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCXN0cnVjdCBxbGFfZW5kcG9pbnQgKnFsYV9lcDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisKKwlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKKwloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBob3N0OiAlbGRcbiIsIF9fZnVuY19fLAorCQkJICBoYS0+aG9zdF9ubykpOwogCWlzY3NpX2Rlc3Ryb3lfZW5kcG9pbnQoZXApOwogfQogCkBAIC0xNzM0LDggKzE3NDAsMTEgQEAKIHsKIAlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBob3N0OiAlbGRcbiIsIF9fZnVuY19fLAorCQkJICBoYS0+aG9zdF9ubykpOwogCiAJc3dpdGNoIChwYXJhbSkgewogCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgpAQCAtMTc2NiwxMyArMTc3NSwxMyBAQAogCWludCByZXQ7CiAJZG1hX2FkZHJfdCBpc2NzaV9zdGF0c19kbWE7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7Ci0KIAljbHNfc2VzcyA9IGlzY3NpX2Nvbm5fdG9fc2Vzc2lvbihjbHNfY29ubik7CiAJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CiAJaGEgPSBkZGJfZW50cnktPmhhOwogCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBob3N0OiAlbGRcbiIsIF9fZnVuY19fLAorCQkJICBoYS0+aG9zdF9ubykpOwogCXN0YXRzX3NpemUgPSBQQUdFX0FMSUdOKHNpemVvZihzdHJ1Y3QgcWxfaXNjc2lfc3RhdHMpKTsKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KIAlxbF9pc2NzaV9zdGF0cyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc3RhdHNfc2l6ZSwKQEAgLTIxMDAsNyArMjEwOSw4IEBACiAJCQkJY3B1X3RvX2xlMTYoSVBWNl9UQ1BPUFRfREVMQVlFRF9BQ0tfRElTQUJMRSk7CiAJCWVsc2UKIAkJCWluaXRfZndfY2ItPmlwdjZfdGNwX29wdHMgJj0KLQkJCQljcHVfdG9fbGUxNih+SVBWNl9UQ1BPUFRfREVMQVlFRF9BQ0tfRElTQUJMRSk7CisJCQkJY3B1X3RvX2xlMTYofklQVjZfVENQT1BUX0RFTEFZRURfQUNLX0RJU0FCTEUgJgorCQkJCQkgICAgMHhGRkZGKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVENQX05BR0xFX0RJU0FCTEU6CiAJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQpAQCAtMjI5Nyw3ICsyMzA3LDggQEAKIAkJCQljcHVfdG9fbGUxNihUQ1BPUFRfREVMQVlFRF9BQ0tfRElTQUJMRSk7CiAJCWVsc2UKIAkJCWluaXRfZndfY2ItPmlwdjRfdGNwX29wdHMgJj0KLQkJCQljcHVfdG9fbGUxNih+VENQT1BUX0RFTEFZRURfQUNLX0RJU0FCTEUpOworCQkJCWNwdV90b19sZTE2KH5UQ1BPUFRfREVMQVlFRF9BQ0tfRElTQUJMRSAmCisJCQkJCSAgICAweEZGRkYpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX05FVF9QQVJBTV9UQ1BfTkFHTEVfRElTQUJMRToKIAkJaWYgKGlmYWNlX3BhcmFtLT5pZmFjZV9udW0gJiAweDEpCkBAIC0zMDQ1LDcgKzMwNTYsNiBAQAogCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CiAJaW50IHJldDsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAlpZiAoIWVwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicWxhNHh4eDogbWlzc2luZyBlcC5cbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTMwNTQsNiArMzA2NCw4IEBACiAJcWxhX2VwID0gZXAtPmRkX2RhdGE7CiAJZHN0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnFsYV9lcC0+ZHN0X2FkZHI7CiAJaGEgPSB0b19xbGFfaG9zdChxbGFfZXAtPmhvc3QpOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogaG9zdDogJWxkXG4iLCBfX2Z1bmNfXywKKwkJCSAgaGEtPmhvc3Rfbm8pKTsKIAogCXJldCA9IHFsYTR4eHhfZ2V0X2RkYl9pbmRleChoYSwgJmRkYl9pbmRleCk7CiAJaWYgKHJldCA9PSBRTEFfRVJST1IpCkBAIC0zMDc0LDYgKzMwODYsNyBAQAogCWRkYl9lbnRyeS0+c2VzcyA9IGNsc19zZXNzOwogCWRkYl9lbnRyeS0+dW5ibG9ja19zZXNzID0gcWxhNHh4eF91bmJsb2NrX2RkYjsKIAlkZGJfZW50cnktPmRkYl9jaGFuZ2UgPSBxbGE0eHh4X2RkYl9jaGFuZ2U7CisJY2xlYXJfYml0KEREQl9DT05OX0NMT1NFX0ZBSUxVUkUsICZkZGJfZW50cnktPmZsYWdzKTsKIAljbHNfc2Vzcy0+cmVjb3ZlcnlfdG1vID0gcWw0eHNlc3NfcmVjb3ZlcnlfdG1vOwogCWhhLT5md19kZGJfaW5kZXhfbWFwW2RkYl9lbnRyeS0+ZndfZGRiX2luZGV4XSA9IGRkYl9lbnRyeTsKIAloYS0+dG90X2RkYnMrKzsKQEAgLTMwOTIsMTAgKzMxMDUsMTEgQEAKIAl1aW50MzJfdCBkZGJfc3RhdGU7CiAJaW50IHJldDsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAloYSA9IGRkYl9lbnRyeS0+aGE7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBob3N0OiAlbGRcbiIsIF9fZnVuY19fLAorCQkJICBoYS0+aG9zdF9ubykpOwogCiAJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCiAJCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOwpAQCAtMzEyMyw3ICszMTM3LDggQEAKIAogZGVzdHJveV9zZXNzaW9uOgogCXFsYTR4eHhfY2xlYXJfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7Ci0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEREQl9DT05OX0NMT1NFX0ZBSUxVUkUsICZkZGJfZW50cnktPmZsYWdzKSkKKwkJY2xlYXJfYml0KGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LCBoYS0+ZGRiX2lkeF9tYXApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXFsYTR4eHhfZnJlZV9kZGIoaGEsIGRkYl9lbnRyeSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTMxNDEsMTcgKzMxNTYsMjMgQEAKIAlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOwogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOwogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJY2xzX2Nvbm4gPSBpc2NzaV9jb25uX3NldHVwKGNsc19zZXNzLCBzaXplb2Yoc3RydWN0IHFsYV9jb25uKSwKIAkJCQkgICAgY29ubl9pZHgpOwotCWlmICghY2xzX2Nvbm4pCisJaWYgKCFjbHNfY29ubikgeworCQlwcl9pbmZvKCIlczogQ2FuIG5vdCBjcmVhdGUgY29ubmVjdGlvbiBmb3IgY29ubl9pZHggPSAldVxuIiwKKwkJCV9fZnVuY19fLCBjb25uX2lkeCk7CiAJCXJldHVybiBOVUxMOworCX0KIAogCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeS0+Y29ubiA9IGNsc19jb25uOwogCisJaGEgPSBkZGJfZW50cnktPmhhOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogY29ubl9pZHggPSAldVxuIiwgX19mdW5jX18sCisJCQkgIGNvbm5faWR4KSk7CiAJcmV0dXJuIGNsc19jb25uOwogfQogCkBAIC0zMTYyLDggKzMxODMsMTYgQEAKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKIAlzdHJ1Y3QgcWxhX2Nvbm4gKnFsYV9jb25uOwogCXN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXA7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlzZXNzID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHNpZCA9ICVkLCBjaWQgPSAlZFxuIiwgX19mdW5jX18sCisJCQkgIGNsc19zZXNzaW9uLT5zaWQsIGNsc19jb25uLT5jaWQpKTsKIAogCWlmIChpc2NzaV9jb25uX2JpbmQoY2xzX3Nlc3Npb24sIGNsc19jb25uLCBpc19sZWFkaW5nKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTg2LDEwICszMjE1LDExIEBACiAJaW50IHJldCA9IDA7CiAJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwogCWhhID0gZGRiX2VudHJ5LT5oYTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHNpZCA9ICVkLCBjaWQgPSAlZFxuIiwgX19mdW5jX18sCisJCQkgIGNsc19zZXNzLT5zaWQsIGNsc19jb25uLT5jaWQpKTsKIAogCS8qIENoZWNrIGlmIHdlIGhhdmUgIG1hdGNoaW5nIEZXIEREQiwgaWYgeWVzIHRoZW4gZG8gbm90CiAJICogbG9naW4gdG8gdGhpcyB0YXJnZXQuIFRoaXMgY291bGQgY2F1c2UgdGFyZ2V0IHRvIGxvZ291dCBwcmV2aW91cwpAQCAtMzI2MywxMCArMzI5MywxMSBAQAogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKIAlpbnQgb3B0aW9uczsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAloYSA9IGRkYl9lbnRyeS0+aGE7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBjaWQgPSAlZFxuIiwgX19mdW5jX18sCisJCQkgIGNsc19jb25uLT5jaWQpKTsKIAogCW9wdGlvbnMgPSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT047CiAJaWYgKHFsYTR4eHhfc2Vzc2lvbl9sb2dvdXRfZGRiKGhhLCBkZGJfZW50cnksIG9wdGlvbnMpID09IFFMQV9FUlJPUikKQEAgLTQzNzIsNiArNDQwMywxMSBAQAogCXVpbnQzMl90IGRldl9zdGF0ZTsKIAl1aW50MzJfdCBpZGNfY3RybDsKIAorCWlmIChpc19xbGE4MDMyKGhhKSAmJgorCSAgICAocWxhNF84M3h4X2lzX2RldGFjaGVkKGhhKSA9PSBRTEFfU1VDQ0VTUykpCisJCVdBUk5fT05DRSgxLCAiJXM6IGlTQ1NJIGZ1bmN0aW9uICVkIG1hcmtlZCBpbnZpc2libGVcbiIsCisJCQkgIF9fZnVuY19fLCBoYS0+ZnVuY19udW0pOworCiAJLyogZG9uJ3QgcG9sbCBpZiByZXNldCBpcyBnb2luZyBvbiAqLwogCWlmICghKHRlc3RfYml0KERQQ19SRVNFVF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSB8fApAQCAtNDU1NCwxMSArNDU5MCwxOSBAQAogCXVpbnQzMl90IGluZGV4ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwl1bnNpZ25lZCBsb25nIHd0aW1lOworCXVpbnQzMl90IHd0bW87CiAKLQl1bnNpZ25lZCBsb25nIHd0aW1lID0gamlmZmllcyArIChXQUlUX0NNRF9UT1YgKiBIWik7CisJaWYgKGlzX3FsYTQwWFgoaGEpKQorCQl3dG1vID0gV0FJVF9DTURfVE9WOworCWVsc2UKKwkJd3RtbyA9IGhhLT5ueF9yZXNldF90aW1lb3V0IC8gMjsKIAotCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJXYWl0IHVwIHRvICVkIHNlY29uZHMgZm9yIGNtZHMgdG8gIgotCSAgICAiY29tcGxldGVcbiIsIFdBSVRfQ01EX1RPVikpOworCXd0aW1lID0gamlmZmllcyArICh3dG1vICogSFopOworCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgIldhaXQgdXAgdG8gJXUgc2Vjb25kcyBmb3IgY21kcyB0byBjb21wbGV0ZVxuIiwKKwkJCSAgd3RtbykpOwogCiAJd2hpbGUgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHd0aW1lKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTQ4NjEsMTEgKzQ5MDUsMTEgQEAKIAkJCXFsYTR4eHhfY21kX3dhaXQoaGEpOwogCiAJCXFsYTR4eHhfcHJvY2Vzc19hZW4oaGEsIEZMVVNIX0REQl9DSEFOR0VEX0FFTlMpOwotCQlxbGE0eHh4X2Fib3J0X2FjdGl2ZV9jbWRzKGhhLCBESURfUkVTRVQgPDwgMTYpOwogCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkgICAgInNjc2klbGQ6ICVzIC0gUGVyZm9ybWluZyBjaGlwIHJlc2V0Li5cbiIsCiAJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKIAkJc3RhdHVzID0gaGEtPmlzcF9vcHMtPnJlc2V0X2NoaXAoaGEpOworCQlxbGE0eHh4X2Fib3J0X2FjdGl2ZV9jbWRzKGhhLCBESURfUkVTRVQgPDwgMTYpOwogCX0KIAogCS8qIEZsdXNoIGFueSBwZW5kaW5nIGRkYiBjaGFuZ2VkIEFFTnMgKi8KQEAgLTQ4ODEsOCArNDkyNSwyMSBAQAogCQkJc3NsZWVwKDYpOwogCiAJCS8qIE5PVEU6IEFGX09OTElORSBmbGFnIHNldCB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZgotCQkgKiAgICAgICBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlciAqLworCQkgKiBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlciAqLwogCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgUkVTRVRfQURBUFRFUik7CisJCWlmIChpc19xbGE4MFhYKGhhKSAmJiAoc3RhdHVzID09IFFMQV9FUlJPUikpIHsKKwkJCXN0YXR1cyA9IHFsYTRfOHh4eF9jaGVja19pbml0X2FkYXB0ZXJfcmV0cnkoaGEpOworCQkJaWYgKHN0YXR1cyA9PSBRTEFfRVJST1IpIHsKKwkJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogRG9uJ3QgcmV0cnkgcmVjb3ZlciBhZGFwdGVyXG4iLAorCQkJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQkJCXFsYTR4eHhfZGVhZF9hZGFwdGVyX2NsZWFudXAoaGEpOworCQkJCWNsZWFyX2JpdChEUENfUkVUUllfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJCQkJY2xlYXJfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULAorCQkJCQkgICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlnb3RvIGV4aXRfcmVjb3ZlcjsKKwkJCX0KKwkJfQogCX0KIAogCS8qIFJldHJ5IGZhaWxlZCBhZGFwdGVyIGluaXRpYWxpemF0aW9uLCBpZiBuZWNlc3NhcnkKQEAgLTUyMjgsOSArNTI4NSw5IEBACiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCwgZHBjX3dvcmspOwogCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CiAKLQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogRFBDIGhhbmRsZXIgd2FraW5nIHVwLiIKLQkgICAgImZsYWdzID0gMHglMDhseCwgZHBjX2ZsYWdzID0gMHglMDhseFxuIiwKLQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBoYS0+ZmxhZ3MsIGhhLT5kcGNfZmxhZ3MpKQorCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICJzY3NpJWxkOiAlczogRFBDIGhhbmRsZXIgd2FraW5nIHVwLiBmbGFncyA9IDB4JTA4bHgsIGRwY19mbGFncyA9IDB4JTA4bHhcbiIsCisJCQkgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgaGEtPmZsYWdzLCBoYS0+ZHBjX2ZsYWdzKSk7CiAKIAkvKiBJbml0aWFsaXphdGlvbiBub3QgeWV0IGZpbmlzaGVkLiBEb24ndCBkbyBhbnl0aGluZyB5ZXQuICovCiAJaWYgKCF0ZXN0X2JpdChBRl9JTklUX0RPTkUsICZoYS0+ZmxhZ3MpKQpAQCAtODY4MSwxMSArODczOCw4IEBACiAJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIElOSVRfQURBUFRFUik7CiAKIAkvKiBEb250IHJldHJ5IGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gaWYgSVJRIGFsbG9jYXRpb24gZmFpbGVkICovCi0JaWYgKGlzX3FsYTgwWFgoaGEpICYmICF0ZXN0X2JpdChBRl9JUlFfQVRUQUNIRUQsICZoYS0+ZmxhZ3MpKSB7Ci0JCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBTa2lwcGluZyByZXRyeSBvZiBhZGFwdGVyIGluaXRpYWxpemF0aW9uXG4iLAotCQkJICAgX19mdW5jX18pOworCWlmIChpc19xbGE4MFhYKGhhKSAmJiAoc3RhdHVzID09IFFMQV9FUlJPUikpCiAJCWdvdG8gc2tpcF9yZXRyeV9pbml0OwotCX0KIAogCXdoaWxlICgoIXRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykpICYmCiAJICAgIGluaXRfcmV0cnlfY291bnQrKyA8IE1BWF9JTklUX1JFVFJJRVMpIHsKQEAgLTg3MDksNiArODc2MywxMCBAQAogCQkJY29udGludWU7CiAKIAkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIElOSVRfQURBUFRFUik7CisJCWlmIChpc19xbGE4MFhYKGhhKSAmJiAoc3RhdHVzID09IFFMQV9FUlJPUikpIHsKKwkJCWlmIChxbGE0Xzh4eHhfY2hlY2tfaW5pdF9hZGFwdGVyX3JldHJ5KGhhKSA9PSBRTEFfRVJST1IpCisJCQkJZ290byBza2lwX3JldHJ5X2luaXQ7CisJCX0KIAl9CiAKIHNraXBfcmV0cnlfaW5pdDoKQEAgLTg4NTcsMTAgKzg5MTUsNTYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZGVzdHJveV9kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpCit7CisJc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5ID0gTlVMTDsKKwlkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWE7CisJdW5zaWduZWQgbG9uZyB3dGltZTsKKwl1aW50MzJfdCBkZGJfc3RhdGU7CisJaW50IG9wdGlvbnM7CisJaW50IHN0YXR1czsKKworCW9wdGlvbnMgPSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT047CisJaWYgKHFsYTR4eHhfc2Vzc2lvbl9sb2dvdXRfZGRiKGhhLCBkZGJfZW50cnksIG9wdGlvbnMpID09IFFMQV9FUlJPUikgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBMb2dvdXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gY2xlYXJfZGRiOworCX0KKworCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAorCQkJCQkgICZmd19kZGJfZW50cnlfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2RkYl9lbnRyeSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCSAgICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJZ290byBjbGVhcl9kZGI7CisJfQorCisJd3RpbWUgPSBqaWZmaWVzICsgKEhaICogTE9HT1VUX1RPVik7CisJZG8geworCQlzdGF0dXMgPSBxbGE0eHh4X2dldF9md2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCisJCQkJCQkgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hLAorCQkJCQkJIE5VTEwsIE5VTEwsICZkZGJfc3RhdGUsIE5VTEwsCisJCQkJCQkgTlVMTCwgTlVMTCk7CisJCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKQorCQkJZ290byBmcmVlX2RkYjsKKworCQlpZiAoKGRkYl9zdGF0ZSA9PSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkUpIHx8CisJCSAgICAoZGRiX3N0YXRlID09IEREQl9EU19TRVNTSU9OX0ZBSUxFRCkpCisJCQlnb3RvIGZyZWVfZGRiOworCisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKEhaKTsKKwl9IHdoaWxlICgodGltZV9hZnRlcih3dGltZSwgamlmZmllcykpKTsKKworZnJlZV9kZGI6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKK2NsZWFyX2RkYjoKKwlxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworfQorCiBzdGF0aWMgdm9pZCBxbGE0eHh4X2Rlc3Ryb3lfZndfZGRiX3Nlc3Npb24oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKLQlpbnQgb3B0aW9uczsKIAlpbnQgaWR4OwogCiAJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfRERCX0VOVFJJRVM7IGlkeCsrKSB7CkBAIC04ODY5LDEzICs4OTczLDcgQEAKIAkJaWYgKChkZGJfZW50cnkgIT0gTlVMTCkgJiYKIAkJICAgIChkZGJfZW50cnktPmRkYl90eXBlID09IEZMQVNIX0REQikpIHsKIAotCQkJb3B0aW9ucyA9IExPR09VVF9PUFRJT05fQ0xPU0VfU0VTU0lPTjsKLQkJCWlmIChxbGE0eHh4X3Nlc3Npb25fbG9nb3V0X2RkYihoYSwgZGRiX2VudHJ5LCBvcHRpb25zKQotCQkJICAgID09IFFMQV9FUlJPUikKLQkJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBMb2dvdXQgZmFpbGVkXG4iLAotCQkJCQkgICBfX2Z1bmNfXyk7Ci0KLQkJCXFsYTR4eHhfY2xlYXJfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJCQlxbGE0eHh4X2Rlc3Ryb3lfZGRiKGhhLCBkZGJfZW50cnkpOwogCQkJLyoKIAkJCSAqIHdlIGhhdmUgZGVjcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZHJpdmVyCiAJCQkgKiB3aGVuIHdlIHNldHVwIHRoZSBzZXNzaW9uIHRvIGhhdmUgdGhlIGRyaXZlciB1bmxvYWQKQEAgLTkxMzYsMTQgKzkyMzQsMTUgQEAKIAlpbnQgcmV0ID0gU1VDQ0VTUzsKIAlpbnQgd2FpdCA9IDA7CiAKLQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJzY3NpJWxkOiVkOiVkOiBBYm9ydCBjb21tYW5kIGlzc3VlZCBjbWQ9JXBcbiIsCi0JICAgIGhhLT5ob3N0X25vLCBpZCwgbHVuLCBjbWQpOworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6JWQ6JWQ6IEFib3J0IGNvbW1hbmQgaXNzdWVkIGNtZD0lcCwgY2RiPTB4JXhcbiIsCisJCSAgIGhhLT5ob3N0X25vLCBpZCwgbHVuLCBjbWQsIGNtZC0+Y21uZFswXSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlzcmIgPSAoc3RydWN0IHNyYiAqKSBDTURfU1AoY21kKTsKIAlpZiAoIXNyYikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiVkOiVkOiBTcGVjaWZpZWQgY29tbWFuZCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQuXG4iLAorCQkJICAgaGEtPmhvc3Rfbm8sIGlkLCBsdW4pOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CiAJa3JlZl9nZXQoJnNyYi0+c3JiX3JlZik7CkBAIC05NTYwLDI4ICs5NjU5LDM2IEBACiAJfQogCiAJZm4gPSBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOwotCXdoaWxlIChmbiA+IDApIHsKLQkJZm4tLTsKLQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEZpbmRpbmcgUENJIGRldmljZSBhdCAiCi0JCSAgICAiZnVuYyAleFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmbik7Ci0JCS8qIEdldCB0aGUgcGNpIGRldmljZSBnaXZlbiB0aGUgZG9tYWluLCBidXMsCi0JCSAqIHNsb3QvZnVuY3Rpb24gbnVtYmVyICovCi0JCW90aGVyX3BkZXYgPQotCQkgICAgcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KHBjaV9kb21haW5fbnIoaGEtPnBkZXYtPmJ1cyksCi0JCSAgICBoYS0+cGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTihQQ0lfU0xPVChoYS0+cGRldi0+ZGV2Zm4pLAotCQkgICAgZm4pKTsKKwlpZiAoaXNfcWxhODAyMihoYSkpIHsKKwkJd2hpbGUgKGZuID4gMCkgeworCQkJZm4tLTsKKwkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBGaW5kaW5nIFBDSSBkZXZpY2UgYXQgZnVuYyAleFxuIiwKKwkJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZuKTsKKwkJCS8qIEdldCB0aGUgcGNpIGRldmljZSBnaXZlbiB0aGUgZG9tYWluLCBidXMsCisJCQkgKiBzbG90L2Z1bmN0aW9uIG51bWJlciAqLworCQkJb3RoZXJfcGRldiA9IHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdCgKKwkJCQkJICAgcGNpX2RvbWFpbl9ucihoYS0+cGRldi0+YnVzKSwKKwkJCQkJICAgaGEtPnBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCQkgICBQQ0lfREVWRk4oUENJX1NMT1QoaGEtPnBkZXYtPmRldmZuKSwKKwkJCQkJICAgZm4pKTsKIAotCQlpZiAoIW90aGVyX3BkZXYpCi0JCQljb250aW51ZTsKKwkJCWlmICghb3RoZXJfcGRldikKKwkJCQljb250aW51ZTsKIAotCQlpZiAoYXRvbWljX3JlYWQoJm90aGVyX3BkZXYtPmVuYWJsZV9jbnQpKSB7Ci0JCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogRm91bmQgUENJICIKLQkJCSAgICAiZnVuYyBpbiBlbmFibGVkIHN0YXRlJXhcbiIsIGhhLT5ob3N0X25vLAotCQkJICAgIF9fZnVuY19fLCBmbik7CisJCQlpZiAoYXRvbWljX3JlYWQoJm90aGVyX3BkZXYtPmVuYWJsZV9jbnQpKSB7CisJCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEZvdW5kIFBDSSBmdW5jIGluIGVuYWJsZWQgc3RhdGUleFxuIiwKKwkJCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmbik7CisJCQkJcGNpX2Rldl9wdXQob3RoZXJfcGRldik7CisJCQkJYnJlYWs7CisJCQl9CiAJCQlwY2lfZGV2X3B1dChvdGhlcl9wZGV2KTsKLQkJCWJyZWFrOwogCQl9Ci0JCXBjaV9kZXZfcHV0KG90aGVyX3BkZXYpOworCX0gZWxzZSB7CisJCS8qIHRoaXMgY2FzZSBpcyBtZWFudCBmb3IgSVNQODN4eC9JU1A4NHh4IG9ubHkgKi8KKwkJaWYgKHFsYTRfODN4eF9jYW5fcGVyZm9ybV9yZXNldChoYSkpIHsKKwkJCS8qIHJlc2V0IGZuIGFzIGlTQ1NJIGlzIGdvaW5nIHRvIHBlcmZvcm0gdGhlIHJlc2V0ICovCisJCQlmbiA9IDA7CisJCX0KIAl9CiAKIAkvKiBUaGUgZmlyc3QgZnVuY3Rpb24gb24gdGhlIGNhcmQsIHRoZSByZXNldCBvd25lciB3aWxsCkBAIC05NjE1LDYgKzk3MjIsNyBAQAogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEhXIFN0YXRlOiAiCiAJCQkgICAgIkZBSUxFRFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKKwkJCXFsYTR4eHhfZnJlZV9pcnFzKGhhKTsKIAkJCWhhLT5pc3Bfb3BzLT5pZGNfbG9jayhoYSk7CiAJCQlxbGE0Xzh4eHhfY2xlYXJfZHJ2X2FjdGl2ZShoYSk7CiAJCQlxbGE0Xzh4eHhfd3JfZGlyZWN0KGhhLCBRTEE4WFhYX0NSQl9ERVZfU1RBVEUsCkBAIC05NjQyLDYgKzk3NTAsOCBAQAogCQkJcnZhbCA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBSRVNFVF9BREFQVEVSKTsKIAkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQogCQkJCWhhLT5pc3Bfb3BzLT5lbmFibGVfaW50cnMoaGEpOworCQkJZWxzZQorCQkJCXFsYTR4eHhfZnJlZV9pcnFzKGhhKTsKIAogCQkJaGEtPmlzcF9vcHMtPmlkY19sb2NrKGhhKTsKIAkJCXFsYTRfOHh4eF9zZXRfZHJ2X2FjdGl2ZShoYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaAppbmRleCA5YjI5NDY2Li5jNmJhMGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKQEAgLTUsNCArNSw0IEBACiAgKiBTZWUgTElDRU5TRS5xbGE0eHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCiAKLSNkZWZpbmUgUUxBNFhYWF9EUklWRVJfVkVSU0lPTgkiNS4wNC4wMC1rMyIKKyNkZWZpbmUgUUxBNFhYWF9EUklWRVJfVkVSU0lPTgkiNS4wNC4wMC1rNCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IGQ4YWZlYzguLmM0ZDYzMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtMTYxLDQ3ICsxNjEsMjAgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAKIC8qKgotICogc2NzaV9wb29sX2FsbG9jX2NvbW1hbmQgLSBpbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgYSBmdWxseSBhbGxvY2F0ZWQgY29tbWFuZAotICogQHBvb2w6CXNsYWIgcG9vbCB0byBhbGxvY2F0ZSB0aGUgY29tbWFuZCBmcm9tCi0gKiBAZ2ZwX21hc2s6CW1hc2sgZm9yIHRoZSBhbGxvY2F0aW9uCi0gKgotICogUmV0dXJucyBhIGZ1bGx5IGFsbG9jYXRlZCBjb21tYW5kICh3aXRoIHRoZSBhbGxpZWQgc2Vuc2UgYnVmZmVyKSBvcgotICogTlVMTCBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9jbW5kICoKLXNjc2lfcG9vbF9hbGxvY19jb21tYW5kKHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wsIGdmcF90IGdmcF9tYXNrKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKLQotCWNtZCA9IGttZW1fY2FjaGVfemFsbG9jKHBvb2wtPmNtZF9zbGFiLCBnZnBfbWFzayB8IHBvb2wtPmdmcF9tYXNrKTsKLQlpZiAoIWNtZCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQljbWQtPnNlbnNlX2J1ZmZlciA9IGttZW1fY2FjaGVfYWxsb2MocG9vbC0+c2Vuc2Vfc2xhYiwKLQkJCQkJICAgICBnZnBfbWFzayB8IHBvb2wtPmdmcF9tYXNrKTsKLQlpZiAoIWNtZC0+c2Vuc2VfYnVmZmVyKSB7Ci0JCWttZW1fY2FjaGVfZnJlZShwb29sLT5jbWRfc2xhYiwgY21kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGNtZDsKLX0KLQotLyoqCi0gKiBzY3NpX3Bvb2xfZnJlZV9jb21tYW5kIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVsZWFzZSBhIGNvbW1hbmQKLSAqIEBwb29sOglzbGFiIHBvb2wgdG8gYWxsb2NhdGUgdGhlIGNvbW1hbmQgZnJvbQorICogc2NzaV9ob3N0X2ZyZWVfY29tbWFuZCAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbGVhc2UgYSBjb21tYW5kCisgKiBAc2hvc3Q6CWhvc3QgdG8gZnJlZSB0aGUgY29tbWFuZCBmb3IKICAqIEBjbWQ6CWNvbW1hbmQgdG8gcmVsZWFzZQogICoKICAqIHRoZSBjb21tYW5kIG11c3QgcHJldmlvdXNseSBoYXZlIGJlZW4gYWxsb2NhdGVkIGJ5Ci0gKiBzY3NpX3Bvb2xfYWxsb2NfY29tbWFuZC4KKyAqIHNjc2lfaG9zdF9hbGxvY19jb21tYW5kLgogICovCiBzdGF0aWMgdm9pZAotc2NzaV9wb29sX2ZyZWVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sLAotCQkJIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3Njc2lfaG9zdF9mcmVlX2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sID0gc2hvc3QtPmNtZF9wb29sOworCiAJaWYgKGNtZC0+cHJvdF9zZGIpCiAJCWttZW1fY2FjaGVfZnJlZShzY3NpX3NkYl9jYWNoZSwgY21kLT5wcm90X3NkYik7Ci0KIAlrbWVtX2NhY2hlX2ZyZWUocG9vbC0+c2Vuc2Vfc2xhYiwgY21kLT5zZW5zZV9idWZmZXIpOwogCWttZW1fY2FjaGVfZnJlZShwb29sLT5jbWRfc2xhYiwgY21kKTsKIH0KQEAgLTIxNywyMiArMTkwLDMyIEBACiBzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqCiBzY3NpX2hvc3RfYWxsb2NfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgZ2ZwX3QgZ2ZwX21hc2spCiB7CisJc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCA9IHNob3N0LT5jbWRfcG9vbDsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKLQljbWQgPSBzY3NpX3Bvb2xfYWxsb2NfY29tbWFuZChzaG9zdC0+Y21kX3Bvb2wsIGdmcF9tYXNrKTsKKwljbWQgPSBrbWVtX2NhY2hlX3phbGxvYyhwb29sLT5jbWRfc2xhYiwgZ2ZwX21hc2sgfCBwb29sLT5nZnBfbWFzayk7CiAJaWYgKCFjbWQpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGZhaWw7CisKKwljbWQtPnNlbnNlX2J1ZmZlciA9IGttZW1fY2FjaGVfYWxsb2MocG9vbC0+c2Vuc2Vfc2xhYiwKKwkJCQkJICAgICBnZnBfbWFzayB8IHBvb2wtPmdmcF9tYXNrKTsKKwlpZiAoIWNtZC0+c2Vuc2VfYnVmZmVyKQorCQlnb3RvIGZhaWxfZnJlZV9jbWQ7CiAKIAlpZiAoc2NzaV9ob3N0X2dldF9wcm90KHNob3N0KSA+PSBTSE9TVF9ESVhfVFlQRTBfUFJPVEVDVElPTikgewogCQljbWQtPnByb3Rfc2RiID0ga21lbV9jYWNoZV96YWxsb2Moc2NzaV9zZGJfY2FjaGUsIGdmcF9tYXNrKTsKLQotCQlpZiAoIWNtZC0+cHJvdF9zZGIpIHsKLQkJCXNjc2lfcG9vbF9mcmVlX2NvbW1hbmQoc2hvc3QtPmNtZF9wb29sLCBjbWQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKwkJaWYgKCFjbWQtPnByb3Rfc2RiKQorCQkJZ290byBmYWlsX2ZyZWVfc2Vuc2U7CiAJfQogCiAJcmV0dXJuIGNtZDsKKworZmFpbF9mcmVlX3NlbnNlOgorCWttZW1fY2FjaGVfZnJlZShwb29sLT5zZW5zZV9zbGFiLCBjbWQtPnNlbnNlX2J1ZmZlcik7CitmYWlsX2ZyZWVfY21kOgorCWttZW1fY2FjaGVfZnJlZShwb29sLT5jbWRfc2xhYiwgY21kKTsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpAQCAtMjg0LDI3ICsyNjcsMTkgQEAKICAqLwogc3RydWN0IHNjc2lfY21uZCAqc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0Jc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IF9fc2NzaV9nZXRfY29tbWFuZChkZXYtPmhvc3QsIGdmcF9tYXNrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogQmFpbCBpZiB3ZSBjYW4ndCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGRldmljZSAqLwotCWlmICghZ2V0X2RldmljZSgmZGV2LT5zZGV2X2dlbmRldikpCisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQljbWQgPSBfX3Njc2lfZ2V0X2NvbW1hbmQoZGV2LT5ob3N0LCBnZnBfbWFzayk7Ci0KLQlpZiAobGlrZWx5KGNtZCAhPSBOVUxMKSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCWNtZC0+ZGV2aWNlID0gZGV2OwotCQlJTklUX0xJU1RfSEVBRCgmY21kLT5saXN0KTsKLQkJSU5JVF9ERUxBWUVEX1dPUksoJmNtZC0+YWJvcnRfd29yaywgc2NtZF9laF9hYm9ydF9oYW5kbGVyKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bGlzdF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJmRldi0+Y21kX2xpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwotCQljbWQtPmppZmZpZXNfYXRfYWxsb2MgPSBqaWZmaWVzOwotCX0gZWxzZQotCQlwdXRfZGV2aWNlKCZkZXYtPnNkZXZfZ2VuZGV2KTsKLQorCWNtZC0+ZGV2aWNlID0gZGV2OworCUlOSVRfTElTVF9IRUFEKCZjbWQtPmxpc3QpOworCUlOSVRfREVMQVlFRF9XT1JLKCZjbWQtPmFib3J0X3dvcmssIHNjbWRfZWhfYWJvcnRfaGFuZGxlcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmY21kLT5saXN0LCAmZGV2LT5jbWRfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwljbWQtPmppZmZpZXNfYXRfYWxsb2MgPSBqaWZmaWVzOwogCXJldHVybiBjbWQ7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfZ2V0X2NvbW1hbmQpOwpAQCAtMzEzLDI1ICsyODgsMjIgQEAKICAqIF9fc2NzaV9wdXRfY29tbWFuZCAtIEZyZWUgYSBzdHJ1Y3Qgc2NzaV9jbW5kCiAgKiBAc2hvc3Q6IGRldi0+aG9zdAogICogQGNtZDogQ29tbWFuZCB0byBmcmVlCi0gKiBAZGV2OiBwYXJlbnQgc2NzaSBkZXZpY2UKICAqLwotdm9pZCBfX3Njc2lfcHV0X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCXN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgX19zY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIGNoYW5naW5nIGxvY2tzIGhlcmUsIGRvbid0IG5lZWQgdG8gcmVzdG9yZSB0aGUgaXJxIHN0YXRlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOwogCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZzaG9zdC0+ZnJlZV9saXN0KSkpIHsKLQkJbGlzdF9hZGQoJmNtZC0+bGlzdCwgJnNob3N0LT5mcmVlX2xpc3QpOwotCQljbWQgPSBOVUxMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrLCBmbGFncyk7CisJCWlmIChsaXN0X2VtcHR5KCZzaG9zdC0+ZnJlZV9saXN0KSkgeworCQkJbGlzdF9hZGQoJmNtZC0+bGlzdCwgJnNob3N0LT5mcmVlX2xpc3QpOworCQkJY21kID0gTlVMTDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAobGlrZWx5KGNtZCAhPSBOVUxMKSkKLQkJc2NzaV9wb29sX2ZyZWVfY29tbWFuZChzaG9zdC0+Y21kX3Bvb2wsIGNtZCk7Ci0KLQlwdXRfZGV2aWNlKGRldik7CisJCXNjc2lfaG9zdF9mcmVlX2NvbW1hbmQoc2hvc3QsIGNtZCk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fc2NzaV9wdXRfY29tbWFuZCk7CiAKQEAgLTM0NSw3ICszMTcsNiBAQAogICovCiB2b2lkIHNjc2lfcHV0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBzZXJpb3VzIGVycm9yIGlmIHRoZSBjb21tYW5kIGhhc24ndCBjb21lIGZyb20gYSBkZXZpY2UgbGlzdCAqLwpAQCAtMzU2LDUwICszMjcsMTA3IEBACiAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZjbWQtPmFib3J0X3dvcmspOwogCi0JX19zY3NpX3B1dF9jb21tYW5kKGNtZC0+ZGV2aWNlLT5ob3N0LCBjbWQsICZzZGV2LT5zZGV2X2dlbmRldik7CisJX19zY3NpX3B1dF9jb21tYW5kKGNtZC0+ZGV2aWNlLT5ob3N0LCBjbWQpOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3B1dF9jb21tYW5kKTsKIAotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnNjc2lfZ2V0X2hvc3RfY21kX3Bvb2woZ2ZwX3QgZ2ZwX21hc2spCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqCitzY3NpX2ZpbmRfaG9zdF9jbWRfcG9vbChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKKwlpZiAoc2hvc3QtPmhvc3R0LT5jbWRfc2l6ZSkKKwkJcmV0dXJuIHNob3N0LT5ob3N0dC0+Y21kX3Bvb2w7CisJaWYgKHNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkKKwkJcmV0dXJuICZzY3NpX2NtZF9kbWFfcG9vbDsKKwlyZXR1cm4gJnNjc2lfY21kX3Bvb2w7Cit9CisKK3N0YXRpYyB2b2lkCitzY3NpX2ZyZWVfaG9zdF9jbWRfcG9vbChzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sKQoreworCWtmcmVlKHBvb2wtPnNlbnNlX25hbWUpOworCWtmcmVlKHBvb2wtPmNtZF9uYW1lKTsKKwlrZnJlZShwb29sKTsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKgorc2NzaV9hbGxvY19ob3N0X2NtZF9wb29sKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKmhvc3R0ID0gc2hvc3QtPmhvc3R0OworCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2w7CisKKwlwb29sID0ga3phbGxvYyhzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wpCisJCXJldHVybiBOVUxMOworCisJcG9vbC0+Y21kX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzX2NtZCIsIGhvc3R0LT5uYW1lKTsKKwlwb29sLT5zZW5zZV9uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc19zZW5zZSIsIGhvc3R0LT5uYW1lKTsKKwlpZiAoIXBvb2wtPmNtZF9uYW1lIHx8ICFwb29sLT5zZW5zZV9uYW1lKSB7CisJCXNjc2lfZnJlZV9ob3N0X2NtZF9wb29sKHBvb2wpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwb29sLT5zbGFiX2ZsYWdzID0gU0xBQl9IV0NBQ0hFX0FMSUdOOworCWlmIChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpIHsKKwkJcG9vbC0+c2xhYl9mbGFncyB8PSBTTEFCX0NBQ0hFX0RNQTsKKwkJcG9vbC0+Z2ZwX21hc2sgPSBfX0dGUF9ETUE7CisJfQorCXJldHVybiBwb29sOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqCitzY3NpX2dldF9ob3N0X2NtZF9wb29sKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKmhvc3R0ID0gc2hvc3QtPmhvc3R0OwogCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnJldHZhbCA9IE5VTEwsICpwb29sOworCXNpemVfdCBjbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSArIGhvc3R0LT5jbWRfc2l6ZTsKKwogCS8qCiAJICogU2VsZWN0IGEgY29tbWFuZCBzbGFiIGZvciB0aGlzIGhvc3QgYW5kIGNyZWF0ZSBpdCBpZiBub3QKIAkgKiB5ZXQgZXhpc3RlbnQuCiAJICovCiAJbXV0ZXhfbG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7Ci0JcG9vbCA9IChnZnBfbWFzayAmIF9fR0ZQX0RNQSkgPyAmc2NzaV9jbWRfZG1hX3Bvb2wgOgotCQkmc2NzaV9jbWRfcG9vbDsKKwlwb29sID0gc2NzaV9maW5kX2hvc3RfY21kX3Bvb2woc2hvc3QpOworCWlmICghcG9vbCkgeworCQlwb29sID0gc2NzaV9hbGxvY19ob3N0X2NtZF9wb29sKHNob3N0KTsKKwkJaWYgKCFwb29sKQorCQkJZ290byBvdXQ7CisJfQorCiAJaWYgKCFwb29sLT51c2VycykgewotCQlwb29sLT5jbWRfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKHBvb2wtPmNtZF9uYW1lLAotCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzY3NpX2NtbmQpLCAwLAorCQlwb29sLT5jbWRfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKHBvb2wtPmNtZF9uYW1lLCBjbWRfc2l6ZSwgMCwKIAkJCQkJCSAgIHBvb2wtPnNsYWJfZmxhZ3MsIE5VTEwpOwogCQlpZiAoIXBvb2wtPmNtZF9zbGFiKQotCQkJZ290byBmYWlsOworCQkJZ290byBvdXRfZnJlZV9wb29sOwogCiAJCXBvb2wtPnNlbnNlX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShwb29sLT5zZW5zZV9uYW1lLAogCQkJCQkJICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIDAsCiAJCQkJCQkgICAgIHBvb2wtPnNsYWJfZmxhZ3MsIE5VTEwpOwotCQlpZiAoIXBvb2wtPnNlbnNlX3NsYWIpIHsKLQkJCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5jbWRfc2xhYik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KKwkJaWYgKCFwb29sLT5zZW5zZV9zbGFiKQorCQkJZ290byBvdXRfZnJlZV9zbGFiOwogCX0KIAogCXBvb2wtPnVzZXJzKys7CiAJcmV0dmFsID0gcG9vbDsKLSBmYWlsOgorb3V0OgogCW11dGV4X3VubG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKKworb3V0X2ZyZWVfc2xhYjoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocG9vbC0+Y21kX3NsYWIpOworb3V0X2ZyZWVfcG9vbDoKKwlpZiAoaG9zdHQtPmNtZF9zaXplKQorCQlzY3NpX2ZyZWVfaG9zdF9jbWRfcG9vbChwb29sKTsKKwlnb3RvIG91dDsKIH0KIAotc3RhdGljIHZvaWQgc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChnZnBfdCBnZnBfbWFzaykKK3N0YXRpYyB2b2lkIHNjc2lfcHV0X2hvc3RfY21kX3Bvb2woc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqaG9zdHQgPSBzaG9zdC0+aG9zdHQ7CiAJc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbDsKIAogCW11dGV4X2xvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwotCXBvb2wgPSAoZ2ZwX21hc2sgJiBfX0dGUF9ETUEpID8gJnNjc2lfY21kX2RtYV9wb29sIDoKLQkJJnNjc2lfY21kX3Bvb2w7CisJcG9vbCA9IHNjc2lfZmluZF9ob3N0X2NtZF9wb29sKHNob3N0KTsKKwogCS8qCiAJICogVGhpcyBtYXkgaGFwcGVuIGlmIGEgZHJpdmVyIGhhcyBhIG1pc21hdGNoZWQgZ2V0IGFuZCBwdXQKIAkgKiBvZiB0aGUgY29tbWFuZCBwb29sOyB0aGUgZHJpdmVyIHNob3VsZCBiZSBpbXBsaWNhdGVkIGluCkBAIC00MTAsNjcgKzQzOCwxMyBAQAogCWlmICghLS1wb29sLT51c2VycykgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocG9vbC0+Y21kX3NsYWIpOwogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocG9vbC0+c2Vuc2Vfc2xhYik7CisJCWlmIChob3N0dC0+Y21kX3NpemUpCisJCQlzY3NpX2ZyZWVfaG9zdF9jbWRfcG9vbChwb29sKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZob3N0X2NtZF9wb29sX211dGV4KTsKIH0KIAogLyoqCi0gKiBzY3NpX2FsbG9jYXRlX2NvbW1hbmQgLSBnZXQgYSBmdWxseSBhbGxvY2F0ZWQgU0NTSSBjb21tYW5kCi0gKiBAZ2ZwX21hc2s6CWFsbG9jYXRpb24gbWFzawotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHVzZSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaG9zdCBiYXNlZCBwb29scy4KLSAqIEl0IGFsbG9jYXRlcyB0aGUgcmVsZXZhbnQgY29tbWFuZCBhbmQgdGFrZXMgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UKLSAqIG9uIHRoZSBwb29sIGl0IHVzZWQuICBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBwYWlyZWQgd2l0aAotICogc2NzaV9mcmVlX2NvbW1hbmQgd2hpY2ggYWxzbyBoYXMgdGhlIGlkZW50aWNhbCBtYXNrLCBvdGhlcndpc2UgdGhlCi0gKiBmcmVlIHBvb2wgY291bnRzIHdpbGwgZXZlbnR1YWxseSBnbyB3cm9uZyBhbmQgeW91J2xsIHRyaWdnZXIgYSBidWcuCi0gKgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgKm9ubHkqIGJlIHVzZWQgYnkgZHJpdmVycyB0aGF0IG5lZWQgYSBzdGF0aWMKLSAqIGNvbW1hbmQgYWxsb2NhdGlvbiBhdCBzdGFydCBvZiBkYXkgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KLSAqLwotc3RydWN0IHNjc2lfY21uZCAqc2NzaV9hbGxvY2F0ZV9jb21tYW5kKGdmcF90IGdmcF9tYXNrKQotewotCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wgPSBzY3NpX2dldF9ob3N0X2NtZF9wb29sKGdmcF9tYXNrKTsKLQotCWlmICghcG9vbCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gc2NzaV9wb29sX2FsbG9jX2NvbW1hbmQocG9vbCwgZ2ZwX21hc2spOwotfQotRVhQT1JUX1NZTUJPTChzY3NpX2FsbG9jYXRlX2NvbW1hbmQpOwotCi0vKioKLSAqIHNjc2lfZnJlZV9jb21tYW5kIC0gZnJlZSBhIGNvbW1hbmQgYWxsb2NhdGVkIGJ5IHNjc2lfYWxsb2NhdGVfY29tbWFuZAotICogQGdmcF9tYXNrOgltYXNrIHVzZWQgaW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24KLSAqIEBjbWQ6CWNvbW1hbmQgdG8gZnJlZQotICoKLSAqIE5vdGU6IHVzaW5nIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIG1hc2sgaXMgdml0YWwgYmVjYXVzZSB0aGF0J3MKLSAqIHdoYXQgZGV0ZXJtaW5lcyB3aGljaCBjb21tYW5kIHBvb2wgd2UgdXNlIHRvIGZyZWUgdGhlIGNvbW1hbmQuICBBbnkKLSAqIG1pc21hdGNoIHdpbGwgY2F1c2UgdGhlIHN5c3RlbSB0byBCVUcgZXZlbnR1YWxseS4KLSAqLwotdm9pZCBzY3NpX2ZyZWVfY29tbWFuZChnZnBfdCBnZnBfbWFzaywgc3RydWN0IHNjc2lfY21uZCAqY21kKQotewotCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wgPSBzY3NpX2dldF9ob3N0X2NtZF9wb29sKGdmcF9tYXNrKTsKLQotCS8qCi0JICogdGhpcyBjb3VsZCB0cmlnZ2VyIGlmIHRoZSBtYXNrIHRvIHNjc2lfYWxsb2NhdGVfY29tbWFuZAotCSAqIGRvZXNuJ3QgbWF0Y2ggdGhpcyBtYXNrLiAgT3RoZXJ3aXNlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB0aGlzCi0JICogc3VjY2VlZHMgYmVjYXVzZSBzY3NpX2FsbG9jYXRlX2NvbW1hbmQgbXVzdCBoYXZlIHRha2VuIGEgcmVmZXJlbmNlCi0JICogb24gdGhlIHBvb2wKLQkgKi8KLQlCVUdfT04oIXBvb2wpOwotCi0Jc2NzaV9wb29sX2ZyZWVfY29tbWFuZChwb29sLCBjbWQpOwotCS8qCi0JICogc2NzaV9wdXRfaG9zdF9jbWRfcG9vbCBpcyBjYWxsZWQgdHdpY2U7IG9uY2UgdG8gcmVsZWFzZSB0aGUKLQkgKiByZWZlcmVuY2Ugd2UgdG9vayBhYm92ZSwgYW5kIG9uY2UgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlCi0JICogb3JpZ2luYWxseSB0YWtlbiBieSBzY3NpX2FsbG9jYXRlX2NvbW1hbmQKLQkgKi8KLQlzY3NpX3B1dF9ob3N0X2NtZF9wb29sKGdmcF9tYXNrKTsKLQlzY3NpX3B1dF9ob3N0X2NtZF9wb29sKGdmcF9tYXNrKTsKLX0KLUVYUE9SVF9TWU1CT0woc2NzaV9mcmVlX2NvbW1hbmQpOwotCi0vKioKICAqIHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdCAtIFNldHVwIHRoZSBjb21tYW5kIGZyZWVsaXN0IGZvciBhIHNjc2kgaG9zdC4KICAqIEBzaG9zdDogaG9zdCB0byBhbGxvY2F0ZSB0aGUgZnJlZWxpc3QgZm9yLgogICoKQEAgLTQ4MiwxNCArNDU2LDEzIEBACiAgKi8KIGludCBzY3NpX3NldHVwX2NvbW1hbmRfZnJlZWxpc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc3RydWN0IHNjc2lfY21uZCAqY21kOwogCWNvbnN0IGdmcF90IGdmcF9tYXNrID0gc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID8gR0ZQX0RNQSA6IEdGUF9LRVJORUw7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNob3N0LT5mcmVlX2xpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5mcmVlX2xpc3QpOwogCi0Jc2hvc3QtPmNtZF9wb29sID0gc2NzaV9nZXRfaG9zdF9jbWRfcG9vbChnZnBfbWFzayk7Ci0KKwlzaG9zdC0+Y21kX3Bvb2wgPSBzY3NpX2dldF9ob3N0X2NtZF9wb29sKHNob3N0KTsKIAlpZiAoIXNob3N0LT5jbWRfcG9vbCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTQ5OCw3ICs0NzEsNyBAQAogCSAqLwogCWNtZCA9IHNjc2lfaG9zdF9hbGxvY19jb21tYW5kKHNob3N0LCBnZnBfbWFzayk7CiAJaWYgKCFjbWQpIHsKLQkJc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChnZnBfbWFzayk7CisJCXNjc2lfcHV0X2hvc3RfY21kX3Bvb2woc2hvc3QpOwogCQlzaG9zdC0+Y21kX3Bvb2wgPSBOVUxMOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC01MjQsMTAgKzQ5NywxMCBAQAogCiAJCWNtZCA9IGxpc3RfZW50cnkoc2hvc3QtPmZyZWVfbGlzdC5uZXh0LCBzdHJ1Y3Qgc2NzaV9jbW5kLCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmY21kLT5saXN0KTsKLQkJc2NzaV9wb29sX2ZyZWVfY29tbWFuZChzaG9zdC0+Y21kX3Bvb2wsIGNtZCk7CisJCXNjc2lfaG9zdF9mcmVlX2NvbW1hbmQoc2hvc3QsIGNtZCk7CiAJfQogCXNob3N0LT5jbWRfcG9vbCA9IE5VTEw7Ci0Jc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyBHRlBfRE1BIDogR0ZQX0tFUk5FTCk7CisJc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChzaG9zdCk7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCkBAIC05NTQsNyArOTI3LDcgQEAKICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uLiAgWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlCiAgKiBzY3NpX2dldF92cGRfcGFnZSBpbnN0ZWFkLgogICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyLgorICogUmV0dXJucyBzaXplIG9mIHRoZSB2cGQgcGFnZSBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyLgogICovCiBzdGF0aWMgaW50IHNjc2lfdnBkX2lucXVpcnkoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCiAJCQkJCQkJdTggcGFnZSwgdW5zaWduZWQgbGVuKQpAQCAtOTYyLDYgKzkzNSw5IEBACiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBjaGFyIGNtZFsxNl07CiAKKwlpZiAobGVuIDwgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAljbWRbMF0gPSBJTlFVSVJZOwogCWNtZFsxXSA9IDE7CQkvKiBFVlBEICovCiAJY21kWzJdID0gcGFnZTsKQEAgLTk3NiwxMyArOTUyLDEzIEBACiAJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBjbWQsIERNQV9GUk9NX0RFVklDRSwgYnVmZmVyLAogCQkJCSAgbGVuLCBOVUxMLCAzMCAqIEhaLCAzLCBOVUxMKTsKIAlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gLUVJTzsKIAogCS8qIFNhbml0eSBjaGVjayB0aGF0IHdlIGdvdCB0aGUgcGFnZSBiYWNrIHRoYXQgd2UgYXNrZWQgZm9yICovCiAJaWYgKGJ1ZmZlclsxXSAhPSBwYWdlKQogCQlyZXR1cm4gLUVJTzsKIAotCXJldHVybiAwOworCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYoJmJ1ZmZlclsyXSkgKyA0OwogfQogCiAvKioKQEAgLTEwMDksMTggKzk4NSwxOCBAQAogCiAJLyogQXNrIGZvciBhbGwgdGhlIHBhZ2VzIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZSAqLwogCXJlc3VsdCA9IHNjc2lfdnBkX2lucXVpcnkoc2RldiwgYnVmLCAwLCBidWZfbGVuKTsKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQgPCA0KQogCQlnb3RvIGZhaWw7CiAKIAkvKiBJZiB0aGUgdXNlciBhY3R1YWxseSB3YW50ZWQgdGhpcyBwYWdlLCB3ZSBjYW4gc2tpcCB0aGUgcmVzdCAqLwogCWlmIChwYWdlID09IDApCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IG1pbigoaW50KWJ1ZlszXSwgYnVmX2xlbiAtIDQpOyBpKyspCi0JCWlmIChidWZbaSArIDRdID09IHBhZ2UpCisJZm9yIChpID0gNDsgaSA8IG1pbihyZXN1bHQsIGJ1Zl9sZW4pOyBpKyspCisJCWlmIChidWZbaV0gPT0gcGFnZSkKIAkJCWdvdG8gZm91bmQ7CiAKLQlpZiAoaSA8IGJ1ZlszXSAmJiBpID49IGJ1Zl9sZW4gLSA0KQorCWlmIChpIDwgcmVzdWx0ICYmIGkgPj0gYnVmX2xlbikKIAkJLyogcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGdpdmUgdXMgYmVuZWZpdCBvZiBkb3VidCAqLwogCQlnb3RvIGZvdW5kOwogCS8qIFRoZSBkZXZpY2UgY2xhaW1zIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHBhZ2UgKi8KQEAgLTEwMjgsNyArMTAwNCw3IEBACiAKICBmb3VuZDoKIAlyZXN1bHQgPSBzY3NpX3ZwZF9pbnF1aXJ5KHNkZXYsIGJ1ZiwgcGFnZSwgYnVmX2xlbik7Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBmYWlsOwogCiAJcmV0dXJuIDA7CkBAIC0xMDM5LDYgKzEwMTUsOTMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfZ2V0X3ZwZF9wYWdlKTsKIAogLyoqCisgKiBzY3NpX2F0dGFjaF92cGQgLSBBdHRhY2ggVml0YWwgUHJvZHVjdCBEYXRhIHRvIGEgU0NTSSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAc2RldjogVGhlIGRldmljZSB0byBhc2sKKyAqCisgKiBBdHRhY2ggdGhlICdEZXZpY2UgSWRlbnRpZmljYXRpb24nIFZQRCBwYWdlICgweDgzKSBhbmQgdGhlCisgKiAnVW5pdCBTZXJpYWwgTnVtYmVyJyBWUEQgcGFnZSAoMHg4MCkgdG8gYSBTQ1NJIGRldmljZQorICogc3RydWN0dXJlLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UKKyAqIHVuaXF1ZWx5LgorICovCit2b2lkIHNjc2lfYXR0YWNoX3ZwZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaW50IHJlc3VsdCwgaTsKKwlpbnQgdnBkX2xlbiA9IFNDU0lfVlBEX1BHX0xFTjsKKwlpbnQgcGc4MF9zdXBwb3J0ZWQgPSAwOworCWludCBwZzgzX3N1cHBvcnRlZCA9IDA7CisJdW5zaWduZWQgY2hhciAqdnBkX2J1ZjsKKworCWlmIChzZGV2LT5za2lwX3ZwZF9wYWdlcykKKwkJcmV0dXJuOworcmV0cnlfcGcwOgorCXZwZF9idWYgPSBrbWFsbG9jKHZwZF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghdnBkX2J1ZikKKwkJcmV0dXJuOworCisJLyogQXNrIGZvciBhbGwgdGhlIHBhZ2VzIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZSAqLworCXJlc3VsdCA9IHNjc2lfdnBkX2lucXVpcnkoc2RldiwgdnBkX2J1ZiwgMCwgdnBkX2xlbik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJa2ZyZWUodnBkX2J1Zik7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3VsdCA+IHZwZF9sZW4pIHsKKwkJdnBkX2xlbiA9IHJlc3VsdDsKKwkJa2ZyZWUodnBkX2J1Zik7CisJCWdvdG8gcmV0cnlfcGcwOworCX0KKworCWZvciAoaSA9IDQ7IGkgPCByZXN1bHQ7IGkrKykgeworCQlpZiAodnBkX2J1ZltpXSA9PSAweDgwKQorCQkJcGc4MF9zdXBwb3J0ZWQgPSAxOworCQlpZiAodnBkX2J1ZltpXSA9PSAweDgzKQorCQkJcGc4M19zdXBwb3J0ZWQgPSAxOworCX0KKwlrZnJlZSh2cGRfYnVmKTsKKwl2cGRfbGVuID0gU0NTSV9WUERfUEdfTEVOOworCisJaWYgKHBnODBfc3VwcG9ydGVkKSB7CityZXRyeV9wZzgwOgorCQl2cGRfYnVmID0ga21hbGxvYyh2cGRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2cGRfYnVmKQorCQkJcmV0dXJuOworCisJCXJlc3VsdCA9IHNjc2lfdnBkX2lucXVpcnkoc2RldiwgdnBkX2J1ZiwgMHg4MCwgdnBkX2xlbik7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlrZnJlZSh2cGRfYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocmVzdWx0ID4gdnBkX2xlbikgeworCQkJdnBkX2xlbiA9IHJlc3VsdDsKKwkJCWtmcmVlKHZwZF9idWYpOworCQkJZ290byByZXRyeV9wZzgwOworCQl9CisJCXNkZXYtPnZwZF9wZzgwX2xlbiA9IHJlc3VsdDsKKwkJc2Rldi0+dnBkX3BnODAgPSB2cGRfYnVmOworCQl2cGRfbGVuID0gU0NTSV9WUERfUEdfTEVOOworCX0KKworCWlmIChwZzgzX3N1cHBvcnRlZCkgeworcmV0cnlfcGc4MzoKKwkJdnBkX2J1ZiA9IGttYWxsb2ModnBkX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdnBkX2J1ZikKKwkJCXJldHVybjsKKworCQlyZXN1bHQgPSBzY3NpX3ZwZF9pbnF1aXJ5KHNkZXYsIHZwZF9idWYsIDB4ODMsIHZwZF9sZW4pOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJa2ZyZWUodnBkX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHJlc3VsdCA+IHZwZF9sZW4pIHsKKwkJCXZwZF9sZW4gPSByZXN1bHQ7CisJCQlrZnJlZSh2cGRfYnVmKTsKKwkJCWdvdG8gcmV0cnlfcGc4MzsKKwkJfQorCQlzZGV2LT52cGRfcGc4M19sZW4gPSByZXN1bHQ7CisJCXNkZXYtPnZwZF9wZzgzID0gdnBkX2J1ZjsKKwl9Cit9CisKKy8qKgogICogc2NzaV9yZXBvcnRfb3Bjb2RlIC0gRmluZCBvdXQgaWYgYSBnaXZlbiBjb21tYW5kIG9wY29kZSBpcyBzdXBwb3J0ZWQKICAqIEBzZGV2OglzY3NpIGRldmljZSB0byBxdWVyeQogICogQGJ1ZmZlcjoJc2NyYXRjaCBidWZmZXIgKG11c3QgYmUgYXQgbGVhc3QgMjAgYnl0ZXMgbG9uZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IDJkZWNjNjQuLmYzZTljYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtNjQsNiArNjQsNyBAQAogLyogQWRkaXRpb25hbCBTZW5zZSBDb2RlIChBU0MpICovCiAjZGVmaW5lIE5PX0FERElUSU9OQUxfU0VOU0UgMHgwCiAjZGVmaW5lIExPR0lDQUxfVU5JVF9OT1RfUkVBRFkgMHg0CisjZGVmaW5lIExPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkUgMHg4CiAjZGVmaW5lIFVOUkVDT1ZFUkVEX1JFQURfRVJSIDB4MTEKICNkZWZpbmUgUEFSQU1FVEVSX0xJU1RfTEVOR1RIX0VSUiAweDFhCiAjZGVmaW5lIElOVkFMSURfT1BDT0RFIDB4MjAKQEAgLTE5NSw2ICsxOTYsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzY3NpX2RlYnVnX3VubWFwX21heF9kZXNjID0gREVGX1VOTUFQX01BWF9ERVNDOwogc3RhdGljIHVuc2lnbmVkIGludCBzY3NpX2RlYnVnX3dyaXRlX3NhbWVfbGVuZ3RoID0gREVGX1dSSVRFU0FNRV9MRU5HVEg7CiBzdGF0aWMgYm9vbCBzY3NpX2RlYnVnX3JlbW92YWJsZSA9IERFRl9SRU1PVkFCTEU7CitzdGF0aWMgYm9vbCBzY3NpX2RlYnVnX2NsdXN0ZXJpbmc7CiAKIHN0YXRpYyBpbnQgc2NzaV9kZWJ1Z19jbW5kX2NvdW50ID0gMDsKIApAQCAtMTc4MCw3ICsxNzgyLDYgQEAKIAkgICAgYmUzMl90b19jcHUoc2R0LT5yZWZfdGFnKSAhPSBlaV9sYmEpIHsKIAkJcHJfZXJyKCIlczogUkVGIGNoZWNrIGZhaWxlZCBvbiBzZWN0b3IgJWx1XG4iLAogCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nKXNlY3Rvcik7Ci0JCQlkaWZfZXJyb3JzKys7CiAJCXJldHVybiAweDAzOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE3ODksMjMgKzE3OTAsMjcgQEAKIHN0YXRpYyB2b2lkIGRpZl9jb3B5X3Byb3Qoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHNlY3Rvcl90IHNlY3RvciwKIAkJCSAgdW5zaWduZWQgaW50IHNlY3RvcnMsIGJvb2wgcmVhZCkKIHsKLQl1bnNpZ25lZCBpbnQgaSwgcmVzaWQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpwc2dsOworCXNpemVfdCByZXNpZDsKIAl2b2lkICpwYWRkcjsKIAljb25zdCB2b2lkICpkaWZfc3RvcmVfZW5kID0gZGlmX3N0b3JlcCArIHNkZWJ1Z19zdG9yZV9zZWN0b3JzOworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgbWl0ZXI7CiAKIAkvKiBCeXRlcyBvZiBwcm90ZWN0aW9uIGRhdGEgdG8gY29weSBpbnRvIHNnbCAqLwogCXJlc2lkID0gc2VjdG9ycyAqIHNpemVvZigqZGlmX3N0b3JlcCk7CiAKLQlzY3NpX2Zvcl9lYWNoX3Byb3Rfc2coU0NwbnQsIHBzZ2wsIHNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCksIGkpIHsKLQkJaW50IGxlbiA9IG1pbihwc2dsLT5sZW5ndGgsIHJlc2lkKTsKKwlzZ19taXRlcl9zdGFydCgmbWl0ZXIsIHNjc2lfcHJvdF9zZ2xpc3QoU0NwbnQpLAorCQkJc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSwgU0dfTUlURVJfQVRPTUlDIHwKKwkJCShyZWFkID8gU0dfTUlURVJfVE9fU0cgOiBTR19NSVRFUl9GUk9NX1NHKSk7CisKKwl3aGlsZSAoc2dfbWl0ZXJfbmV4dCgmbWl0ZXIpICYmIHJlc2lkID4gMCkgeworCQlzaXplX3QgbGVuID0gbWluKG1pdGVyLmxlbmd0aCwgcmVzaWQpOwogCQl2b2lkICpzdGFydCA9IGRpZl9zdG9yZShzZWN0b3IpOwotCQlpbnQgcmVzdCA9IDA7CisJCXNpemVfdCByZXN0ID0gMDsKIAogCQlpZiAoZGlmX3N0b3JlX2VuZCA8IHN0YXJ0ICsgbGVuKQogCQkJcmVzdCA9IHN0YXJ0ICsgbGVuIC0gZGlmX3N0b3JlX2VuZDsKIAotCQlwYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UocHNnbCkpICsgcHNnbC0+b2Zmc2V0OworCQlwYWRkciA9IG1pdGVyLmFkZHI7CiAKIAkJaWYgKHJlYWQpCiAJCQltZW1jcHkocGFkZHIsIHN0YXJ0LCBsZW4gLSByZXN0KTsKQEAgLTE4MjEsOCArMTgyNiw4IEBACiAKIAkJc2VjdG9yICs9IGxlbiAvIHNpemVvZigqZGlmX3N0b3JlcCk7CiAJCXJlc2lkIC09IGxlbjsKLQkJa3VubWFwX2F0b21pYyhwYWRkcik7CiAJfQorCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKIH0KIAogc3RhdGljIGludCBwcm90X3ZlcmlmeV9yZWFkKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBzZWN0b3JfdCBzdGFydF9zZWMsCkBAIC0xODMyLDcgKzE4MzcsNyBAQAogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdDsKIAlzZWN0b3JfdCBzZWN0b3I7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2VjdG9yczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNlY3RvcnM7IGkrKywgZWlfbGJhKyspIHsKIAkJaW50IHJldDsKIAogCQlzZWN0b3IgPSBzdGFydF9zZWMgKyBpOwpAQCAtMTg0Niw4ICsxODUxLDYgQEAKIAkJCWRpZl9lcnJvcnMrKzsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQotCQllaV9sYmErKzsKIAl9CiAKIAlkaWZfY29weV9wcm90KFNDcG50LCBzdGFydF9zZWMsIHNlY3RvcnMsIHRydWUpOwpAQCAtMTg4NiwxNyArMTg4OSwxOSBAQAogCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKIAl9CiAKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCiAJLyogRElYICsgVDEwIERJRiAqLwogCWlmIChzY3NpX2RlYnVnX2RpeCAmJiBzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpKSB7CiAJCWludCBwcm90X3JldCA9IHByb3RfdmVyaWZ5X3JlYWQoU0NwbnQsIGxiYSwgbnVtLCBlaV9sYmEpOwogCiAJCWlmIChwcm90X3JldCkgeworCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOwogCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBBQk9SVEVEX0NPTU1BTkQsIDB4MTAsIHByb3RfcmV0KTsKIAkJCXJldHVybiBpbGxlZ2FsX2NvbmRpdGlvbl9yZXN1bHQ7CiAJCX0KIAl9CiAKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmYXRvbWljX3J3LCBpZmxhZ3MpOwogCXJldCA9IGRvX2RldmljZV9hY2Nlc3MoU0NwbnQsIGRldmlwLCBsYmEsIG51bSwgMCk7CiAJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOwogCWlmIChyZXQgPT0gLTEpCkBAIC0xOTMxLDU1ICsxOTM2LDYyIEBACiBzdGF0aWMgaW50IHByb3RfdmVyaWZ5X3dyaXRlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBzZWN0b3JfdCBzdGFydF9zZWMsCiAJCQkgICAgIHVuc2lnbmVkIGludCBzZWN0b3JzLCB1MzIgZWlfbGJhKQogewotCWludCBpLCBqLCByZXQ7CisJaW50IHJldDsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpkc2dsOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqcHNnbCA9IHNjc2lfcHJvdF9zZ2xpc3QoU0NwbnQpOwotCXZvaWQgKmRhZGRyLCAqcGFkZHI7CisJdm9pZCAqZGFkZHI7CiAJc2VjdG9yX3Qgc2VjdG9yID0gc3RhcnRfc2VjOwogCWludCBwcGFnZV9vZmZzZXQ7CisJaW50IGRwYWdlX29mZnNldDsKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyIGRpdGVyOworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgcGl0ZXI7CiAKIAlCVUdfT04oc2NzaV9zZ19jb3VudChTQ3BudCkgPT0gMCk7CiAJQlVHX09OKHNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCkgPT0gMCk7CiAKLQlwcGFnZV9vZmZzZXQgPSAwOworCXNnX21pdGVyX3N0YXJ0KCZwaXRlciwgc2NzaV9wcm90X3NnbGlzdChTQ3BudCksCisJCQlzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpLAorCQkJU0dfTUlURVJfQVRPTUlDIHwgU0dfTUlURVJfRlJPTV9TRyk7CisJc2dfbWl0ZXJfc3RhcnQoJmRpdGVyLCBzY3NpX3NnbGlzdChTQ3BudCksIHNjc2lfc2dfY291bnQoU0NwbnQpLAorCQkJU0dfTUlURVJfQVRPTUlDIHwgU0dfTUlURVJfRlJPTV9TRyk7CiAKLQkvKiBGb3IgZWFjaCBkYXRhIHBhZ2UgKi8KLQlzY3NpX2Zvcl9lYWNoX3NnKFNDcG50LCBkc2dsLCBzY3NpX3NnX2NvdW50KFNDcG50KSwgaSkgewotCQlkYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UoZHNnbCkpICsgZHNnbC0+b2Zmc2V0OwotCQlwYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UocHNnbCkpICsgcHNnbC0+b2Zmc2V0OworCS8qIEZvciBlYWNoIHByb3RlY3Rpb24gcGFnZSAqLworCXdoaWxlIChzZ19taXRlcl9uZXh0KCZwaXRlcikpIHsKKwkJZHBhZ2Vfb2Zmc2V0ID0gMDsKKwkJaWYgKFdBUk5fT04oIXNnX21pdGVyX25leHQoJmRpdGVyKSkpIHsKKwkJCXJldCA9IDB4MDE7CisJCQlnb3RvIG91dDsKKwkJfQogCi0JCS8qIEZvciBlYWNoIHNlY3Rvci1zaXplZCBjaHVuayBpbiBkYXRhIHBhZ2UgKi8KLQkJZm9yIChqID0gMDsgaiA8IGRzZ2wtPmxlbmd0aDsgaiArPSBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplKSB7Ci0KKwkJZm9yIChwcGFnZV9vZmZzZXQgPSAwOyBwcGFnZV9vZmZzZXQgPCBwaXRlci5sZW5ndGg7CisJCSAgICAgcHBhZ2Vfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3Qgc2RfZGlmX3R1cGxlKSkgewogCQkJLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudAotCQkJICogcHJvdGVjdGlvbiBwYWdlIGFkdmFuY2UgdG8gdGhlIG5leHQgb25lCisJCQkgKiBkYXRhIHBhZ2UgYWR2YW5jZSB0byB0aGUgbmV4dCBvbmUKIAkJCSAqLwotCQkJaWYgKHBwYWdlX29mZnNldCA+PSBwc2dsLT5sZW5ndGgpIHsKLQkJCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKLQkJCQlwc2dsID0gc2dfbmV4dChwc2dsKTsKLQkJCQlCVUdfT04ocHNnbCA9PSBOVUxMKTsKLQkJCQlwYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UocHNnbCkpCi0JCQkJCSsgcHNnbC0+b2Zmc2V0OwotCQkJCXBwYWdlX29mZnNldCA9IDA7CisJCQlpZiAoZHBhZ2Vfb2Zmc2V0ID49IGRpdGVyLmxlbmd0aCkgeworCQkJCWlmIChXQVJOX09OKCFzZ19taXRlcl9uZXh0KCZkaXRlcikpKSB7CisJCQkJCXJldCA9IDB4MDE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlkcGFnZV9vZmZzZXQgPSAwOwogCQkJfQogCi0JCQlzZHQgPSBwYWRkciArIHBwYWdlX29mZnNldDsKKwkJCXNkdCA9IHBpdGVyLmFkZHIgKyBwcGFnZV9vZmZzZXQ7CisJCQlkYWRkciA9IGRpdGVyLmFkZHIgKyBkcGFnZV9vZmZzZXQ7CiAKLQkJCXJldCA9IGRpZl92ZXJpZnkoc2R0LCBkYWRkciArIGosIHNlY3RvciwgZWlfbGJhKTsKKwkJCXJldCA9IGRpZl92ZXJpZnkoc2R0LCBkYWRkciwgc2VjdG9yLCBlaV9sYmEpOwogCQkJaWYgKHJldCkgewotCQkJCWR1bXBfc2VjdG9yKGRhZGRyICsgaiwgc2NzaV9kZWJ1Z19zZWN0b3Jfc2l6ZSk7CisJCQkJZHVtcF9zZWN0b3IoZGFkZHIsIHNjc2lfZGVidWdfc2VjdG9yX3NpemUpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCiAJCQlzZWN0b3IrKzsKIAkJCWVpX2xiYSsrOwotCQkJcHBhZ2Vfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3Qgc2RfZGlmX3R1cGxlKTsKKwkJCWRwYWdlX29mZnNldCArPSBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplOwogCQl9Ci0KLQkJa3VubWFwX2F0b21pYyhwYWRkcik7Ci0JCWt1bm1hcF9hdG9taWMoZGFkZHIpOworCQlkaXRlci5jb25zdW1lZCA9IGRwYWdlX29mZnNldDsKKwkJc2dfbWl0ZXJfc3RvcCgmZGl0ZXIpOwogCX0KKwlzZ19taXRlcl9zdG9wKCZwaXRlcik7CiAKIAlkaWZfY29weV9wcm90KFNDcG50LCBzdGFydF9zZWMsIHNlY3RvcnMsIGZhbHNlKTsKIAlkaXhfd3JpdGVzKys7CkBAIC0xOTg4LDggKzIwMDAsOCBAQAogCiBvdXQ6CiAJZGlmX2Vycm9ycysrOwotCWt1bm1hcF9hdG9taWMocGFkZHIpOwotCWt1bm1hcF9hdG9taWMoZGFkZHIpOworCXNnX21pdGVyX3N0b3AoJmRpdGVyKTsKKwlzZ19taXRlcl9zdG9wKCZwaXRlcik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjA4OSwxNyArMjEwMSwxOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKKwogCS8qIERJWCArIFQxMCBESUYgKi8KIAlpZiAoc2NzaV9kZWJ1Z19kaXggJiYgc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSkgewogCQlpbnQgcHJvdF9yZXQgPSBwcm90X3ZlcmlmeV93cml0ZShTQ3BudCwgbGJhLCBudW0sIGVpX2xiYSk7CiAKIAkJaWYgKHByb3RfcmV0KSB7CisJCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOwogCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIDB4MTAsIHByb3RfcmV0KTsKIAkJCXJldHVybiBpbGxlZ2FsX2NvbmRpdGlvbl9yZXN1bHQ7CiAJCX0KIAl9CiAKLQl3cml0ZV9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAlyZXQgPSBkb19kZXZpY2VfYWNjZXNzKFNDcG50LCBkZXZpcCwgbGJhLCBudW0sIDEpOwogCWlmIChzY3NpX2RlYnVnX2xicCgpKQogCQltYXBfcmVnaW9uKGxiYSwgbnVtKTsKQEAgLTIxNzgsNiArMjE5Miw3IEBACiAJc3RydWN0IHVubWFwX2Jsb2NrX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgaW50IGksIHBheWxvYWRfbGVuLCBkZXNjcmlwdG9yczsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwogCiAJcmV0ID0gY2hlY2tfcmVhZGluZXNzKHNjbWQsIDEsIGRldmlwKTsKIAlpZiAocmV0KQpAQCAtMjE5OSw2ICsyMjE0LDggQEAKIAogCWRlc2MgPSAodm9pZCAqKSZidWZbOF07CiAKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKKwogCWZvciAoaSA9IDAgOyBpIDwgZGVzY3JpcHRvcnMgOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIGxiYSA9IGdldF91bmFsaWduZWRfYmU2NCgmZGVzY1tpXS5sYmEpOwogCQl1bnNpZ25lZCBpbnQgbnVtID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZkZXNjW2ldLmJsb2Nrcyk7CkBAIC0yMjEzLDYgKzIyMzAsNyBAQAogCXJldCA9IDA7CiAKIG91dDoKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOwogCWtmcmVlKGJ1Zik7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjMxMywzNiArMjMzMSwzNyBAQAogc3RhdGljIGludCByZXNwX3hkd3JpdGVyZWFkKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwgdW5zaWduZWQgbG9uZyBsb25nIGxiYSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbnVtLCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICpkZXZpcCkKIHsKLQlpbnQgaSwgaiwgcmV0ID0gLTE7CisJaW50IGo7CiAJdW5zaWduZWQgY2hhciAqa2FkZHIsICpidWY7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpzZGIgPSBzY3NpX2luKHNjcCk7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBtaXRlcjsKIAogCS8qIGJldHRlciBub3QgdG8gdXNlIHRlbXBvcmFyeSBidWZmZXIuICovCiAJYnVmID0ga21hbGxvYyhzY3NpX2J1ZmZsZW4oc2NwKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiByZXQ7CisJaWYgKCFidWYpIHsKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBOT1RfUkVBRFksCisJCQkJTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRSwgMCk7CisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCX0KIAogCXNjc2lfc2dfY29weV90b19idWZmZXIoc2NwLCBidWYsIHNjc2lfYnVmZmxlbihzY3ApKTsKIAogCW9mZnNldCA9IDA7Ci0JZm9yX2VhY2hfc2coc2RiLT50YWJsZS5zZ2wsIHNnLCBzZGItPnRhYmxlLm5lbnRzLCBpKSB7Ci0JCWthZGRyID0gKHVuc2lnbmVkIGNoYXIgKilrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSk7Ci0JCWlmICgha2FkZHIpCi0JCQlnb3RvIG91dDsKKwlzZ19taXRlcl9zdGFydCgmbWl0ZXIsIHNkYi0+dGFibGUuc2dsLCBzZGItPnRhYmxlLm5lbnRzLAorCQkJU0dfTUlURVJfQVRPTUlDIHwgU0dfTUlURVJfVE9fU0cpOwogCi0JCWZvciAoaiA9IDA7IGogPCBzZy0+bGVuZ3RoOyBqKyspCi0JCQkqKGthZGRyICsgc2ctPm9mZnNldCArIGopIF49ICooYnVmICsgb2Zmc2V0ICsgaik7CisJd2hpbGUgKHNnX21pdGVyX25leHQoJm1pdGVyKSkgeworCQlrYWRkciA9IG1pdGVyLmFkZHI7CisJCWZvciAoaiA9IDA7IGogPCBtaXRlci5sZW5ndGg7IGorKykKKwkJCSooa2FkZHIgKyBqKSBePSAqKGJ1ZiArIG9mZnNldCArIGopOwogCi0JCW9mZnNldCArPSBzZy0+bGVuZ3RoOwotCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJb2Zmc2V0ICs9IG1pdGVyLmxlbmd0aDsKIAl9Ci0JcmV0ID0gMDsKLW91dDoKKwlzZ19taXRlcl9zdG9wKCZtaXRlcik7CiAJa2ZyZWUoYnVmKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFdoZW4gdGltZXIgZ29lcyBvZmYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICovCkBAIC0yNzQ0LDYgKzI3NjMsNyBAQAogICovCiBtb2R1bGVfcGFyYW1fbmFtZWQoYWRkX2hvc3QsIHNjc2lfZGVidWdfYWRkX2hvc3QsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogbW9kdWxlX3BhcmFtX25hbWVkKGF0bywgc2NzaV9kZWJ1Z19hdG8sIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fbmFtZWQoY2x1c3RlcmluZywgc2NzaV9kZWJ1Z19jbHVzdGVyaW5nLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVsYXksIHNjc2lfZGVidWdfZGVsYXksIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogbW9kdWxlX3BhcmFtX25hbWVkKGRldl9zaXplX21iLCBzY3NpX2RlYnVnX2Rldl9zaXplX21iLCBpbnQsIFNfSVJVR08pOwogbW9kdWxlX3BhcmFtX25hbWVkKGRpZiwgc2NzaV9kZWJ1Z19kaWYsIGludCwgU19JUlVHTyk7CkBAIC0yNzg3LDYgKzI4MDcsNyBAQAogCiBNT0RVTEVfUEFSTV9ERVNDKGFkZF9ob3N0LCAiMC4uMTI3IGhvc3RzIGFsbG93ZWQoZGVmPTEpIik7CiBNT0RVTEVfUEFSTV9ERVNDKGF0bywgImFwcGxpY2F0aW9uIHRhZyBvd25lcnNoaXA6IDA9ZGlzayAxPWhvc3QgKGRlZj0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhjbHVzdGVyaW5nLCAid2hlbiBzZXQgZW5hYmxlcyBsYXJnZXIgdHJhbnNmZXJzIChkZWY9MCkiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVsYXksICIjIG9mIGppZmZpZXMgdG8gZGVsYXkgcmVzcG9uc2UoZGVmPTEpIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRldl9zaXplX21iLCAic2l6ZSBpbiBNQiBvZiByYW0gc2hhcmVkIGJ5IGRldnMoZGVmPTgpIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRpZiwgImRhdGEgaW50ZWdyaXR5IGZpZWxkIHR5cGU6IDAtMyAoZGVmPTApIik7CkBAIC0zMjQ4LDcgKzMyNjksNyBAQAogfTsKIEFUVFJJQlVURV9HUk9VUFMoc2RlYnVnX2Rydik7CiAKLXN0cnVjdCBkZXZpY2UgKnBzZXVkb19wcmltYXJ5Oworc3RhdGljIHN0cnVjdCBkZXZpY2UgKnBzZXVkb19wcmltYXJ5OwogCiBzdGF0aWMgaW50IF9faW5pdCBzY3NpX2RlYnVnX2luaXQodm9pZCkKIHsKQEAgLTM5MzQsNiArMzk1NSw4IEBACiAJc2RiZ19ob3N0ID0gdG9fc2RlYnVnX2hvc3QoZGV2KTsKIAogCXNkZWJ1Z19kcml2ZXJfdGVtcGxhdGUuY2FuX3F1ZXVlID0gc2NzaV9kZWJ1Z19tYXhfcXVldWU7CisJaWYgKHNjc2lfZGVidWdfY2x1c3RlcmluZykKKwkJc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HOwogCWhwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJnNkZWJ1Z19kcml2ZXJfdGVtcGxhdGUsIHNpemVvZihzZGJnX2hvc3QpKTsKIAlpZiAoTlVMTCA9PSBocG50KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNjc2lfcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwppbmRleCA3OGIwMDRkLi43NzFjMTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKQEAgLTIyODgsNiArMjI4OCwxMSBAQAogCWlmIChzY3NpX2F1dG9wbV9nZXRfaG9zdChzaG9zdCkgPCAwKQogCQlyZXR1cm4gRkFJTEVEOwogCisJaWYgKCFnZXRfZGV2aWNlKCZkZXYtPnNkZXZfZ2VuZGV2KSkgeworCQlydG4gPSBGQUlMRUQ7CisJCWdvdG8gb3V0X3B1dF9hdXRvcG1faG9zdDsKKwl9CisKIAlzY21kID0gc2NzaV9nZXRfY29tbWFuZChkZXYsIEdGUF9LRVJORUwpOwogCWJsa19ycV9pbml0KE5VTEwsICZyZXEpOwogCXNjbWQtPnJlcXVlc3QgPSAmcmVxOwpAQCAtMjM0NSw2ICsyMzUwLDcgQEAKIAlzY3NpX3J1bl9ob3N0X3F1ZXVlcyhzaG9zdCk7CiAKIAlzY3NpX25leHRfY29tbWFuZChzY21kKTsKK291dF9wdXRfYXV0b3BtX2hvc3Q6CiAJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOwogCXJldHVybiBydG47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDYyZWM4NGIuLjU2ODFjMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC03NSwyOCArNzUsNiBAQAogICovCiAjZGVmaW5lIFNDU0lfUVVFVUVfREVMQVkJMwogCi0vKgotICogRnVuY3Rpb246CXNjc2lfdW5wcmVwX3JlcXVlc3QoKQotICoKLSAqIFB1cnBvc2U6CVJlbW92ZSBhbGwgcHJlcGFyYXRpb24gZG9uZSBmb3IgYSByZXF1ZXN0LCBpbmNsdWRpbmcgaXRzCi0gKgkJYXNzb2NpYXRlZCBzY3NpX2NtbmQsIHNvIHRoYXQgaXQgY2FuIGJlIHJlcXVldWVkLgotICoKLSAqIEFyZ3VtZW50czoJcmVxCS0gcmVxdWVzdCB0byB1bnByZXBhcmUKLSAqCi0gKiBMb2NrIHN0YXR1czoJQXNzdW1lZCB0aGF0IG5vIGxvY2tzIGFyZSBoZWxkIHVwb24gZW50cnkuCi0gKgotICogUmV0dXJuczoJTm90aGluZy4KLSAqLwotc3RhdGljIHZvaWQgc2NzaV91bnByZXBfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHJlcS0+c3BlY2lhbDsKLQotCWJsa191bnByZXBfcmVxdWVzdChyZXEpOwotCXJlcS0+c3BlY2lhbCA9IE5VTEw7Ci0KLQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7Ci19Ci0KIC8qKgogICogX19zY3NpX3F1ZXVlX2luc2VydCAtIHByaXZhdGUgcXVldWUgaW5zZXJ0aW9uCiAgKiBAY21kOiBUaGUgU0NTSSBjb21tYW5kIGJlaW5nIHJlcXVldWVkCkBAIC0zODUsMjkgKzM2MywxMiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogRnVuY3Rpb246CXNjc2lfcnVuX3F1ZXVlKCkKLSAqCi0gKiBQdXJwb3NlOglTZWxlY3QgYSBwcm9wZXIgcmVxdWVzdCBxdWV1ZSB0byBzZXJ2ZSBuZXh0Ci0gKgotICogQXJndW1lbnRzOglxCS0gbGFzdCByZXF1ZXN0J3MgcXVldWUKLSAqCi0gKiBSZXR1cm5zOiAgICAgTm90aGluZwotICoKLSAqIE5vdGVzOglUaGUgcHJldmlvdXMgY29tbWFuZCB3YXMgY29tcGxldGVseSBmaW5pc2hlZCwgc3RhcnQKLSAqCQlhIG5ldyBvbmUgaWYgcG9zc2libGUuCi0gKi8KLXN0YXRpYyB2b2lkIHNjc2lfcnVuX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQorc3RhdGljIHZvaWQgc2NzaV9zdGFydmVkX2xpc3RfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlMSVNUX0hFQUQoc3RhcnZlZF9saXN0KTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNob3N0ID0gc2Rldi0+aG9zdDsKLQlpZiAoc2NzaV90YXJnZXQoc2RldiktPnNpbmdsZV9sdW4pCi0JCXNjc2lfc2luZ2xlX2x1bl9ydW4oc2Rldik7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmc2hvc3QtPnN0YXJ2ZWRfbGlzdCwgJnN0YXJ2ZWRfbGlzdCk7CiAKQEAgLTQ1OSw2ICs0MjAsMjggQEAKIAkvKiBwdXQgYW55IHVucHJvY2Vzc2VkIGVudHJpZXMgYmFjayAqLwogCWxpc3Rfc3BsaWNlKCZzdGFydmVkX2xpc3QsICZzaG9zdC0+c3RhcnZlZF9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgIHNjc2lfcnVuX3F1ZXVlKCkKKyAqCisgKiBQdXJwb3NlOiAgICBTZWxlY3QgYSBwcm9wZXIgcmVxdWVzdCBxdWV1ZSB0byBzZXJ2ZSBuZXh0CisgKgorICogQXJndW1lbnRzOiAgcSAgICAgICAtIGxhc3QgcmVxdWVzdCdzIHF1ZXVlCisgKgorICogUmV0dXJuczogICAgIE5vdGhpbmcKKyAqCisgKiBOb3RlczogICAgICBUaGUgcHJldmlvdXMgY29tbWFuZCB3YXMgY29tcGxldGVseSBmaW5pc2hlZCwgc3RhcnQKKyAqICAgICAgICAgICAgIGEgbmV3IG9uZSBpZiBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOworCisJaWYgKHNjc2lfdGFyZ2V0KHNkZXYpLT5zaW5nbGVfbHVuKQorCQlzY3NpX3NpbmdsZV9sdW5fcnVuKHNkZXYpOworCWlmICghbGlzdF9lbXB0eSgmc2Rldi0+aG9zdC0+c3RhcnZlZF9saXN0KSkKKwkJc2NzaV9zdGFydmVkX2xpc3RfcnVuKHNkZXYtPmhvc3QpOwogCiAJYmxrX3J1bl9xdWV1ZShxKTsKIH0KQEAgLTQ5NywxNiArNDgwLDEwIEBACiAJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyoKLQkgKiBXZSBuZWVkIHRvIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGRldmljZSB0byBhdm9pZCB0aGUgcXVldWUgYmVpbmcKLQkgKiBraWxsZWQgYWZ0ZXIgdGhlIHVubG9jayBhbmQgYmVmb3JlIHNjc2lfcnVuX3F1ZXVlIGlzIGludm9rZWQgd2hpY2gKLQkgKiBtYXkgaGFwcGVuIGJlY2F1c2Ugc2NzaV91bnByZXBfcmVxdWVzdCgpIHB1dHMgdGhlIGNvbW1hbmQgd2hpY2gKLQkgKiByZWxlYXNlcyBpdHMgcmVmZXJlbmNlIG9uIHRoZSBkZXZpY2UuCi0JICovCi0JZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCXNjc2lfdW5wcmVwX3JlcXVlc3QocmVxKTsKKwlibGtfdW5wcmVwX3JlcXVlc3QocmVxKTsKKwlyZXEtPnNwZWNpYWwgPSBOVUxMOworCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKIAlibGtfcmVxdWV1ZV9yZXF1ZXN0KHEsIHJlcSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKQEAgLTUyMCwxMyArNDk3LDkgQEAKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHNkZXYtPnJlcXVlc3RfcXVldWU7CiAKLQkvKiBuZWVkIHRvIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGRldmljZSBiZWZvcmUgd2UgbGV0IGdvIG9mIHRoZSBjbWQgKi8KLQlnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Ci0KIAlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CiAJc2NzaV9ydW5fcXVldWUocSk7CiAKLQkvKiBvayB0byByZW1vdmUgZGV2aWNlIG5vdyAqLwogCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIH0KIApAQCAtNzg4LDYgKzc2MSw3IEBACiAJZW51bSB7QUNUSU9OX0ZBSUwsIEFDVElPTl9SRVBSRVAsIEFDVElPTl9SRVRSWSwKIAkgICAgICBBQ1RJT05fREVMQVlFRF9SRVRSWX0gYWN0aW9uOwogCWNoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHdhaXRfZm9yID0gKGNtZC0+YWxsb3dlZCArIDEpICogcmVxLT50aW1lb3V0OwogCiAJaWYgKHJlc3VsdCkgewogCQlzZW5zZV92YWxpZCA9IHNjc2lfY29tbWFuZF9ub3JtYWxpemVfc2Vuc2UoY21kLCAmc3NoZHIpOwpAQCAtOTg5LDYgKzk2MywxMiBAQAogCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKIAl9CiAKKwlpZiAoYWN0aW9uICE9IEFDVElPTl9GQUlMICYmCisJICAgIHRpbWVfYmVmb3JlKGNtZC0+amlmZmllc19hdF9hbGxvYyArIHdhaXRfZm9yLCBqaWZmaWVzKSkgeworCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKKwkJZGVzY3JpcHRpb24gPSAiQ29tbWFuZCB0aW1lZCBvdXQiOworCX0KKwogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBBQ1RJT05fRkFJTDoKIAkJLyogR2l2ZSB1cCBhbmQgZmFpbCB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXF1ZXN0ICovCkBAIC0xMTExLDYgKzEwOTEsNyBAQAogCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CiAJY21kLT5yZXF1ZXN0LT5zcGVjaWFsID0gTlVMTDsKIAlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CisJcHV0X2RldmljZSgmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfaW5pdF9pbyk7CkBAIC0xMTIxLDkgKzExMDIsMTUgQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKIAlpZiAoIXJlcS0+c3BlY2lhbCkgewotCQljbWQgPSBzY3NpX2dldF9jb21tYW5kKHNkZXYsIEdGUF9BVE9NSUMpOwotCQlpZiAodW5saWtlbHkoIWNtZCkpCisJCS8qIEJhaWwgaWYgd2UgY2FuJ3QgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgKi8KKwkJaWYgKCFnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldikpCiAJCQlyZXR1cm4gTlVMTDsKKworCQljbWQgPSBzY3NpX2dldF9jb21tYW5kKHNkZXYsIEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoIWNtZCkpIHsKKwkJCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJCXJlcS0+c3BlY2lhbCA9IGNtZDsKIAl9IGVsc2UgewogCQljbWQgPSByZXEtPnNwZWNpYWw7CkBAIC0xMjg2LDYgKzEyNzMsNyBAQAogCQkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcmVxLT5zcGVjaWFsOwogCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAkJCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKKwkJCXB1dF9kZXZpY2UoJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldik7CiAJCQlyZXEtPnNwZWNpYWwgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwpAQCAtMTU0MywxNiArMTUzMSwxNCBAQAogICogTG9jayBzdGF0dXM6IElPIHJlcXVlc3QgbG9jayBhc3N1bWVkIHRvIGJlIGhlbGQgd2hlbiBjYWxsZWQuCiAgKi8KIHN0YXRpYyB2b2lkIHNjc2lfcmVxdWVzdF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKKwlfX3JlbGVhc2VzKHEtPnF1ZXVlX2xvY2spCisJX19hY3F1aXJlcyhxLT5xdWV1ZV9sb2NrKQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAotCWlmKCFnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldikpCi0JCS8qIFdlIG11c3QgYmUgdGVhcmluZyB0aGUgYmxvY2sgcXVldWUgZG93biBhbHJlYWR5ICovCi0JCXJldHVybjsKLQogCS8qCiAJICogVG8gc3RhcnQgd2l0aCwgd2Uga2VlcCBsb29waW5nIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eSwgb3IgdW50aWwKIAkgKiB0aGUgaG9zdCBpcyBubyBsb25nZXIgYWJsZSB0byBhY2NlcHQgYW55IG1vcmUgcmVxdWVzdHMuCkBAIC0xNjQxLDcgKzE2MjcsNyBAQAogCQkJZ290byBvdXRfZGVsYXk7CiAJfQogCi0JZ290byBvdXQ7CisJcmV0dXJuOwogCiAgbm90X3JlYWR5OgogCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKQEAgLTE2NjAsMTIgKzE2NDYsNiBAQAogb3V0X2RlbGF5OgogCWlmIChzZGV2LT5kZXZpY2VfYnVzeSA9PSAwKQogCQlibGtfZGVsYXlfcXVldWUocSwgU0NTSV9RVUVVRV9ERUxBWSk7Ci1vdXQ6Ci0JLyogbXVzdCBiZSBjYXJlZnVsIGhlcmUuLi5pZiB3ZSB0cmlnZ2VyIHRoZSAtPnJlbW92ZSgpIGZ1bmN0aW9uCi0JICogd2UgY2Fubm90IGJlIGhvbGRpbmcgdGhlIHEgbG9jayAqLwotCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Ci0Jc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIH0KIAogdTY0IHNjc2lfY2FsY3VsYXRlX2JvdW5jZV9saW1pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCAzMDdhODExLi4yN2Y5NmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0zMjAsNiArMzIwLDcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChkZXYtPnBhcmVudCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXN0YXJnZXQtPnN0YXRlID0gU1RBUkdFVF9ERUw7CiAJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKGRldik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWlmIChzaG9zdC0+aG9zdHQtPnRhcmdldF9kZXN0cm95KQpAQCAtMzcxLDYgKzM3MiwzNyBAQAogfQogCiAvKioKKyAqIHNjc2lfdGFyZ2V0X3JlYXBfcmVmX3JlbGVhc2UgLSByZW1vdmUgdGFyZ2V0IGZyb20gdmlzaWJpbGl0eQorICogQGtyZWY6IHRoZSByZWFwX3JlZiBpbiB0aGUgdGFyZ2V0IGJlaW5nIHJlbGVhc2VkCisgKgorICogQ2FsbGVkIG9uIGxhc3QgcHV0IG9mIHJlYXBfcmVmLCB3aGljaCBpcyB0aGUgaW5kaWNhdGlvbiB0aGF0IG5vIGRldmljZQorICogdW5kZXIgdGhpcyB0YXJnZXQgaXMgdmlzaWJsZSBhbnltb3JlLCBzbyByZW5kZXIgdGhlIHRhcmdldCBpbnZpc2libGUgaW4KKyAqIHN5c2ZzLiAgTm90ZTogd2UgaGF2ZSB0byBiZSBpbiB1c2VyIGNvbnRleHQgaGVyZSBiZWNhdXNlIHRoZSB0YXJnZXQgcmVhcHMKKyAqIHNob3VsZCBiZSBkb25lIGluIHBsYWNlcyB3aGVyZSB0aGUgc2NzaSBkZXZpY2UgdmlzaWJpbGl0eSBpcyBiZWluZyByZW1vdmVkLgorICovCitzdGF0aWMgdm9pZCBzY3NpX3RhcmdldF9yZWFwX3JlZl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldAorCQk9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgc2NzaV90YXJnZXQsIHJlYXBfcmVmKTsKKworCS8qCisJICogaWYgd2UgZ2V0IGhlcmUgYW5kIHRoZSB0YXJnZXQgaXMgc3RpbGwgaW4gdGhlIENSRUFURUQgc3RhdGUgdGhhdAorCSAqIG1lYW5zIGl0IHdhcyBhbGxvY2F0ZWQgYnV0IG5ldmVyIG1hZGUgdmlzaWJsZSAoYmVjYXVzZSBhIHNjYW4KKwkgKiB0dXJuZWQgdXAgbm8gTFVOcyksIHNvIGRvbid0IGNhbGwgZGV2aWNlX2RlbCgpIG9uIGl0LgorCSAqLworCWlmIChzdGFyZ2V0LT5zdGF0ZSAhPSBTVEFSR0VUX0NSRUFURUQpIHsKKwkJdHJhbnNwb3J0X3JlbW92ZV9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJCWRldmljZV9kZWwoJnN0YXJnZXQtPmRldik7CisJfQorCXNjc2lfdGFyZ2V0X2Rlc3Ryb3koc3RhcmdldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjc2lfdGFyZ2V0X3JlYXBfcmVmX3B1dChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJa3JlZl9wdXQoJnN0YXJnZXQtPnJlYXBfcmVmLCBzY3NpX3RhcmdldF9yZWFwX3JlZl9yZWxlYXNlKTsKK30KKworLyoqCiAgKiBzY3NpX2FsbG9jX3RhcmdldCAtIGFsbG9jYXRlIGEgbmV3IG9yIGZpbmQgYW4gZXhpc3RpbmcgdGFyZ2V0CiAgKiBAcGFyZW50OglwYXJlbnQgb2YgdGhlIHRhcmdldCAobmVlZCBub3QgYmUgYSBzY3NpIGhvc3QpCiAgKiBAY2hhbm5lbDoJdGFyZ2V0IGNoYW5uZWwgbnVtYmVyICh6ZXJvIGlmIG5vIGNoYW5uZWxzKQpAQCAtMzkyLDcgKzQyNCw3IEBACiAJCSsgc2hvc3QtPnRyYW5zcG9ydHQtPnRhcmdldF9zaXplOwogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKmZvdW5kX3RhcmdldDsKLQlpbnQgZXJyb3I7CisJaW50IGVycm9yLCByZWZfZ290OwogCiAJc3RhcmdldCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdGFyZ2V0KSB7CkBAIC00MDEsNyArNDMzLDcgQEAKIAl9CiAJZGV2ID0gJnN0YXJnZXQtPmRldjsKIAlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOwotCXN0YXJnZXQtPnJlYXBfcmVmID0gMTsKKwlrcmVmX2luaXQoJnN0YXJnZXQtPnJlYXBfcmVmKTsKIAlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UocGFyZW50KTsKIAlkZXZfc2V0X25hbWUoZGV2LCAidGFyZ2V0JWQ6JWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgaWQpOwogCWRldi0+YnVzID0gJnNjc2lfYnVzX3R5cGU7CkBAIC00NDEsMjkgKzQ3MywzNiBAQAogCXJldHVybiBzdGFyZ2V0OwogCiAgZm91bmQ6Ci0JZm91bmRfdGFyZ2V0LT5yZWFwX3JlZisrOworCS8qCisJICogcmVsZWFzZSByb3V0aW5lIGFscmVhZHkgZmlyZWQgaWYga3JlZiBpcyB6ZXJvLCBzbyBpZiB3ZSBjYW4gc3RpbGwKKwkgKiB0YWtlIHRoZSByZWZlcmVuY2UsIHRoZSB0YXJnZXQgbXVzdCBiZSBhbGl2ZS4gIElmIHdlIGNhbid0LCBpdCBtdXN0CisJICogYmUgZHlpbmcgYW5kIHdlIG5lZWQgdG8gd2FpdCBmb3IgYSBuZXcgdGFyZ2V0CisJICovCisJcmVmX2dvdCA9IGtyZWZfZ2V0X3VubGVzc196ZXJvKCZmb3VuZF90YXJnZXQtPnJlYXBfcmVmKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWlmIChmb3VuZF90YXJnZXQtPnN0YXRlICE9IFNUQVJHRVRfREVMKSB7CisJaWYgKHJlZl9nb3QpIHsKIAkJcHV0X2RldmljZShkZXYpOwogCQlyZXR1cm4gZm91bmRfdGFyZ2V0OwogCX0KLQkvKiBVbmZvcnR1bmF0ZWx5LCB3ZSBmb3VuZCBhIGR5aW5nIHRhcmdldDsgbmVlZCB0bwotCSAqIHdhaXQgdW50aWwgaXQncyBkZWFkIGJlZm9yZSB3ZSBjYW4gZ2V0IGEgbmV3IG9uZSAqLworCS8qCisJICogVW5mb3J0dW5hdGVseSwgd2UgZm91bmQgYSBkeWluZyB0YXJnZXQ7IG5lZWQgdG8gd2FpdCB1bnRpbCBpdCdzCisJICogZGVhZCBiZWZvcmUgd2UgY2FuIGdldCBhIG5ldyBvbmUuICBUaGVyZSBpcyBhbiBhbm9tYWx5IGhlcmUuICBXZQorCSAqICpzaG91bGQqIGNhbGwgc2NzaV90YXJnZXRfcmVhcCgpIHRvIGJhbGFuY2UgdGhlIGtyZWZfZ2V0KCkgb2YgdGhlCisJICogcmVhcF9yZWYgYWJvdmUuICBIb3dldmVyLCBzaW5jZSB0aGUgdGFyZ2V0IGJlaW5nIHJlbGVhc2VkLCBpdCdzCisJICogYWxyZWFkeSBpbnZpc2libGUgYW5kIHRoZSByZWFwX3JlZiBpcyBpcnJlbGV2YW50LiAgSWYgd2UgY2FsbAorCSAqIHNjc2lfdGFyZ2V0X3JlYXAoKSB3ZSBtaWdodCBzcHVyaW91c2x5IGRvIGFub3RoZXIgZGV2aWNlX2RlbCgpIG9uCisJICogYW4gYWxyZWFkeSBpbnZpc2libGUgdGFyZ2V0LgorCSAqLwogCXB1dF9kZXZpY2UoJmZvdW5kX3RhcmdldC0+ZGV2KTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCS8qCisJICogbGVuZ3RoIG9mIHRpbWUgaXMgaXJyZWxldmFudCBoZXJlLCB3ZSBqdXN0IHdhbnQgdG8geWllbGQgdGhlIENQVQorCSAqIGZvciBhIHRpY2sgdG8gYXZvaWQgYnVzeSB3YWl0aW5nIGZvciB0aGUgdGFyZ2V0IHRvIGRpZS4KKwkgKi8KKwltc2xlZXAoMSk7CiAJZ290byByZXRyeTsKIH0KIAotc3RhdGljIHZvaWQgc2NzaV90YXJnZXRfcmVhcF91c2VyY29udGV4dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzY3NpX3RhcmdldCwgZXcud29yayk7Ci0KLQl0cmFuc3BvcnRfcmVtb3ZlX2RldmljZSgmc3RhcmdldC0+ZGV2KTsKLQlkZXZpY2VfZGVsKCZzdGFyZ2V0LT5kZXYpOwotCXNjc2lfdGFyZ2V0X2Rlc3Ryb3koc3RhcmdldCk7Ci19Ci0KIC8qKgogICogc2NzaV90YXJnZXRfcmVhcCAtIGNoZWNrIHRvIHNlZSBpZiB0YXJnZXQgaXMgaW4gdXNlIGFuZCBkZXN0cm95IGlmIG5vdAogICogQHN0YXJnZXQ6IHRhcmdldCB0byBiZSBjaGVja2VkCkBAIC00NzQsMjggKzUxMywxMyBAQAogICovCiB2b2lkIHNjc2lfdGFyZ2V0X3JlYXAoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQogewotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZW51bSBzY3NpX3RhcmdldF9zdGF0ZSBzdGF0ZTsKLQlpbnQgZW1wdHkgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXN0YXRlID0gc3RhcmdldC0+c3RhdGU7Ci0JaWYgKC0tc3RhcmdldC0+cmVhcF9yZWYgPT0gMCAmJiBsaXN0X2VtcHR5KCZzdGFyZ2V0LT5kZXZpY2VzKSkgewotCQllbXB0eSA9IDE7Ci0JCXN0YXJnZXQtPnN0YXRlID0gU1RBUkdFVF9ERUw7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFlbXB0eSkKLQkJcmV0dXJuOwotCi0JQlVHX09OKHN0YXRlID09IFNUQVJHRVRfREVMKTsKLQlpZiAoc3RhdGUgPT0gU1RBUkdFVF9DUkVBVEVEKQotCQlzY3NpX3RhcmdldF9kZXN0cm95KHN0YXJnZXQpOwotCWVsc2UKLQkJZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQoc2NzaV90YXJnZXRfcmVhcF91c2VyY29udGV4dCwKLQkJCQkJICAgJnN0YXJnZXQtPmV3KTsKKwkvKgorCSAqIHNlcmlvdXMgcHJvYmxlbSBpZiB0aGlzIHRyaWdnZXJzOiBTVEFSR0VUX0RFTCBpcyBvbmx5IHNldCBpbiB0aGUgaWYKKwkgKiB0aGUgcmVhcF9yZWYgZHJvcHMgdG8gemVybywgc28gd2UncmUgdHJ5aW5nIHRvIGRvIGFub3RoZXIgZmluYWwgcHV0CisJICogb24gYW4gYWxyZWFkeSByZWxlYXNlZCBrcmVmCisJICovCisJQlVHX09OKHN0YXJnZXQtPnN0YXRlID09IFNUQVJHRVRfREVMKTsKKwlzY3NpX3RhcmdldF9yZWFwX3JlZl9wdXQoc3RhcmdldCk7CiB9CiAKIC8qKgpAQCAtOTQ2LDYgKzk3MCw5IEBACiAJCX0KIAl9CiAKKwlpZiAoc2Rldi0+c2NzaV9sZXZlbCA+PSBTQ1NJXzMpCisJCXNjc2lfYXR0YWNoX3ZwZChzZGV2KTsKKwogCXNkZXYtPm1heF9xdWV1ZV9kZXB0aCA9IHNkZXYtPnF1ZXVlX2RlcHRoOwogCiAJLyoKQEAgLTE1MzIsNiArMTU1OSwxMCBAQAogCX0KIAltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAlzY3NpX2F1dG9wbV9wdXRfdGFyZ2V0KHN0YXJnZXQpOworCS8qCisJICogcGFpcmVkIHdpdGggc2NzaV9hbGxvY190YXJnZXQoKS4gIFRhcmdldCB3aWxsIGJlIGRlc3Ryb3llZCB1bmxlc3MKKwkgKiBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuIG1hZGUgYW4gdW5kZXJseWluZyBkZXZpY2UgdmlzaWJsZQorCSAqLwogCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7CiAJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKIApAQCAtMTYxMiw4ICsxNjQzLDEwIEBACiAKICBvdXRfcmVhcDoKIAlzY3NpX2F1dG9wbV9wdXRfdGFyZ2V0KHN0YXJnZXQpOwotCS8qIG5vdyBkZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBoYXMgYW55IGNoaWxkcmVuIGF0IGFsbAotCSAqIGFuZCBpZiBub3QsIG51a2UgaXQgKi8KKwkvKgorCSAqIHBhaXJlZCB3aXRoIHNjc2lfYWxsb2NfdGFyZ2V0KCk6IGRldGVybWluZSBpZiB0aGUgdGFyZ2V0IGhhcworCSAqIGFueSBjaGlsZHJlbiBhdCBhbGwgYW5kIGlmIG5vdCwgbnVrZSBpdAorCSAqLwogCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7CiAKIAlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggOTExN2QwYi4uMDc0ZThjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC0zMDAsNyArMzAwLDkgQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBsb25nIGRlYWRsaW5lLCBmbGFnczsKIAotCWlmIChzaG9zdC0+dHJhbnNwb3J0dCAmJiBzaG9zdC0+dHJhbnNwb3J0dC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcikKKwlpZiAoc2hvc3QtPnRyYW5zcG9ydHQgJiYKKwkgICAgKHNob3N0LT50cmFuc3BvcnR0LT5laF9zdHJhdGVneV9oYW5kbGVyIHx8CisJICAgICAhc2hvc3QtPmhvc3R0LT5laF9ob3N0X3Jlc2V0X2hhbmRsZXIpKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKCFzdHJuY21wKGJ1ZiwgIm9mZiIsIHN0cmxlbigib2ZmIikpKQpAQCAtMzgzLDE3ICszODUsMTQgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAJc3RydWN0IGRldmljZSAqcGFyZW50OwotCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzY3NpX2RldmljZSwgZXcud29yayk7CiAKIAlwYXJlbnQgPSBzZGV2LT5zZGV2X2dlbmRldi5wYXJlbnQ7Ci0Jc3RhcmdldCA9IHRvX3Njc2lfdGFyZ2V0KHBhcmVudCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShzZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlzdGFyZ2V0LT5yZWFwX3JlZisrOwogCWxpc3RfZGVsKCZzZGV2LT5zaWJsaW5ncyk7CiAJbGlzdF9kZWwoJnNkZXYtPnNhbWVfdGFyZ2V0X3NpYmxpbmdzKTsKIAlsaXN0X2RlbCgmc2Rldi0+c3RhcnZlZF9lbnRyeSk7CkBAIC00MTMsOCArNDEyLDggQEAKIAkvKiBOVUxMIHF1ZXVlIG1lYW5zIHRoZSBkZXZpY2UgY2FuJ3QgYmUgdXNlZCAqLwogCXNkZXYtPnJlcXVlc3RfcXVldWUgPSBOVUxMOwogCi0Jc2NzaV90YXJnZXRfcmVhcChzY3NpX3RhcmdldChzZGV2KSk7Ci0KKwlrZnJlZShzZGV2LT52cGRfcGc4Myk7CisJa2ZyZWUoc2Rldi0+dnBkX3BnODApOwogCWtmcmVlKHNkZXYtPmlucXVpcnkpOwogCWtmcmVlKHNkZXYpOwogCkBAIC01NzksNyArNTc4LDYgQEAKICAqIENyZWF0ZSB0aGUgYWN0dWFsIHNob3cvc3RvcmUgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCiAgKi8KIHNkZXZfcmRfYXR0ciAoZGV2aWNlX2Jsb2NrZWQsICIlZFxuIik7Ci1zZGV2X3JkX2F0dHIgKHF1ZXVlX2RlcHRoLCAiJWRcbiIpOwogc2Rldl9yZF9hdHRyIChkZXZpY2VfYnVzeSwgIiVkXG4iKTsKIHNkZXZfcmRfYXR0ciAodHlwZSwgIiVkXG4iKTsKIHNkZXZfcmRfYXR0ciAoc2NzaV9sZXZlbCwgIiVkXG4iKTsKQEAgLTY0OSwyMyArNjQ3LDEyIEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIocmVzY2FuLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9yZXNjYW5fZmllbGQpOwogCi1zdGF0aWMgdm9pZCBzZGV2X3N0b3JlX2RlbGV0ZV9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc2NzaV9yZW1vdmVfZGV2aWNlKHRvX3Njc2lfZGV2aWNlKGRldikpOwotfQotCiBzdGF0aWMgc3NpemVfdAogc2Rldl9zdG9yZV9kZWxldGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlpbnQgcmM7Ci0KLQkvKiBBbiBhdHRyaWJ1dGUgY2Fubm90IGJlIHVucmVnaXN0ZXJlZCBieSBvbmUgb2YgaXRzIG93biBtZXRob2RzLAotCSAqIHNvIHdlIGhhdmUgdG8gdXNlIHRoaXMgcm91bmRhYm91dCBhcHByb2FjaC4KLQkgKi8KLQlyYyA9IGRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIHNkZXZfc3RvcmVfZGVsZXRlX2NhbGxiYWNrKTsKLQlpZiAocmMpCi0JCWNvdW50ID0gcmM7CisJaWYgKGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKGRldiwgYXR0cikpCisJCXNjc2lfcmVtb3ZlX2RldmljZSh0b19zY3NpX2RldmljZShkZXYpKTsKIAlyZXR1cm4gY291bnQ7CiB9Owogc3RhdGljIERFVklDRV9BVFRSKGRlbGV0ZSwgU19JV1VTUiwgTlVMTCwgc2Rldl9zdG9yZV9kZWxldGUpOwpAQCAtNzIzLDEwICs3MTAsNjQgQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVzXG4iLCBuYW1lKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKHF1ZXVlX3R5cGUsIFNfSVJVR08sIHNob3dfcXVldWVfdHlwZV9maWVsZCwgTlVMTCk7CitzdGF0aWMgc3NpemVfdAorc3RvcmVfcXVldWVfdHlwZV9maWVsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzZGV2LT5ob3N0LT5ob3N0dDsKKwlpbnQgdGFnX3R5cGUgPSAwLCByZXR2YWw7CisJaW50IHByZXZfdGFnX3R5cGUgPSBzY3NpX2dldF90YWdfdHlwZShzZGV2KTsKKworCWlmICghc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCB8fCAhc2h0LT5jaGFuZ2VfcXVldWVfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RybmNtcChidWYsICJvcmRlcmVkIiwgNykgPT0gMCkKKwkJdGFnX3R5cGUgPSBNU0dfT1JERVJFRF9UQUc7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJzaW1wbGUiLCA2KSA9PSAwKQorCQl0YWdfdHlwZSA9IE1TR19TSU1QTEVfVEFHOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRhZ190eXBlID09IHByZXZfdGFnX3R5cGUpCisJCXJldHVybiBjb3VudDsKKworCXJldHZhbCA9IHNodC0+Y2hhbmdlX3F1ZXVlX3R5cGUoc2RldiwgdGFnX3R5cGUpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocXVldWVfdHlwZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcXVldWVfdHlwZV9maWVsZCwKKwkJICAgc3RvcmVfcXVldWVfdHlwZV9maWVsZCk7CisKKyNkZWZpbmUgc2Rldl92cGRfcGdfYXR0cihfcGFnZSkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQlcCitzaG93X3ZwZF8jI19wYWdlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwJXAorCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAkJCVwKKwkJIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwlcCisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsJCQlcCisJaWYgKCFzZGV2LT52cGRfIyNfcGFnZSkJCQkJCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwlyZXR1cm4gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJm9mZiwJCVwKKwkJCQkgICAgICAgc2Rldi0+dnBkXyMjX3BhZ2UsCQlcCisJCQkJICAgICAgIHNkZXYtPnZwZF8jI19wYWdlIyNfbGVuKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkZXZfYXR0cl92cGRfIyNfcGFnZSA9IHsJCVwKKwkuYXR0ciA9CXsubmFtZSA9IF9fc3RyaW5naWZ5KHZwZF8jI19wYWdlKSwgLm1vZGUgPSBTX0lSVUdPIH0sCVwKKwkuc2l6ZSA9IDAsCQkJCQkJCVwKKwkucmVhZCA9IHNob3dfdnBkXyMjX3BhZ2UsCQkJCQlcCit9OworCitzZGV2X3ZwZF9wZ19hdHRyKHBnODMpOworc2Rldl92cGRfcGdfYXR0cihwZzgwKTsKIAogc3RhdGljIHNzaXplX3QKLXNob3dfaW9zdGF0X2NvdW50ZXJiaXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJCQljaGFyICpidWYpCitzaG93X2lvc3RhdF9jb3VudGVyYml0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQogewogCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJWRcbiIsIChpbnQpc2l6ZW9mKGF0b21pY190KSAqIDgpOwogfQpAQCAtNzk3LDQ2ICs4MzgsOSBAQAogREVDTEFSRV9FVlQobW9kZV9wYXJhbWV0ZXJfY2hhbmdlX3JlcG9ydGVkLCBNT0RFX1BBUkFNRVRFUl9DSEFOR0VfUkVQT1JURUQpCiBERUNMQVJFX0VWVChsdW5fY2hhbmdlX3JlcG9ydGVkLCBMVU5fQ0hBTkdFX1JFUE9SVEVEKQogCi0vKiBEZWZhdWx0IHRlbXBsYXRlIGZvciBkZXZpY2UgYXR0cmlidXRlcy4gIE1heSBOT1QgYmUgbW9kaWZpZWQgKi8KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzY3NpX3NkZXZfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfZGV2aWNlX2Jsb2NrZWQuYXR0ciwKLQkmZGV2X2F0dHJfdHlwZS5hdHRyLAotCSZkZXZfYXR0cl9zY3NpX2xldmVsLmF0dHIsCi0JJmRldl9hdHRyX2RldmljZV9idXN5LmF0dHIsCi0JJmRldl9hdHRyX3ZlbmRvci5hdHRyLAotCSZkZXZfYXR0cl9tb2RlbC5hdHRyLAotCSZkZXZfYXR0cl9yZXYuYXR0ciwKLQkmZGV2X2F0dHJfcmVzY2FuLmF0dHIsCi0JJmRldl9hdHRyX2RlbGV0ZS5hdHRyLAotCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAotCSZkZXZfYXR0cl90aW1lb3V0LmF0dHIsCi0JJmRldl9hdHRyX2VoX3RpbWVvdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW9jb3VudGVyYml0cy5hdHRyLAotCSZkZXZfYXR0cl9pb3JlcXVlc3RfY250LmF0dHIsCi0JJmRldl9hdHRyX2lvZG9uZV9jbnQuYXR0ciwKLQkmZGV2X2F0dHJfaW9lcnJfY250LmF0dHIsCi0JJmRldl9hdHRyX21vZGFsaWFzLmF0dHIsCi0JUkVGX0VWVChtZWRpYV9jaGFuZ2UpLAotCVJFRl9FVlQoaW5xdWlyeV9jaGFuZ2VfcmVwb3J0ZWQpLAotCVJFRl9FVlQoY2FwYWNpdHlfY2hhbmdlX3JlcG9ydGVkKSwKLQlSRUZfRVZUKHNvZnRfdGhyZXNob2xkX3JlYWNoZWQpLAotCVJFRl9FVlQobW9kZV9wYXJhbWV0ZXJfY2hhbmdlX3JlcG9ydGVkKSwKLQlSRUZfRVZUKGx1bl9jaGFuZ2VfcmVwb3J0ZWQpLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjc2lfc2Rldl9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9CXNjc2lfc2Rldl9hdHRycywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpzY3NpX3NkZXZfYXR0cl9ncm91cHNbXSA9IHsKLQkmc2NzaV9zZGV2X2F0dHJfZ3JvdXAsCi0JTlVMTAotfTsKLQogc3RhdGljIHNzaXplX3QKLXNkZXZfc3RvcmVfcXVldWVfZGVwdGhfcncoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzZGV2X3N0b3JlX3F1ZXVlX2RlcHRoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgZGVwdGgsIHJldHZhbDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwpAQCAtODU5LDEwICs4NjMsMTAgQEAKIAogCXJldHVybiBjb3VudDsKIH0KK3NkZXZfc2hvd19mdW5jdGlvbihxdWV1ZV9kZXB0aCwgIiVkXG4iKTsKIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNkZXZfYXR0cl9xdWV1ZV9kZXB0aF9ydyA9Ci0JX19BVFRSKHF1ZXVlX2RlcHRoLCBTX0lSVUdPIHwgU19JV1VTUiwgc2Rldl9zaG93X3F1ZXVlX2RlcHRoLAotCSAgICAgICBzZGV2X3N0b3JlX3F1ZXVlX2RlcHRoX3J3KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihxdWV1ZV9kZXB0aCwgU19JUlVHTyB8IFNfSVdVU1IsIHNkZXZfc2hvd19xdWV1ZV9kZXB0aCwKKwkJICAgc2Rldl9zdG9yZV9xdWV1ZV9kZXB0aCk7CiAKIHN0YXRpYyBzc2l6ZV90CiBzZGV2X3Nob3dfcXVldWVfcmFtcF91cF9wZXJpb2Qoc3RydWN0IGRldmljZSAqZGV2LApAQCAtODkwLDQwICs4OTQsNzkgQEAKIAlyZXR1cm4gcGVyaW9kOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2Rldl9hdHRyX3F1ZXVlX3JhbXBfdXBfcGVyaW9kID0KLQlfX0FUVFIocXVldWVfcmFtcF91cF9wZXJpb2QsIFNfSVJVR08gfCBTX0lXVVNSLAotCSAgICAgICBzZGV2X3Nob3dfcXVldWVfcmFtcF91cF9wZXJpb2QsCi0JICAgICAgIHNkZXZfc3RvcmVfcXVldWVfcmFtcF91cF9wZXJpb2QpOworc3RhdGljIERFVklDRV9BVFRSKHF1ZXVlX3JhbXBfdXBfcGVyaW9kLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgc2Rldl9zaG93X3F1ZXVlX3JhbXBfdXBfcGVyaW9kLAorCQkgICBzZGV2X3N0b3JlX3F1ZXVlX3JhbXBfdXBfcGVyaW9kKTsKIAotc3RhdGljIHNzaXplX3QKLXNkZXZfc3RvcmVfcXVldWVfdHlwZV9ydyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHVtb2RlX3Qgc2NzaV9zZGV2X2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwotCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNkZXYtPmhvc3QtPmhvc3R0OwotCWludCB0YWdfdHlwZSA9IDAsIHJldHZhbDsKLQlpbnQgcHJldl90YWdfdHlwZSA9IHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpOwogCi0JaWYgKCFzZGV2LT50YWdnZWRfc3VwcG9ydGVkIHx8ICFzaHQtPmNoYW5nZV9xdWV1ZV90eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzdHJuY21wKGJ1ZiwgIm9yZGVyZWQiLCA3KSA9PSAwKQotCQl0YWdfdHlwZSA9IE1TR19PUkRFUkVEX1RBRzsKLQllbHNlIGlmIChzdHJuY21wKGJ1ZiwgInNpbXBsZSIsIDYpID09IDApCi0JCXRhZ190eXBlID0gTVNHX1NJTVBMRV9UQUc7Ci0JZWxzZSBpZiAoc3RybmNtcChidWYsICJub25lIiwgNCkgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX3F1ZXVlX2RlcHRoLmF0dHIgJiYKKwkgICAgIXNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGgpCisJCXJldHVybiBTX0lSVUdPOwogCi0JaWYgKHRhZ190eXBlID09IHByZXZfdGFnX3R5cGUpCi0JCXJldHVybiBjb3VudDsKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfcXVldWVfcmFtcF91cF9wZXJpb2QuYXR0ciAmJgorCSAgICAhc2Rldi0+aG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuIDA7CiAKLQlyZXR2YWwgPSBzaHQtPmNoYW5nZV9xdWV1ZV90eXBlKHNkZXYsIHRhZ190eXBlKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfcXVldWVfdHlwZS5hdHRyICYmCisJICAgICFzZGV2LT5ob3N0LT5ob3N0dC0+Y2hhbmdlX3F1ZXVlX3R5cGUpCisJCXJldHVybiBTX0lSVUdPOwogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBhdHRyLT5tb2RlOwogfQogCisvKiBEZWZhdWx0IHRlbXBsYXRlIGZvciBkZXZpY2UgYXR0cmlidXRlcy4gIE1heSBOT1QgYmUgbW9kaWZpZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzY3NpX3NkZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZGV2aWNlX2Jsb2NrZWQuYXR0ciwKKwkmZGV2X2F0dHJfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9zY3NpX2xldmVsLmF0dHIsCisJJmRldl9hdHRyX2RldmljZV9idXN5LmF0dHIsCisJJmRldl9hdHRyX3ZlbmRvci5hdHRyLAorCSZkZXZfYXR0cl9tb2RlbC5hdHRyLAorCSZkZXZfYXR0cl9yZXYuYXR0ciwKKwkmZGV2X2F0dHJfcmVzY2FuLmF0dHIsCisJJmRldl9hdHRyX2RlbGV0ZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAorCSZkZXZfYXR0cl90aW1lb3V0LmF0dHIsCisJJmRldl9hdHRyX2VoX3RpbWVvdXQuYXR0ciwKKwkmZGV2X2F0dHJfaW9jb3VudGVyYml0cy5hdHRyLAorCSZkZXZfYXR0cl9pb3JlcXVlc3RfY250LmF0dHIsCisJJmRldl9hdHRyX2lvZG9uZV9jbnQuYXR0ciwKKwkmZGV2X2F0dHJfaW9lcnJfY250LmF0dHIsCisJJmRldl9hdHRyX21vZGFsaWFzLmF0dHIsCisJJmRldl9hdHRyX3F1ZXVlX2RlcHRoLmF0dHIsCisJJmRldl9hdHRyX3F1ZXVlX3R5cGUuYXR0ciwKKwkmZGV2X2F0dHJfcXVldWVfcmFtcF91cF9wZXJpb2QuYXR0ciwKKwlSRUZfRVZUKG1lZGlhX2NoYW5nZSksCisJUkVGX0VWVChpbnF1aXJ5X2NoYW5nZV9yZXBvcnRlZCksCisJUkVGX0VWVChjYXBhY2l0eV9jaGFuZ2VfcmVwb3J0ZWQpLAorCVJFRl9FVlQoc29mdF90aHJlc2hvbGRfcmVhY2hlZCksCisJUkVGX0VWVChtb2RlX3BhcmFtZXRlcl9jaGFuZ2VfcmVwb3J0ZWQpLAorCVJFRl9FVlQobHVuX2NoYW5nZV9yZXBvcnRlZCksCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlICpzY3NpX3NkZXZfYmluX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3ZwZF9wZzgzLAorCSZkZXZfYXR0cl92cGRfcGc4MCwKKwlOVUxMCit9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2NzaV9zZGV2X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0Jc2NzaV9zZGV2X2F0dHJzLAorCS5iaW5fYXR0cnMgPQlzY3NpX3NkZXZfYmluX2F0dHJzLAorCS5pc192aXNpYmxlID0Jc2NzaV9zZGV2X2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpzY3NpX3NkZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmc2NzaV9zZGV2X2F0dHJfZ3JvdXAsCisJTlVMTAorfTsKKwogc3RhdGljIGludCBzY3NpX3RhcmdldF9hZGQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQogewogCWludCBlcnJvcjsKQEAgLTk0NiwxMCArOTg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNkZXZfYXR0cl9xdWV1ZV90eXBlX3J3ID0KLQlfX0FUVFIocXVldWVfdHlwZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcXVldWVfdHlwZV9maWVsZCwKLQkgICAgICAgc2Rldl9zdG9yZV9xdWV1ZV90eXBlX3J3KTsKLQogLyoqCiAgKiBzY3NpX3N5c2ZzX2FkZF9zZGV2IC0gYWRkIHNjc2kgZGV2aWNlIHRvIHN5c2ZzCiAgKiBAc2RldjoJc2NzaV9kZXZpY2UgdG8gYWRkCkBAIC0xMDAzLDI1ICsxMDQyLDYgQEAKIAl0cmFuc3BvcnRfYWRkX2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCXNkZXYtPmlzX3Zpc2libGUgPSAxOwogCi0JLyogY3JlYXRlIHF1ZXVlIGZpbGVzLCB3aGljaCBtYXkgYmUgd3JpdGFibGUsIGRlcGVuZGluZyBvbiB0aGUgaG9zdCAqLwotCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y2hhbmdlX3F1ZXVlX2RlcHRoKSB7Ci0JCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5zZGV2X2dlbmRldiwKLQkJCQkJICAgJnNkZXZfYXR0cl9xdWV1ZV9kZXB0aF9ydyk7Ci0JCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5zZGV2X2dlbmRldiwKLQkJCQkJICAgJnNkZXZfYXR0cl9xdWV1ZV9yYW1wX3VwX3BlcmlvZCk7Ci0JfQotCWVsc2UKLQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LCAmZGV2X2F0dHJfcXVldWVfZGVwdGgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfdHlwZSkKLQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LCAmc2Rldl9hdHRyX3F1ZXVlX3R5cGVfcncpOwotCWVsc2UKLQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LCAmZGV2X2F0dHJfcXVldWVfdHlwZSk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAllcnJvciA9IGJzZ19yZWdpc3Rlcl9xdWV1ZShycSwgJnNkZXYtPnNkZXZfZ2VuZGV2LCBOVUxMLCBOVUxMKTsKIAogCWlmIChlcnJvcikKQEAgLTEwNzEsNiArMTA5MSwxMyBAQAogCQlzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfZGVzdHJveShzZGV2KTsKIAl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoZGV2KTsKIAorCS8qCisJICogUGFpcmVkIHdpdGggdGhlIGtyZWZfZ2V0KCkgaW4gc2NzaV9zeXNmc19pbml0aWFsaXplKCkuICBXZSBoYXZlCisJICogcmVtb2VkIHN5c2ZzIHZpc2liaWxpdHkgZnJvbSB0aGUgZGV2aWNlLCBzbyBtYWtlIHRoZSB0YXJnZXQKKwkgKiBpbnZpc2libGUgaWYgdGhpcyB3YXMgdGhlIGxhc3QgZGV2aWNlIHVuZGVybmVhdGggaXQuCisJICovCisJc2NzaV90YXJnZXRfcmVhcChzY3NpX3RhcmdldChzZGV2KSk7CisKIAlwdXRfZGV2aWNlKGRldik7CiB9CiAKQEAgLTExMzMsNyArMTE2MCw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKHN0YXJnZXQtPmRldi5wYXJlbnQgPT0gZGV2IHx8ICZzdGFyZ2V0LT5kZXYgPT0gZGV2KSB7CiAJCQkvKiBhc3N1bWluZyBuZXcgdGFyZ2V0cyBhcnJpdmUgYXQgdGhlIGVuZCAqLwotCQkJc3RhcmdldC0+cmVhcF9yZWYrKzsKKwkJCWtyZWZfZ2V0KCZzdGFyZ2V0LT5yZWFwX3JlZik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJCWlmIChsYXN0KQogCQkJCXNjc2lfdGFyZ2V0X3JlYXAobGFzdCk7CkBAIC0xMjE3LDYgKzEyNDQsMTIgQEAKIAlsaXN0X2FkZF90YWlsKCZzZGV2LT5zYW1lX3RhcmdldF9zaWJsaW5ncywgJnN0YXJnZXQtPmRldmljZXMpOwogCWxpc3RfYWRkX3RhaWwoJnNkZXYtPnNpYmxpbmdzLCAmc2hvc3QtPl9fZGV2aWNlcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkZXZpY2UgY2FuIG5vdyBvbmx5IGJlIHJlbW92ZWQgdmlhIF9fc2NzaV9yZW1vdmVfZGV2aWNlKCkgc28gaG9sZAorCSAqIHRoZSB0YXJnZXQuICBUYXJnZXQgd2lsbCBiZSBoZWxkIGluIENSRUFURUQgc3RhdGUgdW50aWwgc29tZXRoaW5nCisJICogYmVuZWF0aCBpdCBiZWNvbWVzIHZpc2libGUgKGluIHdoaWNoIGNhc2UgaXQgbW92ZXMgdG8gUlVOTklORykKKwkgKi8KKwlrcmVmX2dldCgmc3RhcmdldC0+cmVhcF9yZWYpOwogfQogCiBpbnQgc2NzaV9pc19zZGV2X2RldmljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMKaW5kZXggODRhMWZkZi4uZTUxYWRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYwpAQCAtMTU1LDcgKzE1NSw4IEBACiAJX19ibGtfcHV0X3JlcXVlc3QocSwgcnEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCi0JX19zY3NpX3B1dF9jb21tYW5kKHNob3N0LCBjbWQsICZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlfX3Njc2lfcHV0X2NvbW1hbmQoc2hvc3QsIGNtZCk7CisJcHV0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2hvc3RfcHV0X2NvbW1hbmQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCmluZGV4IDQ2MjhmZDUuLmY4MDkwOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCkBAIC0yNjEsNiArMjYxLDcgQEAKIAl7IEZDX1BPUlRTUEVFRF8xMEdCSVQsCQkiMTAgR2JpdCIgfSwKIAl7IEZDX1BPUlRTUEVFRF84R0JJVCwJCSI4IEdiaXQiIH0sCiAJeyBGQ19QT1JUU1BFRURfMTZHQklULAkJIjE2IEdiaXQiIH0sCisJeyBGQ19QT1JUU1BFRURfMzJHQklULAkJIjMyIEdiaXQiIH0sCiAJeyBGQ19QT1JUU1BFRURfTk9UX05FR09USUFURUQsCSJOb3QgTmVnb3RpYXRlZCIgfSwKIH07CiBmY19iaXRmaWVsZF9uYW1lX3NlYXJjaChwb3J0X3NwZWVkLCBmY19wb3J0X3NwZWVkX25hbWVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA0NzA5NTRhLi44OWU2YzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtMTQ2Myw4ICsxNDYzLDggQEAKIAkJCXNkX3ByaW50X3NlbnNlX2hkcihzZGtwLCAmc3NoZHIpOwogCQkvKiB3ZSBuZWVkIHRvIGV2YWx1YXRlIHRoZSBlcnJvciByZXR1cm4gICovCiAJCWlmIChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikgJiYKLQkJCS8qIDB4M2EgaXMgbWVkaXVtIG5vdCBwcmVzZW50ICovCi0JCQlzc2hkci5hc2MgPT0gMHgzYSkKKwkJCShzc2hkci5hc2MgPT0gMHgzYSB8fAkvKiBtZWRpdW0gbm90IHByZXNlbnQgKi8KKwkJCSBzc2hkci5hc2MgPT0gMHgyMCkpCS8qIGludmFsaWQgY29tbWFuZCAqLwogCQkJCS8qIHRoaXMgaXMgbm8gZXJyb3IgaGVyZSAqLwogCQkJCXJldHVybiAwOwogCkBAIC0yMjgxLDcgKzIyODEsNyBAQAogCiAJc2V0X2Rpc2tfcm8oc2RrcC0+ZGlzaywgMCk7CiAJaWYgKHNkcC0+c2tpcF9tc19wYWdlXzNmKSB7Ci0JCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkFzc3VtaW5nIFdyaXRlIEVuYWJsZWRcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJBc3N1bWluZyBXcml0ZSBFbmFibGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjMxMyw3ICsyMzEzLDcgQEAKIAl9CiAKIAlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkgewotCQlzZF9wcmludGsoS0VSTl9XQVJOSU5HLCBzZGtwLAorCQlzZF9maXJzdF9wcmludGsoS0VSTl9XQVJOSU5HLCBzZGtwLAogCQkJICAiVGVzdCBXUCBmYWlsZWQsIGFzc3VtZSBXcml0ZSBFbmFibGVkXG4iKTsKIAl9IGVsc2UgewogCQlzZGtwLT53cml0ZV9wcm90ID0gKChkYXRhLmRldmljZV9zcGVjaWZpYyAmIDB4ODApICE9IDApOwpAQCAtMjM4MSw3ICsyMzgxLDggQEAKIAlpZiAoIWRhdGEuaGVhZGVyX2xlbmd0aCkgewogCQltb2RlcGFnZSA9IDY7CiAJCWZpcnN0X2xlbiA9IDA7Ci0JCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIk1pc3NpbmcgaGVhZGVyIGluIE1PREVfU0VOU0UgcmVzcG9uc2VcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsCisJCQkJIk1pc3NpbmcgaGVhZGVyIGluIE1PREVfU0VOU0UgcmVzcG9uc2VcbiIpOwogCX0KIAogCS8qIHRoYXQgd2VudCBPSywgbm93IGFzayBmb3IgdGhlIHByb3BlciBsZW5ndGggKi8KQEAgLTIzOTQsNyArMjM5NSw3IEBACiAJaWYgKGxlbiA8IDMpCiAJCWdvdG8gYmFkX3NlbnNlOwogCWVsc2UgaWYgKGxlbiA+IFNEX0JVRl9TSVpFKSB7Ci0JCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIlRydW5jYXRpbmcgbW9kZSBwYXJhbWV0ZXIgIgorCQlzZF9maXJzdF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJUcnVuY2F0aW5nIG1vZGUgcGFyYW1ldGVyICIKIAkJCSAgImRhdGEgZnJvbSAlZCB0byAlZCBieXRlc1xuIiwgbGVuLCBTRF9CVUZfU0laRSk7CiAJCWxlbiA9IFNEX0JVRl9TSVpFOwogCX0KQEAgLTI0MTcsOCArMjQxOCw5IEBACiAJCQkJLyogV2UncmUgaW50ZXJlc3RlZCBvbmx5IGluIHRoZSBmaXJzdCAzIGJ5dGVzLgogCQkJCSAqLwogCQkJCWlmIChsZW4gLSBvZmZzZXQgPD0gMikgewotCQkJCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJJbmNvbXBsZXRlICIKLQkJCQkJCSAgIm1vZGUgcGFyYW1ldGVyIGRhdGFcbiIpOworCQkJCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsCisJCQkJCQkiSW5jb21wbGV0ZSBtb2RlIHBhcmFtZXRlciAiCisJCQkJCQkJImRhdGFcbiIpOwogCQkJCQlnb3RvIGRlZmF1bHRzOwogCQkJCX0gZWxzZSB7CiAJCQkJCW1vZGVwYWdlID0gcGFnZV9jb2RlOwpAQCAtMjQzMiwxNCArMjQzNCwxNSBAQAogCQkJCWVsc2UgaWYgKCFzcGYgJiYgbGVuIC0gb2Zmc2V0ID4gMSkKIAkJCQkJb2Zmc2V0ICs9IDIgKyBidWZmZXJbb2Zmc2V0KzFdOwogCQkJCWVsc2UgewotCQkJCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJJbmNvbXBsZXRlICIKLQkJCQkJCSAgIm1vZGUgcGFyYW1ldGVyIGRhdGFcbiIpOworCQkJCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsCisJCQkJCQkJIkluY29tcGxldGUgbW9kZSAiCisJCQkJCQkJInBhcmFtZXRlciBkYXRhXG4iKTsKIAkJCQkJZ290byBkZWZhdWx0czsKIAkJCQl9CiAJCQl9CiAJCX0KIAotCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJObyBDYWNoaW5nIG1vZGUgcGFnZSBmb3VuZFxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIk5vIENhY2hpbmcgbW9kZSBwYWdlIGZvdW5kXG4iKTsKIAkJZ290byBkZWZhdWx0czsKIAogCVBhZ2VfZm91bmQ6CkBAIC0yNDUzLDcgKzI0NTYsNyBAQAogCiAJCXNka3AtPkRQT0ZVQSA9IChkYXRhLmRldmljZV9zcGVjaWZpYyAmIDB4MTApICE9IDA7CiAJCWlmIChzZGtwLT5EUE9GVUEgJiYgIXNka3AtPmRldmljZS0+dXNlXzEwX2Zvcl9ydykgewotCQkJc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLAorCQkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLAogCQkJCSAgIlVzZXMgUkVBRC9XUklURSg2KSwgZGlzYWJsaW5nIEZVQVxuIik7CiAJCQlzZGtwLT5EUE9GVUEgPSAwOwogCQl9CkBAIC0yNDc1LDE2ICsyNDc4LDE5IEBACiAJICAgIHNzaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QgJiYKIAkgICAgc3NoZHIuYXNjID09IDB4MjQgJiYgc3NoZHIuYXNjcSA9PSAweDApCiAJCS8qIEludmFsaWQgZmllbGQgaW4gQ0RCICovCi0JCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkNhY2hlIGRhdGEgdW5hdmFpbGFibGVcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJDYWNoZSBkYXRhIHVuYXZhaWxhYmxlXG4iKTsKIAllbHNlCi0JCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIkFza2luZyBmb3IgY2FjaGUgZGF0YSBmYWlsZWRcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsCisJCQkJIkFza2luZyBmb3IgY2FjaGUgZGF0YSBmYWlsZWRcbiIpOwogCiBkZWZhdWx0czoKIAlpZiAoc2RwLT53Y2VfZGVmYXVsdF9vbikgewotCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgYmFja1xuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwKKwkJCQkiQXNzdW1pbmcgZHJpdmUgY2FjaGU6IHdyaXRlIGJhY2tcbiIpOwogCQlzZGtwLT5XQ0UgPSAxOwogCX0gZWxzZSB7Ci0JCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIkFzc3VtaW5nIGRyaXZlIGNhY2hlOiB3cml0ZSB0aHJvdWdoXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLAorCQkJCSJBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhyb3VnaFxuIik7CiAJCXNka3AtPldDRSA9IDA7CiAJfQogCXNka3AtPlJDRCA9IDA7CkBAIC0yNTEzLDcgKzI1MTksNyBAQAogCiAJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykgfHwgIWRhdGEuaGVhZGVyX2xlbmd0aCB8fAogCSAgICBkYXRhLmxlbmd0aCA8IDYpIHsKLQkJc2RfcHJpbnRrKEtFUk5fV0FSTklORywgc2RrcCwKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fV0FSTklORywgc2RrcCwKIAkJCSAgImdldHRpbmcgQ29udHJvbCBtb2RlIHBhZ2UgZmFpbGVkLCBhc3N1bWUgbm8gQVRPXG4iKTsKIAogCQlpZiAoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpKQpAQCAtMjUyNSw3ICsyNTMxLDcgQEAKIAlvZmZzZXQgPSBkYXRhLmhlYWRlcl9sZW5ndGggKyBkYXRhLmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOwogCiAJaWYgKChidWZmZXJbb2Zmc2V0XSAmIDB4M2YpICE9IDB4MGEpIHsKLQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiQVRPIEdvdCB3cm9uZyBwYWdlXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiQVRPIEdvdCB3cm9uZyBwYWdlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmggYi9kcml2ZXJzL3Njc2kvc2QuaAppbmRleCAyNjg5NWZmLi42MjA4NzFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmgKKysrIGIvZHJpdmVycy9zY3NpL3NkLmgKQEAgLTEwNCw2ICsxMDQsMTIgQEAKIAkJICAgIChzZHNrKS0+ZGlzay0+ZGlza19uYW1lLCAjI2EpIDoJCQlcCiAJc2Rldl9wcmludGsocHJlZml4LCAoc2RzayktPmRldmljZSwgZm10LCAjI2EpCiAKKyNkZWZpbmUgc2RfZmlyc3RfcHJpbnRrKHByZWZpeCwgc2RzaywgZm10LCBhLi4uKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICgoc2RrcCktPmZpcnN0X3NjYW4pCQkJCQlcCisJCQlzZF9wcmludGsocHJlZml4LCBzZHNrLCBmbXQsICMjYSk7CQlcCisJfSB3aGlsZSAoMCkKKwogc3RhdGljIGlubGluZSBpbnQgc2NzaV9tZWRpdW1fYWNjZXNzX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKIHsKIAlzd2l0Y2ggKHNjbWQtPmNtbmRbMF0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZXMuYyBiL2RyaXZlcnMvc2NzaS9zZXMuYwppbmRleCBlYmExODNjLi44MGJmZWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2VzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Nlcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZW5jbG9zdXJlLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTQ0OCwyNyArNDQ5LDE4IEBACiBzdGF0aWMgdm9pZCBzZXNfbWF0Y2hfdG9fZW5jbG9zdXJlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAogCQkJCSAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKLQl1bnNpZ25lZCBjaGFyICpidWY7CiAJdW5zaWduZWQgY2hhciAqZGVzYzsKLQl1bnNpZ25lZCBpbnQgdnBkX2xlbjsKIAlzdHJ1Y3QgZWZkIGVmZCA9IHsKIAkJLmFkZHIgPSAwLAogCX07CiAKLQlidWYgPSBrbWFsbG9jKElOSVRfQUxMT0NfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYgfHwgc2NzaV9nZXRfdnBkX3BhZ2Uoc2RldiwgMHg4MywgYnVmLCBJTklUX0FMTE9DX1NJWkUpKQotCQlnb3RvIGZyZWU7Ci0KIAlzZXNfZW5jbG9zdXJlX2RhdGFfcHJvY2VzcyhlZGV2LCB0b19zY3NpX2RldmljZShlZGV2LT5lZGV2LnBhcmVudCksIDApOwogCi0JdnBkX2xlbiA9ICgoYnVmWzJdIDw8IDgpIHwgYnVmWzNdKSArIDQ7Ci0Ja2ZyZWUoYnVmKTsKLQlidWYgPSBrbWFsbG9jKHZwZF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghYnVmIHx8c2NzaV9nZXRfdnBkX3BhZ2Uoc2RldiwgMHg4MywgYnVmLCB2cGRfbGVuKSkKLQkJZ290byBmcmVlOworCWlmICghc2Rldi0+dnBkX3BnODNfbGVuKQorCQlyZXR1cm47CiAKLQlkZXNjID0gYnVmICsgNDsKLQl3aGlsZSAoZGVzYyA8IGJ1ZiArIHZwZF9sZW4pIHsKKwlkZXNjID0gc2Rldi0+dnBkX3BnODMgKyA0OworCXdoaWxlIChkZXNjIDwgc2Rldi0+dnBkX3BnODMgKyBzZGV2LT52cGRfcGc4M19sZW4pIHsKIAkJZW51bSBzY3NpX3Byb3RvY29sIHByb3RvID0gZGVzY1swXSA+PiA0OwogCQl1OCBjb2RlX3NldCA9IGRlc2NbMF0gJiAweDBmOwogCQl1OCBwaXYgPSBkZXNjWzFdICYgMHg4MDsKQEAgLTQ3OCwyNSArNDcwLDE1IEBACiAKIAkJaWYgKHBpdiAmJiBjb2RlX3NldCA9PSAxICYmIGFzc29jID09IDEKIAkJICAgICYmIHByb3RvID09IFNDU0lfUFJPVE9DT0xfU0FTICYmIHR5cGUgPT0gMyAmJiBsZW4gPT0gOCkKLQkJCWVmZC5hZGRyID0gKHU2NClkZXNjWzRdIDw8IDU2IHwKLQkJCQkodTY0KWRlc2NbNV0gPDwgNDggfAotCQkJCSh1NjQpZGVzY1s2XSA8PCA0MCB8Ci0JCQkJKHU2NClkZXNjWzddIDw8IDMyIHwKLQkJCQkodTY0KWRlc2NbOF0gPDwgMjQgfAotCQkJCSh1NjQpZGVzY1s5XSA8PCAxNiB8Ci0JCQkJKHU2NClkZXNjWzEwXSA8PCA4IHwKLQkJCQkodTY0KWRlc2NbMTFdOworCQkJZWZkLmFkZHIgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJmRlc2NbNF0pOwogCiAJCWRlc2MgKz0gbGVuICsgNDsKIAl9Ci0JaWYgKCFlZmQuYWRkcikKLQkJZ290byBmcmVlOworCWlmIChlZmQuYWRkcikgeworCQllZmQuZGV2ID0gJnNkZXYtPnNkZXZfZ2VuZGV2OwogCi0JZWZkLmRldiA9ICZzZGV2LT5zZGV2X2dlbmRldjsKLQotCWVuY2xvc3VyZV9mb3JfZWFjaF9kZXZpY2Uoc2VzX2VuY2xvc3VyZV9maW5kX2J5X2FkZHIsICZlZmQpOwotIGZyZWU6Ci0Ja2ZyZWUoYnVmKTsKKwkJZW5jbG9zdXJlX2Zvcl9lYWNoX2RldmljZShzZXNfZW5jbG9zdXJlX2ZpbmRfYnlfYWRkciwgJmVmZCk7CisJfQogfQogCiBzdGF0aWMgaW50IHNlc19pbnRmX2FkZChzdHJ1Y3QgZGV2aWNlICpjZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCBhMWQ2OTg2Li5hZmM4MzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMjE5OCwxMiArMjE5OCwxOSBAQAogCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CiAJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOwogCXN0cnVjdCBjZGV2ICpjZDAsICpjZDE7CisJc3RydWN0IGRldmljZSAqZDAsICpkMTsKIAogCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOwogCWlmICghU1RtLT5kZWZpbmVkKSB7Ci0JCWNkMCA9IFNUbS0+Y2RldnNbMF07IGNkMSA9IFNUbS0+Y2RldnNbMV07CisJCWNkMCA9IFNUbS0+Y2RldnNbMF07CisJCWNkMSA9IFNUbS0+Y2RldnNbMV07CisJCWQwICA9IFNUbS0+ZGV2c1swXTsKKwkJZDEgID0gU1RtLT5kZXZzWzFdOwogCQltZW1jcHkoU1RtLCAmKFNUcC0+bW9kZXNbMF0pLCBzaXplb2Yoc3RydWN0IHN0X21vZGVkZWYpKTsKLQkJU1RtLT5jZGV2c1swXSA9IGNkMDsgU1RtLT5jZGV2c1sxXSA9IGNkMTsKKwkJU1RtLT5jZGV2c1swXSA9IGNkMDsKKwkJU1RtLT5jZGV2c1sxXSA9IGNkMTsKKwkJU1RtLT5kZXZzWzBdICA9IGQwOworCQlTVG0tPmRldnNbMV0gID0gZDE7CiAJCW1vZGVzX2RlZmluZWQgPSAxOwogICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEluaXRpYWxpemVkIG1vZGUgJWQgZGVmaW5pdGlvbiBmcm9tIG1vZGUgMFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS90MTI4LmMgYi9kcml2ZXJzL3Njc2kvdDEyOC5jCmluZGV4IGYxZTRiNDEuLmE0YWJjZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS90MTI4LmMKKysrIGIvZHJpdmVycy9zY3NpL3QxMjguYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJICAgIGluc3RhbmNlLT5pcnEgPSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwgVDEyOF9JUlFTKTsKIAogCWlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpIAotCSAgICBpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgdDEyOF9pbnRyLCBJUlFGX0RJU0FCTEVELCAidDEyOCIsCisJICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCB0MTI4X2ludHIsIDAsICJ0MTI4IiwKIAkJCSAgICBpbnN0YW5jZSkpIHsKIAkJcHJpbnRrKCJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgCiAJCSAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jIGIvZHJpdmVycy9zY3NpL3UxNC0zNGYuYwppbmRleCA5YzIxNmU1Li41YTAzYmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCisrKyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKQEAgLTg3Myw3ICs4NzMsNyBAQAogCiAgICAvKiBCb2FyZCBkZXRlY3RlZCwgYWxsb2NhdGUgaXRzIElSUSAqLwogICAgaWYgKHJlcXVlc3RfaXJxKGlycSwgZG9faW50ZXJydXB0X2hhbmRsZXIsCi0gICAgICAgICAgICAgSVJRRl9ESVNBQkxFRCB8ICgoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwKSwKKyAgICAgICAgICAgICAoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwLAogICAgICAgICAgICAgIGRyaXZlcl9uYW1lLCAodm9pZCAqKSAmc2hhW2pdKSkgewogICAgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgZGV0YWNoaW5nLlxuIiwgbmFtZSwgaXJxKTsKICAgICAgIGdvdG8gZnJlZWxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5jIGIvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuYwppbmRleCBiOTc1NWVjLi5jODhlMTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogTGludXggZHJpdmVyIGZvciBWTXdhcmUncyBwYXJhLXZpcnR1YWxpemVkIFNDU0kgSEJBLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDE0LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAKICNpbmNsdWRlICJ2bXdfcHZzY3NpLmgiCiAKQEAgLTQ0LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfUEVSX1JJTkcJOAogI2RlZmluZSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfTVNHX1JJTkcJMQotI2RlZmluZSBQVlNDU0lfREVGQVVMVF9RVUVVRV9ERVBUSAkJNjQKKyNkZWZpbmUgUFZTQ1NJX0RFRkFVTFRfUVVFVUVfREVQVEgJCTI1NAogI2RlZmluZSBTR0xfU0laRQkJCQlQQUdFX1NJWkUKIAogc3RydWN0IHB2c2NzaV9zZ19saXN0IHsKQEAgLTYyLDYgKzYzLDcgQEAKIAlkbWFfYWRkcl90CQlkYXRhUEE7CiAJZG1hX2FkZHJfdAkJc2Vuc2VQQTsKIAlkbWFfYWRkcl90CQlzZ2xQQTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkqYWJvcnRfY21wOwogfTsKIAogc3RydWN0IHB2c2NzaV9hZGFwdGVyIHsKQEAgLTcxLDYgKzczLDcgQEAKIAlib29sCQkJCXVzZV9tc2k7CiAJYm9vbAkJCQl1c2VfbXNpeDsKIAlib29sCQkJCXVzZV9tc2c7CisJYm9vbAkJCQl1c2VfcmVxX3RocmVzaG9sZDsKIAogCXNwaW5sb2NrX3QJCQlod19sb2NrOwogCkBAIC0xMDIsMTggKzEwNSwyMiBAQAogCiAKIC8qIENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IHB2c2NzaV9yaW5nX3BhZ2VzICAgICA9IFBWU0NTSV9ERUZBVUxUX05VTV9QQUdFU19QRVJfUklORzsKK3N0YXRpYyBpbnQgcHZzY3NpX3JpbmdfcGFnZXM7CiBzdGF0aWMgaW50IHB2c2NzaV9tc2dfcmluZ19wYWdlcyA9IFBWU0NTSV9ERUZBVUxUX05VTV9QQUdFU19NU0dfUklORzsKIHN0YXRpYyBpbnQgcHZzY3NpX2NtZF9wZXJfbHVuICAgID0gUFZTQ1NJX0RFRkFVTFRfUVVFVUVfREVQVEg7CiBzdGF0aWMgYm9vbCBwdnNjc2lfZGlzYWJsZV9tc2k7CiBzdGF0aWMgYm9vbCBwdnNjc2lfZGlzYWJsZV9tc2l4Owogc3RhdGljIGJvb2wgcHZzY3NpX3VzZV9tc2cgICAgICAgPSB0cnVlOworc3RhdGljIGJvb2wgcHZzY3NpX3VzZV9yZXFfdGhyZXNob2xkID0gdHJ1ZTsKIAogI2RlZmluZSBQVlNDU0lfUlcgKFNfSVJVU1IgfCBTX0lXVVNSKQogCiBtb2R1bGVfcGFyYW1fbmFtZWQocmluZ19wYWdlcywgcHZzY3NpX3JpbmdfcGFnZXMsIGludCwgUFZTQ1NJX1JXKTsKIE1PRFVMRV9QQVJNX0RFU0MocmluZ19wYWdlcywgIk51bWJlciBvZiBwYWdlcyBwZXIgcmVxL2NtcCByaW5nIC0gKGRlZmF1bHQ9IgotCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HKSAiKSIpOworCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HKQorCQkgIlt1cCB0byAxNiB0YXJnZXRzXSwiCisJCSBfX3N0cmluZ2lmeShQVlNDU0lfU0VUVVBfUklOR1NfTUFYX05VTV9QQUdFUykKKwkJICJbZm9yIDE2KyB0YXJnZXRzXSkiKTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKG1zZ19yaW5nX3BhZ2VzLCBwdnNjc2lfbXNnX3JpbmdfcGFnZXMsIGludCwgUFZTQ1NJX1JXKTsKIE1PRFVMRV9QQVJNX0RFU0MobXNnX3JpbmdfcGFnZXMsICJOdW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBtc2cgcmluZyAtIChkZWZhdWx0PSIKQEAgLTEyMSw3ICsxMjgsNyBAQAogCiBtb2R1bGVfcGFyYW1fbmFtZWQoY21kX3Blcl9sdW4sIHB2c2NzaV9jbWRfcGVyX2x1biwgaW50LCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyhjbWRfcGVyX2x1biwgIk1heGltdW0gY29tbWFuZHMgcGVyIGx1biAtIChkZWZhdWx0PSIKLQkJIF9fc3RyaW5naWZ5KFBWU0NTSV9NQVhfUkVRX1FVRVVFX0RFUFRIKSAiKSIpOworCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfUVVFVUVfREVQVEgpICIpIik7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX21zaSwgcHZzY3NpX2Rpc2FibGVfbXNpLCBib29sLCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX21zaSwgIkRpc2FibGUgTVNJIHVzZSBpbiBkcml2ZXIgLSAoZGVmYXVsdD0wKSIpOwpAQCAtMTMyLDYgKzEzOSwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9tc2csIHB2c2NzaV91c2VfbXNnLCBib29sLCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyh1c2VfbXNnLCAiVXNlIG1zZyByaW5nIHdoZW4gYXZhaWxhYmxlIC0gKGRlZmF1bHQ9MSkiKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9yZXFfdGhyZXNob2xkLCBwdnNjc2lfdXNlX3JlcV90aHJlc2hvbGQsCisJCSAgIGJvb2wsIFBWU0NTSV9SVyk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9yZXFfdGhyZXNob2xkLCAiVXNlIGRyaXZlci1iYXNlZCByZXF1ZXN0IGNvYWxlc2NpbmcgaWYgY29uZmlndXJlZCAtIChkZWZhdWx0PTEpIik7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwdnNjc2lfcGNpX3RibFtdID0gewogCXsgUENJX1ZERVZJQ0UoVk1XQVJFLCBQQ0lfREVWSUNFX0lEX1ZNV0FSRV9QVlNDU0kpIH0sCiAJeyAwIH0KQEAgLTE3Nyw2ICsxODgsNyBAQAogCQkJCSAgIHN0cnVjdCBwdnNjc2lfY3R4ICpjdHgpCiB7CiAJY3R4LT5jbWQgPSBOVUxMOworCWN0eC0+YWJvcnRfY21wID0gTlVMTDsKIAlsaXN0X2FkZCgmY3R4LT5saXN0LCAmYWRhcHRlci0+Y21kX3Bvb2wpOwogfQogCkBAIC0yODAsMTAgKzI5MiwxNSBAQAogc3RhdGljIHZvaWQgcHZzY3NpX2tpY2tfaW8oY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgdW5zaWduZWQgY2hhciBvcCkKIHsKLQlpZiAoc2NzaV9pc19ydyhvcCkpCi0JCXB2c2NzaV9raWNrX3J3X2lvKGFkYXB0ZXIpOwotCWVsc2UKKwlpZiAoc2NzaV9pc19ydyhvcCkpIHsKKwkJc3RydWN0IFBWU0NTSVJpbmdzU3RhdGUgKnMgPSBhZGFwdGVyLT5yaW5nc19zdGF0ZTsKKworCQlpZiAoIWFkYXB0ZXItPnVzZV9yZXFfdGhyZXNob2xkIHx8CisJCSAgICBzLT5yZXFQcm9kSWR4IC0gcy0+cmVxQ29uc0lkeCA+PSBzLT5yZXFDYWxsVGhyZXNob2xkKQorCQkJcHZzY3NpX2tpY2tfcndfaW8oYWRhcHRlcik7CisJfSBlbHNlIHsKIAkJcHZzY3NpX3Byb2Nlc3NfcmVxdWVzdF9yaW5nKGFkYXB0ZXIpOworCX0KIH0KIAogc3RhdGljIHZvaWQgbGxfYWRhcHRlcl9yZXNldChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00ODcsNiArNTA0LDM1IEBACiAJfQogfQogCitzdGF0aWMgaW50IHB2c2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgaW50IHFkZXB0aCwKKwkJCQkgICAgIGludCByZWFzb24pCit7CisJaW50IG1heF9kZXB0aDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CisKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCS8qCisJCSAqIFdlIHN1cHBvcnQgb25seSBjaGFuZ2luZyBkZWZhdWx0LgorCQkgKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWF4X2RlcHRoID0gc2hvc3QtPmNhbl9xdWV1ZTsKKwlpZiAoIXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCW1heF9kZXB0aCA9IDE7CisJaWYgKHFkZXB0aCA+IG1heF9kZXB0aCkKKwkJcWRlcHRoID0gbWF4X2RlcHRoOworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCisJaWYgKHNkZXYtPmlucXVpcnlfbGVuID4gNykKKwkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LAorCQkJICAgICJxZGVwdGgoJWQpLCB0YWdnZWQoJWQpLCBzaW1wbGUoJWQpLCBvcmRlcmVkKCVkKSwgc2NzaV9sZXZlbCglZCksIGNtZF9xdWUoJWQpXG4iLAorCQkJICAgIHNkZXYtPnF1ZXVlX2RlcHRoLCBzZGV2LT50YWdnZWRfc3VwcG9ydGVkLAorCQkJICAgIHNkZXYtPnNpbXBsZV90YWdzLCBzZGV2LT5vcmRlcmVkX3RhZ3MsCisJCQkgICAgc2Rldi0+c2NzaV9sZXZlbCwgKHNkZXYtPmlucXVpcnlbN10gJiAyKSA+PiAxKTsKKwlyZXR1cm4gc2Rldi0+cXVldWVfZGVwdGg7Cit9CisKIC8qCiAgKiBQdWxsIGEgY29tcGxldGlvbiBkZXNjcmlwdG9yIG9mZiBhbmQgcGFzcyB0aGUgY29tcGxldGlvbiBiYWNrCiAgKiB0byB0aGUgU0NTSSBtaWQgbGF5ZXIuCkBAIC00OTYsMTUgKzU0MiwyNyBAQAogewogCXN0cnVjdCBwdnNjc2lfY3R4ICpjdHg7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBjb21wbGV0aW9uICphYm9ydF9jbXA7CiAJdTMyIGJ0c3RhdCA9IGUtPmhvc3RTdGF0dXM7CiAJdTMyIHNkc3RhdCA9IGUtPnNjc2lTdGF0dXM7CiAKIAljdHggPSBwdnNjc2lfZ2V0X2NvbnRleHQoYWRhcHRlciwgZS0+Y29udGV4dCk7CiAJY21kID0gY3R4LT5jbWQ7CisJYWJvcnRfY21wID0gY3R4LT5hYm9ydF9jbXA7CiAJcHZzY3NpX3VubWFwX2J1ZmZlcnMoYWRhcHRlciwgY3R4KTsKIAlwdnNjc2lfcmVsZWFzZV9jb250ZXh0KGFkYXB0ZXIsIGN0eCk7Ci0JY21kLT5yZXN1bHQgPSAwOworCWlmIChhYm9ydF9jbXApIHsKKwkJLyoKKwkJICogVGhlIGNvbW1hbmQgd2FzIHJlcXVlc3RlZCB0byBiZSBhYm9ydGVkLiBKdXN0IHNpZ25hbCB0aGF0CisJCSAqIHRoZSByZXF1ZXN0IGNvbXBsZXRlZCBhbmQgc3dhbGxvdyB0aGUgYWN0dWFsIGNtZCBjb21wbGV0aW9uCisJCSAqIGhlcmUuIFRoZSBhYm9ydCBoYW5kbGVyIHdpbGwgcG9zdCBhIGNvbXBsZXRpb24gZm9yIHRoaXMKKwkJICogY29tbWFuZCBpbmRpY2F0aW5nIHRoYXQgaXQgZ290IHN1Y2Nlc3NmdWxseSBhYm9ydGVkLgorCQkgKi8KKwkJY29tcGxldGUoYWJvcnRfY21wKTsKKwkJcmV0dXJuOworCX0KIAorCWNtZC0+cmVzdWx0ID0gMDsKIAlpZiAoc2RzdGF0ICE9IFNBTV9TVEFUX0dPT0QgJiYKIAkgICAgKGJ0c3RhdCA9PSBCVFNUQVRfU1VDQ0VTUyB8fAogCSAgICAgYnRzdGF0ID09IEJUU1RBVF9MSU5LRURfQ09NTUFORF9DT01QTEVURUQgfHwKQEAgLTcyNiw2ICs3ODQsOCBAQAogCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCXN0cnVjdCBwdnNjc2lfY3R4ICpjdHg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWx0ID0gU1VDQ0VTUzsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhhYm9ydF9jbXApOwogCiAJc2NtZF9wcmludGsoS0VSTl9ERUJVRywgY21kLCAidGFzayBhYm9ydCBvbiBob3N0ICV1LCAlcFxuIiwKIAkJICAgIGFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8sIGNtZCk7CkBAIC03NDgsMTMgKzgwOCw0MCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwdnNjc2lfYWJvcnRfY21kKGFkYXB0ZXIsIGN0eCk7CisJLyoKKwkgKiBNYXJrIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIGJlIGFib3J0ZWQgYW5kIGlzc3VlCisJICogdGhlIGFib3J0LgorCSAqLworCWN0eC0+YWJvcnRfY21wID0gJmFib3J0X2NtcDsKIAotCXB2c2NzaV9wcm9jZXNzX2NvbXBsZXRpb25fcmluZyhhZGFwdGVyKTsKKwlwdnNjc2lfYWJvcnRfY21kKGFkYXB0ZXIsIGN0eCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCS8qIFdhaXQgZm9yIDIgc2VjcyBmb3IgdGhlIGNvbXBsZXRpb24uICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhYm9ydF9jbXAsIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisKKwlpZiAoIWNvbXBsZXRpb25fZG9uZSgmYWJvcnRfY21wKSkgeworCQkvKgorCQkgKiBGYWlsZWQgdG8gYWJvcnQgdGhlIGNvbW1hbmQsIHVubWFyayB0aGUgZmFjdCB0aGF0IGl0CisJCSAqIHdhcyByZXF1ZXN0ZWQgdG8gYmUgYWJvcnRlZC4KKwkJICovCisJCWN0eC0+YWJvcnRfY21wID0gTlVMTDsKKwkJcmVzdWx0ID0gRkFJTEVEOworCQlzY21kX3ByaW50ayhLRVJOX0RFQlVHLCBjbWQsCisJCQkgICAgIkZhaWxlZCB0byBnZXQgY29tcGxldGlvbiBmb3IgYWJvcnRlZCBjbWQgJXBcbiIsCisJCQkgICAgY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTdWNjZXNzZnVsbHkgYWJvcnRlZCB0aGUgY29tbWFuZC4KKwkgKi8KKwljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIFNVQ0NFU1M7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTkxMSw2ICs5OTgsNyBAQAogCS5kbWFfYm91bmRhcnkJCQk9IFVJTlRfTUFYLAogCS5tYXhfc2VjdG9ycwkJCT0gMHhmZmZmLAogCS51c2VfY2x1c3RlcmluZwkJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAkJPSBwdnNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoLAogCS5laF9hYm9ydF9oYW5kbGVyCQk9IHB2c2NzaV9hYm9ydCwKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBwdnNjc2lfZGV2aWNlX3Jlc2V0LAogCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBwdnNjc2lfYnVzX3Jlc2V0LApAQCAtMTAzNCw2ICsxMTIyLDM0IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBib29sIHB2c2NzaV9zZXR1cF9yZXFfdGhyZXNob2xkKHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgICBib29sIGVuYWJsZSkKK3sKKwl1MzIgdmFsOworCisJaWYgKCFwdnNjc2lfdXNlX3JlcV90aHJlc2hvbGQpCisJCXJldHVybiBmYWxzZTsKKworCXB2c2NzaV9yZWdfd3JpdGUoYWRhcHRlciwgUFZTQ1NJX1JFR19PRkZTRVRfQ09NTUFORCwKKwkJCSBQVlNDU0lfQ01EX1NFVFVQX1JFUUNBTExUSFJFU0hPTEQpOworCXZhbCA9IHB2c2NzaV9yZWdfcmVhZChhZGFwdGVyLCBQVlNDU0lfUkVHX09GRlNFVF9DT01NQU5EX1NUQVRVUyk7CisJaWYgKHZhbCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ2bXdfcHZzY3NpOiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCByZXFfdGhyZXNob2xkXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCXN0cnVjdCBQVlNDU0lDbWREZXNjU2V0dXBSZXFDYWxsIGNtZF9tc2cgPSB7IDAgfTsKKwkJY21kX21zZy5lbmFibGUgPSBlbmFibGU7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJ2bXdfcHZzY3NpOiAlc2FibGluZyByZXFDYWxsVGhyZXNob2xkXG4iLAorCQkJZW5hYmxlID8gImVuIiA6ICJkaXMiKTsKKwkJcHZzY3NpX3dyaXRlX2NtZF9kZXNjKGFkYXB0ZXIsCisJCQkJICAgICAgUFZTQ1NJX0NNRF9TRVRVUF9SRVFDQUxMVEhSRVNIT0xELAorCQkJCSAgICAgICZjbWRfbXNnLCBzaXplb2YoY21kX21zZykpOworCQlyZXR1cm4gcHZzY3NpX3JlZ19yZWFkKGFkYXB0ZXIsCisJCQkJICAgICAgIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfU1RBVFVTKSAhPSAwOworCX0KK30KKwogc3RhdGljIGlycXJldHVybl90IHB2c2NzaV9pc3IoaW50IGlycSwgdm9pZCAqZGV2cCkKIHsKIAlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZwOwpAQCAtMTIzNiwxMSArMTM1MiwxMiBAQAogc3RhdGljIGludCBwdnNjc2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHB2c2NzaV9hZGFwdGVyIGFkYXB0ZXJfdGVtcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgZXJyb3I7CisJdTMyIG1heF9pZDsKIAogCWVycm9yID0gLUVOT0RFVjsKIApAQCAtMTI1OCwzNCArMTM3NSwxOSBAQAogCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIAl9CiAKLQlwdnNjc2lfdGVtcGxhdGUuY2FuX3F1ZXVlID0KLQkJbWluKFBWU0NTSV9NQVhfTlVNX1BBR0VTX1JFUV9SSU5HLCBwdnNjc2lfcmluZ19wYWdlcykgKgotCQlQVlNDU0lfTUFYX05VTV9SRVFfRU5UUklFU19QRVJfUEFHRTsKLQlwdnNjc2lfdGVtcGxhdGUuY21kX3Blcl9sdW4gPQotCQltaW4ocHZzY3NpX3RlbXBsYXRlLmNhbl9xdWV1ZSwgcHZzY3NpX2NtZF9wZXJfbHVuKTsKLQlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwdnNjc2lfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIpKTsKLQlpZiAoIWhvc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBmYWlsZWQgdG8gYWxsb2NhdGUgaG9zdFxuIik7Ci0JCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwotCX0KLQotCWFkYXB0ZXIgPSBzaG9zdF9wcml2KGhvc3QpOworCS8qCisJICogTGV0J3MgdXNlIGEgdGVtcCBwdnNjc2lfYWRhcHRlciBzdHJ1Y3QgdW50aWwgd2UgZmluZCB0aGUgbnVtYmVyIG9mCisJICogdGFyZ2V0cyBvbiB0aGUgYWRhcHRlciwgYWZ0ZXIgdGhhdCB3ZSB3aWxsIHN3aXRjaCB0byB0aGUgcmVhbAorCSAqIGFsbG9jYXRlZCBzdHJ1Y3QuCisJICovCisJYWRhcHRlciA9ICZhZGFwdGVyX3RlbXA7CiAJbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZigqYWRhcHRlcikpOwogCWFkYXB0ZXItPmRldiAgPSBwZGV2OwotCWFkYXB0ZXItPmhvc3QgPSBob3N0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmh3X2xvY2spOwotCi0JaG9zdC0+bWF4X2NoYW5uZWwgPSAwOwotCWhvc3QtPm1heF9pZCAgICAgID0gMTY7Ci0JaG9zdC0+bWF4X2x1biAgICAgPSAxOwotCWhvc3QtPm1heF9jbWRfbGVuID0gMTY7Ci0KIAlhZGFwdGVyLT5yZXYgPSBwZGV2LT5yZXZpc2lvbjsKIAogCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJ2bXdfcHZzY3NpIikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBwY2kgbWVtb3J5IHNlbGVjdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9mcmVlX2hvc3Q7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewpAQCAtMTMwMSw3ICsxNDAzLDcgQEAKIAlpZiAoaSA9PSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAidm13X3B2c2NzaTogYWRhcHRlciBoYXMgbm8gc3VpdGFibGUgTU1JTyByZWdpb25cbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlczsKKwkJZ290byBvdXRfcmVsZWFzZV9yZXNvdXJjZXNfYW5kX2Rpc2FibGU7CiAJfQogCiAJYWRhcHRlci0+bW1pb0Jhc2UgPSBwY2lfaW9tYXAocGRldiwgaSwgUFZTQ1NJX01FTV9TUEFDRV9TSVpFKTsKQEAgLTEzMTAsMTAgKzE0MTIsNjAgQEAKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAidm13X3B2c2NzaTogY2FuJ3QgaW9tYXAgZm9yIEJBUiAlZCBtZW1zaXplICVsdVxuIiwKIAkJICAgICAgIGksIFBWU0NTSV9NRU1fU1BBQ0VfU0laRSk7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVzb3VyY2VzOworCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlc19hbmRfZGlzYWJsZTsKIAl9CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qCisJICogQXNrIHRoZSBkZXZpY2UgZm9yIG1heCBudW1iZXIgb2YgdGFyZ2V0cyBiZWZvcmUgZGVjaWRpbmcgdGhlCisJICogZGVmYXVsdCBwdnNjc2lfcmluZ19wYWdlcyB2YWx1ZS4KKwkgKi8KKwltYXhfaWQgPSBwdnNjc2lfZ2V0X21heF90YXJnZXRzKGFkYXB0ZXIpOworCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IG1heF9pZDogJXVcbiIsIG1heF9pZCk7CisKKwlpZiAocHZzY3NpX3JpbmdfcGFnZXMgPT0gMCkKKwkJLyoKKwkJICogU2V0IHRoZSByaWdodCBkZWZhdWx0IHZhbHVlLiBVcCB0byAxNiBpdCBpcyA4LCBhYm92ZSBpdCBpcworCQkgKiBtYXguCisJCSAqLworCQlwdnNjc2lfcmluZ19wYWdlcyA9IChtYXhfaWQgPiAxNikgPworCQkJUFZTQ1NJX1NFVFVQX1JJTkdTX01BWF9OVU1fUEFHRVMgOgorCQkJUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgInZtd19wdnNjc2k6IHNldHRpbmcgcmluZ19wYWdlcyB0byAlZFxuIiwKKwkgICAgICAgcHZzY3NpX3JpbmdfcGFnZXMpOworCisJcHZzY3NpX3RlbXBsYXRlLmNhbl9xdWV1ZSA9CisJCW1pbihQVlNDU0lfTUFYX05VTV9QQUdFU19SRVFfUklORywgcHZzY3NpX3JpbmdfcGFnZXMpICoKKwkJUFZTQ1NJX01BWF9OVU1fUkVRX0VOVFJJRVNfUEVSX1BBR0U7CisJcHZzY3NpX3RlbXBsYXRlLmNtZF9wZXJfbHVuID0KKwkJbWluKHB2c2NzaV90ZW1wbGF0ZS5jYW5fcXVldWUsIHB2c2NzaV9jbWRfcGVyX2x1bik7CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcHZzY3NpX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IHB2c2NzaV9hZGFwdGVyKSk7CisJaWYgKCFob3N0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidm13X3B2c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIGhvc3RcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlc19hbmRfZGlzYWJsZTsKKwl9CisKKwkvKgorCSAqIExldCdzIHVzZSB0aGUgcmVhbCBwdnNjc2lfYWRhcHRlciBzdHJ1Y3QgaGVyZSBvbndhcmRzLgorCSAqLworCWFkYXB0ZXIgPSBzaG9zdF9wcml2KGhvc3QpOworCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2YoKmFkYXB0ZXIpKTsKKwlhZGFwdGVyLT5kZXYgID0gcGRldjsKKwlhZGFwdGVyLT5ob3N0ID0gaG9zdDsKKwkvKgorCSAqIENvcHkgYmFjayB3aGF0IHdlIGFscmVhZHkgaGF2ZSB0byB0aGUgYWxsb2NhdGVkIGFkYXB0ZXIgc3RydWN0LgorCSAqLworCWFkYXB0ZXItPnJldiA9IGFkYXB0ZXJfdGVtcC5yZXY7CisJYWRhcHRlci0+bW1pb0Jhc2UgPSBhZGFwdGVyX3RlbXAubW1pb0Jhc2U7CisKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+aHdfbG9jayk7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCWhvc3QtPm1heF9sdW4gICAgID0gMTsKKwlob3N0LT5tYXhfY21kX2xlbiA9IDE2OworCWhvc3QtPm1heF9pZCAgICAgID0gbWF4X2lkOworCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCiAJbGxfYWRhcHRlcl9yZXNldChhZGFwdGVyKTsKQEAgLTEzMjcsMTMgKzE0NzksNiBAQAogCX0KIAogCS8qCi0JICogQXNrIHRoZSBkZXZpY2UgZm9yIG1heCBudW1iZXIgb2YgdGFyZ2V0cy4KLQkgKi8KLQlob3N0LT5tYXhfaWQgPSBwdnNjc2lfZ2V0X21heF90YXJnZXRzKGFkYXB0ZXIpOwotCWRldiA9IHB2c2NzaV9kZXYoYWRhcHRlcik7Ci0JZGV2X2luZm8oZGV2LCAidm13X3B2c2NzaTogaG9zdC0+bWF4X2lkOiAldVxuIiwgaG9zdC0+bWF4X2lkKTsKLQotCS8qCiAJICogRnJvbSB0aGlzIHBvaW50IG9uIHdlIHNob3VsZCByZXNldCB0aGUgYWRhcHRlciBpZiBhbnl0aGluZyBnb2VzCiAJICogd3JvbmcuCiAJICovCkBAIC0xMzczLDYgKzE1MTgsMTAgQEAKIAkJZmxhZ3MgPSBJUlFGX1NIQVJFRDsKIAl9CiAKKwlhZGFwdGVyLT51c2VfcmVxX3RocmVzaG9sZCA9IHB2c2NzaV9zZXR1cF9yZXFfdGhyZXNob2xkKGFkYXB0ZXIsIHRydWUpOworCXByaW50ayhLRVJOX0RFQlVHICJ2bXdfcHZzY3NpOiBkcml2ZXItYmFzZWQgcmVxdWVzdCBjb2FsZXNjaW5nICVzYWJsZWRcbiIsCisJICAgICAgIGFkYXB0ZXItPnVzZV9yZXFfdGhyZXNob2xkID8gImVuIiA6ICJkaXMiKTsKKwogCWVycm9yID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+aXJxLCBwdnNjc2lfaXNyLCBmbGFncywKIAkJCSAgICAidm13X3B2c2NzaSIsIGFkYXB0ZXIpOwogCWlmIChlcnJvcikgewpAQCAtMTQwMiwxMiArMTU1MSwxNSBAQAogCWxsX2FkYXB0ZXJfcmVzZXQoYWRhcHRlcik7CiBvdXRfcmVsZWFzZV9yZXNvdXJjZXM6CiAJcHZzY3NpX3JlbGVhc2VfcmVzb3VyY2VzKGFkYXB0ZXIpOwotb3V0X2ZyZWVfaG9zdDoKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwogb3V0X2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiBlcnJvcjsKKworb3V0X3JlbGVhc2VfcmVzb3VyY2VzX2FuZF9kaXNhYmxlOgorCXB2c2NzaV9yZWxlYXNlX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIH0KIAogc3RhdGljIHZvaWQgX19wdnNjc2lfc2h1dGRvd24oc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaCBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmgKaW5kZXggMzU0NmU4Ni4uY2U0NTg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFZNd2FyZSBQVlNDU0kgaGVhZGVyIGZpbGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNCwgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2RlZmluZSBQVlNDU0lfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMC4yLjAtayIKKyNkZWZpbmUgUFZTQ1NJX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjAuNS4wLWsiCiAKICNkZWZpbmUgUFZTQ1NJX01BWF9OVU1fU0dfRU5UUklFU19QRVJfU0VHTUVOVCAxMjgKIApAQCAtMTE3LDggKzExNyw5IEBACiAJUFZTQ1NJX0NNRF9DT05GSUcgICAgICAgICAgICA9IDcsCiAJUFZTQ1NJX0NNRF9TRVRVUF9NU0dfUklORyAgICA9IDgsCiAJUFZTQ1NJX0NNRF9ERVZJQ0VfVU5QTFVHICAgICA9IDksCisJUFZTQ1NJX0NNRF9TRVRVUF9SRVFDQUxMVEhSRVNIT0xEICAgICA9IDEwLAogCi0JUFZTQ1NJX0NNRF9MQVNUICAgICAgICAgICAgICA9IDEwICAvKiBoYXMgdG8gYmUgbGFzdCAqLworCVBWU0NTSV9DTURfTEFTVCAgICAgICAgICAgICAgPSAxMSAgLyogaGFzIHRvIGJlIGxhc3QgKi8KIH07CiAKIC8qCkBAIC0xNDEsNiArMTQyLDE0IEBACiAJdTMyIF9wYWQ7CiB9IF9fcGFja2VkOwogCisvKgorICogQ29tbWFuZCBkZXNjcmlwdG9yIGZvciBQVlNDU0lfQ01EX1NFVFVQX1JFUUNBTExUSFJFU0hPTEQgLS0KKyAqLworCitzdHJ1Y3QgUFZTQ1NJQ21kRGVzY1NldHVwUmVxQ2FsbCB7CisJdTMyIGVuYWJsZTsKK30gX19wYWNrZWQ7CisKIGVudW0gUFZTQ1NJQ29uZmlnUGFnZVR5cGUgewogCVBWU0NTSV9DT05GSUdfUEFHRV9DT05UUk9MTEVSID0gMHgxOTU4LAogCVBWU0NTSV9DT05GSUdfUEFHRV9QSFkgICAgICAgID0gMHgxOTU5LApAQCAtMjYxLDcgKzI3MCw5IEBACiAJdTMyCWNtcENvbnNJZHg7CiAJdTMyCWNtcE51bUVudHJpZXNMb2cyOwogCi0JdTgJX3BhZFsxMDRdOworCXUzMglyZXFDYWxsVGhyZXNob2xkOworCisJdTgJX3BhZFsxMDBdOwogCiAJdTMyCW1zZ1Byb2RJZHg7CiAJdTMyCW1zZ0NvbnNJZHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKaW5kZXggZjlhNmU0Yi4uMzI2NzQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAotCWlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIHdkNzAwMF9pbnRyLCBJUlFGX0RJU0FCTEVELCAid2Q3MDAwIiwgaG9zdCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCB3ZDcwMDBfaW50ciwgMCwgIndkNzAwMCIsIGhvc3QpKSB7CiAJCXByaW50aygid2Q3MDAwX2luaXQ6IGNhbid0IGdldCBJUlEgJWQuXG4iLCBob3N0LT5pcnEpOwogCQlyZXR1cm4gKDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IDU4MWVlMmEuLmVmZTE5NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIGNvbmZpZyBTUElfQ0xQUzcxMVgKIAl0cmlzdGF0ZSAiQ0xQUzcxMVggaG9zdCBTUEkgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSQ0hfQ0xQUzcxMVgKKwlkZXBlbmRzIG9uIEFSQ0hfQ0xQUzcxMVggfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIGRlZGljYXRlZCBnZW5lcmFsIHB1cnBvc2UgU1BJL01pY3Jvd2lyZTEtY29tcGF0aWJsZQogCSAgbWFzdGVyIG1vZGUgaW50ZXJmYWNlIChTU0kxKSBmb3IgQ0xQUzcxMVgtYmFzZWQgQ1BVcy4KQEAgLTIxMiw3ICsyMTIsNiBAQAogCXRyaXN0YXRlICJGcmVlc2NhbGUgaS5NWCBTUEkgY29udHJvbGxlcnMiCiAJZGVwZW5kcyBvbiBBUkNIX01YQyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU1BJX0JJVEJBTkcKLQlkZWZhdWx0IG0gaWYgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgRnJlZXNjYWxlIGkuTVggU1BJIGNvbnRyb2xsZXJzIGluIG1hc3RlcgogCSAgbW9kZS4KQEAgLTI3MCw2ICsyNjksNyBAQAogY29uZmlnIFNQSV9GU0xfRFNQSQogCXRyaXN0YXRlICJGcmVlc2NhbGUgRFNQSSBjb250cm9sbGVyIgogCXNlbGVjdCBTUElfQklUQkFORworCXNlbGVjdCBSRUdNQVBfTU1JTwogCWRlcGVuZHMgb24gU09DX1ZGNjEwIHx8IENPTVBJTEVfVEVTVAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIERTUEkgY29udHJvbGxlciBpbiBtYXN0ZXIKQEAgLTMwNyw3ICszMDcsNyBAQAogCiBjb25maWcgU1BJX09NQVAyNFhYCiAJdHJpc3RhdGUgIk1jU1BJIGRyaXZlciBmb3IgT01BUCIKLQlkZXBlbmRzIG9uIEFSTSB8fCBBUk02NCB8fCBBVlIzMiB8fCBIRVhBR09OIHx8IE1JUFMgfHwgU0gKKwlkZXBlbmRzIG9uIEFSTSB8fCBBUk02NCB8fCBBVlIzMiB8fCBIRVhBR09OIHx8IE1JUFMgfHwgU1VQRVJICiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIE9NQVAyNFhYIGFuZCBsYXRlciBNdWx0aWNoYW5uZWwgU1BJCkBAIC0zODEsNiArMzgxLDE5IEBACiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgUmVuZXNhcyBSU1BJIGFuZCBRU1BJIGJsb2Nrcy4KIAorY29uZmlnIFNQSV9RVVAKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gU1BJIGNvbnRyb2xsZXIgd2l0aCBRVVAgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gQVJDSF9NU01fRFQgfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCisJaGVscAorCSAgUXVhbGNvbW0gVW5pdmVyc2FsIFBlcmlwaGVyYWwgKFFVUCkgY29yZSBpcyBhbiBBSEIgc2xhdmUgdGhhdAorCSAgcHJvdmlkZXMgYSBjb21tb24gZGF0YSBwYXRoIChhbiBvdXRwdXQgRklGTyBhbmQgYW4gaW5wdXQgRklGTykKKwkgIGZvciBzZXJpYWwgcGVyaXBoZXJhbCBpbnRlcmZhY2UgKFNQSSkgbWluaS1jb3JlLiBTUEkgaW4gbWFzdGVyCisJICBtb2RlIHN1cHBvcnRzIHVwIHRvIDUwTUh6LCB1cCB0byBmb3VyIGNoaXAgc2VsZWN0cywgcHJvZ3JhbW1hYmxlCisJICBkYXRhIHBhdGggZnJvbSA0IGJpdHMgdG8gMzIgYml0cyBhbmQgbnVtZXJvdXMgcHJvdG9jb2wgdmFyaWFudHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNwaV9xdXAuCisKIGNvbmZpZyBTUElfUzNDMjRYWAogCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0WFggc2VyaWVzIFNQSSIKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjRYWApAQCAtNDE2LDcgKzQyOSw2IEBACiAJdHJpc3RhdGUgIlN1cGVySCBNU0lPRiBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEhBVkVfQ0xLCiAJZGVwZW5kcyBvbiBTVVBFUkggfHwgQVJDSF9TSE1PQklMRSB8fCBDT01QSUxFX1RFU1QKLQlzZWxlY3QgU1BJX0JJVEJBTkcKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBTdXBlckggYW5kIFNIIE1vYmlsZSBNU0lPRiBibG9ja3MuCiAKQEAgLTQ0Niw2ICs0NTgsMTkgQEAKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBDU1IgU2lSRnByaW1hSUkgU29DcwogCitjb25maWcgU1BJX1NVTjRJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBBMTAgU29DcyBTUEkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgQWxsd2lubmVyIHN1bjRpLCBzdW41aSBhbmQgc3VuN2kgU29DcworCitjb25maWcgU1BJX1NVTjZJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBBMzEgU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gUkVTRVRfQ09OVFJPTExFUgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgU1BJIGNvbnRyb2xsZXIgb24gdGhlIEFsbHdpbm5lciBBMzEgU29Dcy4KKwogY29uZmlnIFNQSV9NWFMKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1YUyBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfTVhTCkBAIC00NzgsMTMgKzUwMyw2IEBACiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgTnZpZGlhIFRlZ3JhMjAvVGVncmEzMCBTTElOSyBDb250cm9sbGVyIGludGVyZmFjZS4KIAotY29uZmlnIFNQSV9USV9TU1AKLQl0cmlzdGF0ZSAiVEkgU2VxdWVuY2VyIFNlcmlhbCBQb3J0IC0gU1BJIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNRkRfVElfU1NQCi0JaGVscAotCSAgVGhpcyBzZWxlY3RzIGFuIFNQSSBtYXN0ZXIgaW1wbGVtZW50YXRpb24gdXNpbmcgYSBUSSBzZXF1ZW5jZXIKLQkgIHNlcmlhbCBwb3J0LgotCiBjb25maWcgU1BJX1RPUENMSUZGX1BDSAogCXRyaXN0YXRlICJJbnRlbCBFRzIwVCBQQ0gvTEFQSVMgU2VtaWNvbiBJT0goTUw3MjEzL01MNzIyMy9NTDc4MzEpIFNQSSIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtNTIwLDYgKzUzOCwxOSBAQAogCiAJICBPciBmb3IgdGhlIERTNTcwLCBzZWUgIlhQUyBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgKHYyLjAwYikiCiAKK2NvbmZpZyBTUElfWFRFTlNBX1hURlBHQQorCXRyaXN0YXRlICJYdGVuc2EgU1BJIGNvbnRyb2xsZXIgZm9yIHh0ZnBnYSIKKwlkZXBlbmRzIG9uIChYVEVOU0EgJiYgWFRFTlNBX1BMQVRGT1JNX1hURlBHQSkgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgeHRmcGdhIFNQSSBtYXN0ZXIgY29udHJvbGxlci4KKworCSAgVGhpcyBzaW1wbGUgU1BJIG1hc3RlciBjb250cm9sbGVyIGlzIGJ1aWx0IGludG8geHRmcGdhIGJpdHN0cmVhbXMKKwkgIGFuZCBpcyB1c2VkIHRvIGNvbnRyb2wgZGF1Z2h0ZXJib2FyZCBhdWRpbyBjb2RlYy4gSXQgYWx3YXlzIHRyYW5zZmVycworCSAgMTYgYml0IHdvcmRzIGluIFNQSSBtb2RlIDAsIGF1dG9tYXRpY2FsbHkgYXNzZXJ0aW5nIENTIG9uIHRyYW5zZmVyCisJICBzdGFydCBhbmQgZGVhc3NlcnRpbmcgb24gZW5kLgorCisKIGNvbmZpZyBTUElfTlVDOTAwCiAJdHJpc3RhdGUgIk51dm90b24gTlVDOTAwIHNlcmllcyBTUEkiCiAJZGVwZW5kcyBvbiBBUkNIX1c5MFg5MDAKQEAgLTU0Niw3ICs1NzcsNyBAQAogCiBjb25maWcgU1BJX0RXX01NSU8KIAl0cmlzdGF0ZSAiTWVtb3J5LW1hcHBlZCBpbyBpbnRlcmZhY2UgZHJpdmVyIGZvciBEVyBTUEkgY29yZSIKLQlkZXBlbmRzIG9uIFNQSV9ERVNJR05XQVJFICYmIEhBVkVfQ0xLCisJZGVwZW5kcyBvbiBTUElfREVTSUdOV0FSRQogCiAjCiAjIFRoZXJlIGFyZSBsb3RzIG9mIFNQSSBkZXZpY2UgdHlwZXMsIHdpdGggc2Vuc29ycyBhbmQgbWVtb3J5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDk1YWY0OGQuLmJkNzkyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC01OSw2ICs1OSw3IEBACiBzcGktcHhhMnh4LXBsYXRmb3JtLSQoQ09ORklHX1NQSV9QWEEyWFhfRE1BKQkrPSBzcGktcHhhMnh4LWRtYS5vCiBvYmotJChDT05GSUdfU1BJX1BYQTJYWCkJCSs9IHNwaS1weGEyeHgtcGxhdGZvcm0ubwogb2JqLSQoQ09ORklHX1NQSV9QWEEyWFhfUENJKQkJKz0gc3BpLXB4YTJ4eC1wY2kubworb2JqLSQoQ09ORklHX1NQSV9RVVApCQkJKz0gc3BpLXF1cC5vCiBvYmotJChDT05GSUdfU1BJX1JTUEkpCQkJKz0gc3BpLXJzcGkubwogb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYKQkJKz0gc3BpLXMzYzI0eHgtaHcubwogc3BpLXMzYzI0eHgtaHcteQkJCTo9IHNwaS1zM2MyNHh4Lm8KQEAgLTcwLDEyICs3MSwxNCBAQAogb2JqLSQoQ09ORklHX1NQSV9TSF9NU0lPRikJCSs9IHNwaS1zaC1tc2lvZi5vCiBvYmotJChDT05GSUdfU1BJX1NIX1NDSSkJCSs9IHNwaS1zaC1zY2kubwogb2JqLSQoQ09ORklHX1NQSV9TSVJGKQkJKz0gc3BpLXNpcmYubworb2JqLSQoQ09ORklHX1NQSV9TVU40SSkJCQkrPSBzcGktc3VuNGkubworb2JqLSQoQ09ORklHX1NQSV9TVU42SSkJCQkrPSBzcGktc3VuNmkubwogb2JqLSQoQ09ORklHX1NQSV9URUdSQTExNCkJCSs9IHNwaS10ZWdyYTExNC5vCiBvYmotJChDT05GSUdfU1BJX1RFR1JBMjBfU0ZMQVNIKQkrPSBzcGktdGVncmEyMC1zZmxhc2gubwogb2JqLSQoQ09ORklHX1NQSV9URUdSQTIwX1NMSU5LKQkJKz0gc3BpLXRlZ3JhMjAtc2xpbmsubwotb2JqLSQoQ09ORklHX1NQSV9USV9TU1ApCQkrPSBzcGktdGktc3NwLm8KIG9iai0kKENPTkZJR19TUElfVExFNjJYMCkJCSs9IHNwaS10bGU2MngwLm8KIG9iai0kKENPTkZJR19TUElfVE9QQ0xJRkZfUENIKQkJKz0gc3BpLXRvcGNsaWZmLXBjaC5vCiBvYmotJChDT05GSUdfU1BJX1RYWDkpCQkJKz0gc3BpLXR4eDkubwogb2JqLSQoQ09ORklHX1NQSV9YQ09NTSkJCSs9IHNwaS14Y29tbS5vCiBvYmotJChDT05GSUdfU1BJX1hJTElOWCkJCSs9IHNwaS14aWxpbngubworb2JqLSQoQ09ORklHX1NQSV9YVEVOU0FfWFRGUEdBKQkJKz0gc3BpLXh0ZW5zYS14dGZwZ2EubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jIGIvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jCmluZGV4IDVkN2RlYWYuLjViNTcwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hbHRlcmEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMKQEAgLTEzLDcgKzEzLDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTIwMCw3ICsxOTksNiBAQAogCiBzdGF0aWMgaW50IGFsdGVyYV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgYWx0ZXJhX3NwaV9wbGF0Zm9ybV9kYXRhICpwbGF0cCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IGFsdGVyYV9zcGkgKmh3OwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC0yMTQsNiArMjEyLDggQEAKIAltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMTY7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1NfSElHSDsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfUkFOR0VfTUFTSygxLCAxNik7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHcpOwpAQCAtMjQ1LDkgKzI0NSw2IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXQ7CiAJfQotCS8qIGZpbmQgcGxhdGZvcm0gZGF0YSAqLwotCWlmICghcGxhdHApCi0JCWh3LT5iaXRiYW5nLm1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCS8qIHJlZ2lzdGVyIG91ciBzcGkgY29udHJvbGxlciAqLwogCWVyciA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZody0+Yml0YmFuZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXRoNzkuYyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCmluZGV4IGMzYjJmYjkuLjM4OThiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCkBAIC0xNCw3ICsxNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwppbmRleCA1ZDdiMDdmLi44MDA1Zjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwpAQCAtOSw3ICs5LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjYsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgogCiAvKiBTUEkgcmVnaXN0ZXIgb2Zmc2V0cyAqLwogI2RlZmluZSBTUElfQ1IJCQkJCTB4MDAwMApAQCAtOTkzLDEzICs5OTMsNiBAQAogCiAJYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB7Ci0JCWRldl9kYmcoJnNwaS0+ZGV2LAotCQkJCSJzZXR1cDogaW52YWxpZCBjaGlwc2VsZWN0ICV1ICgldSBkZWZpbmVkKVxuIiwKLQkJCQlzcGktPmNoaXBfc2VsZWN0LCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAkvKiBzZWUgbm90ZXMgYWJvdmUgcmUgY2hpcHNlbGVjdCAqLwogCWlmICghYXRtZWxfc3BpX2lzX3YyKGFzKQogCQkJJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwCkBAIC0xMDg3LDE0ICsxMDgwLDYgQEAKIAkJfQogCX0KIAotCWlmICh4ZmVyLT5iaXRzX3Blcl93b3JkID4gOCkgewotCQlpZiAoeGZlci0+bGVuICUgMikgewotCQkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkiYnVmZmVyIGxlbiBzaG91bGQgYmUgMTYgYml0cyBhbGlnbmVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCiAJLyoKIAkgKiBETUEgbWFwIGVhcmx5LCBmb3IgcGVyZm9ybWFuY2UgKGVtcHRpZXMgZGNhY2hlIEFTQVApIGFuZAogCSAqIGJldHRlciBmYXVsdCByZXBvcnRpbmcuCkBAIC0xMjIxLDkgKzEyMDYsNiBAQAogCWRldl9kYmcoJnNwaS0+ZGV2LCAibmV3IG1lc3NhZ2UgJXAgc3VibWl0dGVkIGZvciAlc1xuIiwKIAkJCQkJbXNnLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKIAotCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZtc2ctPnRyYW5zZmVycykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWF0bWVsX3NwaV9sb2NrKGFzKTsKIAljc19hY3RpdmF0ZShhcywgc3BpKTsKIApAQCAtMTI0NCwxMCArMTIyNiwxMCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKIAkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkiICB4ZmVyICVwOiBsZW4gJXUgdHggJXAvJTA4eCByeCAlcC8lMDh4XG4iLAorCQkJIiAgeGZlciAlcDogbGVuICV1IHR4ICVwLyVwYWQgcnggJXAvJXBhZFxuIiwKIAkJCXhmZXIsIHhmZXItPmxlbiwKLQkJCXhmZXItPnR4X2J1ZiwgeGZlci0+dHhfZG1hLAotCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5yeF9kbWEpOworCQkJeGZlci0+dHhfYnVmLCAmeGZlci0+dHhfZG1hLAorCQkJeGZlci0+cnhfYnVmLCAmeGZlci0+cnhfZG1hKTsKIAl9CiAKIG1zZ19kb25lOgpAQCAtMTMwMyw2ICsxMjg1LDkgQEAKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwogCXN0cnVjdCBhdG1lbF9zcGkJKmFzOwogCisJLyogU2VsZWN0IGRlZmF1bHQgcGluIHN0YXRlICovCisJcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZSgmcGRldi0+ZGV2KTsKKwogCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcmVncykKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTE0NjUsNiArMTQ1MCw5IEBACiAJfQogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFzLT5jbGspOworCisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDc0LDYgKzE0NjIsOCBAQAogCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCWludCByZXQ7CiAKKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7CisKIAljbGtfcHJlcGFyZV9lbmFibGUoYXMtPmNsayk7CiAKIAkvKiBTdGFydCB0aGUgcXVldWUgcnVubmluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jIGIvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jCmluZGV4IGM0MTQxYzkuLjY3Mzc1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdTE1NTAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKQEAgLTU1LDggKzU1LDYgQEAKIAogCXZvbGF0aWxlIHBzY19zcGlfdCBfX2lvbWVtICpyZWdzOwogCWludCBpcnE7Ci0JdW5zaWduZWQgZnJlcV9tYXg7Ci0JdW5zaWduZWQgZnJlcV9taW47CiAKIAl1bnNpZ25lZCBsZW47CiAJdW5zaWduZWQgdHhfY291bnQ7CkBAIC0yNDgsMTEgKzI0Niw4IEBACiAJCQloeiA9IHQtPnNwZWVkX2h6OwogCX0KIAotCWlmIChoeiA+IHNwaS0+bWF4X3NwZWVkX2h6IHx8IGh6ID4gaHctPmZyZXFfbWF4IHx8IGh6IDwgaHctPmZyZXFfbWluKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXB4ZmVyOiBjbG9jayByYXRlPSVkIG91dCBvZiByYW5nZVxuIiwKLQkJCWh6KTsKKwlpZiAoIWh6KQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlhdTE1NTBfc3BpX2JpdHNfaGFuZGxlcnNfc2V0KGh3LCBzcGktPmJpdHNfcGVyX3dvcmQpOwogCkBAIC0yODcsMjMgKzI4Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXUxNTUwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID09IDApCi0JCXNwaS0+bWF4X3NwZWVkX2h6ID0gaHctPmZyZXFfbWF4OwotCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IGh3LT5mcmVxX21heAotCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPCBody0+ZnJlcV9taW4pCi0JCXJldHVybiAtRUlOVkFMOwotCS8qCi0JICogTk9URTogY2Fubm90IGNoYW5nZSBzcGVlZCBhbmQgb3RoZXIgaHcgc2V0dGluZ3MgaW1tZWRpYXRlbHksCi0JICogICAgICAgb3RoZXJ3aXNlIHNoYXJpbmcgb2Ygc3BpIGJ1cyBpcyBub3QgcG9zc2libGUsCi0JICogICAgICAgc28gZG8gbm90IGNhbGwgc2V0dXB4ZmVyKHNwaSwgTlVMTCkgaGVyZQotCSAqLwotCXJldHVybiAwOwotfQotCiAvKgogICogZm9yIGRtYSBzcGkgdHJhbnNmZXJzLCB3ZSBoYXZlIHRvIHNldHVwIHJ4IGNoYW5uZWwsIG90aGVyd2lzZSB0aGVyZSBpcwogICogbm8gcmVsaWFibGUgd2F5IGhvdyB0byByZWNvZ25pemUgdGhhdCBzcGkgdHJhbnNmZXIgaXMgZG9uZQpAQCAtODM4LDcgKzgxNiw2IEBACiAJaHctPmJpdGJhbmcubWFzdGVyID0gaHctPm1hc3RlcjsKIAlody0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IGF1MTU1MF9zcGlfc2V0dXB4ZmVyOwogCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBhdTE1NTBfc3BpX2NoaXBzZWw7Ci0JaHctPmJpdGJhbmcubWFzdGVyLT5zZXR1cCA9IGF1MTU1MF9zcGlfc2V0dXA7CiAJaHctPmJpdGJhbmcudHhyeF9idWZzID0gYXUxNTUwX3NwaV90eHJ4X2J1ZnM7CiAKIAlpZiAoaHctPnVzZWRtYSkgewpAQCAtOTA5LDggKzg4Niw5IEBACiAJewogCQlpbnQgbWluX2RpdiA9ICgyIDw8IDApICogKDIgKiAoNCArIDEpKTsKIAkJaW50IG1heF9kaXYgPSAoMiA8PCAzKSAqICgyICogKDYzICsgMSkpOwotCQlody0+ZnJlcV9tYXggPSBody0+cGRhdGEtPm1haW5jbGtfaHogLyBtaW5fZGl2OwotCQlody0+ZnJlcV9taW4gPSBody0+cGRhdGEtPm1haW5jbGtfaHogLyAobWF4X2RpdiArIDEpICsgMTsKKwkJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBody0+cGRhdGEtPm1haW5jbGtfaHogLyBtaW5fZGl2OworCQltYXN0ZXItPm1pbl9zcGVlZF9oeiA9CisJCQkJaHctPnBkYXRhLT5tYWluY2xrX2h6IC8gKG1heF9kaXYgKyAxKSArIDE7CiAJfQogCiAJYXUxNTUwX3NwaV9zZXR1cF9wc2NfYXNfc3BpKGh3KTsKQEAgLTk5OSw2ICs5NzcsMTUgQEAKIAkgKiBjcmVhdGUgbWVtb3J5IGRldmljZSB3aXRoIDggYml0cyBkZXZfZGV2d2lkdGgKIAkgKiBuZWVkZWQgZm9yIHByb3BlciBieXRlIG9yZGVyaW5nIHRvIHNwaSBmaWZvCiAJICovCisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTMwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJaWYgKHVzZWRtYSkgewogCQlkZG1hX21lbWlkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSgmYXUxNTUwX3NwaV9tZW1fZGJkZXYpOwogCQlpZiAoIWRkbWFfbWVtaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jIGIvZHJpdmVycy9zcGkvc3BpLWJjbTI4MzUuYwppbmRleCA4YTg5ZGQxLi42OTE2NzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY20yODM1LmMKQEAgLTMxNSw3ICszMTUsNiBAQAogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBCQ00yODM1X1NQSV9NT0RFX0JJVFM7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDM7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGJjbTI4MzVfc3BpX3RyYW5zZmVyX29uZTsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC1oc3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHgtaHNzcGkuYwppbmRleCBiNTI4ZjlmLi41YTIxMWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC1oc3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LWhzc3BpLmMKQEAgLTE4MCw3ICsxODAsNyBAQAogCXdoaWxlIChwZW5kaW5nID4gMCkgewogCQlpbnQgY3Vycl9zdGVwID0gbWluX3QoaW50LCBzdGVwX3NpemUsIHBlbmRpbmcpOwogCi0JCWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOworCQlyZWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOwogCQlpZiAodHgpIHsKIAkJCW1lbWNweV90b2lvKGJzLT5maWZvICsgSFNTUElfT1BDT0RFX0xFTiwgdHgsIGN1cnJfc3RlcCk7CiAJCQl0eCArPSBjdXJyX3N0ZXA7CkBAIC0zNjksNiArMzY5LDcgQEAKIAlicy0+ZmlmbyA9ICh1OCBfX2lvbWVtICopKGJzLT5yZWdzICsgSFNTUElfRklGT19SRUcoMCkpOwogCiAJbXV0ZXhfaW5pdCgmYnMtPmJ1c19tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZicy0+ZG9uZSk7CiAKIAltYXN0ZXItPmJ1c19udW0gPSBIU1NQSV9CVVNfTlVNOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA4OwpAQCAtNDUzLDkgKzQ1NCw4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGJjbTYzeHhfaHNzcGlfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGJjbTYzeHhfaHNzcGlfc3VzcGVuZCwgYmNtNjN4eF9oc3NwaV9yZXN1bWUpCi19Oworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGJjbTYzeHhfaHNzcGlfcG1fb3BzLCBiY202M3h4X2hzc3BpX3N1c3BlbmQsCisJCQkgYmNtNjN4eF9oc3NwaV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY202M3h4X2hzc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHguYyBiL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LmMKaW5kZXggNzcyODZhZS4uMDI1MGZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzUsOCArMzQsNiBAQAogCiAjaW5jbHVkZSA8YmNtNjN4eF9kZXZfc3BpLmg+CiAKLSNkZWZpbmUgUEZYCQlLQlVJTERfTU9ETkFNRQotCiAjZGVmaW5lIEJDTTYzWFhfU1BJX01BWF9QUkVQRU5ECQkxNQogCiBzdHJ1Y3QgYmNtNjN4eF9zcGkgewpAQCAtMTY5LDcgKzE2Niw3IEBACiAJCQkgICAgICAgdHJhbnNmZXJfbGlzdCk7CiAJfQogCi0JaW5pdF9jb21wbGV0aW9uKCZicy0+ZG9uZSk7CisJcmVpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKIAogCS8qIEZpbGwgaW4gdGhlIE1lc3NhZ2UgY29udHJvbCByZWdpc3RlciAqLwogCW1zZ19jdGwgPSAobGVuIDw8IFNQSV9CWVRFX0NOVF9TSElGVCk7CkBAIC0zNTMsNiArMzUwLDcgQEAKIAl9CiAKIAlicyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAJYnMtPnBkZXYgPSBwZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMKaW5kZXggMzg5NDFlNS4uZjUxNWM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCkBAIC04LDcgKzgsNiBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXYzLmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi12My5jCmluZGV4IDhmODU5ODguLjQwODlkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXYzLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW4tdjMuYwpAQCAtODIyLDcgKzgyMiw4IEBACiAJbWFzdGVyLT5jbGVhbnVwID0gYmZpbl9zcGlfY2xlYW51cDsKIAltYXN0ZXItPnNldHVwID0gYmZpbl9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGJmaW5fc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gQklUKDMyIC0gMSkgfCBCSVQoMTYgLSAxKSB8IEJJVCg4IC0gMSk7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soMzIpIHwgU1BJX0JQV19NQVNLKDE2KSB8CisJCQkJICAgICBTUElfQlBXX01BU0soOCk7CiAKIAlkcnZfZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlkcnZfZGF0YS0+bWFzdGVyID0gbWFzdGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMKaW5kZXggZjBmMTk1YS4uNTVlNTdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jCkBAIC0zNTAsNyArMzUwLDYgQEAKIHN0YXRpYyB2b2lkIGJmaW5fc3BpX2dpdmViYWNrKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqbGFzdF90cmFuc2ZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOwogCkBAIC0zNjIsOSArMzYxLDYgQEAKIAlxdWV1ZV93b3JrKGRydl9kYXRhLT53b3JrcXVldWUsICZkcnZfZGF0YS0+cHVtcF9tZXNzYWdlcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKIAotCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KG1zZy0+dHJhbnNmZXJzLnByZXYsCi0JCQkJICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7Ci0KIAltc2ctPnN0YXRlID0gTlVMTDsKIAogCWlmICghZHJ2X2RhdGEtPmNzX2NoYW5nZSkKQEAgLTEwMzAsMTAgKzEwMjYsNiBAQAogCX0KIAogCS8qIHRyYW5zbGF0ZSBjb21tb24gc3BpIGZyYW1ld29yayBpbnRvIG91ciByZWdpc3RlciAqLwotCWlmIChzcGktPm1vZGUgJiB+KFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfTFNCX0ZJUlNUKSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgInVuc3VwcG9ydGVkIHNwaSBtb2RlcyBkZXRlY3RlZFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQogCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKIAkJY2hpcC0+Y3RsX3JlZyB8PSBCSVRfQ1RMX0NQT0w7CiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYyBiL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMKaW5kZXggYmQyMjJmNi4uZGM3ZDJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNDY3LDExICs0NjYsOSBAQAogLyoqCiAgKiBzcGlfYml0YmFuZ19zdG9wIC0gc3RvcHMgdGhlIHRhc2sgcHJvdmlkaW5nIHNwaSBjb21tdW5pY2F0aW9uCiAgKi8KLWludCBzcGlfYml0YmFuZ19zdG9wKHN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZykKK3ZvaWQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCiB7CiAJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGJpdGJhbmctPm1hc3Rlcik7Ci0KLQlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3N0b3ApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMgYi9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMKaW5kZXggODA4MWY5Ni4uZWU0ZjkxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1idXR0ZXJmbHkuYwpAQCAtMzA5LDcgKzMwOSw2IEBACiBzdGF0aWMgdm9pZCBidXR0ZXJmbHlfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQogewogCXN0cnVjdCBidXR0ZXJmbHkJKnBwOwotCWludAkJCXN0YXR1czsKIAogCS8qIEZJWE1FIHRoaXMgZ2xvYmFsIGlzIHVnbHkgLi4uIGJ1dCwgaG93IHRvIHF1aWNrbHkgZ2V0IGZyb20KIAkgKiB0aGUgcGFycG9ydCB0byB0aGUgInN0cnVjdCBidXR0ZXJmbHkiIGFzc29jaWF0ZWQgd2l0aCBpdD8KQEAgLTMyMSw3ICszMjAsNyBAQAogCWJ1dHRlcmZseSA9IE5VTEw7CiAKIAkvKiBzdG9wKCkgdW5yZWdpc3RlcnMgY2hpbGQgZGV2aWNlcyB0b28gKi8KLQlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7CisJc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOwogCiAJLyogdHVybiBvZmYgVkNDICovCiAJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jbHBzNzExeC5jIGIvZHJpdmVycy9zcGkvc3BpLWNscHM3MTF4LmMKaW5kZXggMzc0YmE0YS4uNGNkNjJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWNscHM3MTF4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNscHM3MTF4LmMKQEAgLTExLDE1OCArMTEsMTI1IEBACiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi9jbHBzNzExeC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1jbHBzNzExeC5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJzcGktY2xwczcxMXgiCiAKLXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSB7Ci0Jc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKyNkZWZpbmUgU1lOQ0lPX0ZSTUxFTih4KQkoKHgpIDw8IDgpCisjZGVmaW5lIFNZTkNJT19UWEZSTUVOCQkoMSA8PCAxNCkKIAorc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhIHsKKwl2b2lkIF9faW9tZW0JCSpzeW5jaW87CisJc3RydWN0IHJlZ21hcAkJKnN5c2NvbjsKKwlzdHJ1Y3QgcmVnbWFwCQkqc3lzY29uMTsKIAlzdHJ1Y3QgY2xrCQkqc3BpX2NsazsKLQl1MzIJCQltYXhfc3BlZWRfaHo7CiAKIAl1OAkJCSp0eF9idWY7CiAJdTgJCQkqcnhfYnVmOwotCWludAkJCWNvdW50OworCXVuc2lnbmVkIGludAkJYnB3OwogCWludAkJCWxlbjsKLQotCWludAkJCWNoaXBzZWxlY3RbMF07CiB9OwogCiBzdGF0aWMgaW50IHNwaV9jbHBzNzExeF9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQogCS8qIFdlIGFyZSBleHBlY3QgdGhhdCBTUEktZGV2aWNlIGlzIG5vdCBzZWxlY3RlZCAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+Y2hpcHNlbGVjdFtzcGktPmNoaXBfc2VsZWN0XSwKLQkJCSAgICAgICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jc19ncGlvLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc3BpX2NscHM3MTF4X3NldHVwX21vZGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3N0YXRpYyB2b2lkIHNwaV9jbHBzNzExeF9zZXR1cF94ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0JLyogU2V0dXAgZWRnZSBmb3IgdHJhbnNmZXIgKi8KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCi0JCWNscHNfd3JpdGV3KGNscHNfcmVhZHcoU1lTQ09OMykgfCBTWVNDT04zX0FEQ0NLTlNFTiwgU1lTQ09OMyk7Ci0JZWxzZQotCQljbHBzX3dyaXRldyhjbHBzX3JlYWR3KFNZU0NPTjMpICYgflNZU0NPTjNfQURDQ0tOU0VOLCBTWVNDT04zKTsKLX0KLQotc3RhdGljIGludCBzcGlfY2xwczcxMXhfc2V0dXBfeGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCi17Ci0JdTMyIHNwZWVkID0geGZlci0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwotCXU4IGJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQ7Ci0Jc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKGJwdyAhPSA4KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiVW5zdXBwb3J0ZWQgbWFzdGVyIGJ1cyB3aWR0aCAlaVxuIiwgYnB3KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJLyogU2V0dXAgU1BJIGZyZXF1ZW5jeSBkaXZpZGVyICovCi0JaWYgKCFzcGVlZCB8fCAoc3BlZWQgPj0gaHctPm1heF9zcGVlZF9oeikpCi0JCWNscHNfd3JpdGVsKChjbHBzX3JlYWRsKFNZU0NPTjEpICYgflNZU0NPTjFfQURDS1NFTF9NQVNLKSB8Ci0JCQkgICAgU1lTQ09OMV9BRENLU0VMKDMpLCBTWVNDT04xKTsKLQllbHNlIGlmIChzcGVlZCA+PSAoaHctPm1heF9zcGVlZF9oeiAvIDIpKQotCQljbHBzX3dyaXRlbCgoY2xwc19yZWFkbChTWVNDT04xKSAmIH5TWVNDT04xX0FEQ0tTRUxfTUFTSykgfAotCQkJICAgIFNZU0NPTjFfQURDS1NFTCgyKSwgU1lTQ09OMSk7Ci0JZWxzZSBpZiAoc3BlZWQgPj0gKGh3LT5tYXhfc3BlZWRfaHogLyA4KSkKLQkJY2xwc193cml0ZWwoKGNscHNfcmVhZGwoU1lTQ09OMSkgJiB+U1lTQ09OMV9BRENLU0VMX01BU0spIHwKLQkJCSAgICBTWVNDT04xX0FEQ0tTRUwoMSksIFNZU0NPTjEpOworCWlmICh4ZmVyLT5zcGVlZF9oeiA+PSBtYXN0ZXItPm1heF9zcGVlZF9oeikKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGh3LT5zeXNjb24xLCBTWVNDT05fT0ZGU0VULAorCQkJCSAgIFNZU0NPTjFfQURDS1NFTF9NQVNLLCBTWVNDT04xX0FEQ0tTRUwoMykpOworCWVsc2UgaWYgKHhmZXItPnNwZWVkX2h6ID49IChtYXN0ZXItPm1heF9zcGVlZF9oeiAvIDIpKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbjEsIFNZU0NPTl9PRkZTRVQsCisJCQkJICAgU1lTQ09OMV9BRENLU0VMX01BU0ssIFNZU0NPTjFfQURDS1NFTCgyKSk7CisJZWxzZSBpZiAoeGZlci0+c3BlZWRfaHogPj0gKG1hc3Rlci0+bWF4X3NwZWVkX2h6IC8gOCkpCisJCXJlZ21hcF91cGRhdGVfYml0cyhody0+c3lzY29uMSwgU1lTQ09OX09GRlNFVCwKKwkJCQkgICBTWVNDT04xX0FEQ0tTRUxfTUFTSywgU1lTQ09OMV9BRENLU0VMKDEpKTsKIAllbHNlCi0JCWNscHNfd3JpdGVsKChjbHBzX3JlYWRsKFNZU0NPTjEpICYgflNZU0NPTjFfQURDS1NFTF9NQVNLKSB8Ci0JCQkgICAgU1lTQ09OMV9BRENLU0VMKDApLCBTWVNDT04xKTsKLQotCXJldHVybiAwOworCQlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbjEsIFNZU0NPTl9PRkZTRVQsCisJCQkJICAgU1lTQ09OMV9BRENLU0VMX01BU0ssIFNZU0NPTjFfQURDS1NFTCgwKSk7CiB9CiAKLXN0YXRpYyBpbnQgc3BpX2NscHM3MTF4X3RyYW5zZmVyX29uZV9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCi0JCQkJCSAgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCitzdGF0aWMgaW50IHNwaV9jbHBzNzExeF9wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOwotCWludCBzdGF0dXMgPSAwLCBjcyA9IGh3LT5jaGlwc2VsZWN0W21zZy0+c3BpLT5jaGlwX3NlbGVjdF07Ci0JdTMyIGRhdGE7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOwogCi0Jc3BpX2NscHM3MTF4X3NldHVwX21vZGUobXNnLT5zcGkpOworCS8qIFNldHVwIG1vZGUgZm9yIHRyYW5zZmVyICovCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhody0+c3lzY29uLCBTWVNDT05fT0ZGU0VULCBTWVNDT04zX0FEQ0NLTlNFTiwKKwkJCQkgIChzcGktPm1vZGUgJiBTUElfQ1BIQSkgPworCQkJCSAgU1lTQ09OM19BRENDS05TRU4gOiAwKTsKK30KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmIChzcGlfY2xwczcxMXhfc2V0dXBfeGZlcihtc2ctPnNwaSwgeGZlcikpIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dF94ZnI7Ci0JCX0KK3N0YXRpYyBpbnQgc3BpX2NscHM3MTF4X3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICAgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1OCBkYXRhOwogCi0JCWdwaW9fc2V0X3ZhbHVlKGNzLCAhIShtc2ctPnNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJc3BpX2NscHM3MTF4X3NldHVwX3hmZXIoc3BpLCB4ZmVyKTsKIAotCQlyZWluaXRfY29tcGxldGlvbigmaHctPmRvbmUpOworCWh3LT5sZW4gPSB4ZmVyLT5sZW47CisJaHctPmJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQ7CisJaHctPnR4X2J1ZiA9ICh1OCAqKXhmZXItPnR4X2J1ZjsKKwlody0+cnhfYnVmID0gKHU4ICopeGZlci0+cnhfYnVmOwogCi0JCWh3LT5jb3VudCA9IDA7Ci0JCWh3LT5sZW4gPSB4ZmVyLT5sZW47Ci0JCWh3LT50eF9idWYgPSAodTggKil4ZmVyLT50eF9idWY7Ci0JCWh3LT5yeF9idWYgPSAodTggKil4ZmVyLT5yeF9idWY7CisJLyogSW5pdGlhdGUgdHJhbnNmZXIgKi8KKwlkYXRhID0gaHctPnR4X2J1ZiA/ICpody0+dHhfYnVmKysgOiAwOworCXdyaXRlbChkYXRhIHwgU1lOQ0lPX0ZSTUxFTihody0+YnB3KSB8IFNZTkNJT19UWEZSTUVOLCBody0+c3luY2lvKTsKIAotCQkvKiBJbml0aWF0ZSB0cmFuc2ZlciAqLwotCQlkYXRhID0gaHctPnR4X2J1ZiA/IGh3LT50eF9idWZbaHctPmNvdW50XSA6IDA7Ci0JCWNscHNfd3JpdGVsKGRhdGEgfCBTWU5DSU9fRlJNTEVOKDgpIHwgU1lOQ0lPX1RYRlJNRU4sIFNZTkNJTyk7Ci0KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmaHctPmRvbmUpOwotCi0JCWlmICh4ZmVyLT5kZWxheV91c2VjcykKLQkJCXVkZWxheSh4ZmVyLT5kZWxheV91c2Vjcyk7Ci0KLQkJaWYgKHhmZXItPmNzX2NoYW5nZSB8fAotCQkgICAgbGlzdF9pc19sYXN0KCZ4ZmVyLT50cmFuc2Zlcl9saXN0LCAmbXNnLT50cmFuc2ZlcnMpKQotCQkJZ3Bpb19zZXRfdmFsdWUoY3MsICEobXNnLT5zcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOwotCi0JCW1zZy0+YWN0dWFsX2xlbmd0aCArPSB4ZmVyLT5sZW47Ci0JfQotCi1vdXRfeGZyOgotCW1zZy0+c3RhdHVzID0gc3RhdHVzOwotCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UobWFzdGVyKTsKLQotCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3BpX2NscHM3MTF4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IChzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKilkZXZfaWQ7Ci0JdTMyIGRhdGE7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9pZDsKKwlzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXU4IGRhdGE7CiAKIAkvKiBIYW5kbGUgUlggKi8KLQlkYXRhID0gY2xwc19yZWFkYihTWU5DSU8pOworCWRhdGEgPSByZWFkYihody0+c3luY2lvKTsKIAlpZiAoaHctPnJ4X2J1ZikKLQkJaHctPnJ4X2J1Zltody0+Y291bnRdID0gKHU4KWRhdGE7Ci0KLQlody0+Y291bnQrKzsKKwkJKmh3LT5yeF9idWYrKyA9IGRhdGE7CiAKIAkvKiBIYW5kbGUgVFggKi8KLQlpZiAoaHctPmNvdW50IDwgaHctPmxlbikgewotCQlkYXRhID0gaHctPnR4X2J1ZiA/IGh3LT50eF9idWZbaHctPmNvdW50XSA6IDA7Ci0JCWNscHNfd3JpdGVsKGRhdGEgfCBTWU5DSU9fRlJNTEVOKDgpIHwgU1lOQ0lPX1RYRlJNRU4sIFNZTkNJTyk7CisJaWYgKC0taHctPmxlbiA+IDApIHsKKwkJZGF0YSA9IGh3LT50eF9idWYgPyAqaHctPnR4X2J1ZisrIDogMDsKKwkJd3JpdGVsKGRhdGEgfCBTWU5DSU9fRlJNTEVOKGh3LT5icHcpIHwgU1lOQ0lPX1RYRlJNRU4sCisJCSAgICAgICBody0+c3luY2lvKTsKIAl9IGVsc2UKLQkJY29tcGxldGUoJmh3LT5kb25lKTsKKwkJc3BpX2ZpbmFsaXplX2N1cnJlbnRfdHJhbnNmZXIobWFzdGVyKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGludCBzcGlfY2xwczcxMXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgaSwgcmV0OwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodzsKIAlzdHJ1Y3Qgc3BpX2NscHM3MTF4X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgaXJxLCByZXQ7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwpAQCAtMTc0LDMzICsxNDEsMzcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSkgKwotCQkJCSAgc2l6ZW9mKGludCkgKiBwZGF0YS0+bnVtX2NoaXBzZWxlY3QpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlNQSSBhbGxvY2F0aW5nIG1lbW9yeSBlcnJvclxuIik7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKCpodykpOworCWlmICghbWFzdGVyKQogCQlyZXR1cm4gLUVOT01FTTsKKworCW1hc3Rlci0+Y3NfZ3Bpb3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKGludCkgKgorCQkJCQlwZGF0YS0+bnVtX2NoaXBzZWxlY3QsIEdGUF9LRVJORUwpOworCWlmICghbWFzdGVyLT5jc19ncGlvcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gIFNQSV9CUFdfUkFOR0VfTUFTSygxLCA4KTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jaGlwc2VsZWN0OwogCW1hc3Rlci0+c2V0dXAgPSBzcGlfY2xwczcxMXhfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHNwaV9jbHBzNzExeF90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKKwltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHNwaV9jbHBzNzExeF9wcmVwYXJlX21lc3NhZ2U7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzcGlfY2xwczcxMXhfdHJhbnNmZXJfb25lOwogCiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7Ci0JCWh3LT5jaGlwc2VsZWN0W2ldID0gcGRhdGEtPmNoaXBzZWxlY3RbaV07Ci0JCWlmICghZ3Bpb19pc192YWxpZChody0+Y2hpcHNlbGVjdFtpXSkpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgQ1MgR1BJTyAlaVxuIiwgaSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JCWlmIChkZXZtX2dwaW9fcmVxdWVzdCgmcGRldi0+ZGV2LCBody0+Y2hpcHNlbGVjdFtpXSwgTlVMTCkpIHsKKwkJbWFzdGVyLT5jc19ncGlvc1tpXSA9IHBkYXRhLT5jaGlwc2VsZWN0W2ldOworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdCgmcGRldi0+ZGV2LCBtYXN0ZXItPmNzX2dwaW9zW2ldLAorCQkJCQlEUklWRVJfTkFNRSk7CisJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBDUyBHUElPICVpXG4iLCBpKTsKLQkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAl9CkBAIC0yMTEsMjkgKzE4Miw0NSBAQAogCQlyZXQgPSBQVFJfRVJSKGh3LT5zcGlfY2xrKTsKIAkJZ290byBlcnJfb3V0OwogCX0KLQlody0+bWF4X3NwZWVkX2h6ID0gY2xrX2dldF9yYXRlKGh3LT5zcGlfY2xrKTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IGNsa19nZXRfcmF0ZShody0+c3BpX2Nsayk7CiAKLQlpbml0X2NvbXBsZXRpb24oJmh3LT5kb25lKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCi0JLyogRGlzYWJsZSBleHRlbmRlZCBtb2RlIGR1ZSBoYXJkd2FyZSBwcm9ibGVtcyAqLwotCWNscHNfd3JpdGV3KGNscHNfcmVhZHcoU1lTQ09OMykgJiB+U1lTQ09OM19BRENDT04sIFNZU0NPTjMpOwotCi0JLyogQ2xlYXIgcG9zc2libGUgcGVuZGluZyBpbnRlcnJ1cHQgKi8KLQljbHBzX3JlYWRsKFNZTkNJTyk7Ci0KLQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIElSUV9TU0VPVEksIHNwaV9jbHBzNzExeF9pc3IsIDAsCi0JCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIGh3KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHJlcXVlc3QgSVJRXG4iKTsKKwlody0+c3lzY29uID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGRldm5hbWUoInN5c2Nvbi4zIik7CisJaWYgKElTX0VSUihody0+c3lzY29uKSkgeworCQlyZXQgPSBQVFJfRVJSKGh3LT5zeXNjb24pOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaHctPnN5c2NvbjEgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9wZGV2bmFtZSgic3lzY29uLjEiKTsKKwlpZiAoSVNfRVJSKGh3LT5zeXNjb24xKSkgeworCQlyZXQgPSBQVFJfRVJSKGh3LT5zeXNjb24xKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaHctPnN5bmNpbyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoaHctPnN5bmNpbykpIHsKKwkJcmV0ID0gUFRSX0VSUihody0+c3luY2lvKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIERpc2FibGUgZXh0ZW5kZWQgbW9kZSBkdWUgaGFyZHdhcmUgcHJvYmxlbXMgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbiwgU1lTQ09OX09GRlNFVCwgU1lTQ09OM19BRENDT04sIDApOworCisJLyogQ2xlYXIgcG9zc2libGUgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwlyZWFkbChody0+c3luY2lvKTsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBzcGlfY2xwczcxMXhfaXNyLCAwLAorCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKwogCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOwogCWlmICghcmV0KSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsCiAJCQkgIlNQSSBidXMgZHJpdmVyIGluaXRpYWxpemVkLiBNYXN0ZXIgY2xvY2sgJXUgSHpcbiIsCi0JCQkgaHctPm1heF9zcGVlZF9oeik7CisJCQkgbWFzdGVyLT5tYXhfc3BlZWRfaHopOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jCmluZGV4IDI4YWU0NzAuLmUyZmE2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNvbGRmaXJlLXFzcGkuYwpAQCAtNzcsOCArNzcsNiBAQAogCXN0cnVjdCBtY2Zxc3BpX2NzX2NvbnRyb2wgKmNzX2NvbnRyb2w7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKLQotCXN0cnVjdCBkZXZpY2UgKmRldjsKIH07CiAKIHN0YXRpYyB2b2lkIG1jZnFzcGlfd3JfcW1yKHN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpLCB1MTYgdmFsKQpAQCAtMTM1LDEzICsxMzMsMTMgQEAKIAogc3RhdGljIGludCBtY2Zxc3BpX2NzX3NldHVwKHN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpKQogewotCXJldHVybiAobWNmcXNwaS0+Y3NfY29udHJvbCAmJiBtY2Zxc3BpLT5jc19jb250cm9sLT5zZXR1cCkgPworCXJldHVybiAobWNmcXNwaS0+Y3NfY29udHJvbC0+c2V0dXApID8KIAkJbWNmcXNwaS0+Y3NfY29udHJvbC0+c2V0dXAobWNmcXNwaS0+Y3NfY29udHJvbCkgOiAwOwogfQogCiBzdGF0aWMgdm9pZCBtY2Zxc3BpX2NzX3RlYXJkb3duKHN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpKQogewotCWlmIChtY2Zxc3BpLT5jc19jb250cm9sICYmIG1jZnFzcGktPmNzX2NvbnRyb2wtPnRlYXJkb3duKQorCWlmIChtY2Zxc3BpLT5jc19jb250cm9sLT50ZWFyZG93bikKIAkJbWNmcXNwaS0+Y3NfY29udHJvbC0+dGVhcmRvd24obWNmcXNwaS0+Y3NfY29udHJvbCk7CiB9CiAKQEAgLTMwMCw2OCArMjk4LDQ1IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1jZnFzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKLQkJCQkJIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQorc3RhdGljIHZvaWQgbWNmcXNwaV9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IG1jZnFzcGkgKm1jZnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlib29sIGNzX2hpZ2ggPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKworCWlmIChlbmFibGUpCisJCW1jZnFzcGlfY3Nfc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsIGNzX2hpZ2gpOworCWVsc2UKKwkJbWNmcXNwaV9jc19kZXNlbGVjdChtY2Zxc3BpLCBzcGktPmNoaXBfc2VsZWN0LCBjc19oaWdoKTsKK30KKworc3RhdGljIGludCBtY2Zxc3BpX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKIAlzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbXNnLT5zcGk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQlpbnQgc3RhdHVzID0gMDsKKwl1MTYgcW1yID0gTUNGUVNQSV9RTVJfTVNUUjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWJvb2wgY3NfaGlnaCA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOwotCQl1MTYgcW1yID0gTUNGUVNQSV9RTVJfTVNUUjsKKwlxbXIgfD0gdC0+Yml0c19wZXJfd29yZCA8PCAxMDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCisJCXFtciB8PSBNQ0ZRU1BJX1FNUl9DUEhBOworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJcW1yIHw9IE1DRlFTUElfUU1SX0NQT0w7CisJcW1yIHw9IG1jZnFzcGlfcW1yX2JhdWQodC0+c3BlZWRfaHopOworCW1jZnFzcGlfd3JfcW1yKG1jZnFzcGksIHFtcik7CiAKLQkJcW1yIHw9IHQtPmJpdHNfcGVyX3dvcmQgPDwgMTA7Ci0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJCXFtciB8PSBNQ0ZRU1BJX1FNUl9DUEhBOwotCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCQlxbXIgfD0gTUNGUVNQSV9RTVJfQ1BPTDsKLQkJaWYgKHQtPnNwZWVkX2h6KQotCQkJcW1yIHw9IG1jZnFzcGlfcW1yX2JhdWQodC0+c3BlZWRfaHopOwotCQllbHNlCi0JCQlxbXIgfD0gbWNmcXNwaV9xbXJfYmF1ZChzcGktPm1heF9zcGVlZF9oeik7Ci0JCW1jZnFzcGlfd3JfcW1yKG1jZnFzcGksIHFtcik7CisJbWNmcXNwaV93cl9xaXIobWNmcXNwaSwgTUNGUVNQSV9RSVJfU1BJRkUpOworCWlmICh0LT5iaXRzX3Blcl93b3JkID09IDgpCisJCW1jZnFzcGlfdHJhbnNmZXJfbXNnOChtY2Zxc3BpLCB0LT5sZW4sIHQtPnR4X2J1ZiwgdC0+cnhfYnVmKTsKKwllbHNlCisJCW1jZnFzcGlfdHJhbnNmZXJfbXNnMTYobWNmcXNwaSwgdC0+bGVuIC8gMiwgdC0+dHhfYnVmLAorCQkJCSAgICAgICB0LT5yeF9idWYpOworCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIDApOwogCi0JCW1jZnFzcGlfY3Nfc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsIGNzX2hpZ2gpOwotCi0JCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIE1DRlFTUElfUUlSX1NQSUZFKTsKLQkJaWYgKHQtPmJpdHNfcGVyX3dvcmQgPT0gOCkKLQkJCW1jZnFzcGlfdHJhbnNmZXJfbXNnOChtY2Zxc3BpLCB0LT5sZW4sIHQtPnR4X2J1ZiwKLQkJCQkJdC0+cnhfYnVmKTsKLQkJZWxzZQotCQkJbWNmcXNwaV90cmFuc2Zlcl9tc2cxNihtY2Zxc3BpLCB0LT5sZW4gLyAyLCB0LT50eF9idWYsCi0JCQkJCXQtPnJ4X2J1Zik7Ci0JCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIDApOwotCi0JCWlmICh0LT5kZWxheV91c2VjcykKLQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7Ci0JCWlmICh0LT5jc19jaGFuZ2UpIHsKLQkJCWlmICghbGlzdF9pc19sYXN0KCZ0LT50cmFuc2Zlcl9saXN0LCAmbXNnLT50cmFuc2ZlcnMpKQotCQkJCW1jZnFzcGlfY3NfZGVzZWxlY3QobWNmcXNwaSwgc3BpLT5jaGlwX3NlbGVjdCwKLQkJCQkJCWNzX2hpZ2gpOwotCQl9IGVsc2UgewotCQkJaWYgKGxpc3RfaXNfbGFzdCgmdC0+dHJhbnNmZXJfbGlzdCwgJm1zZy0+dHJhbnNmZXJzKSkKLQkJCQltY2Zxc3BpX2NzX2Rlc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsCi0JCQkJCQljc19oaWdoKTsKLQkJfQotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOwotCX0KLQltc2ctPnN0YXR1cyA9IHN0YXR1czsKLQlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbWNmcXNwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWlmIChzcGktPmNoaXBfc2VsZWN0ID49IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCkgewotCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGNoaXAgc2VsZWN0IGlzIG91dCBvZiByYW5nZVxuIiwKLQkJCXNwaS0+Y2hpcF9zZWxlY3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAltY2Zxc3BpX2NzX2Rlc2VsZWN0KHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpLAogCQkJICAgIHNwaS0+Y2hpcF9zZWxlY3QsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKTsKIApAQCAtMzg4LDYgKzM2MywxMSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKKwlpZiAoIXBkYXRhLT5jc19jb250cm9sKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInBkYXRhLT5jc19jb250cm9sIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqbWNmcXNwaSkpOwogCWlmIChtYXN0ZXIgPT0gTlVMTCkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJzcGlfYWxsb2NfbWFzdGVyIGZhaWxlZFxuIik7CkBAIC00MzYsMTIgKzQxNiwxMiBAQAogCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1jZnFzcGktPndhaXRxKTsKLQltY2Zxc3BpLT5kZXYgPSAmcGRldi0+ZGV2OwogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1NfSElHSCB8IFNQSV9DUE9MIHwgU1BJX0NQSEE7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soOCwgMTYpOwogCW1hc3Rlci0+c2V0dXAgPSBtY2Zxc3BpX3NldHVwOwotCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBtY2Zxc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOworCW1hc3Rlci0+c2V0X2NzID0gbWNmcXNwaV9zZXRfY3M7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBtY2Zxc3BpX3RyYW5zZmVyX29uZTsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwpAQCAtNDUxLDcgKzQzMSw3IEBACiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInNwaV9yZWdpc3Rlcl9tYXN0ZXIgZmFpbGVkXG4iKTsKIAkJZ290byBmYWlsMjsKIAl9Ci0JcG1fcnVudGltZV9lbmFibGUobWNmcXNwaS0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDb2xkZmlyZSBRU1BJIGJ1cyBkcml2ZXJcbiIpOwogCkBAIC00NzMsOSArNDUzLDggQEAKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG1jZnFzcGkgKm1jZnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JcG1fcnVudGltZV9kaXNhYmxlKG1jZnFzcGktPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCS8qIGRpc2FibGUgdGhlIGhhcmR3YXJlIChzZXQgdGhlIGJhdWQgcmF0ZSB0byAwKSAqLwogCW1jZnFzcGlfd3JfcW1yKG1jZnFzcGksIE1DRlFTUElfUU1SX01TVFIpOwogCkBAIC00OTAsOCArNDY5LDExIEBACiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CiAKLQlzcGlfbWFzdGVyX3N1c3BlbmQobWFzdGVyKTsKKwlyZXQgPSBzcGlfbWFzdGVyX3N1c3BlbmQobWFzdGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrX2Rpc2FibGUobWNmcXNwaS0+Y2xrKTsKIApAQCAtNTAzLDExICs0ODUsOSBAQAogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAotCXNwaV9tYXN0ZXJfcmVzdW1lKG1hc3Rlcik7Ci0KIAljbGtfZW5hYmxlKG1jZnFzcGktPmNsayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3BpX21hc3Rlcl9yZXN1bWUobWFzdGVyKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jIGIvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYwppbmRleCA1ZTczODlmLi41MGY3NTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kYXZpbmNpLmMKQEAgLTgwMiw4ICs4MDIsNyBAQAogCXBkYXRhID0gJmRzcGktPnBkYXRhOwogCiAJcGRhdGEtPnZlcnNpb24gPSBTUElfVkVSU0lPTl8xOwotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihkYXZpbmNpX3NwaV9vZl9tYXRjaCksCi0JCQkJJnBkZXYtPmRldik7CisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZGF2aW5jaV9zcGlfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwogCWlmICghbWF0Y2gpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC04MjQsNyArODIzLDYgQEAKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi0jZGVmaW5lIGRhdmluY2lfc3BpX29mX21hdGNoIE5VTEwKIHN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9zcGlfcGxhdGZvcm1fZGF0YQogCSpzcGlfZGF2aW5jaV9nZXRfcGRhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJc3RydWN0IGRhdmluY2lfc3BpICpkc3BpKQpAQCAtODY0LDEwICs4NjIsNiBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAKIAlkc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCWlmIChkc3BpID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBmcmVlX21hc3RlcjsKLQl9CiAKIAlpZiAoZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KSkgewogCQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CkBAIC05MDgsMTAgKzkwMiw2IEBACiAJCWdvdG8gZnJlZV9tYXN0ZXI7CiAKIAlkc3BpLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKLQlpZiAoZHNwaS0+Yml0YmFuZy5tYXN0ZXIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfbWFzdGVyOwotCX0KIAogCWRzcGktPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGRzcGktPmNsaykpIHsKQEAgLTEwNDAsNyArMTAzMCw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic3BpX2RhdmluY2kiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gZGF2aW5jaV9zcGlfb2ZfbWF0Y2gsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkYXZpbmNpX3NwaV9vZl9tYXRjaCksCiAJfSwKIAkucHJvYmUgPSBkYXZpbmNpX3NwaV9wcm9iZSwKIAkucmVtb3ZlID0gZGF2aW5jaV9zcGlfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKaW5kZXggOWFmNTZjZC4uMTQ5MmY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYworKysgYi9kcml2ZXJzL3NwaS9zcGktZHctbW1pby5jCkBAIC02Niw3ICs2Niw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWR3cy0+YnVzX251bSA9IDA7CisJZHdzLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJZHdzLT5udW1fY3MgPSA0OwogCWR3cy0+bWF4X2ZyZXEgPSBjbGtfZ2V0X3JhdGUoZHdzbW1pby0+Y2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LmMgYi9kcml2ZXJzL3NwaS9zcGktZHcuYwppbmRleCBiZjk4ZDYzLi43MTJhYzU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKQEAgLTI3Niw4ICsyNzYsNyBAQAogCXF1ZXVlX3dvcmsoZHdzLT53b3JrcXVldWUsICZkd3MtPnB1bXBfbWVzc2FnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwogCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKKwlsYXN0X3RyYW5zZmVyID0gbGlzdF9sYXN0X2VudHJ5KCZtc2ctPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKIAkJCQkJdHJhbnNmZXJfbGlzdCk7CiAKIAlpZiAoIWxhc3RfdHJhbnNmZXItPmNzX2NoYW5nZSAmJiBkd3MtPmNzX2NvbnRyb2wpCkBAIC00MzksMTIgKzQzOCw2IEBACiAKIAkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiAhPSBzcGVlZCkgewogCQkJc3BlZWQgPSB0cmFuc2Zlci0+c3BlZWRfaHo7Ci0JCQlpZiAoc3BlZWQgPiBkd3MtPm1heF9mcmVxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJNUlNUIFNQSTA6IHVuc3VwcG9ydGVkIgotCQkJCQkiZnJlcTogJWRIelxuIiwgc3BlZWQpOwotCQkJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0JCQkJZ290byBlYXJseV9leGl0OwotCQkJfQogCiAJCQkvKiBjbGtfZGl2IGRvZXNuJ3Qgc3VwcG9ydCBvZGQgbnVtYmVyICovCiAJCQljbGtfZGl2ID0gZHdzLT5tYXhfZnJlcSAvIHNwZWVkOwpAQCAtNjcxLDEyICs2NjQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkd19zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlrZnJlZShjaGlwKTsKLX0KLQogc3RhdGljIGludCBpbml0X3F1ZXVlKHN0cnVjdCBkd19zcGkgKmR3cykKIHsKIAlJTklUX0xJU1RfSEVBRCgmZHdzLT5xdWV1ZSk7CkBAIC04MDYsOSArNzkzLDkgQEAKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KSB8IFNQSV9CUFdfTUFTSygxNik7CiAJbWFzdGVyLT5idXNfbnVtID0gZHdzLT5idXNfbnVtOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBkd3MtPm51bV9jczsKLQltYXN0ZXItPmNsZWFudXAgPSBkd19zcGlfY2xlYW51cDsKIAltYXN0ZXItPnNldHVwID0gZHdfc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXIgPSBkd19zcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBkd3MtPm1heF9mcmVxOwogCiAJLyogQmFzaWMgSFcgaW5pdCAqLwogCXNwaV9od19pbml0KGR3cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZWZtMzIuYyBiL2RyaXZlcnMvc3BpL3NwaS1lZm0zMi5jCmluZGV4IGQ0ZDNjYzUuLmJlNDRhM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1lZm0zMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1lZm0zMi5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCWVmbTMyX3NwaV9maWxsdHgoZGRhdGEpOwogCi0JaW5pdF9jb21wbGV0aW9uKCZkZGF0YS0+ZG9uZSk7CisJcmVpbml0X2NvbXBsZXRpb24oJmRkYXRhLT5kb25lKTsKIAogCWVmbTMyX3NwaV93cml0ZTMyKGRkYXRhLCBSRUdfSUZfVFhCTCB8IFJFR19JRl9SWERBVEFWLCBSRUdfSUVOKTsKIApAQCAtMjg3LDE3ICsyODcsMTcgQEAKIAlyZXR1cm4gKHJlZyAmIFJFR19ST1VURV9MT0NBVElPTl9fTUFTSykgPj4gX19mZnMoUkVHX1JPVVRFX0xPQ0FUSU9OX19NQVNLKTsKIH0KIAotc3RhdGljIGludCBlZm0zMl9zcGlfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKK3N0YXRpYyB2b2lkIGVmbTMyX3NwaV9wcm9iZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZWZtMzJfc3BpX2RkYXRhICpkZGF0YSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJdTMyIGxvY2F0aW9uOwogCWludCByZXQ7CiAKLQlpZiAoIW5wKQotCQlyZXR1cm4gMTsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibG9jYXRpb24iLCAmbG9jYXRpb24pOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZWZtMzIsbG9jYXRpb24iLCAmbG9jYXRpb24pOworCWlmIChyZXQpCisJCS8qIGZhbGwgYmFjayB0byBvbGQgYW5kICh3cm9uZ2x5KSBnZW5lcmljIHByb3BlcnR5ICJsb2NhdGlvbiIgKi8KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJsb2NhdGlvbiIsICZsb2NhdGlvbik7CiAJaWYgKCFyZXQpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAidXNpbmcgbG9jYXRpb24gJXVcbiIsIGxvY2F0aW9uKTsKIAl9IGVsc2UgewpAQCAtMzA4LDExICszMDgsNiBAQAogCX0KIAogCWRkYXRhLT5wZGF0YS5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0JLyogc3BpIGNvcmUgdGFrZXMgY2FyZSBhYm91dCB0aGUgYnVzIG51bWJlciB1c2luZyBhbiBhbGlhcyAqLwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZWZtMzJfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0zMjIsOSArMzE3LDE0IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQl1bnNpZ25lZCBpbnQgbnVtX2NzLCBpOworCWludCBudW1fY3MsIGk7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW51bV9jcyA9IG9mX2dwaW9fbmFtZWRfY291bnQobnAsICJjcy1ncGlvcyIpOworCWlmIChudW1fY3MgPCAwKQorCQlyZXR1cm4gbnVtX2NzOwogCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LAogCQkJc2l6ZW9mKCpkZGF0YSkgKyBudW1fY3MgKiBzaXplb2YodW5zaWduZWQpKTsKQEAgLTM0OSw2ICszNDksNyBAQAogCWRkYXRhLT5iaXRiYW5nLnR4cnhfYnVmcyA9IGVmbTMyX3NwaV90eHJ4X2J1ZnM7CiAKIAlzcGluX2xvY2tfaW5pdCgmZGRhdGEtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmZGRhdGEtPmRvbmUpOwogCiAJZGRhdGEtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGRkYXRhLT5jbGspKSB7CkBAIC00MTUsMjMgKzQxNiw3IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IGVmbTMyX3NwaV9wcm9iZV9kdChwZGV2LCBtYXN0ZXIsIGRkYXRhKTsKLQlpZiAocmV0ID4gMCkgewotCQkvKiBub3QgY3JlYXRlZCBieSBkZXZpY2UgdHJlZSAqLwotCQljb25zdCBzdHJ1Y3QgZWZtMzJfc3BpX3BkYXRhICpwZGF0YSA9Ci0JCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCi0JCWlmIChwZGF0YSkKLQkJCWRkYXRhLT5wZGF0YSA9ICpwZGF0YTsKLQkJZWxzZQotCQkJZGRhdGEtPnBkYXRhLmxvY2F0aW9uID0KLQkJCQllZm0zMl9zcGlfZ2V0X2NvbmZpZ3VyZWRfbG9jYXRpb24oZGRhdGEpOwotCi0JCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwotCi0JfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0JCWdvdG8gZXJyX2Rpc2FibGVfY2xrOwotCX0KKwllZm0zMl9zcGlfcHJvYmVfZHQocGRldiwgbWFzdGVyLCBkZGF0YSk7CiAKIAllZm0zMl9zcGlfd3JpdGUzMihkZGF0YSwgMCwgUkVHX0lFTik7CiAJZWZtMzJfc3BpX3dyaXRlMzIoZGRhdGEsIFJFR19ST1VURV9UWFBFTiB8IFJFR19ST1VURV9SWFBFTiB8CkBAIC00ODcsNiArNDcyLDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZWZtMzJfc3BpX2R0X2lkc1tdID0gewogCXsKKwkJLmNvbXBhdGlibGUgPSAiZW5lcmd5bWljcm8sZWZtMzItc3BpIiwKKwl9LCB7CisJCS8qIGRvZXNuJ3QgZm9sbG93IHRoZSAidmVuZG9yLGRldmljZSIgc2NoZW1lLCBkb24ndCB1c2UgKi8KIAkJLmNvbXBhdGlibGUgPSAiZWZtMzIsc3BpIiwKIAl9LCB7CiAJCS8qIHNlbnRpbmVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMgYi9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMKaW5kZXggMWJmYWVkNi4uMmY2NzVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1lcDkzeHguYwpAQCAtNzMsOCArNzMsNiBAQAogICogQGNsazogY2xvY2sgZm9yIHRoZSBjb250cm9sbGVyCiAgKiBAcmVnc19iYXNlOiBwb2ludGVyIHRvIGlvcmVtYXAoKSdkIHJlZ2lzdGVycwogICogQHNzcGRyX3BoeXM6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFNTUERSIHJlZ2lzdGVyCi0gKiBAbWluX3JhdGU6IG1pbmltdW0gY2xvY2sgcmF0ZSAoaW4gSHopIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbGxlcgotICogQG1heF9yYXRlOiBtYXhpbXVtIGNsb2NrIHJhdGUgKGluIEh6KSBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRyb2xsZXIKICAqIEB3YWl0OiB3YWl0IGhlcmUgdW50aWwgZ2l2ZW4gdHJhbnNmZXIgaXMgY29tcGxldGVkCiAgKiBAY3VycmVudF9tc2c6IG1lc3NhZ2UgdGhhdCBpcyBjdXJyZW50bHkgcHJvY2Vzc2VkIChvciAlTlVMTCBpZiBub25lKQogICogQHR4OiBjdXJyZW50IGJ5dGUgaW4gdHJhbnNmZXIgdG8gdHJhbnNtaXQKQEAgLTk1LDggKzkzLDYgQEAKIAlzdHJ1Y3QgY2xrCQkJKmNsazsKIAl2b2lkIF9faW9tZW0JCQkqcmVnc19iYXNlOwogCXVuc2lnbmVkIGxvbmcJCQlzc3Bkcl9waHlzOwotCXVuc2lnbmVkIGxvbmcJCQltaW5fcmF0ZTsKLQl1bnNpZ25lZCBsb25nCQkJbWF4X3JhdGU7CiAJc3RydWN0IGNvbXBsZXRpb24JCXdhaXQ7CiAJc3RydWN0IHNwaV9tZXNzYWdlCQkqY3VycmVudF9tc2c7CiAJc2l6ZV90CQkJCXR4OwpAQCAtMTk5LDkgKzE5NSw5IEBACiAgKiBAZGl2X3NjcjogcG9pbnRlciB0byByZXR1cm4gdGhlIHNjciBkaXZpZGVyCiAgKi8KIHN0YXRpYyBpbnQgZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKGNvbnN0IHN0cnVjdCBlcDkzeHhfc3BpICplc3BpLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJICAgIHU4ICpkaXZfY3BzciwgdTggKmRpdl9zY3IpCisJCQkJICAgIHUzMiByYXRlLCB1OCAqZGl2X2Nwc3IsIHU4ICpkaXZfc2NyKQogeworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShlc3BpLT5wZGV2KTsKIAl1bnNpZ25lZCBsb25nIHNwaV9jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShlc3BpLT5jbGspOwogCWludCBjcHNyLCBzY3I7CiAKQEAgLTIxMCw3ICsyMDYsNyBAQAogCSAqIGNvbnRyb2xsZXIuIE5vdGUgdGhhdCBtaW5pbXVtIHZhbHVlIGlzIGFscmVhZHkgY2hlY2tlZCBpbgogCSAqIGVwOTN4eF9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2UoKS4KIAkgKi8KLQlyYXRlID0gY2xhbXAocmF0ZSwgZXNwaS0+bWluX3JhdGUsIGVzcGktPm1heF9yYXRlKTsKKwlyYXRlID0gY2xhbXAocmF0ZSwgbWFzdGVyLT5taW5fc3BlZWRfaHosIG1hc3Rlci0+bWF4X3NwZWVkX2h6KTsKIAogCS8qCiAJICogQ2FsY3VsYXRlIGRpdmlzb3JzIHNvIHRoYXQgd2UgY2FuIGdldCBzcGVlZCBhY2NvcmRpbmcgdGhlCkBAIC03MzUsMTMgKzczMSw2IEBACiAJCQkJCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7Ci0KLQkvKiBmaXJzdCB2YWxpZGF0ZSBlYWNoIHRyYW5zZmVyICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKHQtPnNwZWVkX2h6IDwgZXNwaS0+bWluX3JhdGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAltc2ctPnN0YXRlID0gTlVMTDsKIAltc2ctPnN0YXR1cyA9IDA7CkBAIC05MTcsOCArOTA2LDggQEAKIAkgKiBDYWxjdWxhdGUgbWF4aW11bSBhbmQgbWluaW11bSBzdXBwb3J0ZWQgY2xvY2sgcmF0ZXMKIAkgKiBmb3IgdGhlIGNvbnRyb2xsZXIuCiAJICovCi0JZXNwaS0+bWF4X3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvIDI7Ci0JZXNwaS0+bWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvICgyNTQgKiAyNTYpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gY2xrX2dldF9yYXRlKGVzcGktPmNsaykgLyAyOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gY2xrX2dldF9yYXRlKGVzcGktPmNsaykgLyAoMjU0ICogMjU2KTsKIAllc3BpLT5wZGV2ID0gcGRldjsKIAogCWVzcGktPnNzcGRyX3BoeXMgPSByZXMtPnN0YXJ0ICsgU1NQRFI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZmFsY29uLmMgYi9kcml2ZXJzL3NwaS9zcGktZmFsY29uLmMKaW5kZXggZGQ1YmQ0Ni4uMDk5NjVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZhbGNvbi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mYWxjb24uYwpAQCAtMzEyLDkgKzMxMiw2IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKIAogCWlmIChzcGktPm1heF9zcGVlZF9oeiA+PSBDTE9DS18xMDBNKSB7CkBAIC00MjIsOSArNDE5LDcgQEAKIAlwcml2LT5tYXN0ZXIgPSBtYXN0ZXI7CiAKIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9NT0RFXzM7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDE7CiAJbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfSEFMRl9EVVBMRVg7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAJbWFzdGVyLT5zZXR1cCA9IGZhbGNvbl9zZmxhc2hfc2V0dXA7CiAJbWFzdGVyLT5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gZmFsY29uX3NmbGFzaF9wcmVwYXJlX3hmZXI7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGZhbGNvbl9zZmxhc2hfeGZlcl9vbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jCmluZGV4IGEyNTM5MjAuLmQ1NjVlZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTEwOCwxMSArMTA5LDExIEBACiAJc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAotCXZvaWQgX19pb21lbQkJKmJhc2U7CisJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKIAlpbnQJCQlpcnE7Ci0Jc3RydWN0IGNsayAJCSpjbGs7CisJc3RydWN0IGNsawkJKmNsazsKIAotCXN0cnVjdCBzcGlfdHJhbnNmZXIgCSpjdXJfdHJhbnNmZXI7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqY3VyX3RyYW5zZmVyOwogCXN0cnVjdCBjaGlwX2RhdGEJKmN1cl9jaGlwOwogCXNpemVfdAkJCWxlbjsKIAl2b2lkCQkJKnR4OwpAQCAtMTIzLDI0ICsxMjQsMTcgQEAKIAl1OAkJCWNzOwogCXUxNgkJCXZvaWRfd3JpdGVfZGF0YTsKIAotCXdhaXRfcXVldWVfaGVhZF90IAl3YWl0cTsKLQl1MzIgCQkJd2FpdGZsYWdzOworCXdhaXRfcXVldWVfaGVhZF90CXdhaXRxOworCXUzMgkJCXdhaXRmbGFnczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2RvdWJsZV9ieXRlX21vZGUoc3RydWN0IGZzbF9kc3BpICpkc3BpKQogewotCXJldHVybiAoKHJlYWRsKGRzcGktPmJhc2UgKyBTUElfQ1RBUihkc3BpLT5jcykpICYgU1BJX0ZSQU1FX0JJVFNfTUFTSykKLQkJCT09IFNQSV9GUkFNRV9CSVRTKDgpKSA/IDAgOiAxOwotfQorCXVuc2lnbmVkIGludCB2YWw7CiAKLXN0YXRpYyB2b2lkIHNldF9iaXRfbW9kZShzdHJ1Y3QgZnNsX2RzcGkgKmRzcGksIHVuc2lnbmVkIGNoYXIgYml0cykKLXsKLQl1MzIgdGVtcDsKKwlyZWdtYXBfcmVhZChkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwgJnZhbCk7CiAKLQl0ZW1wID0gcmVhZGwoZHNwaS0+YmFzZSArIFNQSV9DVEFSKGRzcGktPmNzKSk7Ci0JdGVtcCAmPSB+U1BJX0ZSQU1FX0JJVFNfTUFTSzsKLQl0ZW1wIHw9IFNQSV9GUkFNRV9CSVRTKGJpdHMpOwotCXdyaXRlbCh0ZW1wLCBkc3BpLT5iYXNlICsgU1BJX0NUQVIoZHNwaS0+Y3MpKTsKKwlyZXR1cm4gKCh2YWwgJiBTUElfRlJBTUVfQklUU19NQVNLKSA9PSBTUElfRlJBTUVfQklUUyg4KSkgPyAwIDogMTsKIH0KIAogc3RhdGljIHZvaWQgaHpfdG9fc3BpX2JhdWQoY2hhciAqcGJyLCBjaGFyICpiciwgaW50IHNwZWVkX2h6LApAQCAtMTg4LDcgKzE4Miw4IEBACiAJICovCiAJaWYgKHR4X3dvcmQgJiYgKGRzcGktPmxlbiA9PSAxKSkgewogCQlkc3BpLT5kYXRhZmxhZ3MgfD0gVFJBTl9TVEFURV9XT1JEX09ERF9OVU07Ci0JCXNldF9iaXRfbW9kZShkc3BpLCA4KTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcGktPnJlZ21hcCwgU1BJX0NUQVIoZHNwaS0+Y3MpLAorCQkJCVNQSV9GUkFNRV9CSVRTX01BU0ssIFNQSV9GUkFNRV9CSVRTKDgpKTsKIAkJdHhfd29yZCA9IDA7CiAJfQogCkBAIC0yMzgsNyArMjMzLDggQEAKIAkJCWRzcGlfcHVzaHIgfD0gU1BJX1BVU0hSX0NUQ05UOyAvKiBjbGVhciBjb3VudGVyICovCiAJCX0KIAotCQl3cml0ZWwoZHNwaV9wdXNociwgZHNwaS0+YmFzZSArIFNQSV9QVVNIUik7CisJCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9QVVNIUiwgZHNwaV9wdXNocik7CisKIAkJdHhfY291bnQrKzsKIAl9CiAKQEAgLTI1MywxNyArMjQ5LDIzIEBACiAJd2hpbGUgKChkc3BpLT5yeCA8IGRzcGktPnJ4X2VuZCkKIAkJCSYmIChyeF9jb3VudCA8IERTUElfRklGT19TSVpFKSkgewogCQlpZiAocnhfd29yZCkgeworCQkJdW5zaWduZWQgaW50IHZhbDsKKwogCQkJaWYgKChkc3BpLT5yeF9lbmQgLSBkc3BpLT5yeCkgPT0gMSkKIAkJCQlicmVhazsKIAotCQkJZCA9IFNQSV9QT1BSX1JYREFUQShyZWFkbChkc3BpLT5iYXNlICsgU1BJX1BPUFIpKTsKKwkJCXJlZ21hcF9yZWFkKGRzcGktPnJlZ21hcCwgU1BJX1BPUFIsICZ2YWwpOworCQkJZCA9IFNQSV9QT1BSX1JYREFUQSh2YWwpOwogCiAJCQlpZiAoIShkc3BpLT5kYXRhZmxhZ3MgJiBUUkFOX1NUQVRFX1JYX1ZPSUQpKQogCQkJCSoodTE2ICopZHNwaS0+cnggPSBkOwogCQkJZHNwaS0+cnggKz0gMjsKIAogCQl9IGVsc2UgewotCQkJZCA9IFNQSV9QT1BSX1JYREFUQShyZWFkbChkc3BpLT5iYXNlICsgU1BJX1BPUFIpKTsKKwkJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJCXJlZ21hcF9yZWFkKGRzcGktPnJlZ21hcCwgU1BJX1BPUFIsICZ2YWwpOworCQkJZCA9IFNQSV9QT1BSX1JYREFUQSh2YWwpOwogCQkJaWYgKCEoZHNwaS0+ZGF0YWZsYWdzICYgVFJBTl9TVEFURV9SWF9WT0lEKSkKIAkJCQkqKHU4ICopZHNwaS0+cnggPSBkOwogCQkJZHNwaS0+cngrKzsKQEAgLTI5NSwxMyArMjk3LDEzIEBACiAJaWYgKCFkc3BpLT50eCkKIAkJZHNwaS0+ZGF0YWZsYWdzIHw9IFRSQU5fU1RBVEVfVFhfVk9JRDsKIAotCXdyaXRlbChkc3BpLT5jdXJfY2hpcC0+bWNyX3ZhbCwgZHNwaS0+YmFzZSArIFNQSV9NQ1IpOwotCXdyaXRlbChkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwsIGRzcGktPmJhc2UgKyBTUElfQ1RBUihkc3BpLT5jcykpOwotCXdyaXRlbChTUElfUlNFUl9FT1FGRSwgZHNwaS0+YmFzZSArIFNQSV9SU0VSKTsKKwlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfTUNSLCBkc3BpLT5jdXJfY2hpcC0+bWNyX3ZhbCk7CisJcmVnbWFwX3dyaXRlKGRzcGktPnJlZ21hcCwgU1BJX0NUQVIoZHNwaS0+Y3MpLCBkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwpOworCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9SU0VSLCBTUElfUlNFUl9FT1FGRSk7CiAKIAlpZiAodC0+c3BlZWRfaHopCi0JCXdyaXRlbChkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwsCi0JCQkJZHNwaS0+YmFzZSArIFNQSV9DVEFSKGRzcGktPmNzKSk7CisJCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwKKwkJCQlkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwpOwogCiAJZHNwaV90cmFuc2Zlcl93cml0ZShkc3BpKTsKIApAQCAtMzE1LDcgKzMxNyw5IEBACiBzdGF0aWMgdm9pZCBkc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQogewogCXN0cnVjdCBmc2xfZHNwaSAqZHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXUzMiBwdXNociA9IHJlYWRsKGRzcGktPmJhc2UgKyBTUElfUFVTSFIpOworCXVuc2lnbmVkIGludCBwdXNocjsKKworCXJlZ21hcF9yZWFkKGRzcGktPnJlZ21hcCwgU1BJX1BVU0hSLCAmcHVzaHIpOwogCiAJc3dpdGNoICh2YWx1ZSkgewogCWNhc2UgQklUQkFOR19DU19BQ1RJVkU6CkBAIC0zMjYsNyArMzMwLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jd3JpdGVsKHB1c2hyLCBkc3BpLT5iYXNlICsgU1BJX1BVU0hSKTsKKwlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfUFVTSFIsIHB1c2hyKTsKIH0KIAogc3RhdGljIGludCBkc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCkBAIC0zMzgsNyArMzQyLDggQEAKIAkvKiBPbmx5IGFsbG9jIG9uIGZpcnN0IHNldHVwICovCiAJY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwogCWlmIChjaGlwID09IE5VTEwpIHsKLQkJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjaGlwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJY2hpcCA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZihzdHJ1Y3QgY2hpcF9kYXRhKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghY2hpcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM0OSw3ICszNTQsNiBAQAogCQlmbXN6ID0gc3BpLT5iaXRzX3Blcl93b3JkIC0gMTsKIAl9IGVsc2UgewogCQlwcl9lcnIoIkludmFsaWQgd29yZHNpemVcbiIpOwotCQlrZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0zODIsMTMgKzM4NiwxNSBAQAogewogCXN0cnVjdCBmc2xfZHNwaSAqZHNwaSA9IChzdHJ1Y3QgZnNsX2RzcGkgKilkZXZfaWQ7CiAKLQl3cml0ZWwoU1BJX1NSX0VPUUYsIGRzcGktPmJhc2UgKyBTUElfU1IpOworCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9TUiwgU1BJX1NSX0VPUUYpOwogCiAJZHNwaV90cmFuc2Zlcl9yZWFkKGRzcGkpOwogCiAJaWYgKCFkc3BpLT5sZW4pIHsKIAkJaWYgKGRzcGktPmRhdGFmbGFncyAmIFRSQU5fU1RBVEVfV09SRF9PRERfTlVNKQotCQkJc2V0X2JpdF9tb2RlKGRzcGksIDE2KTsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwKKwkJCQlTUElfRlJBTUVfQklUU19NQVNLLCBTUElfRlJBTUVfQklUUygxNikpOworCiAJCWRzcGktPndhaXRmbGFncyA9IDE7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZHNwaS0+d2FpdHEpOwogCX0gZWxzZSB7CkBAIC00MzAsOCArNDM2LDEzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkc3BpX3BtID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGRzcGlfc3VzcGVuZCwgZHNwaV9yZXN1bWUpCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoZHNwaV9wbSwgZHNwaV9zdXNwZW5kLCBkc3BpX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBkc3BpX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnZhbF9iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS5tYXhfcmVnaXN0ZXIgPSAweDg4LAogfTsKIAogc3RhdGljIGludCBkc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC00NDAsNiArNDUxLDcgQEAKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBmc2xfZHNwaSAqZHNwaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IHJldCA9IDAsIGNzX251bSwgYnVzX251bTsKIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBmc2xfZHNwaSkpOwpAQCAtNDc0LDEyICs0ODYsMjQgQEAKIAltYXN0ZXItPmJ1c19udW0gPSBidXNfbnVtOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlkc3BpLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihkc3BpLT5iYXNlKSkgewotCQlyZXQgPSBQVFJfRVJSKGRzcGktPmJhc2UpOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2UpKSB7CisJCXJldCA9IFBUUl9FUlIoYmFzZSk7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAJfQogCisJZHNwaV9yZWdtYXBfY29uZmlnLmxvY2tfYXJnID0gZHNwaTsKKwlkc3BpX3JlZ21hcF9jb25maWcudmFsX2Zvcm1hdF9lbmRpYW4gPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuIikKKwkJCT8gUkVHTUFQX0VORElBTl9CSUcgOiBSRUdNQVBfRU5ESUFOX0RFRkFVTFQ7CisJZHNwaS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LCAiZHNwaSIsIGJhc2UsCisJCQkJCQkmZHNwaV9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGRzcGktPnJlZ21hcCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlbGRcbiIsCisJCQkJUFRSX0VSUihkc3BpLT5yZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHNwaS0+cmVnbWFwKTsKKwl9CisKIAlkc3BpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChkc3BpLT5pcnEgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBwbGF0Zm9ybSBpcnFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwppbmRleCA0MjhkYzdhLi42ZmIyYjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwpAQCAtMjE5LDEzICsyMTksOCBAQAogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOwotCXU4IGJpdHNfcGVyX3dvcmQ7CiAJaW50IHJldDsKIAotCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKHQtPmJpdHNfcGVyX3dvcmQpCi0JCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwotCiAJbXBjOHh4eF9zcGktPmxlbiA9IHQtPmxlbjsKIAlsZW4gPSByb3VuZHVwKGxlbiwgNCkgLyA0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuYwppbmRleCAwYjc1ZjI2Li5lNWQ0NWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCWNvbnN0IHZvaWQgKnByb3A7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKLQlwaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpwaW5mbyksIEdGUF9LRVJORUwpOworCXBpbmZvID0gZGV2bV9remFsbG9jKCZvZmRldi0+ZGV2LCBzaXplb2YoKnBpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIxNSwxNSArMjE1LDEzIEBACiAJcGRhdGEtPnN5c2NsayA9IGdldF9icmdmcmVxKCk7CiAJaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpIHsKIAkJcGRhdGEtPnN5c2NsayA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKLQkJaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpIHsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjsKLQkJfQorCQlpZiAocGRhdGEtPnN5c2NsayA9PSAtMSkKKwkJCXJldHVybiAtRU5PREVWOwogCX0KICNlbHNlCiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmcGRhdGEtPnN5c2Nsayk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCXJldHVybiByZXQ7CiAjZW5kaWYKIAogCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlIiwgTlVMTCk7CkBAIC0yMzcsOCArMjM1LDQgQEAKIAkJcGRhdGEtPmZsYWdzID0gU1BJX0NQTV9NT0RFIHwgU1BJX0NQTTE7CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCWtmcmVlKHBpbmZvKTsKLQlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtc3BpLmMKaW5kZXggMTE5ZjdhZi4uZjM1NDg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLXNwaS5jCkBAIC0yMzksMTIgKzIzOSw2IEBACiAJaWYgKCFiaXRzX3Blcl93b3JkKQogCQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCi0JLyogTWFrZSBzdXJlIGl0cyBhIGJpdCB3aWR0aCB3ZSBzdXBwb3J0IFs0Li4xNiwgMzJdICovCi0JaWYgKChiaXRzX3Blcl93b3JkIDwgNCkKLQkgICAgfHwgKChiaXRzX3Blcl93b3JkID4gMTYpICYmIChiaXRzX3Blcl93b3JkICE9IDMyKSkKLQkgICAgfHwgKGJpdHNfcGVyX3dvcmQgPiBtcGM4eHh4X3NwaS0+bWF4X2JpdHNfcGVyX3dvcmQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlmICghaHopCiAJCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CiAKQEAgLTM2MiwxOCArMzU2LDI4IEBACiBzdGF0aWMgdm9pZCBmc2xfc3BpX2RvX29uZV9tc2coc3RydWN0IHNwaV9tZXNzYWdlICptKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCAqZmlyc3Q7CiAJdW5zaWduZWQgaW50IGNzX2NoYW5nZTsKIAljb25zdCBpbnQgbnNlY3MgPSA1MDsKIAlpbnQgc3RhdHVzOwogCisJLyogRG9uJ3QgYWxsb3cgY2hhbmdlcyBpZiBDUyBpcyBhY3RpdmUgKi8KKwlmaXJzdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCXRyYW5zZmVyX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAoKGZpcnN0LT5iaXRzX3Blcl93b3JkICE9IHQtPmJpdHNfcGVyX3dvcmQpIHx8CisJCQkoZmlyc3QtPnNwZWVkX2h6ICE9IHQtPnNwZWVkX2h6KSkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJiaXRzX3Blcl93b3JkL3NwZWVkX2h6IHNob3VsZCBiZSBzYW1lIGZvciB0aGUgc2FtZSBTUEkgdHJhbnNmZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJY3NfY2hhbmdlID0gMTsKLQlzdGF0dXMgPSAwOworCXN0YXR1cyA9IC1FSU5WQUw7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CiAJCWlmICh0LT5iaXRzX3Blcl93b3JkIHx8IHQtPnNwZWVkX2h6KSB7Ci0JCQkvKiBEb24ndCBhbGxvdyBjaGFuZ2VzIGlmIENTIGlzIGFjdGl2ZSAqLwotCQkJc3RhdHVzID0gLUVJTlZBTDsKLQogCQkJaWYgKGNzX2NoYW5nZSkKIAkJCQlzdGF0dXMgPSBmc2xfc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CiAJCQlpZiAoc3RhdHVzIDwgMCkKQEAgLTY0MSw2ICs2NDUsMTAgQEAKIAlpZiAobXBjOHh4eF9zcGktPnR5cGUgPT0gVFlQRV9HUkxJQikKIAkJZnNsX3NwaV9ncmxpYl9wcm9iZShkZXYpOwogCisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPQorCQkoU1BJX0JQV19SQU5HRV9NQVNLKDQsIDE2KSB8IFNQSV9CUFdfTUFTSygzMikpICYKKwkJU1BJX0JQV19SQU5HRV9NQVNLKDEsIG1wYzh4eHhfc3BpLT5tYXhfYml0c19wZXJfd29yZCk7CisKIAlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFX0NQVV9NT0RFKQogCQltcGM4eHh4X3NwaS0+c2V0X3NoaWZ0cyA9IGZzbF9zcGlfcWVfY3B1X3NldF9zaGlmdHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMgYi9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jCmluZGV4IDdiZWViMjkuLjA5ODIzMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWdwaW8uYwpAQCAtMTksNyArMTksNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpAQCAtMjUwLDcgKzI0OSw3IEBACiAJCS8qCiAJCSAqIC4uLiBvdGhlcndpc2UsIHRha2UgaXQgZnJvbSBzcGktPmNvbnRyb2xsZXJfZGF0YQogCQkgKi8KLQkJY3MgPSAodW5zaWduZWQgaW50KSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwkJY3MgPSAodW5zaWduZWQgaW50KSh1aW50cHRyX3QpIHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCX0KIAogCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKSB7CkBAIC01MDMsMTMgKzUwMiwxMiBAQAogewogCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKIAlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7Ci0JaW50CQkJCXN0YXR1czsKIAogCXNwaV9ncGlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCiAJLyogc3RvcCgpIHVucmVnaXN0ZXJzIGNoaWxkIGRldmljZXMgdG9vICovCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmc3BpX2dwaW8tPmJpdGJhbmcpOworCXNwaV9iaXRiYW5nX3N0b3AoJnNwaV9ncGlvLT5iaXRiYW5nKTsKIAogCWlmIChTUElfTUlTT19HUElPICE9IFNQSV9HUElPX05PX01JU08pCiAJCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKQEAgLTUxOCw3ICs1MTYsNyBAQAogCWdwaW9fZnJlZShTUElfU0NLX0dQSU8pOwogCXNwaV9tYXN0ZXJfcHV0KHNwaV9ncGlvLT5iaXRiYW5nLm1hc3Rlcik7CiAKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiAwOwogfQogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWlteC5jIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCmluZGV4IDQ3ZjE1ZDkuLjVkYWZmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1pbXguYworKysgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTc0MSw3ICs3NDAsNyBAQAogCXNwaV9pbXgtPmNvdW50ID0gdHJhbnNmZXItPmxlbjsKIAlzcGlfaW14LT50eGZpZm8gPSAwOwogCi0JaW5pdF9jb21wbGV0aW9uKCZzcGlfaW14LT54ZmVyX2RvbmUpOworCXJlaW5pdF9jb21wbGV0aW9uKCZzcGlfaW14LT54ZmVyX2RvbmUpOwogCiAJc3BpX2lteF9wdXNoKHNwaV9pbXgpOwogCkBAIC04ODAsMTIgKzg3OSwxMiBAQAogCiAJc3BpX2lteC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoc3BpX2lteC0+aXJxIDwgMCkgewotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBzcGlfaW14LT5pcnE7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAJfQogCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBzcGlfaW14LT5pcnEsIHNwaV9pbXhfaXNyLCAwLAotCQkJICAgICAgIERSSVZFUl9OQU1FLCBzcGlfaW14KTsKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgc3BpX2lteCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaXJxJWQ6ICVkXG4iLCBzcGlfaW14LT5pcnEsIHJldCk7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jCmluZGV4IDUwMzIxNDEuLjM4MjJlZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jCkBAIC0xNiw3ICsxNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CkBAIC00NjYsMTAgKzQ2NSw4IEBACiAJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCBvbm9mZik7CiB9CiAKLS8qIGJ1c19udW0gaXMgdXNlZCBvbmx5IGZvciB0aGUgY2FzZSBkZXYtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCAqLwogc3RhdGljIGludCBtcGM1MTJ4X3BzY19zcGlfZG9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVnYWRkciwKLQkJCQkJICAgICAgdTMyIHNpemUsIHVuc2lnbmVkIGludCBpcnEsCi0JCQkJCSAgICAgIHMxNiBidXNfbnVtKQorCQkJCQkgICAgICB1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3QgbXBjNTEyeF9wc2Nfc3BpICptcHM7CkBAIC00ODgsNyArNDg1LDYgQEAKIAogCWlmIChwZGF0YSA9PSBOVUxMKSB7CiAJCW1wcy0+Y3NfY29udHJvbCA9IG1wYzUxMnhfc3BpX2NzX2NvbnRyb2w7Ci0JCW1hc3Rlci0+YnVzX251bSA9IGJ1c19udW07CiAJfSBlbHNlIHsKIAkJbXBzLT5jc19jb250cm9sID0gcGRhdGEtPmNzX2NvbnRyb2w7CiAJCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOwpAQCAtNTc0LDcgKzU3MCw2IEBACiB7CiAJY29uc3QgdTMyICpyZWdhZGRyX3A7CiAJdTY0IHJlZ2FkZHI2NCwgc2l6ZTY0OwotCXMxNiBpZCA9IC0xOwogCiAJcmVnYWRkcl9wID0gb2ZfZ2V0X2FkZHJlc3Mob3AtPmRldi5vZl9ub2RlLCAwLCAmc2l6ZTY0LCBOVUxMKTsKIAlpZiAoIXJlZ2FkZHJfcCkgewpAQCAtNTgzLDE2ICs1NzgsOCBAQAogCX0KIAlyZWdhZGRyNjQgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhvcC0+ZGV2Lm9mX25vZGUsIHJlZ2FkZHJfcCk7CiAKLQkvKiBnZXQgUFNDIGlkICgwLi4xMSwgdXNlZCBieSBwb3J0X2NvbmZpZykgKi8KLQlpZCA9IG9mX2FsaWFzX2dldF9pZChvcC0+ZGV2Lm9mX25vZGUsICJzcGkiKTsKLQlpZiAoaWQgPCAwKSB7Ci0JCWRldl9lcnIoJm9wLT5kZXYsICJubyBhbGlhcyBpZCBmb3IgJXNcbiIsCi0JCQlvcC0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KIAlyZXR1cm4gbXBjNTEyeF9wc2Nfc3BpX2RvX3Byb2JlKCZvcC0+ZGV2LCAodTMyKSByZWdhZGRyNjQsICh1MzIpIHNpemU2NCwKLQkJCQlpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+ZGV2Lm9mX25vZGUsIDApLCBpZCk7CisJCQkJaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKSk7CiB9CiAKIHN0YXRpYyBpbnQgbXBjNTEyeF9wc2Nfc3BpX29mX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKaW5kZXggMDBiYTkxMC4uM2QxOGQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jCmluZGV4IDdjNjc1ZmUuLmFhYzJhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwpAQCAtMTIsNyArMTIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzU3LDIwICszNTYsNiBAQAogICogc3BpX21hc3RlciBvcHMKICAqLwogCi1zdGF0aWMgaW50IG1wYzUyeHhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaWYgKHNwaS0+Yml0c19wZXJfd29yZCAlIDgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHNwaS0+bW9kZSAmIH4oU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9MU0JfRklSU1QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChzcGktPmNoaXBfc2VsZWN0ID49IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtcGM1Mnh4X3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCiB7CiAJc3RydWN0IG1wYzUyeHhfc3BpICptcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtNDMzLDkgKzQxOCw5IEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAotCW1hc3Rlci0+c2V0dXAgPSBtcGM1Mnh4X3NwaV9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyID0gbXBjNTJ4eF9zcGlfdHJhbnNmZXI7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVDsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KTsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gb3AtPmRldi5vZl9ub2RlOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEob3AsIG1hc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXhzLmMgYi9kcml2ZXJzL3NwaS9zcGktbXhzLmMKaW5kZXggNzllNWFhMi4uMjg4NGYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW14cy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1teHMuYwpAQCAtMjksNyArMjksNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTM3MSw3ICszNzAsNyBAQAogewogCXN0cnVjdCBteHNfc3BpICpzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJc3RydWN0IG14c19zc3AgKnNzcCA9ICZzcGktPnNzcDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCAqdG1wX3Q7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKIAl1bnNpZ25lZCBpbnQgZmxhZzsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMzgxLDcgKzM4MCw3IEBACiAJd3JpdGVsKG14c19zcGlfY3NfdG9fcmVnKG0tPnNwaS0+Y2hpcF9zZWxlY3QpLAogCSAgICAgICBzc3AtPmJhc2UgKyBIV19TU1BfQ1RSTDAgKyBTVE1QX09GRlNFVF9SRUdfU0VUKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0LCB0bXBfdCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCiAJCXN0YXR1cyA9IG14c19zcGlfc2V0dXBfdHJhbnNmZXIobS0+c3BpLCB0KTsKIAkJaWYgKHN0YXR1cykKQEAgLTQ3Myw3ICs0NzIsNyBAQAogCWlvcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnFfZXJyID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxX2VyciA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gaXJxX2VycjsKIAogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgaW9yZXMpOwogCWlmIChJU19FUlIoYmFzZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMgYi9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKaW5kZXggYmFlOTdmZi4uMTZlMzBkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYwpAQCAtOSw3ICs5LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zOCw3ICszNyw5IEBACiAvKiB1c2kgcmVnaXN0ZXIgYml0ICovCiAjZGVmaW5lIEVOSU5UCQkoMHgwMSA8PCAxNykKICNkZWZpbmUgRU5GTEcJCSgweDAxIDw8IDE2KQorI2RlZmluZSBTTEVFUAkJKDB4MGYgPDwgMTIpCiAjZGVmaW5lIFRYTlVNCQkoMHgwMyA8PCA4KQorI2RlZmluZSBUWEJJVExFTgkoMHgxZiA8PCAzKQogI2RlZmluZSBUWE5FRwkJKDB4MDEgPDwgMikKICNkZWZpbmUgUlhORUcJCSgweDAxIDw8IDEpCiAjZGVmaW5lIExTQgkJKDB4MDEgPDwgMTApCkBAIC01OCwxMSArNTksOCBAQAogCXVuc2lnbmVkIGNoYXIJCSpyeDsKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJKmN1cmRldjsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBudWM5MDBfc3BpX2luZm8gKnBkYXRhOwogCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IHJlc291cmNlCQkqcmVzOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbnVjOTAwX3NwaSAqdG9faHcoc3RydWN0IHNwaV9kZXZpY2UgKnNkZXYpCkBAIC0xMTksMTkgKzExNywxNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9zZXR1cF90eG51bShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsCi0JCQkJCQkJdW5zaWduZWQgaW50IHR4bnVtKQorc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9zZXR1cF90eG51bShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIHVuc2lnbmVkIGludCB0eG51bSkKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKSAmIH5UWE5VTTsKIAotCWlmICghdHhudW0pCi0JCXZhbCAmPSB+VFhOVU07Ci0JZWxzZQorCWlmICh0eG51bSkKIAkJdmFsIHw9IHR4bnVtIDw8IDB4MDg7CiAKIAlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOwpAQCAtMTQ4LDcgKzE0Myw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKSAmIH5UWEJJVExFTjsKIAogCXZhbCB8PSAodHhiaXRsZW4gPDwgMHgwMyk7CiAKQEAgLTI4NywxMiArMjgyLDExIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKSAmIH5TTEVFUDsKIAogCWlmIChzbGVlcCkKIAkJdmFsIHw9IChzbGVlcCA8PCAxMik7Ci0JZWxzZQotCQl2YWwgJj0gfigweDBmIDw8IDEyKTsKKwogCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOwpAQCAtMzM4LDYgKzMzMiw3IEBACiB7CiAJc3RydWN0IG51YzkwMF9zcGkgKmh3OwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGVyciA9IDA7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnVjOTAwX3NwaSkpOwpAQCAtMzQ5LDcgKzM0NCw2IEBACiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJaHctPm1hc3RlciA9IG1hc3RlcjsKIAlody0+cGRhdGEgID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlody0+ZGV2ID0gJnBkZXYtPmRldjsKIAogCWlmIChody0+cGRhdGEgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKQEAgLTM2OSw4ICszNjMsOCBAQAogCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgICAgID0gbnVjOTAwX3NwaV9jaGlwc2VsOwogCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyAgICAgID0gbnVjOTAwX3NwaV90eHJ4OwogCi0JaHctPnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaHctPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgaHctPnJlcyk7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlody0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIoaHctPnJlZ3MpKSB7CiAJCWVyciA9IFBUUl9FUlIoaHctPnJlZ3MpOwogCQlnb3RvIGVycl9wZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMgYi9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCmluZGV4IGY3Yzg5NmUuLjg5OThkMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9jLXRpbnkuYwpAQCAtMTUsNyArMTUsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjY3LDggKzI2Niw2IEBACiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgZm9yIHRoZSBiaXRiYW5nIGRyaXZlciAqLwogCWh3LT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKLQlpZiAoIWh3LT5iaXRiYW5nLm1hc3RlcikKLQkJcmV0dXJuIGVycjsKIAlody0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHRpbnlfc3BpX3NldHVwX3RyYW5zZmVyOwogCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgPSB0aW55X3NwaV9jaGlwc2VsZWN0OwogCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyA9IHRpbnlfc3BpX3R4cnhfYnVmczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYyBiL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYwppbmRleCA2NzI0OWE0Li5jNWUyZjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb2N0ZW9uLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9jdGVvbi5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIApAQCAtMzMsMTMgKzMyLDYgQEAKIAl1NjQgY3NfZW5heDsKIH07CiAKLXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwIHsKLQl1MzIgbWF4X3NwZWVkX2h6OwotCXU4IGNoaXBfc2VsZWN0OwotCXU4IG1vZGU7Ci0JdTggYml0c19wZXJfd29yZDsKLX07Ci0KIHN0YXRpYyB2b2lkIG9jdGVvbl9zcGlfd2FpdF9yZWFkeShzdHJ1Y3Qgb2N0ZW9uX3NwaSAqcCkKIHsKIAl1bmlvbiBjdm14X21waV9zdHMgbXBpX3N0czsKQEAgLTU3LDYgKzQ5LDcgQEAKIAkJCQkgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIsCiAJCQkJICBib29sIGxhc3RfeGZlcikKIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbXNnLT5zcGk7CiAJdW5pb24gY3ZteF9tcGlfY2ZnIG1waV9jZmc7CiAJdW5pb24gY3ZteF9tcGlfdHggbXBpX3R4OwogCXVuc2lnbmVkIGludCBjbGtkaXY7CkBAIC02OCwxOCArNjEsMTEgQEAKIAlpbnQgbGVuOwogCWludCBpOwogCi0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm1zZ19zZXR1cCA9IHNwaV9nZXRfY3RsZGF0YShtc2ctPnNwaSk7Ci0KLQlzcGVlZF9oeiA9IG1zZ19zZXR1cC0+bWF4X3NwZWVkX2h6OwotCW1vZGUgPSBtc2dfc2V0dXAtPm1vZGU7CisJbW9kZSA9IHNwaS0+bW9kZTsKIAljcGhhID0gbW9kZSAmIFNQSV9DUEhBOwogCWNwb2wgPSBtb2RlICYgU1BJX0NQT0w7CiAKLQlpZiAoeGZlci0+c3BlZWRfaHopCi0JCXNwZWVkX2h6ID0geGZlci0+c3BlZWRfaHo7Ci0KLQlpZiAoc3BlZWRfaHogPiBPQ1RFT05fU1BJX01BWF9DTE9DS19IWikKLQkJc3BlZWRfaHogPSBPQ1RFT05fU1BJX01BWF9DTE9DS19IWjsKKwlzcGVlZF9oeiA9IHhmZXItPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKIAogCWNsa2RpdiA9IG9jdGVvbl9nZXRfaW9fY2xvY2tfcmF0ZSgpIC8gKDIgKiBzcGVlZF9oeik7CiAKQEAgLTkzLDggKzc5LDggQEAKIAltcGlfY2ZnLnMuY3NsYXRlID0gY3BoYSA/IDEgOiAwOwogCW1waV9jZmcucy5lbmFibGUgPSAxOwogCi0JaWYgKG1zZ19zZXR1cC0+Y2hpcF9zZWxlY3QgPCA0KQotCQlwLT5jc19lbmF4IHw9IDF1bGwgPDwgKDEyICsgbXNnX3NldHVwLT5jaGlwX3NlbGVjdCk7CisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPCA0KQorCQlwLT5jc19lbmF4IHw9IDF1bGwgPDwgKDEyICsgc3BpLT5jaGlwX3NlbGVjdCk7CiAJbXBpX2NmZy51NjQgfD0gcC0+Y3NfZW5heDsKIAogCWlmIChtcGlfY2ZnLnU2NCAhPSBwLT5sYXN0X2NmZykgewpAQCAtMTE0LDcgKzEwMCw3IEBACiAJCQljdm14X3dyaXRlX2NzcihwLT5yZWdpc3Rlcl9iYXNlICsgT0NURU9OX1NQSV9EQVQwICsgKDggKiBpKSwgZCk7CiAJCX0KIAkJbXBpX3R4LnU2NCA9IDA7Ci0JCW1waV90eC5zLmNzaWQgPSBtc2dfc2V0dXAtPmNoaXBfc2VsZWN0OworCQltcGlfdHgucy5jc2lkID0gc3BpLT5jaGlwX3NlbGVjdDsKIAkJbXBpX3R4LnMubGVhdmVjcyA9IDE7CiAJCW1waV90eC5zLnR4bnVtID0gdHhfYnVmID8gT0NURU9OX1NQSV9NQVhfQllURVMgOiAwOwogCQltcGlfdHgucy50b3RudW0gPSBPQ1RFT05fU1BJX01BWF9CWVRFUzsKQEAgLTEzOSw3ICsxMjUsNyBAQAogCX0KIAogCW1waV90eC51NjQgPSAwOwotCW1waV90eC5zLmNzaWQgPSBtc2dfc2V0dXAtPmNoaXBfc2VsZWN0OworCW1waV90eC5zLmNzaWQgPSBzcGktPmNoaXBfc2VsZWN0OwogCWlmIChsYXN0X3hmZXIpCiAJCW1waV90eC5zLmxlYXZlY3MgPSB4ZmVyLT5jc19jaGFuZ2U7CiAJZWxzZQpAQCAtMTY5LDE3ICsxNTUsOSBAQAogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CiAKLQkvKgotCSAqIFdlIGJldHRlciBoYXZlIHNldCB0aGUgY29uZmlndXJhdGlvbiB2aWEgYSBjYWxsIHRvIC5zZXR1cAotCSAqIGJlZm9yZSB3ZSBnZXQgaGVyZS4KLQkgKi8KLQlpZiAoc3BpX2dldF9jdGxkYXRhKG1zZy0+c3BpKSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWJvb2wgbGFzdF94ZmVyID0gJnhmZXItPnRyYW5zZmVyX2xpc3QgPT0gbXNnLT50cmFuc2ZlcnMucHJldjsKKwkJYm9vbCBsYXN0X3hmZXIgPSBsaXN0X2lzX2xhc3QoJnhmZXItPnRyYW5zZmVyX2xpc3QsCisJCQkJCSAgICAgICZtc2ctPnRyYW5zZmVycyk7CiAJCWludCByID0gb2N0ZW9uX3NwaV9kb190cmFuc2ZlcihwLCBtc2csIHhmZXIsIGxhc3RfeGZlcik7CiAJCWlmIChyIDwgMCkgewogCQkJc3RhdHVzID0gcjsKQEAgLTE5NCw0MSArMTcyLDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm9jdGVvbl9zcGlfbmV3X3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKnNldHVwID0ga3phbGxvYyhzaXplb2YoKnNldHVwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXR1cCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZXR1cC0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0Jc2V0dXAtPmNoaXBfc2VsZWN0ID0gc3BpLT5jaGlwX3NlbGVjdDsKLQlzZXR1cC0+bW9kZSA9IHNwaS0+bW9kZTsKLQlzZXR1cC0+Yml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQlyZXR1cm4gc2V0dXA7Ci19Ci0KLXN0YXRpYyBpbnQgb2N0ZW9uX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICpuZXdfc2V0dXA7Ci0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm9sZF9zZXR1cCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCi0JbmV3X3NldHVwID0gb2N0ZW9uX3NwaV9uZXdfc2V0dXAoc3BpKTsKLQlpZiAoIW5ld19zZXR1cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBuZXdfc2V0dXApOwotCWtmcmVlKG9sZF9zZXR1cCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb2N0ZW9uX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm9sZF9zZXR1cCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCXNwaV9zZXRfY3RsZGF0YShzcGksIE5VTEwpOwotCWtmcmVlKG9sZF9zZXR1cCk7Ci19Ci0KIHN0YXRpYyBpbnQgb2N0ZW9uX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzX21lbTsKQEAgLTI1Nyw4ICsyMDAsNiBAQAogCXAtPnJlZ2lzdGVyX2Jhc2UgPSAodTY0KWRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXNfbWVtLT5zdGFydCwKIAkJCQkJICAgICByZXNvdXJjZV9zaXplKHJlc19tZW0pKTsKIAotCS8qIER5bmFtaWMgYnVzIG51bWJlcmluZyAqLwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA0OwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQSEEgfAogCQkJICAgIFNQSV9DUE9MIHwKQEAgLTI2NiwxMCArMjA3LDkgQEAKIAkJCSAgICBTUElfTFNCX0ZJUlNUIHwKIAkJCSAgICBTUElfM1dJUkU7CiAKLQltYXN0ZXItPnNldHVwID0gb2N0ZW9uX3NwaV9zZXR1cDsKLQltYXN0ZXItPmNsZWFudXAgPSBvY3Rlb25fc3BpX2NsZWFudXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IG9jdGVvbl9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBPQ1RFT05fU1BJX01BWF9DTE9DS19IWjsKIAogCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAllcnIgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLTEwMGsuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLTEwMGsuYwppbmRleCAwZDMyMDU0Li5lN2ZmY2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb21hcC0xMDBrLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtMTAway5jCkBAIC04MywxNSArODMsMTEgQEAKICNkZWZpbmUgU1BJX1NIVVRET1dOCTEKIAogc3RydWN0IG9tYXAxX3NwaTEwMGsgewotCXN0cnVjdCBzcGlfbWFzdGVyICAgICAgICptYXN0ZXI7CiAJc3RydWN0IGNsayAgICAgICAgICAgICAgKmljazsKIAlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAqZmNrOwogCiAJLyogVmlydHVhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgKi8KIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAqYmFzZTsKLQotCS8qIFN0YXRlIG9mIHRoZSBTUEkgKi8KLQl1bnNpZ25lZCBpbnQJCXN0YXRlOwogfTsKIAogc3RydWN0IG9tYXAxX3NwaTEwMGtfY3MgewpAQCAtOTksMTMgKzk1LDYgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICB3b3JkX2xlbjsKIH07CiAKLSNkZWZpbmUgTU9EX1JFR19CSVQodmFsLCBtYXNrLCBzZXQpIGRvIHsgXAotCWlmIChzZXQpIFwKLQkJdmFsIHw9IG1hc2s7IFwKLQllbHNlIFwKLQkJdmFsICY9IH5tYXNrOyBcCi19IHdoaWxlICgwKQotCiBzdGF0aWMgdm9pZCBzcGkxMDBrX2VuYWJsZV9jbG9jayhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewogCXVuc2lnbmVkIGludCB2YWw7CkBAIC0xMzksNyArMTI4LDcgQEAKIAl9CiAKIAlzcGkxMDBrX2VuYWJsZV9jbG9jayhtYXN0ZXIpOwotCXdyaXRldyggZGF0YSAsIHNwaTEwMGstPmJhc2UgKyBTUElfVFhfTVNCKTsKKwl3cml0ZXcoZGF0YSAsIHNwaTEwMGstPmJhc2UgKyBTUElfVFhfTVNCKTsKIAogCXdyaXRldyhTUElfQ1RSTF9TRU4oMCkgfAogCSAgICAgICBTUElfQ1RSTF9XT1JEX1NJWkUobGVuKSB8CkBAIC0xNDcsNyArMTM2LDggQEAKIAkgICAgICAgc3BpMTAway0+YmFzZSArIFNQSV9DVFJMKTsKIAogCS8qIFdhaXQgZm9yIGJpdCBhY2sgc2VuZCBjaGFuZ2UgKi8KLQl3aGlsZSgocmVhZHcoc3BpMTAway0+YmFzZSArIFNQSV9TVEFUVVMpICYgU1BJX1NUQVRVU19XRSkgIT0gU1BJX1NUQVRVU19XRSk7CisJd2hpbGUgKChyZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX1dFKSAhPSBTUElfU1RBVFVTX1dFKQorCQk7CiAJdWRlbGF5KDEwMDApOwogCiAJc3BpMTAwa19kaXNhYmxlX2Nsb2NrKG1hc3Rlcik7CkBAIC0xNTUsNyArMTQ1LDcgQEAKIAogc3RhdGljIGludCBzcGkxMDBrX3JlYWRfZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgbGVuKQogewotCWludCBkYXRhSCxkYXRhTDsKKwlpbnQgZGF0YUgsIGRhdGFMOwogCXN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJLyogQWx3YXlzIGRvIGF0IGxlYXN0IDE2IGJpdHMgKi8KQEAgLTE2OCw3ICsxNTgsOCBAQAogCSAgICAgICBTUElfQ1RSTF9SRCwKIAkgICAgICAgc3BpMTAway0+YmFzZSArIFNQSV9DVFJMKTsKIAotCXdoaWxlKChyZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX1JEKSAhPSBTUElfU1RBVFVTX1JEKTsKKwl3aGlsZSAoKHJlYWR3KHNwaTEwMGstPmJhc2UgKyBTUElfU1RBVFVTKSAmIFNQSV9TVEFUVVNfUkQpICE9IFNQSV9TVEFUVVNfUkQpCisJCTsKIAl1ZGVsYXkoMTAwMCk7CiAKIAlkYXRhTCA9IHJlYWR3KHNwaTEwMGstPmJhc2UgKyBTUElfUlhfTFNCKTsKQEAgLTIwNCwxMiArMTk1LDEwIEBACiBzdGF0aWMgdW5zaWduZWQKIG9tYXAxX3NwaTEwMGtfdHhyeF9waW8oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKLQlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKIAlzdHJ1Y3Qgb21hcDFfc3BpMTAwa19jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgY291bnQsIGM7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgd29yZF9sZW47CiAKLQlzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJY291bnQgPSB4ZmVyLT5sZW47CiAJYyA9IGNvdW50OwogCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOwpAQCAtMjIxLDEyICsyMTAsMTIgQEAKIAkJcnggPSB4ZmVyLT5yeF9idWY7CiAJCXR4ID0geGZlci0+dHhfYnVmOwogCQlkbyB7Ci0JCQljLT0xOworCQkJYyAtPSAxOwogCQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKQogCQkJCXNwaTEwMGtfd3JpdGVfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4sICp0eCsrKTsKIAkJCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkKIAkJCQkqcngrKyA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLCB3b3JkX2xlbik7Ci0JCX0gd2hpbGUoYyk7CisJCX0gd2hpbGUgKGMpOwogCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMTYpIHsKIAkJdTE2ICAgICAgICAgICAgICpyeDsKIAkJY29uc3QgdTE2ICAgICAgICp0eDsKQEAgLTIzNCwxMiArMjIzLDEyIEBACiAJCXJ4ID0geGZlci0+cnhfYnVmOwogCQl0eCA9IHhmZXItPnR4X2J1ZjsKIAkJZG8gewotCQkJYy09MjsKKwkJCWMgLT0gMjsKIAkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkKLQkJCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4sICp0eCsrKTsKKwkJCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsIHdvcmRfbGVuLCAqdHgrKyk7CiAJCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpCi0JCQkJKnJ4KysgPSBzcGkxMDBrX3JlYWRfZGF0YShzcGktPm1hc3Rlcix3b3JkX2xlbik7Ci0JCX0gd2hpbGUoYyk7CisJCQkJKnJ4KysgPSBzcGkxMDBrX3JlYWRfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4pOworCQl9IHdoaWxlIChjKTsKIAl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDMyKSB7CiAJCXUzMiAgICAgICAgICAgICAqcng7CiAJCWNvbnN0IHUzMiAgICAgICAqdHg7CkBAIC0yNDcsMTIgKzIzNiwxMiBAQAogCQlyeCA9IHhmZXItPnJ4X2J1ZjsKIAkJdHggPSB4ZmVyLT50eF9idWY7CiAJCWRvIHsKLQkJCWMtPTQ7CisJCQljIC09IDQ7CiAJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpCi0JCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuLCAqdHgpOworCQkJCXNwaTEwMGtfd3JpdGVfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4sICp0eCk7CiAJCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpCi0JCQkJKnJ4ID0gc3BpMTAwa19yZWFkX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4pOwotCQl9IHdoaWxlKGMpOworCQkJCSpyeCA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLCB3b3JkX2xlbik7CisJCX0gd2hpbGUgKGMpOwogCX0KIAlyZXR1cm4gY291bnQgLSBjOwogfQpAQCAtMjk0LDcgKzI4Myw3IEBACiAJc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCiAJaWYgKCFjcykgewotCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWNzID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpjcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWNzKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWNzLT5iYXNlID0gc3BpMTAway0+YmFzZSArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OwpAQCAtNDExLDE0ICs0MDAsMTQgQEAKIAlpZiAoIXBkZXYtPmlkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpzcGkxMDBrKTsKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqc3BpMTAwaykpOwogCWlmIChtYXN0ZXIgPT0gTlVMTCkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtYXN0ZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocGRldi0+aWQgIT0gLTEpCi0JICAgICAgIG1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKIAogCW1hc3Rlci0+c2V0dXAgPSBvbWFwMV9zcGkxMDBrX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBvbWFwMV9zcGkxMDBrX3RyYW5zZmVyX29uZV9tZXNzYWdlOwpAQCAtNDM0LDcgKzQyMyw2IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAogCXNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3BpMTAway0+bWFzdGVyID0gbWFzdGVyOwogCiAJLyoKIAkgKiBUaGUgbWVtb3J5IHJlZ2lvbiBiYXNlIGFkZHJlc3MgaXMgdGFrZW4gYXMgdGhlIHBsYXRmb3JtX2RhdGEuCkBAIC00NjEsOCArNDQ5LDYgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBlcnI7CiAKLQlzcGkxMDBrLT5zdGF0ZSA9IFNQSV9SVU5OSU5HOwotCiAJcmV0dXJuIHN0YXR1czsKIAogZXJyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMKaW5kZXggOTMxM2ZkMy4uYmUyYTJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYworKysgYi9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jCkBAIC05OSw3ICs5OSw2IEBACiB9OwogCiBzdHJ1Y3QgdXdpcmVfc3RhdGUgewotCXVuc2lnbmVkCWJpdHNfcGVyX3dvcmQ7CiAJdW5zaWduZWQJZGl2MV9pZHg7CiB9OwogCkBAIC0yMTAsOSArMjA5LDggQEAKIAogc3RhdGljIGludCB1d2lyZV90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7Ci0Jc3RydWN0IHV3aXJlX3N0YXRlICp1c3QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQJbGVuID0gdC0+bGVuOwotCXVuc2lnbmVkCWJpdHMgPSB1c3QtPmJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKIAl1bnNpZ25lZAlieXRlczsKIAl1MTYJCXZhbCwgdzsKIAlpbnQJCXN0YXR1cyA9IDA7CkBAIC0yMjAsMTAgKzIxOCw2IEBACiAJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZikKIAkJcmV0dXJuIDA7CiAKLQkvKiBNaWNyb3dpcmUgZG9lc24ndCByZWFkIGFuZCB3cml0ZSBjb25jdXJyZW50bHkgKi8KLQlpZiAodC0+dHhfYnVmICYmIHQtPnJ4X2J1ZikKLQkJcmV0dXJuIC1FUEVSTTsKLQogCXcgPSBzcGktPmNoaXBfc2VsZWN0IDw8IDEwOwogCXcgfD0gQ1NfQ01EOwogCkBAIC0zMjIsNyArMzE2LDYgQEAKIAlzdHJ1Y3QgdXdpcmVfc3RhdGUJKnVzdCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZTsKIAl1bnNpZ25lZAkJZmxhZ3MgPSAwOwotCXVuc2lnbmVkCQliaXRzOwogCXVuc2lnbmVkCQloejsKIAl1bnNpZ25lZCBsb25nCQlyYXRlOwogCWludAkJCWRpdjFfaWR4OwpAQCAtMzMyLDIzICszMjUsNiBAQAogCiAJdXdpcmUgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gMykgewotCQlwcl9kZWJ1ZygiJXM6IGNzJWQ/XG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLCBzcGktPmNoaXBfc2VsZWN0KTsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKHQgIT0gTlVMTCAmJiB0LT5iaXRzX3Blcl93b3JkKQotCQliaXRzID0gdC0+Yml0c19wZXJfd29yZDsKLQotCWlmIChiaXRzID4gMTYpIHsKLQkJcHJfZGVidWcoIiVzOiB3b3Jkc2l6ZSAlZD9cbiIsIGRldl9uYW1lKCZzcGktPmRldiksIGJpdHMpOwotCQlzdGF0dXMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCXVzdC0+Yml0c19wZXJfd29yZCA9IGJpdHM7Ci0KIAkvKiBtb2RlIDAuLjMsIGNsb2NrIGludmVydGVkIHNlcGFyYXRlbHk7CiAJICogc3RhbmRhcmQgbkNTIHNpZ25hbGluZzsKIAkgKiBkb24ndCB0cmVhdCBEST1oaWdoIGFzICJub3QgcmVhZHkiCkBAIC01MDIsNiArNDc4LDcgQEAKIAkJc3RhdHVzID0gUFRSX0VSUih1d2lyZS0+Y2spOwogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyBmdW5jdGlvbmFsIGNsb2NrP1xuIik7CiAJCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJCWlvdW5tYXAodXdpcmVfYmFzZSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCWNsa19lbmFibGUodXdpcmUtPmNrKTsKQEAgLTUxNSw3ICs0OTIsNyBAQAogCiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7Ci0KKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfUkFOR0VfTUFTSygxLCAxNik7CiAJbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfSEFMRl9EVVBMRVg7CiAKIAltYXN0ZXItPmJ1c19udW0gPSAyOwkvKiAib2ZmaWNpYWwiICovCkBAIC01MzksMTQgKzUxNiwxMyBAQAogc3RhdGljIGludCB1d2lyZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludAkJCXN0YXR1czsKIAogCS8vIEZJWE1FIHJlbW92ZSBhbGwgY2hpbGQgZGV2aWNlcywgc29tZXdoZXJlIC4uLgogCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmdXdpcmUtPmJpdGJhbmcpOworCXNwaV9iaXRiYW5nX3N0b3AoJnV3aXJlLT5iaXRiYW5nKTsKIAl1d2lyZV9vZmYodXdpcmUpOwogCWlvdW5tYXAodXdpcmVfYmFzZSk7Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCmluZGV4IGE3MjEyN2YuLjI5NDFjNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCkBAIC0yMiw3ICsyMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTQ1LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1vbWFwMi1tY3NwaS5oPgogCiAjZGVmaW5lIE9NQVAyX01DU1BJX01BWF9GUkVRCQk0ODAwMDAwMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRElWSURFUgkJNDA5NgogI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRklGT0RFUFRICTY0CiAjZGVmaW5lIE9NQVAyX01DU1BJX01BWF9GSUZPV0NOVAkweEZGRkYKICNkZWZpbmUgU1BJX0FVVE9TVVNQRU5EX1RJTUVPVVQJCTIwMDAKQEAgLTg5LDYgKzg5LDcgQEAKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFCUJJVCgyMCkKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZGRVQJCUJJVCgyNykKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZGRVIJCUJJVCgyOCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0NMS0cJCUJJVCgyOSkKIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTCQlCSVQoMCkKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX1RYUwkJQklUKDEpCkBAIC05Niw2ICs5Nyw3IEBACiAjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9UWEZGRQlCSVQoMykKIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkxfRU4JCUJJVCgwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkxfRVhUQ0xLX01BU0sJKDB4ZmYgPDwgOCkKIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEVfV0tFTglCSVQoMCkKIApAQCAtMTQ5LDcgKzE1MSw3IEBACiAJaW50CQkJd29yZF9sZW47CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwogCS8qIENvbnRleHQgc2F2ZSBhbmQgcmVzdG9yZSBzaGFkb3cgcmVnaXN0ZXIgKi8KLQl1MzIJCQljaGNvbmYwOworCXUzMgkJCWNoY29uZjAsIGNoY3RybDA7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCkBAIC0yMzAsMTAgKzIzMiwxNiBAQAogCiBzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBlbmFibGUpCiB7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAl1MzIgbDsKIAotCWwgPSBlbmFibGUgPyBPTUFQMl9NQ1NQSV9DSENUUkxfRU4gOiAwOwotCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ1RSTDAsIGwpOworCWwgPSBjcy0+Y2hjdHJsMDsKKwlpZiAoZW5hYmxlKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ1RSTF9FTjsKKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ1RSTF9FTjsKKwljcy0+Y2hjdHJsMCA9IGw7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCwgY3MtPmNoY3RybDApOwogCS8qIEZsYXNoIHBvc3Qtd3JpdGVzICovCiAJbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwKTsKIH0KQEAgLTg0MCw3ICs4NDgsNyBAQAogCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaTsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2NudHJsOwotCXUzMiBsID0gMCwgZGl2ID0gMDsKKwl1MzIgbCA9IDAsIGNsa2QgPSAwLCBkaXYsIGV4dGNsayA9IDAsIGNsa2cgPSAwOwogCXU4IHdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCXUzMiBzcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwogCkBAIC04NTYsNyArODY0LDE3IEBACiAJCXNwZWVkX2h6ID0gdC0+c3BlZWRfaHo7CiAKIAlzcGVlZF9oeiA9IG1pbl90KHUzMiwgc3BlZWRfaHosIE9NQVAyX01DU1BJX01BWF9GUkVRKTsKLQlkaXYgPSBvbWFwMl9tY3NwaV9jYWxjX2Rpdmlzb3Ioc3BlZWRfaHopOworCWlmIChzcGVlZF9oeiA8IChPTUFQMl9NQ1NQSV9NQVhfRlJFUSAvIE9NQVAyX01DU1BJX01BWF9ESVZJREVSKSkgeworCQljbGtkID0gb21hcDJfbWNzcGlfY2FsY19kaXZpc29yKHNwZWVkX2h6KTsKKwkJc3BlZWRfaHogPSBPTUFQMl9NQ1NQSV9NQVhfRlJFUSA+PiBjbGtkOworCQljbGtnID0gMDsKKwl9IGVsc2UgeworCQlkaXYgPSAoT01BUDJfTUNTUElfTUFYX0ZSRVEgKyBzcGVlZF9oeiAtIDEpIC8gc3BlZWRfaHo7CisJCXNwZWVkX2h6ID0gT01BUDJfTUNTUElfTUFYX0ZSRVEgLyBkaXY7CisJCWNsa2QgPSAoZGl2IC0gMSkgJiAweGY7CisJCWV4dGNsayA9IChkaXYgLSAxKSA+PiA0OworCQljbGtnID0gT01BUDJfTUNTUElfQ0hDT05GX0NMS0c7CisJfQogCiAJbCA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7CiAKQEAgLTg4NSw3ICs5MDMsMTYgQEAKIAogCS8qIHNldCBjbG9jayBkaXZpc29yICovCiAJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0NMS0RfTUFTSzsKLQlsIHw9IGRpdiA8PCAyOworCWwgfD0gY2xrZCA8PCAyOworCisJLyogc2V0IGNsb2NrIGdyYW51bGFyaXR5ICovCisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0NMS0c7CisJbCB8PSBjbGtnOworCWlmIChjbGtnKSB7CisJCWNzLT5jaGN0cmwwICY9IH5PTUFQMl9NQ1NQSV9DSENUUkxfRVhUQ0xLX01BU0s7CisJCWNzLT5jaGN0cmwwIHw9IGV4dGNsayA8PCA4OworCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwLCBjcy0+Y2hjdHJsMCk7CisJfQogCiAJLyogc2V0IFNQSSBtb2RlIDAuLjMgKi8KIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCkBAIC05MDAsNyArOTI3LDcgQEAKIAltY3NwaV93cml0ZV9jaGNvbmYwKHNwaSwgbCk7CiAKIAlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBzcGVlZCAlZCwgc2FtcGxlICVzIGVkZ2UsIGNsayAlc1xuIiwKLQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IGRpdiwKKwkJCXNwZWVkX2h6LAogCQkJKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSA/ICJ0cmFpbGluZyIgOiAibGVhZGluZyIsCiAJCQkoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gImludmVydGVkIiA6ICJub3JtYWwiKTsKIApAQCAtOTcyLDYgKzk5OSw3IEBACiAJCWNzLT5iYXNlID0gbWNzcGktPmJhc2UgKyBzcGktPmNoaXBfc2VsZWN0ICogMHgxNDsKIAkJY3MtPnBoeXMgPSBtY3NwaS0+cGh5cyArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OwogCQljcy0+Y2hjb25mMCA9IDA7CisJCWNzLT5jaGN0cmwwID0gMDsKIAkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CiAJCS8qIExpbmsgdGhpcyB0byBjb250ZXh0IHNhdmUgbGlzdCAqLwogCQlsaXN0X2FkZF90YWlsKCZjcy0+bm9kZSwgJmN0eC0+Y3MpOwpAQCAtMTA1NywxMiArMTA4NSwxNSBAQAogCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgeworCQlpZiAocGFyX292ZXJyaWRlIHx8CisJCSAgICAodC0+c3BlZWRfaHogIT0gc3BpLT5tYXhfc3BlZWRfaHopIHx8CisJCSAgICAodC0+Yml0c19wZXJfd29yZCAhPSBzcGktPmJpdHNfcGVyX3dvcmQpKSB7CiAJCQlwYXJfb3ZlcnJpZGUgPSAxOwogCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKIAkJCWlmIChzdGF0dXMgPCAwKQogCQkJCWJyZWFrOwotCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKKwkJCWlmICh0LT5zcGVlZF9oeiA9PSBzcGktPm1heF9zcGVlZF9oeiAmJgorCQkJICAgIHQtPmJpdHNfcGVyX3dvcmQgPT0gc3BpLT5iaXRzX3Blcl93b3JkKQogCQkJCXBhcl9vdmVycmlkZSA9IDA7CiAJCX0KIAkJaWYgKGNkICYmIGNkLT5jc19wZXJfd29yZCkgewpAQCAtMTE3NiwxNiArMTIwNywxMiBAQAogCW0tPmFjdHVhbF9sZW5ndGggPSAwOwogCW0tPnN0YXR1cyA9IDA7CiAKLQkvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlcyBhbmQgdHJhbnNmZXJzICovCi0JaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykpCi0JCXJldHVybiAtRUlOVkFMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQljb25zdCB2b2lkCSp0eF9idWYgPSB0LT50eF9idWY7CiAJCXZvaWQJCSpyeF9idWYgPSB0LT5yeF9idWY7CiAJCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKIAotCQlpZiAodC0+c3BlZWRfaHogPiBPTUFQMl9NQ1NQSV9NQVhfRlJFUQotCQkJCXx8IChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkpIHsKKwkJaWYgKChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkpIHsKIAkJCWRldl9kYmcobWNzcGktPmRldiwgInRyYW5zZmVyOiAlZCBIeiwgJWQgJXMlcywgJWQgYnB3XG4iLAogCQkJCQl0LT5zcGVlZF9oeiwKIAkJCQkJbGVuLApAQCAtMTE5NCwxMiArMTIyMSw2IEBACiAJCQkJCXQtPmJpdHNfcGVyX3dvcmQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKHQtPnNwZWVkX2h6ICYmIHQtPnNwZWVkX2h6IDwgKE9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KSkgewotCQkJZGV2X2RiZyhtY3NwaS0+ZGV2LCAic3BlZWRfaHogJWQgYmVsb3cgbWluaW11bSAlZCBIelxuIiwKLQkJCQkJdC0+c3BlZWRfaHosCi0JCQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAKIAkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgbGVuIDwgRE1BX01JTl9CWVRFUykKIAkJCWNvbnRpbnVlOwpAQCAtMTMxMSw2ICsxMzMyLDggQEAKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gb21hcDJfbWNzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CiAJbWFzdGVyLT5jbGVhbnVwID0gb21hcDJfbWNzcGlfY2xlYW51cDsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gbm9kZTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IE9NQVAyX01DU1BJX01BWF9GUkVROworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gT01BUDJfTUNTUElfTUFYX0ZSRVEgPj4gMTU7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYyBiL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCmluZGV4IDdmMjEyMWYuLmQwMThhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCkBAIC05LDcgKzksNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNDMsOCArNDIsNiBAQAogc3RydWN0IG9yaW9uX3NwaSB7CiAJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKIAl2b2lkIF9faW9tZW0JCSpiYXNlOwotCXVuc2lnbmVkIGludAkJbWF4X3NwZWVkOwotCXVuc2lnbmVkIGludAkJbWluX3NwZWVkOwogCXN0cnVjdCBjbGsgICAgICAgICAgICAgICpjbGs7CiB9OwogCkBAIC03NSwyMyArNzIsNiBAQAogCXdyaXRlbCh2YWwsIHJlZ19hZGRyKTsKIH0KIAotc3RhdGljIGludCBvcmlvbl9zcGlfc2V0X3RyYW5zZmVyX3NpemUoc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCBpbnQgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAxNikgewotCQlvcmlvbl9zcGlfc2V0Yml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAotCQkJCSAgT1JJT05fU1BJX0lGXzhfMTZfQklUX01PREUpOwotCX0gZWxzZSBpZiAoc2l6ZSA9PSA4KSB7Ci0JCW9yaW9uX3NwaV9jbHJiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcsCi0JCQkJICBPUklPTl9TUElfSUZfOF8xNl9CSVRfTU9ERSk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIkJhZCBiaXRzIHBlciB3b3JkIHZhbHVlICVkIChvbmx5IDggb3IgMTYgYXJlIGFsbG93ZWQpLlxuIiwKLQkJCXNpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvcmlvbl9zcGlfYmF1ZHJhdGVfc2V0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIGludCBzcGVlZCkKIHsKIAl1MzIgdGNsa19oejsKQEAgLTE3MCw3ICsxNTAsMTQgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXJldHVybiBvcmlvbl9zcGlfc2V0X3RyYW5zZmVyX3NpemUob3Jpb25fc3BpLCBiaXRzX3Blcl93b3JkKTsKKwlpZiAoYml0c19wZXJfd29yZCA9PSAxNikKKwkJb3Jpb25fc3BpX3NldGJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRywKKwkJCQkgIE9SSU9OX1NQSV9JRl84XzE2X0JJVF9NT0RFKTsKKwllbHNlCisJCW9yaW9uX3NwaV9jbHJiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcsCisJCQkJICBPUklPTl9TUElfSUZfOF8xNl9CSVRfTU9ERSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgb3Jpb25fc3BpX3NldF9jcyhzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGksIGludCBlbmFibGUpCkBAIC0yNjAsMTEgKzI0Nyw5IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CiBvcmlvbl9zcGlfd3JpdGVfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAJaW50IHdvcmRfbGVuOwogCi0Jb3Jpb25fc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJd29yZF9sZW4gPSBzcGktPmJpdHNfcGVyX3dvcmQ7CiAJY291bnQgPSB4ZmVyLT5sZW47CiAKQEAgLTMxMCwyNyArMjk1LDYgQEAKIAkJZ290byBtc2dfZG9uZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQkvKiBtYWtlIHN1cmUgYnVmZmVyIGxlbmd0aCBpcyBldmVuIHdoZW4gd29ya2luZyBpbiAxNgotCQkgKiBiaXQgbW9kZSovCi0JCWlmICgodC0+Yml0c19wZXJfd29yZCA9PSAxNikgJiYgKHQtPmxlbiAmIDEpKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKLQkJCQkib2RkIGRhdGEgbGVuZ3RoICVkIHdoaWxlIGluIDE2IGJpdCBtb2RlXG4iLAotCQkJCXQtPmxlbik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBtc2dfZG9uZTsKLQkJfQotCi0JCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IG9yaW9uX3NwaS0+bWluX3NwZWVkKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKLQkJCQkiZGV2aWNlIG1pbiBzcGVlZCAoJWQgSHopIGV4Y2VlZHMgIgotCQkJCSJyZXF1aXJlZCB0cmFuc2ZlciBzcGVlZCAoJWQgSHopXG4iLAotCQkJCW9yaW9uX3NwaS0+bWluX3NwZWVkLCB0LT5zcGVlZF9oeik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBtc2dfZG9uZTsKLQkJfQotCiAJCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgewogCQkJcGFyX292ZXJyaWRlID0gMTsKIAkJCXN0YXR1cyA9IG9yaW9uX3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIHQpOwpAQCAtMzc1LDI4ICszMzksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9yaW9uX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKChzcGktPm1heF9zcGVlZF9oeiA9PSAwKQotCQkJfHwgKHNwaS0+bWF4X3NwZWVkX2h6ID4gb3Jpb25fc3BpLT5tYXhfc3BlZWQpKQotCQlzcGktPm1heF9zcGVlZF9oeiA9IG9yaW9uX3NwaS0+bWF4X3NwZWVkOwotCi0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6IDwgb3Jpb25fc3BpLT5taW5fc3BlZWQpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cDogcmVxdWVzdGVkIHNwZWVkIHRvbyBsb3cgJWQgSHpcbiIsCi0JCQlzcGktPm1heF9zcGVlZF9oeik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogYmF1ZHJhdGUgJiB3aWR0aCB3aWxsIGJlIHNldCBvcmlvbl9zcGlfc2V0dXBfdHJhbnNmZXIKLQkgKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvcmlvbl9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwpAQCAtNDI1LDkgKzM2Nyw5IEBACiAJLyogd2Ugc3VwcG9ydCBvbmx5IG1vZGUgMCwgYW5kIG5vIG9wdGlvbnMgKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUEhBIHwgU1BJX0NQT0w7CiAKLQltYXN0ZXItPnNldHVwID0gb3Jpb25fc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBvcmlvbl9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IE9SSU9OX05VTV9DSElQU0VMRUNUUzsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KSB8IFNQSV9CUFdfTUFTSygxNik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCkBAIC00NDMsOCArMzg1LDggQEAKIAljbGtfcHJlcGFyZShzcGktPmNsayk7CiAJY2xrX2VuYWJsZShzcGktPmNsayk7CiAJdGNsa19oeiA9IGNsa19nZXRfcmF0ZShzcGktPmNsayk7Ci0Jc3BpLT5tYXhfc3BlZWQgPSBESVZfUk9VTkRfVVAodGNsa19oeiwgNCk7Ci0Jc3BpLT5taW5fc3BlZWQgPSBESVZfUk9VTkRfVVAodGNsa19oeiwgMzApOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIDQpOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIDMwKTsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCXNwaS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKaW5kZXggMjc4OWI0NS4uNTFkOTk3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKQEAgLTQ1OSw5ICs0NTksOCBAQAogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmxhc3RfdHJhbnNmZXI7CiAJcGwwMjItPm5leHRfbXNnX2NzX2FjdGl2ZSA9IGZhbHNlOwogCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkocGwwMjItPmN1cl9tc2ctPnRyYW5zZmVycy5wcmV2LAotCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQl0cmFuc2Zlcl9saXN0KTsKKwlsYXN0X3RyYW5zZmVyID0gbGlzdF9sYXN0X2VudHJ5KCZwbDAyMi0+Y3VyX21zZy0+dHJhbnNmZXJzLAorCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKIAogCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBiZWZvcmUgYW55IGNoYW5nZSBpbiBjaGlwIHNlbGVjdCAqLwogCWlmIChsYXN0X3RyYW5zZmVyLT5kZWxheV91c2VjcykKQEAgLTIxMDksOCArMjEwOCw2IEBACiAJcGwwMjItPmNoaXBzZWxlY3RzID0gZGV2bV9remFsbG9jKGRldiwgbnVtX2NzICogc2l6ZW9mKGludCksCiAJCQkJCSAgR0ZQX0tFUk5FTCk7CiAKLQlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7Ci0KIAkvKgogCSAqIEJ1cyBOdW1iZXIgV2hpY2ggaGFzIGJlZW4gQXNzaWduZWQgdG8gdGhpcyBTU1AgY29udHJvbGxlcgogCSAqIG9uIHRoaXMgYm9hcmQKQEAgLTIxODMsMTMgKzIxODAsNyBAQAogCQlnb3RvIGVycl9ub19jbGs7CiAJfQogCi0Jc3RhdHVzID0gY2xrX3ByZXBhcmUocGwwMjItPmNsayk7Ci0JaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJjb3VsZCBub3QgcHJlcGFyZSBTU1AvU1BJIGJ1cyBjbG9ja1xuIik7Ci0JCWdvdG8gIGVycl9jbGtfcHJlcDsKLQl9Ci0KLQlzdGF0dXMgPSBjbGtfZW5hYmxlKHBsMDIyLT5jbGspOworCXN0YXR1cyA9IGNsa19wcmVwYXJlX2VuYWJsZShwbDAyMi0+Y2xrKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkZXYtPmRldiwgImNvdWxkIG5vdCBlbmFibGUgU1NQL1NQSSBidXMgY2xvY2tcbiIpOwogCQlnb3RvIGVycl9ub19jbGtfZW47CkBAIC0yMjUwLDEwICsyMjQxLDggQEAKIAlpZiAocGxhdGZvcm1faW5mby0+ZW5hYmxlX2RtYSkKIAkJcGwwMjJfZG1hX3JlbW92ZShwbDAyMik7CiAgZXJyX25vX2lycToKLQljbGtfZGlzYWJsZShwbDAyMi0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGwwMjItPmNsayk7CiAgZXJyX25vX2Nsa19lbjoKLQljbGtfdW5wcmVwYXJlKHBsMDIyLT5jbGspOwotIGVycl9jbGtfcHJlcDoKICBlcnJfbm9fY2xrOgogIGVycl9ub19pb3JlbWFwOgogCWFtYmFfcmVsZWFzZV9yZWdpb25zKGFkZXYpOwpAQCAtMjI4MSw0MiArMjI3MCwxMyBAQAogCWlmIChwbDAyMi0+bWFzdGVyX2luZm8tPmVuYWJsZV9kbWEpCiAJCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOwogCi0JY2xrX2Rpc2FibGUocGwwMjItPmNsayk7Ci0JY2xrX3VucHJlcGFyZShwbDAyMi0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGwwMjItPmNsayk7CiAJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoYWRldik7CiAJdGFza2xldF9kaXNhYmxlKCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMpOwogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU1VTUEVORCkgfHwgZGVmaW5lZChDT05GSUdfUE1fUlVOVElNRSkKLS8qCi0gKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIGZyb20gYm90aCBzdXNwZW5kL3Jlc3VtZSBhbmQKLSAqIHRoZSBydW50aW1lIGNvdW50ZXJwYXJ0cyB0byBoYW5kbGUgZXh0ZXJuYWwgcmVzb3VyY2VzIGxpa2UKLSAqIGNsb2NrcywgcGlucyBhbmQgcmVndWxhdG9ycyB3aGVuIGdvaW5nIHRvIHNsZWVwLgotICovCi1zdGF0aWMgdm9pZCBwbDAyMl9zdXNwZW5kX3Jlc291cmNlcyhzdHJ1Y3QgcGwwMjIgKnBsMDIyLCBib29sIHJ1bnRpbWUpCi17Ci0JY2xrX2Rpc2FibGUocGwwMjItPmNsayk7Ci0KLQlpZiAocnVudGltZSkKLQkJcGluY3RybF9wbV9zZWxlY3RfaWRsZV9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci0JZWxzZQotCQlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBsMDIyX3Jlc3VtZV9yZXNvdXJjZXMoc3RydWN0IHBsMDIyICpwbDAyMiwgYm9vbCBydW50aW1lKQotewotCS8qIEZpcnN0IGdvIHRvIHRoZSBkZWZhdWx0IHN0YXRlICovCi0JcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci0JaWYgKCFydW50aW1lKQotCQkvKiBUaGVuIGxldCdzIGlkbGUgdGhlIHBpbnMgdW50aWwgdGhlIG5leHQgdHJhbnNmZXIgaGFwcGVucyAqLwotCQlwaW5jdHJsX3BtX3NlbGVjdF9pZGxlX3N0YXRlKCZwbDAyMi0+YWRldi0+ZGV2KTsKLQotCWNsa19lbmFibGUocGwwMjItPmNsayk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TVVNQRU5ECisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHBsMDIyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTIzMjgsOCArMjI4OCwxMyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKLQlwbDAyMl9zdXNwZW5kX3Jlc291cmNlcyhwbDAyMiwgZmFsc2UpOworCXJldCA9IHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZChkZXYpOworCWlmIChyZXQpIHsKKwkJc3BpX21hc3Rlcl9yZXN1bWUocGwwMjItPm1hc3Rlcik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoZGV2KTsKIAogCWRldl9kYmcoZGV2LCAic3VzcGVuZGVkXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTIzNDAsOCArMjMwNSw5IEBACiAJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCByZXQ7CiAKLQlwbDAyMl9yZXN1bWVfcmVzb3VyY2VzKHBsMDIyLCBmYWxzZSk7Ci0JcG1fcnVudGltZV9wdXQoZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZShkZXYpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSByZXN1bWluZ1xuIik7CiAKIAkvKiBTdGFydCB0aGUgcXVldWUgcnVubmluZyAqLwogCXJldCA9IHNwaV9tYXN0ZXJfcmVzdW1lKHBsMDIyLT5tYXN0ZXIpOwpAQCAtMjM1MiwxNCArMjMxOCwxNiBAQAogCiAJcmV0dXJuIHJldDsKIH0KLSNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKyNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcGwwMjJfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlwbDAyMl9zdXNwZW5kX3Jlc291cmNlcyhwbDAyMiwgdHJ1ZSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsMDIyLT5jbGspOworCXBpbmN0cmxfcG1fc2VsZWN0X2lkbGVfc3RhdGUoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMzY3LDE0ICsyMzM1LDE2IEBACiB7CiAJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcGwwMjJfcmVzdW1lX3Jlc291cmNlcyhwbDAyMiwgdHJ1ZSk7CisJcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZShkZXYpOworCWNsa19wcmVwYXJlX2VuYWJsZShwbDAyMi0+Y2xrKTsKKwogCXJldHVybiAwOwogfQogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwbDAyMl9kZXZfcG1fb3BzID0gewogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBsMDIyX3N1c3BlbmQsIHBsMDIyX3Jlc3VtZSkKLQlTRVRfUlVOVElNRV9QTV9PUFMocGwwMjJfcnVudGltZV9zdXNwZW5kLCBwbDAyMl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKKwlTRVRfUE1fUlVOVElNRV9QTV9PUFMocGwwMjJfcnVudGltZV9zdXNwZW5kLCBwbDAyMl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2FybSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYwppbmRleCA1ZWU1NjcyLi44MGI4NDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jCkBAIC0yNCw3ICsyNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtZG1hLmMKaW5kZXggM2MwYjU1MS4uNzEzYWY0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LWRtYS5jCkBAIC05LDcgKzksNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1weGFkbWEuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcHhhZG1hLmMKaW5kZXggMjkxNmVmYy4uZThhMjZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1weGFkbWEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXB4YWRtYS5jCkBAIC0xOCw3ICsxOCw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYwppbmRleCBjNzAyZmM1Li40MTE4NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jCkBAIC0zNjIsOCArMzYyLDcgQEAKIAlkcnZfZGF0YS0+Y3VyX21zZyA9IE5VTEw7CiAJZHJ2X2RhdGEtPmN1cl90cmFuc2ZlciA9IE5VTEw7CiAKLQlsYXN0X3RyYW5zZmVyID0gbGlzdF9lbnRyeShtc2ctPnRyYW5zZmVycy5wcmV2LAotCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAorCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2xhc3RfZW50cnkoJm1zZy0+dHJhbnNmZXJzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAogCQkJCQl0cmFuc2Zlcl9saXN0KTsKIAogCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBiZWZvcmUgYW55IGNoYW5nZSBpbiBjaGlwIHNlbGVjdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXF1cC5jIGIvZHJpdmVycy9zcGkvc3BpLXF1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzJlODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktcXVwLmMKQEAgLTAsMCArMSw3NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCwgVGhlIExpbnV4IGZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmV2IDIgYW5kCisgKiBvbmx5IHJldiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgZnJlZSBTb2Z0d2FyZSBmb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBmSVRORVNTIGZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIFFVUF9DT05GSUcJCQkweDAwMDAKKyNkZWZpbmUgUVVQX1NUQVRFCQkJMHgwMDA0CisjZGVmaW5lIFFVUF9JT19NX01PREVTCQkJMHgwMDA4CisjZGVmaW5lIFFVUF9TV19SRVNFVAkJCTB4MDAwYworI2RlZmluZSBRVVBfT1BFUkFUSU9OQUwJCQkweDAwMTgKKyNkZWZpbmUgUVVQX0VSUk9SX0ZMQUdTCQkJMHgwMDFjCisjZGVmaW5lIFFVUF9FUlJPUl9GTEFHU19FTgkJMHgwMDIwCisjZGVmaW5lIFFVUF9PUEVSQVRJT05BTF9NQVNLCQkweDAwMjgKKyNkZWZpbmUgUVVQX0hXX1ZFUlNJT04JCQkweDAwMzAKKyNkZWZpbmUgUVVQX01YX09VVFBVVF9DTlQJCTB4MDEwMAorI2RlZmluZSBRVVBfT1VUUFVUX0ZJRk8JCQkweDAxMTAKKyNkZWZpbmUgUVVQX01YX1dSSVRFX0NOVAkJMHgwMTUwCisjZGVmaW5lIFFVUF9NWF9JTlBVVF9DTlQJCTB4MDIwMAorI2RlZmluZSBRVVBfTVhfUkVBRF9DTlQJCQkweDAyMDgKKyNkZWZpbmUgUVVQX0lOUFVUX0ZJRk8JCQkweDAyMTgKKworI2RlZmluZSBTUElfQ09ORklHCQkJMHgwMzAwCisjZGVmaW5lIFNQSV9JT19DT05UUk9MCQkJMHgwMzA0CisjZGVmaW5lIFNQSV9FUlJPUl9GTEFHUwkJCTB4MDMwOAorI2RlZmluZSBTUElfRVJST1JfRkxBR1NfRU4JCTB4MDMwYworCisvKiBRVVBfQ09ORklHIGZpZWxkcyAqLworI2RlZmluZSBRVVBfQ09ORklHX1NQSV9NT0RFCQkoMSA8PCA4KQorI2RlZmluZSBRVVBfQ09ORklHX0NMT0NLX0FVVE9fR0FURQlCSVQoMTMpCisjZGVmaW5lIFFVUF9DT05GSUdfTk9fSU5QVVQJCUJJVCg3KQorI2RlZmluZSBRVVBfQ09ORklHX05PX09VVFBVVAkJQklUKDYpCisjZGVmaW5lIFFVUF9DT05GSUdfTgkJCTB4MDAxZgorCisvKiBRVVBfU1RBVEUgZmllbGRzICovCisjZGVmaW5lIFFVUF9TVEFURV9WQUxJRAkJCUJJVCgyKQorI2RlZmluZSBRVVBfU1RBVEVfUkVTRVQJCQkwCisjZGVmaW5lIFFVUF9TVEFURV9SVU4JCQkxCisjZGVmaW5lIFFVUF9TVEFURV9QQVVTRQkJCTMKKyNkZWZpbmUgUVVQX1NUQVRFX01BU0sJCQkzCisjZGVmaW5lIFFVUF9TVEFURV9DTEVBUgkJCTIKKworI2RlZmluZSBRVVBfSFdfVkVSU0lPTl8yXzFfMQkJMHgyMDAxMDAwMQorCisvKiBRVVBfSU9fTV9NT0RFUyBmaWVsZHMgKi8KKyNkZWZpbmUgUVVQX0lPX01fUEFDS19FTgkJQklUKDE1KQorI2RlZmluZSBRVVBfSU9fTV9VTlBBQ0tfRU4JCUJJVCgxNCkKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLX1NISUZUCTEyCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9NT0RFX01BU0tfU0hJRlQJMTAKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLCSgzIDw8IFFVUF9JT19NX0lOUFVUX01PREVfTUFTS19TSElGVCkKKyNkZWZpbmUgUVVQX0lPX01fT1VUUFVUX01PREVfTUFTSwkoMyA8PCBRVVBfSU9fTV9PVVRQVVRfTU9ERV9NQVNLX1NISUZUKQorCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9CTE9DS19TSVpFKHgpCSgoKHgpICYgKDB4MDMgPDwgMCkpID4+IDApCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9GSUZPX1NJWkUoeCkJKCgoeCkgJiAoMHgwNyA8PCAyKSkgPj4gMikKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfQkxPQ0tfU0laRSh4KQkoKCh4KSAmICgweDAzIDw8IDUpKSA+PiA1KQorI2RlZmluZSBRVVBfSU9fTV9JTlBVVF9GSUZPX1NJWkUoeCkJKCgoeCkgJiAoMHgwNyA8PCA3KSkgPj4gNykKKworI2RlZmluZSBRVVBfSU9fTV9NT0RFX0ZJRk8JCTAKKyNkZWZpbmUgUVVQX0lPX01fTU9ERV9CTE9DSwkJMQorI2RlZmluZSBRVVBfSU9fTV9NT0RFX0RNT1YJCTIKKyNkZWZpbmUgUVVQX0lPX01fTU9ERV9CQU0JCTMKKworLyogUVVQX09QRVJBVElPTkFMIGZpZWxkcyAqLworI2RlZmluZSBRVVBfT1BfTUFYX0lOUFVUX0RPTkVfRkxBRwlCSVQoMTEpCisjZGVmaW5lIFFVUF9PUF9NQVhfT1VUUFVUX0RPTkVfRkxBRwlCSVQoMTApCisjZGVmaW5lIFFVUF9PUF9JTl9TRVJWSUNFX0ZMQUcJCUJJVCg5KQorI2RlZmluZSBRVVBfT1BfT1VUX1NFUlZJQ0VfRkxBRwkJQklUKDgpCisjZGVmaW5lIFFVUF9PUF9JTl9GSUZPX0ZVTEwJCUJJVCg3KQorI2RlZmluZSBRVVBfT1BfT1VUX0ZJRk9fRlVMTAkJQklUKDYpCisjZGVmaW5lIFFVUF9PUF9JTl9GSUZPX05PVF9FTVBUWQlCSVQoNSkKKyNkZWZpbmUgUVVQX09QX09VVF9GSUZPX05PVF9FTVBUWQlCSVQoNCkKKworLyogUVVQX0VSUk9SX0ZMQUdTIGFuZCBRVVBfRVJST1JfRkxBR1NfRU4gZmllbGRzICovCisjZGVmaW5lIFFVUF9FUlJPUl9PVVRQVVRfT1ZFUl9SVU4JQklUKDUpCisjZGVmaW5lIFFVUF9FUlJPUl9JTlBVVF9VTkRFUl9SVU4JQklUKDQpCisjZGVmaW5lIFFVUF9FUlJPUl9PVVRQVVRfVU5ERVJfUlVOCUJJVCgzKQorI2RlZmluZSBRVVBfRVJST1JfSU5QVVRfT1ZFUl9SVU4JQklUKDIpCisKKy8qIFNQSV9DT05GSUcgZmllbGRzICovCisjZGVmaW5lIFNQSV9DT05GSUdfSFNfTU9ERQkJQklUKDEwKQorI2RlZmluZSBTUElfQ09ORklHX0lOUFVUX0ZJUlNUCQlCSVQoOSkKKyNkZWZpbmUgU1BJX0NPTkZJR19MT09QQkFDSwkJQklUKDgpCisKKy8qIFNQSV9JT19DT05UUk9MIGZpZWxkcyAqLworI2RlZmluZSBTUElfSU9fQ19GT1JDRV9DUwkJQklUKDExKQorI2RlZmluZSBTUElfSU9fQ19DTEtfSURMRV9ISUdICQlCSVQoMTApCisjZGVmaW5lIFNQSV9JT19DX01YX0NTX01PREUJCUJJVCg4KQorI2RlZmluZSBTUElfSU9fQ19DU19OX1BPTEFSSVRZXzAJQklUKDQpCisjZGVmaW5lIFNQSV9JT19DX0NTX1NFTEVDVCh4KQkJKCgoeCkgJiAzKSA8PCAyKQorI2RlZmluZSBTUElfSU9fQ19DU19TRUxFQ1RfTUFTSwkJMHgwMDBjCisjZGVmaW5lIFNQSV9JT19DX1RSSVNUQVRFX0NTCQlCSVQoMSkKKyNkZWZpbmUgU1BJX0lPX0NfTk9fVFJJX1NUQVRFCQlCSVQoMCkKKworLyogU1BJX0VSUk9SX0ZMQUdTIGFuZCBTUElfRVJST1JfRkxBR1NfRU4gZmllbGRzICovCisjZGVmaW5lIFNQSV9FUlJPUl9DTEtfT1ZFUl9SVU4JCUJJVCgxKQorI2RlZmluZSBTUElfRVJST1JfQ0xLX1VOREVSX1JVTgkJQklUKDApCisKKyNkZWZpbmUgU1BJX05VTV9DSElQU0VMRUNUUwkJNAorCisvKiBoaWdoIHNwZWVkIG1vZGUgaXMgd2hlbiBidXMgcmF0ZSBpcyBncmVhdGVyIHRoZW4gMjZNSHogKi8KKyNkZWZpbmUgU1BJX0hTX01JTl9SQVRFCQkJMjYwMDAwMDAKKyNkZWZpbmUgU1BJX01BWF9SQVRFCQkJNTAwMDAwMDAKKworI2RlZmluZSBTUElfREVMQVlfVEhSRVNIT0xECQkxCisjZGVmaW5lIFNQSV9ERUxBWV9SRVRSWQkJCTEwCisKK3N0cnVjdCBzcGlfcXVwIHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGNsawkJKmNjbGs7CS8qIGNvcmUgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrCQkqaWNsazsJLyogaW50ZXJmYWNlIGNsb2NrICovCisJaW50CQkJaXJxOworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlpbnQJCQlpbl9maWZvX3N6OworCWludAkJCW91dF9maWZvX3N6OworCWludAkJCWluX2Jsa19zejsKKwlpbnQJCQlvdXRfYmxrX3N6OworCisJc3RydWN0IHNwaV90cmFuc2ZlcgkqeGZlcjsKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCWludAkJCWVycm9yOworCWludAkJCXdfc2l6ZTsJLyogYnl0ZXMgcGVyIFNQSSB3b3JkICovCisJaW50CQkJdHhfYnl0ZXM7CisJaW50CQkJcnhfYnl0ZXM7Cit9OworCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzcGlfcXVwX2lzX3ZhbGlkX3N0YXRlKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyKQoreworCXUzMiBvcHN0YXRlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX1NUQVRFKTsKKworCXJldHVybiBvcHN0YXRlICYgUVVQX1NUQVRFX1ZBTElEOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfc2V0X3N0YXRlKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyLCB1MzIgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBsb29wOworCXUzMiBjdXJfc3RhdGU7CisKKwlsb29wID0gMDsKKwl3aGlsZSAoIXNwaV9xdXBfaXNfdmFsaWRfc3RhdGUoY29udHJvbGxlcikpIHsKKworCQl1c2xlZXBfcmFuZ2UoU1BJX0RFTEFZX1RIUkVTSE9MRCwgU1BJX0RFTEFZX1RIUkVTSE9MRCAqIDIpOworCisJCWlmICgrK2xvb3AgPiBTUElfREVMQVlfUkVUUlkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAobG9vcCkKKwkJZGV2X2RiZyhjb250cm9sbGVyLT5kZXYsICJpbnZhbGlkIHN0YXRlIGZvciAlbGQsdXMgJWRcbiIsCisJCQlsb29wLCBzdGF0ZSk7CisKKwljdXJfc3RhdGUgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfU1RBVEUpOworCS8qCisJICogUGVyIHNwZWM6IGZvciBQQVVTRV9TVEFURSB0byBSRVNFVF9TVEFURSwgdHdvIHdyaXRlcworCSAqIG9mIChiMTApIGFyZSByZXF1aXJlZAorCSAqLworCWlmICgoKGN1cl9zdGF0ZSAmIFFVUF9TVEFURV9NQVNLKSA9PSBRVVBfU1RBVEVfUEFVU0UpICYmCisJICAgIChzdGF0ZSA9PSBRVVBfU1RBVEVfUkVTRVQpKSB7CisJCXdyaXRlbF9yZWxheGVkKFFVUF9TVEFURV9DTEVBUiwgY29udHJvbGxlci0+YmFzZSArIFFVUF9TVEFURSk7CisJCXdyaXRlbF9yZWxheGVkKFFVUF9TVEFURV9DTEVBUiwgY29udHJvbGxlci0+YmFzZSArIFFVUF9TVEFURSk7CisJfSBlbHNlIHsKKwkJY3VyX3N0YXRlICY9IH5RVVBfU1RBVEVfTUFTSzsKKwkJY3VyX3N0YXRlIHw9IHN0YXRlOworCQl3cml0ZWxfcmVsYXhlZChjdXJfc3RhdGUsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfU1RBVEUpOworCX0KKworCWxvb3AgPSAwOworCXdoaWxlICghc3BpX3F1cF9pc192YWxpZF9zdGF0ZShjb250cm9sbGVyKSkgeworCisJCXVzbGVlcF9yYW5nZShTUElfREVMQVlfVEhSRVNIT0xELCBTUElfREVMQVlfVEhSRVNIT0xEICogMik7CisKKwkJaWYgKCsrbG9vcCA+IFNQSV9ERUxBWV9SRVRSWSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNwaV9xdXBfZmlmb19yZWFkKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyLAorCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJdTggKnJ4X2J1ZiA9IHhmZXItPnJ4X2J1ZjsKKwl1MzIgd29yZCwgc3RhdGU7CisJaW50IGlkeCwgc2hpZnQsIHdfc2l6ZTsKKworCXdfc2l6ZSA9IGNvbnRyb2xsZXItPndfc2l6ZTsKKworCXdoaWxlIChjb250cm9sbGVyLT5yeF9ieXRlcyA8IHhmZXItPmxlbikgeworCisJCXN0YXRlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX09QRVJBVElPTkFMKTsKKwkJaWYgKDAgPT0gKHN0YXRlICYgUVVQX09QX0lOX0ZJRk9fTk9UX0VNUFRZKSkKKwkJCWJyZWFrOworCisJCXdvcmQgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfSU5QVVRfRklGTyk7CisKKwkJaWYgKCFyeF9idWYpIHsKKwkJCWNvbnRyb2xsZXItPnJ4X2J5dGVzICs9IHdfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCB3X3NpemU7IGlkeCsrLCBjb250cm9sbGVyLT5yeF9ieXRlcysrKSB7CisJCQkvKgorCQkJICogVGhlIGRhdGEgZm9ybWF0IGRlcGVuZHMgb24gYnl0ZXMgcGVyIFNQSSB3b3JkOgorCQkJICogIDQgYnl0ZXM6IDB4MTIzNDU2NzgKKwkJCSAqICAyIGJ5dGVzOiAweDAwMDAxMjM0CisJCQkgKiAgMSBieXRlIDogMHgwMDAwMDAxMgorCQkJICovCisJCQlzaGlmdCA9IEJJVFNfUEVSX0JZVEU7CisJCQlzaGlmdCAqPSAod19zaXplIC0gaWR4IC0gMSk7CisJCQlyeF9idWZbY29udHJvbGxlci0+cnhfYnl0ZXNdID0gd29yZCA+PiBzaGlmdDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3BpX3F1cF9maWZvX3dyaXRlKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyLAorCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJY29uc3QgdTggKnR4X2J1ZiA9IHhmZXItPnR4X2J1ZjsKKwl1MzIgd29yZCwgc3RhdGUsIGRhdGE7CisJaW50IGlkeCwgd19zaXplOworCisJd19zaXplID0gY29udHJvbGxlci0+d19zaXplOworCisJd2hpbGUgKGNvbnRyb2xsZXItPnR4X2J5dGVzIDwgeGZlci0+bGVuKSB7CisKKwkJc3RhdGUgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCQlpZiAoc3RhdGUgJiBRVVBfT1BfT1VUX0ZJRk9fRlVMTCkKKwkJCWJyZWFrOworCisJCXdvcmQgPSAwOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHdfc2l6ZTsgaWR4KyssIGNvbnRyb2xsZXItPnR4X2J5dGVzKyspIHsKKworCQkJaWYgKCF0eF9idWYpIHsKKwkJCQljb250cm9sbGVyLT50eF9ieXRlcyArPSB3X3NpemU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRhdGEgPSB0eF9idWZbY29udHJvbGxlci0+dHhfYnl0ZXNdOworCQkJd29yZCB8PSBkYXRhIDw8IChCSVRTX1BFUl9CWVRFICogKDMgLSBpZHgpKTsKKwkJfQorCisJCXdyaXRlbF9yZWxheGVkKHdvcmQsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1VUUFVUX0ZJRk8pOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHNwaV9xdXBfcXVwX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBkZXZfaWQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwl1MzIgb3BmbGFncywgcXVwX2Vyciwgc3BpX2VycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnJvciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXhmZXIgPSBjb250cm9sbGVyLT54ZmVyOworCWNvbnRyb2xsZXItPnhmZXIgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKworCXF1cF9lcnIgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfRVJST1JfRkxBR1MpOworCXNwaV9lcnIgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBTUElfRVJST1JfRkxBR1MpOworCW9wZmxhZ3MgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCisJd3JpdGVsX3JlbGF4ZWQocXVwX2VyciwgY29udHJvbGxlci0+YmFzZSArIFFVUF9FUlJPUl9GTEFHUyk7CisJd3JpdGVsX3JlbGF4ZWQoc3BpX2VyciwgY29udHJvbGxlci0+YmFzZSArIFNQSV9FUlJPUl9GTEFHUyk7CisJd3JpdGVsX3JlbGF4ZWQob3BmbGFncywgY29udHJvbGxlci0+YmFzZSArIFFVUF9PUEVSQVRJT05BTCk7CisKKwlpZiAoIXhmZXIpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjb250cm9sbGVyLT5kZXYsICJ1bmV4cGVjdGVkIGlycSAleDA4ICV4MDggJXgwOFxuIiwKKwkJCQkgICAgcXVwX2Vyciwgc3BpX2Vyciwgb3BmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAocXVwX2VycikgeworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9PVVRQVVRfT1ZFUl9SVU4pCisJCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJPVVRQVVRfT1ZFUl9SVU5cbiIpOworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9JTlBVVF9VTkRFUl9SVU4pCisJCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJJTlBVVF9VTkRFUl9SVU5cbiIpOworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9PVVRQVVRfVU5ERVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiT1VUUFVUX1VOREVSX1JVTlxuIik7CisJCWlmIChxdXBfZXJyICYgUVVQX0VSUk9SX0lOUFVUX09WRVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiSU5QVVRfT1ZFUl9SVU5cbiIpOworCisJCWVycm9yID0gLUVJTzsKKwl9CisKKwlpZiAoc3BpX2VycikgeworCQlpZiAoc3BpX2VyciAmIFNQSV9FUlJPUl9DTEtfT1ZFUl9SVU4pCisJCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJDTEtfT1ZFUl9SVU5cbiIpOworCQlpZiAoc3BpX2VyciAmIFNQSV9FUlJPUl9DTEtfVU5ERVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiQ0xLX1VOREVSX1JVTlxuIik7CisKKwkJZXJyb3IgPSAtRUlPOworCX0KKworCWlmIChvcGZsYWdzICYgUVVQX09QX0lOX1NFUlZJQ0VfRkxBRykKKwkJc3BpX3F1cF9maWZvX3JlYWQoY29udHJvbGxlciwgeGZlcik7CisKKwlpZiAob3BmbGFncyAmIFFVUF9PUF9PVVRfU0VSVklDRV9GTEFHKQorCQlzcGlfcXVwX2ZpZm9fd3JpdGUoY29udHJvbGxlciwgeGZlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCWNvbnRyb2xsZXItPmVycm9yID0gZXJyb3I7CisJY29udHJvbGxlci0+eGZlciA9IHhmZXI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNvbnRyb2xsZXItPnJ4X2J5dGVzID09IHhmZXItPmxlbiB8fCBlcnJvcikKKwkJY29tcGxldGUoJmNvbnRyb2xsZXItPmRvbmUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIHNldCBjbG9jayBmcmVxIC4uLiBiaXRzIHBlciB3b3JkICovCitzdGF0aWMgaW50IHNwaV9xdXBfaW9fY29uZmlnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgY29uZmlnLCBpb21vZGUsIG1vZGU7CisJaW50IHJldCwgbl93b3Jkcywgd19zaXplOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QICYmIHhmZXItPmxlbiA+IGNvbnRyb2xsZXItPmluX2ZpZm9fc3opIHsKKwkJZGV2X2Vycihjb250cm9sbGVyLT5kZXYsICJ0b28gYmlnIHNpemUgZm9yIGxvb3BiYWNrICVkID4gJWRcbiIsCisJCQl4ZmVyLT5sZW4sIGNvbnRyb2xsZXItPmluX2ZpZm9fc3opOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoY29udHJvbGxlci0+Y2NsaywgeGZlci0+c3BlZWRfaHopOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb250cm9sbGVyLT5kZXYsICJmYWlsIHRvIHNldCBmcmVxdWVuY3kgJWQiLAorCQkJeGZlci0+c3BlZWRfaHopOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1JFU0VUKSkgeworCQlkZXZfZXJyKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUkVTRVQgc3RhdGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl3X3NpemUgPSA0OworCWlmICh4ZmVyLT5iaXRzX3Blcl93b3JkIDw9IDgpCisJCXdfc2l6ZSA9IDE7CisJZWxzZSBpZiAoeGZlci0+Yml0c19wZXJfd29yZCA8PSAxNikKKwkJd19zaXplID0gMjsKKworCW5fd29yZHMgPSB4ZmVyLT5sZW4gLyB3X3NpemU7CisJY29udHJvbGxlci0+d19zaXplID0gd19zaXplOworCisJaWYgKG5fd29yZHMgPD0gY29udHJvbGxlci0+aW5fZmlmb19zeikgeworCQltb2RlID0gUVVQX0lPX01fTU9ERV9GSUZPOworCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX1JFQURfQ05UKTsKKwkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9XUklURV9DTlQpOworCQkvKiBtdXN0IGJlIHplcm8gZm9yIEZJRk8gKi8KKwkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9JTlBVVF9DTlQpOworCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX09VVFBVVF9DTlQpOworCX0gZWxzZSB7CisJCW1vZGUgPSBRVVBfSU9fTV9NT0RFX0JMT0NLOworCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX0lOUFVUX0NOVCk7CisJCXdyaXRlbF9yZWxheGVkKG5fd29yZHMsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfT1VUUFVUX0NOVCk7CisJCS8qIG11c3QgYmUgemVybyBmb3IgQkxPQ0sgYW5kIEJBTSAqLworCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX1JFQURfQ05UKTsKKwkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9XUklURV9DTlQpOworCX0KKworCWlvbW9kZSA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9JT19NX01PREVTKTsKKwkvKiBTZXQgaW5wdXQgYW5kIG91dHB1dCB0cmFuc2ZlciBtb2RlICovCisJaW9tb2RlICY9IH4oUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLIHwgUVVQX0lPX01fT1VUUFVUX01PREVfTUFTSyk7CisJaW9tb2RlICY9IH4oUVVQX0lPX01fUEFDS19FTiB8IFFVUF9JT19NX1VOUEFDS19FTik7CisJaW9tb2RlIHw9IChtb2RlIDw8IFFVUF9JT19NX09VVFBVVF9NT0RFX01BU0tfU0hJRlQpOworCWlvbW9kZSB8PSAobW9kZSA8PCBRVVBfSU9fTV9JTlBVVF9NT0RFX01BU0tfU0hJRlQpOworCisJd3JpdGVsX3JlbGF4ZWQoaW9tb2RlLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX0lPX01fTU9ERVMpOworCisJY29uZmlnID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgU1BJX0NPTkZJRyk7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCWNvbmZpZyB8PSBTUElfQ09ORklHX0xPT1BCQUNLOworCWVsc2UKKwkJY29uZmlnICY9IH5TUElfQ09ORklHX0xPT1BCQUNLOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQljb25maWcgJj0gflNQSV9DT05GSUdfSU5QVVRfRklSU1Q7CisJZWxzZQorCQljb25maWcgfD0gU1BJX0NPTkZJR19JTlBVVF9GSVJTVDsKKworCS8qCisJICogSFNfTU9ERSBpbXByb3ZlcyBzaWduYWwgc3RhYmlsaXR5IGZvciBzcGktY2xrIGhpZ2ggcmF0ZXMsCisJICogYnV0IGlzIGludmFsaWQgaW4gbG9vcCBiYWNrIG1vZGUuCisJICovCisJaWYgKCh4ZmVyLT5zcGVlZF9oeiA+PSBTUElfSFNfTUlOX1JBVEUpICYmICEoc3BpLT5tb2RlICYgU1BJX0xPT1ApKQorCQljb25maWcgfD0gU1BJX0NPTkZJR19IU19NT0RFOworCWVsc2UKKwkJY29uZmlnICY9IH5TUElfQ09ORklHX0hTX01PREU7CisKKwl3cml0ZWxfcmVsYXhlZChjb25maWcsIGNvbnRyb2xsZXItPmJhc2UgKyBTUElfQ09ORklHKTsKKworCWNvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZyAmPSB+KFFVUF9DT05GSUdfTk9fSU5QVVQgfCBRVVBfQ09ORklHX05PX09VVFBVVCB8IFFVUF9DT05GSUdfTik7CisJY29uZmlnIHw9IHhmZXItPmJpdHNfcGVyX3dvcmQgLSAxOworCWNvbmZpZyB8PSBRVVBfQ09ORklHX1NQSV9NT0RFOworCXdyaXRlbF9yZWxheGVkKGNvbmZpZywgY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCisJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9PUEVSQVRJT05BTF9NQVNLKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BpX3F1cF9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCXUzMiBpb2NvbnRvbCwgbWFzazsKKworCWlvY29udG9sID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgU1BJX0lPX0NPTlRST0wpOworCisJLyogRGlzYWJsZSBhdXRvIENTIHRvZ2dsZSBhbmQgdXNlIG1hbnVhbCAqLworCWlvY29udG9sICY9IH5TUElfSU9fQ19NWF9DU19NT0RFOworCWlvY29udG9sIHw9IFNQSV9JT19DX0ZPUkNFX0NTOworCisJaW9jb250b2wgJj0gflNQSV9JT19DX0NTX1NFTEVDVF9NQVNLOworCWlvY29udG9sIHw9IFNQSV9JT19DX0NTX1NFTEVDVChzcGktPmNoaXBfc2VsZWN0KTsKKworCW1hc2sgPSBTUElfSU9fQ19DU19OX1BPTEFSSVRZXzAgPDwgc3BpLT5jaGlwX3NlbGVjdDsKKworCWlmIChlbmFibGUpCisJCWlvY29udG9sIHw9IG1hc2s7CisJZWxzZQorCQlpb2NvbnRvbCAmPSB+bWFzazsKKworCXdyaXRlbF9yZWxheGVkKGlvY29udG9sLCBjb250cm9sbGVyLT5iYXNlICsgU1BJX0lPX0NPTlRST0wpOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkgICAgICBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGZsYWdzOworCWludCByZXQgPSAtRUlPOworCisJcmV0ID0gc3BpX3F1cF9pb19jb25maWcoc3BpLCB4ZmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGltZW91dCA9IERJVl9ST1VORF9VUCh4ZmVyLT5zcGVlZF9oeiwgTVNFQ19QRVJfU0VDKTsKKwl0aW1lb3V0ID0gRElWX1JPVU5EX1VQKHhmZXItPmxlbiAqIDgsIHRpbWVvdXQpOworCXRpbWVvdXQgPSAxMDAgKiBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCisJcmVpbml0X2NvbXBsZXRpb24oJmNvbnRyb2xsZXItPmRvbmUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwljb250cm9sbGVyLT54ZmVyICAgICA9IHhmZXI7CisJY29udHJvbGxlci0+ZXJyb3IgICAgPSAwOworCWNvbnRyb2xsZXItPnJ4X2J5dGVzID0gMDsKKwljb250cm9sbGVyLT50eF9ieXRlcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SVU4pKSB7CisJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUlVOIHN0YXRlXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWlmIChzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUEFVU0UpKSB7CisJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUEFVU0Ugc3RhdGVcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3BpX3F1cF9maWZvX3dyaXRlKGNvbnRyb2xsZXIsIHhmZXIpOworCisJaWYgKHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SVU4pKSB7CisJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgRVhFQ1VURSBzdGF0ZVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udHJvbGxlci0+ZG9uZSwgdGltZW91dCkpCisJCXJldCA9IC1FVElNRURPVVQ7CitleGl0OgorCXNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwljb250cm9sbGVyLT54ZmVyID0gTlVMTDsKKwlpZiAoIXJldCkKKwkJcmV0ID0gY29udHJvbGxlci0+ZXJyb3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGNsayAqaWNsaywgKmNjbGs7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgZGF0YSwgbWF4X2ZyZXEsIGlvbW9kZTsKKwlpbnQgcmV0LCBpcnEsIHNpemU7CisKKwlkZXYgPSAmcGRldi0+ZGV2OworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gaXJxOworCisJY2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjb3JlIik7CisJaWYgKElTX0VSUihjY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2Nsayk7CisKKwlpY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImlmYWNlIik7CisJaWYgKElTX0VSUihpY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoaWNsayk7CisKKwkvKiBUaGlzIGlzIG9wdGlvbmFsIHBhcmFtZXRlciAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJzcGktbWF4LWZyZXF1ZW5jeSIsICZtYXhfZnJlcSkpCisJCW1heF9mcmVxID0gU1BJX01BWF9SQVRFOworCisJaWYgKCFtYXhfZnJlcSB8fCBtYXhfZnJlcSA+IFNQSV9NQVhfUkFURSkgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgY2xvY2sgZnJlcXVlbmN5ICVkXG4iLCBtYXhfZnJlcSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNjbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZW5hYmxlIGNvcmUgY2xvY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShpY2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjY2xrKTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZW5hYmxlIGlmYWNlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkYXRhID0gcmVhZGxfcmVsYXhlZChiYXNlICsgUVVQX0hXX1ZFUlNJT04pOworCisJaWYgKGRhdGEgPCBRVVBfSFdfVkVSU0lPTl8yXzFfMSkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2Nsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpY2xrKTsKKwkJZGV2X2VycihkZXYsICJ2LiUwOHggaXMgbm90IHN1cHBvcnRlZFxuIiwgZGF0YSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3Qgc3BpX3F1cCkpOworCWlmICghbWFzdGVyKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGljbGspOworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvY2F0ZSBtYXN0ZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MT09QOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBTUElfTlVNX0NISVBTRUxFQ1RTOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDQsIDMyKTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IG1heF9mcmVxOworCW1hc3Rlci0+c2V0X2NzID0gc3BpX3F1cF9zZXRfY3M7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzcGlfcXVwX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKworCWNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwljb250cm9sbGVyLT5kZXYgPSBkZXY7CisJY29udHJvbGxlci0+YmFzZSA9IGJhc2U7CisJY29udHJvbGxlci0+aWNsayA9IGljbGs7CisJY29udHJvbGxlci0+Y2NsayA9IGNjbGs7CisJY29udHJvbGxlci0+aXJxID0gaXJxOworCisJc3Bpbl9sb2NrX2luaXQoJmNvbnRyb2xsZXItPmxvY2spOworCWluaXRfY29tcGxldGlvbigmY29udHJvbGxlci0+ZG9uZSk7CisKKwlpb21vZGUgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBRVVBfSU9fTV9NT0RFUyk7CisKKwlzaXplID0gUVVQX0lPX01fT1VUUFVUX0JMT0NLX1NJWkUoaW9tb2RlKTsKKwlpZiAoc2l6ZSkKKwkJY29udHJvbGxlci0+b3V0X2Jsa19zeiA9IHNpemUgKiAxNjsKKwllbHNlCisJCWNvbnRyb2xsZXItPm91dF9ibGtfc3ogPSA0OworCisJc2l6ZSA9IFFVUF9JT19NX0lOUFVUX0JMT0NLX1NJWkUoaW9tb2RlKTsKKwlpZiAoc2l6ZSkKKwkJY29udHJvbGxlci0+aW5fYmxrX3N6ID0gc2l6ZSAqIDE2OworCWVsc2UKKwkJY29udHJvbGxlci0+aW5fYmxrX3N6ID0gNDsKKworCXNpemUgPSBRVVBfSU9fTV9PVVRQVVRfRklGT19TSVpFKGlvbW9kZSk7CisJY29udHJvbGxlci0+b3V0X2ZpZm9fc3ogPSBjb250cm9sbGVyLT5vdXRfYmxrX3N6ICogKDIgPDwgc2l6ZSk7CisKKwlzaXplID0gUVVQX0lPX01fSU5QVVRfRklGT19TSVpFKGlvbW9kZSk7CisJY29udHJvbGxlci0+aW5fZmlmb19zeiA9IGNvbnRyb2xsZXItPmluX2Jsa19zeiAqICgyIDw8IHNpemUpOworCisJZGV2X2luZm8oZGV2LCAidi4lMDh4IElOOmJsb2NrOiVkLCBmaWZvOiVkLCBPVVQ6YmxvY2s6JWQsIGZpZm86JWRcbiIsCisJCSBkYXRhLCBjb250cm9sbGVyLT5pbl9ibGtfc3osIGNvbnRyb2xsZXItPmluX2ZpZm9fc3osCisJCSBjb250cm9sbGVyLT5vdXRfYmxrX3N6LCBjb250cm9sbGVyLT5vdXRfZmlmb19zeik7CisKKwl3cml0ZWxfcmVsYXhlZCgxLCBiYXNlICsgUVVQX1NXX1JFU0VUKTsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzZXQgUkVTRVQgc3RhdGVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBRVVBfSU9fTV9NT0RFUyk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgYmFzZSArIFFVUF9PUEVSQVRJT05BTF9NQVNLKTsKKwl3cml0ZWxfcmVsYXhlZChTUElfRVJST1JfQ0xLX1VOREVSX1JVTiB8IFNQSV9FUlJPUl9DTEtfT1ZFUl9SVU4sCisJCSAgICAgICBiYXNlICsgU1BJX0VSUk9SX0ZMQUdTX0VOKTsKKworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBTUElfQ09ORklHKTsKKwl3cml0ZWxfcmVsYXhlZChTUElfSU9fQ19OT19UUklfU1RBVEUsIGJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLCBzcGlfcXVwX3F1cF9pcnEsCisJCQkgICAgICAgSVJRRl9UUklHR0VSX0hJR0gsIHBkZXYtPm5hbWUsIGNvbnRyb2xsZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsIE1TRUNfUEVSX1NFQyk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXJldHVybiAwOworCitlcnJvcjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGljbGspOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHNwaV9xdXBfcG1fc3VzcGVuZF9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTMyIGNvbmZpZzsKKworCS8qIEVuYWJsZSBjbG9ja3MgYXV0byBnYWl0aW5nICovCisJY29uZmlnID0gcmVhZGwoY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZyB8PSBRVVBfQ09ORklHX0NMT0NLX0FVVE9fR0FURTsKKwl3cml0ZWxfcmVsYXhlZChjb25maWcsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfQ09ORklHKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfcXVwX3BtX3Jlc3VtZV9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTMyIGNvbmZpZzsKKworCS8qIERpc2FibGUgY2xvY2tzIGF1dG8gZ2FpdGluZyAqLworCWNvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZyAmPSB+UVVQX0NPTkZJR19DTE9DS19BVVRPX0dBVEU7CisJd3JpdGVsX3JlbGF4ZWQoY29uZmlnLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX0NPTkZJRyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBzcGlfcXVwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX21hc3Rlcl9zdXNwZW5kKG1hc3Rlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5jY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY29udHJvbGxlci0+aWNsayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNvbnRyb2xsZXItPmljbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY29udHJvbGxlci0+Y2Nsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcGlfbWFzdGVyX3Jlc3VtZShtYXN0ZXIpOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgaW50IHNwaV9xdXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1JFU0VUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmNjbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5pY2xrKTsKKworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwaV9xdXBfZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BpLXF1cC12Mi4xLjEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcGktcXVwLXYyLjIuMSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BpX3F1cF9kdF9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzcGlfcXVwX2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoc3BpX3F1cF9zdXNwZW5kLCBzcGlfcXVwX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoc3BpX3F1cF9wbV9zdXNwZW5kX3J1bnRpbWUsCisJCQkgICBzcGlfcXVwX3BtX3Jlc3VtZV9ydW50aW1lLAorCQkJICAgTlVMTCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV9xdXBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJzcGlfcXVwIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucG0JCT0gJnNwaV9xdXBfZGV2X3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gc3BpX3F1cF9kdF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNwaV9xdXBfcHJvYmUsCisJLnJlbW92ZSA9IHNwaV9xdXBfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3BpX3F1cF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNwaV9xdXAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktcnNwaS5jCmluZGV4IDI4OTg3ZDkuLjFmYjBhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXJzcGkuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBTSCBSU1BJIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBHbGlkZXIgYnZiYQogICoKICAqIEJhc2VkIG9uIHNwaS1zaC5jOgogICogQ29weXJpZ2h0IChDKSAyMDExIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCkBAIC0yNSwxNCArMjYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfZG1hLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9yc3BpLmg+CkBAIC00OSw3ICs1MCw3IEBACiAjZGVmaW5lIFJTUElfU1BDS0QJCTB4MGMJLyogQ2xvY2sgRGVsYXkgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUlNQSV9TU0xORAkJMHgwZAkvKiBTbGF2ZSBTZWxlY3QgTmVnYXRpb24gRGVsYXkgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUlNQSV9TUE5ECQkweDBlCS8qIE5leHQtQWNjZXNzIERlbGF5IFJlZ2lzdGVyICovCi0jZGVmaW5lIFJTUElfU1BDUjIJCTB4MGYJLyogQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIFJTUElfU1BDUjIJCTB4MGYJLyogQ29udHJvbCBSZWdpc3RlciAyIChTSCBvbmx5KSAqLwogI2RlZmluZSBSU1BJX1NQQ01EMAkJMHgxMAkvKiBDb21tYW5kIFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgUlNQSV9TUENNRDEJCTB4MTIJLyogQ29tbWFuZCBSZWdpc3RlciAxICovCiAjZGVmaW5lIFJTUElfU1BDTUQyCQkweDE0CS8qIENvbW1hbmQgUmVnaXN0ZXIgMiAqLwpAQCAtNTgsMTYgKzU5LDIzIEBACiAjZGVmaW5lIFJTUElfU1BDTUQ1CQkweDFhCS8qIENvbW1hbmQgUmVnaXN0ZXIgNSAqLwogI2RlZmluZSBSU1BJX1NQQ01ENgkJMHgxYwkvKiBDb21tYW5kIFJlZ2lzdGVyIDYgKi8KICNkZWZpbmUgUlNQSV9TUENNRDcJCTB4MWUJLyogQ29tbWFuZCBSZWdpc3RlciA3ICovCisjZGVmaW5lIFJTUElfU1BDTUQoaSkJCShSU1BJX1NQQ01EMCArIChpKSAqIDIpCisjZGVmaW5lIFJTUElfTlVNX1NQQ01ECQk4CisjZGVmaW5lIFJTUElfUlpfTlVNX1NQQ01ECTQKKyNkZWZpbmUgUVNQSV9OVU1fU1BDTUQJCTQKKworLyogUlNQSSBvbiBSWiBvbmx5ICovCiAjZGVmaW5lIFJTUElfU1BCRkNSCQkweDIwCS8qIEJ1ZmZlciBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIFJTUElfU1BCRkRSCQkweDIyCS8qIEJ1ZmZlciBEYXRhIENvdW50IFNldHRpbmcgUmVnaXN0ZXIgKi8KIAotLypxc3BpIG9ubHkgKi8KKy8qIFFTUEkgb25seSAqLwogI2RlZmluZSBRU1BJX1NQQkZDUgkJMHgxOAkvKiBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBRU1BJX1NQQkRDUgkJMHgxYQkvKiBCdWZmZXIgRGF0YSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSBRU1BJX1NQQk1VTDAJCTB4MWMJLyogVHJhbnNmZXIgRGF0YSBMZW5ndGggTXVsdGlwbGllciBTZXR0aW5nIFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgUVNQSV9TUEJNVUwxCQkweDIwCS8qIFRyYW5zZmVyIERhdGEgTGVuZ3RoIE11bHRpcGxpZXIgU2V0dGluZyBSZWdpc3RlciAxICovCiAjZGVmaW5lIFFTUElfU1BCTVVMMgkJMHgyNAkvKiBUcmFuc2ZlciBEYXRhIExlbmd0aCBNdWx0aXBsaWVyIFNldHRpbmcgUmVnaXN0ZXIgMiAqLwogI2RlZmluZSBRU1BJX1NQQk1VTDMJCTB4MjgJLyogVHJhbnNmZXIgRGF0YSBMZW5ndGggTXVsdGlwbGllciBTZXR0aW5nIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUVNQSV9TUEJNVUwoaSkJCShRU1BJX1NQQk1VTDAgKyAoaSkgKiA0KQogCiAvKiBTUENSIC0gQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBTUENSX1NQUklFCQkweDgwCS8qIFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSAqLwpAQCAtMTA0LDcgKzExMiw3IEBACiAjZGVmaW5lIFNQU1JfUEVSRgkJMHgwOAkvKiBQYXJpdHkgRXJyb3IgRmxhZyAqLwogI2RlZmluZSBTUFNSX01PREYJCTB4MDQJLyogTW9kZSBGYXVsdCBFcnJvciBGbGFnICovCiAjZGVmaW5lIFNQU1JfSURMTkYJCTB4MDIJLyogUlNQSSBJZGxlIEZsYWcgKi8KLSNkZWZpbmUgU1BTUl9PVlJGCQkweDAxCS8qIE92ZXJydW4gRXJyb3IgRmxhZyAqLworI2RlZmluZSBTUFNSX09WUkYJCTB4MDEJLyogT3ZlcnJ1biBFcnJvciBGbGFnIChSU1BJIG9ubHkpICovCiAKIC8qIFNQU0NSIC0gU2VxdWVuY2UgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBTUFNDUl9TUFNMTl9NQVNLCTB4MDcJLyogU2VxdWVuY2UgTGVuZ3RoIFNwZWNpZmljYXRpb24gKi8KQEAgLTEyMSwxMyArMTI5LDEzIEBACiAjZGVmaW5lIFNQRENSX1NQTFdPUkQJCVNQRENSX1NQTFcxCiAjZGVmaW5lIFNQRENSX1NQTEJZVEUJCVNQRENSX1NQTFcwCiAjZGVmaW5lIFNQRENSX1NQTFcJCTB4MjAJLyogQWNjZXNzIFdpZHRoIFNwZWNpZmljYXRpb24gKFNIKSAqLwotI2RlZmluZSBTUERDUl9TUFJEVEQJCTB4MTAJLyogUmVjZWl2ZSBUcmFuc21pdCBEYXRhIFNlbGVjdCAqLworI2RlZmluZSBTUERDUl9TUFJEVEQJCTB4MTAJLyogUmVjZWl2ZSBUcmFuc21pdCBEYXRhIFNlbGVjdCAoU0gpICovCiAjZGVmaW5lIFNQRENSX1NMU0VMMQkJMHgwOAogI2RlZmluZSBTUERDUl9TTFNFTDAJCTB4MDQKLSNkZWZpbmUgU1BEQ1JfU0xTRUxfTUFTSwkweDBjCS8qIFNTTDEgT3V0cHV0IFNlbGVjdCAqLworI2RlZmluZSBTUERDUl9TTFNFTF9NQVNLCTB4MGMJLyogU1NMMSBPdXRwdXQgU2VsZWN0IChTSCkgKi8KICNkZWZpbmUgU1BEQ1JfU1BGQzEJCTB4MDIKICNkZWZpbmUgU1BEQ1JfU1BGQzAJCTB4MDEKLSNkZWZpbmUgU1BEQ1JfU1BGQ19NQVNLCQkweDAzCS8qIEZyYW1lIENvdW50IFNldHRpbmcgKDEtNCkgKi8KKyNkZWZpbmUgU1BEQ1JfU1BGQ19NQVNLCQkweDAzCS8qIEZyYW1lIENvdW50IFNldHRpbmcgKDEtNCkgKFNIKSAqLwogCiAvKiBTUENLRCAtIENsb2NrIERlbGF5IFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQQ0tEX1NDS0RMX01BU0sJMHgwNwkvKiBDbG9jayBEZWxheSBTZXR0aW5nICgxLTgpICovCkBAIC0xNTEsNyArMTU5LDcgQEAKICNkZWZpbmUgU1BDTURfTFNCRgkJMHgxMDAwCS8qIExTQiBGaXJzdCAqLwogI2RlZmluZSBTUENNRF9TUEJfTUFTSwkJMHgwZjAwCS8qIERhdGEgTGVuZ3RoIFNldHRpbmcgKi8KICNkZWZpbmUgU1BDTURfU1BCXzhfVE9fMTYoYml0KQkoKChiaXQgLSAxKSA8PCA4KSAmIFNQQ01EX1NQQl9NQVNLKQotI2RlZmluZSBTUENNRF9TUEJfOEJJVAkJMHgwMDAwCS8qIHFzcGkgb25seSAqLworI2RlZmluZSBTUENNRF9TUEJfOEJJVAkJMHgwMDAwCS8qIFFTUEkgb25seSAqLwogI2RlZmluZSBTUENNRF9TUEJfMTZCSVQJCTB4MDEwMAogI2RlZmluZSBTUENNRF9TUEJfMjBCSVQJCTB4MDAwMAogI2RlZmluZSBTUENNRF9TUEJfMjRCSVQJCTB4MDEwMApAQCAtMTcwLDggKzE3OCw4IEBACiAjZGVmaW5lIFNQQ01EX0NQSEEJCTB4MDAwMQkvKiBDbG9jayBQaGFzZSBTZXR0aW5nICovCiAKIC8qIFNQQkZDUiAtIEJ1ZmZlciBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNQQkZDUl9UWFJTVAkJMHg4MAkvKiBUcmFuc21pdCBCdWZmZXIgRGF0YSBSZXNldCAocXNwaSBvbmx5KSAqLwotI2RlZmluZSBTUEJGQ1JfUlhSU1QJCTB4NDAJLyogUmVjZWl2ZSBCdWZmZXIgRGF0YSBSZXNldCAocXNwaSBvbmx5KSAqLworI2RlZmluZSBTUEJGQ1JfVFhSU1QJCTB4ODAJLyogVHJhbnNtaXQgQnVmZmVyIERhdGEgUmVzZXQgKi8KKyNkZWZpbmUgU1BCRkNSX1JYUlNUCQkweDQwCS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgUmVzZXQgKi8KICNkZWZpbmUgU1BCRkNSX1RYVFJHX01BU0sJMHgzMAkvKiBUcmFuc21pdCBCdWZmZXIgRGF0YSBUcmlnZ2VyaW5nIE51bWJlciAqLwogI2RlZmluZSBTUEJGQ1JfUlhUUkdfTUFTSwkweDA3CS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgVHJpZ2dlcmluZyBOdW1iZXIgKi8KIApAQCAtMTgxLDIyICsxODksMjEgQEAKIAl2b2lkIF9faW9tZW0gKmFkZHI7CiAJdTMyIG1heF9zcGVlZF9oejsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdzOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBjbGsgKmNsazsKLQl1OCBzcHNyOwogCXUxNiBzcGNtZDsKKwl1OCBzcHNyOworCXU4IHNwcGNyOworCWludCByeF9pcnEsIHR4X2lycTsKIAljb25zdCBzdHJ1Y3Qgc3BpX29wcyAqb3BzOwogCiAJLyogZm9yIGRtYWVuZ2luZSAqLwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbl90eDsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5fcng7Ci0JaW50IGlycTsKIAogCXVuc2lnbmVkIGRtYV93aWR0aF8xNmJpdDoxOwogCXVuc2lnbmVkIGRtYV9jYWxsYmFja2VkOjE7CisJdW5zaWduZWQgYnl0ZV9hY2Nlc3M6MTsKIH07CiAKIHN0YXRpYyB2b2lkIHJzcGlfd3JpdGU4KGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHU4IGRhdGEsIHUxNiBvZmZzZXQpCkBAIC0yMjQsMzQgKzIzMSw0NyBAQAogCXJldHVybiBpb3JlYWQxNihyc3BpLT5hZGRyICsgb2Zmc2V0KTsKIH0KIAorc3RhdGljIHZvaWQgcnNwaV93cml0ZV9kYXRhKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHUxNiBkYXRhKQoreworCWlmIChyc3BpLT5ieXRlX2FjY2VzcykKKwkJcnNwaV93cml0ZTgocnNwaSwgZGF0YSwgUlNQSV9TUERSKTsKKwllbHNlIC8qIDE2IGJpdCAqLworCQlyc3BpX3dyaXRlMTYocnNwaSwgZGF0YSwgUlNQSV9TUERSKTsKK30KKworc3RhdGljIHUxNiByc3BpX3JlYWRfZGF0YShjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpKQoreworCWlmIChyc3BpLT5ieXRlX2FjY2VzcykKKwkJcmV0dXJuIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUERSKTsKKwllbHNlIC8qIDE2IGJpdCAqLworCQlyZXR1cm4gcnNwaV9yZWFkMTYocnNwaSwgUlNQSV9TUERSKTsKK30KKwogLyogb3B0aW9uYWwgZnVuY3Rpb25zICovCiBzdHJ1Y3Qgc3BpX29wcyB7Ci0JaW50ICgqc2V0X2NvbmZpZ19yZWdpc3RlcikoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKLQkJCQkgICBpbnQgYWNjZXNzX3NpemUpOwotCWludCAoKnNlbmRfcGlvKShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2csCi0JCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KTsKLQlpbnQgKCpyZWNlaXZlX3Bpbykoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCk7Ci0KKwlpbnQgKCpzZXRfY29uZmlnX3JlZ2lzdGVyKShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpOworCWludCAoKnRyYW5zZmVyX29uZSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKTsKKwl1MTYgbW9kZV9iaXRzOwogfTsKIAogLyoKLSAqIGZ1bmN0aW9ucyBmb3IgUlNQSQorICogZnVuY3Rpb25zIGZvciBSU1BJIG9uIGxlZ2FjeSBTSAogICovCi1zdGF0aWMgaW50IHJzcGlfc2V0X2NvbmZpZ19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAotCQkJCSAgICBpbnQgYWNjZXNzX3NpemUpCitzdGF0aWMgaW50IHJzcGlfc2V0X2NvbmZpZ19yZWdpc3RlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpCiB7CiAJaW50IHNwYnI7CiAKLQkvKiBTZXRzIG91dHB1dCBtb2RlKENNT1MpIGFuZCBNT1NJIHNpZ25hbChmcm9tIHByZXZpb3VzIHRyYW5zZmVyKSAqLwotCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BQQ1IpOworCS8qIFNldHMgb3V0cHV0IG1vZGUsIE1PU0kgc2lnbmFsLCBhbmQgKG9wdGlvbmFsbHkpIGxvb3BiYWNrICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaS0+c3BwY3IsIFJTUElfU1BQQ1IpOwogCiAJLyogU2V0cyB0cmFuc2ZlciBiaXQgcmF0ZSAqLwogCXNwYnIgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSAvICgyICogcnNwaS0+bWF4X3NwZWVkX2h6KSAtIDE7CiAJcnNwaV93cml0ZTgocnNwaSwgY2xhbXAoc3BiciwgMCwgMjU1KSwgUlNQSV9TUEJSKTsKIAotCS8qIFNldHMgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSB1c2VkOiAxIGZyYW1lICovCi0JcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUERDUik7CisJLyogRGlzYWJsZSBkdW1teSB0cmFuc21pc3Npb24sIHNldCAxNi1iaXQgd29yZCBhY2Nlc3MsIDEgZnJhbWUgKi8KKwlyc3BpX3dyaXRlOChyc3BpLCAwLCBSU1BJX1NQRENSKTsKKwlyc3BpLT5ieXRlX2FjY2VzcyA9IDA7CiAKIAkvKiBTZXRzIFJTUENLLCBTU0wsIG5leHQtYWNjZXNzIGRlbGF5IHZhbHVlICovCiAJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUENLRCk7CkBAIC0yNjIsOCArMjgyLDQxIEBACiAJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUENSMik7CiAKIAkvKiBTZXRzIFNQQ01EICovCi0JcnNwaV93cml0ZTE2KHJzcGksIFNQQ01EX1NQQl84X1RPXzE2KGFjY2Vzc19zaXplKSB8IHJzcGktPnNwY21kLAotCQkgICAgIFJTUElfU1BDTUQwKTsKKwlyc3BpLT5zcGNtZCB8PSBTUENNRF9TUEJfOF9UT18xNihhY2Nlc3Nfc2l6ZSk7CisJcnNwaV93cml0ZTE2KHJzcGksIHJzcGktPnNwY21kLCBSU1BJX1NQQ01EMCk7CisKKwkvKiBTZXRzIFJTUEkgbW9kZSAqLworCXJzcGlfd3JpdGU4KHJzcGksIFNQQ1JfTVNUUiwgUlNQSV9TUENSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZnVuY3Rpb25zIGZvciBSU1BJIG9uIFJaCisgKi8KK3N0YXRpYyBpbnQgcnNwaV9yel9zZXRfY29uZmlnX3JlZ2lzdGVyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIGludCBhY2Nlc3Nfc2l6ZSkKK3sKKwlpbnQgc3BicjsKKworCS8qIFNldHMgb3V0cHV0IG1vZGUsIE1PU0kgc2lnbmFsLCBhbmQgKG9wdGlvbmFsbHkpIGxvb3BiYWNrICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaS0+c3BwY3IsIFJTUElfU1BQQ1IpOworCisJLyogU2V0cyB0cmFuc2ZlciBiaXQgcmF0ZSAqLworCXNwYnIgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSAvICgyICogcnNwaS0+bWF4X3NwZWVkX2h6KSAtIDE7CisJcnNwaV93cml0ZTgocnNwaSwgY2xhbXAoc3BiciwgMCwgMjU1KSwgUlNQSV9TUEJSKTsKKworCS8qIERpc2FibGUgZHVtbXkgdHJhbnNtaXNzaW9uLCBzZXQgYnl0ZSBhY2Nlc3MgKi8KKwlyc3BpX3dyaXRlOChyc3BpLCBTUERDUl9TUExCWVRFLCBSU1BJX1NQRENSKTsKKwlyc3BpLT5ieXRlX2FjY2VzcyA9IDE7CisKKwkvKiBTZXRzIFJTUENLLCBTU0wsIG5leHQtYWNjZXNzIGRlbGF5IHZhbHVlICovCisJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUENLRCk7CisJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TU0xORCk7CisJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUE5EKTsKKworCS8qIFNldHMgU1BDTUQgKi8KKwlyc3BpLT5zcGNtZCB8PSBTUENNRF9TUEJfOF9UT18xNihhY2Nlc3Nfc2l6ZSk7CisJcnNwaV93cml0ZTE2KHJzcGksIHJzcGktPnNwY21kLCBSU1BJX1NQQ01EMCk7CiAKIAkvKiBTZXRzIFJTUEkgbW9kZSAqLwogCXJzcGlfd3JpdGU4KHJzcGksIFNQQ1JfTVNUUiwgUlNQSV9TUENSKTsKQEAgLTI3NCwyMSArMzI3LDIwIEBACiAvKgogICogZnVuY3Rpb25zIGZvciBRU1BJCiAgKi8KLXN0YXRpYyBpbnQgcXNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCi0JCQkJICAgIGludCBhY2Nlc3Nfc2l6ZSkKK3N0YXRpYyBpbnQgcXNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIGludCBhY2Nlc3Nfc2l6ZSkKIHsKLQl1MTYgc3BjbWQ7CiAJaW50IHNwYnI7CiAKLQkvKiBTZXRzIG91dHB1dCBtb2RlKENNT1MpIGFuZCBNT1NJIHNpZ25hbChmcm9tIHByZXZpb3VzIHRyYW5zZmVyKSAqLwotCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BQQ1IpOworCS8qIFNldHMgb3V0cHV0IG1vZGUsIE1PU0kgc2lnbmFsLCBhbmQgKG9wdGlvbmFsbHkpIGxvb3BiYWNrICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaS0+c3BwY3IsIFJTUElfU1BQQ1IpOwogCiAJLyogU2V0cyB0cmFuc2ZlciBiaXQgcmF0ZSAqLwogCXNwYnIgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSAvICgyICogcnNwaS0+bWF4X3NwZWVkX2h6KTsKIAlyc3BpX3dyaXRlOChyc3BpLCBjbGFtcChzcGJyLCAwLCAyNTUpLCBSU1BJX1NQQlIpOwogCi0JLyogU2V0cyBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIHVzZWQ6IDEgZnJhbWUgKi8KLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBSU1BJX1NQRENSKTsKKwkvKiBEaXNhYmxlIGR1bW15IHRyYW5zbWlzc2lvbiwgc2V0IGJ5dGUgYWNjZXNzICovCisJcnNwaV93cml0ZTgocnNwaSwgMCwgUlNQSV9TUERDUik7CisJcnNwaS0+Ynl0ZV9hY2Nlc3MgPSAxOwogCiAJLyogU2V0cyBSU1BDSywgU1NMLCBuZXh0LWFjY2VzcyBkZWxheSB2YWx1ZSAqLwogCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BDS0QpOwpAQCAtMjk3LDEzICszNDksMTMgQEAKIAogCS8qIERhdGEgTGVuZ3RoIFNldHRpbmcgKi8KIAlpZiAoYWNjZXNzX3NpemUgPT0gOCkKLQkJc3BjbWQgPSBTUENNRF9TUEJfOEJJVDsKKwkJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzhCSVQ7CiAJZWxzZSBpZiAoYWNjZXNzX3NpemUgPT0gMTYpCi0JCXNwY21kID0gU1BDTURfU1BCXzE2QklUOworCQlyc3BpLT5zcGNtZCB8PSBTUENNRF9TUEJfMTZCSVQ7CiAJZWxzZQotCQlzcGNtZCA9IFNQQ01EX1NQQl8zMkJJVDsKKwkJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzMyQklUOwogCi0Jc3BjbWQgfD0gU1BDTURfU0NLREVOIHwgU1BDTURfU0xOREVOIHwgcnNwaS0+c3BjbWQgfCBTUENNRF9TUE5ERU47CisJcnNwaS0+c3BjbWQgfD0gU1BDTURfU0NLREVOIHwgU1BDTURfU0xOREVOIHwgU1BDTURfU1BOREVOOwogCiAJLyogUmVzZXRzIHRyYW5zZmVyIGRhdGEgbGVuZ3RoICovCiAJcnNwaV93cml0ZTMyKHJzcGksIDAsIFFTUElfU1BCTVVMMCk7CkBAIC0zMTQsOSArMzY2LDkgQEAKIAlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBRU1BJX1NQQkZDUik7CiAKIAkvKiBTZXRzIFNQQ01EICovCi0JcnNwaV93cml0ZTE2KHJzcGksIHNwY21kLCBSU1BJX1NQQ01EMCk7CisJcnNwaV93cml0ZTE2KHJzcGksIHJzcGktPnNwY21kLCBSU1BJX1NQQ01EMCk7CiAKLQkvKiBFbmFibGVzIFNQSSBmdW5jdGlvbiBpbiBhIG1hc3RlciBtb2RlICovCisJLyogRW5hYmxlcyBTUEkgZnVuY3Rpb24gaW4gbWFzdGVyIG1vZGUgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCBTUENSX1NQRSB8IFNQQ1JfTVNUUiwgUlNQSV9TUENSKTsKIAogCXJldHVybiAwOwpAQCAtMzQwLDYgKzM5Miw5IEBACiAJaW50IHJldDsKIAogCXJzcGktPnNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CisJaWYgKHJzcGktPnNwc3IgJiB3YWl0X21hc2spCisJCXJldHVybiAwOworCiAJcnNwaV9lbmFibGVfaXJxKHJzcGksIGVuYWJsZV9iaXQpOwogCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChyc3BpLT53YWl0LCByc3BpLT5zcHNyICYgd2FpdF9tYXNrLCBIWik7CiAJaWYgKHJldCA9PSAwICYmICEocnNwaS0+c3BzciAmIHdhaXRfbWFzaykpCkBAIC0zNDgsNzcgKzQwMywzOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc3BpX2Fzc2VydF9zc2woY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKK3N0YXRpYyBpbnQgcnNwaV9kYXRhX291dChzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1OCBkYXRhKQogewotCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSB8IFNQQ1JfU1BFLCBSU1BJX1NQQ1IpOwotfQotCi1zdGF0aWMgdm9pZCByc3BpX25lZ2F0ZV9zc2woY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKLXsKLQlyc3BpX3dyaXRlOChyc3BpLCByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUikgJiB+U1BDUl9TUEUsIFJTUElfU1BDUik7Ci19Ci0KLXN0YXRpYyBpbnQgcnNwaV9zZW5kX3BpbyhzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2csCi0JCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlpbnQgcmVtYWluID0gdC0+bGVuOwotCWNvbnN0IHU4ICpkYXRhID0gdC0+dHhfYnVmOwotCXdoaWxlIChyZW1haW4gPiAwKSB7Ci0JCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSB8IFNQQ1JfVFhNRCwKLQkJCSAgICBSU1BJX1NQQ1IpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQotCQlyc3BpX3dyaXRlMTYocnNwaSwgKmRhdGEsIFJTUElfU1BEUik7Ci0JCWRhdGErKzsKLQkJcmVtYWluLS07CisJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BURUYsIFNQQ1JfU1BUSUUpIDwgMCkgeworCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwgInRyYW5zbWl0IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9Ci0KLQkvKiBXYWl0aW5nIGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KLQlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKLQorCXJzcGlfd3JpdGVfZGF0YShyc3BpLCBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBxc3BpX3NlbmRfcGlvKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZywKLQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQorc3RhdGljIGludCByc3BpX2RhdGFfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKIHsKLQlpbnQgcmVtYWluID0gdC0+bGVuOwotCWNvbnN0IHU4ICpkYXRhID0gdC0+dHhfYnVmOworCXU4IGRhdGE7CiAKLQlyc3BpX3dyaXRlOChyc3BpLCBTUEJGQ1JfVFhSU1QsIFFTUElfU1BCRkNSKTsKLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBRU1BJX1NQQkZDUik7Ci0KLQl3aGlsZSAocmVtYWluID4gMCkgewotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJcnNwaV93cml0ZTgocnNwaSwgKmRhdGErKywgUlNQSV9TUERSKTsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFJGLCBTUENSX1NQUklFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogcmVjZWl2ZSB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCQlyc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BEUik7Ci0KLQkJcmVtYWluLS07CisJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BSRiwgU1BDUl9TUFJJRSkgPCAwKSB7CisJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LCAicmVjZWl2ZSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQotCi0JLyogV2FpdGluZyBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCi0JcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7Ci0KLQlyZXR1cm4gMDsKKwlkYXRhID0gcnNwaV9yZWFkX2RhdGEocnNwaSk7CisJcmV0dXJuIGRhdGE7CiB9CiAKLSNkZWZpbmUgc2VuZF9waW8oc3BpLCBtZXNnLCB0KSBzcGktPm9wcy0+c2VuZF9waW8oc3BpLCBtZXNnLCB0KQorc3RhdGljIGludCByc3BpX2RhdGFfb3V0X2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHU4IGRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHJzcGlfZGF0YV9vdXQocnNwaSwgZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcnNwaV9kYXRhX2luKHJzcGkpOworfQogCiBzdGF0aWMgdm9pZCByc3BpX2RtYV9jb21wbGV0ZSh2b2lkICphcmcpCiB7CkBAIC00NzEsNyArNDg3LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJY29uc3Qgdm9pZCAqYnVmID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7Ci0JdW5zaWduZWQgbGVuOworCXVuc2lnbmVkIGludCBsZW47CiAJaW50IHJldCA9IDA7CiAKIAlpZiAocnNwaS0+ZG1hX3dpZHRoXzE2Yml0KSB7CkBAIC01MDksNyArNTI1LDcgQEAKIAkgKiBETUFDIG5lZWRzIFNQVElFLCBidXQgaWYgU1BUSUUgaXMgc2V0LCB0aGlzIElSUSByb3V0aW5lIHdpbGwgYmUKIAkgKiBjYWxsZWQuIFNvLCB0aGlzIGRyaXZlciBkaXNhYmxlcyB0aGUgSVJRIHdoaWxlIERNQSB0cmFuc2Zlci4KIAkgKi8KLQlkaXNhYmxlX2lycShyc3BpLT5pcnEpOworCWRpc2FibGVfaXJxKHJzcGktPnR4X2lycSk7CiAKIAlyc3BpX3dyaXRlOChyc3BpLCByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUikgfCBTUENSX1RYTUQsIFJTUElfU1BDUik7CiAJcnNwaV9lbmFibGVfaXJxKHJzcGksIFNQQ1JfU1BUSUUpOwpAQCAtNTI4LDcgKzU0NCw3IEBACiAJCXJldCA9IC1FVElNRURPVVQ7CiAJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQVElFKTsKIAotCWVuYWJsZV9pcnEocnNwaS0+aXJxKTsKKwllbmFibGVfaXJxKHJzcGktPnR4X2lycSk7CiAKIGVuZDoKIAlyc3BpX2RtYV91bm1hcF9zZygmc2csIHJzcGktPmNoYW5fdHgsIERNQV9UT19ERVZJQ0UpOwpAQCAtNTQ1LDQ2ICs1NjEsMTcgQEAKIAogCXNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CiAJaWYgKHNwc3IgJiBTUFNSX1NQUkYpCi0JCXJzcGlfcmVhZDE2KHJzcGksIFJTUElfU1BEUik7CS8qIGR1bW15IHJlYWQgKi8KKwkJcnNwaV9yZWFkX2RhdGEocnNwaSk7CS8qIGR1bW15IHJlYWQgKi8KIAlpZiAoc3BzciAmIFNQU1JfT1ZSRikKIAkJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQU1IpICYgflNQU1JfT1ZSRiwKIAkJCSAgICBSU1BJX1NQU1IpOwogfQogCi1zdGF0aWMgaW50IHJzcGlfcmVjZWl2ZV9waW8oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCitzdGF0aWMgdm9pZCByc3BpX3J6X3JlY2VpdmVfaW5pdChjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpKQogewotCWludCByZW1haW4gPSB0LT5sZW47Ci0JdTggKmRhdGE7Ci0KIAlyc3BpX3JlY2VpdmVfaW5pdChyc3BpKTsKLQotCWRhdGEgPSB0LT5yeF9idWY7Ci0Jd2hpbGUgKHJlbWFpbiA+IDApIHsKLQkJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfVFhNRCwKLQkJCSAgICBSU1BJX1NQQ1IpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJLyogZHVtbXkgd3JpdGUgZm9yIGdlbmVyYXRlIGNsb2NrICovCi0JCXJzcGlfd3JpdGUxNihyc3BpLCBEVU1NWV9EQVRBLCBSU1BJX1NQRFIpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQUkYsIFNQQ1JfU1BSSUUpIDwgMCkgewotCQkJZGV2X2VycigmcnNwaS0+bWFzdGVyLT5kZXYsCi0JCQkJIiVzOiByZWNlaXZlIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCS8qIFNQRFIgYWxsb3dzIDE2IG9yIDMyLWJpdCBhY2Nlc3Mgb25seSAqLwotCQkqZGF0YSA9ICh1OClyc3BpX3JlYWQxNihyc3BpLCBSU1BJX1NQRFIpOwotCi0JCWRhdGErKzsKLQkJcmVtYWluLS07Ci0JfQotCi0JcmV0dXJuIDA7CisJcnNwaV93cml0ZTgocnNwaSwgU1BCRkNSX1RYUlNUIHwgU1BCRkNSX1JYUlNULCBSU1BJX1NQQkZDUik7CisJcnNwaV93cml0ZTgocnNwaSwgMCwgUlNQSV9TUEJGQ1IpOwogfQogCiBzdGF0aWMgdm9pZCBxc3BpX3JlY2VpdmVfaW5pdChjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpKQpAQCAtNTkzLDUxICs1ODAsMTcgQEAKIAogCXNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CiAJaWYgKHNwc3IgJiBTUFNSX1NQUkYpCi0JCXJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUERSKTsgICAvKiBkdW1teSByZWFkICovCisJCXJzcGlfcmVhZF9kYXRhKHJzcGkpOyAgIC8qIGR1bW15IHJlYWQgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCBTUEJGQ1JfVFhSU1QgfCBTUEJGQ1JfUlhSU1QsIFFTUElfU1BCRkNSKTsKLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBRU1BJX1NQQkZDUik7CisJcnNwaV93cml0ZTgocnNwaSwgMCwgUVNQSV9TUEJGQ1IpOwogfQogCi1zdGF0aWMgaW50IHFzcGlfcmVjZWl2ZV9waW8oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JaW50IHJlbWFpbiA9IHQtPmxlbjsKLQl1OCAqZGF0YTsKLQotCXFzcGlfcmVjZWl2ZV9pbml0KHJzcGkpOwotCi0JZGF0YSA9IHQtPnJ4X2J1ZjsKLQl3aGlsZSAocmVtYWluID4gMCkgewotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJLyogZHVtbXkgd3JpdGUgZm9yIGdlbmVyYXRlIGNsb2NrICovCi0JCXJzcGlfd3JpdGU4KHJzcGksIERVTU1ZX0RBVEEsIFJTUElfU1BEUik7Ci0KLQkJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BSRiwgU1BDUl9TUFJJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHJlY2VpdmUgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJLyogU1BEUiBhbGxvd3MgOCwgMTYgb3IgMzItYml0IGFjY2VzcyAqLwotCQkqZGF0YSsrID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQRFIpOwotCQlyZW1haW4tLTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSByZWNlaXZlX3BpbyhzcGksIG1lc2csIHQpIHNwaS0+b3BzLT5yZWNlaXZlX3BpbyhzcGksIG1lc2csIHQpCi0KIHN0YXRpYyBpbnQgcnNwaV9yZWNlaXZlX2RtYShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewogCXN0cnVjdCBzY2F0dGVybGlzdCBzZywgc2dfZHVtbXk7CiAJdm9pZCAqZHVtbXkgPSBOVUxMLCAqcnhfYnVmID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MsICpkZXNjX2R1bW15OwotCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCWludCByZXQgPSAwOwogCiAJaWYgKHJzcGktPmRtYV93aWR0aF8xNmJpdCkgewpAQCAtNjk1LDcgKzY0OCw5IEBACiAJICogRE1BQyBuZWVkcyBTUFRJRSwgYnV0IGlmIFNQVElFIGlzIHNldCwgdGhpcyBJUlEgcm91dGluZSB3aWxsIGJlCiAJICogY2FsbGVkLiBTbywgdGhpcyBkcml2ZXIgZGlzYWJsZXMgdGhlIElSUSB3aGlsZSBETUEgdHJhbnNmZXIuCiAJICovCi0JZGlzYWJsZV9pcnEocnNwaS0+aXJxKTsKKwlkaXNhYmxlX2lycShyc3BpLT50eF9pcnEpOworCWlmIChyc3BpLT5yeF9pcnEgIT0gcnNwaS0+dHhfaXJxKQorCQlkaXNhYmxlX2lycShyc3BpLT5yeF9pcnEpOwogCiAJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfVFhNRCwgUlNQSV9TUENSKTsKIAlyc3BpX2VuYWJsZV9pcnEocnNwaSwgU1BDUl9TUFRJRSB8IFNQQ1JfU1BSSUUpOwpAQCAtNzE4LDcgKzY3Myw5IEBACiAJCXJldCA9IC1FVElNRURPVVQ7CiAJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQVElFIHwgU1BDUl9TUFJJRSk7CiAKLQllbmFibGVfaXJxKHJzcGktPmlycSk7CisJZW5hYmxlX2lycShyc3BpLT50eF9pcnEpOworCWlmIChyc3BpLT5yeF9pcnEgIT0gcnNwaS0+dHhfaXJxKQorCQllbmFibGVfaXJxKHJzcGktPnJ4X2lycSk7CiAKIGVuZDoKIAlyc3BpX2RtYV91bm1hcF9zZygmc2csIHJzcGktPmNoYW5fcngsIERNQV9GUk9NX0RFVklDRSk7CkBAIC03NDYsNTYgKzcwMywxNzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnNwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbnQgcnNwaV90cmFuc2Zlcl9vdXRfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJzcGlfZGF0YSwgd3MpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKKwlpbnQgcmVtYWluID0geGZlci0+bGVuLCByZXQ7CisJY29uc3QgdTggKnR4X2J1ZiA9IHhmZXItPnR4X2J1ZjsKKwl1OCAqcnhfYnVmID0geGZlci0+cnhfYnVmOworCXU4IHNwY3IsIGRhdGE7CiAKLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCQlpZiAobGlzdF9lbXB0eSgmcnNwaS0+cXVldWUpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3BpLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKKwlyc3BpX3JlY2VpdmVfaW5pdChyc3BpKTsKKworCXNwY3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUik7CisJaWYgKHJ4X2J1ZikKKwkJc3BjciAmPSB+U1BDUl9UWE1EOworCWVsc2UKKwkJc3BjciB8PSBTUENSX1RYTUQ7CisJcnNwaV93cml0ZTgocnNwaSwgc3BjciwgUlNQSV9TUENSKTsKKworCXdoaWxlIChyZW1haW4gPiAwKSB7CisJCWRhdGEgPSB0eF9idWYgPyAqdHhfYnVmKysgOiBEVU1NWV9EQVRBOworCQlyZXQgPSByc3BpX2RhdGFfb3V0KHJzcGksIGRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyeF9idWYpIHsKKwkJCXJldCA9IHJzcGlfZGF0YV9pbihyc3BpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqcnhfYnVmKysgPSByZXQ7CiAJCX0KLQkJbWVzZyA9IGxpc3RfZW50cnkocnNwaS0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7Ci0JCWxpc3RfZGVsX2luaXQoJm1lc2ctPnF1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCi0JCXJzcGlfYXNzZXJ0X3NzbChyc3BpKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtZXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJCWlmICh0LT50eF9idWYpIHsKLQkJCQlpZiAocnNwaV9pc19kbWEocnNwaSwgdCkpCi0JCQkJCXJldCA9IHJzcGlfc2VuZF9kbWEocnNwaSwgdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXQgPSBzZW5kX3Bpbyhyc3BpLCBtZXNnLCB0KTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmICh0LT5yeF9idWYpIHsKLQkJCQlpZiAocnNwaV9pc19kbWEocnNwaSwgdCkpCi0JCQkJCXJldCA9IHJzcGlfcmVjZWl2ZV9kbWEocnNwaSwgdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXQgPSByZWNlaXZlX3Bpbyhyc3BpLCBtZXNnLCB0KTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCW1lc2ctPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOwotCQl9Ci0JCXJzcGlfbmVnYXRlX3NzbChyc3BpKTsKLQotCQltZXNnLT5zdGF0dXMgPSAwOwotCQltZXNnLT5jb21wbGV0ZShtZXNnLT5jb250ZXh0KTsKKwkJcmVtYWluLS07CiAJfQogCi0JcmV0dXJuOworCS8qIFdhaXQgZm9yIHRoZSBsYXN0IHRyYW5zbWlzc2lvbiAqLworCXJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BURUYsIFNQQ1JfU1BUSUUpOwogCi1lcnJvcjoKLQltZXNnLT5zdGF0dXMgPSByZXQ7Ci0JbWVzZy0+Y29tcGxldGUobWVzZy0+Y29udGV4dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CisKKwlpZiAoIXJzcGlfaXNfZG1hKHJzcGksIHhmZXIpKQorCQlyZXR1cm4gcnNwaV90cmFuc2Zlcl9vdXRfaW4ocnNwaSwgeGZlcik7CisKKwlpZiAoeGZlci0+dHhfYnVmKSB7CisJCXJldCA9IHJzcGlfc2VuZF9kbWEocnNwaSwgeGZlcik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHhmZXItPnJ4X2J1ZikKKwkJcmV0dXJuIHJzcGlfcmVjZWl2ZV9kbWEocnNwaSwgeGZlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc3BpX3J6X3RyYW5zZmVyX291dF9pbihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAorCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJaW50IHJlbWFpbiA9IHhmZXItPmxlbiwgcmV0OworCWNvbnN0IHU4ICp0eF9idWYgPSB4ZmVyLT50eF9idWY7CisJdTggKnJ4X2J1ZiA9IHhmZXItPnJ4X2J1ZjsKKwl1OCBkYXRhOworCisJcnNwaV9yel9yZWNlaXZlX2luaXQocnNwaSk7CisKKwl3aGlsZSAocmVtYWluID4gMCkgeworCQlkYXRhID0gdHhfYnVmID8gKnR4X2J1ZisrIDogRFVNTVlfREFUQTsKKwkJcmV0ID0gcnNwaV9kYXRhX291dF9pbihyc3BpLCBkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocnhfYnVmKQorCQkJKnJ4X2J1ZisrID0gcmV0OworCQlyZW1haW4tLTsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KKwlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzcGlfcnpfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXR1cm4gcnNwaV9yel90cmFuc2Zlcl9vdXRfaW4ocnNwaSwgeGZlcik7Cit9CisKK3N0YXRpYyBpbnQgcXNwaV90cmFuc2Zlcl9vdXRfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWludCByZW1haW4gPSB4ZmVyLT5sZW4sIHJldDsKKwljb25zdCB1OCAqdHhfYnVmID0geGZlci0+dHhfYnVmOworCXU4ICpyeF9idWYgPSB4ZmVyLT5yeF9idWY7CisJdTggZGF0YTsKKworCXFzcGlfcmVjZWl2ZV9pbml0KHJzcGkpOworCisJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJZGF0YSA9IHR4X2J1ZiA/ICp0eF9idWYrKyA6IERVTU1ZX0RBVEE7CisJCXJldCA9IHJzcGlfZGF0YV9vdXRfaW4ocnNwaSwgZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJ4X2J1ZikKKwkJCSpyeF9idWYrKyA9IHJldDsKKwkJcmVtYWluLS07CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCisJcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3BpX3RyYW5zZmVyX291dChzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWNvbnN0IHU4ICpidWYgPSB4ZmVyLT50eF9idWY7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCB4ZmVyLT5sZW47IGkrKykgeworCQlyZXQgPSByc3BpX2RhdGFfb3V0KHJzcGksICpidWYrKyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KKwlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzcGlfdHJhbnNmZXJfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwl1OCAqYnVmID0geGZlci0+cnhfYnVmOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgeGZlci0+bGVuOyBpKyspIHsKKwkJcmV0ID0gcnNwaV9kYXRhX2luKHJzcGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSpidWYrKyA9IHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3BpX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApIHsKKwkJcmV0dXJuIHFzcGlfdHJhbnNmZXJfb3V0X2luKHJzcGksIHhmZXIpOworCX0gZWxzZSBpZiAoeGZlci0+dHhfYnVmICYmIHhmZXItPnR4X25iaXRzID4gU1BJX05CSVRTX1NJTkdMRSkgeworCQkvKiBRdWFkIG9yIER1YWwgU1BJIFdyaXRlICovCisJCXJldHVybiBxc3BpX3RyYW5zZmVyX291dChyc3BpLCB4ZmVyKTsKKwl9IGVsc2UgaWYgKHhmZXItPnJ4X2J1ZiAmJiB4ZmVyLT5yeF9uYml0cyA+IFNQSV9OQklUU19TSU5HTEUpIHsKKwkJLyogUXVhZCBvciBEdWFsIFNQSSBSZWFkICovCisJCXJldHVybiBxc3BpX3RyYW5zZmVyX2luKHJzcGksIHhmZXIpOworCX0gZWxzZSB7CisJCS8qIFNpbmdsZSBTUEkgVHJhbnNmZXIgKi8KKwkJcmV0dXJuIHFzcGlfdHJhbnNmZXJfb3V0X2luKHJzcGksIHhmZXIpOworCX0KIH0KIAogc3RhdGljIGludCByc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC04MTAsMzIgKzg4NiwxMTUgQEAKIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCiAJCXJzcGktPnNwY21kIHw9IFNQQ01EX0NQSEE7CiAKKwkvKiBDTU9TIG91dHB1dCBtb2RlIGFuZCBNT1NJIHNpZ25hbCBmcm9tIHByZXZpb3VzIHRyYW5zZmVyICovCisJcnNwaS0+c3BwY3IgPSAwOworCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKKwkJcnNwaS0+c3BwY3IgfD0gU1BQQ1JfU1BMUDsKKwogCXNldF9jb25maWdfcmVnaXN0ZXIocnNwaSwgOCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZykKK3N0YXRpYyB1MTYgcXNwaV90cmFuc2Zlcl9tb2RlKGNvbnN0IHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltZXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQltZXNnLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm1lc2ctPnF1ZXVlLCAmcnNwaS0+cXVldWUpOwotCXNjaGVkdWxlX3dvcmsoJnJzcGktPndzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3BpLT5sb2NrLCBmbGFncyk7CisJaWYgKHhmZXItPnR4X2J1ZikKKwkJc3dpdGNoICh4ZmVyLT50eF9uYml0cykgeworCQljYXNlIFNQSV9OQklUU19RVUFEOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9RVUFEOworCQljYXNlIFNQSV9OQklUU19EVUFMOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9EVUFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoeGZlci0+cnhfYnVmKQorCQlzd2l0Y2ggKHhmZXItPnJ4X25iaXRzKSB7CisJCWNhc2UgU1BJX05CSVRTX1FVQUQ6CisJCQlyZXR1cm4gU1BDTURfU1BJTU9EX1FVQUQgfCBTUENNRF9TUFJXOworCQljYXNlIFNQSV9OQklUU19EVUFMOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9EVUFMIHwgU1BDTURfU1BSVzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnNwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgaW50IHFzcGlfc2V0dXBfc2VxdWVuY2VyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCisJCQkJY29uc3Qgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CisJY29uc3Qgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwl1bnNpZ25lZCBpbnQgaSA9IDAsIGxlbiA9IDA7CisJdTE2IGN1cnJlbnRfbW9kZSA9IDB4ZmZmZiwgbW9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCW1vZGUgPSBxc3BpX3RyYW5zZmVyX21vZGUoeGZlcik7CisJCWlmIChtb2RlID09IGN1cnJlbnRfbW9kZSkgeworCQkJbGVuICs9IHhmZXItPmxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVHJhbnNmZXIgbW9kZSBjaGFuZ2UgKi8KKwkJaWYgKGkpIHsKKwkJCS8qIFNldCB0cmFuc2ZlciBkYXRhIGxlbmd0aCBvZiBwcmV2aW91cyB0cmFuc2ZlciAqLworCQkJcnNwaV93cml0ZTMyKHJzcGksIGxlbiwgUVNQSV9TUEJNVUwoaSAtIDEpKTsKKwkJfQorCisJCWlmIChpID49IFFTUElfTlVNX1NQQ01EKSB7CisJCQlkZXZfZXJyKCZtc2ctPnNwaS0+ZGV2LAorCQkJCSJUb28gbWFueSBkaWZmZXJlbnQgdHJhbnNmZXIgbW9kZXMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogUHJvZ3JhbSB0cmFuc2ZlciBtb2RlIGZvciB0aGlzIHRyYW5zZmVyICovCisJCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCB8IG1vZGUsIFJTUElfU1BDTUQoaSkpOworCQljdXJyZW50X21vZGUgPSBtb2RlOworCQlsZW4gPSB4ZmVyLT5sZW47CisJCWkrKzsKKwl9CisJaWYgKGkpIHsKKwkJLyogU2V0IGZpbmFsIHRyYW5zZmVyIGRhdGEgbGVuZ3RoIGFuZCBzZXF1ZW5jZSBsZW5ndGggKi8KKwkJcnNwaV93cml0ZTMyKHJzcGksIGxlbiwgUVNQSV9TUEJNVUwoaSAtIDEpKTsKKwkJcnNwaV93cml0ZTgocnNwaSwgaSAtIDEsIFJTUElfU1BTQ1IpOworCX0KKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgcnNwaV9pcnEoaW50IGlycSwgdm9pZCAqX3NyKQorc3RhdGljIGludCByc3BpX3ByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCWlmIChtc2ctPnNwaS0+bW9kZSAmCisJICAgIChTUElfVFhfRFVBTCB8IFNQSV9UWF9RVUFEIHwgU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRCkpIHsKKwkJLyogU2V0dXAgc2VxdWVuY2VyIGZvciBtZXNzYWdlcyB3aXRoIG11bHRpcGxlIHRyYW5zZmVyIG1vZGVzICovCisJCXJldCA9IHFzcGlfc2V0dXBfc2VxdWVuY2VyKHJzcGksIG1zZyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBFbmFibGUgU1BJIGZ1bmN0aW9uIGluIG1hc3RlciBtb2RlICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpIHwgU1BDUl9TUEUsIFJTUElfU1BDUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNwaV91bnByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCS8qIERpc2FibGUgU1BJIGZ1bmN0aW9uICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfU1BFLCBSU1BJX1NQQ1IpOworCisJLyogUmVzZXQgc2VxdWVuY2VyIGZvciBTaW5nbGUgU1BJIFRyYW5zZmVycyAqLworCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCwgUlNQSV9TUENNRDApOworCXJzcGlfd3JpdGU4KHJzcGksIDAsIFJTUElfU1BTQ1IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcnNwaV9pcnFfbXV4KGludCBpcnEsIHZvaWQgKl9zcikKIHsKIAlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gX3NyOwogCXU4IHNwc3I7CkBAIC04NTcsNiArMTAxNiwzNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCByc3BpX2lycV9yeChpbnQgaXJxLCB2b2lkICpfc3IpCit7CisJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IF9zcjsKKwl1OCBzcHNyOworCisJcnNwaS0+c3BzciA9IHNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CisJaWYgKHNwc3IgJiBTUFNSX1NQUkYpIHsKKwkJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQUklFKTsKKwkJd2FrZV91cCgmcnNwaS0+d2FpdCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHJzcGlfaXJxX3R4KGludCBpcnEsIHZvaWQgKl9zcikKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gX3NyOworCXU4IHNwc3I7CisKKwlyc3BpLT5zcHNyID0gc3BzciA9IHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUFNSKTsKKwlpZiAoc3BzciAmIFNQU1JfU1BURUYpIHsKKwkJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQVElFKTsKKwkJd2FrZV91cCgmcnNwaS0+d2FpdCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCByc3BpX3JlcXVlc3RfZG1hKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCiAJCQkJICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTkyMywzNCArMTExMiw4OSBAQAogCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXJzcGlfcmVsZWFzZV9kbWEocnNwaSk7Ci0JY2xrX2Rpc2FibGUocnNwaS0+Y2xrKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfb3BzIHJzcGlfb3BzID0geworCS5zZXRfY29uZmlnX3JlZ2lzdGVyID0JCXJzcGlfc2V0X2NvbmZpZ19yZWdpc3RlciwKKwkudHJhbnNmZXJfb25lID0JCQlyc3BpX3RyYW5zZmVyX29uZSwKKwkubW9kZV9iaXRzID0JCQlTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0xPT1AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9vcHMgcnNwaV9yel9vcHMgPSB7CisJLnNldF9jb25maWdfcmVnaXN0ZXIgPQkJcnNwaV9yel9zZXRfY29uZmlnX3JlZ2lzdGVyLAorCS50cmFuc2Zlcl9vbmUgPQkJCXJzcGlfcnpfdHJhbnNmZXJfb25lLAorCS5tb2RlX2JpdHMgPQkJCVNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfTE9PUCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX29wcyBxc3BpX29wcyA9IHsKKwkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlxc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCisJLnRyYW5zZmVyX29uZSA9CQkJcXNwaV90cmFuc2Zlcl9vbmUsCisJLm1vZGVfYml0cyA9CQkJU1BJX0NQSEEgfCBTUElfQ1BPTCB8IFNQSV9MT09QIHwKKwkJCQkJU1BJX1RYX0RVQUwgfCBTUElfVFhfUVVBRCB8CisJCQkJCVNQSV9SWF9EVUFMIHwgU1BJX1JYX1FVQUQsCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByc3BpX29mX21hdGNoW10gPSB7CisJLyogUlNQSSBvbiBsZWdhY3kgU0ggKi8KKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNwaSIsIC5kYXRhID0gJnJzcGlfb3BzIH0sCisJLyogUlNQSSBvbiBSWi9BMUggKi8KKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNwaS1yeiIsIC5kYXRhID0gJnJzcGlfcnpfb3BzIH0sCisJLyogUVNQSSBvbiBSLUNhciBHZW4yICovCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHFzcGkiLCAuZGF0YSA9ICZxc3BpX29wcyB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnNwaV9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgcnNwaV9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJdTMyIG51bV9jczsKKwlpbnQgZXJyb3I7CisKKwkvKiBQYXJzZSBEVCBwcm9wZXJ0aWVzICovCisJZXJyb3IgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJudW0tY3MiLCAmbnVtX2NzKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJvZl9wcm9wZXJ0eV9yZWFkX3UzMiBudW0tY3MgZmFpbGVkICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbnVtX2NzOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcnNwaV9vZl9tYXRjaAlOVUxMCitzdGF0aWMgaW5saW5lIGludCByc3BpX3BhcnNlX2R0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKworc3RhdGljIGludCByc3BpX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycSwKKwkJCSAgICBpcnFfaGFuZGxlcl90IGhhbmRsZXIsIGNvbnN0IGNoYXIgKnN1ZmZpeCwKKwkJCSAgICB2b2lkICpkZXZfaWQpCit7CisJY29uc3QgY2hhciAqYmFzZSA9IGRldl9uYW1lKGRldik7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihiYXNlKSArIHN0cmxlbihzdWZmaXgpICsgMjsKKwljaGFyICpuYW1lID0gZGV2bV9remFsbG9jKGRldiwgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCXNucHJpbnRmKG5hbWUsIGxlbiwgIiVzOiVzIiwgYmFzZSwgc3VmZml4KTsKKwlyZXR1cm4gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgaGFuZGxlciwgMCwgbmFtZSwgZGV2X2lkKTsKK30KKwogc3RhdGljIGludCByc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpOwotCWludCByZXQsIGlycTsKLQljaGFyIGNsa19uYW1lWzE2XTsKLQljb25zdCBzdHJ1Y3QgcnNwaV9wbGF0X2RhdGEgKnJzcGlfcGQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJY29uc3Qgc3RydWN0IHJzcGlfcGxhdF9kYXRhICpyc3BpX3BkOwogCWNvbnN0IHN0cnVjdCBzcGlfb3BzICpvcHM7Ci0JY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWRfZW50cnkgPSBwZGV2LT5pZF9lbnRyeTsKLQotCW9wcyA9IChzdHJ1Y3Qgc3BpX29wcyAqKWlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKLQkvKiBvcHMgcGFyYW1ldGVyIGNoZWNrICovCi0JaWYgKCFvcHMtPnNldF9jb25maWdfcmVnaXN0ZXIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidGhlcmUgaXMgbm8gc2V0X2NvbmZpZ19yZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X2lycSBlcnJvclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCByc3BpX2RhdGEpKTsKIAlpZiAobWFzdGVyID09IE5VTEwpIHsKQEAgLTk1OCw2ICsxMjAyLDI4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHJzcGlfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCWlmIChvZl9pZCkgeworCQlvcHMgPSBvZl9pZC0+ZGF0YTsKKwkJcmV0ID0gcnNwaV9wYXJzZV9kdCgmcGRldi0+ZGV2LCBtYXN0ZXIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjE7CisJfSBlbHNlIHsKKwkJb3BzID0gKHN0cnVjdCBzcGlfb3BzICopcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOworCQlyc3BpX3BkID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwkJaWYgKHJzcGlfcGQgJiYgcnNwaV9wZC0+bnVtX2NoaXBzZWxlY3QpCisJCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcnNwaV9wZC0+bnVtX2NoaXBzZWxlY3Q7CisJCWVsc2UKKwkJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAyOyAvKiBkZWZhdWx0ICovCisJfTsKKworCS8qIG9wcyBwYXJhbWV0ZXIgY2hlY2sgKi8KKwlpZiAoIW9wcy0+c2V0X2NvbmZpZ19yZWdpc3RlcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0aGVyZSBpcyBubyBzZXRfY29uZmlnX3JlZ2lzdGVyXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjE7CisJfQorCiAJcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByc3BpKTsKIAlyc3BpLT5vcHMgPSBvcHM7CkBAIC05NzAsMzkgKzEyMzYsNjEgQEAKIAkJZ290byBlcnJvcjE7CiAJfQogCi0Jc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICIlcyVkIiwgaWRfZW50cnktPm5hbWUsIHBkZXYtPmlkKTsKLQlyc3BpLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgY2xrX25hbWUpOworCXJzcGktPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHJzcGktPmNsaykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGdldCBjbG9ja1xuIik7CiAJCXJldCA9IFBUUl9FUlIocnNwaS0+Y2xrKTsKIAkJZ290byBlcnJvcjE7CiAJfQotCWNsa19lbmFibGUocnNwaS0+Y2xrKTsKIAotCUlOSVRfTElTVF9IRUFEKCZyc3BpLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnJzcGktPmxvY2spOwotCUlOSVRfV09SSygmcnNwaS0+d3MsIHJzcGlfd29yayk7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyc3BpLT53YWl0KTsKIAotCWlmIChyc3BpX3BkICYmIHJzcGlfcGQtPm51bV9jaGlwc2VsZWN0KQotCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcnNwaV9wZC0+bnVtX2NoaXBzZWxlY3Q7Ci0JZWxzZQotCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMjsgLyogZGVmYXVsdCAqLwotCiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJbWFzdGVyLT5zZXR1cCA9IHJzcGlfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2ZlciA9IHJzcGlfdHJhbnNmZXI7Ci0JbWFzdGVyLT5jbGVhbnVwID0gcnNwaV9jbGVhbnVwOwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQSEEgfCBTUElfQ1BPTDsKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBvcHMtPnRyYW5zZmVyX29uZTsKKwltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHJzcGlfcHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+dW5wcmVwYXJlX21lc3NhZ2UgPSByc3BpX3VucHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+bW9kZV9iaXRzID0gb3BzLT5tb2RlX2JpdHM7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIHJzcGlfaXJxLCAwLAotCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCByc3BpKTsKKwlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAicngiKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAibXV4Iik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcnNwaS0+cnhfaXJxID0gcnNwaS0+dHhfaXJxID0gcmV0OworCX0gZWxzZSB7CisJCXJzcGktPnJ4X2lycSA9IHJldDsKKwkJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInR4Iik7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJzcGktPnR4X2lycSA9IHJldDsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X2lycSBlcnJvclxuIik7CisJCWdvdG8gZXJyb3IyOworCX0KKworCWlmIChyc3BpLT5yeF9pcnEgPT0gcnNwaS0+dHhfaXJxKSB7CisJCS8qIFNpbmdsZSBtdWx0aXBsZXhlZCBpbnRlcnJ1cHQgKi8KKwkJcmV0ID0gcnNwaV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByc3BpLT5yeF9pcnEsIHJzcGlfaXJxX211eCwKKwkJCQkgICAgICAgIm11eCIsIHJzcGkpOworCX0gZWxzZSB7CisJCS8qIE11bHRpLWludGVycnVwdCBtb2RlLCBvbmx5IFNQUkkgYW5kIFNQVEkgYXJlIHVzZWQgKi8KKwkJcmV0ID0gcnNwaV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByc3BpLT5yeF9pcnEsIHJzcGlfaXJxX3J4LAorCQkJCSAgICAgICAicngiLCByc3BpKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByc3BpX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHJzcGktPnR4X2lycSwKKwkJCQkJICAgICAgIHJzcGlfaXJxX3R4LCAidHgiLCByc3BpKTsKKwl9CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZXJyb3JcbiIpOwogCQlnb3RvIGVycm9yMjsKIAl9CiAKLQlyc3BpLT5pcnEgPSBpcnE7CiAJcmV0ID0gcnNwaV9yZXF1ZXN0X2RtYShyc3BpLCBwZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyc3BpX3JlcXVlc3RfZG1hIGZhaWxlZC5cbiIpOwpAQCAtMTAyMiwyNyArMTMxMCwxNiBAQAogZXJyb3IzOgogCXJzcGlfcmVsZWFzZV9kbWEocnNwaSk7CiBlcnJvcjI6Ci0JY2xrX2Rpc2FibGUocnNwaS0+Y2xrKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiBlcnJvcjE6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BpX29wcyByc3BpX29wcyA9IHsKLQkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlyc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCi0JLnNlbmRfcGlvID0JCQlyc3BpX3NlbmRfcGlvLAotCS5yZWNlaXZlX3BpbyA9CQkJcnNwaV9yZWNlaXZlX3BpbywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX29wcyBxc3BpX29wcyA9IHsKLQkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlxc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCi0JLnNlbmRfcGlvID0JCQlxc3BpX3NlbmRfcGlvLAotCS5yZWNlaXZlX3BpbyA9CQkJcXNwaV9yZWNlaXZlX3BpbywKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHNwaV9kcml2ZXJfaWRzW10gPSB7CiAJeyAicnNwaSIsCShrZXJuZWxfdWxvbmdfdCkmcnNwaV9vcHMgfSwKKwl7ICJyc3BpLXJ6IiwJKGtlcm5lbF91bG9uZ190KSZyc3BpX3J6X29wcyB9LAogCXsgInFzcGkiLAkoa2VybmVsX3Vsb25nX3QpJnFzcGlfb3BzIH0sCiAJe30sCiB9OwpAQCAtMTA1Niw2ICsxMzMzLDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUgPSAicmVuZXNhc19zcGkiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHJzcGlfb2ZfbWF0Y2gpLAogCX0sCiB9OwogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyc3BpX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYwppbmRleCA3NDY0MjRhLi5iZWQyMzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LmMKQEAgLTksNyArOSw2IEBACiAgKgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMTIzLDI1ICsxMjIsMTUgQEAKIHsKIAlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKIAlzdHJ1Y3QgczNjMjR4eF9zcGlfZGV2c3RhdGUgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXVuc2lnbmVkIGludCBicHc7CiAJdW5zaWduZWQgaW50IGh6OwogCXVuc2lnbmVkIGludCBkaXY7CiAJdW5zaWduZWQgbG9uZyBjbGs7CiAKLQlicHcgPSB0ID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKIAloeiAgPSB0ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKIAotCWlmICghYnB3KQotCQlicHcgPSA4OwotCiAJaWYgKCFoeikKIAkJaHogPSBzcGktPm1heF9zcGVlZF9oejsKIAotCWlmIChicHcgIT0gOCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgYml0cy1wZXItd29yZCAoJWQpXG4iLCBicHcpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAoc3BpLT5tb2RlICE9IGNzLT5tb2RlKSB7CiAJCXU4IHNwY29uID0gU1BDT05fREVGQVVMVCB8IFMzQzI0MTBfU1BDT05fRU5TQ0s7CiAKQEAgLTU0NCw2ICs1MzMsNyBAQAogCiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IGh3LT5wZGF0YS0+bnVtX2NzOwogCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlIGZvciB0aGUgYml0YmFuZyBkcml2ZXIgKi8KIApAQCAtNjQzLDYgKzYzMywxMSBAQAogc3RhdGljIGludCBzM2MyNHh4X3NwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9tYXN0ZXJfc3VzcGVuZChody0+bWFzdGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGh3LT5wZGF0YSAmJiBody0+cGRhdGEtPmdwaW9fc2V0dXApCiAJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDApOwpAQCAtNjU2LDcgKzY1MSw3IEBACiAJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKGh3KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3BpX21hc3Rlcl9yZXN1bWUoaHctPm1hc3Rlcik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzM2MyNHh4X3NwaV9wbW9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMgYi9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCmluZGV4IGFlOTA3ZGQuLmYxOWNkOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYwpAQCAtMzQsMTAgKzM0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaD4KIAotI2lmZGVmIENPTkZJR19TM0NfRE1BCi0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNlbmRpZgotCiAjZGVmaW5lIE1BWF9TUElfUE9SVFMJCTMKICNkZWZpbmUgUzNDNjRYWF9TUElfUVVJUktfUE9MTAkJKDEgPDwgMCkKIApAQCAtMjAwLDkgKzE5Niw2IEBACiAJdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3BlZWQ7CiAJc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhCXJ4X2RtYTsKIAlzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEJdHhfZG1hOwotI2lmZGVmIENPTkZJR19TM0NfRE1BCi0Jc3RydWN0IHNhbXN1bmdfZG1hX29wcwkJKm9wczsKLSNlbmRpZgogCXN0cnVjdCBzM2M2NHh4X3NwaV9wb3J0X2NvbmZpZwkqcG9ydF9jb25mOwogCXVuc2lnbmVkIGludAkJCXBvcnRfaWQ7CiAJYm9vbAkJCQljc19ncGlvOwpAQCAtMjg0LDEwNCArMjc3LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKIH0KIAotI2lmZGVmIENPTkZJR19TM0NfRE1BCi0vKiBGSVhNRTogcmVtb3ZlIHRoaXMgc2VjdGlvbiBvbmNlIGFyY2gvYXJtL21hY2gtczNjNjR4eCB1c2VzIGRtYWVuZ2luZSAqLwotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCBzM2M2NHh4X3NwaV9kbWFfY2xpZW50ID0gewotCS5uYW1lID0gInNhbXN1bmctc3BpLWRtYSIsCi19OwotCiBzdGF0aWMgdm9pZCBwcmVwYXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSwKLQkJCQkJdW5zaWduZWQgbGVuLCBkbWFfYWRkcl90IGJ1ZikKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKLQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcHJlcCBpbmZvOwotCXN0cnVjdCBzYW1zdW5nX2RtYV9jb25maWcgY29uZmlnOwotCi0JaWYgKGRtYS0+ZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKSB7Ci0JCXNkZCA9IGNvbnRhaW5lcl9vZigodm9pZCAqKWRtYSwKLQkJCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSwgcnhfZG1hKTsKLQkJY29uZmlnLmRpcmVjdGlvbiA9IHNkZC0+cnhfZG1hLmRpcmVjdGlvbjsKLQkJY29uZmlnLmZpZm8gPSBzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1JYX0RBVEE7Ci0JCWNvbmZpZy53aWR0aCA9IHNkZC0+Y3VyX2JwdyAvIDg7Ci0JCXNkZC0+b3BzLT5jb25maWcoKGVudW0gZG1hX2NoKXNkZC0+cnhfZG1hLmNoLCAmY29uZmlnKTsKLQl9IGVsc2UgewotCQlzZGQgPSBjb250YWluZXJfb2YoKHZvaWQgKilkbWEsCi0JCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHR4X2RtYSk7Ci0JCWNvbmZpZy5kaXJlY3Rpb24gPSAgc2RkLT50eF9kbWEuZGlyZWN0aW9uOwotCQljb25maWcuZmlmbyA9IHNkZC0+c2ZyX3N0YXJ0ICsgUzNDNjRYWF9TUElfVFhfREFUQTsKLQkJY29uZmlnLndpZHRoID0gc2RkLT5jdXJfYnB3IC8gODsKLQkJc2RkLT5vcHMtPmNvbmZpZygoZW51bSBkbWFfY2gpc2RkLT50eF9kbWEuY2gsICZjb25maWcpOwotCX0KLQotCWluZm8uY2FwID0gRE1BX1NMQVZFOwotCWluZm8ubGVuID0gbGVuOwotCWluZm8uZnAgPSBzM2M2NHh4X3NwaV9kbWFjYjsKLQlpbmZvLmZwX3BhcmFtID0gZG1hOwotCWluZm8uZGlyZWN0aW9uID0gZG1hLT5kaXJlY3Rpb247Ci0JaW5mby5idWYgPSBidWY7Ci0KLQlzZGQtPm9wcy0+cHJlcGFyZSgoZW51bSBkbWFfY2gpZG1hLT5jaCwgJmluZm8pOwotCXNkZC0+b3BzLT50cmlnZ2VyKChlbnVtIGRtYV9jaClkbWEtPmNoKTsKLX0KLQotc3RhdGljIGludCBhY3F1aXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCkKLXsKLQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcmVxIHJlcTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2RkLT5wZGV2LT5kZXY7Ci0KLQlzZGQtPm9wcyA9IHNhbXN1bmdfZG1hX2dldF9vcHMoKTsKLQotCXJlcS5jYXAgPSBETUFfU0xBVkU7Ci0JcmVxLmNsaWVudCA9ICZzM2M2NHh4X3NwaV9kbWFfY2xpZW50OwotCi0Jc2RkLT5yeF9kbWEuY2ggPSAoc3RydWN0IGRtYV9jaGFuICopKHVuc2lnbmVkIGxvbmcpc2RkLT5vcHMtPnJlcXVlc3QoCi0JCQkJCXNkZC0+cnhfZG1hLmRtYWNoLCAmcmVxLCBkZXYsICJyeCIpOwotCXNkZC0+dHhfZG1hLmNoID0gKHN0cnVjdCBkbWFfY2hhbiAqKSh1bnNpZ25lZCBsb25nKXNkZC0+b3BzLT5yZXF1ZXN0KAotCQkJCQlzZGQtPnR4X2RtYS5kbWFjaCwgJnJlcSwgZGV2LCAidHgiKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX3ByZXBhcmVfdHJhbnNmZXIoc3RydWN0IHNwaV9tYXN0ZXIgKnNwaSkKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpKTsKLQotCS8qCi0JICogSWYgRE1BIHJlc291cmNlIHdhcyBub3QgYXZhaWxhYmxlIGR1cmluZwotCSAqIHByb2JlLCBubyBuZWVkIHRvIGNvbnRpbnVlIHdpdGggZG1hIHJlcXVlc3RzCi0JICogZWxzZSBBY3F1aXJlIERNQSBjaGFubmVscwotCSAqLwotCXdoaWxlICghaXNfcG9sbGluZyhzZGQpICYmICFhY3F1aXJlX2RtYShzZGQpKQotCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX3VucHJlcGFyZV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGkpOwotCi0JLyogRnJlZSBETUEgY2hhbm5lbHMgKi8KLQlpZiAoIWlzX3BvbGxpbmcoc2RkKSkgewotCQlzZGQtPm9wcy0+cmVsZWFzZSgoZW51bSBkbWFfY2gpc2RkLT5yeF9kbWEuY2gsCi0JCQkJCSZzM2M2NHh4X3NwaV9kbWFfY2xpZW50KTsKLQkJc2RkLT5vcHMtPnJlbGVhc2UoKGVudW0gZG1hX2NoKXNkZC0+dHhfZG1hLmNoLAotCQkJCQkmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX2RtYV9zdG9wKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCSBzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSkKLXsKLQlzZGQtPm9wcy0+c3RvcCgoZW51bSBkbWFfY2gpZG1hLT5jaCk7Ci19Ci0jZWxzZQotCi1zdGF0aWMgdm9pZCBwcmVwYXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSwKLQkJCQkJdW5zaWduZWQgbGVuLCBkbWFfYWRkcl90IGJ1ZikKKwkJCXN0cnVjdCBzZ190YWJsZSAqc2d0KQogewogCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkOwogCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNvbmZpZzsKQEAgLTQwNyw4ICszMDQsOCBAQAogCQlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGRtYS0+Y2gsICZjb25maWcpOwogCX0KIAotCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoZG1hLT5jaCwgYnVmLCBsZW4sCi0JCQkJCWRtYS0+ZGlyZWN0aW9uLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zZyhkbWEtPmNoLCBzZ3QtPnNnbCwgc2d0LT5uZW50cywKKwkJCQkgICAgICAgZG1hLT5kaXJlY3Rpb24sIERNQV9QUkVQX0lOVEVSUlVQVCk7CiAKIAlkZXNjLT5jYWxsYmFjayA9IHMzYzY0eHhfc3BpX2RtYWNiOwogCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gZG1hOwpAQCAtNDM3LDYgKzMzNCw3IEBACiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIG91dDsKIAkJfQorCQlzcGktPmRtYV9yeCA9IHNkZC0+cnhfZG1hLmNoOwogCiAJCXNkZC0+dHhfZG1hLmNoID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbF9jb21wYXQobWFzaywgZmlsdGVyLAogCQkJCSAgICh2b2lkICopc2RkLT50eF9kbWEuZG1hY2gsIGRldiwgInR4Iik7CkBAIC00NDUsNiArMzQzLDcgQEAKIAkJCXJldCA9IC1FQlVTWTsKIAkJCWdvdG8gb3V0X3J4OwogCQl9CisJCXNwaS0+ZG1hX3R4ID0gc2RkLT50eF9kbWEuY2g7CiAJfQogCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmc2RkLT5wZGV2LT5kZXYpOwpAQCAtNDc3LDEyICszNzYsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfZG1hX3N0b3Aoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJIHN0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YSAqZG1hKQorc3RhdGljIGJvb2wgczNjNjR4eF9zcGlfY2FuX2RtYShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChkbWEtPmNoKTsKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXJldHVybiB4ZmVyLT5sZW4gPiAoRklGT19MVkxfTUFTSyhzZGQpID4+IDEpICsgMTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBlbmFibGVfZGF0YXBhdGgoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCiAJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKQEAgLTUxNSw3ICs0MTYsNyBAQAogCQljaGNmZyB8PSBTM0M2NFhYX1NQSV9DSF9UWENIX09OOwogCQlpZiAoZG1hX21vZGUpIHsKIAkJCW1vZGVjZmcgfD0gUzNDNjRYWF9TUElfTU9ERV9UWERNQV9PTjsKLQkJCXByZXBhcmVfZG1hKCZzZGQtPnR4X2RtYSwgeGZlci0+bGVuLCB4ZmVyLT50eF9kbWEpOworCQkJcHJlcGFyZV9kbWEoJnNkZC0+dHhfZG1hLCAmeGZlci0+dHhfc2cpOwogCQl9IGVsc2UgewogCQkJc3dpdGNoIChzZGQtPmN1cl9icHcpIHsKIAkJCWNhc2UgMzI6CkBAIC01NDcsNyArNDQ4LDcgQEAKIAkJCXdyaXRlbCgoKHhmZXItPmxlbiAqIDggLyBzZGQtPmN1cl9icHcpICYgMHhmZmZmKQogCQkJCQl8IFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlRfRU4sCiAJCQkJCXJlZ3MgKyBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UKTsKLQkJCXByZXBhcmVfZG1hKCZzZGQtPnJ4X2RtYSwgeGZlci0+bGVuLCB4ZmVyLT5yeF9kbWEpOworCQkJcHJlcGFyZV9kbWEoJnNkZC0+cnhfZG1hLCAmeGZlci0+cnhfc2cpOwogCQl9CiAJfQogCkBAIC01NTUsMjMgKzQ1Niw2IEBACiAJd3JpdGVsKGNoY2ZnLCByZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9jcyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKLQkJCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaWYgKHNkZC0+dGdsX3NwaSAhPSBOVUxMKSB7IC8qIElmIGxhc3QgZGV2aWNlIHRvZ2dsZWQgYWZ0ZXIgbXNzZyAqLwotCQlpZiAoc2RkLT50Z2xfc3BpICE9IHNwaSkgeyAvKiBpZiBsYXN0IG1zc2cgb24gZGlmZiBkZXZpY2UgKi8KLQkJCS8qIERlc2VsZWN0IHRoZSBsYXN0IHRvZ2dsZWQgZGV2aWNlICovCi0JCQlpZiAoc3BpLT5jc19ncGlvID49IDApCi0JCQkJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLAotCQkJCQlzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDAgOiAxKTsKLQkJfQotCQlzZGQtPnRnbF9zcGkgPSBOVUxMOwotCX0KLQotCWlmIChzcGktPmNzX2dwaW8gPj0gMCkKLQkJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDEgOiAwKTsKLX0KLQogc3RhdGljIHUzMiBzM2M2NHh4X3NwaV93YWl0X2Zvcl90aW1lb3V0KHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAogCQkJCQlpbnQgdGltZW91dF9tcykKIHsKQEAgLTU5MywxMTIgKzQ3NywxMTEgQEAKIAlyZXR1cm4gUlhfRklGT19MVkwoc3RhdHVzLCBzZGQpOwogfQogCi1zdGF0aWMgaW50IHdhaXRfZm9yX3hmZXIoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciwgaW50IGRtYV9tb2RlKQorc3RhdGljIGludCB3YWl0X2Zvcl9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCisJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwl1MzIgc3RhdHVzOwogCWludCBtczsKIAogCS8qIG1pbGxpc2VjcyB0byB4ZmVyICdsZW4nIGJ5dGVzIEAgJ2N1cl9zcGVlZCcgKi8KIAltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8gc2RkLT5jdXJfc3BlZWQ7CiAJbXMgKz0gMTA7IC8qIHNvbWUgdG9sZXJhbmNlICovCiAKLQlpZiAoZG1hX21vZGUpIHsKLQkJdmFsID0gbXNlY3NfdG9famlmZmllcyhtcykgKyAxMDsKLQkJdmFsID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzZGQtPnhmZXJfY29tcGxldGlvbiwgdmFsKTsKLQl9IGVsc2UgewotCQl1MzIgc3RhdHVzOwotCQl2YWwgPSBtc2Vjc190b19sb29wcyhtcyk7Ci0JCWRvIHsKKwl2YWwgPSBtc2Vjc190b19qaWZmaWVzKG1zKSArIDEwOworCXZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2RkLT54ZmVyX2NvbXBsZXRpb24sIHZhbCk7CisKKwkvKgorCSAqIElmIHRoZSBwcmV2aW91cyB4ZmVyIHdhcyBjb21wbGV0ZWQgd2l0aGluIHRpbWVvdXQsIHRoZW4KKwkgKiBwcm9jZWVkIGZ1cnRoZXIgZWxzZSByZXR1cm4gLUVJTy4KKwkgKiBEbWFUeCByZXR1cm5zIGFmdGVyIHNpbXBseSB3cml0aW5nIGRhdGEgaW4gdGhlIEZJRk8sCisJICogdy9vIHdhaXRpbmcgZm9yIHJlYWwgdHJhbnNtaXNzaW9uIG9uIHRoZSBidXMgdG8gZmluaXNoLgorCSAqIERtYVJ4IHJldHVybnMgb25seSBhZnRlciBEbWEgcmVhZCBkYXRhIGZyb20gRklGTyB3aGljaAorCSAqIG5lZWRzIGJ1cyB0cmFuc21pc3Npb24gdG8gZmluaXNoLCBzbyB3ZSBkb24ndCB3b3JyeSBpZgorCSAqIFhmZXIgaW52b2x2ZWQgUngod2l0aCBvciB3aXRob3V0IFR4KS4KKwkgKi8KKwlpZiAodmFsICYmICF4ZmVyLT5yeF9idWYpIHsKKwkJdmFsID0gbXNlY3NfdG9fbG9vcHMoMTApOworCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKKwkJd2hpbGUgKChUWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkKKwkJCXx8ICFTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHN0YXR1cywgc2RkKSkKKwkJICAgICAgICYmIC0tdmFsKSB7CisJCQljcHVfcmVsYXgoKTsKIAkJCXN0YXR1cyA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9TVEFUVVMpOwotCQl9IHdoaWxlIChSWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkgPCB4ZmVyLT5sZW4gJiYgLS12YWwpOwotCX0KLQotCWlmIChkbWFfbW9kZSkgewotCQl1MzIgc3RhdHVzOwotCi0JCS8qCi0JCSAqIElmIHRoZSBwcmV2aW91cyB4ZmVyIHdhcyBjb21wbGV0ZWQgd2l0aGluIHRpbWVvdXQsIHRoZW4KLQkJICogcHJvY2VlZCBmdXJ0aGVyIGVsc2UgcmV0dXJuIC1FSU8uCi0JCSAqIERtYVR4IHJldHVybnMgYWZ0ZXIgc2ltcGx5IHdyaXRpbmcgZGF0YSBpbiB0aGUgRklGTywKLQkJICogdy9vIHdhaXRpbmcgZm9yIHJlYWwgdHJhbnNtaXNzaW9uIG9uIHRoZSBidXMgdG8gZmluaXNoLgotCQkgKiBEbWFSeCByZXR1cm5zIG9ubHkgYWZ0ZXIgRG1hIHJlYWQgZGF0YSBmcm9tIEZJRk8gd2hpY2gKLQkJICogbmVlZHMgYnVzIHRyYW5zbWlzc2lvbiB0byBmaW5pc2gsIHNvIHdlIGRvbid0IHdvcnJ5IGlmCi0JCSAqIFhmZXIgaW52b2x2ZWQgUngod2l0aCBvciB3aXRob3V0IFR4KS4KLQkJICovCi0JCWlmICh2YWwgJiYgIXhmZXItPnJ4X2J1ZikgewotCQkJdmFsID0gbXNlY3NfdG9fbG9vcHMoMTApOwotCQkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7Ci0JCQl3aGlsZSAoKFRYX0ZJRk9fTFZMKHN0YXR1cywgc2RkKQotCQkJCXx8ICFTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHN0YXR1cywgc2RkKSkKLQkJCQkJJiYgLS12YWwpIHsKLQkJCQljcHVfcmVsYXgoKTsKLQkJCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKLQkJCX0KLQogCQl9CiAKLQkJLyogSWYgdGltZWQgb3V0IHdoaWxlIGNoZWNraW5nIHJ4L3R4IHN0YXR1cyByZXR1cm4gZXJyb3IgKi8KLQkJaWYgKCF2YWwpCi0JCQlyZXR1cm4gLUVJTzsKLQl9IGVsc2UgewotCQlpbnQgbG9vcHM7Ci0JCXUzMiBjcHlfbGVuOwotCQl1OCAqYnVmOwotCi0JCS8qIElmIGl0IHdhcyBvbmx5IFR4ICovCi0JCWlmICgheGZlci0+cnhfYnVmKSB7Ci0JCQlzZGQtPnN0YXRlICY9IH5UWEJVU1k7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSByZWNlaXZlIGxlbmd0aCBpcyBiaWdnZXIgdGhhbiB0aGUgY29udHJvbGxlciBmaWZvCi0JCSAqIHNpemUsIGNhbGN1bGF0ZSB0aGUgbG9vcHMgYW5kIHJlYWQgdGhlIGZpZm8gYXMgbWFueSB0aW1lcy4KLQkJICogbG9vcHMgPSBsZW5ndGggLyBtYXggZmlmbyBzaXplIChjYWxjdWxhdGVkIGJ5IHVzaW5nIHRoZQotCQkgKiBmaWZvIG1hc2spLgotCQkgKiBGb3IgYW55IHNpemUgbGVzcyB0aGFuIHRoZSBmaWZvIHNpemUgdGhlIGJlbG93IGNvZGUgaXMKLQkJICogZXhlY3V0ZWQgYXRsZWFzdCBvbmNlLgotCQkgKi8KLQkJbG9vcHMgPSB4ZmVyLT5sZW4gLyAoKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDEpOwotCQlidWYgPSB4ZmVyLT5yeF9idWY7Ci0JCWRvIHsKLQkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjZWl2ZWQgaW4gdGhlIGZpZm8gKi8KLQkJCWNweV9sZW4gPSBzM2M2NHh4X3NwaV93YWl0X2Zvcl90aW1lb3V0KHNkZCwKLQkJCQkJCShsb29wcyA/IG1zIDogMCkpOwotCi0JCQlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgewotCQkJY2FzZSAzMjoKLQkJCQlpb3JlYWQzMl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCi0JCQkJCWJ1ZiwgY3B5X2xlbiAvIDQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlpb3JlYWQxNl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCi0JCQkJCWJ1ZiwgY3B5X2xlbiAvIDIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpb3JlYWQ4X3JlcChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSwKLQkJCQkJYnVmLCBjcHlfbGVuKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJYnVmID0gYnVmICsgY3B5X2xlbjsKLQkJfSB3aGlsZSAobG9vcHMtLSk7Ci0JCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKIAl9CiAKKwkvKiBJZiB0aW1lZCBvdXQgd2hpbGUgY2hlY2tpbmcgcngvdHggc3RhdHVzIHJldHVybiBlcnJvciAqLworCWlmICghdmFsKQorCQlyZXR1cm4gLUVJTzsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9jcyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKLQkJCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgaW50IHdhaXRfZm9yX3BpbyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKKwkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0JaWYgKHNkZC0+dGdsX3NwaSA9PSBzcGkpCi0JCXNkZC0+dGdsX3NwaSA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gc2RkLT5yZWdzOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXUzMiBzdGF0dXM7CisJaW50IGxvb3BzOworCXUzMiBjcHlfbGVuOworCXU4ICpidWY7CisJaW50IG1zOwogCi0JaWYgKHNwaS0+Y3NfZ3BpbyA+PSAwKQotCQlncGlvX3NldF92YWx1ZShzcGktPmNzX2dwaW8sIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMCA6IDEpOworCS8qIG1pbGxpc2VjcyB0byB4ZmVyICdsZW4nIGJ5dGVzIEAgJ2N1cl9zcGVlZCcgKi8KKwltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8gc2RkLT5jdXJfc3BlZWQ7CisJbXMgKz0gMTA7IC8qIHNvbWUgdG9sZXJhbmNlICovCisKKwl2YWwgPSBtc2Vjc190b19sb29wcyhtcyk7CisJZG8geworCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKKwl9IHdoaWxlIChSWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkgPCB4ZmVyLT5sZW4gJiYgLS12YWwpOworCisKKwkvKiBJZiBpdCB3YXMgb25seSBUeCAqLworCWlmICgheGZlci0+cnhfYnVmKSB7CisJCXNkZC0+c3RhdGUgJj0gflRYQlVTWTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcmVjZWl2ZSBsZW5ndGggaXMgYmlnZ2VyIHRoYW4gdGhlIGNvbnRyb2xsZXIgZmlmbworCSAqIHNpemUsIGNhbGN1bGF0ZSB0aGUgbG9vcHMgYW5kIHJlYWQgdGhlIGZpZm8gYXMgbWFueSB0aW1lcy4KKwkgKiBsb29wcyA9IGxlbmd0aCAvIG1heCBmaWZvIHNpemUgKGNhbGN1bGF0ZWQgYnkgdXNpbmcgdGhlCisJICogZmlmbyBtYXNrKS4KKwkgKiBGb3IgYW55IHNpemUgbGVzcyB0aGFuIHRoZSBmaWZvIHNpemUgdGhlIGJlbG93IGNvZGUgaXMKKwkgKiBleGVjdXRlZCBhdGxlYXN0IG9uY2UuCisJICovCisJbG9vcHMgPSB4ZmVyLT5sZW4gLyAoKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDEpOworCWJ1ZiA9IHhmZXItPnJ4X2J1ZjsKKwlkbyB7CisJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjZWl2ZWQgaW4gdGhlIGZpZm8gKi8KKwkJY3B5X2xlbiA9IHMzYzY0eHhfc3BpX3dhaXRfZm9yX3RpbWVvdXQoc2RkLAorCQkJCQkJICAgICAgIChsb29wcyA/IG1zIDogMCkpOworCisJCXN3aXRjaCAoc2RkLT5jdXJfYnB3KSB7CisJCWNhc2UgMzI6CisJCQlpb3JlYWQzMl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCisJCQkJICAgICBidWYsIGNweV9sZW4gLyA0KTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJaW9yZWFkMTZfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAorCQkJCSAgICAgYnVmLCBjcHlfbGVuIC8gMik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlvcmVhZDhfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAorCQkJCSAgICBidWYsIGNweV9sZW4pOworCQkJYnJlYWs7CisJCX0KKworCQlidWYgPSBidWYgKyBjcHlfbGVuOworCX0gd2hpbGUgKGxvb3BzLS0pOworCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9jb25maWcoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCkBAIC03NzQsODEgKzY1Nyw2IEBACiAKICNkZWZpbmUgWEZFUl9ETUFBRERSX0lOVkFMSUQgRE1BX0JJVF9NQVNLKDMyKQogCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX21hcF9tc3NnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZC0+cGRldi0+ZGV2OwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7Ci0KLQlpZiAoaXNfcG9sbGluZyhzZGQpIHx8IG1zZy0+aXNfZG1hX21hcHBlZCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBGaXJzdCBtYXJrIGFsbCB4ZmVyIHVubWFwcGVkICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJeGZlci0+cnhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7Ci0JCXhmZXItPnR4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCX0KLQotCS8qIE1hcCB1bnRpbCBlbmQgb3IgZmlyc3QgZmFpbCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0KLQkJaWYgKHhmZXItPmxlbiA8PSAoKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDEpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKSB7Ci0JCQl4ZmVyLT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsCi0JCQkJCSh2b2lkICopeGZlci0+dHhfYnVmLCB4ZmVyLT5sZW4sCi0JCQkJCURNQV9UT19ERVZJQ0UpOwotCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgeGZlci0+dHhfZG1hKSkgewotCQkJCWRldl9lcnIoZGV2LCAiZG1hX21hcF9zaW5nbGUgVHggZmFpbGVkXG4iKTsKLQkJCQl4ZmVyLT50eF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCi0JCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkgewotCQkJeGZlci0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LCB4ZmVyLT5yeF9idWYsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0JCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCB4ZmVyLT5yeF9kbWEpKSB7Ci0JCQkJZGV2X2VycihkZXYsICJkbWFfbWFwX3NpbmdsZSBSeCBmYWlsZWRcbiIpOwotCQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT50eF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9UT19ERVZJQ0UpOwotCQkJCXhmZXItPnR4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCQkJCXhmZXItPnJ4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX3VubWFwX21zc2coc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2RkLT5wZGV2LT5kZXY7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQotCWlmIChpc19wb2xsaW5nKHNkZCkgfHwgbXNnLT5pc19kbWFfbWFwcGVkKQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCi0JCWlmICh4ZmVyLT5sZW4gPD0gKChGSUZPX0xWTF9NQVNLKHNkZCkgPj4gMSkgKyAxKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTAotCQkJCSYmIHhmZXItPnJ4X2RtYSAhPSBYRkVSX0RNQUFERFJfSU5WQUxJRCkKLQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT5yeF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMCi0JCQkJJiYgeGZlci0+dHhfZG1hICE9IFhGRVJfRE1BQUREUl9JTlZBTElEKQotCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHhmZXItPnR4X2RtYSwKLQkJCQkJCXhmZXItPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JfQotfQotCiBzdGF0aWMgaW50IHMzYzY0eHhfc3BpX3ByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAogCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKIHsKQEAgLTg2NiwxMyArNjc0LDYgQEAKIAkJczNjNjR4eF9zcGlfY29uZmlnKHNkZCk7CiAJfQogCi0JLyogTWFwIGFsbCB0aGUgdHJhbnNmZXJzIGlmIG5lZWRlZCAqLwotCWlmIChzM2M2NHh4X3NwaV9tYXBfbXNzZyhzZGQsIG1zZykpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkiWGZlcjogVW5hYmxlIHRvIG1hcCBtZXNzYWdlIGJ1ZmZlcnMhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJLyogQ29uZmlndXJlIGZlZWRiYWNrIGRlbGF5ICovCiAJd3JpdGVsKGNzLT5mYl9kZWxheSAmIDB4Mywgc2RkLT5yZWdzICsgUzNDNjRYWF9TUElfRkJfQ0xLKTsKIApAQCAtODk2LDEzICs2OTcsNiBAQAogCWJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQ7CiAJc3BlZWQgPSB4ZmVyLT5zcGVlZF9oeiA/IDogc3BpLT5tYXhfc3BlZWRfaHo7CiAKLQlpZiAoeGZlci0+bGVuICUgKGJwdyAvIDgpKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIlhmZXIgbGVuZ3RoKCV1KSBub3QgYSBtdWx0aXBsZSBvZiB3b3JkIHNpemUoJXUpXG4iLAotCQkJeGZlci0+bGVuLCBicHcgLyA4KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCiAJaWYgKGJwdyAhPSBzZGQtPmN1cl9icHcgfHwgc3BlZWQgIT0gc2RkLT5jdXJfc3BlZWQpIHsKIAkJc2RkLT5jdXJfYnB3ID0gYnB3OwogCQlzZGQtPmN1cl9zcGVlZCA9IHNwZWVkOwpAQCAtOTI5LDcgKzcyMywxMCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CiAKLQlzdGF0dXMgPSB3YWl0X2Zvcl94ZmVyKHNkZCwgeGZlciwgdXNlX2RtYSk7CisJaWYgKHVzZV9kbWEpCisJCXN0YXR1cyA9IHdhaXRfZm9yX2RtYShzZGQsIHhmZXIpOworCWVsc2UKKwkJc3RhdHVzID0gd2FpdF9mb3JfcGlvKHNkZCwgeGZlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiSS9PIEVycm9yOiByeC0lZCB0eC0lZCByZXM6cngtJWMgdHgtJWMgbGVuLSVkXG4iLApAQCAtOTQxLDEwICs3MzgsMTAgQEAKIAkJaWYgKHVzZV9kbWEpIHsKIAkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTAogCQkJICAgICYmIChzZGQtPnN0YXRlICYgVFhCVVNZKSkKLQkJCQlzM2M2NHh4X3NwaV9kbWFfc3RvcChzZGQsICZzZGQtPnR4X2RtYSk7CisJCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2RkLT50eF9kbWEuY2gpOwogCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMCiAJCQkgICAgJiYgKHNkZC0+c3RhdGUgJiBSWEJVU1kpKQotCQkJCXMzYzY0eHhfc3BpX2RtYV9zdG9wKHNkZCwgJnNkZC0+cnhfZG1hKTsKKwkJCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzZGQtPnJ4X2RtYS5jaCk7CiAJCX0KIAl9IGVsc2UgewogCQlmbHVzaF9maWZvKHNkZCk7CkBAIC05NTMsMTYgKzc1MCw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBzM2M2NHh4X3NwaV91bnByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAotCQkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQlzM2M2NHh4X3NwaV91bm1hcF9tc3NnKHNkZCwgbXNnKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHMzYzY0eHhfc3BpX2NzaW5mbyAqczNjNjR4eF9nZXRfc2xhdmVfY3RybGRhdGEoCiAJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTEwOTIsMTQgKzg3OSwxMiBAQAogCiAJcG1fcnVudGltZV9wdXQoJnNkZC0+cGRldi0+ZGV2KTsKIAl3cml0ZWwoUzNDNjRYWF9TUElfU0xBVkVfU0lHX0lOQUNULCBzZGQtPnJlZ3MgKyBTM0M2NFhYX1NQSV9TTEFWRV9TRUwpOwotCWRpc2FibGVfY3Moc2RkLCBzcGkpOwogCXJldHVybiAwOwogCiBzZXR1cF9leGl0OgogCXBtX3J1bnRpbWVfcHV0KCZzZGQtPnBkZXYtPmRldik7CiAJLyogc2V0dXAoKSByZXR1cm5zIHdpdGggZGV2aWNlIGRlLXNlbGVjdGVkICovCiAJd3JpdGVsKFMzQzY0WFhfU1BJX1NMQVZFX1NJR19JTkFDVCwgc2RkLT5yZWdzICsgUzNDNjRYWF9TUElfU0xBVkVfU0VMKTsKLQlkaXNhYmxlX2NzKHNkZCwgc3BpKTsKIAogCWdwaW9fZnJlZShjcy0+bGluZSk7CiAJc3BpX3NldF9jdGxkYXRhKHNwaSwgTlVMTCk7CkBAIC0xMzM4LDcgKzExMjMsNiBAQAogCW1hc3Rlci0+cHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSA9IHMzYzY0eHhfc3BpX3ByZXBhcmVfdHJhbnNmZXI7CiAJbWFzdGVyLT5wcmVwYXJlX21lc3NhZ2UgPSBzM2M2NHh4X3NwaV9wcmVwYXJlX21lc3NhZ2U7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzM2M2NHh4X3NwaV90cmFuc2Zlcl9vbmU7Ci0JbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSA9IHMzYzY0eHhfc3BpX3VucHJlcGFyZV9tZXNzYWdlOwogCW1hc3Rlci0+dW5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gczNjNjR4eF9zcGlfdW5wcmVwYXJlX3RyYW5zZmVyOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBzY2ktPm51bV9jczsKIAltYXN0ZXItPmRtYV9hbGlnbm1lbnQgPSA4OwpAQCAtMTM0Nyw2ICsxMTMxLDggQEAKIAkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisJaWYgKCFpc19wb2xsaW5nKHNkZCkpCisJCW1hc3Rlci0+Y2FuX2RtYSA9IHMzYzY0eHhfc3BpX2Nhbl9kbWE7CiAKIAlzZGQtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtX3Jlcyk7CiAJaWYgKElTX0VSUihzZGQtPnJlZ3MpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMgYi9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMKaW5kZXggMTIxYzJlMS4uMjM3ZjJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zYzE4aXM2MDIuYwpAQCAtMTgzLDE3ICsxODMsOSBAQAogc3RhdGljIGludCBzYzE4aXM2MDJfY2hlY2tfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgaW50IHRsZW4pCiB7Ci0JdWludDMyX3QgaHo7Ci0KIAlpZiAodCAmJiB0LT5sZW4gKyB0bGVuID4gU0MxOElTNjAyX0JVRlNJWikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCWlmICh0ICYmIHQtPnNwZWVkX2h6KQotCQloeiA9IHQtPnNwZWVkX2h6OwotCWlmIChoeiA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMDUsMjIgKzE5NywxNSBAQAogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQkvKiBTQzE4SVM2MDIgZG9lcyBub3Qgc3VwcG9ydCBDUzIgKi8KLQlpZiAoaHctPmlkID09IHNjMThpczYwMiAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDIpIHsKLQkJc3RhdHVzID0gLUVOWElPOwotCQlnb3RvIGVycm9yOwotCX0KLQogCWh3LT50bGVuID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJdTMyIGh6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwogCQlib29sIGRvX3RyYW5zZmVyOwogCiAJCXN0YXR1cyA9IHNjMThpczYwMl9jaGVja190cmFuc2ZlcihzcGksIHQsIGh3LT50bGVuKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKIAotCQlzdGF0dXMgPSBzYzE4aXM2MDJfc2V0dXBfdHJhbnNmZXIoaHcsIGh6LCBzcGktPm1vZGUpOworCQlzdGF0dXMgPSBzYzE4aXM2MDJfc2V0dXBfdHJhbnNmZXIoaHcsIHQtPnNwZWVkX2h6LCBzcGktPm1vZGUpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yMzgsNyArMjIzLDYgQEAKIAkJaWYgKHQtPmRlbGF5X3VzZWNzKQogCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKIAl9Ci1lcnJvcjoKIAltLT5zdGF0dXMgPSBzdGF0dXM7CiAJc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShtYXN0ZXIpOwogCkBAIC0yNDcsMTAgKzIzMSwxMyBAQAogCiBzdGF0aWMgaW50IHNjMThpczYwMl9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWlmIChzcGktPm1vZGUgJiB+KFNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfTFNCX0ZJUlNUKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IHNjMThpczYwMiAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCXJldHVybiBzYzE4aXM2MDJfY2hlY2tfdHJhbnNmZXIoc3BpLCBOVUxMLCAwKTsKKwkvKiBTQzE4SVM2MDIgZG9lcyBub3Qgc3VwcG9ydCBDUzIgKi8KKwlpZiAoaHctPmlkID09IHNjMThpczYwMiAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDIpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzYzE4aXM2MDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTMwOSw2ICsyOTYsOCBAQAogCW1hc3Rlci0+c2V0dXAgPSBzYzE4aXM2MDJfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHNjMThpczYwMl90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG5wOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gaHctPmZyZXEgLyAxMjg7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBody0+ZnJlcSAvIDQ7CiAKIAllcnJvciA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcihkZXYsIG1hc3Rlcik7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLWhzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1oc3BpLmMKaW5kZXggODJkMmY5Mi4uOTAwOTQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLWhzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2gtaHNwaS5jCkBAIC00Niw4ICs0Niw2IEBACiAvKiBTUFNSICovCiAjZGVmaW5lIFJYRkwJKDEgPDwgMikKIAotI2RlZmluZSBoc3BpMmluZm8oaCkJKGgtPmRldi0+cGxhdGZvcm1fZGF0YSkKLQogc3RydWN0IGhzcGlfcHJpdiB7CiAJdm9pZCBfX2lvbWVtICphZGRyOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CkBAIC0xMTMsMTQgKzExMSw5IEBACiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhzcGktPmRldjsKLQl1MzIgdGFyZ2V0X3JhdGU7CiAJdTMyIHNwY3IsIGlkaXZfY2xrOwogCXUzMiByYXRlLCBiZXN0X3JhdGUsIG1pbiwgdG1wOwogCi0JdGFyZ2V0X3JhdGUgPSB0ID8gdC0+c3BlZWRfaHogOiAwOwotCWlmICghdGFyZ2V0X3JhdGUpCi0JCXRhcmdldF9yYXRlID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0KIAkvKgogCSAqIGZpbmQgYmVzdCBJRElWL0NMS0N4IHNldHRpbmdzCiAJICovCkBAIC0xNDAsNyArMTMzLDcgQEAKIAkJcmF0ZSAvPSAoKChpZGl2X2NsayAmIDB4MUYpICsgMSkgKiAyKTsKIAogCQkvKiBzYXZlIGJlc3Qgc2V0dGluZ3MgKi8KLQkJdG1wID0gYWJzKHRhcmdldF9yYXRlIC0gcmF0ZSk7CisJCXRtcCA9IGFicyh0LT5zcGVlZF9oeiAtIHJhdGUpOwogCQlpZiAodG1wIDwgbWluKSB7CiAJCQltaW4gPSB0bXA7CiAJCQlzcGNyID0gaWRpdl9jbGs7CkBAIC0xNTMsNyArMTQ2LDcgQEAKIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCiAJCXNwY3IgfD0gMSA8PCA2OwogCi0JZGV2X2RiZyhkZXYsICJzcGVlZCAlZC8lZFxuIiwgdGFyZ2V0X3JhdGUsIGJlc3RfcmF0ZSk7CisJZGV2X2RiZyhkZXYsICJzcGVlZCAlZC8lZFxuIiwgdC0+c3BlZWRfaHosIGJlc3RfcmF0ZSk7CiAKIAloc3BpX3dyaXRlKGhzcGksIFNQQ1IsIHNwY3IpOwogCWhzcGlfd3JpdGUoaHNwaSwgU1BTUiwgMHgwKTsKQEAgLTIzMCwyOSArMjIzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGhzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgaHNwaV9wcml2ICpoc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaHNwaS0+ZGV2OwotCi0JaWYgKDggIT0gc3BpLT5iaXRzX3Blcl93b3JkKSB7Ci0JCWRldl9lcnIoZGV2LCAiYml0c19wZXJfd29yZCBzaG91bGQgYmUgOFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWRldl9kYmcoZGV2LCAiJXMgc2V0dXBcbiIsIHNwaS0+bW9kYWxpYXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhzcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBoc3BpX3ByaXYgKmhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoc3BpLT5kZXY7Ci0KLQlkZXZfZGJnKGRldiwgIiVzIGNsZWFudXBcbiIsIHNwaS0+bW9kYWxpYXMpOwotfQotCiBzdGF0aWMgaW50IGhzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTI5OCwyMiArMjY4LDIzIEBACiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QJPSAxOwogCW1hc3Rlci0+YnVzX251bQkJPSBwZGV2LT5pZDsKLQltYXN0ZXItPnNldHVwCQk9IGhzcGlfc2V0dXA7Ci0JbWFzdGVyLT5jbGVhbnVwCQk9IGhzcGlfY2xlYW51cDsKIAltYXN0ZXItPm1vZGVfYml0cwk9IFNQSV9DUE9MIHwgU1BJX0NQSEE7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZQk9IHBkZXYtPmRldi5vZl9ub2RlOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlCQk9IGhzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisKIAlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzcGlfcmVnaXN0ZXJfbWFzdGVyIGVycm9yLlxuIik7Ci0JCWdvdG8gZXJyb3IxOworCQlnb3RvIGVycm9yMjsKIAl9CiAKIAlyZXR1cm4gMDsKIAorIGVycm9yMjoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAgZXJyb3IxOgogCWNsa19wdXQoY2xrKTsKICBlcnJvcjA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCmluZGV4IDgxY2MwMmYuLmU4NTBkMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCkBAIC0xNSw1OSArMTUsMTA4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc2hfbXNpb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKKworc3RydWN0IHNoX21zaW9mX2NoaXBkYXRhIHsKKwl1MTYgdHhfZmlmb19zaXplOworCXUxNiByeF9maWZvX3NpemU7CisJdTE2IG1hc3Rlcl9mbGFnczsKK307CisKIHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiB7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7IC8qIG11c3QgYmUgZmlyc3QgZm9yIHNwaV9iaXRiYW5nLmMgKi8KIAl2b2lkIF9faW9tZW0gKm1hcGJhc2U7CiAJc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJY29uc3Qgc3RydWN0IHNoX21zaW9mX2NoaXBkYXRhICpjaGlwZGF0YTsKIAlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX2luZm8gKmluZm87CiAJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0eF9maWZvX3NpemU7CiAJaW50IHJ4X2ZpZm9fc2l6ZTsKIH07CiAKLSNkZWZpbmUgVE1EUjEJMHgwMAotI2RlZmluZSBUTURSMgkweDA0Ci0jZGVmaW5lIFRNRFIzCTB4MDgKLSNkZWZpbmUgUk1EUjEJMHgxMAotI2RlZmluZSBSTURSMgkweDE0Ci0jZGVmaW5lIFJNRFIzCTB4MTgKLSNkZWZpbmUgVFNDUgkweDIwCi0jZGVmaW5lIFJTQ1IJMHgyMgotI2RlZmluZSBDVFIJMHgyOAotI2RlZmluZSBGQ1RSCTB4MzAKLSNkZWZpbmUgU1RSCTB4NDAKLSNkZWZpbmUgSUVSCTB4NDQKLSNkZWZpbmUgVERSMQkweDQ4Ci0jZGVmaW5lIFREUjIJMHg0YwotI2RlZmluZSBURkRSCTB4NTAKLSNkZWZpbmUgUkRSMQkweDU4Ci0jZGVmaW5lIFJEUjIJMHg1YwotI2RlZmluZSBSRkRSCTB4NjAKKyNkZWZpbmUgVE1EUjEJMHgwMAkvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgVE1EUjIJMHgwNAkvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgVE1EUjMJMHgwOAkvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUk1EUjEJMHgxMAkvKiBSZWNlaXZlIE1vZGUgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBSTURSMgkweDE0CS8qIFJlY2VpdmUgTW9kZSBSZWdpc3RlciAyICovCisjZGVmaW5lIFJNRFIzCTB4MTgJLyogUmVjZWl2ZSBNb2RlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgVFNDUgkweDIwCS8qIFRyYW5zbWl0IENsb2NrIFNlbGVjdCBSZWdpc3RlciAqLworI2RlZmluZSBSU0NSCTB4MjIJLyogUmVjZWl2ZSBDbG9jayBTZWxlY3QgUmVnaXN0ZXIgKFNILCBBMSwgQVBFNikgKi8KKyNkZWZpbmUgQ1RSCTB4MjgJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBGQ1RSCTB4MzAJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNUUgkweDQwCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJRVIJMHg0NAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFREUjEJMHg0OAkvKiBUcmFuc21pdCBDb250cm9sIERhdGEgUmVnaXN0ZXIgMSAoU0gsIEExKSAqLworI2RlZmluZSBURFIyCTB4NGMJLyogVHJhbnNtaXQgQ29udHJvbCBEYXRhIFJlZ2lzdGVyIDIgKFNILCBBMSkgKi8KKyNkZWZpbmUgVEZEUgkweDUwCS8qIFRyYW5zbWl0IEZJRk8gRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBSRFIxCTB4NTgJLyogUmVjZWl2ZSBDb250cm9sIERhdGEgUmVnaXN0ZXIgMSAoU0gsIEExKSAqLworI2RlZmluZSBSRFIyCTB4NWMJLyogUmVjZWl2ZSBDb250cm9sIERhdGEgUmVnaXN0ZXIgMiAoU0gsIEExKSAqLworI2RlZmluZSBSRkRSCTB4NjAJLyogUmVjZWl2ZSBGSUZPIERhdGEgUmVnaXN0ZXIgKi8KIAotI2RlZmluZSBDVFJfVFNDS0UgKDEgPDwgMTUpCi0jZGVmaW5lIENUUl9URlNFICAoMSA8PCAxNCkKLSNkZWZpbmUgQ1RSX1RYRSAgICgxIDw8IDkpCi0jZGVmaW5lIENUUl9SWEUgICAoMSA8PCA4KQorLyogVE1EUjEgYW5kIFJNRFIxICovCisjZGVmaW5lIE1EUjFfVFJNRAkgMHg4MDAwMDAwMCAvKiBUcmFuc2ZlciBNb2RlICgxID0gTWFzdGVyIG1vZGUpICovCisjZGVmaW5lIE1EUjFfU1lOQ01EX01BU0sgMHgzMDAwMDAwMCAvKiBTWU5DIE1vZGUgKi8KKyNkZWZpbmUgTURSMV9TWU5DTURfU1BJCSAweDIwMDAwMDAwIC8qICAgTGV2ZWwgbW9kZS9TUEkgKi8KKyNkZWZpbmUgTURSMV9TWU5DTURfTFIJIDB4MzAwMDAwMDAgLyogICBML1IgbW9kZSAqLworI2RlZmluZSBNRFIxX1NZTkNBQ19TSElGVAkgMjUgLyogU3luYyBQb2xhcml0eSAoMSA9IEFjdGl2ZS1sb3cpICovCisjZGVmaW5lIE1EUjFfQklUTFNCX1NISUZUCSAyNCAvKiBNU0IvTFNCIEZpcnN0ICgxID0gTFNCIGZpcnN0KSAqLworI2RlZmluZSBNRFIxX0ZMRF9NQVNLCSAweDAwMDAwMGMwIC8qIEZyYW1lIFN5bmMgU2lnbmFsIEludGVydmFsICgwLTMpICovCisjZGVmaW5lIE1EUjFfRkxEX1NISUZUCQkgIDIKKyNkZWZpbmUgTURSMV9YWFNUUAkgMHgwMDAwMDAwMSAvKiBUcmFuc21pc3Npb24vUmVjZXB0aW9uIFN0b3Agb24gRklGTyAqLworLyogVE1EUjEgKi8KKyNkZWZpbmUgVE1EUjFfUENPTgkgMHg0MDAwMDAwMCAvKiBUcmFuc2ZlciBTaWduYWwgQ29ubmVjdGlvbiAqLwogCi0jZGVmaW5lIFNUUl9URU9GICAoMSA8PCAyMykKLSNkZWZpbmUgU1RSX1JFT0YgICgxIDw8IDcpCisvKiBUTURSMiBhbmQgUk1EUjIgKi8KKyNkZWZpbmUgTURSMl9CSVRMRU4xKGkpCSgoKGkpIC0gMSkgPDwgMjQpIC8qIERhdGEgU2l6ZSAoOC0zMiBiaXRzKSAqLworI2RlZmluZSBNRFIyX1dETEVOMShpKQkoKChpKSAtIDEpIDw8IDE2KSAvKiBXb3JkIENvdW50ICgxLTY0LzI1NiAoU0gsIEExKSkpICovCisjZGVmaW5lIE1EUjJfR1JQTUFTSzEJMHgwMDAwMDAwMSAvKiBHcm91cCBPdXRwdXQgTWFzayAxIChTSCwgQTEpICovCisKKy8qIFRTQ1IgYW5kIFJTQ1IgKi8KKyNkZWZpbmUgU0NSX0JSUFNfTUFTSwkgICAgMHgxZjAwIC8qIFByZXNjYWxlciBTZXR0aW5nICgxLTMyKSAqLworI2RlZmluZSBTQ1JfQlJQUyhpKQkoKChpKSAtIDEpIDw8IDgpCisjZGVmaW5lIFNDUl9CUkRWX01BU0sJICAgIDB4MDAwNyAvKiBCYXVkIFJhdGUgR2VuZXJhdG9yJ3MgRGl2aXNpb24gUmF0aW8gKi8KKyNkZWZpbmUgU0NSX0JSRFZfRElWXzIJICAgIDB4MDAwMAorI2RlZmluZSBTQ1JfQlJEVl9ESVZfNAkgICAgMHgwMDAxCisjZGVmaW5lIFNDUl9CUkRWX0RJVl84CSAgICAweDAwMDIKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzE2CSAgICAweDAwMDMKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzMyCSAgICAweDAwMDQKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzEJICAgIDB4MDAwNworCisvKiBDVFIgKi8KKyNkZWZpbmUgQ1RSX1RTQ0tJWl9NQVNLCTB4YzAwMDAwMDAgLyogVHJhbnNtaXQgQ2xvY2sgSS9PIFBvbGFyaXR5IFNlbGVjdCAqLworI2RlZmluZSBDVFJfVFNDS0laX1NDSwkweDgwMDAwMDAwIC8qICAgRGlzYWJsZSBTQ0sgd2hlbiBUWCBkaXNhYmxlZCAqLworI2RlZmluZSBDVFJfVFNDS0laX1BPTF9TSElGVAkzMCAvKiAgIFRyYW5zbWl0IENsb2NrIFBvbGFyaXR5ICovCisjZGVmaW5lIENUUl9SU0NLSVpfTUFTSwkweDMwMDAwMDAwIC8qIFJlY2VpdmUgQ2xvY2sgUG9sYXJpdHkgU2VsZWN0ICovCisjZGVmaW5lIENUUl9SU0NLSVpfU0NLCTB4MjAwMDAwMDAgLyogICBNdXN0IG1hdGNoIENUUl9UU0NLSVpfU0NLICovCisjZGVmaW5lIENUUl9SU0NLSVpfUE9MX1NISUZUCTI4IC8qICAgUmVjZWl2ZSBDbG9jayBQb2xhcml0eSAqLworI2RlZmluZSBDVFJfVEVER19TSElGVAkJMjcgLyogVHJhbnNtaXQgVGltaW5nICgxID0gZmFsbGluZyBlZGdlKSAqLworI2RlZmluZSBDVFJfUkVER19TSElGVAkJMjYgLyogUmVjZWl2ZSBUaW1pbmcgKDEgPSBmYWxsaW5nIGVkZ2UpICovCisjZGVmaW5lIENUUl9UWERJWl9NQVNLCTB4MDBjMDAwMDAgLyogUGluIE91dHB1dCBXaGVuIFRYIGlzIERpc2FibGVkICovCisjZGVmaW5lIENUUl9UWERJWl9MT1cJMHgwMDAwMDAwMCAvKiAgIDAgKi8KKyNkZWZpbmUgQ1RSX1RYRElaX0hJR0gJMHgwMDQwMDAwMCAvKiAgIDEgKi8KKyNkZWZpbmUgQ1RSX1RYRElaX0hJWgkweDAwODAwMDAwIC8qICAgSGlnaC1pbXBlZGFuY2UgKi8KKyNkZWZpbmUgQ1RSX1RTQ0tFCTB4MDAwMDgwMDAgLyogVHJhbnNtaXQgU2VyaWFsIENsb2NrIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUgQ1RSX1RGU0UJMHgwMDAwNDAwMCAvKiBUcmFuc21pdCBGcmFtZSBTeW5jIFNpZ25hbCBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lIENUUl9UWEUJCTB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRW5hYmxlICovCisjZGVmaW5lIENUUl9SWEUJCTB4MDAwMDAxMDAgLyogUmVjZWl2ZSBFbmFibGUgKi8KKworLyogU1RSIGFuZCBJRVIgKi8KKyNkZWZpbmUgU1RSX1RFT0YJMHgwMDgwMDAwMCAvKiBGcmFtZSBUcmFuc21pc3Npb24gRW5kICovCisjZGVmaW5lIFNUUl9SRU9GCTB4MDAwMDAwODAgLyogRnJhbWUgUmVjZXB0aW9uIEVuZCAqLworCiAKIHN0YXRpYyB1MzIgc2hfbXNpb2ZfcmVhZChzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsIGludCByZWdfb2ZmcykKIHsKQEAgLTEzMSwyMiArMTgwLDIxIEBACiAJdW5zaWduZWQgc2hvcnQgZGl2OwogCXVuc2lnbmVkIHNob3J0IHNjcjsKIH0gY29uc3Qgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtdID0gewotCXsgMSwgMHgwMDA3IH0sCi0JeyAyLCAweDAwMDAgfSwKLQl7IDQsIDB4MDAwMSB9LAotCXsgOCwgMHgwMDAyIH0sCi0JeyAxNiwgMHgwMDAzIH0sCi0JeyAzMiwgMHgwMDA0IH0sCi0JeyA2NCwgMHgxZjAwIH0sCi0JeyAxMjgsIDB4MWYwMSB9LAotCXsgMjU2LCAweDFmMDIgfSwKLQl7IDUxMiwgMHgxZjAzIH0sCi0JeyAxMDI0LCAweDFmMDQgfSwKKwl7IDEsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl8xIH0sCisJeyAyLAlTQ1JfQlJQUyggMSkgfCBTQ1JfQlJEVl9ESVZfMiB9LAorCXsgNCwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzQgfSwKKwl7IDgsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl84IH0sCisJeyAxNiwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzE2IH0sCisJeyAzMiwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzMyIH0sCisJeyA2NCwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzIgfSwKKwl7IDEyOCwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzQgfSwKKwl7IDI1NiwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzggfSwKKwl7IDUxMiwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzE2IH0sCisJeyAxMDI0LAlTQ1JfQlJQUygzMikgfCBTQ1JfQlJEVl9ESVZfMzIgfSwKIH07CiAKIHN0YXRpYyB2b2lkIHNoX21zaW9mX3NwaV9zZXRfY2xrX3JlZ3Moc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBzcGlfaHopCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSwgdTMyIHNwaV9oeikKIHsKIAl1bnNpZ25lZCBsb25nIGRpdiA9IDEwMjQ7CiAJc2l6ZV90IGs7CkBAIC0xNjQsNyArMjEyLDggQEAKIAlrID0gbWluX3QoaW50LCBrLCBBUlJBWV9TSVpFKHNoX21zaW9mX3NwaV9jbGtfdGFibGUpIC0gMSk7CiAKIAlzaF9tc2lvZl93cml0ZShwLCBUU0NSLCBzaF9tc2lvZl9zcGlfY2xrX3RhYmxlW2tdLnNjcik7Ci0Jc2hfbXNpb2Zfd3JpdGUocCwgUlNDUiwgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtrXS5zY3IpOworCWlmICghKHAtPmNoaXBkYXRhLT5tYXN0ZXJfZmxhZ3MgJiBTUElfTUFTVEVSX01VU1RfVFgpKQorCQlzaF9tc2lvZl93cml0ZShwLCBSU0NSLCBzaF9tc2lvZl9zcGlfY2xrX3RhYmxlW2tdLnNjcik7CiB9CiAKIHN0YXRpYyB2b2lkIHNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3Moc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLApAQCAtMTgzLDIxICsyMzIsMjUgQEAKIAkgKi8KIAlzaF9tc2lvZl93cml0ZShwLCBGQ1RSLCAwKTsKIAotCXRtcCA9IDA7Ci0JdG1wIHw9ICFjc19oaWdoIDw8IDI1OwotCXRtcCB8PSBsc2JfZmlyc3QgPDwgMjQ7Ci0Jc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjEsIDB4ZTAwMDAwMDUgfCB0bXApOwotCXNoX21zaW9mX3dyaXRlKHAsIFJNRFIxLCAweDIwMDAwMDA1IHwgdG1wKTsKKwl0bXAgPSBNRFIxX1NZTkNNRF9TUEkgfCAxIDw8IE1EUjFfRkxEX1NISUZUIHwgTURSMV9YWFNUUDsKKwl0bXAgfD0gIWNzX2hpZ2ggPDwgTURSMV9TWU5DQUNfU0hJRlQ7CisJdG1wIHw9IGxzYl9maXJzdCA8PCBNRFIxX0JJVExTQl9TSElGVDsKKwlzaF9tc2lvZl93cml0ZShwLCBUTURSMSwgdG1wIHwgTURSMV9UUk1EIHwgVE1EUjFfUENPTik7CisJaWYgKHAtPmNoaXBkYXRhLT5tYXN0ZXJfZmxhZ3MgJiBTUElfTUFTVEVSX01VU1RfVFgpIHsKKwkJLyogVGhlc2UgYml0cyBhcmUgcmVzZXJ2ZWQgaWYgUlggbmVlZHMgVFggKi8KKwkJdG1wICY9IH4weDAwMDBmZmZmOworCX0KKwlzaF9tc2lvZl93cml0ZShwLCBSTURSMSwgdG1wKTsKIAotCXRtcCA9IDB4YTAwMDAwMDA7Ci0JdG1wIHw9IGNwb2wgPDwgMzA7IC8qIFRTQ0tJWiAqLwotCXRtcCB8PSBjcG9sIDw8IDI4OyAvKiBSU0NLSVogKi8KKwl0bXAgPSAwOworCXRtcCB8PSBDVFJfVFNDS0laX1NDSyB8IGNwb2wgPDwgQ1RSX1RTQ0tJWl9QT0xfU0hJRlQ7CisJdG1wIHw9IENUUl9SU0NLSVpfU0NLIHwgY3BvbCA8PCBDVFJfUlNDS0laX1BPTF9TSElGVDsKIAogCWVkZ2UgPSBjcG9sIF4gIWNwaGE7CiAKLQl0bXAgfD0gZWRnZSA8PCAyNzsgLyogVEVERyAqLwotCXRtcCB8PSBlZGdlIDw8IDI2OyAvKiBSRURHICovCi0JdG1wIHw9ICh0eF9oaV96ID8gMiA6IDApIDw8IDIyOyAvKiBUWERJWiAqLworCXRtcCB8PSBlZGdlIDw8IENUUl9URURHX1NISUZUOworCXRtcCB8PSBlZGdlIDw8IENUUl9SRURHX1NISUZUOworCXRtcCB8PSB0eF9oaV96ID8gQ1RSX1RYRElaX0hJWiA6IENUUl9UWERJWl9MT1c7CiAJc2hfbXNpb2Zfd3JpdGUocCwgQ1RSLCB0bXApOwogfQogCkBAIC0yMDUsMTIgKzI1OCwxMiBAQAogCQkJCSAgICAgICBjb25zdCB2b2lkICp0eF9idWYsIHZvaWQgKnJ4X2J1ZiwKIAkJCQkgICAgICAgdTMyIGJpdHMsIHUzMiB3b3JkcykKIHsKLQl1MzIgZHIyID0gKChiaXRzIC0gMSkgPDwgMjQpIHwgKCh3b3JkcyAtIDEpIDw8IDE2KTsKKwl1MzIgZHIyID0gTURSMl9CSVRMRU4xKGJpdHMpIHwgTURSMl9XRExFTjEod29yZHMpOwogCi0JaWYgKHR4X2J1ZikKKwlpZiAodHhfYnVmIHx8IChwLT5jaGlwZGF0YS0+bWFzdGVyX2ZsYWdzICYgU1BJX01BU1RFUl9NVVNUX1RYKSkKIAkJc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjIsIGRyMik7CiAJZWxzZQotCQlzaF9tc2lvZl93cml0ZShwLCBUTURSMiwgZHIyIHwgMSk7CisJCXNoX21zaW9mX3dyaXRlKHAsIFRNRFIyLCBkcjIgfCBNRFIyX0dSUE1BU0sxKTsKIAogCWlmIChyeF9idWYpCiAJCXNoX21zaW9mX3dyaXRlKHAsIFJNRFIyLCBkcjIpOwpAQCAtMzYzLDc3ICs0MTYsNDUgQEAKIAkJcHV0X3VuYWxpZ25lZChzd2FiMzIoc2hfbXNpb2ZfcmVhZChwLCBSRkRSKSA+PiBmcyksICZidWZfMzJba10pOwogfQogCi1zdGF0aWMgaW50IHNoX21zaW9mX3NwaV9iaXRzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCitzdGF0aWMgaW50IHNoX21zaW9mX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCBiaXRzOwotCi0JYml0cyA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogMDsKLQlpZiAoIWJpdHMpCi0JCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JcmV0dXJuIGJpdHM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNoX21zaW9mX3NwaV9oeihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQl1bnNpZ25lZCBsb25nIGh6OwotCi0JaHogPSB0ID8gdC0+c3BlZWRfaHogOiAwOwotCWlmICghaHopCi0JCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JcmV0dXJuIGh6OwotfQotCi1zdGF0aWMgaW50IHNoX21zaW9mX3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCWludCBiaXRzOwotCi0JLyogbm90aW5nIHRvIGNoZWNrIGh6IHZhbHVlcyBhZ2FpbnN0IHNpbmNlIHBhcmVudCBjbG9jayBpcyBkaXNhYmxlZCAqLwotCi0JYml0cyA9IHNoX21zaW9mX3NwaV9iaXRzKHNwaSwgdCk7Ci0JaWYgKGJpdHMgPCA4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYml0cyA+IDMyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcihzcGksIHQpOwotfQotCi1zdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCi17CisJc3RydWN0IGRldmljZV9ub2RlCSpucCA9IHNwaS0+bWFzdGVyLT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlpbnQgdmFsdWU7CiAKLQkvKiBjaGlwIHNlbGVjdCBpcyBhY3RpdmUgbG93IHVubGVzcyBTUElfQ1NfSElHSCBpcyBzZXQgKi8KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpCi0JCXZhbHVlID0gKGlzX29uID09IEJJVEJBTkdfQ1NfQUNUSVZFKSA/IDEgOiAwOwotCWVsc2UKLQkJdmFsdWUgPSAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpID8gMCA6IDE7Ci0KLQlpZiAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpIHsKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZwLT5mbGFncykpIHsKLQkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnAtPnBkZXYtPmRldik7Ci0JCQljbGtfZW5hYmxlKHAtPmNsayk7Ci0JCX0KLQotCQkvKiBDb25maWd1cmUgcGlucyBiZWZvcmUgYXNzZXJ0aW5nIENTICovCi0JCXNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3MocCwgISEoc3BpLT5tb2RlICYgU1BJX0NQT0wpLAotCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSwKLQkJCQkJICAhIShzcGktPm1vZGUgJiBTUElfM1dJUkUpLAotCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpLAotCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJaWYgKCFucCkgeworCQkvKgorCQkgKiBVc2Ugc3BpLT5jb250cm9sbGVyX2RhdGEgZm9yIENTIChzYW1lIHN0cmF0ZWd5IGFzIHNwaV9ncGlvKSwKKwkJICogaWYgYW55LiBvdGhlcndpc2UgbGV0IEhXIGNvbnRyb2wgQ1MKKwkJICovCisJCXNwaS0+Y3NfZ3BpbyA9ICh1aW50cHRyX3Qpc3BpLT5jb250cm9sbGVyX2RhdGE7CiAJfQogCi0JLyogdXNlIHNwaS0+Y29udHJvbGxlciBkYXRhIGZvciBDUyAoc2FtZSBzdHJhdGVneSBhcyBzcGlfZ3BpbykgKi8KLQlncGlvX3NldF92YWx1ZSgodWludHB0cl90KXNwaS0+Y29udHJvbGxlcl9kYXRhLCB2YWx1ZSk7CisJLyogQ29uZmlndXJlIHBpbnMgYmVmb3JlIGRlYXNzZXJ0aW5nIENTICovCisJc2hfbXNpb2Zfc3BpX3NldF9waW5fcmVncyhwLCAhIShzcGktPm1vZGUgJiBTUElfQ1BPTCksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfQ1BIQSksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfM1dJUkUpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOwogCi0JaWYgKGlzX29uID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpIHsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmcC0+ZmxhZ3MpKSB7Ci0JCQljbGtfZGlzYWJsZShwLT5jbGspOwotCQkJcG1fcnVudGltZV9wdXQoJnAtPnBkZXYtPmRldik7Ci0JCX0KLQl9CisJaWYgKHNwaS0+Y3NfZ3BpbyA+PSAwKQorCQlncGlvX3NldF92YWx1ZShzcGktPmNzX2dwaW8sICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX21zaW9mX3ByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOworCisJLyogQ29uZmlndXJlIHBpbnMgYmVmb3JlIGFzc2VydGluZyBDUyAqLworCXNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3MocCwgISEoc3BpLT5tb2RlICYgU1BJX0NQT0wpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NQSEEpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSwKKwkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzaF9tc2lvZl9zcGlfdHhyeF9vbmNlKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKQEAgLTQ4Nyw3ICs1MDgsNyBAQAogCS8qIGNsZWFyIHN0YXR1cyBiaXRzICovCiAJc2hfbXNpb2ZfcmVzZXRfc3RyKHApOwogCi0JLyogc2h1dCBkb3duIGZyYW1lLCB0eC90eCBhbmQgY2xvY2sgc2lnbmFscyAqLworCS8qIHNodXQgZG93biBmcmFtZSwgcngvdHggYW5kIGNsb2NrIHNpZ25hbHMgKi8KIAlyZXQgPSBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgQ1RSX1RGU0UsIDApOwogCXJldCA9IHJldCA/IHJldCA6IHNoX21zaW9mX21vZGlmeV9jdHJfd2FpdChwLCBDVFJfVFhFLCAwKTsKIAlpZiAocnhfYnVmKQpAQCAtNTA1LDkgKzUyNiwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbXNpb2Zfc3BpX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3N0YXRpYyBpbnQgc2hfbXNpb2ZfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7Ci0Jc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCXZvaWQgKCp0eF9maWZvKShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKiwgY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CiAJdm9pZCAoKnJ4X2ZpZm8pKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqLCB2b2lkICosIGludCwgaW50KTsKIAlpbnQgYml0czsKQEAgLTUxNyw3ICs1NDAsNyBAQAogCWludCBuOwogCWJvb2wgc3dhYjsKIAotCWJpdHMgPSBzaF9tc2lvZl9zcGlfYml0cyhzcGksIHQpOworCWJpdHMgPSB0LT5iaXRzX3Blcl93b3JkOwogCiAJaWYgKGJpdHMgPD0gOCAmJiB0LT5sZW4gPiAxNSAmJiAhKHQtPmxlbiAmIDMpKSB7CiAJCWJpdHMgPSAzMjsKQEAgLTU2Nyw4ICs1OTAsNyBAQAogCX0KIAogCS8qIHNldHVwIGNsb2NrcyAoY2xvY2sgYWxyZWFkeSBlbmFibGVkIGluIGNoaXBzZWxlY3QoKSkgKi8KLQlzaF9tc2lvZl9zcGlfc2V0X2Nsa19yZWdzKHAsIGNsa19nZXRfcmF0ZShwLT5jbGspLAotCQkJCSAgc2hfbXNpb2Zfc3BpX2h6KHNwaSwgdCkpOworCXNoX21zaW9mX3NwaV9zZXRfY2xrX3JlZ3MocCwgY2xrX2dldF9yYXRlKHAtPmNsayksIHQtPnNwZWVkX2h6KTsKIAogCS8qIHRyYW5zZmVyIGluIGZpZm8gc2l6ZWQgY2h1bmtzICovCiAJd29yZHMgPSB0LT5sZW4gLyBieXRlc19wZXJfd29yZDsKQEAgLTU4OCwyMiArNjEwLDM2IEBACiAJCXdvcmRzIC09IG47CiAJfQogCi0JcmV0dXJuIGJ5dGVzX2RvbmU7Ci19Ci0KLXN0YXRpYyB1MzIgc2hfbXNpb2Zfc3BpX3R4cnhfd29yZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywKLQkJCQkgIHUzMiB3b3JkLCB1OCBiaXRzKQotewotCUJVRygpOyAvKiB1bnVzZWQgYnV0IG5lZWRlZCBieSBiaXRiYW5nIGNvZGUgKi8KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9tc2lvZl9jaGlwZGF0YSBzaF9kYXRhID0geworCS50eF9maWZvX3NpemUgPSA2NCwKKwkucnhfZmlmb19zaXplID0gNjQsCisJLm1hc3Rlcl9mbGFncyA9IDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX21zaW9mX2NoaXBkYXRhIHI4YTc3OXhfZGF0YSA9IHsKKwkudHhfZmlmb19zaXplID0gNjQsCisJLnJ4X2ZpZm9fc2l6ZSA9IDI1NiwKKwkubWFzdGVyX2ZsYWdzID0gU1BJX01BU1RFUl9NVVNUX1RYLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2hfbXNpb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2gtbXNpb2YiLCAgICAgICAgLmRhdGEgPSAmc2hfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaC1tb2JpbGUtbXNpb2YiLCAuZGF0YSA9ICZzaF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLG1zaW9mLXI4YTc3OTAiLCAgIC5kYXRhID0gJnI4YTc3OXhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxtc2lvZi1yOGE3NzkxIiwgICAuZGF0YSA9ICZyOGE3Nzl4X2RhdGEgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzaF9tc2lvZl9tYXRjaCk7CisKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX2luZm8gKnNoX21zaW9mX3NwaV9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNoX21zaW9mX3NwaV9pbmZvICppbmZvOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Ci0JdTMyIG51bV9jcyA9IDA7CisJdTMyIG51bV9jcyA9IDE7CiAKIAlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBzaF9tc2lvZl9zcGlfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykgewpAQCAtNjMzLDYgKzY2OSw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlCSpyOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CiAJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwOwogCWludCBpOwogCWludCByZXQ7CkBAIC02NDYsMTAgKzY4MywxNSBAQAogCXAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShzaF9tc2lvZl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKG9mX2lkKSB7CisJCXAtPmNoaXBkYXRhID0gb2ZfaWQtPmRhdGE7CiAJCXAtPmluZm8gPSBzaF9tc2lvZl9zcGlfcGFyc2VfZHQoJnBkZXYtPmRldik7Ci0JZWxzZQorCX0gZWxzZSB7CisJCXAtPmNoaXBkYXRhID0gKGNvbnN0IHZvaWQgKilwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CiAJCXAtPmluZm8gPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCX0KIAogCWlmICghcC0+aW5mbykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gb2J0YWluIGRldmljZSBpbmZvXG4iKTsKQEAgLTY4Nyw0OSArNzI5LDQwIEBACiAJCWdvdG8gZXJyMTsKIAl9CiAKLQlyZXQgPSBjbGtfcHJlcGFyZShwLT5jbGspOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBwcmVwYXJlIGNsb2NrXG4iKTsKLQkJZ290byBlcnIxOwotCX0KLQogCXAtPnBkZXYgPSBwZGV2OwogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCi0JLyogVGhlIHN0YW5kYXJkIHZlcnNpb24gb2YgTVNJT0YgdXNlIDY0IHdvcmQgRklGT3MgKi8KLQlwLT50eF9maWZvX3NpemUgPSA2NDsKLQlwLT5yeF9maWZvX3NpemUgPSA2NDsKLQogCS8qIFBsYXRmb3JtIGRhdGEgbWF5IG92ZXJyaWRlIEZJRk8gc2l6ZXMgKi8KKwlwLT50eF9maWZvX3NpemUgPSBwLT5jaGlwZGF0YS0+dHhfZmlmb19zaXplOworCXAtPnJ4X2ZpZm9fc2l6ZSA9IHAtPmNoaXBkYXRhLT5yeF9maWZvX3NpemU7CiAJaWYgKHAtPmluZm8tPnR4X2ZpZm9fb3ZlcnJpZGUpCiAJCXAtPnR4X2ZpZm9fc2l6ZSA9IHAtPmluZm8tPnR4X2ZpZm9fb3ZlcnJpZGU7CiAJaWYgKHAtPmluZm8tPnJ4X2ZpZm9fb3ZlcnJpZGUpCiAJCXAtPnJ4X2ZpZm9fc2l6ZSA9IHAtPmluZm8tPnJ4X2ZpZm9fb3ZlcnJpZGU7CiAKLQkvKiBpbml0IG1hc3RlciBhbmQgYml0YmFuZyBjb2RlICovCisJLyogaW5pdCBtYXN0ZXIgY29kZSAqLwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwogCW1hc3Rlci0+bW9kZV9iaXRzIHw9IFNQSV9MU0JfRklSU1QgfCBTUElfM1dJUkU7Ci0JbWFzdGVyLT5mbGFncyA9IDA7CisJbWFzdGVyLT5mbGFncyA9IHAtPmNoaXBkYXRhLT5tYXN0ZXJfZmxhZ3M7CiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwLT5pbmZvLT5udW1fY2hpcHNlbGVjdDsKLQltYXN0ZXItPnNldHVwID0gc3BpX2JpdGJhbmdfc2V0dXA7Ci0JbWFzdGVyLT5jbGVhbnVwID0gc3BpX2JpdGJhbmdfY2xlYW51cDsKKwltYXN0ZXItPnNldHVwID0gc2hfbXNpb2Zfc3BpX3NldHVwOworCW1hc3Rlci0+cHJlcGFyZV9tZXNzYWdlID0gc2hfbXNpb2ZfcHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDgsIDMyKTsKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzaF9tc2lvZl90cmFuc2Zlcl9vbmU7CiAKLQlwLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKLQlwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzaF9tc2lvZl9zcGlfY2hpcHNlbGVjdDsKLQlwLT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gc2hfbXNpb2Zfc3BpX3NldHVwX3RyYW5zZmVyOwotCXAtPmJpdGJhbmcudHhyeF9idWZzID0gc2hfbXNpb2Zfc3BpX3R4cng7Ci0JcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOwotCXAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc2hfbXNpb2Zfc3BpX3R4cnhfd29yZDsKLQlwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNoX21zaW9mX3NwaV90eHJ4X3dvcmQ7Ci0JcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOworCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNwaV9yZWdpc3Rlcl9tYXN0ZXIgZXJyb3IuXG4iKTsKKwkJZ290byBlcnIyOworCX0KIAotCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZwLT5iaXRiYW5nKTsKLQlpZiAocmV0ID09IDApCi0JCXJldHVybiAwOworCXJldHVybiAwOwogCisgZXJyMjoKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0JY2xrX3VucHJlcGFyZShwLT5jbGspOwogIGVycjE6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAlyZXR1cm4gcmV0OwpAQCAtNzM3LDMwICs3NzAsMjIgQEAKIAogc3RhdGljIGludCBzaF9tc2lvZl9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV9iaXRiYW5nX3N0b3AoJnAtPmJpdGJhbmcpOwotCWlmICghcmV0KSB7Ci0JCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQkJY2xrX3VucHJlcGFyZShwLT5jbGspOwotCQlzcGlfbWFzdGVyX3B1dChwLT5iaXRiYW5nLm1hc3Rlcik7Ci0JfQotCXJldHVybiByZXQ7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaF9tc2lvZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaC1tc2lvZiIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNoLW1vYmlsZS1tc2lvZiIsIH0sCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzcGlfZHJpdmVyX2lkc1tdID0geworCXsgInNwaV9zaF9tc2lvZiIsCShrZXJuZWxfdWxvbmdfdCkmc2hfZGF0YSB9LAorCXsgInNwaV9yOGE3NzkwX21zaW9mIiwJKGtlcm5lbF91bG9uZ190KSZyOGE3Nzl4X2RhdGEgfSwKKwl7ICJzcGlfcjhhNzc5MV9tc2lvZiIsCShrZXJuZWxfdWxvbmdfdCkmcjhhNzc5eF9kYXRhIH0sCiAJe30sCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2hfbXNpb2ZfbWF0Y2gpOwotI2VuZGlmCitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBzcGlfZHJpdmVyX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNoX21zaW9mX3NwaV9kcnYgPSB7CiAJLnByb2JlCQk9IHNoX21zaW9mX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IHNoX21zaW9mX3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gc3BpX2RyaXZlcl9pZHMsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9ICJzcGlfc2hfbXNpb2YiLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMgYi9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMKaW5kZXggMzhlYjI0ZC4uOGI0NGI3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1zY2kuYwpAQCAtMTQsNyArMTQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpAQCAtMTA5LDcgKzEwOCw3IEBACiB7CiAJc3RydWN0IHNoX3NjaV9zcGkgKnNwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShkZXYtPm1hc3Rlcik7CiAKLQlpZiAoc3AtPmluZm8gJiYgc3AtPmluZm8tPmNoaXBfc2VsZWN0KQorCWlmIChzcC0+aW5mby0+Y2hpcF9zZWxlY3QpCiAJCShzcC0+aW5mby0+Y2hpcF9zZWxlY3QpKHNwLT5pbmZvLCBkZXYtPmNoaXBfc2VsZWN0LCB2YWx1ZSk7CiB9CiAKQEAgLTEzMSw2ICsxMzAsMTEgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgc3ApOwogCXNwLT5pbmZvID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOworCWlmICghc3AtPmluZm8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJwbGF0Zm9ybSBkYXRhIGlzIG1pc3NpbmdcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQogCiAJLyogc2V0dXAgc3BpIGJpdGJhbmcgYWRhcHRvciAqLwogCXNwLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaXJmLmMgYi9kcml2ZXJzL3NwaS9zcGktc2lyZi5jCmluZGV4IGU0MzA2ODkuLjFhNzdhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaXJmLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNpcmYuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJlY3Rpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NpcmZzb2NfZG1hLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgInNpcmZzb2Nfc3BpIgogCkBAIC0xMzIsNiArMTMxLDggQEAKICNkZWZpbmUgSVNfRE1BX1ZBTElEKHgpICh4ICYmIEFMSUdORUQoeC0+dHhfYnVmKSAmJiBBTElHTkVEKHgtPnJ4X2J1ZikgJiYgXAogCUFMSUdORUQoeC0+bGVuKSAmJiAoeC0+bGVuIDwgMiAqIFBBR0VfU0laRSkpCiAKKyNkZWZpbmUgU0lSRlNPQ19NQVhfQ01EX0JZVEVTCTQKKwogc3RydWN0IHNpcmZzb2Nfc3BpIHsKIAlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKIAlzdHJ1Y3QgY29tcGxldGlvbiByeF9kb25lOwpAQCAtMTYyLDYgKzE2MywxMiBAQAogCXZvaWQgKmR1bW15cGFnZTsKIAlpbnQgd29yZF93aWR0aDsgLyogaW4gYnl0ZXMgKi8KIAorCS8qCisJICogaWYgdHggc2l6ZSBpcyBub3QgbW9yZSB0aGFuIDQgYW5kIHJ4IHNpemUgaXMgTlVMTCwgdXNlCisJICogY29tbWFuZCBtb2RlbAorCSAqLworCWJvb2wJdHhfYnlfY21kOworCiAJaW50IGNoaXBzZWxlY3RbMF07CiB9OwogCkBAIC0yNjAsNiArMjY3LDEyIEBACiAKIAl3cml0ZWwoc3BpX3N0YXQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9JTlRfU1RBVFVTKTsKIAorCWlmIChzc3BpLT50eF9ieV9jbWQgJiYgKHNwaV9zdGF0ICYgU0lSRlNPQ19TUElfRlJNX0VORCkpIHsKKwkJY29tcGxldGUoJnNzcGktPnR4X2RvbmUpOworCQl3cml0ZWwoMHgwLCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfSU5UX0VOKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwogCS8qIEVycm9yIENvbmRpdGlvbnMgKi8KIAlpZiAoc3BpX3N0YXQgJiBTSVJGU09DX1NQSV9SWF9PRkxPVyB8fAogCQkJc3BpX3N0YXQgJiBTSVJGU09DX1NQSV9UWF9VRkxPVykgewpAQCAtMzEwLDYgKzMyMywzNCBAQAogCiAJd3JpdGVsKFNJUkZTT0NfU1BJX0lOVF9NQVNLX0FMTCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX0lOVF9TVEFUVVMpOwogCisJLyoKKwkgKiBmaWxsIHR4X2J1ZiBpbnRvIGNvbW1hbmQgcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIGl0cyBjb21wbGV0aW9uCisJICovCisJaWYgKHNzcGktPnR4X2J5X2NtZCkgeworCQl1MzIgY21kOworCQltZW1jcHkoJmNtZCwgc3NwaS0+dHgsIHQtPmxlbik7CisKKwkJaWYgKHNzcGktPndvcmRfd2lkdGggPT0gMSAmJiAhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpKQorCQkJY21kID0gY3B1X3RvX2JlMzIoY21kKSA+PgorCQkJCSgoU0lSRlNPQ19NQVhfQ01EX0JZVEVTIC0gdC0+bGVuKSAqIDgpOworCQlpZiAoc3NwaS0+d29yZF93aWR0aCA9PSAyICYmIHQtPmxlbiA9PSA0ICYmCisJCQkJKCEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkpKQorCQkJY21kID0gKChjbWQgJiAweGZmZmYpIDw8IDE2KSB8IChjbWQgPj4gMTYpOworCisJCXdyaXRlbChjbWQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9DTUQpOworCQl3cml0ZWwoU0lSRlNPQ19TUElfRlJNX0VORF9JTlRfRU4sCisJCQlzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfSU5UX0VOKTsKKwkJd3JpdGVsKFNJUkZTT0NfU1BJX0NNRF9UWF9FTiwKKwkJCXNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9UWF9SWF9FTik7CisKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc3NwaS0+dHhfZG9uZSwgdGltZW91dCkgPT0gMCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJ0cmFuc2ZlciB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIHQtPmxlbjsKKwl9CisKIAlpZiAoc3NwaS0+bGVmdF90eF93b3JkID09IDEpIHsKIAkJd3JpdGVsKHJlYWRsKHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9DVFJMKSB8CiAJCQlTSVJGU09DX1NQSV9FTkFfQVVUT19DTFIsCkBAIC00NTksMTEgKzUwMCw2IEBACiAJCXJlZ3ZhbCB8PSBTSVJGU09DX1NQSV9UUkFOX0RBVF9GT1JNQVRfODsKIAkJc3NwaS0+cnhfd29yZCA9IHNwaV9zaXJmc29jX3J4X3dvcmRfdTg7CiAJCXNzcGktPnR4X3dvcmQgPSBzcGlfc2lyZnNvY190eF93b3JkX3U4OwotCQl0eGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9CWVRFOwotCQlyeGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9CWVRFOwotCQlzc3BpLT53b3JkX3dpZHRoID0gMTsKIAkJYnJlYWs7CiAJY2FzZSAxMjoKIAljYXNlIDE2OgpAQCAtNDcxLDI2ICs1MDcsMjIgQEAKIAkJCVNJUkZTT0NfU1BJX1RSQU5fREFUX0ZPUk1BVF8xNjsKIAkJc3NwaS0+cnhfd29yZCA9IHNwaV9zaXJmc29jX3J4X3dvcmRfdTE2OwogCQlzc3BpLT50eF93b3JkID0gc3BpX3NpcmZzb2NfdHhfd29yZF91MTY7Ci0JCXR4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX1dPUkQ7Ci0JCXJ4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX1dPUkQ7Ci0JCXNzcGktPndvcmRfd2lkdGggPSAyOwogCQlicmVhazsKIAljYXNlIDMyOgogCQlyZWd2YWwgfD0gU0lSRlNPQ19TUElfVFJBTl9EQVRfRk9STUFUXzMyOwogCQlzc3BpLT5yeF93b3JkID0gc3BpX3NpcmZzb2Nfcnhfd29yZF91MzI7CiAJCXNzcGktPnR4X3dvcmQgPSBzcGlfc2lyZnNvY190eF93b3JkX3UzMjsKLQkJdHhmaWZvX2N0cmwgPSBTSVJGU09DX1NQSV9GSUZPX1RIRChTSVJGU09DX1NQSV9GSUZPX1NJWkUgLyAyKSB8Ci0JCQkJCVNJUkZTT0NfU1BJX0ZJRk9fV0lEVEhfRFdPUkQ7Ci0JCXJ4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX0RXT1JEOwotCQlzc3BpLT53b3JkX3dpZHRoID0gNDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQogCisJc3NwaS0+d29yZF93aWR0aCA9IERJVl9ST1VORF9VUChiaXRzX3Blcl93b3JkLCA4KTsKKwl0eGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKKwkJCQkJICAgc3NwaS0+d29yZF93aWR0aDsKKwlyeGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKKwkJCQkJICAgc3NwaS0+d29yZF93aWR0aDsKKwogCWlmICghKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkKIAkJcmVndmFsIHw9IFNJUkZTT0NfU1BJX0NTX0lETEVfU1RBVDsKIAlpZiAoIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSkKQEAgLTUxOSw2ICs1NTEsMTQgQEAKIAl3cml0ZWwodHhmaWZvX2N0cmwsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9UWEZJRk9fQ1RSTCk7CiAJd3JpdGVsKHJ4Zmlmb19jdHJsLCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfUlhGSUZPX0NUUkwpOwogCisJaWYgKHQgJiYgdC0+dHhfYnVmICYmICF0LT5yeF9idWYgJiYgKHQtPmxlbiA8PSBTSVJGU09DX01BWF9DTURfQllURVMpKSB7CisJCXJlZ3ZhbCB8PSAoU0lSRlNPQ19TUElfQ01EX0JZVEVfTlVNKCh0LT5sZW4gLSAxKSkgfAorCQkJCVNJUkZTT0NfU1BJX0NNRF9NT0RFKTsKKwkJc3NwaS0+dHhfYnlfY21kID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZWd2YWwgJj0gflNJUkZTT0NfU1BJX0NNRF9NT0RFOworCQlzc3BpLT50eF9ieV9jbWQgPSBmYWxzZTsKKwl9CiAJd3JpdGVsKHJlZ3ZhbCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX0NUUkwpOwogCiAJaWYgKElTX0RNQV9WQUxJRCh0KSkgewpAQCAtNTQ4LDggKzU4OCw2IEBACiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXM7CiAJaW50IG51bV9jcywgY3NfZ3BpbywgaXJxOwotCXUzMiByeF9kbWFfY2gsIHR4X2RtYV9jaDsKLQlkbWFfY2FwX21hc2tfdCBkbWFfY2FwX21hc2s7CiAJaW50IGk7CiAJaW50IHJldDsKIApAQCAtNTYwLDIwICs1OTgsNiBAQAogCQlnb3RvIGVycl9jczsKIAl9CiAKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJzaXJmLHNwaS1kbWEtcngtY2hhbm5lbCIsICZyeF9kbWFfY2gpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgcnggZG1hIGNoYW5uZWxcbiIpOwotCQlnb3RvIGVycl9jczsKLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJzaXJmLHNwaS1kbWEtdHgtY2hhbm5lbCIsICZ0eF9kbWFfY2gpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgdHggZG1hIGNoYW5uZWxcbiIpOwotCQlnb3RvIGVycl9jczsKLQl9Ci0KIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqc3NwaSkgKyBzaXplb2YoaW50KSAqIG51bV9jcyk7CiAJaWYgKCFtYXN0ZXIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNQSSBtYXN0ZXJcbiIpOwpAQCAtNjM3LDE4ICs2NjEsMTMgQEAKIAlzc3BpLT5iaXRiYW5nLm1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCS8qIHJlcXVlc3QgRE1BIGNoYW5uZWxzICovCi0JZG1hX2NhcF96ZXJvKGRtYV9jYXBfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX0lOVEVSTEVBVkUsIGRtYV9jYXBfbWFzayk7Ci0KLQlzc3BpLT5yeF9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfY2FwX21hc2ssIChkbWFfZmlsdGVyX2ZuKXNpcmZzb2NfZG1hX2ZpbHRlcl9pZCwKLQkJKHZvaWQgKilyeF9kbWFfY2gpOworCXNzcGktPnJ4X2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKCZwZGV2LT5kZXYsICJyeCIpOwogCWlmICghc3NwaS0+cnhfY2hhbikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4gbm90IGFsbG9jYXRlIHJ4IGRtYSBjaGFubmVsXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBmcmVlX21hc3RlcjsKIAl9Ci0Jc3NwaS0+dHhfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX2NhcF9tYXNrLCAoZG1hX2ZpbHRlcl9mbilzaXJmc29jX2RtYV9maWx0ZXJfaWQsCi0JCSh2b2lkICopdHhfZG1hX2NoKTsKKwlzc3BpLT50eF9jaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbCgmcGRldi0+ZGV2LCAidHgiKTsKIAlpZiAoIXNzcGktPnR4X2NoYW4pIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBhbGxvY2F0ZSB0eCBkbWEgY2hhbm5lbFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CkBAIC03MjQsMTEgKzc0MywxNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHNwaV9zaXJmc29jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc2lyZnNvY19zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9tYXN0ZXJfc3VzcGVuZChtYXN0ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAljbGtfZGlzYWJsZShzc3BpLT5jbGspOwogCXJldHVybiAwOwpAQCAtNzQ1LDE1ICs3NjksMTMgQEAKIAl3cml0ZWwoU0lSRlNPQ19TUElfRklGT19TVEFSVCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX1JYRklGT19PUCk7CiAJd3JpdGVsKFNJUkZTT0NfU1BJX0ZJRk9fU1RBUlQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9UWEZJRk9fT1ApOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHNwaV9tYXN0ZXJfcmVzdW1lKG1hc3Rlcik7CiB9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzcGlfc2lyZnNvY19wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBzcGlfc2lyZnNvY19zdXNwZW5kLAotCS5yZXN1bWUgPSBzcGlfc2lyZnNvY19yZXN1bWUsCi19OwogI2VuZGlmCiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzcGlfc2lyZnNvY19wbV9vcHMsIHNwaV9zaXJmc29jX3N1c3BlbmQsCisJCQkgc3BpX3NpcmZzb2NfcmVzdW1lKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3BpX3NpcmZzb2Nfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInNpcmYscHJpbWEyLXNwaSIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzaXJmLG1hcmNvLXNwaSIsIH0sCkBAIC03NjUsOSArNzg3LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSSVZFUl9OQU1FLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KIAkJLnBtICAgICA9ICZzcGlfc2lyZnNvY19wbV9vcHMsCi0jZW5kaWYKIAkJLm9mX21hdGNoX3RhYmxlID0gc3BpX3NpcmZzb2Nfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSBzcGlfc2lyZnNvY19wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zdW40aS5jIGIvZHJpdmVycy9zcGkvc3BpLXN1bjRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NmE4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zdW40aS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxNCBBbGx3aW5uZXIgVGVjaAorICogUGFuIE5hbiA8cGFubmFuQGFsbHdpbm5lcnRlY2guY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNYXhpbWUgUmlwYXJkCisgKiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIFNVTjRJX0ZJRk9fREVQVEgJCTY0CisKKyNkZWZpbmUgU1VONElfUlhEQVRBX1JFRwkJMHgwMAorCisjZGVmaW5lIFNVTjRJX1RYREFUQV9SRUcJCTB4MDQKKworI2RlZmluZSBTVU40SV9DVExfUkVHCQkJMHgwOAorI2RlZmluZSBTVU40SV9DVExfRU5BQkxFCQkJQklUKDApCisjZGVmaW5lIFNVTjRJX0NUTF9NQVNURVIJCQlCSVQoMSkKKyNkZWZpbmUgU1VONElfQ1RMX0NQSEEJCQkJQklUKDIpCisjZGVmaW5lIFNVTjRJX0NUTF9DUE9MCQkJCUJJVCgzKQorI2RlZmluZSBTVU40SV9DVExfQ1NfQUNUSVZFX0xPVwkJCUJJVCg0KQorI2RlZmluZSBTVU40SV9DVExfTE1URgkJCQlCSVQoNikKKyNkZWZpbmUgU1VONElfQ1RMX1RGX1JTVAkJCUJJVCg4KQorI2RlZmluZSBTVU40SV9DVExfUkZfUlNUCQkJQklUKDkpCisjZGVmaW5lIFNVTjRJX0NUTF9YQ0gJCQkJQklUKDEwKQorI2RlZmluZSBTVU40SV9DVExfQ1NfTUFTSwkJCTB4MzAwMAorI2RlZmluZSBTVU40SV9DVExfQ1MoY3MpCQkJKCgoY3MpIDw8IDEyKSAmIFNVTjRJX0NUTF9DU19NQVNLKQorI2RlZmluZSBTVU40SV9DVExfREhCCQkJCUJJVCgxNSkKKyNkZWZpbmUgU1VONElfQ1RMX0NTX01BTlVBTAkJCUJJVCgxNikKKyNkZWZpbmUgU1VONElfQ1RMX0NTX0xFVkVMCQkJQklUKDE3KQorI2RlZmluZSBTVU40SV9DVExfVFAJCQkJQklUKDE4KQorCisjZGVmaW5lIFNVTjRJX0lOVF9DVExfUkVHCQkweDBjCisjZGVmaW5lIFNVTjRJX0lOVF9DVExfVEMJCQlCSVQoMTYpCisKKyNkZWZpbmUgU1VONElfSU5UX1NUQV9SRUcJCTB4MTAKKworI2RlZmluZSBTVU40SV9ETUFfQ1RMX1JFRwkJMHgxNAorCisjZGVmaW5lIFNVTjRJX1dBSVRfUkVHCQkJMHgxOAorCisjZGVmaW5lIFNVTjRJX0NMS19DVExfUkVHCQkweDFjCisjZGVmaW5lIFNVTjRJX0NMS19DVExfQ0RSMl9NQVNLCQkJMHhmZgorI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjIoZGl2KQkJCSgoZGl2KSAmIFNVTjRJX0NMS19DVExfQ0RSMl9NQVNLKQorI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjFfTUFTSwkJCTB4ZgorI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjEoZGl2KQkJCSgoKGRpdikgJiBTVU40SV9DTEtfQ1RMX0NEUjFfTUFTSykgPDwgOCkKKyNkZWZpbmUgU1VONElfQ0xLX0NUTF9EUlMJCQlCSVQoMTIpCisKKyNkZWZpbmUgU1VONElfQlVSU1RfQ05UX1JFRwkJMHgyMAorI2RlZmluZSBTVU40SV9CVVJTVF9DTlQoY250KQkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjRJX1hNSVRfQ05UX1JFRwkJMHgyNAorI2RlZmluZSBTVU40SV9YTUlUX0NOVChjbnQpCQkJKChjbnQpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgU1VONElfRklGT19TVEFfUkVHCQkweDI4CisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1JGX0NOVF9NQVNLCQkweDdmCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1JGX0NOVF9CSVRTCQkwCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1RGX0NOVF9NQVNLCQkweDdmCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1RGX0NOVF9CSVRTCQkxNgorCitzdHJ1Y3Qgc3VuNGlfc3BpIHsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXZvaWQgX19pb21lbQkJKmJhc2VfYWRkcjsKKwlzdHJ1Y3QgY2xrCQkqaGNsazsKKwlzdHJ1Y3QgY2xrCQkqbWNsazsKKworCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CisKKwljb25zdCB1OAkJKnR4X2J1ZjsKKwl1OAkJCSpyeF9idWY7CisJaW50CQkJbGVuOworfTsKKworc3RhdGljIGlubGluZSB1MzIgc3VuNGlfc3BpX3JlYWQoc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgdTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoc3NwaS0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjRpX3NwaV93cml0ZShzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpLCB1MzIgcmVnLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBzc3BpLT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VuNGlfc3BpX2RyYWluX2ZpZm8oc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgaW50IGxlbikKK3sKKwl1MzIgcmVnLCBjbnQ7CisJdTggYnl0ZTsKKworCS8qIFNlZSBob3cgbXVjaCBkYXRhIGlzIGF2YWlsYWJsZSAqLworCXJlZyA9IHN1bjRpX3NwaV9yZWFkKHNzcGksIFNVTjRJX0ZJRk9fU1RBX1JFRyk7CisJcmVnICY9IFNVTjRJX0ZJRk9fU1RBX1JGX0NOVF9NQVNLOworCWNudCA9IHJlZyA+PiBTVU40SV9GSUZPX1NUQV9SRl9DTlRfQklUUzsKKworCWlmIChsZW4gPiBjbnQpCisJCWxlbiA9IGNudDsKKworCXdoaWxlIChsZW4tLSkgeworCQlieXRlID0gcmVhZGIoc3NwaS0+YmFzZV9hZGRyICsgU1VONElfUlhEQVRBX1JFRyk7CisJCWlmIChzc3BpLT5yeF9idWYpCisJCQkqc3NwaS0+cnhfYnVmKysgPSBieXRlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjRpX3NwaV9maWxsX2ZpZm8oc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgaW50IGxlbikKK3sKKwl1OCBieXRlOworCisJaWYgKGxlbiA+IHNzcGktPmxlbikKKwkJbGVuID0gc3NwaS0+bGVuOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWJ5dGUgPSBzc3BpLT50eF9idWYgPyAqc3NwaS0+dHhfYnVmKysgOiAwOworCQl3cml0ZWIoYnl0ZSwgc3NwaS0+YmFzZV9hZGRyICsgU1VONElfVFhEQVRBX1JFRyk7CisJCXNzcGktPmxlbi0tOworCX0KK30KKworc3RhdGljIHZvaWQgc3VuNGlfc3BpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTMyIHJlZzsKKworCXJlZyA9IHN1bjRpX3NwaV9yZWFkKHNzcGksIFNVTjRJX0NUTF9SRUcpOworCisJcmVnICY9IH5TVU40SV9DVExfQ1NfTUFTSzsKKwlyZWcgfD0gU1VONElfQ1RMX0NTKHNwaS0+Y2hpcF9zZWxlY3QpOworCisJaWYgKGVuYWJsZSkKKwkJcmVnIHw9IFNVTjRJX0NUTF9DU19MRVZFTDsKKwllbHNlCisJCXJlZyAmPSB+U1VONElfQ1RMX0NTX0xFVkVMOworCisJLyoKKwkgKiBFdmVuIHRob3VnaCB0aGlzIGxvb2tzIGlycmVsZXZhbnQgc2luY2Ugd2UgYXJlIHN1cHBvc2VkIHRvCisJICogYmUgY29udHJvbGxpbmcgdGhlIGNoaXAgc2VsZWN0IG1hbnVhbGx5LCB0aGlzIGJpdCBhbHNvCisJICogY29udHJvbHMgdGhlIGxldmVscyBvZiB0aGUgY2hpcCBzZWxlY3QgZm9yIGluYWN0aXZlCisJICogZGV2aWNlcy4KKwkgKgorCSAqIElmIHdlIGRvbid0IHNldCBpdCwgdGhlIGNoaXAgc2VsZWN0IGxldmVsIHdpbGwgZ28gbG93IGJ5CisJICogZGVmYXVsdCB3aGVuIHRoZSBkZXZpY2UgaXMgaWRsZSwgd2hpY2ggaXMgbm90IHJlYWxseQorCSAqIGV4cGVjdGVkIGluIHRoZSBjb21tb24gY2FzZSB3aGVyZSB0aGUgY2hpcCBzZWxlY3QgaXMgYWN0aXZlCisJICogbG93LgorCSAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJcmVnICY9IH5TVU40SV9DVExfQ1NfQUNUSVZFX0xPVzsKKwllbHNlCisJCXJlZyB8PSBTVU40SV9DVExfQ1NfQUNUSVZFX0xPVzsKKworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9DVExfUkVHLCByZWcpOworfQorCitzdGF0aWMgaW50IHN1bjRpX3NwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIpCit7CisJc3RydWN0IHN1bjRpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgbWNsa19yYXRlLCBkaXYsIHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IHR4X2xlbiA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIHJlZzsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgdHJhbnNmZXIgbGFyZ2VyIHRoYW4gdGhlIEZJRk8gKi8KKwlpZiAodGZyLT5sZW4gPiBTVU40SV9GSUZPX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZzc3BpLT5kb25lKTsKKwlzc3BpLT50eF9idWYgPSB0ZnItPnR4X2J1ZjsKKwlzc3BpLT5yeF9idWYgPSB0ZnItPnJ4X2J1ZjsKKwlzc3BpLT5sZW4gPSB0ZnItPmxlbjsKKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9JTlRfU1RBX1JFRywgfjApOworCisKKwlyZWcgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9DVExfUkVHKTsKKworCS8qIFJlc2V0IEZJRk9zICovCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NUTF9SRUcsCisJCQlyZWcgfCBTVU40SV9DVExfUkZfUlNUIHwgU1VONElfQ1RMX1RGX1JTVCk7CisKKwkvKgorCSAqIFNldHVwIHRoZSB0cmFuc2ZlciBjb250cm9sIHJlZ2lzdGVyOiBDaGlwIFNlbGVjdCwKKwkgKiBwb2xhcml0aWVzLCBldGMuCisJICovCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQlyZWcgfD0gU1VONElfQ1RMX0NQT0w7CisJZWxzZQorCQlyZWcgJj0gflNVTjRJX0NUTF9DUE9MOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gU1VONElfQ1RMX0NQSEE7CisJZWxzZQorCQlyZWcgJj0gflNVTjRJX0NUTF9DUEhBOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpCisJCXJlZyB8PSBTVU40SV9DVExfTE1URjsKKwllbHNlCisJCXJlZyAmPSB+U1VONElfQ1RMX0xNVEY7CisKKworCS8qCisJICogSWYgaXQncyBhIFRYIG9ubHkgdHJhbnNmZXIsIHdlIGRvbid0IHdhbnQgdG8gZmlsbCB0aGUgUlgKKwkgKiBGSUZPIHdpdGggYm9ndXMgZGF0YQorCSAqLworCWlmIChzc3BpLT5yeF9idWYpCisJCXJlZyAmPSB+U1VONElfQ1RMX0RIQjsKKwllbHNlCisJCXJlZyB8PSBTVU40SV9DVExfREhCOworCisJLyogV2Ugd2FudCB0byBjb250cm9sIHRoZSBjaGlwIHNlbGVjdCBtYW51YWxseSAqLworCXJlZyB8PSBTVU40SV9DVExfQ1NfTUFOVUFMOworCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NUTF9SRUcsIHJlZyk7CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgcGFyZW50IGNsb2NrIGZhc3QgZW5vdWdoICovCisJbWNsa19yYXRlID0gY2xrX2dldF9yYXRlKHNzcGktPm1jbGspOworCWlmIChtY2xrX3JhdGUgPCAoMiAqIHNwaS0+bWF4X3NwZWVkX2h6KSkgeworCQljbGtfc2V0X3JhdGUoc3NwaS0+bWNsaywgMiAqIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJbWNsa19yYXRlID0gY2xrX2dldF9yYXRlKHNzcGktPm1jbGspOworCX0KKworCS8qCisJICogU2V0dXAgY2xvY2sgZGl2aWRlci4KKwkgKgorCSAqIFdlIGhhdmUgdHdvIGNob2ljZXMgdGhlcmUuIEVpdGhlciB3ZSBjYW4gdXNlIHRoZSBjbG9jaworCSAqIGRpdmlkZSByYXRlIDEsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIHRoaXMgZm9ybXVsYToKKwkgKiBTUElfQ0xLID0gTU9EX0NMSyAvICgyIF4gKGNkciArIDEpKQorCSAqIE9yIHdlIGNhbiB1c2UgQ0RSMiwgd2hpY2ggaXMgY2FsY3VsYXRlZCB3aXRoIHRoZSBmb3JtdWxhOgorCSAqIFNQSV9DTEsgPSBNT0RfQ0xLIC8gKDIgKiAoY2RyICsgMSkpCisJICogV2V0aGVyIHdlIHVzZSB0aGUgZm9ybWVyIG9yIHRoZSBsYXR0ZXIgaXMgc2V0IHRocm91Z2ggdGhlCisJICogRFJTIGJpdC4KKwkgKgorCSAqIEZpcnN0IHRyeSBDRFIyLCBhbmQgaWYgd2UgY2FuJ3QgcmVhY2ggdGhlIGV4cGVjdGVkCisJICogZnJlcXVlbmN5LCBmYWxsIGJhY2sgdG8gQ0RSMS4KKwkgKi8KKwlkaXYgPSBtY2xrX3JhdGUgLyAoMiAqIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwlpZiAoZGl2IDw9IChTVU40SV9DTEtfQ1RMX0NEUjJfTUFTSyArIDEpKSB7CisJCWlmIChkaXYgPiAwKQorCQkJZGl2LS07CisKKwkJcmVnID0gU1VONElfQ0xLX0NUTF9DRFIyKGRpdikgfCBTVU40SV9DTEtfQ1RMX0RSUzsKKwl9IGVsc2UgeworCQlkaXYgPSBpbG9nMihtY2xrX3JhdGUpIC0gaWxvZzIoc3BpLT5tYXhfc3BlZWRfaHopOworCQlyZWcgPSBTVU40SV9DTEtfQ1RMX0NEUjEoZGl2KTsKKwl9CisKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ0xLX0NUTF9SRUcsIHJlZyk7CisKKwkvKiBTZXR1cCB0aGUgdHJhbnNmZXIgbm93Li4uICovCisJaWYgKHNzcGktPnR4X2J1ZikKKwkJdHhfbGVuID0gdGZyLT5sZW47CisKKwkvKiBTZXR1cCB0aGUgY291bnRlcnMgKi8KKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQlVSU1RfQ05UX1JFRywgU1VONElfQlVSU1RfQ05UKHRmci0+bGVuKSk7CisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX1hNSVRfQ05UX1JFRywgU1VONElfWE1JVF9DTlQodHhfbGVuKSk7CisKKwkvKiBGaWxsIHRoZSBUWCBGSUZPICovCisJc3VuNGlfc3BpX2ZpbGxfZmlmbyhzc3BpLCBTVU40SV9GSUZPX0RFUFRIKTsKKworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9JTlRfQ1RMX1JFRywgU1VONElfSU5UX0NUTF9UQyk7CisKKwkvKiBTdGFydCB0aGUgdHJhbnNmZXIgKi8KKwlyZWcgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9DVExfUkVHKTsKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ1RMX1JFRywgcmVnIHwgU1VONElfQ1RMX1hDSCk7CisKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzc3BpLT5kb25lLAorCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlpZiAoIXRpbWVvdXQpIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3VuNGlfc3BpX2RyYWluX2ZpZm8oc3NwaSwgU1VONElfRklGT19ERVBUSCk7CisKK291dDoKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfSU5UX0NUTF9SRUcsIDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHN1bjRpX3NwaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gZGV2X2lkOworCXUzMiBzdGF0dXMgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9JTlRfU1RBX1JFRyk7CisKKwkvKiBUcmFuc2ZlciBjb21wbGV0ZSAqLworCWlmIChzdGF0dXMgJiBTVU40SV9JTlRfQ1RMX1RDKSB7CisJCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9JTlRfU1RBX1JFRywgU1VONElfSU5UX0NUTF9UQyk7CisJCWNvbXBsZXRlKCZzc3BpLT5kb25lKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCBzdW40aV9zcGlfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3NwaS0+aGNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGVuYWJsZSBBSEIgY2xvY2tcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3NwaS0+bWNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGVuYWJsZSBtb2R1bGUgY2xvY2tcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ1RMX1JFRywKKwkJCVNVTjRJX0NUTF9FTkFCTEUgfCBTVU40SV9DVExfTUFTVEVSIHwgU1VONElfQ1RMX1RQKTsKKworCXJldHVybiAwOworCitlcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfc3BpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdW40aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3NwaS0+bWNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpOworCXN0cnVjdCByZXNvdXJjZQkqcmVzOworCWludCByZXQgPSAwLCBpcnE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3VuNGlfc3BpKSk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNQSSBNYXN0ZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCXNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXNzcGktPmJhc2VfYWRkciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoc3NwaS0+YmFzZV9hZGRyKSkgeworCQlyZXQgPSBQVFJfRVJSKHNzcGktPmJhc2VfYWRkcik7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gc3BpIElSUSBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBzdW40aV9zcGlfaGFuZGxlciwKKwkJCSAgICAgICAwLCAic3VuNGktc3BpIiwgc3NwaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlzc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisJbWFzdGVyLT5zZXRfY3MgPSBzdW40aV9zcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3VuNGlfc3BpX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1Q7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKworCXNzcGktPmhjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFoYiIpOworCWlmIChJU19FUlIoc3NwaS0+aGNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgQUhCIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5oY2xrKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJc3NwaS0+bWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibW9kIik7CisJaWYgKElTX0VSUihzc3BpLT5tY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWNxdWlyZSBtb2R1bGUgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNzcGktPm1jbGspOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnNzcGktPmRvbmUpOworCisJLyoKKwkgKiBUaGlzIHdha2UtdXAvc2h1dGRvd24gcGF0dGVybiBpcyB0byBiZSBhYmxlIHRvIGhhdmUgdGhlCisJICogZGV2aWNlIHdva2VuIHVwLCBldmVuIGlmIHJ1bnRpbWVfcG0gaXMgZGlzYWJsZWQKKwkgKi8KKwlyZXQgPSBzdW40aV9zcGlfcnVudGltZV9yZXN1bWUoJnBkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCByZXN1bWUgdGhlIGRldmljZVxuIik7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2lkbGUoJnBkZXYtPmRldik7CisKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZWdpc3RlciBTUEkgbWFzdGVyXG4iKTsKKwkJZ290byBlcnJfcG1fZGlzYWJsZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BtX2Rpc2FibGU6CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXN1bjRpX3NwaV9ydW50aW1lX3N1c3BlbmQoJnBkZXYtPmRldik7CitlcnJfZnJlZV9tYXN0ZXI6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjRpX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfc3BpX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNwaSIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW40aV9zcGlfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3VuNGlfc3BpX3BtX29wcyA9IHsKKwkucnVudGltZV9yZXN1bWUJCT0gc3VuNGlfc3BpX3J1bnRpbWVfcmVzdW1lLAorCS5ydW50aW1lX3N1c3BlbmQJPSBzdW40aV9zcGlfcnVudGltZV9zdXNwZW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuNGlfc3BpX2RyaXZlciA9IHsKKwkucHJvYmUJPSBzdW40aV9zcGlfcHJvYmUsCisJLnJlbW92ZQk9IHN1bjRpX3NwaV9yZW1vdmUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJCT0gInN1bjRpLXNwaSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuNGlfc3BpX21hdGNoLAorCQkucG0JCT0gJnN1bjRpX3NwaV9wbV9vcHMsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjRpX3NwaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJQYW4gTmFuIDxwYW5uYW5AYWxsd2lubmVydGVjaC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIEExWC9BMjAgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc3VuNmkuYyBiL2RyaXZlcnMvc3BpL3NwaS1zdW42aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTM0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktc3VuNmkuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTQgQWxsd2lubmVyIFRlY2gKKyAqIFBhbiBOYW4gPHBhbm5hbkBhbGx3aW5uZXJ0ZWNoLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTWF4aW1lIFJpcGFyZAorICogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIFNVTjZJX0ZJRk9fREVQVEgJCTEyOAorCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfUkVHCQkweDA0CisjZGVmaW5lIFNVTjZJX0dCTF9DVExfQlVTX0VOQUJMRQkJQklUKDApCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfTUFTVEVSCQkJQklUKDEpCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfVFAJCQlCSVQoNykKKyNkZWZpbmUgU1VONklfR0JMX0NUTF9SU1QJCQlCSVQoMzEpCisKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9SRUcJCTB4MDgKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DUEhBCQkJQklUKDApCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfQ1BPTAkJCUJJVCgxKQorI2RlZmluZSBTVU42SV9URlJfQ1RMX1NQT0wJCQlCSVQoMikKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DU19NQVNLCQkJMHgzMAorI2RlZmluZSBTVU42SV9URlJfQ1RMX0NTKGNzKQkJCSgoKGNzKSA8PCA0KSAmIFNVTjZJX1RGUl9DVExfQ1NfTUFTSykKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DU19NQU5VQUwJCQlCSVQoNikKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DU19MRVZFTAkJCUJJVCg3KQorI2RlZmluZSBTVU42SV9URlJfQ1RMX0RIQgkJCUJJVCg4KQorI2RlZmluZSBTVU42SV9URlJfQ1RMX0ZCUwkJCUJJVCgxMikKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9YQ0gJCQlCSVQoMzEpCisKKyNkZWZpbmUgU1VONklfSU5UX0NUTF9SRUcJCTB4MTAKKyNkZWZpbmUgU1VONklfSU5UX0NUTF9SRl9PVkYJCQlCSVQoOCkKKyNkZWZpbmUgU1VONklfSU5UX0NUTF9UQwkJCUJJVCgxMikKKworI2RlZmluZSBTVU42SV9JTlRfU1RBX1JFRwkJMHgxNAorCisjZGVmaW5lIFNVTjZJX0ZJRk9fQ1RMX1JFRwkJMHgxOAorI2RlZmluZSBTVU42SV9GSUZPX0NUTF9SRl9SU1QJCQlCSVQoMTUpCisjZGVmaW5lIFNVTjZJX0ZJRk9fQ1RMX1RGX1JTVAkJCUJJVCgzMSkKKworI2RlZmluZSBTVU42SV9GSUZPX1NUQV9SRUcJCTB4MWMKKyNkZWZpbmUgU1VONklfRklGT19TVEFfUkZfQ05UX01BU0sJCTB4N2YKKyNkZWZpbmUgU1VONklfRklGT19TVEFfUkZfQ05UX0JJVFMJCTAKKyNkZWZpbmUgU1VONklfRklGT19TVEFfVEZfQ05UX01BU0sJCTB4N2YKKyNkZWZpbmUgU1VONklfRklGT19TVEFfVEZfQ05UX0JJVFMJCTE2CisKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9SRUcJCTB4MjQKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9DRFIyX01BU0sJCQkweGZmCisjZGVmaW5lIFNVTjZJX0NMS19DVExfQ0RSMihkaXYpCQkJKCgoZGl2KSAmIFNVTjZJX0NMS19DVExfQ0RSMl9NQVNLKSA8PCAwKQorI2RlZmluZSBTVU42SV9DTEtfQ1RMX0NEUjFfTUFTSwkJCTB4ZgorI2RlZmluZSBTVU42SV9DTEtfQ1RMX0NEUjEoZGl2KQkJCSgoKGRpdikgJiBTVU42SV9DTEtfQ1RMX0NEUjFfTUFTSykgPDwgOCkKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9EUlMJCQlCSVQoMTIpCisKKyNkZWZpbmUgU1VONklfQlVSU1RfQ05UX1JFRwkJMHgzMAorI2RlZmluZSBTVU42SV9CVVJTVF9DTlQoY250KQkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjZJX1hNSVRfQ05UX1JFRwkJMHgzNAorI2RlZmluZSBTVU42SV9YTUlUX0NOVChjbnQpCQkJKChjbnQpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgU1VONklfQlVSU1RfQ1RMX0NOVF9SRUcJCTB4MzgKKyNkZWZpbmUgU1VONklfQlVSU1RfQ1RMX0NOVF9TVEMoY250KQkJKChjbnQpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgU1VONklfVFhEQVRBX1JFRwkJMHgyMDAKKyNkZWZpbmUgU1VONklfUlhEQVRBX1JFRwkJMHgzMDAKKworc3RydWN0IHN1bjZpX3NwaSB7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwl2b2lkIF9faW9tZW0JCSpiYXNlX2FkZHI7CisJc3RydWN0IGNsawkJKmhjbGs7CisJc3RydWN0IGNsawkJKm1jbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wJKnJzdGM7CisKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCisJY29uc3QgdTgJCSp0eF9idWY7CisJdTgJCQkqcnhfYnVmOworCWludAkJCWxlbjsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHN1bjZpX3NwaV9yZWFkKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKHNzcGktPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW42aV9zcGlfd3JpdGUoc3RydWN0IHN1bjZpX3NwaSAqc3NwaSwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgc3NwaS0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjZpX3NwaV9kcmFpbl9maWZvKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIGludCBsZW4pCit7CisJdTMyIHJlZywgY250OworCXU4IGJ5dGU7CisKKwkvKiBTZWUgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUgKi8KKwlyZWcgPSBzdW42aV9zcGlfcmVhZChzc3BpLCBTVU42SV9GSUZPX1NUQV9SRUcpOworCXJlZyAmPSBTVU42SV9GSUZPX1NUQV9SRl9DTlRfTUFTSzsKKwljbnQgPSByZWcgPj4gU1VONklfRklGT19TVEFfUkZfQ05UX0JJVFM7CisKKwlpZiAobGVuID4gY250KQorCQlsZW4gPSBjbnQ7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJYnl0ZSA9IHJlYWRiKHNzcGktPmJhc2VfYWRkciArIFNVTjZJX1JYREFUQV9SRUcpOworCQlpZiAoc3NwaS0+cnhfYnVmKQorCQkJKnNzcGktPnJ4X2J1ZisrID0gYnl0ZTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW42aV9zcGlfZmlsbF9maWZvKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIGludCBsZW4pCit7CisJdTggYnl0ZTsKKworCWlmIChsZW4gPiBzc3BpLT5sZW4pCisJCWxlbiA9IHNzcGktPmxlbjsKKworCXdoaWxlIChsZW4tLSkgeworCQlieXRlID0gc3NwaS0+dHhfYnVmID8gKnNzcGktPnR4X2J1ZisrIDogMDsKKwkJd3JpdGViKGJ5dGUsIHNzcGktPmJhc2VfYWRkciArIFNVTjZJX1RYREFUQV9SRUcpOworCQlzc3BpLT5sZW4tLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN1bjZpX3NwaV9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXUzMiByZWc7CisKKwlyZWcgPSBzdW42aV9zcGlfcmVhZChzc3BpLCBTVU42SV9URlJfQ1RMX1JFRyk7CisJcmVnICY9IH5TVU42SV9URlJfQ1RMX0NTX01BU0s7CisJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1Moc3BpLT5jaGlwX3NlbGVjdCk7CisKKwlpZiAoZW5hYmxlKQorCQlyZWcgfD0gU1VONklfVEZSX0NUTF9DU19MRVZFTDsKKwllbHNlCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9DU19MRVZFTDsKKworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9URlJfQ1RMX1JFRywgcmVnKTsKK30KKworCitzdGF0aWMgaW50IHN1bjZpX3NwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIpCit7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgbWNsa19yYXRlLCBkaXYsIHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IHR4X2xlbiA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIHJlZzsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgdHJhbnNmZXIgbGFyZ2VyIHRoYW4gdGhlIEZJRk8gKi8KKwlpZiAodGZyLT5sZW4gPiBTVU42SV9GSUZPX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZzc3BpLT5kb25lKTsKKwlzc3BpLT50eF9idWYgPSB0ZnItPnR4X2J1ZjsKKwlzc3BpLT5yeF9idWYgPSB0ZnItPnJ4X2J1ZjsKKwlzc3BpLT5sZW4gPSB0ZnItPmxlbjsKKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9JTlRfU1RBX1JFRywgfjApOworCisJLyogUmVzZXQgRklGTyAqLworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9GSUZPX0NUTF9SRUcsCisJCQlTVU42SV9GSUZPX0NUTF9SRl9SU1QgfCBTVU42SV9GSUZPX0NUTF9URl9SU1QpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgdHJhbnNmZXIgY29udHJvbCByZWdpc3RlcjogQ2hpcCBTZWxlY3QsCisJICogcG9sYXJpdGllcywgZXRjLgorCSAqLworCXJlZyA9IHN1bjZpX3NwaV9yZWFkKHNzcGksIFNVTjZJX1RGUl9DVExfUkVHKTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1BPTDsKKwllbHNlCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9DUE9MOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gU1VONklfVEZSX0NUTF9DUEhBOworCWVsc2UKKwkJcmVnICY9IH5TVU42SV9URlJfQ1RMX0NQSEE7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfRkJTOworCWVsc2UKKwkJcmVnICY9IH5TVU42SV9URlJfQ1RMX0ZCUzsKKworCS8qCisJICogSWYgaXQncyBhIFRYIG9ubHkgdHJhbnNmZXIsIHdlIGRvbid0IHdhbnQgdG8gZmlsbCB0aGUgUlgKKwkgKiBGSUZPIHdpdGggYm9ndXMgZGF0YQorCSAqLworCWlmIChzc3BpLT5yeF9idWYpCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9ESEI7CisJZWxzZQorCQlyZWcgfD0gU1VONklfVEZSX0NUTF9ESEI7CisKKwkvKiBXZSB3YW50IHRvIGNvbnRyb2wgdGhlIGNoaXAgc2VsZWN0IG1hbnVhbGx5ICovCisJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1NfTUFOVUFMOworCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX1RGUl9DVExfUkVHLCByZWcpOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHBhcmVudCBjbG9jayBmYXN0IGVub3VnaCAqLworCW1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc3BpLT5tY2xrKTsKKwlpZiAobWNsa19yYXRlIDwgKDIgKiBzcGktPm1heF9zcGVlZF9oeikpIHsKKwkJY2xrX3NldF9yYXRlKHNzcGktPm1jbGssIDIgKiBzcGktPm1heF9zcGVlZF9oeik7CisJCW1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc3BpLT5tY2xrKTsKKwl9CisKKwkvKgorCSAqIFNldHVwIGNsb2NrIGRpdmlkZXIuCisJICoKKwkgKiBXZSBoYXZlIHR3byBjaG9pY2VzIHRoZXJlLiBFaXRoZXIgd2UgY2FuIHVzZSB0aGUgY2xvY2sKKwkgKiBkaXZpZGUgcmF0ZSAxLCB3aGljaCBpcyBjYWxjdWxhdGVkIHRoYW5rcyB0byB0aGlzIGZvcm11bGE6CisJICogU1BJX0NMSyA9IE1PRF9DTEsgLyAoMiBeIGNkcikKKwkgKiBPciB3ZSBjYW4gdXNlIENEUjIsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgd2l0aCB0aGUgZm9ybXVsYToKKwkgKiBTUElfQ0xLID0gTU9EX0NMSyAvICgyICogKGNkciArIDEpKQorCSAqIFdldGhlciB3ZSB1c2UgdGhlIGZvcm1lciBvciB0aGUgbGF0dGVyIGlzIHNldCB0aHJvdWdoIHRoZQorCSAqIERSUyBiaXQuCisJICoKKwkgKiBGaXJzdCB0cnkgQ0RSMiwgYW5kIGlmIHdlIGNhbid0IHJlYWNoIHRoZSBleHBlY3RlZAorCSAqIGZyZXF1ZW5jeSwgZmFsbCBiYWNrIHRvIENEUjEuCisJICovCisJZGl2ID0gbWNsa19yYXRlIC8gKDIgKiBzcGktPm1heF9zcGVlZF9oeik7CisJaWYgKGRpdiA8PSAoU1VONklfQ0xLX0NUTF9DRFIyX01BU0sgKyAxKSkgeworCQlpZiAoZGl2ID4gMCkKKwkJCWRpdi0tOworCisJCXJlZyA9IFNVTjZJX0NMS19DVExfQ0RSMihkaXYpIHwgU1VONklfQ0xLX0NUTF9EUlM7CisJfSBlbHNlIHsKKwkJZGl2ID0gaWxvZzIobWNsa19yYXRlKSAtIGlsb2cyKHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJcmVnID0gU1VONklfQ0xLX0NUTF9DRFIxKGRpdik7CisJfQorCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0NMS19DVExfUkVHLCByZWcpOworCisJLyogU2V0dXAgdGhlIHRyYW5zZmVyIG5vdy4uLiAqLworCWlmIChzc3BpLT50eF9idWYpCisJCXR4X2xlbiA9IHRmci0+bGVuOworCisJLyogU2V0dXAgdGhlIGNvdW50ZXJzICovCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0JVUlNUX0NOVF9SRUcsIFNVTjZJX0JVUlNUX0NOVCh0ZnItPmxlbikpOworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9YTUlUX0NOVF9SRUcsIFNVTjZJX1hNSVRfQ05UKHR4X2xlbikpOworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9CVVJTVF9DVExfQ05UX1JFRywKKwkJCVNVTjZJX0JVUlNUX0NUTF9DTlRfU1RDKHR4X2xlbikpOworCisJLyogRmlsbCB0aGUgVFggRklGTyAqLworCXN1bjZpX3NwaV9maWxsX2ZpZm8oc3NwaSwgU1VONklfRklGT19ERVBUSCk7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgKi8KKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfSU5UX0NUTF9SRUcsIFNVTjZJX0lOVF9DVExfVEMpOworCisJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCisJcmVnID0gc3VuNmlfc3BpX3JlYWQoc3NwaSwgU1VONklfVEZSX0NUTF9SRUcpOworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9URlJfQ1RMX1JFRywgcmVnIHwgU1VONklfVEZSX0NUTF9YQ0gpOworCisJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc3NwaS0+ZG9uZSwKKwkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJaWYgKCF0aW1lb3V0KSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCXN1bjZpX3NwaV9kcmFpbl9maWZvKHNzcGksIFNVTjZJX0ZJRk9fREVQVEgpOworCitvdXQ6CisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0lOVF9DVExfUkVHLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW42aV9zcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IGRldl9pZDsKKwl1MzIgc3RhdHVzID0gc3VuNmlfc3BpX3JlYWQoc3NwaSwgU1VONklfSU5UX1NUQV9SRUcpOworCisJLyogVHJhbnNmZXIgY29tcGxldGUgKi8KKwlpZiAoc3RhdHVzICYgU1VONklfSU5UX0NUTF9UQykgeworCQlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfSU5UX1NUQV9SRUcsIFNVTjZJX0lOVF9DVExfVEMpOworCQljb21wbGV0ZSgmc3NwaS0+ZG9uZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNzcGktPmhjbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBlbmFibGUgQUhCIGNsb2NrXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNzcGktPm1jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBlbmFibGUgbW9kdWxlIGNsb2NrXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChzc3BpLT5yc3RjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgZGVhc3NlcnQgdGhlIGRldmljZSBmcm9tIHJlc2V0XG4iKTsKKwkJZ290byBlcnIyOworCX0KKworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9HQkxfQ1RMX1JFRywKKwkJCVNVTjZJX0dCTF9DVExfQlVTX0VOQUJMRSB8IFNVTjZJX0dCTF9DVExfTUFTVEVSIHwgU1VONklfR0JMX0NUTF9UUCk7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3NwaS0+bWNsayk7CitlcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdW42aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXNldF9jb250cm9sX2Fzc2VydChzc3BpLT5yc3RjKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3NwaS0+bWNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgc3VuNmlfc3BpICpzc3BpOworCXN0cnVjdCByZXNvdXJjZQkqcmVzOworCWludCByZXQgPSAwLCBpcnE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3VuNmlfc3BpKSk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNQSSBNYXN0ZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCXNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXNzcGktPmJhc2VfYWRkciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoc3NwaS0+YmFzZV9hZGRyKSkgeworCQlyZXQgPSBQVFJfRVJSKHNzcGktPmJhc2VfYWRkcik7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gc3BpIElSUSBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBzdW42aV9zcGlfaGFuZGxlciwKKwkJCSAgICAgICAwLCAic3VuNmktc3BpIiwgc3NwaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlzc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisJbWFzdGVyLT5zZXRfY3MgPSBzdW42aV9zcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3VuNmlfc3BpX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1Q7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKworCXNzcGktPmhjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFoYiIpOworCWlmIChJU19FUlIoc3NwaS0+aGNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgQUhCIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5oY2xrKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJc3NwaS0+bWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibW9kIik7CisJaWYgKElTX0VSUihzc3BpLT5tY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWNxdWlyZSBtb2R1bGUgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNzcGktPm1jbGspOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnNzcGktPmRvbmUpOworCisJc3NwaS0+cnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihzc3BpLT5yc3RjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBnZXQgcmVzZXQgY29udHJvbGxlclxuIik7CisJCXJldCA9IFBUUl9FUlIoc3NwaS0+cnN0Yyk7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCS8qCisJICogVGhpcyB3YWtlLXVwL3NodXRkb3duIHBhdHRlcm4gaXMgdG8gYmUgYWJsZSB0byBoYXZlIHRoZQorCSAqIGRldmljZSB3b2tlbiB1cCwgZXZlbiBpZiBydW50aW1lX3BtIGlzIGRpc2FibGVkCisJICovCisJcmV0ID0gc3VuNmlfc3BpX3J1bnRpbWVfcmVzdW1lKCZwZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVzdW1lIHRoZSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9pZGxlKCZwZGV2LT5kZXYpOworCisJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7CisJCWdvdG8gZXJyX3BtX2Rpc2FibGU7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wbV9kaXNhYmxlOgorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlzdW42aV9zcGlfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworZXJyX2ZyZWVfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdW42aV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjZpX3NwaV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1zcGkiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNmlfc3BpX21hdGNoKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN1bjZpX3NwaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfcmVzdW1lCQk9IHN1bjZpX3NwaV9ydW50aW1lX3Jlc3VtZSwKKwkucnVudGltZV9zdXNwZW5kCT0gc3VuNmlfc3BpX3J1bnRpbWVfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjZpX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNmlfc3BpX3Byb2JlLAorCS5yZW1vdmUJPSBzdW42aV9zcGlfcmVtb3ZlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCQk9ICJzdW42aS1zcGkiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IHN1bjZpX3NwaV9tYXRjaCwKKwkJLnBtCQk9ICZzdW42aV9zcGlfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW42aV9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUGFuIE5hbiA8cGFubmFuQGFsbHdpbm5lcnRlY2guY29tPiIpOworTU9EVUxFX0FVVEhPUigiTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFsbHdpbm5lciBBMzEgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGVncmExMTQuYyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTExNC5jCmluZGV4IDQxM2M3MTguLjQwMDY0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTExNC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTExNC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNzIsNyArMTcxLDYgQEAKIAl2b2lkIF9faW9tZW0JCQkJKmJhc2U7CiAJcGh5c19hZGRyX3QJCQkJcGh5czsKIAl1bnNpZ25lZAkJCQlpcnE7Ci0JdTMyCQkJCQlzcGlfbWF4X2ZyZXF1ZW5jeTsKIAl1MzIJCQkJCWN1cl9zcGVlZDsKIAogCXN0cnVjdCBzcGlfZGV2aWNlCQkJKmN1cl9zcGk7CkBAIC03NjEsMTEgKzc1OSw2IEBACiAJCXNwaS0+bW9kZSAmIFNQSV9DUEhBID8gIiIgOiAifiIsCiAJCXNwaS0+bWF4X3NwZWVkX2h6KTsKIAotCUJVR19PTihzcGktPmNoaXBfc2VsZWN0ID49IE1BWF9DSElQX1NFTEVDVCk7Ci0KLQkvKiBTZXQgc3BlZWQgdG8gdGhlIHNwaSBtYXggZmVxdWVuY3kgaWYgc3BpIGRldmljZSBoYXMgbm90IHNldCAqLwotCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHogPyA6IHRzcGktPnNwaV9tYXhfZnJlcXVlbmN5OwotCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyh0c3BpLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIodHNwaS0+ZGV2LCAicG0gcnVudGltZSBmYWlsZWQsIGUgPSAlZFxuIiwgcmV0KTsKQEAgLTg1Myw4ICs4NDYsOCBAQAogCQkJCQlTUElfQ09NTUFORDEpOwogCQkJdGVncmFfc3BpX3RyYW5zZmVyX2RlbGF5KHhmZXItPmRlbGF5X3VzZWNzKTsKIAkJCWdvdG8gZXhpdDsKLQkJfSBlbHNlIGlmIChtc2ctPnRyYW5zZmVycy5wcmV2ID09ICZ4ZmVyLT50cmFuc2Zlcl9saXN0KSB7Ci0JCQkvKiBUaGlzIGlzIHRoZSBsYXN0IHRyYW5zZmVyIGluIG1lc3NhZ2UgKi8KKwkJfSBlbHNlIGlmIChsaXN0X2lzX2xhc3QoJnhmZXItPnRyYW5zZmVyX2xpc3QsCisJCQkJCSZtc2ctPnRyYW5zZmVycykpIHsKIAkJCWlmICh4ZmVyLT5jc19jaGFuZ2UpCiAJCQkJdHNwaS0+Y3NfY29udHJvbCA9IHNwaTsKIAkJCWVsc2UgewpAQCAtMTAxOSwxNiArMTAxMiw2IEBACiAJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKIH0KIAotc3RhdGljIHZvaWQgdGVncmFfc3BpX3BhcnNlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0Jc3RydWN0IHRlZ3JhX3NwaV9kYXRhICp0c3BpKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNwaS1tYXgtZnJlcXVlbmN5IiwKLQkJCQkmdHNwaS0+c3BpX21heF9mcmVxdWVuY3kpKQotCQl0c3BpLT5zcGlfbWF4X2ZyZXF1ZW5jeSA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwotfQotCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9zcGlfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1zcGkiLCB9LAogCXt9CkBAIC0xMDUwLDE1ICsxMDMzLDE1IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAl0c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCi0JLyogUGFyc2UgRFQgKi8KLQl0ZWdyYV9zcGlfcGFyc2VfZHQocGRldiwgdHNwaSk7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAic3BpLW1heC1mcmVxdWVuY3kiLAorCQkJCSAmbWFzdGVyLT5tYXhfc3BlZWRfaHopKQorCQltYXN0ZXItPm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwogCiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CiAJbWFzdGVyLT5zZXR1cCA9IHRlZ3JhX3NwaV9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gdGVncmFfc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBNQVhfQ0hJUF9TRUxFQ1Q7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOwogCiAJdHNwaS0+bWFzdGVyID0gbWFzdGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2ZsYXNoLmMgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zZmxhc2guYwppbmRleCAwODc5NDk3Li40Nzg2OWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zZmxhc2guYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zZmxhc2guYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTIxLDcgKzEyMCw2IEBACiAJc3RydWN0IHJlc2V0X2NvbnRyb2wJCQkqcnN0OwogCXZvaWQgX19pb21lbQkJCQkqYmFzZTsKIAl1bnNpZ25lZAkJCQlpcnE7Ci0JdTMyCQkJCQlzcGlfbWF4X2ZyZXF1ZW5jeTsKIAl1MzIJCQkJCWN1cl9zcGVlZDsKIAogCXN0cnVjdCBzcGlfZGV2aWNlCQkJKmN1cl9zcGk7CkBAIC0zMTUsMTUgKzMxMyw2IEBACiAJcmV0dXJuIHRlZ3JhX3NmbGFzaF9zdGFydF9jcHVfYmFzZWRfdHJhbnNmZXIodHNkLCB0KTsKIH0KIAotc3RhdGljIGludCB0ZWdyYV9zZmxhc2hfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgdGVncmFfc2ZsYXNoX2RhdGEgKnRzZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JLyogU2V0IHNwZWVkIHRvIHRoZSBzcGkgbWF4IGZlcXVlbmN5IGlmIHNwaSBkZXZpY2UgaGFzIG5vdCBzZXQgKi8KLQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6ID8gOiB0c2QtPnNwaV9tYXhfZnJlcXVlbmN5OwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHRlZ3JhX3NmbGFzaF90cmFuc2Zlcl9vbmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAogCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CkBAIC00MzAsMTUgKzQxOSw2IEBACiAJcmV0dXJuIGhhbmRsZV9jcHVfYmFzZWRfeGZlcih0c2QpOwogfQogCi1zdGF0aWMgdm9pZCB0ZWdyYV9zZmxhc2hfcGFyc2VfZHQoc3RydWN0IHRlZ3JhX3NmbGFzaF9kYXRhICp0c2QpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHRzZC0+ZGV2LT5vZl9ub2RlOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3BpLW1heC1mcmVxdWVuY3kiLAotCQkJCQkmdHNkLT5zcGlfbWF4X2ZyZXF1ZW5jeSkpCi0JCXRzZC0+c3BpX21heF9mcmVxdWVuY3kgPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KLX0KLQogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfc2ZsYXNoX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZmxhc2giLCB9LAogCXt9CkBAIC00NjcsMTEgKzQ0Nyw5IEBACiAKIAkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEE7Ci0JbWFzdGVyLT5zZXR1cCA9IHRlZ3JhX3NmbGFzaF9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gdGVncmFfc2ZsYXNoX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gTUFYX0NISVBfU0VMRUNUOwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAl0c2QgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CkBAIC00NzksNyArNDU3LDkgQEAKIAl0c2QtPmRldiA9ICZwZGV2LT5kZXY7CiAJc3Bpbl9sb2NrX2luaXQoJnRzZC0+bG9jayk7CiAKLQl0ZWdyYV9zZmxhc2hfcGFyc2VfZHQodHNkKTsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIodHNkLT5kZXYtPm9mX25vZGUsICJzcGktbWF4LWZyZXF1ZW5jeSIsCisJCQkJICZtYXN0ZXItPm1heF9zcGVlZF9oeikpCisJCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gMjUwMDAwMDA7IC8qIDI1TUh6ICovCiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAl0c2QtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zbGluay5jIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2xpbmsuYwppbmRleCBiZTNhMDY5Li5lM2MxYjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zbGluay5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTIwLXNsaW5rLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE3MSw3ICsxNzAsNiBAQAogCXZvaWQgX19pb21lbQkJCQkqYmFzZTsKIAlwaHlzX2FkZHJfdAkJCQlwaHlzOwogCXVuc2lnbmVkCQkJCWlycTsKLQl1MzIJCQkJCXNwaV9tYXhfZnJlcXVlbmN5OwogCXUzMgkJCQkJY3VyX3NwZWVkOwogCiAJc3RydWN0IHNwaV9kZXZpY2UJCQkqY3VyX3NwaTsKQEAgLTc2MSwxMCArNzU5LDYgQEAKIAkJc3BpLT5tb2RlICYgU1BJX0NQSEEgPyAiIiA6ICJ+IiwKIAkJc3BpLT5tYXhfc3BlZWRfaHopOwogCi0JQlVHX09OKHNwaS0+Y2hpcF9zZWxlY3QgPj0gTUFYX0NISVBfU0VMRUNUKTsKLQotCS8qIFNldCBzcGVlZCB0byB0aGUgc3BpIG1heCBmZXF1ZW5jeSBpZiBzcGkgZGV2aWNlIGhhcyBub3Qgc2V0ICovCi0Jc3BpLT5tYXhfc3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oeiA/IDogdHNwaS0+c3BpX21heF9mcmVxdWVuY3k7CiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyh0c3BpLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIodHNwaS0+ZGV2LCAicG0gcnVudGltZSBmYWlsZWQsIGUgPSAlZFxuIiwgcmV0KTsKQEAgLTk5OSwxNSArOTkzLDYgQEAKIAlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwogfQogCi1zdGF0aWMgdm9pZCB0ZWdyYV9zbGlua19wYXJzZV9kdChzdHJ1Y3QgdGVncmFfc2xpbmtfZGF0YSAqdHNwaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gdHNwaS0+ZGV2LT5vZl9ub2RlOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3BpLW1heC1mcmVxdWVuY3kiLAotCQkJCQkmdHNwaS0+c3BpX21heF9mcmVxdWVuY3kpKQotCQl0c3BpLT5zcGlfbWF4X2ZyZXF1ZW5jeSA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3NsaW5rX2NoaXBfZGF0YSB0ZWdyYTMwX3NwaV9jZGF0YSA9IHsKIAkuY3NfaG9sZF90aW1lID0gdHJ1ZSwKIH07CkBAIC0xMDUzLDcgKzEwMzgsNiBAQAogCW1hc3Rlci0+dW5wcmVwYXJlX21lc3NhZ2UgPSB0ZWdyYV9zbGlua191bnByZXBhcmVfbWVzc2FnZTsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IE1BWF9DSElQX1NFTEVDVDsKLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAJdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKQEAgLTEwNjIsNyArMTA0Niw5IEBACiAJdHNwaS0+Y2hpcF9kYXRhID0gY2RhdGE7CiAJc3Bpbl9sb2NrX2luaXQoJnRzcGktPmxvY2spOwogCi0JdGVncmFfc2xpbmtfcGFyc2VfZHQodHNwaSk7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHRzcGktPmRldi0+b2Zfbm9kZSwgInNwaS1tYXgtZnJlcXVlbmN5IiwKKwkJCQkgJm1hc3Rlci0+bWF4X3NwZWVkX2h6KSkKKwkJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1xc3BpLmMKaW5kZXggM2QwOTI2NS4uNmMyMTFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGktcXNwaS5jCkBAIC00MjksMTMgKzQyOSwxMyBAQAogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRDsKIAotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+ZmxhZ3MgPSBTUElfTUFTVEVSX0hBTEZfRFVQTEVYOwogCW1hc3Rlci0+c2V0dXAgPSB0aV9xc3BpX3NldHVwOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gdGlfcXNwaV9zdGFydF90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gQklUKDMyIC0gMSkgfCBCSVQoMTYgLSAxKSB8IEJJVCg4IC0gMSk7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soMzIpIHwgU1BJX0JQV19NQVNLKDE2KSB8CisJCQkJICAgICBTUElfQlBXX01BU0soOCk7CiAKIAlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtLWNzIiwgJm51bV9jcykpCiAJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fY3M7CkBAIC00NjEsNyArNDYxLDYgQEAKIAkJaWYgKHJlc19tbWFwID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkibWVtb3J5IG1hcHBlZCByZXNvdXJjZSBub3QgcmVxdWlyZWRcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyMGUxMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIFNlcXVlbmNlciBTZXJpYWwgUG9ydCAoU1NQKSBiYXNlZCBTUEkgbWFzdGVyIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvdGlfc3NwLmg+Ci0KLSNkZWZpbmUgTU9ERV9CSVRTCShTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0NTX0hJR0gpCi0KLXN0cnVjdCB0aV9zc3Bfc3BpIHsKLQlzdHJ1Y3Qgc3BpX21hc3RlcgkJKm1hc3RlcjsKLQlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKLQlzcGlubG9ja190CQkJbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQltc2dfcXVldWU7Ci0Jc3RydWN0IGNvbXBsZXRpb24JCWNvbXBsZXRlOwotCWJvb2wJCQkJc2h1dGRvd247Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3b3JrcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrOwotCXU4CQkJCW1vZGUsIGJwdzsKLQlpbnQJCQkJY3NfYWN0aXZlOwotCXUzMgkJCQlwY19lbiwgcGNfZGlzLCBwY193ciwgcGNfcmQ7Ci0Jdm9pZAkJCQkoKnNlbGVjdCkoaW50IGNzKTsKLX07Ci0KLXN0YXRpYyB1MzIgdGlfc3NwX3NwaV9yeChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcpCi17Ci0JdTMyIHJldDsKLQotCXRpX3NzcF9ydW4oaHctPmRldiwgaHctPnBjX3JkLCAwLCAmcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB0aV9zc3Bfc3BpX3R4KHN0cnVjdCB0aV9zc3Bfc3BpICpodywgdTMyIGRhdGEpCi17Ci0JdGlfc3NwX3J1bihody0+ZGV2LCBody0+cGNfd3IsIGRhdGEgPDwgKDMyIC0gaHctPmJwdyksIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IHRpX3NzcF9zcGlfdHhyeChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLAotCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlpbnQgY291bnQ7Ci0KLQlpZiAoaHctPmJwdyA8PSA4KSB7Ci0JCXU4CQkqcnggPSB0LT5yeF9idWY7Ci0JCWNvbnN0IHU4CSp0eCA9IHQtPnR4X2J1ZjsKLQotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0LT5sZW47IGNvdW50ICs9IDEpIHsKLQkJCWlmICh0LT50eF9idWYpCi0JCQkJdGlfc3NwX3NwaV90eChodywgKnR4KyspOwotCQkJaWYgKHQtPnJ4X2J1ZikKLQkJCQkqcngrKyA9IHRpX3NzcF9zcGlfcngoaHcpOwotCQl9Ci0JfSBlbHNlIGlmIChody0+YnB3IDw9IDE2KSB7Ci0JCXUxNgkJKnJ4ID0gdC0+cnhfYnVmOwotCQljb25zdCB1MTYJKnR4ID0gdC0+dHhfYnVmOwotCi0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHQtPmxlbjsgY291bnQgKz0gMikgewotCQkJaWYgKHQtPnR4X2J1ZikKLQkJCQl0aV9zc3Bfc3BpX3R4KGh3LCAqdHgrKyk7Ci0JCQlpZiAodC0+cnhfYnVmKQotCQkJCSpyeCsrID0gdGlfc3NwX3NwaV9yeChodyk7Ci0JCX0KLQl9IGVsc2UgewotCQl1MzIJCSpyeCA9IHQtPnJ4X2J1ZjsKLQkJY29uc3QgdTMyCSp0eCA9IHQtPnR4X2J1ZjsKLQotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0LT5sZW47IGNvdW50ICs9IDQpIHsKLQkJCWlmICh0LT50eF9idWYpCi0JCQkJdGlfc3NwX3NwaV90eChodywgKnR4KyspOwotCQkJaWYgKHQtPnJ4X2J1ZikKLQkJCQkqcngrKyA9IHRpX3NzcF9zcGlfcngoaHcpOwotCQl9Ci0JfQotCi0JbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGNvdW50OyAvKiBieXRlcyB0cmFuc2ZlcnJlZCAqLwotCi0JZGV2X2RiZygmbXNnLT5zcGktPmRldiwgInhmZXIgJXMlcywgJWQgYnl0ZXMsICVkIGJwdywgY291bnQgJWQlc1xuIiwKLQkJdC0+dHhfYnVmID8gInR4IiA6ICIiLCB0LT5yeF9idWYgPyAicngiIDogIiIsIHQtPmxlbiwKLQkJaHctPmJwdywgY291bnQsIChjb3VudCA8IHQtPmxlbikgPyAiICh1bmRlcikiIDogIiIpOwotCi0JcmV0dXJuIChjb3VudCA8IHQtPmxlbikgPyAtRUlPIDogMDsgLyogbGVmdCBvdmVyIGRhdGEgKi8KLX0KLQotc3RhdGljIHZvaWQgdGlfc3NwX3NwaV9jaGlwX3NlbGVjdChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcsIGludCBjc19hY3RpdmUpCi17Ci0JY3NfYWN0aXZlID0gISFjc19hY3RpdmU7Ci0JaWYgKGNzX2FjdGl2ZSA9PSBody0+Y3NfYWN0aXZlKQotCQlyZXR1cm47Ci0JdGlfc3NwX3J1bihody0+ZGV2LCBjc19hY3RpdmUgPyBody0+cGNfZW4gOiBody0+cGNfZGlzLCAwLCBOVUxMKTsKLQlody0+Y3NfYWN0aXZlID0gY3NfYWN0aXZlOwotfQotCi0jZGVmaW5lIF9fU0hJRlRfT1VUKGJpdHMpCShTU1BfT1BDT0RFX1NISUZUIHwgU1NQX09VVF9NT0RFIHwgXAotCQkJCSBjc19lbiB8IGNsayB8IFNTUF9DT1VOVCgoYml0cykgKiAyIC0gMSkpCi0jZGVmaW5lIF9fU0hJRlRfSU4oYml0cykJKFNTUF9PUENPREVfU0hJRlQgfCBTU1BfSU5fTU9ERSAgfCBcCi0JCQkJIGNzX2VuIHwgY2xrIHwgU1NQX0NPVU5UKChiaXRzKSAqIDIgLSAxKSkKLQotc3RhdGljIGludCB0aV9zc3Bfc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCB0aV9zc3Bfc3BpICpodywgdTggYnB3LCB1OCBtb2RlKQotewotCWludCBlcnJvciwgaWR4ID0gMDsKLQl1MzIgc2VxcmFtWzE2XTsKLQl1MzIgY3NfZW4sIGNzX2RpcywgY2xrOwotCXUzMiB0b3BiaXRzLCBib3RiaXRzOwotCi0JbW9kZSAmPSBNT0RFX0JJVFM7Ci0JaWYgKG1vZGUgPT0gaHctPm1vZGUgJiYgYnB3ID09IGh3LT5icHcpCi0JCXJldHVybiAwOwotCi0JY3NfZW4gID0gKG1vZGUgJiBTUElfQ1NfSElHSCkgPyBTU1BfQ1NfSElHSCA6IFNTUF9DU19MT1c7Ci0JY3NfZGlzID0gKG1vZGUgJiBTUElfQ1NfSElHSCkgPyBTU1BfQ1NfTE9XICA6IFNTUF9DU19ISUdIOwotCWNsayAgICA9IChtb2RlICYgU1BJX0NQT0wpICAgID8gU1NQX0NMS19ISUdIIDogU1NQX0NMS19MT1c7Ci0KLQkvKiBDb25zdHJ1Y3QgaW5zdHJ1Y3Rpb25zICovCi0KLQkvKiBEaXNhYmxlIENoaXAgU2VsZWN0ICovCi0JaHctPnBjX2RpcyA9IGlkeDsKLQlzZXFyYW1baWR4KytdID0gU1NQX09QQ09ERV9ESVJFQ1QgfCBTU1BfT1VUX01PREUgfCBjc19kaXMgfCBjbGs7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfU1RPUCAgIHwgU1NQX09VVF9NT0RFIHwgY3NfZGlzIHwgY2xrOwotCi0JLyogRW5hYmxlIENoaXAgU2VsZWN0ICovCi0JaHctPnBjX2VuID0gaWR4OwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX0RJUkVDVCB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX1NUT1AgICB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCi0JLyogUmVhZHMgYW5kIHdyaXRlcyBuZWVkIHRvIGJlIHNwbGl0IGZvciBicHcgPiAxNiAqLwotCXRvcGJpdHMgPSAoYnB3ID4gMTYpID8gMTYgOiBicHc7Ci0JYm90Yml0cyA9IGJwdyAtIHRvcGJpdHM7Ci0KLQkvKiBXcml0ZSAqLwotCWh3LT5wY193ciA9IGlkeDsKLQlzZXFyYW1baWR4KytdID0gX19TSElGVF9PVVQodG9wYml0cykgfCBTU1BfQUREUl9SRUc7Ci0JaWYgKGJvdGJpdHMpCi0JCXNlcXJhbVtpZHgrK10gPSBfX1NISUZUX09VVChib3RiaXRzKSAgfCBTU1BfREFUQV9SRUc7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfU1RPUCB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCi0JLyogUmVhZCAqLwotCWh3LT5wY19yZCA9IGlkeDsKLQlpZiAoYm90Yml0cykKLQkJc2VxcmFtW2lkeCsrXSA9IF9fU0hJRlRfSU4oYm90Yml0cykgfCBTU1BfQUREUl9SRUc7Ci0Jc2VxcmFtW2lkeCsrXSA9IF9fU0hJRlRfSU4odG9wYml0cykgfCBTU1BfREFUQV9SRUc7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfU1RPUCB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCi0JZXJyb3IgPSB0aV9zc3BfbG9hZChody0+ZGV2LCAwLCBzZXFyYW0sIGlkeCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JZXJyb3IgPSB0aV9zc3Bfc2V0X21vZGUoaHctPmRldiwgKChtb2RlICYgU1BJX0NQSEEpID8KLQkJCQkJICAwIDogU1NQX0VBUkxZX0RJTikpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWh3LT5icHcgPSBicHc7Ci0JaHctPm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdm9pZCB0aV9zc3Bfc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0aV9zc3Bfc3BpICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGlfc3NwX3NwaSwgd29yayk7Ci0KLQlzcGluX2xvY2soJmh3LT5sb2NrKTsKLQotCSB3aGlsZSAoIWxpc3RfZW1wdHkoJmh3LT5tc2dfcXVldWUpKSB7Ci0JCXN0cnVjdCBzcGlfbWVzc2FnZQkqbTsKLQkJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKLQkJc3RydWN0IHNwaV90cmFuc2ZlcgkqdCA9IE5VTEw7Ci0JCWludAkJCXN0YXR1cyA9IDA7Ci0KLQkJbSA9IGNvbnRhaW5lcl9vZihody0+bXNnX3F1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwKLQkJCQkgcXVldWUpOwotCi0JCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKLQotCQlzcGluX3VubG9jaygmaHctPmxvY2spOwotCi0JCXNwaSA9IG0tPnNwaTsKLQotCQlpZiAoaHctPnNlbGVjdCkKLQkJCWh3LT5zZWxlY3Qoc3BpLT5jaGlwX3NlbGVjdCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCQlpbnQgYnB3ID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCQkJaW50IHhmZXJfc3RhdHVzOwotCi0JCQlpZiAodC0+Yml0c19wZXJfd29yZCkKLQkJCQlicHcgPSB0LT5iaXRzX3Blcl93b3JkOwotCi0JCQlpZiAodGlfc3NwX3NwaV9zZXR1cF90cmFuc2ZlcihodywgYnB3LCBzcGktPm1vZGUpIDwgMCkKLQkJCQlicmVhazsKLQotCQkJdGlfc3NwX3NwaV9jaGlwX3NlbGVjdChodywgMSk7Ci0KLQkJCXhmZXJfc3RhdHVzID0gdGlfc3NwX3NwaV90eHJ4KGh3LCBtLCB0KTsKLQkJCWlmICh4ZmVyX3N0YXR1cyA8IDApCi0JCQkJc3RhdHVzID0geGZlcl9zdGF0dXM7Ci0KLQkJCWlmICh0LT5kZWxheV91c2VjcykKLQkJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCi0JCQlpZiAodC0+Y3NfY2hhbmdlKQotCQkJCXRpX3NzcF9zcGlfY2hpcF9zZWxlY3QoaHcsIDApOwotCQl9Ci0KLQkJdGlfc3NwX3NwaV9jaGlwX3NlbGVjdChodywgMCk7Ci0JCW0tPnN0YXR1cyA9IHN0YXR1czsKLQkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7Ci0KLQkJc3Bpbl9sb2NrKCZody0+bG9jayk7Ci0JfQotCi0JaWYgKGh3LT5zaHV0ZG93bikKLQkJY29tcGxldGUoJmh3LT5jb21wbGV0ZSk7Ci0KLQlzcGluX3VubG9jaygmaHctPmxvY2spOwotfQotCi1zdGF0aWMgaW50IHRpX3NzcF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQotewotCXN0cnVjdCB0aV9zc3Bfc3BpCSpodzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0OwotCWludAkJCWVycm9yID0gMDsKLQotCW0tPmFjdHVhbF9sZW5ndGggPSAwOwotCW0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKLQotCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KLQlpZiAobGlzdF9lbXB0eSgmbS0+dHJhbnNmZXJzKSB8fCAhbS0+Y29tcGxldGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT5sZW4gJiYgISh0LT5yeF9idWYgfHwgdC0+dHhfYnVmKSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIHhmZXIsIG5vIGJ1ZmZlclxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICh0LT5sZW4gJiYgdC0+cnhfYnVmICYmIHQtPnR4X2J1ZikgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIHhmZXIsIGZ1bGwgZHVwbGV4XG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrKCZody0+bG9jayk7Ci0JaWYgKGh3LT5zaHV0ZG93bikgewotCQllcnJvciA9IC1FU0hVVERPV047Ci0JCWdvdG8gZXJyb3JfdW5sb2NrOwotCX0KLQlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJmh3LT5tc2dfcXVldWUpOwotCXF1ZXVlX3dvcmsoaHctPndvcmtxdWV1ZSwgJmh3LT53b3JrKTsKLWVycm9yX3VubG9jazoKLQlzcGluX3VubG9jaygmaHctPmxvY2spOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCB0aV9zc3Bfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JY29uc3Qgc3RydWN0IHRpX3NzcF9zcGlfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHRpX3NzcF9zcGkgKmh3OwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgZXJyb3IgPSAwOwotCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGRldiwgInBsYXRmb3JtIGRhdGEgbm90IGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3QgdGlfc3NwX3NwaSkpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIoZGV2LCAiY2Fubm90IGFsbG9jYXRlIFNQSSBtYXN0ZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7Ci0KLQlody0+bWFzdGVyID0gbWFzdGVyOwotCWh3LT5kZXYgPSBkZXY7Ci0JaHctPnNlbGVjdCA9IHBkYXRhLT5zZWxlY3Q7Ci0KLQlzcGluX2xvY2tfaW5pdCgmaHctPmxvY2spOwotCWluaXRfY29tcGxldGlvbigmaHctPmNvbXBsZXRlKTsKLQlJTklUX0xJU1RfSEVBRCgmaHctPm1zZ19xdWV1ZSk7Ci0JSU5JVF9XT1JLKCZody0+d29yaywgdGlfc3NwX3NwaV93b3JrKTsKLQotCWh3LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShkZXZfbmFtZShkZXYpKTsKLQlpZiAoIWh3LT53b3JrcXVldWUpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlkZXZfZXJyKGRldiwgIndvcmsgcXVldWUgY3JlYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl93cTsKLQl9Ci0KLQllcnJvciA9IHRpX3NzcF9zZXRfaW9zZWwoaHctPmRldiwgcGRhdGEtPmlvc2VsKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiaW8gc2V0dXAgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl9pb3NlbDsKLQl9Ci0KLQltYXN0ZXItPmJ1c19udW0JCT0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdAk9IHBkYXRhLT5udW1fY3M7Ci0JbWFzdGVyLT5tb2RlX2JpdHMJPSBNT0RFX0JJVFM7Ci0JbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soMSwgMzIpOwotCW1hc3Rlci0+ZmxhZ3MJCT0gU1BJX01BU1RFUl9IQUxGX0RVUExFWDsKLQltYXN0ZXItPnRyYW5zZmVyCT0gdGlfc3NwX3NwaV90cmFuc2ZlcjsKLQotCWVycm9yID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKGRldiwgIm1hc3RlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl9yZWc7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX3JlZzoKLWVycm9yX2lvc2VsOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGh3LT53b3JrcXVldWUpOwotZXJyb3Jfd3E6Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgdGlfc3NwX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgZXJyb3I7Ci0KLQlody0+c2h1dGRvd24gPSAxOwotCXdoaWxlICghbGlzdF9lbXB0eSgmaHctPm1zZ19xdWV1ZSkpIHsKLQkJZXJyb3IgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmh3LT5jb21wbGV0ZSk7Ci0JCWlmIChlcnJvciA8IDApIHsKLQkJCWh3LT5zaHV0ZG93biA9IDA7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQl9Ci0JZGVzdHJveV93b3JrcXVldWUoaHctPndvcmtxdWV1ZSk7Ci0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGh3LT5tYXN0ZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRpX3NzcF9zcGlfZHJpdmVyID0gewotCS5wcm9iZQkJPSB0aV9zc3Bfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gdGlfc3NwX3NwaV9yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInRpLXNzcC1zcGkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGlfc3NwX3NwaV9kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNTUCBTUEkgTWFzdGVyIik7Ci1NT0RVTEVfQVVUSE9SKCJDeXJpbCBDaGVtcGFyYXRoeSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0aS1zc3Atc3BpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdG9wY2xpZmYtcGNoLmMgYi9kcml2ZXJzL3NwaS9zcGktdG9wY2xpZmYtcGNoLmMKaW5kZXggODhlYjU3ZS4uZjQwNmIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRvcGNsaWZmLXBjaC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10b3BjbGlmZi1wY2guYwpAQCAtMzMyLDcgKzMzMiw3IEBACiAJCQkJZGF0YS0+dHJhbnNmZXJfYWN0aXZlID0gZmFsc2U7CiAJCQkJd2FrZV91cCgmZGF0YS0+d2FpdCk7CiAJCQl9IGVsc2UgewotCQkJCWRldl9lcnIoJmRhdGEtPm1hc3Rlci0+ZGV2LAorCQkJCWRldl92ZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKIAkJCQkJIiVzIDogVHJhbnNmZXIgaXMgbm90IGNvbXBsZXRlZCIsCiAJCQkJCV9fZnVuY19fKTsKIAkJCX0KQEAgLTQ2NCwyMCArNDY0LDYgQEAKIAlwY2hfc3BpX3dyaXRlcmVnKG1hc3RlciwgUENIX1NSU1QsIDB4MCk7CiB9CiAKLXN0YXRpYyBpbnQgcGNoX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqcHNwaSkKLXsKLQkvKiBDaGVjayBiYXVkIHJhdGUgc2V0dGluZyAqLwotCS8qIGlmIGJhdWQgcmF0ZSBvZiBjaGlwIGlzIGdyZWF0ZXIgdGhhbgotCSAgIG1heCB3ZSBjYW4gc3VwcG9ydCxyZXR1cm4gZXJyb3IgKi8KLQlpZiAoKHBzcGktPm1heF9zcGVlZF9oeikgPiBQQ0hfTUFYX0JBVURSQVRFKQotCQlwc3BpLT5tYXhfc3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwotCi0JZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgTU9ERSA9ICV4XG4iLCBfX2Z1bmNfXywKLQkJKHBzcGktPm1vZGUpICYgKFNQSV9DUE9MIHwgU1BJX0NQSEEpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHBjaF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnBzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqcG1zZykKIHsKIApAQCAtNDg2LDIzICs0NzIsNiBAQAogCWludCByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIHZhbGlkYXRlIHNwaSBtZXNzYWdlIGFuZCBiYXVkIHJhdGUgKi8KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcG1zZy0+dHJhbnNmZXJzKSA9PSAxKSkgewotCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBsaXN0IGVtcHR5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpZiAodW5saWtlbHkocHNwaS0+bWF4X3NwZWVkX2h6ID09IDApKSB7Ci0JCWRldl9lcnIoJnBzcGktPmRldiwgIiVzIHBjaF9zcGlfdHJhbnNmZXIgbWF4c3BlZWQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcHNwaS0+bWF4X3NwZWVkX2h6KTsKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCWRldl9kYmcoJnBzcGktPmRldiwKLQkJIiVzIFRyYW5zZmVyIExpc3Qgbm90IGVtcHR5LiBUcmFuc2ZlciBTcGVlZCBpcyBzZXQuXG4iLCBfX2Z1bmNfXyk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwogCS8qIHZhbGlkYXRlIFR4L1J4IGJ1ZmZlcnMgYW5kIFRyYW5zZmVyIGxlbmd0aCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNmZXIsICZwbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKQEAgLTUyMywxMCArNDkyLDYgQEAKIAkJZGV2X2RiZygmcHNwaS0+ZGV2LAogCQkJIiVzIFR4L1J4IGJ1ZmZlciB2YWxpZC4gVHJhbnNmZXIgbGVuZ3RoIHZhbGlkXG4iLAogCQkJX19mdW5jX18pOwotCi0JCS8qIGlmIGJhdWQgcmF0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgdmFsaWRhdGUgdGhlIHNhbWUgKi8KLQkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiA+IFBDSF9NQVhfQkFVRFJBVEUpCi0JCQl0cmFuc2Zlci0+c3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CiAKQEAgLTExNTEsOCArMTExNiw3IEBACiAJZG1hLT5uZW50ID0gbnVtOwogCWRtYS0+ZGVzY190eCA9IGRlc2NfdHg7CiAKLQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIlxuJXM6UHVsbGluZyBkb3duIFNTTiBsb3cgLSB3cml0aW5nICIKLQkJIjB4MiB0byBTU05YQ1JcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOlB1bGxpbmcgZG93biBTU04gbG93IC0gd3JpdGluZyAweDIgdG8gU1NOWENSXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwogCXBjaF9zcGlfd3JpdGVyZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1NOWENSLCBTU05fTE9XKTsKQEAgLTE0MTgsMTAgKzEzODIsMTAgQEAKIAogCS8qIGluaXRpYWxpemUgbWVtYmVycyBvZiBTUEkgbWFzdGVyICovCiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFBDSF9NQVhfQ1M7Ci0JbWFzdGVyLT5zZXR1cCA9IHBjaF9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2ZlciA9IHBjaF9zcGlfdHJhbnNmZXI7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVDsKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KSB8IFNQSV9CUFdfTUFTSygxNik7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwogCiAJZGF0YS0+Ym9hcmRfZGF0ID0gYm9hcmRfZGF0OwogCWRhdGEtPnBsYXRfZGV2ID0gcGxhdF9kZXY7CkBAIC0xNjA1LDggKzE1NjksNyBAQAogCS5yZXN1bWUgPSBwY2hfc3BpX3BkX3Jlc3VtZQogfTsKIAotc3RhdGljIGludCBwY2hfc3BpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgcGNoX3NwaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdDsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZF9kZXYgPSBOVUxMOwpAQCAtMTY3Niw2ICsxNjM5LDggQEAKIAlyZXR1cm4gMDsKIAogZXJyX3BsYXRmb3JtX2RldmljZToKKwl3aGlsZSAoLS1pID49IDApCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkX2Rldl9zYXZlLT5wZF9zYXZlW2ldKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBwY2lfZW5hYmxlX2RldmljZToKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYyBiL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKaW5kZXggNjE5MWNlZC4uODIwYjQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCkBAIC04MCw3ICs4MCw2IEBACiAJdm9pZCBfX2lvbWVtICptZW1iYXNlOwogCWludCBiYXNlY2xrOwogCXN0cnVjdCBjbGsgKmNsazsKLQl1MzIgbWF4X3NwZWVkX2h6LCBtaW5fc3BlZWRfaHo7CiAJaW50IGxhc3RfY2hpcHNlbGVjdDsKIAlpbnQgbGFzdF9jaGlwc2VsZWN0X3ZhbDsKIH07CkBAIC0xMTcsOSArMTE2LDcgQEAKIHsKIAlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oegotCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHoKLQkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6KQorCWlmICghc3BpLT5tYXhfc3BlZWRfaHopCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChzcGktPmNoaXBfc2VsZWN0LApAQCAtMzA5LDE1ICszMDYsOCBAQAogCiAJLyogY2hlY2sgZWFjaCB0cmFuc2ZlcidzIHBhcmFtZXRlcnMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJdTMyIHNwZWVkX2h6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwotCQl1OCBiaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQogCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodC0+bGVuICYgKChiaXRzX3Blcl93b3JkID4+IDMpIC0gMSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHNwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6IHx8IHNwZWVkX2h6ID4gYy0+bWF4X3NwZWVkX2h6KQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmxvY2ssIGZsYWdzKTsKQEAgLTM2MCwxNyArMzUwLDEyIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAJYy0+YmFzZWNsayA9IGNsa19nZXRfcmF0ZShjLT5jbGspOwotCWMtPm1pbl9zcGVlZF9oeiA9IERJVl9ST1VORF9VUChjLT5iYXNlY2xrLCBTUElfTUFYX0RJVklERVIgKyAxKTsKLQljLT5tYXhfc3BlZWRfaHogPSBjLT5iYXNlY2xrIC8gKFNQSV9NSU5fRElWSURFUiArIDEpOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gRElWX1JPVU5EX1VQKGMtPmJhc2VjbGssIFNQSV9NQVhfRElWSURFUiArIDEpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gYy0+YmFzZWNsayAvIChTUElfTUlOX0RJVklERVIgKyAxKTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJZ290byBleGl0X2J1c3k7Ci0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQkgICAgICJzcGlfdHh4OSIpKQotCQlnb3RvIGV4aXRfYnVzeTsKLQljLT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwKCZkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAoIWMtPm1lbWJhc2UpCisJYy0+bWVtYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihjLT5tZW1iYXNlKSkKIAkJZ290byBleGl0X2J1c3k7CiAKIAkvKiBlbnRlciBjb25maWcgbW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXhjb21tLmMgYi9kcml2ZXJzL3NwaS9zcGkteGNvbW0uYwppbmRleCAyNGM0MGIxLi5iYjQ3OGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkteGNvbW0uYworKysgYi9kcml2ZXJzL3NwaS9zcGkteGNvbW0uYwpAQCAtOCw3ICs4LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC03NCwxNSArNzMsMTMgQEAKIHN0YXRpYyBpbnQgc3BpX3hjb21tX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfeGNvbW0gKnNwaV94Y29tbSwKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCB1bnNpZ25lZCBpbnQgKnNldHRpbmdzKQogewotCXVuc2lnbmVkIGludCBzcGVlZDsKLQogCWlmICh0LT5sZW4gPiA2MikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGVlZCA9IHQtPnNwZWVkX2h6ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKKwlpZiAodC0+c3BlZWRfaHogIT0gc3BpX3hjb21tLT5jdXJyZW50X3NwZWVkKSB7CisJCXVuc2lnbmVkIGludCBkaXZpZGVyOwogCi0JaWYgKHNwZWVkICE9IHNwaV94Y29tbS0+Y3VycmVudF9zcGVlZCkgewotCQl1bnNpZ25lZCBpbnQgZGl2aWRlciA9IERJVl9ST1VORF9VUChTUElfWENPTU1fQ0xPQ0ssIHNwZWVkKTsKKwkJZGl2aWRlciA9IERJVl9ST1VORF9VUChTUElfWENPTU1fQ0xPQ0ssIHQtPnNwZWVkX2h6KTsKIAkJaWYgKGRpdmlkZXIgPj0gNjQpCiAJCQkqc2V0dGluZ3MgfD0gU1BJX1hDT01NX1NFVFRJTkdTX0NMT0NLX0RJVl82NDsKIAkJZWxzZSBpZiAoZGl2aWRlciA+PSAxNikKQEAgLTkwLDcgKzg3LDcgQEAKIAkJZWxzZQogCQkJKnNldHRpbmdzIHw9IFNQSV9YQ09NTV9TRVRUSU5HU19DTE9DS19ESVZfNDsKIAotCQlzcGlfeGNvbW0tPmN1cnJlbnRfc3BlZWQgPSBzcGVlZDsKKwkJc3BpX3hjb21tLT5jdXJyZW50X3NwZWVkID0gdC0+c3BlZWRfaHo7CiAJfQogCiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQpAQCAtMTQ4LDggKzE0NSw2IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJYm9vbCBpc19sYXN0OwogCi0JaXNfZmlyc3QgPSB0cnVlOwotCiAJc3BpX3hjb21tX2NoaXBzZWxlY3Qoc3BpX3hjb21tLCBzcGksIHRydWUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYyBiL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYwppbmRleCA2ZDRjZTQ2Li5hM2IwYjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtODgsMTAgKzg3LDEwIEBACiAJY29uc3QgdTggKnR4X3B0cjsJLyogcG9pbnRlciBpbiB0aGUgUnggYnVmZmVyICovCiAJaW50IHJlbWFpbmluZ19ieXRlczsJLyogdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHRyYW5zZmVyICovCiAJdTggYml0c19wZXJfd29yZDsKLQl1bnNpZ25lZCBpbnQgKCpyZWFkX2ZuKSAodm9pZCBfX2lvbWVtICopOwotCXZvaWQgKCp3cml0ZV9mbikgKHUzMiwgdm9pZCBfX2lvbWVtICopOwotCXZvaWQgKCp0eF9mbikgKHN0cnVjdCB4aWxpbnhfc3BpICopOwotCXZvaWQgKCpyeF9mbikgKHN0cnVjdCB4aWxpbnhfc3BpICopOworCXVuc2lnbmVkIGludCAoKnJlYWRfZm4pKHZvaWQgX19pb21lbSAqKTsKKwl2b2lkICgqd3JpdGVfZm4pKHUzMiwgdm9pZCBfX2lvbWVtICopOworCXZvaWQgKCp0eF9mbikoc3RydWN0IHhpbGlueF9zcGkgKik7CisJdm9pZCAoKnJ4X2ZuKShzdHJ1Y3QgeGlsaW54X3NwaSAqKTsKIH07CiAKIHN0YXRpYyB2b2lkIHhzcGlfd3JpdGUzMih1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCkBAIC0yMDksMjYgKzIwOCwxMSBAQAogfQogCiAvKiBzcGlfYml0YmFuZyByZXF1aXJlcyBjdXN0b20gc2V0dXBfdHJhbnNmZXIoKSB0byBiZSBkZWZpbmVkIGlmIHRoZXJlIGlzIGEKLSAqIGN1c3RvbSB0eHJ4X2J1ZnMoKS4gV2UgaGF2ZSBub3RoaW5nIHRvIHNldHVwIGhlcmUgYXMgdGhlIFNQSSBJUCBibG9jawotICogc3VwcG9ydHMgOCBvciAxNiBiaXRzIHBlciB3b3JkIHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkIGluIHNvZnR3YXJlLgotICogU1BJIGNsb2NrIGNhbid0IGJlIGNoYW5nZWQgaW4gc29mdHdhcmUgZWl0aGVyLgotICogQ2hlY2sgZm9yIGNvcnJlY3QgYml0cyBwZXIgd29yZC4gQ2hpcCBzZWxlY3QgZGVsYXkgY2FsY3VsYXRpb25zIGNvdWxkIGJlCi0gKiBhZGRlZCBoZXJlIGFzIHNvb24gYXMgYml0YmFuZ193b3JrKCkgY2FuIGJlIG1hZGUgYXdhcmUgb2YgdGhlIGRlbGF5IHZhbHVlLgorICogY3VzdG9tIHR4cnhfYnVmcygpLgogICovCiBzdGF0aWMgaW50IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKLQlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXU4IGJpdHNfcGVyX3dvcmQ7Ci0KLQliaXRzX3Blcl93b3JkID0gKHQgJiYgdC0+Yml0c19wZXJfd29yZCkKLQkJCSA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKGJpdHNfcGVyX3dvcmQgIT0geHNwaS0+Yml0c19wZXJfd29yZCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBiaXRzX3Blcl93b3JkPSVkXG4iLAotCQkJX19mdW5jX18sIGJpdHNfcGVyX3dvcmQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDA3LDYgKzM5MSw3IEBACiAJCXhzcGktPndyaXRlX2ZuID0geHNwaV93cml0ZTMyX2JlOwogCX0KIAorCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKGJpdHNfcGVyX3dvcmQpOwogCXhzcGktPmJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkOwogCWlmICh4c3BpLT5iaXRzX3Blcl93b3JkID09IDgpIHsKIAkJeHNwaS0+dHhfZm4gPSB4c3BpX3R4ODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14dGVuc2EteHRmcGdhLmMgYi9kcml2ZXJzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTE1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogWHRlbnNhIHh0ZnBnYSBTUEkgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisjZGVmaW5lIFhURlBHQV9TUElfTkFNRSAieHRmcGdhX3NwaSIKKworI2RlZmluZSBYVEZQR0FfU1BJX1NUQVJUCTB4MAorI2RlZmluZSBYVEZQR0FfU1BJX0JVU1kJCTB4NAorI2RlZmluZSBYVEZQR0FfU1BJX0RBVEEJCTB4OAorCisjZGVmaW5lIEJVU1lfV0FJVF9VUwkJMTAwCisKK3N0cnVjdCB4dGZwZ2Ffc3BpIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdTMyIGRhdGE7CisJdW5zaWduZWQgZGF0YV9zejsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4dGZwZ2Ffc3BpX3dyaXRlMzIoY29uc3Qgc3RydWN0IHh0ZnBnYV9zcGkgKnNwaSwKKwkJCQkgICAgICB1bnNpZ25lZCBhZGRyLCB1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIHNwaS0+cmVncyArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4dGZwZ2Ffc3BpX3JlYWQzMihjb25zdCBzdHJ1Y3QgeHRmcGdhX3NwaSAqc3BpLAorCQkJCQkgICAgIHVuc2lnbmVkIGFkZHIpCit7CisJcmV0dXJuIGlvcmVhZDMyKHNwaS0+cmVncyArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeHRmcGdhX3NwaV93YWl0X2J1c3koc3RydWN0IHh0ZnBnYV9zcGkgKnhzcGkpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGkgPSAwOyB4dGZwZ2Ffc3BpX3JlYWQzMih4c3BpLCBYVEZQR0FfU1BJX0JVU1kpICYmCisJICAgICBpIDwgQlVTWV9XQUlUX1VTOyArK2kpCisJCXVkZWxheSgxKTsKKwlXQVJOX09OX09OQ0UoaSA9PSBCVVNZX1dBSVRfVVMpOworfQorCitzdGF0aWMgdTMyIHh0ZnBnYV9zcGlfdHhyeF93b3JkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLAorCQkJCXUzMiB2LCB1OCBiaXRzKQoreworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwl4c3BpLT5kYXRhID0gKHhzcGktPmRhdGEgPDwgYml0cykgfCAodiAmIEdFTk1BU0soYml0cyAtIDEsIDApKTsKKwl4c3BpLT5kYXRhX3N6ICs9IGJpdHM7CisJaWYgKHhzcGktPmRhdGFfc3ogPj0gMTYpIHsKKwkJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfREFUQSwKKwkJCQkgICB4c3BpLT5kYXRhID4+ICh4c3BpLT5kYXRhX3N6IC0gMTYpKTsKKwkJeHNwaS0+ZGF0YV9zeiAtPSAxNjsKKwkJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfU1RBUlQsIDEpOworCQl4dGZwZ2Ffc3BpX3dhaXRfYnVzeSh4c3BpKTsKKwkJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfU1RBUlQsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4dGZwZ2Ffc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlXQVJOX09OKHhzcGktPmRhdGFfc3ogIT0gMCk7CisJeHNwaS0+ZGF0YV9zeiA9IDA7Cit9CisKK3N0YXRpYyBpbnQgeHRmcGdhX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCWludCByZXQ7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB4dGZwZ2Ffc3BpKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfTk9fUlg7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soMSwgMTYpOworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmRldi5pZDsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXhzcGktPmJpdGJhbmcubWFzdGVyID0gbWFzdGVyOworCXhzcGktPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHh0ZnBnYV9zcGlfY2hpcHNlbGVjdDsKKwl4c3BpLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHh0ZnBnYV9zcGlfdHhyeF93b3JkOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBtZW1vcnkgcmVzb3VyY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisJeHNwaS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW0pOworCWlmIChJU19FUlIoeHNwaS0+cmVncykpIHsKKwkJcmV0ID0gUFRSX0VSUih4c3BpLT5yZWdzKTsKKwkJZ290byBlcnI7CisJfQorCisJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfU1RBUlQsIDApOworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwlpZiAoeHRmcGdhX3NwaV9yZWFkMzIoeHNwaSwgWFRGUEdBX1NQSV9CVVNZKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2Ugc3R1Y2sgaW4gYnVzeSBzdGF0ZVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJnhzcGktPmJpdGJhbmcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNwaV9iaXRiYW5nX3N0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisJcmV0dXJuIDA7CitlcnI6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHh0ZnBnYV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX2JpdGJhbmdfc3RvcCgmeHNwaS0+Yml0YmFuZyk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgWFRGUEdBX1NQSV9OQU1FKTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeHRmcGdhX3NwaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiY2Rucyx4dGZwZ2Etc3BpIiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHh0ZnBnYV9zcGlfb2ZfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHh0ZnBnYV9zcGlfZHJpdmVyID0geworCS5wcm9iZSA9IHh0ZnBnYV9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IHh0ZnBnYV9zcGlfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gWFRGUEdBX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHh0ZnBnYV9zcGlfb2ZfbWF0Y2gpLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4dGZwZ2Ffc3BpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1heCBGaWxpcHBvdiA8amNtdmJrYmNAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4dGVuc2EgeHRmcGdhIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggZDBiMjhiYi4uNGViOWJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC0yNTUsMTMgKzI1NywxMiBAQAogc3RhdGljIGludCBzcGlfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3Qgc3BpX2RyaXZlcgkJKnNkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAlpbnQgcmV0OwogCi0JYWNwaV9kZXZfcG1fYXR0YWNoKCZzcGktPmRldiwgdHJ1ZSk7Ci0JcmV0ID0gc2Rydi0+cHJvYmUoc3BpKTsKKwlhY3BpX2Rldl9wbV9hdHRhY2goZGV2LCB0cnVlKTsKKwlyZXQgPSBzZHJ2LT5wcm9iZSh0b19zcGlfZGV2aWNlKGRldikpOwogCWlmIChyZXQpCi0JCWFjcGlfZGV2X3BtX2RldGFjaCgmc3BpLT5kZXYsIHRydWUpOworCQlhY3BpX2Rldl9wbV9kZXRhY2goZGV2LCB0cnVlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNjksMTEgKzI3MCwxMCBAQAogc3RhdGljIGludCBzcGlfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kcml2ZXIJCSpzZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJaW50IHJldDsKIAotCXJldCA9IHNkcnYtPnJlbW92ZShzcGkpOwotCWFjcGlfZGV2X3BtX2RldGFjaCgmc3BpLT5kZXYsIHRydWUpOworCXJldCA9IHNkcnYtPnJlbW92ZSh0b19zcGlfZGV2aWNlKGRldikpOworCWFjcGlfZGV2X3BtX2RldGFjaChkZXYsIHRydWUpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU4MCw2ICs1ODAsMTY5IEBACiAJCXNwaS0+bWFzdGVyLT5zZXRfY3Moc3BpLCAhZW5hYmxlKTsKIH0KIAorc3RhdGljIGludCBzcGlfbWFwX2J1ZihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAorCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWNvbnN0IGJvb2wgdm1hbGxvY2VkX2J1ZiA9IGlzX3ZtYWxsb2NfYWRkcihidWYpOworCWNvbnN0IGludCBkZXNjX2xlbiA9IHZtYWxsb2NlZF9idWYgPyBQQUdFX1NJWkUgOiBtYXN0ZXItPm1heF9kbWFfbGVuOworCWNvbnN0IGludCBzZ3MgPSBESVZfUk9VTkRfVVAobGVuLCBkZXNjX2xlbik7CisJc3RydWN0IHBhZ2UgKnZtX3BhZ2U7CisJdm9pZCAqc2dfYnVmOworCXNpemVfdCBtaW47CisJaW50IGksIHJldDsKKworCXJldCA9IHNnX2FsbG9jX3RhYmxlKHNndCwgc2dzLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dzOyBpKyspIHsKKwkJbWluID0gbWluX3Qoc2l6ZV90LCBsZW4sIGRlc2NfbGVuKTsKKworCQlpZiAodm1hbGxvY2VkX2J1ZikgeworCQkJdm1fcGFnZSA9IHZtYWxsb2NfdG9fcGFnZShidWYpOworCQkJaWYgKCF2bV9wYWdlKSB7CisJCQkJc2dfZnJlZV90YWJsZShzZ3QpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJc2dfYnVmID0gcGFnZV9hZGRyZXNzKHZtX3BhZ2UpICsKKwkJCQkoKHNpemVfdClidWYgJiB+UEFHRV9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCXNnX2J1ZiA9IGJ1ZjsKKwkJfQorCisJCXNnX3NldF9idWYoJnNndC0+c2dsW2ldLCBzZ19idWYsIG1pbik7CisKKwkJYnVmICs9IG1pbjsKKwkJbGVuIC09IG1pbjsKKwl9CisKKwlyZXQgPSBkbWFfbWFwX3NnKGRldiwgc2d0LT5zZ2wsIHNndC0+bmVudHMsIGRpcik7CisJaWYgKHJldCA8IDApIHsKKwkJc2dfZnJlZV90YWJsZShzZ3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNndC0+bmVudHMgPSByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BpX3VubWFwX2J1ZihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBzZ190YWJsZSAqc2d0LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJaWYgKHNndC0+b3JpZ19uZW50cykgeworCQlkbWFfdW5tYXBfc2coZGV2LCBzZ3QtPnNnbCwgc2d0LT5vcmlnX25lbnRzLCBkaXIpOworCQlzZ19mcmVlX3RhYmxlKHNndCk7CisJfQorfQorCitzdGF0aWMgaW50IHNwaV9tYXBfbXNnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBkZXZpY2UgKnR4X2RldiwgKnJ4X2RldjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOworCXZvaWQgKnRtcDsKKwl1bnNpZ25lZCBpbnQgbWF4X3R4LCBtYXhfcng7CisJaW50IHJldDsKKworCWlmIChtYXN0ZXItPmZsYWdzICYgKFNQSV9NQVNURVJfTVVTVF9SWCB8IFNQSV9NQVNURVJfTVVTVF9UWCkpIHsKKwkJbWF4X3R4ID0gMDsKKwkJbWF4X3J4ID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQkJaWYgKChtYXN0ZXItPmZsYWdzICYgU1BJX01BU1RFUl9NVVNUX1RYKSAmJgorCQkJICAgICF4ZmVyLT50eF9idWYpCisJCQkJbWF4X3R4ID0gbWF4KHhmZXItPmxlbiwgbWF4X3R4KTsKKwkJCWlmICgobWFzdGVyLT5mbGFncyAmIFNQSV9NQVNURVJfTVVTVF9SWCkgJiYKKwkJCSAgICAheGZlci0+cnhfYnVmKQorCQkJCW1heF9yeCA9IG1heCh4ZmVyLT5sZW4sIG1heF9yeCk7CisJCX0KKworCQlpZiAobWF4X3R4KSB7CisJCQl0bXAgPSBrcmVhbGxvYyhtYXN0ZXItPmR1bW15X3R4LCBtYXhfdHgsCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmICghdG1wKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWFzdGVyLT5kdW1teV90eCA9IHRtcDsKKwkJCW1lbXNldCh0bXAsIDAsIG1heF90eCk7CisJCX0KKworCQlpZiAobWF4X3J4KSB7CisJCQl0bXAgPSBrcmVhbGxvYyhtYXN0ZXItPmR1bW15X3J4LCBtYXhfcngsCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmICghdG1wKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWFzdGVyLT5kdW1teV9yeCA9IHRtcDsKKwkJfQorCisJCWlmIChtYXhfdHggfHwgbWF4X3J4KSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywKKwkJCQkJICAgIHRyYW5zZmVyX2xpc3QpIHsKKwkJCQlpZiAoIXhmZXItPnR4X2J1ZikKKwkJCQkJeGZlci0+dHhfYnVmID0gbWFzdGVyLT5kdW1teV90eDsKKwkJCQlpZiAoIXhmZXItPnJ4X2J1ZikKKwkJCQkJeGZlci0+cnhfYnVmID0gbWFzdGVyLT5kdW1teV9yeDsKKwkJCX0KKwkJfQorCX0KKworCWlmICghbWFzdGVyLT5jYW5fZG1hKQorCQlyZXR1cm4gMDsKKworCXR4X2RldiA9ICZtYXN0ZXItPmRtYV90eC0+ZGV2LT5kZXZpY2U7CisJcnhfZGV2ID0gJm1hc3Rlci0+ZG1hX3J4LT5kZXYtPmRldmljZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmICghbWFzdGVyLT5jYW5fZG1hKG1hc3RlciwgbXNnLT5zcGksIHhmZXIpKQorCQkJY29udGludWU7CisKKwkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKSB7CisJCQlyZXQgPSBzcGlfbWFwX2J1ZihtYXN0ZXIsIHR4X2RldiwgJnhmZXItPnR4X3NnLAorCQkJCQkgICh2b2lkICopeGZlci0+dHhfYnVmLCB4ZmVyLT5sZW4sCisJCQkJCSAgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkgeworCQkJcmV0ID0gc3BpX21hcF9idWYobWFzdGVyLCByeF9kZXYsICZ4ZmVyLT5yeF9zZywKKwkJCQkJICB4ZmVyLT5yeF9idWYsIHhmZXItPmxlbiwKKwkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJc3BpX3VubWFwX2J1ZihtYXN0ZXIsIHR4X2RldiwgJnhmZXItPnR4X3NnLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCisJbWFzdGVyLT5jdXJfbXNnX21hcHBlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfdW5tYXBfbXNnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CisJc3RydWN0IGRldmljZSAqdHhfZGV2LCAqcnhfZGV2OworCisJaWYgKCFtYXN0ZXItPmN1cl9tc2dfbWFwcGVkIHx8ICFtYXN0ZXItPmNhbl9kbWEpCisJCXJldHVybiAwOworCisJdHhfZGV2ID0gJm1hc3Rlci0+ZG1hX3R4LT5kZXYtPmRldmljZTsKKwlyeF9kZXYgPSAmbWFzdGVyLT5kbWFfcngtPmRldi0+ZGV2aWNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKCFtYXN0ZXItPmNhbl9kbWEobWFzdGVyLCBtc2ctPnNwaSwgeGZlcikpCisJCQljb250aW51ZTsKKworCQlzcGlfdW5tYXBfYnVmKG1hc3RlciwgcnhfZGV2LCAmeGZlci0+cnhfc2csIERNQV9GUk9NX0RFVklDRSk7CisJCXNwaV91bm1hcF9idWYobWFzdGVyLCB0eF9kZXYsICZ4ZmVyLT50eF9zZywgRE1BX1RPX0RFVklDRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2UgLSBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRyYW5zZmVyX29uZV9tZXNzYWdlKCkKICAqCkBAIC01OTEsOSArNzU0LDkgQEAKIAkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQlib29sIGN1cl9jcyA9IHRydWU7CiAJYm9vbCBrZWVwX2NzID0gZmFsc2U7CiAJaW50IHJldCA9IDA7CisJaW50IG1zID0gMTsKIAogCXNwaV9zZXRfY3MobXNnLT5zcGksIHRydWUpOwogCkBAIC02MTEsNyArNzc0LDE2IEBACiAKIAkJaWYgKHJldCA+IDApIHsKIAkJCXJldCA9IDA7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbik7CisJCQltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8geGZlci0+c3BlZWRfaHo7CisJCQltcyArPSAxMDsgLyogc29tZSB0b2xlcmFuY2UgKi8KKworCQkJbXMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1hc3Rlci0+eGZlcl9jb21wbGV0aW9uLAorCQkJCQkJCSBtc2Vjc190b19qaWZmaWVzKG1zKSk7CisJCX0KKworCQlpZiAobXMgPT0gMCkgeworCQkJZGV2X2VycigmbXNnLT5zcGktPmRldiwgIlNQSSB0cmFuc2ZlciB0aW1lZCBvdXRcbiIpOworCQkJbXNnLT5zdGF0dXMgPSAtRVRJTUVET1VUOwogCQl9CiAKIAkJdHJhY2Vfc3BpX3RyYW5zZmVyX3N0b3AobXNnLCB4ZmVyKTsKQEAgLTYyNyw4ICs3OTksOSBAQAogCQkJCQkgJm1zZy0+dHJhbnNmZXJzKSkgewogCQkJCWtlZXBfY3MgPSB0cnVlOwogCQkJfSBlbHNlIHsKLQkJCQljdXJfY3MgPSAhY3VyX2NzOwotCQkJCXNwaV9zZXRfY3MobXNnLT5zcGksIGN1cl9jcyk7CisJCQkJc3BpX3NldF9jcyhtc2ctPnNwaSwgZmFsc2UpOworCQkJCXVkZWxheSgxMCk7CisJCQkJc3BpX3NldF9jcyhtc2ctPnNwaSwgdHJ1ZSk7CiAJCQl9CiAJCX0KIApAQCAtNjg2LDYgKzg1OSwxMCBAQAogCQl9CiAJCW1hc3Rlci0+YnVzeSA9IGZhbHNlOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJa2ZyZWUobWFzdGVyLT5kdW1teV9yeCk7CisJCW1hc3Rlci0+ZHVtbXlfcnggPSBOVUxMOworCQlrZnJlZShtYXN0ZXItPmR1bW15X3R4KTsKKwkJbWFzdGVyLT5kdW1teV90eCA9IE5VTEw7CiAJCWlmIChtYXN0ZXItPnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSAmJgogCQkgICAgbWFzdGVyLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUobWFzdGVyKSkKIAkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LApAQCAtNzUyLDYgKzkyOSwxMyBAQAogCQltYXN0ZXItPmN1cl9tc2dfcHJlcGFyZWQgPSB0cnVlOwogCX0KIAorCXJldCA9IHNwaV9tYXBfbXNnKG1hc3RlciwgbWFzdGVyLT5jdXJfbXNnKTsKKwlpZiAocmV0KSB7CisJCW1hc3Rlci0+Y3VyX21zZy0+c3RhdHVzID0gcmV0OworCQlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7CisJCXJldHVybjsKKwl9CisKIAlyZXQgPSBtYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlKG1hc3RlciwgbWFzdGVyLT5jdXJfbXNnKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LApAQCAtODM5LDYgKzEwMjMsOCBAQAogCXF1ZXVlX2t0aHJlYWRfd29yaygmbWFzdGVyLT5rd29ya2VyLCAmbWFzdGVyLT5wdW1wX21lc3NhZ2VzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAorCXNwaV91bm1hcF9tc2cobWFzdGVyLCBtZXNnKTsKKwogCWlmIChtYXN0ZXItPmN1cl9tc2dfcHJlcGFyZWQgJiYgbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSkgewogCQlyZXQgPSBtYXN0ZXItPnVucHJlcGFyZV9tZXNzYWdlKG1hc3RlciwgbWVzZyk7CiAJCWlmIChyZXQpIHsKQEAgLTg5Miw3ICsxMDc4LDcgQEAKIAkgKi8KIAl3aGlsZSAoKCFsaXN0X2VtcHR5KCZtYXN0ZXItPnF1ZXVlKSB8fCBtYXN0ZXItPmJ1c3kpICYmIGxpbWl0LS0pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCW1zbGVlcCgxMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJfQogCkBAIC0xMzcyLDYgKzE1NTgsOCBAQAogCW11dGV4X2luaXQoJm1hc3Rlci0+YnVzX2xvY2tfbXV0ZXgpOwogCW1hc3Rlci0+YnVzX2xvY2tfZmxhZyA9IDA7CiAJaW5pdF9jb21wbGV0aW9uKCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbik7CisJaWYgKCFtYXN0ZXItPm1heF9kbWFfbGVuKQorCQltYXN0ZXItPm1heF9kbWFfbGVuID0gSU5UX01BWDsKIAogCS8qIHJlZ2lzdGVyIHRoZSBkZXZpY2UsIHRoZW4gdXNlcnNwYWNlIHdpbGwgc2VlIGl0LgogCSAqIHJlZ2lzdHJhdGlvbiBmYWlscyBpZiB0aGUgYnVzIElEIGlzIGluIHVzZS4KQEAgLTE1OTcsNiArMTc4NSw5IEBACiAJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCiAJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQorCQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWFzdGVyLT5tYXhfc3BlZWRfaHo7CisKIAlpZiAoc3BpLT5tYXN0ZXItPnNldHVwKQogCQlzdGF0dXMgPSBzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKIApAQCAtMTYxNywxMSArMTgwOCwxMCBAQAogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOworCWludCB3X3NpemU7CiAKIAlpZiAobGlzdF9lbXB0eSgmbWVzc2FnZS0+dHJhbnNmZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFtZXNzYWdlLT5jb21wbGV0ZSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBIYWxmLWR1cGxleCBsaW5rcyBpbmNsdWRlIG9yaWdpbmFsIE1pY3JvV2lyZSwgYW5kIG9uZXMgd2l0aAogCSAqIG9ubHkgb25lIGRhdGEgcGluIGxpa2UgU1BJXzNXSVJFIChzd2l0Y2hlcyBkaXJlY3Rpb24pIG9yIHdoZXJlCkBAIC0xNjUyLDEyICsxODQyLDEzIEBACiAJCW1lc3NhZ2UtPmZyYW1lX2xlbmd0aCArPSB4ZmVyLT5sZW47CiAJCWlmICgheGZlci0+Yml0c19wZXJfd29yZCkKIAkJCXhmZXItPmJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JCWlmICgheGZlci0+c3BlZWRfaHopIHsKKworCQlpZiAoIXhmZXItPnNwZWVkX2h6KQogCQkJeGZlci0+c3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oejsKLQkJCWlmIChtYXN0ZXItPm1heF9zcGVlZF9oeiAmJgotCQkJICAgIHhmZXItPnNwZWVkX2h6ID4gbWFzdGVyLT5tYXhfc3BlZWRfaHopCi0JCQkJeGZlci0+c3BlZWRfaHogPSBtYXN0ZXItPm1heF9zcGVlZF9oejsKLQkJfQorCisJCWlmIChtYXN0ZXItPm1heF9zcGVlZF9oeiAmJgorCQkgICAgeGZlci0+c3BlZWRfaHogPiBtYXN0ZXItPm1heF9zcGVlZF9oeikKKwkJCXhmZXItPnNwZWVkX2h6ID0gbWFzdGVyLT5tYXhfc3BlZWRfaHo7CiAKIAkJaWYgKG1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrKSB7CiAJCQkvKiBPbmx5IDMyIGJpdHMgZml0IGluIHRoZSBtYXNrICovCkBAIC0xNjY4LDEyICsxODU5LDI0IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAorCQkvKgorCQkgKiBTUEkgdHJhbnNmZXIgbGVuZ3RoIHNob3VsZCBiZSBtdWx0aXBsZSBvZiBTUEkgd29yZCBzaXplCisJCSAqIHdoZXJlIFNQSSB3b3JkIHNpemUgc2hvdWxkIGJlIHBvd2VyLW9mLXR3byBtdWx0aXBsZQorCQkgKi8KKwkJaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJCXdfc2l6ZSA9IDE7CisJCWVsc2UgaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCQl3X3NpemUgPSAyOworCQllbHNlCisJCQl3X3NpemUgPSA0OworCisJCS8qIE5vIHBhcnRpYWwgdHJhbnNmZXJzIGFjY2VwdGVkICovCisJCWlmICh4ZmVyLT5sZW4gJSB3X3NpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQlpZiAoeGZlci0+c3BlZWRfaHogJiYgbWFzdGVyLT5taW5fc3BlZWRfaHogJiYKIAkJICAgIHhmZXItPnNwZWVkX2h6IDwgbWFzdGVyLT5taW5fc3BlZWRfaHopCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHhmZXItPnNwZWVkX2h6ICYmIG1hc3Rlci0+bWF4X3NwZWVkX2h6ICYmCi0JCSAgICB4ZmVyLT5zcGVlZF9oeiA+IG1hc3Rlci0+bWF4X3NwZWVkX2h6KQotCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKHhmZXItPnR4X2J1ZiAmJiAheGZlci0+dHhfbmJpdHMpCiAJCQl4ZmVyLT50eF9uYml0cyA9IFNQSV9OQklUU19TSU5HTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IGQ3YzZlMzYuLmUzYmMyM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC03Myw3ICs3Myw4IEBACiAgKi8KICNkZWZpbmUgU1BJX01PREVfTUFTSwkJKFNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfQ1NfSElHSCBcCiAJCQkJfCBTUElfTFNCX0ZJUlNUIHwgU1BJXzNXSVJFIHwgU1BJX0xPT1AgXAotCQkJCXwgU1BJX05PX0NTIHwgU1BJX1JFQURZKQorCQkJCXwgU1BJX05PX0NTIHwgU1BJX1JFQURZIHwgU1BJX1RYX0RVQUwgXAorCQkJCXwgU1BJX1RYX1FVQUQgfCBTUElfUlhfRFVBTCB8IFNQSV9SWF9RVUFEKQogCiBzdHJ1Y3Qgc3BpZGV2X2RhdGEgewogCWRldl90CQkJZGV2dDsKQEAgLTI2NSw2ICsyNjYsOCBAQAogCQlidWYgKz0ga190bXAtPmxlbjsKIAogCQlrX3RtcC0+Y3NfY2hhbmdlID0gISF1X3RtcC0+Y3NfY2hhbmdlOworCQlrX3RtcC0+dHhfbmJpdHMgPSB1X3RtcC0+dHhfbmJpdHM7CisJCWtfdG1wLT5yeF9uYml0cyA9IHVfdG1wLT5yeF9uYml0czsKIAkJa190bXAtPmJpdHNfcGVyX3dvcmQgPSB1X3RtcC0+Yml0c19wZXJfd29yZDsKIAkJa190bXAtPmRlbGF5X3VzZWNzID0gdV90bXAtPmRlbGF5X3VzZWNzOwogCQlrX3RtcC0+c3BlZWRfaHogPSB1X3RtcC0+c3BlZWRfaHo7CkBAIC0zNTksNiArMzYyLDEwIEBACiAJCXJldHZhbCA9IF9fcHV0X3VzZXIoc3BpLT5tb2RlICYgU1BJX01PREVfTUFTSywKIAkJCQkJKF9fdTggX191c2VyICopYXJnKTsKIAkJYnJlYWs7CisJY2FzZSBTUElfSU9DX1JEX01PREUzMjoKKwkJcmV0dmFsID0gX19wdXRfdXNlcihzcGktPm1vZGUgJiBTUElfTU9ERV9NQVNLLAorCQkJCQkoX191MzIgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CiAJY2FzZSBTUElfSU9DX1JEX0xTQl9GSVJTVDoKIAkJcmV0dmFsID0gX19wdXRfdXNlcigoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgPyAgMSA6IDAsCiAJCQkJCShfX3U4IF9fdXNlciAqKWFyZyk7CkBAIC0zNzIsOSArMzc5LDEzIEBACiAKIAkvKiB3cml0ZSByZXF1ZXN0cyAqLwogCWNhc2UgU1BJX0lPQ19XUl9NT0RFOgotCQlyZXR2YWwgPSBfX2dldF91c2VyKHRtcCwgKHU4IF9fdXNlciAqKWFyZyk7CisJY2FzZSBTUElfSU9DX1dSX01PREUzMjoKKwkJaWYgKGNtZCA9PSBTUElfSU9DX1dSX01PREUpCisJCQlyZXR2YWwgPSBfX2dldF91c2VyKHRtcCwgKHU4IF9fdXNlciAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHZhbCA9IF9fZ2V0X3VzZXIodG1wLCAodTMyIF9fdXNlciAqKWFyZyk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewotCQkJdTgJc2F2ZSA9IHNwaS0+bW9kZTsKKwkJCXUzMglzYXZlID0gc3BpLT5tb2RlOwogCiAJCQlpZiAodG1wICYgflNQSV9NT0RFX01BU0spIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwpAQCAtMzgyLDE4ICszOTMsMTggQEAKIAkJCX0KIAogCQkJdG1wIHw9IHNwaS0+bW9kZSAmIH5TUElfTU9ERV9NQVNLOwotCQkJc3BpLT5tb2RlID0gKHU4KXRtcDsKKwkJCXNwaS0+bW9kZSA9ICh1MTYpdG1wOwogCQkJcmV0dmFsID0gc3BpX3NldHVwKHNwaSk7CiAJCQlpZiAocmV0dmFsIDwgMCkKIAkJCQlzcGktPm1vZGUgPSBzYXZlOwogCQkJZWxzZQotCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAic3BpIG1vZGUgJTAyeFxuIiwgdG1wKTsKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgInNwaSBtb2RlICV4XG4iLCB0bXApOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU1BJX0lPQ19XUl9MU0JfRklSU1Q6CiAJCXJldHZhbCA9IF9fZ2V0X3VzZXIodG1wLCAoX191OCBfX3VzZXIgKilhcmcpOwogCQlpZiAocmV0dmFsID09IDApIHsKLQkJCXU4CXNhdmUgPSBzcGktPm1vZGU7CisJCQl1MzIJc2F2ZSA9IHNwaS0+bW9kZTsKIAogCQkJaWYgKHRtcCkKIAkJCQlzcGktPm1vZGUgfD0gU1BJX0xTQl9GSVJTVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9LY29uZmlnIGIvZHJpdmVycy9zcG1pL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9LY29uZmlnCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgU1BNSSBkcml2ZXIgY29uZmlndXJhdGlvbgorIworbWVudWNvbmZpZyBTUE1JCisJdHJpc3RhdGUgIlNQTUkgc3VwcG9ydCIKKwloZWxwCisJICBTUE1JIChTeXN0ZW0gUG93ZXIgTWFuYWdlbWVudCBJbnRlcmZhY2UpIGlzIGEgdHdvLXdpcmUKKwkgIHNlcmlhbCBpbnRlcmZhY2UgYmV0d2VlbiBiYXNlYmFuZCBhbmQgYXBwbGljYXRpb24gcHJvY2Vzc29ycworCSAgYW5kIFBvd2VyIE1hbmFnZW1lbnQgSW50ZWdyYXRlZCBDaXJjdWl0cyAoUE1JQykuCisKK2lmIFNQTUkKKworY29uZmlnIFNQTUlfTVNNX1BNSUNfQVJCCisJdHJpc3RhdGUgIlF1YWxjb21tIE1TTSBTUE1JIENvbnRyb2xsZXIgKFBNSUMgQXJiaXRlcikiCisJZGVwZW5kcyBvbiBBUk0KKwlkZXBlbmRzIG9uIElSUV9ET01BSU4KKwlkZXBlbmRzIG9uIEFSQ0hfUUNPTSB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfUUNPTQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQorCSAgYnVpbHQtaW4gU1BNSSBQTUlDIEFyYml0ZXIgaW50ZXJmYWNlIG9uIFF1YWxjb21tIE1TTSBmYW1pbHkKKwkgIHByb2Nlc3NvcnMuCisKKwkgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBRdWFsY29tbSBQTUlDcyBhbmQKKwkgIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIHRoZSBTUE1JIGludGVyZmFjZS4KKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BtaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc1MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcG1pL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3Iga2VybmVsIFNQTUkgZnJhbWV3b3JrLgorIworb2JqLSQoQ09ORklHX1NQTUkpCSs9IHNwbWkubworCitvYmotJChDT05GSUdfU1BNSV9NU01fUE1JQ19BUkIpCSs9IHNwbWktcG1pYy1hcmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcG1pL3NwbWktcG1pYy1hcmIuYyBiL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZTAzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKQEAgLTAsMCArMSw3NzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CisKKy8qIFBNSUMgQXJiaXRlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBQTUlDX0FSQl9WRVJTSU9OCQkweDAwMDAKKyNkZWZpbmUgUE1JQ19BUkJfSU5UX0VOCQkJMHgwMDA0CisKKy8qIFBNSUMgQXJiaXRlciBjaGFubmVsIHJlZ2lzdGVycyAqLworI2RlZmluZSBQTUlDX0FSQl9DTUQoTikJCQkoMHgwODAwICsgKDB4ODAgKiAoTikpKQorI2RlZmluZSBQTUlDX0FSQl9DT05GSUcoTikJCSgweDA4MDQgKyAoMHg4MCAqIChOKSkpCisjZGVmaW5lIFBNSUNfQVJCX1NUQVRVUyhOKQkJKDB4MDgwOCArICgweDgwICogKE4pKSkKKyNkZWZpbmUgUE1JQ19BUkJfV0RBVEEwKE4pCQkoMHgwODEwICsgKDB4ODAgKiAoTikpKQorI2RlZmluZSBQTUlDX0FSQl9XREFUQTEoTikJCSgweDA4MTQgKyAoMHg4MCAqIChOKSkpCisjZGVmaW5lIFBNSUNfQVJCX1JEQVRBMChOKQkJKDB4MDgxOCArICgweDgwICogKE4pKSkKKyNkZWZpbmUgUE1JQ19BUkJfUkRBVEExKE4pCQkoMHgwODFDICsgKDB4ODAgKiAoTikpKQorCisvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworI2RlZmluZSBTUE1JX1BJQ19PV05FUl9BQ0NfU1RBVFVTKE0sIE4pCSgweDAwMDAgKyAoKDMyICogKE0pKSArICg0ICogKE4pKSkpCisjZGVmaW5lIFNQTUlfUElDX0FDQ19FTkFCTEUoTikJCSgweDAyMDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfUElDX0lSUV9TVEFUVVMoTikJCSgweDA2MDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfUElDX0lSUV9DTEVBUihOKQkJKDB4MEEwMCArICg0ICogKE4pKSkKKworLyogTWFwcGluZyBUYWJsZSAqLworI2RlZmluZSBTUE1JX01BUFBJTkdfVEFCTEVfUkVHKE4pCSgweDBCMDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfTUFQUElOR19CSVRfSU5ERVgoWCkJKCgoWCkgPj4gMTgpICYgMHhGKQorI2RlZmluZSBTUE1JX01BUFBJTkdfQklUX0lTXzBfRkxBRyhYKQkoKChYKSA+PiAxNykgJiAweDEpCisjZGVmaW5lIFNQTUlfTUFQUElOR19CSVRfSVNfMF9SRVNVTFQoWCkJKCgoWCkgPj4gOSkgJiAweEZGKQorI2RlZmluZSBTUE1JX01BUFBJTkdfQklUX0lTXzFfRkxBRyhYKQkoKChYKSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgU1BNSV9NQVBQSU5HX0JJVF9JU18xX1JFU1VMVChYKQkoKChYKSA+PiAwKSAmIDB4RkYpCisKKyNkZWZpbmUgU1BNSV9NQVBQSU5HX1RBQkxFX0xFTgkJMjU1CisjZGVmaW5lIFNQTUlfTUFQUElOR19UQUJMRV9UUkVFX0RFUFRICTE2CS8qIE1heGltdW0gb2YgMTYtYml0cyAqLworCisvKiBPd25lcnNoaXAgVGFibGUgKi8KKyNkZWZpbmUgU1BNSV9PV05FUlNISVBfVEFCTEVfUkVHKE4pCSgweDA3MDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfT1dORVJTSElQX1BFUklQSDJPV05FUihYKQkoKFgpICYgMHg3KQorCisvKiBDaGFubmVsIFN0YXR1cyBmaWVsZHMgKi8KK2VudW0gcG1pY19hcmJfY2hubF9zdGF0dXMgeworCVBNSUNfQVJCX1NUQVRVU19ET05FCT0gKDEgPDwgMCksCisJUE1JQ19BUkJfU1RBVFVTX0ZBSUxVUkUJPSAoMSA8PCAxKSwKKwlQTUlDX0FSQl9TVEFUVVNfREVOSUVECT0gKDEgPDwgMiksCisJUE1JQ19BUkJfU1RBVFVTX0RST1BQRUQJPSAoMSA8PCAzKSwKK307CisKKy8qIENvbW1hbmQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIFBNSUNfQVJCX0NNRF9NQVhfQllURV9DT1VOVAk4CisKKy8qIENvbW1hbmQgT3Bjb2RlcyAqLworZW51bSBwbWljX2FyYl9jbWRfb3BfY29kZSB7CisJUE1JQ19BUkJfT1BfRVhUX1dSSVRFTCA9IDAsCisJUE1JQ19BUkJfT1BfRVhUX1JFQURMID0gMSwKKwlQTUlDX0FSQl9PUF9FWFRfV1JJVEUgPSAyLAorCVBNSUNfQVJCX09QX1JFU0VUID0gMywKKwlQTUlDX0FSQl9PUF9TTEVFUCA9IDQsCisJUE1JQ19BUkJfT1BfU0hVVERPV04gPSA1LAorCVBNSUNfQVJCX09QX1dBS0VVUCA9IDYsCisJUE1JQ19BUkJfT1BfQVVUSEVOVElDQVRFID0gNywKKwlQTUlDX0FSQl9PUF9NU1RSX1JFQUQgPSA4LAorCVBNSUNfQVJCX09QX01TVFJfV1JJVEUgPSA5LAorCVBNSUNfQVJCX09QX0VYVF9SRUFEID0gMTMsCisJUE1JQ19BUkJfT1BfV1JJVEUgPSAxNCwKKwlQTUlDX0FSQl9PUF9SRUFEID0gMTUsCisJUE1JQ19BUkJfT1BfWkVST19XUklURSA9IDE2LAorfTsKKworLyogTWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydCBQTUlDIHBlcmlwaGVyYWxzICovCisjZGVmaW5lIFBNSUNfQVJCX01BWF9QRVJJUEhTCQkyNTYKKyNkZWZpbmUgUE1JQ19BUkJfUEVSSVBIX0lEX1ZBTElECSgxIDw8IDE1KQorI2RlZmluZSBQTUlDX0FSQl9USU1FT1VUX1VTCQkxMDAKKyNkZWZpbmUgUE1JQ19BUkJfTUFYX1RSQU5TX0JZVEVTCSg4KQorCisjZGVmaW5lIFBNSUNfQVJCX0FQSURfTUFTSwkJMHhGRgorI2RlZmluZSBQTUlDX0FSQl9QUElEX01BU0sJCTB4RkZGCisKKy8qIGludGVycnVwdCBlbmFibGUgYml0ICovCisjZGVmaW5lIFNQTUlfUElDX0FDQ19FTkFCTEVfQklUCQlCSVQoMCkKKworLyoqCisgKiBzcG1pX3BtaWNfYXJiX2RldiAtIFNQTUkgUE1JQyBBcmJpdGVyIG9iamVjdAorICoKKyAqIEBiYXNlOgkJYWRkcmVzcyBvZiB0aGUgUE1JQyBBcmJpdGVyIGNvcmUgcmVnaXN0ZXJzLgorICogQGludHI6CQlhZGRyZXNzIG9mIHRoZSBTUE1JIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVycy4KKyAqIEBjbmZnOgkJYWRkcmVzcyBvZiB0aGUgUE1JQyBBcmJpdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICogQGxvY2s6CQlsb2NrIHRvIHN5bmNocm9uaXplIGFjY2Vzc2VzLgorICogQGNoYW5uZWw6CQl3aGljaCBjaGFubmVsIHRvIHVzZSBmb3IgYWNjZXNzZXMuCisgKiBAaXJxOgkJUE1JQyBBUkIgaW50ZXJydXB0LgorICogQGVlOgkJCXRoZSBjdXJyZW50IEV4ZWN1dGlvbiBFbnZpcm9ubWVudAorICogQG1pbl9hcGlkOgkJbWluaW11bSBBUElEICh1c2VkIGZvciBib3VuZGluZyBJUlEgc2VhcmNoKQorICogQG1heF9hcGlkOgkJbWF4aW11bSBBUElECisgKiBAbWFwcGluZ190YWJsZToJaW4tbWVtb3J5IGNvcHkgb2YgUFBJRCAtPiBBUElEIG1hcHBpbmcgdGFibGUuCisgKiBAZG9tYWluOgkJaXJxIGRvbWFpbiBvYmplY3QgZm9yIFBNSUMgSVJRIGRvbWFpbgorICogQHNwbWljOgkJU1BNSSBjb250cm9sbGVyIG9iamVjdAorICogQGFwaWRfdG9fcHBpZDoJY2FjaGVkIG1hcHBpbmcgZnJvbSBBUElEIHRvIFBQSUQKKyAqLworc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2IHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXZvaWQgX19pb21lbQkJKmludHI7CisJdm9pZCBfX2lvbWVtCQkqY25mZzsKKwlyYXdfc3BpbmxvY2tfdAkJbG9jazsKKwl1OAkJCWNoYW5uZWw7CisJaW50CQkJaXJxOworCXU4CQkJZWU7CisJdTgJCQltaW5fYXBpZDsKKwl1OAkJCW1heF9hcGlkOworCXUzMgkJCW1hcHBpbmdfdGFibGVbU1BNSV9NQVBQSU5HX1RBQkxFX0xFTl07CisJc3RydWN0IGlycV9kb21haW4JKmRvbWFpbjsKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyCSpzcG1pYzsKKwl1MTYJCQlhcGlkX3RvX3BwaWRbMjU2XTsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBtaWNfYXJiX2Jhc2VfcmVhZChzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZChkZXYtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1pY19hcmJfYmFzZV93cml0ZShzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwKKwkJCQkgICAgICAgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGRldi0+YmFzZSArIG9mZnNldCk7Cit9CisKKy8qKgorICogcGFfcmVhZF9kYXRhOiByZWFkcyBwbWljLWFyYidzIHJlZ2lzdGVyIGFuZCBjb3B5IDEuLjQgYnl0ZXMgdG8gYnVmCisgKiBAYmM6CQlieXRlIGNvdW50IC0xLiByYW5nZTogMC4uMworICogQHJlZzoJcmVnaXN0ZXIncyBhZGRyZXNzCisgKiBAYnVmOglvdXRwdXQgcGFyYW1ldGVyLCBsZW5ndGggbXVzdCBiZSBiYyArIDEKKyAqLworc3RhdGljIHZvaWQgcGFfcmVhZF9kYXRhKHN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqZGV2LCB1OCAqYnVmLCB1MzIgcmVnLCB1OCBiYykKK3sKKwl1MzIgZGF0YSA9IHBtaWNfYXJiX2Jhc2VfcmVhZChkZXYsIHJlZyk7CisJbWVtY3B5KGJ1ZiwgJmRhdGEsIChiYyAmIDMpICsgMSk7Cit9CisKKy8qKgorICogcGFfd3JpdGVfZGF0YTogd3JpdGUgMS4uNCBieXRlcyBmcm9tIGJ1ZiB0byBwbWljLWFyYidzIHJlZ2lzdGVyCisgKiBAYmM6CQlieXRlLWNvdW50IC0xLiByYW5nZTogMC4uMy4KKyAqIEByZWc6CXJlZ2lzdGVyJ3MgYWRkcmVzcy4KKyAqIEBidWY6CWJ1ZmZlciB0byB3cml0ZS4gbGVuZ3RoIG11c3QgYmUgYmMgKyAxLgorICovCitzdGF0aWMgdm9pZAorcGFfd3JpdGVfZGF0YShzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwgY29uc3QgdTggKmJ1ZiwgdTMyIHJlZywgdTggYmMpCit7CisJdTMyIGRhdGEgPSAwOworCW1lbWNweSgmZGF0YSwgYnVmLCAoYmMgJiAzKSArIDEpOworCXBtaWNfYXJiX2Jhc2Vfd3JpdGUoZGV2LCByZWcsIGRhdGEpOworfQorCitzdGF0aWMgaW50IHBtaWNfYXJiX3dhaXRfZm9yX2RvbmUoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1MzIgc3RhdHVzID0gMDsKKwl1MzIgdGltZW91dCA9IFBNSUNfQVJCX1RJTUVPVVRfVVM7CisJdTMyIG9mZnNldCA9IFBNSUNfQVJCX1NUQVRVUyhkZXYtPmNoYW5uZWwpOworCisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQlzdGF0dXMgPSBwbWljX2FyYl9iYXNlX3JlYWQoZGV2LCBvZmZzZXQpOworCisJCWlmIChzdGF0dXMgJiBQTUlDX0FSQl9TVEFUVVNfRE9ORSkgeworCQkJaWYgKHN0YXR1cyAmIFBNSUNfQVJCX1NUQVRVU19ERU5JRUQpIHsKKwkJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJCSIlczogdHJhbnNhY3Rpb24gZGVuaWVkICgweCV4KVxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKworCQkJaWYgKHN0YXR1cyAmIFBNSUNfQVJCX1NUQVRVU19GQUlMVVJFKSB7CisJCQkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJCQkiJXM6IHRyYW5zYWN0aW9uIGZhaWxlZCAoMHgleClcbiIsCisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCisJCQlpZiAoc3RhdHVzICYgUE1JQ19BUkJfU1RBVFVTX0RST1BQRUQpIHsKKwkJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJCSIlczogdHJhbnNhY3Rpb24gZHJvcHBlZCAoMHgleClcbiIsCisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCisJZGV2X2VycigmY3RybC0+ZGV2LAorCQkiJXM6IHRpbWVvdXQsIHN0YXR1cyAweCV4XG4iLAorCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogTm9uLWRhdGEgY29tbWFuZCAqLworc3RhdGljIGludCBwbWljX2FyYl9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3BjLCB1OCBzaWQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwbWljX2FyYiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjbWQ7CisJaW50IHJjOworCisJLyogQ2hlY2sgZm9yIHZhbGlkIG5vbi1kYXRhIGNvbW1hbmQgKi8KKwlpZiAob3BjIDwgU1BNSV9DTURfUkVTRVQgfHwgb3BjID4gU1BNSV9DTURfV0FLRVVQKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZCA9ICgob3BjIHwgMHg0MCkgPDwgMjcpIHwgKChzaWQgJiAweGYpIDw8IDIwKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKwlwbWljX2FyYl9iYXNlX3dyaXRlKHBtaWNfYXJiLCBQTUlDX0FSQl9DTUQocG1pY19hcmItPmNoYW5uZWwpLCBjbWQpOworCXJjID0gcG1pY19hcmJfd2FpdF9mb3JfZG9uZShjdHJsKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbWljX2FyYl9yZWFkX2NtZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGMsIHU4IHNpZCwKKwkJCSAgICAgdTE2IGFkZHIsIHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwbWljX2FyYiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGJjID0gbGVuIC0gMTsKKwl1MzIgY21kOworCWludCByYzsKKworCWlmIChiYyA+PSBQTUlDX0FSQl9NQVhfVFJBTlNfQllURVMpIHsKKwkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJInBtaWMtYXJiIHN1cHBvcnRzIDEuLiVkIGJ5dGVzIHBlciB0cmFucywgYnV0ICVkIHJlcXVlc3RlZCIsCisJCQlQTUlDX0FSQl9NQVhfVFJBTlNfQllURVMsIGxlbik7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGUgb3Bjb2RlICovCisJaWYgKG9wYyA+PSAweDYwICYmIG9wYyA8PSAweDdGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9SRUFEOworCWVsc2UgaWYgKG9wYyA+PSAweDIwICYmIG9wYyA8PSAweDJGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9FWFRfUkVBRDsKKwllbHNlIGlmIChvcGMgPj0gMHgzOCAmJiBvcGMgPD0gMHgzRikKKwkJb3BjID0gUE1JQ19BUkJfT1BfRVhUX1JFQURMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWQgPSAob3BjIDw8IDI3KSB8ICgoc2lkICYgMHhmKSA8PCAyMCkgfCAoYWRkciA8PCA0KSB8IChiYyAmIDB4Nyk7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisJcG1pY19hcmJfYmFzZV93cml0ZShwbWljX2FyYiwgUE1JQ19BUkJfQ01EKHBtaWNfYXJiLT5jaGFubmVsKSwgY21kKTsKKwlyYyA9IHBtaWNfYXJiX3dhaXRfZm9yX2RvbmUoY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGRvbmU7CisKKwlwYV9yZWFkX2RhdGEocG1pY19hcmIsIGJ1ZiwgUE1JQ19BUkJfUkRBVEEwKHBtaWNfYXJiLT5jaGFubmVsKSwKKwkJICAgICBtaW5fdCh1OCwgYmMsIDMpKTsKKworCWlmIChiYyA+IDMpCisJCXBhX3JlYWRfZGF0YShwbWljX2FyYiwgYnVmICsgNCwKKwkJCQlQTUlDX0FSQl9SREFUQTEocG1pY19hcmItPmNoYW5uZWwpLCBiYyAtIDQpOworCitkb25lOgorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWljX2FyYi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbWljX2FyYl93cml0ZV9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3BjLCB1OCBzaWQsCisJCQkgICAgICB1MTYgYWRkciwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBtaWNfYXJiID0gc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKGN0cmwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggYmMgPSBsZW4gLSAxOworCXUzMiBjbWQ7CisJaW50IHJjOworCisJaWYgKGJjID49IFBNSUNfQVJCX01BWF9UUkFOU19CWVRFUykgeworCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkicG1pYy1hcmIgc3VwcG9ydHMgMS4uJWQgYnl0ZXMgcGVyIHRyYW5zLCBidXQ6JWQgcmVxdWVzdGVkIiwKKwkJCVBNSUNfQVJCX01BWF9UUkFOU19CWVRFUywgbGVuKTsKKwkJcmV0dXJuICAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHRoZSBvcGNvZGUgKi8KKwlpZiAob3BjID49IDB4NDAgJiYgb3BjIDw9IDB4NUYpCisJCW9wYyA9IFBNSUNfQVJCX09QX1dSSVRFOworCWVsc2UgaWYgKG9wYyA+PSAweDAwICYmIG9wYyA8PSAweDBGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9FWFRfV1JJVEU7CisJZWxzZSBpZiAob3BjID49IDB4MzAgJiYgb3BjIDw9IDB4MzcpCisJCW9wYyA9IFBNSUNfQVJCX09QX0VYVF9XUklURUw7CisJZWxzZSBpZiAob3BjID49IDB4ODAgJiYgb3BjIDw9IDB4RkYpCisJCW9wYyA9IFBNSUNfQVJCX09QX1pFUk9fV1JJVEU7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZCA9IChvcGMgPDwgMjcpIHwgKChzaWQgJiAweGYpIDw8IDIwKSB8IChhZGRyIDw8IDQpIHwgKGJjICYgMHg3KTsKKworCS8qIFdyaXRlIGRhdGEgdG8gRklGT3MgKi8KKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisJcGFfd3JpdGVfZGF0YShwbWljX2FyYiwgYnVmLCBQTUlDX0FSQl9XREFUQTAocG1pY19hcmItPmNoYW5uZWwpCisJCQkJCQkJLCBtaW5fdCh1OCwgYmMsIDMpKTsKKwlpZiAoYmMgPiAzKQorCQlwYV93cml0ZV9kYXRhKHBtaWNfYXJiLCBidWYgKyA0LAorCQkJCVBNSUNfQVJCX1dEQVRBMShwbWljX2FyYi0+Y2hhbm5lbCksIGJjIC0gNCk7CisKKwkvKiBTdGFydCB0aGUgdHJhbnNhY3Rpb24gKi8KKwlwbWljX2FyYl9iYXNlX3dyaXRlKHBtaWNfYXJiLCBQTUlDX0FSQl9DTUQocG1pY19hcmItPmNoYW5uZWwpLCBjbWQpOworCXJjID0gcG1pY19hcmJfd2FpdF9mb3JfZG9uZShjdHJsKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworZW51bSBxcG5waW50X3JlZ3MgeworCVFQTlBJTlRfUkVHX1JUX1NUUwkJPSAweDEwLAorCVFQTlBJTlRfUkVHX1NFVF9UWVBFCQk9IDB4MTEsCisJUVBOUElOVF9SRUdfUE9MQVJJVFlfSElHSAk9IDB4MTIsCisJUVBOUElOVF9SRUdfUE9MQVJJVFlfTE9XCT0gMHgxMywKKwlRUE5QSU5UX1JFR19MQVRDSEVEX0NMUgkJPSAweDE0LAorCVFQTlBJTlRfUkVHX0VOX1NFVAkJPSAweDE1LAorCVFQTlBJTlRfUkVHX0VOX0NMUgkJPSAweDE2LAorCVFQTlBJTlRfUkVHX0xBVENIRURfU1RTCQk9IDB4MTgsCit9OworCitzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9xcG5waW50X3R5cGUgeworCXU4IHR5cGU7IC8qIDEgLT4gZWRnZSAqLworCXU4IHBvbGFyaXR5X2hpZ2g7CisJdTggcG9sYXJpdHlfbG93OworfSBfX3BhY2tlZDsKKworLyogU2ltcGxpZmllZCBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGlycWNoaXAgY2FsbGJhY2tzICovCitzdGF0aWMgdm9pZCBxcG5waW50X3NwbWlfd3JpdGUoc3RydWN0IGlycV9kYXRhICpkLCB1OCByZWcsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1OCBzaWQgPSBkLT5od2lycSA+PiAyNDsKKwl1OCBwZXIgPSBkLT5od2lycSA+PiAxNjsKKworCWlmIChwbWljX2FyYl93cml0ZV9jbWQocGEtPnNwbWljLCBTUE1JX0NNRF9FWFRfV1JJVEVMLCBzaWQsCisJCQkgICAgICAgKHBlciA8PCA4KSArIHJlZywgYnVmLCBsZW4pKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZwYS0+c3BtaWMtPmRldiwKKwkJCQkiZmFpbGVkIGlycWNoaXAgdHJhbnNhY3Rpb24gb24gJXhcbiIsCisJCQkJICAgIGQtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfc3BtaV9yZWFkKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTggcmVnLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IHNpZCA9IGQtPmh3aXJxID4+IDI0OworCXU4IHBlciA9IGQtPmh3aXJxID4+IDE2OworCisJaWYgKHBtaWNfYXJiX3JlYWRfY21kKHBhLT5zcG1pYywgU1BNSV9DTURfRVhUX1JFQURMLCBzaWQsCisJCQkgICAgICAocGVyIDw8IDgpICsgcmVnLCBidWYsIGxlbikpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJnBhLT5zcG1pYy0+ZGV2LAorCQkJCSJmYWlsZWQgaXJxY2hpcCB0cmFuc2FjdGlvbiBvbiAleFxuIiwKKwkJCQkgICAgZC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgcGVyaXBoX2ludGVycnVwdChzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhLCB1OCBhcGlkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisJdTMyIHN0YXR1czsKKwlpbnQgaWQ7CisKKwlzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBhLT5pbnRyICsgU1BNSV9QSUNfSVJRX1NUQVRVUyhhcGlkKSk7CisJd2hpbGUgKHN0YXR1cykgeworCQlpZCA9IGZmcyhzdGF0dXMpIC0gMTsKKwkJc3RhdHVzICY9IH4oMSA8PCBpZCk7CisJCWlycSA9IGlycV9maW5kX21hcHBpbmcocGEtPmRvbWFpbiwKKwkJCQkgICAgICAgcGEtPmFwaWRfdG9fcHBpZFthcGlkXSA8PCAxNgorCQkJCSAgICAgfCBpZCA8PCA4CisJCQkJICAgICB8IGFwaWQpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBtaWNfYXJiX2NoYWluZWRfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwl2b2lkIF9faW9tZW0gKmludHIgPSBwYS0+aW50cjsKKwlpbnQgZmlyc3QgPSBwYS0+bWluX2FwaWQgPj4gNTsKKwlpbnQgbGFzdCA9IHBhLT5tYXhfYXBpZCA+PiA1OworCXUzMiBzdGF0dXM7CisJaW50IGksIGlkOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyArK2kpIHsKKwkJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChpbnRyICsKKwkJCQkgICAgICAgU1BNSV9QSUNfT1dORVJfQUNDX1NUQVRVUyhwYS0+ZWUsIGkpKTsKKwkJd2hpbGUgKHN0YXR1cykgeworCQkJaWQgPSBmZnMoc3RhdHVzKSAtIDE7CisJCQlzdGF0dXMgJj0gfigxIDw8IGlkKTsKKwkJCXBlcmlwaF9pbnRlcnJ1cHQocGEsIGlkICsgaSAqIDMyKTsKKwkJfQorCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfaXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IGlycSAgPSBkLT5od2lycSA+PiA4OworCXU4IGFwaWQgPSBkLT5od2lycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGRhdGE7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBhLT5sb2NrLCBmbGFncyk7CisJd3JpdGVsX3JlbGF4ZWQoMSA8PCBpcnEsIHBhLT5pbnRyICsgU1BNSV9QSUNfSVJRX0NMRUFSKGFwaWQpKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGEtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEgPSAxIDw8IGlycTsKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfTEFUQ0hFRF9DTFIsICZkYXRhLCAxKTsKK30KKworc3RhdGljIHZvaWQgcXBucGludF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IGlycSAgPSBkLT5od2lycSA+PiA4OworCXU4IGFwaWQgPSBkLT5od2lycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXM7CisJdTggZGF0YTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGEtPmxvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBhLT5pbnRyICsgU1BNSV9QSUNfQUNDX0VOQUJMRShhcGlkKSk7CisJaWYgKHN0YXR1cyAmIFNQTUlfUElDX0FDQ19FTkFCTEVfQklUKSB7CisJCXN0YXR1cyA9IHN0YXR1cyAmIH5TUE1JX1BJQ19BQ0NfRU5BQkxFX0JJVDsKKwkJd3JpdGVsX3JlbGF4ZWQoc3RhdHVzLCBwYS0+aW50ciArIFNQTUlfUElDX0FDQ19FTkFCTEUoYXBpZCkpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGEtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEgPSAxIDw8IGlycTsKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfRU5fQ0xSLCAmZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IGlycSAgPSBkLT5od2lycSA+PiA4OworCXU4IGFwaWQgPSBkLT5od2lycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXM7CisJdTggZGF0YTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGEtPmxvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBhLT5pbnRyICsgU1BNSV9QSUNfQUNDX0VOQUJMRShhcGlkKSk7CisJaWYgKCEoc3RhdHVzICYgU1BNSV9QSUNfQUNDX0VOQUJMRV9CSVQpKSB7CisJCXdyaXRlbF9yZWxheGVkKHN0YXR1cyB8IFNQTUlfUElDX0FDQ19FTkFCTEVfQklULAorCQkJCXBhLT5pbnRyICsgU1BNSV9QSUNfQUNDX0VOQUJMRShhcGlkKSk7CisJfQorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYS0+bG9jaywgZmxhZ3MpOworCisJZGF0YSA9IDEgPDwgaXJxOworCXFwbnBpbnRfc3BtaV93cml0ZShkLCBRUE5QSU5UX1JFR19FTl9TRVQsICZkYXRhLCAxKTsKK30KKworc3RhdGljIHZvaWQgcXBucGludF9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1OCBpcnEgID0gZC0+aHdpcnEgPj4gODsKKwl1OCBkYXRhOworCisJcXBucGludF9pcnFfdW5tYXNrKGQpOworCisJZGF0YSA9IDEgPDwgaXJxOworCXFwbnBpbnRfc3BtaV93cml0ZShkLCBRUE5QSU5UX1JFR19MQVRDSEVEX0NMUiwgJmRhdGEsIDEpOworfQorCitzdGF0aWMgaW50IHFwbnBpbnRfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9xcG5waW50X3R5cGUgdHlwZTsKKwl1OCBpcnEgPSBkLT5od2lycSA+PiA4OworCisJcXBucGludF9zcG1pX3JlYWQoZCwgUVBOUElOVF9SRUdfU0VUX1RZUEUsICZ0eXBlLCBzaXplb2YodHlwZSkpOworCisJaWYgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJCXR5cGUudHlwZSB8PSAxIDw8IGlycTsKKwkJaWYgKGZsb3dfdHlwZSAmIElSUUZfVFJJR0dFUl9SSVNJTkcpCisJCQl0eXBlLnBvbGFyaXR5X2hpZ2ggfD0gMSA8PCBpcnE7CisJCWlmIChmbG93X3R5cGUgJiBJUlFGX1RSSUdHRVJfRkFMTElORykKKwkJCXR5cGUucG9sYXJpdHlfbG93ICB8PSAxIDw8IGlycTsKKwl9IGVsc2UgeworCQlpZiAoKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfSElHSCkpICYmCisJCSAgICAoZmxvd190eXBlICYgKElSUUZfVFJJR0dFUl9MT1cpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXR5cGUudHlwZSAmPSB+KDEgPDwgaXJxKTsgLyogbGV2ZWwgdHJpZyAqLworCQlpZiAoZmxvd190eXBlICYgSVJRRl9UUklHR0VSX0hJR0gpCisJCQl0eXBlLnBvbGFyaXR5X2hpZ2ggfD0gMSA8PCBpcnE7CisJCWVsc2UKKwkJCXR5cGUucG9sYXJpdHlfbG93ICB8PSAxIDw8IGlycTsKKwl9CisKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfU0VUX1RZUEUsICZ0eXBlLCBzaXplb2YodHlwZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBtaWNfYXJiX2lycWNoaXAgPSB7CisJLm5hbWUJCT0gInBtaWNfYXJiIiwKKwkuaXJxX2VuYWJsZQk9IHFwbnBpbnRfaXJxX2VuYWJsZSwKKwkuaXJxX2Fjawk9IHFwbnBpbnRfaXJxX2FjaywKKwkuaXJxX21hc2sJPSBxcG5waW50X2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gcXBucGludF9pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBxcG5waW50X2lycV9zZXRfdHlwZSwKKwkuZmxhZ3MJCT0gSVJRQ0hJUF9NQVNLX09OX1NVU1BFTkQKKwkJCXwgSVJRQ0hJUF9TS0lQX1NFVF9XQUtFLAorfTsKKworc3RydWN0IHNwbWlfcG1pY19hcmJfaXJxX3NwZWMgeworCXVuc2lnbmVkIHNsYXZlOjQ7CisJdW5zaWduZWQgcGVyOjg7CisJdW5zaWduZWQgaXJxOjM7Cit9OworCitzdGF0aWMgaW50IHNlYXJjaF9tYXBwaW5nX3RhYmxlKHN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEsCisJCQkJc3RydWN0IHNwbWlfcG1pY19hcmJfaXJxX3NwZWMgKnNwZWMsCisJCQkJdTggKmFwaWQpCit7CisJdTE2IHBwaWQgPSBzcGVjLT5zbGF2ZSA8PCA4IHwgc3BlYy0+cGVyOworCXUzMiAqbWFwcGluZ190YWJsZSA9IHBhLT5tYXBwaW5nX3RhYmxlOworCWludCBpbmRleCA9IDAsIGk7CisJdTMyIGRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1BNSV9NQVBQSU5HX1RBQkxFX1RSRUVfREVQVEg7ICsraSkgeworCQlkYXRhID0gbWFwcGluZ190YWJsZVtpbmRleF07CisKKwkJaWYgKHBwaWQgJiAoMSA8PCBTUE1JX01BUFBJTkdfQklUX0lOREVYKGRhdGEpKSkgeworCQkJaWYgKFNQTUlfTUFQUElOR19CSVRfSVNfMV9GTEFHKGRhdGEpKSB7CisJCQkJaW5kZXggPSBTUE1JX01BUFBJTkdfQklUX0lTXzFfUkVTVUxUKGRhdGEpOworCQkJfSBlbHNlIHsKKwkJCQkqYXBpZCA9IFNQTUlfTUFQUElOR19CSVRfSVNfMV9SRVNVTFQoZGF0YSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoU1BNSV9NQVBQSU5HX0JJVF9JU18wX0ZMQUcoZGF0YSkpIHsKKwkJCQlpbmRleCA9IFNQTUlfTUFQUElOR19CSVRfSVNfMF9SRVNVTFQoZGF0YSk7CisJCQl9IGVsc2UgeworCQkJCSphcGlkID0gU1BNSV9NQVBQSU5HX0JJVF9JU18wX1JFU1VMVChkYXRhKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHFwbnBpbnRfaXJxX2RvbWFpbl9kdF90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkJICAgY29uc3QgdTMyICppbnRzcGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBkLT5ob3N0X2RhdGE7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfaXJxX3NwZWMgc3BlYzsKKwlpbnQgZXJyOworCXU4IGFwaWQ7CisKKwlkZXZfZGJnKCZwYS0+c3BtaWMtPmRldiwKKwkJImludHNwZWNbMF0gMHglMXggaW50c3BlY1sxXSAweCUwMnggaW50c3BlY1syXSAweCUwMnhcbiIsCisJCWludHNwZWNbMF0sIGludHNwZWNbMV0sIGludHNwZWNbMl0pOworCisJaWYgKGQtPm9mX25vZGUgIT0gY29udHJvbGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGludHNpemUgIT0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGludHNwZWNbMF0gPiAweEYgfHwgaW50c3BlY1sxXSA+IDB4RkYgfHwgaW50c3BlY1syXSA+IDB4NykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGVjLnNsYXZlID0gaW50c3BlY1swXTsKKwlzcGVjLnBlciAgID0gaW50c3BlY1sxXTsKKwlzcGVjLmlycSAgID0gaW50c3BlY1syXTsKKworCWVyciA9IHNlYXJjaF9tYXBwaW5nX3RhYmxlKHBhLCAmc3BlYywgJmFwaWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwYS0+YXBpZF90b19wcGlkW2FwaWRdID0gc3BlYy5zbGF2ZSA8PCA4IHwgc3BlYy5wZXI7CisKKwkvKiBLZWVwIHRyYWNrIG9mIHttYXgsbWlufV9hcGlkIGZvciBib3VuZGluZyBzZWFyY2ggZHVyaW5nIGludGVycnVwdCAqLworCWlmIChhcGlkID4gcGEtPm1heF9hcGlkKQorCQlwYS0+bWF4X2FwaWQgPSBhcGlkOworCWlmIChhcGlkIDwgcGEtPm1pbl9hcGlkKQorCQlwYS0+bWluX2FwaWQgPSBhcGlkOworCisJKm91dF9od2lycSA9IHNwZWMuc2xhdmUgPDwgMjQKKwkJICAgfCBzcGVjLnBlciAgIDw8IDE2CisJCSAgIHwgc3BlYy5pcnEgICA8PCA4CisJCSAgIHwgYXBpZDsKKwkqb3V0X3R5cGUgID0gaW50c3BlY1szXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisKKwlkZXZfZGJnKCZwYS0+c3BtaWMtPmRldiwgIm91dF9od2lycSA9ICVsdVxuIiwgKm91dF9od2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxcG5waW50X2lycV9kb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLAorCQkJCSAgdW5zaWduZWQgaW50IHZpcnEsCisJCQkJICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGQtPmhvc3RfZGF0YTsKKworCWRldl9kYmcoJnBhLT5zcG1pYy0+ZGV2LCAidmlycSA9ICV1LCBod2lycSA9ICVsdVxuIiwgdmlycSwgaHdpcnEpOworCisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwbWljX2FyYl9pcnFjaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBkLT5ob3N0X2RhdGEpOworCWlycV9zZXRfbm9wcm9iZSh2aXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBwbWljX2FyYl9pcnFfZG9tYWluX29wcyA9IHsKKwkubWFwCT0gcXBucGludF9pcnFfZG9tYWluX21hcCwKKwkueGxhdGUJPSBxcG5waW50X2lycV9kb21haW5fZHRfdHJhbnNsYXRlLAorfTsKKworc3RhdGljIGludCBzcG1pX3BtaWNfYXJiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYTsKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXUzMiBjaGFubmVsLCBlZTsKKwlpbnQgZXJyLCBpOworCisJY3RybCA9IHNwbWlfY29udHJvbGxlcl9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBhKSk7CisJaWYgKCFjdHJsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhID0gc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKGN0cmwpOworCXBhLT5zcG1pYyA9IGN0cmw7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiY29yZSIpOworCXBhLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZjdHJsLT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwYS0+YmFzZSkpIHsKKwkJZXJyID0gUFRSX0VSUihwYS0+YmFzZSk7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJpbnRyIik7CisJcGEtPmludHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmN0cmwtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBhLT5pbnRyKSkgeworCQllcnIgPSBQVFJfRVJSKHBhLT5pbnRyKTsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImNuZmciKTsKKwlwYS0+Y25mZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmY3RybC0+ZGV2LCByZXMpOworCWlmIChJU19FUlIocGEtPmNuZmcpKSB7CisJCWVyciA9IFBUUl9FUlIocGEtPmNuZmcpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlwYS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInBlcmlwaF9pcnEiKTsKKwlpZiAocGEtPmlycSA8IDApIHsKKwkJZXJyID0gcGEtPmlycTsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJxY29tLGNoYW5uZWwiLCAmY2hhbm5lbCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjaGFubmVsIHVuc3BlY2lmaWVkLlxuIik7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCWlmIChjaGFubmVsID4gNSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGNoYW5uZWwgKCV1KSBzcGVjaWZpZWQuXG4iLAorCQkJY2hhbm5lbCk7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCXBhLT5jaGFubmVsID0gY2hhbm5lbDsKKworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSxlZSIsICZlZSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFRSB1bnNwZWNpZmllZC5cbiIpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlpZiAoZWUgPiA1KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgRUUgKCV1KSBzcGVjaWZpZWRcbiIsIGVlKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJcGEtPmVlID0gZWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYS0+bWFwcGluZ190YWJsZSk7ICsraSkKKwkJcGEtPm1hcHBpbmdfdGFibGVbaV0gPSByZWFkbF9yZWxheGVkKAorCQkJCXBhLT5jbmZnICsgU1BNSV9NQVBQSU5HX1RBQkxFX1JFRyhpKSk7CisKKwkvKiBJbml0aWFsaXplIG1heF9hcGlkL21pbl9hcGlkIHRvIHRoZSBvcHBvc2l0ZSBib3VuZHMsIGR1cmluZworCSAqIHRoZSBpcnEgZG9tYWluIHRyYW5zbGF0aW9uLCB3ZSBhcmUgc3VyZSB0byB1cGRhdGUgdGhlc2UgKi8KKwlwYS0+bWF4X2FwaWQgPSAwOworCXBhLT5taW5fYXBpZCA9IFBNSUNfQVJCX01BWF9QRVJJUEhTIC0gMTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0cmwpOworCXJhd19zcGluX2xvY2tfaW5pdCgmcGEtPmxvY2spOworCisJY3RybC0+Y21kID0gcG1pY19hcmJfY21kOworCWN0cmwtPnJlYWRfY21kID0gcG1pY19hcmJfcmVhZF9jbWQ7CisJY3RybC0+d3JpdGVfY21kID0gcG1pY19hcmJfd3JpdGVfY21kOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiYWRkaW5nIGlycSBkb21haW5cbiIpOworCXBhLT5kb21haW4gPSBpcnFfZG9tYWluX2FkZF90cmVlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgJnBtaWNfYXJiX2lycV9kb21haW5fb3BzLCBwYSk7CisJaWYgKCFwYS0+ZG9tYWluKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgaXJxX2RvbWFpblxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBhLT5pcnEsIHBhKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwYS0+aXJxLCBwbWljX2FyYl9jaGFpbmVkX2lycSk7CisKKwllcnIgPSBzcG1pX2NvbnRyb2xsZXJfYWRkKGN0cmwpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2RvbWFpbl9yZW1vdmU7CisKKwlkZXZfZGJnKCZjdHJsLT5kZXYsICJQTUlDIEFyYiBWZXJzaW9uIDB4JXhcbiIsCisJCXBtaWNfYXJiX2Jhc2VfcmVhZChwYSwgUE1JQ19BUkJfVkVSU0lPTikpOworCisJcmV0dXJuIDA7CisKK2Vycl9kb21haW5fcmVtb3ZlOgorCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBhLT5pcnEsIE5VTEwpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBhLT5pcnEsIE5VTEwpOworCWlycV9kb21haW5fcmVtb3ZlKHBhLT5kb21haW4pOworZXJyX3B1dF9jdHJsOgorCXNwbWlfY29udHJvbGxlcl9wdXQoY3RybCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcG1pX3BtaWNfYXJiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhID0gc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKGN0cmwpOworCXNwbWlfY29udHJvbGxlcl9yZW1vdmUoY3RybCk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocGEtPmlycSwgTlVMTCk7CisJaXJxX3NldF9oYW5kbGVyX2RhdGEocGEtPmlycSwgTlVMTCk7CisJaXJxX2RvbWFpbl9yZW1vdmUocGEtPmRvbWFpbik7CisJc3BtaV9jb250cm9sbGVyX3B1dChjdHJsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3BtaV9wbWljX2FyYl9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcG1pLXBtaWMtYXJiIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzcG1pX3BtaWNfYXJiX21hdGNoX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BtaV9wbWljX2FyYl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNwbWlfcG1pY19hcmJfcHJvYmUsCisJLnJlbW92ZQkJPSBzcG1pX3BtaWNfYXJiX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic3BtaV9wbWljX2FyYiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzcG1pX3BtaWNfYXJiX21hdGNoX3RhYmxlLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcG1pX3BtaWNfYXJiX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3BtaV9wbWljX2FyYiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcG1pL3NwbWkuYyBiL2RyaXZlcnMvc3BtaS9zcG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NzgwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9zcG1pLmMKQEAgLTAsMCArMSw1NzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmg+CisKK3N0YXRpYyBERUZJTkVfSURBKGN0cmxfaWRhKTsKKworc3RhdGljIHZvaWQgc3BtaV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2ID0gdG9fc3BtaV9kZXZpY2UoZGV2KTsKKwlrZnJlZShzZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZpY2VfdHlwZSBzcG1pX2Rldl90eXBlID0geworCS5yZWxlYXNlCT0gc3BtaV9kZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIHNwbWlfY3RybF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsID0gdG9fc3BtaV9jb250cm9sbGVyKGRldik7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmN0cmxfaWRhLCBjdHJsLT5ucik7CisJa2ZyZWUoY3RybCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgc3BtaV9jdHJsX3R5cGUgPSB7CisJLnJlbGVhc2UJPSBzcG1pX2N0cmxfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc3BtaV9kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCWlmIChvZl9kcml2ZXJfbWF0Y2hfZGV2aWNlKGRldiwgZHJ2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZHJ2LT5uYW1lKQorCQlyZXR1cm4gc3RybmNtcChkZXZfbmFtZShkZXYpLCBkcnYtPm5hbWUsCisJCQkgICAgICAgU1BNSV9OQU1FX1NJWkUpID09IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcG1pX2RldmljZV9hZGQoKSAtIGFkZCBhIGRldmljZSBwcmV2aW91c2x5IGNvbnN0cnVjdGVkIHZpYSBzcG1pX2RldmljZV9hbGxvYygpCisgKiBAc2RldjoJc3BtaV9kZXZpY2UgdG8gYmUgYWRkZWQKKyAqLworaW50IHNwbWlfZGV2aWNlX2FkZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCA9IHNkZXYtPmN0cmw7CisJaW50IGVycjsKKworCWRldl9zZXRfbmFtZSgmc2Rldi0+ZGV2LCAiJWQtJTAyeCIsIGN0cmwtPm5yLCBzZGV2LT51c2lkKTsKKworCWVyciA9IGRldmljZV9hZGQoJnNkZXYtPmRldik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycigmc2Rldi0+ZGV2LCAiQ2FuJ3QgYWRkICVzLCBzdGF0dXMgJWRcbiIsCisJCQlkZXZfbmFtZSgmc2Rldi0+ZGV2KSwgZXJyKTsKKwkJZ290byBlcnJfZGV2aWNlX2FkZDsKKwl9CisKKwlkZXZfZGJnKCZzZGV2LT5kZXYsICJkZXZpY2UgJXMgcmVnaXN0ZXJlZFxuIiwgZGV2X25hbWUoJnNkZXYtPmRldikpOworCitlcnJfZGV2aWNlX2FkZDoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9kZXZpY2VfYWRkKTsKKworLyoqCisgKiBzcG1pX2RldmljZV9yZW1vdmUoKTogcmVtb3ZlIGFuIFNQTUkgZGV2aWNlCisgKiBAc2RldjoJc3BtaV9kZXZpY2UgdG8gYmUgcmVtb3ZlZAorICovCit2b2lkIHNwbWlfZGV2aWNlX3JlbW92ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJZGV2aWNlX3VucmVnaXN0ZXIoJnNkZXYtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2RldmljZV9yZW1vdmUpOworCitzdGF0aWMgaW5saW5lIGludAorc3BtaV9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLCB1OCBzaWQpCit7CisJaWYgKCFjdHJsIHx8ICFjdHJsLT5jbWQgfHwgY3RybC0+ZGV2LnR5cGUgIT0gJnNwbWlfY3RybF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjdHJsLT5jbWQoY3RybCwgb3Bjb2RlLCBzaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzcG1pX3JlYWRfY21kKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsIHU4IG9wY29kZSwKKwkJCQl1OCBzaWQsIHUxNiBhZGRyLCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmICghY3RybCB8fCAhY3RybC0+cmVhZF9jbWQgfHwgY3RybC0+ZGV2LnR5cGUgIT0gJnNwbWlfY3RybF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjdHJsLT5yZWFkX2NtZChjdHJsLCBvcGNvZGUsIHNpZCwgYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBzcG1pX3dyaXRlX2NtZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkJIHU4IHNpZCwgdTE2IGFkZHIsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKCFjdHJsIHx8ICFjdHJsLT53cml0ZV9jbWQgfHwgY3RybC0+ZGV2LnR5cGUgIT0gJnNwbWlfY3RybF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjdHJsLT53cml0ZV9jbWQoY3RybCwgb3Bjb2RlLCBzaWQsIGFkZHIsIGJ1ZiwgbGVuKTsKK30KKworLyoqCisgKiBzcG1pX3JlZ2lzdGVyX3JlYWQoKSAtIHJlZ2lzdGVyIHJlYWQKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqIEBhZGRyOglzbGF2ZSByZWdpc3RlciBhZGRyZXNzICg1LWJpdCBhZGRyZXNzKS4KKyAqIEBidWY6CWJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIFNsYXZlLgorICoKKyAqIFJlYWRzIDEgYnl0ZSBvZiBkYXRhIGZyb20gYSBTbGF2ZSBkZXZpY2UgcmVnaXN0ZXIuCisgKi8KK2ludCBzcG1pX3JlZ2lzdGVyX3JlYWQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCAqYnVmKQoreworCS8qIDUtYml0IHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlpZiAoYWRkciA+IDB4MUYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwbWlfcmVhZF9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfUkVBRCwgc2Rldi0+dXNpZCwgYWRkciwKKwkJCSAgICAgYnVmLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfcmVnaXN0ZXJfcmVhZCk7CisKKy8qKgorICogc3BtaV9leHRfcmVnaXN0ZXJfcmVhZCgpIC0gZXh0ZW5kZWQgcmVnaXN0ZXIgcmVhZAorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICogQGFkZHI6CXNsYXZlIHJlZ2lzdGVyIGFkZHJlc3MgKDgtYml0IGFkZHJlc3MpLgorICogQGJ1ZjoJYnVmZmVyIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gMTYgYnl0ZXMpLgorICoKKyAqIFJlYWRzIHVwIHRvIDE2IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXIgc3BhY2Ugb24gYQorICogU2xhdmUgZGV2aWNlLgorICovCitpbnQgc3BtaV9leHRfcmVnaXN0ZXJfcmVhZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4ICpidWYsCisJCQkgICBzaXplX3QgbGVuKQoreworCS8qIDgtYml0IHJlZ2lzdGVyIGFkZHJlc3MsIHVwIHRvIDE2IGJ5dGVzICovCisJaWYgKGxlbiA9PSAwIHx8IGxlbiA+IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3JlYWRfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX0VYVF9SRUFELCBzZGV2LT51c2lkLCBhZGRyLAorCQkJICAgICBidWYsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkKTsKKworLyoqCisgKiBzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkbCgpIC0gZXh0ZW5kZWQgcmVnaXN0ZXIgcmVhZCBsb25nCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKiBAYWRkcjoJc2xhdmUgcmVnaXN0ZXIgYWRkcmVzcyAoMTYtYml0IGFkZHJlc3MpLgorICogQGJ1ZjoJYnVmZmVyIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gOCBieXRlcykuCisgKgorICogUmVhZHMgdXAgdG8gOCBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGV4dGVuZGVkIHJlZ2lzdGVyIHNwYWNlIG9uIGEKKyAqIFNsYXZlIGRldmljZSB1c2luZyAxNi1iaXQgYWRkcmVzcy4KKyAqLworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTE2IGFkZHIsIHU4ICpidWYsCisJCQkgICAgc2l6ZV90IGxlbikKK3sKKwkvKiAxNi1iaXQgcmVnaXN0ZXIgYWRkcmVzcywgdXAgdG8gOCBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3JlYWRfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX0VYVF9SRUFETCwgc2Rldi0+dXNpZCwgYWRkciwKKwkJCSAgICAgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfcmVhZGwpOworCisvKioKKyAqIHNwbWlfcmVnaXN0ZXJfd3JpdGUoKSAtIHJlZ2lzdGVyIHdyaXRlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UKKyAqIEBhZGRyOglzbGF2ZSByZWdpc3RlciBhZGRyZXNzICg1LWJpdCBhZGRyZXNzKS4KKyAqIEBkYXRhOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgU2xhdmUuCisgKgorICogV3JpdGVzIDEgYnl0ZSBvZiBkYXRhIHRvIGEgU2xhdmUgZGV2aWNlIHJlZ2lzdGVyLgorICovCitpbnQgc3BtaV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4IGRhdGEpCit7CisJLyogNS1iaXQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCWlmIChhZGRyID4gMHgxRikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfV1JJVEUsIHNkZXYtPnVzaWQsIGFkZHIsCisJCQkgICAgICAmZGF0YSwgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX3JlZ2lzdGVyX3dyaXRlKTsKKworLyoqCisgKiBzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUoKSAtIHJlZ2lzdGVyIHplcm8gd3JpdGUKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqIEBkYXRhOgl0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHJlZ2lzdGVyIDAgKDctYml0cykuCisgKgorICogV3JpdGVzIGRhdGEgdG8gcmVnaXN0ZXIgMCBvZiB0aGUgU2xhdmUgZGV2aWNlLgorICovCitpbnQgc3BtaV9yZWdpc3Rlcl96ZXJvX3dyaXRlKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggZGF0YSkKK3sKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfWkVST19XUklURSwgc2Rldi0+dXNpZCwgMCwKKwkJCSAgICAgICZkYXRhLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfcmVnaXN0ZXJfemVyb193cml0ZSk7CisKKy8qKgorICogc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGUoKSAtIGV4dGVuZGVkIHJlZ2lzdGVyIHdyaXRlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKiBAYWRkcjoJc2xhdmUgcmVnaXN0ZXIgYWRkcmVzcyAoOC1iaXQgYWRkcmVzcykuCisgKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gMTYgYnl0ZXMpLgorICoKKyAqIFdyaXRlcyB1cCB0byAxNiBieXRlcyBvZiBkYXRhIHRvIHRoZSBleHRlbmRlZCByZWdpc3RlciBzcGFjZSBvZiBhCisgKiBTbGF2ZSBkZXZpY2UuCisgKi8KK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIGNvbnN0IHU4ICpidWYsCisJCQkgICAgc2l6ZV90IGxlbikKK3sKKwkvKiA4LWJpdCByZWdpc3RlciBhZGRyZXNzLCB1cCB0byAxNiBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfRVhUX1dSSVRFLCBzZGV2LT51c2lkLCBhZGRyLAorCQkJICAgICAgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGUpOworCisvKioKKyAqIHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlbCgpIC0gZXh0ZW5kZWQgcmVnaXN0ZXIgd3JpdGUgbG9uZworICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICogQGFkZHI6CXNsYXZlIHJlZ2lzdGVyIGFkZHJlc3MgKDE2LWJpdCBhZGRyZXNzKS4KKyAqIEBidWY6CWJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBTbGF2ZS4KKyAqIEBsZW46CXRoZSByZXF1ZXN0IG51bWJlciBvZiBieXRlcyB0byByZWFkICh1cCB0byA4IGJ5dGVzKS4KKyAqCisgKiBXcml0ZXMgdXAgdG8gOCBieXRlcyBvZiBkYXRhIHRvIHRoZSBleHRlbmRlZCByZWdpc3RlciBzcGFjZSBvZiBhCisgKiBTbGF2ZSBkZXZpY2UgdXNpbmcgMTYtYml0IGFkZHJlc3MuCisgKi8KK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1MTYgYWRkciwgY29uc3QgdTggKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGxlbikKK3sKKwkvKiA0LWJpdCBTbGF2ZSBJZGVudGlmaWVyLCAxNi1iaXQgcmVnaXN0ZXIgYWRkcmVzcywgdXAgdG8gOCBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3dyaXRlX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9FWFRfV1JJVEVMLCBzZGV2LT51c2lkLAorCQkJICAgICAgYWRkciwgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGVsKTsKKworLyoqCisgKiBzcG1pX2NvbW1hbmRfcmVzZXQoKSAtIHNlbmRzIFJFU0VUIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBzbGF2ZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBSZXNldCBjb21tYW5kIGluaXRpYWxpemVzIHRoZSBTbGF2ZSBhbmQgZm9yY2VzIGFsbCByZWdpc3RlcnMgdG8KKyAqIHRoZWlyIHJlc2V0IHZhbHVlcy4gVGhlIFNsYXZlIHNoYWxsIGVudGVyIHRoZSBTVEFSVFVQIHN0YXRlIGFmdGVyCisgKiByZWNlaXZpbmcgYSBSZXNldCBjb21tYW5kLgorICovCitpbnQgc3BtaV9jb21tYW5kX3Jlc2V0KHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc3BtaV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfUkVTRVQsIHNkZXYtPnVzaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9jb21tYW5kX3Jlc2V0KTsKKworLyoqCisgKiBzcG1pX2NvbW1hbmRfc2xlZXAoKSAtIHNlbmRzIFNMRUVQIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBTUE1JIGRldmljZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBTbGVlcCBjb21tYW5kIGNhdXNlcyB0aGUgU2xhdmUgdG8gZW50ZXIgdGhlIHVzZXIgZGVmaW5lZCBTTEVFUCBzdGF0ZS4KKyAqLworaW50IHNwbWlfY29tbWFuZF9zbGVlcChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJcmV0dXJuIHNwbWlfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1NMRUVQLCBzZGV2LT51c2lkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29tbWFuZF9zbGVlcCk7CisKKy8qKgorICogc3BtaV9jb21tYW5kX3dha2V1cCgpIC0gc2VuZHMgV0FLRVVQIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBTUE1JIGRldmljZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBXYWtldXAgY29tbWFuZCBjYXVzZXMgdGhlIFNsYXZlIHRvIG1vdmUgZnJvbSB0aGUgU0xFRVAgc3RhdGUgdG8KKyAqIHRoZSBBQ1RJVkUgc3RhdGUuCisgKi8KK2ludCBzcG1pX2NvbW1hbmRfd2FrZXVwKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc3BtaV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfV0FLRVVQLCBzZGV2LT51c2lkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29tbWFuZF93YWtldXApOworCisvKioKKyAqIHNwbWlfY29tbWFuZF9zaHV0ZG93bigpIC0gc2VuZHMgU0hVVERPV04gY29tbWFuZCB0byB0aGUgc3BlY2lmaWVkIFNQTUkgZGV2aWNlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKgorICogVGhlIFNodXRkb3duIGNvbW1hbmQgY2F1c2VzIHRoZSBTbGF2ZSB0byBlbnRlciB0aGUgU0hVVERPV04gc3RhdGUuCisgKi8KK2ludCBzcG1pX2NvbW1hbmRfc2h1dGRvd24oc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzcG1pX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9TSFVURE9XTiwgc2Rldi0+dXNpZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbW1hbmRfc2h1dGRvd24pOworCitzdGF0aWMgaW50IHNwbWlfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BtaV9kcml2ZXIgKnNkcnYgPSB0b19zcG1pX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2ID0gdG9fc3BtaV9kZXZpY2UoZGV2KTsKKwlpbnQgZXJyOworCisJLyogRW5zdXJlIHRoZSBzbGF2ZSBpcyBpbiBBQ1RJVkUgc3RhdGUgKi8KKwllcnIgPSBzcG1pX2NvbW1hbmRfd2FrZXVwKHNkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF93YWtldXA7CisKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwllcnIgPSBzZHJ2LT5wcm9iZShzZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfcHJvYmU7CisKKwlyZXR1cm4gMDsKKworZmFpbF9wcm9iZToKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKK2ZhaWxfd2FrZXVwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3BtaV9kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BtaV9kcml2ZXIgKnNkcnYgPSB0b19zcG1pX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJc2Rydi0+cmVtb3ZlKHRvX3NwbWlfZGV2aWNlKGRldikpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc3BtaV9idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAic3BtaSIsCisJLm1hdGNoCQk9IHNwbWlfZGV2aWNlX21hdGNoLAorCS5wcm9iZQkJPSBzcG1pX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IHNwbWlfZHJ2X3JlbW92ZSwKK307CisKKy8qKgorICogc3BtaV9jb250cm9sbGVyX2FsbG9jKCkgLSBBbGxvY2F0ZSBhIG5ldyBTUE1JIGRldmljZQorICogQGN0cmw6CWFzc29jaWF0ZWQgY29udHJvbGxlcgorICoKKyAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWl0aGVyIGNhbGxpbmcgc3BtaV9kZXZpY2VfYWRkKCkgdG8gYWRkIHRoZQorICogbmV3bHkgYWxsb2NhdGVkIGNvbnRyb2xsZXIsIG9yIGNhbGxpbmcgc3BtaV9kZXZpY2VfcHV0KCkgdG8gZGlzY2FyZCBpdC4KKyAqLworc3RydWN0IHNwbWlfZGV2aWNlICpzcG1pX2RldmljZV9hbGxvYyhzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCXN0cnVjdCBzcG1pX2RldmljZSAqc2RldjsKKworCXNkZXYgPSBremFsbG9jKHNpemVvZigqc2RldiksIEdGUF9LRVJORUwpOworCWlmICghc2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlzZGV2LT5jdHJsID0gY3RybDsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmc2Rldi0+ZGV2KTsKKwlzZGV2LT5kZXYucGFyZW50ID0gJmN0cmwtPmRldjsKKwlzZGV2LT5kZXYuYnVzID0gJnNwbWlfYnVzX3R5cGU7CisJc2Rldi0+ZGV2LnR5cGUgPSAmc3BtaV9kZXZfdHlwZTsKKwlyZXR1cm4gc2RldjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZGV2aWNlX2FsbG9jKTsKKworLyoqCisgKiBzcG1pX2NvbnRyb2xsZXJfYWxsb2MoKSAtIEFsbG9jYXRlIGEgbmV3IFNQTUkgY29udHJvbGxlcgorICogQHBhcmVudDoJcGFyZW50IGRldmljZQorICogQHNpemU6CXNpemUgb2YgcHJpdmF0ZSBkYXRhCisgKgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlaXRoZXIgY2FsbGluZyBzcG1pX2NvbnRyb2xsZXJfYWRkKCkgdG8gYWRkIHRoZQorICogbmV3bHkgYWxsb2NhdGVkIGNvbnRyb2xsZXIsIG9yIGNhbGxpbmcgc3BtaV9jb250cm9sbGVyX3B1dCgpIHRvIGRpc2NhcmQgaXQuCisgKiBUaGUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSByZWdpb24gbWF5IGJlIGFjY2Vzc2VkIHZpYQorICogc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKCkKKyAqLworc3RydWN0IHNwbWlfY29udHJvbGxlciAqc3BtaV9jb250cm9sbGVyX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCQkJICAgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybDsKKwlpbnQgaWQ7CisKKwlpZiAoV0FSTl9PTighcGFyZW50KSkKKwkJcmV0dXJuIE5VTEw7CisKKwljdHJsID0ga3phbGxvYyhzaXplb2YoKmN0cmwpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHJsKQorCQlyZXR1cm4gTlVMTDsKKworCWRldmljZV9pbml0aWFsaXplKCZjdHJsLT5kZXYpOworCWN0cmwtPmRldi50eXBlID0gJnNwbWlfY3RybF90eXBlOworCWN0cmwtPmRldi5idXMgPSAmc3BtaV9idXNfdHlwZTsKKwljdHJsLT5kZXYucGFyZW50ID0gcGFyZW50OworCWN0cmwtPmRldi5vZl9ub2RlID0gcGFyZW50LT5vZl9ub2RlOworCXNwbWlfY29udHJvbGxlcl9zZXRfZHJ2ZGF0YShjdHJsLCAmY3RybFsxXSk7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZjdHJsX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGlkIDwgMCkgeworCQlkZXZfZXJyKHBhcmVudCwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgU1BNSSBjb250cm9sbGVyIGlkZW50aWZpZXIuXG4iKTsKKwkJc3BtaV9jb250cm9sbGVyX3B1dChjdHJsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY3RybC0+bnIgPSBpZDsKKwlkZXZfc2V0X25hbWUoJmN0cmwtPmRldiwgInNwbWktJWQiLCBpZCk7CisKKwlkZXZfZGJnKCZjdHJsLT5kZXYsICJhbGxvY2F0ZWQgY29udHJvbGxlciAweCVwIGlkICVkXG4iLCBjdHJsLCBpZCk7CisJcmV0dXJuIGN0cmw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbnRyb2xsZXJfYWxsb2MpOworCitzdGF0aWMgdm9pZCBvZl9zcG1pX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IGVycjsKKworCWlmICghY3RybC0+ZGV2Lm9mX25vZGUpCisJCXJldHVybjsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKGN0cmwtPmRldi5vZl9ub2RlLCBub2RlKSB7CisJCXN0cnVjdCBzcG1pX2RldmljZSAqc2RldjsKKwkJdTMyIHJlZ1syXTsKKworCQlkZXZfZGJnKCZjdHJsLT5kZXYsICJhZGRpbmcgY2hpbGQgJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwkJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobm9kZSwgInJlZyIsIHJlZywgMik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJCQkibm9kZSAlcyBlcnIgKCVkKSBkb2VzIG5vdCBoYXZlICdyZWcnIHByb3BlcnR5XG4iLAorCQkJCW5vZGUtPmZ1bGxfbmFtZSwgZXJyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlZ1sxXSAhPSBTUE1JX1VTSUQpIHsKKwkJCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJCQkibm9kZSAlcyBjb250YWlucyB1bnN1cHBvcnRlZCAncmVnJyBlbnRyeVxuIiwKKwkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmVnWzBdID49IFNQTUlfTUFYX1NMQVZFX0lEKSB7CisJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJImludmFsaWQgdXNpZCBvbiBub2RlICVzXG4iLAorCQkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRldl9kYmcoJmN0cmwtPmRldiwgInJlYWQgdXNpZCAlMDJ4XG4iLCByZWdbMF0pOworCisJCXNkZXYgPSBzcG1pX2RldmljZV9hbGxvYyhjdHJsKTsKKwkJaWYgKCFzZGV2KQorCQkJY29udGludWU7CisKKwkJc2Rldi0+ZGV2Lm9mX25vZGUgPSBub2RlOworCQlzZGV2LT51c2lkID0gKHU4KSByZWdbMF07CisKKwkJZXJyID0gc3BtaV9kZXZpY2VfYWRkKHNkZXYpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZzZGV2LT5kZXYsCisJCQkJImZhaWx1cmUgYWRkaW5nIGRldmljZS4gc3RhdHVzICVkXG4iLCBlcnIpOworCQkJc3BtaV9kZXZpY2VfcHV0KHNkZXYpOworCQl9CisJfQorfQorCisvKioKKyAqIHNwbWlfY29udHJvbGxlcl9hZGQoKSAtIEFkZCBhbiBTUE1JIGNvbnRyb2xsZXIKKyAqIEBjdHJsOgljb250cm9sbGVyIHRvIGJlIHJlZ2lzdGVyZWQuCisgKgorICogUmVnaXN0ZXIgYSBjb250cm9sbGVyIHByZXZpb3VzbHkgYWxsb2NhdGVkIHZpYSBzcG1pX2NvbnRyb2xsZXJfYWxsb2MoKSB3aXRoCisgKiB0aGUgU1BNSSBjb3JlLgorICovCitpbnQgc3BtaV9jb250cm9sbGVyX2FkZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCWludCByZXQ7CisKKwkvKiBDYW4ndCByZWdpc3RlciB1bnRpbCBhZnRlciBkcml2ZXIgbW9kZWwgaW5pdCAqLworCWlmIChXQVJOX09OKCFzcG1pX2J1c190eXBlLnApKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldCA9IGRldmljZV9hZGQoJmN0cmwtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikpCisJCW9mX3NwbWlfcmVnaXN0ZXJfZGV2aWNlcyhjdHJsKTsKKworCWRldl9kYmcoJmN0cmwtPmRldiwgInNwbWktJWQgcmVnaXN0ZXJlZDogZGV2OiVwXG4iLAorCQljdHJsLT5uciwgJmN0cmwtPmRldik7CisKKwlyZXR1cm4gMDsKK307CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbnRyb2xsZXJfYWRkKTsKKworLyogUmVtb3ZlIGEgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgc3BtaV9jdHJsX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcG1pX2RldmljZSAqc3BtaWRldiA9IHRvX3NwbWlfZGV2aWNlKGRldik7CisJaWYgKGRldi0+dHlwZSA9PSAmc3BtaV9kZXZfdHlwZSkKKwkJc3BtaV9kZXZpY2VfcmVtb3ZlKHNwbWlkZXYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwbWlfY29udHJvbGxlcl9yZW1vdmUoKTogcmVtb3ZlIGFuIFNQTUkgY29udHJvbGxlcgorICogQGN0cmw6CWNvbnRyb2xsZXIgdG8gcmVtb3ZlCisgKgorICogUmVtb3ZlIGEgU1BNSSBjb250cm9sbGVyLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBzcG1pX2NvbnRyb2xsZXJfcHV0KCkgdG8gZGlzY2FyZCB0aGUgYWxsb2NhdGVkIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgc3BtaV9jb250cm9sbGVyX3JlbW92ZShzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCWludCBkdW1teTsKKworCWlmICghY3RybCkKKwkJcmV0dXJuOworCisJZHVtbXkgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmN0cmwtPmRldiwgTlVMTCwKKwkJCQkgICAgICBzcG1pX2N0cmxfcmVtb3ZlX2RldmljZSk7CisJZGV2aWNlX2RlbCgmY3RybC0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29udHJvbGxlcl9yZW1vdmUpOworCisvKioKKyAqIHNwbWlfZHJpdmVyX3JlZ2lzdGVyKCkgLSBSZWdpc3RlciBjbGllbnQgZHJpdmVyIHdpdGggU1BNSSBjb3JlCisgKiBAc2RydjoJY2xpZW50IGRyaXZlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggY2xpZW50LWRldmljZS4KKyAqCisgKiBUaGlzIEFQSSB3aWxsIHJlZ2lzdGVyIHRoZSBjbGllbnQgZHJpdmVyIHdpdGggdGhlIFNQTUkgZnJhbWV3b3JrLgorICogSXQgaXMgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIncyBtb2R1bGUtaW5pdCBmdW5jdGlvbi4KKyAqLworaW50IHNwbWlfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzcG1pX2RyaXZlciAqc2RydikKK3sKKwlzZHJ2LT5kcml2ZXIuYnVzID0gJnNwbWlfYnVzX3R5cGU7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmc2Rydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZHJpdmVyX3JlZ2lzdGVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IHNwbWlfZXhpdCh2b2lkKQoreworCWJ1c191bnJlZ2lzdGVyKCZzcG1pX2J1c190eXBlKTsKK30KK21vZHVsZV9leGl0KHNwbWlfZXhpdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNwbWlfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJnNwbWlfYnVzX3R5cGUpOworfQorcG9zdGNvcmVfaW5pdGNhbGwoc3BtaV9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUE1JIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcG1pIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IDk5Mzc1ZjAuLjQ3Y2YxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC0zNCw4ICszNCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZWNoby9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWciCkBAIC04Miw4ICs4MCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9LY29uZmlnIgpAQCAtMTI4LDggKzEyNCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RncnAvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2IxMDV4L0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL0tjb25maWciCkBAIC0xNDYsNCArMTQwLDEwIEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RnYXAvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCBkZGMzYzRhLi5kMTJmNjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC05LDcgKzksNiBAQAogb2JqLSQoQ09ORklHX1VTQklQX0NPUkUpCSs9IHVzYmlwLwogb2JqLSQoQ09ORklHX1czNVVORCkJCSs9IHdpbmJvbmQvCiBvYmotJChDT05GSUdfUFJJU00yX1VTQikJKz0gd2xhbi1uZy8KLW9iai0kKENPTkZJR19FQ0hPKQkJKz0gZWNoby8KIG9iai0kKENPTkZJR19DT01FREkpCQkrPSBjb21lZGkvCiBvYmotJChDT05GSUdfRkJfT0xQQ19EQ09OKQkrPSBvbHBjX2Rjb24vCiBvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC8KQEAgLTM1LDcgKzM0LDYgQEAKIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMikJKz0gd2xhZ3M0OV9oMi8KIG9iai0kKENPTkZJR19XTEFHUzQ5X0gyNSkJKz0gd2xhZ3M0OV9oMjUvCi1vYmotJChDT05GSUdfRkJfU003WFgpCQkrPSBzbTd4eGZiLwogb2JqLSQoQ09ORklHX0NSWVNUQUxIRCkJCSs9IGNyeXN0YWxoZC8KIG9iai0kKENPTkZJR19DWFQxRTEpCQkrPSBjeHQxZTEvCiBvYmotJChDT05GSUdfRkJfWEdJKQkJKz0geGdpZmIvCkBAIC01Nyw3ICs1NSw2IEBACiBvYmotJChDT05GSUdfQ0VEMTQwMSkJCSs9IGNlZDE0MDEvCiBvYmotJChDT05GSUdfRFJNX0lNWCkJCSs9IGlteC1kcm0vCiBvYmotJChDT05GSUdfREdSUCkJCSs9IGRncnAvCi1vYmotJChDT05GSUdfU0IxMDVYKQkJKz0gc2IxMDV4Lwogb2JqLSQoQ09ORklHX0ZJUkVXSVJFX1NFUklBTCkJKz0gZndzZXJpYWwvCiBvYmotJChDT05GSUdfR09MREZJU0gpCQkrPSBnb2xkZmlzaC8KIG9iai0kKENPTkZJR19MVVNUUkVfRlMpCQkrPSBsdXN0cmUvCkBAIC02NSwzICs2Miw2IEBACiBvYmotJChDT05GSUdfREdOQykJCQkrPSBkZ25jLwogb2JqLSQoQ09ORklHX0RHQVApCQkJKz0gZGdhcC8KIG9iai0kKENPTkZJR19NVERfU1BJTkFORF9NVDI5RikJKz0gbXQyOWZfc3BpbmFuZC8KK29iai0kKENPTkZJR19HU19GUEdBQk9PVCkJKz0gZ3NfZnBnYWJvb3QvCitvYmotJChDT05GSUdfQlRfTk9LSUFfSDRQKQkrPSBub2tpYV9oNHAvCitvYmotJChDT05GSUdfVU5JU1lTU1BBUikJKz0gdW5pc3lzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKaW5kZXggYjkxYzc1OC4uYWIyOGQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCkBAIC0yMCw2ICsyMCwxOSBAQAogCSAgQW5kcm9pZCBwcm9jZXNzLCB1c2luZyBCaW5kZXIgdG8gaWRlbnRpZnksIGludm9rZSBhbmQgcGFzcyBhcmd1bWVudHMKIAkgIGJldHdlZW4gc2FpZCBwcm9jZXNzZXMuCiAKK2NvbmZpZyBBTkRST0lEX0JJTkRFUl9JUENfMzJCSVQKKwlib29sCisJZGVwZW5kcyBvbiAhNjRCSVQgJiYgQU5EUk9JRF9CSU5ERVJfSVBDCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhlIEJpbmRlciBBUEkgaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IGJvdGggMzIgYW5kIDY0Yml0CisJICBhcHBsaWNhdGlvbnMgaW4gYSBtaXhlZCBlbnZpcm9ubWVudC4KKworCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBhbiBvbGQgMzItYml0IEFuZHJvaWQgdXNlci1zcGFjZSAodjQuNCBhbmQKKwkgIGVhcmxpZXIpLgorCisJICBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIGJyZWFrIG5ld2VyIEFuZHJvaWQgdXNlci1zcGFjZS4KKwogY29uZmlnIEFTSE1FTQogCWJvb2wgIkVuYWJsZSB0aGUgQW5vbnltb3VzIFNoYXJlZCBNZW1vcnkgU3Vic3lzdGVtIgogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYW5kcm9pZF9hbGFybS5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYW5kcm9pZF9hbGFybS5oCmluZGV4IDRmZDMyZjMuLjQ5NWIyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FuZHJvaWRfYWxhcm0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hbmRyb2lkX2FsYXJtLmgKQEAgLTE2LDUwICsxNiwxMCBAQAogI2lmbmRlZiBfTElOVVhfQU5EUk9JRF9BTEFSTV9ICiAjZGVmaW5lIF9MSU5VWF9BTkRST0lEX0FMQVJNX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAKLWVudW0gYW5kcm9pZF9hbGFybV90eXBlIHsKLQkvKiByZXR1cm4gY29kZSBiaXQgbnVtYmVycyBvciBzZXQgYWxhcm0gYXJnICovCi0JQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQLAotCUFORFJPSURfQUxBUk1fUlRDLAotCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsCi0JQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FLAotCUFORFJPSURfQUxBUk1fU1lTVEVNVElNRSwKLQotCUFORFJPSURfQUxBUk1fVFlQRV9DT1VOVCwKLQotCS8qIHJldHVybiBjb2RlIGJpdCBudW1iZXJzICovCi0JLyogQU5EUk9JRF9BTEFSTV9USU1FX0NIQU5HRSA9IDE2ICovCi19OwotCi1lbnVtIGFuZHJvaWRfYWxhcm1fcmV0dXJuX2ZsYWdzIHsKLQlBTkRST0lEX0FMQVJNX1JUQ19XQUtFVVBfTUFTSyA9IDFVIDw8IEFORFJPSURfQUxBUk1fUlRDX1dBS0VVUCwKLQlBTkRST0lEX0FMQVJNX1JUQ19NQVNLID0gMVUgPDwgQU5EUk9JRF9BTEFSTV9SVEMsCi0JQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUF9NQVNLID0KLQkJCQkxVSA8PCBBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAotCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9NQVNLID0KLQkJCQkxVSA8PCBBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUUsCi0JQU5EUk9JRF9BTEFSTV9TWVNURU1USU1FX01BU0sgPSAxVSA8PCBBTkRST0lEX0FMQVJNX1NZU1RFTVRJTUUsCi0JQU5EUk9JRF9BTEFSTV9USU1FX0NIQU5HRV9NQVNLID0gMVUgPDwgMTYKLX07Ci0KLS8qIERpc2FibGUgYWxhcm0gKi8KLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9DTEVBUih0eXBlKSAgICAgICAgICAgX0lPKCdhJywgMCB8ICgodHlwZSkgPDwgNCkpCi0KLS8qIEFjayBsYXN0IGFsYXJtIGFuZCB3YWl0IGZvciBuZXh0ICovCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fV0FJVCAgICAgICAgICAgICAgICAgIF9JTygnYScsIDEpCi0KLSNkZWZpbmUgQUxBUk1fSU9XKGMsIHR5cGUsIHNpemUpICAgICAgICAgICAgX0lPVygnYScsIChjKSB8ICgodHlwZSkgPDwgNCksIHNpemUpCi0vKiBTZXQgYWxhcm0gKi8KLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVQodHlwZSkgICAgICAgICAgICAgQUxBUk1fSU9XKDIsIHR5cGUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVRfQU5EX1dBSVQodHlwZSkgICAgQUxBUk1fSU9XKDMsIHR5cGUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9HRVRfVElNRSh0eXBlKSAgICAgICAgQUxBUk1fSU9XKDQsIHR5cGUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVRfUlRDICAgICAgICAgICAgICAgX0lPVygnYScsIDUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9CQVNFX0NNRChjbWQpICAgICAgICAgKGNtZCAmIH4oX0lPQygwLCAwLCAweGYwLCAwKSkpCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fSU9DVExfVE9fVFlQRShjbWQpICAgIChfSU9DX05SKGNtZCkgPj4gNCkKLQorI2luY2x1ZGUgInVhcGkvYW5kcm9pZF9hbGFybS5oIgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogI2RlZmluZSBBTkRST0lEX0FMQVJNX1NFVF9DT01QQVQodHlwZSkJCUFMQVJNX0lPVygyLCB0eXBlLCBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5oCmluZGV4IDhkYzBmMGQuLjVhYmNmZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5oCkBAIC0xNiwzNSArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKLSNkZWZpbmUgQVNITUVNX05BTUVfTEVOCQkyNTYKLQotI2RlZmluZSBBU0hNRU1fTkFNRV9ERUYJCSJkZXYvYXNobWVtIgotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX1BJTjogV2FzIHRoZSBtYXBwaW5nIHB1cmdlZCB3aGlsZSB1bnBpbm5lZD8gKi8KLSNkZWZpbmUgQVNITUVNX05PVF9QVVJHRUQJMAotI2RlZmluZSBBU0hNRU1fV0FTX1BVUkdFRAkxCi0KLS8qIFJldHVybiB2YWx1ZXMgZnJvbSBBU0hNRU1fR0VUX1BJTl9TVEFUVVM6IElzIHRoZSBtYXBwaW5nIHBpbm5lZD8gKi8KLSNkZWZpbmUgQVNITUVNX0lTX1VOUElOTkVECTAKLSNkZWZpbmUgQVNITUVNX0lTX1BJTk5FRAkxCi0KLXN0cnVjdCBhc2htZW1fcGluIHsKLQlfX3UzMiBvZmZzZXQ7CS8qIG9mZnNldCBpbnRvIHJlZ2lvbiwgaW4gYnl0ZXMsIHBhZ2UtYWxpZ25lZCAqLwotCV9fdTMyIGxlbjsJLyogbGVuZ3RoIGZvcndhcmQgZnJvbSBvZmZzZXQsIGluIGJ5dGVzLCBwYWdlLWFsaWduZWQgKi8KLX07Ci0KLSNkZWZpbmUgX19BU0hNRU1JT0MJCTB4NzcKLQotI2RlZmluZSBBU0hNRU1fU0VUX05BTUUJCV9JT1coX19BU0hNRU1JT0MsIDEsIGNoYXJbQVNITUVNX05BTUVfTEVOXSkKLSNkZWZpbmUgQVNITUVNX0dFVF9OQU1FCQlfSU9SKF9fQVNITUVNSU9DLCAyLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCi0jZGVmaW5lIEFTSE1FTV9TRVRfU0laRQkJX0lPVyhfX0FTSE1FTUlPQywgMywgc2l6ZV90KQotI2RlZmluZSBBU0hNRU1fR0VUX1NJWkUJCV9JTyhfX0FTSE1FTUlPQywgNCkKLSNkZWZpbmUgQVNITUVNX1NFVF9QUk9UX01BU0sJX0lPVyhfX0FTSE1FTUlPQywgNSwgdW5zaWduZWQgbG9uZykKLSNkZWZpbmUgQVNITUVNX0dFVF9QUk9UX01BU0sJX0lPKF9fQVNITUVNSU9DLCA2KQotI2RlZmluZSBBU0hNRU1fUElOCQlfSU9XKF9fQVNITUVNSU9DLCA3LCBzdHJ1Y3QgYXNobWVtX3BpbikKLSNkZWZpbmUgQVNITUVNX1VOUElOCQlfSU9XKF9fQVNITUVNSU9DLCA4LCBzdHJ1Y3QgYXNobWVtX3BpbikKLSNkZWZpbmUgQVNITUVNX0dFVF9QSU5fU1RBVFVTCV9JTyhfX0FTSE1FTUlPQywgOSkKLSNkZWZpbmUgQVNITUVNX1BVUkdFX0FMTF9DQUNIRVMJX0lPKF9fQVNITUVNSU9DLCAxMCkKKyNpbmNsdWRlICJ1YXBpL2FzaG1lbS5oIgogCiAvKiBzdXBwb3J0IG9mIDMyYml0IHVzZXJzcGFjZSBvbiA2NGJpdCBwbGF0Zm9ybXMgKi8KICNpZmRlZiBDT05GSUdfQ09NUEFUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCmluZGV4IDE0MzJkOTUuLmNmZTRiYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCkBAIC0yMjgsOCArMjI4LDggQEAKIAlpbnQgaW50ZXJuYWxfc3Ryb25nX3JlZnM7CiAJaW50IGxvY2FsX3dlYWtfcmVmczsKIAlpbnQgbG9jYWxfc3Ryb25nX3JlZnM7Ci0Jdm9pZCBfX3VzZXIgKnB0cjsKLQl2b2lkIF9fdXNlciAqY29va2llOworCWJpbmRlcl91aW50cHRyX3QgcHRyOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogCXVuc2lnbmVkIGhhc19zdHJvbmdfcmVmOjE7CiAJdW5zaWduZWQgcGVuZGluZ19zdHJvbmdfcmVmOjE7CiAJdW5zaWduZWQgaGFzX3dlYWtfcmVmOjE7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAogc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggewogCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXZvaWQgX191c2VyICpjb29raWU7CisJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7CiB9OwogCiBzdHJ1Y3QgYmluZGVyX3JlZiB7CkBAIC01MTUsMTQgKzUxNSwxNCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9idWZmZXJfbG9va3VwKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJCSAgdm9pZCBfX3VzZXIgKnVzZXJfcHRyKQorCQkJCQkJICB1aW50cHRyX3QgdXNlcl9wdHIpCiB7CiAJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOwogCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CiAJc3RydWN0IGJpbmRlcl9idWZmZXIgKmtlcm5fcHRyOwogCi0Ja2Vybl9wdHIgPSB1c2VyX3B0ciAtIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldAotCQktIG9mZnNldG9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBkYXRhKTsKKwlrZXJuX3B0ciA9IChzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqKSh1c2VyX3B0ciAtIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldAorCQktIG9mZnNldG9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBkYXRhKSk7CiAKIAl3aGlsZSAobikgewogCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CkBAIC04NTYsNyArODU2LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2dldF9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgdm9pZCBfX3VzZXIgKnB0cikKKwkJCQkJICAgYmluZGVyX3VpbnRwdHJfdCBwdHIpCiB7CiAJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5ub2Rlcy5yYl9ub2RlOwogCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKQEAgLTg3NSw4ICs4NzUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICpiaW5kZXJfbmV3X25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCQkgICB2b2lkIF9fdXNlciAqcHRyLAotCQkJCQkgICB2b2lkIF9fdXNlciAqY29va2llKQorCQkJCQkgICBiaW5kZXJfdWludHB0cl90IHB0ciwKKwkJCQkJICAgYmluZGVyX3VpbnRwdHJfdCBjb29raWUpCiB7CiAJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPm5vZGVzLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC05MDgsOSArOTA4LDkgQEAKIAlJTklUX0xJU1RfSEVBRCgmbm9kZS0+d29yay5lbnRyeSk7CiAJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmFzeW5jX3RvZG8pOwogCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJICAgICAiJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIGNyZWF0ZWRcbiIsCisJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSUwMTZsbHggYyUwMTZsbHggY3JlYXRlZFxuIiwKIAkJICAgICBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCi0JCSAgICAgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkgICAgICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJcmV0dXJuIG5vZGU7CiB9CiAKQEAgLTEyMjYsOSArMTIyNiw5IEBACiAKIHN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCiAJCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIsCi0JCQkJCSAgICAgIHNpemVfdCAqZmFpbGVkX2F0KQorCQkJCQkgICAgICBiaW5kZXJfc2l6ZV90ICpmYWlsZWRfYXQpCiB7Ci0Jc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKKwliaW5kZXJfc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKIAlpbnQgZGVidWdfaWQgPSBidWZmZXItPmRlYnVnX2lkOwogCiAJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKQEAgLTEyMzksNyArMTIzOSw4IEBACiAJaWYgKGJ1ZmZlci0+dGFyZ2V0X25vZGUpCiAJCWJpbmRlcl9kZWNfbm9kZShidWZmZXItPnRhcmdldF9ub2RlLCAxLCAwKTsKIAotCW9mZnAgPSAoc2l6ZV90ICopKGJ1ZmZlci0+ZGF0YSArIEFMSUdOKGJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkpOworCW9mZnAgPSAoYmluZGVyX3NpemVfdCAqKShidWZmZXItPmRhdGEgKworCQkJCSBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKIAlpZiAoZmFpbGVkX2F0KQogCQlvZmZfZW5kID0gZmFpbGVkX2F0OwogCWVsc2UKQEAgLTEyNDksOCArMTI1MCw4IEBACiAJCWlmICgqb2ZmcCA+IGJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkgfHwKIAkJICAgIGJ1ZmZlci0+ZGF0YV9zaXplIDwgc2l6ZW9mKCpmcCkgfHwKIAkJICAgICFJU19BTElHTkVEKCpvZmZwLCBzaXplb2YodTMyKSkpIHsKLQkJCXByX2VycigidHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQgb2Zmc2V0ICV6ZCwgc2l6ZSAlemRcbiIsCi0JCQkgZGVidWdfaWQsICpvZmZwLCBidWZmZXItPmRhdGFfc2l6ZSk7CisJCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG9mZnNldCAlbGxkLCBzaXplICV6ZFxuIiwKKwkJCSAgICAgICBkZWJ1Z19pZCwgKHU2NCkqb2ZmcCwgYnVmZmVyLT5kYXRhX3NpemUpOwogCQkJY29udGludWU7CiAJCX0KIAkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKShidWZmZXItPmRhdGEgKyAqb2ZmcCk7CkBAIC0xMjU5LDEzICsxMjYwLDEzIEBACiAJCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKIAkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBmcC0+YmluZGVyKTsKIAkJCWlmIChub2RlID09IE5VTEwpIHsKLQkJCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG5vZGUgJXBcbiIsCi0JCQkJCWRlYnVnX2lkLCBmcC0+YmluZGVyKTsKKwkJCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG5vZGUgJTAxNmxseFxuIiwKKwkJCQkgICAgICAgZGVidWdfaWQsICh1NjQpZnAtPmJpbmRlcik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgbm9kZSAlZCB1JXBcbiIsCi0JCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyKTsKKwkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSUwMTZsbHhcbiIsCisJCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgKHU2NClub2RlLT5wdHIpOwogCQkJYmluZGVyX2RlY19ub2RlKG5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCk7CiAJCX0gYnJlYWs7CiAJCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgpAQCAtMTMwMyw3ICsxMzA0LDcgQEAKIHsKIAlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OwogCXN0cnVjdCBiaW5kZXJfd29yayAqdGNvbXBsZXRlOwotCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CisJYmluZGVyX3NpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CiAJc3RydWN0IGJpbmRlcl9wcm9jICp0YXJnZXRfcHJvYzsKIAlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCA9IE5VTEw7CiAJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZSA9IE5VTEw7CkBAIC0xNDMyLDE4ICsxNDMzLDIwIEBACiAKIAlpZiAocmVwbHkpCiAJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkgICAgICIlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCisJCQkgICAgICIlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgZGF0YSAlMDE2bGx4LSUwMTZsbHggc2l6ZSAlbGxkLSVsbGRcbiIsCiAJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAogCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfdGhyZWFkLT5waWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YS5wdHIuYnVmZmVyLAorCQkJICAgICAodTY0KXRyLT5kYXRhLnB0ci5vZmZzZXRzLAorCQkJICAgICAodTY0KXRyLT5kYXRhX3NpemUsICh1NjQpdHItPm9mZnNldHNfc2l6ZSk7CiAJZWxzZQogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiJWQ6JWQgQkNfVFJBTlNBQ1RJT04gJWQgLT4gJWQgLSBub2RlICVkLCBkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKKwkJCSAgICAgIiVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICVkIC0gbm9kZSAlZCwgZGF0YSAlMDE2bGx4LSUwMTZsbHggc2l6ZSAlbGxkLSVsbGRcbiIsCiAJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAogCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfbm9kZS0+ZGVidWdfaWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YS5wdHIuYnVmZmVyLAorCQkJICAgICAodTY0KXRyLT5kYXRhLnB0ci5vZmZzZXRzLAorCQkJICAgICAodTY0KXRyLT5kYXRhX3NpemUsICh1NjQpdHItPm9mZnNldHNfc2l6ZSk7CiAKIAlpZiAoIXJlcGx5ICYmICEodHItPmZsYWdzICYgVEZfT05FX1dBWSkpCiAJCXQtPmZyb20gPSB0aHJlYWQ7CkBAIC0xNDcyLDIzICsxNDc1LDI2IEBACiAJaWYgKHRhcmdldF9ub2RlKQogCQliaW5kZXJfaW5jX25vZGUodGFyZ2V0X25vZGUsIDEsIDAsIE5VTEwpOwogCi0Jb2ZmcCA9IChzaXplX3QgKikodC0+YnVmZmVyLT5kYXRhICsgQUxJR04odHItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKwlvZmZwID0gKGJpbmRlcl9zaXplX3QgKikodC0+YnVmZmVyLT5kYXRhICsKKwkJCQkgQUxJR04odHItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcih0LT5idWZmZXItPmRhdGEsIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhX3NpemUpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKHQtPmJ1ZmZlci0+ZGF0YSwgKGNvbnN0IHZvaWQgX191c2VyICopKHVpbnRwdHJfdCkKKwkJCSAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhX3NpemUpKSB7CiAJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGRhdGEgcHRyXG4iLAogCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwogCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CiAJCWdvdG8gZXJyX2NvcHlfZGF0YV9mYWlsZWQ7CiAJfQotCWlmIChjb3B5X2Zyb21fdXNlcihvZmZwLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywgdHItPm9mZnNldHNfc2l6ZSkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIob2ZmcCwgKGNvbnN0IHZvaWQgX191c2VyICopKHVpbnRwdHJfdCkKKwkJCSAgIHRyLT5kYXRhLnB0ci5vZmZzZXRzLCB0ci0+b2Zmc2V0c19zaXplKSkgewogCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBvZmZzZXRzIHB0clxuIiwKIAkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKIAkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwogCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOwogCX0KLQlpZiAoIUlTX0FMSUdORUQodHItPm9mZnNldHNfc2l6ZSwgc2l6ZW9mKHNpemVfdCkpKSB7Ci0JCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldHMgc2l6ZSwgJXpkXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRyLT5vZmZzZXRzX3NpemUpOworCWlmICghSVNfQUxJR05FRCh0ci0+b2Zmc2V0c19zaXplLCBzaXplb2YoYmluZGVyX3NpemVfdCkpKSB7CisJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldHMgc2l6ZSwgJWxsZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KXRyLT5vZmZzZXRzX3NpemUpOwogCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CiAJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7CiAJfQpAQCAtMTQ5OCw4ICsxNTA0LDggQEAKIAkJaWYgKCpvZmZwID4gdC0+YnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSB8fAogCQkgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUgPCBzaXplb2YoKmZwKSB8fAogCQkgICAgIUlTX0FMSUdORUQoKm9mZnAsIHNpemVvZih1MzIpKSkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgb2Zmc2V0LCAlemRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICpvZmZwKTsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldCwgJWxsZFxuIiwKKwkJCQkJICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KSpvZmZwKTsKIAkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKIAkJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7CiAJCX0KQEAgLTE1MTksMTAgKzE1MjUsMTAgQEAKIAkJCQlub2RlLT5hY2NlcHRfZmRzID0gISEoZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyk7CiAJCQl9CiAJCQlpZiAoZnAtPmNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgc2VuZGluZyB1JXAgbm9kZSAlZCwgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBzZW5kaW5nIHUlMDE2bGx4IG5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlMDE2bGx4ICE9ICUwMTZsbHhcbiIsCiAJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCWZwLT5iaW5kZXIsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQlmcC0+Y29va2llLCBub2RlLT5jb29raWUpOworCQkJCQkodTY0KWZwLT5iaW5kZXIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQkodTY0KWZwLT5jb29raWUsICh1NjQpbm9kZS0+Y29va2llKTsKIAkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7CiAJCQl9CiAJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgbm9kZSk7CkBAIC0xNTQwLDkgKzE1NDYsOSBAQAogCiAJCQl0cmFjZV9iaW5kZXJfdHJhbnNhY3Rpb25fbm9kZV90b19yZWYodCwgbm9kZSwgcmVmKTsKIAkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiICAgICAgICBub2RlICVkIHUlcCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKLQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIHJlZi0+ZGVidWdfaWQsCi0JCQkJICAgICByZWYtPmRlc2MpOworCQkJCSAgICAgIiAgICAgICAgbm9kZSAlZCB1JTAxNmxseCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKKwkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLCAodTY0KW5vZGUtPnB0ciwKKwkJCQkgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYyk7CiAJCX0gYnJlYWs7CiAJCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgogCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOiB7CkBAIC0xNTY0LDkgKzE1NzAsOSBAQAogCQkJCWJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCwgTlVMTCk7CiAJCQkJdHJhY2VfYmluZGVyX3RyYW5zYWN0aW9uX3JlZl90b19ub2RlKHQsIHJlZik7CiAJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiBub2RlICVkIHUlcFxuIiwKKwkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiBub2RlICVkIHUlMDE2bGx4XG4iLAogCQkJCQkgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5kZWJ1Z19pZCwKLQkJCQkJICAgICByZWYtPm5vZGUtPnB0cik7CisJCQkJCSAgICAgKHU2NClyZWYtPm5vZGUtPnB0cik7CiAJCQl9IGVsc2UgewogCQkJCXN0cnVjdCBiaW5kZXJfcmVmICpuZXdfcmVmOwogCQkJCW5ld19yZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgcmVmLT5ub2RlKTsKQEAgLTE2ODIsOSArMTY4OCw5IEBACiBlcnJfaW52YWxpZF90YXJnZXRfaGFuZGxlOgogZXJyX25vX2NvbnRleHRfbWdyX25vZGU6CiAJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04sCi0JCSAgICAgIiVkOiVkIHRyYW5zYWN0aW9uIGZhaWxlZCAlZCwgc2l6ZSAlemQtJXpkXG4iLAorCQkgICAgICIlZDolZCB0cmFuc2FjdGlvbiBmYWlsZWQgJWQsIHNpemUgJWxsZC0lbGxkXG4iLAogCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHJldHVybl9lcnJvciwKLQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwkJICAgICAodTY0KXRyLT5kYXRhX3NpemUsICh1NjQpdHItPm9mZnNldHNfc2l6ZSk7CiAKIAl7CiAJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpmZTsKQEAgLTE3MDIsOSArMTcwOCwxMSBAQAogCiBzdGF0aWMgaW50IGJpbmRlcl90aHJlYWRfd3JpdGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAogCQkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3QgKmNvbnN1bWVkKQorCQkJYmluZGVyX3VpbnRwdHJfdCBiaW5kZXJfYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKwkJCWJpbmRlcl9zaXplX3QgKmNvbnN1bWVkKQogewogCXVpbnQzMl90IGNtZDsKKwl2b2lkIF9fdXNlciAqYnVmZmVyID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdCliaW5kZXJfYnVmZmVyOwogCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7CiAJdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7CiAKQEAgLTE3NzMsMzMgKzE3ODEsMzMgQEAKIAkJfQogCQljYXNlIEJDX0lOQ1JFRlNfRE9ORToKIAkJY2FzZSBCQ19BQ1FVSVJFX0RPTkU6IHsKLQkJCXZvaWQgX191c2VyICpub2RlX3B0cjsKLQkJCXZvaWQgX191c2VyICpjb29raWU7CisJCQliaW5kZXJfdWludHB0cl90IG5vZGVfcHRyOworCQkJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7CiAJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CiAKLQkJCWlmIChnZXRfdXNlcihub2RlX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJaWYgKGdldF91c2VyKG5vZGVfcHRyLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlwdHIgKz0gc2l6ZW9mKGJpbmRlcl91aW50cHRyX3QpOwogCQkJbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBub2RlX3B0cik7CiAJCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkICVzIHUlcCBubyBtYXRjaFxuIiwKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgdSUwMTZsbHggbm8gbWF0Y2hcbiIsCiAJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPwogCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6CiAJCQkJCSJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCQlub2RlX3B0cik7CisJCQkJCSh1NjQpbm9kZV9wdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKGNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgdSVwIG5vZGUgJWQgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCAlcyB1JTAxNmxseCBub2RlICVkIGNvb2tpZSBtaXNtYXRjaCAlMDE2bGx4ICE9ICUwMTZsbHhcbiIsCiAJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPwogCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCQlub2RlX3B0ciwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCWNvb2tpZSwgbm9kZS0+Y29va2llKTsKKwkJCQkJKHU2NClub2RlX3B0ciwgbm9kZS0+ZGVidWdfaWQsCisJCQkJCSh1NjQpY29va2llLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoY21kID09IEJDX0FDUVVJUkVfRE9ORSkgewpAQCAtMTgzNSwyNyArMTg0MywyOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJY2FzZSBCQ19GUkVFX0JVRkZFUjogewotCQkJdm9pZCBfX3VzZXIgKmRhdGFfcHRyOworCQkJYmluZGVyX3VpbnRwdHJfdCBkYXRhX3B0cjsKIAkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CiAKLQkJCWlmIChnZXRfdXNlcihkYXRhX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJaWYgKGdldF91c2VyKGRhdGFfcHRyLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKIAogCQkJYnVmZmVyID0gYmluZGVyX2J1ZmZlcl9sb29rdXAocHJvYywgZGF0YV9wdHIpOwogCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBubyBtYXRjaFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIpOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JTAxNmxseCBubyBtYXRjaFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NClkYXRhX3B0cik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoIWJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBtYXRjaGVkIHVucmV0dXJuZWQgYnVmZmVyXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0cik7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlMDE2bGx4IG1hdGNoZWQgdW5yZXR1cm5lZCBidWZmZXJcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICh1NjQpZGF0YV9wdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUiwKLQkJCQkgICAgICIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JXAgZm91bmQgYnVmZmVyICVkIGZvciAlcyB0cmFuc2FjdGlvblxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyLCBidWZmZXItPmRlYnVnX2lkLAorCQkJCSAgICAgIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlMDE2bGx4IGZvdW5kIGJ1ZmZlciAlZCBmb3IgJXMgdHJhbnNhY3Rpb25cbiIsCisJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWRhdGFfcHRyLAorCQkJCSAgICAgYnVmZmVyLT5kZWJ1Z19pZCwKIAkJCQkgICAgIGJ1ZmZlci0+dHJhbnNhY3Rpb24gPyAiYWN0aXZlIiA6ICJmaW5pc2hlZCIpOwogCiAJCQlpZiAoYnVmZmVyLT50cmFuc2FjdGlvbikgewpAQCAtMTkyNSwxNiArMTkzNCwxNiBAQAogCQljYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgogCQljYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewogCQkJdWludDMyX3QgdGFyZ2V0OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwkJCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKIAkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aDsKIAogCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKIAkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRhcmdldCk7CiAJCQlpZiAocmVmID09IE5VTEwpIHsKIAkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgaW52YWxpZCByZWYgJWRcbiIsCkBAIC0xOTQ3LDEyICsxOTU2LDEyIEBACiAJCQl9CiAKIAkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBVEhfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgIiVkOiVkICVzICVwIHJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZCBmb3Igbm9kZSAlZFxuIiwKKwkJCQkgICAgICIlZDolZCAlcyAlMDE2bGx4IHJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZCBmb3Igbm9kZSAlZFxuIiwKIAkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJICAgICBjbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPwogCQkJCSAgICAgIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiA6CiAJCQkJICAgICAiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkJCQkgICAgIGNvb2tpZSwgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLAorCQkJCSAgICAgKHU2NCljb29raWUsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywKIAkJCQkgICAgIHJlZi0+c3Ryb25nLCByZWYtPndlYWssIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwogCiAJCQlpZiAoY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OKSB7CkBAIC0xOTkwLDkgKzE5OTksMTAgQEAKIAkJCQl9CiAJCQkJZGVhdGggPSByZWYtPmRlYXRoOwogCQkJCWlmIChkZWF0aC0+Y29va2llICE9IGNvb2tpZSkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdGlvbiBjb29raWUgbWlzbWF0Y2ggJXAgIT0gJXBcbiIsCisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gZGVhdGggbm90aWZpY2F0aW9uIGNvb2tpZSBtaXNtYXRjaCAlMDE2bGx4ICE9ICUwMTZsbHhcbiIsCiAJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQkJZGVhdGgtPmNvb2tpZSwgY29va2llKTsKKwkJCQkJCSh1NjQpZGVhdGgtPmNvb2tpZSwKKwkJCQkJCSh1NjQpY29va2llKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCXJlZi0+ZGVhdGggPSBOVUxMOwpAQCAtMjAxMiw5ICsyMDIyLDkgQEAKIAkJfSBicmVhazsKIAkJY2FzZSBCQ19ERUFEX0JJTkRFUl9ET05FOiB7CiAJCQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7Ci0JCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7CiAJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGggPSBOVUxMOwotCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgX191c2VyICogX191c2VyICopcHRyKSkKKwkJCWlmIChnZXRfdXNlcihjb29raWUsIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKQEAgLTIwMjYsMTEgKzIwMzYsMTIgQEAKIAkJCQl9CiAJCQl9CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJCSAgICAgIiVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgZm91bmQgJXBcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUsIGRlYXRoKTsKKwkJCQkgICAgICIlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICUwMTZsbHggZm91bmQgJXBcbiIsCisJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWNvb2tpZSwKKwkJCQkgICAgIGRlYXRoKTsKIAkJCWlmIChkZWF0aCA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgbm90IGZvdW5kXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUpOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICUwMTZsbHggbm90IGZvdW5kXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWNvb2tpZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIwODIsOSArMjA5MywxMCBAQAogCiBzdGF0aWMgaW50IGJpbmRlcl90aHJlYWRfcmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCiAJCQkgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJICAgICAgdm9pZCAgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAotCQkJICAgICAgc2l6ZV90ICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKKwkJCSAgICAgIGJpbmRlcl91aW50cHRyX3QgYmluZGVyX2J1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgICAgICBiaW5kZXJfc2l6ZV90ICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKIHsKKwl2b2lkIF9fdXNlciAqYnVmZmVyID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdCliaW5kZXJfYnVmZmVyOwogCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7CiAJdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7CiAKQEAgLTIyMjksMzIgKzIyNDEsNDAgQEAKIAkJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQkJaWYgKHB1dF91c2VyKG5vZGUtPnB0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsCisJCQkJCSAgICAgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlwdHIgKz0gc2l6ZW9mKGJpbmRlcl91aW50cHRyX3QpOworCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsCisJCQkJCSAgICAgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CiAKIAkJCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7CiAJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19VU0VSX1JFRlMsCi0JCQkJCSAgICAgIiVkOiVkICVzICVkIHUlcCBjJXBcbiIsCi0JCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY21kX25hbWUsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJCSAgICAgIiVkOiVkICVzICVkIHUlMDE2bGx4IGMlMDE2bGx4XG4iLAorCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZF9uYW1lLAorCQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLAorCQkJCQkgICAgICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQl9IGVsc2UgewogCQkJCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKIAkJCQlpZiAoIXdlYWsgJiYgIXN0cm9uZykgewogCQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkJCQkgICAgICIlZDolZCBub2RlICVkIHUlcCBjJXAgZGVsZXRlZFxuIiwKLQkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCQkgICAgIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJCQkJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSUwMTZsbHggYyUwMTZsbHggZGVsZXRlZFxuIiwKKwkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsCisJCQkJCQkgICAgICh1NjQpbm9kZS0+cHRyLAorCQkJCQkJICAgICAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQkJCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOwogCQkJCQlrZnJlZShub2RlKTsKIAkJCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfTk9ERSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkJICAgICAiJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIHN0YXRlIHVuY2hhbmdlZFxuIiwKLQkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwKLQkJCQkJCSAgICAgbm9kZS0+Y29va2llKTsKKwkJCQkJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSUwMTZsbHggYyUwMTZsbHggc3RhdGUgdW5jaGFuZ2VkXG4iLAorCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJICAgICBub2RlLT5kZWJ1Z19pZCwKKwkJCQkJCSAgICAgKHU2NClub2RlLT5wdHIsCisJCQkJCQkgICAgICh1NjQpbm9kZS0+Y29va2llKTsKIAkJCQl9CiAJCQl9CiAJCX0gYnJlYWs7CkBAIC0yMjcyLDE3ICsyMjkyLDE4IEBACiAJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHB1dF91c2VyKGRlYXRoLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCWlmIChwdXRfdXNlcihkZWF0aC0+Y29va2llLAorCQkJCSAgICAgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CiAJCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTiwKLQkJCQkgICAgICIlZDolZCAlcyAlcFxuIiwKKwkJCQkgICAgICIlZDolZCAlcyAlMDE2bGx4XG4iLAogCQkJCSAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJICAgICAgY21kID09IEJSX0RFQURfQklOREVSID8KIAkJCQkgICAgICAiQlJfREVBRF9CSU5ERVIiIDoKIAkJCQkgICAgICAiQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUiLAotCQkJCSAgICAgIGRlYXRoLT5jb29raWUpOworCQkJCSAgICAgICh1NjQpZGVhdGgtPmNvb2tpZSk7CiAKIAkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikgewogCQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7CkBAIC0yMzEyLDggKzIzMzMsOCBAQAogCQkJCWJpbmRlcl9zZXRfbmljZSh0YXJnZXRfbm9kZS0+bWluX3ByaW9yaXR5KTsKIAkJCWNtZCA9IEJSX1RSQU5TQUNUSU9OOwogCQl9IGVsc2UgewotCQkJdHIudGFyZ2V0LnB0ciA9IE5VTEw7Ci0JCQl0ci5jb29raWUgPSBOVUxMOworCQkJdHIudGFyZ2V0LnB0ciA9IDA7CisJCQl0ci5jb29raWUgPSAwOwogCQkJY21kID0gQlJfUkVQTFk7CiAJCX0KIAkJdHIuY29kZSA9IHQtPmNvZGU7CkBAIC0yMzMwLDggKzIzNTEsOSBAQAogCiAJCXRyLmRhdGFfc2l6ZSA9IHQtPmJ1ZmZlci0+ZGF0YV9zaXplOwogCQl0ci5vZmZzZXRzX3NpemUgPSB0LT5idWZmZXItPm9mZnNldHNfc2l6ZTsKLQkJdHIuZGF0YS5wdHIuYnVmZmVyID0gKHZvaWQgKil0LT5idWZmZXItPmRhdGEgKwotCQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQ7CisJCXRyLmRhdGEucHRyLmJ1ZmZlciA9IChiaW5kZXJfdWludHB0cl90KSgKKwkJCQkJKHVpbnRwdHJfdCl0LT5idWZmZXItPmRhdGEgKworCQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQpOwogCQl0ci5kYXRhLnB0ci5vZmZzZXRzID0gdHIuZGF0YS5wdHIuYnVmZmVyICsKIAkJCQkJQUxJR04odC0+YnVmZmVyLT5kYXRhX3NpemUsCiAJCQkJCSAgICBzaXplb2Yodm9pZCAqKSk7CkBAIC0yMzQ2LDE0ICsyMzY4LDE0IEBACiAJCXRyYWNlX2JpbmRlcl90cmFuc2FjdGlvbl9yZWNlaXZlZCh0KTsKIAkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiJWQ6JWQgJXMgJWQgJWQ6JWQsIGNtZCAlZCBzaXplICV6ZC0lemQgcHRyICVwLSVwXG4iLAorCQkJICAgICAiJWQ6JWQgJXMgJWQgJWQ6JWQsIGNtZCAlZCBzaXplICV6ZC0lemQgcHRyICUwMTZsbHgtJTAxNmxseFxuIiwKIAkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKIAkJCSAgICAgKGNtZCA9PSBCUl9UUkFOU0FDVElPTikgPyAiQlJfVFJBTlNBQ1RJT04iIDoKIAkJCSAgICAgIkJSX1JFUExZIiwKIAkJCSAgICAgdC0+ZGVidWdfaWQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAogCQkJICAgICB0LT5mcm9tID8gdC0+ZnJvbS0+cGlkIDogMCwgY21kLAogCQkJICAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCi0JCQkgICAgIHRyLmRhdGEucHRyLmJ1ZmZlciwgdHIuZGF0YS5wdHIub2Zmc2V0cyk7CisJCQkgICAgICh1NjQpdHIuZGF0YS5wdHIuYnVmZmVyLCAodTY0KXRyLmRhdGEucHRyLm9mZnNldHMpOwogCiAJCWxpc3RfZGVsKCZ0LT53b3JrLmVudHJ5KTsKIAkJdC0+YnVmZmVyLT5hbGxvd191c2VyX2ZyZWUgPSAxOwpAQCAtMjQyMyw4ICsyNDQ1LDggQEAKIAogCQkJZGVhdGggPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9yZWZfZGVhdGgsIHdvcmspOwogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OLAotCQkJCSJ1bmRlbGl2ZXJlZCBkZWF0aCBub3RpZmljYXRpb24sICVwXG4iLAotCQkJCWRlYXRoLT5jb29raWUpOworCQkJCSJ1bmRlbGl2ZXJlZCBkZWF0aCBub3RpZmljYXRpb24sICUwMTZsbHhcbiIsCisJCQkJKHU2NClkZWF0aC0+Y29va2llKTsKIAkJCWtmcmVlKGRlYXRoKTsKIAkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKIAkJfSBicmVhazsKQEAgLTI1ODAsMTIgKzI2MDIsMTYgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgIiVkOiVkIHdyaXRlICV6ZCBhdCAlMDE2bHgsIHJlYWQgJXpkIGF0ICUwMTZseFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX3NpemUsCi0JCQkgICAgIGJ3ci53cml0ZV9idWZmZXIsIGJ3ci5yZWFkX3NpemUsIGJ3ci5yZWFkX2J1ZmZlcik7CisJCQkgICAgICIlZDolZCB3cml0ZSAlbGxkIGF0ICUwMTZsbHgsIHJlYWQgJWxsZCBhdCAlMDE2bGx4XG4iLAorCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJICAgICAodTY0KWJ3ci53cml0ZV9zaXplLCAodTY0KWJ3ci53cml0ZV9idWZmZXIsCisJCQkgICAgICh1NjQpYndyLnJlYWRfc2l6ZSwgKHU2NClid3IucmVhZF9idWZmZXIpOwogCiAJCWlmIChid3Iud3JpdGVfc2l6ZSA+IDApIHsKLQkJCXJldCA9IGJpbmRlcl90aHJlYWRfd3JpdGUocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3Iud3JpdGVfYnVmZmVyLCBid3Iud3JpdGVfc2l6ZSwgJmJ3ci53cml0ZV9jb25zdW1lZCk7CisJCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3dyaXRlKHByb2MsIHRocmVhZCwKKwkJCQkJCSAgYndyLndyaXRlX2J1ZmZlciwKKwkJCQkJCSAgYndyLndyaXRlX3NpemUsCisJCQkJCQkgICZid3Iud3JpdGVfY29uc3VtZWQpOwogCQkJdHJhY2VfYmluZGVyX3dyaXRlX2RvbmUocmV0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJYndyLnJlYWRfY29uc3VtZWQgPSAwOwpAQCAtMjU5NSw3ICsyNjIxLDEwIEBACiAJCQl9CiAJCX0KIAkJaWYgKGJ3ci5yZWFkX3NpemUgPiAwKSB7Ci0JCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3JlYWQocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3IucmVhZF9idWZmZXIsIGJ3ci5yZWFkX3NpemUsICZid3IucmVhZF9jb25zdW1lZCwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQkJcmV0ID0gYmluZGVyX3RocmVhZF9yZWFkKHByb2MsIHRocmVhZCwgYndyLnJlYWRfYnVmZmVyLAorCQkJCQkJIGJ3ci5yZWFkX3NpemUsCisJCQkJCQkgJmJ3ci5yZWFkX2NvbnN1bWVkLAorCQkJCQkJIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAkJCXRyYWNlX2JpbmRlcl9yZWFkX2RvbmUocmV0KTsKIAkJCWlmICghbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykpCiAJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKQEAgLTI2MDYsOSArMjYzNSwxMCBAQAogCQkJfQogCQl9CiAJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgIiVkOiVkIHdyb3RlICV6ZCBvZiAlemQsIHJlYWQgcmV0dXJuICV6ZCBvZiAlemRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9jb25zdW1lZCwgYndyLndyaXRlX3NpemUsCi0JCQkgICAgIGJ3ci5yZWFkX2NvbnN1bWVkLCBid3IucmVhZF9zaXplKTsKKwkJCSAgICAgIiVkOiVkIHdyb3RlICVsbGQgb2YgJWxsZCwgcmVhZCByZXR1cm4gJWxsZCBvZiAlbGxkXG4iLAorCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJICAgICAodTY0KWJ3ci53cml0ZV9jb25zdW1lZCwgKHU2NClid3Iud3JpdGVfc2l6ZSwKKwkJCSAgICAgKHU2NClid3IucmVhZF9jb25zdW1lZCwgKHU2NClid3IucmVhZF9zaXplKTsKIAkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpIHsKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIGVycjsKQEAgLTI2MzcsNyArMjY2Nyw3IEBACiAJCQl9CiAJCX0gZWxzZQogCQkJYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IGN1cnJlbnQtPmNyZWQtPmV1aWQ7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIE5VTEwsIE5VTEwpOworCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCAwLCAwKTsKIAkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl9ub2RlID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycjsKQEAgLTMxMzIsOCArMzE2Miw5IEBACiAJCWJyZWFrOwogCWNhc2UgQklOREVSX1dPUktfTk9ERToKIAkJbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOwotCQlzZXFfcHJpbnRmKG0sICIlc25vZGUgd29yayAlZDogdSVwIGMlcFxuIiwKLQkJCSAgIHByZWZpeCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJc2VxX3ByaW50ZihtLCAiJXNub2RlIHdvcmsgJWQ6IHUlMDE2bGx4IGMlMDE2bGx4XG4iLAorCQkJICAgcHJlZml4LCBub2RlLT5kZWJ1Z19pZCwKKwkJCSAgICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCWJyZWFrOwogCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6CiAJCXNlcV9wcmludGYobSwgIiVzaGFzIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOwpAQCAtMzE5Myw4ICszMjI0LDggQEAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQogCQljb3VudCsrOwogCi0Jc2VxX3ByaW50ZihtLCAiICBub2RlICVkOiB1JXAgYyVwIGhzICVkIGh3ICVkIGxzICVkIGx3ICVkIGlzICVkIGl3ICVkIiwKLQkJICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llLAorCXNlcV9wcmludGYobSwgIiAgbm9kZSAlZDogdSUwMTZsbHggYyUwMTZsbHggaHMgJWQgaHcgJWQgbHMgJWQgbHcgJWQgaXMgJWQgaXcgJWQiLAorCQkgICBub2RlLT5kZWJ1Z19pZCwgKHU2NClub2RlLT5wdHIsICh1NjQpbm9kZS0+Y29va2llLAogCQkgICBub2RlLT5oYXNfc3Ryb25nX3JlZiwgbm9kZS0+aGFzX3dlYWtfcmVmLAogCQkgICBub2RlLT5sb2NhbF9zdHJvbmdfcmVmcywgbm9kZS0+bG9jYWxfd2Vha19yZWZzLAogCQkgICBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcywgY291bnQpOwpAQCAtMzQ5Niw2ICszNTI3LDcgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkucG9sbCA9IGJpbmRlcl9wb2xsLAogCS51bmxvY2tlZF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gYmluZGVyX2lvY3RsLAogCS5tbWFwID0gYmluZGVyX21tYXAsCiAJLm9wZW4gPSBiaW5kZXJfb3BlbiwKIAkuZmx1c2ggPSBiaW5kZXJfZmx1c2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCmluZGV4IGNiZTM0NTEuLmViMDgzNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCkBAIC0yMCwzMTEgKzIwLDExIEBACiAjaWZuZGVmIF9MSU5VWF9CSU5ERVJfSAogI2RlZmluZSBfTElOVVhfQklOREVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaWZkZWYgQ09ORklHX0FORFJPSURfQklOREVSX0lQQ18zMkJJVAorI2RlZmluZSBCSU5ERVJfSVBDXzMyQklUIDEKKyNlbmRpZgogCi0jZGVmaW5lIEJfUEFDS19DSEFSUyhjMSwgYzIsIGMzLCBjNCkgXAotCSgoKChjMSk8PDI0KSkgfCAoKChjMik8PDE2KSkgfCAoKChjMyk8PDgpKSB8IChjNCkpCi0jZGVmaW5lIEJfVFlQRV9MQVJHRSAweDg1Ci0KLWVudW0gewotCUJJTkRFUl9UWVBFX0JJTkRFUgk9IEJfUEFDS19DSEFSUygncycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX1dFQUtfQklOREVSCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfSEFORExFCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfV0VBS19IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9GRAkJPSBCX1BBQ0tfQ0hBUlMoJ2YnLCAnZCcsICcqJywgQl9UWVBFX0xBUkdFKSwKLX07Ci0KLWVudW0gewotCUZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSyA9IDB4ZmYsCi0JRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyA9IDB4MTAwLAotfTsKLQotLyoKLSAqIFRoaXMgaXMgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBvZiBhIEJpbmRlciBvYmplY3QgZm9yIHRyYW5zZmVyCi0gKiBiZXR3ZWVuIHByb2Nlc3Nlcy4gIFRoZSAnb2Zmc2V0cycgc3VwcGxpZWQgYXMgcGFydCBvZiBhIGJpbmRlciB0cmFuc2FjdGlvbgotICogY29udGFpbnMgb2Zmc2V0cyBpbnRvIHRoZSBkYXRhIHdoZXJlIHRoZXNlIHN0cnVjdHVyZXMgb2NjdXIuICBUaGUgQmluZGVyCi0gKiBkcml2ZXIgdGFrZXMgY2FyZSBvZiByZS13cml0aW5nIHRoZSBzdHJ1Y3R1cmUgdHlwZSBhbmQgZGF0YSBhcyBpdCBtb3ZlcwotICogYmV0d2VlbiBwcm9jZXNzZXMuCi0gKi8KLXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgewotCS8qIDggYnl0ZXMgZm9yIGxhcmdlX2ZsYXRfaGVhZGVyLiAqLwotCV9fdTMyCQl0eXBlOwotCV9fdTMyCQlmbGFnczsKLQotCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KLQl1bmlvbiB7Ci0JCXZvaWQgX191c2VyCSpiaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLwotCQlfX3UzMgkgICAgaGFuZGxlOwkJLyogcmVtb3RlIG9iamVjdCAqLwotCX07Ci0KLQkvKiBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBsb2NhbCBvYmplY3QgKi8KLQl2b2lkIF9fdXNlcgkJKmNvb2tpZTsKLX07Ci0KLS8qCi0gKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlIHVzZXIgY29kZSBtYXkgcnVuIGluIDMyLWJpdHMgdGhlIGRyaXZlciBtdXN0Ci0gKiB0cmFuc2xhdGUgdGhlIGJ1ZmZlciAoYW5kIGxvY2FsIGJpbmRlcikgYWRkcmVzc2VzIGFwcHJvcHJpYXRlbHkuCi0gKi8KLQotc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkIHsKLQlzaXplX3Qgd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KLQlzaXplX3Qgd3JpdGVfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLwotCXVuc2lnbmVkIGxvbmcJd3JpdGVfYnVmZmVyOwotCXNpemVfdCByZWFkX3NpemU7CS8qIGJ5dGVzIHRvIHJlYWQgKi8KLQlzaXplX3QgcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCi0JdW5zaWduZWQgbG9uZwlyZWFkX2J1ZmZlcjsKLX07Ci0KLS8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLwotc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKLQkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCi0JX19zMzIgICAgICAgcHJvdG9jb2xfdmVyc2lvbjsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KLSNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3Ci0KLSNkZWZpbmUgQklOREVSX1dSSVRFX1JFQUQJCV9JT1dSKCdiJywgMSwgc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKQotI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfVElNRU9VVAkJX0lPVygnYicsIDMsIF9fczY0KQotI2RlZmluZQlCSU5ERVJfU0VUX01BWF9USFJFQURTCQlfSU9XKCdiJywgNSwgX191MzIpCi0jZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9QUklPUklUWQlfSU9XKCdiJywgNiwgX19zMzIpCi0jZGVmaW5lCUJJTkRFUl9TRVRfQ09OVEVYVF9NR1IJCV9JT1coJ2InLCA3LCBfX3MzMikKLSNkZWZpbmUJQklOREVSX1RIUkVBRF9FWElUCQlfSU9XKCdiJywgOCwgX19zMzIpCi0jZGVmaW5lIEJJTkRFUl9WRVJTSU9OCQkJX0lPV1IoJ2InLCA5LCBzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pCi0KLS8qCi0gKiBOT1RFOiBUd28gc3BlY2lhbCBlcnJvciBjb2RlcyB5b3Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNhbGxpbmcKLSAqIGluIHRvIHRoZSBkcml2ZXIgYXJlOgotICoKLSAqIEVJTlRSIC0tIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJ1cHRlZC4gIFRoaXMgc2hvdWxkIGJlCi0gKiBoYW5kbGVkIGJ5IHJldHJ5aW5nIHRoZSBpb2N0bCgpIHVudGlsIGEgZGlmZmVyZW50IGVycm9yIGNvZGUKLSAqIGlzIHJldHVybmVkLgotICoKLSAqIEVDT05OUkVGVVNFRCAtLSBUaGUgZHJpdmVyIGlzIG5vIGxvbmdlciBhY2NlcHRpbmcgb3BlcmF0aW9ucwotICogZnJvbSB5b3VyIHByb2Nlc3MuICBUaGF0IGlzLCB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZXN0cm95ZWQuCi0gKiBZb3Ugc2hvdWxkIGhhbmRsZSB0aGlzIGJ5IGV4aXRpbmcgZnJvbSB5b3VyIHByb2Nlc3MuICBOb3RlCi0gKiB0aGF0IG9uY2UgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLCBhbGwgZnVydGhlciBjYWxscyB0bwotICogdGhlIGRyaXZlciBmcm9tIGFueSB0aHJlYWQgd2lsbCByZXR1cm4gdGhpcyBzYW1lIGNvZGUuCi0gKi8KLQotZW51bSB0cmFuc2FjdGlvbl9mbGFncyB7Ci0JVEZfT05FX1dBWQk9IDB4MDEsCS8qIHRoaXMgaXMgYSBvbmUtd2F5IGNhbGw6IGFzeW5jLCBubyByZXR1cm4gKi8KLQlURl9ST09UX09CSkVDVAk9IDB4MDQsCS8qIGNvbnRlbnRzIGFyZSB0aGUgY29tcG9uZW50J3Mgcm9vdCBvYmplY3QgKi8KLQlURl9TVEFUVVNfQ09ERQk9IDB4MDgsCS8qIGNvbnRlbnRzIGFyZSBhIDMyLWJpdCBzdGF0dXMgY29kZSAqLwotCVRGX0FDQ0VQVF9GRFMJPSAweDEwLAkvKiBhbGxvdyByZXBsaWVzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAqLwotfTsKLQotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKLQkvKiBUaGUgZmlyc3QgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIGJjVFJBTlNBQ1RJT04gYW5kIGJyVFJBTlNBQ1RJT04sCi0JICogaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBhbmQgY29udGVudHMgb2YgdGhlIHRyYW5zYWN0aW9uLgotCSAqLwotCXVuaW9uIHsKLQkJX191MzIJaGFuZGxlOwkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiBjb21tYW5kIHRyYW5zYWN0aW9uICovCi0JCXZvaWQJKnB0cjsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgcmV0dXJuIHRyYW5zYWN0aW9uICovCi0JfSB0YXJnZXQ7Ci0Jdm9pZAkJKmNvb2tpZTsJLyogdGFyZ2V0IG9iamVjdCBjb29raWUgKi8KLQlfX3UzMgkJY29kZTsJCS8qIHRyYW5zYWN0aW9uIGNvbW1hbmQgKi8KLQotCS8qIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zYWN0aW9uLiAqLwotCV9fdTMyCSAgICAgICAgZmxhZ3M7Ci0JcGlkX3QJCXNlbmRlcl9waWQ7Ci0JdWlkX3QJCXNlbmRlcl9ldWlkOwotCXNpemVfdAkJZGF0YV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSAqLwotCXNpemVfdAkJb2Zmc2V0c19zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2Ygb2Zmc2V0cyAqLwotCi0JLyogSWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBpbmxpbmUsIHRoZSBkYXRhIGltbWVkaWF0ZWx5Ci0JICogZm9sbG93cyBoZXJlOyBvdGhlcndpc2UsIGl0IGVuZHMgd2l0aCBhIHBvaW50ZXIgdG8KLQkgKiB0aGUgZGF0YSBidWZmZXIuCi0JICovCi0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJLyogdHJhbnNhY3Rpb24gZGF0YSAqLwotCQkJY29uc3Qgdm9pZCBfX3VzZXIJKmJ1ZmZlcjsKLQkJCS8qIG9mZnNldHMgZnJvbSBidWZmZXIgdG8gZmxhdF9iaW5kZXJfb2JqZWN0IHN0cnVjdHMgKi8KLQkJCWNvbnN0IHZvaWQgX191c2VyCSpvZmZzZXRzOwotCQl9IHB0cjsKLQkJX191OAlidWZbOF07Ci0JfSBkYXRhOwotfTsKLQotc3RydWN0IGJpbmRlcl9wdHJfY29va2llIHsKLQl2b2lkICpwdHI7Ci0Jdm9pZCAqY29va2llOwotfTsKLQotc3RydWN0IGJpbmRlcl9wcmlfZGVzYyB7Ci0JX19zMzIgcHJpb3JpdHk7Ci0JX191MzIgZGVzYzsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgewotCV9fczMyIHByaW9yaXR5OwotCXZvaWQgKnB0cjsKLQl2b2lkICpjb29raWU7Ci19OwotCi1lbnVtIGJpbmRlcl9kcml2ZXJfcmV0dXJuX3Byb3RvY29sIHsKLQlCUl9FUlJPUiA9IF9JT1IoJ3InLCAwLCBfX3MzMiksCi0JLyoKLQkgKiBpbnQ6IGVycm9yIGNvZGUKLQkgKi8KLQotCUJSX09LID0gX0lPKCdyJywgMSksCi0JLyogTm8gcGFyYW1ldGVycyEgKi8KLQotCUJSX1RSQU5TQUNUSU9OID0gX0lPUigncicsIDIsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JQlJfUkVQTFkgPSBfSU9SKCdyJywgMywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQkvKgotCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgcmVjZWl2ZWQgY29tbWFuZC4KLQkgKi8KLQotCUJSX0FDUVVJUkVfUkVTVUxUID0gX0lPUigncicsIDQsIF9fczMyKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiAwIGlmIHRoZSBsYXN0IGJjQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiBFbHNlIHRoZSByZW1vdGUgb2JqZWN0IGhhcyBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlLgotCSAqLwotCi0JQlJfREVBRF9SRVBMWSA9IF9JTygncicsIDUpLAotCS8qCi0JICogVGhlIHRhcmdldCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgotCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGlzIG5vIGxvbmdlciB3aXRoIHVzLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLQotCUJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFID0gX0lPKCdyJywgNiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLi4uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhc3QgdHJhbnNhY3Rpb24gcmVxdWVzdGVkCi0JICogKGluY2x1ZGluZyByZXBsaWVzKS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2VudCBldmVuIGZvcgotCSAqIGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMuCi0JICovCi0KLQlCUl9JTkNSRUZTID0gX0lPUigncicsIDcsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQlJfQUNRVUlSRSA9IF9JT1IoJ3InLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJSX1JFTEVBU0UgPSBfSU9SKCdyJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCUl9ERUNSRUZTID0gX0lPUigncicsIDEwLCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOglwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgotCSAqLwotCi0JQlJfQVRURU1QVF9BQ1FVSVJFID0gX0lPUigncicsIDExLCBzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50Oglwcmlvcml0eQotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJSX05PT1AgPSBfSU8oJ3InLCAxMiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLiAgRG8gbm90aGluZyBhbmQgZXhhbWluZSB0aGUgbmV4dCBjb21tYW5kLiAgSXQgZXhpc3RzCi0JICogcHJpbWFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhIEJSX1NQQVdOX0xPT1BFUiBjb21tYW5kLgotCSAqLwotCi0JQlJfU1BBV05fTE9PUEVSID0gX0lPKCdyJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4gIFRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgdGhhdCBhIHByb2Nlc3MgaGFzIG5vCi0JICogdGhyZWFkcyB3YWl0aW5nIHRvIHNlcnZpY2UgaW5jb21pbmcgdHJhbnNhY3Rpb25zLiAgV2hlbiBhIHByb2Nlc3MKLQkgKiByZWNlaXZlcyB0aGlzIGNvbW1hbmQsIGl0IG11c3Qgc3Bhd24gYSBuZXcgc2VydmljZSB0aHJlYWQgYW5kCi0JICogcmVnaXN0ZXIgaXQgdmlhIGJjRU5URVJfTE9PUEVSLgotCSAqLwotCi0JQlJfRklOSVNIRUQgPSBfSU8oJ3InLCAxNCksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIHN0b3AgdGhyZWFkcG9vbCB0aHJlYWQKLQkgKi8KLQotCUJSX0RFQURfQklOREVSID0gX0lPUigncicsIDE1LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQlCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSA9IF9JT1IoJ3InLCAxNiwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCUl9GQUlMRURfUkVQTFkgPSBfSU8oJ3InLCAxNyksCi0JLyoKLQkgKiBUaGUgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKLQkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBmYWlsZWQgKGUuZy4gb3V0IG9mIG1lbW9yeSkuICBObyBwYXJhbWV0ZXJzLgotCSAqLwotfTsKLQotZW51bSBiaW5kZXJfZHJpdmVyX2NvbW1hbmRfcHJvdG9jb2wgewotCUJDX1RSQU5TQUNUSU9OID0gX0lPVygnYycsIDAsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JQkNfUkVQTFkgPSBfSU9XKCdjJywgMSwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQkvKgotCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgc2VudCBjb21tYW5kLgotCSAqLwotCi0JQkNfQUNRVUlSRV9SRVNVTFQgPSBfSU9XKCdjJywgMiwgX19zMzIpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBpbnQ6ICAwIGlmIHRoZSBsYXN0IEJSX0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCi0JICogRWxzZSB5b3UgaGF2ZSBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QuCi0JICovCi0KLQlCQ19GUkVFX0JVRkZFUiA9IF9JT1coJ2MnLCAzLCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gdHJhbnNhY3Rpb24gZGF0YSByZWNlaXZlZCBvbiBhIHJlYWQKLQkgKi8KLQotCUJDX0lOQ1JFRlMgPSBfSU9XKCdjJywgNCwgX191MzIpLAotCUJDX0FDUVVJUkUgPSBfSU9XKCdjJywgNSwgX191MzIpLAotCUJDX1JFTEVBU0UgPSBfSU9XKCdjJywgNiwgX191MzIpLAotCUJDX0RFQ1JFRlMgPSBfSU9XKCdjJywgNywgX191MzIpLAotCS8qCi0JICogaW50OglkZXNjcmlwdG9yCi0JICovCi0KLQlCQ19JTkNSRUZTX0RPTkUgPSBfSU9XKCdjJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCQ19BQ1FVSVJFX0RPTkUgPSBfSU9XKCdjJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJDX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1coJ2MnLCAxMCwgc3RydWN0IGJpbmRlcl9wcmlfZGVzYyksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogcHJpb3JpdHkKLQkgKiBpbnQ6IGRlc2NyaXB0b3IKLQkgKi8KLQotCUJDX1JFR0lTVEVSX0xPT1BFUiA9IF9JTygnYycsIDExKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuCi0JICogUmVnaXN0ZXIgYSBzcGF3bmVkIGxvb3BlciB0aHJlYWQgd2l0aCB0aGUgZGV2aWNlLgotCSAqLwotCi0JQkNfRU5URVJfTE9PUEVSID0gX0lPKCdjJywgMTIpLAotCUJDX0VYSVRfTE9PUEVSID0gX0lPKCdjJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4KLQkgKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIHNlbnQgYXMgYW4gYXBwbGljYXRpb24tbGV2ZWwgdGhyZWFkCi0JICogZW50ZXJzIGFuZCBleGl0cyB0aGUgYmluZGVyIGxvb3AsIHJlc3BlY3RpdmVseS4gIFRoZXkgYXJlCi0JICogdXNlZCBzbyB0aGUgYmluZGVyIGNhbiBoYXZlIGFuIGFjY3VyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIKLQkgKiBvZiBsb29waW5nIHRocmVhZHMgaXQgaGFzIGF2YWlsYWJsZS4KLQkgKi8KLQotCUJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE0LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQotCUJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCQ19ERUFEX0JJTkRFUl9ET05FID0gX0lPVygnYycsIDE2LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLX07CisjaW5jbHVkZSAidWFwaS9iaW5kZXIuaCIKIAogI2VuZGlmIC8qIF9MSU5VWF9CSU5ERVJfSCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCmluZGV4IDgyYTU2N2MuLjdmMjBmM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKGludCwgZGVidWdfaWQpCiAJCV9fZmllbGQoaW50LCBub2RlX2RlYnVnX2lkKQotCQlfX2ZpZWxkKHZvaWQgX191c2VyICosIG5vZGVfcHRyKQorCQlfX2ZpZWxkKGJpbmRlcl91aW50cHRyX3QsIG5vZGVfcHRyKQogCQlfX2ZpZWxkKGludCwgcmVmX2RlYnVnX2lkKQogCQlfX2ZpZWxkKHVpbnQzMl90LCByZWZfZGVzYykKIAkpLApAQCAtMTYzLDggKzE2Myw5IEBACiAJCV9fZW50cnktPnJlZl9kZWJ1Z19pZCA9IHJlZi0+ZGVidWdfaWQ7CiAJCV9fZW50cnktPnJlZl9kZXNjID0gcmVmLT5kZXNjOwogCSksCi0JVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19wdHI9MHglcCA9PT4gZGVzdF9yZWY9JWQgZGVzdF9kZXNjPSVkIiwKLQkJICBfX2VudHJ5LT5kZWJ1Z19pZCwgX19lbnRyeS0+bm9kZV9kZWJ1Z19pZCwgX19lbnRyeS0+bm9kZV9wdHIsCisJVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19wdHI9MHglMDE2bGx4ID09PiBkZXN0X3JlZj0lZCBkZXN0X2Rlc2M9JWQiLAorCQkgIF9fZW50cnktPmRlYnVnX2lkLCBfX2VudHJ5LT5ub2RlX2RlYnVnX2lkLAorCQkgICh1NjQpX19lbnRyeS0+bm9kZV9wdHIsCiAJCSAgX19lbnRyeS0+cmVmX2RlYnVnX2lkLCBfX2VudHJ5LT5yZWZfZGVzYykKICk7CiAKQEAgLTE3Nyw3ICsxNzgsNyBAQAogCQlfX2ZpZWxkKGludCwgcmVmX2RlYnVnX2lkKQogCQlfX2ZpZWxkKHVpbnQzMl90LCByZWZfZGVzYykKIAkJX19maWVsZChpbnQsIG5vZGVfZGVidWdfaWQpCi0JCV9fZmllbGQodm9pZCBfX3VzZXIgKiwgbm9kZV9wdHIpCisJCV9fZmllbGQoYmluZGVyX3VpbnRwdHJfdCwgbm9kZV9wdHIpCiAJKSwKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGVidWdfaWQgPSB0LT5kZWJ1Z19pZDsKQEAgLTE4Niw5ICsxODcsMTAgQEAKIAkJX19lbnRyeS0+bm9kZV9kZWJ1Z19pZCA9IHJlZi0+bm9kZS0+ZGVidWdfaWQ7CiAJCV9fZW50cnktPm5vZGVfcHRyID0gcmVmLT5ub2RlLT5wdHI7CiAJKSwKLQlUUF9wcmludGsoInRyYW5zYWN0aW9uPSVkIG5vZGU9JWQgc3JjX3JlZj0lZCBzcmNfZGVzYz0lZCA9PT4gZGVzdF9wdHI9MHglcCIsCisJVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19yZWY9JWQgc3JjX2Rlc2M9JWQgPT0+IGRlc3RfcHRyPTB4JTAxNmxseCIsCiAJCSAgX19lbnRyeS0+ZGVidWdfaWQsIF9fZW50cnktPm5vZGVfZGVidWdfaWQsCi0JCSAgX19lbnRyeS0+cmVmX2RlYnVnX2lkLCBfX2VudHJ5LT5yZWZfZGVzYywgX19lbnRyeS0+bm9kZV9wdHIpCisJCSAgX19lbnRyeS0+cmVmX2RlYnVnX2lkLCBfX2VudHJ5LT5yZWZfZGVzYywKKwkJICAodTY0KV9fZW50cnktPm5vZGVfcHRyKQogKTsKIAogVFJBQ0VfRVZFTlQoYmluZGVyX3RyYW5zYWN0aW9uX3JlZl90b19yZWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKaW5kZXggNTc0MDY2Zi4uM2Q1YmYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC01NSwxMCArNTYsMTIgQEAKIAlzdHJ1Y3QgbXV0ZXggYnVmZmVyX2xvY2s7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrOwogCXN0cnVjdCBwbGlzdF9oZWFkIGhlYXBzOwotCWxvbmcgKCpjdXN0b21faW9jdGwpIChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworCWxvbmcgKCpjdXN0b21faW9jdGwpKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAlzdHJ1Y3QgcmJfcm9vdCBjbGllbnRzOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqaGVhcHNfZGVidWdfcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpjbGllbnRzX2RlYnVnX3Jvb3Q7CiB9OwogCiAvKioKQEAgLTY5LDYgKzcyLDggQEAKICAqIEBpZHI6CQlhbiBpZHIgc3BhY2UgZm9yIGFsbG9jYXRpbmcgaGFuZGxlIGlkcwogICogQGxvY2s6CQlsb2NrIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgaGFuZGxlcwogICogQG5hbWU6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKKyAqIEBkaXNwbGF5X25hbWU6CXVzZWQgZm9yIGRlYnVnZ2luZyAodW5pcXVlIHZlcnNpb24gb2YgQG5hbWUpCisgKiBAZGlzcGxheV9zZXJpYWw6CXVzZWQgZm9yIGRlYnVnZ2luZyAodG8gbWFrZSBkaXNwbGF5X25hbWUgdW5pcXVlKQogICogQHRhc2s6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKICAqCiAgKiBBIGNsaWVudCByZXByZXNlbnRzIGEgbGlzdCBvZiBidWZmZXJzIHRoaXMgY2xpZW50IG1heSBhY2Nlc3MuCkBAIC04Miw2ICs4Nyw4IEBACiAJc3RydWN0IGlkciBpZHI7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICpkaXNwbGF5X25hbWU7CisJaW50IGRpc3BsYXlfc2VyaWFsOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAlwaWRfdCBwaWQ7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfcm9vdDsKQEAgLTIwOCw3ICsyMTUsNyBAQAogCWlmIChJU19FUlIodGFibGUpKSB7CiAJCWhlYXAtPm9wcy0+ZnJlZShidWZmZXIpOwogCQlrZnJlZShidWZmZXIpOwotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHRhYmxlKSk7CisJCXJldHVybiBFUlJfQ0FTVCh0YWJsZSk7CiAJfQogCWJ1ZmZlci0+c2dfdGFibGUgPSB0YWJsZTsKIAlpZiAoaW9uX2J1ZmZlcl9mYXVsdF91c2VyX21hcHBpbmdzKGJ1ZmZlcikpIHsKQEAgLTQyOSw3ICs0MzYsNyBAQAogCQkJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCiB7CiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZjbGllbnQtPmxvY2spKTsKLQlyZXR1cm4gKGlkcl9maW5kKCZjbGllbnQtPmlkciwgaGFuZGxlLT5pZCkgPT0gaGFuZGxlKTsKKwlyZXR1cm4gaWRyX2ZpbmQoJmNsaWVudC0+aWRyLCBoYW5kbGUtPmlkKSA9PSBoYW5kbGU7CiB9CiAKIHN0YXRpYyBpbnQgaW9uX2hhbmRsZV9hZGQoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKQEAgLTUwMSw3ICs1MDgsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAogCWlmIChJU19FUlIoYnVmZmVyKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihidWZmZXIpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGJ1ZmZlcik7CiAKIAloYW5kbGUgPSBpb25faGFuZGxlX2NyZWF0ZShjbGllbnQsIGJ1ZmZlcik7CiAKQEAgLTcwOCw2ICs3MTUsMjEgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorc3RhdGljIGludCBpb25fZ2V0X2NsaWVudF9zZXJpYWwoY29uc3Qgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCit7CisJaW50IHNlcmlhbCA9IC0xOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KHJvb3QpOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGlvbl9jbGllbnQsCisJCQkJCQlub2RlKTsKKwkJaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsIG5hbWUpKQorCQkJY29udGludWU7CisJCXNlcmlhbCA9IG1heChzZXJpYWwsIGNsaWVudC0+ZGlzcGxheV9zZXJpYWwpOworCX0KKwlyZXR1cm4gc2VyaWFsICsgMTsKK30KKwogc3RydWN0IGlvbl9jbGllbnQgKmlvbl9jbGllbnRfY3JlYXRlKHN0cnVjdCBpb25fZGV2aWNlICpkZXYsCiAJCQkJICAgICBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNzE2LDkgKzczOCwxMyBAQAogCXN0cnVjdCByYl9ub2RlICoqcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgaW9uX2NsaWVudCAqZW50cnk7Ci0JY2hhciBkZWJ1Z19uYW1lWzY0XTsKIAlwaWRfdCBwaWQ7CiAKKwlpZiAoIW5hbWUpIHsKKwkJcHJfZXJyKCIlczogTmFtZSBjYW5ub3QgYmUgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKIAlnZXRfdGFza19zdHJ1Y3QoY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKIAl0YXNrX2xvY2soY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKIAlwaWQgPSB0YXNrX3BpZF9ucihjdXJyZW50LT5ncm91cF9sZWFkZXIpOwpAQCAtNzMzLDIxICs3NTksMjcgQEAKIAl0YXNrX3VubG9jayhjdXJyZW50LT5ncm91cF9sZWFkZXIpOwogCiAJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbl9jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsaWVudCkgewotCQlpZiAodGFzaykKLQkJCXB1dF90YXNrX3N0cnVjdChjdXJyZW50LT5ncm91cF9sZWFkZXIpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9CisJaWYgKCFjbGllbnQpCisJCWdvdG8gZXJyX3B1dF90YXNrX3N0cnVjdDsKIAogCWNsaWVudC0+ZGV2ID0gZGV2OwogCWNsaWVudC0+aGFuZGxlcyA9IFJCX1JPT1Q7CiAJaWRyX2luaXQoJmNsaWVudC0+aWRyKTsKIAltdXRleF9pbml0KCZjbGllbnQtPmxvY2spOwotCWNsaWVudC0+bmFtZSA9IG5hbWU7CiAJY2xpZW50LT50YXNrID0gdGFzazsKIAljbGllbnQtPnBpZCA9IHBpZDsKKwljbGllbnQtPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50LT5uYW1lKQorCQlnb3RvIGVycl9mcmVlX2NsaWVudDsKIAogCWRvd25fd3JpdGUoJmRldi0+bG9jayk7CisJY2xpZW50LT5kaXNwbGF5X3NlcmlhbCA9IGlvbl9nZXRfY2xpZW50X3NlcmlhbCgmZGV2LT5jbGllbnRzLCBuYW1lKTsKKwljbGllbnQtPmRpc3BsYXlfbmFtZSA9IGthc3ByaW50ZigKKwkJR0ZQX0tFUk5FTCwgIiVzLSVkIiwgbmFtZSwgY2xpZW50LT5kaXNwbGF5X3NlcmlhbCk7CisJaWYgKCFjbGllbnQtPmRpc3BsYXlfbmFtZSkgeworCQl1cF93cml0ZSgmZGV2LT5sb2NrKTsKKwkJZ290byBlcnJfZnJlZV9jbGllbnRfbmFtZTsKKwl9CiAJcCA9ICZkZXYtPmNsaWVudHMucmJfbm9kZTsKIAl3aGlsZSAoKnApIHsKIAkJcGFyZW50ID0gKnA7CkBAIC03NjEsMTMgKzc5MywyOCBAQAogCXJiX2xpbmtfbm9kZSgmY2xpZW50LT5ub2RlLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmY2xpZW50LT5ub2RlLCAmZGV2LT5jbGllbnRzKTsKIAotCXNucHJpbnRmKGRlYnVnX25hbWUsIDY0LCAiJXUiLCBjbGllbnQtPnBpZCk7Ci0JY2xpZW50LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZmlsZShkZWJ1Z19uYW1lLCAwNjY0LAotCQkJCQkJIGRldi0+ZGVidWdfcm9vdCwgY2xpZW50LAotCQkJCQkJICZkZWJ1Z19jbGllbnRfZm9wcyk7CisJY2xpZW50LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZmlsZShjbGllbnQtPmRpc3BsYXlfbmFtZSwgMDY2NCwKKwkJCQkJCWRldi0+Y2xpZW50c19kZWJ1Z19yb290LAorCQkJCQkJY2xpZW50LCAmZGVidWdfY2xpZW50X2ZvcHMpOworCWlmICghY2xpZW50LT5kZWJ1Z19yb290KSB7CisJCWNoYXIgYnVmWzI1Nl0sICpwYXRoOworCQlwYXRoID0gZGVudHJ5X3BhdGgoZGV2LT5jbGllbnRzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCBkZWJ1Z2ZzIGF0ICVzLyVzXG4iLAorCQkJcGF0aCwgY2xpZW50LT5kaXNwbGF5X25hbWUpOworCX0KKwogCXVwX3dyaXRlKCZkZXYtPmxvY2spOwogCiAJcmV0dXJuIGNsaWVudDsKKworZXJyX2ZyZWVfY2xpZW50X25hbWU6CisJa2ZyZWUoY2xpZW50LT5uYW1lKTsKK2Vycl9mcmVlX2NsaWVudDoKKwlrZnJlZShjbGllbnQpOworZXJyX3B1dF90YXNrX3N0cnVjdDoKKwlpZiAodGFzaykKKwkJcHV0X3Rhc2tfc3RydWN0KGN1cnJlbnQtPmdyb3VwX2xlYWRlcik7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvbl9jbGllbnRfY3JlYXRlKTsKIApAQCAtNzkyLDYgKzgzOSw4IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGNsaWVudC0+ZGVidWdfcm9vdCk7CiAJdXBfd3JpdGUoJmRldi0+bG9jayk7CiAKKwlrZnJlZShjbGllbnQtPmRpc3BsYXlfbmFtZSk7CisJa2ZyZWUoY2xpZW50LT5uYW1lKTsKIAlrZnJlZShjbGllbnQpOwogfQogRVhQT1JUX1NZTUJPTChpb25fY2xpZW50X2Rlc3Ryb3kpOwpAQCAtOTU0LDggKzEwMDMsOCBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKCFidWZmZXItPmhlYXAtPm9wcy0+bWFwX3VzZXIpIHsKLQkJcHJfZXJyKCIlczogdGhpcyBoZWFwIGRvZXMgbm90IGRlZmluZSBhIG1ldGhvZCBmb3IgbWFwcGluZyAiCi0JCSAgICAgICAidG8gdXNlcnNwYWNlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IHRoaXMgaGVhcCBkb2VzIG5vdCBkZWZpbmUgYSBtZXRob2QgZm9yIG1hcHBpbmcgdG8gdXNlcnNwYWNlXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwMTcsOSArMTA2Niw3IEBACiAJbXV0ZXhfbG9jaygmYnVmZmVyLT5sb2NrKTsKIAl2YWRkciA9IGlvbl9idWZmZXJfa21hcF9nZXQoYnVmZmVyKTsKIAltdXRleF91bmxvY2soJmJ1ZmZlci0+bG9jayk7Ci0JaWYgKElTX0VSUih2YWRkcikpCi0JCXJldHVybiBQVFJfRVJSKHZhZGRyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHZhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgaW9uX2RtYV9idWZfZW5kX2NwdV9hY2Nlc3Moc3RydWN0IGRtYV9idWYgKmRtYWJ1Ziwgc2l6ZV90IHN0YXJ0LApAQCAtMTEwMCw3ICsxMTQ3LDcgQEAKIAogCWRtYWJ1ZiA9IGRtYV9idWZfZ2V0KGZkKTsKIAlpZiAoSVNfRVJSKGRtYWJ1ZikpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoZG1hYnVmKSk7CisJCXJldHVybiBFUlJfQ0FTVChkbWFidWYpOwogCS8qIGlmIHRoaXMgbWVtb3J5IGNhbWUgZnJvbSBpb24gKi8KIAogCWlmIChkbWFidWYtPm9wcyAhPSAmZG1hX2J1Zl9vcHMpIHsKQEAgLTEyOTMsOSArMTM0MCwxMSBAQAogCXN0cnVjdCBtaXNjZGV2aWNlICptaXNjZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpb25fZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2YobWlzY2Rldiwgc3RydWN0IGlvbl9kZXZpY2UsIGRldik7CiAJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKKwljaGFyIGRlYnVnX25hbWVbNjRdOwogCiAJcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQljbGllbnQgPSBpb25fY2xpZW50X2NyZWF0ZShkZXYsICJ1c2VyIik7CisJc25wcmludGYoZGVidWdfbmFtZSwgNjQsICIldSIsIHRhc2tfcGlkX25yKGN1cnJlbnQtPmdyb3VwX2xlYWRlcikpOworCWNsaWVudCA9IGlvbl9jbGllbnRfY3JlYXRlKGRldiwgZGVidWdfbmFtZSk7CiAJaWYgKElTX0VSUihjbGllbnQpKQogCQlyZXR1cm4gUFRSX0VSUihjbGllbnQpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNsaWVudDsKQEAgLTEzMzgsNyArMTM4Nyw3IEBACiAJc2l6ZV90IHRvdGFsX29ycGhhbmVkX3NpemUgPSAwOwogCiAJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2LnMgJTE2LnNcbiIsICJjbGllbnQiLCAicGlkIiwgInNpemUiKTsKLQlzZXFfcHJpbnRmKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAlmb3IgKG4gPSByYl9maXJzdCgmZGV2LT5jbGllbnRzKTsgbjsgbiA9IHJiX25leHQobikpIHsKIAkJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBpb25fY2xpZW50LApAQCAtMTM1Nyw5ICsxNDA2LDggQEAKIAkJCQkgICBjbGllbnQtPnBpZCwgc2l6ZSk7CiAJCX0KIAl9Ci0Jc2VxX3ByaW50ZihzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0Jc2VxX3ByaW50ZihzLCAib3JwaGFuZWQgYWxsb2NhdGlvbnMgKGluZm8gaXMgZnJvbSBsYXN0IGtub3duIGNsaWVudCk6IgotCQkgICAiXG4iKTsKKwlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJc2VxX3B1dHMocywgIm9ycGhhbmVkIGFsbG9jYXRpb25zIChpbmZvIGlzIGZyb20gbGFzdCBrbm93biBjbGllbnQpOlxuIik7CiAJbXV0ZXhfbG9jaygmZGV2LT5idWZmZXJfbG9jayk7CiAJZm9yIChuID0gcmJfZmlyc3QoJmRldi0+YnVmZmVycyk7IG47IG4gPSByYl9uZXh0KG4pKSB7CiAJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaW9uX2J1ZmZlciwKQEAgLTEzNzYsMTQgKzE0MjQsMTQgQEAKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmRldi0+YnVmZmVyX2xvY2spOwotCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlzZXFfcHJpbnRmKHMsICIlMTYucyAlMTZ6dVxuIiwgInRvdGFsIG9ycGhhbmVkIiwKIAkJICAgdG90YWxfb3JwaGFuZWRfc2l6ZSk7CiAJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2enVcbiIsICJ0b3RhbCAiLCB0b3RhbF9zaXplKTsKIAlpZiAoaGVhcC0+ZmxhZ3MgJiBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUUpCiAJCXNlcV9wcmludGYocywgIiUxNi5zICUxNnp1XG4iLCAiZGVmZXJyZWQgZnJlZSIsCiAJCQkJaGVhcC0+ZnJlZV9saXN0X3NpemUpOwotCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAogCWlmIChoZWFwLT5kZWJ1Z19zaG93KQogCQloZWFwLT5kZWJ1Z19zaG93KGhlYXAsIHMsIHVudXNlZCk7CkBAIC0xNDQzLDYgKzE0OTEsOCBAQAogCiB2b2lkIGlvbl9kZXZpY2VfYWRkX2hlYXAoc3RydWN0IGlvbl9kZXZpY2UgKmRldiwgc3RydWN0IGlvbl9oZWFwICpoZWFwKQogeworCXN0cnVjdCBkZW50cnkgKmRlYnVnX2ZpbGU7CisKIAlpZiAoIWhlYXAtPm9wcy0+YWxsb2NhdGUgfHwgIWhlYXAtPm9wcy0+ZnJlZSB8fCAhaGVhcC0+b3BzLT5tYXBfZG1hIHx8CiAJICAgICFoZWFwLT5vcHMtPnVubWFwX2RtYSkKIAkJcHJfZXJyKCIlczogY2FuIG5vdCBhZGQgaGVhcCB3aXRoIGludmFsaWQgb3BzIHN0cnVjdC5cbiIsCkBAIC0xNDUxLDIxICsxNTAxLDQwIEBACiAJaWYgKGhlYXAtPmZsYWdzICYgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFKQogCQlpb25faGVhcF9pbml0X2RlZmVycmVkX2ZyZWUoaGVhcCk7CiAKKwlpZiAoKGhlYXAtPmZsYWdzICYgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFKSB8fCBoZWFwLT5vcHMtPnNocmluaykKKwkJaW9uX2hlYXBfaW5pdF9zaHJpbmtlcihoZWFwKTsKKwogCWhlYXAtPmRldiA9IGRldjsKIAlkb3duX3dyaXRlKCZkZXYtPmxvY2spOwogCS8qIHVzZSBuZWdhdGl2ZSBoZWFwLT5pZCB0byByZXZlcnNlIHRoZSBwcmlvcml0eSAtLSB3aGVuIHRyYXZlcnNpbmcKIAkgICB0aGUgbGlzdCBsYXRlciBhdHRlbXB0IGhpZ2hlciBpZCBudW1iZXJzIGZpcnN0ICovCiAJcGxpc3Rfbm9kZV9pbml0KCZoZWFwLT5ub2RlLCAtaGVhcC0+aWQpOwogCXBsaXN0X2FkZCgmaGVhcC0+bm9kZSwgJmRldi0+aGVhcHMpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoaGVhcC0+bmFtZSwgMDY2NCwgZGV2LT5kZWJ1Z19yb290LCBoZWFwLAotCQkJICAgICZkZWJ1Z19oZWFwX2ZvcHMpOworCWRlYnVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGhlYXAtPm5hbWUsIDA2NjQsCisJCQkJCWRldi0+aGVhcHNfZGVidWdfcm9vdCwgaGVhcCwKKwkJCQkJJmRlYnVnX2hlYXBfZm9wcyk7CisKKwlpZiAoIWRlYnVnX2ZpbGUpIHsKKwkJY2hhciBidWZbMjU2XSwgKnBhdGg7CisJCXBhdGggPSBkZW50cnlfcGF0aChkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGhlYXAgZGVidWdmcyBhdCAlcy8lc1xuIiwKKwkJCXBhdGgsIGhlYXAtPm5hbWUpOworCX0KKwogI2lmZGVmIERFQlVHX0hFQVBfU0hSSU5LRVIKIAlpZiAoaGVhcC0+c2hyaW5rZXIuc2hyaW5rKSB7CiAJCWNoYXIgZGVidWdfbmFtZVs2NF07CiAKIAkJc25wcmludGYoZGVidWdfbmFtZSwgNjQsICIlc19zaHJpbmsiLCBoZWFwLT5uYW1lKTsKLQkJZGVidWdmc19jcmVhdGVfZmlsZShkZWJ1Z19uYW1lLCAwNjQ0LCBkZXYtPmRlYnVnX3Jvb3QsIGhlYXAsCi0JCQkJICAgICZkZWJ1Z19zaHJpbmtfZm9wcyk7CisJCWRlYnVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKAorCQkJZGVidWdfbmFtZSwgMDY0NCwgZGV2LT5oZWFwc19kZWJ1Z19yb290LCBoZWFwLAorCQkJJmRlYnVnX3Nocmlua19mb3BzKTsKKwkJaWYgKCFkZWJ1Z19maWxlKSB7CisJCQljaGFyIGJ1ZlsyNTZdLCAqcGF0aDsKKwkJCXBhdGggPSBkZW50cnlfcGF0aChkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKKwkJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBoZWFwIHNocmlua2VyIGRlYnVnZnMgYXQgJXMvJXNcbiIsCisJCQkJcGF0aCwgZGVidWdfbmFtZSk7CisJCX0KIAl9CiAjZW5kaWYKIAl1cF93cml0ZSgmZGV2LT5sb2NrKTsKQEAgLTE0OTQsOCArMTU2MywyMSBAQAogCX0KIAogCWlkZXYtPmRlYnVnX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImlvbiIsIE5VTEwpOwotCWlmICghaWRldi0+ZGVidWdfcm9vdCkKLQkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWcgZmlsZXMuXG4iKTsKKwlpZiAoIWlkZXYtPmRlYnVnX3Jvb3QpIHsKKwkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyByb290IGRpcmVjdG9yeS5cbiIpOworCQlnb3RvIGRlYnVnZnNfZG9uZTsKKwl9CisJaWRldi0+aGVhcHNfZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiaGVhcHMiLCBpZGV2LT5kZWJ1Z19yb290KTsKKwlpZiAoIWlkZXYtPmhlYXBzX2RlYnVnX3Jvb3QpIHsKKwkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBoZWFwcyBkaXJlY3RvcnkuXG4iKTsKKwkJZ290byBkZWJ1Z2ZzX2RvbmU7CisJfQorCWlkZXYtPmNsaWVudHNfZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2xpZW50cyIsCisJCQkJCQlpZGV2LT5kZWJ1Z19yb290KTsKKwlpZiAoIWlkZXYtPmNsaWVudHNfZGVidWdfcm9vdCkKKwkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBjbGllbnRzIGRpcmVjdG9yeS5cbiIpOworCitkZWJ1Z2ZzX2RvbmU6CiAKIAlpZGV2LT5jdXN0b21faW9jdGwgPSBjdXN0b21faW9jdGw7CiAJaWRldi0+YnVmZmVycyA9IFJCX1JPT1Q7CkBAIC0xNTA5LDYgKzE1OTEsNyBAQAogdm9pZCBpb25fZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGlvbl9kZXZpY2UgKmRldikKIHsKIAltaXNjX2RlcmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGV2LT5kZWJ1Z19yb290KTsKIAkvKiBYWFggbmVlZCB0byBmcmVlIHRoZSBoZWFwcyBhbmQgY2xpZW50cyA/ICovCiAJa2ZyZWUoZGV2KTsKIH0KQEAgLTE1MjcsOCArMTYxMCw3IEBACiAJCQkJCQkgICAgZGF0YS0+aGVhcHNbaV0uYWxpZ24sCiAJCQkJCQkgICAgTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUpOwogCQkJaWYgKCFwYWRkcikgewotCQkJCXByX2VycigiJXM6IGVycm9yIGFsbG9jYXRpbmcgbWVtYmxvY2sgZm9yICIKLQkJCQkgICAgICAgImhlYXAgJWRcbiIsCisJCQkJcHJfZXJyKCIlczogZXJyb3IgYWxsb2NhdGluZyBtZW1ibG9jayBmb3IgaGVhcCAlZFxuIiwKIAkJCQkJX19mdW5jX18sIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jCmluZGV4IGYwZjk4ODkuLmNlNjhlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NtYV9oZWFwLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNtYV9oZWFwLT5kZXY7CiAJc3RydWN0IGlvbl9jbWFfYnVmZmVyX2luZm8gKmluZm8gPSBidWZmZXItPnByaXZfdmlydDsKIAotCWRldl9kYmcoZGV2LCAiUmV0dXJuIGJ1ZmZlciAlcCBwaHlzaWNhbCBhZGRyZXNzIDB4JXBhXG4iLCBidWZmZXIsCisJZGV2X2RiZyhkZXYsICJSZXR1cm4gYnVmZmVyICVwIHBoeXNpY2FsIGFkZHJlc3MgJXBhXG4iLCBidWZmZXIsCiAJCSZpbmZvLT5oYW5kbGUpOwogCiAJKmFkZHIgPSBpbmZvLT5oYW5kbGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYwppbmRleCAwMWNkYzhhLi4zYTQ1ZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fZHVtbXlfZHJpdmVyLmMKQEAgLTI1LDEzICsyNSwxMyBAQAogI2luY2x1ZGUgImlvbi5oIgogI2luY2x1ZGUgImlvbl9wcml2LmgiCiAKLXN0cnVjdCBpb25fZGV2aWNlICppZGV2Owotc3RydWN0IGlvbl9oZWFwICoqaGVhcHM7CitzdGF0aWMgc3RydWN0IGlvbl9kZXZpY2UgKmlkZXY7CitzdGF0aWMgc3RydWN0IGlvbl9oZWFwICoqaGVhcHM7CiAKLXZvaWQgKmNhcnZlb3V0X3B0cjsKLXZvaWQgKmNodW5rX3B0cjsKK3N0YXRpYyB2b2lkICpjYXJ2ZW91dF9wdHI7CitzdGF0aWMgdm9pZCAqY2h1bmtfcHRyOwogCi1zdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgZHVtbXlfaGVhcHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgZHVtbXlfaGVhcHNbXSA9IHsKIAkJewogCQkJLmlkCT0gSU9OX0hFQVBfVFlQRV9TWVNURU0sCiAJCQkudHlwZQk9IElPTl9IRUFQX1RZUEVfU1lTVEVNLApAQCAtNTgsNyArNTgsNyBAQAogCQl9LAogfTsKIAotc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhIGR1bW15X2lvbl9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgZHVtbXlfaW9uX3BkYXRhID0gewogCS5uciA9IEFSUkFZX1NJWkUoZHVtbXlfaGVhcHMpLAogCS5oZWFwcyA9IGR1bW15X2hlYXBzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMKaW5kZXggMzdlNjRkNS4uYmRjNmEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMKQEAgLTE3OCw3ICsxNzgsOCBAQAogCXJldHVybiBzaXplOwogfQogCi1zaXplX3QgaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgX2lvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUsCisJCQkJYm9vbCBza2lwX3Bvb2xzKQogewogCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXI7CiAJc2l6ZV90IHRvdGFsX2RyYWluZWQgPSAwOwpAQCAtMTk3LDYgKzE5OCw4IEBACiAJCQkJCSAgbGlzdCk7CiAJCWxpc3RfZGVsKCZidWZmZXItPmxpc3QpOwogCQloZWFwLT5mcmVlX2xpc3Rfc2l6ZSAtPSBidWZmZXItPnNpemU7CisJCWlmIChza2lwX3Bvb2xzKQorCQkJYnVmZmVyLT5wcml2YXRlX2ZsYWdzIHw9IElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRTsKIAkJdG90YWxfZHJhaW5lZCArPSBidWZmZXItPnNpemU7CiAJCXNwaW5fdW5sb2NrKCZoZWFwLT5mcmVlX2xvY2spOwogCQlpb25fYnVmZmVyX2Rlc3Ryb3koYnVmZmVyKTsKQEAgLTIwNyw2ICsyMTAsMTYgQEAKIAlyZXR1cm4gdG90YWxfZHJhaW5lZDsKIH0KIAorc2l6ZV90IGlvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIF9pb25faGVhcF9mcmVlbGlzdF9kcmFpbihoZWFwLCBzaXplLCBmYWxzZSk7Cit9CisKK3NpemVfdCBpb25faGVhcF9mcmVlbGlzdF9zaHJpbmsoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gX2lvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKGhlYXAsIHNpemUsIHRydWUpOworfQorCiBzdGF0aWMgaW50IGlvbl9oZWFwX2RlZmVycmVkX2ZyZWUodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBkYXRhOwpAQCAtMjQ2LDEyICsyNTksNjIgQEAKIAlpZiAoSVNfRVJSKGhlYXAtPnRhc2spKSB7CiAJCXByX2VycigiJXM6IGNyZWF0aW5nIHRocmVhZCBmb3IgZGVmZXJyZWQgZnJlZSBmYWlsZWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBQVFJfUkVUKGhlYXAtPnRhc2spOworCQlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGhlYXAtPnRhc2spOwogCX0KIAlzY2hlZF9zZXRzY2hlZHVsZXIoaGVhcC0+dGFzaywgU0NIRURfSURMRSwgJnBhcmFtKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9uX2hlYXBfc2hyaW5rX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCisJCQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQoreworCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAorCQkJCQkgICAgIHNocmlua2VyKTsKKwlpbnQgdG90YWwgPSAwOworCisJdG90YWwgPSBpb25faGVhcF9mcmVlbGlzdF9zaXplKGhlYXApIC8gUEFHRV9TSVpFOworCWlmIChoZWFwLT5vcHMtPnNocmluaykKKwkJdG90YWwgKz0gaGVhcC0+b3BzLT5zaHJpbmsoaGVhcCwgc2MtPmdmcF9tYXNrLCAwKTsKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9oZWFwX3Nocmlua19zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCisJCQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQoreworCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAorCQkJCQkgICAgIHNocmlua2VyKTsKKwlpbnQgZnJlZWQgPSAwOworCWludCB0b19zY2FuID0gc2MtPm5yX3RvX3NjYW47CisKKwlpZiAodG9fc2NhbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogc2hyaW5rIHRoZSBmcmVlIGxpc3QgZmlyc3QsIG5vIHBvaW50IGluIHplcm9pbmcgdGhlIG1lbW9yeSBpZiB3ZSdyZQorCSAqIGp1c3QgZ29pbmcgdG8gcmVjbGFpbSBpdC4gQWxzbywgc2tpcCBhbnkgcG9zc2libGUgcGFnZSBwb29saW5nLgorCSAqLworCWlmIChoZWFwLT5mbGFncyAmIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSkKKwkJZnJlZWQgPSBpb25faGVhcF9mcmVlbGlzdF9zaHJpbmsoaGVhcCwgdG9fc2NhbiAqIFBBR0VfU0laRSkgLworCQkJCVBBR0VfU0laRTsKKworCXRvX3NjYW4gLT0gZnJlZWQ7CisJaWYgKHRvX3NjYW4gPD0gMCkKKwkJcmV0dXJuIGZyZWVkOworCisJaWYgKGhlYXAtPm9wcy0+c2hyaW5rKQorCQlmcmVlZCArPSBoZWFwLT5vcHMtPnNocmluayhoZWFwLCBzYy0+Z2ZwX21hc2ssIHRvX3NjYW4pOworCXJldHVybiBmcmVlZDsKK30KKwordm9pZCBpb25faGVhcF9pbml0X3Nocmlua2VyKHN0cnVjdCBpb25faGVhcCAqaGVhcCkKK3sKKwloZWFwLT5zaHJpbmtlci5jb3VudF9vYmplY3RzID0gaW9uX2hlYXBfc2hyaW5rX2NvdW50OworCWhlYXAtPnNocmlua2VyLnNjYW5fb2JqZWN0cyA9IGlvbl9oZWFwX3Nocmlua19zY2FuOworCWhlYXAtPnNocmlua2VyLnNlZWtzID0gREVGQVVMVF9TRUVLUzsKKwloZWFwLT5zaHJpbmtlci5iYXRjaCA9IDA7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmhlYXAtPnNocmlua2VyKTsKK30KKwogc3RydWN0IGlvbl9oZWFwICppb25faGVhcF9jcmVhdGUoc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpoZWFwX2RhdGEpCiB7CiAJc3RydWN0IGlvbl9oZWFwICpoZWFwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jCmluZGV4IGZhNjkzYzIuLmVjYjVmYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wYWdlX3Bvb2wuYwpAQCAtMTMwLDggKzEzMCw3IEBACiBpbnQgaW9uX3BhZ2VfcG9vbF9zaHJpbmsoc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wsIGdmcF90IGdmcF9tYXNrLAogCQkJCWludCBucl90b19zY2FuKQogewotCWludCBucl9mcmVlZCA9IDA7Ci0JaW50IGk7CisJaW50IGZyZWVkOwogCWJvb2wgaGlnaDsKIAogCWhpZ2ggPSAhIShnZnBfbWFzayAmIF9fR0ZQX0hJR0hNRU0pOwpAQCAtMTM5LDcgKzEzOCw3IEBACiAJaWYgKG5yX3RvX3NjYW4gPT0gMCkKIAkJcmV0dXJuIGlvbl9wYWdlX3Bvb2xfdG90YWwocG9vbCwgaGlnaCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfdG9fc2NhbjsgaSsrKSB7CisJZm9yIChmcmVlZCA9IDA7IGZyZWVkIDwgbnJfdG9fc2NhbjsgZnJlZWQrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCQltdXRleF9sb2NrKCZwb29sLT5tdXRleCk7CkBAIC0xNTMsMTAgKzE1Miw5IEBACiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZwb29sLT5tdXRleCk7CiAJCWlvbl9wYWdlX3Bvb2xfZnJlZV9wYWdlcyhwb29sLCBwYWdlKTsKLQkJbnJfZnJlZWQgKz0gKDEgPDwgcG9vbC0+b3JkZXIpOwogCX0KIAotCXJldHVybiBucl9mcmVlZDsKKwlyZXR1cm4gZnJlZWQ7CiB9CiAKIHN0cnVjdCBpb25fcGFnZV9wb29sICppb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaAppbmRleCBmYzJlNGZjLi4xZWJhM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaApAQCAtMzgsNiArMzgsNyBAQAogICogQGRldjoJCWJhY2sgcG9pbnRlciB0byB0aGUgaW9uX2RldmljZQogICogQGhlYXA6CQliYWNrIHBvaW50ZXIgdG8gdGhlIGhlYXAgdGhlIGJ1ZmZlciBjYW1lIGZyb20KICAqIEBmbGFnczoJCWJ1ZmZlciBzcGVjaWZpYyBmbGFncworICogQHByaXZhdGVfZmxhZ3M6CWludGVybmFsIGJ1ZmZlciBzcGVjaWZpYyBmbGFncwogICogQHNpemU6CQlzaXplIG9mIHRoZSBidWZmZXIKICAqIEBwcml2X3ZpcnQ6CQlwcml2YXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciByZXByZXNlbnRhYmxlIGFzCiAgKgkJCWEgdm9pZCAqCkBAIC02Niw2ICs2Nyw3IEBACiAJc3RydWN0IGlvbl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHByaXZhdGVfZmxhZ3M7CiAJc2l6ZV90IHNpemU7CiAJdW5pb24gewogCQl2b2lkICpwcml2X3ZpcnQ7CkBAIC05OCwyMiArMTAwLDI3IEBACiAgKiBAbWFwX3VzZXIJCW1hcCBtZW1vcnkgdG8gdXNlcnNwYWNlCiAgKgogICogYWxsb2NhdGUsIHBoeXMsIGFuZCBtYXBfdXNlciByZXR1cm4gMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZXJyb3IuCi0gKiBtYXBfZG1hIGFuZCBtYXBfa2VybmVsIHJldHVybiBwb2ludGVyIG9uIHN1Y2Nlc3MsIEVSUl9QVFIgb24gZXJyb3IuCisgKiBtYXBfZG1hIGFuZCBtYXBfa2VybmVsIHJldHVybiBwb2ludGVyIG9uIHN1Y2Nlc3MsIEVSUl9QVFIgb24KKyAqIGVycm9yLiBAZnJlZSB3aWxsIGJlIGNhbGxlZCB3aXRoIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSBzZXQgaW4KKyAqIHRoZSBidWZmZXIncyBwcml2YXRlX2ZsYWdzIHdoZW4gY2FsbGVkIGZyb20gYSBzaHJpbmtlci4gSW4gdGhhdAorICogY2FzZSwgdGhlIHBhZ2VzIGJlaW5nIGZyZWUnZCBtdXN0IGJlIHRydWx5IGZyZWUnZCBiYWNrIHRvIHRoZQorICogc3lzdGVtLCBub3QgcHV0IGluIGEgcGFnZSBwb29sIG9yIG90aGVyd2lzZSBjYWNoZWQuCiAgKi8KIHN0cnVjdCBpb25faGVhcF9vcHMgewotCWludCAoKmFsbG9jYXRlKSAoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJIHVuc2lnbmVkIGxvbmcgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCXZvaWQgKCpmcmVlKSAoc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0JaW50ICgqcGh5cykgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJICAgICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKLQlzdHJ1Y3Qgc2dfdGFibGUgKigqbWFwX2RtYSkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAoKnVubWFwX2RtYSkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAqICgqbWFwX2tlcm5lbCkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAoKnVubWFwX2tlcm5lbCkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0JaW50ICgqbWFwX3VzZXIpIChzdHJ1Y3QgaW9uX2hlYXAgKm1hcHBlciwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisJaW50ICgqYWxsb2NhdGUpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKKwkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJdW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOworCWludCAoKnBoeXMpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKKwkJICAgIGlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pOworCXN0cnVjdCBzZ190YWJsZSAqICgqbWFwX2RtYSkoc3RydWN0IGlvbl9oZWFwICpoZWFwLAorCQkJCSAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CisJdm9pZCAoKnVubWFwX2RtYSkoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKKwl2b2lkICogKCptYXBfa2VybmVsKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOworCXZvaWQgKCp1bm1hcF9rZXJuZWwpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CisJaW50ICgqbWFwX3VzZXIpKHN0cnVjdCBpb25faGVhcCAqbWFwcGVyLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCWludCAoKnNocmluaykoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBnZnBfdCBnZnBfbWFzaywgaW50IG5yX3RvX3NjYW4pOwogfTsKIAogLyoqCkBAIC0xMjIsNiArMTI5LDE3IEBACiAjZGVmaW5lIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSAoMSA8PCAwKQogCiAvKioKKyAqIHByaXZhdGUgZmxhZ3MgLSBmbGFncyBpbnRlcm5hbCB0byBpb24KKyAqLworLyoKKyAqIEJ1ZmZlciBpcyBiZWluZyBmcmVlZCBmcm9tIGEgc2hyaW5rZXIgZnVuY3Rpb24uIFNraXAgYW55IHBvc3NpYmxlCisgKiBoZWFwLXNwZWNpZmljIGNhY2hpbmcgbWVjaGFuaXNtIChlLmcuIHBhZ2UgcG9vbHMpLiBHdWFyYW50ZWVzIHRoYXQKKyAqIGFueSBidWZmZXIgc3RvcmFnZSB0aGF0IGNhbWUgZnJvbSB0aGUgc3lzdGVtIGFsbG9jYXRvciB3aWxsIGJlCisgKiByZXR1cm5lZCB0byB0aGUgc3lzdGVtIGFsbG9jYXRvci4KKyAqLworI2RlZmluZSBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUgKDEgPDwgMCkKKworLyoqCiAgKiBzdHJ1Y3QgaW9uX2hlYXAgLSByZXByZXNlbnRzIGEgaGVhcCBpbiB0aGUgc3lzdGVtCiAgKiBAbm9kZToJCXJiIG5vZGUgdG8gcHV0IHRoZSBoZWFwIG9uIHRoZSBkZXZpY2UncyB0cmVlIG9mIGhlYXBzCiAgKiBAZGV2OgkJYmFjayBwb2ludGVyIHRvIHRoZSBpb25fZGV2aWNlCkBAIC0xMzIsMTAgKzE1MCw3IEBACiAgKgkJCWFsbG9jYXRpbmcuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IHBsYXRmb3JtIGRhdGEgYW5kCiAgKgkJCU1VU1QgYmUgdW5pcXVlCiAgKiBAbmFtZToJCXVzZWQgZm9yIGRlYnVnZ2luZwotICogQHNocmlua2VyOgkJYSBzaHJpbmtlciBmb3IgdGhlIGhlYXAsIGlmIHRoZSBoZWFwIGNhY2hlcyBzeXN0ZW0KLSAqCQkJbWVtb3J5LCBpdCBtdXN0IGRlZmluZSBhIHNocmlua2VyIHRvIHJldHVybiBpdCBvbiBsb3cKLSAqCQkJbWVtb3J5IGNvbmRpdGlvbnMsIHRoaXMgaW5jbHVkZXMgc3lzdGVtIG1lbW9yeSBjYWNoZWQKLSAqCQkJaW4gdGhlIGRlZmVycmVkIGZyZWUgbGlzdHMgZm9yIGhlYXBzIHRoYXQgc3VwcG9ydCBpdAorICogQHNocmlua2VyOgkJYSBzaHJpbmtlciBmb3IgdGhlIGhlYXAKICAqIEBmcmVlX2xpc3Q6CQlmcmVlIGxpc3QgaGVhZCBpZiBkZWZlcnJlZCBmcmVlIGlzIHVzZWQKICAqIEBmcmVlX2xpc3Rfc2l6ZQlzaXplIG9mIHRoZSBkZWZlcnJlZCBmcmVlIGxpc3QgaW4gYnl0ZXMKICAqIEBsb2NrOgkJcHJvdGVjdHMgdGhlIGZyZWUgbGlzdApAQCAtMjE5LDYgKzIzNCwxNiBAQAogaW50IGlvbl9oZWFwX3BhZ2VzX3plcm8oc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBzaXplLCBwZ3Byb3RfdCBwZ3Byb3QpOwogCiAvKioKKyAqIGlvbl9oZWFwX2luaXRfc2hyaW5rZXIKKyAqIEBoZWFwOgkJdGhlIGhlYXAKKyAqCisgKiBJZiBhIGhlYXAgc2V0cyB0aGUgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFIGZsYWcgb3IgZGVmaW5lcyB0aGUgc2hyaW5rIG9wCisgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIHNldHVwIGEgc2hyaW5rZXIgdG8gc2hyaW5rIHRoZSBmcmVlbGlzdHMKKyAqIGFuZCBjYWxsIHRoZSBoZWFwJ3Mgc2hyaW5rIG9wLgorICovCit2b2lkIGlvbl9oZWFwX2luaXRfc2hyaW5rZXIoc3RydWN0IGlvbl9oZWFwICpoZWFwKTsKKworLyoqCiAgKiBpb25faGVhcF9pbml0X2RlZmVycmVkX2ZyZWUgLS0gaW5pdGlhbGl6ZSBkZWZlcnJlZCBmcmVlIGZ1bmN0aW9uYWxpdHkKICAqIEBoZWFwOgkJdGhlIGhlYXAKICAqCkBAIC0yNTAsNiArMjc1LDI5IEBACiBzaXplX3QgaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSk7CiAKIC8qKgorICogaW9uX2hlYXBfZnJlZWxpc3Rfc2hyaW5rIC0gZHJhaW4gdGhlIGRlZmVycmVkIGZyZWUKKyAqCQkJCWxpc3QsIHNraXBwaW5nIGFueSBoZWFwLXNwZWNpZmljCisgKgkJCQlwb29saW5nIG9yIGNhY2hpbmcgbWVjaGFuaXNtcworICoKKyAqIEBoZWFwOgkJdGhlIGhlYXAKKyAqIEBzaXplOgkJYW1vdW50IG9mIG1lbW9yeSB0byBkcmFpbiBpbiBieXRlcworICoKKyAqIERyYWlucyB0aGUgaW5kaWNhdGVkIGFtb3VudCBvZiBtZW1vcnkgZnJvbSB0aGUgZGVmZXJyZWQgZnJlZWxpc3QgaW1tZWRpYXRlbHkuCisgKiBSZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQgZnJlZWQuICBUaGUgdG90YWwgZnJlZWQgbWF5IGJlIGhpZ2hlciBkZXBlbmRpbmcKKyAqIG9uIHRoZSBzaXplIG9mIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCwgb3IgbG93ZXIgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50CisgKiB0b3RhbCBtZW1vcnkgb24gdGhlIGZyZWVsaXN0LgorICoKKyAqIFVubGlrZSB3aXRoIEBpb25faGVhcF9mcmVlbGlzdF9kcmFpbiwgZG9uJ3QgcHV0IGFueSBwYWdlcyBiYWNrIGludG8KKyAqIHBhZ2UgcG9vbHMgb3Igb3RoZXJ3aXNlIGNhY2hlIHRoZSBwYWdlcy4gRXZlcnl0aGluZyBtdXN0IGJlCisgKiBnZW51aW5lbHkgZnJlZSdkIGJhY2sgdG8gdGhlIHN5c3RlbS4gSWYgeW91J3JlIGZyZWUnaW5nIGZyb20gYQorICogc2hyaW5rZXIgeW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoaXMuIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbgorICogdGhlIGhlYXAub3BzLmZyZWUgY2FsbGJhY2sgaG9ub3JpbmcgdGhlIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRQorICogZmxhZy4KKyAqLworc2l6ZV90IGlvbl9oZWFwX2ZyZWVsaXN0X3NocmluayhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCisJCQkJCXNpemVfdCBzaXplKTsKKworLyoqCiAgKiBpb25faGVhcF9mcmVlbGlzdF9zaXplIC0gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZnJlZWxpc3QgaW4gYnl0ZXMKICAqIEBoZWFwOgkJdGhlIGhlYXAKICAqLwpAQCAtMzA1LDEzICszNTMsOCBAQAogICogQGxvd19jb3VudDoJCW51bWJlciBvZiBsb3dtZW0gaXRlbXMgaW4gdGhlIHBvb2wKICAqIEBoaWdoX2l0ZW1zOgkJbGlzdCBvZiBoaWdobWVtIGl0ZW1zCiAgKiBAbG93X2l0ZW1zOgkJbGlzdCBvZiBsb3dtZW0gaXRlbXMKLSAqIEBzaHJpbmtlcjoJCWEgc2hyaW5rZXIgZm9yIHRoZSBpdGVtcwogICogQG11dGV4OgkJbG9jayBwcm90ZWN0aW5nIHRoaXMgc3RydWN0IGFuZCBlc3BlY2lhbGx5IHRoZSBjb3VudAogICoJCQlpdGVtIGxpc3QKLSAqIEBhbGxvYzoJCWZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gYWxsb2NhdGUgcGFnZW9yeSB3aGVuIHRoZSBwb29sCi0gKgkJCWlzIGVtcHR5Ci0gKiBAZnJlZToJCWZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gZnJlZSBwYWdlb3J5IGJhY2sgdG8gdGhlIHN5c3RlbQotICoJCQl3aGVuIHRoZSBzaHJpbmtlciBmaXJlcwogICogQGdmcF9tYXNrOgkJZ2ZwX21hc2sgdG8gdXNlIGZyb20gYWxsb2MKICAqIEBvcmRlcjoJCW9yZGVyIG9mIHBhZ2VzIGluIHRoZSBwb29sCiAgKiBAbGlzdDoJCXBsaXN0IG5vZGUgZm9yIGxpc3Qgb2YgcG9vbHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYwppbmRleCA5ODQ5ZjM5Li5jOTIzNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9zeXN0ZW1faGVhcC5jCkBAIC05MCw3ICs5MCw3IEBACiB7CiAJYm9vbCBjYWNoZWQgPSBpb25fYnVmZmVyX2NhY2hlZChidWZmZXIpOwogCi0JaWYgKCFjYWNoZWQpIHsKKwlpZiAoIWNhY2hlZCAmJiAhKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpIHsKIAkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBoZWFwLT5wb29sc1tvcmRlcl90b19pbmRleChvcmRlcildOwogCQlpb25fcGFnZV9wb29sX2ZyZWUocG9vbCwgcGFnZSk7CiAJfSBlbHNlIHsKQEAgLTIwOSw3ICsyMDksNyBAQAogCiAJLyogdW5jYWNoZWQgcGFnZXMgY29tZSBmcm9tIHRoZSBwYWdlIHBvb2xzLCB6ZXJvIHRoZW0gYmVmb3JlIHJldHVybmluZwogCSAgIGZvciBzZWN1cml0eSBwdXJwb3NlcyAob3RoZXIgYWxsb2NhdGlvbnMgYXJlIHplcm9kIGF0IGFsbG9jIHRpbWUgKi8KLQlpZiAoIWNhY2hlZCkKKwlpZiAoIWNhY2hlZCAmJiAhKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpCiAJCWlvbl9oZWFwX2J1ZmZlcl96ZXJvKGJ1ZmZlcik7CiAKIAlmb3JfZWFjaF9zZyh0YWJsZS0+c2dsLCBzZywgdGFibGUtPm5lbnRzLCBpKQpAQCAtMjMxLDYgKzIzMSwyMyBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfc2hyaW5rKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgZ2ZwX3QgZ2ZwX21hc2ssCisJCQkJCWludCBucl90b19zY2FuKQoreworCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKnN5c19oZWFwOworCWludCBucl90b3RhbCA9IDA7CisJaW50IGk7CisKKwlzeXNfaGVhcCA9IGNvbnRhaW5lcl9vZihoZWFwLCBzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwLCBoZWFwKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKKwkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07CisJCW5yX3RvdGFsICs9IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKHBvb2wsIGdmcF9tYXNrLCBucl90b19zY2FuKTsKKwl9CisKKwlyZXR1cm4gbnJfdG90YWw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaW9uX2hlYXBfb3BzIHN5c3RlbV9oZWFwX29wcyA9IHsKIAkuYWxsb2NhdGUgPSBpb25fc3lzdGVtX2hlYXBfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fc3lzdGVtX2hlYXBfZnJlZSwKQEAgLTIzOSw2NyArMjU2LDkgQEAKIAkubWFwX2tlcm5lbCA9IGlvbl9oZWFwX21hcF9rZXJuZWwsCiAJLnVubWFwX2tlcm5lbCA9IGlvbl9oZWFwX3VubWFwX2tlcm5lbCwKIAkubWFwX3VzZXIgPSBpb25faGVhcF9tYXBfdXNlciwKKwkuc2hyaW5rID0gaW9uX3N5c3RlbV9oZWFwX3NocmluaywKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9zeXN0ZW1faGVhcF9zaHJpbmtfY291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKLQkJCQkgIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCi17Ci0Jc3RydWN0IGlvbl9oZWFwICpoZWFwID0gY29udGFpbmVyX29mKHNocmlua2VyLCBzdHJ1Y3QgaW9uX2hlYXAsCi0JCQkJCSAgICAgc2hyaW5rZXIpOwotCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKnN5c19oZWFwID0gY29udGFpbmVyX29mKGhlYXAsCi0JCQkJCQkJc3RydWN0IGlvbl9zeXN0ZW1faGVhcCwKLQkJCQkJCQloZWFwKTsKLQlpbnQgbnJfdG90YWwgPSAwOwotCWludCBpOwotCi0JLyogdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGlzIHdoYXRldmVyIHRoZSBwYWdlIHBvb2xzIGFyZSBob2xkaW5nCi0JICAgcGx1cyB3aGF0ZXZlcidzIGluIHRoZSBmcmVlbGlzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKLQkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07Ci0JCW5yX3RvdGFsICs9IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKHBvb2wsIHNjLT5nZnBfbWFzaywgMCk7Ci0JfQotCW5yX3RvdGFsICs9IGlvbl9oZWFwX2ZyZWVsaXN0X3NpemUoaGVhcCkgLyBQQUdFX1NJWkU7Ci0JcmV0dXJuIG5yX3RvdGFsOwotCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9zeXN0ZW1faGVhcF9zaHJpbmtfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAotCQkJCSAgc3RydWN0IHNocmlua19jb250cm9sICpzYykKLXsKLQotCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAotCQkJCQkgICAgIHNocmlua2VyKTsKLQlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpzeXNfaGVhcCA9IGNvbnRhaW5lcl9vZihoZWFwLAotCQkJCQkJCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAsCi0JCQkJCQkJaGVhcCk7Ci0JaW50IG5yX2ZyZWVkID0gMDsKLQlpbnQgaTsKLQotCWlmIChzYy0+bnJfdG9fc2NhbiA9PSAwKQotCQlnb3RvIGVuZDsKLQotCS8qIHNocmluayB0aGUgZnJlZSBsaXN0IGZpcnN0LCBubyBwb2ludCBpbiB6ZXJvaW5nIHRoZSBtZW1vcnkgaWYKLQkgICB3ZSdyZSBqdXN0IGdvaW5nIHRvIHJlY2xhaW0gaXQgKi8KLQlucl9mcmVlZCArPSBpb25faGVhcF9mcmVlbGlzdF9kcmFpbihoZWFwLCBzYy0+bnJfdG9fc2NhbiAqIFBBR0VfU0laRSkgLwotCQlQQUdFX1NJWkU7Ci0KLQlpZiAobnJfZnJlZWQgPj0gc2MtPm5yX3RvX3NjYW4pCi0JCWdvdG8gZW5kOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9vcmRlcnM7IGkrKykgewotCQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCA9IHN5c19oZWFwLT5wb29sc1tpXTsKLQotCQlucl9mcmVlZCArPSBpb25fcGFnZV9wb29sX3Nocmluayhwb29sLCBzYy0+Z2ZwX21hc2ssCi0JCQkJCQkgc2MtPm5yX3RvX3NjYW4pOwotCQlpZiAobnJfZnJlZWQgPj0gc2MtPm5yX3RvX3NjYW4pCi0JCQlicmVhazsKLQl9Ci0KLWVuZDoKLQlyZXR1cm4gbnJfZnJlZWQ7Ci0KLX0KLQogc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfZGVidWdfc2hvdyhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBzZXFfZmlsZSAqcywKIAkJCQkgICAgICB2b2lkICp1bnVzZWQpCiB7CkBAIC0zNDcsMTEgKzMwNiw2IEBACiAJCWhlYXAtPnBvb2xzW2ldID0gcG9vbDsKIAl9CiAKLQloZWFwLT5oZWFwLnNocmlua2VyLnNjYW5fb2JqZWN0cyA9IGlvbl9zeXN0ZW1faGVhcF9zaHJpbmtfc2NhbjsKLQloZWFwLT5oZWFwLnNocmlua2VyLmNvdW50X29iamVjdHMgPSBpb25fc3lzdGVtX2hlYXBfc2hyaW5rX2NvdW50OwotCWhlYXAtPmhlYXAuc2hyaW5rZXIuc2Vla3MgPSBERUZBVUxUX1NFRUtTOwotCWhlYXAtPmhlYXAuc2hyaW5rZXIuYmF0Y2ggPSAwOwotCXJlZ2lzdGVyX3Nocmlua2VyKCZoZWFwLT5oZWFwLnNocmlua2VyKTsKIAloZWFwLT5oZWFwLmRlYnVnX3Nob3cgPSBpb25fc3lzdGVtX2hlYXBfZGVidWdfc2hvdzsKIAlyZXR1cm4gJmhlYXAtPmhlYXA7CiBlcnJfY3JlYXRlX3Bvb2w6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vdGVncmEvdGVncmFfaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vdGVncmEvdGVncmFfaW9uLmMKaW5kZXggMzQ3NGM2NS4uMTFjN2NjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL3RlZ3JhL3RlZ3JhX2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi90ZWdyYS90ZWdyYV9pb24uYwpAQCAtMzIsMTMgKzMyLDEzIEBACiAKIAludW1faGVhcHMgPSBwZGF0YS0+bnI7CiAKLQloZWFwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb25faGVhcCAqKSAqIHBkYXRhLT5uciwgR0ZQX0tFUk5FTCk7CisJaGVhcHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb25faGVhcCAqKSAqIHBkYXRhLT5uciwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CiAKIAlpZGV2ID0gaW9uX2RldmljZV9jcmVhdGUoTlVMTCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGlkZXYpKSB7Ci0JCWtmcmVlKGhlYXBzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoaWRldikpCiAJCXJldHVybiBQVFJfRVJSKGlkZXYpOwotCX0KIAogCS8qIGNyZWF0ZSB0aGUgaGVhcHMgYXMgc3BlY2lmaWVkIGluIHRoZSBib2FyZCBmaWxlICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9oZWFwczsgaSsrKSB7CkBAIC01OCw3ICs1OCw2IEBACiAJCWlmIChoZWFwc1tpXSkKIAkJCWlvbl9oZWFwX2Rlc3Ryb3koaGVhcHNbaV0pOwogCX0KLQlrZnJlZShoZWFwcyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzAsNyArNjksNiBAQAogCWlvbl9kZXZpY2VfZGVzdHJveShpZGV2KTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2hlYXBzOyBpKyspCiAJCWlvbl9oZWFwX2Rlc3Ryb3koaGVhcHNbaV0pOwotCWtmcmVlKGhlYXBzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwppbmRleCA2ZjA5NGIzLi5iNTQ1ZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpAQCAtODgsNyArODgsOCBAQAogCWludCBhcnJheV9zaXplID0gQVJSQVlfU0laRShsb3dtZW1fYWRqKTsKIAlpbnQgb3RoZXJfZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfUEFHRVMpIC0gdG90YWxyZXNlcnZlX3BhZ2VzOwogCWludCBvdGhlcl9maWxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9QQUdFUykgLQotCQkJCQkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0hNRU0pOworCQkJCQkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0hNRU0pIC0KKwkJCQkJCXRvdGFsX3N3YXBjYWNoZV9wYWdlcygpOwogCiAJaWYgKGxvd21lbV9hZGpfc2l6ZSA8IGFycmF5X3NpemUpCiAJCWFycmF5X3NpemUgPSBsb3dtZW1fYWRqX3NpemU7CkBAIC0xNTksOCArMTYwLDggQEAKIAkJCSAgICAgc2VsZWN0ZWQtPnBpZCwgc2VsZWN0ZWQtPmNvbW0sCiAJCQkgICAgIHNlbGVjdGVkX29vbV9zY29yZV9hZGosIHNlbGVjdGVkX3Rhc2tzaXplKTsKIAkJbG93bWVtX2RlYXRocGVuZGluZ190aW1lb3V0ID0gamlmZmllcyArIEhaOwotCQlzZW5kX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCwgMCk7CiAJCXNldF90c2tfdGhyZWFkX2ZsYWcoc2VsZWN0ZWQsIFRJRl9NRU1ESUUpOworCQlzZW5kX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCwgMCk7CiAJCXJlbSArPSBzZWxlY3RlZF90YXNrc2l6ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuaAppbmRleCA1YWFmNzFkLi4xYTUwNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zd19zeW5jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3dfc3luYy5oCkBAIC0xOCwxMCArMTgsOSBAQAogI2RlZmluZSBfTElOVVhfU1dfU1lOQ19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaWZkZWYgX19LRVJORUxfXwotCisjaW5jbHVkZSA8bGludXgva2NvbmZpZy5oPgogI2luY2x1ZGUgInN5bmMuaCIKKyNpbmNsdWRlICJ1YXBpL3N3X3N5bmMuaCIKIAogc3RydWN0IHN3X3N5bmNfdGltZWxpbmUgewogCXN0cnVjdAlzeW5jX3RpbWVsaW5lCW9iajsKQEAgLTU3LDE5ICs1Niw0IEBACiB9CiAjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfU1dfU1lOQykgKi8KIAotI2VuZGlmIC8qIF9fS0VSTkVMIF9fICovCi0KLXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhIHsKLQlfX3UzMgl2YWx1ZTsKLQljaGFyCW5hbWVbMzJdOwotCV9fczMyCWZlbmNlOyAvKiBmZCBvZiBuZXcgZmVuY2UgKi8KLX07Ci0KLSNkZWZpbmUgU1dfU1lOQ19JT0NfTUFHSUMJJ1cnCi0KLSNkZWZpbmUgU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFCV9JT1dSKFNXX1NZTkNfSU9DX01BR0lDLCAwLFwKLQkJc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEpCi0jZGVmaW5lIFNXX1NZTkNfSU9DX0lOQwkJCV9JT1coU1dfU1lOQ19JT0NfTUFHSUMsIDEsIF9fdTMyKQotCi0KICNlbmRpZiAvKiBfTElOVVhfU1dfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmgKaW5kZXggNjJlMjI1NWIuLmVhZjU3Y2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5oCkBAIC0xNCwxNCArMTQsMTQgQEAKICNkZWZpbmUgX0xJTlVYX1NZTkNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKKyNpbmNsdWRlICJ1YXBpL3N5bmMuaCIKKwogc3RydWN0IHN5bmNfdGltZWxpbmU7CiBzdHJ1Y3Qgc3luY19wdDsKIHN0cnVjdCBzeW5jX2ZlbmNlOwpAQCAtNTMsNyArNTMsNyBAQAogCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOwogCiAJLyogcmVxdWlyZWQgKi8KLQlzdHJ1Y3Qgc3luY19wdCAqKCpkdXApKHN0cnVjdCBzeW5jX3B0ICpwdCk7CisJc3RydWN0IHN5bmNfcHQgKiAoKmR1cCkoc3RydWN0IHN5bmNfcHQgKnB0KTsKIAogCS8qIHJlcXVpcmVkICovCiAJaW50ICgqaGFzX3NpZ25hbGVkKShzdHJ1Y3Qgc3luY19wdCAqcHQpOwpAQCAtMzQxLDg2ICszNDEsNCBAQAogICovCiBpbnQgc3luY19mZW5jZV93YWl0KHN0cnVjdCBzeW5jX2ZlbmNlICpmZW5jZSwgbG9uZyB0aW1lb3V0KTsKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotLyoqCi0gKiBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIC0gZGF0YSBwYXNzZWQgdG8gbWVyZ2UgaW9jdGwKLSAqIEBmZDI6CWZpbGUgZGVzY3JpcHRvciBvZiBzZWNvbmQgZmVuY2UKLSAqIEBuYW1lOgluYW1lIG9mIG5ldyBmZW5jZQotICogQGZlbmNlOglyZXR1cm5zIHRoZSBmZCBvZiB0aGUgbmV3IGZlbmNlIHRvIHVzZXJzcGFjZQotICovCi1zdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIHsKLQlfX3MzMglmZDI7IC8qIGZkIG9mIHNlY29uZCBmZW5jZSAqLwotCWNoYXIJbmFtZVszMl07IC8qIG5hbWUgb2YgbmV3IGZlbmNlICovCi0JX19zMzIJZmVuY2U7IC8qIGZkIG9uIG5ld2x5IGNyZWF0ZWQgZmVuY2UgKi8KLX07Ci0KLS8qKgotICogc3RydWN0IHN5bmNfcHRfaW5mbyAtIGRldGFpbGVkIHN5bmNfcHQgaW5mb3JtYXRpb24KLSAqIEBsZW46CQlsZW5ndGggb2Ygc3luY19wdF9pbmZvIGluY2x1ZGluZyBhbnkgZHJpdmVyX2RhdGEKLSAqIEBvYmpfbmFtZToJCW5hbWUgb2YgcGFyZW50IHN5bmNfdGltZWxpbmUKLSAqIEBkcml2ZXJfbmFtZToJbmFtZSBvZiBkcml2ZXIgaW1wbGVtZW50aW5nIHRoZSBwYXJlbnQKLSAqIEBzdGF0dXM6CQlzdGF0dXMgb2YgdGhlIHN5bmNfcHQgMDphY3RpdmUgMTpzaWduYWxlZCA8MDplcnJvcgotICogQHRpbWVzdGFtcF9uczoJdGltZXN0YW1wIG9mIHN0YXR1cyBjaGFuZ2UgaW4gbmFub3NlY29uZHMKLSAqIEBkcml2ZXJfZGF0YToJYW55IGRyaXZlciBkZXBlbmRlbnQgZGF0YQotICovCi1zdHJ1Y3Qgc3luY19wdF9pbmZvIHsKLQlfX3UzMglsZW47Ci0JY2hhcglvYmpfbmFtZVszMl07Ci0JY2hhcglkcml2ZXJfbmFtZVszMl07Ci0JX19zMzIJc3RhdHVzOwotCV9fdTY0CXRpbWVzdGFtcF9uczsKLQotCV9fdTgJZHJpdmVyX2RhdGFbMF07Ci19OwotCi0vKioKLSAqIHN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSAtIGRhdGEgcmV0dXJuZWQgZnJvbSBmZW5jZSBpbmZvIGlvY3RsCi0gKiBAbGVuOglpb2N0bCBjYWxsZXIgd3JpdGVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXRzIHBhc3NpbmcgaW4uCi0gKgkJaW9jdGwgcmV0dXJucyBsZW5ndGggb2Ygc3luY19mZW5jZV9kYXRhIHJldHVybmVkIHRvIHVzZXJzcGFjZQotICoJCWluY2x1ZGluZyBwdF9pbmZvLgotICogQG5hbWU6CW5hbWUgb2YgZmVuY2UKLSAqIEBzdGF0dXM6CXN0YXR1cyBvZiBmZW5jZS4gMTogc2lnbmFsZWQgMDphY3RpdmUgPDA6ZXJyb3IKLSAqIEBwdF9pbmZvOglhIHN5bmNfcHRfaW5mbyBzdHJ1Y3QgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlCi0gKi8KLXN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSB7Ci0JX191MzIJbGVuOwotCWNoYXIJbmFtZVszMl07Ci0JX19zMzIJc3RhdHVzOwotCi0JX191OAlwdF9pbmZvWzBdOwotfTsKLQotI2RlZmluZSBTWU5DX0lPQ19NQUdJQwkJJz4nCi0KLS8qKgotICogRE9DOiBTWU5DX0lPQ19XQUlUIC0gd2FpdCBmb3IgYSBmZW5jZSB0byBzaWduYWwKLSAqCi0gKiBwYXNzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAgV2FpdHMgaW5kZWZpbml0ZWx5IHRpbWVvdXQgPCAwLgotICovCi0jZGVmaW5lIFNZTkNfSU9DX1dBSVQJCV9JT1coU1lOQ19JT0NfTUFHSUMsIDAsIF9fczMyKQotCi0vKioKLSAqIERPQzogU1lOQ19JT0NfTUVSR0UgLSBtZXJnZSB0d28gZmVuY2VzCi0gKgotICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhLiAgQ3JlYXRlcyBhIG5ldyBmZW5jZSBjb250YWluaW5nIGNvcGllcyBvZgotICogdGhlIHN5bmNfcHRzIGluIGJvdGggdGhlIGNhbGxpbmcgZmQgYW5kIHN5bmNfbWVyZ2VfZGF0YS5mZDIuICBSZXR1cm5zIHRoZQotICogbmV3IGZlbmNlJ3MgZmQgaW4gc3luY19tZXJnZV9kYXRhLmZlbmNlCi0gKi8KLSNkZWZpbmUgU1lOQ19JT0NfTUVSR0UJCV9JT1dSKFNZTkNfSU9DX01BR0lDLCAxLCBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhKQotCi0vKioKLSAqIERPQzogU1lOQ19JT0NfRkVOQ0VfSU5GTyAtIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBhIGZlbmNlCi0gKgotICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgd2l0aCBleHRyYSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHB0X2luZm8uCi0gKiBDYWxsZXIgc2hvdWxkIHdyaXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW50byBsZW4uICBPbiByZXR1cm4sIGxlbiBpcwotICogdXBkYXRlZCB0byByZWZsZWN0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzeW5jX2ZlbmNlX2luZm9fZGF0YSBpbmNsdWRpbmcKLSAqIHB0X2luZm8uCi0gKgotICogcHRfaW5mbyBpcyBhIGJ1ZmZlciBjb250YWluaW5nIHN5bmNfcHRfaW5mb3MgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlLgotICogVG8gaXRlcmF0ZSBvdmVyIHRoZSBzeW5jX3B0X2luZm9zLCB1c2UgdGhlIHN5bmNfcHRfaW5mby5sZW4gZmllbGQuCi0gKi8KLSNkZWZpbmUgU1lOQ19JT0NfRkVOQ0VfSU5GTwlfSU9XUihTWU5DX0lPQ19NQUdJQywgMixcCi0Jc3RydWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhKQotCiAjZW5kaWYgLyogX0xJTlVYX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jCmluZGV4IGU4MTQ1MTQuLjBjN2ZkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKQEAgLTkwLDggKzkwLDkgQEAKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JZ3Bpb19kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpbWVkX2dwaW9fZGF0YSkgKiBwZGF0YS0+bnVtX2dwaW9zLAotCQkJR0ZQX0tFUk5FTCk7CisJZ3Bpb19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEpICogcGRhdGEtPm51bV9ncGlvcywKKwkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWdwaW9fZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEzMSw3ICsxMzIsNiBAQAogCQl0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoJmdwaW9fZGF0YVtpXS5kZXYpOwogCQlncGlvX2ZyZWUoZ3Bpb19kYXRhW2ldLmdwaW8pOwogCX0KLQlrZnJlZShncGlvX2RhdGEpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0Nyw4ICsxNDcsNiBAQAogCQlncGlvX2ZyZWUoZ3Bpb19kYXRhW2ldLmdwaW8pOwogCX0KIAotCWtmcmVlKGdwaW9fZGF0YSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaAppbmRleCA5MDVjN2NjLi4xM2QyY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaApAQCAtMjAsMTAgKzIwLDEwIEBACiAJY29uc3QgY2hhcgkqbmFtZTsKIAogCS8qIGVuYWJsZSB0aGUgb3V0cHV0IGFuZCBzZXQgdGhlIHRpbWVyICovCi0Jdm9pZAkoKmVuYWJsZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYsIGludCB0aW1lb3V0KTsKKwl2b2lkICgqZW5hYmxlKShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqc2RldiwgaW50IHRpbWVvdXQpOwogCiAJLyogcmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHJlbWFpbmluZyBvbiB0aGUgdGltZXIgKi8KLQlpbnQJCSgqZ2V0X3RpbWUpKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpzZGV2KTsKKwlpbnQgKCpnZXRfdGltZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYpOwogCiAJLyogcHJpdmF0ZSBkYXRhICovCiAJc3RydWN0IGRldmljZQkqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2FuZHJvaWRfYWxhcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAxM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmgKQEAgLTAsMCArMSw2MiBAQAorLyogZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX0FORFJPSURfQUxBUk1fSAorI2RlZmluZSBfVUFQSV9MSU5VWF9BTkRST0lEX0FMQVJNX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCitlbnVtIGFuZHJvaWRfYWxhcm1fdHlwZSB7CisJLyogcmV0dXJuIGNvZGUgYml0IG51bWJlcnMgb3Igc2V0IGFsYXJtIGFyZyAqLworCUFORFJPSURfQUxBUk1fUlRDX1dBS0VVUCwKKwlBTkRST0lEX0FMQVJNX1JUQywKKwlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAorCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRSwKKwlBTkRST0lEX0FMQVJNX1NZU1RFTVRJTUUsCisKKwlBTkRST0lEX0FMQVJNX1RZUEVfQ09VTlQsCisKKwkvKiByZXR1cm4gY29kZSBiaXQgbnVtYmVycyAqLworCS8qIEFORFJPSURfQUxBUk1fVElNRV9DSEFOR0UgPSAxNiAqLworfTsKKworZW51bSBhbmRyb2lkX2FsYXJtX3JldHVybl9mbGFncyB7CisJQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQX01BU0sgPSAxVSA8PCBBTkRST0lEX0FMQVJNX1JUQ19XQUtFVVAsCisJQU5EUk9JRF9BTEFSTV9SVENfTUFTSyA9IDFVIDw8IEFORFJPSURfQUxBUk1fUlRDLAorCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVBfTUFTSyA9CisJCQkJMVUgPDwgQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwKKwlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfTUFTSyA9CisJCQkJMVUgPDwgQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FLAorCUFORFJPSURfQUxBUk1fU1lTVEVNVElNRV9NQVNLID0gMVUgPDwgQU5EUk9JRF9BTEFSTV9TWVNURU1USU1FLAorCUFORFJPSURfQUxBUk1fVElNRV9DSEFOR0VfTUFTSyA9IDFVIDw8IDE2Cit9OworCisvKiBEaXNhYmxlIGFsYXJtICovCisjZGVmaW5lIEFORFJPSURfQUxBUk1fQ0xFQVIodHlwZSkgICAgICAgICAgIF9JTygnYScsIDAgfCAoKHR5cGUpIDw8IDQpKQorCisvKiBBY2sgbGFzdCBhbGFybSBhbmQgd2FpdCBmb3IgbmV4dCAqLworI2RlZmluZSBBTkRST0lEX0FMQVJNX1dBSVQgICAgICAgICAgICAgICAgICBfSU8oJ2EnLCAxKQorCisjZGVmaW5lIEFMQVJNX0lPVyhjLCB0eXBlLCBzaXplKSAgICAgICAgICAgIF9JT1coJ2EnLCAoYykgfCAoKHR5cGUpIDw8IDQpLCBzaXplKQorLyogU2V0IGFsYXJtICovCisjZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUKHR5cGUpICAgICAgICAgICAgIEFMQVJNX0lPVygyLCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUX0FORF9XQUlUKHR5cGUpICAgIEFMQVJNX0lPVygzLCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fR0VUX1RJTUUodHlwZSkgICAgICAgIEFMQVJNX0lPVyg0LCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUX1JUQyAgICAgICAgICAgICAgIF9JT1coJ2EnLCA1LCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fQkFTRV9DTUQoY21kKSAgICAgICAgIChjbWQgJiB+KF9JT0MoMCwgMCwgMHhmMCwgMCkpKQorI2RlZmluZSBBTkRST0lEX0FMQVJNX0lPQ1RMX1RPX1RZUEUoY21kKSAgICAoX0lPQ19OUihjbWQpID4+IDQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hc2htZW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NzQzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIGRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorICogQXV0aG9yOiBSb2JlcnQgTG92ZQorICoKKyAqIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkLiAgSXQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSAyLjAgTGljZW5zZSBPUiB2ZXJzaW9uIDIgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX0FTSE1FTV9ICisjZGVmaW5lIF9VQVBJX0xJTlVYX0FTSE1FTV9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEFTSE1FTV9OQU1FX0xFTgkJMjU2CisKKyNkZWZpbmUgQVNITUVNX05BTUVfREVGCQkiZGV2L2FzaG1lbSIKKworLyogUmV0dXJuIHZhbHVlcyBmcm9tIEFTSE1FTV9QSU46IFdhcyB0aGUgbWFwcGluZyBwdXJnZWQgd2hpbGUgdW5waW5uZWQ/ICovCisjZGVmaW5lIEFTSE1FTV9OT1RfUFVSR0VECTAKKyNkZWZpbmUgQVNITUVNX1dBU19QVVJHRUQJMQorCisvKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX0dFVF9QSU5fU1RBVFVTOiBJcyB0aGUgbWFwcGluZyBwaW5uZWQ/ICovCisjZGVmaW5lIEFTSE1FTV9JU19VTlBJTk5FRAkwCisjZGVmaW5lIEFTSE1FTV9JU19QSU5ORUQJMQorCitzdHJ1Y3QgYXNobWVtX3BpbiB7CisJX191MzIgb2Zmc2V0OwkvKiBvZmZzZXQgaW50byByZWdpb24sIGluIGJ5dGVzLCBwYWdlLWFsaWduZWQgKi8KKwlfX3UzMiBsZW47CS8qIGxlbmd0aCBmb3J3YXJkIGZyb20gb2Zmc2V0LCBpbiBieXRlcywgcGFnZS1hbGlnbmVkICovCit9OworCisjZGVmaW5lIF9fQVNITUVNSU9DCQkweDc3CisKKyNkZWZpbmUgQVNITUVNX1NFVF9OQU1FCQlfSU9XKF9fQVNITUVNSU9DLCAxLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCisjZGVmaW5lIEFTSE1FTV9HRVRfTkFNRQkJX0lPUihfX0FTSE1FTUlPQywgMiwgY2hhcltBU0hNRU1fTkFNRV9MRU5dKQorI2RlZmluZSBBU0hNRU1fU0VUX1NJWkUJCV9JT1coX19BU0hNRU1JT0MsIDMsIHNpemVfdCkKKyNkZWZpbmUgQVNITUVNX0dFVF9TSVpFCQlfSU8oX19BU0hNRU1JT0MsIDQpCisjZGVmaW5lIEFTSE1FTV9TRVRfUFJPVF9NQVNLCV9JT1coX19BU0hNRU1JT0MsIDUsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIEFTSE1FTV9HRVRfUFJPVF9NQVNLCV9JTyhfX0FTSE1FTUlPQywgNikKKyNkZWZpbmUgQVNITUVNX1BJTgkJX0lPVyhfX0FTSE1FTUlPQywgNywgc3RydWN0IGFzaG1lbV9waW4pCisjZGVmaW5lIEFTSE1FTV9VTlBJTgkJX0lPVyhfX0FTSE1FTUlPQywgOCwgc3RydWN0IGFzaG1lbV9waW4pCisjZGVmaW5lIEFTSE1FTV9HRVRfUElOX1NUQVRVUwlfSU8oX19BU0hNRU1JT0MsIDkpCisjZGVmaW5lIEFTSE1FTV9QVVJHRV9BTExfQ0FDSEVTCV9JTyhfX0FTSE1FTUlPQywgMTApCisKKyNlbmRpZgkvKiBfVUFQSV9MSU5VWF9BU0hNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0YWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYmluZGVyLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKgorICogQmFzZWQgb24sIGJ1dCBubyBsb25nZXIgY29tcGF0aWJsZSB3aXRoLCB0aGUgb3JpZ2luYWwKKyAqIE9wZW5CaW5kZXIub3JnIGJpbmRlciBkcml2ZXIgaW50ZXJmYWNlLCB3aGljaCBpczoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgUGFsbXNvdXJjZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX1VBUElfTElOVVhfQklOREVSX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfQklOREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCisJKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKKyNkZWZpbmUgQl9UWVBFX0xBUkdFIDB4ODUKKworZW51bSB7CisJQklOREVSX1RZUEVfQklOREVSCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRQk9IEJfUEFDS19DSEFSUygndycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX0ZECQk9IEJfUEFDS19DSEFSUygnZicsICdkJywgJyonLCBCX1RZUEVfTEFSR0UpLAorfTsKKworZW51bSB7CisJRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLID0gMHhmZiwKKwlGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTID0gMHgxMDAsCit9OworCisjaWZkZWYgQklOREVSX0lQQ18zMkJJVAordHlwZWRlZiBfX3UzMiBiaW5kZXJfc2l6ZV90OwordHlwZWRlZiBfX3UzMiBiaW5kZXJfdWludHB0cl90OworI2Vsc2UKK3R5cGVkZWYgX191NjQgYmluZGVyX3NpemVfdDsKK3R5cGVkZWYgX191NjQgYmluZGVyX3VpbnRwdHJfdDsKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgQmluZGVyIG9iamVjdCBmb3IgdHJhbnNmZXIKKyAqIGJldHdlZW4gcHJvY2Vzc2VzLiAgVGhlICdvZmZzZXRzJyBzdXBwbGllZCBhcyBwYXJ0IG9mIGEgYmluZGVyIHRyYW5zYWN0aW9uCisgKiBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGRhdGEgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBvY2N1ci4gIFRoZSBCaW5kZXIKKyAqIGRyaXZlciB0YWtlcyBjYXJlIG9mIHJlLXdyaXRpbmcgdGhlIHN0cnVjdHVyZSB0eXBlIGFuZCBkYXRhIGFzIGl0IG1vdmVzCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4KKyAqLworc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7CisJLyogOCBieXRlcyBmb3IgbGFyZ2VfZmxhdF9oZWFkZXIuICovCisJX191MzIJCXR5cGU7CisJX191MzIJCWZsYWdzOworCisJLyogOCBieXRlcyBvZiBkYXRhLiAqLworCXVuaW9uIHsKKwkJYmluZGVyX3VpbnRwdHJfdAliaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLworCQlfX3UzMgkJCWhhbmRsZTsJLyogcmVtb3RlIG9iamVjdCAqLworCX07CisKKwkvKiBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBsb2NhbCBvYmplY3QgKi8KKwliaW5kZXJfdWludHB0cl90CWNvb2tpZTsKK307CisKKy8qCisgKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlIHVzZXIgY29kZSBtYXkgcnVuIGluIDMyLWJpdHMgdGhlIGRyaXZlciBtdXN0CisgKiB0cmFuc2xhdGUgdGhlIGJ1ZmZlciAoYW5kIGxvY2FsIGJpbmRlcikgYWRkcmVzc2VzIGFwcHJvcHJpYXRlbHkuCisgKi8KKworc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkIHsKKwliaW5kZXJfc2l6ZV90CQl3cml0ZV9zaXplOwkvKiBieXRlcyB0byB3cml0ZSAqLworCWJpbmRlcl9zaXplX3QJCXdyaXRlX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KKwliaW5kZXJfdWludHB0cl90CXdyaXRlX2J1ZmZlcjsKKwliaW5kZXJfc2l6ZV90CQlyZWFkX3NpemU7CS8qIGJ5dGVzIHRvIHJlYWQgKi8KKwliaW5kZXJfc2l6ZV90CQlyZWFkX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KKwliaW5kZXJfdWludHB0cl90CXJlYWRfYnVmZmVyOworfTsKKworLyogVXNlIHdpdGggQklOREVSX1ZFUlNJT04sIGRyaXZlciBmaWxscyBpbiBmaWVsZHMuICovCitzdHJ1Y3QgYmluZGVyX3ZlcnNpb24geworCS8qIGRyaXZlciBwcm90b2NvbCB2ZXJzaW9uIC0tIGluY3JlbWVudCB3aXRoIGluY29tcGF0aWJsZSBjaGFuZ2UgKi8KKwlfX3MzMiAgICAgICBwcm90b2NvbF92ZXJzaW9uOworfTsKKworLyogVGhpcyBpcyB0aGUgY3VycmVudCBwcm90b2NvbCB2ZXJzaW9uLiAqLworI2lmZGVmIEJJTkRFUl9JUENfMzJCSVQKKyNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3CisjZWxzZQorI2RlZmluZSBCSU5ERVJfQ1VSUkVOVF9QUk9UT0NPTF9WRVJTSU9OIDgKKyNlbmRpZgorCisjZGVmaW5lIEJJTkRFUl9XUklURV9SRUFECQlfSU9XUignYicsIDEsIHN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCkKKyNkZWZpbmUgQklOREVSX1NFVF9JRExFX1RJTUVPVVQJCV9JT1coJ2InLCAzLCBfX3M2NCkKKyNkZWZpbmUgQklOREVSX1NFVF9NQVhfVEhSRUFEUwkJX0lPVygnYicsIDUsIF9fdTMyKQorI2RlZmluZSBCSU5ERVJfU0VUX0lETEVfUFJJT1JJVFkJX0lPVygnYicsIDYsIF9fczMyKQorI2RlZmluZSBCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgX19zMzIpCisjZGVmaW5lIEJJTkRFUl9USFJFQURfRVhJVAkJX0lPVygnYicsIDgsIF9fczMyKQorI2RlZmluZSBCSU5ERVJfVkVSU0lPTgkJCV9JT1dSKCdiJywgOSwgc3RydWN0IGJpbmRlcl92ZXJzaW9uKQorCisvKgorICogTk9URTogVHdvIHNwZWNpYWwgZXJyb3IgY29kZXMgeW91IHNob3VsZCBjaGVjayBmb3Igd2hlbiBjYWxsaW5nCisgKiBpbiB0byB0aGUgZHJpdmVyIGFyZToKKyAqCisgKiBFSU5UUiAtLSBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGludGVydXB0ZWQuICBUaGlzIHNob3VsZCBiZQorICogaGFuZGxlZCBieSByZXRyeWluZyB0aGUgaW9jdGwoKSB1bnRpbCBhIGRpZmZlcmVudCBlcnJvciBjb2RlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBFQ09OTlJFRlVTRUQgLS0gVGhlIGRyaXZlciBpcyBubyBsb25nZXIgYWNjZXB0aW5nIG9wZXJhdGlvbnMKKyAqIGZyb20geW91ciBwcm9jZXNzLiAgVGhhdCBpcywgdGhlIHByb2Nlc3MgaXMgYmVpbmcgZGVzdHJveWVkLgorICogWW91IHNob3VsZCBoYW5kbGUgdGhpcyBieSBleGl0aW5nIGZyb20geW91ciBwcm9jZXNzLiAgTm90ZQorICogdGhhdCBvbmNlIHRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZCwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8KKyAqIHRoZSBkcml2ZXIgZnJvbSBhbnkgdGhyZWFkIHdpbGwgcmV0dXJuIHRoaXMgc2FtZSBjb2RlLgorICovCisKK2VudW0gdHJhbnNhY3Rpb25fZmxhZ3MgeworCVRGX09ORV9XQVkJPSAweDAxLAkvKiB0aGlzIGlzIGEgb25lLXdheSBjYWxsOiBhc3luYywgbm8gcmV0dXJuICovCisJVEZfUk9PVF9PQkpFQ1QJPSAweDA0LAkvKiBjb250ZW50cyBhcmUgdGhlIGNvbXBvbmVudCdzIHJvb3Qgb2JqZWN0ICovCisJVEZfU1RBVFVTX0NPREUJPSAweDA4LAkvKiBjb250ZW50cyBhcmUgYSAzMi1iaXQgc3RhdHVzIGNvZGUgKi8KKwlURl9BQ0NFUFRfRkRTCT0gMHgxMCwJLyogYWxsb3cgcmVwbGllcyB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgKi8KK307CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB7CisJLyogVGhlIGZpcnN0IHR3byBhcmUgb25seSB1c2VkIGZvciBiY1RSQU5TQUNUSU9OIGFuZCBiclRSQU5TQUNUSU9OLAorCSAqIGlkZW50aWZ5aW5nIHRoZSB0YXJnZXQgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl1bmlvbiB7CisJCS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIGNvbW1hbmQgdHJhbnNhY3Rpb24gKi8KKwkJX191MzIJaGFuZGxlOworCQkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiByZXR1cm4gdHJhbnNhY3Rpb24gKi8KKwkJYmluZGVyX3VpbnRwdHJfdCBwdHI7CisJfSB0YXJnZXQ7CisJYmluZGVyX3VpbnRwdHJfdAljb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCisJX191MzIJCWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCisKKwkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KKwlfX3UzMgkgICAgICAgIGZsYWdzOworCXBpZF90CQlzZW5kZXJfcGlkOworCXVpZF90CQlzZW5kZXJfZXVpZDsKKwliaW5kZXJfc2l6ZV90CWRhdGFfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgKi8KKwliaW5kZXJfc2l6ZV90CW9mZnNldHNfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIG9mZnNldHMgKi8KKworCS8qIElmIHRoaXMgdHJhbnNhY3Rpb24gaXMgaW5saW5lLCB0aGUgZGF0YSBpbW1lZGlhdGVseQorCSAqIGZvbGxvd3MgaGVyZTsgb3RoZXJ3aXNlLCBpdCBlbmRzIHdpdGggYSBwb2ludGVyIHRvCisJICogdGhlIGRhdGEgYnVmZmVyLgorCSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIHRyYW5zYWN0aW9uIGRhdGEgKi8KKwkJCWJpbmRlcl91aW50cHRyX3QJYnVmZmVyOworCQkJLyogb2Zmc2V0cyBmcm9tIGJ1ZmZlciB0byBmbGF0X2JpbmRlcl9vYmplY3Qgc3RydWN0cyAqLworCQkJYmluZGVyX3VpbnRwdHJfdAlvZmZzZXRzOworCQl9IHB0cjsKKwkJX191OAlidWZbOF07CisJfSBkYXRhOworfTsKKworc3RydWN0IGJpbmRlcl9wdHJfY29va2llIHsKKwliaW5kZXJfdWludHB0cl90IHB0cjsKKwliaW5kZXJfdWludHB0cl90IGNvb2tpZTsKK307CisKK3N0cnVjdCBiaW5kZXJfaGFuZGxlX2Nvb2tpZSB7CisJX191MzIgaGFuZGxlOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJpbmRlcl9wcmlfZGVzYyB7CisJX19zMzIgcHJpb3JpdHk7CisJX191MzIgZGVzYzsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgeworCV9fczMyIHByaW9yaXR5OworCWJpbmRlcl91aW50cHRyX3QgcHRyOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOworfTsKKworZW51bSBiaW5kZXJfZHJpdmVyX3JldHVybl9wcm90b2NvbCB7CisJQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgX19zMzIpLAorCS8qCisJICogaW50OiBlcnJvciBjb2RlCisJICovCisKKwlCUl9PSyA9IF9JTygncicsIDEpLAorCS8qIE5vIHBhcmFtZXRlcnMhICovCisKKwlCUl9UUkFOU0FDVElPTiA9IF9JT1IoJ3InLCAyLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCUJSX1JFUExZID0gX0lPUigncicsIDMsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJLyoKKwkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHJlY2VpdmVkIGNvbW1hbmQuCisJICovCisKKwlCUl9BQ1FVSVJFX1JFU1VMVCA9IF9JT1IoJ3InLCA0LCBfX3MzMiksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogMCBpZiB0aGUgbGFzdCBiY0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB0aGUgcmVtb3RlIG9iamVjdCBoYXMgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZS4KKwkgKi8KKworCUJSX0RFQURfUkVQTFkgPSBfSU8oJ3InLCA1KSwKKwkvKgorCSAqIFRoZSB0YXJnZXQgb2YgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKKwkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBpcyBubyBsb25nZXIgd2l0aCB1cy4gIE5vIHBhcmFtZXRlcnMuCisJICovCisKKwlCUl9UUkFOU0FDVElPTl9DT01QTEVURSA9IF9JTygncicsIDYpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4uLiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHJlcXVlc3RlZAorCSAqIChpbmNsdWRpbmcgcmVwbGllcykuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIHNlbnQgZXZlbiBmb3IKKwkgKiBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLgorCSAqLworCisJQlJfSU5DUkVGUyA9IF9JT1IoJ3InLCA3LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX0FDUVVJUkUgPSBfSU9SKCdyJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9SRUxFQVNFID0gX0lPUigncicsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfREVDUkVGUyA9IF9JT1IoJ3InLCAxMCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjoJcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJSX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1IoJ3InLCAxMSwgc3RydWN0IGJpbmRlcl9wcmlfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDoJcHJpb3JpdHkKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCUl9OT09QID0gX0lPKCdyJywgMTIpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4gIERvIG5vdGhpbmcgYW5kIGV4YW1pbmUgdGhlIG5leHQgY29tbWFuZC4gIEl0IGV4aXN0cworCSAqIHByaW1hcmlseSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIGl0IHdpdGggYSBCUl9TUEFXTl9MT09QRVIgY29tbWFuZC4KKwkgKi8KKworCUJSX1NQQVdOX0xPT1BFUiA9IF9JTygncicsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuICBUaGUgZHJpdmVyIGhhcyBkZXRlcm1pbmVkIHRoYXQgYSBwcm9jZXNzIGhhcyBubworCSAqIHRocmVhZHMgd2FpdGluZyB0byBzZXJ2aWNlIGluY29taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCisJICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAorCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KKwkgKi8KKworCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCisJICovCisKKwlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgYmluZGVyX3VpbnRwdHJfdCksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCUJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FID0gX0lPUigncicsIDE2LCBiaW5kZXJfdWludHB0cl90KSwKKwkvKgorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCUl9GQUlMRURfUkVQTFkgPSBfSU8oJ3InLCAxNyksCisJLyoKKwkgKiBUaGUgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKKwkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBmYWlsZWQgKGUuZy4gb3V0IG9mIG1lbW9yeSkuICBObyBwYXJhbWV0ZXJzLgorCSAqLworfTsKKworZW51bSBiaW5kZXJfZHJpdmVyX2NvbW1hbmRfcHJvdG9jb2wgeworCUJDX1RSQU5TQUNUSU9OID0gX0lPVygnYycsIDAsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJQkNfUkVQTFkgPSBfSU9XKCdjJywgMSwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwkvKgorCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgc2VudCBjb21tYW5kLgorCSAqLworCisJQkNfQUNRVUlSRV9SRVNVTFQgPSBfSU9XKCdjJywgMiwgX19zMzIpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6ICAwIGlmIHRoZSBsYXN0IEJSX0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB5b3UgaGF2ZSBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QuCisJICovCisKKwlCQ19GUkVFX0JVRkZFUiA9IF9JT1coJ2MnLCAzLCBiaW5kZXJfdWludHB0cl90KSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIHRyYW5zYWN0aW9uIGRhdGEgcmVjZWl2ZWQgb24gYSByZWFkCisJICovCisKKwlCQ19JTkNSRUZTID0gX0lPVygnYycsIDQsIF9fdTMyKSwKKwlCQ19BQ1FVSVJFID0gX0lPVygnYycsIDUsIF9fdTMyKSwKKwlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIF9fdTMyKSwKKwlCQ19ERUNSRUZTID0gX0lPVygnYycsIDcsIF9fdTMyKSwKKwkvKgorCSAqIGludDoJZGVzY3JpcHRvcgorCSAqLworCisJQkNfSU5DUkVGU19ET05FID0gX0lPVygnYycsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQkNfQUNRVUlSRV9ET05FID0gX0lPVygnYycsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCQ19BVFRFTVBUX0FDUVVJUkUgPSBfSU9XKCdjJywgMTAsIHN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6IHByaW9yaXR5CisJICogaW50OiBkZXNjcmlwdG9yCisJICovCisKKwlCQ19SRUdJU1RFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMSksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLgorCSAqIFJlZ2lzdGVyIGEgc3Bhd25lZCBsb29wZXIgdGhyZWFkIHdpdGggdGhlIGRldmljZS4KKwkgKi8KKworCUJDX0VOVEVSX0xPT1BFUiA9IF9JTygnYycsIDEyKSwKKwlCQ19FWElUX0xPT1BFUiA9IF9JTygnYycsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuCisJICogVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSBzZW50IGFzIGFuIGFwcGxpY2F0aW9uLWxldmVsIHRocmVhZAorCSAqIGVudGVycyBhbmQgZXhpdHMgdGhlIGJpbmRlciBsb29wLCByZXNwZWN0aXZlbHkuICBUaGV5IGFyZQorCSAqIHVzZWQgc28gdGhlIGJpbmRlciBjYW4gaGF2ZSBhbiBhY2N1cmF0ZSBjb3VudCBvZiB0aGUgbnVtYmVyCisJICogb2YgbG9vcGluZyB0aHJlYWRzIGl0IGhhcyBhdmFpbGFibGUuCisJICovCisKKwlCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNCwKKwkJCQkJCXN0cnVjdCBiaW5kZXJfaGFuZGxlX2Nvb2tpZSksCisJLyoKKwkgKiBpbnQ6IGhhbmRsZQorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTUsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2hhbmRsZV9jb29raWUpLAorCS8qCisJICogaW50OiBoYW5kbGUKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQkNfREVBRF9CSU5ERVJfRE9ORSA9IF9JT1coJ2MnLCAxNiwgYmluZGVyX3VpbnRwdHJfdCksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworfTsKKworI2VuZGlmIC8qIF9VQVBJX0xJTlVYX0JJTkRFUl9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3dfc3luYy5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zd19zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ZDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3dfc3luYy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9TV19TWU5DX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfU1dfU1lOQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSB7CisJX191MzIJdmFsdWU7CisJY2hhcgluYW1lWzMyXTsKKwlfX3MzMglmZW5jZTsgLyogZmQgb2YgbmV3IGZlbmNlICovCit9OworCisjZGVmaW5lIFNXX1NZTkNfSU9DX01BR0lDCSdXJworCisjZGVmaW5lIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRQlfSU9XUihTV19TWU5DX0lPQ19NQUdJQywgMCxcCisJCXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhKQorI2RlZmluZSBTV19TWU5DX0lPQ19JTkMJCQlfSU9XKFNXX1NZTkNfSU9DX01BR0lDLCAxLCBfX3UzMikKKworI2VuZGlmIC8qIF9VQVBJX0xJTlVYX1NXX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zeW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY0Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zeW5jLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX1NZTkNfSAorI2RlZmluZSBfVUFQSV9MSU5VWF9TWU5DX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIC0gZGF0YSBwYXNzZWQgdG8gbWVyZ2UgaW9jdGwKKyAqIEBmZDI6CWZpbGUgZGVzY3JpcHRvciBvZiBzZWNvbmQgZmVuY2UKKyAqIEBuYW1lOgluYW1lIG9mIG5ldyBmZW5jZQorICogQGZlbmNlOglyZXR1cm5zIHRoZSBmZCBvZiB0aGUgbmV3IGZlbmNlIHRvIHVzZXJzcGFjZQorICovCitzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIHsKKwlfX3MzMglmZDI7IC8qIGZkIG9mIHNlY29uZCBmZW5jZSAqLworCWNoYXIJbmFtZVszMl07IC8qIG5hbWUgb2YgbmV3IGZlbmNlICovCisJX19zMzIJZmVuY2U7IC8qIGZkIG9uIG5ld2x5IGNyZWF0ZWQgZmVuY2UgKi8KK307CisKKy8qKgorICogc3RydWN0IHN5bmNfcHRfaW5mbyAtIGRldGFpbGVkIHN5bmNfcHQgaW5mb3JtYXRpb24KKyAqIEBsZW46CQlsZW5ndGggb2Ygc3luY19wdF9pbmZvIGluY2x1ZGluZyBhbnkgZHJpdmVyX2RhdGEKKyAqIEBvYmpfbmFtZToJCW5hbWUgb2YgcGFyZW50IHN5bmNfdGltZWxpbmUKKyAqIEBkcml2ZXJfbmFtZToJbmFtZSBvZiBkcml2ZXIgaW1wbGVtZW50aW5nIHRoZSBwYXJlbnQKKyAqIEBzdGF0dXM6CQlzdGF0dXMgb2YgdGhlIHN5bmNfcHQgMDphY3RpdmUgMTpzaWduYWxlZCA8MDplcnJvcgorICogQHRpbWVzdGFtcF9uczoJdGltZXN0YW1wIG9mIHN0YXR1cyBjaGFuZ2UgaW4gbmFub3NlY29uZHMKKyAqIEBkcml2ZXJfZGF0YToJYW55IGRyaXZlciBkZXBlbmRlbnQgZGF0YQorICovCitzdHJ1Y3Qgc3luY19wdF9pbmZvIHsKKwlfX3UzMglsZW47CisJY2hhcglvYmpfbmFtZVszMl07CisJY2hhcglkcml2ZXJfbmFtZVszMl07CisJX19zMzIJc3RhdHVzOworCV9fdTY0CXRpbWVzdGFtcF9uczsKKworCV9fdTgJZHJpdmVyX2RhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSAtIGRhdGEgcmV0dXJuZWQgZnJvbSBmZW5jZSBpbmZvIGlvY3RsCisgKiBAbGVuOglpb2N0bCBjYWxsZXIgd3JpdGVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXRzIHBhc3NpbmcgaW4uCisgKgkJaW9jdGwgcmV0dXJucyBsZW5ndGggb2Ygc3luY19mZW5jZV9kYXRhIHJldHVybmVkIHRvIHVzZXJzcGFjZQorICoJCWluY2x1ZGluZyBwdF9pbmZvLgorICogQG5hbWU6CW5hbWUgb2YgZmVuY2UKKyAqIEBzdGF0dXM6CXN0YXR1cyBvZiBmZW5jZS4gMTogc2lnbmFsZWQgMDphY3RpdmUgPDA6ZXJyb3IKKyAqIEBwdF9pbmZvOglhIHN5bmNfcHRfaW5mbyBzdHJ1Y3QgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlCisgKi8KK3N0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSB7CisJX191MzIJbGVuOworCWNoYXIJbmFtZVszMl07CisJX19zMzIJc3RhdHVzOworCisJX191OAlwdF9pbmZvWzBdOworfTsKKworI2RlZmluZSBTWU5DX0lPQ19NQUdJQwkJJz4nCisKKy8qKgorICogRE9DOiBTWU5DX0lPQ19XQUlUIC0gd2FpdCBmb3IgYSBmZW5jZSB0byBzaWduYWwKKyAqCisgKiBwYXNzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAgV2FpdHMgaW5kZWZpbml0ZWx5IHRpbWVvdXQgPCAwLgorICovCisjZGVmaW5lIFNZTkNfSU9DX1dBSVQJCV9JT1coU1lOQ19JT0NfTUFHSUMsIDAsIF9fczMyKQorCisvKioKKyAqIERPQzogU1lOQ19JT0NfTUVSR0UgLSBtZXJnZSB0d28gZmVuY2VzCisgKgorICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhLiAgQ3JlYXRlcyBhIG5ldyBmZW5jZSBjb250YWluaW5nIGNvcGllcyBvZgorICogdGhlIHN5bmNfcHRzIGluIGJvdGggdGhlIGNhbGxpbmcgZmQgYW5kIHN5bmNfbWVyZ2VfZGF0YS5mZDIuICBSZXR1cm5zIHRoZQorICogbmV3IGZlbmNlJ3MgZmQgaW4gc3luY19tZXJnZV9kYXRhLmZlbmNlCisgKi8KKyNkZWZpbmUgU1lOQ19JT0NfTUVSR0UJCV9JT1dSKFNZTkNfSU9DX01BR0lDLCAxLCBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhKQorCisvKioKKyAqIERPQzogU1lOQ19JT0NfRkVOQ0VfSU5GTyAtIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBhIGZlbmNlCisgKgorICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgd2l0aCBleHRyYSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHB0X2luZm8uCisgKiBDYWxsZXIgc2hvdWxkIHdyaXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW50byBsZW4uICBPbiByZXR1cm4sIGxlbiBpcworICogdXBkYXRlZCB0byByZWZsZWN0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzeW5jX2ZlbmNlX2luZm9fZGF0YSBpbmNsdWRpbmcKKyAqIHB0X2luZm8uCisgKgorICogcHRfaW5mbyBpcyBhIGJ1ZmZlciBjb250YWluaW5nIHN5bmNfcHRfaW5mb3MgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlLgorICogVG8gaXRlcmF0ZSBvdmVyIHRoZSBzeW5jX3B0X2luZm9zLCB1c2UgdGhlIHN5bmNfcHRfaW5mby5sZW4gZmllbGQuCisgKi8KKyNkZWZpbmUgU1lOQ19JT0NfRkVOQ0VfSU5GTwlfSU9XUihTWU5DX0lPQ19NQUdJQywgMixcCisJc3RydWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhKQorCisjZW5kaWYgLyogX1VBUElfTElOVVhfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCmluZGV4IGYwZDZmMGMuLjFiMmQ5ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCkBAIC0zNyw4ICszNywxMCBAQAogCiB1bmlvbiB1X2lwX2FkZHJlc3MgewogCXN0cnVjdCB7Ci0JCVVMT05HIHVsSXB2NEFkZHJbTUFYX0lQX1JBTkdFX0xFTkdUSF07IC8qIFNvdXJjZSBJcCBBZGRyZXNzIFJhbmdlICovCi0JCVVMT05HIHVsSXB2NE1hc2tbTUFYX0lQX1JBTkdFX0xFTkdUSF07IC8qIFNvdXJjZSBJcCBNYXNrIEFkZHJlc3MgUmFuZ2UgKi8KKwkJLyogU291cmNlIElwIEFkZHJlc3MgUmFuZ2UgKi8KKwkJVUxPTkcgdWxJcHY0QWRkcltNQVhfSVBfUkFOR0VfTEVOR1RIXTsKKwkJIC8qIFNvdXJjZSBJcCBNYXNrIEFkZHJlc3MgUmFuZ2UgKi8KKwkJVUxPTkcgdWxJcHY0TWFza1tNQVhfSVBfUkFOR0VfTEVOR1RIXTsKIAl9OwogCXN0cnVjdCB7CiAJCVVMT05HIHVsSXB2NkFkZHJbTUFYX0lQX1JBTkdFX0xFTkdUSCAqIDRdOyAvKiBTb3VyY2UgSXAgQWRkcmVzcyBSYW5nZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYwppbmRleCBmMWI2ZGUwLi5hZTc0OTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYwpAQCAtMTUwLDE1ICsxNTAsMjE0NiBAQAogCXJldHVybiBQa3RMZW47CiB9CiAKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfcmVnX3JlYWRfcHJpdmF0ZSh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX3JkbV9idWZmZXIgc1JkbUJ1ZmZlciA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlQQ0hBUiB0ZW1wX2J1ZmY7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVVJTlQgQnVmZmxlbjsKKwl1MTYgdGVtcF92YWx1ZTsKKwlpbnQgYnl0ZXM7CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBVU0hSVF9NQVggfHwKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQnVmZmxlbiA9IElvQnVmZmVyLk91dHB1dExlbmd0aDsKKwl0ZW1wX3ZhbHVlID0gNCAtIChCdWZmbGVuICUgNCk7CisJQnVmZmxlbiArPSB0ZW1wX3ZhbHVlICUgNDsKKworCXRlbXBfYnVmZiA9IGttYWxsb2MoQnVmZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZW1wX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJYnl0ZXMgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKKwkJCShQVUlOVCl0ZW1wX2J1ZmYsIEJ1ZmZsZW4pOworCWlmIChieXRlcyA+IDApIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIGJ5dGVzKSkgeworCQkJa2ZyZWUodGVtcF9idWZmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gYnl0ZXM7CisJfQorCisJa2ZyZWUodGVtcF9idWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3JlZ193cml0ZV9wcml2YXRlKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fd3JtX2J1ZmZlciBzV3JtQnVmZmVyID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVJTlQgdWlUZW1wVmFyID0gMDsKKwlJTlQgU3RhdHVzOworCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKKwlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgorCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJU3RhdHVzID0gd3JtYWx0KEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCisJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLCBzaXplb2YoVUxPTkcpKTsKKworCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsICJXUk0gRG9uZVxuIik7CisJfSBlbHNlIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsICJXUk0gRmFpbGVkXG4iKTsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3JlYWQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9yZG1fYnVmZmVyIHNSZG1CdWZmZXIgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1czsKKwlpbnQgYnl0ZXM7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFJkbXNcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBVU0hSVF9NQVggfHwKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGVtcF9idWZmID0ga21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghdGVtcF9idWZmKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlpZiAoKCgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8CisJCSgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJSRE0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKKwkJCQkoaW50KXNSZG1CdWZmZXIuUmVnaXN0ZXIpOworCisJCWtmcmVlKHRlbXBfYnVmZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVpVGVtcFZhciA9IHNSZG1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CisJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLAorCQkJICAgICAgIChQVUlOVCl0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7CisKKwlpZiAoYnl0ZXMgPiAwKSB7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBieXRlcykpIHsKKwkJCWtmcmVlKHRlbXBfYnVmZik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCX0KKworCWtmcmVlKHRlbXBfYnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3dyaXRlKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBVSU5UIGNtZCkKK3sKKwlzdHJ1Y3QgYmNtX3dybV9idWZmZXIgc1dybUJ1ZmZlciA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1czsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRGV2aWNlIGluIElkbGUgTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKCgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8CisJCSgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKKwkJCQkoaW50KXNXcm1CdWZmZXIuUmVnaXN0ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCisJCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKKwkJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAorCQkJCShQVUlOVClzV3JtQnVmZmVyLkRhdGEsCisJCQkJc1dybUJ1ZmZlci5MZW5ndGgpOworCisJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwgIldSTSBEb25lXG4iKTsKKwl9IGVsc2UgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwgIldSTSBGYWlsZWRcbiIpOworCQlTdGF0dXMgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dwaW9fc2V0X3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9ncGlvX2luZm8gZ3Bpb19pbmZvID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKKwlVSU5UIHZhbHVlID0gMDsKKwlVSU5UIHVpQml0ID0gMDsKKwlVSU5UIHVpT3BlcmF0aW9uID0gMDsKKwlJTlQgU3RhdHVzOworCWludCBieXRlczsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7CisJdWlPcGVyYXRpb24gPSBncGlvX2luZm8udWlHcGlvVmFsdWU7CisJdmFsdWUgPSAoMTw8dWlCaXQpOworCisJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwgdmFsdWUpID09IGZhbHNlKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTEVEICEhISIsCisJCQkJdmFsdWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXQgLSBzZXR0aW5nIDEgKi8KKwlpZiAodWlPcGVyYXRpb24pIHsKKwkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCQlCQ01fR1BJT19PVVRQVVRfU0VUX1JFRywKKwkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOworCisJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIlNldCB0aGUgR1BJTyBiaXRcbiIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkiRmFpbGVkIHRvIHNldCB0aGUgJWR0aCBHUElPXG4iLAorCQkJCQl1aUJpdCk7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCQlCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRywKKwkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOworCisJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIlNldCB0aGUgR1BJTyBiaXRcbiIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkiRmFpbGVkIHRvIGNsZWFyIHRoZSAlZHRoIEdQSU9cbiIsCisJCQkJCXVpQml0KTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwl9CisKKwlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwKKwkJCSAgICAgICAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOworCWlmIChieXRlcyA8IDApIHsKKwkJU3RhdHVzID0gYnl0ZXM7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiR1BJT19NT0RFX1JFR0lTVEVSIHJlYWQgZmFpbGVkIik7CisJCXJldHVybiBTdGF0dXM7CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJLyogU2V0IHRoZSBncGlvIG1vZGUgcmVnaXN0ZXIgdG8gb3V0cHV0ICovCisJKihVSU5UICopdWNSZXNldFZhbHVlIHw9ICgxPDx1aUJpdCk7CisJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgR1BJT19NT0RFX1JFR0lTVEVSLAorCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7CisKKwlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJTZXQgdGhlIEdQSU8gdG8gb3V0cHV0IE1vZGVcbiIpOworCX0gZWxzZSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJGYWlsZWQgdG8gcHV0IEdQSU8gaW4gT3V0cHV0IE1vZGVcbiIpOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfbGVkX3RocmVhZF9zdGF0ZV9jaGFuZ2VfcmVxKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fdXNlcl90aHJlYWRfcmVxIHRocmVhZFJlcSA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJVc2VyIG1hZGUgTEVEIHRocmVhZCBJbkFjdGl2ZSIpOworCisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHRocmVhZFJlcSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogaWYgTEVEIHRocmVhZCBpcyBydW5uaW5nKEFjdGl2ZWx5IG9yIEluYWN0aXZlbHkpCisJICogc2V0IGl0IHN0YXRlIHRvIG1ha2UgaW5hY3RpdmUKKwkgKi8KKwlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcpIHsKKwkJaWYgKHRocmVhZFJlcS5UaHJlYWRTdGF0ZSA9PSBMRURfVEhSRUFEX0FDVElWQVRJT05fUkVRKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJBY3RpdmF0aW5nIHRocmVhZCByZXEiKTsKKwkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTEVEX1RIUkVBRF9BQ1RJVkU7CisJCX0gZWxzZSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJEZUFjdGl2YXRpbmcgVGhyZWFkIHJlcS4uLi4uIik7CisJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExFRF9USFJFQURfSU5BQ1RJVkU7CisJCX0KKworCQkvKiBzaWduYWwgdGhyZWFkLiAqLworCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ3Bpb19zdGF0dXNfcmVxdWVzdCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2dwaW9faW5mbyBncGlvX2luZm8gPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUxPTkcgdWlCaXQgPSAwOworCVVDSEFSIHVjUmVhZFs0XTsKKwlJTlQgU3RhdHVzOworCWludCBieXRlczsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVpQml0ID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKKworCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KKwlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLAorCQkJCShQVUlOVCl1Y1JlYWQsIHNpemVvZihVSU5UKSk7CisKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJSRE0gRmFpbGVkXG4iKTsKKwkJcmV0dXJuIFN0YXR1czsKKwl9IGVsc2UgeworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9ncGlvX211bHRpX3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9ncGlvX211bHRpX2luZm8gZ3Bpb19tdWx0aV9pbmZvW01BWF9JRFhdOworCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICpwZ3Bpb19tdWx0aV9pbmZvID0KKwkJKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICopZ3Bpb19tdWx0aV9pbmZvOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJaW50IGJ5dGVzOworCisJbWVtc2V0KHBncGlvX211bHRpX2luZm8sIDAsIE1BWF9JRFggKiBzaXplb2Yoc3RydWN0IGJjbV9ncGlvX211bHRpX2luZm8pKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfaW5mbykpCisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9IHNpemVvZihncGlvX211bHRpX2luZm8pOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwKKwkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spID09IGZhbHNlKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTlZNIExFRCBiaXQgbWFwPDB4JVg+ISEhIiwKKwkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaywKKwkJCQlBZGFwdGVyLT5ncGlvQml0TWFwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLworCWlmICgocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spICYKKwkJKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9Db21tYW5kKSkgeworCQkvKiBTZXQgMSdzIGluIEdQSU8gT1VUUFVUIFJFR0lTVEVSICovCisJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9ICBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWU7CisKKwkJaWYgKCooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUpCisJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCUJDTV9HUElPX09VVFBVVF9TRVRfUkVHLAorCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVTE9ORykpOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIldSTSB0byBCQ01fR1BJT19PVVRQVVRfU0VUX1JFRyBGYWlsZWQuIik7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisKKwkJLyogQ2xlYXIgdG8gMCdzIGluIEdQSU8gT1VUUFVUIFJFR0lTVEVSICovCisJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9IChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCisJCQkofihwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUpKSk7CisKKwkJaWYgKCooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUpCisJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCUJDTV9HUElPX09VVFBVVF9DTFJfUkVHLCAoUFVJTlQpdWNSZXNldFZhbHVlLAorCQkJCXNpemVvZihVTE9ORykpOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJXUk0gdG8gQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcgRmFpbGVkLiIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCX0KKworCWlmIChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgeworCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLAorCQkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKKworCQlpZiAoYnl0ZXMgPCAwKSB7CisJCQlTdGF0dXMgPSBieXRlczsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJSRE0gdG8gR1BJT19QSU5fU1RBVEVfUkVHSVNURVIgRmFpbGVkLiIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfSBlbHNlIHsKKwkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQl9CisKKwkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlID0gKCooVUlOVCAqKXVjUmVzZXRWYWx1ZSAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayk7CisJfQorCisJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfaW5mbywKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsCisJCQlTdGF0dXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9ncGlvX21vZGVfcmVxdWVzdCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfbW9kZSBncGlvX211bHRpX21vZGVbTUFYX0lEWF07CisJc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKnBncGlvX211bHRpX21vZGUgPQorCQkoc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKilncGlvX211bHRpX21vZGU7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUNIQVIgdWNSZXNldFZhbHVlWzRdOworCUlOVCBTdGF0dXM7CisJaW50IGJ5dGVzOworCisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19tdWx0aV9tb2RlKSkKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID0gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwKKwkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKKworCWlmIChieXRlcyA8IDApIHsKKwkJU3RhdHVzID0gYnl0ZXM7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiUmVhZCBvZiBHUElPX01PREVfUkVHSVNURVIgZmFpbGVkIik7CisJCXJldHVybiBTdGF0dXM7CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJLyogVmFsaWRhdGluZyB0aGUgcmVxdWVzdCAqLworCWlmIChJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIsCisJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLAorCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrLAorCQkJCUFkYXB0ZXItPmdwaW9CaXRNYXApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spIHsKKwkJLyogd3JpdGUgYWxsIE9VVCdzICgxJ3MpICovCisJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgfD0gKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlICYKKwkJCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spOworCisJCS8qIHdyaXRlIGFsbCBJTidzICgwJ3MpICovCisJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgJj0gfigofnBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlKSAmCisJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKKworCQkvKiBDdXJyZW50bHkgaW1wbGVtZW50ZWQgcmV0dXJuIHRoZSBtb2RlcyBvZiBhbGwgR1BJTydzCisJCSAqIGVsc2UgbmVlZHMgdG8gYml0IEFORCB3aXRoICBtYXNrCisJCSAqLworCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTW9kZSA9ICooVUlOVCAqKXVjUmVzZXRWYWx1ZTsKKworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsCisJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKKwkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRG9uZSIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRmFpbGVkIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGlmIHVpR1BJT01hc2sgaXMgMCB0aGVuIHJldHVybiBtb2RlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8KKwkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgPSAqKFVJTlQgKil1Y1Jlc2V0VmFsdWU7CisJfQorCisJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfbW9kZSwKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsCisJCQlTdGF0dXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9taXNjX3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUFZPSUQgcHZCdWZmZXIgPSBOVUxMOworCUlOVCBTdGF0dXM7CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9saW5rX3JlcXVlc3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IE1BWF9DTlRMX1BLVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQkgICAgICAgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOworCWlmIChJU19FUlIocHZCdWZmZXIpKQorCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7CisKKwlkb3duKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKKwlTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUsCisJCSFBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlLAorCQkoMSAqIEhaKSk7CisJaWYgKFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCisJCWdvdG8gY250cmxFbmQ7CisKKwlpZiAoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIlByZXBhcmluZyBJZGxlIE1vZGUgaXMgc3RpbGwgVHJ1ZSAtIEhlbmNlIFJlamVjdGluZyBjb250cm9sIG1lc3NhZ2VcbiIpOworCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJZ290byBjbnRybEVuZDsKKwl9CisJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOworCitjbnRybEVuZDoKKwl1cCgmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CisJa2ZyZWUocHZCdWZmZXIpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkX3N0YXJ0KAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCUlOVCBTdGF0dXM7CisKKwlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIklPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJIlN0YXJ0aW5nIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBQSUQgPTB4JXghISEhXG4iLCBjdXJyZW50LT5waWQpOworCisJaWYgKGRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlBZGFwdGVyLT5iQmluRG93bmxvYWRlZCA9IGZhbHNlOworCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkID0gY3VycmVudC0+cGlkOworCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkID0gZmFsc2U7CisJQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IGZhbHNlOworCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOworCVN0YXR1cyA9IHJlc2V0X2NhcmRfcHJvYyhBZGFwdGVyKTsKKwlpZiAoU3RhdHVzKSB7CisJCXByX2VycihQRlggIiVzOiByZXNldF9jYXJkX3Byb2MgRmFpbGVkIVxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiBTdGF0dXM7CisJfQorCW1kZWxheSgxMCk7CisKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9maXJtd2FyZV9pbmZvICpwc0Z3SW5mbyA9IE5VTEw7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1czsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCSJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKKworCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJJbnZhbGlkIHdheSB0byBkb3dubG9hZCBidWZmZXIuIFVzZSBTdGFydCBhbmQgdGhlbiBjYWxsIHRoaXMhISFcbiIpOworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKSB7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJMZW5ndGggZm9yIEZXIERMRCBpcyA6ICVseFxuIiwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBiY21fZmlybXdhcmVfaW5mbykpIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwc0Z3SW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc0Z3SW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcHNGd0luZm8pIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIocHNGd0luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlrZnJlZShwc0Z3SW5mbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICghcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzIHx8CisJCShwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGggPT0gMCkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJTb21ldGhpbmcgZWxzZSBpcyB3cm9uZyAlbHVcbiIsCisJCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoKTsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlrZnJlZShwc0Z3SW5mbyk7CisJCVN0YXR1cyA9IC1FSU5WQUw7CisJCXJldHVybiBTdGF0dXM7CisJfQorCisJU3RhdHVzID0gYmNtX2lvY3RsX2Z3X2Rvd25sb2FkKEFkYXB0ZXIsIHBzRndJbmZvKTsKKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MgPT0gQ09ORklHX0JFR0lOX0FERFIpCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJJT0NUTDogQ29uZmlndXJhdGlvbiBGaWxlIFVwbG9hZCBGYWlsZWRcbiIpOworCQllbHNlCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWQgRmFpbGVkXG4iKTsKKworCQkvKiB1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7ICovCisKKwkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYKKwkJCUJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKKwkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0lOSVQ7CisJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IGZhbHNlOworCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKKwkJfQorCX0KKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZGVkXG4iKTsKKwlrZnJlZShwc0Z3SW5mbyk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWRfc3RvcCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlJTlQgU3RhdHVzOworCWludCB0aW1lb3V0ID0gMDsKKworCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkZXIGRvd25sb2FkIGJsb2NrZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkID0gVFJVRTsKKwlBZGFwdGVyLT5iQ2ZnRG93bmxvYWRlZCA9IFRSVUU7CisJYXRvbWljX3NldCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MsIDApOworCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPSAwOworCUFkYXB0ZXItPmRvd25sb2FkRERSID0gMDsKKworCS8qIHNldHRpbmcgdGhlIE1pcHMgdG8gUnVuICovCisJU3RhdHVzID0gcnVuX2NhcmRfcHJvYyhBZGFwdGVyKTsKKworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGaXJtIERvd25sb2FkIEZhaWxlZFxuIik7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gU3RhdHVzOworCX0gZWxzZSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLCAiRmlybSBEb3dubG9hZCBPdmVyLi4uXG4iKTsKKwl9CisKKwltZGVsYXkoMTApOworCisJLyogV2FpdCBmb3IgTWFpbEJveCBJbnRlcnJ1cHQgKi8KKwlpZiAoU3RhcnRJbnRlcnJ1cHRVcmIoKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKilBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlVuYWJsZSB0byBzZW5kIGludGVycnVwdC4uLlxuIik7CisKKwl0aW1lb3V0ID0gNSpIWjsKKwlBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBmYWxzZTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAorCQkJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLCB0aW1lb3V0KTsKKwlBZGFwdGVyLT5md19kb3dubG9hZF9wcm9jZXNzX3BpZCA9IElOVkFMSURfUElEOworCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBUUlVFOworCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLCAwKTsKKwlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzID0gMDsKKwlBZGFwdGVyLT5QcmV2TnVtUmVjdkRlc2NzID0gMDsKKwlhdG9taWNfc2V0KCZBZGFwdGVyLT5jbnRybHBrdENudCwgMCk7CisJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMDsKKwlBZGFwdGVyLT5MaW5rU3RhdHVzID0gMDsKKworCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmCisJCUJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKKwkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBGV19ET1dOTE9BRF9ET05FOworCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOworCX0KKworCWlmICghdGltZW91dCkKKwkJU3RhdHVzID0gLUVOT0RFVjsKKworCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9jaGlwX3Jlc2V0KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCUlOVCBTdGF0dXM7CisJSU5UIE5WTUFjY2VzczsKKworCU5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJaWYgKE5WTUFjY2VzcykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIiBJT0NUTF9CQ01fQ0hJUF9SRVNFVCBub3QgYWxsb3dlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWRvd24oJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7CisJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOworCWZsdXNoQWxsQXBwUSgpOworCXVwKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOworCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwlSZXNldENvdW50ZXJzKEFkYXB0ZXIpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfcW9zX3RocmVzaG9sZChVTE9ORyBhcmcsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJVVNIT1JUIHVpTG9vcEluZGV4OworCisJZm9yICh1aUxvb3BJbmRleCA9IDA7IHVpTG9vcEluZGV4IDwgTk9fT0ZfUVVFVUVTOyB1aUxvb3BJbmRleCsrKSB7CisJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaHJlc2hvbGQsCisJCQkJKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfc3dpdGNoX3RyYW5zZmVyX21vZGUodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJVUlOVCB1aURhdGEgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1aURhdGEsIGFyZ3AsIHNpemVvZihVSU5UKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHVpRGF0YSkgeworCQkvKiBBbGxvdyBBbGwgUGFja2V0cyAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOiBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFXG4iKTsKKwkJCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREU7CisJfSBlbHNlIHsKKwkJLyogQWxsb3cgSVAgb25seSBQYWNrZXRzICovCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IElQX1BBQ0tFVF9PTkxZX01PREVcbiIpOworCQlBZGFwdGVyLT5UcmFuc2Zlck1vZGUgPSBJUF9QQUNLRVRfT05MWV9NT0RFOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2RyaXZlcl92ZXJzaW9uKHZvaWQgX191c2VyICphcmdwKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCXVsb25nIGxlbjsKKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlbiA9IG1pbl90KHVsb25nLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHN0cmxlbihEUlZfVkVSU0lPTikgKyAxKTsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBEUlZfVkVSU0lPTiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2N1cnJlbnRfc3RhdHVzKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fbGlua19zdGF0ZSBsaW5rX3N0YXRlOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJjb3B5X2Zyb21fdXNlciBmYWlsZWQuLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKGxpbmtfc3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbGlua19zdGF0ZSwgMCwgc2l6ZW9mKGxpbmtfc3RhdGUpKTsKKwlsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IEFkYXB0ZXItPklkbGVNb2RlOworCWxpbmtfc3RhdGUuYlNodXRkb3duTW9kZSA9IEFkYXB0ZXItPmJTaHV0U3RhdHVzOworCWxpbmtfc3RhdGUudWNMaW5rU3RhdHVzID0gQWRhcHRlci0+TGlua1N0YXR1czsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmbGlua19zdGF0ZSwgbWluX3Qoc2l6ZV90LAorCQlzaXplb2YobGlua19zdGF0ZSksIElvQnVmZmVyLk91dHB1dExlbmd0aCkpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weV90b191c2VyIEZhaWxlZC4uXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3NldF9tYWNfdHJhY2luZyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHRyYWNpbmdfZmxhZzsKKworCS8qIGNvcHkgaW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdHJhY2luZ19mbGFnLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVJTlQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodHJhY2luZ19mbGFnKQorCQlBZGFwdGVyLT5wVGFyYW5ncy0+TWFjVHJhY2luZ0VuYWJsZWQgPSBUUlVFOworCWVsc2UKKwkJQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gZmFsc2U7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2RzeF9pbmRpY2F0aW9uKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVMT05HIHVsU0ZJZCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAorCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmdWxTRklkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVsU0ZJZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIkdldCBEU1ggRGF0YSBTRiBJRCBpcyA9JWx4XG4iLCB1bFNGSWQpOworCWdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihBZGFwdGVyLCB1bFNGSWQsIElvQnVmZmVyLk91dHB1dEJ1ZmZlcik7CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dldF9ob3N0X21pYnModm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHN0cnVjdCBiY21fdGFyYW5nX2RhdGEgKnBUYXJhbmcpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVBWT0lEIHRlbXBfYnVmZjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZJWE1FOiBIT1NUX1NUQVRTIGFyZSB0b28gYmlnIGZvciBrbWFsbG9jICgxMjIwNDgpISAqLworCXRlbXBfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZW1wX2J1ZmYpCisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKworCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLCB0ZW1wX2J1ZmYpOworCUdldERyb3BwZWRBcHBDbnRybFBrdE1pYnModGVtcF9idWZmLCBwVGFyYW5nKTsKKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX0ZBSUxVUkUpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpKSB7CisJCQlrZnJlZSh0ZW1wX2J1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlrZnJlZSh0ZW1wX2J1ZmYpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfYnVsa193cm0odm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIFVJTlQgY21kKQoreworCXN0cnVjdCBiY21fYnVsa193cm1fYnVmZmVyICpwQnVsa0J1ZmZlcjsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVBDSEFSIHB2QnVmZmVyID0gTlVMTDsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRGV2aWNlIGluIElkbGUvU2h1dGRvd24gTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA8IHNpemVvZihVTE9ORykgKiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQkgICAgICAgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOworCWlmIChJU19FUlIocHZCdWZmZXIpKQorCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7CisKKwlwQnVsa0J1ZmZlciA9IChzdHJ1Y3QgYmNtX2J1bGtfd3JtX2J1ZmZlciAqKXB2QnVmZmVyOworCisJaWYgKCgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCB8fAorCQkoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MykpIHsKKwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCisJCQkoaW50KXBCdWxrQnVmZmVyLT5SZWdpc3Rlcik7CisJCWtmcmVlKHB2QnVmZmVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWlUZW1wVmFyID0gcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpJlZTR19NT0RFKSAmJgorCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKKwkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKSB7CisKKwkJa2ZyZWUocHZCdWZmZXIpOworCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHBCdWxrQnVmZmVyLT5Td2FwRW5kaWFuID09IGZhbHNlKQorCQlTdGF0dXMgPSB3cm1XaXRoTG9jayhBZGFwdGVyLCAoVUlOVClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIsCisJCQkoUENIQVIpcEJ1bGtCdWZmZXItPlZhbHVlcywKKwkJCUlvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKKwllbHNlCisJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXBCdWxrQnVmZmVyLT5SZWdpc3RlciwKKwkJCShQVUlOVClwQnVsa0J1ZmZlci0+VmFsdWVzLAorCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGggLSAyKnNpemVvZihVTE9ORykpOworCisJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBGYWlsZWRcbiIpOworCisJa2ZyZWUocHZCdWZmZXIpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X252bV9zaXplKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9FRVBST00gfHwgQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlOVk1EU0RTaXplLAorCQkJc2l6ZW9mKFVJTlQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9jYWxfaW5pdCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpU2VjdG9yU2l6ZSA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCisJaWYgKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpU2VjdG9yU2l6ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQlzaXplb2YoVUlOVCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCh1aVNlY3RvclNpemUgPCBNSU5fU0VDVE9SX1NJWkUpIHx8CisJCQkodWlTZWN0b3JTaXplID4gTUFYX1NFQ1RPUl9TSVpFKSkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCQkJJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgc2l6ZW9mKFVJTlQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKKwkJCQkJJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgc2l6ZW9mKFVJTlQpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9IGVsc2UgeworCQkJCWlmICgoVFJVRSA9PSBBZGFwdGVyLT5iU2h1dFN0YXR1cykgfHwKKwkJCQkJKFRSVUUgPT0gQWRhcHRlci0+SWRsZU1vZGUpKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLAorCQkJCQkJREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCQl9CisKKwkJCQlBZGFwdGVyLT51aVNlY3RvclNpemUgPSB1aVNlY3RvclNpemU7CisJCQkJQmNtVXBkYXRlU2VjdG9yU2l6ZShBZGFwdGVyLAorCQkJCQlBZGFwdGVyLT51aVNlY3RvclNpemUpOworCQkJfQorCQl9CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCX0KKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3NldF9kZWJ1Zyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKyNpZmRlZiBERUJVRworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCXN0cnVjdCBiY21fdXNlcl9kZWJ1Z19zdGF0ZSBzVXNlckRlYnVnU3RhdGU7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJbiBTRVRfREVCVUcgaW9jdGxcbiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc1VzZXJEZWJ1Z1N0YXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fdXNlcl9kZWJ1Z19zdGF0ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIklPQ1RMX0JDTV9TRVRfREVCVUc6IE9uT2ZmPSVkIFR5cGUgPSAweCV4ICIsCisJCQlzVXNlckRlYnVnU3RhdGUuT25PZmYsIHNVc2VyRGVidWdTdGF0ZS5UeXBlKTsKKwkvKiBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSA8PD0gMTsgKi8KKwlzVXNlckRlYnVnU3RhdGUuU3VidHlwZSA9IDEgPDwgc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7CisJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCSJhY3R1YWwgU3VidHlwZT0weCV4XG4iLCBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSk7CisKKwkvKiBVcGRhdGUgbmV3ICdEZWJ1Z1N0YXRlJyBpbiB0aGUgQWRhcHRlciAqLworCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlIHw9IHNVc2VyRGVidWdTdGF0ZS5UeXBlOworCS8qIFN1YnR5cGU6IEEgYml0bWFwIG9mIDMyIGJpdHMgZm9yIFN1YnR5cGUgcGVyIFR5cGUuCisJICogVmFsaWQgaW5kZXhlcyBpbiAnc3VidHlwZScgYXJyYXk6IDEsMiw0LDgKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHZhbGlkIFR5cGUgdmFsdWVzLiBIZW5jZSB3ZSBjYW4gdXNlIHRoZSAnVHlwZScgZmllbGQKKwkgKiBhcyB0aGUgaW5kZXggdmFsdWUsIGlnbm9yaW5nIHRoZSBhcnJheSBlbnRyaWVzIDAsMyw1LDYsNyAhCisJICovCisJaWYgKHNVc2VyRGVidWdTdGF0ZS5Pbk9mZikKKwkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbc1VzZXJEZWJ1Z1N0YXRlLlR5cGVdIHw9CisJCQlzVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKKwllbHNlCisJCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW3NVc2VyRGVidWdTdGF0ZS5UeXBlXSAmPQorCQkJfnNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOworCisJQkNNX1NIT1dfREVCVUdfQklUTUFQKEFkYXB0ZXIpOworI2VuZGlmCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX252bV9ydyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgVUlOVCBjbWQpCit7CisJc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlIHN0TlZNUmVhZFdyaXRlOworCXN0cnVjdCB0aW1ldmFsIHR2MCwgdHYxOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBVQ0hBUiBwUmVhZERhdGEgPSBOVUxMOworCVVMT05HIHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworCW1lbXNldCgmdHYwLCAwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwltZW1zZXQoJnR2MSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisJaWYgKChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpICYmCisJCShBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uID09IDApKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiVGhlIEZsYXNoIENvbnRyb2wgU2VjdGlvbiBpcyBDb3JydXB0ZWQuIEhlbmNlIFJlamVjdGlvbiBvbiBOVk0gUmVhZC9Xcml0ZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJaWYgKChBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDApICYmCisJCQkoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QxKSAmJgorCQkJKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMikpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiTm8gRFNEIGlzIGFjdGl2ZS4uaGVuY2UgTlZNIENvbW1hbmQgaXMgYmxvY2tlZCIpOworCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCQl9CisJfQorCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdE5WTVJlYWRXcml0ZSwKKwkJCQkoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgPworCQkJCUlvQnVmZmVyLk91dHB1dEJ1ZmZlciA6IElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJCXNpemVvZihzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIERlbnkgdGhlIGFjY2VzcyBpZiB0aGUgb2Zmc2V0IGNyb3NzZXMgdGhlIGNhbCBhcmVhIGxpbWl0LgorCSAqLworCWlmIChzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzID4gQWRhcHRlci0+dWlOVk1EU0RTaXplKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlpZiAoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgPgorCQlBZGFwdGVyLT51aU5WTURTRFNpemUgLSBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlwUmVhZERhdGEgPSBtZW1kdXBfdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLAorCQkJCXN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpOworCWlmIChJU19FUlIocFJlYWREYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIocFJlYWREYXRhKTsKKworCWRvX2dldHRpbWVvZmRheSgmdHYwKTsKKwlpZiAoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgeworCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLAorCQkJCURCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCisJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkRGF0YSwKKwkJCXN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0LCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLCBwUmVhZERhdGEsCisJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkgeworCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQlEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZERhdGEpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQlBZGFwdGVyLT5iSGVhZGVyQ2hhbmdlQWxsb3dlZCA9IFRSVUU7CisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJCS8qCisJCQkgKiBOZXcgUmVxdWlyZW1lbnQ6LQorCQkJICogRFNEIHNlY3Rpb24gdXBkYXRpb24gd2lsbCBiZSBhbGxvd2VkIGluIHR3byBjYXNlOi0KKwkJCSAqIDEuICBpZiBEU0Qgc2lnIGlzIHByZXNlbnQgaW4gRFNEIGhlYWRlciBtZWFucyBkb25nbGUKKwkJCSAqIGlzIG9rIGFuZCB1cGRhdGlvbiBpcyBmcnVpdGZ1bGwKKwkJCSAqIDIuICBpZiBwb2ludCAxIGZhaWxlcyB0aGVuIHVzZXIgYnVmZiBzaG91bGQgaGF2ZQorCQkJICogRFNEIHNpZy4gdGhpcyBwb2ludCBlbnN1cmVzIHRoYXQgaWYgZG9uZ2xlIGlzCisJCQkgKiBjb3JydXB0ZWQgdGhlbiB1c2VyIHNwYWNlIHByb2dyYW0gZmlyc3QgbW9kaWZ5CisJCQkgKiB0aGUgRFNEIGhlYWRlciB3aXRoIHZhbGlkIERTRCBzaWcgc28gdGhhdCB0aGlzCisJCQkgKiBhcyB3ZWxsIGFzIGZ1cnRoZXIgd3JpdGUgbWF5IGJlIHdvcnRod2hpbGUuCisJCQkgKgorCQkJICogVGhpcyByZXN0cmljdGlvbiBoYXMgYmVlbiBwdXQgYXNzdW1pbmcgdGhhdAorCQkJICogaWYgRFNEIHNpZyBpcyBjb3JydXB0ZWQsIERTRCBkYXRhIHdvbid0IGJlCisJCQkgKiBjb25zaWRlcmVkIHZhbGlkLgorCQkJICovCisKKwkJCVN0YXR1cyA9IEJjbUZsYXNoMnhDb3JydXB0U2lnKEFkYXB0ZXIsCisJCQkJQWRhcHRlci0+ZUFjdGl2ZURTRCk7CisJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKCgoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSAhPQorCQkJCQlBZGFwdGVyLT51aU5WTURTRFNpemUpIHx8CisJCQkJCShzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzIDwgU0lHTkFUVVJFX1NJWkUpKSB7CisKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7CisJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJcmV0dXJuIFN0YXR1czsKKwkJCQl9CisKKwkJCQl1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gbnRvaGwoKihQVUlOVCkocFJlYWREYXRhICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyAtIFNJR05BVFVSRV9TSVpFKSk7CisJCQkJaWYgKHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgIT0KKwkJCQkJRFNEX0lNQUdFX01BR0lDX05VTUJFUikgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCQkiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOworCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQkJCXJldHVybiBTdGF0dXM7CisJCQkJfQorCQkJfQorCQl9CisKKwkJU3RhdHVzID0gQmVjZWVtTlZNV3JpdGUoQWRhcHRlciwgKFBVSU5UKXBSZWFkRGF0YSwKKwkJCXN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0LCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzLAorCQkJc3ROVk1SZWFkV3JpdGUuYlZlcmlmeSk7CisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpCisJCQlCY21GbGFzaDJ4V3JpdGVTaWcoQWRhcHRlciwgQWRhcHRlci0+ZUFjdGl2ZURTRCk7CisKKwkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBmYWxzZTsKKworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwl9CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2MSk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiIHRpbWV0YWtlbiBieSBXcml0ZS9yZWFkIDolbGQgbXNlY1xuIiwKKwkJKHR2MS50dl9zZWMgLSB0djAudHZfc2VjKSoxMDAwICsgKHR2MS50dl91c2VjIC0gdHYwLnR2X3VzZWMpLzEwMDApOworCisJa2ZyZWUocFJlYWREYXRhKTsKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3JlYWQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSBzRmxhc2gyeFJlYWQgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUFVDSEFSIHBSZWFkQnVmZiA9IE5VTEw7CisJVUlOVCBOT0IgPSAwOworCVVJTlQgQnVmZlNpemUgPSAwOworCVVJTlQgUmVhZEJ5dGVzID0gMDsKKwlVSU5UIFJlYWRPZmZzZXQgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkJeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1JFQUQgQ2FsbGVkIik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogUmVhZGluZyBGTEFTSCAyLnggUkVBRCBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4UmVhZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCXNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfcmVhZHdyaXRlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiLCBzRmxhc2gyeFJlYWQuU2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDoleCIsIHNGbGFzaDJ4UmVhZC5vZmZzZXQpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4Iiwgc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLmJWZXJpZnkgOiV4XG4iLCBzRmxhc2gyeFJlYWQuYlZlcmlmeSk7CisKKwkvKiBUaGlzIHdhcyBpbnRlcm5hbCB0byBkcml2ZXIgZm9yIHJhdyByZWFkLgorCSAqIG5vdyBpdCBoYXMgYmVuIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBhcHAuCisJICovCisJaWYgKHZhbGlkYXRlRmxhc2gyeFJlYWRXcml0ZShBZGFwdGVyLCAmc0ZsYXNoMnhSZWFkKSA9PSBmYWxzZSkKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJTk9CID0gc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXM7CisJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJZWxzZQorCQlCdWZmU2l6ZSA9IE5PQjsKKworCVJlYWRPZmZzZXQgPSBzRmxhc2gyeFJlYWQub2Zmc2V0OworCU91dFB1dEJ1ZmYgPSBJb0J1ZmZlci5PdXRwdXRCdWZmZXI7CisJcFJlYWRCdWZmID0gKFBDSEFSKWt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKKworCWlmIChwUmVhZEJ1ZmYgPT0gTlVMTCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQlEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWtmcmVlKHBSZWFkQnVmZik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCXdoaWxlIChOT0IpIHsKKwkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJCVJlYWRCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwkJZWxzZQorCQkJUmVhZEJ5dGVzID0gTk9COworCisJCS8qIFJlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KKwkJU3RhdHVzID0gQmNtRmxhc2gyeEJ1bGtSZWFkKEFkYXB0ZXIsIChQVUlOVClwUmVhZEJ1ZmYsCisJCQlzRmxhc2gyeFJlYWQuU2VjdGlvbiwgUmVhZE9mZnNldCwgUmVhZEJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsCisJCQkJU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJREJHX0xWTF9BTEwsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKKworCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOworCQlpZiAoU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQlEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZEJ1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOworCQlpZiAoTk9CKSB7CisJCQlSZWFkT2Zmc2V0ID0gUmVhZE9mZnNldCArIFJlYWRCeXRlczsKKwkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzOworCQl9CisJfQorCisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWtmcmVlKHBSZWFkQnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9mbGFzaDJ4X3NlY3Rpb25fd3JpdGUodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSBzRmxhc2gyeFdyaXRlID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBVQ0hBUiBwV3JpdGVCdWZmOworCXZvaWQgX191c2VyICpJbnB1dEFkZHI7CisJVUlOVCBOT0IgPSAwOworCVVJTlQgQnVmZlNpemUgPSAwOworCVVJTlQgV3JpdGVPZmZzZXQgPSAwOworCVVJTlQgV3JpdGVCeXRlcyA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpcnN0IG1ha2UgdGhpcyBGYWxzZSBzbyB0aGF0IHdlIGNhbiBlbmFibGUgdGhlIFNlY3RvcgorCSAqIFBlcm1pc3Npb24gQ2hlY2sgaW4gQmVjZWVtRmxhc2hCdWxrV3JpdGUKKwkgKi8KKwlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IGZhbHNlOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURSBDYWxsZWQiKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFJlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFdyaXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDolZCIsIHNGbGFzaDJ4V3JpdGUub2Zmc2V0KTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIsIHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlcyk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQuYlZlcmlmeSA6JXhcbiIsIHNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7CisKKwlpZiAoKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EwKSAmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTEpCisJCSYmIChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMikpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIk9ubHkgVlNBIHdyaXRlIGlzIGFsbG93ZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbGlkYXRlRmxhc2gyeFJlYWRXcml0ZShBZGFwdGVyLCAmc0ZsYXNoMnhXcml0ZSkgPT0gZmFsc2UpCisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKworCUlucHV0QWRkciA9IHNGbGFzaDJ4V3JpdGUucERhdGFCdWZmOworCVdyaXRlT2Zmc2V0ID0gc0ZsYXNoMnhXcml0ZS5vZmZzZXQ7CisJTk9CID0gc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzOworCisJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJZWxzZQorCQlCdWZmU2l6ZSA9IE5PQjsKKworCXBXcml0ZUJ1ZmYgPSBrbWFsbG9jKEJ1ZmZTaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChwV3JpdGVCdWZmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZXh0cmFjdGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBnaXZlbiBvZmZzZXQuICovCisJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwlpZiAoV3JpdGVPZmZzZXQgJSBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemUgLSAoV3JpdGVPZmZzZXQgJSBBZGFwdGVyLT51aVNlY3RvclNpemUpOworCisJaWYgKE5PQiA8IFdyaXRlQnl0ZXMpCisJCVdyaXRlQnl0ZXMgPSBOT0I7CisKKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWtmcmVlKHBXcml0ZUJ1ZmYpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlCY21GbGFzaDJ4Q29ycnVwdFNpZyhBZGFwdGVyLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOworCWRvIHsKKwkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdyaXRlQnVmZiwgSW5wdXRBZGRyLCBXcml0ZUJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ29weSB0byB1c2VyIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJa2ZyZWUocFdyaXRlQnVmZik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFdyaXRlQnVmZiwgV3JpdGVCeXRlcyk7CisKKwkJLyogV3JpdGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueCAqLworCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1dyaXRlKEFkYXB0ZXIsIChQVUlOVClwV3JpdGVCdWZmLAorCQkJc0ZsYXNoMnhXcml0ZS5TZWN0aW9uLCBXcml0ZU9mZnNldCwgV3JpdGVCeXRlcywKKwkJCXNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7CisKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJTk9CID0gTk9CIC0gV3JpdGVCeXRlczsKKwkJaWYgKE5PQikgeworCQkJV3JpdGVPZmZzZXQgPSBXcml0ZU9mZnNldCArIFdyaXRlQnl0ZXM7CisJCQlJbnB1dEFkZHIgPSBJbnB1dEFkZHIgKyBXcml0ZUJ5dGVzOworCQkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOworCQkJZWxzZQorCQkJCVdyaXRlQnl0ZXMgPSBOT0I7CisJCX0KKwl9IHdoaWxlIChOT0IgPiAwKTsKKworCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOworCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwlrZnJlZShwV3JpdGVCdWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2ZsYXNoMnhfc2VjdGlvbl9iaXRtYXAodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCAqcHNGbGFzaDJ4Qml0TWFwOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCSJJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVAgQ2FsbGVkIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwc0ZsYXNoMnhCaXRNYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBzRmxhc2gyeEJpdE1hcCA9PSBOVUxMKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiTWVtb3J5IGlzIG5vdCBhdmFpbGFibGUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVhZGluZyB0aGUgRmxhc2ggU2VjdGlvIEJpdCBtYXAgKi8KKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHBzRmxhc2gyeEJpdE1hcCwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXApKSkgeworCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfc2V0X2FjdGl2ZV9zZWN0aW9uKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCWVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZUZsYXNoMnhTZWN0aW9uVmFsID0gMDsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJT0NUTF9CQ01fU0VUX0FDVElWRV9TRUNUSU9OIENhbGxlZCIpOworCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLAorCQlJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCVN0YXR1cyA9IEJjbVNldEFjdGl2ZVNlY3Rpb24oQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwlpZiAoU3RhdHVzKQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZhaWxlZCB0byBtYWtlIGl0J3MgcHJpb3JpdHkgSGlnaGVzdC4gU3RhdHVzICVkIiwKKwkJCVN0YXR1cyk7CisKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2NvcHlfc2VjdGlvbih2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2ZsYXNoMnhfY29weV9zZWN0aW9uIHNDb3B5U2VjdFN0cnV0ID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIklPQ1RMX0JDTV9DT1BZX1NFQ1RJT04gIENhbGxlZCIpOworCisJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBmYWxzZTsKKwlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jb3B5X3NlY3Rpb24pKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBDb3B5X1NlY3Rpb25fU3RydWN0IGZhaWxlZCB3aXRoIFN0YXR1cyA6JWQiLAorCQkJU3RhdHVzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiU291cmNlIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiRGVzdGluYXRpb24gU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJvZmZzZXQgOiV4Iiwgc0NvcHlTZWN0U3RydXQub2Zmc2V0KTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJOT0IgOiV4Iiwgc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyk7CisKKwlpZiAoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pID09IGZhbHNlKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiU291cmNlIFNlY3Rpb248JXg+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoICIsCisJCQlzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkRlc3RpbmF0aW8gU2VjdGlvbjwleD4gZG9lcyBub3QgZXhpc3QgaW4gRmxhc2ggIiwKKwkJCXNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJTb3VyY2UgYW5kIERlc3RpbmF0aW9uIHNlY3Rpb24gc2hvdWxkIGJlIGRpZmZlcmVudCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IElTT19JTUFHRTEgfHwKKwkJc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBJU09fSU1BR0UyKSB7CisJCWlmIChJc05vbkNETGVzc0RldmljZShBZGFwdGVyKSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRGV2aWNlIGlzIE5vbi1DRExlc3MgaGVuY2Ugd29uJ3QgaGF2ZSBJU08gISEiKTsKKwkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyA9PSAwKSB7CisJCQlTdGF0dXMgPSBCY21Db3B5SVNPKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0KTsKKwkJfSBlbHNlIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIlBhcnRpYWwgQ29weSBvZiBJU08gc2VjdGlvbiBpcyBub3QgQWxsb3dlZC4uIik7CisJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJfQorCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiBTdGF0dXM7CisJfQorCisJU3RhdHVzID0gQmNtQ29weVNlY3Rpb24oQWRhcHRlciwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiwKKwkJCQlzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uLAorCQkJCXNDb3B5U2VjdFN0cnV0Lm9mZnNldCwKKwkJCQlzQ29weVNlY3RTdHJ1dC5udW1PZkJ5dGVzKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9nZXRfZmxhc2hfY3NfaW5mbyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSIgSU9DVExfQkNNX0dFVF9GTEFTSF9DU19JTkZPIENhbGxlZCIpOworCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IGhhdmUgZmxhc2giKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSA9PSBUUlVFKSB7CisJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCQlBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sCisJCQlzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaF9jc19pbmZvKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2hfY3NfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfc2VsZWN0X2RzZCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJVUlOVCBTZWN0T2ZzZXQgPSAwOworCWVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZUZsYXNoMnhTZWN0aW9uVmFsOworCisJZUZsYXNoMnhTZWN0aW9uVmFsID0gTk9fU0VDVElPTl9WQUw7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSU9DVExfQkNNX1NFTEVDVF9EU0QgQ2FsbGVkIik7CisKKwlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJc2l6ZW9mKElOVCkpOworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJSZWFkIFNlY3Rpb24gOiVkIiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwlpZiAoKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QwKSAmJgorCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDEpICYmCisJCShlRmxhc2gyeFNlY3Rpb25WYWwgIT0gRFNEMikpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlBhc3NlZCBzZWN0aW9uPCV4PiBpcyBub3QgRFNEIHNlY3Rpb24iLAorCQkJZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCX0KKworCVNlY3RPZnNldCA9IEJjbUdldFNlY3Rpb25WYWxTdGFydE9mZnNldChBZGFwdGVyLCBlRmxhc2gyeFNlY3Rpb25WYWwpOworCWlmIChTZWN0T2ZzZXQgPT0gSU5WQUxJRF9PRkZTRVQpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJQcm92aWRlZCBTZWN0aW9uIHZhbCA8JWQ+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoIDIueCIsCisJCQllRmxhc2gyeFNlY3Rpb25WYWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IFRSVUU7CisJQWRhcHRlci0+dWxGbGFzaENhbFN0YXJ0ID0gU2VjdE9mc2V0OworCUFkYXB0ZXItPmVBY3RpdmVEU0QgPSBlRmxhc2gyeFNlY3Rpb25WYWw7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfbnZtX3Jhd19yZWFkKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSBzdE5WTVJlYWQ7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJdW5zaWduZWQgaW50IE5PQjsKKwlJTlQgQnVmZlNpemU7CisJSU5UIFJlYWRPZmZzZXQgPSAwOworCVVJTlQgUmVhZEJ5dGVzID0gMDsKKwlQVUNIQVIgcFJlYWRCdWZmOworCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworCWlmIChBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJOVk0gVFlQRSBpcyBub3QgRmxhc2giKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCXNpemVvZihzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlOT0IgPSBzdE5WTVJlYWQudWlOdW1CeXRlczsKKwkvKiBJbiBSYXctUmVhZCBtYXggQnVmZiBzaXplIDogNjRNQiAqLworCisJaWYgKE5PQiA+IERFRkFVTFRfQlVGRl9TSVpFKQorCQlCdWZmU2l6ZSA9IERFRkFVTFRfQlVGRl9TSVpFOworCWVsc2UKKwkJQnVmZlNpemUgPSBOT0I7CisKKwlSZWFkT2Zmc2V0ID0gc3ROVk1SZWFkLnVpT2Zmc2V0OworCU91dFB1dEJ1ZmYgPSBzdE5WTVJlYWQucEJ1ZmZlcjsKKworCXBSZWFkQnVmZiA9IGt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKKwlpZiAocFJlYWRCdWZmID09IE5VTEwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEZsYXNoIDIueCBSZWFkIFN0cnVjdHVyZSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJa2ZyZWUocFJlYWRCdWZmKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gVFJVRTsKKworCXdoaWxlIChOT0IpIHsKKwkJaWYgKE5PQiA+IERFRkFVTFRfQlVGRl9TSVpFKQorCQkJUmVhZEJ5dGVzID0gREVGQVVMVF9CVUZGX1NJWkU7CisJCWVsc2UKKwkJCVJlYWRCeXRlcyA9IE5PQjsKKworCQkvKiBSZWFkaW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCisJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkQnVmZiwKKwkJCVJlYWRPZmZzZXQsIFJlYWRCeXRlcyk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCisJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCURCR19MVkxfQUxMLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7CisKKwkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZEJ1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOworCQlpZiAoTk9CKSB7CisJCQlSZWFkT2Zmc2V0ID0gUmVhZE9mZnNldCArIFJlYWRCeXRlczsKKwkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzOworCQl9CisJfQorCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBmYWxzZTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJa2ZyZWUocFJlYWRCdWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2NudHJsbXNnX21hc2sodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHN0cnVjdCBiY21fdGFyYW5nX2RhdGEgKnBUYXJhbmcpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVVMT05HIFJ4Q250cmxNc2dCaXRNYXNrID0gMDsKKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiY29weSBvZiBJb2N0bCBidWZmZXIgaXMgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSeENudHJsTXNnQml0TWFzaywKKwkJSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJjb3B5IG9mIGNvbnRyb2wgYml0IG1hc2sgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG4gR290IHVzZXIgZGVmaW5lZCBjbnRybCBtc2cgYml0IG1hc2sgOiVseCIsCisJCVJ4Q250cmxNc2dCaXRNYXNrKTsKKwlwVGFyYW5nLT5SeENudHJsTXNnQml0TWFzayA9IFJ4Q250cmxNc2dCaXRNYXNrOworCisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9nZXRfZGV2aWNlX2RyaXZlcl9pbmZvKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZHJpdmVyX2luZm8gRGV2SW5mbzsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQlEQkdfTFZMX0FMTCwgIkNhbGxlZCBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GT1xuIik7CisKKwltZW1zZXQoJkRldkluZm8sIDAsIHNpemVvZihEZXZJbmZvKSk7CisJRGV2SW5mby5NYXhSRE1CdWZmZXJTaXplID0gQlVGRkVSXzRLOworCURldkluZm8udTMyRFNEU3RhcnRPZmZzZXQgPSBFRVBST01fQ0FMUEFSQU1fU1RBUlQ7CisJRGV2SW5mby51MzJSeEFsaWdubWVudENvcnJlY3Rpb24gPSAwOworCURldkluZm8udTMyTlZNVHlwZSA9IEFkYXB0ZXItPmVOVk1UeXBlOworCURldkluZm8udTMySW50ZXJmYWNlVHlwZSA9IEJDTV9VU0I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKERldkluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmRGV2SW5mbywgc2l6ZW9mKERldkluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfdGltZV9zaW5jZV9uZXRfZW50cnkodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV90aW1lX2VsYXBzZWQgc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlkgY2FsbGVkIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeS51bDY0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0KKwkJZ2V0X3NlY29uZHMoKSAtIEFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5OworCisJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisKIHN0YXRpYyBsb25nIGJjbV9jaGFyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCBVSU5UIGNtZCwgVUxPTkcgYXJnKQogewogCXN0cnVjdCBiY21fdGFyYW5nX2RhdGEgKnBUYXJhbmcgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIgPSBwVGFyYW5nLT5BZGFwdGVyOwogCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQlpbnQgdGltZW91dCA9IDA7Ci0Jc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7Ci0JaW50IGJ5dGVzOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAogCQkJIlBhcmFtZXRlcnMgUGFzc2VkIHRvIGNvbnRyb2wgSU9DVEwgY21kPTB4JVggYXJnPTB4JWxYIiwKQEAgLTIwMSw3NzggKzIzMzIsNjUgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJLyogUmRtcyBmb3IgU3dpbiBJZGxlLi4uICovCi0JY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOiB7Ci0JCXN0cnVjdCBiY21fcmRtX2J1ZmZlciBzUmRtQnVmZmVyID0gezB9OwotCQlQQ0hBUiB0ZW1wX2J1ZmY7Ci0JCVVJTlQgQnVmZmxlbjsKLQkJdTE2IHRlbXBfdmFsdWU7CisJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9yZWdfcmVhZF9wcml2YXRlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzUmRtQnVmZmVyKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBVU0hSVF9NQVggfHwKLQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCUJ1ZmZsZW4gPSBJb0J1ZmZlci5PdXRwdXRMZW5ndGg7Ci0JCXRlbXBfdmFsdWUgPSA0IC0gKEJ1ZmZsZW4gJSA0KTsKLQkJQnVmZmxlbiArPSB0ZW1wX3ZhbHVlICUgNDsKLQotCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKEJ1ZmZsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXRlbXBfYnVmZikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWJ5dGVzID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJKFBVSU5UKXRlbXBfYnVmZiwgQnVmZmxlbik7Ci0JCWlmIChieXRlcyA+IDApIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgYnl0ZXMpKSB7Ci0JCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQl9Ci0KLQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEVfUFJJVkFURTogewotCQlzdHJ1Y3QgYmNtX3dybV9idWZmZXIgc1dybUJ1ZmZlciA9IHswfTsKLQkJVUlOVCB1aVRlbXBWYXIgPSAwOwotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7Ci0JCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCi0JCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSB3cm1hbHQoQWRhcHRlciwgKFVJTlQpc1dybUJ1ZmZlci5SZWdpc3RlciwKLQkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLCBzaXplb2YoVUxPTkcpKTsKLQotCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsICJXUk0gRG9uZVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsICJXUk0gRmFpbGVkXG4iKTsKLQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFX1BSSVZBVEU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3JlZ193cml0ZV9wcml2YXRlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRDoKLQljYXNlIElPQ1RMX0JDTV9FRVBST01fUkVHSVNURVJfUkVBRDogewotCQlzdHJ1Y3QgYmNtX3JkbV9idWZmZXIgc1JkbUJ1ZmZlciA9IHswfTsKLQkJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKLQkJVUlOVCB1aVRlbXBWYXIgPSAwOwotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisJY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1JFQUQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2VlcHJvbV9yZWdfcmVhZChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFJkbXNcbiIpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gVVNIUlRfTUFYIHx8Ci0JCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKElvQnVmZmVyLk91dHB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGVtcF9idWZmKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCWlmICgoKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKLQkJCSgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIlJETSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLAotCQkJCQkoaW50KXNSZG1CdWZmZXIuUmVnaXN0ZXIpOwotCi0JCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQl1aVRlbXBWYXIgPSBzUmRtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwotCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJICAgICAgIChQVUlOVCl0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7Ci0KLQkJaWYgKGJ5dGVzID4gMCkgewotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBieXRlcykpIHsKLQkJCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RhdHVzID0gYnl0ZXM7Ci0JCX0KLQotCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQlicmVhazsKLQl9CiAJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEU6Ci0JY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1dSSVRFOiB7Ci0JCXN0cnVjdCBiY21fd3JtX2J1ZmZlciBzV3JtQnVmZmVyID0gezB9OwotCQlVSU5UIHVpVGVtcFZhciA9IDA7CisJY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1dSSVRFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3dyaXRlKGFyZ3AsIEFkYXB0ZXIsIGNtZCk7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCWNhc2UgSU9DVExfQkNNX0dQSU9fU0VUX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fc2V0X3JlcXVlc3QoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBXcm1zXG4iKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9CisJY2FzZSBCQ01fTEVEX1RIUkVBRF9TVEFURV9DSEFOR0VfUkVROgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9sZWRfdGhyZWFkX3N0YXRlX2NoYW5nZV9yZXEoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBJT0NUTF9CQ01fR1BJT19TVEFUVVNfUkVRVUVTVDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ3Bpb19zdGF0dXNfcmVxdWVzdChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIElPQ1RMX0JDTV9HUElPX01VTFRJX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fbXVsdGlfcmVxdWVzdChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoKCgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8Ci0JCQkoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKLQkJCQkJKGludClzV3JtQnVmZmVyLlJlZ2lzdGVyKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKLQkJaWYgKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkgJiBWU0dfTU9ERSkgJiYKLQkJCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKLQkJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpIHsKLQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAotCQkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLAotCQkJCQlzV3JtQnVmZmVyLkxlbmd0aCk7Ci0KLQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOwotCQl9IGVsc2UgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7Ci0JCQlTdGF0dXMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPQ1RMX0JDTV9HUElPX1NFVF9SRVFVRVNUOiB7Ci0JCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKLQkJVUlOVCB2YWx1ZSA9IDA7Ci0JCVVJTlQgdWlCaXQgPSAwOwotCQlVSU5UIHVpT3BlcmF0aW9uID0gMDsKLQkJc3RydWN0IGJjbV9ncGlvX2luZm8gZ3Bpb19pbmZvID0gezB9OwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLAotCQkJCQkiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19pbmZvKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdWlCaXQgID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKLQkJdWlPcGVyYXRpb24gPSBncGlvX2luZm8udWlHcGlvVmFsdWU7Ci0JCXZhbHVlID0gKDE8PHVpQml0KTsKLQotCQlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLCB2YWx1ZSkgPT0gZmFsc2UpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBMRUQgISEhIiwKLQkJCQkJdmFsdWUpOwotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU2V0IC0gc2V0dGluZyAxICovCi0JCWlmICh1aU9wZXJhdGlvbikgewotCQkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLwotCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKLQkJCQkJCUJDTV9HUElPX09VVFBVVF9TRVRfUkVHLAotCQkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOwotCi0JCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJTZXQgdGhlIEdQSU8gYml0XG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJGYWlsZWQgdG8gc2V0IHRoZSAlZHRoIEdQSU9cbiIsCi0JCQkJCQl1aUJpdCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCi0JCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAotCQkJCQkJQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcsCi0JCQkJCQkoUFVJTlQpKCZ2YWx1ZSksIHNpemVvZihVSU5UKSk7Ci0KLQkJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIlNldCB0aGUgR1BJTyBiaXRcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIkZhaWxlZCB0byBjbGVhciB0aGUgJWR0aCBHUElPXG4iLAotCQkJCQkJdWlCaXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX01PREVfUkVHSVNURVIsCi0JCQkJICAgICAgIChQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7Ci0JCWlmIChieXRlcyA8IDApIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkiR1BJT19NT0RFX1JFR0lTVEVSIHJlYWQgZmFpbGVkIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBncGlvIG1vZGUgcmVnaXN0ZXIgdG8gb3V0cHV0ICovCi0JCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSB8PSAoMTw8dWlCaXQpOwotCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsCi0JCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7Ci0KLQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLAotCQkJCQkiU2V0IHRoZSBHUElPIHRvIG91dHB1dCBNb2RlXG4iKTsKLQkJfSBlbHNlIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIkZhaWxlZCB0byBwdXQgR1BJTyBpbiBPdXRwdXQgTW9kZVxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlicmVhazsKLQotCWNhc2UgQkNNX0xFRF9USFJFQURfU1RBVEVfQ0hBTkdFX1JFUTogewotCQlzdHJ1Y3QgYmNtX3VzZXJfdGhyZWFkX3JlcSB0aHJlYWRSZXEgPSB7MH07Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkiVXNlciBtYWRlIExFRCB0aHJlYWQgSW5BY3RpdmUiKTsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7Ci0JCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZih0aHJlYWRSZXEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkvKiBpZiBMRUQgdGhyZWFkIGlzIHJ1bm5pbmcoQWN0aXZlbHkgb3IgSW5hY3RpdmVseSkgc2V0IGl0IHN0YXRlIHRvIG1ha2UgaW5hY3RpdmUgKi8KLQkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nKSB7Ci0JCQlpZiAodGhyZWFkUmVxLlRocmVhZFN0YXRlID09IExFRF9USFJFQURfQUNUSVZBVElPTl9SRVEpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIkFjdGl2YXRpbmcgdGhyZWFkIHJlcSIpOwotCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTEVEX1RIUkVBRF9BQ1RJVkU7Ci0JCQl9IGVsc2UgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCi0JCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCi0JCQkJCQkiRGVBY3RpdmF0aW5nIFRocmVhZCByZXEuLi4uLiIpOwotCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTEVEX1RIUkVBRF9JTkFDVElWRTsKLQkJCX0KLQotCQkJLyogc2lnbmFsIHRocmVhZC4gKi8KLQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HUElPX1NUQVRVU19SRVFVRVNUOiB7Ci0JCVVMT05HIHVpQml0ID0gMDsKLQkJVUNIQVIgdWNSZWFkWzRdOwotCQlzdHJ1Y3QgYmNtX2dwaW9faW5mbyBncGlvX2luZm8gPSB7MH07Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKLQkJCXJldHVybiAtRUFDQ0VTOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXVpQml0ID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKLQotCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCi0JCWJ5dGVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpR1BJT19QSU5fU1RBVEVfUkVHSVNURVIsCi0JCQkJCShQVUlOVCl1Y1JlYWQsIHNpemVvZihVSU5UKSk7Ci0KLQkJaWYgKGJ5dGVzIDwgMCkgewotCQkJU3RhdHVzID0gYnl0ZXM7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkiUkRNIEZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gU3RhdHVzOwotCQl9IGVsc2UgewotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HUElPX01VTFRJX1JFUVVFU1Q6IHsKLQkJVUNIQVIgdWNSZXNldFZhbHVlWzRdOwotCQlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbyBncGlvX211bHRpX2luZm9bTUFYX0lEWF07Ci0JCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICpwZ3Bpb19tdWx0aV9pbmZvID0gKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICopZ3Bpb19tdWx0aV9pbmZvOwotCi0JCW1lbXNldChwZ3Bpb19tdWx0aV9pbmZvLCAwLCBNQVhfSURYICogc2l6ZW9mKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvKSk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfaW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfaW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIsIHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSA9PSBmYWxzZSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLAotCQkJCQkiU29ycnksIFJlcXVlc3RlZCBHUElPPDB4JVg+IGlzIG5vdCBjb3JyZXNwb25kIHRvIE5WTSBMRUQgYml0IG1hcDwweCVYPiEhISIsCi0JCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrLAotCQkJCQlBZGFwdGVyLT5ncGlvQml0TWFwKTsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KLQkJaWYgKChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgJgotCQkJKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9Db21tYW5kKSkgewotCQkJLyogU2V0IDEncyBpbiBHUElPIE9VVFBVVCBSRUdJU1RFUiAqLwotCQkJKihVSU5UICopdWNSZXNldFZhbHVlID0gIHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrICYKLQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCi0JCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlOwotCi0JCQlpZiAoKihVSU5UICopIHVjUmVzZXRWYWx1ZSkKLQkJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBCQ01fR1BJT19PVVRQVVRfU0VUX1JFRywKLQkJCQkJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKLQotCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9TRVRfUkVHIEZhaWxlZC4iKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCi0JCQkvKiBDbGVhciB0byAwJ3MgaW4gR1BJTyBPVVRQVVQgUkVHSVNURVIgKi8KLQkJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9IChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCi0JCQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCi0JCQkJCQkofihwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUpKSk7Ci0KLQkJCWlmICgqKFVJTlQgKikgdWNSZXNldFZhbHVlKQotCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEJDTV9HUElPX09VVFBVVF9DTFJfUkVHLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKLQotCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9DTFJfUkVHIEZhaWxlZC4iKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSB7Ci0JCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOwotCi0JCQlpZiAoYnl0ZXMgPCAwKSB7Ci0JCQkJU3RhdHVzID0gYnl0ZXM7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJCSJSRE0gdG8gR1BJT19QSU5fU1RBVEVfUkVHSVNURVIgRmFpbGVkLiIpOwotCQkJCXJldHVybiBTdGF0dXM7Ci0JCQl9IGVsc2UgewotCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQkJfQotCi0JCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUgPSAoKihVSU5UICopdWNSZXNldFZhbHVlICYKLQkJCQkJCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfaW5mbywgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HUElPX01PREVfUkVRVUVTVDogewotCQlVQ0hBUiB1Y1Jlc2V0VmFsdWVbNF07Ci0JCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9tb2RlIGdwaW9fbXVsdGlfbW9kZVtNQVhfSURYXTsKLQkJc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKnBncGlvX211bHRpX21vZGUgPSAoc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKilncGlvX211bHRpX21vZGU7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWJ5dGVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpR1BJT19NT0RFX1JFR0lTVEVSLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOwotCi0JCWlmIChieXRlcyA8IDApIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlYWQgb2YgR1BJT19NT0RFX1JFR0lTVEVSIGZhaWxlZCIpOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQl9Ci0KLQkJLyogVmFsaWRhdGluZyB0aGUgcmVxdWVzdCAqLwotCQlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLCBwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaykgPT0gZmFsc2UpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLAotCQkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaywgQWRhcHRlci0+Z3Bpb0JpdE1hcCk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spIHsKLQkJCS8qIHdyaXRlIGFsbCBPVVQncyAoMSdzKSAqLwotCQkJKihVSU5UICopIHVjUmVzZXRWYWx1ZSB8PSAocGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgJgotCQkJCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spOwotCi0JCQkvKiB3cml0ZSBhbGwgSU4ncyAoMCdzKSAqLwotCQkJKihVSU5UICopIHVjUmVzZXRWYWx1ZSAmPSB+KCh+cGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUpICYKLQkJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKLQotCQkJLyogQ3VycmVudGx5IGltcGxlbWVudGVkIHJldHVybiB0aGUgbW9kZXMgb2YgYWxsIEdQSU8ncwotCQkJICogZWxzZSBuZWVkcyB0byBiaXQgQU5EIHdpdGggIG1hc2sKLQkJCSAqLwotCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgPSAqKFVJTlQgKil1Y1Jlc2V0VmFsdWU7Ci0KLQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEdQSU9fTU9ERV9SRUdJU1RFUiwgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7Ci0JCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRG9uZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRmFpbGVkIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLS8qIGlmIHVpR1BJT01hc2sgaXMgMCB0aGVuIHJldHVybiBtb2RlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8KLQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlID0gKihVSU5UICopdWNSZXNldFZhbHVlOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fR1BJT19NT0RFX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fbW9kZV9yZXF1ZXN0KGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9NQUNfQUREUl9SRVE6CiAJY2FzZSBJT0NUTF9MSU5LX1JFUToKIAljYXNlIElPQ1RMX0NNX1JFUVVFU1Q6CiAJY2FzZSBJT0NUTF9TU19JTkZPX1JFUToKIAljYXNlIElPQ1RMX1NFTkRfQ09OVFJPTF9NRVNTQUdFOgotCWNhc2UgSU9DVExfSURMRV9SRVE6IHsKLQkJUFZPSUQgcHZCdWZmZXIgPSBOVUxMOwotCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmNtX2xpbmtfcmVxdWVzdCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBNQVhfQ05UTF9QS1RfU0laRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJICAgICAgIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJaWYgKElTX0VSUihwdkJ1ZmZlcikpCi0JCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7Ci0KLQkJZG93bigmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7Ci0JCVN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KEFkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSwKLQkJCQkJCQkhQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSwKLQkJCQkJCQkoMSAqIEhaKSk7Ci0JCWlmIChTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQotCQkJZ290byBjbnRybEVuZDsKLQotCQlpZiAoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkiUHJlcGFyaW5nIElkbGUgTW9kZSBpcyBzdGlsbCBUcnVlIC0gSGVuY2UgUmVqZWN0aW5nIGNvbnRyb2wgbWVzc2FnZVxuIik7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQkJCWdvdG8gY250cmxFbmQ7Ci0JCX0KLQkJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOwotCi1jbnRybEVuZDoKLQkJdXAoJkFkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMpOwotCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVEFSVDogewotCQlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkiSU9DVExfQkNNX0NISVBfUkVTRVQgbm90IGFsbG93ZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCSJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKLQotCQlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJQWRhcHRlci0+YkJpbkRvd25sb2FkZWQgPSBmYWxzZTsKLQkJQWRhcHRlci0+ZndfZG93bmxvYWRfcHJvY2Vzc19waWQgPSBjdXJyZW50LT5waWQ7Ci0JCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkID0gZmFsc2U7Ci0JCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBmYWxzZTsKLQkJbmV0aWZfY2Fycmllcl9vZmYoQWRhcHRlci0+ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwotCQlTdGF0dXMgPSByZXNldF9jYXJkX3Byb2MoQWRhcHRlcik7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCXByX2VycihQRlggIiVzOiByZXNldF9jYXJkX3Byb2MgRmFpbGVkIVxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKLQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0KLQkJbWRlbGF5KDEwKTsKLQotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJY2FzZSBJT0NUTF9JRExFX1JFUToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfbWlzY19yZXF1ZXN0KGFyZ3AsIEFkYXB0ZXIpOwogCQlyZXR1cm4gU3RhdHVzOwotCX0KIAotCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRDogewotCQlzdHJ1Y3QgYmNtX2Zpcm13YXJlX2luZm8gKnBzRndJbmZvID0gTlVMTDsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlN0YXJ0aW5nIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBQSUQgPTB4JXghISEhXG4iLCBjdXJyZW50LT5waWQpOwotCi0JCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkludmFsaWQgd2F5IHRvIGRvd25sb2FkIGJ1ZmZlci4gVXNlIFN0YXJ0IGFuZCB0aGVuIGNhbGwgdGhpcyEhIVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfQotCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkgewotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCSJMZW5ndGggZm9yIEZXIERMRCBpcyA6ICVseFxuIiwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzdHJ1Y3QgYmNtX2Zpcm13YXJlX2luZm8pKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXBzRndJbmZvID0ga21hbGxvYyhzaXplb2YoKnBzRndJbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHNGd0luZm8pIHsKLQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBzRndJbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlrZnJlZShwc0Z3SW5mbyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWlmICghcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzIHx8Ci0JCQkocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoID09IDApKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTb21ldGhpbmcgZWxzZSBpcyB3cm9uZyAlbHVcbiIsCi0JCQkJCXBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCk7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlrZnJlZShwc0Z3SW5mbyk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfQotCi0JCVN0YXR1cyA9IGJjbV9pb2N0bF9md19kb3dubG9hZChBZGFwdGVyLCBwc0Z3SW5mbyk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJaWYgKHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MgPT0gQ09ORklHX0JFR0lOX0FERFIpCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIklPQ1RMOiBDb25maWd1cmF0aW9uIEZpbGUgVXBsb2FkIEZhaWxlZFxuIik7Ci0JCQllbHNlCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwJIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZCBGYWlsZWRcbiIpOwotCi0JCQkvKiB1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7ICovCi0KLQkJCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKLQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IERSSVZFUl9JTklUOwotCQkJCUFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID0gZmFsc2U7Ci0JCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVEw6IEZpcm13YXJlIEZpbGUgVXBsb2FkZWRcbiIpOwotCQlrZnJlZShwc0Z3SW5mbyk7CisJY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUQVJUOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWRfc3RhcnQoQWRhcHRlcik7CiAJCXJldHVybiBTdGF0dXM7Ci0JfQogCi0JY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUT1A6IHsKLQkJaWYgKCFkb3duX3RyeWxvY2soJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkiRlcgZG93bmxvYWQgYmxvY2tlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkID0gVFJVRTsKLQkJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgPSBUUlVFOwotCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7Ci0JCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPSAwOwotCQlBZGFwdGVyLT5kb3dubG9hZEREUiA9IDA7Ci0KLQkJLyogc2V0dGluZyB0aGUgTWlwcyB0byBSdW4gKi8KLQkJU3RhdHVzID0gcnVuX2NhcmRfcHJvYyhBZGFwdGVyKTsKLQotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmlybSBEb3dubG9hZCBGYWlsZWRcbiIpOwotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfSBlbHNlIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwgIkZpcm0gRG93bmxvYWQgT3Zlci4uLlxuIik7Ci0JCX0KLQotCQltZGVsYXkoMTApOwotCi0JCS8qIFdhaXQgZm9yIE1haWxCb3ggSW50ZXJydXB0ICovCi0JCWlmIChTdGFydEludGVycnVwdFVyYigoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqKUFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiVW5hYmxlIHRvIHNlbmQgaW50ZXJydXB0Li4uXG4iKTsKLQotCQl0aW1lb3V0ID0gNSpIWjsKLQkJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gZmFsc2U7Ci0JCXdhaXRfZXZlbnRfdGltZW91dChBZGFwdGVyLT5pb2N0bF9md19kbmxkX3dhaXRfcXVldWUsCi0JCQkJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLCB0aW1lb3V0KTsKLQkJQWRhcHRlci0+ZndfZG93bmxvYWRfcHJvY2Vzc19waWQgPSBJTlZBTElEX1BJRDsKLQkJQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IFRSVUU7Ci0JCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLCAwKTsKLQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9IDA7Ci0JCUFkYXB0ZXItPlByZXZOdW1SZWN2RGVzY3MgPSAwOwotCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5jbnRybHBrdENudCwgMCk7Ci0JCUFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9IDA7Ci0JCUFkYXB0ZXItPkxpbmtTdGF0dXMgPSAwOwotCi0JCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKLQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRldfRE9XTkxPQURfRE9ORTsKLQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCX0KLQotCQlpZiAoIXRpbWVvdXQpCi0JCQlTdGF0dXMgPSAtRU5PREVWOwotCi0JCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkKGFyZ3AsIEFkYXB0ZXIpOwogCQlyZXR1cm4gU3RhdHVzOwotCX0KKworCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVE9QOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWRfc3RvcChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKKwogCiAJY2FzZSBJT0NUTF9CRV9CVUNLRVRfU0laRToKIAkJU3RhdHVzID0gMDsKQEAgLTk4NiwzNSArMjQwNCwxMyBAQAogCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAKLQljYXNlIElPQ1RMX0NISVBfUkVTRVQ6IHsKLQkJSU5UIE5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCWlmIChOVk1BY2Nlc3MpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICIgSU9DVExfQkNNX0NISVBfUkVTRVQgbm90IGFsbG93ZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KKwljYXNlIElPQ1RMX0NISVBfUkVTRVQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2NoaXBfcmVzZXQoQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJZG93bigmQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrKTsKLQkJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOwotCQlmbHVzaEFsbEFwcFEoKTsKLQkJdXAoJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJUmVzZXRDb3VudGVycyhBZGFwdGVyKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJT0NUTF9RT1NfVEhSRVNIT0xEOiB7Ci0JCVVTSE9SVCB1aUxvb3BJbmRleDsKLQotCQlTdGF0dXMgPSAwOwotCQlmb3IgKHVpTG9vcEluZGV4ID0gMDsgdWlMb29wSW5kZXggPCBOT19PRl9RVUVVRVM7IHVpTG9vcEluZGV4KyspIHsKLQkJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaHJlc2hvbGQsCi0JCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KKwljYXNlIElPQ1RMX1FPU19USFJFU0hPTEQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3Fvc190aHJlc2hvbGQoYXJnLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfRFVNUF9QQUNLRVRfSU5GTzoKIAkJRHVtcFBhY2tJbmZvKEFkYXB0ZXIpOwpAQCAtMTAyMywxNDIgKzI0MTksMzkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElPQ1RMX0dFVF9QQUNLX0lORk86Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkFkYXB0ZXItPlBhY2tJbmZvLCBzaXplb2Yoc3RydWN0IGJjbV9wYWNrZXRfaW5mbykqTk9fT0ZfUVVFVUVTKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmQWRhcHRlci0+UGFja0luZm8sCisJCQlzaXplb2Yoc3RydWN0IGJjbV9wYWNrZXRfaW5mbykqTk9fT0ZfUVVFVUVTKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJYnJlYWs7CiAKLQljYXNlIElPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogewotCQlVSU5UIHVpRGF0YSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdWlEYXRhLCBhcmdwLCBzaXplb2YoVUlOVCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3N3aXRjaF90cmFuc2Zlcl9tb2RlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmICh1aURhdGEpIHsKLQkJCS8qIEFsbG93IEFsbCBQYWNrZXRzICovCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREVcbiIpOwotCQkJCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBbGxvdyBJUCBvbmx5IFBhY2tldHMgKi8KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogSVBfUEFDS0VUX09OTFlfTU9ERVxuIik7Ci0JCQlBZGFwdGVyLT5UcmFuc2Zlck1vZGUgPSBJUF9QQUNLRVRfT05MWV9NT0RFOwotCQl9Ci0JCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQlicmVhazsKLQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0RSSVZFUl9WRVJTSU9OOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9nZXRfZHJpdmVyX3ZlcnNpb24oYXJncCk7CisJCXJldHVybiBTdGF0dXM7CiAKLQljYXNlIElPQ1RMX0JDTV9HRVRfRFJJVkVSX1ZFUlNJT046IHsKLQkJdWxvbmcgbGVuOworCWNhc2UgSU9DVExfQkNNX0dFVF9DVVJSRU5UX1NUQVRVUzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2N1cnJlbnRfc3RhdHVzKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX1NFVF9NQUNfVFJBQ0lORzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfc2V0X21hY190cmFjaW5nKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWxlbiA9IG1pbl90KHVsb25nLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHN0cmxlbihEUlZfVkVSU0lPTikgKyAxKTsKKwljYXNlIElPQ1RMX0JDTV9HRVRfRFNYX0lORElDQVRJT046CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9kc3hfaW5kaWNhdGlvbihhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgRFJWX1ZFUlNJT04sIGxlbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX0dFVF9DVVJSRU5UX1NUQVRVUzogewotCQlzdHJ1Y3QgYmNtX2xpbmtfc3RhdGUgbGlua19zdGF0ZTsKLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciBmYWlsZWQuLlxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKGxpbmtfc3RhdGUpKSB7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQltZW1zZXQoJmxpbmtfc3RhdGUsIDAsIHNpemVvZihsaW5rX3N0YXRlKSk7Ci0JCWxpbmtfc3RhdGUuYklkbGVNb2RlID0gQWRhcHRlci0+SWRsZU1vZGU7Ci0JCWxpbmtfc3RhdGUuYlNodXRkb3duTW9kZSA9IEFkYXB0ZXItPmJTaHV0U3RhdHVzOwotCQlsaW5rX3N0YXRlLnVjTGlua1N0YXR1cyA9IEFkYXB0ZXItPkxpbmtTdGF0dXM7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZsaW5rX3N0YXRlLCBtaW5fdChzaXplX3QsIHNpemVvZihsaW5rX3N0YXRlKSwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5X3RvX3VzZXIgRmFpbGVkLi5cbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX1NFVF9NQUNfVFJBQ0lORzogewotCQlVSU5UICB0cmFjaW5nX2ZsYWc7Ci0KLQkJLyogY29weSBpb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0cmFjaW5nX2ZsYWcsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVUlOVCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKHRyYWNpbmdfZmxhZykKLQkJCUFkYXB0ZXItPnBUYXJhbmdzLT5NYWNUcmFjaW5nRW5hYmxlZCA9IFRSVUU7Ci0JCWVsc2UKLQkJCUFkYXB0ZXItPnBUYXJhbmdzLT5NYWNUcmFjaW5nRW5hYmxlZCA9IGZhbHNlOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIElPQ1RMX0JDTV9HRVRfRFNYX0lORElDQVRJT046IHsKLQkJVUxPTkcgdWxTRklkID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAotCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZih1bFNGSWQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkdldCBEU1ggRGF0YSBTRiBJRCBpcyA9JWx4XG4iLCB1bFNGSWQpOwotCQlnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oQWRhcHRlciwgdWxTRklkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIpOwotCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HRVRfSE9TVF9NSUJTOiB7Ci0JCVBWT0lEIHRlbXBfYnVmZjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwKLQkJCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2Yoc3RydWN0IGJjbV9ob3N0X3N0YXRzX21pYnMpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogRklYTUU6IEhPU1RfU1RBVFMgYXJlIHRvbyBiaWcgZm9yIGttYWxsb2MgKDEyMjA0OCkhICovCi0JCXRlbXBfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGVtcF9idWZmKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLCB0ZW1wX2J1ZmYpOwotCQlHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKHRlbXBfYnVmZiwgcFRhcmFuZyk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfRkFJTFVSRSkKLQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIHNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpKSB7Ci0JCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQlicmVhazsKLQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0hPU1RfTUlCUzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2hvc3RfbWlicyhhcmdwLCBBZGFwdGVyLCBwVGFyYW5nKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQkNNX1dBS0VfVVBfREVWSUNFX0ZST01fSURMRToKLQkJaWYgKChmYWxzZSA9PSBBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUpICYmIChUUlVFID09IEFkYXB0ZXItPklkbGVNb2RlKSkgeworCQlpZiAoKGZhbHNlID09IEFkYXB0ZXItPmJUcmllZFRvV2FrZVVwRnJvbWxvd1Bvd2VyTW9kZSkgJiYKKwkJCShUUlVFID09IEFkYXB0ZXItPklkbGVNb2RlKSkgewogCQkJQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4gPSBBQk9SVF9JRExFX01PREU7CiAJCQlBZGFwdGVyLT5iV2FrZVVwRGV2aWNlID0gVFJVRTsKIAkJCXdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcnhfY250cmxwa3QpOwpAQCAtMTE2Nyw4ODYgKzI0NjAsODIgQEAKIAkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NUTF9CQ01fQlVMS19XUk06IHsKLQkJc3RydWN0IGJjbV9idWxrX3dybV9idWZmZXIgKnBCdWxrQnVmZmVyOwotCQlVSU5UIHVpVGVtcFZhciA9IDA7Ci0JCVBDSEFSIHB2QnVmZmVyID0gTlVMTDsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGluIElkbGUvU2h1dGRvd24gTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7Ci0JCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2YoVUxPTkcpICogMikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJICAgICAgIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJaWYgKElTX0VSUihwdkJ1ZmZlcikpCi0JCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7Ci0KLQkJcEJ1bGtCdWZmZXIgPSAoc3RydWN0IGJjbV9idWxrX3dybV9idWZmZXIgKilwdkJ1ZmZlcjsKLQotCQlpZiAoKChVTE9ORylwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwIHx8Ci0JCQkoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MykpIHsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsIChpbnQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyKTsKLQkJCWtmcmVlKHB2QnVmZmVyKTsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCXVpVGVtcFZhciA9IHBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKLQkJaWYgKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkmVlNHX01PREUpICYmCi0JCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKLQkJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkgewotCi0JCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBCdWxrQnVmZmVyLT5Td2FwRW5kaWFuID09IGZhbHNlKQotCQkJU3RhdHVzID0gd3JtV2l0aExvY2soQWRhcHRlciwgKFVJTlQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyLCAoUENIQVIpcEJ1bGtCdWZmZXItPlZhbHVlcywgSW9CdWZmZXIuSW5wdXRMZW5ndGggLSAyKnNpemVvZihVTE9ORykpOwotCQllbHNlCi0JCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIsIChQVUlOVClwQnVsa0J1ZmZlci0+VmFsdWVzLCBJb0J1ZmZlci5JbnB1dExlbmd0aCAtIDIqc2l6ZW9mKFVMT05HKSk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRmFpbGVkXG4iKTsKLQotCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCWJyZWFrOwotCX0KKwljYXNlIElPQ1RMX0JDTV9CVUxLX1dSTToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfYnVsa193cm0oYXJncCwgQWRhcHRlciwgY21kKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQkNNX0dFVF9OVk1fU0laRToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X252bV9zaXplKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NIHx8IEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgewotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZBZGFwdGVyLT51aU5WTURTRFNpemUsIHNpemVvZihVSU5UKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9DQUxfSU5JVDogewotCQlVSU5UIHVpU2VjdG9yU2l6ZSA9IDA7Ci0JCWlmIChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpU2VjdG9yU2l6ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVSU5UKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCWlmICgodWlTZWN0b3JTaXplIDwgTUlOX1NFQ1RPUl9TSVpFKSB8fCAodWlTZWN0b3JTaXplID4gTUFYX1NFQ1RPUl9TSVpFKSkgewotCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlTZWN0b3JTaXplLAotCQkJCQkJCXNpemVvZihVSU5UKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7Ci0JCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAkmQWRhcHRlci0+dWlTZWN0b3JTaXplLCBzaXplb2YoVUlOVCkpKQotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChUUlVFID09IEFkYXB0ZXItPmJTaHV0U3RhdHVzKSB8fCAoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpIHsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJCQl9Ci0KLQkJCQkJQWRhcHRlci0+dWlTZWN0b3JTaXplID0gdWlTZWN0b3JTaXplOwotCQkJCQlCY21VcGRhdGVTZWN0b3JTaXplKEFkYXB0ZXIsIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7Ci0JCQkJfQotCQkJfQotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCX0gZWxzZSB7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCX0KLQlicmVhazsKKwljYXNlIElPQ1RMX0JDTV9DQUxfSU5JVDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfY2FsX2luaXQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKIAljYXNlIElPQ1RMX0JDTV9TRVRfREVCVUc6Ci0jaWZkZWYgREVCVUcKLQl7Ci0JCXN0cnVjdCBiY21fdXNlcl9kZWJ1Z19zdGF0ZSBzVXNlckRlYnVnU3RhdGU7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSW4gU0VUX0RFQlVHIGlvY3RsXG4iKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNVc2VyRGVidWdTdGF0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihzdHJ1Y3QgYmNtX3VzZXJfZGVidWdfc3RhdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSU9DVExfQkNNX1NFVF9ERUJVRzogT25PZmY9JWQgVHlwZSA9IDB4JXggIiwKLQkJCQlzVXNlckRlYnVnU3RhdGUuT25PZmYsIHNVc2VyRGVidWdTdGF0ZS5UeXBlKTsKLQkJLyogc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPDw9IDE7ICovCi0JCXNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlID0gMSA8PCBzVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJhY3R1YWwgU3VidHlwZT0weCV4XG4iLCBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSk7Ci0KLQkJLyogVXBkYXRlIG5ldyAnRGVidWdTdGF0ZScgaW4gdGhlIEFkYXB0ZXIgKi8KLQkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUgfD0gc1VzZXJEZWJ1Z1N0YXRlLlR5cGU7Ci0JCS8qIFN1YnR5cGU6IEEgYml0bWFwIG9mIDMyIGJpdHMgZm9yIFN1YnR5cGUgcGVyIFR5cGUuCi0JCSAqIFZhbGlkIGluZGV4ZXMgaW4gJ3N1YnR5cGUnIGFycmF5OiAxLDIsNCw4Ci0JCSAqIGNvcnJlc3BvbmRpbmcgdG8gdmFsaWQgVHlwZSB2YWx1ZXMuIEhlbmNlIHdlIGNhbiB1c2UgdGhlICdUeXBlJyBmaWVsZAotCQkgKiBhcyB0aGUgaW5kZXggdmFsdWUsIGlnbm9yaW5nIHRoZSBhcnJheSBlbnRyaWVzIDAsMyw1LDYsNyAhCi0JCSAqLwotCQlpZiAoc1VzZXJEZWJ1Z1N0YXRlLk9uT2ZmKQotCQkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbc1VzZXJEZWJ1Z1N0YXRlLlR5cGVdIHw9IHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOwotCQllbHNlCi0JCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtzVXNlckRlYnVnU3RhdGUuVHlwZV0gJj0gfnNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOwotCi0JCUJDTV9TSE9XX0RFQlVHX0JJVE1BUChBZGFwdGVyKTsKLQl9Ci0jZW5kaWYKLQlicmVhazsKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfc2V0X2RlYnVnKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9CQ01fTlZNX1JFQUQ6Ci0JY2FzZSBJT0NUTF9CQ01fTlZNX1dSSVRFOiB7Ci0JCXN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSBzdE5WTVJlYWRXcml0ZTsKLQkJUFVDSEFSIHBSZWFkRGF0YSA9IE5VTEw7Ci0JCVVMT05HIHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSAwOwotCQlzdHJ1Y3QgdGltZXZhbCB0djAsIHR2MTsKLQkJbWVtc2V0KCZ0djAsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCQltZW1zZXQoJnR2MSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7Ci0JCWlmICgoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSAmJiAoQWRhcHRlci0+dWlGbGFzaExheW91dE1ham9yVmVyc2lvbiA9PSAwKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlRoZSBGbGFzaCBDb250cm9sIFNlY3Rpb24gaXMgQ29ycnVwdGVkLiBIZW5jZSBSZWplY3Rpb24gb24gTlZNIFJlYWQvV3JpdGVcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwljYXNlIElPQ1RMX0JDTV9OVk1fV1JJVEU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX252bV9ydyhhcmdwLCBBZGFwdGVyLCBjbWQpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKLQkJCWlmICgoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QwKSAmJgotCQkJCShBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDEpICYmCi0JCQkJKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMikpIHsKKwljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fUkVBRDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3JlYWQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTm8gRFNEIGlzIGFjdGl2ZS4uaGVuY2UgTlZNIENvbW1hbmQgaXMgYmxvY2tlZCIpOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLQkJfQorCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3dyaXRlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9mbGFzaDJ4X3NlY3Rpb25fYml0bWFwKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkV3JpdGUsCi0JCQkJCShJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSA/IElvQnVmZmVyLk91dHB1dEJ1ZmZlciA6IElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCQlzaXplb2Yoc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwljYXNlIElPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT046CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3NldF9hY3RpdmVfc2VjdGlvbihhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKgotCQkgKiBEZW55IHRoZSBhY2Nlc3MgaWYgdGhlIG9mZnNldCBjcm9zc2VzIHRoZSBjYWwgYXJlYSBsaW1pdC4KLQkJICovCi0JCWlmIChzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzID4gQWRhcHRlci0+dWlOVk1EU0RTaXplKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCWlmIChzdE5WTVJlYWRXcml0ZS51aU9mZnNldCA+IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSAtIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpIHsKLQkJCS8qIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ2FuJ3QgYWxsb3cgYWNjZXNzIGJleW9uZCBOVk0gU2l6ZTogMHgleCAweCV4XG4iLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7ICovCi0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQotCQlwUmVhZERhdGEgPSBtZW1kdXBfdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLAotCQkJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsKLQkJaWYgKElTX0VSUihwUmVhZERhdGEpKQotCQkJcmV0dXJuIFBUUl9FUlIocFJlYWREYXRhKTsKLQotCQlkb19nZXR0aW1lb2ZkYXkoJnR2MCk7Ci0JCWlmIChJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSB7Ci0JCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQotCQkJU3RhdHVzID0gQmVjZWVtTlZNUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlrZnJlZShwUmVhZERhdGEpOwotCQkJCXJldHVybiBTdGF0dXM7Ci0JCQl9Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwgcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkgewotCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQotCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBUUlVFOwotCQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSkgewotCQkJCS8qCi0JCQkJICoJCQlOZXcgUmVxdWlyZW1lbnQ6LQotCQkJCSAqCQkJRFNEIHNlY3Rpb24gdXBkYXRpb24gd2lsbCBiZSBhbGxvd2VkIGluIHR3byBjYXNlOi0KLQkJCQkgKgkJCTEuICBpZiBEU0Qgc2lnIGlzIHByZXNlbnQgaW4gRFNEIGhlYWRlciBtZWFucyBkb25nbGUgaXMgb2sgYW5kIHVwZGF0aW9uIGlzIGZydWl0ZnVsbAotCQkJCSAqCQkJMi4gIGlmIHBvaW50IDEgZmFpbGVzIHRoZW4gdXNlciBidWZmIHNob3VsZCBoYXZlIERTRCBzaWcuIHRoaXMgcG9pbnQgZW5zdXJlcyB0aGF0IGlmIGRvbmdsZSBpcwotCQkJCSAqCQkJICAgICAgY29ycnVwdGVkIHRoZW4gdXNlciBzcGFjZSBwcm9ncmFtIGZpcnN0IG1vZGlmeSB0aGUgRFNEIGhlYWRlciB3aXRoIHZhbGlkIERTRCBzaWcgc28KLQkJCQkgKgkJCSAgICAgIHRoYXQgdGhpcyBhcyB3ZWxsIGFzIGZ1cnRoZXIgd3JpdGUgbWF5IGJlIHdvcnRod2hpbGUuCi0JCQkJICoKLQkJCQkgKgkJCSBUaGlzIHJlc3RyaWN0aW9uIGhhcyBiZWVuIHB1dCBhc3N1bWluZyB0aGF0IGlmIERTRCBzaWcgaXMgY29ycnVwdGVkLCBEU0QKLQkJCQkgKgkJCSBkYXRhIHdvbid0IGJlIGNvbnNpZGVyZWQgdmFsaWQuCi0JCQkJICovCi0KLQkJCQlTdGF0dXMgPSBCY21GbGFzaDJ4Q29ycnVwdFNpZyhBZGFwdGVyLCBBZGFwdGVyLT5lQWN0aXZlRFNEKTsKLQkJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJCWlmICgoKHN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0ICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykgIT0gQWRhcHRlci0+dWlOVk1EU0RTaXplKSB8fAotCQkJCQkJKHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMgPCBTSUdOQVRVUkVfU0laRSkpIHsKLQotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOwotCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJCX0KLQotCQkJCQl1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gbnRvaGwoKihQVUlOVCkocFJlYWREYXRhICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyAtIFNJR05BVFVSRV9TSVpFKSk7Ci0JCQkJCWlmICh1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmICE9IERTRF9JTUFHRV9NQUdJQ19OVU1CRVIpIHsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKLQkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlTdGF0dXMgPSBCZWNlZW1OVk1Xcml0ZShBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywgc3ROVk1SZWFkV3JpdGUuYlZlcmlmeSk7Ci0JCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKQotCQkJCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLCBBZGFwdGVyLT5lQWN0aXZlRFNEKTsKLQotCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBmYWxzZTsKLQotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJZG9fZ2V0dGltZW9mZGF5KCZ0djEpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgdGltZXRha2VuIGJ5IFdyaXRlL3JlYWQgOiVsZCBtc2VjXG4iLCAodHYxLnR2X3NlYyAtIHR2MC50dl9zZWMpKjEwMDAgKyAodHYxLnR2X3VzZWMgLSB0djAudHZfdXNlYykvMTAwMCk7Ci0KLQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEOiB7Ci0JCXN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUgc0ZsYXNoMnhSZWFkID0gezB9OwotCQlQVUNIQVIgcFJlYWRCdWZmID0gTlVMTDsKLQkJVUlOVCBOT0IgPSAwOwotCQlVSU5UIEJ1ZmZTaXplID0gMDsKLQkJVUlOVCBSZWFkQnl0ZXMgPSAwOwotCQlVSU5UIFJlYWRPZmZzZXQgPSAwOwotCQl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKLQotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEIENhbGxlZCIpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCS8qIFJlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhSZWFkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4Iiwgc0ZsYXNoMnhSZWFkLlNlY3Rpb24pOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiV4Iiwgc0ZsYXNoMnhSZWFkLm9mZnNldCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4Iiwgc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiwgc0ZsYXNoMnhSZWFkLmJWZXJpZnkpOwotCi0JCS8qIFRoaXMgd2FzIGludGVybmFsIHRvIGRyaXZlciBmb3IgcmF3IHJlYWQuIG5vdyBpdCBoYXMgYmVuIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBhcHAuICovCi0JCWlmICh2YWxpZGF0ZUZsYXNoMnhSZWFkV3JpdGUoQWRhcHRlciwgJnNGbGFzaDJ4UmVhZCkgPT0gZmFsc2UpCi0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0KLQkJTk9CID0gc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXM7Ci0JCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCi0JCQlCdWZmU2l6ZSA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJZWxzZQotCQkJQnVmZlNpemUgPSBOT0I7Ci0KLQkJUmVhZE9mZnNldCA9IHNGbGFzaDJ4UmVhZC5vZmZzZXQ7Ci0JCU91dFB1dEJ1ZmYgPSBJb0J1ZmZlci5PdXRwdXRCdWZmZXI7Ci0JCXBSZWFkQnVmZiA9IChQQ0hBUilremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHBSZWFkQnVmZiA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlrZnJlZShwUmVhZEJ1ZmYpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQl3aGlsZSAoTk9CKSB7Ci0JCQlpZiAoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJCVJlYWRCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJCWVsc2UKLQkJCQlSZWFkQnl0ZXMgPSBOT0I7Ci0KLQkJCS8qIFJlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KLQkJCVN0YXR1cyA9IEJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWRCdWZmLCBzRmxhc2gyeFJlYWQuU2VjdGlvbiwgUmVhZE9mZnNldCwgUmVhZEJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7Ci0KLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihPdXRQdXRCdWZmLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7Ci0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlOT0IgPSBOT0IgLSBSZWFkQnl0ZXM7Ci0JCQlpZiAoTk9CKSB7Ci0JCQkJUmVhZE9mZnNldCA9IFJlYWRPZmZzZXQgKyBSZWFkQnl0ZXM7Ci0JCQkJT3V0UHV0QnVmZiA9IE91dFB1dEJ1ZmYgKyBSZWFkQnl0ZXM7Ci0JCQl9Ci0JCX0KLQotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCWtmcmVlKHBSZWFkQnVmZik7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1dSSVRFOiB7Ci0JCXN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUgc0ZsYXNoMnhXcml0ZSA9IHswfTsKLQkJUFVDSEFSIHBXcml0ZUJ1ZmY7Ci0JCXZvaWQgX191c2VyICpJbnB1dEFkZHI7Ci0JCVVJTlQgTk9CID0gMDsKLQkJVUlOVCBCdWZmU2l6ZSA9IDA7Ci0JCVVJTlQgV3JpdGVPZmZzZXQgPSAwOwotCQlVSU5UIFdyaXRlQnl0ZXMgPSAwOwotCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBGaXJzdCBtYWtlIHRoaXMgRmFsc2Ugc28gdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBTZWN0b3IgUGVybWlzc2lvbiBDaGVjayBpbiBCZWNlZW1GbGFzaEJ1bGtXcml0ZSAqLwotCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IGZhbHNlOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgQ2FsbGVkIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkvKiBSZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4V3JpdGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiVkIiwgc0ZsYXNoMnhXcml0ZS5vZmZzZXQpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIsIHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlcyk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLmJWZXJpZnkgOiV4XG4iLCBzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOwotCi0JCWlmICgoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTApICYmIChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMSkgJiYgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EyKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiT25seSBWU0Egd3JpdGUgaXMgYWxsb3dlZCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAodmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKEFkYXB0ZXIsICZzRmxhc2gyeFdyaXRlKSA9PSBmYWxzZSkKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQotCQlJbnB1dEFkZHIgPSBzRmxhc2gyeFdyaXRlLnBEYXRhQnVmZjsKLQkJV3JpdGVPZmZzZXQgPSBzRmxhc2gyeFdyaXRlLm9mZnNldDsKLQkJTk9CID0gc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzOwotCi0JCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCi0JCQlCdWZmU2l6ZSA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJZWxzZQotCQkJQnVmZlNpemUgPSBOT0I7Ci0KLQkJcFdyaXRlQnVmZiA9IGttYWxsb2MoQnVmZlNpemUsIEdGUF9LRVJORUwpOwotCi0JCWlmIChwV3JpdGVCdWZmID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBleHRyYWN0aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGdpdmVuIG9mZnNldC4gKi8KLQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJaWYgKFdyaXRlT2Zmc2V0ICUgQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAtIChXcml0ZU9mZnNldCAlIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7Ci0KLQkJaWYgKE5PQiA8IFdyaXRlQnl0ZXMpCi0JCQlXcml0ZUJ5dGVzID0gTk9COwotCi0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlrZnJlZShwV3JpdGVCdWZmKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJQmNtRmxhc2gyeENvcnJ1cHRTaWcoQWRhcHRlciwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKLQkJZG8gewotCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdyaXRlQnVmZiwgSW5wdXRBZGRyLCBXcml0ZUJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSB0byB1c2VyIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQlrZnJlZShwV3JpdGVCdWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIHBXcml0ZUJ1ZmYsIFdyaXRlQnl0ZXMpOwotCi0JCQkvKiBXcml0aW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCi0JCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1dyaXRlKEFkYXB0ZXIsIChQVUlOVClwV3JpdGVCdWZmLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24sIFdyaXRlT2Zmc2V0LCBXcml0ZUJ5dGVzLCBzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOwotCi0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCU5PQiA9IE5PQiAtIFdyaXRlQnl0ZXM7Ci0JCQlpZiAoTk9CKSB7Ci0JCQkJV3JpdGVPZmZzZXQgPSBXcml0ZU9mZnNldCArIFdyaXRlQnl0ZXM7Ci0JCQkJSW5wdXRBZGRyID0gSW5wdXRBZGRyICsgV3JpdGVCeXRlczsKLQkJCQlpZiAoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOwotCQkJCWVsc2UKLQkJCQkJV3JpdGVCeXRlcyA9IE5PQjsKLQkJCX0KLQkJfSB3aGlsZSAoTk9CID4gMCk7Ci0KLQkJQmNtRmxhc2gyeFdyaXRlU2lnKEFkYXB0ZXIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJa2ZyZWUocFdyaXRlQnVmZik7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVA6IHsKLQkJc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCAqcHNGbGFzaDJ4Qml0TWFwOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVAgQ2FsbGVkIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXBzRmxhc2gyeEJpdE1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXApLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHBzRmxhc2gyeEJpdE1hcCA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTWVtb3J5IGlzIG5vdCBhdmFpbGFibGUiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJLyogUmVhZGluZyB0aGUgRmxhc2ggU2VjdGlvIEJpdCBtYXAgKi8KLQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgcHNGbGFzaDJ4Qml0TWFwLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCkpKSB7Ci0JCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX1NFVF9BQ1RJVkVfU0VDVElPTjogewotCQllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCA9IDA7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT04gQ2FsbGVkIik7Ci0KLQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgZmxhc2ggc2VjdGlvbiB2YWwgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCVN0YXR1cyA9IEJjbVNldEFjdGl2ZVNlY3Rpb24oQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJaWYgKFN0YXR1cykKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGYWlsZWQgdG8gbWFrZSBpdCdzIHByaW9yaXR5IEhpZ2hlc3QuIFN0YXR1cyAlZCIsIFN0YXR1cyk7Ci0KLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OOiB7CisJY2FzZSBJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT046CiAJCS8qIFJpZ2h0IE5vdyB3ZSBhcmUgdGFraW5nIGNhcmUgb2Ygb25seSBEU0QgKi8KIAkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBmYWxzZTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OIGNhbGxlZCIpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OIGNhbGxlZCIpOwogCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9DT1BZX1NFQ1RJT046IHsKLQkJc3RydWN0IGJjbV9mbGFzaDJ4X2NvcHlfc2VjdGlvbiBzQ29weVNlY3RTdHJ1dCA9IHswfTsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9DT1BZX1NFQ1RJT04gIENhbGxlZCIpOwotCi0JCUFkYXB0ZXItPmJBbGxEU0RXcml0ZUFsbG93ID0gZmFsc2U7Ci0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NvcHlfc2VjdGlvbikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBDb3B5X1NlY3Rpb25fU3RydWN0IGZhaWxlZCB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGVzdGluYXRpb24gU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAib2Zmc2V0IDoleCIsIHNDb3B5U2VjdFN0cnV0Lm9mZnNldCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIk5PQiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5udW1PZkJ5dGVzKTsKLQotCQlpZiAoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pID09IGZhbHNlKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiU291cmNlIFNlY3Rpb248JXg+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoICIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pID09IGZhbHNlKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGVzdGluYXRpbyBTZWN0aW9uPCV4PiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbikgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIGFuZCBEZXN0aW5hdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJaWYgKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gSVNPX0lNQUdFMSB8fCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IElTT19JTUFHRTIpIHsKLQkJCWlmIChJc05vbkNETGVzc0RldmljZShBZGFwdGVyKSkgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaXMgTm9uLUNETGVzcyBoZW5jZSB3b24ndCBoYXZlIElTTyAhISIpOwotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQl9IGVsc2UgaWYgKHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMgPT0gMCkgewotCQkJCVN0YXR1cyA9IEJjbUNvcHlJU08oQWRhcHRlciwgc0NvcHlTZWN0U3RydXQpOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUGFydGlhbCBDb3B5IG9mIElTTyBzZWN0aW9uIGlzIG5vdCBBbGxvd2VkLi4iKTsKLQkJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0KLQotCQlTdGF0dXMgPSBCY21Db3B5U2VjdGlvbihBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uLAotCQkJCQlzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uLCBzQ29weVNlY3RTdHJ1dC5vZmZzZXQsIHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMpOwotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIX0NTX0lORk86IHsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiBJT0NUTF9CQ01fR0VUX0ZMQVNIX0NTX0lORk8gQ2FsbGVkIik7Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBoYXZlIGZsYXNoIik7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpID09IFRSVUUpIHsKLQkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfSBlbHNlIHsKLQkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaF9jc19pbmZvKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2hDU0luZm8sIHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoX2NzX2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX1NFTEVDVF9EU0Q6IHsKLQkJVUlOVCBTZWN0T2ZzZXQgPSAwOwotCQllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbDsKLQkJZUZsYXNoMnhTZWN0aW9uVmFsID0gTk9fU0VDVElPTl9WQUw7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TRUxFQ1RfRFNEIENhbGxlZCIpOwotCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUmVhZCBTZWN0aW9uIDolZCIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7Ci0JCWlmICgoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDApICYmCi0JCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDEpICYmCi0JCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDIpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJQYXNzZWQgc2VjdGlvbjwleD4gaXMgbm90IERTRCBzZWN0aW9uIiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCi0JCVNlY3RPZnNldCA9IEJjbUdldFNlY3Rpb25WYWxTdGFydE9mZnNldChBZGFwdGVyLCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotCQlpZiAoU2VjdE9mc2V0ID09IElOVkFMSURfT0ZGU0VUKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUHJvdmlkZWQgU2VjdGlvbiB2YWwgPCVkPiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAyLngiLCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IFRSVUU7Ci0JCUFkYXB0ZXItPnVsRmxhc2hDYWxTdGFydCA9IFNlY3RPZnNldDsKLQkJQWRhcHRlci0+ZUFjdGl2ZURTRCA9IGVGbGFzaDJ4U2VjdGlvblZhbDsKLQl9Ci0JU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9OVk1fUkFXX1JFQUQ6IHsKLQkJc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlIHN0TlZNUmVhZDsKLQkJSU5UIE5PQjsKLQkJSU5UIEJ1ZmZTaXplOwotCQlJTlQgUmVhZE9mZnNldCA9IDA7Ci0JCVVJTlQgUmVhZEJ5dGVzID0gMDsKLQkJUFVDSEFSIHBSZWFkQnVmZjsKLQkJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7Ci0KLQkJaWYgKEFkYXB0ZXItPmVOVk1UeXBlICE9IE5WTV9GTEFTSCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk5WTSBUWVBFIGlzIG5vdCBGbGFzaCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHNpemVvZihzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCU5PQiA9IHN0TlZNUmVhZC51aU51bUJ5dGVzOwotCQkvKiBJbiBSYXctUmVhZCBtYXggQnVmZiBzaXplIDogNjRNQiAqLwotCi0JCWlmIChOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKLQkJCUJ1ZmZTaXplID0gREVGQVVMVF9CVUZGX1NJWkU7Ci0JCWVsc2UKLQkJCUJ1ZmZTaXplID0gTk9COwotCi0JCVJlYWRPZmZzZXQgPSBzdE5WTVJlYWQudWlPZmZzZXQ7Ci0JCU91dFB1dEJ1ZmYgPSBzdE5WTVJlYWQucEJ1ZmZlcjsKLQotCQlwUmVhZEJ1ZmYgPSBremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwUmVhZEJ1ZmYgPT0gTlVMTCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7Ci0JCQlTdGF0dXMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBUUlVFOwotCi0JCXdoaWxlIChOT0IpIHsKLQkJCWlmIChOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKLQkJCQlSZWFkQnl0ZXMgPSBERUZBVUxUX0JVRkZfU0laRTsKLQkJCWVsc2UKLQkJCQlSZWFkQnl0ZXMgPSBOT0I7Ci0KLQkJCS8qIFJlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KLQkJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkQnVmZiwgUmVhZE9mZnNldCwgUmVhZEJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOwotCi0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOwotCQkJaWYgKFN0YXR1cykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IHRvIHVzZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFJlYWRCdWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCU5PQiA9IE5PQiAtIFJlYWRCeXRlczsKLQkJCWlmIChOT0IpIHsKLQkJCQlSZWFkT2Zmc2V0ID0gUmVhZE9mZnNldCArIFJlYWRCeXRlczsKLQkJCQlPdXRQdXRCdWZmID0gT3V0UHV0QnVmZiArIFJlYWRCeXRlczsKLQkJCX0KLQkJfQotCQlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gZmFsc2U7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJa2ZyZWUocFJlYWRCdWZmKTsKIAkJYnJlYWs7Ci0JfQogCi0JY2FzZSBJT0NUTF9CQ01fQ05UUkxNU0dfTUFTSzogewotCQlVTE9ORyBSeENudHJsTXNnQml0TWFzayA9IDA7CisJY2FzZSBJT0NUTF9CQ01fQ09QWV9TRUNUSU9OOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9jb3B5X3NlY3Rpb24oYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgImNvcHkgb2YgSW9jdGwgYnVmZmVyIGlzIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIX0NTX0lORk86CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9mbGFzaF9jc19pbmZvKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQorCWNhc2UgSU9DVExfQkNNX1NFTEVDVF9EU0Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3NlbGVjdF9kc2QoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJ4Q250cmxNc2dCaXRNYXNrLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJjb3B5IG9mIGNvbnRyb2wgYml0IG1hc2sgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG4gR290IHVzZXIgZGVmaW5lZCBjbnRybCBtc2cgYml0IG1hc2sgOiVseCIsIFJ4Q250cmxNc2dCaXRNYXNrKTsKLQkJcFRhcmFuZy0+UnhDbnRybE1zZ0JpdE1hc2sgPSBSeENudHJsTXNnQml0TWFzazsKLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fTlZNX1JBV19SRUFEOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9udm1fcmF3X3JlYWQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQljYXNlIElPQ1RMX0JDTV9HRVRfREVWSUNFX0RSSVZFUl9JTkZPOiB7Ci0JCXN0cnVjdCBiY21fZHJpdmVyX2luZm8gRGV2SW5mbzsKKwljYXNlIElPQ1RMX0JDTV9DTlRSTE1TR19NQVNLOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9jbnRybG1zZ19tYXNrKGFyZ3AsIEFkYXB0ZXIsIHBUYXJhbmcpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkNhbGxlZCBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GT1xuIik7CisJY2FzZSBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GTzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2RldmljZV9kcml2ZXJfaW5mbyhhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQltZW1zZXQoJkRldkluZm8sIDAsIHNpemVvZihEZXZJbmZvKSk7Ci0JCURldkluZm8uTWF4UkRNQnVmZmVyU2l6ZSA9IEJVRkZFUl80SzsKLQkJRGV2SW5mby51MzJEU0RTdGFydE9mZnNldCA9IEVFUFJPTV9DQUxQQVJBTV9TVEFSVDsKLQkJRGV2SW5mby51MzJSeEFsaWdubWVudENvcnJlY3Rpb24gPSAwOwotCQlEZXZJbmZvLnUzMk5WTVR5cGUgPSBBZGFwdGVyLT5lTlZNVHlwZTsKLQkJRGV2SW5mby51MzJJbnRlcmZhY2VUeXBlID0gQkNNX1VTQjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRGV2SW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkRldkluZm8sIHNpemVvZihEZXZJbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9USU1FX1NJTkNFX05FVF9FTlRSWTogewotCQlzdHJ1Y3QgYmNtX3RpbWVfZWxhcHNlZCBzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IHswfTsKLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlkgY2FsbGVkIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LnVsNjRUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSBnZXRfc2Vjb25kcygpIC0gQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwgc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlk6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3RpbWVfc2luY2VfbmV0X2VudHJ5KGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9DTE9TRV9OT1RJRklDQVRJT046Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0NMT1NFX05PVElGSUNBVElPTiIpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCURCR19MVkxfQUxMLCAiSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jCmluZGV4IGNjOTFiNWUuLjYzMmY4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYwpAQCAtOTc1LDggKzk3NSw4IEBACiAJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OEV0aGVybmV0RGVzdE1hY0FkZHJlc3NMZW5ndGgpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwKLQkJCQlEQkdfTFZMX0FMTCwgInU4RXRoZXJuZXRTb3VyY2VNQUNBZGRyZXNzWzZdOiAiCi0JCQkJIiVwTSIsIHBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCisJCQkJREJHX0xWTF9BTEwsICJ1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc1s2XTogJXBNIiwKKwkJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgogCQkJCQkJdThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3MpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1OEV0aGVydHlwZUxlbmd0aDogMHglMDJYICIsCkBAIC0xMDkyLDE4ICsxMDkyLDE2IEBACiAJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sU291cmNlUG9ydFJhbmdlTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OFByb3RvY29sU291cmNlUG9ydFJhbmdlWzRdOiAiCi0JCQkJIjB4JSpwaCAiLCA0LCBwc2ZDU1R5cGUtPgotCQkJCQkJY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCisJCQkJREJHX0xWTF9BTEwsICJ1OFByb3RvY29sU291cmNlUG9ydFJhbmdlWzRdOiAweCUqcGggIiwKKwkJCQk0LCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgogCQkJCQkJdThQcm90b2NvbFNvdXJjZVBvcnRSYW5nZSk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4UHJvdG9jb2xEZXN0UG9ydFJhbmdlTGVuZ3RoOiAweCUwMlggIiwKIAkJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2xEZXN0UG9ydFJhbmdlTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OFByb3RvY29sRGVzdFBvcnRSYW5nZVs0XTogIgotCQkJCSIweCUqcGggIiwgNCwgcHNmQ1NUeXBlLT4KLQkJCQkJCWNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgorCQkJCURCR19MVkxfQUxMLCAidThQcm90b2NvbERlc3RQb3J0UmFuZ2VbNF06IDB4JSpwaCAiLAorCQkJCTQsIHBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCiAJCQkJCQl1OFByb3RvY29sRGVzdFBvcnRSYW5nZSk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4RXRoZXJuZXREZXN0TWFjQWRkcmVzc0xlbmd0aDogMHglMDJYICIsCkBAIC0xMTE4LDggKzExMTYsOCBAQAogCQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThFdGhlcm5ldERlc3RNYWNBZGRyZXNzTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc1s2XTogIgotCQkJCSIlcE0iLCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgorCQkJCURCR19MVkxfQUxMLCAidThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3NbNl06ICVwTSIsCisJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS4KIAkJCQkJCXU4RXRoZXJuZXRTb3VyY2VNQUNBZGRyZXNzKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAidThFdGhlcnR5cGVMZW5ndGg6IDB4JTAyWCAiLCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4RXRoZXJ0eXBlTGVuZ3RoKTsKQEAgLTE2MzcsNiArMTYzNSw4IEBACiAJc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQgKnBzdEFkZEluZGljYXRpb24gPSBOVUxMOwogCXN0cnVjdCBiY21fY2hhbmdlX2luZGljYXRpb24gKnBzdENoYW5nZUluZGljYXRpb24gPSBOVUxMOwogCXN0cnVjdCBiY21fbGVhZGVyICpwTGVhZGVyID0gTlVMTDsKKwlJTlQgdWlTZWFyY2hSdWxlSW5kZXggPSAwOworCVVMT05HIHVsU0ZJRDsKIAogCS8qCiAJICogT3RoZXJ3aXNlIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEgdGFyZ2V0IGFkZHJlc3MgZnJvbSB3aGVyZSB3ZSBuZWVkIHRvCkBAIC0xNjYwLDcgKzE2NjAsNiBAQAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICIjIyMgVElEIFJFQ0VJVkVEICVkXG4iLCBwc3RBZGRJbmRpY2F0aW9uLT51MTZUSUQpOwogCXN3aXRjaCAocHN0QWRkSW5kaWNhdGlvbi0+dThUeXBlKSB7CiAJY2FzZSBEU0FfUkVROgotCXsKIAkJcExlYWRlci0+UExlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCk7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNlbmRpbmcgRFNBIFJlc3BvbnNlLi4uLlxuIik7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNFTkRJTkcgRFNBIFJFU1BPTlNFIFRPIE1BQyAlZCIsIHBMZWFkZXItPlBMZW5ndGgpOwpAQCAtMTY3MSwyMiArMTY3MCwxNiBAQAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICIgVkNJRCA9ICV4IiwgbnRvaHMocHN0QWRkSW5kaWNhdGlvbi0+dTE2VkNJRCkpOwogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwogCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNBX1JTUDoKLQl7CiAJCXBMZWFkZXItPlBMZW5ndGggPSBzaXplb2Yoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQpOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJTRU5ESU5HIERTQSBBQ0sgVE8gTUFDICVkIiwKIAkJCQlwTGVhZGVyLT5QTGVuZ3RoKTsKIAkJKigoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQgKikmKEFkYXB0ZXItPmNhRHN4UmVxUmVzcFtMRUFERVJfU0laRV0pKQogCQkJPSAqcHN0QWRkSW5kaWNhdGlvbjsKIAkJKChzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpLT51OFR5cGUgPSBEU0FfQUNLOwotCi0JfSAvKiBubyBicmVhayBoZXJlLi53ZSBzaG91bGQgZ28gZG93bi4gKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIERTQV9BQ0s6Ci0JewotCQlVSU5UIHVpU2VhcmNoUnVsZUluZGV4ID0gMDsKLQogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJWQ0lEOjB4JVgiLAogCQkJCW50b2hzKHBzdEFkZEluZGljYXRpb24tPnUxNlZDSUQpKTsKIAkJdWlTZWFyY2hSdWxlSW5kZXggPSBTZWFyY2hGcmVlU2ZpZChBZGFwdGVyKTsKQEAgLTE2OTQsNyArMTY4Nyw3IEBACiAJCQkJdWlTZWFyY2hSdWxlSW5kZXgpOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJEaXJlY3Rpb246MHglWCAiLAogCQkJCXBzdEFkZEluZGljYXRpb24tPnU4RGlyZWN0aW9uKTsKLQkJaWYgKCh1aVNlYXJjaFJ1bGVJbmRleCA8IE5PX09GX1FVRVVFUykpIHsKKwkJaWYgKHVpU2VhcmNoUnVsZUluZGV4IDwgTk9fT0ZfUVVFVUVTKSB7CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0udWNEaXJlY3Rpb24gPQogCQkJCXBzdEFkZEluZGljYXRpb24tPnU4RGlyZWN0aW9uOwogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiYlZhbGlkOjB4JVggIiwKQEAgLTE3NjksMTAgKzE3NjIsOCBAQAogCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNDX1JFUToKLQl7CiAJCXBMZWFkZXItPlBMZW5ndGggPSBzaXplb2Yoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbik7CiAJCXBzdENoYW5nZUluZGljYXRpb24gPSAoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKXBzdEFkZEluZGljYXRpb247CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNFTkRJTkcgRFNDIFJFU1BPTlNFIFRPIE1BQyAlZCIsIHBMZWFkZXItPlBMZW5ndGgpOwpAQCAtMTc4MiwyNiArMTc3MywyMSBAQAogCiAJCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgKFBWT0lEKUFkYXB0ZXItPmNhRHN4UmVxUmVzcCk7CiAJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwotCX0KLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBEU0NfUlNQOgotCXsKIAkJcExlYWRlci0+UExlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uKTsKIAkJcHN0Q2hhbmdlSW5kaWNhdGlvbiA9IChzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICopcHN0QWRkSW5kaWNhdGlvbjsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiU0VORElORyBEU0MgQUNLIFRPIE1BQyAlZCIsIHBMZWFkZXItPlBMZW5ndGgpOwogCQkqKChzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSkgPSAqcHN0Q2hhbmdlSW5kaWNhdGlvbjsKIAkJKChzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSktPnU4VHlwZSA9IERTQ19BQ0s7Ci0JfQorCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgRFNDX0FDSzoKLQl7Ci0JCVVJTlQgdWlTZWFyY2hSdWxlSW5kZXggPSAwOwotCiAJCXBzdENoYW5nZUluZGljYXRpb24gPSAoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKXBzdEFkZEluZGljYXRpb247CiAJCXVpU2VhcmNoUnVsZUluZGV4ID0gU2VhcmNoU2ZpZChBZGFwdGVyLCBudG9obChwc3RDaGFuZ2VJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJTRklEKSk7CiAJCWlmICh1aVNlYXJjaFJ1bGVJbmRleCA+IE5PX09GX1FVRVVFUy0xKQogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlNGIGRvZXNuJ3QgZXhpc3QgZm9yIHdoaWNoIERTQ19BQ0sgaXMgcmVjZWl2ZWQiKTsKIAotCQlpZiAoKHVpU2VhcmNoUnVsZUluZGV4IDwgTk9fT0ZfUVVFVUVTKSkgeworCQlpZiAodWlTZWFyY2hSdWxlSW5kZXggPCBOT19PRl9RVUVVRVMpIHsKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS51Y0RpcmVjdGlvbiA9IHBzdENoYW5nZUluZGljYXRpb24tPnU4RGlyZWN0aW9uOwogCQkJaWYgKHBzdENoYW5nZUluZGljYXRpb24tPnNmQWN0aXZlU2V0LmJWYWxpZCA9PSBUUlVFKQogCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5iQWN0aXZlU2V0ID0gVFJVRTsKQEAgLTE4NDksMTMgKzE4MzUsOCBAQAogCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNEX1JFUToKLQl7Ci0JCVVJTlQgdWlTZWFyY2hSdWxlSW5kZXg7Ci0JCVVMT05HIHVsU0ZJRDsKLQogCQlwTGVhZGVyLT5QTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiY21fZGVsX2luZGljYXRpb24pOwogCQkqKChzdHJ1Y3QgYmNtX2RlbF9pbmRpY2F0aW9uICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSkgPSAqKChzdHJ1Y3QgYmNtX2RlbF9pbmRpY2F0aW9uICopcHN0QWRkSW5kaWNhdGlvbik7CiAKQEAgLTE4NzIsMTIgKzE4NTMsMTAgQEAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiU0VORElORyBEU0QgUkVTUE9OU0UgVE8gTUFDIik7CiAJCSgoc3RydWN0IGJjbV9kZWxfaW5kaWNhdGlvbiAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpLT51OFR5cGUgPSBEU0RfUlNQOwogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwotCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIERTRF9SU1A6Ci0JewogCQkvKiBEbyBub3RoaW5nIGFzIFNGIGhhcyBhbHJlYWR5IGdvdCBEZWxldGVkICovCi0JfQotCWJyZWFrOworCQlicmVhazsKIAljYXNlIERTRF9BQ0s6CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIkRTRCBBQ0sgUmNkLCBsZXQgQXBwIGhhbmRsZSBpdFxuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYwppbmRleCBlZDI4NWIyLi5mMWQ3Y2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYwpAQCAtMyw3ICszLDcgQEAKIAogCiAjZGVmaW5lIEREUl9EVU1QX0lOVEVSTkFMX0RFVklDRV9NRU1PUlkgMHhCRkMwMkIwMAotI2RlZmluZSBNSVBTX0NMT0NLX1JFRyAJMHgwZjAwMDgyMAorI2RlZmluZSBNSVBTX0NMT0NLX1JFRyAweDBmMDAwODIwCiAKIC8qIEREUiBJTklULTEzM01oeiAqLwogI2RlZmluZSBUM19TS0lQX0NMT0NLX1BST0dSQU1fRFVNUF8xMzNNSFogMTIgIC8qIGluZGV4IGZvciAweDBGMDA3MDAwICovCkBAIC04MTgsMTMgKzgxOCwxMyBAQAogCWlmICgoQWRhcHRlci0+Y2hpcF9pZCAhPSAgQkNTMjIwXzIpICYmCiAJCShBZGFwdGVyLT5jaGlwX2lkICE9ICBCQ1MyMjBfMkJDKSAmJgogCQkoQWRhcHRlci0+Y2hpcF9pZCAhPSBCQ1MyMjBfMykpIHsKLQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMDgzMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMDgzMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJCXVpUmVzZXRWYWx1ZSB8PSAweDQ0OwotCQlyZXR2YWwgPSB3cm1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwODMwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCXJldHZhbCA9IHdybWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwODMwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCXJldHVybiByZXR2YWw7CkBAIC04NzEsNyArODcxLDcgQEAKIAljYXNlIDB4YmVjZTAxMjE6CiAJY2FzZSAweGJlY2UwMTMwOgogCWNhc2UgMHhiZWNlMDMwMDoKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiRERSIFNldHRpbmc6ICV4XG4iLCBBZGFwdGVyLT5ERFJTZXR0aW5nKTsKIAkJc3dpdGNoIChBZGFwdGVyLT5ERFJTZXR0aW5nKSB7CiAJCWNhc2UgRERSXzgwX01IWjoKIAkJCXBzRERSU2V0dGluZyA9IGFzVDNfRERSU2V0dGluZzgwTUh6OwpAQCAtOTMzLDcgKzkzMyw3IEBACiAJfQogCiAJdmFsdWUgPSAwOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiUmVnaXN0ZXIgQ291bnQgaXMgPSVsdVxuIiwgUmVnQ291bnQpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIENvdW50IGlzID0lbHVcbiIsIFJlZ0NvdW50KTsKIAl3aGlsZSAoUmVnQ291bnQgJiYgIXJldHZhbCkgewogCQlpZiAodWlDbG9ja1NldHRpbmcgJiYgcHNERFJTZXR0aW5nLT51bFJlZ0FkZHJlc3MgPT0gTUlQU19DTE9DS19SRUcpCiAJCQl2YWx1ZSA9IHVpQ2xvY2tTZXR0aW5nOwpAQCAtOTkwLDEyICs5OTAsMTIgQEAKIAkJICogd2Ugd2lsbCBjaGFuZ2UgdGhpcyB3aGVuIHdlIHdpbGwgaGF2ZSBpbnRlcm5hbCBQTVUuCiAJCSAqLwogCQlpZiAoQWRhcHRlci0+UG11TW9kZSA9PSBIWUJSSURfTU9ERV83QykgewotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CkBAIC0xMDA2LDEyICsxMDA2LDEyIEBACiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9Ci0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTAyNCwxMiArMTAyNCwxMiBAQAogCQkJfQogCQl9IGVsc2UgaWYgKEFkYXB0ZXItPlBtdU1vZGUgPT0gSFlCUklEX01PREVfNikgewogCi0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKQEAgLTEwNDAsMTIgKzEwNDAsMTIgQEAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CkBAIC0xMDk0LDggKzEwOTQsOCBAQAogCQkJUmVnQ291bnQgLT0gVDNMUF9TS0lQX0NMT0NLX1BST0dSQU1fRFVNUF8xMzNNSFo7CiAJCQlwc0REUlNldHRpbmcgKz0gVDNMUF9TS0lQX0NMT0NLX1BST0dSQU1fRFVNUF8xMzNNSFo7CiAJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgcmV0dXJuIC1FSU5WQUw7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKIApAQCAtMTIxNSw3ICsxMjE1LDcgQEAKIAkJdWxfZGRyX3NldHRpbmdfbG9hZF9hZGRyICs9IHNpemVvZihVTE9ORyk7CiAJCWlmICghcmV0dmFsKSB7CiAJCQlpZiAoYk92ZXJyaWRlU2VsZlJlZnJlc2ggJiYgKHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzID09IDB4MEYwMDcwMTgpKSB7Ci0JCQkJdmFsdWUgPSAocHNERFJTZXR0aW5nLT51bFJlZ1ZhbHVlIHwoMTw8OCkpOworCQkJCXZhbHVlID0gKHBzRERSU2V0dGluZy0+dWxSZWdWYWx1ZSB8ICgxPDw4KSk7CiAJCQlpZiAoU1RBVFVTX1NVQ0NFU1MgIT0gd3JtYWx0KEFkYXB0ZXIsIHVsX2Rkcl9zZXR0aW5nX2xvYWRfYWRkciwKIAkJCQkmdmFsdWUsIHNpemVvZih2YWx1ZSkpKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYwppbmRleCA5NGYzMjcyLi43YzA0YzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCi0KKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgSW50ZXJmYWNlVXNidGFibGVbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UMykgfSwKIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UM0IpIH0sCkBAIC0zMCwxOSArMzAsMjIgQEAKIAlpbnQgaSA9IDA7CiAKIAkvKiBXYWtlIHVwIHRoZSB3YWl0X3F1ZXVlLi4uICovCi0JaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CisJaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJgorCQkJQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0hBTFQ7CiAJCXdha2VfdXAoJnBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAl9CiAJcmVzZXRfY2FyZF9wcm9jKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKIAkvKgotCSAqIHdvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyIGV2ZXJ5IDEwMCBtcwotCSAqIHRvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIgdGhpcyBObyBSRE0vV1JNIHNob3VsZCBiZSBtYWRlLgorCSAqIHdvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyCisJICogZXZlcnkgMTAwIG1zIHRvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIKKwkgKiB0aGlzIE5vIFJETS9XUk0gc2hvdWxkIGJlIG1hZGUuCiAJICovCiAJd2hpbGUgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+RGV2aWNlQWNjZXNzKSB7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJIkRldmljZSBpcyBiZWluZyBhY2Nlc3NlZC5cbiIpOworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwKKwkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJEZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQuXG4iKTsKIAkJbXNsZWVwKDEwMCk7CiAJfQogCS8qIEZyZWUgaW50ZXJydXB0IFVSQiAqLwpAQCAtNzEsNiArNzQsNyBAQAogewogCXUzMiB1bFJlZzsKIAlpbnQgYnl0ZXM7CisJc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqaW50ZXJmYWNlQWRhcHRlcjsKIAogCS8qIFByb2dyYW0gRVAyIE1BWF9QS1RfU0laRSAqLwogCXVsUmVnID0gbnRvaGwoRVAyX01QU19SRUcpOwpAQCAtODAsNyArODQsOSBAQAogCiAJdWxSZWcgPSBudG9obChFUDJfQ0ZHX1JFRyk7CiAJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzMiwgNCwgVFJVRSk7Ci0JaWYgKCgoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqKShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKS0+YkhpZ2hTcGVlZERldmljZSA9PSBUUlVFKSB7CisJaW50ZXJmYWNlQWRhcHRlciA9CisJCShzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICopKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcik7CisJaWYgKGludGVyZmFjZUFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpIHsKIAkJdWxSZWcgPSBudG9obChFUDJfQ0ZHX0lOVCk7CiAJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMzYsIDQsIFRSVUUpOwogCX0gZWxzZSB7CkBAIC05OCw4ICsxMDQsOCBAQAogCS8qIFByb2dyYW0gVFggRVAgYXMgaW50ZXJydXB0KEFsdGVybmF0ZSBTZXR0aW5nKSAqLwogCWJ5dGVzID0gcmRtYWx0KEFkYXB0ZXIsIDB4MEYwMTEwRjgsICZ1bFJlZywgc2l6ZW9mKHUzMikpOwogCWlmIChieXRlcyA8IDApIHsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJInJlYWRpbmcgb2YgVHggRVAgZmFpbGVkXG4iKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJREJHX0xWTF9BTEwsICJyZWFkaW5nIG9mIFR4IEVQIGZhaWxlZFxuIik7CiAJCXJldHVybjsKIAl9CiAJdWxSZWcgfD0gMHg2OwpAQCAtMTUwLDcgKzE1Niw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAkvKiBSZXNlcnZlIG9uZSBleHRyYSBxdWV1ZSBmb3IgdGhlIGJpdC1idWNrZXQgKi8KLQluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyKSwgTk9fT0ZfUVVFVUVTKzEpOworCW5kZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIpLAorCQkJTk9fT0ZfUVVFVUVTICsgMSk7CiAJaWYgKG5kZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsIERSVl9OQU1FICI6IG5vIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjksMTMgKzE3NiwxNCBAQAogCiAJLyoKIAkgKiBUZWNobmljYWxseSwgb25lIGNhbiBzdGFydCB1c2luZyBCQ01fREVCVUdfUFJJTlQgYWZ0ZXIgdGhpcyBwb2ludC4KLQkgKiBIb3dldmVyLCByZWFsaXplIHRoYXQgYnkgZGVmYXVsdCB0aGUgVHlwZS9TdWJ0eXBlIGJpdG1hcHMgYXJlIGFsbCB6ZXJvIG5vdzsKLQkgKiBzbyBubyBwcmludHMgd2lsbCBhY3R1YWxseSBhcHBlYXIgdW50aWwgdGhlIFRlc3RBcHAgdHVybnMgb24gZGVidWcgcGF0aHMgdmlhCi0JICogdGhlIGlvY3RsKCk7IHNvIHByYWN0aWNhbGx5IHNwZWFraW5nLCBpbiBlYXJseSBpbml0LCBubyBsb2dnaW5nIGhhcHBlbnMuCisJICogSG93ZXZlciwgcmVhbGl6ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIFR5cGUvU3VidHlwZSBiaXRtYXBzIGFyZSBhbGwKKwkgKiB6ZXJvIG5vdzsgc28gbm8gcHJpbnRzIHdpbGwgYWN0dWFsbHkgYXBwZWFyIHVudGlsIHRoZSBUZXN0QXBwIHR1cm5zCisJICogb24gZGVidWcgcGF0aHMgdmlhIHRoZSBpb2N0bCgpOyBzbyBwcmFjdGljYWxseSBzcGVha2luZywgaW4gZWFybHkKKwkgKiBpbml0LCBubyBsb2dnaW5nIGhhcHBlbnMuCiAJICoKLQkgKiBBIHNvbHV0aW9uICh1c2VkIGJlbG93KTogd2UgZXhwbGljaXRseSBzZXQgdGhlIGJpdG1hcHMgdG8gMSBmb3IgVHlwZT1EQkdfVFlQRV9JTklURVhJVAotCSAqIGFuZCBBTEwgc3VidHlwZSdzIG9mIHRoZSBzYW1lLiBOb3cgYWxsIGJjbSBkZWJ1ZyBzdGF0ZW1lbnRzIGdldCBsb2dnZWQsIGVuYWJsaW5nIGRlYnVnCi0JICogZHVyaW5nIGVhcmx5IGluaXQuCisJICogQSBzb2x1dGlvbiAodXNlZCBiZWxvdyk6IHdlIGV4cGxpY2l0bHkgc2V0IHRoZSBiaXRtYXBzIHRvIDEgZm9yCisJICogVHlwZT1EQkdfVFlQRV9JTklURVhJVCBhbmQgQUxMIHN1YnR5cGUncyBvZiB0aGUgc2FtZS4gTm93IGFsbCBiY20KKwkgKiBkZWJ1ZyBzdGF0ZW1lbnRzIGdldCBsb2dnZWQsIGVuYWJsaW5nIGRlYnVnIGR1cmluZyBlYXJseSBpbml0LgogCSAqIEZ1cnRoZXIsIHdlIHR1cm4gdGhpcyBPRkYgb25jZSBpbml0X21vZHVsZSgpIGNvbXBsZXRlcy4KIAkgKi8KIApAQCAtMTkxLDcgKzE5OSw3IEBACiAKIAkvKiBBbGxvY2F0ZSBpbnRlcmZhY2UgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KIAlwc0ludGZBZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciksCi0JCQkJR0ZQX0tFUk5FTCk7CisJCQlHRlBfS0VSTkVMKTsKIAlpZiAocHNJbnRmQWRhcHRlciA9PSBOVUxMKSB7CiAJCUFkYXB0ZXJGcmVlKHBzQWRhcHRlcik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjA1LDcgKzIxMyw3IEBACiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwc0ludGZBZGFwdGVyKTsKIAogCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkicHNJbnRmQWRhcHRlciAweCVwXG4iLCBwc0ludGZBZGFwdGVyKTsKKwkJCSJwc0ludGZBZGFwdGVyIDB4JXBcbiIsIHBzSW50ZkFkYXB0ZXIpOwogCXJldHZhbCA9IEludGVyZmFjZUFkYXB0ZXJJbml0KHBzSW50ZkFkYXB0ZXIpOwogCWlmIChyZXR2YWwpIHsKIAkJLyogSWYgdGhlIEZpcm13YXJlL0NmZyBGaWxlIGlzIG5vdCBwcmVzZW50CkBAIC0yMTMsMTIgKzIyMSwxMyBAQAogCQkgKiBkb3dubG9hZCB0aGUgZmlsZXMuCiAJCSAqLwogCQlpZiAoLUVOT0VOVCA9PSByZXR2YWwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCSJGaWxlIE5vdCBGb3VuZC4gIFVzZSBhcHAgdG8gZG93bmxvYWQuXG4iKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiRmlsZSBOb3QgRm91bmQuICBVc2UgYXBwIHRvIGRvd25sb2FkLlxuIik7CiAJCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJCX0KLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkiSW50ZXJmYWNlQWRhcHRlckluaXQgZmFpbGVkLlxuIik7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJREJHX0xWTF9BTEwsICJJbnRlcmZhY2VBZGFwdGVySW5pdCBmYWlsZWQuXG4iKTsKIAkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAkJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJCXVzYl9wdXRfZGV2KHVkZXYpOwpAQCAtMjI4LDcgKzIzNywxMCBAQAogCWlmIChwc0FkYXB0ZXItPmNoaXBfaWQgPiBUMykgewogCQl1aW50MzJfdCB1aU5hY2taZXJvTGVuZ3RoSW50ID0gNDsKIAotCQlyZXR2YWwgPSB3cm1hbHQocHNBZGFwdGVyLCBESVNBQkxFX1VTQl9aRVJPX0xFTl9JTlQsICZ1aU5hY2taZXJvTGVuZ3RoSW50LCBzaXplb2YodWlOYWNrWmVyb0xlbmd0aEludCkpOworCQlyZXR2YWwgPQorCQkJd3JtYWx0KHBzQWRhcHRlciwgRElTQUJMRV9VU0JfWkVST19MRU5fSU5ULAorCQkJCQkmdWlOYWNrWmVyb0xlbmd0aEludCwKKwkJCQkJc2l6ZW9mKHVpTmFja1plcm9MZW5ndGhJbnQpKTsKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJfQpAQCAtMjQyLDkgKzI1NCwxMSBAQAogCQkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CiAJCQl1c2JfZW5hYmxlX2F1dG9zdXNwZW5kKHVkZXYpOwogCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZpbnRmLT5kZXYsIDEpOwotCQkJSU5JVF9XT1JLKCZwc0ludGZBZGFwdGVyLT51c2JTdXNwZW5kV29yaywgcHV0VXNiU3VzcGVuZCk7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiRW5hYmxpbmcgVVNCIEF1dG8tU3VzcGVuZFxuIik7CisJCQlJTklUX1dPUksoJnBzSW50ZkFkYXB0ZXItPnVzYlN1c3BlbmRXb3JrLAorCQkJCQlwdXRVc2JTdXNwZW5kKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiRW5hYmxpbmcgVVNCIEF1dG8tU3VzcGVuZFxuIik7CiAjZW5kaWYKIAkJfSBlbHNlIHsKIAkJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwpAQCAtMjcxLDcgKzI4NSw3IEBACiAJaWYgKHBzQWRhcHRlci0+YkRvU3VzcGVuZCkKIAkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CiAKLQlwc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRSA7CisJcHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUU7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlJbnRlcmZhY2VBZGFwdGVyRnJlZShwc0ludGZBZGFwdGVyKTsKIAl1c2JfcHV0X2Rldih1ZGV2KTsKQEAgLTI4NSw4ICsyOTksMTAgQEAKIAkJcHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiQ2FuJ3QgYWxsb2NhdGUgVHggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJDYW4ndCBhbGxvY2F0ZSBUeCB1cmIgZm9yIGluZGV4ICVkXG4iLAorCQkJCQlpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQpAQCAtMjk1LDE5ICszMTEsMjUgQEAKIAkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCB1cmIgZm9yIGluZGV4ICVkXG4iLAorCQkJCQlpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa21hbGxvYyhNQVhfREFUQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggYnVmZmVyIGZvciBpbmRleCAlZFxuIiwgaSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCBidWZmZXIgZm9yIGluZGV4ICVkXG4iLAorCQkJCQlpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IE1BWF9EQVRBX0JVRkZFUl9TSVpFOworCQlwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPQorCQkJTUFYX0RBVEFfQlVGRkVSX1NJWkU7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzIyLDI0ICszNDQsMjkgQEAKIAkJcHJfZXJyKERSVl9OQU1FICJJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUgZmFpbGVkLlxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCWlmIChUUlVFID09IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSkgeworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpIHsKIAkJaWYgKFN0YXJ0SW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCSJDYW5ub3Qgc2VuZCBpbnRlcnJ1cHQgaW4gVVJCXG4iKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCURCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiQ2Fubm90IHNlbmQgaW50ZXJydXB0IGluIFVSQlxuIik7CiAJCX0KIAogCQkvKgotCQkgKiBub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4KLQkJICogYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIGYvdyB3YWl0aW5nIGZvciA1IHNlYyB0byBnZXQgdGhlIG1haWxib3ggaW50ZXJydXB0LgorCQkgKiBub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4gIGFmdGVyIGRvd25sb2FkaW5nIHRoZSBmL3cKKwkJICogd2FpdGluZyBmb3IgNSBzZWMgdG8gZ2V0IHRoZSBtYWlsYm94IGludGVycnVwdC4KIAkJICovCiAJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gZmFsc2U7Ci0JCXZhbHVlID0gd2FpdF9ldmVudF90aW1lb3V0KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAotCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwgNSpIWik7CisJCXZhbHVlID0gd2FpdF9ldmVudF90aW1lb3V0KAorCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAorCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLAorCQkJCTUgKiBIWik7CiAKIAkJaWYgKHZhbHVlID09IDApCiAJCQlwcl9lcnIoRFJWX05BTUUgIjogVGltZW91dCB3YWl0aW5nIGZvciBtYWlsYm94IGludGVycnVwdC5cbiIpOwogCi0JCWlmIChyZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKSA8IDApIHsKKwkJaWYgKHJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZSgKKwkJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKSA8IDApIHsKIAkJCXByX2VycihEUlZfTkFNRSAiOiBSZWdpc3RlciBDb250cm9sIERldmljZSBmYWlsZWQuXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0zNDcsODEgKzM3NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9udW0oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuIGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF90eXBlKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfeGZlcl9idWxrKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuIGJjbV91c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfaW4oZXBkKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaXNvY19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOwotfQotCiBzdGF0aWMgaW50IEludGVyZmFjZUFkYXB0ZXJJbml0KHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKnBzSW50ZkFkYXB0ZXIpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKQEAgLTQyOSwyMyArMzgxLDI3IEBACiAJc2l6ZV90IGJ1ZmZlcl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJaW50IHJldHZhbCA9IDA7Ci0JaW50IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSAwIDsKKwlpbnQgdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IDA7CiAJYm9vbCBiQmNtMTYgPSBmYWxzZTsKIAlVSU5UIHVpRGF0YSA9IDA7CiAJaW50IGJ5dGVzOwogCiAJLyogU3RvcmUgdGhlIHVzYiBkZXYgaW50byBpbnRlcmZhY2UgYWRhcHRlciAqLwotCXBzSW50ZkFkYXB0ZXItPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSkpOworCXBzSW50ZkFkYXB0ZXItPnVkZXYgPQorCQl1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSkpOwogCi0JcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9IChwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CisJcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9CisJCShwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5pbnRlcmZhY2VfcmRtID0gQmNtUkRNOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3dybSA9IEJjbVdSTTsKIAogCWJ5dGVzID0gcmRtYWx0KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgQ0hJUF9JRF9SRUcsCi0JCQkodTMyICopJihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpLCBzaXplb2YodTMyKSk7CisJCQkodTMyICopICYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKSwKKwkJCXNpemVvZih1MzIpKTsKIAlpZiAoYnl0ZXMgPCAwKSB7CiAJCXJldHZhbCA9IGJ5dGVzOwotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDSElQIElEIFJlYWQgRmFpbGVkXG4iKTsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJDSElQIElEIFJlYWQgRmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTQ1Myw4MSArNDA5LDExOSBAQAogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgJj0gfjB4RjA7CiAKIAlkZXZfaW5mbygmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LCAiUkRNIENoaXAgSUQgMHglbHhcbiIsCi0JCSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpOworCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKTsKIAogCWlmYWNlX2Rlc2MgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCiAJaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpIHsKLQkJLyogVDNCIGRldmljZSB3aWxsIGhhdmUgRUVQUk9NLCBjaGVjayBpZiBFRVBST00gaXMgcHJvcGVyIGFuZCBCQ00xNiBjYW4gYmUgZG9uZSBvciBub3QuICovCisJCS8qIFQzQiBkZXZpY2Ugd2lsbCBoYXZlIEVFUFJPTSwgY2hlY2sgaWYgRUVQUk9NIGlzIHByb3BlciBhbmQKKwkJICogQkNNMTYgY2FuIGJlIGRvbmUgb3Igbm90LiAqLwogCQlCZWNlZW1FRVBST01CdWxrUmVhZChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsICZ1aURhdGEsIDB4MCwgNCk7CiAJCWlmICh1aURhdGEgPT0gQkVDTSkKIAkJCWJCY20xNiA9IFRSVUU7CiAKLQkJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwgIm51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZyAlZFxuIiwKLQkJCSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKKwkJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwKKwkJCQkibnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5nICVkXG4iLAorCQkJCXBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOwogCiAJCWlmIChiQmNtMTYgPT0gVFJVRSkgewotCQkJLyogc2VsZWN0aW5nIGFsdGVybmF0ZSBzZXR0aW5nIG9uZSBhcyBhIGRlZmF1bHQgc2V0dGluZyBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCisJCQkvKiBzZWxlY3RpbmcgYWx0ZXJuYXRlIHNldHRpbmcgb25lIGFzIGEgZGVmYXVsdCBzZXR0aW5nCisJCQkgKiBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCiAJCQlpZiAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKLQkJCQlyZXR2YWwgPSB1c2Jfc2V0X2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT51ZGV2LCBERUZBVUxUX1NFVFRJTkdfMCwgQUxURVJOQVRFX1NFVFRJTkdfMSk7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiQkNNMTYgaXMgYXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZVxuIik7Ci0JCQlpZiAocmV0dmFsIHx8IChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IGZhbHNlKSkgewotCQkJCXVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSBFUDIgOworCQkJCXJldHZhbCA9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCQkJCQlERUZBVUxUX1NFVFRJTkdfMCwKKwkJCQkJCUFMVEVSTkFURV9TRVRUSU5HXzEpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwKKwkJCQkJREJHX0xWTF9BTEwsCisJCQkJCSJCQ00xNiBpcyBhcHBsaWNhYmxlIG9uIHRoaXMgZG9uZ2xlXG4iKTsKKwkJCWlmIChyZXR2YWwgfHwgIXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpIHsKKwkJCQl1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gRVAyOwogCQkJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W0VQMl0uZGVzYzsKLQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkJICJJbnRlcmZhY2UgYWx0c2V0dGluZyBmYWlsZWQgb3IgbW9kZW0gaXMgY29uZmlndXJlZCB0byBGdWxsIFNwZWVkLCBoZW5jZSB3aWxsIHdvcmsgb24gZGVmYXVsdCBzZXR0aW5nIDBcbiIpOworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQkJREJHX0xWTF9BTEwsCisJCQkJCQkiSW50ZXJmYWNlIGFsdHNldHRpbmcgZmFpbGVkIG9yIG1vZGVtIGlzIGNvbmZpZ3VyZWQgdG8gRnVsbCBTcGVlZCwgaGVuY2Ugd2lsbCB3b3JrIG9uIGRlZmF1bHQgc2V0dGluZyAwXG4iKTsKIAkJCQkvKgotCQkJCSAqIElmIE1vZGVtIGlzIGhpZ2ggc3BlZWQgZGV2aWNlIEVQMiBzaG91bGQgYmUgSU5UIE9VVCBFbmQgcG9pbnQKLQkJCQkgKiBJZiBNb2RlIGlzIEZTIHRoZW4gRVAyIHNob3VsZCBiZSBidWxrIGVuZCBwb2ludAorCQkJCSAqIElmIE1vZGVtIGlzIGhpZ2ggc3BlZWQgZGV2aWNlIEVQMiBzaG91bGQgYmUKKwkJCQkgKiBJTlQgT1VUIEVuZCBwb2ludAorCQkJCSAqCisJCQkJICogSWYgTW9kZSBpcyBGUyB0aGVuIEVQMiBzaG91bGQgYmUgYnVsayBlbmQKKwkJCQkgKiBwb2ludAogCQkJCSAqLwotCQkJCWlmICgoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkgJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gZmFsc2UpKQotCQkJCQl8fCAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gZmFsc2UpICYmIChiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSA9PSBmYWxzZSkpKSB7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkJIkNvbmZpZ3VyaW5nIHRoZSBFRVBST01cbiIpOworCQkJCWlmICgocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSAmJgorCQkJCQkJCSF1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHx8CisJCQkJCQkoIXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgJiYKKwkJCQkJCSAhdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJDb25maWd1cmluZyB0aGUgRUVQUk9NXG4iKTsKIAkJCQkJLyogY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCAqLwotCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOworCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJCQkJCS8qCi0JCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkCi0JCQkJCSAqICBpbiBVU0IgZGVzY3JpcHRvciBpdCB3aWxsIHNob3cgZmFpbCBhbmQgcmUtZW51bWVyYXRlCi0JCQkJCSAqIHRoZSBkZXZpY2UKKwkJCQkJICogSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZworCQkJCQkgKiBnZXRzIGNoYW5nZWQgaW4gVVNCIGRlc2NyaXB0b3IgaXQKKwkJCQkJICogd2lsbCBzaG93IGZhaWwgYW5kIHJlLWVudW1lcmF0ZSB0aGUKKwkJCQkJICogZGV2aWNlCiAJCQkJCSAqLwotCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYpOworCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKAorCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnVkZXYpOwogCQkJCQlpZiAocmV0dmFsKSB7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkJCQkicmVzZXQgZmFpbGVkLiAgUmUtZW51bWVyYXRpbmcgdGhlIGRldmljZS5cbiIpOwotCQkJCQkJcmV0dXJuIHJldHZhbCA7CisJCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQkJRFJWX0VOVFJZLAorCQkJCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKKwkJCQkJCXJldHVybiByZXR2YWw7CiAJCQkJCX0KIAogCQkJCX0KLQkJCQlpZiAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gZmFsc2UpICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CisJCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlICYmCisJCQkJICAgIHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKIAkJCQkJLyogT25jZSBCVUxLIGlzIHNlbGVjdGVkIGluIEZTIG1vZGUuIFJldmVydCBpdCBiYWNrIHRvIElOVC4gRWxzZSBVU0JfSUYgd2lsbCBmYWlsLiAqLwogCQkJCQlVSU5UIF91aURhdGEgPSBudG9obChFUDJfQ0ZHX0lOVCk7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkJIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBpbiBGdWxsIFNwZWVkIG1vZGUuXG4iKTsKLQkJCQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgKFBVQ0hBUikmX3VpRGF0YSwgMHgxMzYsIDQsIFRSVUUpOworCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJCURCR19UWVBFX0lOSVRFWElULAorCQkJCQkJCURSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkJIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBpbiBGdWxsIFNwZWVkIG1vZGUuXG4iKTsKKwkJCQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKAorCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQkoUFVDSEFSKSAmIF91aURhdGEsCisJCQkJCQkJMHgxMzYsIDQsIFRSVUUpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQNCA7CisJCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQNDsKIAkJCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtFUDRdLmRlc2M7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCSJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nLlxuIik7Ci0JCQkJaWYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gZmFsc2UpIHsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCQkiRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4LlxuIik7CisJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCURCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJCSJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nLlxuIik7CisJCQkJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJEb25nbGUgZG9lcyBub3QgaGF2ZSBCQ00xNiBGaXguXG4iKTsKIAkJCQkJLyogY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCBhbmQgdXNlIEVQNCBpbiBhbHRzZXR0aW5nICovCi0JCQkJCUNvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CisJCQkJCUNvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKAorCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKIAkJCQkJLyoKLQkJCQkJICogSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZyBnZXRzIGNoYW5nZWQgaW4KLQkJCQkJICogIFVTQiBkZXNjcmlwdG9yIGl0IHdpbGwgc2hvdyBmYWlsIGFuZCByZS1lbnVtZXJhdGUgdGhlCisJCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcKKwkJCQkJICogZ2V0cyBjaGFuZ2VkIGluIFVTQiBkZXNjcmlwdG9yIGl0CisJCQkJCSAqIHdpbGwgc2hvdyBmYWlsIGFuZCByZS1lbnVtZXJhdGUgdGhlCiAJCQkJCSAqIGRldmljZQogCQkJCQkgKi8KLQkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZShwc0ludGZBZGFwdGVyLT51ZGV2KTsKKwkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT51ZGV2KTsKIAkJCQkJaWYgKHJldHZhbCkgewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKKwkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQkJCURCR19UWVBFX0lOSVRFWElULAorCQkJCQkJCQlEUlZfRU5UUlksCisJCQkJCQkJCURCR19MVkxfQUxMLAorCQkJCQkJCQkicmVzZXQgZmFpbGVkLiAgUmUtZW51bWVyYXRpbmcgdGhlIGRldmljZS5cbiIpOwogCQkJCQkJcmV0dXJuIHJldHZhbDsKIAkJCQkJfQogCkBAIC01NDEsNDkgKzUzNSw2OSBAQAogCWZvciAodmFsdWUgPSAwOyB2YWx1ZSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKyt2YWx1ZSkgewogCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFt2YWx1ZV0uZGVzYzsKIAotCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgeworCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgJiYKKwkJCQl1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKIAkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fcGlwZSA9Ci0JCQkJCXVzYl9yY3ZidWxrcGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAotCQkJCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgPQorCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUoCisJCQkJCXBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIpOwogCQl9CiAKLQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKLQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9Ci0JCQkJdXNiX3NuZGJ1bGtwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCWlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCisJCQkJdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyID0KKwkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3BpcGUgPSB1c2Jfc25kYnVsa3BpcGUoCisJCQkJCXBzSW50ZkFkYXB0ZXItPnVkZXYsCiAJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7CiAJCX0KIAotCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpIHsKKwkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgJiYKKwkJCQl1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgewogCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwogCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgPQorCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwgPQorCQkJCWVuZHBvaW50LT5iSW50ZXJ2YWw7CiAJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIgPQotCQkJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlcikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkgeworCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyICYmCisJCQkJdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKSB7CiAJCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgotCQkJCShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSAmJiAodmFsdWUgPT0gdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlcikpIHsKKwkJCQkJKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpICYmCisJCQkJCSh2YWx1ZSA9PSB1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyKSkgewogCQkJCS8qIHVzZSBmaXJzdCBpbnRvdXQgZW5kIHBvaW50IGFzIGEgYnVsayBvdXQgZW5kIHBvaW50ICovCi0JCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3NpemUgPSBidWZmZXJfc2l6ZTsKLQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0gdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKLQkJCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQkJYnVmZmVyX3NpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3NpemUgPQorCQkJCQlidWZmZXJfc2l6ZTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPQorCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0KKwkJCQkJdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dAorCQkJCQkJCS5idWxrX291dF9lbmRwb2ludEFkZHIpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmludF9vdXRfaW50ZXJ2YWwgPQorCQkJCQllbmRwb2ludC0+YkludGVydmFsOwogCQkJfSBlbHNlIGlmICh2YWx1ZSA9PSBFUDYpIHsKLQkJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWJ1ZmZlcl9zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X3NpemUgPQorCQkJCQlidWZmZXJfc2l6ZTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2VuZHBvaW50QWRkciA9CisJCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfaW50ZXJ2YWwgPQorCQkJCQllbmRwb2ludC0+YkludGVydmFsOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfYnVmZmVyID0KKwkJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlcikKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC01OTQsMTQgKzYwOCwxNCBAQAogCiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iY21fZmlsZV9kb3dubG9hZCA9IEludGVyZmFjZUZpbGVEb3dubG9hZDsKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJjbV9maWxlX3JlYWRiYWNrX2Zyb21fY2hpcCA9Ci0JCQkJSW50ZXJmYWNlRmlsZVJlYWRiYWNrRnJvbUNoaXA7CisJCUludGVyZmFjZUZpbGVSZWFkYmFja0Zyb21DaGlwOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3RyYW5zbWl0ID0gSW50ZXJmYWNlVHJhbnNtaXRQYWNrZXQ7CiAKIAlyZXR2YWwgPSBDcmVhdGVJbnRlcnJ1cHRVcmIocHNJbnRmQWRhcHRlcik7CiAKIAlpZiAocmV0dmFsKSB7CiAJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCSJDYW5ub3QgY3JlYXRlIGludGVycnVwdCB1cmJcbiIpOworCQkJCSJDYW5ub3QgY3JlYXRlIGludGVycnVwdCB1cmJcbiIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIApAQCAtNjE4LDE3ICs2MzIsMjEgQEAKIAogCXBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPSBUUlVFOwogCi0JaWYgKFRSVUUgPT0gcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpIHsKKwlpZiAocHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpIHsKIAkJcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgPSBmYWxzZTsKIAogCQlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MaW5rU3RhdHVzID09IExJTktVUF9ET05FKSB7Ci0JCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPklkbGVNb2RlID0gVFJVRSA7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBJZGxlIE1vZGUuXG4iKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+SWRsZU1vZGUgPSBUUlVFOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwKKwkJCQkJREJHX0xWTF9BTEwsCisJCQkJCSJIb3N0IEVudGVyZWQgaW4gUE1VIElkbGUgTW9kZS5cbiIpOwogCQl9IGVsc2UgewogCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iU2h1dFN0YXR1cyA9IFRSVUU7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBTaHV0ZG93biBNb2RlLlxuIik7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJIkhvc3QgRW50ZXJlZCBpbiBQTVUgU2h1dGRvd24gTW9kZS5cbiIpOwogCQl9CiAJfQogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMKaW5kZXggN2IzOWY0Zi4uYjlmOGE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jCkBAIC00LDEwOCArNCwxMjYgQEAKIHN0YXRpYyB2b2lkIHJlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYi8qLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyovKQogewogCWludAkJc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0Jc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqcHNJbnRmQWRhcHRlciA9IChzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICopdXJiLT5jb250ZXh0OwotCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyIDsKKwlzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICpwc0ludGZBZGFwdGVyID0KKwkJKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7CiAKIAlpZiAobmV0aWZfbXNnX2ludHIoQWRhcHRlcikpCiAJCXByX2luZm8oUEZYICIlczogaW50ZXJydXB0IHN0YXR1cyAlZFxuIiwKLQkJCUFkYXB0ZXItPmRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIHN0YXR1cyk7CiAKLQlpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBUUlVFKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJEZXZpY2UgaGFzIEdvdCBSZW1vdmVkLiIpOwotCQlyZXR1cm4gOworCWlmIChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsICJEZXZpY2UgaGFzIEdvdCBSZW1vdmVkLiIpOworCQlyZXR1cm47CiAJfQogCi0JaWYoKChBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpICYmIChBZGFwdGVyLT5iRG9TdXNwZW5kID09IFRSVUUpKSB8fAotCQlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkIHx8Ci0JCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKQotCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiSW50ZXJydXB0IGNhbGwgYmFjayBpcyBjYWxsZWQgd2hpbGUgc3VzcGVuZGluZyB0aGUgZGV2aWNlIik7Ci0JCQlyZXR1cm4gOworCWlmICgoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSAmJiBBZGFwdGVyLT5iRG9TdXNwZW5kKSB8fAorCQkJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCB8fAorCQkJcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJJbnRlcnJ1cHQgY2FsbCBiYWNrIGlzIGNhbGxlZCB3aGlsZSBzdXNwZW5kaW5nIHRoZSBkZXZpY2UiKTsKKwkJcmV0dXJuOwogCX0KIAotCS8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJpbnRlcnJ1cHQgdXJiIHN0YXR1cyAlZCIsIHN0YXR1cyk7CiAJc3dpdGNoIChzdGF0dXMpIHsKLQkgICAgLyogc3VjY2VzcyAqLwotCSAgICBjYXNlIFNUQVRVU19TVUNDRVNTOgotCQlpZiAoIHVyYi0+YWN0dWFsX2xlbmd0aCApCi0JCXsKKwkvKiBzdWNjZXNzICovCisJY2FzZSBTVEFUVVNfU1VDQ0VTUzoKKwkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCi0JCQlpZihwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gJiAweEZGKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwgIkdvdCBVU0lNIGludGVycnVwdCIpOworCQkJaWYgKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSAmIDB4RkYpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJHb3QgVVNJTSBpbnRlcnJ1cHQiKTsKIAkJCX0KIAotCQkJaWYocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICYgMHhGRjAwKQotCQkJeworCQkJaWYgKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSAmIDB4RkYwMCkgewogCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLAotCQkJCQkocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICYgMHhGRjAwKSA+PiA4KTsKLQkJCQlhdG9taWNfc2V0ICgmQWRhcHRlci0+dWlNQnVwZGF0ZSwgVFJVRSk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCAiVFggbWFpbGJveCBjb250YWlucyAlZCIsCisJCQkJCShwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gJgorCQkJCQkgMHhGRjAwKSA+PiA4KTsKKwkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT51aU1CdXBkYXRlLCBUUlVFKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlJTlRGX0lOSVQsIERCR19MVkxfQUxMLAorCQkJCQkiVFggbWFpbGJveCBjb250YWlucyAlZCIsCiAJCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykpOwogCQkJfQotCQkJaWYocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdID4+IDE2KQotCQkJewotCQkJCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3M9CisJCQlpZiAocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdID4+IDE2KSB7CisJCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9CiAJCQkJCShwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gID4+IDE2KTsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIlJYIG1haWxib3ggY29udGFpbnMgJWQiLAotCQkJCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJSWCBtYWlsYm94IGNvbnRhaW5zICVkIiwKKwkJCQkJCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MpOwogCQkJCUludGVyZmFjZVJ4KHBzSW50ZkFkYXB0ZXIpOwogCQkJfQotCQkJaWYoQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSAmJgorCQkJaWYgKEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgJiYKIAkJCQkhQWRhcHRlci0+ZG93bmxvYWRERFIgJiYKLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKQotCQkJewotCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZG93bmxvYWRERFIgKz0xOworCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykpIHsKKworCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZG93bmxvYWRERFIgKz0gMTsKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CiAJCQl9Ci0JCQlpZihmYWxzZSA9PSBBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUpCi0JCQl7CisJCQlpZiAoIUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSkgewogCQkJCUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSA9IFRSVUU7CiAJCQkJd2FrZV91cCgmQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlKTsKIAkJCX0KLQkJCWlmKCFhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkpCi0JCQl7CisJCQlpZiAoIWF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKSkgewogCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDEpOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKIAkJCX0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiRmlyaW5nIGludGVycnVwdCBpbiBVUkIiKTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwKKwkJCQkJREJHX0xWTF9BTEwsICJGaXJpbmcgaW50ZXJydXB0IGluIFVSQiIpOwogCQl9CiAJCWJyZWFrOwotCQljYXNlIC1FTk9FTlQgOgotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIlVSQiBoYXMgZ290IGRpc2Nvbm5lY3RlZCAuLi4uIik7Ci0JCQlyZXR1cm4gOwotCQl9Ci0JCWNhc2UgLUVJTlBST0dSRVNTOgotCQl7Ci0JCQkvL1RoaXMgc2l0dWF0aW9uIG1heSBoYXBwZW5lZCB3aGVuIFVSQnVubGluayBpcyB1c2VkLiBmb3IgZGV0YWlsIGNoZWNrIHVzYl91bmxpbmtfdXJiIGRvY3VtZW50YXRpb24uCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkltcG9zc2liZSBjb25kaXRpb24gaGFzIG9jY3VycmVkLi4uIHNvbWV0aGluZyB2ZXJ5IGJhZCBpcyBnb2luZyBvbiIpOwotCQkJYnJlYWsgOwotCQkJLy9yZXR1cm47Ci0JCX0KLQkJY2FzZSAtRVBJUEU6Ci0JCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBJTiBlbmRQb2ludCAgaGFzIGdvdCBoYWx0ZWQvc3RhbGxlZC4uLm5lZWQgdG8gY2xlYXIgdGhpcyIpOwotCQkJCUFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9IFRSVUUgOwotCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKLQkJCQl1cmItPnN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQkJCQlyZXR1cm47Ci0JCX0KLQkgICAgLyogc29mdHdhcmUtZHJpdmVuIGludGVyZmFjZSBzaHV0ZG93biAqLwotCSAgICBjYXNlIC1FQ09OTlJFU0VUOiAvL1VSQiBnb3QgdW5saW5rZWQuCi0JICAgIGNhc2UgLUVTSFVURE9XTjoJCS8vIGhhcmR3YXJlIGdvbmUuIHRoaXMgaXMgdGhlIHNlcmlvdXMgcHJvYmxlbS4KLQkgICAgCQkJCQkJLy9PY2N1cnMgb25seSB3aGVuIHNvbWV0aGluZyBoYXBwZW5zIHdpdGggdGhlIGhvc3QgY29udHJvbGxlciBkZXZpY2UKLQkgICAgY2FzZSAtRU5PREVWIDogLy9EZXZpY2UgZ290IHJlbW92ZWQKLQkJY2FzZSAtRUlOVkFMIDogLy9Tb21lIHRoaW5nIHZlcnkgYmFkIGhhcHBlbmVkIHdpdGggdGhlIFVSQi4gTm8gZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlLgotCSAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJpbnRlcnJ1cHQgdXJiIGVycm9yICVkIiwgc3RhdHVzKTsKLQkJCXVyYi0+c3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwotCQkJYnJlYWsgOwotCQkJLy9yZXR1cm47Ci0JICAgIGRlZmF1bHQ6Ci0JCQkvL1RoaXMgaXMgcmVxdWlyZWQgdG8gY2hlY2sgd2hhdCBpcyB0aGUgZGVmYXVsdHMgY29uZGl0aW9ucyB3aGVuIGl0IG9jY3Vycy4uCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwiR09UIERFRkFVTFQgSU5URVJSVVBUIFVSQiBTVEFUVVMgOiVkLi5QbGVhc2UgQW5hbHl6ZSBpdC4uLiIsIHN0YXR1cyk7CisJY2FzZSAtRU5PRU5UOgorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsICJVUkIgaGFzIGdvdCBkaXNjb25uZWN0ZWQuLi4uIik7CisJCXJldHVybjsKKwljYXNlIC1FSU5QUk9HUkVTUzoKKwkJLyoKKwkJICogVGhpcyBzaXR1YXRpb24gbWF5IGhhcHBlbmVkIHdoZW4gVVJCdW5saW5rIGlzIHVzZWQuICBmb3IKKwkJICogZGV0YWlsIGNoZWNrIHVzYl91bmxpbmtfdXJiIGRvY3VtZW50YXRpb24uCisJCSAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkltcG9zc2liZSBjb25kaXRpb24gaGFzIG9jY3VycmVkLi4uIHNvbWV0aGluZyB2ZXJ5IGJhZCBpcyBnb2luZyBvbiIpOworCQlicmVhazsKKwkJLyogcmV0dXJuOyAqLworCWNhc2UgLUVQSVBFOgorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkludGVycnVwdCBJTiBlbmRQb2ludCBoYXMgZ290IGhhbHRlZC9zdGFsbGVkLi4ubmVlZCB0byBjbGVhciB0aGlzIik7CisJCUFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9IFRSVUU7CisJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKKwkJdXJiLT5zdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJcmV0dXJuOworCS8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KKwljYXNlIC1FQ09OTlJFU0VUOgkvKiBVUkIgZ290IHVubGlua2VkICovCisJY2FzZSAtRVNIVVRET1dOOgkvKiBoYXJkd2FyZSBnb25lLiB0aGlzIGlzIHRoZSBzZXJpb3VzIHByb2JsZW0gKi8KKwkJLyoKKwkJICogT2NjdXJzIG9ubHkgd2hlbiBzb21ldGhpbmcgaGFwcGVucyB3aXRoIHRoZQorCQkgKiBob3N0IGNvbnRyb2xsZXIgZGV2aWNlCisJCSAqLworCWNhc2UgLUVOT0RFVjogLyogRGV2aWNlIGdvdCByZW1vdmVkICovCisJY2FzZSAtRUlOVkFMOgorCQkvKgorCQkgKiBTb21lIHRoaW5nIHZlcnkgYmFkIGhhcHBlbmVkIHdpdGggdGhlIFVSQi4gTm8KKwkJICogZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlLgorCQkgKi8KKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLCAiaW50ZXJydXB0IHVyYiBlcnJvciAlZCIsIHN0YXR1cyk7CisJCXVyYi0+c3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCQkvKiByZXR1cm47ICovCisJZGVmYXVsdDoKKwkJLyoKKwkJICogVGhpcyBpcyByZXF1aXJlZCB0byBjaGVjayB3aGF0IGlzIHRoZSBkZWZhdWx0cyBjb25kaXRpb25zCisJCSAqIHdoZW4gaXQgb2NjdXJzLi4KKwkJICovCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwKKwkJCQkiR09UIERFRkFVTFQgSU5URVJSVVBUIFVSQiBTVEFUVVMgOiVkLi5QbGVhc2UgQW5hbHl6ZSBpdC4uLiIsCisJCQkJc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMTcsMjggKzEzNSwzMCBAQAogaW50IENyZWF0ZUludGVycnVwdFVyYihzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICpwc0ludGZBZGFwdGVyKQogewogCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkNhbm5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHQgdXJiIik7CisJaWYgKCFwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYikgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkiQ2Fubm90IGFsbG9jYXRlIGludGVycnVwdCB1cmIiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXIgPQotCQkJCQkJCQlwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGE7CisJCXBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YTsKIAlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9Ci0JCQkJCQkJc2l6ZW9mKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YSk7CisJCXNpemVvZihwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGEpOwogCiAJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCi0JCQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIpOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyKTsKIAogCXVzYl9maWxsX2ludF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIsIHBzSW50ZkFkYXB0ZXItPnVkZXYsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX3BpcGUsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJCQlyZWFkX2ludF9jYWxsYmFjaywgcHNJbnRmQWRhcHRlciwKLQkJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fcGlwZSwKKwkJCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCXJlYWRfaW50X2NhbGxiYWNrLCBwc0ludGZBZGFwdGVyLAorCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOwogCi0JQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBJbnRlcnZhbDogJWRcbiIsCi0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOworCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJREJHX0xWTF9BTEwsICJJbnRlcnJ1cHQgSW50ZXJ2YWw6ICVkXG4iLAorCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDcsMTkgKzE2NywyMCBAQAogewogCUlOVCBzdGF0dXMgPSAwOwogCi0JaWYoIGZhbHNlID09IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgJiYKLQkJZmFsc2UgPT0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgJiYKLQkJZmFsc2UgPT0gcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCAmJgotCQlmYWxzZSA9PSBwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCAmJgotCQlmYWxzZSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uKQotCXsKLQkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIsIEdGUF9BVE9NSUMpOwotCQlpZiAoc3RhdHVzKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiQ2Fubm90IHNlbmQgaW50IHVyYiAlZFxuIiwgc3RhdHVzKTsKLQkJCWlmKHN0YXR1cyA9PSAtRVBJUEUpCi0JCQl7Ci0JCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgPSBUUlVFIDsKKwlpZiAoIShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkIHx8CisJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgfHwKKwkJCQlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkIHx8CisJCQkJcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgfHwKKwkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uKSkgeworCQlzdGF0dXMgPQorCQkJdXNiX3N1Ym1pdF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsCisJCQkJCSJDYW5ub3Qgc2VuZCBpbnR1cmIgJWRcbiIsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzID09IC1FUElQRSkgeworCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YkVuZFBvaW50SGFsdGVkID0KKwkJCQkJVFJVRTsKIAkJCQl3YWtlX3VwKCZwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMKaW5kZXggMDcyNzU5OS4uNGYzMTU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Fvcy5jCkBAIC0yMjIsMTAgKzIyMiw3IEBACiAKIAkJLy9DaGVja2luZyBjbGFzc2lmaWVyIHZhbGlkaXR5CiAJCWlmICghcHN0Q2xhc3NpZmllclJ1bGUtPmJVc2VkIHx8IHBzdENsYXNzaWZpZXJSdWxlLT51Y0RpcmVjdGlvbiA9PSBET1dOTElOS19ESVIpCi0JCXsKLQkJCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBmYWxzZTsKIAkJCWJyZWFrOwotCQl9CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJpcyBJUHY2IGNoZWNrISIpOwogCQlpZiAocHN0Q2xhc3NpZmllclJ1bGUtPmJJcHY2UHJvdG9jb2wpCkBAIC0yMzMsNTEgKzIzMCw0NyBAQAogCiAJCS8vKioqKioqKioqKioqKipDaGVja2luZyBJUCBoZWFkZXIgcGFyYW1ldGVyKioqKioqKioqKioqKioqKioqKioqKioqKiovLwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlRyeWluZyB0byBtYXRjaCBTb3VyY2UgSVAgQWRkcmVzcyIpOwotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hTcmNJcEFkZHJlc3MocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPnNhZGRyKSkpCisJCWlmICghTWF0Y2hTcmNJcEFkZHJlc3MocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPnNhZGRyKSkKIAkJCWJyZWFrOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlNvdXJjZSBJUCBBZGRyZXNzIE1hdGNoZWQiKTsKIAotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hEZXN0SXBBZGRyZXNzKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5kYWRkcikpKQorCQlpZiAoIU1hdGNoRGVzdElwQWRkcmVzcyhwc3RDbGFzc2lmaWVyUnVsZSwgaXBoZC0+ZGFkZHIpKQogCQkJYnJlYWs7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiRGVzdGluYXRpb24gSVAgQWRkcmVzcyBNYXRjaGVkIik7CiAKLQkJaWYgKGZhbHNlID09IChiQ2xhc3NpZmljYXRpb25TdWNjZWVkID0KLQkJCU1hdGNoVG9zKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT50b3MpKSkKLQkJeworCQlpZiAoIU1hdGNoVG9zKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT50b3MpKSB7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlRPUyBNYXRjaCBmYWlsZWRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJUT1MgTWF0Y2hlZCIpOwogCi0JCWlmIChmYWxzZSA9PSAoYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9Ci0JCQlNYXRjaFByb3RvY29sKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5wcm90b2NvbCkpKQorCQlpZiAoIU1hdGNoUHJvdG9jb2wocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPnByb3RvY29sKSkKIAkJCWJyZWFrOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlByb3RvY29sIE1hdGNoZWQiKTsKIAogCQkvL2lmIHByb3RvY29sIGlzIG5vdCBUQ1Agb3IgVURQIHRoZW4gbm8gbmVlZCBvZiBjb21wYXJpbmcgc291cmNlIHBvcnQgYW5kIGRlc3RpbmF0aW9uIHBvcnQKLQkJaWYgKGlwaGQtPnByb3RvY29sICE9IFRDUCAmJiBpcGhkLT5wcm90b2NvbCAhPSBVRFApCisJCWlmIChpcGhkLT5wcm90b2NvbCAhPSBUQ1AgJiYgaXBoZC0+cHJvdG9jb2wgIT0gVURQKSB7CisJCQliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gVFJVRTsKIAkJCWJyZWFrOworCQl9CiAJCS8vKioqKioqKioqKioqKioqKioqQ2hlY2tpbmcgVHJhbnNwb3J0IExheWVyIEhlYWRlciBmaWVsZCBpZiBwcmVzZW50ICoqKioqKioqKioqKioqKioqLy8KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgUG9ydCAlMDR4IiwKIAkJCShpcGhkLT5wcm90b2NvbCA9PSBVRFApID8geHBydF9oZHItPnVoZHIuc291cmNlIDogeHBydF9oZHItPnRoZHIuc291cmNlKTsKIAotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hTcmNQb3J0KHBzdENsYXNzaWZpZXJSdWxlLAotCQkJCW50b2hzKChpcGhkLT5wcm90b2NvbCA9PSBVRFApID8KLQkJCQl4cHJ0X2hkci0+dWhkci5zb3VyY2UgOiB4cHJ0X2hkci0+dGhkci5zb3VyY2UpKSkpCisJCWlmICghTWF0Y2hTcmNQb3J0KHBzdENsYXNzaWZpZXJSdWxlLAorCQkJCSAgbnRvaHMoKGlwaGQtPnByb3RvY29sID09IFVEUCkgPworCQkJCSAgeHBydF9oZHItPnVoZHIuc291cmNlIDogeHBydF9oZHItPnRoZHIuc291cmNlKSkpCiAJCQlicmVhazsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJTcmMgUG9ydCBNYXRjaGVkIik7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJEZXN0aW5hdGlvbiBQb3J0ICUwNHgiLAogCQkJKGlwaGQtPnByb3RvY29sID09IFVEUCkgPyB4cHJ0X2hkci0+dWhkci5kZXN0IDoKIAkJCXhwcnRfaGRyLT50aGRyLmRlc3QpOwotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hEZXN0UG9ydChwc3RDbGFzc2lmaWVyUnVsZSwKLQkJCW50b2hzKChpcGhkLT5wcm90b2NvbCA9PSBVRFApID8KLQkJCXhwcnRfaGRyLT51aGRyLmRlc3QgOiB4cHJ0X2hkci0+dGhkci5kZXN0KSkpKQorCQlpZiAoIU1hdGNoRGVzdFBvcnQocHN0Q2xhc3NpZmllclJ1bGUsCisJCQkJICAgbnRvaHMoKGlwaGQtPnByb3RvY29sID09IFVEUCkgPworCQkJCSAgIHhwcnRfaGRyLT51aGRyLmRlc3QgOiB4cHJ0X2hkci0+dGhkci5kZXN0KSkpCiAJCQlicmVhazsKKwkJYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9IFRSVUU7CiAJfSB3aGlsZSAoMCk7CiAKIAlpZiAoVFJVRSA9PSBiQ2xhc3NpZmljYXRpb25TdWNjZWVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9UeXBlZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UeXBlZGVmcy5oCmluZGV4IDgzMmFkY2YuLjkwYjNiMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVHlwZWRlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1R5cGVkZWZzLmgKQEAgLTI1LDE2ICsyNSwxNiBAQAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMT05HOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIERXT1JEOwogCi10eXBlZGVmIGNoYXIqIFBDSEFSOwotdHlwZWRlZiBzaG9ydCogUFNIT1JUOwotdHlwZWRlZiBpbnQqIFBJTlQ7Ci10eXBlZGVmIGxvbmcqIFBMT05HOwotdHlwZWRlZiB2b2lkKiBQVk9JRDsKK3R5cGVkZWYgY2hhciAqUENIQVI7Cit0eXBlZGVmIHNob3J0ICpQU0hPUlQ7Cit0eXBlZGVmIGludCAqUElOVDsKK3R5cGVkZWYgbG9uZyAqUExPTkc7Cit0eXBlZGVmIHZvaWQgKlBWT0lEOwogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIqIFBVQ0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQqIFBVU0hPUlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGludCogUFVJTlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcqIFBVTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqUFVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqUFVTSE9SVDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICpQVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAqUFVMT05HOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUxPTkc2NDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIExBUkdFX0lOVEVHRVI7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7CkBAIC00Myw1ICs0Myw1IEBACiAjZW5kaWYKIAogCi0jZW5kaWYJLy9fX1RZUEVERUZTX0hfXworI2VuZGlmCS8qIF9fVFlQRURFRlNfSF9fICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmgKaW5kZXggN2ZkMjFjNi4uNmYzMjcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmgKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgIlR5cGVkZWZzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMKaW5kZXggZjU1MzAwZC4uMzlhY2U1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYwpAQCAtMjcsOSArMjcsOSBAQAogCS8qIENvcHkgdGhlIGNsYXNzaWZpZXIgVGFibGUgKi8KIAlmb3IgKG5DbGFzc2lmaWVySW5kZXggPSAwOyBuQ2xhc3NpZmllckluZGV4IDwgTUFYX0NMQVNTSUZJRVJTOyBuQ2xhc3NpZmllckluZGV4KyspIHsKIAkJaWYgKEFkYXB0ZXItPmFzdENsYXNzaWZpZXJUYWJsZVtuQ2xhc3NpZmllckluZGV4XS5iVXNlZCA9PSBUUlVFKQotCQkJbWVtY3B5KChQVk9JRCkgJiBwc3RIb3N0TWlicy0+CisJCQltZW1jcHkoKFBWT0lEKSAmcHN0SG9zdE1pYnMtPgogCQkJICAgICAgIGFzdENsYXNzaWZpZXJUYWJsZVtuQ2xhc3NpZmllckluZGV4XSwKLQkJCSAgICAgICAoUFZPSUQpICYgQWRhcHRlci0+CisJCQkgICAgICAgKFBWT0lEKSAmQWRhcHRlci0+CiAJCQkgICAgICAgYXN0Q2xhc3NpZmllclRhYmxlW25DbGFzc2lmaWVySW5kZXhdLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmNtX21pYnNfY2xhc3NpZmllcl9ydWxlKSk7CiAJfQpAQCAtMzcsOCArMzcsOCBAQAogCS8qIENvcHkgdGhlIFNGIFRhYmxlICovCiAJZm9yIChuU2ZJbmRleCA9IDA7IG5TZkluZGV4IDwgTk9fT0ZfUVVFVUVTOyBuU2ZJbmRleCsrKSB7CiAJCWlmIChBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0uYlZhbGlkKSB7Ci0JCQltZW1jcHkoKFBWT0lEKSAmIHBzdEhvc3RNaWJzLT5hc3RTRnRhYmxlW25TZkluZGV4XSwKLQkJCSAgICAgICAoUFZPSUQpICYgQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLAorCQkJbWVtY3B5KChQVk9JRCkgJnBzdEhvc3RNaWJzLT5hc3RTRnRhYmxlW25TZkluZGV4XSwKKwkJCSAgICAgICAoUFZPSUQpICZBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0sCiAJCQkJc2l6ZW9mKHN0cnVjdCBiY21fbWlic190YWJsZSkpOwogCQl9IGVsc2UgewogCQkJLyogSWYgaW5kZXggaW4gbm90IHZhbGlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKaW5kZXggZmNhMTY0Zi4uNjNiZTNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCkBAIC0xMjIsNyArMTIyLDcgQEAKICAqCQlPU0FMX1NUQVRVU19DT0RFOgogICovCiAKLWludCBSZWFkQmVjZWVtRUVQUk9NQnVsayhzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwKK3N0YXRpYyBpbnQgUmVhZEJlY2VlbUVFUFJPTUJ1bGsoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsCiAJCQlEV09SRCBkd0FkZHJlc3MsCiAJCQlEV09SRCAqcGR3RGF0YSwKIAkJCURXT1JEIGR3TnVtV29yZHMpCkBAIC0yNjk4LDcgKzI2OTgsNyBAQAogICogT24gRmFpbHVyZSAtcmV0dXJucyBTVEFUVVNfRkFJTFVSRQogICovCiAKLWludCBCY21HZXRTZWN0aW9uVmFsRW5kT2Zmc2V0KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCkKK3N0YXRpYyBpbnQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBlRmxhc2gyeFNlY3Rpb25WYWwpCiB7CiAJaW50IFNlY3RFbmRPZmZzZXQgPSAwOwogCkBAIC0yOTgwLDcgKzI5ODAsNyBAQAogICoKICAqLwogCi1CX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHVuc2lnbmVkIGludCB1aU9mZnNldCkKK3N0YXRpYyBCX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHVuc2lnbmVkIGludCB1aU9mZnNldCkKIHsKIAl1bnNpZ25lZCBpbnQgdWlTZWN0b3JOdW0gPSAwOwogCXVuc2lnbmVkIGludCB1aVdvcmRPZlNlY3RvclBlcm1pc3Npb24gPSAwOwpAQCAtMzM3NCw3ICszMzc0LDcgQEAKIAljYXNlIERTRDI6CiAJCWlmIChSZWFkRFNEU2lnbmF0dXJlKEFkYXB0ZXIsIGVGbGFzaDJ4U2VjdFZhbCkgPT0gRFNEX0lNQUdFX01BR0lDX05VTUJFUikgewogCQkJSGlnaGVzdFByaURTRCA9IGdldEhpZ2hlc3RQcmlEU0QoQWRhcHRlcik7Ci0JCQlpZiAoKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSkgeworCQkJaWYgKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIkdpdmVuIERTRDwleD4gYWxyZWFkeSBoYXMgaGlnaGVzdCBwcmlvcml0eSIsIGVGbGFzaDJ4U2VjdFZhbCk7CiAJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQkJYnJlYWs7CkBAIC0zNDAyLDcgKzM0MDIsNyBAQAogCiAJCQkJSGlnaGVzdFByaURTRCA9IGdldEhpZ2hlc3RQcmlEU0QoQWRhcHRlcik7CiAKLQkJCQlpZiAoKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSkgeworCQkJCWlmIChIaWdoZXN0UHJpRFNEID09IGVGbGFzaDJ4U2VjdFZhbCkgewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiTWFkZSB0aGUgRFNEOiAleCBoaWdoZXN0IGJ5IHJlZHVjaW5nIHByaW9yaXR5IG9mIG90aGVyXG4iLCBlRmxhc2gyeFNlY3RWYWwpOwogCQkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCQkJYnJlYWs7CkBAIC0zNDIxLDcgKzM0MjEsNyBAQAogCQkJCX0KIAogCQkJCUhpZ2hlc3RQcmlEU0QgPSBnZXRIaWdoZXN0UHJpRFNEKEFkYXB0ZXIpOwotCQkJCWlmICgoSGlnaGVzdFByaURTRCA9PSBlRmxhc2gyeFNlY3RWYWwpKSB7CisJCQkJaWYgKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSB7CiAJCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC00MDc0LDcgKzQwNzQsNyBAQAogICoJRmFpbGx1cmUgOi0gUmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUKICAqLwogCi1pbnQgU2F2ZUhlYWRlcklmUHJlc2VudChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgUFVDSEFSIHBCdWZmLCB1bnNpZ25lZCBpbnQgdWlPZmZzZXQpCitzdGF0aWMgaW50IFNhdmVIZWFkZXJJZlByZXNlbnQoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIFBVQ0hBUiBwQnVmZiwgdW5zaWduZWQgaW50IHVpT2Zmc2V0KQogewogCXVuc2lnbmVkIGludCBvZmZzZXRUb1Byb3RlY3QgPSAwLCBIZWFkZXJTaXplVG9Qcm90ZWN0ID0gMDsKIAlib29sIGJIYXNIZWFkZXIgPSBmYWxzZTsKQEAgLTQyMTMsNyArNDIxMyw3IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi1pbnQgUmVhZERTRFNpZ25hdHVyZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBkc2QpCitzdGF0aWMgaW50IFJlYWREU0RTaWduYXR1cmUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZHNkKQogewogCXVuc2lnbmVkIGludCB1aURTRHNpZyA9IDA7CiAJLyogdW5zaWduZWQgaW50IHNpZ29mZnNldEluTWFwID0gMDsKQEAgLTQyMzgsNyArNDIzOCw3IEBACiAJcmV0dXJuIHVpRFNEc2lnOwogfQogCi1pbnQgUmVhZERTRFByaW9yaXR5KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGRzZCkKK3N0YXRpYyBpbnQgUmVhZERTRFByaW9yaXR5KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGRzZCkKIHsKIAkvKiB1bnNpZ25lZCBpbnQgcHJpT2Zmc2V0SW5NYXAgPSAwIDsgKi8KIAl1bnNpZ25lZCBpbnQgdWlEU0RQcmkgPSBTVEFUVVNfRkFJTFVSRTsKQEAgLTQyNjEsNyArNDI2MSw3IEBACiAJcmV0dXJuIHVpRFNEUHJpOwogfQogCi1lbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGdldEhpZ2hlc3RQcmlEU0Qoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCitzdGF0aWMgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBnZXRIaWdoZXN0UHJpRFNEKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQogewogCWludCBEU0RIaWdoZXN0UHJpID0gU1RBVFVTX0ZBSUxVUkU7CiAJaW50IERzZFByaSA9IDA7CkBAIC00MjkzLDcgKzQyOTMsNyBAQAogCXJldHVybiAgSGlnaGVzdFByaURTRDsKIH0KIAotaW50IFJlYWRJU09TaWduYXR1cmUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgaXNvKQorc3RhdGljIGludCBSZWFkSVNPU2lnbmF0dXJlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGlzbykKIHsKIAl1bnNpZ25lZCBpbnQgdWlJU09zaWcgPSAwOwogCS8qIHVuc2lnbmVkIGludCBzaWdvZmZzZXRJbk1hcCA9IDA7CkBAIC00MzE2LDcgKzQzMTYsNyBAQAogCXJldHVybiB1aUlTT3NpZzsKIH0KIAotaW50IFJlYWRJU09Qcmlvcml0eShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBpc28pCitzdGF0aWMgaW50IFJlYWRJU09Qcmlvcml0eShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBpc28pCiB7CiAJdW5zaWduZWQgaW50IElTT1ByaSA9IFNUQVRVU19GQUlMVVJFOwogCWlmIChJc1NlY3Rpb25Xcml0YWJsZShBZGFwdGVyLCBpc28pKSB7CkBAIC00MzM1LDcgKzQzMzUsNyBAQAogCXJldHVybiBJU09Qcmk7CiB9CiAKLWVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZ2V0SGlnaGVzdFByaUlTTyhzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3N0YXRpYyBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGdldEhpZ2hlc3RQcmlJU08oc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJaW50IElTT0hpZ2hlc3RQcmkgPSBTVEFUVVNfRkFJTFVSRTsKIAlpbnQgSVNPUHJpID0gMDsKQEAgLTQzNTksNyArNDM1OSw3IEBACiAJcmV0dXJuIEhpZ2hlc3RQcmlJU087CiB9CiAKLWludCBXcml0ZVRvRmxhc2hXaXRob3V0U2VjdG9yRXJhc2Uoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsCitzdGF0aWMgaW50IFdyaXRlVG9GbGFzaFdpdGhvdXRTZWN0b3JFcmFzZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwKIAkJCQlQVUlOVCBwQnVmZiwKIAkJCQllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCwKIAkJCQl1bnNpZ25lZCBpbnQgdWlPZmZzZXQsCkBAIC00NDcyLDcgKzQ0NzIsNyBAQAogCXJldHVybiBTZWN0aW9uUHJlc2VudDsKIH0KIAotaW50IElzU2VjdGlvbldyaXRhYmxlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIFNlY3Rpb24pCitzdGF0aWMgaW50IElzU2VjdGlvbldyaXRhYmxlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIFNlY3Rpb24pCiB7CiAJaW50IG9mZnNldCA9IFNUQVRVU19GQUlMVVJFOwogCWludCBTdGF0dXMgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL2NlZF9pb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL2NlZF9pb2MuYwppbmRleCBiZjUzMmIxLi5lYmJjNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvYy5jCkBAIC0zOCw4ICszOCw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgRmx1c2hPdXRCdWZmKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY3VycmVudFN0YXRlPSVkIiwgX19mdW5jX18sCi0JCXBkeC0+c0N1cnJlbnRTdGF0ZSk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBjdXJyZW50U3RhdGU9JWRcbiIsCisJCV9fZnVuY19fLCBwZHgtPnNDdXJyZW50U3RhdGUpOwogCWlmIChwZHgtPnNDdXJyZW50U3RhdGUgPT0gVTE0RVJSX1RJTUUpCS8qIERvIG5vdGhpbmcgaWYgaGFyZHdhcmUgaW4gdHJvdWJsZSAqLwogCQlyZXR1cm47CiAJLyogS2lsbCBvZmYgYW55IHBlbmRpbmcgSS9PICovCkBAIC01OSw4ICs1OSw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgRmx1c2hJbkJ1ZmYoREVWSUNFX0VYVEVOU0lPTiAqcGR4KQogewotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBjdXJyZW50U3RhdGU9JWQiLCBfX2Z1bmNfXywKLQkJcGR4LT5zQ3VycmVudFN0YXRlKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGN1cnJlbnRTdGF0ZT0lZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+c0N1cnJlbnRTdGF0ZSk7CiAJaWYgKHBkeC0+c0N1cnJlbnRTdGF0ZSA9PSBVMTRFUlJfVElNRSkJLyogRG8gbm90aGluZyBpZiBoYXJkd2FyZSBpbiB0cm91YmxlICovCiAJCXJldHVybjsKIAkvKiBLaWxsIG9mZiBhbnkgcGVuZGluZyBJL08gKi8KQEAgLTExOCw4ICsxMTgsOCBAQAogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCiAJaWYgKG4gPiAwKSB7CQkvKiAgZG8gbm90aGluZyBpZiBub3d0IHRvIGRvISAqLwotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgbj0lZD4lczwiLCBfX2Z1bmNfXywgbiwKLQkJCWJ1ZmZlcik7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogbj0lZD4lczxcbiIsCisJCQlfX2Z1bmNfXywgbiwgYnVmZmVyKTsKIAkJaVJldHVybiA9IFB1dENoYXJzKHBkeCwgYnVmZmVyLCBuKTsKIAl9CiAKQEAgLTEzOSw3ICsxMzksNyBAQAogCWludCBpUmV0dXJuOwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwkvKiAgUHJvdGVjdCBkaXNjb25uZWN0IGZyb20gbmV3IGkvbyAqLwogCWlSZXR1cm4gPSBQdXRDaGFycyhwZHgsICZjLCAxKTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiU2VuZENoYXIgPiVjPCAoMHglMDJ4KSIsIGMsIGMpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJTZW5kQ2hhciA+JWM8ICgweCUwMngpXG4iLCBjLCBjKTsKIAlBbGxvd2kocGR4KTsJLyogIE1ha2Ugc3VyZSBjaGFyIHJlYWRzIGFyZSBydW5uaW5nICovCiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKIAlyZXR1cm4gaVJldHVybjsKQEAgLTE3NCw3ICsxNzQsNyBAQAogaW50IEdldDE0MDFTdGF0ZShERVZJQ0VfRVhURU5TSU9OICpwZHgsIF9fdTMyICpzdGF0ZSwgX191MzIgKmVycm9yKQogewogCWludCBuR290OwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJHZXQxNDAxU3RhdGUoKSBlbnRyeSIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKIAogCSpzdGF0ZSA9IDB4RkZGRkZGRkY7CS8qICBTdGFydCBvZmYgd2l0aCBpbnZhbGlkIHN0YXRlICovCiAJbkdvdCA9IHVzYl9jb250cm9sX21zZyhwZHgtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZShwZHgtPnVkZXYsIDApLApAQCAtMTgyLDE1ICsxODIsMTUgQEAKIAkJCSAgICAgICBwZHgtPnN0YXRCdWYsIHNpemVvZihwZHgtPnN0YXRCdWYpLCBIWik7CiAJaWYgKG5Hb3QgIT0gc2l6ZW9mKHBkeC0+c3RhdEJ1ZikpIHsKIAkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJHZXQxNDAxU3RhdGUoKSBGQUlMRUQsIHJldHVybiBjb2RlICVkIiwgbkdvdCk7CisJCQkiJXM6IEZBSUxFRCwgcmV0dXJuIGNvZGUgJWRcbiIsIF9fZnVuY19fLCBuR290KTsKIAkJcGR4LT5zQ3VycmVudFN0YXRlID0gVTE0RVJSX1RJTUU7CS8qICBJbmRpY2F0ZSB0aGF0IHRoaW5ncyBhcmUgdmVyeSB3cm9uZyBpbmRlZWQgKi8KIAkJKnN0YXRlID0gMDsJLyogIEZvcmNlIHN0YXR1cyB2YWx1ZXMgdG8gYSBrbm93biBzdGF0ZSAqLwogCQkqZXJyb3IgPSAwOwogCX0gZWxzZSB7CiAJCWludCBuRGV2aWNlOwogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIkdldDE0MDFTdGF0ZSgpIFN1Y2Nlc3MsIHN0YXRlOiAweCV4LCAweCV4IiwKLQkJCXBkeC0+c3RhdEJ1ZlswXSwgcGR4LT5zdGF0QnVmWzFdKTsKKwkJCSIlczogU3VjY2Vzcywgc3RhdGU6IDB4JXgsIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcGR4LT5zdGF0QnVmWzBdLCBwZHgtPnN0YXRCdWZbMV0pOwogCiAJCSpzdGF0ZSA9IHBkeC0+c3RhdEJ1ZlswXTsJLyogIFJldHVybiB0aGUgc3RhdGUgdmFsdWVzIHRvIHRoZSBjYWxsaW5nIGNvZGUgKi8KIAkJKmVycm9yID0gcGR4LT5zdGF0QnVmWzFdOwpAQCAtMjIwLDggKzIyMCw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IFJlYWRXcml0ZV9DYW5jZWwoREVWSUNFX0VYVEVOU0lPTiAqcGR4KQogewotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJSZWFkV3JpdGVfQ2FuY2VsIGVudHJ5ICVkIiwKLQkJcGR4LT5iU3RhZ2VkVXJiUGVuZGluZyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlbnRyeSAlZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+YlN0YWdlZFVyYlBlbmRpbmcpOwogI2lmZGVmIE5PVF9XUklUVEVOX1lFVAogCWludCBudFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCWJvb2wgYlJlc3VsdCA9IGZhbHNlOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAKIAlpZiAocGR4LT5iU3RhZ2VkVXJiUGVuZGluZykgewkvKiAgYW55dGhpbmcgdG8gYmUgY2FuY2VsbGVkPyBNYXkgbmVlZCBtb3JlLi4uICovCiAJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZSAtIGRldiwKLQkJCSAiUmVhZFdyaXRlX0NhbmNlbCBhYm91dCB0byBjYW5jZWwgVXJiIik7CisJCQkgIlJlYWRXcml0ZV9DYW5jZWwgYWJvdXQgdG8gY2FuY2VsIFVyYlxuIik7CiAJCS8qIENsZWFyIHRoZSBzdGFnaW5nIGRvbmUgZmxhZyAqLwogCQkvKiBLZUNsZWFyRXZlbnQoJnBkeC0+U3RhZ2luZ0RvbmVFdmVudCk7ICovCiAJCVVTQl9BU1NFUlQocGR4LT5wU3RhZ2VkSXJwICE9IE5VTEwpOwpAQCAtMjQ0LDE0ICsyNDQsMTQgQEAKIAkJCUxBUkdFX0lOVEVHRVIgdGltZW91dDsKIAkJCXRpbWVvdXQuUXVhZFBhcnQgPSAtMTAwMDAwMDA7CS8qICBVc2UgYSB0aW1lb3V0IG9mIDEgc2Vjb25kICovCiAJCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UgLSBkZXYsCi0JCQkJICJSZWFkV3JpdGVfQ2FuY2VsIGFib3V0IHRvIHdhaXQgdGlsbCBkb25lIik7CisJCQkJICIlczogYWJvdXQgdG8gd2FpdCB0aWxsIGRvbmVcbiIsIF9fZnVuY19fKTsKIAkJCW50U3RhdHVzID0KIAkJCSAgICBLZVdhaXRGb3JTaW5nbGVPYmplY3QoJnBkeC0+U3RhZ2luZ0RvbmVFdmVudCwKIAkJCQkJCSAgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwKIAkJCQkJCSAgJnRpbWVvdXQpOwogCQl9IGVsc2UgewogCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlIC0gZGV2LAotCQkJCSAiUmVhZFdyaXRlX0NhbmNlbCwgY2FuY2VsbGF0aW9uIGZhaWxlZCIpOworCQkJCSAiJXM6IGNhbmNlbGxhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCW50U3RhdHVzID0gVTE0RVJSX0ZBSUw7CiAJCX0KIAkJVVNCX0tkUHJpbnQoREJHTFZMX0RFRkFVTFQsCkBAIC0yNjAsNyArMjYwLDcgQEAKIAl9IGVsc2UKIAkJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPnN0YWdlZExvY2spOwogCi0JZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlIC0gZGV2LCAiUmVhZFdyaXRlX0NhbmNlbCAgZG9uZSIpOworCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZSAtIGRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIG50U3RhdHVzOwogI2Vsc2UKIAlyZXR1cm4gVTE0RVJSX05PRVJST1I7CkBAIC0zMDQsNyArMzA0LDcgQEAKIGJvb2wgSXMxNDAxKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKIAlpbnQgaVJldHVybjsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAljZWRfZHJhd19kb3duKHBkeCk7CS8qICB3YWl0IGZvciwgdGhlbiBraWxsIG91dHN0YW5kaW5nIFVyYnMgKi8KIAlGbHVzaEluQnVmZihwZHgpOwkvKiAgQ2xlYXIgb3V0IGlucHV0IGJ1ZmZlciAmIHBpcGUgKi8KQEAgLTM2OCw3ICszNjgsNyBAQAogCQkgICAgICAocGR4LT5zQ3VycmVudFN0YXRlID49IFUxNEVSUl9TVEQpKTsJLyogIE5vIDE0MDEgZXJyb3JzIHN0b3JlZCAqLwogCiAJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJIiVzIERNQUZsYWc6JWQsIHN0YXRlOiVkLCBmb3JjZTolZCwgdGVzdEJ1ZmY6JWQsIHNob3J0OiVkIiwKKwkJIiVzOiBETUFGbGFnOiVkLCBzdGF0ZTolZCwgZm9yY2U6JWQsIHRlc3RCdWZmOiVkLCBzaG9ydDolZFxuIiwKIAkJX19mdW5jX18sIHBkeC0+ZHdETUFGbGFnLCBwZHgtPnNDdXJyZW50U3RhdGUsIHBkeC0+YkZvcmNlUmVzZXQsCiAJCWJUZXN0QnVmZiwgYlNob3J0VGVzdCk7CiAKQEAgLTM3NiwxMyArMzc2LDEzIEBACiAJICAgIChwZHgtPmR3TnVtSW5wdXQgfHwgcGR4LT5kd051bU91dHB1dCkpIHsJLyogIC4uLmNoYXJhY3RlcnMgd2VyZSBpbiB0aGUgYnVmZmVyPyAqLwogCQliU2hvcnRUZXN0ID0gZmFsc2U7CS8qICBUaGVuIGRvIHRoZSBmdWxsIHRlc3QgKi8KIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyB3aWxsIHJlc2V0IGFzIGJ1ZmZlcnMgbm90IGVtcHR5IiwgX19mdW5jX18pOworCQkJIiVzOiB3aWxsIHJlc2V0IGFzIGJ1ZmZlcnMgbm90IGVtcHR5XG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGJTaG9ydFRlc3QgfHwgIWJDYW5SZXNldCkgewkvKiAgU3RpbGwgT0sgdG8gdHJ5IHRoZSBzaG9ydCB0ZXN0PyAqLwogCQkJCS8qICBBbHdheXMgdGVzdCBpZiBubyByZXNldCAtIHdlIHdhbnQgc3RhdGUgdXBkYXRlICovCiAJCXVuc2lnbmVkIGludCBzdGF0ZSwgZXJyb3I7Ci0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcy0+R2V0MTQwMVN0YXRlIiwgX19mdW5jX18pOworCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEdldDE0MDFTdGF0ZVxuIiwgX19mdW5jX18pOwogCQlpZiAoR2V0MTQwMVN0YXRlKHBkeCwgJnN0YXRlLCAmZXJyb3IpID09IFUxNEVSUl9OT0VSUk9SKSB7CS8qICBDaGVjayBvbiB0aGUgMTQwMSBzdGF0ZSAqLwogCQkJaWYgKChzdGF0ZSAmIDB4RkYpID09IDApCS8qICBJZiBjYWxsIHdvcmtlZCwgY2hlY2sgdGhlIHN0YXR1cyB2YWx1ZSAqLwogCQkJCWJSZXQgPSB0cnVlOwkvKiAgSWYgdGhhdCB3YXMgemVybywgYWxsIGlzIE9LLCBubyByZXNldCBuZWVkZWQgKi8KQEAgLTM5MCw3ICszOTAsNyBAQAogCX0KIAogCWlmICghYlJldCAmJiBiQ2FuUmVzZXQpCXsgLyogIElmIGFsbCBub3QgT0ssIHRoZW4gKi8KLQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcy0+SXMxNDAxICVkICVkICVkICVkIiwKKwkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogSXMxNDAxICVkICVkICVkICVkXG4iLAogCQkJIF9fZnVuY19fLCBiU2hvcnRUZXN0LCBwZHgtPnNDdXJyZW50U3RhdGUsIGJUZXN0QnVmZiwKIAkJCSBwZHgtPmJGb3JjZVJlc2V0KTsKIAkJYlJldCA9IElzMTQwMShwZHgpOwkvKiAgIGRvIGZ1bGwgdGVzdCAqLwpAQCAtNDA3LDcgKzQwNyw4IEBACiBpbnQgUmVzZXQxNDAxKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiQUJvdXQgdG8gY2FsbCBRdWlja0NoZWNrIik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBBYm91dCB0byBjYWxsIFF1aWNrQ2hlY2tcbiIsCisJCV9fZnVuY19fKTsKIAlRdWlja0NoZWNrKHBkeCwgdHJ1ZSwgdHJ1ZSk7CS8qICBDaGVjayAxNDAxLCByZXNldCBpZiBub3QgT0sgKi8KIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCXJldHVybiBVMTRFUlJfTk9FUlJPUjsKQEAgLTQyMyw3ICs0MjQsNyBAQAogCWludCBpUmV0dXJuID0gVTE0RVJSX05PSU47CS8qICBhc3N1bWUgd2Ugd2lsbCBnZXQgIG5vdGhpbmcgKi8KIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJHZXRDaGFyIik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlBbGxvd2kocGR4KTsJLyogIE1ha2Ugc3VyZSBjaGFyIHJlYWRzIGFyZSBydW5uaW5nICovCiAJU2VuZENoYXJzKHBkeCk7CS8qICBhbmQgc2VuZCBhbnkgYnVmZmVyZWQgY2hhcnMgKi8KQEAgLTQ5Nyw4ICs0OTgsOCBAQAogCQlwZHgtPmR3TnVtSW5wdXQgLT0gbkdvdDsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPmNoYXJJbkxvY2spOwogCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiR2V0U3RyaW5nIHJlYWQgJWQgY2hhcmFjdGVycyA+JXM8IiwgbkdvdCwgYnVmZmVyKTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiByZWFkICVkIGNoYXJhY3RlcnMgPiVzPFxuIiwKKwkJCV9fZnVuY19fLCBuR290LCBidWZmZXIpOwogCQlpZiAoY29weV90b191c2VyKHBVc2VyLCBidWZmZXIsIG5Db3B5VG9Vc2VyKSkKIAkJCWlSZXR1cm4gPSAtRUZBVUxUOwogCQllbHNlCkBAIC01NTUsNyArNTU2LDcgQEAKIAl9CiAKIAlzcGluX3VubG9ja19pcnEoJnBkeC0+Y2hhckluTG9jayk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIkxpbmVDb3VudCByZXR1cm5lZCAlZCIsIGlSZXR1cm4pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwkvKiAgUHJvdGVjdCBkaXNjb25uZWN0IGZyb20gbmV3IGkvbyAqLwogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtNTcxLDcgKzU3Miw3IEBACiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCiAJU2VuZENoYXJzKHBkeCk7CQkvKiAgc2VuZCBhbnkgYnVmZmVyZWQgY2hhcnMgKi8KIAlpUmV0dXJuID0gKGludCkoT1VUQlVGX1NaIC0gcGR4LT5kd051bU91dHB1dCk7CS8qICBubyBsb2NrIG5lZWRlZCBmb3Igc2luZ2xlIHJlYWQgKi8KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiT3V0QnVmU3BhY2UgJWQiLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KIAlyZXR1cm4gaVJldHVybjsKIH0KQEAgLTU4OSw3ICs1OTAsNyBAQAogCiAJaWYgKChuQXJlYSA8IDApIHx8IChuQXJlYSA+PSBNQVhfVFJBTlNBUkVBUykpIHsKIAkJaVJldHVybiA9IFUxNEVSUl9CQURBUkVBOwotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQXR0ZW1wdCB0byBjbGVhciBhcmVhICVkIiwKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBBdHRlbXB0IHRvIGNsZWFyIGFyZWEgJWRcbiIsCiAJCQlfX2Z1bmNfXywgbkFyZWEpOwogCX0gZWxzZSB7CiAJCVRSQU5TQVJFQSAqcFRBID0gJnBkeC0+clRyYW5zRGVmW25BcmVhXTsJLyogIHRvIHNhdmUgdHlwaW5nICovCkBAIC02MDIsMTQgKzYwMywxNCBAQAogCQkJaW50IG5QYWdlcyA9IDA7CS8qICBhbmQgbnVtYmVyIG9mIHBhZ2VzICovCiAJCQlpbnQgbnA7CiAKLQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBhcmVhICVkIiwgX19mdW5jX18sCi0JCQkJbkFyZWEpOworCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBhcmVhICVkXG4iLAorCQkJCV9fZnVuY19fLCBuQXJlYSk7CiAJCQlzcGluX2xvY2tfaXJxKCZwZHgtPnN0YWdlZExvY2spOwogCQkJaWYgKChwZHgtPlN0YWdlZElkID09IG5BcmVhKQogCQkJICAgICYmIChwZHgtPmR3RE1BRmxhZyA+IE1PREVfQ0hBUikpIHsKIAkJCQlpUmV0dXJuID0gVTE0RVJSX1VOTE9DS0ZBSUw7CS8qICBjYW5ub3QgZGVsZXRlIGFzIGluIHVzZSAqLwogCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyBjYWxsIG9uIGFyZWEgJWQgd2hpbGUgYWN0aXZlIiwKKwkJCQkJIiVzOiBjYWxsIG9uIGFyZWEgJWQgd2hpbGUgYWN0aXZlXG4iLAogCQkJCQlfX2Z1bmNfXywgbkFyZWEpOwogCQkJfSBlbHNlIHsKIAkJCQlwUGFnZXMgPSBwVEEtPnBQYWdlczsJLyogIHNhdmUgcGFnZSBhZGRyZXNzIGxpc3QgKi8KQEAgLTYzMyw3ICs2MzQsNyBAQAogCQkJCS8qICBOb3cgd2UgbXVzdCB1bmRvIHRoZSBwaW5uaW5nIGRvd24gb2YgdGhlIHBhZ2VzLiBXZSB3aWxsIGFzc3VtZSB0aGUgd29yc3QgYW5kIG1hcmsgKi8KIAkJCQkvKiAgYWxsIHRoZSBwYWdlcyBhcyBkaXJ0eS4gRG9uJ3QgYmUgdGVtcHRlZCB0byBtb3ZlIHRoaXMgdXAgYWJvdmUgYXMgeW91IG11c3Qgbm90IGJlICovCiAJCQkJLyogIGhvbGRpbmcgYSBzcGluIGxvY2sgdG8gZG8gdGhpcyBzdHVmZiBhcyBpdCBpcyBub3QgYXRvbWljLiAqLwotCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBuUGFnZXM9JWQiLAorCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogblBhZ2VzPSVkXG4iLAogCQkJCQlfX2Z1bmNfXywgblBhZ2VzKTsKIAogCQkJCWZvciAobnAgPSAwOyBucCA8IG5QYWdlczsgKytucCkgewpAQCAtNjQ1LDcgKzY0Niw3IEBACiAKIAkJCQlrZnJlZShwUGFnZXMpOwogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyBrZnJlZShwUGFnZXMpIGRvbmUiLCBfX2Z1bmNfXyk7CisJCQkJCSIlczoga2ZyZWUocFBhZ2VzKSBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0KIAl9CkBAIC02ODcsMTIgKzY4OCwxMiBAQAogCQlpUmV0dXJuID0gVTE0RVJSX05PTUVNT1JZOwogCQlnb3RvIGVycm9yOwogCX0KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJXAsIGxlbmd0aD0lMDZ4LCBjaXJjdWxhciAlZCIsCisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlcCwgbGVuZ3RoPSUwNngsIGNpcmN1bGFyICVkXG4iLAogCQlfX2Z1bmNfXywgcHVCdWYsIGR3TGVuZ3RoLCBiQ2lyY3VsYXIpOwogCiAJLyogIFRvIHBpbiBkb3duIHVzZXIgcGFnZXMgd2UgbXVzdCBmaXJzdCBhY3F1aXJlIHRoZSBtYXBwaW5nIHNlbWFwaG9yZS4gKi8KIAluUGFnZXMgPSBnZXRfdXNlcl9wYWdlc19mYXN0KHVsU3RhcnQsIGxlbiwgMSwgcFBhZ2VzKTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgblBhZ2VzID0gJWQiLCBfX2Z1bmNfXywgblBhZ2VzKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IG5QYWdlcyA9ICVkXG4iLCBfX2Z1bmNfXywgblBhZ2VzKTsKIAogCWlmIChuUGFnZXMgPiAwKSB7CQkvKiAgaWYgd2Ugc3VjY2VlZGVkICovCiAJCS8qICBJZiB5b3UgYXJlIHRlbXB0ZWQgdG8gdXNlIHBhZ2VfYWRkcmVzcyAoZm9ybSBMREQzKSwgZm9yZ2V0IGl0LiBZb3UgTVVTVCB1c2UgKi8KQEAgLTczNSwxNyArNzM2LDE3IEBACiAqKiB1bnNldCBpdC4gVW5zZXR0aW5nIHdpbGwgZmFpbCBpZiB0aGUgYXJlYSBpcyBib29rZWQsIGFuZCBhIHRyYW5zZmVyIHRvIHRoYXQKICoqIGFyZWEgaXMgaW4gcHJvZ3Jlc3MuIE90aGVyd2lzZSwgd2Ugd2lsbCByZWxlYXNlIHRoZSBhcmVhIGFuZCByZS1hc3NpZ24gaXQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVFJBTlNGRVJERVNDIF9fdXNlciAqcFREKQoraW50IFNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyBfX3VzZXIgKnBURCkKIHsKIAlpbnQgaVJldHVybjsKLQlUUkFOU0ZFUkRFU0MgdGQ7CisJc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB0ZDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdGQsIHBURCwgc2l6ZW9mKHRkKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGFyZWE6JWQsIHNpemU6JTA4eCIsIF9fZnVuY19fLAotCQl0ZC53QXJlYU51bSwgdGQuZHdMZW5ndGgpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYXJlYTolZCwgc2l6ZTolMDh4XG4iLAorCQlfX2Z1bmNfXywgdGQud0FyZWFOdW0sIHRkLmR3TGVuZ3RoKTsKIAkvKiAgVGhlIHN0cmFuZ2UgY2FzdCBpcyBkb25lIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHdhcm5pbmdzIGluIDMyLWJpdCBsaW51eCBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgKi8KIAkvKiAgcG9pbnRlci4gVGhlIHBvaW50ZXIgaXMgYWx3YXlzIHBhc3NlZCBhcyBhIDY0LWJpdCBvYmplY3Qgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHByb2JsZW1zIHVzaW5nICovCiAJLyogIGEgMzItYml0IHByb2dyYW0gb24gYSA2NC1iaXQgc3lzdGVtLiB1bnNpZ25lZCBsb25nIGlzIDY0LWJpdHMgb24gYSA2NC1iaXQgc3lzdGVtLiAqLwpAQCAtNzc4LDEwICs3NzksMTAgQEAKICoqIHByZXRlbmQgdGhhdCB3aGF0ZXZlciB0aGUgdXNlciBhc2tlZCBmb3Igd2FzIGFjaGlldmVkLCBzbyB3ZSByZXR1cm4gMSBpZgogKiogdHJ5IHRvIGNyZWF0ZSBvbmUsIGFuZCAwIGlmIHRoZXkgYXNrIHRvIHJlbW92ZSAoYXNzdW1pbmcgYWxsIGVsc2Ugd2FzIE9LKS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgU2V0RXZlbnQoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUUkFOU0ZFUkVWRU5UIF9fdXNlciAqcFRFKQoraW50IFNldEV2ZW50KERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2V2ZW50IF9fdXNlciAqcFRFKQogewogCWludCBpUmV0dXJuID0gVTE0RVJSX05PRVJST1I7Ci0JVFJBTlNGRVJFVkVOVCB0ZTsKKwlzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQgdGU7CiAKIAkvKiAgZ2V0IGEgbG9jYWwgY29weSBvZiB0aGUgZGF0YSAqLwogCWlmIChjb3B5X2Zyb21fdXNlcigmdGUsIHBURSwgc2l6ZW9mKHRlKSkpCkBAIC05MjIsNyArOTIzLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgS2lsbElPMTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwogCUZsdXNoT3V0QnVmZihwZHgpOwogCUZsdXNoSW5CdWZmKHBkeCk7CkBAIC05MzgsNyArOTM5LDcgQEAKIGludCBCbGtUcmFuc1N0YXRlKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKIAlpbnQgaVJldHVybiA9IHBkeC0+ZHdETUFGbGFnICE9IE1PREVfQ0hBUjsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgPSAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJcmV0dXJuIGlSZXR1cm47CiB9CiAKQEAgLTk1Niw3ICs5NTcsNyBAQAogCWlSZXR1cm4gPSBwZHgtPnNDdXJyZW50U3RhdGU7CiAKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyA9ICVkIiwgX19mdW5jX18sIGlSZXR1cm4pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtOTcxLDcgKzk3Miw3IEBACiB7CiAJaW50IG5Hb3Q7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJY2VkX2RyYXdfZG93bihwZHgpOwkvKiAgd2FpdCBmb3IsIHRoZW4ga2lsbCBvdXRzdGFuZGluZyBVcmJzICovCiAJRmx1c2hJbkJ1ZmYocGR4KTsJLyogIENsZWFyIG91dCBpbnB1dCBidWZmZXIgJiBwaXBlICovCkBAIC05ODcsNyArOTg4LDcgQEAKIAogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAJaWYgKG5Hb3QgPCAwKQotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZXJyPSVkIiwgX19mdW5jX18sIG5Hb3QpOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGVycj0lZFxuIiwgX19mdW5jX18sIG5Hb3QpOwogCXJldHVybiBuR290IDwgMCA/IFUxNEVSUl9GQUlMIDogVTE0RVJSX05PRVJST1I7CiB9CiAKQEAgLTEwMDUsNyArMTAwNiw3IEBACiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlpUmV0dXJuID0gR2V0MTQwMVN0YXRlKHBkeCwgJnN0YXRlLCAmZXJyb3IpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQkvKiAgT25seSBhY2NlcHQgemVybyBpZiBpdCBoYXBwZW5zIHR3aWNlICovCiAJCWlSZXR1cm4gPSBHZXQxNDAxU3RhdGUocGR4LCAmc3RhdGUsICZlcnJvcik7CkBAIC0xMDEzLDggKzEwMTQsOCBAQAogCWlmIChpUmV0dXJuICE9IFUxNEVSUl9OT0VSUk9SKSB7CS8qICBTZWxmLXRlc3QgY2FuIGNhdXNlIGNvbW1zIGVycm9ycyAqLwogCQkJCS8qICBzbyB3ZSBhc3N1bWUgc3RpbGwgdGVzdGluZyAqLwogCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIEdldDE0MDFTdGF0ZT0lZCwgYXNzdW1pbmcgc3RpbGwgdGVzdGluZyIsIF9fZnVuY19fLAotCQkJaVJldHVybik7CisJCQkiJXM6IEdldDE0MDFTdGF0ZT0lZCwgYXNzdW1pbmcgc3RpbGwgdGVzdGluZ1xuIiwKKwkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAkJc3RhdGUgPSAweDgwOwkvKiAgRm9yY2Ugc3RpbGwtdGVzdGluZywgbm8gZXJyb3IgKi8KIAkJZXJyb3IgPSAwOwogCQlpUmV0dXJuID0gVTE0RVJSX05PRVJST1I7CkBAIC0xMDIyLDcgKzEwMjMsNyBAQAogCiAJaWYgKChzdGF0ZSA9PSAtMSkgJiYgKGVycm9yID09IC0xKSkgewkvKiAgSWYgR2V0MTQwMVN0YXRlIGhhZCBwcm9ibGVtcyAqLwogCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIEdldDE0MDFTdGF0ZSBmYWlsZWQsIGFzc3VtaW5nIHN0aWxsIHRlc3RpbmciLAorCQkJIiVzOiBHZXQxNDAxU3RhdGUgZmFpbGVkLCBhc3N1bWluZyBzdGlsbCB0ZXN0aW5nXG4iLAogCQkJX19mdW5jX18pOwogCQlzdGF0ZSA9IDB4ODA7CS8qICBGb3JjZSBzdGlsbC10ZXN0aW5nLCBubyBlcnJvciAqLwogCQllcnJvciA9IDA7CkBAIC0xMDMzLDIxICsxMDM0LDIxIEBACiAJCQlnc3QuY29kZSA9IChzdGF0ZSAmIDB4MDBGRjAwMDApID4+IDE2OwkvKiAgcmVhZCB0aGUgZXJyb3IgY29kZSAqLwogCQkJZ3N0LnggPSBlcnJvciAmIDB4MDAwMEZGRkY7CS8qICBFcnJvciBkYXRhIFggKi8KIAkJCWdzdC55ID0gKGVycm9yICYgMHhGRkZGMDAwMCkgPj4gMTY7CS8qICBhbmQgZGF0YSBZICovCi0JCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiU2VsZi10ZXN0IGVycm9yIGNvZGUgJWQiLAotCQkJCWdzdC5jb2RlKTsKKwkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJIlNlbGYtdGVzdCBlcnJvciBjb2RlICVkXG4iLCBnc3QuY29kZSk7CiAJCX0gZWxzZSB7CQkvKiAgTm8gZXJyb3IsIGNoZWNrIGZvciB0aW1lb3V0ICovCiAJCQl1bnNpZ25lZCBsb25nIHVsTm93ID0gamlmZmllczsJLyogIGdldCBjdXJyZW50IHRpbWUgKi8KIAkJCWlmICh0aW1lX2FmdGVyKHVsTm93LCBwZHgtPnVsU2VsZlRlc3RUaW1lKSkgewogCQkJCWdzdC5jb2RlID0gLTI7CS8qICBGbGFnIHRoZSB0aW1lb3V0ICovCiAJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIlNlbGYtdGVzdCB0aW1lZC1vdXQiKTsKKwkJCQkJIlNlbGYtdGVzdCB0aW1lZC1vdXRcbiIpOwogCQkJfSBlbHNlCiAJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIlNlbGYtdGVzdCBvbi1nb2luZyIpOworCQkJCQkiU2VsZi10ZXN0IG9uLWdvaW5nXG4iKTsKIAkJfQogCX0gZWxzZSB7CiAJCWdzdC5jb2RlID0gLTE7CS8qICBGbGFnIHRoZSB0ZXN0IGlzIGRvbmUgKi8KLQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlNlbGYtdGVzdCBkb25lIik7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJTZWxmLXRlc3QgZG9uZVxuIik7CiAJfQogCiAJaWYgKGdzdC5jb2RlIDwgMCkgewkvKiAgSWYgd2UgaGF2ZSBhIHByb2JsZW0gb3IgZmluaXNoZWQgKi8KQEAgLTEwNzQsNyArMTA3NSw3IEBACiB7CiAJaW50IGlSZXR1cm4gPSBUWVBFVU5LTk9XTjsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHBkeC0+czE0MDFUeXBlKSB7CiAJY2FzZSBUWVBFMTQwMToKQEAgLTEwOTIsNyArMTA5Myw3IEBACiAJCWVsc2UJCS8qICAgZm9yIHVwLWNvbWluZyAxNDAxIGRlc2lnbnMgKi8KIAkJCWlSZXR1cm4gPSBUWVBFVU5LTk9XTjsJLyogIERvbid0IGtub3cgb3Igbm90IHRoZXJlICovCiAJfQotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCiAJcmV0dXJuIGlSZXR1cm47CkBAIC0xMTA3LDcgKzExMDgsNyBAQAogewogCWludCBpUmV0dXJuID0gVTE0VEZfTVVMVElBIHwgVTE0VEZfRElBRyB8CS8qICB3ZSBhbHdheXMgaGF2ZSBtdWx0aXBsZSBETUEgYXJlYSAqLwogCSAgICBVMTRURl9OT1RJRlkgfCBVMTRURl9DSVJDVEg7CS8qICBkaWFnbm9zdGljcywgbm90aWZ5IGFuZCBjaXJjdWxhciAqLwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAlpZiAocGR4LT5iSXNVU0IyKQkvKiAgU2V0IGZsYWcgZm9yIFVTQjIgaWYgYXBwcm9wcmlhdGUgKi8KIAkJaVJldHVybiB8PSBVMTRURl9VU0IyOwpAQCAtMTEyNSwxNSArMTEyNiwxNSBAQAogCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKIAlpbnQgaVJldHVybjsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZW50cnkiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlbnRyeVxuIiwgX19mdW5jX18pOwogCWlSZXR1cm4gPSB1c2JfY29udHJvbF9tc2cocGR4LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUocGR4LT51ZGV2LCAwKSwgY21kLAogCQkJCSAgKEhfVE9fRCB8IFZFTkRPUiB8IERFVlJFUSksCiAJCQkJICAodW5zaWduZWQgc2hvcnQpZGF0YSwKIAkJCQkgICh1bnNpZ25lZCBzaG9ydCkoZGF0YSA+PiAxNiksIE5VTEwsIDAsIEhaKTsKIAkJCQkJCS8qIGFsbG93IDEgc2Vjb25kIHRpbWVvdXQgKi8KIAlpZiAoaVJldHVybiA8IDApCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBmYWlsIGNvZGU9JWQiLCBfX2Z1bmNfXywKLQkJCWlSZXR1cm4pOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGZhaWwgY29kZT0lZFxuIiwKKwkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtMTE1Miw3ICsxMTUzLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQCAlMDh4IiwgX19mdW5jX18sIGRiLmlBZGRyKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEAgJTA4eFxuIiwgX19mdW5jX18sIGRiLmlBZGRyKTsKIAogCWlSZXR1cm4gPSBEYmdDbWQxNDAxKHBkeCwgREJfU0VUQURELCBkYi5pQWRkcik7CiAJaWYgKGlSZXR1cm4gPT0gVTE0RVJSX05PRVJST1IpCkBAIC0xMTgxLDcgKzExODIsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBAICUwOHgiLCBfX2Z1bmNfXywgZGIuaUFkZHIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogQCAlMDh4XG4iLCBfX2Z1bmNfXywgZGIuaUFkZHIpOwogCiAJaVJldHVybiA9IERiZ0NtZDE0MDEocGR4LCBEQl9TRVRBREQsIGRiLmlBZGRyKTsKIAlpZiAoaVJldHVybiA9PSBVMTRFUlJfTk9FUlJPUikKQEAgLTEyMTAsNyArMTIxMSw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIEAgJTA4eCIsIF9fZnVuY19fLCBkYi5pQWRkcik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBAICUwOHhcbiIsIF9fZnVuY19fLCBkYi5pQWRkcik7CiAKIAlpUmV0dXJuID0gRGJnQ21kMTQwMShwZHgsIERCX1NFVEFERCwgZGIuaUFkZHIpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQpAQCAtMTI0Miw3ICsxMjQzLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpUmV0dXJuID0gRGJnQ21kMTQwMShwZHgsIERCX1NFVERFRiwgZGIuaURlZmF1bHQpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQpAQCAtMTI3MCw3ICsxMjcxLDcgQEAKIAltZW1zZXQoJmRiLCAwLCBzaXplb2YoZGIpKTsJLyogIGZpbGwgcmV0dXJuZWQgYmxvY2sgd2l0aCAwcyAqLwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogIFJlYWQgYmFjayB0aGUgbGFzdCBwZWVrZWQgdmFsdWUgZnJvbSB0aGUgMTQwMS4gKi8KIAlpUmV0dXJuID0gdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKHBkeC0+dWRldiwgMCksCkBAIC0xMjgyLDggKzEyODMsOCBAQAogCQllbHNlCiAJCQlpUmV0dXJuID0gVTE0RVJSX05PRVJST1I7CiAJfSBlbHNlCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBmYWlsZWQsIGNvZGUgJWQiLCBfX2Z1bmNfXywKLQkJCWlSZXR1cm4pOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGZhaWxlZCwgY29kZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAKQEAgLTEzMDIsNyArMTMwMyw3IEBACiAJdW5zaWduZWQgaW50IHVTdGF0ZSwgdUVycjsKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlpUmV0dXJuID0gR2V0MTQwMVN0YXRlKHBkeCwgJnVTdGF0ZSwgJnVFcnIpOwogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAKQEAgLTEzMTcsMTggKzEzMTgsMTggQEAKICoqIGJvb2tlZCBhbmQgYSB0cmFuc2ZlciB0byB0aGF0IGFyZWEgaXMgaW4gcHJvZ3Jlc3MuIE90aGVyd2lzZSwgd2Ugd2lsbAogKiogcmVsZWFzZSB0aGUgYXJlYSBhbmQgcmUtYXNzaWduIGl0LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBTZXRDaXJjdWxhcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSREVTQyBfX3VzZXIgKnBURCkKK2ludCBTZXRDaXJjdWxhcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgX191c2VyICpwVEQpCiB7CiAJaW50IGlSZXR1cm47CiAJYm9vbCBiVG9Ib3N0OwotCVRSQU5TRkVSREVTQyB0ZDsKKwlzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHRkOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ZCwgcFRELCBzaXplb2YodGQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgYXJlYTolZCwgc2l6ZTolMDh4IiwgX19mdW5jX18sCi0JCXRkLndBcmVhTnVtLCB0ZC5kd0xlbmd0aCk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBhcmVhOiVkLCBzaXplOiUwOHhcbiIsCisJCV9fZnVuY19fLCB0ZC53QXJlYU51bSwgdGQuZHdMZW5ndGgpOwogCWJUb0hvc3QgPSB0ZC5lU2l6ZSAhPSAwOwkvKiAgdGhpcyBpcyB1c2VkIGFzIHRoZSB0b2hvc3QgZmxhZyAqLwogCiAJLyogIFRoZSBzdHJhbmdlIGNhc3QgaXMgZG9uZSBzbyB0aGF0IHdlIGRvbid0IGdldCB3YXJuaW5ncyBpbiAzMi1iaXQgbGludXggYWJvdXQgdGhlIHNpemUgb2YgdGhlICovCkBAIC0xMzUzLDcgKzEzNTQsNyBAQAogCXVuc2lnbmVkIGludCBuQXJlYTsKIAlUQ0lSQ0JMT0NLIGNiOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjYiwgcENCLCBzaXplb2YoY2IpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMzc0LDcgKzEzNzUsNyBAQAogCQkJCWNiLmR3T2Zmc2V0ID0gcEFyZWEtPmFCbG9ja3NbMF0uZHdPZmZzZXQ7CiAJCQkJY2IuZHdTaXplID0gcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplOwogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyByZXR1cm4gYmxvY2sgMDogJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkiJXM6IHJldHVybiBibG9jayAwOiAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJX19mdW5jX18sIGNiLmR3U2l6ZSwgY2IuZHdPZmZzZXQpOwogCQkJfQogCQl9IGVsc2UKQEAgLTE0MDIsNyArMTQwMyw3IEBACiAJdW5zaWduZWQgaW50IG5BcmVhLCB1U3RhcnQsIHVTaXplOwogCVRDSVJDQkxPQ0sgY2I7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNiLCBwQ0IsIHNpemVvZihjYikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE0MzcsNyArMTQzOCw3IEBACiAJCQkJfQogCiAJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIGZyZWUgJWQgYnl0ZXMgYXQgJWQsIHJldHVybiAlZCBieXRlcyBhdCAlZCwgd2FpdD0lZCIsCisJCQkJCSIlczogZnJlZSAlZCBieXRlcyBhdCAlZCwgcmV0dXJuICVkIGJ5dGVzIGF0ICVkLCB3YWl0PSVkXG4iLAogCQkJCQlfX2Z1bmNfXywgdVNpemUsIHVTdGFydCwKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLAogCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCwKQEAgLTE0NTMsMTMgKzE0NTQsMTMgQEAKIAkJCQliV2FpdGluZyA9IHBkeC0+YlhGZXJXYWl0aW5nOwogCQkJCWlmIChiV2FpdGluZyAmJiBwZHgtPmJTdGFnZWRVcmJQZW5kaW5nKSB7CiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgRVJST1I6IHdhaXRpbmcgeGZlciBhbmQgc3RhZ2VkIFVyYiBwZW5kaW5nISIsCisJCQkJCQkiJXM6IEVSUk9SOiB3YWl0aW5nIHhmZXIgYW5kIHN0YWdlZCBVcmIgcGVuZGluZyFcbiIsCiAJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJCWJXYWl0aW5nID0gZmFsc2U7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiJXMgRVJST1I6IGZyZWVpbmcgJWQgYnl0ZXMgYXQgJWQsIGJsb2NrIDAgaXMgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkiJXM6IEVSUk9SOiBmcmVlaW5nICVkIGJ5dGVzIGF0ICVkLCBibG9jayAwIGlzICVkIGJ5dGVzIGF0ICVkXG4iLAogCQkJCQlfX2Z1bmNfXywgdVNpemUsIHVTdGFydCwKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLAogCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCk7CkBAIC0xNDc1LDcgKzE0NzYsNyBAQAogCQkJCQkJIHBkeC0+ckRNQUluZm8uZHdTaXplKTsKIAkJCQlpZiAoUldNU3RhdCAhPSBVMTRFUlJfTk9FUlJPUikKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBydyBzZXR1cCBmYWlsZWQgJWQiLAorCQkJCQkJIiVzOiBydyBzZXR1cCBmYWlsZWQgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgUldNU3RhdCk7CiAJCQl9CiAJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jdGwuaAppbmRleCBhYTY4ODc4Li40YjZjOWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jdGwuaApAQCAtMjYsMjQgKzI2LDIxIEBACiAqKiBUeXBlRGVmcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVEJMT0NLRU5UUlk7CS8qIGluZGV4IHRoZSBibGsgdHJhbnNmZXIgdGFibGUgMC03ICovCi0KLXR5cGVkZWYgc3RydWN0IFRyYW5zZmVyRGVzYyB7CitzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHsKIAlsb25nIGxvbmcgbHB2QnVmZjsJLyogYWRkcmVzcyBvZiB0cmFuc2ZlciBhcmVhIChmb3IgNjQgb3IgMzIgYml0KSAqLwogCXVuc2lnbmVkIGludCBkd0xlbmd0aDsJLyogbGVuZ3RoIG9mIHRoZSBhcmVhICovCi0JVEJMT0NLRU5UUlkgd0FyZWFOdW07CS8qIG51bWJlciBvZiB0cmFuc2ZlciBhcmVhIHRvIHNldCB1cCAqLworCXVuc2lnbmVkIHNob3J0IHdBcmVhTnVtOwkvKiBudW1iZXIgb2YgdHJhbnNmZXIgYXJlYSB0byBzZXQgdXAgKi8KIAlzaG9ydCBlU2l6ZTsJCS8qIGVsZW1lbnQgc2l6ZSAtIGlzIHRvaG9zdCBmbGFnIGZvciBjaXJjdWxhciAqLwotfSBUUkFOU0ZFUkRFU0M7Cit9OwogCi10eXBlZGVmIFRSQU5TRkVSREVTQyAqTFBUUkFOU0ZFUkRFU0M7CiAKLXR5cGVkZWYgc3RydWN0IFRyYW5zZmVyRXZlbnQgeworc3RydWN0IHRyYW5zZmVyX2V2ZW50IHsKIAl1bnNpZ25lZCBpbnQgZHdTdGFydDsJCS8qIG9mZnNldCBpbnRvIHRoZSBhcmVhICovCiAJdW5zaWduZWQgaW50IGR3TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHRoZSByZWdpb24gKi8KIAl1bnNpZ25lZCBzaG9ydCB3QXJlYU51bTsJLyogdGhlIGFyZWEgbnVtYmVyICovCiAJdW5zaWduZWQgc2hvcnQgd0ZsYWdzOwkJLyogYml0IDAgc2V0IGZvciB0b0hvc3QgKi8KIAlpbnQgaVNldEV2ZW50OwkJCS8qIGNvdWxkIGJlIGR1bW15IGluIExJTlVYICovCi19IFRSQU5TRkVSRVZFTlQ7Cit9OwogCiAjZGVmaW5lIE1BWF9UUkFOU0ZFUl9TSVpFCTB4NDAwMAkJLyogTWF4aW11bSBkYXRhIGJ5dGVzIHBlciBJUlAgKi8KICNkZWZpbmUgTUFYX0FSRUFfTEVOR1RICQkweDEwMDAwMAkvKiBNYXhpbXVtIHNpemUgb2YgdHJhbnNmZXIgYXJlYSAqLwpAQCAtODUsMTIgKzgyLDYgQEAKICAqLwogI2RlZmluZSBDRURfTUFHSUNfSU9DIDB4Y2UKIAotLyogTkJOQjogUkVBRCBhbmQgV1JJVEUgYXJlIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGRldmljZSwgbm90IHVzZXIuICovCi10eXBlZGVmIHN0cnVjdCBjZWRfaW9jX3N0cmluZyB7Ci0JaW50IG5DaGFyczsKLQljaGFyIGJ1ZmZlclsyNTZdOwotfSBDRURfSU9DX1NUUklORzsKLQogI2RlZmluZSBJT0NUTF9DRURfU0VORFNUUklORyhuKQkJX0lPQyhfSU9DX1dSSVRFLCBDRURfTUFHSUNfSU9DLCAyLCBuKQogCiAjZGVmaW5lIElPQ1RMX0NFRF9SRVNFVDE0MDEJCV9JTyhDRURfTUFHSUNfSU9DLCAzKQpAQCAtMTAwLDkgKzkxLDkgQEAKICNkZWZpbmUgSU9DVExfQ0VEX0xJTkVDT1VOVAkJX0lPKENFRF9NQUdJQ19JT0MsIDcpCiAjZGVmaW5lIElPQ1RMX0NFRF9HRVRTVFJJTkcobk1heCkJX0lPQyhfSU9DX1JFQUQsIENFRF9NQUdJQ19JT0MsIDgsIG5NYXgpCiAKLSNkZWZpbmUgSU9DVExfQ0VEX1NFVFRSQU5TRkVSCQlfSU9XKENFRF9NQUdJQ19JT0MsIDExLCBUUkFOU0ZFUkRFU0MpCisjZGVmaW5lIElPQ1RMX0NFRF9TRVRUUkFOU0ZFUgkJX0lPVyhDRURfTUFHSUNfSU9DLCAxMSwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYykKICNkZWZpbmUgSU9DVExfQ0VEX1VOU0VUVFJBTlNGRVIJCV9JTyhDRURfTUFHSUNfSU9DLCAxMikKLSNkZWZpbmUgSU9DVExfQ0VEX1NFVEVWRU5UCQlfSU9XKENFRF9NQUdJQ19JT0MsIDEzLCBUUkFOU0ZFUkVWRU5UKQorI2RlZmluZSBJT0NUTF9DRURfU0VURVZFTlQJCV9JT1coQ0VEX01BR0lDX0lPQywgMTMsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCkKICNkZWZpbmUgSU9DVExfQ0VEX0dFVE9VVEJVRlNQQUNFCV9JTyhDRURfTUFHSUNfSU9DLCAxNCkKICNkZWZpbmUgSU9DVExfQ0VEX0dFVEJBU0VBRERSRVNTCV9JTyhDRURfTUFHSUNfSU9DLCAxNSkKICNkZWZpbmUgSU9DVExfQ0VEX0dFVERSSVZFUlJFVklTSU9OCV9JTyhDRURfTUFHSUNfSU9DLCAxNikKQEAgLTEyNiw3ICsxMTcsNyBAQAogI2RlZmluZSBJT0NUTF9DRURfREJHR0VUREFUQQkJX0lPUihDRURfTUFHSUNfSU9DLCAzOSwgVERCR0JMT0NLKQogI2RlZmluZSBJT0NUTF9DRURfREJHU1RPUExPT1AJCV9JTyhDRURfTUFHSUNfSU9DLCA0MCkKICNkZWZpbmUgSU9DVExfQ0VEX0ZVTExSRVNFVAkJX0lPKENFRF9NQUdJQ19JT0MsIDQxKQotI2RlZmluZSBJT0NUTF9DRURfU0VUQ0lSQ1VMQVIJCV9JT1coQ0VEX01BR0lDX0lPQywgNDIsIFRSQU5TRkVSREVTQykKKyNkZWZpbmUgSU9DVExfQ0VEX1NFVENJUkNVTEFSCQlfSU9XKENFRF9NQUdJQ19JT0MsIDQyLCBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjKQogI2RlZmluZSBJT0NUTF9DRURfR0VUQ0lSQ0JMT0NLCQlfSU9XUihDRURfTUFHSUNfSU9DLCA0MywgVENJUkNCTE9DSykKICNkZWZpbmUgSU9DVExfQ0VEX0ZSRUVDSVJDQkxPQ0sJCV9JT1dSKENFRF9NQUdJQ19JT0MsIDQ0LCBUQ0lSQ0JMT0NLKQogI2RlZmluZSBJT0NUTF9DRURfV0FJVEVWRU5UCQlfSU8oQ0VEX01BR0lDX0lPQywgNDUpCkBAIC0xOTgsNyArMTg5LDcgQEAKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9HRVREUklWRVJSRVZJU0lPTik7CiB9CiAKLWlubGluZSBpbnQgQ0VEX1NldFRyYW5zZmVyKGludCBmaCwgVFJBTlNGRVJERVNDICpwVEQpCitpbmxpbmUgaW50IENFRF9TZXRUcmFuc2ZlcihpbnQgZmgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgKnBURCkKIHsKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9TRVRUUkFOU0ZFUiwgcFREKTsKIH0KQEAgLTIwOCw3ICsxOTksNyBAQAogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX1VOU0VUVFJBTlNGRVIsIG5BcmVhKTsKIH0KIAotaW5saW5lIGludCBDRURfU2V0RXZlbnQoaW50IGZoLCBUUkFOU0ZFUkVWRU5UICpwVEUpCitpbmxpbmUgaW50IENFRF9TZXRFdmVudChpbnQgZmgsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCAqcFRFKQogewogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX1NFVEVWRU5ULCBwVEUpOwogfQpAQCAtMjk5LDcgKzI5MCw3IEBACiAJcmV0dXJuIGlvY3RsKGZoLCBJT0NUTF9DRURfRlVMTFJFU0VUKTsKIH0KIAotaW5saW5lIGludCBDRURfU2V0Q2lyY3VsYXIoaW50IGZoLCBUUkFOU0ZFUkRFU0MgKnBURCkKK2lubGluZSBpbnQgQ0VEX1NldENpcmN1bGFyKGludCBmaCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyAqcFREKQogewogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX1NFVENJUkNVTEFSLCBwVEQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5jCmluZGV4IGVmYzMxMGMuLjI4NGFiYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICIlcyBnb3QgcGR4IiwgX19mdW5jX18pOworCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiJXM6IGdvdCBwZHhcbiIsIF9fZnVuY19fKTsKIAogCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KIAlrcmVmX2dldCgmcGR4LT5rcmVmKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogCQkJZ290byBleGl0OwogCQl9CiAJfSBlbHNlIHsJCS8qIHVuY29tbWVudCB0aGlzIGJsb2NrIGlmIHlvdSB3YW50IGV4Y2x1c2l2ZSBvcGVuICovCi0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiJXMgZmFpbDogYWxyZWFkeSBvcGVuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBmYWlsOiBhbHJlYWR5IG9wZW5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dmFsID0gLUVCVVNZOwogCQlwZHgtPm9wZW5fY291bnQtLTsKIAkJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKQEAgLTIwNyw3ICsyMDcsNyBAQAogCWlmIChwZHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CiAJaWYgKCEtLXBkeC0+b3Blbl9jb3VudCAmJiBwZHgtPmludGVyZmFjZSkJLyogIEFsbG93IGF1dG9zdXNwZW5kICovCiAJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShwZHgtPmludGVyZmFjZSk7CkBAIC0yMjQsMTIgKzIyNCwxMiBAQAogCWlmIChwZHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2hhciBpbiBwZW5kPSVkIiwgX19mdW5jX18sCi0JCXBkeC0+YlJlYWRDaGFyc1BlbmRpbmcpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2hhciBpbiBwZW5kPSVkXG4iLAorCQlfX2Z1bmNfXywgcGR4LT5iUmVhZENoYXJzUGVuZGluZyk7CiAKIAkvKiB3YWl0IGZvciBpbyB0byBzdG9wICovCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGdvdCBpb19tdXRleCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGdvdCBpb19tdXRleFxuIiwgX19mdW5jX18pOwogCWNlZF9kcmF3X2Rvd24ocGR4KTsKIAogCS8qIHJlYWQgb3V0IGVycm9ycywgbGVhdmUgc3Vic2VxdWVudCBvcGVucyBhIGNsZWFuIHNsYXRlICovCkBAIC0yMzksNyArMjM5LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJnBkeC0+ZXJyX2xvY2spOwogCiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZXhpdCByZWFjaGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZXhpdCByZWFjaGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCSAgICAocFVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgcFVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUCiAJCSAgICAgfHwgcFVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKSB7CiAJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCQkiJXM6IG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAogCQkJCV9fZnVuY19fLCBwVXJiLT5zdGF0dXMpOwogCQl9CiAKQEAgLTI4NywxMCArMjg3LDEwIEBACiAJCXBkeC0+YlNlbmRDaGFyc1BlbmRpbmcgPSBmYWxzZTsJLyogIEFsbG93IG90aGVyIHRocmVhZHMgYWdhaW4gKi8KIAkJc3Bpbl91bmxvY2soJnBkeC0+Y2hhck91dExvY2spOwkvKiAgYWxyZWFkeSBhdCBpcnEgbGV2ZWwgKi8KIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyAtIGNoYXIgb3V0IGRvbmUsIDAgY2hhcnMgc2VudCIsIF9fZnVuY19fKTsKKwkJCSIlczogY2hhciBvdXQgZG9uZSwgMCBjaGFycyBzZW50XG4iLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyAtIGNoYXIgb3V0IGRvbmUsICVkIGNoYXJzIHNlbnQiLCBfX2Z1bmNfXywgbkdvdCk7CisJCQkiJXM6IGNoYXIgb3V0IGRvbmUsICVkIGNoYXJzIHNlbnRcbiIsIF9fZnVuY19fLCBuR290KTsKIAkJc3Bpbl9sb2NrKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIGFscmVhZHkgYXQgaXJxIGxldmVsICovCiAJCXBkeC0+ZHdOdW1PdXRwdXQgLT0gbkdvdDsJLyogIE5vdyBhZGp1c3QgdGhlIGNoYXIgc2VuZCBidWZmZXIgKi8KIAkJcGR4LT5kd091dEJ1ZmZHZXQgKz0gbkdvdDsJLyogIHRvIG1hdGNoIHdoYXQgd2UgZGlkICovCkBAIC0zMTUsMTUgKzMxNSwxNSBAQAogCQkJICAgIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCQkJdXNiX2FuY2hvcl91cmIocGR4LT5wVXJiQ2hhck91dCwgJnBkeC0+c3VibWl0dGVkKTsJLyogIGluIGNhc2Ugd2UgbmVlZCB0byBraWxsIGl0ICovCiAJCQlpUmV0dXJuID0gdXNiX3N1Ym1pdF91cmIocGR4LT5wVXJiQ2hhck91dCwgR0ZQX0FUT01JQyk7Ci0JCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgbj0lZD4lczwiLCBfX2Z1bmNfXywKLQkJCQlkd0NvdW50LCBwRGF0KTsKKwkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogbj0lZD4lczxcbiIsCisJCQkJX19mdW5jX18sIGR3Q291bnQsIHBEYXQpOwogCQkJc3Bpbl9sb2NrKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIGdyYWIgbG9jayBmb3IgZXJyb3JzICovCiAJCQlpZiAoaVJldHVybikgewogCQkJCXBkeC0+YlBpcGVFcnJvcltuUGlwZV0gPSAxOwkvKiAgRmxhZyBhbiBlcnJvciB0byBiZSBoYW5kbGVkIGxhdGVyICovCiAJCQkJcGR4LT5iU2VuZENoYXJzUGVuZGluZyA9IGZhbHNlOwkvKiAgQWxsb3cgb3RoZXIgdGhyZWFkcyBhZ2FpbiAqLwogCQkJCXVzYl91bmFuY2hvcl91cmIocGR4LT5wVXJiQ2hhck91dCk7CiAJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIHVzYl9zdWJtaXRfdXJiKCkgcmV0dXJuZWQgJWQiLAorCQkJCQkiJXM6IHVzYl9zdWJtaXRfdXJiKCkgcmV0dXJuZWQgJWRcbiIsCiAJCQkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAkJCX0KIAkJfSBlbHNlCkBAIC0zNTAsOCArMzUwLDggQEAKIAkJcGR4LT5iU2VuZENoYXJzUGVuZGluZyA9IHRydWU7CS8qICBTZXQgZmxhZyB0byBsb2NrIG91dCBvdGhlciB0aHJlYWRzICovCiAKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJTZW5kICVkIGNoYXJzIHRvIDE0MDEsIEVQMCBmbGFnICVkXG4iLCBkd0NvdW50LAotCQkJcGR4LT5uUGlwZXMgPT0gMyk7CisJCQkiU2VuZCAlZCBjaGFycyB0byAxNDAxLCBFUDAgZmxhZyAlZFxuIiwKKwkJCWR3Q291bnQsIHBkeC0+blBpcGVzID09IDMpOwogCQkvKiAgSWYgd2UgaGF2ZSBvbmx5IDMgZW5kIHBvaW50cyB3ZSBtdXN0IHNlbmQgdGhlIGNoYXJhY3RlcnMgdG8gdGhlIDE0MDEgdXNpbmcgRVAwLiAqLwogCQlpZiAocGR4LT5uUGlwZXMgPT0gMykgewogCQkJLyogIEZvciBFUDAgY2hhcmFjdGVyIHRyYW5zbWlzc2lvbnMgdG8gdGhlIDE0MDEsIHdlIGhhdmUgdG8gaGFuZyBhYm91dCB1bnRpbCB0aGV5ICovCkBAIC0zNzUsMTEgKzM3NSwxMSBAQAogCQkJCWlmIChuU2VudCA8PSAwKSB7CiAJCQkJCWlSZXR1cm4gPSBuU2VudCA/IG5TZW50IDogLUVUSU1FRE9VVDsJLyogIGlmIDAgY2hhcnMgc2F5cyB3ZSB0aW1lZCBvdXQgKi8KIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJTZW5kICVkIGNoYXJzIGJ5IEVQMCBmYWlsZWQ6ICVkIiwKKwkJCQkJCSJTZW5kICVkIGNoYXJzIGJ5IEVQMCBmYWlsZWQ6ICVkXG4iLAogCQkJCQkJbiwgaVJldHVybik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJTZW50ICVkIGNoYXJzIGJ5IEVQMCIsIG4pOworCQkJCQkJIlNlbnQgJWQgY2hhcnMgYnkgRVAwXG4iLCBuKTsKIAkJCQkJY291bnQgLT0gblNlbnQ7CiAJCQkJCWluZGV4ICs9IG5TZW50OwogCQkJCX0KQEAgLTQxNiw5ICs0MTYsOSBAQAogCQl9CiAJfSBlbHNlIGlmIChwZHgtPmJTZW5kQ2hhcnNQZW5kaW5nICYmIChwZHgtPmR3TnVtT3V0cHV0ID4gMCkpCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiU2VuZENoYXJzIGJTZW5kQ2hhcnNQZW5kaW5nOnRydWUiKTsKKwkJCSIlczogYlNlbmRDaGFyc1BlbmRpbmc6dHJ1ZVxuIiwgX19mdW5jX18pOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlNlbmRDaGFycyBleGl0IGNvZGU6ICVkIiwgaVJldHVybik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBleGl0IGNvZGU6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIE5vdyBsZXQgZ28gb2YgdGhlIHNwaW5sb2NrICovCiAJcmV0dXJuIGlSZXR1cm47CiB9CkBAIC00NDYsNyArNDQ2LDcgQEAKIAkJICAgIHBkeC0+U3RhZ2VkRG9uZSArIHBkeC0+U3RhZ2VkT2Zmc2V0ICsgcEFyZWEtPmR3QmFzZU9mZnNldDsKIAkJY2hhciAqcENvaGVyQnVmID0gcGR4LT5wQ29oZXJTdGFnZWRJTzsJLyogIGNvaGVyZW50IGJ1ZmZlciAqLwogCQlpZiAoIXBBcmVhLT5iVXNlZCkgewotCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGFyZWEgJWQgdW51c2VkIiwKKwkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYXJlYSAlZCB1bnVzZWRcbiIsCiAJCQkJX19mdW5jX18sIG5BcmVhKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDc0LDIxICs0NzQsMjEgQEAKIAkJCQkJbiAtPSB1aVhmZXI7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBkaWQgbm90IG1hcCBwYWdlICVkIiwKKwkJCQkJCSIlczogZGlkIG5vdCBtYXAgcGFnZSAlZFxuIiwKIAkJCQkJCV9fZnVuY19fLCBuUGFnZSk7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIGV4Y2VlZGVkIHBhZ2VzICVkIiwgX19mdW5jX18sCi0JCQkJCW5QYWdlKTsKKwkJCQkJIiVzOiBleGNlZWRlZCBwYWdlcyAlZFxuIiwKKwkJCQkJX19mdW5jX18sIG5QYWdlKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAl9IGVsc2UKLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGJhZCBhcmVhICVkIiwgX19mdW5jX18sCi0JCQluQXJlYSk7CisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYmFkIGFyZWEgJWRcbiIsCisJCQlfX2Z1bmNfXywgbkFyZWEpOwogfQogCiAvKiAgRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHN0dWZmIHVzZWQgY2lyY3VsYXJseSAqLwpAQCAtNTEzLDExICs1MTMsMTEgQEAKIAkJICAgIChwVXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCBwVXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQKIAkJICAgICB8fCBwVXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKIAkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJCSIlczogbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCiAJCQkJX19mdW5jX18sIHBVcmItPnN0YXR1cyk7CiAJCX0gZWxzZQogCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJICIlcyAtIHN0YWdlZCB4ZmVyIGNhbmNlbGxlZCIsIF9fZnVuY19fKTsKKwkJCQkgIiVzOiBzdGFnZWQgeGZlciBjYW5jZWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCQlzcGluX2xvY2soJnBkeC0+ZXJyX2xvY2spOwogCQlwZHgtPmVycm9ycyA9IHBVcmItPnN0YXR1czsKQEAgLTUyNSwyNiArNTI1LDI2IEBACiAJCW5Hb3QgPSAwOwkvKiAgIGFuZCB0aWR5IHVwIGFnYWluIGlmIHNvICovCiAJCWJDYW5jZWwgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyAlZCBjaGFycyB4ZmVycmVkIiwgX19mdW5jX18sCi0JCQluR290KTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlZCBjaGFycyB4ZmVycmVkXG4iLAorCQkJX19mdW5jX18sIG5Hb3QpOwogCQlpZiAocGR4LT5TdGFnZWRSZWFkKQkvKiAgaWYgcmVhZGluZywgc2F2ZSB0byB1c2VyIHNwYWNlICovCiAJCQlDb3B5VXNlclNwYWNlKHBkeCwgbkdvdCk7CS8qICBjb3B5IGZyb20gYnVmZmVyIHRvIHVzZXIgKi8KIAkJaWYgKG5Hb3QgPT0gMCkKLQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBaTFAiLCBfX2Z1bmNfXyk7CisJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IFpMUFxuIiwgX19mdW5jX18pOwogCX0KIAogCS8qICBVcGRhdGUgdGhlIHRyYW5zZmVyIGxlbmd0aCBiYXNlZCBvbiB0aGUgVHJhbnNmZXJCdWZmZXJMZW5ndGggdmFsdWUgaW4gdGhlIFVSQiAqLwogCXBkeC0+U3RhZ2VkRG9uZSArPSBuR290OwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzLCBkb25lICVkIGJ5dGVzIG9mICVkIiwgX19mdW5jX18sCi0JCXBkeC0+U3RhZ2VkRG9uZSwgcGR4LT5TdGFnZWRMZW5ndGgpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZG9uZSAlZCBieXRlcyBvZiAlZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+U3RhZ2VkRG9uZSwgcGR4LT5TdGFnZWRMZW5ndGgpOwogCiAJaWYgKChwZHgtPlN0YWdlZERvbmUgPT0gcGR4LT5TdGFnZWRMZW5ndGgpIHx8CS8qICBJZiBubyBtb3JlIHRvIGRvICovCiAJICAgIChiQ2FuY2VsKSkgewkJLyogIG9yIHRoaXMgSVJQIHdhcyBjYW5jZWxsZWQgKi8KIAkJVFJBTlNBUkVBICpwQXJlYSA9ICZwZHgtPnJUcmFuc0RlZltwZHgtPlN0YWdlZElkXTsJLyogIFRyYW5zZmVyIGFyZWEgaW5mbyAqLwogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIHRyYW5zZmVyIGRvbmUsIGJ5dGVzICVkLCBjYW5jZWwgJWQiLCBfX2Z1bmNfXywKLQkJCXBkeC0+U3RhZ2VkRG9uZSwgYkNhbmNlbCk7CisJCQkiJXM6IHRyYW5zZmVyIGRvbmUsIGJ5dGVzICVkLCBjYW5jZWwgJWRcbiIsCisJCQlfX2Z1bmNfXywgcGR4LT5TdGFnZWREb25lLCBiQ2FuY2VsKTsKIAogCQkvKiAgSGVyZSBpcyB3aGVyZSB3ZSBzb3J0IG91dCB3aGF0IHRvIGRvIHdpdGggdGhpcyB0cmFuc2ZlciBpZiB1c2luZyBhIGNpcmN1bGFyIGJ1ZmZlci4gV2UgaGF2ZSAqLwogCQkvKiAgIGEgY29tcGxldGVkIHRyYW5zZmVyIHRoYXQgY2FuIGJlIGFzc3VtZWQgdG8gZml0IGludG8gdGhlIHRyYW5zZmVyIGFyZWEuIFdlIHNob3VsZCBiZSBhYmxlIHRvICovCkBAIC01NTksNyArNTU5LDcgQEAKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMV0uZHdTaXplICs9CiAJCQkJCSAgICBwZHgtPlN0YWdlZExlbmd0aDsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMSBub3cgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAxIG5vdyAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSwKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3T2Zmc2V0KTsKIAkJCQl9IGVsc2UgewpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSA9CiAJCQkJCSAgICBwZHgtPlN0YWdlZExlbmd0aDsKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBFUlJPUiwgY2lyYyBibG9jayAxIHJlLXN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJIiVzOiBFUlJPUiwgY2lyYyBibG9jayAxIHJlLXN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSwKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3T2Zmc2V0KTsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCQkJCQkgICAgIHBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSkpIHsKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSArPSBwZHgtPlN0YWdlZExlbmd0aDsJLyogIEp1c3QgYWRkIHRoaXMgdHJhbnNmZXIgaW4gKi8KIAkJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIG5vdyAlZCBieXRlcyBhdCAlZCIsCisJCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIG5vdyAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS4KIAkJCQkJCQlkd1NpemUsCiAJCQkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uCkBAIC01OTMsNyArNTkzLDcgQEAKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSA9CiAJCQkJCQkgICAgcGR4LT5TdGFnZWRMZW5ndGg7CiAJCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMSBzdGFydGVkICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJCQkiUldNX0NvbXBsZXRlLCBjaXJjIGJsb2NrIDEgc3RhcnRlZCAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS4KIAkJCQkJCQlkd1NpemUsCiAJCQkJCQkJcEFyZWEtPmFCbG9ja3NbMV0uCkBAIC02MDUsNyArNjA1LDcgQEAKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplID0KIAkJCQkJICAgIHBkeC0+U3RhZ2VkTGVuZ3RoOwogCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIHN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIHN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd1NpemUsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCk7CiAJCQkJfQpAQCAtNjE0LDcgKzYxNCw3IEBACiAKIAkJaWYgKCFiQ2FuY2VsKSB7IC8qICBEb24ndCBnZW5lcmF0ZSBhbiBldmVudCBpZiBjYW5jZWxsZWQgKi8KIAkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIlJXTV9Db21wbGV0ZSwgIGJDaXJjdWxhciAlZCwgYlRvSG9zdCAlZCwgZVN0YXJ0ICVkLCBlU2l6ZSAlZCIsCisJCQkJIlJXTV9Db21wbGV0ZSwgIGJDaXJjdWxhciAlZCwgYlRvSG9zdCAlZCwgZVN0YXJ0ICVkLCBlU2l6ZSAlZFxuIiwKIAkJCQlwQXJlYS0+YkNpcmN1bGFyLCBwQXJlYS0+YkV2ZW50VG9Ib3N0LAogCQkJCXBBcmVhLT5kd0V2ZW50U3QsIHBBcmVhLT5kd0V2ZW50U3opOwogCQkJaWYgKChwQXJlYS0+ZHdFdmVudFN6KSAmJgkvKiAgU2V0IGEgdXNlci1tb2RlIGV2ZW50Li4uICovCkBAIC02NDEsNyArNjQxLDcgQEAKIAogCQkJCWlmIChpV2FrZVVwKSB7CiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiQWJvdXQgdG8gc2V0IGV2ZW50IHRvIG5vdGlmeSBhcHAiKTsKKwkJCQkJCSJBYm91dCB0byBzZXQgZXZlbnQgdG8gbm90aWZ5IGFwcFxuIik7CiAJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcEFyZWEtPndxRXZlbnQpOwkvKiAgd2FrZSB1cCB3YWl0aW5nIHByb2Nlc3NlcyAqLwogCQkJCQkrK3BBcmVhLT5pV2FrZVVwOwkvKiAgaW5jcmVtZW50IHdha2V1cCBjb3VudCAqLwogCQkJCX0KQEAgLTY1NSw3ICs2NTUsNyBAQAogCQkJaWYgKHBkeC0+YlhGZXJXYWl0aW5nKSB7CS8qICBHb3QgYSBibG9jayB4ZmVyIHdhaXRpbmc/ICovCiAJCQkJaW50IGlSZXR1cm47CiAJCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSAiKioqIFJXTV9Db21wbGV0ZSAqKiogcGVuZGluZyB0cmFuc2ZlciB3aWxsIG5vdyBiZSBzZXQgdXAhISEiKTsKKwkJCQkJICIqKiogUldNX0NvbXBsZXRlICoqKiBwZW5kaW5nIHRyYW5zZmVyIHdpbGwgbm93IGJlIHNldCB1cCEhIVxuIik7CiAJCQkJaVJldHVybiA9CiAJCQkJICAgIFJlYWRXcml0ZU1lbShwZHgsICFwZHgtPnJETUFJbmZvLmJPdXRXYXJkLAogCQkJCQkJIHBkeC0+ckRNQUluZm8ud0lkZW50LApAQCAtNjY0LDcgKzY2NCw3IEBACiAKIAkJCQlpZiAoaVJldHVybikKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJSV01fQ29tcGxldGUgcncgc2V0dXAgZmFpbGVkICVkIiwKKwkJCQkJCSJSV01fQ29tcGxldGUgcncgc2V0dXAgZmFpbGVkICVkXG4iLAogCQkJCQkJaVJldHVybik7CiAJCQl9CiAJCX0KQEAgLTY4NSw3ICs2ODUsNyBAQAogCS8qICBub3QgYmUgdXBzZXQgYnkgY2hhciBpbnB1dCBkdXJpbmcgRE1BLi4uIHNpZ2guIE5lZWRzIHNvcnRpbmcgb3V0LiAqLwogCWlmIChiUmVzdGFydENoYXJJbnB1dCkJLyogIG1heSBiZSBvdXQgb2YgZGF0ZSwgYnV0Li4uICovCiAJCUFsbG93aShwZHgpOwkvKiAgLi4uQWxsb3dpIHRlc3RzIGEgbG9jayB0b28uICovCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGRvbmUiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MDcsNyArNzA3LDcgQEAKIAkJcmV0dXJuIFUxNEVSUl9GQUlMOwogCiAJaWYgKCFDYW5BY2NlcHRJb1JlcXVlc3RzKHBkeCkpIHsJLyogIGdvdCBzdWRkZW4gcmVtb3ZlPyAqLwotCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHN1ZGRlbiByZW1vdmUsIGdpdmluZyB1cCIsCisJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHN1ZGRlbiByZW1vdmUsIGdpdmluZyB1cFxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiBVMTRFUlJfRkFJTDsJLyogIGNvdWxkIGRvIHdpdGggYSBiZXR0ZXIgZXJyb3IgKi8KIAl9CkBAIC03MzEsMTEgKzczMSwxMSBAQAogCWlmIChpUmV0dXJuKSB7CiAJCXVzYl91bmFuY2hvcl91cmIocGR4LT5wU3RhZ2VkVXJiKTsJLyogIGtpbGwgaXQgKi8KIAkJcGR4LT5iUGlwZUVycm9yW25QaXBlXSA9IDE7CS8qICBGbGFnIGFuIGVycm9yIHRvIGJlIGhhbmRsZWQgbGF0ZXIgKi8KLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHN1Ym1pdCB1cmIgZmFpbGVkLCBjb2RlICVkIiwKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBzdWJtaXQgdXJiIGZhaWxlZCwgY29kZSAlZFxuIiwKIAkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAl9IGVsc2UKIAkJcGR4LT5iU3RhZ2VkVXJiUGVuZGluZyA9IHRydWU7CS8qICBTZXQgdGhlIGZsYWcgZm9yIHN0YWdlZCBVUkIgcGVuZGluZyAqLwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBkb25lIHNvIGZhcjolZCwgdGhpcyBzaXplOiVkIiwKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGRvbmUgc28gZmFyOiVkLCB0aGlzIHNpemU6JWRcbiIsCiAJCV9fZnVuY19fLCBwZHgtPlN0YWdlZERvbmUsIENodW5rU2l6ZSk7CiAKIAlyZXR1cm4gaVJldHVybjsKQEAgLTc2NCwyOCArNzY0LDI4IEBACiAJVFJBTlNBUkVBICpwQXJlYSA9ICZwZHgtPnJUcmFuc0RlZlt3SWRlbnRdOwkvKiAgVHJhbnNmZXIgYXJlYSBpbmZvICovCiAKIAlpZiAoIUNhbkFjY2VwdElvUmVxdWVzdHMocGR4KSkgewkvKiAgQXJlIHdlIGluIGEgc3RhdGUgdG8gYWNjZXB0IG5ldyByZXF1ZXN0cz8gKi8KLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbid0IGFjY2VwdCByZXF1ZXN0cyIsCisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FuJ3QgYWNjZXB0IHJlcXVlc3RzXG4iLAogCQkJX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX0ZBSUw7CiAJfQogCiAJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJIiVzIHhmZXIgJWQgYnl0ZXMgdG8gJXMsIG9mZnNldCAlZCwgYXJlYSAlZCIsIF9fZnVuY19fLCBkd0xlbiwKLQkJUmVhZCA/ICJob3N0IiA6ICIxNDAxIiwgZHdPZmZzLCB3SWRlbnQpOworCQkiJXM6IHhmZXIgJWQgYnl0ZXMgdG8gJXMsIG9mZnNldCAlZCwgYXJlYSAlZFxuIiwKKwkJX19mdW5jX18sIGR3TGVuLCBSZWFkID8gImhvc3QiIDogIjE0MDEiLCBkd09mZnMsIHdJZGVudCk7CiAKIAkvKiAgQW1hemluZ2x5LCB3ZSBjYW4gZ2V0IGFuIGVzY2FwZSBzZXF1ZW5jZSBiYWNrIGJlZm9yZSB0aGUgY3VycmVudCBzdGFnZWQgVXJiIGlzIGRvbmUsIHNvIHdlICovCiAJLyogICBoYXZlIHRvIGNoZWNrIGZvciB0aGlzIHNpdHVhdGlvbiBhbmQsIGlmIHNvLCB3YWl0IHVudGlsIGFsbCBpcyBPSy4gKi8KIAlpZiAocGR4LT5iU3RhZ2VkVXJiUGVuZGluZykgewogCQlwZHgtPmJYRmVyV2FpdGluZyA9IHRydWU7CS8qICBGbGFnIHdlIGFyZSB3YWl0aW5nICovCiAJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJICIlcyB4ZmVyIGlzIHdhaXRpbmcsIGFzIHByZXZpb3VzIHN0YWdlZCBwZW5kaW5nIiwKKwkJCSAiJXM6IHhmZXIgaXMgd2FpdGluZywgYXMgcHJldmlvdXMgc3RhZ2VkIHBlbmRpbmdcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX05PRVJST1I7CiAJfQogCiAJaWYgKGR3TGVuID09IDApIHsJCS8qICBhbGxvdyAwLWxlbiByZWFkIG9yIHdyaXRlOyBqdXN0IHJldHVybiBzdWNjZXNzICovCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiJXMgT0s7IHplcm8tbGVuIHJlYWQvd3JpdGUgcmVxdWVzdCIsIF9fZnVuY19fKTsKKwkJCSIlczogT0s7IHplcm8tbGVuIHJlYWQvd3JpdGUgcmVxdWVzdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX05PRVJST1I7CiAJfQogCkBAIC03OTUsNyArNzk1LDcgQEAKIAkJYm9vbCBiV2FpdCA9IGZhbHNlOwkvKiAgRmxhZyBmb3IgdHJhbnNmZXIgaGF2aW5nIHRvIHdhaXQgKi8KIAogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIkNpcmN1bGFyIGJ1ZmZlcnMgYXJlICVkIGF0ICVkIGFuZCAlZCBhdCAlZCIsCisJCQkiQ2lyY3VsYXIgYnVmZmVycyBhcmUgJWQgYXQgJWQgYW5kICVkIGF0ICVkXG4iLAogCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLCBwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCwKIAkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSwgcEFyZWEtPmFCbG9ja3NbMV0uZHdPZmZzZXQpOwogCQlpZiAocEFyZWEtPmFCbG9ja3NbMV0uZHdTaXplID4gMCkgewkvKiAgVXNpbmcgdGhlIHNlY29uZCBibG9jayBhbHJlYWR5PyAqLwpAQCAtODE5LDE0ICs4MTksMTQgQEAKIAkJaWYgKGJXYWl0KSB7CS8qICBUaGlzIHRyYW5zZmVyIHdpbGwgaGF2ZSB0byB3YWl0PyAqLwogCQkJcGR4LT5iWEZlcldhaXRpbmcgPSB0cnVlOwkvKiAgRmxhZyB3ZSBhcmUgd2FpdGluZyAqLwogCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgeGZlciB3YWl0aW5nIGZvciBjaXJjdWxhciBidWZmZXIgc3BhY2UiLAorCQkJCSIlczogeGZlciB3YWl0aW5nIGZvciBjaXJjdWxhciBidWZmZXIgc3BhY2VcbiIsCiAJCQkJX19mdW5jX18pOwogCQkJcmV0dXJuIFUxNEVSUl9OT0VSUk9SOwogCQl9CiAKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyBjaXJjdWxhciB4ZmVyLCAlZCBieXRlcyBzdGFydGluZyBhdCAlZCIsIF9fZnVuY19fLAotCQkJZHdMZW4sIGR3T2Zmcyk7CisJCQkiJXM6IGNpcmN1bGFyIHhmZXIsICVkIGJ5dGVzIHN0YXJ0aW5nIGF0ICVkXG4iLAorCQkJX19mdW5jX18sIGR3TGVuLCBkd09mZnMpOwogCX0KIAkvKiAgU2F2ZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlYWRcd3JpdGUgdHJhbnNmZXIgKi8KIAlwZHgtPlN0YWdlZFJlYWQgPSBSZWFkOwkvKiAgU2F2ZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyByZWFkICovCkBAIC05NDgsNyArOTQ4LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHVjRGF0YTsKIAl1bnNpZ25lZCBpbnQgZERvbmUgPSAwOwkvKiAgV2UgaGF2ZW4ndCBwYXJzZWQgYW55dGhpbmcgc28gZmFyICovCiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoUmVhZENoYXIoJnVjRGF0YSwgcEJ1ZiwgJmREb25lLCBkd0NvdW50KSkgewogCQl1bnNpZ25lZCBjaGFyIHVjVHJhbnNDb2RlID0gKHVjRGF0YSAmIDB4MEYpOwkvKiAgZ2V0IGNvZGUgZm9yIHRyYW5zZmVyIHR5cGUgKi8KQEAgLTk2MCw4ICs5NjAsOCBAQAogCQlwRG1hRGVzYy0+ZHdTaXplID0gMDsJLyogIGluaXRpYWxpc2Ugb3RoZXIgYml0cyAqLwogCQlwRG1hRGVzYy0+ZHdPZmZzZXQgPSAwOwogCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyB0eXBlOiAlZCBpZGVudDogJWQiLCBfX2Z1bmNfXywKLQkJCXBEbWFEZXNjLT53VHJhbnNUeXBlLCBwRG1hRGVzYy0+d0lkZW50KTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiB0eXBlOiAlZCBpZGVudDogJWRcbiIsCisJCQlfX2Z1bmNfXywgcERtYURlc2MtPndUcmFuc1R5cGUsIHBEbWFEZXNjLT53SWRlbnQpOwogCiAJCXBEbWFEZXNjLT5iT3V0V2FyZCA9ICh1Y1RyYW5zQ29kZSAhPSBUTV9FWFRUT0hPU1QpOwkvKiAgc2V0IHRyYW5zZmVyIGRpcmVjdGlvbiAqLwogCkBAIC05NzYsNyArOTc2LDcgQEAKIAkJCQkJCSZkRG9uZSwgZHdDb3VudCk7CiAJCQkJaWYgKGJSZXN1bHQpIHsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyB4ZmVyIG9mZnNldCAmIHNpemUgJWQgJWQiLAorCQkJCQkJIiVzOiB4ZmVyIG9mZnNldCAmIHNpemUgJWQgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgcERtYURlc2MtPmR3T2Zmc2V0LAogCQkJCQkJcERtYURlc2MtPmR3U2l6ZSk7CiAKQEAgLTk4OSw3ICs5ODksNyBAQAogCQkJCQkgICAgICBkd0xlbmd0aCkpKSB7CiAJCQkJCQliUmVzdWx0ID0gZmFsc2U7CS8qICBiYWQgcGFyYW1ldGVyKHMpICovCiAJCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSIlcyBiYWQgcGFyYW0gLSBpZCAlZCwgYlVzZWQgJWQsIG9mZnNldCAlZCwgc2l6ZSAlZCwgYXJlYSBsZW5ndGggJWQiLAorCQkJCQkJCSIlczogYmFkIHBhcmFtIC0gaWQgJWQsIGJVc2VkICVkLCBvZmZzZXQgJWQsIHNpemUgJWQsIGFyZWEgbGVuZ3RoICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCB3SWRlbnQsCiAJCQkJCQkJcGR4LT5yVHJhbnNEZWZbd0lkZW50XS4KIAkJCQkJCQliVXNlZCwKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAJCWJSZXN1bHQgPSBmYWxzZTsKIAogCWlmICghYlJlc3VsdCkJCS8qICBub3cgY2hlY2sgcGFyYW1ldGVycyBmb3IgdmFsaWRpdHkgKi8KLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGVycm9yIHJlYWRpbmcgRXNjIHNlcXVlbmNlIiwKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlcnJvciByZWFkaW5nIEVzYyBzZXF1ZW5jZVxuIiwKIAkJCV9fZnVuY19fKTsKIAogCXJldHVybiBiUmVzdWx0OwpAQCAtMTA0NSwxNSArMTA0NSwxNSBAQAogCQkJdW5zaWduZWQgc2hvcnQgd1RyYW5zVHlwZSA9IHBkeC0+ckRNQUluZm8ud1RyYW5zVHlwZTsJLyogIGNoZWNrIHRyYW5zZmVyIHR5cGUgKi8KIAogCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgeGZlciB0byAlcywgb2Zmc2V0ICVkLCBsZW5ndGggJWQiLCBfX2Z1bmNfXywKKwkJCQkiJXM6IHhmZXIgdG8gJXMsIG9mZnNldCAlZCwgbGVuZ3RoICVkXG4iLAorCQkJCV9fZnVuY19fLAogCQkJCXBkeC0+ckRNQUluZm8uYk91dFdhcmQgPyAiMTQwMSIgOiAiaG9zdCIsCiAJCQkJcGR4LT5yRE1BSW5mby5kd09mZnNldCwgcGR4LT5yRE1BSW5mby5kd1NpemUpOwogCiAJCQlpZiAocGR4LT5iWEZlcldhaXRpbmcpIHsgLyogIENoZWNrIGhlcmUgZm9yIGJhZGx5IG91dCBvZiBraWx0ZXIuLi4gKi8KIAkJCQkvKiAgVGhpcyBjYW4gbmV2ZXIgaGFwcGVuLCByZWFsbHkgKi8KIAkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiRVJST1I6IERNQSBzZXR1cCB3aGlsZSB0cmFuc2ZlciBzdGlsbCB3YWl0aW5nIik7Ci0JCQkJc3Bpbl91bmxvY2soJnBkeC0+c3RhZ2VkTG9jayk7CisJCQkJCSJFUlJPUjogRE1BIHNldHVwIHdoaWxlIHRyYW5zZmVyIHN0aWxsIHdhaXRpbmdcbiIpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKHdUcmFuc1R5cGUgPT0gVE1fRVhUVE9IT1NUKQogCQkJCSAgICB8fCAod1RyYW5zVHlwZSA9PSBUTV9FWFRUTzE0MDEpKSB7CkBAIC0xMDY2LDIxICsxMDY2LDIxIEBACiAJCQkJCQkJIHBkeC0+ckRNQUluZm8uZHdTaXplKTsKIAkJCQkJaWYgKGlSZXR1cm4gIT0gVTE0RVJSX05PRVJST1IpCiAJCQkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSIlcyBSZWFkV3JpdGVNZW0oKSBmYWlsZWQgJWQiLAorCQkJCQkJCSIlczogUmVhZFdyaXRlTWVtKCkgZmFpbGVkICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAkJCQl9IGVsc2UJLyogIFRoaXMgY292ZXJzIG5vbi1saW5lYXIgdHJhbnNmZXIgc2V0dXAgKi8KIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBVbmtub3duIGJsb2NrIHhmZXIgdHlwZSAlZCIsCisJCQkJCQkiJXM6IFVua25vd24gYmxvY2sgeGZlciB0eXBlICVkXG4iLAogCQkJCQkJX19mdW5jX18sIHdUcmFuc1R5cGUpOwogCQkJfQogCQl9IGVsc2UJCS8qICBGYWlsZWQgdG8gcmVhZCBwYXJhbWV0ZXJzICovCi0JCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgUmVhZERNQUluZm8oKSBmYWlsIiwKKwkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogUmVhZERNQUluZm8oKSBmYWlsXG4iLAogCQkJCV9fZnVuY19fKTsKIAogCQlzcGluX3VubG9jaygmcGR4LT5zdGFnZWRMb2NrKTsJLyogIE9LIGhlcmUgKi8KIAl9CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgcmV0dXJucyAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtMTEwMCwxMSArMTEwMCwxMSBAQAogCQkgICAgKHBVcmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHBVcmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVAogCQkgICAgIHx8IHBVcmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkgewogCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkJIiVzOiBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcFVyYi0+c3RhdHVzKTsKIAkJfSBlbHNlCiAJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSIlcyAtIDAgY2hhcnMgcFVyYi0+c3RhdHVzPSVkIChzaHV0ZG93bj8pIiwKKwkJCQkiJXM6IDAgY2hhcnMgcFVyYi0+c3RhdHVzPSVkIChzaHV0ZG93bj8pXG4iLAogCQkJCV9fZnVuY19fLCBwVXJiLT5zdGF0dXMpOwogCiAJCXNwaW5fbG9jaygmcGR4LT5lcnJfbG9jayk7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogCQkJCWlmIChuR290IDwgSU5CVUZfU1opIHsKIAkJCQkJcGR4LT5wQ29oZXJDaGFySW5bbkdvdF0gPSAwOwkvKiAgdGlkeSB0aGUgc3RyaW5nICovCiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgZ290ICVkIGNoYXJzID4lczwiLAorCQkJCQkJIiVzOiBnb3QgJWQgY2hhcnMgPiVzPFxuIiwKIAkJCQkJCV9fZnVuY19fLCBuR290LAogCQkJCQkJcGR4LT5wQ29oZXJDaGFySW4pOwogCQkJCX0KQEAgLTExNDAsNyArMTE0MCw3IEBACiAJCQkJaWYgKChwZHgtPmR3TnVtSW5wdXQgKyBuR290KSA8PSBJTkJVRl9TWikKIAkJCQkJcGR4LT5kd051bUlucHV0ICs9IG5Hb3Q7CS8qICBBZGp1c3QgdGhlIGJ1ZmZlciBjb3VudCBhY2NvcmRpbmdseSAqLwogCQkJfSBlbHNlCi0JCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHJlYWQgWkxQIiwKKwkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHJlYWQgWkxQXG4iLAogCQkJCQlfX2Z1bmNfXyk7CiAJCX0KIAl9CkBAIC0xMTc4LDcgKzExNzgsNyBAQAogCQl1bnNpZ25lZCBpbnQgbk1heCA9IElOQlVGX1NaIC0gcGR4LT5kd051bUlucHV0OwkvKiAgbWF4IHdlIGNvdWxkIHJlYWQgKi8KIAkJaW50IG5QaXBlID0gcGR4LT5uUGlwZXMgPT0gNCA/IDEgOiAwOwkvKiAgVGhlIHBpcGUgbnVtYmVyIHRvIHVzZSAqLwogCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyAlZCBjaGFycyBpbiBpbnB1dCBidWZmZXIiLAorCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkIGNoYXJzIGluIGlucHV0IGJ1ZmZlclxuIiwKIAkJCV9fZnVuY19fLCBwZHgtPmR3TnVtSW5wdXQpOwogCiAJCXVzYl9maWxsX2ludF91cmIocGR4LT5wVXJiQ2hhckluLCBwZHgtPnVkZXYsCkBAIC0xMTkyLDcgKzExOTIsOCBAQAogCQkJdXNiX3VuYW5jaG9yX3VyYihwZHgtPnBVcmJDaGFySW4pOwkvKiAgcmVtb3ZlIGZyb20gbGlzdCBvZiBhY3RpdmUgVXJicyAqLwogCQkJcGR4LT5iUGlwZUVycm9yW25QaXBlXSA9IDE7CS8qICBGbGFnIGFuIGVycm9yIHRvIGJlIGhhbmRsZWQgbGF0ZXIgKi8KIAkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIHN1Ym1pdCB1cmIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwkJCQkiJXM6IHN1Ym1pdCB1cmIgZmFpbGVkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaVJldHVybik7CiAJCX0gZWxzZQogCQkJcGR4LT5iUmVhZENoYXJzUGVuZGluZyA9IHRydWU7CS8qICBGbGFnIHRoYXQgd2UgYXJlIGFjdGl2ZSBoZXJlICovCiAJfQpAQCAtMTI1MCwxMyArMTI1MSwxMyBAQAogCQlyZXR1cm4gR2V0U3RyaW5nKHBkeCwgKGNoYXIgX191c2VyICopdWxBcmcsIF9JT0NfU0laRShjbWQpKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfU0VUVFJBTlNGRVIpOgotCQlyZXR1cm4gU2V0VHJhbnNmZXIocGR4LCAoVFJBTlNGRVJERVNDIF9fdXNlciAqKSB1bEFyZyk7CisJCXJldHVybiBTZXRUcmFuc2ZlcihwZHgsIChzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIF9fdXNlciAqKSB1bEFyZyk7CiAKIAljYXNlIF9JT0NfTlIoSU9DVExfQ0VEX1VOU0VUVFJBTlNGRVIpOgogCQlyZXR1cm4gVW5zZXRUcmFuc2ZlcihwZHgsIChpbnQpdWxBcmcpOwogCiAJY2FzZSBfSU9DX05SKElPQ1RMX0NFRF9TRVRFVkVOVCk6Ci0JCXJldHVybiBTZXRFdmVudChwZHgsIChUUkFOU0ZFUkVWRU5UIF9fdXNlciAqKSB1bEFyZyk7CisJCXJldHVybiBTZXRFdmVudChwZHgsIChzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQgX191c2VyICopIHVsQXJnKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfR0VUT1VUQlVGU1BBQ0UpOgogCQlyZXR1cm4gR2V0T3V0QnVmU3BhY2UocGR4KTsKQEAgLTEzMTUsNyArMTMxNiw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBfSU9DX05SKElPQ1RMX0NFRF9TRVRDSVJDVUxBUik6Ci0JCXJldHVybiBTZXRDaXJjdWxhcihwZHgsIChUUkFOU0ZFUkRFU0MgX191c2VyICopIHVsQXJnKTsKKwkJcmV0dXJuIFNldENpcmN1bGFyKHBkeCwgKHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgX191c2VyICopIHVsQXJnKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfR0VUQ0lSQ0JMT0NLKToKIAkJcmV0dXJuIEdldENpcmNCbG9jayhwZHgsIChUQ0lSQ0JMT0NLIF9fdXNlciAqKSB1bEFyZyk7CkBAIC0xMzk3LDcgKzEzOTgsNyBAQAogCWVsc2UgaWYgKChpID49IDEpICYmIChpIDw9IDIzKSkKIAkJcGR4LT5zMTQwMVR5cGUgPSBpICsgMjsKIAllbHNlIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyBVbmtub3duIGRldmljZS4gYmNkRGV2aWNlID0gJWQiLAorCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBVbmtub3duIGRldmljZS4gYmNkRGV2aWNlID0gJWRcbiIsCiAJCQlfX2Z1bmNfXywgYmNkRGV2aWNlKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNDA1LDcgKzE0MDYsNyBAQAogCS8qICB3ZSBrbm93IHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIDE0MDEgZGV2aWNlLiAqLwogCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCXBkeC0+blBpcGVzID0gaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOwotCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIjE0MDFUeXBlPSVkIHdpdGggJWQgRW5kIFBvaW50cyIsCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiMTQwMVR5cGU9JWQgd2l0aCAlZCBFbmQgUG9pbnRzXG4iLAogCQkgcGR4LT5zMTQwMVR5cGUsIHBkeC0+blBpcGVzKTsKIAlpZiAoKHBkeC0+blBpcGVzIDwgMykgfHwgKHBkeC0+blBpcGVzID4gNCkpCiAJCWdvdG8gZXJyb3I7CkBAIC0xNDE1LDcgKzE0MTYsNyBAQAogCXBkeC0+cFVyYkNoYXJJbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CS8qICBjaGFyYWN0ZXIgaW5wdXQgVVJCICovCiAJcGR4LT5wU3RhZ2VkVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsJLyogIGJsb2NrIHRyYW5zZmVyIFVSQiAqLwogCWlmICghcGR4LT5wVXJiQ2hhck91dCB8fCAhcGR4LT5wVXJiQ2hhckluIHx8ICFwZHgtPnBTdGFnZWRVcmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyBVUkIgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBVUkIgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0xNDI5LDcgKzE0MzAsNyBAQAogCSAgICB1c2JfYWxsb2NfY29oZXJlbnQocGR4LT51ZGV2LCBJTkJVRl9TWiwgR0ZQX0tFUk5FTCwKIAkJCSAgICAgICAmcGR4LT5wVXJiQ2hhckluLT50cmFuc2Zlcl9kbWEpOwogCWlmICghcGR4LT5wQ29oZXJDaGFyT3V0IHx8ICFwZHgtPnBDb2hlckNoYXJJbiB8fCAhcGR4LT5wQ29oZXJTdGFnZWRJTykgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIENvaGVyZW50IGJ1ZmZlciBhbGxvYyBmYWlsZWQiLAorCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBDb2hlcmVudCBidWZmZXIgYWxsb2MgZmFpbGVkXG4iLAogCQkJX19mdW5jX18pOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE0MzcsMTkgKzE0MzgsMTkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcGR4LT5uUGlwZXM7ICsraSkgewogCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOwogCQlwZHgtPmVwQWRkcltpXSA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJQaXBlICVkLCBlcCBhZGRyZXNzICUwMngiLCBpLAotCQkJIHBkeC0+ZXBBZGRyW2ldKTsKKwkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiUGlwZSAlZCwgZXAgYWRkcmVzcyAlMDJ4XG4iLAorCQkJIGksIHBkeC0+ZXBBZGRyW2ldKTsKIAkJaWYgKCgocGR4LT5uUGlwZXMgPT0gMykgJiYgKGkgPT0gMCkpIHx8CS8qICBpZiBjaGFyIGlucHV0IGVuZCBwb2ludCAqLwogCQkgICAgKChwZHgtPm5QaXBlcyA9PSA0KSAmJiAoaSA9PSAxKSkpIHsKIAkJCXBkeC0+YkludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsJLyogIHNhdmUgdGhlIGVuZHBvaW50IGludGVycnVwdCBpbnRlcnZhbCAqLwotCQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiUGlwZSAlZCwgYkludGVydmFsID0gJWQiLCBpLAotCQkJCSBwZHgtPmJJbnRlcnZhbCk7CisJCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJQaXBlICVkLCBiSW50ZXJ2YWwgPSAlZFxuIiwKKwkJCQkgaSwgcGR4LT5iSW50ZXJ2YWwpOwogCQl9CiAJCS8qICBEZXRlY3QgVVNCMiBieSBjaGVja2luZyBsYXN0IGVwIHNpemUgKDY0IGlmIFVTQjEpICovCiAJCWlmIChpID09IHBkeC0+blBpcGVzIC0gMSkgewkvKiAgaWYgdGhpcyBpcyB0aGUgbGFzdCBlcCAoYnVsaykgKi8KIAkJCXBkeC0+YklzVVNCMiA9CiAJCQkgICAgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA+IDY0OwotCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJVU0IlZCIsCisJCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlVTQiVkXG4iLAogCQkJCSBwZHgtPmJJc1VTQjIgKyAxKTsKIAkJfQogCX0KQEAgLTE0NjIsMTQgKzE0NjMsMTQgQEAKIAlpZiAocmV0dmFsKSB7CiAJCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLwogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCSJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKKwkJCSJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2VcbiIpOwogCQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLwogCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKLQkJICJVU0IgQ0VEVVNCIGRldmljZSBub3cgYXR0YWNoZWQgdG8gY2VkdXNiICMlZCIsCisJCSAiVVNCIENFRFVTQiBkZXZpY2Ugbm93IGF0dGFjaGVkIHRvIGNlZHVzYiAjJWRcbiIsCiAJCSBpbnRlcmZhY2UtPm1pbm9yKTsKIAlyZXR1cm4gMDsKIApAQCAtMTQ5Myw3ICsxNDk0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1RSQU5TQVJFQVM7ICsraSkgewogCQlpbnQgaUVyciA9IENsZWFyQXJlYShwZHgsIGkpOwkvKiAgLi4ucmVsZWFzZSBhbnkgdXNlZCBtZW1vcnkgKi8KIAkJaWYgKGlFcnIgPT0gVTE0RVJSX1VOTE9DS0ZBSUwpCi0JCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQXJlYSAlZCB3YXMgaW4gdXNlZCIsCisJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEFyZWEgJWQgd2FzIGluIHVzZWRcbiIsCiAJCQkJX19mdW5jX18sIGkpOwogCX0KIAlwZHgtPmludGVyZmFjZSA9IE5VTEw7CS8qICAuLi53ZSBraWxsIG9mZiBsaW5rIHRvIGludGVyZmFjZSAqLwpAQCAtMTUwMyw3ICsxNTA0LDcgQEAKIAogCWtyZWZfcHV0KCZwZHgtPmtyZWYsIGNlZF9kZWxldGUpOwkvKiAgZGVjcmVtZW50IG91ciB1c2FnZSBjb3VudCAqLwogCi0JZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCIGNlZHVzYiAjJWQgbm93IGRpc2Nvbm5lY3RlZCIsIG1pbm9yKTsKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgY2VkdXNiICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7CiB9CiAKIC8qICBXYWl0IGZvciBhbGwgdGhlIHVyYnMgd2Uga25vdyBvZiB0byBiZSBkb25lIHdpdGgsIHRoZW4ga2lsbCBvZmYgYW55IHRoYXQgKi8KQEAgLTE1MTMsMTMgKzE1MTQsMTMgQEAKIHZvaWQgY2VkX2RyYXdfZG93bihERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7CiAJaW50IHRpbWU7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJcGR4LT5iSW5EcmF3RG93biA9IHRydWU7CiAJdGltZSA9IHVzYl93YWl0X2FuY2hvcl9lbXB0eV90aW1lb3V0KCZwZHgtPnN1Ym1pdHRlZCwgMzAwMCk7CiAJaWYgKCF0aW1lKSB7CQkvKiAgaWYgd2UgdGltZWQgb3V0IHdlIGtpbGwgdGhlIHVyYnMgKi8KIAkJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmcGR4LT5zdWJtaXR0ZWQpOwotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgdGltZWQgb3V0IiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwogCX0KIAlwZHgtPmJJbkRyYXdEb3duID0gZmFsc2U7CiB9CkBAIC0xNTMxLDcgKzE1MzIsNyBAQAogCQlyZXR1cm4gMDsKIAljZWRfZHJhd19kb3duKHBkeCk7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NDAsMTQgKzE1NDEsMTQgQEAKIAlERVZJQ0VfRVhURU5TSU9OICpwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWlmICghcGR4KQogCQlyZXR1cm4gMDsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY2VkX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlERVZJQ0VfRVhURU5TSU9OICpwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAljZWRfZHJhd19kb3duKHBkeCk7CiAJcmV0dXJuIDA7CkBAIC0xNTU2LDcgKzE1NTcsNyBAQAogc3RhdGljIGludCBjZWRfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlERVZJQ0VfRVhURU5TSU9OICpwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIHdlIGFyZSBzdXJlIG5vIFVSQnMgYXJlIGFjdGl2ZSAtIG5vIGxvY2tpbmcgbmVlZGVkICovCiAJcGR4LT5lcnJvcnMgPSAtRVBJUEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmggYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmgKaW5kZXggZjAzMWUzYS4uZWEwZmU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuaApAQCAtMjE4LDkgKzIxOCw5IEBACiBleHRlcm4gaW50IFJlc2V0MTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpOwogZXh0ZXJuIGludCBHZXRDaGFyKERFVklDRV9FWFRFTlNJT04gKnBkeCk7CiBleHRlcm4gaW50IEdldFN0cmluZyhERVZJQ0VfRVhURU5TSU9OICpwZHgsIGNoYXIgX191c2VyICpwVXNlciwgaW50IG4pOwotZXh0ZXJuIGludCBTZXRUcmFuc2ZlcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSREVTQyBfX3VzZXIgKnBURCk7CitleHRlcm4gaW50IFNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyBfX3VzZXIgKnBURCk7CiBleHRlcm4gaW50IFVuc2V0VHJhbnNmZXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBpbnQgbkFyZWEpOwotZXh0ZXJuIGludCBTZXRFdmVudChERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSRVZFTlQgX191c2VyICpwVEUpOworZXh0ZXJuIGludCBTZXRFdmVudChERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCBfX3VzZXIgKnBURSk7CiBleHRlcm4gaW50IFN0YXQxNDAxKERFVklDRV9FWFRFTlNJT04gKnBkeCk7CiBleHRlcm4gaW50IExpbmVDb3VudChERVZJQ0VfRVhURU5TSU9OICpwZHgpOwogZXh0ZXJuIGludCBHZXRPdXRCdWZTcGFjZShERVZJQ0VfRVhURU5TSU9OICpwZHgpOwpAQCAtMjM4LDcgKzIzOCw3IEBACiBleHRlcm4gaW50IERiZ1JhbXBBZGRyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVERCR0JMT0NLIF9fdXNlciAqcERCKTsKIGV4dGVybiBpbnQgRGJnR2V0RGF0YShERVZJQ0VfRVhURU5TSU9OICpwZHgsIFREQkdCTE9DSyBfX3VzZXIgKnBEQik7CiBleHRlcm4gaW50IERiZ1N0b3BMb29wKERFVklDRV9FWFRFTlNJT04gKnBkeCk7Ci1leHRlcm4gaW50IFNldENpcmN1bGFyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVFJBTlNGRVJERVNDIF9fdXNlciAqcFREKTsKK2V4dGVybiBpbnQgU2V0Q2lyY3VsYXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIF9fdXNlciAqcFREKTsKIGV4dGVybiBpbnQgR2V0Q2lyY0Jsb2NrKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVENJUkNCTE9DSyBfX3VzZXIgKnBDQik7CiBleHRlcm4gaW50IEZyZWVDaXJjQmxvY2soREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUQ0lSQ0JMT0NLIF9fdXNlciAqcENCKTsKIGV4dGVybiBpbnQgV2FpdEV2ZW50KERFVklDRV9FWFRFTlNJT04gKnBkeCwgaW50IG5BcmVhLCBpbnQgbXNUaW1lT3V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZTE0X2lvYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlMTRfaW9jLmgKaW5kZXggOTdkNzkxMy4uNDJkMmU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlMTRfaW9jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlMTRfaW9jLmgKQEAgLTI3NiwxNSArMjc2LDE0IEBACiAKIHR5cGVkZWYgUEFSQU1CTEsqICAgUFBBUkFNQkxLOwogCi10eXBlZGVmIHN0cnVjdCBUcmFuc2ZlckRlc2MgICAgICAgICAgLyogU3RydWN0dXJlIGFuZCB0eXBlIGZvciBTZXRUcmFuc0FyZWEgKi8KK3N0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgICAgICAgICAgLyogU3RydWN0dXJlIGFuZCB0eXBlIGZvciBTZXRUcmFuc0FyZWEgKi8KIHsKIAl1bnNpZ25lZCBzaG9ydCAgICAgICAgd0FyZWE7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIHRyYW5zZmVyIGFyZWEgdG8gc2V0IHVwICAgICAgICovCiAJdm9pZCBGQVIgKmxwdkJ1ZmY7ICAgICAgICAgIC8qIGFkZHJlc3Mgb2YgdHJhbnNmZXIgYXJlYSAgICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGludCAgICAgICBkd0xlbmd0aDsgICAgICAgICAvKiBsZW5ndGggb2YgYXJlYSB0byBzZXQgdXAgICAgICAgICAgICAgICAgKi8KIAlzaG9ydCAgICAgICBlU2l6ZTsgICAgICAgICAgICAvKiBzaXplIHRvIG1vdmUgKGZvciBzd2FwcGluZyBvbiBNQUMpICAgICAgKi8KLX0gVFJBTlNGRVJERVNDOworfTsKIAotdHlwZWRlZiBUUkFOU0ZFUkRFU0MgRkFSICpMUFRSQU5TRkVSREVTQzsKIAogLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgdG8gc2V0IHVwIGEgdHJhbnNmZXIgYXJlYSAqLwogdHlwZWRlZiBzdHJ1Y3QgVlhUcmFuc2ZlckRlc2MgICAgLyogdXNlMTQwMS5jIGFuZCB1c2UxNDMyeC54IHVzZSBvbmx5ICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2Vyc3BhY2UvdXNlMTQwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlcnNwYWNlL3VzZTE0MDEuYwppbmRleCBjOWJjMmViLi43YjhhMjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2Vyc3BhY2UvdXNlMTQwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZXJzcGFjZS91c2UxNDAxLmMKQEAgLTIyMzEsNyArMjIzMSw3IEBACiBVMTRBUEkoc2hvcnQpIFUxNFNldFRyYW5zQXJlYShzaG9ydCBoYW5kLCB1bnNpZ25lZCBzaG9ydCB3QXJlYSwgdm9pZCAqcHZCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGR3TGVuZ3RoLCBzaG9ydCBlU3opCiB7Ci0gICAgVFJBTlNGRVJERVNDIHRkOworICAgIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgdGQ7CiAgICAgc2hvcnQgc0VyciA9IENoZWNrSGFuZGxlKGhhbmQpOwogICAgIGlmIChzRXJyICE9IFUxNEVSUl9OT0VSUk9SKQogICAgICAgICByZXR1cm4gc0VycjsKQEAgLTIyOTIsNyArMjI5Miw3IEBACiAgICAgICAgIHRkLmVTaXplID0gMDsgICAgICAgICAgICAgICAgLy8gRHVtbXkgZWxlbWVudCBzaXplCiAKICAgICAgICAgaWYgKERldmljZUlvQ29udHJvbChhSGFuZDE0MDFbaGFuZF0sKHVuc2lnbmVkIGludClVMTRfU0VUVFJBTlNGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRkLHNpemVvZihUUkFOU0ZFUkRFU0MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZCxzaXplb2Yoc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJXb3JrLHNpemVvZihQQVJBTUJMSyksJmR3Qnl0ZXMsTlVMTCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChkd0J5dGVzID49IHNpemVvZihQQVJBTUJMSykpICAgIC8vIG1heWJlIGVycm9yIGZyb20gZHJpdmVyPwpAQCAtMjQ5NiwxNCArMjQ5NiwxNCBAQAogICAgIHsKICAgICAgICAgUEFSQU1CTEsgcldvcms7CiAgICAgICAgIHVuc2lnbmVkIGludCBkd0J5dGVzOwotICAgICAgICBUUkFOU0ZFUkRFU0MgdHhEZXNjOworICAgICAgICBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHR4RGVzYzsKICAgICAgICAgdHhEZXNjLndBcmVhID0gd0FyZWE7ICAgICAgICAgICAgIC8qIFB1cmUgTlQgLSBwdXQgZGF0YSBpbnRvIHN0cnVjdCAqLwogICAgICAgICB0eERlc2MubHB2QnVmZiA9IHB2QnVmZjsKICAgICAgICAgdHhEZXNjLmR3TGVuZ3RoID0gZHdMZW5ndGg7CiAgICAgICAgIHR4RGVzYy5lU2l6ZSA9IChzaG9ydCliVG9Ib3N0OyAgICAgICAvKiBVc2UgdGhpcyBmb3IgZGlyZWN0aW9uIGZsYWcgKi8KICAgIAogICAgICAgICBpZiAoRGV2aWNlSW9Db250cm9sKGFIYW5kMTQwMVtoYW5kXSwodW5zaWduZWQgaW50KVUxNF9TRVRDSVJDVUxBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eERlc2MsIHNpemVvZihUUkFOU0ZFUkRFU0MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4RGVzYywgc2l6ZW9mKHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJXb3JrLCBzaXplb2YoUEFSQU1CTEspLCZkd0J5dGVzLE5VTEwpKQogICAgICAgICB7CiAgICAgICAgICAgIGlmIChkd0J5dGVzID49IHNpemVvZihQQVJBTUJMSykpICAgICAgICAgIC8qIGVycm9yIGZyb20gZHJpdmVyPyAqLwpAQCAtMjUyOCw3ICsyNTI4LDcgQEAKICNpZmRlZiBMSU5VWAogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIFRSQU5TRkVSREVTQyB0ZDsKKyAgICAgICAgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB0ZDsKICAgICAgICAgdGQubHB2QnVmZiA9IChsb25nIGxvbmcpKCh1bnNpZ25lZCBsb25nKXB2QnVmZik7CiAgICAgICAgIHRkLndBcmVhTnVtID0gd0FyZWE7CiAgICAgICAgIHRkLmR3TGVuZ3RoID0gZHdMZW5ndGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKaW5kZXggODllMjViNC4uNzAzYzVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwpAQCAtMTc3LDYgKzE3Nyw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxMgogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTgxMi84MTMgYW5kIEFEbGluayBBQ0wtODExMi84MTEzLzgxMTMvODIxNiIKIAlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTICYmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxMi9QRywgUENMLTgxMy9CLCBBRExpbmsKIAkgIEFDTC04MTEyREcvSEcvUEcsIEFDTC04MTEzLCBBQ0wtODIxNiwgSUNQIERBUyBBLTgyMVBHSC9QR0wvUEdMLU5EQSwKQEAgLTE4OCw2ICsxODksNyBAQAogY29uZmlnIENPTUVESV9QQ0w4MTYKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC04MTQgYW5kIFBDTC04MTYgSVNBIGNhcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTICYmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxNCBhbmQgUENMLTgxNiBJU0EgY2FyZHMKIApAQCAtMTk3LDYgKzE5OSw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxOAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTcxOCBhbmQgUENMLTgxOCBJU0EgY2FyZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVklSVF9UT19CVVMgJiYgSVNBX0RNQV9BUEkKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODE4IElTQSBjYXJkcwogCSAgUENMLTgxOEwsIFBDTC04MThILCBQQ0wtODE4SEQsIFBDTC04MThIRywgUENMLTgxOCBhbmQgUENMLTcxOApAQCAtMjU3LDYgKzI2MCwxNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgcnRpODAyLgogCitjb25maWcgQ09NRURJX0RBQzAyCisJdHJpc3RhdGUgIktlaXRobGV5IE1ldHJhYnl0ZSBEQUMwMiBjb21wYXRpYmxlIElTQSBjYXJkIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEtlaXRobGV5IE1ldHJhYnl0ZSBEQUMwMiBjb21wYXRpYmxlIElTQSBjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZGFjMDIuCisKIGNvbmZpZyBDT01FRElfREFTMTZNMQogCXRyaXN0YXRlICJNZWFzdXJlbWVudENvbXB1dGluZyBDSU8tREFTMTYvTTFEQVMtMTYgSVNBIGNhcmQgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJXzgyNTUKQEAgLTU1OSwxNSArNTcwLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIG11bHRpcTMuCiAKLWNvbmZpZyBDT01FRElfUE9DCi0JdHJpc3RhdGUgIkdlbmVyaWMgZHJpdmVyIGZvciB2ZXJ5IHNpbXBsZSBkZXZpY2VzIgotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBnZW5lcmljIHN1cHBvcnQgZm9yIHZlcnkgc2ltcGxlIC8gUE9DIChQaWVjZSBvZiBDcmFwKSBib2FyZHMsCi0JICBLZWl0aGxleSBNZXRyYWJ5dGUgREFDLTAyIChkYWMwMikuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIHBvYy4KLQogY29uZmlnIENPTUVESV9TNTI2CiAJdHJpc3RhdGUgIlNlbnNvcmF5IHM1MjYgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC03NTMsNiArNzU1LDcgQEAKIAogY29uZmlnIENPTUVESV9BRFZfUENJMTcxMAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENJLTE3MXgsIFBDSS0xNzIwIGFuZCBQQ0ktMTczMSBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfRkMKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDSS0xNzEwLCBQQ0ktMTcxMEhHLCBQQ0ktMTcxMSwKIAkgIFBDSS0xNzEzLCBQQ0ktMTcyMCBhbmQgUENJLTE3MzEKQEAgLTg1Niw2ICs4NTksNyBAQAogCiBjb25maWcgQ09NRURJX0RUMzAwMAogCXRyaXN0YXRlICJEYXRhIFRyYW5zbGF0aW9uIERUMzAwMCBzZXJpZXMgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERhdGEgVHJhbnNsYXRpb24gRFQzMDAwIHNlcmllcwogCSAgRFQzMDAxLCBEVDMwMDEtUEdMLCBEVDMwMDIsIERUMzAwMywgRFQzMDAzLVBHTCwgRFQzMDA0LCBEVDMwMDUgYW5kCkBAIC0xMTAxLDYgKzExMDUsNyBAQAogCiBjb25maWcgQ09NRURJX01JVEUKIAlkZXBlbmRzIG9uIEhBU19ETUEKKwlzZWxlY3QgQ09NRURJX0ZDCiAJdHJpc3RhdGUKIAogY29uZmlnIENPTUVESV9OSV9USU9DTUQKQEAgLTExNzksNiArMTE4NCw3IEBACiAKIGNvbmZpZyBDT01FRElfUVVBVEVDSF9EQVFQX0NTCiAJdHJpc3RhdGUgIlF1YXRlY2ggREFRUCBQQ01DSUEgZGF0YSBjYXB0dXJlIGNhcmQgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBRdWF0ZWNoIERBUVAgUENNQ0lBIGRhdGEgY2FwdHVyZSBjYXJkcwogCSAgREFRUC0yMDggYW5kIERBUVAtMzA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKaW5kZXggYzIyYzYxNy4uZWE2ZGMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWF4X3JlYWRfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtMzUzLDcgKzM1Myw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcmVhZF9idWZmZXJfa2Jfc3RvcmUoc3RydWN0IGRldmljZSAqY3NkZXYsCkBAIC00MTAsNyArNDEwLDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCiAJY29tZWRpX2Rldl9wdXQoZGV2KTsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgc2l6ZSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHNpemUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBtYXhfd3JpdGVfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtNDY2LDcgKzQ2Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgd3JpdGVfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtMTE5NCw2ICsxMTk0LDExIEBACiAJCXN3aXRjaCAoaW5zbi0+aW5zbikgewogCQljYXNlIElOU05fUkVBRDoKIAkJCXJldCA9IHMtPmluc25fcmVhZChkZXYsIHMsIGluc24sIGRhdGEpOworCQkJaWYgKHJldCA9PSAtRVRJTUVET1VUKSB7CisJCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKKwkJCQkJInN1YmRldmljZSAlZCByZWFkIGluc3RydWN0aW9uIHRpbWVkIG91dFxuIiwKKwkJCQkJcy0+aW5kZXgpOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSU5TTl9XUklURToKIAkJCW1heGRhdGEgPSBzLT5tYXhkYXRhX2xpc3QKQEAgLTEyMDcsOCArMTIxMiwxNCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAocmV0ID09IDApCisJCQlpZiAocmV0ID09IDApIHsKIAkJCQlyZXQgPSBzLT5pbnNuX3dyaXRlKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQkJaWYgKHJldCA9PSAtRVRJTUVET1VUKSB7CisJCQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCisJCQkJCQkic3ViZGV2aWNlICVkIHdyaXRlIGluc3RydWN0aW9uIHRpbWVkIG91dFxuIiwKKwkJCQkJCXMtPmluZGV4KTsKKwkJCQl9CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJTlNOX0JJVFM6CiAJCQlpZiAoaW5zbi0+biAhPSAyKSB7CkBAIC0xNDA1LDQxICsxNDE2LDk0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfX2NvbWVkaV9nZXRfdXNlcl9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9jbWQgX191c2VyICphcmcsCisJCQkJIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCit7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY21kLCBhcmcsIHNpemVvZigqY21kKSkpIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjbWQtPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIGNtZC0+c3ViZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcyA9ICZkZXYtPnN1YmRldmljZXNbY21kLT5zdWJkZXZdOworCisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCBjbWQtPnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0IHx8ICFzLT5hc3luYykgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAorCQkJInN1YmRldmljZSAlZCBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmRzXG4iLCBjbWQtPnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gbG9uZyAqLworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJWQgPiAlZFxuIiwKKwkJCWNtZC0+Y2hhbmxpc3RfbGVuLCBzLT5sZW5fY2hhbmxpc3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2NvbWVkaV9nZXRfdXNlcl9jaGFubGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX3VzZXIgKnVzZXJfY2hhbmxpc3QsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OworCWludCByZXQ7CisKKwkvKiB1c2VyX2NoYW5saXN0IGNvdWxkIGJlIE5VTEwgZm9yIGRvX2NtZHRlc3QgaW9jdGxzICovCisJaWYgKCF1c2VyX2NoYW5saXN0KQorCQlyZXR1cm4gMDsKKworCWNoYW5saXN0ID0gbWVtZHVwX3VzZXIodXNlcl9jaGFubGlzdCwKKwkJCSAgICAgICBjbWQtPmNoYW5saXN0X2xlbiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlpZiAoSVNfRVJSKGNoYW5saXN0KSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hhbmxpc3QpOworCisJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLworCXJldCA9IGNvbWVkaV9jaGVja19jaGFubGlzdChzLCBjbWQtPmNoYW5saXN0X2xlbiwgY2hhbmxpc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGNoYW5saXN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWQtPmNoYW5saXN0ID0gY2hhbmxpc3Q7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkb19jbWRfaW9jdGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqYXJnLCB2b2lkICpmaWxlKQogewogCXN0cnVjdCBjb21lZGlfY21kIGNtZDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYzsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgX191c2VyICp1c2VyX2NoYW5saXN0OworCWludCByZXQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYXJnLCBzaXplb2YoY21kKSkpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwkvKiBnZXQgdGhlIHVzZXIncyBjbWQgYW5kIGRvIHNvbWUgc2ltcGxlIHZhbGlkYXRpb24gKi8KKwlyZXQgPSBfX2NvbWVkaV9nZXRfdXNlcl9jbWQoZGV2LCBhcmcsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBzYXZlIHVzZXIncyBjaGFubGlzdCBwb2ludGVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciAqLwogCXVzZXJfY2hhbmxpc3QgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWNtZC5jaGFubGlzdDsKIAotCWlmIChjbWQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBubyBzdWNoIHN1YmRldmljZVxuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2NtZC5zdWJkZXZdOwogCWFzeW5jID0gcy0+YXN5bmM7CiAKLQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCB8fCAhcy0+YXN5bmMpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCSJzdWJkZXZpY2UgJWkgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQogCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLwogCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAic3ViZGV2aWNlIGxvY2tlZFxuIik7CkBAIC0xNDUyLDEzICsxNTE2LDYgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KLQlpZiAoY21kLmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJXUgPiAlZFxuIiwKLQkJCWNtZC5jaGFubGlzdF9sZW4sIHMtPmxlbl9jaGFubGlzdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gc2hvcnQgKi8KIAlpZiAoY21kLmNoYW5saXN0X2xlbiA8IDEpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBzaG9ydCAldSA8IDFcbiIsCkBAIC0xNDY4LDI1ICsxNTI1LDExIEBACiAKIAlhc3luYy0+Y21kID0gY21kOwogCWFzeW5jLT5jbWQuZGF0YSA9IE5VTEw7Ci0JLyogbG9hZCBjaGFubmVsL2dhaW4gbGlzdCAqLwotCWFzeW5jLT5jbWQuY2hhbmxpc3QgPSBtZW1kdXBfdXNlcih1c2VyX2NoYW5saXN0LAotCQkJCQkgIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpOwotCWlmIChJU19FUlIoYXN5bmMtPmNtZC5jaGFubGlzdCkpIHsKLQkJcmV0ID0gUFRSX0VSUihhc3luYy0+Y21kLmNoYW5saXN0KTsKLQkJYXN5bmMtPmNtZC5jaGFubGlzdCA9IE5VTEw7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJtZW1kdXBfdXNlciBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLAotCQkJcmV0KTsKLQkJZ290byBjbGVhbnVwOwotCX0KIAotCS8qIG1ha2Ugc3VyZSBlYWNoIGVsZW1lbnQgaW4gY2hhbm5lbC9nYWluIGxpc3QgaXMgdmFsaWQgKi8KLQlyZXQgPSBjb21lZGlfY2hlY2tfY2hhbmxpc3QocywKLQkJCQkgICAgYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4sCi0JCQkJICAgIGFzeW5jLT5jbWQuY2hhbmxpc3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY2hhbmxpc3RcbiIpOworCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KKwlyZXQgPSBfX2NvbWVkaV9nZXRfdXNlcl9jaGFubGlzdChkZXYsIHMsIHVzZXJfY2hhbmxpc3QsICZhc3luYy0+Y21kKTsKKwlpZiAocmV0KQogCQlnb3RvIGNsZWFudXA7Ci0JfQogCiAJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZhc3luYy0+Y21kKTsKIApAQCAtMTU1NCw2MyArMTU5NywyNCBAQAogewogCXN0cnVjdCBjb21lZGlfY21kIGNtZDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgKmNoYW5saXN0ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgX191c2VyICp1c2VyX2NoYW5saXN0OworCWludCByZXQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYXJnLCBzaXplb2YoY21kKSkpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwkvKiBnZXQgdGhlIHVzZXIncyBjbWQgYW5kIGRvIHNvbWUgc2ltcGxlIHZhbGlkYXRpb24gKi8KKwlyZXQgPSBfX2NvbWVkaV9nZXRfdXNlcl9jbWQoZGV2LCBhcmcsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBzYXZlIHVzZXIncyBjaGFubGlzdCBwb2ludGVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciAqLwogCXVzZXJfY2hhbmxpc3QgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWNtZC5jaGFubGlzdDsKIAotCWlmIChjbWQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBubyBzdWNoIHN1YmRldmljZVxuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2NtZC5zdWJkZXZdOwotCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm90IHZhbGlkIHN1YmRldmljZVxuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0KSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkic3ViZGV2aWNlICVpIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZHNcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KLQlpZiAoY21kLmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJWQgPiAlZFxuIiwKLQkJCWNtZC5jaGFubGlzdF9sZW4sIHMtPmxlbl9jaGFubGlzdCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CiAKIAkvKiBsb2FkIGNoYW5uZWwvZ2FpbiBsaXN0ICovCi0JaWYgKGNtZC5jaGFubGlzdCkgewotCQljaGFubGlzdCA9IG1lbWR1cF91c2VyKHVzZXJfY2hhbmxpc3QsCi0JCQkJICAgICAgIGNtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSk7Ci0JCWlmIChJU19FUlIoY2hhbmxpc3QpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKGNoYW5saXN0KTsKLQkJCWNoYW5saXN0ID0gTlVMTDsKLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkJIm1lbWR1cF91c2VyIGV4aXRlZCB3aXRoIGNvZGUgJWQiLCByZXQpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLwotCQlyZXQgPSBjb21lZGlfY2hlY2tfY2hhbmxpc3QocywgY21kLmNoYW5saXN0X2xlbiwgY2hhbmxpc3QpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjaGFubGlzdFxuIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQljbWQuY2hhbmxpc3QgPSBjaGFubGlzdDsKLQl9CisJcmV0ID0gX19jb21lZGlfZ2V0X3VzZXJfY2hhbmxpc3QoZGV2LCBzLCB1c2VyX2NoYW5saXN0LCAmY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZjbWQpOwogCkBAIC0xNjIwLDkgKzE2MjQsOCBAQAogCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY21kLCBzaXplb2YoY21kKSkpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7CiAJCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gY2xlYW51cDsKIAl9Ci1jbGVhbnVwOgorCiAJa2ZyZWUoY2hhbmxpc3QpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCmluZGV4IGY4MmJkNDIuLmQ0NjEyM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtNjEsMzEgKzYxLDMxIEBACiAKIAl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OwkvKiBkcml2ZXItb3duZWQgY2hhbmxpc3QgKG5vdCB1c2VkKSAqLwogCi0JaW50ICgqaW5zbl9yZWFkKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwlpbnQgKCppbnNuX3JlYWQpKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKKwlpbnQgKCppbnNuX3dyaXRlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAogCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWludCAoKmluc25fd3JpdGUpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCWludCAoKmluc25fYml0cykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOworCWludCAoKmluc25fY29uZmlnKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAogCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQlpbnQgKCppbnNuX2JpdHMpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAotCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWludCAoKmluc25fY29uZmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwogCi0JaW50ICgqZG9fY21kKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7Ci0JaW50ICgqZG9fY21kdGVzdCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCi0JCQkgICBzdHJ1Y3QgY29tZWRpX2NtZCAqKTsKLQlpbnQgKCpwb2xsKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7Ci0JaW50ICgqY2FuY2VsKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7CisJaW50ICgqZG9fY21kKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpkb19jbWR0ZXN0KShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCAqKTsKKwlpbnQgKCpwb2xsKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpjYW5jZWwpKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOwogCS8qIGludCAoKmRvX2xvY2spKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwogCS8qIGludCAoKmRvX3VubG9jaykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgXAogCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7ICovCiAKIAkvKiBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGNoYW5nZXMgKi8KLQlpbnQgKCpidWZfY2hhbmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBsb25nIG5ld19zaXplKTsKKwlpbnQgKCpidWZfY2hhbmdlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CiAKLQl2b2lkICgqbXVuZ2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfY2hhbl9pbmRleCk7CisJdm9pZCAoKm11bmdlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcywKKwkJICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NoYW5faW5kZXgpOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGFzeW5jX2RtYV9kaXI7CiAKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CkBAIC0xNDYsOCArMTQ2LDggQEAKIAogCXVuc2lnbmVkIGludCBjYl9tYXNrOwogCi0JaW50ICgqaW50dHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJdW5zaWduZWQgaW50IHgpOworCWludCAoKmludHRyaWcpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICAgdW5zaWduZWQgaW50IHgpOwogfTsKIAogc3RydWN0IGNvbWVkaV9kcml2ZXIgewpAQCAtMTU1LDkgKzE1NSw5IEBACiAKIAljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7Ci0JaW50ICgqYXR0YWNoKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKik7Ci0Jdm9pZCAoKmRldGFjaCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwotCWludCAoKmF1dG9fYXR0YWNoKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7CisJaW50ICgqYXR0YWNoKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqKTsKKwl2b2lkICgqZGV0YWNoKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKKwlpbnQgKCphdXRvX2F0dGFjaCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7CiAKIAkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYm9hcmRfbmFtZSBhbmQgYm9hcmRfaWQgYXJyYXlzICovCiAJdW5zaWduZWQgaW50IG51bV9uYW1lczsKQEAgLTIwMiw4ICsyMDIsOCBAQAogCiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmFzeW5jX3F1ZXVlOwogCi0JaW50ICgqb3BlbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpjbG9zZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOworCWludCAoKm9wZW4pKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOworCXZvaWQgKCpjbG9zZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiB9OwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKmNvbWVkaV9ib2FyZChjb25zdCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQpAQCAtMzUzLDYgKzM1MywxNCBAQAogCiAvKiBkcml2ZXJzLmMgLSBnZW5lcmFsIGNvbWVkaSBkcml2ZXIgZnVuY3Rpb25zICovCiAKKyNkZWZpbmUgQ09NRURJX1RJTUVPVVRfTVMJMTAwMAorCitpbnQgY29tZWRpX3RpbWVvdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJICAgc3RydWN0IGNvbWVkaV9pbnNuICosCisJCSAgIGludCAoKmNiKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgbG9uZyBjb250ZXh0KSwKKwkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KTsKKwogaW50IGNvbWVkaV9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKmRhdGEsCiAJCQkgICB1bnNpZ25lZCBpbnQgbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCmluZGV4IDViMTUwMzMuLmFiMGU4ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC0xNTUsNiArMTU1LDM2IEBACiB9CiAKIC8qKgorICogY29tZWRpX3RpbWVvdXQoKSAtIGJ1c3ktd2FpdCBmb3IgYSBkcml2ZXIgY29uZGl0aW9uIHRvIG9jY3VyLgorICogQGRldjogY29tZWRpX2RldmljZSBzdHJ1Y3QKKyAqIEBzOiBjb21lZGlfc3ViZGV2aWNlIHN0cnVjdAorICogQGluc246IGNvbWVkaV9pbnNuIHN0cnVjdAorICogQGNiOiBjYWxsYmFjayB0byBjaGVjayBmb3IgdGhlIGNvbmRpdGlvbgorICogQGNvbnRleHQ6IHByaXZhdGUgY29udGV4dCBmcm9tIHRoZSBkcml2ZXIKKyAqLworaW50IGNvbWVkaV90aW1lb3V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgIGludCAoKmNiKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpLAorCQkgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQ09NRURJX1RJTUVPVVRfTVMpOworCWludCByZXQ7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmV0ID0gY2IoZGV2LCBzLCBpbnNuLCBjb250ZXh0KTsKKwkJaWYgKHJldCAhPSAtRUJVU1kpCisJCQlyZXR1cm4gcmV0OwkvKiBzdWNjZXNzICgwKSBvciBub24gRUJVU1kgZXJybm8gKi8KKwkJY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiAtRVRJTUVET1VUOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX3RpbWVvdXQpOworCisvKioKICAqIGNvbWVkaV9kaW9faW5zbl9jb25maWcoKSAtIGJvaWxlcnBsYXRlICgqaW5zbl9jb25maWcpIGZvciBESU8gc3ViZGV2aWNlcy4KICAqIEBkZXY6IGNvbWVkaV9kZXZpY2Ugc3RydWN0CiAgKiBAczogY29tZWRpX3N1YmRldmljZSBzdHJ1Y3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKaW5kZXggOGE1N2MzYy4uNDZhMzg1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKKyNpbmNsdWRlICJtaXRlLmgiCiAKIGVudW0gcGNpXzgyNTVfYm9hcmRpZCB7CiAJQk9BUkRfQURMSU5LX1BDSTcyMjQsCkBAIC03OSw2ICs4MCw3IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgZGlvX2JhZHI7CiAJaW50IG5fODI1NTsKKwl1bnNpZ25lZCBpbnQgaGFzX21pdGU6MTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpXzgyNTVfYm9hcmRpbmZvIHBjaV84MjU1X2JvYXJkc1tdID0gewpAQCAtMTI2LDM2ICsxMjgsNDMgQEAKIAkJLm5hbWUJCT0gIm5pX3BjaS1kaW8tOTYiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDQsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJRElPOTZCXSA9IHsKIAkJLm5hbWUJCT0gIm5pX3BjaS1kaW8tOTZiIiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSA0LAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BYSTY1MDhdID0gewogCQkubmFtZQkJPSAibmlfcHhpLTY1MDgiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDQsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJNjUwM10gPSB7CiAJCS5uYW1lCQk9ICJuaV9wY2ktNjUwMyIsCiAJCS5kaW9fYmFkcgk9IDEsCiAJCS5uXzgyNTUJCT0gMSwKKwkJLmhhc19taXRlCT0gMSwKIAl9LAogCVtCT0FSRF9OSV9QQ0k2NTAzQl0gPSB7CiAJCS5uYW1lCQk9ICJuaV9wY2ktNjUwM2IiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDEsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJNjUwM1hdID0gewogCQkubmFtZQkJPSAibmlfcGNpLTY1MDN4IiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSAxLAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BYSV82NTAzXSA9IHsKIAkJLm5hbWUJCT0gIm5pX3B4aS02NTAzIiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSAxLAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiB9OwogCkBAIC0xNjMsNiArMTcyLDI1IEBACiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiB9OwogCitzdGF0aWMgaW50IHBjaV84MjU1X21pdGVfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXZvaWQgX19pb21lbSAqbWl0ZV9iYXNlOworCXUzMiBtYWluX3BoeXNfYWRkcjsKKworCS8qIGlvcmVtYXAgdGhlIE1JVEUgcmVnaXN0ZXJzIChCQVIgMCkgdGVtcG9yYXJpbHkgKi8KKwltaXRlX2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGNpZGV2LCAwKTsKKwlpZiAoIW1pdGVfYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBzZXQgZGF0YSB3aW5kb3cgdG8gbWFpbiByZWdpc3RlcnMgKEJBUiAxKSAqLworCW1haW5fcGh5c19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7CisJd3JpdGVsKG1haW5fcGh5c19hZGRyIHwgV0VOQUIsIG1pdGVfYmFzZSArIE1JVEVfSU9EV0JTUik7CisKKwkvKiBmaW5pc2hlZCB3aXRoIE1JVEUgcmVnaXN0ZXJzICovCisJaW91bm1hcChtaXRlX2Jhc2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHBjaV84MjU1X21taW8oaW50IGRpciwgaW50IHBvcnQsIGludCBkYXRhLCB1bnNpZ25lZCBsb25nIGlvYmFzZSkKIHsKIAl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9ICh2b2lkIF9faW9tZW0gKilpb2Jhc2U7CkBAIC0yMDEsNiArMjI5LDEyIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWlmIChib2FyZC0+aGFzX21pdGUpIHsKKwkJcmV0ID0gcGNpXzgyNTVfbWl0ZV9pbml0KHBjaWRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCWlzX21taW8gPSAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgYm9hcmQtPmRpb19iYWRyKSAmCiAJCSAgIElPUkVTT1VSQ0VfTUVNKSAhPSAwOwogCWlmIChpc19tbWlvKSB7CkBAIC0yMzUsOSArMjY5LDYgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZCAoJWQgZGlnaXRhbCBpL28gY2hhbm5lbHMpXG4iLAotCQlkZXYtPmJvYXJkX25hbWUsIGJvYXJkLT5uXzgyNTUgKiAyNCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDI3MDZmNTguLjA3NTdhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAKIG9iai0kKENPTkZJR19DT01FRElfUENNMzcyNCkJCSs9IHBjbTM3MjQubwogb2JqLSQoQ09ORklHX0NPTUVESV9SVEk4MDApCQkrPSBydGk4MDAubwogb2JqLSQoQ09ORklHX0NPTUVESV9SVEk4MDIpCQkrPSBydGk4MDIubworb2JqLSQoQ09ORklHX0NPTUVESV9EQUMwMikJCSs9IGRhYzAyLm8KIG9iai0kKENPTkZJR19DT01FRElfREFTMTZNMSkJCSs9IGRhczE2bTEubwogb2JqLSQoQ09ORklHX0NPTUVESV9EQVMwOF9JU0EpCQkrPSBkYXMwOF9pc2Eubwogb2JqLSQoQ09ORklHX0NPTUVESV9EQVMxNikJCSs9IGRhczE2Lm8KQEAgLTUzLDcgKzU0LDYgQEAKIG9iai0kKENPTkZJR19DT01FRElfUENNTUlPKQkJKz0gcGNtbWlvLm8KIG9iai0kKENPTkZJR19DT01FRElfUENNVUlPKQkJKz0gcGNtdWlvLm8KIG9iai0kKENPTkZJR19DT01FRElfTVVMVElRMykJCSs9IG11bHRpcTMubwotb2JqLSQoQ09ORklHX0NPTUVESV9QT0MpCQkrPSBwb2Mubwogb2JqLSQoQ09ORklHX0NPTUVESV9TNTI2KQkJKz0gczUyNi5vCiAKICMgQ29tZWRpIFBDSSBkcml2ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kwMzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTAzNS5jCmluZGV4IDExMjhjMjIuLjI4NDUwZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTAzNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTAzNS5jCkBAIC0xLDQ2ICsxLDI0IEBACi0vKioKLUB2ZXJiYXRpbQotCi1Db3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KLQotCUFEREktREFUQSBHbWJICi0JRGllc2Vsc3RyYXNzZSAzCi0JRC03NzgzMyBPdHRlcnN3ZWllcgotCVRlbDogKzE5KDApNzIyMy85NDkzLTAKLQlGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgotCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQotCWluZm9AYWRkaS1kYXRhLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLUBlbmR2ZXJiYXRpbQotKi8KIC8qCi0KLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IChDKSBBRERJLURBVEEgR21iSCAgICAgICAgICBEaWVzZWxzdHJhw59lIDMgICAgICAgRC03NzgzMyBPdHRlcnN3ZWllciAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgVGVsIDogKzQ5ICgwKSA3MjIzLzk0OTMtMCAgICAgfCBlbWFpbCAgICA6IGluZm9AYWRkaS1kYXRhLmNvbSAgICAgICAgIHwKLSAgfCBGYXggOiArNDkgKDApIDcyMjMvOTQ5My05MiAgICB8IEludGVybmV0IDogaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCAgICAgOiBBUENJLTAzNSAgICAgICAgfCBDb21waWxlciAgIDogR0NDICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCBNb2R1bGUgbmFtZSA6IGh3ZHJ2X2FwY2kwMzUuYyB8IFZlcnNpb24gICAgOiAyLjk2ICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCBtYW5hZ2VyOiBFcmljIFN0b2x6ICAgfCBEYXRlICAgICAgIDogIDAyLzEyLzIwMDIgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IERlc2NyaXB0aW9uIDogICBIYXJkd2FyZSBMYXllciBBY2Nlc3MgRm9yIEFQQ0ktMDM1ICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICBEYXRlICAgfCAgIEF1dGhvciAgfCAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB1cGRhdGVzICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCisgKgorICoJQURESS1EQVRBIEdtYkgKKyAqCURpZXNlbHN0cmFzc2UgMworICoJRC03NzgzMyBPdHRlcnN3ZWllcgorICoJVGVsOiArMTkoMCk3MjIzLzk0OTMtMAorICoJRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKKyAqCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQorICoJaW5mb0BhZGRpLWRhdGEuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KIAogLyogQ2FyZCBTcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogI2RlZmluZSBBUENJMDM1X0FERFJFU1NfUkFOR0UJCTI1NQpAQCAtMTA2LDk5ICs4NCw2NiBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgaV9XYXRjaGRvZ05iciA9IDA7Ci1zdGF0aWMgaW50IGlfVGVtcCA9IDA7CitzdGF0aWMgaW50IGlfV2F0Y2hkb2dOYnI7CitzdGF0aWMgaW50IGlfVGVtcDsKIHN0YXRpYyBpbnQgaV9GbGFnID0gMTsKKwogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kwMzVfQ29uZmlnVGltZXJXYXRjaGRvZyAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyBUaGUgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgIDogRGF0YSBQb2ludGVyIGNvbnRhaW5zICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMF0gICAgICAgICAgICA6IDAgQ29uZmlndXJlIEFzIFRpbWVyICAgICAgfAotfAkJCQkJCQkJCQkgICAxIENvbmZpZ3VyZSBBcyBXYXRjaGRvZyAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IFdhdGNoZG9nIG51bWJlcgotfAkJCQkJICBkYXRhWzJdICAgICAgICAgICAgOiBUaW1lIGJhc2UgVW5pdCAgICAgICAgICAgIHwKLXwJCQkJCSAgZGF0YVszXQkJCSA6IFJlbG9hZCBWYWx1ZQkJCSAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XSAgICAgICAgICAgIDogRXh0ZXJuYWwgVHJpZ2dlciAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOkVuYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDpEaXNhYmxlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs1XSAgICAgICAgICAgIDpFeHRlcm5hbCBUcmlnZ2VyIExldmVsCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCBUcmlnZ2VyIERpc2FibGVkCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSBUcmlnZ2VyIEVuYWJsZWQgKExvdyBsZXZlbCkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIFRyaWdnZXIgRW5hYmxlZCAoSGlnaCBMZXZlbCkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIFRyaWdnZXIgRW5hYmxlZCAoSGlnaC9Mb3cgbGV2ZWwpCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgICAgICAgICAgIDogRXh0ZXJuYWwgR2F0ZSAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOkVuYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6RGlzYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbN10gICAgICAgICAgICA6IEV4dGVybmFsIEdhdGUgbGV2ZWwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIEdhdGUgRGlzYWJsZWQKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIEdhdGUgRW5hYmxlZCAoTG93IGxldmVsKQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgR2F0ZSBFbmFibGVkIChIaWdoIExldmVsKQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbOF0gICAgICAgICAgICA6V2FybmluZyBSZWxheQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRU5BQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBESVNBQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs5XSAgICAgICAgICAgIDpXYXJuaW5nIERlbGF5IGF2YWlsYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTBdICAgICAgICAgICA6V2FybmluZyBSZWxheSBUaW1lIHVuaXQKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzExXSAgICAgICAgICAgOldhcm5pbmcgUmVsYXkgVGltZSBSZWxvYWQgdmFsdWUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzEyXSAgICAgICAgICAgOlJlc2V0IFJlbGF5Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDogRU5BQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogRElTQUJMRQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTNdICAgICAgICAgICA6SW50ZXJydXB0Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDogRU5BQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogRElTQUJMRQotfAotfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X0NvbmZpZ1RpbWVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyBUaGUgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nCisgKgorICogZGF0YVswXSAwID0gQ29uZmlndXJlIEFzIFRpbWVyLCAxID0gQ29uZmlndXJlIEFzIFdhdGNoZG9nCisgKiBkYXRhWzFdIFdhdGNoZG9nIG51bWJlcgorICogZGF0YVsyXSBUaW1lIGJhc2UgVW5pdAorICogZGF0YVszXSBSZWxvYWQgVmFsdWUKKyAqIGRhdGFbNF0gRXh0ZXJuYWwgVHJpZ2dlciwgMSA9IEVuYWJsZSwgMCA9IERpc2FibGUKKyAqIGRhdGFbNV0gRXh0ZXJuYWwgVHJpZ2dlciBMZXZlbAorICoJMDAgPSBUcmlnZ2VyIERpc2FibGVkCisgKgkwMSA9IFRyaWdnZXIgRW5hYmxlZCAoTG93IGxldmVsKQorICoJMTAgPSBUcmlnZ2VyIEVuYWJsZWQgKEhpZ2ggTGV2ZWwpCisgKgkxMSA9IFRyaWdnZXIgRW5hYmxlZCAoSGlnaC9Mb3cgbGV2ZWwpCisgKiBkYXRhWzZdIEV4dGVybmFsIEdhdGUsIDEgPSBFbmFibGUsIDAgPSBEaXNhYmxlCisgKiBkYXRhWzddIEV4dGVybmFsIEdhdGUgbGV2ZWwKKyAqCTAwID0gR2F0ZSBEaXNhYmxlZAorICoJMDEgPSBHYXRlIEVuYWJsZWQgKExvdyBsZXZlbCkKKyAqCTEwID0gR2F0ZSBFbmFibGVkIChIaWdoIExldmVsKQorICogZGF0YVs4XSBXYXJuaW5nIFJlbGF5LCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICogZGF0YVs5XSBXYXJuaW5nIERlbGF5IGF2YWlsYWJsZQorICogZGF0YVsxMF0gV2FybmluZyBSZWxheSBUaW1lIHVuaXQKKyAqIGRhdGFbMTFdIFdhcm5pbmcgUmVsYXkgVGltZSBSZWxvYWQgdmFsdWUKKyAqIGRhdGFbMTJdIFJlc2V0IFJlbGF5LCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICogZGF0YVsxM10gSW50ZXJydXB0LCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICovCitzdGF0aWMgaW50IGFwY2kwMzVfdGltZXJfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB1aV9TdGF0dXMgPSAwOwotCXVuc2lnbmVkIGludCB1aV9Db21tYW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgdWlfTW9kZSA9IDA7CisJdW5zaWduZWQgaW50IHVpX1N0YXR1czsKKwl1bnNpZ25lZCBpbnQgdWlfQ29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgdWlfTW9kZTsKIAogCWlfVGVtcCA9IDA7CiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwogCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gZGF0YVswXTsKIAlpX1dhdGNoZG9nTmJyID0gZGF0YVsxXTsKLQlpZiAoZGF0YVswXSA9PSAwKSB7CisJaWYgKGRhdGFbMF0gPT0gMCkKIAkJdWlfTW9kZSA9IDI7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXVpX01vZGUgPSAwOwotCX0KLS8qIHVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlKygoaV9XYXRjaGRvZ05ici0xKSozMikrMTIpOyAqLworCiAJdWlfQ29tbWFuZCA9IDA7Ci0vKiB1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RkVVTDsgKi8KIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCXVpX0NvbW1hbmQgPSAwOworCiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIHJlbG9hZCB2YWx1ZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIFNldCB0aGUgcmVsb2FkIHZhbHVlICovCiAJb3V0bChkYXRhWzNdLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDQpOwotLyoqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNldCB0aGUgdGltZSB1bml0ICovCi0vKioqKioqKioqKioqKioqKioqKioqLworCisJLyogU2V0IHRoZSB0aW1lIHVuaXQgKi8KIAlvdXRsKGRhdGFbMl0sIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgOCk7CiAJaWYgKGRhdGFbMF0gPT0gQURESURBVEFfVElNRVIpIHsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSBtb2RlIDogICAgICAgICAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBoYXJkd2FyZSAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBjb3VudGVyIG1vZGUgKi8KQEAgLTIwNiwxMDEgKzE1MSw4MiBAQAogCQkvKiAtIERpc2FibGUgdGhlIHJlc2V0ICAgICAgICAqLwogCQkvKiAtIEVuYWJsZSB0aGUgdGltZXIgbW9kZSAgICAqLwogCQkvKiAtIFNldCB0aGUgdGltZXIgbW9kZSAgICAgICAqLwotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQl1aV9Db21tYW5kID0KIAkJCSh1aV9Db21tYW5kICYgMHhGRkY3MTlFMlVMKSB8IHVpX01vZGUgPDwgMTNVTCB8IDB4MTBVTDsKIAotCX0JCQkvKiBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9USU1FUikgKi8KLQllbHNlIHsKLQkJaWYgKGRhdGFbMF0gPT0gQURESURBVEFfV0FUQ0hET0cpIHsKKwl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gQURESURBVEFfV0FUQ0hET0cpIHsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCS8qIFNldCB0aGUgbW9kZSA6ICAgICAgICAgICAgICovCi0JCQkvKiAtIERpc2FibGUgdGhlIGhhcmR3YXJlICAgICAqLwotCQkJLyogLSBEaXNhYmxlIHRoZSBjb3VudGVyIG1vZGUgKi8KLQkJCS8qIC0gRGlzYWJsZSB0aGUgd2FybmluZyAgICAgICovCi0JCQkvKiAtIERpc2FibGUgdGhlIHJlc2V0ICAgICAgICAqLwotCQkJLyogLSBEaXNhYmxlIHRoZSB0aW1lciBtb2RlICAgKi8KLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCS8qIFNldCB0aGUgbW9kZSA6ICAgICAgICAgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgaGFyZHdhcmUgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgY291bnRlciBtb2RlICovCisJCS8qIC0gRGlzYWJsZSB0aGUgd2FybmluZyAgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgcmVzZXQgICAgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgdGltZXIgbW9kZSAgICovCiAKLQkJCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkY4MTlFMlVMOworCQl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGODE5RTJVTDsKIAotCQl9IGVsc2UgewotCQkJcHJpbnRrKCJcbiBUaGUgcGFyYW1ldGVyIGZvciBUaW1lci93YXRjaGRvZyBzZWxlY3Rpb24gaXMgaW4gZXJyb3JcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiVGhlIHBhcmFtZXRlciBmb3IgVGltZXIvd2F0Y2hkb2cgc2VsZWN0aW9uIGlzIGluIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCiAJb3V0bCh1aV9Db21tYW5kLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQl1aV9Db21tYW5kID0gMDsKKwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEaXNhYmxlIHRoZSBoYXJkd2FyZSB0cmlnZ2VyICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBEaXNhYmxlIHRoZSBoYXJkd2FyZSB0cmlnZ2VyICovCiAJdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgJiAweEZGRkZGODlGVUw7CiAJaWYgKGRhdGFbNF0gPT0gQURESURBVEFfRU5BQkxFKSB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIAkJLyogU2V0IHRoZSBoYXJkd2FyZSB0cmlnZ2VyIGxldmVsICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kIHwgKGRhdGFbNV0gPDwgNSk7CiAJfQogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0JdWlfQ29tbWFuZCA9IDA7CisKIAl1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgZ2F0ZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgZ2F0ZSAqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjg3RlVMOwogCWlmIChkYXRhWzZdID09IEFERElEQVRBX0VOQUJMRSkgewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIGhhcmR3YXJlIGdhdGUgbGV2ZWwgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCS8qIFNldCB0aGUgaGFyZHdhcmUgZ2F0ZSBsZXZlbCAqLwogCQl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCB8IChkYXRhWzddIDw8IDcpOwogCX0KIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCXVpX0NvbW1hbmQgPSAwOworCiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgb3V0cHV0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIG91dHB1dCAqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjlGQlVMOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNldCB0aGUgaGFyZHdhcmUgb3V0cHV0IGxldmVsICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogU2V0IHRoZSBoYXJkd2FyZSBvdXRwdXQgbGV2ZWwgKi8KIAl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCB8IChkYXRhWzhdIDw8IDIpOwogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7CiAJaWYgKGRhdGFbOV0gPT0gQURESURBVEFfRU5BQkxFKSB7Ci0gICAvKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCS8qIFNldCB0aGUgcmVsb2FkIHZhbHVlICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRsKGRhdGFbMTFdLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAyNCk7Ci0gICAvKioqKioqKioqKioqKioqKioqKioqKi8KKwogCQkvKiBTZXQgdGhlIHRpbWUgdW5pdGUgKi8KLSAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRsKGRhdGFbMTBdLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAyOCk7CiAJfQogCi0JdWlfQ29tbWFuZCA9IDA7CiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIG91dHB1dCAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjlGN1VMOwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCS8qIFNldCB0aGUgaGFyZHdhcmUgb3V0cHV0IGxldmVsICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kIHwgKGRhdGFbMTJdIDw8IDMpOwogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoqICBFbmFibGUgdGhlIHdhdGNoZG9nIGludGVycnVwdCAgKiovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdWlfQ29tbWFuZCA9IDA7CisKKwkvKiBFbmFibGUgdGhlIHdhdGNoZG9nIGludGVycnVwdCAqLwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNldCB0aGUgaW50ZXJydXB0IHNlbGVjdGlvbiAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBTZXQgdGhlIGludGVycnVwdCBzZWxlY3Rpb24gKi8KIAl1aV9TdGF0dXMgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxNik7CiAKIAl1aV9Db21tYW5kID0gKHVpX0NvbW1hbmQgJiAweEZGRkZGOUZEVUwpIHwgKGRhdGFbMTNdIDw8IDEpOwpAQCAtMzEwLDgyICsyMzYsNjMgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kwMzVfU3RhcnRTdG9wV3JpdGVUaW1lcldhdGNoZG9nICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogU3RhcnQgLyBTdG9wIFRoZSBTZWxlY3RlZCBUaW1lciAsIG9yIFdhdGNoZG9nICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMF0gOiAwIC0gU3RvcCBTZWxlY3RlZCBUaW1lci9XYXRjaGRvZyAgICAgfAotfAkJCQkJICAgICAgICAgICAgMSAtIFN0YXJ0IFNlbGVjdGVkIFRpbWVyL1dhdGNoZG9nICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDIgLSBUcmlnZ2VyIFNlbGVjdGVkIFRpbWVyL1dhdGNoZG9nICB8Ci18CQkJCQkgICAgICAgICAgICAzIC0gU3RvcCBBbGwgVGltZXIvV2F0Y2hkb2cgICAgICAgICAgfAotfAkJCQkJICAgICAgICAgICAgNCAtIFN0YXJ0IEFsbCBUaW1lci9XYXRjaGRvZyAgICAgICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDUgLSBUcmlnZ2VyIEFsbCBUaW1lci9XYXRjaGRvZyAgICAgICB8Ci18CQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IJCQkgfAotfAkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1N0YXJ0U3RvcFdyaXRlVGltZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBTdGFydCAvIFN0b3AgVGhlIFNlbGVjdGVkIFRpbWVyICwgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdCisgKgkwIC0gU3RvcCBTZWxlY3RlZCBUaW1lci9XYXRjaGRvZworICoJMSAtIFN0YXJ0IFNlbGVjdGVkIFRpbWVyL1dhdGNoKmRvZworICoJMiAtIFRyaWdnZXIgU2VsZWN0ZWQgVGltZXIvV2F0Y2hkb2cKKyAqCTMgLSBTdG9wIEFsbCBUaW1lci9XYXRjaGRvZworICoJNCAtIFN0YXJ0IEFsbCBUaW1lci9XYXRjaGRvZworICoJNSAtIFRyaWdnZXIgQWxsIFRpbWVyL1dhdGNoZG9nCisgKi8KK3N0YXRpYyBpbnQgYXBjaTAzNV90aW1lcl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgdWlfQ29tbWFuZCA9IDA7Ci0JaW50IGlfQ291bnQgPSAwOworCXVuc2lnbmVkIGludCB1aV9Db21tYW5kOworCWludCBpX0NvdW50OwogCiAJaWYgKGRhdGFbMF0gPT0gMSkgewogCQl1aV9Db21tYW5kID0KIAkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKiovCisKIAkJLyogU3RhcnQgdGhlIGhhcmR3YXJlICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQl1aV9Db21tYW5kID0gKHVpX0NvbW1hbmQgJiAweEZGRkZGOUZGVUwpIHwgMHgxVUw7CiAJCW91dGwodWlfQ29tbWFuZCwKIAkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCX0JCQkvKiAgaWYgIChkYXRhWzBdPT0xKSAqLworCX0KIAlpZiAoZGF0YVswXSA9PSAyKSB7CiAJCXVpX0NvbW1hbmQgPQogCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCS8qIFNldCB0aGUgdHJpZ2dlciBjb21tYW5kICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCXVpX0NvbW1hbmQgPSAodWlfQ29tbWFuZCAmIDB4RkZGRkY5RkZVTCkgfCAweDIwMFVMOwogCQlvdXRsKHVpX0NvbW1hbmQsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKIAl9CiAKLQlpZiAoZGF0YVswXSA9PSAwKQkvKiBTdG9wIFRoZSBXYXRjaGRvZyAqLwotCXsKKwlpZiAoZGF0YVswXSA9PSAwKSB7CiAJCS8qIFN0b3AgVGhlIFdhdGNoZG9nICovCiAJCXVpX0NvbW1hbmQgPSAwOwotLyoKLSogdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UrKChpX1dhdGNoZG9nTmJyLTEpKjMyKSsxMik7Ci0qIHVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjlGRVVMOwotKi8KKwkJLyoKKwkJKiB1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSsoKGlfV2F0Y2hkb2dOYnItMSkqMzIpKzEyKTsKKwkJKiB1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RkVVTDsKKwkJKi8KIAkJb3V0bCh1aV9Db21tYW5kLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0JfQkJCS8qICAgaWYgKGRhdGFbMV09PTApICovCi0JaWYgKGRhdGFbMF0gPT0gMykJLyogc3RvcCBhbGwgV2F0Y2hkb2dzICovCi0JeworCX0KKwlpZiAoZGF0YVswXSA9PSAzKSB7CisJCS8qIHN0b3AgYWxsIFdhdGNoZG9ncyAqLwogCQl1aV9Db21tYW5kID0gMDsKIAkJZm9yIChpX0NvdW50ID0gMTsgaV9Db3VudCA8PSA0OyBpX0NvdW50KyspIHsKLQkJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykgeworCQkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKQogCQkJCXVpX0NvbW1hbmQgPSAweDJVTDsKLQkJCX0gZWxzZSB7CisJCQllbHNlCiAJCQkJdWlfQ29tbWFuZCA9IDB4MTBVTDsKLQkJCX0KKwogCQkJaV9XYXRjaGRvZ05iciA9IGlfQ291bnQ7CiAJCQlvdXRsKHVpX0NvbW1hbmQsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKwpAQCAtMzkzLDMwICszMDAsMjkgQEAKIAkJfQogCiAJfQotCWlmIChkYXRhWzBdID09IDQpCS8qIHN0YXJ0IGFsbCBXYXRjaGRvZ3MgKi8KLQl7CisJaWYgKGRhdGFbMF0gPT0gNCkgeworCQkvKiBzdGFydCBhbGwgV2F0Y2hkb2dzICovCiAJCXVpX0NvbW1hbmQgPSAwOwogCQlmb3IgKGlfQ291bnQgPSAxOyBpX0NvdW50IDw9IDQ7IGlfQ291bnQrKykgewotCQkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKSB7CisJCQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpCiAJCQkJdWlfQ29tbWFuZCA9IDB4MVVMOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQl1aV9Db21tYW5kID0gMHg4VUw7Ci0JCQl9CisKIAkJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwogCQkJb3V0bCh1aV9Db21tYW5kLAogCQkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsKIAkJCQkwKTsKIAkJfQogCX0KLQlpZiAoZGF0YVswXSA9PSA1KQkvKiB0cmlnZ2VyIGFsbCBXYXRjaGRvZ3MgKi8KLQl7CisJaWYgKGRhdGFbMF0gPT0gNSkgeworCQkvKiB0cmlnZ2VyIGFsbCBXYXRjaGRvZ3MgKi8KIAkJdWlfQ29tbWFuZCA9IDA7CiAJCWZvciAoaV9Db3VudCA9IDE7IGlfQ291bnQgPD0gNDsgaV9Db3VudCsrKSB7Ci0JCQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKKwkJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykKIAkJCQl1aV9Db21tYW5kID0gMHg0VUw7Ci0JCQl9IGVsc2UgeworCQkJZWxzZQogCQkJCXVpX0NvbW1hbmQgPSAweDIwVUw7Ci0JCQl9CiAKIAkJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwogCQkJb3V0bCh1aV9Db21tYW5kLApAQCAtNDI5LDEwOSArMzM1LDYxIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMDM1X1JlYWRUaW1lcldhdGNoZG9nICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgCQkJCQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJZGF0YVswXSAgICAgICAgICAgIDogc29mdHdhcmUgdHJpZ2dlciBzdGF0dXMKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzCi18ICAgICAJICAJICAgICAgICBkYXRhWzJdICAgICAgICAgICAgOiBTb2Z0d2FyZSBjbGVhciBzdGF0dXMKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbM10gICAgICAgICAgICA6IE92ZXJmbG93IHN0YXR1cwotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XSAgICAgICAgICAgIDogVGltZXIgYWN0dWFsIHZhbHVlCi18Ci0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1JlYWRUaW1lcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gc29mdHdhcmUgdHJpZ2dlciBzdGF0dXMKKyAqIGRhdGFbMV0gaGFyZHdhcmUgdHJpZ2dlciBzdGF0dXMKKyAqIGRhdGFbMl0gU29mdHdhcmUgY2xlYXIgc3RhdHVzCisgKiBkYXRhWzNdIE92ZXJmbG93IHN0YXR1cworICogZGF0YVs0XSBUaW1lciBhY3R1YWwgdmFsdWUKKyAqLworc3RhdGljIGludCBhcGNpMDM1X3RpbWVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX1N0YXR1cyA9IDA7CS8qICBTdGF0dXMgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgdWlfU3RhdHVzOwkvKiAgU3RhdHVzIHJlZ2lzdGVyICovCiAKIAlpX1dhdGNoZG9nTmJyID0gaW5zbi0+dW51c2VkWzBdOwogCi0JLyoqKioqKioqKioqKioqKioqKi8KIAkvKiBHZXQgdGhlIHN0YXR1cyAqLwotCS8qKioqKioqKioqKioqKioqKiovCi0KIAl1aV9TdGF0dXMgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxNik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogR2V0IHRoZSBzb2Z0d2FyZSB0cmlnZ2VyIHN0YXR1cyAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogCWRhdGFbMF0gPSAoKHVpX1N0YXR1cyA+PiAxKSAmIDEpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBHZXQgdGhlIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRhdGFbMV0gPSAoKHVpX1N0YXR1cyA+PiAyKSAmIDEpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogR2V0IHRoZSBzb2Z0d2FyZSBjbGVhciBzdGF0dXMgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRhdGFbMl0gPSAoKHVpX1N0YXR1cyA+PiAzKSAmIDEpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogR2V0IHRoZSBvdmVyZmxvdyBzdGF0dXMgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRhdGFbM10gPSAoKHVpX1N0YXR1cyA+PiAwKSAmIDEpOwotCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9USU1FUikgewotCQlkYXRhWzRdID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMCk7CiAKLQl9CQkJLyogICBpZiAgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9USU1FUikgKi8KKwkvKiBHZXQgdGhlIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzICovCisJZGF0YVsxXSA9ICgodWlfU3RhdHVzID4+IDIpICYgMSk7CisKKwkvKiBHZXQgdGhlIHNvZnR3YXJlIGNsZWFyIHN0YXR1cyAqLworCWRhdGFbMl0gPSAoKHVpX1N0YXR1cyA+PiAzKSAmIDEpOworCisJLyogR2V0IHRoZSBvdmVyZmxvdyBzdGF0dXMgKi8KKwlkYXRhWzNdID0gKCh1aV9TdGF0dXMgPj4gMCkgJiAxKTsKKwlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfVElNRVIpCisJCWRhdGFbNF0gPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAwKTsKIAogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTAzNV9Db25maWdBbmFsb2dJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIFRoZSBBbmFsb2cgSW5wdXQgU3ViZGV2aWNlICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgICAgIDogU3ViZGV2aWNlIFBvaW50ZXIgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgIDogSW5zbiBTdHJ1Y3R1cmUgUG9pbnRlciAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIGNvbnRhaW5zICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgICAgOiBXYXJuaW5nIGRlbGF5IHZhbHVlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTAzNV9Db25maWdBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBBbmFsb2cgSW5wdXQgU3ViZGV2aWNlCisgKgorICogZGF0YVswXSBXYXJuaW5nIGRlbGF5IHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgYXBjaTAzNV9haV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKIAlkZXZwcml2LT50c2tfQ3VycmVudCA9IGN1cnJlbnQ7CiAJb3V0bCgweDIwMCB8IDAsIGRldnByaXYtPmlvYmFzZSArIDEyOCArIDB4NCk7CiAJb3V0bCgwLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAwKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEluaXRpYWxpc2UgdGhlIHdhcm5pbmcgdmFsdWUgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIEluaXRpYWxpc2UgdGhlIHdhcm5pbmcgdmFsdWUgKi8KIAlvdXRsKDB4MzAwIHwgMCwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMHg0KTsKIAlvdXRsKChkYXRhWzBdIDw8IDgpLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAwKTsKIAlvdXRsKDB4MjAwMDAwVUwsIGRldnByaXYtPmlvYmFzZSArIDEyOCArIDEyKTsKQEAgLTU0MCwxNDUgKzM5OCw4OCBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTAzNV9SZWFkQW5hbG9nSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkICB2YWx1ZSAgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwJCQkgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWlfTm9PZkNoYW5uZWxzICAgIDogTm8gT2YgQ2hhbm5lbHMgVG8gcmVhZCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLXwJCQkgICAgICAgICAgZGF0YVswXSAgOiBEaWdpdGFsIFZhbHVlIE9mIElucHV0ICAgICAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kwMzVfUmVhZEFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqCisgKiBkYXRhWzBdIERpZ2l0YWwgVmFsdWUgT2YgSW5wdXQKKyAqLworc3RhdGljIGludCBhcGNpMDM1X2FpX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX0NvbW1hbmRSZWdpc3RlciA9IDA7CisJdW5zaWduZWQgaW50IHVpX0NvbW1hbmRSZWdpc3RlcjsKIAotLyoqKioqKioqKioqKioqKioqKi8KLS8qICBTZXQgdGhlIHN0YXJ0ICovCi0vKioqKioqKioqKioqKioqKioqLworCS8qICBTZXQgdGhlIHN0YXJ0ICovCiAJdWlfQ29tbWFuZFJlZ2lzdGVyID0gMHg4MDAwMDsKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJLyogV3JpdGUgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGwodWlfQ29tbWFuZFJlZ2lzdGVyLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyA4KTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlYWQgdGhlIGRpZ2l0YWwgdmFsdWUgb2YgdGhlIGlucHV0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFJlYWQgdGhlIGRpZ2l0YWwgdmFsdWUgb2YgdGhlIGlucHV0ICovCiAJZGF0YVswXSA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAyOCk7CiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiAgaW50IGlfQVBDSTAzNV9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQkJCSAgICAgfAotfAkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDpSZXNldHMgdGhlIHJlZ2lzdGVycyBvZiB0aGUgY2FyZCAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kwMzVfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBpX0NvdW50ID0gMDsKKwlpbnQgaV9Db3VudDsKIAogCWZvciAoaV9Db3VudCA9IDE7IGlfQ291bnQgPD0gNDsgaV9Db3VudCsrKSB7CiAJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwotCQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAwKTsJLyogc3RvcCBhbGwgdGltZXJzICovCisKKwkJLyogc3RvcCBhbGwgdGltZXJzICovCisJCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDApOwogCX0KIAlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTIpOwkvKiBEaXNhYmxlIHRoZSB3YXJuaW5nIGRlbGF5ICovCiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IHN0YXRpYyB2b2lkIHZfQVBDSTAzNV9JbnRlcnJ1cHQJCQkJCSAgICAgfAotfAkJCQkJICAoaW50IGlycSAsIHZvaWQgKmQpICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogSW50ZXJydXB0IHByb2Nlc3NpbmcgUm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IGludCBpcnEgICAgICAgICAgICAgICAgIDogaXJxIG51bWJlciAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCAgICAgICAgICAgICAgICAgOiB2b2lkIHBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgdm9pZCB2X0FQQ0kwMzVfSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMDM1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQogewogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMSA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMiA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX1JlYWRDb21tYW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbE51bWJlciA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX0RpZ2l0YWxUZW1wZXJhdHVyZSA9IDA7CisJdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMTsKKwl1bnNpZ25lZCBpbnQgdWlfU3RhdHVzUmVnaXN0ZXIyOworCXVuc2lnbmVkIGludCB1aV9SZWFkQ29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbE51bWJlcjsKKwl1bnNpZ25lZCBpbnQgdWlfRGlnaXRhbFRlbXBlcmF0dXJlOwogCiAJaWYgKGlfVGVtcCA9PSAxKSB7CiAJCWlfV2F0Y2hkb2dOYnIgPSBpX0ZsYWc7CiAJCWlfRmxhZyA9IGlfRmxhZyArIDE7CiAJfQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBvZiB0ZW1wZXJhdHVyZSBXYXJuaW5nICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl1aV9TdGF0dXNSZWdpc3RlcjEgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTYpOwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBmb3IgV2F0Y2hkb2cvdGltZXIgKi8KLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGVtcGVyYXR1cmUgV2FybmluZyAqLworCXVpX1N0YXR1c1JlZ2lzdGVyMSA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAxNik7CisKKwkvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGZvciBXYXRjaGRvZy90aW1lciAqLwogCXVpX1N0YXR1c1JlZ2lzdGVyMiA9CiAJCWlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDIwKTsKIAotCWlmICgoKCh1aV9TdGF0dXNSZWdpc3RlcjEpICYgMHg4KSA9PSAweDgpKQkvKiBUZXN0IGlmIHdhcm5pbmcgcmVsYXkgaW50ZXJydXB0ICovCi0JewotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFRlc3QgaWYgd2FybmluZyByZWxheSBpbnRlcnJ1cHQgKi8KKwlpZiAoKCgodWlfU3RhdHVzUmVnaXN0ZXIxKSAmIDB4OCkgPT0gMHg4KSkgeworCiAJCS8qIERpc2FibGUgdGhlIHRlbXBlcmF0dXJlIHdhcm5pbmcgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJdWlfUmVhZENvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTIpOwogCQl1aV9SZWFkQ29tbWFuZCA9IHVpX1JlYWRDb21tYW5kICYgMHhGRkRGMDAwMFVMOwogCQlvdXRsKHVpX1JlYWRDb21tYW5kLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAxMik7Ci0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkvKiBSZWFkIHRoZSBjaGFubmVsIG51bWJlciAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJdWlfQ2hhbm5lbE51bWJlciA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyA2MCk7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkvKiBSZWFkIHRoZSBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQl1aV9EaWdpdGFsVGVtcGVyYXR1cmUgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgNjApOwotCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwkvKiAgc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLwotCX0JCQkvKiBpZiAoKCh1aV9TdGF0dXNSZWdpc3RlcjEgJiAweDgpID09IDB4OCkpICovCiAKLQllbHNlIHsKLQkJaWYgKCh1aV9TdGF0dXNSZWdpc3RlcjIgJiAweDEpID09IDB4MSkgewotCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsJLyogIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KLQkJfQotCX0JCQkvKiBlbHNlIGlmICgoKHVpX1N0YXR1c1JlZ2lzdGVyMSAmIDB4OCkgPT0gMHg4KSkgKi8KKwkJLyogUmVhZCB0aGUgY2hhbm5lbCBudW1iZXIgKi8KKwkJdWlfQ2hhbm5lbE51bWJlciA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyA2MCk7CisKKwkJLyogUmVhZCB0aGUgZGlnaXRhbCB0ZW1wZXJhdHVyZSB2YWx1ZSAqLworCQl1aV9EaWdpdGFsVGVtcGVyYXR1cmUgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgNjApOworCisJCS8qICBzZW5kIHNpZ25hbCB0byB0aGUgc2FtcGxlICovCisJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CisKKwl9IGVsc2UgaWYgKCh1aV9TdGF0dXNSZWdpc3RlcjIgJiAweDEpID09IDB4MSkgeworCQkvKiAgc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLworCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOworCX0KIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwppbmRleCAwNTQ5MTA1Li5hNjMzOTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCkBAIC0xLDQ4ICsxLDI1IEBACi0vKioKLUB2ZXJiYXRpbQotCi1Db3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KLQotCUFEREktREFUQSBHbWJICi0JRGllc2Vsc3RyYXNzZSAzCi0JRC03NzgzMyBPdHRlcnN3ZWllcgotCVRlbDogKzE5KDApNzIyMy85NDkzLTAKLQlGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgotCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQotCWluZm9AYWRkaS1kYXRhLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLUBlbmR2ZXJiYXRpbQotKi8KIC8qCi0KLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IChDKSBBRERJLURBVEEgR21iSCAgICAgICAgICBEaWVzZWxzdHJhw59lIDMgICAgICAgRC03NzgzMyBPdHRlcnN3ZWllciAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgVGVsIDogKzQ5ICgwKSA3MjIzLzk0OTMtMCAgICAgfCBlbWFpbCAgICA6IGluZm9AYWRkaS1kYXRhLmNvbSAgICAgICAgIHwKLSAgfCBGYXggOiArNDkgKDApIDcyMjMvOTQ5My05MiAgICB8IEludGVybmV0IDogaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCAgICAgOiBBUENJLTE1MDAgICAgICAgfCBDb21waWxlciAgIDogR0NDICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCBNb2R1bGUgbmFtZSA6IGh3ZHJ2X2FwY2kxNTAwLmN8IFZlcnNpb24gICAgOiAyLjk2ICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCBtYW5hZ2VyOiBFcmljIFN0b2x6ICAgfCBEYXRlICAgICAgIDogIDAyLzEyLzIwMDIgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IERlc2NyaXB0aW9uIDogICBIYXJkd2FyZSBMYXllciBBY2Nlc3MgRm9yIEFQQ0ktMTUwMCAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICBEYXRlICAgfCAgIEF1dGhvciAgfCAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB1cGRhdGVzICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0vKioqKioqKioqICAgICAgRGVmaW5pdGlvbnMgZm9yIEFQQ0ktMTUwMCBjYXJkICAqKioqKi8KKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBBRERJLURBVEEgR21iSCBmb3IgdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgbW9kdWxlLgorICoKKyAqCUFEREktREFUQSBHbWJICisgKglEaWVzZWxzdHJhc3NlIDMKKyAqCUQtNzc4MzMgT3R0ZXJzd2VpZXIKKyAqCVRlbDogKzE5KDApNzIyMy85NDkzLTAKKyAqCUZheDogKzQ5KDApNzIyMy85NDkzLTkyCisgKglodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KKyAqCWluZm9AYWRkaS1kYXRhLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqLwogCiAvKiBDYXJkIFNwZWNpZmljIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIEFQQ0kxNTAwX0FERFJFU1NfUkFOR0UJCTQKQEAgLTE0MSw5OSArMTE4LDQ1IEBACiAJQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fTUFTSwogfTsKIAotc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjFJbml0ID0gMDsKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIySW5pdCA9IDA7Ci1zdGF0aWMgaW50IGlfV2F0Y2hkb2dDb3VudGVyM0luaXQgPSAwOwotc3RhdGljIGludCBpX0V2ZW50MVN0YXR1cyA9IDAsIGlfRXZlbnQyU3RhdHVzID0gMDsKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXJXYXRjaGRvZ0ludGVycnVwdCA9IDA7Ci1zdGF0aWMgaW50IGlfTG9naWMgPSAwLCBpX0NvdW50ZXJMb2dpYyA9IDA7Ci1zdGF0aWMgaW50IGlfSW50ZXJydXB0TWFzayA9IDA7Ci1zdGF0aWMgaW50IGlfSW5wdXRDaGFubmVsID0gMDsKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIxRW5hYmxlZCA9IDAsIGlfVGltZXJDb3VudGVyMkVuYWJsZWQgPSAwLAotCSAgIGlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAwOworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjFJbml0Oworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjJJbml0Oworc3RhdGljIGludCBpX1dhdGNoZG9nQ291bnRlcjNJbml0Oworc3RhdGljIGludCBpX0V2ZW50MVN0YXR1cywgaV9FdmVudDJTdGF0dXM7CitzdGF0aWMgaW50IGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQ7CitzdGF0aWMgaW50IGlfTG9naWMsIGlfQ291bnRlckxvZ2ljOworc3RhdGljIGludCBpX0ludGVycnVwdE1hc2s7CitzdGF0aWMgaW50IGlfSW5wdXRDaGFubmVsOworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjFFbmFibGVkLCBpX1RpbWVyQ291bnRlcjJFbmFibGVkLAorCSAgIGlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQ7CiAKIC8qCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxJbnB1dEV2ZW50ICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQW4gZXZlbnQgY2FuIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBwb3J0LiAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgZXZlbnQgaXMgcmVsYXRlZCB0byB0aGUgZmlyc3QgOCBjaGFubmVscyAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIChwb3J0IDEpIGFuZCB0aGUgc2Vjb25kIHRvIHRoZSBmb2xsb3dpbmcgNiBjaGFubmVscyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgKHBvcnQgMikuIEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb3IgYm90aCAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBldmVudHMgaGF2ZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgZGF0YVswXSAgICAgICAgICAgIDpOdW1iZXIgb2YgdGhlIGlucHV0IHBvcnQgb24gICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBldmVudCB3aWxsIHRha2UgcGxhY2UgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgb3IgMikKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgIDogVGhlIGV2ZW50IGxvZ2ljIGZvciBwb3J0IDEgaGFzICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHBvc3NpYmlsaXRpZXMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MCAgQVBDSTE1MDBfQU5EICAgICAgIDpUaGlzIGxvZ2ljICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIEFORCB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljLiAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIEFQQ0kxNTAwX09SICAgICAgICA6VGhpcyBsb2dpYyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rcyAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dHMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBsb2dpYy4gICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICBBUENJMTUwMF9PUl9QUklPUklUWSAgICAgICAgfAotfAkJCQkJCQkJOlRoaXMgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXRzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBsb2dpYy4gICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0IDEgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIHRoZSAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXN0ICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgYW5kICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAgIDggICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzbWFsbGVzdHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgc2Vjb25kIHBvcnQgdGhlIHVzZXIgaGFzfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBwb3NzaWJpbGl0eTogICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUENJMTUwMF9PUiAgICAgICAgOlRoaXMgbG9naWMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXRzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBsb2dpYyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSAgICAgICAgICAgICAgOiBUaGVzZSA4LWNoYXJhY3RlciB3b3JkIGZvciBwb3J0MXwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCA2LWNoYXJhY3RlciB3b3JkIGZvciBwb3J0IDIgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZSB0aGUgbWFzayBvZiB0aGUgZXZlbnQuICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYWNoIHBsYWNlIGdpdmVzIHRoZSBzdGF0ZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBpbnB1dCBjaGFubmVscyBhbmQgY2FuICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBvbmUgb2YgdGhlc2Ugc2l4IGNoYXJhY3RlcnN8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgOiBUaGlzIGlucHV0IG11c3QgYmUgb24gMCAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICA6IFRoaXMgaW5wdXQgbXVzdCBiZSBvbiAxICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIDogVGhpcyBpbnB1dCByZWFjdHMgdG8gICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGZhbGxpbmcgZWRnZSAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICA6IFRoaXMgaW5wdXQgcmVhY3RzIHRvIGEgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgOiBUaGlzIGlucHV0IHJlYWN0cyB0byBib3RoIGVkZ2VzIHwKLXwKLXwJCQkJCQkJCTUgIDogVGhpcyBpbnB1dCBpcyBub3QgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBldmVudCAgIAkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Db25maWdEaWdpdGFsSW5wdXRFdmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBBbiBldmVudCBjYW4gYmUgZ2VuZXJhdGVkIGZvciBlYWNoIHBvcnQuIFRoZSBmaXJzdCBldmVudCBpcyByZWxhdGVkIHRvIHRoZQorICogZmlyc3QgOCBjaGFubmVscyAocG9ydCAxKSBhbmQgdGhlIHNlY29uZCB0byB0aGUgZm9sbG93aW5nIDYgY2hhbm5lbHMgKHBvcnQgMikKKyAqIEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb3IgYm90aCBldmVudHMgaGF2ZSBvY2N1cnJlZC4KKyAqCisgKiBkYXRhWzBdIE51bWJlciBvZiB0aGUgaW5wdXQgcG9ydCBvbiB3aGljaCB0aGUgZXZlbnQgd2lsbCB0YWtlIHBsYWNlICgxIG9yIDIpCisgKiBkYXRhWzFdIFRoZSBldmVudCBsb2dpYyBmb3IgcG9ydCAxIGhhcyB0aHJlZSBwb3NzaWJpbGl0aWVzOgorICoJQVBDSTE1MDBfQU5ECQlUaGlzIGxvZ2ljIGxpbmtzIHRoZSBpbnB1dHMgd2l0aCBhbiBBTkQgbG9naWMuCisgKglBUENJMTUwMF9PUgkJVGhpcyBsb2dpYyBsaW5rcyB0aGUgaW5wdXRzIHdpdGggYSBPUiBsb2dpYy4KKyAqCUFQQ0kxNTAwX09SX1BSSU9SSVRZCVRoaXMgbG9naWMgbGlua3MgdGhlIGlucHV0cyB3aXRoIGEgcHJpb3JpdHkgT1IKKyAqCQkJCWxvZ2ljLiBJbnB1dCAxIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBsZXZlbAorICoJCQkJYW5kIGlucHV0IDggdGhlCXNtYWxsZXN0LgorICoJRm9yIHRoZSBzZWNvbmQgcG9ydCB0aGUgdXNlciBoYXMgMSBwb3NzaWJpbGl0eToKKyAqCUFQQ0kxNTAwX09SCVRoaXMgbG9naWMgbGlua3MgdGhlIGlucHV0cyB3aXRoIGEgcG9sYXJpdHkgT1IgbG9naWMKKyAqIGRhdGFbMl0gVGhlc2UgOC1jaGFyYWN0ZXIgd29yZCBmb3IgcG9ydDEgYW5kIDYtY2hhcmFjdGVyIHdvcmQgZm9yIHBvcnQgMgorICoJICAgZ2l2ZSB0aGUgbWFzayBvZiB0aGUgZXZlbnQuIEVhY2ggcGxhY2UgZ2l2ZXMgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dAorICoJICAgY2hhbm5lbHMgYW5kIGNhbiBoYXZlIG9uZSBvZiB0aGVzZSBzaXggY2hhcmFjdGVycworICoJMCBUaGlzIGlucHV0IG11c3QgYmUgb24gMAorICoJMSBUaGlzIGlucHV0IG11c3QgYmUgb24gMQorICoJMiBUaGlzIGlucHV0IHJlYWN0cyB0byBhIGZhbGxpbmcgZWRnZQorICoJMyBUaGlzIGlucHV0IHJlYWN0cyB0byBhIHJpc2luZyBlZGdlCisgKgk0IFRoaXMgaW5wdXQgcmVhY3RzIHRvIGJvdGggZWRnZXMKKyAqCTUgVGhpcyBpbnB1dCBpcyBub3QgdXNlZCBmb3IgZXZlbnQKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF9kaV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfUGF0dGVyblBvbGFyaXR5ID0gMCwgaV9QYXR0ZXJuVHJhbnNpdGlvbiA9IDAsIGlfUGF0dGVybk1hc2sgPSAwOwpAQCAtMjQxLDE0ICsxNjQsMTAgQEAKIAlpbnQgaV9QYXR0ZXJuVHJhbnNpdGlvbkNvdW50ID0gMCwgaV9SZWdWYWx1ZTsKIAlpbnQgaTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBEaXNhYmxlcyAgdGhlIG1haW4gaW50ZXJydXB0IG9uIHRoZSBib2FyZCAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCWlmIChkYXRhWzBdID09IDEpIHsKQEAgLTI1OSw3ICsxNzgsOCBAQAogCQkJaV9NYXhDaGFubmVsID0gNjsKIAkJfQkJLyogIGlmKGRhdGFbMF09PTIpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgcG9ydCBldmVudCAgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBzcGVjaWZpZWQgcG9ydCBldmVudCBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZihkYXRhWzBdPT0yKSAqLwogCX0JCQkvKiBlbHNlICBpZiAoZGF0YVswXSA9PSAxKSAqLwpAQCAtMjc0LDcgKzE5NCw4IEBACiAJCWRhdGFbMV0gPSBBUENJMTUwMF9PUl9QUklPUklUWTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgbG9naWMgZG9lcyBub3QgZXhpc3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogc3dpdGNoKGRhdGFbMV0pOyAqLwogCkBAIC0zMTgsMzcgKzIzOSwzMCBAQAogCQljYXNlIDU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGUgb3B0aW9uIGluZGljYXRlZCBpbiB0aGUgZXZlbnQgbWFzayBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIG9wdGlvbiBpbmRpY2F0ZWQgaW4gdGhlIGV2ZW50IG1hc2sgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goaV9FdmVudE1hc2spICovCiAJfQkJCS8qIGZvciAoaV9Db3VudCA9IGlfTWF4Q2hhbm5lbDsgaV9Db3VudCA+MDtpX0NvdW50IC0tKSAqLwogCiAJaWYgKGRhdGFbMF0gPT0gMSkgewotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIGludGVycnVwdCBsb2dpYyAqLwotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfQU5EIHx8CiAJCQlkYXRhWzFdID09IEFQQ0kxNTAwX09SIHx8CiAJCQlkYXRhWzFdID09IEFQQ0kxNTAwX09SX1BSSU9SSVRZKSB7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBUZXN0cyBpZiBhIHRyYW5zaXRpb24gd2FzIGRlY2xhcmVkICovCiAJCQkvKiBmb3IgYSBPUiBQUklPUklUWSBsb2dpYyAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkYXRhWzFdID09IEFQQ0kxNTAwX09SX1BSSU9SSVRZCiAJCQkJJiYgaV9QYXR0ZXJuVHJhbnNpdGlvbiAhPSAwKSB7Ci0JCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJLyogVHJhbnNpdGlvbiBlcnJvciBvbiBhbiBPUiBQUklPUklUWSBsb2dpYyAqLwotCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJCXByaW50aygiXG5UcmFuc2l0aW9uIGVycm9yIG9uIGFuIE9SIFBSSU9SSVRZIGxvZ2ljXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIlRyYW5zaXRpb24gZXJyb3Igb24gYW4gT1IgUFJJT1JJVFkgbG9naWNcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQkvKiAgaWYgKGRhdGFbMV09PSBBUENJMTUwMF9PUl9QUklPUklUWSAmJiBpX1BhdHRlcm5UcmFuc2l0aW9uICE9IDApICovCiAKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdHMgaWYgbW9yZSB0aGFuIG9uZSB0cmFuc2l0aW9uICovCiAJCQkvKiB3YXMgZGVjbGFyZWQgZm9yIGFuIEFORCBsb2dpYyAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGF0YVsxXSA9PSBBUENJMTUwMF9BTkQpIHsKIAkJCQlmb3IgKGlfQ291bnQgPSAwOyBpX0NvdW50IDwgODsgaV9Db3VudCsrKSB7CkBAIC0zNjAsMjkgKzI3NCwyMSBAQAogCQkJCX0JLyogZm9yIChpX0NvdW50ID0gMDsgaV9Db3VudCA8IDg7IGlfQ291bnQrKykgKi8KIAogCQkJCWlmIChpX1BhdHRlcm5UcmFuc2l0aW9uQ291bnQgPiAxKSB7Ci0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCQkJLyogVHJhbnNpdGlvbiBlcnJvciBvbiBhbiBBTkQgbG9naWMgICAgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCQkJcHJpbnRrKCJcbiBUcmFuc2l0aW9uIGVycm9yIG9uIGFuIEFORCBsb2dpY1xuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIlRyYW5zaXRpb24gZXJyb3Igb24gYW4gQU5EIGxvZ2ljXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQkvKiAgaWYgKGlfUGF0dGVyblRyYW5zaXRpb25Db3VudCA+IDEpICovCiAJCQl9CS8qICBpZiAoZGF0YVsxXT09IEFQQ0kxNTAwX0FORCkgKi8KIAotCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCS8qKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEaXNhYmxlIFBvcnQgQSAqLwotCQkJICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKDB4RjAsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCAxICAgICovCi0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9QQVRURVJOX1BPTEFSSVRZLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0zOTAsMjAgKzI5NiwxNiBAQAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIG1hc2sgcmVnaXN0ZXIgb2YgICAgICAqLwogCQkJLyogcG9ydCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfUEFUVEVSTl9NQVNLLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQlvdXRiKGlfUGF0dGVybk1hc2ssCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIHBhdHRlcm4gdHJhbnNpdGlvbiByZWdpc3RlciAgKi8KIAkJCS8qIG9mIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9QQVRURVJOX1RSQU5TSVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTQxMSwxMCArMzEzLDggQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gbWFzayAgICAqLwogCQkJLyogcmVnaXN0ZXIgb2YgcG9ydCAxICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTQyMiwxNyArMzIyLDEzIEBACiAJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAgICovCiAJCQkvKiByZWdpc3RlciBvZiBwb3J0IDEgICAgICAgICAgICAgICAgICAgICAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfU1BFQ0lGSUNBVElPTiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogUG9ydCBBIG5ldyBtb2RlICAgICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweEY5KSB8IGRhdGFbMV0gfCAweDk7CiAJCQlvdXRiKGlfUmVnVmFsdWUsCkBAIC00NDEsNTMgKzMzNyw0MCBAQAogCiAJCQlpX0V2ZW50MVN0YXR1cyA9IDE7CiAKLQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkvKiBFbmFibGUgUG9ydCBBICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoMHhGNCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCX0JCS8qICBpZihkYXRhWzFdPT1BUENJMTUwMF9BTkR8fGRhdGFbMV09PUFQQ0kxNTAwX09SfHxkYXRhWzFdPT1BUENJMTUwMF9PUl9QUklPUklUWSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuVGhlIGNob2ljZSBmb3IgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGUgY2hvaWNlIGZvciBpbnRlcnJ1cHQgbG9naWMgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBlbHNlIH0vLyBpZihkYXRhWzFdPT1BUENJMTUwMF9BTkR8fGRhdGFbMV09PUFQQ0kxNTAwX09SfHxkYXRhWzFdPT1BUENJMTUwMF9PUl9QUklPUklUWSkgKi8KIAl9CQkJLyogICAgaWYgKGRhdGFbMF09PSAxKSAqLwogCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgaWYgZXZlbnQgc2V0dGluZyBmb3IgcG9ydCAyICovCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaWYgKGRhdGFbMF0gPT0gMikgewotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdCB0aGUgZXZlbnQgbG9naWMgKi8KLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfT1IpIHsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERpc2FibGUgUG9ydCBCICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YigweDc0LAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAqLwogCQkJLyogcmVnaXN0ZXIgb2YgcG9ydCBCICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTQ5NSwxMCArMzc4LDggQEAKIAkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAgICovCiAJCQkvKiByZWdpc3RlciBvZiBwb3J0IEIgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTUwNywzNyArMzg4LDI5IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIGVycm9yIGNoYW5uZWxzIDEgYW5kIDIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpX1BhdHRlcm5NYXNrID0gKGlfUGF0dGVybk1hc2sgfCAweEMwKTsKIAkJCWlfUGF0dGVyblBvbGFyaXR5ID0gKGlfUGF0dGVyblBvbGFyaXR5IHwgMHhDMCk7CiAJCQlpX1BhdHRlcm5UcmFuc2l0aW9uID0gKGlfUGF0dGVyblRyYW5zaXRpb24gfCAweEMwKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwb2xhcml0eSByZWdpc3RlciBvZiBwb3J0IDIgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfUEFUVEVSTl9QT0xBUklUWSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJb3V0YihpX1BhdHRlcm5Qb2xhcml0eSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIHRyYW5zaXRpb24gcmVnaXN0ZXIgICAgKi8KIAkJCS8qIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX1RSQU5TSVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCW91dGIoaV9QYXR0ZXJuVHJhbnNpdGlvbiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIE1hc2sgcmVnaXN0ZXIgICAgKi8KIAkJCS8qIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fTUFTSywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwpAQCAtNTQ2LDIwICs0MTksMTYgQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIG1hc2sgICAgKi8KIAkJCS8qIHJlZ2lzdGVyIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJaV9SZWdWYWx1ZSA9CiAJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIG1hc2sgICAgKi8KIAkJCS8qIHJlZ2lzdGVyIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtNTY5LDIzICs0MzgsMjAgQEAKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCQkJaV9FdmVudDJTdGF0dXMgPSAxOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCS8qIEVuYWJsZSBQb3J0IEIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAogCQkJb3V0YigweEY0LAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qICAgaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfT1IpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBjaG9pY2UgZm9yIGludGVycnVwdCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIGNob2ljZSBmb3IgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfT1IpICovCiAJfQkJCS8qIGlmKGRhdGFbMF09PTIpICovCkBAIC01OTQsMzEgKzQ2MCwxNSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfU3RhcnRTdG9wSW5wdXRFdmVudCAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiAgQWxsb3dzIG9yIGRpc2FsbG93cyBhIHBvcnQgZXZlbnQgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1aV9DaGFubmVsIDogQ2hhbm5lbCBudW1iZXIgdG8gcmVhZCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIHRvIHJlYWQgc3RhdHVzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gICAgICAgICAgICAgICAgIDowIFN0YXJ0IGlucHV0IGV2ZW50Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIFN0b3AgaW5wdXQgZXZlbnQKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgICAgICAgOk5vIG9mIHBvcnQgKDEgb3IgMikKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfU3RhcnRTdG9wSW5wdXRFdmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBBbGxvd3Mgb3IgZGlzYWxsb3dzIGEgcG9ydCBldmVudAorICoKKyAqIGRhdGFbMF0gMCA9IFN0YXJ0IGlucHV0IGV2ZW50LCAxID0gU3RvcCBpbnB1dCBldmVudAorICogZGF0YVsxXSBOdW1iZXIgb2YgcG9ydCAoMSBvciAyKQorICovCitzdGF0aWMgaW50IGFwY2kxNTAwX2RpX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpX0V2ZW50MUludGVycnVwdFN0YXR1cyA9IDAsIGlfRXZlbnQySW50ZXJydXB0U3RhdHVzID0KQEAgLTYyNiw0OCArNDc2LDMwIEBACiAKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIFNUQVJUOgotCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0cyB0aGUgcG9ydCBudW1iZXIgKi8KLQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoZGF0YVsxXSA9PSAxIHx8IGRhdGFbMV0gPT0gMikgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBUZXN0IGlmIHBvcnQgMSBzZWxlY3RlZCAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkYXRhWzFdID09IDEpIHsKLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUZXN0IGlmIGV2ZW50IGluaXRpYWxpc2VkICovCi0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJaWYgKGlfRXZlbnQxU3RhdHVzID09IDEpIHsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSBQb3J0IEEgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEFsbG93cyB0aGUgcGF0dGVybiBpbnRlcnJ1cHQgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhDMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBFbmFibGUgUG9ydCBBICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGNCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTY4MCwxODUgKzUxMiwxNDIgQEAKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBBdXRob3JpemVzIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RDAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKIAkJCQl9CS8qICBpZihpX0V2ZW50MVN0YXR1cz09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbkV2ZW50IDEgbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiRXZlbnQgMSBub3QgaW5pdGlhbGlzZWRcbiIpOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CS8qIGVsc2UgaWYoaV9FdmVudDFTdGF0dXM9PTEpICovCiAJCQl9CS8qIGlmIChkYXRhWzFdPT0xKSAqLwogCQkJaWYgKGRhdGFbMV0gPT0gMikgewogCiAJCQkJaWYgKGlfRXZlbnQyU3RhdHVzID09IDEpIHsKLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBEaXNhYmxlIFBvcnQgQiAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweDc0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mICAgICAgKi8KIAkJCQkJLyogcG9ydCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogQWxsb3dzIHRoZSBwYXR0ZXJuIGludGVycnVwdCAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEMwLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEVuYWJsZSBQb3J0IEIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEY0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBBdXRob3JpemVzIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RDAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQkJCWlfRXZlbnQySW50ZXJydXB0U3RhdHVzID0gMTsKIAkJCQl9CS8qICBpZihpX0V2ZW50MlN0YXR1cz09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbkV2ZW50IDIgbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiRXZlbnQgMiBub3QgaW5pdGlhbGlzZWRcbiIpOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CS8qIGVsc2UgaWYoaV9FdmVudDJTdGF0dXM9PTEpICovCiAJCQl9CS8qICBpZihkYXRhWzFdPT0yKSAqLwogCQl9CQkvKiAgaWYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzBdID09IDIpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBwb3J0IHBhcmFtZXRlciBpcyBpbiBlcnJvclxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHBvcnQgcGFyYW1ldGVyIGlzIGluIGVycm9yXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlIGlmIChkYXRhWzFdID09IDEgfHwgZGF0YVswXSA9PSAyKSAqLwogCiAJCWJyZWFrOwogCiAJY2FzZSBTVE9QOgotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0cyB0aGUgcG9ydCBudW1iZXIgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoZGF0YVsxXSA9PSAxIHx8IGRhdGFbMV0gPT0gMikgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBUZXN0IGlmIHBvcnQgMSBzZWxlY3RlZCAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkYXRhWzFdID09IDEpIHsKLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUZXN0IGlmIGV2ZW50IGluaXRpYWxpc2VkICovCi0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJaWYgKGlfRXZlbnQxU3RhdHVzID09IDEpIHsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSBQb3J0IEEgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEluaGliaXRzIHRoZSBwYXR0ZXJuIGludGVycnVwdCAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEUwLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEVuYWJsZSBQb3J0IEEgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEY0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJCQlpX0V2ZW50MUludGVycnVwdFN0YXR1cyA9IDA7CiAJCQkJfQkvKiAgaWYoaV9FdmVudDFTdGF0dXM9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5FdmVudCAxIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIkV2ZW50IDEgbm90IGluaXRpYWxpc2VkXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQkvKiBlbHNlIGlmKGlfRXZlbnQxU3RhdHVzPT0xKSAqLwogCQkJfQkvKiBpZiAoZGF0YVsxXT09MSkgKi8KIAkJCWlmIChkYXRhWzFdID09IDIpIHsKLQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVGVzdCBpZiBldmVudCBpbml0aWFsaXNlZCAqLwotCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpZiAoaV9FdmVudDJTdGF0dXMgPT0gMSkgewotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBEaXNhYmxlIFBvcnQgQiAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4NzQsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfQ09NTUFORF9BTkRfU1RBVFVTLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBJbmhpYml0cyB0aGUgcGF0dGVybiBpbnRlcnJ1cHQgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhFMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBFbmFibGUgUG9ydCBCICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGNCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCQkJaV9FdmVudDJJbnRlcnJ1cHRTdGF0dXMgPSAwOwogCQkJCX0JLyogIGlmKGlfRXZlbnQyU3RhdHVzPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQlwcmludGsoIlxuRXZlbnQgMiBub3QgaW5pdGlhbGlzZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJFdmVudCAyIG5vdCBpbml0aWFsaXNlZFxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0JLyogZWxzZSBpZihpX0V2ZW50MlN0YXR1cz09MSkgKi8KIAkJCX0JLyogaWYoZGF0YVsxXT09MikgKi8KIAogCQl9CQkvKiAgaWYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzFdID09IDIpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBwb3J0IHBhcmFtZXRlciBpcyBpbiBlcnJvclxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHBvcnQgcGFyYW1ldGVyIGlzIGluIGVycm9yXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlIGlmIChkYXRhWzFdID09IDEgfHwgZGF0YVsxXSA9PSAyKSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIlxuVGhlIG9wdGlvbiBvZiBTVEFSVC9TVE9QIGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIG9wdGlvbiBvZiBTVEFSVC9TVE9QIGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIHN3aXRjaChkYXRhWzBdKSAqLwogCkBAIC04NjYsMzUgKzY1NSwxNyBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfSW5pdGlhbGlzYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgZGlnaXRhbCBpbnB1dCAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1aV9DaGFubmVsIDogQ2hhbm5lbCBudW1iZXIgdG8gcmVhZCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIHRvIHJlYWQgc3RhdHVzICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX0luaXRpYWxpc2F0aW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBkaWdpdGFsIGlucHV0CisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfZGlfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9EdW1teVJlYWQgPSAwOwogCi0gICAgLyoqKioqKioqKioqKioqKioqKi8KIAkvKiBTb2Z0d2FyZSByZXNldCAqLwotICAgIC8qKioqKioqKioqKioqKioqKiovCiAJaV9EdW1teVJlYWQgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlpX0R1bW15UmVhZCA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTkwMiwxNiArNjczLDEyIEBACiAJb3V0YigxLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDB4RjQsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiByZWdpc3RlciBvZiBwb3J0IEEgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweDEwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTk0Myw5ICs3MTAsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweDEwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTk3NSw5ICs3NDAsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBkYXRhIHBhdGggcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCBDICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9DX0RBVEFfUENJVENIX1BPTEFSSVRZLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBIaWdoIGxldmVsIG9mIHBvcnQgQyBtZWFucyAxICovCkBAIC05OTIsOSArNzU1LDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBpdCAqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMSAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIElQIGFuZCBJVVMgKi8KQEAgLTEwMDQsOSArNzY1LDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgdGhlIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDEgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIElQIGFuZCBJVVMgKi8KQEAgLTEwMTYsOSArNzc1LDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgVGltZXIgMiBpbnRlcnJ1cHQgbWFuYWdlbWVudDogICAgICAgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzICovCi0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0xMDI4LDkgKzc4NSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDM6ICAgICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgYWxsIGludGVycnVwdHMgKi8KQEAgLTEwNTEsMzcgKzgwNiwxNSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfQ29uZmlnRGlnaXRhbE91dHB1dEVycm9ySW50ZXJydXB0Ci18ICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzIHN0cnVjdCBjb21lZGlfaW5zbgotfCAgICAgICAgICAgICAgICAgICAgICAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIG91dHB1dCBtZW1vcnkgYW5kIHRoZSBkaWdpdGFsCi18ICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBlcnJvciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICA6cG9pbnRlciB0byBzdWJkZXZpY2Ugc3RydWN0dXJlCi18ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMF0gIDoxOk1lbW9yeSBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICAgICAgICAgICAgMDpNZW1vcnkgb2ZmICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdICA6MSBFbmFibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0Ci18CQkJCQkJCSAgIDowIERpc2FibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0IAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxPdXRwdXRFcnJvckludGVycnVwdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIG91dHB1dCBtZW1vcnkgYW5kIHRoZSBkaWdpdGFsIG91dHB1dCBlcnJvciBpbnRlcnJ1cHQKKyAqCisgKiBkYXRhWzFdIDEgPSBFbmFibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0CisgKgkgICAyID0gRGlzYWJsZSB0aGUgdm9sdGFnZSBlcnJvciBpbnRlcnJ1cHQKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF9kb19jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKQEAgLTEwOTAsMzEgKzgyMywxNSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfV3JpdGVEaWdpdGFsT3V0cHV0ICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBXcml0ZXMgcG9ydCB2YWx1ZSAgVG8gdGhlIHNlbGVjdGVkIHBvcnQgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVpX05vT2ZDaGFubmVscyAgICA6IE5vIE9mIENoYW5uZWxzIFRvIFdyaXRlICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfV3JpdGVEaWdpdGFsT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFdyaXRlcyBwb3J0IHZhbHVlIHRvIHRoZSBzZWxlY3RlZCBwb3J0CisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfZG9fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCB1aV9UZW1wID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHVpX1RlbXA7CiAJdW5zaWduZWQgaW50IHVpX1RlbXAxOwogCXVuc2lnbmVkIGludCB1aV9Ob09mQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiAgZ2V0IHRoZSBjaGFubmVsICovCiAKQEAgLTExNjUsNyArODgyLDkgQEAKIAkJCQkJQVBDSTE1MDBfRElHSVRBTF9PUCk7CiAJCQl9CS8qICBpZihkYXRhWzFdPT0xKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcblNwZWNpZmllZCBjaGFubmVsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiU3BlY2lmaWVkIGNoYW5uZWwgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIGVsc2UgaWYoZGF0YVsxXT09MSkgKi8KIAkJfQkJLyogZWxzZWlmKGRhdGFbMV09PTApICovCiAJfQkJCS8qIGlmKGRhdGFbM109PTApICovCkBAIC0xMjQyLDEyICs5NjEsMTUgQEAKIAkJCQkJCUFQQ0kxNTAwX0RJR0lUQUxfT1ApOwogCQkJCX0JLyogIGlmKGRhdGFbMV09PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5TcGVjaWZpZWQgY2hhbm5lbCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiU3BlY2lmaWVkIGNoYW5uZWwgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0JLyogZWxzZSBpZihkYXRhWzFdPT0xKSAqLwogCQkJfQkvKiBlbHNlaWYoZGF0YVsxXT09MCkgKi8KIAkJfQkJLyogaWYoZGF0YVszXT09MSk7ICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblNwZWNpZmllZCBmdW5jdGlvbmFsaXR5IGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJTcGVjaWZpZWQgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogaWYgZWxzZSBkYXRhWzNdPT0xKSAqLwogCX0JCQkvKiBpZiBlbHNlIGRhdGFbM109PTApICovCkBAIC0xMjU2LDU3ICs5NzgsMjMgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX0NvbmZpZ0NvdW50ZXJUaW1lcldhdGNoZG9nKGNvbWVkaV9kZXZpY2UKLXwgICAgICAgICAgICAgICAgICAgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyxzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKXwKLXwJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIFRoZSBXYXRjaGRvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgIDogMiAgICAgQVBDSTE1MDBfMV84X0tIWgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICBBUENJMTUwMF8zXzZfS0haICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIEFQQ0kxNTAwXzExNV9LSFoKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIxL1RpbWVyMQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgQ291bnRlcjIvVGltZXIyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICBDb3VudGVyMy9XYXRjaGRvZwotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzJdICAgICAgICAgICAgICAgIDogMCAgICAgQ291bnRlcgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgVGltZXIvV2F0Y2hkb2cKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVszXSAgICAgICAgICAgICAgICA6ICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaGFzICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gbWVhbmluZ3MuICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIHRoZSBjb3VudGVyL3RpbWVyICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCBhcyBhIGNvdW50ZXIgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXQgdmFsdWUgb2YgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3VudGVyIGlzIGdpdmVuICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgY291bnRlci90aW1lciAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYXMgYSB0aW1lciwgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRpdmlkZXIgZmFjdG9yICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG91dHB1dCBpcyAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuLgotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XSAgICAgICAgICAgICAgICAgOiAwICAgIEFQQ0kxNTAwX0NPTlRJTlVPVVMKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICBBUENJMTUwMF9TSU5HTEUKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNV0gICAgICAgICAgICAgICAgIDogMCAgICBTb2Z0d2FyZSBUcmlnZ2VyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgSGFyZHdhcmUgVHJpZ2dlcgotfAotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgICAgICAgICAgICAgICAgIDowICAgIFNvZnR3YXJlIGdhdGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICBIYXJkd2FyZSBnYXRlCi18ICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzddICAgICAgICAgICAgICAgICAgOjAgICAgSW50ZXJydXB0IERpc2FibGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICBJbnRlcnJ1cHQgRW5hYmxlCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX0NvbmZpZ0NvdW50ZXJUaW1lcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIENvbmZpZ3VyZXMgVGhlIFdhdGNoZG9nCisgKgorICogZGF0YVswXSAwID0gQVBDSTE1MDBfMTE1X0tIWiwgMSA9IEFQQ0kxNTAwXzNfNl9LSFosIDIgPSBBUENJMTUwMF8xXzhfS0haCisgKiBkYXRhWzFdIDAgPSBDb3VudGVyMS9UaW1lcjEsIDEgPSAgQ291bnRlcjIvVGltZXIyLCAyID0gQ291bnRlcjMvV2F0Y2hkb2cKKyAqIGRhdGFbMl0gMCA9IENvdW50ZXIsIDEgPSBUaW1lci9XYXRjaGRvZworICogZGF0YVszXSBUaGlzIHBhcmFtZXRlciBoYXMgdHdvIG1lYW5pbmdzLiBJZiB0aGUgY291bnRlci90aW1lciBpcyB1c2VkIGFzCisgKglhIGNvdW50ZXIgdGhlIGxpbWl0IHZhbHVlIG9mIHRoZSBjb3VudGVyIGlzIGdpdmVuLiBJZiB0aGUgY291bnRlci90aW1lcgorICoJaXMgdXNlZCBhcyBhIHRpbWVyLCB0aGUgZGl2aWRlciBmYWN0b3IgZm9yIHRoZSBvdXRwdXQgaXMgZ2l2ZW4uCisgKiBkYXRhWzRdIDAgPSBBUENJMTUwMF9DT05USU5VT1VTLCAxID0gQVBDSTE1MDBfU0lOR0xFCisgKiBkYXRhWzVdIDAgPSBTb2Z0d2FyZSBUcmlnZ2VyLCAxID0gSGFyZHdhcmUgVHJpZ2dlcgorICogZGF0YVs2XSAwID0gU29mdHdhcmUgZ2F0ZSwgMSA9IEhhcmR3YXJlIGdhdGUKKyAqIGRhdGFbN10gMCA9IEludGVycnVwdCBEaXNhYmxlLCAxID0gSW50ZXJydXB0IEVuYWJsZQorICovCitzdGF0aWMgaW50IGFwY2kxNTAwX3RpbWVyX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9UaW1lckNvdW50ZXJNb2RlLCBpX01hc3RlckNvbmZpZ3VyYXRpb247CkBAIC0xMzE5LDcgKzEwMDcsOCBAQAogCX0JCQkvKiAgaWYoZGF0YVswXT09MHx8ZGF0YVswXT09MXx8ZGF0YVswXT09MikgKi8KIAllbHNlIHsKIAkJaWYgKGRhdGFbMF0gIT0gMykgewotCQkJcHJpbnRrKCJcblRoZSBvcHRpb24gZm9yIGlucHV0IGNsb2NrIHNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIG9wdGlvbiBmb3IgaW5wdXQgY2xvY2sgc2VsZWN0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgaWYoZGF0YVswXSE9MykgKi8KIAl9CQkJLyogZWxzZWlmKGRhdGFbMF09PTB8fGRhdGFbMF09PTF8fGRhdGFbMF09PTIpICovCkBAIC0xMzM1LDcgKzEwMjQsOCBAQAogCQkJZGF0YVsyXSA9IEFQQ0kxNTAwX1RJTUVSOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBjaG9pY2UgaXMgbm90IGEgdGltZXIgbm9yIGEgY291bnRlclxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBjaG9pY2UgaXMgbm90IGEgdGltZXIgbm9yIGEgY291bnRlclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogIHN3aXRjaChkYXRhWzJdKSAqLwogCkBAIC0xMzQ4LDEzOSArMTAzOCwxMTAgQEAKIAkJCWRhdGFbNF0gPSBBUENJMTUwMF9TSU5HTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIG9wdGlvbiBmb3Igc2luZ2xlL2NvbnRpbnVvdXMgbW9kZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs0XSkgKi8KIAogCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IDc7Ci0JCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIHJlbG9hZCB2YWx1ZSAqLwotCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmICgoZGF0YVszXSA+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpIHsKIAkJCWlmIChkYXRhWzddID09IEFQQ0kxNTAwX0VOQUJMRQogCQkJCXx8IGRhdGFbN10gPT0gQVBDSTE1MDBfRElTQUJMRSkgewogCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9NT0RFX1NQRUNJRklDQVRJT04sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBtb2RlICovCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9UaW1lckNvdW50ZXJNb2RlLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9USU1FX0NTVF9MT1csCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGxvdyB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9USU1FX0NTVF9ISUdILAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgaGlnaCB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWRhdGFbM10gPSBkYXRhWzNdID4+IDg7CiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFJlYWRzIHRoZSByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX01hc3RlckNvbmZpZ3VyYXRpb24gPQogCQkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIEVuYWJsZXMgdGltZXIvY291bnRlciAxIGFuZCB0cmlnZ2VycyB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uIHwgMHg0MDsKIAotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBjb25maWd1cmF0aW9uICovCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9NYXN0ZXJDb25maWd1cmF0aW9uLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIHJlZ2lzdGVyIG9mICAgICAqLwogCQkJCS8qIHRpbWVyL2NvdW50ZXIgMSAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogRGlzYWJsZSB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoMHgwLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyByZWdpc3RlciBvZiAgICAgKi8KIAkJCQkvKiB0aW1lci9jb3VudGVyIDEgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUcmlnZ2VyIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YigweDIsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJFcnJvciBpbiBzZWxlY3Rpb24gb2YgaW50ZXJydXB0IGVuYWJsZSBvciBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogZWxzZWlmKGRhdGFbN109PSBBUENJMTUwMF9FTkFCTEUgfHxkYXRhWzddPT0gQVBDSTE1MDBfRElTQUJMRSkgKi8KIAkJfQkJLyogIGlmICgoZGF0YVszXT49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSBkYXRhWzddOwpAQCAtMTQ5Niw3ICsxMTU3LDggQEAKIAkJCWRhdGFbMl0gPSBBUENJMTUwMF9USU1FUjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGlzIG5vdCBhIHRpbWVyIG5vciBhIGNvdW50ZXJcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGlzIG5vdCBhIHRpbWVyIG5vciBhIGNvdW50ZXJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVsyXSkgKi8KIApAQCAtMTUwOSw3ICsxMTcxLDggQEAKIAkJCWRhdGFbNF0gPSBBUENJMTUwMF9TSU5HTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIG9wdGlvbiBmb3Igc2luZ2xlL2NvbnRpbnVvdXMgbW9kZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs0XSkgKi8KIApAQCAtMTUyMiw3ICsxMTg1LDggQEAKIAkJCWRhdGFbNV0gPSBBUENJMTUwMF9IQVJEV0FSRV9UUklHR0VSOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBjaG9pY2UgZm9yIHNvZnR3YXJlIG9yIGhhcmR3YXJlIHRyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSB0cmlnZ2VyIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbNV0pICovCiAKQEAgLTE1MzUsMTQwICsxMTk5LDExMSBAQAogCQkJZGF0YVs2XSA9IEFQQ0kxNTAwX0hBUkRXQVJFX0dBVEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIGNob2ljZSBmb3Igc29mdHdhcmUgb3IgaGFyZHdhcmUgZ2F0ZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBjaG9pY2UgZm9yIHNvZnR3YXJlIG9yIGhhcmR3YXJlIGdhdGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs2XSkgKi8KIAogCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IGRhdGFbNV0gfCBkYXRhWzZdIHwgNzsKIAotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdCB0aGUgcmVsb2FkIHZhbHVlICovCi0JCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmICgoZGF0YVszXSA+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpIHsKIAkJCWlmIChkYXRhWzddID09IEFQQ0kxNTAwX0VOQUJMRQogCQkJCXx8IGRhdGFbN10gPT0gQVBDSTE1MDBfRElTQUJMRSkgewogCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9NT0RFX1NQRUNJRklDQVRJT04sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBtb2RlICovCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9UaW1lckNvdW50ZXJNb2RlLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9USU1FX0NTVF9MT1csCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGxvdyB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9USU1FX0NTVF9ISUdILAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgaGlnaCB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWRhdGFbM10gPSBkYXRhWzNdID4+IDg7CiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFJlYWRzIHRoZSByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX01hc3RlckNvbmZpZ3VyYXRpb24gPQogCQkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIEVuYWJsZXMgdGltZXIvY291bnRlciAyIGFuZCB0cmlnZ2VycyB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uIHwgMHgyMDsKIAotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBjb25maWd1cmF0aW9uICovCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9NYXN0ZXJDb25maWd1cmF0aW9uLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIHJlZ2lzdGVyIG9mICAgICAqLwogCQkJCS8qIHRpbWVyL2NvdW50ZXIgMiAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogRGlzYWJsZSB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoMHgwLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyByZWdpc3RlciBvZiAgICAgKi8KIAkJCQkvKiB0aW1lci9jb3VudGVyIDIgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUcmlnZ2VyIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YigweDIsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJFcnJvciBpbiBzZWxlY3Rpb24gb2YgaW50ZXJydXB0IGVuYWJsZSBvciBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogZWxzZWlmKGRhdGFbN109PSBBUENJMTUwMF9FTkFCTEUgfHxkYXRhWzddPT0gQVBDSTE1MDBfRElTQUJMRSkgKi8KIAkJfQkJLyogIGlmICgoZGF0YVszXT49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSBkYXRhWzddOwpAQCAtMTY4NCw3ICsxMzE5LDggQEAKIAkJCWRhdGFbMl0gPSBBUENJMTUwMF9XQVRDSERPRzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGlzIG5vdCBhIHdhdGNoZG9nIG5vciBhIGNvdW50ZXJcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGlzIG5vdCBhIHdhdGNoZG9nIG5vciBhIGNvdW50ZXJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVsyXSkgKi8KIApAQCAtMTY5Nyw3ICsxMzMzLDggQEAKIAkJCWRhdGFbNF0gPSBBUENJMTUwMF9TSU5HTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIG9wdGlvbiBmb3Igc2luZ2xlL2NvbnRpbnVvdXMgbW9kZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs0XSkgKi8KIApAQCAtMTcxMCwxNDYgKzEzNDcsMTA5IEBACiAJCQlkYXRhWzZdID0gQVBDSTE1MDBfSEFSRFdBUkVfR0FURTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSBnYXRlIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGlzIGNob2ljZSBmb3Igc29mdHdhcmUgb3IgaGFyZHdhcmUgZ2F0ZSBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogIHN3aXRjaChkYXRhWzZdKSAqLwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdCBpZiB1c2VkIGZvciB3YXRjaGRvZyAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMl0gPT0gQVBDSTE1MDBfV0FUQ0hET0cpIHsKLQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogLSBFbmFibGVzIHRoZSBvdXRwdXQgbGluZSAqLwogCQkJLyogLSBFbmFibGVzIHJldHJpZ2dlciAgICAgICAqLwogCQkJLyogLSBQdWxzZXMgb3V0cHV0ICAgICAgICAgICAqLwotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IDB4NTQ7CiAJCX0JCS8qIGlmIChkYXRhWzJdID09IEFQQ0kxNTAwX1dBVENIRE9HKSAqLwogCQllbHNlIHsKIAkJCWlfVGltZXJDb3VudGVyTW9kZSA9IGRhdGFbMl0gfCBkYXRhWzRdIHwgZGF0YVs2XSB8IDc7CiAJCX0JCS8qIGVsc2VpZiAoZGF0YVsyXSA9PSBBUENJMTUwMF9XQVRDSERPRykgKi8KLQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIHJlbG9hZCB2YWx1ZSAqLwotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoKGRhdGFbM10gPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSB7CiAJCQlpZiAoZGF0YVs3XSA9PSBBUENJMTUwMF9FTkFCTEUKIAkJCQl8fCBkYXRhWzddID09IEFQQ0kxNTAwX0RJU0FCTEUpIHsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbW9kZSByZWdpc3RlciBvZiB3YXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfTU9ERV9TUEVDSUZJQ0FUSU9OLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgbW9kZSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfVGltZXJDb3VudGVyTW9kZSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB3YXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfVElNRV9DU1RfTE9XLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBsb3cgdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB3YXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfVElNRV9DU1RfSElHSCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGhpZ2ggdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlkYXRhWzNdID0gZGF0YVszXSA+PiA4OwogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBSZWFkcyB0aGUgcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBFbmFibGVzIHdhdGNoZG9nL2NvdW50ZXIgMyBhbmQgdHJpZ2dlcnMgd2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiA9CiAJCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiB8IDB4MTA7CiAKLQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfTWFzdGVyQ29uZmlndXJhdGlvbiwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVGVzdCBpZiBDT1VOVEVSICovCi0JCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqLwogCQkJCWlmIChkYXRhWzJdID09IEFQQ0kxNTAwX0NPVU5URVIpIHsKIAotCQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgb2YgICAqLwogCQkJCQkvKiB3YXRjaGRvZy9jb3VudGVyIDMgICAgICAgICAgICAgICAgKi8KLQkJCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSB0aGUgIHdhdGNoZG9nL2NvdW50ZXIgMyBhbmQgc3RhcnRzIGl0ICovCi0JCQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4MCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCByZWdpc3RlciBvZiAgICovCiAJCQkJCS8qIHdhdGNoZG9nL2NvdW50ZXIgMyAgICAgICAgICAgICAgICAqLwotCQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFRyaWdnZXIgdGhlICB3YXRjaGRvZy9jb3VudGVyIDMgYW5kIHN0YXJ0cyBpdCAqLwotCQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4MiwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTE4NTgsMTIgKzE0NTgsMTQgQEAKIAogCQkJfQkvKiBpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJFcnJvciBpbiBzZWxlY3Rpb24gb2YgaW50ZXJydXB0IGVuYWJsZSBvciBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogZWxzZWlmKGRhdGFbN109PSBBUENJMTUwMF9FTkFCTEUgfHxkYXRhWzddPT0gQVBDSTE1MDBfRElTQUJMRSkgKi8KIAkJfQkJLyogIGlmICgoZGF0YVszXT49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSBkYXRhWzddOwpAQCAtMTg3MSw0NCArMTQ3MywyNSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIGNvdW50ZXJcdGltZXIgb3B0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIHNwZWNpZmllZCBjb3VudGVyL3RpbWVyIG9wdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBzd2l0Y2goZGF0YVsxXSkgKi8KIAlpX0NvdW50ZXJMb2dpYyA9IGRhdGFbMl07CiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTUwMF9TdGFydFN0b3BUcmlnZ2VyVGltZXJDb3VudGVyV2F0Y2hkb2cgICAgICB8Ci18CQkJCShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotfCAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKTsgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBTdGFydCAvIFN0b3Agb3IgdHJpZ2dlciB0aGUgdGltZXIgY291bnRlciBvciBXYXRjaGRvZyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIxL1RpbWVyMQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgQ291bnRlcjIvVGltZXIyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICBDb3VudGVyMy9XYXRjaGRvZwotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdICAgICAgICAgICAgICAgIDogMCAgICAgc3RhcnQKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIHN0b3AKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgIFRyaWdnZXIKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIFRpbWVyL1dhdGNoZG9nCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1N0YXJ0U3RvcFRyaWdnZXJUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBTdGFydCAvIFN0b3Agb3IgdHJpZ2dlciB0aGUgdGltZXIgY291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gMCA9IENvdW50ZXIxL1RpbWVyMSwgMSA9ICBDb3VudGVyMi9UaW1lcjIsIDIgPSBDb3VudGVyMy9XYXRjaGRvZworICogZGF0YVsxXSAwID0gU3RhcnQsIDEgPSBTdG9wLCAyID0gVHJpZ2dlcgorICogZGF0YVsyXSAwID0gQ291bnRlciwgMSA9IFRpbWVyL1dhdGNoZG9nCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfdGltZXJfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlOwpAQCAtMTkyNCwxMyArMTUwNyw5IEBACiAJCQkJZWxzZSB7CiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhFNDsJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXJXYXRjaGRvZ0ludGVycnVwdD09MSkgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFN0YXJ0cyB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCWlfVGltZXJDb3VudGVyMUVuYWJsZWQgPSAxOwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMTkzOSwyMCArMTUxOCwxNyBAQAogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMUluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuQ291bnRlci9UaW1lcjEgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiQ291bnRlci9UaW1lcjEgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBTVE9QOgogCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFN0b3AgdGltZXIvY291bnRlciAxICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0xOTY1LDIzICsxNTQxLDE3IEBACiAJCWNhc2UgVFJJR0dFUjoKIAkJCWlmIChpX1RpbWVyQ291bnRlcjFJbml0ID09IDEpIHsKIAkJCQlpZiAoaV9UaW1lckNvdW50ZXIxRW5hYmxlZCA9PSAxKSB7Ci0JCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2V0IFRyaWdnZXIgYW5kIGdhdGUgKi8KLQkJCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg2OwogCQkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMUVuYWJsZWQ9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZXQgVHJpZ2dlciAqLwotCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4MjsKIAkJCQl9CS8qIGVsc2VpZihpX1RpbWVyQ291bnRlcjFFbmFibGVkPT0xKSAqLwogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0xOTkwLDEzICsxNTYwLDE1IEBACiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIxSW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkJCXByaW50aygiXG5Db3VudGVyL1RpbWVyMSBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJDb3VudGVyL1RpbWVyMSBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIHN3aXRjaChkYXRhWzFdKSAqLwogCQlicmVhazsKQEAgLTIwMTEsMTMgKzE1ODMsOSBAQAogCQkJCWVsc2UgewogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4RTQ7CS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwogCQkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQ9PTEpICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTdGFydHMgdGltZXIvY291bnRlciAyICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpX1RpbWVyQ291bnRlcjJFbmFibGVkID0gMTsKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIwMjYsMjAgKzE1OTQsMTcgQEAKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkNvdW50ZXIvVGltZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIkNvdW50ZXIvVGltZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgU1RPUDoKIAotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTdG9wIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjA1MSwyMyArMTYxNiwxNyBAQAogCQljYXNlIFRSSUdHRVI6CiAJCQlpZiAoaV9UaW1lckNvdW50ZXIySW5pdCA9PSAxKSB7CiAJCQkJaWYgKGlfVGltZXJDb3VudGVyMkVuYWJsZWQgPT0gMSkgewotCQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNldCBUcmlnZ2VyIGFuZCBnYXRlICovCi0JCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4NjsKIAkJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjJFbmFibGVkPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2V0IFRyaWdnZXIgKi8KLQkJCQkJCSAgIC8qKioqKioqKioqKioqKiovCiAKIAkJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDI7CiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXIyRW5hYmxlZD09MSkgKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjA3NiwxMiArMTYzNSwxNCBAQAogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuQ291bnRlci9UaW1lcjIgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiQ291bnRlci9UaW1lcjIgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogc3dpdGNoKGRhdGFbMV0pICovCiAJCWJyZWFrOwpAQCAtMjA5NiwxMyArMTY1Nyw5IEBACiAJCQkJZWxzZSB7CiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhFNDsJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXJXYXRjaGRvZ0ludGVycnVwdD09MSkgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFN0YXJ0cyBXYXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCWlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAxOwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjExMiwyMCArMTY2OSwxNyBAQAogCiAJCQl9CS8qICBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzaW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkJCXByaW50aygiXG5XYXRjaGRvZy9Db3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJXYXRjaGRvZy9Db3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIFNUT1A6CiAKLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU3RvcCBXYXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIxNDAsMjMgKzE2OTQsMTcgQEAKIAkJCWNhc2UgMDoJLyogdHJpZ2dlcmluZyBjb3VudGVyIDMgKi8KIAkJCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdCA9PSAxKSB7CiAJCQkJCWlmIChpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkID09IDEpIHsKLQkJCQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJCS8qIFNldCBUcmlnZ2VyIGFuZCBnYXRlICovCi0JCQkJCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg2OwogCQkJCQl9CS8qIGlmKCBpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkPT0xKSAqLwogCQkJCQllbHNlIHsKLQkJCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCQkJCQkJLyogU2V0IFRyaWdnZXIgKi8KLQkJCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCiAJCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4MjsKIAkJCQkJfQkvKiBlbHNlaWYoaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZD09MSkgKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIxNjUsNyArMTcxMyw4IEBACiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCQl9CS8qIGlmKCBpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQlwcmludGsoIlxuQ291bnRlcjMgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJDb3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTIxNzMsOSArMTcyMiw3IEBACiAJCQkJLyogdHJpZ2dlcmluZyBXYXRjaGRvZyAzICovCiAJCQkJaWYgKGlfV2F0Y2hkb2dDb3VudGVyM0luaXQgPT0gMSkgewogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjE4NCw1NSArMTczMSw0MCBAQAogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQkJfQkvKiBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdD09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbldhdGNoZG9nIDMgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJXYXRjaGRvZyAzIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoIlxuV3JvbmcgY2hvaWNlIG9mIHdhdGNoZG9nL2NvdW50ZXIzXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIldyb25nIGNob2ljZSBvZiB3YXRjaGRvZy9jb3VudGVyM1xuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIHN3aXRjaChkYXRhWzJdKSAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogc3dpdGNoKGRhdGFbMV0pICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIGNob2ljZSBmb3IgY291bnRlci93YXRjaGRvZy90aW1lciBkb2VzIG5vdCBleGlzdFxuIik7CisJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJIlRoZSBzcGVjaWZpZWQgY2hvaWNlIGZvciBjb3VudGVyL3dhdGNoZG9nL3RpbWVyIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIHN3aXRjaChkYXRhWzBdKSAqLwogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfUmVhZENvdW50ZXJUaW1lcldhdGNoZG9nICAgICAgICAgICAgICAgIHwKLXwJCQkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyxzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi18ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpOyAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFJlYWQgVGhlIFdhdGNoZG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiAgIHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICA6cG9pbnRlciB0byBzdWJkZXZpY2Ugc3RydWN0dXJlCi18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiAgICAgIDpwb2ludGVyIHRvIGluc24gc3RydWN0dXJlICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgIDogMCAgICAgQ291bnRlcjEvVGltZXIxCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICBDb3VudGVyMi9UaW1lcjIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgIENvdW50ZXIzL1dhdGNoZG9nCi18Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1JlYWRDb3VudGVyVGltZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIFRoZSBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gMCA9IENvdW50ZXIxL1RpbWVyMSwgMSA9ICBDb3VudGVyMi9UaW1lcjIsIDIgPSBDb3VudGVyMy9XYXRjaGRvZworICovCitzdGF0aWMgaW50IGFwY2kxNTAwX3RpbWVyX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlOwpAQCAtMjI0MiwyMyArMTc3NCwxNyBAQAogCQkvKiBSZWFkIGNvdW50ZXIvdGltZXIxICovCiAJCWlmIChpX1RpbWVyQ291bnRlcjFJbml0ID09IDEpIHsKIAkJCWlmIChpX1RpbWVyQ291bnRlcjFFbmFibGVkID09IDEpIHsKLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNldCBSQ0MgYW5kIGdhdGUgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweEM7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjFJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCSAgICAvKioqKioqKioqKioqKioqLwogCQkJCS8qIFNldCBSQ0MgKi8KLQkJICAgIC8qKioqKioqKioqKioqKiovCiAKIAkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4ODsKIAkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyMUluaXQ9PTEpICovCiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIyNjYsOSArMTc5Miw3IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvdW50ZXIgcmVnaXN0ZXIgKGhpZ2gpICovCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SX0NQVF9UTVIxX1ZBTFVFX0hJR0gsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIyODUsNyArMTgwOSw4IEBACiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qIGlmKCBpX1RpbWVyQ291bnRlcjFJbml0PT0xKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaW1lci9Db3VudGVyMSBub3QgY29uZmlndXJlZFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGltZXIvQ291bnRlcjEgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2VpZiggaV9UaW1lckNvdW50ZXIxSW5pdD09MSkgKi8KIAkJYnJlYWs7CkBAIC0yMjkzLDIzICsxODE4LDE3IEBACiAJCS8qIFJlYWQgY291bnRlci90aW1lcjIgKi8KIAkJaWYgKGlfVGltZXJDb3VudGVyMkluaXQgPT0gMSkgewogCQkJaWYgKGlfVGltZXJDb3VudGVyMkVuYWJsZWQgPT0gMSkgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2V0IFJDQyBhbmQgZ2F0ZSAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4QzsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJICAgIC8qKioqKioqKioqKioqKiovCiAJCQkJLyogU2V0IFJDQyAqLwotCQkgICAgLyoqKioqKioqKioqKioqKi8KIAogCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg4OwogCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXIySW5pdD09MSkgKi8KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjMxNyw5ICsxODM2LDcgQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY291bnRlciByZWdpc3RlciAoaGlnaCkgKi8KLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JfQ1BUX1RNUjJfVkFMVUVfSElHSCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjMzNiw3ICsxODUzLDggQEAKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJfQkJLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRpbWVyL0NvdW50ZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaW1lci9Db3VudGVyMiBub3QgY29uZmlndXJlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZWlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQlicmVhazsKQEAgLTIzNDQsMjMgKzE4NjIsMTcgQEAKIAkJLyogUmVhZCBjb3VudGVyL3dhdGNoZG9nMiAqLwogCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdCA9PSAxKSB7CiAJCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZCA9PSAxKSB7Ci0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZXQgUkNDIGFuZCBnYXRlICovCi0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhDOwogCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIySW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkgICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZXQgUkNDICovCi0JCSAgICAvKioqKioqKioqKioqKioqLwogCiAJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDg7CiAJCQl9CS8qIGVsc2VpZihpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMzY4LDkgKzE4ODAsNyBAQAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb3VudGVyIHJlZ2lzdGVyIChoaWdoKSAqLwotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUl9DUFRfVE1SM19WQUxVRV9ISUdILAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMzg3LDEyICsxODk3LDE0IEBACiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qIGlmKCBpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5XYXRjaGRvZ0NvdW50ZXIzIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJXYXRjaGRvZ0NvdW50ZXIzIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlaWYoIGlfV2F0Y2hkb2dDb3VudGVyM0luaXQ9PTEpICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgY2hvaWNlIG9mIHRpbWVyL2NvdW50ZXIvd2F0Y2hkb2cgZG9lcyBub3QgZXhpc3RcbiIpOworCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCSJUaGUgY2hvaWNlIG9mIHRpbWVyL2NvdW50ZXIvd2F0Y2hkb2cgZG9lcyBub3QgZXhpc3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogc3dpdGNoKGRhdGFbMF0pICovCiAKQEAgLTI0MDAsMzEgKzE5MTIsMTUgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCAgaV9BUENJMTUwMF9SZWFkSW50ZXJydXB0TWFzayAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotfCAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkIHRoZSBpbnRlcnJ1cHQgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogICBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgIHwKLQotCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQlkYXRhWzBdOlRoZSBpbnRlcnJ1cHQgbWFzayB2YWx1ZQkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV06Q2hhbm5lbCBubwotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1JlYWRJbnRlcnJ1cHRNYXNrKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWQgdGhlIGludGVycnVwdCBtYXNrCisgKgorICogZGF0YVswXSBUaGUgaW50ZXJydXB0IG1hc2sgdmFsdWUKKyAqIGRhdGFbMV0gQ2hhbm5lbCBOdW1iZXIKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF90aW1lcl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlkYXRhWzBdID0gaV9JbnRlcnJ1cHRNYXNrOwogCWRhdGFbMV0gPSBpX0lucHV0Q2hhbm5lbDsKQEAgLTI0MzMsMzEgKzE5MjksMTIgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCAgaV9BUENJMTUwMF9Db25maWd1cmVJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotfCAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogICBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLXwKLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Db25maWd1cmVJbnRlcnJ1cHQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGFwY2kxNTAwX2RvX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVpX1N0YXR1czsKQEAgLTI0NzQsMTQwICsxOTUxLDEwMSBAQAogCQkJaV9Db25zdGFudCA9IDB4MDA7CiAJCX0JCS8qIGlme2RhdGFbMF09PTApICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBwYXJhbWV0ZXIgcGFzc2VkIHRvIGRyaXZlciBpcyBpbiBlcnJvciBmb3IgZW5hYmxpbmcgdGhlIHZvbHRhZ2UgaW50ZXJydXB0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGUgcGFyYW1ldGVyIHBhc3NlZCB0byBkcml2ZXIgaXMgaW4gZXJyb3IgZm9yIGVuYWJsaW5nIHRoZSB2b2x0YWdlIGludGVycnVwdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZihkYXRhWzBdPT0wKSAqLwogCX0JCQkvKiBlbHNlaWYoZGF0YVswXT09MSkgKi8KIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9SZWdWYWx1ZSA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9TUEVDSUZJQ0FUSU9OLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogV3JpdGVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAoQVBDSTE1MDBfT1IpICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4RjkpIHwgQVBDSTE1MDBfT1I7CiAKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0gICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEF1dGhvcmlzZXMgdGhlIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweEMwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIHBhdHRlcm4gcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX1BPTEFSSVRZLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKGlfQ29uc3RhbnQsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIHRyYW5zaXRpb24gcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fVFJBTlNJVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihpX0NvbnN0YW50LCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgcGF0dGVybiBtYXNrIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX01BU0ssCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoaV9Db25zdGFudCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiBwb3J0IEEgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCW91dGIoaV9SZWdWYWx1ZSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0ICBCICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9SZWdWYWx1ZSA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJb3V0YihpX1JlZ1ZhbHVlLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAxICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAyICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9SZWdWYWx1ZSA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHRpbWVyIDMgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCW91dGIoaV9SZWdWYWx1ZSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBBdXRob3JpemVzIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDB4RDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEVuYWJsZXMgdGhlIFBDSSBpbnRlcnJ1cHQgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRsKDB4MzAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJdWlfU3RhdHVzID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MTApOwogCXVpX1N0YXR1cyA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyAweDM4KTsKQEAgLTI2MTYsMjQgKzIwNTQsNyBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi0vKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogc3RhdGljIHZvaWQgdl9BUENJMTUwMF9JbnRlcnJ1cHQJCQkJCSAgICAgfAotfAkJCQkJICAoaW50IGlycSAsIHZvaWQgKmQpICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogSW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IGludCBpcnEgICAgICAgICAgICAgICAgIDogaXJxIG51bWJlciAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCAgICAgICAgICAgICAgICAgOiB2b2lkIHBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgdm9pZCB2X0FQQ0kxNTAwX0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgYXBjaTE1MDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCiB7CiAKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKQEAgLTI2NDIsNDQgKzIwNjMsMjggQEAKIAlpbnQgaV9SZWdWYWx1ZSA9IDA7CiAJaV9JbnRlcnJ1cHRNYXNrID0gMDsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBSZWFkIHRoZSBib2FyZCBpbnRlcnJ1cHQgc3RhdHVzICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCXVpX0ludGVycnVwdFN0YXR1cyA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyAweDM4KTsKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgaWYgYm9hcmQgZ2VuZXJhdGVkIGEgaW50ZXJydXB0ICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJaWYgKCh1aV9JbnRlcnJ1cHRTdGF0dXMgJiAweDgwMDAwMCkgPT0gMHg4MDAwMDApIHsKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIERpc2FibGUgYWxsIEludGVycnVwdCAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCxkZXZwcml2LT5pb2Jhc2UrQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7ICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIERpc2FibGVzICB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIG91dGIoMHgwMCxkZXZwcml2LT5pb2Jhc2UrQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7ICovCiAKLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiBwb3J0IEEgKi8KLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCQkJb3V0YihpX1JlZ1ZhbHVlLAogCQkJCWRldnByaXYtPmlvYmFzZSArCkBAIC0yNjkzLDkgKzIwOTgsNyBAQAogCQkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGludGVycnVwdCB2ZWN0b3IgcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yNzExLDQ1ICsyMTE0LDMyIEBACiAJCQl9CS8qIGVsc2VpZihpX0xvZ2ljPT1BUENJMTUwMF9PUl9QUklPUklUWSkgKi8KIAkJfQkJLyogIGlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApICovCiAKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpX1JlZ1ZhbHVlID0KIAkJCWluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaWYgKChpX1JlZ1ZhbHVlICYgMHg2MCkgPT0gMHg2MCkgewotCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfQ09NTUFORF9BTkRfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgcG9ydCBCICovCi0JICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJCQlvdXRiKGlfUmVnVmFsdWUsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCXByaW50aygiXG5cblxuIik7Ci0JICAgICAvKioqKioqKioqKioqKioqKi8KIAkJCS8qIFJlYWRzIHBvcnQgQiAqLwotCSAgICAgLyoqKioqKioqKioqKioqKiovCiAJCQlpX1JlZ1ZhbHVlID0KIAkJCQlpbmIoKHVuc2lnbmVkIGludCkgZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9QT1JUX0IpOwogCiAJCQlpX1JlZ1ZhbHVlID0gaV9SZWdWYWx1ZSAmIDB4QzA7Ci0JICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdHMgaWYgdGhpcyBpcyBhbiBleHRlcm5hbCBlcnJvciAqLwotCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaWYgKGlfUmVnVmFsdWUpIHsKIAkJCQkvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAKIAkJCQlpZiAoaV9SZWdWYWx1ZSAmIDB4ODApIHsKQEAgLTI3NjcsNDYgKzIxNTcsMzQgQEAKIAkJCX0JLyogIGlmIChpX1JlZ1ZhbHVlKSAqLwogCQl9CQkvKiBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAxICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAkJCW91dGIoaV9SZWdWYWx1ZSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJaV9JbnRlcnJ1cHRNYXNrID0gaV9JbnRlcnJ1cHRNYXNrIHwgNDsKIAkJfQkJLyogIGlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAyICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAkJCW91dGIoaV9SZWdWYWx1ZSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwpAQCAtMjgxNCwyMyArMjE5MiwxNyBAQAogCQkJaV9JbnRlcnJ1cHRNYXNrID0gaV9JbnRlcnJ1cHRNYXNrIHwgODsKIAkJfQkJLyogIGlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApICovCiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpX1JlZ1ZhbHVlID0KIAkJCWluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaWYgKChpX1JlZ1ZhbHVlICYgMHg2MCkgPT0gMHg2MCkgewotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHRpbWVyIDMgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCQkJb3V0YihpX1JlZ1ZhbHVlLAogCQkJCWRldnByaXYtPmlvYmFzZSArCkBAIC0yODQ0LDQyICsyMjE2LDIzIEBACiAJCX0JCS8qICBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwogCiAJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CS8qICBzZW5kIHNpZ25hbCB0byB0aGUgc2FtcGxlICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogRW5hYmxlIGFsbCBJbnRlcnJ1cHRzICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KIAotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogQXV0aG9yaXplcyB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKDB4RDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCX0JCQkvKiAgIGlmICgodWlfSW50ZXJydXB0U3RhdHVzICYgMHg4MDAwMDApID09IDB4ODAwMDAwKSAqLwogCWVsc2UgewotCQlwcmludGsoIlxuSW50ZXJydXB0IGZyb20gdW5rbm93biBzb3VyY2VcbiIpOworCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCSJJbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZVxuIik7CiAKIAl9CQkJLyogZWxzZSBpZiAoKHVpX0ludGVycnVwdFN0YXR1cyAmIDB4ODAwMDAwKSA9PSAweDgwMDAwMCkgKi8KIAlyZXR1cm47CiB9CiAKLS8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTUwMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDpyZXNldHMgYWxsIHRoZSByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMTUwMF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfRHVtbXlSZWFkID0gMDsKQEAgLTI4OTgsOSArMjI1MSw3IEBACiAJaV9UaW1lckNvdW50ZXIyRW5hYmxlZCA9IDA7CiAJaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZCA9IDA7CiAKLSAgICAvKioqKioqKioqKioqKioqKioqLwogCS8qIFNvZnR3YXJlIHJlc2V0ICovCi0gICAgLyoqKioqKioqKioqKioqKioqKi8KIAlpX0R1bW15UmVhZCA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfRHVtbXlSZWFkID0gaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjkwOCwxNiArMjI1OSwxMiBAQAogCW91dGIoMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweEY0LCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1NQRUNJRklDQVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMHgxMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yOTQ5LDkgKzIyOTYsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweDEwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTI5ODEsOSArMjMyNiw3IEBACiAJLyogRGVsZXRlcyB0aGUgcmVnaXN0ZXIgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGRhdGEgcGF0aCBwb2xhcml0eSByZWdpc3RlciBvZiBwb3J0IEMgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0NfREFUQV9QQ0lUQ0hfUE9MQVJJVFksCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIEhpZ2ggbGV2ZWwgb2YgcG9ydCBDIG1lYW5zIDEgKi8KQEAgLTI5OTgsOSArMjM0MSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgaXQgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0zMDEwLDkgKzIzNTEsNyBAQAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWFjdGl2YXRlcyB0aGUgaW50ZXJydXB0IG1hbmFnZW1lbnQgb2YgdGltZXIgMSAgICAgICAgICovCiAJb3V0YigweEUwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAyICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgSVAgYW5kIElVUyAqLwpAQCAtMzAyMiw5ICsyMzYxLDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgVGltZXIgMiBpbnRlcnJ1cHQgbWFuYWdlbWVudDogICAgICAgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzICovCi0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0zMDM0LDcxICsyMzcxLDQzIEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDM6ICAgICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgYWxsIGludGVycnVwdHMgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIHJlc2V0IGFsbCB0aGUgZGlnaXRhbCBvdXRwdXRzICovCiAJb3V0dygweDAsIGRldnByaXYtPmlfSW9iYXNlQWRkb24gKyBBUENJMTUwMF9ESUdJVEFMX09QKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGlzYWJsZSB0aGUgYm9hcmQgaW50ZXJydXB0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEEgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVhY3RpdmF0ZXMgYWxsIGludGVycnVwdHMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVhY3RpdmF0ZXMgYWxsIGludGVycnVwdHMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWFjdGl2YXRlcyBhbGwgaW50ZXJydXB0cyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDB4MDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDMqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMKaW5kZXggODQ2Njg1NC4uOWM4NmIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYwpAQCAtMSw3NCArMSwzMiBAQAotLyoqCi1AdmVyYmF0aW0KLQotQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCi0KLQlBRERJLURBVEEgR21iSAotCURpZXNlbHN0cmFzc2UgMwotCUQtNzc4MzMgT3R0ZXJzd2VpZXIKLQlUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCi0JRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKLQlodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KLQlpbmZvQGFkZGktZGF0YS5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1AZW5kdmVyYmF0aW0KLSovCiAvKgotCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAoQykgQURESS1EQVRBIEdtYkggICAgICAgICAgRGllc2Vsc3RyYcOfZSAzICAgICAgIEQtNzc4MzMgT3R0ZXJzd2VpZXIgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFRlbCA6ICs0OSAoMCkgNzIyMy85NDkzLTAgICAgIHwgZW1haWwgICAgOiBpbmZvQGFkZGktZGF0YS5jb20gICAgICAgICB8Ci0gIHwgRmF4IDogKzQ5ICgwKSA3MjIzLzk0OTMtOTIgICAgfCBJbnRlcm5ldCA6IGh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbSAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgICAgIDogQVBDSS0xNTY0ICAgICAgIHwgQ29tcGlsZXIgICA6IEdDQyAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgTW9kdWxlIG5hbWUgOiBod2Rydl9hcGNpMTU2NC5jfCBWZXJzaW9uICAgIDogMi45NiAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgbWFuYWdlcjogRXJpYyBTdG9seiAgIHwgRGF0ZSAgICAgICA6ICAwMi8xMi8yMDAyICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBEZXNjcmlwdGlvbiA6ICAgSGFyZHdhcmUgTGF5ZXIgQWNjZXNzIEZvciBBUENJLTE1NjQgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgRGF0ZSAgIHwgICBBdXRob3IgIHwgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdXBkYXRlcyAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotLyoqKioqKioqKiAgICAgIERlZmluaXRpb25zIGZvciBBUENJLTE1NjQgY2FyZCAgKioqKiovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KKyAqCisgKglBRERJLURBVEEgR21iSAorICoJRGllc2Vsc3RyYXNzZSAzCisgKglELTc3ODMzIE90dGVyc3dlaWVyCisgKglUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCisgKglGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgorICoJaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tCisgKglpbmZvQGFkZGktZGF0YS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKi8KIAogI2RlZmluZSBBUENJMTU2NF9BRERSRVNTX1JBTkdFCQkJCTEyOAogCi0vKiBESUdJVEFMIElOUFVULU9VVFBVVCBERUZJTkUgKi8KLS8qIElucHV0IGRlZmluZXMgKi8KLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9JUAkJCQkweDA0Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUxCQk0Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUyCQk4Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRCQkJCTE2Ci0KLS8qIE91dHB1dCBkZWZpbmVzICovCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfT1AJCQkJMHgxOAotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX1JXCQkJCTAKLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQJCQk0Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfT1BfSVJRCQkJCTEyCi0KIC8qIERpZ2l0YWwgSW5wdXQgSVJRIEZ1bmN0aW9uIFNlbGVjdGlvbiAqLwogI2RlZmluZSBBRERJREFUQV9PUgkJCQkJMAogI2RlZmluZSBBRERJREFUQV9BTkQJCQkJCTEKIAotLyogRGlnaXRhbCBJbnB1dCBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX1NUQVRVUwkJMTIKLQotLyogRGlnaXRhbCBPdXRwdXQgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVF9TVEFUVVMJCTgKLQogLyogRGlnaXRhbCBJbnB1dCBJbnRlcnJ1cHQgRW5hYmxlIERpc2FibGUuICovCiAjZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX0VOQUJMRQkJMHg0CiAjZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX0RJU0FCTEUJCTB4ZmZmZmZmZmIKQEAgLTgwLDk4ICszOCw5MSBAQAogI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX0NDX0lOVEVSUlVQVF9ESVNBQkxFCTB4ZmZmZmZmZmQKIAogLyogVElNRVIgQ09VTlRFUiBXQVRDSERPRyBERUZJTkVTICovCi0KICNkZWZpbmUgQURESURBVEFfVElNRVIJCQkJCTAKICNkZWZpbmUgQURESURBVEFfQ09VTlRFUgkJCQkxCiAjZGVmaW5lIEFERElEQVRBX1dBVENIRE9HCQkJCTIKLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRwkJCTB4MjgKLSNkZWZpbmUgQVBDSTE1NjRfVElNRVIJCQkJCTB4NDgKLSNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjEJCQkJMHgwCi0jZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIyCQkJCTB4MjAKLSNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjMJCQkJMHg0MAotI2RlZmluZSBBUENJMTU2NF9DT1VOVEVSNAkJCQkweDYwCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19TWU5DX0VOQUJMRURJU0FCTEUJCQkwCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19SRUxPQURfVkFMVUUJCQk0Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19USU1FQkFTRQkJCQk4Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19QUk9HCQkJCTEyCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19UUklHX1NUQVRVUwkJCTE2Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19JUlEJCQkJMjAKLSNkZWZpbmUgQVBDSTE1NjRfVENXX1dBUk5fVElNRVZBTAkJCTI0Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19XQVJOX1RJTUVCQVNFCQkJMjgKKyNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjEJCQkJMAorI2RlZmluZSBBUENJMTU2NF9DT1VOVEVSMgkJCQkxCisjZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIzCQkJCTIKKyNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjQJCQkJMworCisvKgorICogZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjIFJlZ2lzdGVyIE1hcAorICovCisjZGVmaW5lIEFQQ0kxNTY0X0RJX1JFRwkJCQkJMHgwNAorI2RlZmluZSBBUENJMTU2NF9ESV9JTlRfTU9ERTFfUkVHCQkJMHgwOAorI2RlZmluZSBBUENJMTU2NF9ESV9JTlRfTU9ERTJfUkVHCQkJMHgwYworI2RlZmluZSBBUENJMTU2NF9ESV9JTlRfU1RBVFVTX1JFRwkJCTB4MTAKKyNkZWZpbmUgQVBDSTE1NjRfRElfSVJRX1JFRwkJCQkweDE0CisjZGVmaW5lIEFQQ0kxNTY0X0RPX1JFRwkJCQkJMHgxOAorI2RlZmluZSBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcJCQkweDFjCisjZGVmaW5lIEFQQ0kxNTY0X0RPX0lOVF9TVEFUVVNfUkVHCQkJMHgyMAorI2RlZmluZSBBUENJMTU2NF9ET19JUlFfUkVHCQkJCTB4MjQKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19SRUcJCQkJMHgyOAorI2RlZmluZSBBUENJMTU2NF9XRE9HX1JFTE9BRF9SRUcJCQkweDJjCisjZGVmaW5lIEFQQ0kxNTY0X1dET0dfVElNRUJBU0VfUkVHCQkJMHgzMAorI2RlZmluZSBBUENJMTU2NF9XRE9HX0NUUkxfUkVHCQkJCTB4MzQKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19TVEFUVVNfUkVHCQkJMHgzOAorI2RlZmluZSBBUENJMTU2NF9XRE9HX0lSUV9SRUcJCQkJMHgzYworI2RlZmluZSBBUENJMTU2NF9XRE9HX1dBUk5fVElNRVZBTF9SRUcJCQkweDQwCisjZGVmaW5lIEFQQ0kxNTY0X1dET0dfV0FSTl9USU1FQkFTRV9SRUcJCQkweDQ0CisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1JFRwkJCQkweDQ4CisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1JFTE9BRF9SRUcJCQkweDRjCisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1RJTUVCQVNFX1JFRwkJCTB4NTAKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcJCQkJMHg1NAorI2RlZmluZSBBUENJMTU2NF9USU1FUl9TVEFUVVNfUkVHCQkJMHg1OAorI2RlZmluZSBBUENJMTU2NF9USU1FUl9JUlFfUkVHCQkJCTB4NWMKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfV0FSTl9USU1FVkFMX1JFRwkJCTB4NjAKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfV0FSTl9USU1FQkFTRV9SRUcJCTB4NjQKKworLyoKKyAqIGRldnByaXYtPmlvYmFzZSBSZWdpc3RlciBNYXAKKyAqLworI2RlZmluZSBBUENJMTU2NF9UQ1dfUkVHKHgpCQkJCSgweDAwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfUkVMT0FEX1JFRyh4KQkJCSgweDA0ICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfVElNRUJBU0VfUkVHKHgpCQkJKDB4MDggKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyh4KQkJCSgweDBjICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfU1RBVFVTX1JFRyh4KQkJCSgweDEwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfSVJRX1JFRyh4KQkJCQkoMHgxNCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX1dBUk5fVElNRVZBTF9SRUcoeCkJCSgweDE4ICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfV0FSTl9USU1FQkFTRV9SRUcoeCkJCSgweDFjICsgKCh4KSAqIDB4MjApKQogCiAvKiBHbG9iYWwgdmFyaWFibGVzICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHVpX0ludGVycnVwdFN0YXR1c18xNTY0ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWlfSW50ZXJydXB0U3RhdHVzXzE1NjQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHVpX0ludGVycnVwdERhdGEsIHVpX1R5cGU7CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9Db25maWdEaWdpdGFsSW5wdXQgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IENvbmZpZ3VyZXMgdGhlIGRpZ2l0YWwgaW5wdXQgU3ViZGV2aWNlICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICBkYXRhWzBdICAgICAgICAgICAgOiAxIEVuYWJsZSAgRGlnaXRhbCBJbnB1dCBJbnRlcnJ1cHQgfAotfAkJCQkJCQkJICAgMCBEaXNhYmxlIERpZ2l0YWwgSW5wdXQgSW50ZXJydXB0IHwKLXwJCQkgIGRhdGFbMV0gICAgICAgICAgICA6IDAgQURESURBVEEgSW50ZXJydXB0IE9SIExPR0lDCSB8Ci18CQkJCQkJCQkgOiAxIEFERElEQVRBIEludGVycnVwdCBBTkQgTE9HSUMgICAgfAotfAkJCSAgZGF0YVsyXQkJCSA6IEludGVycnVwdCBtYXNrIGZvciB0aGUgbW9kZSAxCSB8Ci18CQkJICBkYXRhWzNdCQkJIDogSW50ZXJydXB0IG1hc2sgZm9yIHRoZSBtb2RlIDIJIHwKLXwJCQkJCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIGlucHV0IFN1YmRldmljZQorICoKKyAqIGRhdGFbMF0gMSA9IEVuYWJsZSBpbnRlcnJ1cHQsIDAgPSBEaXNhYmxlIGludGVycnVwdAorICogZGF0YVsxXSAwID0gQURESURBVEEgSW50ZXJydXB0IE9SIExPR0lDLCAxID0gQURESURBVEEgSW50ZXJydXB0IEFORCBMT0dJQworICogZGF0YVsyXSBJbnRlcnJ1cHQgbWFzayBmb3IgdGhlIG1vZGUgMQorICogZGF0YVszXSBJbnRlcnJ1cHQgbWFzayBmb3IgdGhlIG1vZGUgMgorICovCitzdGF0aWMgaW50IGFwY2kxNTY0X2RpX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCWRldnByaXYtPnRza19DdXJyZW50ID0gY3VycmVudDsKLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJLyogU2V0IHRoZSBkaWdpdGFsIGlucHV0IGxvZ2ljICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlpZiAoZGF0YVswXSA9PSBBRERJREFUQV9FTkFCTEUpIHsKIAkJZGF0YVsyXSA9IGRhdGFbMl0gPDwgNDsKIAkJZGF0YVszXSA9IGRhdGFbM10gPDwgNDsKLQkJb3V0bChkYXRhWzJdLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMSk7Ci0JCW91dGwoZGF0YVszXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JTlRFUlJVUFRfTU9ERTIpOwotCQlpZiAoZGF0YVsxXSA9PSBBRERJREFUQV9PUikgewotCQkJb3V0bCgweDQsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOwotCQl9CQkvKiAgaWYgIChkYXRhWzFdID09IEFERElEQVRBX09SKSAqLwotCQllbHNlIHsKLQkJCW91dGwoMHg2LAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsKLQkJfQkJLyogIGVsc2UgaWYgIChkYXRhWzFdID09IEFERElEQVRBX09SKSAqLwotCX0JCQkvKiAgaWYgIChkYXRhWzBdID09IEFERElEQVRBX0VOQUJMRSkgKi8KLQllbHNlIHsKLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUxKTsKLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUyKTsKLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdID09IEFERElEQVRBX0VOQUJMRSkgKi8KKwkJb3V0bChkYXRhWzJdLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTFfUkVHKTsKKwkJb3V0bChkYXRhWzNdLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTJfUkVHKTsKKwkJaWYgKGRhdGFbMV0gPT0gQURESURBVEFfT1IpCisJCQlvdXRsKDB4NCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CisJCWVsc2UKKwkJCW91dGwoMHg2LCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwl9IGVsc2UgeworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUxX1JFRyk7CisJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTJfUkVHKTsKKwkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lSUV9SRUcpOworCX0KIAogCXJldHVybiBpbnNuLT5uOwogfQpAQCAtMTgzLDQwICsxMzQsMjEgQEAKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0JZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQKTsKKwlkYXRhWzFdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX1JFRyk7CiAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxPdXRwdXQgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyBUaGUgRGlnaXRhbCBPdXRwdXQgU3ViZGV2aWNlLiAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgIDogRGF0YSBQb2ludGVyIGNvbnRhaW5zICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMV0gICAgICAgICAgICA6IDEgRW5hYmxlICBWQ0MgIEludGVycnVwdCAgfAotfAkJCQkJCQkJCQkgICAwIERpc2FibGUgVkNDICBJbnRlcnJ1cHQgIHwKLXwJCQkJCSAgZGF0YVsyXSAgICAgICAgICAgIDogMSBFbmFibGUgIENDICBJbnRlcnJ1cHQgICB8Ci18CQkJCQkJCQkJCSAgIDAgRGlzYWJsZSBDQyAgSW50ZXJydXB0ICAgfAotfAkJCQkJCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1NjRfQ29uZmlnRGlnaXRhbE91dHB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBEaWdpdGFsIE91dHB1dCBTdWJkZXZpY2UuCisgKgorICogZGF0YVsxXSAwID0gRGlzYWJsZSBWQ0MgSW50ZXJydXB0LCAxID0gRW5hYmxlIFZDQyBJbnRlcnJ1cHQKKyAqIGRhdGFbMl0gMCA9IERpc2FibGUgQ0MgSW50ZXJydXB0LCAxID0gRW5hYmxlIENDIEludGVycnVwdAorICovCitzdGF0aWMgaW50IGFwY2kxNTY0X2RvX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZCA9IDA7CkBAIC0yMjUsMzEgKzE1NywyNSBAQAogCQljb21lZGlfZXJyb3IoZGV2LAogCQkJIk5vdCBhIHZhbGlkIERhdGEgISEhICxEYXRhIHNob3VsZCBiZSAxIG9yIDBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CQkJLyogIGlmICAoKGRhdGFbMF0hPTApICYmIChkYXRhWzBdIT0xKSkgKi8KLQlpZiAoZGF0YVswXSkgeworCX0KKworCWlmIChkYXRhWzBdKQogCQlkZXZwcml2LT5iX091dHB1dE1lbW9yeVN0YXR1cyA9IEFERElEQVRBX0VOQUJMRTsKLQl9CQkJLyogIGlmICAoZGF0YVswXSkgKi8KLQllbHNlIHsKKwllbHNlCiAJCWRldnByaXYtPmJfT3V0cHV0TWVtb3J5U3RhdHVzID0gQURESURBVEFfRElTQUJMRTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdKSAqLwotCWlmIChkYXRhWzFdID09IEFERElEQVRBX0VOQUJMRSkgeworCisJaWYgKGRhdGFbMV0gPT0gQURESURBVEFfRU5BQkxFKQogCQl1bF9Db21tYW5kID0gdWxfQ29tbWFuZCB8IDB4MTsKLQl9CQkJLyogIGlmICAoZGF0YVsxXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0JZWxzZSB7CisJZWxzZQogCQl1bF9Db21tYW5kID0gdWxfQ29tbWFuZCAmIDB4RkZGRkZGRkU7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVsxXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0JaWYgKGRhdGFbMl0gPT0gQURESURBVEFfRU5BQkxFKSB7CisKKwlpZiAoZGF0YVsyXSA9PSBBRERJREFUQV9FTkFCTEUpCiAJCXVsX0NvbW1hbmQgPSB1bF9Db21tYW5kIHwgMHgyOwotCX0JCQkvKiAgaWYgIChkYXRhWzJdID09IEFERElEQVRBX0VOQUJMRSkgKi8KLQllbHNlIHsKKwllbHNlCiAJCXVsX0NvbW1hbmQgPSB1bF9Db21tYW5kICYgMHhGRkZGRkZGRDsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzJdID09IEFERElEQVRBX0VOQUJMRSkgKi8KLQlvdXRsKHVsX0NvbW1hbmQsCi0JCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQlBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVCk7Ci0JdWlfSW50ZXJydXB0RGF0YSA9Ci0JCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQpOworCisJb3V0bCh1bF9Db21tYW5kLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcpOworCXVpX0ludGVycnVwdERhdGEgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX0NUUkxfUkVHKTsKIAlkZXZwcml2LT50c2tfQ3VycmVudCA9IGN1cnJlbnQ7CiAJcmV0dXJuIGluc24tPm47CiB9CkBAIC0yNjEsMTIgKzE4NywxMCBAQAogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlzLT5zdGF0ZSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfT1BfUlcpOworCXMtPnN0YXRlID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX1JFRyk7CiAKIAlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpCi0JCW91dGwocy0+c3RhdGUsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9SVyk7CisJCW91dGwocy0+c3RhdGUsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX1JFRyk7CiAKIAlkYXRhWzFdID0gcy0+c3RhdGU7CiAKQEAgLTI3NCwzOSArMTk4LDIwIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9Db25maWdUaW1lckNvdW50ZXJXYXRjaGRvZyAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IENvbmZpZ3VyZXMgVGhlIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdICAgICAgICAgICAgOiAwIENvbmZpZ3VyZSBBcyBUaW1lciAgICAgIHwKLXwJCQkJCQkJCQkJICAgMSBDb25maWd1cmUgQXMgQ291bnRlciAgICB8Ci18CQkJCQkJCQkJCSAgIDIgQ29uZmlndXJlIEFzIFdhdGNoZG9nICAgfAotfAkJCQkJICBkYXRhWzFdICAgICAgICAgICAgOiAxIEVuYWJsZSAgSW50ZXJydXB0ICAgICAgIHwKLXwJCQkJCQkJCQkJICAgMCBEaXNhYmxlIEludGVycnVwdCAJICAgICB8Ci18CQkJCQkgIGRhdGFbMl0gICAgICAgICAgICA6IFRpbWUgVW5pdCAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzNdCQkJIDogUmVsb2FkIFZhbHVlCQkJICAgICB8Ci18CQkJCQkgIGRhdGFbNF0gICAgICAgICAgICA6IFRpbWVyIE1vZGUgICAgICAgICAgICAgCSB8Ci18CQkJCQkgIGRhdGFbNV0JCQkgOiBUaW1lciBDb3VudGVyIFdhdGNoZG9nIE51bWJlcnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gICAgICAgICAgICA6ICBDb3VudGVyIERpcmVjdGlvbgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9Db25maWdUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBUaW1lciwgQ291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gQ29uZmlndXJlIGFzOiAwID0gVGltZXIsIDEgPSBDb3VudGVyLCAyID0gV2F0Y2hkb2cKKyAqIGRhdGFbMV0gMSA9IEVuYWJsZSBJbnRlcnJ1cHQsIDAgPSBEaXNhYmxlIEludGVycnVwdAorICogZGF0YVsyXSBUaW1lIFVuaXQKKyAqIGRhdGFbM10gUmVsb2FkIFZhbHVlCisgKiBkYXRhWzRdIFRpbWVyIE1vZGUKKyAqIGRhdGFbNV0gVGltZXIgQ291bnRlciBXYXRjaGRvZyBOdW1iZXIKKyAqIGRhdGFbNl0gQ291bnRlciBEaXJlY3Rpb24KKyAqLworc3RhdGljIGludCBhcGNpMTU2NF90aW1lcl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTMxNiw4OSArMjIxLDU5IEBACiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfV0FUQ0hET0c7CiAKIAkJLyogRGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1dET0dfQ1RSTF9SRUcpOwogCQkvKiBMb2FkaW5nIHRoZSBSZWxvYWQgdmFsdWUgKi8KLQkJb3V0bChkYXRhWzNdLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQlBUENJMTU2NF9UQ1dfUkVMT0FEX1ZBTFVFKTsKLQl9CQkJLyogIGlmICAoZGF0YVswXT09QURESURBVEFfV0FUQ0hET0cpICovCi0JZWxzZSBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9USU1FUikgeworCQlvdXRsKGRhdGFbM10sIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1dET0dfUkVMT0FEX1JFRyk7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IEFERElEQVRBX1RJTUVSKSB7CiAJCS8qIEZpcnN0IFN0b3AgVGhlIFRpbWVyICovCi0JCXVsX0NvbW1hbmQxID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKIAkJdWxfQ29tbWFuZDEgPSB1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkVVTDsKLQkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CS8qIFN0b3AgVGhlIFRpbWVyICovCisJCS8qIFN0b3AgVGhlIFRpbWVyICovCisJCW91dGwodWxfQ29tbWFuZDEsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKIAogCQlkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9IEFERElEQVRBX1RJTUVSOwogCQlpZiAoZGF0YVsxXSA9PSAxKSB7Ci0JCQlvdXRsKDB4MDIsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBFbmFibGUgVElNRVIgaW50ICYgRElTQUJMRSBBTEwgVEhFIE9USEVSIGludCBTT1VSQ0VTICovCisJCQkvKiBFbmFibGUgVElNRVIgaW50ICYgRElTQUJMRSBBTEwgVEhFIE9USEVSIGludCBTT1VSQ0VTICovCisJCQlvdXRsKDB4MDIsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JUlFfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0lSUV9SRUcpOwogCQkJb3V0bCgweDAsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOworCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIxKSk7CiAJCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJCQlBUENJMTU2NF9ESUdJVEFMX09QX0lSUSk7CisJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKIAkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQkJQVBDSTE1NjRfVENXX0lSUSk7CisJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKTsKIAkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJfQkJLyogIGlmICAoZGF0YVsxXT09MSkgKi8KLQkJZWxzZSB7Ci0JCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CS8qIGRpc2FibGUgVGltZXIgaW50ZXJydXB0ICovCi0JCX0JCS8qICBlbHNlIGlmICAoZGF0YVsxXT09MSkgKi8KKwkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOworCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSBUaW1lciBpbnRlcnJ1cHQgKi8KKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCX0KIAogCQkvKiAgTG9hZGluZyBUaW1lYmFzZSAqLwotCi0JCW91dGwoZGF0YVsyXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19USU1FQkFTRSk7CisJCW91dGwoZGF0YVsyXSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfVElNRUJBU0VfUkVHKTsKIAogCQkvKiBMb2FkaW5nIHRoZSBSZWxvYWQgdmFsdWUgKi8KLQkJb3V0bChkYXRhWzNdLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7CisJCW91dGwoZGF0YVszXSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfUkVMT0FEX1JFRyk7CiAKLQkJdWxfQ29tbWFuZDEgPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJdWxfQ29tbWFuZDEgPQotCQkJKHVsX0NvbW1hbmQxICYgMHhGRkY3MTlFMlVMKSB8IDJVTCA8PCAxM1VMIHwgMHgxMFVMOwotCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArIEFQQ0kxNTY0X1RDV19QUk9HKTsJLyogbW9kZSAyICovCi0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVswXT09QURESURBVEFfVElNRVIpICovCi0JZWxzZSBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9DT1VOVEVSKSB7CisJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKKwkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRjcxOUUyVUwpIHwgMlVMIDw8IDEzVUwgfCAweDEwVUw7CisJCS8qIG1vZGUgMiAqLworCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IEFERElEQVRBX0NPVU5URVIpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwogCQlkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciA9IGRhdGFbNV07CiAKIAkJLyogRmlyc3QgU3RvcCBUaGUgQ291bnRlciAqLwotCQl1bF9Db21tYW5kMSA9Ci0JCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChkYXRhWzVdIC0gMSkgKiAweDIwKSArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkYXRhWzVdIC0gMSkpOwogCQl1bF9Db21tYW5kMSA9IHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRVVMOwotCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBTdG9wIFRoZSBUaW1lciAqLworCQkvKiBTdG9wIFRoZSBUaW1lciAqLworCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoZGF0YVs1XSAtIDEpKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSByZWxvYWQgdmFsdWUgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0JCW91dGwoZGF0YVszXSwKLQkJCWRldnByaXYtPmlvYmFzZSArICgoZGF0YVs1XSAtIDEpICogMHgyMCkgKwotCQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7CisJCW91dGwoZGF0YVszXSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX1JFTE9BRF9SRUcoZGF0YVs1XSAtIDEpKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSBtb2RlIDogICAgICAgICAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBoYXJkd2FyZSAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBjb3VudGVyIG1vZGUgKi8KQEAgLTQwNiw2NSArMjgxLDM2IEBACiAJCS8qIC0gRGlzYWJsZSB0aGUgcmVzZXQgICAgICAgICovCiAJCS8qIC0gRGlzYWJsZSB0aGUgdGltZXIgbW9kZSAgICovCiAJCS8qIC0gRW5hYmxlIHRoZSBjb3VudGVyIG1vZGUgICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCXVsX0NvbW1hbmQxID0KIAkJCSh1bF9Db21tYW5kMSAmIDB4RkZGQzE5RTJVTCkgfCAweDgwMDAwVUwgfAogCQkJKHVuc2lnbmVkIGludCkgKCh1bnNpZ25lZCBpbnQpIGRhdGFbNF0gPDwgMTZVTCk7Ci0JCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CiAKIAkJLyogIEVuYWJsZSBvciBEaXNhYmxlIEludGVycnVwdCAqLwogCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkQpIHwgKGRhdGFbMV0gPDwgMSk7Ci0JCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSBVcC9Eb3duIHNlbGVjdGlvbiAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGQkY5RkZVTCkgfCAoZGF0YVs2XSA8PCAxOCk7Ci0JCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdPT1BRERJREFUQV9DT1VOVEVSKSAqLwotCWVsc2UgewotCQlwcmludGsoIiBJbnZhbGlkIHN1YmRldmljZS4iKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdPT1BRERJREFUQV9XQVRDSERPRykgKi8KKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJfQogCiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFN0YXJ0IC8gU3RvcCBUaGUgU2VsZWN0ZWQgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdICAgICAgICAgICAgOiAwIFRpbWVyICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCQkJCQkJICAgMSBDb3VudGVyICAgICAgICAgICAgICAgICB8Ci18CQkJCQkJCQkJCSAgIDIgV2F0Y2hkb2cgICAgICAgIAkJIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwJCQkJCSAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IDEgU3RhcnQgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJCQkJCQkgICAwIFN0b3AgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgVHJpZ2dlciAgICAgICAgICAgICAJIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXIgKE9ubHkgQ291bnRlcikgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFN0YXJ0IC8gU3RvcCBUaGUgU2VsZWN0ZWQgVGltZXIsIENvdW50ZXIgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdIENvbmZpZ3VyZSBhczogMCA9IFRpbWVyLCAxID0gQ291bnRlciwgMiA9IFdhdGNoZG9nCisgKiBkYXRhWzFdIDAgPSBTdG9wLCAxID0gU3RhcnQsIDIgPSBUcmlnZ2VyIENsZWFyIChPbmx5IENvdW50ZXIpCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1NjRfdGltZXJfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTQ3MiwyMDMgKzMxOCwxMjIgQEAKIAlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKIAkJc3dpdGNoIChkYXRhWzFdKSB7CiAJCWNhc2UgMDoJLyogc3RvcCB0aGUgd2F0Y2hkb2cgKi8KLQkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBkaXNhYmxlIHRoZSB3YXRjaGRvZyAqLworCQkJLyogZGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0NUUkxfUkVHKTsKIAkJCWJyZWFrOwogCQljYXNlIDE6CS8qIHN0YXJ0IHRoZSB3YXRjaGRvZyAqLwotCQkJb3V0bCgweDAwMDEsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsKLQkJCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQlvdXRsKDB4MDAwMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19DVFJMX1JFRyk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgkvKiBTb2Z0d2FyZSB0cmlnZ2VyICovCi0JCQlvdXRsKDB4MDIwMSwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfT1BfV0FUQ0hET0cgKwotCQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCW91dGwoMHgwMjAxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0NUUkxfUkVHKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblNwZWNpZmllZCBmdW5jdGlvbmFsaXR5IGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJTcGVjaWZpZWQgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBleGlzdC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0JCS8qICBzd2l0Y2ggKGRhdGFbMV0pICovCi0JfQkJCS8qICBpZiAgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9XQVRDSERPRykgKi8KKwkJfQorCX0KIAlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfVElNRVIpIHsKIAkJaWYgKGRhdGFbMV0gPT0gMSkgewotCQkJdWxfQ29tbWFuZDEgPQotCQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJQVBDSTE1NjRfVENXX1BST0cpOworCQkJdWxfQ29tbWFuZDEgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOwogCQkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRkZGOUZGVUwpIHwgMHgxVUw7CiAKIAkJCS8qIEVuYWJsZSB0aGUgVGltZXIgKi8KLQkJCW91dGwodWxfQ29tbWFuZDEsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJfQkJLyogIGlmICAoZGF0YVsxXT09MSkgKi8KLQkJZWxzZSBpZiAoZGF0YVsxXSA9PSAwKSB7CisJCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCX0gZWxzZSBpZiAoZGF0YVsxXSA9PSAwKSB7CiAJCQkvKiBTdG9wIFRoZSBUaW1lciAqLwogCi0JCQl1bF9Db21tYW5kMSA9Ci0JCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQl1bF9Db21tYW5kMSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAJCQl1bF9Db21tYW5kMSA9IHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRVVMOwotCQkJb3V0bCh1bF9Db21tYW5kMSwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJQVBDSTE1NjRfVENXX1BST0cpOwotCQl9CQkvKiAgZWxzZSBpZihkYXRhWzFdPT0wKSAqLwotCX0JCQkvKiAgaWYgIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfVElNRVIpICovCisJCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCX0KKwl9CiAJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX0NPVU5URVIpIHsKIAkJdWxfQ29tbWFuZDEgPQotCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLQotCQkJCQkxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1BST0cpOworCQkJaW5sKGRldnByaXYtPmlvYmFzZSArCisJCQkJQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0gMSkpOwogCQlpZiAoZGF0YVsxXSA9PSAxKSB7CiAJCQkvKiBTdGFydCB0aGUgQ291bnRlciBzdWJkZXZpY2UgKi8KIAkJCXVsX0NvbW1hbmQxID0gKHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRlVMKSB8IDB4MVVMOwotCQl9CQkvKiAgaWYgIChkYXRhWzFdID09IDEpICovCi0JCWVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgeworCQl9IGVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgewogCQkJLyogIFN0b3BzIHRoZSBDb3VudGVyIHN1YmRldmljZSAqLwogCQkJdWxfQ29tbWFuZDEgPSAwOwogCi0JCX0JCS8qICBlbHNlIGlmICAoZGF0YVsxXSA9PSAwKSAqLwotCQllbHNlIGlmIChkYXRhWzFdID09IDIpIHsKKwkJfSBlbHNlIGlmIChkYXRhWzFdID09IDIpIHsKIAkJCS8qICBDbGVhcnMgdGhlIENvdW50ZXIgc3ViZGV2aWNlICovCiAJCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkZVTCkgfCAweDQwMDsKLQkJfQkJLyogIGVsc2UgaWYgIChkYXRhWzFdID09IDMpICovCisJCX0KIAkJb3V0bCh1bF9Db21tYW5kMSwKLQkJCWRldnByaXYtPmlvYmFzZSArICgoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLQotCQkJCQkxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1BST0cpOwotCX0JCQkvKiAgaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9DT1VOVEVSKSAqLworCQkJZGV2cHJpdi0+aW9iYXNlICsKKwkJCUFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtIDEpKTsKKwl9CiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9SZWFkVGltZXJDb3VudGVyV2F0Y2hkb2cgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTY0X1JlYWRUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIFRoZSBTZWxlY3RlZCBUaW1lciwgQ291bnRlciBvciBXYXRjaGRvZworICovCitzdGF0aWMgaW50IGFwY2kxNTY0X3RpbWVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKIAogCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykgewogCQkvKiAgU3RvcmVzIHRoZSBzdGF0dXMgb2YgdGhlIFdhdGNoZG9nICovCi0JCWRhdGFbMF0gPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCUFQQ0kxNTY0X1RDV19UUklHX1NUQVRVUykgJiAweDE7Ci0JCWRhdGFbMV0gPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HKTsKLQl9CQkJLyogIGlmICAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGU9PUFERElEQVRBX1dBVENIRE9HKSAqLwotCWVsc2UgaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1RJTUVSKSB7CisJCWRhdGFbMF0gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19TVEFUVVNfUkVHKSAmIDB4MTsKKwkJZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX1JFRyk7CisJfSBlbHNlIGlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9USU1FUikgewogCQkvKiAgU3RvcmVzIHRoZSBzdGF0dXMgb2YgdGhlIFRpbWVyICovCi0JCWRhdGFbMF0gPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19UUklHX1NUQVRVUykgJiAweDE7CisJCWRhdGFbMF0gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfU1RBVFVTX1JFRykgJiAweDE7CiAKIAkJLyogIFN0b3JlcyB0aGUgQWN0dWFsIHZhbHVlIG9mIHRoZSBUaW1lciAqLwotCQlkYXRhWzFdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfVElNRVIpICovCi0JZWxzZSBpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfQ09VTlRFUikgeworCQlkYXRhWzFdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX1JFRyk7CisJfSBlbHNlIGlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9DT1VOVEVSKSB7CiAJCS8qICBSZWFkIHRoZSBDb3VudGVyIEFjdHVhbCBWYWx1ZS4gKi8KIAkJZGF0YVswXSA9Ci0JCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtCi0JCQkJCTEpICogMHgyMCkgKwotCQkJQVBDSTE1NjRfVENXX1NZTkNfRU5BQkxFRElTQUJMRSk7CisJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsKKwkJCQlBUENJMTU2NF9UQ1dfUkVHKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0gMSkpOwogCQl1bF9Db21tYW5kMSA9Ci0JCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtCi0JCQkJCTEpICogMHgyMCkgKyBBUENJMTU2NF9UQ1dfVFJJR19TVEFUVVMpOworCQkJaW5sKGRldnByaXYtPmlvYmFzZSArCisJCQkJQVBDSTE1NjRfVENXX1NUQVRVU19SRUcoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLSAxKSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogR2V0IHRoZSBzb2Z0d2FyZSB0cmlnZ2VyIHN0YXR1cyAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlkYXRhWzFdID0gKHVuc2lnbmVkIGNoYXIpICgodWxfQ29tbWFuZDEgPj4gMSkgJiAxKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBHZXQgdGhlIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCWRhdGFbMl0gPSAodW5zaWduZWQgY2hhcikgKCh1bF9Db21tYW5kMSA+PiAyKSAmIDEpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBHZXQgdGhlIHNvZnR3YXJlIGNsZWFyIHN0YXR1cyAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJZGF0YVszXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHVsX0NvbW1hbmQxID4+IDMpICYgMSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIEdldCB0aGUgb3ZlcmZsb3cgc3RhdHVzICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlkYXRhWzRdID0gKHVuc2lnbmVkIGNoYXIpICgodWxfQ29tbWFuZDEgPj4gMCkgJiAxKTsKLQl9CQkJLyogIGVsc2UgIGlmICAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGU9PUFERElEQVRBX0NPVU5URVIpICovCi0JZWxzZSBpZiAoKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlICE9IEFERElEQVRBX1RJTUVSKQorCX0gZWxzZSBpZiAoKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlICE9IEFERElEQVRBX1RJTUVSKQogCQkmJiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgIT0gQURESURBVEFfV0FUQ0hET0cpCiAJCSYmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSAhPSBBRERJREFUQV9DT1VOVEVSKSkgewotCQlwcmludGsoIlxuIEludmFsaWQgU3ViZGV2aWNlICEhIVxuIik7Ci0JfQkJCS8qICBlbHNlIGlmICgoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUhPUFERElEQVRBX1RJTUVSKSAmJiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUhPUFERElEQVRBX1dBVENIRE9HKSYmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSE9QURESURBVEFfQ09VTlRFUikpICovCisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIFN1YmRldmljZSFcbiIpOworCX0KIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6ICBpbnQgaV9BUENJMTU2NF9SZWFkSW50ZXJydXB0U3RhdHVzICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDpSZWFkcyB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9SZWFkSW50ZXJydXB0U3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWRzIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1NjRfZG9fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJKmRhdGEgPSB1aV9UeXBlOwogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogc3RhdGljIHZvaWQgdl9BUENJMTU2NF9JbnRlcnJ1cHQJCQkJCSAgICAgfAotfAkJCQkJICAoaW50IGlycSAsIHZvaWQgKmQpICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBpbnRlcnJ1cHRpYmxlIGRpZ2l0YWwgaW5wdXRzIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IGludCBpcnEgICAgICAgICAgICAgICAgIDogaXJxIG51bWJlciAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCAgICAgICAgICAgICAgICAgOiB2b2lkIHBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgdm9pZCB2X0FQQ0kxNTY0X0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBpbnRlcnJ1cHRpYmxlIGRpZ2l0YWwgaW5wdXRzCisgKi8KK3N0YXRpYyB2b2lkIGFwY2kxNTY0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQogewogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC02NzcsNzkgKzQ0Miw2MyBAQAogCXVuc2lnbmVkIGludCB1aV9DMSwgdWlfQzIsIHVpX0MzLCB1aV9DNDsKIAl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDIgPSAwOwogCi0JdWlfREkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKSAmIDB4MDE7Ci0JdWlfRE8gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCUFQQ0kxNTY0X0RJR0lUQUxfT1BfSVJRKSAmIDB4MDE7Ci0JdWlfVGltZXIgPQotCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MDE7Ci0JdWlfQzEgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MTsKLQl1aV9DMiA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArCi0JCUFQQ0kxNTY0X1RDV19JUlEpICYgMHgxOwotCXVpX0MzID0gaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJQVBDSTE1NjRfVENXX0lSUSkgJiAweDE7Ci0JdWlfQzQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MTsKKwl1aV9ESSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKSAmIDB4MDE7CisJdWlfRE8gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSVJRX1JFRykgJiAweDAxOworCXVpX1RpbWVyID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0lSUV9SRUcpICYgMHgwMTsKKwl1aV9DMSA9CisJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpICYgMHgxOworCXVpX0MyID0KKwkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSkgJiAweDE7CisJdWlfQzMgPQorCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKSAmIDB4MTsKKwl1aV9DNCA9CisJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpICYgMHgxOwogCWlmICh1aV9ESSA9PSAwICYmIHVpX0RPID09IDAgJiYgdWlfVGltZXIgPT0gMCAmJiB1aV9DMSA9PSAwCiAJCSYmIHVpX0MyID09IDAgJiYgdWlfQzMgPT0gMCAmJiB1aV9DNCA9PSAwKSB7Ci0JCXByaW50aygiXG5JbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZVxuIik7Ci0JfQkJCS8qICBpZih1aV9EST09MCAmJiB1aV9ETz09MCAmJiB1aV9UaW1lcj09MCAmJiB1aV9DMT09MCAmJiB1aV9DMj09MCAmJiB1aV9DMz09MCAmJiB1aV9DND09MCkgKi8KKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludGVycnVwdCBmcm9tIHVua25vd24gc291cmNlLlxuIik7CisJfQogCiAJaWYgKHVpX0RJID09IDEpIHsKLQkJdWlfREkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7Ci0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7CisJCXVpX0RJID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lSUV9SRUcpOworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CiAJCXVpX0ludGVycnVwdFN0YXR1c18xNTY0ID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX1NUQVRVUyk7CisJCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX1NUQVRVU19SRUcpOwogCQl1aV9JbnRlcnJ1cHRTdGF0dXNfMTU2NCA9IHVpX0ludGVycnVwdFN0YXR1c18xNTY0ICYgMFgwMDBGRkZGMDsKLQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsJLyogIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KLQkJb3V0bCh1aV9ESSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwkJLyogc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLworCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOworCQkvKiBlbmFibGUgdGhlIGludGVycnVwdCAqLworCQlvdXRsKHVpX0RJLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1aV9ETyA9PSAxKSB7Ci0JCS8qICBDaGVjayBmb3IgRGlnaXRhbCBPdXRwdXQgaW50ZXJydXB0IFR5cGUgLSAxOiBWY2MgaW50ZXJydXB0IDI6IENDIGludGVycnVwdC4gKi8KLQkJdWlfVHlwZSA9Ci0JCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVF9TVEFUVVMpICYgMHgzOworCQkvKiBDaGVjayBmb3IgRGlnaXRhbCBPdXRwdXQgaW50ZXJydXB0IFR5cGUgKi8KKwkJLyogMTogVkNDIGludGVycnVwdAkJCSAgICovCisJCS8qIDI6IENDIGludGVycnVwdAkJCSAgICovCisJCXVpX1R5cGUgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX1NUQVRVU19SRUcpICYgMHgzOwogCQkvKiBEaXNhYmxlIHRoZSAgSW50ZXJydXB0ICovCi0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVCk7CisJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcpOwogCiAJCS8qIFNlbmRzIHNpZ25hbCB0byB1c2VyIHNwYWNlICovCiAJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7Ci0KLQl9CQkJLyogIGlmICAodWlfRE8pICovCisJfQogCiAJaWYgKHVpX1RpbWVyID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9USU1FUjsKIAkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlKSB7CiAKIAkJCS8qICBEaXNhYmxlIFRpbWVyIEludGVycnVwdCAqLwotCQkJdWxfQ29tbWFuZDIgPQotCQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJCW91dGwoMHgwLAotCQkJICAgICBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCXVsX0NvbW1hbmQyID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAKIAkJCS8qIFNlbmQgYSBzaWduYWwgdG8gZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZSAqLwogCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKIAogCQkJLyogIEVuYWJsZSBUaW1lciBJbnRlcnJ1cHQgKi8KIAotCQkJb3V0bCh1bF9Db21tYW5kMiwKLQkJCSAgICAgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQlvdXRsKHVsX0NvbW1hbmQyLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAJCX0KLQl9LyogaWYgICh1aV9UaW1lciA9PSAxKSAqLwotCisJfQogCiAJaWYgKHVpX0MxID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtNzU3LDIxICs1MDYsMTggQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjEpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMSArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIxKSk7CiAJCX0KLQl9IC8qIGlmICAodWlfQzEgPT0gMSkgKi8KKwl9CiAKIAlpZiAodWlfQzIgPT0gMSkgewogCQlkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9IEFERElEQVRBX0NPVU5URVI7CkBAIC03NzksMjEgKzUyNSwxOCBAQAogCiAJCQkvKiAgRGlzYWJsZSBDb3VudGVyIEludGVycnVwdCAqLwogCQkJdWxfQ29tbWFuZDIgPQotCQkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArCi0JCQkJICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSk7CiAJCQlvdXRsKDB4MCwKLQkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjIgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMikpOwogCiAJCQkvKiBTZW5kIGEgc2lnbmFsIHRvIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UgKi8KIAkJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CiAKIAkJCS8qICBFbmFibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCW91dGwodWxfQ29tbWFuZDIsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKIAkJfQotCX0gLyogIGlmICAoKHVpX0MyID09IDEpICovCisJfQogCiAJaWYgKHVpX0MzID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtODAxLDIxICs1NDQsMTggQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjMgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMykpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSk7CiAJCX0KLQl9CS8qICBpZiAoKHVpX0MzID09IDEpICovCisJfQogCiAJaWYgKHVpX0M0ID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtODIzLDYwICs1NjMsNDUgQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjQpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSNCArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVI0KSk7CiAJCX0KLQl9CS8qICBpZiAodWlfQzQgPT0gMSkgKi8KKwl9CiAJcmV0dXJuOwogfQogCi0vKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1NjRfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6cmVzZXRzIGFsbCB0aGUgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMTU2NF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzICovCi0JaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX1NUQVRVUyk7CS8qIFJlc2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCi0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUxKTsJLyogRGlzYWJsZSB0aGUgYW5kL29yIGludGVycnVwdCAqLwotCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMik7CisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwkvKiBSZXNldCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfU1RBVFVTX1JFRyk7CisJLyogRGlzYWJsZSB0aGUgYW5kL29yIGludGVycnVwdCAqLworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTFfUkVHKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUyX1JFRyk7CiAJZGV2cHJpdi0+Yl9EaWdpdGFsT3V0cHV0UmVnaXN0ZXIgPSAwOwogCXVpX1R5cGUgPSAwOwotCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QKTsJLyogUmVzZXRzIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQpOwkvKiBEaXNhYmxlcyB0aGUgaW50ZXJydXB0LiAqLwotCW91dGwoMHgwLAotCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7Ci0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSKTsKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CisJLyogUmVzZXRzIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fUkVHKTsKKwkvKiBEaXNhYmxlcyB0aGUgaW50ZXJydXB0LiAqLworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcpOworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX1JFTE9BRF9SRUcpOworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9SRUcpOworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKyBBUENJMTU2NF9UQ1dfUFJPRyk7Ci0Jb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsgQVBDSTE1NjRfVENXX1BST0cpOwotCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArIEFQQ0kxNTY0X1RDV19QUk9HKTsKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CisJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpOworCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSk7CisJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCmluZGV4IGJkMDU4NTcuLjcwZThmNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKQEAgLTI0OCwxMCArMjQ4LDEwIEBACiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICovCiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9JbnNuQ29uZmlnQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJY29uc3Qgc3RydWN0IGFkZGlfYm9hcmQgKnRoaXNfYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMzA0LDExICszMDQsMTEgQEAKICAqIElmIHRoZSBsYXN0IGFyZ3VtZW50IG9mIGZ1bmN0aW9uICJjaGVjayJpcyAxIHRoZW4gaXQgb25seSBjaGVja3MKICAqIHRoZSBjaGFubmVsIGxpc3QgaXMgb2sgb3Igbm90LgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfU2V0dXBDaGFubmVsTGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICAgaW50IG5fY2hhbiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKLQkJCQkgICAgICAgY2hhciBjaGVjaykKK3N0YXRpYyBpbnQgYXBjaTMxMjBfc2V0dXBfY2hhbl9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICBpbnQgbl9jaGFuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LAorCQkJCSAgICBjaGFyIGNoZWNrKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGk7CQkvKiAsIGRpZmZlcmVuY2lhbD0wLCBiaXBvbGFyPTA7ICovCkBAIC0zNTgsMTAgKzM1OCwxMCBAQAogICogYXMgcGVyIGNvbmZpZ3VyZWQgaWYgbm8gY29udmVyc2lvbiB0aW1lIGlzIHNldCB1c2VzIGRlZmF1bHQKICAqIGNvbnZlcnNpb24gdGltZSAxMCBtaWNyb3NlYy4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25SZWFkQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBhZGRpX2JvYXJkICp0aGlzX2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTQxNywxMCArNDE3LDcgQEAKIAkJCWludyhkZXZwcml2LT5pb2Jhc2UgKyBBUENJMzEyMF9SRVNFVF9GSUZPKTsKIAogCQkJLyogIEluaXRpYWxpemUgdGhlIHNlcXVlbmNlIGFycmF5ICovCi0KLQkJCS8qIGlmICghaV9BUENJMzEyMF9TZXR1cENoYW5uZWxMaXN0KGRldixzLDEsY2hhbmxpc3QsMCkpICByZXR1cm4gLUVJTlZBTDsgKi8KLQotCQkJaWYgKCFpX0FQQ0kzMTIwX1NldHVwQ2hhbm5lbExpc3QoZGV2LCBzLCAxLAorCQkJaWYgKCFhcGNpMzEyMF9zZXR1cF9jaGFuX2xpc3QoZGV2LCBzLCAxLAogCQkJCQkmaW5zbi0+Y2hhbnNwZWMsIDApKQogCQkJCXJldHVybiAtRUlOVkFMOwogCkBAIC01MTIsNyArNTA5LDcgQEAKIAkJCW91dHcoZGV2cHJpdi0+dXNfT3V0cHV0UmVnaXN0ZXIsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTMxMjBfV1JfQUREUkVTUyk7CiAKLQkJCWlmICghaV9BUENJMzEyMF9TZXR1cENoYW5uZWxMaXN0KGRldiwgcywKKwkJCWlmICghYXBjaTMxMjBfc2V0dXBfY2hhbl9saXN0KGRldiwgcywKIAkJCQkJZGV2cHJpdi0+dWlfQWlOYnJvZkNoYW5uZWxzLAogCQkJCQlkZXZwcml2LT51aV9BaUNoYW5uZWxMaXN0LCAwKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwNiw3ICs2MDMsNyBAQAogCiB9CiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMzEyMF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGk7CkBAIC02NjMsNyArNjYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0V4dHRyaWdFbmFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTMxMjBfZXh0dHJpZ19lbmFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCkBAIC02NzIsNyArNjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0V4dHRyaWdEaXNhYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kzMTIwX2V4dHRyaWdfZGlzYWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKQEAgLTY4MSw4ICs2NzgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMxMjBfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCkBAIC03MDUsNyArNzAyLDcgQEAKIAkgKiBkZXZwcml2LT5pX0lvYmFzZUFtY2MrQU1DQ19PUF9SRUdfTUNTUik7ICBzdG9wIERNQSAqLwogCiAJLyogRGlzYWJsZSBleHQgdHJpZ2dlciAqLwotCWlfQVBDSTMxMjBfRXh0dHJpZ0Rpc2FibGUoZGV2KTsKKwlhcGNpMzEyMF9leHR0cmlnX2Rpc2FibGUoZGV2KTsKIAogCWRldnByaXYtPnVzX091dHB1dFJlZ2lzdGVyID0gMDsKIAkvKiBzdG9wICBjb3VudGVycyAqLwpAQCAtNzI5LDEzICs3MjYsMTMgQEAKIAlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCWRldnByaXYtPmJfSW50ZXJydXB0TW9kZSA9IEFQQ0kzMTIwX0VPQ19NT0RFOwogCWRldnByaXYtPmJfRW9jRW9zSW50ZXJydXB0ID0gQVBDSTMxMjBfRElTQUJMRTsKLQlpX0FQQ0kzMTIwX1Jlc2V0KGRldik7CisJYXBjaTMxMjBfcmVzZXQoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgYWRkaV9ib2FyZCAqdGhpc19ib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCWludCBlcnIgPSAwOwpAQCAtODE4LDkgKzgxNSw5IEBACiAgKiBJZiBETUEgaXMgY29uZmlndXJlZCBkb2VzIERNQSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZG9lcyB0aGUKICAqIGFjcXVpc2l0aW9uIHdpdGggRU9TIGludGVycnVwdC4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0N5Y2xpY0FuYWxvZ0lucHV0KGludCBtb2RlLAotCQkJCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMxMjBfY3ljbGljX2FpKGludCBtb2RlLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCWNvbnN0IHN0cnVjdCBhZGRpX2JvYXJkICp0aGlzX2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTkwNCw3ICs5MDEsNyBAQAogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogSW5pdGlhbGl6ZXMgdGhlIHNlcXVlbmNlIGFycmF5ICovCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAoIWlfQVBDSTMxMjBfU2V0dXBDaGFubmVsTGlzdChkZXYsIHMsIGRldnByaXYtPnVpX0FpTmJyb2ZDaGFubmVscywKKwlpZiAoIWFwY2kzMTIwX3NldHVwX2NoYW5fbGlzdChkZXYsIHMsIGRldnByaXYtPnVpX0FpTmJyb2ZDaGFubmVscywKIAkJCWRldnByaXYtPnB1aV9BaUNoYW5uZWxMaXN0LCAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTk1Nyw3ICs5NTQsNyBAQAogLyoqKiBFTDI0MTAwMyBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaWYgKGRldnByaXYtPmJfRXh0dHJpZ0VuYWJsZSA9PSBBUENJMzEyMF9FTkFCTEUpCi0JCWlfQVBDSTMxMjBfRXh0dHJpZ0VuYWJsZShkZXYpOwkvKiAgYWN0aXZhdGUgRVhUIHRyaWdnZXIgKi8KKwkJYXBjaTMxMjBfZXh0dHJpZ19lbmFibGUoZGV2KTsJLyogIGFjdGl2YXRlIEVYVCB0cmlnZ2VyICovCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSAxOgogCQkvKiAgaW5pdCB0aW1lcjAgaW4gbW9kZSAyICovCkBAIC0xMzMzLDggKzEzMzAsOCBAQAogICogRG9lcyBhc3luY2hyb25vdXMgYWNxdWlzaXRpb24uCiAgKiBEZXRlcm1pbmVzIHRoZSBtb2RlIDEgb3IgMi4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0NvbW1hbmRBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgaW50IGFwY2kzMTIwX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CkBAIC0xMzcxLDcgKzEzNjgsNyBAQAogCiAJCQlkZXZwcml2LT51aV9BaVRpbWVyMCA9IGNtZC0+Y29udmVydF9hcmc7CS8qICB0aW1lciBjb25zdGFudCBpbiBuYW5vIHNlY29uZHMgKi8KIAkJCS8qIHJldHVybiB0aGlzX2JvYXJkLT5haV9jbWQoMSxkZXYscyk7ICovCi0JCQlyZXR1cm4gaV9BUENJMzEyMF9DeWNsaWNBbmFsb2dJbnB1dCgxLCBkZXYsIHMpOworCQkJcmV0dXJuIGFwY2kzMTIwX2N5Y2xpY19haSgxLCBkZXYsIHMpOwogCQl9CiAKIAl9CkBAIC0xMzgxLDcgKzEzNzgsNyBAQAogCQlkZXZwcml2LT51aV9BaVRpbWVyMSA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCWRldnByaXYtPnVpX0FpVGltZXIwID0gY21kLT5jb252ZXJ0X2FyZzsJLyogIHZhcmlhYmxlIGNoYW5nZWQgdGltZXIyIHRvIHRpbWVyMCAqLwogCQkvKiByZXR1cm4gdGhpc19ib2FyZC0+YWlfY21kKDIsZGV2LHMpOyAqLwotCQlyZXR1cm4gaV9BUENJMzEyMF9DeWNsaWNBbmFsb2dJbnB1dCgyLCBkZXYsIHMpOworCQlyZXR1cm4gYXBjaTMxMjBfY3ljbGljX2FpKDIsIGRldiwgcyk7CiAJfQogCXJldHVybiAtMTsKIH0KQEAgLTE0MTAsNyArMTQwNyw3IEBACiAgKiBGb3IgY29udGludW91cyBETUEgaXQgcmVpbml0aWFsaXplcyB0aGUgRE1BIG9wZXJhdGlvbi4KICAqIEZvciBzaW5nbGUgbW9kZSBETUEgaXQgc3RvcCB0aGUgYWNxdWlzaXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIHZfQVBDSTMxMjBfSW50ZXJydXB0RG1hKGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMzEyMF9pbnRlcnJ1cHRfZG1hKGludCBpcnEsIHZvaWQgKmQpCiB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTE0MjksNyArMTQyNiw3IEBACiAJfQogCWlmIChzYW1wbGVzaW5idWYgJiAxKSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJPZGQgY291bnQgb2YgYnl0ZXMgaW4gRE1BIHJpbmchIik7Ci0JCWlfQVBDSTMxMjBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uKGRldiwgcyk7CisJCWFwY2kzMTIwX2NhbmNlbChkZXYsIHMpOwogCQlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCiAJCXJldHVybjsKQEAgLTE1MDAsNyArMTQ5Nyw3IEBACiAJaWYgKCFkZXZwcml2LT5iX0FpQ29udGludW91cykKIAkJaWYgKGRldnByaXYtPnVpX0FpQWN0dWFsU2NhbiA+PSBkZXZwcml2LT51aV9BaU5icm9mU2NhbnMpIHsKIAkJCS8qICBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQlpX0FQQ0kzMTIwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihkZXYsIHMpOworCQkJYXBjaTMxMjBfY2FuY2VsKGRldiwgcyk7CiAJCQlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CkBAIC0xNTY1LDcgKzE1NjIsNyBAQAogICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEVPUyBpbnRlcnJ1cHQuCiAgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgYWNxdWlyZWQgZGF0YShmcm9tIEZJRk8pIHRvIENvbWVkaSBidWZmZXIuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9JbnRlcnJ1cHRIYW5kbGVFb3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTMxMjBfaW50ZXJydXB0X2hhbmRsZV9lb3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKQEAgLTE1NzQsOCArMTU3MSw2IEBACiAKIAluX2NoYW4gPSBkZXZwcml2LT51aV9BaU5icm9mQ2hhbm5lbHM7CiAKLQlzLT5hc3luYy0+ZXZlbnRzID0gMDsKLQogCWZvciAoaSA9IDA7IGkgPCBuX2NoYW47IGkrKykKIAkJZXJyICY9IGNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBpbncoZGV2LT5pb2Jhc2UgKyAwKSk7CiAKQEAgLTE1ODksNyArMTU4NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZfQVBDSTMxMjBfSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMzEyMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMTYxNSw3ICsxNjEwLDcgQEAKIAogCWlmIChkZXZwcml2LT5iX0V4dHRyaWdFbmFibGUgPT0gQVBDSTMxMjBfRU5BQkxFKSB7CiAJCS8qIERpc2FibGUgZXh0IHRyaWdnZXIgKi8KLQkJaV9BUENJMzEyMF9FeHR0cmlnRGlzYWJsZShkZXYpOworCQlhcGNpMzEyMF9leHR0cmlnX2Rpc2FibGUoZGV2KTsKIAkJZGV2cHJpdi0+Yl9FeHR0cmlnRW5hYmxlID0gQVBDSTMxMjBfRElTQUJMRTsKIAl9CiAJLyogY2xlYXIgdGhlIHRpbWVyIDIgaW50ZXJydXB0ICovCkBAIC0xNjU1LDcgKzE2NTAsNyBAQAogCiAJCQlpZiAoZGV2cHJpdi0+Yl9BaUN5Y2xpY0FjcXVpc2l0aW9uID09IEFQQ0kzMTIwX0VOQUJMRSkgewogCQkJCXVpX0NoZWNrID0gMDsKLQkJCQlpX0FQQ0kzMTIwX0ludGVycnVwdEhhbmRsZUVvcyhkZXYpOworCQkJCWFwY2kzMTIwX2ludGVycnVwdF9oYW5kbGVfZW9zKGRldik7CiAJCQkJZGV2cHJpdi0+dWlfQWlBY3R1YWxTY2FuKys7CiAJCQkJZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgPQogCQkJCQlkZXZwcml2LT4KQEAgLTE3MTEsNyArMTcwNiw3IEBACiAJCQkJZGV2LT5pb2Jhc2UgKyBBUENJMzEyMF9XUl9BRERSRVNTKTsKIAogCQkJLyogc3RvcCB0aW1lciAwIGFuZCB0aW1lciAxICovCi0JCQlpX0FQQ0kzMTIwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihkZXYsIHMpOworCQkJYXBjaTMxMjBfY2FuY2VsKGRldiwgcyk7CiAJCQlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCiAJCQkvKiBVUERBVEUtMC43LjU3LT4wLjcuNjhjb21lZGlfZG9uZShkZXYscyk7ICovCkBAIC0xNzY1LDcgKzE3NjAsOCBAQAogCQkJLyogQ2xlYXJzIHRoZSB0aW1lciBzdGF0dXMgcmVnaXN0ZXIgKi8KIAkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpbncoZGV2LT5pb2Jhc2UgKyBBUENJMzEyMF9USU1FUl9TVEFUVVNfUkVHSVNURVIpOwotCQkJdl9BUENJMzEyMF9JbnRlcnJ1cHREbWEoaXJxLCBkKTsJLyogIGRvIHNvbWUgZGF0YSB0cmFuc2ZlciAqLworCQkJLyogZG8gc29tZSBkYXRhIHRyYW5zZmVyICovCisJCQlhcGNpMzEyMF9pbnRlcnJ1cHRfZG1hKGlycSwgZCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBTdG9wcyB0aGUgVGltZXIgKi8KIAkJCW91dHcoZGV2cHJpdi0+CkBAIC0xNzg3LDcgKzE3ODMsNyBAQAogICogZGF0YVsxXSA9IFRpbWVyIGNvbnN0YW50CiAgKiBkYXRhWzJdID0gVGltZXIyIGludGVycnVwdCAoMSllbmFibGUgb3IoMCkgZGlzYWJsZQogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zbkNvbmZpZ1RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGFwY2kzMTIwX2NvbmZpZ19pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTE5MzIsNyArMTkyOCw3IEBACiAgKgkJCSA9IDEgVGltZXIKICAqCQkJID0gMiBXYXRjaCBkb2cKICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25Xcml0ZVRpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGFwY2kzMTIwX3dyaXRlX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMjEwNCw3ICsyMTAwLDcgQEAKICAqIGZvciB3YXRjaGRvZzogZGF0YVswXSA9IDAgKHN0aWxsIHJ1bm5pbmcpCiAgKgkJCSA9IDEgKHJ1biBkb3duKQogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zblJlYWRUaW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorc3RhdGljIGludCBhcGNpMzEyMF9yZWFkX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMjE4OSwxMCArMjE4NSwxMCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zbldyaXRlQW5hbG9nT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMxMjBfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWlfUmFuZ2UsIHVpX0NoYW5uZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKaW5kZXggOGM4NWEwOS4uMDUzNmQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMjAwX1Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kzMjAwX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9UZW1wOwpAQCAtMTMyMiwxMCArMTMyMiwxMCBAQAogICogZGF0YVs3XSA6IENoYW5uZWwgY3VycmVudCBzb3VyY2UgZnJvbSBlZXByb20KICAqIGRhdGFbOF0gOiBDaGFubmxlIGdhaW4gZmFjdG9yIGZyb20gZWVwcm9tCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzIwMF9SZWFkQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgdWlfRHVtbXlWYWx1ZSA9IDA7CiAJaW50IGlfQ29udmVydENKQ0NhbGlicmF0aW9uOwpAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIAlpZiAoc19Cb2FyZEluZm9zW2Rldi0+bWlub3JdLmlfSW5pdGlhbGlzZWQgPT0gMCkKIAkJLyogRU5EIEpLIDA2LjA3LjA0OiBNYW5hZ2VtZW50IG9mIHNldnJhbHMgYm9hcmRzICovCiAJewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBpZihpX0luaXRpYWxpc2VkPT0wKTsgKi8KIApAQCAtMTU4Niw3ICsxNTg2LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKCJcblRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgaW4gZXJyb3JcbiIpOwotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBzd2l0Y2goaW5zbi0+dW51c2VkWzBdKSAqLwogCkBAIC0xNjI2LDEwICsxNjI2LDEwIEBACiAgKgkgICAgPSAyICBSVEQgMyB3aXJlIGNvbm5lY3Rpb24KICAqCSAgICA9IDMgIFJURCA0IHdpcmUgY29ubmVjdGlvbgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfQ29uZmlnQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbmZpZyA9IDAsIHVsX1RlbXAgPSAwOwpAQCAtMTk3MCw3ICsxOTcwLDcgQEAKIAkJfQkJLyogIHN3aXRjaChkYXRhWzExXSkgKi8KIAl9CQkJLyogIGVsc2VpZihkYXRhWzEyXT09MCB8fCBkYXRhWzEyXT09MSkgKi8KIAlpZiAoaV9lcnIpIHsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogaWYoaV9TY2FuVHlwZSE9MSkgKi8KQEAgLTIwNzksNyArMjA3OSw3IEBACiAJCS8qIEVORCBKSyAwNi4wNy4wNDogTWFuYWdlbWVudCBvZiBzZXZyYWxzIGJvYXJkcyAqLwogCiAJCWluc24tPnVudXNlZFswXSA9IDA7Ci0JCWlfQVBDSTMyMDBfUmVhZEFuYWxvZ0lucHV0KGRldiwgcywgaW5zbiwgJnVpX0R1bW15KTsKKwkJYXBjaTMyMDBfYWlfcmVhZChkZXYsIHMsIGluc24sICZ1aV9EdW1teSk7CiAJfQogCiAJcmV0dXJuIGluc24tPm47CkBAIC0yMDk1LDEwICsyMDk1LDEwIEBACiAgKiBkYXRhWzFdIDogY2FsaWJyYXRpb24gb2Zmc2V0CiAgKiBkYXRhWzJdIDogY2FsaWJyYXRpb24gZ2FpbgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfSW5zbkJpdHNfQW5hbG9nSW5wdXRfVGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGFwY2kzMjAwX2FpX2JpdHNfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWlfQ29uZmlndXJhdGlvbiA9IDA7CkBAIC0yMTA3LDEyICsyMTA3LDEyIEBACiAJLyogaWYoaV9Jbml0aWFsaXNlZD09MCkgKi8KIAogCWlmIChzX0JvYXJkSW5mb3NbZGV2LT5taW5vcl0uaV9Jbml0aWFsaXNlZCA9PSAwKSB7Ci0JCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIGlmKGlfSW5pdGlhbGlzZWQ9PTApOyAqLwogCWlmIChkYXRhWzBdICE9IDAgJiYgZGF0YVswXSAhPSAxKSB7CiAJCXByaW50aygiXG5FcnJvciBpbiBzZWxlY3Rpb24gb2YgZnVuY3Rpb25hbGl0eVxuIik7Ci0JCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIGlmKGRhdGFbMF0hPTAgJiYgZGF0YVswXSE9MSkgKi8KIApAQCAtMjIwMiwxOCArMjIwMiwxOCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfSW5zbldyaXRlUmVsZWFzZUFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMyMDBfYWlfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwlhcGNpMzIwMF9yZXNldChkZXYpOwogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfQ29tbWFuZFRlc3RBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCitzdGF0aWMgaW50IGFwY2kzMjAwX2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCiAJaW50IGVyciA9IDA7CkBAIC0yMjQxLDcgKzIyNDEsNyBAQAogCQllcnIgfD0gLUVJTlZBTDsKIAogCWlmIChlcnIpIHsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTIyNjcsNyArMjI2Nyw3IEBACiAJfQogCiAJaWYgKGVycikgewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAyOwogCX0KIAkvKiBpX0ZpcnN0Q2hhbm5lbD1jbWQtPmNoYW5saXN0WzBdOyAqLwpAQCAtMjMwOCw3ICsyMzA4LDcgQEAKIAkJCXByaW50aygiXG5UaGUgRGVsYXkgdGltZSB2YWx1ZSBpcyBpbiBlcnJvclxuIik7CiAJCX0KIAkJaWYgKGVycikgewotCQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJCXJldHVybiAzOwogCQl9CiAJCWZwdV9iZWdpbigpOwpAQCAtMjM2NiwxNSArMjM2NiwxNSBAQAogCX0JCQkvKiBlbHNlIGlmKGNtZC0+c2Nhbl9iZWdpbl9zcmM9PVRSSUdfRk9MTE9XKSAqLwogCiAJaWYgKGVycikgewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiA0OwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMyMDBfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1aV9Db25maWd1cmF0aW9uID0gMDsKQEAgLTI0MTAsOCArMjQxMCw4IEBACiAgKiBEb2VzIGFzeW5jaHJvbm91cyBhY3F1aXNpdGlvbgogICogRGV0ZXJtaW5lcyB0aGUgbW9kZSAxIG9yIDIuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzIwMF9Db21tYW5kQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwpAQCAtMjYxOSw3ICsyNjE5LDYgQEAKIAkJLyogQkVHSU4gSksgMTguMTAuMjAwNDogQVBDSS0zMjAwIERyaXZlciB1cGRhdGUgMC43LjU3IC0+IDAuNy42OCAqLwogCQkvKiBUaGlzIHZhbHVlIGlzIG5vdCB1c2VkICovCiAJCS8qIHVpX0NoYW5uZWxOdW1iZXIgPSBpbmwoZGV2cHJpdi0+aW9iYXNlK3NfQm9hcmRJbmZvcyBbZGV2LT5taW5vcl0uaV9PZmZzZXQgKyAyNCk7ICovCi0JCXMtPmFzeW5jLT5ldmVudHMgPSAwOwogCQkvKiBFTkQgSksgMTguMTAuMjAwNDogQVBDSS0zMjAwIERyaXZlciB1cGRhdGUgMC43LjU3IC0+IDAuNy42OCAqLwogCiAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI3MzAsNyArMjcyOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZfQVBDSTMyMDBfSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMzIwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCmluZGV4IGViYzE1MzQuLjIwZTg5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKQEAgLTE2LDEwICsxNiwxMCBAQAogICoJZGF0YVsyXSA6IFRpbWUgVW5pdAogICoJZGF0YVszXSA6IFJlbG9hZCBWYWx1ZQogICovCi1zdGF0aWMgaW50IGlfQVBDSTM1MDFfQ29uZmlnVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzUwMV9jb25maWdfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTg2LDEwICs4NiwxMCBAQAogICoJCSAgMCBTdG9wCiAgKgkJICAyIFRyaWdnZXIKICAqLwotc3RhdGljIGludCBpX0FQQ0kzNTAxX1N0YXJ0U3RvcFdyaXRlVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzUwMV93cml0ZV9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDEgPSAwOwpAQCAtMTUzLDEwICsxNTMsMTAgQEAKICAqCQkgIDIgV2F0Y2hkb2cKICAqCWRhdGFbMV0gOiBUaW1lciBDb3VudGVyIFdhdGNoZG9nIE51bWJlcgogICovCi1zdGF0aWMgaW50IGlfQVBDSTM1MDFfUmVhZFRpbWVyQ291bnRlcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTM1MDFfcmVhZF9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMDM1LmMKaW5kZXggY2NkNDkyMS4uNGRhOWRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzAzNS5jCkBAIC0yNywxMyArMjcsMTMgQEAKIAkJLmlfVGltZXIJCT0gMSwKIAkJLnVpX01pbkFjcXVpc2l0aW9udGltZU5zID0gMTAwMDAsCiAJCS51aV9NaW5EZWxheXRpbWVOcwk9IDEwMDAwMCwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kwMzVfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTAzNV9SZXNldCwKLQkJLmFpX2NvbmZpZwkJPSBpX0FQQ0kwMzVfQ29uZmlnQW5hbG9nSW5wdXQsCi0JCS5haV9yZWFkCQk9IGlfQVBDSTAzNV9SZWFkQW5hbG9nSW5wdXQsCi0JCS50aW1lcl9jb25maWcJCT0gaV9BUENJMDM1X0NvbmZpZ1RpbWVyV2F0Y2hkb2csCi0JCS50aW1lcl93cml0ZQkJPSBpX0FQQ0kwMzVfU3RhcnRTdG9wV3JpdGVUaW1lcldhdGNoZG9nLAotCQkudGltZXJfcmVhZAkJPSBpX0FQQ0kwMzVfUmVhZFRpbWVyV2F0Y2hkb2csCisJCS5pbnRlcnJ1cHQJCT0gYXBjaTAzNV9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTAzNV9yZXNldCwKKwkJLmFpX2NvbmZpZwkJPSBhcGNpMDM1X2FpX2NvbmZpZywKKwkJLmFpX3JlYWQJCT0gYXBjaTAzNV9haV9yZWFkLAorCQkudGltZXJfY29uZmlnCQk9IGFwY2kwMzVfdGltZXJfY29uZmlnLAorCQkudGltZXJfd3JpdGUJCT0gYXBjaTAzNV90aW1lcl93cml0ZSwKKwkJLnRpbWVyX3JlYWQJCT0gYXBjaTAzNV90aW1lcl9yZWFkLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCmluZGV4IDc0ZjdhY2UuLmJkOGUwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCkBAIC0yMCwxOSArMjAsMTkgQEAKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDE2LAogCQkuaV9Eb01heGRhdGEJCT0gMHhmZmZmLAogCQkuaV9UaW1lcgkJPSAxLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTE1MDBfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTE1MDBfUmVzZXQsCi0JCS5kaV9jb25maWcJCT0gaV9BUENJMTUwMF9Db25maWdEaWdpdGFsSW5wdXRFdmVudCwKLQkJLmRpX3JlYWQJCT0gaV9BUENJMTUwMF9Jbml0aWFsaXNhdGlvbiwKLQkJLmRpX3dyaXRlCQk9IGlfQVBDSTE1MDBfU3RhcnRTdG9wSW5wdXRFdmVudCwKKwkJLmludGVycnVwdAkJPSBhcGNpMTUwMF9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTE1MDBfcmVzZXQsCisJCS5kaV9jb25maWcJCT0gYXBjaTE1MDBfZGlfY29uZmlnLAorCQkuZGlfcmVhZAkJPSBhcGNpMTUwMF9kaV9yZWFkLAorCQkuZGlfd3JpdGUJCT0gYXBjaTE1MDBfZGlfd3JpdGUsCiAJCS5kaV9iaXRzCQk9IGFwY2kxNTAwX2RpX2luc25fYml0cywKLQkJLmRvX2NvbmZpZwkJPSBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxPdXRwdXRFcnJvckludGVycnVwdCwKLQkJLmRvX3dyaXRlCQk9IGlfQVBDSTE1MDBfV3JpdGVEaWdpdGFsT3V0cHV0LAotCQkuZG9fYml0cwkJPSBpX0FQQ0kxNTAwX0NvbmZpZ3VyZUludGVycnVwdCwKLQkJLnRpbWVyX2NvbmZpZwkJPSBpX0FQQ0kxNTAwX0NvbmZpZ0NvdW50ZXJUaW1lcldhdGNoZG9nLAotCQkudGltZXJfd3JpdGUJCT0gaV9BUENJMTUwMF9TdGFydFN0b3BUcmlnZ2VyVGltZXJDb3VudGVyV2F0Y2hkb2csCi0JCS50aW1lcl9yZWFkCQk9IGlfQVBDSTE1MDBfUmVhZEludGVycnVwdE1hc2ssCi0JCS50aW1lcl9iaXRzCQk9IGlfQVBDSTE1MDBfUmVhZENvdW50ZXJUaW1lcldhdGNoZG9nLAorCQkuZG9fY29uZmlnCQk9IGFwY2kxNTAwX2RvX2NvbmZpZywKKwkJLmRvX3dyaXRlCQk9IGFwY2kxNTAwX2RvX3dyaXRlLAorCQkuZG9fYml0cwkJPSBhcGNpMTUwMF9kb19iaXRzLAorCQkudGltZXJfY29uZmlnCQk9IGFwY2kxNTAwX3RpbWVyX2NvbmZpZywKKwkJLnRpbWVyX3dyaXRlCQk9IGFwY2kxNTAwX3RpbWVyX3dyaXRlLAorCQkudGltZXJfcmVhZAkJPSBhcGNpMTUwMF90aW1lcl9yZWFkLAorCQkudGltZXJfYml0cwkJPSBhcGNpMTUwMF90aW1lcl9iaXRzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCmluZGV4IDYyNDgyODQuLjI3YWE5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCkBAIC0yMSwxNiArMjEsMTYgQEAKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDMyLAogCQkuaV9Eb01heGRhdGEJCT0gMHhmZmZmZmZmZiwKIAkJLmlfVGltZXIJCT0gMSwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kxNTY0X0ludGVycnVwdCwKLQkJLnJlc2V0CQkJPSBpX0FQQ0kxNTY0X1Jlc2V0LAotCQkuZGlfY29uZmlnCQk9IGlfQVBDSTE1NjRfQ29uZmlnRGlnaXRhbElucHV0LAorCQkuaW50ZXJydXB0CQk9IGFwY2kxNTY0X2ludGVycnVwdCwKKwkJLnJlc2V0CQkJPSBhcGNpMTU2NF9yZXNldCwKKwkJLmRpX2NvbmZpZwkJPSBhcGNpMTU2NF9kaV9jb25maWcsCiAJCS5kaV9iaXRzCQk9IGFwY2kxNTY0X2RpX2luc25fYml0cywKLQkJLmRvX2NvbmZpZwkJPSBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxPdXRwdXQsCisJCS5kb19jb25maWcJCT0gYXBjaTE1NjRfZG9fY29uZmlnLAogCQkuZG9fYml0cwkJPSBhcGNpMTU2NF9kb19pbnNuX2JpdHMsCi0JCS5kb19yZWFkCQk9IGlfQVBDSTE1NjRfUmVhZEludGVycnVwdFN0YXR1cywKLQkJLnRpbWVyX2NvbmZpZwkJPSBpX0FQQ0kxNTY0X0NvbmZpZ1RpbWVyQ291bnRlcldhdGNoZG9nLAotCQkudGltZXJfd3JpdGUJCT0gaV9BUENJMTU2NF9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nLAotCQkudGltZXJfcmVhZAkJPSBpX0FQQ0kxNTY0X1JlYWRUaW1lckNvdW50ZXJXYXRjaGRvZywKKwkJLmRvX3JlYWQJCT0gYXBjaTE1NjRfZG9fcmVhZCwKKwkJLnRpbWVyX2NvbmZpZwkJPSBhcGNpMTU2NF90aW1lcl9jb25maWcsCisJCS50aW1lcl93cml0ZQkJPSBhcGNpMTU2NF90aW1lcl93cml0ZSwKKwkJLnRpbWVyX3JlYWQJCT0gYXBjaTE1NjRfdGltZXJfcmVhZCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYwppbmRleCAxZTZmYTU2Li41N2VlNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYwpAQCAtMjYsNyArMjYsNyBAQAogCQkuaV9OYnJEaUNoYW5uZWwJCT0gNCwKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDQsCiAJCS5pX0RvTWF4ZGF0YQkJPSAweDBmLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMxMjBfSW50ZXJydXB0LAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMTIwX2ludGVycnVwdCwKIAl9LAogCVtCT0FSRF9BUENJMzAwMV0gPSB7CiAJCS5wY19Ecml2ZXJOYW1lCQk9ICJhcGNpMzAwMSIsCkBAIC0zNyw3ICszNyw3IEBACiAJCS5pX05ickRpQ2hhbm5lbAkJPSA0LAogCQkuaV9OYnJEb0NoYW5uZWwJCT0gNCwKIAkJLmlfRG9NYXhkYXRhCQk9IDB4MGYsCi0JCS5pbnRlcnJ1cHQJCT0gdl9BUENJMzEyMF9JbnRlcnJ1cHQsCisJCS5pbnRlcnJ1cHQJCT0gYXBjaTMxMjBfaW50ZXJydXB0LAogCX0sCiB9OwogCkBAIC0xMzYsMTEgKzEzNiwxMSBAQAogCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPmlfQWlDaGFubmVsTGlzdDsKIAlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hcGNpMzEyMF9haTsKIAotCXMtPmluc25fY29uZmlnID0gaV9BUENJMzEyMF9JbnNuQ29uZmlnQW5hbG9nSW5wdXQ7Ci0Jcy0+aW5zbl9yZWFkID0gaV9BUENJMzEyMF9JbnNuUmVhZEFuYWxvZ0lucHV0OwotCXMtPmRvX2NtZHRlc3QgPSBpX0FQQ0kzMTIwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQ7Ci0Jcy0+ZG9fY21kID0gaV9BUENJMzEyMF9Db21tYW5kQW5hbG9nSW5wdXQ7Ci0Jcy0+Y2FuY2VsID0gaV9BUENJMzEyMF9TdG9wQ3ljbGljQWNxdWlzaXRpb247CisJcy0+aW5zbl9jb25maWcgPSBhcGNpMzEyMF9haV9pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX3JlYWQgPSBhcGNpMzEyMF9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kdGVzdCA9IGFwY2kzMTIwX2FpX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gYXBjaTMxMjBfYWlfY21kOworCXMtPmNhbmNlbCA9IGFwY2kzMTIwX2NhbmNlbDsKIAogCS8qICBBbGxvY2F0ZSBhbmQgSW5pdGlhbGlzZSBBTyBTdWJkZXZpY2UgU3RydWN0dXJlcyAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJCXMtPm1heGRhdGEgPSB0aGlzX2JvYXJkLT5pX0FvTWF4ZGF0YTsKIAkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+aV9OYnJBb0NoYW5uZWw7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FwY2kzMTIwX2FvOwotCQlzLT5pbnNuX3dyaXRlID0gaV9BUENJMzEyMF9JbnNuV3JpdGVBbmFsb2dPdXRwdXQ7CisJCXMtPmluc25fd3JpdGUgPSBhcGNpMzEyMF9hb19pbnNuX3dyaXRlOwogCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQpAQCAtMTg2LDExICsxODYsMTEgQEAKIAlzLT5sZW5fY2hhbmxpc3QgPSAxOwogCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAKLQlzLT5pbnNuX3dyaXRlID0gaV9BUENJMzEyMF9JbnNuV3JpdGVUaW1lcjsKLQlzLT5pbnNuX3JlYWQgPSBpX0FQQ0kzMTIwX0luc25SZWFkVGltZXI7Ci0Jcy0+aW5zbl9jb25maWcgPSBpX0FQQ0kzMTIwX0luc25Db25maWdUaW1lcjsKKwlzLT5pbnNuX3dyaXRlID0gYXBjaTMxMjBfd3JpdGVfaW5zbl90aW1lcjsKKwlzLT5pbnNuX3JlYWQgPSBhcGNpMzEyMF9yZWFkX2luc25fdGltZXI7CisJcy0+aW5zbl9jb25maWcgPSBhcGNpMzEyMF9jb25maWdfaW5zbl90aW1lcjsKIAotCWlfQVBDSTMxMjBfUmVzZXQoZGV2KTsKKwlhcGNpMzEyMF9yZXNldChkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDAsNyArMjAwLDcgQEAKIAogCWlmIChkZXZwcml2KSB7CiAJCWlmIChkZXYtPmlvYmFzZSkKLQkJCWlfQVBDSTMxMjBfUmVzZXQoZGV2KTsKKwkJCWFwY2kzMTIwX3Jlc2V0KGRldik7CiAJCWlmIChkZXYtPmlycSkKIAkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQlpZiAoZGV2cHJpdi0+dWxfRG1hQnVmZmVyVmlydHVhbFswXSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMyMDAuYwppbmRleCA5ODY4YTUzLi5mMGY4OTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMyMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMyMDAuYwpAQCAtNDMsMTUgKzQzLDE1IEBACiAJCS5pX05ickRvQ2hhbm5lbAkJPSA0LAogCQkudWlfTWluQWNxdWlzaXRpb250aW1lTnMgPSAxMDAwMCwKIAkJLnVpX01pbkRlbGF5dGltZU5zCT0gMTAwMDAwLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMyMDBfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTMyMDBfUmVzZXQsCi0JCS5haV9jb25maWcJCT0gaV9BUENJMzIwMF9Db25maWdBbmFsb2dJbnB1dCwKLQkJLmFpX3JlYWQJCT0gaV9BUENJMzIwMF9SZWFkQW5hbG9nSW5wdXQsCi0JCS5haV93cml0ZQkJPSBpX0FQQ0kzMjAwX0luc25Xcml0ZVJlbGVhc2VBbmFsb2dJbnB1dCwKLQkJLmFpX2JpdHMJCT0gaV9BUENJMzIwMF9JbnNuQml0c19BbmFsb2dJbnB1dF9UZXN0LAotCQkuYWlfY21kdGVzdAkJPSBpX0FQQ0kzMjAwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQsCi0JCS5haV9jbWQJCQk9IGlfQVBDSTMyMDBfQ29tbWFuZEFuYWxvZ0lucHV0LAotCQkuYWlfY2FuY2VsCQk9IGlfQVBDSTMyMDBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uLAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMjAwX2ludGVycnVwdCwKKwkJLnJlc2V0CQkJPSBhcGNpMzIwMF9yZXNldCwKKwkJLmFpX2NvbmZpZwkJPSBhcGNpMzIwMF9haV9jb25maWcsCisJCS5haV9yZWFkCQk9IGFwY2kzMjAwX2FpX3JlYWQsCisJCS5haV93cml0ZQkJPSBhcGNpMzIwMF9haV93cml0ZSwKKwkJLmFpX2JpdHMJCT0gYXBjaTMyMDBfYWlfYml0c190ZXN0LAorCQkuYWlfY21kdGVzdAkJPSBhcGNpMzIwMF9haV9jbWR0ZXN0LAorCQkuYWlfY21kCQkJPSBhcGNpMzIwMF9haV9jbWQsCisJCS5haV9jYW5jZWwJCT0gYXBjaTMyMDBfY2FuY2VsLAogCQkuZGlfYml0cwkJPSBhcGNpMzIwMF9kaV9pbnNuX2JpdHMsCiAJCS5kb19iaXRzCQk9IGFwY2kzMjAwX2RvX2luc25fYml0cywKIAl9LApAQCAtNjgsMTUgKzY4LDE1IEBACiAJCS5pX05ickRvQ2hhbm5lbAkJPSA0LAogCQkudWlfTWluQWNxdWlzaXRpb250aW1lTnMgPSAxMDAwMCwKIAkJLnVpX01pbkRlbGF5dGltZU5zCT0gMTAwMDAwLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMyMDBfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTMyMDBfUmVzZXQsCi0JCS5haV9jb25maWcJCT0gaV9BUENJMzIwMF9Db25maWdBbmFsb2dJbnB1dCwKLQkJLmFpX3JlYWQJCT0gaV9BUENJMzIwMF9SZWFkQW5hbG9nSW5wdXQsCi0JCS5haV93cml0ZQkJPSBpX0FQQ0kzMjAwX0luc25Xcml0ZVJlbGVhc2VBbmFsb2dJbnB1dCwKLQkJLmFpX2JpdHMJCT0gaV9BUENJMzIwMF9JbnNuQml0c19BbmFsb2dJbnB1dF9UZXN0LAotCQkuYWlfY21kdGVzdAkJPSBpX0FQQ0kzMjAwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQsCi0JCS5haV9jbWQJCQk9IGlfQVBDSTMyMDBfQ29tbWFuZEFuYWxvZ0lucHV0LAotCQkuYWlfY2FuY2VsCQk9IGlfQVBDSTMyMDBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uLAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMjAwX2ludGVycnVwdCwKKwkJLnJlc2V0CQkJPSBhcGNpMzIwMF9yZXNldCwKKwkJLmFpX2NvbmZpZwkJPSBhcGNpMzIwMF9haV9jb25maWcsCisJCS5haV9yZWFkCQk9IGFwY2kzMjAwX2FpX3JlYWQsCisJCS5haV93cml0ZQkJPSBhcGNpMzIwMF9haV93cml0ZSwKKwkJLmFpX2JpdHMJCT0gYXBjaTMyMDBfYWlfYml0c190ZXN0LAorCQkuYWlfY21kdGVzdAkJPSBhcGNpMzIwMF9haV9jbWR0ZXN0LAorCQkuYWlfY21kCQkJPSBhcGNpMzIwMF9haV9jbWQsCisJCS5haV9jYW5jZWwJCT0gYXBjaTMyMDBfY2FuY2VsLAogCQkuZGlfYml0cwkJPSBhcGNpMzIwMF9kaV9pbnNuX2JpdHMsCiAJCS5kb19iaXRzCQk9IGFwY2kzMjAwX2RvX2luc25fYml0cywKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwppbmRleCA0Y2I2OWVjLi40OWJmMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwpAQCAtMzkwLDkgKzM5MCw5IEBACiAJcy0+bWF4ZGF0YSA9IDA7CiAJcy0+bGVuX2NoYW5saXN0ID0gMTsKIAlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCXMtPmluc25fd3JpdGUgPSBpX0FQQ0kzNTAxX1N0YXJ0U3RvcFdyaXRlVGltZXJDb3VudGVyV2F0Y2hkb2c7Ci0Jcy0+aW5zbl9yZWFkID0gaV9BUENJMzUwMV9SZWFkVGltZXJDb3VudGVyV2F0Y2hkb2c7Ci0Jcy0+aW5zbl9jb25maWcgPSBpX0FQQ0kzNTAxX0NvbmZpZ1RpbWVyQ291bnRlcldhdGNoZG9nOworCXMtPmluc25fd3JpdGUgPSBhcGNpMzUwMV93cml0ZV9pbnNuX3RpbWVyOworCXMtPmluc25fcmVhZCA9IGFwY2kzNTAxX3JlYWRfaW5zbl90aW1lcjsKKwlzLT5pbnNuX2NvbmZpZyA9IGFwY2kzNTAxX2NvbmZpZ19pbnNuX3RpbWVyOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZWVwcm9tIHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYwppbmRleCBjZWFkZjhlLi42ZGMxMWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYwpAQCAtNDM0LDEzICs0MzQsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhcGNpM3h4eF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBhcGNpM3h4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgMjApOworCWlmIChzdGF0dXMgJiAweDEpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYXBjaTN4eHhfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYXBjaTN4eHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgdmFsOwogCWludCByZXQ7CiAJaW50IGk7CiAKQEAgLTQ1MywxMCArNDY2LDkgQEAKIAkJd3JpdGVsKDB4ODAwMDAsIGRldnByaXYtPm1taW8gKyA4KTsKIAogCQkvKiBXYWl0IHRoZSBFT1MgKi8KLQkJZG8gewotCQkJdmFsID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDIwKTsKLQkJCXZhbCAmPSAweDE7Ci0JCX0gd2hpbGUgKCF2YWwpOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGFwY2kzeHh4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIFJlYWQgdGhlIGFuYWxvZyB2YWx1ZSAqLwogCQlkYXRhW2ldID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDI4KTsKQEAgLTYyMiw2ICs2MzQsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhcGNpM3h4eF9hb19lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBhcGNpM3h4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgOTYpOworCWlmIChzdGF0dXMgJiAweDEwMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhcGNpM3h4eF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTYzMCw3ICs2NTYsNyBAQAogCXN0cnVjdCBhcGNpM3h4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IHJldDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKQEAgLTY0MSw5ICs2NjcsOSBAQAogCQl3cml0ZWwoKGRhdGFbaV0gPDwgOCkgfCBjaGFuLCBkZXZwcml2LT5tbWlvICsgMTAwKTsKIAogCQkvKiBXYWl0IHRoZSBlbmQgb2YgdHJhbnNmZXIgKi8KLQkJZG8gewotCQkJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDk2KTsKLQkJfSB3aGlsZSAoKHN0YXR1cyAmIDB4MTAwKSAhPSAweDEwMCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgYXBjaTN4eHhfYW9fZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIGluc24tPm47CkBAIC02ODAsNyArNzA2LDcgQEAKIAkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCWludCByZXQ7CiAKIAkvKgpAQCAtNjg4LDEyICs3MTQsMTMgQEAKIAkgKiBQb3J0IDEgKGNoYW5uZWxzIDgtMTUpIGFyZSBhbHdheXMgb3V0cHV0cwogCSAqIFBvcnQgMiAoY2hhbm5lbHMgMTYtMjMpIGFyZSBwcm9ncmFtbWFibGUgaS9vCiAJICovCi0JaWYgKGNoYW4gPCAxNikgewotCQlpZiAoZGF0YVswXSAhPSBJTlNOX0NPTkZJR19ESU9fUVVFUlkpCisJaWYgKGRhdGFbMF0gIT0gSU5TTl9DT05GSUdfRElPX1FVRVJZKSB7CisJCS8qIGlnbm9yZSBhbGwgb3RoZXIgaW5zdHJ1Y3Rpb25zIGZvciBwb3J0cyAwIGFuZCAxICovCisJCWlmIChjaGFuIDwgMTYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQkvKiBjaGFuZ2luZyBhbnkgY2hhbm5lbCBpbiBwb3J0IDIgY2hhbmdlcyB0aGUgZW50aXJlIHBvcnQgKi8KLQkJbWFzayA9IDB4ZmYwMDAwOworCQllbHNlCisJCQkvKiBjaGFuZ2luZyBhbnkgY2hhbm5lbCBpbiBwb3J0IDIgY2hhbmdlcyB0aGUgZW50aXJlIHBvcnQgKi8KKwkJCW1hc2sgPSAweGZmMDAwMDsKIAl9CiAKIAlyZXQgPSBjb21lZGlfZGlvX2luc25fY29uZmlnKGRldiwgcywgaW5zbiwgZGF0YSwgbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCmluZGV4IDVjMTQxM2EuLjkyMWY2OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCkBAIC03MywxOSArNzMsMTcgQEAKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbUENJNjIwOF9NQVhfQU9fQ0hBTk5FTFNdOwogfTsKIAotc3RhdGljIGludCBwY2k2MjA4X2FvX3dhaXRfZm9yX2RhdGFfc2VuZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjaTYyMDhfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0k2MjA4X0FPX1NUQVRVUyk7Ci0JCWlmICgoc3RhdHVzICYgUENJNjIwOF9BT19TVEFUVVNfREFUQV9TRU5EKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFBDSTYyMDhfQU9fU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIFBDSTYyMDhfQU9fU1RBVFVTX0RBVEFfU0VORCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBwY2k2MjA4X2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTEwMiw4ICsxMDAsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJdmFsID0gZGF0YVtpXTsKIAotCQkvKiBEL0EgdHJhbnNmZXIgcmF0ZSBpcyAyLjJ1cywgd2FpdCB1cCB0byAxMHVzICovCi0JCXJldCA9IHBjaTYyMDhfYW9fd2FpdF9mb3JfZGF0YV9zZW5kKGRldiwgMTApOworCQkvKiBEL0EgdHJhbnNmZXIgcmF0ZSBpcyAyLjJ1cyAqLworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTYyMDhfYW9fZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMKaW5kZXggNmY2MjJiNC4uNWUzY2M3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMKQEAgLTIzOSw5ICsyMzksNiBAQAogCQl9CiAJfQogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZCAoJWQgaW5wdXRzLyVkIG91dHB1dHMpXG4iLAotCQlkZXYtPmJvYXJkX25hbWUsIGJvYXJkLT5kaV9uY2hhbiwgYm9hcmQtPmRvX25jaGFuKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCmluZGV4IDM2M2YyZTQuLmEyOWNlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCkBAIC04NCw3ICs4NCw2IEBACiAKICNkZWZpbmUgUENJOTExMV9SQU5HRV9TRVRUSU5HX0RFTEFZCQkxMAogI2RlZmluZSBQQ0k5MTExX0FJX0lOU1RBTlRfUkVBRF9VREVMQVlfVVMJMgotI2RlZmluZSBQQ0k5MTExX0FJX0lOU1RBTlRfUkVBRF9USU1FT1VUCQkxMDAKIAogLyoKICAqIElPIGFkZHJlc3MgbWFwIGFuZCBiaXQgZGVmaW5lcwpAQCAtNDkwLDI5ICs0ODksMTggQEAKIAkJZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1JBTkdFX1NUQVRfUkVHKTsKIAogCS8qIFNldCBjb3VudGVyICovCi0KLQlzd2l0Y2ggKGFzeW5jX2NtZC0+c3RvcF9zcmMpIHsKLQljYXNlIFRSSUdfQ09VTlQ6CisJaWYgKGFzeW5jX2NtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewogCQlkZXZfcHJpdmF0ZS0+c3RvcF9jb3VudGVyID0KIAkJICAgIGFzeW5jX2NtZC0+c3RvcF9hcmcgKiBhc3luY19jbWQtPmNoYW5saXN0X2xlbjsKIAkJZGV2X3ByaXZhdGUtPnN0b3BfaXNfbm9uZSA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUklHX05PTkU6CisJfSBlbHNlIHsJLyogVFJJR19OT05FICovCiAJCWRldl9wcml2YXRlLT5zdG9wX2NvdW50ZXIgPSAwOwogCQlkZXZfcHJpdmF0ZS0+c3RvcF9pc19ub25lID0gMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQljb21lZGlfZXJyb3IoZGV2LCAiSW52YWxpZCBzdG9wIHRyaWdnZXIiKTsKLQkJcmV0dXJuIC0xOwogCX0KIAogCS8qICBTZXQgdGltZXIgcGFjZXIgKi8KLQogCWRldl9wcml2YXRlLT5zY2FuX2RlbGF5ID0gMDsKLQlzd2l0Y2ggKGFzeW5jX2NtZC0+Y29udmVydF9zcmMpIHsKLQljYXNlIFRSSUdfVElNRVI6CisJaWYgKGFzeW5jX2NtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlwY2k5MTExX3RyaWdnZXJfc291cmNlX3NldChkZXYsIHNvZnR3YXJlKTsKIAkJcGNpOTExMV90aW1lcl9zZXQoZGV2KTsKIAkJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7CkBAIC01MjgsMTEgKzUxNiw3IEBACiAJCQkJIChhc3luY19jbWQtPmNvbnZlcnRfYXJnICoKIAkJCQkgIGFzeW5jX2NtZC0+Y2hhbmxpc3RfbGVuKSkgLSAxOwogCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFRSSUdfRVhUOgotCisJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KIAkJcGNpOTExMV90cmlnZ2VyX3NvdXJjZV9zZXQoZGV2LCBleHRlcm5hbCk7CiAJCXBjaTkxMTFfZmlmb19yZXNldChkZXYpOwogCQlwY2k5MTExX2ludGVycnVwdF9zb3VyY2Vfc2V0KGRldiwgaXJxX29uX2ZpZm9faGFsZl9mdWxsLApAQCAtNTQwLDExICs1MjQsNiBAQAogCQlwbHg5MDUwX2ludGVycnVwdF9jb250cm9sKGRldl9wcml2YXRlLT5sY3JfaW9fYmFzZSwgdHJ1ZSwgdHJ1ZSwKIAkJCQkJICBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CiAKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQljb21lZGlfZXJyb3IoZGV2LCAiSW52YWxpZCBjb252ZXJ0IHRyaWdnZXIiKTsKLQkJcmV0dXJuIC0xOwogCX0KIAogCWRldl9wcml2YXRlLT5zdG9wX2NvdW50ZXIgKj0gKDEgKyBkZXZfcHJpdmF0ZS0+c2Nhbl9kZWxheSk7CkBAIC02MTMsOSArNTkyLDggQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGlycV9mbGFncyk7CiAJCQljb21lZGlfZXJyb3IoZGV2LCBQQ0k5MTExX0RSSVZFUl9OQU1FICIgZmlmbyBvdmVyZmxvdyIpOwogCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfSU5UX0NMUl9SRUcpOwotCQkJcGNpOTExMV9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAogCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQl9CkBAIC02OTMsMjAgKzY3MSwzMSBAQAogCQl9CiAJfQogCi0JaWYgKChkZXZfcHJpdmF0ZS0+c3RvcF9jb3VudGVyID09IDApICYmICghZGV2X3ByaXZhdGUtPnN0b3BfaXNfbm9uZSkpIHsKKwlpZiAoZGV2X3ByaXZhdGUtPnN0b3BfY291bnRlciA9PSAwICYmICFkZXZfcHJpdmF0ZS0+c3RvcF9pc19ub25lKQogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMTFfYWlfY2FuY2VsKGRldiwgcyk7Ci0JfQogCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfSU5UX0NMUl9SRUcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbnQgcGNpOTExMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1JBTkdFX1NUQVRfUkVHKTsKKwlpZiAoc3RhdHVzICYgUENJOTExMV9BSV9TVEFUX0ZGX0VGKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjaTkxMTFfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC03MTcsNyArNzA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gKG1heGRhdGEgKyAxKSA+PiAxOwogCXVuc2lnbmVkIGludCBzaGlmdCA9IChtYXhkYXRhID09IDB4ZmZmZikgPyAwIDogNDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCWludCB0aW1lb3V0OworCWludCByZXQ7CiAJaW50IGk7CiAKIAlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9DSEFOTkVMX1JFRyk7CkBAIC03MzQsMjIgKzcyMywxMiBAQAogCQkvKiBHZW5lcmF0ZSBhIHNvZnR3YXJlIHRyaWdnZXIgKi8KIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfU09GVF9UUklHX1JFRyk7CiAKLQkJdGltZW91dCA9IFBDSTkxMTFfQUlfSU5TVEFOVF9SRUFEX1RJTUVPVVQ7Ci0KLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7Ci0JCQkvKiAnMScgbWVhbnMgRklGTyBpcyBub3QgZW1wdHkgKi8KLQkJCWlmIChzdGF0dXMgJiBQQ0k5MTExX0FJX1NUQVRfRkZfRUYpCi0JCQkJZ290byBjb252ZXJzaW9uX2RvbmU7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNpOTExMV9haV9lb2MsIDApOworCQlpZiAocmV0KSB7CisJCQlwY2k5MTExX2ZpZm9fcmVzZXQoZGV2KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIHJlYWQgdGltZW91dCIpOwotCQlkYXRhW2ldID0gMDsKLQkJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7Ci0JCXJldHVybiAtRVRJTUU7Ci0KLWNvbnZlcnNpb25fZG9uZToKLQogCQlkYXRhW2ldID0gaW53KGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9GSUZPX1JFRyk7CiAJCWRhdGFbaV0gPSAoKGRhdGFbaV0gPj4gc2hpZnQpICYgbWF4ZGF0YSkgXiBpbnZlcnQ7CiAJfQpAQCAtOTA2LDggKzg4NSw2IEBACiAJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKIAlzLT5pbnNuX2JpdHMJPSBwY2k5MTExX2RvX2luc25fYml0czsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwppbmRleCA0YmRkOTcyLi4zY2ZhMTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwpAQCAtNTcxLDEyICs1NzEsMjYgQEAKIAlyZXR1cm4gMTsJCS8qIHdlIGNhbiBzZXJ2ZSB0aGlzIHdpdGggc2NhbiBsb2dpYyAqLwogfQogCitzdGF0aWMgaW50IHBjaTkxMThfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5sKGRldi0+aW9iYXNlICsgUENJOTExOF9BRFNUQVQpOworCWlmIChzdGF0dXMgJiBBZFN0YXR1c19BRHJkeSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBwY2k5MTE4X2luc25fcmVhZF9haShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBwY2k5MTE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIHRpbWVvdXQ7CisJaW50IHJldDsKKwlpbnQgbjsKIAogCWRldnByaXYtPkFkQ29udHJvbFJlZyA9IEFkQ29udHJvbF9JbnQgJiAweGZmOwogCWRldnByaXYtPkFkRnVuY3Rpb25SZWcgPSBBZEZ1bmN0aW9uX1BEVHJnIHwgQWRGdW5jdGlvbl9QRVRyZzsKQEAgLTU5NywxOSArNjExLDEzIEBACiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJOTExOF9TT0ZUVFJHKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLwogCQl1ZGVsYXkoMik7Ci0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmIChpbmwoZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FEU1RBVCkgJiBBZFN0YXR1c19BRHJkeSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQkJdWRlbGF5KDEpOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNpOTExOF9haV9lb2MsIDApOworCQlpZiAocmV0KSB7CisJCQlvdXRsKDAsIGRldi0+aW9iYXNlICsgUENJOTExOF9ERUxGSUZPKTsJLyogZmx1c2ggRklGTyAqLworCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgaW5zbiB0aW1lb3V0Iik7Ci0JCWRhdGFbbl0gPSAwOwotCQlvdXRsKDAsIGRldi0+aW9iYXNlICsgUENJOTExOF9ERUxGSUZPKTsJLyogZmx1c2ggRklGTyAqLwotCQlyZXR1cm4gLUVUSU1FOwotCi1jb252X2ZpbmlzaDoKIAkJaWYgKGRldnByaXYtPmFpMTZiaXRzKSB7CiAJCQlkYXRhW25dID0KIAkJCSAgICAoaW5sKGRldi0+aW9iYXNlICsKQEAgLTkxMSw4ICs5MTksNyBAQAogCX0KIAlpZiAobSAmIGRldnByaXYtPmFpX21hc2toYXJkZXJyKSB7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJcGNpOTExOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtOTQ4LDggKzk1NSw2IEBACiAJc3RydWN0IHBjaTkxMThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBzaG9ydCBzYW1wbDsKIAotCXMtPmFzeW5jLT5ldmVudHMgPSAwOwotCiAJaWYgKGludF9hZHN0YXQgJiBkZXZwcml2LT5haV9tYXNrZXJyKQogCQlpZiAocGNpOTExOF9kZWNvZGVfZXJyb3Jfc3RhdHVzKGRldiwgcywgaW50X2Fkc3RhdCkpCiAJCQlyZXR1cm47CkBAIC05NjUsOCArOTcwLDcgQEAKIAkJCQkgc2FtcGwgJiAweDAwMGYsCiAJCQkJIGRldnByaXYtPmNoYW5saXN0W3MtPmFzeW5jLT5jdXJfY2hhbl0pOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQkJcGNpOTExOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTk3NywxNiArOTgxLDE0IEBACiAJCQkJCQkJLyogb25lIHNjYW4gZG9uZSAqLwogCQlzLT5hc3luYy0+Y3VyX2NoYW4gJT0gZGV2cHJpdi0+YWlfbl9zY2FubGVuOwogCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCQlpZiAoIShkZXZwcml2LT5haV9uZXZlcmVuZGluZykpCi0JCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKLQkJCQkJCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQkJcGNpOTExOF9haV9jYW5jZWwoZGV2LCBzKTsKKwkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykgeworCQkJLyogYWxsIGRhdGEgc2FtcGxlZD8gKi8KKwkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQl9CisJCX0KIAl9CiAKLQlpZiAocy0+YXN5bmMtPmV2ZW50cykKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZXJydXB0X3BjaTkxMThfYWlfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xMDAxLDE2ICsxMDAzLDE0IEBACiAJaWYgKGludF9hbWNjICYgTUFTVEVSX0FCT1JUX0lOVCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiQU1DQyBJUlEgLSBNQVNURVIgRE1BIEFCT1JUISIpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGludF9hbWNjICYgVEFSR0VUX0FCT1JUX0lOVCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiQU1DQyBJUlEgLSBUQVJHRVQgRE1BIEFCT1JUISIpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCWlmIChpbnRfYWRzdGF0ICYgZGV2cHJpdi0+YWlfbWFza2VycikKQEAgLTEwNDgsMTIgKzEwNDgsMTEgQEAKIAkJbSA9IG0gLSBzYW1wbHM7CQkvKiBtPSBob3cgbWFueSBzYW1wbGVzIHdhcyB0cmFuc2ZlcnJlZCAqLwogCX0KIAotCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpCi0JCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewotCQkJCQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7CisJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykgeworCQkvKiBhbGwgZGF0YSBzYW1wbGVkPyAqLworCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpCiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCX0KKwl9CiAKIAlpZiAoZGV2cHJpdi0+ZG1hX2RvdWJsZWJ1ZikgewkvKiBzd2l0Y2ggZG1hIGJ1ZmZlcnMgKi8KIAkJZGV2cHJpdi0+ZG1hX2FjdGJ1ZiA9IDEgLSBkZXZwcml2LT5kbWFfYWN0YnVmOwpAQCAtMTA2Niw3ICsxMDY1LDcgQEAKIAkJCWludGVycnVwdF9wY2k5MTE4X2FpX21vZGU0X3N3aXRjaChkZXYpOwogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNpOTExOChpbnQgaXJxLCB2b2lkICpkKQpAQCAtMTkzNiwyOCArMTkzNSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaTkxMThfcmVwb3J0X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2k5MTE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JY2hhciBpcnFidWZbMzBdOwotCWNoYXIgbXV4YnVmWzMwXTsKLQotCWlmIChpcnEpCi0JCXNucHJpbnRmKGlycWJ1Ziwgc2l6ZW9mKGlycWJ1ZiksICJpcnEgJXUlcyIsIGlycSwKLQkJCSAoZGV2LT5pcnEgPyAiIiA6ICIgVU5BVkFJTEFCTEUiKSk7Ci0JZWxzZQotCQlzbnByaW50ZihpcnFidWYsIHNpemVvZihpcnFidWYpLCAiaXJxIERJU0FCTEVEIik7Ci0JaWYgKGRldnByaXYtPnVzZW11eCkKLQkJc25wcmludGYobXV4YnVmLCBzaXplb2YobXV4YnVmKSwgImV4dCBtdXggJXUgY2hhbnMiLAotCQkJIGRldnByaXYtPnVzZW11eCk7Ci0JZWxzZQotCQlzbnByaW50ZihtdXhidWYsIHNpemVvZihtdXhidWYpLCAibm8gZXh0IG11eCIpOwotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgKHBjaSAlcywgJXMsICVzYnVzIG1hc3RlciwgJXMpIGF0dGFjaGVkXG4iLAotCQkgZGV2LT5ib2FyZF9uYW1lLCBwY2lfbmFtZShwY2lkZXYpLCBpcnFidWYsCi0JCSAoZGV2cHJpdi0+bWFzdGVyID8gIiIgOiAibm8gIiksIG11eGJ1Zik7Ci19Ci0KIHN0YXRpYyBpbnQgcGNpOTExOF9jb21tb25fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBkaXNhYmxlX2lycSwKIAkJCQkgaW50IG1hc3RlciwgaW50IGV4dF9tdXgsIGludCBzb2Z0c3NoZGVsYXksCiAJCQkJIGludCBod19lcnJfbWFzaykKQEAgLTIxMTMsNyArMjA5MCw2IEBACiAJCWJyZWFrOwogCX0KIAotCXBjaTkxMThfcmVwb3J0X2F0dGFjaChkZXYsIGRldi0+aXJxKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jCmluZGV4IDMxOTBlZjcuLmI0ZWEzNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRxMTJiLmMKQEAgLTk0LDggKzk0LDYgQEAKIC8qIG1hc2sgb2YgdGhlIGJpdCBhdCBTVElOUiB0byBjaGVjayBlbmQgb2YgY29udmVyc2lvbiAqLwogI2RlZmluZSBBRFExMkJfRU9DICAgICAweDIwCiAKLSNkZWZpbmUgVElNRU9VVCAgICAgICAgMjAKLQogLyogYXZhaWxhYmxlIHJhbmdlcyB0aHJvdWdoIHRoZSBQR0EgZ2FpbnMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9hZHExMmJfYWlfYmlwb2xhciA9IHsKIAk0LCB7CkBAIC0xMjIsMTkgKzEyMCwyOCBAQAogCWludCBsYXN0X3JhbmdlOwogfTsKIAotLyoKLSAqICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCi0gKiBtb2RlLgotICovCitzdGF0aWMgaW50IGFkcTEyYl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgQURRMTJCX1NUSU5SKTsKKwlpZiAoc3RhdHVzICYgQURRMTJCX0VPQykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KIAogc3RhdGljIGludCBhZHExMmJfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkcTEyYl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBpOworCWludCBuOwogCWludCByYW5nZSwgY2hhbm5lbDsKIAl1bnNpZ25lZCBjaGFyIGhpLCBsbywgc3RhdHVzOworCWludCByZXQ7CiAKIAkvKiBjaGFuZ2UgY2hhbm5lbCBhbmQgcmFuZ2Ugb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJldmlvdXMgKi8KIAlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKQEAgLTE1MSwxMyArMTU4LDkgQEAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAKIAkJLyogd2FpdCBmb3IgZW5kIG9mIGNvbnZlcnNpb24gKi8KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCS8qIHVkZWxheSgxKTsgKi8KLQkJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIEFEUTEyQl9TVElOUik7Ci0JCQlzdGF0dXMgPSBzdGF0dXMgJiBBRFExMkJfRU9DOwotCQl9IHdoaWxlIChzdGF0dXMgPT0gMCAmJiArK2kgPCBUSU1FT1VUKTsKLQkJLyogfSB3aGlsZSAoKytpIDwgMTApOyAqLworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGFkcTEyYl9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJaGkgPSBpbmIoZGV2LT5pb2Jhc2UgKyBBRFExMkJfQURISUcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwppbmRleCBkOWFkMmMwLi4yOGVjNDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwpAQCAtNDI5LDE1ICs0MjksMjYgQEAKIAlvdXR3KGRldnByaXYtPmFpX2V0X011eFZhbCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X01VWCk7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCitzdGF0aWMgaW50IHBjaTE3MXhfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgUENJMTcxeF9TVEFUVVMpOworCWlmICgoc3RhdHVzICYgU3RhdHVzX0ZFKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjaTE3MXhfaW5zbl9yZWFkX2FpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbiwgdGltZW91dDsKKwlpbnQgcmV0OworCWludCBuOwogI2lmZGVmIFBDSTE3MXhfUEFSQU5PSURDSEVDSwogCWNvbnN0IHN0cnVjdCBib2FyZHR5cGUgKnRoaXNfYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAl1bnNpZ25lZCBpbnQgaWRhdGE7CkBAIC00NTMsMTkgKzQ2NCwxNCBAQAogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9TT0ZUVFJHKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCQkvKiB1ZGVsYXkoMSk7ICovCi0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKSAmIFN0YXR1c19GRSkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKLQkJfQotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dCIpOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJGSUZPKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsKLQkJZGF0YVtuXSA9IDA7Ci0JCXJldHVybiAtRVRJTUU7CiAKLWNvbnZfZmluaXNoOgorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTE3MXhfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkgeworCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSRklGTyk7CisJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJJTlQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCiAjaWZkZWYgUENJMTcxeF9QQVJBTk9JRENIRUNLCiAJCWlkYXRhID0gaW53KGRldi0+aW9iYXNlICsgUENJMTcxeF9BRF9EQVRBKTsKIAkJaWYgKHRoaXNfYm9hcmQtPmNhcmR0eXBlICE9IFRZUEVfUENJMTcxMykKQEAgLTc1MywxNyArNzU5LDE1IEBACiAJbSA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKTsKIAlpZiAobSAmIFN0YXR1c19GRSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIEZJRk8gZW1wdHkgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCWlmIChtICYgU3RhdHVzX0ZGKSB7CiAJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCiAJCQkiQS9EIEZJRk8gRnVsbCBzdGF0dXMgKEZhdGFsIEVycm9yISkgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCkBAIC03ODIsMTAgKzc4Niw5IEBACiAJCQkJICAgICAgYWN0X2NoYW5saXN0W3MtPgogCQkJCQkJICAgYXN5bmMtPmN1cl9jaGFuXSAmIDB4ZjAwMCkgPj4KIAkJCQkgICAgIDEyKTsKLQkJCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0KIAkJCQkgICAgQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHNhbXBsICYgMHgwZmZmKTsKQEAgLTgwNCw5ICs4MDcsOCBAQAogCQkJaWYgKCghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpICYmCiAJCQkgICAgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSkgewogCQkJCS8qICBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTgxNCw3ICs4MTYsNyBAQAogCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsJLyogIGNsZWFyIG91ciBJTlQgcmVxdWVzdCAqLwogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogLyoKQEAgLTg0MiwxMCArODQ0LDkgQEAKIAkJCQkJKGRldnByaXYtPmFjdF9jaGFubGlzdFtqXSAmIDB4ZjAwMCkgPj4gMTIsCiAJCQkJCWksIGosIGRldnByaXYtPmFpX2FjdF9zY2FuLCBuLCB0dXJuLAogCQkJCQlzYW1wbCk7Ci0JCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9CiAJCQkJICAgIENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHNhbXBsICYgMHgwZmZmKTsKQEAgLTg3NywxNyArODc4LDE1IEBACiAJbSA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKTsKIAlpZiAoIShtICYgU3RhdHVzX0ZIKSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIEZJRk8gbm90IGhhbGYgZnVsbCEgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCWlmIChtICYgU3RhdHVzX0ZGKSB7CiAJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCiAJCQkiQS9EIEZJRk8gRnVsbCBzdGF0dXMgKEZhdGFsIEVycm9yISkgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCkBAIC05MDcsMTQgKzkwNiwxMyBAQAogCWlmICghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpCiAJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgeyAvKiBhbGwgZGF0YQogCQkJCQkJCQkgICAgc2FtcGxlZCAqLwotCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCXJldHVybjsKIAkJfQogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUklOVCk7CS8qICBjbGVhciBvdXIgSU5UIHJlcXVlc3QgKi8KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIC8qCkBAIC0xMzU0LDkgKzEzNTIsNiBAQAogCQlzdWJkZXYrKzsKIAl9CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkLCBpcnEgJXNhYmxlZFxuIiwKLQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYtPmlycSA/ICJlbiIgOiAiZGlzIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYwppbmRleCA3MjM5NDI2Li4wN2IxMDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYwpAQCAtMjgwLDggKzI4MCw2IEBACiAKIAlwY2kxNzIzX3Jlc2V0KGRldik7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKaW5kZXggZDRiZDYxZC4uMmQ5NjZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKQEAgLTExMzAsMTAgKzExMzAsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0RJT19TVUJERVZHOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCB0aGlzX2JvYXJkLT5zZGlvW2ldLnJlZ3M7IGorKykgewogCQkJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKLQkJCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLAotCQkJCQkgZGV2LT5pb2Jhc2UgKwotCQkJCQkgdGhpc19ib2FyZC0+c2Rpb1tpXS5hZGRyICsKLQkJCQkJIFNJWkVfODI1NSAqIGopOworCQkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsCisJCQkJCSAgICAgICBkZXYtPmlvYmFzZSArCisJCQkJCSAgICAgICB0aGlzX2JvYXJkLT5zZGlvW2ldLmFkZHIgKworCQkJCQkgICAgICAgU0laRV84MjU1ICogaik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAJCQlzdWJkZXYrKzsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9fYWlvMTJfOC5jCmluZGV4IDY4YzNmYjMuLjMyNDc0NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9fYWlvMTJfOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9fYWlvMTJfOC5jCkBAIC0xMDEsMTQgKzEwMSwyNyBAQAogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1s0XTsKIH07CiAKK3N0YXRpYyBpbnQgYWlvX2FpbzEyXzhfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgQUlPMTJfOF9TVEFUVVNfUkVHKTsKKwlpZiAoc3RhdHVzICYgQUlPMTJfOF9TVEFUVVNfQURDX0VPQykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhaW9fYWlvMTJfOF9haV9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisJaW50IHJldDsKIAlpbnQgbjsKIAogCS8qCkBAIC0xMjIsMjAgKzEzNSwxMyBAQAogCWluYihkZXYtPmlvYmFzZSArIEFJTzEyXzhfU1RBVFVTX1JFRyk7CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCWludCB0aW1lb3V0ID0gNTsKLQogCQkvKiAgU2V0dXAgYW5kIHN0YXJ0IGNvbnZlcnNpb24gKi8KIAkJb3V0Yihjb250cm9sLCBkZXYtPmlvYmFzZSArIEFJTzEyXzhfQURDX1JFRyk7CiAKIAkJLyogIFdhaXQgZm9yIGNvbnZlcnNpb24gdG8gY29tcGxldGUgKi8KLQkJZG8gewotCQkJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgQUlPMTJfOF9TVEFUVVNfUkVHKTsKLQkJCXRpbWVvdXQtLTsKLQkJCWlmICh0aW1lb3V0ID09IDApIHsKLQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiQURDIHRpbWVvdXRcbiIpOwotCQkJCXJldHVybiAtRVRJTUVET1VUOwotCQkJfQotCQl9IHdoaWxlICghKHZhbCAmIEFJTzEyXzhfU1RBVFVTX0FEQ19FT0MpKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBhaW9fYWlvMTJfOF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlkYXRhW25dID0gaW53KGRldi0+aW9iYXNlICsgQUlPMTJfOF9BRENfUkVHKSAmIHMtPm1heGRhdGE7CiAJfQpAQCAtMjQ3LDkgKzI1Myw2IEBACiAJLyogODI1NCBjb3VudGVyL3RpbWVyIHN1YmRldmljZSAqLwogCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfVU5VU0VEOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMgYXR0YWNoZWRcbiIsCi0JCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCmluZGV4IDIyYjNkZGEuLjc4MTEwNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCkBAIC05OCw3ICs5OCw3IEBACiAJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKIAlzLT5pbnNuX2JpdHMgPSBhaW9faWlyb18xNl9kaW9faW5zbl9iaXRzX3JlYWQ7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGFpb19paXJvXzE2X2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX2NvbW1vbi5jCmluZGV4IDljOTU1OWYuLjgxOGEwZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9jb21tb24uYwpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKIAkJCQkgIndhcm5pbmchIGlycSAldSB1bmF2YWlsYWJsZSFcbiIsIGlycSk7CiAJCX0KIAl9Ci0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJhdHRhY2hlZFxuIik7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFtcGxjX2RpbzIwMF9jb21tb25fYXR0YWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMKaW5kZXggMzE3MzRlMS4uYjIxZDdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMKQEAgLTM2OCwzMiArMzY4LDYgQEAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAotc3RhdGljIHZvaWQgcGMyMzZfcmVwb3J0X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQotewotCWNvbnN0IHN0cnVjdCBwYzIzNl9ib2FyZCAqdGhpc2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JY2hhciB0bXBidWZbNjBdOwotCWludCB0bXBsZW47Ci0KLQlpZiAoaXNfaXNhX2JvYXJkKHRoaXNib2FyZCkpCi0JCXRtcGxlbiA9IHNjbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLAotCQkJCSAgICIoYmFzZSAlI2x4KSAiLCBkZXYtPmlvYmFzZSk7Ci0JZWxzZSBpZiAoaXNfcGNpX2JvYXJkKHRoaXNib2FyZCkpCi0JCXRtcGxlbiA9IHNjbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLAotCQkJCSAgICIocGNpICVzKSAiLCBwY2lfbmFtZShwY2lkZXYpKTsKLQllbHNlCi0JCXRtcGxlbiA9IDA7Ci0JaWYgKGlycSkKLQkJdG1wbGVuICs9IHNjbnByaW50ZigmdG1wYnVmW3RtcGxlbl0sIHNpemVvZih0bXBidWYpIC0gdG1wbGVuLAotCQkJCSAgICAiKGlycSAldSVzKSAiLCBpcnEsCi0JCQkJICAgIChkZXYtPmlycSA/ICIiIDogIiBVTkFWQUlMQUJMRSIpKTsKLQllbHNlCi0JCXRtcGxlbiArPSBzY25wcmludGYoJnRtcGJ1Zlt0bXBsZW5dLCBzaXplb2YodG1wYnVmKSAtIHRtcGxlbiwKLQkJCQkgICAgIihubyBpcnEpICIpOwotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgJXNhdHRhY2hlZFxuIiwKLQkJIGRldi0+Ym9hcmRfbmFtZSwgdG1wYnVmKTsKLX0KLQogc3RhdGljIGludCBwYzIzNl9jb21tb25fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgaW9iYXNlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGxvbmcgcmVxX2lycV9mbGFncykKIHsKQEAgLTQxMSwxMCArMzg1LDkgQEAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKIAkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKDgyNTUpICovCiAJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGlvYmFzZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImVycm9yISBvdXQgb2YgbWVtb3J5IVxuIik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9CisKIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKIAlkZXYtPnJlYWRfc3ViZGV2ID0gczsKIAlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwpAQCAtNDM0LDggKzQwNyw4IEBACiAJCQlzLT5jYW5jZWwgPSBwYzIzNl9pbnRyX2NhbmNlbDsKIAkJfQogCX0KLQlwYzIzNl9yZXBvcnRfYXR0YWNoKGRldiwgaXJxKTsKLQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBjMjM2X3BjaV9jb21tb25fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCmluZGV4IDViNGI1YWIuLjdjMTBkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCkBAIC05NCw4ICs5NCw2IEBACiAJLyogcmVhZCBpbml0aWFsIHJlbGF5IHN0YXRlICovCiAJcy0+c3RhdGUgPSBpbmIoZGV2LT5pb2Jhc2UpIHwgKGluYihkZXYtPmlvYmFzZSArIDEpIDw8IDgpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyAoYmFzZSAlI2x4KSBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lLAotCQkgZGV2LT5pb2Jhc2UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMKaW5kZXggYWU0MDQ4YS4uMjllMDFlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYwpAQCAtNTMzLDkgKzUzMyw4IEBACiAJc2V0X2JpdChBT19DTURfU1RBUlRFRCwgJmRldnByaXYtPnN0YXRlKTsKIAlpZiAoIWRldnByaXYtPmFvX3N0b3BfY29udGludW91cyAmJiBkZXZwcml2LT5hb19zdG9wX2NvdW50ID09IDApIHsKIAkJLyogQW4gZW1wdHkgYWNxdWlzaXRpb24hICovCi0JCXBjaTIyNF9hb19zdG9wKGRldiwgcyk7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJfSBlbHNlIHsKIAkJLyogRW5hYmxlIGludGVycnVwdHMuICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZwcml2LT5hb19zcGlubG9jaywgZmxhZ3MpOwpAQCAtNTg1LDkgKzU4NCw4IEBACiAJCXJvb20gPSBQQ0kyMjRfRklGT19ST09NX0VNUFRZOwogCQlpZiAoIWRldnByaXYtPmFvX3N0b3BfY29udGludW91cyAmJiBkZXZwcml2LT5hb19zdG9wX2NvdW50ID09IDApIHsKIAkJCS8qIEZJRk8gZW1wdHkgYXQgZW5kIG9mIGNvdW50ZWQgYWNxdWlzaXRpb24uICovCi0JCQlwY2kyMjRfYW9fc3RvcChkZXYsIHMpOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtNjA1LDkgKzYwMyw4IEBACiAJCS8qIEZJRk8gaXMgbGVzcyB0aGFuIGhhbGYtZnVsbC4gKi8KIAkJaWYgKG51bV9zY2FucyA9PSAwKSB7CiAJCQkvKiBOb3RoaW5nIGxlZnQgdG8gcHV0IGluIHRoZSBGSUZPLiAqLwotCQkJcGNpMjI0X2FvX3N0b3AoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkFPIGJ1ZmZlciB1bmRlcnJ1blxuIik7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJfQogCX0KIAkvKiBEZXRlcm1pbmUgaG93IG1hbnkgbmV3IHNjYW5zIGNhbiBiZSBwdXQgaW4gdGhlIEZJRk8uICovCkBAIC02NzAsOSArNjY3LDggQEAKIAkJCQkJICBQQ0kyMjRfREFDQ09OX1RSSUdfTUFTSyk7CiAJCW91dHcoZGV2cHJpdi0+ZGFjY29uLCBkZXYtPmlvYmFzZSArIFBDSTIyNF9EQUNDT04pOwogCX0KLQlpZiAocy0+YXN5bmMtPmV2ZW50cykKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CiAKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiAvKgpAQCAtMTIzNywyMCArMTIzMyw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaTIyNF9yZXBvcnRfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JY2hhciB0bXBidWZbMzBdOwotCi0JaWYgKGlycSkKLQkJc25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwgImlycSAldSVzIiwgaXJxLAotCQkJIChkZXYtPmlycSA/ICIiIDogIiBVTkFWQUlMQUJMRSIpKTsKLQllbHNlCi0JCXNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICJubyBpcnEiKTsKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIChwY2kgJXMpICglcykgYXR0YWNoZWRcbiIsCi0JCSBkZXYtPmJvYXJkX25hbWUsIHBjaV9uYW1lKHBjaWRldiksIHRtcGJ1Zik7Ci19Ci0KIC8qCiAgKiBDb21tb24gcGFydCBvZiBhdHRhY2ggYW5kIGF1dG9fYXR0YWNoLgogICovCkBAIC0xMzk5LDggKzEzODEsNyBAQAogCQl9CiAJfQogCi0JcGNpMjI0X3JlcG9ydF9hdHRhY2goZGV2LCBpcnEpOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBjaTIyNF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCmluZGV4IGMwOGRmYmIuLjk5ZTYwODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKQEAgLTc5OSwxOSArNzk5LDI5IEBACiAJLyogQ291bnRlciBjdCwgODI1NCBtb2RlIDEsIGluaXRpYWwgY291bnQgbm90IHdyaXR0ZW4uICovCiB9CiAKLS8qCi0gKiAgQ09NRURJX1NVQkRfQUkgaW5zdHJ1Y3Rpb247Ci0gKi8KK3N0YXRpYyBpbnQgcGNpMjMwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFBDSTIzMF9BRENDT04pOworCWlmICgoc3RhdHVzICYgUENJMjMwX0FEQ19GSUZPX0VNUFRZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjaTIzMF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpMjMwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IG4sIGk7CisJdW5zaWduZWQgaW50IG47CiAJdW5zaWduZWQgaW50IGNoYW4sIHJhbmdlLCBhcmVmOwogCXVuc2lnbmVkIGludCBnYWluc2hpZnQ7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBzaG9ydCBhZGNjb24sIGFkY2VuOworCWludCByZXQ7CiAKIAkvKiBVbnBhY2sgY2hhbm5lbCBhbmQgcmFuZ2UuICovCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwpAQCAtODgzLDE4ICs4OTMsMTAgQEAKIAkJaTgyNTRfc2V0X21vZGUoZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCAyLAogCQkJICAgICAgIEk4MjU0X01PREUxKTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgVElNRU9VVDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfQURDQ09OKTsKLQkJCWlmICghKHN0YXR1cyAmIFBDSTIzMF9BRENfRklGT19FTVBUWSkpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2kyMzBfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWRhdGFbbl0gPSBwY2kyMzBfYWlfcmVhZChkZXYpOwpAQCAtMjc2MiwxNCArMjc2NCwxNCBAQAogCS8qIGRpZ2l0YWwgaS9vIHN1YmRldmljZSAqLwogCWlmICh0aGlzYm9hcmQtPmhhdmVfZGlvKSB7CiAJCXJjID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsCi0JCQkJICAgICAgKGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMzBfUFBJX1hfQkFTRSkpOwotCQlpZiAocmMgPCAwKQorCQkJCSAgICAgIGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMzBfUFBJX1hfQkFTRSk7CisJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgImF0dGFjaGVkXG4iKTsKLQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBjaTIzMF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jCmluZGV4IGJlMjhlNmMuLjkzZWQwM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjYzLmMKQEAgLTg0LDggKzg0LDYgQEAKIAkvKiByZWFkIGluaXRpYWwgcmVsYXkgc3RhdGUgKi8KIAlzLT5zdGF0ZSA9IGluYihkZXYtPmlvYmFzZSkgfCAoaW5iKGRldi0+aW9iYXNlICsgMSkgPDwgOCk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIChwY2kgJXMpIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUsCi0JCSBwY2lfbmFtZShwY2lfZGV2KSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMKaW5kZXggNTAzNGY2Ni4uZTAzZGQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMKQEAgLTEsMzQgKzEsMzMgQEAKIC8qCi0gICBjb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCi0KLSAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZC4KLSAgIChodHRwOi8vcm9ib3QwLmdlLnVpdWMuZWR1L35zcG9uZy9tZWNoYS8pCi0KLSAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgIENvcHlyaWdodCAoQykgMTk5OSBEYW4gQmxvY2sKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIGM2eGRpZ2lvLmMKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZC4KKyAqIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyUyQS9odHRwOi8vcm9ib3QwLmdlLnVpdWMuZWR1L35zcG9uZy9tZWNoYS8KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGFuIEJsb2NrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCisKIC8qCi1Ecml2ZXI6IGM2eGRpZ2lvCi1EZXNjcmlwdGlvbjogTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZAotQXV0aG9yOiBEYW4gQmxvY2sKLVN0YXR1czogdW5rbm93bgotRGV2aWNlczogW01lY2hhdHJvbmljIFN5c3RlbXMgSW5jLl0gQzZ4X0RJR0lPIERTUCBkYXVnaHRlciBjYXJkIChjNnhkaWdpbykKLVVwZGF0ZWQ6IFN1biBOb3YgMjAgMjA6MTg6MzQgRVNUIDIwMDUKLQotVGhpcyBkcml2ZXIgd2lsbCBub3Qgd29yayB3aXRoIGEgMi40IGtlcm5lbC4KLWh0dHA6Ly9yb2JvdDAuZ2UudWl1Yy5lZHUvfnNwb25nL21lY2hhLwotCi0qLworICogRHJpdmVyOiBjNnhkaWdpbworICogRGVzY3JpcHRpb246IE1lY2hhdHJvbmljIFN5c3RlbXMgSW5jLiBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQKKyAqIEF1dGhvcjogRGFuIEJsb2NrCisgKiBTdGF0dXM6IHVua25vd24KKyAqIERldmljZXM6IChNZWNoYXRyb25pYyBTeXN0ZW1zIEluYy4pIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZCBbYzZ4ZGlnaW9dCisgKiBVcGRhdGVkOiBTdW4gTm92IDIwIDIwOjE4OjM0IEVTVCAyMDA1CisgKgorICogQ29uZmlndXJhdGlvbiBPcHRpb25zOgorICoJWzBdIC0gYmFzZSBhZGRyZXNzCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDMsMzA5ICs0MiwxOTQgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi1zdGF0aWMgdTggUmVhZEJ5dGVGcm9tSHdQb3J0KHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1OCByZXN1bHQgPSBpbmIoYWRkcik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgV3JpdGVCeXRlVG9Id1BvcnQodW5zaWduZWQgbG9uZyBhZGRyLCB1OCB2YWwpCi17Ci0Jb3V0Yl9wKHZhbCwgYWRkcik7Ci19Ci0KLSNkZWZpbmUgQzZYRElHSU9fU0laRSAzCi0KIC8qCi0gKiBwb3J0IG9mZnNldHMKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKICAqLwotI2RlZmluZSBDNlhESUdJT19QQVJBTExFTF9EQVRBIDAKLSNkZWZpbmUgQzZYRElHSU9fUEFSQUxMRUxfU1RBVFVTIDEKLSNkZWZpbmUgQzZYRElHSU9fUEFSQUxMRUxfQ09OVFJPTCAyCi1zdHJ1Y3QgcHdtYml0c3R5cGUgewotCXVuc2lnbmVkIHNiMDoyOwotCXVuc2lnbmVkIHNiMToyOwotCXVuc2lnbmVkIHNiMjoyOwotCXVuc2lnbmVkIHNiMzoyOwotCXVuc2lnbmVkIHNiNDoyOwotfTsKLXVuaW9uIHB3bWNtZHR5cGUgewotCXVuc2lnbmVkIGNtZDsJCS8qICBhc3N1bWluZyBoZXJlIHRoYXQgaW50IGlzIDMyYml0ICovCi0Jc3RydWN0IHB3bWJpdHN0eXBlIGJpdHM7Ci19Owotc3RydWN0IGVuY2JpdHN0eXBlIHsKLQl1bnNpZ25lZCBzYjA6MzsKLQl1bnNpZ25lZCBzYjE6MzsKLQl1bnNpZ25lZCBzYjI6MzsKLQl1bnNpZ25lZCBzYjM6MzsKLQl1bnNpZ25lZCBzYjQ6MzsKLQl1bnNpZ25lZCBzYjU6MzsKLQl1bnNpZ25lZCBzYjY6MzsKLQl1bnNpZ25lZCBzYjc6MzsKLX07Ci11bmlvbiBlbmN2YWx1ZXR5cGUgewotCXVuc2lnbmVkIHZhbHVlOwotCXN0cnVjdCBlbmNiaXRzdHlwZSBiaXRzOwotfTsKKyNkZWZpbmUgQzZYRElHSU9fREFUQV9SRUcJMHgwMAorI2RlZmluZSBDNlhESUdJT19EQVRBX0NIQU4oeCkJKCgoeCkgKyAxKSA8PCA0KQorI2RlZmluZSBDNlhESUdJT19EQVRBX1BXTQkoMSA8PCA1KQorI2RlZmluZSBDNlhESUdJT19EQVRBX0VOQ09ERVIJKDEgPDwgNikKKyNkZWZpbmUgQzZYRElHSU9fU1RBVFVTX1JFRwkweDAxCisjZGVmaW5lIEM2WERJR0lPX0NUUkxfUkVHCTB4MDIKIAogI2RlZmluZSBDNlhESUdJT19USU1FX09VVCAyMAogCi1zdGF0aWMgdm9pZCBDNlhfcHdtSW5pdCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyKQorc3RhdGljIGludCBjNnhkaWdpb19jaGtfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCWludCB0aW1lb3V0ID0gMDsKIAotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDcwKTsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDApCi0JICAgICAgICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7CisJZG8geworCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBDNlhESUdJT19TVEFUVVNfUkVHKTsKKwkJaWYgKChzdGF0dXMgJiAweDgwKSAhPSBjb250ZXh0KQorCQkJcmV0dXJuIDA7CiAJCXRpbWVvdXQrKzsKLQl9CisJfSB3aGlsZSAgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCk7CiAKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHg3NCk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4NzApOwotCXRpbWVvdXQgPSAwOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMHgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCisJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RhdGljIHZvaWQgQzZYX3B3bU91dHB1dCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyLCB1bnNpZ25lZCBjaGFubmVsLCBpbnQgdmFsdWUpCitzdGF0aWMgaW50IGM2eGRpZ2lvX3dyaXRlX2RhdGEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgc3RhdHVzKQogewotCXVuc2lnbmVkIHBwY21kOwotCXVuaW9uIHB3bWNtZHR5cGUgcHdtOwotCWludCB0aW1lb3V0ID0gMDsKLQl1bnNpZ25lZCB0bXA7Ci0KLQlwd20uY21kID0gdmFsdWU7Ci0JaWYgKHB3bS5jbWQgPiA0OTgpCi0JCXB3bS5jbWQgPSA0OTg7Ci0JaWYgKHB3bS5jbWQgPCAyKQotCQlwd20uY21kID0gMjsKLQotCWlmIChjaGFubmVsID09IDApIHsKLQkJcHBjbWQgPSAweDI4OwotCX0gZWxzZSB7CQkvKiAgaWYgY2hhbm5lbCA9PSAxICovCi0JCXBwY21kID0gMHgzMDsKLQl9CQkJLyogZW5kaWYgKi8KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIHB3bS5iaXRzLnNiMCk7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyBwd20uYml0cy5zYjEgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgcHdtLmJpdHMuc2IyKTsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIHB3bS5iaXRzLnNiMyArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyBwd20uYml0cy5zYjQpOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KKwlvdXRiX3AodmFsLCBkZXYtPmlvYmFzZSArIEM2WERJR0lPX0RBVEFfUkVHKTsKKwlyZXR1cm4gYzZ4ZGlnaW9fY2hrX3N0YXR1cyhkZXYsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgQzZYX2VuY0lucHV0KHVuc2lnbmVkIGxvbmcgYmFzZUFkZHIsIHVuc2lnbmVkIGNoYW5uZWwpCitzdGF0aWMgaW50IGM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqYml0cywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzKQogewotCXVuc2lnbmVkIHBwY21kOwotCXVuaW9uIGVuY3ZhbHVldHlwZSBlbmM7Ci0JaW50IHRpbWVvdXQgPSAwOwotCWludCB0bXA7CisJdW5zaWduZWQgaW50IHZhbDsKIAotCWVuYy52YWx1ZSA9IDA7Ci0JaWYgKGNoYW5uZWwgPT0gMCkKLQkJcHBjbWQgPSAweDQ4OwotCWVsc2UKLQkJcHBjbWQgPSAweDUwOworCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIEM2WERJR0lPX1NUQVRVU19SRUcpOworCXZhbCA+Pj0gMzsKKwl2YWwgJj0gMHgwNzsKIAotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCk7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9CisJKmJpdHMgPSB2YWw7CiAKLQllbmMuYml0cy5zYjAgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiMSA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2IyID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgMHg0KTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDgwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQllbmMuYml0cy5zYjMgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiNCA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2I1ID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kKTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiNiA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2I3ID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kKTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlyZXR1cm4gZW5jLnZhbHVlIF4gMHg4MDAwMDA7CisJcmV0dXJuIGM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIEM2WF9lbmNSZXNldEFsbCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyKQorc3RhdGljIHZvaWQgYzZ4ZGlnaW9fcHdtX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0JdW5zaWduZWQgdGltZW91dCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IEM2WERJR0lPX0RBVEFfUFdNIHwgQzZYRElHSU9fREFUQV9DSEFOKGNoYW4pOworCXVuc2lnbmVkIGludCBiaXRzOwogCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4NjgpOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHg2Qyk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDY4KTsKLQl0aW1lb3V0ID0gMDsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDB4MCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHgwKTsKLQl0aW1lb3V0ID0gMDsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDB4ODApCi0JICAgICAgICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRpbWVvdXQrKzsKLQl9CisJaWYgKHZhbCA+IDQ5OCkKKwkJdmFsID0gNDk4OworCWlmICh2YWwgPCAyKQorCQl2YWwgPSAyOworCisJYml0cyA9ICh2YWwgPj4gMCkgJiAweDAzOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQgfCBiaXRzIHwgKDAgPDwgMiksIDB4MDApOworCWJpdHMgPSAodmFsID4+IDIpICYgMHgwMzsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kIHwgYml0cyB8ICgxIDw8IDIpLCAweDgwKTsKKwliaXRzID0gKHZhbCA+PiA0KSAmIDB4MDM7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIGNtZCB8IGJpdHMgfCAoMCA8PCAyKSwgMHgwMCk7CisJYml0cyA9ICh2YWwgPj4gNikgJiAweDAzOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQgfCBiaXRzIHwgKDEgPDwgMiksIDB4ODApOworCWJpdHMgPSAodmFsID4+IDgpICYgMHgwMzsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kIHwgYml0cyB8ICgwIDw8IDIpLCAweDAwKTsKKworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDAwLCAweDgwKTsKIH0KIAotc3RhdGljIGludCBjNnhkaWdpb19wd21vX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBjNnhkaWdpb19lbmNvZGVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgdW5zaWduZWQgaW50IGNoYW4pCiB7CisJdW5zaWduZWQgaW50IGNtZCA9IEM2WERJR0lPX0RBVEFfRU5DT0RFUiB8IEM2WERJR0lPX0RBVEFfQ0hBTihjaGFuKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKwl1bnNpZ25lZCBpbnQgYml0czsKKworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQsIDB4MDApOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDApOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMCA8PCAyKSwgMHgwMCk7CisJdmFsIHw9IChiaXRzIDw8IDMpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDYpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMCA8PCAyKSwgMHgwMCk7CisJdmFsIHw9IChiaXRzIDw8IDkpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDEyKTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDAgPDwgMiksIDB4MDApOworCXZhbCB8PSAoYml0cyA8PCAxNSk7CisKKwljNnhkaWdpb19nZXRfZW5jb2Rlcl9iaXRzKGRldiwgJmJpdHMsIGNtZCB8ICgxIDw8IDIpLCAweDgwKTsKKwl2YWwgfD0gKGJpdHMgPDwgMTgpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMCA8PCAyKSwgMHgwMCk7CisJdmFsIHw9IChiaXRzIDw8IDIxKTsKKworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDAwLCAweDgwKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgYzZ4ZGlnaW9fcHdtX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbCA9IChzLT5zdGF0ZSA+PiAoMTYgKiBjaGFuKSkgJiAweGZmZmY7CiAJaW50IGk7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKLQkJQzZYX3B3bU91dHB1dChkZXYtPmlvYmFzZSwgY2hhbiwgZGF0YVtpXSk7Ci0JCS8qICAgIGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsgKi8KKwkJdmFsID0gZGF0YVtpXTsKKwkJYzZ4ZGlnaW9fcHdtX3dyaXRlKGRldiwgY2hhbiwgdmFsKTsKIAl9Ci0JcmV0dXJuIGk7CisKKwkvKgorCSAqIFRoZXJlIGFyZSBvbmx5IDIgUFdNIGNoYW5uZWxzIGFuZCB0aGV5IGhhdmUgYSBtYXhkYXRhIG9mIDUwMC4KKwkgKiBJbnN0ZWFkIG9mIGFsbG9jYXRpbmcgcHJpdmF0ZSBkYXRhIHRvIHNhdmUgdGhlIHZhbHVlcyBpbiBmb3IKKwkgKiByZWFkYmFjayB0aGlzIGRyaXZlciBqdXN0IHBhY2tzIHRoZSB2YWx1ZXMgZm9yIHRoZSB0d28gY2hhbm5lbHMKKwkgKiBpbiB0aGUgcy0+c3RhdGUuCisJICovCisJcy0+c3RhdGUgJj0gKDB4ZmZmZiA8PCAoMTYgKiBjaGFuKSk7CisJcy0+c3RhdGUgfD0gKHZhbCA8PCAoMTYgKiBjaGFuKSk7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBjNnhkaWdpb19laV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBjNnhkaWdpb19wd21faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgbjsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCi0JCWRhdGFbbl0gPSAoQzZYX2VuY0lucHV0KGRldi0+aW9iYXNlLCBjaGFuKSAmIDB4ZmZmZmZmKTsKKwl2YWwgPSAocy0+c3RhdGUgPj4gKDE2ICogY2hhbikpICYgMHhmZmZmOwogCi0JcmV0dXJuIG47CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IHZhbDsKKworCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgdm9pZCBib2FyZF9pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGM2eGRpZ2lvX2VuY29kZXJfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlDNlhfcHdtSW5pdChkZXYtPmlvYmFzZSk7Ci0JQzZYX2VuY1Jlc2V0QWxsKGRldi0+aW9iYXNlKTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXZhbCA9IGM2eGRpZ2lvX2VuY29kZXJfcmVhZChkZXYsIGNoYW4pOworCisJCS8qIG11bmdlIHR3bydzIGNvbXBsZW1lbnQgdmFsdWUgdG8gb2Zmc2V0IGJpbmFyeSAqLworCQlkYXRhW2ldID0gY29tZWRpX29mZnNldF9tdW5nZShzLCB2YWwpOworCX0KKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBjNnhkaWdpb19pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgUFdNICovCisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4NzAsIDB4MDApOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDc0LCAweDgwKTsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHg3MCwgMHgwMCk7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4MDAsIDB4ODApOworCisJLyogUmVzZXQgdGhlIGVuY29kZXJzICovCisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4NjgsIDB4MDApOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDZjLCAweDgwKTsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHg2OCwgMHgwMCk7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4MDAsIDB4ODApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgYzZ4ZGlnaW9fcG5wX3RibFtdID0gewpAQCAtMzY3LDcgKzI1MSw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IHJldDsKIAotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBDNlhESUdJT19TSVpFKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgwMyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzgwLDI3ICsyNjQsMjYgQEAKIAogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwogCS8qIHB3bSBvdXRwdXQgc3ViZGV2aWNlICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOwkvKiAgTm90IHN1cmUgd2hhdCB0byBwdXQgaGVyZSAqLwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEU7Ci0Jcy0+bl9jaGFuID0gMjsKLQkvKiAgICAgIHMtPnRyaWdbMF0gPSBjNnhkaWdpb19wd21vOyAqLwotCXMtPmluc25fd3JpdGUgPSBjNnhkaWdpb19wd21vX2luc25fd3JpdGU7Ci0Jcy0+bWF4ZGF0YSA9IDUwMDsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7CS8qICBBIHN1aXRhYmxlIGxpZSAqLworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfUFdNOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklURUFCTEU7CisJcy0+bl9jaGFuCT0gMjsKKwlzLT5tYXhkYXRhCT0gNTAwOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3Vua25vd247CisJcy0+aW5zbl93cml0ZQk9IGM2eGRpZ2lvX3B3bV9pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGM2eGRpZ2lvX3B3bV9pbnNuX3JlYWQ7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKIAkvKiBlbmNvZGVyIChjb3VudGVyKSBzdWJkZXZpY2UgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfTFNBTVBMOwotCXMtPm5fY2hhbiA9IDI7Ci0JLyogcy0+dHJpZ1swXSA9IGM2eGRpZ2lvX2VpOyAqLwotCXMtPmluc25fcmVhZCA9IGM2eGRpZ2lvX2VpX2luc25fcmVhZDsKLQlzLT5tYXhkYXRhID0gMHhmZmZmZmY7Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0xTQU1QTDsKKwlzLT5uX2NoYW4JPSAyOworCXMtPm1heGRhdGEJPSAweGZmZmZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmtub3duOworCXMtPmluc25fcmVhZAk9IGM2eGRpZ2lvX2VuY29kZXJfaW5zbl9yZWFkOwogCiAJLyogIEkgd2lsbCBjYWxsIHRoaXMgaW5pdCBhbnl3YXkgYnV0IG1vcmUgdGhhbiBsaWtlbHkgdGhlIERTUCBib2FyZCAqLwogCS8qICB3aWxsIG5vdCBiZSBjb25uZWN0ZWQgd2hlbiBkZXZpY2UgZHJpdmVyIGlzIGxvYWRlZC4gKi8KLQlib2FyZF9pbml0KGRldik7CisJYzZ4ZGlnaW9faW5pdChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MjAsNSArMzAzLDUgQEAKIG1vZHVsZV9jb21lZGlfZHJpdmVyKGM2eGRpZ2lvX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGRyaXZlciBmb3IgdGhlIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwppbmRleCA2NGQ1ZjI5Li42NDVmY2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwpAQCAtOTUsMTAgKzk1LDE3IEBACiAJfQogfTsKIAotc3RhdGljIGlycXJldHVybl90IGRhczE2Y3NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgaW50IGRhczE2Y3NfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKLQkvKiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsgKi8KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIERBUzE2Q1NfTUlTQzEpOworCWlmIChzdGF0dXMgJiAweDAwODApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgZGFzMTZjc19haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMTA5LDggKzExNiw4IEBACiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CiAJaW50IGFyZWYgPSBDUl9BUkVGKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmV0OwogCWludCBpOwotCWludCB0bzsKIAogCW91dHcoY2hhbiwgZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX0RJT19NVVgpOwogCkBAIC0xMzgsMTMyICsxNDUsMTYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX0FEQ19EQVRBKTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMDAKLQkJZm9yICh0byA9IDA7IHRvIDwgVElNRU9VVDsgdG8rKykgewotCQkJaWYgKGludyhkZXYtPmlvYmFzZSArIERBUzE2Q1NfTUlTQzEpICYgMHgwMDgwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0byA9PSBUSU1FT1VUKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2JfZGFzMTZfY3M6IGFpIHRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczE2Y3NfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSArIERBUzE2Q1NfQURDX0RBVEEpOwogCX0KIAogCXJldHVybiBpOwogfQogCi1zdGF0aWMgaW50IGRhczE2Y3NfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGRhczE2Y3NfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQotewotCWludCBlcnIgPSAwOwotCWludCB0bXA7Ci0KLQkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCi0JCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKLQkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMTsKLQotCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KLQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwotCi0JLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCi0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMjsKLQotCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KLQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQotI2RlZmluZSBNQVhfU1BFRUQJMTAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KLSNkZWZpbmUgTUlOX1NQRUVECTEwMDAwMDAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KLQotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUFYX1NQRUVEKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUlOX1NQRUVEKTsKLQl9IGVsc2UgewotCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCi0JCS8qIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUgKi8KLQkJLyogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOwotCX0KLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIE1BWF9TUEVFRCk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIE1JTl9TUEVFRCk7Ci0JfSBlbHNlIHsKLQkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwotCQkvKiBzZWUgYWJvdmUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIDkpOwotCX0KLQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0KLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7Ci0JZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMzsKLQotCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KLQotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJdW5zaWduZWQgaW50IGRpdjEgPSAwLCBkaXYyID0gMDsKLQotCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkaXYxLCAmZGl2MiwKLQkJCQkJICAmY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5mbGFncyk7Ci0JCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykKLQkJCWVycisrOwotCX0KLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCXVuc2lnbmVkIGludCBkaXYxID0gMCwgZGl2MiA9IDA7Ci0KLQkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGl2MSwgJmRpdjIsCi0JCQkJCSAgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGNtZC0+ZmxhZ3MpOwotCQlpZiAodG1wICE9IGNtZC0+Y29udmVydF9hcmcpCi0JCQllcnIrKzsKLQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgotCQkgICAgY21kLT5zY2FuX2JlZ2luX2FyZyA8Ci0JCSAgICBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmcpIHsKLQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQotCQkJICAgIGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKLQkJCWVycisrOwotCQl9Ci0JfQotCi0JaWYgKGVycikKLQkJcmV0dXJuIDQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBkYXMxNmNzX2FvX3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC00MDEsMTAgKzI5Miw2IEBACiAJZGV2LT5pb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlsaW5rLT5wcml2ID0gZGV2OwotCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCBkYXMxNmNzX2ludGVycnVwdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlkZXYtPmlycSA9IGxpbmstPmlycTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKQEAgLTQxNSw3ICszMDIsNiBAQAogCQlyZXR1cm4gcmV0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JZGV2LT5yZWFkX3N1YmRldiA9IHM7CiAJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLwogCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CiAJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9ESUZGIHwgU0RGX0NNRF9SRUFEOwpAQCAtNDI0LDggKzMxMCw2IEBACiAJcy0+cmFuZ2VfdGFibGUJPSAmZGFzMTZjc19haV9yYW5nZTsKIAlzLT5sZW5fY2hhbmxpc3QJPSAxNjsKIAlzLT5pbnNuX3JlYWQJPSBkYXMxNmNzX2FpX3JpbnNuOwotCXMtPmRvX2NtZAk9IGRhczE2Y3NfYWlfY21kOwotCXMtPmRvX2NtZHRlc3QJPSBkYXMxNmNzX2FpX2NtZHRlc3Q7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKIAkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLwpAQCAtNDUxLDEwICszMzUsNiBAQAogCXMtPmluc25fYml0cwk9IGRhczE2Y3NfZGlvX2luc25fYml0czsKIAlzLT5pbnNuX2NvbmZpZwk9IGRhczE2Y3NfZGlvX2luc25fY29uZmlnOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMsIEkvTyBiYXNlPTB4JTA0bHgsIGlycT0ldVxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUsCi0JCWRldi0+aW9iYXNlLCBkZXYtPmlycSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jCmluZGV4IDk4MTliZTAuLjgzYTI2NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMKQEAgLTM3Niw2ICszNzYsMjAgQEAKIAlyZXR1cm4gQ0FMX0VOX0JJVCB8IENBTF9TUkNfQklUUyhkZXZwcml2LT5jYWxpYnJhdGlvbl9zb3VyY2UpOwogfQogCitzdGF0aWMgaW50IGNiX3BjaWRhc19haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldnByaXYtPmNvbnRyb2xfc3RhdHVzICsgQURDTVVYX0NPTlQpOworCWlmIChzdGF0dXMgJiBFT0MpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgY2JfcGNpZGFzX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMzg1LDcgKzM5OSw4IEBACiAJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwogCXVuc2lnbmVkIGludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IGJpdHM7Ci0JaW50IG4sIGk7CisJaW50IHJldDsKKwlpbnQgbjsKIAogCS8qIGVuYWJsZSBjYWxpYnJhdGlvbiBpbnB1dCBpZiBhcHByb3ByaWF0ZSAqLwogCWlmIChpbnNuLT5jaGFuc3BlYyAmIENSX0FMVF9TT1VSQ0UpIHsKQEAgLTQxNSwxMyArNDMwLDkgQEAKIAkJb3V0dygwLCBkZXZwcml2LT5hZGNfZmlmbyArIEFEQ0RBVEEpOwogCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCS8qIHJldHVybiAtRVRJTUVET1VUIGlmIHRoZXJlIGlzIGEgdGltZW91dCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJaWYgKGludyhkZXZwcml2LT5jb250cm9sX3N0YXR1cyArIEFEQ01VWF9DT05UKSAmIEVPQykKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSAxMDAwMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGNiX3BjaWRhc19haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZGF0YVtuXSA9IGludyhkZXZwcml2LT5hZGNfZmlmbyArIEFEQ0RBVEEpOwpAQCAtMTAwNiw5ICsxMDE3LDkgQEAKIAogCS8qICBzZXQgc3RhcnQgdHJpZ2dlciBhbmQgYnVyc3QgbW9kZSAqLwogCWJpdHMgPSAwOwotCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKIAkJYml0cyB8PSBTV19UUklHR0VSOwotCWVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSB7CisJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KIAkJYml0cyB8PSBFWFRfVFJJR0dFUiB8IFRHRU4gfCBYVFJDTDsKIAkJaWYgKHRoaXNib2FyZC0+aXNfMTYwMikgewogCQkJaWYgKGNtZC0+c3RhcnRfYXJnICYgQ1JfSU5WRVJUKQpAQCAtMTAxNiw5ICsxMDI3LDYgQEAKIAkJCWlmIChjbWQtPnN0YXJ0X2FyZyAmIENSX0VER0UpCiAJCQkJYml0cyB8PSBUR1NFTDsKIAkJfQotCX0gZWxzZSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJidWchIik7Ci0JCXJldHVybiAtMTsKIAl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19OT1cgJiYgY21kLT5jaGFubGlzdF9sZW4gPiAxKQogCQliaXRzIHw9IEJVUlNURTsKQEAgLTEyNjksOCArMTI3Nyw2IEBACiAJdW5zaWduZWQgaW50IG51bV9wb2ludHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWFzeW5jLT5ldmVudHMgPSAwOwotCiAJaWYgKHN0YXR1cyAmIERBRU1JKSB7CiAJCS8qICBjbGVhciBkYWMgZW1wdHkgaW50ZXJydXB0IGxhdGNoICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CkBAIC0xMjgyLDcgKzEyODgsNiBAQAogCQkJICAgIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQKIAkJCSAgICAgJiYgZGV2cHJpdi0+YW9fY291bnQpKSB7CiAJCQkJY29tZWRpX2Vycm9yKGRldiwgImRhYyBmaWZvIHVuZGVyZmxvdyIpOwotCQkJCWNiX3BjaWRhc19hb19jYW5jZWwoZGV2LCBzKTsKIAkJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJCX0KIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKQEAgLTEzMTIsNyArMTMxNyw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAl9CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgY2JfcGNpZGFzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQpAQCAtMTMzMiw3ICsxMzM3LDYgQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJYXN5bmMgPSBzLT5hc3luYzsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAogCXM1OTMzX3N0YXR1cyA9IGlubChkZXZwcml2LT5zNTkzM19jb25maWcgKyBBTUNDX09QX1JFR19JTlRDU1IpOwogCkBAIC0xMzY0LDEwICsxMzY4LDggQEAKIAkJY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCBkZXZwcml2LT5haV9idWZmZXIsCiAJCQkJCSAgbnVtX3NhbXBsZXMgKiBzaXplb2Yoc2hvcnQpKTsKIAkJZGV2cHJpdi0+Y291bnQgLT0gbnVtX3NhbXBsZXM7Ci0JCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYgZGV2cHJpdi0+Y291bnQgPT0gMCkgeworCQlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmIGRldnByaXYtPmNvdW50ID09IDApCiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQljYl9wY2lkYXNfY2FuY2VsKGRldiwgcyk7Ci0JCX0KIAkJLyogIGNsZWFyIGhhbGYtZnVsbCBpbnRlcnJ1cHQgbGF0Y2ggKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAkJb3V0dyhkZXZwcml2LT5hZGNfZmlmb19iaXRzIHwgSU5ULApAQCAtMTM4NCw3ICsxMzg2LDYgQEAKIAkJCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKIAkJCSAgICAtLWRldnByaXYtPmNvdW50ID09IDApIHsKIAkJCQkvKiBlbmQgb2YgYWNxdWlzaXRpb24gKi8KLQkJCQljYl9wY2lkYXNfY2FuY2VsKGRldiwgcyk7CiAJCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTQxMSwxMSArMTQxMiwxMCBAQAogCQlvdXR3KGRldnByaXYtPmFkY19maWZvX2JpdHMgfCBMQURGVUwsCiAJCSAgICAgZGV2cHJpdi0+Y29udHJvbF9zdGF0dXMgKyBJTlRfQURDRklGTyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJY2JfcGNpZGFzX2NhbmNlbChkZXYsIHMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE1NzYsOSArMTU3Niw2IEBACiAJb3V0bChkZXZwcml2LT5zNTkzM19pbnRjc3JfYml0cyB8IElOVENTUl9JTkJPWF9JTlRSX1NUQVRVUywKIAkgICAgIGRldnByaXYtPnM1OTMzX2NvbmZpZyArIEFNQ0NfT1BfUkVHX0lOVENTUik7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKaW5kZXggNGZmZjE3My4uZjlhZmNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKQEAgLTE2NjQsMTUgKzE2NjQsMzYgQEAKIAlpMmNfc3RvcChkZXYpOwogfQogCitzdGF0aWMgaW50IGNiX3BjaWRhczY0X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJY29uc3Qgc3RydWN0IHBjaWRhczY0X2JvYXJkICp0aGlzYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKwlzdHJ1Y3QgcGNpZGFzNjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19TVEFUVVNfUkVHKTsKKwlpZiAodGhpc2JvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApIHsKKwkJc3RhdHVzID0gcmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfV1JJVEVfUE5UUl9SRUcpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKHBpcGVfZnVsbF9iaXRzKHN0YXR1cykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhaV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBwY2lkYXM2NF9ib2FyZCAqdGhpc2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGJpdHMgPSAwLCBuLCBpOworCXVuc2lnbmVkIGludCBiaXRzID0gMCwgbjsKIAl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgcmFuZ2UsIGFyZWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdGF0aWMgY29uc3QgaW50IHRpbWVvdXQgPSAxMDA7CisJaW50IHJldDsKIAogCWNoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKQEAgLTE3NzAsMjMgKzE3OTEsMTAgQEAKIAkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX0NPTlZFUlRfUkVHKTsKIAogCQkvKiAgd2FpdCBmb3IgZGF0YSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCQliaXRzID0gcmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19TVEFUVVNfUkVHKTsKLQkJCWlmICh0aGlzYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkgewotCQkJCWlmIChyZWFkdyhkZXZwcml2LT5tYWluX2lvYmFzZSArCi0JCQkJCSAgQURDX1dSSVRFX1BOVFJfUkVHKSkKLQkJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwaXBlX2Z1bGxfYml0cyhiaXRzKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgIiBhbmFsb2cgaW5wdXQgcmVhZCBpbnNuIHRpbWVkIG91dCIpOwotCQkJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJzdGF0dXMgMHgleFxuIiwgYml0cyk7Ci0JCQlyZXR1cm4gLUVUSU1FOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgY2JfcGNpZGFzNjRfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKQogCQkJZGF0YVtuXSA9IHJlYWRsKGRldnByaXYtPmRpb19jb3VudGVyX2lvYmFzZSArCiAJCQkJCUFEQ19GSUZPX1JFRykgJiAweGZmZmY7CkBAIC0zODE2LDE2ICszODI0LDE5IEBACiAJaWYgKHRoaXNib2FyZC0+aGFzXzgyNTUpIHsKIAkJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKSB7CiAJCQlkaW9fODI1NV9pb2Jhc2UgPSBkZXZwcml2LT5tYWluX2lvYmFzZSArIEk4MjU1XzQwMjBfUkVHOwotCQkJc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIGRpb19jYWxsYmFja180MDIwLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcpZGlvXzgyNTVfaW9iYXNlKTsKKwkJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBkaW9fY2FsbGJhY2tfNDAyMCwKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWRpb184MjU1X2lvYmFzZSk7CiAJCX0gZWxzZSB7CiAJCQlkaW9fODI1NV9pb2Jhc2UgPQogCQkJCWRldnByaXYtPmRpb19jb3VudGVyX2lvYmFzZSArIERJT184MjU1X09GRlNFVDsKLQkJCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBkaW9fY2FsbGJhY2ssCi0JCQkJCSAodW5zaWduZWQgbG9uZylkaW9fODI1NV9pb2Jhc2UpOworCQkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIGRpb19jYWxsYmFjaywKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWRpb184MjU1X2lvYmFzZSk7CiAJCX0KLQl9IGVsc2UKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiAgOCBjaGFubmVsIGRpbyBmb3IgNjB4eCAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCmluZGV4IDhjY2EwNTEuLjkwMWRjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKQEAgLTM4OCw4ICszODgsNiBAQAogCWZvciAoaSA9IDA7IGkgPCB0aGlzYm9hcmQtPmFvX2NoYW5zOyBpKyspCiAJCWNiX3BjaWRkYV9jYWxpYnJhdGUoZGV2LCBpLCBkZXZwcml2LT5hb19yYW5nZVtpXSk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jCmluZGV4IDU3Mjk1ZDEuLmQzMTQxYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYwpAQCAtODUsMjEgKzg1LDMxIEBACiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzJdOwogfTsKIAotLyoKLSAqICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCi0gKiBtb2RlLgotICovCitzdGF0aWMgaW50IGNiX3BjaW1kYXNfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2cHJpdi0+QkFEUjMgKyAyKTsKKwlpZiAoKHN0YXR1cyAmIDB4ODApID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgY2JfcGNpbWRhc19haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIGk7CisJaW50IG47CiAJdW5zaWduZWQgaW50IGQ7Ci0JdW5zaWduZWQgaW50IGJ1c3k7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBzaG9ydCBjaGFubGltczsKIAlpbnQgbWF4Y2hhbnM7CisJaW50IHJldDsKIAogCS8qICBvbmx5IHN1cHBvcnQgc3cgaW5pdGlhdGVkIHJlYWRzIGZyb20gYSBzaW5nbGUgY2hhbm5lbCAqLwogCkBAIC0xMzMsMTcgKzE0MywxMCBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIDApOwogCi0jZGVmaW5lIFRJTUVPVVQgMTAwMAkJLyogdHlwaWNhbGx5IHRha2VzIDUgbG9vcHMgb24gYSBsaWdodGx5IGxvYWRlZCBQZW50aXVtIDEwME1IeiwgKi8KLQkJLyogdGhpcyBpcyBsaWtlbHkgdG8gYmUgMTAwIGxvb3BzIG9uIGEgMkdIeiBtYWNoaW5lLCBzbyBzZXQgMTAwMCBhcyB0aGUgbGltaXQuICovCi0KIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJYnVzeSA9IGluYihkZXZwcml2LT5CQURSMyArIDIpICYgMHg4MDsKLQkJCWlmICghYnVzeSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSBUSU1FT1VUKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgY2JfcGNpbWRhc19haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZGF0YVtuXSA9IGludyhkZXYtPmlvYmFzZSArIDApOwpAQCAtMjQ3LDkgKzI1MCw5IEBACiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKIAkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKi8KLQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgaW9iYXNlXzgyNTUpOwotCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgaW9iYXNlXzgyNTUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jCmluZGV4IDQzYTg2NjMuLjRhMmIyMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYwpAQCAtMTg3LDkgKzE4Nyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGNiX3BjaW1kZGFfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwppbmRleCA1MWE1OWU1Li44NDUwYzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIi9kZXYvY29tZWRpJXUiLCBtaW5vcik7CisJCXNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIi9kZXYvY29tZWRpJWQiLCBtaW5vcik7CiAJCWZpbGVbc2l6ZW9mKGZpbGUpIC0gMV0gPSAwOwogCiAJCWQgPSBjb21lZGlfb3BlbihmaWxlKTsKQEAgLTI1NCw2ICsyNTQsNyBAQAogCQkJaWYgKCFkZXZzKSB7CiAJCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkuIE91dCBvZiBtZW1vcnk/XG4iKTsKKwkJCQlrZnJlZShiZGV2KTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWRldnByaXYtPmRldnMgPSBkZXZzOwpAQCAtMjYzLDcgKzI2NCw3IEBACiAJCQkJY2hhciBidWZbMjBdOwogCQkJCWludCBsZWZ0ID0KIAkJCQkgICAgTUFYX0JPQVJEX05BTUUgLSBzdHJsZW4oZGV2cHJpdi0+bmFtZSkgLSAxOwotCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZDolZCAiLAorCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldToldSAiLAogCQkJCQkgYmRldi0+bWlub3IsIGJkZXYtPnN1YmRldik7CiAJCQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogCQkJCXN0cm5jYXQoZGV2cHJpdi0+bmFtZSwgYnVmLCBsZWZ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwppbmRleCAyNmQ5ZGJjLi45ZDliMTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCkBAIC0xLDM0ICsxLDUzIEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCi0KLSAgICBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCi0gICAgdHdvIG9yIG1vcmUgZHJpdmVycy4gIGZjIGlzIHNob3J0Ci0gICAgZm9yIGZyYW5rLWNvbW1vbi4KLQotICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCisgKiBjb21lZGlfZmMuYworICogVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgorICogdHdvIG9yIG1vcmUgZHJpdmVycy4gIGZjIGlzIHNob3J0IGZvciBmcmFuay1jb21tb24uCisgKgorICogQXV0aG9yOiBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCi1zdGF0aWMgdm9pZCBpbmNyZW1lbnRfc2Nhbl9wcm9ncmVzcyhzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKLQkJCQkgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3Vuc2lnbmVkIGludCBjZmNfYnl0ZXNfcGVyX3NjYW4oc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKLQl1bnNpZ25lZCBpbnQgc2Nhbl9sZW5ndGggPSBjZmNfYnl0ZXNfcGVyX3NjYW4oc3ViZCk7CisJdW5zaWduZWQgaW50IGNoYW5saXN0X2xlbiA9IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCXVuc2lnbmVkIGludCBudW1fc2FtcGxlczsKKwl1bnNpZ25lZCBpbnQgYml0c19wZXJfc2FtcGxlOworCisJc3dpdGNoIChzLT50eXBlKSB7CisJY2FzZSBDT01FRElfU1VCRF9ESToKKwljYXNlIENPTUVESV9TVUJEX0RPOgorCWNhc2UgQ09NRURJX1NVQkRfRElPOgorCQliaXRzX3Blcl9zYW1wbGUgPSA4ICogYnl0ZXNfcGVyX3NhbXBsZShzKTsKKwkJbnVtX3NhbXBsZXMgPSAoY2hhbmxpc3RfbGVuICsgYml0c19wZXJfc2FtcGxlIC0gMSkgLworCQkJCWJpdHNfcGVyX3NhbXBsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnVtX3NhbXBsZXMgPSBjaGFubGlzdF9sZW47CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtX3NhbXBsZXMgKiBieXRlc19wZXJfc2FtcGxlKHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2ZjX2J5dGVzX3Blcl9zY2FuKTsKKwordm9pZCBjZmNfaW5jX3NjYW5fcHJvZ3Jlc3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9sZW5ndGggPSBjZmNfYnl0ZXNfcGVyX3NjYW4ocyk7CiAKIAlhc3luYy0+c2Nhbl9wcm9ncmVzcyArPSBudW1fYnl0ZXM7CiAJaWYgKGFzeW5jLT5zY2FuX3Byb2dyZXNzID49IHNjYW5fbGVuZ3RoKSB7CkBAIC0zNiwxMiArNTUsMTMgQEAKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNmY19pbmNfc2Nhbl9wcm9ncmVzcyk7CiAKIC8qIFdyaXRlcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50cyB0byBjb21lZGkncyBidWZmZXIgKi8KLXVuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAordW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCiB7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKKwlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwogCXVuc2lnbmVkIGludCByZXR2YWw7CiAKIAlpZiAobnVtX2J5dGVzID09IDApCkBAIC00OSwyNCArNjksMjQgQEAKIAogCXJldHZhbCA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CiAJaWYgKHJldHZhbCAhPSBudW1fYnl0ZXMpIHsKLQkJZGV2X3dhcm4oc3ViZC0+ZGV2aWNlLT5jbGFzc19kZXYsICJjb21lZGk6IGJ1ZmZlciBvdmVycnVuXG4iKTsKKwkJZGV2X3dhcm4ocy0+ZGV2aWNlLT5jbGFzc19kZXYsICJidWZmZXIgb3ZlcnJ1blxuIik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm4gMDsKIAl9CiAKIAljb21lZGlfYnVmX21lbWNweV90byhhc3luYywgMCwgZGF0YSwgbnVtX2J5dGVzKTsKIAljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7Ci0JaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwljZmNfaW5jX3NjYW5fcHJvZ3Jlc3MocywgbnVtX2J5dGVzKTsKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAogCXJldHVybiBudW1fYnl0ZXM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKTsKIAotdW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAordW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQogewotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKIAogCWlmIChudW1fYnl0ZXMgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC03NCw3ICs5NCw3IEBACiAJbnVtX2J5dGVzID0gY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOwogCWNvbWVkaV9idWZfbWVtY3B5X2Zyb20oYXN5bmMsIDAsIGRhdGEsIG51bV9ieXRlcyk7CiAJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7Ci0JaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwljZmNfaW5jX3NjYW5fcHJvZ3Jlc3MocywgbnVtX2J5dGVzKTsKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAogCXJldHVybiBudW1fYnl0ZXM7CkBAIC04MiwzNCArMTAyLDMzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcik7CiAKIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXVuc2lnbmVkIGludCBldmVudHMgPSBzdWJkLT5hc3luYy0+ZXZlbnRzOworCXVuc2lnbmVkIGludCBldmVudHMgPSBzLT5hc3luYy0+ZXZlbnRzOwogCiAJaWYgKGV2ZW50cyA9PSAwKQogCQlyZXR1cm4gZXZlbnRzOwogCiAJaWYgKGV2ZW50cyAmIChDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX09WRVJGTE9XKSkKLQkJc3ViZC0+Y2FuY2VsKGRldiwgc3ViZCk7CisJCXMtPmNhbmNlbChkZXYsIHMpOwogCi0JY29tZWRpX2V2ZW50KGRldiwgc3ViZCk7CisJY29tZWRpX2V2ZW50KGRldiwgcyk7CiAKIAlyZXR1cm4gZXZlbnRzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2ZjX2hhbmRsZV9ldmVudHMpOwogCi1NT0RVTEVfQVVUSE9SKCJGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNoYXJlZCBmdW5jdGlvbnMgZm9yIENvbWVkaSBsb3ctbGV2ZWwgZHJpdmVycyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCiBzdGF0aWMgaW50IF9faW5pdCBjb21lZGlfZmNfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KK21vZHVsZV9pbml0KGNvbWVkaV9mY19pbml0X21vZHVsZSk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjb21lZGlfZmNfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIH0KLQotbW9kdWxlX2luaXQoY29tZWRpX2ZjX2luaXRfbW9kdWxlKTsKIG1vZHVsZV9leGl0KGNvbWVkaV9mY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2hhcmVkIGZ1bmN0aW9ucyBmb3IgQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKaW5kZXggODU1OGIwNy4uNTQxYjkzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaApAQCAtMSw3MiArMSw1MiBAQAogLyoKLSAgICBjb21lZGlfZmMuaAotCi0gICAgVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgotICAgIHR3byBvciBtb3JlIGRyaXZlcnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbWVhbnQgdG8gYmUgdXNlZCBvbmx5Ci0gICAgYnkgZHJpdmVycywgdGhleSBhcmUgTk9UIHBhcnQgb2YgdGhlIGtjb21lZGlsaWIgQVBJIQotCi0gICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KKyAqIGNvbWVkaV9mYy5oCisgKiBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCisgKiB0d28gb3IgbW9yZSBkcml2ZXJzLiBUaGVzZSBmdW5jdGlvbnMgYXJlIG1lYW50IHRvIGJlIHVzZWQgb25seQorICogYnkgZHJpdmVycywgdGhleSBhcmUgTk9UIHBhcnQgb2YgdGhlIGtjb21lZGlsaWIgQVBJIQorICoKKyAqIEF1dGhvcjogRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAjaWZuZGVmIF9DT01FRElfRkNfSAogI2RlZmluZSBfQ09NRURJX0ZDX0gKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0vKiBXcml0ZXMgYW4gYXJyYXkgb2YgZGF0YSBwb2ludHMgdG8gY29tZWRpJ3MgYnVmZmVyICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCi0JCQkJCSAgICAgIHZvaWQgKmRhdGEsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOwordW5zaWduZWQgaW50IGNmY19ieXRlc19wZXJfc2NhbihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKK3ZvaWQgY2ZjX2luY19zY2FuX3Byb2dyZXNzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorLyogV3JpdGVzIGFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIHRvIGNvbWVkaSdzIGJ1ZmZlciAqLwordW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCQkgICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY193cml0ZV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBkYXRhKQogewotCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogfTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2xvbmdfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlCi0JCQkJCQkgICAgKnN1YmQsIHVuc2lnbmVkIGludCBkYXRhKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2xvbmdfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCBkYXRhKQogewotCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogfTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKLQkJCQkJICAgICAgIHZvaWQgKmRhdGEsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3Vuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX2J5dGVzX3Blcl9zY2FuKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQotewotCWludCBudW1fc2FtcGxlczsKLQlpbnQgYml0c19wZXJfc2FtcGxlOwotCi0Jc3dpdGNoIChzdWJkLT50eXBlKSB7Ci0JY2FzZSBDT01FRElfU1VCRF9ESToKLQljYXNlIENPTUVESV9TVUJEX0RPOgotCWNhc2UgQ09NRURJX1NVQkRfRElPOgotCQliaXRzX3Blcl9zYW1wbGUgPSA4ICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKLQkJbnVtX3NhbXBsZXMgPSAoc3ViZC0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKwotCQkJICAgICAgIGJpdHNfcGVyX3NhbXBsZSAtIDEpIC8gYml0c19wZXJfc2FtcGxlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQludW1fc2FtcGxlcyA9IHN1YmQtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG51bV9zYW1wbGVzICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKLX0KK3Vuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOwogCiAvKioKICAqIGNmY19jaGVja190cmlnZ2VyX3NyYygpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgY29tZWRpX2NtZCB0cmlnZ2VyIHNvdXJjZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwppbmRleCBkNTM5ZWFmLi5jZDk1NjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwpAQCAtMTg1LDcgKzE4NSw2IEBACiAJICAgIChkZXZwcml2LT51c2VjX3JlbWFpbmRlciArIGVsYXBzZWRfdGltZSkgLyBkZXZwcml2LT5zY2FuX3BlcmlvZDsKIAlkZXZwcml2LT51c2VjX3JlbWFpbmRlciA9CiAJICAgIChkZXZwcml2LT51c2VjX3JlbWFpbmRlciArIGVsYXBzZWRfdGltZSkgJSBkZXZwcml2LT5zY2FuX3BlcmlvZDsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGNtZC0+c3RvcF9hcmcgLSBkZXZwcml2LT5haV9jb3VudDsKQEAgLTMxOCwxMiArMzE3LDggQEAKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKQogCQlkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCA9IDA7Ci0JZWxzZSBpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQorCWVsc2UJLyogVFJJR19USU1FUiAqLwogCQlkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCA9IGNtZC0+Y29udmVydF9hcmcgLyBuYW5vX3Blcl9taWNybzsKLQllbHNlIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgImJ1ZyBzZXR0aW5nIGNvbnZlcnNpb24gcGVyaW9kIik7Ci0JCXJldHVybiAtMTsKLQl9CiAKIAlkb19nZXR0aW1lb2ZkYXkoJmRldnByaXYtPmxhc3QpOwogCWRldnByaXYtPnVzZWNfY3VycmVudCA9IGRldnByaXYtPmxhc3QudHZfdXNlYyAlIGRldnByaXYtPnVzZWNfcGVyaW9kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwppbmRleCAzMjNhN2YzLi4wYTljMzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwpAQCAtOTIsOCArOTIsNiBAQAogCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+aW5zbl9iaXRzCT0gY29udGVjX2RvX2luc25fYml0czsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhYzAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFjMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ2ZTBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhYzAyLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBkYWMwMi5jCisgKiBDb21lZGkgZHJpdmVyIGZvciBEQUMwMiBjb21wYXRpYmxlIGJvYXJkcworICogQ29weXJpZ2h0IChDKSAyMDE0IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSBwb2MgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIERyaXZlcjogZGFjMDIKKyAqIERlc2NyaXB0aW9uOiBDb21lZGkgZHJpdmVyIGZvciBEQUMwMiBjb21wYXRpYmxlIGJvYXJkcworICogRGV2aWNlczogKEtlaXRobGV5IE1ldHJhYnl0ZSkgREFDLTAyIFtkYWMwMl0KKyAqIEF1dGhvcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKiBVcGRhdGVkOiBUdWUsIDExIE1hciAyMDE0IDExOjI3OjE5IC0wNzAwCisgKiBTdGF0dXM6IHVua25vd24KKyAqCisgKiBDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgKglbMF0gLSBJL08gcG9ydCBiYXNlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKy8qCisgKiBUaGUgb3V0cHV0IHJhbmdlIGlzIHNlbGVjdGVkIGJ5IGp1bXBlcmluZyBwaW5zIG9uIHRoZSBJL08gY29ubmVjdG9yLgorICoKKyAqCSAgICBSYW5nZSAgICAgIENoYW4gIyAgIEp1bXBlciBwaW5zICAgICAgICBPdXRwdXQKKyAqCS0tLS0tLS0tLS0tLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgIDAgdG8gNVYgICAgICAgMCAgICAgICAgMjEgdG8gMjIgICAgICAyNAorICoJICAgICAgICAgICAgICAgICAxICAgICAgICAxNSB0byAxNiAgICAgIDE4CisgKgkgICAwIHRvIDEwViAgICAgIDAgICAgICAgIDIwIHRvIDIyICAgICAgMjQKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgICAgMTQgdG8gMTYgICAgICAxOAorICoJICAgICsvLTVWICAgICAgICAwICAgICAgICAyMSB0byAyMiAgICAgIDIzCisgKgkgICAgICAgICAgICAgICAgIDEgICAgICAgIDE1IHRvIDE2ICAgICAgMTcKKyAqCSAgICArLy0xMFYgICAgICAgMCAgICAgICAgMjAgdG8gMjIgICAgICAyMworICoJICAgICAgICAgICAgICAgICAxICAgICAgICAxNCB0byAxNiAgICAgIDE3CisgKgkgIDQgdG8gMjBtQSAgICAgIDAgICAgICAgIDIxIHRvIDIyICAgICAgMjUKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgICAgMTUgdG8gMTYgICAgICAxOQorICoJQUMgcmVmZXJlbmNlICAgICAwICAgICAgSW4gb24gcGluIDIyICAgIDI0ICgyLXF1YWRyYW50KQorICoJICAgICAgICAgICAgICAgICAgICAgICAgSW4gb24gcGluIDIyICAgIDIzICg0LXF1YWRyYW50KQorICoJICAgICAgICAgICAgICAgICAxICAgICAgSW4gb24gcGluIDE2ICAgIDE4ICgyLXF1YWRyYW50KQorICoJICAgICAgICAgICAgICAgICAgICAgICAgSW4gb24gcGluIDE2ICAgIDE3ICg0LXF1YWRyYW50KQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgZGFzMDJfYW9fcmFuZ2VzID0geworCTYsIHsKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMTApLAorCQlCSVBfUkFOR0UoNSksCisJCUJJUF9SQU5HRSgxMCksCisJCVJBTkdFX21BKDQsIDIwKSwKKwkJUkFOR0VfZXh0KDAsIDEpCisJfQorfTsKKworc3RydWN0IGRhYzAyX3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKK307CisKKy8qCisgKiBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgREFDMDJfQU9fTFNCKHgpCQkoMHgwMCArICgoeCkgKiAyKSkKKyNkZWZpbmUgREFDMDJfQU9fTVNCKHgpCQkoMHgwMSArICgoeCkgKiAyKSkKKworc3RhdGljIGludCBkYWMwMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGFjMDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhW2ldOworCisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gdmFsOworCisJCS8qCisJCSAqIFVuaXBvbGFyIG91dHB1dHMgYXJlIHRydWUgYmluYXJ5IGVuY29kaW5nLgorCQkgKiBCaXBvbGFyIG91dHB1dHMgYXJlIGNvbXBsZW1lbnRhcnkgb2Zmc2V0IGJpbmFyeQorCQkgKiAodGhhdCBpcywgMCA9ICtmdWxsIHNjYWxlLCBtYXhkYXRhID0gLWZ1bGwgc2NhbGUpLgorCQkgKi8KKwkJaWYgKGNvbWVkaV9yYW5nZV9pc19iaXBvbGFyKHMsIHJhbmdlKSkKKwkJCXZhbCA9IHMtPm1heGRhdGEgLSB2YWw7CisKKwkJLyoKKwkJICogREFDcyBhcmUgZG91YmxlLWJ1ZmZlcmVkLgorCQkgKiBXcml0ZSBMU0IgdGhlbiBNU0IgdG8gbGF0Y2ggb3V0cHV0LgorCQkgKi8KKwkJb3V0YigodmFsIDw8IDQpICYgMHhmMCwgZGV2LT5pb2Jhc2UgKyBEQUMwMl9BT19MU0IoY2hhbikpOworCQlvdXRiKCh2YWwgPj4gNCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIERBQzAyX0FPX01TQihjaGFuKSk7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFjMDJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGFjMDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFjMDJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlzdHJ1Y3QgZGFjMDJfcHJpdmF0ZSAqZGV2cHJpdjsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0OworCisJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CisJaWYgKCFkZXZwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCAweDA4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQW5hbG9nIE91dHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSAyOworCXMtPm1heGRhdGEJPSAweDBmZmY7CisJcy0+cmFuZ2VfdGFibGUJPSAmZGFzMDJfYW9fcmFuZ2VzOworCXMtPmluc25fd3JpdGUJPSBkYWMwMl9hb19pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGRhYzAyX2FvX2luc25fcmVhZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgZGFjMDJfZHJpdmVyID0geworCS5kcml2ZXJfbmFtZQk9ICJkYWMwMiIsCisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuYXR0YWNoCQk9IGRhYzAyX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGNvbWVkaV9sZWdhY3lfZGV0YWNoLAorfTsKK21vZHVsZV9jb21lZGlfZHJpdmVyKGRhYzAyX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgZHJpdmVyIGZvciBEQUMwMiBjb21wYXRpYmxlIGJvYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCmluZGV4IGNlMTUzZmMuLmE4ZjYwMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKQEAgLTMzMywxNCArMzMzLDI4IEBACiAJd3JpdGVBY3FTY2FuTGlzdEVudHJ5KGRldiwgd29yZDMpOwogfQogCitzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9haV9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBkYXFib2FyZDIwMDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZHcoZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7CisJaWYgKHN0YXR1cyAmIGNvbnRleHQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZGFxYm9hcmQyMDAwX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGRhcWJvYXJkMjAwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB2YWw7Ci0JaW50IGdhaW4sIGNoYW4sIHRpbWVvdXQ7CisJaW50IGdhaW4sIGNoYW47CisJaW50IHJldDsKIAlpbnQgaTsKIAogCXdyaXRldyhEQVFCT0FSRDIwMDBfQWNxUmVzZXRTY2FuTGlzdEZpZm8gfApAQCAtMzY3LDI1ICszODEsMjQgQEAKIAkJLyogRW5hYmxlIHJlYWRpbmcgZnJvbSB0aGUgc2Nhbmxpc3QgRklGTyAqLwogCQl3cml0ZXcoREFRQk9BUkQyMDAwX1NlcVN0YXJ0U2Nhbkxpc3QsCiAJCSAgICAgICBkZXZwcml2LT5kYXEgKyBhY3FDb250cm9sKTsKLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQkJaWYgKHZhbCAmIERBUUJPQVJEMjAwMF9BY3FDb25maWdQaXBlRnVsbCkKLQkJCQlicmVhazsKLQkJCS8qIHVkZWxheSgyKTsgKi8KLQkJfQorCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFxYm9hcmQyMDAwX2FpX3N0YXR1cywKKwkJCQkgICAgIERBUUJPQVJEMjAwMF9BY3FDb25maWdQaXBlRnVsbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCXdyaXRldyhEQVFCT0FSRDIwMDBfQWRjUGFjZXJFbmFibGUsIGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMjA7IHRpbWVvdXQrKykgewotCQkJdmFsID0gcmVhZHcoZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7Ci0JCQlpZiAodmFsICYgREFRQk9BUkQyMDAwX0FjcUxvZ2ljU2Nhbm5pbmcpCi0JCQkJYnJlYWs7Ci0JCQkvKiB1ZGVsYXkoMik7ICovCi0JCX0KLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQkJaWYgKHZhbCAmIERBUUJPQVJEMjAwMF9BY3FSZXN1bHRzRklGT0hhc1ZhbGlkRGF0YSkKLQkJCQlicmVhazsKLQkJCS8qIHVkZWxheSgyKTsgKi8KLQkJfQorCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFxYm9hcmQyMDAwX2FpX3N0YXR1cywKKwkJCQkgICAgIERBUUJPQVJEMjAwMF9BY3FMb2dpY1NjYW5uaW5nKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXFib2FyZDIwMDBfYWlfc3RhdHVzLAorCQkJCSAgICAgREFRQk9BUkQyMDAwX0FjcVJlc3VsdHNGSUZPSGFzVmFsaWREYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJZGF0YVtpXSA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcVJlc3VsdHNGSUZPKTsKIAkJd3JpdGV3KERBUUJPQVJEMjAwMF9BZGNQYWNlckRpc2FibGUsIGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwogCQl3cml0ZXcoREFRQk9BUkQyMDAwX1NlcVN0b3BTY2FuTGlzdCwgZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7CkBAIC00MDksNiArNDIyLDIxIEBACiAJcmV0dXJuIGk7CiB9CiAKK3N0YXRpYyBpbnQgZGFxYm9hcmQyMDAwX2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGRhcWJvYXJkMjAwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmRhcSArIGRhY0NvbnRyb2wpOworCWlmICgoc3RhdHVzICYgKChjaGFuICsgMSkgKiAweDAwMTApKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtNDE2LDggKzQ0NCw3IEBACiB7CiAJc3RydWN0IGRhcWJvYXJkMjAwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgdGltZW91dDsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewpAQCAtNDMxLDEyICs0NTgsMTEgQEAKIAkJdWRlbGF5KDEwMDApOwogI2VuZGlmCiAJCXdyaXRldyhkYXRhW2ldLCBkZXZwcml2LT5kYXEgKyBkYWNTZXR0aW5nKGNoYW4pKTsKLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGRhY0NvbnRyb2wpOwotCQkJaWYgKCh2YWwgJiAoKGNoYW4gKyAxKSAqIDB4MDAxMCkpID09IDApCi0JCQkJYnJlYWs7Ci0JCQkvKiB1ZGVsYXkoMik7ICovCi0JCX0KKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhcWJvYXJkMjAwMF9hb19lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CiAjaWYgMAogCQkvKgpAQCAtNzM3LDkgKzc2Myw2IEBACiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzIGF0dGFjaGVkXG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYwppbmRleCBlNWMwZWU5Li5jNWUzNTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYwpAQCAtMjAxLDE3ICsyMDEsMjkgQEAKIAlkYXMwOF9wZ21fZ2Fpbmxpc3QsCiB9OwogCi0jZGVmaW5lIFRJTUVPVVQgMTAwMDAwCitzdGF0aWMgaW50IGRhczA4X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzA4X1NUQVRVUyk7CisJaWYgKChzdGF0dXMgJiBEQVMwOF9FT0MpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CiAKIHN0YXRpYyBpbnQgZGFzMDhfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBkYXMwOF9ib2FyZF9zdHJ1Y3QgKnRoaXNib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBkYXMwOF9wcml2YXRlX3N0cnVjdCAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaSwgbjsKKwlpbnQgbjsKIAlpbnQgY2hhbjsKIAlpbnQgcmFuZ2U7CiAJaW50IGxzYiwgbXNiOworCWludCByZXQ7CiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC0yNDQsMTQgKzI1NiwxMCBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0Yl9wKDAsIGRldi0+aW9iYXNlICsgREFTMDhfVFJJR18xMkJJVCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgREFTMDhfU1RBVFVTKSAmIERBUzA4X0VPQykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczA4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCW1zYiA9IGluYihkZXYtPmlvYmFzZSArIERBUzA4X01TQik7CiAJCWxzYiA9IGluYihkZXYtPmlvYmFzZSArIERBUzA4X0xTQik7CiAJCWlmICh0aGlzYm9hcmQtPmFpX2VuY29kaW5nID09IGRhczA4X2VuY29kZTEyKSB7CkBAIC01MjksOSArNTM3LDEwIEBACiAJcyA9ICZkZXYtPnN1YmRldmljZXNbNF07CiAJLyogODI1NSAqLwogCWlmICh0aGlzYm9hcmQtPmk4MjU1X29mZnNldCAhPSAwKSB7Ci0JCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCAodW5zaWduZWQgbG9uZykoZGV2LT5pb2Jhc2UgKwotCQkJCQkJCSAgICAgICB0aGlzYm9hcmQtPgotCQkJCQkJCSAgICAgICBpODI1NV9vZmZzZXQpKTsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsCisJCQkJICAgICAgIGRldi0+aW9iYXNlICsgdGhpc2JvYXJkLT5pODI1NV9vZmZzZXQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKaW5kZXggYTg0NDZjYS4uNmE3ZDY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKQEAgLTg1NiwxOCArODU2LDE3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGRhczE2X2FpX3dhaXRfZm9yX2NvbnYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBkYXMxNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBzdGF0dXM7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzE2X1NUQVRVU19SRUcpOwotCQlpZiAoIShzdGF0dXMgJiBEQVMxNl9TVEFUVVNfQlVTWSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNl9TVEFUVVNfUkVHKTsKKwlpZiAoKHN0YXR1cyAmIERBUzE2X1NUQVRVU19CVVNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGRhczE2X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtODk3LDcgKzg5Niw3IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXRiX3AoMCwgZGV2LT5pb2Jhc2UgKyBEQVMxNl9UUklHX1JFRyk7CiAKLQkJcmV0ID0gZGFzMTZfYWlfd2FpdF9mb3JfY29udihkZXYsIDEwMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczE2X2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYwppbmRleCBmZWU1ZmFjLi43NzkyMjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMKQEAgLTMzMSwxNCArMzMxLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGFzMTZtMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNk0xX0NTKTsKKwlpZiAoc3RhdHVzICYgSVJRREFUQSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkYXMxNm0xX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGRhczE2bTFfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGksIG47CisJaW50IHJldDsKKwlpbnQgbjsKIAlpbnQgYnl0ZTsKLQljb25zdCBpbnQgdGltZW91dCA9IDEwMDA7CiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgYW5kIGludGVybmFsIHBhY2VyICovCiAJZGV2cHJpdi0+Y29udHJvbF9zdGF0ZSAmPSB+SU5URSAmIH5QQUNFUl9NQVNLOwpAQCAtMzU2LDE0ICszNjksMTAgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UpOwogCi0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJCWlmIChpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNk0xX0NTKSAmIElSUURBVEEpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgInRpbWVvdXQiKTsKLQkJCXJldHVybiAtRVRJTUU7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXMxNm0xX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWRhdGFbbl0gPSBtdW5nZV9zYW1wbGUoaW53KGRldi0+aW9iYXNlKSk7CiAJfQogCkBAIC00MDcsNyArNDE2LDYgQEAKIAogCXMgPSBkZXYtPnJlYWRfc3ViZGV2OwogCWFzeW5jID0gcy0+YXN5bmM7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CiAJY21kID0gJmFzeW5jLT5jbWQ7CiAKIAkvKiAgZmlndXJlIG91dCBob3cgbWFueSBzYW1wbGVzIGFyZSBpbiBmaWZvICovCkBAIC00NDAsOCArNDQ4LDggQEAKIAlkZXZwcml2LT5hZGNfY291bnQgKz0gbnVtX3NhbXBsZXM7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWlmIChkZXZwcml2LT5hZGNfY291bnQgPj0gY21kLT5zdG9wX2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwotCQkJZGFzMTZtMV9jYW5jZWwoZGV2LCBzKTsKKwkJaWYgKGRldnByaXYtPmFkY19jb3VudCA+PSBjbWQtPnN0b3BfYXJnICogY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJCS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwogCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQl9CiAJfQpAQCAtNDQ5LDEzICs0NTcsMTEgQEAKIAkvKiB0aGlzIHByb2JhYmx5IHdvbid0IGNhdGNoIG92ZXJydW5zIHNpbmNlIHRoZSBjYXJkIGRvZXNuJ3QgZ2VuZXJhdGUKIAkgKiBvdmVycnVuIGludGVycnVwdHMsIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIHRyeSAqLwogCWlmIChzdGF0dXMgJiBPVlJVTikgewotCQlkYXMxNm0xX2NhbmNlbChkZXYsIHMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJmaWZvIG92ZXJmbG93Iik7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0KKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgaW50IGRhczE2bTFfcG9sbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jCmluZGV4IDMyMGQ5NWEuLjhlOTc1ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE4MDAuYwpAQCAtNjQ2LDcgKzY0Niw2IEBACiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZhc3luYy0+Y21kOwogCXVuc2lnbmVkIGludCBzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxODAwX1NUQVRVUyk7CiAKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAkvKiAgc2VsZWN0IGFkYyBmb3IgYmFzZSBhZGRyZXNzICsgMCAqLwogCW91dGIoQURDLCBkZXYtPmlvYmFzZSArIERBUzE4MDBfU0VMRUNUKTsKIAkvKiAgZG1hIGJ1ZmZlciBmdWxsICovCkBAIC02NjUsOSArNjY0LDggQEAKIAkJLyogIGNsZWFyIE9WRiBpbnRlcnJ1cHQgYml0ICovCiAJCW91dGIoQ0xFQVJfSU5UUl9NQVNLICYgfk9WRiwgZGV2LT5pb2Jhc2UgKyBEQVMxODAwX1NUQVRVUyk7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJEQVMxODAwIEZJRk8gb3ZlcmZsb3ciKTsKLQkJZGFzMTgwMF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIAkvKiAgc3RvcCB0YWtpbmcgZGF0YSBpZiBhcHByb3ByaWF0ZSAqLwpAQCAtNjgwLDE2ICs2NzgsMTIgQEAKIAkJCWRhczE4MDBfZmx1c2hfZG1hKGRldiwgcyk7CiAJCWVsc2UKIAkJCWRhczE4MDBfaGFuZGxlX2ZpZm9fbm90X2VtcHR5KGRldiwgcyk7Ci0JCWRhczE4MDBfY2FuY2VsKGRldiwgcyk7CS8qIGRpc2FibGUgaGFyZHdhcmUgY29udmVyc2lvbnMgKi8KIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmIGRldnByaXYtPmNvdW50ID09IDApIHsJLyogIHN0b3Bfc3JjIFRSSUdfQ09VTlQgKi8KLQkJZGFzMTgwMF9jYW5jZWwoZGV2LCBzKTsJLyogZGlzYWJsZSBoYXJkd2FyZSBjb252ZXJzaW9ucyAqLwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0KLQlyZXR1cm47CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIGludCBkYXMxODAwX2FpX3BvbGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCmluZGV4IDQzMDI3ZWUuLmUwY2ZiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYwpAQCAtMSwzMDkgKzEsNTMyIEBACiAvKgotICAgU29tZSBjb21tZW50cyBvbiB0aGUgY29kZS4uCi0KLSAgIC0gaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB0byB1c2Ugb3V0Yl9wKCkuCi0KLSAgIC0gaWdub3JlaXJxIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbi4gIEl0IG5lZWRzIHRvIGJlIGZpeGVkLgotCisgKiBkYXM2NDAyLmMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIERBUzY0MDIgY29tcGF0aWJsZSBib2FyZHMKKyAqIENvcHlyaWdodChjKSAyMDE0IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICoKKyAqIFJld3JpdGUgb2YgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBieToKKyAqIENvcHlyaWdodCAoQykgMTk5OSBPeXN0ZWluIFN2ZW5kc2VuIDxzdmVuZHNlbkBwdnYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCiAvKgotICAgY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCi0gICBBbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciBDb21wdXRlcmJvYXJkcycgREFTNjQwMiBJL08gY2FyZAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgT3lzdGVpbiBTdmVuZHNlbiA8c3ZlbmRzZW5AcHZ2Lm9yZz4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIERyaXZlcjogZGFzNjQwMgorICogRGVzY3JpcHRpb246IEtlaXRobGV5IE1ldHJhYnl0ZSBEQVM2NDAyICgmIGNvbXBhdGlibGVzKQorICogRGV2aWNlczogKEtlaXRobGV5IE1ldHJhYnl0ZSkgREFTNjQwMi0xMiAoZGFzNjQwMi0xMikKKyAqCSAgICAoS2VpdGhsZXkgTWV0cmFieXRlKSBEQVM2NDAyLTE2IChkYXM2NDAyLTE2KQorICogQXV0aG9yOiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqIFVwZGF0ZWQ6IEZyaSwgMTQgTWFyIDIwMTQgMTA6MTg6NDMgLTA3MDAKKyAqIFN0YXR1czogdW5rbm93bgorICoKKyAqIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAqICAgWzBdIC0gSS9PIGJhc2UgYWRkcmVzcworICogICBbMV0gLSBJUlEgKG9wdGlvbmFsLCBuZWVkZWQgZm9yIGFzeW5jIGNvbW1hbmQgc3VwcG9ydCkKICAqLwotLyoKLURyaXZlcjogZGFzNjQwMgotRGVzY3JpcHRpb246IEtlaXRobGV5IE1ldHJhYnl0ZSBEQVM2NDAyICgmIGNvbXBhdGlibGVzKQotQXV0aG9yOiBPeXN0ZWluIFN2ZW5kc2VuIDxzdmVuZHNlbkBwdnYub3JnPgotU3RhdHVzOiBiaXRyb3R0ZW4KLURldmljZXM6IFtLZWl0aGxleSBNZXRyYWJ5dGVdIERBUzY0MDIgKGRhczY0MDIpCi0KLVRoaXMgZHJpdmVyIGhhcyBzdWZmZXJlZCBiaXRyb3QuCi0qLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICI4MjUzLmgiCiAKLSNkZWZpbmUgREFTNjQwMl9TSVpFIDE2CisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIERBUzY0MDJfQUlfREFUQV9SRUcJCTB4MDAKKyNkZWZpbmUgREFTNjQwMl9BSV9NVVhfUkVHCQkweDAyCisjZGVmaW5lIERBUzY0MDJfQUlfTVVYX0xPKHgpCQkoKCh4KSAmIDB4M2YpIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQUlfTVVYX0hJKHgpCQkoKCh4KSAmIDB4M2YpIDw8IDgpCisjZGVmaW5lIERBUzY0MDJfRElfRE9fUkVHCQkweDAzCisjZGVmaW5lIERBUzY0MDJfQU9fREFUQV9SRUcoeCkJCSgweDA0ICsgKCh4KSAqIDIpKQorI2RlZmluZSBEQVM2NDAyX0FPX0xTQl9SRUcoeCkJCSgweDA0ICsgKCh4KSAqIDIpKQorI2RlZmluZSBEQVM2NDAyX0FPX01TQl9SRUcoeCkJCSgweDA1ICsgKCh4KSAqIDIpKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19SRUcJCTB4MDgKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfRkZORQkJKDEgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfRkhBTEYJCSgxIDw8IDEpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX0ZGVUxMCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19YSU5UCQkoMSA8PCAzKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19JTlQJCSgxIDw8IDQpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1hUUklHCQkoMSA8PCA1KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19JTkRHVAkJKDEgPDwgNikKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfMTBNSFoJCSgxIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfQ0xSSU5UCQkoMSA8PCAwKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX0NMUlhUUgkJKDEgPDwgMSkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfV19DTFJYSU4JCSgxIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfRVhURU5ECQkoMSA8PCA0KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX0FSTUVECQkoMSA8PCA1KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX1BPU1RNT0RFCSgxIDw8IDYpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfMTBNSFoJCSgxIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9SRUcJCTB4MDkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX1NPRlRfVFJJRwkJKDAgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX0VYVF9GQUxMX1RSSUcJKDEgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX0VYVF9SSVNFX1RSSUcJKDIgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX1BBQ0VSX1RSSUcJCSgzIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9CVVJTVEVOCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX0NUUkxfWElOVEUJCSgxIDw8IDMpCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9JUlEoeCkJCSgoeCkgPDwgNCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX0lOVEUJCSgxIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfVFJJR19SRUcJCTB4MGEKKyNkZWZpbmUgREFTNjQwMl9UUklHX1RHRU4JCSgxIDw8IDApCisjZGVmaW5lIERBUzY0MDJfVFJJR19UR1NFTAkJKDEgPDwgMSkKKyNkZWZpbmUgREFTNjQwMl9UUklHX1RHUE9MCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX1RSSUdfUFJFVFJJRwkJKDEgPDwgMykKKyNkZWZpbmUgREFTNjQwMl9BT19SQU5HRShfY2hhbiwgX3JhbmdlKQkoKF9yYW5nZSkgPDwgKChfY2hhbikgPyA2IDogNCkpCisjZGVmaW5lIERBUzY0MDJfQU9fUkFOR0VfTUFTSyhfY2hhbikJKDMgPDwgKChfY2hhbikgPyA2IDogNCkpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9SRUcJCTB4MGIKKyNkZWZpbmUgREFTNjQwMl9NT0RFX1JBTkdFKHgpCQkoKHgpIDw8IDApCisjZGVmaW5lIERBUzY0MDJfTU9ERV9QT0xMRUQJCSgwIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9GSUZPTkVQVFkJCSgxIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9GSUZPSEZVTEwJCSgyIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9FT0IJCSgzIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9FTkhBTkNFRAkJKDEgPDwgNCkKKyNkZWZpbmUgREFTNjQwMl9NT0RFX1NFCQkJKDEgPDwgNSkKKyNkZWZpbmUgREFTNjQwMl9NT0RFX1VOSQkJKDEgPDwgNikKKyNkZWZpbmUgREFTNjQwMl9NT0RFX0RNQTEJCSgwIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9ETUEzCQkoMSA8PCA3KQorI2RlZmluZSBEQVM2NDAyX1RJTUVSX0JBU0UJCTB4MGMKIAotI2RlZmluZSBOX1dPUkRTICgzMDAwKjY0KQotCi0jZGVmaW5lIFNUT1AgICAgMAotI2RlZmluZSBTVEFSVCAgIDEKLQotI2RlZmluZSBTQ0FOTCAweDNmMDAKLSNkZWZpbmUgQllURSB1bnNpZ25lZCBjaGFyCi0jZGVmaW5lIFdPUkQgdW5zaWduZWQgc2hvcnQKLQotLyotLS0tLSByZWdpc3RlciA4IC0tLS0qLwotI2RlZmluZSBDTFJJTlQgMHgwMQotI2RlZmluZSBDTFJYVFIgMHgwMgotI2RlZmluZSBDTFJYSU4gMHgwNAotI2RlZmluZSBFWFRFTkQgMHgxMAotI2RlZmluZSBBUk1FRCAweDIwCQkvKiBlbmFibGUgY29udGluZyBvZiBwb3N0IHNhbXBsZSBjb252ICovCi0jZGVmaW5lIFBPU1RNT0RFIDB4NDAKLSNkZWZpbmUgTUhaIDB4ODAJCS8qIDEwIE1IeiBjbG9jayAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tIHJlZ2lzdGVyIDkgLS0tLSovCi0jZGVmaW5lIElSUSAoMHgwNCA8PCA0KQkJLyogdGhlc2UgdHdvIGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJUlFWIDEwCQkJLyogICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gZWFjaCBvdGhlciAqLwotCi0jZGVmaW5lIENPTlZTUkMgMHgwMwkJLyogdHJpZyBzcmMgaXMgSW50YXJuYWwgcGFjZXIgKi8KLSNkZWZpbmUgQlVSU1RFTiAweDA0CQkvKiBlbmFibGUgYnVyc3QgKi8KLSNkZWZpbmUgWElOVEUgMHgwOAkJLyogdXNlIGV4dGVybmFsIGludC4gdHJpZyAqLwotI2RlZmluZSBJTlRFIDB4ODAJCS8qIGVuYWJsZSBhbmFsb2cgaW50ZXJydXB0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tIHJlZ2lzdGVyIDEwIC0tLSovCi0jZGVmaW5lIFRHRU4gMHgwMQkJLyogVXNlIHBpbiBESTEgZm9yIGV4dGVybmwgdHJpZ2dpbmc/ICovCi0jZGVmaW5lIFRHU0VMIDB4MDIJCS8qIFVzZSBlZGdlIHRyaWdnZXJpbmcgKi8KLSNkZWZpbmUgVEdQT0wgMHgwNAkJLyogYWN0aXZlIGVkZ2UgaXMgZmFsbGluZyAqLwotI2RlZmluZSBQUkVUUklHIDB4MDgJCS8qIHByZXRyaWcgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLSByZWdpc3RlciAxMSAtLS0qLwotI2RlZmluZSBFT0IgMHgwYwotI2RlZmluZSBGSUZPSEZVTEwgMHgwOAotI2RlZmluZSBHQUlOIDB4MDEKLSNkZWZpbmUgRklGT05FUFRZIDB4MDQKLSNkZWZpbmUgTU9ERSAweDEwCi0jZGVmaW5lIFNFTSAweDIwCi0jZGVmaW5lIEJJUCAweDQwCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTTAgMHgwMAotI2RlZmluZSBNMiAweDA0Ci0KLSNkZWZpbmUJQzAgMHgwMAotI2RlZmluZQlDMSAweDQwCi0jZGVmaW5lCUMyIDB4ODAKLSNkZWZpbmUJUldMSCAweDMwCi0KLXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgewotCWludCBhaV9ieXRlc190b19yZWFkOwotCi0JaW50IGRhczY0MDJfaWdub3JlaXJxOworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIGRhczY0MDJfYWlfcmFuZ2VzID0geworCTgsIHsKKwkJQklQX1JBTkdFKDEwKSwKKwkJQklQX1JBTkdFKDUpLAorCQlCSVBfUkFOR0UoMi41KSwKKwkJQklQX1JBTkdFKDEuMjUpLAorCQlVTklfUkFOR0UoMTApLAorCQlVTklfUkFOR0UoNSksCisJCVVOSV9SQU5HRSgyLjUpLAorCQlVTklfUkFOR0UoMS4yNSkKKwl9CiB9OwogCi1zdGF0aWMgdm9pZCBkYXM2NDAyX2FpX2ZpZm9fZHJlZ3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorLyoKKyAqIEFuYWxvZyBvdXRwdXQgcmFuZ2VzIGFyZSBwcm9ncmFtbWFibGUgb24gdGhlIERBUzY0MDIvMTIuCisgKiBGb3IgdGhlIERBUzY0MDIvMTYgdGhlIHJhbmdlIGJpdHMgaGF2ZSBubyBmdW5jdGlvbiwgdGhlCisgKiBEQUMgcmFuZ2VzIGFyZSBzZWxlY3RlZCBieSBzd2l0Y2hlcyBvbiB0aGUgYm9hcmQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSBkYXM2NDAyX2FvX3JhbmdlcyA9IHsKKwk0LCB7CisJCUJJUF9SQU5HRSg1KSwKKwkJQklQX1JBTkdFKDEwKSwKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMTApCisJfQorfTsKKworc3RydWN0IGRhczY0MDJfYm9hcmRpbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBtYXhkYXRhOworfTsKKworc3RydWN0IGRhczY0MDJfYm9hcmRpbmZvIGRhczY0MDJfYm9hcmRzW10gPSB7CisJeworCQkubmFtZQkJPSAiZGFzNjQwMi0xMiIsCisJCS5tYXhkYXRhCT0gMHgwZmZmLAorCX0sIHsKKwkJLm5hbWUJCT0gImRhczY0MDItMTYiLAorCQkubWF4ZGF0YQk9IDB4ZmZmZiwKKwl9LAorfTsKKworc3RydWN0IGRhczY0MDJfcHJpdmF0ZSB7CisJdW5zaWduZWQgaW50IGlycTsKKworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgZGl2aWRlcjE7CisJdW5zaWduZWQgaW50IGRpdmlkZXIyOworCisJdW5zaWduZWQgaW50IGFvX3JhbmdlOworCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKK307CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfc2V0X21vZGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgdW5zaWduZWQgaW50IG1vZGUpCiB7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgOCkgJiAweDAxKSkKLQkJCXJldHVybjsKLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGludyhkZXYtPmlvYmFzZSkpOworCW91dGIoREFTNjQwMl9NT0RFX0VOSEFOQ0VEIHwgbW9kZSwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX01PREVfUkVHKTsKK30KKworc3RhdGljIHZvaWQgZGFzNjQwMl9zZXRfZXh0ZW5kZWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlvdXRiKERBUzY0MDJfU1RBVFVTX1dfRVhURU5ELCBkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7CisJb3V0YihEQVM2NDAyX1NUQVRVU19XX0VYVEVORCB8IHZhbCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworCW91dGIodmFsLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfY2xlYXJfYWxsX2ludGVycnVwdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlvdXRiKERBUzY0MDJfU1RBVFVTX1dfQ0xSSU5UIHwKKwkgICAgIERBUzY0MDJfU1RBVFVTX1dfQ0xSWFRSIHwKKwkgICAgIERBUzY0MDJfU1RBVFVTX1dfQ0xSWElOLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfYWlfY2xlYXJfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJb3V0YihEQVM2NDAyX1NUQVRVU19XX0NMUklOVCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX2VuYWJsZV9jb3VudGVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZCkKK3sKKwlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgdGltZXJfaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RJTUVSX0JBU0U7CisKKwlpZiAobG9hZCkgeworCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCisJCWk4MjU0X3dyaXRlKHRpbWVyX2lvYmFzZSwgMCwgMCwgZGV2cHJpdi0+Y291bnQpOworCQlpODI1NF93cml0ZSh0aW1lcl9pb2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlkZXIxKTsKKwkJaTgyNTRfd3JpdGUodGltZXJfaW9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpZGVyMik7CisKKwl9IGVsc2UgeworCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgZGFzNjQwMl9zZXRjb3VudGVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0JQllURSBwOwotCXVuc2lnbmVkIHNob3J0IGN0cmx3cmQ7Ci0KLQkvKiBzZXQgdXAgY291bnRlcjAgZmlyc3QsIG1vZGUgMCAqLwotCXAgPSBNMCB8IEMwIHwgUldMSDsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxNSk7Ci0JY3RybHdyZCA9IDIwMDA7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIGN0cmx3cmQpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEyKTsKLQlwID0gKEJZVEUpICgweGZmICYgKGN0cmx3cmQgPj4gOCkpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEyKTsKLQotCS8qIHNldCB1cCBjb3VudGVyMSwgbW9kZSAyICovCi0JcCA9IE0yIHwgQzEgfCBSV0xIOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDE1KTsKLQljdHJsd3JkID0gMTA7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIGN0cmx3cmQpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEzKTsKLQlwID0gKEJZVEUpICgweGZmICYgKGN0cmx3cmQgPj4gOCkpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEzKTsKLQotCS8qIHNldCB1cCBjb3VudGVyMSwgbW9kZSAyICovCi0JcCA9IE0yIHwgQzIgfCBSV0xIOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDE1KTsKLQljdHJsd3JkID0gMTAwMDsKLQlwID0gKEJZVEUpICgweGZmICYgY3RybHdyZCk7Ci0Jb3V0Yl9wKHAsIGRldi0+aW9iYXNlICsgMTQpOwotCXAgPSAoQllURSkgKDB4ZmYgJiAoY3RybHdyZCA+PiA4KSk7Ci0Jb3V0Yl9wKHAsIGRldi0+aW9iYXNlICsgMTQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgaXJxcmV0dXJuX3QgZGFzNjQwMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKIAotCWlmICghZGV2LT5hdHRhY2hlZCB8fCBkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSkgewotCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwgIkJVRzogc3B1cmlvdXMgaW50ZXJydXB0XG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KKwlkYXM2NDAyX2NsZWFyX2FsbF9pbnRlcnJ1cHRzKGRldik7CiAKLQlkYXM2NDAyX2FpX2ZpZm9fZHJlZ3MoZGV2LCBzKTsKLQotCWlmIChzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50ID49IGRldnByaXYtPmFpX2J5dGVzX3RvX3JlYWQpIHsKLQkJb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiBjbGVhcnMgdGhlIGZpZm8gKi8KLQkJb3V0YigweDA3LCBkZXYtPmlvYmFzZSArIDgpOwkvKiBjbGVhcnMgYWxsIGZsaXAtZmxvcHMgKi8KLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQl9Ci0KLQlvdXRiKDB4MDEsIGRldi0+aW9iYXNlICsgOCk7CS8qIGNsZWFyIG9ubHkgdGhlIGludGVycnVwdCBmbGlwLWZsb3AgKi8KLQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkIGRhczY0MDJfYWlfZmlmb19yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHNob3J0ICpkYXRhLCBpbnQgbikKK3N0YXRpYyBpbnQgZGFzNjQwMl9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlkYXRhW2ldID0gaW53KGRldi0+aW9iYXNlKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KLSNlbmRpZgorCitzdGF0aWMgaW50IGRhczY0MDJfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQoreworCXJldHVybiAtRUlOVkFMOworfQogCiBzdGF0aWMgaW50IGRhczY0MDJfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogeworCW91dGIoREFTNjQwMl9DVFJMX1NPRlRfVFJJRywgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0NUUkxfUkVHKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX2FpX3NvZnRfdHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FJX0RBVEFfUkVHKTsKK30KKworc3RhdGljIGludCBkYXM2NDAyX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIERBUzY0MDJfU1RBVFVTX0ZGTkUpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCWludCBpOworCisJdmFsID0gREFTNjQwMl9NT0RFX1JBTkdFKHJhbmdlKSB8IERBUzY0MDJfTU9ERV9QT0xMRUQ7CisJaWYgKGFyZWYgPT0gQVJFRl9ESUZGKSB7CisJCWlmIChjaGFuID4gcy0+bl9jaGFuIC8gMikKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXZhbCB8PSBEQVM2NDAyX01PREVfU0U7CisJfQorCWlmIChjb21lZGlfcmFuZ2VfaXNfdW5pcG9sYXIocywgcmFuZ2UpKQorCQl2YWwgfD0gREFTNjQwMl9NT0RFX1VOSTsKKworCS8qIGVuYWJsZSBzb2Z0d2FyZSBjb252ZXJzaW9uIHRyaWdnZXIgKi8KKwlvdXRiKERBUzY0MDJfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgREFTNjQwMl9DVFJMX1JFRyk7CisKKwlkYXM2NDAyX3NldF9tb2RlKGRldiwgdmFsKTsKKworCS8qIGxvYWQgdGhlIG11eCBmb3Igc2luZ2xlIGNoYW5uZWwgY29udmVyc2lvbiAqLworCW91dHcoREFTNjQwMl9BSV9NVVhfSEkoY2hhbikgfCBEQVM2NDAyX0FJX01VWF9MTyhjaGFuKSwKKwkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BSV9NVVhfUkVHKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGFzNjQwMl9haV9jbGVhcl9lb2MoZGV2KTsKKwkJZGFzNjQwMl9haV9zb2Z0X3RyaWcoZGV2KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczY0MDJfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXZhbCA9IGludyhkZXYtPmlvYmFzZSArIERBUzY0MDJfQUlfREFUQV9SRUcpOworCisJCWlmIChzLT5tYXhkYXRhID09IDB4MGZmZikKKwkJCXZhbCA+Pj0gNDsKKworCQlkYXRhW2ldID0gdmFsOworCX0KKworCWRhczY0MDJfYWlfY2xlYXJfZW9jKGRldik7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBkYXM2NDAyX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorewogCXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKworCS8qIHNldCB0aGUgcmFuZ2UgZm9yIHRoaXMgY2hhbm5lbCAqLworCXZhbCA9IGRldnByaXYtPmFvX3JhbmdlOworCXZhbCAmPSB+REFTNjQwMl9BT19SQU5HRV9NQVNLKGNoYW4pOworCXZhbCB8PSBEQVM2NDAyX0FPX1JBTkdFKGNoYW4sIHJhbmdlKTsKKwlpZiAodmFsICE9IGRldnByaXYtPmFvX3JhbmdlKSB7CisJCWRldnByaXYtPmFvX3JhbmdlID0gdmFsOworCQlvdXRiKHZhbCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RSSUdfUkVHKTsKKwl9CiAKIAkvKgotCSAqICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXNldCB0aGUgYm9hcmQgZnJvbSB3aGF0ZXZlciBjb25kaXRpb24gaXQKLQkgKiAgaXMgaW4gKGkuZS4sIGFjcXVpcmluZyBkYXRhKSwgdG8gYSBub24tYWN0aXZlIHN0YXRlLgorCSAqIFRoZSBEQVM2NDAyLzE2IGhhcyBhIGp1bXBlciB0byBzZWxlY3QgZWl0aGVyIGluZGl2aWR1YWwKKwkgKiB1cGRhdGUgKFVQREFURSkgb3Igc2ltdWx0YW5lb3VzIHVwZGF0aW5nIChYRkVSKSBvZiBib3RoCisJICogREFDJ3MuIEluIFVQREFURSBtb2RlLCB3aGVuIHRoZSBNU0IgaXMgd3JpdHRlbiwgdGhhdCBEQUMKKwkgKiBpcyB1cGRhdGVkLiBJbiBYRkVSIG1vZGUsIGFmdGVyIGJvdGggREFDJ3MgYXJlIGxvYWRlZCwKKwkgKiBhIHJlYWQgY3ljbGUgb2YgYW55IERBQyByZWdpc3RlciB3aWxsIHVwZGF0ZSBib3RoIERBQydzCisJICogc2ltdWx0YW5lb3VzbHkuCisJICoKKwkgKiBJZiB5b3UgaGF2ZSBYRkVSIG1vZGUgZW5hYmxlZCBhICgqaW5zbl9yZWFkKSB3aWxsIG5lZWQKKwkgKiB0byBiZSBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBEQUMncyB3aXRoIHRoZQorCSAqIGxhc3QgdmFsdWUgd3JpdHRlbi4KIAkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXZhbCA9IGRhdGFbaV07CiAKLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDE7Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIlN0b3BwaW5nIGFjcXVpc2l0aW9uXG4iKTsKLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDE7Ci0Jb3V0Yl9wKDB4MDIsIGRldi0+aW9iYXNlICsgMTApOwkvKiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnaW5nICovCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiByZXNldHMgdGhlIGNhcmQgZmlmbyAqLwotCW91dGJfcCgwLCBkZXYtPmlvYmFzZSArIDkpOwkvKiBkaXNhYmxlcyBpbnRlcnJ1cHRzICovCisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gdmFsOwogCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOworCQlpZiAocy0+bWF4ZGF0YSA9PSAweDBmZmYpIHsKKwkJCS8qCisJCQkgKiBEQVM2NDAyLzEyIGhhcyB0aGUgdHdvIDgtYml0IERBQyByZWdpc3RlcnMsIGxlZnQKKwkJCSAqIGp1c3RpZmllZCAodGhlIDQgTFNCIGJpdHMgYXJlIGRvbid0IGNhcmUpLiBEYXRhCisJCQkgKiBjYW4gYmUgd3JpdHRlbiBhcyBvbmUgd29yZC4KKwkJCSAqLworCQkJdmFsIDw8PSA0OworCQkJb3V0dyh2YWwsIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19EQVRBX1JFRyhjaGFuKSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogREFTNjQwMi8xNiB1c2VzIGJvdGggOC1iaXQgREFDIHJlZ2lzdGVycyBhbmQgbmVlZHMKKwkJCSAqIHRvIGJlIHdyaXR0ZW4gTFNCIHRoZW4gTVNCLgorCQkJICovCisJCQlvdXRiKHZhbCAmIDB4ZmYsCisJCQkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKGNoYW4pKTsKKwkJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZmYsCisJCQkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKGNoYW4pKTsKKwkJfQorCX0KIAotCXJldHVybiAwOworCXJldHVybiBpbnNuLT5uOwogfQogCi0jaWZkZWYgdW51c2VkCi1zdGF0aWMgaW50IGRhczY0MDJfYWlfbW9kZTIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgY29tZWRpX3RyaWcgKml0KQorc3RhdGljIGludCBkYXM2NDAyX2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJLyoKKwkgKiBJZiBYRkVSIG1vZGUgaXMgZW5hYmxlZCwgcmVhZGluZyBhbnkgREFDIHJlZ2lzdGVyCisJICogd2lsbCB1cGRhdGUgYm90aCBEQUMncyBzaW11bHRhbmVvdXNseS4KKwkgKi8KKwlpbncoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0xTQl9SRUcoY2hhbikpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0RJX0RPX1JFRyk7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBkYXM2NDAyX2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKQorCQlvdXRiKHMtPnN0YXRlLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfRElfRE9fUkVHKTsKKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCWRldnByaXYtPmRhczY0MDJfaWdub3JlaXJxID0gMTsKLQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiU3RhcnRpbmcgYWNxdWlzaXRpb25cbiIpOwotCW91dGJfcCgweDAzLCBkZXYtPmlvYmFzZSArIDEwKTsJLyogZW5hYmxlIGV4dGVybmFsIHRyaWdnaW5nICovCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiByZXNldHMgdGhlIGNhcmQgZmlmbyAqLwotCW91dGJfcChJUlEgfCBDT05WU1JDIHwgQlVSU1RFTiB8IElOVEUsIGRldi0+aW9iYXNlICsgOSk7CisJLyogZW5hYmxlICJFbmhhbmNlZCIgbW9kZSAqLworCW91dGIoREFTNjQwMl9NT0RFX0VOSEFOQ0VELCBkZXYtPmlvYmFzZSArIERBUzY0MDJfTU9ERV9SRUcpOwogCi0JZGV2cHJpdi0+YWlfYnl0ZXNfdG9fcmVhZCA9IGl0LT5uICogc2l6ZW9mKHNob3J0KTsKKwkvKiBlbmFibGUgMTBNSHogcGFjZXIgY2xvY2sgKi8KKwlkYXM2NDAyX3NldF9leHRlbmRlZChkZXYsIERBUzY0MDJfU1RBVFVTX1dfMTBNSFopOwogCi0JLyogdW0uLi4gaWdub3JlaXJxIGlzIGEgbmFzdHkgcmFjZSBjb25kaXRpb24gKi8KLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDA7CisJLyogZW5hYmxlIHNvZnR3YXJlIGNvbnZlcnNpb24gdHJpZ2dlciAqLworCW91dGIoREFTNjQwMl9DVFJMX1NPRlRfVFJJRywgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0NUUkxfUkVHKTsKIAotCW91dHdfcChTQ0FOTCwgZGV2LT5pb2Jhc2UgKyAyKTsKKwkvKiBkZWZhdWx0IEFEQyB0byBzaW5nbGUtZW5kZWQgdW5pcG9sYXIgMTBWIGlucHV0cyAqLworCWRhczY0MDJfc2V0X21vZGUoZGV2LCBEQVM2NDAyX01PREVfUkFOR0UoMCkgfAorCQkJICAgICAgREFTNjQwMl9NT0RFX1BPTExFRCB8CisJCQkgICAgICBEQVM2NDAyX01PREVfU0UgfAorCQkJICAgICAgREFTNjQwMl9NT0RFX1VOSSk7CiAKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgorCS8qIGRlZmF1bHQgbXV4IGZvciBzaW5nbGUgY2hhbm5lbCBjb252ZXJzaW9uIChjaGFubmVsIDApICovCisJb3V0dyhEQVM2NDAyX0FJX01VWF9ISSgwKSB8IERBUzY0MDJfQUlfTVVYX0xPKDApLAorCSAgICAgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FJX01VWF9SRUcpOwogCi1zdGF0aWMgaW50IGJvYXJkX2luaXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCUJZVEUgYjsKKwkvKiBzZXQgYm90aCBEQUMncyBmb3IgdW5pcG9sYXIgNVYgb3V0cHV0IHJhbmdlICovCisJZGV2cHJpdi0+YW9fcmFuZ2UgPSBEQVM2NDAyX0FPX1JBTkdFKDAsIDIpIHwgREFTNjQwMl9BT19SQU5HRSgxLCAyKTsKKwlvdXRiKGRldnByaXYtPmFvX3JhbmdlLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfVFJJR19SRUcpOwogCi0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAxOworCS8qIHNldCBib3RoIERBQydzIHRvIDBWICovCisJb3V0dygwLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fREFUQV9SRUcoMCkpOworCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0RBVEFfUkVHKDApKTsKKwlpbncoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0xTQl9SRUcoMCkpOwogCi0Jb3V0YigweDA3LCBkZXYtPmlvYmFzZSArIDgpOworCWRhczY0MDJfZW5hYmxlX2NvdW50ZXIoZGV2LCBmYWxzZSk7CiAKLQkvKiByZWdpc3RlciAxMSAgKi8KLQlvdXRiX3AoTU9ERSwgZGV2LT5pb2Jhc2UgKyAxMSk7Ci0JYiA9IEJJUCB8IFNFTSB8IE1PREUgfCBHQUlOIHwgRklGT0hGVUxMOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDExKTsKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTNjQwMl9ESV9ET19SRUcpOwogCi0JLyogcmVnaXN0ZXIgOCAgICovCi0Jb3V0Yl9wKEVYVEVORCwgZGV2LT5pb2Jhc2UgKyA4KTsKLQliID0gRVhURU5EIHwgTUhaOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDgpOwotCWIgPSBNSFogfCBDTFJJTlQgfCBDTFJYVFIgfCBDTFJYSU47Ci0Jb3V0Yl9wKGIsIGRldi0+aW9iYXNlICsgOCk7Ci0KLQkvKiByZWdpc3RlciA5ICAgICovCi0JYiA9IElSUSB8IENPTlZTUkMgfCBCVVJTVEVOIHwgSU5URTsKLQlvdXRiX3AoYiwgZGV2LT5pb2Jhc2UgKyA5KTsKLQotCS8qIHJlZ2lzdGVyIDEwICAgKi8KLQliID0gVEdTRUwgfCBUR0VOOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDEwKTsKLQotCWIgPSAweDA3OwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDgpOwotCi0JZGFzNjQwMl9zZXRjb3VudGVyKGRldik7Ci0KLQlvdXR3X3AoU0NBTkwsIGRldi0+aW9iYXNlICsgMik7CS8qIHJlc2V0IGNhcmQgZmlmbyAqLwotCi0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAwOwotCi0JcmV0dXJuIDA7CisJZGFzNjQwMl9jbGVhcl9hbGxfaW50ZXJydXB0cyhkZXYpOwogfQogCiBzdGF0aWMgaW50IGRhczY0MDJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKKwljb25zdCBzdHJ1Y3QgZGFzNjQwMl9ib2FyZGluZm8gKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdjsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCWludCByZXQ7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgREFTNjQwMl9TSVpFKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaXJxID0gaXQtPm9wdGlvbnNbMF07Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIiggaXJxID0gJXUgKVxuIiwgaXJxKTsKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGludHJfaGFuZGxlciwgMCwgImRhczY0MDIiLCBkZXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2LT5pcnEgPSBpcnE7CisJaW50IHJldDsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOworCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCAweDEwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogYWkgc3ViZGV2aWNlICovCi0JcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQ7Ci0Jcy0+bl9jaGFuID0gODsKLQkvKiBzLT50cmlnWzJdPWRhczY0MDJfYWlfbW9kZTI7ICovCi0Jcy0+Y2FuY2VsID0gZGFzNjQwMl9haV9jYW5jZWw7Ci0Jcy0+bWF4ZGF0YSA9ICgxIDw8IDEyKSAtIDE7Ci0Jcy0+bGVuX2NoYW5saXN0ID0gMTY7CS8qID8gKi8KLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCWRhczY0MDJfcmVzZXQoZGV2KTsKIAotCWJvYXJkX2luaXQoZGV2KTsKKwkvKiBJUlFzIDIsMyw1LDYsNywgMTAsMTEsMTUgYXJlIHZhbGlkIGZvciAiZW5oYW5jZWQiIG1vZGUgKi8KKwlpZiAoKDEgPDwgaXQtPm9wdGlvbnNbMV0pICYgMHg4Y2VjKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBkYXM2NDAyX2ludGVycnVwdCwgMCwKKwkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOworCisJCQlzd2l0Y2ggKGRldi0+aXJxKSB7CisJCQljYXNlIDEwOgorCQkJCWRldnByaXYtPmlycSA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDExOgorCQkJCWRldnByaXYtPmlycSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDE1OgorCQkJCWRldnByaXYtPmlycSA9IDY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRldnByaXYtPmlycSA9IGRldi0+aXJxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQW5hbG9nIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9ESUZGOworCXMtPm5fY2hhbgk9IDY0OworCXMtPm1heGRhdGEJPSBib2FyZC0+bWF4ZGF0YTsKKwlzLT5yYW5nZV90YWJsZQk9ICZkYXM2NDAyX2FpX3JhbmdlczsKKwlzLT5pbnNuX3JlYWQJPSBkYXM2NDAyX2FpX2luc25fcmVhZDsKKwlpZiAoZGV2LT5pcnEpIHsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfQ01EX1JFQUQ7CisJCXMtPmxlbl9jaGFubGlzdAk9IHMtPm5fY2hhbjsKKwkJcy0+ZG9fY21kdGVzdAk9IGRhczY0MDJfYWlfY21kdGVzdDsKKwkJcy0+ZG9fY21kCT0gZGFzNjQwMl9haV9jbWQ7CisJCXMtPmNhbmNlbAk9IGRhczY0MDJfYWlfY2FuY2VsOworCX0KKworCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbgk9IDI7CisJcy0+bWF4ZGF0YQk9IGJvYXJkLT5tYXhkYXRhOworCXMtPnJhbmdlX3RhYmxlCT0gJmRhczY0MDJfYW9fcmFuZ2VzOworCXMtPmluc25fd3JpdGUJPSBkYXM2NDAyX2FvX2luc25fd3JpdGU7CisJcy0+aW5zbl9yZWFkCT0gZGFzNjQwMl9hb19pbnNuX3JlYWQ7CisKKwkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbgk9IDg7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBkYXM2NDAyX2RpX2luc25fYml0czsKKworCS8qIERpZ2l0YWwgSW5wdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbM107CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbgk9IDg7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBkYXM2NDAyX2RvX2luc25fYml0czsKIAogCXJldHVybiAwOwogfQpAQCAtMzEzLDkgKzUzNiwxMiBAQAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLmF0dGFjaAkJPSBkYXM2NDAyX2F0dGFjaCwKIAkuZGV0YWNoCQk9IGNvbWVkaV9sZWdhY3lfZGV0YWNoLAorCS5ib2FyZF9uYW1lCT0gJmRhczY0MDJfYm9hcmRzWzBdLm5hbWUsCisJLm51bV9uYW1lcwk9IEFSUkFZX1NJWkUoZGFzNjQwMl9ib2FyZHMpLAorCS5vZmZzZXQJCT0gc2l6ZW9mKHN0cnVjdCBkYXM2NDAyX2JvYXJkaW5mbyksCiB9OwogbW9kdWxlX2NvbWVkaV9kcml2ZXIoZGFzNjQwMl9kcml2ZXIpCiAKLU1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgZHJpdmVyIGZvciBEQVM2NDAyIGNvbXBhdGlibGUgYm9hcmRzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMKaW5kZXggNWFmMGE1Ny4uM2U0MDgzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYwpAQCAtNDIwLDE3ICs0MjAsMTIgQEAKIAlnYWluICY9IDB4ZjsKIAlvdXRiKGdhaW4sIGRldi0+aW9iYXNlICsgREFTODAwX0dBSU4pOwogCi0Jc3dpdGNoIChhc3luYy0+Y21kLnN0b3Bfc3JjKSB7Ci0JY2FzZSBUUklHX0NPVU5UOgorCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJZGV2cHJpdi0+Y291bnQgPSBhc3luYy0+Y21kLnN0b3BfYXJnICogYXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CiAJCWRldnByaXYtPmZvcmV2ZXIgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSBUUklHX05PTkU6CisJfSBlbHNlIHsJLyogVFJJR19OT05FICovCiAJCWRldnByaXYtPmZvcmV2ZXIgPSB0cnVlOwogCQlkZXZwcml2LT5jb3VudCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwogCX0KIAogCS8qIGVuYWJsZSBhdXRvIGNoYW5uZWwgc2Nhbiwgc2VuZCBpbnRlcnJ1cHRzIG9uIGVuZCBvZiBjb252ZXJzaW9uCkBAIC00NDAsMjYgKzQzNSwxOSBAQAogCWNvbnZfYml0cyB8PSBFQUNTIHwgSUVPQzsKIAlpZiAoYXN5bmMtPmNtZC5zdGFydF9zcmMgPT0gVFJJR19FWFQpCiAJCWNvbnZfYml0cyB8PSBEVEVOOwotCXN3aXRjaCAoYXN5bmMtPmNtZC5jb252ZXJ0X3NyYykgewotCWNhc2UgVFJJR19USU1FUjoKKwlpZiAoYXN5bmMtPmNtZC5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWNvbnZfYml0cyB8PSBDQVNDIHwgSVRFOwogCQkvKiBzZXQgY29udmVyc2lvbiBmcmVxdWVuY3kgKi8KIAkJaWYgKGRhczgwMF9zZXRfZnJlcXVlbmN5KGRldikgPCAwKSB7CiAJCQljb21lZGlfZXJyb3IoZGV2LCAiRXJyb3Igc2V0dGluZyB1cCBjb3VudGVycyIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFJJR19FWFQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOwogCWRhczgwMF9pbmRfd3JpdGUoZGV2LCBjb252X2JpdHMsIENPTlZfQ09OVFJPTCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKIAotCWFzeW5jLT5ldmVudHMgPSAwOwogCWRhczgwMF9lbmFibGUoZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUzMiwxMCArNTIwLDggQEAKIAogCWlmIChmaWZvX292ZXJmbG93KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGlycV9mbGFncyk7Ci0JCWRhczgwMF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJYXN5bmMtPmV2ZW50cyA9IDA7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKQEAgLTU1MSwyMCArNTM3LDIxIEBACiAJCWRhczgwMF9kaXNhYmxlKGRldik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAl9Ci0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgZGFzODAwX3dhaXRfZm9yX2NvbnYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IGRhczgwMF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCWlmICghKGluYihkZXYtPmlvYmFzZSArIERBUzgwMF9TVEFUVVMpICYgQlVTWSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVM4MDBfU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIEJVU1kpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgZGFzODAwX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNTk5LDcgKzU4Niw3IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXRiX3AoMCwgZGV2LT5pb2Jhc2UgKyBEQVM4MDBfTVNCKTsKIAotCQlyZXQgPSBkYXM4MDBfd2FpdF9mb3JfY29udihkZXYsIDEwMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczgwMF9haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKaW5kZXggNzhhMTk2Mi4uYzhhMzZlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCkBAIC0xNjQsMTYgKzE2NCwyOSBAQAogCiB9OwogCitzdGF0aWMgaW50IGRtbTMyYXRfYWlfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIGNvbnRleHQpOworCWlmICgoc3RhdHVzICYgRE1NMzJBVF9TVEFUVVMpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZG1tMzJhdF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWludCBuLCBpOworCWludCBuOwogCXVuc2lnbmVkIGludCBkOwotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIHNob3J0IG1zYiwgbHNiOwogCXVuc2lnbmVkIGNoYXIgY2hhbjsKIAlpbnQgcmFuZ2U7CisJaW50IHJldDsKIAogCS8qIGdldCB0aGUgY2hhbm5lbCBhbmQgcmFuZ2UgbnVtYmVyICovCiAKQEAgLTE5MCwyNiArMjAzLDIwIEBACiAJb3V0YihkbW0zMmF0X3JhbmdlYml0c1tyYW5nZV0sIGRldi0+aW9iYXNlICsgRE1NMzJBVF9BSUNPTkYpOwogCiAJLyogd2FpdCBmb3IgY2lyY3VpdCB0byBzZXR0bGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgewotCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJUkJBQ0spOwotCQlpZiAoKHN0YXR1cyAmIERNTTMyQVRfU1RBVFVTKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IDQwMDAwKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRtbTMyYXRfYWlfc3RhdHVzLCBETU0zMkFUX0FJUkJBQ0spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBjb252ZXJ0IG4gc2FtcGxlcyAqLwogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dGIoMHhmZiwgZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0NPTlYpOworCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCA0MDAwMDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJU1RBVCk7Ci0JCQlpZiAoKHN0YXR1cyAmIERNTTMyQVRfU1RBVFVTKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IDQwMDAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZG1tMzJhdF9haV9zdGF0dXMsCisJCQkJICAgICBETU0zMkFUX0FJU1RBVCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHJlYWQgZGF0YSAqLwogCQlsc2IgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJTFNCKTsKQEAgLTQwMyw4ICs0MTAsOSBAQAogewogCXN0cnVjdCBkbW0zMmF0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwotCWludCBpLCByYW5nZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5sbywgY2hhbmhpLCBzdGF0dXM7CisJaW50IHJhbmdlOworCXVuc2lnbmVkIGNoYXIgY2hhbmxvLCBjaGFuaGk7CisJaW50IHJldDsKIAogCWlmICghY21kLT5jaGFubGlzdCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MzksMTQgKzQ0NywxMyBAQAogCQkJCQkJICAgICAgKiBpc3IgKi8KIAl9CiAKLQkvKiB3YWl0IGZvciBjaXJjdWl0IHRvIHNldHRsZSAqLwotCWZvciAoaSA9IDA7IGkgPCA0MDAwMDsgaSsrKSB7Ci0JCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERNTTMyQVRfQUlSQkFDSyk7Ci0JCWlmICgoc3RhdHVzICYgRE1NMzJBVF9TVEFUVVMpID09IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gNDAwMDApCi0JCXJldHVybiAtRVRJTUVET1VUOworCS8qCisJICogd2FpdCBmb3IgY2lyY3VpdCB0byBzZXR0bGUKKwkgKiB3ZSBkb24ndCBoYXZlIHRoZSAnaW5zbicgaGVyZSBidXQgaXQncyBub3QgbmVlZGVkCisJICovCisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBOVUxMLCBkbW0zMmF0X2FpX3N0YXR1cywgRE1NMzJBVF9BSVJCQUNLKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGRldnByaXYtPmFpX3NjYW5zX2xlZnQgPiAxKSB7CiAJCS8qIHN0YXJ0IHRoZSBjbG9jayBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCkBAIC01MjUsNiArNTMyLDE5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaW50IGRtbTMyYXRfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERNTTMyQVRfREFDU1RBVCk7CisJaWYgKChzdGF0dXMgJiBETU0zMkFUX0RBQ0JVU1kpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZG1tMzJhdF9hb193aW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtNTMzLDYgKzU1Myw3IEBACiAJaW50IGk7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBjaGFyIGhpLCBsbywgc3RhdHVzOworCWludCByZXQ7CiAKIAkvKiBXcml0aW5nIGEgbGlzdCBvZiB2YWx1ZXMgdG8gYW4gQU8gY2hhbm5lbCBpcyBwcm9iYWJseSBub3QKIAkgKiB2ZXJ5IHVzZWZ1bCwgYnV0IHRoYXQncyBob3cgdGhlIGludGVyZmFjZSBpcyBkZWZpbmVkLiAqLwpAQCAtNTQ5LDEzICs1NzAsOSBAQAogCQlvdXRiKGhpLCBkZXYtPmlvYmFzZSArIERNTTMyQVRfREFDTVNCKTsKIAogCQkvKiB3YWl0IGZvciBjaXJjdWl0IHRvIHNldHRsZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9EQUNTVEFUKTsKLQkJCWlmICgoc3RhdHVzICYgRE1NMzJBVF9EQUNCVVNZKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IDQwMDAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZG1tMzJhdF9hb19lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiBkdW1teSByZWFkIHRvIHVwZGF0ZSB0cmlnZ2VyIHRoZSBvdXRwdXQgKi8KIAkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9EQUNNU0IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCmluZGV4IDQyNzE5MDMuLmJhN2MyYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKQEAgLTIyNCwyMyArMjI0LDMyIEBACiAJJnJhbmdlX3VuaXBvbGFyNQogfTsKIAotI2RlZmluZSBEVDI4MTFfVElNRU9VVCA1CitzdGF0aWMgaW50IGR0MjgxMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQURDU1IpOworCWlmICgoc3RhdHVzICYgRFQyODExX0FEQlVTWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KIAogc3RhdGljIGludCBkdDI4MTFfYWlfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpbnQgdGltZW91dCA9IERUMjgxMV9USU1FT1VUOworCWludCByZXQ7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCW91dGIoY2hhbiwgZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQURHQ1IpOwogCi0JCXdoaWxlICh0aW1lb3V0Ci0JCSAgICAgICAmJiBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQURDU1IpICYgRFQyODExX0FEQlVTWSkKLQkJCXRpbWVvdXQtLTsKLQkJaWYgKCF0aW1lb3V0KQotCQkJcmV0dXJuIC1FVElNRTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkdDI4MTFfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJZGF0YVtpXSA9IGluYihkZXYtPmlvYmFzZSArIERUMjgxMV9BRERBVExPKTsKIAkJZGF0YVtpXSB8PSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQUREQVRISSkgPDwgODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwppbmRleCBhYmFkNmU0Li4zNzk0YjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCkBAIC02NiwyNiArNjYsMzUgQEAKICNkZWZpbmUgRFQyODE0X1RJTUVPVVQgMTAKICNkZWZpbmUgRFQyODE0X01BWF9TUEVFRCAxMDAwMDAJLyogQXJiaXRyYXJ5IDEwIGtoeiBsaW1pdCAqLwogCitzdGF0aWMgaW50IGR0MjgxNF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTRfQ1NSKTsKKwlpZiAoc3RhdHVzICYgRFQyODE0X0ZJTklTSCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkdDI4MTRfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IG4sIGksIGhpLCBsbzsKKwlpbnQgbiwgaGksIGxvOwogCWludCBjaGFuOwotCWludCBzdGF0dXMgPSAwOworCWludCByZXQ7CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAJCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAogCQlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgRFQyODE0X0NTUik7Ci0JCWZvciAoaSA9IDA7IGkgPCBEVDI4MTRfVElNRU9VVDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTRfQ1NSKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlpZiAoc3RhdHVzICYgRFQyODE0X0ZJTklTSCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA+PSBEVDI4MTRfVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODE0X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODE0X0RBVEEpOwogCQlsbyA9IGluYihkZXYtPmlvYmFzZSArIERUMjgxNF9EQVRBKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYwppbmRleCBlZTI0NzE3Li5iOWFjNGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jCkBAIC02NywxNSArNjcsMTcgQEAKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbOF07CiB9OwogCi1zdGF0aWMgaW50IGR0MjgxNV93YWl0X2Zvcl9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3N0YXRpYyBpbnQgZHQyODE1X2FvX3N0YXR1cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlpZiAoaW5iKGRldi0+aW9iYXNlICsgRFQyODE1X1NUQVRVUykgPT0gc3RhdHVzKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODE1X1NUQVRVUyk7CisJaWYgKHN0YXR1cyA9PSBjb250ZXh0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGR0MjgxNV9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTk4LDMwICsxMDAsMjMgQEAKIAlzdHJ1Y3QgZHQyODE1X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGk7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBsbywgaGk7CisJaW50IHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJbG8gPSAoKGRhdGFbaV0gJiAweDBmKSA8PCA0KSB8IChjaGFuIDw8IDEpIHwgMHgwMTsKIAkJaGkgPSAoZGF0YVtpXSAmIDB4ZmYwKSA+PiA0OwogCi0JCXN0YXR1cyA9IGR0MjgxNV93YWl0X2Zvcl9zdGF0dXMoZGV2LCAweDAwKTsKLQkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJmYWlsZWQgdG8gd3JpdGUgbG93IGJ5dGUgb24gJWQgcmVhc29uICV4XG4iLAotCQkJCWNoYW4sIHN0YXR1cyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODE1X2FvX3N0YXR1cywgMHgwMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCW91dGIobG8sIGRldi0+aW9iYXNlICsgRFQyODE1X0RBVEEpOwogCi0JCXN0YXR1cyA9IGR0MjgxNV93YWl0X2Zvcl9zdGF0dXMoZGV2LCAweDEwKTsKLQkJaWYgKHN0YXR1cyAhPSAweDEwKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJmYWlsZWQgdG8gd3JpdGUgaGlnaCBieXRlIG9uICVkIHJlYXNvbiAleFxuIiwKLQkJCQljaGFuLCBzdGF0dXMpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgxNV9hb19zdGF0dXMsIDB4MTApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CiAJfQogCXJldHVybiBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCmluZGV4IDg5NWY3M2EuLjE2Y2MxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKQEAgLTYzLDcgKzYzLDYgQEAKIAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCi0jZGVmaW5lIERUMjgyMV9USU1FT1VUCQkxMDAJLyogNTAwIHVzICovCiAjZGVmaW5lIERUMjgyMV9TSVpFIDB4MTAKIAogLyoKQEAgLTI0OCwyNyArMjQ3LDYgQEAKICAqICAgIFNvbWUgdXNlbGVzcyBhYnN0cmFjdGlvbnMKICAqLwogI2RlZmluZSBjaGFuX3RvX0RBQyhhKQkoKGEpJjEpCi0jZGVmaW5lIG11eF9idXN5KCkgKGludyhkZXYtPmlvYmFzZStEVDI4MjFfQURDU1IpJkRUMjgyMV9NVVhCVVNZKQotI2RlZmluZSBhZF9kb25lKCkgKGludyhkZXYtPmlvYmFzZStEVDI4MjFfQURDU1IpJkRUMjgyMV9BRERPTkUpCi0KLS8qCi0gKiAgICBkYW5nZXIhIG1hY3JvIGFidXNlLi4uIGEgaXMgdGhlIGV4cHJlc3Npb24gdG8gd2FpdCBvbiwgYW5kIGIgaXMKLSAqICAgICAgdGhlIHN0YXRlbWVudChzKSB0byBleGVjdXRlIGlmIGl0IGRvZXNuJ3QgaGFwcGVuLgotICovCi0jZGVmaW5lIHdhaXRfZm9yKGEsIGIpCQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQlpbnQgX2k7CQkJCQkJXAotCQlmb3IgKF9pID0gMDsgX2kgPCBEVDI4MjFfVElNRU9VVDsgX2krKykgewlcCi0JCQlpZiAoYSkgewkJCQlcCi0JCQkJX2kgPSAwOwkJCQlcCi0JCQkJYnJlYWs7CQkJCVwKLQkJCX0JCQkJCVwKLQkJCXVkZWxheSg1KTsJCQkJXAotCQl9CQkJCQkJXAotCQlpZiAoX2kpIHsJCQkJCVwKLQkJCWIJCQkJCVwKLQkJfQkJCQkJCVwKLQl9IHdoaWxlICgwKQogCiBzdGF0aWMgaW50IHByZXBfYWlfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBjaGFuLCBpbnQgc2l6ZSk7CiBzdGF0aWMgaW50IHByZXBfYW9fZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBjaGFuLCBpbnQgc2l6ZSk7CkBAIC0zMjgsNyArMzA2LDYgQEAKIAlzaXplID0gY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIocywgcHRyLCBkZXZwcml2LT5kbWFfbWF4c2l6ZSk7CiAJaWYgKHNpemUgPT0gMCkgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiQU8gdW5kZXJydW5cbiIpOwotCQlkdDI4MnhfYW9fY2FuY2VsKGRldiwgcyk7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm47CiAJfQpAQCAtMzYzLDcgKzM0MCw3IEBACiAJZHQyODJ4X211bmdlKGRldiwgcHRyLCBzaXplKTsKIAlyZXQgPSBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsIHB0ciwgc2l6ZSk7CiAJaWYgKHJldCAhPSBzaXplKSB7Ci0JCWR0MjgyeF9haV9jYW5jZWwoZGV2LCBzKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCXJldHVybjsKIAl9CiAJZGV2cHJpdi0+bnJlYWQgLT0gc2l6ZSAvIDI7CkBAIC0zNzMsNyArMzUwLDYgQEAKIAkJZGV2cHJpdi0+bnJlYWQgPSAwOwogCX0KIAlpZiAoIWRldnByaXYtPm5yZWFkKSB7Ci0JCWR0MjgyeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQlyZXR1cm47CiAJfQpAQCAtNDcxLDE1ICs0NDcsMTMgQEAKIAlpZiAoYWRjc3IgJiBEVDI4MjFfQURFUlIpIHsKIAkJaWYgKGRldnByaXYtPm5yZWFkICE9IDApIHsKIAkJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgZXJyb3IiKTsKLQkJCWR0MjgyeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOwogCQl9CiAJCWhhbmRsZWQgPSAxOwogCX0KIAlpZiAoZGFjc3IgJiBEVDI4MjFfREFFUlIpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgIkQvQSBlcnJvciIpOwotCQlkdDI4MnhfYW9fY2FuY2VsKGRldiwgc19hbyk7Ci0JCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQlzX2FvLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJaGFuZGxlZCA9IDE7CiAJfQogI2lmIDAKQEAgLTUwOCw3ICs0ODIsOCBAQAogCQloYW5kbGVkID0gMTsKIAl9CiAjZW5kaWYKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgc19hbyk7CiAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KQEAgLTUzMCw2ICs1MDUsMjkgQEAKIAlvdXR3KG4gLSAxLCBkZXYtPmlvYmFzZSArIERUMjgyMV9DSEFOQ1NSKTsKIH0KIAorc3RhdGljIGludCBkdDI4MnhfYWlfdGltZW91dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIERUMjgyMV9BRENTUik7CisJc3dpdGNoIChjb250ZXh0KSB7CisJY2FzZSBEVDI4MjFfTVVYQlVTWToKKwkJaWYgKChzdGF0dXMgJiBEVDI4MjFfTVVYQlVTWSkgPT0gMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIERUMjgyMV9BRERPTkU6CisJCWlmIChzdGF0dXMgJiBEVDI4MjFfQURET05FKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiAvKgogICogICAgUGVyZm9ybXMgYSBzaW5nbGUgQS9EIGNvbnZlcnNpb24uCiAgKiAgICAgIC0gUHV0IGNoYW5uZWwvZ2FpbiBpbnRvIGNoYW5uZWwtZ2FpbiBsaXN0CkBAIC01NDIsNiArNTQwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgZHQyODJ4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBkdDI4MnhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJLyogWFhYIHNob3VsZCB3ZSByZWFsbHkgYmUgZW5hYmxpbmcgdGhlIGFkIGNsb2NrIGhlcmU/ICovCkBAIC01NTEsMTMgKzU1MCwxOCBAQAogCWR0MjgyeF9sb2FkX2NoYW5nYWluKGRldiwgMSwgJmluc24tPmNoYW5zcGVjKTsKIAogCW91dHcoZGV2cHJpdi0+c3VwY3NyIHwgRFQyODIxX1BSTEQsIGRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUik7Ci0Jd2FpdF9mb3IoIW11eF9idXN5KCksIGNvbWVkaV9lcnJvcihkZXYsICJ0aW1lb3V0XG4iKTsgcmV0dXJuIC1FVElNRTspOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODJ4X2FpX3RpbWVvdXQsIERUMjgyMV9NVVhCVVNZKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXR3KGRldnByaXYtPnN1cGNzciB8IERUMjgyMV9TVFJJRywKIAkJCWRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUik7Ci0JCXdhaXRfZm9yKGFkX2RvbmUoKSwgY29tZWRpX2Vycm9yKGRldiwgInRpbWVvdXRcbiIpOwotCQkJIHJldHVybiAtRVRJTUU7KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgyeF9haV90aW1lb3V0LAorCQkJCSAgICAgRFQyODIxX0FERE9ORSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWRhdGFbaV0gPQogCQkgICAgaW53KGRldi0+aW9iYXNlICsKQEAgLTY0Niw2ICs2NTAsNyBAQAogCXN0cnVjdCBkdDI4MnhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAJaW50IHRpbWVyOworCWludCByZXQ7CiAKIAlpZiAoZGV2cHJpdi0+dXNlZG1hID09IDApIHsKIAkJY29tZWRpX2Vycm9yKGRldiwKQEAgLTY5MSw3ICs2OTYsOSBAQAogCW91dHcoZGV2cHJpdi0+YWRjc3IsIGRldi0+aW9iYXNlICsgRFQyODIxX0FEQ1NSKTsKIAogCW91dHcoZGV2cHJpdi0+c3VwY3NyIHwgRFQyODIxX1BSTEQsIGRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUik7Ci0Jd2FpdF9mb3IoIW11eF9idXN5KCksIGNvbWVkaV9lcnJvcihkZXYsICJ0aW1lb3V0XG4iKTsgcmV0dXJuIC1FVElNRTspOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgTlVMTCwgZHQyODJ4X2FpX3RpbWVvdXQsIERUMjgyMV9NVVhCVVNZKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpIHsKIAkJb3V0dyhkZXZwcml2LT5zdXBjc3IgfCBEVDI4MjFfU1RSSUcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMKaW5kZXggZjUyYTQ0Ny4uNDM2ZTQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDMwMDAuYwpAQCAtMzY5LDEyICszNjksMTAgQEAKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwogCiAJZGVidWdfbl9pbnRzKys7Ci0JaWYgKGRlYnVnX25faW50cyA+PSAxMCkgewotCQlkdDNrX2FpX2NhbmNlbChkZXYsIHMpOworCWlmIChkZWJ1Z19uX2ludHMgPj0gMTApCiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQl9CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNzY3LDggKzc2NSw2IEBACiAJcy0+dHlwZSA9IENPTUVESV9TVUJEX1BST0M7CiAjZW5kaWYKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jCmluZGV4IGYyMjQ4MjUuLmU1NTkzZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHluYV9wY2kxMHh4LmMKQEAgLTU3LDE4ICs1NywyNyBAQAogCXVuc2lnbmVkIGxvbmcgQkFEUjM7CiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJFQUQgV1JJVEUgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGR5bmFfcGNpMTB4eF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLS8qIGFuYWxvZyBpbnB1dCBjYWxsYmFjayAqLworCXN0YXR1cyA9IGlud19wKGRldi0+aW9iYXNlKTsKKwlpZiAoc3RhdHVzICYgKDEgPDwgMTUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGR5bmFfcGNpMTB4eF9pbnNuX3JlYWRfYWkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGR5bmFfcGNpMTB4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBjb3VudGVyOworCWludCBuOwogCXUxNiBkID0gMDsKKwlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgY2hhbiwgcmFuZ2U7CiAKIAkvKiBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGFuZCByYW5nZSAqLwpAQCAtODIsMTggKzkxLDEzIEBACiAJCXNtcF9tYigpOwogCQlvdXR3X3AoMHgwMDAwICsgcmFuZ2UgKyBjaGFuLCBkZXYtPmlvYmFzZSArIDIpOwogCQl1ZGVsYXkoMTApOwotCQkvKiByZWFkIGRhdGEgKi8KLQkJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IFJFQURfVElNRU9VVDsgY291bnRlcisrKSB7Ci0JCQlkID0gaW53X3AoZGV2LT5pb2Jhc2UpOwogCi0JCQkvKiBjaGVjayBpZiByZWFkIGlzIHN1Y2Nlc3NmdWwgaWYgdGhlIEVPQyBiaXQgaXMgc2V0ICovCi0JCQlpZiAoZCAmICgxIDw8IDE1KSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQl9Ci0JCWRhdGFbbl0gPSAwOwotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAidGltZW91dCByZWFkaW5nIGFuYWxvZyBpbnB1dFxuIik7Ci0JCWNvbnRpbnVlOwotY29udl9maW5pc2g6CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHluYV9wY2kxMHh4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQkvKiByZWFkIGRhdGEgKi8KKwkJZCA9IGlud19wKGRldi0+aW9iYXNlKTsKIAkJLyogbWFzayB0aGUgZmlyc3QgNCBiaXRzIC0gRU9DIGJpdHMgKi8KIAkJZCAmPSAweDBGRkY7CiAJCWRhdGFbbl0gPSBkOwpAQCAtMTAxLDcgKzEwNSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXZwcml2LT5tdXRleCk7CiAKIAkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQvd3JpdHRlbiAqLwotCXJldHVybiBuOworCXJldHVybiByZXQgPyByZXQgOiBuOwogfQogCiAvKiBhbmFsb2cgb3V0cHV0IGNhbGxiYWNrICovCkBAIC0yMzIsOCArMjM2LDYgQEAKIAlzLT5zdGF0ZSA9IDA7CiAJcy0+aW5zbl9iaXRzID0gZHluYV9wY2kxMHh4X2RvX2luc25fYml0czsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZmw1MTIuYwppbmRleCBhOTlkZGYwLi40ZTQxMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZmw1MTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZmw1MTIuYwpAQCAtMSwyNyArMSw0OSBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9mbDUxMi5jCi0gICAgQW5kZXJzIEduaXN0cnVwIDxleDE4QGthbG1hbi5pYXUuZHR1LmRrPgotKi8KKyAqIGZsNTEyLmMKKyAqIEFuZGVycyBHbmlzdHJ1cCA8ZXgxOEBrYWxtYW4uaWF1LmR0dS5kaz4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKIC8qCi1Ecml2ZXI6IGZsNTEyCi1EZXNjcmlwdGlvbjogdW5rbm93bgotQXV0aG9yOiBBbmRlcnMgR25pc3RydXAgPGV4MThAa2FsbWFuLmlhdS5kdHUuZGs+Ci1EZXZpY2VzOiBbdW5rbm93bl0gRkw1MTIgKGZsNTEyKQotU3RhdHVzOiB1bmtub3duCi0KLURpZ2l0YWwgSS9PIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLSAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCi0qLworICogRHJpdmVyOiBmbDUxMgorICogRGVzY3JpcHRpb246IHVua25vd24KKyAqIEF1dGhvcjogQW5kZXJzIEduaXN0cnVwIDxleDE4QGthbG1hbi5pYXUuZHR1LmRrPgorICogRGV2aWNlczogW3Vua25vd25dIEZMNTEyIChmbDUxMikKKyAqIFN0YXR1czogdW5rbm93bgorICoKKyAqIERpZ2l0YWwgSS9PIGlzIG5vdCBzdXBwb3J0ZWQuCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICogICBbMF0gLSBJL08gcG9ydCBiYXNlIGFkZHJlc3MKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jZGVmaW5lIEZMNTEyX1NJWkUgMTYJCS8qIHRoZSBzaXplIG9mIHRoZSB1c2VkIG1lbW9yeSAqLworLyoKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKKyAqLworI2RlZmluZSBGTDUxMl9BSV9MU0JfUkVHCQkweDAyCisjZGVmaW5lIEZMNTEyX0FJX01TQl9SRUcJCTB4MDMKKyNkZWZpbmUgRkw1MTJfQUlfTVVYX1JFRwkJMHgwMgorI2RlZmluZSBGTDUxMl9BSV9TVEFSVF9DT05WX1JFRwkJMHgwMworI2RlZmluZSBGTDUxMl9BT19EQVRBX1JFRyh4KQkJKDB4MDQgKyAoKHgpICogMikpCisjZGVmaW5lIEZMNTEyX0FPX1RSSUdfUkVHKHgpCQkoMHgwNCArICgoeCkgKiAyKSkKKwogc3RydWN0IGZsNTEyX3ByaXZhdGUgewogCXVuc2lnbmVkIHNob3J0IGFvX3JlYWRiYWNrWzJdOwogfTsKQEAgLTM4LDcyICs2MCw2OSBAQAogCX0KIH07CiAKLS8qCi0gKiBmbDUxMl9haV9pbnNuIDogdGhpcyBpcyB0aGUgYW5hbG9nIGlucHV0IGZ1bmN0aW9uCi0gKi8KLXN0YXRpYyBpbnQgZmw1MTJfYWlfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBmbDUxMl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWludCBuOwotCXVuc2lnbmVkIGludCBsb19ieXRlLCBoaV9ieXRlOwotCWNoYXIgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5pb2Jhc2U7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOwogCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewkvKiBzYW1wbGUgbiB0aW1lcyBvbiBzZWxlY3RlZCBjaGFubmVsICovCi0JCS8qIFhYWCBwcm9iYWJseSBjYW4gbW92ZSBuZXh0IHN0ZXAgb3V0IG9mIGZvcigpIGxvb3AgLS0gd2lsbAotCQkgKiBtYWtlIEFJIGEgbGl0dGxlIGJpdCBmYXN0ZXIuICovCi0JCW91dGIoY2hhbiwgaW9iYXNlICsgMik7CS8qIHNlbGVjdCBjaGFuICovCi0JCW91dGIoMCwgaW9iYXNlICsgMyk7CS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgRkw1MTJfQUlfTVVYX1JFRyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBGTDUxMl9BSV9TVEFSVF9DT05WX1JFRyk7CisKIAkJLyogWFhYIHNob3VsZCB0ZXN0ICJkb25lIiBmbGFnIGluc3RlYWQgb2YgZGVsYXkgKi8KLQkJdWRlbGF5KDMwKTsJLyogc2xlZXAgMzAgdXNlYyAqLwotCQlsb19ieXRlID0gaW5iKGlvYmFzZSArIDIpOwkvKiBsb3cgOCBieXRlICovCi0JCWhpX2J5dGUgPSBpbmIoaW9iYXNlICsgMykgJiAweGY7IC8qIGhpZ2ggNCBiaXQgYW5kIG1hc2sgKi8KLQkJZGF0YVtuXSA9IGxvX2J5dGUgKyAoaGlfYnl0ZSA8PCA4KTsKKwkJdWRlbGF5KDMwKTsKKworCQl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBGTDUxMl9BSV9MU0JfUkVHKTsKKwkJdmFsIHw9IChpbmIoZGV2LT5pb2Jhc2UgKyBGTDUxMl9BSV9NU0JfUkVHKSA8PCA4KTsKKwkJdmFsICY9IHMtPm1heGRhdGE7CisKKwkJZGF0YVtpXSA9IHZhbDsKIAl9Ci0JcmV0dXJuIG47CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyoKLSAqIGZsNTEyX2FvX2luc24gOiB1c2VkIHRvIHdyaXRlIHRvIGEgREEgcG9ydCBuIHRpbWVzCi0gKi8KLXN0YXRpYyBpbnQgZmw1MTJfYW9faW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBmbDUxMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZmw1MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbjsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiBnZXQgY2hhbiB0byB3cml0ZSAqLwotCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5pb2Jhc2U7CS8qIGdldCBiYXNlIGFkZHJlc3MgICovCisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CisJaW50IGk7CiAKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CS8qIHdyaXRlIG4gZGF0YSBzZXQgKi8KLQkJLyogd3JpdGUgbG93IGJ5dGUgICAqLwotCQlvdXRiKGRhdGFbbl0gJiAweDBmZiwgaW9iYXNlICsgNCArIDIgKiBjaGFuKTsKLQkJLyogd3JpdGUgaGlnaCBieXRlICAqLwotCQlvdXRiKChkYXRhW25dICYgMHhmMDApID4+IDgsIGlvYmFzZSArIDQgKyAyICogY2hhbik7Ci0JCWluYihpb2Jhc2UgKyA0ICsgMiAqIGNoYW4pOwkvKiB0cmlnICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhW2ldOwogCi0JCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtuXTsKKwkJLyogd3JpdGUgTFNCLCBNU0IgdGhlbiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KKwkJb3V0Yih2YWwgJiAweDBmZiwgZGV2LT5pb2Jhc2UgKyBGTDUxMl9BT19EQVRBX1JFRyhjaGFuKSk7CisJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZiwgZGV2LT5pb2Jhc2UgKyBGTDUxMl9BT19EQVRBX1JFRyhjaGFuKSk7CisJCWluYihkZXYtPmlvYmFzZSArIEZMNTEyX0FPX1RSSUdfUkVHKGNoYW4pKTsKIAl9Ci0JcmV0dXJuIG47CisJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSB2YWw7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyoKLSAqIGZsNTEyX2FvX2luc25fcmVhZGJhY2sgOiB1c2VkIHRvIHJlYWQgcHJldmlvdXMgdmFsdWVzIHdyaXR0ZW4gdG8KLSAqIERBIHBvcnQKLSAqLwotc3RhdGljIGludCBmbDUxMl9hb19pbnNuX3JlYWRiYWNrKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBmbDUxMl9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBmbDUxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCi0JCWRhdGFbbl0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CiAKLQlyZXR1cm4gbjsKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBmbDUxMl9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpAQCAtMTEyLDcgKzEzMSw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IHJldDsKIAotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBGTDUxMl9TSVpFKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTI0LDQyICsxNDMsMjYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyoKLQkgKiB0aGlzIGlmIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgc3VwZGV2aWNlcywgMiBoYXZlIGJlZW4gZGVmaW5lZAotCSAqLwotCS8qIEFuYWxvZyBpbmRwdXQgKi8KKwkvKiBBbmFsb2cgSW5wdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JLyogZGVmaW5lIHN1YmRldmljZSBhcyBBbmFsb2cgSW4gKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JLyogeW91IGNhbiByZWFkIGl0IGZyb20gdXNlcnNwYWNlICovCi0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKLQkvKiBOdW1iZXIgb2YgQW5hbG9nIGlucHV0IGNoYW5uZWxzICovCi0Jcy0+bl9jaGFuID0gMTY7Ci0JLyogYWNjZXB0IG9ubHkgMTIgYml0cyBvZiBkYXRhICovCi0Jcy0+bWF4ZGF0YSA9IDB4MGZmZjsKLQkvKiBkZXZpY2UgdXNlIG9uZSBvZiB0aGUgcmFuZ2VzICovCi0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZmw1MTI7Ci0JLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHJlYWQgQUQgKi8KLQlzLT5pbnNuX3JlYWQgPSBmbDUxMl9haV9pbnNuOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2ZsNTEyOworCXMtPmluc25fcmVhZAk9IGZsNTEyX2FpX2luc25fcmVhZDsKIAotCS8qIEFuYWxvZyBvdXRwdXQgKi8KKwkvKiBBbmFsb2cgT3V0cHV0IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOwotCS8qIGRlZmluZSBzdWJkZXZpY2UgYXMgQW5hbG9nIE9VVCAqLwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKLQkvKiB5b3UgY2FuIHdyaXRlIGl0IGZyb20gdXNlcnNwYWNlICovCi0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCS8qIE51bWJlciBvZiBBbmFsb2cgb3V0cHV0IGNoYW5uZWxzICovCi0Jcy0+bl9jaGFuID0gMjsKLQkvKiBhY2NlcHQgb25seSAxMiBiaXRzIG9mIGRhdGEgKi8KLQlzLT5tYXhkYXRhID0gMHgwZmZmOwotCS8qIGRldmljZSB1c2Ugb25lIG9mIHRoZSByYW5nZXMgKi8KLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9mbDUxMjsKLQkvKiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gd3JpdGUgREEgKi8KLQlzLT5pbnNuX3dyaXRlID0gZmw1MTJfYW9faW5zbjsKLQkvKiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gcmVhZGluZyBEQSAqLwotCXMtPmluc25fcmVhZCA9IGZsNTEyX2FvX2luc25fcmVhZGJhY2s7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMjsKKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2ZsNTEyOworCXMtPmluc25fd3JpdGUJPSBmbDUxMl9hb19pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGZsNTEyX2FvX2luc25fcmVhZDsKIAotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgZmw1MTJfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwppbmRleCBkZTYwYTI4Li4wOGQ3NjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwpAQCAtMSwyNCArMSwyNCBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCi0gICAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEdlbmVyYWwgU3RhbmRhcmRzIENvcnBvcmF0aW9uIEhpZ2gKLSAgICBTcGVlZCBQYXJhbGxlbCBEaWdpdGFsIEludGVyZmFjZSByczQ4NSBib2FyZHMuCi0KLSAgICBBdXRob3I6ICBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDAzIENvaGVyZW50IEltYWdpbmcgU3lzdGVtcwotCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLworICogZ3NjX2hwZGkuYworICogQ29tZWRpIGRyaXZlciB0aGUgR2VuZXJhbCBTdGFuZGFyZHMgQ29ycG9yYXRpb24KKyAqIEhpZ2ggU3BlZWQgUGFyYWxsZWwgRGlnaXRhbCBJbnRlcmZhY2UgcnM0ODUgYm9hcmRzLgorICoKKyAqIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2hlcmVudCBJbWFnaW5nIFN5c3RlbXMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAogLyoKICAqIERyaXZlcjogZ3NjX2hwZGkKQEAgLTQwLDggKzQwLDYgQEAKICAqIHN1cHBvcnQgY291bGQgYmUgYWRkZWQgdG8gdGhpcyBkcml2ZXIuCiAgKi8KIAotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTUyLDE0OSArNTAsMTA1IEBACiAjaW5jbHVkZSAicGx4OTA4MC5oIgogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCi1zdGF0aWMgdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOwotc3RhdGljIGludCBocGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci1zdGF0aWMgaW50IGhwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7Ci1zdGF0aWMgaW50IGhwZGlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpOwotc3RhdGljIGludCBkaW9fY29uZmlnX2Jsb2NrX3NpemUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpkYXRhKTsKKy8qCisgKiBQQ0kgQkFSMiBSZWdpc3RlciBtYXAgKGRldnByaXYtPm1taW8pCisgKi8KKyNkZWZpbmUgRklSTVdBUkVfUkVWX1JFRwkJCTB4MDAKKyNkZWZpbmUgRkVBVFVSRVNfUkVHX1BSRVNFTlRfQklUCQkoMSA8PCAxNSkKKyNkZWZpbmUgQk9BUkRfQ09OVFJPTF9SRUcJCQkweDA0CisjZGVmaW5lIEJPQVJEX1JFU0VUX0JJVAkJCQkoMSA8PCAwKQorI2RlZmluZSBUWF9GSUZPX1JFU0VUX0JJVAkJCSgxIDw8IDEpCisjZGVmaW5lIFJYX0ZJRk9fUkVTRVRfQklUCQkJKDEgPDwgMikKKyNkZWZpbmUgVFhfRU5BQkxFX0JJVAkJCQkoMSA8PCA0KQorI2RlZmluZSBSWF9FTkFCTEVfQklUCQkJCSgxIDw8IDUpCisjZGVmaW5lIERFTUFORF9ETUFfRElSRUNUSU9OX1RYX0JJVAkJKDEgPDwgNikgIC8qIGNoIDAgb25seSAqLworI2RlZmluZSBMSU5FX1ZBTElEX09OX1NUQVRVU19WQUxJRF9CSVQJCSgxIDw8IDcpCisjZGVmaW5lIFNUQVJUX1RYX0JJVAkJCQkoMSA8PCA4KQorI2RlZmluZSBDQUJMRV9USFJPVFRMRV9FTkFCTEVfQklUCQkoMSA8PCA5KQorI2RlZmluZSBURVNUX01PREVfRU5BQkxFX0JJVAkJCSgxIDw8IDMxKQorI2RlZmluZSBCT0FSRF9TVEFUVVNfUkVHCQkJMHgwOAorI2RlZmluZSBDT01NQU5EX0xJTkVfU1RBVFVTX01BU0sJCSgweDdmIDw8IDApCisjZGVmaW5lIFRYX0lOX1BST0dSRVNTX0JJVAkJCSgxIDw8IDcpCisjZGVmaW5lIFRYX05PVF9FTVBUWV9CSVQJCQkoMSA8PCA4KQorI2RlZmluZSBUWF9OT1RfQUxNT1NUX0VNUFRZX0JJVAkJCSgxIDw8IDkpCisjZGVmaW5lIFRYX05PVF9BTE1PU1RfRlVMTF9CSVQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFhfTk9UX0ZVTExfQklUCQkJCSgxIDw8IDExKQorI2RlZmluZSBSWF9OT1RfRU1QVFlfQklUCQkJKDEgPDwgMTIpCisjZGVmaW5lIFJYX05PVF9BTE1PU1RfRU1QVFlfQklUCQkJKDEgPDwgMTMpCisjZGVmaW5lIFJYX05PVF9BTE1PU1RfRlVMTF9CSVQJCQkoMSA8PCAxNCkKKyNkZWZpbmUgUlhfTk9UX0ZVTExfQklUCQkJCSgxIDw8IDE1KQorI2RlZmluZSBCT0FSRF9KVU1QRVIwX0lOU1RBTExFRF9CSVQJCSgxIDw8IDE2KQorI2RlZmluZSBCT0FSRF9KVU1QRVIxX0lOU1RBTExFRF9CSVQJCSgxIDw8IDE3KQorI2RlZmluZSBUWF9PVkVSUlVOX0JJVAkJCQkoMSA8PCAyMSkKKyNkZWZpbmUgUlhfVU5ERVJSVU5fQklUCQkJCSgxIDw8IDIyKQorI2RlZmluZSBSWF9PVkVSUlVOX0JJVAkJCQkoMSA8PCAyMykKKyNkZWZpbmUgVFhfUFJPR19BTE1PU1RfUkVHCQkJMHgwYworI2RlZmluZSBSWF9QUk9HX0FMTU9TVF9SRUcJCQkweDEwCisjZGVmaW5lIEFMTU9TVF9FTVBUWV9CSVRTKHgpCQkJKCgoeCkgJiAweGZmZmYpIDw8IDApCisjZGVmaW5lIEFMTU9TVF9GVUxMX0JJVFMoeCkJCQkoKCh4KSAmIDB4ZmYpIDw8IDE2KQorI2RlZmluZSBGRUFUVVJFU19SRUcJCQkJMHgxNAorI2RlZmluZSBGSUZPX1NJWkVfUFJFU0VOVF9CSVQJCQkoMSA8PCAwKQorI2RlZmluZSBGSUZPX1dPUkRTX1BSRVNFTlRfQklUCQkJKDEgPDwgMSkKKyNkZWZpbmUgTEVWRUxfRURHRV9JTlRFUlJVUFRTX1BSRVNFTlRfQklUCSgxIDw8IDIpCisjZGVmaW5lIEdQSU9fU1VQUE9SVEVEX0JJVAkJCSgxIDw8IDMpCisjZGVmaW5lIFBMWF9ETUFfQ0gxX1NVUFBPUlRFRF9CSVQJCSgxIDw8IDQpCisjZGVmaW5lIE9WRVJSVU5fVU5ERVJSVU5fU1VQUE9SVEVEX0JJVAkJKDEgPDwgNSkKKyNkZWZpbmUgRklGT19SRUcJCQkJMHgxOAorI2RlZmluZSBUWF9TVEFUVVNfQ09VTlRfUkVHCQkJMHgxYworI2RlZmluZSBUWF9MSU5FX1ZBTElEX0NPVU5UX1JFRwkJCTB4MjAsCisjZGVmaW5lIFRYX0xJTkVfSU5WQUxJRF9DT1VOVF9SRUcJCTB4MjQKKyNkZWZpbmUgUlhfU1RBVFVTX0NPVU5UX1JFRwkJCTB4MjgKKyNkZWZpbmUgUlhfTElORV9DT1VOVF9SRUcJCQkweDJjCisjZGVmaW5lIElOVEVSUlVQVF9DT05UUk9MX1JFRwkJCTB4MzAKKyNkZWZpbmUgRlJBTUVfVkFMSURfU1RBUlRfSU5UUgkJCSgxIDw8IDApCisjZGVmaW5lIEZSQU1FX1ZBTElEX0VORF9JTlRSCQkJKDEgPDwgMSkKKyNkZWZpbmUgVFhfRklGT19FTVBUWV9JTlRSCQkJKDEgPDwgOCkKKyNkZWZpbmUgVFhfRklGT19BTE1PU1RfRU1QVFlfSU5UUgkJKDEgPDwgOSkKKyNkZWZpbmUgVFhfRklGT19BTE1PU1RfRlVMTF9JTlRSCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFhfRklGT19GVUxMX0lOVFIJCQkoMSA8PCAxMSkKKyNkZWZpbmUgUlhfRU1QVFlfSU5UUgkJCQkoMSA8PCAxMikKKyNkZWZpbmUgUlhfQUxNT1NUX0VNUFRZX0lOVFIJCQkoMSA8PCAxMykKKyNkZWZpbmUgUlhfQUxNT1NUX0ZVTExfSU5UUgkJCSgxIDw8IDE0KQorI2RlZmluZSBSWF9GVUxMX0lOVFIJCQkJKDEgPDwgMTUpCisjZGVmaW5lIElOVEVSUlVQVF9TVEFUVVNfUkVHCQkJMHgzNAorI2RlZmluZSBUWF9DTE9DS19ESVZJREVSX1JFRwkJCTB4MzgKKyNkZWZpbmUgVFhfRklGT19TSVpFX1JFRwkJCTB4NDAKKyNkZWZpbmUgUlhfRklGT19TSVpFX1JFRwkJCTB4NDQKKyNkZWZpbmUgRklGT19TSVpFX01BU0sJCQkJKDB4ZmZmZmYgPDwgMCkKKyNkZWZpbmUgVFhfRklGT19XT1JEU19SRUcJCQkweDQ4CisjZGVmaW5lIFJYX0ZJRk9fV09SRFNfUkVHCQkJMHg0YworI2RlZmluZSBJTlRFUlJVUFRfRURHRV9MRVZFTF9SRUcJCTB4NTAKKyNkZWZpbmUgSU5URVJSVVBUX1BPTEFSSVRZX1JFRwkJCTB4NTQKIAotI2RlZmluZSBUSU1FUl9CQVNFIDUwCQkvKiAgMjBNSHogbWFzdGVyIGNsb2NrICovCi0jZGVmaW5lIERNQV9CVUZGRVJfU0laRSAweDEwMDAwCi0jZGVmaW5lIE5VTV9ETUFfQlVGRkVSUyA0Ci0jZGVmaW5lIE5VTV9ETUFfREVTQ1JJUFRPUlMgMjU2Ci0KLWVudW0gaHBkaV9yZWdpc3RlcnMgewotCUZJUk1XQVJFX1JFVl9SRUcgPSAweDAsCi0JQk9BUkRfQ09OVFJPTF9SRUcgPSAweDQsCi0JQk9BUkRfU1RBVFVTX1JFRyA9IDB4OCwKLQlUWF9QUk9HX0FMTU9TVF9SRUcgPSAweGMsCi0JUlhfUFJPR19BTE1PU1RfUkVHID0gMHgxMCwKLQlGRUFUVVJFU19SRUcgPSAweDE0LAotCUZJRk9fUkVHID0gMHgxOCwKLQlUWF9TVEFUVVNfQ09VTlRfUkVHID0gMHgxYywKLQlUWF9MSU5FX1ZBTElEX0NPVU5UX1JFRyA9IDB4MjAsCi0JVFhfTElORV9JTlZBTElEX0NPVU5UX1JFRyA9IDB4MjQsCi0JUlhfU1RBVFVTX0NPVU5UX1JFRyA9IDB4MjgsCi0JUlhfTElORV9DT1VOVF9SRUcgPSAweDJjLAotCUlOVEVSUlVQVF9DT05UUk9MX1JFRyA9IDB4MzAsCi0JSU5URVJSVVBUX1NUQVRVU19SRUcgPSAweDM0LAotCVRYX0NMT0NLX0RJVklERVJfUkVHID0gMHgzOCwKLQlUWF9GSUZPX1NJWkVfUkVHID0gMHg0MCwKLQlSWF9GSUZPX1NJWkVfUkVHID0gMHg0NCwKLQlUWF9GSUZPX1dPUkRTX1JFRyA9IDB4NDgsCi0JUlhfRklGT19XT1JEU19SRUcgPSAweDRjLAotCUlOVEVSUlVQVF9FREdFX0xFVkVMX1JFRyA9IDB4NTAsCi0JSU5URVJSVVBUX1BPTEFSSVRZX1JFRyA9IDB4NTQsCi19OwotCi0vKiBiaXQgZGVmaW5pdGlvbnMgKi8KLQotZW51bSBmaXJtd2FyZV9yZXZpc2lvbl9iaXRzIHsKLQlGRUFUVVJFU19SRUdfUFJFU0VOVF9CSVQgPSAweDgwMDAsCi19OwotCi1lbnVtIGJvYXJkX2NvbnRyb2xfYml0cyB7Ci0JQk9BUkRfUkVTRVRfQklUID0gMHgxLAkvKiB3YWl0IDEwdXNlYyBiZWZvcmUgYWNjZXNzaW5nIGZpZm9zICovCi0JVFhfRklGT19SRVNFVF9CSVQgPSAweDIsCi0JUlhfRklGT19SRVNFVF9CSVQgPSAweDQsCi0JVFhfRU5BQkxFX0JJVCA9IDB4MTAsCi0JUlhfRU5BQkxFX0JJVCA9IDB4MjAsCi0JREVNQU5EX0RNQV9ESVJFQ1RJT05fVFhfQklUID0gMHg0MCwKLQkJLyogZm9yIGNoIDAsIGNoIDEgY2FuIG9ubHkgdHJhbnNtaXQgKHdoZW4gcHJlc2VudCkgKi8KLQlMSU5FX1ZBTElEX09OX1NUQVRVU19WQUxJRF9CSVQgPSAweDgwLAotCVNUQVJUX1RYX0JJVCA9IDB4MTAsCi0JQ0FCTEVfVEhST1RUTEVfRU5BQkxFX0JJVCA9IDB4MjAsCi0JVEVTVF9NT0RFX0VOQUJMRV9CSVQgPSAweDgwMDAwMDAwLAotfTsKLQotZW51bSBib2FyZF9zdGF0dXNfYml0cyB7Ci0JQ09NTUFORF9MSU5FX1NUQVRVU19NQVNLID0gMHg3ZiwKLQlUWF9JTl9QUk9HUkVTU19CSVQgPSAweDgwLAotCVRYX05PVF9FTVBUWV9CSVQgPSAweDEwMCwKLQlUWF9OT1RfQUxNT1NUX0VNUFRZX0JJVCA9IDB4MjAwLAotCVRYX05PVF9BTE1PU1RfRlVMTF9CSVQgPSAweDQwMCwKLQlUWF9OT1RfRlVMTF9CSVQgPSAweDgwMCwKLQlSWF9OT1RfRU1QVFlfQklUID0gMHgxMDAwLAotCVJYX05PVF9BTE1PU1RfRU1QVFlfQklUID0gMHgyMDAwLAotCVJYX05PVF9BTE1PU1RfRlVMTF9CSVQgPSAweDQwMDAsCi0JUlhfTk9UX0ZVTExfQklUID0gMHg4MDAwLAotCUJPQVJEX0pVTVBFUjBfSU5TVEFMTEVEX0JJVCA9IDB4MTAwMDAsCi0JQk9BUkRfSlVNUEVSMV9JTlNUQUxMRURfQklUID0gMHgyMDAwMCwKLQlUWF9PVkVSUlVOX0JJVCA9IDB4MjAwMDAwLAotCVJYX1VOREVSUlVOX0JJVCA9IDB4NDAwMDAwLAotCVJYX09WRVJSVU5fQklUID0gMHg4MDAwMDAsCi19OwotCi1zdGF0aWMgdWludDMyX3QgYWxtb3N0X2Z1bGxfYml0cyh1bnNpZ25lZCBpbnQgbnVtX3dvcmRzKQotewotCS8qIFhYWCBuZWVkIHRvIGFkZCBvciBzdWJ0cmFjdCBvbmU/ICovCi0JcmV0dXJuIChudW1fd29yZHMgPDwgMTYpICYgMHhmZjAwMDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBhbG1vc3RfZW1wdHlfYml0cyh1bnNpZ25lZCBpbnQgbnVtX3dvcmRzKQotewotCXJldHVybiBudW1fd29yZHMgJiAweGZmZmY7Ci19Ci0KLWVudW0gZmVhdHVyZXNfYml0cyB7Ci0JRklGT19TSVpFX1BSRVNFTlRfQklUID0gMHgxLAotCUZJRk9fV09SRFNfUFJFU0VOVF9CSVQgPSAweDIsCi0JTEVWRUxfRURHRV9JTlRFUlJVUFRTX1BSRVNFTlRfQklUID0gMHg0LAotCUdQSU9fU1VQUE9SVEVEX0JJVCA9IDB4OCwKLQlQTFhfRE1BX0NIMV9TVVBQT1JURURfQklUID0gMHgxMCwKLQlPVkVSUlVOX1VOREVSUlVOX1NVUFBPUlRFRF9CSVQgPSAweDIwLAotfTsKLQotZW51bSBpbnRlcnJ1cHRfc291cmNlcyB7Ci0JRlJBTUVfVkFMSURfU1RBUlRfSU5UUiA9IDAsCi0JRlJBTUVfVkFMSURfRU5EX0lOVFIgPSAxLAotCVRYX0ZJRk9fRU1QVFlfSU5UUiA9IDgsCi0JVFhfRklGT19BTE1PU1RfRU1QVFlfSU5UUiA9IDksCi0JVFhfRklGT19BTE1PU1RfRlVMTF9JTlRSID0gMTAsCi0JVFhfRklGT19GVUxMX0lOVFIgPSAxMSwKLQlSWF9FTVBUWV9JTlRSID0gMTIsCi0JUlhfQUxNT1NUX0VNUFRZX0lOVFIgPSAxMywKLQlSWF9BTE1PU1RfRlVMTF9JTlRSID0gMTQsCi0JUlhfRlVMTF9JTlRSID0gMTUsCi19OwotCi1zdGF0aWMgdWludDMyX3QgaW50cl9iaXQoaW50IGludGVycnVwdF9zb3VyY2UpCi17Ci0JcmV0dXJuIDB4MSA8PCBpbnRlcnJ1cHRfc291cmNlOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGZpZm9fc2l6ZSh1aW50MzJfdCBmaWZvX3NpemVfYml0cykKLXsKLQlyZXR1cm4gZmlmb19zaXplX2JpdHMgJiAweGZmZmZmOwotfQorI2RlZmluZSBUSU1FUl9CQVNFCQkJCTUwCS8qIDIwTUh6IG1hc3RlciBjbG9jayAqLworI2RlZmluZSBETUFfQlVGRkVSX1NJWkUJCQkJMHgxMDAwMAorI2RlZmluZSBOVU1fRE1BX0JVRkZFUlMJCQkJNAorI2RlZmluZSBOVU1fRE1BX0RFU0NSSVBUT1JTCQkJMjU2CiAKIHN0cnVjdCBocGRpX2JvYXJkIHsKLQljb25zdCBjaGFyICpuYW1lOwkvKiAgYm9hcmQgbmFtZSAqLwotCWludCBkZXZpY2VfaWQ7CQkvKiAgcGNpIGRldmljZSBpZCAqLwotCWludCBzdWJkZXZpY2VfaWQ7CS8qICBwY2kgc3ViZGV2aWNlIGlkICovCisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgZGV2aWNlX2lkOworCWludCBzdWJkZXZpY2VfaWQ7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhwZGlfYm9hcmQgaHBkaV9ib2FyZHNbXSA9IHsKIAl7Ci0JIC5uYW1lID0gInBjaS1ocGRpMzIiLAotCSAuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9QTFhfOTA4MCwKLQkgLnN1YmRldmljZV9pZCA9IDB4MjQwMCwKKwkJLm5hbWUJCT0gInBjaS1ocGRpMzIiLAorCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9QTFhfOTA4MCwKKwkJLnN1YmRldmljZV9pZAk9IDB4MjQwMCwKIAkgfSwKICNpZiAwCiAJewotCSAubmFtZSA9ICJweGktaHBkaTMyIiwKLQkgLmRldmljZV9pZCA9IDB4OTY1NiwKLQkgLnN1YmRldmljZV9pZCA9IDB4MjcwNSwKKwkJLm5hbWUJCT0gInB4aS1ocGRpMzIiLAorCQkuZGV2aWNlX2lkCT0gMHg5NjU2LAorCQkuc3ViZGV2aWNlX2lkCT0gMHgyNzA1LAogCSB9LAogI2VuZGlmCiB9OwogCiBzdHJ1Y3QgaHBkaV9wcml2YXRlIHsKLQkvKiAgYmFzZSBhZGRyZXNzZXMgKGlvcmVtYXBwZWQpICovCi0Jdm9pZCBfX2lvbWVtICpwbHg5MDgwX2lvYmFzZTsKLQl2b2lkIF9faW9tZW0gKmhwZGlfaW9iYXNlOworCXZvaWQgX19pb21lbSAqcGx4OTA4MF9tbWlvOworCXZvaWQgX19pb21lbSAqbW1pbzsKIAl1aW50MzJfdCAqZGlvX2J1ZmZlcltOVU1fRE1BX0JVRkZFUlNdOwkvKiAgZG1hIGJ1ZmZlcnMgKi8KIAkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgZG1hIGJ1ZmZlcnMgKi8KIAlkbWFfYWRkcl90IGRpb19idWZmZXJfcGh5c19hZGRyW05VTV9ETUFfQlVGRkVSU107CkBAIC0yMDcsMjYgKzE2MSwzMzQgQEAKIAkvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIGJ1ZmZlcnMgaW5kZXhlZCBieSBkZXNjcmlwdG9yICovCiAJdWludDMyX3QgKmRlc2NfZGlvX2J1ZmZlcltOVU1fRE1BX0RFU0NSSVBUT1JTXTsKIAkvKiBpbmRleCBvZiB0aGUgZG1hIGRlc2NyaXB0b3IgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBkbWFfZGVzY19pbmRleDsKKwl1bnNpZ25lZCBpbnQgZG1hX2Rlc2NfaW5kZXg7CiAJdW5zaWduZWQgaW50IHR4X2ZpZm9fc2l6ZTsKIAl1bnNpZ25lZCBpbnQgcnhfZmlmb19zaXplOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGlvX2NvdW50OwotCS8qIHNvZnR3YXJlIGNvcGllcyBvZiB2YWx1ZXMgd3JpdHRlbiB0byBocGRpIHJlZ2lzdGVycyAqLwotCXZvbGF0aWxlIHVpbnQzMl90IGJpdHNbMjRdOworCXVuc2lnbmVkIGxvbmcgZGlvX2NvdW50OwogCS8qIG51bWJlciBvZiBieXRlcyBhdCB3aGljaCB0byBnZW5lcmF0ZSBDT01FRElfQ0JfQkxPQ0sgZXZlbnRzICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CiB9OwogCi1zdGF0aWMgaW50IGRpb19jb25maWdfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBnc2NfaHBkaV9kcmFpbl9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBkZXNjOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBuZXh0OworCisJaWYgKGNoYW5uZWwpCisJCW5leHQgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMV9QQ0lfQUREUkVTU19SRUcpOworCWVsc2UKKwkJbmV4dCA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRyk7CisKKwlpZHggPSBkZXZwcml2LT5kbWFfZGVzY19pbmRleDsKKwlzdGFydCA9IGxlMzJfdG9fY3B1KGRldnByaXYtPmRtYV9kZXNjW2lkeF0ucGNpX3N0YXJ0X2FkZHIpOworCS8qIGxvb3AgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCB0aGUgZnVsbCBidWZmZXJzICovCisJZm9yIChkZXNjID0gMDsgKG5leHQgPCBzdGFydCB8fCBuZXh0ID49IHN0YXJ0ICsgZGV2cHJpdi0+YmxvY2tfc2l6ZSkgJiYKKwkgICAgIGRlc2MgPCBkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzOyBkZXNjKyspIHsKKwkJLyogdHJhbnNmZXIgZGF0YSBmcm9tIGRtYSBidWZmZXIgdG8gY29tZWRpIGJ1ZmZlciAqLworCQlzaXplID0gZGV2cHJpdi0+YmxvY2tfc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CisJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJCWlmIChzaXplID4gZGV2cHJpdi0+ZGlvX2NvdW50KQorCQkJCXNpemUgPSBkZXZwcml2LT5kaW9fY291bnQ7CisJCQlkZXZwcml2LT5kaW9fY291bnQgLT0gc2l6ZTsKKwkJfQorCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsIGRldnByaXYtPmRlc2NfZGlvX2J1ZmZlcltpZHhdLAorCQkJCQkgIHNpemUgKiBzaXplb2YodWludDMyX3QpKTsKKwkJaWR4Kys7CisJCWlkeCAlPSBkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzOworCQlzdGFydCA9IGxlMzJfdG9fY3B1KGRldnByaXYtPmRtYV9kZXNjW2lkeF0ucGNpX3N0YXJ0X2FkZHIpOworCisJCWRldnByaXYtPmRtYV9kZXNjX2luZGV4ID0gaWR4OworCX0KKwkvKiAgWFhYIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1biBzb21laG93ICovCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBnc2NfaHBkaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKKwlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCXVpbnQzMl90IGhwZGlfaW50cl9zdGF0dXMsIGhwZGlfYm9hcmRfc3RhdHVzOworCXVpbnQzMl90IHBseF9zdGF0dXM7CisJdWludDMyX3QgcGx4X2JpdHM7CisJdWludDhfdCBkbWEwX3N0YXR1cywgZG1hMV9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcGx4X3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKKwlpZiAoKHBseF9zdGF0dXMgJiAoSUNTX0RNQTBfQSB8IElDU19ETUExX0EgfCBJQ1NfTElBKSkgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaHBkaV9pbnRyX3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBJTlRFUlJVUFRfU1RBVFVTX1JFRyk7CisJaHBkaV9ib2FyZF9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgQk9BUkRfU1RBVFVTX1JFRyk7CisKKwlpZiAoaHBkaV9pbnRyX3N0YXR1cykKKwkJd3JpdGVsKGhwZGlfaW50cl9zdGF0dXMsIGRldnByaXYtPm1taW8gKyBJTlRFUlJVUFRfU1RBVFVTX1JFRyk7CisKKwkvKiAgc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlkbWEwX3N0YXR1cyA9IHJlYWRiKGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0NTX1JFRyk7CisJaWYgKHBseF9zdGF0dXMgJiBJQ1NfRE1BMF9BKSB7CS8qICBkbWEgY2hhbiAwIGludGVycnVwdCAqLworCQl3cml0ZWIoKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKKwkJICAgICAgIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0NTX1JFRyk7CisKKwkJaWYgKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpCisJCQlnc2NfaHBkaV9kcmFpbl9kbWEoZGV2LCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisJZG1hMV9zdGF0dXMgPSByZWFkYihkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMV9DU19SRUcpOworCWlmIChwbHhfc3RhdHVzICYgSUNTX0RNQTFfQSkgewkvKiAgWFhYICovLyogIGRtYSBjaGFuIDEgaW50ZXJydXB0ICovCisJCXdyaXRlYigoZG1hMV9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklULAorCQkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTFfQ1NfUkVHKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogIGNsZWFyIHBvc3NpYmxlIHBseDkwODAgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpZiAocGx4X3N0YXR1cyAmIElDU19MRElBKSB7CS8qICBjbGVhciBsb2NhbCBkb29yYmVsbCBpbnRlcnJ1cHQgKi8KKwkJcGx4X2JpdHMgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfREJSX09VVF9SRUcpOworCQl3cml0ZWwocGx4X2JpdHMsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9EQlJfT1VUX1JFRyk7CisJfQorCisJaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfT1ZFUlJVTl9CSVQpIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInJ4IGZpZm8gb3ZlcnJ1blxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwl9CisKKwlpZiAoaHBkaV9ib2FyZF9zdGF0dXMgJiBSWF9VTkRFUlJVTl9CSVQpIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInJ4IGZpZm8gdW5kZXJydW5cbiIpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CisJfQorCisJaWYgKGRldnByaXYtPmRpb19jb3VudCA9PSAwKQorCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBnc2NfaHBkaV9hYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlwbHg5MDgwX2Fib3J0X2RtYShkZXZwcml2LT5wbHg5MDgwX21taW8sIGNoYW5uZWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGdzY19ocGRpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKworCXdyaXRlbCgwLCBkZXZwcml2LT5tbWlvICsgQk9BUkRfQ09OVFJPTF9SRUcpOworCXdyaXRlbCgwLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKKworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NjX2hwZGlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZhc3luYy0+Y21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgYml0czsKKworCWlmIChzLT5pb19iaXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlbChSWF9GSUZPX1JFU0VUX0JJVCwgZGV2cHJpdi0+bW1pbyArIEJPQVJEX0NPTlRST0xfUkVHKTsKKworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDApOworCisJZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXggPSAwOworCisJLyoKKwkgKiBUaGVzZSByZWdpc3RlciBhcmUgc3VwcG9zZWRseSB1bnVzZWQgZHVyaW5nIGNoYWluZWQgZG1hLAorCSAqIGJ1dCBJIGhhdmUgZm91bmQgdGhhdCBsZWZ0IG92ZXIgdmFsdWVzIGZyb20gbGFzdCBvcGVyYXRpb24KKwkgKiBvY2Nhc2lvbmFsbHkgY2F1c2UgcHJvYmxlbXMgd2l0aCB0cmFuc2ZlciBvZiBmaXJzdCBkbWEKKwkgKiBibG9jay4gIEluaXRpYWxpemluZyB0aGVtIHRvIHplcm8gc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtLgorCSAqLworCXdyaXRlbCgwLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9UUkFOU0ZFUl9TSVpFX1JFRyk7CisJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRyk7CisJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0xPQ0FMX0FERFJFU1NfUkVHKTsKKworCS8qIGdpdmUgbG9jYXRpb24gb2YgZmlyc3QgZG1hIGRlc2NyaXB0b3IgKi8KKwliaXRzID0gZGV2cHJpdi0+ZG1hX2Rlc2NfcGh5c19hZGRyIHwgUExYX0RFU0NfSU5fUENJX0JJVCB8CisJICAgICAgIFBMWF9JTlRSX1RFUk1fQ09VTlQgfCBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7CisJd3JpdGVsKGJpdHMsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHKTsKKworCS8qIGVuYWJsZSBkbWEgdHJhbnNmZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCXdyaXRlYihQTFhfRE1BX0VOX0JJVCB8IFBMWF9ETUFfU1RBUlRfQklUIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKKwkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTBfQ1NfUkVHKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQorCQlkZXZwcml2LT5kaW9fY291bnQgPSBjbWQtPnN0b3BfYXJnOworCWVsc2UKKwkJZGV2cHJpdi0+ZGlvX2NvdW50ID0gMTsKKworCS8qIGNsZWFyIG92ZXIvdW5kZXIgcnVuIHN0YXR1cyBmbGFncyAqLworCXdyaXRlbChSWF9VTkRFUlJVTl9CSVQgfCBSWF9PVkVSUlVOX0JJVCwKKwkgICAgICAgZGV2cHJpdi0+bW1pbyArIEJPQVJEX1NUQVRVU19SRUcpOworCisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoUlhfRlVMTF9JTlRSLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKKworCXdyaXRlbChSWF9FTkFCTEVfQklULCBkZXZwcml2LT5tbWlvICsgQk9BUkRfQ09OVFJPTF9SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NjX2hwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlpZiAocy0+aW9fYml0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCisKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCisJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCWlmICghY21kLT5jaGFubGlzdF9sZW4gfHwgIWNtZC0+Y2hhbmxpc3QpIHsKKwkJY21kLT5jaGFubGlzdF9sZW4gPSAzMjsKKwkJZXJyIHw9IC1FSU5WQUw7CisJfQorCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQorCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJZWxzZQkvKiBUUklHX05PTkUgKi8KKwkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCWlmIChlcnIpCisJCXJldHVybiA0OworCisJLyogc3RlcCA1OiBjb21wbGFpbiBhYm91dCBzcGVjaWFsIGNoYW5saXN0IGNvbnNpZGVyYXRpb25zICovCisKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSAhPSBpKSB7CisJCQkvKiAgWFhYIGNvdWxkIHN1cHBvcnQgOCBvciAxNiBjaGFubmVscyAqLworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKKwkJCQkiY2hhbmxpc3QgbXVzdCBiZSBjaCAwIHRvIDMxIGluIG9yZGVyIik7CisJCQllcnIgfD0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDU7CisKKwlyZXR1cm4gMDsKKworfQorCisvKiBzZXR1cCBkbWEgZGVzY3JpcHRvcnMgc28gYSBsaW5rIGNvbXBsZXRlcyBldmVyeSAnbGVuJyBieXRlcyAqLworc3RhdGljIGludCBnc2NfaHBkaV9zZXR1cF9kbWFfZGVzY3JpcHRvcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHIgPSBkZXZwcml2LT5kbWFfZGVzY19waHlzX2FkZHI7CisJdWludDMyX3QgbmV4dF9iaXRzID0gUExYX0RFU0NfSU5fUENJX0JJVCB8IFBMWF9JTlRSX1RFUk1fQ09VTlQgfAorCQkJICAgICBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50IGlkeCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAobGVuID4gRE1BX0JVRkZFUl9TSVpFKQorCQlsZW4gPSBETUFfQlVGRkVSX1NJWkU7CisJbGVuIC09IGxlbiAlIHNpemVvZih1aW50MzJfdCk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BX0RFU0NSSVBUT1JTICYmIGlkeCA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7CisJCWRldnByaXYtPmRtYV9kZXNjW2ldLnBjaV9zdGFydF9hZGRyID0KKwkJICAgIGNwdV90b19sZTMyKGRldnByaXYtPmRpb19idWZmZXJfcGh5c19hZGRyW2lkeF0gKyBvZmZzZXQpOworCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5sb2NhbF9zdGFydF9hZGRyID0gY3B1X3RvX2xlMzIoRklGT19SRUcpOworCQlkZXZwcml2LT5kbWFfZGVzY1tpXS50cmFuc2Zlcl9zaXplID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0ubmV4dCA9IGNwdV90b19sZTMyKChwaHlzX2FkZHIgKworCQkJKGkgKyAxKSAqIHNpemVvZihkZXZwcml2LT5kbWFfZGVzY1swXSkpIHwgbmV4dF9iaXRzKTsKKworCQlkZXZwcml2LT5kZXNjX2Rpb19idWZmZXJbaV0gPSBkZXZwcml2LT5kaW9fYnVmZmVyW2lkeF0gKworCQkJCQkgICAgICAob2Zmc2V0IC8gc2l6ZW9mKHVpbnQzMl90KSk7CisKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJaWYgKGxlbiArIG9mZnNldCA+IERNQV9CVUZGRVJfU0laRSkgeworCQkJb2Zmc2V0ID0gMDsKKwkJCWlkeCsrOworCQl9CisJfQorCWRldnByaXYtPm51bV9kbWFfZGVzY3JpcHRvcnMgPSBpOworCS8qIGZpeCBsYXN0IGRlc2NyaXB0b3IgdG8gcG9pbnQgYmFjayB0byBmaXJzdCAqLworCWRldnByaXYtPmRtYV9kZXNjW2kgLSAxXS5uZXh0ID0gY3B1X3RvX2xlMzIocGh5c19hZGRyIHwgbmV4dF9iaXRzKTsKKworCWRldnByaXYtPmJsb2NrX3NpemUgPSBsZW47CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGdzY19ocGRpX2Rpb19pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJaW50IHJldDsKIAogCXN3aXRjaCAoZGF0YVswXSkgewogCWNhc2UgSU5TTl9DT05GSUdfQkxPQ0tfU0laRToKLQkJcmV0dXJuIGRpb19jb25maWdfYmxvY2tfc2l6ZShkZXYsIGRhdGEpOworCQlyZXQgPSBnc2NfaHBkaV9zZXR1cF9kbWFfZGVzY3JpcHRvcnMoZGV2LCBkYXRhWzFdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGF0YVsxXSA9IHJldDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gY29tZWRpX2Rpb19pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGRhdGEsIDB4ZmZmZmZmZmYpOwogCQlpZiAocmV0KQpAQCAtMjM3LDMxICs0OTksNTMgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIHZvaWQgZGlzYWJsZV9wbHhfaW50ZXJydXB0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBnc2NfaHBkaV9pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1aW50MzJfdCBwbHhfaW50Y3NyX2JpdHM7CiAKLQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfSU5UUkNTX1JFRyk7CisJLyogd2FpdCAxMHVzZWMgYWZ0ZXIgcmVzZXQgYmVmb3JlIGFjY2Vzc2luZyBmaWZvcyAqLworCXdyaXRlbChCT0FSRF9SRVNFVF9CSVQsIGRldnByaXYtPm1taW8gKyBCT0FSRF9DT05UUk9MX1JFRyk7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlbChBTE1PU1RfRU1QVFlfQklUUygzMikgfCBBTE1PU1RfRlVMTF9CSVRTKDMyKSwKKwkgICAgICAgZGV2cHJpdi0+bW1pbyArIFJYX1BST0dfQUxNT1NUX1JFRyk7CisJd3JpdGVsKEFMTU9TVF9FTVBUWV9CSVRTKDMyKSB8IEFMTU9TVF9GVUxMX0JJVFMoMzIpLAorCSAgICAgICBkZXZwcml2LT5tbWlvICsgVFhfUFJPR19BTE1PU1RfUkVHKTsKKworCWRldnByaXYtPnR4X2ZpZm9fc2l6ZSA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBUWF9GSUZPX1NJWkVfUkVHKSAmCisJCQkJRklGT19TSVpFX01BU0s7CisJZGV2cHJpdi0+cnhfZmlmb19zaXplID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFJYX0ZJRk9fU0laRV9SRUcpICYKKwkJCQlGSUZPX1NJWkVfTUFTSzsKKworCXdyaXRlbCgwLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKKworCS8qICBlbmFibGUgaW50ZXJydXB0cyAqLworCXBseF9pbnRjc3JfYml0cyA9CisJICAgIElDU19BRVJSIHwgSUNTX1BFUlIgfCBJQ1NfUElFIHwgSUNTX1BMSUUgfCBJQ1NfUEFJRSB8IElDU19MSUUgfAorCSAgICBJQ1NfRE1BMF9FOworCXdyaXRlbChwbHhfaW50Y3NyX2JpdHMsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKKworCXJldHVybiAwOwogfQogCi0vKiBpbml0aWFsaXplIHBseDkwODAgY2hpcCAqLwotc3RhdGljIHZvaWQgaW5pdF9wbHg5MDgwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBnc2NfaHBkaV9pbml0X3BseDkwODAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVpbnQzMl90IGJpdHM7Ci0Jdm9pZCBfX2lvbWVtICpwbHhfaW9iYXNlID0gZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwbHhfaW9iYXNlID0gZGV2cHJpdi0+cGx4OTA4MF9tbWlvOwogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAJYml0cyA9IEJJR0VORF9ETUEwIHwgQklHRU5EX0RNQTE7CiAjZWxzZQogCWJpdHMgPSAwOwogI2VuZGlmCi0Jd3JpdGVsKGJpdHMsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0JJR0VORF9SRUcpOworCXdyaXRlbChiaXRzLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfQklHRU5EX1JFRyk7CiAKLQlkaXNhYmxlX3BseF9pbnRlcnJ1cHRzKGRldik7CisJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKIAotCWFib3J0X2RtYShkZXYsIDApOwotCWFib3J0X2RtYShkZXYsIDEpOworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDApOworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDEpOwogCiAJLyogIGNvbmZpZ3VyZSBkbWEwIG1vZGUgKi8KIAliaXRzID0gMDsKQEAgLTI4NSwxMTcgKzU2OSw3IEBACiAJd3JpdGVsKGJpdHMsIHBseF9pb2Jhc2UgKyBQTFhfRE1BMF9NT0RFX1JFRyk7CiB9CiAKLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlcy4KLSAqLwotc3RhdGljIGludCBzZXR1cF9zdWJkZXZpY2VzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0JaW50IHJldDsKLQotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KLQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKLS8qCWRldi0+d3JpdGVfc3ViZGV2ID0gczsgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOwotCXMtPnN1YmRldl9mbGFncyA9Ci0JICAgIFNERl9SRUFEQUJMRSB8IFNERl9XUklURUFCTEUgfCBTREZfTFNBTVBMIHwgU0RGX0NNRF9SRUFEOwotCXMtPm5fY2hhbiA9IDMyOwotCXMtPmxlbl9jaGFubGlzdCA9IDMyOwotCXMtPm1heGRhdGEgPSAxOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7Ci0Jcy0+aW5zbl9jb25maWcgPSBkaW9fY29uZmlnX2luc247Ci0Jcy0+ZG9fY21kID0gaHBkaV9jbWQ7Ci0Jcy0+ZG9fY21kdGVzdCA9IGhwZGlfY21kX3Rlc3Q7Ci0Jcy0+Y2FuY2VsID0gaHBkaV9jYW5jZWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbml0X2hwZGkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVpbnQzMl90IHBseF9pbnRjc3JfYml0czsKLQotCXdyaXRlbChCT0FSRF9SRVNFVF9CSVQsIGRldnByaXYtPmhwZGlfaW9iYXNlICsgQk9BUkRfQ09OVFJPTF9SRUcpOwotCXVkZWxheSgxMCk7Ci0KLQl3cml0ZWwoYWxtb3N0X2VtcHR5X2JpdHMoMzIpIHwgYWxtb3N0X2Z1bGxfYml0cygzMiksCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgUlhfUFJPR19BTE1PU1RfUkVHKTsKLQl3cml0ZWwoYWxtb3N0X2VtcHR5X2JpdHMoMzIpIHwgYWxtb3N0X2Z1bGxfYml0cygzMiksCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgVFhfUFJPR19BTE1PU1RfUkVHKTsKLQotCWRldnByaXYtPnR4X2ZpZm9fc2l6ZSA9IGZpZm9fc2l6ZShyZWFkbChkZXZwcml2LT5ocGRpX2lvYmFzZSArCi0JCQkJCQkgIFRYX0ZJRk9fU0laRV9SRUcpKTsKLQlkZXZwcml2LT5yeF9maWZvX3NpemUgPSBmaWZvX3NpemUocmVhZGwoZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKwotCQkJCQkJICBSWF9GSUZPX1NJWkVfUkVHKSk7Ci0KLQl3cml0ZWwoMCwgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBJTlRFUlJVUFRfQ09OVFJPTF9SRUcpOwotCi0JLyogIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JcGx4X2ludGNzcl9iaXRzID0KLQkgICAgSUNTX0FFUlIgfCBJQ1NfUEVSUiB8IElDU19QSUUgfCBJQ1NfUExJRSB8IElDU19QQUlFIHwgSUNTX0xJRSB8Ci0JICAgIElDU19ETUEwX0U7Ci0Jd3JpdGVsKHBseF9pbnRjc3JfYml0cywgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfSU5UUkNTX1JFRyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogc2V0dXAgZG1hIGRlc2NyaXB0b3JzIHNvIGEgbGluayBjb21wbGV0ZXMgZXZlcnkgJ3RyYW5zZmVyX3NpemUnIGJ5dGVzICovCi1zdGF0aWMgaW50IHNldHVwX2RtYV9kZXNjcmlwdG9ycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfc2l6ZSkKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBidWZmZXJfaW5kZXgsIGJ1ZmZlcl9vZmZzZXQ7Ci0JdWludDMyX3QgbmV4dF9iaXRzID0gUExYX0RFU0NfSU5fUENJX0JJVCB8IFBMWF9JTlRSX1RFUk1fQ09VTlQgfAotCSAgICBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAodHJhbnNmZXJfc2l6ZSA+IERNQV9CVUZGRVJfU0laRSkKLQkJdHJhbnNmZXJfc2l6ZSA9IERNQV9CVUZGRVJfU0laRTsKLQl0cmFuc2Zlcl9zaXplIC09IHRyYW5zZmVyX3NpemUgJSBzaXplb2YodWludDMyX3QpOwotCWlmICh0cmFuc2Zlcl9zaXplID09IDApCi0JCXJldHVybiAtMTsKLQotCWJ1ZmZlcl9vZmZzZXQgPSAwOwotCWJ1ZmZlcl9pbmRleCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9ETUFfREVTQ1JJUFRPUlMgJiYKLQkgICAgIGJ1ZmZlcl9pbmRleCA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7Ci0JCWRldnByaXYtPmRtYV9kZXNjW2ldLnBjaV9zdGFydF9hZGRyID0KLQkJICAgIGNwdV90b19sZTMyKGRldnByaXYtPmRpb19idWZmZXJfcGh5c19hZGRyW2J1ZmZlcl9pbmRleF0gKwotCQkJCWJ1ZmZlcl9vZmZzZXQpOwotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5sb2NhbF9zdGFydF9hZGRyID0gY3B1X3RvX2xlMzIoRklGT19SRUcpOwotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS50cmFuc2Zlcl9zaXplID0KLQkJICAgIGNwdV90b19sZTMyKHRyYW5zZmVyX3NpemUpOwotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5uZXh0ID0KLQkJICAgIGNwdV90b19sZTMyKChkZXZwcml2LT5kbWFfZGVzY19waHlzX2FkZHIgKyAoaSArCi0JCQkJCQkJCSAgMSkgKgotCQkJCSBzaXplb2YoZGV2cHJpdi0+ZG1hX2Rlc2NbMF0pKSB8IG5leHRfYml0cyk7Ci0KLQkJZGV2cHJpdi0+ZGVzY19kaW9fYnVmZmVyW2ldID0KLQkJICAgIGRldnByaXYtPmRpb19idWZmZXJbYnVmZmVyX2luZGV4XSArCi0JCSAgICAoYnVmZmVyX29mZnNldCAvIHNpemVvZih1aW50MzJfdCkpOwotCi0JCWJ1ZmZlcl9vZmZzZXQgKz0gdHJhbnNmZXJfc2l6ZTsKLQkJaWYgKHRyYW5zZmVyX3NpemUgKyBidWZmZXJfb2Zmc2V0ID4gRE1BX0JVRkZFUl9TSVpFKSB7Ci0JCQlidWZmZXJfb2Zmc2V0ID0gMDsKLQkJCWJ1ZmZlcl9pbmRleCsrOwotCQl9Ci0JfQotCWRldnByaXYtPm51bV9kbWFfZGVzY3JpcHRvcnMgPSBpOwotCS8qICBmaXggbGFzdCBkZXNjcmlwdG9yIHRvIHBvaW50IGJhY2sgdG8gZmlyc3QgKi8KLQlkZXZwcml2LT5kbWFfZGVzY1tpIC0gMV0ubmV4dCA9Ci0JICAgIGNwdV90b19sZTMyKGRldnByaXYtPmRtYV9kZXNjX3BoeXNfYWRkciB8IG5leHRfYml0cyk7Ci0KLQlkZXZwcml2LT5ibG9ja19zaXplID0gdHJhbnNmZXJfc2l6ZTsKLQotCXJldHVybiB0cmFuc2Zlcl9zaXplOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhwZGlfYm9hcmQgKmhwZGlfZmluZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQorc3RhdGljIGNvbnN0IHN0cnVjdCBocGRpX2JvYXJkICpnc2NfaHBkaV9maW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTQwNiwxNiArNTgwLDE3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgaHBkaV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCitzdGF0aWMgaW50IGdzY19ocGRpX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAljb25zdCBzdHJ1Y3QgaHBkaV9ib2FyZCAqdGhpc2JvYXJkOwogCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGk7CiAJaW50IHJldHZhbDsKIAotCXRoaXNib2FyZCA9IGhwZGlfZmluZF9ib2FyZChwY2lkZXYpOworCXRoaXNib2FyZCA9IGdzY19ocGRpX2ZpbmRfYm9hcmQocGNpZGV2KTsKIAlpZiAoIXRoaXNib2FyZCkgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiZ3NjX2hwZGk6IHBjaSAlcyBub3Qgc3VwcG9ydGVkXG4iLAogCQkJcGNpX25hbWUocGNpZGV2KSk7CkBAIC00MzMsMTcgKzYwOCwxNyBAQAogCQlyZXR1cm4gcmV0dmFsOwogCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CiAKLQlkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwY2lkZXYsIDApOwotCWRldnByaXYtPmhwZGlfaW9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMik7Ci0JaWYgKCFkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSB8fCAhZGV2cHJpdi0+aHBkaV9pb2Jhc2UpIHsKKwlkZXZwcml2LT5wbHg5MDgwX21taW8gPSBwY2lfaW9yZW1hcF9iYXIocGNpZGV2LCAwKTsKKwlkZXZwcml2LT5tbWlvID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMik7CisJaWYgKCFkZXZwcml2LT5wbHg5MDgwX21taW8gfHwgIWRldnByaXYtPm1taW8pIHsKIAkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsICJmYWlsZWQgdG8gcmVtYXAgaW8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaW5pdF9wbHg5MDgwKGRldik7CisJZ3NjX2hwZGlfaW5pdF9wbHg5MDgwKGRldik7CiAKIAkvKiAgZ2V0IGlycSAqLwotCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgaGFuZGxlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJaWYgKHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBnc2NfaHBkaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYpKSB7CiAJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAogCQkJICJ1bmFibGUgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBwY2lkZXYtPmlycSk7CkBAIC00NzAsMTggKzY0NSwzMyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlyZXR2YWwgPSBzZXR1cF9kbWFfZGVzY3JpcHRvcnMoZGV2LCAweDEwMDApOworCXJldHZhbCA9IGdzY19ocGRpX3NldHVwX2RtYV9kZXNjcmlwdG9ycyhkZXYsIDB4MTAwMCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAKLQlyZXR2YWwgPSBzZXR1cF9zdWJkZXZpY2VzKGRldik7Ci0JaWYgKHJldHZhbCA8IDApCisJcmV0dmFsID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcmV0dXJuIGluaXRfaHBkaShkZXYpOworCS8qIERpZ2l0YWwgSS9PIHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRSB8IFNERl9XUklURUFCTEUgfCBTREZfTFNBTVBMIHwKKwkJCSAgU0RGX0NNRF9SRUFEOworCXMtPm5fY2hhbgk9IDMyOworCXMtPmxlbl9jaGFubGlzdAk9IDMyOworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9jb25maWcJPSBnc2NfaHBkaV9kaW9faW5zbl9jb25maWc7CisJcy0+ZG9fY21kCT0gZ3NjX2hwZGlfY21kOworCXMtPmRvX2NtZHRlc3QJPSBnc2NfaHBkaV9jbWRfdGVzdDsKKwlzLT5jYW5jZWwJPSBnc2NfaHBkaV9jYW5jZWw7CisKKwlyZXR1cm4gZ3NjX2hwZGlfaW5pdChkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBocGRpX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZ3NjX2hwZGlfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTQ5MCwxMiArNjgwLDEyIEBACiAJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlpZiAoZGV2cHJpdikgewotCQlpZiAoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UpIHsKLQkJCWRpc2FibGVfcGx4X2ludGVycnVwdHMoZGV2KTsKLQkJCWlvdW5tYXAoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UpOworCQlpZiAoZGV2cHJpdi0+cGx4OTA4MF9tbWlvKSB7CisJCQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0lOVFJDU19SRUcpOworCQkJaW91bm1hcChkZXZwcml2LT5wbHg5MDgwX21taW8pOwogCQl9Ci0JCWlmIChkZXZwcml2LT5ocGRpX2lvYmFzZSkKLQkJCWlvdW5tYXAoZGV2cHJpdi0+aHBkaV9pb2Jhc2UpOworCQlpZiAoZGV2cHJpdi0+bW1pbykKKwkJCWlvdW5tYXAoZGV2cHJpdi0+bW1pbyk7CiAJCS8qICBmcmVlIHBjaSBkbWEgYnVmZmVycyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0RNQV9CVUZGRVJTOyBpKyspIHsKIAkJCWlmIChkZXZwcml2LT5kaW9fYnVmZmVyW2ldKQpAQCAtNTE2LDMxOCArNzA2LDExIEBACiAJY29tZWRpX3BjaV9kaXNhYmxlKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgZGlvX2NvbmZpZ19ibG9ja19zaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkX2Jsb2NrX3NpemU7Ci0JaW50IHJldHZhbDsKLQotCXJlcXVlc3RlZF9ibG9ja19zaXplID0gZGF0YVsxXTsKLQotCXJldHZhbCA9IHNldHVwX2RtYV9kZXNjcmlwdG9ycyhkZXYsIHJlcXVlc3RlZF9ibG9ja19zaXplKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCWRhdGFbMV0gPSByZXR2YWw7Ci0KLQlyZXR1cm4gMjsKLX0KLQotc3RhdGljIGludCBkaV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJICAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCi17Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7Ci0KLQkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIDE7Ci0KLQkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwotCi0JLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCi0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMjsKLQotCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KLQotCWlmICghY21kLT5jaGFubGlzdF9sZW4pIHsKLQkJY21kLT5jaGFubGlzdF9sZW4gPSAzMjsKLQkJZXJyIHw9IC1FSU5WQUw7Ci0JfQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0KLQlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKLQljYXNlIFRSSUdfQ09VTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUklHX05PTkU6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMzsKLQotCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KLQotCWlmIChlcnIpCi0JCXJldHVybiA0OwotCi0JaWYgKCFjbWQtPmNoYW5saXN0KQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDE7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7Ci0JCWlmIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pICE9IGkpIHsKLQkJCS8qICBYWFggY291bGQgc3VwcG9ydCA4IG9yIDE2IGNoYW5uZWxzICovCi0JCQljb21lZGlfZXJyb3IoZGV2LAotCQkJCSAgICAgImNoYW5saXN0IG11c3QgYmUgY2ggMCB0byAzMSBpbiBvcmRlciIpOwotCQkJZXJyKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChlcnIpCi0JCXJldHVybiA1OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBkaV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQotewotCWlmIChzLT5pb19iaXRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlCi0JCXJldHVybiBkaV9jbWRfdGVzdChkZXYsIHMsIGNtZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBocGRpX3dyaXRlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50MzJfdCBiaXRzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQotCXdyaXRlbChiaXRzIHwgZGV2cHJpdi0+Yml0c1tvZmZzZXQgLyBzaXplb2YodWludDMyX3QpXSwKLQkgICAgICAgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVpbnQzMl90IGJpdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwotCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKLQotCWhwZGlfd3JpdGVsKGRldiwgUlhfRklGT19SRVNFVF9CSVQsIEJPQVJEX0NPTlRST0xfUkVHKTsKLQotCWFib3J0X2RtYShkZXYsIDApOwotCi0JZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXggPSAwOwotCi0JLyogVGhlc2UgcmVnaXN0ZXIgYXJlIHN1cHBvc2VkbHkgdW51c2VkIGR1cmluZyBjaGFpbmVkIGRtYSwKLQkgKiBidXQgSSBoYXZlIGZvdW5kIHRoYXQgbGVmdCBvdmVyIHZhbHVlcyBmcm9tIGxhc3Qgb3BlcmF0aW9uCi0JICogb2NjYXNpb25hbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggdHJhbnNmZXIgb2YgZmlyc3QgZG1hCi0JICogYmxvY2suICBJbml0aWFsaXppbmcgdGhlbSB0byB6ZXJvIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbS4gKi8KLQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMF9UUkFOU0ZFUl9TSVpFX1JFRyk7Ci0Jd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfUENJX0FERFJFU1NfUkVHKTsKLQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMF9MT0NBTF9BRERSRVNTX1JFRyk7Ci0JLyogIGdpdmUgbG9jYXRpb24gb2YgZmlyc3QgZG1hIGRlc2NyaXB0b3IgKi8KLQliaXRzID0KLQkgICAgZGV2cHJpdi0+ZG1hX2Rlc2NfcGh5c19hZGRyIHwgUExYX0RFU0NfSU5fUENJX0JJVCB8Ci0JICAgIFBMWF9JTlRSX1RFUk1fQ09VTlQgfCBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7Ci0Jd3JpdGVsKGJpdHMsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfREVTQ1JJUFRPUl9SRUcpOwotCi0JLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JLyogIGVuYWJsZSBkbWEgdHJhbnNmZXIgKi8KLQl3cml0ZWIoUExYX0RNQV9FTl9CSVQgfCBQTFhfRE1BX1NUQVJUX0JJVCB8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQsCi0JICAgICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQlkZXZwcml2LT5kaW9fY291bnQgPSBjbWQtPnN0b3BfYXJnOwotCWVsc2UKLQkJZGV2cHJpdi0+ZGlvX2NvdW50ID0gMTsKLQotCS8qICBjbGVhciBvdmVyL3VuZGVyIHJ1biBzdGF0dXMgZmxhZ3MgKi8KLQl3cml0ZWwoUlhfVU5ERVJSVU5fQklUIHwgUlhfT1ZFUlJVTl9CSVQsCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgQk9BUkRfU1RBVFVTX1JFRyk7Ci0JLyogIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsKGludHJfYml0KFJYX0ZVTExfSU5UUiksCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKLQotCWhwZGlfd3JpdGVsKGRldiwgUlhfRU5BQkxFX0JJVCwgQk9BUkRfQ09OVFJPTF9SRUcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBkaV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCi17Ci0JaWYgKHMtPmlvX2JpdHMpCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UKLQkJcmV0dXJuIGRpX2NtZChkZXYsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBkcmFpbl9kbWFfYnVmZmVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gZGV2LT5yZWFkX3N1YmRldi0+YXN5bmM7Ci0JdWludDMyX3QgbmV4dF90cmFuc2Zlcl9hZGRyOwotCWludCBqOwotCWludCBudW1fc2FtcGxlcyA9IDA7Ci0Jdm9pZCBfX2lvbWVtICpwY2lfYWRkcl9yZWc7Ci0KLQlpZiAoY2hhbm5lbCkKLQkJcGNpX2FkZHJfcmVnID0KLQkJICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTFfUENJX0FERFJFU1NfUkVHOwotCWVsc2UKLQkJcGNpX2FkZHJfcmVnID0KLQkJICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfUENJX0FERFJFU1NfUkVHOwotCi0JLyogIGxvb3AgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCB0aGUgZnVsbCBidWZmZXJzICovCi0JaiA9IDA7Ci0JZm9yIChuZXh0X3RyYW5zZmVyX2FkZHIgPSByZWFkbChwY2lfYWRkcl9yZWcpOwotCSAgICAgKG5leHRfdHJhbnNmZXJfYWRkciA8Ci0JICAgICAgbGUzMl90b19jcHUoZGV2cHJpdi0+ZG1hX2Rlc2NbZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXhdLgotCQkJICBwY2lfc3RhcnRfYWRkcikKLQkgICAgICB8fCBuZXh0X3RyYW5zZmVyX2FkZHIgPj0KLQkgICAgICBsZTMyX3RvX2NwdShkZXZwcml2LT5kbWFfZGVzY1tkZXZwcml2LT5kbWFfZGVzY19pbmRleF0uCi0JCQkgIHBjaV9zdGFydF9hZGRyKSArIGRldnByaXYtPmJsb2NrX3NpemUpCi0JICAgICAmJiBqIDwgZGV2cHJpdi0+bnVtX2RtYV9kZXNjcmlwdG9yczsgaisrKSB7Ci0JCS8qICB0cmFuc2ZlciBkYXRhIGZyb20gZG1hIGJ1ZmZlciB0byBjb21lZGkgYnVmZmVyICovCi0JCW51bV9zYW1wbGVzID0gZGV2cHJpdi0+YmxvY2tfc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7Ci0JCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKLQkJCWlmIChudW1fc2FtcGxlcyA+IGRldnByaXYtPmRpb19jb3VudCkKLQkJCQludW1fc2FtcGxlcyA9IGRldnByaXYtPmRpb19jb3VudDsKLQkJCWRldnByaXYtPmRpb19jb3VudCAtPSBudW1fc2FtcGxlczsKLQkJfQotCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKGRldi0+cmVhZF9zdWJkZXYsCi0JCQkJCSAgZGV2cHJpdi0+ZGVzY19kaW9fYnVmZmVyW2RldnByaXYtPgotCQkJCQkJCQkgICAgIGRtYV9kZXNjX2luZGV4XSwKLQkJCQkJICBudW1fc2FtcGxlcyAqIHNpemVvZih1aW50MzJfdCkpOwotCQlkZXZwcml2LT5kbWFfZGVzY19pbmRleCsrOwotCQlkZXZwcml2LT5kbWFfZGVzY19pbmRleCAlPSBkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzOwotCX0KLQkvKiAgWFhYIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1biBzb21laG93ICovCi19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKLQl1aW50MzJfdCBocGRpX2ludHJfc3RhdHVzLCBocGRpX2JvYXJkX3N0YXR1czsKLQl1aW50MzJfdCBwbHhfc3RhdHVzOwotCXVpbnQzMl90IHBseF9iaXRzOwotCXVpbnQ4X3QgZG1hMF9zdGF0dXMsIGRtYTFfc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWRldi0+YXR0YWNoZWQpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXBseF9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9JTlRSQ1NfUkVHKTsKLQlpZiAoKHBseF9zdGF0dXMgJiAoSUNTX0RNQTBfQSB8IElDU19ETUExX0EgfCBJQ1NfTElBKSkgPT0gMCkKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JaHBkaV9pbnRyX3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX1NUQVRVU19SRUcpOwotCWhwZGlfYm9hcmRfc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBCT0FSRF9TVEFUVVNfUkVHKTsKLQotCWFzeW5jLT5ldmVudHMgPSAwOwotCi0JaWYgKGhwZGlfaW50cl9zdGF0dXMpIHsKLQkJd3JpdGVsKGhwZGlfaW50cl9zdGF0dXMsCi0JCSAgICAgICBkZXZwcml2LT5ocGRpX2lvYmFzZSArIElOVEVSUlVQVF9TVEFUVVNfUkVHKTsKLQl9Ci0JLyogIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JZG1hMF9zdGF0dXMgPSByZWFkYihkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX0NTX1JFRyk7Ci0JaWYgKHBseF9zdGF0dXMgJiBJQ1NfRE1BMF9BKSB7CS8qICBkbWEgY2hhbiAwIGludGVycnVwdCAqLwotCQl3cml0ZWIoKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKLQkJICAgICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHKTsKLQotCQlpZiAoZG1hMF9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkKLQkJCWRyYWluX2RtYV9idWZmZXJzKGRldiwgMCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCS8qICBzcGluIGxvY2sgbWFrZXMgc3VyZSBubyBvbmUgZWxzZSBjaGFuZ2VzIHBseCBkbWEgY29udHJvbCByZWcgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwotCWRtYTFfc3RhdHVzID0gcmVhZGIoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMV9DU19SRUcpOwotCWlmIChwbHhfc3RhdHVzICYgSUNTX0RNQTFfQSkgewkvKiAgWFhYICovLyogIGRtYSBjaGFuIDEgaW50ZXJydXB0ICovCi0JCXdyaXRlYigoZG1hMV9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklULAotCQkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMV9DU19SRUcpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQkvKiAgY2xlYXIgcG9zc2libGUgcGx4OTA4MCBpbnRlcnJ1cHQgc291cmNlcyAqLwotCWlmIChwbHhfc3RhdHVzICYgSUNTX0xESUEpIHsJLyogIGNsZWFyIGxvY2FsIGRvb3JiZWxsIGludGVycnVwdCAqLwotCQlwbHhfYml0cyA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RCUl9PVVRfUkVHKTsKLQkJd3JpdGVsKHBseF9iaXRzLCBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9EQlJfT1VUX1JFRyk7Ci0JfQotCi0JaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfT1ZFUlJVTl9CSVQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgInJ4IGZpZm8gb3ZlcnJ1biIpOwotCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JfQotCi0JaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfVU5ERVJSVU5fQklUKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJyeCBmaWZvIHVuZGVycnVuIik7Ci0JCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQl9Ci0KLQlpZiAoZGV2cHJpdi0+ZGlvX2NvdW50ID09IDApCi0JCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQotCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFib3J0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiAgc3BpbmxvY2sgZm9yIHBseCBkbWEgY29udHJvbC9zdGF0dXMgcmVnICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXBseDkwODBfYWJvcnRfZG1hKGRldnByaXYtPnBseDkwODBfaW9iYXNlLCBjaGFubmVsKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBocGRpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCi0JaHBkaV93cml0ZWwoZGV2LCAwLCBCT0FSRF9DT05UUk9MX1JFRyk7Ci0KLQl3cml0ZWwoMCwgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBJTlRFUlJVUFRfQ09OVFJPTF9SRUcpOwotCi0JYWJvcnRfZG1hKGRldiwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGdzY19ocGRpX2RyaXZlciA9IHsKIAkuZHJpdmVyX25hbWUJPSAiZ3NjX2hwZGkiLAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCi0JLmF1dG9fYXR0YWNoCT0gaHBkaV9hdXRvX2F0dGFjaCwKLQkuZGV0YWNoCQk9IGhwZGlfZGV0YWNoLAorCS5hdXRvX2F0dGFjaAk9IGdzY19ocGRpX2F1dG9fYXR0YWNoLAorCS5kZXRhY2gJCT0gZ3NjX2hwZGlfZGV0YWNoLAogfTsKIAogc3RhdGljIGludCBnc2NfaHBkaV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwppbmRleCA4MDUzOWIyLi4wYjhiMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCkBAIC0xNzEsMTIgKzE3MSwyNyBAQAogCX0KIH0KIAorc3RhdGljIGludCBpY3BfbXVsdGlfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CisJaWYgKChzdGF0dXMgJiBBRENfQlNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGljcF9tdWx0aV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCB0aW1lb3V0OworCWludCByZXQgPSAwOworCWludCBuOwogCiAJLyogIERpc2FibGUgQS9EIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCiAJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CkBAIC0xOTksMzMgKzIxNCwxMCBAQAogCQl1ZGVsYXkoMSk7CiAKIAkJLyogIFdhaXQgZm9yIGNvbnZlcnNpb24gdG8gY29tcGxldGUsIG9yIGdldCBmZWQgdXAgd2FpdGluZyAqLwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKLQkJCQkgICAgSUNQX01VTFRJX0FEQ19DU1IpICYgQURDX0JTWSkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBpY3BfbXVsdGlfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCi0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQotCQkvKiAgSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCAqLwotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dCIpOwotCi0JCS8qICBEaXNhYmxlIGludGVycnVwdCAqLwotCQlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKLQkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOwotCi0JCS8qICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7Ci0JCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCi0JCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKLQotCQkvKiAgQ2xlYXIgZGF0YSByZWNlaXZlZCAqLwotCQlkYXRhW25dID0gMDsKLQotCQlyZXR1cm4gLUVUSU1FOwotCi1jb252X2ZpbmlzaDoKIAkJZGF0YVtuXSA9CiAJCSAgICAocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BSSkgPj4gNCkgJiAweDBmZmY7CiAJfQpAQCAtMjM4LDcgKzIzMCwyMSBAQAogCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CiAJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CiAKLQlyZXR1cm4gbjsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKK30KKworc3RhdGljIGludCBpY3BfbXVsdGlfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREFDX0NTUik7CisJaWYgKChzdGF0dXMgJiBEQUNfQlNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0yNDYsNyArMjUyLDggQEAKIAkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIGNoYW4sIHJhbmdlLCB0aW1lb3V0OworCWludCBuLCBjaGFuLCByYW5nZTsKKwlpbnQgcmV0OwogCiAJLyogIERpc2FibGUgRC9BIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCiAJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CkBAIC0yNzQsMzMgKzI4MSwyNCBAQAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJLyogIFdhaXQgZm9yIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHRvIGJlCiAJCSAqICByZWFkeSBmb3IgbmV3IGRhdGEsIG9yIGdldCBmZWQgdXAgd2FpdGluZyAqLwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKLQkJCQkgICAgSUNQX01VTFRJX0RBQ19DU1IpICYgREFDX0JTWSkpCi0JCQkJZ290byBkYWNfcmVhZHk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgaWNwX211bHRpX2FvX2VvYywgMCk7CisJCWlmIChyZXQpIHsKKwkJCS8qICBEaXNhYmxlIGludGVycnVwdCAqLworCQkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CisJCQl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLAorCQkJICAgICAgIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKIAotCQkJdWRlbGF5KDEpOworCQkJLyogIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwkJCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7CisJCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAorCQkJICAgICAgIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJCQkvKiAgQ2xlYXIgZGF0YSByZWNlaXZlZCAqLworCQkJZGV2cHJpdi0+YW9fZGF0YVtjaGFuXSA9IDA7CisKKwkJCXJldHVybiByZXQ7CiAJCX0KIAotCQkvKiAgSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCAqLwotCQljb21lZGlfZXJyb3IoZGV2LCAiRC9BIGluc24gdGltZW91dCIpOwotCi0JCS8qICBEaXNhYmxlIGludGVycnVwdCAqLwotCQlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkRBQ19SRUFEWTsKLQkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOwotCi0JCS8qICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7Ci0JCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCi0JCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKLQotCQkvKiAgQ2xlYXIgZGF0YSByZWNlaXZlZCAqLwotCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gMDsKLQotCQlyZXR1cm4gLUVUSU1FOwotCi1kYWNfcmVhZHk6CiAJCS8qICBXcml0ZSBkYXRhIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyICovCiAJCXdyaXRldyhkYXRhW25dLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FPKTsKIApAQCAtNTY1LDkgKzU2Myw2IEBACiAKIAlkZXZwcml2LT52YWxpZCA9IDE7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkLCBpcnEgJXNhYmxlZFxuIiwKLQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYtPmlycSA/ICJlbiIgOiAiZGlzIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKaW5kZXggODU3Nzc3OC4uMzU1OGFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCkBAIC0xOTAsMjAgKzE5MCwxOCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlpMjBrX2FpX3dhaXRfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgaWkyMGtfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl2b2lkIF9faW9tZW0gKmlvYmFzZSA9IGlpMjBrX21vZHVsZV9pb2Jhc2UoZGV2LCBzKTsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCWRvIHsKLQkJc3RhdHVzID0gcmVhZGIoaW9iYXNlICsgSUkyMEtfQUlfU1RBVFVTX1JFRyk7Ci0JCWlmICgoc3RhdHVzICYgSUkyMEtfQUlfU1RBVFVTX0lOVCkgPT0gMCkKLQkJCXJldHVybiAwOwotCX0gd2hpbGUgKHRpbWVvdXQtLSk7Ci0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IHJlYWRiKGlvYmFzZSArIElJMjBLX0FJX1NUQVRVU19SRUcpOworCWlmICgoc3RhdHVzICYgSUkyMEtfQUlfU1RBVFVTX0lOVCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIHZvaWQgaWkyMGtfYWlfc2V0dXAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTI2Myw3ICsyNjEsNyBAQAogCQkvKiBnZW5lcmF0ZSBhIHNvZnR3YXJlIHN0YXJ0IGNvbnZlcnQgc2lnbmFsICovCiAJCXJlYWRiKGlvYmFzZSArIElJMjBLX0FJX1BBQ0VSX1JFU0VUX1JFRyk7CiAKLQkJcmV0ID0gaWkyMGtfYWlfd2FpdF9lb2MoZGV2LCBzLCAxMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGlpMjBrX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwppbmRleCA2MTAwYzEyLi5hOGRiOWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKQEAgLTUxLDIzICs1MSw1NSBAQAogI2luY2x1ZGUgImpyM19wY2kuaCIKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0pSMyAweDE3NjIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfMV9DSEFOTkVMIDB4MzExMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXIDB4MTExMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18yX0NIQU5ORUwgMHgzMTEyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzNfQ0hBTk5FTCAweDMxMTMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfNF9DSEFOTkVMIDB4MzExNAorCitlbnVtIGpyM19wY2lfYm9hcmRpZCB7CisJQk9BUkRfSlIzXzEsCisJQk9BUkRfSlIzXzIsCisJQk9BUkRfSlIzXzMsCisJQk9BUkRfSlIzXzQsCit9OworCitzdHJ1Y3QganIzX3BjaV9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbl9zdWJkZXZzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBqcjNfcGNpX2JvYXJkIGpyM19wY2lfYm9hcmRzW10gPSB7CisJW0JPQVJEX0pSM18xXSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfMSIsCisJCS5uX3N1YmRldnMJPSAxLAorCX0sCisJW0JPQVJEX0pSM18yXSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfMiIsCisJCS5uX3N1YmRldnMJPSAyLAorCX0sCisJW0JPQVJEX0pSM18zXSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfMyIsCisJCS5uX3N1YmRldnMJPSAzLAorCX0sCisJW0JPQVJEX0pSM180XSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfNCIsCisJCS5uX3N1YmRldnMJPSA0LAorCX0sCit9OworCitzdHJ1Y3QganIzX3BjaV90cmFuc2Zvcm0geworCXN0cnVjdCB7CisJCXUxNiBsaW5rX3R5cGU7CisJCXMxNiBsaW5rX2Ftb3VudDsKKwl9IGxpbmtbOF07Cit9OworCitzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IHsKKwlpbnQgbWluOworCWludCBtYXg7Cit9OwogCiBzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSB7CiAJc3RydWN0IGpyM190IF9faW9tZW0gKmlvYmFzZTsKLQlpbnQgbl9jaGFubmVsczsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIH07CiAKLXN0cnVjdCBwb2xsX2RlbGF5X3QgewotCWludCBtaW47Ci0JaW50IG1heDsKLX07Ci0KIHN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlIHsKIAlzdHJ1Y3QganIzX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbDsKIAl1bnNpZ25lZCBsb25nIG5leHRfdGltZV9taW47CkBAIC03OSw3ICsxMTEsNiBAQAogCQlzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlLAogCQlzdGF0ZV9qcjNfZG9uZQogCX0gc3RhdGU7Ci0JaW50IGNoYW5uZWxfbm87CiAJaW50IHNlcmlhbF9ubzsKIAlpbnQgbW9kZWxfbm87CiAJc3RydWN0IHsKQEAgLTkyLDkgKzEyMyw5IEBACiAJaW50IHJldHJpZXM7CiB9OwogCi1zdGF0aWMgc3RydWN0IHBvbGxfZGVsYXlfdCBwb2xsX2RlbGF5X21pbl9tYXgoaW50IG1pbiwgaW50IG1heCkKK3N0YXRpYyBzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IHBvbGxfZGVsYXlfbWluX21heChpbnQgbWluLCBpbnQgbWF4KQogewotCXN0cnVjdCBwb2xsX2RlbGF5X3QgcmVzdWx0OworCXN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkgcmVzdWx0OwogCiAJcmVzdWx0Lm1pbiA9IG1pbjsKIAlyZXN1bHQubWF4ID0gbWF4OwpAQCAtMTA2LDE1ICsxMzcsOCBAQAogCXJldHVybiBnZXRfczE2KCZjaGFubmVsLT5jb21tYW5kX3dvcmQwKSA9PSAwOwogfQogCi1zdHJ1Y3QgdHJhbnNmb3JtX3QgewotCXN0cnVjdCB7Ci0JCXUxNiBsaW5rX3R5cGU7Ci0JCXMxNiBsaW5rX2Ftb3VudDsKLQl9IGxpbmtbOF07Ci19OwotCiBzdGF0aWMgdm9pZCBzZXRfdHJhbnNmb3JtcyhzdHJ1Y3QganIzX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbCwKLQkJCSAgIHN0cnVjdCB0cmFuc2Zvcm1fdCB0cmFuc2YsIHNob3J0IG51bSkKKwkJCSAgIHN0cnVjdCBqcjNfcGNpX3RyYW5zZm9ybSB0cmFuc2YsIHNob3J0IG51bSkKIHsKIAlpbnQgaTsKIApAQCAtMTk0LDExMCArMjE4LDk5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBqcjNfcGNpX2FpX3JlYWRfY2hhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJCSB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXYgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKHNwcml2LT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2hhbiA8IDU2KSB7CisJCXVuc2lnbmVkIGludCBheGlzID0gY2hhbiAlIDg7CisJCXVuc2lnbmVkIGZpbHRlciA9IGNoYW4gLyA4OworCisJCXN3aXRjaCAoYXhpcykgeworCQljYXNlIDA6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0uZngpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS5meSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLmZ6KTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0ubXgpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS5teSk7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLm16KTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0udjEpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS52Mik7CisJCQlicmVhazsKKwkJfQorCQl2YWwgKz0gMHg0MDAwOworCX0gZWxzZSBpZiAoY2hhbiA9PSA1NikgeworCQl2YWwgPSBnZXRfdTE2KCZzcHJpdi0+Y2hhbm5lbC0+bW9kZWxfbm8pOworCX0gZWxzZSBpZiAoY2hhbiA9PSA1NykgeworCQl2YWwgPSBnZXRfdTE2KCZzcHJpdi0+Y2hhbm5lbC0+c2VyaWFsX25vKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCiBzdGF0aWMgaW50IGpyM19wY2lfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwOwotCWludCBjaGFubmVsOworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdiA9IHMtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1MTYgZXJyb3JzOworCWludCBpOwogCi0JcCA9IHMtPnByaXZhdGU7Ci0JY2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmIChwID09IE5VTEwgfHwgY2hhbm5lbCA+IDU3KSB7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJaW50IGk7CisJaWYgKCFzcHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmVzdWx0ID0gaW5zbi0+bjsKLQkJaWYgKHAtPnN0YXRlICE9IHN0YXRlX2pyM19kb25lIHx8Ci0JCSAgICAoZ2V0X3UxNigmcC0+Y2hhbm5lbC0+ZXJyb3JzKSAmICh3YXRjaF9kb2cgfCB3YXRjaF9kb2cyIHwKLQkJCQkJCSAgICAgc2Vuc29yX2NoYW5nZSkpKSB7Ci0JCQkvKiBObyBzZW5zb3Igb3Igc2Vuc29yIGNoYW5nZWQgKi8KLQkJCWlmIChwLT5zdGF0ZSA9PSBzdGF0ZV9qcjNfZG9uZSkgewotCQkJCS8qIFJlc3RhcnQgcG9sbGluZyAqLwotCQkJCXAtPnN0YXRlID0gc3RhdGVfanIzX3BvbGw7Ci0JCQl9Ci0JCQlyZXN1bHQgPSAtRUFHQUlOOworCWVycm9ycyA9IGdldF91MTYoJnNwcml2LT5jaGFubmVsLT5lcnJvcnMpOworCWlmIChzcHJpdi0+c3RhdGUgIT0gc3RhdGVfanIzX2RvbmUgfHwKKwkgICAgKGVycm9ycyAmICh3YXRjaF9kb2cgfCB3YXRjaF9kb2cyIHwgc2Vuc29yX2NoYW5nZSkpKSB7CisJCS8qIE5vIHNlbnNvciBvciBzZW5zb3IgY2hhbmdlZCAqLworCQlpZiAoc3ByaXYtPnN0YXRlID09IHN0YXRlX2pyM19kb25lKSB7CisJCQkvKiBSZXN0YXJ0IHBvbGxpbmcgKi8KKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19wb2xsOwogCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKLQkJCWlmIChjaGFubmVsIDwgNTYpIHsKLQkJCQlpbnQgYXhpcywgZmlsdGVyOwotCi0JCQkJYXhpcyA9IGNoYW5uZWwgJSA4OwotCQkJCWZpbHRlciA9IGNoYW5uZWwgLyA4OwotCQkJCWlmIChwLT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkgewotCQkJCQlkYXRhW2ldID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgRiA9IDA7Ci0JCQkJCXN3aXRjaCAoYXhpcykgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLmZ4KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLmZ5KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLmZ6KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDM6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLm14KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLm15KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLm16KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDY6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLnYxKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDc6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLnYyKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWRhdGFbaV0gPSBGICsgMHg0MDAwOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSA1NikgewotCQkJCWlmIChwLT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkKLQkJCQkJZGF0YVtpXSA9IDA7Ci0JCQkJZWxzZQotCQkJCQlkYXRhW2ldID0KLQkJCQkJZ2V0X3UxNigmcC0+Y2hhbm5lbC0+bW9kZWxfbm8pOwotCQkJfSBlbHNlIGlmIChjaGFubmVsID09IDU3KSB7Ci0JCQkJaWYgKHAtPnN0YXRlICE9IHN0YXRlX2pyM19kb25lKQotCQkJCQlkYXRhW2ldID0gMDsKLQkJCQllbHNlCi0JCQkJCWRhdGFbaV0gPQotCQkJCQlnZXRfdTE2KCZwLT5jaGFubmVsLT5zZXJpYWxfbm8pOwotCQkJfQotCQl9CisJCXJldHVybiAtRUFHQUlOOwogCX0KLQlyZXR1cm4gcmVzdWx0OworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGpyM19wY2lfYWlfcmVhZF9jaGFuKGRldiwgcywgY2hhbik7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBqcjNfcGNpX29wZW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGk7Ci0Jc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKIAlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAianIzX3BjaV9vcGVuXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwOwotCi0JCXAgPSBkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZTsKLQkJaWYgKHApIHsKLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJzZXJpYWw6ICVwICVkICglZClcbiIsIHAsCi0JCQkJcC0+c2VyaWFsX25vLCBwLT5jaGFubmVsX25vKTsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOworCQlzcHJpdiA9IHMtPnByaXZhdGU7CisJCWlmIChzcHJpdikKKwkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJzZXJpYWw6ICVwICVkICglZClcbiIsCisJCQkJc3ByaXYsIHNwcml2LT5zZXJpYWxfbm8sIHMtPmluZGV4KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjYsMjcxICszMzksMjYyIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBqcjNfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgY29uc3QgdTggKmRhdGEsIHNpemVfdCBzaXplLAotCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCitzdGF0aWMgaW50IGpyM19jaGVja19maXJtd2FyZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBzaXplKQogeworCWludCBtb3JlID0gMTsKKwlpbnQgcG9zID0gMDsKKwogCS8qCiAJICogSURNIGZpbGUgZm9ybWF0IGlzOgogCSAqICAgeyBjb3VudCwgYWRkcmVzcywgZGF0YSA8Y291bnQ+IH0gKgogCSAqICAgZmZmZgogCSAqLwotCWludCByZXN1bHQsIG1vcmUsIHBvcywgT0s7Ci0KLQlyZXN1bHQgPSAwOwotCW1vcmUgPSAxOwotCXBvcyA9IDA7Ci0JT0sgPSAwOwogCXdoaWxlIChtb3JlKSB7Ci0JCXVuc2lnbmVkIGludCBjb3VudCwgYWRkcjsKKwkJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwkJdW5zaWduZWQgaW50IGFkZHIgPSAwOwogCiAJCW1vcmUgPSBtb3JlICYmIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmNvdW50KTsKLQkJaWYgKG1vcmUgJiYgY291bnQgPT0gMHhmZmZmKSB7Ci0JCQlPSyA9IDE7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAobW9yZSAmJiBjb3VudCA9PSAweGZmZmYpCisJCQlyZXR1cm4gMDsKKwogCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZhZGRyKTsKIAkJd2hpbGUgKG1vcmUgJiYgY291bnQgPiAwKSB7Ci0JCQl1bnNpZ25lZCBpbnQgZHVtbXk7CisJCQl1bnNpZ25lZCBpbnQgZHVtbXkgPSAwOworCiAJCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZkdW1teSk7CiAJCQljb3VudC0tOwogCQl9CiAJfQogCi0JaWYgKCFPSykgewotCQlyZXN1bHQgPSAtRU5PREFUQTsKLQl9IGVsc2UgewotCQlpbnQgaTsKLQkJc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKnAgPSBkZXYtPnByaXZhdGU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHAtPm5fY2hhbm5lbHM7IGkrKykgewotCQkJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwOwotCi0JCQlzcCA9IGRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlOwotCQkJbW9yZSA9IDE7Ci0JCQlwb3MgPSAwOwotCQkJd2hpbGUgKG1vcmUpIHsKLQkJCQl1bnNpZ25lZCBpbnQgY291bnQsIGFkZHI7Ci0JCQkJbW9yZSA9IG1vcmUgJiYKLQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmY291bnQpOwotCQkJCWlmIChtb3JlICYmIGNvdW50ID09IDB4ZmZmZikKLQkJCQkJYnJlYWs7Ci0JCQkJbW9yZSA9IG1vcmUgJiYKLQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmYWRkcik7Ci0JCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkJIkxvYWRpbmcjJWQgJTQuNHggYnl0ZXMgYXQgJTQuNHhcbiIsCi0JCQkJCWksIGNvdW50LCBhZGRyKTsKLQkJCQl3aGlsZSAobW9yZSAmJiBjb3VudCA+IDApIHsKLQkJCQkJaWYgKGFkZHIgJiAweDQwMDApIHsKLQkJCQkJCS8qICAxNiBiaXQgZGF0YSwgbmV2ZXIgc2VlbgotCQkJCQkJICogIGluIHJlYWwgbGlmZSEhICovCi0JCQkJCQl1bnNpZ25lZCBpbnQgZGF0YTE7Ci0KLQkJCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLAotCQkJCQkJCQkgICAgIHNpemUsICZwb3MsCi0JCQkJCQkJCSAgICAgJmRhdGExKTsKLQkJCQkJCWNvdW50LS07Ci0JCQkJCQkvKiBqcjNbYWRkciArIDB4MjAwMDAgKiBwbnVtXSA9Ci0JCQkJCQkgICBkYXRhMTsgKi8KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qICAgRG93bmxvYWQgMjQgYml0IHByb2dyYW0gKi8KLQkJCQkJCXVuc2lnbmVkIGludCBkYXRhMSwgZGF0YTI7Ci0KLQkJCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLAotCQkJCQkJCQkgICAgIHNpemUsICZwb3MsCi0JCQkJCQkJCSAgICAgJmRhdGExKTsKLQkJCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLAotCQkJCQkJCQkgICAgICZwb3MsCi0JCQkJCQkJCSAgICAgJmRhdGEyKTsKLQkJCQkJCWNvdW50IC09IDI7Ci0JCQkJCQlpZiAobW9yZSkgewotCQkJCQkJCXNldF91MTYoJnAtPgotCQkJCQkJCQlpb2Jhc2UtPmNoYW5uZWwKLQkJCQkJCQkJW2ldLnByb2dyYW1fbG93Ci0JCQkJCQkJCVthZGRyXSwgZGF0YTEpOwotCQkJCQkJCXVkZWxheSgxKTsKLQkJCQkJCQlzZXRfdTE2KCZwLT4KLQkJCQkJCQkJaW9iYXNlLT5jaGFubmVsCi0JCQkJCQkJCVtpXS5wcm9ncmFtX2hpZ2gKLQkJCQkJCQkJW2FkZHJdLCBkYXRhMik7Ci0JCQkJCQkJdWRlbGF5KDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWFkZHIrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gLUVOT0RBVEE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcG9sbF9kZWxheV90IGpyM19wY2lfcG9sbF9zdWJkZXZpY2Uoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgdm9pZCBqcjNfd3JpdGVfZmlybXdhcmUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBpbnQgc3ViZGV2LCBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IHBvbGxfZGVsYXlfdCByZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7Ci0Jc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnAgPSBzLT5wcml2YXRlOwotCWludCBpOworCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBqcjNfdCBfX2lvbWVtICppb2Jhc2UgPSBkZXZwcml2LT5pb2Jhc2U7CisJdTMyIF9faW9tZW0gKmxvOworCXUzMiBfX2lvbWVtICpoaTsKKwlpbnQgbW9yZSA9IDE7CisJaW50IHBvcyA9IDA7CiAKLQlpZiAocCkgewotCQlzdHJ1Y3QganIzX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbCA9IHAtPmNoYW5uZWw7Ci0JCWludCBlcnJvcnMgPSBnZXRfdTE2KCZjaGFubmVsLT5lcnJvcnMpOworCXdoaWxlIChtb3JlKSB7CisJCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJCXVuc2lnbmVkIGludCBhZGRyID0gMDsKIAotCQlpZiAoZXJyb3JzICE9IHAtPmVycm9ycykKLQkJCXAtPmVycm9ycyA9IGVycm9yczsKKwkJbW9yZSA9IG1vcmUgJiYgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmY291bnQpOworCQlpZiAobW9yZSAmJiBjb3VudCA9PSAweGZmZmYpCisJCQlyZXR1cm47CiAKLQkJaWYgKGVycm9ycyAmICh3YXRjaF9kb2cgfCB3YXRjaF9kb2cyIHwgc2Vuc29yX2NoYW5nZSkpCi0JCQkvKiAgU2Vuc29yIGNvbW11bmljYXRpb24gbG9zdCwgZm9yY2UgcG9sbCBtb2RlICovCi0JCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19wb2xsOworCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZhZGRyKTsKIAotCQlzd2l0Y2ggKHAtPnN0YXRlKSB7Ci0JCWNhc2Ugc3RhdGVfanIzX3BvbGw6IHsKLQkJCQl1MTYgbW9kZWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5tb2RlbF9ubyk7Ci0JCQkJdTE2IHNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7Ci0JCQkJaWYgKChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMikpIHx8Ci0JCQkJICAgIG1vZGVsX25vID09IDAgfHwgc2VyaWFsX25vID09IDApIHsKLQkJCQkJLyoKLQkJCQkJICogU3RpbGwgbm8gc2Vuc29yLCBrZWVwIG9uIHBvbGxpbmcuCi0JCQkJCSAqIFNpbmNlIGl0IHRha2VzIHVwIHRvIDEwIHNlY29uZHMKLQkJCQkJICogZm9yIG9mZnNldHMgdG8gc3RhYmlsaXplLCBwb2xsaW5nCi0JCQkJCSAqIGVhY2ggc2Vjb25kIHNob3VsZCBzdWZmaWNlLgotCQkJCQkgKi8KLQkJCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXAtPnJldHJpZXMgPSAwOwotCQkJCQlwLT5zdGF0ZSA9Ci0JCQkJCQlzdGF0ZV9qcjNfaW5pdF93YWl0X2Zvcl9vZmZzZXQ7Ci0JCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkxvYWRpbmcjJWQgJTQuNHggYnl0ZXMgYXQgJTQuNHhcbiIsCisJCQlzdWJkZXYsIGNvdW50LCBhZGRyKTsKKworCQl3aGlsZSAobW9yZSAmJiBjb3VudCA+IDApIHsKKwkJCWlmIChhZGRyICYgMHg0MDAwKSB7CisJCQkJLyogMTYgYml0IGRhdGEsIG5ldmVyIHNlZW4gaW4gcmVhbCBsaWZlISEgKi8KKwkJCQl1bnNpZ25lZCBpbnQgZGF0YTEgPSAwOworCisJCQkJbW9yZSA9IG1vcmUgJiYKKwkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmZGF0YTEpOworCQkJCWNvdW50LS07CisJCQkJLyoganIzW2FkZHIgKyAweDIwMDAwICogcG51bV0gPSBkYXRhMTsgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogRG93bmxvYWQgMjQgYml0IHByb2dyYW0gKi8KKwkJCQl1bnNpZ25lZCBpbnQgZGF0YTEgPSAwOworCQkJCXVuc2lnbmVkIGludCBkYXRhMiA9IDA7CisKKwkJCQlsbyA9ICZpb2Jhc2UtPmNoYW5uZWxbc3ViZGV2XS5wcm9ncmFtX2xvW2FkZHJdOworCQkJCWhpID0gJmlvYmFzZS0+Y2hhbm5lbFtzdWJkZXZdLnByb2dyYW1faGlbYWRkcl07CisKKwkJCQltb3JlID0gbW9yZSAmJgorCQkJCSAgICAgICByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZkYXRhMSk7CisJCQkJbW9yZSA9IG1vcmUgJiYKKwkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmZGF0YTIpOworCQkJCWNvdW50IC09IDI7CisJCQkJaWYgKG1vcmUpIHsKKwkJCQkJc2V0X3UxNihsbywgZGF0YTEpOworCQkJCQl1ZGVsYXkoMSk7CisJCQkJCXNldF91MTYoaGksIGRhdGEyKTsKKwkJCQkJdWRlbGF5KDEpOwogCQkJCX0KIAkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHN0YXRlX2pyM19pbml0X3dhaXRfZm9yX29mZnNldDoKLQkJCXAtPnJldHJpZXMrKzsKLQkJCWlmIChwLT5yZXRyaWVzIDwgMTApIHsKLQkJCQkvKiAgV2FpdCBmb3Igb2ZmZXNldCB0byBzdGFiaWxpemUKLQkJCQkgKiAgKDwgMTAgcyBhY2NvcmRpbmcgdG8gbWFudWFsKSAqLwotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IHRyYW5zZm9ybV90IHRyYW5zZjsKLQotCQkJCXAtPm1vZGVsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+bW9kZWxfbm8pOwotCQkJCXAtPnNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7Ci0KLQkJCQkvKiAgVHJhbnNmb3JtYXRpb24gYWxsIHplcm9zICovCi0JCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHJhbnNmLmxpbmspOyBpKyspIHsKLQkJCQkJdHJhbnNmLmxpbmtbaV0ubGlua190eXBlID0KLQkJCQkJCShlbnVtIGxpbmtfdHlwZXMpMDsKLQkJCQkJdHJhbnNmLmxpbmtbaV0ubGlua19hbW91bnQgPSAwOwotCQkJCX0KLQotCQkJCXNldF90cmFuc2Zvcm1zKGNoYW5uZWwsIHRyYW5zZiwgMCk7Ci0JCQkJdXNlX3RyYW5zZm9ybShjaGFubmVsLCAwKTsKLQkJCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3RyYW5zZm9ybV9jb21wbGV0ZTsKLQkJCQkvKiAgQWxsb3cgMjAgbXMgZm9yIGNvbXBsZXRpb24gKi8KLQkJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBzdGF0ZV9qcjNfaW5pdF90cmFuc2Zvcm1fY29tcGxldGU6Ci0JCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7Ci0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgU2V0IGZ1bGwgc2NhbGUgKi8KLQkJCQlzdHJ1Y3Qgc2l4X2F4aXNfdCBtaW5fZnVsbF9zY2FsZTsKLQkJCQlzdHJ1Y3Qgc2l4X2F4aXNfdCBtYXhfZnVsbF9zY2FsZTsKLQotCQkJCW1pbl9mdWxsX3NjYWxlID0gZ2V0X21pbl9mdWxsX3NjYWxlcyhjaGFubmVsKTsKLQkJCQltYXhfZnVsbF9zY2FsZSA9IGdldF9tYXhfZnVsbF9zY2FsZXMoY2hhbm5lbCk7Ci0JCQkJc2V0X2Z1bGxfc2NhbGVzKGNoYW5uZWwsIG1heF9mdWxsX3NjYWxlKTsKLQotCQkJCXAtPnN0YXRlID0KLQkJCQkJc3RhdGVfanIzX2luaXRfc2V0X2Z1bGxfc2NhbGVfY29tcGxldGU7Ci0JCQkJLyogIEFsbG93IDIwIG1zIGZvciBjb21wbGV0aW9uICovCi0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2Ugc3RhdGVfanIzX2luaXRfc2V0X2Z1bGxfc2NhbGVfY29tcGxldGU6Ci0JCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7Ci0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3QgZm9yY2VfYXJyYXkgX19pb21lbSAqZnVsbF9zY2FsZTsKLQotCQkJCS8qICBVc2UgcmFuZ2VzIGluIGtOIG9yIHdlIHdpbGwKLQkJCQkgKiAgb3ZlcmZsb3cgYXJvdW5kIDIwMDBOISAqLwotCQkJCWZ1bGxfc2NhbGUgPSAmY2hhbm5lbC0+ZnVsbF9zY2FsZTsKLQkJCQlwLT5yYW5nZVswXS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+ZngpICogMTAwMDsKLQkJCQlwLT5yYW5nZVswXS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT5meCkgKiAxMDAwOwotCQkJCXAtPnJhbmdlWzFdLnJhbmdlLm1pbiA9Ci0JCQkJCS1nZXRfczE2KCZmdWxsX3NjYWxlLT5meSkgKiAxMDAwOwotCQkJCXAtPnJhbmdlWzFdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPmZ5KSAqIDEwMDA7Ci0JCQkJcC0+cmFuZ2VbMl0ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPmZ6KSAqIDEwMDA7Ci0JCQkJcC0+cmFuZ2VbMl0ucmFuZ2UubWF4ID0KLQkJCQkJZ2V0X3MxNigmZnVsbF9zY2FsZS0+ZnopICogMTAwMDsKLQkJCQlwLT5yYW5nZVszXS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+bXgpICogMTAwOwotCQkJCXAtPnJhbmdlWzNdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPm14KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVs0XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+bXkpICogMTAwOwotCQkJCXAtPnJhbmdlWzRdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPm15KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVs1XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+bXopICogMTAwOwotCQkJCXAtPnJhbmdlWzVdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPm16KSAqIDEwMDsJLyogPz8gKi8KLQkJCQlwLT5yYW5nZVs2XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+djEpICogMTAwOy8qID8/ICovCi0JCQkJcC0+cmFuZ2VbNl0ucmFuZ2UubWF4ID0KLQkJCQkJZ2V0X3MxNigmZnVsbF9zY2FsZS0+djEpICogMTAwOwkvKiA/PyAqLwotCQkJCXAtPnJhbmdlWzddLnJhbmdlLm1pbiA9Ci0JCQkJCS1nZXRfczE2KCZmdWxsX3NjYWxlLT52MikgKiAxMDA7LyogPz8gKi8KLQkJCQlwLT5yYW5nZVs3XS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT52MikgKiAxMDA7CS8qID8/ICovCi0JCQkJcC0+cmFuZ2VbOF0ucmFuZ2UubWluID0gMDsKLQkJCQlwLT5yYW5nZVs4XS5yYW5nZS5tYXggPSA2NTUzNTsKLQotCQkJCXVzZV9vZmZzZXQoY2hhbm5lbCwgMCk7Ci0JCQkJcC0+c3RhdGUgPSBzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlOwotCQkJCS8qICBBbGxvdyA0MCBtcyBmb3IgY29tcGxldGlvbiAqLwotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCg0MCwgMTAwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHN0YXRlX2pyM19pbml0X3VzZV9vZmZzZXRfY29tcGxldGU6Ci0JCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7Ci0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ4LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ5LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ6LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm14LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm15LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm16LCAwKTsKLQotCQkJCXNldF9vZmZzZXQoY2hhbm5lbCk7Ci0KLQkJCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19kb25lOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2Ugc3RhdGVfanIzX2RvbmU6Ci0JCQlwb2xsX2RlbGF5X21pbl9tYXgoMTAwMDAsIDIwMDAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOwotCQkJYnJlYWs7CisJCQlhZGRyKys7CiAJCX0KIAl9Cit9CisKK3N0YXRpYyBpbnQganIzX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSwKKwkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCWludCBzdWJkZXY7CisJaW50IHJldDsKKworCS8qIHZlcmlmeSBJRE0gZmlsZSBmb3JtYXQgKi8KKwlyZXQgPSBqcjNfY2hlY2tfZmlybXdhcmUoZGV2LCBkYXRhLCBzaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogd3JpdGUgZmlybXdhcmUgdG8gZWFjaCBzdWJkZXZpY2UgKi8KKwlmb3IgKHN1YmRldiA9IDA7IHN1YmRldiA8IGRldi0+bl9zdWJkZXZpY2VzOyBzdWJkZXYrKykKKwkJanIzX3dyaXRlX2Zpcm13YXJlKGRldiwgc3ViZGV2LCBkYXRhLCBzaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdiA9IHMtPnByaXZhdGU7CisJc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSByZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7CisJc3RydWN0IGpyM19jaGFubmVsIF9faW9tZW0gKmNoYW5uZWw7CisJdTE2IG1vZGVsX25vOworCXUxNiBzZXJpYWxfbm87CisJaW50IGVycm9yczsKKwlpbnQgaTsKKworCWlmICghc3ByaXYpCisJCXJldHVybiByZXN1bHQ7CisKKwljaGFubmVsID0gc3ByaXYtPmNoYW5uZWw7CisJZXJyb3JzID0gZ2V0X3UxNigmY2hhbm5lbC0+ZXJyb3JzKTsKKworCWlmIChlcnJvcnMgIT0gc3ByaXYtPmVycm9ycykKKwkJc3ByaXYtPmVycm9ycyA9IGVycm9yczsKKworCS8qIFNlbnNvciBjb21tdW5pY2F0aW9uIGxvc3Q/IGZvcmNlIHBvbGwgbW9kZSAqLworCWlmIChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMiB8IHNlbnNvcl9jaGFuZ2UpKQorCQlzcHJpdi0+c3RhdGUgPSBzdGF0ZV9qcjNfcG9sbDsKKworCXN3aXRjaCAoc3ByaXYtPnN0YXRlKSB7CisJY2FzZSBzdGF0ZV9qcjNfcG9sbDoKKwkJbW9kZWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5tb2RlbF9ubyk7CisJCXNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7CisKKwkJaWYgKChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMikpIHx8CisJCSAgICBtb2RlbF9ubyA9PSAwIHx8IHNlcmlhbF9ubyA9PSAwKSB7CisJCQkvKgorCQkJICogU3RpbGwgbm8gc2Vuc29yLCBrZWVwIG9uIHBvbGxpbmcuCisJCQkgKiBTaW5jZSBpdCB0YWtlcyB1cCB0byAxMCBzZWNvbmRzIGZvciBvZmZzZXRzIHRvCisJCQkgKiBzdGFiaWxpemUsIHBvbGxpbmcgZWFjaCBzZWNvbmQgc2hvdWxkIHN1ZmZpY2UuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCXNwcml2LT5yZXRyaWVzID0gMDsKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3dhaXRfZm9yX29mZnNldDsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19pbml0X3dhaXRfZm9yX29mZnNldDoKKwkJc3ByaXYtPnJldHJpZXMrKzsKKwkJaWYgKHNwcml2LT5yZXRyaWVzIDwgMTApIHsKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBvZmZlc2V0IHRvIHN0YWJpbGl6ZQorCQkJICogKDwgMTAgcyBhY2NvcmRpbmcgdG8gbWFudWFsKQorCQkJICovCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QganIzX3BjaV90cmFuc2Zvcm0gdHJhbnNmOworCisJCQlzcHJpdi0+bW9kZWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5tb2RlbF9ubyk7CisJCQlzcHJpdi0+c2VyaWFsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+c2VyaWFsX25vKTsKKworCQkJLyogVHJhbnNmb3JtYXRpb24gYWxsIHplcm9zICovCisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cmFuc2YubGluayk7IGkrKykgeworCQkJCXRyYW5zZi5saW5rW2ldLmxpbmtfdHlwZSA9IChlbnVtIGxpbmtfdHlwZXMpMDsKKwkJCQl0cmFuc2YubGlua1tpXS5saW5rX2Ftb3VudCA9IDA7CisJCQl9CisKKwkJCXNldF90cmFuc2Zvcm1zKGNoYW5uZWwsIHRyYW5zZiwgMCk7CisJCQl1c2VfdHJhbnNmb3JtKGNoYW5uZWwsIDApOworCQkJc3ByaXYtPnN0YXRlID0gc3RhdGVfanIzX2luaXRfdHJhbnNmb3JtX2NvbXBsZXRlOworCQkJLyogQWxsb3cgMjAgbXMgZm9yIGNvbXBsZXRpb24gKi8KKwkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19pbml0X3RyYW5zZm9ybV9jb21wbGV0ZToKKwkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgeworCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOworCQl9IGVsc2UgeworCQkJLyogU2V0IGZ1bGwgc2NhbGUgKi8KKwkJCXN0cnVjdCBzaXhfYXhpc190IG1pbl9mdWxsX3NjYWxlOworCQkJc3RydWN0IHNpeF9heGlzX3QgbWF4X2Z1bGxfc2NhbGU7CisKKwkJCW1pbl9mdWxsX3NjYWxlID0gZ2V0X21pbl9mdWxsX3NjYWxlcyhjaGFubmVsKTsKKwkJCW1heF9mdWxsX3NjYWxlID0gZ2V0X21heF9mdWxsX3NjYWxlcyhjaGFubmVsKTsKKwkJCXNldF9mdWxsX3NjYWxlcyhjaGFubmVsLCBtYXhfZnVsbF9zY2FsZSk7CisKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3NldF9mdWxsX3NjYWxlX2NvbXBsZXRlOworCQkJLyogQWxsb3cgMjAgbXMgZm9yIGNvbXBsZXRpb24gKi8KKwkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19pbml0X3NldF9mdWxsX3NjYWxlX2NvbXBsZXRlOgorCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7CisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZm9yY2VfYXJyYXkgX19pb21lbSAqZnMgPSAmY2hhbm5lbC0+ZnVsbF9zY2FsZTsKKworCQkJLyogVXNlIHJhbmdlcyBpbiBrTiBvciB3ZSB3aWxsIG92ZXJmbG93IGFyb3VuZCAyMDAwTiEgKi8KKwkJCXNwcml2LT5yYW5nZVswXS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPmZ4KSAqIDEwMDA7CisJCQlzcHJpdi0+cmFuZ2VbMF0ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPmZ4KSAqIDEwMDA7CisJCQlzcHJpdi0+cmFuZ2VbMV0ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT5meSkgKiAxMDAwOworCQkJc3ByaXYtPnJhbmdlWzFdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT5meSkgKiAxMDAwOworCQkJc3ByaXYtPnJhbmdlWzJdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+ZnopICogMTAwMDsKKwkJCXNwcml2LT5yYW5nZVsyXS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+ZnopICogMTAwMDsKKwkJCXNwcml2LT5yYW5nZVszXS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPm14KSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVszXS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+bXgpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzRdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+bXkpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzRdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT5teSkgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbNV0ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT5teikgKiAxMDA7CisJCQkvKiB0aGUgbmV4dCBmaXZlIGFyZSBxdWVzdGlvbmFibGUgKi8KKwkJCXNwcml2LT5yYW5nZVs1XS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+bXopICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzZdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+djEpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzZdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT52MSkgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbN10ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT52MikgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbN10ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPnYyKSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVs4XS5yYW5nZS5taW4gPSAwOworCQkJc3ByaXYtPnJhbmdlWzhdLnJhbmdlLm1heCA9IDY1NTM1OworCisJCQl1c2Vfb2Zmc2V0KGNoYW5uZWwsIDApOworCQkJc3ByaXYtPnN0YXRlID0gc3RhdGVfanIzX2luaXRfdXNlX29mZnNldF9jb21wbGV0ZTsKKwkJCS8qIEFsbG93IDQwIG1zIGZvciBjb21wbGV0aW9uICovCisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoNDAsIDEwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlOgorCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7CisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7CisJCX0gZWxzZSB7CisJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ4LCAwKTsKKwkJCXNldF9zMTYoJmNoYW5uZWwtPm9mZnNldHMuZnksIDApOworCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5meiwgMCk7CisJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm14LCAwKTsKKwkJCXNldF9zMTYoJmNoYW5uZWwtPm9mZnNldHMubXksIDApOworCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5teiwgMCk7CisKKwkJCXNldF9vZmZzZXQoY2hhbm5lbCk7CisKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19kb25lOworCQl9CisJCWJyZWFrOworCWNhc2Ugc3RhdGVfanIzX2RvbmU6CisJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwMCwgMjAwMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBqcjNfcGNpX3BvbGxfZGV2KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKilkYXRhOwogCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdjsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgbm93OwogCWludCBkZWxheTsKIAlpbnQgaTsKQEAgLTU5OCwxOCArNjAyLDIyIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAlkZWxheSA9IDEwMDA7CiAJbm93ID0gamlmZmllczsKLQkvKiAgUG9sbCBhbGwgY2hhbm5lbHMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgcG9sbGVkICovCi0JZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ViZGV2cHJpdiA9Ci0JCQlkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZTsKLQkJaWYgKG5vdyA+IHN1YmRldnByaXYtPm5leHRfdGltZV9taW4pIHsKLQkJCXN0cnVjdCBwb2xsX2RlbGF5X3Qgc3ViX2RlbGF5OwogCi0JCQlzdWJfZGVsYXkgPSBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKCZkZXYtPnN1YmRldmljZXNbaV0pOwotCQkJc3ViZGV2cHJpdi0+bmV4dF90aW1lX21pbiA9Ci0JCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoc3ViX2RlbGF5Lm1pbik7Ci0JCQlzdWJkZXZwcml2LT5uZXh0X3RpbWVfbWF4ID0KLQkJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhzdWJfZGVsYXkubWF4KTsKKwkvKiBQb2xsIGFsbCBjaGFubmVscyB0aGF0IGFyZSByZWFkeSB0byBiZSBwb2xsZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gJmRldi0+c3ViZGV2aWNlc1tpXTsKKwkJc3ByaXYgPSBzLT5wcml2YXRlOworCisJCWlmIChub3cgPiBzcHJpdi0+bmV4dF90aW1lX21pbikgeworCQkJc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSBzdWJfZGVsYXk7CisKKwkJCXN1Yl9kZWxheSA9IGpyM19wY2lfcG9sbF9zdWJkZXZpY2Uocyk7CisKKwkJCXNwcml2LT5uZXh0X3RpbWVfbWluID0gamlmZmllcyArCisJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHN1Yl9kZWxheS5taW4pOworCQkJc3ByaXYtPm5leHRfdGltZV9tYXggPSBqaWZmaWVzICsKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc3ViX2RlbGF5Lm1heCk7CisKIAkJCWlmIChzdWJfZGVsYXkubWF4ICYmIHN1Yl9kZWxheS5tYXggPCBkZWxheSkKIAkJCQkvKgogCQkJCSAqIFdha2UgdXAgYXMgbGF0ZSBhcyBwb3NzaWJsZSAtPgpAQCAtNjI0LDEzICs2MzIsNTggQEAKIAlhZGRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKIH0KIAotc3RhdGljIGludCBqcjNfcGNpX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorc3RhdGljIHN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICoKK2pyM19wY2lfYWxsb2Nfc3ByaXYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JaW50IHJlc3VsdDsKKwlzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXY7CisJaW50IGo7CisJaW50IGs7CisKKwlzcHJpdiA9IGNvbWVkaV9hbGxvY19zcHJpdihzLCBzaXplb2YoKnNwcml2KSk7CisJaWYgKCFzcHJpdikKKwkJcmV0dXJuIE5VTEw7CisKKwlzcHJpdi0+Y2hhbm5lbCA9ICZkZXZwcml2LT5pb2Jhc2UtPmNoYW5uZWxbcy0+aW5kZXhdLmRhdGE7CisKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCXNwcml2LT5yYW5nZVtqXS5sZW5ndGggPSAxOworCQlzcHJpdi0+cmFuZ2Vbal0ucmFuZ2UubWluID0gLTEwMDAwMDA7CisJCXNwcml2LT5yYW5nZVtqXS5yYW5nZS5tYXggPSAxMDAwMDAwOworCisJCWZvciAoayA9IDA7IGsgPCA3OyBrKyspIHsKKwkJCXNwcml2LT5yYW5nZV90YWJsZV9saXN0W2ogKyBrICogOF0gPQorCQkJCShzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZzcHJpdi0+cmFuZ2Vbal07CisJCQlzcHJpdi0+bWF4ZGF0YV9saXN0W2ogKyBrICogOF0gPSAweDdmZmY7CisJCX0KKwl9CisJc3ByaXYtPnJhbmdlWzhdLmxlbmd0aCA9IDE7CisJc3ByaXYtPnJhbmdlWzhdLnJhbmdlLm1pbiA9IDA7CisJc3ByaXYtPnJhbmdlWzhdLnJhbmdlLm1heCA9IDY1NTM2OworCisJc3ByaXYtPnJhbmdlX3RhYmxlX2xpc3RbNTZdID0gKHN0cnVjdCBjb21lZGlfbHJhbmdlICopJnNwcml2LT5yYW5nZVs4XTsKKwlzcHJpdi0+cmFuZ2VfdGFibGVfbGlzdFs1N10gPSAoc3RydWN0IGNvbWVkaV9scmFuZ2UgKikmc3ByaXYtPnJhbmdlWzhdOworCXNwcml2LT5tYXhkYXRhX2xpc3RbNTZdID0gMHhmZmZmOworCXNwcml2LT5tYXhkYXRhX2xpc3RbNTddID0gMHhmZmZmOworCisJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgInAtPmNoYW5uZWwgJXAgJXAgKCV0eClcbiIsCisJCXNwcml2LT5jaGFubmVsLCBkZXZwcml2LT5pb2Jhc2UsCisJCSgoY2hhciBfX2lvbWVtICopc3ByaXYtPmNoYW5uZWwgLQorCQkgKGNoYXIgX19pb21lbSAqKWRldnByaXYtPmlvYmFzZSkpOworCisJcmV0dXJuIHNwcml2OworfQorCitzdGF0aWMgaW50IGpyM19wY2lfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JaW50IGk7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBqcjNfcGNpX2JvYXJkICpib2FyZCA9IE5VTEw7CiAJc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKmRldnByaXY7CisJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwcml2OworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQ7CisJaW50IGk7CiAKIAlpZiAoc2l6ZW9mKHN0cnVjdCBqcjNfY2hhbm5lbCkgIT0gMHhjMDApIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKQEAgLTYzOSwxMDYgKzY5Miw1NiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoY29udGV4dCA8IEFSUkFZX1NJWkUoanIzX3BjaV9ib2FyZHMpKQorCQlib2FyZCA9ICZqcjNfcGNpX2JvYXJkc1tjb250ZXh0XTsKKwlpZiAoIWJvYXJkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYtPmJvYXJkX3B0ciA9IGJvYXJkOworCWRldi0+Ym9hcmRfbmFtZSA9IGJvYXJkLT5uYW1lOworCiAJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CiAJaWYgKCFkZXZwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWluaXRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKLQlzd2l0Y2ggKHBjaWRldi0+ZGV2aWNlKSB7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUw6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXOgotCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18yX0NIQU5ORUw6Ci0JCWRldnByaXYtPm5fY2hhbm5lbHMgPSAyOwotCQlicmVhazsKLQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzNfQ0hBTk5FTDoKLQkJZGV2cHJpdi0+bl9jaGFubmVscyA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0RFVklDRV9JRF9KUjNfNF9DSEFOTkVMOgotCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImpyM19wY2k6IHBjaSAlcyBub3Qgc3VwcG9ydGVkXG4iLAotCQkJcGNpX25hbWUocGNpZGV2KSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQl9CiAKLQlyZXN1bHQgPSBjb21lZGlfcGNpX2VuYWJsZShkZXYpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7CisJcmV0ID0gY29tZWRpX3BjaV9lbmFibGUoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZGV2cHJpdi0+aW9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMCk7CiAJaWYgKCFkZXZwcml2LT5pb2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmVzdWx0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCBkZXZwcml2LT5uX2NoYW5uZWxzKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgYm9hcmQtPm5fc3ViZGV2cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRldi0+b3BlbiA9IGpyM19wY2lfb3BlbjsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCWRldi0+c3ViZGV2aWNlc1tpXS50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JCWRldi0+c3ViZGV2aWNlc1tpXS5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOwotCQlkZXYtPnN1YmRldmljZXNbaV0ubl9jaGFuID0gOCAqIDcgKyAyOwotCQlkZXYtPnN1YmRldmljZXNbaV0uaW5zbl9yZWFkID0ganIzX3BjaV9haV9pbnNuX3JlYWQ7Ci0JCWRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlID0KLQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKGRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlKSB7Ci0JCQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqcDsKLQkJCWludCBqOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOworCQlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOworCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4JPSA4ICogNyArIDI7CisJCXMtPmluc25fcmVhZAk9IGpyM19wY2lfYWlfaW5zbl9yZWFkOwogCi0JCQlwID0gZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGU7Ci0JCQlwLT5jaGFubmVsID0gJmRldnByaXYtPmlvYmFzZS0+Y2hhbm5lbFtpXS5kYXRhOwotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgInAtPmNoYW5uZWwgJXAgJXAgKCV0eClcbiIsCi0JCQkJcC0+Y2hhbm5lbCwgZGV2cHJpdi0+aW9iYXNlLAotCQkJCSgoY2hhciBfX2lvbWVtICopcC0+Y2hhbm5lbCAtCi0JCQkJIChjaGFyIF9faW9tZW0gKilkZXZwcml2LT5pb2Jhc2UpKTsKLQkJCXAtPmNoYW5uZWxfbm8gPSBpOwotCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJCWludCBrOwotCi0JCQkJcC0+cmFuZ2Vbal0ubGVuZ3RoID0gMTsKLQkJCQlwLT5yYW5nZVtqXS5yYW5nZS5taW4gPSAtMTAwMDAwMDsKLQkJCQlwLT5yYW5nZVtqXS5yYW5nZS5tYXggPSAxMDAwMDAwOwotCQkJCWZvciAoayA9IDA7IGsgPCA3OyBrKyspIHsKLQkJCQkJcC0+cmFuZ2VfdGFibGVfbGlzdFtqICsgayAqIDhdID0KLQkJCQkJICAgIChzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZwLT4KLQkJCQkJICAgIHJhbmdlW2pdOwotCQkJCQlwLT5tYXhkYXRhX2xpc3RbaiArIGsgKiA4XSA9IDB4N2ZmZjsKLQkJCQl9Ci0JCQl9Ci0JCQlwLT5yYW5nZVs4XS5sZW5ndGggPSAxOwotCQkJcC0+cmFuZ2VbOF0ucmFuZ2UubWluID0gMDsKLQkJCXAtPnJhbmdlWzhdLnJhbmdlLm1heCA9IDY1NTM2OwotCi0JCQlwLT5yYW5nZV90YWJsZV9saXN0WzU2XSA9Ci0JCQkJKHN0cnVjdCBjb21lZGlfbHJhbmdlICopJnAtPnJhbmdlWzhdOwotCQkJcC0+cmFuZ2VfdGFibGVfbGlzdFs1N10gPQotCQkJCShzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZwLT5yYW5nZVs4XTsKLQkJCXAtPm1heGRhdGFfbGlzdFs1Nl0gPSAweGZmZmY7Ci0JCQlwLT5tYXhkYXRhX2xpc3RbNTddID0gMHhmZmZmOwotCQkJLyogIENoYW5uZWwgc3BlY2lmaWMgcmFuZ2UgYW5kIG1heGRhdGEgKi8KLQkJCWRldi0+c3ViZGV2aWNlc1tpXS5yYW5nZV90YWJsZSA9IE5VTEw7Ci0JCQlkZXYtPnN1YmRldmljZXNbaV0ucmFuZ2VfdGFibGVfbGlzdCA9Ci0JCQkJcC0+cmFuZ2VfdGFibGVfbGlzdDsKLQkJCWRldi0+c3ViZGV2aWNlc1tpXS5tYXhkYXRhID0gMDsKLQkJCWRldi0+c3ViZGV2aWNlc1tpXS5tYXhkYXRhX2xpc3QgPSBwLT5tYXhkYXRhX2xpc3Q7CisJCXNwcml2ID0ganIzX3BjaV9hbGxvY19zcHJpdihkZXYsIHMpOworCQlpZiAoc3ByaXYpIHsKKwkJCS8qIENoYW5uZWwgc3BlY2lmaWMgcmFuZ2UgYW5kIG1heGRhdGEgKi8KKwkJCXMtPnJhbmdlX3RhYmxlX2xpc3QJPSBzcHJpdi0+cmFuZ2VfdGFibGVfbGlzdDsKKwkJCXMtPm1heGRhdGFfbGlzdAkJPSBzcHJpdi0+bWF4ZGF0YV9saXN0OwogCQl9CiAJfQogCiAJLyogIFJlc2V0IERTUCBjYXJkICovCiAJd3JpdGVsKDAsICZkZXZwcml2LT5pb2Jhc2UtPmNoYW5uZWxbMF0ucmVzZXQpOwogCi0JcmVzdWx0ID0gY29tZWRpX2xvYWRfZmlybXdhcmUoZGV2LCAmY29tZWRpX3RvX3BjaV9kZXYoZGV2KS0+ZGV2LAotCQkJCSAgICAgICJjb21lZGkvanIzcGNpLmlkbSIsCi0JCQkJICAgICAganIzX2Rvd25sb2FkX2Zpcm13YXJlLCAwKTsKLQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiRmlybWFyZSBsb2FkICVkXG4iLCByZXN1bHQpOwotCi0JaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7CisJcmV0ID0gY29tZWRpX2xvYWRfZmlybXdhcmUoZGV2LCAmY29tZWRpX3RvX3BjaV9kZXYoZGV2KS0+ZGV2LAorCQkJCSAgICJjb21lZGkvanIzcGNpLmlkbSIsCisJCQkJICAganIzX2Rvd25sb2FkX2Zpcm13YXJlLCAwKTsKKwlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiRmlybWFyZSBsb2FkICVkXG4iLCByZXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCS8qCiAJICogVE9ETzogdXNlIGZpcm13YXJlIHRvIGxvYWQgcHJlZmVycmVkIG9mZnNldCB0YWJsZXMuIFN1Z2dlc3RlZAogCSAqIGZvcm1hdDoKQEAgLTc2MSwxMSArNzY0LDEyIEBACiAJfQogCiAJLyogIFN0YXJ0IGNhcmQgdGltZXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwID0gZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGU7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CisJCXNwcml2ID0gcy0+cHJpdmF0ZTsKIAotCQlwLT5uZXh0X3RpbWVfbWluID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKLQkJcC0+bmV4dF90aW1lX21heCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCQlzcHJpdi0+bmV4dF90aW1lX21pbiA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisJCXNwcml2LT5uZXh0X3RpbWVfbWF4ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CiAJfQogCiAJZGV2cHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKQEAgLTc3MywyMSArNzc3LDE2IEBACiAJZGV2cHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOwogCWFkZF90aW1lcigmZGV2cHJpdi0+dGltZXIpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQganIzX3BjaV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCWlmIChkZXZwcml2KSB7CiAJCWRlbF90aW1lcl9zeW5jKCZkZXZwcml2LT50aW1lcik7CiAKLQkJaWYgKGRldi0+c3ViZGV2aWNlcykgewotCQkJZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykKLQkJCQlrZnJlZShkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZSk7Ci0JCX0KIAkJaWYgKGRldnByaXYtPmlvYmFzZSkKIAkJCWlvdW5tYXAoZGV2cHJpdi0+aW9iYXNlKTsKIAl9CkBAIC04MDgsMTEgKzgwNywxMSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQganIzX3BjaV9wY2lfdGFibGVbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9KUjMsIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTCkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9KUjMsIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVcpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18yX0NIQU5ORUwpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18zX0NIQU5ORUwpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM180X0NIQU5ORUwpIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MTExMSksIEJPQVJEX0pSM18xIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExMSksIEJPQVJEX0pSM18xIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExMiksIEJPQVJEX0pSM18yIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExMyksIEJPQVJEX0pSM18zIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExNCksIEJPQVJEX0pSM180IH0sCiAJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwganIzX3BjaV9wY2lfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmgKaW5kZXggMzMxN2Y3YS4uMjA0NzhhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5oCkBAIC02NzEsMTEgKzY3MSwxMSBAQAogCiBzdHJ1Y3QganIzX3QgewogCXN0cnVjdCB7Ci0JCXUzMiBwcm9ncmFtX2xvd1sweDQwMDBdOwkvKiAgMHgwMDAwMCAtIDB4MTAwMDAgKi8KKwkJdTMyIHByb2dyYW1fbG9bMHg0MDAwXTsJCS8qICAweDAwMDAwIC0gMHgxMDAwMCAqLwogCQlzdHJ1Y3QganIzX2NoYW5uZWwgZGF0YTsJLyogIDB4MTAwMDAgLSAweDEwYzAwICovCiAJCWNoYXIgcGFkMlsweDMwMDAwIC0gMHgwMGMwMF07CS8qICAweDEwYzAwIC0gMHg0MDAwMCAqLwotCQl1MzIgcHJvZ3JhbV9oaWdoWzB4ODAwMF07CS8qICAweDQwMDAwIC0gMHg2MDAwMCAqLwotCQl1MzIgcmVzZXQ7CS8qICAweDYwMDAwIC0gMHg2MDAwNCAqLworCQl1MzIgcHJvZ3JhbV9oaVsweDgwMDBdOwkJLyogIDB4NDAwMDAgLSAweDYwMDAwICovCisJCXUzMiByZXNldDsJCQkvKiAgMHg2MDAwMCAtIDB4NjAwMDQgKi8KIAkJY2hhciBwYWQzWzB4MjAwMDAgLSAweDAwMDA0XTsJLyogIDB4NjAwMDQgLSAweDgwMDAwICovCiAJfSBjaGFubmVsWzRdOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCmluZGV4IDZiOTg0NmYuLmVjNDNjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwpAQCAtMSw5MiArMSwxMTMgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCi0gICAgQ29tZWRpIGRyaXZlciBmb3IgS29sdGVyLUVsZWN0cm9uaWMgUENJIENvdW50ZXIgMSBDYXJkCisgKiBrZV9jb3VudGVyLmMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIEtvbHRlci1FbGVjdHJvbmljIFBDSSBDb3VudGVyIDEgQ2FyZAorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCiAvKgotRHJpdmVyOiBrZV9jb3VudGVyCi1EZXNjcmlwdGlvbjogRHJpdmVyIGZvciBLb2x0ZXIgRWxlY3Ryb25pYyBDb3VudGVyIENhcmQKLURldmljZXM6IFtLb2x0ZXIgRWxlY3Ryb25pY10gUENJIENvdW50ZXIgQ2FyZCAoa2VfY291bnRlcikKLUF1dGhvcjogTWljaGFlbCBIaWxsbWFubgotVXBkYXRlZDogTW9uLCAxNCBBcHIgMjAwOCAxNTo0Mjo0MiArMDEwMAotU3RhdHVzOiB0ZXN0ZWQKLQotQ29uZmlndXJhdGlvbiBPcHRpb25zOiBub3QgYXBwbGljYWJsZSwgdXNlcyBQQ0kgYXV0byBjb25maWcKLQotVGhpcyBkcml2ZXIgaXMgYSBzaW1wbGUgZHJpdmVyIHRvIHJlYWQgdGhlIGNvdW50ZXIgdmFsdWVzIGZyb20KLUtvbHRlciBFbGVjdHJvbmljIFBDSSBDb3VudGVyIENhcmQuCi0qLworICogRHJpdmVyOiBrZV9jb3VudGVyCisgKiBEZXNjcmlwdGlvbjogRHJpdmVyIGZvciBLb2x0ZXIgRWxlY3Ryb25pYyBDb3VudGVyIENhcmQKKyAqIERldmljZXM6IChLb2x0ZXIgRWxlY3Ryb25pYykgUENJIENvdW50ZXIgQ2FyZCBba2VfY291bnRlcl0KKyAqIEF1dGhvcjogTWljaGFlbCBIaWxsbWFubgorICogVXBkYXRlZDogTW9uLCAxNCBBcHIgMjAwOCAxNTo0Mjo0MiArMDEwMAorICogU3RhdHVzOiB0ZXN0ZWQKKyAqCisgKiBDb25maWd1cmF0aW9uIE9wdGlvbnM6IG5vdCBhcHBsaWNhYmxlLCB1c2VzIFBDSSBhdXRvIGNvbmZpZworICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jZGVmaW5lIENOVF9DQVJEX0RFVklDRV9JRCAgICAgIDB4MDAxNAorLyoKKyAqIFBDSSBCQVIgMCBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgS0VfUkVTRVRfUkVHKHgpCQkJKDB4MDAgKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEtFX0xBVENIX1JFRyh4KQkJCSgweDAwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9MU0JfUkVHKHgpCQkJKDB4MDQgKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEtFX01JRF9SRUcoeCkJCQkoMHgwOCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgS0VfTVNCX1JFRyh4KQkJCSgweDBjICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9TSUdOX1JFRyh4KQkJCSgweDEwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9PU0NfU0VMX1JFRwkJCTB4ZjgKKyNkZWZpbmUgS0VfT1NDX1NFTF9FWFQJCQkoMSA8PCAwKQorI2RlZmluZSBLRV9PU0NfU0VMXzRNSFoJCQkoMiA8PCAwKQorI2RlZmluZSBLRV9PU0NfU0VMXzIwTUhaCQkoMyA8PCAwKQorI2RlZmluZSBLRV9ET19SRUcJCQkweGZjCiAKLS8qLS0gY291bnRlciB3cml0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciByZXNldHRpbmcgdGhlIGNvdW50ZXJzOyBtYXliZSBpdCBpcyBiZXR0ZXIKLSAgIHRvIG1ha2UgYSBzcGVjaWFsIGNvbW1hbmQgJ3Jlc2V0Jy4gKi8KLXN0YXRpYyBpbnQgY250X3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGtlX2NvdW50ZXJfaW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CiAKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiAyNCkgJiAweGZmKSwKLQkgICAgIGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDEwKTsKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiAxNikgJiAweGZmKSwKLQkgICAgIGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDBjKTsKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiA4KSAmIDB4ZmYpLAotCSAgICAgZGV2LT5pb2Jhc2UgKyBjaGFuICogMHgyMCArIDB4MDgpOwotCW91dGIoKHVuc2lnbmVkIGNoYXIpKChkYXRhWzBdID4+IDApICYgMHhmZiksCi0JICAgICBkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgwNCk7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhWzBdOwogCi0JLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB3cml0dGVuICovCi0JcmV0dXJuIDE7CisJCS8qIE9yZGVyIG1hdHRlcnMgKi8KKwkJb3V0YigodmFsID4+IDI0KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgS0VfU0lHTl9SRUcoY2hhbikpOworCQlvdXRiKCh2YWwgPj4gMTYpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBLRV9NU0JfUkVHKGNoYW4pKTsKKwkJb3V0YigodmFsID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBLRV9NSURfUkVHKGNoYW4pKTsKKwkJb3V0YigodmFsID4+IDApICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBLRV9MU0JfUkVHKGNoYW4pKTsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyotLSBjb3VudGVyIHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IGNudF9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBrZV9jb3VudGVyX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JdW5zaWduZWQgY2hhciBhMCwgYTEsIGEyLCBhMywgYTQ7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKIAotCWEwID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjApOwotCWExID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDA0KTsKLQlhMiA9IGluYihkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgwOCk7Ci0JYTMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBjaGFuICogMHgyMCArIDB4MGMpOwotCWE0ID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDEwKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCS8qIE9yZGVyIG1hdHRlcnMgKi8KKwkJaW5iKGRldi0+aW9iYXNlICsgS0VfTEFUQ0hfUkVHKGNoYW4pKTsKIAotCXJlc3VsdCA9IChhMSArIChhMiAqIDI1NikgKyAoYTMgKiA2NTUzNikpOwotCWlmIChhNCA+IDApCi0JCXJlc3VsdCA9IHJlc3VsdCAtIHMtPm1heGRhdGE7CisJCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIEtFX0xTQl9SRUcoY2hhbikpOworCQl2YWwgfD0gKGluYihkZXYtPmlvYmFzZSArIEtFX01JRF9SRUcoY2hhbikpIDw8IDgpOworCQl2YWwgfD0gKGluYihkZXYtPmlvYmFzZSArIEtFX01TQl9SRUcoY2hhbikpIDw8IDE2KTsKKwkJdmFsIHw9IChpbmIoZGV2LT5pb2Jhc2UgKyBLRV9TSUdOX1JFRyhjaGFuKSkgPDwgMjQpOwogCi0JKmRhdGEgPSAodW5zaWduZWQgaW50KXJlc3VsdDsKKwkJZGF0YVtpXSA9IHZhbDsKKwl9CiAKLQkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQgKi8KLQlyZXR1cm4gMTsKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBjbnRfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCitzdGF0aWMgaW50IGtlX2NvdW50ZXJfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpCisJCW91dGIocy0+c3RhdGUsIGRldi0+aW9iYXNlICsgS0VfRE9fUkVHKTsKKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGtlX2NvdW50ZXJfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CkBAIC05NywzMCArMTE4LDMyIEBACiAJCXJldHVybiByZXQ7CiAJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKIAotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7CisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAyKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4JPSAzOworCXMtPm1heGRhdGEJPSAweDAxZmZmZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3Vua25vd247CisJcy0+aW5zbl9yZWFkCT0ga2VfY291bnRlcl9pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZQk9IGtlX2NvdW50ZXJfaW5zbl93cml0ZTsKIAotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSAvKiB8IFNERl9DT01NT04gKi8gOwotCXMtPm5fY2hhbiA9IDM7Ci0Jcy0+bWF4ZGF0YSA9IDB4MDBmZmZmZmY7Ci0Jcy0+aW5zbl9yZWFkID0gY250X3JpbnNuOwotCXMtPmluc25fd3JpdGUgPSBjbnRfd2luc247CisJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMzsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IGtlX2NvdW50ZXJfZG9faW5zbl9iaXRzOwogCi0JLyogIHNlbGVjdCAyME1IeiBjbG9jayAqLwotCW91dGIoMywgZGV2LT5pb2Jhc2UgKyAyNDgpOworCW91dGIoS0VfT1NDX1NFTF8yME1IWiwgZGV2LT5pb2Jhc2UgKyBLRV9PU0NfU0VMX1JFRyk7CiAKLQkvKiAgcmVzZXQgYWxsIGNvdW50ZXJzICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIDB4MjApOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyAweDQwKTsKLQotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzIGF0dGFjaGVkXG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSk7CisJb3V0YigwLCBkZXYtPmlvYmFzZSArIEtFX1JFU0VUX1JFRygwKSk7CisJb3V0YigwLCBkZXYtPmlvYmFzZSArIEtFX1JFU0VUX1JFRygxKSk7CisJb3V0YigwLCBkZXYtPmlvYmFzZSArIEtFX1JFU0VUX1JFRygyKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyOCw3ICsxNTEsNyBAQAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGtlX2NvdW50ZXJfZHJpdmVyID0gewogCS5kcml2ZXJfbmFtZQk9ICJrZV9jb3VudGVyIiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotCS5hdXRvX2F0dGFjaAk9IGNudF9hdXRvX2F0dGFjaCwKKwkuYXV0b19hdHRhY2gJPSBrZV9jb3VudGVyX2F1dG9fYXR0YWNoLAogCS5kZXRhY2gJCT0gY29tZWRpX3BjaV9kaXNhYmxlLAogfTsKIApAQCAtMTQwLDcgKzE2Myw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBrZV9jb3VudGVyX3BjaV90YWJsZVtdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0tPTFRFUiwgQ05UX0NBUkRfREVWSUNFX0lEKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0tPTFRFUiwgMHgwMDE0KSB9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGtlX2NvdW50ZXJfcGNpX3RhYmxlKTsKQEAgLTE1NCw1ICsxNzcsNSBAQAogbW9kdWxlX2NvbWVkaV9wY2lfZHJpdmVyKGtlX2NvdW50ZXJfZHJpdmVyLCBrZV9jb3VudGVyX3BjaV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBkcml2ZXIgZm9yIEtvbHRlciBFbGVjdHJvbmljIENvdW50ZXIgQ2FyZCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCmluZGV4IGU3MzliY2QuLmYwMmIzMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKQEAgLTExMTIsOSArMTExMiw2IEBACiAJaWYgKCFkZXYtPmF0dGFjaGVkKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQkvKiBSZXNldCBhbGwgZXZlbnRzICovCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7Ci0KIAlpZiAoaW5sKGRldi0+aW9iYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHKSAmCiAJICAgIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikgewogCQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBmaW5kIG91dCB3aGF0IGhhcHBlbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKaW5kZXggN2Y2Njg3OC4uMGZmMTI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpAQCAtMjQ4LDYgKzI0OCwyMCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCitzdGF0aWMgaW50IG1lX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IG1lX3ByaXZhdGVfZGF0YSAqZGV2X3ByaXZhdGUgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIDB4MDAwNCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBtZV9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtMjU4LDcgKzI3Miw3IEBACiAJdW5zaWduZWQgaW50IHJhbmcgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IGFyZWYgPSBDUl9BUkVGKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7Ci0JaW50IGk7CisJaW50IHJldDsKIAogCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLwogCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOwpAQCAtMjkwLDE5ICszMDQsMTQgQEAKIAlyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0FEQ19TVEFSVCk7CiAKIAkvKiB3YWl0IGZvciBBREMgZmlmbyBub3QgZW1wdHkgZmxhZyAqLwotCWZvciAoaSA9IDEwMDAwMDsgaSA+IDA7IGktLSkKLQkJaWYgKCEocmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9TVEFUVVMpICYgMHgwMDA0KSkKLQkJCWJyZWFrOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbWVfYWlfZW9jLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogZ2V0IHZhbHVlIGZyb20gQURDIGZpZm8gKi8KLQlpZiAoaSkgewotCQl2YWwgPSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1JFQURfQURfRklGTyk7Ci0JCXZhbCA9ICh2YWwgXiAweDgwMCkgJiAweDBmZmY7Ci0JCWRhdGFbMF0gPSB2YWw7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkNhbm5vdCBnZXQgc2luZ2xlIHZhbHVlXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCXZhbCA9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfUkVBRF9BRF9GSUZPKTsKKwl2YWwgPSAodmFsIF4gMHg4MDApICYgMHgwZmZmOworCWRhdGFbMF0gPSB2YWw7CiAKIAkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KIAlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKQEAgLTU0Miw5ICs1NTEsNiBAQAogCXMtPmluc25fYml0cwk9IG1lX2Rpb19pbnNuX2JpdHM7CiAJcy0+aW5zbl9jb25maWcJPSBtZV9kaW9faW5zbl9jb25maWc7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKaW5kZXggODFiNzhlMC4uYTRmN2Q2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKQEAgLTEzMywyMSArMTMzLDE4IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyBpbnQgbWY2eDRfYWlfd2FpdF9mb3JfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBtZjZ4NF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXN0cnVjdCBtZjZ4NF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBlb2xjOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCWVvbGMgPSBpb3JlYWQzMihkZXZwcml2LT5ncGlvY19SKSAmIE1GNlg0X0dQSU9DX0VPTEM7Ci0JCWlmIChlb2xjKQotCQkJcmV0dXJuIDA7Ci0KLQkJdWRlbGF5KDEpOwotCX0KLQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW9yZWFkMzIoZGV2cHJpdi0+Z3Bpb2NfUik7CisJaWYgKHN0YXR1cyAmIE1GNlg0X0dQSU9DX0VPTEMpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgbWY2eDRfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xNjgsNyArMTY1LDcgQEAKIAkJLyogVHJpZ2dlciBBREMgY29udmVyc2lvbiBieSByZWFkaW5nIEFEU1RBUlQgKi8KIAkJaW9yZWFkMTYoZGV2cHJpdi0+YmFyMV9tZW0gKyBNRjZYNF9BRFNUQVJUX1IpOwogCi0JCXJldCA9IG1mNng0X2FpX3dhaXRfZm9yX2VvYyhkZXYsIDEwMCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbWY2eDRfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCmluZGV4IDljOWEwZWUuLjFhNTcyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpAQCAtNTI3LDkgKzUyNyw5IEBACiBpbnQgbWl0ZV9zeW5jX2lucHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCiAJCQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKIHsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGFzeW5jLT5zdWJkZXZpY2U7CiAJaW50IGNvdW50OwogCXVuc2lnbmVkIGludCBuYnl0ZXMsIG9sZF9hbGxvY19jb3VudDsKLQljb25zdCB1bnNpZ25lZCBieXRlc19wZXJfc2NhbiA9IGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKIAogCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7CiAJLyogd3JpdGUgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KQEAgLTUzOCw3ICs1MzgsNyBAQAogCW5ieXRlcyA9IG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIobWl0ZV9jaGFuKTsKIAlpZiAoKGludCkobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihtaXRlX2NoYW4pIC0KIAkJICBvbGRfYWxsb2NfY291bnQpID4gMCkgewotCQlkZXZfd2Fybihhc3luYy0+c3ViZGV2aWNlLT5kZXZpY2UtPmNsYXNzX2RldiwKKwkJZGV2X3dhcm4ocy0+ZGV2aWNlLT5jbGFzc19kZXYsCiAJCQkgIm1pdGU6IERNQSBvdmVyd3JpdGUgb2YgZnJlZSBhcmVhXG4iKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCXJldHVybiAtMTsKQEAgLTU1MSwxMiArNTUxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGNvdW50KTsKLQotCWFzeW5jLT5zY2FuX3Byb2dyZXNzICs9IGNvdW50OwotCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBieXRlc19wZXJfc2NhbikgewotCQlhc3luYy0+c2Nhbl9wcm9ncmVzcyAlPSBieXRlc19wZXJfc2NhbjsKLQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOwotCX0KKwljZmNfaW5jX3NjYW5fcHJvZ3Jlc3MocywgY291bnQpOwogCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKaW5kZXggYmNmMmY5Ny4uNzhmMjM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCkBAIC0yOSw5ICsyOSw5IEBACiAjZGVmaW5lIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyA4CiAKIHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yIHsKLQl1MzIgY291bnQ7Ci0JdTMyIGFkZHI7Ci0JdTMyIG5leHQ7CisJX19sZTMyIGNvdW50OworCV9fbGUzMiBhZGRyOworCV9fbGUzMiBuZXh0OwogCXUzMiBkYXI7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMKaW5kZXggZmU0NjIxZS4uZjc3MDQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYwpAQCAtMTQyLDggKzE0MiwxOCBAQAogCSB9CiB9OwogCi0vKiBUaW1lb3V0IDIwMG1zICovCi0jZGVmaW5lIFRJTUVPVVQgMjAwCitzdGF0aWMgaW50IG1wYzYyNF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgTVBDNjI0X0FEQyk7CisJaWYgKChzdGF0dXMgJiBNUEM2MjRfQURCVVNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQogCiBzdGF0aWMgaW50IG1wYzYyNF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTE1Miw3ICsxNjIsNyBAQAogCXN0cnVjdCBtcGM2MjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgbiwgaTsKIAl1bnNpZ25lZCBsb25nIGludCBkYXRhX2luLCBkYXRhX291dDsKLQl1bnNpZ25lZCBjaGFyIHVjUG9ydDsKKwlpbnQgcmV0OwogCiAJLyoKIAkgKiAgV0FSTklORzoKQEAgLTE3MCwxNSArMTgwLDkgQEAKIAkJdWRlbGF5KDEpOwogCiAJCS8qICBXYWl0IGZvciB0aGUgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJdWNQb3J0ID0gaW5iKGRldi0+aW9iYXNlICsgTVBDNjI0X0FEQyk7Ci0JCQlpZiAodWNQb3J0ICYgTVBDNjI0X0FEQlVTWSkKLQkJCQl1ZGVsYXkoMTAwMCk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIG1wYzYyNF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiAgU3RhcnQgcmVhZGluZyBkYXRhICovCiAJCWRhdGFfaW4gPSAwOwpAQCAtMzQxLDcgKzM0NSw3IEBACiAJcy0+bGVuX2NoYW5saXN0ID0gMTsKIAlzLT5pbnNuX3JlYWQgPSBtcGM2MjRfYWlfcmluc247CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIG1wYzYyNF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYwppbmRleCAzY2E3NTVlLi5iNzRiOWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKQEAgLTgxLDM0ICs4MSw0NCBAQAogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKIH07CiAKK3N0YXRpYyBpbnQgbXVsdGlxM19haV9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBNVUxUSVEzX1NUQVRVUyk7CisJaWYgKHN0YXR1cyAmIGNvbnRleHQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgbXVsdGlxM19haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgaSwgbjsKKwlpbnQgbjsKIAlpbnQgY2hhbjsKIAl1bnNpZ25lZCBpbnQgaGksIGxvOworCWludCByZXQ7CiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJb3V0dyhNVUxUSVEzX0NPTlRST0xfTVVTVCB8IE1VTFRJUTNfQURfTVVYX0VOIHwgKGNoYW4gPDwgMyksCiAJICAgICBkZXYtPmlvYmFzZSArIE1VTFRJUTNfQ09OVFJPTCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTVVMVElRM19USU1FT1VUOyBpKyspIHsKLQkJaWYgKGludyhkZXYtPmlvYmFzZSArIE1VTFRJUTNfU1RBVFVTKSAmIE1VTFRJUTNfU1RBVFVTX0VPQykKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA9PSBNVUxUSVEzX1RJTUVPVVQpCi0JCXJldHVybiAtRVRJTUVET1VUOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbXVsdGlxM19haV9zdGF0dXMsCisJCQkgICAgIE1VTFRJUTNfU1RBVFVTX0VPQyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIE1VTFRJUTNfQURfQ1MpOwotCQlmb3IgKGkgPSAwOyBpIDwgTVVMVElRM19USU1FT1VUOyBpKyspIHsKLQkJCWlmIChpbncoZGV2LT5pb2Jhc2UgKwotCQkJCU1VTFRJUTNfU1RBVFVTKSAmIE1VTFRJUTNfU1RBVFVTX0VPQ19JKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IE1VTFRJUTNfVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbXVsdGlxM19haV9zdGF0dXMsCisJCQkJICAgICBNVUxUSVEzX1NUQVRVU19FT0NfSSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgTVVMVElRM19BRF9DUyk7CiAJCWxvID0gaW5iKGRldi0+aW9iYXNlICsgTVVMVElRM19BRF9DUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYwppbmRleCBkZjQyZTM5Li4wZDRiOTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibWl0ZS5oIgogI2luY2x1ZGUgIm5pX3Rpby5oIgogCkBAIC03ODksMTMgKzc5MCw3IEBACiAJc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIgPSBzLT5wcml2YXRlOwogCiAJbmlfdGlvX2hhbmRsZV9pbnRlcnJ1cHQoY291bnRlciwgcyk7Ci0JaWYgKHMtPmFzeW5jLT5ldmVudHMpIHsKLQkJaWYgKHMtPmFzeW5jLT5ldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8Ci0JCQkJCUNPTUVESV9DQl9PVkVSRkxPVykpIHsKLQkJCW5pXzY2MHhfY2FuY2VsKGRldiwgcyk7Ci0JCX0KLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JfQorCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBuaV82NjB4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQpAQCAtMTE4Nyw3ICsxMTgyLDcgQEAKIAkJZ2xvYmFsX2ludGVycnVwdF9jb25maWdfYml0cyB8PSBDYXNjYWRlX0ludF9FbmFibGVfQml0OwogCW5pXzY2MHhfd3JpdGVfcmVnaXN0ZXIoZGV2LCAwLCBnbG9iYWxfaW50ZXJydXB0X2NvbmZpZ19iaXRzLAogCQkJICAgICAgIE5JNjYwWF9HTE9CQUxfSU5UX0NGRyk7Ci0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJuaV82NjB4OiAlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYwppbmRleCA4NTUwZmRjLi4xMDAyY2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKQEAgLTI0Niw5ICsyNDYsNiBAQAogCS8qIENvbmZpZyBvZiBhbyByZWdpc3RlcnMgKi8KIAl3cml0ZWwoMHgwMCwgZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIgKyBBT19DT05UUk9MX09GRlNFVCk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKaW5kZXggZjgzZWI5ZS4uNGUzOWIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKQEAgLTE4NCw3ICsxODQsNiBAQAogCX0KIAkvKiAgaW5pdGlhbGl6ZSBhc3luYyBoZXJlIHRvIG1ha2Ugc3VyZSBzIGlzIG5vdCBOVUxMICovCiAJYXN5bmMgPSBzLT5hc3luYzsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAljbWQgPSAmYXN5bmMtPmNtZDsKIAogCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpOwpAQCAtMTk2LDE1ICsxOTUsMTQgQEAKIAogCWlmIChzdGF0dXMgJiBPVkZMX0JJVCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiZmlmbyBvdmVyZmxvdyIpOwotCQlhMjE1MF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCX0KIAogCWlmICgoc3RhdHVzICYgRE1BX1RDX0JJVCkgPT0gMCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiY2F1Z2h0IG5vbi1kbWEgaW50ZXJydXB0PyAgQWJvcnRpbmcuIik7Ci0JCWEyMTUwX2NhbmNlbChkZXYsIHMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCkBAIC0yNDksNyArMjQ3LDYgQEAKIAkJY2ZjX3dyaXRlX3RvX2J1ZmZlcihzLCBkcG50KTsKIAkJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewogCQkJaWYgKC0tZGV2cHJpdi0+Y291bnQgPT0gMCkgewkvKiBlbmQgb2YgYWNxdWlzaXRpb24gKi8KLQkJCQlhMjE1MF9jYW5jZWwoZGV2LCBzKTsKIAkJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yNjUsNyArMjYyLDcgQEAKIAogCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOwogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAogCS8qIGNsZWFyIGludGVycnVwdCAqLwogCW91dHcoMHgwMCwgZGV2LT5pb2Jhc2UgKyBETUFfVENfQ0xFQVJfUkVHKTsKQEAgLTQ4OCwxMyArNDg1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYTIxNTBfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIEZORV9CSVQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYTIxNTBfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhMjE1MF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBpLCBuOwotCXN0YXRpYyBjb25zdCBpbnQgdGltZW91dCA9IDEwMDAwMDsKLQlzdGF0aWMgY29uc3QgaW50IGZpbHRlcl9kZWxheSA9IDM2OworCXVuc2lnbmVkIGludCBuOworCWludCByZXQ7CiAKIAkvKiAgY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19SRVNFVF9SRUcpOwpAQCAtNTI0LDMwICs1MzMsMjAgQEAKIAkgKiB0aGVyZSBpcyBhIDM1LjYgc2FtcGxlIGRlbGF5IGZvciBkYXRhIHRvIGdldCB0aHJvdWdoIHRoZQogCSAqIGFudGlhbGlhcyBmaWx0ZXIKIAkgKi8KLQlmb3IgKG4gPSAwOyBuIDwgZmlsdGVyX2RlbGF5OyBuKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQkJaWYgKGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpICYgRk5FX0JJVCkKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfQotCQlpZiAoaSA9PSB0aW1lb3V0KSB7Ci0JCQljb21lZGlfZXJyb3IoZGV2LCAidGltZW91dCIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCWZvciAobiA9IDA7IG4gPCAzNjsgbisrKSB7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgYTIxNTBfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJaW53KGRldi0+aW9iYXNlICsgRklGT19EQVRBX1JFRyk7CiAJfQogCiAJLyogIHJlYWQgZGF0YSAqLwogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQkJaWYgKGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpICYgRk5FX0JJVCkKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfQotCQlpZiAoaSA9PSB0aW1lb3V0KSB7Ci0JCQljb21lZGlfZXJyb3IoZGV2LCAidGltZW91dCIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGEyMTUwX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWRhdGFbbl0gPSBpbncoZGV2LT5pb2Jhc2UgKyBGSUZPX0RBVEFfUkVHKTsKIAkJZGF0YVtuXSBePSAweDgwMDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwppbmRleCBlOGNkNWRkLi40MjYyMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwpAQCAtOTYsNyArOTYsNiBAQAogI2RlZmluZSBDTE9DS18xMDBfSFoJMHg4RjI1CiAvKiBPdGhlciBtaXNjZWxsYW5lb3VzIGRlZmluZXMgKi8KICNkZWZpbmUgQVRNSU8xNkRfU0laRQkzMgkvKiBidXMgYWRkcmVzcyByYW5nZSAqLwotI2RlZmluZSBBVE1JTzE2RF9USU1FT1VUIDEwCiAKIHN0cnVjdCBhdG1pbzE2X2JvYXJkX3QgewogCkBAIC00NDgsMTYgKzQ0NywzMiBAQAogCXJldHVybiAwOwogfQogCi0vKiBNb2RlIDAgaXMgdXNlZCB0byBnZXQgYSBzaW5nbGUgY29udmVyc2lvbiBvbiBkZW1hbmQgKi8KK3N0YXRpYyBpbnQgYXRtaW8xNmRfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgU1RBVF9SRUcpOworCWlmIChzdGF0dXMgJiBTVEFUX0FEX0NPTlZBVkFJTCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0YXR1cyAmIFNUQVRfQURfT1ZFUkZMT1cpIHsKKwkJb3V0dygwLCBkZXYtPmlvYmFzZSArIEFEX0NMRUFSX1JFRyk7CisJCXJldHVybiAtRU9WRVJGTE9XOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGF0bWlvMTZkX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGF0bWlvMTZkX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGksIHQ7CisJaW50IGk7CiAJaW50IGNoYW47CiAJaW50IGdhaW47Ci0JaW50IHN0YXR1czsKKwlpbnQgcmV0OwogCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWdhaW4gPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC00NzMsMjYgKzQ4OCwxNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJLyogc3RhcnQgdGhlIGNvbnZlcnNpb24gKi8KIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFNUQVJUX0NPTlZFUlRfUkVHKTsKKwogCQkvKiB3YWl0IGZvciBpdCB0byBmaW5pc2ggKi8KLQkJZm9yICh0ID0gMDsgdCA8IEFUTUlPMTZEX1RJTUVPVVQ7IHQrKykgewotCQkJLyogY2hlY2sgY29udmVyc2lvbiBzdGF0dXMgKi8KLQkJCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRfUkVHKTsKLQkJCWlmIChzdGF0dXMgJiBTVEFUX0FEX0NPTlZBVkFJTCkgewotCQkJCS8qIHJlYWQgdGhlIGRhdGEgbm93ICovCi0JCQkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSArIEFEX0ZJRk9fUkVHKTsKLQkJCQkvKiBjaGFuZ2UgdG8gdHdvJ3MgY29tcGxlbWVudCBpZiBuZWVkIGJlICovCi0JCQkJaWYgKGRldnByaXYtPmFkY19jb2RpbmcgPT0gYWRjXzJjb21wKQotCQkJCQlkYXRhW2ldIF49IDB4ODAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0YXR1cyAmIFNUQVRfQURfT1ZFUkZMT1cpIHsKLQkJCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgQURfQ0xFQVJfUkVHKTsKLQkJCQlyZXR1cm4gLUVUSU1FOwotCQkJfQotCQl9Ci0JCS8qIGVuZCB3YWl0aW5nLCBub3cgY2hlY2sgaWYgaXQgdGltZWQgb3V0ICovCi0JCWlmICh0ID09IEFUTUlPMTZEX1RJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGF0bWlvMTZkX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIHJlYWQgdGhlIGRhdGEgbm93ICovCisJCWRhdGFbaV0gPSBpbncoZGV2LT5pb2Jhc2UgKyBBRF9GSUZPX1JFRyk7CisJCS8qIGNoYW5nZSB0byB0d28ncyBjb21wbGVtZW50IGlmIG5lZWQgYmUgKi8KKwkJaWYgKGRldnByaXYtPmFkY19jb2RpbmcgPT0gYWRjXzJjb21wKQorCQkJZGF0YVtpXSBePSAweDgwMDsKIAl9CiAKIAlyZXR1cm4gaTsKQEAgLTcyMywxMCArNzI5LDEzIEBACiAKIAkvKiA4MjU1IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOwotCWlmIChib2FyZC0+aGFzXzgyNTUpCi0JCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCBkZXYtPmlvYmFzZSk7Ci0JZWxzZQorCWlmIChib2FyZC0+aGFzXzgyNTUpIHsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGRldi0+aW9iYXNlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIC8qIGRvbid0IHlldCBrbm93IGhvdyB0byBkZWFsIHdpdGggY291bnRlci90aW1lcnMgKi8KICNpZiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYwppbmRleCBlNGNkY2EzLi4xNzFhNzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfNzAwLmMKQEAgLTEwOSwxNCArMTA5LDMxIEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKK3N0YXRpYyBpbnQgZGFxNzAwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFNUQV9SMik7CisJaWYgKChzdGF0dXMgJiAweDAzKSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU1RBX1IxKTsKKwlpZiAoKHN0YXR1cyAmIDB4MDIpKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJaWYgKChzdGF0dXMgJiAweDExKSA9PSAweDAxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRhcTcwMF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgbiwgaSwgY2hhbjsKKwlpbnQgbiwgY2hhbjsKIAlpbnQgZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCWVudW0geyBUSU1FT1VUID0gMTAwIH07CisJaW50IHJldDsKIAogCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAkvKiB3cml0ZSBjaGFubmVsIHRvIG11bHRpcGxleGVyICovCkBAIC0xMzAsMzAgKzE0NywxMiBAQAogCQlvdXRiKDB4MzAsIGRldi0+aW9iYXNlICsgQ01PX1IpOyAvKiBtb2RlIDAgb3V0MCBMLCBmcm9tIEggKi8KIAkJLyogbW9kZSAxIG91dDAgSCwgTCB0byBILCBzdGFydCBjb252ZXJzaW9uICovCiAJCW91dGIoMHgzMiwgZGV2LT5pb2Jhc2UgKyBDTU9fUik7CisKIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU1RBX1IyKTsKLQkJCWlmICgoc3RhdHVzICYgMHgwMykgIT0gMCkgewotCQkJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LAotCQkJCQkgIk92ZXJmbG93L3J1biBFcnJvclxuIik7Ci0JCQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JCQl9Ci0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBTVEFfUjEpOwotCQkJaWYgKChzdGF0dXMgJiAweDAyKSAhPSAwKSB7Ci0JCQkJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJEYXRhIEVycm9yXG4iKTsKLQkJCQlyZXR1cm4gLUVOT0RBVEE7Ci0JCQl9Ci0JCQlpZiAoKHN0YXR1cyAmIDB4MTEpID09IDB4MDEpIHsKLQkJCQkvKiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSAqLwotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpIHsKLQkJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LAotCQkJCSAidGltZW91dCBkdXJpbmcgQURDIGNvbnZlcnNpb25cbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXE3MDBfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJLyogcmVhZCBkYXRhICovCiAJCWQgPSBpbncoZGV2LT5pb2Jhc2UgKyBBREZJRk9fUik7CiAJCS8qIG1hbmdsZSB0aGUgZGF0YSBhcyBuZWNlc3NhcnkgKi8KQEAgLTIyOSwxMSArMjI4LDYgQEAKIAlzLT5pbnNuX3JlYWQgPSBkYXE3MDBfYWlfcmluc247CiAJZGFxNzAwX2FpX2NvbmZpZyhkZXYsIHMpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMsIGlvIDB4JWx4XG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsCi0JCWRldi0+Ym9hcmRfbmFtZSwKLQkJZGV2LT5pb2Jhc2UpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwppbmRleCAzMzVlYTM0Li45MjVlODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCkBAIC0zLDggKzMsOCBAQAogICAgIERyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENNQ0lBIERBUS1DYXJkIERJTy0yNAogICAgIENvcHlyaWdodCAoQykgMjAwMiBEYW5pZWwgVmVjaW5vIENhc3RlbCA8ZHZlY2lub0BhYmxlLmVzPgogCi0gICAgUENNQ0lBIGNyYXAgYXQgZW5kIG9mIGZpbGUgaXMgYWRhcHRlZCBmcm9tIGR1bW15X2NzLmMgMS4zMSAyMDAxLzA4LzI0IDEyOjEzOjEzCi0gICAgZnJvbSB0aGUgcGNtY2lhIHBhY2thZ2UuCisgICAgUENNQ0lBIGNyYXAgYXQgZW5kIG9mIGZpbGUgaXMgYWRhcHRlZCBmcm9tIGR1bW15X2NzLmMgMS4zMQorICAgIDIwMDEvMDgvMjQgMTI6MTM6MTMgZnJvbSB0aGUgcGNtY2lhIHBhY2thZ2UuCiAgICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBwY21jaWEgZHVtbXlfY3MuYyBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCiAgICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKICAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMKaW5kZXggMDUxMjQ0NS4uZjQyMTZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMKQEAgLTczLDcgKzczLDYgQEAKICNpbmNsdWRlICJuaV9sYWJwY19pc2FkbWEuaCIKIAogI2RlZmluZSBMQUJQQ19TSVpFCQkweDIwCS8qIHNpemUgb2YgSVNBIGlvIHJlZ2lvbiAqLwotI2RlZmluZSBMQUJQQ19BRENfVElNRU9VVAkxMDAwCiAKIGVudW0gc2Nhbl9tb2RlIHsKIAlNT0RFX1NJTkdMRV9DSEFOLApAQCAtMzA4LDE5ICszMDcsMTcgQEAKIAlsYWJwY19yZWFkX2FkY19maWZvKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgbGFicGNfYWlfd2FpdF9mb3JfZGF0YShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IGxhYnBjX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJc3RydWN0IGxhYnBjX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCWRldnByaXYtPnN0YXQxID0gZGV2cHJpdi0+cmVhZF9ieXRlKGRldi0+aW9iYXNlICsgU1RBVDFfUkVHKTsKLQkJaWYgKGRldnByaXYtPnN0YXQxICYgU1RBVDFfREFWQUlMKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlkZXZwcml2LT5zdGF0MSA9IGRldnByaXYtPnJlYWRfYnl0ZShkZXYtPmlvYmFzZSArIFNUQVQxX1JFRyk7CisJaWYgKGRldnByaXYtPnN0YXQxICYgU1RBVDFfREFWQUlMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGxhYnBjX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMzYzLDcgKzM2MCw3IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlkZXZwcml2LT53cml0ZV9ieXRlKDB4MSwgZGV2LT5pb2Jhc2UgKyBBRENfU1RBUlRfQ09OVkVSVF9SRUcpOwogCi0JCXJldCA9IGxhYnBjX2FpX3dhaXRfZm9yX2RhdGEoZGV2LCBMQUJQQ19BRENfVElNRU9VVCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbGFicGNfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTk1MCw3ICs5NDcsNiBAQAogCiAJYXN5bmMgPSBzLT5hc3luYzsKIAljbWQgPSAmYXN5bmMtPmNtZDsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAogCS8qIHJlYWQgYm9hcmQgc3RhdHVzICovCiAJZGV2cHJpdi0+c3RhdDEgPSBkZXZwcml2LT5yZWFkX2J5dGUoZGV2LT5pb2Jhc2UgKyBTVEFUMV9SRUcpOwpAQCAtOTY4LDcgKzk2NCw3IEBACiAJCS8qIGNsZWFyIGVycm9yIGludGVycnVwdCAqLwogCQlkZXZwcml2LT53cml0ZV9ieXRlKDB4MSwgZGV2LT5pb2Jhc2UgKyBBRENfRklGT19DTEVBUl9SRUcpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQljb21lZGlfZXJyb3IoZGV2LCAib3ZlcnJ1biIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtOTg4LDcgKzk4NCw3IEBACiAJCS8qICBjbGVhciBlcnJvciBpbnRlcnJ1cHQgKi8KIAkJZGV2cHJpdi0+d3JpdGVfYnl0ZSgweDEsIGRldi0+aW9iYXNlICsgQURDX0ZJRk9fQ0xFQVJfUkVHKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJY29tZWRpX2Vycm9yKGRldiwgIm92ZXJmbG93Iik7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CkBAIC05OTYsMjAgKzk5MiwxNyBAQAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfRVhUKSB7CiAJCWlmIChkZXZwcml2LT5zdGF0MiAmIFNUQVQyX09VVEExKSB7CiAJCQlsYWJwY19kcmFpbl9kcmVncyhkZXYpOwotCQkJbGFicGNfY2FuY2VsKGRldiwgcyk7CiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCX0KIAl9CiAKIAkvKiBUUklHX0NPVU5UIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKLQkJaWYgKGRldnByaXYtPmNvdW50ID09IDApIHsKLQkJCWxhYnBjX2NhbmNlbChkZXYsIHMpOworCQlpZiAoZGV2cHJpdi0+Y291bnQgPT0gMCkKIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJfQogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwppbmRleCA0NTdiODg0Li44YTBlM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKQEAgLTI1Niw3ICsyNTYsNiBAQAogc3RhdGljIHZvaWQgY2FsZGFjX3NldHVwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKIHN0YXRpYyBpbnQgbmlfcmVhZF9lZXByb20oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IGFkZHIpOwogCi1zdGF0aWMgaW50IG5pX2FpX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKICNpZm5kZWYgUENJRE1BCiBzdGF0aWMgdm9pZCBuaV9oYW5kbGVfZmlmb19oYWxmX2Z1bGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IG5pX2FvX2ZpZm9faGFsZl9lbXB0eShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjcyLDE1ICsyNzEsMTIgQEAKIHN0YXRpYyBpbnQgbmlfYW9faW50dHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSB1bnNpZ25lZCBpbnQgdHJpZ251bSk7CiAKLXN0YXRpYyBpbnQgbmlfYW9fcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotCiBzdGF0aWMgaW50IG5pXzgyNTVfY2FsbGJhY2soaW50IGRpciwgaW50IHBvcnQsIGludCBkYXRhLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKICNpZmRlZiBQQ0lETUEKIHN0YXRpYyBpbnQgbmlfZ3BjdF9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCBuaV9ncGN0X2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7CiAjZW5kaWYKLXN0YXRpYyBpbnQgbmlfZ3BjdF9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwogc3RhdGljIHZvaWQgaGFuZGxlX2dwY3RfaW50ZXJydXB0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICB1bnNpZ25lZCBzaG9ydCBjb3VudGVyX2luZGV4KTsKIApAQCAtNjg3LDEyICs2ODMsMjIgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbmlfYm9hcmRfc3RydWN0ICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBuaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0YXRpYyBjb25zdCBpbnQgdGltZW91dCA9IDEwMDAwOworCWludCBpOwogCiAJaWYgKGJvYXJkLT5yZWdfdHlwZSA9PSBuaV9yZWdfNjE0MykgewogCQkvKiAgRmx1c2ggdGhlIDYxNDMgZGF0YSBGSUZPICovCiAJCW5pX3dyaXRlbCgweDEwLCBBSUZJRk9fQ29udHJvbF82MTQzKTsJLyogIEZsdXNoIGZpZm8gKi8KIAkJbmlfd3JpdGVsKDB4MDAsIEFJRklGT19Db250cm9sXzYxNDMpOwkvKiAgRmx1c2ggZmlmbyAqLwotCQl3aGlsZSAobmlfcmVhZGwoQUlGSUZPX1N0YXR1c182MTQzKSAmIDB4MTApIDsJLyogIFdhaXQgZm9yIGNvbXBsZXRlICovCisJCS8qICBXYWl0IGZvciBjb21wbGV0ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCQlpZiAoIShuaV9yZWFkbChBSUZJRk9fU3RhdHVzXzYxNDMpICYgMHgxMCkpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJaWYgKGkgPT0gdGltZW91dCkgeworCQkJY29tZWRpX2Vycm9yKGRldiwgIkZJRk8gZmx1c2ggdGltZW91dC4iKTsKKwkJfQogCX0gZWxzZSB7CiAJCWRldnByaXYtPnN0Y193cml0ZXcoZGV2LCAxLCBBRENfRklGT19DbGVhcik7CiAJCWlmIChib2FyZC0+cmVnX3R5cGUgPT0gbmlfcmVnXzYyNXgpIHsKQEAgLTkzNywzMiArOTQzLDYgQEAKIAlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiB9CiAKLXN0YXRpYyB2b2lkIG5pX2V2ZW50KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCWlmIChzLT4KLQkgICAgYXN5bmMtPmV2ZW50cyAmIChDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cgfAotCQkJICAgICBDT01FRElfQ0JfRU9BKSkgewotCQlzd2l0Y2ggKHMtPmluZGV4KSB7Ci0JCWNhc2UgTklfQUlfU1VCREVWOgotCQkJbmlfYWlfcmVzZXQoZGV2LCBzKTsKLQkJCWJyZWFrOwotCQljYXNlIE5JX0FPX1NVQkRFVjoKLQkJCW5pX2FvX3Jlc2V0KGRldiwgcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9HUENUMF9TVUJERVY6Ci0JCWNhc2UgTklfR1BDVDFfU1VCREVWOgotCQkJbmlfZ3BjdF9jYW5jZWwoZGV2LCBzKTsKLQkJCWJyZWFrOwotCQljYXNlIE5JX0RJT19TVUJERVY6Ci0JCQluaV9jZGlvX2NhbmNlbChkZXYsIHMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlX2dwY3RfaW50ZXJydXB0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICB1bnNpZ25lZCBzaG9ydCBjb3VudGVyX2luZGV4KQogewpAQCAtOTc0LDggKzk1NCw3IEBACiAKIAluaV90aW9faGFuZGxlX2ludGVycnVwdCgmZGV2cHJpdi0+Y291bnRlcl9kZXYtPmNvdW50ZXJzW2NvdW50ZXJfaW5kZXhdLAogCQkJCXMpOwotCWlmIChzLT5hc3luYy0+ZXZlbnRzKQotCQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAjZW5kaWYKIH0KIApAQCAtMTAzMyw3ICsxMDEyLDcgQEAKIAkJCWlmIChjb21lZGlfaXNfc3ViZGV2aWNlX3J1bm5pbmcocykpIHsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9CiAJCQkJICAgIENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCQkJbmlfZXZlbnQoZGV2LCBzKTsKKwkJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJfQogCQkJcmV0dXJuOwogCQl9CkBAIC0xMDQ4LDggKzEwMjcsNyBAQAogCQkJaWYgKHN0YXR1cyAmIChBSV9PdmVycnVuX1N0IHwgQUlfT3ZlcmZsb3dfU3QpKQogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCi0JCQluaV9ldmVudChkZXYsIHMpOwotCisJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChzdGF0dXMgJiBBSV9TQ19UQ19TdCkgewpAQCAtMTA3Niw3ICsxMDU0LDcgQEAKIAlpZiAoKHN0YXR1cyAmIEFJX1NUT1BfU3QpKQogCQluaV9oYW5kbGVfZW9zKGRldiwgcyk7CiAKLQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFja19iX2ludGVycnVwdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBiX3N0YXR1cykKQEAgLTExNTEsNyArMTEyOSw3IEBACiAJfQogI2VuZGlmCiAKLQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKICNpZm5kZWYgUENJRE1BCkBAIC0zNjYyLDcgKzM2NDAsNyBAQAogCQkJICBNX09mZnNldF9DRElPX0NvbW1hbmQpOwogCQkvKiBzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7ICovCiAJfQotCW5pX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIGludCBuaV9zZXJpYWxfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTQyODIsMTAgKzQyNjAsMTQgQEAKIAogCS8qIDgyNTUgZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbTklfODI1NV9ESU9fU1VCREVWXTsKLQlpZiAoYm9hcmQtPmhhc184MjU1KQotCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgbmlfODI1NV9jYWxsYmFjaywgKHVuc2lnbmVkIGxvbmcpZGV2KTsKLQllbHNlCisJaWYgKGJvYXJkLT5oYXNfODI1NSkgeworCQlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgbmlfODI1NV9jYWxsYmFjaywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiBmb3JtZXJseSBnZW5lcmFsIHB1cnBvc2UgY291bnRlci90aW1lciBkZXZpY2UsIGJ1dCBubyBsb25nZXIgdXNlZCAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW05JX1VOVVNFRF9TVUJERVZdOwpAQCAtNDM5Myw2ICs0Mzc1LDkgQEAKIAkJCQkJCQkmbmlfZ3BjdF9yZWFkX3JlZ2lzdGVyLAogCQkJCQkJCWNvdW50ZXJfdmFyaWFudCwKIAkJCQkJCQlOVU1fR1BDVCk7CisJaWYgKCFkZXZwcml2LT5jb3VudGVyX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKiBHZW5lcmFsIHB1cnBvc2UgY291bnRlcnMgKi8KIAlmb3IgKGogPSAwOyBqIDwgTlVNX0dQQ1Q7ICsraikgewogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tOSV9HUENUX1NVQkRFVihqKV07CkBAIC00NDgzLDcgKzQ0NjgsNiBAQAogCQluaV93cml0ZWIoMHgwLCBNX09mZnNldF9BT19DYWxpYnJhdGlvbik7CiAJfQogCi0JcHJpbnRrKCJcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC00OTkyLDkgKzQ5NzYsOSBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBQQ0lETUEKIHN0YXRpYyBpbnQgbmlfZ3BjdF9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0jaWZkZWYgUENJRE1BCiAJc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIgPSBzLT5wcml2YXRlOwogCWludCByZXR2YWw7CiAKQEAgLTUwMDIsMTAgKzQ5ODYsOCBAQAogCW5pX2Vfc2VyaWVzX2VuYWJsZV9zZWNvbmRfaXJxKGRldiwgY291bnRlci0+Y291bnRlcl9pbmRleCwgMCk7CiAJbmlfcmVsZWFzZV9ncGN0X21pdGVfY2hhbm5lbChkZXYsIGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpOwogCXJldHVybiByZXR2YWw7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCiB9CisjZW5kaWYKIAogLyoKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKaW5kZXggMzBjNDZhMy4uODVhYzJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwpAQCAtMjYzLDkgKzI2Myw2IEBACiAjZGVmaW5lIEludEVuIChUcmFuc2ZlclJlYWR5fENvdW50RXhwaXJlZHxXYWl0ZWR8UHJpbWFyeVRDfFNlY29uZGFyeVRDKQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgbmlfcGNpZGlvX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLQogZW51bSBuaWRpb19ib2FyZGlkIHsKIAlCT0FSRF9QQ0lESU9fMzJIUywKIAlCT0FSRF9QWEk2NTMzLApAQCAtMzUzLDE3ICszNTAsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5pX3BjaWRpb19ldmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCWlmIChzLT4KLQkgICAgYXN5bmMtPmV2ZW50cyAmIChDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SIHwKLQkJCSAgICAgQ09NRURJX0NCX09WRVJGTE9XKSkgewotCQluaV9wY2lkaW9fY2FuY2VsKGRldiwgcyk7Ci0JfQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotfQotCiBzdGF0aWMgaW50IG5pX3BjaWRpb19wb2xsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBuaWRpbzk2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC01MDEsNyArNDg3LDcgQEAKIAl9CiAKIG91dDoKLQluaV9wY2lkaW9fZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogI2lmIDAKIAlpZiAoIXRhZykgewogCQl3cml0ZWIoMHgwMywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwppbmRleCAwZWQ5ODA0Li5kNDBkZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCkBAIC0xNTUxLDcgKzE1NTEsNyBAQAogCWRldi0+c3ViZGV2aWNlc1tOSV9HUENUX1NVQkRFVigxKV0uYnVmX2NoYW5nZSA9ICZwY2ltaW9fZ3BjdDFfY2hhbmdlOwogCWRldi0+c3ViZGV2aWNlc1tOSV9ESU9fU1VCREVWXS5idWZfY2hhbmdlID0gJnBjaW1pb19kaW9fY2hhbmdlOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwY2ltaW9fYWlfY2hhbmdlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvLmgKaW5kZXggNjgzNzhkYS4uMTA1NmJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW8uaApAQCAtMTE1LDEwICsxMTUsMTAgQEAKIAogc3RydWN0IG5pX2dwY3RfZGV2aWNlIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OwotCXZvaWQgKCp3cml0ZV9yZWdpc3RlcikgKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLCB1bnNpZ25lZCBiaXRzLAotCQkJCWVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOwotCXVuc2lnbmVkICgqcmVhZF9yZWdpc3RlcikgKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAotCQkJCSAgIGVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOworCXZvaWQgKCp3cml0ZV9yZWdpc3Rlcikoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHVuc2lnbmVkIGJpdHMsCisJCQkgICAgICAgZW51bSBuaV9ncGN0X3JlZ2lzdGVyIHJlZyk7CisJdW5zaWduZWQgKCpyZWFkX3JlZ2lzdGVyKShzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwKKwkJCQkgIGVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOwogCWVudW0gbmlfZ3BjdF92YXJpYW50IHZhcmlhbnQ7CiAJc3RydWN0IG5pX2dwY3QgKmNvdW50ZXJzOwogCXVuc2lnbmVkIG51bV9jb3VudGVyczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYwppbmRleCBmMGZjMTIzLi43YzAzYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCkBAIC0yNTMsMTggKzI1MywxNyBAQAogCW91dGIobXV4IHwgUENMNzExX01VWF9DSEFOKGNoYW4pLCBkZXYtPmlvYmFzZSArIFBDTDcxMV9NVVhfUkVHKTsKIH0KIAotc3RhdGljIGludCBwY2w3MTFfYWlfd2FpdF9mb3JfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgcGNsNzExX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JdW5zaWduZWQgaW50IG1zYjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQltc2IgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfQUlfTVNCX1JFRyk7Ci0JCWlmICgobXNiICYgUENMNzExX0FJX01TQl9EUkRZKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfQUlfTVNCX1JFRyk7CisJaWYgKChzdGF0dXMgJiBQQ0w3MTFfQUlfTVNCX0RSRFkpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNsNzExX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjgyLDcgKzI4MSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKFBDTDcxMV9TT0ZUVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfU09GVFRSSUdfUkVHKTsKIAotCQlyZXQgPSBwY2w3MTFfYWlfd2FpdF9mb3JfZW9jKGRldiwgMTAwKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2w3MTFfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTMzNiwxMSArMzM1LDggQEAKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwogCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKSB7CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKQogCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKLQl9IGVsc2UgewotCQkvKiBpZ25vcmUgKi8KLQl9CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwppbmRleCA1MzYxM2IzLi4xNjBlYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCkBAIC0xMzEsMzQgKzEzMSwzMiBAQAogI2RlZmluZSBib2FyZEFDTDgyMTYJICAgICAgOAkvKiBhbmQgSUNQIERBUyBBLTgyNlBHICovCiAjZGVmaW5lIGJvYXJkQTgyMQkgICAgICA5CS8qIFBHSCwgUEdMLCBQR0wvTkRBIHZlcnNpb25zICovCiAKLSNkZWZpbmUgUENMeDF4X0lPUkFOR0UJICAgICAxNgotCi0jZGVmaW5lIFBDTDgxMl9DVFIwCSAgICAgIDAKLSNkZWZpbmUgUENMODEyX0NUUjEJICAgICAgMQotI2RlZmluZSBQQ0w4MTJfQ1RSMgkgICAgICAyCi0jZGVmaW5lIFBDTDgxMl9DVFJDVEwJICAgICAgMwotI2RlZmluZSBQQ0w4MTJfQURfTE8JICAgICAgNAotI2RlZmluZSBQQ0w4MTJfREExX0xPCSAgICAgIDQKLSNkZWZpbmUgUENMODEyX0FEX0hJCSAgICAgIDUKLSNkZWZpbmUgUENMODEyX0RBMV9ISQkgICAgICA1Ci0jZGVmaW5lIFBDTDgxMl9EQTJfTE8JICAgICAgNgotI2RlZmluZSBQQ0w4MTJfRElfTE8JICAgICAgNgotI2RlZmluZSBQQ0w4MTJfREEyX0hJCSAgICAgIDcKLSNkZWZpbmUgUENMODEyX0RJX0hJCSAgICAgIDcKLSNkZWZpbmUgUENMODEyX0NMUklOVAkgICAgICA4Ci0jZGVmaW5lIFBDTDgxMl9HQUlOCSAgICAgIDkKLSNkZWZpbmUgUENMODEyX01VWAkgICAgIDEwCi0jZGVmaW5lIFBDTDgxMl9NT0RFCSAgICAgMTEKLSNkZWZpbmUgUENMODEyX0NOVEVOQUJMRSAgICAgMTAKLSNkZWZpbmUgUENMODEyX1NPRlRUUklHCSAgICAgMTIKLSNkZWZpbmUgUENMODEyX0RPX0xPCSAgICAgMTMKLSNkZWZpbmUgUENMODEyX0RPX0hJCSAgICAgMTQKLQotI2RlZmluZSBQQ0w4MTJfRFJEWQkgICAweDEwCS8qID0wIGRhdGEgcmVhZHkgKi8KLQotI2RlZmluZSBBQ0w4MjE2X1NUQVRVUwkgICAgICA4CS8qIDUuIGJpdCBzaWduYWxpemUgZGF0YSByZWFkeSAqLwotCi0jZGVmaW5lIEFDTDgyMTZfRFJEWQkgICAweDIwCS8qID0wIGRhdGEgcmVhZHkgKi8KKy8qCisgKiBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgUENMODEyX1RJTUVSX0JBU0UJCQkweDAwCisjZGVmaW5lIFBDTDgxMl9BSV9MU0JfUkVHCQkJMHgwNAorI2RlZmluZSBQQ0w4MTJfQUlfTVNCX1JFRwkJCTB4MDUKKyNkZWZpbmUgUENMODEyX0FJX01TQl9EUkRZCQkJKDEgPDwgNCkKKyNkZWZpbmUgUENMODEyX0FPX0xTQl9SRUcoeCkJCQkoMHgwNCArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODEyX0FPX01TQl9SRUcoeCkJCQkoMHgwNSArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODEyX0RJX0xTQl9SRUcJCQkweDA2CisjZGVmaW5lIFBDTDgxMl9ESV9NU0JfUkVHCQkJMHgwNworI2RlZmluZSBQQ0w4MTJfU1RBVFVTX1JFRwkJCTB4MDgKKyNkZWZpbmUgUENMODEyX1NUQVRVU19EUkRZCQkJKDEgPDwgNSkKKyNkZWZpbmUgUENMODEyX1JBTkdFX1JFRwkJCTB4MDkKKyNkZWZpbmUgUENMODEyX01VWF9SRUcJCQkJMHgwYQorI2RlZmluZSBQQ0w4MTJfTVVYX0NIQU4oeCkJCQkoKHgpIDw8IDApCisjZGVmaW5lIFBDTDgxMl9NVVhfQ1MwCQkJCSgxIDw8IDQpCisjZGVmaW5lIFBDTDgxMl9NVVhfQ1MxCQkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxMl9DVFJMX1JFRwkJCQkweDBiCisjZGVmaW5lIFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRwkJKDAgPDwgMCkKKyNkZWZpbmUgUENMODEyX0NUUkxfU09GVF9UUklHCQkJKDEgPDwgMCkKKyNkZWZpbmUgUENMODEyX0NUUkxfUEFDRVJfRE1BX1RSSUcJCSgyIDw8IDApCisjZGVmaW5lIFBDTDgxMl9DVFJMX1BBQ0VSX0VPQ19UUklHCQkoNiA8PCAwKQorI2RlZmluZSBQQ0w4MTJfU09GVFRSSUdfUkVHCQkJMHgwYworI2RlZmluZSBQQ0w4MTJfRE9fTFNCX1JFRwkJCTB4MGQKKyNkZWZpbmUgUENMODEyX0RPX01TQl9SRUcJCQkweDBlCiAKICNkZWZpbmUgTUFYX0NIQU5MSVNUX0xFTiAgICAyNTYJLyogbGVuZ3RoIG9mIHNjYW4gbGlzdCAqLwogCkBAIC0zMzEsMjEzICszMjksMzkxIEBACiB9OwogCiBzdHJ1Y3QgcGNsODEyX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBib2FyZF90eXBlOworCWludCBuX2FpY2hhbjsKKwlpbnQgbl9hb2NoYW47CisJdW5zaWduZWQgaW50IGFpX25zX21pbjsKKwljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FpOworCXVuc2lnbmVkIGludCBJUlFiaXRzOworCXVuc2lnbmVkIGludCBoYXNfZG1hOjE7CisJdW5zaWduZWQgaW50IGhhc18xNmJpdF9haToxOworCXVuc2lnbmVkIGludCBoYXNfbXBjNTA4X211eDoxOworCXVuc2lnbmVkIGludCBoYXNfZGlvOjE7Cit9OwogCi0JY29uc3QgY2hhciAqbmFtZTsJLyogIGJvYXJkIG5hbWUgKi8KLQlpbnQgYm9hcmRfdHlwZTsJCS8qICB0eXBlIG9mIHRoaXMgYm9hcmQgKi8KLQlpbnQgbl9haWNoYW47CQkvKiAgbnVtIG9mIEFJIGNoYW5zIGluIFMuRS4gKi8KLQlpbnQgbl9haWNoYW5fZGlmZjsJLyogIERJRkYgbnVtIG9mIGNoYW5zICovCi0JaW50IG5fYW9jaGFuOwkJLyogIG51bSBvZiBEQSBjaGFucyAqLwotCWludCBuX2RpY2hhbjsJCS8qICBESSBhbmQgRE8gY2hhbnMgKi8KLQlpbnQgbl9kb2NoYW47Ci0JaW50IGFpX21heGRhdGE7CQkvKiAgQUkgcmVzb2x1dGlvbiAqLwotCXVuc2lnbmVkIGludCBhaV9uc19taW47CS8qICBtYXggc2FtcGxlIHNwZWVkIG9mIGNhcmQgdiBucyAqLwotCXVuc2lnbmVkIGludCBpODI1NF9vc2NfYmFzZTsJLyogIGNsb2NrIGJhc2UgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FpOwkvKiAgcmFuZ2VsaXN0IGZvciBBL0QgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FvOwkvKiAgcmFuZ2VsaXN0IGZvciBEL0EgKi8KLQl1bnNpZ25lZCBpbnQgSVJRYml0czsJLyogIGFsbG93ZWQgSVJRICovCi0JdW5zaWduZWQgY2hhciBETUFiaXRzOwkvKiAgYWxsb3dlZCBETUEgY2hhbnMgKi8KLQl1bnNpZ25lZCBjaGFyIGlvX3JhbmdlOwkvKiAgaW9yYW5nZSBmb3IgdGhpcyBib2FyZCAqLwotCXVuc2lnbmVkIGNoYXIgaGF2ZU1QQzUwODsJLyogIDE9Ym9hcmQgdXNlIE1QQzUwOEEgbXVsdGlwbGV4b3IgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJwY2w4MTIiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkUENMODEyLAorCQkubl9haWNoYW4JPSAxNiwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDMzMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2JpcG9sYXIxMCwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gInBjbDgxMnBnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMlBHLAorCQkubl9haWNoYW4JPSAxNiwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDMzMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxMnBnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMnBnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMlBHLAorCQkubl9haWNoYW4JPSAxNiwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxMnBnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMmRnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmRnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX21wYzUwOF9tdXgJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMmhnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmhnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX21wYzUwOF9tdXgJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyMXBnbCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBODIxLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJCS5JUlFiaXRzCT0gMHgwMDBjLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyMXBnbG5kYSIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBODIxLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJCS5JUlFiaXRzCT0gMHgwMDBjLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjFwZ2giLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQTgyMSwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9hODIxcGdoX2FpLAorCQkuSVJRYml0cwk9IDB4MDAwYywKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjJwZ2wiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODExMiwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9hY2w4MTEyZGdfYWksCisJCS5JUlFiaXRzCT0gMHhkY2ZjLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZGlvCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJhODIycGdoIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmhnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyM3BnbCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDgwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmRnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyM3BnaCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDgwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmhnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODEzIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMywKKwkJLm5fYWljaGFuCT0gMzIsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfcGNsODEzYl9haSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MTNiIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxM0IsCisJCS5uX2FpY2hhbgk9IDMyLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEzLAorCQkubl9haWNoYW4JPSAzMiwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9hY2w4MTEzXzFfYWksCisJfSwgeworCQkubmFtZQkJPSAiaXNvODEzIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZElTTzgxMywKKwkJLm5fYWljaGFuCT0gMzIsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfaXNvODEzXzFfYWksCisJfSwgeworCQkubmFtZQkJPSAiYWNsODIxNiIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MjE2LAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2IyX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzXzE2Yml0X2FpCT0gMSwKKwkJLmhhc19tcGM1MDhfbXV4CT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjZwZyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MjE2LAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2IyX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzXzE2Yml0X2FpCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sCiB9OwogCiBzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgewotCi0JdW5zaWduZWQgY2hhciB2YWxpZDsJLyogID0xIGRldmljZSBpcyBPSyAqLwogCXVuc2lnbmVkIGNoYXIgZG1hOwkvKiAgPjAgdXNlIGRtYSAoIHVzZWRETUEgY2hhbm5lbCkgKi8KLQl1bnNpZ25lZCBjaGFyIHVzZV9kaWZmOwkvKiAgPTEgZGlmZiBpbnB1dHMgKi8KLQl1bnNpZ25lZCBjaGFyIHVzZV9NUEM7CS8qICAxPWJvYXJkIHVzZXMgTVBDNTA4QSBtdWx0aXBsZXhvciAqLwotCXVuc2lnbmVkIGNoYXIgdXNlX2V4dF90cmc7CS8qICAxPWJvYXJkIHVzZXMgZXh0ZXJuYWwgdHJpZ2dlciAqLwogCXVuc2lnbmVkIGNoYXIgcmFuZ2VfY29ycmVjdGlvbjsJLyogID0xIHdlIG11c3QgYWRkIDEgdG8gcmFuZ2UgbnVtYmVyICovCi0JdW5zaWduZWQgY2hhciBvbGRfY2hhbl9yZWc7CS8qICBsYXN0bHkgdXNlZCBjaGFuL2dhaW4gcGFpciAqLwotCXVuc2lnbmVkIGNoYXIgb2xkX2dhaW5fcmVnOworCXVuc2lnbmVkIGludCBsYXN0X2FpX2NoYW5zcGVjOwogCXVuc2lnbmVkIGNoYXIgbW9kZV9yZWdfaW50OwkvKiAgdGhlcmUgaXMgc3RvcmVkIElOVCBudW1iZXIgZm9yIHNvbWUgY2FyZCAqLwotCXVuc2lnbmVkIGNoYXIgYWlfbmV2ZXJlbmRpbmc7CS8qICA9MSB3ZSBkbyB1bmxpbWl0ZWQgQUkgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX2VvczsJLyogIDE9RU9TIHdha2UgdXAgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX2RtYTsJLyogID0xIHdlIHVzZSBETUEgKi8KIAl1bnNpZ25lZCBpbnQgYWlfcG9sbF9wdHI7CS8qICBob3cgbWFueSBzYW1wZXMgdHJhbnNmZXIgcG9sbCAqLwotCXVuc2lnbmVkIGludCBhaV9zY2FuczsJLyogIGxlbiBvZiBzY2FubGlzdCAqLwogCXVuc2lnbmVkIGludCBhaV9hY3Rfc2NhbjsJLyogIGhvdyBtYW55IHNjYW5zIHdlIGZpbmlzaGVkICovCi0JdW5zaWduZWQgaW50IGFpX2NoYW5saXN0W01BWF9DSEFOTElTVF9MRU5dOwkvKiAgb3VyIGNvcHkgb2YgY2hhbm5lbC9yYW5nZSBsaXN0ICovCi0JdW5zaWduZWQgaW50IGFpX25fY2hhbjsJLyogIGhvdyBtYW55IGNoYW5uZWxzIGlzIG1lYXN1cmVkICovCi0JdW5zaWduZWQgaW50IGFpX2ZsYWdzOwkvKiAgZmxhZ2xpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfZGF0YV9sZW47CS8qICBsZW4gb2YgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBpbnQgYWlfaXMxNmI7CS8qICA9MSB3ZSBoYXZlIDE2IGJpdCBjYXJkICovCisJdW5zaWduZWQgaW50IGRtYXBhZ2VzOworCXVuc2lnbmVkIGludCBod2RtYXNpemU7CiAJdW5zaWduZWQgbG9uZyBkbWFidWZbMl07CS8qICBQVFIgdG8gRE1BIGJ1ZiAqLwotCXVuc2lnbmVkIGludCBkbWFwYWdlc1syXTsJLyogIGhvdyBtYW55IHBhZ2VzIHdlIGhhdmUgYWxsb2NhdGVkICovCiAJdW5zaWduZWQgaW50IGh3ZG1hcHRyWzJdOwkvKiAgSFcgUFRSIHRvIERNQSBidWYgKi8KLQl1bnNpZ25lZCBpbnQgaHdkbWFzaXplWzJdOwkvKiAgRE1BIGJ1ZiBzaXplIGluIGJ5dGVzICovCiAJdW5zaWduZWQgaW50IGRtYWJ5dGVzdG9tb3ZlWzJdOwkvKiAgaG93IG1hbnkgYnl0ZXMgRE1BIHRyYW5zZmVyICovCiAJaW50IG5leHRfZG1hX2J1ZjsJLyogIHdoaWNoIGJ1ZmZlciBpcyBuZXh0IHRvIHVzZSAqLwogCXVuc2lnbmVkIGludCBkbWFfcnVuc190b19lbmQ7CS8qICBob3cgbWFueSB0aW1lcyB3ZSBtdXN0IHN3aXRjaCBETUEgYnVmZmVycyAqLwogCXVuc2lnbmVkIGludCBsYXN0X2RtYV9ydW47CS8qICBob3cgbWFueSBieXRlcyB0byB0cmFuc2ZlciBvbiBsYXN0IERNQSBidWZmZXIgKi8KIAl1bnNpZ25lZCBpbnQgbWF4XzgxMl9haV9tb2RlMF9yYW5nZXdhaXQ7CS8qICBzZXRsaW5nIHRpbWUgZm9yIGdhaW4gKi8KIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07CS8qICBkYXRhIGZvciBBTyByZWFkYmFjayAqLworCXVuc2lnbmVkIGludCBkaXZpc29yMTsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CisJdW5zaWduZWQgaW50IHVzZV9kaWZmOjE7CisJdW5zaWduZWQgaW50IHVzZV9tcGM1MDg6MTsKKwl1bnNpZ25lZCBpbnQgdXNlX2V4dF90cmc6MTsKKwl1bnNpZ25lZCBpbnQgYWlfZG1hOjE7CisJdW5zaWduZWQgaW50IGFpX2VvczoxOwogfTsKIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLAotCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpOwotc3RhdGljIHZvaWQgc2V0dXBfcmFuZ2VfY2hhbm5lbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXVuc2lnbmVkIGludCByYW5nZWNoYW4sIGNoYXIgd2FpdCk7Ci1zdGF0aWMgaW50IHBjbDgxMl9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2w4MTJfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MTJfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgYm9vbCBsb2FkX3RpbWVycykKIHsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG47Ci0JaW50IHRpbWVvdXQsIGhpOworCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODEyX1RJTUVSX0JBU0U7CiAKLQkvKiBzZWxlY3Qgc29mdHdhcmUgdHJpZ2dlciAqLwotCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JLyogIHNlbGVjdCBjaGFubmVsIGFuZCByZW5nZSAqLwotCXNldHVwX3JhbmdlX2NoYW5uZWwoZGV2LCBzLCBpbnNuLT5jaGFuc3BlYywgMSk7Ci0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQkvKiBzdGFydCBjb252ZXJzaW9uICovCi0JCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJRyk7Ci0JCXVkZWxheSg1KTsKLQkJdGltZW91dCA9IDUwOwkvKiB3YWl0IG1heCA1MHVzLCBpdCBtdXN0IGZpbmlzaCB1bmRlciAzM3VzICovCi0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0hJKTsKLQkJCWlmICghKGhpICYgUENMODEyX0RSRFkpKQotCQkJCWdvdG8gY29udl9maW5pc2g7Ci0JCQl1ZGVsYXkoMSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwl1ZGVsYXkoMSk7CisKKwlpZiAobG9hZF90aW1lcnMpIHsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwY2w4MTJfYWlfc2V0dXBfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgZG1hX2ZsYWdzOworCXVuc2lnbmVkIGludCBieXRlczsKKworCS8qICB3ZSB1c2UgRU9TLCBzbyBhZGFwdCBETUEgYnVmZmVyIHRvIG9uZSBzY2FuICovCisJaWYgKGRldnByaXYtPmFpX2VvcykgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9CisJCQljbWQtPmNoYW5saXN0X2xlbiAqIHNpemVvZihzaG9ydCk7CisJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0KKwkJCWNtZC0+Y2hhbmxpc3RfbGVuICogc2l6ZW9mKHNob3J0KTsKKwkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gMTsKKwl9IGVsc2UgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPSBkZXZwcml2LT5od2RtYXNpemU7CisJCWlmIChzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3ogPCBkZXZwcml2LT5od2RtYXNpemUpIHsKKwkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KKwkJCQlzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9CisJCQkJcy0+YXN5bmMtPnByZWFsbG9jX2J1ZnN6OwogCQl9Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJBL0QgaW5zbiByZWFkIHRpbWVvdXRcbiIpOwotCQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCQlyZXR1cm4gLUVUSU1FOworCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUpIHsKKwkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiAgaG93IG1hbnkgc2FtcGxlcyB3ZSBtdXN0IHRyYW5zZmVyPyAqLworCQkJYnl0ZXMgPSBjbWQtPmNoYW5saXN0X2xlbiAqCisJCQkJY21kLT5zdG9wX2FyZyAqIHNpemVvZihzaG9ydCk7CiAKLWNvbnZfZmluaXNoOgotCQlkYXRhW25dID0gKChoaSAmIDB4ZikgPDwgOCkgfCBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQURfTE8pOwotCX0KLQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCXJldHVybiBuOwotfQorCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KKwkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9CisJCQkJYnl0ZXMgLyBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXTsKIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgYWNsODIxNl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlpbnQgbjsKLQlpbnQgdGltZW91dDsKLQotCS8qIHNlbGVjdCBzb2Z0d2FyZSB0cmlnZ2VyICovCi0Jb3V0YigxLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQkvKiAgc2VsZWN0IGNoYW5uZWwgYW5kIHJlbmdlICovCi0Jc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGluc24tPmNoYW5zcGVjLCAxKTsKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KLQkJb3V0YigyNTUsIGRldi0+aW9iYXNlICsgUENMODEyX1NPRlRUUklHKTsKLQkJdWRlbGF5KDUpOwotCQl0aW1lb3V0ID0gNTA7CS8qIHdhaXQgbWF4IDUwdXMsIGl0IG11c3QgZmluaXNoIHVuZGVyIDMzdXMgKi8KLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgQUNMODIxNl9TVEFUVVMpICYgQUNMODIxNl9EUkRZKSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQkJdWRlbGF5KDEpOworCQkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLworCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0KKwkJCQlieXRlcyAlIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdOworCQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9PSAwKQorCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KKwkJCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuOworCQkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07CiAJCX0KLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkEvRCBpbnNuIHJlYWQgdGltZW91dFxuIik7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JCXJldHVybiAtRVRJTUU7Ci0KLWNvbnZfZmluaXNoOgotCQlkYXRhW25dID0KLQkJICAgIChpbmIoZGV2LT5pb2Jhc2UgKwotCQkJIFBDTDgxMl9BRF9ISSkgPDwgOCkgfCBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQURfTE8pOwogCX0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCXJldHVybiBuOworCWlmIChkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA+IGRldnByaXYtPmh3ZG1hc2l6ZSkgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+YWlfZW9zID0gMDsKKwl9CisJaWYgKGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID4gZGV2cHJpdi0+aHdkbWFzaXplKSB7CisJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplOworCQlkZXZwcml2LT5haV9lb3MgPSAwOworCX0KKwlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAwOworCXNldF9kbWFfbW9kZShkZXZwcml2LT5kbWEsIERNQV9NT0RFX1JFQUQpOworCWRtYV9mbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGRldnByaXYtPmRtYSk7CisJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwgZGV2cHJpdi0+aHdkbWFwdHJbMF0pOworCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSk7CisJcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOworCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgcGNsODEyX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBjbDgxMl9haV9zZXR1cF9uZXh0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0JCW91dGIoKGRhdGFbaV0gJiAweGZmKSwKLQkJICAgICBkZXYtPmlvYmFzZSArIChjaGFuID8gUENMODEyX0RBMl9MTyA6IFBDTDgxMl9EQTFfTE8pKTsKLQkJb3V0YigoZGF0YVtpXSA+PiA4KSAmIDB4MGYsCi0JCSAgICAgZGV2LT5pb2Jhc2UgKyAoY2hhbiA/IFBDTDgxMl9EQTJfSEkgOiBQQ0w4MTJfREExX0hJKSk7Ci0JCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKKwlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOworCWRpc2FibGVfZG1hKGRldnByaXYtPmRtYSk7CisJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7CisJZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKKwlpZiAoZGV2cHJpdi0+YWlfZW9zKSB7CisJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLAorCQkJICAgICAgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSk7CisJfSBlbHNlIHsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCkgeworCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCisJCQkJICAgICAgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+CisJCQkJCQkJICAgICAgbmV4dF9kbWFfYnVmXSk7CisJCX0gZWxzZSB7CisJCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKKwkJfQorCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKIAl9Ci0KLQlyZXR1cm4gaTsKKwlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7CisJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2w4MTJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2Uoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuc3BlYywgY2hhciB3YWl0KQogewogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWludCBpOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihjaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoY2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBtdXggPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKLQkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCWlmIChjaGFuc3BlYyA9PSBkZXZwcml2LT5sYXN0X2FpX2NoYW5zcGVjKQorCQlyZXR1cm47CiAKLQlyZXR1cm4gaTsKLX0KKwlkZXZwcml2LT5sYXN0X2FpX2NoYW5zcGVjID0gY2hhbnNwZWM7CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IHBjbDgxMl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0RJX0xPKTsKLQlkYXRhWzFdIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9ESV9ISSkgPDwgODsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IHBjbDgxMl9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgewotCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTE8pOwotCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fSEkpOworCWlmIChkZXZwcml2LT51c2VfbXBjNTA4KSB7CisJCWlmIChkZXZwcml2LT51c2VfZGlmZikgeworCQkJbXV4IHw9IFBDTDgxMl9NVVhfQ1MwIHwgUENMODEyX01VWF9DUzE7CisJCX0gZWxzZSB7CisJCQlpZiAoY2hhbiA8IDgpCisJCQkJbXV4IHw9IFBDTDgxMl9NVVhfQ1MwOworCQkJZWxzZQorCQkJCW11eCB8PSBQQ0w4MTJfTVVYX0NTMTsKKwkJfQogCX0KIAotCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKwlvdXRiKG11eCB8IFBDTDgxMl9NVVhfQ0hBTihjaGFuKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTVVYX1JFRyk7CisJb3V0YihyYW5nZSArIGRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24sIGRldi0+aW9iYXNlICsgUENMODEyX1JBTkdFX1JFRyk7CiAKLQlyZXR1cm4gaW5zbi0+bjsKKwlpZiAod2FpdCkKKwkJLyoKKwkJICogWFhYIHRoaXMgZGVwZW5kcyBvbiBzZWxlY3RlZCByYW5nZSBhbmQgY2FuIGJlIHZlcnkgbG9uZyBmb3IKKwkJICogc29tZSBoaWdoIGdhaW4gcmFuZ2VzIQorCQkgKi8KKwkJdWRlbGF5KGRldnByaXYtPm1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0KTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KK3N0YXRpYyB2b2lkIHBjbDgxMl9haV9jbGVhcl9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiB3cml0aW5nIGFueSB2YWx1ZSBjbGVhcnMgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TVEFUVVNfUkVHKTsKK30KKworc3RhdGljIHZvaWQgcGNsODEyX2FpX3NvZnRfdHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIHdyaXRpbmcgYW55IHZhbHVlIHRyaWdnZXJzIGEgc29mdHdhcmUgY29udmVyc2lvbiAqLworCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJR19SRUcpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbDgxMl9haV9nZXRfc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FJX01TQl9SRUcpIDw8IDg7CisJdmFsIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BSV9MU0JfUkVHKTsKKworCXJldHVybiB2YWwgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgaW50IHBjbDgxMl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlpZiAocy0+bWF4ZGF0YSA+IDB4MGZmZikgeworCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfU1RBVFVTX1JFRyk7CisJCWlmICgoc3RhdHVzICYgUENMODEyX1NUQVRVU19EUkRZKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FJX01TQl9SRUcpOworCQlpZiAoKHN0YXR1cyAmIFBDTDgxMl9BSV9NU0JfRFJEWSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjbDgxMl9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewpAQCAtNTQ1LDcgKzcyMSw3IEBACiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBmbGFnczsKLQlpbnQgdG1wLCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IHRtcDsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIApAQCAtNjAwLDggKzc3Niw5IEBACiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoYm9hcmQtPmk4MjU0X29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAorCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzJNSFosCisJCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKIAkJCQkJICAmY21kLT5jb252ZXJ0X2FyZywgY21kLT5mbGFncyk7CiAJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgYm9hcmQtPmFpX25zX21pbikKIAkJCWNtZC0+Y29udmVydF9hcmcgPSBib2FyZC0+YWlfbnNfbWluOwpAQCAtNjE1LDU0ICs3OTIsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODEyX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQljb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDAsIGksIGRtYV9mbGFncywgYnl0ZXM7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjdHJsID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChkZXZwcml2LT51c2VfZXh0X3RyZykgewotCQlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX0VYVCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNtZC0+c2Nhbl9lbmRfc3JjICE9IFRSSUdfQ09VTlQpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gTUFYX0NIQU5MSVNUX0xFTikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IGJvYXJkLT5haV9uc19taW4pCi0JCQljbWQtPmNvbnZlcnRfYXJnID0gYm9hcmQtPmFpX25zX21pbjsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihib2FyZC0+aTgyNTRfb3NjX2Jhc2UsCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCi0JCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCX0KLQotCXN0YXJ0X3BhY2VyKGRldiwgLTEsIDAsIDApOwkvKiAgc3RvcCBwYWNlciAqLwotCi0JZGV2cHJpdi0+YWlfbl9jaGFuID0gY21kLT5jaGFubGlzdF9sZW47Ci0JbWVtY3B5KGRldnByaXYtPmFpX2NoYW5saXN0LCBjbWQtPmNoYW5saXN0LAotCSAgICAgICBzaXplb2YodW5zaWduZWQgaW50KSAqIGNtZC0+c2Nhbl9lbmRfYXJnKTsKLQkvKiAgc2VsZWN0IGZpcnN0IGNoYW5uZWwgYW5kIHJhbmdlICovCi0Jc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGRldnByaXYtPmFpX2NoYW5saXN0WzBdLCAxKTsKKwlwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBjbWQtPmNoYW5saXN0WzBdLCAxKTsKIAogCWlmIChkZXZwcml2LT5kbWEpIHsJLyogIGNoZWNrIGlmIHdlIGNhbiB1c2UgRE1BIHRyYW5zZmVyICovCiAJCWRldnByaXYtPmFpX2RtYSA9IDE7Ci0JCWZvciAoaSA9IDE7IGkgPCBkZXZwcml2LT5haV9uX2NoYW47IGkrKykKLQkJCWlmIChkZXZwcml2LT5haV9jaGFubGlzdFswXSAhPSBkZXZwcml2LT5haV9jaGFubGlzdFtpXSkgeworCQlmb3IgKGkgPSAxOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykKKwkJCWlmIChjbWQtPmNoYW5saXN0WzBdICE9IGNtZC0+Y2hhbmxpc3RbaV0pIHsKIAkJCQkvKiAgd2UgY2Fubid0IHVzZSBETUEgOi0oICovCiAJCQkJZGV2cHJpdi0+YWlfZG1hID0gMDsKIAkJCQlicmVhazsKQEAgLTY3MCwyMTIgKzgxNCwxMDUgQEAKIAl9IGVsc2UKIAkJZGV2cHJpdi0+YWlfZG1hID0gMDsKIAotCWRldnByaXYtPmFpX2ZsYWdzID0gY21kLT5mbGFnczsKLQlkZXZwcml2LT5haV9kYXRhX2xlbiA9IHMtPmFzeW5jLT5wcmVhbGxvY19idWZzejsKLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gY21kLT5zdG9wX2FyZzsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAwOwotCX0gZWxzZSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gMDsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAxOwotCX0KLQogCWRldnByaXYtPmFpX2FjdF9zY2FuID0gMDsKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IDA7CiAJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKIAogCS8qICBkb24ndCB3ZSB3YW50IHdha2UgdXAgZXZlcnkgc2Nhbj8gKi8KLQlpZiAoKGRldnByaXYtPmFpX2ZsYWdzICYgVFJJR19XQUtFX0VPUykpIHsKKwlpZiAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpIHsKIAkJZGV2cHJpdi0+YWlfZW9zID0gMTsKIAogCQkvKiAgRE1BIGlzIHVzZWxlc3MgZm9yIHRoaXMgc2l0dWF0aW9uICovCi0JCWlmIChkZXZwcml2LT5haV9uX2NoYW4gPT0gMSkKKwkJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID09IDEpCiAJCQlkZXZwcml2LT5haV9kbWEgPSAwOwogCX0KIAotCWlmIChkZXZwcml2LT5haV9kbWEpIHsKLQkJLyogIHdlIHVzZSBFT1MsIHNvIGFkYXB0IERNQSBidWZmZXIgdG8gb25lIHNjYW4gKi8KLQkJaWYgKGRldnByaXYtPmFpX2VvcykgewotCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPQotCQkJICAgIGRldnByaXYtPmFpX25fY2hhbiAqIHNpemVvZihzaG9ydCk7Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9Ci0JCQkgICAgZGV2cHJpdi0+YWlfbl9jaGFuICogc2l6ZW9mKHNob3J0KTsKLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplWzFdOwotCQkJaWYgKGRldnByaXYtPmFpX2RhdGFfbGVuIDwgZGV2cHJpdi0+aHdkbWFzaXplWzBdKQotCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KLQkJCQkgICAgZGV2cHJpdi0+YWlfZGF0YV9sZW47Ci0JCQlpZiAoZGV2cHJpdi0+YWlfZGF0YV9sZW4gPCBkZXZwcml2LT5od2RtYXNpemVbMV0pCi0JCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPQotCQkJCSAgICBkZXZwcml2LT5haV9kYXRhX2xlbjsKLQkJCWlmIChkZXZwcml2LT5haV9uZXZlcmVuZGluZykgewotCQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCS8qICBob3cgbWFueSBzYW1wbGVzIHdlIG11c3QgdHJhbnNmZXI/ICovCi0JCQkJYnl0ZXMgPSBkZXZwcml2LT5haV9uX2NoYW4gKgotCQkJCQlkZXZwcml2LT5haV9zY2FucyAqIHNpemVvZihzaG9ydCk7Ci0KLQkJCQkvKiAgaG93IG1hbnkgRE1BIHBhZ2VzIHdlIG11c3QgZmlsbCAqLwotCQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9Ci0JCQkJCWJ5dGVzIC8gZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF07Ci0KLQkJCQkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCi0JCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0KLQkJCQkJYnl0ZXMgJSBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXTsKLQkJCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID09IDApCi0JCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KLQkJCQkJICAgIGRldnByaXYtPmxhc3RfZG1hX3J1bjsKLQkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKLQkJCX0KLQkJfQotCQlpZiAoZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPiBkZXZwcml2LT5od2RtYXNpemVbMF0pIHsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwotCQkJZGV2cHJpdi0+YWlfZW9zID0gMDsKLQkJfQotCQlpZiAoZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPiBkZXZwcml2LT5od2RtYXNpemVbMV0pIHsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplWzFdOwotCQkJZGV2cHJpdi0+YWlfZW9zID0gMDsKLQkJfQotCQlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAwOwotCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQkJZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQkJY2xlYXJfZG1hX2ZmKGRldnByaXYtPmRtYSk7Ci0JCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyWzBdKTsKLQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdKTsKLQkJcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOwotCQllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JfQorCWlmIChkZXZwcml2LT5haV9kbWEpCisJCXBjbDgxMl9haV9zZXR1cF9kbWEoZGV2LCBzKTsKIAogCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgewogCWNhc2UgVFJJR19USU1FUjoKLQkJc3RhcnRfcGFjZXIoZGV2LCAxLCBkaXZpc29yMSwgZGl2aXNvcjIpOworCQlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCB0cnVlKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGRldnByaXYtPmFpX2RtYSkJCQkJCS8qICBsZXQncyBnbyEgKi8KLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAyLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQllbHNlCQkJCQkJCS8qICBsZXQncyBnbyEgKi8KLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCA2LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKKwlpZiAoZGV2cHJpdi0+YWlfZG1hKQorCQljdHJsIHw9IFBDTDgxMl9DVFJMX1BBQ0VSX0RNQV9UUklHOworCWVsc2UKKwkJY3RybCB8PSBQQ0w4MTJfQ1RSTF9QQUNFUl9FT0NfVFJJRzsKKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IGN0cmwsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKIAogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTJfYWlfaW50KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgYm9vbCBwY2w4MTJfYWlfbmV4dF9jaGFuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JY2hhciBlcnIgPSAxOwotCXVuc2lnbmVkIGludCBtYXNrLCB0aW1lb3V0OwotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKKwlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisJCWRldnByaXYtPmFpX2FjdF9zY2FuKys7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJICAgIGRldnByaXYtPmFpX2FjdF9zY2FuID49IGNtZC0+c3RvcF9hcmcpIHsKKwkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcGNsODEyX2hhbmRsZV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBpbnQgbmV4dF9jaGFuOwogCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7Ci0KLQl0aW1lb3V0ID0gNTA7CQkvKiB3YWl0IG1heCA1MHVzLCBpdCBtdXN0IGZpbmlzaCB1bmRlciAzM3VzICovCi0JaWYgKGRldnByaXYtPmFpX2lzMTZiKSB7Ci0JCW1hc2sgPSAweGZmZmY7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIEFDTDgyMTZfU1RBVFVTKSAmIEFDTDgyMTZfRFJEWSkpIHsKLQkJCQllcnIgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWFzayA9IDB4MGZmZjsKLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0hJKSAmIFBDTDgxMl9EUkRZKSkgewotCQkJCWVyciA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyKSB7CisJaWYgKHBjbDgxMl9haV9lb2MoZGV2LCBzLCBOVUxMLCAwKSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIGNtZCBJUlEgd2l0aG91dCBEUkRZIVxuIik7Ci0JCXBjbDgxMl9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQlyZXR1cm47CiAJfQogCi0JY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsCi0JCSAgICAgICAoKGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BRF9ISSkgPDwgOCkgfAotCQkJaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0xPKSkgJiBtYXNrKTsKKwljb21lZGlfYnVmX3B1dChzLT5hc3luYywgcGNsODEyX2FpX2dldF9zYW1wbGUoZGV2LCBzKSk7CiAKIAkvKiBTZXQgdXAgbmV4dCBjaGFubmVsLiBBZGRlZCBieSBhYmJvdHRpIDIwMTAtMDEtMjAsIGJ1dCB1bnRlc3RlZC4gKi8KIAluZXh0X2NoYW4gPSBzLT5hc3luYy0+Y3VyX2NoYW4gKyAxOwotCWlmIChuZXh0X2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKQorCWlmIChuZXh0X2NoYW4gPj0gY21kLT5jaGFubGlzdF9sZW4pCiAJCW5leHRfY2hhbiA9IDA7Ci0JaWYgKGRldnByaXYtPmFpX2NoYW5saXN0W3MtPmFzeW5jLT5jdXJfY2hhbl0gIT0KLQkJCWRldnByaXYtPmFpX2NoYW5saXN0W25leHRfY2hhbl0pCi0JCXNldHVwX3JhbmdlX2NoYW5uZWwoZGV2LCBzLCBkZXZwcml2LT5haV9jaGFubGlzdFtuZXh0X2NoYW5dLCAwKTsKKwlpZiAoY21kLT5jaGFubGlzdFtzLT5hc3luYy0+Y3VyX2NoYW5dICE9IGNtZC0+Y2hhbmxpc3RbbmV4dF9jaGFuXSkKKwkJcGNsODEyX2FpX3NldF9jaGFuX3JhbmdlKGRldiwgY21kLT5jaGFubGlzdFtuZXh0X2NoYW5dLCAwKTsKIAotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQotCXMtPmFzeW5jLT5jdXJfY2hhbiA9IG5leHRfY2hhbjsKLQlpZiAobmV4dF9jaGFuID09IDApIHsJLyogb25lIHNjYW4gZG9uZSAqLwotCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCQlpZiAoIShkZXZwcml2LT5haV9uZXZlcmVuZGluZykpCi0JCQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJcGNsODEyX2FpX2NhbmNlbChkZXYsIHMpOwotCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCX0KLQl9Ci0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcGNsODEyX2FpX25leHRfY2hhbihkZXYsIHMpOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIHZvaWQgdHJhbnNmZXJfZnJvbV9kbWFfYnVmKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgIHVuc2lnbmVkIHNob3J0ICpwdHIsCiAJCQkJICB1bnNpZ25lZCBpbnQgYnVmcHRyLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCXMtPmFzeW5jLT5ldmVudHMgPSAwOwogCWZvciAoaSA9IGxlbjsgaTsgaS0tKSB7Ci0JCQkJCQkJLyogIGdldCBvbmUgc2FtcGxlICovCiAJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsKIAotCQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKLQkJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBkZXZwcml2LT5haV9uX2NoYW4pIHsKLQkJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCQkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJCQkJCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJCXBjbDgxMl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KKwkJaWYgKCFwY2w4MTJfYWlfbmV4dF9jaGFuKGRldiwgcykpCisJCQlicmVhazsKIAl9Ci0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODEyX2FpX2RtYShpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgcGNsODEyX2hhbmRsZV9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3M7CiAJaW50IGxlbiwgYnVmcHRyOwogCXVuc2lnbmVkIHNob3J0ICpwdHI7CiAKQEAgLTg4Myw1OCArOTIwLDM2IEBACiAJbGVuID0gKGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlW2RldnByaXYtPm5leHRfZG1hX2J1Zl0gPj4gMSkgLQogCSAgICBkZXZwcml2LT5haV9wb2xsX3B0cjsKIAotCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7Ci0JZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyW2RldnByaXYtPm5leHRfZG1hX2J1Zl0pOwotCWlmIChkZXZwcml2LT5haV9lb3MpIHsKLQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCi0JCQkgICAgICBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVtkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKLQl9IGVsc2UgewotCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKSB7Ci0JCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwKLQkJCQkgICAgICBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVtkZXZwcml2LT4KLQkJCQkJCQkgICAgICBuZXh0X2RtYV9idWZdKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5sYXN0X2RtYV9ydW4pOwotCQl9Ci0JCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCX0KLQlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7Ci0JZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLworCXBjbDgxMl9haV9zZXR1cF9uZXh0X2RtYShkZXYsIHMpOwogCiAJYnVmcHRyID0gZGV2cHJpdi0+YWlfcG9sbF9wdHI7CiAJZGV2cHJpdi0+YWlfcG9sbF9wdHIgPSAwOwogCiAJdHJhbnNmZXJfZnJvbV9kbWFfYnVmKGRldiwgcywgcHRyLCBidWZwdHIsIGxlbik7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxMihpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIGlycXJldHVybl90IHBjbDgxMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCiAJaWYgKCFkZXYtPmF0dGFjaGVkKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJzcHVyaW91cyBpbnRlcnJ1cHQiKTsKKwkJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQorCiAJaWYgKGRldnByaXYtPmFpX2RtYSkKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MTJfYWlfZG1hKGlycSwgZCk7CisJCXBjbDgxMl9oYW5kbGVfZG1hKGRldiwgcyk7CiAJZWxzZQotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxMl9haV9pbnQoaXJxLCBkKTsKKwkJcGNsODEyX2hhbmRsZV9lb2MoZGV2LCBzKTsKKworCXBjbDgxMl9haV9jbGVhcl9lb2MoZGV2KTsKKworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIGludCBwY2w4MTJfYWlfcG9sbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC05NzksNzIgKzk5NCw2IEBACiAJcmV0dXJuIHMtPmFzeW5jLT5idWZfd3JpdGVfY291bnQgLSBzLT5hc3luYy0+YnVmX3JlYWRfY291bnQ7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCBzZXR1cF9yYW5nZV9jaGFubmVsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJdW5zaWduZWQgaW50IHJhbmdlY2hhbiwgY2hhciB3YWl0KQotewotCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5fcmVnID0gQ1JfQ0hBTihyYW5nZWNoYW4pOwkvKiAgbm9ybWFsIGJvYXJkICovCi0JCQkJCQkJLyogIGdhaW4gaW5kZXggKi8KLQl1bnNpZ25lZCBjaGFyIGdhaW5fcmVnID0gQ1JfUkFOR0UocmFuZ2VjaGFuKSArCi0JCQkJIGRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb247Ci0KLQlpZiAoKGNoYW5fcmVnID09IGRldnByaXYtPm9sZF9jaGFuX3JlZykKLQkgICAgJiYgKGdhaW5fcmVnID09IGRldnByaXYtPm9sZF9nYWluX3JlZykpCi0JCXJldHVybjsJCS8qICB3ZSBjYW4gcmV0dXJuLCBubyBjaGFuZ2UgKi8KLQotCWRldnByaXYtPm9sZF9jaGFuX3JlZyA9IGNoYW5fcmVnOwotCWRldnByaXYtPm9sZF9nYWluX3JlZyA9IGdhaW5fcmVnOwotCi0JaWYgKGRldnByaXYtPnVzZV9NUEMpIHsKLQkJaWYgKGRldnByaXYtPnVzZV9kaWZmKSB7Ci0JCQljaGFuX3JlZyA9IGNoYW5fcmVnIHwgMHgzMDsJLyogIERJRkYgaW5wdXRzICovCi0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hhbl9yZWcgJiAweDgwKQotCQkJCQkJCS8qICBTRSBpbnB1dHMgOC0xNSAqLwotCQkJCWNoYW5fcmVnID0gY2hhbl9yZWcgfCAweDIwOwotCQkJZWxzZQotCQkJCQkJCS8qICBTRSBpbnB1dHMgMC03ICovCi0JCQkJY2hhbl9yZWcgPSBjaGFuX3JlZyB8IDB4MTA7Ci0JCX0KLQl9Ci0KLQlvdXRiKGNoYW5fcmVnLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NVVgpOwkvKiBzZWxlY3QgY2hhbm5lbCAqLwotCW91dGIoZ2Fpbl9yZWcsIGRldi0+aW9iYXNlICsgUENMODEyX0dBSU4pOwkvKiBzZWxlY3QgZ2FpbiAqLwotCi0KLQlpZiAod2FpdCkKLQkJLyoKLQkJICogWFhYIHRoaXMgZGVwZW5kcyBvbiBzZWxlY3RlZCByYW5nZSBhbmQgY2FuIGJlIHZlcnkgbG9uZyBmb3IKLQkJICogc29tZSBoaWdoIGdhaW4gcmFuZ2VzIQotCQkgKi8KLQkJdWRlbGF5KGRldnByaXYtPm1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0KTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLAotCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpCi17Ci0Jb3V0YigweGI0LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJDVEwpOwotCW91dGIoMHg3NCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSQ1RMKTsKLQl1ZGVsYXkoMSk7Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCW91dGIoZGl2aXNvcjIgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFIyKTsKLQkJb3V0YigoZGl2aXNvcjIgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFIyKTsKLQkJb3V0YihkaXZpc29yMSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUjEpOwotCQlvdXRiKChkaXZpc29yMSA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUjEpOwotCX0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODEyX2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewpAQCAtMTA1MiwxMzEgKzEwMDEsMzAxIEBACiAKIAlpZiAoZGV2cHJpdi0+YWlfZG1hKQogCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQkJCQkJCQkvKiBTdG9wIEEvRCAqLwotCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0Jc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7CS8qICBzdG9wIDgyNTQgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCisKKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKwlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLworc3RhdGljIGludCBwY2w4MTJfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX1NPRlRfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKworCXBjbDgxMl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGluc24tPmNoYW5zcGVjLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOworCQlwY2w4MTJfYWlfc29mdF90cmlnKGRldik7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2w4MTJfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWRhdGFbaV0gPSBwY2w4MTJfYWlfZ2V0X3NhbXBsZShkZXYsIHMpOworCX0KKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKwlwY2w4MTJfYWlfY2xlYXJfZW9jKGRldik7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCW91dGIoKGRhdGFbaV0gJiAweGZmKSwKKwkJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9BT19MU0JfUkVHKGNoYW4pKTsKKwkJb3V0YigoZGF0YVtpXSA+PiA4KSAmIDB4MGYsCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTVNCX1JFRyhjaGFuKSk7CisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxMl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRElfTFNCX1JFRykgfAorCQkgIChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRElfTVNCX1JFRykgPDwgOCk7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpIHsKKwkJb3V0YihzLT5zdGF0ZSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0xTQl9SRUcpOworCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTVNCX1JFRyk7CisJfQorCisJZGF0YVsxXSA9IHMtPnN0YXRlOworCisJcmV0dXJuIGluc24tPm47Cit9CisKIHN0YXRpYyB2b2lkIHBjbDgxMl9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBwY2w4MTJfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuOwogCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NVVgpOwotCW91dGIoMCArIGRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24sIGRldi0+aW9iYXNlICsgUENMODEyX0dBSU4pOwotCWRldnByaXYtPm9sZF9jaGFuX3JlZyA9IC0xOwkvKiAgaW52YWxpZGF0ZSBjaGFpbi9nYWluIG1lbW9yeSAqLwotCWRldnByaXYtPm9sZF9nYWluX3JlZyA9IC0xOworCS8qIGRpc2FibGUgYW5hbG9nIGlucHV0IHRyaWdnZXIgKi8KKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKwlwY2w4MTJfYWlfY2xlYXJfZW9jKGRldik7CiAKKwkvKiBzdG9wIHBhY2VyICovCisJaWYgKGJvYXJkLT5JUlFiaXRzKQorCQlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisKKwkvKgorCSAqIEludmFsaWRhdGUgbGFzdF9haV9jaGFuc3BlYyB0aGVuIHNldCBhbmFsb2cgaW5wdXQgdG8KKwkgKiBrbm93biBjaGFubmVsL3JhbmdlLgorCSAqLworCWRldnByaXYtPmxhc3RfYWlfY2hhbnNwZWMgPSBDUl9QQUNLKDE2LCAwLCAwKTsKKwlwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBDUl9QQUNLKDAsIDAsIDApLCAwKTsKKworCS8qIHNldCBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzIHRvIDBWICovCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IGJvYXJkLT5uX2FvY2hhbjsgY2hhbisrKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTFNCX1JFRyhjaGFuKSk7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTVNCX1JFRyhjaGFuKSk7CisJfQorCisJLyogc2V0IGFsbCBkaWdpdGFsIG91dHB1dHMgbG93ICovCisJaWYgKGJvYXJkLT5oYXNfZGlvKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTVNCX1JFRyk7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTFNCX1JFRyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwY2w4MTJfc2V0X2FpX3JhbmdlX3RhYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWNvbnN0IHN0cnVjdCBwY2w4MTJfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCisJLyogZGVmYXVsdCB0byB0aGUgcmFuZ2UgdGFibGUgZnJvbSB0aGUgYm9hcmRpbmZvICovCisJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+cmFuZ2VsaXN0X2FpOworCisJLyogbm93IGNoZWNrIHRoZSB1c2VyIGNvbmZpZyBvcHRpb24gYmFzZWQgb24gdGhlIGJvYXJkdHlwZSAqLwogCXN3aXRjaCAoYm9hcmQtPmJvYXJkX3R5cGUpIHsKIAljYXNlIGJvYXJkUENMODEyUEc6CisJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxKQorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODEycGcyX2FpOworCQlicmVhazsKIAljYXNlIGJvYXJkUENMODEyOgotCWNhc2UgYm9hcmRBQ0w4MTEyOgotCWNhc2UgYm9hcmRBQ0w4MjE2OgotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RBMl9MTyk7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfREEyX0hJKTsKLQljYXNlIGJvYXJkQTgyMToKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9EQTFfTE8pOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RBMV9ISSk7Ci0JCXN0YXJ0X3BhY2VyKGRldiwgLTEsIDAsIDApOwkvKiAgc3RvcCA4MjU0ICovCi0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fSEkpOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0xPKTsKLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DTFJJTlQpOworCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzRdKSB7CisJCWNhc2UgMDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyNTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMl81OworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIxXzI1OworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIwXzYyNTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTgxMl9iaXBvbGFyMF8zMTI1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIGJvYXJkUENMODEzQjoKLQljYXNlIGJvYXJkUENMODEzOgorCQlpZiAoaXQtPm9wdGlvbnNbMV0gPT0gMSkKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxM2IyX2FpOworCQlicmVhazsKIAljYXNlIGJvYXJkSVNPODEzOgorCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzFdKSB7CisJCWNhc2UgMDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xX2FpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xXzJfYWk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfaXNvODEzXzJfYWk7CisJCQlkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMl8yX2FpOworCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xX2FpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBib2FyZEFDTDgxMTM6Ci0JCXVkZWxheSg1KTsKKwkJc3dpdGNoIChpdC0+b3B0aW9uc1sxXSkgeworCQljYXNlIDA6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfYWk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18xXzJfYWk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yX2FpOworCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yXzJfYWk7CisJCQlkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18xX2FpOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJfQotCXVkZWxheSg1KTsKIH0KIAogc3RhdGljIGludCBwY2w4MTJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKIAljb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdjsKLQlpbnQgcmV0LCBzdWJkZXY7Ci0JdW5zaWduZWQgaW50IGRtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBuX3N1YmRldmljZXM7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgYm9hcmQtPmlvX3JhbmdlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWludCBzdWJkZXY7CisJaW50IHJldDsKKwlpbnQgaTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmICgoMSA8PCBpdC0+b3B0aW9uc1sxXSkgJiBib2FyZC0+SVJRYml0cykgewotCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgaW50ZXJydXB0X3BjbDgxMiwgMCwKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIHBjbDgxMl9pbnRlcnJ1cHQsIDAsCiAJCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CiAJCWlmIChyZXQgPT0gMCkKIAkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CiAJfQogCi0JZG1hID0gMDsKLQlkZXZwcml2LT5kbWEgPSBkbWE7Ci0JaWYgKCFkZXYtPmlycSkKLQkJZ290byBub19kbWE7CS8qIGlmIHdlIGhhdmVuJ3QgSVJRLCB3ZSBjYW4ndCB1c2UgRE1BICovCi0JaWYgKGJvYXJkLT5ETUFiaXRzICE9IDApIHsJLyogYm9hcmQgc3VwcG9ydCBETUEgKi8KLQkJZG1hID0gaXQtPm9wdGlvbnNbMl07Ci0JCWlmICgoKDEgPDwgZG1hKSAmIGJvYXJkLT5ETUFiaXRzKSA9PSAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJETUEgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIEZBSUwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwkvKiBCYWQgRE1BICovCi0JCX0KLQkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCBkZXYtPmJvYXJkX25hbWUpOworCS8qIHdlIG5lZWQgYW4gSVJRIHRvIGRvIERNQSBvbiBjaGFubmVsIDMgb3IgMSAqLworCWlmIChkZXYtPmlycSAmJiBib2FyZC0+aGFzX2RtYSAmJgorCSAgICAoaXQtPm9wdGlvbnNbMl0gPT0gMyB8fCBpdC0+b3B0aW9uc1syXSA9PSAxKSkgeworCQlyZXQgPSByZXF1ZXN0X2RtYShpdC0+b3B0aW9uc1syXSwgZGV2LT5ib2FyZF9uYW1lKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSAldSwgRkFJTCFcbiIsIGRtYSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwkvKiBETUEgaXNuJ3QgZnJlZSAqLwotCQl9Ci0JCWRldnByaXYtPmRtYSA9IGRtYTsKLQkJcGFnZXMgPSAxOwkvKiB3ZSB3YW50IDhLQiAqLwotCQlkZXZwcml2LT5kbWFidWZbMF0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlswXSkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKLQkJCS8qCi0JCQkgKiBtYXliZSBleHBlcmltZW50IHdpdGggdHJ5X3RvX2ZyZWVfcGFnZXMoKQotCQkJICogd2lsbCBoZWxwIC4uLi4KLQkJCSAqLwotCQkJcmV0dXJuIC1FQlVTWTsJLyogbm8gYnVmZmVyIDotKCAqLwotCQl9Ci0JCWRldnByaXYtPmRtYXBhZ2VzWzBdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzBdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMF0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMF0gPSBQQUdFX1NJWkUgKiAoMSA8PCBwYWdlcyk7Ci0JCWRldnByaXYtPmRtYWJ1ZlsxXSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlcyk7Ci0JCWlmICghZGV2cHJpdi0+ZG1hYnVmWzFdKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciwgRkFJTCFcbiIpOworCQkJCSJ1bmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCAlZFxuIiwKKwkJCQlpdC0+b3B0aW9uc1syXSk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9Ci0JCWRldnByaXYtPmRtYXBhZ2VzWzFdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzFdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMV0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMV0gPSBQQUdFX1NJWkUgKiAoMSA8PCBwYWdlcyk7Ci0JfQotbm9fZG1hOgorCQlkZXZwcml2LT5kbWEgPSBpdC0+b3B0aW9uc1syXTsKIAotCW5fc3ViZGV2aWNlcyA9IDA7Ci0JaWYgKGJvYXJkLT5uX2FpY2hhbiA+IDApCi0JCW5fc3ViZGV2aWNlcysrOworCQlkZXZwcml2LT5kbWFwYWdlcyA9IDE7CS8qIHdlIHdhbnQgOEtCICovCisJCWRldnByaXYtPmh3ZG1hc2l6ZSA9ICgxIDw8IGRldnByaXYtPmRtYXBhZ2VzKSAqIFBBR0VfU0laRTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGRtYWJ1ZjsKKworCQkJZG1hYnVmID0gIF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBkZXZwcml2LT5kbWFwYWdlcyk7CisJCQlpZiAoIWRtYWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGV2cHJpdi0+ZG1hYnVmW2ldID0gZG1hYnVmOworCQkJZGV2cHJpdi0+aHdkbWFwdHJbaV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRtYWJ1Zik7CisJCX0KKwl9CisKKwkvKiBkaWZmZXJlbnRpYWwgYW5hbG9nIGlucHV0cz8gKi8KKwlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7CisJY2FzZSBib2FyZEE4MjE6CisJCWlmIChpdC0+b3B0aW9uc1syXSA9PSAxKQorCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOworCQlicmVhazsKKwljYXNlIGJvYXJkQUNMODExMjoKKwljYXNlIGJvYXJkQUNMODIxNjoKKwkJaWYgKGl0LT5vcHRpb25zWzRdID09IDEpCisJCQlkZXZwcml2LT51c2VfZGlmZiA9IDE7CisJCWJyZWFrOworCX0KKworCW5fc3ViZGV2aWNlcyA9IDE7CQkvKiBhbGwgYm9hcmR0eXBlcyBoYXZlIGFuYWxvZyBpbnB1dHMgKi8KIAlpZiAoYm9hcmQtPm5fYW9jaGFuID4gMCkKIAkJbl9zdWJkZXZpY2VzKys7Ci0JaWYgKGJvYXJkLT5uX2RpY2hhbiA+IDApCi0JCW5fc3ViZGV2aWNlcysrOwotCWlmIChib2FyZC0+bl9kb2NoYW4gPiAwKQotCQluX3N1YmRldmljZXMrKzsKKwlpZiAoYm9hcmQtPmhhc19kaW8pCisJCW5fc3ViZGV2aWNlcyArPSAyOwogCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCBuX3N1YmRldmljZXMpOwogCWlmIChyZXQpCkBAIC0xMTg0LDE0NiArMTMwMyw0NyBAQAogCiAJc3ViZGV2ID0gMDsKIAotCS8qIGFuYWxvZyBpbnB1dCAqLwotCWlmIChib2FyZC0+bl9haWNoYW4gPiAwKSB7Ci0JCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOwotCQlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7Ci0JCWNhc2UgYm9hcmRBODIxOgotCQkJaWYgKGl0LT5vcHRpb25zWzJdID09IDEpIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fZGlmZjsKLQkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7Ci0JCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9HUk9VTkQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBib2FyZEFDTDgxMTI6Ci0JCWNhc2UgYm9hcmRBQ0w4MjE2OgotCQkJaWYgKGl0LT5vcHRpb25zWzRdID09IDEpIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fZGlmZjsKLQkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7Ci0JCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9HUk9VTkQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FpY2hhbjsKLQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfR1JPVU5EOwotCQkJYnJlYWs7Ci0JCX0KLQkJcy0+bWF4ZGF0YSA9IGJvYXJkLT5haV9tYXhkYXRhOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5yYW5nZWxpc3RfYWk7Ci0JCWlmIChib2FyZC0+Ym9hcmRfdHlwZSA9PSBib2FyZEFDTDgyMTYpCi0JCQlzLT5pbnNuX3JlYWQgPSBhY2w4MjE2X2FpX2luc25fcmVhZDsKLQkJZWxzZQotCQkJcy0+aW5zbl9yZWFkID0gcGNsODEyX2FpX2luc25fcmVhZDsKLQotCQlkZXZwcml2LT51c2VfTVBDID0gYm9hcmQtPmhhdmVNUEM1MDg7Ci0JCWlmIChkZXYtPmlycSkgewotCQkJZGV2LT5yZWFkX3N1YmRldiA9IHM7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOwotCQkJcy0+bGVuX2NoYW5saXN0ID0gTUFYX0NIQU5MSVNUX0xFTjsKLQkJCXMtPmRvX2NtZHRlc3QgPSBwY2w4MTJfYWlfY21kdGVzdDsKLQkJCXMtPmRvX2NtZCA9IHBjbDgxMl9haV9jbWQ7Ci0JCQlzLT5wb2xsID0gcGNsODEyX2FpX3BvbGw7Ci0JCQlzLT5jYW5jZWwgPSBwY2w4MTJfYWlfY2FuY2VsOwotCQl9Ci0JCXN3aXRjaCAoYm9hcmQtPmJvYXJkX3R5cGUpIHsKLQkJY2FzZSBib2FyZFBDTDgxMlBHOgotCQkJaWYgKGl0LT5vcHRpb25zWzRdID09IDEpCi0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODEycGcyX2FpOwotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRQQ0w4MTI6Ci0JCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzRdKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIyXzU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U4MTJfYmlwb2xhcjFfMjU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U4MTJfYmlwb2xhcjBfNjI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSA1OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIwXzMxMjU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRQQ0w4MTNCOgotCQkJaWYgKGl0LT5vcHRpb25zWzFdID09IDEpCi0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODEzYjJfYWk7Ci0JCQlicmVhazsKLQkJY2FzZSBib2FyZElTTzgxMzoKLQkJCXN3aXRjaCAoaXQtPm9wdGlvbnNbMV0pIHsKLQkJCWNhc2UgMDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV8yX2FpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18yX2FpOwotCQkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18yXzJfYWk7Ci0JCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xX2FpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRBQ0w4MTEzOgotCQkJc3dpdGNoIChpdC0+b3B0aW9uc1sxXSkgewotCQkJY2FzZSAwOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMV9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfMl9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzJfYWk7Ci0JCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yXzJfYWk7Ci0JCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMV9haTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXN1YmRldisrOworCS8qIEFuYWxvZyBJbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCWlmIChkZXZwcml2LT51c2VfZGlmZikgeworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0RJRkY7CisJCXMtPm5fY2hhbgk9IGJvYXJkLT5uX2FpY2hhbiAvIDI7CisJfSBlbHNlIHsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9HUk9VTkQ7CisJCXMtPm5fY2hhbgk9IGJvYXJkLT5uX2FpY2hhbjsKIAl9CisJcy0+bWF4ZGF0YQk9IGJvYXJkLT5oYXNfMTZiaXRfYWkgPyAweGZmZmYgOiAweDBmZmY7CisKKwlwY2w4MTJfc2V0X2FpX3JhbmdlX3RhYmxlKGRldiwgcywgaXQpOworCisJcy0+aW5zbl9yZWFkCT0gcGNsODEyX2FpX2luc25fcmVhZDsKKworCWlmIChkZXYtPmlycSkgeworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9DTURfUkVBRDsKKwkJcy0+bGVuX2NoYW5saXN0CT0gTUFYX0NIQU5MSVNUX0xFTjsKKwkJcy0+ZG9fY21kdGVzdAk9IHBjbDgxMl9haV9jbWR0ZXN0OworCQlzLT5kb19jbWQJPSBwY2w4MTJfYWlfY21kOworCQlzLT5wb2xsCQk9IHBjbDgxMl9haV9wb2xsOworCQlzLT5jYW5jZWwJPSBwY2w4MTJfYWlfY2FuY2VsOworCX0KKworCWRldnByaXYtPnVzZV9tcGM1MDggPSBib2FyZC0+aGFzX21wYzUwOF9tdXg7CisKKwlzdWJkZXYrKzsKIAogCS8qIGFuYWxvZyBvdXRwdXQgKi8KIAlpZiAoYm9hcmQtPm5fYW9jaGFuID4gMCkgewogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FvY2hhbjsKLQkJcy0+bWF4ZGF0YSA9IDB4ZmZmOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5yYW5nZWxpc3RfYW87Ci0JCXMtPmluc25fcmVhZCA9IHBjbDgxMl9hb19pbnNuX3JlYWQ7Ci0JCXMtPmluc25fd3JpdGUgPSBwY2w4MTJfYW9faW5zbl93cml0ZTsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORDsKKwkJcy0+bl9jaGFuCT0gYm9hcmQtPm5fYW9jaGFuOworCQlzLT5tYXhkYXRhCT0gMHhmZmY7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3VuaXBvbGFyNTsKKwkJcy0+aW5zbl9yZWFkCT0gcGNsODEyX2FvX2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZQk9IHBjbDgxMl9hb19pbnNuX3dyaXRlOwogCQlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7CiAJCWNhc2UgYm9hcmRBODIxOgogCQkJaWYgKGl0LT5vcHRpb25zWzNdID09IDEpCkBAIC0xMzQyLDMzICsxMzYyLDMwIEBACiAJCXN1YmRldisrOwogCX0KIAotCS8qIGRpZ2l0YWwgaW5wdXQgKi8KLQlpZiAoYm9hcmQtPm5fZGljaGFuID4gMCkgeworCWlmIChib2FyZC0+aGFzX2RpbykgeworCQkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLwogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKLQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fZGljaGFuOwotCQlzLT5tYXhkYXRhID0gMTsKLQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQkJcy0+aW5zbl9iaXRzID0gcGNsODEyX2RpX2luc25fYml0czsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ESTsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCQlzLT5uX2NoYW4JPSAxNjsKKwkJcy0+bWF4ZGF0YQk9IDE7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmluc25fYml0cwk9IHBjbDgxMl9kaV9pbnNuX2JpdHM7CiAJCXN1YmRldisrOwotCX0KIAotCS8qIGRpZ2l0YWwgb3V0cHV0ICovCi0JaWYgKGJvYXJkLT5uX2RvY2hhbiA+IDApIHsKKwkJLyogRGlnaXRhbCBPdXRwdXQgc3ViZGV2aWNlICovCiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kb2NoYW47Ci0JCXMtPm1heGRhdGEgPSAxOwotCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pbnNuX2JpdHMgPSBwY2w4MTJfZG9faW5zbl9iaXRzOworCQlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RPOworCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJCXMtPm5fY2hhbgk9IDE2OworCQlzLT5tYXhkYXRhCT0gMTsKKwkJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW5zbl9iaXRzCT0gcGNsODEyX2RvX2luc25fYml0czsKIAkJc3ViZGV2Kys7CiAJfQogCiAJc3dpdGNoIChib2FyZC0+Ym9hcmRfdHlwZSkgewogCWNhc2UgYm9hcmRBQ0w4MjE2OgotCQlkZXZwcml2LT5haV9pczE2YiA9IDE7CiAJY2FzZSBib2FyZFBDTDgxMlBHOgogCWNhc2UgYm9hcmRQQ0w4MTI6CiAJY2FzZSBib2FyZEFDTDgxMTI6CkBAIC0xMzkwLDggKzE0MDcsNiBAQAogCQlicmVhazsKIAl9CiAKLQlkZXZwcml2LT52YWxpZCA9IDE7Ci0KIAlwY2w4MTJfcmVzZXQoZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTQwMyw3MiArMTQxOCwxNSBAQAogCiAJaWYgKGRldnByaXYpIHsKIAkJaWYgKGRldnByaXYtPmRtYWJ1ZlswXSkKLQkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzBdLCBkZXZwcml2LT5kbWFwYWdlc1swXSk7CisJCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlswXSwgZGV2cHJpdi0+ZG1hcGFnZXMpOwogCQlpZiAoZGV2cHJpdi0+ZG1hYnVmWzFdKQotCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMV0sIGRldnByaXYtPmRtYXBhZ2VzWzFdKTsKKwkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzFdLCBkZXZwcml2LT5kbWFwYWdlcyk7CiAJCWlmIChkZXZwcml2LT5kbWEpCiAJCQlmcmVlX2RtYShkZXZwcml2LT5kbWEpOwogCX0KIAljb21lZGlfbGVnYWN5X2RldGFjaChkZXYpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxMl9ib2FyZCBib2FyZHR5cGVzW10gPSB7Ci0JeyJwY2w4MTIiLCBib2FyZFBDTDgxMiwgMTYsIDAsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAzMzAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2JpcG9sYXIxMCwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJwY2w4MTJwZyIsIGJvYXJkUENMODEyUEcsIDE2LCAwLCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgMzMwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9wY2w4MTJwZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhY2w4MTEycGciLCBib2FyZFBDTDgxMlBHLCAxNiwgMCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEycGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYWNsODExMmRnIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfYWNsODExMmRnX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAxfSwKLQl7ImFjbDgxMTJoZyIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJoZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMX0sCi0JeyJhODIxcGdsIiwgYm9hcmRBODIxLCAxNiwgOCwgMSwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEzYl9haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHgwMDBjLCAweDAwLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIxcGdsbmRhIiwgYm9hcmRBODIxLCAxNiwgOCwgMCwgMCwgMCwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX3BjbDgxM2JfYWksIE5VTEwsCi0JIDB4MDAwYywgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyMXBnaCIsIGJvYXJkQTgyMSwgMTYsIDgsIDEsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2E4MjFwZ2hfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4MDAwYywgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyMnBnbCIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJkZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIycGdoIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfYWNsODExMmhnX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImE4MjNwZ2wiLCBib2FyZEFDTDgxMTIsIDE2LCA4LCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgODAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJkZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIzcGdoIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDgwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9hY2w4MTEyaGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsicGNsODEzIiwgYm9hcmRQQ0w4MTMsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9wY2w4MTNiX2FpLCBOVUxMLAotCSAweDAwMDAsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7InBjbDgxM2IiLCBib2FyZFBDTDgxM0IsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9wY2w4MTNiX2FpLCBOVUxMLAotCSAweDAwMDAsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImFjbDgxMTMiLCBib2FyZEFDTDgxMTMsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9hY2w4MTEzXzFfYWksIE5VTEwsCi0JIDB4MDAwMCwgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiaXNvODEzIiwgYm9hcmRJU084MTMsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9pc284MTNfMV9haSwgTlVMTCwKLQkgMHgwMDAwLCAweDAwLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhY2w4MjE2IiwgYm9hcmRBQ0w4MjE2LCAxNiwgOCwgMiwgMTYsIDE2LCAweGZmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEzYjJfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDF9LAotCXsiYTgyNnBnIiwgYm9hcmRBQ0w4MjE2LCAxNiwgOCwgMiwgMTYsIDE2LCAweGZmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEzYjJfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIHBjbDgxMl9kcml2ZXIgPSB7CiAJLmRyaXZlcl9uYW1lCT0gInBjbDgxMiIsCiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwppbmRleCBlOWQ0NzA0Li42ZjI3NmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCkBAIC00NCw0MCArNDQsMzggQEAKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjUzLmgiCiAKLS8qIGJvYXJkcyBjb25zdGFudHMgKi8KLS8qIElPIHNwYWNlIGxlbiAqLwotI2RlZmluZSBQQ0x4MXhfUkFOR0UgMTYKLQotLyogSU5URUwgODI1NCBjb3VudGVycyAqLwotI2RlZmluZSBQQ0w4MTZfQ1RSMCA0Ci0jZGVmaW5lIFBDTDgxNl9DVFIxIDUKLSNkZWZpbmUgUENMODE2X0NUUjIgNgotLyogUjogY291bnRlciByZWFkLWJhY2sgcmVnaXN0ZXIgVzogY291bnRlciBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxNl9DVFJDVEwgNwotCi0vKiBSOiBBL0QgaGlnaCBieXRlIFc6IEEvRCByYW5nZSBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxNl9SQU5HRSA5Ci0vKiBXOiBjbGVhciBJTlQgcmVxdWVzdCAqLwotI2RlZmluZSBQQ0w4MTZfQ0xSSU5UIDEwCi0vKiBSOiBuZXh0IG11eCBzY2FuIGNoYW5uZWwgVzogbXV4IHNjYW4gY2hhbm5lbCAmIHJhbmdlIGNvbnRyb2wgcG9pbnRlciAqLwotI2RlZmluZSBQQ0w4MTZfTVVYIDExCi0vKiBSL1c6IG9wZXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBDTDgxNl9DT05UUk9MIDEyCi0KLS8qIFI6IHJldHVybiBzdGF0dXMgYnl0ZSAgVzogc2V0IERNQS9JUlEgKi8KLSNkZWZpbmUgUENMODE2X1NUQVRVUyAxMwotI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0RSRFlfTUFTSyAweDgwCi0KLS8qIFI6IGxvdyBieXRlIG9mIEEvRCBXOiBzb2Z0IEEvRCB0cmlnZ2VyICovCi0jZGVmaW5lIFBDTDgxNl9BRF9MTyA4Ci0vKiBSOiBoaWdoIGJ5dGUgb2YgQS9EIFc6IEEvRCByYW5nZSBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxNl9BRF9ISSA5Ci0KLS8qIHR5cGUgb2YgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSNkZWZpbmUgSU5UX1RZUEVfQUkxX0lOVCAxCi0jZGVmaW5lIElOVF9UWVBFX0FJMV9ETUEgMgotI2RlZmluZSBJTlRfVFlQRV9BSTNfSU5UIDQKLSNkZWZpbmUgSU5UX1RZUEVfQUkzX0RNQSA1CisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIFBDTDgxNl9ET19ESV9MU0JfUkVHCQkJMHgwMAorI2RlZmluZSBQQ0w4MTZfRE9fRElfTVNCX1JFRwkJCTB4MDEKKyNkZWZpbmUgUENMODE2X1RJTUVSX0JBU0UJCQkweDA0CisjZGVmaW5lIFBDTDgxNl9BSV9MU0JfUkVHCQkJMHgwOAorI2RlZmluZSBQQ0w4MTZfQUlfTVNCX1JFRwkJCTB4MDkKKyNkZWZpbmUgUENMODE2X1JBTkdFX1JFRwkJCTB4MDkKKyNkZWZpbmUgUENMODE2X0NMUklOVF9SRUcJCQkweDBhCisjZGVmaW5lIFBDTDgxNl9NVVhfUkVHCQkJCTB4MGIKKyNkZWZpbmUgUENMODE2X01VWF9TQ0FOKF9maXJzdCwgX2xhc3QpCQkoKChfbGFzdCkgPDwgNCkgfCAoX2ZpcnN0KSkKKyNkZWZpbmUgUENMODE2X0NUUkxfUkVHCQkJCTB4MGMKKyNkZWZpbmUgUENMODE2X0NUUkxfRElTQUJMRV9UUklHCQkoMCA8PCAwKQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9TT0ZUX1RSSUcJCQkoMSA8PCAwKQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9QQUNFUl9UUklHCQkJKDEgPDwgMSkKKyNkZWZpbmUgUENMODE2X0NUUkxfRVhUX1RSSUcJCQkoMSA8PCAyKQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9QT0UJCQkJKDEgPDwgMykKKyNkZWZpbmUgUENMODE2X0NUUkxfRE1BRU4JCQkoMSA8PCA0KQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9JTlRFTgkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxNl9DVFJMX0RNQVNSQ19TTE9UMAkJKDAgPDwgNikKKyNkZWZpbmUgUENMODE2X0NUUkxfRE1BU1JDX1NMT1QxCQkoMSA8PCA2KQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9ETUFTUkNfU0xPVDIJCSgyIDw8IDYpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfUkVHCQkJMHgwZAorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX05FWFRfQ0hBTl9NQVNLCQkoMHhmIDw8IDApCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX01BU0sJCSgzIDw8IDQpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX1NMT1QwCQkoMCA8PCA0KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0lOVFNSQ19TTE9UMQkJKDEgPDwgNCkKKyNkZWZpbmUgUENMODE2X1NUQVRVU19JTlRTUkNfU0xPVDIJCSgyIDw8IDQpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX0RNQQkJKDMgPDwgNCkKKyNkZWZpbmUgUENMODE2X1NUQVRVU19JTlRBQ1QJCQkoMSA8PCA2KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0RSRFkJCQkoMSA8PCA3KQogCiAjZGVmaW5lIE1BR0lDX0RNQV9XT1JEIDB4NWE1YQogCkBAIC05NSwzMTQgKzkzLDI4NCBAQAogfTsKIAogc3RydWN0IHBjbDgxNl9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYWlfbWF4ZGF0YTsKKwlpbnQgYW9fbWF4ZGF0YTsKKwlpbnQgYWlfY2hhbmxpc3Q7Cit9OwogCi0JY29uc3QgY2hhciAqbmFtZTsJLyogIGJvYXJkIG5hbWUgKi8KLQlpbnQgbl9yYW5nZXM7CQkvKiAgbGVuIG9mIHJhbmdlIGxpc3QgKi8KLQlpbnQgbl9haWNoYW47CQkvKiAgbnVtIG9mIEEvRCBjaGFucyBpbiBkaWZlcmVuY2lhbCBtb2RlICovCi0JdW5zaWduZWQgaW50IGFpX25zX21pbjsJLyogIG1pbmltYWwgYWxsb3dlZCBkZWxheSBiZXR3ZWVuIHNhbXBsZXMgKGluIG5zKSAqLwotCWludCBuX2FvY2hhbjsJCS8qICBudW0gb2YgRC9BIGNoYW5zICovCi0JaW50IG5fZGljaGFuOwkJLyogIG51bSBvZiBESSBjaGFucyAqLwotCWludCBuX2RvY2hhbjsJCS8qICBudW0gb2YgRE8gY2hhbnMgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdHlwZTsJLyogIGRlZmF1bHQgQS9EIHJhbmdlbGlzdCAqLwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBEL0EgcmFuZ2VsaXN0ICovCi0JdW5zaWduZWQgaW50IGlvX3JhbmdlOwkvKiAgbGVuIG9mIElPIHNwYWNlICovCi0JdW5zaWduZWQgaW50IElSUWJpdHM7CS8qICBhbGxvd2VkIGludGVycnVwdHMgKi8KLQl1bnNpZ25lZCBpbnQgRE1BYml0czsJLyogIGFsbG93ZWQgRE1BIGNoYW5zICovCi0JaW50IGFpX21heGRhdGE7CQkvKiAgbWF4ZGF0YSBmb3IgQS9EICovCi0JaW50IGFvX21heGRhdGE7CQkvKiAgbWF4ZGF0YSBmb3IgRC9BICovCi0JaW50IGFpX2NoYW5saXN0OwkvKiAgYWxsb3dlZCBsZW4gb2YgY2hhbm5lbCBsaXN0IEEvRCAqLwotCWludCBhb19jaGFubGlzdDsJLyogIGFsbG93ZWQgbGVuIG9mIGNoYW5uZWwgbGlzdCBEL0EgKi8KLQlpbnQgaTgyNTRfb3NjX2Jhc2U7CS8qICAxL2ZyZXF1ZW5jeSBvZiBvbiBib2FyZCBvc2NpbGF0b3IgaW4gbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODE2X2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJwY2w4MTYiLAorCQkuYWlfbWF4ZGF0YQk9IDB4ZmZmZiwKKwkJLmFvX21heGRhdGEJPSAweGZmZmYsCisJCS5haV9jaGFubGlzdAk9IDEwMjQsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE0YiIsCisJCS5haV9tYXhkYXRhCT0gMHgzZmZmLAorCQkuYW9fbWF4ZGF0YQk9IDB4M2ZmZiwKKwkJLmFpX2NoYW5saXN0CT0gMTAyNCwKKwl9LAogfTsKIAogc3RydWN0IHBjbDgxNl9wcml2YXRlIHsKLQogCXVuc2lnbmVkIGludCBkbWE7CS8qICB1c2VkIERNQSwgMD1kb24ndCB1c2UgRE1BICovCisJdW5zaWduZWQgaW50IGRtYXBhZ2VzOworCXVuc2lnbmVkIGludCBod2RtYXNpemU7CiAJdW5zaWduZWQgbG9uZyBkbWFidWZbMl07CS8qICBwb2ludGVycyB0byBiZWdpbiBvZiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBkbWFwYWdlc1syXTsJLyogIGxlbiBvZiBETUEgYnVmZmVycyBpbiBQQUdFX1NJWkVzICovCiAJdW5zaWduZWQgaW50IGh3ZG1hcHRyWzJdOwkvKiAgaGFyZHdhcmUgYWRkcmVzcyBvZiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBod2RtYXNpemVbMl07CS8qICBsZW4gb2YgRE1BIGJ1ZmZlcnMgaW4gQnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQgZG1hc2FtcGxzaXplOwkvKiAgc2l6ZSBpbiBzYW1wbGVzIGh3ZG1hc2l6ZVswXS8yICovCiAJaW50IG5leHRfZG1hX2J1ZjsJLyogIHdoaWNoIERNQSBidWZmZXIgd2lsbCBiZSB1c2VkIG5leHQgcm91bmQgKi8KIAlsb25nIGRtYV9ydW5zX3RvX2VuZDsJLyogIGhvdyBtYW55IHdlIG11c3QgcGVybW9ybSBETUEgdHJhbnNmZXIgdG8gZW5kIG9mIHJlY29yZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF9kbWFfcnVuOwkvKiAgaG93IG1hbnkgYnl0ZXMgd2UgbXVzdCB0cmFuc2ZlciBvbiBsYXN0IERNQSBwYWdlICovCi0KLQl1bnNpZ25lZCBpbnQgYWlfc2NhbnM7CS8qICBsZW4gb2Ygc2Nhbmxpc3QgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX25ldmVyZW5kaW5nOwkvKiAgaWY9MSwgdGhlbiB3ZSBkbyBuZXZlcmVuZGluZyByZWNvcmQgKHlvdSBtdXN0IHVzZSBjYW5jZWwoKSkgKi8KLQlpbnQgaXJxX2Jsb2NrZWQ7CS8qICAxPUlSUSBub3cgdXNlcyBhbnkgc3ViZGV2ICovCi0JaW50IGlycV93YXNfbm93X2Nsb3NlZDsJLyogIHdoZW4gSVJRIGZpbmlzaCwgdGhlcmUncyBzdG9yZWQgaW50ODE2X21vZGUgZm9yIGxhc3QgaW50ZXJydXB0ICovCi0JaW50IGludDgxNl9tb2RlOwkvKiAgd2hvIG5vdyB1c2VzIElSUSAtIDE9QUkxIGludCwgMj1BSTEgZG1hLCAzPUFJMyBpbnQsIDRBSTMgZG1hICovCi0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKmxhc3RfaW50X3N1YjsJLyogIHB0ciB0byBzdWJkZXZpY2Ugd2hpY2ggbm93IGZpbmlzaCAqLwogCWludCBhaV9hY3Rfc2NhbjsJLyogIGhvdyBtYW55IHNjYW5zIHdlIGZpbmlzaGVkICovCi0JdW5zaWduZWQgaW50IGFpX2FjdF9jaGFubGlzdFsxNl07CS8qICBNVVggc2V0dGluZyBmb3IgYWN0dWFsIEFJIG9wZXJhdGlvbnMgKi8KLQl1bnNpZ25lZCBpbnQgYWlfYWN0X2NoYW5saXN0X2xlbjsJLyogIGhvdyBsb25nIGlzIGFjdHVhbCBNVVggbGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9hY3RfY2hhbmxpc3RfcG9zOwkvKiAgYWN0dWFsIHBvc2l0aW9uIGluIE1VWCBsaXN0ICovCi0JdW5zaWduZWQgaW50IGFpX25fY2hhbjsJCS8qICBob3cgbWFueSBjaGFubmVscyBwZXIgc2NhbiAqLwogCXVuc2lnbmVkIGludCBhaV9wb2xsX3B0cjsJLyogIGhvdyBtYW55IHNhbXBlcyB0cmFuc2ZlciBwb2xsICovCisJdW5zaWduZWQgaW50IGRpdmlzb3IxOworCXVuc2lnbmVkIGludCBkaXZpc29yMjsKKwl1bnNpZ25lZCBpbnQgYWlfY21kX3J1bm5pbmc6MTsKKwl1bnNpZ25lZCBpbnQgYWlfY21kX2NhbmNlbGVkOjE7CiB9OwogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IGNoYW5sZW4pOwotc3RhdGljIHZvaWQgc2V0dXBfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IHNlZ2xlbik7Ci1zdGF0aWMgaW50IHBjbDgxNl9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci1zdGF0aWMgdm9pZCBzdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgbW9kZSwKLQkJCXVuc2lnbmVkIGludCBkaXZpc29yMSwgdW5zaWduZWQgaW50IGRpdmlzb3IyKTsKIAotc3RhdGljIGludCBwY2w4MTZfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7Ci1zdGF0aWMgaW50IHBjbDgxNl9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBBTkFMT0cgSU5QVVQgTU9ERTAsIDgxNiBjYXJkcywgc2xvdyB2ZXJzaW9uCi0qLwotc3RhdGljIGludCBwY2w4MTZfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JaW50IG47Ci0JaW50IHRpbWVvdXQ7Ci0KLQkvKiAgc29mdHdhcmUgdHJpZ2dlciwgRE1BIGFuZCBJTlQgb2ZmICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsKLQkvKiAgY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsKLQotCS8qICBTZXQgdGhlIGlucHV0IGNoYW5uZWwgKi8KLQlvdXRiKENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpICYgMHhmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCS8qIHNlbGVjdCBnYWluICovCi0Jb3V0YihDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyksIGRldi0+aW9iYXNlICsgUENMODE2X1JBTkdFKTsKLQotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCi0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVMpICYKLQkJCSAgICAgIFBDTDgxNl9TVEFUVVNfRFJEWV9NQVNLKSkgewotCQkJCS8qICByZXR1cm4gcmVhZCB2YWx1ZSAqLwotCQkJCWRhdGFbbl0gPQotCQkJCSAgICAoKGluYihkZXYtPmlvYmFzZSArCi0JCQkJCSAgUENMODE2X0FEX0hJKSA8PCA4KSB8Ci0JCQkJICAgICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKSkpOwotCQkJCS8qIGNsZWFyIElOVCAoY29udmVyc2lvbiBlbmQpIGZsYWcgKi8KLQkJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJLyogIFJldHVybiB0aW1lb3V0IGVycm9yICovCi0JCWlmICghdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXRcbiIpOwotCQkJZGF0YVswXSA9IDA7Ci0JCQkvKiBjbGVhciBJTlQgKGNvbnZlcnNpb24gZW5kKSBmbGFnICovCi0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JfQotCXJldHVybiBuOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgaW50ZXJydXB0IG1vZGUgMSAmIDMsIDgxOCBjYXJkcwotICAgb25lIHNhbXBsZSBwZXIgaW50ZXJydXB0IHZlcnNpb24KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxNl9haV9tb2RlMTNfaW50KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKLQl1bnNpZ25lZCBjaGFyIGxvdywgaGk7Ci0JaW50IHRpbWVvdXQgPSA1MDsJLyogd2FpdCBtYXggNTB1cyAqLwotCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlpZiAoIShpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTKSAmCi0JCSAgICAgIFBDTDgxNl9TVEFUVVNfRFJEWV9NQVNLKSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMSk7Ci0JfQotCWlmICghdGltZW91dCkgewkJLyogIHRpbWVvdXQsIGJhaWwgZXJyb3IgKi8KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgSVJRIHdpdGhvdXQgRFJEWSEiKTsKLQkJcGNsODE2X2FpX2NhbmNlbChkZXYsIHMpOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQl9Ci0KLQkvKiAgZ2V0IHRoZSBzYW1wbGUgKi8KLQlsb3cgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQURfTE8pOwotCWhpID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0hJKTsKLQotCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCAoaGkgPDwgOCkgfCBsb3cpOwotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCi0JaWYgKCsrZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0X3BvcyA+PSBkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfbGVuKQotCQlkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQotCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCWRldnByaXYtPmFpX2FjdF9zY2FuKys7Ci0JfQotCi0JaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKLQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCXBjbDgxNl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJfQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgYW5hbG9nIGlucHV0IGRtYSBtb2RlIDEgJiAzLCA4MTYgY2FyZHMKLSovCi1zdGF0aWMgdm9pZCB0cmFuc2Zlcl9mcm9tX2RtYV9idWYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgdW5zaWduZWQgc2hvcnQgKnB0ciwKLQkJCQkgIHVuc2lnbmVkIGludCBidWZwdHIsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBwY2w4MTZfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgYm9vbCBsb2FkX2NvdW50ZXJzKQogewogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFOwogCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTEgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDAsIDB4MDBmZik7CisJdWRlbGF5KDEpOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwl1ZGVsYXkoMSk7CiAKLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHB0cltidWZwdHIrK10pOwotCi0JCWlmICgrK2RldnByaXYtPmFpX2FjdF9jaGFubGlzdF9wb3MgPj0KLQkJICAgIGRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9sZW4pIHsKLQkJCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9wb3MgPSAwOwotCQl9Ci0KLQkJcy0+YXN5bmMtPmN1cl9jaGFuKys7Ci0JCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOwotCQkJZGV2cHJpdi0+YWlfYWN0X3NjYW4rKzsKLQkJfQotCi0JCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpCi0JCQkJCQkvKiAgYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJcGNsODE2X2FpX2NhbmNlbChkZXYsIHMpOwotCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKLQkJCQlicmVhazsKLQkJCX0KKwlpZiAobG9hZF9jb3VudGVycykgeworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7CisJCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKIAl9Ci0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTZfYWlfbW9kZTEzX2RtYShpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgcGNsODE2X2FpX3NldHVwX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JaW50IGxlbiwgYnVmcHRyLCB0aGlzX2RtYV9idWY7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBkbWFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGJ5dGVzOworCisJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiAgaG93IG1hbnkgKi8KKwkJYnl0ZXMgPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqCisJCXMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICoKKwkJc2l6ZW9mKHNob3J0KTsKKworCQkvKiAgaG93IG1hbnkgRE1BIHBhZ2VzIHdlIG11c3QgZmlsbCAqLworCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSBieXRlcyAvIGRldnByaXYtPmh3ZG1hc2l6ZTsKKworCQkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCisJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9IGJ5dGVzICUgZGV2cHJpdi0+aHdkbWFzaXplOworCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA+PSAwKQorCQkJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CisJfSBlbHNlCisJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IC0xOworCisJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMDsKKwlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKKwlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWNsZWFyX2RtYV9mZihkZXZwcml2LT5kbWEpOworCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyWzBdKTsKKwlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgYnl0ZXMpOworCXJlbGVhc2VfZG1hX2xvY2soZG1hX2ZsYWdzKTsKKwllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXR1cF9uZXh0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBsb25nIGRtYV9mbGFnczsKLQl1bnNpZ25lZCBzaG9ydCAqcHRyOwogCiAJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQl0aGlzX2RtYV9idWYgPSBkZXZwcml2LT5uZXh0X2RtYV9idWY7Ci0KLQkvKiAgc3dpdGNoIGRtYSBidWZzICovCi0JaWYgKChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPiAtMSkgfHwgZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKLQorCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPiAtMSB8fCBjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkgeworCQkvKiBzd2l0Y2ggZG1hIGJ1ZnMgKi8KIAkJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMSAtIGRldnByaXYtPm5leHRfZG1hX2J1ZjsKIAkJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7CiAJCWRtYV9mbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7Ci0vKiBjbGVhcl9kbWFfZmYgKGRldnByaXYtPmRtYSk7ICovCiAJCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsCiAJCQkgICAgIGRldnByaXYtPmh3ZG1hcHRyW2RldnByaXYtPm5leHRfZG1hX2J1Zl0pOwotCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKSB7Ci0JCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwKLQkJCQkgICAgICBkZXZwcml2LT5od2RtYXNpemVbZGV2cHJpdi0+Ci0JCQkJCQkJIG5leHRfZG1hX2J1Zl0pOwotCQl9IGVsc2UgeworCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKQorCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hc2l6ZSk7CisJCWVsc2UKIAkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5sYXN0X2RtYV9ydW4pOwotCQl9CiAJCXJlbGVhc2VfZG1hX2xvY2soZG1hX2ZsYWdzKTsKIAkJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwogCX0KIAogCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KK30KIAotCXB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldnByaXYtPmRtYWJ1Zlt0aGlzX2RtYV9idWZdOworc3RhdGljIHZvaWQgcGNsODE2X2FpX3NldF9jaGFuX3JhbmdlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByYW5nZSkKK3sKKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENMODE2X01VWF9SRUcpOworCW91dGIocmFuZ2UsIGRldi0+aW9iYXNlICsgUENMODE2X1JBTkdFX1JFRyk7Cit9CiAKLQlsZW4gPSAoZGV2cHJpdi0+aHdkbWFzaXplWzBdID4+IDEpIC0gZGV2cHJpdi0+YWlfcG9sbF9wdHI7CitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfc2V0X2NoYW5fc2NhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmlyc3RfY2hhbiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxhc3RfY2hhbikKK3sKKwlvdXRiKFBDTDgxNl9NVVhfU0NBTihmaXJzdF9jaGFuLCBsYXN0X2NoYW4pLAorCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXR1cF9jaGFubGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBzZWdsZW4pCit7CisJdW5zaWduZWQgaW50IGZpcnN0X2NoYW4gPSBDUl9DSEFOKGNoYW5saXN0WzBdKTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jaGFuOworCXVuc2lnbmVkIGludCByYW5nZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIHN0b3JlIHJhbmdlIGxpc3QgdG8gY2FyZCAqLworCWZvciAoaSA9IDA7IGkgPCBzZWdsZW47IGkrKykgeworCQlsYXN0X2NoYW4gPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKKwkJcmFuZ2UgPSBDUl9SQU5HRShjaGFubGlzdFtpXSk7CisKKwkJcGNsODE2X2FpX3NldF9jaGFuX3JhbmdlKGRldiwgbGFzdF9jaGFuLCByYW5nZSk7CisJfQorCisJdWRlbGF5KDEpOworCisJcGNsODE2X2FpX3NldF9jaGFuX3NjYW4oZGV2LCBmaXJzdF9jaGFuLCBsYXN0X2NoYW4pOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfY2xlYXJfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogd3JpdGluZyBhbnkgdmFsdWUgY2xlYXJzIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdCAqLworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zb2Z0X3RyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiB3cml0aW5nIGFueSB2YWx1ZSB0cmlnZ2VycyBhIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0FJX0xTQl9SRUcpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbDgxNl9haV9nZXRfc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FJX01TQl9SRUcpIDw8IDg7CisJdmFsIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BSV9MU0JfUkVHKTsKKworCXJldHVybiB2YWwgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgaW50IHBjbDgxNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTX1JFRyk7CisJaWYgKChzdGF0dXMgJiBQQ0w4MTZfU1RBVFVTX0RSRFkpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBib29sIHBjbDgxNl9haV9uZXh0X2NoYW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKKwlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisJCWRldnByaXYtPmFpX2FjdF9zY2FuKys7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJICAgIGRldnByaXYtPmFpX2FjdF9zY2FuID49IGNtZC0+c3RvcF9hcmcpIHsKKwkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmZXJfZnJvbV9kbWFfYnVmKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIHVuc2lnbmVkIHNob3J0ICpwdHIsCisJCQkJICB1bnNpZ25lZCBpbnQgYnVmcHRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsKKworCQlpZiAoIXBjbDgxNl9haV9uZXh0X2NoYW4oZGV2LCBzKSkKKwkJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2w4MTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCit7CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCAqcHRyOworCXVuc2lnbmVkIGludCBidWZwdHI7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmICghZGV2LT5hdHRhY2hlZCB8fCAhZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCkgeworCQlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAwOworCQlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlwdHIgPSAodW5zaWduZWQgc2hvcnQgKilkZXZwcml2LT5kbWFidWZbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXTsKKworCXBjbDgxNl9haV9zZXR1cF9uZXh0X2RtYShkZXYsIHMpOworCisJbGVuID0gKGRldnByaXYtPmh3ZG1hc2l6ZSA+PiAxKSAtIGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWJ1ZnB0ciA9IGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWRldnByaXYtPmFpX3BvbGxfcHRyID0gMDsKIAogCXRyYW5zZmVyX2Zyb21fZG1hX2J1ZihkZXYsIHMsIHB0ciwgYnVmcHRyLCBsZW4pOworCisJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBJTlQgcHJvY2VkdXJlCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTYoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0KLQlpZiAoIWRldi0+YXR0YWNoZWQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgInByZW1hdHVyZSBpbnRlcnJ1cHQiKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXN3aXRjaCAoZGV2cHJpdi0+aW50ODE2X21vZGUpIHsKLQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JY2FzZSBJTlRfVFlQRV9BSTNfRE1BOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxNl9haV9tb2RlMTNfZG1hKGlycSwgZCk7Ci0JY2FzZSBJTlRfVFlQRV9BSTFfSU5UOgotCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MTZfYWlfbW9kZTEzX2ludChpcnEsIGQpOwotCX0KLQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQlpZiAoIWRldi0+aXJxIHx8ICFkZXZwcml2LT5pcnFfYmxvY2tlZCB8fCAhZGV2cHJpdi0+aW50ODE2X21vZGUpIHsKLQkJaWYgKGRldnByaXYtPmlycV93YXNfbm93X2Nsb3NlZCkgewotCQkJZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkID0gMDsKLQkJCS8qICBjb21lZGlfZXJyb3IoZGV2LCJsYXN0IElSUS4uIik7ICovCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KLQkJY29tZWRpX2Vycm9yKGRldiwgImJhZCBJUlEhIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlISIpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0JY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKwlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CisJaW50IHRtcDsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIApAQCAtNDMyLDggKzQwMCw3IEBACiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBib2FyZC0+YWlfbnNfbWluKTsKKwkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKIAllbHNlCS8qIFRSSUdfRVhUICovCiAJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwogCkBAIC00NTEsMTEgKzQxOCwxMiBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoYm9hcmQtPmk4MjU0X29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAorCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKKwkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCiAJCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IGJvYXJkLT5haV9uc19taW4pCi0JCQljbWQtPmNvbnZlcnRfYXJnID0gYm9hcmQtPmFpX25zX21pbjsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCAxMDAwMCkKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAxMDAwMDsKIAkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKQogCQkJZXJyKys7CiAJfQpAQCAtNDc3LDEyMCArNDQ1LDQwIEBACiAKIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQljb25zdCBzdHJ1Y3QgcGNsODE2X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDAsIGRtYV9mbGFncywgYnl0ZXMsIGRtYWlycTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGN0cmw7CiAJdW5zaWduZWQgaW50IHNlZ2xlbjsKIAotCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPnNjYW5fZW5kX3NyYyAhPSBUUklHX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotLyogaWYoY21kLT5jaGFubGlzdF9sZW4+TUFYX0NIQU5MSVNUX0xFTikgcmV0dXJuIC1FSU5WQUw7ICovCi0JaWYgKGRldnByaXYtPmlycV9ibG9ja2VkKQorCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBib2FyZC0+YWlfbnNfbWluKQotCQkJY21kLT5jb252ZXJ0X2FyZyA9IGJvYXJkLT5haV9uc19taW47Ci0KLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihib2FyZC0+aTgyNTRfb3NjX2Jhc2UsCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCi0JCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCi0JCS8qICBQQ0w4MTYgY3Jhc2ggaWYgYW55IGRpdmlzb3IgaXMgc2V0IHRvIDEgKi8KLQkJaWYgKGRpdmlzb3IxID09IDEpIHsKLQkJCWRpdmlzb3IxID0gMjsKLQkJCWRpdmlzb3IyIC89IDI7Ci0JCX0KLQkJaWYgKGRpdmlzb3IyID09IDEpIHsKLQkJCWRpdmlzb3IyID0gMjsKLQkJCWRpdmlzb3IxIC89IDI7Ci0JCX0KLQl9Ci0KLQlzdGFydF9wYWNlcihkZXYsIC0xLCAwLCAwKTsJLyogIHN0b3AgcGFjZXIgKi8KKwlwY2w4MTZfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CiAKIAlzZWdsZW4gPSBjaGVja19jaGFubmVsX2xpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBjbWQtPmNoYW5saXN0X2xlbik7CiAJaWYgKHNlZ2xlbiA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCXNldHVwX2NoYW5uZWxfbGlzdChkZXYsIHMsIGNtZC0+Y2hhbmxpc3QsIHNlZ2xlbik7CisJcGNsODE2X2FpX3NldHVwX2NoYW5saXN0KGRldiwgY21kLT5jaGFubGlzdCwgc2VnbGVuKTsKIAl1ZGVsYXkoMSk7CiAKLQlkZXZwcml2LT5haV9uX2NoYW4gPSBjbWQtPmNoYW5saXN0X2xlbjsKIAlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7CiAJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDE7CisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAxOwogCWRldnByaXYtPmFpX3BvbGxfcHRyID0gMDsKLQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAwOworCWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCA9IDA7CiAKLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gY21kLT5zdG9wX2FyZzsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAwOwotCX0gZWxzZSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gMDsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAxOwotCX0KKwlwY2w4MTZfYWlfc2V0dXBfZG1hKGRldiwgcyk7CiAKLQlpZiAoZGV2cHJpdi0+ZG1hKSB7Ci0JCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwotCQlpZiAoIWRldnByaXYtPmFpX25ldmVyZW5kaW5nKSB7Ci0JCQkvKiAgaG93IG1hbnkgKi8KLQkJCWJ5dGVzID0gcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgotCQkJcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgotCQkJc2l6ZW9mKHNob3J0KTsKKwlwY2w4MTZfc3RhcnRfcGFjZXIoZGV2LCB0cnVlKTsKIAotCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IGJ5dGVzIC8KLQkJCWRldnByaXYtPmh3ZG1hc2l6ZVswXTsKKwljdHJsID0gUENMODE2X0NUUkxfSU5URU4gfCBQQ0w4MTZfQ1RSTF9ETUFFTiB8IFBDTDgxNl9DVFJMX0RNQVNSQ19TTE9UMDsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQorCQljdHJsIHw9IFBDTDgxNl9DVFJMX1BBQ0VSX1RSSUc7CisJZWxzZQkvKiBUUklHX0VYVCAqLworCQljdHJsIHw9IFBDTDgxNl9DVFJMX0VYVF9UUklHOwogCi0JCQkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCi0JCQlkZXZwcml2LT5sYXN0X2RtYV9ydW4gPSBieXRlcyAlIGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA+PSAwKQotCQkJCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwotCQl9IGVsc2UKLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IC0xOwotCi0JCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDA7Ci0JCXNldF9kbWFfbW9kZShkZXZwcml2LT5kbWEsIERNQV9NT0RFX1JFQUQpOwotCQlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCQljbGVhcl9kbWFfZmYoZGV2cHJpdi0+ZG1hKTsKLQkJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwgZGV2cHJpdi0+aHdkbWFwdHJbMF0pOwotCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgYnl0ZXMpOwotCQlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7Ci0JCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQl9Ci0KLQlzdGFydF9wYWNlcihkZXYsIDEsIGRpdmlzb3IxLCBkaXZpc29yMik7Ci0JZG1haXJxID0gKChkZXZwcml2LT5kbWEgJiAweDMpIDw8IDQpIHwgKGRldi0+aXJxICYgMHg3KTsKLQotCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgewotCWNhc2UgVFJJR19USU1FUjoKLQkJZGV2cHJpdi0+aW50ODE2X21vZGUgPSBJTlRfVFlQRV9BSTFfRE1BOwotCi0JCS8qICBQYWNlcitJUlErRE1BICovCi0JCW91dGIoMHgzMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0KLQkJLyogIHdyaXRlIGlycSBhbmQgRE1BIHRvIGNhcmQgKi8KLQkJb3V0YihkbWFpcnEsIGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVUyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2cHJpdi0+aW50ODE2X21vZGUgPSBJTlRfVFlQRV9BSTNfRE1BOwotCi0JCS8qICBFeHQgdHJpZytJUlErRE1BICovCi0JCW91dGIoMHgzNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0KLQkJLyogIHdyaXRlIGlycSB0byBjYXJkICovCi0JCW91dGIoZG1haXJxLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVMpOwotCQlicmVhazsKLQl9CisJb3V0YihjdHJsLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CisJb3V0YigoZGV2cHJpdi0+ZG1hIDw8IDQpIHwgZGV2LT5pcnEsIGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVU19SRUcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDEsOSArNDg5LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCB0b3AxLCB0b3AyLCBpOwogCi0JaWYgKCFkZXZwcml2LT5kbWEpCi0JCXJldHVybiAwOwkvKiAgcG9sbCBpcyB2YWxpZCBvbmx5IGZvciBETUEgdHJhbnNmZXIgKi8KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgewpAQCAtNjE4LDcgKzUwMyw3IEBACiAJfQogCiAJLyogIHdoZXJlIGlzIG5vdyBETUEgaW4gYnVmZmVyICovCi0JdG9wMSA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXSAtIHRvcDE7CisJdG9wMSA9IGRldnByaXYtPmh3ZG1hc2l6ZSAtIHRvcDE7CiAJdG9wMSA+Pj0gMTsJCS8qICBzYW1wbGUgcG9zaXRpb24gKi8KIAl0b3AyID0gdG9wMSAtIGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWlmICh0b3AyIDwgMSkgewkJLyogIG5vIG5ldyBzYW1wbGVzICovCkBAIC02MzQsMTM0ICs1MTksMzQgQEAKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IHRvcDE7CS8qICBuZXcgYnVmZmVyIHBvc2l0aW9uICovCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKKwogCXJldHVybiBzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50IC0gcy0+YXN5bmMtPmJ1Zl9yZWFkX2NvdW50OwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gY2FuY2VsIGFueSBtb2RlIDEtNCBBSQotKi8KIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCWlmIChkZXZwcml2LT5pcnFfYmxvY2tlZCA+IDApIHsKLQkJc3dpdGNoIChkZXZwcml2LT5pbnQ4MTZfbW9kZSkgewotCQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0RNQToKLQkJCWRpc2FibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JCWNhc2UgSU5UX1RZUEVfQUkxX0lOVDoKLQkJY2FzZSBJTlRfVFlQRV9BSTNfSU5UOgotCQkJb3V0YihpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCkgJiAweDczLAotCQkJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KLQkJCXVkZWxheSgxKTsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CS8qIFN0b3AgQS9EICovCisJaWYgKCFkZXZwcml2LT5haV9jbWRfcnVubmluZykKKwkJcmV0dXJuIDA7CiAKLQkJCS8qIFN0b3AgcGFjZXIgKi8KLQkJCW91dGIoMHhiMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQkJCW91dGIoMHg3MCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQURfTE8pOwotCQkJaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsKLQkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9ISSk7CisJb3V0YihQQ0w4MTZfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKKwlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CiAKLQkJCS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7CisJLyogU3RvcCBwYWNlciAqLworCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENMODE2X1RJTUVSX0JBU0UsIDAsCisJCQkyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRSwgMCwKKwkJCTEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAotCQkJLyogU3RvcCBBL0QgKi8KLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0JCQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7Ci0JCQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSBkZXZwcml2LT5pbnQ4MTZfbW9kZTsKLQkJCWRldnByaXYtPmludDgxNl9tb2RlID0gMDsKLQkJCWRldnByaXYtPmxhc3RfaW50X3N1YiA9IHM7Ci0vKiBzLT5idXN5ID0gMDsgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQorCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAxOworCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBjaGVjaCBmb3IgUENMODE2Ci0qLwotc3RhdGljIGludCBwY2w4MTZfY2hlY2sodW5zaWduZWQgbG9uZyBpb2Jhc2UpCi17Ci0Jb3V0YigweDAwLCBpb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKLQl1ZGVsYXkoMSk7Ci0JaWYgKGluYihpb2Jhc2UgKyBQQ0w4MTZfTVVYKSAhPSAweDAwKQotCQlyZXR1cm4gMTsJLyogdGhlcmUgaXNuJ3QgY2FyZCAqLwotCW91dGIoMHg1NSwgaW9iYXNlICsgUENMODE2X01VWCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE2X01VWCkgIT0gMHg1NSkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlvdXRiKDB4MDAsIGlvYmFzZSArIFBDTDgxNl9NVVgpOwotCXVkZWxheSgxKTsKLQlvdXRiKDB4MTgsIGlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsKLQl1ZGVsYXkoMSk7Ci0JaWYgKGluYihpb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCkgIT0gMHgxOCkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlyZXR1cm4gMDsJCS8qICBvaywgY2FyZCBleGlzdCAqLwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gcmVzZXQgd2hvbGUgUENMLTgxNiBjYXJkcwotKi8KLXN0YXRpYyB2b2lkIHBjbDgxNl9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotLyogb3V0YiAoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfTE8pOyAgICAgICAgIERBQz0wViAqLwotLyogb3V0YiAoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfSEkpOyAqLwotLyogdWRlbGF5ICgxKTsgKi8KLS8qIG91dGIgKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0hJKTsgICAgICAgIERPPSQwMDAwICovCi0vKiBvdXRiICgwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19MTyk7ICovCi0vKiB1ZGVsYXkgKDEpOyAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsKLQlvdXRiKDB4YjAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7CS8qIFN0b3AgcGFjZXIgKi8KLQlvdXRiKDB4NzAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0Jb3V0YigweDMwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gU3RhcnQvc3RvcCBwYWNlciBvbmJvYXJkIHBhY2VyCi0qLwotc3RhdGljIHZvaWQKLXN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjEsCi0JICAgIHVuc2lnbmVkIGludCBkaXZpc29yMikKLXsKLQlvdXRiKDB4MzIsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0Jb3V0YigweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFIwKTsKLQlvdXRiKDB4MDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjApOwotCXVkZWxheSgxKTsKLQotCS8qICBzZXQgY291bnRlciAyIGFzIG1vZGUgMyAqLwotCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQkvKiAgc2V0IGNvdW50ZXIgMSBhcyBtb2RlIDMgKi8KLQlvdXRiKDB4NzQsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0JdWRlbGF5KDEpOwotCi0JaWYgKG1vZGUgPT0gMSkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAibW9kZSAlZCwgZGl2aXNvcjEgJWQsIGRpdmlzb3IyICVkXG4iLAotCQkJbW9kZSwgZGl2aXNvcjEsIGRpdmlzb3IyKTsKLQkJb3V0YihkaXZpc29yMiAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjIpOwotCQlvdXRiKChkaXZpc29yMiA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjIpOwotCQlvdXRiKGRpdmlzb3IxICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSMSk7Ci0JCW91dGIoKGRpdmlzb3IxID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSMSk7Ci0JfQotCi0JLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzIChqdXN0IGluIGNhc2UpICovCi0vKiBvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7ICovCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBDaGVjayBpZiBjaGFubmVsIGxpc3QgZnJvbSB1c2VyIGlzIGJ1aWx0IGNvcnJlY3RseQotIElmIGl0J3Mgb2ssIHRoZW4gcmV0dXJuIG5vbi16ZXJvIGxlbmd0aCBvZiByZXBlYXRlZCBzZWdtZW50IG9mIGNoYW5uZWwgbGlzdAotKi8KIHN0YXRpYyBpbnQKIGNoZWNrX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKQEAgLTgxOCwxODAgKzYwMywxODEgQEAKIAlyZXR1cm4gc2VnbGVuOwkvKiAgd2UgY2FuIHNlcnZlIHRoaXMgd2l0aCBNVVggbG9naWMgKi8KIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIFByb2dyYW0gc2Nhbi9nYWluIGxvZ2ljIHdpdGggY2hhbm5lbCBsaXN0LgotKi8KLXN0YXRpYyB2b2lkCi1zZXR1cF9jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsCi0JCSAgIHVuc2lnbmVkIGludCBzZWdsZW4pCitzdGF0aWMgaW50IHBjbDgxNl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKIAotCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9sZW4gPSBzZWdsZW47Ci0JZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0X3BvcyA9IDA7CisJb3V0YihQQ0w4MTZfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKIAotCWZvciAoaSA9IDA7IGkgPCBzZWdsZW47IGkrKykgewkvKiAgc3RvcmUgcmFuZ2UgbGlzdCB0byBjYXJkICovCi0JCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdFtpXSA9IENSX0NIQU4oY2hhbmxpc3RbaV0pOwotCQlvdXRiKENSX0NIQU4oY2hhbmxpc3RbMF0pICYgMHhmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCQkvKiBzZWxlY3QgZ2FpbiAqLwotCQlvdXRiKENSX1JBTkdFKGNoYW5saXN0WzBdKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOworCXBjbDgxNl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGNoYW4sIHJhbmdlKTsKKwlwY2w4MTZfYWlfc2V0X2NoYW5fc2NhbihkZXYsIGNoYW4sIGNoYW4pOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CisJCXBjbDgxNl9haV9zb2Z0X3RyaWcoZGV2KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbDgxNl9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJZGF0YVtpXSA9IHBjbDgxNl9haV9nZXRfc2FtcGxlKGRldiwgcyk7CisJfQorCW91dGIoUENMODE2X0NUUkxfRElTQUJMRV9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CisJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE2X2RpX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9MU0JfUkVHKSB8CisJCSAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9NU0JfUkVHKSA8PCA4KTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxNl9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgeworCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTFNCX1JFRyk7CisJCW91dGIoKHMtPnN0YXRlID4+IDgpLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9NU0JfUkVHKTsKIAl9CiAKLQl1ZGVsYXkoMSk7Ci0JLyogc2VsZWN0IGNoYW5uZWwgaW50ZXJ2YWwgdG8gc2NhbiAqLwotCW91dGIoZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0WzBdIHwKLQkgICAgIChkZXZwcml2LT5haV9hY3RfY2hhbmxpc3Rbc2VnbGVuIC0gMV0gPDwgNCksCi0JICAgICBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFOworCisJb3V0YihQQ0w4MTZfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKKwlwY2w4MTZfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCAwLCAwKTsKKwlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CisKKwkvKiBTdG9wIHBhY2VyICovCisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0RPX0RJX0xTQl9SRUcpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTVNCX1JFRyk7CiB9CiAKIHN0YXRpYyBpbnQgcGNsODE2X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXY7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgZG1hOwotCXVuc2lnbmVkIGxvbmcgcGFnZXM7Ci0JLyogaW50IGk7ICovCiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgYm9hcmQtPmlvX3JhbmdlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHBjbDgxNl9jaGVjayhkZXYtPmlvYmFzZSkpIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkkgY2FuJ3QgZGV0ZWN0IGJvYXJkLiBGQUlMIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KKwlpbnQgcmV0OworCWludCBpOwogCiAJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CiAJaWYgKCFkZXZwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICgoMSA8PCBpdC0+b3B0aW9uc1sxXSkgJiBib2FyZC0+SVJRYml0cykgewotCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgaW50ZXJydXB0X3BjbDgxNiwgMCwKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHdlIGNhbiB1c2UgSVJRIDItNyBmb3IgYXN5bmMgY29tbWFuZCBzdXBwb3J0ICovCisJaWYgKGl0LT5vcHRpb25zWzFdID49IDIgJiYgaXQtPm9wdGlvbnNbMV0gPD0gNykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgcGNsODE2X2ludGVycnVwdCwgMCwKIAkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKIAkJaWYgKHJldCA9PSAwKQogCQkJZGV2LT5pcnEgPSBpdC0+b3B0aW9uc1sxXTsKIAl9CiAKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7CS8qIG51bWJlciBvZiBzdWJkZXZpY2Ugd2hpY2ggdXNlIElSUSAqLwotCWRldnByaXYtPmludDgxNl9tb2RlID0gMDsJLyogbW9kZSBvZiBpcnEgKi8KLQotCS8qIGdyYWIgb3VyIERNQSAqLwotCWRtYSA9IDA7Ci0JZGV2cHJpdi0+ZG1hID0gZG1hOwotCWlmICghZGV2LT5pcnEpCi0JCWdvdG8gbm9fZG1hOwkvKiBpZiB3ZSBoYXZlbid0IElSUSwgd2UgY2FuJ3QgdXNlIERNQSAqLwotCi0JaWYgKGJvYXJkLT5ETUFiaXRzICE9IDApIHsJLyogYm9hcmQgc3VwcG9ydCBETUEgKi8KLQkJZG1hID0gaXQtPm9wdGlvbnNbMl07Ci0JCWlmIChkbWEgPCAxKQotCQkJZ290byBub19kbWE7CS8qIERNQSBkaXNhYmxlZCAqLwotCi0JCWlmICgoKDEgPDwgZG1hKSAmIGJvYXJkLT5ETUFiaXRzKSA9PSAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJETUEgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIEZBSUwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwkvKiBCYWQgRE1BICovCi0JCX0KLQkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCBkZXYtPmJvYXJkX25hbWUpOworCS8qIHdlIG5lZWQgYW4gSVJRIHRvIGRvIERNQSBvbiBjaGFubmVsIDMgb3IgMSAqLworCWlmIChkZXYtPmlycSAmJiAoaXQtPm9wdGlvbnNbMl0gPT0gMyB8fCBpdC0+b3B0aW9uc1syXSA9PSAxKSkgeworCQlyZXQgPSByZXF1ZXN0X2RtYShpdC0+b3B0aW9uc1syXSwgZGV2LT5ib2FyZF9uYW1lKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSAldSwgRkFJTCFcbiIsIGRtYSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwkvKiBETUEgaXNuJ3QgZnJlZSAqLwotCQl9Ci0KLQkJZGV2cHJpdi0+ZG1hID0gZG1hOwotCQlwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLwotCQlkZXZwcml2LT5kbWFidWZbMF0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCi0JCWlmICghZGV2cHJpdi0+ZG1hYnVmWzBdKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciwgRkFJTCFcbiIpOwotCQkJLyoKLQkJCSAqIG1heWJlIGV4cGVyaW1lbnQgd2l0aCB0cnlfdG9fZnJlZV9wYWdlcygpCi0JCQkgKiB3aWxsIGhlbHAgLi4uLgotCQkJICovCi0JCQlyZXR1cm4gLUVCVVNZOwkvKiBubyBidWZmZXIgOi0oICovCi0JCX0KLQkJZGV2cHJpdi0+ZG1hcGFnZXNbMF0gPSBwYWdlczsKLQkJZGV2cHJpdi0+aHdkbWFwdHJbMF0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRldnByaXYtPmRtYWJ1ZlswXSk7Ci0JCWRldnByaXYtPmh3ZG1hc2l6ZVswXSA9ICgxIDw8IHBhZ2VzKSAqIFBBR0VfU0laRTsKLQotCQlkZXZwcml2LT5kbWFidWZbMV0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlsxXSkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgJWRcbiIsCisJCQkJaXQtPm9wdGlvbnNbMl0pOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQotCQlkZXZwcml2LT5kbWFwYWdlc1sxXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clsxXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzFdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzFdID0gKDEgPDwgcGFnZXMpICogUEFHRV9TSVpFOworCQlkZXZwcml2LT5kbWEgPSBpdC0+b3B0aW9uc1syXTsKKworCQlkZXZwcml2LT5kbWFwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLworCQlkZXZwcml2LT5od2RtYXNpemUgPSAoMSA8PCBkZXZwcml2LT5kbWFwYWdlcykgKiBQQUdFX1NJWkU7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBkbWFidWY7CisKKwkJCWRtYWJ1ZiA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBkZXZwcml2LT5kbWFwYWdlcyk7CisJCQlpZiAoIWRtYWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGV2cHJpdi0+ZG1hYnVmW2ldID0gZG1hYnVmOworCQkJZGV2cHJpdi0+aHdkbWFwdHJbaV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRtYWJ1Zik7CisJCX0KIAl9CiAKLW5vX2RtYToKLQotLyogIGlmIChib2FyZC0+bl9hb2NoYW4gPiAwKQotICAgIHN1YmRldnNbMV0gPSBDT01FRElfU1VCRF9BTzsKLSAgaWYgKGJvYXJkLT5uX2RpY2hhbiA+IDApCi0gICAgc3ViZGV2c1syXSA9IENPTUVESV9TVUJEX0RJOwotICBpZiAoYm9hcmQtPm5fZG9jaGFuID4gMCkKLSAgICBzdWJkZXZzWzNdID0gQ09NRURJX1NVQkRfRE87Ci0qLwotCi0JcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQlpZiAoYm9hcmQtPm5fYWljaGFuID4gMCkgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9DTURfUkVBRCB8IFNERl9ESUZGOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCXMtPm1heGRhdGEgPSBib2FyZC0+YWlfbWF4ZGF0YTsKLQkJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YWlfcmFuZ2VfdHlwZTsKLQkJcy0+aW5zbl9yZWFkID0gcGNsODE2X2FpX2luc25fcmVhZDsKLQkJaWYgKGRldi0+aXJxKSB7Ci0JCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKLQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfQ01EX1JFQUQ7Ci0JCQlzLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+YWlfY2hhbmxpc3Q7Ci0JCQlzLT5kb19jbWR0ZXN0ID0gcGNsODE2X2FpX2NtZHRlc3Q7Ci0JCQlzLT5kb19jbWQgPSBwY2w4MTZfYWlfY21kOwotCQkJcy0+cG9sbCA9IHBjbDgxNl9haV9wb2xsOwotCQkJcy0+Y2FuY2VsID0gcGNsODE2X2FpX2NhbmNlbDsKLQkJfQotCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfQ01EX1JFQUQgfCBTREZfRElGRjsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gYm9hcmQtPmFpX21heGRhdGE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfcGNsODE2OworCXMtPmluc25fcmVhZAk9IHBjbDgxNl9haV9pbnNuX3JlYWQ7CisJaWYgKGRldnByaXYtPmRtYSkgeworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9DTURfUkVBRDsKKwkJcy0+bGVuX2NoYW5saXN0CT0gYm9hcmQtPmFpX2NoYW5saXN0OworCQlzLT5kb19jbWR0ZXN0CT0gcGNsODE2X2FpX2NtZHRlc3Q7CisJCXMtPmRvX2NtZAk9IHBjbDgxNl9haV9jbWQ7CisJCXMtPnBvbGwJCT0gcGNsODE2X2FpX3BvbGw7CisJCXMtPmNhbmNlbAk9IHBjbDgxNl9haV9jYW5jZWw7CiAJfQogCisJLyogQW5hbG9nIE9VdHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX1VOVVNFRDsKICNpZiAwCi1jYXNlIENPTUVESV9TVUJEX0FPOgorCXN1YmRldnNbMV0gPSBDT01FRElfU1VCRF9BTzsKIAlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EOwotCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FvY2hhbjsKKwlzLT5uX2NoYW4gPSAxOwogCXMtPm1heGRhdGEgPSBib2FyZC0+YW9fbWF4ZGF0YTsKLQlzLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+YW9fY2hhbmxpc3Q7Ci0Jcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YW9fcmFuZ2VfdHlwZTsKLQlicmVhazsKLQotY2FzZSBDT01FRElfU1VCRF9ESToKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7Ci0Jcy0+bl9jaGFuID0gYm9hcmQtPm5fZGljaGFuOwotCXMtPm1heGRhdGEgPSAxOwotCXMtPmxlbl9jaGFubGlzdCA9IGJvYXJkLT5uX2RpY2hhbjsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCWJyZWFrOwotCi1jYXNlIENPTUVESV9TVUJEX0RPOgotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kb2NoYW47Ci0Jcy0+bWF4ZGF0YSA9IDE7Ci0Jcy0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPm5fZG9jaGFuOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7Ci0JYnJlYWs7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODE2OwogI2VuZGlmCiAKKwkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbgk9IDE2OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzCT0gcGNsODE2X2RpX2luc25fYml0czsKKworCS8qIERpZ2l0YWwgT3V0cHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbgk9IDE2OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzCT0gcGNsODE2X2RvX2luc25fYml0czsKKwogCXBjbDgxNl9yZXNldChkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDA3LDM0ICs3OTMsMTMgQEAKIAkJaWYgKGRldnByaXYtPmRtYSkKIAkJCWZyZWVfZG1hKGRldnByaXYtPmRtYSk7CiAJCWlmIChkZXZwcml2LT5kbWFidWZbMF0pCi0JCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlswXSwgZGV2cHJpdi0+ZG1hcGFnZXNbMF0pOworCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMF0sIGRldnByaXYtPmRtYXBhZ2VzKTsKIAkJaWYgKGRldnByaXYtPmRtYWJ1ZlsxXSkKLQkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzFdLCBkZXZwcml2LT5kbWFwYWdlc1sxXSk7CisJCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlsxXSwgZGV2cHJpdi0+ZG1hcGFnZXMpOwogCX0KIAljb21lZGlfbGVnYWN5X2RldGFjaChkZXYpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCBib2FyZHR5cGVzW10gPSB7Ci0JeyJwY2w4MTYiLCA4LCAxNiwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxNiwKLQkgJnJhbmdlX3BjbDgxNiwgUENMeDF4X1JBTkdFLAotCSAweDAwZmMsCQkvKiAgSVJRIG1hc2sgKi8KLQkgMHgwYSwJCQkvKiAgRE1BIG1hc2sgKi8KLQkgMHhmZmZmLAkJLyogIDE2LWJpdCBjYXJkICovCi0JIDB4ZmZmZiwJCS8qICBEL0EgbWF4ZGF0YSAqLwotCSAxMDI0LAotCSAxLAkJCS8qICBhbyBjaGFuIGxpc3QgKi8KLQkgSTgyNTRfT1NDX0JBU0VfMTBNSFp9LAotCXsicGNsODE0YiIsIDgsIDE2LCAxMDAwMCwgMSwgMTYsIDE2LCAmcmFuZ2VfcGNsODE2LAotCSAmcmFuZ2VfcGNsODE2LCBQQ0x4MXhfUkFOR0UsCi0JIDB4MDBmYywKLQkgMHgwYSwKLQkgMHgzZmZmLAkJLyogMTQgYml0IGNhcmQgKi8KLQkgMHgzZmZmLAotCSAxMDI0LAotCSAxLAotCSBJODI1NF9PU0NfQkFTRV8xME1IWn0sCi19OwotCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgcGNsODE2X2RyaXZlciA9IHsKIAkuZHJpdmVyX25hbWUJPSAicGNsODE2IiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCmluZGV4IGZhMTc1OGEuLjY0NjM0NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKQEAgLTExMCw4ICsxMTAsNiBAQAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIjgyNTMuaCIKIAotLyogI2RlZmluZSBQQ0w4MThfTU9ERTEzX0FPIDEgKi8KLQogLyogYm9hcmRzIGNvbnN0YW50cyAqLwogCiAjZGVmaW5lIGJvYXJkUENMODE4TCAwCkBAIC0xMjEsNDYgKzExOSwzOCBAQAogI2RlZmluZSBib2FyZFBDTDgxOCA0CiAjZGVmaW5lIGJvYXJkUENMNzE4IDUKIAotLyogSU8gc3BhY2UgbGVuICovCi0jZGVmaW5lIFBDTHgxeF9SQU5HRSAxNgotLyogSU8gc3BhY2UgbGVuIGlmIHdlIHVzZSBGSUZPICovCi0jZGVmaW5lIFBDTHgxeEZJRk9fUkFOR0UgMzIKLQotLyogVzogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLSNkZWZpbmUgUENMODE4X0NMUklOVCA4Ci0vKiBSOiByZXR1cm4gc3RhdHVzIGJ5dGUgKi8KLSNkZWZpbmUgUENMODE4X1NUQVRVUyA4Ci0vKiBSOiBBL0QgaGlnaCBieXRlIFc6IEEvRCByYW5nZSBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxOF9SQU5HRSAxCi0vKiBSOiBuZXh0IG11eCBzY2FuIGNoYW5uZWwgVzogbXV4IHNjYW4gY2hhbm5lbCAmIHJhbmdlIGNvbnRyb2wgcG9pbnRlciAqLwotI2RlZmluZSBQQ0w4MThfTVVYIDIKLS8qIFIvVzogb3BlcmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUENMODE4X0NPTlRST0wgOQotLyogVzogY291bnRlciBlbmFibGUgKi8KLSNkZWZpbmUgUENMODE4X0NOVEVOQUJMRSAxMAotCi0vKiBSOiBsb3cgYnl0ZSBvZiBBL0QgVzogc29mdCBBL0QgdHJpZ2dlciAqLwotI2RlZmluZSBQQ0w4MThfQURfTE8gMAotLyogUjogaGlnaCBieXRlIG9mIEEvRCBXOiBBL0QgcmFuZ2UgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MThfQURfSEkgMQotLyogVzogRC9BIGxvdyZoaWdoIGJ5dGUgKi8KLSNkZWZpbmUgUENMODE4X0RBX0xPIDQKLSNkZWZpbmUgUENMODE4X0RBX0hJIDUKLS8qIFI6IGxvdyZoaWdoIGJ5dGUgb2YgREkgKi8KLSNkZWZpbmUgUENMODE4X0RJX0xPIDMKLSNkZWZpbmUgUENMODE4X0RJX0hJIDExCi0vKiBXOiBsb3cmaGlnaCBieXRlIG9mIERPICovCi0jZGVmaW5lIFBDTDgxOF9ET19MTyAzCi0jZGVmaW5lIFBDTDgxOF9ET19ISSAxMQotLyogVzogUENMNzE4IHNlY29uZCBEL0EgKi8KLSNkZWZpbmUgUENMNzE4X0RBMl9MTyA2Ci0jZGVmaW5lIFBDTDcxOF9EQTJfSEkgNwotLyogY291bnRlcnMgKi8KLSNkZWZpbmUgUENMODE4X0NUUjAgMTIKLSNkZWZpbmUgUENMODE4X0NUUjEgMTMKLSNkZWZpbmUgUENMODE4X0NUUjIgMTQKLS8qIFc6IGNvdW50ZXIgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MThfQ1RSQ1RMIDE1CisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIFBDTDgxOF9BSV9MU0JfUkVHCQkJMHgwMAorI2RlZmluZSBQQ0w4MThfQUlfTVNCX1JFRwkJCTB4MDEKKyNkZWZpbmUgUENMODE4X1JBTkdFX1JFRwkJCTB4MDEKKyNkZWZpbmUgUENMODE4X01VWF9SRUcJCQkJMHgwMgorI2RlZmluZSBQQ0w4MThfTVVYX1NDQU4oX2ZpcnN0LCBfbGFzdCkJCSgoKF9sYXN0KSA8PCA0KSB8IChfZmlyc3QpKQorI2RlZmluZSBQQ0w4MThfRE9fRElfTFNCX1JFRwkJCTB4MDMKKyNkZWZpbmUgUENMODE4X0FPX0xTQl9SRUcoeCkJCQkoMHgwNCArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODE4X0FPX01TQl9SRUcoeCkJCQkoMHgwNSArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODE4X1NUQVRVU19SRUcJCQkweDA4CisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfTkVYVF9DSEFOX01BU0sJCSgweGYgPDwgMCkKKyNkZWZpbmUgUENMODE4X1NUQVRVU19JTlQJCQkoMSA8PCA0KQorI2RlZmluZSBQQ0w4MThfU1RBVFVTX01VWAkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfVU5JCQkJKDEgPDwgNikKKyNkZWZpbmUgUENMODE4X1NUQVRVU19FT0MJCQkoMSA8PCA3KQorI2RlZmluZSBQQ0w4MThfQ1RSTF9SRUcJCQkJMHgwOQorI2RlZmluZSBQQ0w4MThfQ1RSTF9ESVNBQkxFX1RSSUcJCSgwIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX1NPRlRfVFJJRwkJCSgxIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX0VYVF9UUklHCQkJKDIgPDwgMCkKKyNkZWZpbmUgUENMODE4X0NUUkxfUEFDRVJfVFJJRwkJCSgzIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX0RNQUUJCQkoMSA8PCAyKQorI2RlZmluZSBQQ0w4MThfQ1RSTF9JUlEoeCkJCQkoKHgpIDw8IDQpCisjZGVmaW5lIFBDTDgxOF9DVFJMX0lOVEUJCQkoMSA8PCA3KQorI2RlZmluZSBQQ0w4MThfQ05URU5BQkxFX1JFRwkJCTB4MGEKKyNkZWZpbmUgUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEJCSgwIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DTlRFTkFCTEVfUEFDRVJfVFJJRzAJCSgxIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DTlRFTkFCTEVfQ05UMF9FWFRfQ0xLCQkoMCA8PCAxKQorI2RlZmluZSBQQ0w4MThfQ05URU5BQkxFX0NOVDBfSU5UX0NMSwkJKDEgPDwgMSkKKyNkZWZpbmUgUENMODE4X0RPX0RJX01TQl9SRUcJCQkweDBiCisjZGVmaW5lIFBDTDgxOF9USU1FUl9CQVNFCQkJMHgwYwogCiAvKiBXOiBmaWZvIGVuYWJsZS9kaXNhYmxlICovCiAjZGVmaW5lIFBDTDgxOF9GSV9FTkFCTEUgNgpAQCAtMTcyLDE5ICsxNjIsNyBAQAogI2RlZmluZSBQQ0w4MThfRklfU1RBVFVTIDI1CiAvKiBSOiBvbmUgcmVjb3JkIGZyb20gRklGTyAqLwogI2RlZmluZSBQQ0w4MThfRklfREFUQUxPIDIzCi0jZGVmaW5lIFBDTDgxOF9GSV9EQVRBSEkgMjMKLQotLyogdHlwZSBvZiBpbnRlcnJ1cHQgaGFuZGxlciAqLwotI2RlZmluZSBJTlRfVFlQRV9BSTFfSU5UIDEKLSNkZWZpbmUgSU5UX1RZUEVfQUkxX0RNQSAyCi0jZGVmaW5lIElOVF9UWVBFX0FJMV9GSUZPIDMKLSNkZWZpbmUgSU5UX1RZUEVfQUkzX0lOVCA0Ci0jZGVmaW5lIElOVF9UWVBFX0FJM19ETUEgNQotI2RlZmluZSBJTlRfVFlQRV9BSTNfRklGTyA2Ci0jaWZkZWYgUENMODE4X01PREUxM19BTwotI2RlZmluZSBJTlRfVFlQRV9BTzFfSU5UIDcKLSNkZWZpbmUgSU5UX1RZUEVfQU8zX0lOVCA4Ci0jZW5kaWYKKyNkZWZpbmUgUENMODE4X0ZJX0RBVEFISSAyNAogCiAjZGVmaW5lIE1BR0lDX0RNQV9XT1JEIDB4NWE1YQogCkBAIC0yNjIsNDkzICsyNDAsMTI1IEBACiB9OwogCiBzdHJ1Y3QgcGNsODE4X2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBuc19taW47CisJaW50IG5fYW9jaGFuOworCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90eXBlOworCXVuc2lnbmVkIGludCBoYXNfZG1hOjE7CisJdW5zaWduZWQgaW50IGhhc19maWZvOjE7CisJdW5zaWduZWQgaW50IGlzXzgxODoxOworfTsKIAotCWNvbnN0IGNoYXIgKm5hbWU7CS8qICBkcml2ZXIgbmFtZSAqLwotCWludCBuX3JhbmdlczsJCS8qICBsZW4gb2YgcmFuZ2UgbGlzdCAqLwotCWludCBuX2FpY2hhbl9zZTsJLyogIG51bSBvZiBBL0QgY2hhbnMgaW4gc2luZ2xlIGVuZGVkICBtb2RlICovCi0JaW50IG5fYWljaGFuX2RpZmY7CS8qICBudW0gb2YgQS9EIGNoYW5zIGluIGRpZmVyZW5jaWFsIG1vZGUgKi8KLQl1bnNpZ25lZCBpbnQgbnNfbWluOwkvKiAgbWluaW1hbCBhbGxvd2VkIGRlbGF5IGJldHdlZW4gc2FtcGxlcyAoaW4gbnMpICovCi0JaW50IG5fYW9jaGFuOwkJLyogIG51bSBvZiBEL0EgY2hhbnMgKi8KLQlpbnQgbl9kaWNoYW47CQkvKiAgbnVtIG9mIERJIGNoYW5zICovCi0JaW50IG5fZG9jaGFuOwkJLyogIG51bSBvZiBETyBjaGFucyAqLwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBBL0QgcmFuZ2VsaXN0ICovCi0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX3R5cGU7CS8qICBkZWZhdWx0IEQvQSByYW5nZWxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgaW9fcmFuZ2U7CS8qICBsZW4gb2YgSU8gc3BhY2UgKi8KLQl1bnNpZ25lZCBpbnQgSVJRYml0czsJLyogIGFsbG93ZWQgaW50ZXJydXB0cyAqLwotCXVuc2lnbmVkIGludCBETUFiaXRzOwkvKiAgYWxsb3dlZCBETUEgY2hhbnMgKi8KLQlpbnQgYWlfbWF4ZGF0YTsJCS8qICBtYXhkYXRhIGZvciBBL0QgKi8KLQlpbnQgYW9fbWF4ZGF0YTsJCS8qICBtYXhkYXRhIGZvciBEL0EgKi8KLQl1bnNpZ25lZCBjaGFyIGZpZm87CS8qICAxPWJvYXJkIGhhcyBGSUZPICovCi0JaW50IGlzXzgxODsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJwY2w4MThsIiwKKwkJLm5zX21pbgkJPSAyNTAwMCwKKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4bF9sX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MThoIiwKKwkJLm5zX21pbgkJPSAxMDAwMCwKKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4aF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE4aGQiLAorCQkubnNfbWluCQk9IDEwMDAwLAorCQkubl9hb2NoYW4JPSAxLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV9wY2w4MThoX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZmlmbwk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MThoZyIsCisJCS5uc19taW4JCT0gMTAwMDAsCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9yYW5nZV90eXBlCT0gJnJhbmdlX3BjbDgxOGhnX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZmlmbwk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MTgiLAorCQkubnNfbWluCQk9IDEwMDAwLAorCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV9wY2w4MThoX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w3MTgiLAorCQkubnNfbWluCQk9IDE2MDAwLAorCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV91bmlwb2xhcjUsCisJCS5oYXNfZG1hCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY20zNzE4IiwKKwkJLm5zX21pbgkJPSAxMDAwMCwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4aF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwKIH07CiAKIHN0cnVjdCBwY2w4MThfcHJpdmF0ZSB7Ci0KIAl1bnNpZ25lZCBpbnQgZG1hOwkvKiAgdXNlZCBETUEsIDA9ZG9uJ3QgdXNlIERNQSAqLwotCXVuc2lnbmVkIGludCBpb19yYW5nZTsKKwl1bnNpZ25lZCBpbnQgZG1hcGFnZXM7CisJdW5zaWduZWQgaW50IGh3ZG1hc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGRtYWJ1ZlsyXTsJLyogIHBvaW50ZXJzIHRvIGJlZ2luIG9mIERNQSBidWZmZXJzICovCi0JdW5zaWduZWQgaW50IGRtYXBhZ2VzWzJdOwkvKiAgbGVuIG9mIERNQSBidWZmZXJzIGluIFBBR0VfU0laRXMgKi8KIAl1bnNpZ25lZCBpbnQgaHdkbWFwdHJbMl07CS8qICBoYXJkd2FyZSBhZGRyZXNzIG9mIERNQSBidWZmZXJzICovCi0JdW5zaWduZWQgaW50IGh3ZG1hc2l6ZVsyXTsJLyogIGxlbiBvZiBETUEgYnVmZmVycyBpbiBCeXRlcyAqLwogCWludCBuZXh0X2RtYV9idWY7CS8qICB3aGljaCBETUEgYnVmZmVyIHdpbGwgYmUgdXNlZCBuZXh0IHJvdW5kICovCiAJbG9uZyBkbWFfcnVuc190b19lbmQ7CS8qICBob3cgbWFueSB3ZSBtdXN0IHBlcm1vcm0gRE1BIHRyYW5zZmVyIHRvIGVuZCBvZiByZWNvcmQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfZG1hX3J1bjsJLyogIGhvdyBtYW55IGJ5dGVzIHdlIG11c3QgdHJhbnNmZXIgb24gbGFzdCBETUEgcGFnZSAqLwotCXVuc2lnbmVkIGNoYXIgbmV2ZXJlbmRpbmdfYWk7CS8qICBpZj0xLCB0aGVuIHdlIGRvIG5ldmVyZW5kaW5nIHJlY29yZCAoeW91IG11c3QgdXNlIGNhbmNlbCgpKSAqLwogCXVuc2lnbmVkIGludCBuc19taW47CS8qICBtYW5pbWFsIGFsbG93ZWQgZGVsYXkgYmV0d2VlbiBzYW1wbGVzIChpbiB1cykgZm9yIGFjdHVhbCBjYXJkICovCiAJaW50IGk4MjUzX29zY19iYXNlOwkvKiAgMS9mcmVxdWVuY3kgb2Ygb24gYm9hcmQgb3NjaWxhdG9yIGluIG5zICovCi0JaW50IGlycV9ibG9ja2VkOwkvKiAgMT1JUlEgbm93IHVzZXMgYW55IHN1YmRldiAqLwotCWludCBpcnFfd2FzX25vd19jbG9zZWQ7CS8qICB3aGVuIElSUSBmaW5pc2gsIHRoZXJlJ3Mgc3RvcmVkIGludDgxOF9tb2RlIGZvciBsYXN0IGludGVycnVwdCAqLwotCWludCBhaV9tb2RlOwkJLyogIHdobyBub3cgdXNlcyBJUlEgLSAxPUFJMSBpbnQsIDI9QUkxIGRtYSwgMz1BSTMgaW50LCA0QUkzIGRtYSAqLwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpsYXN0X2ludF9zdWI7CS8qICBwdHIgdG8gc3ViZGV2aWNlIHdoaWNoIG5vdyBmaW5pc2ggKi8KIAlpbnQgYWlfYWN0X3NjYW47CS8qICBob3cgbWFueSBzY2FucyB3ZSBmaW5pc2hlZCAqLwogCWludCBhaV9hY3RfY2hhbjsJLyogIGFjdHVhbCBwb3NpdGlvbiBpbiBhY3R1YWwgc2NhbiAqLwogCXVuc2lnbmVkIGludCBhY3RfY2hhbmxpc3RbMTZdOwkvKiAgTVVYIHNldHRpbmcgZm9yIGFjdHVhbCBBSSBvcGVyYXRpb25zICovCiAJdW5zaWduZWQgaW50IGFjdF9jaGFubGlzdF9sZW47CS8qICBob3cgbG9uZyBpcyBhY3R1YWwgTVVYIGxpc3QgKi8KIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0X3BvczsJLyogIGFjdHVhbCBwb3NpdGlvbiBpbiBNVVggbGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9zY2FuczsJLyogIGxlbiBvZiBzY2FubGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9uX2NoYW47CS8qICBob3cgbWFueSBjaGFubmVscyBpcyBtZWFzdXJlZCAqLwotCXVuc2lnbmVkIGludCAqYWlfY2hhbmxpc3Q7CS8qICBhY3RhdWwgY2hhbmxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfZmxhZ3M7CS8qICBmbGFnbGlzdCAqLwogCXVuc2lnbmVkIGludCBhaV9kYXRhX2xlbjsJLyogIGxlbiBvZiBkYXRhIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGludCBhaV90aW1lcjE7CS8qICB0aW1lcnMgKi8KLQl1bnNpZ25lZCBpbnQgYWlfdGltZXIyOwotCXVuc2lnbmVkIGNoYXIgdXNlZmlmbzsJLyogIDE9dXNlIGZpZm8gKi8KIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07CisJdW5zaWduZWQgaW50IGRpdmlzb3IxOworCXVuc2lnbmVkIGludCBkaXZpc29yMjsKKwl1bnNpZ25lZCBpbnQgdXNlZmlmbzoxOworCXVuc2lnbmVkIGludCBhaV9jbWRfcnVubmluZzoxOworCXVuc2lnbmVkIGludCBhaV9jbWRfY2FuY2VsZWQ6MTsKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXV4b25lY2hhbltdID0geyAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LAkvKiAgdXNlZCBmb3IgZ2FpbiBsaXN0IHByb2dyYW1taW5nICovCi0JMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZgotfTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHNlZ2xlbik7Ci1zdGF0aWMgaW50IGNoZWNrX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKTsKLQotc3RhdGljIGludCBwY2w4MThfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotc3RhdGljIHZvaWQgc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IG1vZGUsCi0JCQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEsIHVuc2lnbmVkIGludCBkaXZpc29yMik7Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEFOQUxPRyBJTlBVVCBNT0RFMCwgODE4IGNhcmRzLCBzbG93IHZlcnNpb24KLSovCi1zdGF0aWMgaW50IHBjbDgxOF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlpbnQgbjsKLQlpbnQgdGltZW91dDsKLQotCS8qIHNvZnR3YXJlIHRyaWdnZXIsIERNQSBhbmQgSU5UIG9mZiAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0KLQkvKiBzZWxlY3QgY2hhbm5lbCAqLwotCW91dGIobXV4b25lY2hhbltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0sIGRldi0+aW9iYXNlICsgUENMODE4X01VWCk7Ci0KLQkvKiBzZWxlY3QgZ2FpbiAqLwotCW91dGIoQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9SQU5HRSk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0KLQkJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7Ci0KLQkJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKTsKLQotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVUykgJiAweDEwKQotCQkJCWdvdG8gY29udl9maW5pc2g7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXQiKTsKLQkJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7Ci0JCXJldHVybiAtRUlPOwotCi1jb252X2ZpbmlzaDoKLQkJZGF0YVtuXSA9ICgoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0hJKSA8PCA0KSB8Ci0JCQkgICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKSA+PiA0KSk7Ci0JfQotCi0JcmV0dXJuIG47Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEFOQUxPRyBPVVRQVVQgTU9ERTAsIDgxOCBjYXJkcwotICAgb25seSBvbmUgc2FtcGxlIHBlciBjYWxsIGlzIHN1cHBvcnRlZAotKi8KLXN0YXRpYyBpbnQgcGNsODE4X2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIHZvaWQgcGNsODE4X3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZF9jb3VudGVycykKIHsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG47Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxOF9USU1FUl9CQVNFOwogCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKLQkJZGF0YVtuXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJdWRlbGF5KDEpOwogCi0JcmV0dXJuIG47CisJaWYgKGxvYWRfY291bnRlcnMpIHsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7CisJfQogfQogCi1zdGF0aWMgaW50IHBjbDgxOF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MThfYWlfc2V0dXBfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtuXTsKLQkJb3V0YigoZGF0YVtuXSAmIDB4MDAwZikgPDwgNCwgZGV2LT5pb2Jhc2UgKwotCQkgICAgIChjaGFuID8gUENMNzE4X0RBMl9MTyA6IFBDTDgxOF9EQV9MTykpOwotCQlvdXRiKChkYXRhW25dICYgMHgwZmYwKSA+PiA0LCBkZXYtPmlvYmFzZSArCi0JCSAgICAgKGNoYW4gPyBQQ0w3MThfREEyX0hJIDogUENMODE4X0RBX0hJKSk7Ci0JfQotCi0JcmV0dXJuIG47Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIERJR0lUQUwgSU5QVVQgTU9ERTAsIDgxOCBjYXJkcwotCi0gICBvbmx5IG9uZSBzYW1wbGUgcGVyIGNhbGwgaXMgc3VwcG9ydGVkCi0qLwotc3RhdGljIGludCBwY2w4MThfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9ESV9MTykgfAotCSAgICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0RJX0hJKSA8PCA4KTsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IHBjbDgxOF9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgewotCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fTE8pOwotCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fSEkpOwotCX0KLQotCWRhdGFbMV0gPSBzLT5zdGF0ZTsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgaW50ZXJydXB0IG1vZGUgMSAmIDMsIDgxOCBjYXJkcwotICAgb25lIHNhbXBsZSBwZXIgaW50ZXJydXB0IHZlcnNpb24KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfaW50KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKLQl1bnNpZ25lZCBjaGFyIGxvdzsKLQlpbnQgdGltZW91dCA9IDUwOwkvKiB3YWl0IG1heCA1MHVzICovCi0KLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCWlmIChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfU1RBVFVTKSAmIDB4MTApCi0JCQlnb3RvIGNvbnZfZmluaXNoOwotCQl1ZGVsYXkoMSk7Ci0JfQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfU1RBVFVTKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgSVJRIHdpdGhvdXQgRFJEWSEiKTsKLQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0Jcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQotY29udl9maW5pc2g6Ci0JbG93ID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKTsKLQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgKChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQURfSEkpIDw8IDQpIHwgKGxvdyA+PiA0KSkpOwkvKiAgZ2V0IG9uZSBzYW1wbGUgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQlpZiAoKGxvdyAmIDB4ZikgIT0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKSB7CS8qICBkcm9wb3V0ISAqLwotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJIkEvRCBtb2RlMS8zIElSUSAtIGNoYW5uZWwgZHJvcG91dCAleCE9JXggIVxuIiwKLQkJCShsb3cgJiAweGYpLAotCQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKTsKLQkJcGNsODE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKLQlpZiAoZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA+PSBkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuKQotCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQotCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCWRldnByaXYtPmFpX2FjdF9zY2FuLS07Ci0JfQotCi0JaWYgKCFkZXZwcml2LT5uZXZlcmVuZGluZ19haSkgewotCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPT0gMCkgewkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCX0KLQl9Ci0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgZG1hIG1vZGUgMSAmIDMsIDgxOCBjYXJkcwotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODE4X2FpX21vZGUxM19kbWEoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwotCWludCBpLCBsZW4sIGJ1ZnB0cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHNob3J0ICpwdHI7Ci0KLQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7Ci0JaWYgKChkZXZwcml2LT5kbWFfcnVuc190b19lbmQpID4gLTEgfHwgZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpIHsJLyogIHN3aXRjaCBkbWEgYnVmcyAqLwotCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLAotCQkJICAgICBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKLQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCB8fCBkZXZwcml2LT5uZXZlcmVuZGluZ19haSkgewotCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCi0JCQkJICAgICAgZGV2cHJpdi0+aHdkbWFzaXplW2RldnByaXYtPgotCQkJCQkJCSBuZXh0X2RtYV9idWZdKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5sYXN0X2RtYV9ydW4pOwotCQl9Ci0JCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwotCQllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JfQotCi0JZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCXB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldnByaXYtPmRtYWJ1ZlsxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmXTsKLQotCWxlbiA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXSA+PiAxOwotCWJ1ZnB0ciA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKChwdHJbYnVmcHRyXSAmIDB4ZikgIT0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKSB7CS8qICBkcm9wb3V0ISAqLwotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkiQS9EIG1vZGUxLzMgRE1BIC0gY2hhbm5lbCBkcm9wb3V0ICVkKGNhcmQpIT0lZChjaGFubGlzdCkgYXQgJWQgIVxuIiwKLQkJCQkocHRyW2J1ZnB0cl0gJiAweGYpLAotCQkJCWRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXSwKLQkJCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zKTsKLQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0KLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHB0cltidWZwdHIrK10gPj4gNCk7CS8qICBnZXQgb25lIHNhbXBsZSAqLwotCi0JCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKLQkJaWYgKGRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPj0gZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbikKLQkJCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOwotCi0JCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQkJCWRldnByaXYtPmFpX2FjdF9zY2FuLS07Ci0JCX0KLQotCQlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKQotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID09IDApIHsJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQkJfQotCX0KLQotCWlmIChsZW4gPiAwKQotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGFuYWxvZyBpbnB1dCBpbnRlcnJ1cHQgbW9kZSAxICYgMywgODE4SEQvSEcgY2FyZHMKLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfZmlmbyhpbnQgaXJxLCB2b2lkICpkKQotewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JaW50IGksIGxlbjsKLQl1bnNpZ25lZCBjaGFyIGxvOwotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOwkvKiAgY2xlYXIgZmlmbyBpbnQgcmVxdWVzdCAqLwotCi0JbG8gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfU1RBVFVTKTsKLQotCWlmIChsbyAmIDQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIEZJRk8gb3ZlcmZsb3chIik7Ci0JCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChsbyAmIDEpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIEZJRk8gaW50ZXJydXB0IHdpdGhvdXQgZGF0YSEiKTsKLQkJcGNsODE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGxvICYgMikKLQkJbGVuID0gNTEyOwotCWVsc2UKLQkJbGVuID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlsbyA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9EQVRBTE8pOwotCQlpZiAoKGxvICYgMHhmKSAhPSBkZXZwcml2LT5hY3RfY2hhbmxpc3RbZGV2cHJpdi0+YWN0X2NoYW5saXN0X3Bvc10pIHsJLyogIGRyb3BvdXQhICovCi0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJBL0QgbW9kZTEvMyBGSUZPIC0gY2hhbm5lbCBkcm9wb3V0ICVkIT0lZCAhXG4iLAotCQkJCShsbyAmIDB4ZiksCi0JCQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKTsKLQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0KLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIChsbyA+PiA0KSB8IChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfREFUQUhJKSA8PCA0KSk7CS8qICBnZXQgb25lIHNhbXBsZSAqLwotCi0JCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKLQkJaWYgKGRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPj0gZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbikKLQkJCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOwotCi0JCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQkJCWRldnByaXYtPmFpX2FjdF9zY2FuLS07Ci0JCX0KLQotCQlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKQotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID09IDApIHsJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQkJfQotCX0KLQotCWlmIChsZW4gPiAwKQotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBJTlQgcHJvY2VkdXJlCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTgoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0KLQlpZiAoIWRldi0+YXR0YWNoZWQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgInByZW1hdHVyZSBpbnRlcnJ1cHQiKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChkZXZwcml2LT5pcnFfYmxvY2tlZCAmJiBkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQpIHsKLQkJaWYgKChkZXZwcml2LT5uZXZlcmVuZGluZ19haSB8fCAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpICYmCi0JCQkJCQkgZGV2cHJpdi0+YWlfYWN0X3NjYW4gPiAwKSkgJiYKLQkJICAgIChkZXZwcml2LT5haV9tb2RlID09IElOVF9UWVBFX0FJMV9ETUEgfHwKLQkJICAgICBkZXZwcml2LT5haV9tb2RlID09IElOVF9UWVBFX0FJM19ETUEpKSB7Ci0JCQkvKiBUaGUgY2xlYW51cCBmcm9tIGFpX2NhbmNlbCgpIGhhcyBiZWVuIGRlbGF5ZWQKLQkJCSAgIHVudGlsIG5vdyBiZWNhdXNlIHRoZSBjYXJkIGRvZXNuJ3Qgc2VlbSB0byBsaWtlCi0JCQkgICBiZWluZyByZXByb2dyYW1tZWQgd2hpbGUgYSBETUEgdHJhbnNmZXIgaXMgaW4KLQkJCSAgIHByb2dyZXNzLgotCQkJICovCi0JCQlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7Ci0JCQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDA7Ci0JCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgZGV2LT5yZWFkX3N1YmRldik7Ci0JCX0KLQotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXN3aXRjaCAoZGV2cHJpdi0+YWlfbW9kZSkgewotCWNhc2UgSU5UX1RZUEVfQUkxX0RNQToKLQljYXNlIElOVF9UWVBFX0FJM19ETUE6Ci0JCXJldHVybiBpbnRlcnJ1cHRfcGNsODE4X2FpX21vZGUxM19kbWEoaXJxLCBkKTsKLQljYXNlIElOVF9UWVBFX0FJMV9JTlQ6Ci0JY2FzZSBJTlRfVFlQRV9BSTNfSU5UOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfaW50KGlycSwgZCk7Ci0JY2FzZSBJTlRfVFlQRV9BSTFfRklGTzoKLQljYXNlIElOVF9UWVBFX0FJM19GSUZPOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfZmlmbyhpcnEsIGQpOwotI2lmZGVmIFBDTDgxOF9NT0RFMTNfQU8KLQljYXNlIElOVF9UWVBFX0FPMV9JTlQ6Ci0JY2FzZSBJTlRfVFlQRV9BTzNfSU5UOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9hb19tb2RlMTNfaW50KGlycSwgZCk7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQlpZiAoIWRldnByaXYtPmlycV9ibG9ja2VkIHx8ICFkZXZwcml2LT5haV9tb2RlKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJiYWQgSVJRISIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlISIpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQU5BTE9HIElOUFVUIE1PREUgMSBvciAzIERNQSAsIDgxOCBjYXJkcwotKi8KLXN0YXRpYyB2b2lkIHBjbDgxOF9haV9tb2RlMTNkbWFfaW50KGludCBtb2RlLCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCXVuc2lnbmVkIGludCBmbGFnczsKIAl1bnNpZ25lZCBpbnQgYnl0ZXM7CiAKIAlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwkvKiAgZGlzYWJsZSBkbWEgKi8KLQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKSB7Ci0JCWJ5dGVzID0gZGV2cHJpdi0+YWlfbl9jaGFuICogZGV2cHJpdi0+YWlfc2NhbnMgKiBzaXplb2Yoc2hvcnQpOwkvKiAgaG93IG1hbnkgKi8KLQkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gYnl0ZXMgLyBkZXZwcml2LT5od2RtYXNpemVbMF07CS8qICBob3cgbWFueSBETUEgcGFnZXMgd2UgbXVzdCBmaWlsICovCi0JCWRldnByaXYtPmxhc3RfZG1hX3J1biA9IGJ5dGVzICUgZGV2cHJpdi0+aHdkbWFzaXplWzBdOwkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCisJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlieXRlcyA9IGNtZC0+Y2hhbmxpc3RfbGVuICogY21kLT5zdG9wX2FyZyAqIHNpemVvZihzaG9ydCk7CisJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IGJ5dGVzIC8gZGV2cHJpdi0+aHdkbWFzaXplOworCQlkZXZwcml2LT5sYXN0X2RtYV9ydW4gPSBieXRlcyAlIGRldnByaXYtPmh3ZG1hc2l6ZTsKIAkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07CiAJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPj0gMCkKLQkJCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOworCQkJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CiAJfQogCiAJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMDsKQEAgLTc1OSwxMzMgKzM2OSwzMTAgQEAKIAlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgYnl0ZXMpOwogCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQotCWlmIChtb2RlID09IDEpIHsKLQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJMV9ETUE7Ci0JCW91dGIoMHg4NyB8IChkZXYtPmlycSA8PCA0KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7CS8qIFBhY2VyK0lSUStETUEgKi8KLQl9IGVsc2UgewotCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkzX0RNQTsKLQkJb3V0YigweDg2IHwgKGRldi0+aXJxIDw8IDQpLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsJLyogRXh0IHRyaWcrSVJRK0RNQSAqLwotCX0KIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQU5BTE9HIElOUFVUIE1PREUgMSBvciAzLCA4MTggY2FyZHMKLSovCi1zdGF0aWMgaW50IHBjbDgxOF9haV9jbWRfbW9kZShpbnQgbW9kZSwgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIHZvaWQgcGNsODE4X2FpX3NldHVwX25leHRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwotCWludCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKLQl1bnNpZ25lZCBpbnQgc2VnbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoZGV2cHJpdi0+aXJxX2Jsb2NrZWQpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlzdGFydF9wYWNlcihkZXYsIC0xLCAwLCAwKTsJLyogIHN0b3AgcGFjZXIgKi8KLQotCXNlZ2xlbiA9IGNoZWNrX2NoYW5uZWxfbGlzdChkZXYsIHMsIGRldnByaXYtPmFpX2NoYW5saXN0LAotCQkJCSAgICBkZXZwcml2LT5haV9uX2NoYW4pOwotCWlmIChzZWdsZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzZXR1cF9jaGFubmVsX2xpc3QoZGV2LCBzLCBkZXZwcml2LT5haV9jaGFubGlzdCwKLQkJCSAgIGRldnByaXYtPmFpX25fY2hhbiwgc2VnbGVuKTsKLQotCXVkZWxheSgxKTsKLQotCWRldnByaXYtPmFpX2FjdF9zY2FuID0gZGV2cHJpdi0+YWlfc2NhbnM7Ci0JZGV2cHJpdi0+YWlfYWN0X2NoYW4gPSAwOwotCWRldnByaXYtPmlycV9ibG9ja2VkID0gMTsKLQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAwOwotCWRldnByaXYtPm5ldmVyZW5kaW5nX2FpID0gMDsKLQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAwOwotCi0JaWYgKChkZXZwcml2LT5haV9zY2FucyA9PSAwKSB8fCAoZGV2cHJpdi0+YWlfc2NhbnMgPT0gLTEpKQotCQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDE7CS8qIHdlbGwsIHVzZXIgd2FudCBuZXZlcmVuZGluZyAqLwotCi0JaWYgKG1vZGUgPT0gMSkgewotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmk4MjUzX29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAotCQkJCQkgICZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkgIFRSSUdfUk9VTkRfTkVBUkVTVCk7Ci0JCWlmIChkaXZpc29yMSA9PSAxKSB7CS8qIFBDTDcxOC84MTggY3Jhc2ggaWYgYW55IGRpdmlzb3IgaXMgc2V0IHRvIDEgKi8KLQkJCWRpdmlzb3IxID0gMjsKLQkJCWRpdmlzb3IyIC89IDI7Ci0JCX0KLQkJaWYgKGRpdmlzb3IyID09IDEpIHsKLQkJCWRpdmlzb3IyID0gMjsKLQkJCWRpdmlzb3IxIC89IDI7Ci0JCX0KKwlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOworCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7CisJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA+IC0xIHx8IGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKSB7CisJCS8qIHN3aXRjaCBkbWEgYnVmcyAqLworCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKKwkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLAorCQkJICAgICBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCB8fCBjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkKKwkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXNpemUpOworCQllbHNlCisJCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAl9CiAKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRSk7CS8qIGVuYWJsZSBwYWNlciAqLwotCi0Jc3dpdGNoIChkZXZwcml2LT5kbWEpIHsKLQljYXNlIDE6CQkvKiAgRE1BICovCi0JY2FzZSAzOgotCQlwY2w4MThfYWlfbW9kZTEzZG1hX2ludChtb2RlLCBkZXYsIHMpOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCWlmICghZGV2cHJpdi0+dXNlZmlmbykgewotCQkJLyogSVJRICovCi0JCQlpZiAobW9kZSA9PSAxKSB7Ci0JCQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJMV9JTlQ7Ci0JCQkJLyogUGFjZXIrSVJRICovCi0JCQkJb3V0YigweDgzIHwgKGRldi0+aXJxIDw8IDQpLAotCQkJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0JCQl9IGVsc2UgewotCQkJCWRldnByaXYtPmFpX21vZGUgPSBJTlRfVFlQRV9BSTNfSU5UOwotCQkJCS8qIEV4dCB0cmlnK0lSUSAqLwotCQkJCW91dGIoMHg4MiB8IChkZXYtPmlycSA8PCA0KSwKLQkJCQkgICAgIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogRklGTyAqLwotCQkJLyogZW5hYmxlIEZJRk8gKi8KLQkJCW91dGIoMSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRU5BQkxFKTsKLQkJCWlmIChtb2RlID09IDEpIHsKLQkJCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkxX0ZJRk87Ci0JCQkJLyogUGFjZXIgKi8KLQkJCQlvdXRiKDB4MDMsIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkzX0ZJRk87Ci0JCQkJb3V0YigweDAyLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXJ0X3BhY2VyKGRldiwgbW9kZSwgZGl2aXNvcjEsIGRpdmlzb3IyKTsKLQotCXJldHVybiAwOworCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gU3RhcnQvc3RvcCBwYWNlciBvbmJvYXJkIHBhY2VyCi0qLwotc3RhdGljIHZvaWQgc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IG1vZGUsCi0JCQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEsIHVuc2lnbmVkIGludCBkaXZpc29yMikKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXRfY2hhbl9yYW5nZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UpCiB7Ci0Jb3V0YigweGI0LCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJDVEwpOwotCW91dGIoMHg3NCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSQ1RMKTsKKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENMODE4X01VWF9SRUcpOworCW91dGIocmFuZ2UsIGRldi0+aW9iYXNlICsgUENMODE4X1JBTkdFX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXRfY2hhbl9zY2FuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBmaXJzdF9jaGFuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbGFzdF9jaGFuKQoreworCW91dGIoUENMODE4X01VWF9TQ0FOKGZpcnN0X2NoYW4sIGxhc3RfY2hhbiksCisJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxOF9NVVhfUkVHKTsKK30KKworc3RhdGljIHZvaWQgcGNsODE4X2FpX3NldHVwX2NoYW5saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNlZ2xlbikKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGZpcnN0X2NoYW4gPSBDUl9DSEFOKGNoYW5saXN0WzBdKTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jaGFuOworCXVuc2lnbmVkIGludCByYW5nZTsKKwlpbnQgaTsKKworCWRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4gPSBzZWdsZW47CisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7CisKKwkvKiBzdG9yZSByYW5nZSBsaXN0IHRvIGNhcmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VnbGVuOyBpKyspIHsKKwkJbGFzdF9jaGFuID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisJCXJhbmdlID0gQ1JfUkFOR0UoY2hhbmxpc3RbaV0pOworCisJCWRldnByaXYtPmFjdF9jaGFubGlzdFtpXSA9IGxhc3RfY2hhbjsKKworCQlwY2w4MThfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBsYXN0X2NoYW4sIHJhbmdlKTsKKwl9CisKIAl1ZGVsYXkoMSk7CiAKLQlpZiAobW9kZSA9PSAxKSB7Ci0JCW91dGIoZGl2aXNvcjIgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFIyKTsKLQkJb3V0YigoZGl2aXNvcjIgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFIyKTsKLQkJb3V0YihkaXZpc29yMSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUjEpOwotCQlvdXRiKChkaXZpc29yMSA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUjEpOworCXBjbDgxOF9haV9zZXRfY2hhbl9zY2FuKGRldiwgZmlyc3RfY2hhbiwgbGFzdF9jaGFuKTsKK30KKworc3RhdGljIHZvaWQgcGNsODE4X2FpX2NsZWFyX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIHdyaXRpbmcgYW55IHZhbHVlIGNsZWFycyB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVU19SRUcpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfYWlfc29mdF90cmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogd3JpdGluZyBhbnkgdmFsdWUgdHJpZ2dlcnMgYSBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BSV9MU0JfUkVHKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwY2w4MThfYWlfZ2V0X2ZpZm9fc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmNoYW4pCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9EQVRBTE8pOworCXZhbCB8PSAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0RBVEFISSkgPDwgOCk7CisKKwlpZiAoY2hhbikKKwkJKmNoYW4gPSB2YWwgJiAweGY7CisKKwlyZXR1cm4gKHZhbCA+PiA0KSAmIHMtPm1heGRhdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNsODE4X2FpX2dldF9zYW1wbGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgdW5zaWduZWQgaW50ICpjaGFuKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQUlfTVNCX1JFRykgPDwgODsKKwl2YWwgfD0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FJX0xTQl9SRUcpOworCisJaWYgKGNoYW4pCisJCSpjaGFuID0gdmFsICYgMHhmOworCisJcmV0dXJuICh2YWwgPj4gNCkgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgaW50IHBjbDgxOF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIFBDTDgxOF9TVEFUVVNfSU5UKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgYm9vbCBwY2w4MThfYWlfZHJvcG91dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGV4cGVjdGVkX2NoYW47CisKKwlleHBlY3RlZF9jaGFuID0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdOworCWlmIChjaGFuICE9IGV4cGVjdGVkX2NoYW4pIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKKwkJCSJBL0QgbW9kZTEvMyAlcyAtIGNoYW5uZWwgZHJvcG91dCAlZCE9JWQgIVxuIiwKKwkJCShkZXZwcml2LT5kbWEpID8gIkRNQSIgOgorCQkJKGRldnByaXYtPnVzZWZpZm8pID8gIkZJRk8iIDogIklSUSIsCisJCQljaGFuLCBleHBlY3RlZF9jaGFuKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwY2w4MThfYWlfbmV4dF9jaGFuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcysrOworCWlmIChkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID49IGRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4pCisJCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOworCisJcy0+YXN5bmMtPmN1cl9jaGFuKys7CisJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBjbWQtPmNoYW5saXN0X2xlbikgeworCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCQlkZXZwcml2LT5haV9hY3Rfc2Nhbi0tOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJiBkZXZwcml2LT5haV9hY3Rfc2NhbiA9PSAwKSB7CisJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9oYW5kbGVfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKHBjbDgxOF9haV9lb2MoZGV2LCBzLCBOVUxMLCAwKSkgeworCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgSVJRIHdpdGhvdXQgRFJEWSEiKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm47CisJfQorCisJdmFsID0gcGNsODE4X2FpX2dldF9zYW1wbGUoZGV2LCBzLCAmY2hhbik7CisKKwlpZiAocGNsODE4X2FpX2Ryb3BvdXQoZGV2LCBzLCBjaGFuKSkKKwkJcmV0dXJuOworCisJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHZhbCk7CisKKwlwY2w4MThfYWlfbmV4dF9jaGFuKGRldiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9oYW5kbGVfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgc2hvcnQgKnB0cjsKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpLCBsZW4sIGJ1ZnB0cjsKKworCXBjbDgxOF9haV9zZXR1cF9uZXh0X2RtYShkZXYsIHMpOworCisJcHRyID0gKHVuc2lnbmVkIHNob3J0ICopZGV2cHJpdi0+ZG1hYnVmWzEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWZdOworCisJbGVuID0gZGV2cHJpdi0+aHdkbWFzaXplID4+IDE7CisJYnVmcHRyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl2YWwgPSBwdHJbYnVmcHRyKytdOworCQljaGFuID0gdmFsICYgMHhmOworCQl2YWwgPSAodmFsID4+IDQpICYgcy0+bWF4ZGF0YTsKKworCQlpZiAocGNsODE4X2FpX2Ryb3BvdXQoZGV2LCBzLCBjaGFuKSkKKwkJCWJyZWFrOworCisJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCB2YWwpOworCisJCWlmICghcGNsODE4X2FpX25leHRfY2hhbihkZXYsIHMpKQorCQkJYnJlYWs7CiAJfQogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gQ2hlY2sgaWYgY2hhbm5lbCBsaXN0IGZyb20gdXNlciBpcyBidWlsZGVkIGNvcnJlY3RseQotIElmIGl0J3Mgb2ssIHRoZW4gcHJvZ3JhbSBzY2FuL2dhaW4gbG9naWMKLSovCitzdGF0aWMgdm9pZCBwY2w4MThfaGFuZGxlX2ZpZm8oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBjaGFuOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGksIGxlbjsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIDQpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIEZJRk8gb3ZlcmZsb3chIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMgJiAxKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgbW9kZTEvMyBGSUZPIGludGVycnVwdCB3aXRob3V0IGRhdGEhIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMgJiAyKQorCQlsZW4gPSA1MTI7CisJZWxzZQorCQlsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXZhbCA9IHBjbDgxOF9haV9nZXRfZmlmb19zYW1wbGUoZGV2LCBzLCAmY2hhbik7CisKKwkJaWYgKHBjbDgxOF9haV9kcm9wb3V0KGRldiwgcywgY2hhbikpCisJCQlicmVhazsKKworCQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgdmFsKTsKKworCQlpZiAoIXBjbDgxOF9haV9uZXh0X2NoYW4oZGV2LCBzKSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHBjbDgxOF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCisJaWYgKCFkZXYtPmF0dGFjaGVkIHx8ICFkZXZwcml2LT5haV9jbWRfcnVubmluZykgeworCQlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkKSB7CisJCS8qCisJCSAqIFRoZSBjbGVhbnVwIGZyb20gYWlfY2FuY2VsKCkgaGFzIGJlZW4gZGVsYXllZAorCQkgKiB1bnRpbCBub3cgYmVjYXVzZSB0aGUgY2FyZCBkb2Vzbid0IHNlZW0gdG8gbGlrZQorCQkgKiBiZWluZyByZXByb2dyYW1tZWQgd2hpbGUgYSBETUEgdHJhbnNmZXIgaXMgaW4KKwkJICogcHJvZ3Jlc3MuCisJCSAqLworCQlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7CisJCXMtPmNhbmNlbChkZXYsIHMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRldnByaXYtPmRtYSkKKwkJcGNsODE4X2hhbmRsZV9kbWEoZGV2LCBzKTsKKwllbHNlIGlmIChkZXZwcml2LT51c2VmaWZvKQorCQlwY2w4MThfaGFuZGxlX2ZpZm8oZGV2LCBzKTsKKwllbHNlCisJCXBjbDgxOF9oYW5kbGVfZW9jKGRldiwgcyk7CisKKwlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CisKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbikKQEAgLTk0MSw1MiArNzI4LDIwIEBACiAJcmV0dXJuIHNlZ2xlbjsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2VnbGVuKQotewotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaTsKLQotCWRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4gPSBzZWdsZW47Ci0JZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2VnbGVuOyBpKyspIHsJLyogIHN0b3JlIHJhbmdlIGxpc3QgdG8gY2FyZCAqLwotCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RbaV0gPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKLQkJb3V0YihtdXhvbmVjaGFuW0NSX0NIQU4oY2hhbmxpc3RbaV0pXSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfTVVYKTsJLyogc2VsZWN0IGNoYW5uZWwgKi8KLQkJb3V0YihDUl9SQU5HRShjaGFubGlzdFtpXSksIGRldi0+aW9iYXNlICsgUENMODE4X1JBTkdFKTsJLyogc2VsZWN0IGdhaW4gKi8KLQl9Ci0KLQl1ZGVsYXkoMSk7Ci0KLQkvKiBzZWxlY3QgY2hhbm5lbCBpbnRlcnZhbCB0byBzY2FuICovCi0Jb3V0YihkZXZwcml2LT5hY3RfY2hhbmxpc3RbMF0gfCAoZGV2cHJpdi0+YWN0X2NoYW5saXN0W3NlZ2xlbiAtCi0JCQkJCQkJICAgICAgIDFdIDw8IDQpLAotCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfTVVYKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIENoZWNrIGlmIGJvYXJkIGlzIHN3aXRjaGVkIHRvIFNFICgxKSBvciBESUZGKDApIG1vZGUKLSovCiBzdGF0aWMgaW50IGNoZWNrX3NpbmdsZV9lbmRlZCh1bnNpZ25lZCBpbnQgcG9ydCkKIHsKLQlpZiAoaW5iKHBvcnQgKyBQQ0w4MThfU1RBVFVTKSAmIDB4MjApCisJaWYgKGluYihwb3J0ICsgUENMODE4X1NUQVRVU19SRUcpICYgUENMODE4X1NUQVRVU19NVVgpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIGludCBhaV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOworCWludCB0bXA7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKQEAgLTEwMzUsNyArNzkwLDggQEAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7CiAJCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2cHJpdi0+aTgyNTNfb3NjX2Jhc2UsCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCisJCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKIAkJCQkJICAmY21kLT5jb252ZXJ0X2FyZywgY21kLT5mbGFncyk7CiAJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgYm9hcmQtPm5zX21pbikKIAkJCWNtZC0+Y29udmVydF9hcmcgPSBib2FyZC0+bnNfbWluOwpAQCAtMTA1NywxNTIgKzgxMywyNzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIGludCBwY2w4MThfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKLQlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCBjdHJsID0gMDsKKwl1bnNpZ25lZCBpbnQgc2VnbGVuOwogCi0JZGV2cHJpdi0+YWlfbl9jaGFuID0gY21kLT5jaGFubGlzdF9sZW47Ci0JZGV2cHJpdi0+YWlfY2hhbmxpc3QgPSBjbWQtPmNoYW5saXN0OwotCWRldnByaXYtPmFpX2ZsYWdzID0gY21kLT5mbGFnczsKKwlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlwY2w4MThfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisKKwlzZWdsZW4gPSBjaGVja19jaGFubmVsX2xpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBjbWQtPmNoYW5saXN0X2xlbik7CisJaWYgKHNlZ2xlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCXBjbDgxOF9haV9zZXR1cF9jaGFubGlzdChkZXYsIGNtZC0+Y2hhbmxpc3QsIHNlZ2xlbik7CisKIAlkZXZwcml2LT5haV9kYXRhX2xlbiA9IHMtPmFzeW5jLT5wcmVhbGxvY19idWZzejsKLQlkZXZwcml2LT5haV90aW1lcjEgPSAwOwotCWRldnByaXYtPmFpX3RpbWVyMiA9IDA7CisJZGV2cHJpdi0+YWlfYWN0X3NjYW4gPSBjbWQtPnN0b3BfYXJnOworCWRldnByaXYtPmFpX2FjdF9jaGFuID0gMDsKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDE7CisJZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkID0gMDsKKwlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKKwlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAwOwogCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZGV2cHJpdi0+YWlfc2NhbnMgPSBjbWQtPnN0b3BfYXJnOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCisJCWN0cmwgfD0gUENMODE4X0NUUkxfUEFDRVJfVFJJRzsKIAllbHNlCi0JCWRldnByaXYtPmFpX3NjYW5zID0gMDsKKwkJY3RybCB8PSBQQ0w4MThfQ1RSTF9FWFRfVFJJRzsKIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CS8qICBtb2RlIDEsIDMgKi8KLQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewkvKiAgbW9kZSAxICovCi0JCQlkZXZwcml2LT5haV90aW1lcjEgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQkJcmV0dmFsID0gcGNsODE4X2FpX2NtZF9tb2RlKDEsIGRldiwgcyk7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CS8qICBtb2RlIDMgKi8KLQkJCXJldHVybiBwY2w4MThfYWlfY21kX21vZGUoMywgZGV2LCBzKTsKLQkJfQorCW91dGIoUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRV9SRUcpOworCisJaWYgKGRldnByaXYtPmRtYSkgeworCQlwY2w4MThfYWlfc2V0dXBfZG1hKGRldiwgcyk7CisKKwkJY3RybCB8PSBQQ0w4MThfQ1RSTF9JTlRFIHwgUENMODE4X0NUUkxfSVJRKGRldi0+aXJxKSB8CisJCQlQQ0w4MThfQ1RSTF9ETUFFOworCX0gZWxzZSBpZiAoZGV2cHJpdi0+dXNlZmlmbykgeworCQkvKiBlbmFibGUgRklGTyAqLworCQlvdXRiKDEsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0VOQUJMRSk7CisJfSBlbHNlIHsKKwkJY3RybCB8PSBQQ0w4MThfQ1RSTF9JTlRFIHwgUENMODE4X0NUUkxfSVJRKGRldi0+aXJxKTsKIAl9CisJb3V0YihjdHJsLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJMX1JFRyk7CiAKLQlyZXR1cm4gLTE7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKKwkJcGNsODE4X3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIGNhbmNlbCBhbnkgbW9kZSAxLTQgQUkKLSovCiBzdGF0aWMgaW50IHBjbDgxOF9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCi0JaWYgKGRldnByaXYtPmlycV9ibG9ja2VkID4gMCkgewotCQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAxOworCWlmICghZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCisJCXJldHVybiAwOwogCi0JCXN3aXRjaCAoZGV2cHJpdi0+YWlfbW9kZSkgewotCQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0RNQToKLQkJCWlmIChkZXZwcml2LT5uZXZlcmVuZGluZ19haSB8fAotCQkJICAgICghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgJiYKLQkJCSAgICAgZGV2cHJpdi0+YWlfYWN0X3NjYW4gPiAwKSkgewotCQkJCS8qIHdhaXQgZm9yIHJ1bm5pbmcgZG1hIHRyYW5zZmVyIHRvIGVuZCwgZG8gY2xlYW51cCBpbiBpbnRlcnJ1cHQgKi8KLQkJCQlnb3RvIGVuZDsKKwlpZiAoZGV2cHJpdi0+ZG1hKSB7CisJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSB8fAorCQkgICAgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJiBkZXZwcml2LT5haV9hY3Rfc2NhbiA+IDApKSB7CisJCQlpZiAoIWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCkgeworCQkJCS8qCisJCQkJKiBXYWl0IGZvciBydW5uaW5nIGRtYSB0cmFuc2ZlciB0byBlbmQsCisJCQkJKiBkbyBjbGVhbnVwIGluIGludGVycnVwdC4KKwkJCQkqLworCQkJCWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCA9IDE7CisJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCQljYXNlIElOVF9UWVBFX0FJMV9JTlQ6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJY2FzZSBJTlRfVFlQRV9BSTFfRklGTzoKLQkJY2FzZSBJTlRfVFlQRV9BSTNfRklGTzoKLSNpZmRlZiBQQ0w4MThfTU9ERTEzX0FPCi0JCWNhc2UgSU5UX1RZUEVfQU8xX0lOVDoKLQkJY2FzZSBJTlRfVFlQRV9BTzNfSU5UOgotI2VuZGlmCi0JCQlvdXRiKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKSAmIDB4NzMsIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwkvKiBTdG9wIEEvRCAqLwotCQkJdWRlbGF5KDEpOwotCQkJc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7Ci0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKTsKLQkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9MTyk7Ci0JCQlpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQURfSEkpOwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KLQkJCWlmIChkZXZwcml2LT51c2VmaWZvKSB7CS8qICBGSUZPIHNodXRkb3duICovCi0JCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOwotCQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRkxVU0gpOwotCQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRU5BQkxFKTsKLQkJCX0KLQkJCWRldnByaXYtPmlycV9ibG9ja2VkID0gMDsKLQkJCWRldnByaXYtPmxhc3RfaW50X3N1YiA9IHM7Ci0JCQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDA7Ci0JCQlkZXZwcml2LT5haV9tb2RlID0gMDsKLQkJCWRldnByaXYtPmlycV93YXNfbm93X2Nsb3NlZCA9IDA7Ci0JCQlicmVhazsKIAkJfQorCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwogCX0KIAotZW5kOgotCXJldHVybiAwOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gY2hlY2ggZm9yIFBDTDgxOAotKi8KLXN0YXRpYyBpbnQgcGNsODE4X2NoZWNrKHVuc2lnbmVkIGxvbmcgaW9iYXNlKQotewotCW91dGIoMHgwMCwgaW9iYXNlICsgUENMODE4X01VWCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE4X01VWCkgIT0gMHgwMCkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlvdXRiKDB4NTUsIGlvYmFzZSArIFBDTDgxOF9NVVgpOwotCXVkZWxheSgxKTsKLQlpZiAoaW5iKGlvYmFzZSArIFBDTDgxOF9NVVgpICE9IDB4NTUpCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0Jb3V0YigweDAwLCBpb2Jhc2UgKyBQQ0w4MThfTVVYKTsKLQl1ZGVsYXkoMSk7Ci0Jb3V0YigweDE4LCBpb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE4X0NPTlRST0wpICE9IDB4MTgpCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0JcmV0dXJuIDA7CQkvKiAgb2ssIGNhcmQgZXhpc3QgKi8KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIHJlc2V0IHdob2xlIFBDTC04MTggY2FyZHMKLSovCi1zdGF0aWMgdm9pZCBwY2w4MThfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlvdXRiKFBDTDgxOF9DVFJMX0RJU0FCTEVfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOworCXBjbDgxOF9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKKwlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CiAKIAlpZiAoZGV2cHJpdi0+dXNlZmlmbykgewkvKiAgRklGTyBzaHV0ZG93biAqLwogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0lOVENMUik7CiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRkxVU0gpOwogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0VOQUJMRSk7CiAJfQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfTE8pOwkvKiAgREFDPTBWICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9EQV9ISSk7Ci0JdWRlbGF5KDEpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fSEkpOwkvKiAgRE89JDAwMDAgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0xPKTsKLQl1ZGVsYXkoMSk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRSk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9NVVgpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ0xSSU5UKTsKLQlvdXRiKDB4YjAsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkNUTCk7CS8qIFN0b3AgcGFjZXIgKi8KLQlvdXRiKDB4NzAsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkNUTCk7Ci0Jb3V0YigweDMwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJDVEwpOworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlvdXRiKFBDTDgxOF9DVFJMX1NPRlRfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOworCisJcGNsODE4X2FpX3NldF9jaGFuX3JhbmdlKGRldiwgY2hhbiwgcmFuZ2UpOworCXBjbDgxOF9haV9zZXRfY2hhbl9zY2FuKGRldiwgY2hhbiwgY2hhbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXBjbDgxOF9haV9jbGVhcl9lb2MoZGV2KTsKKwkJcGNsODE4X2FpX3NvZnRfdHJpZyhkZXYpOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNsODE4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlkYXRhW2ldID0gcGNsODE4X2FpX2dldF9zYW1wbGUoZGV2LCBzLCBOVUxMKTsKKwl9CisJcGNsODE4X2FpX2NsZWFyX2VvYyhkZXYpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CisJCW91dGIoKGRhdGFbaV0gJiAweDAwMGYpIDw8IDQsCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQU9fTFNCX1JFRyhjaGFuKSk7CisJCW91dGIoKGRhdGFbaV0gJiAweDBmZjApID4+IDQsCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQU9fTVNCX1JFRyhjaGFuKSk7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MThfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX0xTQl9SRUcpIHwKKwkJICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX01TQl9SRUcpIDw8IDgpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKSB7CisJCW91dGIocy0+c3RhdGUgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ESV9MU0JfUkVHKTsKKwkJb3V0Yigocy0+c3RhdGUgPj4gOCksIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX01TQl9SRUcpOworCX0KKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOworCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODE4X1RJTUVSX0JBU0U7CisJdW5zaWduZWQgaW50IGNoYW47CisKKwkvKiBmbHVzaCBhbmQgZGlzYWJsZSB0aGUgRklGTyAqLworCWlmIChib2FyZC0+aGFzX2ZpZm8pIHsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0ZMVVNIKTsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9FTkFCTEUpOworCX0KKworCS8qIGRpc2FibGUgYW5hbG9nIGlucHV0IHRyaWdnZXIgKi8KKwlvdXRiKFBDTDgxOF9DVFJMX0RJU0FCTEVfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOworCXBjbDgxOF9haV9jbGVhcl9lb2MoZGV2KTsKKworCXBjbDgxOF9haV9zZXRfY2hhbl9yYW5nZShkZXYsIDAsIDApOworCisJLyogc3RvcCBwYWNlciAqLworCW91dGIoUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRV9SRUcpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCisJLyogc2V0IGFuYWxvZyBvdXRwdXQgY2hhbm5lbHMgdG8gMFYgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgYm9hcmQtPm5fYW9jaGFuOyBjaGFuKyspIHsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BT19MU0JfUkVHKGNoYW4pKTsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BT19NU0JfUkVHKGNoYW4pKTsKKwl9CisKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX01TQl9SRUcpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fRElfTFNCX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9zZXRfYWlfcmFuZ2VfdGFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKworCS8qIGRlZmF1bHQgdG8gdGhlIHJhbmdlIHRhYmxlIGZyb20gdGhlIGJvYXJkaW5mbyAqLworCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFpX3JhbmdlX3R5cGU7CisKKwkvKiBub3cgY2hlY2sgdGhlIHVzZXIgY29uZmlnIG9wdGlvbiBiYXNlZCBvbiB0aGUgYm9hcmR0eXBlICovCiAJaWYgKGJvYXJkLT5pc184MTgpIHsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9SQU5HRSk7CisJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxIHx8IGl0LT5vcHRpb25zWzRdID09IDEwKSB7CisJCQkvKiBzZWNvbmRhcnkgcmFuZ2UgbGlzdCBqdW1wZXIgc2VsZWN0YWJsZSAqLworCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODE4bF9oX2FpOworCQl9CiAJfSBlbHNlIHsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDcxOF9EQTJfTE8pOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMNzE4X0RBMl9ISSk7CisJCXN3aXRjaCAoaXQtPm9wdGlvbnNbNF0pIHsKKwkJY2FzZSAwOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXI1OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIyXzU7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfYmlwb2xhcjE7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfYmlwb2xhcjBfNTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmlwb2xhcjEwOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyNTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF91bmlwb2xhcjI7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfdW5pcG9sYXIxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCQkJYnJlYWs7CisJCX0KIAl9CiB9CiAKQEAgLTEyMTAsMTU0ICsxMDg2LDk2IEBACiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXY7Ci0JaW50IHJldDsKLQlpbnQgZG1hOwotCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldDsKKwlpbnQgaTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZXZwcml2LT5pb19yYW5nZSA9IGJvYXJkLT5pb19yYW5nZTsKLQlpZiAoKGJvYXJkLT5maWZvKSAmJiAoaXQtPm9wdGlvbnNbMl0gPT0gLTEpKSB7Ci0JCS8qICB3ZSd2ZSBib2FyZCB3aXRoIEZJRk8gYW5kIHdlIHdhbnQgdG8gdXNlIEZJRk8gKi8KLQkJZGV2cHJpdi0+aW9fcmFuZ2UgPSBQQ0x4MXhGSUZPX1JBTkdFOwotCQlkZXZwcml2LT51c2VmaWZvID0gMTsKLQl9Ci0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIGRldnByaXYtPmlvX3JhbmdlKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwKKwkJCQkgICAgYm9hcmQtPmhhc19maWZvID8gMHgyMCA6IDB4MTApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocGNsODE4X2NoZWNrKGRldi0+aW9iYXNlKSkgewotCQljb21lZGlfZXJyb3IoZGV2LCAiSSBjYW4ndCBkZXRlY3QgYm9hcmQuIEZBSUwhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCgxIDw8IGl0LT5vcHRpb25zWzFdKSAmIGJvYXJkLT5JUlFiaXRzKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBpbnRlcnJ1cHRfcGNsODE4LCAwLAorCS8qIHdlIGNhbiB1c2UgSVJRIDItNyBmb3IgYXN5bmMgY29tbWFuZCBzdXBwb3J0ICovCisJaWYgKGl0LT5vcHRpb25zWzFdID49IDIgJiYgaXQtPm9wdGlvbnNbMV0gPD0gNykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgcGNsODE4X2ludGVycnVwdCwgMCwKIAkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKIAkJaWYgKHJldCA9PSAwKQogCQkJZGV2LT5pcnEgPSBpdC0+b3B0aW9uc1sxXTsKIAl9CiAKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7CS8qIG51bWJlciBvZiBzdWJkZXZpY2Ugd2hpY2ggdXNlIElSUSAqLwotCWRldnByaXYtPmFpX21vZGUgPSAwOwkvKiBtb2RlIG9mIGlycSAqLworCS8qIHNob3VsZCB3ZSB1c2UgdGhlIEZJRk8/ICovCisJaWYgKGRldi0+aXJxICYmIGJvYXJkLT5oYXNfZmlmbyAmJiBpdC0+b3B0aW9uc1syXSA9PSAtMSkKKwkJZGV2cHJpdi0+dXNlZmlmbyA9IDE7CiAKLQkvKiBncmFiIG91ciBETUEgKi8KLQlkbWEgPSAwOwotCWRldnByaXYtPmRtYSA9IGRtYTsKLQlpZiAoIWRldi0+aXJxKQotCQlnb3RvIG5vX2RtYTsJLyogaWYgd2UgaGF2ZW4ndCBJUlEsIHdlIGNhbid0IHVzZSBETUEgKi8KLQlpZiAoYm9hcmQtPkRNQWJpdHMgIT0gMCkgewkvKiBib2FyZCBzdXBwb3J0IERNQSAqLwotCQlkbWEgPSBpdC0+b3B0aW9uc1syXTsKLQkJaWYgKGRtYSA8IDEpCi0JCQlnb3RvIG5vX2RtYTsJLyogRE1BIGRpc2FibGVkICovCi0JCWlmICgoKDEgPDwgZG1hKSAmIGJvYXJkLT5ETUFiaXRzKSA9PSAwKSB7CisJLyogd2UgbmVlZCBhbiBJUlEgdG8gZG8gRE1BIG9uIGNoYW5uZWwgMyBvciAxICovCisJaWYgKGRldi0+aXJxICYmIGJvYXJkLT5oYXNfZG1hICYmCisJICAgIChpdC0+b3B0aW9uc1syXSA9PSAzIHx8IGl0LT5vcHRpb25zWzJdID09IDEpKSB7CisJCXJldCA9IHJlcXVlc3RfZG1hKGl0LT5vcHRpb25zWzJdLCBkZXYtPmJvYXJkX25hbWUpOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJETUEgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIEZBSUwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwkvKiBCYWQgRE1BICovCi0JCX0KLQkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCBkZXYtPmJvYXJkX25hbWUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIC1FQlVTWTsJLyogRE1BIGlzbid0IGZyZWUgKi8KLQkJZGV2cHJpdi0+ZG1hID0gZG1hOwotCQlwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLwotCQlkZXZwcml2LT5kbWFidWZbMF0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlswXSkKLQkJCS8qIG1heWJlIGV4cGVyaW1lbnQgd2l0aCB0cnlfdG9fZnJlZV9wYWdlcygpIHdpbGwgaGVscCAuLi4uICovCi0JCQlyZXR1cm4gLUVCVVNZOwkvKiBubyBidWZmZXIgOi0oICovCi0JCWRldnByaXYtPmRtYXBhZ2VzWzBdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzBdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMF0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMF0gPSAoMSA8PCBwYWdlcykgKiBQQUdFX1NJWkU7Ci0JCWRldnByaXYtPmRtYWJ1ZlsxXSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlcyk7Ci0JCWlmICghZGV2cHJpdi0+ZG1hYnVmWzFdKQorCQkJCSJ1bmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCAlZFxuIiwKKwkJCQlpdC0+b3B0aW9uc1syXSk7CiAJCQlyZXR1cm4gLUVCVVNZOwotCQlkZXZwcml2LT5kbWFwYWdlc1sxXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clsxXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzFdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzFdID0gKDEgPDwgcGFnZXMpICogUEFHRV9TSVpFOwotCX0KKwkJfQorCQlkZXZwcml2LT5kbWEgPSBpdC0+b3B0aW9uc1syXTsKIAotbm9fZG1hOgorCQlkZXZwcml2LT5kbWFwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLworCQlkZXZwcml2LT5od2RtYXNpemUgPSAoMSA8PCBkZXZwcml2LT5kbWFwYWdlcykgKiBQQUdFX1NJWkU7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBkbWFidWY7CisKKwkJCWRtYWJ1ZiA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBkZXZwcml2LT5kbWFwYWdlcyk7CisJCQlpZiAoIWRtYWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGV2cHJpdi0+ZG1hYnVmW2ldID0gZG1hYnVmOworCQkJZGV2cHJpdi0+aHdkbWFwdHJbaV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRtYWJ1Zik7CisJCX0KKwl9CiAKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQlpZiAoIWJvYXJkLT5uX2FpY2hhbl9zZSkgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCWlmIChjaGVja19zaW5nbGVfZW5kZWQoZGV2LT5pb2Jhc2UpKSB7CisJCXMtPm5fY2hhbgk9IDE2OworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7CiAJfSBlbHNlIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7Ci0JCWlmIChjaGVja19zaW5nbGVfZW5kZWQoZGV2LT5pb2Jhc2UpKSB7Ci0JCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fc2U7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7Ci0JCX0gZWxzZSB7Ci0JCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fZGlmZjsKLQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfRElGRjsKLQkJfQotCQlzLT5tYXhkYXRhID0gYm9hcmQtPmFpX21heGRhdGE7Ci0JCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFpX3JhbmdlX3R5cGU7Ci0JCXMtPmluc25fcmVhZCA9IHBjbDgxOF9haV9pbnNuX3JlYWQ7Ci0JCWlmIChkZXYtPmlycSkgewotCQkJZGV2LT5yZWFkX3N1YmRldiA9IHM7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOwotCQkJcy0+bGVuX2NoYW5saXN0ID0gcy0+bl9jaGFuOwotCQkJcy0+ZG9fY21kdGVzdCA9IGFpX2NtZHRlc3Q7Ci0JCQlzLT5kb19jbWQgPSBhaV9jbWQ7Ci0JCQlzLT5jYW5jZWwgPSBwY2w4MThfYWlfY2FuY2VsOwotCQl9Ci0JCWlmIChib2FyZC0+aXNfODE4KSB7Ci0JCQlpZiAoKGl0LT5vcHRpb25zWzRdID09IDEpIHx8IChpdC0+b3B0aW9uc1s0XSA9PSAxMCkpCi0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODE4bF9oX2FpOwkvKiAgc2Vjb25kYXJ5IHJhbmdlIGxpc3QganVtcGVyIHNlbGVjdGFibGUgKi8KLQkJfSBlbHNlIHsKLQkJCXN3aXRjaCAoaXQtPm9wdGlvbnNbNF0pIHsKLQkJCWNhc2UgMDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjJfNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF9iaXBvbGFyMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF9iaXBvbGFyMF81OwotCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyMTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5pcG9sYXI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlNzE4X3VuaXBvbGFyMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgOToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF91bmlwb2xhcjE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJcy0+bl9jaGFuCT0gODsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9ESUZGOworCX0KKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCisJcGNsODE4X3NldF9haV9yYW5nZV90YWJsZShkZXYsIHMsIGl0KTsKKworCXMtPmluc25fcmVhZAk9IHBjbDgxOF9haV9pbnNuX3JlYWQ7CisJaWYgKGRldi0+aXJxKSB7CisJCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0NNRF9SRUFEOworCQlzLT5sZW5fY2hhbmxpc3QJPSBzLT5uX2NoYW47CisJCXMtPmRvX2NtZHRlc3QJPSBhaV9jbWR0ZXN0OworCQlzLT5kb19jbWQJPSBwY2w4MThfYWlfY21kOworCQlzLT5jYW5jZWwJPSBwY2w4MThfYWlfY2FuY2VsOwogCX0KIAorCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07Ci0JaWYgKCFib2FyZC0+bl9hb2NoYW4pIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKLQl9IGVsc2UgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FvY2hhbjsKLQkJcy0+bWF4ZGF0YSA9IGJvYXJkLT5hb19tYXhkYXRhOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5hb19yYW5nZV90eXBlOwotCQlzLT5pbnNuX3JlYWQgPSBwY2w4MThfYW9faW5zbl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlID0gcGNsODE4X2FvX2luc25fd3JpdGU7CisJaWYgKGJvYXJkLT5uX2FvY2hhbikgeworCQlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FPOworCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4JPSBib2FyZC0+bl9hb2NoYW47CisJCXMtPm1heGRhdGEJPSAweDBmZmY7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3VuaXBvbGFyNTsKKwkJcy0+aW5zbl9yZWFkCT0gcGNsODE4X2FvX2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZQk9IHBjbDgxOF9hb19pbnNuX3dyaXRlOwogCQlpZiAoYm9hcmQtPmlzXzgxOCkgewogCQkJaWYgKChpdC0+b3B0aW9uc1s0XSA9PSAxKSB8fCAoaXQtPm9wdGlvbnNbNF0gPT0gMTApKQogCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyMTA7CkBAIC0xMzY5LDMxICsxMTg3LDI3IEBACiAJCQlpZiAoaXQtPm9wdGlvbnNbNV0gPT0gMikKIAkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOwogCQl9CisJfSBlbHNlIHsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCisJLyogRGlnaXRhbCBJbnB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKLQlpZiAoIWJvYXJkLT5uX2RpY2hhbikgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwotCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kaWNoYW47Ci0JCXMtPm1heGRhdGEgPSAxOwotCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pbnNuX2JpdHMgPSBwY2w4MThfZGlfaW5zbl9iaXRzOwotCX0KKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IHBjbDgxOF9kaV9pbnNuX2JpdHM7CiAKKwkvKiBEaWdpdGFsIE91dHB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1szXTsKLQlpZiAoIWJvYXJkLT5uX2RvY2hhbikgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwotCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kb2NoYW47Ci0JCXMtPm1heGRhdGEgPSAxOwotCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pbnNuX2JpdHMgPSBwY2w4MThfZG9faW5zbl9iaXRzOwotCX0KKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IHBjbDgxOF9kb19pbnNuX2JpdHM7CiAKIAkvKiBzZWxlY3QgMS8xME1IeiBvc2NpbGF0b3IgKi8KIAlpZiAoKGl0LT5vcHRpb25zWzNdID09IDApIHx8IChpdC0+b3B0aW9uc1szXSA9PSAxMCkpCkBAIC0xNDI0LDM4ICsxMjM4LDEzIEBACiAJCWlmIChkZXZwcml2LT5kbWEpCiAJCQlmcmVlX2RtYShkZXZwcml2LT5kbWEpOwogCQlpZiAoZGV2cHJpdi0+ZG1hYnVmWzBdKQotCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMF0sIGRldnByaXYtPmRtYXBhZ2VzWzBdKTsKKwkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzBdLCBkZXZwcml2LT5kbWFwYWdlcyk7CiAJCWlmIChkZXZwcml2LT5kbWFidWZbMV0pCi0JCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlsxXSwgZGV2cHJpdi0+ZG1hcGFnZXNbMV0pOworCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMV0sIGRldnByaXYtPmRtYXBhZ2VzKTsKIAl9CiAJY29tZWRpX2xlZ2FjeV9kZXRhY2goZGV2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgYm9hcmR0eXBlc1tdID0gewotCXsicGNsODE4bCIsIDQsIDE2LCA4LCAyNTAwMCwgMSwgMTYsIDE2LCAmcmFuZ2VfcGNsODE4bF9sX2FpLAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAwLCAxfSwKLQl7InBjbDgxOGgiLCA5LCAxNiwgOCwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDF9LAotCXsicGNsODE4aGQiLCA5LCAxNiwgOCwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDEsIDF9LAotCXsicGNsODE4aGciLCAxMiwgMTYsIDgsIDEwMDAwLCAxLCAxNiwgMTYsICZyYW5nZV9wY2w4MThoZ19haSwKLQkgJnJhbmdlX3VuaXBvbGFyNSwgUENMeDF4X1JBTkdFLCAweDAwZmMsCi0JIDB4MGEsIDB4ZmZmLCAweGZmZiwgMSwgMX0sCi0JeyJwY2w4MTgiLCA5LCAxNiwgOCwgMTAwMDAsIDIsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDF9LAotCXsicGNsNzE4IiwgMSwgMTYsIDgsIDE2MDAwLCAyLCAxNiwgMTYsICZyYW5nZV91bmlwb2xhcjUsCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDB9LAotCS8qIHBjbTM3MTggKi8KLQl7InBjbTM3MTgiLCA5LCAxNiwgOCwgMTAwMDAsIDAsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDEgLyogWFhYID8gKi8gfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBwY2w4MThfZHJpdmVyID0gewogCS5kcml2ZXJfbmFtZQk9ICJwY2w4MTgiLAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbTM3MjQuYwppbmRleCBmNGE0OWJkLi41M2U3MzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY20zNzI0LmMKQEAgLTIyNSw4ICsyMjUsMTAgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOwotCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgc3ViZGV2XzgyNTVfY2IsCi0JCQkJICh1bnNpZ25lZCBsb25nKShkZXYtPmlvYmFzZSArIFNJWkVfODI1NSAqIGkpKTsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIHN1YmRldl84MjU1X2NiLAorCQkJCSAgICAgICBkZXYtPmlvYmFzZSArIFNJWkVfODI1NSAqIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAkJcy0+aW5zbl9jb25maWcgPSBzdWJkZXZfMzcyNF9pbnNuX2NvbmZpZzsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21hZC5jCmluZGV4IGZlNDgyZmQuLjg3YzYxZDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYwpAQCAtNjEsMTggKzYxLDE3IEBACiAJfSwKIH07CiAKLSNkZWZpbmUgVElNRU9VVAkxMDAKLQotc3RhdGljIGludCBwY21hZF9haV93YWl0X2Zvcl9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjbWFkX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJaWYgKChpbmIoZGV2LT5pb2Jhc2UgKyBQQ01BRF9TVEFUVVMpICYgMHgzKSA9PSAweDMpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ01BRF9TVEFUVVMpOworCWlmICgoc3RhdHVzICYgMHgzKSA9PSAweDMpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNtYWRfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC04OSw3ICs4OCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENNQURfQ09OVkVSVCk7CiAKLQkJcmV0ID0gcGNtYWRfYWlfd2FpdF9mb3JfZW9jKGRldiwgVElNRU9VVCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNtYWRfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwppbmRleCBjMzg4ZjdmLi5lODliY2E4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwpAQCAtNTg5LDE2ICs1ODksMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwY21taW9fYWlfd2FpdF9mb3JfZW9jKHVuc2lnbmVkIGxvbmcgaW9iYXNlLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgcGNtbWlvX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCXN0YXR1cyA9IGluYihpb2Jhc2UgKyBQQ01NSU9fQUlfU1RBVFVTX1JFRyk7Ci0JCWlmIChzdGF0dXMgJiBQQ01NSU9fQUlfU1RBVFVTX0RBVEFfUkVBRFkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ01NSU9fQUlfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIFBDTU1JT19BSV9TVEFUVVNfREFUQV9SRUFEWSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBwY21taW9fYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC02NDMsNyArNjQ0LDggQEAKIAljbWQgfD0gUENNTUlPX0FJX0NNRF9SQU5HRShyYW5nZSk7CiAKIAlvdXRiKGNtZCwgaW9iYXNlICsgUENNTUlPX0FJX0NNRF9SRUcpOwotCXJldCA9IHBjbW1pb19haV93YWl0X2Zvcl9lb2MoaW9iYXNlLCAxMDAwMDApOworCisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY21taW9fYWlfZW9jLCAwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC02NTIsNyArNjU0LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJb3V0YihjbWQsIGlvYmFzZSArIFBDTU1JT19BSV9DTURfUkVHKTsKLQkJcmV0ID0gcGNtbWlvX2FpX3dhaXRfZm9yX2VvYyhpb2Jhc2UsIDEwMDAwMCk7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY21taW9fYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTY4NCwxNiArNjg3LDE3IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyBpbnQgcGNtbWlvX2FvX3dhaXRfZm9yX2VvYyh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjbW1pb19hb19lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlzdGF0dXMgPSBpbmIoaW9iYXNlICsgUENNTUlPX0FPX1NUQVRVU19SRUcpOwotCQlpZiAoc3RhdHVzICYgUENNTUlPX0FPX1NUQVRVU19EQVRBX1JFQURZKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENNTUlPX0FPX1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiBQQ01NSU9fQU9fU1RBVFVTX0RBVEFfUkVBRFkpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNtbWlvX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTcyNiw3ICs3MzAsOCBAQAogCW91dGIoUENNTUlPX0FPX0xTQl9TUEFOKHJhbmdlKSwgaW9iYXNlICsgUENNTUlPX0FPX0xTQl9SRUcpOwogCW91dGIoMCwgaW9iYXNlICsgUENNTUlPX0FPX01TQl9SRUcpOwogCW91dGIoY21kIHwgUENNTUlPX0FPX0NNRF9XUl9TUEFOX1VQREFURSwgaW9iYXNlICsgUENNTUlPX0FPX0NNRF9SRUcpOwotCXJldCA9IHBjbW1pb19hb193YWl0X2Zvcl9lb2MoaW9iYXNlLCAxMDAwMDApOworCisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY21taW9fYW9fZW9jLCAwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC03MzgsNyArNzQzLDggQEAKIAkJb3V0YigodmFsID4+IDgpICYgMHhmZiwgaW9iYXNlICsgUENNTUlPX0FPX01TQl9SRUcpOwogCQlvdXRiKGNtZCB8IFBDTU1JT19BT19DTURfV1JfQ09ERV9VUERBVEUsCiAJCSAgICAgaW9iYXNlICsgUENNTUlPX0FPX0NNRF9SRUcpOwotCQlyZXQgPSBwY21taW9fYW9fd2FpdF9mb3JfZW9jKGlvYmFzZSwgMTAwMDAwKTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbW1pb19hb19lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKaW5kZXggNTVlM2MyZS4uMjU3MDY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCkBAIC0yOSwxMyArMjksMTMgQEAKIAogLyogIGRlc2NyaXB0b3IgYmxvY2sgdXNlZCBmb3IgY2hhaW5lZCBkbWEgdHJhbnNmZXJzICovCiBzdHJ1Y3QgcGx4X2RtYV9kZXNjIHsKLQl2b2xhdGlsZSB1aW50MzJfdCBwY2lfc3RhcnRfYWRkcjsKLQl2b2xhdGlsZSB1aW50MzJfdCBsb2NhbF9zdGFydF9hZGRyOworCV9fbGUzMiBwY2lfc3RhcnRfYWRkcjsKKwlfX2xlMzIgbG9jYWxfc3RhcnRfYWRkcjsKIAkvKiB0cmFuc2Zlcl9zaXplIGlzIGluIGJ5dGVzLCBvbmx5IGZpcnN0IDIzIGJpdHMgb2YgcmVnaXN0ZXIgYXJlIHVzZWQgKi8KLQl2b2xhdGlsZSB1aW50MzJfdCB0cmFuc2Zlcl9zaXplOworCV9fbGUzMiB0cmFuc2Zlcl9zaXplOwogCS8qIGFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yIChxdWFkIHdvcmQgYWxpZ25lZCksIHBsdXMgc29tZQogCSAqIGFkZGl0aW9uYWwgYml0cyAoc2VlIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHKSAqLwotCXZvbGF0aWxlIHVpbnQzMl90IG5leHQ7CisJX19sZTMyIG5leHQ7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU0ZWUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICAgIGNvbWVkaS9kcml2ZXJzL3BvYy5jCi0gICAgTWluaS1kcml2ZXJzIGZvciBQT0MgKFBpZWNlIG9mIENyYXApIGJvYXJkcwotICAgIENvcHlyaWdodCAoQykgMjAwMCBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwotLyoKLURyaXZlcjogcG9jCi1EZXNjcmlwdGlvbjogR2VuZXJpYyBkcml2ZXIgZm9yIHZlcnkgc2ltcGxlIGRldmljZXMKLUF1dGhvcjogZHMKLURldmljZXM6IFtLZWl0aGxleSBNZXRyYWJ5dGVdIERBQy0wMiAoZGFjMDIpCi1VcGRhdGVkOiBTYXQsIDE2IE1hciAyMDAyIDE3OjM0OjQ4IC0wODAwCi1TdGF0dXM6IHVua25vd24KLQotVGhpcyBkcml2ZXIgaXMgaW5kZW5kZWQgdG8gc3VwcG9ydCB2ZXJ5IHNpbXBsZSBJU0EtYmFzZWQgZGV2aWNlcywKLWluY2x1ZGluZzoKLSAgZGFjMDIgLSBLZWl0aGxleSBEQUMtMDIgYW5hbG9nIG91dHB1dCBib2FyZAotCi1Db25maWd1cmF0aW9uIG9wdGlvbnM6Ci0gIFswXSAtIEkvTyBwb3J0IGJhc2UKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLQotc3RydWN0IGJvYXJkZGVmX3N0cnVjdCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBpbnQgaW9zaXplOwotCWludCAoKnNldHVwKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7Ci0JaW50IHR5cGU7Ci0JaW50IG5fY2hhbjsKLQlpbnQgbl9iaXRzOwotCWludCAoKndpbnNuKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQlpbnQgKCpyaW5zbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCi0JCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKik7Ci0JaW50ICgqaW5zbmJpdHMpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAotCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKik7Ci0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlOwotfTsKLQotc3RydWN0IHBvY19wcml2YXRlIHsKLQl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMzJdOwotfTsKLQotc3RhdGljIGludCByZWFkYmFja19pbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBwb2NfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgY2hhbjsKLQotCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlkYXRhWzBdID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogREFDLTAyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBEQUMwMl9MU0IoYSkJKDIgKiBhKQotI2RlZmluZSBEQUMwMl9NU0IoYSkJKDIgKiBhICsgMSkKLQotc3RhdGljIGludCBkYWMwMl9hb193aW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IHBvY19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCB0ZW1wOwotCWludCBjaGFuOwotCWludCBvdXRwdXQ7Ci0KLQljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSBkYXRhWzBdOwotCW91dHB1dCA9IGRhdGFbMF07Ci0jaWZkZWYgd3JvbmcKLQkvKiAgY29udmVydCB0byBjb21wbGVtZW50YXJ5IGJpbmFyeSBpZiByYW5nZSBpcyBiaXBvbGFyICovCi0JaWYgKChDUl9SQU5HRShpbnNuLT5jaGFuc3BlYykgJiAweDIpID09IDApCi0JCW91dHB1dCA9IH5vdXRwdXQ7Ci0jZW5kaWYKLQl0ZW1wID0gKG91dHB1dCA8PCA0KSAmIDB4ZjA7Ci0Jb3V0Yih0ZW1wLCBkZXYtPmlvYmFzZSArIERBQzAyX0xTQihjaGFuKSk7Ci0JdGVtcCA9IChvdXRwdXQgPj4gNCkgJiAweGZmOwotCW91dGIodGVtcCwgZGV2LT5pb2Jhc2UgKyBEQUMwMl9NU0IoY2hhbikpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcG9jX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCi17Ci0JY29uc3Qgc3RydWN0IGJvYXJkZGVmX3N0cnVjdCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKLQlzdHJ1Y3QgcG9jX3ByaXZhdGUgKmRldnByaXY7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0JaW50IHJldDsKLQotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBib2FyZC0+aW9zaXplKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7Ci0JaWYgKCFkZXZwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCi0JcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0Jcy0+dHlwZSA9IGJvYXJkLT50eXBlOwotCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2NoYW47Ci0Jcy0+bWF4ZGF0YSA9ICgxIDw8IGJvYXJkLT5uX2JpdHMpIC0gMTsKLQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5yYW5nZTsKLQlzLT5pbnNuX3dyaXRlID0gYm9hcmQtPndpbnNuOwotCXMtPmluc25fcmVhZCA9IGJvYXJkLT5yaW5zbjsKLQlzLT5pbnNuX2JpdHMgPSBib2FyZC0+aW5zbmJpdHM7Ci0JaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfQU8gfHwgcy0+dHlwZSA9PSBDT01FRElfU1VCRF9ETykKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYm9hcmRkZWZfc3RydWN0IGJvYXJkc1tdID0gewotCXsKLQkJLm5hbWUJCT0gImRhYzAyIiwKLQkJLmlvc2l6ZQkJPSA4LAotCQkvKiAuc2V0dXAJPSBkYWMwMl9zZXR1cCwgKi8KLQkJLnR5cGUJCT0gQ09NRURJX1NVQkRfQU8sCi0JCS5uX2NoYW4JCT0gMiwKLQkJLm5fYml0cwkJPSAxMiwKLQkJLndpbnNuCQk9IGRhYzAyX2FvX3dpbnNuLAotCQkucmluc24JCT0gcmVhZGJhY2tfaW5zbiwKLQkJLnJhbmdlCQk9ICZyYW5nZV91bmtub3duLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgcG9jX2RyaXZlciA9IHsKLQkuZHJpdmVyX25hbWUJPSAicG9jIiwKLQkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotCS5hdHRhY2gJCT0gcG9jX2F0dGFjaCwKLQkuZGV0YWNoCQk9IGNvbWVkaV9sZWdhY3lfZGV0YWNoLAotCS5ib2FyZF9uYW1lCT0gJmJvYXJkc1swXS5uYW1lLAotCS5udW1fbmFtZXMJPSBBUlJBWV9TSVpFKGJvYXJkcyksCi0JLm9mZnNldAkJPSBzaXplb2YoYm9hcmRzWzBdKSwKLX07Ci1tb2R1bGVfY29tZWRpX2RyaXZlcihwb2NfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCmluZGV4IDk2YTQ2OTUuLjI5OGRiYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKQEAgLTIxNCw3ICsyMTQsNiBAQAogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0KIAkJCQkgICAgQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwgImRhdGEgbG9zdFxuIik7Ci0JCQkJZGFxcF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMjMxLDcgKzIzMCw2IEBACiAJCQlpZiAoZGV2cHJpdi0+Y291bnQgPiAwKSB7CiAJCQkJZGV2cHJpdi0+Y291bnQtLTsKIAkJCQlpZiAoZGV2cHJpdi0+Y291bnQgPT0gMCkgewotCQkJCQlkYXFwX2FpX2NhbmNlbChkZXYsIHMpOwogCQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTI0NCwxMyArMjQyLDEyIEBACiAJCWlmIChsb29wX2xpbWl0IDw9IDApIHsKIAkJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAogCQkJCSAibG9vcF9saW1pdCByZWFjaGVkIGluIGRhcXBfaW50ZXJydXB0KClcbiIpOwotCQkJZGFxcF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKIAkJfQogCiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOwogCi0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKaW5kZXggMGYwMjZhZi4uY2QzZmRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtMjM3LDIwICsyMzcsNiBAQAogLyogVGhlIGJvYXJkIHN1cHBvcnQgYSBjaGFubmVsIGxpc3QgdXAgdG8gdGhlIEZJRk8gbGVuZ3RoICgxSyBvciA4SykgKi8KICNkZWZpbmUgUlREX01BWF9DSEFOTElTVAkxMjgJLyogbWF4IGNoYW5uZWwgbGlzdCB0aGF0IHdlIGFsbG93ICovCiAKLS8qIHR1bmluZyBmb3IgYWkvYW8gaW5zdHJ1Y3Rpb24gZG9uZSBwb2xsaW5nICovCi0jaWZkZWYgRkFTVF9TUElOCi0jZGVmaW5lIFdBSVRfUVVJRVRMWQkJLyogYXMgbm90aGluZywgc3BpbiBvbiBkb25lIGJpdCAqLwotI2RlZmluZSBSVERfQURDX1RJTUVPVVQJNjYwMDAJLyogMiBtc2VjIGF0IDMzbWh6IGJ1cyByYXRlICovCi0jZGVmaW5lIFJURF9EQUNfVElNRU9VVAk2NjAwMAotI2RlZmluZSBSVERfRE1BX1RJTUVPVVQJMzMwMDAJLyogMSBtc2VjICovCi0jZWxzZQotLyogYnkgZGVsYXlpbmcsIHBvd2VyIGFuZCBlbGVjdHJpY2FsIG5vaXNlIGFyZSByZWR1Y2VkIHNvbWV3aGF0ICovCi0jZGVmaW5lIFdBSVRfUVVJRVRMWQl1ZGVsYXkoMSkKLSNkZWZpbmUgUlREX0FEQ19USU1FT1VUCTIwMDAJLyogaW4gdXNlYyAqLwotI2RlZmluZSBSVERfREFDX1RJTUVPVVQJMjAwMAkvKiBpbiB1c2VjICovCi0jZGVmaW5lIFJURF9ETUFfVElNRU9VVAkxMDAwCS8qIGluIHVzZWMgKi8KLSNlbmRpZgotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgQm9hcmQgc3BlY2lmaWMgc3R1ZmYKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNTYyLDIxICs1NDgsMjcgQEAKIAlyZXR1cm4gZmlmb19zaXplOwogfQogCi0vKgotICAiaW5zdHJ1Y3Rpb25zIiByZWFkL3dyaXRlIGRhdGEgaW4gIm9uZS1zaG90IiBvciAic29mdHdhcmUtdHJpZ2dlcmVkIgotICBtb2RlIChzaW1wbGVzdCBjYXNlKS4KLSAgVGhpcyBkb2Vzbid0IHVzZSBpbnRlcnJ1cHRzLgorc3RhdGljIGludCBydGRfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgcnRkX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAotICBOb3RlLCB3ZSBkb24ndCBkbyBhbnkgc2V0dGxpbmcgZGVsYXlzLiAgVXNlIGEgaW5zdHJ1Y3Rpb24gbGlzdCB0bwotICBzZWxlY3QsIGRlbGF5LCB0aGVuIHJlYWQuCi0gKi8KKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5sYXMwICsgTEFTMF9BREMpOworCWlmIChzdGF0dXMgJiBGU19BRENfTk9UX0VNUFRZKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHJ0ZF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcnRkX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIGlpOwotCWludCBzdGF0OworCWludCByZXQ7CisJaW50IG47CiAKIAkvKiBjbGVhciBhbnkgb2xkIGZpZm8gZGF0YSAqLwogCXdyaXRlbCgwLCBkZXZwcml2LT5sYXMwICsgTEFTMF9BRENfRklGT19DTEVBUik7CkBAIC01OTMsMTQgKzU4NSw5IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQl3cml0ZXcoMCwgZGV2cHJpdi0+bGFzMCArIExBUzBfQURDKTsKIAotCQlmb3IgKGlpID0gMDsgaWkgPCBSVERfQURDX1RJTUVPVVQ7ICsraWkpIHsKLQkJCXN0YXQgPSByZWFkbChkZXZwcml2LT5sYXMwICsgTEFTMF9BREMpOwotCQkJaWYgKHN0YXQgJiBGU19BRENfTk9UX0VNUFRZKQkvKiAxIC0+IG5vdCBlbXB0eSAqLwotCQkJCWJyZWFrOwotCQkJV0FJVF9RVUlFVExZOwotCQl9Ci0JCWlmIChpaSA+PSBSVERfQURDX1RJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBydGRfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWQgPSByZWFkdyhkZXZwcml2LT5sYXMxICsgTEFTMV9BRENfRklGTyk7CkBAIC0xMTE2LDkgKzExMDMsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAgT3V0cHV0IG9uZSAob3IgbW9yZSkgYW5hbG9nIHZhbHVlcyB0byBhIHNpbmdsZSBwb3J0IGFzIGZhc3QgYXMgcG9zc2libGUuCi0qLworc3RhdGljIGludCBydGRfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgcnRkX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0gKGNoYW4gPT0gMCkgPyBGU19EQUMxX05PVF9FTVBUWSA6IEZTX0RBQzJfTk9UX0VNUFRZOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5sYXMwICsgTEFTMF9BREMpOworCWlmIChzdGF0dXMgJiBiaXQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgcnRkX2FvX3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMTEyNyw2ICsxMTI3LDcgQEAKIAlpbnQgaTsKIAlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmV0OwogCiAJLyogQ29uZmlndXJlIHRoZSBvdXRwdXQgcmFuZ2UgKHRhYmxlIGluZGV4IG1hdGNoZXMgdGhlIHJhbmdlIHZhbHVlcykgKi8KIAl3cml0ZXcocmFuZ2UgJiA3LCBkZXZwcml2LT5sYXMwICsKQEAgLTExMzYsOCArMTEzNyw2IEBACiAJICogdmVyeSB1c2VmdWwsIGJ1dCB0aGF0J3MgaG93IHRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgKytpKSB7CiAJCWludCB2YWwgPSBkYXRhW2ldIDw8IDM7Ci0JCWludCBzdGF0ID0gMDsJLyogaW5pdGlhbGl6ZSB0byBhdm9pZCBib2d1cyB3YXJuaW5nICovCi0JCWludCBpaTsKIAogCQkvKiBWRVJJRlk6IGNvbWVkaSByYW5nZSBhbmQgb2Zmc2V0IGNvbnZlcnNpb25zICovCiAKQEAgLTExNTcsMTYgKzExNTYsOSBAQAogCiAJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKIAotCQlmb3IgKGlpID0gMDsgaWkgPCBSVERfREFDX1RJTUVPVVQ7ICsraWkpIHsKLQkJCXN0YXQgPSByZWFkbChkZXZwcml2LT5sYXMwICsgTEFTMF9BREMpOwotCQkJLyogMSAtPiBub3QgZW1wdHkgKi8KLQkJCWlmIChzdGF0ICYgKCgwID09IGNoYW4pID8gRlNfREFDMV9OT1RfRU1QVFkgOgotCQkJCSAgICBGU19EQUMyX05PVF9FTVBUWSkpCi0JCQkJYnJlYWs7Ci0JCQlXQUlUX1FVSUVUTFk7Ci0JCX0KLQkJaWYgKGlpID49IFJURF9EQUNfVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHJ0ZF9hb19lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQvd3JpdHRlbiAqLwpAQCAtMTM4Miw4ICsxMzc0LDYgQEAKIAlpZiAoZGV2LT5pcnEpCiAJCXdyaXRlbChJQ1NfUElFIHwgSUNTX1BMSUUsIGRldnByaXYtPmxjZmcgKyBQTFhfSU5UUkNTX1JFRyk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDAuYwppbmRleCBlMWYzNjcxLi5iZDQ0N2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMC5jCkBAIC04Myw4ICs4Myw2IEBACiAKICNkZWZpbmUgUlRJODAwX0lPU0laRQkJMHgxMAogCi0jZGVmaW5lIFJUSTgwMF9BSV9USU1FT1VUCTEwMAotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfcnRpODAwX2FpXzEwX2JpcG9sYXIgPSB7CiAJNCwgewogCQlCSVBfUkFOR0UoMTApLApAQCAtMTQ1LDIzICsxNDMsMjEgQEAKIAl1bnNpZ25lZCBjaGFyIG11eGdhaW5fYml0czsKIH07CiAKLXN0YXRpYyBpbnQgcnRpODAwX2FpX3dhaXRfZm9yX2NvbnZlcnNpb24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIGludCB0aW1lb3V0KQorc3RhdGljIGludCBydGk4MDBfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKLQlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUlRJODAwX0NTUik7Ci0JCWlmIChzdGF0dXMgJiBSVEk4MDBfQ1NSX09WRVJSVU4pIHsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBSVEk4MDBfQ0xSRkxBR1MpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJaWYgKHN0YXR1cyAmIFJUSTgwMF9DU1JfRE9ORSkKLQkJCXJldHVybiAwOwotCQl1ZGVsYXkoMSk7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUlRJODAwX0NTUik7CisJaWYgKHN0YXR1cyAmIFJUSTgwMF9DU1JfT1ZFUlJVTikgeworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUlRJODAwX0NMUkZMQUdTKTsKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CiAJfQotCXJldHVybiAtRVRJTUU7CisJaWYgKHN0YXR1cyAmIFJUSTgwMF9DU1JfRE9ORSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBydGk4MDBfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xOTgsNyArMTk0LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFJUSTgwMF9DT05WRVJUKTsKLQkJcmV0ID0gcnRpODAwX2FpX3dhaXRfZm9yX2NvbnZlcnNpb24oZGV2LCBSVEk4MDBfQUlfVElNRU9VVCk7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBydGk4MDBfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDIuYwppbmRleCBhM2ZhMmE0Li42MDVhMzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMi5jCkBAIC0xLDQ1ICsxLDQ0IEBACiAvKgotICAgY29tZWRpL2RyaXZlcnMvcnRpODAyLmMKLSAgIEhhcmR3YXJlIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgUlRJLTgwMiBib2FyZAotCi0gICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Ci0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBydGk4MDIuYworICogQ29tZWRpIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgUlRJLTgwMiBib2FyZAorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5OSBBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLS8qCi1Ecml2ZXI6IHJ0aTgwMgotRGVzY3JpcHRpb246IEFuYWxvZyBEZXZpY2VzIFJUSS04MDIKLUF1dGhvcjogQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Ci1EZXZpY2VzOiBbQW5hbG9nIERldmljZXNdIFJUSS04MDIgKHJ0aTgwMikKLVN0YXR1czogd29ya3MKIAotQ29uZmlndXJhdGlvbiBPcHRpb25zOgotICAgIFswXSAtIGkvbyBiYXNlCi0gICAgWzFdIC0gdW51c2VkCi0gICAgWzJdIC0gZGFjIzAgIDA9dHdvJ3MgY29tcCwgMT1zdHJhaWdodAotICAgIFszXSAtIGRhYyMwICAwPWJpcG9sYXIsIDE9dW5pcG9sYXIKLSAgICBbNF0gLSBkYWMjMSAuLi4KLSAgICAuLi4KLSAgICBbMTddIC0gZGFjIzcgLi4uCi0qLworLyoKKyAqIERyaXZlcjogcnRpODAyCisgKiBEZXNjcmlwdGlvbjogQW5hbG9nIERldmljZXMgUlRJLTgwMgorICogQXV0aG9yOiBBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KKyAqIERldmljZXM6IChBbmFsb2cgRGV2aWNlcykgUlRJLTgwMiBbcnRpODAyXQorICogU3RhdHVzOiB3b3JrcworICoKKyAqIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAqICAgWzBdIC0gaS9vIGJhc2UKKyAqICAgWzFdIC0gdW51c2VkCisgKiAgIFsyLDQsNiw4LDEwLDEyLDE0LDE2XSAtIGRhYyNbMC03XSAgMD10d28ncyBjb21wLCAxPXN0cmFpZ2h0CisgKiAgIFszLDUsNyw5LDExLDEzLDE1LDE3XSAtIGRhYyNbMC03XSAgMD1iaXBvbGFyLCAxPXVuaXBvbGFyCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jZGVmaW5lIFJUSTgwMl9TSVpFIDQKLQotI2RlZmluZSBSVEk4MDJfU0VMRUNUIDAKLSNkZWZpbmUgUlRJODAyX0RBVEFMT1cgMQotI2RlZmluZSBSVEk4MDJfREFUQUhJR0ggMgorLyoKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKKyAqLworI2RlZmluZSBSVEk4MDJfU0VMRUNUCQkweDAwCisjZGVmaW5lIFJUSTgwMl9EQVRBTE9XCQkweDAxCisjZGVmaW5lIFJUSTgwMl9EQVRBSElHSAkJMHgwMgogCiBzdHJ1Y3QgcnRpODAyX3ByaXZhdGUgewogCWVudW0gewpAQCAtNTEsMzQgKzUwLDQ1IEBACiAKIHN0YXRpYyBpbnQgcnRpODAyX2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHJ0aTgwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQotCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldOworCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CiAKLQlyZXR1cm4gaTsKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBydGk4MDJfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHJ0aTgwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBpLCBkOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOworCisJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIFJUSTgwMl9TRUxFQ1QpOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewotCQlkID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSBkYXRhW2ldOworCQl2YWwgPSBkYXRhW2ldOworCisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gdmFsOworCisJCS8qIG11bmdlIG9mZnNldCBiaW5hcnkgdG8gdHdvJ3MgY29tcGxlbWVudCBpZiBuZWVkZWQgKi8KIAkJaWYgKGRldnByaXYtPmRhY19jb2RpbmdbY2hhbl0gPT0gZGFjXzJjb21wKQotCQkJZCBePSAweDgwMDsKLQkJb3V0YihjaGFuLCBkZXYtPmlvYmFzZSArIFJUSTgwMl9TRUxFQ1QpOwotCQlvdXRiKGQgJiAweGZmLCBkZXYtPmlvYmFzZSArIFJUSTgwMl9EQVRBTE9XKTsKLQkJb3V0YihkID4+IDgsIGRldi0+aW9iYXNlICsgUlRJODAyX0RBVEFISUdIKTsKKwkJCXZhbCA9IGNvbWVkaV9vZmZzZXRfbXVuZ2UocywgdmFsKTsKKworCQlvdXRiKHZhbCAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUlRJODAyX0RBVEFMT1cpOworCQlvdXRiKCh2YWwgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFJUSTgwMl9EQVRBSElHSCk7CiAJfQotCXJldHVybiBpOworCisJcmV0dXJuIGluc24tPm47CiB9CiAKIHN0YXRpYyBpbnQgcnRpODAyX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCkBAIC04OCw3ICs5OCw3IEBACiAJaW50IGk7CiAJaW50IHJldDsKIAotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBSVEk4MDJfU0laRSk7CisJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIDB4MDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTEwMCwyMiArMTEwLDIxIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JLyogYW8gc3ViZGV2aWNlICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQlzLT5tYXhkYXRhID0gMHhmZmY7Ci0Jcy0+bl9jaGFuID0gODsKLQlzLT5pbnNuX3JlYWQgPSBydGk4MDJfYW9faW5zbl9yZWFkOwotCXMtPmluc25fd3JpdGUgPSBydGk4MDJfYW9faW5zbl93cml0ZTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5tYXhkYXRhCT0gMHhmZmY7CisJcy0+bl9jaGFuCT0gODsKKwlzLT5pbnNuX3JlYWQJPSBydGk4MDJfYW9faW5zbl9yZWFkOworCXMtPmluc25fd3JpdGUJPSBydGk4MDJfYW9faW5zbl93cml0ZTsKIAlzLT5yYW5nZV90YWJsZV9saXN0ID0gZGV2cHJpdi0+cmFuZ2VfdHlwZV9saXN0OwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlkZXZwcml2LT5kYWNfY29kaW5nW2ldID0gKGl0LT5vcHRpb25zWzMgKyAyICogaV0pCi0JCSAgICA/IChkYWNfc3RyYWlnaHQpCi0JCSAgICA6IChkYWNfMmNvbXApOworCQkJPyAoZGFjX3N0cmFpZ2h0KSA6IChkYWNfMmNvbXApOwogCQlkZXZwcml2LT5yYW5nZV90eXBlX2xpc3RbaV0gPSAoaXQtPm9wdGlvbnNbMiArIDIgKiBpXSkKLQkJICAgID8gJnJhbmdlX3VuaXBvbGFyMTAgOiAmcmFuZ2VfYmlwb2xhcjEwOworCQkJPyAmcmFuZ2VfdW5pcG9sYXIxMCA6ICZyYW5nZV9iaXBvbGFyMTA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMzAsNSArMTM5LDUgQEAKIG1vZHVsZV9jb21lZGlfZHJpdmVyKHJ0aTgwMl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIFJUSS04MDIgYm9hcmQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCmluZGV4IDk5NTBmNTkuLjg1ZDJiN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwpAQCAtNDIwLDE1ICs0MjAsMjggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IHM1MjZfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgUkVHX0lTUik7CisJaWYgKHN0YXR1cyAmIElTUl9BRENfRE9ORSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBzNTI2X2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBzNTI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpbnQgbiwgaTsKKwlpbnQgbjsKIAl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKIAl1bnNpZ25lZCBpbnQgZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCByZXQ7CiAKIAkvKiBTZXQgY29uZmlndXJlZCBkZWxheSwgZW5hYmxlIGNoYW5uZWwgZm9yIHRoaXMgY2hhbm5lbCBvbmx5LAogCSAqIHNlbGVjdCAiQURDIHJlYWQiIGNoYW5uZWwsIHNldCAiQURDIHN0YXJ0IiBiaXQuICovCkBAIC00NDAsMTcgKzQ1MywxMiBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0dyh2YWx1ZSwgZGV2LT5pb2Jhc2UgKyBSRUdfQURDKTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgVElNRU9VVDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBSRUdfSVNSKTsKLQkJCWlmIChzdGF0dXMgJiBJU1JfQURDX0RPTkUpIHsKLQkJCQlvdXR3KElTUl9BRENfRE9ORSwgZGV2LT5pb2Jhc2UgKyBSRUdfSVNSKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaSA9PSBUSU1FT1VUKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgczUyNl9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlvdXR3KElTUl9BRENfRE9ORSwgZGV2LT5pb2Jhc2UgKyBSRUdfSVNSKTsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZCA9IGludyhkZXYtPmlvYmFzZSArIFJFR19BREQpOwpAQCAtNjA0LDcgKzYxMiw3IEBACiAJcy0+aW5zbl9iaXRzID0gczUyNl9kaW9faW5zbl9iaXRzOwogCXMtPmluc25fY29uZmlnID0gczUyNl9kaW9faW5zbl9jb25maWc7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIHM1MjZfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKaW5kZXggMTlkYTFkYi4uOTVmYWRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCkBAIC0xMDYsMTYgKzEwNiwxNiBAQAogc3RydWN0IHM2MjZfZW5jX2luZm8gewogCS8qIFBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IGRpZmZlciBmb3IgQSBhbmQgQiBjb3VudGVyczogKi8KIAkvKiBSZXR1cm4gY2xvY2sgZW5hYmxlLiAqLwotCXVpbnQxNl90KCpnZXRfZW5hYmxlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCXVpbnQxNl90ICgqZ2V0X2VuYWJsZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBzNjI2X2VuY19pbmZvICprKTsKIAkvKiBSZXR1cm4gaW50ZXJydXB0IHNvdXJjZS4gKi8KLQl1aW50MTZfdCgqZ2V0X2ludF9zcmMpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJdWludDE2X3QgKCpnZXRfaW50X3NyYykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgczYyNl9lbmNfaW5mbyAqayk7CiAJLyogUmV0dXJuIHByZWxvYWQgdHJpZ2dlciBzb3VyY2UuICovCi0JdWludDE2X3QoKmdldF9sb2FkX3RyaWcpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJdWludDE2X3QgKCpnZXRfbG9hZF90cmlnKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSBjb25zdCBzdHJ1Y3QgczYyNl9lbmNfaW5mbyAqayk7CiAJLyogUmV0dXJuIHN0YW5kYXJkaXplZCBvcGVyYXRpbmcgbW9kZS4gKi8KLQl1aW50MTZfdCgqZ2V0X21vZGUpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJdWludDE2X3QgKCpnZXRfbW9kZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgczYyNl9lbmNfaW5mbyAqayk7CiAJLyogR2VuZXJhdGUgc29mdCBpbmRleCBzdHJvYmUuICovCiAJdm9pZCAoKnB1bHNlX2luZGV4KShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjA5LDYgKzIwOSw4IEBACiBzdGF0aWMgdm9pZCBzNjI2X2RlYmlfdHJhbnNmZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0YXRpYyBjb25zdCBpbnQgdGltZW91dCA9IDEwMDAwOworCWludCBpOwogCiAJLyogSW5pdGlhdGUgdXBsb2FkIG9mIHNoYWRvdyBSQU0gdG8gREVCSSBjb250cm9sIHJlZ2lzdGVyICovCiAJczYyNl9tY19lbmFibGUoZGV2LCBTNjI2X01DMl9VUExEX0RFQkksIFM2MjZfUF9NQzIpOwpAQCAtMjE3LDEyICsyMTksMjMgQEAKIAkgKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIHVwbG9hZCBmcm9tIHNoYWRvdyBSQU0gdG8KIAkgKiBERUJJIGNvbnRyb2wgcmVnaXN0ZXIuCiAJICovCi0Jd2hpbGUgKCFzNjI2X21jX3Rlc3QoZGV2LCBTNjI2X01DMl9VUExEX0RFQkksIFM2MjZfUF9NQzIpKQotCQk7CisJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQlpZiAoczYyNl9tY190ZXN0KGRldiwgUzYyNl9NQzJfVVBMRF9ERUJJLCBTNjI2X1BfTUMyKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmIChpID09IHRpbWVvdXQpCisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkiVGltZW91dCB3aGlsZSB1cGxvYWRpbmcgdG8gREVCSSBjb250cm9sIHJlZ2lzdGVyLiIpOwogCiAJLyogV2FpdCB1bnRpbCBERUJJIHRyYW5zZmVyIGlzIGRvbmUgKi8KLQl3aGlsZSAocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9QU1IpICYgUzYyNl9QU1JfREVCSV9TKQotCQk7CisJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQlpZiAoIShyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX1BTUikgJiBTNjI2X1BTUl9ERUJJX1MpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKGkgPT0gdGltZW91dCkKKwkJY29tZWRpX2Vycm9yKGRldiwgIkRFQkkgdHJhbnNmZXIgdGltZW91dC4iKTsKIH0KIAogLyoKQEAgLTM1MSwxNCArMzY0LDU3IEBACiAJMHg0MCwgMHg0MSwgMHg0MiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MwogfTsKIAorZW51bSB7CisJczYyNl9zZW5kX2RhY193YWl0X25vdF9tYzFfYTJvdXQsCisJczYyNl9zZW5kX2RhY193YWl0X3Nzcl9hZjJfb3V0LAorCXM2MjZfc2VuZF9kYWNfd2FpdF9mYl9idWZmZXIyX21zYl8wMCwKKwlzNjI2X3NlbmRfZGFjX3dhaXRfZmJfYnVmZmVyMl9tc2JfZmYKK307CisKK3N0YXRpYyBpbnQgczYyNl9zZW5kX2RhY19lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN3aXRjaCAoY29udGV4dCkgeworCWNhc2UgczYyNl9zZW5kX2RhY193YWl0X25vdF9tYzFfYTJvdXQ6CisJCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfTUMxKTsKKwkJaWYgKCEoc3RhdHVzICYgUzYyNl9NQzFfQTJPVVQpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgczYyNl9zZW5kX2RhY193YWl0X3Nzcl9hZjJfb3V0OgorCQlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX1NTUik7CisJCWlmIChzdGF0dXMgJiBTNjI2X1NTUl9BRjJfT1VUKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgczYyNl9zZW5kX2RhY193YWl0X2ZiX2J1ZmZlcjJfbXNiXzAwOgorCQlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX0ZCX0JVRkZFUjIpOworCQlpZiAoIShzdGF0dXMgJiAweGZmMDAwMDAwKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIHM2MjZfc2VuZF9kYWNfd2FpdF9mYl9idWZmZXIyX21zYl9mZjoKKwkJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9GQl9CVUZGRVIyKTsKKwkJaWYgKHN0YXR1cyAmIDB4ZmYwMDAwMDApCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKIC8qCiAgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogVHJhbnNtaXQgc2VyaWFsIGRhdGEgdG8gREFDIHZpYSBBdWRpbwogICogY2hhbm5lbCAyLiAgQXNzdW1lczogKDEpIFRTTDIgc2xvdCByZWNvcmRzIGluaXRpYWxpemVkLCBhbmQgKDIpCiAgKiBkYWNwb2wgY29udGFpbnMgdmFsaWQgdGFyZ2V0IGltYWdlLgogICovCi1zdGF0aWMgdm9pZCBzNjI2X3NlbmRfZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQzMl90IHZhbCkKK3N0YXRpYyBpbnQgczYyNl9zZW5kX2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50MzJfdCB2YWwpCiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmV0OwogCiAJLyogU1RBUlQgVEhFIFNFUklBTCBDTE9DSyBSVU5OSU5HIC0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNDA0LDggKzQ2MCwxMiBAQAogCSAqIERvbmUgYnkgcG9sbGluZyB0aGUgRE1BQyBlbmFibGUgZmxhZzsgdGhpcyBmbGFnIGlzIGF1dG9tYXRpY2FsbHkKIAkgKiBjbGVhcmVkIHdoZW4gdGhlIHRyYW5zZmVyIGhhcyBmaW5pc2hlZC4KIAkgKi8KLQl3aGlsZSAocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9NQzEpICYgUzYyNl9NQzFfQTJPVVQpCi0JCTsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIE5VTEwsIE5VTEwsIHM2MjZfc2VuZF9kYWNfZW9jLAorCQkJICAgICBzNjI2X3NlbmRfZGFjX3dhaXRfbm90X21jMV9hMm91dCk7CisJaWYgKHJldCkgeworCQljb21lZGlfZXJyb3IoZGV2LCAiRE1BIHRyYW5zZmVyIHRpbWVvdXQuIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogU1RBUlQgVEhFIE9VVFBVVCBTVFJFQU0gVE8gVEhFIFRBUkdFVCBEQUMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNDI1LDggKzQ4NSwxMiBAQAogCSAqIGZpbmlzaGVkIHRyYW5zZmVycmluZyB0aGUgREFDJ3MgZGF0YSBEV09SRCBmcm9tIHRoZSBvdXRwdXQgRklGTwogCSAqIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHJlZ2lzdGVyLgogCSAqLwotCXdoaWxlICghKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfU1NSKSAmIFM2MjZfU1NSX0FGMl9PVVQpKQotCQk7CisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBOVUxMLCBOVUxMLCBzNjI2X3NlbmRfZGFjX2VvYywKKwkJCSAgICAgczYyNl9zZW5kX2RhY193YWl0X3Nzcl9hZjJfb3V0KTsKKwlpZiAocmV0KSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJUU0wgdGltZW91dCB3YWl0aW5nIGZvciBzbG90IDEgdG8gZXhlY3V0ZS4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKgogCSAqIFNldCB1cCB0byB0cmFwIGV4ZWN1dGlvbiBhdCBzbG90IDAgd2hlbiB0aGUgVFNMIHNlcXVlbmNlciBjeWNsZXMKQEAgLTQ2Niw4ICs1MzAsMTMgQEAKIAkJICogZnJvbSAweEZGIHRvIDB4MDAsIHdoaWNoIHNsb3QgMCBjYXVzZXMgdG8gaGFwcGVuIGJ5IHNoaWZ0aW5nCiAJCSAqIG91dC9pbiBvbiBTRDIgdGhlIDB4MDAgdGhhdCBpcyBhbHdheXMgcmVmZXJlbmNlZCBieSBzbG90IDUuCiAJCSAqLwotCQl3aGlsZSAocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9GQl9CVUZGRVIyKSAmIDB4ZmYwMDAwMDApCi0JCQk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgTlVMTCwgTlVMTCwgczYyNl9zZW5kX2RhY19lb2MsCisJCQkJICAgICBzNjI2X3NlbmRfZGFjX3dhaXRfZmJfYnVmZmVyMl9tc2JfMDApOworCQlpZiAocmV0KSB7CisJCQljb21lZGlfZXJyb3IoZGV2LAorCQkJCSJUU0wgdGltZW91dCB3YWl0aW5nIGZvciBzbG90IDAgdG8gZXhlY3V0ZS4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAJLyoKIAkgKiBFaXRoZXIgKDEpIHdlIHdlcmUgdG9vIGxhdGUgc2V0dGluZyB0aGUgc2xvdCAwIHRyYXA7IHRoZSBUU0wKQEAgLTQ4NiwxNCArNTU1LDE5IEBACiAJICogdGhlIG5leHQgREFDIHdyaXRlLiAgVGhpcyBpcyBkZXRlY3RlZCB3aGVuIEZCX0JVRkZFUjIgTVNCIGNoYW5nZXMKIAkgKiBmcm9tIDB4MDAgdG8gMHhGRi4KIAkgKi8KLQl3aGlsZSAoIShyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX0ZCX0JVRkZFUjIpICYgMHhmZjAwMDAwMCkpCi0JCTsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIE5VTEwsIE5VTEwsIHM2MjZfc2VuZF9kYWNfZW9jLAorCQkJICAgICBzNjI2X3NlbmRfZGFjX3dhaXRfZmJfYnVmZmVyMl9tc2JfZmYpOworCWlmIChyZXQpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgIlRTTCB0aW1lb3V0IHdhaXRpbmcgZm9yIHNsb3QgMCB0byBleGVjdXRlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uOiBXcml0ZSBzZXRwb2ludCB0byBhbiBhcHBsaWNhdGlvbiBEQUMgY2hhbm5lbC4KICAqLwotc3RhdGljIHZvaWQgczYyNl9zZXRfZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQxNl90IGNoYW4sCitzdGF0aWMgaW50IHM2MjZfc2V0X2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50MTZfdCBjaGFuLAogCQkJIGludDE2X3QgZGFjZGF0YSkKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtNTU2LDEwICs2MzAsMTAgQEAKIAl2YWwgfD0gKCh1aW50MzJfdCkoY2hhbiAmIDEpIDw8IDE1KTsJLyogQWRkcmVzcyB0aGUgREFDIGNoYW5uZWwKIAkJCQkJCSAqIHdpdGhpbiB0aGUgZGV2aWNlLiAqLwogCXZhbCB8PSAodWludDMyX3QpZGFjZGF0YTsJLyogSW5jbHVkZSBEQUMgc2V0cG9pbnQgZGF0YS4gKi8KLQlzNjI2X3NlbmRfZGFjKGRldiwgdmFsKTsKKwlyZXR1cm4gczYyNl9zZW5kX2RhYyhkZXYsIHZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIHM2MjZfd3JpdGVfdHJpbV9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDhfdCBsb2dpY2FsX2NoYW4sCitzdGF0aWMgaW50IHM2MjZfd3JpdGVfdHJpbV9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDhfdCBsb2dpY2FsX2NoYW4sCiAJCQkJdWludDhfdCBkYWNfZGF0YSkKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtNjA2LDE3ICs2ODAsMjIgQEAKIAkgKiBBZGRyZXNzIHRoZSBEQUMgY2hhbm5lbCB3aXRoaW4gdGhlIHRyaW1kYWMgZGV2aWNlLgogCSAqIEluY2x1ZGUgREFDIHNldHBvaW50IGRhdGEuCiAJICovCi0JczYyNl9zZW5kX2RhYyhkZXYsIChjaGFuIDw8IDgpIHwgZGFjX2RhdGEpOworCXJldHVybiBzNjI2X3NlbmRfZGFjKGRldiwgKGNoYW4gPDwgOCkgfCBkYWNfZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIHM2MjZfbG9hZF90cmltX2RhY3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgczYyNl9sb2FkX3RyaW1fZGFjcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXVpbnQ4X3QgaTsKKwlpbnQgcmV0OwogCiAJLyogQ29weSBUcmltRGFjIHNldHBvaW50IHZhbHVlcyBmcm9tIEVFUFJPTSB0byBUcmltRGFjcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNjI2X3RyaW1jaGFuKTsgaSsrKQotCQlzNjI2X3dyaXRlX3RyaW1fZGFjKGRldiwgaSwKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNjI2X3RyaW1jaGFuKTsgaSsrKSB7CisJCXJldCA9IHM2MjZfd3JpdGVfdHJpbV9kYWMoZGV2LCBpLAogCQkJCSAgICBzNjI2X2kyY19yZWFkKGRldiwgczYyNl90cmltYWRyc1tpXSkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qICoqKioqKiAgQ09VTlRFUiBGVU5DVElPTlMgICoqKioqKiogKi8KQEAgLTE4NDYsNiArMTkyNSwyMCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgczYyNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfUFNSKTsKKwlpZiAoc3RhdHVzICYgUzYyNl9QU1JfR1BJTzIpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgczYyNl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMTg1Niw2ICsxOTQ5LDcgQEAKIAl1aW50MTZfdCBhZGNfc3BlYyA9IDA7CiAJdWludDMyX3QgZ3Bpb19pbWFnZTsKIAl1aW50MzJfdCB0bXA7CisJaW50IHJldDsKIAlpbnQgbjsKIAogCS8qCkBAIC0xODk3LDggKzE5OTEsOSBAQAogCQkgKi8KIAogCQkvKiBXYWl0IGZvciBBREMgZG9uZSAqLwotCQl3aGlsZSAoIShyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX1BTUikgJiBTNjI2X1BTUl9HUElPMikpCi0JCQk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgczYyNl9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiBGZXRjaCBBREMgZGF0YSAqLwogCQlpZiAobiAhPSAwKSB7CkBAIC0yMjk5LDYgKzIzOTQsNyBAQAogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGk7CisJaW50IHJldDsKIAl1aW50MTZfdCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50MTZfdCBkYWNkYXRhOwogCkBAIC0yMzA3LDcgKzI0MDMsOSBAQAogCQlkZXZwcml2LT5hb19yZWFkYmFja1tDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0gPSBkYXRhW2ldOwogCQlkYWNkYXRhIC09ICgweDFmZmYpOwogCi0JCXM2MjZfc2V0X2RhYyhkZXYsIGNoYW4sIGRhY2RhdGEpOworCQlyZXQgPSBzNjI2X3NldF9kYWMoZGV2LCBjaGFuLCBkYWNkYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIGk7CkBAIC0yNTQzLDEyICsyNjQxLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHM2MjZfaW5pdGlhbGl6ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzNjI2X2luaXRpYWxpemUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWRtYV9hZGRyX3QgcGh5c19idWY7CiAJdWludDE2X3QgY2hhbjsKIAlpbnQgaTsKKwlpbnQgcmV0OwogCiAJLyogRW5hYmxlIERFQkkgYW5kIGF1ZGlvIHBpbnMsIGVuYWJsZSBJMkMgaW50ZXJmYWNlICovCiAJczYyNl9tY19lbmFibGUoZGV2LCBTNjI2X01DMV9ERUJJIHwgUzYyNl9NQzFfQVVESU8gfCBTNjI2X01DMV9JMkMsCkBAIC0yNzQ5LDcgKzI4NDgsOSBAQAogCSAqIHNvbWV0aW1lcyBjYXVzZXMgdGhlIGZpcnN0IGZldyBUcmltREFDIHdyaXRlcyB0byBtYWxmdW5jdGlvbi4KIAkgKi8KIAlzNjI2X2xvYWRfdHJpbV9kYWNzKGRldik7Ci0JczYyNl9sb2FkX3RyaW1fZGFjcyhkZXYpOworCXJldCA9IHM2MjZfbG9hZF90cmltX2RhY3MoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyoKIAkgKiBNYW51YWxseSBpbml0IGFsbCBnYXRlIGFycmF5IGhhcmR3YXJlIGluIGNhc2UgdGhpcyBpcyBhIHNvZnQKQEAgLTI3NjMsOCArMjg2NCwxMSBAQAogCSAqIEluaXQgYWxsIERBQyBvdXRwdXRzIHRvIDBWIGFuZCBpbml0IGFsbCBEQUMgc2V0cG9pbnQgYW5kCiAJICogcG9sYXJpdHkgaW1hZ2VzLgogCSAqLwotCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBTNjI2X0RBQ19DSEFOTkVMUzsgY2hhbisrKQotCQlzNjI2X3NldF9kYWMoZGV2LCBjaGFuLCAwKTsKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUzYyNl9EQUNfQ0hBTk5FTFM7IGNoYW4rKykgeworCQlyZXQgPSBzNjI2X3NldF9kYWMoZGV2LCBjaGFuLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJLyogSW5pdCBjb3VudGVycyAqLwogCXM2MjZfY291bnRlcnNfaW5pdChkZXYpOwpAQCAtMjc4MCw2ICsyODg0LDggQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIGRpZ2l0YWwgSS9PIHN1YnN5c3RlbSAqLwogCXM2MjZfZGlvX2luaXQoZGV2KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHM2MjZfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTI5MDAsOSArMzAwNiw5IEBACiAJcy0+aW5zbl9yZWFkCT0gczYyNl9lbmNfaW5zbl9yZWFkOwogCXMtPmluc25fd3JpdGUJPSBzNjI2X2VuY19pbnNuX3dyaXRlOwogCi0JczYyNl9pbml0aWFsaXplKGRldik7Ci0KLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOworCXJldCA9IHM2MjZfaW5pdGlhbGl6ZShkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCmluZGV4IDc3ZTIwNTkuLjM5MDA4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYwpAQCAtMTQyLDYgKzE0MiwyOSBAQAogfQogCiAvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgYSBwYXJ0aWN1bGFyIGZvcm0sIHRoaXMgaXMganVzdAorICogd2hhdCBoYXBwZW5zIHRvIGJlIHVzZWQgaW4gc29tZSBvZiB0aGUgZHJpdmVycy4gVGhlIGNvbWVkaV90aW1lb3V0KCkKKyAqIGhlbHBlciB1c2VzIHRoaXMgY2FsbGJhY2sgdG8gY2hlY2sgZm9yIHRoZSBlbmQtb2YtY29udmVyc2lvbiB3aGlsZQorICogd2FpdGluZyBmb3IgdXAgdG8gMSBzZWNvbmQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwIHdoZW4gdGhlCisgKiBjb252ZXJzaW9uIGlzIGZpbmlzaGVkIGFuZCAtRUJVU1kgdG8ga2VlcCB3YWl0aW5nLiBBbnkgb3RoZXIgZXJybm8KKyAqIHdpbGwgdGVybWluYXRlIGNvbWVkaV90aW1lb3V0KCkgYW5kIHJldHVybiB0aGF0IGVycm5vIHRvIHRoZSBjYWxsZXIuCisgKiBJZiB0aGUgdGltZW91dCBvY2N1cnMsIGNvbWVkaV90aW1lb3V0KCkgd2lsbCByZXR1cm4gLUVUSU1FRE9VVC4KKyAqLworc3RhdGljIGludCBza2VsX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8qIHN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFNLRUxfU1RBVFVTKTsgKi8KKwlzdGF0dXMgPSAxOworCWlmIChzdGF0dXMpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qCiAgKiAiaW5zdHJ1Y3Rpb25zIiByZWFkL3dyaXRlIGRhdGEgaW4gIm9uZS1zaG90IiBvciAic29mdHdhcmUtdHJpZ2dlcmVkIgogICogbW9kZS4KICAqLwpAQCAtMTQ5LDkgKzE3Miw5IEBACiAJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJY29uc3Qgc3RydWN0IHNrZWxfYm9hcmQgKnRoaXNib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwotCWludCBuLCBpOworCWludCBuOwogCXVuc2lnbmVkIGludCBkOwotCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IHJldDsKIAogCS8qIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBzZXF1ZW5jZSAqLwogCkBAIC0xNjUsMTggKzE4OCwxMCBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJLyogb3V0dygwLGRldi0+aW9iYXNlICsgU0tFTF9DT05WRVJUKTsgKi8KIAotI2RlZmluZSBUSU1FT1VUIDEwMAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgVElNRU9VVDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSAxOwotCQkJLyogc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU0tFTF9TVEFUVVMpOyAqLwotCQkJaWYgKHN0YXR1cykKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSBUSU1FT1VUKSB7Ci0JCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwgImFpIHRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBza2VsX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHJlYWQgZGF0YSAqLwogCQkvKiBkID0gaW53KGRldi0+aW9iYXNlICsgU0tFTF9BSV9EQVRBKTsgKi8KQEAgLTQ1Niw4ICs0NzEsNiBAQAogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAic2tlbDogYXR0YWNoZWRcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jCmluZGV4IGRmMjJhNzguLjg0OGMzMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYwpAQCAtMTYxLDggKzE2MSw3IEBACiAJb3V0YihQQ01SLCBDU0NJUik7CiAJb3V0YigoaW5iKENTQ0RSKSAmIDB4QUEpLCBDU0NEUik7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZG5wX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKaW5kZXggNWY4NWM1NS4uZDZmYWUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCkBAIC0zNzIsNyArMzcyLDcgQEAKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywKIAkJCQkJVFJJR19OT1cgfCBUUklHX0VYVCB8IFRSSUdfSU5UKTsKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAotCQkJCQlUUklHX1RJTUVSIHwgVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7CisJCQkJCVRSSUdfRk9MTE9XIHwgVFJJR19FWFQpOwogCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7CiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwogCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwpAQCAtNDI0LDkgKzQyNCw2IEBACiAJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIHRtcCk7CiAJfQogCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IC1FSU5WQUw7Ci0KIAkvKiBzdG9wIHNvdXJjZSAqLwogCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgewogCWNhc2UgVFJJR19DT1VOVDoKQEAgLTUxNCwzNiArNTExLDI4IEBACiAJICovCiAJZGV2cHJpdi0+aWdub3JlID0gUEFDS0VUU19UT19JR05PUkU7CiAKLQlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAwKSB7Ci0JCWdhaW4gPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKTsKLQkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKLQkJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOwotCQkJaWYgKGNoYW4gIT0gaSkgewotCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJCSJjaGFubmVscyBhcmUgbm90IGNvbnNlY3V0aXZlXG4iKTsKLQkJCQl1cCgmZGV2cHJpdi0+c2VtKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWlmICgoZ2FpbiAhPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKSkKLQkJCSAgICAmJiAoY21kLT5jaGFubGlzdF9sZW4gPiAzKSkgewotCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJCSJnYWluIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBjaGFubmVsc1xuIik7Ci0JCQkJdXAoJmRldnByaXYtPnNlbSk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZiAoaSA+PSBOVU1DSEFOTkVMUykgewotCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJjaGFubGlzdCB0b28gbG9uZ1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJZ2FpbiA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgKytpKSB7CisJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlpZiAoY2hhbiAhPSBpKSB7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAorCQkJCSJjaGFubmVscyBhcmUgbm90IGNvbnNlY3V0aXZlXG4iKTsKKwkJCXVwKCZkZXZwcml2LT5zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChnYWluICE9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pKQorCQkJJiYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMykpIHsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCisJCQkJImdhaW4gbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIGNoYW5uZWxzXG4iKTsKKwkJCXVwKCZkZXZwcml2LT5zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGkgPj0gTlVNQ0hBTk5FTFMpIHsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJjaGFubGlzdCB0b28gbG9uZ1xuIik7CisJCQlicmVhazsKIAkJfQogCX0KIAlzdGVwcyA9IDA7Ci0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJInNjYW5fYmVnaW5fc3JjPT1UUklHX1RJTUVSIG5vdCB2YWxpZFxuIik7Ci0JCXVwKCZkZXZwcml2LT5zZW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKIAkJc3RlcHMgPSAoY21kLT5jb252ZXJ0X2FyZyAqIDMwKSAvIDEwMDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwppbmRleCA3ZGM1YTE4Li44Nzc3Zjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCkBAIC00MSw3ICs0MSw4IEBACiAJaWYgKHN0cm5jbXAoZmlsZW5hbWUsICIvZGV2L2NvbWVkaSIsIDExKSAhPSAwKQogCQlyZXR1cm4gTlVMTDsKIAotCW1pbm9yID0gc2ltcGxlX3N0cnRvdWwoZmlsZW5hbWUgKyAxMSwgTlVMTCwgMCk7CisJaWYgKGtzdHJ0b3VpbnQoZmlsZW5hbWUgKyAxMSwgMCwgJm1pbm9yKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAlpZiAobWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYwppbmRleCBkYTZiYzU4Li45MWRlYTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYwpAQCAtMSwyNyArMSwyNiBAQAogLyoKLSAgICBtb2R1bGUvcHJvYy5jCi0gICAgL3Byb2MgaW50ZXJmYWNlIGZvciBjb21lZGkKLQotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCisgKiAvcHJvYyBpbnRlcmZhY2UgZm9yIGNvbWVkaQorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAogLyoKLQlUaGlzIGlzIHNvbWUgc2VyaW91cyBibG9hdHdhcmUuCi0KLQlUYWtlbiBmcm9tIERhdmUgQS4ncyBQQ0wtNzExIGRyaXZlciwgJ2N1eiBJIHRob3VnaHQgaXQKLQl3YXMgY29vbC4KLSovCisgKiBUaGlzIGlzIHNvbWUgc2VyaW91cyBibG9hdHdhcmUuCisgKgorICogVGFrZW4gZnJvbSBEYXZlIEEuJ3MgUENMLTcxMSBkcml2ZXIsICdjdXogSSB0aG91Z2h0IGl0CisgKiB3YXMgY29vbC4KKyAqLwogCiAjaW5jbHVkZSAiY29tZWRpZGV2LmgiCiAjaW5jbHVkZSAiY29tZWRpX2ludGVybmFsLmgiCkBAIC0zNCwxMSArMzMsOCBAQAogCWludCBkZXZpY2VzX3EgPSAwOwogCXN0cnVjdCBjb21lZGlfZHJpdmVyICpkcml2OwogCi0Jc2VxX3ByaW50ZihtLAotCQkgICAgICJjb21lZGkgdmVyc2lvbiAiIENPTUVESV9SRUxFQVNFICJcbiIKLQkJICAgICAiZm9ybWF0IHN0cmluZzogJXNcbiIsCi0JCSAgICAgIlwiJTJkOiAlLTIwcyAlLTIwcyAlNGRcIiwgaSwgIgotCQkgICAgICJkcml2ZXJfbmFtZSwgYm9hcmRfbmFtZSwgbl9zdWJkZXZpY2VzIik7CisJc2VxX3ByaW50ZihtLCAiY29tZWRpIHZlcnNpb24gIiBDT01FRElfUkVMRUFTRSAiXG5mb3JtYXQgc3RyaW5nOiAlc1xuIiwKKwkJICAgIlwiJTJkOiAlLTIwcyAlLTIwcyAlNGRcIiwgaSwgZHJpdmVyX25hbWUsIGJvYXJkX25hbWUsIG5fc3ViZGV2aWNlcyIpOwogCiAJZm9yIChpID0gMDsgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyBpKyspIHsKIAkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGNvbWVkaV9kZXZfZ2V0X2Zyb21fbWlub3IoaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMKaW5kZXggNDZiM2RhNi4uYjY4NDk1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYwpAQCAtMTQzLDI4ICsxNDMsMjMgQEAKIAl1bnNpZ25lZCBpbnQgY2hhbnNwZWM7CiAJaW50IGNoYW4sIHJhbmdlX2xlbiwgaTsKIAotCWlmIChzLT5yYW5nZV90YWJsZSB8fCBzLT5yYW5nZV90YWJsZV9saXN0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWNoYW5zcGVjID0gY2hhbmxpc3RbaV07Ci0JCQljaGFuID0gQ1JfQ0hBTihjaGFuc3BlYyk7Ci0JCQlpZiAocy0+cmFuZ2VfdGFibGUpCi0JCQkJcmFuZ2VfbGVuID0gcy0+cmFuZ2VfdGFibGUtPmxlbmd0aDsKLQkJCWVsc2UgaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QgJiYgY2hhbiA8IHMtPm5fY2hhbikKLQkJCQlyYW5nZV9sZW4gPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGg7Ci0JCQllbHNlCi0JCQkJcmFuZ2VfbGVuID0gMDsKLQkJCWlmIChjaGFuID49IHMtPm5fY2hhbiB8fAotCQkJICAgIENSX1JBTkdFKGNoYW5zcGVjKSA+PSByYW5nZV9sZW4gfHwKLQkJCSAgICBhcmVmX2ludmFsaWQocywgY2hhbnNwZWMpKSB7Ci0JCQkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsCi0JCQkJCSAiYmFkIGNoYW5saXN0WyVkXT0weCUwOHggY2hhbj0lZCByYW5nZSBsZW5ndGg9JWRcbiIsCi0JCQkJCSBpLCBjaGFuc3BlYywgY2hhbiwgcmFuZ2VfbGVuKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWNoYW5zcGVjID0gY2hhbmxpc3RbaV07CisJCWNoYW4gPSBDUl9DSEFOKGNoYW5zcGVjKTsKKwkJaWYgKHMtPnJhbmdlX3RhYmxlKQorCQkJcmFuZ2VfbGVuID0gcy0+cmFuZ2VfdGFibGUtPmxlbmd0aDsKKwkJZWxzZSBpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCAmJiBjaGFuIDwgcy0+bl9jaGFuKQorCQkJcmFuZ2VfbGVuID0gcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXS0+bGVuZ3RoOworCQllbHNlCisJCQlyYW5nZV9sZW4gPSAwOworCQlpZiAoY2hhbiA+PSBzLT5uX2NoYW4gfHwKKwkJICAgIENSX1JBTkdFKGNoYW5zcGVjKSA+PSByYW5nZV9sZW4gfHwKKwkJICAgIGFyZWZfaW52YWxpZChzLCBjaGFuc3BlYykpIHsKKwkJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAorCQkJCSAiYmFkIGNoYW5saXN0WyVkXT0weCUwOHggY2hhbj0lZCByYW5nZSBsZW5ndGg9JWRcbiIsCisJCQkJIGksIGNoYW5zcGVjLCBjaGFuLCByYW5nZV9sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQl9IGVsc2UgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiKGJ1Zykgbm8gcmFuZ2UgdHlwZSBsaXN0IVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNtXzcwMDEyX3JlZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNtXzcwMDEyX3JlZ3MuaAppbmRleCBmM2FiMzE0Li5kYTE5OWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjbV83MDAxMl9yZWdzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY21fNzAwMTJfcmVncy5oCkBAIC0zMSw3ICszMSw4IEBACiAjZGVmaW5lIEJSQ01fU0hJRlQoYywgciwgZikgICBjIyNfIyNyIyNfIyNmIyNfU0hJRlQKIAogI2RlZmluZSBHRVRfRklFTEQobSwgYywgciwgZikgXAotCSgoKChtKSAmIEJSQ01fTUFTSyhjLCByLCBmKSkgPj4gQlJDTV9TSElGVChjLCByLCBmKSkgPDwgQlJDTV9BTElHTihjLCByLCBmKSkKKwkoKCgobSkgJiBCUkNNX01BU0soYywgciwgZikpID4+IEJSQ01fU0hJRlQoYywgciwgZikpIDw8IFwKKwkgQlJDTV9BTElHTihjLCByLCBmKSkKIAogI2RlZmluZSBTRVRfRklFTEQobSwgYywgciwgZiwgZCkgXAogCSgobSkgPSAoKChtKSAmIH5CUkNNX01BU0soYywgciwgZikpIHwgKCgoKGQpID4+IEJSQ01fQUxJR04oYywgciwgZikpIDw8IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jCmluZGV4IDhkMDY4MGQuLjQ3NjVkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYwpAQCAtNDMzLDEwICs0MzMsMTIgQEAKIH0KIAogI2RlZmluZSBjcnlzdGFsaGRfaHdfZGVsZXRlX2lvcShhZHAsIHEpCQlcCitkbyB7CQkJCQkJXAogCWlmIChxKSB7CQkJCVwKIAkJY3J5c3RhbGhkX2RlbGV0ZV9kaW9xKGFkcCwgcSk7CVwKIAkJcSA9IE5VTEw7CQkJXAotCX0KKwl9CQkJCQlcCit9IHdoaWxlICgwKQogCiBzdGF0aWMgdm9pZCBjcnlzdGFsaGRfaHdfZGVsZXRlX2lvcXMoc3RydWN0IGNyeXN0YWxoZF9odyAqaHcpCiB7CkBAIC0xNDM3LDcgKzE0MzksNyBAQAogCQljcnlzdGFsaGRfcmVnX3dyKGh3LT5hZHAsIE1JU0MxX1VWX1JYX0VSUk9SX1NUQVRVUywgdG1wKTsKIAl9CiAKLQlyZXR1cm4gKHRtcF9sc3RzICE9IGh3LT5yeF9saXN0X3N0c1swXSk7CisJcmV0dXJuIHRtcF9sc3RzICE9IGh3LT5yeF9saXN0X3N0c1swXTsKIH0KIAogc3RhdGljIGJvb2wgY3J5c3RhbGhkX3J4X2xpc3QxX2hhbmRsZXIoc3RydWN0IGNyeXN0YWxoZF9odyAqaHcsCkBAIC0xNTA3LDcgKzE1MDksNyBAQAogCQljcnlzdGFsaGRfcmVnX3dyKGh3LT5hZHAsIE1JU0MxX1VWX1JYX0VSUk9SX1NUQVRVUywgdG1wKTsKIAl9CiAKLQlyZXR1cm4gKHRtcF9sc3RzICE9IGh3LT5yeF9saXN0X3N0c1sxXSk7CisJcmV0dXJuIHRtcF9sc3RzICE9IGh3LT5yeF9saXN0X3N0c1sxXTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jCmluZGV4IDk5ZWVmZDAuLjIwYmU5NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHAtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3J5c3RhbGhkX3VzZXJfZGF0YSh1bnNpZ25lZCBsb25nIHVkLCB2b2lkICpkciwKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXN0YWxoZF91c2VyX2RhdGEodm9pZCBfX3VzZXIgKnVkLCB2b2lkICpkciwKIAkJCSBpbnQgc2l6ZSwgaW50IHNldCkKIHsKIAlpbnQgcmM7CkBAIC0xMjIsOSArMTIyLDkgQEAKIAl9CiAKIAlpZiAoc2V0KQotCQlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKXVkLCBkciwgc2l6ZSk7CisJCXJjID0gY29weV90b191c2VyKHVkLCBkciwgc2l6ZSk7CiAJZWxzZQotCQlyYyA9IGNvcHlfZnJvbV91c2VyKGRyLCAodm9pZCAqKXVkLCBzaXplKTsKKwkJcmMgPSBjb3B5X2Zyb21fdXNlcihkciwgdWQsIHNpemUpOwogCiAJaWYgKHJjKSB7CiAJCUJDTUxPR19FUlIoIkludmFsaWQgYXJncyBmb3IgY29tbWFuZFxuIik7CkBAIC0xNTMsNyArMTUzLDggQEAKIAogCWlvLT5hZGRfY2RhdGFfc3ogPSBtX3N6OwogCXVhX29mZiA9IHVhICsgc2l6ZW9mKGlvLT51ZGF0YSk7Ci0JcmMgPSBjcnlzdGFsaGRfdXNlcl9kYXRhKHVhX29mZiwgaW8tPmFkZF9jZGF0YSwgaW8tPmFkZF9jZGF0YV9zeiwgMCk7CisJcmMgPSBjcnlzdGFsaGRfdXNlcl9kYXRhKCh2b2lkIF9fdXNlciAqKXVhX29mZiwgaW8tPmFkZF9jZGF0YSwKKwkJCWlvLT5hZGRfY2RhdGFfc3osIDApOwogCWlmIChyYykgewogCQlCQ01MT0dfRVJSKCJmYWlsZWQgdG8gcHVsbCBhZGRfY2RhdGEgc3o6JXggdWFfb2ZmOiV4XG4iLAogCQkJICAgaW8tPmFkZF9jZGF0YV9zeiwgKHVuc2lnbmVkIGludCl1YV9vZmYpOwpAQCAtMTc4LDcgKzE3OSw3IEBACiAKIAlpZiAoaW8tPmNtZCAhPSBCQ01fSU9DX0ZXX0RPV05MT0FEKSB7CiAJCXVhX29mZiA9IHVhICsgc2l6ZW9mKGlvLT51ZGF0YSk7Ci0JCXJjID0gY3J5c3RhbGhkX3VzZXJfZGF0YSh1YV9vZmYsIGlvLT5hZGRfY2RhdGEsCisJCXJjID0gY3J5c3RhbGhkX3VzZXJfZGF0YSgodm9pZCBfX3VzZXIgKil1YV9vZmYsIGlvLT5hZGRfY2RhdGEsCiAJCQkJCWlvLT5hZGRfY2RhdGFfc3osIDEpOwogCQlpZiAocmMpIHsKIAkJCUJDTUxPR19FUlIoCkBAIC0yMDgsNyArMjA5LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmMgPSBjcnlzdGFsaGRfdXNlcl9kYXRhKHVhLCAmaW8tPnVkYXRhLCBzaXplb2YoaW8tPnVkYXRhKSwgc2V0KTsKKwlyYyA9IGNyeXN0YWxoZF91c2VyX2RhdGEoKHZvaWQgX191c2VyICopdWEsICZpby0+dWRhdGEsCisJCQlzaXplb2YoaW8tPnVkYXRhKSwgc2V0KTsKIAlpZiAocmMpIHsKIAkJQkNNTE9HX0VSUigiZmFpbGVkIHRvICVzIGlvZGF0YVxuIiwgKHNldCA/ICJzZXQiIDogImdldCIpKTsKIAkJcmV0dXJuIHJjOwpAQCAtNTQ2LDkgKzU0OCwxMCBAQAogCWludCByYzsKIAllbnVtIEJDX1NUQVRVUyBzdHMgPSBCQ19TVFNfU1VDQ0VTUzsKIAotCUJDTUxPRyhCQ01MT0dfREJHLCAiUENJX0lORk86IFZlbmRvcjoweCUwNHggRGV2aWNlOjB4JTA0eCBzX3ZlbmRvcjoweCUwNHggc19kZXZpY2U6IDB4JTA0eFxuIiwKLQkgICAgICAgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCi0JICAgICAgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOworCUJDTUxPRyhCQ01MT0dfREJHLAorCQkiUENJX0lORk86IFZlbmRvcjoweCUwNHggRGV2aWNlOjB4JTA0eCBzX3ZlbmRvcjoweCUwNHggc19kZXZpY2U6IDB4JTA0eFxuIiwKKwkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCisJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCiAJcGluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3J5c3RhbGhkX2FkcCksIEdGUF9LRVJORUwpOwogCWlmICghcGluZm8pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5oIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmgKaW5kZXggODE2ZTFjZC4uNDllMWVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmgKQEAgLTU4LDExICs1OCwxMSBAQAogCiAJdW5zaWduZWQgbG9uZwkJcGNpX21lbV9zdGFydDsKIAl1aW50MzJfdAkJcGNpX21lbV9sZW47Ci0Jdm9pZAkJCSphZGRyOworCXZvaWQgX19pb21lbQkJKmFkZHI7CiAKIAl1bnNpZ25lZCBsb25nCQlwY2lfaTJvX3N0YXJ0OwogCXVpbnQzMl90CQlwY2lfaTJvX2xlbjsKLQl2b2lkCQkJKmkyb19hZGRyOworCXZvaWQgX19pb21lbQkJKmkyb19hZGRyOwogCiAJdW5zaWduZWQgaW50CQlkcnZfZGF0YTsKIAl1bnNpZ25lZCBpbnQJCWRtYWJpdHM7CS8qIDMyIHwgNjQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuYwppbmRleCBjM2QwMjQ0Li4zYWFiZjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5jCkBAIC03NDAsNyArNzQwLDcgQEAKIAlkaW8tPmZiX3NpemUgPSB1YnVmZl9zeiAmIDB4MDM7CiAJaWYgKGRpby0+ZmJfc2l6ZSkgewogCQlyZXMgPSBjb3B5X2Zyb21fdXNlcihkaW8tPmZiX3ZhLAotCQkJCSAgICAgKHZvaWQgKikodWFkZHIgKyBjb3VudCAtIGRpby0+ZmJfc2l6ZSksCisJCQkJICAgICAodm9pZCBfX3VzZXIgKikodWFkZHIgKyBjb3VudCAtIGRpby0+ZmJfc2l6ZSksCiAJCQkJICAgICBkaW8tPmZiX3NpemUpOwogCQlpZiAocmVzKSB7CiAJCQlCQ01MT0dfRVJSKCJmYWlsZWQgJWQgdG8gY29weSAldSBmaWxsIGJ5dGVzIGZyb20gJXBcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmggYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmgKaW5kZXggNzdhYjcyYS4uMGY2MzgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuaApAQCAtMjI1LDcgKzIyNSw3IEBACiAjZGVmaW5lIEJDTUxPR19FUlIoZm10LCBhcmdzLi4uKQkJCQlcCiBkbyB7CQkJCQkJCQlcCiAJaWYgKGdfbGlua2xvZ19sZXZlbCAmIEJDTUxPR19FUlJPUikJCQlcCi0JCXByaW50ayhLRVJOX0VSUiAiKkVSUio6JXM6JWQ6ICJmbXQsCQlcCisJCXByX2VycigiKkVSUio6JXM6JWQ6ICJmbXQsCQkJXAogCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKTsJXAogfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvTWFrZWZpbGUKaW5kZXggMmYyMTdlOS4uYjg3OWU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL01ha2VmaWxlCkBAIC00LDcgKzQsNiBAQAogY2NmbGFncy15ICs9IC1EU0JFX0lTUl9UQVNLTEVUCiAKIGN4dDFlMS15IDo9IAlcCi0gIG9zc2lSZWxlYXNlLm8gCVwKICAgbXVzeWNjLm8gCQlcCiAgIHBtY2M0X2Rydi5vIAkJXAogICBjb21ldC5vIAkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jCmluZGV4IGM0YzhjMGYuLjcwMDVhZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMKQEAgLTIyLDE4ICsyMiwyMCBAQAogI2luY2x1ZGUgImNvbWV0LmgiCiAjaW5jbHVkZSAiY29tZXRfdGFibGVzLmgiCiAKLWV4dGVybiBpbnQgIGN4dDFlMV9sb2dfbGV2ZWw7CiAKICNkZWZpbmUgQ09NRVRfTlVNX1NBTVBMRVMgICAyNCAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHdhdmVmb3JtIHRhYmxlICovCiAjZGVmaW5lIENPTUVUX05VTV9VTklUUyAgICAgNSAgIC8qIE51bWJlciBvZiBwb2ludHMgcGVyIGVudHJ5IGluIHRhYmxlICovCiAKIC8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLwogc3RhdGljIHZvaWQgU2V0UHdyTGV2ZWwoc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCk7Ci1zdGF0aWMgdm9pZCBXcnRSY3ZFcXVhbGl6ZXJUYmwoY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50MzJfdCAqdGFibGUpOwotc3RhdGljIHZvaWQgV3J0WG10V2F2ZWZvcm1UYmwoY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50OF90IHRhYmxlW0NPTUVUX05VTV9TQU1QTEVTXVtDT01FVF9OVU1fVU5JVFNdKTsKK3N0YXRpYyB2b2lkIFdydFJjdkVxdWFsaXplclRibChjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwKKwkJCQl1X2ludDMyX3QgKnRhYmxlKTsKK3N0YXRpYyB2b2lkIFdydFhtdFdhdmVmb3JtVGJsKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LAorCQkJCXVfaW50OF90IHRhYmxlW0NPTUVUX05VTV9TQU1QTEVTXQorCQkJCVtDT01FVF9OVU1fVU5JVFNdKTsKIAogCi12b2lkICAgICAgICpUV1ZfdGFibGVbMTJdID0geworc3RhdGljIHZvaWQgKlRXVl90YWJsZVsxMl0gPSB7CiAJVFdWTG9uZ0hhdWwwREIsIFRXVkxvbmdIYXVsN181REIsIFRXVkxvbmdIYXVsMTVEQiwgVFdWTG9uZ0hhdWwyMl81REIsCiAJVFdWU2hvcnRIYXVsMCwgVFdWU2hvcnRIYXVsMSwgVFdWU2hvcnRIYXVsMiwgVFdWU2hvcnRIYXVsMywKIAlUV1ZTaG9ydEhhdWw0LCBUV1ZTaG9ydEhhdWw1LApAQCAtNTAsNiArNTIsNyBAQAogCQlpZiAodDEpCiAJCQkvKiBkZWZhdWx0IFQxIHdhdmVmb3JtIHRhYmxlICovCiAJCQlsYm8gPSBDRkdfTEJPX0xIMDsKKwogCQllbHNlCiAJCQkvKiBkZWZhdWx0IEUxIHdhdmVmb3JtIHRhYmxlICovCiAJCQlsYm8gPSBDRkdfTEJPX0UxMjA7CkBAIC01OCw4ICs2MSw4IEBACiAJcmV0dXJuIGxibyAtIDE7CiB9CiAKLXZvaWQgaW5pdF9jb21ldCh2b2lkICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQzMl90IHBvcnRfbW9kZSwgaW50IGNsb2NrbWFzdGVyLAotCQl1X2ludDhfdCBtb3JlUGFyYW1zKQordm9pZCBpbml0X2NvbWV0KHZvaWQgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDMyX3QgcG9ydF9tb2RlLAorCQlpbnQgY2xvY2ttYXN0ZXIsIHVfaW50OF90IG1vcmVQYXJhbXMpCiB7CiAJdV9pbnQ4X3QgaXNUMW1vZGU7CiAJLyogVDEgZGVmYXVsdCAqLwpAQCAtMTQ2LDcgKzE0OSw5IEBACiAJIC8qIHQxUkJPQyBlbmFibGUoQk9DOkJpdE9yaWVudGVkIENvZGUpICovCiAJcGNpX3dyaXRlXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT50MV9yYm9jX2VuYSwgMHgwMCk7CiAJaWYgKGlzVDFtb2RlKSB7Ci0JCS8qIElCQ0QgY2ZnOiBha2EgSW5iYW5kIENvZGUgRGV0ZWN0aW9uICoqIGxvb3BiYWNrIGNvZGUgbGVuZ3RoIHNldCB0byAqLworCQkvKiBJQkNEIGNmZzogYWthIEluYmFuZCBDb2RlIERldGVjdGlvbiAqKiBsb29wYmFjayBjb2RlIGxlbmd0aAorCQkgKiBzZXQgdG8KKwkJICovCiAJCS8qIDYgYml0IGRvd24sIDUgYml0IHVwIChhc3NlcnQpICovCiAJCXBjaV93cml0ZV8zMigodV9pbnQzMl90ICopICZjb21ldC0+aWJjZF9jZmcsIDB4MDQpOwogCQkvKiBsaW5lIGxvb3BiYWNrIGFjdGl2YXRlIHBhdHRlcm4gKi8KQEAgLTI4Niw3ICsyOTEsOSBAQAogICAgIC8qIDB4MzA6ICJCUklGIGNmZyI7IDB4MjAgaXMgJ0NNT0RFJywgMHgwMyBpcyAoYml0KSByYXRlICovCiAgICAgLyogbm90ZSAicmF0ZSBiaXRzIGNhbiBvbmx5IGJlIHNldCBvbmNlIGFmdGVyIHJlc2V0IiAqLwogCWlmIChjbG9ja21hc3RlcikgewotCQkvKiBDTU9ERSA9PSBjbG9ja01vZGUsIDA9Y2xvY2sgbWFzdGVyIChzbyBhbGwgMyBvdGhlcnMgc2hvdWxkIGJlIHNsYXZlKSAqLworCQkvKiBDTU9ERSA9PSBjbG9ja01vZGUsIDA9Y2xvY2sgbWFzdGVyCisJCSAqIChzbyBhbGwgMyBvdGhlcnMgc2hvdWxkIGJlIHNsYXZlKQorCQkgKi8KIAkJLyogcmF0ZSA9IDEuNTQ0IE1iL3MgKi8KIAkJaWYgKGlzVDFtb2RlKQogCQkJLyogQ29tZXQgMCBNYXN0ZXIgTW9kZShDTU9ERT0wKSAqLwpAQCAtMzk4LDcgKzQwNSw4IEBACiAqKiBSZXR1cm5zOiAgICAgTm90aGluZwogKi8KIHN0YXRpYyB2b2lkCi1XcnRYbXRXYXZlZm9ybShjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQzMl90IHNhbXBsZSwgdV9pbnQzMl90IHVuaXQsIHVfaW50OF90IGRhdGEpCitXcnRYbXRXYXZlZm9ybShjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQzMl90IHNhbXBsZSwKKwkJdV9pbnQzMl90IHVuaXQsIHVfaW50OF90IGRhdGEpCiB7CiAJdV9pbnQ4X3QgICAgV2F2ZWZvcm1BZGRyOwogCkBAIC00NDcsNyArNDU1LDcgQEAKIFdydFJjdkVxdWFsaXplclRibChjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQzMl90ICp0YWJsZSkKIHsKIAl1X2ludDMyX3QgICByYW1hZGRyOwotCXZvbGF0aWxlIHVfaW50MzJfdCB2YWx1ZTsKKwl1X2ludDMyX3QgdmFsdWU7CiAKIAlmb3IgKHJhbWFkZHIgPSAwOyByYW1hZGRyIDwgMjU2OyByYW1hZGRyKyspIHsKIAkJLyoqKiB0aGUgZm9sbG93aW5nIGxpbmVzIGFyZSBwZXIgRXJyYXRhIDcsIDIuNSAqKiovCkBAIC01MTUsNyArNTIzLDcgQEAKIHN0YXRpYyB2b2lkCiBTZXRQd3JMZXZlbChzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0KQogewotCXZvbGF0aWxlIHVfaW50MzJfdCB0ZW1wOworCXVfaW50MzJfdCB0ZW1wOwogCiAvKgogKiogICAgQWxnb3JpdGhtIHRvIEJhbGFuY2UgdGhlIFBvd2VyIERpc3RyaWJ1dGlvbiBvZiBUdGlwIFRyaW5nCkBAIC01NTcsMTcgKzU2NSwyMSBAQAogc3RhdGljIHZvaWQKIFNldENvbWV0T3BzKHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQpCiB7Ci0Jdm9sYXRpbGUgdV9pbnQ4X3QgcmRfdmFsdWU7CisJdV9pbnQ4X3QgcmRfdmFsdWU7CiAKIAlpZiAoY29tZXQgPT0gbUNvbmZpZy5DNEZ1bmMxQmFzZSArIChDT01FVDBfT0ZGU0VUID4+IDIpKSB7CiAJCS8qIHJlYWQgdGhlIEJSSUYgQ29uZmlndXJhdGlvbiAqLwotCQlyZF92YWx1ZSA9ICh1X2ludDhfdCkgcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfY2ZnKTsKKwkJcmRfdmFsdWUgPSAodV9pbnQ4X3QpIHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikKKwkJCQkmY29tZXQtPmJyaWZfY2ZnKTsKIAkJcmRfdmFsdWUgJj0gfjB4MjA7Ci0JCXBjaV93cml0ZV8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcsICh1X2ludDMyX3QpIHJkX3ZhbHVlKTsKKwkJcGNpX3dyaXRlXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2NmZywKKwkJCQkodV9pbnQzMl90KSByZF92YWx1ZSk7CiAJCS8qIHJlYWQgdGhlIEJSSUYgRnJhbWUgUHVsc2UgQ29uZmlndXJhdGlvbiAqLwotCQlyZF92YWx1ZSA9ICh1X2ludDhfdCkgcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfZnBjZmcpOworCQlyZF92YWx1ZSA9ICh1X2ludDhfdCkgcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKQorCQkJCSZjb21ldC0+YnJpZl9mcGNmZyk7CiAJCXJkX3ZhbHVlICY9IH4weDIwOwotCQlwY2lfd3JpdGVfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfZnBjZmcsICh1X2ludDhfdCkgcmRfdmFsdWUpOworCQlwY2lfd3JpdGVfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfZnBjZmcsCisJCQkJKHVfaW50OF90KSByZF92YWx1ZSk7CiAJfSBlbHNlIHsKIAkvKiByZWFkIHRoZSBCUklGIENvbmZpZ3VyYXRpb24gKi8KIAlyZF92YWx1ZSA9ICh1X2ludDhfdCkgcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfY2ZnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXRfdGFibGVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0X3RhYmxlcy5jCmluZGV4IDg0OTMxMTEuLmU5NjY2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXRfdGFibGVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldF90YWJsZXMuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImNvbWV0X3RhYmxlcy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCmluZGV4IDk1MjE4ZTI4Li5lZTlkMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMKQEAgLTI1LDcgKzI1LDggQEAKICNpbmNsdWRlICJwbWNjNC5oIgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0JFX0hETENfVjcpIHx8IGRlZmluZWQoQ09ORklHX1NCRV9XQU4yNTZUM19IRExDX1Y3KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU0JFX0hETENfVjdfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19TQkVfV0FOMjU2VDNfSERMQ19WN19NT0RVTEUpCitkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WN19NT0RVTEUpIHx8IFwKK2RlZmluZWQoQ09ORklHX1NCRV9XQU4yNTZUM19IRExDX1Y3X01PRFVMRSkKICNkZWZpbmUgX3Y3X2hkbGNfICAxCiAjZWxzZQogI2RlZmluZSBfdjdfaGRsY18gIDAKQEAgLTMzLDkgKzM0LDkgQEAKIAogI2lmIF92N19oZGxjXwogI2RlZmluZSBWNyh4KSAoeCAjIyBfdjcpCi1leHRlcm4gaW50ICBoZGxjX25ldGlmX3J4X3Y3IChoZGxjX2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWV4dGVybiBpbnQgIHJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3IChoZGxjX2RldmljZSAqKTsKLWV4dGVybiBpbnQgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcgKGhkbGNfZGV2aWNlICopOworZXh0ZXJuIGludCAgaGRsY19uZXRpZl9yeF92NyhoZGxjX2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiBpbnQgIHJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3KGhkbGNfZGV2aWNlICopOworZXh0ZXJuIGludCAgdW5yZWdpc3Rlcl9oZGxjX2RldmljZV92NyhoZGxjX2RldmljZSAqKTsKIAogI2Vsc2UKICNkZWZpbmUgVjcoeCkgeApAQCAtNDcsNTUgKzQ4LDU0IEBACiAKICNlbmRpZgogCi1leHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZHJ2cl9zdGF0ZTsKIAogCiAjaWYgMQogdV9pbnQzMl90Ci1wY2lfcmVhZF8zMiAodV9pbnQzMl90ICpwKQorcGNpX3JlYWRfMzIodV9pbnQzMl90ICpwKQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICB1X2ludDMyX3QgICB2OworCXVfaW50MzJfdCAgIHY7CiAKLSAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKLSAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCi0gICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7Ci0gICAgcmV0dXJuIHY7CisJRkxVU0hfUENJX1JFQUQoKTsKKwl2ID0gbGUzMl90b19jcHUoKnApOworCWlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKKwkJcHJfaW5mbygicGNpX3JlYWQgOiAleCA9ICV4XG4iLCAodV9pbnQzMl90KSBwLCB2KTsKKwlyZXR1cm4gdjsKICNlbHNlCi0gICAgRkxVU0hfUENJX1JFQUQgKCk7ICAgICAgICAgICAgICAvKiAqLwotICAgIHJldHVybiBsZTMyX3RvX2NwdSAoKnApOworCUZMVVNIX1BDSV9SRUFEKCk7ICAgICAgICAgICAgICAvKiAqLworCXJldHVybiBsZTMyX3RvX2NwdSgqcCk7CiAjZW5kaWYKIH0KIAogdm9pZAotcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQorcGNpX3dyaXRlXzMyKHVfaW50MzJfdCAqcCwgdV9pbnQzMl90IHYpCiB7CiAjaWZkZWYgRkxPV19ERUJVRwotICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKLSAgICAgICAgcHJfaW5mbygicGNpX3dyaXRlOiAleCA9ICV4XG4iLCAodV9pbnQzMl90KSBwLCB2KTsKKwlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisJCXByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKLSAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKLSAgICBGTFVTSF9QQ0lfV1JJVEUgKCk7ICAgICAgICAgICAgIC8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSByb3V0aW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggZG8gbXVsdGlwbGUgcmVnaXN0ZXIgd3JpdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGljaCB0aGVtc2VsdmVzIG5lZWQgZmx1c2hpbmcgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3JpdGVzIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB3cml0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3JkZXJpbmcuICBJdCBpcyBsZXNzIGNvZGUtY3VtYmVyc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gZmx1c2ggaGVyZS1pbiB0aGVuIHRvIGludmVzdGlnYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgY29kZSB0aGUgbWFueSBvdGhlciByZWdpc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3JpdGluZyByb3V0aW5lcy4gKi8KKwkqcCA9IGNwdV90b19sZTMyICh2KTsKKwlGTFVTSF9QQ0lfV1JJVEUoKTsgICAgICAgICAgICAgLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHJvdXRpbmVzCisJCQkJCSogd2hpY2ggZG8gbXVsdGlwbGUgcmVnaXN0ZXIgd3JpdGVzCisJCQkJCSogd2hpY2ggdGhlbXNlbHZlcyBuZWVkIGZsdXNoaW5nIGJldHdlZW4KKwkJCQkJKiB3cml0ZXMgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHdyaXRlCisJCQkJCSogb3JkZXJpbmcuICBJdCBpcyBsZXNzIGNvZGUtY3VtYmVyc29tZQorCQkJCQkqIHRvIGZsdXNoIGhlcmUtaW4gdGhlbiB0byBpbnZlc3RpZ2F0ZQorCQkJCQkqIGFuZCBjb2RlIHRoZSBtYW55IG90aGVyIHJlZ2lzdGVyCisJCQkJCSogd3JpdGluZyByb3V0aW5lcy4gKi8KIH0KICNlbmRpZgogCiAKIHZvaWQKLXBjaV9mbHVzaF93cml0ZSAoY2lfdCAqY2kpCitwY2lfZmx1c2hfd3JpdGUoY2lfdCAqY2kpCiB7Ci0gICAgdm9sYXRpbGUgdV9pbnQzMl90IHY7CisJdm9sYXRpbGUgdV9pbnQzMl90IHY7CiAKICAgICAvKiBpc3N1ZSBhIFBDSSByZWFkIHRvIGZsdXNoIFBDSSB3cml0ZSB0aHJ1IGJyaWRnZSAqLwotICAgIHYgPSAqKHVfaW50MzJfdCAqKSAmY2ktPnJlZy0+Z2xjZDsgIC8qIGFueSBhZGRyZXNzIHdvdWxkIGRvICovCisJdiA9ICoodV9pbnQzMl90ICopICZjaS0+cmVnLT5nbGNkOyAgLyogYW55IGFkZHJlc3Mgd291bGQgZG8gKi8KIAogICAgIC8qCiAgICAgICogcmV0dXJuIG5vdGhpbmcsIHRoaXMganVzdCByZWFkcyBQQ0kgYnJpZGdlIGludGVyZmFjZSB0byBmbHVzaApAQCAtMTA1LDU1ICsxMDUsNTMgQEAKIAogCiBzdGF0aWMgdm9pZAotd2F0Y2hkb2dfZnVuYyAodW5zaWduZWQgbG9uZyBhcmcpCit3YXRjaGRvZ19mdW5jKHVuc2lnbmVkIGxvbmcgYXJnKQogewotICAgIHN0cnVjdCB3YXRjaGRvZyAqd2QgPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IHdhdGNoZG9nICp3ZCA9ICh2b2lkICopIGFyZzsKIAotICAgIGlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkKLSAgICB7Ci0gICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQotICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IGRydnIgbm90IGF2YWlsYWJsZSAoJXgpXG4iLCBfX2Z1bmNfXywgZHJ2cl9zdGF0ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2NoZWR1bGVfd29yayAoJndkLT53b3JrKTsKLSAgICBtb2RfdGltZXIgKCZ3ZC0+aCwgamlmZmllcyArIHdkLT50aWNrcyk7CisJaWYgKGRydnJfc3RhdGUgIT0gU0JFX0RSVlJfQVZBSUxBQkxFKSB7CisJCWlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQorCQkJcHJfd2FybmluZygiJXM6IGRydnIgbm90IGF2YWlsYWJsZSAoJXgpXG4iLAorCQkJCSAgIF9fZnVuY19fLCBkcnZyX3N0YXRlKTsKKwkJcmV0dXJuOworCX0KKwlzY2hlZHVsZV93b3JrKCZ3ZC0+d29yayk7CisJbW9kX3RpbWVyKCZ3ZC0+aCwgamlmZmllcyArIHdkLT50aWNrcyk7CiB9CiAKLWludCBPU19pbml0X3dhdGNoZG9nKHN0cnVjdCB3YXRjaGRvZyAqd2RwLCB2b2lkICgqZikgKHZvaWQgKiksIHZvaWQgKmMsIGludCB1c2VjKQoraW50IE9TX2luaXRfd2F0Y2hkb2coc3RydWN0IHdhdGNoZG9nICp3ZHAsIHZvaWQgKCpmKSAodm9pZCAqKSwKKwkJICAgICB2b2lkICpjLCBpbnQgdXNlYykKIHsKLSAgICB3ZHAtPmZ1bmMgPSBmOwotICAgIHdkcC0+c29mdGMgPSBjOwotICAgIHdkcC0+dGlja3MgPSAoSFopICogKHVzZWMgLyAxMDAwKSAvIDEwMDA7Ci0gICAgSU5JVF9XT1JLKCZ3ZHAtPndvcmssICh2b2lkICopZik7Ci0gICAgaW5pdF90aW1lciAoJndkcC0+aCk7Ci0gICAgewotICAgICAgICBjaV90ICAgICAgICpjaSA9IChjaV90ICopIGM7CisJd2RwLT5mdW5jID0gZjsKKwl3ZHAtPnNvZnRjID0gYzsKKwl3ZHAtPnRpY2tzID0gKEhaKSAqICh1c2VjIC8gMTAwMCkgLyAxMDAwOworCUlOSVRfV09SSygmd2RwLT53b3JrLCAodm9pZCAqKWYpOworCWluaXRfdGltZXIoJndkcC0+aCk7CisJeworCQljaV90ICAgICAgICpjaSA9IChjaV90ICopIGM7CiAKLSAgICAgICAgd2RwLT5oLmRhdGEgPSAodW5zaWduZWQgbG9uZykgJmNpLT53ZDsKLSAgICB9Ci0gICAgd2RwLT5oLmZ1bmN0aW9uID0gd2F0Y2hkb2dfZnVuYzsKLSAgICByZXR1cm4gMDsKKwkJd2RwLT5oLmRhdGEgPSAodW5zaWduZWQgbG9uZykgJmNpLT53ZDsKKwl9CisJd2RwLT5oLmZ1bmN0aW9uID0gd2F0Y2hkb2dfZnVuYzsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZAotT1NfdXdhaXQgKGludCB1c2VjLCBjaGFyICpkZXNjcmlwdGlvbikKK09TX3V3YWl0KGludCB1c2VjLCBjaGFyICpkZXNjcmlwdGlvbikKIHsKLSAgICBpbnQgICAgICAgICB0bXA7CisJaW50ICAgICAgICAgdG1wOwogCi0gICAgaWYgKHVzZWMgPj0gMTAwMCkKLSAgICB7Ci0gICAgICAgIG1kZWxheSAodXNlYyAvIDEwMDApOwotICAgICAgICAvKiBub3cgZGVsYXkgcmVzaWR1YWwgKi8KLSAgICAgICAgdG1wID0gKHVzZWMgLyAxMDAwKSAqIDEwMDA7IC8qIHJvdW5kICovCi0gICAgICAgIHRtcCA9IHVzZWMgLSB0bXA7ICAgICAgICAgICAvKiByZXNpZHVhbCAqLwotICAgICAgICBpZiAodG1wKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2FpdCBvbiByZXNpZHVhbCAqLwotICAgICAgICAgICAgdWRlbGF5ICh0bXApOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICB1ZGVsYXkgKHVzZWMpOwotICAgIH0KKwlpZiAodXNlYyA+PSAxMDAwKSB7CisJCW1kZWxheSh1c2VjIC8gMTAwMCk7CisJCS8qIG5vdyBkZWxheSByZXNpZHVhbCAqLworCQl0bXAgPSAodXNlYyAvIDEwMDApICogMTAwMDsgLyogcm91bmQgKi8KKwkJdG1wID0gdXNlYyAtIHRtcDsgICAgICAgICAgIC8qIHJlc2lkdWFsICovCisJCWlmICh0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3YWl0IG9uIHJlc2lkdWFsICovCisJCQl1ZGVsYXkodG1wKTsKKwkJfQorCX0gZWxzZSB7CisJCXVkZWxheSh1c2VjKTsKKwl9CiB9CiAKIC8qIGR1bW15IHNob3J0IGRlbGF5IHJvdXRpbmUgY2FsbGVkIGFzIGEgc3Vicm91dGluZSBzbyB0aGF0IGNvbXBpbGVyCkBAIC0xNjEsOTYgKzE1OSw5NSBAQAogICovCiAKIHZvaWQKLU9TX3V3YWl0X2R1bW15ICh2b2lkKQorT1NfdXdhaXRfZHVtbXkodm9pZCkKIHsKICNpZm5kZWYgVVNFX01BWF9JTlRfREVMQVkKLSAgICBkdW1teSsrOworCWR1bW15Kys7CiAjZWxzZQotICAgIHVkZWxheSAoMSk7CisJdWRlbGF5KDEpOwogI2VuZGlmCiB9CiAKIAogdm9pZAotT1Nfc2VtX2luaXQgKHZvaWQgKnNlbSwgaW50IHN0YXRlKQorT1Nfc2VtX2luaXQodm9pZCAqc2VtLCBpbnQgc3RhdGUpCiB7Ci0gICAgc3dpdGNoIChzdGF0ZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgU0VNX1RBS0VOOgotCQlzZW1hX2luaXQoKHN0cnVjdCBzZW1hcGhvcmUgKikgc2VtLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTRU1fQVZBSUxBQkxFOgorCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNFTV9UQUtFTjoKKwkgICAgc2VtYV9pbml0KChzdHJ1Y3Qgc2VtYXBob3JlICopIHNlbSwgMCk7CisJICAgIGJyZWFrOworCWNhc2UgU0VNX0FWQUlMQUJMRToKIAkgICAgc2VtYV9pbml0KChzdHJ1Y3Qgc2VtYXBob3JlICopIHNlbSwgMSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBzZXQgc2VtLmNvdW50IHRvIHN0YXRlJ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZhbHVlICovCi0gICAgICAgIHNlbWFfaW5pdCAoc2VtLCBzdGF0ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UsIHNldCBzZW0uY291bnQgdG8gc3RhdGUncworCQkJCQkqIHZhbHVlICovCisJICAgIHNlbWFfaW5pdChzZW0sIHN0YXRlKTsKKwkgICAgYnJlYWs7CisJfQogfQogCiAKIGludAotc2RfbGluZV9pc19vayAodm9pZCAqdXNlcikKK3NkX2xpbmVfaXNfb2sodm9pZCAqdXNlcikKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CiAKLSAgICByZXR1cm4gbmV0aWZfY2Fycmllcl9vayAobmRldik7CisJcmV0dXJuIG5ldGlmX2NhcnJpZXJfb2sobmRldik7CiB9CiAKIHZvaWQKLXNkX2xpbmVfaXNfdXAgKHZvaWQgKnVzZXIpCitzZF9saW5lX2lzX3VwKHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOwogCi0gICAgbmV0aWZfY2Fycmllcl9vbiAobmRldik7Ci0gICAgcmV0dXJuOworCW5ldGlmX2NhcnJpZXJfb24obmRldik7CisJcmV0dXJuOwogfQogCiB2b2lkCi1zZF9saW5lX2lzX2Rvd24gKHZvaWQgKnVzZXIpCitzZF9saW5lX2lzX2Rvd24odm9pZCAqdXNlcikKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CiAKLSAgICBuZXRpZl9jYXJyaWVyX29mZiAobmRldik7Ci0gICAgcmV0dXJuOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOworCXJldHVybjsKIH0KIAogdm9pZAotc2RfZGlzYWJsZV94bWl0ICh2b2lkICp1c2VyKQorc2RfZGlzYWJsZV94bWl0KHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKIAotICAgIG5ldGlmX3N0b3BfcXVldWUgKGRldik7Ci0gICAgcmV0dXJuOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm47CiB9CiAKIHZvaWQKLXNkX2VuYWJsZV94bWl0ICh2b2lkICp1c2VyKQorc2RfZW5hYmxlX3htaXQodm9pZCAqdXNlcikKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOwogCi0gICAgbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKLSAgICByZXR1cm47CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybjsKIH0KIAogaW50Ci1zZF9xdWV1ZV9zdG9wcGVkICh2b2lkICp1c2VyKQorc2RfcXVldWVfc3RvcHBlZCh2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKIAotICAgIHJldHVybiBuZXRpZl9xdWV1ZV9zdG9wcGVkIChuZGV2KTsKKwlyZXR1cm4gbmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KTsKIH0KIAogdm9pZCBzZF9yZWN2X2NvbnN1bWUodm9pZCAqdG9rZW4sIHNpemVfdCBsZW4sIHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB1c2VyOwotICAgIHN0cnVjdCBza19idWZmICpza2IgPSB0b2tlbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHVzZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRva2VuOwogCi0gICAgc2tiLT5kZXYgPSBuZGV2OwotICAgIHNrYl9wdXQgKHNrYiwgbGVuKTsKLSAgICBza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgbmRldik7Ci0gICAgbmV0aWZfcngoc2tiKTsKKwlza2ItPmRldiA9IG5kZXY7CisJc2tiX3B1dChza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIG5kZXYpOworCW5ldGlmX3J4KHNrYik7CiB9CiAKIApAQCAtMjYzLDg2ICsyNjAsNzYgQEAKIAogZXh0ZXJuIGNpX3QgKkNJOyAgICAgICAgICAgICAgICAvKiBkdW1teSBwb2ludGVyIHRvIGJvYXJkIFpFUk8ncyBkYXRhICovCiB2b2lkCi1WTUVUUk9fVFJBQ0UgKHZvaWQgKngpCitWTUVUUk9fVFJJR0dFUihjaV90ICpjaSwgaW50IHgpCiB7Ci0gICAgdV9pbnQzMl90ICAgeSA9ICh1X2ludDMyX3QpIHg7CisJc3RydWN0IHNfY29tZXRfcmVnICAgICpjb21ldDsKKwl2b2xhdGlsZSB1X2ludDMyX3QgZGF0YTsKIAotICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmQ0ktPmNwbGRiYXNlLT5sZWRzLCB5KTsKLX0KKwljb21ldCA9IGNpLT5wb3J0WzBdLmNvbWV0YmFzZTsgIC8qIGRlZmF1bHQgdG8gQ09NRVQgIyAwICovCiAKLQotdm9pZAotVk1FVFJPX1RSSUdHRVIgKGNpX3QgKmNpLCBpbnQgeCkKLXsKLSAgICBzdHJ1Y3Qgc19jb21ldF9yZWcgICAgKmNvbWV0OwotICAgIHZvbGF0aWxlIHVfaW50MzJfdCBkYXRhOwotCi0gICAgY29tZXQgPSBjaS0+cG9ydFswXS5jb21ldGJhc2U7ICAvKiBkZWZhdWx0IHRvIENPTUVUICMgMCAqLwotCi0gICAgc3dpdGNoICh4KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNCk7ICAgICAvKiAweDkwICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNSk7ICAgICAvKiAweDk0ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNik7ICAgICAvKiAweDk4ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNyk7ICAgICAvKiAweDlDICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4OCk7ICAgICAvKiAweDIyMCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODkpOyAgICAgLyogMHgyMjQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3JlczhBKTsgICAgIC8qIDB4MjI4ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4Qik7ICAgICAvKiAweDIyQyAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTApOyAgICAgLyogMHgyODAgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0ExKTsgICAgIC8qIDB4Mjg0ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTA6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTIpOyAgICAgLyogMHgyODggKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMToKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMyk7ICAgICAvKiAweDI4QyAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E0KTsgICAgIC8qIDB4MjkwICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTM6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTUpOyAgICAgLyogMHgyOTQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNDoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNik7ICAgICAvKiAweDI5OCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE1OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E3KTsgICAgIC8qIDB4MjlDICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzQpOyAgICAgLyogMHgxRDAgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM3NSk7ICAgICAvKiAweDFENCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE4OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc2KTsgICAgIC8qIDB4MUQ4ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTk6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzcpOyAgICAgLyogMHgxREMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCXN3aXRjaCAoeCkgeworCWRlZmF1bHQ6CisJY2FzZSAwOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjQpOyAgICAgLyogMHg5MCAqLworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNSk7ICAgICAvKiAweDk0ICovCisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3JlczI2KTsgICAgIC8qIDB4OTggKi8KKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjcpOyAgICAgLyogMHg5QyAqLworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4OCk7ICAgICAvKiAweDIyMCAqLworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4OSk7ICAgICAvKiAweDIyNCAqLworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4QSk7ICAgICAvKiAweDIyOCAqLworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4Qik7ICAgICAvKiAweDIyQyAqLworCSAgICBicmVhazsKKwljYXNlIDg6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMCk7ICAgICAvKiAweDI4MCAqLworCSAgICBicmVhazsKKwljYXNlIDk6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMSk7ICAgICAvKiAweDI4NCAqLworCSAgICBicmVhazsKKwljYXNlIDEwOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTIpOyAgICAgLyogMHgyODggKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxMToKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EzKTsgICAgIC8qIDB4MjhDICovCisJICAgIGJyZWFrOworCWNhc2UgMTI6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNCk7ICAgICAvKiAweDI5MCAqLworCSAgICBicmVhazsKKwljYXNlIDEzOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTUpOyAgICAgLyogMHgyOTQgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxNDoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E2KTsgICAgIC8qIDB4Mjk4ICovCisJICAgIGJyZWFrOworCWNhc2UgMTU6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNyk7ICAgICAvKiAweDI5QyAqLworCSAgICBicmVhazsKKwljYXNlIDE2OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzQpOyAgICAgLyogMHgxRDAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxNzoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc1KTsgICAgIC8qIDB4MUQ0ICovCisJICAgIGJyZWFrOworCWNhc2UgMTg6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM3Nik7ICAgICAvKiAweDFEOCAqLworCSAgICBicmVhazsKKwljYXNlIDE5OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzcpOyAgICAgLyogMHgxREMgKi8KKwkgICAgYnJlYWs7CisJfQogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKaW5kZXggMDJiNGY4Zi4uOWI0MTk4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKQEAgLTMxLDM2MCArMzEsMzUyIEBACiAjaW5jbHVkZSAic2JlcHJvYy5oIgogI2VuZGlmCiAKLWV4dGVybiBpbnQgIGN4dDFlMV9sb2dfbGV2ZWw7CiBleHRlcm4gaW50ICBlcnJvcl9mbGFnOwogZXh0ZXJuIGludCAgZHJ2cl9zdGF0ZTsKIAogLyogZm9yd2FyZCByZWZlcmVuY2VzICovCi12b2lkICAgICAgICBjNF9zdG9wd2QgKGNpX3QgKik7Ci1zdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBjNF9hZGRfZGV2IChoZHdfaW5mb190ICosIGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50LCBpbnQpOwordm9pZCAgICAgICAgYzRfc3RvcHdkKGNpX3QgKik7CitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBjNF9hZGRfZGV2KGhkd19pbmZvX3QgKiwgaW50LCB1bnNpZ25lZCBsb25nLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIGludCwgaW50KTsKIAogCiBzdHJ1Y3Qgc19oZHdfaW5mbyBoZHdfaW5mb1tNQVhfQk9BUkRTXTsKIAogCi12b2lkICAgICAgICBfX2luaXQKLXNob3dfdHdvIChoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vKQordm9pZCBfX2luaXQKK3Nob3dfdHdvKGhkd19pbmZvX3QgKmhpLCBpbnQgYnJkbm8pCiB7Ci0gICAgY2lfdCAgICAgICAqY2k7Ci0gICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0gICAgY2hhciAgICAgICAqYmlkOwotICAgIGNoYXIgICAgICAgKmJwLCBiYW5uZXJbODBdOwotICAgIGNoYXIgICAgICAgIHNuWzZdOworCWNpX3QgICAgICAgKmNpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWNoYXIgICAgICAgKmJpZDsKKwljaGFyICAgICAgIGJhbm5lcls4MF07CisJY2hhcglzbls2XSA9IHswLH07CiAKLSAgICBicCA9IGJhbm5lcjsKLSAgICBtZW1zZXQgKGJhbm5lciwgMCwgODApOyAgICAgICAgIC8qIGNsZWFyIHByaW50IGJ1ZmZlciAqLworCWNpID0gKGNpX3QgKikobmV0ZGV2X3ByaXYoaGktPm5kZXYpKTsKKwliaWQgPSBzYmVpZF9nZXRfYmRuYW1lKGNpKTsKKwlzd2l0Y2ggKGhpLT5wcm9tZm10KSB7CisJY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKKwkJbWVtY3B5KHNuLCBoaS0+bWZnX2luZm8ucGZ0MS5TZXJpYWwsIDYpOworCQlicmVhazsKKwljYXNlIFBST01fRk9STUFUX1RZUEUyOgorCQltZW1jcHkoc24sIGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCwgNik7CisJCWJyZWFrOworCX0KIAotICAgIGNpID0gKGNpX3QgKikobmV0ZGV2X3ByaXYoaGktPm5kZXYpKTsKLSAgICBiaWQgPSBzYmVpZF9nZXRfYmRuYW1lIChjaSk7Ci0gICAgc3dpdGNoIChoaS0+cHJvbWZtdCkKLSAgICB7Ci0gICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKLSAgICAgICAgbWVtY3B5IChzbiwgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPTV9GT1JNQVRfVFlQRTI6Ci0gICAgICAgIG1lbWNweSAoc24sIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBtZW1zZXQgKHNuLCAwLCA2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCXNwcmludGYoYmFubmVyLCAiJXM6ICVzICBTL04gJTA2WCwgTVVTWUNDIFJldiAlMDJYIiwKKwkJaGktPmRldm5hbWUsIGJpZCwKKwkJKChzblszXSA8PCAxNikgJiAweGZmMDAwMCkgfAorCQkoKHNuWzRdIDw8IDgpICYgMHgwMGZmMDApIHwKKwkJKHNuWzVdICYgMHgwMDAwZmYpLAorCQkodV9pbnQ4X3QpIGhpLT5yZXZpZFswXSk7CiAKLSAgICBzcHJpbnRmIChiYW5uZXIsICIlczogJXMgIFMvTiAlMDZYLCBNVVNZQ0MgUmV2ICUwMlgiLAotICAgICAgICAgICAgIGhpLT5kZXZuYW1lLCBiaWQsCi0gICAgICAgICAgICAgKChzblszXSA8PCAxNikgJiAweGZmMDAwMCkgfAotICAgICAgICAgICAgICAoKHNuWzRdIDw8IDgpICYgMHgwMGZmMDApIHwKLSAgICAgICAgICAgICAgKHNuWzVdICYgMHgwMDAwZmYpLAotICAgICAgICAgICAgICh1X2ludDhfdCkgaGktPnJldmlkWzBdKTsKKwlwcl9pbmZvKCIlc1xuIiwgYmFubmVyKTsKIAotICAgIHByX2luZm8oIiVzXG4iLCBiYW5uZXIpOworCXBkZXYgPSBoaS0+cGRldlswXTsKKwlwcl9pbmZvKCIlczogJXMgYXQgdi9wPSVseC8lbHggKCUwMng6JTAyeC4leCkgaXJxICVkXG4iLAorCQloaS0+ZGV2bmFtZSwgIk1VU1lDQyIsCisJCSh1bnNpZ25lZCBsb25nKSBoaS0+YWRkcl9tYXBwZWRbMF0sIGhpLT5hZGRyWzBdLAorCQloaS0+cGNpX2J1c25vLCAodV9pbnQ4X3QpIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKKwkJKHVfaW50OF90KSBQQ0lfRlVOQyhwZGV2LT5kZXZmbiksIHBkZXYtPmlycSk7CiAKLSAgICBwZGV2ID0gaGktPnBkZXZbMF07Ci0gICAgcHJfaW5mbygiJXM6ICVzIGF0IHYvcD0lbHgvJWx4ICglMDJ4OiUwMnguJXgpIGlycSAlZFxuIiwKLSAgICAgICAgICAgIGhpLT5kZXZuYW1lLCAiTVVTWUNDIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBoaS0+YWRkcl9tYXBwZWRbMF0sIGhpLT5hZGRyWzBdLAotICAgICAgICAgICAgaGktPnBjaV9idXNubywgKHVfaW50OF90KSBQQ0lfU0xPVCAocGRldi0+ZGV2Zm4pLAotICAgICAgICAgICAgKHVfaW50OF90KSBQQ0lfRlVOQyAocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOwotCi0gICAgcGRldiA9IGhpLT5wZGV2WzFdOwotICAgIHByX2luZm8oIiVzOiAlcyBhdCB2L3A9JWx4LyVseCAoJTAyeDolMDJ4LiV4KSBpcnEgJWRcbiIsCi0gICAgICAgICAgICBoaS0+ZGV2bmFtZSwgIkVCVVMgICIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaGktPmFkZHJfbWFwcGVkWzFdLCBoaS0+YWRkclsxXSwKLSAgICAgICAgICAgIGhpLT5wY2lfYnVzbm8sICh1X2ludDhfdCkgUENJX1NMT1QgKHBkZXYtPmRldmZuKSwKLSAgICAgICAgICAgICh1X2ludDhfdCkgUENJX0ZVTkMgKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKTsKKwlwZGV2ID0gaGktPnBkZXZbMV07CisJcHJfaW5mbygiJXM6ICVzIGF0IHYvcD0lbHgvJWx4ICglMDJ4OiUwMnguJXgpIGlycSAlZFxuIiwKKwkJaGktPmRldm5hbWUsICJFQlVTICAiLAorCQkodW5zaWduZWQgbG9uZykgaGktPmFkZHJfbWFwcGVkWzFdLCBoaS0+YWRkclsxXSwKKwkJaGktPnBjaV9idXNubywgKHVfaW50OF90KSBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJCSh1X2ludDhfdCkgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOwogfQogCiAKLXZvaWQgICAgICAgIF9faW5pdAotaGR3X3NuX2dldCAoaGR3X2luZm9fdCAqaGksIGludCBicmRubykKK3ZvaWQgX19pbml0CitoZHdfc25fZ2V0KGhkd19pbmZvX3QgKmhpLCBpbnQgYnJkbm8pCiB7Ci0gICAgLyogb2J0YWluIGhhcmR3YXJlIEVFUFJPTSBpbmZvcm1hdGlvbiAqLwotICAgIGxvbmcgICAgICAgIGFkZHI7CisJLyogb2J0YWluIGhhcmR3YXJlIEVFUFJPTSBpbmZvcm1hdGlvbiAqLworCWxvbmcgICAgICAgIGFkZHI7CiAKLSAgICBhZGRyID0gKGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSArIEVFUFJPTV9PRkZTRVQ7CisJYWRkciA9IChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMV0gKyBFRVBST01fT0ZGU0VUOwogCi0gICAgLyogcmVhZCBFRVBST00gd2l0aCBsYXJnZXN0IGtub3duIGZvcm1hdCBzaXplLi4uICovCi0gICAgcG1jX2VlcHJvbV9yZWFkX2J1ZmZlciAoYWRkciwgMCwgKGNoYXIgKikgaGktPm1mZ19pbmZvLmRhdGEsIHNpemVvZiAoRkxEX1RZUEUyKSk7CisJLyogcmVhZCBFRVBST00gd2l0aCBsYXJnZXN0IGtub3duIGZvcm1hdCBzaXplLi4uICovCisJcG1jX2VlcHJvbV9yZWFkX2J1ZmZlcihhZGRyLCAwLCAoY2hhciAqKWhpLT5tZmdfaW5mby5kYXRhLAorCQkJICAgICAgIHNpemVvZihGTERfVFlQRTIpKTsKIAogI2lmIDAKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnVjcCA9ICh1bnNpZ25lZCBjaGFyICopICZoaS0+bWZnX2luZm8uZGF0YTsKKwl7CisJCXVuc2lnbmVkIGNoYXIgKnVjcCA9ICh1bnNpZ25lZCBjaGFyICopICZoaS0+bWZnX2luZm8uZGF0YTsKIAotICAgICAgICBwcl9pbmZvKCJlZXByb21bMDBdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDApLCAqKHVjcCArIDEpLCAqKHVjcCArIDIpLCAqKHVjcCArIDMpLCAqKHVjcCArIDQpLCAqKHVjcCArIDUpLCAqKHVjcCArIDYpLCAqKHVjcCArIDcpKTsKLSAgICAgICAgcHJfaW5mbygiZWVwcm9tWzA4XTogICUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0gICAgICAgICAgICAgICAgKih1Y3AgKyA4KSwgKih1Y3AgKyA5KSwgKih1Y3AgKyAxMCksICoodWNwICsgMTEpLCAqKHVjcCArIDEyKSwgKih1Y3AgKyAxMyksICoodWNwICsgMTQpLCAqKHVjcCArIDE1KSk7Ci0gICAgICAgIHByX2luZm8oImVlcHJvbVsxNl06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICAgICAgICAgICoodWNwICsgMTYpLCAqKHVjcCArIDE3KSwgKih1Y3AgKyAxOCksICoodWNwICsgMTkpLCAqKHVjcCArIDIwKSwgKih1Y3AgKyAyMSksICoodWNwICsgMjIpLCAqKHVjcCArIDIzKSk7Ci0gICAgICAgIHByX2luZm8oImVlcHJvbVsyNF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICAgICAgICAgICoodWNwICsgMjQpLCAqKHVjcCArIDI1KSwgKih1Y3AgKyAyNiksICoodWNwICsgMjcpLCAqKHVjcCArIDI4KSwgKih1Y3AgKyAyOSksICoodWNwICsgMzApLCAqKHVjcCArIDMxKSk7Ci0gICAgICAgIHByX2luZm8oImVlcHJvbVszMl06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICAgICAgICAgICoodWNwICsgMzIpLCAqKHVjcCArIDMzKSwgKih1Y3AgKyAzNCksICoodWNwICsgMzUpLCAqKHVjcCArIDM2KSwgKih1Y3AgKyAzNyksICoodWNwICsgMzgpLCAqKHVjcCArIDM5KSk7Ci0gICAgICAgIHByX2luZm8oImVlcHJvbVs0MF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICAgICAgICAgICoodWNwICsgNDApLCAqKHVjcCArIDQxKSwgKih1Y3AgKyA0MiksICoodWNwICsgNDMpLCAqKHVjcCArIDQ0KSwgKih1Y3AgKyA0NSksICoodWNwICsgNDYpLCAqKHVjcCArIDQ3KSk7Ci0gICAgfQorCQlwcl9pbmZvKCJlZXByb21bMDBdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMCksICoodWNwICsgMSksICoodWNwICsgMiksICoodWNwICsgMyksCisJCQkqKHVjcCArIDQpLCAqKHVjcCArIDUpLCAqKHVjcCArIDYpLCAqKHVjcCArIDcpKTsKKwkJcHJfaW5mbygiZWVwcm9tWzA4XTogICUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkqKHVjcCArIDgpLCAqKHVjcCArIDkpLCAqKHVjcCArIDEwKSwgKih1Y3AgKyAxMSksCisJCQkqKHVjcCArIDEyKSwgKih1Y3AgKyAxMyksICoodWNwICsgMTQpLCAqKHVjcCArIDE1KSk7CisJCXByX2luZm8oImVlcHJvbVsxNl06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJKih1Y3AgKyAxNiksICoodWNwICsgMTcpLCAqKHVjcCArIDE4KSwgKih1Y3AgKyAxOSksCisJCQkqKHVjcCArIDIwKSwgKih1Y3AgKyAyMSksICoodWNwICsgMjIpLCAqKHVjcCArIDIzKSk7CisJCXByX2luZm8oImVlcHJvbVsyNF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJKih1Y3AgKyAyNCksICoodWNwICsgMjUpLCAqKHVjcCArIDI2KSwgKih1Y3AgKyAyNyksCisJCQkqKHVjcCArIDI4KSwgKih1Y3AgKyAyOSksICoodWNwICsgMzApLCAqKHVjcCArIDMxKSk7CisJCXByX2luZm8oImVlcHJvbVszMl06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJKih1Y3AgKyAzMiksICoodWNwICsgMzMpLCAqKHVjcCArIDM0KSwgKih1Y3AgKyAzNSksCisJCQkqKHVjcCArIDM2KSwgKih1Y3AgKyAzNyksICoodWNwICsgMzgpLCAqKHVjcCArIDM5KSk7CisJCXByX2luZm8oImVlcHJvbVs0MF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJKih1Y3AgKyA0MCksICoodWNwICsgNDEpLCAqKHVjcCArIDQyKSwgKih1Y3AgKyA0MyksCisJCQkqKHVjcCArIDQ0KSwgKih1Y3AgKyA0NSksICoodWNwICsgNDYpLCAqKHVjcCArIDQ3KSk7CisJfQogI2VuZGlmCiAjaWYgMAotICAgIHByX2luZm8oInNuOiAleCAleCAleCAleCAleCAleFxuIiwKLSAgICAgICAgICAgIGhpLT5tZmdfaW5mby5TZXJpYWxbMF0sCi0gICAgICAgICAgICBoaS0+bWZnX2luZm8uU2VyaWFsWzFdLAotICAgICAgICAgICAgaGktPm1mZ19pbmZvLlNlcmlhbFsyXSwKLSAgICAgICAgICAgIGhpLT5tZmdfaW5mby5TZXJpYWxbM10sCi0gICAgICAgICAgICBoaS0+bWZnX2luZm8uU2VyaWFsWzRdLAotICAgICAgICAgICAgaGktPm1mZ19pbmZvLlNlcmlhbFs1XSk7CisJcHJfaW5mbygic246ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAorCQkJaGktPm1mZ19pbmZvLlNlcmlhbFswXSwKKwkJCWhpLT5tZmdfaW5mby5TZXJpYWxbMV0sCisJCQloaS0+bWZnX2luZm8uU2VyaWFsWzJdLAorCQkJaGktPm1mZ19pbmZvLlNlcmlhbFszXSwKKwkJCWhpLT5tZmdfaW5mby5TZXJpYWxbNF0sCisJCQloaS0+bWZnX2luZm8uU2VyaWFsWzVdKTsKICNlbmRpZgogCi0gICAgaWYgKChoaS0+cHJvbWZtdCA9IHBtY192ZXJpZnlfY2tzdW0gKCZoaS0+bWZnX2luZm8uZGF0YSkpID09IFBST01fRk9STUFUX1VuaykKLSAgICB7Ci0gICAgICAgIC8qIGJhZCBjcmMsIGRhdGEgaXMgc3VzcGVjdCAqLwotICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKLSAgICAgICAgICAgIHByX2luZm8oIiVzOiBFRVBST00gY2tzdW0gZXJyb3JcbiIsIGhpLT5kZXZuYW1lKTsKLSAgICAgICAgaGktPm1mZ19pbmZvX3N0cyA9IEVFUFJPTV9DUkNFUlI7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fT0s7CisJaGktPnByb21mbXQgPSBwbWNfdmVyaWZ5X2Nrc3VtKCZoaS0+bWZnX2luZm8uZGF0YSk7CisJaWYgKGhpLT5wcm9tZm10ID09IFBST01fRk9STUFUX1VuaykgeworCQkvKiBiYWQgY3JjLCBkYXRhIGlzIHN1c3BlY3QgKi8KKwkJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCisJCQlwcl9pbmZvKCIlczogRUVQUk9NIGNrc3VtIGVycm9yXG4iLCBoaS0+ZGV2bmFtZSk7CisJCWhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fQ1JDRVJSOworCX0gZWxzZQorCQloaS0+bWZnX2luZm9fc3RzID0gRUVQUk9NX09LOwogfQogCiAKLXZvaWQgICAgICAgIF9faW5pdAotcHJlcF9oZHdfaW5mbyAodm9pZCkKKwl2b2lkIF9faW5pdAorcHJlcF9oZHdfaW5mbyh2b2lkKQogewotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGludCAgICAgICAgIGk7CisJaGR3X2luZm9fdCAqaGk7CisJaW50ICAgICAgICAgaTsKIAotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICBoaS0+cGNpX2J1c25vID0gMHhmZjsKLSAgICAgICAgaGktPnBjaV9zbG90ID0gMHhmZjsKLSAgICAgICAgaGktPnBjaV9waW5bMF0gPSAwOwotICAgICAgICBoaS0+cGNpX3BpblsxXSA9IDA7Ci0gICAgICAgIGhpLT5uZGV2ID0gTlVMTDsKLSAgICAgICAgaGktPmFkZHJbMF0gPSAwTDsKLSAgICAgICAgaGktPmFkZHJbMV0gPSAwTDsKLSAgICAgICAgaGktPmFkZHJfbWFwcGVkWzBdID0gMEw7Ci0gICAgICAgIGhpLT5hZGRyX21hcHBlZFsxXSA9IDBMOwotICAgIH0KKwlmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKSB7CisJCWhpLT5wY2lfYnVzbm8gPSAweGZmOworCQloaS0+cGNpX3Nsb3QgPSAweGZmOworCQloaS0+cGNpX3BpblswXSA9IDA7CisJCWhpLT5wY2lfcGluWzFdID0gMDsKKwkJaGktPm5kZXYgPSBOVUxMOworCQloaS0+YWRkclswXSA9IDBMOworCQloaS0+YWRkclsxXSA9IDBMOworCQloaS0+YWRkcl9tYXBwZWRbMF0gPSAwTDsKKwkJaGktPmFkZHJfbWFwcGVkWzFdID0gMEw7CisJfQogfQogCiB2b2lkCi1jbGVhbnVwX2lvcmVtYXAgKHZvaWQpCitjbGVhbnVwX2lvcmVtYXAodm9pZCkKIHsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBpbnQgICAgICAgICBpOworCWhkd19pbmZvX3QgKmhpOworCWludCAgICAgICAgIGk7CiAKLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChoaS0+YWRkcl9tYXBwZWRbMF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlvdW5tYXAgKCh2b2lkICopIChoaS0+YWRkcl9tYXBwZWRbMF0pKTsKLSAgICAgICAgICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoKGxvbmcpIGhpLT5hZGRyWzBdLCBoaS0+bGVuWzBdKTsKLSAgICAgICAgICAgIGhpLT5hZGRyX21hcHBlZFswXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhpLT5hZGRyX21hcHBlZFsxXSkKLSAgICAgICAgewotICAgICAgICAgICAgaW91bm1hcCAoKHZvaWQgKikgKGhpLT5hZGRyX21hcHBlZFsxXSkpOwotICAgICAgICAgICAgcmVsZWFzZV9tZW1fcmVnaW9uICgobG9uZykgaGktPmFkZHJbMV0sIGhpLT5sZW5bMV0pOwotICAgICAgICAgICAgaGktPmFkZHJfbWFwcGVkWzFdID0gMDsKLSAgICAgICAgfQotICAgIH0KKwlmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKSB7CisJCWlmIChoaS0+cGNpX3Nsb3QgPT0gMHhmZikKKwkJCWJyZWFrOworCQlpZiAoaGktPmFkZHJfbWFwcGVkWzBdKSB7CisJCQlpb3VubWFwKCh2b2lkICopKGhpLT5hZGRyX21hcHBlZFswXSkpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKChsb25nKSBoaS0+YWRkclswXSwgaGktPmxlblswXSk7CisJCQloaS0+YWRkcl9tYXBwZWRbMF0gPSAwOworCQl9CisJCWlmIChoaS0+YWRkcl9tYXBwZWRbMV0pIHsKKwkJCWlvdW5tYXAoKHZvaWQgKikoaGktPmFkZHJfbWFwcGVkWzFdKSk7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oKGxvbmcpIGhpLT5hZGRyWzFdLCBoaS0+bGVuWzFdKTsKKwkJCWhpLT5hZGRyX21hcHBlZFsxXSA9IDA7CisJCX0KKwl9CiB9CiAKIAogdm9pZAotY2xlYW51cF9kZXZzICh2b2lkKQorY2xlYW51cF9kZXZzKHZvaWQpCiB7Ci0gICAgaGR3X2luZm9fdCAqaGk7Ci0gICAgaW50ICAgICAgICAgaTsKKwloZHdfaW5mb190ICpoaTsKKwlpbnQgICAgICAgICBpOwogCi0gICAgZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChoaS0+cGNpX3Nsb3QgPT0gMHhmZiB8fCAhaGktPm5kZXYpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgYzRfc3RvcHdkKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7CisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQlpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYgfHwgIWhpLT5uZGV2KQorCQkJYnJlYWs7CisJCWM0X3N0b3B3ZChuZXRkZXZfcHJpdihoaS0+bmRldikpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICAgICAgIHNiZWNvbV9wcm9jX2JyZF9jbGVhbnVwKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7CisJCXNiZWNvbV9wcm9jX2JyZF9jbGVhbnVwKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7CiAjZW5kaWYKLSAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYgKGhpLT5uZGV2KTsKLSAgICAgICAgZnJlZV9pcnEgKGhpLT5wZGV2WzBdLT5pcnEsIGhpLT5uZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoaGktPm5kZXYpOworCQlmcmVlX2lycShoaS0+cGRldlswXS0+aXJxLCBoaS0+bmRldik7CiAjaWZkZWYgQ09ORklHX1NCRV9QTUNDNF9OQ09NTQotICAgICAgICBmcmVlX2lycSAoaGktPnBkZXZbMV0tPmlycSwgaGktPm5kZXYpOworCQlmcmVlX2lycShoaS0+cGRldlsxXS0+aXJxLCBoaS0+bmRldik7CiAjZW5kaWYKLSAgICAgICAgT1Nfa2ZyZWUgKGhpLT5uZGV2KTsKLSAgICB9CisJCU9TX2tmcmVlKGhpLT5uZGV2KTsKKwl9CiB9CiAKIAogc3RhdGljIGludCAgX19pbml0Ci1jNF9oZHdfaW5pdCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBmb3VuZCkKK2M0X2hkd19pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZm91bmQpCiB7Ci0gICAgaGR3X2luZm9fdCAqaGk7Ci0gICAgaW50ICAgICAgICAgaTsKLSAgICBpbnQgICAgICAgICBmdW4sIHNsb3Q7Ci0gICAgdW5zaWduZWQgY2hhciBidXNubyA9IDB4ZmY7CisJaGR3X2luZm9fdCAqaGk7CisJaW50ICAgICAgICAgaTsKKwlpbnQgICAgICAgICBmdW4sIHNsb3Q7CisJdW5zaWduZWQgY2hhciBidXNubyA9IDB4ZmY7CiAKLSAgICAvKiBvdXIgTVVTWUNDIGNoaXAgc3VwcG9ydHMgdHdvIGZ1bmN0aW9ucywgMCAmIDEgKi8KLSAgICBpZiAoKGZ1biA9IFBDSV9GVU5DIChwZGV2LT5kZXZmbikpID4gMSkKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGV2ZnVuOiAweCV4XG4iLCBwZGV2LT5kZXZmbik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAocGRldi0+YnVzKSAgICAgICAgICAgICAgICAgIC8qIG9idGFpbiBidXMgbnVtYmVyICovCi0gICAgICAgIGJ1c25vID0gcGRldi0+YnVzLT5udW1iZXI7Ci0gICAgZWxzZQotICAgICAgICBidXNubyA9IDA7ICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCBmb3Igc3lzdGVtIFBDSSBpbmNvbnNpc3RlbmN5ICovCi0gICAgc2xvdCA9IHBkZXYtPmRldmZuICYgfjB4MDc7CisJLyogb3VyIE1VU1lDQyBjaGlwIHN1cHBvcnRzIHR3byBmdW5jdGlvbnMsIDAgJiAxICovCisJZnVuID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOworCWlmIChmdW4gPiAxKSB7CisJCXByX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGV2ZnVuOiAweCV4XG4iLCBwZGV2LT5kZXZmbik7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qCi0gICAgICogRnVuY3Rpb25zIDAgJiAxIGZvciBhIGdpdmVuIGJvYXJkIChpZGVudGlmaWVkIGJ5IHNhbWUgYnVzKGJ1c25vKSBhbmQKLSAgICAgKiBzbG90KHNsb3QpKSBhcmUgcGxhY2VkIGludG8gdGhlIHNhbWUgJ2hhcmR3YXJlJyBzdHJ1Y3R1cmUuICBUaGUgZmlyc3QKLSAgICAgKiBwYXJ0IG9mIHRoZSBib2FyZCdzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwbGFjZWQgaW50byBhbiB1bnBvcHVsYXRlZAotICAgICAqIGVsZW1lbnQsIGlkZW50aWZpZWQgYnkgInNsb3Q9PSgweGZmKSIuICBUaGUgc2Vjb25kIHBhcnQgb2YgYSBib2FyZCdzCi0gICAgICogZnVuY3Rpb25hbGl0eSB3aWxsIG1hdGNoIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzbG90L2J1c25vLgotICAgICAqLwotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBtYXRjaCB3aXRoIGJvYXJkJ3MgZmlyc3QgZm91bmQgaW50ZXJmYWNlLCBvdGhlcndpc2UgdGhpcyBpcyBmaXJzdAotICAgICAgICAgKiBmb3VuZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChoaS0+cGNpX3Nsb3QgPT0gMHhmZikgfHwgICAvKiBuZXcgYm9hcmQgKi8KLSAgICAgICAgICAgICgoaGktPnBjaV9zbG90ID09IHNsb3QpICYmIChoaS0+YnVzID09IHBkZXYtPmJ1cykpKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZm91bmQgZm9yLWxvb3AgZXhpdCAqLwotICAgIH0KLSAgICBpZiAoaSA9PSBNQVhfQk9BUkRTKSAgICAgICAgICAgIC8qIG5vIG1hdGNoIGluIGFib3ZlIGxvb3AgbWVhbnMgTUFYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBleGNlZWRlZCAqLwotICAgIHsKLSAgICAgICAgcHJfd2FybmluZygiZXhjZWVkZWQgbnVtYmVyIG9mIGFsbG93ZWQgZGV2aWNlcyAoPiVkKT9cbiIsIE1BWF9CT0FSRFMpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBkZXYtPmJ1cykKLSAgICAgICAgaGktPnBjaV9idXNubyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwotICAgIGVsc2UKLSAgICAgICAgaGktPnBjaV9idXNubyA9IDA7ICAgICAgICAgIC8qIGRlZmF1bHQgZm9yIHN5c3RlbSBQQ0kgaW5jb25zaXN0ZW5jeSAqLwotICAgIGhpLT5wY2lfc2xvdCA9IHNsb3Q7Ci0gICAgcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmaGktPnBjaV9waW5bZnVuXSk7Ci0gICAgcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmhpLT5yZXZpZFtmdW5dKTsKLSAgICBoaS0+YnVzID0gcGRldi0+YnVzOwotICAgIGhpLT5hZGRyW2Z1bl0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOwotICAgIGhpLT5sZW5bZnVuXSA9IHBjaV9yZXNvdXJjZV9lbmQgKHBkZXYsIDApIC0gaGktPmFkZHJbZnVuXSArIDE7Ci0gICAgaGktPnBkZXZbZnVuXSA9IHBkZXY7CisJLyogb2J0YWluIGJ1cyBudW1iZXIgKi8KKwlpZiAocGRldi0+YnVzKQorCQlidXNubyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCWVsc2UKKwkJYnVzbm8gPSAwOyAvKiBkZWZhdWx0IGZvciBzeXN0ZW0gUENJIGluY29uc2lzdGVuY3kgKi8KKwlzbG90ID0gcGRldi0+ZGV2Zm4gJiB+MHgwNzsKIAotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogY3JlYXRlIGRldmljZSBuYW1lIGZyb20gbW9kdWxlIG5hbWUsIHBsdXMgYWRkIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAgKiBib2FyZCBudW1iZXIKLSAgICAgICAgICovCi0gICAgICAgIGNoYXIgICAgICAgKmNwID0gaGktPmRldm5hbWU7CisJLyoKKwkgKiBGdW5jdGlvbnMgMCAmIDEgZm9yIGEgZ2l2ZW4gYm9hcmQgKGlkZW50aWZpZWQgYnkgc2FtZSBidXMoYnVzbm8pIGFuZAorCSAqIHNsb3Qoc2xvdCkpIGFyZSBwbGFjZWQgaW50byB0aGUgc2FtZSAnaGFyZHdhcmUnIHN0cnVjdHVyZS4gIFRoZSBmaXJzdAorCSAqIHBhcnQgb2YgdGhlIGJvYXJkJ3MgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIHBsYWNlZCBpbnRvIGFuIHVucG9wdWxhdGVkCisJICogZWxlbWVudCwgaWRlbnRpZmllZCBieSAic2xvdD09KDB4ZmYpIi4gIFRoZSBzZWNvbmQgcGFydCBvZiBhIGJvYXJkJ3MKKwkgKiBmdW5jdGlvbmFsaXR5IHdpbGwgbWF0Y2ggdGhlIHByZXZpb3VzbHkgbG9hZGVkIHNsb3QvYnVzbm8uCisJICovCisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQkvKgorCQkgKiBtYXRjaCB3aXRoIGJvYXJkJ3MgZmlyc3QgZm91bmQgaW50ZXJmYWNlLCBvdGhlcndpc2UgdGhpcyBpcworCQkgKiBmaXNydCBmb3VuZAorCQkgKi8KKwkJaWYgKChoaS0+cGNpX3Nsb3QgPT0gMHhmZikgfHwgICAvKiBuZXcgYm9hcmQgKi8KKwkJICAgICgoaGktPnBjaV9zbG90ID09IHNsb3QpICYmIChoaS0+YnVzID09IHBkZXYtPmJ1cykpKQorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZm91bmQgZm9yLWxvb3AgZXhpdCAqLworCX0KIAotICAgICAgICBzdHJjcHkgKGNwLCBLQlVJTERfTU9ETkFNRSk7Ci0gICAgICAgIGNwICs9IHN0cmxlbiAoY3ApOyAgICAgICAgICAvKiByZXBvc2l0aW9uICovCi0gICAgICAgICpjcCsrID0gJy0nOwotICAgICAgICAqY3ArKyA9ICcwJyArIChmb3VuZCAvIDIpOyAgLyogdGhlcmUgYXJlIHR3byBmb3VuZCBpbnRlcmZhY2VzIHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYm9hcmQgKi8KLSAgICAgICAgKmNwID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0aW9uICovCi0gICAgfQorCS8qIG5vIG1hdGNoIGluIGFib3ZlIGxvb3AgbWVhbnMgTUFYIGV4Y2VlZGVkICovCisJaWYgKGkgPT0gTUFYX0JPQVJEUykgeworCQlwcl93YXJuaW5nKCJleGNlZWRlZCBudW1iZXIgb2YgYWxsb3dlZCBkZXZpY2VzICg+JWQpP1xuIiwKKwkJCSAgIE1BWF9CT0FSRFMpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICByZXR1cm4gMTsKKwlpZiAocGRldi0+YnVzKQorCQloaS0+cGNpX2J1c25vID0gcGRldi0+YnVzLT5udW1iZXI7CisJZWxzZQorCQloaS0+cGNpX2J1c25vID0gMDsgLyogZGVmYXVsdCBmb3Igc3lzdGVtIFBDSSBpbmNvbnNpc3RlbmN5ICovCisKKwloaS0+cGNpX3Nsb3QgPSBzbG90OworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmaGktPnBjaV9waW5bZnVuXSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmaGktPnJldmlkW2Z1bl0pOworCWhpLT5idXMgPSBwZGV2LT5idXM7CisJaGktPmFkZHJbZnVuXSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwloaS0+bGVuW2Z1bl0gPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApIC0gaGktPmFkZHJbZnVuXSArIDE7CisJaGktPnBkZXZbZnVuXSA9IHBkZXY7CisKKwl7CisJCS8qCisJCSAqIGNyZWF0ZSBkZXZpY2UgbmFtZSBmcm9tIG1vZHVsZSBuYW1lLCBwbHVzIGFkZCB0aGUgYXBwcm9wcmlhdGUKKwkJICogYm9hcmQgbnVtYmVyCisJCSAqLworCQljaGFyICAgICAgICpjcCA9IGhpLT5kZXZuYW1lOworCisJCXN0cmNweShjcCwgS0JVSUxEX01PRE5BTUUpOworCQljcCArPSBzdHJsZW4oY3ApOyAgICAgICAgICAvKiByZXBvc2l0aW9uICovCisJCSpjcCsrID0gJy0nOworCQkqY3ArKyA9ICcwJyArIChmb3VuZCAvIDIpOyAgLyogdGhlcmUgYXJlIHR3byBmb3VuZCBpbnRlcmZhY2VzIHBlcgorCQkqIGJvYXJkICovCisJCSpjcCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGlvbiAqLworCX0KKworCXJldHVybiAxOwogfQogCi0KLXN0YXR1c190ICAgIF9faW5pdAotYzRod19hdHRhY2hfYWxsICh2b2lkKQorc3RhdHVzX3QgX19pbml0CitjNGh3X2F0dGFjaF9hbGwodm9pZCkKIHsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7Ci0gICAgaW50ICAgICAgICAgZm91bmQgPSAwLCBpLCBqOworCWhkd19pbmZvX3QgKmhpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlpbnQgICAgICAgICBmb3VuZCA9IDAsIGksIGo7CiAKLSAgICBlcnJvcl9mbGFnID0gMDsKLSAgICBwcmVwX2hkd19pbmZvICgpOwotICAgIC8qKiogc2NhbiBQQ0kgYnVzIGZvciBhbGwgcG9zc2libGUgYm9hcmRzICovCi0gICAgd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfQ09ORVhBTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0NOODQ3NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYpKSkKLSAgICB7Ci0gICAgICAgIGlmIChjNF9oZHdfaW5pdCAocGRldiwgZm91bmQpKQotICAgICAgICAgICAgZm91bmQrKzsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIk5vIGJvYXJkcyBmb3VuZFxuIik7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIGNvbnNpc3RlbnQgaGFyZHdhcmUgZm91bmQgKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5wY2lfc2xvdCAhPSAweGZmICYmICghaGktPmFkZHJbMF0gfHwgIWhpLT5hZGRyWzFdKSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IHNvbWV0aGluZyB2ZXJ5IHdyb25nIHdpdGggcGNpX2dldF9kZXZpY2VcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGhpLT5kZXZuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIGJyaW5nIGJvYXJkJ3MgbWVtb3J5IHJlZ2lvbnMgb24vbGluZSAqLwotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICBpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgewotCSAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAoaGktPmFkZHJbal0sIGhpLT5sZW5bal0sIGhpLT5kZXZuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcl93YXJuaW5nKCIlczogbWVtb3J5IGluIHVzZSwgYWRkcj0weCVseCwgbGVuPTB4JWx4ID9cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgaGktPmFkZHJbal0sIGhpLT5sZW5bal0pOwotICAgICAgICAgICAgICAgIGNsZWFudXBfaW9yZW1hcCAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhpLT5hZGRyX21hcHBlZFtqXSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwIChoaS0+YWRkcltqXSwgaGktPmxlbltqXSk7Ci0gICAgICAgICAgICBpZiAoIWhpLT5hZGRyX21hcHBlZFtqXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcl93YXJuaW5nKCIlczogaW9yZW1hcCBmYWlscywgYWRkcj0weCVseCwgbGVuPTB4JWx4ID9cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgaGktPmFkZHJbal0sIGhpLT5sZW5bal0pOwotICAgICAgICAgICAgICAgIGNsZWFudXBfaW9yZW1hcCAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgIH0KKwllcnJvcl9mbGFnID0gMDsKKwlwcmVwX2hkd19pbmZvKCk7CisJLyoqKiBzY2FuIFBDSSBidXMgZm9yIGFsbCBwb3NzaWJsZSBib2FyZHMgKi8KKwl3aGlsZSAoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NPTkVYQU5ULAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfQ044NDc0LAorCQkJCSAgICAgIHBkZXYpKSkgeworCQlpZiAoYzRfaGR3X2luaXQocGRldiwgZm91bmQpKQorCQkJZm91bmQrKzsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByX3dhcm5pbmcoIk5vIGJvYXJkcyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHNhbml0eSBjaGVjayBmb3IgY29uc2lzdGVudCBoYXJkd2FyZSBmb3VuZCAqLworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5wY2lfc2xvdCAhPSAweGZmICYmICghaGktPmFkZHJbMF0gfHwgIWhpLT5hZGRyWzFdKSkgeworCQkJcHJfd2FybmluZygiJXM6IHNvbWV0aGluZyB2ZXJ5IHdyb25nIHdpdGggcGNpX2dldF9kZXZpY2VcbiIsCisJCQkJICAgaGktPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJLyogYnJpbmcgYm9hcmQncyBtZW1vcnkgcmVnaW9ucyBvbi9saW5lICovCisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQlpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYpCisJCQlicmVhazsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGktPmFkZHJbal0sIGhpLT5sZW5bal0sIGhpLT5kZXZuYW1lKSkgeworCQkJCXByX3dhcm5pbmcoIiVzOiBtZW1vcnkgaW4gdXNlLCBhZGRyPTB4JWx4LCBsZW49MHglbHggP1xuIiwKKwkJCQkJICAgaGktPmRldm5hbWUsIGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdKTsKKwkJCQljbGVhbnVwX2lvcmVtYXAoKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJaGktPmFkZHJfbWFwcGVkW2pdID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChoaS0+YWRkcltqXSwgaGktPmxlbltqXSk7CisJCQlpZiAoIWhpLT5hZGRyX21hcHBlZFtqXSkgeworCQkJCXByX3dhcm5pbmcoIiVzOiBpb3JlbWFwIGZhaWxzLCBhZGRyPTB4JWx4LCBsZW49MHglbHggP1xuIiwKKwkJCQkJICAgaGktPmRldm5hbWUsIGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdKTsKKwkJCQljbGVhbnVwX2lvcmVtYXAoKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KICNpZmRlZiBTQkVfTUFQX0RFQlVHCi0gICAgICAgICAgICBwcl93YXJuaW5nKCIlczogaW8gcmVtYXBwZWQgZnJvbSBwaHlzICV4IHRvIHZpcnQgJXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGhpLT5kZXZuYW1lLCAodV9pbnQzMl90KSBoaS0+YWRkcltqXSwgKHVfaW50MzJfdCkgaGktPmFkZHJfbWFwcGVkW2pdKTsKKwkJCXByX3dhcm5pbmcoIiVzOiBpbyByZW1hcHBlZCBmcm9tIHBoeXMgJXggdG8gdmlydCAleFxuIiwKKwkJCQkgICBoaS0+ZGV2bmFtZSwgKHVfaW50MzJfdCkgaGktPmFkZHJbal0sCisJCQkJICAgKHVfaW50MzJfdCkgaGktPmFkZHJfbWFwcGVkW2pdKTsKICNlbmRpZgotICAgICAgICB9Ci0gICAgfQorCQl9CisJfQogCi0gICAgZHJ2cl9zdGF0ZSA9IFNCRV9EUlZSX0FWQUlMQUJMRTsKKwlkcnZyX3N0YXRlID0gU0JFX0RSVlJfQVZBSUxBQkxFOwogCi0gICAgLyogSGF2ZSBub3cgbWVtb3J5IG1hcHBlZCBhbGwgYm9hcmRzLiAgTm93IGFsbG93IGJvYXJkJ3MgYWNjZXNzIHRvIHN5c3RlbSAqLwotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICBpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlIChoaS0+cGRldlswXSkgfHwKLSAgICAgICAgICAgIHBjaV9lbmFibGVfZGV2aWNlIChoaS0+cGRldlsxXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRydnJfc3RhdGUgPSBTQkVfRFJWUl9ET1dOOwotICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IGZhaWxlZCB0byBlbmFibGUgY2FyZCAlZCBzbG90ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgaSwgaGktPnBjaV9zbG90KTsKLSAgICAgICAgICAgIGNsZWFudXBfZGV2cyAoKTsKLSAgICAgICAgICAgIGNsZWFudXBfaW9yZW1hcCAoKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0gICAgICAgIHBjaV9zZXRfbWFzdGVyIChoaS0+cGRldlswXSk7Ci0gICAgICAgIHBjaV9zZXRfbWFzdGVyIChoaS0+cGRldlsxXSk7Ci0gICAgICAgIGlmICghKGhpLT5uZGV2ID0gYzRfYWRkX2RldiAoaGksIGksIChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaS0+cGRldlswXS0+aXJxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpLT5wZGV2WzFdLT5pcnEpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZHJ2cl9zdGF0ZSA9IFNCRV9EUlZSX0RPV047Ci0gICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICAvKiBOT1RFOiBjNF9hZGRfZGV2KCkgZG9lcyBpdHMgb3duIGRldmljZSBjbGVhbnVwICovCisJLyogSGF2ZSBub3cgbWVtb3J5IG1hcHBlZCBhbGwgYm9hcmRzLiAgTm93IGFsbG93IGJvYXJkJ3MgYWNjZXNzIHRvIHN5c3RlbSAqLworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQorCQkJYnJlYWs7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShoaS0+cGRldlswXSkgfHwKKwkJICAgIHBjaV9lbmFibGVfZGV2aWNlKGhpLT5wZGV2WzFdKSkgeworCQkJZHJ2cl9zdGF0ZSA9IFNCRV9EUlZSX0RPV047CisJCQlwcl93YXJuaW5nKCIlczogZmFpbGVkIHRvIGVuYWJsZSBjYXJkICVkIHNsb3QgJWRcbiIsCisJCQkJICAgaGktPmRldm5hbWUsIGksIGhpLT5wY2lfc2xvdCk7CisJCQljbGVhbnVwX2RldnMoKTsKKwkJCWNsZWFudXBfaW9yZW1hcCgpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcGNpX3NldF9tYXN0ZXIoaGktPnBkZXZbMF0pOworCQlwY2lfc2V0X21hc3RlcihoaS0+cGRldlsxXSk7CisJCWhpLT5uZGV2ID0gYzRfYWRkX2RldihoaSwgaSwgKGxvbmcpIGhpLT5hZGRyX21hcHBlZFswXSwKKwkJCQkgICAgICAobG9uZykgaGktPmFkZHJfbWFwcGVkWzFdLAorCQkJCSAgICAgIGhpLT5wZGV2WzBdLT5pcnEsCisJCQkJICAgICAgaGktPnBkZXZbMV0tPmlycSk7CisJCWlmICghaGktPm5kZXYpIHsKKwkJCWRydnJfc3RhdGUgPSBTQkVfRFJWUl9ET1dOOworCQkJY2xlYW51cF9pb3JlbWFwKCk7CisJCQkvKiBOT1RFOiBjNF9hZGRfZGV2KCkgZG9lcyBpdHMgb3duIGRldmljZSBjbGVhbnVwICovCiAjaWYgMAotICAgICAgICAgICAgY2xlYW51cF9kZXZzICgpOworCQkJY2xlYW51cF9kZXZzKCk7CiAjZW5kaWYKLSAgICAgICAgICAgIHJldHVybiBlcnJvcl9mbGFnOyAgICAgIC8qIGVycm9yX2ZsYWcgc2V0IHcvaW4gYWRkX2RldigpICovCi0gICAgICAgIH0KLSAgICAgICAgc2hvd190d28gKGhpLCBpKTsgICAgICAgICAgIC8qIGRpc3BsYXlzIGZvdW5kIGluZm9ybWF0aW9uICovCi0gICAgfQotICAgIHJldHVybiAwOworCQkJcmV0dXJuIGVycm9yX2ZsYWc7IC8qIGVycm9yX2ZsYWcgc2V0IHcvaW4gYWRkX2RldigpICovCisJCX0KKwkJc2hvd190d28oaGksIGkpOyAvKiBkaXNwbGF5cyBmb3VuZCBpbmZvcm1hdGlvbiAqLworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqKiAgRW5kLW9mLUZpbGUgICoqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saWJzYmV3LmgKaW5kZXggNDI1NGMwNC4uYmQyYmZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saWJzYmV3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saWJzYmV3LmgKQEAgLTUxNCwzNiArNTE0LDM2IEBACiAgICAgfTsKICAgICB0eXBlZGVmIHN0cnVjdCB3YW5jZmcgd2NmZ190OwogCi0gICAgZXh0ZXJuIHdjZmdfdCAqd2FuY2ZnX2luaXQgKGNoYXIgKiwgY2hhciAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfY2FyZF9ibGluayAod2NmZ190ICosIGludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2N0bCAod2NmZ190ICosIGludCwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgaW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZGVsX2NhcmRfc3RhdHMgKHdjZmdfdCAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZGVsX2NoYW5fc3RhdHMgKHdjZmdfdCAqLCBpbnQpOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19lbmFibGVfcG9ydHMgKHdjZmdfdCAqLCBpbnQpOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19mcmVlICh3Y2ZnX3QgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9icmRhZGRyICh3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfYWRkciAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2JyZGluZm8gKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlX2JyZF9pbmZvICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfY2FyZCAod2NmZ190ICosIHN0cnVjdCBzYmVjb21fY2FyZF9wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NhcmRfY2hhbl9zdGF0cyAod2NmZ190ICosIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NhcmRfc24gKHdjZmdfdCAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NhcmRfc3RhdHMgKHdjZmdfdCAqLCBzdHJ1Y3QgdGVtdXhfY2FyZF9zdGF0cyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NoYW4gKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NoYW5fc3RhdHMgKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2RydmluZm8gKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVfZHJ2X2luZm8gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9mcmFtZXIgKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfaWlkICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlX2lpZF9pbmZvICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfc24gKHdjZmdfdCAqLCB1bnNpZ25lZCBpbnQgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3JlYWQgKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fd3J0X3ZlYyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfcmVzZXRfZGV2aWNlICh3Y2ZnX3QgKiwgaW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfc2V0X2NhcmQgKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlY29tX2NhcmRfcGFyYW0gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3NldF9jaGFuICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3NldF9mcmFtZXIgKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfbG9nbGV2ZWwgKHdjZmdfdCAqLCB1aW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfd3JpdGUgKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fd3J0X3ZlYyAqKTsKKyAgICBleHRlcm4gd2NmZ190ICp3YW5jZmdfaW5pdChjaGFyICosIGNoYXIgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfY2FyZF9ibGluayh3Y2ZnX3QgKiwgaW50KTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19jdGwod2NmZ190ICosIGludCwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgaW50KTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19kZWxfY2FyZF9zdGF0cyh3Y2ZnX3QgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZGVsX2NoYW5fc3RhdHMod2NmZ190ICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZW5hYmxlX3BvcnRzKHdjZmdfdCAqLCBpbnQpOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2ZyZWUod2NmZ190ICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9icmRhZGRyKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlX2JyZF9hZGRyICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9icmRpbmZvKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlX2JyZF9pbmZvICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jYXJkKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlY29tX2NhcmRfcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2NhcmRfY2hhbl9zdGF0cyh3Y2ZnX3QgKiwgc3RydWN0IHNiZWNvbV9jaGFuX3N0YXRzICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jYXJkX3NuKHdjZmdfdCAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2FyZF9zdGF0cyh3Y2ZnX3QgKiwgc3RydWN0IHRlbXV4X2NhcmRfc3RhdHMgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2NoYW4od2NmZ190ICosIGludCwgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jaGFuX3N0YXRzKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfZHJ2aW5mbyh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlX2Rydl9pbmZvICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9mcmFtZXIod2NmZ190ICosIGludCwgc3RydWN0IHNiZWNvbV9mcmFtZXJfcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2lpZCh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlX2lpZF9pbmZvICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9zbih3Y2ZnX3QgKiwgdW5zaWduZWQgaW50ICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX3JlYWQod2NmZ190ICosIGludCwgc3RydWN0IHNiZWNvbV93cnRfdmVjICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX3Jlc2V0X2RldmljZSh3Y2ZnX3QgKiwgaW50KTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19zZXRfY2FyZCh3Y2ZnX3QgKiwgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX3NldF9jaGFuKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19zZXRfZnJhbWVyKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX3NldF9sb2dsZXZlbCh3Y2ZnX3QgKiwgdWludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfd3JpdGUod2NmZ190ICosIGludCwgc3RydWN0IHNiZWNvbV93cnRfdmVjICopOwogCiAjaWZkZWYgTk9UX1lFVF9DT01NT04KLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X3RzaW9jICh3Y2ZnX3QgKiwgc3RydWN0IHdhbmMxdDNfdHNfaGRyICosIHN0cnVjdCB3YW5jMXQzX3RzX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfdHNpb2MgKHdjZmdfdCAqLCBzdHJ1Y3Qgd2FuYzF0M190c19wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X3RzaW9jKHdjZmdfdCAqLCBzdHJ1Y3Qgd2FuYzF0M190c19oZHIgKiwgc3RydWN0IHdhbmMxdDNfdHNfcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCAgd2FuY2ZnX3NldF90c2lvYyh3Y2ZnX3QgKiwgc3RydWN0IHdhbmMxdDNfdHNfcGFyYW0gKik7CiAjZW5kaWYKIAogI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqIF9JTkNfTElCU0JFV19IXyAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKaW5kZXggNzkyMDZjYi4uYjAyZjVhZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJwbWNjNF9wcml2YXRlLmgiCiAjaW5jbHVkZSAic2JlcHJvYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFcnJvciBvdXQgZWFybHkgaWYgd2UgaGF2ZSBjb21waWxlciB0cm91YmxlLgogICoKICAqICAgKFRoaXMgc2VjdGlvbiBpcyBpbmNsdWRlZCBmcm9tIHRoZSBrZXJuZWwncyBpbml0L21haW4uYyBhcyBhIGZyaWVuZGx5CkBAIC01MCw0MyArNTAsNDIgQEAKICN3YXJuaW5nIGdjYy00LjEuMCBpcyBrbm93biB0byBtaXNjb21waWxlIHRoZSBrZXJuZWwuICBBIGRpZmZlcmVudCBjb21waWxlciB2ZXJzaW9uIGlzIHJlY29tbWVuZGVkLgogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIENIQU5OQU1FICJoZGxjIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotc3RhdHVzX3QgICAgYzRfY2hhbl93b3JrX2luaXQgKG1waV90ICosIG1jaF90ICopOwotdm9pZCAgICAgICAgbXVzeWNjX3dxX2NoYW5fcmVzdGFydCAodm9pZCAqKTsKLXN0YXR1c190IF9faW5pdCBjNF9pbml0IChjaV90ICosIHVfY2hhciAqLCB1X2NoYXIgKik7Ci1zdGF0dXNfdCBfX2luaXQgYzRfaW5pdDIgKGNpX3QgKik7Ci1jaV90ICAgICAgICpfX2luaXQgYzRfbmV3ICh2b2lkICopOwotaW50IF9faW5pdCAgYzRod19hdHRhY2hfYWxsICh2b2lkKTsKLXZvaWQgX19pbml0IGhkd19zbl9nZXQgKGhkd19pbmZvX3QgKiwgaW50KTsKK3N0YXR1c190ICAgIGM0X2NoYW5fd29ya19pbml0KG1waV90ICosIG1jaF90ICopOwordm9pZCAgICAgICAgbXVzeWNjX3dxX2NoYW5fcmVzdGFydCh2b2lkICopOworc3RhdHVzX3QgX19pbml0IGM0X2luaXQoY2lfdCAqLCB1X2NoYXIgKiwgdV9jaGFyICopOworc3RhdHVzX3QgX19pbml0IGM0X2luaXQyKGNpX3QgKik7CitjaV90ICAgICAgICpfX2luaXQgYzRfbmV3KHZvaWQgKik7CitpbnQgX19pbml0ICBjNGh3X2F0dGFjaF9hbGwodm9pZCk7Cit2b2lkIF9faW5pdCBoZHdfc25fZ2V0KGhkd19pbmZvX3QgKiwgaW50KTsKIAogI2lmZGVmIENPTkZJR19TQkVfUE1DQzRfTkNPTU0KLWlycXJldHVybl90IGM0X2VidXNfaW50cl90aF9oYW5kbGVyICh2b2lkICopOworaXJxcmV0dXJuX3QgYzRfZWJ1c19pbnRyX3RoX2hhbmRsZXIodm9pZCAqKTsKIAogI2VuZGlmCi1pbnQgICAgICAgICBjNF9mcmFtZV9ydyAoY2lfdCAqLCBzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gKik7Ci1zdGF0dXNfdCAgICBjNF9nZXRfcG9ydCAoY2lfdCAqLCBpbnQpOwotaW50ICAgICAgICAgYzRfbG9vcF9wb3J0IChjaV90ICosIGludCwgdV9pbnQ4X3QpOwotaW50ICAgICAgICAgYzRfbXVzeWNjX3J3IChjaV90ICosIHN0cnVjdCBjNF9tdXN5Y2NfcGFyYW0gKik7Ci1pbnQgICAgICAgICBjNF9uZXdfY2hhbiAoY2lfdCAqLCBpbnQsIGludCwgdm9pZCAqKTsKLXN0YXR1c190ICAgIGM0X3NldF9wb3J0IChjaV90ICosIGludCk7Ci1pbnQgICAgICAgICBjNF9wbGRfcncgKGNpX3QgKiwgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtICopOwotdm9pZCAgICAgICAgY2xlYW51cF9kZXZzICh2b2lkKTsKLXZvaWQgICAgICAgIGNsZWFudXBfaW9yZW1hcCAodm9pZCk7Ci1zdGF0dXNfdCAgICBtdXN5Y2NfY2hhbl9kb3duIChjaV90ICosIGludCk7Ci1pcnFyZXR1cm5fdCBtdXN5Y2NfaW50cl90aF9oYW5kbGVyICh2b2lkICopOwotaW50ICAgICAgICAgbXVzeWNjX3N0YXJ0X3htaXQgKGNpX3QgKiwgaW50LCB2b2lkICopOworaW50ICAgICAgICAgYzRfZnJhbWVfcncoY2lfdCAqLCBzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gKik7CitzdGF0dXNfdCAgICBjNF9nZXRfcG9ydChjaV90ICosIGludCk7CitpbnQgICAgICAgICBjNF9sb29wX3BvcnQoY2lfdCAqLCBpbnQsIHVfaW50OF90KTsKK2ludCAgICAgICAgIGM0X211c3ljY19ydyhjaV90ICosIHN0cnVjdCBjNF9tdXN5Y2NfcGFyYW0gKik7CitpbnQgICAgICAgICBjNF9uZXdfY2hhbihjaV90ICosIGludCwgaW50LCB2b2lkICopOworc3RhdHVzX3QgICAgYzRfc2V0X3BvcnQoY2lfdCAqLCBpbnQpOworaW50ICAgICAgICAgYzRfcGxkX3J3KGNpX3QgKiwgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtICopOwordm9pZCAgICAgICAgY2xlYW51cF9kZXZzKHZvaWQpOwordm9pZCAgICAgICAgY2xlYW51cF9pb3JlbWFwKHZvaWQpOworc3RhdHVzX3QgICAgbXVzeWNjX2NoYW5fZG93bihjaV90ICosIGludCk7CitpcnFyZXR1cm5fdCBtdXN5Y2NfaW50cl90aF9oYW5kbGVyKHZvaWQgKik7CitpbnQgICAgICAgICBtdXN5Y2Nfc3RhcnRfeG1pdChjaV90ICosIGludCwgdm9pZCAqKTsKIAotZXh0ZXJuIGNoYXIgcG1jYzRfT1NTSV9yZWxlYXNlW107CiBleHRlcm4gY2lfdCAqQ0k7CiBleHRlcm4gc3RydWN0IHNfaGR3X2luZm8gaGR3X2luZm9bXTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3KSB8fCBkZWZpbmVkKENPTkZJR19TQkVfV0FOMjU2VDNfSERMQ19WNykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3X01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfU0JFX1dBTjI1NlQzX0hETENfVjdfTU9EVUxFKQorCWRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3X01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfU0JFX1dBTjI1NlQzX0hETENfVjdfTU9EVUxFKQogI2RlZmluZSBfdjdfaGRsY18gIDEKICNlbHNlCiAjZGVmaW5lIF92N19oZGxjXyAgMApAQCAtOTQsOSArOTMsOSBAQAogCiAjaWYgX3Y3X2hkbGNfCiAjZGVmaW5lIFY3KHgpICh4ICMjIF92NykKLWV4dGVybiBpbnQgIGhkbGNfbmV0aWZfcnhfdjcgKGhkbGNfZGV2aWNlICosIHN0cnVjdCBza19idWZmICopOwotZXh0ZXJuIGludCAgcmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcgKGhkbGNfZGV2aWNlICopOwotZXh0ZXJuIGludCAgdW5yZWdpc3Rlcl9oZGxjX2RldmljZV92NyAoaGRsY19kZXZpY2UgKik7CitleHRlcm4gaW50ICBoZGxjX25ldGlmX3J4X3Y3KGhkbGNfZGV2aWNlICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIGludCAgcmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcoaGRsY19kZXZpY2UgKik7CitleHRlcm4gaW50ICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3KGhkbGNfZGV2aWNlICopOwogCiAjZWxzZQogI2RlZmluZSBWNyh4KSB4CkBAIC0xMDQsMTEgKzEwMywxMSBAQAogCiBpbnQgICAgICAgICBlcnJvcl9mbGFnOyAgICAgICAgIC8qIG1vZHVsZSBsb2FkIGVycm9yIHJlcG9ydGluZyAqLwogaW50ICAgICAgICAgY3h0MWUxX2xvZ19sZXZlbCA9IExPR19FUlJPUjsKLWludCAgICAgICAgIGxvZ19sZXZlbF9kZWZhdWx0ID0gTE9HX0VSUk9SOworc3RhdGljIGludCAgbG9nX2xldmVsX2RlZmF1bHQgPSBMT0dfRVJST1I7CiBtb2R1bGVfcGFyYW0oY3h0MWUxX2xvZ19sZXZlbCwgaW50LCAwNDQ0KTsKIAogaW50ICAgICAgICAgY3h0MWUxX21heF9tcnUgPSBNVVNZQ0NfTVJVOwotaW50ICAgICAgICAgbWF4X21ydV9kZWZhdWx0ID0gTVVTWUNDX01SVTsKK3N0YXRpYyBpbnQgIG1heF9tcnVfZGVmYXVsdCA9IE1VU1lDQ19NUlU7CiBtb2R1bGVfcGFyYW0oY3h0MWUxX21heF9tcnUsIGludCwgMDQ0NCk7CiAKIGludCAgICAgICAgIGN4dDFlMV9tYXhfbXR1ID0gTVVTWUNDX01UVTsKQEAgLTEyNywzMyArMTI2LDIzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgICAgICoKLWdldHVzZXJieWNoYW4gKGludCBjaGFubnVtKQordm9pZCAqCitnZXR1c2VyYnljaGFuKGludCBjaGFubnVtKQogewotICAgIG1jaF90ICAgICAgKmNoOworCW1jaF90ICAgICAgKmNoOwogCi0gICAgY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pOwotICAgIHJldHVybiBjaCA/IGNoLT51c2VyIDogTlVMTDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlyZXR1cm4gY2ggPyBjaC0+dXNlciA6IE5VTEw7CiB9CiAKIAotY2hhciAgICAgICAqCi1nZXRfaGRsY19uYW1lIChoZGxjX2RldmljZSAqaGRsYykKK2NoYXIgKgorZ2V0X2hkbGNfbmFtZShoZGxjX2RldmljZSAqaGRsYykKIHsKLSAgICBzdHJ1Y3QgYzRfcHJpdiAqcHJpdiA9IGhkbGMtPnByaXY7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdldHVzZXJieWNoYW4gKHByaXYtPmNoYW5udW0pOworCXN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZ2V0dXNlcmJ5Y2hhbihwcml2LT5jaGFubnVtKTsKIAotICAgIHJldHVybiBkZXYtPm5hbWU7Ci19Ci0KLQotc3RhdGljICAgICAgc3RhdHVzX3QKLW1rcmV0IChpbnQgYnNkKQotewotICAgIGlmIChic2QgPiAwKQotICAgICAgICByZXR1cm4gLWJzZDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBic2Q7CisJcmV0dXJuIGRldi0+bmFtZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3OSw5NTggKzE2OCw5NDYgQEAKICAqIHdpdGhpbiBhIHBvcnQncyBncm91cC4KICAqLwogdm9pZAotYzRfd2tfY2hhbl9yZXN0YXJ0IChtY2hfdCAqY2gpCitjNF93a19jaGFuX3Jlc3RhcnQobWNoX3QgKmNoKQogewotICAgIG1waV90ICAgICAgKnBpID0gY2gtPnVwOworCW1waV90ICAgICAgKnBpID0gY2gtPnVwOwogCiAjaWZkZWYgUkxEX1JFU1RBUlRfREVCVUcKLSAgICBwcl9pbmZvKCI+PiAlczogcXVldWVpbmcgUG9ydCAlZCBDaGFuICVkLCBtY2hfdCBAICVwXG4iLAotICAgICAgICAgICAgX19mdW5jX18sIHBpLT5wb3J0bnVtLCBjaC0+Y2hhbm51bSwgY2gpOworCXByX2luZm8oIj4+ICVzOiBxdWV1ZWluZyBQb3J0ICVkIENoYW4gJWQsIG1jaF90IEAgJXBcbiIsCisJCV9fZnVuY19fLCBwaS0+cG9ydG51bSwgY2gtPmNoYW5udW0sIGNoKTsKICNlbmRpZgogCi0gICAgLyogY3JlYXRlIG5ldyBlbnRyeSB3L2luIHdvcmtxdWV1ZSBmb3IgdGhpcyBjaGFubmVsIGFuZCBsZXQnZXIgcmlwICovCisJLyogY3JlYXRlIG5ldyBlbnRyeSB3L2luIHdvcmtxdWV1ZSBmb3IgdGhpcyBjaGFubmVsIGFuZCBsZXQnZXIgcmlwICovCiAKLSAgICAvKiogcXVldWVfd29yayAoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnF1ZXVlLAotICAgICAqKiAgICAgICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotICAgICAqKi8KLSAgICBxdWV1ZV93b3JrIChwaS0+d3FfcG9ydCwgJmNoLT5jaF93b3JrKTsKKwkvKiogcXVldWVfd29yayhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcXVldWUsCisJICoqICAgICAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwkgKiovCisJcXVldWVfd29yayhwaS0+d3FfcG9ydCwgJmNoLT5jaF93b3JrKTsKIH0KIAogc3RhdHVzX3QKLWM0X3drX2NoYW5faW5pdCAobXBpX3QgKnBpLCBtY2hfdCAqY2gpCitjNF93a19jaGFuX2luaXQobXBpX3QgKnBpLCBtY2hfdCAqY2gpCiB7Ci0gICAgLyoKLSAgICAgKiB0aGlzIHdpbGwgYmUgdXNlZCB0byByZXN0YXJ0IGEgc3RvcHBlZCBjaGFubmVsCi0gICAgICovCisJLyoKKwkgKiB0aGlzIHdpbGwgYmUgdXNlZCB0byByZXN0YXJ0IGEgc3RvcHBlZCBjaGFubmVsCisJICovCiAKLSAgICAvKiogSU5JVF9XT1JLIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssCi0gICAgICoqICAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSh2b2lkICopLAotICAgICAqKiAgICAgICAgICAgIHZvaWQgKmRhdGEpOwotICAgICAqKi8KLSAgICBJTklUX1dPUksoJmNoLT5jaF93b3JrLCAodm9pZCAqKW11c3ljY193cV9jaGFuX3Jlc3RhcnQpOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCS8qKiBJTklUX1dPUksoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLAorCSAqKiAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSh2b2lkICopLAorCSAqKiAgICAgICAgICAgdm9pZCAqZGF0YSk7CisJICoqLworCUlOSVRfV09SSygmY2gtPmNoX3dvcmssICh2b2lkICopbXVzeWNjX3dxX2NoYW5fcmVzdGFydCk7CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCiB9CiAKIHN0YXR1c190Ci1jNF93cV9wb3J0X2luaXQgKG1waV90ICpwaSkKK2M0X3dxX3BvcnRfaW5pdChtcGlfdCAqcGkpCiB7CiAKLSAgICBjaGFyICAgICAgICBuYW1lWzE2XSwgKm5wOyAgLyogTk9URTogbmFtZSBvZiB0aGUgcXVldWUgbGltaXRlZCBieSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gMTAgY2hhcmFjdGVycyAqLworCWNoYXIgICAgICAgIG5hbWVbMTZdOyAgLyogTk9URTogbmFtZSBvZiB0aGUgcXVldWUgbGltaXRlZCBieSBzeXN0ZW0KKwkJCQkgICAgICogdG8gMTAgY2hhcmFjdGVycyAqLworCWlmIChwaS0+d3FfcG9ydCkKKwkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KIAotICAgIGlmIChwaS0+d3FfcG9ydCkKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KLQotICAgIG5wID0gbmFtZTsKLSAgICBtZW1zZXQgKG5hbWUsIDAsIDE2KTsKLSAgICBzcHJpbnRmIChucCwgIiVzJWQiLCBwaS0+dXAtPmRldm5hbWUsIHBpLT5wb3J0bnVtKTsgLyogSUUgcG1jYzQtMDEpICovCisJLyogSUUgcG1jYzQtMDEgKi8KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVkIiwgcGktPnVwLT5kZXZuYW1lLCBwaS0+cG9ydG51bSk7CiAKICNpZmRlZiBSTERfUkVTVEFSVF9ERUJVRwotICAgIHByX2luZm8oIj4+ICVzOiBjcmVhdGluZyB3b3JrcXVldWUgPCVzPiBmb3IgUG9ydCAlZC5cbiIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgcGktPnBvcnRudW0pOyAvKiBSTEQgREVCVUcgKi8KKwlwcl9pbmZvKCI+PiAlczogY3JlYXRpbmcgd29ya3F1ZXVlIDwlcz4gZm9yIFBvcnQgJWQuXG4iLAorCQlfX2Z1bmNfXywgbmFtZSwgcGktPnBvcnRudW0pOyAvKiBSTEQgREVCVUcgKi8KICNlbmRpZgotICAgIGlmICghKHBpLT53cV9wb3J0ID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUgKG5hbWUpKSkKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCisJcGktPndxX3BvcnQgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShuYW1lKTsKKwlpZiAoIXBpLT53cV9wb3J0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KIH0KIAogdm9pZAotYzRfd3FfcG9ydF9jbGVhbnVwIChtcGlfdCAqcGkpCitjNF93cV9wb3J0X2NsZWFudXAobXBpX3QgKnBpKQogewotICAgIC8qCi0gICAgICogUE9SVCBQT0lOVDogY2Fubm90IGNhbGwgdGhpcyBpZiBXUSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB3L2luCi0gICAgICogc3RydWN0dXJlIHNpbmNlIGl0IGNhbGxzIGtmcmVlKHdxKTsKLSAgICAgKi8KLSAgICBpZiAocGktPndxX3BvcnQpCi0gICAgewotICAgICAgICBkZXN0cm95X3dvcmtxdWV1ZSAocGktPndxX3BvcnQpOyAgICAgICAgLyogdGhpcyBhbHNvIGNhbGxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmbHVzaF93b3JrcXVldWUoKSAqLwotICAgICAgICBwaS0+d3FfcG9ydCA9IE5VTEw7Ci0gICAgfQorCS8qCisJICogUE9SVCBQT0lOVDogY2Fubm90IGNhbGwgdGhpcyBpZiBXUSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB3L2luCisJICogc3RydWN0dXJlIHNpbmNlIGl0IGNhbGxzIGtmcmVlKHdxKTsKKwkgKi8KKwlpZiAocGktPndxX3BvcnQpIHsKKwkJZGVzdHJveV93b3JrcXVldWUocGktPndxX3BvcnQpOyAgICAgICAgLyogdGhpcyBhbHNvIGNhbGxzCisJCQkJCQkJKiBmbHVzaF93b3JrcXVldWUoKSAqLworCQlwaS0+d3FfcG9ydCA9IE5VTEw7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pcnFyZXR1cm5fdAotYzRfbGludXhfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCitzdGF0aWMgaXJxcmV0dXJuX3QKK2M0X2xpbnV4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfaW5zdGFuY2U7CiAKLSAgICByZXR1cm4gbXVzeWNjX2ludHJfdGhfaGFuZGxlcihuZXRkZXZfcHJpdihuZGV2KSk7CisJcmV0dXJuIG11c3ljY19pbnRyX3RoX2hhbmRsZXIobmV0ZGV2X3ByaXYobmRldikpOwogfQogCiAKICNpZmRlZiBDT05GSUdfU0JFX1BNQ0M0X05DT01NCi1pcnFyZXR1cm5fdAotYzRfZWJ1c19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3N0YXRpYyBpcnFyZXR1cm5fdAorYzRfZWJ1c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2luc3RhbmNlOwogCi0gICAgcmV0dXJuIGM0X2VidXNfaW50cl90aF9oYW5kbGVyKG5ldGRldl9wcml2KG5kZXYpKTsKKwlyZXR1cm4gYzRfZWJ1c19pbnRyX3RoX2hhbmRsZXIobmV0ZGV2X3ByaXYobmRldikpOwogfQogI2VuZGlmCiAKIAogc3RhdGljIGludAotdm9pZF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3ZvaWRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLSAgICBwcl9pbmZvKCIlczogdHJ5aW5nIHRvIG9wZW4gbWFzdGVyIGRldmljZSAhXG4iLCBuZGV2LT5uYW1lKTsKLSAgICByZXR1cm4gLTE7CisJcHJfaW5mbygiJXM6IHRyeWluZyB0byBvcGVuIG1hc3RlciBkZXZpY2UgIVxuIiwgbmRldi0+bmFtZSk7CisJcmV0dXJuIC0xOwogfQogCiAKIHN0YXRpYyBpbnQKLWNoYW5fb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitjaGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyAobmRldik7Ci0gICAgY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXYgPSBoZGxjLT5wcml2OwotICAgIGludCAgICAgICAgIHJldDsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKG5kZXYpOworCWNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKKwlpbnQgICAgICAgICByZXQ7CiAKLSAgICBpZiAoKHJldCA9IGhkbGNfb3BlbiAobmRldikpKQotICAgIHsKLSAgICAgICAgcHJfaW5mbygiaGRsY19vcGVuIGZhaWx1cmUsIGVyciAlZC5cbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmICgocmV0ID0gYzRfY2hhbl91cCAocHJpdi0+Y2ksIHByaXYtPmNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIC1yZXQ7Ci0gICAgdHJ5X21vZHVsZV9nZXQgKFRISVNfTU9EVUxFKTsKLSAgICBuZXRpZl9zdGFydF9xdWV1ZSAobmRldik7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlcnJvciA9IHN1Y2Nlc3MgKi8KKwlyZXQgPSBoZGxjX29wZW4obmRldik7CisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJoZGxjX29wZW4gZmFpbHVyZSwgZXJyICVkLlxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjNF9jaGFuX3VwKHByaXYtPmNpLCBwcml2LT5jaGFubnVtKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlcnJvciA9IHN1Y2Nlc3MgKi8KIH0KIAogCiBzdGF0aWMgaW50Ci1jaGFuX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK2NoYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyAobmRldik7Ci0gICAgY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXYgPSBoZGxjLT5wcml2OworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMobmRldik7CisJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXYgPSBoZGxjLT5wcml2OwogCi0gICAgbmV0aWZfc3RvcF9xdWV1ZSAobmRldik7Ci0gICAgbXVzeWNjX2NoYW5fZG93biAoKGNpX3QgKikgMCwgcHJpdi0+Y2hhbm51bSk7Ci0gICAgaGRsY19jbG9zZSAobmRldik7Ci0gICAgbW9kdWxlX3B1dCAoVEhJU19NT0RVTEUpOwotICAgIHJldHVybiAwOworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJbXVzeWNjX2NoYW5fZG93bigoY2lfdCAqKSAwLCBwcml2LT5jaGFubnVtKTsKKwloZGxjX2Nsb3NlKG5kZXYpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCXJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKLWNoYW5fZGV2X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK2NoYW5fZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewotICAgIHJldHVybiBoZGxjX2lvY3RsIChkZXYsIGlmciwgY21kKTsKKwlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKIH0KIAogCiBzdGF0aWMgaW50Ci1jaGFuX2F0dGFjaF9ub29wIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdW5zaWduZWQgc2hvcnQgZm9vXzEsIHVuc2lnbmVkIHNob3J0IGZvb18yKQorY2hhbl9hdHRhY2hfbm9vcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdW5zaWduZWQgc2hvcnQgZm9vXzEsCisJCSB1bnNpZ25lZCBzaG9ydCBmb29fMikKIHsKLSAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogb3VyIGRyaXZlciBoYXMgbm90aGluZyB0byBkbyBoZXJlLCBzaG93J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3ZlciwgZ28gaG9tZSAqLworCS8qIG91ciBkcml2ZXIgaGFzIG5vdGhpbmcgdG8gZG8gaGVyZSwgc2hvdydzCisJICogb3ZlciwgZ28gaG9tZQorCSAqLworCXJldHVybiAwOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1jaGFuX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitjaGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLSAgICBtY2hfdCAgICAgICpjaDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXRzOwotICAgIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqc3RhdHM7Ci0gICAgaW50ICAgICAgICAgY2hhbm51bTsKKwltY2hfdCAgICAgICpjaDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXRzOworCXN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqc3RhdHM7CisJaW50ICAgICAgICAgY2hhbm51bTsKIAotICAgIHsKLSAgICAgICAgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJeworCQlzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKIAotICAgICAgICBwcml2ID0gKHN0cnVjdCBjNF9wcml2ICopIGRldl90b19oZGxjIChuZGV2KS0+cHJpdjsKLSAgICAgICAgY2hhbm51bSA9IHByaXYtPmNoYW5udW07Ci0gICAgfQorCQlwcml2ID0gKHN0cnVjdCBjNF9wcml2ICopZGV2X3RvX2hkbGMobmRldiktPnByaXY7CisJCWNoYW5udW0gPSBwcml2LT5jaGFubnVtOworCX0KIAotICAgIGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKTsKLSAgICBpZiAoY2ggPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCi0gICAgbnN0YXRzID0gJm5kZXYtPnN0YXRzOwotICAgIHN0YXRzID0gJmNoLT5zOworCW5zdGF0cyA9ICZuZGV2LT5zdGF0czsKKwlzdGF0cyA9ICZjaC0+czsKIAotICAgIG1lbXNldCAobnN0YXRzLCAwLCBzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7Ci0gICAgbnN0YXRzLT5yeF9wYWNrZXRzID0gc3RhdHMtPnJ4X3BhY2tldHM7Ci0gICAgbnN0YXRzLT50eF9wYWNrZXRzID0gc3RhdHMtPnR4X3BhY2tldHM7Ci0gICAgbnN0YXRzLT5yeF9ieXRlcyA9IHN0YXRzLT5yeF9ieXRlczsKLSAgICBuc3RhdHMtPnR4X2J5dGVzID0gc3RhdHMtPnR4X2J5dGVzOwotICAgIG5zdGF0cy0+cnhfZXJyb3JzID0gc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKwotICAgICAgICBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKwotICAgICAgICBzdGF0cy0+cnhfY3JjX2Vycm9ycyArCi0gICAgICAgIHN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKwotICAgICAgICBzdGF0cy0+cnhfZmlmb19lcnJvcnMgKwotICAgICAgICBzdGF0cy0+cnhfbWlzc2VkX2Vycm9yczsKLSAgICBuc3RhdHMtPnR4X2Vycm9ycyA9IHN0YXRzLT50eF9kcm9wcGVkICsKLSAgICAgICAgc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnR4X2ZpZm9fZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfZHJvcHBlZCA9IHN0YXRzLT5yeF9kcm9wcGVkOwotICAgIG5zdGF0cy0+dHhfZHJvcHBlZCA9IHN0YXRzLT50eF9kcm9wcGVkOworCW1lbXNldChuc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCW5zdGF0cy0+cnhfcGFja2V0cyA9IHN0YXRzLT5yeF9wYWNrZXRzOworCW5zdGF0cy0+dHhfcGFja2V0cyA9IHN0YXRzLT50eF9wYWNrZXRzOworCW5zdGF0cy0+cnhfYnl0ZXMgPSBzdGF0cy0+cnhfYnl0ZXM7CisJbnN0YXRzLT50eF9ieXRlcyA9IHN0YXRzLT50eF9ieXRlczsKKwluc3RhdHMtPnJ4X2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsKKwkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMgKworCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICsKKwkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICsKKwkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CisJbnN0YXRzLT50eF9lcnJvcnMgPSBzdGF0cy0+dHhfZHJvcHBlZCArCisJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArCisJCXN0YXRzLT50eF9maWZvX2Vycm9yczsKKwluc3RhdHMtPnJ4X2Ryb3BwZWQgPSBzdGF0cy0+cnhfZHJvcHBlZDsKKwluc3RhdHMtPnR4X2Ryb3BwZWQgPSBzdGF0cy0+dHhfZHJvcHBlZDsKIAotICAgIG5zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7Ci0gICAgbnN0YXRzLT5yeF9jcmNfZXJyb3JzID0gc3RhdHMtPnJ4X2NyY19lcnJvcnM7Ci0gICAgbnN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfZmlmb19lcnJvcnMgPSBzdGF0cy0+cnhfZmlmb19lcnJvcnM7Ci0gICAgbnN0YXRzLT5yeF9taXNzZWRfZXJyb3JzID0gc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CisJbnN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnM7CisJbnN0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IHN0YXRzLT5yeF9vdmVyX2Vycm9yczsKKwluc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSBzdGF0cy0+cnhfY3JjX2Vycm9yczsKKwluc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyA9IHN0YXRzLT5yeF9mcmFtZV9lcnJvcnM7CisJbnN0YXRzLT5yeF9maWZvX2Vycm9ycyA9IHN0YXRzLT5yeF9maWZvX2Vycm9yczsKKwluc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSBzdGF0cy0+cnhfbWlzc2VkX2Vycm9yczsKIAotICAgIG5zdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnM7Ci0gICAgbnN0YXRzLT50eF9maWZvX2Vycm9ycyA9IHN0YXRzLT50eF9maWZvX2Vycm9yczsKKwluc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzID0gc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOworCW5zdGF0cy0+dHhfZmlmb19lcnJvcnMgPSBzdGF0cy0+dHhfZmlmb19lcnJvcnM7CiAKLSAgICByZXR1cm4gbnN0YXRzOworCXJldHVybiBuc3RhdHM7CiB9CiAKIAogc3RhdGljIGNpX3QgKgotZ2V0X2NpX2J5X2RldiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitnZXRfY2lfYnlfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIHJldHVybiAoY2lfdCAqKShuZXRkZXZfcHJpdihuZGV2KSk7CisJcmV0dXJuIChjaV90ICopKG5ldGRldl9wcml2KG5kZXYpKTsKIH0KIAogCiBzdGF0aWMgaW50Ci1jNF9saW51eF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK2M0X2xpbnV4X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7Ci0gICAgaW50ICAgICAgICAgcnZhbDsKKwljb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKKwlpbnQgICAgICAgICBydmFsOwogCi0gICAgaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyAobmRldik7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhuZGV2KTsKIAotICAgIHByaXYgPSBoZGxjLT5wcml2OworCXByaXYgPSBoZGxjLT5wcml2OwogCi0gICAgcnZhbCA9IG11c3ljY19zdGFydF94bWl0IChwcml2LT5jaSwgcHJpdi0+Y2hhbm51bSwgc2tiKTsKLSAgICByZXR1cm4gcnZhbDsKKwlydmFsID0gbXVzeWNjX3N0YXJ0X3htaXQocHJpdi0+Y2ksIHByaXYtPmNoYW5udW0sIHNrYik7CisJcmV0dXJuIHJ2YWw7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgY2hhbl9vcHMgPSB7Ci0gICAgICAgLm5kb19vcGVuICAgICAgID0gY2hhbl9vcGVuLAotICAgICAgIC5uZG9fc3RvcCAgICAgICA9IGNoYW5fY2xvc2UsCi0gICAgICAgLm5kb19zdGFydF94bWl0ID0gYzRfbGludXhfeG1pdCwKLSAgICAgICAubmRvX2RvX2lvY3RsICAgPSBjaGFuX2Rldl9pb2N0bCwKLSAgICAgICAubmRvX2dldF9zdGF0cyAgPSBjaGFuX2dldF9zdGF0cywKKwkubmRvX29wZW4gICAgICAgPSBjaGFuX29wZW4sCisJLm5kb19zdG9wICAgICAgID0gY2hhbl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgPSBjNF9saW51eF94bWl0LAorCS5uZG9fZG9faW9jdGwgICA9IGNoYW5fZGV2X2lvY3RsLAorCS5uZG9fZ2V0X3N0YXRzICA9IGNoYW5fZ2V0X3N0YXRzLAogfTsKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKLWNyZWF0ZV9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY2lfdCAqY2ksCi0gICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtICpjcCkKK2NyZWF0ZV9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBjaV90ICpjaSwKKwkgICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtICpjcCkKIHsKLSAgICBoZGxjX2RldmljZSAqaGRsYzsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGludCAgICAgICAgIHJldDsKKwloZGxjX2RldmljZSAqaGRsYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWhkd19pbmZvX3QgKmhpOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjNF9maW5kX2NoYW4gKGNwLT5jaGFubnVtKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMgKi8KKwlpZiAoYzRfZmluZF9jaGFuKGNwLT5jaGFubnVtKSkKKwkJcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMgKi8KIAotICAgIHsKLSAgICAgICAgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJeworCQlzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKIAotICAgICAgICAvKiBhbGxvY2F0ZSB0aGVuIGZpbGwgaW4gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLwotICAgICAgICBwcml2ID0gT1Nfa21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYzRfcHJpdikpOwotICAgICAgICBpZiAoIXByaXYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIG5ldF9kZXZpY2UgIVxuIiwgY2ktPmRldm5hbWUpOwotCSAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBkZXYgPSBhbGxvY19oZGxjZGV2IChwcml2KTsKLSAgICAgICAgaWYgKCFkZXYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIGhkbGNfZGV2aWNlICFcbiIsIGNpLT5kZXZuYW1lKTsKLSAgICAgICAgICAgIE9TX2tmcmVlIChwcml2KTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdi0+Y2kgPSBjaTsKLSAgICAgICAgcHJpdi0+Y2hhbm51bSA9IGNwLT5jaGFubnVtOwotICAgIH0KKwkJLyogYWxsb2NhdGUgdGhlbiBmaWxsIGluIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKwkJcHJpdiA9IE9TX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjNF9wcml2KSk7CisJCWlmICghcHJpdikgeworCQkJcHJfd2FybmluZygiJXM6IG5vIG1lbW9yeSBmb3IgbmV0X2RldmljZSAhXG4iLAorCQkJCSAgIGNpLT5kZXZuYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWRldiA9IGFsbG9jX2hkbGNkZXYocHJpdik7CisJCWlmICghZGV2KSB7CisJCQlwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBoZGxjX2RldmljZSAhXG4iLAorCQkJCSAgIGNpLT5kZXZuYW1lKTsKKwkJCU9TX2tmcmVlKHByaXYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcHJpdi0+Y2kgPSBjaTsKKwkJcHJpdi0+Y2hhbm51bSA9IGNwLT5jaGFubnVtOworCX0KIAotICAgIGhkbGMgPSBkZXZfdG9faGRsYyAoZGV2KTsKKwloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKIAotICAgIGRldi0+YmFzZV9hZGRyID0gMDsgICAgICAgICAgICAgLyogbm90IEkvTyBtYXBwZWQgKi8KLSAgICBkZXYtPmlycSA9IG5kZXYtPmlycTsKLSAgICBkZXYtPnR5cGUgPSBBUlBIUkRfUkFXSERMQzsKLSAgICAqZGV2LT5uYW1lID0gMDsgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgaWZjb25maWcgbmFtZSA9ICJoZGxjIiAqLworCWRldi0+YmFzZV9hZGRyID0gMDsgICAgICAgICAgICAgLyogbm90IEkvTyBtYXBwZWQgKi8KKwlkZXYtPmlycSA9IG5kZXYtPmlycTsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfUkFXSERMQzsKKwkqZGV2LT5uYW1lID0gMDsgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgaWZjb25maWcgbmFtZSA9ICJoZGxjIiAqLwogCi0gICAgaGkgPSAoaGR3X2luZm9fdCAqKSBjaS0+aGR3X2luZm87Ci0gICAgaWYgKGhpLT5tZmdfaW5mb19zdHMgPT0gRUVQUk9NX09LKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChoaS0+cHJvbWZtdCkKLSAgICAgICAgewotICAgICAgICBjYXNlIFBST01fRk9STUFUX1RZUEUxOgotICAgICAgICAgICAgbWVtY3B5IChkZXYtPmRldl9hZGRyLCAoRkxEX1RZUEUxICopIChoaS0+bWZnX2luZm8ucGZ0MS5TZXJpYWwpLCA2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBST01fRk9STUFUX1RZUEUyOgotICAgICAgICAgICAgbWVtY3B5IChkZXYtPmRldl9hZGRyLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5TZXJpYWwpLCA2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbWVtc2V0IChkZXYtPmRldl9hZGRyLCAwLCA2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICBtZW1zZXQgKGRldi0+ZGV2X2FkZHIsIDAsIDYpOwotICAgIH0KKwloaSA9IChoZHdfaW5mb190ICopY2ktPmhkd19pbmZvOworCWlmIChoaS0+bWZnX2luZm9fc3RzID09IEVFUFJPTV9PSykgeworCQlzd2l0Y2ggKGhpLT5wcm9tZm10KSB7CisJCWNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwKKwkJCSAgICAgICAoRkxEX1RZUEUxICopIChoaS0+bWZnX2luZm8ucGZ0MS5TZXJpYWwpLCA2KTsKKwkJCWJyZWFrOworCQljYXNlIFBST01fRk9STUFUX1RZUEUyOgorCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgKEZMRF9UWVBFMiAqKSAoaGktPm1mZ19pbmZvLnBmdDIuU2VyaWFsKSwgNik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1lbXNldChkZXYtPmRldl9hZGRyLCAwLCA2KTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlCisJCW1lbXNldChkZXYtPmRldl9hZGRyLCAwLCA2KTsKIAotICAgIGhkbGMtPnhtaXQgPSBjNF9saW51eF94bWl0OworCWhkbGMtPnhtaXQgPSBjNF9saW51eF94bWl0OwogCi0gICAgZGV2LT5uZXRkZXZfb3BzID0gJmNoYW5fb3BzOwotICAgIC8qCi0gICAgICogVGhlIG5hdGl2ZSBoZGxjIHN0YWNrIGNhbGxzIHRoaXMgJ2F0dGFjaCcgcm91dGluZSBkdXJpbmcKLSAgICAgKiBoZGxjX3Jhd19pb2N0bCgpLCBwYXNzaW5nIHBhcmFtZXRlcnMgZm9yIGxpbmUgZW5jb2RpbmcgYW5kIHBhcml0eS4KLSAgICAgKiBTaW5jZSBoZGxjX3Jhd19pb2N0bCgpIHN0YWNrIGRvZXMgbm90IGludGVycm9nYXRlIHdoZXRoZXIgYW4gJ2F0dGFjaCcKLSAgICAgKiByb3V0aW5lIGlzIGFjdHVhbGx5IHJlZ2lzdGVyZWQgb3Igbm90LCB3ZSBzdXBwbHkgYSBkdW1teSByb3V0aW5lIHdoaWNoCi0gICAgICogZG9lcyBub3RoaW5nIChzaW5jZSBlbmNvZGluZyBhbmQgcGFyaXR5IGFyZSBzZXR1cCBmb3Igb3VyIGRyaXZlciB2aWEgYQotICAgICAqIHNwZWNpYWwgY29uZmlndXJhdGlvbiBhcHBsaWNhdGlvbikuCi0gICAgICovCisJZGV2LT5uZXRkZXZfb3BzID0gJmNoYW5fb3BzOworCS8qCisJICogVGhlIG5hdGl2ZSBoZGxjIHN0YWNrIGNhbGxzIHRoaXMgJ2F0dGFjaCcgcm91dGluZSBkdXJpbmcKKwkgKiBoZGxjX3Jhd19pb2N0bCgpLCBwYXNzaW5nIHBhcmFtZXRlcnMgZm9yIGxpbmUgZW5jb2RpbmcgYW5kIHBhcml0eS4KKwkgKiBTaW5jZSBoZGxjX3Jhd19pb2N0bCgpIHN0YWNrIGRvZXMgbm90IGludGVycm9nYXRlIHdoZXRoZXIgYW4gJ2F0dGFjaCcKKwkgKiByb3V0aW5lIGlzIGFjdHVhbGx5IHJlZ2lzdGVyZWQgb3Igbm90LCB3ZSBzdXBwbHkgYSBkdW1teSByb3V0aW5lIHdoaWNoCisJICogZG9lcyBub3RoaW5nIChzaW5jZSBlbmNvZGluZyBhbmQgcGFyaXR5IGFyZSBzZXR1cCBmb3Igb3VyIGRyaXZlciB2aWEgYQorCSAqIHNwZWNpYWwgY29uZmlndXJhdGlvbiBhcHBsaWNhdGlvbikuCisJICovCiAKLSAgICBoZGxjLT5hdHRhY2ggPSBjaGFuX2F0dGFjaF9ub29wOworCWhkbGMtPmF0dGFjaCA9IGNoYW5fYXR0YWNoX25vb3A7CiAKLSAgICBydG5sX3VubG9jayAoKTsgICAgICAgICAgICAgICAgIC8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgIHJldCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlIChkZXYpOwotICAgIC8qIE5PVEU6IDxzdGF0cz4gc2V0dGluZyBtdXN0IG9jY3VyIEFGVEVSIHJlZ2lzdHJhdGlvbiBpbiBvcmRlciB0byAidGFrZSIgKi8KLSAgICBkZXYtPnR4X3F1ZXVlX2xlbiA9IE1BWF9ERUZBVUxUX0lGUUxFTjsKKwkvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KKwlydG5sX3VubG9jaygpOworCXJldCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJLyogTk9URTogPHN0YXRzPiBzZXR0aW5nIG11c3Qgb2NjdXIgQUZURVIgcmVnaXN0cmF0aW9uIGluIG9yZGVyIHRvICJ0YWtlIiAqLworCWRldi0+dHhfcXVldWVfbGVuID0gTUFYX0RFRkFVTFRfSUZRTEVOOwogCi0gICAgcnRubF9sb2NrICgpOyAgICAgICAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICBpZiAocmV0KQotICAgIHsKLSAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCi0gICAgICAgICAgICBwcl9pbmZvKCIlczogY3JlYXRlX2NoYW5bJWRdIHJlZ2lzdHJhdGlvbiBlcnJvciA9ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNwLT5jaGFubnVtLCByZXQpOwotICAgICAgICBmcmVlX25ldGRldiAoZGV2KTsgICAgICAgICAgLyogY2xlYW51cCAqLwotCXJldHVybiBOVUxMOwkJLyogZmFpbGVkIHRvIHJlZ2lzdGVyICovCi0gICAgfQotICAgIHJldHVybiBkZXY7CisJLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJcnRubF9sb2NrKCk7CisJaWYgKHJldCkgeworCQlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKKwkJCXByX2luZm8oIiVzOiBjcmVhdGVfY2hhblslZF0gcmVnaXN0cmF0aW9uIGVycm9yID0gJWQuXG4iLAorCQkJCWNpLT5kZXZuYW1lLCBjcC0+Y2hhbm51bSwgcmV0KTsKKwkJLyogY2xlYW51cCAqLworCQlmcmVlX25ldGRldihkZXYpOworCQkvKiBmYWlsZWQgdG8gcmVnaXN0ZXIgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIAogLyogdGhlIGlkZWEgaGVyZSBpcyB0byBnZXQgcG9ydCBpbmZvcm1hdGlvbiBhbmQgcGFzcyBpdCBiYWNrICh1c2luZyBwb2ludGVyKSAqLwotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2dldF9wb3J0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZ2V0X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgaW50ICAgICAgICAgcmV0OwotICAgIGNpX3QgICAgICAgKmNpOyAgICAgICAgICAgICAvKiBjaSBzdGFuZHMgZm9yIGNhcmQgaW5mb3JtYXRpb24gKi8KLSAgICBzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7LyogY29weSBkYXRhIHRvIGtlcm5lbCBsYW5kICovCisJaW50ICAgICAgICAgcmV0OworCWNpX3QgICAgICAgKmNpOyAgICAgICAgICAgICAvKiBjaSBzdGFuZHMgZm9yIGNhcmQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7LyogY29weSBkYXRhIHRvIGtlcm5lbCBsYW5kICovCiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZwcCwgZGF0YSwgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgaWYgKHBwLnBvcnRudW0gPj0gTVVTWUNDX05QT1JUUykKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgLyogZ2V0IGNhcmQgaW5mbyAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmcHAsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHBwLnBvcnRudW0gPj0gTVVTWUNDX05QT1JUUykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAvKiBnZXQgY2FyZCBpbmZvICovCiAKLSAgICByZXQgPSBta3JldCAoYzRfZ2V0X3BvcnQgKGNpLCBwcC5wb3J0bnVtKSk7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmY2ktPnBvcnRbcHAucG9ydG51bV0ucCwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlyZXQgPSBjNF9nZXRfcG9ydChjaSwgcHAucG9ydG51bSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmY2ktPnBvcnRbcHAucG9ydG51bV0ucCwKKwkJCSBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIGNvcHlzIHRoZSB1c2VyIGRhdGEgYW5kIHRoZW4gY2FsbHMgdGhlIHJlYWwgYWN0aW9uIGZ1bmN0aW9uICovCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fc2V0X3BvcnQgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19zZXRfcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBjaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCi0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLworCWNpX3QgICAgICAgKmNpOyAgICAgICAgICAgICAvKiBjaSBzdGFuZHMgZm9yIGNhcmQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7LyogY29weSBkYXRhIHRvIGtlcm5lbCBsYW5kICovCiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZwcCwgZGF0YSwgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgaWYgKHBwLnBvcnRudW0gPj0gTVVTWUNDX05QT1JUUykKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgLyogZ2V0IGNhcmQgaW5mbyAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmcHAsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHBwLnBvcnRudW0gPj0gTVVTWUNDX05QT1JUUykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAvKiBnZXQgY2FyZCBpbmZvICovCiAKLSAgICBpZiAocHAucG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpIC8qIHNhbml0eSBjaGVjayAqLwotICAgICAgICByZXR1cm4gLUVOWElPOworCWlmIChwcC5wb3J0bnVtID49IGNpLT5tYXhfcG9ydCkgLyogc2FuaXR5IGNoZWNrICovCisJCXJldHVybiAtRU5YSU87CiAKLSAgICBtZW1jcHkgKCZjaS0+cG9ydFtwcC5wb3J0bnVtXS5wLCAmcHAsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSk7Ci0gICAgcmV0dXJuIG1rcmV0IChjNF9zZXRfcG9ydCAoY2ksIHBwLnBvcnRudW0pKTsKKwltZW1jcHkoJmNpLT5wb3J0W3BwLnBvcnRudW1dLnAsICZwcCwgc2l6ZW9mKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpOworCXJldHVybiBjNF9zZXRfcG9ydChjaSwgcHAucG9ydG51bSk7CiB9CiAKIC8qIHdvcmsgdGhlIHBvcnQgbG9vcGJhY2sgbW9kZSBhcyBwZXIgZGlyZWN0ZWQgKi8KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19wb3J0X2xvb3AgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19wb3J0X2xvb3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOwotICAgIGNpX3QgICAgICAgKmNpOworCXN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsKKwljaV90ICAgICAgICpjaTsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJnBwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHJldHVybiBta3JldCAoYzRfbG9vcF9wb3J0IChjaSwgcHAucG9ydG51bSwgcHAucG9ydF9tb2RlKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZwcCwgZGF0YSwgc2l6ZW9mKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwljaSA9IGdldF9jaV9ieV9kZXYobmRldik7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGM0X2xvb3BfcG9ydChjaSwgcHAucG9ydG51bSwgcHAucG9ydF9tb2RlKTsKIH0KIAogLyogc2V0IHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgLyBvciBqdXN0IHJlYWQgaXQgKi8KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19mcmFtZXJfcncgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19mcmFtZXJfcncoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOwotICAgIGNpX3QgICAgICAgKmNpOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7CisJY2lfdCAgICAgICAqY2k7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgcmV0ID0gbWtyZXQgKGM0X2ZyYW1lX3J3IChjaSwgJnBwKSk7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmcHAsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmcHAsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGM0X2ZyYW1lX3J3KGNpLCAmcHApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnBwLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCiAvKiBzZXQgdGhlIHNwZWNpZmllZCByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZSAvIG9yIGp1c3QgcmVhZCBpdCAqLwotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX3BsZF9ydyAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX3BsZF9ydyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7Ci0gICAgY2lfdCAgICAgICAqY2k7Ci0gICAgaW50ICAgICAgICAgcmV0OworCXN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsKKwljaV90ICAgICAgICpjaTsKKwlpbnQgICAgICAgICByZXQ7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZwcCwgZGF0YSwgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICByZXQgPSBta3JldCAoYzRfcGxkX3J3IChjaSwgJnBwKSk7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmcHAsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmcHAsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYzRfcGxkX3J3KGNpLCAmcHApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmcHAsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHNldCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlIC8gb3IganVzdCByZWFkIGl0ICovCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fbXVzeWNjX3J3IChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fbXVzeWNjX3J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBjNF9tdXN5Y2NfcGFyYW0gbXA7Ci0gICAgY2lfdCAgICAgICAqY2k7Ci0gICAgaW50ICAgICAgICAgcmV0OworCXN0cnVjdCBjNF9tdXN5Y2NfcGFyYW0gbXA7CisJY2lfdCAgICAgICAqY2k7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmbXAsIGRhdGEsIHNpemVvZiAoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHJldCA9IG1rcmV0IChjNF9tdXN5Y2NfcncgKGNpLCAmbXApKTsKLSAgICBpZiAocmV0KQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGlmIChjb3B5X3RvX3VzZXIgKGRhdGEsICZtcCwgc2l6ZW9mIChzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmbXAsIGRhdGEsIHNpemVvZihzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBjNF9tdXN5Y2NfcncoY2ksICZtcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmbXAsIHNpemVvZihzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fZ2V0X2NoYW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19nZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7Ci0gICAgaW50ICAgICAgICAgcmV0OworCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKKwlpbnQgICAgICAgICByZXQ7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZjcCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsCisJCQkJc2l6ZW9mKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAotICAgIGlmICgocmV0ID0gbWtyZXQgKGM0X2dldF9jaGFuIChjcC5jaGFubnVtLCAmY3ApKSkpCi0gICAgICAgIHJldHVybiByZXQ7CisJcmV0ID0gYzRfZ2V0X2NoYW4oY3AuY2hhbm51bSwgJmNwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotICAgIGlmIChjb3B5X3RvX3VzZXIgKGRhdGEsICZjcCwgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgcmV0dXJuIDA7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmY3AsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19zZXRfY2hhbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKLSAgICBpbnQgICAgICAgICByZXQ7Ci0gICAgY2lfdCAgICAgICAqY2k7CisJc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOworCWNpX3QgICAgICAgKmNpOwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3AsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgc3dpdGNoIChyZXQgPSBta3JldCAoYzRfc2V0X2NoYW4gKGNwLmNoYW5udW0sICZjcCkpKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjNF9zZXRfY2hhbihjcC5jaGFubnVtLCAmY3ApOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fY3JlYXRlX2NoYW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19jcmVhdGVfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKLSAgICBpbnQgICAgICAgICByZXQ7CisJY2lfdCAgICAgICAqY2k7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3AsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgZGV2ID0gY3JlYXRlX2NoYW4gKG5kZXYsIGNpLCAmY3ApOwotICAgIGlmICghZGV2KQotICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgIHJldCA9IG1rcmV0IChjNF9uZXdfY2hhbiAoY2ksIGNwLnBvcnQsIGNwLmNoYW5udW0sIGRldikpOwotICAgIGlmIChyZXQpCi0gICAgewotICAgICAgICBydG5sX3VubG9jayAoKTsgICAgICAgICAgICAgLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgICAgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2UgKGRldik7Ci0gICAgICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICAgICAgZnJlZV9uZXRkZXYgKGRldik7Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjcCwgZGF0YSwgc2l6ZW9mKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwljaSA9IGdldF9jaV9ieV9kZXYobmRldik7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2ID0gY3JlYXRlX2NoYW4obmRldiwgY2ksICZjcCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUJVU1k7CisJcmV0ID0gYzRfbmV3X2NoYW4oY2ksIGNwLnBvcnQsIGNwLmNoYW5udW0sIGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJCXJ0bmxfdW5sb2NrKCk7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwkJLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJCXJ0bmxfbG9jaygpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fZ2V0X2NoYW5fc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19nZXRfY2hhbl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwIGNjczsKLSAgICBpbnQgICAgICAgICByZXQ7CisJc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCBjY3M7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY2NzLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHN3aXRjaCAocmV0ID0gbWtyZXQgKGM0X2dldF9jaGFuX3N0YXRzIChjY3MuY2hhbm51bSwgJmNjcy5zdGF0cykpKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChjb3B5X3RvX3VzZXIgKGRhdGEsICZjY3MsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmY2NzLCBkYXRhLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBjNF9jaGFuX3N0YXRzX3dyYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBjNF9nZXRfY2hhbl9zdGF0cyhjY3MuY2hhbm51bSwgJmNjcy5zdGF0cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29weV90b191c2VyKGRhdGEsICZjY3MsCisJCQkgc2l6ZW9mKHN0cnVjdCBjNF9jaGFuX3N0YXRzX3dyYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fc2V0X2xvZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fc2V0X2xvZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHVuc2lnbmVkIGludCBjeHQxZTFfbG9nX2xldmVsOworCXVuc2lnbmVkIGludCBjeHQxZTFfbG9nX2xldmVsOwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3h0MWUxX2xvZ19sZXZlbCwgZGF0YSwgc2l6ZW9mIChpbnQpKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgc2JlY29tX3NldF9sb2dsZXZlbCAoY3h0MWUxX2xvZ19sZXZlbCk7Ci0gICAgcmV0dXJuIDA7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjeHQxZTFfbG9nX2xldmVsLCBkYXRhLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCXNiZWNvbV9zZXRfbG9nbGV2ZWwoY3h0MWUxX2xvZ19sZXZlbCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19kZWx1c2VyIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IGxvY2tpdCkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZGVsdXNlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IGxvY2tpdCkKIHsKLSAgICBpZiAobmRldi0+ZmxhZ3MgJiBJRkZfVVApCi0gICAgICAgIHJldHVybiAtRUJVU1k7CisJaWYgKG5kZXYtPmZsYWdzICYgSUZGX1VQKQorCQlyZXR1cm4gLUVCVVNZOwogCi0gICAgewotICAgICAgICBjaV90ICAgICAgICpjaTsKLSAgICAgICAgbWNoX3QgICAgICAqY2g7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2OwotICAgICAgICBpbnQgICAgICAgICBjaGFubnVtOworCXsKKwkJY2lfdCAgICAgICAqY2k7CisJCW1jaF90ICAgICAgKmNoOworCQljb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKKwkJaW50ICAgICAgICAgY2hhbm51bTsKIAotICAgICAgICBwcml2ID0gKHN0cnVjdCBjNF9wcml2ICopIGRldl90b19oZGxjIChuZGV2KS0+cHJpdjsKLSAgICAgICAgY2kgPSBwcml2LT5jaTsKLSAgICAgICAgY2hhbm51bSA9IHByaXYtPmNoYW5udW07CisJCXByaXYgPSAoc3RydWN0IGM0X3ByaXYgKilkZXZfdG9faGRsYyhuZGV2KS0+cHJpdjsKKwkJY2kgPSBwcml2LT5jaTsKKwkJY2hhbm51bSA9IHByaXYtPmNoYW5udW07CiAKLSAgICAgICAgY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pOwotICAgICAgICBpZiAoY2ggPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwotCWNoLT51c2VyID0gTlVMTDsJLyogd2lsbCBiZSBmcmVlZCwgYmVsb3cgKi8KLSAgICB9CisJCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCQlpZiAoY2ggPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PRU5UOworCQljaC0+dXNlciA9IE5VTEw7CS8qIHdpbGwgYmUgZnJlZWQsIGJlbG93ICovCisJfQogCi0gICAgaWYgKGxvY2tpdCkKLSAgICAgICAgcnRubF91bmxvY2sgKCk7ICAgICAgICAgICAgIC8qIG5lZWRlZCBpZiBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgdW5yZWdpc3Rlcl9oZGxjX2RldmljZSAobmRldik7Ci0gICAgaWYgKGxvY2tpdCkKLSAgICAgICAgcnRubF9sb2NrICgpOyAgICAgICAgICAgICAgIC8qIG5lZWRlZCBpZiBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgZnJlZV9uZXRkZXYgKG5kZXYpOwotICAgIHJldHVybiAwOworCS8qIG5lZWRlZCBpZiBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJaWYgKGxvY2tpdCkKKwkJcnRubF91bmxvY2soKTsKKwl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKG5kZXYpOworCS8qIG5lZWRlZCBpZiBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJaWYgKGxvY2tpdCkKKwkJcnRubF9sb2NrKCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcmV0dXJuIDA7CiB9CiAKIGludAotZG9fZGVsX2NoYW4gKHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQorZG9fZGVsX2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKm11c3ljY19kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOwotICAgIGNoYXIgICAgICAgIGJ1ZltzaXplb2YgKENIQU5OQU1FKSArIDNdOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0gICAgaW50ICAgICAgICAgcmV0OworCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKKwljaGFyICAgICAgICBidWZbc2l6ZW9mKENIQU5OQU1FKSArIDNdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3AsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBpZiAoY3AuY2hhbm51bSA+IDk5OSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mKGJ1ZiksIENIQU5OQU1FICIlZCIsIGNwLmNoYW5udW0pOworCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsCisJCQkgICBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjcC5jaGFubnVtID4gOTk5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBDSEFOTkFNRSAiJWQiLCBjcC5jaGFubnVtKTsKIAlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGJ1Zik7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwotICAgIHJldCA9IGRvX2RlbHVzZXIgKGRldiwgMSk7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICByZXR1cm4gYzRfZGVsX2NoYW4gKGNwLmNoYW5udW0pOworCXJldCA9IGRvX2RlbHVzZXIoZGV2LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjNF9kZWxfY2hhbihjcC5jaGFubnVtKTsKIH0KLWludCAgICAgICAgIGM0X3Jlc2V0X2JvYXJkICh2b2lkICopOworaW50IGM0X3Jlc2V0X2JvYXJkKHZvaWQgKik7CiAKIGludAotZG9fcmVzZXQgKHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQorZG9fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm11c3ljY19kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7Ci0gICAgaW50ICAgICAgICAgaTsKKwljb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKKwlpbnQgICAgICAgICBpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQotICAgIHsKLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0gICAgICAgIGNoYXIgICAgICAgIGJ1ZltzaXplb2YgKENIQU5OQU1FKSArIDNdOworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwkJY2hhciAgICAgICAgYnVmW3NpemVvZihDSEFOTkFNRSkgKyAzXTsKIAotICAgICAgICBzcHJpbnRmIChidWYsIENIQU5OQU1FICIlZCIsIGkpOwotCW5kZXYgPSBfX2Rldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGJ1Zik7Ci0JaWYgKCFuZGV2KQotCQljb250aW51ZTsKLSAgICAgICAgcHJpdiA9IGRldl90b19oZGxjIChuZGV2KS0+cHJpdjsKKwkJc3ByaW50ZihidWYsIENIQU5OQU1FICIlZCIsIGkpOworCQluZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBidWYpOworCQlpZiAoIW5kZXYpCisJCQljb250aW51ZTsKKwkJcHJpdiA9IGRldl90b19oZGxjKG5kZXYpLT5wcml2OwogCi0gICAgICAgIGlmICgodW5zaWduZWQgbG9uZykgKHByaXYtPmNpKSA9PQotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZXRkZXZfcHJpdihtdXN5Y2NfZGV2KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5kZXYtPmZsYWdzICY9IH5JRkZfVVA7Ci0gICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlIChuZGV2KTsKLSAgICAgICAgICAgIGRvX2RlbHVzZXIgKG5kZXYsIDEpOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIChwcml2LT5jaSkgPT0KKwkJCSh1bnNpZ25lZCBsb25nKSAobmV0ZGV2X3ByaXYobXVzeWNjX2RldikpKSB7CisJCQluZGV2LT5mbGFncyAmPSB+SUZGX1VQOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJCWRvX2RlbHVzZXIobmRldiwgMSk7CisJCX0KIAl9Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBpbnQKLWRvX3Jlc2V0X2NoYW5fc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQorZG9fcmVzZXRfY2hhbl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7CisJc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3AsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gbWtyZXQgKGM0X2RlbF9jaGFuX3N0YXRzIChjcC5jaGFubnVtKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjcCwgZGF0YSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGM0X2RlbF9jaGFuX3N0YXRzKGNwLmNoYW5udW0pOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotYzRfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3N0YXRpYyBzdGF0dXNfdAorYzRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewotICAgIGNpX3QgICAgICAgKmNpOwotICAgIHZvaWQgICAgICAgKmRhdGE7Ci0gICAgaW50ICAgICAgICAgaW9jbWQsIGlvbGVuOwotICAgIHN0YXR1c190ICAgIHJldDsKLSAgICBzdGF0aWMgc3RydWN0IGRhdGEKLSAgICB7Ci0gICAgICAgIHVuaW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVfaW50OF90IGM7Ci0gICAgICAgICAgICB1X2ludDMyX3QgaTsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVfYnJkX2luZm8gYmlwOwotICAgICAgICAgICAgc3RydWN0IHNiZV9kcnZfaW5mbyBkaXA7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlX2lpZF9pbmZvIGlpcDsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVfYnJkX2FkZHIgYmFwOwotICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9jaGFuX3N0YXRzIHN0YXRzOwotICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIHBhcmFtOwotICAgICAgICAgICAgc3RydWN0IHRlbXV4X2NhcmRfc3RhdHMgY2FyZHM7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlY29tX2NhcmRfcGFyYW0gY2FyZHA7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSBmcnA7Ci0gICAgICAgIH0gICAgICAgICAgIHU7Ci0gICAgfSAgICAgICAgICAgYXJnOworCWNpX3QgICAgICAgKmNpOworCXZvaWQgICAgICAgKmRhdGE7CisJaW50ICAgICAgICAgaW9jbWQsIGlvbGVuOworCXN0YXR1c190ICAgIHJldDsKKwlzdGF0aWMgc3RydWN0IGRhdGEgeworCQl1bmlvbiB7CisJCQl1X2ludDhfdCBjOworCQkJdV9pbnQzMl90IGk7CisJCQlzdHJ1Y3Qgc2JlX2JyZF9pbmZvIGJpcDsKKwkJCXN0cnVjdCBzYmVfZHJ2X2luZm8gZGlwOworCQkJc3RydWN0IHNiZV9paWRfaW5mbyBpaXA7CisJCQlzdHJ1Y3Qgc2JlX2JyZF9hZGRyIGJhcDsKKwkJCXN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyBzdGF0czsKKwkJCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBwYXJhbTsKKwkJCXN0cnVjdCB0ZW11eF9jYXJkX3N0YXRzIGNhcmRzOworCQkJc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtIGNhcmRwOworCQkJc3RydWN0IHNiZWNvbV9mcmFtZXJfcGFyYW0gZnJwOworCQl9IHU7CisJfSBhcmc7CiAKIAotICAgIGlmICghY2FwYWJsZSAoQ0FQX1NZU19BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0gICAgaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSArIDE1KQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAoIShjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKGNpLT5zdGF0ZSAhPSBDX1JVTk5JTkcpCi0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmlvY21kLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGlvY21kKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoY21kICE9IFNJT0NERVZQUklWQVRFICsgMTUpCisJCXJldHVybiAtRUlOVkFMOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2ktPnN0YXRlICE9IENfUlVOTklORykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZpb2NtZCwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGlvY21kKSkpCisJCXJldHVybiAtRUZBVUxUOwogI2lmIDAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZsZW4sIGlmci0+aWZyX2RhdGEgKyBzaXplb2YgKGlvY21kKSwgc2l6ZW9mIChsZW4pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZsZW4sIGlmci0+aWZyX2RhdGEgKyBzaXplb2YoaW9jbWQpLCBzaXplb2YobGVuKSkpCisJCXJldHVybiAtRUZBVUxUOwogI2VuZGlmCiAKICNpZiAwCi0gICAgcHJfaW5mbygiYzRfaW9jdGw6IGlvY21kICV4LCBkaXIgJXggdHlwZSAleCBuciAleCBpb2xlbiAlZC5cbiIsIGlvY21kLAotICAgICAgICAgICAgX0lPQ19ESVIgKGlvY21kKSwgX0lPQ19UWVBFIChpb2NtZCksIF9JT0NfTlIgKGlvY21kKSwKLSAgICAgICAgICAgIF9JT0NfU0laRSAoaW9jbWQpKTsKKwlwcl9pbmZvKCJjNF9pb2N0bDogaW9jbWQgJXgsIGRpciAleCB0eXBlICV4IG5yICV4IGlvbGVuICVkLlxuIiwgaW9jbWQsCisJCV9JT0NfRElSKGlvY21kKSwgX0lPQ19UWVBFKGlvY21kKSwgX0lPQ19OUihpb2NtZCksCisJCV9JT0NfU0laRShpb2NtZCkpOwogI2VuZGlmCi0gICAgaW9sZW4gPSBfSU9DX1NJWkUgKGlvY21kKTsKLSAgICBpZiAoaW9sZW4gPiBzaXplb2YoYXJnKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgZGF0YSA9IGlmci0+aWZyX2RhdGEgKyBzaXplb2YgKGlvY21kKTsKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZhcmcsIGRhdGEsIGlvbGVuKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJaW9sZW4gPSBfSU9DX1NJWkUoaW9jbWQpOworCWlmIChpb2xlbiA+IHNpemVvZihhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhID0gaWZyLT5pZnJfZGF0YSArIHNpemVvZihpb2NtZCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmcsIGRhdGEsIGlvbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLSAgICByZXQgPSAwOwotICAgIHN3aXRjaCAoaW9jbWQpCi0gICAgewotICAgIGNhc2UgU0JFX0lPQ19QT1JUX0dFVDoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBTQkVfSU9DX1BPUlRfR0VUIElvY3RsLi4uXG4iKTsKLSAgICAgICAgcmV0ID0gZG9fZ2V0X3BvcnQgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfUE9SVF9TRVQ6Ci0gICAgICAgIC8vcHJfaW5mbygiPj4gU0JFX0lPQ19QT1JUX1NFVCBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX3NldF9wb3J0IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX0NIQU5fR0VUOgotICAgICAgICAvL3ByX2luZm8oIj4+IFNCRV9JT0NfQ0hBTl9HRVQgSW9jdGwuLi5cbiIpOwotICAgICAgICByZXQgPSBkb19nZXRfY2hhbiAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19DSEFOX1NFVDoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBTQkVfSU9DX0NIQU5fU0VUIElvY3RsLi4uXG4iKTsKLSAgICAgICAgcmV0ID0gZG9fc2V0X2NoYW4gKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEM0X0RFTF9DSEFOOgotICAgICAgICAvL3ByX2luZm8oIj4+IEM0X0RFTF9DSEFOIElvY3RsLi4uXG4iKTsKLSAgICAgICAgcmV0ID0gZG9fZGVsX2NoYW4gKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfQ0hBTl9ORVc6Ci0gICAgICAgIHJldCA9IGRvX2NyZWF0ZV9jaGFuIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX0NIQU5fR0VUX1NUQVQ6Ci0gICAgICAgIHJldCA9IGRvX2dldF9jaGFuX3N0YXRzIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX0xPR0xFVkVMOgotICAgICAgICByZXQgPSBkb19zZXRfbG9nbGV2ZWwgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfUkVTRVRfREVWOgotICAgICAgICByZXQgPSBkb19yZXNldCAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19DSEFOX0RFTF9TVEFUOgotICAgICAgICByZXQgPSBkb19yZXNldF9jaGFuX3N0YXRzIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDNF9MT09QX1BPUlQ6Ci0gICAgICAgIHJldCA9IGRvX3BvcnRfbG9vcCAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQzRfUldfRlJNUjoKLSAgICAgICAgcmV0ID0gZG9fZnJhbWVyX3J3IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDNF9SV19NU1lDOgotICAgICAgICByZXQgPSBkb19tdXN5Y2NfcncgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEM0X1JXX1BMRDoKLSAgICAgICAgcmV0ID0gZG9fcGxkX3J3IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX0lJRF9HRVQ6Ci0gICAgICAgIHJldCA9IChpb2xlbiA9PSBzaXplb2YgKHN0cnVjdCBzYmVfaWlkX2luZm8pKSA/IGM0X2dldF9paWRpbmZvIChjaSwgJmFyZy51LmlpcCkgOiAtRUZBVUxUOwotICAgICAgICBpZiAocmV0ID09IDApICAgICAgICAgICAgICAgLyogbm8gZXJyb3IsIGNvcHkgZGF0YSAqLwotICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJmFyZywgaW9sZW4pKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvL3ByX2luZm8oIj4+IGM0X2lvY3RsOiBFSU5WQUwgLSB1bmtub3duIGlvY21kIDwleD5cbiIsIGlvY21kKTsKLSAgICAgICAgcmV0ID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBta3JldCAocmV0KTsKKwlyZXQgPSAwOworCXN3aXRjaCAoaW9jbWQpIHsKKwljYXNlIFNCRV9JT0NfUE9SVF9HRVQ6CisJCXJldCA9IGRvX2dldF9wb3J0KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfUE9SVF9TRVQ6CisJCXJldCA9IGRvX3NldF9wb3J0KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfQ0hBTl9HRVQ6CisJCXJldCA9IGRvX2dldF9jaGFuKG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfQ0hBTl9TRVQ6CisJCXJldCA9IGRvX3NldF9jaGFuKG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEM0X0RFTF9DSEFOOgorCQlyZXQgPSBkb19kZWxfY2hhbihuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0NIQU5fTkVXOgorCQlyZXQgPSBkb19jcmVhdGVfY2hhbihuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0NIQU5fR0VUX1NUQVQ6CisJCXJldCA9IGRvX2dldF9jaGFuX3N0YXRzKG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfTE9HTEVWRUw6CisJCXJldCA9IGRvX3NldF9sb2dsZXZlbChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX1JFU0VUX0RFVjoKKwkJcmV0ID0gZG9fcmVzZXQobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19DSEFOX0RFTF9TVEFUOgorCQlyZXQgPSBkb19yZXNldF9jaGFuX3N0YXRzKG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEM0X0xPT1BfUE9SVDoKKwkJcmV0ID0gZG9fcG9ydF9sb29wKG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEM0X1JXX0ZSTVI6CisJCXJldCA9IGRvX2ZyYW1lcl9ydyhuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9SV19NU1lDOgorCQlyZXQgPSBkb19tdXN5Y2NfcncobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgQzRfUldfUExEOgorCQlyZXQgPSBkb19wbGRfcncobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19JSURfR0VUOgorCQlyZXQgPSAoaW9sZW4gPT0gc2l6ZW9mKHN0cnVjdCBzYmVfaWlkX2luZm8pKSA/CisJCSAgICAgICBjNF9nZXRfaWlkaW5mbyhjaSwgJmFyZy51LmlpcCkgOiAtRUZBVUxUOworCQlpZiAocmV0ID09IDApICAgICAgICAgICAgICAgLyogbm8gZXJyb3IsIGNvcHkgZGF0YSAqLworCQkJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmYXJnLCBpb2xlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGM0X29wcyA9IHsKLSAgICAgICAubmRvX29wZW4gICAgICAgPSB2b2lkX29wZW4sCi0gICAgICAgLm5kb19zdGFydF94bWl0ID0gYzRfbGludXhfeG1pdCwKLSAgICAgICAubmRvX2RvX2lvY3RsICAgPSBjNF9pb2N0bCwKKwkubmRvX29wZW4gICAgICAgPSB2b2lkX29wZW4sCisJLm5kb19zdGFydF94bWl0ID0gYzRfbGludXhfeG1pdCwKKwkubmRvX2RvX2lvY3RsICAgPSBjNF9pb2N0bCwKIH07CiAKIHN0YXRpYyB2b2lkIGM0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgZGV2LT50eXBlID0gQVJQSFJEX1ZPSUQ7Ci0gICAgICAgZGV2LT5uZXRkZXZfb3BzID0gJmM0X29wczsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfVk9JRDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmYzRfb3BzOwogfQogCiBzdHJ1Y3QgbmV0X2RldmljZSAqX19pbml0Ci1jNF9hZGRfZGV2IChoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vLCB1bnNpZ25lZCBsb25nIGYwLCB1bnNpZ25lZCBsb25nIGYxLAotICAgICAgICAgICAgaW50IGlycTAsIGludCBpcnExKQorYzRfYWRkX2RldihoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vLCB1bnNpZ25lZCBsb25nIGYwLCB1bnNpZ25lZCBsb25nIGYxLAorCSAgIGludCBpcnEwLCBpbnQgaXJxMSkKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLSAgICBjaV90ICAgICAgICpjaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwljaV90ICAgICAgICpjaTsKIAotICAgIG5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGNpX3QpLCBTQkVfSUZBQ0VUTVBMLCBjNF9zZXR1cCk7Ci0gICAgaWYgKCFuZGV2KQotICAgIHsKLSAgICAgICAgcHJfd2FybmluZygiJXM6IG5vIG1lbW9yeSBmb3Igc3RydWN0IG5ldF9kZXZpY2UgIVxuIiwgaGktPmRldm5hbWUpOwotICAgICAgICBlcnJvcl9mbGFnID0gRU5PTUVNOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBjaSA9IChjaV90ICopKG5ldGRldl9wcml2KG5kZXYpKTsKLSAgICBuZGV2LT5pcnEgPSBpcnEwOworCW5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGNpX3QpLCBTQkVfSUZBQ0VUTVBMLCBjNF9zZXR1cCk7CisJaWYgKCFuZGV2KSB7CisJCXByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIHN0cnVjdCBuZXRfZGV2aWNlICFcbiIsCisJCQkgICBoaS0+ZGV2bmFtZSk7CisJCWVycm9yX2ZsYWcgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY2kgPSAoY2lfdCAqKShuZXRkZXZfcHJpdihuZGV2KSk7CisJbmRldi0+aXJxID0gaXJxMDsKIAotICAgIGNpLT5oZHdfaW5mbyA9IGhpOwotICAgIGNpLT5zdGF0ZSA9IENfSU5JVDsgICAgICAgICAvKiBtYXJrIGFzIGhhcmR3YXJlIG5vdCBhdmFpbGFibGUgKi8KLSAgICBjaS0+bmV4dCA9IGM0X2xpc3Q7Ci0gICAgYzRfbGlzdCA9IGNpOwotICAgIGNpLT5icmRubyA9IGNpLT5uZXh0ID8gY2ktPm5leHQtPmJyZG5vICsgMSA6IDA7CisJY2ktPmhkd19pbmZvID0gaGk7CisJY2ktPnN0YXRlID0gQ19JTklUOyAgICAgICAgIC8qIG1hcmsgYXMgaGFyZHdhcmUgbm90IGF2YWlsYWJsZSAqLworCWNpLT5uZXh0ID0gYzRfbGlzdDsKKwljNF9saXN0ID0gY2k7CisJY2ktPmJyZG5vID0gY2ktPm5leHQgPyBjaS0+bmV4dC0+YnJkbm8gKyAxIDogMDsKIAotICAgIGlmICghQ0kpCi0gICAgICAgIENJID0gY2k7ICAgICAgICAgICAgICAgICAgICAvKiBERUJVRywgb25seSBib2FyZCAwIHVzYWdlICovCisJaWYgKCFDSSkKKwkJQ0kgPSBjaTsgICAgICAgICAgICAgICAgICAgIC8qIERFQlVHLCBvbmx5IGJvYXJkIDAgdXNhZ2UgKi8KIAotICAgIHN0cmNweSAoY2ktPmRldm5hbWUsIGhpLT5kZXZuYW1lKTsKLSAgICBjaS0+cmVsZWFzZSA9ICZwbWNjNF9PU1NJX3JlbGVhc2VbMF07CisJc3RyY3B5KGNpLT5kZXZuYW1lLCBoaS0+ZGV2bmFtZSk7CiAKLSAgICAvKiB0YXNrbGV0ICovCisJLyogdGFza2xldCAqLwogI2lmIGRlZmluZWQoU0JFX0lTUl9UQVNLTEVUKQotICAgIHRhc2tsZXRfaW5pdCAoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQsCi0gICAgICAgICAgICAgICAgICAodm9pZCAoKikgKHVuc2lnbmVkIGxvbmcpKSBtdXN5Y2NfaW50cl9iaF90YXNrbGV0LAotICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNpKTsKKwl0YXNrbGV0X2luaXQoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQsCisJCSAgICAgKHZvaWQgKCopICh1bnNpZ25lZCBsb25nKSkgbXVzeWNjX2ludHJfYmhfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZykgY2kpOwogCi0gICAgaWYgKGF0b21pY19yZWFkICgmY2ktPmNpX211c3ljY19pc3JfdGFza2xldC5jb3VudCkgPT0gMCkKLSAgICAgICAgdGFza2xldF9kaXNhYmxlX25vc3luYyAoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQpOworCWlmIChhdG9taWNfcmVhZCgmY2ktPmNpX211c3ljY19pc3JfdGFza2xldC5jb3VudCkgPT0gMCkKKwkJdGFza2xldF9kaXNhYmxlX25vc3luYygmY2ktPmNpX211c3ljY19pc3JfdGFza2xldCk7CiAjZWxpZiBkZWZpbmVkKFNCRV9JU1JfSU1NRURJQVRFKQotICAgIGNpLT5jaV9tdXN5Y2NfaXNyX3RxLnJvdXRpbmUgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgbXVzeWNjX2ludHJfYmhfdGFza2xldDsKLSAgICBjaS0+Y2lfbXVzeWNjX2lzcl90cS5kYXRhID0gY2k7CisJY2ktPmNpX211c3ljY19pc3JfdHEucm91dGluZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpbXVzeWNjX2ludHJfYmhfdGFza2xldDsKKwljaS0+Y2lfbXVzeWNjX2lzcl90cS5kYXRhID0gY2k7CiAjZW5kaWYKIAogCi0gICAgaWYgKHJlZ2lzdGVyX25ldGRldiAobmRldikgfHwKLSAgICAgICAgKGM0X2luaXQgKGNpLCAodV9jaGFyICopIGYwLCAodV9jaGFyICopIGYxKSAhPSBTQkVfRFJWUl9TVUNDRVNTKSkKLSAgICB7Ci0gICAgICAgIE9TX2tmcmVlIChuZXRkZXZfcHJpdihuZGV2KSk7Ci0gICAgICAgIE9TX2tmcmVlIChuZGV2KTsKLSAgICAgICAgZXJyb3JfZmxhZyA9IEVOT0RFVjsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgaW50IHJlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0gICAgICogICAgICAgICAgICAgICAgICB2b2lkICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAqICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRldl9pZCk7Ci0gICAgICogIHdoZXJlaW46Ci0gICAgICogIGlycSAgICAgIC0+IFRoZSBpbnRlcnJ1cHQgbnVtYmVyIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgotICAgICAqICBoYW5kbGVyICAtPiBQb2ludGVyIHRvIGhhbmRsaW5nIGZ1bmN0aW9uIGJlaW5nIGluc3RhbGxlZC4KLSAgICAgKiAgZmxhZ3MgICAgLT4gQSBiaXQgbWFzayBvZiBvcHRpb25zIHJlbGF0ZWQgdG8gaW50ZXJydXB0IG1hbmFnZW1lbnQuCi0gICAgICogIGRldl9uYW1lIC0+IFN0cmluZyB1c2VkIGluIC9wcm9jL2ludGVycnVwdHMgdG8gc2hvdyBvd25lciBvZiBpbnRlcnJ1cHQuCi0gICAgICogIGRldl9pZCAgIC0+IFBvaW50ZXIgKGZvciBzaGFyZWQgaW50ZXJydXB0IGxpbmVzKSB0byBwb2ludCB0byBpdHMgb3duCi0gICAgICogICAgICAgICAgICAgIHByaXZhdGUgZGF0YSBhcmVhICh0byBpZGVudGlmeSB3aGljaCBkZXZpY2UgaXMgaW50ZXJydXB0aW5nKS4KLSAgICAgKgotICAgICAqICBleHRlcm4gdm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5kZXYpIHx8CisJCShjNF9pbml0KGNpLCAodV9jaGFyICopIGYwLCAodV9jaGFyICopIGYxKSAhPSBTQkVfRFJWUl9TVUNDRVNTKSkgeworCQlPU19rZnJlZShuZXRkZXZfcHJpdihuZGV2KSk7CisJCU9TX2tmcmVlKG5kZXYpOworCQllcnJvcl9mbGFnID0gLUVOT0RFVjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogIGludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAorCSAqICAgICAgICAgICAgICAgICAgdm9pZCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKKwkgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkZXZfaWQpOworCSAqICB3aGVyZWluOgorCSAqICBpcnEgICAgICAtPiBUaGUgaW50ZXJydXB0IG51bWJlciB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KKwkgKiAgaGFuZGxlciAgLT4gUG9pbnRlciB0byBoYW5kbGluZyBmdW5jdGlvbiBiZWluZyBpbnN0YWxsZWQuCisJICogIGZsYWdzICAgIC0+IEEgYml0IG1hc2sgb2Ygb3B0aW9ucyByZWxhdGVkIHRvIGludGVycnVwdCBtYW5hZ2VtZW50LgorCSAqICBkZXZfbmFtZSAtPiBTdHJpbmcgdXNlZCBpbiAvcHJvYy9pbnRlcnJ1cHRzIHRvIHNob3cgb3duZXIgb2YgaW50ZXJydXB0LgorCSAqICBkZXZfaWQgICAtPiBQb2ludGVyIChmb3Igc2hhcmVkIGludGVycnVwdCBsaW5lcykgdG8gcG9pbnQgdG8gaXRzIG93bgorCSAqICAgICAgICAgICAgICBwcml2YXRlIGRhdGEgYXJlYSAodG8gaWRlbnRpZnkgd2hpY2ggZGV2aWNlIGlzIGludGVycnVwdGluZykuCisJICoKKwkgKiAgZXh0ZXJuIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAocmVxdWVzdF9pcnEgKGlycTAsICZjNF9saW51eF9pbnRlcnJ1cHQsCi0gICAgICAgICAgICAgICAgICAgICBJUlFGX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgIG5kZXYtPm5hbWUsIG5kZXYpKQotICAgIHsKLSAgICAgICAgcHJfd2FybmluZygiJXM6IE1VU1lDQyBjb3VsZCBub3QgZ2V0IGlycTogJWRcbiIsIG5kZXYtPm5hbWUsIGlycTApOwotICAgICAgICB1bnJlZ2lzdGVyX25ldGRldiAobmRldik7Ci0gICAgICAgIE9TX2tmcmVlIChuZXRkZXZfcHJpdihuZGV2KSk7Ci0gICAgICAgIE9TX2tmcmVlIChuZGV2KTsKLSAgICAgICAgZXJyb3JfZmxhZyA9IEVJTzsKLQlyZXR1cm4gTlVMTDsKLSAgICB9CisJaWYgKHJlcXVlc3RfaXJxKGlycTAsICZjNF9saW51eF9pbnRlcnJ1cHQsCisJCQlJUlFGX1NIQVJFRCwKKwkJCW5kZXYtPm5hbWUsIG5kZXYpKSB7CisJCXByX3dhcm5pbmcoIiVzOiBNVVNZQ0MgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLAorCQkJICAgbmRldi0+bmFtZSwgaXJxMCk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCQlPU19rZnJlZShuZXRkZXZfcHJpdihuZGV2KSk7CisJCU9TX2tmcmVlKG5kZXYpOworCQllcnJvcl9mbGFnID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQogI2lmZGVmIENPTkZJR19TQkVfUE1DQzRfTkNPTU0KLSAgICBpZiAocmVxdWVzdF9pcnEgKGlycTEsICZjNF9lYnVzX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIG5kZXYtPm5hbWUsIG5kZXYpKQotICAgIHsKLSAgICAgICAgcHJfd2FybmluZygiJXM6IEVCVVMgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBoaS0+ZGV2bmFtZSwgaXJxMSk7Ci0gICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2IChuZGV2KTsKLSAgICAgICAgZnJlZV9pcnEgKGlycTAsIG5kZXYpOwotICAgICAgICBPU19rZnJlZSAobmV0ZGV2X3ByaXYobmRldikpOwotICAgICAgICBPU19rZnJlZSAobmRldik7Ci0gICAgICAgIGVycm9yX2ZsYWcgPSBFSU87Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQorCWlmIChyZXF1ZXN0X2lycShpcnExLCAmYzRfZWJ1c19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBuZGV2LT5uYW1lLCBuZGV2KSkgeworCQlwcl93YXJuaW5nKCIlczogRUJVUyBjb3VsZCBub3QgZ2V0IGlycTogJWRcbiIsIGhpLT5kZXZuYW1lLCBpcnExKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CisJCWZyZWVfaXJxKGlycTAsIG5kZXYpOworCQlPU19rZnJlZShuZXRkZXZfcHJpdihuZGV2KSk7CisJCU9TX2tmcmVlKG5kZXYpOworCQllcnJvcl9mbGFnID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQogI2VuZGlmCiAKLSAgICAvKiBzZXR1cCBib2FyZCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiAqLworCS8qIHNldHVwIGJvYXJkIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uICovCiAKLSAgICB7Ci0gICAgICAgIHVfaW50MzJfdCAgIHRtcDsKKwl7CisJCXVfaW50MzJfdCAgIHRtcDsKIAotICAgICAgICBoZHdfc25fZ2V0IChoaSwgYnJkbm8pOyAgICAgLyogYWxzbyBzZXRzIFBST00gZm9ybWF0IHR5cGUgKHByb21mbXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3IgbGF0ZXIgdXNhZ2UgKi8KKwkJLyogYWxzbyBzZXRzIFBST00gZm9ybWF0IHR5cGUgKHByb21mbXQpIGZvciBsYXRlciB1c2FnZSAqLworCQloZHdfc25fZ2V0KGhpLCBicmRubyk7CiAKLSAgICAgICAgc3dpdGNoIChoaS0+cHJvbWZtdCkKLSAgICAgICAgewotICAgICAgICBjYXNlIFBST01fRk9STUFUX1RZUEUxOgotICAgICAgICAgICAgbWVtY3B5IChuZGV2LT5kZXZfYWRkciwgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7Ci0gICAgICAgICAgICBtZW1jcHkgKCZ0bXAsIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLklkKSwgNCk7ICAgICAvKiB1bmFsaWduZWQgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWNxdWlzaXRpb24gKi8KLSAgICAgICAgICAgIGNpLT5icmRfaWQgPSBjcHVfdG9fYmUzMiAodG1wKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBST01fRk9STUFUX1RZUEUyOgotICAgICAgICAgICAgbWVtY3B5IChuZGV2LT5kZXZfYWRkciwgKEZMRF9UWVBFMiAqKSAoaGktPm1mZ19pbmZvLnBmdDIuU2VyaWFsKSwgNik7Ci0gICAgICAgICAgICBtZW1jcHkgKCZ0bXAsIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLklkKSwgNCk7ICAgICAvKiB1bmFsaWduZWQgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWNxdWlzaXRpb24gKi8KLSAgICAgICAgICAgIGNpLT5icmRfaWQgPSBjcHVfdG9fYmUzMiAodG1wKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2ktPmJyZF9pZCA9IDA7Ci0gICAgICAgICAgICBtZW1zZXQgKG5kZXYtPmRldl9hZGRyLCAwLCA2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJCXN3aXRjaCAoaGktPnByb21mbXQpIHsKKwkJY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKKwkJCW1lbWNweShuZGV2LT5kZXZfYWRkciwKKwkJCSAgICAgICAoRkxEX1RZUEUxICopIChoaS0+bWZnX2luZm8ucGZ0MS5TZXJpYWwpLCA2KTsKKwkJCS8qIHVuYWxpZ25lZCBkYXRhIGFjcXVpc2l0aW9uICovCisJCQltZW1jcHkoJnRtcCwgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuSWQpLCA0KTsKKwkJCWNpLT5icmRfaWQgPSBjcHVfdG9fYmUzMih0bXApOworCQkJYnJlYWs7CisJCWNhc2UgUFJPTV9GT1JNQVRfVFlQRTI6CisJCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgKEZMRF9UWVBFMiAqKSAoaGktPm1mZ19pbmZvLnBmdDIuU2VyaWFsKSwgNik7CisJCQkvKiB1bmFsaWduZWQgZGF0YSBhY3F1aXNpdGlvbiAqLworCQkJbWVtY3B5KCZ0bXAsIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLklkKSwgNCk7CisJCQljaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIodG1wKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2ktPmJyZF9pZCA9IDA7CisJCQltZW1zZXQobmRldi0+ZGV2X2FkZHIsIDAsIDYpOworCQkJYnJlYWs7CisJCX0KIAogI2lmIDEKLSAgICAgICAgc2JlaWRfc2V0X2hkd2JpZCAoY2kpOyAgICAgIC8qIHJlcXVpcmVzIGJpZCB0byBiZSBwcmVzZXQgKi8KKwkJLyogcmVxdWlyZXMgYmlkIHRvIGJlIHByZXNldCAqLworCQlzYmVpZF9zZXRfaGR3YmlkKGNpKTsKICNlbHNlCi0gICAgICAgIHNiZWlkX3NldF9iZHR5cGUgKGNpKTsgICAgICAvKiByZXF1aXJlcyBoZHdfYmlkIHRvIGJlIHByZXNldCAqLworCQkvKiByZXF1aXJlcyBoZHdfYmlkIHRvIGJlIHByZXNldCAqLworCQlzYmVpZF9zZXRfYmR0eXBlKGNpKTsKICNlbmRpZgotCi0gICAgfQorCX0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICAgc2JlY29tX3Byb2NfYnJkX2luaXQgKGNpKTsKKwlzYmVjb21fcHJvY19icmRfaW5pdChjaSk7CiAjZW5kaWYKICNpZiBkZWZpbmVkKFNCRV9JU1JfVEFTS0xFVCkKLSAgICB0YXNrbGV0X2VuYWJsZSAoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQpOworCXRhc2tsZXRfZW5hYmxlKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0KTsKICNlbmRpZgogCi0KLSAgICBpZiAoKGVycm9yX2ZsYWcgPSBjNF9pbml0MiAoY2kpKSAhPSBTQkVfRFJWUl9TVUNDRVNTKQotICAgIHsKKwllcnJvcl9mbGFnID0gYzRfaW5pdDIoY2kpOworCWlmIChlcnJvcl9mbGFnICE9IFNCRV9EUlZSX1NVQ0NFU1MpIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgICAgICBzYmVjb21fcHJvY19icmRfY2xlYW51cCAoY2kpOworCQlzYmVjb21fcHJvY19icmRfY2xlYW51cChjaSk7CiAjZW5kaWYKLSAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYgKG5kZXYpOwotICAgICAgICBmcmVlX2lycSAoaXJxMSwgbmRldik7Ci0gICAgICAgIGZyZWVfaXJxIChpcnEwLCBuZGV2KTsKLSAgICAgICAgT1Nfa2ZyZWUgKG5ldGRldl9wcml2KG5kZXYpKTsKLSAgICAgICAgT1Nfa2ZyZWUgKG5kZXYpOwotCXJldHVybiBOVUxMOwkJLyogZmFpbHVyZSwgZXJyb3JfZmxhZyBpcyBzZXQgKi8KLSAgICB9Ci0gICAgcmV0dXJuIG5kZXY7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCQlmcmVlX2lycShpcnExLCBuZGV2KTsKKwkJZnJlZV9pcnEoaXJxMCwgbmRldik7CisJCU9TX2tmcmVlKG5ldGRldl9wcml2KG5kZXYpKTsKKwkJT1Nfa2ZyZWUobmRldik7CisJCS8qIGZhaWx1cmUsIGVycm9yX2ZsYWcgaXMgc2V0ICovCisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbmRldjsKIH0KIAogc3RhdGljIGludCAgX19pbml0Ci1jNF9tb2RfaW5pdCAodm9pZCkKK2M0X21vZF9pbml0KHZvaWQpCiB7Ci0gICAgaW50ICAgICAgICAgcnRuOworCWludCAgICAgICAgIHJ0bjsKIAotICAgIHByX3dhcm5pbmcoIiVzXG4iLCBwbWNjNF9PU1NJX3JlbGVhc2UpOwotICAgIGlmICgocnRuID0gYzRod19hdHRhY2hfYWxsICgpKSkKLSAgICAgICAgcmV0dXJuIC1ydG47ICAgICAgICAgICAgICAgIC8qIGluc3RhbGxhdGlvbiBmYWlsdXJlIC0gc2VlIHN5c3RlbSBsb2cgKi8KKwlydG4gPSBjNGh3X2F0dGFjaF9hbGwoKTsKKwlpZiAocnRuKQorCQlyZXR1cm4gLXJ0bjsgLyogaW5zdGFsbGF0aW9uIGZhaWx1cmUgLSBzZWUgc3lzdGVtIGxvZyAqLwogCi0gICAgLyogaG91c2VrZWVwaW5nIG5vdGlmaWNhdGlvbnMgKi8KLSAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCAhPSBsb2dfbGV2ZWxfZGVmYXVsdCkKLSAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8Y3h0MWUxX2xvZ19sZXZlbD4gY2hhbmdlZCBmcm9tIGRlZmF1bHQgJWQgdG8gJWQuXG4iLAotICAgICAgICAgICAgICAgIGxvZ19sZXZlbF9kZWZhdWx0LCBjeHQxZTFfbG9nX2xldmVsKTsKLSAgICAgICBpZiAoY3h0MWUxX21heF9tcnUgIT0gbWF4X21ydV9kZWZhdWx0KQotICAgICAgICAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8Y3h0MWUxX21heF9tcnU+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbXJ1X2RlZmF1bHQsIGN4dDFlMV9tYXhfbXJ1KTsKLSAgICAgICBpZiAoY3h0MWUxX21heF9tdHUgIT0gbWF4X210dV9kZWZhdWx0KQotICAgICAgICAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8Y3h0MWUxX21heF9tdHU+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbXR1X2RlZmF1bHQsIGN4dDFlMV9tYXhfbXR1KTsKLSAgICBpZiAobWF4X3J4ZGVzY191c2VkICE9IG1heF9yeGRlc2NfZGVmYXVsdCkKLSAgICB7Ci0gICAgICAgIGlmIChtYXhfcnhkZXNjX3VzZWQgPiAyMDAwKQotICAgICAgICAgICAgbWF4X3J4ZGVzY191c2VkID0gMjAwMDsgLyogb3V0LW9mLWJvdW5kcyByZXNldCAqLwotICAgICAgICBwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxtYXhfcnhkZXNjX3VzZWQ+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICBtYXhfcnhkZXNjX2RlZmF1bHQsIG1heF9yeGRlc2NfdXNlZCk7Ci0gICAgfQotICAgIGlmIChtYXhfdHhkZXNjX3VzZWQgIT0gbWF4X3R4ZGVzY19kZWZhdWx0KQotICAgIHsKLSAgICAgICAgaWYgKG1heF90eGRlc2NfdXNlZCA+IDEwMDApCi0gICAgICAgICAgICBtYXhfdHhkZXNjX3VzZWQgPSAxMDAwOyAvKiBvdXQtb2YtYm91bmRzIHJlc2V0ICovCi0gICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPG1heF90eGRlc2NfdXNlZD4gY2hhbmdlZCBmcm9tIGRlZmF1bHQgJWQgdG8gJWQuXG4iLAotICAgICAgICAgICAgICAgIG1heF90eGRlc2NfZGVmYXVsdCwgbWF4X3R4ZGVzY191c2VkKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnN0YWxsYXRpb24gc3VjY2VzcyAqLworCS8qIGhvdXNla2VlcGluZyBub3RpZmljYXRpb25zICovCisJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgIT0gbG9nX2xldmVsX2RlZmF1bHQpCisJCXByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9sb2dfbGV2ZWw+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCWxvZ19sZXZlbF9kZWZhdWx0LCBjeHQxZTFfbG9nX2xldmVsKTsKKwlpZiAoY3h0MWUxX21heF9tcnUgIT0gbWF4X21ydV9kZWZhdWx0KQorCQlwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxjeHQxZTFfbWF4X21ydT4gY2hhbmdlZCBmcm9tIGRlZmF1bHQgJWQgdG8gJWQuXG4iLAorCQkJbWF4X21ydV9kZWZhdWx0LCBjeHQxZTFfbWF4X21ydSk7CisJaWYgKGN4dDFlMV9tYXhfbXR1ICE9IG1heF9tdHVfZGVmYXVsdCkKKwkJcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8Y3h0MWUxX21heF9tdHU+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCW1heF9tdHVfZGVmYXVsdCwgY3h0MWUxX21heF9tdHUpOworCWlmIChtYXhfcnhkZXNjX3VzZWQgIT0gbWF4X3J4ZGVzY19kZWZhdWx0KSB7CisJCWlmIChtYXhfcnhkZXNjX3VzZWQgPiAyMDAwKQorCQkJbWF4X3J4ZGVzY191c2VkID0gMjAwMDsgLyogb3V0LW9mLWJvdW5kcyByZXNldCAqLworCQlwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxtYXhfcnhkZXNjX3VzZWQ+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCW1heF9yeGRlc2NfZGVmYXVsdCwgbWF4X3J4ZGVzY191c2VkKTsKKwl9CisJaWYgKG1heF90eGRlc2NfdXNlZCAhPSBtYXhfdHhkZXNjX2RlZmF1bHQpIHsKKwkJaWYgKG1heF90eGRlc2NfdXNlZCA+IDEwMDApCisJCQltYXhfdHhkZXNjX3VzZWQgPSAxMDAwOyAvKiBvdXQtb2YtYm91bmRzIHJlc2V0ICovCisJCXByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPG1heF90eGRlc2NfdXNlZD4gY2hhbmdlZCBmcm9tIGRlZmF1bHQgJWQgdG8gJWQuXG4iLAorCQkJbWF4X3R4ZGVzY19kZWZhdWx0LCBtYXhfdHhkZXNjX3VzZWQpOworCX0KKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluc3RhbGxhdGlvbiBzdWNjZXNzICovCiB9CiAKIApAQCAtMTE0MCwzMSArMTExNywyOSBAQAogICAqLwogCiBzdGF0aWMgdm9pZCBfX2V4aXQKLWNsZWFudXBfaGRsYyAodm9pZCkKK2NsZWFudXBfaGRsYyh2b2lkKQogewotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGNpX3QgICAgICAgKmNpOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotICAgIGludCAgICAgICAgIGksIGosIGs7CisJaGR3X2luZm9fdCAqaGk7CisJY2lfdCAgICAgICAqY2k7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJaW50ICAgICAgICAgaSwgaiwgazsKIAotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICBpZiAoaGktPm5kZXYpICAgICAgICAgICAgICAgLyogYSBib2FyZCBoYXMgYmVlbiBhdHRhY2hlZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjaSA9IChjaV90ICopKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2ktPm1heF9wb3J0OyBqKyspCi0gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IE1VU1lDQ19OQ0hBTlM7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuZGV2ID0gY2ktPnBvcnRbal0uY2hhbltrXS0+dXNlcikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvX2RlbHVzZXIgKG5kZXYsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQlpZiAoaGktPm5kZXYpIHsgICAgICAgICAgLyogYSBib2FyZCBoYXMgYmVlbiBhdHRhY2hlZCAqLworCQkJY2kgPSAoY2lfdCAqKShuZXRkZXZfcHJpdihoaS0+bmRldikpOworCQkJZm9yIChqID0gMDsgaiA8IGNpLT5tYXhfcG9ydDsgaisrKQorCQkJCWZvciAoayA9IDA7IGsgPCBNVVNZQ0NfTkNIQU5TOyBrKyspIHsKKwkJCQkJbmRldiA9IGNpLT5wb3J0W2pdLmNoYW5ba10tPnVzZXI7CisJCQkJCWlmIChuZGV2KQorCQkJCQkJZG9fZGVsdXNlcihuZGV2LCAwKTsKKwkJCQl9CisJCX0KKwl9CiB9CiAKIAogc3RhdGljIHZvaWQgX19leGl0Ci1jNF9tb2RfcmVtb3ZlICh2b2lkKQorYzRfbW9kX3JlbW92ZSh2b2lkKQogewogCWNsZWFudXBfaGRsYygpOyAgICAgICAgICAgIC8qIGRlbGV0ZSBhbnkgbWlzc2VkIGNoYW5uZWxzICovCiAJY2xlYW51cF9kZXZzKCk7CkBAIC0xMTczLDEzICsxMTQ4LDEzIEBACiAJcHJfaW5mbygiU0JFIC0gZHJpdmVyIHJlbW92ZWQuXG4iKTsKIH0KIAotbW9kdWxlX2luaXQgKGM0X21vZF9pbml0KTsKLW1vZHVsZV9leGl0IChjNF9tb2RfcmVtb3ZlKTsKK21vZHVsZV9pbml0KGM0X21vZF9pbml0KTsKK21vZHVsZV9leGl0KGM0X21vZF9yZW1vdmUpOwogCi1NT0RVTEVfQVVUSE9SICgiU0JFIFRlY2huaWNhbCBTZXJ2aWNlcyA8c3VwcG9ydEBzYmVpLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTiAoIndhblBDSS1DeFQxRTEgR2VuZXJpYyBIRExDIFdBTiBEcml2ZXIgbW9kdWxlIik7CitNT0RVTEVfQVVUSE9SKCJTQkUgVGVjaG5pY2FsIFNlcnZpY2VzIDxzdXBwb3J0QHNiZWkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ3YW5QQ0ktQ3hUMUUxIEdlbmVyaWMgSERMQyBXQU4gRHJpdmVyIG1vZHVsZSIpOwogI2lmZGVmIE1PRFVMRV9MSUNFTlNFCi1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogI2VuZGlmCiAKIC8qKiogIEVuZC1vZi1GaWxlICAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYwppbmRleCA3YTNhMzBjLi43YjRmNmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKQEAgLTQyLDcgKzQyLDYgQEAKIC8qIGdsb2JhbCBkcml2ZXIgdmFyaWFibGVzICovCiBleHRlcm4gY2lfdCAqYzRfbGlzdDsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7Ci1leHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogCiBleHRlcm4gaW50ICBjeHQxZTFfbWF4X21ydTsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXR1OwpAQCAtMjE3LDcgKzIxNiw4IEBACiAJbWF4X2ludGNudCA9IDA7ICAgICAgICAgICAgIC8qIHJlc2V0IGNvdW50ZXIgKi8KICAgICB9CiAKLSAgICBpZiAoIShjaCA9IHNkX2ZpbmRfY2hhbihkdW1teSwgY2hhbikpKSB7CisgICAgY2ggPSBzZF9maW5kX2NoYW4oZHVtbXksIGNoYW4pOworICAgIGlmICghY2gpIHsKIAlwcl9pbmZvKCI+PiBtdXN5Y2NfZHVtcF9yaW5nOiBjaGFubmVsICVkIG5vdCB1cC5cbiIsIGNoYW4pOwogCXJldHVybiBFTk9FTlQ7CiAgICAgfQpAQCAtMTA0NCwxNyArMTA0NCwxOSBAQAogI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKiBDT05GSUdfU0JFX1dBTjI1NlQzX05DT01NICoqKi8KIAogCSAgICB7Ci0JCWlmICgobTIgPSBPU19tZW1fdG9rZW5fYWxsb2MoY3h0MWUxX21heF9tcnUpKSkgewotCQkgICAgLyogc3Vic3RpdHV0ZSB0aGUgbWJ1ZitjbHVzdGVyICovCi0JCSAgICBtZC0+bWVtX3Rva2VuID0gbTI7Ci0JCSAgICBtZC0+ZGF0YSA9IGNwdV90b19sZTMyKE9TX3Z0b3BoeXMoT1NfbWVtX3Rva2VuX2RhdGEobTIpKSk7CisJCW0yID0gT1NfbWVtX3Rva2VuX2FsbG9jKGN4dDFlMV9tYXhfbXJ1KTsKKwkJaWYgKG0yKSB7CisJCQkvKiBzdWJzdGl0dXRlIHRoZSBtYnVmK2NsdXN0ZXIgKi8KKwkJCW1kLT5tZW1fdG9rZW4gPSBtMjsKKwkJCW1kLT5kYXRhID0gY3B1X3RvX2xlMzIoT1NfdnRvcGh5cygKKwkJCQlPU19tZW1fdG9rZW5fZGF0YShtMikpKTsKIAotCQkgICAgLyogcGFzcyB0aGUgcmVjZWl2ZWQgbWJ1ZiB1cHdhcmQgKi8KLQkJICAgIHNkX3JlY3ZfY29uc3VtZShtLCBzdGF0dXMgJiBMRU5HVEhfTUFTSywgY2gtPnVzZXIpOwotCQkgICAgY2gtPnMucnhfcGFja2V0cysrOwotCQkgICAgY2gtPnMucnhfYnl0ZXMgKz0gc3RhdHVzICYgTEVOR1RIX01BU0s7CisJCQkvKiBwYXNzIHRoZSByZWNlaXZlZCBtYnVmIHVwd2FyZCAqLworCQkJc2RfcmVjdl9jb25zdW1lKG0sIHN0YXR1cyAmIExFTkdUSF9NQVNLLCBjaC0+dXNlcik7CisJCQljaC0+cy5yeF9wYWNrZXRzKys7CisJCQljaC0+cy5yeF9ieXRlcyArPSBzdGF0dXMgJiBMRU5HVEhfTUFTSzsKIAkJfSBlbHNlCi0JCSAgICBjaC0+cy5yeF9kcm9wcGVkKys7CisJCQljaC0+cy5yeF9kcm9wcGVkKys7CiAJICAgIH0KIAl9IGVsc2UgaWYgKGVycm9yID09IEVSUl9GQ1MpCiAJICAgIGNoLT5zLnJ4X2NyY19lcnJvcnMrKzsKQEAgLTE1NDUsOCArMTU0Nyw5IEBACiAgICAgbWNoX3QgICAgICAqY2g7CiAgICAgaW50ICAgICAgICAgaSwgZ2NoYW47CiAKLSAgICBpZiAoIShjaCA9IHNkX2ZpbmRfY2hhbihkdW1teSwgY2hhbm51bSkpKQotCXJldHVybiBFSU5WQUw7CisgICAgY2ggPSBzZF9maW5kX2NoYW4oZHVtbXksIGNoYW5udW0pOworICAgIGlmICghY2gpCisJcmV0dXJuIC1FSU5WQUw7CiAgICAgcGkgPSBjaC0+dXA7CiAgICAgZ2NoYW4gPSBjaC0+Z2NoYW47CiAKQEAgLTE1ODksNiArMTU5Miw4IEBACiAjZW5kaWYKIAogCisjaWYgMAorLyogVE9ETzogZGV0ZXJtaW5lIGlmIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIG5vdCBiZSBuZWVkZWQgYW5kIGNhbiBiZSByZW1vdmVkICovCiBpbnQKIG11c3ljY19kZWxfY2hhbihjaV90ICpjaSwgaW50IGNoYW5udW0pCiB7CkBAIC0xNTk2LDcgKzE2MDEsOCBAQAogCiAgICAgaWYgKChjaGFubnVtIDwgMCkgfHwgKGNoYW5udW0gPj0gKE1VU1lDQ19OUE9SVFMgKiBNVVNZQ0NfTkNIQU5TKSkpICAvKiBzYW5pdHkgY2hrIHBhcmFtICovCiAJcmV0dXJuIEVDSFJORzsKLSAgICBpZiAoIShjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSkpKQorICAgIGNoID0gc2RfZmluZF9jaGFuKGNpLCBjaGFubnVtKTsKKyAgICBpZiAoIWNoKQogCXJldHVybiBFTk9FTlQ7CiAgICAgaWYgKGNoLT5zdGF0ZSA9PSBVUCkKIAltdXN5Y2NfY2hhbl9kb3duKGNpLCBjaGFubnVtKTsKQEAgLTE2MTIsMTIgKzE2MTgsMTQgQEAKIAogICAgIGlmIChjaGFubnVtIDwgMCB8fCBjaGFubnVtID49IChNVVNZQ0NfTlBPUlRTICogTVVTWUNDX05DSEFOUykpICAgICAgLyogc2FuaXR5IGNoayBwYXJhbSAqLwogCXJldHVybiBFQ0hSTkc7Ci0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pKSkKKyAgICBjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSk7CisgICAgaWYgKCFjaCkKIAlyZXR1cm4gRU5PRU5UOwogCiAgICAgbWVtc2V0KCZjaC0+cywgMCwgc2l6ZW9mKHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cykpOwogICAgIHJldHVybiAwOwogfQorI2VuZGlmCiAKIAogaW50CkBAIC0xNjMyLDcgKzE2NDAsOCBAQAogICAgIGludCAgICAgICAgIHR4ZF9uZWVkX2NudDsKICAgICB1X2ludDMyX3QgICBsZW47CiAKLSAgICBpZiAoIShjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSkpKQorICAgIGNoID0gc2RfZmluZF9jaGFuKGNpLCBjaGFubnVtKTsKKyAgICBpZiAoIWNoKQogCXJldHVybiAtRU5PRU5UOwogCiAgICAgaWYgKGNpLT5zdGF0ZSAhPSBDX1JVTk5JTkcpICAgICAvKiBmdWxsIGludGVycnVwdCBwcm9jZXNzaW5nIGF2YWlsYWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9vc3NpUmVsZWFzZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9vc3NpUmVsZWFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdhOTAyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvb3NzaVJlbGVhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIG9zc2lSZWxlYXNlLmMgLQotICoKLSAqIFRoaXMgc3RyaW5nIHdpbGwgYmUgZW1iZWRkZWQgaW50byB0aGUgZXhlY3V0YWJsZSBhbmQgd2lsbCB0cmFjayB0aGUKLSAqIHJlbGVhc2UuICBUaGUgZW1iZWRkZWQgc3RyaW5nIG1heSBiZSBkaXNwbGF5ZWQgdXNpbmcgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgICAgIHN0cmluZ3MgPGZpbGVuYW1lPiB8IGdyZXAgXCRSZWwKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOCAgT25lIFN0b3AgU3lzdGVtcywgSW5jLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIGNvbnRhY3QgdmlhIGVtYWlsOiBzdXBwb3J0QG9uZXN0b3BzeXN0ZW1zLmNvbQotICogT25lIFN0b3AgU3lzdGVtcywgSW5jLiAgRXNjb25kaWRvLCBDYWxpZm9ybmlhICBVLlMuQS4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotY2hhciBwbWNjNF9PU1NJX3JlbGVhc2VbXSA9ICIkUmVsZWFzZTogUE1DQzRfM18xQiwgIENvcHlyaWdodCAoYykgMjAwOCBPbmUgU3RvcCBTeXN0ZW1zJCI7Ci0KLS8qKiogIEVuZC1vZi1GaWxlICAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtYzkzeDZfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtYzkzeDZfZWVwcm9tLmMKaW5kZXggMTM3YjYzYy4uNzhjYzE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWM5M3g2X2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jOTN4Nl9lZXByb20uYwpAQCAtOTAsNyArOTAsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi1zaG9ydCAgICAgICBtZmdfdGVtcGxhdGVbc2l6ZW9mIChGTERfVFlQRTIpXSA9CitzdGF0aWMgdTggbWZnX3RlbXBsYXRlW3NpemVvZihGTERfVFlQRTIpXSA9CiB7CiAgICAgUFJPTV9GT1JNQVRfVFlQRTIsICAgICAgICAgIC8qIHR5cGU7ICovCiAgICAgMHgwMCwgMHgxQSwgICAgICAgICAgICAgICAgIC8qIGxlbmd0aFsyXTsgKi8KQEAgLTQ5MSwxMyArNDkxLDExIEBACiAgICAgUFJPTUZPUk1BVCAgYnVmZmVyOyAgICAgICAgIC8qIE1lbW9yeSBpbWFnZSBvZiBzdHJ1Y3R1cmUgKi8KICAgICB1X2ludDMyX3QgICBjcmM7ICAgICAgICAgICAgLyogQ1JDIG9mIHN0cnVjdHVyZSAqLwogICAgIHRpbWVfdCAgICAgIGNyZWF0ZVRpbWU7Ci0gICAgaW50ICAgICAgICAgaTsKIAogICAgIGNyZWF0ZVRpbWUgPSBnZXRfc2Vjb25kcyAoKTsKIAogICAgIC8qIHVzZSB0ZW1wbGF0ZSBkYXRhICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoRkxEX1RZUEUyKTsgKytpKQotICAgICAgICBidWZmZXIuYnl0ZXNbaV0gPSBtZmdfdGVtcGxhdGVbaV07CisgICAgbWVtY3B5KCZidWZmZXIuZmxkVHlwZTIsIG1mZ190ZW1wbGF0ZSwgc2l6ZW9mKGJ1ZmZlci5mbGRUeXBlMikpOwogCiAgICAgLyogVXBkYXRlIHNlcmlhbCBudW1iZXIgZmllbGQgaW4gYnVmZmVyICovCiAgICAgcG1jU2V0QnVmZlZhbHVlICgmYnVmZmVyLmZsZFR5cGUyLlNlcmlhbFszXSwgc2VyaWFsTnVtLCAzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzQuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzQuaAppbmRleCAwMDNlYjg2Li5iNGI1ZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNC5oCkBAIC05Niw3ICs5Niw2IEBACiB2b2lkICAgICAgICBzYmVpZF9zZXRfaGR3YmlkIChjaV90ICpjaSk7CiB1X2ludDMyX3QgICBzYmVDcmMgKHVfaW50OF90ICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QgKik7CiAKLXZvaWQgICAgICAgIFZNRVRST19UUkFDRSAodm9pZCAqKTsgICAgICAgLyogcHV0IGRhdGEgaW50byA4IExFRHMgKi8KIHZvaWQgICAgICAgIFZNRVRST19UUklHR0VSIChjaV90ICosIGludCk7ICAgICAgIC8qIE5vdGU6IGludCA9IDAoZGVmYXVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRocnUgMTUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKaW5kZXggYTlkOTU3NS4uNjIxYTcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCkBAIC0xMTIsMTIgKzExMiwxMiBAQAogICAgICAgICBmb3IgKHBvcnRudW0gPSAwOyBwb3J0bnVtIDwgY2ktPm1heF9wb3J0OyBwb3J0bnVtKyspCiAgICAgICAgICAgICBmb3IgKGdjaGFuID0gMDsgZ2NoYW4gPCBNVVNZQ0NfTkNIQU5TOyBnY2hhbisrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoY2ggPSBjaS0+cG9ydFtwb3J0bnVtXS5jaGFuW2djaGFuXSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNoLT5zdGF0ZSAhPSBVTkFTU0lHTkVEKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGNoLT5jaGFubnVtID09IGNoYW5udW0pKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICAgICAgICAgIH0KKwkJY2ggPSBjaS0+cG9ydFtwb3J0bnVtXS5jaGFuW2djaGFuXTsKKwkJaWYgKGNoKSB7CisJCQlpZiAoKGNoLT5zdGF0ZSAhPSBVTkFTU0lHTkVEKSAmJgorCQkJICAgKGNoLT5jaGFubnVtID09IGNoYW5udW0pKQorCQkJCXJldHVybiBjaDsKKwkJfQogICAgICAgICAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQpAQCAtNjY4LDggKzY2OCw5IEBACiAgICAgc3RhdHVzX3QgICAgcmV0OwogCiAgICAgLyogUE9SVCBQT0lOVDogdGhpcyByb3V0aW5lIGdlbmVyYXRlcyBmaXJzdCBpbnRlcnJ1cHQgKi8KLSAgICBpZiAoKHJldCA9IG11c3ljY19pbml0IChjaSkpICE9IFNCRV9EUlZSX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiByZXQ7CisJcmV0ID0gbXVzeWNjX2luaXQoY2kpOworCWlmIChyZXQgIT0gU0JFX0RSVlJfU1VDQ0VTUykKKwkJcmV0dXJuIHJldDsKIAogI2lmIDAKICAgICBjaS0+cC5mcmFtaW5nX3R5cGUgPSBGUkFNSU5HX0NCUDsKQEAgLTc1Niw3ICs3NTcsNyBAQAogICAgIHZvbGF0aWxlIHVfaW50MzJfdCBkYXRhOwogCiAgICAgaWYgKHBwLT5wb3J0bnVtID49IGNpLT5tYXhfcG9ydCkvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogCiAgICAgY29tZXQgPSBjaS0+cG9ydFtwcC0+cG9ydG51bV0uY29tZXRiYXNlOwogICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSBjb21ldCArIHBwLT5wb3J0X21vZGUpICYgMHhmZjsKQEAgLTg0NSw3ICs4NDYsNyBAQAogICAgICAqLwogICAgIHBvcnRudW0gPSAobWNwLT5vZmZzZXQgJSAweDYwMDApIC8gMHg4MDA7CiAgICAgaWYgKHBvcnRudW0gPj0gY2ktPm1heF9wb3J0KQotICAgICAgICByZXR1cm4gRU5YSU87CisgICAgICAgIHJldHVybiAtRU5YSU87CiAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07CiAgICAgaWYgKG1jcC0+b2Zmc2V0ID49IDB4NjAwMCkKICAgICAgICAgb2Zmc2V0ICs9IDB4NjAwMDsgICAgICAgICAgIC8qIHB1dCBiYWNrIGluIE1zZ0NmZ0Rlc2MgYWRkcmVzcyBvZmZzZXQgKi8KQEAgLTg5NCw3ICs4OTUsNyBAQAogYzRfZ2V0X3BvcnQgKGNpX3QgKmNpLCBpbnQgcG9ydG51bSkKIHsKICAgICBpZiAocG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpICAgIC8qIHNhbml0eSBjaGVjayAqLwotICAgICAgICByZXR1cm4gRU5YSU87CisgICAgICAgIHJldHVybiAtRU5YSU87CiAKICAgICBTRF9TRU1fVEFLRSAoJmNpLT5zZW1fd2RidXN5LCAiX3dkXyIpOyAgICAgIC8qIG9ubHkgMSB0aHJ1IGhlcmUsIHBlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYm9hcmQgKi8KQEAgLTkxNSw3ICs5MTYsNyBAQAogICAgIGludCAgICAgICAgIGk7CiAKICAgICBpZiAocG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpICAgIC8qIHNhbml0eSBjaGVjayAqLwotICAgICAgICByZXR1cm4gRU5YSU87CisgICAgICAgIHJldHVybiAtRU5YSU87CiAKICAgICBwaSA9ICZjaS0+cG9ydFtwb3J0bnVtXTsKICAgICBwcCA9ICZjaS0+cG9ydFtwb3J0bnVtXS5wOwpAQCAtOTI3LDE1ICs5MjgsMTUgQEAKICAgICAgICAgICAgICAgICBwb3J0bnVtLCBlMW1vZGUsIHBpLT5vcGVuY2hhbnMpOwogICAgIH0KICAgICBpZiAocGktPm9wZW5jaGFucykKLSAgICAgICAgcmV0dXJuIEVCVVNZOyAgICAgICAgICAgICAgIC8qIGdyb3VwIG5lZWRzIGluaXRpYWxpemF0aW9uIG9ubHkgZm9yCisgICAgICAgIHJldHVybiAtRUJVU1k7ICAgICAgICAgICAgICAgLyogZ3JvdXAgbmVlZHMgaW5pdGlhbGl6YXRpb24gb25seSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGNoYW5uZWwgb2YgYSBncm91cCAqLwogCiAgICAgewogICAgICAgICBzdGF0dXNfdCAgICByZXQ7CiAKLSAgICAgICAgaWYgKChyZXQgPSBjNF93cV9wb3J0X2luaXQgKHBpKSkpICAgICAgIC8qIGNyZWF0ZS9pbml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3b3JrcXVldWVfc3RydWN0ICovCi0gICAgICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IGM0X3dxX3BvcnRfaW5pdChwaSk7CisJaWYgKHJldCkgICAgICAgLyogY3JlYXRlL2luaXQgd29ya3F1ZXVlX3N0cnVjdCAqLworCQlyZXR1cm4gcmV0OwogICAgIH0KIAogICAgIGluaXRfY29tZXQgKGNpLCBwaS0+Y29tZXRiYXNlLCBwcC0+cG9ydF9tb2RlLCAxIC8qIGNsb2NrbWFzdGVyID09IHRydWUgKi8gLCBwcC0+cG9ydFApOwpAQCAtMTAxOCwxMCArMTAxOSwxMCBAQAogICAgIGludCAgICAgICAgIGdjaGFuOwogCiAgICAgaWYgKGM0X2ZpbmRfY2hhbiAoY2hhbm51bSkpICAgICAvKiBhIG5ldyBjaGFubmVsIHNob3VsZG4ndCBhbHJlYWR5IGV4aXN0ICovCi0gICAgICAgIHJldHVybiBFRVhJU1Q7CisgICAgICAgIHJldHVybiAtRUVYSVNUOwogCiAgICAgaWYgKHBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogCiAgICAgcGkgPSAmKGNpLT5wb3J0W3BvcnRudW1dKTsKICAgICAvKiBmaW5kIGFueSBhdmFpbGFibGUgY2hhbm5lbCB3aXRoaW4gdGhpcyBwb3J0ICovCkBAIC0xMDMyLDcgKzEwMzMsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChnY2hhbiA9PSBNVVNZQ0NfTkNIQU5TKSAgICAgLyogZXhoYXVzdGVkIHRhYmxlLCBhbGwgd2VyZSBhc3NpZ25lZCAqLwotICAgICAgICByZXR1cm4gRU5GSUxFOworICAgICAgICByZXR1cm4gLUVORklMRTsKIAogICAgIGNoLT51cCA9IHBpOwogCkBAIC0xMDU1LDggKzEwNTYsOSBAQAogICAgIHsKICAgICAgICAgc3RhdHVzX3QgICAgcmV0OwogCi0gICAgICAgIGlmICgocmV0ID0gYzRfd2tfY2hhbl9pbml0IChwaSwgY2gpKSkKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisJcmV0ID0gYzRfd2tfY2hhbl9pbml0KHBpLCBjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKICAgICB9CiAKICAgICAvKiBzYXZlIG9mZiBpbnRlcmZhY2UgYXNzaWdubWVudHMgd2hpY2ggYm91bmQgYSBib2FyZCAqLwpAQCAtMTA3OSw4ICsxMDgxLDEwIEBACiB7CiAgICAgbWNoX3QgICAgICAqY2g7CiAKLSAgICBpZiAoIShjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmICghY2gpCisJCXJldHVybiAtRU5PRU5UOworCiAgICAgaWYgKGNoLT5zdGF0ZSA9PSBVUCkKICAgICAgICAgbXVzeWNjX2NoYW5fZG93biAoKGNpX3QgKikgMCwgY2hhbm51bSk7CiAgICAgY2gtPnN0YXRlID0gVU5BU1NJR05FRDsKQEAgLTEwOTUsOCArMTA5OSw5IEBACiB7CiAgICAgbWNoX3QgICAgICAqY2g7CiAKLSAgICBpZiAoIShjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmICghY2gpCisJCXJldHVybiAtRU5PRU5UOwogCiAgICAgbWVtc2V0ICgmY2gtPnMsIDAsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9jaGFuX3N0YXRzKSk7CiAgICAgcmV0dXJuIDA7CkBAIC0xMTA5LDE5ICsxMTE0LDIwIEBACiAgICAgbWNoX3QgICAgICAqY2g7CiAgICAgaW50ICAgICAgICAgaSwgeCA9IDA7CiAKLSAgICBpZiAoIShjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmICghY2gpCisJCXJldHVybiAtRU5PRU5UOwogCiAjaWYgMQogICAgIGlmIChjaC0+cC5jYXJkICE9IHAtPmNhcmQgfHwKICAgICAgICAgY2gtPnAucG9ydCAhPSBwLT5wb3J0IHx8CiAgICAgICAgIGNoLT5wLmNoYW5udW0gIT0gcC0+Y2hhbm51bSkKLSAgICAgICAgcmV0dXJuIEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAogICAgIGlmICghKGNoLT51cC0+Z3JvdXBfaXNfc2V0KSkKICAgICB7Ci0gICAgICAgIHJldHVybiBFSU87ICAgICAgICAgICAgICAgICAvKiBvdXQgb2Ygb3JkZXIsIFNFVF9QT1JUIGNvbW1hbmQKKyAgICAgICAgcmV0dXJuIC1FSU87ICAgICAgICAgICAgICAgICAvKiBvdXQgb2Ygb3JkZXIsIFNFVF9QT1JUIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlcXVpcmVkIHByaW9yIHRvIGZpcnN0IGdyb3VwJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNFVF9DSEFOIGNvbW1hbmQgKi8KICAgICB9CkBAIC0xMTQzLDEwICsxMTQ5LDEyIEBACiAgICAgewogICAgICAgICBzdGF0dXNfdCAgICByZXQ7CiAKLSAgICAgICAgaWYgKChyZXQgPSBtdXN5Y2NfY2hhbl9kb3duICgoY2lfdCAqKSAwLCBjaGFubnVtKSkpCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBpZiAoKHJldCA9IGM0X2NoYW5fdXAgKGNoLT51cC0+dXAsIGNoYW5udW0pKSkKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisJcmV0ID0gbXVzeWNjX2NoYW5fZG93bigoY2lfdCAqKTAsIGNoYW5udW0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gYzRfY2hhbl91cChjaC0+dXAtPnVwLCBjaGFubnVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogICAgICAgICBzZF9lbmFibGVfeG1pdCAoY2gtPnVzZXIpOyAgLyogcmUtZW5hYmxlIHRvIGNhdGNoIGZsb3cgY29udHJvbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbCAqLwogICAgIH0KQEAgLTExNTksOCArMTE2NywxMCBAQAogewogICAgIG1jaF90ICAgICAgKmNoOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogICAgICpwID0gY2gtPnA7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMTcwLDggKzExODAsMTAgQEAKIHsKICAgICBtY2hfdCAgICAgICpjaDsKIAotICAgIGlmICghKGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKSkpCi0gICAgICAgIHJldHVybiBFTk9FTlQ7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKICAgICAqcCA9IGNoLT5zOwogICAgIHAtPnR4X3BlbmRpbmcgPSBhdG9taWNfcmVhZCAoJmNoLT50eF9wZW5kaW5nKTsKICAgICByZXR1cm4gMDsKQEAgLTEyNDAsOCArMTI1MiwxMCBAQAogICAgIHVfaW50MzJfdCAgIHRtcDsgICAgICAgICAgICAvKiBmb3Igb3B0aW1pemluZyBjb252ZXJzaW9uIGFjcm9zcyBCRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwbGF0Zm9ybSAqLwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogICAgIGlmIChjaC0+c3RhdGUgPT0gVVApCiAgICAgewogICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKQEAgLTEyNjQsNyArMTI3OCw3IEBACiAgICAgICAgICAgICAgICAgcHJfaW5mbygiKyBhc2s0ICV4LCBjdXJyZW50bHkgJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+cC5iaXRtYXNrW2ldLCBwaS0+dHNtW2ldKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBFSU5WQUw7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgICAgICAgaWYgKGNoLT5wLmJpdG1hc2tbaV0gJiAoMSA8PCBqKSkKQEAgLTEyNzcsNyArMTI5MSw3IEBACiAgICAgICAgIC8qIGlmKCBjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKSAgKi8KICAgICAgICAgcHJfaW5mbygiJXM6IGM0X2NoYW5fdXBbJWRdIEVOT0JVRlMgKG5vIFRpbWVTbG90cyBhc3NpZ25lZClcbiIsCiAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoYW5udW0pOwotICAgICAgICByZXR1cm4gRU5PQlVGUzsgICAgICAgICAgICAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworICAgICAgICByZXR1cm4gLUVOT0JVRlM7ICAgICAgICAgICAgIC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KICAgICB9CiAgICAgYWRkciA9IGM0X2ZpZm9fYWxsb2MgKHBpLCBnY2hhbiwgJm5idWYpOwogICAgIGNoLT5zdGF0ZSA9IFVQOwpAQCAtMTM3MiwxMiArMTM4NiwxMyBAQAogICAgICAgICB9CiAgICAgICAgIG1kLT5uZXh0ID0gY3B1X3RvX2xlMzIgKE9TX3Z0b3BoeXMgKG1kLT5zbmV4dCkpOwogCi0gICAgICAgICAgICAgICBpZiAoIShtID0gT1NfbWVtX3Rva2VuX2FsbG9jIChjeHQxZTFfbWF4X21ydSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKLSAgICAgICAgICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gLSB0b2tlbiBhbGxvYyBmYWlsdXJlLCBzaXplID0gJWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY2hhbm51bSwgY3h0MWUxX21heF9tcnUpOwotICAgICAgICAgICAgZ290byBlcnJmcmVlOworCW0gPSBPU19tZW1fdG9rZW5fYWxsb2MoY3h0MWUxX21heF9tcnUpOworCWlmICghbSkgeworCQlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKwkJCXByX2luZm8oCisJCQkiJXM6IGM0X2NoYW5fdXBbJWRdIC0gdG9rZW4gYWxsb2MgZmFpbHVyZSwgc2l6ZSA9ICVkLlxuIiwKKwkJCWNpLT5kZXZuYW1lLCBjaGFubnVtLCBjeHQxZTFfbWF4X21ydSk7CisJCWdvdG8gZXJyZnJlZTsKICAgICAgICAgfQogICAgICAgICBtZC0+bWVtX3Rva2VuID0gbTsKICAgICAgICAgbWQtPmRhdGEgPSBjcHVfdG9fbGUzMiAoT1NfdnRvcGh5cyAoT1NfbWVtX3Rva2VuX2RhdGEgKG0pKSk7CkBAIC0xNDU0LDcgKzE0NjksNyBAQAogICAgIGNoLT5tZHIgPSBOVUxMOwogICAgIGNoLT5yeGRfbnVtID0gMDsKICAgICBjaC0+c3RhdGUgPSBET1dOOwotICAgIHJldHVybiBFTk9CVUZTOworICAgIHJldHVybiAtRU5PQlVGUzsKIH0KIAogLyogc3RvcCB0aGUgaGFyZHdhcmUgZnJvbSBzZXJ2aWNpbmcgJiBpbnRlcnJ1cHRpbmcgKi8KQEAgLTE1MzMsOCArMTU0OCw5IEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKICAgICBjaGFyICAgICAgICpucDsKIAotICAgIGlmICghKGRldiA9IGdldHVzZXJieWNoYW4gKGlpcC0+Y2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOworCWRldiA9IGdldHVzZXJieWNoYW4oaWlwLT5jaGFubnVtKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKICAgICBucCA9IGRldi0+bmFtZTsKICAgICBzdHJuY3B5IChpaXAtPmluYW1lLCBucCwgQ0hOTV9TVFJMRU4gLSAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9wcml2YXRlLmgKaW5kZXggN2VkYmQ0ZS4uZWIyOGYwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9wcml2YXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9wcml2YXRlLmgKQEAgLTIxMyw3ICsyMTMsNiBAQAogICAgIHN0cnVjdCBzYmVfY2FyZF9pbmZvICpuZXh0OwogICAgIHVfaW50MzJfdCAgKmVlcHJvbWJhc2U7ICAgICAvKiBtYXBwZWQgYWRkcmVzcyBvZiBib2FyZCdzIEVFUFJPTSAqLwogICAgIGM0Y3BsZF90ICAgKmNwbGRiYXNlOyAgICAgICAvKiBtYXBwZWQgYWRkcmVzcyBvZiBib2FyZCdzIENQTEQgaGFyZHdhcmUgKi8KLSAgICBjaGFyICAgICAgICpyZWxlYXNlOyAgICAgICAgLyogU0JFIElEIHN0cmluZyB3L2luIHNiZVJlbGVhc2UuYyAqLwogICAgIHZvaWQgICAgICAgKmhkd19pbmZvOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXJfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9zeXNkZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfc3lzZGVwLmgKaW5kZXggNjk3ZjE5NC4uMjkxNmMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9zeXNkZXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X3N5c2RlcC5oCkBAIC02MCwzICs2MCw0IEBACiBpbnQgICAgICAgICBzZF9xdWV1ZV9zdG9wcGVkICh2b2lkICp1c2VyKTsKIAogI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqIF9JTkNfUE1DQzRfU1lTREVQX0hfICoqKi8KK2V4dGVybiBpbnQgIGN4dDFlMV9sb2dfbGV2ZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlcHJvYy5jCmluZGV4IDM1M2MwMDEuLjg0MGM2NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlcHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlcHJvYy5jCkBAIC03Miw3ICs3Miw4IEBACiAJY2hhciAgICAgICAqc3BkOwogCXN0cnVjdCBzYmVfYnJkX2luZm8gKmJpcDsKIAotCWlmICghKGJpcCA9IE9TX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYmVfYnJkX2luZm8pKSkpCisJYmlwID0gT1Nfa21hbGxvYyhzaXplb2Yoc3RydWN0IHNiZV9icmRfaW5mbykpOworCWlmICghYmlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXByX2RldmVsKCI+PiBzYmVjb21fcHJvY19nZXRfc2JlX2luZm86IGVudGVyZWRcbiIpOwpAQCAtMTUwLDcgKzE1MSw2IEBACiAJCWJyZWFrOwogCX0KIAlzZXFfcHJpbnRmKG0sICJQQ0kgQnVzIFNwZWVkOiAlc1xuIiwgc3BkKTsKLQlzZXFfcHJpbnRmKG0sICJSZWxlYXNlOiAgICAgICAlc1xuIiwgY2ktPnJlbGVhc2UpOwogCiAjaWZkZWYgU0JFX1BNQ0M0X0VOQUJMRQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvTWFrZWZpbGUKaW5kZXggM2FiZThkMi4uMDA2M2QwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvTWFrZWZpbGUKQEAgLTEsNyArMSBAQAogb2JqLSQoQ09ORklHX0RHQVApICs9IGRnYXAubwotCi0KLWRnYXAtb2JqcyA6PQlkZ2FwX2RyaXZlci5vICAgZGdhcF9mZXA1Lm8gXAotCQlkZ2FwX3BhcnNlLm8JZGdhcF90cmFjZS5vIFwKLQkJZGdhcF90dHkubwlkZ2FwX3N5c2ZzLm8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmMzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmMKQEAgLTAsMCArMSw3Njc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCisgKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCisgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCisgKgorICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCisgKglMaW51eCBLZXJuZWwgc291cmNlcy4KKyAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCisgKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KKyAqCisgKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCisgKglUaGFuayB5b3UuCisgKgorICovCisKKy8qCisgKiAgICAgIEluIHRoZSBvcmlnaW5hbCBvdXQgb2Yga2VybmVsIERpZ2kgZGdhcCBkcml2ZXIsIGZpcm13YXJlCisgKiAgICAgIGxvYWRpbmcgd2FzIGRvbmUgdmlhIHVzZXIgbGFuZCB0byBkcml2ZXIgaGFuZHNoYWtpbmcuCisgKgorICogICAgICBGb3IgY2FyZHMgdGhhdCBzdXBwb3J0IGEgY29uY2VudHJhdG9yIChwb3J0IGV4cGFuZGVyKSwKKyAqICAgICAgSSBiZWxpZXZlIHRoZSBjb25jZW50cmF0b3IgaXRzIHNlbGYgdG9sZCB0aGUgY2FyZCB3aGljaAorICogICAgICBjb25jZW50cmF0b3IgaXMgYWN0dWFsbHkgYXR0YWNoZWQgYW5kIHRoZW4gdGhhdCBpbmZvCisgKiAgICAgIHdhcyB1c2VkIHRvIHRlbGwgdXNlciBsYW5kIHdoaWNoIGNvbmNlbnRyYXRvciBmaXJtd2FyZQorICogICAgICBpbWFnZSB3YXMgdG8gYmUgZG93bmxvYWRlZC4gSSB0aGluayBldmVuIHRoZSBCSU9TIG9yCisgKiAgICAgIEZFUCBpbWFnZXMgcmVxdWlyZWQgY291bGQgY2hhbmdlIHdpdGggdGhlIGNvbm5lY3Rpb24KKyAqICAgICAgb2YgYSBwYXJ0aWN1bGFyIGNvbmNlbnRyYXRvci4KKyAqCisgKiAgICAgIFNpbmNlIEkgaGF2ZSBubyBhY2Nlc3MgdG8gYW55IG9mIHRoZXNlIGNhcmRzIG9yCisgKiAgICAgIGNvbmNlbnRyYXRvcnMsIEkgY2Fubm90IHB1dCB0aGUgY29ycmVjdCBjb25jZW50cmF0b3IKKyAqICAgICAgZmlybXdhcmUgZmlsZSBuYW1lcyBpbnRvIHRoZSBmaXJtd2FyZV9pbmZvIHN0cnVjdHVyZQorICogICAgICBhcyBpcyBub3cgZG9uZSBmb3IgdGhlIEJJT1MgYW5kIEZFUCBpbWFnZXMuCisgKgorICogICAgICBJIHRoaW5rLCBidXQgYW0gbm90IGNlcnRhaW4sIHRoYXQgdGhlIGNhcmRzIHN1cHBvcnRpbmcKKyAqICAgICAgY29uY2VudHJhdG9ycyB3aWxsIGZ1bmN0aW9uIHdpdGhvdXQgdGhlbS4gU28gc3VwcG9ydAorICogICAgICBvZiB0aGVzZSBjYXJkcyBoYXMgYmVlbiBsZWZ0IGluIHRoaXMgZHJpdmVyLgorICoKKyAqICAgICAgSW4gb3JkZXIgdG8gZnVsbHkgc3VwcG9ydCB0aG9zZSBjYXJkcywgdGhleSB3b3VsZAorICogICAgICBlaXRoZXIgaGF2ZSB0byBiZSBhY3F1aXJlZCBmb3IgZGlzc2VjdGlvbiBvciBtYXliZQorICogICAgICBEaWdpIEludGVybmF0aW9uYWwgY291bGQgcHJvdmlkZSBzb21lIGFzc2lzdGFuY2UuCisgKi8KKyN1bmRlZiBESUdJX0NPTkNFTlRSQVRPUlNfU1VQUE9SVEVECisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBGb3IgdWRlbGF5ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrbGV0IGFuZCBpbnRlcnJ1cHQgc3RydWN0cy9kZWZpbmVzICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogRm9yIHJlYWRbYndsXS93cml0ZVtid2xdICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAiZGdhcC5oIgorCisjZGVmaW5lIGluaXRfTVVURVgoc2VtKSAgICAgICAgIHNlbWFfaW5pdChzZW0sIDEpCisjZGVmaW5lIERFQ0xBUkVfTVVURVgobmFtZSkgICAgIFwKKwlzdHJ1Y3Qgc2VtYXBob3JlIG5hbWUgPSBfX1NFTUFQSE9SRV9JTklUSUFMSVpFUihuYW1lLCAxKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEaWdpIEludGVybmF0aW9uYWwsIGh0dHA6Ly93d3cuZGlnaS5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgRGlnaSBJbnRlcm5hdGlvbmFsIEVQQ0EgUENJIGJhc2VkIHByb2R1Y3QgbGluZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoImRnYXAiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHJvdG9zIGZvciB0aGlzIGZpbGUKKyAqCisgKi8KKworc3RhdGljIGludCBkZ2FwX3N0YXJ0KHZvaWQpOworc3RhdGljIHZvaWQgZGdhcF9pbml0X2dsb2JhbHModm9pZCk7CitzdGF0aWMgaW50IGRnYXBfZm91bmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCk7CitzdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgdm9pZCBkZ2FwX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSk7CitzdGF0aWMgaW50IGRnYXBfaW5pdF9wY2kodm9pZCk7CitzdGF0aWMgaW50IGRnYXBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIGludCBkZ2FwX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGNhcmRfdHlwZSk7CitzdGF0aWMgaW50IGRnYXBfZG9fcmVtYXAoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgZGdhcF9pbnRyKGludCBpcnEsIHZvaWQgKnZvaWRicmQpOworCisvKiBPdXIgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgZGdhcF9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJc3RydWN0IGNoYW5uZWxfdCAqY2gpOworc3RhdGljIGludCBkZ2FwX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3QgZGlnaV90IF9fdXNlciAqcmV0aW5mbyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGRpZ2lfdCBfX3VzZXIgKm5ld19pbmZvKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgZGdhcF90dHlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgZGdhcF90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgZGdhcF90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBkZ2FwX3dhaXRfZm9yX2RyYWluKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLAorCQkJCXVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKTsKK3N0YXRpYyBpbnQgZGdhcF9nZXRfbW9kZW1faW5mbyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwKKwkJCQl1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJaW50IF9fdXNlciAqbmV3X2luZm8pOworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCWludCBfX3VzZXIgKnJldGluZm8pOworc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHNldCwKKwkJCQl1bnNpZ25lZCBpbnQgY2xlYXIpOworc3RhdGljIGludCBkZ2FwX3R0eV9zZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBtc2VjKTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQlpbnQgY291bnQpOworc3RhdGljIHZvaWQgZGdhcF90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CisKK3N0YXRpYyBpbnQgZGdhcF90dHlfcmVnaXN0ZXIoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2luaXQoc3RydWN0IGJvYXJkX3QgKik7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKik7CitzdGF0aWMgdm9pZCBkZ2FwX2NhcnJpZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpOworc3RhdGljIHZvaWQgZGdhcF9pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7CisKKy8qCisgKiBPdXIgZnVuY3Rpb24gcHJvdG90eXBlcyBmcm9tIGRnYXBfZmVwNQorICovCitzdGF0aWMgdm9pZCBkZ2FwX2NtZHdfZXh0KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1MTYgY21kLCB1MTYgd29yZCwgdWludCBuY21kcyk7CitzdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKTsKKworc3RhdGljIHZvaWQgZGdhcF9wb2xsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGRnYXBfY21kYihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1Y2hhciBieXRlMSwKKwkJCXVjaGFyIGJ5dGUyLCB1aW50IG5jbWRzKTsKK3N0YXRpYyB2b2lkIGRnYXBfY21kdyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1MTYgd29yZCwgdWludCBuY21kcyk7CitzdGF0aWMgdm9pZCBkZ2FwX3dtb3ZlKHN0cnVjdCBjaGFubmVsX3QgKmNoLCBjaGFyICpidWYsIHVpbnQgY250KTsKK3N0YXRpYyBpbnQgZGdhcF9wYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfcGFyaXR5X3NjYW4oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgKmNidWYsCisJCQkJdW5zaWduZWQgY2hhciAqZmJ1ZiwgaW50ICpsZW4pOworc3RhdGljIHVpbnQgZGdhcF9nZXRfY3VzdG9tX2JhdWQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOworc3RhdGljIHZvaWQgZGdhcF9maXJtd2FyZV9yZXNldF9wb3J0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZnJvbSBkZ2FwX3BhcnNlLmMuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9nZXR0b2soY2hhciAqKmluLCBzdHJ1Y3QgY25vZGUgKnApOworc3RhdGljIGNoYXIgKmRnYXBfZ2V0d29yZChjaGFyICoqaW4pOworc3RhdGljIGNoYXIgKmRnYXBfc2F2ZXN0cmluZyhjaGFyICpzKTsKK3N0YXRpYyBzdHJ1Y3QgY25vZGUgKmRnYXBfbmV3bm9kZShpbnQgdCk7CitzdGF0aWMgaW50IGRnYXBfY2hlY2tub2RlKHN0cnVjdCBjbm9kZSAqcCk7CitzdGF0aWMgdm9pZCBkZ2FwX2VycihjaGFyICpzKTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZnJvbSBkZ2FwX3N5c2ZzLmgKKyAqLworc3RydWN0IGJvYXJkX3Q7CitzdHJ1Y3QgY2hhbm5lbF90Oworc3RydWN0IHVuX3Q7CitzdHJ1Y3QgcGNpX2RyaXZlcjsKK3N0cnVjdCBjbGFzc19kZXZpY2U7CisKK3N0YXRpYyB2b2lkIGRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCk7CitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOworCitzdGF0aWMgaW50IGRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcyhzdHJ1Y3QgcGNpX2RyaXZlciAqKTsKK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX2RyaXZlcl9zeXNmaWxlcyhzdHJ1Y3QgcGNpX2RyaXZlciAqKTsKKworc3RhdGljIHZvaWQgZGdhcF9jcmVhdGVfdHR5X3N5c2ZzKHN0cnVjdCB1bl90ICp1biwgc3RydWN0IGRldmljZSAqYyk7CitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV90dHlfc3lzZnMoc3RydWN0IGRldmljZSAqYyk7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gZGdhcF9wYXJzZS5oCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9wYXJzZWZpbGUoY2hhciAqKmluLCBpbnQgUmVtb3ZlKTsKK3N0YXRpYyBzdHJ1Y3QgY25vZGUgKmRnYXBfZmluZF9jb25maWcoaW50IHR5cGUsIGludCBidXMsIGludCBzbG90KTsKK3N0YXRpYyB1aW50IGRnYXBfY29uZmlnX2dldF9udW1fcHJ0cyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOworc3RhdGljIGNoYXIgKmRnYXBfY3JlYXRlX2NvbmZpZ19zdHJpbmcoc3RydWN0IGJvYXJkX3QgKmJkLCBjaGFyICpzdHJpbmcpOworc3RhdGljIHVpbnQgZGdhcF9jb25maWdfZ2V0X3VzZWludHIoc3RydWN0IGJvYXJkX3QgKmJkKTsKK3N0YXRpYyB1aW50IGRnYXBfY29uZmlnX2dldF9hbHRwaW4oc3RydWN0IGJvYXJkX3QgKmJkKTsKKworc3RhdGljIGludCBkZ2FwX21zX3NsZWVwKHVsb25nIG1zKTsKK3N0YXRpYyB2b2lkIGRnYXBfZG9fYmlvc19sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IHVjaGFyICp1YmlvcywgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkZ2FwX2RvX2ZlcF9sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IHVjaGFyICp1ZmVwLCBpbnQgbGVuKTsKKyNpZmRlZiBESUdJX0NPTkNFTlRSQVRPUlNfU1VQUE9SVEVECitzdGF0aWMgdm9pZCBkZ2FwX2RvX2NvbmNfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciAqdWFkZHIsIGludCBsZW4pOworI2VuZGlmCitzdGF0aWMgaW50IGRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZChpbnQgYm9hcmQpOworc3RhdGljIGludCBkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoc3RydWN0IGJvYXJkX3QgKmJyZCk7CisKK3N0YXRpYyB2b2lkIGRnYXBfZ2V0X3ZwZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKK3N0YXRpYyB2b2lkIGRnYXBfZG9fcmVzZXRfYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgaW50IGRnYXBfZG9fd2FpdF9mb3JfYmlvcyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKK3N0YXRpYyBpbnQgZGdhcF9kb193YWl0X2Zvcl9mZXAoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3JlZ2lzdGVyX3BvcnRzKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX2Zpcm13YXJlX2xvYWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpOworCisvKiBEcml2ZXIgdW5sb2FkIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfbW9kdWxlKHZvaWQpOworCittb2R1bGVfZXhpdChkZ2FwX2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIEZpbGUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gQ29udHJvbC9NYW5hZ2VtZW50IG1ham9yLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBEZ2FwQm9hcmRGb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworLyoKKyAqIEdsb2JhbHMKKyAqLworc3RhdGljIHVpbnQgZGdhcF9OdW1Cb2FyZHM7CitzdGF0aWMgc3RydWN0IGJvYXJkX3QgKmRnYXBfQm9hcmRbTUFYQk9BUkRTXTsKK3N0YXRpYyB1bG9uZyBkZ2FwX3BvbGxfY291bnRlcjsKK3N0YXRpYyBjaGFyICpkZ2FwX2NvbmZpZ19idWY7CitzdGF0aWMgaW50IGRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX0lOSVRJQUxJWkVEOworREVGSU5FX1NQSU5MT0NLKGRnYXBfZGxfbG9jayk7CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgZGdhcF9kbF93YWl0Oworc3RhdGljIGludCBkZ2FwX2RsX2FjdGlvbjsKK3N0YXRpYyBpbnQgZGdhcF9wb2xsX3RpY2sgPSAyMDsJLyogUG9sbCBpbnRlcnZhbCAtIDIwIG1zICovCisKKy8qCisgKiBTdGF0aWMgdmFycy4KKyAqLworc3RhdGljIHN0cnVjdCBjbGFzcyAqZGdhcF9jbGFzczsKKworc3RhdGljIHN0cnVjdCBib2FyZF90ICpkZ2FwX0JvYXJkc0J5TWFqb3JbMjU2XTsKK3N0YXRpYyB1aW50IGRnYXBfY291bnQgPSA1MDA7CisKKy8qCisgKiBQb2xsZXIgc3R1ZmYKKyAqLworREVGSU5FX1NQSU5MT0NLKGRnYXBfcG9sbF9sb2NrKTsJLyogUG9sbCBzY2hlZHVsaW5nIGxvY2sgKi8KK3N0YXRpYyB1bG9uZyBkZ2FwX3BvbGxfdGltZTsJCS8qIFRpbWUgb2YgbmV4dCBwb2xsICovCitzdGF0aWMgdWludCBkZ2FwX3BvbGxfc3RvcDsJCS8qIFVzZWQgdG8gdGVsbCBwb2xsZXIgdG8gc3RvcCAqLworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRnYXBfcG9sbF90aW1lcjsKKworLyoKKyAgICAgU1VQUE9SVEVEIFBST0RVQ1RTCisKKyAgICAgQ2FyZCBNb2RlbCAgICAgICAgICAgICAgIE51bWJlciBvZiBQb3J0cyAgICAgIEludGVyZmFjZQorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEFjY2VsZXBvcnQgWGVtICAgICAgICAgICA0IC0gNjQgICAgICAgICAgICAgIChFSUEyMzIgJiBFSUE0MjIpCisgICAgIEFjY2VsZXBvcnQgWHIgICAgICAgICAgICA0ICYgOCAgICAgICAgICAgICAgIChFSUEyMzIpCisgICAgIEFjY2VsZXBvcnQgWHIgOTIwICAgICAgICA0ICYgOCAgICAgICAgICAgICAgIChFSUEyMzIpCisgICAgIEFjY2VsZXBvcnQgQy9YICAgICAgICAgICA4IC0gMTI4ICAgICAgICAgICAgIChFSUEyMzIpCisgICAgIEFjY2VsZXBvcnQgRVBDL1ggICAgICAgICA4IC0gMjI0ICAgICAgICAgICAgIChFSUEyMzIpCisgICAgIEFjY2VsZXBvcnQgWHIvNDIyICAgICAgICA0ICYgOCAgICAgICAgICAgICAgIChFSUE0MjIpCisgICAgIEFjY2VsZXBvcnQgMnIvOTIwICAgICAgICAyICAgICAgICAgICAgICAgICAgIChFSUEyMzIpCisgICAgIEFjY2VsZXBvcnQgNHIvOTIwICAgICAgICA0ICAgICAgICAgICAgICAgICAgIChFSUEyMzIpCisgICAgIEFjY2VsZXBvcnQgOHIvOTIwICAgICAgICA4ICAgICAgICAgICAgICAgICAgIChFSUEyMzIpCisKKyAgICAgSUJNIDgtUG9ydCBBc3luY2hyb25vdXMgUENJIEFkYXB0ZXIgICAgICAgICAgKEVJQTIzMikKKyAgICAgSUJNIDEyOC1Qb3J0IEFzeW5jaHJvbm91cyBQQ0kgQWRhcHRlciAgICAgICAgKEVJQTIzMiAmIEVJQTQyMikKKyovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZ2FwX3BjaV90YmxbXSA9IHsKKwl7IERJR0lfVklELCBQQ0lfREVWX1hFTV9ESUQsICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDAgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX0NYX0RJRCwgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDEgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX0NYX0lCTV9ESUQsICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDIgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX0VQQ0pfRElELCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDMgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWXzkyMF8yX0RJRCwgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDQgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWXzkyMF80X0RJRCwgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDUgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWXzkyMF84X0RJRCwgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDYgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hSX0RJRCwgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDcgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hSSl9ESUQsICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDggfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hSXzQyMl9ESUQsICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDkgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hSX0lCTV9ESUQsICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTAgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hSX1NBSVBfRElELCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTEgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hSX0JVTExfRElELCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTIgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWXzkyMF84X0hQX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTMgfSwKKwl7IERJR0lfVklELCBQQ0lfREVWX1hFTV9IUF9ESUQsICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTQgfSwKKwl7MCx9CQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGdhcF9wY2lfdGJsKTsKKworLyoKKyAqIEEgZ2VuZXJpYyBsaXN0IG9mIFByb2R1Y3QgbmFtZXMsIFBDSSBWZW5kb3IgSUQsIGFuZCBQQ0kgRGV2aWNlIElELgorICovCitzdHJ1Y3QgYm9hcmRfaWQgeworCXVpbnQgY29uZmlnX3R5cGU7CisJdWNoYXIgKm5hbWU7CisJdWludCBtYXhwb3J0czsKKwl1aW50IGRwYXR5cGU7Cit9OworCitzdGF0aWMgc3RydWN0IGJvYXJkX2lkIGRnYXBfSWRzW10gPSB7CisJeyBQUENNLCAgICAgICAgUENJX0RFVl9YRU1fTkFNRSwgICAgIDY0LCAoVF9QQ1hNfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUENYLCAgICAgICAgIFBDSV9ERVZfQ1hfTkFNRSwgICAgIDEyOCwgKFRfQ1h8VF9QQ0lCVVMpICAgICAgICAgICAgfSwKKwl7IFBDWCwgICAgICAgICBQQ0lfREVWX0NYX0lCTV9OQU1FLCAxMjgsIChUX0NYfFRfUENJQlVTKSAgICAgICAgICAgIH0sCisJeyBQRVBDLCAgICAgICAgUENJX0RFVl9FUENKX05BTUUsICAgMjI0LCAoVF9FUEN8VF9QQ0lCVVMpICAgICAgICAgICB9LAorCXsgQVBPUlQyXzkyMFAsIFBDSV9ERVZfOTIwXzJfTkFNRSwgICAgMiwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IEFQT1JUNF85MjBQLCBQQ0lfREVWXzkyMF80X05BTUUsICAgIDQsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBBUE9SVDhfOTIwUCwgUENJX0RFVl85MjBfOF9OQU1FLCAgICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUEFQT1JUOCwgICAgIFBDSV9ERVZfWFJfTkFNRSwgICAgICAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBBUE9SVDgsICAgICBQQ0lfREVWX1hSSl9OQU1FLCAgICAgIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQQVBPUlQ4LCAgICAgUENJX0RFVl9YUl80MjJfTkFNRSwgICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUEFQT1JUOCwgICAgIFBDSV9ERVZfWFJfSUJNX05BTUUsICAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBBUE9SVDgsICAgICBQQ0lfREVWX1hSX1NBSVBfTkFNRSwgIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQQVBPUlQ4LCAgICAgUENJX0RFVl9YUl9CVUxMX05BTUUsICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgQVBPUlQ4XzkyMFAsIFBDSV9ERVZfOTIwXzhfSFBfTkFNRSwgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBQQ00sICAgICAgICBQQ0lfREVWX1hFTV9IUF9OQU1FLCAgNjQsIChUX1BDWE18VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJezAsfQkJCQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRnYXBfZHJpdmVyID0geworCS5uYW1lCQk9ICJkZ2FwIiwKKwkucHJvYmUJCT0gZGdhcF9pbml0X29uZSwKKwkuaWRfdGFibGUJPSBkZ2FwX3BjaV90YmwsCisJLnJlbW92ZQkJPSBkZ2FwX3JlbW92ZV9vbmUsCit9OworCitzdHJ1Y3QgZmlybXdhcmVfaW5mbyB7CisJdWNoYXIgKmNvbmZfbmFtZTsgICAgICAgLyogZGdhcC5jb25mICovCisJdWNoYXIgKmJpb3NfbmFtZTsJLyogQklPUyBmaWxlbmFtZSAqLworCXVjaGFyICpmZXBfbmFtZTsJLyogRkVQICBmaWxlbmFtZSAqLworCXVjaGFyICpjb25fbmFtZTsJLyogQ29uY2VudHJhdG9yIGZpbGVuYW1lICBGSVhNRSovCisJaW50IG51bTsgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgbnVtYmVyICovCit9OworCisvKgorICogRmlybXdhcmUgLSBCSU9TLCBGRVAsIGFuZCBDT05DIGZpbGVuYW1lcworICovCitzdGF0aWMgc3RydWN0IGZpcm13YXJlX2luZm8gZndfaW5mb1tdID0geworCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAvc3hiaW9zLmJpbiIsICAiZGdhcC9zeGZlcC5iaW4iLCAgMCwgMCB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAvY3hwYmlvcy5iaW4iLCAiZGdhcC9jeHBmZXAuYmluIiwgMCwgMSB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAvY3hwYmlvcy5iaW4iLCAiZGdhcC9jeHBmZXAuYmluIiwgMCwgMiB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAvcGNpYmlvcy5iaW4iLCAiZGdhcC9wY2lmZXAuYmluIiwgMCwgMyB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgNCB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgNSB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgNiB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgNyB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgOCB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgOSB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgMTAgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDExIH0sCisJeyAiZGdhcC9kZ2FwLmNvbmYiLCAiZGdhcC94cmJpb3MuYmluIiwgICJkZ2FwL3hyZmVwLmJpbiIsICAwLCAxMiB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgMTMgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3N4Ymlvcy5iaW4iLCAgImRnYXAvc3hmZXAuYmluIiwgIDAsIDE0IH0sCisJezAsfQorfTsKKworLyoKKyAqIERlZmF1bHQgdHJhbnNwYXJlbnQgcHJpbnQgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlnaV90IGRnYXBfZGlnaV9pbml0ID0geworCS5kaWdpX2ZsYWdzID0JRElHSV9DT09LLAkvKiBGbGFncwkJCSovCisJLmRpZ2lfbWF4Y3BzID0JMTAwLAkJLyogTWF4IENQUwkJCSovCisJLmRpZ2lfbWF4Y2hhciA9CTUwLAkJLyogTWF4IGNoYXJzIGluIHByaW50IHF1ZXVlCSovCisJLmRpZ2lfYnVmc2l6ZSA9CTEwMCwJCS8qIFByaW50ZXIgYnVmZmVyIHNpemUJCSovCisJLmRpZ2lfb25sZW4gPQk0LAkJLyogc2l6ZSBvZiBwcmludGVyIG9uIHN0cmluZwkqLworCS5kaWdpX29mZmxlbiA9CTQsCQkvKiBzaXplIG9mIHByaW50ZXIgb2ZmIHN0cmluZwkqLworCS5kaWdpX29uc3RyID0JIlwwMzNbNWkiLAkvKiBBTlNJIHByaW50ZXIgb24gc3RyaW5nIF0JKi8KKwkuZGlnaV9vZmZzdHIgPQkiXDAzM1s0aSIsCS8qIEFOU0kgcHJpbnRlciBvZmYgc3RyaW5nIF0JKi8KKwkuZGlnaV90ZXJtID0JImFuc2kiCQkvKiBkZWZhdWx0IHRlcm1pbmFsIHR5cGUJKi8KK307CisKKy8qCisgKiBEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCisgKiB3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuCisgKgorICogVGhpcyBkZWZpbmVzIGEgcmF3IHBvcnQgYXQgOTYwMCBiYXVkLCA4IGRhdGEgYml0cywgbm8gcGFyaXR5LAorICogMSBzdG9wIGJpdC4KKyAqLworCitzdGF0aWMgc3RydWN0IGt0ZXJtaW9zIERnYXBEZWZhdWx0VGVybWlvcyA9IHsKKwkuY19pZmxhZyA9CShERUZBVUxUX0lGTEFHUyksCS8qIGlmbGFncyAqLworCS5jX29mbGFnID0JKERFRkFVTFRfT0ZMQUdTKSwJLyogb2ZsYWdzICovCisJLmNfY2ZsYWcgPQkoREVGQVVMVF9DRkxBR1MpLAkvKiBjZmxhZ3MgKi8KKwkuY19sZmxhZyA9CShERUZBVUxUX0xGTEFHUyksCS8qIGxmbGFncyAqLworCS5jX2NjID0JCUlOSVRfQ19DQywKKwkuY19saW5lID0JMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgZGdhcF90dHlfb3BzID0geworCS5vcGVuID0gZGdhcF90dHlfb3BlbiwKKwkuY2xvc2UgPSBkZ2FwX3R0eV9jbG9zZSwKKwkud3JpdGUgPSBkZ2FwX3R0eV93cml0ZSwKKwkud3JpdGVfcm9vbSA9IGRnYXBfdHR5X3dyaXRlX3Jvb20sCisJLmZsdXNoX2J1ZmZlciA9IGRnYXBfdHR5X2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9jaGFycyA9IGRnYXBfdHR5X2ZsdXNoX2NoYXJzLAorCS5pb2N0bCA9IGRnYXBfdHR5X2lvY3RsLAorCS5zZXRfdGVybWlvcyA9IGRnYXBfdHR5X3NldF90ZXJtaW9zLAorCS5zdG9wID0gZGdhcF90dHlfc3RvcCwKKwkuc3RhcnQgPSBkZ2FwX3R0eV9zdGFydCwKKwkudGhyb3R0bGUgPSBkZ2FwX3R0eV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IGRnYXBfdHR5X3VudGhyb3R0bGUsCisJLmhhbmd1cCA9IGRnYXBfdHR5X2hhbmd1cCwKKwkucHV0X2NoYXIgPSBkZ2FwX3R0eV9wdXRfY2hhciwKKwkudGlvY21nZXQgPSBkZ2FwX3R0eV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBkZ2FwX3R0eV90aW9jbXNldCwKKwkuYnJlYWtfY3RsID0gZGdhcF90dHlfc2VuZF9icmVhaywKKwkud2FpdF91bnRpbF9zZW50ID0gZGdhcF90dHlfd2FpdF91bnRpbF9zZW50LAorCS5zZW5kX3hjaGFyID0gZGdhcF90dHlfc2VuZF94Y2hhcgorfTsKKworLyoKKyAqIE91ciBuZWVkZWQgaW50ZXJuYWwgc3RhdGljIHZhcmlhYmxlcyBmcm9tIGRnYXBfcGFyc2UuYworICovCitzdGF0aWMgc3RydWN0IGNub2RlIGRnYXBfaGVhZDsKKyNkZWZpbmUgTUFYQ1dPUkQgMjAwCitzdGF0aWMgY2hhciBkZ2FwX2N3b3JkW01BWENXT1JEXTsKKworc3RydWN0IHRva2xpc3QgeworCWludAl0b2tlbjsKKwljaGFyCSpzdHJpbmc7Cit9OworCitzdGF0aWMgc3RydWN0IHRva2xpc3QgZGdhcF90bGlzdFtdID0geworCXsgQkVHSU4sCSJjb25maWdfYmVnaW4iIH0sCisJeyBFTkQsCQkiY29uZmlnX2VuZCIgfSwKKwl7IEJPQVJELAkiYm9hcmQiCX0sCisJeyBQQ1gsCQkiRGlnaV9BY2NlbGVQb3J0X0MvWF9QQ0kiIH0sCisJeyBQRVBDLAkJIkRpZ2lfQWNjZWxlUG9ydF9FUEMvWF9QQ0kiIH0sCisJeyBQUENNLAkJIkRpZ2lfQWNjZWxlUG9ydF9YZW1fUENJIiB9LAorCXsgQVBPUlQyXzkyMFAsCSJEaWdpX0FjY2VsZVBvcnRfMnJfOTIwX1BDSSIgfSwKKwl7IEFQT1JUNF85MjBQLAkiRGlnaV9BY2NlbGVQb3J0XzRyXzkyMF9QQ0kiIH0sCisJeyBBUE9SVDhfOTIwUCwJIkRpZ2lfQWNjZWxlUG9ydF84cl85MjBfUENJIiB9LAorCXsgUEFQT1JUNCwJIkRpZ2lfQWNjZWxlUG9ydF80cl9QQ0koRUlBLTIzMi9SUy00MjIpIiB9LAorCXsgUEFQT1JUOCwJIkRpZ2lfQWNjZWxlUG9ydF84cl9QQ0koRUlBLTIzMi9SUy00MjIpIiB9LAorCXsgSU8sCQkiaW8iIH0sCisJeyBQQ0lJTkZPLAkicGNpaW5mbyIgfSwKKwl7IExJTkUsCQkibGluZSIgfSwKKwl7IENPTkMsCQkiY29uYyIgfSwKKwl7IENPTkMsCQkiY29uY2VudHJhdG9yIiB9LAorCXsgQ1gsCQkiY3giIH0sCisJeyBDWCwJCSJjY29uIiB9LAorCXsgRVBDLAkJImVwY2NvbiIgfSwKKwl7IEVQQywJCSJlcGMiIH0sCisJeyBNT0QsCQkibW9kdWxlIiB9LAorCXsgSUQsCQkiaWQiIH0sCisJeyBTVEFSVE8sCSJzdGFydCIgfSwKKwl7IFNQRUVELAkic3BlZWQiCX0sCisJeyBDQUJMRSwJImNhYmxlIgl9LAorCXsgQ09OTkVDVCwJImNvbm5lY3QiIH0sCisJeyBNRVRIT0QsCSJtZXRob2QiIH0sCisJeyBTVEFUVVMsCSJzdGF0dXMiIH0sCisJeyBDVVNUT00sCSJDdXN0b20iIH0sCisJeyBCQVNJQywJIkJhc2ljIgl9LAorCXsgTUVNLAkJIm1lbSIgfSwKKwl7IE1FTSwJCSJtZW1vcnkiIH0sCisJeyBQT1JUUywJInBvcnRzIgl9LAorCXsgTU9ERU0sCSJtb2RlbSIJfSwKKwl7IE5QT1JUUywJIm5wb3J0cyIgfSwKKwl7IFRUWU4sCQkidHR5bmFtZSIgfSwKKwl7IENVLAkJImN1bmFtZSIgfSwKKwl7IFBSSU5ULAkicHJuYW1lIiB9LAorCXsgQ01BSk9SLAkibWFqb3IiCSB9LAorCXsgQUxUUElOLAkiYWx0cGluIiB9LAorCXsgVVNFSU5UUiwJInVzZWludHIiIH0sCisJeyBUVFNJWiwJInR0eXNpemUiIH0sCisJeyBDSFNJWiwJImNoc2l6ZSIgfSwKKwl7IEJTU0laLAkiYm9hcmRzaXplIiB9LAorCXsgVU5UU0laLAkic2NoZWRzaXplIiB9LAorCXsgRjJTSVosCSJmMjIwMHNpemUiIH0sCisJeyBWUFNJWiwJInZwaXhzaXplIiB9LAorCXsgMCwJCU5VTEwgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERyaXZlciBsb2FkL3VubG9hZCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogaW5pdF9tb2R1bGUoKQorICoKKyAqIE1vZHVsZSBsb2FkLiAgVGhpcyBpcyB3aGVyZSBpdCBhbGwgc3RhcnRzLgorICovCitzdGF0aWMgaW50IGRnYXBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJcHJfaW5mbygiJXMsIERpZ2kgSW50ZXJuYXRpb25hbCBQYXJ0IE51bWJlciAlc1xuIiwgREdfTkFNRSwgREdfUEFSVCk7CisKKwlyYyA9IGRnYXBfc3RhcnQoKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZGdhcF9pbml0X3BjaSgpOworCWlmIChyYykKKwkJZ290byBlcnJfY2xlYW51cDsKKworCXJjID0gZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKCZkZ2FwX2RyaXZlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9jbGVhbnVwOworCisJZGdhcF9kcml2ZXJfc3RhdGUgPSBEUklWRVJfUkVBRFk7CisKKwlyZXR1cm4gMDsKKworZXJyX2NsZWFudXA6CisKKwlkZ2FwX2NsZWFudXBfbW9kdWxlKCk7CisKKwlyZXR1cm4gcmM7Cit9Cittb2R1bGVfaW5pdChkZ2FwX2luaXRfbW9kdWxlKTsKKworLyoKKyAqIFN0YXJ0IG9mIGRyaXZlci4KKyAqLworc3RhdGljIGludCBkZ2FwX3N0YXJ0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKworCS8qCisJICogbWFrZSBzdXJlIHRoYXQgdGhlIGdsb2JhbHMgYXJlCisJICogaW5pdCdkIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBlbHNlCisJICovCisJZGdhcF9pbml0X2dsb2JhbHMoKTsKKworCWRnYXBfTnVtQm9hcmRzID0gMDsKKworCXByX2luZm8oIkZvciB0aGUgdG9vbHMgcGFja2FnZSBwbGVhc2UgdmlzaXQgaHR0cDovL3d3dy5kaWdpLmNvbVxuIik7CisKKwkvKgorCSAqIFJlZ2lzdGVyIG91ciBiYXNlIGNoYXJhY3RlciBkZXZpY2UgaW50byB0aGUga2VybmVsLgorCSAqLworCisJLyoKKwkgKiBSZWdpc3RlciBtYW5hZ2VtZW50L2RwYSBkZXZpY2VzCisJICovCisJcmMgPSByZWdpc3Rlcl9jaHJkZXYoRElHSV9ER0FQX01BSk9SLCAiZGdhcCIsICZEZ2FwQm9hcmRGb3BzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlkZ2FwX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiZGdhcF9tZ210Iik7CisJaWYgKElTX0VSUihkZ2FwX2NsYXNzKSkgeworCQlyYyA9IFBUUl9FUlIoZGdhcF9jbGFzcyk7CisJCWdvdG8gZmFpbGVkX2NsYXNzOworCX0KKworCWRldmljZSA9IGRldmljZV9jcmVhdGUoZGdhcF9jbGFzcywgTlVMTCwKKwkJTUtERVYoRElHSV9ER0FQX01BSk9SLCAwKSwKKwkJTlVMTCwgImRnYXBfbWdtdCIpOworCWlmIChJU19FUlIoZGV2aWNlKSkgeworCQlyYyA9IFBUUl9FUlIoZGV2aWNlKTsKKwkJZ290byBmYWlsZWRfZGV2aWNlOworCX0KKworCS8qIFN0YXJ0IHRoZSBwb2xsZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGdhcF9wb2xsX2xvY2ssIGZsYWdzKTsKKwlpbml0X3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOworCWRnYXBfcG9sbF90aW1lci5mdW5jdGlvbiA9IGRnYXBfcG9sbF9oYW5kbGVyOworCWRnYXBfcG9sbF90aW1lci5kYXRhID0gMDsKKwlkZ2FwX3BvbGxfdGltZSA9IGppZmZpZXMgKyBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7CisJZGdhcF9wb2xsX3RpbWVyLmV4cGlyZXMgPSBkZ2FwX3BvbGxfdGltZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ2FwX3BvbGxfbG9jaywgZmxhZ3MpOworCisJYWRkX3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOworCisJcmV0dXJuIHJjOworCitmYWlsZWRfZGV2aWNlOgorCWNsYXNzX2Rlc3Ryb3koZGdhcF9jbGFzcyk7CitmYWlsZWRfY2xhc3M6CisJdW5yZWdpc3Rlcl9jaHJkZXYoRElHSV9ER0FQX01BSk9SLCAiZGdhcCIpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFJlZ2lzdGVyIHBjaSBkcml2ZXIsIGFuZCByZXR1cm4gaG93IG1hbnkgYm9hcmRzIHdlIGhhdmUuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9pbml0X3BjaSh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Cit9CisKKy8qIHJldHVybnMgY291bnQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLworc3RhdGljIGludCBkZ2FwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCByYzsKKworCS8qIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJaWYgKHJjIDwgMCkgeworCQlyYyA9IC1FSU87CisJfSBlbHNlIHsKKwkJcmMgPSBkZ2FwX3Byb2JlMShwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCWRnYXBfTnVtQm9hcmRzKys7CisJCQlyYyA9IGRnYXBfZmlybXdhcmVfbG9hZChwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZGdhcF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpCit7CisJcmV0dXJuIGRnYXBfZm91bmRfYm9hcmQocGRldiwgY2FyZF90eXBlKTsKK30KKworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogRG8gTm90aGluZyAqLworfQorCisvKgorICogZGdhcF9jbGVhbnVwX21vZHVsZSgpCisgKgorICogTW9kdWxlIHVubG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIGVuZHMuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaTsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlkZ2FwX3BvbGxfc3RvcCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogVHVybiBvZmYgcG9sbGVyIHJpZ2h0IGF3YXkuICovCisJZGVsX3RpbWVyX3N5bmMoJmRnYXBfcG9sbF90aW1lcik7CisKKwlkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoJmRnYXBfZHJpdmVyKTsKKworCWRldmljZV9kZXN0cm95KGRnYXBfY2xhc3MsIE1LREVWKERJR0lfREdBUF9NQUpPUiwgMCkpOworCWNsYXNzX2Rlc3Ryb3koZGdhcF9jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXYoRElHSV9ER0FQX01BSk9SLCAiZGdhcCIpOworCisJa2ZyZWUoZGdhcF9jb25maWdfYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZ2FwX051bUJvYXJkczsgKytpKSB7CisJCWRnYXBfcmVtb3ZlX3BvcnRzX3N5c2ZpbGVzKGRnYXBfQm9hcmRbaV0pOworCQlkZ2FwX3R0eV91bmluaXQoZGdhcF9Cb2FyZFtpXSk7CisJCWRnYXBfY2xlYW51cF9ib2FyZChkZ2FwX0JvYXJkW2ldKTsKKwl9CisKKwlpZiAoZGdhcF9OdW1Cb2FyZHMpCisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGdhcF9kcml2ZXIpOworfQorCisvKgorICogZGdhcF9jbGVhbnVwX2JvYXJkKCkKKyAqCisgKiBGcmVlIGFsbCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIGJvYXJkCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfY2xlYW51cF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWludCBpID0gMDsKKworCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJaWYgKGJyZC0+aW50cl91c2VkICYmIGJyZC0+aXJxKQorCQlmcmVlX2lycShicmQtPmlycSwgYnJkKTsKKworCXRhc2tsZXRfa2lsbCgmYnJkLT5oZWxwZXJfdGFza2xldCk7CisKKwlpZiAoYnJkLT5yZV9tYXBfcG9ydCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgMHgyMDAwMDAsIDB4MjAwMDAwKTsKKwkJaW91bm1hcChicmQtPnJlX21hcF9wb3J0KTsKKwkJYnJkLT5yZV9tYXBfcG9ydCA9IE5VTEw7CisJfQorCisJaWYgKGJyZC0+cmVfbWFwX21lbWJhc2UpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlpb3VubWFwKGJyZC0+cmVfbWFwX21lbWJhc2UpOworCQlicmQtPnJlX21hcF9tZW1iYXNlID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIGFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMgc3RydWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhQT1JUUyA7IGkrKykKKwkJa2ZyZWUoYnJkLT5jaGFubmVsc1tpXSk7CisKKwlrZnJlZShicmQtPmZsaXBidWYpOworCWtmcmVlKGJyZC0+ZmxpcGZsYWdidWYpOworCisJZGdhcF9Cb2FyZFticmQtPmJvYXJkbnVtXSA9IE5VTEw7CisKKwlrZnJlZShicmQpOworfQorCisvKgorICogZGdhcF9mb3VuZF9ib2FyZCgpCisgKgorICogQSBib2FyZCBoYXMgYmVlbiBmb3VuZCwgaW5pdCBpdC4KKyAqLworc3RhdGljIGludCBkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpCit7CisJc3RydWN0IGJvYXJkX3QgKmJyZDsKKwl1bnNpZ25lZCBpbnQgcGNpX2lycTsKKwlpbnQgaSA9IDA7CisKKwkvKiBnZXQgdGhlIGJvYXJkIHN0cnVjdHVyZSBhbmQgcHJlcCBpdCAqLworCWJyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBib2FyZF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicmQpCisJCXJldHVybiAtRU5PTUVNOworCisJZGdhcF9Cb2FyZFtkZ2FwX051bUJvYXJkc10gPSBicmQ7CisKKwkvKiBzdG9yZSB0aGUgaW5mbyBmb3IgdGhlIGJvYXJkIHdlJ3ZlIGZvdW5kICovCisJYnJkLT5tYWdpYyA9IERHQVBfQk9BUkRfTUFHSUM7CisJYnJkLT5ib2FyZG51bSA9IGRnYXBfTnVtQm9hcmRzOworCWJyZC0+Zmlyc3RtaW5vciA9IDA7CisJYnJkLT52ZW5kb3IgPSBkZ2FwX3BjaV90YmxbaWRdLnZlbmRvcjsKKwlicmQtPmRldmljZSA9IGRnYXBfcGNpX3RibFtpZF0uZGV2aWNlOworCWJyZC0+cGRldiA9IHBkZXY7CisJYnJkLT5wY2lfYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJYnJkLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwlicmQtPm5hbWUgPSBkZ2FwX0lkc1tpZF0ubmFtZTsKKwlicmQtPm1heHBvcnRzID0gZGdhcF9JZHNbaWRdLm1heHBvcnRzOworCWJyZC0+dHlwZSA9IGRnYXBfSWRzW2lkXS5jb25maWdfdHlwZTsKKwlicmQtPmRwYXR5cGUgPSBkZ2FwX0lkc1tpZF0uZHBhdHlwZTsKKwlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJyZC0+c3RhdGVfd2FpdCk7CisKKwlzcGluX2xvY2tfaW5pdCgmYnJkLT5iZF9sb2NrKTsKKworCWJyZC0+cnVud2FpdAkJPSAwOworCWJyZC0+aW5oaWJpdF9wb2xsZXIJPSBGQUxTRTsKKwlicmQtPndhaXRfZm9yX2Jpb3MJPSAwOworCWJyZC0+d2FpdF9mb3JfZmVwCT0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhQT1JUUzsgaSsrKQorCQlicmQtPmNoYW5uZWxzW2ldID0gTlVMTDsKKworCS8qIHN0b3JlIHdoaWNoIGNhcmQgJiByZXZpc2lvbiB3ZSBoYXZlICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZicmQtPnN1YnZlbmRvcik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJmJyZC0+c3ViZGV2aWNlKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZicmQtPnJldik7CisKKwlwY2lfaXJxID0gcGRldi0+aXJxOworCWJyZC0+aXJxID0gcGNpX2lycTsKKworCS8qIGdldCB0aGUgUENJIEJhc2UgQWRkcmVzcyBSZWdpc3RlcnMgKi8KKworCS8qIFhyIEp1cGl0ZXIgYW5kIEVQQyB1c2UgQkFSIDIgKi8KKwlpZiAoYnJkLT5kZXZpY2UgPT0gUENJX0RFVl9YUkpfRElEIHx8IGJyZC0+ZGV2aWNlID09IFBDSV9ERVZfRVBDSl9ESUQpIHsKKwkJYnJkLT5tZW1iYXNlICAgICA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwkJYnJkLT5tZW1iYXNlX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMik7CisJfQorCS8qIEV2ZXJ5b25lIGVsc2UgdXNlcyBCQVIgMCAqLworCWVsc2UgeworCQlicmQtPm1lbWJhc2UgICAgID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQlicmQtPm1lbWJhc2VfZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAwKTsKKwl9CisKKwlpZiAoIWJyZC0+bWVtYmFzZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYnJkLT5tZW1iYXNlICYgMSkKKwkJYnJkLT5tZW1iYXNlICY9IH4zOworCWVsc2UKKwkJYnJkLT5tZW1iYXNlICY9IH4xNTsKKworCS8qCisJICogT24gdGhlIFBDSSBib2FyZHMsIHRoZXJlIGlzIG5vIElPIHNwYWNlIGFsbG9jYXRlZAorCSAqIFRoZSBJL08gcmVnaXN0ZXJzIHdpbGwgYmUgaW4gdGhlIGZpcnN0IDMgYnl0ZXMgb2YgdGhlCisJICogdXBwZXIgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlLiAgVGhlIGJvYXJkIG1lbW9yeQorCSAqIHdpbGwgYmUgbWFwcGVkIGludG8gdGhlIGxvdyAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UKKwkgKi8KKwlicmQtPnBvcnQgPSBicmQtPm1lbWJhc2UgKyBQQ0lfSU9fT0ZGU0VUOworCWJyZC0+cG9ydF9lbmQgPSBicmQtPnBvcnQgKyBQQ0lfSU9fU0laRTsKKworCS8qCisJICogU3BlY2lhbCBpbml0aWFsaXphdGlvbiBmb3Igbm9uLVBMWCBib2FyZHMKKwkgKi8KKwlpZiAoYnJkLT5kZXZpY2UgIT0gUENJX0RFVl9YUkpfRElEICYmIGJyZC0+ZGV2aWNlICE9IFBDSV9ERVZfRVBDSl9ESUQpIHsKKwkJdW5zaWduZWQgc2hvcnQgY21kOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQwLCAwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDYsIDApOworCisJCS8qIExpbWl0IGJ1cnN0IGxlbmd0aCB0byAyIGRvdWJsZXdvcmQgdHJhbnNhY3Rpb25zICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQyLCAxKTsKKworCQkvKgorCQkgKiBFbmFibGUgSU8gYW5kIG1lbSBpZiBub3QgYWxyZWFkeSBkb25lLgorCQkgKiBUaGlzIHdhcyBuZWVkZWQgZm9yIHN1cHBvcnQgb24gSXRhbml1bS4KKwkJICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKwkJY21kIHw9IChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwl9CisKKwkvKiBpbml0IG91ciBwb2xsIGhlbHBlciB0YXNrbGV0ICovCisJdGFza2xldF9pbml0KCZicmQtPmhlbHBlcl90YXNrbGV0LCBkZ2FwX3BvbGxfdGFza2xldCwKKwkJCSh1bnNpZ25lZCBsb25nKSBicmQpOworCisJaSA9IGRnYXBfZG9fcmVtYXAoYnJkKTsKKwlpZiAoaSkKKwkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKworCXByX2luZm8oImRnYXA6IGJvYXJkICVkOiAlcyAocmV2ICVkKSwgaXJxICVsZCwgJXNcbiIsCisJCWRnYXBfTnVtQm9hcmRzLCBicmQtPm5hbWUsIGJyZC0+cmV2LCBicmQtPmlycSwKKwkJYnJkLT5zdGF0ZSA/ICJOT1QgUkVBRFlcMCIgOiAiUkVBRFlcMCIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRU5PREVWOworCisJYnJkLT51c2VfaW50ZXJydXB0cyA9IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKGJyZCk7CisKKwkvKgorCSAqIFNldCB1cCBvdXIgaW50ZXJydXB0IGhhbmRsZXIgaWYgd2UgYXJlIHNldCB0byBkbyBpbnRlcnJ1cHRzLgorCSAqLworCWlmIChicmQtPnVzZV9pbnRlcnJ1cHRzICYmIGJyZC0+aXJxKSB7CisKKwkJcmMgPSByZXF1ZXN0X2lycShicmQtPmlycSwgZGdhcF9pbnRyLCBJUlFGX1NIQVJFRCwgIkRHQVAiLCBicmQpOworCisJCWlmIChyYykKKwkJCWJyZC0+aW50cl91c2VkID0gMDsKKwkJZWxzZQorCQkJYnJkLT5pbnRyX3VzZWQgPSAxOworCX0gZWxzZSB7CisJCWJyZC0+aW50cl91c2VkID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZ2FwX2Zpcm13YXJlX2xvYWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpCit7CisJc3RydWN0IGJvYXJkX3QgKmJyZCA9IGRnYXBfQm9hcmRbZGdhcF9OdW1Cb2FyZHMgLSAxXTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWludCByZXQ7CisKKwlkZ2FwX2dldF92cGQoYnJkKTsKKwlkZ2FwX2RvX3Jlc2V0X2JvYXJkKGJyZCk7CisKKwlpZiAoZndfaW5mb1tjYXJkX3R5cGVdLmNvbmZfbmFtZSkgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmNvbmZfbmFtZSwKKwkJCQkJICZwZGV2LT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImRnYXA6IGNvbmZpZyBmaWxlICVzIG5vdCBmb3VuZFxuIiwKKwkJCQlmd19pbmZvW2NhcmRfdHlwZV0uY29uZl9uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKCFkZ2FwX2NvbmZpZ19idWYpIHsKKwkJCWRnYXBfY29uZmlnX2J1ZiA9IGttYWxsb2MoZnctPnNpemUgKyAxLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghZGdhcF9jb25maWdfYnVmKSB7CisJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKworCQltZW1jcHkoZGdhcF9jb25maWdfYnVmLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJZGdhcF9jb25maWdfYnVmW2Z3LT5zaXplICsgMV0gPSAnXDAnOworCisJCWlmIChkZ2FwX3BhcnNlZmlsZSgmZGdhcF9jb25maWdfYnVmLCBUUlVFKSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZGdhcF9hZnRlcl9jb25maWdfbG9hZGVkKGJyZC0+Ym9hcmRudW0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJLyoKKwkgKiBNYXRjaCB0aGlzIGJvYXJkIHRvIGEgY29uZmlnIHRoZSB1c2VyIGNyZWF0ZWQgZm9yIHVzLgorCSAqLworCWJyZC0+YmRfY29uZmlnID0KKwkJZGdhcF9maW5kX2NvbmZpZyhicmQtPnR5cGUsIGJyZC0+cGNpX2J1cywgYnJkLT5wY2lfc2xvdCk7CisKKwkvKgorCSAqIEJlY2F1c2UgdGhlIDQgcG9ydCBYciBwcm9kdWN0cyBzaGFyZSB0aGUgc2FtZSBQQ0kgSUQKKwkgKiBhcyB0aGUgOCBwb3J0IFhyIHByb2R1Y3RzLCBpZiB3ZSByZWNlaXZlIGEgTlVMTCBjb25maWcKKwkgKiBiYWNrLCBhbmQgdGhpcyBpcyBhIFBBUE9SVDggYm9hcmQsIHJldHJ5IHdpdGggYQorCSAqIFBBUE9SVDQgYXR0ZW1wdCBhcyB3ZWxsLgorCSAqLworCWlmIChicmQtPnR5cGUgPT0gUEFQT1JUOCAmJiAhYnJkLT5iZF9jb25maWcpCisJCWJyZC0+YmRfY29uZmlnID0KKwkJCWRnYXBfZmluZF9jb25maWcoUEFQT1JUNCwgYnJkLT5wY2lfYnVzLCBicmQtPnBjaV9zbG90KTsKKworCWlmICghYnJkLT5iZF9jb25maWcpIHsKKwkJcHJfZXJyKCJkZ2FwOiBObyB2YWxpZCBjb25maWd1cmF0aW9uIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGdhcF90dHlfcmVnaXN0ZXIoYnJkKTsKKwlkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoYnJkKTsKKworCWlmIChmd19pbmZvW2NhcmRfdHlwZV0uYmlvc19uYW1lKSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19pbmZvW2NhcmRfdHlwZV0uYmlvc19uYW1lLAorCQkJCQkmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBiaW9zIGZpbGUgJXMgbm90IGZvdW5kXG4iLAorCQkJCWZ3X2luZm9bY2FyZF90eXBlXS5iaW9zX25hbWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkZ2FwX2RvX2Jpb3NfbG9hZChicmQsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJCS8qIFdhaXQgZm9yIEJJT1MgdG8gdGVzdCBib2FyZC4uLiAqLworCQlpZiAoIWRnYXBfZG9fd2FpdF9mb3JfYmlvcyhicmQpKQorCQkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoZndfaW5mb1tjYXJkX3R5cGVdLmZlcF9uYW1lKSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19pbmZvW2NhcmRfdHlwZV0uZmVwX25hbWUsCisJCQkJCSZwZGV2LT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImRnYXA6IGZlcCBmaWxlICVzIG5vdCBmb3VuZFxuIiwKKwkJCQlmd19pbmZvW2NhcmRfdHlwZV0uZmVwX25hbWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkZ2FwX2RvX2ZlcF9sb2FkKGJyZCwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwkJLyogV2FpdCBmb3IgRkVQIHRvIGxvYWQgb24gYm9hcmQuLi4gKi8KKwkJaWYgKCFkZ2FwX2RvX3dhaXRfZm9yX2ZlcChicmQpKQorCQkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKyNpZmRlZiBESUdJX0NPTkNFTlRSQVRPUlNfU1VQUE9SVEVECisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgQ1ggb3IgRVBDWCwgd2UgbmVlZCB0byBzZWUgaWYgdGhlIGZpcm13YXJlCisJICogaXMgcmVxdWVzdGluZyBhIGNvbmNlbnRyYXRvciBpbWFnZSBmcm9tIHVzLgorCSAqLworCWlmICgoYmQtPnR5cGUgPT0gUENYKSB8fCAoYmQtPnR5cGUgPT0gUEVQQykpIHsKKwkJY2hrX2FkZHIgPSAodTE2ICopICh2YWRkciArIERPV05SRVEpOworCQkvKiBOb256ZXJvIGlmIEZFUCBpcyByZXF1ZXN0aW5nIGNvbmNlbnRyYXRvciBpbWFnZS4gKi8KKwkJY2hlY2sgPSByZWFkdyhjaGtfYWRkcik7CisJCXZhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKKwl9CisKKwlpZiAoZndfaW5mb1tjYXJkX3R5cGVdLmNvbl9uYW1lICYmIGNoZWNrICYmIHZhZGRyKSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19pbmZvW2NhcmRfdHlwZV0uY29uX25hbWUsCisJCQkJCSZwZGV2LT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImRnYXA6IGNvbmMgZmlsZSAlcyBub3QgZm91bmRcbiIsCisJCQkJZndfaW5mb1tjYXJkX3R5cGVdLmNvbl9uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJLyogUHV0IGNvbmNlbnRyYXRvciBmaXJtd2FyZSBsb2FkaW5nIGNvZGUgaGVyZSAqLworCQlvZmZzZXQgPSByZWFkdygodTE2ICopICh2YWRkciArIERPV05SRVEpKTsKKwkJbWVtY3B5X3RvaW8ob2Zmc2V0LCBmdy0+ZGF0YSwgZnctPnNpemUpOworCisJCWRnYXBfZG9fY29uY19sb2FkKGJyZCwgKGNoYXIgKilmdy0+ZGF0YSwgZnctPnNpemUpCisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCX0KKyNlbmRpZgorCS8qCisJICogRG8gdHR5IGRldmljZSBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlyZXQgPSBkZ2FwX3R0eV9pbml0KGJyZCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGdhcF90dHlfdW5pbml0KGJyZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGdhcF90dHlfcmVnaXN0ZXJfcG9ydHMoYnJkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYnJkLT5zdGF0ZSA9IEJPQVJEX1JFQURZOworCWJyZC0+ZHBhc3RhdHVzID0gQkRfUlVOTklORzsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVtYXAgUENJIG1lbW9yeS4KKyAqLworc3RhdGljIGludCBkZ2FwX2RvX3JlbWFwKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCwgImRnYXAiKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCwKKwkJCQkJImRnYXAiKSkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJyZC0+cmVfbWFwX21lbWJhc2UgPSBpb3JlbWFwKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCWlmICghYnJkLT5yZV9tYXBfbWVtYmFzZSkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJyZC0+cmVfbWFwX3BvcnQgPSBpb3JlbWFwKChicmQtPm1lbWJhc2UgKyBQQ0lfSU9fT0ZGU0VUKSwgMHgyMDAwMDApOworCWlmICghYnJkLT5yZV9tYXBfcG9ydCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCk7CisJCWlvdW5tYXAoYnJkLT5yZV9tYXBfbWVtYmFzZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRnVuY3Rpb246CisqCisqICAgIGRnYXBfcG9sbF9oYW5kbGVyCisqCisqIEF1dGhvcjoKKyoKKyogICAgU2NvdHQgSCBLaWxhdQorKgorKiBQYXJhbWV0ZXJzOgorKgorKiAgICBkdW1teSAtLSBpZ25vcmVkCisqCisqIFJldHVybiBWYWx1ZXM6CisqCisqICAgIG5vbmUKKyoKKyogRGVzY3JpcHRpb246CisqCisqICAgIEFzIGVhY2ggdGltZXIgZXhwaXJlcywgaXQgZGV0ZXJtaW5lcyAoYSkgd2hldGhlciB0aGUgInRyYW5zbWl0IgorKiAgICB3YWl0ZXIgbmVlZHMgdG8gYmUgd29rZW4gdXAsIGFuZCAoYikgd2hldGhlciB0aGUgcG9sbGVyIG5lZWRzIHRvCisqICAgIGJlIHJlc2NoZWR1bGVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBkZ2FwX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYm9hcmRfdCAqYnJkOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBuZXdfdGltZTsKKworCWRnYXBfcG9sbF9jb3VudGVyKys7CisKKwkvKgorCSAqIERvIG5vdCBzdGFydCB0aGUgYm9hcmQgc3RhdGUgbWFjaGluZSB1bnRpbAorCSAqIGRyaXZlciB0ZWxscyB1cyBpdHMgdXAgYW5kIHJ1bm5pbmcsIGFuZCBoYXMKKwkgKiBldmVyeXRoaW5nIGl0IG5lZWRzLgorCSAqLworCWlmIChkZ2FwX2RyaXZlcl9zdGF0ZSAhPSBEUklWRVJfUkVBRFkpCisJCWdvdG8gc2NoZWR1bGVfcG9sbGVyOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGp1c3QgMSBib2FyZCwgb3IgdGhlIHN5c3RlbSBpcyBub3QgU01QLAorCSAqIHRoZW4gdXNlIHRoZSB0eXBpY2FsIG9sZCBzdHlsZSBwb2xsZXIuCisJICogT3RoZXJ3aXNlLCB1c2Ugb3VyIG5ldyB0YXNrbGV0IGJhc2VkIHBvbGxlciwgd2hpY2ggc2hvdWxkCisJICogc3BlZWQgdGhpbmdzIHVwIGZvciBtdWx0aXBsZSBib2FyZHMuCisJICovCisJaWYgKChkZ2FwX051bUJvYXJkcyA9PSAxKSB8fCAobnVtX29ubGluZV9jcHVzKCkgPD0gMSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyBpKyspIHsKKworCQkJYnJkID0gZGdhcF9Cb2FyZFtpXTsKKworCQkJaWYgKGJyZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFicmQtPmludHJfcnVubmluZykKKwkJCQkvKiBDYWxsIHRoZSByZWFsIGJvYXJkIHBvbGxlciBkaXJlY3RseSAqLworCQkJCWRnYXBfcG9sbF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKSBicmQpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogR28gdGhydSBlYWNoIGJvYXJkLCBraWNraW5nIG9mZiBhCisJCSAqIHRhc2tsZXQgZm9yIGVhY2ggaWYgbmVlZGVkCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7IGkrKykgeworCQkJYnJkID0gZGdhcF9Cb2FyZFtpXTsKKworCQkJLyoKKwkJCSAqIEF0dGVtcHQgdG8gZ3JhYiB0aGUgYm9hcmQgbG9jay4KKwkJCSAqCisJCQkgKiBJZiB3ZSBjYW4ndCBnZXQgaXQsIG5vIGJpZyBkZWFsLCB0aGUgbmV4dCBwb2xsCisJCQkgKiB3aWxsIGdldCBpdC4gQmFzaWNhbGx5LCBJIGp1c3QgcmVhbGx5IGRvbid0IHdhbnQKKwkJCSAqIHRvIHNwaW4gaW4gaGVyZSwgYmVjYXVzZSBJIHdhbnQgdG8ga2ljayBvZmYgbXkKKwkJCSAqIHRhc2tsZXRzIGFzIGZhc3QgYXMgSSBjYW4sIGFuZCB0aGVuIGdldCBvdXQgdGhlCisJCQkgKiBwb2xsZXIuCisJCQkgKi8KKwkJCWlmICghc3Bpbl90cnlsb2NrKCZicmQtPmJkX2xvY2spKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogSWYgYm9hcmQgaXMgaW4gYSBmYWlsZWQgc3RhdGUsIGRvbid0IGJvdGhlcgorCQkJICogIHNjaGVkdWxpbmcgYSB0YXNrbGV0CisJCQkgKi8KKwkJCWlmIChicmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgeworCQkJCXNwaW5fdW5sb2NrKCZicmQtPmJkX2xvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBTY2hlZHVsZSBhIHBvbGwgaGVscGVyIHRhc2sgKi8KKwkJCWlmICghYnJkLT5pbnRyX3J1bm5pbmcpCisJCQkJdGFza2xldF9zY2hlZHVsZSgmYnJkLT5oZWxwZXJfdGFza2xldCk7CisKKwkJCS8qCisJCQkgKiBDYW4ndCBkbyBER0FQX1VOTE9DSyBoZXJlLCBhcyB3ZSBkb24ndCBoYXZlCisJCQkgKiBsb2NrX2ZsYWdzIGJlY2F1c2Ugd2UgZGlkIGEgdHJ5bG9jayBhYm92ZS4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2soJmJyZC0+YmRfbG9jayk7CisJCX0KKwl9CisKK3NjaGVkdWxlX3BvbGxlcjoKKworCS8qCisJICogU2NoZWR1bGUgb3Vyc2VsZiBiYWNrIGF0IHRoZSBub21pbmFsIHdha2V1cCBpbnRlcnZhbC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOworCWRnYXBfcG9sbF90aW1lICs9ICBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7CisKKwluZXdfdGltZSA9IGRnYXBfcG9sbF90aW1lIC0gamlmZmllczsKKworCWlmICgodWxvbmcpIG5ld190aW1lID49IDIgKiBkZ2FwX3BvbGxfdGljaykgeworCQlkZ2FwX3BvbGxfdGltZSA9CisJCQlqaWZmaWVzICsgIGRnYXBfamlmZmllc19mcm9tX21zKGRnYXBfcG9sbF90aWNrKTsKKwl9CisKKwlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKKwlkZ2FwX3BvbGxfdGltZXIuZGF0YSA9IDA7CisJZGdhcF9wb2xsX3RpbWVyLmV4cGlyZXMgPSBkZ2FwX3BvbGxfdGltZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ2FwX3BvbGxfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAoIWRnYXBfcG9sbF9zdG9wKQorCQlhZGRfdGltZXIoJmRnYXBfcG9sbF90aW1lcik7Cit9CisKKy8qCisgKiBkZ2FwX2ludHIoKQorICoKKyAqIERyaXZlciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IGRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKQoreworCXN0cnVjdCBib2FyZF90ICpicmQgPSAoc3RydWN0IGJvYXJkX3QgKikgdm9pZGJyZDsKKworCWlmICghYnJkKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSBpdHMgZm9yIHVzLgorCSAqLworCWlmIChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWJyZC0+aW50cl9jb3VudCsrOworCisJLyoKKwkgKiBTY2hlZHVsZSB0YXNrbGV0IHRvIHJ1biBhdCBhIGJldHRlciB0aW1lLgorCSAqLworCXRhc2tsZXRfc2NoZWR1bGUoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIGRnYXBfaW5pdF9nbG9iYWxzKCkKKyAqCisgKiBUaGlzIGlzIHdoZXJlIHdlIGluaXRpYWxpemUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgc3RhdGljIGluc21vZAorICogY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuICBUaGVzZSBhcmUgZGVjbGFyZWQgbmVhciB0aGUgaGVhZCBvZgorICogdGhpcyBmaWxlLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2luaXRfZ2xvYmFscyh2b2lkKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhCT0FSRFM7IGkrKykKKwkJZGdhcF9Cb2FyZFtpXSA9IE5VTEw7CisKKwlpbml0X3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGdhcF9kbF93YWl0KTsKKwlkZ2FwX2RsX2FjdGlvbiA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBkZ2FwX21zX3NsZWVwKCkKKyAqCisgKiBQdXQgdGhlIGRyaXZlciB0byBzbGVlcCBmb3IgeCBtcydzCisgKgorICogUmV0dXJucyAwIGlmIHRpbWVkIG91dCwgITAgKHNob3dpbmcgc2lnbmFsKSBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KKyAqLworc3RhdGljIGludCBkZ2FwX21zX3NsZWVwKHVsb25nIG1zKQoreworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQoKG1zICogSFopIC8gMTAwMCk7CisJcmV0dXJuIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVFRZIEluaXRpYWxpemF0aW9uL0NsZWFudXAgRnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRnYXBfdHR5X3JlZ2lzdGVyKCkKKyAqCisgKiBJbml0IHRoZSB0dHkgc3Vic3lzdGVtIGZvciB0aGlzIGJvYXJkLgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3JlZ2lzdGVyKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJaW50IHJjID0gMDsKKworCWJyZC0+U2VyaWFsRHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhQT1JUUyk7CisKKwlzbnByaW50ZihicmQtPlNlcmlhbE5hbWUsIE1BWFRUWU5BTUVMRU4sICJ0dHlfZGdhcF8lZF8iLCBicmQtPmJvYXJkbnVtKTsKKwlicmQtPlNlcmlhbERyaXZlci0+bmFtZSA9IGJyZC0+U2VyaWFsTmFtZTsKKwlicmQtPlNlcmlhbERyaXZlci0+bmFtZV9iYXNlID0gMDsKKwlicmQtPlNlcmlhbERyaXZlci0+bWFqb3IgPSAwOworCWJyZC0+U2VyaWFsRHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJYnJkLT5TZXJpYWxEcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWJyZC0+U2VyaWFsRHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCWJyZC0+U2VyaWFsRHJpdmVyLT5pbml0X3Rlcm1pb3MgPSBEZ2FwRGVmYXVsdFRlcm1pb3M7CisJYnJkLT5TZXJpYWxEcml2ZXItPmRyaXZlcl9uYW1lID0gRFJWU1RSOworCWJyZC0+U2VyaWFsRHJpdmVyLT5mbGFncyA9IChUVFlfRFJJVkVSX1JFQUxfUkFXIHwKKwkJCQkgICAgVFRZX0RSSVZFUl9EWU5BTUlDX0RFViB8CisJCQkJICAgIFRUWV9EUklWRVJfSEFSRFdBUkVfQlJFQUspOworCisJLyogVGhlIGtlcm5lbCB3YW50cyBzcGFjZSB0byBzdG9yZSBwb2ludGVycyB0byB0dHlfc3RydWN0cyAqLworCWJyZC0+U2VyaWFsRHJpdmVyLT50dHlzID0KKwkJa3phbGxvYyhNQVhQT1JUUyAqIHNpemVvZihzdHJ1Y3QgdHR5X3N0cnVjdCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicmQtPlNlcmlhbERyaXZlci0+dHR5cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIEVudHJ5IHBvaW50cyBmb3IgZHJpdmVyLiAgQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgZnJvbQorCSAqIHR0eV9pby5jIGFuZCBuX3R0eS5jLgorCSAqLworCXR0eV9zZXRfb3BlcmF0aW9ucyhicmQtPlNlcmlhbERyaXZlciwgJmRnYXBfdHR5X29wcyk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGRvaW5nIHRyYW5zcGFyZW50IHByaW50LCB3ZSBoYXZlIHRvIGRvIGFsbCBvZiB0aGUgYWJvdmUKKwkgKiBhZ2Fpbiwgc2VwYXJhdGVseSBzbyB3ZSBkb24ndCBnZXQgdGhlIExEIGNvbmZ1c2VkIGFib3V0IHdoYXQgbWFqb3IKKwkgKiB3ZSBhcmUgd2hlbiB3ZSBnZXQgaW50byB0aGUgZGdhcF90dHlfb3BlbigpIHJvdXRpbmUuCisJICovCisJYnJkLT5QcmludERyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYUE9SVFMpOworCisJc25wcmludGYoYnJkLT5QcmludE5hbWUsIE1BWFRUWU5BTUVMRU4sICJwcl9kZ2FwXyVkXyIsIGJyZC0+Ym9hcmRudW0pOworCWJyZC0+UHJpbnREcml2ZXItPm5hbWUgPSBicmQtPlByaW50TmFtZTsKKwlicmQtPlByaW50RHJpdmVyLT5uYW1lX2Jhc2UgPSAwOworCWJyZC0+UHJpbnREcml2ZXItPm1ham9yID0gMDsKKwlicmQtPlByaW50RHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJYnJkLT5QcmludERyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJYnJkLT5QcmludERyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlicmQtPlByaW50RHJpdmVyLT5pbml0X3Rlcm1pb3MgPSBEZ2FwRGVmYXVsdFRlcm1pb3M7CisJYnJkLT5QcmludERyaXZlci0+ZHJpdmVyX25hbWUgPSBEUlZTVFI7CisJYnJkLT5QcmludERyaXZlci0+ZmxhZ3MgPSAoVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCQkJICAgVFRZX0RSSVZFUl9EWU5BTUlDX0RFViB8CisJCQkJICAgVFRZX0RSSVZFUl9IQVJEV0FSRV9CUkVBSyk7CisKKwkvKiBUaGUga2VybmVsIHdhbnRzIHNwYWNlIHRvIHN0b3JlIHBvaW50ZXJzIHRvIHR0eV9zdHJ1Y3RzICovCisJYnJkLT5QcmludERyaXZlci0+dHR5cyA9CisJCWt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOworCWlmICghYnJkLT5QcmludERyaXZlci0+dHR5cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIEVudHJ5IHBvaW50cyBmb3IgZHJpdmVyLiAgQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgZnJvbQorCSAqIHR0eV9pby5jIGFuZCBuX3R0eS5jLgorCSAqLworCXR0eV9zZXRfb3BlcmF0aW9ucyhicmQtPlByaW50RHJpdmVyLCAmZGdhcF90dHlfb3BzKTsKKworCWlmICghYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkKSB7CisJCS8qIFJlZ2lzdGVyIHR0eSBkZXZpY2VzICovCisJCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihicmQtPlNlcmlhbERyaXZlcik7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IFRSVUU7CisJCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlNlcmlhbERyaXZlci0+bWFqb3JdID0gYnJkOworCQlicmQtPmRnYXBfU2VyaWFsX01ham9yID0gYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yOworCX0KKworCWlmICghYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCkgeworCQkvKiBSZWdpc3RlciBUcmFuc3BhcmVudCBQcmludCBkZXZpY2VzICovCisJCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IFRSVUU7CisJCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlByaW50RHJpdmVyLT5tYWpvcl0gPSBicmQ7CisJCWJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yID0gYnJkLT5QcmludERyaXZlci0+bWFqb3I7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKgorICogZGdhcF90dHlfaW5pdCgpCisgKgorICogSW5pdCB0aGUgdHR5IHN1YnN5c3RlbS4gIENhbGxlZCBvbmNlIHBlciBib2FyZCBhZnRlciBib2FyZCBoYXMgYmVlbgorICogZG93bmxvYWRlZCBhbmQgaW5pdCdlZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJaW50IGk7CisJaW50IHRsdzsKKwl1aW50IHRydWVfY291bnQgPSAwOworCXVjaGFyICp2YWRkcjsKKwl1Y2hhciBtb2RlbSA9IDA7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IGJzX3QgKmJzOworCXN0cnVjdCBjbV90ICpjbTsKKworCWlmICghYnJkKQorCQlyZXR1cm4gLUVOWElPOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJvYXJkIHN0cnVjdHVyZSBlbGVtZW50cy4KKwkgKi8KKworCXZhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKKwl0cnVlX2NvdW50ID0gcmVhZHcoKHZhZGRyICsgTkNIQU4pKTsKKworCWJyZC0+bmFzeW5jID0gZGdhcF9jb25maWdfZ2V0X251bV9wcnRzKGJyZCk7CisKKwlpZiAoIWJyZC0+bmFzeW5jKQorCQlicmQtPm5hc3luYyA9IGJyZC0+bWF4cG9ydHM7CisKKwlpZiAoYnJkLT5uYXN5bmMgPiBicmQtPm1heHBvcnRzKQorCQlicmQtPm5hc3luYyA9IGJyZC0+bWF4cG9ydHM7CisKKwlpZiAodHJ1ZV9jb3VudCAhPSBicmQtPm5hc3luYykgeworCQlpZiAoKGJyZC0+dHlwZSA9PSBQUENNKSAmJiAodHJ1ZV9jb3VudCA9PSA2NCkpIHsKKwkJCXByX3dhcm4oImRnYXA6ICVzIGNvbmZpZ3VyZWQgZm9yICVkIHBvcnRzLCBoYXMgJWQgcG9ydHMuXG4iLAorCQkJCWJyZC0+bmFtZSwgYnJkLT5uYXN5bmMsIHRydWVfY291bnQpOworCQkJcHJfd2FybigiZGdhcDogUGxlYXNlIG1ha2UgU1VSRSB0aGUgRUJJIGNhYmxlIHJ1bm5pbmcgZnJvbSB0aGUgY2FyZFxuIik7CisJCQlwcl93YXJuKCJkZ2FwOiB0byBlYWNoIEVNIG1vZHVsZSBpcyBwbHVnZ2VkIGludG8gRUJJIElOIVxuIik7CisJCX0gZWxzZSBpZiAoKGJyZC0+dHlwZSA9PSBQUENNKSAmJiAodHJ1ZV9jb3VudCA9PSAwKSkgeworCQkJcHJfd2FybigiZGdhcDogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cbiIsCisJCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCk7CisJCQlwcl93YXJuKCJkZ2FwOiBQbGVhc2UgbWFrZSBTVVJFIHRoZSBFQkkgY2FibGUgcnVubmluZyBmcm9tIHRoZSBjYXJkXG4iKTsKKwkJCXByX3dhcm4oImRnYXA6IHRvIGVhY2ggRU0gbW9kdWxlIGlzIHBsdWdnZWQgaW50byBFQkkgSU4hXG4iKTsKKwkJfSBlbHNlCisJCQlwcl93YXJuKCJkZ2FwOiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuIiwKKwkJCQlicmQtPm5hbWUsIGJyZC0+bmFzeW5jLCB0cnVlX2NvdW50KTsKKworCQlicmQtPm5hc3luYyA9IHRydWVfY291bnQ7CisKKwkJLyogSWYgbm8gcG9ydHMsIGRvbid0IGJvdGhlciBnb2luZyBhbnkgZnVydGhlciAqLworCQlpZiAoIWJyZC0+bmFzeW5jKSB7CisJCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGNoYW5uZWwgbWVtb3J5IHRoYXQgbWlnaHQgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKwkgKiB3aGVuIHRoZSBkcml2ZXIgd2FzIGZpcnN0IGxvYWRlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykgeworCQlpZiAoIWJyZC0+Y2hhbm5lbHNbaV0pIHsKKwkJCWJyZC0+Y2hhbm5lbHNbaV0gPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX3QpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghYnJkLT5jaGFubmVsc1tpXSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWNoID0gYnJkLT5jaGFubmVsc1swXTsKKwl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisKKwlicyA9IChzdHJ1Y3QgYnNfdCAqKSAoKHVsb25nKSB2YWRkciArIENIQU5CVUYpOworCWNtID0gKHN0cnVjdCBjbV90ICopICgodWxvbmcpIHZhZGRyICsgQ01EQlVGKTsKKworCWJyZC0+YmRfYnMgPSBiczsKKworCS8qIFNldCB1cCBjaGFubmVsIHZhcmlhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrLCBjaCA9IGJyZC0+Y2hhbm5lbHNbaV0sIGJzKyspIHsKKworCQlpZiAoIWJyZC0+Y2hhbm5lbHNbaV0pCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2tfaW5pdCgmY2gtPmNoX2xvY2spOworCisJCS8qIFN0b3JlIGFsbCBvdXIgbWFnaWMgbnVtYmVycyAqLworCQljaC0+bWFnaWMgPSBER0FQX0NIQU5ORUxfTUFHSUM7CisJCWNoLT5jaF90dW4ubWFnaWMgPSBER0FQX1VOSVRfTUFHSUM7CisJCWNoLT5jaF90dW4udW5fdHlwZSA9IERHQVBfU0VSSUFMOworCQljaC0+Y2hfdHVuLnVuX2NoID0gY2g7CisJCWNoLT5jaF90dW4udW5fZGV2ID0gaTsKKworCQljaC0+Y2hfcHVuLm1hZ2ljID0gREdBUF9VTklUX01BR0lDOworCQljaC0+Y2hfcHVuLnVuX3R5cGUgPSBER0FQX1BSSU5UOworCQljaC0+Y2hfcHVuLnVuX2NoID0gY2g7CisJCWNoLT5jaF9wdW4udW5fZGV2ID0gaTsKKworCQljaC0+Y2hfdmFkZHIgPSB2YWRkcjsKKwkJY2gtPmNoX2JzID0gYnM7CisJCWNoLT5jaF9jbSA9IGNtOworCQljaC0+Y2hfYmQgPSBicmQ7CisJCWNoLT5jaF9wb3J0bnVtID0gaTsKKwkJY2gtPmNoX2RpZ2kgPSBkZ2FwX2RpZ2lfaW5pdDsKKworCQkvKgorCQkgKiBTZXQgdXAgZGlnaSBkc3IgYW5kIGRjZCBiaXRzIGJhc2VkIG9uIGFsdHBpbiBmbGFnLgorCQkgKi8KKwkJaWYgKGRnYXBfY29uZmlnX2dldF9hbHRwaW4oYnJkKSkgeworCQkJY2gtPmNoX2Rzcgk9IERNX0NEOworCQkJY2gtPmNoX2NkCT0gRE1fRFNSOworCQkJY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyB8PSBESUdJX0FMVFBJTjsKKwkJfSBlbHNlIHsKKwkJCWNoLT5jaF9jZAk9IERNX0NEOworCQkJY2gtPmNoX2Rzcgk9IERNX0RTUjsKKwkJfQorCisJCWNoLT5jaF90YWRkciA9IHZhZGRyICsgKChjaC0+Y2hfYnMtPnR4X3NlZykgPDwgNCk7CisJCWNoLT5jaF9yYWRkciA9IHZhZGRyICsgKChjaC0+Y2hfYnMtPnJ4X3NlZykgPDwgNCk7CisJCWNoLT5jaF90eF93aW4gPSAwOworCQljaC0+Y2hfcnhfd2luID0gMDsKKwkJY2gtPmNoX3RzaXplID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X21heCkpICsgMTsKKwkJY2gtPmNoX3JzaXplID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X21heCkpICsgMTsKKwkJY2gtPmNoX3RzdGFydCA9IDA7CisJCWNoLT5jaF9yc3RhcnQgPSAwOworCisJCS8qIC4yNSBzZWNvbmQgZGVsYXkgKi8KKwkJY2gtPmNoX2Nsb3NlX2RlbGF5ID0gMjUwOworCisJCS8qCisJCSAqIFNldCBxdWV1ZSB3YXRlciBtYXJrcywgaW50ZXJydXB0IG1hc2ssCisJCSAqIGFuZCBnZW5lcmFsIHR0eSBwYXJhbWV0ZXJzLgorCQkgKi8KKwkJdGx3ID0gY2gtPmNoX3RzaXplID49IDIwMDAgPyAoKGNoLT5jaF90c2l6ZSAqIDUpIC8gOCkgOgorCQkJCQkJY2gtPmNoX3RzaXplIC8gMjsKKwkJY2gtPmNoX3RsdyA9IHRsdzsKKworCQlkZ2FwX2NtZHcoY2gsIFNUTE9XLCB0bHcsIDApOworCisJCWRnYXBfY21kdyhjaCwgU1JMT1csIGNoLT5jaF9yc2l6ZSAvIDIsIDApOworCisJCWRnYXBfY21kdyhjaCwgU1JISUdILCA3ICogY2gtPmNoX3JzaXplIC8gOCwgMCk7CisKKwkJY2gtPmNoX21pc3RhdCA9IHJlYWRiKCYoY2gtPmNoX2JzLT5tX3N0YXQpKTsKKworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jaF90dW4udW5fZmxhZ3Nfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jaF9wdW4udW5fZmxhZ3Nfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jaF9zbmlmZl93YWl0KTsKKworCQkvKiBUdXJuIG9uIGFsbCBtb2RlbSBpbnRlcnJ1cHRzIGZvciBub3cgKi8KKwkJbW9kZW0gPSAoRE1fQ0QgfCBETV9EU1IgfCBETV9DVFMgfCBETV9SSSk7CisJCXdyaXRlYihtb2RlbSwgJihjaC0+Y2hfYnMtPm1faW50KSk7CisKKwkJLyoKKwkJICogU2V0IGVkZWxheSB0byAwIGlmIGludGVycnVwdHMgYXJlIHR1cm5lZCBvbiwKKwkJICogb3RoZXJ3aXNlIHNldCBlZGVsYXkgdG8gdGhlIHVzdWFsIDEwMC4KKwkJICovCisJCWlmIChicmQtPmludHJfdXNlZCkKKwkJCXdyaXRldygwLCAmKGNoLT5jaF9icy0+ZWRlbGF5KSk7CisJCWVsc2UKKwkJCXdyaXRldygxMDAsICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKKworCQl3cml0ZWIoMSwgJihjaC0+Y2hfYnMtPmlkYXRhKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV91bmluaXQoKQorICoKKyAqIFVuaW5pdGlhbGl6ZSB0aGUgVFRZIHBvcnRpb24gb2YgdGhpcyBkcml2ZXIuICBGcmVlIGFsbCBtZW1vcnkgYW5kCisgKiByZXNvdXJjZXMuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3VuaW5pdChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgaSA9IDA7CisKKwlpZiAoYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkKSB7CisJCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlNlcmlhbERyaXZlci0+bWFqb3JdID0gTlVMTDsKKwkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7CisJCQl0dHlfcG9ydF9kZXN0cm95KCZicmQtPlNlcmlhbFBvcnRzW2ldKTsKKwkJCWRldiA9IGJyZC0+Y2hhbm5lbHNbaV0tPmNoX3R1bi51bl9zeXNmczsKKwkJCWRnYXBfcmVtb3ZlX3R0eV9zeXNmcyhkZXYpOworCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+U2VyaWFsRHJpdmVyLCBpKTsKKwkJfQorCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOworCQlrZnJlZShicmQtPlNlcmlhbERyaXZlci0+dHR5cyk7CisJCWJyZC0+U2VyaWFsRHJpdmVyLT50dHlzID0gTlVMTDsKKwkJcHV0X3R0eV9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOworCQlrZnJlZShicmQtPlNlcmlhbFBvcnRzKTsKKwkJYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkID0gRkFMU0U7CisJfQorCisJaWYgKGJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKKwkJZGdhcF9Cb2FyZHNCeU1ham9yW2JyZC0+UHJpbnREcml2ZXItPm1ham9yXSA9IE5VTEw7CisJCWJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKKwkJCXR0eV9wb3J0X2Rlc3Ryb3koJmJyZC0+UHJpbnRlclBvcnRzW2ldKTsKKwkJCWRldiA9IGJyZC0+Y2hhbm5lbHNbaV0tPmNoX3B1bi51bl9zeXNmczsKKwkJCWRnYXBfcmVtb3ZlX3R0eV9zeXNmcyhkZXYpOworCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+UHJpbnREcml2ZXIsIGkpOworCQl9CisJCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKKwkJa2ZyZWUoYnJkLT5QcmludERyaXZlci0+dHR5cyk7CisJCWJyZC0+UHJpbnREcml2ZXItPnR0eXMgPSBOVUxMOworCQlwdXRfdHR5X2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKKwkJa2ZyZWUoYnJkLT5QcmludGVyUG9ydHMpOworCQlicmQtPmRnYXBfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkID0gRkFMU0U7CisJfQorfQorCisjZGVmaW5lIFRNUEJVRkxFTiAoMTAyNCkKKy8qCisgKiBkZ2FwX3NuaWZmIC0gRHVtcCBkYXRhIG91dCB0byB0aGUgInNuaWZmIiBidWZmZXIgaWYgdGhlCisgKiBwcm9jIHNuaWZmIGZpbGUgaXMgb3BlbmVkLi4uCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfc25pZmZfbm93YWl0X25vbG9jayhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgKnRleHQsCisJCQkJICAgICB1Y2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCBuOworCWludCByOworCWludCBuYnVmOworCWludCBpOworCWludCB0bXBidWZsZW47CisJY2hhciB0bXBidWZbVE1QQlVGTEVOXTsKKwljaGFyICpwID0gdG1wYnVmOworCWludCB0b29fbXVjaF9kYXRhOworCisJLyogTGVhdmUgaWYgc25pZmYgbm90IG9wZW4gKi8KKwlpZiAoIShjaC0+Y2hfc25pZmZfZmxhZ3MgJiBTTklGRl9PUEVOKSkKKwkJcmV0dXJuOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisKKwkvKiBDcmVhdGUgb3VyIGhlYWRlciBmb3IgZGF0YSBkdW1wICovCisJcCArPSBzcHJpbnRmKHAsICI8JWxkICVsZD48JXM+PCIsIHR2LnR2X3NlYywgdHYudHZfdXNlYywgdGV4dCk7CisJdG1wYnVmbGVuID0gcCAtIHRtcGJ1ZjsKKworCWRvIHsKKwkJdG9vX211Y2hfZGF0YSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbiAmJiB0bXBidWZsZW4gPCAoVE1QQlVGTEVOIC0gNCk7IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4ICIsICpidWYpOworCQkJYnVmKys7CisJCQl0bXBidWZsZW4gPSBwIC0gdG1wYnVmOworCQl9CisKKwkJaWYgKHRtcGJ1ZmxlbiA8IChUTVBCVUZMRU4gLSA0KSkgeworCQkJaWYgKGkgPiAwKQorCQkJCXAgKz0gc3ByaW50ZihwIC0gMSwgIiVzXG4iLCAiPiIpOworCQkJZWxzZQorCQkJCXAgKz0gc3ByaW50ZihwLCAiJXNcbiIsICI+Iik7CisJCX0gZWxzZSB7CisJCQl0b29fbXVjaF9kYXRhID0gMTsKKwkJCWxlbiAtPSBpOworCQl9CisKKwkJbmJ1ZiA9IHN0cmxlbih0bXBidWYpOworCQlwID0gdG1wYnVmOworCisJCS8qCisJCSAqICBMb29wIHdoaWxlIGRhdGEgcmVtYWlucy4KKwkJICovCisJCXdoaWxlIChuYnVmID4gMCAmJiBjaC0+Y2hfc25pZmZfYnVmKSB7CisJCQkvKgorCQkJICogIERldGVybWluZSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZSBsZWZ0IGluIHRoZQorCQkJICogIGJ1ZmZlci4gIElmIHRoZXJlJ3Mgbm9uZSwgd2FpdCB1bnRpbCBzb21lIGFwcGVhcnMuCisJCQkgKi8KKwkJCW4gPSAoY2gtPmNoX3NuaWZmX291dCAtIGNoLT5jaF9zbmlmZl9pbiAtIDEpICYKKwkJCSAgICAgU05JRkZfTUFTSzsKKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGlzIG5vIHNwYWNlIGxlZnQgdG8gd3JpdGUgdG8gaW4gb3VyIHNuaWZmCisJCQkgKiBidWZmZXIsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkcm9wIHRoZSBkYXRhLgorCQkJICogV2UgKmNhbm5vdCogc2xlZXAgaGVyZSB3YWl0aW5nIGZvciBzcGFjZSwgYmVjYXVzZQorCQkJICogdGhpcyBmdW5jdGlvbiB3YXMgcHJvYmFibHkgY2FsbGVkIGJ5IHRoZQorCQkJICogaW50ZXJydXB0L3RpbWVyIHJvdXRpbmVzIQorCQkJICovCisJCQlpZiAobiA9PSAwKQorCQkJCXJldHVybjsKKworCQkJLyoKKwkJCSAqIENvcHkgYXMgbXVjaCBkYXRhIGFzIHdpbGwgZml0LgorCQkJICovCisKKwkJCWlmIChuID4gbmJ1ZikKKwkJCQluID0gbmJ1ZjsKKworCQkJciA9IFNOSUZGX01BWCAtIGNoLT5jaF9zbmlmZl9pbjsKKworCQkJaWYgKHIgPD0gbikgeworCQkJCW1lbWNweShjaC0+Y2hfc25pZmZfYnVmICsKKwkJCQkgICAgICAgY2gtPmNoX3NuaWZmX2luLCBwLCByKTsKKworCQkJCW4gLT0gcjsKKwkJCQljaC0+Y2hfc25pZmZfaW4gPSAwOworCQkJCXAgKz0gcjsKKwkJCQluYnVmIC09IHI7CisJCQl9CisKKwkJCW1lbWNweShjaC0+Y2hfc25pZmZfYnVmICsgY2gtPmNoX3NuaWZmX2luLCBwLCBuKTsKKworCQkJY2gtPmNoX3NuaWZmX2luICs9IG47CisJCQlwICs9IG47CisJCQluYnVmIC09IG47CisKKwkJCS8qCisJCQkgKiAgV2FrZXVwIGFueSB0aHJlYWQgd2FpdGluZyBmb3IgZGF0YQorCQkJICovCisJCQlpZiAoY2gtPmNoX3NuaWZmX2ZsYWdzICYgU05JRkZfV0FJVF9EQVRBKSB7CisJCQkJY2gtPmNoX3NuaWZmX2ZsYWdzICY9IH5TTklGRl9XQUlUX0RBVEE7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfc25pZmZfd2FpdCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgdXNlciBzZW50IHVzIHRvbyBtdWNoIGRhdGEgdG8gcHVzaCBpbnRvIG91ciB0bXBidWYsCisJCSAqIHdlIG5lZWQgdG8ga2VlcCBsb29waW5nIGFyb3VuZCBvbiBhbGwgdGhlIGRhdGEuCisJCSAqLworCQlpZiAodG9vX211Y2hfZGF0YSkgeworCQkJcCA9IHRtcGJ1ZjsKKwkJCXRtcGJ1ZmxlbiA9IDA7CisJCX0KKworCX0gd2hpbGUgKHRvb19tdWNoX2RhdGEpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICBkZ2FwX2lucHV0IC0gUHJvY2VzcyByZWNlaXZlZCBkYXRhLgorICoKKyAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZGdhcF9pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGJzX3QJKmJzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwl1aW50CXJtYXNrOworCXVpbnQJaGVhZDsKKwl1aW50CXRhaWw7CisJaW50CWRhdGFfbGVuOworCXVsb25nCWxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKwlpbnQgZmxpcF9sZW47CisJaW50IGxlbiA9IDA7CisJaW50IG4gPSAwOworCXVjaGFyICpidWY7CisJdWNoYXIgdG1wY2hhcjsKKwlpbnQgcyA9IDA7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCXRwID0gY2gtPmNoX3R1bi51bl90dHk7CisKKwlicyAgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCS8qCisJICogICAgICBGaWd1cmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBidWZmZXIuCisJICogICAgICBFeGl0IGltbWVkaWF0ZWx5IGlmIG5vbmUuCisJICovCisKKwlybWFzayA9IGNoLT5jaF9yc2l6ZSAtIDE7CisKKwloZWFkID0gcmVhZHcoJihicy0+cnhfaGVhZCkpOworCWhlYWQgJj0gcm1hc2s7CisJdGFpbCA9IHJlYWR3KCYoYnMtPnJ4X3RhaWwpKTsKKwl0YWlsICY9IHJtYXNrOworCisJZGF0YV9sZW4gPSAoaGVhZCAtIHRhaWwpICYgcm1hc2s7CisKKwlpZiAoZGF0YV9sZW4gPT0gMCkgeworCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuLCBvciBDUkVBRCBpcyBvZmYsIGZsdXNoCisJICogaW5wdXQgZGF0YSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorCSAqLworCWlmICgoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKSB8fCAhdHAgIHx8CisJICAgICh0cC0+bWFnaWMgIT0gVFRZX01BR0lDKSB8fAorCSAgICAhKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHx8CisJICAgICEodHAtPnRlcm1pb3MuY19jZmxhZyAmIENSRUFEKSB8fAorCSAgICAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0NMT1NJTkcpKSB7CisKKwkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKKwkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgd2UgYXJlIHRocm90dGxlZCwgc2ltcGx5IGRvbid0IHJlYWQgYW55IGRhdGEuCisJICovCisJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JYQkxPQ0spIHsKKwkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogICAgICBJZ25vcmUgb3J1bnMuCisJICovCisJdG1wY2hhciA9IHJlYWRiKCYoYnMtPm9ydW4pKTsKKwlpZiAodG1wY2hhcikgeworCQljaC0+Y2hfZXJyX292ZXJydW4rKzsKKwkJd3JpdGViKDAsICYoYnMtPm9ydW4pKTsKKwl9CisKKwkvKiBEZWNpZGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gc2VuZCBpbnRvIHRoZSB0dHkgbGF5ZXIgKi8KKwlmbGlwX2xlbiA9IFRUWV9GTElQQlVGX1NJWkU7CisKKwkvKiBDaG9wIGRvd24gdGhlIGxlbmd0aCwgaWYgbmVlZGVkICovCisJbGVuID0gbWluKGRhdGFfbGVuLCBmbGlwX2xlbik7CisJbGVuID0gbWluKGxlbiwgKE5fVFRZX0JVRl9TSVpFIC0gMSkpOworCisJbGQgPSB0dHlfbGRpc2NfcmVmKHRwKTsKKworI2lmZGVmIFRUWV9ET05UX0ZMSVAKKwkvKgorCSAqIElmIHRoZSBET05UX0ZMSVAgZmxhZyBpcyBvbiwgZG9uJ3QgZmx1c2ggb3VyIGJ1ZmZlciwgYW5kIGFjdAorCSAqIGxpa2UgdGhlIGxkIGRvZXNuJ3QgaGF2ZSBhbnkgc3BhY2UgdG8gcHV0IHRoZSBkYXRhIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAodGVzdF9iaXQoVFRZX0RPTlRfRkxJUCwgJnRwLT5mbGFncykpCisJCWxlbiA9IDA7CisjZW5kaWYKKworCS8qCisJICogSWYgd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBsZCwKKwkgKiBkb24ndCBmbHVzaCBvdXIgYnVmZmVyLCBhbmQgYWN0IGxpa2UgdGhlIGxkIGRvZXNuJ3QKKwkgKiBoYXZlIGFueSBzcGFjZSB0byBwdXQgdGhlIGRhdGEgcmlnaHQgbm93LgorCSAqLworCWlmICghbGQpIHsKKwkJbGVuID0gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiBsZCBkb2Vzbid0IGhhdmUgYSBwb2ludGVyIHRvIGEgcmVjZWl2ZV9idWYgZnVuY3Rpb24sCisJCSAqIGZsdXNoIHRoZSBkYXRhLCB0aGVuIGFjdCBsaWtlIHRoZSBsZCBkb2Vzbid0IGhhdmUgYW55CisJCSAqIHNwYWNlIHRvIHB1dCB0aGUgZGF0YSByaWdodCBub3cuCisJCSAqLworCQlpZiAoIWxkLT5vcHMtPnJlY2VpdmVfYnVmKSB7CisJCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOworCQkJbGVuID0gMDsKKwkJfQorCX0KKworCWlmIChsZW4gPD0gMCkgeworCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAobGQpCisJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQlyZXR1cm47CisJfQorCisJYnVmID0gY2gtPmNoX2JkLT5mbGlwYnVmOworCW4gPSBsZW47CisKKwkvKgorCSAqIG4gbm93IGNvbnRhaW5zIHRoZSBtb3N0IGFtb3VudCBvZiBkYXRhIHdlIGNhbiBjb3B5LAorCSAqIGJvdW5kZWQgZWl0aGVyIGJ5IG91ciBidWZmZXIgc2l6ZSBvciB0aGUgYW1vdW50CisJICogb2YgZGF0YSB0aGUgY2FyZCBhY3R1YWxseSBoYXMgcGVuZGluZy4uLgorCSAqLworCXdoaWxlIChuKSB7CisKKwkJcyA9ICgoaGVhZCA+PSB0YWlsKSA/IGhlYWQgOiBjaC0+Y2hfcnNpemUpIC0gdGFpbDsKKwkJcyA9IG1pbihzLCBuKTsKKworCQlpZiAocyA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5X2Zyb21pbyhidWYsIChjaGFyICopIGNoLT5jaF9yYWRkciArIHRhaWwsIHMpOworCQlkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soY2gsICJVU0VSIFJFQUQiLCBidWYsIHMpOworCisJCXRhaWwgKz0gczsKKwkJYnVmICs9IHM7CisKKwkJbiAtPSBzOworCQkvKiBGbGlwIHF1ZXVlIGlmIG5lZWRlZCAqLworCQl0YWlsICY9IHJtYXNrOworCX0KKworCXdyaXRldyh0YWlsLCAmKGJzLT5yeF90YWlsKSk7CisJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJY2gtPmNoX3J4Y291bnQgKz0gbGVuOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgY29tcGxldGVseSByYXcsIHdlIGRvbid0IG5lZWQgdG8gZ28gdGhyb3VnaCBhIGxvdAorCSAqIG9mIHRoZSB0dHkgbGF5ZXJzIHRoYXQgZXhpc3QuCisJICogSW4gdGhpcyBjYXNlLCB3ZSB0YWtlIHRoZSBzaG9ydGVzdCBhbmQgZmFzdGVzdCByb3V0ZSB3ZQorCSAqIGNhbiB0byByZWxheSB0aGUgZGF0YSB0byB0aGUgdXNlci4KKwkgKgorCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBhcmUgbm90IHJhdywgd2UgbmVlZCB0byBnbyB0aHJvdWdoCisJICogdGhlIHR0eSBsYXllciwgd2hpY2ggaGFzIGl0cyBBUEkgbW9yZSB3ZWxsIGRlZmluZWQuCisJICovCisJaWYgKElfUEFSTVJLKHRwKSB8fCBJX0JSS0lOVCh0cCkgfHwgSV9JTlBDSyh0cCkpIHsKKwkJZGdhcF9wYXJpdHlfc2NhbihjaCwgY2gtPmNoX2JkLT5mbGlwYnVmLAorCQkJCSBjaC0+Y2hfYmQtPmZsaXBmbGFnYnVmLCAmbGVuKTsKKworCQlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0cC0+cG9ydCwgbGVuKTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyh0cC0+cG9ydCwgY2gtPmNoX2JkLT5mbGlwYnVmLAorCQkJY2gtPmNoX2JkLT5mbGlwZmxhZ2J1ZiwgbGVuKTsKKwl9IGVsc2UgeworCQlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0cC0+cG9ydCwgbGVuKTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0cC0+cG9ydCwgY2gtPmNoX2JkLT5mbGlwYnVmLCBsZW4pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogVGVsbCB0aGUgdHR5IGxheWVyIGl0cyBva2F5IHRvICJlYXQiIHRoZSBkYXRhIG5vdyAqLworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHRwLT5wb3J0KTsKKworCWlmIChsZCkKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXRlcm1pbmVzIHdoZW4gQ0FSUklFUiBjaGFuZ2VzIHN0YXRlIGFuZCB0YWtlcyBhcHByb3ByaWF0ZQorICogYWN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRnYXBfY2FycmllcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisKKwlpbnQgdmlydF9jYXJyaWVyID0gMDsKKwlpbnQgcGh5c19jYXJyaWVyID0gMDsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwkvKiBNYWtlIHN1cmUgYWx0cGluIGlzIGFsd2F5cyBzZXQgY29ycmVjdGx5ICovCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikgeworCQljaC0+Y2hfZHNyICAgICAgPSBETV9DRDsKKwkJY2gtPmNoX2NkICAgICAgID0gRE1fRFNSOworCX0gZWxzZSB7CisJCWNoLT5jaF9kc3IgICAgICA9IERNX0RTUjsKKwkJY2gtPmNoX2NkICAgICAgID0gRE1fQ0Q7CisJfQorCisJaWYgKGNoLT5jaF9taXN0YXQgJiBEX0NEKGNoKSkKKwkJcGh5c19jYXJyaWVyID0gMTsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkKKwkJdmlydF9jYXJyaWVyID0gMTsKKworCWlmIChjaC0+Y2hfY19jZmxhZyAmIENMT0NBTCkKKwkJdmlydF9jYXJyaWVyID0gMTsKKworCS8qCisJICogVGVzdCBmb3IgYSBWSVJUVUFMIGNhcnJpZXIgdHJhbnNpdGlvbiB0byBISUdILgorCSAqLworCWlmICgoKGNoLT5jaF9mbGFncyAmIENIX0ZDQVIpID09IDApICYmICh2aXJ0X2NhcnJpZXIgPT0gMSkpIHsKKworCQkvKgorCQkgKiBXaGVuIGNhcnJpZXIgcmlzZXMsIHdha2UgYW55IHRocmVhZHMgd2FpdGluZworCQkgKiBmb3IgY2FycmllciBpbiB0aGUgb3BlbiByb3V0aW5lLgorCQkgKi8KKworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKKwl9CisKKwkvKgorCSAqIFRlc3QgZm9yIGEgUEhZU0lDQUwgY2FycmllciB0cmFuc2l0aW9uIHRvIEhJR0guCisJICovCisJaWYgKCgoY2gtPmNoX2ZsYWdzICYgQ0hfQ0QpID09IDApICYmIChwaHlzX2NhcnJpZXIgPT0gMSkpIHsKKworCQkvKgorCQkgKiBXaGVuIGNhcnJpZXIgcmlzZXMsIHdha2UgYW55IHRocmVhZHMgd2FpdGluZworCQkgKiBmb3IgY2FycmllciBpbiB0aGUgb3BlbiByb3V0aW5lLgorCQkgKi8KKworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKKwl9CisKKwkvKgorCSAqICBUZXN0IGZvciBhIFBIWVNJQ0FMIHRyYW5zaXRpb24gdG8gbG93LCBzbyBsb25nIGFzIHdlIGFyZW4ndAorCSAqICBjdXJyZW50bHkgaWdub3JpbmcgcGh5c2ljYWwgdHJhbnNpdGlvbnMgKHdoaWNoIGlzIHdoYXQgInZpcnR1YWwKKwkgKiAgY2FycmllciIgaW5kaWNhdGVzKS4KKwkgKgorCSAqICBUaGUgdHJhbnNpdGlvbiBvZiB0aGUgdmlydHVhbCBjYXJyaWVyIHRvIGxvdyByZWFsbHkgZG9lc24ndAorCSAqICBtYXR0ZXIuLi4gaXQgcmVhbGx5IG9ubHkgbWVhbnMgImlnbm9yZSBjYXJyaWVyIHN0YXRlIiwgbm90CisJICogICJtYWtlIHByZXRlbmQgdGhhdCBjYXJyaWVyIGlzIHRoZXJlIi4KKwkgKi8KKwlpZiAoKHZpcnRfY2FycmllciA9PSAwKSAmJgorCSAgICAoKGNoLT5jaF9mbGFncyAmIENIX0NEKSAhPSAwKSAmJgorCSAgICAocGh5c19jYXJyaWVyID09IDApKSB7CisKKwkJLyoKKwkJICogICBXaGVuIGNhcnJpZXIgZHJvcHM6CisJCSAqCisJCSAqICAgRHJvcCBjYXJyaWVyIG9uIGFsbCBvcGVuIHVuaXRzLgorCQkgKgorCQkgKiAgIEZsdXNoIHF1ZXVlcywgd2FraW5nIHVwIGFueSB0YXNrIHdhaXRpbmcgaW4gdGhlCisJCSAqICAgbGluZSBkaXNjaXBsaW5lLgorCQkgKgorCQkgKiAgIFNlbmQgYSBoYW5ndXAgdG8gdGhlIGNvbnRyb2wgdGVybWluYWwuCisJCSAqCisJCSAqICAgRW5hYmxlIGFsbCBzZWxlY3QgY2FsbHMuCisJCSAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKKworCQlpZiAoY2gtPmNoX3R1bi51bl9vcGVuX2NvdW50ID4gMCkKKwkJCXR0eV9oYW5ndXAoY2gtPmNoX3R1bi51bl90dHkpOworCisJCWlmIChjaC0+Y2hfcHVuLnVuX29wZW5fY291bnQgPiAwKQorCQkJdHR5X2hhbmd1cChjaC0+Y2hfcHVuLnVuX3R0eSk7CisJfQorCisJLyoKKwkgKiAgTWFrZSBzdXJlIHRoYXQgb3VyIGNhY2hlZCB2YWx1ZXMgcmVmbGVjdCB0aGUgY3VycmVudCByZWFsaXR5LgorCSAqLworCWlmICh2aXJ0X2NhcnJpZXIgPT0gMSkKKwkJY2gtPmNoX2ZsYWdzIHw9IENIX0ZDQVI7CisJZWxzZQorCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX0ZDQVI7CisKKwlpZiAocGh5c19jYXJyaWVyID09IDEpCisJCWNoLT5jaF9mbGFncyB8PSBDSF9DRDsKKwllbHNlCisJCWNoLT5jaF9mbGFncyAmPSB+Q0hfQ0Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUVFkgRW50cnkgcG9pbnRzIGFuZCBoZWxwZXIgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRnYXBfdHR5X29wZW4oKQorICoKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBib2FyZF90CSpicmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QJKnVuOworCXN0cnVjdCBic190CSpiczsKKwl1aW50CQltYWpvciA9IDA7CisJdWludAkJbWlub3IgPSAwOworCWludAkJcmMgPSAwOworCXVsb25nCQlsb2NrX2ZsYWdzOworCXVsb25nCQlsb2NrX2ZsYWdzMjsKKwl1MTYJCWhlYWQ7CisKKwlyYyA9IDA7CisKKwltYWpvciA9IE1BSk9SKHR0eV9kZXZudW0odHR5KSk7CisJbWlub3IgPSBNSU5PUih0dHlfZGV2bnVtKHR0eSkpOworCisJaWYgKG1ham9yID4gMjU1KQorCQlyZXR1cm4gLUVOWElPOworCisJLyogR2V0IGJvYXJkIHBvaW50ZXIgZnJvbSBvdXIgYXJyYXkgb2YgbWFqb3JzIHdlIGhhdmUgYWxsb2NhdGVkICovCisJYnJkID0gZGdhcF9Cb2FyZHNCeU1ham9yW21ham9yXTsKKwlpZiAoIWJyZCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qCisJICogSWYgYm9hcmQgaXMgbm90IHlldCB1cCB0byBhIHN0YXRlIG9mIFJFQURZLCBnbyB0bworCSAqIHNsZWVwIHdhaXRpbmcgZm9yIGl0IHRvIGhhcHBlbiBvciB0aGV5IGNhbmNlbCB0aGUgb3Blbi4KKwkgKi8KKwlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShicmQtPnN0YXRlX3dhaXQsCisJCShicmQtPnN0YXRlICYgQk9BUkRfUkVBRFkpKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkvKiBUaGUgd2FpdCBhYm92ZSBzaG91bGQgZ3VhcmFudGVlIHRoaXMgY2Fubm90IGhhcHBlbiAqLworCWlmIChicmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogSWYgb3BlbmVkIGRldmljZSBpcyBncmVhdGVyIHRoYW4gb3VyIG51bWJlciBvZiBwb3J0cywgYmFpbC4gKi8KKwlpZiAoTUlOT1IodHR5X2Rldm51bSh0dHkpKSA+IGJyZC0+bmFzeW5jKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJY2ggPSBicmQtPmNoYW5uZWxzW21pbm9yXTsKKwlpZiAoIWNoKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogR3JhYiBjaGFubmVsIGxvY2sgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCS8qIEZpZ3VyZSBvdXQgb3VyIHR5cGUgKi8KKwlpZiAobWFqb3IgPT0gYnJkLT5kZ2FwX1NlcmlhbF9NYWpvcikgeworCQl1biA9ICZicmQtPmNoYW5uZWxzW21pbm9yXS0+Y2hfdHVuOworCQl1bi0+dW5fdHlwZSA9IERHQVBfU0VSSUFMOworCX0gZWxzZSBpZiAobWFqb3IgPT0gYnJkLT5kZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3IpIHsKKwkJdW4gPSAmYnJkLT5jaGFubmVsc1ttaW5vcl0tPmNoX3B1bjsKKwkJdW4tPnVuX3R5cGUgPSBER0FQX1BSSU5UOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogU3RvcmUgb3VyIHVuaXQgaW50byBkcml2ZXJfZGF0YSwgc28gd2UgYWx3YXlzIGhhdmUgaXQgYXZhaWxhYmxlLiAqLworCXR0eS0+ZHJpdmVyX2RhdGEgPSB1bjsKKworCS8qCisJICogRXJyb3IgaWYgY2hhbm5lbCBpbmZvIHBvaW50ZXIgaXMgTlVMTC4KKwkgKi8KKwlicyA9IGNoLT5jaF9iczsKKwlpZiAoIWJzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHR0eSdzCisJICovCisJaWYgKCEodW4tPnVuX2ZsYWdzICYgVU5fSVNPUEVOKSkgeworCQkvKiBTdG9yZSBpbXBvcnRhbnQgdmFyaWFibGVzLiAqLworCQl1bi0+dW5fdHR5ICAgICA9IHR0eTsKKworCQkvKiBNYXliZSBkbyBzb21ldGhpbmcgaGVyZSB0byB0aGUgVFRZIHN0cnVjdCBhcyB3ZWxsPyAqLworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBpZiBuZWl0aGVyIHRlcm1pbmFsIG9yIHByaW50ZXIgaXMgb3Blbi4KKwkgKi8KKwlpZiAoISgoY2gtPmNoX3R1bi51bl9mbGFncyB8IGNoLT5jaF9wdW4udW5fZmxhZ3MpICYgVU5fSVNPUEVOKSkgeworCisJCWNoLT5jaF9tZm9yY2UgPSAwOworCQljaC0+Y2hfbXZhbCA9IDA7CisKKwkJLyoKKwkJICogRmx1c2ggaW5wdXQgcXVldWUuCisJCSAqLworCQloZWFkID0gcmVhZHcoJihicy0+cnhfaGVhZCkpOworCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOworCisJCWNoLT5jaF9mbGFncyA9IDA7CisJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7CisJCWNoLT5wc2Nhbl9zYXZlY2hhciA9IDA7CisKKwkJY2gtPmNoX2NfY2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2NmbGFnOworCQljaC0+Y2hfY19pZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfaWZsYWc7CisJCWNoLT5jaF9jX29mbGFnICAgPSB0dHktPnRlcm1pb3MuY19vZmxhZzsKKwkJY2gtPmNoX2NfbGZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2xmbGFnOworCQljaC0+Y2hfc3RhcnRjID0gdHR5LT50ZXJtaW9zLmNfY2NbVlNUQVJUXTsKKwkJY2gtPmNoX3N0b3BjICA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVE9QXTsKKworCQkvKiBUT0RPOiBmbHVzaCBvdXIgVFRZIHN0cnVjdCBoZXJlPyAqLworCX0KKworCWRnYXBfY2FycmllcihjaCk7CisJLyoKKwkgKiBSdW4gcGFyYW0gaW4gY2FzZSB3ZSBjaGFuZ2VkIGFueXRoaW5nCisJICovCisJZGdhcF9wYXJhbSh0dHkpOworCisJLyoKKwkgKiBmb2xsb3cgcHJvdG9jb2wgZm9yIG9wZW5pbmcgcG9ydAorCSAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmMgPSBkZ2FwX2Jsb2NrX3RpbF9yZWFkeSh0dHksIGZpbGUsIGNoKTsKKworCWlmICghdW4tPnVuX3R0eSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBObyBnb2luZyBiYWNrIG5vdywgaW5jcmVtZW50IG91ciB1bml0IGFuZCBjaGFubmVsIGNvdW50ZXJzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwljaC0+Y2hfb3Blbl9jb3VudCsrOworCXVuLT51bl9vcGVuX2NvdW50Kys7CisJdW4tPnVuX2ZsYWdzIHw9IChVTl9JU09QRU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIGRnYXBfYmxvY2tfdGlsX3JlYWR5KCkKKyAqCisgKiBXYWl0IGZvciBEQ0QsIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIGludCBkZ2FwX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1aW50CW9sZF9mbGFncyA9IDA7CisJaW50IHNsZWVwX29uX3VuX2ZsYWdzID0gMDsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDIHx8ICFmaWxlIHx8ICFjaCB8fAorCQljaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwljaC0+Y2hfd29wZW4rKzsKKworCS8qIExvb3AgZm9yZXZlciAqLworCXdoaWxlICgxKSB7CisKKwkJc2xlZXBfb25fdW5fZmxhZ3MgPSAwOworCisJCS8qCisJCSAqIElmIGJvYXJkIGhhcyBmYWlsZWQgc29tZWhvdyBkdXJpbmcgb3VyIHNsZWVwLAorCQkgKiBiYWlsIHdpdGggZXJyb3IuCisJCSAqLworCQlpZiAoY2gtPmNoX2JkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKKwkJCXJldHZhbCA9IC1FTlhJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSWYgdHR5IHdhcyBodW5nIHVwLCBicmVhayBvdXQgb2YgbG9vcCBhbmQgc2V0IGVycm9yLiAqLworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxlKSkgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWYgZWl0aGVyIHVuaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZnJhZ2lsZSBwYXJ0IG9mIGNsb3NlLAorCQkgKiB3ZSBqdXN0IGNhbm5vdCB0b3VjaCB0aGUgY2hhbm5lbCBzYWZlbHkuCisJCSAqIEdvIGJhY2sgdG8gc2xlZXAsIGtub3dpbmcgdGhhdCB3aGVuIHRoZSBjaGFubmVsIGNhbiBiZQorCQkgKiB0b3VjaGVkIHNhZmVseSwgdGhlIGNsb3NlIHJvdXRpbmUgd2lsbCBzaWduYWwgdGhlCisJCSAqIGNoX3dhaXRfZmxhZ3MgdG8gd2FrZSB1cyBiYWNrIHVwLgorCQkgKi8KKwkJaWYgKCEoKGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSAmCisJCSAgICAgIFVOX0NMT1NJTkcpKSB7CisKKwkJCS8qCisJCQkgKiBPdXIgY29uZGl0aW9ucyB0byBsZWF2ZSBjbGVhbmx5IGFuZCBoYXBwaWx5OgorCQkJICogMSkgTk9OQkxPQ0tJTkcgb24gdGhlIHR0eSBpcyBzZXQuCisJCQkgKiAyKSBDTE9DQUwgaXMgc2V0LgorCQkJICogMykgRENEIChmYWtlIG9yIHJlYWwpIGlzIGFjdGl2ZS4KKwkJCSAqLworCisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJYnJlYWs7CisKKwkJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJCQlicmVhazsKKworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0NEKQorCQkJCWJyZWFrOworCisJCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfRkNBUikKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXNsZWVwX29uX3VuX2ZsYWdzID0gMTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGEgc2lnbmFsIHBlbmRpbmcsIHRoZSB1c2VyIHByb2JhYmx5CisJCSAqIGludGVycnVwdGVkIChjdHJsLWMpIHVzLgorCQkgKiBMZWF2ZSBsb29wIHdpdGggZXJyb3Igc2V0LgorCQkgKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFN0b3JlIHRoZSBmbGFncyBiZWZvcmUgd2UgbGV0IGdvIG9mIGNoYW5uZWwgbG9jaworCQkgKi8KKwkJaWYgKHNsZWVwX29uX3VuX2ZsYWdzKQorCQkJb2xkX2ZsYWdzID0gY2gtPmNoX3R1bi51bl9mbGFncyB8IGNoLT5jaF9wdW4udW5fZmxhZ3M7CisJCWVsc2UKKwkJCW9sZF9mbGFncyA9IGNoLT5jaF9mbGFnczsKKworCQkvKgorCQkgKiBMZXQgZ28gb2YgY2hhbm5lbCBsb2NrIGJlZm9yZSBjYWxsaW5nIHNjaGVkdWxlLgorCQkgKiBPdXIgcG9sbGVyIHdpbGwgZ2V0IGFueSBGRVAgZXZlbnRzIGFuZCB3YWtlIHVzIHVwIHdoZW4gRENECisJCSAqIGV2ZW50dWFsbHkgZ29lcyBhY3RpdmUuCisJCSAqLworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciBzb21ldGhpbmcgaW4gdGhlIGZsYWdzIHRvIGNoYW5nZQorCQkgKiBmcm9tIHRoZSBjdXJyZW50IHZhbHVlLgorCQkgKi8KKwkJaWYgKHNsZWVwX29uX3VuX2ZsYWdzKSB7CisJCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodW4tPnVuX2ZsYWdzX3dhaXQsCisJCQkJKG9sZF9mbGFncyAhPSAoY2gtPmNoX3R1bi51bl9mbGFncyB8CisJCQkJCSAgICAgICBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSkpOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNoLT5jaF9mbGFnc193YWl0LAorCQkJCShvbGRfZmxhZ3MgIT0gY2gtPmNoX2ZsYWdzKSk7CisJCX0KKworCQkvKgorCQkgKiBXZSBnb3Qgd29rZW4gdXAgZm9yIHNvbWUgcmVhc29uLgorCQkgKiBCZWZvcmUgbG9vcGluZyBhcm91bmQsIGdyYWIgb3VyIGNoYW5uZWwgbG9jay4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJfQorCisJY2gtPmNoX3dvcGVuLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9oYW5ndXAoKQorICoKKyAqIEhhbmd1cCB0aGUgcG9ydC4gIExpa2UgYSBjbG9zZSwgYnV0IGRvbid0IHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbi4KKyAqLworc3RhdGljIHZvaWQgZGdhcF90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QJKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90CSp1bjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCS8qIGZsdXNoIHRoZSB0cmFuc21pdCBxdWV1ZXMgKi8KKwlkZ2FwX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKworfQorCisvKgorICogZGdhcF90dHlfY2xvc2UoKQorICoKKyAqLworc3RhdGljIHZvaWQgZGdhcF90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGt0ZXJtaW9zICp0czsKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nIGxvY2tfZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXRzID0gJnR0eS0+dGVybWlvczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwkvKgorCSAqIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlIG9yIG5vdCAtIGFuZCBpZiB3ZSBhZ3JlZSBhYm91dAorCSAqIHdoaWNoIHR5cGUgb2YgY2xvc2UgaXQgaXMgd2l0aCB0aGUgTGluZSBEaXNjaXBsaW5lCisJICovCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmICh1bi0+dW5fb3Blbl9jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIHVuX29wZW5fY291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCXVuLT51bl9vcGVuX2NvdW50ID0gMTsKKwl9CisKKwlpZiAoLS11bi0+dW5fb3Blbl9jb3VudCA8IDApCisJCXVuLT51bl9vcGVuX2NvdW50ID0gMDsKKworCWNoLT5jaF9vcGVuX2NvdW50LS07CisKKwlpZiAoY2gtPmNoX29wZW5fY291bnQgJiYgdW4tPnVuX29wZW5fY291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogT0ssIGl0cyB0aGUgbGFzdCBjbG9zZSBvbiB0aGUgdW5pdCAqLworCisJdW4tPnVuX2ZsYWdzIHw9IFVOX0NMT1NJTkc7CisKKwl0dHktPmNsb3NpbmcgPSAxOworCisJLyoKKwkgKiBPbmx5IG9mZmljaWFsbHkgY2xvc2UgY2hhbm5lbCBpZiBjb3VudCBpcyAwIGFuZAorCSAqIERJR0lfUFJJTlRFUiBiaXQgaXMgbm90IHNldC4KKwkgKi8KKwlpZiAoKGNoLT5jaF9vcGVuX2NvdW50ID09IDApICYmCisJICAgICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUFJJTlRFUikpIHsKKworCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9SWEJMT0NLKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwkJLyogd2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluICovCisJCS8qIFRoaXMgd2lsbCBhbHNvIHJldHVybiBpZiB3ZSB0YWtlIGFuIGludGVycnVwdCAqLworCisJCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOworCisJCWRnYXBfdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOworCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCXR0eS0+Y2xvc2luZyA9IDA7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBIVVBDTCBzZXQsIGxvd2VyIERUUiBhbmQgUlRTCisJCSAqLworCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBIVVBDTCkgeworCQkJY2gtPmNoX21vc3RhdCAmPSB+KERfUlRTKGNoKXxEX0RUUihjaCkpOworCQkJZGdhcF9jbWRiKGNoLCBTTU9ERU0sIDAsIERfRFRSKGNoKXxEX1JUUyhjaCksIDApOworCisJCQkvKgorCQkJICogR28gdG8gc2xlZXAgdG8gZW5zdXJlIFJUUy9EVFIKKwkJCSAqIGhhdmUgYmVlbiBkcm9wcGVkIGZvciBtb2RlbXMgdG8gc2VlIGl0LgorCQkJICovCisJCQlpZiAoY2gtPmNoX2Nsb3NlX2RlbGF5KSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssCisJCQkJCQkgICAgICAgbG9ja19mbGFncyk7CisJCQkJZGdhcF9tc19zbGVlcChjaC0+Y2hfY2xvc2VfZGVsYXkpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJCQl9CisJCX0KKworCQljaC0+cHNjYW5fc3RhdGUgPSAwOworCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOworCQljaC0+Y2hfYmF1ZF9pbmZvID0gMDsKKworCX0KKworCS8qCisJICogdHVybiBvZmYgcHJpbnQgZGV2aWNlIHdoZW4gY2xvc2luZyBwcmludCBkZXZpY2UuCisJICovCisJaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAgJiYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pKSB7CisJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAorCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOworCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1BST047CisJfQorCisJdW4tPnVuX3R0eSA9IE5VTEw7CisJdW4tPnVuX2ZsYWdzICY9IH4oVU5fSVNPUEVOIHwgVU5fQ0xPU0lORyk7CisJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVuLT51bl9mbGFnc193YWl0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyoKKyAqIGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcigpCisgKgorICogUmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBub3QgYmVlbiB0cmFuc21pdHRlZCB5ZXQuCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUKKyAqIGlzIGRhdGEgd2FpdGluZyB0byBiZSB0cmFuc21pdHRlZC9kcmFpbmVkL2ZsdXNoZWQgb3Igbm90LgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZCA9IE5VTEw7CisJc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOworCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7CisJc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKKwl1Y2hhciB0YnVzeTsKKwl1aW50IGNoYXJzID0gMDsKKwl1MTYgdGhlYWQsIHR0YWlsLCB0bWFzaywgY2hlYWQsIGN0YWlsOworCXVsb25nICAgbG9ja19mbGFncyA9IDA7CisJdWxvbmcgICBsb2NrX2ZsYWdzMiA9IDA7CisKKwlpZiAodHR5ID09IE5VTEwpCisJCXJldHVybiAwOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwlicyA9IGNoLT5jaF9iczsKKwlpZiAoIWJzKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwl0bWFzayA9IChjaC0+Y2hfdHNpemUgLSAxKTsKKworCS8qIEdldCBUcmFuc21pdCBxdWV1ZSBwb2ludGVycyAqLworCXRoZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7CisJdHRhaWwgPSByZWFkdygmKGJzLT50eF90YWlsKSkgJiB0bWFzazsKKworCS8qIEdldCB0YnVzeSBmbGFnICovCisJdGJ1c3kgPSByZWFkYigmKGJzLT50YnVzeSkpOworCisJLyogR2V0IENvbW1hbmQgcXVldWUgcG9pbnRlcnMgKi8KKwljaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2NtLT5jbV9oZWFkKSk7CisJY3RhaWwgPSByZWFkdygmKGNoLT5jaF9jbS0+Y21fdGFpbCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkvKgorCSAqIFRoZSBvbmx5IHdheSB3ZSBrbm93IGZvciBzdXJlIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcKKwkgKiBkYXRhIGxlZnQgdG8gYmUgdHJhbnNmZXJyZWQsIGlzIGlmOgorCSAqIDEpIFRyYW5zbWl0IGhlYWQgYW5kIHRhaWwgYXJlIGVxdWFsIChlbXB0eSkuCisJICogMikgQ29tbWFuZCBxdWV1ZSBoZWFkIGFuZCB0YWlsIGFyZSBlcXVhbCAoZW1wdHkpLgorCSAqIDMpIFRoZSAiVEJVU1kiIGZsYWcgaXMgMC4gKFRyYW5zbWl0dGVyIG5vdCBidXN5KS4KKwkgKi8KKworCWlmICgodHRhaWwgPT0gdGhlYWQpICYmICh0YnVzeSA9PSAwKSAmJiAoY2hlYWQgPT0gY3RhaWwpKSB7CisJCWNoYXJzID0gMDsKKwl9IGVsc2UgeworCQlpZiAodGhlYWQgPj0gdHRhaWwpCisJCQljaGFycyA9IHRoZWFkIC0gdHRhaWw7CisJCWVsc2UKKwkJCWNoYXJzID0gdGhlYWQgLSB0dGFpbCArIGNoLT5jaF90c2l6ZTsKKwkJLyoKKwkJICogRnVkZ2UgZmFjdG9yIGhlcmUuCisJCSAqIElmIGNoYXJzIGlzIHplcm8sIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBxdWV1ZSBoYWQKKwkJICogc29tZXRoaW5nIGluIGl0IG9yIHRidXN5IHdhcyBzZXQuICBCZWNhdXNlIHdlIGNhbm5vdAorCQkgKiBiZSBzdXJlIGlmIHRoZXJlIGlzIHN0aWxsIHNvbWUgZGF0YSB0byBiZSB0cmFuc21pdHRlZCwKKwkJICogbGV0cyBsaWUsIGFuZCB0ZWxsIGxkIHdlIGhhdmUgMSBieXRlIGxlZnQuCisJCSAqLworCQlpZiAoY2hhcnMgPT0gMCkgeworCQkJLyoKKwkJCSAqIElmIFRCVVNZIGlzIHN0aWxsIHNldCwgYW5kIG91ciB0eCBidWZmZXJzIGFyZSBlbXB0eSwKKwkJCSAqIGZvcmNlIHRoZSBmaXJtd2FyZSB0byBzZW5kIG1lIGFub3RoZXIgd2FrZXVwIGFmdGVyCisJCQkgKiBUQlVTWSBoYXMgYmVlbiBjbGVhcmVkLgorCQkJICovCisJCQlpZiAodGJ1c3kgIT0gMCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOworCQkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywKKwkJCQkJCSAgICAgICBsb2NrX2ZsYWdzKTsKKwkJCX0KKwkJCWNoYXJzID0gMTsKKwkJfQorCX0KKworCXJldHVybiBjaGFyczsKK30KKworc3RhdGljIGludCBkZ2FwX3dhaXRfZm9yX2RyYWluKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXN0cnVjdCBic190ICpiczsKKwlpbnQgcmV0ID0gLUVJTzsKKwl1aW50IGNvdW50ID0gMTsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IDA7CisKKwkvKiBMb29wIHVudGlsIGRhdGEgaXMgZHJhaW5lZCAqLworCXdoaWxlIChjb3VudCAhPSAwKSB7CisKKwkJY291bnQgPSBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIodHR5KTsKKworCQlpZiAoY291bnQgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIFNldCBmbGFnIHdhaXRpbmcgZm9yIGRyYWluICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKKwkJd3JpdGViKDEsICYoYnMtPmllbXB0eSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwkJLyogR28gdG8gc2xlZXAgdGlsbCB3ZSBnZXQgd29rZW4gdXAgKi8KKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHVuLT51bl9mbGFnc193YWl0LAorCQkJCQkoKHVuLT51bl9mbGFncyAmIFVOX0VNUFRZKSA9PSAwKSk7CisJCS8qIElmIHJldCBpcyBub24temVybywgdXNlciBjdHJsLWMnZWQgdXMgKi8KKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJdW4tPnVuX2ZsYWdzICY9IH4oVU5fRU1QVFkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBkZ2FwX21heGNwc19yb29tCisgKgorICogUmVkdWNlcyBieXRlc19hdmFpbGFibGUgdG8gdGhlIG1heCBudW1iZXIgb2YgY2hhcmFjdGVycworICogdGhhdCBjYW4gYmUgc2VudCBjdXJyZW50bHkgZ2l2ZW4gdGhlIG1heGNwcyB2YWx1ZSwgYW5kCisgKiByZXR1cm5zIHRoZSBuZXcgYnl0ZXNfYXZhaWxhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgcHJpbnRlcgorICogb3V0cHV0LgorICovCitzdGF0aWMgaW50IGRnYXBfbWF4Y3BzX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJ5dGVzX2F2YWlsYWJsZSkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKworCWlmICh0dHkgPT0gTlVMTCkKKwkJcmV0dXJuIGJ5dGVzX2F2YWlsYWJsZTsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiBieXRlc19hdmFpbGFibGU7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiBieXRlc19hdmFpbGFibGU7CisKKwkvKgorCSAqIElmIGl0cyBub3QgdGhlIFRyYW5zcGFyZW50IHByaW50IGRldmljZSwgcmV0dXJuCisJICogdGhlIGZ1bGwgZGF0YSBhbW91bnQuCisJICovCisJaWYgKHVuLT51bl90eXBlICE9IERHQVBfUFJJTlQpCisJCXJldHVybiBieXRlc19hdmFpbGFibGU7CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPiAwICYmIGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA+IDApIHsKKwkJaW50IGNwc19saW1pdCA9IDA7CisJCXVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lID0gamlmZmllczsKKwkJdW5zaWduZWQgbG9uZyBidWZmZXJfdGltZSA9IGN1cnJlbnRfdGltZSArCisJCQkoSFogKiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUpIC8KKwkJCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzOworCisJCWlmIChjaC0+Y2hfY3BzdGltZSA8IGN1cnJlbnRfdGltZSkgeworCQkJLyogYnVmZmVyIGlzIGVtcHR5ICovCisJCQljaC0+Y2hfY3BzdGltZSA9IGN1cnJlbnRfdGltZTsgICAvKiByZXNldCBjaF9jcHN0aW1lICovCisJCQljcHNfbGltaXQgPSBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemU7CisJCX0gZWxzZSBpZiAoY2gtPmNoX2Nwc3RpbWUgPCBidWZmZXJfdGltZSkgeworCQkJLyogc3RpbGwgcm9vbSBpbiB0aGUgYnVmZmVyICovCisJCQljcHNfbGltaXQgPSAoKGJ1ZmZlcl90aW1lIC0gY2gtPmNoX2Nwc3RpbWUpICoKKwkJCQkgICAgIGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzKSAvIEhaOworCQl9IGVsc2UgeworCQkJLyogbm8gcm9vbSBpbiB0aGUgYnVmZmVyICovCisJCQljcHNfbGltaXQgPSAwOworCQl9CisKKwkJYnl0ZXNfYXZhaWxhYmxlID0gbWluKGNwc19saW1pdCwgYnl0ZXNfYXZhaWxhYmxlKTsKKwl9CisKKwlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQoc3RydWN0IHVuX3QgKnVuLCB1bnNpZ25lZCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOworCXN0cnVjdCBic190ICpicyA9IE5VTEw7CisKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKwlicyA9IGNoLT5jaF9iczsKKwlpZiAoIWJzKQorCQlyZXR1cm47CisKKwlpZiAoKGV2ZW50ICYgVU5fTE9XKSAhPSAwKSB7CisJCWlmICgodW4tPnVuX2ZsYWdzICYgVU5fTE9XKSA9PSAwKSB7CisJCQl1bi0+dW5fZmxhZ3MgfD0gVU5fTE9XOworCQkJd3JpdGViKDEsICYoYnMtPmlsb3cpKTsKKwkJfQorCX0KKwlpZiAoKGV2ZW50ICYgVU5fTE9XKSAhPSAwKSB7CisJCWlmICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApIHsKKwkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKKwkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKKwkJfQorCX0KK30KKworLyoKKyAqIGRnYXBfdHR5X3dyaXRlX3Jvb20oKQorICoKKyAqIFJldHVybiBzcGFjZSBhdmFpbGFibGUgaW4gVHggYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKKwlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOworCXN0cnVjdCBic190ICpicyA9IE5VTEw7CisJdTE2IGhlYWQsIHRhaWwsIHRtYXNrOworCWludCByZXQgPSAwOworCXVsb25nICAgbG9ja19mbGFncyA9IDA7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuIDA7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwlicyA9IGNoLT5jaF9iczsKKwlpZiAoIWJzKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwl0bWFzayA9IGNoLT5jaF90c2l6ZSAtIDE7CisJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOworCXRhaWwgPSByZWFkdygmKGJzLT50eF90YWlsKSkgJiB0bWFzazsKKworCXJldCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ICs9IGNoLT5jaF90c2l6ZTsKKworCS8qIExpbWl0IHByaW50ZXIgdG8gbWF4Y3BzICovCisJcmV0ID0gZGdhcF9tYXhjcHNfcm9vbSh0dHksIHJldCk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBwcmludGVyIGRldmljZSwgbGVhdmUgc3BhY2UgZm9yCisJICogcG9zc2libHkgYm90aCB0aGUgb24gYW5kIG9mZiBzdHJpbmdzLgorCSAqLworCWlmICh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSB7CisJCWlmICghKGNoLT5jaF9mbGFncyAmIENIX1BST04pKQorCQkJcmV0IC09IGNoLT5jaF9kaWdpLmRpZ2lfb25sZW47CisJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbjsKKwl9IGVsc2UgeworCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikKKwkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbjsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKworCS8qCisJICogU2NoZWR1bGUgRkVQIHRvIHdha2UgdXMgdXAgaWYgbmVlZGVkLgorCSAqCisJICogVE9ETzogIFRoaXMgbWlnaHQgYmUgb3ZlcmtpbGwuLi4KKwkgKiBEbyB3ZSByZWFsbHkgbmVlZCB0byBzY2hlZHVsZSBjYWxsYmFja3MgZnJvbSB0aGUgRkVQCisJICogaW4gZXZlcnkgY2FzZT8gIENhbiB3ZSBnZXQgc21hcnRlciBiYXNlZCBvbiByZXQ/CisJICovCisJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGdhcF90dHlfcHV0X2NoYXIoKQorICoKKyAqIFB1dCBhIGNoYXJhY3RlciBpbnRvIGNoLT5jaF9idWYKKyAqCisgKiAgICAgIC0gdXNlZCBieSB0aGUgbGluZSBkaXNjaXBsaW5lIGZvciBPUE9TVCBwcm9jZXNzaW5nCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKQoreworCS8qCisJICogU2ltcGx5IGNhbGwgdHR5X3dyaXRlLgorCSAqLworCWRnYXBfdHR5X3dyaXRlKHR0eSwgJmMsIDEpOworCXJldHVybiAxOworfQorCisvKgorICogZGdhcF90dHlfd3JpdGUoKQorICoKKyAqIFRha2UgZGF0YSBmcm9tIHRoZSB1c2VyIG9yIGtlcm5lbCBhbmQgc2VuZCBpdCBvdXQgdG8gdGhlIEZFUC4KKyAqIEluIGhlcmUgZXhpc3RzIGFsbCB0aGUgVHJhbnNwYXJlbnQgUHJpbnQgbWFnaWMgYXMgd2VsbC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJaW50IGNvdW50KQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKKwlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOworCXN0cnVjdCBic190ICpicyA9IE5VTEw7CisJY2hhciAqdmFkZHIgPSBOVUxMOworCXUxNiBoZWFkLCB0YWlsLCB0bWFzaywgcmVtYWluOworCWludCBidWZjb3VudCA9IDAsIG4gPSAwOworCWludCBvcmlnX2NvdW50ID0gMDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCisJaWYgKCF0dHkpCisJCXJldHVybiAwOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogU3RvcmUgb3JpZ2luYWwgYW1vdW50IG9mIGNoYXJhY3RlcnMgcGFzc2VkIGluLgorCSAqIFRoaXMgaGVscHMgdG8gZmlndXJlIG91dCBpZiB3ZSBzaG91bGQgYXNrIHRoZSBGRVAKKwkgKiB0byBzZW5kIHVzIGFuIGV2ZW50IHdoZW4gaXQgaGFzIG1vcmUgc3BhY2UgYXZhaWxhYmxlLgorCSAqLworCW9yaWdfY291bnQgPSBjb3VudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwkvKiBHZXQgb3VyIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlIGNoYW5uZWwgZnJvbSB0aGUgYm9hcmQgKi8KKwl0bWFzayA9IGNoLT5jaF90c2l6ZSAtIDE7CisJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOworCXRhaWwgPSByZWFkdygmKGJzLT50eF90YWlsKSkgJiB0bWFzazsKKworCWJ1ZmNvdW50ID0gdGFpbCAtIGhlYWQgLSAxOworCWlmIChidWZjb3VudCA8IDApCisJCWJ1ZmNvdW50ICs9IGNoLT5jaF90c2l6ZTsKKworCS8qCisJICogTGltaXQgcHJpbnRlciBvdXRwdXQgdG8gbWF4Y3BzIG92ZXJhbGwsIHdpdGggYnVyc3RzIGFsbG93ZWQKKwkgKiB1cCB0byBidWZzaXplIGNoYXJhY3RlcnMuCisJICovCisJYnVmY291bnQgPSBkZ2FwX21heGNwc19yb29tKHR0eSwgYnVmY291bnQpOworCisJLyoKKwkgKiBUYWtlIG1pbmltdW0gb2Ygd2hhdCB0aGUgdXNlciB3YW50cyB0byBzZW5kLCBhbmQgdGhlCisJICogc3BhY2UgYXZhaWxhYmxlIGluIHRoZSBGRVAgYnVmZmVyLgorCSAqLworCWNvdW50ID0gbWluKGNvdW50LCBidWZjb3VudCk7CisKKwkvKgorCSAqIEJhaWwgaWYgbm8gc3BhY2UgbGVmdC4KKwkgKi8KKwlpZiAoY291bnQgPD0gMCkgeworCQlkZ2FwX3NldF9maXJtd2FyZV9ldmVudCh1biwgVU5fTE9XIHwgVU5fRU1QVFkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogT3V0cHV0IHRoZSBwcmludGVyIE9OIHN0cmluZywgaWYgd2UgYXJlIGluIHRlcm1pbmFsIG1vZGUsIGJ1dAorCSAqIG5lZWQgdG8gYmUgaW4gcHJpbnRlciBtb2RlLgorCSAqLworCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgJiYgIShjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgeworCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29uc3RyLAorCQkgICAgKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vbmxlbik7CisJCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwkJY2gtPmNoX2ZsYWdzIHw9IENIX1BST047CisJfQorCisJLyoKKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgb3V0cHV0IHRoZSBwcmludGVyIE9GRiBzdHJpbmcsIGlmIHdlIGFyZQorCSAqIGN1cnJlbnRseSBpbiBwcmludGVyIG1vZGUsIGJ1dCBuZWVkIHRvIG91dHB1dCB0byB0aGUgdGVybWluYWwuCisJICovCisJaWYgKCh1bi0+dW5fdHlwZSAhPSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKKwkJZGdhcF93bW92ZShjaCwgY2gtPmNoX2RpZ2kuZGlnaV9vZmZzdHIsCisJCQkoaW50KSBjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbik7CisJCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGNvcHksIG9yCisJICogSSBjYW4ndCBoYW5kbGUgYW55IG1vcmUgZGF0YSwgbGVhdmUuCisJICovCisJaWYgKGNvdW50IDw9IDApIHsKKwkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwluID0gY291bnQ7CisKKwkvKgorCSAqIElmIHRoZSB3cml0ZSB3cmFwcyBvdmVyIHRoZSB0b3Agb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciwKKwkgKiBtb3ZlIHRoZSBwb3J0aW9uIHVwIHRvIHRoZSB3cmFwIHBvaW50LCBhbmQgcmVzZXQgdGhlCisJICogcG9pbnRlcnMgdG8gdGhlIGJvdHRvbS4KKwkgKi8KKwlyZW1haW4gPSBjaC0+Y2hfdHN0YXJ0ICsgY2gtPmNoX3RzaXplIC0gaGVhZDsKKworCWlmIChuID49IHJlbWFpbikgeworCQluIC09IHJlbWFpbjsKKwkJdmFkZHIgPSBjaC0+Y2hfdGFkZHIgKyBoZWFkOworCisJCW1lbWNweV90b2lvKHZhZGRyLCAodWNoYXIgKikgYnVmLCByZW1haW4pOworCQlkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soY2gsICJVU0VSIFdSSVRFIiwgKHVjaGFyICopIGJ1ZiwKKwkJCQkJcmVtYWluKTsKKworCQloZWFkID0gY2gtPmNoX3RzdGFydDsKKwkJYnVmICs9IHJlbWFpbjsKKwl9CisKKwlpZiAobiA+IDApIHsKKworCQkvKgorCQkgKiBNb3ZlIHJlc3Qgb2YgZGF0YS4KKwkJICovCisJCXZhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKKwkJcmVtYWluID0gbjsKKworCQltZW1jcHlfdG9pbyh2YWRkciwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKKwkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBXUklURSIsICh1Y2hhciAqKWJ1ZiwKKwkJCQkJcmVtYWluKTsKKworCQloZWFkICs9IHJlbWFpbjsKKworCX0KKworCWlmIChjb3VudCkgeworCQljaC0+Y2hfdHhjb3VudCArPSBjb3VudDsKKwkJaGVhZCAmPSB0bWFzazsKKwkJd3JpdGV3KGhlYWQsICYoYnMtPnR4X2hlYWQpKTsKKwl9CisKKwlkZ2FwX3NldF9maXJtd2FyZV9ldmVudCh1biwgVU5fTE9XIHwgVU5fRU1QVFkpOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIHRoZSBwcmludCBkZXZpY2UsIGFuZCB0aGUKKwkgKiBwcmludGVyIGlzIHN0aWxsIG9uLCB3ZSBuZWVkIHRvIHR1cm4gaXQKKwkgKiBvZmYgYmVmb3JlIGdvaW5nIGlkbGUuICBJZiB0aGUgYnVmZmVyIGlzCisJICogbm9uLWVtcHR5LCB3YWl0IHVudGlsIGl0IGdvZXMgZW1wdHkuCisJICogT3RoZXJ3aXNlIHR1cm4gaXQgb2ZmIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpICYmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgeworCQl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwkJaWYgKHRhaWwgIT0gaGVhZCkgeworCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOworCQkJd3JpdGViKDEsICYoYnMtPmllbXB0eSkpOworCQl9IGVsc2UgeworCQkJZGdhcF93bW92ZShjaCwgY2gtPmNoX2RpZ2kuZGlnaV9vZmZzdHIsCisJCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOworCQkJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOworCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOworCQl9CisJfQorCisJLyogVXBkYXRlIHByaW50ZXIgYnVmZmVyIGVtcHR5IHRpbWUuICovCisJaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPiAwKQorCSAgICAmJiAoY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplID4gMCkpIHsKKwkJY2gtPmNoX2Nwc3RpbWUgKz0gKEhaICogY291bnQpIC8gY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHM7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogUmV0dXJuIG1vZGVtIHNpZ25hbHMgdG8gbGQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJlc3VsdCA9IC1FSU87CisJdWNoYXIgbXN0YXQgPSAwOworCXVsb25nIGxvY2tfZmxhZ3M7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIHJlc3VsdDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiByZXN1bHQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiByZXN1bHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJbXN0YXQgPSByZWFkYigmKGNoLT5jaF9icy0+bV9zdGF0KSk7CisJLyogQXBwZW5kIGFueSBvdXRib3VuZCBzaWduYWxzIHRoYXQgbWlnaHQgYmUgcGVuZGluZy4uLiAqLworCW1zdGF0IHw9IGNoLT5jaF9tb3N0YXQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXN1bHQgPSAwOworCisJaWYgKG1zdGF0ICYgRF9EVFIoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fRFRSOworCWlmIChtc3RhdCAmIERfUlRTKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX1JUUzsKKwlpZiAobXN0YXQgJiBEX0NUUyhjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9DVFM7CisJaWYgKG1zdGF0ICYgRF9EU1IoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fRFNSOworCWlmIChtc3RhdCAmIERfUkkoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fUkk7CisJaWYgKG1zdGF0ICYgRF9DRChjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9DRDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV90aW9jbXNldCgpCisgKgorICogU2V0IG1vZGVtIHNpZ25hbHMsIGNhbGxlZCBieSBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgcmV0ID0gLUVJTzsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKSB7CisJCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOworCQljaC0+Y2hfbXZhbCAgIHw9IERfUlRTKGNoKTsKKwl9CisKKwlpZiAoc2V0ICYgVElPQ01fRFRSKSB7CisJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOworCQljaC0+Y2hfbXZhbCAgIHw9IERfRFRSKGNoKTsKKwl9CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKKwkJY2gtPmNoX21mb3JjZSB8PSBEX1JUUyhjaCk7CisJCWNoLT5jaF9tdmFsICAgJj0gfihEX1JUUyhjaCkpOworCX0KKworCWlmIChjbGVhciAmIFRJT0NNX0RUUikgeworCQljaC0+Y2hfbWZvcmNlIHw9IERfRFRSKGNoKTsKKwkJY2gtPmNoX212YWwgICAmPSB+KERfRFRSKGNoKSk7CisJfQorCisJZGdhcF9wYXJhbSh0dHkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X3NlbmRfYnJlYWsoKQorICoKKyAqIFNlbmQgYSBCcmVhaywgY2FsbGVkIGJ5IGxkLgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3NlbmRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IG1zZWMpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgcmV0ID0gLUVJTzsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAobXNlYykgeworCWNhc2UgLTE6CisJCW1zZWMgPSAweEZGRkY7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbXNlYyA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1zZWMgLz0gMTA7CisJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisjaWYgMAorCWRnYXBfY21kdyhjaCwgU0JSRUFLLCAodTE2KSBTQlJFQUtfVElNRSwgMCk7CisjZW5kaWYKKwlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgbXNlYywgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfd2FpdF91bnRpbF9zZW50KCkKKyAqCisgKiB3YWl0IHVudGlsIGRhdGEgaGFzIGJlZW4gdHJhbnNtaXR0ZWQsIGNhbGxlZCBieSBsZC4KKyAqLworc3RhdGljIHZvaWQgZGdhcF90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCWRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKK30KKworLyoKKyAqIGRnYXBfc2VuZF94Y2hhcigpCisgKgorICogc2VuZCBhIGhpZ2ggcHJpb3JpdHkgY2hhcmFjdGVyLCBjYWxsZWQgYnkgbGQuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKgorCSAqIFRoaXMgaXMgdGVjaG5pY2FsbHkgd2hhdCB3ZSBzaG91bGQgZG8uCisJICogSG93ZXZlciwgdGhlIE5JU1QgdGVzdHMgc3BlY2lmaWNhbGx5IHdhbnQKKwkgKiB0byBzZWUgZWFjaCBYT04gb3IgWE9GRiBjaGFyYWN0ZXIgdGhhdCBpdAorCSAqIHNlbmRzLCBzbyBsZXRzIGp1c3Qgc2VuZCBlYWNoIGNoYXJhY3RlcgorCSAqIGJ5IGhhbmQuLi4KKwkgKi8KKyNpZiAwCisJaWYgKGMgPT0gU1RPUF9DSEFSKHR0eSkpCisJCWRnYXBfY21kdyhjaCwgUlBBVVNFLCAwLCAwKTsKKwllbHNlIGlmIChjID09IFNUQVJUX0NIQVIodHR5KSkKKwkJZGdhcF9jbWR3KGNoLCBSUkVTVU1FLCAwLCAwKTsKKwllbHNlCisJCWRnYXBfd21vdmUoY2gsICZjLCAxKTsKKyNlbHNlCisJZGdhcF93bW92ZShjaCwgJmMsIDEpOworI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFJldHVybiBtb2RlbSBzaWduYWxzIHRvIGxkLgorICovCitzdGF0aWMgaW50IGRnYXBfZ2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQoreworCWludCByZXN1bHQgPSAwOworCXVjaGFyIG1zdGF0ID0gMDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCWludCByYyA9IDA7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJbXN0YXQgPSByZWFkYigmKGNoLT5jaF9icy0+bV9zdGF0KSk7CisJLyogQXBwZW5kIGFueSBvdXRib3VuZCBzaWduYWxzIHRoYXQgbWlnaHQgYmUgcGVuZGluZy4uLiAqLworCW1zdGF0IHw9IGNoLT5jaF9tb3N0YXQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXN1bHQgPSAwOworCisJaWYgKG1zdGF0ICYgRF9EVFIoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fRFRSOworCWlmIChtc3RhdCAmIERfUlRTKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX1JUUzsKKwlpZiAobXN0YXQgJiBEX0NUUyhjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9DVFM7CisJaWYgKG1zdGF0ICYgRF9EU1IoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fRFNSOworCWlmIChtc3RhdCAmIERfUkkoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fUkk7CisJaWYgKG1zdGF0ICYgRF9DRChjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9DRDsKKworCXJjID0gcHV0X3VzZXIocmVzdWx0LCB2YWx1ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZ2FwX3NldF9tb2RlbV9pbmZvKCkKKyAqCisgKiBTZXQgbW9kZW0gc2lnbmFscywgY2FsbGVkIGJ5IGxkLgorICovCitzdGF0aWMgaW50IGRnYXBfc2V0X21vZGVtX2luZm8oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNvbW1hbmQsCisJCQkJdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgcmV0ID0gLUVOWElPOworCXVuc2lnbmVkIGludCBhcmcgPSAwOworCXVsb25nIGxvY2tfZmxhZ3M7CisJdWxvbmcgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2V0X3VzZXIoYXJnLCB2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgVElPQ01CSVM6CisJCWlmIChhcmcgJiBUSU9DTV9SVFMpIHsKKwkJCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOworCQkJY2gtPmNoX212YWwgICB8PSBEX1JUUyhjaCk7CisJCX0KKworCQlpZiAoYXJnICYgVElPQ01fRFRSKSB7CisJCQljaC0+Y2hfbWZvcmNlIHw9IERfRFRSKGNoKTsKKwkJCWNoLT5jaF9tdmFsICAgfD0gRF9EVFIoY2gpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFRJT0NNQklDOgorCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7CisJCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKKwkJCWNoLT5jaF9tdmFsICAgJj0gfihEX1JUUyhjaCkpOworCQl9CisKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikgeworCQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7CisJCQljaC0+Y2hfbXZhbCAgICY9IH4oRF9EVFIoY2gpKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBUSU9DTVNFVDoKKwkJY2gtPmNoX21mb3JjZSA9IERfRFRSKGNoKXxEX1JUUyhjaCk7CisKKwkJaWYgKGFyZyAmIFRJT0NNX1JUUykKKwkJCWNoLT5jaF9tdmFsIHw9IERfUlRTKGNoKTsKKwkJZWxzZQorCQkJY2gtPmNoX212YWwgJj0gfihEX1JUUyhjaCkpOworCisJCWlmIChhcmcgJiBUSU9DTV9EVFIpCisJCQljaC0+Y2hfbXZhbCB8PSAoRF9EVFIoY2gpKTsKKwkJZWxzZQorCQkJY2gtPmNoX212YWwgJj0gfihEX0RUUihjaCkpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWRnYXBfcGFyYW0odHR5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpZ2V0YSgpCisgKgorICogSW9jdGwgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZGl0dHkuCisgKgorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3QgZGlnaV90IF9fdXNlciAqcmV0aW5mbykKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJc3RydWN0IGRpZ2lfdCB0bXA7CisJdWxvbmcgbG9ja19mbGFnczsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwltZW1jcHkoJnRtcCwgJmNoLT5jaF9kaWdpLCBzaXplb2YodG1wKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lzZXRhKCkKKyAqCisgKiBJb2N0bCB0byBzZXQgdGhlIGluZm9ybWF0aW9uIGZvciBkaXR0eS4KKyAqCisgKgorICoKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCXN0cnVjdCBkaWdpX3QgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXN0cnVjdCBkaWdpX3QgbmV3X2RpZ2k7CisJdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19kaWdpLCBuZXdfaW5mbywgc2l6ZW9mKHN0cnVjdCBkaWdpX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJbWVtY3B5KCZjaC0+Y2hfZGlnaSwgJm5ld19kaWdpLCBzaXplb2Yoc3RydWN0IGRpZ2lfdCkpOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzIDwgMSkKKwkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPSAxOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMTAwMDApCisJCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID0gMTAwMDA7CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplIDwgMTApCisJCWNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA9IDEwOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA8IDEpCisJCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA9IDE7CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyID4gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplKQorCQljaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPSBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemU7CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9vbmxlbiA+IERJR0lfUExFTikKKwkJY2gtPmNoX2RpZ2kuZGlnaV9vbmxlbiA9IERJR0lfUExFTjsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbiA+IERJR0lfUExFTikKKwkJY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4gPSBESUdJX1BMRU47CisKKwlkZ2FwX3BhcmFtKHR0eSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfZGlnaWdldGVkZWxheSgpCisgKgorICogSW9jdGwgdG8gZ2V0IHRoZSBjdXJyZW50IGVkZWxheSBzZXR0aW5nLgorICoKKyAqCisgKgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqcmV0aW5mbykKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHRtcDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCXRtcCA9IHJlYWR3KCYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfZGlnaXNldGVkZWxheSgpCisgKgorICogSW9jdGwgdG8gc2V0IHRoZSBFREVMQVkgc2V0dGluZworICoKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IG5ld19kaWdpOworCXVsb25nIGxvY2tfZmxhZ3M7CisJdWxvbmcgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2RpZ2ksIG5ld19pbmZvLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCXdyaXRldygodTE2KSBuZXdfZGlnaSwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOworCisJZGdhcF9wYXJhbSh0dHkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKCkKKyAqCisgKiBJb2N0bCB0byBnZXQgdGhlIGN1cnJlbnQgY3VzdG9tIGJhdWQgcmF0ZSBzZXR0aW5nLgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJCWludCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCB0bXA7CisJdWxvbmcgbG9ja19mbGFnczsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwl0bXAgPSBkZ2FwX2dldF9jdXN0b21fYmF1ZChjaCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKCkKKyAqCisgKiBJb2N0bCB0byBzZXQgdGhlIGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZworICovCitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJCWludCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWludCBuZXdfcmF0ZTsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3JhdGUsIG5ld19pbmZvLCBzaXplb2YodW5zaWduZWQgaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkJY2gtPmNoX2N1c3RvbV9zcGVlZCA9IG5ld19yYXRlOworCisJCWRnYXBfcGFyYW0odHR5KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3NldF90ZXJtaW9zKCkKKyAqLworc3RhdGljIHZvaWQgZGdhcF90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJY2gtPmNoX2NfY2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2NmbGFnOworCWNoLT5jaF9jX2lmbGFnICAgPSB0dHktPnRlcm1pb3MuY19pZmxhZzsKKwljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7CisJY2gtPmNoX2NfbGZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2xmbGFnOworCWNoLT5jaF9zdGFydGMgICAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RBUlRdOworCWNoLT5jaF9zdG9wYyAgICAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07CisKKwlkZ2FwX2NhcnJpZXIoY2gpOworCWRnYXBfcGFyYW0odHR5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkZ2FwX3R0eV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgICBsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJY2gtPmNoX2ZsYWdzIHw9IChDSF9SWEJMT0NLKTsKKyNpZiAxCisJZGdhcF9jbWR3KGNoLCBSUEFVU0UsIDAsIDApOworI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBkZ2FwX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwljaC0+Y2hfZmxhZ3MgJj0gfihDSF9SWEJMT0NLKTsKKworI2lmIDEKKwlkZ2FwX2NtZHcoY2gsIFJSRVNVTUUsIDAsIDApOworI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZGdhcF90dHlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKK30KKworc3RhdGljIHZvaWQgZGdhcF90dHlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgICBsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJZGdhcF9jbWR3KGNoLCBQQVVTRVRYLCAwLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCit9CisKKy8qCisgKiBkZ2FwX3R0eV9mbHVzaF9jaGFycygpCisgKgorICogRmx1c2ggdGhlIGNvb2sgYnVmZmVyCisgKgorICogTm90ZSB0byBzZWxmLCBhbmQgYW55IG90aGVyIHBvb3Igc291bHMgd2hvIHZlbnR1cmUgaGVyZToKKyAqCisgKiBmbHVzaCBpbiB0aGlzIGNhc2UgRE9FUyBOT1QgbWVhbiBkaXNwb3NlIG9mIHRoZSBkYXRhLgorICogaW5zdGVhZCwgaXQgbWVhbnMgInN0b3AgYnVmZmVyaW5nIGFuZCBzZW5kIGl0IGlmIHlvdQorICogaGF2ZW4ndCBhbHJlYWR5LiIgIEp1c3QgZ3Vlc3MgaG93IEkgZmlndXJlZCB0aGF0IG91dC4uLiAgIFNSVyAyLUp1bi05OAorICoKKyAqIEl0IGlzIGFsc28gYWx3YXlzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCAtIEpBUiA4LVNlcHQtOTkKKyAqLworc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCS8qIFRPRE86IERvIHNvbWV0aGluZyBoZXJlICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyoKKyAqIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcigpCisgKgorICogRmx1c2ggVHggYnVmZmVyIChtYWtlIGluID09IG91dCkKKyAqLworc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKwl1MTYJaGVhZCA9IDA7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJY2gtPmNoX2ZsYWdzICY9IH5DSF9TVE9QOworCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+dHhfaGVhZCkpOworCWRnYXBfY21kdyhjaCwgRkxVU0hUWCwgKHUxNikgaGVhZCwgMCk7CisJZGdhcF9jbWR3KGNoLCBSRVNVTUVUWCwgMCwgMCk7CisJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgeworCQljaC0+Y2hfdHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOworCX0KKwlpZiAoY2gtPmNoX3B1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7CisJCWNoLT5jaF9wdW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9wdW4udW5fZmxhZ3Nfd2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+d3JpdGVfd2FpdCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBJT0NUTCBmdW5jdGlvbiBhbmQgYWxsIG9mIGl0cyBoZWxwZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogZGdhcF90dHlfaW9jdGwoKQorICoKKyAqIFRoZSB1c3VhbCBhc3NvcnRtZW50IG9mIGlvY3RsJ3MKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCByYzsKKwl1MTYJaGVhZCA9IDA7CisJdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyID0gMDsKKwl2b2lkIF9fdXNlciAqdWFyZyA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwlpZiAodW4tPnVuX29wZW5fY291bnQgPD0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoY21kKSB7CisKKwkvKiBIZXJlIGFyZSBhbGwgdGhlIHN0YW5kYXJkIGlvY3RsJ3MgdGhhdCB3ZSBNVVNUIGltcGxlbWVudCAqLworCisJY2FzZSBUQ1NCUks6CisJCS8qCisJCSAqIFRDU0JSSyBpcyBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsKKwkJICogdGhpcyBiZWhhdmlvdXIgaXMgZXhwbG9pdGVkIGJ5IHRjZHJhaW4oKS4KKwkJICoKKwkJICogQWNjb3JkaW5nIHRvIFBPU0lYLjEgc3BlYyAoNy4yLjIuMS4yKSBicmVha3Mgc2hvdWxkIGJlCisJCSAqIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgc28gd2UnbGwgYXNrIGZvciBzb21ldGhpbmcKKwkJICogaW4gdGhlIG1pZGRsZTogMC4zNzUgc2Vjb25kcy4KKwkJICovCisJCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKworCQlpZiAocmMpCisJCQlyZXR1cm4gLUVJTlRSOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJCWlmICgoKGNtZCA9PSBUQ1NCUkspICYmICghYXJnKSkgfHwgKGNtZCA9PSBUQ1NCUktQKSkKKwkJCWRnYXBfY21kdyhjaCwgU0JSRUFLLCAodTE2KSBTQlJFQUtfVElNRSwgMCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCXJldHVybiAwOworCisJY2FzZSBUQ1NCUktQOgorCQkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpCisKKwkJICogQWNjb3JkaW5nIHRvIFBPU0lYLjEgc3BlYyAoNy4yLjIuMS4yKSBicmVha3Mgc2hvdWxkIGJlCisJCSAqIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgc28gd2UnbGwgYXNrIGZvciBzb21ldGhpbmcKKwkJICogaW4gdGhlIG1pZGRsZTogMC4zNzUgc2Vjb25kcy4KKwkJICovCisJCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyZXR1cm4gMDsKKworCWNhc2UgVElPQ1NCUks6CisJCS8qCisJCSAqIEZFUDUgZG9lc24ndCBzdXBwb3J0IHR1cm5pbmcgb24gYSBicmVhayB1bmNvbmRpdGlvbmFsbHkuCisJCSAqIFRoZSBGRVA1IGRldmljZSB3aWxsIHN0b3Agc2VuZGluZyBhIGJyZWFrIGF1dG9tYXRpY2FsbHkKKwkJICogYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lIHZhbHVlIHRoYXQgd2FzIHNlbnQgd2hlbiB0dXJuaW5nIG9uCisJCSAqIHRoZSBicmVhay4KKwkJICovCisJCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyZXR1cm4gMDsKKworCWNhc2UgVElPQ0NCUks6CisJCS8qCisJCSAqIEZFUDUgZG9lc24ndCBzdXBwb3J0IHR1cm5pbmcgb2ZmIGEgYnJlYWsgdW5jb25kaXRpb25hbGx5LgorCQkgKiBUaGUgRkVQNSBkZXZpY2Ugd2lsbCBzdG9wIHNlbmRpbmcgYSBicmVhayBhdXRvbWF0aWNhbGx5CisJCSAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZSB2YWx1ZSB0aGF0IHdhcyBzZW50IHdoZW4gdHVybmluZyBvbgorCQkgKiB0aGUgYnJlYWsuCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAwOworCisJY2FzZSBUSU9DR1NPRlRDQVI6CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCXJjID0gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLAorCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpOworCQlyZXR1cm4gcmM7CisKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCXJjID0gZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQl0dHktPnRlcm1pb3MuY19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJCQkoYXJnID8gQ0xPQ0FMIDogMCkpOworCQlkZ2FwX3BhcmFtKHR0eSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyZXR1cm4gMDsKKworCWNhc2UgVElPQ01HRVQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIGRnYXBfZ2V0X21vZGVtX2luZm8oY2gsIHVhcmcpOworCisJY2FzZSBUSU9DTUJJUzoKKwljYXNlIFRJT0NNQklDOgorCWNhc2UgVElPQ01TRVQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIGRnYXBfc2V0X21vZGVtX2luZm8odHR5LCBjbWQsIHVhcmcpOworCisJCS8qCisJCSAqIEhlcmUgYXJlIGFueSBhZGRpdGlvbmFsIGlvY3RsJ3MgdGhhdCB3ZSB3YW50IHRvIGltcGxlbWVudAorCQkgKi8KKworCWNhc2UgVENGTFNIOgorCQkvKgorCQkgKiBUaGUgbGludXggdHR5IGRyaXZlciBkb2Vzbid0IGhhdmUgYSBmbHVzaAorCQkgKiBpbnB1dCByb3V0aW5lIGZvciB0aGUgZHJpdmVyLCBhc3N1bWluZyBhbGwgYmFja2VkCisJCSAqIHVwIGRhdGEgaXMgaW4gdGhlIGxpbmUgZGlzYy4gYnVmZmVycy4gIEhvd2V2ZXIsCisJCSAqIHdlIGFsbCBrbm93IHRoYXQncyBub3QgdGhlIGNhc2UuICBIZXJlLCB3ZQorCQkgKiBhY3Qgb24gdGhlIGlvY3RsLCBidXQgdGhlbiBsaWUgYW5kIHNheSB3ZSBkaWRuJ3QKKwkJICogc28gdGhlIGxpbmUgZGlzY2lwbGluZSB3aWxsIHByb2Nlc3MgdGhlIGZsdXNoCisJCSAqIGFsc28uCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJjKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKChhcmcgPT0gVENJRkxVU0gpIHx8IChhcmcgPT0gVENJT0ZMVVNIKSkgeworCQkJaWYgKCEodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkpIHsKKwkJCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKKwkJCQl3cml0ZXcoaGVhZCwgJihjaC0+Y2hfYnMtPnJ4X3RhaWwpKTsKKwkJCQl3cml0ZWIoMCwgJihjaC0+Y2hfYnMtPm9ydW4pKTsKKwkJCX0KKwkJfQorCisJCWlmICgoYXJnICE9IFRDT0ZMVVNIKSAmJiAoYXJnICE9IFRDSU9GTFVTSCkpIHsKKwkJCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzIElPQ1RMICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9CisKKwkJY2gtPmNoX2ZsYWdzICY9IH5DSF9TVE9QOworCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKKwkJZGdhcF9jbWR3KGNoLCBGTFVTSFRYLCAodTE2KSBoZWFkLCAwKTsKKwkJZGdhcF9jbWR3KGNoLCBSRVNVTUVUWCwgMCwgMCk7CisJCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKKwkJCWNoLT5jaF90dW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOworCQl9CisJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKKwkJCWNoLT5jaF9wdW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOworCQl9CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPndyaXRlX3dhaXQpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCisJCS8qIENhbid0IGhvbGQgYW55IGxvY2tzIHdoZW4gY2FsbGluZyB0dHlfd2FrZXVwISAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXR0eV93YWtldXAodHR5KTsKKworCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyBJT0NUTCAqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUQ1NFVFNGOgorCWNhc2UgVENTRVRTVzoKKwkJLyoKKwkJICogVGhlIGxpbnV4IHR0eSBkcml2ZXIgZG9lc24ndCBoYXZlIGEgZmx1c2gKKwkJICogaW5wdXQgcm91dGluZSBmb3IgdGhlIGRyaXZlciwgYXNzdW1pbmcgYWxsIGJhY2tlZAorCQkgKiB1cCBkYXRhIGlzIGluIHRoZSBsaW5lIGRpc2MuIGJ1ZmZlcnMuICBIb3dldmVyLAorCQkgKiB3ZSBhbGwga25vdyB0aGF0J3Mgbm90IHRoZSBjYXNlLiAgSGVyZSwgd2UKKwkJICogYWN0IG9uIHRoZSBpb2N0bCwgYnV0IHRoZW4gbGllIGFuZCBzYXkgd2UgZGlkbid0CisJCSAqIHNvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2lsbCBwcm9jZXNzIHRoZSBmbHVzaAorCQkgKiBhbHNvLgorCQkgKi8KKwkJaWYgKGNtZCA9PSBUQ1NFVFNGKSB7CisJCQkvKiBmbHVzaCByeCAqLworCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9TVE9QOworCQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9oZWFkKSk7CisJCQl3cml0ZXcoaGVhZCwgJihjaC0+Y2hfYnMtPnJ4X3RhaWwpKTsKKwkJfQorCisJCS8qIG5vdyB3YWl0IGZvciBhbGwgdGhlIG91dHB1dCB0byBkcmFpbiAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOworCQlpZiAocmMpCisJCQlyZXR1cm4gLUVJTlRSOworCisJCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzICovCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFRDU0VUQVc6CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUQ1hPTkM6CisJCS8qCisJCSAqIFRoZSBMaW51eCBMaW5lIERpc2NpcGxpbmUgKExEKSB3b3VsZCBkbyB0aGlzIGZvciB1cyBpZiB3ZQorCQkgKiBsZXQgaXQsIGJ1dCB3ZSBoYXZlIHRoZSBzcGVjaWFsIGZpcm13YXJlIG9wdGlvbnMgdG8gZG8gdGhpcworCQkgKiB0aGUgInJpZ2h0IHdheSIgcmVnYXJkbGVzcyBvZiBoYXJkd2FyZSBvciBzb2Z0d2FyZSBmbG93CisJCSAqIGNvbnRyb2wgc28gd2UnbGwgZG8gaXQgb3V0c2VsdmVzIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgTEQKKwkJICogZG8gaXQuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJjKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJc3dpdGNoIChhcmcpIHsKKworCQljYXNlIFRDT09OOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWRnYXBfdHR5X3N0YXJ0KHR0eSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUQ09PRkY6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJZGdhcF90dHlfc3RvcCh0dHkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVENJT046CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJLyogTWFrZSB0aGUgbGQgZG8gaXQgKi8KKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWNhc2UgVENJT0ZGOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCS8qIE1ha2UgdGhlIGxkIGRvIGl0ICovCisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQlkZWZhdWx0OgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwljYXNlIERJR0lfR0VUQToKKwkJLyogZ2V0IGluZm9ybWF0aW9uIGZvciBkaXR0eSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3R0eV9kaWdpZ2V0YSh0dHksIHVhcmcpOworCisJY2FzZSBESUdJX1NFVEFXOgorCWNhc2UgRElHSV9TRVRBRjoKKworCQkvKiBzZXQgaW5mb3JtYXRpb24gZm9yIGRpdHR5ICovCisJCWlmIChjbWQgPT0gKERJR0lfU0VUQVcpKSB7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQl9IGVsc2UKKwkJCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQkvKiBmYWxsIHRocnUgKi8KKworCWNhc2UgRElHSV9TRVRBOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3R0eV9kaWdpc2V0YSh0dHksIHVhcmcpOworCisJY2FzZSBESUdJX0dFREVMQVk6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9TRURFTEFZOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3R0eV9kaWdpc2V0ZWRlbGF5KHR0eSwgdWFyZyk7CisKKwljYXNlIERJR0lfR0VUQ1VTVE9NQkFVRDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaWdldGN1c3RvbWJhdWQodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9TRVRDVVNUT01CQVVEOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZCh0dHksIHVhcmcpOworCisJY2FzZSBESUdJX1JFU0VUX1BPUlQ6CisJCWRnYXBfZmlybXdhcmVfcmVzZXRfcG9ydChjaCk7CisJCWRnYXBfcGFyYW0odHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCBkZ2FwX2FmdGVyX2NvbmZpZ19sb2FkZWQoaW50IGJvYXJkKQoreworCS8qCisJICogSW5pdGlhbGl6ZSBLTUUgd2FpdHF1ZXVlcy4uLgorCSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihkZ2FwX0JvYXJkW2JvYXJkXS0+a21lX3dhaXQpKTsKKworCS8qCisJICogYWxsb2NhdGUgZmxpcCBidWZmZXIgZm9yIGJvYXJkLgorCSAqLworCWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwYnVmID0ga21hbGxvYyhNWUZMSVBMRU4sIEdGUF9BVE9NSUMpOworCWlmICghZGdhcF9Cb2FyZFtib2FyZF0tPmZsaXBidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGdhcF9Cb2FyZFtib2FyZF0tPmZsaXBmbGFnYnVmID0ga21hbGxvYyhNWUZMSVBMRU4sIEdGUF9BVE9NSUMpOworCWlmICghZGdhcF9Cb2FyZFtib2FyZF0tPmZsaXBmbGFnYnVmKSB7CisJCWtmcmVlKGRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgcHIgYW5kIHR0eSBkZXZpY2UgZW50cmllcworICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3JlZ2lzdGVyX3BvcnRzKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJaW50IGk7CisKKwlicmQtPlNlcmlhbFBvcnRzID0ga2NhbGxvYyhicmQtPm5hc3luYywgc2l6ZW9mKCpicmQtPlNlcmlhbFBvcnRzKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGJyZC0+U2VyaWFsUG9ydHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspCisJCXR0eV9wb3J0X2luaXQoJmJyZC0+U2VyaWFsUG9ydHNbaV0pOworCisJYnJkLT5QcmludGVyUG9ydHMgPSBrY2FsbG9jKGJyZC0+bmFzeW5jLCBzaXplb2YoKmJyZC0+UHJpbnRlclBvcnRzKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGJyZC0+UHJpbnRlclBvcnRzID09IE5VTEwpIHsKKwkJa2ZyZWUoYnJkLT5TZXJpYWxQb3J0cyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykKKwkJdHR5X3BvcnRfaW5pdCgmYnJkLT5QcmludGVyUG9ydHNbaV0pOworCisJY2ggPSBicmQtPmNoYW5uZWxzWzBdOworCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrLCBjaCA9IGJyZC0+Y2hhbm5lbHNbaV0pIHsKKworCQlzdHJ1Y3QgZGV2aWNlICpjbGFzc3A7CisKKwkJY2xhc3NwID0gdHR5X3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZicmQtPlNlcmlhbFBvcnRzW2ldLAorCQkJCQlicmQtPlNlcmlhbERyaXZlciwKKwkJCQkJYnJkLT5maXJzdG1pbm9yICsgaSwgTlVMTCk7CisKKwkJZGdhcF9jcmVhdGVfdHR5X3N5c2ZzKCZjaC0+Y2hfdHVuLCBjbGFzc3ApOworCQljaC0+Y2hfdHVuLnVuX3N5c2ZzID0gY2xhc3NwOworCisJCWNsYXNzcCA9IHR0eV9wb3J0X3JlZ2lzdGVyX2RldmljZSgmYnJkLT5QcmludGVyUG9ydHNbaV0sCisJCQkJCWJyZC0+UHJpbnREcml2ZXIsCisJCQkJCWJyZC0+Zmlyc3RtaW5vciArIGksIE5VTEwpOworCisJCWRnYXBfY3JlYXRlX3R0eV9zeXNmcygmY2gtPmNoX3B1biwgY2xhc3NwKTsKKwkJY2gtPmNoX3B1bi51bl9zeXNmcyA9IGNsYXNzcDsKKwl9CisJZGdhcF9jcmVhdGVfcG9ydHNfc3lzZmlsZXMoYnJkKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29waWVzIHRoZSBCSU9TIGNvZGUgZnJvbSB0aGUgdXNlciB0byB0aGUgYm9hcmQsCisgKiBhbmQgc3RhcnRzIHRoZSBCSU9TIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfZG9fYmlvc19sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IHVjaGFyICp1YmlvcywgaW50IGxlbikKK3sKKwl1Y2hhciAqYWRkcjsKKwl1aW50IG9mZnNldDsKKwlpbnQgaTsKKworCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQorCQlyZXR1cm47CisKKwlhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKKworCS8qCisJICogY2xlYXIgUE9TVCBhcmVhCisJICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXdyaXRlYigwLCBhZGRyICsgUE9TVEFSRUEgKyBpKTsKKworCS8qCisJICogRG93bmxvYWQgYmlvcworCSAqLworCW9mZnNldCA9IDB4MTAwMDsKKwltZW1jcHlfdG9pbyhhZGRyICsgb2Zmc2V0LCB1YmlvcywgbGVuKTsKKworCXdyaXRlbCgweDBiZjAwNDAxLCBhZGRyKTsKKwl3cml0ZWwoMCwgKGFkZHIgKyA0KSk7CisKKwkvKiBDbGVhciB0aGUgcmVzZXQsIGFuZCBjaGFuZ2Ugc3RhdGVzLiAqLworCXdyaXRlYihGRVBDTFIsIGJyZC0+cmVfbWFwX3BvcnQpOworfQorCisvKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgQklPUyBjb21wbGV0ZWQgcnVubmluZyBvbiB0aGUgY2FyZC4KKyAqLworc3RhdGljIGludCBkZ2FwX2RvX3dhaXRfZm9yX2Jpb3Moc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwl1Y2hhciAqYWRkcjsKKwl1MTYgd29yZDsKKwl1MTYgZXJyMTsKKwl1MTYgZXJyMjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQorCQlyZXR1cm4gcmV0OworCisJYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisJd29yZCA9IHJlYWR3KGFkZHIgKyBQT1NUQVJFQSk7CisKKwkvKgorCSAqIEl0IGNhbiB0YWtlIDUtNiBzZWNvbmRzIGZvciBhIGJvYXJkIHRvCisJICogcGFzcyB0aGUgYmlvcyBzZWxmIHRlc3QgYW5kIHBvc3QgcmVzdWx0cy4KKwkgKiBHaXZlIGl0IDEwIHNlY29uZHMuCisJICovCisJYnJkLT53YWl0X2Zvcl9iaW9zID0gMDsKKwl3aGlsZSAoYnJkLT53YWl0X2Zvcl9iaW9zIDwgMTAwMCkgeworCQkvKiBDaGVjayB0byBzZWUgaWYgQklPUyB0aGlua3MgYm9hcmQgaXMgZ29vZC4gKEdEKS4gKi8KKwkJaWYgKHdvcmQgPT0gKih1MTYgKikgIkdEIikKKwkJCXJldHVybiAxOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMCk7CisJCWJyZC0+d2FpdF9mb3JfYmlvcysrOworCQl3b3JkID0gcmVhZHcoYWRkciArIFBPU1RBUkVBKTsKKwl9CisKKwkvKiBHYXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KKwllcnIxID0gcmVhZHcoYWRkciArIFNFUVVFTkNFKTsKKwllcnIyID0gcmVhZHcoYWRkciArIEVSUk9SKTsKKwlwcl93YXJuKCJkZ2FwOiAlcyBmYWlsZWQgZGlhZ25vc3RpY3MuICBFcnJvciAjKCV4LCV4KS5cbiIsCisJCWJyZC0+bmFtZSwgZXJyMSwgZXJyMik7CisJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwlicmQtPmRwYXN0YXR1cyA9IEJEX05PQklPUzsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDb3BpZXMgdGhlIEZFUCBjb2RlIGZyb20gdGhlIHVzZXIgdG8gdGhlIGJvYXJkLAorICogYW5kIHN0YXJ0cyB0aGUgRkVQIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfZG9fZmVwX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgY29uc3QgdWNoYXIgKnVmZXAsIGludCBsZW4pCit7CisJdWNoYXIgKmFkZHI7CisJdWludCBvZmZzZXQ7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuOworCisJYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKgorCSAqIERvd25sb2FkIEZFUAorCSAqLworCW9mZnNldCA9IDB4MTAwMDsKKwltZW1jcHlfdG9pbyhhZGRyICsgb2Zmc2V0LCB1ZmVwLCBsZW4pOworCisJLyoKKwkgKiBJZiBib2FyZCBpcyBhIGNvbmNlbnRyYXRvciBwcm9kdWN0LCB3ZSBuZWVkIHRvIGdpdmUKKwkgKiBpdCBpdHMgY29uZmlnIHN0cmluZyBkZXNjcmliaW5nIGhvdyB0aGUgY29uY2VudHJhdG9ycyBsb29rLgorCSAqLworCWlmICgoYnJkLT50eXBlID09IFBDWCkgfHwgKGJyZC0+dHlwZSA9PSBQRVBDKSkgeworCQl1Y2hhciBzdHJpbmdbMTAwXTsKKwkJdWNoYXIgKmNvbmZpZywgKnhjb25maWc7CisJCWludCBpID0gMDsKKworCQl4Y29uZmlnID0gZGdhcF9jcmVhdGVfY29uZmlnX3N0cmluZyhicmQsIHN0cmluZyk7CisKKwkJLyogV3JpdGUgc3RyaW5nIHRvIGJvYXJkIG1lbW9yeSAqLworCQljb25maWcgPSBhZGRyICsgQ09ORklHOworCQlmb3IgKDsgaSA8IENPTkZJR1NJWkU7IGkrKywgY29uZmlnKyssIHhjb25maWcrKykgeworCQkJd3JpdGViKCp4Y29uZmlnLCBjb25maWcpOworCQkJaWYgKCgqeGNvbmZpZyAmIDB4ZmYpID09IDB4ZmYpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwl3cml0ZWwoMHhiZmMwMTAwNCwgKGFkZHIgKyAweGMzNCkpOworCXdyaXRlbCgweDMsIChhZGRyICsgMHhjMzApKTsKKworfQorCisvKgorICogV2FpdHMgZm9yIHRoZSBGRVAgdG8gcmVwb3J0IHRoYXRzIGl0cyByZWFkeSBmb3IgdXMgdG8gdXNlLgorICovCitzdGF0aWMgaW50IGRnYXBfZG9fd2FpdF9mb3JfZmVwKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJdWNoYXIgKmFkZHI7CisJdTE2IHdvcmQ7CisJdTE2IGVycjE7CisJdTE2IGVycjI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuIHJldDsKKworCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCXdvcmQgPSByZWFkdyhhZGRyICsgRkVQU1RBVCk7CisKKwkvKgorCSAqIEl0IGNhbiB0YWtlIDItMyBzZWNvbmRzIGZvciB0aGUgRkVQIHRvCisJICogYmUgdXAgYW5kIHJ1bm5pbmcuIEdpdmUgaXQgNSBzZWNzLgorCSAqLworCWJyZC0+d2FpdF9mb3JfZmVwID0gMDsKKwl3aGlsZSAoYnJkLT53YWl0X2Zvcl9mZXAgPCA1MDApIHsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIEZFUCBpcyB1cCBhbmQgcnVubmluZyBub3cuICovCisJCWlmICh3b3JkID09ICoodTE2ICopICJPUyIpIHsKKwkJCS8qCisJCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIGNhbiBzdXBwb3J0IEZFUDUrIGNvbW1hbmRzLgorCQkJKi8KKwkJCXdvcmQgPSByZWFkdyhhZGRyICsgRkVQNV9QTFVTKTsKKwkJCWlmICh3b3JkID09ICoodTE2ICopICI1QSIpCisJCQkJYnJkLT5iZF9mbGFncyB8PSBCRF9GRVA1UExVUzsKKworCQkJcmV0dXJuIDE7CisJCX0KKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQlicmQtPndhaXRfZm9yX2ZlcCsrOworCQl3b3JkID0gcmVhZHcoYWRkciArIEZFUFNUQVQpOworCX0KKworCS8qIEdhdmUgdXAgb24gYm9hcmQgYWZ0ZXIgdG9vIGxvbmcgb2YgdGltZSB0YWtlbiAqLworCWVycjEgPSByZWFkdyhhZGRyICsgU0VRVUVOQ0UpOworCWVycjIgPSByZWFkdyhhZGRyICsgRVJST1IpOworCXByX3dhcm4oImRnYXA6IEZFUE9TIGZvciAlcyBub3QgZnVuY3Rpb25pbmcuICBFcnJvciAjKCV4LCV4KS5cbiIsCisJCWJyZC0+bmFtZSwgZXJyMSwgZXJyMik7CisJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBoeXNpY2FsbHkgZm9yY2VzIHRoZSBGRVA1IGNhcmQgdG8gcmVzZXQgaXRzZWxmLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2RvX3Jlc2V0X2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJdWNoYXIgY2hlY2s7CisJdTMyIGNoZWNrMTsKKwl1MzIgY2hlY2syOworCWludCBpID0gMDsKKworCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8CisJICAgICFicmQtPnJlX21hcF9tZW1iYXNlIHx8ICFicmQtPnJlX21hcF9wb3J0KQorCQlyZXR1cm47CisKKwkvKiBGRVBSU1QgZG9lcyBub3QgdmFyeSBhbW9uZyBzdXBwb3J0ZWQgYm9hcmRzICovCisJd3JpdGViKEZFUFJTVCwgYnJkLT5yZV9tYXBfcG9ydCk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDEwMDA7IGkrKykgeworCQljaGVjayA9IHJlYWRiKGJyZC0+cmVfbWFwX3BvcnQpICYgMHhlOworCQlpZiAoY2hlY2sgPT0gRkVQUlNUKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisKKwl9CisJaWYgKGkgPiAxMDAwKSB7CisJCXByX3dhcm4oImRnYXA6IEJvYXJkIG5vdCByZXNldHRpbmcuLi4gIEZhaWxpbmcgYm9hcmQuXG4iKTsKKwkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIHJlYWxseSBpcyBtZW1vcnkgb3V0IHRoZXJlLgorCSAqLworCXdyaXRlbCgweGE1NWEzY2MzLCAoYnJkLT5yZV9tYXBfbWVtYmFzZSArIExPV01FTSkpOworCXdyaXRlbCgweDVhYTVjMzNjLCAoYnJkLT5yZV9tYXBfbWVtYmFzZSArIEhJR0hNRU0pKTsKKwljaGVjazEgPSByZWFkbChicmQtPnJlX21hcF9tZW1iYXNlICsgTE9XTUVNKTsKKwljaGVjazIgPSByZWFkbChicmQtPnJlX21hcF9tZW1iYXNlICsgSElHSE1FTSk7CisKKwlpZiAoKGNoZWNrMSAhPSAweGE1NWEzY2MzKSB8fCAoY2hlY2syICE9IDB4NWFhNWMzM2MpKSB7CisJCXByX3dhcm4oImRnYXA6IE5vIG1lbW9yeSBhdCAlcCBmb3IgYm9hcmQuXG4iLAorCQkJYnJkLT5yZV9tYXBfbWVtYmFzZSk7CisJCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7CisJCXJldHVybjsKKwl9CisKK30KKworI2lmZGVmIERJR0lfQ09OQ0VOVFJBVE9SU19TVVBQT1JURUQKKy8qCisgKiBTZW5kcyBhIGNvbmNlbnRyYXRvciBpbWFnZSBpbnRvIHRoZSBGRVA1IGJvYXJkLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2RvX2NvbmNfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciAqdWFkZHIsIGludCBsZW4pCit7CisJY2hhciAqdmFkZHI7CisJdTE2IG9mZnNldCA9IDA7CisJc3RydWN0IGRvd25sZF90ICp0b19kcDsKKworCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQorCQlyZXR1cm47CisKKwl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisKKwlvZmZzZXQgPSByZWFkdygodTE2ICopICh2YWRkciArIERPV05SRVEpKTsKKwl0b19kcCA9IChzdHJ1Y3QgZG93bmxkX3QgKikgKHZhZGRyICsgKGludCkgb2Zmc2V0KTsKKwltZW1jcHlfdG9pbyh0b19kcCwgdWFkZHIsIGxlbik7CisKKwkvKiBUZWxsIGNhcmQgd2UgaGF2ZSBkYXRhIGZvciBpdCAqLworCXdyaXRldygwLCB2YWRkciArIChET1dOUkVRKSk7CisKKwlicmQtPmNvbmNfZGxfc3RhdHVzID0gTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFM7Cit9CisjZW5kaWYKKworI2RlZmluZSBFWFBBTlNJT05fUk9NX1NJWkUJKDY0ICogMTAyNCkKKyNkZWZpbmUgRkVQNV9ST01fTUFHSUMJCSgweEZFRkZGRkZGKQorCitzdGF0aWMgdm9pZCBkZ2FwX2dldF92cGQoc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwl1MzIgbWFnaWM7CisJdTMyIGJhc2Vfb2Zmc2V0OworCXUxNiByb21fb2Zmc2V0OworCXUxNiB2cGRfb2Zmc2V0OworCXUxNiBpbWFnZV9sZW5ndGg7CisJdTE2IGk7CisJdWNoYXIgYnl0ZTE7CisJdWNoYXIgYnl0ZTI7CisKKwkvKgorCSAqIFBva2UgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uLgorCSAqIElmIFZQRCBpcyBzdXBwb3J0ZWQsIHRoZSB2YWx1ZSByZWFkIGZyb20gdGhhdCBhZGRyZXNzCisJICogd2lsbCBiZSBub24temVyby4KKwkgKi8KKwltYWdpYyA9IEZFUDVfUk9NX01BR0lDOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJkLT5wZGV2LCBQQ0lfUk9NX0FERFJFU1MsIG1hZ2ljKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJkLT5wZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZtYWdpYyk7CisKKwkvKiBWUEQgbm90IHN1cHBvcnRlZCwgYmFpbCAqLworCWlmICghbWFnaWMpCisJCXJldHVybjsKKworCS8qCisJICogVG8gZ2V0IHRvIHRoZSBPVFBST00gbWVtb3J5LCB3ZSBoYXZlIHRvIHNlbmQgdGhlIGJvYXJkcyBiYXNlCisJICogYWRkcmVzcyBvcidlZCB3aXRoIDEgaW50byB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uLgorCSAqLworCW1hZ2ljID0gYnJkLT5tZW1iYXNlIHwgMHgwMTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmbWFnaWMpOworCisJYnl0ZTEgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlKTsKKwlieXRlMiA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyAxKTsKKworCS8qCisJICogSWYgdGhlIGJvYXJkIGNvcnJlY3RseSBzd2FwcGVkIHRvIHRoZSBPVFBST00gbWVtb3J5LAorCSAqIHRoZSBmaXJzdCAyIGJ5dGVzIChoZWFkZXIpIHNob3VsZCBiZSAweDU1LCAweEFBCisJICovCisJaWYgKGJ5dGUxID09IDB4NTUgJiYgYnl0ZTIgPT0gMHhBQSkgeworCisJCWJhc2Vfb2Zmc2V0ID0gMDsKKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHJ1biB0aHJvdWdoIGFsbCB0aGUgT1RQUk9NIG1lbW9yeSBsb29raW5nCisJCSAqIGZvciB0aGUgVlBEIG9mZnNldC4KKwkJICovCisJCXdoaWxlIChiYXNlX29mZnNldCA8PSBFWFBBTlNJT05fUk9NX1NJWkUpIHsKKworCQkJLyoKKwkJCSAqIExvdHMgb2YgbWFnaWMgbnVtYmVycyBoZXJlLgorCQkJICoKKwkJCSAqIFRoZSBWUEQgb2Zmc2V0IGlzIGxvY2F0ZWQgaW5zaWRlIHRoZSBST00gRGF0YQorCQkJICogU3RydWN0dXJlLgorCQkJICoKKwkJCSAqIFdlIGFsc28gaGF2ZSB0byByZW1lbWJlciB0aGUgbGVuZ3RoIG9mIGVhY2gKKwkJCSAqIFJPTSBEYXRhIFN0cnVjdHVyZSwgc28gd2UgY2FuICJob3AiIHRvIHRoZSBuZXh0CisJCQkgKiBlbnRyeSBpZiB0aGUgVlBEIGlzbid0IGluIHRoZSBjdXJyZW50CisJCQkgKiBST00gRGF0YSBTdHJ1Y3R1cmUuCisJCQkgKi8KKwkJCXJvbV9vZmZzZXQgPSByZWFkdyhicmQtPnJlX21hcF9tZW1iYXNlICsKKwkJCQkJCWJhc2Vfb2Zmc2V0ICsgMHgxOCk7CisJCQlpbWFnZV9sZW5ndGggPSByZWFkdyhicmQtPnJlX21hcF9tZW1iYXNlICsKKwkJCQkJCXJvbV9vZmZzZXQgKyAweDEwKSAqIDUxMjsKKwkJCXZwZF9vZmZzZXQgPSByZWFkdyhicmQtPnJlX21hcF9tZW1iYXNlICsKKwkJCQkJCXJvbV9vZmZzZXQgKyAweDA4KTsKKworCQkJLyogRm91bmQgdGhlIFZQRCBlbnRyeSAqLworCQkJaWYgKHZwZF9vZmZzZXQpCisJCQkJYnJlYWs7CisKKwkJCS8qIFdlIGRpZG4ndCBmaW5kIGEgVlBEIGVudHJ5LCBnbyB0byBuZXh0IFJPTSBlbnRyeS4gKi8KKwkJCWJhc2Vfb2Zmc2V0ICs9IGltYWdlX2xlbmd0aDsKKworCQkJYnl0ZTEgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgYmFzZV9vZmZzZXQpOworCQkJYnl0ZTIgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgYmFzZV9vZmZzZXQgKyAxKTsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXcgUk9NIG9mZnNldCBkb2Vzbid0IGhhdmUgMHg1NSwgMHhBQQorCQkJICogYXMgaXRzIGhlYWRlciwgd2UgaGF2ZSBydW4gb3V0IG9mIFJPTS4KKwkJCSAqLworCQkJaWYgKGJ5dGUxICE9IDB4NTUgfHwgYnl0ZTIgIT0gMHhBQSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYSBWUEQgb2Zmc2V0LCB0aGVuIG1hcmsgdGhlIGJvYXJkCisJCSAqIGFzIGhhdmluZyBhIHZhbGlkIFZQRCwgYW5kIGNvcHkgVlBEU0laRSAoNTEyKSBieXRlcyBvZgorCQkgKiB0aGF0IFZQRCB0byB0aGUgYnVmZmVyIHdlIGhhdmUgaW4gb3VyIGJvYXJkIHN0cnVjdHVyZS4KKwkJICovCisJCWlmICh2cGRfb2Zmc2V0KSB7CisJCQlicmQtPmJkX2ZsYWdzIHw9IEJEX0hBU19WUEQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgVlBEU0laRTsgaSsrKSB7CisJCQkJYnJkLT52cGRbaV0gPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsKKwkJCQkJCQl2cGRfb2Zmc2V0ICsgaSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIE1VU1QgcG9rZSB0aGUgbWFnaWMgbnVtYmVyIGF0IHRoZSBQQ0kgUm9tIEFkZHJlc3MgbG9jYXRpb24gYWdhaW4uCisJICogVGhpcyBtYWtlcyB0aGUgY2FyZCByZXBvcnQgdGhlIHJlZ3VsYXIgYm9hcmQgbWVtb3J5IGJhY2sgdG8gdXMsCisJICogcmF0aGVyIHRoYW4gdGhlIE9UUFJPTSBtZW1vcnkuCisJICovCisJbWFnaWMgPSBGRVA1X1JPTV9NQUdJQzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7Cit9CisKKy8qCisgKiBPdXIgYm9hcmQgcG9sbGVyIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3BvbGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkID0gKHN0cnVjdCBib2FyZF90ICopIGRhdGE7CisJdWxvbmcgIGxvY2tfZmxhZ3M7CisJY2hhciAqdmFkZHI7CisJdTE2IGhlYWQsIHRhaWw7CisKKwlpZiAoIWJkIHx8IChiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykpCisJCXJldHVybjsKKworCWlmIChiZC0+aW5oaWJpdF9wb2xsZXIpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKKworCS8qCisJICogSWYgYm9hcmQgaXMgcmVhZHksIHBhcnNlIGRlZXBlciB0byBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZG8uCisJICovCisJaWYgKGJkLT5zdGF0ZSA9PSBCT0FSRF9SRUFEWSkgeworCisJCXN0cnVjdCBldl90ICplYWRkciA9IE5VTEw7CisKKwkJaWYgKCFiZC0+cmVfbWFwX21lbWJhc2UpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWJkLT5yZV9tYXBfcG9ydCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCFiZC0+bmFzeW5jKQorCQkJZ290byBvdXQ7CisKKwkJZWFkZHIgPSAoc3RydWN0IGV2X3QgKikgKHZhZGRyICsgRVZCVUYpOworCisJCS8qIEdldCBvdXIgaGVhZCBhbmQgdGFpbCAqLworCQloZWFkID0gcmVhZHcoJihlYWRkci0+ZXZfaGVhZCkpOworCQl0YWlsID0gcmVhZHcoJihlYWRkci0+ZXZfdGFpbCkpOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGFuIGV2ZW50IHBlbmRpbmcuIEdvIHNlcnZpY2UgaXQuCisJCSAqLworCQlpZiAoaGVhZCAhPSB0YWlsKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlkZ2FwX2V2ZW50KGJkKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCX0KKworb3V0OgorCQkvKgorCQkgKiBJZiBib2FyZCBpcyBkb2luZyBpbnRlcnJ1cHRzLCBBQ0sgdGhlIGludGVycnVwdC4KKwkJICovCisJCWlmIChiZCAmJiBiZC0+aW50cl9ydW5uaW5nKQorCQkJcmVhZGIoYmQtPnJlX21hcF9wb3J0ICsgMik7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICBkZ2FwX2NtZGIgLSBTZW5kcyBhIDIgYnl0ZSBjb21tYW5kIHRvIHRoZSBGRVAuCisgKgorICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgorICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgYnl0ZTEgICAtIEludGVnZXIgY29udGFpbmluZyBmaXJzdCBieXRlIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgYnl0ZTIgICAtIEludGVnZXIgY29udGFpbmluZyBzZWNvbmQgYnl0ZSB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIG5jbWRzICAgLSBXYWl0IHVudGlsIG5jbWRzIG9yIGZld2VyIGNtZHMgYXJlIGxlZnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGNtZCBidWZmZXIgYmVmb3JlIHJldHVybmluZy4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGRnYXBfY21kYihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1Y2hhciBieXRlMSwKKwkJCXVjaGFyIGJ5dGUyLCB1aW50IG5jbWRzKQoreworCWNoYXIJCSp2YWRkciA9IE5VTEw7CisJc3RydWN0IGNtX3QJKmNtX2FkZHIgPSBOVUxMOworCXVpbnQJCWNvdW50OworCXVpbnQJCW47CisJdTE2CQloZWFkOworCXUxNgkJdGFpbDsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBpZiBib2FyZCBpcyBzdGlsbCBhbGl2ZS4KKwkgKi8KKwlpZiAoY2gtPmNoX2JkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpCisJCXJldHVybjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBwb2ludGVycyBhcmUgaW4gcmFuZ2UgYmVmb3JlCisJICogd3JpdGluZyB0byB0aGUgRkVQIG1lbW9yeS4KKwkgKi8KKwl2YWRkciA9IGNoLT5jaF9iZC0+cmVfbWFwX21lbWJhc2U7CisKKwlpZiAoIXZhZGRyKQorCQlyZXR1cm47CisKKwljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7CisJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgorCSAqLworCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKKwkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KKwkgKi8KKwl3cml0ZWIoY21kLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAwKSk7CisJd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDEpKTsKKwl3cml0ZWIoYnl0ZTEsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKKwl3cml0ZWIoYnl0ZTIsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDMpKTsKKworCWhlYWQgPSAoaGVhZCArIDQpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwl3cml0ZXcoaGVhZCwgJihjbV9hZGRyLT5jbV9oZWFkKSk7CisKKwkvKgorCSAqIFdhaXQgaWYgbmVjZXNzYXJ5IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZAorCSAqIHBvaW50ZXIgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIHRvIHRoZSBGRVAuICAgSWYgdGhlIHRpbWUgc3BlbnQgd2FpdGluZworCSAqIGlzIG91dGxhbmRpc2gsIGRlY2xhcmUgdGhlIEZFUCBkZWFkLgorCSAqLworCWZvciAoY291bnQgPSBkZ2FwX2NvdW50IDs7KSB7CisKKwkJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOworCQl0YWlsID0gcmVhZHcoJihjbV9hZGRyLT5jbV90YWlsKSk7CisKKwkJbiA9IChoZWFkIC0gdGFpbCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKKworCQlpZiAobiA8PSBuY21kcyAqIHNpemVvZihzdHJ1Y3QgY21fdCkpCisJCQlicmVhazsKKworCQlpZiAoLS1jb3VudCA9PSAwKSB7CisJCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICBkZ2FwX2NtZHcgLSBTZW5kcyBhIDEgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCisgKgorICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgorICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAorICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZGdhcF9jbWR3KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1Y2hhciBjbWQsIHUxNiB3b3JkLCB1aW50IG5jbWRzKQoreworCWNoYXIJCSp2YWRkciA9IE5VTEw7CisJc3RydWN0IGNtX3QJKmNtX2FkZHIgPSBOVUxMOworCXVpbnQJCWNvdW50OworCXVpbnQJCW47CisJdTE2CQloZWFkOworCXUxNgkJdGFpbDsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBpZiBib2FyZCBpcyBzdGlsbCBhbGl2ZS4KKwkgKi8KKwlpZiAoY2gtPmNoX2JkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpCisJCXJldHVybjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBwb2ludGVycyBhcmUgaW4gcmFuZ2UgYmVmb3JlCisJICogd3JpdGluZyB0byB0aGUgRkVQIG1lbW9yeS4KKwkgKi8KKwl2YWRkciA9IGNoLT5jaF9iZC0+cmVfbWFwX21lbWJhc2U7CisJaWYgKCF2YWRkcikKKwkJcmV0dXJuOworCisJY21fYWRkciA9IChzdHJ1Y3QgY21fdCAqKSAodmFkZHIgKyBDTURCVUYpOworCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKworCS8qCisJICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KKwkgKi8KKwlpZiAoaGVhZCA+PSAoQ01ETUFYIC0gQ01EU1RBUlQpIHx8IChoZWFkICYgMDMpKSB7CisJCWNoLT5jaF9iZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFB1dCB0aGUgZGF0YSBpbiB0aGUgY2lyY3VsYXIgY29tbWFuZCBidWZmZXIuCisJICovCisJd3JpdGViKGNtZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMCkpOworCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAxKSk7CisJd3JpdGV3KCh1MTYpIHdvcmQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKKworCWhlYWQgPSAoaGVhZCArIDQpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwl3cml0ZXcoaGVhZCwgJihjbV9hZGRyLT5jbV9oZWFkKSk7CisKKwkvKgorCSAqIFdhaXQgaWYgbmVjZXNzYXJ5IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZAorCSAqIHBvaW50ZXIgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIHRvIHRoZSBGRVAuICAgSWYgdGhlIHRpbWUgc3BlbnQgd2FpdGluZworCSAqIGlzIG91dGxhbmRpc2gsIGRlY2xhcmUgdGhlIEZFUCBkZWFkLgorCSAqLworCWZvciAoY291bnQgPSBkZ2FwX2NvdW50IDs7KSB7CisKKwkJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOworCQl0YWlsID0gcmVhZHcoJihjbV9hZGRyLT5jbV90YWlsKSk7CisKKwkJbiA9IChoZWFkIC0gdGFpbCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKKworCQlpZiAobiA8PSBuY21kcyAqIHNpemVvZihzdHJ1Y3QgY21fdCkpCisJCQlicmVhazsKKworCQlpZiAoLS1jb3VudCA9PSAwKSB7CisJCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICBkZ2FwX2NtZHdfZXh0IC0gU2VuZHMgYSBleHRlbmRlZCB3b3JkIGNvbW1hbmQgdG8gdGhlIEZFUC4KKyAqCisgKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCisgKiAgICAgICAgICAgICAgY21kICAgICAtIENvbW1hbmQgdG8gYmUgc2VudC4KKyAqICAgICAgICAgICAgICB3b3JkICAgIC0gSW50ZWdlciBjb250YWluaW5nIHdvcmQgdG8gYmUgc2VudC4KKyAqICAgICAgICAgICAgICBuY21kcyAgIC0gV2FpdCB1bnRpbCBuY21kcyBvciBmZXdlciBjbWRzIGFyZSBsZWZ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjbWQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBkZ2FwX2NtZHdfZXh0KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1MTYgY21kLCB1MTYgd29yZCwgdWludCBuY21kcykKK3sKKwljaGFyCQkqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKKwl1aW50CQljb3VudDsKKwl1aW50CQluOworCXUxNgkJaGVhZDsKKwl1MTYJCXRhaWw7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCisJICovCisJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQorCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCisJICovCisJdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOworCWlmICghdmFkZHIpCisJCXJldHVybjsKKworCWNtX2FkZHIgPSAoc3RydWN0IGNtX3QgKikgKHZhZGRyICsgQ01EQlVGKTsKKwloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7CisKKwkvKgorCSAqIEZvcmdldCBpdCBpZiBwb2ludGVycyBvdXQgb2YgcmFuZ2UuCisJICovCisJaWYgKGhlYWQgPj0gKENNRE1BWCAtIENNRFNUQVJUKSB8fCAoaGVhZCAmIDAzKSkgeworCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBQdXQgdGhlIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGNvbW1hbmQgYnVmZmVyLgorCSAqLworCisJLyogV3JpdGUgYW4gRkYgdG8gdGVsbCB0aGUgRkVQIHRoYXQgd2Ugd2FudCBhbiBleHRlbmRlZCBjb21tYW5kICovCisJd3JpdGViKCh1Y2hhcikgMHhmZiwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMCkpOworCisJd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sICh1Y2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAxKSk7CisJd3JpdGV3KCh1MTYpIGNtZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMikpOworCisJLyoKKwkgKiBJZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGNvbW1hbmQgd29uJ3QgZml0LAorCSAqIHB1dCBpdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaXJjdWxhciBidWZmZXIuCisJICovCisJaWYgKCgoaGVhZCArIDQpID49ICgoQ01ETUFYIC0gQ01EU1RBUlQpKSB8fCAoaGVhZCAmIDAzKSkpCisJCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBDTURTVEFSVCkpOworCWVsc2UKKwkJd3JpdGV3KCh1MTYpIHdvcmQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDQpKTsKKworCWhlYWQgPSAoaGVhZCArIDgpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwl3cml0ZXcoaGVhZCwgJihjbV9hZGRyLT5jbV9oZWFkKSk7CisKKwkvKgorCSAqIFdhaXQgaWYgbmVjZXNzYXJ5IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZAorCSAqIHBvaW50ZXIgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIHRvIHRoZSBGRVAuICAgSWYgdGhlIHRpbWUgc3BlbnQgd2FpdGluZworCSAqIGlzIG91dGxhbmRpc2gsIGRlY2xhcmUgdGhlIEZFUCBkZWFkLgorCSAqLworCWZvciAoY291bnQgPSBkZ2FwX2NvdW50IDs7KSB7CisKKwkJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOworCQl0YWlsID0gcmVhZHcoJihjbV9hZGRyLT5jbV90YWlsKSk7CisKKwkJbiA9IChoZWFkIC0gdGFpbCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKKworCQlpZiAobiA8PSBuY21kcyAqIHNpemVvZihzdHJ1Y3QgY21fdCkpCisJCQlicmVhazsKKworCQlpZiAoLS1jb3VudCA9PSAwKSB7CisJCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICBkZ2FwX3dtb3ZlIC0gV3JpdGUgZGF0YSB0byBGRVAgYnVmZmVyLgorICoKKyAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICBidWYgICAgIC0gUG9pdGVyIHRvIGNoYXJhY3RlcnMgdG8gYmUgbW92ZWQuCisgKiAgICAgICAgICAgICAgY250ICAgICAtIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIG1vdmUuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBkZ2FwX3dtb3ZlKHN0cnVjdCBjaGFubmVsX3QgKmNoLCBjaGFyICpidWYsIHVpbnQgY250KQoreworCWludCAgICBuOworCWNoYXIgICAqdGFkZHI7CisJc3RydWN0IGJzX3QgICAgKmJzOworCXUxNiAgICBoZWFkOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwkvKgorCSAqIENoZWNrIHBhcmFtZXRlcnMuCisJICovCisJYnMgICA9IGNoLT5jaF9iczsKKwloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpOworCisJLyoKKwkgKiBJZiBwb2ludGVycyBhcmUgb3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybi4KKwkgKi8KKwlpZiAoKGNudCA+IGNoLT5jaF90c2l6ZSkgfHwKKwkgICAgKHVuc2lnbmVkKShoZWFkIC0gY2gtPmNoX3RzdGFydCkgPj0gY2gtPmNoX3RzaXplKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHRoZSB3cml0ZSB3cmFwcyBvdmVyIHRoZSB0b3Agb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciwKKwkgKiBtb3ZlIHRoZSBwb3J0aW9uIHVwIHRvIHRoZSB3cmFwIHBvaW50LCBhbmQgcmVzZXQgdGhlCisJICogcG9pbnRlcnMgdG8gdGhlIGJvdHRvbS4KKwkgKi8KKwluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7CisKKwlpZiAoY250ID49IG4pIHsKKwkJY250IC09IG47CisJCXRhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKKwkJbWVtY3B5X3RvaW8odGFkZHIsIGJ1Ziwgbik7CisJCWhlYWQgPSBjaC0+Y2hfdHN0YXJ0OworCQlidWYgKz0gbjsKKwl9CisKKwkvKgorCSAqIE1vdmUgcmVzdCBvZiBkYXRhLgorCSAqLworCXRhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKKwluID0gY250OworCW1lbWNweV90b2lvKHRhZGRyLCBidWYsIG4pOworCWhlYWQgKz0gY250OworCisJd3JpdGV3KGhlYWQsICYoYnMtPnR4X2hlYWQpKTsKK30KKworLyoKKyAqIFJldHJpdmVzIHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgZnJvbSBGRVAgbWVtb3J5LAorICogYW5kIHJldHVybnMgaXQgYmFjayB0byB0aGUgdXNlci4KKyAqIFJldHVybnMgMCBvbiBlcnJvci4KKyAqLworc3RhdGljIHVpbnQgZGdhcF9nZXRfY3VzdG9tX2JhdWQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJdWNoYXIgKnZhZGRyOworCXVsb25nIG9mZnNldCA9IDA7CisJdWludCB2YWx1ZSA9IDA7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCisJaWYgKCFjaC0+Y2hfYmQgfHwgY2gtPmNoX2JkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWlmICghKGNoLT5jaF9iZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykpCisJCXJldHVybiAwOworCisJdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOworCisJaWYgKCF2YWRkcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIEdvIGdldCBmcm9tIGZlcCBtZW0sIHdoYXQgdGhlIGZlcAorCSAqIGJlbGlldmVzIHRoZSBjdXN0b20gYmF1ZCByYXRlIGlzLgorCSAqLworCW9mZnNldCA9ICgoKCgqKHVuc2lnbmVkIHNob3J0ICopKHZhZGRyICsgRUNTX1NFRykpIDw8IDQpICsKKwkJKGNoLT5jaF9wb3J0bnVtICogMHgyOCkgKyBMSU5FX1NQRUVEKSk7CisKKwl2YWx1ZSA9IHJlYWR3KHZhZGRyICsgb2Zmc2V0KTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBDYWxscyB0aGUgZmlybXdhcmUgdG8gcmVzZXQgdGhpcyBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2Zpcm13YXJlX3Jlc2V0X3BvcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJZGdhcF9jbWRiKGNoLCBDSFJFU0VULCAwLCAwLCAwKTsKKworCS8qCisJICogTm93IHRoYXQgdGhlIGNoYW5uZWwgaXMgcmVzZXQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisJICogYWxsIHRoZSBjdXJyZW50IHNldHRpbmdzIGdldCByZWFwcGxpZWQgdG8gdGhlIHBvcnQKKwkgKiBpbiB0aGUgZmlybXdhcmUuCisJICoKKwkgKiBTbyB3ZSB3aWxsIHNldCB0aGUgZHJpdmVyJ3MgY2FjaGUgb2YgZmlybXdhcmUKKwkgKiBzZXR0aW5ncyBhbGwgdG8gMCwgYW5kIHRoZW4gY2FsbCBwYXJhbS4KKwkgKi8KKwljaC0+Y2hfZmVwaWZsYWcgPSAwOworCWNoLT5jaF9mZXBjZmxhZyA9IDA7CisJY2gtPmNoX2ZlcG9mbGFnID0gMDsKKwljaC0+Y2hfZmVwc3RhcnRjID0gMDsKKwljaC0+Y2hfZmVwc3RvcGMgPSAwOworCWNoLT5jaF9mZXBhc3RhcnRjID0gMDsKKwljaC0+Y2hfZmVwYXN0b3BjID0gMDsKKwljaC0+Y2hfbW9zdGF0ID0gMDsKKwljaC0+Y2hfaGZsb3cgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICBkZ2FwX3BhcmFtIC0gU2V0IERpZ2kgcGFyYW1ldGVycy4KKyAqCisgKiAgICAgICAgICAgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKiAgICAgLSBUVFkgZm9yIHBvcnQuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGRnYXBfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRzOworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgYnNfdCAgICpiczsKKwlzdHJ1Y3QgdW5fdCAgICp1bjsKKwl1MTYJaGVhZDsKKwl1MTYJY2ZsYWc7CisJdTE2CWlmbGFnOworCXVjaGFyCW12YWw7CisJdWNoYXIJaGZsb3c7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXVuID0gKHN0cnVjdCB1bl90ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWJzID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybiAtRU5YSU87CisKKwl0cyA9ICZ0dHktPnRlcm1pb3M7CisKKwkvKgorCSAqIElmIGJhdWQgcmF0ZSBpcyB6ZXJvLCBmbHVzaCBxdWV1ZXMsIGFuZCBzZXQgbXZhbCB0byBkcm9wIERUUi4KKwkgKi8KKwlpZiAoKGNoLT5jaF9jX2NmbGFnICYgKENCQVVEKSkgPT0gMCkgeworCisJCS8qIGZsdXNoIHJ4ICovCisJCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOworCQl3cml0ZXcoaGVhZCwgJihjaC0+Y2hfYnMtPnJ4X3RhaWwpKTsKKworCQkvKiBmbHVzaCB0eCAqLworCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKKwkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT50eF90YWlsKSk7CisKKwkJY2gtPmNoX2ZsYWdzIHw9IChDSF9CQVVEMCk7CisKKwkJLyogRHJvcCBSVFMgYW5kIERUUiAqLworCQljaC0+Y2hfbXZhbCAmPSB+KERfUlRTKGNoKXxEX0RUUihjaCkpOworCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOworCQljaC0+Y2hfYmF1ZF9pbmZvID0gMDsKKworCX0gZWxzZSBpZiAoY2gtPmNoX2N1c3RvbV9zcGVlZCAmJiAoYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpKSB7CisJCS8qCisJCSAqIFRlbGwgdGhlIGZlcCB0byBkbyB0aGUgY29tbWFuZAorCQkgKi8KKworCQlkZ2FwX2NtZHdfZXh0KGNoLCAweGZmMDEsIGNoLT5jaF9jdXN0b21fc3BlZWQsIDApOworCisJCS8qCisJCSAqIE5vdyBnbyBnZXQgZnJvbSBmZXAgbWVtLCB3aGF0IHRoZSBmZXAKKwkJICogYmVsaWV2ZXMgdGhlIGN1c3RvbSBiYXVkIHJhdGUgaXMuCisJCSAqLworCQljaC0+Y2hfY3VzdG9tX3NwZWVkID0gZGdhcF9nZXRfY3VzdG9tX2JhdWQoY2gpOworCQljaC0+Y2hfYmF1ZF9pbmZvID0gY2gtPmNoX2N1c3RvbV9zcGVlZDsKKworCQkvKiBIYW5kbGUgdHJhbnNpdGlvbiBmcm9tIEIwICovCisJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9CQVVEMCkgeworCQkJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfQkFVRDApOworCQkJY2gtPmNoX212YWwgfD0gKERfUlRTKGNoKXxEX0RUUihjaCkpOworCQl9CisJCW12YWwgPSBEX0RUUihjaCkgfCBEX1JUUyhjaCk7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZXQgYmF1ZCByYXRlLCBjaGFyYWN0ZXIgc2l6ZSwgYW5kIHBhcml0eS4KKwkJICovCisKKworCQlpbnQgaWluZGV4ID0gMDsKKwkJaW50IGppbmRleCA9IDA7CisJCWludCBiYXVkID0gMDsKKworCQl1bG9uZyBiYXVkc1s0XVsxNl0gPSB7CisJCQl7IC8qIHNsb3diYXVkICovCisJCQkJMCwJNTAsCTc1LAkxMTAsCisJCQkJMTM0LAkxNTAsCTIwMCwJMzAwLAorCQkJCTYwMCwJMTIwMCwJMTgwMCwJMjQwMCwKKwkJCQk0ODAwLAk5NjAwLAkxOTIwMCwJMzg0MDAgfSwKKwkJCXsgLyogc2xvd2JhdWQgJiBDQkFVREVYICovCisJCQkJMCwJNTc2MDAsCTExNTIwMCwJMjMwNDAwLAorCQkJCTQ2MDgwMCwJMTUwLAkyMDAsCTkyMTYwMCwKKwkJCQk2MDAsCTEyMDAsCTE4MDAsCTI0MDAsCisJCQkJNDgwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCisJCQl7IC8qIGZhc3RiYXVkICovCisJCQkJMCwJNTc2MDAsCTc2ODAwLAkxMTUyMDAsCisJCQkJMTQ0MDAsCTU3NjAwLAkyMzA0MDAsCTc2ODAwLAorCQkJCTExNTIwMCwJMjMwNDAwLAkyODgwMCwJNDYwODAwLAorCQkJCTkyMTYwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCisJCQl7IC8qIGZhc3RiYXVkICYgQ0JBVURFWCAqLworCQkJCTAsCTU3NjAwLAkxMTUyMDAsCTIzMDQwMCwKKwkJCQk0NjA4MDAsCTE1MCwJMjAwLAk5MjE2MDAsCisJCQkJNjAwLAkxMjAwLAkxODAwLAkyNDAwLAorCQkJCTQ4MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9CisJCX07CisKKwkJLyoKKwkJICogT25seSB1c2UgdGhlIFRYUHJpbnQgYmF1ZCByYXRlIGlmIHRoZQorCQkgKiB0ZXJtaW5hbCB1bml0IGlzIE5PVCBvcGVuCisJCSAqLworCQlpZiAoIShjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSAmJgorCQkgICAgICh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSkKKwkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3B1bi51bl90dHkpICYgMHhmZjsKKwkJZWxzZQorCQkJYmF1ZCA9IENfQkFVRChjaC0+Y2hfdHVuLnVuX3R0eSkgJiAweGZmOworCisJCWlmIChjaC0+Y2hfY19jZmxhZyAmIENCQVVERVgpCisJCQlpaW5kZXggPSAxOworCisJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKQorCQkJaWluZGV4ICs9IDI7CisKKwkJamluZGV4ID0gYmF1ZDsKKworCQlpZiAoKGlpbmRleCA+PSAwKSAmJiAoaWluZGV4IDwgNCkgJiYKKwkJICAgIChqaW5kZXggPj0gMCkgJiYgKGppbmRleCA8IDE2KSkKKwkJCWJhdWQgPSBiYXVkc1tpaW5kZXhdW2ppbmRleF07CisJCWVsc2UKKwkJCWJhdWQgPSAwOworCisJCWlmIChiYXVkID09IDApCisJCQliYXVkID0gOTYwMDsKKworCQljaC0+Y2hfYmF1ZF9pbmZvID0gYmF1ZDsKKworCQkvKgorCQkgKiBDQkFVRCBoYXMgYml0IHBvc2l0aW9uIDB4MTAwMCBzZXQgdGhlc2UgZGF5cyB0bworCQkgKiBpbmRpY2F0ZSBMaW51eCBiYXVkIHJhdGUgcmVtYXAuCisJCSAqIFdlIHVzZSBhIGRpZmZlcmVudCBiaXQgYXNzaWdubWVudCBmb3IgaGlnaCBzcGVlZC4KKwkJICogQ2xlYXIgdGhpcyBiaXQgb3V0IHdoaWxlIGdyYWJiaW5nIHRoZSBwYXJ0cyBvZgorCQkgKiAiY2ZsYWciIHdlIHdhbnQuCisJCSAqLworCQljZmxhZyA9IGNoLT5jaF9jX2NmbGFnICYgKChDQkFVRCBeIENCQVVERVgpIHwgUEFST0REIHwgUEFSRU5CIHwKKwkJCQkJCSAgIENTVE9QQiB8IENTSVpFKTsKKworCQkvKgorCQkgKiBIVVBDTCBiaXQgaXMgdXNlZCBieSBGRVAgdG8gaW5kaWNhdGUgZmFzdCBiYXVkCisJCSAqIHRhYmxlIGlzIHRvIGJlIHVzZWQuCisJCSAqLworCQlpZiAoKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0ZBU1QpIHx8CisJCSAgICAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKSkKKwkJCWNmbGFnIHw9IEhVUENMOworCisJCWlmICgoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKSAmJgorCQkgICAgIShjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKSkgeworCQkJLyoKKwkJCSAqIFRoZSBiZWxvdyBjb2RlIGlzIHRyeWluZyB0byBndWFyYW50ZWUgdGhhdCBvbmx5CisJCQkgKiBiYXVkIHJhdGVzIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMCBhcmUKKwkJCSAqIHJlbWFwcGVkLiBXZSB1c2UgZXhjbHVzaXZlIG9yICBiZWNhdXNlIHRoZSB2YXJpb3VzCisJCQkgKiBiYXVkIHJhdGVzIHNoYXJlIGNvbW1vbiBiaXQgcG9zaXRpb25zIGFuZCB0aGVyZWZvcmUKKwkJCSAqIGNhbid0IGJlIHRlc3RlZCBmb3IgZWFzaWx5LgorCQkJICovCisJCQl0Y2ZsYWdfdCB0Y2ZsYWcgPSAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVRCkgfCBDQkFVREVYOworCQkJaW50IGJhdWRwYXJ0ID0gMDsKKworCQkJLyoKKwkJCSAqIE1hcCBoaWdoIHNwZWVkIHJlcXVlc3RzIHRvIGluZGV4CisJCQkgKiBpbnRvIEZFUCdzIGJhdWQgdGFibGUKKwkJCSAqLworCQkJc3dpdGNoICh0Y2ZsYWcpIHsKKwkJCWNhc2UgQjU3NjAwOgorCQkJCWJhdWRwYXJ0ID0gMTsKKwkJCQlicmVhazsKKyNpZmRlZiBCNzY4MDAKKwkJCWNhc2UgQjc2ODAwOgorCQkJCWJhdWRwYXJ0ID0gMjsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSBCMTE1MjAwOgorCQkJCWJhdWRwYXJ0ID0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQjIzMDQwMDoKKwkJCQliYXVkcGFydCA9IDk7CisJCQkJYnJlYWs7CisJCQljYXNlIEI0NjA4MDA6CisJCQkJYmF1ZHBhcnQgPSAxMTsKKwkJCQlicmVhazsKKyNpZmRlZiBCOTIxNjAwCisJCQljYXNlIEI5MjE2MDA6CisJCQkJYmF1ZHBhcnQgPSAxMjsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQliYXVkcGFydCA9IDA7CisJCQl9CisKKwkJCWlmIChiYXVkcGFydCkKKwkJCQljZmxhZyA9IChjZmxhZyAmIH4oQ0JBVUQgfCBDQkFVREVYKSkgfCBiYXVkcGFydDsKKwkJfQorCisJCWNmbGFnICY9IDB4ZmZmZjsKKworCQlpZiAoY2ZsYWcgIT0gY2gtPmNoX2ZlcGNmbGFnKSB7CisJCQljaC0+Y2hfZmVwY2ZsYWcgPSAodTE2KSAoY2ZsYWcgJiAweGZmZmYpOworCisJCQkvKgorCQkJICogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkCisJCQkgKiBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcworCQkJICovCisJCQlkZ2FwX2NtZHcoY2gsIFNDRkxBRywgKHUxNikgY2ZsYWcsIDApOworCQl9CisKKwkJLyogSGFuZGxlIHRyYW5zaXRpb24gZnJvbSBCMCAqLworCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQkFVRDApIHsKKwkJCWNoLT5jaF9mbGFncyAmPSB+KENIX0JBVUQwKTsKKwkJCWNoLT5jaF9tdmFsIHw9IChEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJfQorCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOworCX0KKworCS8qCisJICogR2V0IGlucHV0IGZsYWdzLgorCSAqLworCWlmbGFnID0gY2gtPmNoX2NfaWZsYWcgJiAoSUdOQlJLIHwgQlJLSU5UIHwgSUdOUEFSIHwgUEFSTVJLIHwKKwkJCQkgIElOUENLIHwgSVNUUklQIHwgSVhPTiB8IElYQU5ZIHwgSVhPRkYpOworCisJaWYgKChjaC0+Y2hfc3RhcnRjID09IF9QT1NJWF9WRElTQUJMRSkgfHwKKwkgICAgKGNoLT5jaF9zdG9wYyA9PSBfUE9TSVhfVkRJU0FCTEUpKSB7CisJCWlmbGFnICY9IH4oSVhPTiB8IElYT0ZGKTsKKwkJY2gtPmNoX2NfaWZsYWcgJj0gfihJWE9OIHwgSVhPRkYpOworCX0KKworCS8qCisJICogT25seSB0aGUgSUJNIFhyIGNhcmQgY2FuIHN3aXRjaCBiZXR3ZWVuCisJICogMjMyIGFuZCA0MjIgbW9kZXMgb24gdGhlIGZseQorCSAqLworCWlmIChiZC0+ZGV2aWNlID09IFBDSV9ERVZfWFJfSUJNX0RJRCkgeworCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfNDIyKQorCQkJZGdhcF9jbWRiKGNoLCBTQ09NTU9ERSwgTU9ERV80MjIsIDAsIDApOworCQllbHNlCisJCQlkZ2FwX2NtZGIoY2gsIFNDT01NT0RFLCBNT0RFXzIzMiwgMCwgMCk7CisJfQorCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikKKwkJaWZsYWcgfD0gSUFMVFBJTjsKKworCWlmIChpZmxhZyAhPSBjaC0+Y2hfZmVwaWZsYWcpIHsKKwkJY2gtPmNoX2ZlcGlmbGFnID0gaWZsYWc7CisKKwkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCisJCWRnYXBfY21kdyhjaCwgU0lGTEFHLCAodTE2KSBjaC0+Y2hfZmVwaWZsYWcsIDApOworCX0KKworCS8qCisJICogU2VsZWN0IGhhcmR3YXJlIGhhbmRzaGFraW5nLgorCSAqLworCWhmbG93ID0gMDsKKworCWlmIChjaC0+Y2hfY19jZmxhZyAmIENSVFNDVFMpCisJCWhmbG93IHw9IChEX1JUUyhjaCkgfCBEX0NUUyhjaCkpOworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgUlRTUEFDRSkKKwkJaGZsb3cgfD0gRF9SVFMoY2gpOworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRFRSUEFDRSkKKwkJaGZsb3cgfD0gRF9EVFIoY2gpOworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgQ1RTUEFDRSkKKwkJaGZsb3cgfD0gRF9DVFMoY2gpOworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRFNSUEFDRSkKKwkJaGZsb3cgfD0gRF9EU1IoY2gpOworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRENEUEFDRSkKKwkJaGZsb3cgfD0gRF9DRChjaCk7CisKKwlpZiAoaGZsb3cgIT0gY2gtPmNoX2hmbG93KSB7CisJCWNoLT5jaF9oZmxvdyA9IGhmbG93OworCisJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLworCQlkZ2FwX2NtZGIoY2gsIFNIRkxPVywgKHVjaGFyKSBoZmxvdywgMHhmZiwgMCk7CisJfQorCisKKwkvKgorCSAqIFNldCBSVFMgYW5kL29yIERUUiBUb2dnbGUgaWYgbmVlZGVkLAorCSAqIGJ1dCBvbmx5IGlmIHByb2R1Y3QgaXMgRkVQNSsgYmFzZWQuCisJICovCisJaWYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSB7CisJCXUxNiBoZmxvdzIgPSAwOworCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUlRTX1RPR0dMRSkKKwkJCWhmbG93MiB8PSAoRF9SVFMoY2gpKTsKKwkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0RUUl9UT0dHTEUpCisJCQloZmxvdzIgfD0gKERfRFRSKGNoKSk7CisKKwkJZGdhcF9jbWR3X2V4dChjaCwgMHhmZjAzLCBoZmxvdzIsIDApOworCX0KKworCS8qCisJICogU2V0IG1vZGVtIGNvbnRyb2wgbGluZXMuCisJICovCisKKwltdmFsIF49IGNoLT5jaF9tZm9yY2UgJiAobXZhbCBeIGNoLT5jaF9tdmFsKTsKKworCWlmIChjaC0+Y2hfbW9zdGF0IF4gbXZhbCkgeworCQljaC0+Y2hfbW9zdGF0ID0gbXZhbDsKKworCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KKwkJZGdhcF9jbWRiKGNoLCBTTU9ERU0sICh1Y2hhcikgbXZhbCwgRF9SVFMoY2gpfERfRFRSKGNoKSwgMCk7CisJfQorCisJLyoKKwkgKiBSZWFkIG1vZGVtIHNpZ25hbHMsIGFuZCB0aGVuIGNhbGwgY2FycmllciBmdW5jdGlvbi4KKwkgKi8KKwljaC0+Y2hfbWlzdGF0ID0gcmVhZGIoJihicy0+bV9zdGF0KSk7CisJZGdhcF9jYXJyaWVyKGNoKTsKKworCS8qCisJICogU2V0IHRoZSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzLgorCSAqLworCWlmIChjaC0+Y2hfc3RhcnRjICE9IGNoLT5jaF9mZXBzdGFydGMgfHwKKwkgICAgY2gtPmNoX3N0b3BjICE9IGNoLT5jaF9mZXBzdG9wYykgeworCQljaC0+Y2hfZmVwc3RhcnRjID0gY2gtPmNoX3N0YXJ0YzsKKwkJY2gtPmNoX2ZlcHN0b3BjID0gIGNoLT5jaF9zdG9wYzsKKworCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KKwkJZGdhcF9jbWRiKGNoLCBTRkxPV0MsIGNoLT5jaF9mZXBzdGFydGMsIGNoLT5jaF9mZXBzdG9wYywgMCk7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIEF1eGlsaWFyeSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzLgorCSAqLworCWlmIChjaC0+Y2hfYXN0YXJ0YyAhPSBjaC0+Y2hfZmVwYXN0YXJ0YyB8fAorCSAgICBjaC0+Y2hfYXN0b3BjICE9IGNoLT5jaF9mZXBhc3RvcGMpIHsKKwkJY2gtPmNoX2ZlcGFzdGFydGMgPSBjaC0+Y2hfYXN0YXJ0YzsKKwkJY2gtPmNoX2ZlcGFzdG9wYyA9IGNoLT5jaF9hc3RvcGM7CisKKwkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCisJCWRnYXBfY21kYihjaCwgU0FGTE9XQywgY2gtPmNoX2ZlcGFzdGFydGMsIGNoLT5jaF9mZXBhc3RvcGMsIDApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF9wYXJpdHlfc2NhbigpCisgKgorICogQ29udmVydCB0aGUgRkVQNSB3YXkgb2YgcmVwb3J0aW5nIHBhcml0eSBlcnJvcnMgYW5kIGJyZWFrcyBpbnRvCisgKiB0aGUgTGludXggbGluZSBkaXNjaXBsaW5lIHdheS4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9wYXJpdHlfc2NhbihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgY2hhciAqY2J1ZiwKKwkJCQl1bnNpZ25lZCBjaGFyICpmYnVmLCBpbnQgKmxlbikKK3sKKwlpbnQgbCA9ICpsZW47CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBjaGFyICppbiwgKmNvdXQsICpmb3V0OworCXVuc2lnbmVkIGNoYXIgYzsKKworCWluID0gY2J1ZjsKKwljb3V0ID0gY2J1ZjsKKwlmb3V0ID0gZmJ1ZjsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJd2hpbGUgKGwtLSkgeworCQljID0gKmluKys7CisJCXN3aXRjaCAoY2gtPnBzY2FuX3N0YXRlKSB7CisJCWRlZmF1bHQ6CisJCQkvKiByZXNldCB0byBzYW5pdHkgYW5kIGZhbGwgdGhyb3VnaCAqLworCQkJY2gtPnBzY2FuX3N0YXRlID0gMDsKKworCQljYXNlIDA6CisJCQkvKiBObyBGRiBzZWVuIHlldCAqLworCQkJaWYgKGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykKKwkJCQkvKiBkZWxldGUgdGhpcyBjaGFyYWN0ZXIgZnJvbSBzdHJlYW0gKi8KKwkJCQljaC0+cHNjYW5fc3RhdGUgPSAxOworCQkJZWxzZSB7CisJCQkJKmNvdXQrKyA9IGM7CisJCQkJKmZvdXQrKyA9IFRUWV9OT1JNQUw7CisJCQkJY291bnQgKz0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qIGZpcnN0IEZGIHNlZW4gKi8KKwkJCWlmIChjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpIHsKKwkJCQkvKiBkb3VibGVkIGZmLCB0cmFuc2Zvcm0gdG8gc2luZ2xlIGZmICovCisJCQkJKmNvdXQrKyA9IGM7CisJCQkJKmZvdXQrKyA9IFRUWV9OT1JNQUw7CisJCQkJY291bnQgKz0gMTsKKwkJCQljaC0+cHNjYW5fc3RhdGUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBzYXZlIHZhbHVlIGV4YW1pbmF0aW9uIGluIG5leHQgc3RhdGUgKi8KKwkJCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSBjOworCQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQkvKiB0aGlyZCBjaGFyYWN0ZXIgb2YgZmYgc2VxdWVuY2UgKi8KKworCQkJKmNvdXQrKyA9IGM7CisKKwkJCWlmIChjaC0+cHNjYW5fc2F2ZWNoYXIgPT0gMHgwKSB7CisKKwkJCQlpZiAoYyA9PSAweDApIHsKKwkJCQkJY2gtPmNoX2Vycl9icmVhaysrOworCQkJCQkqZm91dCsrID0gVFRZX0JSRUFLOworCQkJCX0gZWxzZSB7CisJCQkJCWNoLT5jaF9lcnJfcGFyaXR5Kys7CisJCQkJCSpmb3V0KysgPSBUVFlfUEFSSVRZOworCQkJCX0KKwkJCX0KKworCQkJY291bnQgKz0gMTsKKwkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7CisJCX0KKwl9CisJKmxlbiA9IGNvdW50OworfQorCitzdGF0aWMgdm9pZCBkZ2FwX3dyaXRlX3dha2V1cChzdHJ1Y3QgYm9hcmRfdCAqYmQsIHN0cnVjdCBjaGFubmVsX3QgKmNoLAorCQkJICAgICAgc3RydWN0IHVuX3QgKnVuLCB1MzIgbWFzaywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmlycV9mbGFnczEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MyKQoreworCWlmICghKHVuLT51bl9mbGFncyAmIG1hc2spKQorCQlyZXR1cm47CisKKwl1bi0+dW5fZmxhZ3MgJj0gfm1hc2s7CisKKwlpZiAoISh1bi0+dW5fZmxhZ3MgJiBVTl9JU09QRU4pKQorCQlyZXR1cm47CisKKwlpZiAoKHVuLT51bl90dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCisJICAgIHVuLT51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgKmlycV9mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgKmlycV9mbGFnczEpOworCisJCSh1bi0+dW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKHVuLT51bl90dHkpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgKmlycV9mbGFnczEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssICppcnFfZmxhZ3MyKTsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1bi0+dW5fdHR5LT53cml0ZV93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVuLT51bl9mbGFnc193YWl0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9ldmVudCAtIEZFUCB0byBob3N0IGV2ZW50IHByb2Nlc3Npbmcgcm91dGluZS4KKyAqCisgKiAgICAgICAgICAgICAgYmQgICAgIC0gQm9hcmQgb2YgY3VycmVudCBldmVudC4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgZGdhcF9ldmVudChzdHJ1Y3QgYm9hcmRfdCAqYmQpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJdWxvbmcJCWxvY2tfZmxhZ3M7CisJdWxvbmcJCWxvY2tfZmxhZ3MyOworCXN0cnVjdCBic190CSpiczsKKwl1Y2hhcgkJKmV2ZW50OworCXVjaGFyCQkqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBldl90CSplYWRkciA9IE5VTEw7CisJdWludAkJaGVhZDsKKwl1aW50CQl0YWlsOworCWludAkJcG9ydDsKKwlpbnQJCXJlYXNvbjsKKwlpbnQJCW1vZGVtOworCWludAkJYjE7CisKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXZhZGRyID0gYmQtPnJlX21hcF9tZW1iYXNlOworCisJaWYgKCF2YWRkcikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZWFkZHIgPSAoc3RydWN0IGV2X3QgKikgKHZhZGRyICsgRVZCVUYpOworCisJLyogR2V0IG91ciBoZWFkIGFuZCB0YWlsICovCisJaGVhZCA9IHJlYWR3KCYoZWFkZHItPmV2X2hlYWQpKTsKKwl0YWlsID0gcmVhZHcoJihlYWRkci0+ZXZfdGFpbCkpOworCisJLyoKKwkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgorCSAqLworCisJaWYgKGhlYWQgPj0gRVZNQVggLSBFVlNUQVJUIHx8IHRhaWwgPj0gRVZNQVggLSBFVlNUQVJUIHx8CisJICAgIChoZWFkIHwgdGFpbCkgJiAwMykgeworCQkvKiBMZXQgZ28gb2YgYm9hcmQgbG9jayAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkgKiBMb29wIHRvIHByb2Nlc3MgYWxsIHRoZSBldmVudHMgaW4gdGhlIGJ1ZmZlci4KKwkgKi8KKwl3aGlsZSAodGFpbCAhPSBoZWFkKSB7CisKKwkJLyoKKwkJICogR2V0IGludGVycnVwdCBpbmZvcm1hdGlvbi4KKwkJICovCisKKwkJZXZlbnQgPSBiZC0+cmVfbWFwX21lbWJhc2UgKyB0YWlsICsgRVZTVEFSVDsKKworCQlwb3J0ICAgPSBldmVudFswXTsKKwkJcmVhc29uID0gZXZlbnRbMV07CisJCW1vZGVtICA9IGV2ZW50WzJdOworCQliMSAgICAgPSBldmVudFszXTsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGludGVycnVwdCBpcyB2YWxpZC4KKwkJICovCisJCWlmIChwb3J0ID49IGJkLT5uYXN5bmMpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCEocmVhc29uICYgKElGTU9ERU0gfCBJRkJSRUFLIHwgSUZUTFcgfCBJRlRFTSB8IElGREFUQSkpKQorCQkJZ290byBuZXh0OworCisJCWNoID0gYmQtPmNoYW5uZWxzW3BvcnRdOworCisJCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJCWdvdG8gbmV4dDsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIG1hZGUgaXQgaGVyZSwgdGhlIGV2ZW50IHdhcyB2YWxpZC4KKwkJICogTG9jayBkb3duIHRoZSBjaGFubmVsLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkJYnMgPSBjaC0+Y2hfYnM7CisKKwkJaWYgKCFicykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCS8qCisJCSAqIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YS4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRkRBVEEpIHsKKworCQkJLyoKKwkJCSAqIEFMTCBMT0NLUyAqTVVTVCogQkUgRFJPUFBFRCBCRUZPUkUgQ0FMTElORyBJTlBVVCEKKwkJCSAqIGlucHV0IGNvdWxkIHNlbmQgc29tZSBkYXRhIHRvIGxkLCB3aGljaCBpbiB0dXJuCisJCQkgKiBjb3VsZCBkbyBhIGNhbGxiYWNrIHRvIG9uZSBvZiBvdXIgb3RoZXIgZnVuY3Rpb25zLgorCQkJICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCQlkZ2FwX2lucHV0KGNoKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUkFDVElWRSkKKwkJCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfUkVOQUJMRTsKKwkJCWVsc2UKKwkJCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKKworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JXQUlUKSB7CisJCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9SV0FJVDsKKworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZQorCQkJCQkoJmNoLT5jaF90dW4udW5fZmxhZ3Nfd2FpdCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIE1vZGVtIGNoYW5nZSBzaWduYWxzLgorCQkgKi8KKwkJaWYgKHJlYXNvbiAmIElGTU9ERU0pIHsKKwkJCWNoLT5jaF9taXN0YXQgPSBtb2RlbTsKKwkJCWRnYXBfY2FycmllcihjaCk7CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIGJyZWFrLgorCQkgKi8KKwkJaWYgKHJlYXNvbiAmIElGQlJFQUspIHsKKworCQkJaWYgKGNoLT5jaF90dW4udW5fdHR5KSB7CisJCQkJLyogQSBicmVhayBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KKwkJCQljaC0+Y2hfZXJyX2JyZWFrKys7CisJCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20KKwkJCQkJKGNoLT5jaF90dW4udW5fdHR5LT5wb3J0LCAxKTsKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcihjaC0+Y2hfdHVuLnVuX3R0eS0+cG9ydCwKKwkJCQkJCSAgICAgMCwgVFRZX0JSRUFLKTsKKwkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaChjaC0+Y2hfdHVuLnVuX3R0eS0+cG9ydCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIFRyYW5zbWl0IGxvdy4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRlRMVykgeworCQkJZGdhcF93cml0ZV93YWtldXAoYmQsIGNoLCAmY2gtPmNoX3R1biwgVU5fTE9XLAorCQkJCQkgICZsb2NrX2ZsYWdzLCAmbG9ja19mbGFnczIpOworCQkJZGdhcF93cml0ZV93YWtldXAoYmQsIGNoLCAmY2gtPmNoX3B1biwgVU5fTE9XLAorCQkJCQkgICZsb2NrX2ZsYWdzLCAmbG9ja19mbGFnczIpOworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1dMT1cpIHsKKwkJCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1dMT1c7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIFRyYW5zbWl0IGVtcHR5LgorCQkgKi8KKwkJaWYgKHJlYXNvbiAmIElGVEVNKSB7CisJCQlkZ2FwX3dyaXRlX3dha2V1cChiZCwgY2gsICZjaC0+Y2hfdHVuLCBVTl9FTVBUWSwKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWRnYXBfd3JpdGVfd2FrZXVwKGJkLCBjaCwgJmNoLT5jaF9wdW4sIFVOX0VNUFRZLAorCQkJCQkgICZsb2NrX2ZsYWdzLCAmbG9ja19mbGFnczIpOworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1dFTVBUWSkgeworCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfV0VNUFRZOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOworCQkJfQorCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworbmV4dDoKKwkJdGFpbCA9ICh0YWlsICsgNCkgJiAoRVZNQVggLSBFVlNUQVJUIC0gNCk7CisJfQorCisJd3JpdGV3KHRhaWwsICYoZWFkZHItPmV2X3RhaWwpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgREdfUEFSVCk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVTUiwgZGdhcF9kcml2ZXJfdmVyc2lvbl9zaG93LCBOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9ib2FyZHNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGRnYXBfTnVtQm9hcmRzKTsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihib2FyZHMsIFNfSVJVU1IsIGRnYXBfZHJpdmVyX2JvYXJkc19zaG93LCBOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9tYXhib2FyZHNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIE1BWEJPQVJEUyk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIobWF4Ym9hcmRzLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9tYXhib2FyZHNfc2hvdywgTlVMTCk7CisKKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbGNvdW50ZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLAorCQkJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsZFxuIiwgZGdhcF9wb2xsX2NvdW50ZXIpOworfQorc3RhdGljIERSSVZFUl9BVFRSKHBvbGxjb3VudGVyLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9wb2xsY291bnRlcl9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRtc1xuIiwgZGdhcF9wb2xsX3RpY2spOworfQorCitzdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9wb2xscmF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChzc2NhbmYoYnVmLCAiJWRcbiIsICZkZ2FwX3BvbGxfdGljaykgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERSSVZFUl9BVFRSKHBvbGxyYXRlLCAoU19JUlVTUiB8IFNfSVdVU1IpLCBkZ2FwX2RyaXZlcl9wb2xscmF0ZV9zaG93LAorCQkgICBkZ2FwX2RyaXZlcl9wb2xscmF0ZV9zdG9yZSk7CisKK3N0YXRpYyBpbnQgZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICpkZ2FwX2RyaXZlcikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZkZ2FwX2RyaXZlci0+ZHJpdmVyOworCisJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfYm9hcmRzKTsKKwlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhib2FyZHMpOworCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3BvbGxyYXRlKTsKKwlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xsY291bnRlcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX2RyaXZlcl9zeXNmaWxlcyhzdHJ1Y3QgcGNpX2RyaXZlciAqZGdhcF9kcml2ZXIpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzID0gJmRnYXBfZHJpdmVyLT5kcml2ZXI7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfYm9hcmRzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhib2FyZHMpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3BvbGxyYXRlKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xsY291bnRlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYm9hcmRfdCAqZGdhcF92ZXJpZnlfYm9hcmQoc3RydWN0IGRldmljZSAqcCkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCisJYmQgPSBkZXZfZ2V0X2RydmRhdGEocCk7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQyB8fCBiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGJkOworfQorCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7CisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKKwkJCSIlZCAlc1xuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9vcGVuX2NvdW50ID8gIk9wZW4iIDogIkNsb3NlZCIpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfc3RhdGUsIFNfSVJVU1IsIGRnYXBfcG9ydHNfc3RhdGVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfYmF1ZF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKKwkJY291bnQgKz0gIHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICVkXG4iLAorCQkJCSAgIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCQkgICBiZC0+Y2hhbm5lbHNbaV0tPmNoX2JhdWRfaW5mbyk7CisJfQorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19iYXVkLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2JhdWRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7CisJCWlmIChiZC0+Y2hhbm5lbHNbaV0tPmNoX29wZW5fY291bnQpCisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJIiVkICVzICVzICVzICVzICVzICVzXG4iLAorCQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCQkoYmQtPmNoYW5uZWxzW2ldLT5jaF9tb3N0YXQgJgorCQkJCSBVQVJUX01DUl9SVFMpID8gIlJUUyIgOiAiIiwKKwkJCQkoYmQtPmNoYW5uZWxzW2ldLT5jaF9taXN0YXQgJgorCQkJCSBVQVJUX01TUl9DVFMpID8gIkNUUyIgOiAiIiwKKwkJCQkoYmQtPmNoYW5uZWxzW2ldLT5jaF9tb3N0YXQgJgorCQkJCSBVQVJUX01DUl9EVFIpID8gIkRUUiIgOiAiIiwKKwkJCQkoYmQtPmNoYW5uZWxzW2ldLT5jaF9taXN0YXQgJgorCQkJCSBVQVJUX01TUl9EU1IpID8gIkRTUiIgOiAiIiwKKwkJCQkoYmQtPmNoYW5uZWxzW2ldLT5jaF9taXN0YXQgJgorCQkJCSBVQVJUX01TUl9EQ0QpID8gIkRDRCIgOiAiIiwKKwkJCQkoYmQtPmNoYW5uZWxzW2ldLT5jaF9taXN0YXQgJgorCQkJCSBVQVJUX01TUl9SSSkgID8gIlJJIiAgOiAiIik7CisJCWVsc2UKKwkJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKKwkJCQkiJWRcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSk7CisJfQorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19tc2lnbmFscywgU19JUlVTUiwgZGdhcF9wb3J0c19tc2lnbmFsc19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX2NfaWZsYWcpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19pZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19pZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19jZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX2NfY2ZsYWcpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19jZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19jZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX2Nfb2ZsYWcpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19vZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19vZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX2NfbGZsYWcpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19sZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19sZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19kaWdpX2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9kaWdpLmRpZ2lfZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19kaWdpX2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfZGlnaV9mbGFnX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKQorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlbGRcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3J4Y291bnQpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19yeGNvdW50LCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3J4Y291bnRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICVsZFxuIiwKKwkJCQkgIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCQkgIGJkLT5jaGFubmVsc1tpXS0+Y2hfdHhjb3VudCk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX3R4Y291bnQsIFNfSVJVU1IsIGRnYXBfcG9ydHNfdHhjb3VudF9zaG93LCBOVUxMKTsKKworLyogdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBzeXMgZmlsZXMgdGhhdCB3aWxsIGV4cG9ydCBlYWNoIHNpZ25hbCBzdGF0dXMKKyAqIHRvIHN5c2ZzIGVhY2ggdmFsdWUgd2lsbCBiZSBwdXQgaW4gYSBzZXBhcmF0ZSBmaWxlbmFtZQorICovCitzdGF0aWMgdm9pZCBkZ2FwX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhzdHJ1Y3QgYm9hcmRfdCAqYmQpCit7CisJZGV2X3NldF9kcnZkYXRhKCZiZC0+cGRldi0+ZGV2LCBiZCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19zdGF0ZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19iYXVkKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX21zaWduYWxzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2lmbGFnKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2NmbGFnKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX29mbGFnKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2xmbGFnKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2RpZ2lfZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19yeGNvdW50KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3R4Y291bnQpOworfQorCisvKiByZW1vdmVzIGFsbCB0aGUgc3lzIGZpbGVzIGNyZWF0ZWQgZm9yIHRoYXQgcG9ydCAqLworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfc3RhdGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfYmF1ZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19tc2lnbmFscyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19pZmxhZyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19jZmxhZyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19vZmxhZyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19sZmxhZyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19kaWdpX2ZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfcnhjb3VudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c190eGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyIsIHVuLT51bl9vcGVuX2NvdW50ID8KKwkJCSJPcGVuIiA6ICJDbG9zZWQiKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0ZSwgU19JUlVTUiwgZGdhcF90dHlfc3RhdGVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNoLT5jaF9iYXVkX2luZm8pOworfQorc3RhdGljIERFVklDRV9BVFRSKGJhdWQsIFNfSVJVU1IsIGRnYXBfdHR5X2JhdWRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X21zaWduYWxzX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJaWYgKGNoLT5jaF9vcGVuX2NvdW50KSB7CisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzICVzICVzICVzICVzICVzXG4iLAorCQkJKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9SVFMpID8gIlJUUyIgOiAiIiwKKwkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfQ1RTKSA/ICJDVFMiIDogIiIsCisJCQkoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX0RUUikgPyAiRFRSIiA6ICIiLAorCQkJKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9EU1IpID8gIkRTUiIgOiAiIiwKKwkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRENEKSA/ICJEQ0QiIDogIiIsCisJCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX1JJKSAgPyAiUkkiICA6ICIiKTsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobXNpZ25hbHMsIFNfSVJVU1IsIGRnYXBfdHR5X21zaWduYWxzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19pZmxhZyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaWZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2lmbGFnX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9jZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19jZmxhZyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY2ZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2NmbGFnX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19vZmxhZyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob2ZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X29mbGFnX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19sZmxhZyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobGZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2xmbGFnX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9kaWdpX2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkaWdpX2ZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfcnhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF9yeGNvdW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyeGNvdW50LCBTX0lSVVNSLCBkZ2FwX3R0eV9yeGNvdW50X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV90eGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsZFxuIiwgY2gtPmNoX3R4Y291bnQpOworfQorc3RhdGljIERFVklDRV9BVFRSKHR4Y291bnQsIFNfSVJVU1IsIGRnYXBfdHR5X3R4Y291bnRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQJY247CisJaW50CWJuOworCXN0cnVjdCBjbm9kZSAqY3B0ciA9IE5VTEw7CisJaW50IGZvdW5kID0gRkFMU0U7CisJaW50IG5jb3VudCA9IDA7CisJaW50IHN0YXJ0byA9IDA7CisJaW50IGkgPSAwOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlibiA9IGJkLT5ib2FyZG51bTsKKwljbiA9IGNoLT5jaF9wb3J0bnVtOworCisJZm9yIChjcHRyID0gYmQtPmJkX2NvbmZpZzsgY3B0cjsgY3B0ciA9IGNwdHItPm5leHQpIHsKKworCQlpZiAoKGNwdHItPnR5cGUgPT0gQk5PREUpICYmCisJCSAgICAoKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDJfOTIwUCkgfHwKKwkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUNF85MjBQKSB8fAorCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQ4XzkyMFApIHx8CisJCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBQQVBPUlQ0KSB8fAorCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gUEFQT1JUOCkpKSB7CisKKwkJCWZvdW5kID0gVFJVRTsKKwkJCWlmIChjcHRyLT51LmJvYXJkLnZfc3RhcnQpCisJCQkJc3RhcnRvID0gY3B0ci0+dS5ib2FyZC5zdGFydDsKKwkJCWVsc2UKKwkJCQlzdGFydG8gPSAxOworCQl9CisKKwkJaWYgKGNwdHItPnR5cGUgPT0gVE5PREUgJiYgZm91bmQgPT0gVFJVRSkgeworCQkJY2hhciAqcHRyMTsKKwkJCWlmIChzdHJzdHIoY3B0ci0+dS50dHluYW1lLCAidHR5IikpIHsKKwkJCQlwdHIxID0gY3B0ci0+dS50dHluYW1lOworCQkJCXB0cjEgKz0gMzsKKwkJCX0gZWxzZQorCQkJCXB0cjEgPSBjcHRyLT51LnR0eW5hbWU7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBkZ2FwX2NvbmZpZ19nZXRfbnVtX3BydHMoYmQpOyBpKyspIHsKKwkJCQlpZiAoY24gIT0gaSkKKwkJCQkJY29udGludWU7CisKKwkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAyZFxuIiwKKwkJCQkJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/CisJCQkJCQkgInByIiA6ICJ0dHkiLAorCQkJCQkJcHRyMSwgaSArIHN0YXJ0byk7CisJCQl9CisJCX0KKworCQlpZiAoY3B0ci0+dHlwZSA9PSBDTk9ERSkgeworCisJCQlmb3IgKGkgPSAwOyBpIDwgY3B0ci0+dS5jb25jLm5wb3J0OyBpKyspIHsKKwkJCQlpZiAoY24gIT0gKGkgKyBuY291bnQpKQorCQkJCQljb250aW51ZTsKKworCQkJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzJXMlMDJsZFxuIiwKKwkJCQkJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/CisJCQkJCQkgInByIiA6ICJ0dHkiLAorCQkJCQkJY3B0ci0+dS5jb25jLmlkLAorCQkJCQkJaSArIChjcHRyLT51LmNvbmMudl9zdGFydCA/CisJCQkJCQkgICAgIGNwdHItPnUuY29uYy5zdGFydCA6IDEpKTsKKwkJCX0KKworCQkJbmNvdW50ICs9IGNwdHItPnUuY29uYy5ucG9ydDsKKwkJfQorCisJCWlmIChjcHRyLT50eXBlID09IE1OT0RFKSB7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjcHRyLT51Lm1vZHVsZS5ucG9ydDsgaSsrKSB7CisJCQkJaWYgKGNuICE9IChpICsgbmNvdW50KSkKKwkJCQkJY29udGludWU7CisKKwkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAybGRcbiIsCisJCQkJCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPworCQkJCQkJICJwciIgOiAidHR5IiwKKwkJCQkJCWNwdHItPnUubW9kdWxlLmlkLAorCQkJCQkJaSArIChjcHRyLT51Lm1vZHVsZS52X3N0YXJ0ID8KKwkJCQkJCSAgICAgY3B0ci0+dS5tb2R1bGUuc3RhcnQgOiAxKSk7CisJCQl9CisKKwkJCW5jb3VudCArPSBjcHRyLT51Lm1vZHVsZS5ucG9ydDsKKworCQl9CisJfQorCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNfZGdhcF8lZF8lZFxuIiwKKwkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLCBibiwgY24pOworCit9CitzdGF0aWMgREVWSUNFX0FUVFIoY3VzdG9tX25hbWUsIFNfSVJVU1IsIGRnYXBfdHR5X25hbWVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZ2FwX3N5c2ZzX3R0eV9lbnRyaWVzW10gPSB7CisJJmRldl9hdHRyX3N0YXRlLmF0dHIsCisJJmRldl9hdHRyX2JhdWQuYXR0ciwKKwkmZGV2X2F0dHJfbXNpZ25hbHMuYXR0ciwKKwkmZGV2X2F0dHJfaWZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfY2ZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfb2ZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfbGZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfZGlnaV9mbGFnLmF0dHIsCisJJmRldl9hdHRyX3J4Y291bnQuYXR0ciwKKwkmZGV2X2F0dHJfdHhjb3VudC5hdHRyLAorCSZkZXZfYXR0cl9jdXN0b21fbmFtZS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9IE5VTEwsCisJLmF0dHJzID0gZGdhcF9zeXNmc190dHlfZW50cmllcywKK307CisKK3N0YXRpYyB2b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpCit7CisJaW50IHJldDsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYy0+a29iaiwgJmRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJZGV2X3NldF9kcnZkYXRhKGMsIHVuKTsKKworfQorCitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV90dHlfc3lzZnMoc3RydWN0IGRldmljZSAqYykKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmMtPmtvYmosICZkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXApOworfQorCisvKgorICogUGFyc2UgYSBjb25maWd1cmF0aW9uIGZpbGUgcmVhZCBpbnRvIG1lbW9yeSBhcyBhIHN0cmluZy4KKyAqLworc3RhdGljIGludAlkZ2FwX3BhcnNlZmlsZShjaGFyICoqaW4sIGludCBSZW1vdmUpCit7CisJc3RydWN0IGNub2RlICpwLCAqYnJkLCAqbGluZSwgKmNvbmM7CisJaW50CXJjOworCWNoYXIJKnMgPSBOVUxMOworCWludAlsaW5lY250ID0gMDsKKworCXAgPSAmZGdhcF9oZWFkOworCWJyZCA9IGxpbmUgPSBjb25jID0gTlVMTDsKKworCS8qIHBlcmhhcHMgd2UgYXJlIGFkZGluZyB0byBhbiBleGlzdGluZyBsaXN0PyAqLworCXdoaWxlIChwLT5uZXh0ICE9IE5VTEwpCisJCXAgPSBwLT5uZXh0OworCisJLyogZmlsZSBtdXN0IHN0YXJ0IHdpdGggYSBCRUdJTiAqLworCXdoaWxlICgocmMgPSBkZ2FwX2dldHRvayhpbiwgcCkpICE9IEJFR0lOKSB7CisJCWlmIChyYyA9PSAwKSB7CisJCQlkZ2FwX2VycigidW5leHBlY3RlZCBFT0YiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWZvciAoOyA7KSB7CisJCXJjID0gZGdhcF9nZXR0b2soaW4sIHApOworCQlpZiAocmMgPT0gMCkgeworCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRU9GIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgMDoKKwkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQlyZXR1cm4gLTE7CisKKwkJY2FzZSBCRUdJTjoJLyogc2hvdWxkIG9ubHkgYmUgMSBiZWdpbiAqLworCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgY29uZmlnX2JlZ2luXG4iKTsKKwkJCXJldHVybiAtMTsKKworCQljYXNlIEVORDoKKwkJCXJldHVybiAwOworCisJCWNhc2UgQk9BUkQ6CS8qIGJvYXJkIGluZm8gKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEJOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisKKwkJCXAtPnUuYm9hcmQuc3RhdHVzID0gZGdhcF9zYXZlc3RyaW5nKCJObyIpOworCQkJbGluZSA9IGNvbmMgPSBOVUxMOworCQkJYnJkID0gcDsKKwkJCWxpbmVjbnQgPSAtMTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBPUlQyXzkyMFA6CS8qIEFjY2VsZVBvcnRfNCAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzJyXzkyMCBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBBUE9SVDJfOTIwUDsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBPUlQ0XzkyMFA6CS8qIEFjY2VsZVBvcnRfNCAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzRyXzkyMCBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBBUE9SVDRfOTIwUDsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBPUlQ4XzkyMFA6CS8qIEFjY2VsZVBvcnRfOCAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzhyXzkyMCBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBBUE9SVDhfOTIwUDsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEFQT1JUNDoJLyogQWNjZWxlUG9ydF80IFBDSSAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzRyKFBDSSkgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gUEFQT1JUNDsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEFQT1JUODoJLyogQWNjZWxlUG9ydF84IFBDSSAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzhyIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudHlwZSA9IFBBUE9SVDg7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBDWDoJLyogUENJIEMvWCAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpX0MvWF8oUENJKSBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBQQ1g7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKKwkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOworCQkJcC0+dS5ib2FyZC5tb2R1bGUxID0gMDsKKwkJCXAtPnUuYm9hcmQubW9kdWxlMiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFBFUEM6CS8qIFBDSSBFUEMvWCAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBcIkRpZ2lfRVBDL1hfKFBDSSlcIiBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBQRVBDOworCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOworCQkJcC0+dS5ib2FyZC5jb25jMSA9IDA7CisJCQlwLT51LmJvYXJkLmNvbmMyID0gMDsKKwkJCXAtPnUuYm9hcmQubW9kdWxlMSA9IDA7CisJCQlwLT51LmJvYXJkLm1vZHVsZTIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUENNOgkvKiBQQ0kvWGVtICovCisJCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIFBDSS9YZW0gc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gUFBDTTsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOworCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIElPOgkvKiBpL28gcG9ydCAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigiSU8gcG9ydCBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQucG9ydHN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmJvYXJkLnBvcnQpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIElPIHBvcnQiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnZfcG9ydCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE1FTToJLyogbWVtb3J5IGFkZHJlc3MgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoIm1lbW9yeSBhZGRyZXNzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC5hZGRyc3RyID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKGtzdHJ0b3VsKHMsIDAsICZwLT51LmJvYXJkLmFkZHIpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG1lbW9yeSBhZGRyZXNzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC52X2FkZHIgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQ0lJTkZPOgkvKiBwY2kgaW5mb3JtYXRpb24gKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoIm1lbW9yeSBhZGRyZXNzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC5wY2lidXNzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoa3N0cnRvdWwocywgMCwgJnAtPnUuYm9hcmQucGNpYnVzKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBwY2kgYnVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC52X3BjaWJ1cyA9IDE7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQucGNpc2xvdHN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCWlmIChrc3RydG91bChzLCAwLCAmcC0+dS5ib2FyZC5wY2lzbG90KSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBwY2kgc2xvdCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudl9wY2lzbG90ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVUSE9EOgorCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigiaW5zdGFsbCBtZXRob2Qgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLm1ldGhvZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCXAtPnUuYm9hcmQudl9tZXRob2QgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFUVVM6CisJCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgeworCQkJCWRnYXBfZXJyKCJjb25maWcgc3RhdHVzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC5zdGF0dXMgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlicmVhazsKKworCQljYXNlIE5QT1JUUzoJLyogbnVtYmVyIG9mIHBvcnRzICovCisJCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ib2FyZC5ucG9ydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG51bWJlciBvZiBwb3J0cyIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuYm9hcmQudl9ucG9ydCA9IDE7CisJCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuY29uYy5ucG9ydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG51bWJlciBvZiBwb3J0cyIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuY29uYy52X25wb3J0ID0gMTsKKwkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBNTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5tb2R1bGUubnBvcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51Lm1vZHVsZS52X25wb3J0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZGdhcF9lcnIoIm5wb3J0cyBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIG9yIG1vZHVsZXMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElEOgkvKiBsZXR0ZXIgSUQgdXNlZCBpbiB0dHkgbmFtZSAqLworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCXAtPnUuYm9hcmQuc3RhdHVzID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCisJCQlpZiAocC0+dHlwZSA9PSBDTk9ERSkgeworCQkJCXAtPnUuY29uYy5pZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCQlwLT51LmNvbmMudl9pZCA9IDE7CisJCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gTU5PREUpIHsKKwkJCQlwLT51Lm1vZHVsZS5pZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCQlwLT51Lm1vZHVsZS52X2lkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZGdhcF9lcnIoImlkIG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1RBUlRPOgkvKiBzdGFydCBvZmZzZXQgb2YgSUQgKi8KKwkJCWlmIChwLT50eXBlID09IEJOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmJvYXJkLnN0YXJ0KSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3Igc3RhcnQgb2YgdHR5IGNvdW50Iik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5ib2FyZC52X3N0YXJ0ID0gMTsKKwkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBDTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5jb25jLnN0YXJ0KSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3Igc3RhcnQgb2YgdHR5IGNvdW50Iik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5jb25jLnZfc3RhcnQgPSAxOworCQkJfSBlbHNlIGlmIChwLT50eXBlID09IE1OT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51Lm1vZHVsZS5zdGFydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUubW9kdWxlLnZfc3RhcnQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlkZ2FwX2Vycigic3RhcnQgb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyBvciBtb2R1bGVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUVFlOOgkvKiB0dHkgbmFtZSBwcmVmaXggKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKFROT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmICghcykgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LnR0eW5hbWUgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoIXAtPnUudHR5bmFtZSkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDVToJLyogY3UgbmFtZSBwcmVmaXggKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENVTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAoIXMpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5jdW5hbWUgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoIXAtPnUuY3VuYW1lKSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExJTkU6CS8qIGxpbmUgaW5mb3JtYXRpb24gKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoYnJkID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGJvYXJkIGJlZm9yZSBsaW5lIGluZm8iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzd2l0Y2ggKGJyZC0+dS5ib2FyZC50eXBlKSB7CisJCQljYXNlIFBQQ006CisJCQkJZGdhcF9lcnIoImxpbmUgbm90IHZhaWxkIGZvciBQQy9lbSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoTE5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCWNvbmMgPSBOVUxMOworCQkJbGluZSA9IHA7CisJCQlsaW5lY250Kys7CisJCQlicmVhazsKKworCQljYXNlIENPTkM6CS8qIGNvbmNlbnRyYXRvciBpbmZvcm1hdGlvbiAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChsaW5lID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGxpbmUgaW5mbyBiZWZvcmUgY29uY2VudHJhdG9yIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShDTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJY29uYyA9IHA7CisJCQlpZiAobGluZWNudCkKKwkJCQlicmQtPnUuYm9hcmQuY29uYzIrKzsKKwkJCWVsc2UKKwkJCQlicmQtPnUuYm9hcmQuY29uYzErKzsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDWDoJLyogYy94IHR5cGUgY29uY2VudHJhdG9yICovCisJCQlpZiAocC0+dHlwZSAhPSBDTk9ERSkgeworCQkJCWRnYXBfZXJyKCJjeCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5jb25jLnR5cGUgPSBDWDsKKwkJCXAtPnUuY29uYy52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBFUEM6CS8qIGVwYyB0eXBlIGNvbmNlbnRyYXRvciAqLworCQkJaWYgKHAtPnR5cGUgIT0gQ05PREUpIHsKKwkJCQlkZ2FwX2VycigiY3ggb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuY29uYy50eXBlID0gRVBDOworCQkJcC0+dS5jb25jLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE1PRDoJLyogRUJJIG1vZHVsZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChicmQgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJtdXN0IHNwZWNpZnkgYm9hcmQgaW5mbyBiZWZvcmUgRUJJIG1vZHVsZXMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzd2l0Y2ggKGJyZC0+dS5ib2FyZC50eXBlKSB7CisJCQljYXNlIFBQQ006CisJCQkJbGluZWNudCA9IDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmIChjb25jID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBjb25jZW50cmF0b3IgaW5mbyBiZWZvcmUgRUJJIG1vZHVsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShNTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJaWYgKGxpbmVjbnQpCisJCQkJYnJkLT51LmJvYXJkLm1vZHVsZTIrKzsKKwkJCWVsc2UKKwkJCQlicmQtPnUuYm9hcmQubW9kdWxlMSsrOworCisJCQlicmVhazsKKworCQljYXNlIFBPUlRTOgkvKiBwb3J0cyB0eXBlIEVCSSBtb2R1bGUgKi8KKwkJCWlmIChwLT50eXBlICE9IE1OT0RFKSB7CisJCQkJZGdhcF9lcnIoInBvcnRzIG9ubHkgdmFsaWQgZm9yIEVCSSBtb2R1bGVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5tb2R1bGUudHlwZSA9IFBPUlRTOworCQkJcC0+dS5tb2R1bGUudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERU06CS8qIHBvcnRzIHR5cGUgRUJJIG1vZHVsZSAqLworCQkJaWYgKHAtPnR5cGUgIT0gTU5PREUpIHsKKwkJCQlkZ2FwX2VycigibW9kZW0gb25seSB2YWxpZCBmb3IgbW9kZW0gbW9kdWxlcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUubW9kdWxlLnR5cGUgPSBNT0RFTTsKKwkJCXAtPnUubW9kdWxlLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIENBQkxFOgorCQkJaWYgKHAtPnR5cGUgPT0gTE5PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAoIXMpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmxpbmUuY2FibGUgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQkJcC0+dS5saW5lLnZfY2FibGUgPSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVFRDoJLyogc3luYyBsaW5lIHNwZWVkIGluZGljYXRpb24gKi8KKwkJCWlmIChwLT50eXBlID09IExOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmxpbmUuc3BlZWQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBsaW5lIHNwZWVkIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5saW5lLnZfc3BlZWQgPSAxOworCQkJfSBlbHNlIGlmIChwLT50eXBlID09IENOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmNvbmMuc3BlZWQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBsaW5lIHNwZWVkIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5jb25jLnZfc3BlZWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlkZ2FwX2Vycigic3BlZWQgdmFsaWQgb25seSBmb3IgbGluZXMgb3IgY29uY2VudHJhdG9ycy4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENPTk5FQ1Q6CisJCQlpZiAocC0+dHlwZSA9PSBDTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmICghcykgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuY29uYy5jb25uZWN0ID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJCXAtPnUuY29uYy52X2Nvbm5lY3QgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFJJTlQ6CS8qIHRyYW5zcGFyZW50IHByaW50IG5hbWUgcHJlZml4ICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShQTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAoIXMpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5wcmludG5hbWUgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoIXAtPnUucHJpbnRuYW1lKSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENNQUpPUjoJLyogbWFqb3IgbnVtYmVyICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShKTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5tYWpvcm51bWJlcikpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbWFqb3IgbnVtYmVyIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTFRQSU46CS8qIGFsdHBpbiBzZXR0aW5nICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShBTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5hbHRwaW4pKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGFsdHBpbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVVNFSU5UUjoJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgc2V0dGluZyAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoSU5UUk5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUudXNlaW50cikpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdXNlaW50ciIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFRTSVo6CS8qIHNpemUgb2YgdHR5IHN0cnVjdHVyZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoVFNOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LnR0eXNpemUpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHR0eXNpemUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENIU0laOgkvKiBjaGFubmVsIHN0cnVjdHVyZSBzaXplICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShDU05PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuY2hzaXplKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBjaHNpemUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEJTU0laOgkvKiBib2FyZCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQlNOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmJzc2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgYnNzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBVTlRTSVo6CS8qIHNjaGVkIHN0cnVjdHVyZSBzaXplICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShVU05PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUudW5zaXplKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzY2hlZHNpemUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEYyU0laOgkvKiBmMjIwMCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoRlNOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmYyc2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgZjIyMDBzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBWUFNJWjoJLyogdnBpeCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoVlNOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LnZwaXhzaXplKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciB2cGl4c2l6ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogZGdhcF9zaW5kZXg6IG11Y2ggbGlrZSBpbmRleCgpLCBidXQgaXQgbG9va3MgZm9yIGEgbWF0Y2ggb2YgYW55IGNoYXJhY3RlciBpbgorICogdGhlIGdyb3VwLCBhbmQgcmV0dXJucyB0aGF0IHBvc2l0aW9uLiAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIF4sIHRoZW4KKyAqIHRoaXMgd2lsbCBtYXRjaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBub3QgaW4gdGhhdCBncm91cC4KKyAqLworc3RhdGljIGNoYXIgKmRnYXBfc2luZGV4KGNoYXIgKnN0cmluZywgY2hhciAqZ3JvdXApCit7CisJY2hhciAgICAqcHRyOworCisJaWYgKCFzdHJpbmcgfHwgIWdyb3VwKQorCQlyZXR1cm4gKGNoYXIgKikgTlVMTDsKKworCWlmICgqZ3JvdXAgPT0gJ14nKSB7CisJCWdyb3VwKys7CisJCWZvciAoOyAqc3RyaW5nOyBzdHJpbmcrKykgeworCQkJZm9yIChwdHIgPSBncm91cDsgKnB0cjsgcHRyKyspIHsKKwkJCQlpZiAoKnB0ciA9PSAqc3RyaW5nKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgqcHRyID09ICdcMCcpCisJCQkJcmV0dXJuIHN0cmluZzsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoOyAqc3RyaW5nOyBzdHJpbmcrKykgeworCQkJZm9yIChwdHIgPSBncm91cDsgKnB0cjsgcHRyKyspIHsKKwkJCQlpZiAoKnB0ciA9PSAqc3RyaW5nKQorCQkJCQlyZXR1cm4gc3RyaW5nOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIChjaGFyICopIE5VTEw7Cit9CisKKy8qCisgKiBHZXQgYSB0b2tlbiBmcm9tIHRoZSBpbnB1dCBmaWxlOyByZXR1cm4gMCBpZiBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9nZXR0b2soY2hhciAqKmluLCBzdHJ1Y3QgY25vZGUgKnApCit7CisJY2hhcgkqdzsKKwlzdHJ1Y3QgdG9rbGlzdCAqdDsKKworCWlmIChzdHJzdHIoZGdhcF9jd29yZCwgImJvYXIiKSkgeworCQl3ID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJc25wcmludGYoZGdhcF9jd29yZCwgTUFYQ1dPUkQsICIlcyIsIHcpOworCQlmb3IgKHQgPSBkZ2FwX3RsaXN0OyB0LT50b2tlbiAhPSAwOyB0KyspIHsKKwkJCWlmICghc3RyY21wKHcsIHQtPnN0cmluZykpCisJCQkJcmV0dXJuIHQtPnRva2VuOworCQl9CisJCWRnYXBfZXJyKCJib2FyZCAhIXR5cGUgbm90IHNwZWNpZmllZCIpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQl3aGlsZSAoKHcgPSBkZ2FwX2dldHdvcmQoaW4pKSkgeworCQkJc25wcmludGYoZGdhcF9jd29yZCwgTUFYQ1dPUkQsICIlcyIsIHcpOworCQkJZm9yICh0ID0gZGdhcF90bGlzdDsgdC0+dG9rZW4gIT0gMDsgdCsrKSB7CisJCQkJaWYgKCFzdHJjbXAodywgdC0+c3RyaW5nKSkKKwkJCQkJcmV0dXJuIHQtPnRva2VuOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIGdldCBhIHdvcmQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBhbHNvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIHdvcmRzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KKyAqLworc3RhdGljIGNoYXIgKmRnYXBfZ2V0d29yZChjaGFyICoqaW4pCit7CisJY2hhciAqcmV0X3B0ciA9ICppbjsKKworCWNoYXIgKnB0ciA9IGRnYXBfc2luZGV4KCppbiwgIiBcdFxuIik7CisKKwkvKiBJZiBubyB3b3JkIGZvdW5kLCByZXR1cm4gbnVsbCAqLworCWlmICghcHRyKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE1hcmsgbmV3IGxvY2F0aW9uIGZvciBvdXIgYnVmZmVyICovCisJKnB0ciA9ICdcMCc7CisJKmluID0gcHRyICsgMTsKKworCS8qIEVhdCBhbnkgZXh0cmEgc3BhY2VzL3RhYnMvbmV3bGluZXMgdGhhdCBtaWdodCBiZSBwcmVzZW50ICovCisJd2hpbGUgKCppbiAmJiAqKmluICYmICgoKippbiA9PSAnICcpIHx8CisJCQkgICAgICAgKCoqaW4gPT0gJ1x0JykgfHwKKwkJCSAgICAgICAoKippbiA9PSAnXG4nKSkpIHsKKwkJKippbiA9ICdcMCc7CisJCSppbiA9ICppbiArIDE7CisJfQorCisJcmV0dXJuIHJldF9wdHI7Cit9CisKKy8qCisgKiBwcmludCBhbiBlcnJvciBtZXNzYWdlLCBnaXZpbmcgdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlCisgKiB0aGUgZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfZXJyKGNoYXIgKnMpCit7CisJcHJfZXJyKCJkZ2FwOiBwYXJzZTogJXNcbiIsIHMpOworfQorCisvKgorICogYWxsb2NhdGUgYSBuZXcgY29uZmlndXJhdGlvbiBub2RlIG9mIHR5cGUgdAorICovCitzdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX25ld25vZGUoaW50IHQpCit7CisJc3RydWN0IGNub2RlICpuOworCisJbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbm9kZSksIEdGUF9BVE9NSUMpOworCWlmIChuICE9IE5VTEwpIHsKKwkJbWVtc2V0KChjaGFyICopbiwgMCwgc2l6ZW9mKHN0cnVjdCBjbm9kZSkpOworCQluLT50eXBlID0gdDsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBkZ2FwX2NoZWNrbm9kZTogc2VlIGlmIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm8gaGFzIGJlZW4gc3VwcGxpZWQgZm9yIGEgbm9kZQorICogYmVmb3JlIGNyZWF0aW5nIHRoZSBuZXh0IG5vZGUuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9jaGVja25vZGUoc3RydWN0IGNub2RlICpwKQoreworCXN3aXRjaCAocC0+dHlwZSkgeworCWNhc2UgQk5PREU6CisJCWlmIChwLT51LmJvYXJkLnZfdHlwZSA9PSAwKSB7CisJCQlkZ2FwX2VycigiYm9hcmQgdHlwZSAhbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlyZXR1cm4gMDsKKworCWNhc2UgTE5PREU6CisJCWlmIChwLT51LmxpbmUudl9zcGVlZCA9PSAwKSB7CisJCQlkZ2FwX2VycigibGluZSBzcGVlZCBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgQ05PREU6CisJCWlmIChwLT51LmNvbmMudl90eXBlID09IDApIHsKKwkJCWRnYXBfZXJyKCJjb25jZW50cmF0b3IgdHlwZSBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocC0+dS5jb25jLnZfc3BlZWQgPT0gMCkgeworCQkJZGdhcF9lcnIoImNvbmNlbnRyYXRvciBsaW5lIHNwZWVkIG5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChwLT51LmNvbmMudl9ucG9ydCA9PSAwKSB7CisJCQlkZ2FwX2VycigibnVtYmVyIG9mIHBvcnRzIG9uIGNvbmNlbnRyYXRvciBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocC0+dS5jb25jLnZfaWQgPT0gMCkgeworCQkJZGdhcF9lcnIoImNvbmNlbnRyYXRvciBpZCBsZXR0ZXIgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIE1OT0RFOgorCQlpZiAocC0+dS5tb2R1bGUudl90eXBlID09IDApIHsKKwkJCWRnYXBfZXJyKCJFQkkgbW9kdWxlIHR5cGUgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHAtPnUubW9kdWxlLnZfbnBvcnQgPT0gMCkgeworCQkJZGdhcF9lcnIoIm51bWJlciBvZiBwb3J0cyBvbiBFQkkgbW9kdWxlIG5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChwLT51Lm1vZHVsZS52X2lkID09IDApIHsKKwkJCWRnYXBfZXJyKCJFQkkgbW9kdWxlIGlkIGxldHRlciBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzYXZlIGEgc3RyaW5nIHNvbWV3aGVyZQorICovCitzdGF0aWMgY2hhcgkqZGdhcF9zYXZlc3RyaW5nKGNoYXIgKnMpCit7CisJY2hhcgkqcDsKKworCXAgPSBrbWFsbG9jKHN0cmxlbihzKSArIDEsIEdGUF9BVE9NSUMpOworCWlmIChwKQorCQlzdHJjcHkocCwgcyk7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBHaXZlbiBhIGJvYXJkIHBvaW50ZXIsIHJldHVybnMgd2hldGhlciB3ZSBzaG91bGQgdXNlIGludGVycnVwdHMgb3Igbm90LgorICovCitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfdXNlaW50cihzdHJ1Y3QgYm9hcmRfdCAqYmQpCit7CisJc3RydWN0IGNub2RlICpwID0gTlVMTDsKKworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3dpdGNoIChwLT50eXBlKSB7CisJCWNhc2UgSU5UUk5PREU6CisJCQkvKgorCQkJICogY2hlY2sgZm9yIHBjeHIgdHlwZXMuCisJCQkgKi8KKwkJCXJldHVybiBwLT51LnVzZWludHI7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIG5vdCBmb3VuZCwgdGhlbiBkb24ndCB0dXJuIG9uIGludGVycnVwdHMuICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHaXZlbiBhIGJvYXJkIHBvaW50ZXIsIHJldHVybnMgd2hldGhlciB3ZSB0dXJuIG9uIGFsdHBpbiBvciBub3QuCisgKi8KK3N0YXRpYyB1aW50IGRnYXBfY29uZmlnX2dldF9hbHRwaW4oc3RydWN0IGJvYXJkX3QgKmJkKQoreworCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7CisKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAocCA9IGJkLT5iZF9jb25maWc7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIEFOT0RFOgorCQkJLyoKKwkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgorCQkJICovCisJCQlyZXR1cm4gcC0+dS5hbHRwaW47CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIG5vdCBmb3VuZCwgdGhlbiBkb24ndCB0dXJuIG9uIGludGVycnVwdHMuICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHaXZlbiBhIHNwZWNpZmljIHR5cGUgb2YgYm9hcmQsIGlmIGZvdW5kLCBkZXRhY2hlZCBsaW5rIGFuZAorICogcmV0dXJucyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiB0aGUgbGlzdC4KKyAqLworc3RhdGljIHN0cnVjdCBjbm9kZSAqZGdhcF9maW5kX2NvbmZpZyhpbnQgdHlwZSwgaW50IGJ1cywgaW50IHNsb3QpCit7CisJc3RydWN0IGNub2RlICpwLCAqcHJldiA9IE5VTEwsICpwcmV2MiA9IE5VTEwsICpmb3VuZCA9IE5VTEw7CisKKwlwID0gJmRnYXBfaGVhZDsKKworCXdoaWxlIChwLT5uZXh0ICE9IE5VTEwpIHsKKwkJcHJldiA9IHA7CisJCXAgPSBwLT5uZXh0OworCisJCWlmIChwLT50eXBlID09IEJOT0RFKSB7CisKKwkJCWlmIChwLT51LmJvYXJkLnR5cGUgPT0gdHlwZSkgeworCisJCQkJaWYgKHAtPnUuYm9hcmQudl9wY2lidXMgJiYKKwkJCQkgICAgcC0+dS5ib2FyZC5wY2lidXMgIT0gYnVzKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocC0+dS5ib2FyZC52X3BjaXNsb3QgJiYKKwkJCQkgICAgcC0+dS5ib2FyZC5wY2lzbG90ICE9IHNsb3QpCisJCQkJCWNvbnRpbnVlOworCisJCQkJZm91bmQgPSBwOworCQkJCS8qCisJCQkJICogS2VlcCB3YWxraW5nIHRocnUgdGhlIGxpc3QgdGlsbCB3ZQorCQkJCSAqIGZpbmQgdGhlIG5leHQgYm9hcmQuCisJCQkJICovCisJCQkJd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgeworCQkJCQlwcmV2MiA9IHA7CisJCQkJCXAgPSBwLT5uZXh0OworCQkJCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgeworCisJCQkJCQkvKgorCQkJCQkJICogTWFyayB0aGUgZW5kIG9mIG91ciAxIGJvYXJkCisJCQkJCQkgKiBjaGFpbiBvZiBjb25maWdzLgorCQkJCQkJICovCisJCQkJCQlwcmV2Mi0+bmV4dCA9IE5VTEw7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBMaW5rIHRoZSAibmV4dCIgYm9hcmQgdG8gdGhlCisJCQkJCQkgKiBwcmV2aW91cyBib2FyZCwgZWZmZWN0aXZlbHkKKwkJCQkJCSAqICJ1bmxpbmtpbmciIG91ciBib2FyZCBmcm9tCisJCQkJCQkgKiB0aGUgbWFpbiBjb25maWcuCisJCQkJCQkgKi8KKwkJCQkJCXByZXYtPm5leHQgPSBwOworCisJCQkJCQlyZXR1cm4gZm91bmQ7CisJCQkJCX0KKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJdCBtdXN0IGJlIHRoZSBsYXN0IGJvYXJkIGluIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCXByZXYtPm5leHQgPSBOVUxMOworCQkJCXJldHVybiBmb3VuZDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEdpdmVuIGEgYm9hcmQgcG9pbnRlciwgd2Fsa3MgdGhlIGNvbmZpZyBsaW5rLCBjb3VudGluZyB1cAorICogYWxsIHBvcnRzIHVzZXIgc3BlY2lmaWVkIHNob3VsZCBiZSBvbiB0aGUgYm9hcmQuCisgKiAoVGhpcyBkb2VzIE5PVCBtZWFuIHRoZXkgYXJlIGFsbCBhY3R1YWxseSBwcmVzZW50IHJpZ2h0IG5vdyB0aG8pCisgKi8KK3N0YXRpYyB1aW50IGRnYXBfY29uZmlnX2dldF9udW1fcHJ0cyhzdHJ1Y3QgYm9hcmRfdCAqYmQpCit7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOworCisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgeworCisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIEJOT0RFOgorCQkJLyoKKwkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgorCQkJICovCisJCQlpZiAocC0+dS5ib2FyZC50eXBlID4gRVBDRkUpCisJCQkJY291bnQgKz0gcC0+dS5ib2FyZC5ucG9ydDsKKwkJCWJyZWFrOworCQljYXNlIENOT0RFOgorCQkJY291bnQgKz0gcC0+dS5jb25jLm5wb3J0OworCQkJYnJlYWs7CisJCWNhc2UgTU5PREU6CisJCQljb3VudCArPSBwLT51Lm1vZHVsZS5ucG9ydDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNoYXIgKmRnYXBfY3JlYXRlX2NvbmZpZ19zdHJpbmcoc3RydWN0IGJvYXJkX3QgKmJkLCBjaGFyICpzdHJpbmcpCit7CisJY2hhciAqcHRyID0gc3RyaW5nOworCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7CisJc3RydWN0IGNub2RlICpxID0gTlVMTDsKKwlpbnQgc3BlZWQ7CisKKwlpZiAoIWJkKSB7CisJCSpwdHIgPSAweGZmOworCQlyZXR1cm4gc3RyaW5nOworCX0KKworCWZvciAocCA9IGJkLT5iZF9jb25maWc7IHA7IHAgPSBwLT5uZXh0KSB7CisKKwkJc3dpdGNoIChwLT50eXBlKSB7CisJCWNhc2UgTE5PREU6CisJCQkqcHRyID0gJ1wwJzsKKwkJCXB0cisrOworCQkJKnB0ciA9IHAtPnUubGluZS5zcGVlZDsKKwkJCXB0cisrOworCQkJYnJlYWs7CisJCWNhc2UgQ05PREU6CisJCQkvKgorCQkJICogQmVjYXVzZSB0aGUgRVBDL2NvbiBjb25jZW50cmF0b3JzIGNhbiBoYXZlIEVNIG1vZHVsZXMKKwkJCSAqIGhhbmdpbmcgb2ZmIG9mIHRoZW0sIHdlIGhhdmUgdG8gd2FsayBhaGVhZCBpbiB0aGUKKwkJCSAqIGxpc3QgYW5kIGtlZXAgYWRkaW5nIHRoZSBudW1iZXIgb2YgcG9ydHMgb24gZWFjaCBFTQorCQkJICogdG8gdGhlIGNvbmZpZy4gVUdIIQorCQkJICovCisJCQlzcGVlZCA9IHAtPnUuY29uYy5zcGVlZDsKKwkJCXEgPSBwLT5uZXh0OworCQkJaWYgKChxICE9IE5VTEwpICYmIChxLT50eXBlID09IE1OT0RFKSkgeworCQkJCSpwdHIgPSAocC0+dS5jb25jLm5wb3J0ICsgMHg4MCk7CisJCQkJcHRyKys7CisJCQkJcCA9IHE7CisJCQkJd2hpbGUgKChxLT5uZXh0ICE9IE5VTEwpICYmCisJCQkJICAgICAgIChxLT5uZXh0LT50eXBlKSA9PSBNTk9ERSkgeworCisJCQkJCSpwdHIgPSAocS0+dS5tb2R1bGUubnBvcnQgKyAweDgwKTsKKwkJCQkJcHRyKys7CisJCQkJCXAgPSBxOworCQkJCQlxID0gcS0+bmV4dDsKKwkJCQl9CisJCQkJKnB0ciA9IHEtPnUubW9kdWxlLm5wb3J0OworCQkJCXB0cisrOworCQkJfSBlbHNlIHsKKwkJCQkqcHRyID0gcC0+dS5jb25jLm5wb3J0OworCQkJCXB0cisrOworCQkJfQorCisJCQkqcHRyID0gc3BlZWQ7CisJCQlwdHIrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJKnB0ciA9IDB4ZmY7CisJcmV0dXJuIHN0cmluZzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjhmNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5oCkBAIC0wLDAgKzEsMTMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQorICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCisgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERyaXZlciBpbmNsdWRlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fREdBUF9EUklWRVJfSAorI2RlZmluZSBfX0RHQVBfRFJJVkVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ICAgICAgICAvKiBUbyBwaWNrIHVwIHRoZSB2YXJpb25zIExpbnV4IHR5cGVzICovCisjaW5jbHVkZSA8bGludXgvdHR5Lmg+ICAgICAgICAgIC8qIFRvIHBpY2sgdXAgdGhlIHZhcmlvdXMgdHR5IHN0cnVjdHMvZGVmaW5lcyAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAgICAvKiBGb3IgaXJxcmV0dXJuX3QgdHlwZSAqLworCisjaWZuZGVmIFRSVUUKKyMgZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyMgZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisvKiBSZXF1aXJlZCBmb3Igb3VyIHNoYXJlZCBoZWFkZXJzISAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1Y2hhcjsKKworI2lmICFkZWZpbmVkKFRUWV9GTElQQlVGX1NJWkUpCisjIGRlZmluZSBUVFlfRkxJUEJVRl9TSVpFIDUxMgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRHJpdmVyIGRlZmluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERyaXZlciBpZGVudGlmaWNhdGlvbgorICovCisjZGVmaW5lCURHX05BTUUJCSJkZ2FwLTEuMy0xNiIKKyNkZWZpbmUJREdfUEFSVAkJIjQwMDAyMzQ3X0MiCisjZGVmaW5lCURSVlNUUgkJImRnYXAiCisKKy8qCisgKiBkZWZpbmVzIGZyb20gZGdhcF9wY2kuaAorICovIAorI2RlZmluZSBQQ0lNQVggMzIJCQkvKiBtYXhpbXVtIG51bWJlciBvZiBQQ0kgYm9hcmRzICovCisKKyNkZWZpbmUgRElHSV9WSUQJCTB4MTE0RgorCisjZGVmaW5lIFBDSV9ERVZfRVBDX0RJRAkJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZfWEVNX0RJRAkJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZfWFJfRElECQkweDAwMDUKKyNkZWZpbmUgUENJX0RFVl9DWF9ESUQJCTB4MDAwNgorI2RlZmluZSBQQ0lfREVWX1hSSl9ESUQJCTB4MDAwOQkvKiBQTFgtYmFzZWQgWHIgYWRhcHRlciAqLworI2RlZmluZSBQQ0lfREVWX1hSX0lCTV9ESUQJMHgwMDExCS8qIElCTSA4LXBvcnQgQXN5bmMgQWRhcHRlciAqLworI2RlZmluZSBQQ0lfREVWX1hSX0JVTExfRElECTB4MDAxMwkvKiBCVUxMIDgtcG9ydCBBc3luYyBBZGFwdGVyICovCisjZGVmaW5lIFBDSV9ERVZfWFJfU0FJUF9ESUQJMHgwMDFjCS8qIFNBSVAgY2FyZCAtIFhyIGFkYXB0ZXIgKi8KKyNkZWZpbmUgUENJX0RFVl9YUl80MjJfRElECTB4MDAxMgkvKiBYci00MjIgKi8KKyNkZWZpbmUgUENJX0RFVl85MjBfMl9ESUQJMHgwMDM0CS8qIFhSLVBsdXMgOTIwIEssIDIgcG9ydCAqLworI2RlZmluZSBQQ0lfREVWXzkyMF80X0RJRAkweDAwMjYJLyogWFItUGx1cyA5MjAgSywgNCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZfOTIwXzhfRElECTB4MDAyNwkvKiBYUi1QbHVzIDkyMCBLLCA4IHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVl9FUENKX0RJRAkweDAwMGEJLyogUExYIDkwNjAgY2hpcCBmb3IgUENJICAqLworI2RlZmluZSBQQ0lfREVWX0NYX0lCTV9ESUQJMHgwMDFiCS8qIElCTSAxMjgtcG9ydCBBc3luYyBBZGFwdGVyICovCisjZGVmaW5lIFBDSV9ERVZfOTIwXzhfSFBfRElECTB4MDA1OAkvKiBIUCBYUi1QbHVzIDkyMCBLLCA4IHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVl9YRU1fSFBfRElECTB4MDA1OSAgLyogSFAgWGVtIFBDSSAqLworCisjZGVmaW5lIFBDSV9ERVZfWEVNX05BTUUJIkFjY2VsZVBvcnQgWEVNIgorI2RlZmluZSBQQ0lfREVWX0NYX05BTUUJCSJBY2NlbGVQb3J0IENYIgorI2RlZmluZSBQQ0lfREVWX1hSX05BTUUJCSJBY2NlbGVQb3J0IFhyIgorI2RlZmluZSBQQ0lfREVWX1hSSl9OQU1FCSJBY2NlbGVQb3J0IFhyIChQTFgpIgorI2RlZmluZSBQQ0lfREVWX1hSX1NBSVBfTkFNRQkiQWNjZWxlUG9ydCBYciAoU0FJUCkiCisjZGVmaW5lIFBDSV9ERVZfOTIwXzJfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCAyIHBvcnQiCisjZGVmaW5lIFBDSV9ERVZfOTIwXzRfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCA0IHBvcnQiCisjZGVmaW5lIFBDSV9ERVZfOTIwXzhfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCA4IHBvcnQiCisjZGVmaW5lIFBDSV9ERVZfWFJfNDIyX05BTUUJIkFjY2VsZVBvcnQgWHIgNDIyIgorI2RlZmluZSBQQ0lfREVWX0VQQ0pfTkFNRQkiQWNjZWxlUG9ydCBFUEMgKFBMWCkiCisjZGVmaW5lIFBDSV9ERVZfWFJfQlVMTF9OQU1FCSJBY2NlbGVQb3J0IFhyIChCVUxMKSIKKyNkZWZpbmUgUENJX0RFVl9YUl9JQk1fTkFNRQkiQWNjZWxlUG9ydCBYciAoSUJNKSIKKyNkZWZpbmUgUENJX0RFVl9DWF9JQk1fTkFNRQkiQWNjZWxlUG9ydCBDWCAoSUJNKSIKKyNkZWZpbmUgUENJX0RFVl85MjBfOF9IUF9OQU1FCSJBY2NlbGVQb3J0IFhyOTIwIDggcG9ydCAoSFApIgorI2RlZmluZSBQQ0lfREVWX1hFTV9IUF9OQU1FCSJBY2NlbGVQb3J0IFhFTSAoSFApIgorCisvKgorICogT24gdGhlIFBDSSBib2FyZHMsIHRoZXJlIGlzIG5vIElPIHNwYWNlIGFsbG9jYXRlZAorICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUKKyAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkKKyAqIHdpbGwgYmUgbWFwcGVkIGludG8gdGhlIGxvdyAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UKKyAqLworCisvKiBQb3RlbnRpYWwgbG9jYXRpb24gb2YgUENJIEJpb3MgZnJvbSBFMDAwMCB0byBGRkZGRiovCisjZGVmaW5lIFBDSV9CSU9TX1NJWkUJCTB4MDAwMjAwMDAKKworLyogU2l6ZSBvZiBNZW1vcnkgYW5kIEkvTyBmb3IgUENJICg0TUIpICovCisjZGVmaW5lIFBDSV9SQU1fU0laRQkJMHgwMDQwMDAwMAorCisvKiBTaXplIG9mIE1lbW9yeSAoMk1CKSAqLworI2RlZmluZSBQQ0lfTUVNX1NJWkUJCTB4MDAyMDAwMDAKKworLyogTWF4IFBDSSBXaW5kb3cgU2l6ZSAoMk1CKSAqLworI2RlZmluZSBQQ0lfV0lOX1NJWkUJCTB4MDAyMDAwMDAKKworI2RlZmluZSBQQ0lfV0lOX1NISUZUCQkyMSAvKiAyMSBiaXRzIG1heCAqLworCisvKiBPZmZzZXQgb2YgSS8wIGluIE1lbW9yeSAoMk1CKSAqLworI2RlZmluZSBQQ0lfSU9fT0ZGU0VUCQkweDAwMjAwMDAwCisKKy8qIFNpemUgb2YgSU8gKDJNQikgKi8KKyNkZWZpbmUgUENJX0lPX1NJWkUJCTB4MDAyMDAwMDAKKworLyogTnVtYmVyIG9mIGJvYXJkcyB3ZSBzdXBwb3J0IGF0IG9uY2UuICovCisjZGVmaW5lCU1BWEJPQVJEUwkzMgorI2RlZmluZQlNQVhQT1JUUwkyMjQKKyNkZWZpbmUgTUFYVFRZTkFNRUxFTgkyMDAKKworLyogT3VyIDMgbWFnaWMgbnVtYmVycyBmb3Igb3VyIGJvYXJkLCBjaGFubmVsIGFuZCB1bml0IHN0cnVjdHMgKi8KKyNkZWZpbmUgREdBUF9CT0FSRF9NQUdJQwkweDVjNmRmMTA0CisjZGVmaW5lIERHQVBfQ0hBTk5FTF9NQUdJQwkweDZjNmRmMTA0CisjZGVmaW5lIERHQVBfVU5JVF9NQUdJQwkJMHg3YzZkZjEwNAorCisvKiBTZXJpYWwgcG9ydCB0eXBlcyAqLworI2RlZmluZSBER0FQX1NFUklBTAkJMAorI2RlZmluZSBER0FQX1BSSU5UCQkxCisKKyNkZWZpbmUJU0VSSUFMX1RZUEVfTk9STUFMCTEKKworLyogNCBleHRyYSBmb3IgYWxpZ25tZW50IHBsYXkgc3BhY2UgKi8KKyNkZWZpbmUgV1JJVEVCVUZMRU4JCSgoNDA5NikgKyA0KQorI2RlZmluZSBNWUZMSVBMRU4JCU5fVFRZX0JVRl9TSVpFCisKKyNkZWZpbmUgU0JSRUFLX1RJTUUgMHgyNQorI2RlZmluZSBVMkJTSVpFIDB4NDAwCisKKyNkZWZpbmUgZGdhcF9qaWZmaWVzX2Zyb21fbXMoYSkgKCgoYSkgKiBIWikgLyAxMDAwKQorCisvKgorICogT3VyIG1ham9yIGZvciB0aGUgbWdtdCBkZXZpY2VzLgorICoKKyAqIFdlIGNhbiB1c2UgMjIsIGJlY2F1c2UgRGlnaSB3YXMgYWxsb2NhdGVkIDIyIGFuZCAyMyBmb3IgdGhlIGVwY2EgZHJpdmVyLgorICogMjIgaGFzIG5vdyBiZWNvbWUgb2Jzb2xldGUgbm93IHRoYXQgdGhlICJjdSIgZGV2aWNlcyBoYXZlCisgKiBiZWVuIHJlbW92ZWQgZnJvbSAyLjYuCisgKiBBbHNvLCB0aGlzICpJUyogdGhlIGVwY2EgZHJpdmVyLCBqdXN0IFBDSSBvbmx5IG5vdy4KKyAqLworI2lmbmRlZiBESUdJX0RHQVBfTUFKT1IKKyMgZGVmaW5lIERJR0lfREdBUF9NQUpPUiAgICAgICAgIDIyCisjZW5kaWYKKworLyoKKyAqIFRoZSBwYXJhbWV0ZXJzIHdlIHVzZSB0byBkZWZpbmUgdGhlIHBlcmlvZHMgb2YgdGhlIG1vdmluZyBhdmVyYWdlcy4KKyAqLworI2RlZmluZQkJTUFfUEVSSU9ECShIWiAvIDEwKQorI2RlZmluZQkJU01BX0RVUgkJKDEgKiBIWikKKyNkZWZpbmUJCUVNQV9EVVIJCSgxICogSFopCisjZGVmaW5lCQlTTUFfTlBFUklPRFMJKFNNQV9EVVIgLyBNQV9QRVJJT0QpCisjZGVmaW5lCQlFTUFfTlBFUklPRFMJKEVNQV9EVVIgLyBNQV9QRVJJT0QpCisKKy8qCisgKiBEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCisgKiB3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuICBUaGlzIGlzIHRoZSBzYW1lIHN0cnVjdHVyZSB0aGF0IGlzIGRlZmluZWQKKyAqIGFzIHRoZSBkZWZhdWx0IGluIHR0eV9pby5jIHdpdGggdGhlIHNhbWUgc2V0dGluZ3Mgb3ZlcnJpZGVuIGFzIGluIHNlcmlhbC5jCisgKgorICogSW4gc2hvcnQsIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSBpbnRlcm5hbCBzZXJpYWwgcG9ydHMnIGRlZmF1bHRzLgorICovCisjZGVmaW5lCURFRkFVTFRfSUZMQUdTCShJQ1JOTCB8IElYT04pCisjZGVmaW5lCURFRkFVTFRfT0ZMQUdTCShPUE9TVCB8IE9OTENSKQorI2RlZmluZQlERUZBVUxUX0NGTEFHUwkoQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMKQorI2RlZmluZQlERUZBVUxUX0xGTEFHUwkoSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgXAorCQkJRUNIT0NUTCB8IEVDSE9LRSB8IElFWFRFTikKKworI2lmbmRlZiBfUE9TSVhfVkRJU0FCTEUKKyNkZWZpbmUgICBfUE9TSVhfVkRJU0FCTEUgJ1wwJworI2VuZGlmCisKKyNkZWZpbmUgU05JRkZfTUFYCTY1NTM2CQkvKiBTbmlmZiBidWZmZXIgc2l6ZSAoMl5uKSAqLworI2RlZmluZSBTTklGRl9NQVNLCShTTklGRl9NQVggLSAxKQkvKiBTbmlmZiB3cmFwIG1hc2sgKi8KKworI2RlZmluZSBWUERTSVpFICg1MTIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgRkVQIG1lbW9yeSBvZmZzZXRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTVEFSVCAgICAgICAgICAgMHgwMDA0TCAgICAgICAgIC8qIEV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzICAgICAgKi8KKworI2RlZmluZSBDTURCVUYgICAgICAgICAgMHgwZDEwTCAgICAgICAgIC8qIENvbW1hbmQgKGNtX3QpIHN0cnVjdHVyZSBvZmZzZXQgKi8KKyNkZWZpbmUgQ01EU1RBUlQgICAgICAgIDB4MDQwMEwgICAgICAgICAvKiBTdGFydCBvZiBjb21tYW5kIGJ1ZmZlciAgICAgICovCisjZGVmaW5lIENNRE1BWCAgICAgICAgICAweDA4MDBMICAgICAgICAgLyogRW5kIG9mIGNvbW1hbmQgYnVmZmVyICAgICAgICAqLworCisjZGVmaW5lIEVWQlVGICAgICAgICAgICAweDBkMThMICAgICAgICAgLyogRXZlbnQgKGV2X3QpIHN0cnVjdHVyZSAgICAgICAqLworI2RlZmluZSBFVlNUQVJUICAgICAgICAgMHgwODAwTCAgICAgICAgIC8qIFN0YXJ0IG9mIGV2ZW50IGJ1ZmZlciAgICAgICAgKi8KKyNkZWZpbmUgRVZNQVggICAgICAgICAgIDB4MGMwMEwgICAgICAgICAvKiBFbmQgb2YgZXZlbnQgYnVmZmVyICAgICAgICAgICovCisjZGVmaW5lIEZFUDVfUExVUyAgICAgICAweDBFNDAgICAgICAgICAgLyogQVNDSUkgJzUnIGFuZCBBU0NJSSAnQScgaXMgaGVyZSAgKi8KKyNkZWZpbmUgRUNTX1NFRyAgICAgICAgIDB4MEU0NCAgICAgICAgICAvKiBTZWdtZW50IG9mIHRoZSBleHRlbmRlZCBjaGFubmVsIHN0cnVjdHVyZSAqLworI2RlZmluZSBMSU5FX1NQRUVEICAgICAgMHgxMCAgICAgICAgICAgIC8qIE9mZnNldCBpbnRvIEVDU19TRUcgZm9yIGxpbmUgc3BlZWQgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBmZXAgaGFzIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLworCisvKiBCSU9TIE1BR0lDIFNQT1RTICovCisjZGVmaW5lIEVSUk9SICAgICAgICAgICAweDBDMTRMCQkvKiBCSU9TIGVycm9yIGNvZGUgICAgICAgICAgICAgICovCisjZGVmaW5lIFNFUVVFTkNFCTB4MEMxMkwJCS8qIEJJT1Mgc2VxdWVuY2UgaW5kaWNhdG9yICAgICAgKi8KKyNkZWZpbmUgUE9TVEFSRUEJMHgwQzAwTAkJLyogUE9TVCBjb21wbGV0ZSBtZXNzYWdlIGFyZWEgICAqLworCisvKiBGRVAgTUFHSUMgU1BPVFMgKi8KKyNkZWZpbmUgRkVQU1RBVCAgICAgICAgIFBPU1RBUkVBICAgICAgICAvKiBPUyBoZXJlIHdoZW4gRkVQIGNvbWVzIHVwICAgICovCisjZGVmaW5lIE5DSEFOICAgICAgICAgICAweDBDMDJMICAgICAgICAgLyogbnVtYmVyIG9mIHBvcnRzIEZFUCBzZWVzICAgICAqLworI2RlZmluZSBQQU5JQyAgICAgICAgICAgMHgwQzEwTCAgICAgICAgIC8qIFBBTklDIGFyZWEgZm9yIEZFUCAgICAgICAgICAgKi8KKyNkZWZpbmUgS01FTUVNICAgICAgICAgIDB4MEMzMEwgICAgICAgICAvKiBNZW1vcnkgZm9yIEtNRSB1c2UgICAgICAgICAgICovCisjZGVmaW5lIENPTkZJRyAgICAgICAgICAweDBDRDBMICAgICAgICAgLyogQ29uY2VudHJhdG9yIGNvbmZpZ3VyYXRpb24gaW5mbyAqLworI2RlZmluZSBDT05GSUdTSVpFICAgICAgMHgwMDMwICAgICAgICAgIC8qIGNvbmZpZ3VyYXRpb24gaW5mbyBzaXplICAgICAgKi8KKyNkZWZpbmUgRE9XTlJFUSAgICAgICAgIDB4MEQwMCAgICAgICAgICAvKiBEb3dubG9hZCByZXF1ZXN0IGJ1ZmZlciBwb2ludGVyICovCisKKyNkZWZpbmUgQ0hBTkJVRiAgICAgICAgIDB4MTAwMEwgICAgICAgICAvKiBBc3luYyBjaGFubmVsIChic190KSBzdHJ1Y3RzICovCisjZGVmaW5lIEZFUE9TU0laRSAgICAgICAweDFGRkYgICAgICAgICAgLyogOEsgRkVQT1MgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFhFTVBPUlRTICAgIDB4QzAyCS8qCisJCQkJICogT2Zmc2V0IGluIGJvYXJkIG1lbW9yeSB3aGVyZSBGRVA1IHN0b3JlcworCQkJCSAqIGhvdyBtYW55IHBvcnRzIGl0IGhhcyBkZXRlY3RlZC4KKwkJCQkgKiBOT1RFOiBGRVA1IHJlcG9ydHMgNjQgcG9ydHMgd2hlbiB0aGUgdXNlcgorCQkJCSAqIGhhcyB0aGUgY2FibGUgaW4gRUJJIE9VVCBpbnN0ZWFkIG9mIEVCSSBJTi4KKwkJCQkgKi8KKworI2RlZmluZSBGRVBDTFIgICAgICAweDAwCisjZGVmaW5lIEZFUE1FTSAgICAgIDB4MDIKKyNkZWZpbmUgRkVQUlNUICAgICAgMHgwNAorI2RlZmluZSBGRVBJTlQgICAgICAweDA4CisjZGVmaW5lIEZFUE1BU0sgICAgIDB4MGUKKyNkZWZpbmUgRkVQV0lOICAgICAgMHg4MAorCisjZGVmaW5lIExPV01FTSAgICAgIDB4MDEwMAorI2RlZmluZSBISUdITUVNICAgICAweDdmMDAKKworI2RlZmluZSBGRVBUSU1FT1VUIDIwMDAwMAorCisjZGVmaW5lIEVOQUJMRV9JTlRSCQkweDBlMDQJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZsYWcgKi8KKyNkZWZpbmUgRkVQUE9MTF9NSU4JCTEJCS8qIG1pbmltdW0gb2YgMSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBGRVBQT0xMX01BWAkJMjAJCS8qIG1heGltdW0gb2YgMjAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIEZFUFBPTEwJCQkweDBjMjYJCS8qIEZlcCBldmVudCBwb2xsIGludGVydmFsICovCisKKyNkZWZpbmUJSUFMVFBJTgkJCTB4MDA4MAkJLyogSW5wdXQgZmxhZyB0byBzd2FwIERTUiA8LT4gRENEICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZFUCBzdXBwb3J0ZWQgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTUkxPVwkJMHhlMAkJLyogU2V0IHJlY2VpdmUgbG93IHdhdGVyCSovCisjZGVmaW5lIFNSSElHSAkJMHhlMQkJLyogU2V0IHJlY2VpdmUgaGlnaCB3YXRlcgkqLworI2RlZmluZSBGTFVTSFRYCQkweGUyCQkvKiBGbHVzaCB0cmFuc21pdCBidWZmZXIJKi8KKyNkZWZpbmUgUEFVU0VUWAkJMHhlMwkJLyogUGF1c2UgZGF0YSB0cmFuc21pc3Npb24JKi8KKyNkZWZpbmUgUkVTVU1FVFgJMHhlNAkJLyogUmVzdW1lIGRhdGEgdHJhbnNtaXNzaW9uCSovCisjZGVmaW5lIFNNSU5UCQkweGU1CQkvKiBTZXQgTW9kZW0gSW50ZXJydXB0CQkqLworI2RlZmluZSBTQUZMT1dDCQkweGU2CQkvKiBTZXQgQXV4LiBmbG93IGNvbnRyb2wgY2hhcnMJKi8KKyNkZWZpbmUgU0JSRUFLCQkweGU4CQkvKiBTZW5kIGJyZWFrCQkJKi8KKyNkZWZpbmUgU01PREVNCQkweGU5CQkvKiBTZXQgODUzMCBtb2RlbSBjb250cm9sIGxpbmVzCSovCisjZGVmaW5lIFNJRkxBRwkJMHhlYQkJLyogU2V0IFVOSVggaWZsYWdzCQkqLworI2RlZmluZSBTRkxPV0MJCTB4ZWIJCS8qIFNldCBmbG93IGNvbnRyb2wgY2hhcmFjdGVycwkqLworI2RlZmluZSBTVExPVwkJMHhlYwkJLyogU2V0IHRyYW5zbWl0IGxvdyB3YXRlciBtYXJrCSovCisjZGVmaW5lIFJQQVVTRQkJMHhlZQkJLyogUGF1c2UgcmVjZWl2ZQkJKi8KKyNkZWZpbmUgUlJFU1VNRQkJMHhlZgkJLyogUmVzdW1lIHJlY2VpdmUJCSovCisjZGVmaW5lIENIUkVTRVQJCTB4ZjAJCS8qIFJlc2V0IENoYW5uZWwJCSovCisjZGVmaW5lIEJVRlNFVEFMTAkweGYyCQkvKiBTZXQgVHggJiBSeCBidWZmZXIgc2l6ZSBhdmFpbCovCisjZGVmaW5lIFNPRkxBRwkJMHhmMwkJLyogU2V0IFVOSVggb2ZsYWdzCQkqLworI2RlZmluZSBTSEZMT1cJCTB4ZjQJCS8qIFNldCBoYXJkd2FyZSBoYW5kc2hha2UJKi8KKyNkZWZpbmUgU0NGTEFHCQkweGY1CQkvKiBTZXQgVU5JWCBjZmxhZ3MJCSovCisjZGVmaW5lIFNWTkVYVAkJMHhmNgkJLyogU2V0IFZORVhUIGNoYXJhY3RlcgkJKi8KKyNkZWZpbmUgU1BJTlRGQwkJMHhmYwkJLyogUmVzZXJ2ZWQJCQkqLworI2RlZmluZSBTQ09NTU9ERQkweGZkCQkvKiBTZXQgUlMyMzIvNDIyIG1vZGUJCSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTW9kZXMgZm9yIFNDT01NT0RFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNT0RFXzIzMgkweDAwCisjZGVmaW5lIE1PREVfNDIyCTB4MDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIEV2ZW50IGZsYWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSUZCUkVBSyAgICAgICAgIDB4MDEgICAgICAgICAgICAvKiBCcmVhayByZWNlaXZlZCAgICAgICAgICAgICAgICovCisjZGVmaW5lIElGVExXICAgICAgICAgICAweDAyICAgICAgICAgICAgLyogVHJhbnNtaXQgbG93IHdhdGVyICAgICAgICAgICAqLworI2RlZmluZSBJRlRFTSAgICAgICAgICAgMHgwNCAgICAgICAgICAgIC8qIFRyYW5zbWl0dGVyIGVtcHR5ICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUZEQVRBICAgICAgICAgIDB4MDggICAgICAgICAgICAvKiBSZWNlaXZlIGRhdGEgcHJlc2VudCAgICAgICAgICovCisjZGVmaW5lIElGTU9ERU0gICAgICAgICAweDIwICAgICAgICAgICAgLyogTW9kZW0gc3RhdHVzIGNoYW5nZSAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIE1vZGVtIGZsYWdzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIyAgICAgICBkZWZpbmUgIERNX1JUUyAgICAgICAgICAweDAyICAgIC8qIFJlcXVlc3QgdG8gc2VuZCAgICAgICAgICAgICAgKi8KKyMgICAgICAgZGVmaW5lICBETV9DRCAgICAgICAgICAgMHg4MCAgICAvKiBDYXJyaWVyIGRldGVjdCAgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSAgRE1fRFNSICAgICAgICAgIDB4MjAgICAgLyogRGF0YSBzZXQgcmVhZHkgICAgICAgICAgICAgICAqLworIyAgICAgICBkZWZpbmUgIERNX0NUUyAgICAgICAgICAweDEwICAgIC8qIENsZWFyIHRvIHNlbmQgICAgICAgICAgICAgICAgKi8KKyMgICAgICAgZGVmaW5lICBETV9SSSAgICAgICAgICAgMHg0MCAgICAvKiBSaW5nIGluZGljYXRvciAgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSAgRE1fRFRSICAgICAgICAgIDB4MDEgICAgLyogRGF0YSB0ZXJtaW5hbCByZWFkeSAgICAgICAgICAqLworCisvKgorICogZGVmaW5lcyBmcm9tIGRnYXBfY29uZi5oCisgKi8KKyNkZWZpbmUgTlVMTE5PREUgMAkJLyogaGVhZGVyIG5vZGUsIG5vdCB1c2VkICovCisjZGVmaW5lIEJOT0RFIDEJCQkvKiBCb2FyZCBub2RlICovCisjZGVmaW5lIExOT0RFIDIJCQkvKiBMaW5lIG5vZGUgKi8KKyNkZWZpbmUgQ05PREUgMwkJCS8qIENvbmNlbnRyYXRvciBub2RlICovCisjZGVmaW5lIE1OT0RFIDQJCQkvKiBFQkkgTW9kdWxlIG5vZGUgKi8KKyNkZWZpbmUgVE5PREUgNQkJCS8qIHR0eSBuYW1lIHByZWZpeCBub2RlICovCisjZGVmaW5lCUNVTk9ERSA2CQkvKiBjdSBuYW1lIHByZWZpeCAobm9uLVNDTykgKi8KKyNkZWZpbmUgUE5PREUgNwkJCS8qIHRyYW5zLiBwcmludCBwcmVmaXggbm9kZSAqLworI2RlZmluZSBKTk9ERSA4CQkJLyogbWFKb3IgbnVtYmVyIG5vZGUgKi8KKyNkZWZpbmUgQU5PREUgOQkJCS8qIGFsdHBpbiAqLworI2RlZmluZQlUU05PREUgMTAJCS8qIHR0eSBzdHJ1Y3R1cmUgc2l6ZSAqLworI2RlZmluZSBDU05PREUgMTEJCS8qIGNoYW5uZWwgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgQlNOT0RFIDEyCQkvKiBib2FyZCBzdHJ1Y3R1cmUgc2l6ZSAqLworI2RlZmluZSBVU05PREUgMTMJCS8qIHVuaXQgc2NoZWR1bGUgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgRlNOT0RFIDE0CQkvKiBmMjIwMCBzdHJ1Y3R1cmUgc2l6ZSAqLworI2RlZmluZSBWU05PREUgMTUJCS8qIHNpemUgb2YgVlBJWCBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIElOVFJOT0RFIDE2CQkvKiBlbmFibGUgaW50ZXJydXB0ICovCisKKy8qIEVudW1lcmF0aW9uIG9mIHRva2VucyAqLworI2RlZmluZQlCRUdJTgkxCisjZGVmaW5lCUVORAkyCisjZGVmaW5lCUJPQVJECTEwCisKKyNkZWZpbmUgRVBDRlMJMTEgLyogc3RhcnQgb2YgRVBDIGZhbWlseSBkZWZpbml0aW9ucyAqLworI2RlZmluZQlJQ1gJCTExCisjZGVmaW5lCU1DWAkJMTMKKyNkZWZpbmUgUENYCTE0CisjZGVmaW5lCUlFUEMJMTUKKyNkZWZpbmUJRUVQQwkxNgorI2RlZmluZQlNRVBDCTE3CisjZGVmaW5lCUlQQ00JMTgKKyNkZWZpbmUJRVBDTQkxOQorI2RlZmluZQlNUENNCTIwCisjZGVmaW5lIFBFUEMJMjEKKyNkZWZpbmUgUFBDTQkyMgorI2lmZGVmIENQCisjZGVmaW5lIElDUCAgICAgMjMKKyNkZWZpbmUgRUNQICAgICAyNAorI2RlZmluZSBNQ1AgICAgIDI1CisjZW5kaWYKKyNkZWZpbmUgRVBDRkUJMjUgLyogZW5kIG9mIEVQQyBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJUEMyRQkyNgorI2RlZmluZQlQQzRFCTI3CisjZGVmaW5lCVBDNEU4SwkyOAorI2RlZmluZQlQQzhFCTI5CisjZGVmaW5lCVBDOEU4SwkzMAorI2RlZmluZQlQQzE2RQkzMQorI2RlZmluZSBNQzJFOEsgIDM0CisjZGVmaW5lIE1DNEU4SyAgMzUKKyNkZWZpbmUgTUM4RThLICAzNgorCisjZGVmaW5lIEFWQU5GUwk0MgkvKiBzdGFydCBvZiBBdmFuc3RhciBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQThQIAk0MgorI2RlZmluZSBBMTZQCTQzCisjZGVmaW5lIEFWQU5GRQk0MwkvKiBlbmQgb2YgQXZhbnN0YXIgZmFtaWx5IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgREEyMDAwRlMJNDQJLyogc3RhcnQgb2YgQWNjZWxlUG9ydCAyMDAwIGZhbWlseSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBEQTIyIAkJNDQgLyogQWNjZWxlUG9ydCAyMDAyICovCisjZGVmaW5lIERBMjQgCQk0NSAvKiBBY2NlbGVQb3J0IDIwMDQgKi8KKyNkZWZpbmUgREEyOAkJNDYgLyogQWNjZWxlUG9ydCAyMDA4ICovCisjZGVmaW5lIERBMjE2CQk0NyAvKiBBY2NlbGVQb3J0IDIwMTYgKi8KKyNkZWZpbmUgREFSNAkJNDggLyogQWNjZWxlUG9ydCBSQVMgNCBwb3J0ICovCisjZGVmaW5lIERBUjgJCTQ5IC8qIEFjY2VsZVBvcnQgUkFTIDggcG9ydCAqLworI2RlZmluZSBERFIyNAkJNTAgLyogRGF0YUZpcmUgUkFTIDI0IHBvcnQgKi8KKyNkZWZpbmUgRERSMzAJCTUxIC8qIERhdGFGaXJlIFJBUyAzMCBwb3J0ICovCisjZGVmaW5lIEREUjQ4CQk1MiAvKiBEYXRhRmlyZSBSQVMgNDggcG9ydCAqLworI2RlZmluZSBERFI2MAkJNTMgLyogRGF0YUZpcmUgUkFTIDYwIHBvcnQgKi8KKyNkZWZpbmUgREEyMDAwRkUJNTMgLyogZW5kIG9mIEFjY2VsZVBvcnQgMjAwMC9SQVMgZmFtaWx5IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgUENYUkZTCTEwNgkvKiBzdGFydCBvZiBQQ1hSIGZhbWlseSBkZWZpbml0aW9ucyAqLworI2RlZmluZQlBUE9SVDQJMTA2CisjZGVmaW5lCUFQT1JUOAkxMDcKKyNkZWZpbmUgUEFQT1JUNCAxMDgKKyNkZWZpbmUgUEFQT1JUOCAxMDkKKyNkZWZpbmUgQVBPUlQ0XzkyMEkJMTEwCisjZGVmaW5lIEFQT1JUOF85MjBJCTExMQorI2RlZmluZSBBUE9SVDRfOTIwUAkxMTIKKyNkZWZpbmUgQVBPUlQ4XzkyMFAJMTEzCisjZGVmaW5lIEFQT1JUMl85MjBQIDExNAorI2RlZmluZSBQQ1hSRkUJMTE3CS8qIGVuZCBvZiBQQ1hSIGZhbWlseSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUxJTkUJODIKKyNpZmRlZiBUMQorI2RlZmluZSBUMU0JODMKKyNkZWZpbmUgRTFNCTg0CisjZW5kaWYKKyNkZWZpbmUJQ09OQwk2NAorI2RlZmluZQlDWAk2NQorI2RlZmluZQlFUEMJNjYKKyNkZWZpbmUJTU9ECTY3CisjZGVmaW5lCVBPUlRTCTY4CisjZGVmaW5lIE1FVEhPRAk2OQorI2RlZmluZSBDVVNUT00JNzAKKyNkZWZpbmUgQkFTSUMJNzEKKyNkZWZpbmUgU1RBVFVTCTcyCisjZGVmaW5lIE1PREVNCTczCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBjYW4gYXBwZWFyIGluIG11bHRpcGxlIHBsYWNlcyAqLworI2RlZmluZQlTUEVFRAk3NAorI2RlZmluZQlOUE9SVFMJNzUKKyNkZWZpbmUJSUQJNzYKKyNkZWZpbmUgQ0FCTEUJNzcKKyNkZWZpbmUgQ09OTkVDVAk3OAorI2RlZmluZQlJTwk3OQorI2RlZmluZQlNRU0JODAKKyNkZWZpbmUgRFBTWgk4MQorCisjZGVmaW5lCVRUWU4JOTAKKyNkZWZpbmUJQ1UJOTEKKyNkZWZpbmUJUFJJTlQJOTIKKyNkZWZpbmUJWFBSSU5UCTkzCisjZGVmaW5lIENNQUpPUiAgIDk0CisjZGVmaW5lIEFMVFBJTiAgOTUKKyNkZWZpbmUgU1RBUlRPIDk2CisjZGVmaW5lIFVTRUlOVFIgIDk3CisjZGVmaW5lIFBDSUlORk8gIDk4CisKKyNkZWZpbmUJVFRTSVoJMTAwCisjZGVmaW5lCUNIU0laCTEwMQorI2RlZmluZSBCU1NJWgkxMDIKKyNkZWZpbmUJVU5UU0laCTEwMworI2RlZmluZQlGMlNJWgkxMDQKKyNkZWZpbmUJVlBTSVoJMTA1CisKKyNkZWZpbmUJVE9UQUxfQk9BUkQJMgorI2RlZmluZQlDVVJSRU5UX0JSRAk0CisjZGVmaW5lCUJPQVJEX1RZUEUJNgorI2RlZmluZQlJT19BRERSRVNTCTgKKyNkZWZpbmUJTUVNX0FERFJFU1MJMTAKKworI2RlZmluZQlGSUVMRFNfUEVSX1BBR0UJMTgKKworI2RlZmluZSBUQl9GSUVMRAkxCisjZGVmaW5lIENCX0ZJRUxECTMKKyNkZWZpbmUgQlRfRklFTEQJNQorI2RlZmluZSBJT19GSUVMRAk3CisjZGVmaW5lIElEX0ZJRUxECTgKKyNkZWZpbmUgTUVfRklFTEQJOQorI2RlZmluZSBUVFlfRklFTEQJMTEKKyNkZWZpbmUgQ1VfRklFTEQJMTMKKyNkZWZpbmUgUFJfRklFTEQJMTUKKyNkZWZpbmUgTVBSX0ZJRUxECTE3CisKKyNkZWZpbmUJTUFYX0ZJRUxECTUxMgorCisjZGVmaW5lCUlOSVQJCTAKKyNkZWZpbmUJTklURU1TCQkxMjgKKyNkZWZpbmUgTUFYX0lURU0JNTEyCisKKyNkZWZpbmUJRFNDUklOU1QJMQorI2RlZmluZQlEU0NSTlVNCQkzCisjZGVmaW5lCUFMVFBJTlEJCTUKKyNkZWZpbmUJU1NBVkUJCTcKKworI2RlZmluZQlEU0NSCQkiMzIiCisjZGVmaW5lCU9ORVRPTklORQkiMTIzNDU2Nzg5IgorI2RlZmluZQlBTEwJCSIxMjM0NTY3ODkwIgorCisvKgorICogQWxsIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhlIGRyaXZlciBjYW4gYmUgd2hpbGUgYmVpbmcgbG9hZGVkLgorICovCitlbnVtIHsKKwlEUklWRVJfSU5JVElBTElaRUQgPSAwLAorCURSSVZFUl9SRUFEWQorfTsKKworLyoKKyAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoZSBib2FyZCBjYW4gYmUgd2hpbGUgYm9vdGluZyB1cC4KKyAqLworZW51bSB7CisJQk9BUkRfRkFJTEVEID0gMCwKKwlCT0FSRF9SRUFEWQorfTsKKworLyoKKyAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoYXQgYSByZXF1ZXN0ZWQgY29uY2VudHJhdG9yIGltYWdlIGNhbiBiZSBpbi4KKyAqLworZW51bSB7CisJTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFMgPSAwLAorCU5FRURfQ09OQ0VOVFJBVE9SLAorCVJFUVVFU1RFRF9DT05DRU5UUkFUT1IKK307CisKKworCisvKgorICogTW9kZW0gbGluZSBjb25zdGFudHMgYXJlIGRlZmluZWQgYXMgbWFjcm9zIGJlY2F1c2UgRFNSIGFuZAorICogRENEIGFyZSBzd2FwYWJsZSB1c2luZyB0aGUgZGl0dHkgYWx0cGluIG9wdGlvbi4KKyAqLworI2RlZmluZSBEX0NEKGNoKSAgICAgICAgY2gtPmNoX2NkICAgICAgIC8qIENhcnJpZXIgZGV0ZWN0ICAgICAgICovCisjZGVmaW5lIERfRFNSKGNoKSAgICAgICBjaC0+Y2hfZHNyICAgICAgLyogRGF0YSBzZXQgcmVhZHkgICAgICAgKi8KKyNkZWZpbmUgRF9SVFMoY2gpICAgICAgIERNX1JUUyAgICAgICAgICAvKiBSZXF1ZXN0IHRvIHNlbmQgICAgICAqLworI2RlZmluZSBEX0NUUyhjaCkgICAgICAgRE1fQ1RTICAgICAgICAgIC8qIENsZWFyIHRvIHNlbmQgICAgICAgICovCisjZGVmaW5lIERfUkkoY2gpICAgICAgICBETV9SSSAgICAgICAgICAgLyogUmluZyBpbmRpY2F0b3IgICAgICAgKi8KKyNkZWZpbmUgRF9EVFIoY2gpICAgICAgIERNX0RUUiAgICAgICAgICAvKiBEYXRhIHRlcm1pbmFsIHJlYWR5ICAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3RydWN0dXJlcyBhbmQgY2xvc2VseSByZWxhdGVkIGRlZmluZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIEEgc3RydWN0dXJlIHRvIGhvbGQgYSBzdGF0aXN0aWNzIGNvdW50ZXIuICBXZSBhbHNvCisgKiBjb21wdXRlIG1vdmluZyBhdmVyYWdlcyBmb3IgdGhpcyBjb3VudGVyLgorICovCitzdHJ1Y3QgbWFjb3VudGVyIHsKKwl1MzIJCWNudDsJLyogVG90YWwgY291bnQgKi8KKwl1bG9uZwkJYWNjdW07CS8qIEFjdXVtdWxhdG9yIHBlciBwZXJpb2QgKi8KKwl1bG9uZwkJc21hOwkvKiBTaW1wbGUgbW92aW5nIGF2ZXJhZ2UgKi8KKwl1bG9uZwkJZW1hOwkvKiBFeHBvbmVudGlhbCBtb3ZpbmcgYXZlcmFnZSAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgZmxhZyBkZWZpbml0aW9ucyBmb3IgYmRfZmxhZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlCRF9GRVA1UExVUwkweDAwMDEgICAgICAgICAgLyogU3VwcG9ydHMgRkVQNSBQbHVzIGNvbW1hbmRzICovCisjZGVmaW5lIEJEX0hBU19WUEQJMHgwMDAyCQkvKiBCb2FyZCBoYXMgVlBEIGluZm8gYXZhaWxhYmxlICovCisKKy8qCisgKglQZXItYm9hcmQgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGJvYXJkX3QgeworCWludAkJbWFnaWM7CQkvKiBCb2FyZCBNYWdpYyBudW1iZXIuICAqLworCWludAkJYm9hcmRudW07CS8qIEJvYXJkIG51bWJlcjogMC0zICovCisJaW50CQlmaXJzdG1pbm9yOwkvKiBGaXJzdCBtaW5vciwgZS5nLiAwLCAzMCwgNjAgKi8KKworCWludAkJdHlwZTsJCS8qIFR5cGUgb2YgYm9hcmQgKi8KKwljaGFyCQkqbmFtZTsJCS8qIFByb2R1Y3QgTmFtZSAqLworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OwkJLyogUG9pbnRlciB0byB0aGUgcGNpX2RldiBzdHJ1Y3QgKi8KKwl1MTYJCXZlbmRvcjsJCS8qIFBDSSB2ZW5kb3IgSUQgKi8KKwl1MTYJCWRldmljZTsJCS8qIFBDSSBkZXZpY2UgSUQgKi8KKwl1MTYJCXN1YnZlbmRvcjsJLyogUENJIHN1YnN5c3RlbSB2ZW5kb3IgSUQgKi8KKwl1MTYJCXN1YmRldmljZTsJLyogUENJIHN1YnN5c3RlbSBkZXZpY2UgSUQgKi8KKwl1Y2hhcgkJcmV2OwkJLyogUENJIHJldmlzaW9uIElEICovCisJdWludAkJcGNpX2J1czsJLyogUENJIGJ1cyB2YWx1ZSAqLworCXVpbnQJCXBjaV9zbG90OwkvKiBQQ0kgc2xvdCB2YWx1ZSAqLworCXUxNgkJbWF4cG9ydHM7CS8qIE1BWCBwb3J0cyB0aGlzIGJvYXJkIGNhbiBoYW5kbGUgKi8KKwl1Y2hhcgkJdnBkW1ZQRFNJWkVdOwkvKiBWUEQgb2YgYm9hcmQsIGlmIGZvdW5kICovCisJdTMyCQliZF9mbGFnczsJLyogQm9hcmQgZmxhZ3MgKi8KKworCXNwaW5sb2NrX3QJYmRfbG9jazsJLyogVXNlZCB0byBwcm90ZWN0IGJvYXJkICovCisKKwl1MzIJCXN0YXRlOwkJLyogU3RhdGUgb2YgY2FyZC4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzdGF0ZV93YWl0OwkvKiBQbGFjZSB0byBzbGVlcCBvbiBmb3Igc3RhdGUgY2hhbmdlICovCisKKwlzdHJ1Y3QJCXRhc2tsZXRfc3RydWN0IGhlbHBlcl90YXNrbGV0OyAvKiBQb2xsIGhlbHBlciB0YXNrbGV0ICovCisKKwl1MzIJCXdhaXRfZm9yX2Jpb3M7CisJdTMyCQl3YWl0X2Zvcl9mZXA7CisKKwlzdHJ1Y3QgY25vZGUgICAgKmJkX2NvbmZpZzsJLyogQ29uZmlnIG9mIGJvYXJkICovCisKKwl1MTYJCW5hc3luYzsJCS8qIE51bWJlciBvZiBwb3J0cyBvbiBjYXJkICovCisKKwl1MzIJCXVzZV9pbnRlcnJ1cHRzOwkvKiBTaG91bGQgd2UgYmUgaW50ZXJydXB0IGRyaXZlbj8gKi8KKwl1bG9uZwkJaXJxOwkJLyogSW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyICovCisJdWxvbmcJCWludHJfY291bnQ7CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KKwl1MzIJCWludHJfdXNlZDsJLyogTm9uLXplcm8gaWYgdXNpbmcgaW50ZXJydXB0cyAqLworCXUzMgkJaW50cl9ydW5uaW5nOwkvKiBOb24temVybyBpZiBGRVAga25vd3MgaXRzIGRvaW5nIGludGVycnVwdHMgKi8KKworCXVsb25nCQlwb3J0OwkJLyogU3RhcnQgb2YgYmFzZSBpbyBwb3J0IG9mIHRoZSBjYXJkICovCisJdWxvbmcJCXBvcnRfZW5kOwkvKiBFbmQgb2YgYmFzZSBpbyBwb3J0IG9mIHRoZSBjYXJkICovCisJdWxvbmcJCW1lbWJhc2U7CS8qIFN0YXJ0IG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCisJdWxvbmcJCW1lbWJhc2VfZW5kOwkvKiBFbmQgb2YgYmFzZSBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KKworCXVjaGFyIAkJKnJlX21hcF9wb3J0OwkvKiBSZW1hcHBlZCBpbyBwb3J0IG9mIHRoZSBjYXJkICovCisJdWNoYXIJCSpyZV9tYXBfbWVtYmFzZTsvKiBSZW1hcHBlZCBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KKworCXVjaGFyCQlydW53YWl0OwkvKiAjIFByb2Nlc3NlcyB3YWl0aW5nIGZvciBGRVAgICovCisJdWNoYXIJCWluaGliaXRfcG9sbGVyOyAvKiBUZWxscyAgdGhlIHBvbGxlciB0byBsZWF2ZSB1cyBhbG9uZSAqLworCisJc3RydWN0IGNoYW5uZWxfdCAqY2hhbm5lbHNbTUFYUE9SVFNdOyAvKiBhcnJheSBvZiBwb2ludGVycyB0byBvdXIgY2hhbm5lbHMuICovCisKKwlzdHJ1Y3QgdHR5X2RyaXZlcgkqU2VyaWFsRHJpdmVyOworCXN0cnVjdCB0dHlfcG9ydCAqU2VyaWFsUG9ydHM7CisJY2hhcgkJU2VyaWFsTmFtZVsyMDBdOworCXN0cnVjdCB0dHlfZHJpdmVyCSpQcmludERyaXZlcjsKKwlzdHJ1Y3QgdHR5X3BvcnQgKlByaW50ZXJQb3J0czsKKwljaGFyCQlQcmludE5hbWVbMjAwXTsKKworCXUzMgkJZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZDsKKwl1MzIJCWRnYXBfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkOworCisJdTMyCQlkZ2FwX1NlcmlhbF9NYWpvcjsKKwl1MzIJCWRnYXBfVHJhbnNwYXJlbnRQcmludF9NYWpvcjsKKworCXN0cnVjdCBic190CSpiZF9iczsJCQkvKiBCYXNlIHN0cnVjdHVyZSBwb2ludGVyICAgICAgICovCisKKwljaGFyCSpmbGlwYnVmOwkJLyogT3VyIGZsaXAgYnVmZmVyLCBhbGxvY2VkIGlmIGJvYXJkIGlzIGZvdW5kICovCisJY2hhcgkqZmxpcGZsYWdidWY7CQkvKiBPdXIgZmxpcCBmbGFnIGJ1ZmZlciwgYWxsb2NlZCBpZiBib2FyZCBpcyBmb3VuZCAqLworCisJdTE2CQlkcGF0eXBlOwkvKiBUaGUgYm9hcmQgInR5cGUiLCBhcyBkZWZpbmVkIGJ5IERQQSAqLworCXUxNgkJZHBhc3RhdHVzOwkvKiBUaGUgYm9hcmQgInN0YXR1cyIsIGFzIGRlZmluZWQgYnkgRFBBICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qga21lX3dhaXQ7CS8qIE5lZWRlZCBmb3IgRFBBIHN1cHBvcnQgKi8KKworCXUzMgkJY29uY19kbF9zdGF0dXM7CS8qIFN0YXR1cyBvZiBhbnkgcGVuZGluZyBjb25jIGRvd25sb2FkICovCit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVW5pdCBmbGFnIGRlZmluaXRpb25zIGZvciB1bl9mbGFncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFVOX0lTT1BFTgkweDAwMDEJCS8qIERldmljZSBpcyBvcGVuCQkqLworI2RlZmluZSBVTl9DTE9TSU5HCTB4MDAwMgkJLyogTGluZSBpcyBiZWluZyBjbG9zZWQJCSovCisjZGVmaW5lIFVOX0lNTQkJMHgwMDA0CQkvKiBTZXJ2aWNlIGltbWVkaWF0ZWx5CQkqLworI2RlZmluZSBVTl9CVVNZCQkweDAwMDgJCS8qIFNvbWUgd29yayB0aGlzIGNoYW5uZWwJKi8KKyNkZWZpbmUgVU5fQlJFQUtJCTB4MDAxMAkJLyogSW5wdXQgYnJlYWsgcmVjZWl2ZWQJCSovCisjZGVmaW5lIFVOX1BXQUlUCTB4MDAyMAkJLyogUHJpbnRlciB3YWl0aW5nIGZvciB0ZXJtaW5hbAkqLworI2RlZmluZSBVTl9USU1FCQkweDAwNDAJCS8qIFdhaXRpbmcgb24gdGltZQkJKi8KKyNkZWZpbmUgVU5fRU1QVFkJMHgwMDgwCQkvKiBXYWl0aW5nIG91dHB1dCBxdWV1ZSBlbXB0eQkqLworI2RlZmluZSBVTl9MT1cJCTB4MDEwMAkJLyogV2FpdGluZyBvdXRwdXQgbG93IHdhdGVyIG1hcmsqLworI2RlZmluZSBVTl9FWENMX09QRU4JMHgwMjAwCQkvKiBPcGVuIGZvciBleGNsdXNpdmUgdXNlCSovCisjZGVmaW5lIFVOX1dPUEVOCTB4MDQwMAkJLyogRGV2aWNlIHdhaXRpbmcgZm9yIG9wZW4JKi8KKyNkZWZpbmUgVU5fV0lPQ1RMCTB4MDgwMAkJLyogRGV2aWNlIHdhaXRpbmcgZm9yIG9wZW4JKi8KKyNkZWZpbmUgVU5fSEFOR1VQCTB4ODAwMAkJLyogQ2FycmllciBsb3N0CQkJKi8KKworc3RydWN0IGRldmljZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIGZvciB0ZXJtaW5hbCBvciBwcmludGVyIHVuaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHVuX3QgeworCWludAltYWdpYzsJCS8qIFVuaXQgTWFnaWMgTnVtYmVyLgkJCSovCisJc3RydWN0CWNoYW5uZWxfdCAqdW5fY2g7CisJdTMyCXVuX3RpbWU7CisJdTMyCXVuX3R5cGU7CisJdTMyCXVuX29wZW5fY291bnQ7CS8qIENvdW50ZXIgb2Ygb3BlbnMgdG8gcG9ydAkJKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdW5fdHR5Oy8qIFBvaW50ZXIgdG8gdW5pdCB0dHkgc3RydWN0dXJlCSovCisJdTMyCXVuX2ZsYWdzOwkvKiBVbml0IGZsYWdzCQkJCSovCisJd2FpdF9xdWV1ZV9oZWFkX3QgdW5fZmxhZ3Nfd2FpdDsgLyogUGxhY2UgdG8gc2xlZXAgdG8gd2FpdCBvbiB1bml0ICovCisJdTMyCXVuX2RldjsJCS8qIE1pbm9yIGRldmljZSBudW1iZXIJCQkqLworCXRjZmxhZ190IHVuX29mbGFnOwkvKiBvZmxhZ3MgYmVpbmcgZG9uZSBvbiBib2FyZAkJKi8KKwl0Y2ZsYWdfdCB1bl9sZmxhZzsJLyogbGZsYWdzIGJlaW5nIGRvbmUgb24gYm9hcmQJCSovCisJc3RydWN0IGRldmljZSAqdW5fc3lzZnM7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZSBmbGFnIGRlZmluaXRpb25zIGZvciBjaF9mbGFncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENIX1BST04gICAgICAgICAweDAwMDEgICAgICAgICAgLyogUHJpbnRlciBvbiBzdHJpbmcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfT1VUICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiBEaWFsLW91dCBkZXZpY2Ugb3BlbiAgICAgICAgICAgICAqLworI2RlZmluZSBDSF9TVE9QICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8qIE91dHB1dCBpcyBzdG9wcGVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENIX1NUT1BJICAgICAgICAweDAwMDggICAgICAgICAgLyogSW5wdXQgaXMgc3RvcHBlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfQ0QgICAgICAgICAgIDB4MDAxMCAgICAgICAgICAvKiBDYXJyaWVyIGlzIHByZXNlbnQgICAgICAgICAgICAgICAqLworI2RlZmluZSBDSF9GQ0FSICAgICAgICAgMHgwMDIwICAgICAgICAgIC8qIENhcnJpZXIgZm9yY2VkIG9uICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0hfUlhCTE9DSyAgICAgIDB4MDA4MCAgICAgICAgICAvKiBFbmFibGUgcnggYmxvY2tlZCBmbGFnICAgICAgICAgICAqLworI2RlZmluZSBDSF9XTE9XICAgICAgICAgMHgwMTAwICAgICAgICAgIC8qIFRlcm0gd2FpdGluZyBsb3cgZXZlbnQgICAgICAgICAgICovCisjZGVmaW5lIENIX1dFTVBUWSAgICAgICAweDAyMDAgICAgICAgICAgLyogVGVybSB3YWl0aW5nIGVtcHR5IGV2ZW50ICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfUkVOQUJMRSAgICAgIDB4MDQwMCAgICAgICAgICAvKiBCdWZmZXIganVzdCBlbXB0aWVkICAgICAgICAgICovCisjZGVmaW5lIENIX1JBQ1RJVkUgICAgICAweDA4MDAgICAgICAgICAgLyogUHJvY2VzcyBhY3RpdmUgaW4geHhyZWFkKCkgICAqLworI2RlZmluZSBDSF9SV0FJVCAgICAgICAgMHgxMDAwICAgICAgICAgIC8qIFByb2Nlc3Mgd2FpdGluZyBpbiB4eHJlYWQoKSAgKi8KKyNkZWZpbmUgQ0hfQkFVRDAJMHgyMDAwCQkvKiBVc2VkIGZvciBjaGVja2luZyBCMCB0cmFuc2l0aW9ucyAqLworI2RlZmluZSBDSF9IQU5HVVAgICAgICAgMHg4MDAwCQkvKiBIYW5ndXAgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGNoX3NuaWZmX2ZsYWdzCisgKi8KKyNkZWZpbmUgU05JRkZfT1BFTgkweDEKKyNkZWZpbmUgU05JRkZfV0FJVF9EQVRBCTB4MgorI2RlZmluZSBTTklGRl9XQUlUX1NQQUNFIDB4NAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioJRGVmaW5pdGlvbnMgZm9yIERpZ2kgZGl0dHkoMSkgY29tbWFuZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFwcGxpY2F0aW9uIGFjY2VzcyB0byBzcGVjaWFsIERpZ2kKKyAqIHNlcmlhbCBsaW5lIGVuaGFuY2VtZW50cyB3aGljaCBhcmUgbm90IHN0YW5kYXJkIFVOSVgodG0pIGZlYXR1cmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFRJT0NNT0RHKQorCisjZGVmaW5lCVRJT0NNT0RHCSgoJ2QnPDw4KSB8IDI1MCkJCS8qIGdldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNT0RTCSgoJ2QnPDw4KSB8IDI1MSkJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisKKyNpZm5kZWYgVElPQ01fTEUKKyNkZWZpbmUJCVRJT0NNX0xFCTB4MDEJCS8qIGxpbmUgZW5hYmxlCQkqLworI2RlZmluZQkJVElPQ01fRFRSCTB4MDIJCS8qIGRhdGEgdGVybWluYWwgcmVhZHkJKi8KKyNkZWZpbmUJCVRJT0NNX1JUUwkweDA0CQkvKiByZXF1ZXN0IHRvIHNlbmQJKi8KKyNkZWZpbmUJCVRJT0NNX1NUCTB4MDgJCS8qIHNlY29uZGFyeSB0cmFuc21pdAkqLworI2RlZmluZQkJVElPQ01fU1IJMHgxMAkJLyogc2Vjb25kYXJ5IHJlY2VpdmUJKi8KKyNkZWZpbmUJCVRJT0NNX0NUUwkweDIwCQkvKiBjbGVhciB0byBzZW5kCSovCisjZGVmaW5lCQlUSU9DTV9DQVIJMHg0MAkJLyogY2FycmllciBkZXRlY3QJKi8KKyNkZWZpbmUJCVRJT0NNX1JORwkweDgwCQkvKiByaW5nCWluZGljYXRvcgkqLworI2RlZmluZQkJVElPQ01fRFNSCTB4MTAwCQkvKiBkYXRhIHNldCByZWFkeQkqLworI2RlZmluZQkJVElPQ01fUkkJVElPQ01fUk5HCS8qIHJpbmcgKGFsdGVybmF0ZSkJKi8KKyNkZWZpbmUJCVRJT0NNX0NECVRJT0NNX0NBUgkvKiBjYXJyaWVyIGRldGVjdCAoYWx0KQkqLworI2VuZGlmCisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ01TRVQpCisjZGVmaW5lCVRJT0NNU0VUCSgoJ2QnPDw4KSB8IDI1MikJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNR0VUCSgoJ2QnPDw4KSB8IDI1MykJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRJT0NNQklDKQorI2RlZmluZQlUSU9DTUJJQwkoKCdkJzw8OCkgfCAyNTQpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLworI2RlZmluZQlUSU9DTUJJUwkoKCdkJzw8OCkgfCAyNTUpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLworI2VuZGlmCisKKworI2lmICFkZWZpbmVkKFRJT0NTRFRSKQorI2RlZmluZQlUSU9DU0RUUgkoKCdlJzw8OCkgfCAwKQkJLyogc2V0IERUUgkJKi8KKyNkZWZpbmUJVElPQ0NEVFIJKCgnZSc8PDgpIHwgMSkJCS8qIGNsZWFyIERUUgkJKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJb2N0bCBjb21tYW5kIGFyZ3VtZW50cyBmb3IgRElHSSBwYXJhbWV0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRElHSV9HRVRBCSgoJ2UnPDw4KSB8IDk0KQkJLyogUmVhZCBwYXJhbXMJCSovCisKKyNkZWZpbmUgRElHSV9TRVRBCSgoJ2UnPDw4KSB8IDk1KQkJLyogU2V0IHBhcmFtcwkJKi8KKyNkZWZpbmUgRElHSV9TRVRBVwkoKCdlJzw8OCkgfCA5NikJCS8qIERyYWluICYgc2V0IHBhcmFtcwkqLworI2RlZmluZSBESUdJX1NFVEFGCSgoJ2UnPDw4KSB8IDk3KQkJLyogRHJhaW4sIGZsdXNoICYgc2V0IHBhcmFtcyAqLworCisjZGVmaW5lIERJR0lfS01FCSgoJ2UnPDw4KSB8IDk4KQkJLyogUmVhZC9Xcml0ZSBIb3N0CSovCisJCQkJCQkvKiBBZGFwdGVyIE1lbW9yeQkqLworCisjZGVmaW5lCURJR0lfR0VURkxPVwkoKCdlJzw8OCkgfCA5OSkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLworCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzIAkgKi8KKyNkZWZpbmUJRElHSV9TRVRGTE9XCSgoJ2UnPDw4KSB8IDEwMCkJCS8qIFNldCBzdGFydGMvc3RvcGMgZmxvdyAqLworCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzCSAqLworI2RlZmluZQlESUdJX0dFVEFGTE9XCSgoJ2UnPDw4KSB8IDEwMSkJCS8qIEdldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLworCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzIAkgKi8KKyNkZWZpbmUJRElHSV9TRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDIpCQkvKiBTZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKwkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycwkgKi8KKworI2RlZmluZSBESUdJX0dFREVMQVkJKCgnZCc8PDgpIHwgMjQ2KQkJLyogR2V0IGVkZWxheSAqLworI2RlZmluZSBESUdJX1NFREVMQVkJKCgnZCc8PDgpIHwgMjQ3KQkJLyogU2V0IGVkZWxheSAqLworCitzdHJ1Y3QJZGlnaWZsb3dfdCB7CisJdW5zaWduZWQgY2hhcglzdGFydGM7CQkJCS8qIGZsb3cgY250bCBzdGFydCBjaGFyCSovCisJdW5zaWduZWQgY2hhcglzdG9wYzsJCQkJLyogZmxvdyBjbnRsIHN0b3AgY2hhcgkqLworfTsKKworCisjaWZkZWYJRkxPV18yMjAwCisjZGVmaW5lCUYyMjAwX0dFVEEJKCgnZSc8PDgpIHwgMTA0KQkJLyogR2V0IDJ4MzYgZmxvdyBjbnRsIGZsYWdzICovCisjZGVmaW5lCUYyMjAwX1NFVEFXCSgoJ2UnPDw4KSB8IDEwNSkJCS8qIFNldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLworI2RlZmluZQkJRjIyMDBfTUFTSwkweDAzCQkvKiAyMjAwIGZsb3cgY250bCBiaXQgbWFzayAgKi8KKyNkZWZpbmUJCUZDTlRMXzIyMDAJMHgwMQkJLyogMngzNiB0ZXJtaW5hbCBmbG93IGNudGwgICovCisjZGVmaW5lCQlQQ05UTF8yMjAwCTB4MDIJCS8qIDJ4MzYgcHJpbnRlciBmbG93IGNudGwgICAqLworI2RlZmluZQlGMjIwMF9YT04JMHhmOAorI2RlZmluZQlQMjIwMF9YT04JMHhmOQorI2RlZmluZQlGMjIwMF9YT0ZGCTB4ZmEKKyNkZWZpbmUJUDIyMDBfWE9GRgkweGZiCisKKyNkZWZpbmUJRlhPRkZfTUFTSwkweDAzCQkJLyogMjIwMCBmbG93IHN0YXR1cyBtYXNrICAgICovCisjZGVmaW5lCVJDVkRfRlhPRkYJMHgwMQkJCS8qIDJ4MzYgVGVybWluYWwgWE9GRiByY3ZkICAqLworI2RlZmluZQlSQ1ZEX1BYT0ZGCTB4MDIJCQkvKiAyeDM2IFByaW50ZXIgWE9GRiByY3ZkICAgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYWx1ZXMgZm9yIGRpZ2lfZmxhZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfSVhPTgkweDAwMDEJCS8qIEhhbmRsZSBJWE9OIGluIHRoZSBGRVAJKi8KKyNkZWZpbmUgRElHSV9GQVNUCTB4MDAwMgkJLyogRmFzdCBiYXVkIHJhdGVzCQkqLworI2RlZmluZSBSVFNQQUNFCQkweDAwMDQJCS8qIFJUUyBpbnB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgQ1RTUEFDRQkJMHgwMDA4CQkvKiBDVFMgb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEU1JQQUNFCQkweDAwMTAJCS8qIERTUiBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERDRFBBQ0UJCTB4MDAyMAkJLyogRENEIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFRSUEFDRQkJMHgwMDQwCQkvKiBEVFIgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERJR0lfQ09PSwkweDAwODAJCS8qIENvb2tlZCBwcm9jZXNzaW5nIGRvbmUgaW4gRkVQICovCisjZGVmaW5lIERJR0lfRk9SQ0VEQ0QJMHgwMTAwCQkvKiBGb3JjZSBjYXJyaWVyCQkqLworI2RlZmluZQlESUdJX0FMVFBJTgkweDAyMDAJCS8qIEFsdGVybmF0ZSBSSi00NSBwaW4gY29uZmlnCSovCisjZGVmaW5lCURJR0lfQUlYT04JMHgwNDAwCQkvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcAkqLworI2RlZmluZQlESUdJX1BSSU5URVIJMHgwODAwCQkvKiBIb2xkIHBvcnQgb3BlbiBmb3IgZmxvdyBjbnRybCovCisjZGVmaW5lIERJR0lfUFBfSU5QVVQJMHgxMDAwCQkvKiBDaGFuZ2UgcGFyYWxsZWwgcG9ydCB0byBpbnB1dCovCisjZGVmaW5lIERJR0lfRFRSX1RPR0dMRSAweDIwMDAJCS8qIFN1cHBvcnQgRFRSIFRvZ2dsZQkJKi8KKyNkZWZpbmUJRElHSV80MjIJMHg0MDAwCQkvKiBmb3IgNDIyLzIzMiBzZWxlY3RhYmxlIHBhbmVsICovCisjZGVmaW5lIERJR0lfUlRTX1RPR0dMRQkweDgwMDAJCS8qIFN1cHBvcnQgUlRTIFRvZ2dsZQkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlc2Ugb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgY29teGkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlESUdJX0NPTVhJCShESUdJX0ZBU1R8RElHSV9DT09LfERTUlBBQ0V8RENEUEFDRXxEVFJQQUNFKQorCisjZGVmaW5lIERJR0lfUExFTgkyOAkJLyogU3RyaW5nIGxlbmd0aAkJKi8KKyNkZWZpbmUJRElHSV9UU0laCTEwCQkvKiBUZXJtaW5hbCBzdHJpbmcgbGVuCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBESUdJIHBhcmFtZXRlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRpZ2lfdCB7CisJdW5zaWduZWQgc2hvcnQJZGlnaV9mbGFnczsJCS8qIEZsYWdzIChzZWUgYWJvdmUpCSovCisJdW5zaWduZWQgc2hvcnQJZGlnaV9tYXhjcHM7CQkvKiBNYXggcHJpbnRlciBDUFMJKi8KKwl1bnNpZ25lZCBzaG9ydAlkaWdpX21heGNoYXI7CQkvKiBNYXggY2hhcnMgaW4gcHJpbnQgcXVldWUgKi8KKwl1bnNpZ25lZCBzaG9ydAlkaWdpX2J1ZnNpemU7CQkvKiBCdWZmZXIgc2l6ZQkJKi8KKwl1bnNpZ25lZCBjaGFyCWRpZ2lfb25sZW47CQkvKiBMZW5ndGggb2YgT04gc3RyaW5nCSovCisJdW5zaWduZWQgY2hhcglkaWdpX29mZmxlbjsJCS8qIExlbmd0aCBvZiBPRkYgc3RyaW5nCSovCisJY2hhcgkJZGlnaV9vbnN0cltESUdJX1BMRU5dOwkvKiBQcmludGVyIG9uIHN0cmluZwkqLworCWNoYXIJCWRpZ2lfb2Zmc3RyW0RJR0lfUExFTl07CS8qIFByaW50ZXIgb2ZmIHN0cmluZwkqLworCWNoYXIJCWRpZ2lfdGVybVtESUdJX1RTSVpdOwkvKiB0ZXJtaW5hbCBzdHJpbmcJKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEtNRSBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVJXX0lETEUJCTAJLyogT3BlcmF0aW9uIGNvbXBsZXRlCQkJKi8KKyNkZWZpbmUJUldfUkVBRAkJMQkvKiBSZWFkIENvbmNlbnRyYXRvciBNZW1vcnkJCSovCisjZGVmaW5lCVJXX1dSSVRFCTIJLyogV3JpdGUgQ29uY2VudHJhdG9yIE1lbW9yeQkJKi8KKworc3RydWN0IHJ3X3QgeworCXVuc2lnbmVkIGNoYXIJcndfcmVxOwkJLyogUmVxdWVzdCB0eXBlCQkJKi8KKwl1bnNpZ25lZCBjaGFyCXJ3X2JvYXJkOwkvKiBIb3N0IEFkYXB0ZXIgYm9hcmQgbnVtYmVyCSovCisJdW5zaWduZWQgY2hhcglyd19jb25jOwkvKiBDb25jZW50cmF0b3IgbnVtYmVyCQkqLworCXVuc2lnbmVkIGNoYXIJcndfcmVzZXJ2ZWQ7CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24JKi8KKwl1bnNpZ25lZCBsb25nCXJ3X2FkZHI7CS8qIEFkZHJlc3MgaW4gY29uY2VudHJhdG9yCSovCisJdW5zaWduZWQgc2hvcnQJcndfc2l6ZTsJLyogUmVhZC93cml0ZSByZXF1ZXN0IGxlbmd0aAkqLworCXVuc2lnbmVkIGNoYXIJcndfZGF0YVsxMjhdOwkvKiBEYXRhIHRvIHJlYWQvd3JpdGUJCSovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNocmluayBCdWZmZXIgYW5kIEJvYXJkIEluZm9ybWF0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJLyogQm9hcmQgdHlwZSByZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUJUENYSV9UWVBFIDEgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1hpICovCisjZGVmaW5lIFBDWE1fVFlQRSAyICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YbSAqLworI2RlZmluZQlQQ1hFX1RZUEUgMyAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWGUgKi8KKyNkZWZpbmUJTUNYSV9UWVBFIDQgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIE1DL1hpICovCisjZGVmaW5lIENPTVhJX1RZUEUgNSAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgQ09NL1hpICovCisKKwkJCSAvKiBOb24tWmVybyBSZXN1bHQgY29kZXMuICovCisjZGVmaW5lIFJFU1VMVF9OT0JERk5EIDEgLyogQSBEaWdpIHByb2R1Y3QgYXQgdGhhdCBwb3J0IGlzIG5vdCBjb25maWcgaW5zdGFsbGVkICovCisjZGVmaW5lIFJFU1VMVF9OT0RFU0NUIDIgLyogQSBtZW1vcnkgZGVzY3JpcHRvciB3YXMgbm90IG9idGFpbmFibGUgKi8KKyNkZWZpbmUgUkVTVUxUX05PT1NTSUcgMyAvKiBGRVAvT1Mgc2lnbmF0dXJlIHdhcyBub3QgZGV0ZWN0ZWQgb24gdGhlIGJvYXJkICovCisjZGVmaW5lIFJFU1VMVF9UT09TTUwgIDQgLyogVG9vIHNtYWxsIGFuIGFyZWEgdG8gc2hyaW5rLiAgKi8KKyNkZWZpbmUgUkVTVUxUX05PQ0hBTiAgNSAvKiBDaGFubmVsIHN0cnVjdHVyZSBmb3IgdGhlIGJvYXJkIHdhcyBub3QgZm91bmQgKi8KKworc3RydWN0IHNocmlua19idWZfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfdmFkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBib2FyZCAqLworCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9waHlzOwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGJvYXJkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2JzZWc7CS8qIEFtb3VudCBvZiBib2FyZCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfaHNlZzsJLyogJzE4NiBCZWdpbm5pbmcgb2YgRHVhbC1Qb3J0ICovCisKKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfbHNlZzsJLyogJzE4NiBCZWdpbm5pbmcgb2YgZnJlZWQgbWVtb3J5CQkJCQkJKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfbXNlZzsJLyogTGluZWFyIGFkZHJlc3MgZnJvbSBzdGFydCBvZgorCQkJCQkJICAgZHVhbC1wb3J0IHdlcmUgZnJlZWQgbWVtb3J5CisJCQkJCQkgICBiZWdpbnMsIGhvc3Qgdmlld3BvaW50LiAqLworCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2JkcGFyYW07CS8qIFBhcmFtZXRlciBmb3IgeHhtZW1vbiBhbmQKKwkJCQkJCSAgIHh4bWVtb2ZmICovCisKKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YTsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YjsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YzsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2ZDsJLyogUmVzZXJ2ZWQgKi8KKworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9yZXN1bHQ7CS8qIFJlYXNvbiBmb3IgY2FsbCBmYWlsaW5nCisJCQkJCQkgICBaZXJvIGlzIEdvb2QgcmV0dXJuICovCisJdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2luaXQ7CS8qIE5vbi1aZXJvIGlmIGl0IGNhdXNlZCBhbgorCQkJCQkJICAgeHhpbml0IGNhbGwuICovCisKKwl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfYW5wb3J0czsJLyogTnVtYmVyIG9mIGFzeW5jIHBvcnRzICAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9zbnBvcnRzOyAJLyogTnVtYmVyIG9mIHN5bmMgIHBvcnRzICovCisJdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX3R5cGU7CS8qIEJvYXJkIHR5cGUgMSA9IFBDL1hpLAorCQkJCQkJCSAgICAgIDIgPSBQQy9YbSwKKwkJCQkJCQkgICAgICAzID0gUEMvWGUKKwkJCQkJCQkgICAgICA0ID0gTUMvWGkKKwkJCQkJCQkgICAgICA1ID0gQ09NWC9pICovCisJdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2NhcmQ7CS8qIENhcmQgbnVtYmVyICovCisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0cnVjdHVyZSB0byBnZXQgZHJpdmVyIHN0YXR1cyBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX2RpbmZvIHsKKwl1bnNpZ25lZCBsb25nCWRpbmZvX25ib2FyZHM7CQkvKiAjIGJvYXJkcyBjb25maWd1cmVkCSovCisJY2hhcgkJZGluZm9fcmVzZXJ2ZWRbMTJdOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCWNoYXIJCWRpbmZvX3ZlcnNpb25bMTZdOwkvKiBkcml2ZXIgdmVyc2lvbiAgICAgICAqLworfTsKKworI2RlZmluZQlESUdJX0dFVERECSgoJ2QnPDw4KSB8IDI0OCkJCS8qIGdldCBkcml2ZXIgaW5mbyAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1ib2FyZCBpbmZvcm1hdGlvbgorICoKKyAqIHBoeXNzaXplIGFuZCBtZW1zaXplIGRpZmZlciB3aGVuIGJvYXJkIGhhcyAid2luZG93ZWQiIG1lbW9yeQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX2luZm8geworCXVuc2lnbmVkIGxvbmcJaW5mb19iZG51bTsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2lvcG9ydDsJCS8qIGlvIHBvcnQgYWRkcmVzcyAgICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3BoeXNhZGRyOwkJLyogbWVtb3J5IGFkZHJlc3MgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fcGh5c3NpemU7CQkvKiBTaXplIG9mIGhvc3QgbWVtIHdpbmRvdyAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19tZW1zaXplOwkJLyogQW1vdW50IG9mIGR1YWwtcG9ydCBtZW0gKi8KKwkJCQkJCS8qIG9uIGJvYXJkICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQJaW5mb19iZHR5cGU7CQkvKiBCb2FyZCB0eXBlICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0CWluZm9fbnBvcnRzOwkJLyogbnVtYmVyIG9mIHBvcnRzICAgICAgICAgKi8KKwljaGFyCQlpbmZvX2Jkc3RhdGU7CQkvKiBib2FyZCBzdGF0ZSAgICAgICAgICAgICAqLworCWNoYXIJCWluZm9fcmVzZXJ2ZWRbN107CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICAgICovCit9OworCisjZGVmaW5lCURJR0lfR0VUQkQJKCgnZCc8PDgpIHwgMjQ5KQkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KKworc3RydWN0IGRpZ2lfc3RhdCB7CisJdW5zaWduZWQgaW50CWluZm9fY2hhbjsJCS8qIENoYW5uZWwgbnVtYmVyICgwIGJhc2VkKSAgKi8KKwl1bnNpZ25lZCBpbnQJaW5mb19icmQ7CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19jZmxhZzsJCS8qIGNmbGFnIGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2lmbGFnOwkJLyogaWZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fb2ZsYWc7CQkvKiBvZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19tc3RhdDsJCS8qIG1zdGF0IGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3R4X2RhdGE7CQkvKiB0eF9kYXRhIGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3J4X2RhdGE7CQkvKiByeF9kYXRhIGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2hmbG93OwkJLyogaGZsb3cgZm9yIGNoYW5uZWwgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fcmVzZXJ2ZWRbOF07CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICAgICovCit9OworCisjZGVmaW5lCURJR0lfR0VUU1RBVAkoKCdkJzw8OCkgfCAyNDQpCQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1jaGFubmVsIGluZm9ybWF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX2NoIHsKKwl1bnNpZ25lZCBsb25nCWluZm9fYmRudW07CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19jaGFubmVsOwkJLyogQ2hhbm5lbCBpbmRleCBudW1iZXIgICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2hfY2ZsYWc7CQkvKiBDaGFubmVsIGNmbGFnICAgCSAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2NoX2lmbGFnOwkJLyogQ2hhbm5lbCBpZmxhZyAgIAkgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19jaF9vZmxhZzsJCS8qIENoYW5uZWwgb2ZsYWcgICAJICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2hzaXplOwkJLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fc2xlZXBfc3RhdDsJLyogc2xlZXAgc3RhdHVzCQkgICAqLworCWRldl90CQlpbmZvX2RldjsJCS8qIGRldmljZSBudW1iZXIJICAgKi8KKwl1bnNpZ25lZCBjaGFyCWluZm9faW5pdHN0YXRlOwkJLyogQ2hhbm5lbCBpbml0IHN0YXRlCSAgICovCisJdW5zaWduZWQgY2hhcglpbmZvX3J1bm5pbmc7CQkvKiBDaGFubmVsIHJ1bm5pbmcgc3RhdGUgICAqLworCWxvbmcJCXJlc2VydmVkWzhdOwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKy8qCisqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2l0aCB0aGUgRElHSV9GRVBDTUQgaW9jdGwgdG8KKyogdGVsbCB0aGUgZHJpdmVyIHdoaWNoIHBvcnQgdG8gc2VuZCB0aGUgY29tbWFuZCBmb3IuCisqLworc3RydWN0IGRpZ2lfY21kIHsKKwlpbnQJY21kOworCWludAl3b3JkOworCWludAluY21kczsKKwlpbnQJY2hhbjsgLyogY2hhbm5lbCBpbmRleCAoemVybyBiYXNlZCkgKi8KKwlpbnQJYmRpZDsgLyogYm9hcmQgaW5kZXggKHplcm8gYmFzZWQpICovCit9OworCisvKgorKiAgaW5mb19zbGVlcF9zdGF0IGRlZmluZXMKKyovCisjZGVmaW5lIElORk9fUlVOV0FJVAkweDAwMDEKKyNkZWZpbmUgSU5GT19XT1BFTgkweDAwMDIKKyNkZWZpbmUgSU5GT19UVElPVwkweDAwMDQKKyNkZWZpbmUgSU5GT19DSF9SV0FJVAkweDAwMDgKKyNkZWZpbmUgSU5GT19DSF9XRU1QVFkJMHgwMDEwCisjZGVmaW5lIElORk9fQ0hfV0xPVwkweDAwMjAKKyNkZWZpbmUgSU5GT19YWEJVRl9CVVNZIDB4MDA0MAorCisjZGVmaW5lCURJR0lfR0VUQ0gJKCgnZCc8PDgpIHwgMjQ1KQkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KKworLyogQm9hcmQgdHlwZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCVNVQlRZUEUJCTAwMDcKKyNkZWZpbmUJVF9QQ1hJCQkwMDAwCisjZGVmaW5lIFRfUENYTQkJMDAwMQorI2RlZmluZSBUX1BDWEUJCTAwMDIKKyNkZWZpbmUgVF9QQ1hSCQkwMDAzCisjZGVmaW5lIFRfU1AJCTAwMDQKKyNkZWZpbmUgVF9TUF9QTFVTCTAwMDUKKyMJZGVmaW5lIFRfSEVSQwkwMDAwCisjCWRlZmluZSBUX0hPVQkwMDAxCisjCWRlZmluZSBUX0xPTgkwMDAyCisjCWRlZmluZSBUX0NIQQkwMDAzCisjZGVmaW5lIEZBTUlMWQkJMDA3MAorI2RlZmluZSBUX0NPTVhJCQkwMDAwCisjZGVmaW5lIFRfUENYWAkJMDAxMAorI2RlZmluZSBUX0NYCQkwMDIwCisjZGVmaW5lIFRfRVBDCQkwMDMwCisjZGVmaW5lCVRfUENMSVRFCTAwNDAKKyNkZWZpbmUJVF9TUFhYCQkwMDUwCisjZGVmaW5lCVRfQVZYWAkJMDA2MAorI2RlZmluZSBUX0RYQgkJMDA3MAorI2RlZmluZSBUX0EyS180XzgJMDA3MAorI2RlZmluZSBCVVNUWVBFCQkwNzAwCisjZGVmaW5lIFRfSVNBQlVTCTAwMDAKKyNkZWZpbmUgVF9NQ0JVUwkJMDEwMAorI2RlZmluZQlUX0VJU0FCVVMJMDIwMAorI2RlZmluZQlUX1BDSUJVUwkwNDAwCisKKy8qIEJvYXJkIFN0YXRlIERlZmluaXRpb25zICovCisKKyNkZWZpbmUJQkRfUlVOTklORwkweDAKKyNkZWZpbmUJQkRfUkVBU09OCTB4N2YKKyNkZWZpbmUJQkRfTk9URk9VTkQJMHgxCisjZGVmaW5lCUJEX05PSU9QT1JUCTB4MgorI2RlZmluZQlCRF9OT01FTQkweDMKKyNkZWZpbmUJQkRfTk9CSU9TCTB4NAorI2RlZmluZQlCRF9OT0ZFUAkweDUKKyNkZWZpbmUJQkRfRkFJTEVECTB4NgorI2RlZmluZSBCRF9BTExPQ0FURUQJMHg3CisjZGVmaW5lIEJEX1RSSUJPT1QJMHg4CisjZGVmaW5lCUJEX0JBREtNRQkweDgwCisKKyNkZWZpbmUgRElHSV9MT09QQkFDSwkgICAgICAoKCdkJzw8OCkgfCAyNTIpCQkvKiBFbmFibGUvZGlzYWJsZSBVQVJUIGludGVybmFsIGxvb3BiYWNrICovCisjZGVmaW5lIERJR0lfU1BPTEwgICAgICAgICAgICAoKCdkJzw8OCkgfCAyNTQpCQkvKiBjaGFuZ2UgcG9sbGVyIHJhdGUgICAqLworCisjZGVmaW5lIERJR0lfU0VUQ1VTVE9NQkFVRAlfSU9XKCdlJywgMTA2LCBpbnQpCS8qIFNldCBpbnRlZ2VyIGJhdWQgcmF0ZSAqLworI2RlZmluZSBESUdJX0dFVENVU1RPTUJBVUQJX0lPUignZScsIDEwNywgaW50KQkvKiBHZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgRElHSV9SRVNFVF9QT1JUCQkoKCdlJzw8OCkgfCA5MykJCS8qIFJlc2V0IHBvcnQJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoYW5uZWwgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBjaGFubmVsX3QgeworCWludCBtYWdpYzsJCQkvKiBDaGFubmVsIE1hZ2ljIE51bWJlcgkJKi8KKwlzdHJ1Y3QgYnNfdAkqY2hfYnM7CQkvKiBCYXNlIHN0cnVjdHVyZSBwb2ludGVyICAgICAgICovCisJc3RydWN0IGNtX3QJKmNoX2NtOwkJLyogQ29tbWFuZCBxdWV1ZSBwb2ludGVyICAgICAgICAqLworCXN0cnVjdCBib2FyZF90ICpjaF9iZDsJCS8qIEJvYXJkIHN0cnVjdHVyZSBwb2ludGVyICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICpjaF92YWRkcjsJLyogRkVQIG1lbW9yeSBvcmlnaW4gICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKmNoX3RhZGRyOwkvKiBXcml0ZSBidWZmZXIgb3JpZ2luICAgICAgICAgICovCisJdW5zaWduZWQgY2hhciAqY2hfcmFkZHI7CS8qIFJlYWQgYnVmZmVyIG9yaWdpbiAgICAgICAgICAgKi8KKwlzdHJ1Y3QgZGlnaV90ICBjaF9kaWdpOwkJLyogVHJhbnNwYXJlbnQgUHJpbnQgc3RydWN0dXJlICAqLworCXN0cnVjdCB1bl90IGNoX3R1bjsJCS8qIFRlcm1pbmFsIHVuaXQgaW5mbyAgICAgICAgICAgKi8KKwlzdHJ1Y3QgdW5fdCBjaF9wdW47CQkvKiBQcmludGVyIHVuaXQgaW5mbyAgICAgICAgICAgICovCisKKwlzcGlubG9ja190CWNoX2xvY2s7CS8qIHByb3ZpZGUgZm9yIHNlcmlhbGl6YXRpb24gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBjaF9mbGFnc193YWl0OworCisJdTMyCXBzY2FuX3N0YXRlOworCXVjaGFyCXBzY2FuX3NhdmVjaGFyOworCisJdTMyIGNoX3BvcnRudW07CQkJLyogUG9ydCBudW1iZXIsIDAgb2Zmc2V0LgkqLworCXUzMiBjaF9vcGVuX2NvdW50OwkJLyogb3BlbiBjb3VudAkJCSovCisJdTMyCWNoX2ZsYWdzOwkJLyogQ2hhbm5lbCBmbGFncyAgICAgICAgICAgICAgICAqLworCisKKwl1MzIJY2hfY2xvc2VfZGVsYXk7CQkvKiBIb3cgbG9uZyB3ZSBzaG91bGQgZHJvcCBSVFMvRFRSIGZvciAqLworCisJdTMyCWNoX2Nwc3RpbWU7CQkvKiBUaW1lIGZvciBDUFMgY2FsY3VsYXRpb25zICAgICovCisKKwl0Y2ZsYWdfdCBjaF9jX2lmbGFnOwkJLyogY2hhbm5lbCBpZmxhZ3MgICAgICAgICAgICAgICAqLworCXRjZmxhZ190IGNoX2NfY2ZsYWc7CQkvKiBjaGFubmVsIGNmbGFncyAgICAgICAgICAgICAgICovCisJdGNmbGFnX3QgY2hfY19vZmxhZzsJCS8qIGNoYW5uZWwgb2ZsYWdzICAgICAgICAgICAgICAgKi8KKwl0Y2ZsYWdfdCBjaF9jX2xmbGFnOwkJLyogY2hhbm5lbCBsZmxhZ3MgICAgICAgICAgICAgICAqLworCisJdTE2ICBjaF9mZXBpZmxhZzsgICAgICAgICAgICAvKiBGRVAgdHR5IGlmbGFncyAgICAgICAgICAgICAgICovCisJdTE2ICBjaF9mZXBjZmxhZzsJCS8qIEZFUCB0dHkgY2ZsYWdzICAgICAgICAgICAgICAgKi8KKwl1MTYgIGNoX2ZlcG9mbGFnOwkJLyogRkVQIHR0eSBvZmxhZ3MgICAgICAgICAgICAgICAqLworCXUxNiAgY2hfd29wZW47CQkJLyogV2FpdGluZyBmb3Igb3BlbiBwcm9jZXNzIGNudCAqLworCXUxNiAgY2hfdHN0YXJ0OwkJCS8qIFRyYW5zbWl0IGJ1ZmZlciBzdGFydCAgICAgICAgKi8KKwl1MTYgIGNoX3RzaXplOwkJCS8qIFRyYW5zbWl0IGJ1ZmZlciBzaXplICAgICAgICAgKi8KKwl1MTYgIGNoX3JzdGFydDsJCQkvKiBSZWNlaXZlIGJ1ZmZlciBzdGFydCAgICAgICAgICovCisJdTE2ICBjaF9yc2l6ZTsJCQkvKiBSZWNlaXZlIGJ1ZmZlciBzaXplICAgICAgICAgICovCisJdTE2ICBjaF9yZGVsYXk7CQkJLyogUmVjZWl2ZSBkZWxheSB0aW1lICAgICAgICAgICAqLworCisJdTE2CWNoX3RsdzsJCQkvKiBPdXIgY3VycmVudGx5IHNldCBsb3cgd2F0ZXIgbWFyayAqLworCisJdTE2ICBjaF9jb29rOwkJCS8qIE91dHB1dCBjaGFyYWN0ZXIgbWFzayAgICAgICAgKi8KKworCXVjaGFyICAgY2hfY2FyZDsJCS8qIENhcmQgY2hhbm5lbCBpcyBvbiAgICAgICAgICAgKi8KKwl1Y2hhciAgIGNoX3N0b3BjOwkJLyogU3RvcCBjaGFyYWN0ZXIgICAgICAgICAgICAgICAqLworCXVjaGFyICAgY2hfc3RhcnRjOwkJLyogU3RhcnQgY2hhcmFjdGVyICAgICAgICAgICAgICAqLworCisJdWNoYXIgICBjaF9tb3N0YXQ7CQkvKiBGRVAgb3V0cHV0IG1vZGVtIHN0YXR1cyAgICAgICovCisJdWNoYXIgICBjaF9taXN0YXQ7CQkvKiBGRVAgaW5wdXQgbW9kZW0gc3RhdHVzICAgICAgICovCisJdWNoYXIgICBjaF9tZm9yY2U7CQkvKiBNb2RlbSB2YWx1ZXMgdG8gYmUgZm9yY2VkICAgICovCisJdWNoYXIgICBjaF9tdmFsOwkJLyogRm9yY2UgdmFsdWVzICAgICAgICAgICAgICAgICAqLworCXVjaGFyICAgY2hfZmVwc3RvcGM7CQkvKiBGRVAgc3RvcCBjaGFyYWN0ZXIgICAgICAgICAgICovCisJdWNoYXIgICBjaF9mZXBzdGFydGM7CQkvKiBGRVAgc3RhcnQgY2hhcmFjdGVyICAgICAgICAgICovCisKKwl1Y2hhciAgIGNoX2FzdG9wYzsJCS8qIEF1eGlsaWFyeSBTdG9wIGNoYXJhY3RlciAgICAgKi8KKwl1Y2hhciAgIGNoX2FzdGFydGM7CQkvKiBBdXhpbGlhcnkgU3RhcnQgY2hhcmFjdGVyICAgICovCisJdWNoYXIgICBjaF9mZXBhc3RvcGM7CQkvKiBBdXhpbGlhcnkgRkVQIHN0b3AgY2hhciAgICAgICovCisJdWNoYXIgICBjaF9mZXBhc3RhcnRjOwkJLyogQXV4aWxpYXJ5IEZFUCBzdGFydCBjaGFyICAgICAqLworCisJdWNoYXIgICBjaF9oZmxvdzsJCS8qIEZFUCBoYXJkd2FyZSBoYW5kc2hha2UgICAgICAgKi8KKwl1Y2hhciAgIGNoX2RzcjsJCQkvKiBzdG9yZXMgcmVhbCBkc3IgdmFsdWUgICAgICAgICovCisJdWNoYXIgICBjaF9jZDsJCQkvKiBzdG9yZXMgcmVhbCBjZCB2YWx1ZSAgICAgICAgICovCisJdWNoYXIgICBjaF90eF93aW47CQkvKiBjaGFubmVsIHR4IGJ1ZmZlciB3aW5kb3cgICAgICovCisJdWNoYXIgICBjaF9yeF93aW47CQkvKiBjaGFubmVsIHJ4IGJ1ZmZlciB3aW5kb3cgICAgICovCisJdWludAljaF9jdXN0b21fc3BlZWQ7CS8qIEN1c3RvbSBiYXVkLCBpZiBzZXQJCSovCisJdWludAljaF9iYXVkX2luZm87CQkvKiBDdXJyZW50IGJhdWQgaW5mbyBmb3IgL3Byb2Mgb3V0cHV0CSovCisJdWxvbmcJY2hfcnhjb3VudDsJCS8qIHRvdGFsIG9mIGRhdGEgcmVjZWl2ZWQgc28gZmFyCSovCisJdWxvbmcJY2hfdHhjb3VudDsJCS8qIHRvdGFsIG9mIGRhdGEgdHJhbnNtaXR0ZWQgc28gZmFyCSovCisJdWxvbmcJY2hfZXJyX3Bhcml0eTsJCS8qIENvdW50IG9mIHBhcml0eSBlcnJvcnMgb24gY2hhbm5lbAkqLworCXVsb25nCWNoX2Vycl9mcmFtZTsJCS8qIENvdW50IG9mIGZyYW1pbmcgZXJyb3JzIG9uIGNoYW5uZWwJKi8KKwl1bG9uZwljaF9lcnJfYnJlYWs7CQkvKiBDb3VudCBvZiBicmVha3Mgb24gY2hhbm5lbAkqLworCXVsb25nCWNoX2Vycl9vdmVycnVuOwkJLyogQ291bnQgb2Ygb3ZlcnJ1bnMgb24gY2hhbm5lbAkqLworCisJdWludCBjaF9zbmlmZl9pbjsKKwl1aW50IGNoX3NuaWZmX291dDsKKwljaGFyICpjaF9zbmlmZl9idWY7CQkvKiBTbmlmZiBidWZmZXIgZm9yIHByb2MgKi8KKwl1bG9uZyBjaF9zbmlmZl9mbGFnczsJCS8qIENoYW5uZWwgZmxhZ3MgICAgICAgICAgICAgICAgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBjaF9zbmlmZl93YWl0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29tbWFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgY21fdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21faGVhZDsJLyogQ29tbWFuZCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV90YWlsOwkvKiBDb21tYW5kIGJ1ZmZlciB0YWlsIG9mZnNldAkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX3N0YXJ0OwkvKiBzdGFydCBvZmZzZXQgb2YgYnVmZmVyCSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21fbWF4OwkJLyogbGFzdCBvZmZzZXQgb2YgYnVmZmVyCSovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFdmVudCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZXZfdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfaGVhZDsJLyogQ29tbWFuZCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl90YWlsOwkvKiBDb21tYW5kIGJ1ZmZlciB0YWlsIG9mZnNldAkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X3N0YXJ0OwkvKiBzdGFydCBvZmZzZXQgb2YgYnVmZmVyCSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfbWF4OwkJLyogbGFzdCBvZmZzZXQgb2YgYnVmZmVyCSovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEb3dubG9hZCBidWZmZXIgc3RydWN0dXJlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkb3dubGRfdCB7CisJdWNoYXIJZGxfdHlwZTsJCS8qIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1Y2hhcglkbF9zZXE7CQkJLyogRG93bmxvYWQgc2VxdWVuY2UgICAgICAgICAgICAqLworCXVzaG9ydAlkbF9zcmV2OwkJLyogU29mdHdhcmUgcmV2aXNpb24gbnVtYmVyICAgICAqLworCXVzaG9ydAlkbF9scmV2OwkJLyogTG93IHJldmlzaW9uIG51bWJlciAgICAgICAgICAqLworCXVzaG9ydAlkbF9ocmV2OwkJLyogSGlnaCByZXZpc2lvbiBudW1iZXIgICAgICAgICAqLworCXVzaG9ydAlkbF9zZWc7CQkJLyogU3RhcnQgc2VnbWVudCBhZGRyZXNzICAgICAgICAqLworCXVzaG9ydAlkbF9zaXplOwkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGRvd25sb2FkICAqLworCXVjaGFyCWRsX2RhdGFbMTAyNF07CQkvKiBEb3dubG9hZCBkYXRhICAgICAgICAgICAgICAgICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXIgY2hhbm5lbCBidWZmZXIgc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgQmFzZSBTdHJ1Y3R1cmUgRW50cmllcyBVc2FnZSBNZWFuaW5ncyB0byBIb3N0ICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgVyA9IHJlYWQgd3JpdGUgICAgICAgIFIgPSByZWFkIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgQyA9IGNoYW5nZWQgYnkgY29tbWFuZHMgb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgVSA9IHVua25vd24gKG1heSBiZSBjaGFuZ2VkIHcvbyBub3RpY2UpICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGJzX3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0cF9qbXA7CS8qIFRyYW5zbWl0IHBvbGwganVtcAkJICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHRjX2ptcDsJLyogQ29va2VkIHByb2NlZHVyZSBqdW1wCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByaV9qbXA7CS8qIE5vdCBjdXJyZW50bHkgdXNlZAkJICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJwX2ptcDsJLyogUmVjZWl2ZSBwb2xsIGp1bXAJCSAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X3NlZzsJLyogVyAgVHggc2VnbWVudAkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfaGVhZDsJLyogVyAgVHggYnVmZmVyIGhlYWQgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X3RhaWw7CS8qIFIgIFR4IGJ1ZmZlciB0YWlsIG9mZnNldAkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9tYXg7CS8qIFcgIFR4IGJ1ZmZlciBzaXplIC0gMQkgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9zZWc7CS8qIFcgIFJ4IHNlZ21lbnQJCSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2hlYWQ7CS8qIFcgIFJ4IGJ1ZmZlciBoZWFkIG9mZnNldAkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF90YWlsOwkvKiBSICBSeCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfbWF4OwkvKiBXICBSeCBidWZmZXIgc2l6ZSAtIDEJICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfbHc7CQkvKiBXICBUeCBidWZmZXIgbG93IHdhdGVyIG1hcmsgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2x3OwkJLyogVyAgUnggYnVmZmVyIGxvdyB3YXRlciBtYXJrICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9odzsJCS8qIFcgIFJ4IGJ1ZmZlciBoaWdoIHdhdGVyIG1hcmsgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgaW5jcjsJCS8qIFcgIEluY3JlbWVudCB0byBuZXh0IGNoYW5uZWwgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBmZXBkZXY7CS8qIFUgIFNDQyBkZXZpY2UgYmFzZSBhZGRyZXNzICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGVkZWxheTsJLyogVyAgRXhjZXB0aW9uIGRlbGF5ICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgYmxlbjsJCS8qIFcgIEJyZWFrIGxlbmd0aCAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgYnRpbWU7CQkvKiBVICBCcmVhayBjb21wbGV0ZSB0aW1lICAgICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgaWZsYWc7CQkvKiBDICBVTklYIGlucHV0IGZsYWdzICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIG9mbGFnOwkJLyogQyAgVU5JWCBvdXRwdXQgZmxhZ3MgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBjZmxhZzsJCS8qIEMgIFVOSVggY29udHJvbCBmbGFncyAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgd2ZpbGxbMTNdOwkvKiBVICBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbnVtOwkJLyogVSAgQ2hhbm5lbCBudW1iZXIgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICByYWN0OwkJLyogVSAgUmVjZWl2ZXIgYWN0aXZlIGNvdW50ZXIgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBic3RhdDsJCS8qIFUgIEJyZWFrIHN0YXR1cyBiaXRzICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdGJ1c3k7CQkvKiBXICBUcmFuc21pdCBidXN5ICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGllbXB0eTsJLyogVyAgVHJhbnNtaXQgZW1wdHkgZXZlbnQgZW5hYmxlICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGlsb3c7CQkvKiBXICBUcmFuc21pdCBsb3ctd2F0ZXIgZXZlbnQgZW5hYmxlICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGlkYXRhOwkJLyogVyAgUmVjZWl2ZSBkYXRhIGludGVycnVwdCBlbmFibGUgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgZWZsYWc7CQkvKiBVICBIb3N0IGV2ZW50IGZsYWdzICAgICAgICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdGZsYWc7CQkvKiBVICBUcmFuc21pdCBmbGFncyAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHJmbGFnOwkJLyogVSAgUmVjZWl2ZSBmbGFncyAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB4bWFzazsJCS8qIFUgIFRyYW5zbWl0IHJlYWR5IGZsYWdzICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgeHZhbDsJCS8qIFUgIFRyYW5zbWl0IHJlYWR5IHZhbHVlICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9zdGF0OwkvKiBSQyBNb2RlbSBzdGF0dXMgYml0cyAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2NoYW5nZTsJLyogVSAgTW9kZW0gYml0cyB3aGljaCBjaGFuZ2VkICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2ludDsJCS8qIFcgIE1vZGVtIGludGVycnVwdCBlbmFibGUgYml0cyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2xhc3Q7CS8qIFUgIExhc3QgbW9kZW0gc3RhdHVzICAgICAgICAgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtdHJhbjsJCS8qIEMgICBVbnJlcG9ydGVkIG1vZGVtIHRyYW5zICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb3J1bjsJCS8qIEMgICBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZCAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYXN0YXJ0YzsJLyogVyAgIEF1eGlsaWFyeSBYb24gY2hhciAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBhc3RvcGM7CS8qIFcgICBBdXhpbGlhcnkgWG9mZiBjaGFyICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgc3RhcnRjOwkvKiBXICAgWG9uIGNoYXJhY3RlciAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBzdG9wYzsJCS8qIFcgICBYb2ZmIGNoYXJhY3RlciAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdm5leHRjOwkvKiBXICAgVm5leHQgY2hhcmFjdGVyICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBoZmxvdzsJCS8qIEMgICBTb2Z0d2FyZSBmbG93IGNvbnRyb2wgICAgKi8KKwkKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgZmlsbGM7CQkvKiBVICAgRGVsYXkgRmlsbCBjaGFyYWN0ZXIgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG9jaGFyOwkJLyogVSAgIFNhdmVkIG91dHB1dCBjaGFyYWN0ZXIgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvbWFzazsJCS8qIFUgICBPdXRwdXQgY2hhcmFjdGVyIG1hc2sgICAgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBiZmlsbFsxM107CS8qIFUgICBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uICAgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBzY2NbMTZdOwkvKiBVICAgU0NDIHJlZ2lzdGVycyAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgY25vZGUgeworCXN0cnVjdCBjbm9kZSAqbmV4dDsKKwlpbnQgdHlwZTsKKwlpbnQgbnVtYnJkOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY2hhciAgdHlwZTsJLyogQm9hcmQgVHlwZSAJCSovCisJCQlsb25nICBwb3J0OwkvKiBJL08gQWRkcmVzcwkJKi8KKwkJCWNoYXIgICpwb3J0c3RyOyAvKiBJL08gQWRkcmVzcyBpbiBzdHJpbmcgKi8KKwkJCWxvbmcgIGFkZHI7CS8qIE1lbW9yeSBBZGRyZXNzCSovCisJCQljaGFyICAqYWRkcnN0cjsgLyogTWVtb3J5IEFkZHJlc3MgaW4gc3RyaW5nICovCisJCQlsb25nICBwY2lidXM7CS8qIFBDSSBCVVMJCSovCisJCQljaGFyICAqcGNpYnVzc3RyOyAvKiBQQ0kgQlVTIGluIHN0cmluZyAqLworCQkJbG9uZyAgcGNpc2xvdDsJLyogUENJIFNMT1QJCSovCisJCQljaGFyICAqcGNpc2xvdHN0cjsgLyogUENJIFNMT1QgaW4gc3RyaW5nICovCisJCQlsb25nICBucG9ydDsJLyogTnVtYmVyIG9mIFBvcnRzCSovCisJCQljaGFyICAqaWQ7CS8qIHR0eSBpZAkJKi8KKwkJCWxvbmcgIHN0YXJ0OwkvKiBzdGFydCBvZiB0dHkgY291bnRpbmcgKi8KKwkJCWNoYXIgICptZXRob2Q7ICAvKiBJbnN0YWxsIG1ldGhvZCAgICAgICAqLworCQkJY2hhciAgdl90eXBlOworCQkJY2hhciAgdl9wb3J0OworCQkJY2hhciAgdl9hZGRyOworCQkJY2hhciAgdl9wY2lidXM7CisJCQljaGFyICB2X3BjaXNsb3Q7CisJCQljaGFyICB2X25wb3J0OworCQkJY2hhciAgdl9pZDsKKwkJCWNoYXIgIHZfc3RhcnQ7CisJCQljaGFyICB2X21ldGhvZDsKKwkJCWNoYXIgIGxpbmUxOworCQkJY2hhciAgbGluZTI7CisJCQljaGFyICBjb25jMTsgICAvKiB0b3RhbCBjb25jcyBpbiBsaW5lMSAqLworCQkJY2hhciAgY29uYzI7ICAgLyogdG90YWwgY29uY3MgaW4gbGluZTIgKi8KKwkJCWNoYXIgIG1vZHVsZTE7IC8qIHRvdGFsIG1vZHVsZXMgZm9yIGxpbmUxICovCisJCQljaGFyICBtb2R1bGUyOyAvKiB0b3RhbCBtb2R1bGVzIGZvciBsaW5lMiAqLworCQkJY2hhciAgKnN0YXR1czsgLyogY29uZmlnIHN0YXR1cyAqLworCQkJY2hhciAgKmRpbXN0YXR1czsJIC8qIFkvTiAqLworCQkJaW50ICAgc3RhdHVzX2luZGV4OyAvKiBmaWVsZCBwb2ludGVyICovCisJCX0gYm9hcmQ7CisKKwkJc3RydWN0IHsKKwkJCWNoYXIgICpjYWJsZTsKKwkJCWNoYXIgIHZfY2FibGU7CisJCQlsb25nICBzcGVlZDsKKwkJCWNoYXIgIHZfc3BlZWQ7CisJCX0gbGluZTsKKworCQlzdHJ1Y3QgeworCQkJY2hhciAgdHlwZTsKKwkJCWNoYXIgICpjb25uZWN0OworCQkJbG9uZyAgc3BlZWQ7CisJCQlsb25nICBucG9ydDsKKwkJCWNoYXIgICppZDsKKwkJCWNoYXIgICppZHN0cjsKKwkJCWxvbmcgIHN0YXJ0OworCQkJY2hhciAgdl90eXBlOworCQkJY2hhciAgdl9jb25uZWN0OworCQkJY2hhciAgdl9zcGVlZDsKKwkJCWNoYXIgIHZfbnBvcnQ7CisJCQljaGFyICB2X2lkOworCQkJY2hhciAgdl9zdGFydDsKKwkJfSBjb25jOworCisJCXN0cnVjdCB7CisJCQljaGFyIHR5cGU7CisJCQlsb25nIG5wb3J0OworCQkJY2hhciAqaWQ7CisJCQljaGFyICppZHN0cjsKKwkJCWxvbmcgc3RhcnQ7CisJCQljaGFyIHZfdHlwZTsKKwkJCWNoYXIgdl9ucG9ydDsKKwkJCWNoYXIgdl9pZDsKKwkJCWNoYXIgdl9zdGFydDsKKwkJfSBtb2R1bGU7CisKKwkJY2hhciAqdHR5bmFtZTsKKworCQljaGFyICpjdW5hbWU7CisKKwkJY2hhciAqcHJpbnRuYW1lOworCisJCWxvbmcgbWFqb3JudW1iZXI7CisKKwkJbG9uZyBhbHRwaW47CisKKwkJbG9uZyB0dHlzaXplOworCisJCWxvbmcgY2hzaXplOworCisJCWxvbmcgYnNzaXplOworCisJCWxvbmcgdW5zaXplOworCisJCWxvbmcgZjJzaXplOworCisJCWxvbmcgdnBpeHNpemU7CisKKwkJbG9uZyB1c2VpbnRyOworCX0gdTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9jb25mLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2NvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZWQ3Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2NvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKglkZ2FwX2NvbmYuaCAtIEhlYWRlciBmaWxlIGZvciBpbnN0YWxsYXRpb25zIGFuZCBwYXJzZSBmaWxlcy4KLSAqCi0gKgkkSWQ6IGRnYXBfY29uZi5oLHYgMS4xIDIwMDkvMTAvMjMgMTQ6MDE6NTcgbWFya2ggRXhwICQKLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9ER0FQX0NPTkZfSAotI2RlZmluZSBfREdBUF9DT05GX0gKLQotI2RlZmluZSBOVUxMTk9ERSAwCQkvKiBoZWFkZXIgbm9kZSwgbm90IHVzZWQgKi8KLSNkZWZpbmUgQk5PREUgMQkJCS8qIEJvYXJkIG5vZGUgKi8KLSNkZWZpbmUgTE5PREUgMgkJCS8qIExpbmUgbm9kZSAqLwotI2RlZmluZSBDTk9ERSAzCQkJLyogQ29uY2VudHJhdG9yIG5vZGUgKi8KLSNkZWZpbmUgTU5PREUgNAkJCS8qIEVCSSBNb2R1bGUgbm9kZSAqLwotI2RlZmluZSBUTk9ERSA1CQkJLyogdHR5IG5hbWUgcHJlZml4IG5vZGUgKi8KLSNkZWZpbmUJQ1VOT0RFIDYJCS8qIGN1IG5hbWUgcHJlZml4IChub24tU0NPKSAqLwotI2RlZmluZSBQTk9ERSA3CQkJLyogdHJhbnMuIHByaW50IHByZWZpeCBub2RlICovCi0jZGVmaW5lIEpOT0RFIDgJCQkvKiBtYUpvciBudW1iZXIgbm9kZSAqLwotI2RlZmluZSBBTk9ERSA5CQkJLyogYWx0cGluICovCi0jZGVmaW5lCVRTTk9ERSAxMAkJLyogdHR5IHN0cnVjdHVyZSBzaXplICovCi0jZGVmaW5lIENTTk9ERSAxMQkJLyogY2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBCU05PREUgMTIJCS8qIGJvYXJkIHN0cnVjdHVyZSBzaXplICovCi0jZGVmaW5lIFVTTk9ERSAxMwkJLyogdW5pdCBzY2hlZHVsZSBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBGU05PREUgMTQJCS8qIGYyMjAwIHN0cnVjdHVyZSBzaXplICovCi0jZGVmaW5lIFZTTk9ERSAxNQkJLyogc2l6ZSBvZiBWUElYIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgSU5UUk5PREUgMTYJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KLQotLyogRW51bWVyYXRpb24gb2YgdG9rZW5zICovCi0jZGVmaW5lCUJFR0lOCTEKLSNkZWZpbmUJRU5ECTIKLSNkZWZpbmUJQk9BUkQJMTAKLQotI2RlZmluZSBFUENGUwkxMSAvKiBzdGFydCBvZiBFUEMgZmFtaWx5IGRlZmluaXRpb25zICovCi0jZGVmaW5lCUlDWAkJMTEKLSNkZWZpbmUJTUNYCQkxMwotI2RlZmluZSBQQ1gJMTQKLSNkZWZpbmUJSUVQQwkxNQotI2RlZmluZQlFRVBDCTE2Ci0jZGVmaW5lCU1FUEMJMTcKLSNkZWZpbmUJSVBDTQkxOAotI2RlZmluZQlFUENNCTE5Ci0jZGVmaW5lCU1QQ00JMjAKLSNkZWZpbmUgUEVQQwkyMQotI2RlZmluZSBQUENNCTIyCi0jaWZkZWYgQ1AKLSNkZWZpbmUgSUNQICAgICAyMwotI2RlZmluZSBFQ1AgICAgIDI0Ci0jZGVmaW5lIE1DUCAgICAgMjUKLSNlbmRpZgotI2RlZmluZSBFUENGRQkyNSAvKiBlbmQgb2YgRVBDIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlQQzJFCTI2Ci0jZGVmaW5lCVBDNEUJMjcKLSNkZWZpbmUJUEM0RThLCTI4Ci0jZGVmaW5lCVBDOEUJMjkKLSNkZWZpbmUJUEM4RThLCTMwCi0jZGVmaW5lCVBDMTZFCTMxCi0jZGVmaW5lIE1DMkU4SyAgMzQKLSNkZWZpbmUgTUM0RThLICAzNQotI2RlZmluZSBNQzhFOEsgIDM2Ci0KLSNkZWZpbmUgQVZBTkZTCTQyCS8qIHN0YXJ0IG9mIEF2YW5zdGFyIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBOFAgCTQyCi0jZGVmaW5lIEExNlAJNDMKLSNkZWZpbmUgQVZBTkZFCTQzCS8qIGVuZCBvZiBBdmFuc3RhciBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBEQTIwMDBGUwk0NAkvKiBzdGFydCBvZiBBY2NlbGVQb3J0IDIwMDAgZmFtaWx5IGRlZmluaXRpb25zICovCi0jZGVmaW5lIERBMjIgCQk0NCAvKiBBY2NlbGVQb3J0IDIwMDIgKi8KLSNkZWZpbmUgREEyNCAJCTQ1IC8qIEFjY2VsZVBvcnQgMjAwNCAqLwotI2RlZmluZSBEQTI4CQk0NiAvKiBBY2NlbGVQb3J0IDIwMDggKi8KLSNkZWZpbmUgREEyMTYJCTQ3IC8qIEFjY2VsZVBvcnQgMjAxNiAqLwotI2RlZmluZSBEQVI0CQk0OCAvKiBBY2NlbGVQb3J0IFJBUyA0IHBvcnQgKi8KLSNkZWZpbmUgREFSOAkJNDkgLyogQWNjZWxlUG9ydCBSQVMgOCBwb3J0ICovCi0jZGVmaW5lIEREUjI0CQk1MCAvKiBEYXRhRmlyZSBSQVMgMjQgcG9ydCAqLwotI2RlZmluZSBERFIzMAkJNTEgLyogRGF0YUZpcmUgUkFTIDMwIHBvcnQgKi8KLSNkZWZpbmUgRERSNDgJCTUyIC8qIERhdGFGaXJlIFJBUyA0OCBwb3J0ICovCi0jZGVmaW5lIEREUjYwCQk1MyAvKiBEYXRhRmlyZSBSQVMgNjAgcG9ydCAqLwotI2RlZmluZSBEQTIwMDBGRQk1MyAvKiBlbmQgb2YgQWNjZWxlUG9ydCAyMDAwL1JBUyBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBQQ1hSRlMJMTA2CS8qIHN0YXJ0IG9mIFBDWFIgZmFtaWx5IGRlZmluaXRpb25zICovCi0jZGVmaW5lCUFQT1JUNAkxMDYKLSNkZWZpbmUJQVBPUlQ4CTEwNwotI2RlZmluZSBQQVBPUlQ0IDEwOAotI2RlZmluZSBQQVBPUlQ4IDEwOQotI2RlZmluZSBBUE9SVDRfOTIwSQkxMTAKLSNkZWZpbmUgQVBPUlQ4XzkyMEkJMTExCi0jZGVmaW5lIEFQT1JUNF85MjBQCTExMgotI2RlZmluZSBBUE9SVDhfOTIwUAkxMTMKLSNkZWZpbmUgQVBPUlQyXzkyMFAgMTE0Ci0jZGVmaW5lIFBDWFJGRQkxMTcJLyogZW5kIG9mIFBDWFIgZmFtaWx5IGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUJTElORQk4MgotI2lmZGVmIFQxCi0jZGVmaW5lIFQxTQk4MwotI2RlZmluZSBFMU0JODQKLSNlbmRpZgotI2RlZmluZQlDT05DCTY0Ci0jZGVmaW5lCUNYCTY1Ci0jZGVmaW5lCUVQQwk2NgotI2RlZmluZQlNT0QJNjcKLSNkZWZpbmUJUE9SVFMJNjgKLSNkZWZpbmUgTUVUSE9ECTY5Ci0jZGVmaW5lIENVU1RPTQk3MAotI2RlZmluZSBCQVNJQwk3MQotI2RlZmluZSBTVEFUVVMJNzIKLSNkZWZpbmUgTU9ERU0JNzMKLS8qIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGNhbiBhcHBlYXIgaW4gbXVsdGlwbGUgcGxhY2VzICovCi0jZGVmaW5lCVNQRUVECTc0Ci0jZGVmaW5lCU5QT1JUUwk3NQotI2RlZmluZQlJRAk3NgotI2RlZmluZSBDQUJMRQk3NwotI2RlZmluZSBDT05ORUNUCTc4Ci0jZGVmaW5lCUlPCTc5Ci0jZGVmaW5lCU1FTQk4MAotI2RlZmluZSBEUFNaCTgxCi0KLSNkZWZpbmUJVFRZTgk5MAotI2RlZmluZQlDVQk5MQotI2RlZmluZQlQUklOVAk5MgotI2RlZmluZQlYUFJJTlQJOTMKLSNkZWZpbmUgQ01BSk9SICAgOTQKLSNkZWZpbmUgQUxUUElOICA5NQotI2RlZmluZSBTVEFSVE8gOTYKLSNkZWZpbmUgVVNFSU5UUiAgOTcKLSNkZWZpbmUgUENJSU5GTyAgOTgKLQotI2RlZmluZQlUVFNJWgkxMDAKLSNkZWZpbmUJQ0hTSVoJMTAxCi0jZGVmaW5lIEJTU0laCTEwMgotI2RlZmluZQlVTlRTSVoJMTAzCi0jZGVmaW5lCUYyU0laCTEwNAotI2RlZmluZQlWUFNJWgkxMDUKLQotI2RlZmluZQlUT1RBTF9CT0FSRAkyCi0jZGVmaW5lCUNVUlJFTlRfQlJECTQKLSNkZWZpbmUJQk9BUkRfVFlQRQk2Ci0jZGVmaW5lCUlPX0FERFJFU1MJOAotI2RlZmluZQlNRU1fQUREUkVTUwkxMAotCi0jZGVmaW5lCUZJRUxEU19QRVJfUEFHRQkxOAotCi0jZGVmaW5lIFRCX0ZJRUxECTEKLSNkZWZpbmUgQ0JfRklFTEQJMwotI2RlZmluZSBCVF9GSUVMRAk1Ci0jZGVmaW5lIElPX0ZJRUxECTcKLSNkZWZpbmUgSURfRklFTEQJOAotI2RlZmluZSBNRV9GSUVMRAk5Ci0jZGVmaW5lIFRUWV9GSUVMRAkxMQotI2RlZmluZSBDVV9GSUVMRAkxMwotI2RlZmluZSBQUl9GSUVMRAkxNQotI2RlZmluZSBNUFJfRklFTEQJMTcKLQotI2RlZmluZQlNQVhfRklFTEQJNTEyCi0KLSNkZWZpbmUJSU5JVAkJMAotI2RlZmluZQlOSVRFTVMJCTEyOAotI2RlZmluZSBNQVhfSVRFTQk1MTIKLQotI2RlZmluZQlEU0NSSU5TVAkxCi0jZGVmaW5lCURTQ1JOVU0JCTMKLSNkZWZpbmUJQUxUUElOUQkJNQotI2RlZmluZQlTU0FWRQkJNwotCi0jZGVmaW5lCURTQ1IJCSIzMiIKLSNkZWZpbmUJT05FVE9OSU5FCSIxMjM0NTY3ODkiCi0jZGVmaW5lCUFMTAkJIjEyMzQ1Njc4OTAiCi0KLQotc3RydWN0IGNub2RlIHsKLQlzdHJ1Y3QgY25vZGUgKm5leHQ7Ci0JaW50IHR5cGU7Ci0JaW50IG51bWJyZDsKLQotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCWNoYXIgIHR5cGU7CS8qIEJvYXJkIFR5cGUgCQkqLwotCQkJc2hvcnQgcG9ydDsJLyogSS9PIEFkZHJlc3MJCSovCi0JCQljaGFyICAqcG9ydHN0cjsgLyogSS9PIEFkZHJlc3MgaW4gc3RyaW5nICovCi0JCQlsb25nICBhZGRyOwkvKiBNZW1vcnkgQWRkcmVzcwkqLwotCQkJY2hhciAgKmFkZHJzdHI7IC8qIE1lbW9yeSBBZGRyZXNzIGluIHN0cmluZyAqLwotCQkJbG9uZyAgcGNpYnVzOwkvKiBQQ0kgQlVTCQkqLwotCQkJY2hhciAgKnBjaWJ1c3N0cjsgLyogUENJIEJVUyBpbiBzdHJpbmcgKi8KLQkJCWxvbmcgIHBjaXNsb3Q7CS8qIFBDSSBTTE9UCQkqLwotCQkJY2hhciAgKnBjaXNsb3RzdHI7IC8qIFBDSSBTTE9UIGluIHN0cmluZyAqLwotCQkJY2hhciAgbnBvcnQ7CS8qIE51bWJlciBvZiBQb3J0cwkqLwotCQkJY2hhciAgKmlkOwkvKiB0dHkgaWQJCSovCi0JCQlpbnQgICBzdGFydDsJLyogc3RhcnQgb2YgdHR5IGNvdW50aW5nICovCi0JCQljaGFyICAqbWV0aG9kOyAgLyogSW5zdGFsbCBtZXRob2QgICAgICAgKi8KLQkJCWNoYXIgIHZfdHlwZTsKLQkJCWNoYXIgIHZfcG9ydDsKLQkJCWNoYXIgIHZfYWRkcjsKLQkJCWNoYXIgIHZfcGNpYnVzOwotCQkJY2hhciAgdl9wY2lzbG90OwotCQkJY2hhciAgdl9ucG9ydDsKLQkJCWNoYXIgIHZfaWQ7Ci0JCQljaGFyICB2X3N0YXJ0OwotCQkJY2hhciAgdl9tZXRob2Q7Ci0JCQljaGFyICBsaW5lMTsKLQkJCWNoYXIgIGxpbmUyOwotCQkJY2hhciAgY29uYzE7ICAgLyogdG90YWwgY29uY3MgaW4gbGluZTEgKi8KLQkJCWNoYXIgIGNvbmMyOyAgIC8qIHRvdGFsIGNvbmNzIGluIGxpbmUyICovCi0JCQljaGFyICBtb2R1bGUxOyAvKiB0b3RhbCBtb2R1bGVzIGZvciBsaW5lMSAqLwotCQkJY2hhciAgbW9kdWxlMjsgLyogdG90YWwgbW9kdWxlcyBmb3IgbGluZTIgKi8KLQkJCWNoYXIgICpzdGF0dXM7IC8qIGNvbmZpZyBzdGF0dXMgKi8KLQkJCWNoYXIgICpkaW1zdGF0dXM7CSAvKiBZL04gKi8KLQkJCWludCAgIHN0YXR1c19pbmRleDsgLyogZmllbGQgcG9pbnRlciAqLwotCQl9IGJvYXJkOwotCi0JCXN0cnVjdCB7Ci0JCQljaGFyICAqY2FibGU7Ci0JCQljaGFyICB2X2NhYmxlOwotCQkJY2hhciAgc3BlZWQ7Ci0JCQljaGFyICB2X3NwZWVkOwotCQl9IGxpbmU7Ci0KLQkJc3RydWN0IHsKLQkJCWNoYXIgIHR5cGU7Ci0JCQljaGFyICAqY29ubmVjdDsKLQkJCWNoYXIgIHNwZWVkOwotCQkJY2hhciAgbnBvcnQ7Ci0JCQljaGFyICAqaWQ7Ci0JCQljaGFyICAqaWRzdHI7Ci0JCQlpbnQgICBzdGFydDsKLQkJCWNoYXIgIHZfdHlwZTsKLQkJCWNoYXIgIHZfY29ubmVjdDsKLQkJCWNoYXIgIHZfc3BlZWQ7Ci0JCQljaGFyICB2X25wb3J0OwotCQkJY2hhciAgdl9pZDsKLQkJCWNoYXIgIHZfc3RhcnQ7Ci0JCX0gY29uYzsKLQotCQlzdHJ1Y3QgewotCQkJY2hhciB0eXBlOwotCQkJY2hhciBucG9ydDsKLQkJCWNoYXIgKmlkOwotCQkJY2hhciAqaWRzdHI7Ci0JCQlpbnQgIHN0YXJ0OwotCQkJY2hhciB2X3R5cGU7Ci0JCQljaGFyIHZfbnBvcnQ7Ci0JCQljaGFyIHZfaWQ7Ci0JCQljaGFyIHZfc3RhcnQ7Ci0JCX0gbW9kdWxlOwotCi0JCWNoYXIgKnR0eW5hbWU7Ci0KLQkJY2hhciAqY3VuYW1lOwotCi0JCWNoYXIgKnByaW50bmFtZTsKLQotCQlpbnQgIG1ham9ybnVtYmVyOwotCi0JCWludCAgYWx0cGluOwotCi0JCWludCAgdHR5c2l6ZTsKLQotCQlpbnQgIGNoc2l6ZTsKLQotCQlpbnQgIGJzc2l6ZTsKLQotCQlpbnQgIHVuc2l6ZTsKLQotCQlpbnQgIGYyc2l6ZTsKLQotCQlpbnQgIHZwaXhzaXplOwotCi0JCWludCAgdXNlaW50cjsKLQl9IHU7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZG93bmxkLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2Rvd25sZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzFhYzE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZG93bmxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKiAgICAgIFNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICRJZDogZGdhcF9kb3dubGQuaCx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICovCi0KLS8qCi0qKiBkb3dubGQuaCAKLSoqICAtIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHVzZXIgbGV2ZWwgZG93bmxvYWQgcHJvY2VzcwotKiogICAgYW5kIHRoZSBjb25jZW50cmF0b3IgZG93bmxvYWQgZHJpdmVyLgotKi8KLQotI2lmbmRlZiBfREdBUF9ET1dOTERfSF8KLSNkZWZpbmUgX0RHQVBfRE9XTkxEX0hfCi0KLQotc3RydWN0IGZlcGltZyB7Ci0gICAgaW50IHR5cGU7CQkJCS8qIGJvYXJkIHR5cGUgKi8KLSAgICBpbnQJbGVuOwkJCQkvKiBsZW5ndGggb2YgaW1hZ2UgKi8KLSAgICBjaGFyIGZlcGltYWdlWzFdOwkJCS8qIGJlZ2lubmluZyBvZiBpbWFnZSAqLwotfTsKLQotc3RydWN0IGRvd25sZGlvIHsKLSAgICB1bnNpZ25lZCBpbnQgcmVxX3R5cGU7CQkvKiBGRVAgb3IgY29uY2VudHJhdG9yICovCi0gICAgdW5zaWduZWQgaW50IGJkaWQ7CQkJLyogb3BhcXVlIGJvYXJkIGlkZW50aWZpZXIgKi8KLSAgICB1bmlvbiB7Ci0Jc3RydWN0IGRvd25sZF90IGRsOwkJLyogZG93bmxvYWQgc3RydWN0dXJlICovCi0Jc3RydWN0IGZlcGltZyAgIGZpOwkJLyogZmVwL2Jpb3MgaW1hZ2Ugc3RydWN0dXJlICovCi0gICAgfSBpbWFnZTsKLX07Ci0KLSNkZWZpbmUgRElHSV9ETFJFUV9HRVQJKCgnZCc8PDgpIHwgMjIwKQotI2RlZmluZSBESUdJX0RMUkVRX1NFVAkoKCdkJzw8OCkgfCAyMjEpCi0KLSNkZWZpbmUgRElHSV9ETF9OVUtFICAgICgoJ2QnPDw4KSB8IDIyMikgLyogTm90IHJlYWxseSBhIGRsIHJlcXVlc3QsIGJ1dAotCQkJCQkgIGRhbmdlcm91cyBlbnVmZiB0byBub3QgcHV0IGluCi0JCQkJCSAgZGlnaS5oICovCi0vKiBQYWNrZWQgYml0cyBvZiBpbnRhcmcgZm9yIERJR0lfRExfTlVLRSAqLwotI2RlZmluZSBESUdJX05VS0VfUkVTRVRfQUxMCSAoMSA8PCAzMSkKLSNkZWZpbmUgRElHSV9OVUtFX0lOSElCSVRfUE9MTEVSICgxIDw8IDMwKQotI2RlZmluZSBESUdJX05VS0VfQlJEX05VTUIgICAgICAgIDB4MGYKLQkKLQotCi0jZGVmaW5lCURMUkVRX0JJT1MJMAotI2RlZmluZQlETFJFUV9GRVAJMQotI2RlZmluZQlETFJFUV9DT05DCTIKLSNkZWZpbmUJRExSRVFfQ09ORklHCTMKLSNkZWZpbmUgRExSRVFfREVWQ1JFQVRFIDQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5ZDAxNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2RyaXZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZSAKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoKLSAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICoJVGhhbmsgeW91LgotICoKLSAqICRJZDogZGdhcF9kcml2ZXIuYyx2IDEuMyAyMDExLzA2LzIxIDEwOjM1OjE2IG1hcmtoIEV4cCAkCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF9wY2kuaCIKLSNpbmNsdWRlICJkZ2FwX2ZlcDUuaCIKLSNpbmNsdWRlICJkZ2FwX3R0eS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfcGFyc2UuaCIKLSNpbmNsdWRlICJkZ2FwX3RyYWNlLmgiCi0jaW5jbHVkZSAiZGdhcF9zeXNmcy5oIgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJEaWdpIEludGVybmF0aW9uYWwsIGh0dHA6Ly93d3cuZGlnaS5jb20iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgRGlnaSBJbnRlcm5hdGlvbmFsIEVQQ0EgUENJIGJhc2VkIHByb2R1Y3QgbGluZSIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoImRnYXAiKTsKLQotLyoKLSAqIGluc21vZCBjb21tYW5kIGxpbmUgb3ZlcnJpZGVhYmxlIHBhcmFtZXRlcnMKLSAqCi0gKiBOT1RFOiB3ZSB1c2UgYSBzZXQgb2YgbWFjcm9zIHRvIGNyZWF0ZSB0aGUgdmFyaWFibGVzLCB3aGljaCBhbGxvd3MKLSAqIHVzIHRvIHNwZWNpZnkgdGhlIHZhcmlhYmxlIHR5cGUsIG5hbWUsIGluaXRpYWwgdmFsdWUsIGFuZCBkZXNjcmlwdGlvbi4KLSAqLwotUEFSTV9JTlQoZGVidWcsCQkweDAwLAkJMDY0NCwJIkRyaXZlciBkZWJ1Z2dpbmcgbGV2ZWwiKTsKLVBBUk1fSU5UKHJhd3JlYWRvaywJMSwJCTA2NDQsCSJCeXBhc3MgZmxpcCBidWZmZXJzIG9uIGlucHV0Iik7Ci1QQVJNX0lOVCh0cmNidWZfc2l6ZSwJMHgxMDAwMDAsCTA2NDQsCSJEZWJ1Z2dpbmcgdHJhY2UgYnVmZmVyIHNpemUuIik7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogcHJvdG9zIGZvciB0aGlzIGZpbGUKLSAqCi0gKi8KLQotc3RhdGljIGludAkJZGdhcF9zdGFydCh2b2lkKTsKLXN0YXRpYyB2b2lkCQlkZ2FwX2luaXRfZ2xvYmFscyh2b2lkKTsKLXN0YXRpYyBpbnQJCWRnYXBfZm91bmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCk7Ci1zdGF0aWMgdm9pZAkJZGdhcF9jbGVhbnVwX2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpOwotc3RhdGljIHZvaWQJCWRnYXBfcG9sbF9oYW5kbGVyKHVsb25nIGR1bW15KTsKLXN0YXRpYyBpbnQJCWRnYXBfaW5pdF9wY2kodm9pZCk7Ci1zdGF0aWMgaW50CQlkZ2FwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyB2b2lkCQlkZ2FwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldik7Ci1zdGF0aWMgaW50CQlkZ2FwX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGNhcmRfdHlwZSk7Ci1zdGF0aWMgdm9pZAkJZGdhcF9tYnVmKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXN0YXRpYyBpbnQJCWRnYXBfZG9fcmVtYXAoc3RydWN0IGJvYXJkX3QgKmJyZCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QJZGdhcF9pbnRyKGludCBpcnEsIHZvaWQgKnZvaWRicmQpOwotCi0vKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zICovCi1pbnQJCQlkZ2FwX2luaXRfbW9kdWxlKHZvaWQpOwotdm9pZAkJCWRnYXBfY2xlYW51cF9tb2R1bGUodm9pZCk7Ci0KLW1vZHVsZV9pbml0KGRnYXBfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoZGdhcF9jbGVhbnVwX21vZHVsZSk7Ci0KLQotLyoKLSAqIEZpbGUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gQ29udHJvbC9NYW5hZ2VtZW50IG1ham9yLgotICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBEZ2FwQm9hcmRGb3BzID0KLXsKLQkub3duZXIJCT0JVEhJU19NT0RVTEUsCi19OwotCi0KLS8qCi0gKiBHbG9iYWxzCi0gKi8KLXVpbnQJCQlkZ2FwX051bUJvYXJkczsKLXN0cnVjdCBib2FyZF90CQkqZGdhcF9Cb2FyZFtNQVhCT0FSRFNdOwotREVGSU5FX1NQSU5MT0NLKGRnYXBfZ2xvYmFsX2xvY2spOwotdWxvbmcJCQlkZ2FwX3BvbGxfY291bnRlcjsKLWNoYXIJCQkqZGdhcF9jb25maWdfYnVmOwotaW50CQkJZGdhcF9kcml2ZXJfc3RhdGUgPSBEUklWRVJfSU5JVElBTElaRUQ7Ci1ERUZJTkVfU1BJTkxPQ0soZGdhcF9kbF9sb2NrKTsKLXdhaXRfcXVldWVfaGVhZF90CWRnYXBfZGxfd2FpdDsKLWludAkJCWRnYXBfZGxfYWN0aW9uOwotaW50CQkJZGdhcF9wb2xsX3RpY2sgPSAyMDsJLyogUG9sbCBpbnRlcnZhbCAtIDIwIG1zICovCi0KLS8qCi0gKiBTdGF0aWMgdmFycy4KLSAqLwotc3RhdGljIGludAkJZGdhcF9NYWpvcl9Db250cm9sX1JlZ2lzdGVyZWQgPSBGQUxTRTsKLXN0YXRpYyB1aW50CQlkZ2FwX2RyaXZlcl9zdGFydCA9IEZBTFNFOwotCi1zdGF0aWMgc3RydWN0IGNsYXNzICoJZGdhcF9jbGFzczsKLQotLyoKLSAqIFBvbGxlciBzdHVmZgotICovCi1zdGF0aWMgCQkJREVGSU5FX1NQSU5MT0NLKGRnYXBfcG9sbF9sb2NrKTsJLyogUG9sbCBzY2hlZHVsaW5nIGxvY2sgKi8KLXN0YXRpYyB1bG9uZwkJZGdhcF9wb2xsX3RpbWU7CQkJCS8qIFRpbWUgb2YgbmV4dCBwb2xsICovCi1zdGF0aWMgdWludAkJZGdhcF9wb2xsX3N0b3A7CQkJCS8qIFVzZWQgdG8gdGVsbCBwb2xsZXIgdG8gc3RvcCAqLwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRnYXBfcG9sbF90aW1lcjsKLQotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGdhcF9wY2lfdGJsW10gPSB7Ci0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9YRU1fRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkwIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9DWF9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAgMSB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfQ1hfSUJNX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMiB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfRVBDSl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTMgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFXzkyMF8yX0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJNCB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfOTIwXzRfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAk1IH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV85MjBfOF9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTYgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSX0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJNyB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWFJKX0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJOCB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWFJfNDIyX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJOSB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWFJfSUJNX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMTAgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSX1NBSVBfRElELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkxMSB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWFJfQlVMTF9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTEyIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV85MjBfOF9IUF9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEzIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9YRU1fSFBfRElELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkxNCB9LAotCXswLH0JCQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLwotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZ2FwX3BjaV90YmwpOwotCi0KLS8qCi0gKiBBIGdlbmVyaWMgbGlzdCBvZiBQcm9kdWN0IG5hbWVzLCBQQ0kgVmVuZG9yIElELCBhbmQgUENJIERldmljZSBJRC4KLSAqLwotc3RydWN0IGJvYXJkX2lkIHsKLQl1aW50IGNvbmZpZ190eXBlOwotCXVjaGFyICpuYW1lOwotCXVpbnQgbWF4cG9ydHM7Ci0JdWludCBkcGF0eXBlOwotfTsKLQotc3RhdGljIHN0cnVjdCBib2FyZF9pZCBkZ2FwX0lkc1tdID0KLXsKLQl7CVBQQ00sCQlQQ0lfREVWSUNFX1hFTV9OQU1FLAk2NCwJKFRfUENYTSB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlQQ1gsCQlQQ0lfREVWSUNFX0NYX05BTUUsCTEyOCwJKFRfQ1ggfCBUX1BDSUJVUykJCX0sCi0JewlQQ1gsCQlQQ0lfREVWSUNFX0NYX0lCTV9OQU1FLAkxMjgsCShUX0NYIHwgVF9QQ0lCVVMpCQl9LAotCXsJUEVQQywJCVBDSV9ERVZJQ0VfRVBDSl9OQU1FLAkyMjQsCShUX0VQQyAgfCBUX1BDSUJVUykJCX0sCi0JewlBUE9SVDJfOTIwUCwJUENJX0RFVklDRV85MjBfMl9OQU1FLAkyLAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CUFQT1JUNF85MjBQLAlQQ0lfREVWSUNFXzkyMF80X05BTUUsCTQsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJQVBPUlQ4XzkyMFAsCVBDSV9ERVZJQ0VfOTIwXzhfTkFNRSwJOCwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlQQVBPUlQ4LAlQQ0lfREVWSUNFX1hSX05BTUUsCTgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUkpfTkFNRSwJOCwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlQQVBPUlQ4LAlQQ0lfREVWSUNFX1hSXzQyMl9OQU1FLAk4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJfSUJNX05BTUUsCTgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUl9TQUlQX05BTUUsIDgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUl9CVUxMX05BTUUsIDgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJQVBPUlQ4XzkyMFAsCVBDSV9ERVZJQ0VfOTIwXzhfSFBfTkFNRSwgOCwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlQUENNLAkJUENJX0RFVklDRV9YRU1fSFBfTkFNRSwJNjQsCShUX1BDWE0gfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXswLH0JCQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZ2FwX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiZGdhcCIsCi0JLnByb2JlCQk9IGRnYXBfaW5pdF9vbmUsCi0JLmlkX3RhYmxlCT0gZGdhcF9wY2lfdGJsLAotCS5yZW1vdmUJCT0gZGdhcF9yZW1vdmVfb25lLAotfTsKLQotCi1jaGFyICpkZ2FwX3N0YXRlX3RleHRbXSA9IHsKLQkiQm9hcmQgRmFpbGVkIiwKLQkiQ29uZmlndXJhdGlvbiBmb3IgYm9hcmQgbm90IGZvdW5kLlxuXHRcdFx0UnVuIG1waSB0byBjb25maWd1cmUgYm9hcmQuIiwKLQkiQm9hcmQgRm91bmQiLAotCSJOZWVkIFJlc2V0IiwKLQkiRmluaXNoZWQgUmVzZXQiLAotCSJOZWVkIENvbmZpZyIsCi0JIkZpbmlzaGVkIENvbmZpZyIsCi0JIk5lZWQgRGV2aWNlIENyZWF0aW9uIiwKLQkiUmVxdWVzdGVkIERldmljZSBDcmVhdGlvbiIsCi0JIkZpbmlzaGVkIERldmljZSBDcmVhdGlvbiIsCi0JIk5lZWQgQklPUyBMb2FkIiwgCi0JIlJlcXVlc3RlZCBCSU9TIiwgCi0JIkRvaW5nIEJJT1MgTG9hZCIsCi0JIkZpbmlzaGVkIEJJT1MgTG9hZCIsCi0JIk5lZWQgRkVQIExvYWQiLCAKLQkiUmVxdWVzdGVkIEZFUCIsCi0JIkRvaW5nIEZFUCBMb2FkIiwKLQkiRmluaXNoZWQgRkVQIExvYWQiLAotCSJSZXF1ZXN0ZWQgUFJPQyBjcmVhdGlvbiIsCi0JIkZpbmlzaGVkIFBST0MgY3JlYXRpb24iLAotCSJCb2FyZCBSRUFEWSIsCi19OwotCi1jaGFyICpkZ2FwX2RyaXZlcl9zdGF0ZV90ZXh0W10gPSB7Ci0JIkRyaXZlciBJbml0aWFsaXplZCIsCi0JIkRyaXZlciBuZWVkcyBjb25maWd1cmF0aW9uIGxvYWQuIiwKLQkiRHJpdmVyIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGZyb20gZG93bmxvYWQgZGFlbW9uLiIsCi0JIkRyaXZlciBSZWFkeS4iCi19OwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERyaXZlciBsb2FkL3VubG9hZCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogaW5pdF9tb2R1bGUoKQotICoKLSAqIE1vZHVsZSBsb2FkLiAgVGhpcyBpcyB3aGVyZSBpdCBhbGwgc3RhcnRzLgotICovCi1pbnQgZGdhcF9pbml0X21vZHVsZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0KLQlBUFIoKCIlcywgRGlnaSBJbnRlcm5hdGlvbmFsIFBhcnQgTnVtYmVyICVzXG4iLCBER19OQU1FLCBER19QQVJUKSk7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgZ2xvYmFsIHN0dWZmCi0JICovCi0JcmMgPSBkZ2FwX3N0YXJ0KCk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXJldHVybihyYyk7Ci0JfQotCi0JLyoKLQkgKiBGaW5kIGFuZCBjb25maWd1cmUgYWxsIHRoZSBjYXJkcwotCSAqLwotCXJjID0gZGdhcF9pbml0X3BjaSgpOwotCi0JLyoKLQkgKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUgc2NhbiwgYmFpbCBvdXQgb2YgZHJpdmVyLgotCSAqLwotCWlmIChyYyA8IDApIHsKLQkJLyogT25seSB1bnJlZ2lzdGVyIHRoZSBwY2kgZHJpdmVyIGlmIGl0IHdhcyBhY3R1YWxseSByZWdpc3RlcmVkLiAqLwotCQlpZiAoZGdhcF9OdW1Cb2FyZHMpCi0JCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRnYXBfZHJpdmVyKTsKLQkJZWxzZQotCQkJcHJpbnRrKCJXQVJOSU5HOiBkZ2FwIGRyaXZlciBsb2FkIGZhaWxlZC4gIE5vIERHQVAgYm9hcmRzIGZvdW5kLlxuIik7Ci0KLQkJZGdhcF9jbGVhbnVwX21vZHVsZSgpOwotCX0KLQllbHNlIHsKLQkJZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKCZkZ2FwX2RyaXZlcik7Ci0JfQotICAKLQlEUFJfSU5JVCgoIkZpbmlzaGVkIGluaXRfbW9kdWxlLiBSZXR1cm5pbmcgJWRcbiIsIHJjKSk7Ci0JcmV0dXJuIChyYyk7Ci19Ci0KLQotLyoKLSAqIFN0YXJ0IG9mIGRyaXZlci4KLSAqLwotc3RhdGljIGludCBkZ2FwX3N0YXJ0KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGRnYXBfZHJpdmVyX3N0YXJ0ID09IEZBTFNFKSB7Ci0KLQkJZGdhcF9kcml2ZXJfc3RhcnQgPSBUUlVFOwotCi0JICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgZ2xvYmFscyBhcmUgaW5pdCdkIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBlbHNlICovCi0JICAgICAgICBkZ2FwX2luaXRfZ2xvYmFscygpOwotCi0JCWRnYXBfTnVtQm9hcmRzID0gMDsKLQotCQlBUFIoKCJGb3IgdGhlIHRvb2xzIHBhY2thZ2Ugb3IgdXBkYXRlZCBkcml2ZXJzIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LmRpZ2kuY29tXG4iKSk7Ci0KLQkJLyoKLQkJICogUmVnaXN0ZXIgb3VyIGJhc2UgY2hhcmFjdGVyIGRldmljZSBpbnRvIHRoZSBrZXJuZWwuCi0JCSAqIFRoaXMgYWxsb3dzIHRoZSBkb3dubG9hZCBkYWVtb24gdG8gY29ubmVjdCB0byB0aGUgZG93bmxkIGRldmljZQotCQkgKiBiZWZvcmUgYW55IG9mIHRoZSBib2FyZHMgYXJlIGluaXQnZWQuCi0JCSAqLwotCQlpZiAoIWRnYXBfTWFqb3JfQ29udHJvbF9SZWdpc3RlcmVkKSB7Ci0JCQkvKgotCQkJICogUmVnaXN0ZXIgbWFuYWdlbWVudC9kcGEgZGV2aWNlcwotCQkJICovCi0JCQlyYyA9IHJlZ2lzdGVyX2NocmRldihESUdJX0RHQVBfTUFKT1IsICJkZ2FwIiwgJkRnYXBCb2FyZEZvcHMpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCUFQUigoIkNhbid0IHJlZ2lzdGVyIGRnYXAgZHJpdmVyIGRldmljZSAoJWQpXG4iLCByYykpOwotCQkJCXJldHVybiAocmMpOwotCQkJfQotCi0JCQlkZ2FwX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiZGdhcF9tZ210Iik7Ci0JCQlkZXZpY2VfY3JlYXRlKGRnYXBfY2xhc3MsIE5VTEwsCi0JCQkJTUtERVYoRElHSV9ER0FQX01BSk9SLCAwKSwKLQkJCQlOVUxMLCAiZGdhcF9tZ210Iik7Ci0JCQlkZXZpY2VfY3JlYXRlKGRnYXBfY2xhc3MsIE5VTEwsCi0JCQkJTUtERVYoRElHSV9ER0FQX01BSk9SLCAxKSwKLQkJCQlOVUxMLCAiZGdhcF9kb3dubGQiKTsKLQkJCWRnYXBfTWFqb3JfQ29udHJvbF9SZWdpc3RlcmVkID0gVFJVRTsKLQkJfQotCi0JCS8qCi0JCSAqIEluaXQgYW55IGdsb2JhbCB0dHkgc3R1ZmYuCi0JCSAqLwotCQlyYyA9IGRnYXBfdHR5X3ByZWluaXQoKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlBUFIoKCJ0dHkgcHJlaW5pdCAtIG5vdCBlbm91Z2ggbWVtb3J5ICglZClcbiIsIHJjKSk7Ci0JCQlyZXR1cm4ocmMpOyAKLQkJfQotCi0JCS8qIFN0YXJ0IHRoZSBwb2xsZXIgKi8KLQkJREdBUF9MT0NLKGRnYXBfcG9sbF9sb2NrLCBmbGFncyk7Ci0JCWluaXRfdGltZXIoJmRnYXBfcG9sbF90aW1lcik7Ci0JCWRnYXBfcG9sbF90aW1lci5mdW5jdGlvbiA9IGRnYXBfcG9sbF9oYW5kbGVyOwotCQlkZ2FwX3BvbGxfdGltZXIuZGF0YSA9IDA7Ci0JCWRnYXBfcG9sbF90aW1lID0gamlmZmllcyArIGRnYXBfamlmZmllc19mcm9tX21zKGRnYXBfcG9sbF90aWNrKTsKLQkJZGdhcF9wb2xsX3RpbWVyLmV4cGlyZXMgPSBkZ2FwX3BvbGxfdGltZTsKLQkJREdBUF9VTkxPQ0soZGdhcF9wb2xsX2xvY2ssIGZsYWdzKTsKLQotCQlhZGRfdGltZXIoJmRnYXBfcG9sbF90aW1lcik7Ci0KLQkJZGdhcF9kcml2ZXJfc3RhdGUgPSBEUklWRVJfTkVFRF9DT05GSUdfTE9BRDsKLQl9Ci0KLQlyZXR1cm4gKHJjKTsKLX0KLQotCi0vKgotICogUmVnaXN0ZXIgcGNpIGRyaXZlciwgYW5kIHJldHVybiBob3cgbWFueSBib2FyZHMgd2UgaGF2ZS4KLSAqLwotc3RhdGljIGludCBkZ2FwX2luaXRfcGNpKHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRnYXBfZHJpdmVyKTsKLX0KLQotCi0vKiByZXR1cm5zIGNvdW50ICg+PSAwKSwgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KLXN0YXRpYyBpbnQgZGdhcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlpbnQgcmM7Ci0KLQkvKiB3YWtlIHVwIGFuZCBlbmFibGUgZGV2aWNlICovCi0JcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQotCWlmIChyYyA8IDApIHsKLQkJcmMgPSAtRUlPOwotCX0gZWxzZSB7ICAKLQkJcmMgPSBkZ2FwX3Byb2JlMShwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCWRnYXBfTnVtQm9hcmRzKys7Ci0JCQlEUFJfSU5JVCgoIkluY3JlbWVudGluZyBudW1ib2FyZHMgdG8gJWRcbiIsIGRnYXBfTnVtQm9hcmRzKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfSAgICAgICAgICAgICAgIAotCi0KLXN0YXRpYyBpbnQgZGdhcF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpCi17Ci0JcmV0dXJuIGRnYXBfZm91bmRfYm9hcmQocGRldiwgY2FyZF90eXBlKTsKLX0KLSAgICAgICAgIAotICAgICAgICAKLXN0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCS8qIERvIE5vdGhpbmcgKi8KLX0KLQotCi0vKgotICogZGdhcF9jbGVhbnVwX21vZHVsZSgpCi0gKgotICogTW9kdWxlIHVubG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIGVuZHMuCi0gKi8KLXZvaWQgZGdhcF9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWludCBpOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlER0FQX0xPQ0soZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOwotCWRnYXBfcG9sbF9zdG9wID0gMTsKLQlER0FQX1VOTE9DSyhkZ2FwX3BvbGxfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkvKiBUdXJuIG9mZiBwb2xsZXIgcmlnaHQgYXdheS4gKi8KLQlkZWxfdGltZXJfc3luYyggJmRnYXBfcG9sbF90aW1lcik7Ci0KLQlkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoJmRnYXBfZHJpdmVyKTsKLQotCi0JaWYgKGRnYXBfTWFqb3JfQ29udHJvbF9SZWdpc3RlcmVkKSB7Ci0JCWRldmljZV9kZXN0cm95KGRnYXBfY2xhc3MsIE1LREVWKERJR0lfREdBUF9NQUpPUiwgMCkpOwotCQlkZXZpY2VfZGVzdHJveShkZ2FwX2NsYXNzLCBNS0RFVihESUdJX0RHQVBfTUFKT1IsIDEpKTsKLQkJY2xhc3NfZGVzdHJveShkZ2FwX2NsYXNzKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXYoRElHSV9ER0FQX01BSk9SLCAiZGdhcCIpOwotCX0KLQotCWtmcmVlKGRnYXBfY29uZmlnX2J1Zik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7ICsraSkgewotCQlkZ2FwX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhkZ2FwX0JvYXJkW2ldKTsKLQkJZGdhcF90dHlfdW5pbml0KGRnYXBfQm9hcmRbaV0pOwotCQlkZ2FwX2NsZWFudXBfYm9hcmQoZGdhcF9Cb2FyZFtpXSk7Ci0JfQotCi0JZGdhcF90dHlfcG9zdF91bmluaXQoKTsKLQotI2lmIGRlZmluZWQoREdBUF9UUkFDRVIpCi0JLyogbGFzdCB0aGluZywgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIHRyYWNlYnVmZmVyICovCi0JZGdhcF90cmFjZXJfZnJlZSgpOwotI2VuZGlmCi0JaWYgKGRnYXBfTnVtQm9hcmRzKQotCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRnYXBfZHJpdmVyKTsKLX0KLQotCi0vKgotICogZGdhcF9jbGVhbnVwX2JvYXJkKCkKLSAqCi0gKiBGcmVlIGFsbCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIGJvYXJkCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfY2xlYW51cF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCWludCBpID0gMDsKLQotICAgICAgICBpZighYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQlpZiAoYnJkLT5pbnRyX3VzZWQgJiYgYnJkLT5pcnEpCi0JCWZyZWVfaXJxKGJyZC0+aXJxLCBicmQpOwotCi0JdGFza2xldF9raWxsKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKLQotCWlmIChicmQtPnJlX21hcF9wb3J0KSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UgKyAweDIwMDAwMCwgMHgyMDAwMDApOwotCQlpb3VubWFwKGJyZC0+cmVfbWFwX3BvcnQpOwotCQlicmQtPnJlX21hcF9wb3J0ID0gTlVMTDsKLQl9Ci0KLQlpZiAoYnJkLT5yZV9tYXBfbWVtYmFzZSkgewotCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7Ci0JCWlvdW5tYXAoYnJkLT5yZV9tYXBfbWVtYmFzZSk7Ci0JCWJyZC0+cmVfbWFwX21lbWJhc2UgPSBOVUxMOwotCX0KLQotICAgICAgICBpZiAoYnJkLT5tc2didWZfaGVhZCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgICAgICAgICBER0FQX0xPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGJyZC0+bXNnYnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwcmludGsoIiVzIiwgYnJkLT5tc2didWZfaGVhZCk7Ci0gICAgICAgICAgICAgICAga2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7Ci0gICAgICAgICAgICAgICAgYnJkLT5tc2didWZfaGVhZCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotICAgICAgICB9Ci0KLQkvKiBGcmVlIGFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMgc3RydWN0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhQT1JUUyA7IGkrKykgewotCQlpZiAoYnJkLT5jaGFubmVsc1tpXSkgewotCQkJa2ZyZWUoYnJkLT5jaGFubmVsc1tpXSk7Ci0JCQlicmQtPmNoYW5uZWxzW2ldID0gTlVMTDsKLQkJfQotCX0KLQotCWtmcmVlKGJyZC0+ZmxpcGJ1Zik7Ci0Ja2ZyZWUoYnJkLT5mbGlwZmxhZ2J1Zik7Ci0KLQlkZ2FwX0JvYXJkW2JyZC0+Ym9hcmRudW1dID0gTlVMTDsKLQotICAgICAgICBrZnJlZShicmQpOwotfQotCi0KLS8qCi0gKiBkZ2FwX2ZvdW5kX2JvYXJkKCkKLSAqCi0gKiBBIGJvYXJkIGhhcyBiZWVuIGZvdW5kLCBpbml0IGl0LgotICovCi1zdGF0aWMgaW50IGRnYXBfZm91bmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYnJkOwotCXVuc2lnbmVkIGludCBwY2lfaXJxOwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogZ2V0IHRoZSBib2FyZCBzdHJ1Y3R1cmUgYW5kIHByZXAgaXQgKi8KLQlicmQgPSBkZ2FwX0JvYXJkW2RnYXBfTnVtQm9hcmRzXSA9Ci0JKHN0cnVjdCBib2FyZF90ICopIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBib2FyZF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFicmQpIHsKLQkJQVBSKCgibWVtb3J5IGFsbG9jYXRpb24gZm9yIGJvYXJkIHN0cnVjdHVyZSBmYWlsZWRcbiIpKTsKLQkJcmV0dXJuKC1FTk9NRU0pOwotCX0KLQotCS8qIG1ha2UgYSB0ZW1wb3JhcnkgbWVzc2FnZSBidWZmZXIgZm9yIHRoZSBib290IG1lc3NhZ2VzICovCi0JYnJkLT5tc2didWYgPSBicmQtPm1zZ2J1Zl9oZWFkID0KLQkJKGNoYXIgKikga3phbGxvYyhzaXplb2YoY2hhcikgKiA4MTkyLCBHRlBfS0VSTkVMKTsKLQlpZighYnJkLT5tc2didWYpIHsKLQkJa2ZyZWUoYnJkKTsKLQkJQVBSKCgibWVtb3J5IGFsbG9jYXRpb24gZm9yIGJvYXJkIG1zZ2J1ZiBmYWlsZWRcbiIpKTsKLQkJcmV0dXJuKC1FTk9NRU0pOwotCX0KLQotCS8qIHN0b3JlIHRoZSBpbmZvIGZvciB0aGUgYm9hcmQgd2UndmUgZm91bmQgKi8KLQlicmQtPm1hZ2ljID0gREdBUF9CT0FSRF9NQUdJQzsKLQlicmQtPmJvYXJkbnVtID0gZGdhcF9OdW1Cb2FyZHM7Ci0JYnJkLT5maXJzdG1pbm9yID0gMDsKLQlicmQtPnZlbmRvciA9IGRnYXBfcGNpX3RibFtpZF0udmVuZG9yOwotCWJyZC0+ZGV2aWNlID0gZGdhcF9wY2lfdGJsW2lkXS5kZXZpY2U7Ci0JYnJkLT5wZGV2ID0gcGRldjsKLQlicmQtPnBjaV9idXMgPSBwZGV2LT5idXMtPm51bWJlcjsKLQlicmQtPnBjaV9zbG90ID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pOwotCWJyZC0+bmFtZSA9IGRnYXBfSWRzW2lkXS5uYW1lOwotCWJyZC0+bWF4cG9ydHMgPSBkZ2FwX0lkc1tpZF0ubWF4cG9ydHM7Ci0JYnJkLT50eXBlID0gZGdhcF9JZHNbaWRdLmNvbmZpZ190eXBlOwotCWJyZC0+ZHBhdHlwZSA9IGRnYXBfSWRzW2lkXS5kcGF0eXBlOwotCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYnJkLT5zdGF0ZV93YWl0KTsKLQotCURHQVBfU1BJTkxPQ0tfSU5JVChicmQtPmJkX2xvY2spOwotCi0JYnJkLT5zdGF0ZQkJPSBCT0FSRF9GT1VORDsKLQlicmQtPnJ1bndhaXQJCT0gMDsKLQlicmQtPmluaGliaXRfcG9sbGVyCT0gRkFMU0U7Ci0JYnJkLT53YWl0X2Zvcl9iaW9zCT0gMDsKLQlicmQtPndhaXRfZm9yX2ZlcAk9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFM7IGkrKykgewotCQlicmQtPmNoYW5uZWxzW2ldID0gTlVMTDsKLQl9Ci0KLQkvKiBzdG9yZSB3aGljaCBjYXJkICYgcmV2aXNpb24gd2UgaGF2ZSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmYnJkLT5zdWJ2ZW5kb3IpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZicmQtPnN1YmRldmljZSk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmYnJkLT5yZXYpOwotCi0JcGNpX2lycSA9IHBkZXYtPmlycTsKLQlicmQtPmlycSA9IHBjaV9pcnE7Ci0KLQkvKiBnZXQgdGhlIFBDSSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXJzICovCi0KLQkvKiBYciBKdXBpdGVyIGFuZCBFUEMgdXNlIEJBUiAyICovCi0JaWYgKGJyZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfWFJKX0RJRCB8fCBicmQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0VQQ0pfRElEKSB7Ci0JCWJyZC0+bWVtYmFzZSAgICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7Ci0JCWJyZC0+bWVtYmFzZV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDIpOwotCX0KLQkvKiBFdmVyeW9uZSBlbHNlIHVzZXMgQkFSIDAgKi8KLQllbHNlIHsKLQkJYnJkLT5tZW1iYXNlICAgICA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKLQkJYnJkLT5tZW1iYXNlX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCk7Ci0JfQotCi0JaWYgKCFicmQtPm1lbWJhc2UpIHsKLQkJQVBSKCgiY2FyZCBoYXMgbm8gUENJIElPIHJlc291cmNlcywgZmFpbGluZyBib2FyZC5cbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGJyZC0+bWVtYmFzZSAmIDEpCi0JCWJyZC0+bWVtYmFzZSAmPSB+MzsKLQllbHNlCi0JCWJyZC0+bWVtYmFzZSAmPSB+MTU7Ci0KLQkvKgotCSAqIE9uIHRoZSBQQ0kgYm9hcmRzLCB0aGVyZSBpcyBubyBJTyBzcGFjZSBhbGxvY2F0ZWQKLQkgKiBUaGUgSS9PIHJlZ2lzdGVycyB3aWxsIGJlIGluIHRoZSBmaXJzdCAzIGJ5dGVzIG9mIHRoZQotCSAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkKLQkgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCi0JICovCi0JYnJkLT5wb3J0ID0gYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVDsKLQlicmQtPnBvcnRfZW5kID0gYnJkLT5wb3J0ICsgUENJX0lPX1NJWkU7Ci0KLQotCS8qCi0JICogU3BlY2lhbCBpbml0aWFsaXphdGlvbiBmb3Igbm9uLVBMWCBib2FyZHMKLQkgKi8KLQlpZiAoYnJkLT5kZXZpY2UgIT0gUENJX0RFVklDRV9YUkpfRElEICYmIGJyZC0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfRVBDSl9ESUQpIHsKLQkJdW5zaWduZWQgc2hvcnQgY21kOwotCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQwLCAwKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDYsIDApOwotCi0JCS8qIExpbWl0IGJ1cnN0IGxlbmd0aCB0byAyIGRvdWJsZXdvcmQgdHJhbnNhY3Rpb25zICovIAotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MiwgMSk7Ci0KLQkJLyoKLQkJICogRW5hYmxlIElPIGFuZCBtZW0gaWYgbm90IGFscmVhZHkgZG9uZS4KLQkJICogVGhpcyB3YXMgbmVlZGVkIGZvciBzdXBwb3J0IG9uIEl0YW5pdW0uCi0JCSAqLwotCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JCWNtZCB8PSAoUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkpOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JfQotCi0JLyogaW5pdCBvdXIgcG9sbCBoZWxwZXIgdGFza2xldCAqLwotCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwgZGdhcF9wb2xsX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBicmQpOwotCi0JIC8qIExvZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJvYXJkICovCi0JZGdhcF9tYnVmKGJyZCwgRFJWU1RSIjogYm9hcmQgJWQ6ICVzIChyZXYgJWQpLCBpcnEgJWRcbiIsCi0JCWRnYXBfTnVtQm9hcmRzLCBicmQtPm5hbWUsIGJyZC0+cmV2LCBicmQtPmlycSk7Ci0KLQlEUFJfSU5JVCgoImRnYXBfc2NhbiglZCkgLSBwcmludGluZyBvdXQgdGhlIG1zZ2J1ZlxuIiwgaSkpOwotCURHQVBfTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0JYnJkLT5tc2didWYgPSBOVUxMOwotCXByaW50aygiJXMiLCBicmQtPm1zZ2J1Zl9oZWFkKTsKLQlrZnJlZShicmQtPm1zZ2J1Zl9oZWFkKTsKLQlicmQtPm1zZ2J1Zl9oZWFkID0gTlVMTDsKLQlER0FQX1VOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0KLQlpID0gZGdhcF9kb19yZW1hcChicmQpOwotCWlmIChpKQotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCWVsc2UKLQkJYnJkLT5zdGF0ZSA9IE5FRURfUkVTRVQ7Ci0KLSAgICAgICAgcmV0dXJuKDApOwotfQotCi0KLWludCBkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkgewotCi0gICAgICAgIGludCByYzsKLQotICAgICAgICBEUFJfSU5JVCgoImRnYXBfZmluYWxpemVfYm9hcmRfaW5pdCgpIC0gc3RhcnRcbiIpKTsKLQotCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm4oLUVOT0RFVik7Ci0KLSAgICAgICAgRFBSX0lOSVQoKCJkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoKSAtIHN0YXJ0ICMyXG4iKSk7Ci0KLQlicmQtPnVzZV9pbnRlcnJ1cHRzID0gZGdhcF9jb25maWdfZ2V0X3VzZWludHIoYnJkKTsKLQotCS8qCi0JICogU2V0IHVwIG91ciBpbnRlcnJ1cHQgaGFuZGxlciBpZiB3ZSBhcmUgc2V0IHRvIGRvIGludGVycnVwdHMuCi0JICovCi0JaWYgKGJyZC0+dXNlX2ludGVycnVwdHMgJiYgYnJkLT5pcnEpIHsKLQotCQlyYyA9IHJlcXVlc3RfaXJxKGJyZC0+aXJxLCBkZ2FwX2ludHIsIElSUUZfU0hBUkVELCAiREdBUCIsIGJyZCk7Ci0KLQkJaWYgKHJjKSB7Ci0JCQlkZ2FwX21idWYoYnJkLCBEUlZTVFIiOiBGYWlsZWQgdG8gaG9vayBJUlEgJWQuIEJvYXJkIHdpbGwgd29yayBpbiBwb2xsIG1vZGUuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZC0+aXJxKTsKLQkJCWJyZC0+aW50cl91c2VkID0gMDsKLQkJfQotCQllbHNlCi0JCQlicmQtPmludHJfdXNlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJYnJkLT5pbnRyX3VzZWQgPSAwOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotCi0vKgotICogUmVtYXAgUENJIG1lbW9yeS4KLSAqLwotc3RhdGljIGludCBkZ2FwX2RvX3JlbWFwKHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCwgImRnYXAiKSkgewotCQlBUFIoKCJkZ2FwOiBtZW1fcmVnaW9uICVseCBhbHJlYWR5IGluIHVzZS5cbiIsIGJyZC0+bWVtYmFzZSkpOwotCQlyZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDAsICJkZ2FwIikpIHsKLQkJQVBSKCgiZGdhcDogbWVtX3JlZ2lvbiBJTyAlbHggYWxyZWFkeSBpbiB1c2UuXG4iLAotCQkJYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCkpOwotCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7Ci0JCXJldHVybiAtRU5PTUVNOwotICAgICAgICB9Ci0KLQlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKLQlpZiAoIWJyZC0+cmVfbWFwX21lbWJhc2UpIHsKLQkJQVBSKCgiZGdhcDogaW9yZW1hcCBtZW0gJWx4IGNhbm5vdCBiZSBtYXBwZWQuXG4iLCBicmQtPm1lbWJhc2UpKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOwotCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlicmQtPnJlX21hcF9wb3J0ID0gaW9yZW1hcCgoYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCksIDB4MjAwMDAwKTsKLQlpZiAoIWJyZC0+cmVfbWFwX3BvcnQpIHsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOwotCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOwotCQlpb3VubWFwKGJyZC0+cmVfbWFwX21lbWJhc2UpOwotCQlBUFIoKCJkZ2FwOiBpb3JlbWFwIElPIG1lbSAlbHggY2Fubm90IGJlIG1hcHBlZC5cbiIsCi0JCQlicmQtPm1lbWJhc2UgKyBQQ0lfSU9fT0ZGU0VUKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCURQUl9JTklUKCgicmVtYXBwZWQgaW86IDB4JXAgIHJlbWFwcGVkIG1lbTogMHglcFxuIiwKLQkJYnJkLT5yZV9tYXBfcG9ydCwgYnJkLT5yZV9tYXBfbWVtYmFzZSkpOwotCXJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogICAgZGdhcF9wb2xsX2hhbmRsZXIKLSoKLSogQXV0aG9yOgotKgotKiAgICBTY290dCBIIEtpbGF1Ci0qICAgICAgIAotKiBQYXJhbWV0ZXJzOgotKgotKiAgICBkdW1teSAtLSBpZ25vcmVkICAgICAgICAgICAgICAgICAgICAKLSoKLSogUmV0dXJuIFZhbHVlczoKLSoKLSogICAgbm9uZQotKgotKiBEZXNjcmlwdGlvbjogICAKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogICAgQXMgZWFjaCB0aW1lciBleHBpcmVzLCBpdCBkZXRlcm1pbmVzIChhKSB3aGV0aGVyIHRoZSAidHJhbnNtaXQiCi0qICAgIHdhaXRlciBuZWVkcyB0byBiZSB3b2tlbiB1cCwgYW5kIChiKSB3aGV0aGVyIHRoZSBwb2xsZXIgbmVlZHMgdG8KLSogICAgYmUgcmVzY2hlZHVsZWQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGRnYXBfcG9sbF9oYW5kbGVyKHVsb25nIGR1bW15KQotewotCWludCBpOwotICAgICAgICBzdHJ1Y3QgYm9hcmRfdCAqYnJkOwotICAgICAgICB1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczI7Ci0JdWxvbmcgbmV3X3RpbWU7Ci0KLQlkZ2FwX3BvbGxfY291bnRlcisrOwotCi0KLQkvKgotCSAqIElmIGRyaXZlciBuZWVkcyB0aGUgY29uZmlnIGZpbGUgc3RpbGwsCi0JICoga2VlcCB0cnlpbmcgdG8gd2FrZSB1cCB0aGUgZG93bmxvYWRlciB0bwotCSAqIHNlbmQgdXMgdGhlIGZpbGUuCi0JICovCi0gICAgICAgIGlmIChkZ2FwX2RyaXZlcl9zdGF0ZSA9PSBEUklWRVJfTkVFRF9DT05GSUdfTE9BRCkgewotCQkvKgotCQkgKiBTaWduYWwgZG93bmxvYWRlciwgaXRzIGdvdCBzb21lIHdvcmsgdG8gZG8uCi0JCSAqLwotCQlER0FQX0xPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCWlmIChkZ2FwX2RsX2FjdGlvbiAhPSAxKSB7Ci0JCQlkZ2FwX2RsX2FjdGlvbiA9IDE7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRnYXBfZGxfd2FpdCk7Ci0JCX0KLQkJREdBUF9VTkxPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCWdvdG8gc2NoZWR1bGVfcG9sbGVyOwotICAgICAgICB9Ci0JLyoKLQkgKiBEbyBub3Qgc3RhcnQgdGhlIGJvYXJkIHN0YXRlIG1hY2hpbmUgdW50aWwKLQkgKiBkcml2ZXIgdGVsbHMgdXMgaXRzIHVwIGFuZCBydW5uaW5nLCBhbmQgaGFzCi0JICogZXZlcnl0aGluZyBpdCBuZWVkcy4KLQkgKi8KLQllbHNlIGlmIChkZ2FwX2RyaXZlcl9zdGF0ZSAhPSBEUklWRVJfUkVBRFkpIHsKLQkJZ290byBzY2hlZHVsZV9wb2xsZXI7Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIGp1c3QgMSBib2FyZCwgb3IgdGhlIHN5c3RlbSBpcyBub3QgU01QLAotCSAqIHRoZW4gdXNlIHRoZSB0eXBpY2FsIG9sZCBzdHlsZSBwb2xsZXIuCi0JICogT3RoZXJ3aXNlLCB1c2Ugb3VyIG5ldyB0YXNrbGV0IGJhc2VkIHBvbGxlciwgd2hpY2ggc2hvdWxkCi0JICogc3BlZWQgdGhpbmdzIHVwIGZvciBtdWx0aXBsZSBib2FyZHMuCi0JICovCi0JaWYgKCAoZGdhcF9OdW1Cb2FyZHMgPT0gMSkgfHwgKG51bV9vbmxpbmVfY3B1cygpIDw9IDEpICkgewotCQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7IGkrKykgewotCi0JCQlicmQgPSBkZ2FwX0JvYXJkW2ldOwotCi0JCQlpZiAoYnJkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghYnJkLT5pbnRyX3J1bm5pbmcpIHsKLQkJCQkvKiBDYWxsIHRoZSByZWFsIGJvYXJkIHBvbGxlciBkaXJlY3RseSAqLwotCQkJCWRnYXBfcG9sbF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKSBicmQpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBHbyB0aHJ1IGVhY2ggYm9hcmQsIGtpY2tpbmcgb2ZmIGEgdGFza2xldCBmb3IgZWFjaCBpZiBuZWVkZWQgKi8KLQkJZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyBpKyspIHsKLQkJCWJyZCA9IGRnYXBfQm9hcmRbaV07Ci0KLQkJCS8qCi0JCQkgKiBBdHRlbXB0IHRvIGdyYWIgdGhlIGJvYXJkIGxvY2suCi0JCQkgKgotCQkJICogSWYgd2UgY2FuJ3QgZ2V0IGl0LCBubyBiaWcgZGVhbCwgdGhlIG5leHQgcG9sbCB3aWxsIGdldCBpdC4KLQkJCSAqIEJhc2ljYWxseSwgSSBqdXN0IHJlYWxseSBkb24ndCB3YW50IHRvIHNwaW4gaW4gaGVyZSwgYmVjYXVzZSBJIHdhbnQKLQkJCSAqIHRvIGtpY2sgb2ZmIG15IHRhc2tsZXRzIGFzIGZhc3QgYXMgSSBjYW4sIGFuZCB0aGVuIGdldCBvdXQgdGhlIHBvbGxlci4KLQkJCSAqLwotCQkJaWYgKCFzcGluX3RyeWxvY2soJmJyZC0+YmRfbG9jaykpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogSWYgYm9hcmQgaXMgaW4gYSBmYWlsZWQgc3RhdGUsIGRvbid0IGJvdGhlciBzY2hlZHVsaW5nIGEgdGFza2xldCAqLwotCQkJaWYgKGJyZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7Ci0JCQkJc3Bpbl91bmxvY2soJmJyZC0+YmRfbG9jayk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFNjaGVkdWxlIGEgcG9sbCBoZWxwZXIgdGFzayAqLwotCQkJaWYgKCFicmQtPmludHJfcnVubmluZykgewotCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOwotCQkJfQotCi0JCQkvKgotCQkJICogQ2FuJ3QgZG8gREdBUF9VTkxPQ0sgaGVyZSwgYXMgd2UgZG9uJ3QgaGF2ZQotCQkJICogbG9ja19mbGFncyBiZWNhdXNlIHdlIGRpZCBhIHRyeWxvY2sgYWJvdmUuCi0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZicmQtPmJkX2xvY2spOwotCQl9Ci0JfQotCi1zY2hlZHVsZV9wb2xsZXI6Ci0KLQkvKgotCSAqIFNjaGVkdWxlIG91cnNlbGYgYmFjayBhdCB0aGUgbm9taW5hbCB3YWtldXAgaW50ZXJ2YWwuCi0JICovCi0JREdBUF9MT0NLKGRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzICk7Ci0JZGdhcF9wb2xsX3RpbWUgKz0gIGRnYXBfamlmZmllc19mcm9tX21zKGRnYXBfcG9sbF90aWNrKTsKLQotCW5ld190aW1lID0gZGdhcF9wb2xsX3RpbWUgLSBqaWZmaWVzOwotCi0JaWYgKCh1bG9uZykgbmV3X3RpbWUgPj0gMiAqIGRnYXBfcG9sbF90aWNrKSB7Ci0JCWRnYXBfcG9sbF90aW1lID0gamlmZmllcyArICBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7Ci0JfQotCi0JZGdhcF9wb2xsX3RpbWVyLmZ1bmN0aW9uID0gZGdhcF9wb2xsX2hhbmRsZXI7Ci0JZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOwotCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7Ci0JREdBUF9VTkxPQ0soZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MgKTsKLQotCWlmICghZGdhcF9wb2xsX3N0b3ApCi0JCWFkZF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKLX0KLQotCi0KLQotLyoKLSAqIGRnYXBfaW50cigpCi0gKgotICogRHJpdmVyIGludGVycnVwdCBoYW5kbGVyLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgZGdhcF9pbnRyKGludCBpcnEsIHZvaWQgKnZvaWRicmQpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJyZCA9IChzdHJ1Y3QgYm9hcmRfdCAqKSB2b2lkYnJkOwotCi0JaWYgKCFicmQpIHsKLQkJQVBSKCgiUmVjZWl2ZWQgaW50ZXJydXB0ICglZCkgd2l0aCBudWxsIGJvYXJkIGFzc29jaWF0ZWRcbiIsIGlycSkpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0byBtYWtlIHN1cmUgaXRzIGZvciB1cy4KLQkgKi8KLQlpZiAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB7Ci0JCUFQUigoIlJlY2VpdmVkIGludGVycnVwdCAoJWQpIHdpdGggYSBib2FyZCBwb2ludGVyIHRoYXQgd2Fzbid0IG91cnMhXG4iLCBpcnEpKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWJyZC0+aW50cl9jb3VudCsrOwotCi0JLyoKLQkgKiBTY2hlZHVsZSB0YXNrbGV0IHRvIHJ1biBhdCBhIGJldHRlciB0aW1lLgotCSAqLwotCXRhc2tsZXRfc2NoZWR1bGUoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKgotICogZGdhcF9pbml0X2dsb2JhbHMoKQotICoKLSAqIFRoaXMgaXMgd2hlcmUgd2UgaW5pdGlhbGl6ZSB0aGUgZ2xvYmFscyBmcm9tIHRoZSBzdGF0aWMgaW5zbW9kCi0gKiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4gIFRoZXNlIGFyZSBkZWNsYXJlZCBuZWFyIHRoZSBoZWFkIG9mCi0gKiB0aGlzIGZpbGUuCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfaW5pdF9nbG9iYWxzKHZvaWQpCi17Ci0JaW50IGkgPSAwOwotCi0JZGdhcF9yYXdyZWFkb2sJCT0gcmF3cmVhZG9rOwotICAgICAgICBkZ2FwX3RyY2J1Zl9zaXplCT0gdHJjYnVmX3NpemU7Ci0JZGdhcF9kZWJ1ZwkJPSBkZWJ1ZzsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhCT0FSRFM7IGkrKykgewotCQlkZ2FwX0JvYXJkW2ldID0gTlVMTDsKLQl9Ci0KLQlpbml0X3RpbWVyKCAmZGdhcF9wb2xsX3RpbWVyICk7IAotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGdhcF9kbF93YWl0KTsKLQlkZ2FwX2RsX2FjdGlvbiA9IDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFV0aWxpdHkgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKgotICogZGdhcF9tYnVmKCkKLSAqCi0gKiBVc2VkIHRvIHByaW50IHRvIHRoZSBtZXNzYWdlIGJ1ZmZlciBkdXJpbmcgYm9hcmQgaW5pdC4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9tYnVmKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7Ci0JdmFfbGlzdAkJYXA7Ci0JY2hhcgkJYnVmWzEwMjRdOwotCWludAkJaTsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCXNpemVfdAkJbGVuZ3RoOwotCi0JREdBUF9MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQotCS8qIEZvcm1hdCBidWYgdXNpbmcgZm10IGFuZCBhcmd1bWVudHMgY29udGFpbmVkIGluIGFwLiAqLwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCWkgPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCAgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlEUFIoKGJ1ZikpOwotCi0JaWYgKCFicmQgfHwgIWJyZC0+bXNnYnVmKSB7Ci0JCXByaW50aygiJXMiLCBidWYpOwotCQlER0FQX1VOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlsZW5ndGggPSBzdHJsZW4oYnVmKSArIDE7Ci0JaWYgKGJyZC0+bXNnYnVmIC0gYnJkLT5tc2didWZfaGVhZCA8IGxlbmd0aCkKLQkJbGVuZ3RoID0gYnJkLT5tc2didWYgLSBicmQtPm1zZ2J1Zl9oZWFkOwotCW1lbWNweShicmQtPm1zZ2J1ZiwgYnVmLCBsZW5ndGgpOwotCWJyZC0+bXNnYnVmICs9IGxlbmd0aDsKLQotCURHQVBfVU5MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLX0KLQotCi0vKgotICogZGdhcF9tc19zbGVlcCgpCi0gKgotICogUHV0IHRoZSBkcml2ZXIgdG8gc2xlZXAgZm9yIHggbXMncwotICoKLSAqIFJldHVybnMgMCBpZiB0aW1lZCBvdXQsICEwIChzaG93aW5nIHNpZ25hbCkgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCi0gKi8KLWludCBkZ2FwX21zX3NsZWVwKHVsb25nIG1zKQotewotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoKG1zICogSFopIC8gMTAwMCk7Ci0JcmV0dXJuIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci19Ci0KLQotCi0vKgotICogICAgICBkZ2FwX2lvY3RsX25hbWUoKSA6IFJldHVybnMgYSB0ZXh0IHZlcnNpb24gb2YgZWFjaCBpb2N0bCB2YWx1ZS4KLSAqLwotY2hhciAqZGdhcF9pb2N0bF9uYW1lKGludCBjbWQpCi17Ci0Jc3dpdGNoKGNtZCkgewotCi0JY2FzZSBUQ0dFVEE6CQlyZXR1cm4oIlRDR0VUQSIpOwotCWNhc2UgVENHRVRTOgkJcmV0dXJuKCJUQ0dFVFMiKTsKLQljYXNlIFRDU0VUQToJCXJldHVybigiVENTRVRBIik7Ci0JY2FzZSBUQ1NFVFM6CQlyZXR1cm4oIlRDU0VUUyIpOwotCWNhc2UgVENTRVRBVzoJCXJldHVybigiVENTRVRBVyIpOwotCWNhc2UgVENTRVRTVzoJCXJldHVybigiVENTRVRTVyIpOwotCWNhc2UgVENTRVRBRjoJCXJldHVybigiVENTRVRBRiIpOwotCWNhc2UgVENTRVRTRjoJCXJldHVybigiVENTRVRTRiIpOwotCWNhc2UgVENTQlJLOgkJcmV0dXJuKCJUQ1NCUksiKTsKLQljYXNlIFRDWE9OQzoJCXJldHVybigiVENYT05DIik7Ci0JY2FzZSBUQ0ZMU0g6CQlyZXR1cm4oIlRDRkxTSCIpOwotCWNhc2UgVElPQ0dTSUQ6CQlyZXR1cm4oIlRJT0NHU0lEIik7Ci0KLQljYXNlIFRJT0NHRVREOgkJcmV0dXJuKCJUSU9DR0VURCIpOwotCWNhc2UgVElPQ1NFVEQ6CQlyZXR1cm4oIlRJT0NTRVREIik7Ci0JY2FzZSBUSU9DR1dJTlNaOglyZXR1cm4oIlRJT0NHV0lOU1oiKTsKLQljYXNlIFRJT0NTV0lOU1o6CXJldHVybigiVElPQ1NXSU5TWiIpOwotCi0JY2FzZSBUSU9DTUdFVDoJCXJldHVybigiVElPQ01HRVQiKTsKLQljYXNlIFRJT0NNU0VUOgkJcmV0dXJuKCJUSU9DTVNFVCIpOwotCWNhc2UgVElPQ01CSVM6CQlyZXR1cm4oIlRJT0NNQklTIik7Ci0JY2FzZSBUSU9DTUJJQzoJCXJldHVybigiVElPQ01CSUMiKTsKLQotCS8qIGZyb20gZGlnaS5oICovCi0JY2FzZSBESUdJX1NFVEE6CQlyZXR1cm4oIkRJR0lfU0VUQSIpOwotCWNhc2UgRElHSV9TRVRBVzoJcmV0dXJuKCJESUdJX1NFVEFXIik7Ci0JY2FzZSBESUdJX1NFVEFGOglyZXR1cm4oIkRJR0lfU0VUQUYiKTsKLQljYXNlIERJR0lfU0VURkxPVzoJcmV0dXJuKCJESUdJX1NFVEZMT1ciKTsKLQljYXNlIERJR0lfU0VUQUZMT1c6CXJldHVybigiRElHSV9TRVRBRkxPVyIpOwotCWNhc2UgRElHSV9HRVRGTE9XOglyZXR1cm4oIkRJR0lfR0VURkxPVyIpOwotCWNhc2UgRElHSV9HRVRBRkxPVzoJcmV0dXJuKCJESUdJX0dFVEFGTE9XIik7Ci0JY2FzZSBESUdJX0dFVEE6CQlyZXR1cm4oIkRJR0lfR0VUQSIpOwotCWNhc2UgRElHSV9HRURFTEFZOglyZXR1cm4oIkRJR0lfR0VERUxBWSIpOwotCWNhc2UgRElHSV9TRURFTEFZOglyZXR1cm4oIkRJR0lfU0VERUxBWSIpOwotCWNhc2UgRElHSV9HRVRDVVNUT01CQVVEOiByZXR1cm4oIkRJR0lfR0VUQ1VTVE9NQkFVRCIpOwotCWNhc2UgRElHSV9TRVRDVVNUT01CQVVEOiByZXR1cm4oIkRJR0lfU0VUQ1VTVE9NQkFVRCIpOwotCWNhc2UgVElPQ01PREc6CQlyZXR1cm4oIlRJT0NNT0RHIik7Ci0JY2FzZSBUSU9DTU9EUzoJCXJldHVybigiVElPQ01PRFMiKTsKLQljYXNlIFRJT0NTRFRSOgkJcmV0dXJuKCJUSU9DU0RUUiIpOwotCWNhc2UgVElPQ0NEVFI6CQlyZXR1cm4oIlRJT0NDRFRSIik7Ci0KLQlkZWZhdWx0OgkJcmV0dXJuKCJ1bmtub3duIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kcml2ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZHJpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2E1NWE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZHJpdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERyaXZlciBpbmNsdWRlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fREdBUF9EUklWRVJfSAotI2RlZmluZSBfX0RHQVBfRFJJVkVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogVG8gZ2V0IHRoZSBjdXJyZW50IExpbnV4IHZlcnNpb24gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAgICAgICAgLyogVG8gcGljayB1cCB0aGUgdmFyaW9ucyBMaW51eCB0eXBlcyAqLwotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPiAgICAgICAgICAvKiBUbyBwaWNrIHVwIHRoZSB2YXJpb3VzIHR0eSBzdHJ1Y3RzL2RlZmluZXMgKi8KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gICAgLyogRm9yIGlycXJldHVybl90IHR5cGUgKi8KLQotI2luY2x1ZGUgImRnYXBfdHlwZXMuaCIgICAgICAgICAvKiBBZGRpdGlvbmFsIHR5cGVzIG5lZWRlZCBieSB0aGUgRGlnaSBoZWFkZXIgZmlsZXMgKi8KLSNpbmNsdWRlICJkaWdpLmgiICAgICAgICAgICAgICAgLyogRGlnaSBzcGVjaWZpYyBpb2N0bCBoZWFkZXIgKi8KLSNpbmNsdWRlICJkZ2FwX2tjb21wYXQuaCIgICAgICAgLyogS2VybmVsIDIuNC8yLjYgY29tcGF0IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiZGdhcF9zeXNmcy5oIgkJLyogU3VwcG9ydCBmb3IgU1lTRlMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEcml2ZXIgZGVmaW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogRHJpdmVyIGlkZW50aWZpY2F0aW9uLCBlcnJvciBhbmQgZGVidWdnaW5nIHN0YXRtZW50cwotICoKLSAqIEluIHRoZW9yeSwgeW91IGNhbiBjaGFuZ2UgYWxsIG9jY3VycmVuY2VzIG9mICJkaWdpIiBpbiB0aGUgbmV4dAotICogdGhyZWUgbGluZXMsIGFuZCB0aGUgZHJpdmVyIHByaW50aydzIHdpbGwgYWxsIGF1dG9tYWdpY2FsbHkgY2hhbmdlLgotICoKLSAqIEFQUigoZm10LCBhcmdzLCAuLi4pKTsJQWx3YXlzIHByaW50cyBtZXNzYWdlCi0gKiBEUFIoKGZtdCwgYXJncywgLi4uKSk7CU9ubHkgcHJpbnRzIGlmIERHQVBfVFJBQ0VSIGlzIGRlZmluZWQgYXQKLSAqCQkJCSAgY29tcGlsZSB0aW1lIGFuZCBkZ2FwX2RlYnVnIT0wCi0gKi8KLSNkZWZpbmUJREdfTkFNRQkJImRnYXAtMS4zLTE2IgotI2RlZmluZQlER19QQVJUCQkiNDAwMDIzNDdfQyIKLQotI2RlZmluZQlQUk9DU1RSCQkiZGdhcCIJCQkvKiAvcHJvYyBlbnRyaWVzCSAqLwotI2RlZmluZQlERVZTVFIJCSIvZGV2L2RnL2RnYXAiCQkvKiAvZGV2IGVudHJpZXMJCSAqLwotI2RlZmluZQlEUlZTVFIJCSJkZ2FwIgkJCS8qIERyaXZlciBuYW1lIHN0cmluZyAKLQkJCQkJCSAqIGRpc3BsYXllZCBieSBBUFIJICovCi0jZGVmaW5lCUFQUihhcmdzKQlkbyB7IFBSSU5URl9UT19LTUVNKGFyZ3MpOyBwcmludGsoRFJWU1RSIjogIik7IHByaW50ayBhcmdzOyBcCi0JCQkgICB9IHdoaWxlICgwKQotI2RlZmluZQlSQVBSKGFyZ3MpCWRvIHsgUFJJTlRGX1RPX0tNRU0oYXJncyk7IHByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQ19UT19DT05TT0xFIDEKLQotLyoKLSAqIERlYnVnZ2luZyBsZXZlbHMgY2FuIGJlIHNldCB1c2luZyBkZWJ1ZyBpbnNtb2QgdmFyaWFibGUKLSAqIFRoZXkgY2FuIGFsc28gYmUgY29tcGlsZWQgb3V0IGNvbXBsZXRlbHkuCi0gKi8KLQotI2RlZmluZQlEQkdfSU5JVAkJKGRnYXBfZGVidWcgJiAweDAxKQotI2RlZmluZQlEQkdfQkFTSUMJCShkZ2FwX2RlYnVnICYgMHgwMikKLSNkZWZpbmUJREJHX0NPUkUJCShkZ2FwX2RlYnVnICYgMHgwNCkKLQotI2RlZmluZQlEQkdfT1BFTgkJKGRnYXBfZGVidWcgJiAweDA4KQotI2RlZmluZQlEQkdfQ0xPU0UJCShkZ2FwX2RlYnVnICYgMHgxMCkKLSNkZWZpbmUJREJHX1JFQUQJCShkZ2FwX2RlYnVnICYgMHgyMCkKLSNkZWZpbmUJREJHX1dSSVRFCQkoZGdhcF9kZWJ1ZyAmIDB4NDApCi0KLSNkZWZpbmUJREJHX0lPQ1RMCQkoZGdhcF9kZWJ1ZyAmIDB4ODApCi0KLSNkZWZpbmUJREJHX1BST0MJCShkZ2FwX2RlYnVnICYgMHgxMDApCi0jZGVmaW5lCURCR19QQVJBTQkJKGRnYXBfZGVidWcgJiAweDIwMCkKLSNkZWZpbmUJREJHX1BTQ0FOCQkoZGdhcF9kZWJ1ZyAmIDB4NDAwKQotI2RlZmluZQlEQkdfRVZFTlQJCShkZ2FwX2RlYnVnICYgMHg4MDApCi0KLSNkZWZpbmUJREJHX0RSQUlOCQkoZGdhcF9kZWJ1ZyAmIDB4MTAwMCkKLSNkZWZpbmUJREJHX0NBUlIJCShkZ2FwX2RlYnVnICYgMHgyMDAwKQotCi0jZGVmaW5lCURCR19NR01UCQkoZGdhcF9kZWJ1ZyAmIDB4NDAwMCkKLQotCi0jaWYgZGVmaW5lZChER0FQX1RSQUNFUikKLQotIyBpZiBkZWZpbmVkKFRSQ19UT19LTUVNKQotLyogQ2hvb3NlIG9uZTogKi8KLSMgIGRlZmluZSBUUkNfT05fT1ZFUkZMT1dfV1JBUF9BUk9VTkQKLSMgIHVuZGVmICBUUkNfT05fT1ZFUkZMT1dfU0hJRlRfQlVGRkVSCi0jIGVuZGlmIC8vVFJDX1RPX0tNRU0KLQotIyBkZWZpbmUgVFJDX01BWE1TRwkJMTAyNAotIyBkZWZpbmUgVFJDX09WRVJGTE9XCQkiKE9WRVJGTE9XKSIKLSMgZGVmaW5lIFRSQ19EVFJDCQkiL3Vzci9iaW4vZHRyYyIKLQotI2lmIGRlZmluZWQgVFJDX1RPX0NPTlNPTEUKLSNkZWZpbmUgUFJJTlRGX1RPX0NPTlNPTEUoYXJncykgeyBwcmludGsoRFJWU1RSIjogIik7IHByaW50ayBhcmdzOyB9Ci0jZWxzZSAvLyFkZWZpbmVkIFRSQUNFX1RPX0NPTlNPTEUKLSNkZWZpbmUgUFJJTlRGX1RPX0NPTlNPTEUoYXJncykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBUUkNfVE9fS01FTQotI2RlZmluZSBQUklOVEZfVE9fS01FTShhcmdzKSBkZ2FwX3RyYWNlZiBhcmdzIAotI2Vsc2UgLy8hZGVmaW5lZCBUUkNfVE9fS01FTQotI2RlZmluZSBQUklOVEZfVE9fS01FTShhcmdzKQotI2VuZGlmCi0KLSNkZWZpbmUJVFJDKGFyZ3MpCXsgUFJJTlRGX1RPX0tNRU0oYXJncyk7IFBSSU5URl9UT19DT05TT0xFKGFyZ3MpIH0KLQotIyBkZWZpbmUgRFBSX0lOSVQoQVJHUykJCWlmIChEQkdfSU5JVCkgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfQkFTSUMoQVJHUykJaWYgKERCR19CQVNJQykgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfQ09SRShBUkdTKQkJaWYgKERCR19DT1JFKSBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9PUEVOKEFSR1MpCQlpZiAoREJHX09QRU4pICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9DTE9TRShBUkdTKQlpZiAoREJHX0NMT1NFKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfUkVBRChBUkdTKQkJaWYgKERCR19SRUFEKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfV1JJVEUoQVJHUykJaWYgKERCR19XUklURSkgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfSU9DVEwoQVJHUykJaWYgKERCR19JT0NUTCkgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfUFJPQyhBUkdTKQkJaWYgKERCR19QUk9DKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfUEFSQU0oQVJHUykJaWYgKERCR19QQVJBTSkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BTQ0FOKEFSR1MpCWlmIChEQkdfUFNDQU4pICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9FVkVOVChBUkdTKQlpZiAoREJHX0VWRU5UKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfRFJBSU4oQVJHUykJaWYgKERCR19EUkFJTikgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0NBUlIoQVJHUykJCWlmIChEQkdfQ0FSUikgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX01HTVQoQVJHUykJCWlmIChEQkdfTUdNVCkgIFRSQyhBUkdTKQotCi0jIGRlZmluZSBEUFIoQVJHUykJCWlmIChkZ2FwX2RlYnVnKSBUUkMoQVJHUykKLSMgZGVmaW5lIFAoWCkJCQlkZ2FwX3RyYWNlZigjWCAiPSVwXG4iLCBYKQotIyBkZWZpbmUgWChYKQkJCWRnYXBfdHJhY2VmKCNYICI9JXhcbiIsIFgpCi0KLSNlbHNlLy8hZGVmaW5lZCBER0FQX1RSQUNFUgotCi0jZGVmaW5lIFBSSU5URl9UT19LTUVNKGFyZ3MpCi0jIGRlZmluZSBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9JTklUKEFSR1MpCi0jIGRlZmluZSBEUFJfQkFTSUMoQVJHUykKLSMgZGVmaW5lIERQUl9DT1JFKEFSR1MpCi0jIGRlZmluZSBEUFJfT1BFTihBUkdTKQotIyBkZWZpbmUgRFBSX0NMT1NFKEFSR1MpCi0jIGRlZmluZSBEUFJfUkVBRChBUkdTKQotIyBkZWZpbmUgRFBSX1dSSVRFKEFSR1MpCi0jIGRlZmluZSBEUFJfSU9DVEwoQVJHUykKLSMgZGVmaW5lIERQUl9QUk9DKEFSR1MpCi0jIGRlZmluZSBEUFJfUEFSQU0oQVJHUykKLSMgZGVmaW5lIERQUl9QU0NBTihBUkdTKQotIyBkZWZpbmUgRFBSX0VWRU5UKEFSR1MpCi0jIGRlZmluZSBEUFJfRFJBSU4oQVJHUykKLSMgZGVmaW5lIERQUl9DQVJSKEFSR1MpCi0jIGRlZmluZSBEUFJfTUdNVChBUkdTKQotCi0jIGRlZmluZSBEUFIoYXJncykKLQotI2VuZGlmLy9ER0FQX1RSQUNFUgotCi0vKiBOdW1iZXIgb2YgYm9hcmRzIHdlIHN1cHBvcnQgYXQgb25jZS4gKi8KLSNkZWZpbmUJTUFYQk9BUkRTCTMyCi0jZGVmaW5lCU1BWFBPUlRTCTIyNAotI2RlZmluZSBNQVhUVFlOQU1FTEVOCTIwMAotCi0vKiBPdXIgMyBtYWdpYyBudW1iZXJzIGZvciBvdXIgYm9hcmQsIGNoYW5uZWwgYW5kIHVuaXQgc3RydWN0cyAqLwotI2RlZmluZSBER0FQX0JPQVJEX01BR0lDCTB4NWM2ZGYxMDQKLSNkZWZpbmUgREdBUF9DSEFOTkVMX01BR0lDCTB4NmM2ZGYxMDQKLSNkZWZpbmUgREdBUF9VTklUX01BR0lDCQkweDdjNmRmMTA0Ci0KLS8qIFNlcmlhbCBwb3J0IHR5cGVzICovCi0jZGVmaW5lIERHQVBfU0VSSUFMCQkwCi0jZGVmaW5lIERHQVBfUFJJTlQJCTEKLQotI2RlZmluZQlTRVJJQUxfVFlQRV9OT1JNQUwJMQotCi0vKiA0IGV4dHJhIGZvciBhbGlnbm1lbnQgcGxheSBzcGFjZSAqLwotI2RlZmluZSBXUklURUJVRkxFTgkJKCg0MDk2KSArIDQpCi0jZGVmaW5lIE1ZRkxJUExFTgkJTl9UVFlfQlVGX1NJWkUKLQotI2RlZmluZSBTQlJFQUtfVElNRSAweDI1Ci0jZGVmaW5lIFUyQlNJWkUgMHg0MDAKLQotI2RlZmluZSBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhhKSAoKChhKSAqIEhaKSAvIDEwMDApCi0KLS8qCi0gKiBPdXIgbWFqb3IgZm9yIHRoZSBtZ210IGRldmljZXMuCi0gKgotICogV2UgY2FuIHVzZSAyMiwgYmVjYXVzZSBEaWdpIHdhcyBhbGxvY2F0ZWQgMjIgYW5kIDIzIGZvciB0aGUgZXBjYSBkcml2ZXIuCi0gKiAyMiBoYXMgbm93IGJlY29tZSBvYnNvbGV0ZSBub3cgdGhhdCB0aGUgImN1IiBkZXZpY2VzIGhhdmUgCi0gKiBiZWVuIHJlbW92ZWQgZnJvbSAyLjYuCi0gKiBBbHNvLCB0aGlzICpJUyogdGhlIGVwY2EgZHJpdmVyLCBqdXN0IFBDSSBvbmx5IG5vdy4KLSAqLwotI2lmbmRlZiBESUdJX0RHQVBfTUFKT1IKLSMgZGVmaW5lIERJR0lfREdBUF9NQUpPUiAgICAgICAgIDIyCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBwYXJhbWV0ZXJzIHdlIHVzZSB0byBkZWZpbmUgdGhlIHBlcmlvZHMgb2YgdGhlIG1vdmluZyBhdmVyYWdlcy4KLSAqLwotI2RlZmluZQkJTUFfUEVSSU9ECShIWiAvIDEwKQotI2RlZmluZQkJU01BX0RVUgkJKDEgKiBIWikKLSNkZWZpbmUJCUVNQV9EVVIJCSgxICogSFopCi0jZGVmaW5lCQlTTUFfTlBFUklPRFMJKFNNQV9EVVIgLyBNQV9QRVJJT0QpCi0jZGVmaW5lCQlFTUFfTlBFUklPRFMJKEVNQV9EVVIgLyBNQV9QRVJJT0QpCi0KLS8qCi0gKiBEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCi0gKiB3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuICBUaGlzIGlzIHRoZSBzYW1lIHN0cnVjdHVyZSB0aGF0IGlzIGRlZmluZWQKLSAqIGFzIHRoZSBkZWZhdWx0IGluIHR0eV9pby5jIHdpdGggdGhlIHNhbWUgc2V0dGluZ3Mgb3ZlcnJpZGVuIGFzIGluIHNlcmlhbC5jCi0gKgotICogSW4gc2hvcnQsIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSBpbnRlcm5hbCBzZXJpYWwgcG9ydHMnIGRlZmF1bHRzLgotICovCi0jZGVmaW5lCURFRkFVTFRfSUZMQUdTCShJQ1JOTCB8IElYT04pCi0jZGVmaW5lCURFRkFVTFRfT0ZMQUdTCShPUE9TVCB8IE9OTENSKQotI2RlZmluZQlERUZBVUxUX0NGTEFHUwkoQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMKQotI2RlZmluZQlERUZBVUxUX0xGTEFHUwkoSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgXAotCQkJRUNIT0NUTCB8IEVDSE9LRSB8IElFWFRFTikKLQotI2lmbmRlZiBfUE9TSVhfVkRJU0FCTEUKLSNkZWZpbmUgICBfUE9TSVhfVkRJU0FCTEUgJ1wwJwotI2VuZGlmCi0KLSNkZWZpbmUgU05JRkZfTUFYCTY1NTM2CQkvKiBTbmlmZiBidWZmZXIgc2l6ZSAoMl5uKSAqLwotI2RlZmluZSBTTklGRl9NQVNLCShTTklGRl9NQVggLSAxKQkvKiBTbmlmZiB3cmFwIG1hc2sgKi8KLQotI2RlZmluZSBWUERTSVpFICg1MTIpCi0KLS8qCi0gKiBMb2NrIGZ1bmN0aW9uL2RlZmluZXMuCi0gKiBNYWtlcyBzcG90dGluZyBsb2NrL3VubG9jayBsb2NhdGlvbnMgZWFzaWVyLgotICovCi0jIGRlZmluZSBER0FQX1NQSU5MT0NLX0lOSVQoeCkJCXNwaW5fbG9ja19pbml0KCYoeCkpCi0jIGRlZmluZSBER0FQX0xPQ0soeCx5KQkJCXNwaW5fbG9ja19pcnFzYXZlKCYoeCksIHkpCi0jIGRlZmluZSBER0FQX1VOTE9DSyh4LHkpCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoeCksIHkpCi0jIGRlZmluZSBER0FQX1RSWUxPQ0soeCx5KQkJc3Bpbl90cnlsb2NrKCYoeCkpCi0KLS8qCi0gKiBBbGwgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGUgZHJpdmVyIGNhbiBiZSB3aGlsZSBiZWluZyBsb2FkZWQuCi0gKi8KLWVudW0gewotCURSSVZFUl9JTklUSUFMSVpFRCA9IDAsCi0JRFJJVkVSX05FRURfQ09ORklHX0xPQUQsCi0JRFJJVkVSX1JFUVVFU1RFRF9DT05GSUcsCi0JRFJJVkVSX1JFQURZCi19OwotCi0vKgotICogQWxsIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhlIGJvYXJkIGNhbiBiZSB3aGlsZSBib290aW5nIHVwLgotICovCi1lbnVtIHsKLQlCT0FSRF9GQUlMRUQgPSAwLAotCUNPTkZJR19OT1RfRk9VTkQsCi0JQk9BUkRfRk9VTkQsCi0JTkVFRF9SRVNFVCwKLQlGSU5JU0hFRF9SRVNFVCwKLQlORUVEX0NPTkZJRywKLQlGSU5JU0hFRF9DT05GSUcsCi0JTkVFRF9ERVZJQ0VfQ1JFQVRJT04sCi0JUkVRVUVTVEVEX0RFVklDRV9DUkVBVElPTiwKLQlGSU5JU0hFRF9ERVZJQ0VfQ1JFQVRJT04sCi0JTkVFRF9CSU9TX0xPQUQsCi0JUkVRVUVTVEVEX0JJT1MsCi0JV0FJVF9CSU9TX0xPQUQsCi0JRklOSVNIRURfQklPU19MT0FELAotCU5FRURfRkVQX0xPQUQsCi0JUkVRVUVTVEVEX0ZFUCwKLQlXQUlUX0ZFUF9MT0FELAotCUZJTklTSEVEX0ZFUF9MT0FELAotCU5FRURfUFJPQ19DUkVBVElPTiwKLQlGSU5JU0hFRF9QUk9DX0NSRUFUSU9OLAotCUJPQVJEX1JFQURZCi19OwotCi0vKgotICogQWxsIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhhdCBhIHJlcXVlc3RlZCBjb25jZW50cmF0b3IgaW1hZ2UgY2FuIGJlIGluLgotICovCi1lbnVtIHsKLQlOT19QRU5ESU5HX0NPTkNFTlRSQVRPUl9SRVFVRVNUUyA9IDAsCi0JTkVFRF9DT05DRU5UUkFUT1IsCi0JUkVRVUVTVEVEX0NPTkNFTlRSQVRPUgotfTsKLQotZXh0ZXJuIGNoYXIgKmRnYXBfc3RhdGVfdGV4dFtdOwotZXh0ZXJuIGNoYXIgKmRnYXBfZHJpdmVyX3N0YXRlX3RleHRbXTsKLQotCi0vKiAKLSAqIE1vZGVtIGxpbmUgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBiZWNhdXNlIERTUiBhbmQKLSAqIERDRCBhcmUgc3dhcGFibGUgdXNpbmcgdGhlIGRpdHR5IGFsdHBpbiBvcHRpb24uCi0gKi8KLSNkZWZpbmUgRF9DRChjaCkgICAgICAgIGNoLT5jaF9jZCAgICAgICAvKiBDYXJyaWVyIGRldGVjdCAgICAgICAqLwotI2RlZmluZSBEX0RTUihjaCkgICAgICAgY2gtPmNoX2RzciAgICAgIC8qIERhdGEgc2V0IHJlYWR5ICAgICAgICovCi0jZGVmaW5lIERfUlRTKGNoKSAgICAgICBETV9SVFMgICAgICAgICAgLyogUmVxdWVzdCB0byBzZW5kICAgICAgKi8KLSNkZWZpbmUgRF9DVFMoY2gpICAgICAgIERNX0NUUyAgICAgICAgICAvKiBDbGVhciB0byBzZW5kICAgICAgICAqLwotI2RlZmluZSBEX1JJKGNoKSAgICAgICAgRE1fUkkgICAgICAgICAgIC8qIFJpbmcgaW5kaWNhdG9yICAgICAgICovCi0jZGVmaW5lIERfRFRSKGNoKSAgICAgICBETV9EVFIgICAgICAgICAgLyogRGF0YSB0ZXJtaW5hbCByZWFkeSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFN0cnVjdHVyZXMgYW5kIGNsb3NlbHkgcmVsYXRlZCBkZWZpbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBBIHN0cnVjdHVyZSB0byBob2xkIGEgc3RhdGlzdGljcyBjb3VudGVyLiAgV2UgYWxzbwotICogY29tcHV0ZSBtb3ZpbmcgYXZlcmFnZXMgZm9yIHRoaXMgY291bnRlci4KLSAqLwotc3RydWN0IG1hY291bnRlcgotewotCXUzMgkJY250OwkvKiBUb3RhbCBjb3VudCAqLwotCXVsb25nCQlhY2N1bTsJLyogQWN1dW11bGF0b3IgcGVyIHBlcmlvZCAqLwotCXVsb25nCQlzbWE7CS8qIFNpbXBsZSBtb3ZpbmcgYXZlcmFnZSAqLwotCXVsb25nCQllbWE7CS8qIEV4cG9uZW50aWFsIG1vdmluZyBhdmVyYWdlICovCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBEZXZpY2UgZmxhZyBkZWZpbml0aW9ucyBmb3IgYmRfZmxhZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZQlCRF9GRVA1UExVUwkweDAwMDEgICAgICAgICAgLyogU3VwcG9ydHMgRkVQNSBQbHVzIGNvbW1hbmRzICovCi0jZGVmaW5lIEJEX0hBU19WUEQJMHgwMDAyCQkvKiBCb2FyZCBoYXMgVlBEIGluZm8gYXZhaWxhYmxlICovCi0KLQotLyoKLSAqCVBlci1ib2FyZCBpbmZvcm1hdGlvbgotICovCi1zdHJ1Y3QgYm9hcmRfdAotewotCWludAkJbWFnaWM7CQkvKiBCb2FyZCBNYWdpYyBudW1iZXIuICAqLwotCWludAkJYm9hcmRudW07CS8qIEJvYXJkIG51bWJlcjogMC0zICovCi0JaW50CQlmaXJzdG1pbm9yOwkvKiBGaXJzdCBtaW5vciwgZS5nLiAwLCAzMCwgNjAgKi8KLQotCWludAkJdHlwZTsJCS8qIFR5cGUgb2YgYm9hcmQgKi8KLQljaGFyCQkqbmFtZTsJCS8qIFByb2R1Y3QgTmFtZSAqLwotCXN0cnVjdCBwY2lfZGV2CSpwZGV2OwkJLyogUG9pbnRlciB0byB0aGUgcGNpX2RldiBzdHJ1Y3QgKi8gCi0JdTE2CQl2ZW5kb3I7CQkvKiBQQ0kgdmVuZG9yIElEICovCi0JdTE2CQlkZXZpY2U7CQkvKiBQQ0kgZGV2aWNlIElEICovCi0JdTE2CQlzdWJ2ZW5kb3I7CS8qIFBDSSBzdWJzeXN0ZW0gdmVuZG9yIElEICovCi0JdTE2CQlzdWJkZXZpY2U7CS8qIFBDSSBzdWJzeXN0ZW0gZGV2aWNlIElEICovCi0JdWNoYXIJCXJldjsJCS8qIFBDSSByZXZpc2lvbiBJRCAqLwotCXVpbnQJCXBjaV9idXM7CS8qIFBDSSBidXMgdmFsdWUgKi8KLQl1aW50CQlwY2lfc2xvdDsJLyogUENJIHNsb3QgdmFsdWUgKi8KLQl1MTYJCW1heHBvcnRzOwkvKiBNQVggcG9ydHMgdGhpcyBib2FyZCBjYW4gaGFuZGxlICovCi0JdWNoYXIJCXZwZFtWUERTSVpFXTsJLyogVlBEIG9mIGJvYXJkLCBpZiBmb3VuZCAqLwotCXUzMgkJYmRfZmxhZ3M7CS8qIEJvYXJkIGZsYWdzICovCi0KLQlzcGlubG9ja190CWJkX2xvY2s7CS8qIFVzZWQgdG8gcHJvdGVjdCBib2FyZCAqLwotCi0JdTMyCQlzdGF0ZTsJCS8qIFN0YXRlIG9mIGNhcmQuICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgc3RhdGVfd2FpdDsJLyogUGxhY2UgdG8gc2xlZXAgb24gZm9yIHN0YXRlIGNoYW5nZSAqLwotCi0Jc3RydWN0CQl0YXNrbGV0X3N0cnVjdCBoZWxwZXJfdGFza2xldDsgLyogUG9sbCBoZWxwZXIgdGFza2xldCAqLwotCi0JdTMyCQl3YWl0X2Zvcl9iaW9zOwotCXUzMgkJd2FpdF9mb3JfZmVwOwotCi0Jc3RydWN0IGNub2RlICogIGJkX2NvbmZpZzsJLyogQ29uZmlnIG9mIGJvYXJkICovCi0KLQl1MTYJCW5hc3luYzsJCS8qIE51bWJlciBvZiBwb3J0cyBvbiBjYXJkICovCi0KLQl1MzIJCXVzZV9pbnRlcnJ1cHRzOwkvKiBTaG91bGQgd2UgYmUgaW50ZXJydXB0IGRyaXZlbj8gKi8KLQl1bG9uZwkJaXJxOwkJLyogSW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyICovCi0JdWxvbmcJCWludHJfY291bnQ7CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KLQl1MzIJCWludHJfdXNlZDsJLyogTm9uLXplcm8gaWYgdXNpbmcgaW50ZXJydXB0cyAqLwotCXUzMgkJaW50cl9ydW5uaW5nOwkvKiBOb24temVybyBpZiBGRVAga25vd3MgaXRzIGRvaW5nIGludGVycnVwdHMgKi8KLQotCXVsb25nCQlwb3J0OwkJLyogU3RhcnQgb2YgYmFzZSBpbyBwb3J0IG9mIHRoZSBjYXJkICovCi0JdWxvbmcJCXBvcnRfZW5kOwkvKiBFbmQgb2YgYmFzZSBpbyBwb3J0IG9mIHRoZSBjYXJkICovCi0JdWxvbmcJCW1lbWJhc2U7CS8qIFN0YXJ0IG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCi0JdWxvbmcJCW1lbWJhc2VfZW5kOwkvKiBFbmQgb2YgYmFzZSBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KLQotCXVjaGFyIAkJKnJlX21hcF9wb3J0OwkvKiBSZW1hcHBlZCBpbyBwb3J0IG9mIHRoZSBjYXJkICovCi0JdWNoYXIJCSpyZV9tYXBfbWVtYmFzZTsvKiBSZW1hcHBlZCBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KLQotCXVjaGFyCQlydW53YWl0OwkvKiAjIFByb2Nlc3NlcyB3YWl0aW5nIGZvciBGRVAgICovCi0JdWNoYXIJCWluaGliaXRfcG9sbGVyOyAvKiBUZWxscyAgdGhlIHBvbGxlciB0byBsZWF2ZSB1cyBhbG9uZSAqLwotCi0Jc3RydWN0IGNoYW5uZWxfdCAqY2hhbm5lbHNbTUFYUE9SVFNdOyAvKiBhcnJheSBvZiBwb2ludGVycyB0byBvdXIgY2hhbm5lbHMuICovCi0KLQlzdHJ1Y3QgdHR5X2RyaXZlcgkqU2VyaWFsRHJpdmVyOwotCWNoYXIJCVNlcmlhbE5hbWVbMjAwXTsKLQlzdHJ1Y3QgdHR5X2RyaXZlcgkqUHJpbnREcml2ZXI7Ci0JY2hhcgkJUHJpbnROYW1lWzIwMF07Ci0KLQl1MzIJCWRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQ7Ci0JdTMyCQlkZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZDsKLQotCXUzMgkJZGdhcF9TZXJpYWxfTWFqb3I7Ci0JdTMyCQlkZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3I7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjgpCi0JdTMyCQlUdHlSZWZDbnQ7Ci0jZW5kaWYKLQotCXN0cnVjdCBic190CSpiZF9iczsJCQkvKiBCYXNlIHN0cnVjdHVyZSBwb2ludGVyICAgICAgICovCi0KLQljaGFyCSpmbGlwYnVmOwkJLyogT3VyIGZsaXAgYnVmZmVyLCBhbGxvY2VkIGlmIGJvYXJkIGlzIGZvdW5kICovCi0JY2hhcgkqZmxpcGZsYWdidWY7CQkvKiBPdXIgZmxpcCBmbGFnIGJ1ZmZlciwgYWxsb2NlZCBpZiBib2FyZCBpcyBmb3VuZCAqLwotCi0JdTE2CQlkcGF0eXBlOwkvKiBUaGUgYm9hcmQgInR5cGUiLCBhcyBkZWZpbmVkIGJ5IERQQSAqLwotCXUxNgkJZHBhc3RhdHVzOwkvKiBUaGUgYm9hcmQgInN0YXR1cyIsIGFzIGRlZmluZWQgYnkgRFBBICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qga21lX3dhaXQ7CS8qIE5lZWRlZCBmb3IgRFBBIHN1cHBvcnQgKi8KLQotCXUzMgkJY29uY19kbF9zdGF0dXM7CS8qIFN0YXR1cyBvZiBhbnkgcGVuZGluZyBjb25jIGRvd25sb2FkICovCi0JLyoKLQkgKglNZ210IGRhdGEuCi0JICovCi0gICAgICAgIGNoYXIJCSptc2didWZfaGVhZDsKLSAgICAgICAgY2hhcgkJKm1zZ2J1ZjsKLX07Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogVW5pdCBmbGFnIGRlZmluaXRpb25zIGZvciB1bl9mbGFncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVOX0lTT1BFTgkweDAwMDEJCS8qIERldmljZSBpcyBvcGVuCQkqLwotI2RlZmluZSBVTl9DTE9TSU5HCTB4MDAwMgkJLyogTGluZSBpcyBiZWluZyBjbG9zZWQJCSovCi0jZGVmaW5lIFVOX0lNTQkJMHgwMDA0CQkvKiBTZXJ2aWNlIGltbWVkaWF0ZWx5CQkqLwotI2RlZmluZSBVTl9CVVNZCQkweDAwMDgJCS8qIFNvbWUgd29yayB0aGlzIGNoYW5uZWwJKi8KLSNkZWZpbmUgVU5fQlJFQUtJCTB4MDAxMAkJLyogSW5wdXQgYnJlYWsgcmVjZWl2ZWQJCSovCi0jZGVmaW5lIFVOX1BXQUlUCTB4MDAyMAkJLyogUHJpbnRlciB3YWl0aW5nIGZvciB0ZXJtaW5hbAkqLwotI2RlZmluZSBVTl9USU1FCQkweDAwNDAJCS8qIFdhaXRpbmcgb24gdGltZQkJKi8KLSNkZWZpbmUgVU5fRU1QVFkJMHgwMDgwCQkvKiBXYWl0aW5nIG91dHB1dCBxdWV1ZSBlbXB0eQkqLwotI2RlZmluZSBVTl9MT1cJCTB4MDEwMAkJLyogV2FpdGluZyBvdXRwdXQgbG93IHdhdGVyIG1hcmsqLwotI2RlZmluZSBVTl9FWENMX09QRU4JMHgwMjAwCQkvKiBPcGVuIGZvciBleGNsdXNpdmUgdXNlCSovCi0jZGVmaW5lIFVOX1dPUEVOCTB4MDQwMAkJLyogRGV2aWNlIHdhaXRpbmcgZm9yIG9wZW4JKi8KLSNkZWZpbmUgVU5fV0lPQ1RMCTB4MDgwMAkJLyogRGV2aWNlIHdhaXRpbmcgZm9yIG9wZW4JKi8KLSNkZWZpbmUgVU5fSEFOR1VQCTB4ODAwMAkJLyogQ2FycmllciBsb3N0CQkJKi8KLQotc3RydWN0IGRldmljZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlIGZvciB0ZXJtaW5hbCBvciBwcmludGVyIHVuaXQuIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCB1bl90IHsKLQlpbnQJbWFnaWM7CQkvKiBVbml0IE1hZ2ljIE51bWJlci4JCQkqLwotCXN0cnVjdAljaGFubmVsX3QgKnVuX2NoOwotCXUzMgl1bl90aW1lOwotCXUzMgl1bl90eXBlOwotCXUzMgl1bl9vcGVuX2NvdW50OwkvKiBDb3VudGVyIG9mIG9wZW5zIHRvIHBvcnQJCSovCi0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnVuX3R0eTsvKiBQb2ludGVyIHRvIHVuaXQgdHR5IHN0cnVjdHVyZQkqLwotCXUzMgl1bl9mbGFnczsJLyogVW5pdCBmbGFncwkJCQkqLwotCXdhaXRfcXVldWVfaGVhZF90IHVuX2ZsYWdzX3dhaXQ7IC8qIFBsYWNlIHRvIHNsZWVwIHRvIHdhaXQgb24gdW5pdCAqLwotCXUzMgl1bl9kZXY7CQkvKiBNaW5vciBkZXZpY2UgbnVtYmVyCQkJKi8KLQl0Y2ZsYWdfdCB1bl9vZmxhZzsJLyogb2ZsYWdzIGJlaW5nIGRvbmUgb24gYm9hcmQJCSovCi0JdGNmbGFnX3QgdW5fbGZsYWc7CS8qIGxmbGFncyBiZWluZyBkb25lIG9uIGJvYXJkCQkqLwotCXN0cnVjdCBkZXZpY2UgKnVuX3N5c2ZzOwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogRGV2aWNlIGZsYWcgZGVmaW5pdGlvbnMgZm9yIGNoX2ZsYWdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ0hfUFJPTiAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiBQcmludGVyIG9uIHN0cmluZyAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDSF9PVVQgICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIERpYWwtb3V0IGRldmljZSBvcGVuICAgICAgICAgICAgICovCi0jZGVmaW5lIENIX1NUT1AgICAgICAgICAweDAwMDQgICAgICAgICAgLyogT3V0cHV0IGlzIHN0b3BwZWQgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfU1RPUEkgICAgICAgIDB4MDAwOCAgICAgICAgICAvKiBJbnB1dCBpcyBzdG9wcGVkICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDSF9DRCAgICAgICAgICAgMHgwMDEwICAgICAgICAgIC8qIENhcnJpZXIgaXMgcHJlc2VudCAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENIX0ZDQVIgICAgICAgICAweDAwMjAgICAgICAgICAgLyogQ2FycmllciBmb3JjZWQgb24gICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBDSF9SWEJMT0NLICAgICAgMHgwMDgwICAgICAgICAgIC8qIEVuYWJsZSByeCBibG9ja2VkIGZsYWcgICAgICAgICAgICovCi0jZGVmaW5lIENIX1dMT1cgICAgICAgICAweDAxMDAgICAgICAgICAgLyogVGVybSB3YWl0aW5nIGxvdyBldmVudCAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfV0VNUFRZICAgICAgIDB4MDIwMCAgICAgICAgICAvKiBUZXJtIHdhaXRpbmcgZW1wdHkgZXZlbnQgICAgICAgICAqLwotI2RlZmluZSBDSF9SRU5BQkxFICAgICAgMHgwNDAwICAgICAgICAgIC8qIEJ1ZmZlciBqdXN0IGVtcHRpZWQgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfUkFDVElWRSAgICAgIDB4MDgwMCAgICAgICAgICAvKiBQcm9jZXNzIGFjdGl2ZSBpbiB4eHJlYWQoKSAgICovCi0jZGVmaW5lIENIX1JXQUlUICAgICAgICAweDEwMDAgICAgICAgICAgLyogUHJvY2VzcyB3YWl0aW5nIGluIHh4cmVhZCgpICAqLwotI2RlZmluZSBDSF9CQVVEMAkweDIwMDAJCS8qIFVzZWQgZm9yIGNoZWNraW5nIEIwIHRyYW5zaXRpb25zICovCi0jZGVmaW5lIENIX0hBTkdVUCAgICAgICAweDgwMDAJCS8qIEhhbmd1cCByZWNlaXZlZCAgICAgICAgICAgICAgICAgICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgY2hfc25pZmZfZmxhZ3MKLSAqLwotI2RlZmluZSBTTklGRl9PUEVOCTB4MQotI2RlZmluZSBTTklGRl9XQUlUX0RBVEEJMHgyCi0jZGVmaW5lIFNOSUZGX1dBSVRfU1BBQ0UgMHg0Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIENoYW5uZWwgaW5mb3JtYXRpb24gc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBjaGFubmVsX3QgewotCWludCBtYWdpYzsJCQkvKiBDaGFubmVsIE1hZ2ljIE51bWJlcgkJKi8KLQlzdHJ1Y3QgYnNfdAkqY2hfYnM7CQkvKiBCYXNlIHN0cnVjdHVyZSBwb2ludGVyICAgICAgICovCi0Jc3RydWN0IGNtX3QJKmNoX2NtOwkJLyogQ29tbWFuZCBxdWV1ZSBwb2ludGVyICAgICAgICAqLwotCXN0cnVjdCBib2FyZF90ICpjaF9iZDsJCS8qIEJvYXJkIHN0cnVjdHVyZSBwb2ludGVyICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyICpjaF92YWRkcjsJLyogRkVQIG1lbW9yeSBvcmlnaW4gICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgKmNoX3RhZGRyOwkvKiBXcml0ZSBidWZmZXIgb3JpZ2luICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciAqY2hfcmFkZHI7CS8qIFJlYWQgYnVmZmVyIG9yaWdpbiAgICAgICAgICAgKi8KLQlzdHJ1Y3QgZGlnaV90ICBjaF9kaWdpOwkJLyogVHJhbnNwYXJlbnQgUHJpbnQgc3RydWN0dXJlICAqLwotCXN0cnVjdCB1bl90IGNoX3R1bjsJCS8qIFRlcm1pbmFsIHVuaXQgaW5mbyAgICAgICAgICAgKi8KLQlzdHJ1Y3QgdW5fdCBjaF9wdW47CQkvKiBQcmludGVyIHVuaXQgaW5mbyAgICAgICAgICAgICovCi0KLQlzcGlubG9ja190CWNoX2xvY2s7CS8qIHByb3ZpZGUgZm9yIHNlcmlhbGl6YXRpb24gKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBjaF9mbGFnc193YWl0OwotCi0JdTMyCXBzY2FuX3N0YXRlOwotCXVjaGFyCXBzY2FuX3NhdmVjaGFyOwotCi0JdTMyIGNoX3BvcnRudW07CQkJLyogUG9ydCBudW1iZXIsIDAgb2Zmc2V0LgkqLwotCXUzMiBjaF9vcGVuX2NvdW50OwkJLyogb3BlbiBjb3VudAkJCSovCi0JdTMyCWNoX2ZsYWdzOwkJLyogQ2hhbm5lbCBmbGFncyAgICAgICAgICAgICAgICAqLwotCi0KLQl1MzIJY2hfY2xvc2VfZGVsYXk7CQkvKiBIb3cgbG9uZyB3ZSBzaG91bGQgZHJvcCBSVFMvRFRSIGZvciAqLwotCi0JdTMyCWNoX2Nwc3RpbWU7CQkvKiBUaW1lIGZvciBDUFMgY2FsY3VsYXRpb25zICAgICovCi0KLQl0Y2ZsYWdfdCBjaF9jX2lmbGFnOwkJLyogY2hhbm5lbCBpZmxhZ3MgICAgICAgICAgICAgICAqLwotCXRjZmxhZ190IGNoX2NfY2ZsYWc7CQkvKiBjaGFubmVsIGNmbGFncyAgICAgICAgICAgICAgICovCi0JdGNmbGFnX3QgY2hfY19vZmxhZzsJCS8qIGNoYW5uZWwgb2ZsYWdzICAgICAgICAgICAgICAgKi8KLQl0Y2ZsYWdfdCBjaF9jX2xmbGFnOwkJLyogY2hhbm5lbCBsZmxhZ3MgICAgICAgICAgICAgICAqLwotCi0JdTE2ICBjaF9mZXBpZmxhZzsgICAgICAgICAgICAvKiBGRVAgdHR5IGlmbGFncyAgICAgICAgICAgICAgICovCi0JdTE2ICBjaF9mZXBjZmxhZzsJCS8qIEZFUCB0dHkgY2ZsYWdzICAgICAgICAgICAgICAgKi8KLQl1MTYgIGNoX2ZlcG9mbGFnOwkJLyogRkVQIHR0eSBvZmxhZ3MgICAgICAgICAgICAgICAqLwotCXUxNiAgY2hfd29wZW47CQkJLyogV2FpdGluZyBmb3Igb3BlbiBwcm9jZXNzIGNudCAqLwotCXUxNiAgY2hfdHN0YXJ0OwkJCS8qIFRyYW5zbWl0IGJ1ZmZlciBzdGFydCAgICAgICAgKi8KLQl1MTYgIGNoX3RzaXplOwkJCS8qIFRyYW5zbWl0IGJ1ZmZlciBzaXplICAgICAgICAgKi8KLQl1MTYgIGNoX3JzdGFydDsJCQkvKiBSZWNlaXZlIGJ1ZmZlciBzdGFydCAgICAgICAgICovCi0JdTE2ICBjaF9yc2l6ZTsJCQkvKiBSZWNlaXZlIGJ1ZmZlciBzaXplICAgICAgICAgICovCi0JdTE2ICBjaF9yZGVsYXk7CQkJLyogUmVjZWl2ZSBkZWxheSB0aW1lICAgICAgICAgICAqLwotCi0JdTE2CWNoX3RsdzsJCQkvKiBPdXIgY3VycmVudGx5IHNldCBsb3cgd2F0ZXIgbWFyayAqLwotCi0JdTE2ICBjaF9jb29rOwkJCS8qIE91dHB1dCBjaGFyYWN0ZXIgbWFzayAgICAgICAgKi8KLQotCXVjaGFyICAgY2hfY2FyZDsJCS8qIENhcmQgY2hhbm5lbCBpcyBvbiAgICAgICAgICAgKi8KLQl1Y2hhciAgIGNoX3N0b3BjOwkJLyogU3RvcCBjaGFyYWN0ZXIgICAgICAgICAgICAgICAqLwotCXVjaGFyICAgY2hfc3RhcnRjOwkJLyogU3RhcnQgY2hhcmFjdGVyICAgICAgICAgICAgICAqLwotCi0JdWNoYXIgICBjaF9tb3N0YXQ7CQkvKiBGRVAgb3V0cHV0IG1vZGVtIHN0YXR1cyAgICAgICovCi0JdWNoYXIgICBjaF9taXN0YXQ7CQkvKiBGRVAgaW5wdXQgbW9kZW0gc3RhdHVzICAgICAgICovCi0JdWNoYXIgICBjaF9tZm9yY2U7CQkvKiBNb2RlbSB2YWx1ZXMgdG8gYmUgZm9yY2VkICAgICovCi0JdWNoYXIgICBjaF9tdmFsOwkJLyogRm9yY2UgdmFsdWVzICAgICAgICAgICAgICAgICAqLwotCXVjaGFyICAgY2hfZmVwc3RvcGM7CQkvKiBGRVAgc3RvcCBjaGFyYWN0ZXIgICAgICAgICAgICovCi0JdWNoYXIgICBjaF9mZXBzdGFydGM7CQkvKiBGRVAgc3RhcnQgY2hhcmFjdGVyICAgICAgICAgICovCi0KLQl1Y2hhciAgIGNoX2FzdG9wYzsJCS8qIEF1eGlsaWFyeSBTdG9wIGNoYXJhY3RlciAgICAgKi8KLQl1Y2hhciAgIGNoX2FzdGFydGM7CQkvKiBBdXhpbGlhcnkgU3RhcnQgY2hhcmFjdGVyICAgICovCi0JdWNoYXIgICBjaF9mZXBhc3RvcGM7CQkvKiBBdXhpbGlhcnkgRkVQIHN0b3AgY2hhciAgICAgICovCi0JdWNoYXIgICBjaF9mZXBhc3RhcnRjOwkJLyogQXV4aWxpYXJ5IEZFUCBzdGFydCBjaGFyICAgICAqLwotCi0JdWNoYXIgICBjaF9oZmxvdzsJCS8qIEZFUCBoYXJkd2FyZSBoYW5kc2hha2UgICAgICAgKi8KLQl1Y2hhciAgIGNoX2RzcjsJCQkvKiBzdG9yZXMgcmVhbCBkc3IgdmFsdWUgICAgICAgICovCi0JdWNoYXIgICBjaF9jZDsJCQkvKiBzdG9yZXMgcmVhbCBjZCB2YWx1ZSAgICAgICAgICovCi0JdWNoYXIgICBjaF90eF93aW47CQkvKiBjaGFubmVsIHR4IGJ1ZmZlciB3aW5kb3cgICAgICovCi0JdWNoYXIgICBjaF9yeF93aW47CQkvKiBjaGFubmVsIHJ4IGJ1ZmZlciB3aW5kb3cgICAgICovCi0JdWludAljaF9jdXN0b21fc3BlZWQ7CS8qIEN1c3RvbSBiYXVkLCBpZiBzZXQJCSovCi0JdWludAljaF9iYXVkX2luZm87CQkvKiBDdXJyZW50IGJhdWQgaW5mbyBmb3IgL3Byb2Mgb3V0cHV0CSovCi0JdWxvbmcJY2hfcnhjb3VudDsJCS8qIHRvdGFsIG9mIGRhdGEgcmVjZWl2ZWQgc28gZmFyCSovCi0JdWxvbmcJY2hfdHhjb3VudDsJCS8qIHRvdGFsIG9mIGRhdGEgdHJhbnNtaXR0ZWQgc28gZmFyCSovCi0JdWxvbmcJY2hfZXJyX3Bhcml0eTsJCS8qIENvdW50IG9mIHBhcml0eSBlcnJvcnMgb24gY2hhbm5lbAkqLwotCXVsb25nCWNoX2Vycl9mcmFtZTsJCS8qIENvdW50IG9mIGZyYW1pbmcgZXJyb3JzIG9uIGNoYW5uZWwJKi8KLQl1bG9uZwljaF9lcnJfYnJlYWs7CQkvKiBDb3VudCBvZiBicmVha3Mgb24gY2hhbm5lbAkqLwotCXVsb25nCWNoX2Vycl9vdmVycnVuOwkJLyogQ291bnQgb2Ygb3ZlcnJ1bnMgb24gY2hhbm5lbAkqLwotCi0JdWludCBjaF9zbmlmZl9pbjsKLQl1aW50IGNoX3NuaWZmX291dDsKLQljaGFyICpjaF9zbmlmZl9idWY7CQkvKiBTbmlmZiBidWZmZXIgZm9yIHByb2MgKi8KLQl1bG9uZyBjaF9zbmlmZl9mbGFnczsJCS8qIENoYW5uZWwgZmxhZ3MgICAgICAgICAgICAgICAgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBjaF9zbmlmZl93YWl0OwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFByb3RvdHlwZXMgZm9yIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBtb2R1bGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIGludAkJZGdhcF9tc19zbGVlcCh1bG9uZyBtcyk7Ci1leHRlcm4gY2hhcgkJKmRnYXBfaW9jdGxfbmFtZShpbnQgY21kKTsKLWV4dGVybiB2b2lkCQlkZ2FwX2RvX2Jpb3NfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciBfX3VzZXIgKnViaW9zLCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkCQlkZ2FwX2RvX2ZlcF9sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIHVjaGFyIF9fdXNlciAqdWZlcCwgaW50IGxlbik7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19jb25jX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgKnVhZGRyLCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkCQlkZ2FwX2RvX2NvbmZpZ19sb2FkKHVjaGFyIF9fdXNlciAqdWFkZHIsIGludCBsZW4pOwotZXh0ZXJuIGludAkJZGdhcF9hZnRlcl9jb25maWdfbG9hZGVkKHZvaWQpOwotZXh0ZXJuIGludAkJZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpOwotCi0vKgotICogT3VyIEdsb2JhbCBWYXJpYWJsZXMuCi0gKi8KLWV4dGVybiBpbnQJCWRnYXBfZHJpdmVyX3N0YXRlOwkvKiBUaGUgc3RhdGUgb2YgdGhlIGRyaXZlcgkqLwotZXh0ZXJuIGludAkJZGdhcF9kZWJ1ZzsJCS8qIERlYnVnIHZhcmlhYmxlCQkqLwotZXh0ZXJuIGludAkJZGdhcF9yYXdyZWFkb2s7CQkvKiBTZXQgaWYgdXNlciB3YW50cyByYXdyZWFkcwkqLwotZXh0ZXJuIGludAkJZGdhcF9wb2xsX3RpY2s7CQkvKiBQb2xsIGludGVydmFsIC0gMjAgbXMJKi8KLWV4dGVybiBzcGlubG9ja190CWRnYXBfZ2xvYmFsX2xvY2s7CS8qIERyaXZlciBnbG9iYWwgc3BpbmxvY2sJKi8KLWV4dGVybiB1aW50CQlkZ2FwX051bUJvYXJkczsJCS8qIFRvdGFsIG51bWJlciBvZiBib2FyZHMJKi8KLWV4dGVybiBzdHJ1Y3QgYm9hcmRfdAkqZGdhcF9Cb2FyZFtNQVhCT0FSRFNdOwkvKiBBcnJheSBvZiBib2FyZCBzdHJ1Y3RzCSovCi1leHRlcm4gdWxvbmcJCWRnYXBfcG9sbF9jb3VudGVyOwkvKiBUaW1lcyB0aGUgcG9sbGVyIGhhcyBydW4JKi8KLWV4dGVybiBjaGFyCQkqZGdhcF9jb25maWdfYnVmOwkvKiBUaGUgY29uZmlnIGZpbGUgYnVmZmVyCSovCi1leHRlcm4gc3BpbmxvY2tfdAlkZ2FwX2RsX2xvY2s7CQkvKiBEb3dubG9hZGVyIHNwaW5sb2NrCQkqLwotZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGRnYXBfZGxfd2FpdDsJCS8qIFdhaXQgcXVldWUgZm9yIGRvd25sb2FkZXIJKi8KLWV4dGVybiBpbnQJCWRnYXBfZGxfYWN0aW9uOwkJLyogQWN0aW9uIGZsYWcgZm9yIGRvd25sb2FkZXIJKi8KLWV4dGVybiBpbnQJCWRnYXBfcmVnaXN0ZXJ0dHlzd2l0aHN5c2ZzOyAvKiBTaG91bGQgd2UgcmVnaXN0ZXIgdGhlCSovCi0JCQkJCQkgICAgLyogdHR5cyB3aXRoIHN5c2ZzIG9yIG5vdAkqLwotCi0vKgotICogR2xvYmFsIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiBkZ2FwX2ZlcDUuYywgYnV0IG11c3QgYmUgaGlkZGVuIGZyb20KLSAqIHVzZXIgc3BhY2UgcHJvZ3JhbXMuCi0gKi8KLWV4dGVybiB2b2lkCWRnYXBfcG9sbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7IAotZXh0ZXJuIHZvaWQJZGdhcF9jbWRiKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1Y2hhciBjbWQsIHVjaGFyIGJ5dGUxLCB1Y2hhciBieXRlMiwgdWludCBuY21kcyk7Ci1leHRlcm4gdm9pZAlkZ2FwX2NtZHcoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpOwotZXh0ZXJuIHZvaWQJZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCk7Ci1leHRlcm4gaW50CWRnYXBfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1leHRlcm4gdm9pZAlkZ2FwX3Bhcml0eV9zY2FuKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyICpjYnVmLCB1bnNpZ25lZCBjaGFyICpmYnVmLCBpbnQgKmxlbik7Ci1leHRlcm4gdWludAlkZ2FwX2dldF9jdXN0b21fYmF1ZChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1leHRlcm4gdm9pZAlkZ2FwX2Zpcm13YXJlX3Jlc2V0X3BvcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTgzMWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICoJVGhhbmsgeW91LgotICoKLSAqICRJZDogZGdhcF9mZXA1LmMsdiAxLjIgMjAxMS8wNi8yMSAxMDozNTo0MCBtYXJraCBFeHAgJAotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBGb3IgdWRlbGF5ICovCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogRm9yIGNvcHlfZnJvbV91c2VyL2NvcHlfdG9fdXNlciAqLwotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CS8qIEZvciB0dHlfc2NoZWR1bGVfZmxpcCAqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzkpCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLSNpbmNsdWRlICJkZ2FwX3BjaS5oIgotI2luY2x1ZGUgImRnYXBfZmVwNS5oIgotI2luY2x1ZGUgImRnYXBfdHR5LmgiCi0jaW5jbHVkZSAiZGdhcF9jb25mLmgiCi0jaW5jbHVkZSAiZGdhcF9wYXJzZS5oIgotI2luY2x1ZGUgImRnYXBfdHJhY2UuaCIKLQotLyoKLSAqIE91ciBmdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfY21kd19leHQoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHUxNiBjbWQsIHUxNiB3b3JkLCB1aW50IG5jbWRzKTsKLXN0YXRpYyBpbnQgZGdhcF9ldmVudChzdHJ1Y3QgYm9hcmRfdCAqYmQpOwotCi0vKgotICogaW50ZXJuYWwgdmFyaWFibGVzCi0gKi8KLXN0YXRpYyB1aW50IGRnYXBfY291bnQgPSA1MDA7Ci0KLQotLyoKLSAqIExvYWRzIHRoZSBkZ2FwLmNvbmYgY29uZmlnIGZpbGUgZnJvbSB0aGUgdXNlci4KLSAqLwotdm9pZCBkZ2FwX2RvX2NvbmZpZ19sb2FkKHVjaGFyIF9fdXNlciAqdWFkZHIsIGludCBsZW4pCi17Ci0JaW50IG9yaWdfbGVuID0gbGVuOwotCWNoYXIgKnRvX2FkZHI7Ci0JdWNoYXIgX191c2VyICpmcm9tX2FkZHIgPSB1YWRkcjsKLQljaGFyIGJ1ZltVMkJTSVpFXTsKLQlpbnQgbjsKLQotCXRvX2FkZHIgPSBkZ2FwX2NvbmZpZ19idWYgPSBremFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOwotCWlmICghZGdhcF9jb25maWdfYnVmKSB7Ci0JCURQUl9JTklUKCgiZGdhcF9kb19jb25maWdfbG9hZCAtIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZpbGVcbiIpKTsKLQkJZGdhcF9kcml2ZXJfc3RhdGUgPSBEUklWRVJfTkVFRF9DT05GSUdfTE9BRDsKLQkJcmV0dXJuOwotCX0KLQotCW4gPSBVMkJTSVpFOwotCXdoaWxlIChsZW4pIHsKLQotCQlpZiAobiA+IGxlbikKLQkJCW4gPSBsZW47Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZidWYsIGZyb21fYWRkciwgbikgPT0gLTEgKQotCQkJcmV0dXJuOwotCi0JCS8qIENvcHkgZGF0YSBmcm9tIGJ1ZmZlciB0byBrZXJuZWwgbWVtb3J5ICovCi0JCW1lbWNweSh0b19hZGRyLCBidWYsIG4pOwotCi0JCS8qIGluY3JlbWVudCBjb3VudHMgKi8KLQkJbGVuIC09IG47Ci0JCXRvX2FkZHIgKz0gbjsKLQkJZnJvbV9hZGRyICs9IG47Ci0JCW4gPSBVMkJTSVpFOwotCX0KLQotCWRnYXBfY29uZmlnX2J1ZltvcmlnX2xlbl0gPSAnXDAnOwotCi0JdG9fYWRkciA9IGRnYXBfY29uZmlnX2J1ZjsKLQlkZ2FwX3BhcnNlZmlsZSgmdG9fYWRkciwgVFJVRSk7Ci0KLQlEUFJfSU5JVCgoImRnYXBfY29uZmlnX2xvYWQoKSBmaW5pc2hcbiIpKTsKLQotCXJldHVybjsKLX0KLQotCi1pbnQgZGdhcF9hZnRlcl9jb25maWdfbG9hZGVkKHZvaWQpCi17Ci0JaW50IGkgPSAwOwotCWludCByYyA9IDA7Ci0KLQkvKgotCSAqIFJlZ2lzdGVyIG91ciB0dHlzLCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBjb25maWcgbG9hZGVkLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBkZ2FwX051bUJvYXJkczsgKytpKSB7Ci0KLQkJLyoKLQkJICogSW5pdGlhbGl6ZSBLTUUgd2FpdHF1ZXVlcy4uLgotCQkgKi8KLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmKGRnYXBfQm9hcmRbaV0tPmttZV93YWl0KSk7Ci0KLQkJLyoKLQkJICogYWxsb2NhdGUgZmxpcCBidWZmZXIgZm9yIGJvYXJkLgotCQkgKi8KLQkJZGdhcF9Cb2FyZFtpXS0+ZmxpcGJ1ZiA9IGt6YWxsb2MoTVlGTElQTEVOLCBHRlBfQVRPTUlDKTsKLQkJZGdhcF9Cb2FyZFtpXS0+ZmxpcGZsYWdidWYgPSBremFsbG9jKE1ZRkxJUExFTiwgR0ZQX0FUT01JQyk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgdXNlcnRvYm9hcmQgLSBjb3B5IGZyb20gdXNlciBzcGFjZSB0byBib2FyZCBzcGFjZS4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgZGdhcF91c2VydG9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjaGFyICp0b19hZGRyLCBjaGFyIF9fdXNlciAqZnJvbV9hZGRyLCBpbnQgbGVuKQotewotCWNoYXIgYnVmW1UyQlNJWkVdOwotCWludCBuID0gVTJCU0laRTsKLQotCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl3aGlsZSAobGVuKSB7Ci0JCWlmIChuID4gbGVuKQotCQkJbiA9IGxlbjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKikgJmJ1ZiwgZnJvbV9hZGRyLCBuKSA9PSAtMSApIHsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJLyogQ29weSBkYXRhIGZyb20gYnVmZmVyIHRvIGNhcmQgbWVtb3J5ICovCi0JCW1lbWNweV90b2lvKHRvX2FkZHIsIGJ1Ziwgbik7Ci0KLQkJLyogaW5jcmVtZW50IGNvdW50cyAqLwotCQlsZW4gLT0gbjsKLQkJdG9fYWRkciArPSBuOwotCQlmcm9tX2FkZHIgKz0gbjsKLQkJbiA9IFUyQlNJWkU7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBDb3BpZXMgdGhlIEJJT1MgY29kZSBmcm9tIHRoZSB1c2VyIHRvIHRoZSBib2FyZCwKLSAqIGFuZCBzdGFydHMgdGhlIEJJT1MgcnVubmluZy4KLSAqLwotdm9pZCBkZ2FwX2RvX2Jpb3NfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciBfX3VzZXIgKnViaW9zLCBpbnQgbGVuKQotewotCXVjaGFyICphZGRyOwotCXVpbnQgb2Zmc2V0OwotCWludCBpOwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCURQUl9JTklUKCgiZGdhcF9kb19iaW9zX2xvYWQoKSBzdGFydFxuIikpOwotCi0JYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQkvKgotCSAqIGNsZWFyIFBPU1QgYXJlYQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl3cml0ZWIoMCwgYWRkciArIFBPU1RBUkVBICsgaSk7Ci0KLQkvKgotCSAqIERvd25sb2FkIGJpb3MKLQkgKi8KLQlvZmZzZXQgPSAweDEwMDA7Ci0JaWYgKGRnYXBfdXNlcnRvYm9hcmQoYnJkLCBhZGRyICsgb2Zmc2V0LCB1YmlvcywgbGVuKSA9PSAtMSApIHsKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKLQkJcmV0dXJuOwotCX0KLQotCXdyaXRlbCgweDBiZjAwNDAxLCBhZGRyKTsKLQl3cml0ZWwoMCwgKGFkZHIgKyA0KSk7Ci0KLQkvKiBDbGVhciB0aGUgcmVzZXQsIGFuZCBjaGFuZ2Ugc3RhdGVzLiAqLwotCXdyaXRlYihGRVBDTFIsIGJyZC0+cmVfbWFwX3BvcnQpOwotCWJyZC0+c3RhdGUgPSBXQUlUX0JJT1NfTE9BRDsKLX0KLQotCi0vKgotICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgQklPUyBjb21wbGV0ZWQgcnVubmluZyBvbiB0aGUgY2FyZC4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9kb193YWl0X2Zvcl9iaW9zKHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JdWNoYXIgKmFkZHI7Ci0JdTE2IHdvcmQ7Ci0KLQlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKLQkJcmV0dXJuOwotCi0JYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0Jd29yZCA9IHJlYWR3KGFkZHIgKyBQT1NUQVJFQSk7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgQklPUyB0aGlua3MgYm9hcmQgaXMgZ29vZC4gKEdEKS4gKi8KLQlpZiAod29yZCA9PSAqKHUxNiAqKSAiR0QiKSB7Ci0JCURQUl9JTklUKCgiR09UIEdEIGluIG1lbW9yeSwgbW92aW5nIHN0YXRlcy5cbiIpKTsKLQkJYnJkLT5zdGF0ZSA9IEZJTklTSEVEX0JJT1NfTE9BRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEdpdmUgdXAgb24gYm9hcmQgYWZ0ZXIgdG9vIGxvbmcgb2YgdGltZSB0YWtlbiAqLwotCWlmIChicmQtPndhaXRfZm9yX2Jpb3MrKyA+IDUwMDApIHsKLQkJdTE2IGVycjEgPSByZWFkdyhhZGRyICsgU0VRVUVOQ0UpOwotCQl1MTYgZXJyMiA9IHJlYWR3KGFkZHIgKyBFUlJPUik7Ci0JCUFQUigoIioqKldBUk5JTkcqKiogJXMgZmFpbGVkIGRpYWdub3N0aWNzLiAgRXJyb3IgIygleCwleCkuXG4iLAotCQkJYnJkLT5uYW1lLCBlcnIxLCBlcnIyKSk7Ci0JCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JfQotfQotCi0KLS8qCi0gKiBDb3BpZXMgdGhlIEZFUCBjb2RlIGZyb20gdGhlIHVzZXIgdG8gdGhlIGJvYXJkLAotICogYW5kIHN0YXJ0cyB0aGUgRkVQIHJ1bm5pbmcuCi0gKi8KLXZvaWQgZGdhcF9kb19mZXBfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciBfX3VzZXIgKnVmZXAsIGludCBsZW4pCi17Ci0JdWNoYXIgKmFkZHI7Ci0JdWludCBvZmZzZXQ7Ci0KLQlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKLQkJcmV0dXJuOwotCi0JYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fZmVwX2xvYWQoKSBmb3IgYm9hcmQgJXMgOiBzdGFydFxuIiwgYnJkLT5uYW1lKSk7Ci0KLQkvKgotCSAqIERvd25sb2FkIEZFUAotCSAqLwotCW9mZnNldCA9IDB4MTAwMDsKLQlpZiAoZGdhcF91c2VydG9ib2FyZChicmQsIGFkZHIgKyBvZmZzZXQsIHVmZXAsIGxlbikgPT0gLTEgKSB7Ci0JCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIGJvYXJkIGlzIGEgY29uY2VudHJhdG9yIHByb2R1Y3QsIHdlIG5lZWQgdG8gZ2l2ZQotCSAqIGl0IGl0cyBjb25maWcgc3RyaW5nIGRlc2NyaWJpbmcgaG93IHRoZSBjb25jZW50cmF0b3JzIGxvb2suCi0JICovCi0JaWYgKChicmQtPnR5cGUgPT0gUENYKSB8fCAoYnJkLT50eXBlID09IFBFUEMpKSB7Ci0JCXVjaGFyIHN0cmluZ1sxMDBdOwotCQl1Y2hhciAqY29uZmlnLCAqeGNvbmZpZzsKLQkJaW50IGkgPSAwOwotCi0JCXhjb25maWcgPSBkZ2FwX2NyZWF0ZV9jb25maWdfc3RyaW5nKGJyZCwgc3RyaW5nKTsKLQotCQkvKiBXcml0ZSBzdHJpbmcgdG8gYm9hcmQgbWVtb3J5ICovCi0JCWNvbmZpZyA9IGFkZHIgKyBDT05GSUc7Ci0JCWZvciAoOyBpIDwgQ09ORklHU0laRTsgaSsrLCBjb25maWcrKywgeGNvbmZpZysrKSB7Ci0JCQl3cml0ZWIoKnhjb25maWcsIGNvbmZpZyk7Ci0JCQlpZiAoKCp4Y29uZmlnICYgMHhmZikgPT0gMHhmZikKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXdyaXRlbCgweGJmYzAxMDA0LCAoYWRkciArIDB4YzM0KSk7Ci0Jd3JpdGVsKDB4MywgKGFkZHIgKyAweGMzMCkpOwotCi0JLyogY2hhbmdlIHN0YXRlcy4gKi8KLQlicmQtPnN0YXRlID0gV0FJVF9GRVBfTE9BRDsKLQotCURQUl9JTklUKCgiZGdhcF9kb19mZXBfbG9hZCgpIGZvciBib2FyZCAlcyA6IGZpbmlzaFxuIiwgYnJkLT5uYW1lKSk7Ci0KLX0KLQotCi0vKgotICogV2FpdHMgZm9yIHRoZSBGRVAgdG8gcmVwb3J0IHRoYXRzIGl0cyByZWFkeSBmb3IgdXMgdG8gdXNlLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2RvX3dhaXRfZm9yX2ZlcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCXVjaGFyICphZGRyOwotCXUxNiB3b3JkOwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCi0JRFBSX0lOSVQoKCJkZ2FwX2RvX3dhaXRfZm9yX2ZlcCgpIGZvciBib2FyZCAlcyA6IHN0YXJ0LiBhZGRyOiAlcFxuIiwgYnJkLT5uYW1lLCBhZGRyKSk7Ci0KLQl3b3JkID0gcmVhZHcoYWRkciArIEZFUFNUQVQpOwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIEZFUCBpcyB1cCBhbmQgcnVubmluZyBub3cuICovCi0JaWYgKHdvcmQgPT0gKih1MTYgKikgIk9TIikgewotCQlEUFJfSU5JVCgoIkdPVCBPUyBpbiBtZW1vcnkgZm9yIGJvYXJkICVzLCBtb3Zpbmcgc3RhdGVzLlxuIiwgYnJkLT5uYW1lKSk7Ci0JCWJyZC0+c3RhdGUgPSBGSU5JU0hFRF9GRVBfTE9BRDsKLQotCQkvKgotCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIGNhbiBzdXBwb3J0IEZFUDUrIGNvbW1hbmRzLgotCQkgKi8KLQkJd29yZCA9IHJlYWR3KGFkZHIgKyBGRVA1X1BMVVMpOwotCQlpZiAod29yZCA9PSAqKHUxNiAqKSAiNUEiKSB7Ci0JCQlEUFJfSU5JVCgoIkdPVCA1QSBpbiBtZW1vcnkgZm9yIGJvYXJkICVzLCBib2FyZCBzdXBwb3J0cyBleHRlbmRlZCBGRVA1IGNvbW1hbmRzLlxuIiwgYnJkLT5uYW1lKSk7Ci0JCQlicmQtPmJkX2ZsYWdzIHw9IEJEX0ZFUDVQTFVTOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qIEdpdmUgdXAgb24gYm9hcmQgYWZ0ZXIgdG9vIGxvbmcgb2YgdGltZSB0YWtlbiAqLwotCWlmIChicmQtPndhaXRfZm9yX2ZlcCsrID4gNTAwMCkgewotCQl1MTYgZXJyMSA9IHJlYWR3KGFkZHIgKyBTRVFVRU5DRSk7Ci0JCXUxNiBlcnIyID0gcmVhZHcoYWRkciArIEVSUk9SKTsKLQkJQVBSKCgiKioqV0FSTklORyoqKiBGRVBPUyBmb3IgJXMgbm90IGZ1bmN0aW9uaW5nLiAgRXJyb3IgIygleCwleCkuXG4iLAotCQkJYnJkLT5uYW1lLCBlcnIxLCBlcnIyKSk7Ci0JCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JfQotCi0JRFBSX0lOSVQoKCJkZ2FwX2RvX3dhaXRfZm9yX2ZlcCgpIGZvciBib2FyZCAlcyA6IGZpbmlzaFxuIiwgYnJkLT5uYW1lKSk7Ci19Ci0KLQotLyoKLSAqIFBoeXNpY2FsbHkgZm9yY2VzIHRoZSBGRVA1IGNhcmQgdG8gcmVzZXQgaXRzZWxmLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2RvX3Jlc2V0X2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JdWNoYXIgY2hlY2s7Ci0JdTMyIGNoZWNrMTsKLQl1MzIgY2hlY2syOwotCWludCBpID0gMDsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlIHx8ICFicmQtPnJlX21hcF9wb3J0KSB7Ci0JCURQUl9JTklUKCgiZGdhcF9kb19yZXNldF9ib2FyZCgpIHN0YXJ0LiBiYWQgdmFsdWVzLiBicmQ6ICVwIG1lbTogJXAgaW86ICVwXG4iLAotCQkJYnJkLCBicmQgPyBicmQtPnJlX21hcF9tZW1iYXNlIDogMCwgYnJkID8gYnJkLT5yZV9tYXBfcG9ydCA6IDApKTsKLQkJcmV0dXJuOwotCX0KLQotCURQUl9JTklUKCgiZGdhcF9kb19yZXNldF9ib2FyZCgpIHN0YXJ0LiBpbzogJXBcbiIsIGJyZC0+cmVfbWFwX3BvcnQpKTsKLQotCS8qIEZFUFJTVCBkb2VzIG5vdCB2YXJ5IGFtb25nIHN1cHBvcnRlZCBib2FyZHMgKi8KLQl3cml0ZWIoRkVQUlNULCBicmQtPnJlX21hcF9wb3J0KTsKLQotCWZvciAoaSA9IDA7IGkgPD0gMTAwMDsgaSsrKSB7Ci0JCWNoZWNrID0gcmVhZGIoYnJkLT5yZV9tYXBfcG9ydCkgJiAweGU7Ci0JCWlmIChjaGVjayA9PSBGRVBSU1QpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwKTsKLQotCX0KLQlpZiAoaSA+IDEwMDApIHsKLQkJQVBSKCgiKioqIFdBUk5JTkcgKioqIEJvYXJkIG5vdCByZXNldHRpbmcuLi4gIEZhaWxpbmcgYm9hcmQuXG4iKSk7Ci0JCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIHRoZXJlIHJlYWxseSBpcyBtZW1vcnkgb3V0IHRoZXJlLgotCSAqLwotCXdyaXRlbCgweGE1NWEzY2MzLCAoYnJkLT5yZV9tYXBfbWVtYmFzZSArIExPV01FTSkpOwotCXdyaXRlbCgweDVhYTVjMzNjLCAoYnJkLT5yZV9tYXBfbWVtYmFzZSArIEhJR0hNRU0pKTsKLQljaGVjazEgPSByZWFkbChicmQtPnJlX21hcF9tZW1iYXNlICsgTE9XTUVNKTsKLQljaGVjazIgPSByZWFkbChicmQtPnJlX21hcF9tZW1iYXNlICsgSElHSE1FTSk7Ci0KLQlpZiAoKGNoZWNrMSAhPSAweGE1NWEzY2MzKSB8fCAoY2hlY2syICE9IDB4NWFhNWMzM2MpKSB7Ci0JCUFQUigoIioqKiBXYXJuaW5nICoqKiBObyBtZW1vcnkgYXQgJXAgZm9yIGJvYXJkLlxuIiwgYnJkLT5yZV9tYXBfbWVtYmFzZSkpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAoYnJkLT5zdGF0ZSAhPSBCT0FSRF9GQUlMRUQpCi0JCWJyZC0+c3RhdGUgPSBGSU5JU0hFRF9SRVNFVDsKLQotZmFpbGVkOgotCURQUl9JTklUKCgiZGdhcF9kb19yZXNldF9ib2FyZCgpIGZpbmlzaFxuIikpOwotfQotCi0KLS8qCi0gKiBTZW5kcyBhIGNvbmNlbnRyYXRvciBpbWFnZSBpbnRvIHRoZSBGRVA1IGJvYXJkLgotICovCi12b2lkIGRnYXBfZG9fY29uY19sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIHVjaGFyICp1YWRkciwgaW50IGxlbikKLXsKLQljaGFyICp2YWRkcjsKLQl1MTYgb2Zmc2V0ID0gMDsKLQlzdHJ1Y3QgZG93bmxkX3QgKnRvX2RwOwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCXZhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCW9mZnNldCA9IHJlYWR3KCh1MTYgKikgKHZhZGRyICsgRE9XTlJFUSkpOwotCXRvX2RwID0gKHN0cnVjdCBkb3dubGRfdCAqKSAodmFkZHIgKyAoaW50KSBvZmZzZXQpOwotCi0JLyoKLQkgKiBUaGUgaW1hZ2Ugd2FzIGFscmVhZHkgcmVhZCBpbnRvIGtlcm5lbCBzcGFjZSwKLQkgKiB3ZSBkbyBOT1QgbmVlZCBhIHVzZXIgc3BhY2UgcmVhZCBoZXJlCi0JICovCi0JbWVtY3B5X3RvaW8oKGNoYXIgKikgdG9fZHAsIHVhZGRyLCBzaXplb2Yoc3RydWN0IGRvd25sZF90KSk7Ci0KLQkvKiBUZWxsIGNhcmQgd2UgaGF2ZSBkYXRhIGZvciBpdCAqLwotCXdyaXRldygwLCB2YWRkciArIChET1dOUkVRKSk7Ci0KLQlicmQtPmNvbmNfZGxfc3RhdHVzID0gTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFM7Ci19Ci0KLQotI2RlZmluZSBFWFBBTlNJT05fUk9NX1NJWkUJKDY0ICogMTAyNCkKLSNkZWZpbmUgRkVQNV9ST01fTUFHSUMJCSgweEZFRkZGRkZGKQotCi1zdGF0aWMgdm9pZCBkZ2FwX2dldF92cGQoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQl1MzIgbWFnaWM7Ci0JdTMyIGJhc2Vfb2Zmc2V0OwotCXUxNiByb21fb2Zmc2V0OwotCXUxNiB2cGRfb2Zmc2V0OwotCXUxNiBpbWFnZV9sZW5ndGg7Ci0JdTE2IGk7Ci0JdWNoYXIgYnl0ZTE7Ci0JdWNoYXIgYnl0ZTI7Ci0KLQkvKgotCSAqIFBva2UgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uLgotCSAqIElmIFZQRCBpcyBzdXBwb3J0ZWQsIHRoZSB2YWx1ZSByZWFkIGZyb20gdGhhdCBhZGRyZXNzCi0JICogd2lsbCBiZSBub24temVyby4KLQkgKi8KLQltYWdpYyA9IEZFUDVfUk9NX01BR0lDOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJkLT5wZGV2LCBQQ0lfUk9NX0FERFJFU1MsIG1hZ2ljKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJkLT5wZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZtYWdpYyk7Ci0KLQkvKiBWUEQgbm90IHN1cHBvcnRlZCwgYmFpbCAqLwotCWlmICghbWFnaWMpCi0JCXJldHVybjsKLQotCS8qCi0JICogVG8gZ2V0IHRvIHRoZSBPVFBST00gbWVtb3J5LCB3ZSBoYXZlIHRvIHNlbmQgdGhlIGJvYXJkcyBiYXNlCi0JICogYWRkcmVzcyBvcidlZCB3aXRoIDEgaW50byB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uLgotCSAqLwotCW1hZ2ljID0gYnJkLT5tZW1iYXNlIHwgMHgwMTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmbWFnaWMpOwotCi0JYnl0ZTEgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlKTsKLQlieXRlMiA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyAxKTsKLQotCS8qCi0JICogSWYgdGhlIGJvYXJkIGNvcnJlY3RseSBzd2FwcGVkIHRvIHRoZSBPVFBST00gbWVtb3J5LAotCSAqIHRoZSBmaXJzdCAyIGJ5dGVzIChoZWFkZXIpIHNob3VsZCBiZSAweDU1LCAweEFBCi0JICovCi0JaWYgKGJ5dGUxID09IDB4NTUgJiYgYnl0ZTIgPT0gMHhBQSkgewotCi0JCWJhc2Vfb2Zmc2V0ID0gMDsKLQotCQkvKgotCQkgKiBXZSBoYXZlIHRvIHJ1biB0aHJvdWdoIGFsbCB0aGUgT1RQUk9NIG1lbW9yeSBsb29raW5nCi0JCSAqIGZvciB0aGUgVlBEIG9mZnNldC4KLQkJICovCi0JCXdoaWxlIChiYXNlX29mZnNldCA8PSBFWFBBTlNJT05fUk9NX1NJWkUpIHsKLQotCQkJLyoKLQkJCSAqIExvdHMgb2YgbWFnaWMgbnVtYmVycyBoZXJlLgotCQkJICoKLQkJCSAqIFRoZSBWUEQgb2Zmc2V0IGlzIGxvY2F0ZWQgaW5zaWRlIHRoZSBST00gRGF0YSBTdHJ1Y3R1cmUuCi0JCQkgKiBXZSBhbHNvIGhhdmUgdG8gcmVtZW1iZXIgdGhlIGxlbmd0aCBvZiBlYWNoCi0JCQkgKiBST00gRGF0YSBTdHJ1Y3R1cmUsIHNvIHdlIGNhbiAiaG9wIiB0byB0aGUgbmV4dAotCQkJICogZW50cnkgaWYgdGhlIFZQRCBpc24ndCBpbiB0aGUgY3VycmVudAotCQkJICogUk9NIERhdGEgU3RydWN0dXJlLgotCQkJICovCi0JCQlyb21fb2Zmc2V0ID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0ICsgMHgxOCk7Ci0JCQlpbWFnZV9sZW5ndGggPSByZWFkdyhicmQtPnJlX21hcF9tZW1iYXNlICsgcm9tX29mZnNldCArIDB4MTApICogNTEyOwotCQkJdnBkX29mZnNldCA9IHJlYWR3KGJyZC0+cmVfbWFwX21lbWJhc2UgKyByb21fb2Zmc2V0ICsgMHgwOCk7Ci0KLQkJCS8qIEZvdW5kIHRoZSBWUEQgZW50cnkgKi8KLQkJCWlmICh2cGRfb2Zmc2V0KQotCQkJCWJyZWFrOwotCi0JCQkvKiBXZSBkaWRuJ3QgZmluZCBhIFZQRCBlbnRyeSwgZ28gdG8gbmV4dCBST00gZW50cnkuICovCi0JCQliYXNlX29mZnNldCArPSBpbWFnZV9sZW5ndGg7Ci0KLQkJCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0KTsKLQkJCWJ5dGUyID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0ICsgMSk7Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgbmV3IFJPTSBvZmZzZXQgZG9lc24ndCBoYXZlIDB4NTUsIDB4QUEKLQkJCSAqIGFzIGl0cyBoZWFkZXIsIHdlIGhhdmUgcnVuIG91dCBvZiBST00uCi0JCQkgKi8KLQkJCWlmIChieXRlMSAhPSAweDU1IHx8IGJ5dGUyICE9IDB4QUEpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIGEgVlBEIG9mZnNldCwgdGhlbiBtYXJrIHRoZSBib2FyZAotCQkgKiBhcyBoYXZpbmcgYSB2YWxpZCBWUEQsIGFuZCBjb3B5IFZQRFNJWkUgKDUxMikgYnl0ZXMgb2YKLQkJICogdGhhdCBWUEQgdG8gdGhlIGJ1ZmZlciB3ZSBoYXZlIGluIG91ciBib2FyZCBzdHJ1Y3R1cmUuCi0JCSAqLwotCQlpZiAodnBkX29mZnNldCkgewotCQkJYnJkLT5iZF9mbGFncyB8PSBCRF9IQVNfVlBEOwotCQkJZm9yIChpID0gMDsgaSA8IFZQRFNJWkU7IGkrKykKLQkJCQlicmQtPnZwZFtpXSA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyB2cGRfb2Zmc2V0ICsgaSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdlIE1VU1QgcG9rZSB0aGUgbWFnaWMgbnVtYmVyIGF0IHRoZSBQQ0kgUm9tIEFkZHJlc3MgbG9jYXRpb24gYWdhaW4uCi0JICogVGhpcyBtYWtlcyB0aGUgY2FyZCByZXBvcnQgdGhlIHJlZ3VsYXIgYm9hcmQgbWVtb3J5IGJhY2sgdG8gdXMsCi0JICogcmF0aGVyIHRoYW4gdGhlIE9UUFJPTSBtZW1vcnkuCi0JICovCi0JbWFnaWMgPSBGRVA1X1JPTV9NQUdJQzsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7Ci19Ci0KLQotLyoKLSAqIE91ciBib2FyZCBwb2xsZXIgZnVuY3Rpb24uCi0gKi8KLXZvaWQgZGdhcF9wb2xsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBib2FyZF90ICpiZCA9IChzdHJ1Y3QgYm9hcmRfdCAqKSBkYXRhOwotCXVsb25nICBsb2NrX2ZsYWdzOwotCXVsb25nICBsb2NrX2ZsYWdzMjsKLQljaGFyICp2YWRkcjsKLQl1MTYgaGVhZCwgdGFpbDsKLQl1MTYgKmNoa19hZGRyOwotCXUxNiBjaGVjayA9IDA7Ci0KLQlpZiAoIWJkIHx8IChiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykpIHsKLQkJQVBSKCgiZGdhcF9wb2xsX3Rhc2tsZXQoKSAtIE5VTEwgb3IgYmFkIGJkLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJkLT5pbmhpYml0X3BvbGxlcikKLQkJcmV0dXJuOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXZhZGRyID0gYmQtPnJlX21hcF9tZW1iYXNlOwotCi0JLyoKLQkgKiBJZiBib2FyZCBpcyByZWFkeSwgcGFyc2UgZGVlcGVyIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBkby4KLQkgKi8KLQlpZiAoYmQtPnN0YXRlID09IEJPQVJEX1JFQURZKSB7Ci0KLQkJc3RydWN0IGV2X3QgKmVhZGRyID0gTlVMTDsKLQotCQlpZiAoIWJkLT5yZV9tYXBfbWVtYmFzZSkgewotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghYmQtPnJlX21hcF9wb3J0KSB7Ci0JCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIWJkLT5uYXN5bmMpIHsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJLyoKLQkJICogSWYgdGhpcyBpcyBhIENYIG9yIEVQQ1gsIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBmaXJtd2FyZQotCQkgKiBpcyByZXF1ZXN0aW5nIGEgY29uY2VudHJhdG9yIGltYWdlIGZyb20gdXMuCi0JCSAqLwotCQlpZiAoKGJkLT50eXBlID09IFBDWCkgfHwgKGJkLT50eXBlID09IFBFUEMpKSB7Ci0JCQljaGtfYWRkciA9ICh1MTYgKikgKHZhZGRyICsgRE9XTlJFUSk7Ci0JCQljaGVjayA9IHJlYWR3KGNoa19hZGRyKTsKLQkJCS8qIE5vbnplcm8gaWYgRkVQIGlzIHJlcXVlc3RpbmcgY29uY2VudHJhdG9yIGltYWdlLiAqLwotCQkJaWYgKGNoZWNrKSB7Ci0JCQkJaWYgKGJkLT5jb25jX2RsX3N0YXR1cyA9PSBOT19QRU5ESU5HX0NPTkNFTlRSQVRPUl9SRVFVRVNUUykKLQkJCQkJYmQtPmNvbmNfZGxfc3RhdHVzID0gTkVFRF9DT05DRU5UUkFUT1I7Ci0JCQkJLyoKLQkJCQkgKiBTaWduYWwgZG93bmxvYWRlciwgaXRzIGdvdCBzb21lIHdvcmsgdG8gZG8uCi0JCQkJICovCi0JCQkJREdBUF9MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQkJCWlmIChkZ2FwX2RsX2FjdGlvbiAhPSAxKSB7Ci0JCQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZ2FwX2RsX3dhaXQpOwotCQkJCX0KLQkJCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQkJfQotCQl9Ci0KLQkJZWFkZHIgPSAoc3RydWN0IGV2X3QgKikgKHZhZGRyICsgRVZCVUYpOwotCi0JCS8qIEdldCBvdXIgaGVhZCBhbmQgdGFpbCAqLwotCQloZWFkID0gcmVhZHcoJihlYWRkci0+ZXZfaGVhZCkpOwotCQl0YWlsID0gcmVhZHcoJihlYWRkci0+ZXZfdGFpbCkpOwotCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIGFuIGV2ZW50IHBlbmRpbmcuIEdvIHNlcnZpY2UgaXQuCi0JCSAqLwotCQlpZiAoaGVhZCAhPSB0YWlsKSB7Ci0JCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlkZ2FwX2V2ZW50KGJkKTsKLQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCX0KLQotb3V0OgotCQkvKgotCQkgKiBJZiBib2FyZCBpcyBkb2luZyBpbnRlcnJ1cHRzLCBBQ0sgdGhlIGludGVycnVwdC4KLQkJICovCi0JCWlmIChiZCAmJiBiZC0+aW50cl9ydW5uaW5nKSB7Ci0JCQlyZWFkYihiZC0+cmVfbWFwX3BvcnQgKyAyKTsKLQkJfQotCi0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE91ciBzdGF0ZSBtYWNoaW5lIHRvIGdldCB0aGUgYm9hcmQgdXAgYW5kIHJ1bm5pbmcgKi8KLQotCS8qIFJlc2V0IGJvYXJkICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBORUVEX1JFU0VUKSB7Ci0KLQkJLyogR2V0IFZQRCBpbmZvICovCi0JCWRnYXBfZ2V0X3ZwZChiZCk7Ci0KLQkJZGdhcF9kb19yZXNldF9ib2FyZChiZCk7Ci0JfQotCi0JLyogTW92ZSB0byBuZXh0IHN0YXRlICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBGSU5JU0hFRF9SRVNFVCkgewotCQliZC0+c3RhdGUgPSBORUVEX0NPTkZJRzsKLQl9Ci0KLQlpZiAoYmQtPnN0YXRlID09IE5FRURfQ09ORklHKSB7Ci0JCS8qCi0JCSAqIE1hdGNoIHRoaXMgYm9hcmQgdG8gYSBjb25maWcgdGhlIHVzZXIgY3JlYXRlZCBmb3IgdXMuCi0JCSAqLwotCQliZC0+YmRfY29uZmlnID0gZGdhcF9maW5kX2NvbmZpZyhiZC0+dHlwZSwgYmQtPnBjaV9idXMsIGJkLT5wY2lfc2xvdCk7Ci0KLQkJLyoKLQkJICogQmVjYXVzZSB0aGUgNCBwb3J0IFhyIHByb2R1Y3RzIHNoYXJlIHRoZSBzYW1lIFBDSSBJRAotCQkgKiBhcyB0aGUgOCBwb3J0IFhyIHByb2R1Y3RzLCBpZiB3ZSByZWNlaXZlIGEgTlVMTCBjb25maWcKLQkJICogYmFjaywgYW5kIHRoaXMgaXMgYSBQQVBPUlQ4IGJvYXJkLCByZXRyeSB3aXRoIGEKLQkJICogUEFQT1JUNCBhdHRlbXB0IGFzIHdlbGwuCi0JCSAqLwotCQlpZiAoYmQtPnR5cGUgPT0gUEFQT1JUOCAmJiAhYmQtPmJkX2NvbmZpZykgewotCQkJYmQtPmJkX2NvbmZpZyA9IGRnYXBfZmluZF9jb25maWcoUEFQT1JUNCwgYmQtPnBjaV9idXMsIGJkLT5wY2lfc2xvdCk7Ci0JCX0KLQotCQkvKgotCQkgKiBSZWdpc3RlciB0aGUgdHR5cyAoaWYgYW55KSBpbnRvIHRoZSBrZXJuZWwuCi0JCSAqLwotCQlpZiAoYmQtPmJkX2NvbmZpZykgewotCQkJYmQtPnN0YXRlID0gRklOSVNIRURfQ09ORklHOwotCQl9Ci0JCWVsc2UgewotCQkJYmQtPnN0YXRlID0gQ09ORklHX05PVF9GT1VORDsKLQkJfQotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gRklOSVNIRURfQ09ORklHKSB7Ci0JCWJkLT5zdGF0ZSA9IE5FRURfREVWSUNFX0NSRUFUSU9OOwotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gTkVFRF9ERVZJQ0VfQ1JFQVRJT04pIHsKLQkJLyoKLQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkgKi8KLQkJREdBUF9MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJZGdhcF9kbF9hY3Rpb24gPSAxOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZ2FwX2RsX3dhaXQpOwotCQl9Ci0JCURHQVBfVU5MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gRklOSVNIRURfREVWSUNFX0NSRUFUSU9OKSB7Ci0JCWJkLT5zdGF0ZSA9IE5FRURfQklPU19MT0FEOwotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gTkVFRF9CSU9TX0xPQUQpIHsKLQkJLyoKLQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkgKi8KLQkJREdBUF9MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJZGdhcF9kbF9hY3Rpb24gPSAxOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZ2FwX2RsX3dhaXQpOwotCQl9Ci0JCURHQVBfVU5MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCX0KLQotCS8qIFdhaXQgZm9yIEJJT1MgdG8gdGVzdCBib2FyZC4uLiAqLwotCWlmIChiZC0+c3RhdGUgPT0gV0FJVF9CSU9TX0xPQUQpIHsKLQkJZGdhcF9kb193YWl0X2Zvcl9iaW9zKGJkKTsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IEZJTklTSEVEX0JJT1NfTE9BRCkgewotCQliZC0+c3RhdGUgPSBORUVEX0ZFUF9MT0FEOwotCi0JCS8qCi0JCSAqIFNpZ25hbCBkb3dubG9hZGVyLCBpdHMgZ290IHNvbWUgd29yayB0byBkby4KLQkJICovCi0JCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJaWYgKGRnYXBfZGxfYWN0aW9uICE9IDEpIHsKLQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJfQotCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciBGRVAgdG8gbG9hZCBvbiBib2FyZC4uLiAqLwotCWlmIChiZC0+c3RhdGUgPT0gV0FJVF9GRVBfTE9BRCkgewotCQlkZ2FwX2RvX3dhaXRfZm9yX2ZlcChiZCk7Ci0JfQotCi0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IEZJTklTSEVEX0ZFUF9MT0FEKSB7Ci0KLQkJLyoKLQkJICogRG8gdHR5IGRldmljZSBpbml0aWFsaXphdGlvbi4KLQkJICovCi0JCWludCByYyA9IGRnYXBfdHR5X2luaXQoYmQpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCWRnYXBfdHR5X3VuaW5pdChiZCk7Ci0JCQlBUFIoKCJDYW4ndCBpbml0IHR0eSBkZXZpY2VzICglZClcbiIsIHJjKSk7Ci0JCQliZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCQliZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQliZC0+c3RhdGUgPSBORUVEX1BST0NfQ1JFQVRJT047Ci0KLQkJCS8qCi0JCQkgKiBTaWduYWwgZG93bmxvYWRlciwgaXRzIGdvdCBzb21lIHdvcmsgdG8gZG8uCi0JCQkgKi8KLQkJCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCWlmIChkZ2FwX2RsX2FjdGlvbiAhPSAxKSB7Ci0JCQkJZGdhcF9kbF9hY3Rpb24gPSAxOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJCX0KLQkJCURHQVBfVU5MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQl9Ci0JfQotCi0JLyogTW92ZSB0byBuZXh0IHN0YXRlICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBGSU5JU0hFRF9QUk9DX0NSRUFUSU9OKSB7Ci0KLQkJYmQtPnN0YXRlID0gQk9BUkRfUkVBRFk7Ci0JCWJkLT5kcGFzdGF0dXMgPSBCRF9SVU5OSU5HOwotCi0JCS8qCi0JCSAqIElmIHVzZXIgcmVxdWVzdGVkIHRoZSBib2FyZCB0byBydW4gaW4gaW50ZXJydXB0IG1vZGUsCi0JCSAqIGdvIGFuZCBzZXQgaXQgdXAgb24gdGhlIGJvYXJkLgotCQkgKi8KLQkJaWYgKGJkLT5pbnRyX3VzZWQpIHsKLQkJCXdyaXRldygxLCAoYmQtPnJlX21hcF9tZW1iYXNlICsgRU5BQkxFX0lOVFIpKTsKLQkJCS8qCi0JCQkgKiBUZWxsIHRoZSBib2FyZCB0byBwb2xsIHRoZSBVQVJUUyBhcyBmYXN0IGFzIHBvc3NpYmxlLgotCQkJICovCi0JCQl3cml0ZXcoRkVQUE9MTF9NSU4sIChiZC0+cmVfbWFwX21lbWJhc2UgKyBGRVBQT0xMKSk7Ci0JCQliZC0+aW50cl9ydW5uaW5nID0gMTsKLQkJfQotCi0JCS8qIFdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIGJvYXJkIHN0YXRlIHRvIGNoYW5nZSB0byByZWFkeSAqLwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJkLT5zdGF0ZV93YWl0KTsKLQl9Ci0KLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9jbWRiIC0gU2VuZHMgYSAyIGJ5dGUgY29tbWFuZCB0byB0aGUgRkVQLgotICoKLSAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KLSAqICAgICAgICAgICAgICBjbWQgICAgIC0gQ29tbWFuZCB0byBiZSBzZW50LgotICogICAgICAgICAgICAgIGJ5dGUxICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgZmlyc3QgYnl0ZSB0byBiZSBzZW50LgotICogICAgICAgICAgICAgIGJ5dGUyICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgc2Vjb25kIGJ5dGUgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBuY21kcyAgIC0gV2FpdCB1bnRpbCBuY21kcyBvciBmZXdlciBjbWRzIGFyZSBsZWZ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjbWQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGRnYXBfY21kYihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1Y2hhciBieXRlMSwgdWNoYXIgYnl0ZTIsIHVpbnQgbmNtZHMpCi17Ci0JY2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7Ci0JdWludAkJY291bnQ7Ci0JdWludAkJbjsKLQl1MTYJCWhlYWQ7Ci0JdTE2CQl0YWlsOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgotCSAqLwotCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQlEUFJfQ09SRSgoIiVzOiVkIGJvYXJkIGlzIGluIGZhaWxlZCBzdGF0ZS5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKLQkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgotCSAqLwotCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKLQotCWlmICghdmFkZHIpCi0JCXJldHVybjsKLQotCWNtX2FkZHIgPSAoc3RydWN0IGNtX3QgKikgKHZhZGRyICsgQ01EQlVGKTsKLQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0KLQkvKgotCSAqIEZvcmdldCBpdCBpZiBwb2ludGVycyBvdXQgb2YgcmFuZ2UuCi0JICovCi0JaWYgKGhlYWQgPj0gKENNRE1BWCAtIENNRFNUQVJUKSB8fCAoaGVhZCAmIDAzKSkgewotCQlEUFJfQ09SRSgoIiVzOiVkIHBvaW50ZXJzIG91dCBvZiByYW5nZSwgZmFpbGluZyBib2FyZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBQdXQgdGhlIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGNvbW1hbmQgYnVmZmVyLgotCSAqLwotCXdyaXRlYihjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKLQl3cml0ZWIoKHVjaGFyKSBjaC0+Y2hfcG9ydG51bSwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOwotCXdyaXRlYihieXRlMSwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMikpOwotCXdyaXRlYihieXRlMiwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMykpOwotCi0JaGVhZCA9IChoZWFkICsgNCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCXdyaXRldyhoZWFkLCAmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQotCS8qCi0JICogV2FpdCBpZiBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkCi0JICogcG9pbnRlciB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nCi0JICogY29tbWFuZHMgdG8gdGhlIEZFUC4gICBJZiB0aGUgdGltZSBzcGVudCB3YWl0aW5nCi0JICogaXMgb3V0bGFuZGlzaCwgZGVjbGFyZSB0aGUgRkVQIGRlYWQuCi0JICovCi0JZm9yIChjb3VudCA9IGRnYXBfY291bnQgOzspIHsKLQotCQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0JCXRhaWwgPSByZWFkdygmKGNtX2FkZHItPmNtX3RhaWwpKTsKLQotCQluID0gKGhlYWQgLSB0YWlsKSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0JCWlmIChuIDw9IG5jbWRzICogc2l6ZW9mKHN0cnVjdCBjbV90KSkKLQkJCWJyZWFrOwotCi0JCWlmICgtLWNvdW50ID09IDApIHsKLQkJCURQUl9DT1JFKCgiJXM6JWQgZmFpbGluZyBib2FyZC5cbiIsX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfY21kdyAtIFNlbmRzIGEgMSB3b3JkIGNvbW1hbmQgdG8gdGhlIEZFUC4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKiAgICAgICAgICAgICAgY21kICAgICAtIENvbW1hbmQgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICB3b3JkICAgIC0gSW50ZWdlciBjb250YWluaW5nIHdvcmQgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBuY21kcyAgIC0gV2FpdCB1bnRpbCBuY21kcyBvciBmZXdlciBjbWRzIGFyZSBsZWZ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjbWQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGRnYXBfY21kdyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1MTYgd29yZCwgdWludCBuY21kcykKLXsKLQljaGFyCQkqdmFkZHIgPSBOVUxMOwotCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKLQl1aW50CQljb3VudDsKLQl1aW50CQluOwotCXUxNgkJaGVhZDsKLQl1MTYJCXRhaWw7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCS8qCi0JICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCi0JICovCi0JaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7Ci0JCURQUl9DT1JFKCgiJXM6JWQgYm9hcmQgaXMgZmFpbGVkIVxuIiwgX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQotCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCi0JICovCi0JdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOwotCWlmICghdmFkZHIpCi0JCXJldHVybjsKLQotCWNtX2FkZHIgPSAoc3RydWN0IGNtX3QgKikgKHZhZGRyICsgQ01EQlVGKTsKLQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0KLQkvKgotCSAqIEZvcmdldCBpdCBpZiBwb2ludGVycyBvdXQgb2YgcmFuZ2UuCi0JICovCi0JaWYgKGhlYWQgPj0gKENNRE1BWCAtIENNRFNUQVJUKSB8fCAoaGVhZCAmIDAzKSkgewotCQlEUFJfQ09SRSgoIiVzOiVkIFBvaW50ZXJzIG91dCBvZiByYW5nZS4gIEZhaWxpbmcgYm9hcmQuXG4iLF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBQdXQgdGhlIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGNvbW1hbmQgYnVmZmVyLgotCSAqLwotCXdyaXRlYihjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKLQl3cml0ZWIoKHVjaGFyKSBjaC0+Y2hfcG9ydG51bSwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOwotCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAyKSk7Ci0KLQloZWFkID0gKGhlYWQgKyA0KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0Jd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKLQkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKLQkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKLQkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KLQkgKi8KLQlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgewotCi0JCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOwotCi0JCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7Ci0KLQkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKC0tY291bnQgPT0gMCkgewotCQkJRFBSX0NPUkUoKCIlczolZCBGYWlsaW5nIGJvYXJkLlxuIixfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJCWNoLT5jaF9iZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdWRlbGF5KDEwKTsKLQl9Ci19Ci0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICBkZ2FwX2NtZHdfZXh0IC0gU2VuZHMgYSBleHRlbmRlZCB3b3JkIGNvbW1hbmQgdG8gdGhlIEZFUC4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKiAgICAgICAgICAgICAgY21kICAgICAtIENvbW1hbmQgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICB3b3JkICAgIC0gSW50ZWdlciBjb250YWluaW5nIHdvcmQgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBuY21kcyAgIC0gV2FpdCB1bnRpbCBuY21kcyBvciBmZXdlciBjbWRzIGFyZSBsZWZ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjbWQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgdm9pZCBkZ2FwX2NtZHdfZXh0KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1MTYgY21kLCB1MTYgd29yZCwgdWludCBuY21kcykKLXsKLQljaGFyCQkqdmFkZHIgPSBOVUxMOwotCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKLQl1aW50CQljb3VudDsKLQl1aW50CQluOwotCXUxNgkJaGVhZDsKLQl1MTYJCXRhaWw7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCS8qCi0JICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCi0JICovCi0JaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7Ci0JCURQUl9DT1JFKCgiJXM6JWQgYm9hcmQgaXMgZmFpbGVkIVxuIiwgX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQotCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCi0JICovCi0JdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOwotCWlmICghdmFkZHIpCi0JCXJldHVybjsKLQotCWNtX2FkZHIgPSAoc3RydWN0IGNtX3QgKikgKHZhZGRyICsgQ01EQlVGKTsKLQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0KLQkvKgotCSAqIEZvcmdldCBpdCBpZiBwb2ludGVycyBvdXQgb2YgcmFuZ2UuCi0JICovCi0JaWYgKGhlYWQgPj0gKENNRE1BWCAtIENNRFNUQVJUKSB8fCAoaGVhZCAmIDAzKSkgewotCQlEUFJfQ09SRSgoIiVzOiVkIFBvaW50ZXJzIG91dCBvZiByYW5nZS4gIEZhaWxpbmcgYm9hcmQuXG4iLF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBQdXQgdGhlIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGNvbW1hbmQgYnVmZmVyLgotCSAqLwotCi0JLyogV3JpdGUgYW4gRkYgdG8gdGVsbCB0aGUgRkVQIHRoYXQgd2Ugd2FudCBhbiBleHRlbmRlZCBjb21tYW5kICovCi0Jd3JpdGViKCh1Y2hhcikgMHhmZiwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMCkpOwotCi0Jd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sICh1Y2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAxKSk7Ci0Jd3JpdGV3KCh1MTYpIGNtZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMikpOwotCi0JLyoKLQkgKiBJZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGNvbW1hbmQgd29uJ3QgZml0LAotCSAqIHB1dCBpdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaXJjdWxhciBidWZmZXIuCi0JICovCi0JaWYgKCgoaGVhZCArIDQpID49ICgoQ01ETUFYIC0gQ01EU1RBUlQpKSB8fCAoaGVhZCAmIDAzKSkpIHsKLQkJd3JpdGV3KCh1MTYpIHdvcmQsIChjaGFyICopICh2YWRkciArIENNRFNUQVJUKSk7Ci0JfSBlbHNlIHsKLQkJd3JpdGV3KCh1MTYpIHdvcmQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDQpKTsKLQl9Ci0KLQloZWFkID0gKGhlYWQgKyA4KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0Jd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKLQkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKLQkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKLQkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KLQkgKi8KLQlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgewotCi0JCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOwotCi0JCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7Ci0KLQkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKC0tY291bnQgPT0gMCkgewotCQkJRFBSX0NPUkUoKCIlczolZCBGYWlsaW5nIGJvYXJkLlxuIixfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJCWNoLT5jaF9iZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdWRlbGF5KDEwKTsKLQl9Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF93bW92ZSAtIFdyaXRlIGRhdGEgdG8gRkVQIGJ1ZmZlci4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKiAgICAgICAgICAgICAgYnVmICAgICAtIFBvaXRlciB0byBjaGFyYWN0ZXJzIHRvIGJlIG1vdmVkLgotICogICAgICAgICAgICAgIGNudCAgICAgLSBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBtb3ZlLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBkZ2FwX3dtb3ZlKHN0cnVjdCBjaGFubmVsX3QgKmNoLCBjaGFyICpidWYsIHVpbnQgY250KQotewotCWludCAgICBuOwotCWNoYXIgICAqdGFkZHI7Ci0Jc3RydWN0IGJzX3QgICAgKmJzOwotCXUxNiAgICBoZWFkOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENoZWNrIHBhcmFtZXRlcnMuCi0JICovCi0JYnMgICA9IGNoLT5jaF9iczsKLQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpOwotCi0JLyoKLQkgKiBJZiBwb2ludGVycyBhcmUgb3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybi4KLQkgKi8KLQlpZiAoKGNudCA+IGNoLT5jaF90c2l6ZSkgfHwgKHVuc2lnbmVkKShoZWFkIC0gY2gtPmNoX3RzdGFydCkgPj0gY2gtPmNoX3RzaXplKSB7Ci0JCURQUl9DT1JFKCgiJXM6JWQgcG9pbnRlciBvdXQgb2YgcmFuZ2UiLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHdyaXRlIHdyYXBzIG92ZXIgdGhlIHRvcCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLAotCSAqIG1vdmUgdGhlIHBvcnRpb24gdXAgdG8gdGhlIHdyYXAgcG9pbnQsIGFuZCByZXNldCB0aGUKLQkgKiBwb2ludGVycyB0byB0aGUgYm90dG9tLgotCSAqLwotCW4gPSBjaC0+Y2hfdHN0YXJ0ICsgY2gtPmNoX3RzaXplIC0gaGVhZDsKLQotCWlmIChjbnQgPj0gbikgewotCQljbnQgLT0gbjsKLQkJdGFkZHIgPSBjaC0+Y2hfdGFkZHIgKyBoZWFkOwotCQltZW1jcHlfdG9pbyh0YWRkciwgYnVmLCBuKTsKLQkJaGVhZCA9IGNoLT5jaF90c3RhcnQ7Ci0JCWJ1ZiArPSBuOwotCX0KLQotCS8qCi0JICogTW92ZSByZXN0IG9mIGRhdGEuCi0JICovCi0JdGFkZHIgPSBjaC0+Y2hfdGFkZHIgKyBoZWFkOwotCW4gPSBjbnQ7Ci0JbWVtY3B5X3RvaW8odGFkZHIsIGJ1Ziwgbik7Ci0JaGVhZCArPSBjbnQ7Ci0KLQl3cml0ZXcoaGVhZCwgJihicy0+dHhfaGVhZCkpOwotfQotCi0vKgotICogUmV0cml2ZXMgdGhlIGN1cnJlbnQgY3VzdG9tIGJhdWQgcmF0ZSBmcm9tIEZFUCBtZW1vcnksCi0gKiBhbmQgcmV0dXJucyBpdCBiYWNrIHRvIHRoZSB1c2VyLgotICogUmV0dXJucyAwIG9uIGVycm9yLgotICovCi11aW50IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCXVjaGFyICp2YWRkcjsKLQl1bG9uZyBvZmZzZXQgPSAwOwotCXVpbnQgdmFsdWUgPSAwOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghY2gtPmNoX2JkIHx8IGNoLT5jaF9iZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIShjaC0+Y2hfYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpKQotCQlyZXR1cm4gMDsKLQotCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKLQotCWlmICghdmFkZHIpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBHbyBnZXQgZnJvbSBmZXAgbWVtLCB3aGF0IHRoZSBmZXAKLQkgKiBiZWxpZXZlcyB0aGUgY3VzdG9tIGJhdWQgcmF0ZSBpcy4KLQkgKi8KLQlvZmZzZXQgPSAoKCgoKih1bnNpZ25lZCBzaG9ydCAqKSh2YWRkciArIEVDU19TRUcpKSA8PCA0KSArCi0JCShjaC0+Y2hfcG9ydG51bSAqIDB4MjgpICsgTElORV9TUEVFRCkpOwotCi0JdmFsdWUgPSByZWFkdyh2YWRkciArIG9mZnNldCk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDYWxscyB0aGUgZmlybXdhcmUgdG8gcmVzZXQgdGhpcyBjaGFubmVsLgotICovCi12b2lkIGRnYXBfZmlybXdhcmVfcmVzZXRfcG9ydChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlkZ2FwX2NtZGIoY2gsIENIUkVTRVQsIDAsIDAsIDApOwotCi0JLyoKLQkgKiBOb3cgdGhhdCB0aGUgY2hhbm5lbCBpcyByZXNldCwgd2UgbmVlZCB0byBtYWtlIHN1cmUKLQkgKiBhbGwgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZ2V0IHJlYXBwbGllZCB0byB0aGUgcG9ydAotCSAqIGluIHRoZSBmaXJtd2FyZS4KLQkgKgotCSAqIFNvIHdlIHdpbGwgc2V0IHRoZSBkcml2ZXIncyBjYWNoZSBvZiBmaXJtd2FyZQotCSAqIHNldHRpbmdzIGFsbCB0byAwLCBhbmQgdGhlbiBjYWxsIHBhcmFtLgotCSAqLwotCWNoLT5jaF9mZXBpZmxhZyA9IDA7Ci0JY2gtPmNoX2ZlcGNmbGFnID0gMDsKLQljaC0+Y2hfZmVwb2ZsYWcgPSAwOwotCWNoLT5jaF9mZXBzdGFydGMgPSAwOwotCWNoLT5jaF9mZXBzdG9wYyA9IDA7Ci0JY2gtPmNoX2ZlcGFzdGFydGMgPSAwOwotCWNoLT5jaF9mZXBhc3RvcGMgPSAwOwotCWNoLT5jaF9tb3N0YXQgPSAwOwotCWNoLT5jaF9oZmxvdyA9IDA7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9wYXJhbSAtIFNldCBEaWdpIHBhcmFtZXRlcnMuCi0gKgotICogICAgICAgICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICogICAgIC0gVFRZIGZvciBwb3J0LgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGRnYXBfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qga3Rlcm1pb3MgKnRzOwotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgYnNfdCAgICpiczsKLQlzdHJ1Y3QgdW5fdCAgICp1bjsKLQl1MTYJaGVhZDsKLQl1MTYJY2ZsYWc7Ci0JdTE2CWlmbGFnOwotCXVjaGFyCW12YWw7Ci0JdWNoYXIJaGZsb3c7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXVuID0gKHN0cnVjdCB1bl90ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gLUVOWElPOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gLUVOWElPOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWJzID0gY2gtPmNoX2JzOwotCWlmICghYnMpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlEUFJfUEFSQU0oKCJwYXJhbSBzdGFydDogdGRldjogJXggY2ZsYWdzOiAleCBvZmxhZ3M6ICV4IGlmbGFnczogJXhcbiIsCi0JCWNoLT5jaF90dW4udW5fZGV2LCBjaC0+Y2hfY19jZmxhZywgY2gtPmNoX2Nfb2ZsYWcsIGNoLT5jaF9jX2lmbGFnKSk7Ci0KLQl0cyA9ICZ0dHktPnRlcm1pb3M7Ci0KLQkvKgotCSAqIElmIGJhdWQgcmF0ZSBpcyB6ZXJvLCBmbHVzaCBxdWV1ZXMsIGFuZCBzZXQgbXZhbCB0byBkcm9wIERUUi4KLQkgKi8KLQlpZiAoKGNoLT5jaF9jX2NmbGFnICYgKENCQVVEKSkgPT0gMCkgewotCi0JCS8qIGZsdXNoIHJ4ICovCi0JCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOwotCQl3cml0ZXcoaGVhZCwgJihjaC0+Y2hfYnMtPnJ4X3RhaWwpKTsKLQotCQkvKiBmbHVzaCB0eCAqLwotCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKLQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT50eF90YWlsKSk7Ci0KLQkJY2gtPmNoX2ZsYWdzIHw9IChDSF9CQVVEMCk7Ci0KLQkJLyogRHJvcCBSVFMgYW5kIERUUiAqLwotCQljaC0+Y2hfbXZhbCAmPSB+KERfUlRTKGNoKXxEX0RUUihjaCkpOwotCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOwotCQljaC0+Y2hfYmF1ZF9pbmZvID0gMDsKLQotCX0gZWxzZSBpZiAoY2gtPmNoX2N1c3RvbV9zcGVlZCAmJiAoYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpKSB7Ci0JCS8qCi0JCSAqIFRlbGwgdGhlIGZlcCB0byBkbyB0aGUgY29tbWFuZAotCQkgKi8KLQotCQlEUFJfUEFSQU0oKCJwYXJhbTogV2FudCAlZCBzcGVlZFxuIiwgY2gtPmNoX2N1c3RvbV9zcGVlZCkpOwotCi0JCWRnYXBfY21kd19leHQoY2gsIDB4ZmYwMSwgY2gtPmNoX2N1c3RvbV9zcGVlZCwgMCk7Ci0KLQkJLyoKLQkJICogTm93IGdvIGdldCBmcm9tIGZlcCBtZW0sIHdoYXQgdGhlIGZlcAotCQkgKiBiZWxpZXZlcyB0aGUgY3VzdG9tIGJhdWQgcmF0ZSBpcy4KLQkJICovCi0JCWNoLT5jaF9iYXVkX2luZm8gPSBjaC0+Y2hfY3VzdG9tX3NwZWVkID0gZGdhcF9nZXRfY3VzdG9tX2JhdWQoY2gpOwotCi0JCURQUl9QQVJBTSgoInBhcmFtOiBHb3QgJWQgc3BlZWRcbiIsIGNoLT5jaF9jdXN0b21fc3BlZWQpKTsKLQotCQkvKiBIYW5kbGUgdHJhbnNpdGlvbiBmcm9tIEIwICovCi0JCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9CQVVEMCkgewotCQkJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfQkFVRDApOwotCQkJY2gtPmNoX212YWwgfD0gKERfUlRTKGNoKXxEX0RUUihjaCkpOwotCQl9Ci0JCW12YWwgPSBEX0RUUihjaCkgfCBEX1JUUyhjaCk7Ci0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBTZXQgYmF1ZCByYXRlLCBjaGFyYWN0ZXIgc2l6ZSwgYW5kIHBhcml0eS4KLQkJICovCi0KLQotCQlpbnQgaWluZGV4ID0gMDsKLQkJaW50IGppbmRleCA9IDA7Ci0JCWludCBiYXVkID0gMDsKLQotCQl1bG9uZyBiYXVkc1s0XVsxNl0gPSB7Ci0JCQl7IC8qIHNsb3diYXVkICovCi0JCQkJMCwJNTAsCTc1LAkxMTAsCi0JCQkJMTM0LAkxNTAsCTIwMCwJMzAwLAotCQkJCTYwMCwJMTIwMCwJMTgwMCwJMjQwMCwKLQkJCQk0ODAwLAk5NjAwLAkxOTIwMCwJMzg0MDAgfSwKLQkJCXsgLyogc2xvd2JhdWQgJiBDQkFVREVYICovCi0JCQkJMCwJNTc2MDAsCTExNTIwMCwJMjMwNDAwLAotCQkJCTQ2MDgwMCwJMTUwLAkyMDAsCTkyMTYwMCwKLQkJCQk2MDAsCTEyMDAsCTE4MDAsCTI0MDAsCi0JCQkJNDgwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCi0JCQl7IC8qIGZhc3RiYXVkICovCi0JCQkJMCwJNTc2MDAsCTc2ODAwLAkxMTUyMDAsCi0JCQkJMTQ0MDAsCTU3NjAwLAkyMzA0MDAsCTc2ODAwLAotCQkJCTExNTIwMCwJMjMwNDAwLAkyODgwMCwJNDYwODAwLAotCQkJCTkyMTYwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCi0JCQl7IC8qIGZhc3RiYXVkICYgQ0JBVURFWCAqLwotCQkJCTAsCTU3NjAwLAkxMTUyMDAsCTIzMDQwMCwKLQkJCQk0NjA4MDAsCTE1MCwJMjAwLAk5MjE2MDAsCi0JCQkJNjAwLAkxMjAwLAkxODAwLAkyNDAwLAotCQkJCTQ4MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9Ci0JCX07Ci0KLQkJLyogT25seSB1c2UgdGhlIFRYUHJpbnQgYmF1ZCByYXRlIGlmIHRoZSB0ZXJtaW5hbCB1bml0IGlzIE5PVCBvcGVuICovCi0JCWlmICghKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pICYmICh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSkKLQkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3B1bi51bl90dHkpICYgMHhmZjsKLQkJZWxzZQotCQkJYmF1ZCA9IENfQkFVRChjaC0+Y2hfdHVuLnVuX3R0eSkgJiAweGZmOwotCi0JCWlmIChjaC0+Y2hfY19jZmxhZyAmIENCQVVERVgpCi0JCQlpaW5kZXggPSAxOwotCi0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKQotCQkJaWluZGV4ICs9IDI7Ci0KLQkJamluZGV4ID0gYmF1ZDsKLQotCQlpZiAoKGlpbmRleCA+PSAwKSAmJiAoaWluZGV4IDwgNCkgJiYgKGppbmRleCA+PSAwKSAmJiAoamluZGV4IDwgMTYpKSB7Ci0JCQliYXVkID0gYmF1ZHNbaWluZGV4XVtqaW5kZXhdOwotCQl9IGVsc2UgewotCQkJRFBSX0lPQ1RMKCgiYmF1ZCBpbmRpY2VzIHdlcmUgb3V0IG9mIHJhbmdlICglZCkoJWQpIiwKLQkJCQlpaW5kZXgsIGppbmRleCkpOwotCQkJYmF1ZCA9IDA7Ci0JCX0KLQotCQlpZiAoYmF1ZCA9PSAwKQotCQkJYmF1ZCA9IDk2MDA7Ci0KLQkJY2gtPmNoX2JhdWRfaW5mbyA9IGJhdWQ7Ci0KLQotCQkvKgotCQkgKiBDQkFVRCBoYXMgYml0IHBvc2l0aW9uIDB4MTAwMCBzZXQgdGhlc2UgZGF5cyB0byBpbmRpY2F0ZSBMaW51eAotCQkgKiBiYXVkIHJhdGUgcmVtYXAuCi0JCSAqIFdlIHVzZSBhIGRpZmZlcmVudCBiaXQgYXNzaWdubWVudCBmb3IgaGlnaCBzcGVlZC4gIENsZWFyIHRoaXMKLQkJICogYml0IG91dCB3aGlsZSBncmFiYmluZyB0aGUgcGFydHMgb2YgImNmbGFnIiB3ZSB3YW50LgotCQkgKi8KLQkJY2ZsYWcgPSBjaC0+Y2hfY19jZmxhZyAmICgoQ0JBVUQgXiBDQkFVREVYKSB8IFBBUk9ERCB8IFBBUkVOQiB8IENTVE9QQiB8IENTSVpFKTsKLQotCQkvKgotCQkgKiBIVVBDTCBiaXQgaXMgdXNlZCBieSBGRVAgdG8gaW5kaWNhdGUgZmFzdCBiYXVkCi0JCSAqIHRhYmxlIGlzIHRvIGJlIHVzZWQuCi0JCSAqLwotCQlpZiAoKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0ZBU1QpIHx8IChjaC0+Y2hfY19jZmxhZyAmIENCQVVERVgpKQotCQkJY2ZsYWcgfD0gSFVQQ0w7Ci0KLQotCQlpZiAoKGNoLT5jaF9jX2NmbGFnICYgQ0JBVURFWCkgJiYgIShjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKSkgewotCQkvKgotCQkgKiBUaGUgYmVsb3cgY29kZSBpcyB0cnlpbmcgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBiYXVkIHJhdGVzCi0JCSAqIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMCBhcmUgcmVtYXBwZWQuICBXZSB1c2UgZXhjbHVzaXZlIG9yCi0JCSAqIGJlY2F1c2UgdGhlIHZhcmlvdXMgYmF1ZCByYXRlcyBzaGFyZSBjb21tb24gYml0IHBvc2l0aW9ucwotCQkgKiBhbmQgdGhlcmVmb3JlIGNhbid0IGJlIHRlc3RlZCBmb3IgZWFzaWx5LgotCQkgKi8KLQkJCXRjZmxhZ190IHRjZmxhZyA9IChjaC0+Y2hfY19jZmxhZyAmIENCQVVEKSB8IENCQVVERVg7Ci0JCQlpbnQgYmF1ZHBhcnQgPSAwOwotCi0JCQkvKiBNYXAgaGlnaCBzcGVlZCByZXF1ZXN0cyB0byBpbmRleCBpbnRvIEZFUCdzIGJhdWQgdGFibGUgKi8KLQkJCXN3aXRjaCAodGNmbGFnKSB7Ci0JCQljYXNlIEI1NzYwMCA6Ci0JCQkJYmF1ZHBhcnQgPSAxOwotCQkJCWJyZWFrOwotI2lmZGVmIEI3NjgwMAotCQkJY2FzZSBCNzY4MDAgOgotCQkJCWJhdWRwYXJ0ID0gMjsKLQkJCQlicmVhazsKLSNlbmRpZgotCQkJY2FzZSBCMTE1MjAwIDoKLQkJCQliYXVkcGFydCA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEIyMzA0MDAgOgotCQkJCWJhdWRwYXJ0ID0gOTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQjQ2MDgwMCA6Ci0JCQkJYmF1ZHBhcnQgPSAxMTsKLQkJCQlicmVhazsKLSNpZmRlZiBCOTIxNjAwCi0JCQljYXNlIEI5MjE2MDAgOgotCQkJCWJhdWRwYXJ0ID0gMTI7Ci0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCWRlZmF1bHQ6Ci0JCQkJYmF1ZHBhcnQgPSAwOwotCQkJfQotCi0JCQlpZiAoYmF1ZHBhcnQpCi0JCQkJY2ZsYWcgPSAoY2ZsYWcgJiB+KENCQVVEIHwgQ0JBVURFWCkpIHwgYmF1ZHBhcnQ7Ci0JCX0KLQotCQljZmxhZyAmPSAweGZmZmY7Ci0KLQkJaWYgKGNmbGFnICE9IGNoLT5jaF9mZXBjZmxhZykgewotCQkJY2gtPmNoX2ZlcGNmbGFnID0gKHUxNikgKGNmbGFnICYgMHhmZmZmKTsKLQotCQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCQlkZ2FwX2NtZHcoY2gsIFNDRkxBRywgKHUxNikgY2ZsYWcsIDApOwotCQl9Ci0KLQkJLyogSGFuZGxlIHRyYW5zaXRpb24gZnJvbSBCMCAqLwotCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQkFVRDApIHsKLQkJCWNoLT5jaF9mbGFncyAmPSB+KENIX0JBVUQwKTsKLQkJCWNoLT5jaF9tdmFsIHw9IChEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJfQotCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOwotCX0KLQotCS8qCi0JICogR2V0IGlucHV0IGZsYWdzLgotCSAqLwotCWlmbGFnID0gY2gtPmNoX2NfaWZsYWcgJiAoSUdOQlJLIHwgQlJLSU5UIHwgSUdOUEFSIHwgUEFSTVJLIHwgSU5QQ0sgfCBJU1RSSVAgfCBJWE9OIHwgSVhBTlkgfCBJWE9GRik7Ci0KLQlpZiAoKGNoLT5jaF9zdGFydGMgPT0gX1BPU0lYX1ZESVNBQkxFKSB8fCAoY2gtPmNoX3N0b3BjID09IF9QT1NJWF9WRElTQUJMRSkpIHsKLQkJaWZsYWcgJj0gfihJWE9OIHwgSVhPRkYpOwotCQljaC0+Y2hfY19pZmxhZyAmPSB+KElYT04gfCBJWE9GRik7Ci0JfQotCi0JLyoKLQkgKiBPbmx5IHRoZSBJQk0gWHIgY2FyZCBjYW4gc3dpdGNoIGJldHdlZW4KLQkgKiAyMzIgYW5kIDQyMiBtb2RlcyBvbiB0aGUgZmx5Ci0JICovCi0JaWYgKGJkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9YUl9JQk1fRElEKSB7Ci0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV80MjIpCi0JCQlkZ2FwX2NtZGIoY2gsIFNDT01NT0RFLCBNT0RFXzQyMiwgMCwgMCk7Ci0JCWVsc2UKLQkJCWRnYXBfY21kYihjaCwgU0NPTU1PREUsIE1PREVfMjMyLCAwLCAwKTsKLQl9Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfQUxUUElOKQotCQlpZmxhZyB8PSBJQUxUUElOIDsKLQotCWlmIChpZmxhZyAhPSBjaC0+Y2hfZmVwaWZsYWcpIHsKLQkJY2gtPmNoX2ZlcGlmbGFnID0gaWZsYWc7Ci0KLQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCWRnYXBfY21kdyhjaCwgU0lGTEFHLCAodTE2KSBjaC0+Y2hfZmVwaWZsYWcsIDApOwotCX0KLQotCS8qCi0JICogU2VsZWN0IGhhcmR3YXJlIGhhbmRzaGFraW5nLgotCSAqLwotCWhmbG93ID0gMDsKLQotCWlmIChjaC0+Y2hfY19jZmxhZyAmIENSVFNDVFMpIHsKLQkJaGZsb3cgfD0gKERfUlRTKGNoKSB8IERfQ1RTKGNoKSk7Ci0JfQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgUlRTUEFDRSkKLQkJaGZsb3cgfD0gRF9SVFMoY2gpOwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRFRSUEFDRSkKLQkJaGZsb3cgfD0gRF9EVFIoY2gpOwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgQ1RTUEFDRSkKLQkJaGZsb3cgfD0gRF9DVFMoY2gpOwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRFNSUEFDRSkKLQkJaGZsb3cgfD0gRF9EU1IoY2gpOwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRENEUEFDRSkKLQkJaGZsb3cgfD0gRF9DRChjaCk7Ci0KLQlpZiAoaGZsb3cgIT0gY2gtPmNoX2hmbG93KSB7Ci0JCWNoLT5jaF9oZmxvdyA9IGhmbG93OwotCi0JCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQlkZ2FwX2NtZGIoY2gsIFNIRkxPVywgKHVjaGFyKSBoZmxvdywgMHhmZiwgMCk7Ci0JfQotCi0KLQkvKgotCSAqIFNldCBSVFMgYW5kL29yIERUUiBUb2dnbGUgaWYgbmVlZGVkLCBidXQgb25seSBpZiBwcm9kdWN0IGlzIEZFUDUrIGJhc2VkLgotCSAqLwotCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgewotCQl1MTYgaGZsb3cyID0gMDsKLQkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX1JUU19UT0dHTEUpIHsKLQkJCWhmbG93MiB8PSAoRF9SVFMoY2gpKTsKLQkJfQotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRFRSX1RPR0dMRSkgewotCQkJaGZsb3cyIHw9IChEX0RUUihjaCkpOwotCQl9Ci0KLQkJZGdhcF9jbWR3X2V4dChjaCwgMHhmZjAzLCBoZmxvdzIsIDApOwotCX0KLQotCS8qCi0JICogU2V0IG1vZGVtIGNvbnRyb2wgbGluZXMuCi0JICovCi0KLQltdmFsIF49IGNoLT5jaF9tZm9yY2UgJiAobXZhbCBeIGNoLT5jaF9tdmFsKTsKLQotCURQUl9QQVJBTSgoImRnYXBfcGFyYW06IG12YWw6ICV4IGNoX21mb3JjZTogJXggY2hfbXZhbDogJXggY2hfbW9zdGF0OiAleFxuIiwKLQkJbXZhbCwgY2gtPmNoX21mb3JjZSwgY2gtPmNoX212YWwsIGNoLT5jaF9tb3N0YXQpKTsKLQotCWlmIChjaC0+Y2hfbW9zdGF0IF4gbXZhbCkgewotCQljaC0+Y2hfbW9zdGF0ID0gbXZhbDsKLQotCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KLQkJRFBSX1BBUkFNKCgiZGdhcF9wYXJhbTogU2VuZGluZyBTTU9ERU0gbXZhbDogJXhcbiIsIG12YWwpKTsKLQkJZGdhcF9jbWRiKGNoLCBTTU9ERU0sICh1Y2hhcikgbXZhbCwgRF9SVFMoY2gpfERfRFRSKGNoKSwgMCk7Ci0JfQotCi0JLyoKLQkgKiBSZWFkIG1vZGVtIHNpZ25hbHMsIGFuZCB0aGVuIGNhbGwgY2FycmllciBmdW5jdGlvbi4KLQkgKi8KLQljaC0+Y2hfbWlzdGF0ID0gcmVhZGIoJihicy0+bV9zdGF0KSk7Ci0JZGdhcF9jYXJyaWVyKGNoKTsKLQotCS8qCi0JICogU2V0IHRoZSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzLgotCSAqLwotCWlmIChjaC0+Y2hfc3RhcnRjICE9IGNoLT5jaF9mZXBzdGFydGMgfHwgY2gtPmNoX3N0b3BjICE9IGNoLT5jaF9mZXBzdG9wYykgewotCQljaC0+Y2hfZmVwc3RhcnRjID0gY2gtPmNoX3N0YXJ0YzsKLQkJY2gtPmNoX2ZlcHN0b3BjID0gIGNoLT5jaF9zdG9wYzsKLQotCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KLQkJZGdhcF9jbWRiKGNoLCBTRkxPV0MsIGNoLT5jaF9mZXBzdGFydGMsIGNoLT5jaF9mZXBzdG9wYywgMCk7Ci0JfQotCi0JLyoKLQkgKiBTZXQgdGhlIEF1eGlsaWFyeSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzLgotCSAqLwotCWlmIChjaC0+Y2hfYXN0YXJ0YyAhPSBjaC0+Y2hfZmVwYXN0YXJ0YyB8fCBjaC0+Y2hfYXN0b3BjICE9IGNoLT5jaF9mZXBhc3RvcGMpIHsKLQkJY2gtPmNoX2ZlcGFzdGFydGMgPSBjaC0+Y2hfYXN0YXJ0YzsKLQkJY2gtPmNoX2ZlcGFzdG9wYyA9IGNoLT5jaF9hc3RvcGM7Ci0KLQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCWRnYXBfY21kYihjaCwgU0FGTE9XQywgY2gtPmNoX2ZlcGFzdGFydGMsIGNoLT5jaF9mZXBhc3RvcGMsIDApOwotCX0KLQotCURQUl9QQVJBTSgoInBhcmFtIGZpbmlzaFxuIikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIGRnYXBfcGFyaXR5X3NjYW4oKQotICoKLSAqIENvbnZlcnQgdGhlIEZFUDUgd2F5IG9mIHJlcG9ydGluZyBwYXJpdHkgZXJyb3JzIGFuZCBicmVha3MgaW50bwotICogdGhlIExpbnV4IGxpbmUgZGlzY2lwbGluZSB3YXkuCi0gKi8KLXZvaWQgZGdhcF9wYXJpdHlfc2NhbihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgY2hhciAqY2J1ZiwgdW5zaWduZWQgY2hhciAqZmJ1ZiwgaW50ICpsZW4pCi17Ci0JaW50IGwgPSAqbGVuOwotCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgY2hhciAqaW4sICpjb3V0LCAqZm91dDsKLQl1bnNpZ25lZCBjaGFyIGM7Ci0KLQlpbiA9IGNidWY7Ci0JY291dCA9IGNidWY7Ci0JZm91dCA9IGZidWY7Ci0KLQlEUFJfUFNDQU4oKCJkZ2FwX3Bhcml0eV9zY2FuIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCXdoaWxlIChsLS0pIHsKLQkJYyA9ICppbisrOwotCQlzd2l0Y2ggKGNoLT5wc2Nhbl9zdGF0ZSkgewotCQlkZWZhdWx0OgotCQkJLyogcmVzZXQgdG8gc2FuaXR5IGFuZCBmYWxsIHRocm91Z2ggKi8KLQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7Ci0KLQkJY2FzZSAwOgotCQkJLyogTm8gRkYgc2VlbiB5ZXQgKi8KLQkJCWlmIChjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpIHsKLQkJCQkvKiBkZWxldGUgdGhpcyBjaGFyYWN0ZXIgZnJvbSBzdHJlYW0gKi8KLQkJCQljaC0+cHNjYW5fc3RhdGUgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQkqY291dCsrID0gYzsKLQkJCQkqZm91dCsrID0gVFRZX05PUk1BTDsKLQkJCQljb3VudCArPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxOgotCQkJLyogZmlyc3QgRkYgc2VlbiAqLwotCQkJaWYgKGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykgewotCQkJCS8qIGRvdWJsZWQgZmYsIHRyYW5zZm9ybSB0byBzaW5nbGUgZmYgKi8KLQkJCQkqY291dCsrID0gYzsKLQkJCQkqZm91dCsrID0gVFRZX05PUk1BTDsKLQkJCQljb3VudCArPSAxOwotCQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHNhdmUgdmFsdWUgZXhhbWluYXRpb24gaW4gbmV4dCBzdGF0ZSAqLwotCQkJCWNoLT5wc2Nhbl9zYXZlY2hhciA9IGM7Ci0JCQkJY2gtPnBzY2FuX3N0YXRlID0gMjsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCS8qIHRoaXJkIGNoYXJhY3RlciBvZiBmZiBzZXF1ZW5jZSAqLwotCi0JCQkqY291dCsrID0gYzsKLQotCQkJaWYgKGNoLT5wc2Nhbl9zYXZlY2hhciA9PSAweDApIHsKLQotCQkJCWlmIChjID09IDB4MCkgewotCQkJCQlEUFJfUFNDQU4oKCJkZ2FwX3Bhcml0eV9zY2FuIGluIDNyZCBjaGFyIG9mIGZmIHNlcS4gYzogJXggc2V0dGluZyBicmVhay5cbiIsIGMpKTsKLQkJCQkJY2gtPmNoX2Vycl9icmVhaysrOwotCQkJCQkqZm91dCsrID0gVFRZX0JSRUFLOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJRFBSX1BTQ0FOKCgiZGdhcF9wYXJpdHlfc2NhbiBpbiAzcmQgY2hhciBvZiBmZiBzZXEuIGM6ICV4IHNldHRpbmcgcGFyaXR5LlxuIiwgYykpOwotCQkJCQljaC0+Y2hfZXJyX3Bhcml0eSsrOwotCQkJCQkqZm91dCsrID0gVFRZX1BBUklUWTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlEUFJfUFNDQU4oKCIlczolZCBMb2dpYyBFcnJvci5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQkJfQotCi0JCQljb3VudCArPSAxOwotCQkJY2gtPnBzY2FuX3N0YXRlID0gMDsKLQkJfQotCX0KLQkqbGVuID0gY291bnQ7Ci0JRFBSX1BTQ0FOKCgiZGdhcF9wYXJpdHlfc2NhbiBmaW5pc2hcbiIpKTsKLX0KLQotCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9ldmVudCAtIEZFUCB0byBob3N0IGV2ZW50IHByb2Nlc3Npbmcgcm91dGluZS4KLSAqCi0gKiAgICAgICAgICAgICAgYmQgICAgIC0gQm9hcmQgb2YgY3VycmVudCBldmVudC4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgZGdhcF9ldmVudChzdHJ1Y3QgYm9hcmRfdCAqYmQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0JdWxvbmcJCWxvY2tfZmxhZ3M7Ci0JdWxvbmcJCWxvY2tfZmxhZ3MyOwotCXN0cnVjdCBic190CSpiczsKLQl1Y2hhcgkJKmV2ZW50OwotCXVjaGFyCQkqdmFkZHIgPSBOVUxMOwotCXN0cnVjdCBldl90CSplYWRkciA9IE5VTEw7Ci0JdWludAkJaGVhZDsKLQl1aW50CQl0YWlsOwotCWludAkJcG9ydDsKLQlpbnQJCXJlYXNvbjsKLQlpbnQJCW1vZGVtOwotCWludAkJYjE7Ci0KLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gLUVOWElPOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXZhZGRyID0gYmQtPnJlX21hcF9tZW1iYXNlOwotCi0JaWYgKCF2YWRkcikgewotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JZWFkZHIgPSAoc3RydWN0IGV2X3QgKikgKHZhZGRyICsgRVZCVUYpOwotCi0JLyogR2V0IG91ciBoZWFkIGFuZCB0YWlsICovCi0JaGVhZCA9IHJlYWR3KCYoZWFkZHItPmV2X2hlYWQpKTsKLQl0YWlsID0gcmVhZHcoJihlYWRkci0+ZXZfdGFpbCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCi0JaWYgKGhlYWQgPj0gRVZNQVggLSBFVlNUQVJUIHx8IHRhaWwgPj0gRVZNQVggLSBFVlNUQVJUIHx8Ci0JICAgIChoZWFkIHwgdGFpbCkgJiAwMykgewotCQlEUFJfRVZFTlQoKCJzaG91bGQgYmUgY2FsbGluZyB4eGZhaWwgJWRcbiIsIF9fTElORV9fKSk7Ci0JCS8qIExldCBnbyBvZiBib2FyZCBsb2NrICovCi0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKgotCSAqIExvb3AgdG8gcHJvY2VzcyBhbGwgdGhlIGV2ZW50cyBpbiB0aGUgYnVmZmVyLgotCSAqLwotCXdoaWxlICh0YWlsICE9IGhlYWQpIHsKLQotCQkvKgotCQkgKiBHZXQgaW50ZXJydXB0IGluZm9ybWF0aW9uLgotCQkgKi8KLQotCQlldmVudCA9IGJkLT5yZV9tYXBfbWVtYmFzZSArIHRhaWwgKyBFVlNUQVJUOwotCi0JCXBvcnQgICA9IGV2ZW50WzBdOwotCQlyZWFzb24gPSBldmVudFsxXTsKLQkJbW9kZW0gID0gZXZlbnRbMl07Ci0JCWIxICAgICA9IGV2ZW50WzNdOwotCi0JCURQUl9FVkVOVCgoImV2ZW50OiBqaWZmaWVzOiAlbGQgcG9ydDogJWQgcmVhc29uOiAleCBtb2RlbTogJXhcbiIsCi0JCQlqaWZmaWVzLCBwb3J0LCByZWFzb24sIG1vZGVtKSk7Ci0KLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoZSBpbnRlcnJ1cHQgaXMgdmFsaWQuCi0JCSAqLwotCQlpZiAocG9ydCA+PSBiZC0+bmFzeW5jKQotCQkJZ290byBuZXh0OwotCi0JCWlmICghKHJlYXNvbiAmIChJRk1PREVNIHwgSUZCUkVBSyB8IElGVExXIHwgSUZURU0gfCBJRkRBVEEpKSkgewotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJY2ggPSBiZC0+Y2hhbm5lbHNbcG9ydF07Ci0KLQkJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKSB7Ci0JCQlnb3RvIG5leHQ7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIG1hZGUgaXQgaGVyZSwgdGhlIGV2ZW50IHdhcyB2YWxpZC4KLQkJICogTG9jayBkb3duIHRoZSBjaGFubmVsLgotCQkgKi8KLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkJYnMgPSBjaC0+Y2hfYnM7Ci0KLQkJaWYgKCFicykgewotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCWdvdG8gbmV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YS4KLQkJICovCi0JCWlmIChyZWFzb24gJiBJRkRBVEEpIHsKLQotCQkJLyoKLQkJCSAqIEFMTCBMT0NLUyAqTVVTVCogQkUgRFJPUFBFRCBCRUZPUkUgQ0FMTElORyBJTlBVVCEKLQkJCSAqIGlucHV0IGNvdWxkIHNlbmQgc29tZSBkYXRhIHRvIGxkLCB3aGljaCBpbiB0dXJuCi0JCQkgKiBjb3VsZCBkbyBhIGNhbGxiYWNrIHRvIG9uZSBvZiBvdXIgb3RoZXIgZnVuY3Rpb25zLgotCQkJICovCi0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCQlkZ2FwX2lucHV0KGNoKTsKLQotCQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUkFDVElWRSkKLQkJCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfUkVOQUJMRTsKLQkJCWVsc2UKLQkJCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JXQUlUKSB7Ci0JCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9SV0FJVDsKLQotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgTW9kZW0gY2hhbmdlIHNpZ25hbHMuCi0JCSAqLwotCQlpZiAocmVhc29uICYgSUZNT0RFTSkgewotCQkJY2gtPmNoX21pc3RhdCA9IG1vZGVtOwotCQkJZGdhcF9jYXJyaWVyKGNoKTsKLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgYnJlYWsuCi0JCSAqLwotCQlpZiAocmVhc29uICYgSUZCUkVBSykgewotCi0JCQlEUFJfRVZFTlQoKCJnb3QgSUZCUkVBS1xuIikpOwotCi0JCQlpZiAoY2gtPmNoX3R1bi51bl90dHkpIHsKLQkJCQkvKiBBIGJyZWFrIGhhcyBiZWVuIGluZGljYXRlZCAqLwotCQkJCWNoLT5jaF9lcnJfYnJlYWsrKzsKLQkJCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbShjaC0+Y2hfdHVuLnVuX3R0eS0+cG9ydCwgMSk7Ci0JCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoY2gtPmNoX3R1bi51bl90dHktPnBvcnQsIDAsIFRUWV9CUkVBSyk7Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goY2gtPmNoX3R1bi51bl90dHktPnBvcnQpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogUHJvY2VzcyBUcmFuc21pdCBsb3cuCi0JCSAqLwotCQlpZiAocmVhc29uICYgSUZUTFcpIHsKLQotCQkJRFBSX0VWRU5UKCgiZXZlbnQ6IGdvdCBsb3cgZXZlbnRcbiIpKTsKLQotCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9MT1cpIHsKLQkJCQljaC0+Y2hfdHVuLnVuX2ZsYWdzICY9IH5VTl9MT1c7Ci0KLQkJCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0lTT1BFTikgewotCQkJCQlpZiAoKGNoLT5jaF90dW4udW5fdHR5LT5mbGFncyAmCi0JCQkJCSAgICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzEpCi0JCQkJCQljaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKQotI2Vsc2UKLQkJCQkJCWNoLT5jaF90dW4udW5fdHR5LT5sZGlzYy5vcHMtPndyaXRlX3dha2V1cCkKLSNlbmRpZgotCQkJCQl7Ci0JCQkJCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzEpCi0JCQkJCQkoY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkoY2gtPmNoX3R1bi51bl90dHkpOwotI2Vsc2UKLQkJCQkJCShjaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApKGNoLT5jaF90dW4udW5fdHR5KTsKLSNlbmRpZgotCQkJCQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJCQl9Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl90dHktPndyaXRlX3dhaXQpOwotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fZmxhZ3Nfd2FpdCk7Ci0KLQkJCQkJRFBSX0VWRU5UKCgiZXZlbnQ6IEdvdCBsb3cgZXZlbnQuIGppZmZpZXM6ICVsdVxuIiwgamlmZmllcykpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiBVTl9MT1cpIHsKLQkJCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH5VTl9MT1c7Ci0JCQkJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHsKLQkJCQkJaWYgKChjaC0+Y2hfcHVuLnVuX3R0eS0+ZmxhZ3MgJgotCQkJCQkgICAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkKLSNlbHNlCi0JCQkJCQljaC0+Y2hfcHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApCi0jZW5kaWYKLQkJCQkJewotCQkJCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJKGNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKGNoLT5jaF9wdW4udW5fdHR5KTsKLSNlbHNlCi0JCQkJCQkoY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0jZW5kaWYKLQkJCQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJfQotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9wdW4udW5fdHR5LT53cml0ZV93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1dMT1cpIHsKLQkJCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1dMT1c7Ci0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIFRyYW5zbWl0IGVtcHR5LgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGVEVNKSB7Ci0JCQlEUFJfRVZFTlQoKCJldmVudDogZ290IGVtcHR5IGV2ZW50XG4iKSk7Ci0KLQkJCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fRU1QVFkpIHsKLQkJCQljaC0+Y2hfdHVuLnVuX2ZsYWdzICY9IH5VTl9FTVBUWTsKLQkJCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0lTT1BFTikgewotCQkJCQlpZiAoKGNoLT5jaF90dW4udW5fdHR5LT5mbGFncyAmCi0JCQkJCSAgICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzEpCi0JCQkJCQljaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKQotI2Vsc2UKLQkJCQkJCWNoLT5jaF90dW4udW5fdHR5LT5sZGlzYy5vcHMtPndyaXRlX3dha2V1cCkKLSNlbmRpZgotCQkJCQl7Ci0JCQkJCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzEpCi0JCQkJCQkoY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkoY2gtPmNoX3R1bi51bl90dHkpOwotI2Vsc2UKLQkJCQkJCShjaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApKGNoLT5jaF90dW4udW5fdHR5KTsKLSNlbmRpZgotCQkJCQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJCQl9Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl90dHktPndyaXRlX3dhaXQpOwotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fZmxhZ3Nfd2FpdCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2gtPmNoX3B1bi51bl9mbGFncyAmIFVOX0VNUFRZKSB7Ci0JCQkJY2gtPmNoX3B1bi51bl9mbGFncyAmPSB+VU5fRU1QVFk7Ci0JCQkJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHsKLQkJCQkJaWYgKChjaC0+Y2hfcHVuLnVuX3R0eS0+ZmxhZ3MgJgotCQkJCQkgICAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkKLSNlbHNlCi0JCQkJCQljaC0+Y2hfcHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApCi0jZW5kaWYKLQkJCQkJewotCQkJCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJKGNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKGNoLT5jaF9wdW4udW5fdHR5KTsKLSNlbHNlCi0JCQkJCQkoY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0jZW5kaWYKLQkJCQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJfQotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9wdW4udW5fdHR5LT53cml0ZV93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOwotCQkJCX0KLQkJCX0KLQotCi0JCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfV0VNUFRZKSB7Ci0JCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9XRU1QVFk7Ci0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7Ci0JCQl9Ci0JCX0KLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi1uZXh0OgotCQl0YWlsID0gKHRhaWwgKyA0KSAmIChFVk1BWCAtIEVWU1RBUlQgLSA0KTsKLQl9Ci0KLQl3cml0ZXcodGFpbCwgJihlYWRkci0+ZXZfdGFpbCkpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2ZlcDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhYmM0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2ZlcDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICoqKglGRVAgVmVyc2lvbiA1IGRlcGVuZGVudCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0RHQVBfRkVQNV9ICi0jZGVmaW5lIF9fREdBUF9GRVA1X0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICBGRVAgbWVtb3J5IG9mZnNldHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNUQVJUICAgICAgICAgICAweDAwMDRMICAgICAgICAgLyogRXhlY3V0aW9uIHN0YXJ0IGFkZHJlc3MgICAgICAqLwotCi0jZGVmaW5lIENNREJVRiAgICAgICAgICAweDBkMTBMICAgICAgICAgLyogQ29tbWFuZCAoY21fdCkgc3RydWN0dXJlIG9mZnNldCAqLwotI2RlZmluZSBDTURTVEFSVCAgICAgICAgMHgwNDAwTCAgICAgICAgIC8qIFN0YXJ0IG9mIGNvbW1hbmQgYnVmZmVyICAgICAgKi8gICAKLSNkZWZpbmUgQ01ETUFYICAgICAgICAgIDB4MDgwMEwgICAgICAgICAvKiBFbmQgb2YgY29tbWFuZCBidWZmZXIgICAgICAgICovCi0KLSNkZWZpbmUgRVZCVUYgICAgICAgICAgIDB4MGQxOEwgICAgICAgICAvKiBFdmVudCAoZXZfdCkgc3RydWN0dXJlICAgICAgICovCi0jZGVmaW5lIEVWU1RBUlQgICAgICAgICAweDA4MDBMICAgICAgICAgLyogU3RhcnQgb2YgZXZlbnQgYnVmZmVyICAgICAgICAqLwotI2RlZmluZSBFVk1BWCAgICAgICAgICAgMHgwYzAwTCAgICAgICAgIC8qIEVuZCBvZiBldmVudCBidWZmZXIgICAgICAgICAgKi8KLSNkZWZpbmUgRkVQNV9QTFVTICAgICAgIDB4MEU0MCAgICAgICAgICAvKiBBU0NJSSAnNScgYW5kIEFTQ0lJICdBJyBpcyBoZXJlICAqLwotI2RlZmluZSBFQ1NfU0VHICAgICAgICAgMHgwRTQ0ICAgICAgICAgIC8qIFNlZ21lbnQgb2YgdGhlIGV4dGVuZGVkIGNoYW5uZWwgc3RydWN0dXJlICovCi0jZGVmaW5lIExJTkVfU1BFRUQgICAgICAweDEwICAgICAgICAgICAgLyogT2Zmc2V0IGludG8gRUNTX1NFRyBmb3IgbGluZSBzcGVlZCAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGZlcCBoYXMgZXh0ZW5kZWQgY2FwYWJpbGl0aWVzICovCi0KLS8qIEJJT1MgTUFHSUMgU1BPVFMgKi8KLSNkZWZpbmUgRVJST1IgICAgICAgICAgIDB4MEMxNEwJCS8qIEJJT1MgZXJyb3IgY29kZSAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0VRVUVOQ0UJMHgwQzEyTAkJLyogQklPUyBzZXF1ZW5jZSBpbmRpY2F0b3IgICAgICAqLwotI2RlZmluZSBQT1NUQVJFQQkweDBDMDBMCQkvKiBQT1NUIGNvbXBsZXRlIG1lc3NhZ2UgYXJlYSAgICovCi0KLS8qIEZFUCBNQUdJQyBTUE9UUyAqLwotI2RlZmluZSBGRVBTVEFUICAgICAgICAgUE9TVEFSRUEgICAgICAgIC8qIE9TIGhlcmUgd2hlbiBGRVAgY29tZXMgdXAgICAgKi8KLSNkZWZpbmUgTkNIQU4gICAgICAgICAgIDB4MEMwMkwgICAgICAgICAvKiBudW1iZXIgb2YgcG9ydHMgRkVQIHNlZXMgICAgICovCi0jZGVmaW5lIFBBTklDICAgICAgICAgICAweDBDMTBMICAgICAgICAgLyogUEFOSUMgYXJlYSBmb3IgRkVQICAgICAgICAgICAqLwotI2RlZmluZSBLTUVNRU0gICAgICAgICAgMHgwQzMwTCAgICAgICAgIC8qIE1lbW9yeSBmb3IgS01FIHVzZSAgICAgICAgICAgKi8gICAKLSNkZWZpbmUgQ09ORklHICAgICAgICAgIDB4MENEMEwgICAgICAgICAvKiBDb25jZW50cmF0b3IgY29uZmlndXJhdGlvbiBpbmZvICovCi0jZGVmaW5lIENPTkZJR1NJWkUgICAgICAweDAwMzAgICAgICAgICAgLyogY29uZmlndXJhdGlvbiBpbmZvIHNpemUgICAgICAqLwotI2RlZmluZSBET1dOUkVRICAgICAgICAgMHgwRDAwICAgICAgICAgIC8qIERvd25sb2FkIHJlcXVlc3QgYnVmZmVyIHBvaW50ZXIgKi8KLQotI2RlZmluZSBDSEFOQlVGICAgICAgICAgMHgxMDAwTCAgICAgICAgIC8qIEFzeW5jIGNoYW5uZWwgKGJzX3QpIHN0cnVjdHMgKi8KLSNkZWZpbmUgRkVQT1NTSVpFICAgICAgIDB4MUZGRiAgICAgICAgICAvKiA4SyBGRVBPUyAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgWEVNUE9SVFMgICAgMHhDMDIJLyoKLQkJCQkgKiBPZmZzZXQgaW4gYm9hcmQgbWVtb3J5IHdoZXJlIEZFUDUgc3RvcmVzCi0JCQkJICogaG93IG1hbnkgcG9ydHMgaXQgaGFzIGRldGVjdGVkLgotCQkJCSAqIE5PVEU6IEZFUDUgcmVwb3J0cyA2NCBwb3J0cyB3aGVuIHRoZSB1c2VyCi0JCQkJICogaGFzIHRoZSBjYWJsZSBpbiBFQkkgT1VUIGluc3RlYWQgb2YgRUJJIElOLgotCQkJCSAqLwotCi0jZGVmaW5lIEZFUENMUiAgICAgIDB4MDAKLSNkZWZpbmUgRkVQTUVNICAgICAgMHgwMiAKLSNkZWZpbmUgRkVQUlNUICAgICAgMHgwNCAKLSNkZWZpbmUgRkVQSU5UICAgICAgMHgwOAotI2RlZmluZSBGRVBNQVNLICAgICAweDBlCi0jZGVmaW5lIEZFUFdJTiAgICAgIDB4ODAKLQotI2RlZmluZSBMT1dNRU0gICAgICAweDAxMDAKLSNkZWZpbmUgSElHSE1FTSAgICAgMHg3ZjAwCi0KLSNkZWZpbmUgRkVQVElNRU9VVCAyMDAwMDAKLQotI2RlZmluZSBFTkFCTEVfSU5UUgkJMHgwZTA0CQkvKiBFbmFibGUgaW50ZXJydXB0cyBmbGFnICovCi0jZGVmaW5lIEZFUFBPTExfTUlOCQkxCQkvKiBtaW5pbXVtIG9mIDEgbWlsbGlzZWNvbmQgKi8gIAotI2RlZmluZSBGRVBQT0xMX01BWAkJMjAJCS8qIG1heGltdW0gb2YgMjAgbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIEZFUFBPTEwJCQkweDBjMjYJCS8qIEZlcCBldmVudCBwb2xsIGludGVydmFsICovICAgCi0KLSNkZWZpbmUJSUFMVFBJTgkJCTB4MDA4MAkJLyogSW5wdXQgZmxhZyB0byBzd2FwIERTUiA8LT4gRENEICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBDb21tYW5kIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBjbV90IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV9oZWFkOwkvKiBDb21tYW5kIGJ1ZmZlciBoZWFkIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX3RhaWw7CS8qIENvbW1hbmQgYnVmZmVyIHRhaWwgb2Zmc2V0CSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21fc3RhcnQ7CS8qIHN0YXJ0IG9mZnNldCBvZiBidWZmZXIJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV9tYXg7CQkvKiBsYXN0IG9mZnNldCBvZiBidWZmZXIJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEV2ZW50IHN0cnVjdHVyZSBkZWZpbml0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBldl90IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl9oZWFkOwkvKiBDb21tYW5kIGJ1ZmZlciBoZWFkIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X3RhaWw7CS8qIENvbW1hbmQgYnVmZmVyIHRhaWwgb2Zmc2V0CSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfc3RhcnQ7CS8qIHN0YXJ0IG9mZnNldCBvZiBidWZmZXIJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl9tYXg7CQkvKiBsYXN0IG9mZnNldCBvZiBidWZmZXIJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERvd25sb2FkIGJ1ZmZlciBzdHJ1Y3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGRvd25sZF90IHsKLQl1Y2hhcglkbF90eXBlOwkJLyogSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVjaGFyCWRsX3NlcTsJCQkvKiBEb3dubG9hZCBzZXF1ZW5jZSAgICAgICAgICAgICovCi0JdXNob3J0CWRsX3NyZXY7CQkvKiBTb2Z0d2FyZSByZXZpc2lvbiBudW1iZXIgICAgICovCi0JdXNob3J0CWRsX2xyZXY7CQkvKiBMb3cgcmV2aXNpb24gbnVtYmVyICAgICAgICAgICovCi0JdXNob3J0CWRsX2hyZXY7CQkvKiBIaWdoIHJldmlzaW9uIG51bWJlciAgICAgICAgICovCi0JdXNob3J0CWRsX3NlZzsJCQkvKiBTdGFydCBzZWdtZW50IGFkZHJlc3MgICAgICAgICovCi0JdXNob3J0CWRsX3NpemU7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gZG93bmxvYWQgICovCi0JdWNoYXIJZGxfZGF0YVsxMDI0XTsJCS8qIERvd25sb2FkIGRhdGEgICAgICAgICAgICAgICAgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBQZXIgY2hhbm5lbCBidWZmZXIgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgQmFzZSBTdHJ1Y3R1cmUgRW50cmllcyBVc2FnZSBNZWFuaW5ncyB0byBIb3N0ICAgICAgICAgICAqIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqICAgICAgICBXID0gcmVhZCB3cml0ZSAgICAgICAgUiA9IHJlYWQgb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiAgICAgICAgQyA9IGNoYW5nZWQgYnkgY29tbWFuZHMgb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgIFUgPSB1bmtub3duIChtYXkgYmUgY2hhbmdlZCB3L28gbm90aWNlKSAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBic190IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHBfam1wOwkvKiBUcmFuc21pdCBwb2xsIGp1bXAJCSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0Y19qbXA7CS8qIENvb2tlZCBwcm9jZWR1cmUganVtcAkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcmlfam1wOwkvKiBOb3QgY3VycmVudGx5IHVzZWQJCSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBycF9qbXA7CS8qIFJlY2VpdmUgcG9sbCBqdW1wCQkgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9zZWc7CS8qIFcgIFR4IHNlZ21lbnQJICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X2hlYWQ7CS8qIFcgIFR4IGJ1ZmZlciBoZWFkIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF90YWlsOwkvKiBSICBUeCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfbWF4OwkvKiBXICBUeCBidWZmZXIgc2l6ZSAtIDEJICovCi0gCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X3NlZzsJLyogVyAgUnggc2VnbWVudAkJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfaGVhZDsJLyogVyAgUnggYnVmZmVyIGhlYWQgb2Zmc2V0CSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X3RhaWw7CS8qIFIgIFJ4IGJ1ZmZlciB0YWlsIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9tYXg7CS8qIFcgIFJ4IGJ1ZmZlciBzaXplIC0gMQkgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9sdzsJCS8qIFcgIFR4IGJ1ZmZlciBsb3cgd2F0ZXIgbWFyayAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfbHc7CQkvKiBXICBSeCBidWZmZXIgbG93IHdhdGVyIG1hcmsgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2h3OwkJLyogVyAgUnggYnVmZmVyIGhpZ2ggd2F0ZXIgbWFyayAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBpbmNyOwkJLyogVyAgSW5jcmVtZW50IHRvIG5leHQgY2hhbm5lbCAqLwotCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGZlcGRldjsJLyogVSAgU0NDIGRldmljZSBiYXNlIGFkZHJlc3MgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgZWRlbGF5OwkvKiBXICBFeGNlcHRpb24gZGVsYXkgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBibGVuOwkJLyogVyAgQnJlYWsgbGVuZ3RoICAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBidGltZTsJCS8qIFUgIEJyZWFrIGNvbXBsZXRlIHRpbWUgICAgICAgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBpZmxhZzsJCS8qIEMgIFVOSVggaW5wdXQgZmxhZ3MgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgb2ZsYWc7CQkvKiBDICBVTklYIG91dHB1dCBmbGFncyAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGNmbGFnOwkJLyogQyAgVU5JWCBjb250cm9sIGZsYWdzICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB3ZmlsbFsxM107CS8qIFUgIFJlc2VydmVkIGZvciBleHBhbnNpb24gICAgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBudW07CQkvKiBVICBDaGFubmVsIG51bWJlciAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHJhY3Q7CQkvKiBVICBSZWNlaXZlciBhY3RpdmUgY291bnRlciAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGJzdGF0OwkJLyogVSAgQnJlYWsgc3RhdHVzIGJpdHMgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB0YnVzeTsJCS8qIFcgIFRyYW5zbWl0IGJ1c3kgICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgaWVtcHR5OwkvKiBXICBUcmFuc21pdCBlbXB0eSBldmVudCBlbmFibGUgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgaWxvdzsJCS8qIFcgIFRyYW5zbWl0IGxvdy13YXRlciBldmVudCBlbmFibGUgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgaWRhdGE7CQkvKiBXICBSZWNlaXZlIGRhdGEgaW50ZXJydXB0IGVuYWJsZSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBlZmxhZzsJCS8qIFUgIEhvc3QgZXZlbnQgZmxhZ3MgICAgICAgICAgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB0ZmxhZzsJCS8qIFUgIFRyYW5zbWl0IGZsYWdzICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgcmZsYWc7CQkvKiBVICBSZWNlaXZlIGZsYWdzICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHhtYXNrOwkJLyogVSAgVHJhbnNtaXQgcmVhZHkgZmxhZ3MgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB4dmFsOwkJLyogVSAgVHJhbnNtaXQgcmVhZHkgdmFsdWUgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX3N0YXQ7CS8qIFJDIE1vZGVtIHN0YXR1cyBiaXRzICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG1fY2hhbmdlOwkvKiBVICBNb2RlbSBiaXRzIHdoaWNoIGNoYW5nZWQgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG1faW50OwkJLyogVyAgTW9kZW0gaW50ZXJydXB0IGVuYWJsZSBiaXRzICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG1fbGFzdDsJLyogVSAgTGFzdCBtb2RlbSBzdGF0dXMgICAgICAgICAqLwotCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG10cmFuOwkJLyogQyAgIFVucmVwb3J0ZWQgbW9kZW0gdHJhbnMgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvcnVuOwkJLyogQyAgIEJ1ZmZlciBvdmVycnVuIG9jY3VycmVkICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBhc3RhcnRjOwkvKiBXICAgQXV4aWxpYXJ5IFhvbiBjaGFyICAgICAgICovICAKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYXN0b3BjOwkvKiBXICAgQXV4aWxpYXJ5IFhvZmYgY2hhciAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHN0YXJ0YzsJLyogVyAgIFhvbiBjaGFyYWN0ZXIgICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgc3RvcGM7CQkvKiBXICAgWG9mZiBjaGFyYWN0ZXIgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHZuZXh0YzsJLyogVyAgIFZuZXh0IGNoYXJhY3RlciAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgaGZsb3c7CQkvKiBDICAgU29mdHdhcmUgZmxvdyBjb250cm9sICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgZmlsbGM7CQkvKiBVICAgRGVsYXkgRmlsbCBjaGFyYWN0ZXIgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG9jaGFyOwkJLyogVSAgIFNhdmVkIG91dHB1dCBjaGFyYWN0ZXIgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvbWFzazsJCS8qIFUgICBPdXRwdXQgY2hhcmFjdGVyIG1hc2sgICAgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBiZmlsbFsxM107CS8qIFUgICBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uICAgKi8gIAotCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHNjY1sxNl07CS8qIFUgICBTQ0MgcmVnaXN0ZXJzICAgICAgICAgICAgKi8KLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIAotICogRkVQIHN1cHBvcnRlZCBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNSTE9XCQkweGUwCQkvKiBTZXQgcmVjZWl2ZSBsb3cgd2F0ZXIJKi8KLSNkZWZpbmUgU1JISUdICQkweGUxCQkvKiBTZXQgcmVjZWl2ZSBoaWdoIHdhdGVyCSovCi0jZGVmaW5lIEZMVVNIVFgJCTB4ZTIJCS8qIEZsdXNoIHRyYW5zbWl0IGJ1ZmZlcgkqLwotI2RlZmluZSBQQVVTRVRYCQkweGUzCQkvKiBQYXVzZSBkYXRhIHRyYW5zbWlzc2lvbgkqLwotI2RlZmluZSBSRVNVTUVUWAkweGU0CQkvKiBSZXN1bWUgZGF0YSB0cmFuc21pc3Npb24JKi8KLSNkZWZpbmUgU01JTlQJCTB4ZTUJCS8qIFNldCBNb2RlbSBJbnRlcnJ1cHQJCSovCi0jZGVmaW5lIFNBRkxPV0MJCTB4ZTYJCS8qIFNldCBBdXguIGZsb3cgY29udHJvbCBjaGFycwkqLwotI2RlZmluZSBTQlJFQUsJCTB4ZTgJCS8qIFNlbmQgYnJlYWsJCQkqLwotI2RlZmluZSBTTU9ERU0JCTB4ZTkJCS8qIFNldCA4NTMwIG1vZGVtIGNvbnRyb2wgbGluZXMJKi8gIAotI2RlZmluZSBTSUZMQUcJCTB4ZWEJCS8qIFNldCBVTklYIGlmbGFncwkJKi8KLSNkZWZpbmUgU0ZMT1dDCQkweGViCQkvKiBTZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMJKi8KLSNkZWZpbmUgU1RMT1cJCTB4ZWMJCS8qIFNldCB0cmFuc21pdCBsb3cgd2F0ZXIgbWFyawkqLwotI2RlZmluZSBSUEFVU0UJCTB4ZWUJCS8qIFBhdXNlIHJlY2VpdmUJCSovCi0jZGVmaW5lIFJSRVNVTUUJCTB4ZWYJCS8qIFJlc3VtZSByZWNlaXZlCQkqLyAgCi0jZGVmaW5lIENIUkVTRVQJCTB4ZjAJCS8qIFJlc2V0IENoYW5uZWwJCSovCi0jZGVmaW5lIEJVRlNFVEFMTAkweGYyCQkvKiBTZXQgVHggJiBSeCBidWZmZXIgc2l6ZSBhdmFpbCovCi0jZGVmaW5lIFNPRkxBRwkJMHhmMwkJLyogU2V0IFVOSVggb2ZsYWdzCQkqLwotI2RlZmluZSBTSEZMT1cJCTB4ZjQJCS8qIFNldCBoYXJkd2FyZSBoYW5kc2hha2UJKi8KLSNkZWZpbmUgU0NGTEFHCQkweGY1CQkvKiBTZXQgVU5JWCBjZmxhZ3MJCSovCi0jZGVmaW5lIFNWTkVYVAkJMHhmNgkJLyogU2V0IFZORVhUIGNoYXJhY3RlcgkJKi8KLSNkZWZpbmUgU1BJTlRGQwkJMHhmYwkJLyogUmVzZXJ2ZWQJCQkqLwotI2RlZmluZSBTQ09NTU9ERQkweGZkCQkvKiBTZXQgUlMyMzIvNDIyIG1vZGUJCSovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqCU1vZGVzIGZvciBTQ09NTU9ERQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTU9ERV8yMzIJMHgwMAotI2RlZmluZSBNT0RFXzQyMgkweDAxCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqICAgICAgRXZlbnQgZmxhZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBJRkJSRUFLICAgICAgICAgMHgwMSAgICAgICAgICAgIC8qIEJyZWFrIHJlY2VpdmVkICAgICAgICAgICAgICAgKi8gIAotI2RlZmluZSBJRlRMVyAgICAgICAgICAgMHgwMiAgICAgICAgICAgIC8qIFRyYW5zbWl0IGxvdyB3YXRlciAgICAgICAgICAgKi8KLSNkZWZpbmUgSUZURU0gICAgICAgICAgIDB4MDQgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBlbXB0eSAgICAgICAgICAgICovCi0jZGVmaW5lIElGREFUQSAgICAgICAgICAweDA4ICAgICAgICAgICAgLyogUmVjZWl2ZSBkYXRhIHByZXNlbnQgICAgICAgICAqLwotI2RlZmluZSBJRk1PREVNICAgICAgICAgMHgyMCAgICAgICAgICAgIC8qIE1vZGVtIHN0YXR1cyBjaGFuZ2UgICAgICAgICAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIAotICogICAgICBNb2RlbSBmbGFncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSMgICAgICAgZGVmaW5lICBETV9SVFMgICAgICAgICAgMHgwMiAgICAvKiBSZXF1ZXN0IHRvIHNlbmQgICAgICAgICAgICAgICovCi0jICAgICAgIGRlZmluZSAgRE1fQ0QgICAgICAgICAgIDB4ODAgICAgLyogQ2FycmllciBkZXRlY3QgICAgICAgICAgICAgICAqLwotIyAgICAgICBkZWZpbmUgIERNX0RTUiAgICAgICAgICAweDIwICAgIC8qIERhdGEgc2V0IHJlYWR5ICAgICAgICAgICAgICAgKi8KLSMgICAgICAgZGVmaW5lICBETV9DVFMgICAgICAgICAgMHgxMCAgICAvKiBDbGVhciB0byBzZW5kICAgICAgICAgICAgICAgICovCi0jICAgICAgIGRlZmluZSAgRE1fUkkgICAgICAgICAgIDB4NDAgICAgLyogUmluZyBpbmRpY2F0b3IgICAgICAgICAgICAgICAqLwotIyAgICAgICBkZWZpbmUgIERNX0RUUiAgICAgICAgICAweDAxICAgIC8qIERhdGEgdGVybWluYWwgcmVhZHkgICAgICAgICAgKi8KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfa2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9rY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzI0MDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9rY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKiAgICAgIFNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGNvbnRhaW4gYWxsIHRoZSBrZXJuZWwgImRpZmZlcmVuY2VzIiBiZXR3ZWVuIHRoZQotICogdmFyaW91cyBrZXJuZWxzIHRoYXQgd2Ugc3VwcG9ydC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0RHQVBfS0NPTVBBVF9ICi0jZGVmaW5lIF9fREdBUF9LQ09NUEFUX0gKLQotI2lmICFkZWZpbmVkKFRUWV9GTElQQlVGX1NJWkUpCi0jIGRlZmluZSBUVFlfRkxJUEJVRl9TSVpFIDUxMgotI2VuZGlmCi0KLQotLyogU3BhcnNlIHN0dWZmICovCi0jIGlmbmRlZiBfX3VzZXIKLSMgIGRlZmluZSBfX3VzZXIKLSMgIGRlZmluZSBfX2tlcm5lbAotIyAgZGVmaW5lIF9fc2FmZQotIyAgZGVmaW5lIF9fZm9yY2UKLSMgIGRlZmluZSBfX2Noa191c2VyX3B0cih4KSAodm9pZCkwCi0jIGVuZGlmCi0KLQotIyAgZGVmaW5lIFBBUk1fU1RSKFZBUiwgSU5JVCwgUEVSTSwgREVTQykgXAotCQlzdGF0aWMgY2hhciAqVkFSID0gSU5JVDsgXAotCQljaGFyICpkZ2FwXyMjVkFSOyBcCi0JCW1vZHVsZV9wYXJhbShWQVIsIGNoYXJwLCBQRVJNKTsgXAotCQlNT0RVTEVfUEFSTV9ERVNDKFZBUiwgREVTQyk7Ci0KLSMgIGRlZmluZSBQQVJNX0lOVChWQVIsIElOSVQsIFBFUk0sIERFU0MpIFwKLQkJc3RhdGljIGludCBWQVIgPSBJTklUOyBcCi0JCWludCBkZ2FwXyMjVkFSOyBcCi0JCW1vZHVsZV9wYXJhbShWQVIsIGludCwgUEVSTSk7IFwKLQkJTU9EVUxFX1BBUk1fREVTQyhWQVIsIERFU0MpOwotCi0jICBkZWZpbmUgUEFSTV9VTE9ORyhWQVIsIElOSVQsIFBFUk0sIERFU0MpIFwKLQkJc3RhdGljIHVsb25nIFZBUiA9IElOSVQ7IFwKLQkJdWxvbmcgZGdhcF8jI1ZBUjsgXAotCQltb2R1bGVfcGFyYW0oVkFSLCBsb25nLCBQRVJNKTsgXAotCQlNT0RVTEVfUEFSTV9ERVNDKFZBUiwgREVTQyk7Ci0KLSNlbmRpZiAvKiAhIF9fREdBUF9LQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmZDkzZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEgCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uIAotICoJVGhhbmsgeW91LgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBkZ2FwX3BhcnNlLmMgLSBQYXJzZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqCi0gKiAkSWQ6IGRnYXBfcGFyc2UuYyx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiCi0jaW5jbHVkZSAiZGdhcF9mZXA1LmgiCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLSNpbmNsdWRlICJkZ2FwX3BhcnNlLmgiCi0jaW5jbHVkZSAiZGdhcF9jb25mLmgiCi0KLQotLyoKLSAqIEZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9nZXR0b2soY2hhciAqKmluLCBzdHJ1Y3QgY25vZGUgKnApOwotc3RhdGljIGNoYXIgKmRnYXBfZ2V0d29yZChjaGFyICoqaW4pOwotc3RhdGljIGNoYXIgKmRnYXBfc2F2ZXN0cmluZyhjaGFyICpzKTsKLXN0YXRpYyBzdHJ1Y3QgY25vZGUgKmRnYXBfbmV3bm9kZShpbnQgdCk7Ci1zdGF0aWMgaW50IGRnYXBfY2hlY2tub2RlKHN0cnVjdCBjbm9kZSAqcCk7Ci1zdGF0aWMgdm9pZCBkZ2FwX2VycihjaGFyICpzKTsKLQotLyoKLSAqIE91ciBuZWVkZWQgaW50ZXJuYWwgc3RhdGljIHZhcmlhYmxlcy4uLgotICovCi1zdGF0aWMgc3RydWN0IGNub2RlIGRnYXBfaGVhZDsKLSNkZWZpbmUgTUFYQ1dPUkQgMjAwCi1zdGF0aWMgY2hhciBkZ2FwX2N3b3JkW01BWENXT1JEXTsKLQotc3RydWN0IHRva2xpc3QgewotCWludAl0b2tlbjsKLQljaGFyCSpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHRva2xpc3QgZGdhcF90bGlzdFtdID0gewotCXsJQkVHSU4sCQkiY29uZmlnX2JlZ2luIgkJCX0sCi0JewlFTkQsCQkiY29uZmlnX2VuZCIJCQl9LAotCXsJQk9BUkQsCQkiYm9hcmQiCQkJCX0sCi0JewlQQ1gsCQkiRGlnaV9BY2NlbGVQb3J0X0MvWF9QQ0kiCX0sCS8qIEMvWF9QQ0kgKi8KLQl7CVBFUEMsCQkiRGlnaV9BY2NlbGVQb3J0X0VQQy9YX1BDSSIJfSwJLyogRVBDL1hfUENJICovCi0JewlQUENNLAkJIkRpZ2lfQWNjZWxlUG9ydF9YZW1fUENJIgl9LAkvKiBQQ0kvWGVtICovCi0JewlBUE9SVDJfOTIwUCwJIkRpZ2lfQWNjZWxlUG9ydF8ycl85MjBfUENJIgl9LAotCXsJQVBPUlQ0XzkyMFAsCSJEaWdpX0FjY2VsZVBvcnRfNHJfOTIwX1BDSSIJfSwKLQl7CUFQT1JUOF85MjBQLAkiRGlnaV9BY2NlbGVQb3J0XzhyXzkyMF9QQ0kiCX0sCi0JewlQQVBPUlQ0LAkiRGlnaV9BY2NlbGVQb3J0XzRyX1BDSShFSUEtMjMyL1JTLTQyMikiIH0sCi0JewlQQVBPUlQ4LAkiRGlnaV9BY2NlbGVQb3J0XzhyX1BDSShFSUEtMjMyL1JTLTQyMikiIH0sCi0JewlJTywJCSJpbyIJCQkJfSwKLQl7CVBDSUlORk8sCSJwY2lpbmZvIgkJCX0sCi0JewlMSU5FLAkJImxpbmUiCQkJCX0sCi0JewlDT05DLAkJImNvbmMiCQkJCX0sCi0JewlDT05DLAkJImNvbmNlbnRyYXRvciIJCQl9LAotCXsJQ1gsCQkiY3giCQkJCX0sCi0JewlDWCwJCSJjY29uIgkJCQl9LAotCXsJRVBDLAkJImVwY2NvbiIJCQl9LAotCXsJRVBDLAkJImVwYyIJCQkJfSwKLQl7CU1PRCwJCSJtb2R1bGUiCQkJfSwKLQl7CUlELAkJImlkIgkJCQl9LAotCXsJU1RBUlRPLAkJInN0YXJ0IgkJCQl9LAotCXsJU1BFRUQsCQkic3BlZWQiCQkJCX0sCi0JewlDQUJMRSwJCSJjYWJsZSIJCQkJfSwKLQl7CUNPTk5FQ1QsCSJjb25uZWN0IgkJCX0sCi0JewlNRVRIT0QsCQkibWV0aG9kIgkJCX0sCi0JewlTVEFUVVMsCQkic3RhdHVzIgkJCX0sCi0JewlDVVNUT00sCQkiQ3VzdG9tIgkJCX0sCi0JewlCQVNJQywJCSJCYXNpYyIJCQkJfSwKLQl7CU1FTSwJCSJtZW0iCQkJCX0sCi0JewlNRU0sCQkibWVtb3J5IgkJCX0sCi0JewlQT1JUUywJCSJwb3J0cyIJCQkJfSwKLQl7CU1PREVNLAkJIm1vZGVtIgkJCQl9LAotCXsJTlBPUlRTLAkJIm5wb3J0cyIJCQl9LAotCXsJVFRZTiwJCSJ0dHluYW1lIgkJCX0sCi0JewlDVSwJCSJjdW5hbWUiCQkJfSwKLQl7CVBSSU5ULAkJInBybmFtZSIJCQl9LAotCXsJQ01BSk9SLAkJIm1ham9yIgkJCQl9LAotCXsJQUxUUElOLAkJImFsdHBpbiIJCQl9LAotCXsJVVNFSU5UUiwJInVzZWludHIiCQkJfSwKLQl7CVRUU0laLAkJInR0eXNpemUiCQkJfSwKLQl7CUNIU0laLAkJImNoc2l6ZSIJCQl9LAotCXsJQlNTSVosCQkiYm9hcmRzaXplIgkJCX0sCi0JewlVTlRTSVosCQkic2NoZWRzaXplIgkJCX0sCi0JewlGMlNJWiwJCSJmMjIwMHNpemUiCQkJfSwKLQl7CVZQU0laLAkJInZwaXhzaXplIgkJCX0sCi0JewkwLAkJTlVMTAkJCQl9Ci19OwotCi0KLS8qCi0gKiBQYXJzZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkIGludG8gbWVtb3J5IGFzIGEgc3RyaW5nLgotICovCi1pbnQJZGdhcF9wYXJzZWZpbGUoY2hhciAqKmluLCBpbnQgUmVtb3ZlKQotewotCXN0cnVjdCBjbm9kZSAqcCwgKmJyZCwgKmxpbmUsICpjb25jOwotCWludAlyYzsKLQljaGFyCSpzID0gTlVMTCwgKnMyID0gTlVMTDsKLQlpbnQJbGluZWNudCA9IDA7Ci0KLQlwID0gJmRnYXBfaGVhZDsKLQlicmQgPSBsaW5lID0gY29uYyA9IE5VTEw7Ci0KLQkvKiBwZXJoYXBzIHdlIGFyZSBhZGRpbmcgdG8gYW4gZXhpc3RpbmcgbGlzdD8gKi8KLQl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKSB7Ci0JCXAgPSBwLT5uZXh0OwotCX0KLQotCS8qIGZpbGUgbXVzdCBzdGFydCB3aXRoIGEgQkVHSU4gKi8KLQl3aGlsZSAoIChyYyA9IGRnYXBfZ2V0dG9rKGluLHApKSAhPSBCRUdJTiApIHsKLQkJaWYgKHJjID09IDApIHsKLQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIEVPRiIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQotCWZvciAoOyA7ICkgewotCQlyYyA9IGRnYXBfZ2V0dG9rKGluLHApOwotCQlpZiAocmMgPT0gMCkgewotCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRU9GIik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0KLQkJc3dpdGNoIChyYykgewotCQljYXNlIDA6Ci0JCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJcmV0dXJuKC0xKTsKLQotCQljYXNlIEJFR0lOOgkvKiBzaG91bGQgb25seSBiZSAxIGJlZ2luICovCi0JCQlkZ2FwX2VycigidW5leHBlY3RlZCBjb25maWdfYmVnaW5cbiIpOwotCQkJcmV0dXJuKC0xKTsKLQotCQljYXNlIEVORDoKLQkJCXJldHVybigwKTsKLQotCQljYXNlIEJPQVJEOgkvKiBib2FyZCBpbmZvICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoQk5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCi0JCQlwLT51LmJvYXJkLnN0YXR1cyA9IGRnYXBfc2F2ZXN0cmluZygiTm8iKTsKLQkJCWxpbmUgPSBjb25jID0gTlVMTDsKLQkJCWJyZCA9IHA7Ci0JCQlsaW5lY250ID0gLTE7Ci0JCQlicmVhazsKLQotCQljYXNlIEFQT1JUMl85MjBQOgkvKiBBY2NlbGVQb3J0XzQgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV8ycl85MjAgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IEFQT1JUMl85MjBQOwotCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgRGlnaV8ycl85MjAgUENJIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUE9SVDRfOTIwUDoJLyogQWNjZWxlUG9ydF80ICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfNHJfOTIwIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBBUE9SVDRfOTIwUDsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIERpZ2lfNHJfOTIwIFBDSSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVBPUlQ4XzkyMFA6CS8qIEFjY2VsZVBvcnRfOCAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzhyXzkyMCBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ4XzkyMFA7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBEaWdpXzhyXzkyMCBQQ0kgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBBUE9SVDQ6CS8qIEFjY2VsZVBvcnRfNCBQQ0kgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV80cihQQ0kpIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBQQVBPUlQ0OwotCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgRGlnaV80ciBQQ0kgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBBUE9SVDg6CS8qIEFjY2VsZVBvcnRfOCBQQ0kgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84ciBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gUEFQT1JUODsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIERpZ2lfOHIgUENJIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQ1g6CS8qIFBDSSBDL1ggKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV9DL1hfKFBDSSkgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IFBDWDsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOwotCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7Ci0JCQlwLT51LmJvYXJkLm1vZHVsZTEgPSAwOwotCQkJcC0+dS5ib2FyZC5tb2R1bGUyID0gMDsKLQkJCURQUl9JTklUKCgiQWRkaW5nIFBDSSBDL1ggdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBFUEM6CS8qIFBDSSBFUEMvWCAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBcIkRpZ2lfRVBDL1hfKFBDSSlcIiBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gUEVQQzsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOwotCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7Ci0JCQlwLT51LmJvYXJkLm1vZHVsZTEgPSAwOwotCQkJcC0+dS5ib2FyZC5tb2R1bGUyID0gMDsKLQkJCURQUl9JTklUKCgiQWRkaW5nIFBDSSBFUEMvWCB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUFBDTToJLyogUENJL1hlbSAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBQQ0kvWGVtIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBQUENNOwotCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOwotCQkJcC0+dS5ib2FyZC5jb25jMSA9IDA7Ci0JCQlwLT51LmJvYXJkLmNvbmMyID0gMDsKLQkJCURQUl9JTklUKCgiQWRkaW5nIFBDSSBYRU0gdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIElPOgkvKiBpL28gcG9ydCAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigiSU8gcG9ydCBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC5wb3J0c3RyID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJcC0+dS5ib2FyZC5wb3J0ID0gKHNob3J0KXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoc2hvcnQpc3RybGVuKHMpID4gKHNob3J0KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIElPIHBvcnQiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC52X3BvcnQgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgSU8gKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUVNOgkvKiBtZW1vcnkgYWRkcmVzcyAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigibWVtb3J5IGFkZHJlc3Mgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQuYWRkcnN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCXAtPnUuYm9hcmQuYWRkciA9IHNpbXBsZV9zdHJ0b3VsKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG1lbW9yeSBhZGRyZXNzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudl9hZGRyID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIE1FTSAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQ0lJTkZPOgkvKiBwY2kgaW5mb3JtYXRpb24gKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoIm1lbW9yeSBhZGRyZXNzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnBjaWJ1c3N0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCXAtPnUuYm9hcmQucGNpYnVzID0gc2ltcGxlX3N0cnRvdWwocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgcGNpIGJ1cyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnZfcGNpYnVzID0gMTsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQucGNpc2xvdHN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCXAtPnUuYm9hcmQucGNpc2xvdCA9IHNpbXBsZV9zdHJ0b3VsKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHBjaSBzbG90Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudl9wY2lzbG90ID0gMTsKLQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgUENJSU5GTyAoJXMgJXMpIHRvIGNvbmZpZy4uLlxuIiwgcC0+dS5ib2FyZC5wY2lidXNzdHIsIAotCQkJCXAtPnUuYm9hcmQucGNpc2xvdHN0cikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRVRIT0Q6Ci0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJpbnN0YWxsIG1ldGhvZCBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC5tZXRob2QgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLnZfbWV0aG9kID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIE1FVEhPRCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEFUVVM6Ci0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJjb25maWcgc3RhdHVzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnN0YXR1cyA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIFNUQVRVUyAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOUE9SVFM6CS8qIG51bWJlciBvZiBwb3J0cyAqLwotCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuYm9hcmQubnBvcnQgPSAoY2hhcilzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuYm9hcmQudl9ucG9ydCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5ucG9ydCA9IChjaGFyKXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5jb25jLnZfbnBvcnQgPSAxOwotCQkJfSBlbHNlIGlmIChwLT50eXBlID09IE1OT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51Lm1vZHVsZS5ucG9ydCA9IChjaGFyKXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5tb2R1bGUudl9ucG9ydCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWRnYXBfZXJyKCJucG9ydHMgb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyBvciBtb2R1bGVzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIE5QT1JUUyAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRDoJLyogbGV0dGVyIElEIHVzZWQgaW4gdHR5IG5hbWUgKi8KLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQotCQkJcC0+dS5ib2FyZC5zdGF0dXMgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0KLQkJCWlmIChwLT50eXBlID09IENOT0RFKSB7Ci0JCQkJcC0+dS5jb25jLmlkID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJCXAtPnUuY29uYy52X2lkID0gMTsKLQkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBNTk9ERSkgewotCQkJCXAtPnUubW9kdWxlLmlkID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJCXAtPnUubW9kdWxlLnZfaWQgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlkZ2FwX2VycigiaWQgb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyBvciBtb2R1bGVzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIElEICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNUQVJUTzoJLyogc3RhcnQgb2Zmc2V0IG9mIElEICovCi0JCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgewotCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5ib2FyZC5zdGFydCA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5ib2FyZC52X3N0YXJ0ID0gMTsKLQkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBDTk9ERSkgewotCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5jb25jLnN0YXJ0ID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmNvbmMudl9zdGFydCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gTU5PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUubW9kdWxlLnN0YXJ0ID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51Lm1vZHVsZS52X3N0YXJ0ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGdhcF9lcnIoInN0YXJ0IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBTVEFSVCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUVFlOOgkvKiB0dHkgbmFtZSBwcmVmaXggKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShUTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlpZiAoIChzID0gZGdhcF9nZXR3b3JkKGluKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPnUudHR5bmFtZSA9IGRnYXBfc2F2ZXN0cmluZyhzKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBUVFkgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ1U6CS8qIGN1IG5hbWUgcHJlZml4ICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ1VOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCWlmICggKHMgPSBkZ2FwX2dldHdvcmQoaW4pKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJaWYgKCAocC0+dS5jdW5hbWUgPSBkZ2FwX3NhdmVzdHJpbmcocykpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ1UgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTElORToJLyogbGluZSBpbmZvcm1hdGlvbiAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoYnJkID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGJvYXJkIGJlZm9yZSBsaW5lIGluZm8iKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJc3dpdGNoIChicmQtPnUuYm9hcmQudHlwZSkgewotCQkJY2FzZSBQUENNOgotCQkJCWRnYXBfZXJyKCJsaW5lIG5vdCB2YWlsZCBmb3IgUEMvZW0iKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShMTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQljb25jID0gTlVMTDsKLQkJCWxpbmUgPSBwOwotCQkJbGluZWNudCsrOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgTElORSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ09OQzoJLyogY29uY2VudHJhdG9yIGluZm9ybWF0aW9uICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmIChsaW5lID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGxpbmUgaW5mbyBiZWZvcmUgY29uY2VudHJhdG9yIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ05PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJY29uYyA9IHA7Ci0JCQlpZiAobGluZWNudCkKLQkJCQlicmQtPnUuYm9hcmQuY29uYzIrKzsKLQkJCWVsc2UKLQkJCQlicmQtPnUuYm9hcmQuY29uYzErKzsKLQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ09OQyB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ1g6CS8qIGMveCB0eXBlIGNvbmNlbnRyYXRvciAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQ05PREUpIHsKLQkJCQlkZ2FwX2VycigiY3ggb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmNvbmMudHlwZSA9IENYOwotCQkJcC0+dS5jb25jLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBDWCB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRVBDOgkvKiBlcGMgdHlwZSBjb25jZW50cmF0b3IgKi8KLQkJCWlmIChwLT50eXBlICE9IENOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoImN4IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5jb25jLnR5cGUgPSBFUEM7Ci0JCQlwLT51LmNvbmMudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIEVQQyB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTU9EOgkvKiBFQkkgbW9kdWxlICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmIChicmQgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJtdXN0IHNwZWNpZnkgYm9hcmQgaW5mbyBiZWZvcmUgRUJJIG1vZHVsZXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJc3dpdGNoIChicmQtPnUuYm9hcmQudHlwZSkgewotCQkJY2FzZSBQUENNOgotCQkJCWxpbmVjbnQgPSAwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoY29uYyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJtdXN0IHNwZWNpZnkgY29uY2VudHJhdG9yIGluZm8gYmVmb3JlIEVCSSBtb2R1bGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKE1OT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCWlmIChsaW5lY250KQotCQkJCWJyZC0+dS5ib2FyZC5tb2R1bGUyKys7Ci0JCQllbHNlCi0JCQkJYnJkLT51LmJvYXJkLm1vZHVsZTErKzsKLQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgTU9EIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUUzoJLyogcG9ydHMgdHlwZSBFQkkgbW9kdWxlICovCi0JCQlpZiAocC0+dHlwZSAhPSBNTk9ERSkgewotCQkJCWRnYXBfZXJyKCJwb3J0cyBvbmx5IHZhbGlkIGZvciBFQkkgbW9kdWxlcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51Lm1vZHVsZS50eXBlID0gUE9SVFM7Ci0JCQlwLT51Lm1vZHVsZS52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgUE9SVFMgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1PREVNOgkvKiBwb3J0cyB0eXBlIEVCSSBtb2R1bGUgKi8KLQkJCWlmIChwLT50eXBlICE9IE1OT0RFKSB7Ci0JCQkJZGdhcF9lcnIoIm1vZGVtIG9ubHkgdmFsaWQgZm9yIG1vZGVtIG1vZHVsZXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5tb2R1bGUudHlwZSA9IE1PREVNOwotCQkJcC0+dS5tb2R1bGUudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIE1PREVNIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQUJMRToKLQkJCWlmIChwLT50eXBlID09IExOT0RFKSB7Ci0JCQkJaWYgKChzID0gZGdhcF9nZXR3b3JkKGluKSkgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmxpbmUuY2FibGUgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQkJcC0+dS5saW5lLnZfY2FibGUgPSAxOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ0FCTEUgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1BFRUQ6CS8qIHN5bmMgbGluZSBzcGVlZCBpbmRpY2F0aW9uICovCi0JCQlpZiAocC0+dHlwZSA9PSBMTk9ERSkgewotCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5saW5lLnNwZWVkID0gKGNoYXIpc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJCWlmICgoc2hvcnQpc3RybGVuKHMpID4gKHNob3J0KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBsaW5lIHNwZWVkIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUubGluZS52X3NwZWVkID0gMTsKLQkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBDTk9ERSkgewotCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5jb25jLnNwZWVkID0gKGNoYXIpc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJCWlmICgoc2hvcnQpc3RybGVuKHMpID4gKHNob3J0KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBsaW5lIHNwZWVkIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy52X3NwZWVkID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGdhcF9lcnIoInNwZWVkIHZhbGlkIG9ubHkgZm9yIGxpbmVzIG9yIGNvbmNlbnRyYXRvcnMuIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFNQRUVEICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENPTk5FQ1Q6Ci0JCQlpZiAocC0+dHlwZSA9PSBDTk9ERSkgewotCQkJCWlmICgocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5jb25jLmNvbm5lY3QgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQkJcC0+dS5jb25jLnZfY29ubmVjdCA9IDE7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBDT05ORUNUICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQUklOVDoJLyogdHJhbnNwYXJlbnQgcHJpbnQgbmFtZSBwcmVmaXggKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShQTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlpZiAoIChzID0gZGdhcF9nZXR3b3JkKGluKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPnUucHJpbnRuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFBSSU5UICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNQUpPUjoJLyogbWFqb3IgbnVtYmVyICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoSk5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5tYWpvcm51bWJlciA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbWFqb3IgbnVtYmVyIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENNQUpPUiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTFRQSU46CS8qIGFsdHBpbiBzZXR0aW5nICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoQU5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5hbHRwaW4gPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGFsdHBpbiIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBBTFRQSU4gKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVVNFSU5UUjoJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgc2V0dGluZyAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKElOVFJOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudXNlaW50ciA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdXNlaW50ciIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBVU0VJTlRSICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFRUU0laOgkvKiBzaXplIG9mIHR0eSBzdHJ1Y3R1cmUgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShUU05PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS50dHlzaXplID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciB0dHlzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFRUU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENIU0laOgkvKiBjaGFubmVsIHN0cnVjdHVyZSBzaXplICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ1NOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuY2hzaXplID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBjaHNpemUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ0hTSVpFICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEJTU0laOgkvKiBib2FyZCBzdHJ1Y3R1cmUgc2l6ZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEJTTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJzc2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgYnNzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIEJTU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVOVFNJWjoJLyogc2NoZWQgc3RydWN0dXJlIHNpemUgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShVU05PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS51bnNpemUgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHNjaGVkc2l6ZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBVTlRTSVogKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRjJTSVo6CS8qIGYyMjAwIHN0cnVjdHVyZSBzaXplICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoRlNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuZjJzaXplID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBmMjIwMHNpemUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgRjJTSVogKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVlBTSVo6CS8qIHZwaXggc3RydWN0dXJlIHNpemUgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShWU05PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS52cGl4c2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdnBpeHNpemUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVlBTSVogKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0KLS8qCi0gKiBkZ2FwX3NpbmRleDogbXVjaCBsaWtlIGluZGV4KCksIGJ1dCBpdCBsb29rcyBmb3IgYSBtYXRjaCBvZiBhbnkgY2hhcmFjdGVyIGluCi0gKiB0aGUgZ3JvdXAsIGFuZCByZXR1cm5zIHRoYXQgcG9zaXRpb24uICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgXiwgdGhlbgotICogdGhpcyB3aWxsIG1hdGNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG5vdCBpbiB0aGF0IGdyb3VwLgotICovCi1zdGF0aWMgY2hhciAqZGdhcF9zaW5kZXggKGNoYXIgKnN0cmluZywgY2hhciAqZ3JvdXApCi17Ci0JY2hhciAgICAqcHRyOwotCi0JaWYgKCFzdHJpbmcgfHwgIWdyb3VwKQotCQlyZXR1cm4gKGNoYXIgKikgTlVMTDsKLQotCWlmICgqZ3JvdXAgPT0gJ14nKSB7ICAgCi0JCWdyb3VwKys7Ci0JCWZvciAoOyAqc3RyaW5nOyBzdHJpbmcrKykgewotCQkJZm9yIChwdHIgPSBncm91cDsgKnB0cjsgcHRyKyspIHsKLQkJCQlpZiAoKnB0ciA9PSAqc3RyaW5nKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgqcHRyID09ICdcMCcpCi0JCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCX0gICAKLQllbHNlIHsKLQkJZm9yICg7ICpzdHJpbmc7IHN0cmluZysrKSB7Ci0JCQlmb3IgKHB0ciA9IGdyb3VwOyAqcHRyOyBwdHIrKykgewotCQkJCWlmICgqcHRyID09ICpzdHJpbmcpCi0JCQkJCXJldHVybiBzdHJpbmc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKGNoYXIgKikgTlVMTDsKLX0KLQotCi0vKgotICogR2V0IGEgdG9rZW4gZnJvbSB0aGUgaW5wdXQgZmlsZTsgcmV0dXJuIDAgaWYgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICovCi1zdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKQotewotCWNoYXIJKnc7Ci0Jc3RydWN0IHRva2xpc3QgKnQ7Ci0JCi0JaWYgKHN0cnN0cihkZ2FwX2N3b3JkLCAiYm9hciIpKSB7Ci0JCXcgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQlzbnByaW50ZihkZ2FwX2N3b3JkLCBNQVhDV09SRCwgIiVzIiwgdyk7Ci0JCWZvciAodCA9IGRnYXBfdGxpc3Q7IHQtPnRva2VuICE9IDA7IHQrKykgewotCQkJaWYgKCAhc3RyY21wKHcsIHQtPnN0cmluZykpIHsKLQkJCQlyZXR1cm4odC0+dG9rZW4pOwotCQkJfSAKLQkJfQotCQlkZ2FwX2VycigiYm9hcmQgISF0eXBlIG5vdCBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuKDEpOwotCX0KLQllbHNlIHsKLQkJd2hpbGUgKCAodyA9IGRnYXBfZ2V0d29yZChpbikpICE9IE5VTEwgKSB7Ci0JCQlzbnByaW50ZihkZ2FwX2N3b3JkLCBNQVhDV09SRCwgIiVzIiwgdyk7Ci0JCQlmb3IgKHQgPSBkZ2FwX3RsaXN0OyB0LT50b2tlbiAhPSAwOyB0KyspIHsKLQkJCQlpZiAoICFzdHJjbXAodywgdC0+c3RyaW5nKSApCi0JCQkJCXJldHVybih0LT50b2tlbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLX0KLQotCi0vKgotICogZ2V0IGEgd29yZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIGFsc28ga2VlcCB0cmFjayBvZiBjdXJyZW50IGxpbmUgbnVtYmVyLgotICogd29yZHMgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgotICovCi1zdGF0aWMgY2hhciAqZGdhcF9nZXR3b3JkKGNoYXIgKippbikKLXsKLQljaGFyICpyZXRfcHRyID0gKmluOwotCi0gICAgICAgIGNoYXIgKnB0ciA9IGRnYXBfc2luZGV4KCppbiwgIiBcdFxuIik7Ci0KLQkvKiBJZiBubyB3b3JkIGZvdW5kLCByZXR1cm4gbnVsbCAqLwotCWlmICghcHRyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIE1hcmsgbmV3IGxvY2F0aW9uIGZvciBvdXIgYnVmZmVyICovCi0JKnB0ciA9ICdcMCc7Ci0JKmluID0gcHRyICsgMTsKLQotCS8qIEVhdCBhbnkgZXh0cmEgc3BhY2VzL3RhYnMvbmV3bGluZXMgdGhhdCBtaWdodCBiZSBwcmVzZW50ICovCi0Jd2hpbGUgKCppbiAmJiAqKmluICYmICgoKippbiA9PSAnICcpIHx8ICgqKmluID09ICdcdCcpIHx8ICgqKmluID09ICdcbicpKSkgewotCQkqKmluID0gJ1wwJzsKLQkJKmluID0gKmluICsgMTsKLQl9Ci0KLQlyZXR1cm4gcmV0X3B0cjsKLX0KLQotCi0vKgotICogcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSwgZ2l2aW5nIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgZmlsZSB3aGVyZQotICogdGhlIGVycm9yIG9jY3VycmVkLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2VycihjaGFyICpzKQotewotCXByaW50aygiREdBUDogcGFyc2U6ICVzXG4iLCBzKTsKLX0KLQotCi0vKgotICogYWxsb2NhdGUgYSBuZXcgY29uZmlndXJhdGlvbiBub2RlIG9mIHR5cGUgdAotICovCi1zdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX25ld25vZGUoaW50IHQpCi17Ci0Jc3RydWN0IGNub2RlICpuOwotCi0JbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbm9kZSksIEdGUF9BVE9NSUMpOwotCWlmIChuICE9IE5VTEwpIHsKLQkJbWVtc2V0KChjaGFyICopbiwgMCwgc2l6ZW9mKHN0cnVjdCBjbm9kZSkpOwotCQluLT50eXBlID0gdDsKLQl9Ci0JcmV0dXJuKG4pOwotfQotCi0KLS8qCi0gKiBkZ2FwX2NoZWNrbm9kZTogc2VlIGlmIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm8gaGFzIGJlZW4gc3VwcGxpZWQgZm9yIGEgbm9kZQotICogYmVmb3JlIGNyZWF0aW5nIHRoZSBuZXh0IG5vZGUuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9jaGVja25vZGUoc3RydWN0IGNub2RlICpwKQotewotCXN3aXRjaCAocC0+dHlwZSkgewotCWNhc2UgQk5PREU6Ci0JCWlmIChwLT51LmJvYXJkLnZfdHlwZSA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiYm9hcmQgdHlwZSAhbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0KLQkJcmV0dXJuKDApOwotCi0JY2FzZSBMTk9ERToKLQkJaWYgKHAtPnUubGluZS52X3NwZWVkID09IDApIHsKLQkJCWRnYXBfZXJyKCJsaW5lIHNwZWVkIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0KLQljYXNlIENOT0RFOgotCQlpZiAocC0+dS5jb25jLnZfdHlwZSA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiY29uY2VudHJhdG9yIHR5cGUgbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51LmNvbmMudl9zcGVlZCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiY29uY2VudHJhdG9yIGxpbmUgc3BlZWQgbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51LmNvbmMudl9ucG9ydCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigibnVtYmVyIG9mIHBvcnRzIG9uIGNvbmNlbnRyYXRvciBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJaWYgKHAtPnUuY29uYy52X2lkID09IDApIHsKLQkJCWRnYXBfZXJyKCJjb25jZW50cmF0b3IgaWQgbGV0dGVyIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0KLQljYXNlIE1OT0RFOgotCQlpZiAocC0+dS5tb2R1bGUudl90eXBlID09IDApIHsKLQkJCWRnYXBfZXJyKCJFQkkgbW9kdWxlIHR5cGUgbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51Lm1vZHVsZS52X25wb3J0ID09IDApIHsKLQkJCWRnYXBfZXJyKCJudW1iZXIgb2YgcG9ydHMgb24gRUJJIG1vZHVsZSBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJaWYgKHAtPnUubW9kdWxlLnZfaWQgPT0gMCkgewotCQkJZGdhcF9lcnIoIkVCSSBtb2R1bGUgaWQgbGV0dGVyIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyoKLSAqIHNhdmUgYSBzdHJpbmcgc29tZXdoZXJlCi0gKi8KLXN0YXRpYyBjaGFyCSpkZ2FwX3NhdmVzdHJpbmcoY2hhciAqcykKLXsKLQljaGFyCSpwOwotCWlmICggKHAgPSBrbWFsbG9jKHN0cmxlbihzKSArIDEsIEdGUF9BVE9NSUMpICkgIT0gTlVMTCkgewotCQlzdHJjcHkocCwgcyk7Ci0JfQotCXJldHVybihwKTsKLX0KLQotCi0vKgotICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBpbnRlcnJ1cHRzIG9yIG5vdC4KLSAqLwotdWludCBkZ2FwX2NvbmZpZ19nZXRfdXNlaW50cihzdHJ1Y3QgYm9hcmRfdCAqYmQpCi17Ci0Jc3RydWN0IGNub2RlICpwID0gTlVMTDsKLQotCWlmICghYmQpCi0JCXJldHVybigwKTsKLQotCWZvciAocCA9IGJkLT5iZF9jb25maWc7IHA7IHAgPSBwLT5uZXh0KSB7Ci0JCXN3aXRjaCAocC0+dHlwZSkgewotCQljYXNlIElOVFJOT0RFOgotCQkJLyoKLQkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgotCQkJICovCi0JCQlyZXR1cm4gcC0+dS51c2VpbnRyOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBHaXZlbiBhIGJvYXJkIHBvaW50ZXIsIHJldHVybnMgd2hldGhlciB3ZSB0dXJuIG9uIGFsdHBpbiBvciBub3QuCi0gKi8KLXVpbnQgZGdhcF9jb25maWdfZ2V0X2FsdHBpbihzdHJ1Y3QgYm9hcmRfdCAqYmQpCi17Ci0Jc3RydWN0IGNub2RlICpwID0gTlVMTDsKLQotCWlmICghYmQpCi0JCXJldHVybigwKTsKLQotCWZvciAocCA9IGJkLT5iZF9jb25maWc7IHA7IHAgPSBwLT5uZXh0KSB7Ci0JCXN3aXRjaCAocC0+dHlwZSkgewotCQljYXNlIEFOT0RFOgotCQkJLyoKLQkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgotCQkJICovCi0JCQlyZXR1cm4gcC0+dS5hbHRwaW47Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIElmIG5vdCBmb3VuZCwgdGhlbiBkb24ndCB0dXJuIG9uIGludGVycnVwdHMuICovCi0JcmV0dXJuIDA7Ci19Ci0KLQotCi0vKgotICogR2l2ZW4gYSBzcGVjaWZpYyB0eXBlIG9mIGJvYXJkLCBpZiBmb3VuZCwgZGV0YWNoZWQgbGluayBhbmQgCi0gKiByZXR1cm5zIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGluIHRoZSBsaXN0LgotICovCi1zdHJ1Y3QgY25vZGUgKmRnYXBfZmluZF9jb25maWcoaW50IHR5cGUsIGludCBidXMsIGludCBzbG90KQotewotCXN0cnVjdCBjbm9kZSAqcCwgKnByZXYgPSBOVUxMLCAqcHJldjIgPSBOVUxMLCAqZm91bmQgPSBOVUxMOwotCi0JcCA9ICZkZ2FwX2hlYWQ7Ci0KLQl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKSB7Ci0JCXByZXYgPSBwOwotCQlwID0gcC0+bmV4dDsKLQotCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgewotCi0JCQlpZiAocC0+dS5ib2FyZC50eXBlID09IHR5cGUpIHsKLQotCQkJCWlmIChwLT51LmJvYXJkLnZfcGNpYnVzICYmIHAtPnUuYm9hcmQucGNpYnVzICE9IGJ1cykgewotCQkJCQlEUFIoKCJGb3VuZCBtYXRjaGluZyBib2FyZCwgYnV0IHdyb25nIGJ1cyBwb3NpdGlvbi4gU3lzdGVtIHNheXMgYnVzICVkLCB3ZSB3YW50IGJ1cyAlbGRcbiIsCi0JCQkJCQlidXMsIHAtPnUuYm9hcmQucGNpYnVzKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAocC0+dS5ib2FyZC52X3BjaXNsb3QgJiYgcC0+dS5ib2FyZC5wY2lzbG90ICE9IHNsb3QpIHsKLQkJCQkJRFBSX0lOSVQoKCJGb3VuZCBtYXRjaGluZyBib2FyZCwgYnV0IHdyb25nIHNsb3QgcG9zaXRpb24uIFN5c3RlbSBzYXlzIHNsb3QgJWQsIHdlIHdhbnQgc2xvdCAlbGRcbiIsCi0JCQkJCQlzbG90LCBwLT51LmJvYXJkLnBjaXNsb3QpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJRFBSX0lOSVQoKCJNYXRjaGVkIHR5cGUgaW4gY29uZmlnIGZpbGVcbiIpKTsKLQotCQkJCWZvdW5kID0gcDsKLQkJCQkvKgotCQkJCSAqIEtlZXAgd2Fsa2luZyB0aHJ1IHRoZSBsaXN0IHRpbGwgd2UgZmluZCB0aGUgbmV4dCBib2FyZC4KLQkJCQkgKi8KLQkJCQl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKSB7Ci0JCQkJCXByZXYyID0gcDsKLQkJCQkJcCA9IHAtPm5leHQ7Ci0JCQkJCWlmIChwLT50eXBlID09IEJOT0RFKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBNYXJrIHRoZSBlbmQgb2Ygb3VyIDEgYm9hcmQgY2hhaW4gb2YgY29uZmlncy4KLQkJCQkJCSAqLwotCQkJCQkJcHJldjItPm5leHQgPSBOVUxMOwotCi0JCQkJCQkvKgotCQkJCQkJICogTGluayB0aGUgIm5leHQiIGJvYXJkIHRvIHRoZSBwcmV2aW91cyBib2FyZCwKLQkJCQkJCSAqIGVmZmVjdGl2ZWx5ICJ1bmxpbmtpbmciIG91ciBib2FyZCBmcm9tIHRoZSBtYWluIGNvbmZpZy4KLQkJCQkJCSAqLwotCQkJCQkJcHJldi0+bmV4dCA9IHA7Ci0KLQkJCQkJCXJldHVybiBmb3VuZDsKLQkJCQkJfQotCQkJCX0KLQkJCQkvKgotCQkJCSAqIEl0IG11c3QgYmUgdGhlIGxhc3QgYm9hcmQgaW4gdGhlIGxpc3QuCi0JCQkJICovCi0JCQkJcHJldi0+bmV4dCA9IE5VTEw7Ci0JCQkJcmV0dXJuIGZvdW5kOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCB3YWxrcyB0aGUgY29uZmlnIGxpbmssIGNvdW50aW5nIHVwCi0gKiBhbGwgcG9ydHMgdXNlciBzcGVjaWZpZWQgc2hvdWxkIGJlIG9uIHRoZSBib2FyZC4KLSAqIChUaGlzIGRvZXMgTk9UIG1lYW4gdGhleSBhcmUgYWxsIGFjdHVhbGx5IHByZXNlbnQgcmlnaHQgbm93IHRobykKLSAqLwotdWludCBkZ2FwX2NvbmZpZ19nZXRfbnVtYmVyX29mX3BvcnRzKHN0cnVjdCBib2FyZF90ICpiZCkKLXsKLQlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7Ci0KLQlpZiAoIWJkKQotCQlyZXR1cm4oMCk7Ci0KLQlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgewotCi0JCXN3aXRjaCAocC0+dHlwZSkgewotCQljYXNlIEJOT0RFOgotCQkJLyoKLQkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgotCQkJICovCi0JCQlpZiAocC0+dS5ib2FyZC50eXBlID4gRVBDRkUpCi0JCQkJY291bnQgKz0gcC0+dS5ib2FyZC5ucG9ydDsKLQkJCWJyZWFrOwotCQljYXNlIENOT0RFOgotCQkJY291bnQgKz0gcC0+dS5jb25jLm5wb3J0OwotCQkJYnJlYWs7Ci0JCWNhc2UgTU5PREU6Ci0JCQljb3VudCArPSBwLT51Lm1vZHVsZS5ucG9ydDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAoY291bnQpOwotfQotCi1jaGFyICpkZ2FwX2NyZWF0ZV9jb25maWdfc3RyaW5nKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKQotewotCWNoYXIgKnB0ciA9IHN0cmluZzsKLQlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOwotCXN0cnVjdCBjbm9kZSAqcSA9IE5VTEw7Ci0JaW50IHNwZWVkOwotCi0JaWYgKCFiZCkgewotCQkqcHRyID0gMHhmZjsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgewotCi0JCXN3aXRjaCAocC0+dHlwZSkgewotCQljYXNlIExOT0RFOgotCQkJKnB0ciA9ICdcMCc7Ci0JCQlwdHIrKzsKLQkJCSpwdHIgPSBwLT51LmxpbmUuc3BlZWQ7Ci0JCQlwdHIrKzsKLQkJCWJyZWFrOwotCQljYXNlIENOT0RFOgotCQkJLyoKLQkJCSAqIEJlY2F1c2UgdGhlIEVQQy9jb24gY29uY2VudHJhdG9ycyBjYW4gaGF2ZSBFTSBtb2R1bGVzCi0JCQkgKiBoYW5naW5nIG9mZiBvZiB0aGVtLCB3ZSBoYXZlIHRvIHdhbGsgYWhlYWQgaW4gdGhlIGxpc3QKLQkJCSAqIGFuZCBrZWVwIGFkZGluZyB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIGVhY2ggRU0gdG8gdGhlIGNvbmZpZy4KLQkJCSAqIFVHSCEKLQkJCSAqLwotCQkJc3BlZWQgPSBwLT51LmNvbmMuc3BlZWQ7Ci0JCQlxID0gcC0+bmV4dDsKLQkJCWlmICgocSAhPSBOVUxMKSAmJiAocS0+dHlwZSA9PSBNTk9ERSkgKSB7Ci0JCQkJKnB0ciA9IChwLT51LmNvbmMubnBvcnQgKyAweDgwKTsKLQkJCQlwdHIrKzsKLQkJCQlwID0gcTsKLQkJCQl3aGlsZSAoKHEtPm5leHQgIT0gTlVMTCkgJiYgKHEtPm5leHQtPnR5cGUpID09IE1OT0RFKSB7Ci0JCQkJCSpwdHIgPSAocS0+dS5tb2R1bGUubnBvcnQgKyAweDgwKTsKLQkJCQkJcHRyKys7Ci0JCQkJCXAgPSBxOwotCQkJCQlxID0gcS0+bmV4dDsKLQkJCQl9Ci0JCQkJKnB0ciA9IHEtPnUubW9kdWxlLm5wb3J0OwotCQkJCXB0cisrOwotCQkJfSBlbHNlIHsKLQkJCQkqcHRyID0gcC0+dS5jb25jLm5wb3J0OwotCQkJCXB0cisrOwotCQkJfQotCi0JCQkqcHRyID0gc3BlZWQ7Ci0JCQlwdHIrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JKnB0ciA9IDB4ZmY7Ci0JcmV0dXJuIHN0cmluZzsKLX0KLQotCi0KLWNoYXIgKmRnYXBfZ2V0X2NvbmZpZ19sZXR0ZXJzKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKQotewotCWludCBmb3VuZCA9IEZBTFNFOwotCWNoYXIgKnB0ciA9IHN0cmluZzsKLQlzdHJ1Y3QgY25vZGUgKmNwdHIgPSBOVUxMOwotCWludCBsZW4gPSAwOwotCWludCBsZWZ0ID0gTUFYVFRZTkFNRUxFTjsKLQotCWlmICghYmQpIHsKLQkJcmV0dXJuICI8TlVMTD4iOwotCX0KLQotCWZvciAoY3B0ciA9IGJkLT5iZF9jb25maWc7IGNwdHI7IGNwdHIgPSBjcHRyLT5uZXh0KSB7Ci0KLQkJaWYgKChjcHRyLT50eXBlID09IEJOT0RFKSAmJgotCQkgICAgICgoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUMl85MjBQKSB8fCAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUNF85MjBQKSB8fAotCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQ4XzkyMFApIHx8IChjcHRyLT51LmJvYXJkLnR5cGUgPT0gUEFQT1JUNCkgfHwKLQkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IFBBUE9SVDgpKSkgewotCi0JCQlmb3VuZCA9IFRSVUU7Ci0JCX0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBUTk9ERSAmJiBmb3VuZCA9PSBUUlVFKSB7Ci0JCQljaGFyICpwdHIxOwotCQkJaWYgKHN0cnN0cihjcHRyLT51LnR0eW5hbWUsICJ0dHkiKSkgewotCQkJCXB0cjEgPSBjcHRyLT51LnR0eW5hbWU7Ci0JCQkJcHRyMSArPSAzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHRyMSA9IGNwdHItPnUudHR5bmFtZTsKLQkJCX0KLQkJCWlmIChwdHIxKSB7Ci0JCQkJbGVuID0gc25wcmludGYocHRyLCBsZWZ0LCAiJXMiLCBwdHIxKTsKLQkJCQlsZWZ0IC09IGxlbjsKLQkJCQlwdHIgICs9IGxlbjsKLQkJCQlpZiAobGVmdCA8PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChjcHRyLT50eXBlID09IENOT0RFKSB7Ci0JCQlpZiAoY3B0ci0+dS5jb25jLmlkKSB7Ci0JCQkJbGVuID0gc25wcmludGYocHRyLCBsZWZ0LCAiJXMiLCBjcHRyLT51LmNvbmMuaWQpOwotCQkJCWxlZnQgLT0gbGVuOwotCQkJCXB0ciAgKz0gbGVuOwotCQkJCWlmIChsZWZ0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotICAgICAgICAgICAgICAgIH0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBNTk9ERSkgewotCQkJaWYgKGNwdHItPnUubW9kdWxlLmlkKSB7Ci0JCQkJbGVuID0gc25wcmludGYocHRyLCBsZWZ0LCAiJXMiLCBjcHRyLT51Lm1vZHVsZS5pZCk7Ci0JCQkJbGVmdCAtPSBsZW47Ci0JCQkJcHRyICArPSBsZW47Ci0JCQkJaWYgKGxlZnQgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RyaW5nOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wYXJzZS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTI4YzQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICovCi0KLSNpZm5kZWYgX0RHQVBfUEFSU0VfSAotI2RlZmluZSBfREdBUF9QQVJTRV9ICi0KLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotCi1leHRlcm4gaW50IGRnYXBfcGFyc2VmaWxlKGNoYXIgKippbiwgaW50IFJlbW92ZSk7Ci1leHRlcm4gc3RydWN0IGNub2RlICpkZ2FwX2ZpbmRfY29uZmlnKGludCB0eXBlLCBpbnQgYnVzLCBpbnQgc2xvdCk7Ci1leHRlcm4gdWludCBkZ2FwX2NvbmZpZ19nZXRfbnVtYmVyX29mX3BvcnRzKHN0cnVjdCBib2FyZF90ICpiZCk7Ci1leHRlcm4gY2hhciAqZGdhcF9jcmVhdGVfY29uZmlnX3N0cmluZyhzdHJ1Y3QgYm9hcmRfdCAqYmQsIGNoYXIgKnN0cmluZyk7Ci1leHRlcm4gY2hhciAqZGdhcF9nZXRfY29uZmlnX2xldHRlcnMoc3RydWN0IGJvYXJkX3QgKmJkLCBjaGFyICpzdHJpbmcpOwotZXh0ZXJuIHVpbnQgZGdhcF9jb25maWdfZ2V0X3VzZWludHIoc3RydWN0IGJvYXJkX3QgKmJkKTsKLWV4dGVybiB1aW50IGRnYXBfY29uZmlnX2dldF9hbHRwaW4oc3RydWN0IGJvYXJkX3QgKmJkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlZDM3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotLyogJElkOiBkZ2FwX3BjaS5oLHYgMS4xIDIwMDkvMTAvMjMgMTQ6MDE6NTcgbWFya2ggRXhwICQgKi8KLQotI2lmbmRlZiBfX0RHQVBfUENJX0gKLSNkZWZpbmUgX19ER0FQX1BDSV9ICi0KLSNkZWZpbmUgUENJTUFYIDMyCQkJLyogbWF4aW11bSBudW1iZXIgb2YgUENJIGJvYXJkcyAqLwotCi0jZGVmaW5lIERJR0lfVklECQkweDExNEYKLQotI2RlZmluZSBQQ0lfREVWSUNFX0VQQ19ESUQJMHgwMDAyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWEVNX0RJRAkweDAwMDQKLSNkZWZpbmUgUENJX0RFVklDRV9YUl9ESUQJMHgwMDA1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfQ1hfRElECTB4MDAwNgotI2RlZmluZSBQQ0lfREVWSUNFX1hSSl9ESUQJMHgwMDA5CS8qIFBMWC1iYXNlZCBYciBhZGFwdGVyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfSUJNX0RJRAkweDAwMTEJLyogSUJNIDgtcG9ydCBBc3luYyBBZGFwdGVyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfQlVMTF9ESUQJMHgwMDEzCS8qIEJVTEwgOC1wb3J0IEFzeW5jIEFkYXB0ZXIgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9YUl9TQUlQX0RJRAkweDAwMWMJLyogU0FJUCBjYXJkIC0gWHIgYWRhcHRlciAqLwotI2RlZmluZSBQQ0lfREVWSUNFX1hSXzQyMl9ESUQJMHgwMDEyCS8qIFhyLTQyMiAqLwotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF8yX0RJRAkweDAwMzQJLyogWFItUGx1cyA5MjAgSywgMiBwb3J0ICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzRfRElECTB4MDAyNgkvKiBYUi1QbHVzIDkyMCBLLCA0IHBvcnQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV85MjBfOF9ESUQJMHgwMDI3CS8qIFhSLVBsdXMgOTIwIEssIDggcG9ydCAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0VQQ0pfRElECTB4MDAwYQkvKiBQTFggOTA2MCBjaGlwIGZvciBQQ0kgICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfQ1hfSUJNX0RJRAkweDAwMWIJLyogSUJNIDEyOC1wb3J0IEFzeW5jIEFkYXB0ZXIgKi8KLSNkZWZpbmUgUENJX0RFVklDRV85MjBfOF9IUF9ESUQJMHgwMDU4CS8qIEhQIFhSLVBsdXMgOTIwIEssIDggcG9ydCAqLwotI2RlZmluZSBQQ0lfREVWSUNFX1hFTV9IUF9ESUQJMHgwMDU5ICAvKiBIUCBYZW0gUENJICovCi0KLSNkZWZpbmUgUENJX0RFVklDRV9YRU1fTkFNRQkiQWNjZWxlUG9ydCBYRU0iCi0jZGVmaW5lIFBDSV9ERVZJQ0VfQ1hfTkFNRQkiQWNjZWxlUG9ydCBDWCIKLSNkZWZpbmUgUENJX0RFVklDRV9YUl9OQU1FCSJBY2NlbGVQb3J0IFhyIgotI2RlZmluZSBQQ0lfREVWSUNFX1hSSl9OQU1FCSJBY2NlbGVQb3J0IFhyIChQTFgpIgotI2RlZmluZSBQQ0lfREVWSUNFX1hSX1NBSVBfTkFNRQkiQWNjZWxlUG9ydCBYciAoU0FJUCkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzJfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCAyIHBvcnQiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzRfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCA0IHBvcnQiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCA4IHBvcnQiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfNDIyX05BTUUJIkFjY2VsZVBvcnQgWHIgNDIyIgotI2RlZmluZSBQQ0lfREVWSUNFX0VQQ0pfTkFNRQkiQWNjZWxlUG9ydCBFUEMgKFBMWCkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfQlVMTF9OQU1FCSJBY2NlbGVQb3J0IFhyIChCVUxMKSIKLSNkZWZpbmUgUENJX0RFVklDRV9YUl9JQk1fTkFNRQkiQWNjZWxlUG9ydCBYciAoSUJNKSIKLSNkZWZpbmUgUENJX0RFVklDRV9DWF9JQk1fTkFNRQkiQWNjZWxlUG9ydCBDWCAoSUJNKSIKLSNkZWZpbmUgUENJX0RFVklDRV85MjBfOF9IUF9OQU1FICJBY2NlbGVQb3J0IFhyOTIwIDggcG9ydCAoSFApIgotI2RlZmluZSBQQ0lfREVWSUNFX1hFTV9IUF9OQU1FCSJBY2NlbGVQb3J0IFhFTSAoSFApIgotCi0KLS8qCi0gKiBPbiB0aGUgUENJIGJvYXJkcywgdGhlcmUgaXMgbm8gSU8gc3BhY2UgYWxsb2NhdGVkCi0gKiBUaGUgSS9PIHJlZ2lzdGVycyB3aWxsIGJlIGluIHRoZSBmaXJzdCAzIGJ5dGVzIG9mIHRoZQotICogdXBwZXIgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlLiAgVGhlIGJvYXJkIG1lbW9yeQotICogd2lsbCBiZSBtYXBwZWQgaW50byB0aGUgbG93IDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZQotICovCi0KLS8qIFBvdGVudGlhbCBsb2NhdGlvbiBvZiBQQ0kgQmlvcyBmcm9tIEUwMDAwIHRvIEZGRkZGKi8KLSNkZWZpbmUgUENJX0JJT1NfU0laRQkJMHgwMDAyMDAwMAotCi0vKiBTaXplIG9mIE1lbW9yeSBhbmQgSS9PIGZvciBQQ0kgKDRNQikgKi8KLSNkZWZpbmUgUENJX1JBTV9TSVpFCQkweDAwNDAwMDAwCi0KLS8qIFNpemUgb2YgTWVtb3J5ICgyTUIpICovCi0jZGVmaW5lIFBDSV9NRU1fU0laRQkJMHgwMDIwMDAwMAotCi0vKiBNYXggUENJIFdpbmRvdyBTaXplICgyTUIpICovCi0jZGVmaW5lIFBDSV9XSU5fU0laRQkJMHgwMDIwMDAwMAotCi0jZGVmaW5lIFBDSV9XSU5fU0hJRlQJCTIxIC8qIDIxIGJpdHMgbWF4ICovCi0KLS8qIE9mZnNldCBvZiBJLzAgaW4gTWVtb3J5ICgyTUIpICovCi0jZGVmaW5lIFBDSV9JT19PRkZTRVQJCTB4MDAyMDAwMDAKLQotLyogU2l6ZSBvZiBJTyAoMk1CKSAqLwotI2RlZmluZSBQQ0lfSU9fU0laRQkJMHgwMDIwMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfc3lzZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0ZWM5YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0IERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIAotICogICAgICBOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKiAgICAgIFRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICogICAgICBMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqICAgICAgQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqICAgICAgb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICogICAgICBTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKiAgICAgIFRoYW5rIHlvdS4KLSAqCi0gKgotICogCi0gKiAkSWQ6IGRnYXBfc3lzZnMuYyx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkICAgCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0gIAotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF9jb25mLmgiCi0jaW5jbHVkZSAiZGdhcF9wYXJzZS5oIgotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIERHX1BBUlQpOwotfQotc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVU1IsIGRnYXBfZHJpdmVyX3ZlcnNpb25fc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfYm9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBkZ2FwX051bUJvYXJkcyk7Ci19Ci1zdGF0aWMgRFJJVkVSX0FUVFIoYm9hcmRzLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9ib2FyZHNfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfbWF4Ym9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBNQVhCT0FSRFMpOwotfQotc3RhdGljIERSSVZFUl9BVFRSKG1heGJvYXJkcywgU19JUlVTUiwgZGdhcF9kcml2ZXJfbWF4Ym9hcmRzX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxjb3VudGVyX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsZFxuIiwgZGdhcF9wb2xsX2NvdW50ZXIpOwotfQotc3RhdGljIERSSVZFUl9BVFRSKHBvbGxjb3VudGVyLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9wb2xsY291bnRlcl9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZGdhcF9kcml2ZXJfc3RhdGVfdGV4dFtkZ2FwX2RyaXZlcl9zdGF0ZV0pOwotfQotc3RhdGljIERSSVZFUl9BVFRSKHN0YXRlLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9zdGF0ZV9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9kZWJ1Z19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCV4XG4iLCBkZ2FwX2RlYnVnKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfZGVidWdfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3NjYW5mKGJ1ZiwgIjB4JXhcbiIsICZkZ2FwX2RlYnVnKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgRFJJVkVSX0FUVFIoZGVidWcsIChTX0lSVVNSIHwgU19JV1VTUiksIGRnYXBfZHJpdmVyX2RlYnVnX3Nob3csIGRnYXBfZHJpdmVyX2RlYnVnX3N0b3JlKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9yYXdyZWFkb2tfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleFxuIiwgZGdhcF9yYXdyZWFkb2spOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9yYXdyZWFkb2tfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3NjYW5mKGJ1ZiwgIjB4JXhcbiIsICZkZ2FwX3Jhd3JlYWRvayk7Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERSSVZFUl9BVFRSKHJhd3JlYWRvaywgKFNfSVJVU1IgfCBTX0lXVVNSKSwgZGdhcF9kcml2ZXJfcmF3cmVhZG9rX3Nob3csIGRnYXBfZHJpdmVyX3Jhd3JlYWRva19zdG9yZSk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRtc1xuIiwgZGdhcF9wb2xsX3RpY2spOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9wb2xscmF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzc2NhbmYoYnVmLCAiJWRcbiIsICZkZ2FwX3BvbGxfdGljayk7Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERSSVZFUl9BVFRSKHBvbGxyYXRlLCAoU19JUlVTUiB8IFNfSVdVU1IpLCBkZ2FwX2RyaXZlcl9wb2xscmF0ZV9zaG93LCBkZ2FwX2RyaXZlcl9wb2xscmF0ZV9zdG9yZSk7Ci0KLQotdm9pZCBkZ2FwX2NyZWF0ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKmRnYXBfZHJpdmVyKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzID0gJmRnYXBfZHJpdmVyLT5kcml2ZXI7Ci0KLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9ib2FyZHMpOwotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX21heGJvYXJkcyk7Ci0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfZGVidWcpOwotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3Jhd3JlYWRvayk7IAotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3BvbGxyYXRlKTsKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xsY291bnRlcik7Ci0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfc3RhdGUpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkRHQVA6IHN5c2ZzIGRyaXZlcl9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKLQl9Ci19Ci0KLQotdm9pZCBkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKmRnYXBfZHJpdmVyKQotewotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZkZ2FwX2RyaXZlci0+ZHJpdmVyOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2JvYXJkcyk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4Ym9hcmRzKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9kZWJ1Zyk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcmF3cmVhZG9rKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3N0YXRlKTsKLX0KLQotCi0jZGVmaW5lIERHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKQkJCVwKLQlpZiAoIXApCQkJCQkJXAotCQlyZXR1cm4gKDApOwkJCQlcCi0JCQkJCQkJXAotCWJkID0gZGV2X2dldF9kcnZkYXRhKHApOwkJCVwKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQlcCi0JCXJldHVybiAoMCk7CQkJCVwKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQkJCVwKLQkJcmV0dXJuICgwKTsJCQkJXAotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAotCQkJIiVkICVzXG4iLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX29wZW5fY291bnQgPyAiT3BlbiIgOiAiQ2xvc2VkIik7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19zdGF0ZSwgU19JUlVTUiwgZGdhcF9wb3J0c19zdGF0ZV9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gIHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKLQkJCSIlZCAlZFxuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX2JhdWRfaW5mbyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19iYXVkLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2JhdWRfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQlpZiAoYmQtPmNoYW5uZWxzW2ldLT5jaF9vcGVuX2NvdW50KSB7Ci0JCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCi0JCQkJIiVkICVzICVzICVzICVzICVzICVzXG4iLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCi0JCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCi0JCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfQ1RTKSA/ICJDVFMiIDogIiIsCi0JCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfRFRSKSA/ICJEVFIiIDogIiIsCi0JCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCi0JCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRENEKSA/ICJEQ0QiIDogIiIsCi0JCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfUkkpICA/ICJSSSIgIDogIiIpOwotCQl9IGVsc2UgewotCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAotCQkJCSIlZFxuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtKTsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfbXNpZ25hbHMsIFNfSVJVU1IsIGRnYXBfcG9ydHNfbXNpZ25hbHNfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2lmbGFnKTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2lmbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2lmbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfY19jZmxhZyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19jZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19jZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX29mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX2Nfb2ZsYWcpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfb2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfb2ZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2xmbGFnKTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2xmbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2xmbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX2RpZ2kuZGlnaV9mbGFncyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19kaWdpX2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfZGlnaV9mbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfcnhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlbGRcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfcnhjb3VudCk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19yeGNvdW50LCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3J4Y291bnRfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c190eGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICVsZFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF90eGNvdW50KTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX3R4Y291bnQsIFNfSVJVU1IsIGRnYXBfcG9ydHNfdHhjb3VudF9zaG93LCBOVUxMKTsKLQotCi0vKiB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIHN5cyBmaWxlcyB0aGF0IHdpbGwgZXhwb3J0IGVhY2ggc2lnbmFsIHN0YXR1cwotICogdG8gc3lzZnMgZWFjaCB2YWx1ZSB3aWxsIGJlIHB1dCBpbiBhIHNlcGFyYXRlIGZpbGVuYW1lCi0gKi8KLXZvaWQgZGdhcF9jcmVhdGVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCWludCByYyA9IDA7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJmJkLT5wZGV2LT5kZXYsIGJkKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3N0YXRlKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2JhdWQpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfbXNpZ25hbHMpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfaWZsYWcpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfY2ZsYWcpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfb2ZsYWcpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfbGZsYWcpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfZGlnaV9mbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3J4Y291bnQpOwotCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfdHhjb3VudCk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiREdBUDogc3lzZnMgZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZCFcbiIpOwotCX0KLX0KLQotCi0vKiByZW1vdmVzIGFsbCB0aGUgc3lzIGZpbGVzIGNyZWF0ZWQgZm9yIHRoYXQgcG9ydCAqLwotdm9pZCBkZ2FwX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhzdHJ1Y3QgYm9hcmRfdCAqYmQpCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19zdGF0ZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19iYXVkKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX21zaWduYWxzKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2lmbGFnKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2NmbGFnKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX29mbGFnKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2xmbGFnKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2RpZ2lfZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19yeGNvdW50KTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3R4Y291bnQpOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMiLCB1bi0+dW5fb3Blbl9jb3VudCA/ICJPcGVuIiA6ICJDbG9zZWQiKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihzdGF0ZSwgU19JUlVTUiwgZGdhcF90dHlfc3RhdGVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF90dHlfYmF1ZF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjaC0+Y2hfYmF1ZF9pbmZvKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihiYXVkLCBTX0lSVVNSLCBkZ2FwX3R0eV9iYXVkX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X21zaWduYWxzX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JaWYgKGNoLT5jaF9vcGVuX2NvdW50KSB7Ci0JCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzICVzICVzICVzICVzICVzXG4iLAotCQkJKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9SVFMpID8gIlJUUyIgOiAiIiwKLQkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfQ1RTKSA/ICJDVFMiIDogIiIsCi0JCQkoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX0RUUikgPyAiRFRSIiA6ICIiLAotCQkJKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9EU1IpID8gIkRTUiIgOiAiIiwKLQkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRENEKSA/ICJEQ0QiIDogIiIsCi0JCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX1JJKSAgPyAiUkkiICA6ICIiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIobXNpZ25hbHMsIFNfSVJVU1IsIGRnYXBfdHR5X21zaWduYWxzX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2lmbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2lmbGFnKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihpZmxhZywgU19JUlVTUiwgZGdhcF90dHlfaWZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF90dHlfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfY2ZsYWcpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGNmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9jZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19vZmxhZyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIob2ZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X29mbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2xmbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2xmbGFnKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihsZmxhZywgU19JUlVTUiwgZGdhcF90dHlfbGZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF90dHlfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGRpZ2lfZmxhZywgU19JUlVTUiwgZGdhcF90dHlfZGlnaV9mbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF9yeGNvdW50KTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihyeGNvdW50LCBTX0lSVVNSLCBkZ2FwX3R0eV9yeGNvdW50X3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3R4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF90eGNvdW50KTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUih0eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3R0eV90eGNvdW50X3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50CWNuOwotCWludAlibjsKLQlzdHJ1Y3QgY25vZGUgKmNwdHIgPSBOVUxMOwotCWludCBmb3VuZCA9IEZBTFNFOwotCWludCBuY291bnQgPSAwOwotCWludCBzdGFydG8gPSAwOwotCWludCBpID0gMDsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotICAgICAgICBibiA9IGJkLT5ib2FyZG51bTsKLQljbiA9IGNoLT5jaF9wb3J0bnVtOwotCi0JZm9yIChjcHRyID0gYmQtPmJkX2NvbmZpZzsgY3B0cjsgY3B0ciA9IGNwdHItPm5leHQpIHsKLQotCQlpZiAoKGNwdHItPnR5cGUgPT0gQk5PREUpICYmCi0JCSAgICAoKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDJfOTIwUCkgfHwgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDRfOTIwUCkgfHwKLQkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUOF85MjBQKSB8fCAoY3B0ci0+dS5ib2FyZC50eXBlID09IFBBUE9SVDQpIHx8Ci0JCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBQQVBPUlQ4KSkpIHsKLQotCQkJCWZvdW5kID0gVFJVRTsKLQkJCQlpZiAoY3B0ci0+dS5ib2FyZC52X3N0YXJ0KQotCQkJCQlzdGFydG8gPSBjcHRyLT51LmJvYXJkLnN0YXJ0OwotCQkJCWVsc2UKLQkJCQkJc3RhcnRvID0gMTsKLQkJfQotCi0JCWlmIChjcHRyLT50eXBlID09IFROT0RFICYmIGZvdW5kID09IFRSVUUpIHsKLQkJCWNoYXIgKnB0cjE7Ci0JCQlpZiAoc3Ryc3RyKGNwdHItPnUudHR5bmFtZSwgInR0eSIpKSB7Ci0JCQkJcHRyMSA9IGNwdHItPnUudHR5bmFtZTsKLQkJCQlwdHIxICs9IDM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwdHIxID0gY3B0ci0+dS50dHluYW1lOwotCQkJfQotCi0JCQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9jb25maWdfZ2V0X251bWJlcl9vZl9wb3J0cyhiZCk7IGkrKykgewotCQkJCWlmIChjbiA9PSBpKSB7Ci0JCQkJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzJXMlMDJkXG4iLAotCQkJCQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLAotCQkJCQkJcHRyMSwgaSArIHN0YXJ0byk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gQ05PREUpIHsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNwdHItPnUuY29uYy5ucG9ydDsgaSsrKSB7Ci0JCQkJaWYgKGNuID09IChpICsgbmNvdW50KSkgewotCi0JCQkJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzJXMlMDJkXG4iLAotCQkJCQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLAotCQkJCQkJY3B0ci0+dS5jb25jLmlkLAotCQkJCQkJaSArIChjcHRyLT51LmNvbmMudl9zdGFydCA/IGNwdHItPnUuY29uYy5zdGFydCA6IDEpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5jb3VudCArPSBjcHRyLT51LmNvbmMubnBvcnQ7Ci0JCX0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBNTk9ERSkgewotCi0JCQlmb3IgKGkgPSAwOyBpIDwgY3B0ci0+dS5tb2R1bGUubnBvcnQ7IGkrKykgewotCQkJCWlmIChjbiA9PSAoaSArIG5jb3VudCkpIHsKLQkJCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMlcyUwMmRcbiIsCi0JCQkJCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPyAicHIiIDogInR0eSIsCi0JCQkJCQljcHRyLT51Lm1vZHVsZS5pZCwKLQkJCQkJCWkgKyAoY3B0ci0+dS5tb2R1bGUudl9zdGFydCA/IGNwdHItPnUubW9kdWxlLnN0YXJ0IDogMSkpOwotCQkJCX0KLQkJCX0KLQotCQkJbmNvdW50ICs9IGNwdHItPnUubW9kdWxlLm5wb3J0OwotCi0JCX0KLQl9Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc19kZ2FwXyVkXyVkXG4iLAotCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPyAicHIiIDogInR0eSIsIGJuLCBjbik7Ci0KLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihjdXN0b21fbmFtZSwgU19JUlVTUiwgZGdhcF90dHlfbmFtZV9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGdhcF9zeXNmc190dHlfZW50cmllc1tdID0gewotCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAotCSZkZXZfYXR0cl9iYXVkLmF0dHIsCi0JJmRldl9hdHRyX21zaWduYWxzLmF0dHIsCi0JJmRldl9hdHRyX2lmbGFnLmF0dHIsCi0JJmRldl9hdHRyX2NmbGFnLmF0dHIsCi0JJmRldl9hdHRyX29mbGFnLmF0dHIsCi0JJmRldl9hdHRyX2xmbGFnLmF0dHIsCi0JJmRldl9hdHRyX2RpZ2lfZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9yeGNvdW50LmF0dHIsCi0JJmRldl9hdHRyX3R4Y291bnQuYXR0ciwKLQkmZGV2X2F0dHJfY3VzdG9tX25hbWUuYXR0ciwKLQlOVUxMCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IE5VTEwsCi0JLmF0dHJzID0gZGdhcF9zeXNmc190dHlfZW50cmllcywKLX07Ci0KLQotCi0KLXZvaWQgZGdhcF9jcmVhdGVfdHR5X3N5c2ZzKHN0cnVjdCB1bl90ICp1biwgc3RydWN0IGRldmljZSAqYykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjLT5rb2JqLCAmZGdhcF90dHlfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGdhcDogZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyB0dHkgZGV2aWNlIGF0dHJpYnV0ZXMuXG4iKTsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjLT5rb2JqLCAmZGdhcF90dHlfYXR0cmlidXRlX2dyb3VwKTsKLQkJcmV0dXJuOwotCX0KLQotCWRldl9zZXRfZHJ2ZGF0YShjLCB1bik7Ci0KLX0KLQotCi12b2lkIGRnYXBfcmVtb3ZlX3R0eV9zeXNmcyhzdHJ1Y3QgZGV2aWNlICpjKQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmYy0+a29iaiwgJmRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTY5MGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfX0RHQVBfU1lTRlNfSAotI2RlZmluZSBfX0RHQVBfU1lTRlNfSAotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotCi1zdHJ1Y3QgYm9hcmRfdDsKLXN0cnVjdCBjaGFubmVsX3Q7Ci1zdHJ1Y3QgdW5fdDsKLXN0cnVjdCBwY2lfZHJpdmVyOwotc3RydWN0IGNsYXNzX2RldmljZTsKLQotZXh0ZXJuIHZvaWQgZGdhcF9jcmVhdGVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKTsgCi1leHRlcm4gdm9pZCBkZ2FwX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOwotCi1leHRlcm4gdm9pZCBkZ2FwX2NyZWF0ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKik7Ci1leHRlcm4gdm9pZCBkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKik7Ci0KLWV4dGVybiBpbnQgZGdhcF90dHlfY2xhc3NfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgZGdhcF90dHlfY2xhc3NfZGVzdHJveSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgZGdhcF9jcmVhdGVfdHR5X3N5c2ZzKHN0cnVjdCB1bl90ICp1biwgc3RydWN0IGRldmljZSAqYyk7Ci1leHRlcm4gdm9pZCBkZ2FwX3JlbW92ZV90dHlfc3lzZnMoc3RydWN0IGRldmljZSAqYyk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1M2RiOWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCi0gKi8KLQotLyogJElkOiBkZ2FwX3RyYWNlLmMsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJCAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogRm9yIGppZmZpZXMsIHRhc2sgc3RhdGVzICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrbGV0IGFuZCBpbnRlcnJ1cHQgc3RydWN0cy9kZWZpbmVzICovCi0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLSNpbmNsdWRlICJkZ2FwX3RyYWNlLmgiCi0KLSNkZWZpbmUgVFJDX1RPX0NPTlNPTEUgMQotCi0vKiBmaWxlIGxldmVsIGdsb2JhbHMgKi8KLXN0YXRpYyBjaGFyICpkZ2FwX3RyY2J1ZjsJCS8qIHRoZSByaW5nYnVmZmVyICovCi0KLSNpZiBkZWZpbmVkKFRSQ19UT19LTUVNKQotc3RhdGljIGludCBkZ2FwX3RyY2J1ZmkgPSAwOwkJLyogaW5kZXggb2YgdGhlIHRpbGRlIGF0IHRoZSBlbmQgb2YgKi8KLSNlbmRpZgotCi1leHRlcm4gaW50IGRnYXBfdHJjYnVmX3NpemU7CQkvKiBzaXplIG9mIHRoZSByaW5nYnVmZmVyICovCi0KLSNpZiBkZWZpbmVkKFRSQ19UT19LTUVNKQotc3RhdGljIERFRklORV9TUElOTE9DSyhkZ2FwX3RyYWNlZl9sb2NrKTsKLSNlbmRpZgotCi0jaWYgMAotCi0jaWYgIWRlZmluZWQoVFJDX1RPX0tNRU0pICYmICFkZWZpbmVkKFRSQ19UT19DT05TT0xFKQotdm9pZCBkZ2FwX3RyYWNlZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQlyZXR1cm47Ci19Ci0KLSNlbHNlIC8qICFkZWZpbmVkKFRSQ19UT19LTUVNKSAmJiAhZGVmaW5lZChUUkNfVE9fQ09OU09MRSkgKi8KLQotdm9pZCBkZ2FwX3RyYWNlZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0CSAgICAgICAgIGFwOwotCWNoYXIgIAkgICAgICAgICBidWZbVFJDX01BWE1TRysxXTsKLQlzaXplX3QJCSBsZW5idWY7Ci0JaW50CQkgaTsKLQlzdGF0aWMgaW50CSBmYWlsZWQgPSBGQUxTRTsKLSMgaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLQl1bnNpZ25lZCBsb25nCSBmbGFnczsKLSNlbmRpZgotCi0JaWYoZmFpbGVkKQotCQlyZXR1cm47Ci0jIGlmIGRlZmluZWQoVFJDX1RPX0tNRU0pCi0JREdBUF9MT0NLKGRnYXBfdHJhY2VmX2xvY2ssIGZsYWdzKTsKLSNlbmRpZgotCi0JLyogRm9ybWF0IGJ1ZiB1c2luZyBmbXQgYW5kIGFyZ3VtZW50cyBjb250YWluZWQgaW4gYXAuICovCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JaSA9IHZzcHJpbnRmKGJ1ZiwgZm10LCAgYXApOwotCXZhX2VuZChhcCk7Ci0JbGVuYnVmID0gc3RybGVuKGJ1Zik7Ci0KLSMgaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLQl7Ci0JCXN0YXRpYyBpbnQJIGluaXRkPTA7Ci0KLQkJLyoKLQkJICogTm93LCBpbiBhZGRpdGlvbiB0byAob3IgaW5zdGVhZCBvZikgcHJpbnRpbmcgdGhpcyBzdHVmZiBvdXQKLQkJICogKHdoaWNoIGlzIGEgYnVmZmVyZWQgb3BlcmF0aW9uKSwgYWxzbyB0dWNrIGl0IGF3YXkgaW50byBhCi0JCSAqIGNvcm5lciBvZiBtZW1vcnkgd2hpY2ggY2FuIGJlIGV4YW1pbmVkIHBvc3QtY3Jhc2ggaW4ga2RiLgotCQkgKi8KLQkJaWYgKCFpbml0ZCkgewotCQkJZGdhcF90cmNidWYgPSAoY2hhciAqKSB2bWFsbG9jKGRnYXBfdHJjYnVmX3NpemUpOwotCQkJaWYoIWRnYXBfdHJjYnVmKSB7Ci0JCQkJZmFpbGVkID0gVFJVRTsKLQkJCQlwcmludGsoImRnYXA6IHRyYWNpbmcgaW5pdCBmYWlsZWQhXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCW1lbXNldChkZ2FwX3RyY2J1ZiwgJ1wwJywgIGRnYXBfdHJjYnVmX3NpemUpOwotCQkJZGdhcF90cmNidWZpID0gMDsKLQkJCWluaXRkKys7Ci0KLQkJCXByaW50aygiZGdhcDogdHJhY2luZyBlbmFibGVkIC0gIiBUUkNfRFRSQwotCQkJCSIgMHglbHggMHgleFxuIiwKLQkJCQkodW5zaWduZWQgbG9uZylkZ2FwX3RyY2J1ZiwKLQkJCQlkZ2FwX3RyY2J1Zl9zaXplKTsKLQkJfQotCi0jICBpZiBkZWZpbmVkKFRSQ19PTl9PVkVSRkxPV19XUkFQX0FST1VORCkKLQkJLyoKLQkJICogVGhpcyBpcyB0aGUgbGVzcyBDUFUtaW50ZW5zaXZlIHdheSB0byBkbyB0aGluZ3MuICBXZSBzaW1wbHkKLQkJICogd3JhcCBhcm91bmQgYmVmb3JlIHdlIGZhbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gIEEKLQkJICogdGlsZGUgKH4pIGRlbWFyY2F0ZXMgdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSB0cmFjZS4KLQkJICoKLQkJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgcmFjZQotCQkgKiBjb25kaXRpb25zIGFzIGl0IGlzIGxlc3MgbGlrZWx5IHRvIGFmZmVjdCB0aGUgdGltaW5nIG9mCi0JCSAqIHRoaW5ncy4KLQkJICovCi0KLQkJaWYgKGRnYXBfdHJjYnVmaSArIGxlbmJ1ZiA+PSBkZ2FwX3RyY2J1Zl9zaXplKSB7Ci0JCQkvKiBXZSBhcmUgd3JhcHBpbmcsIHNvIHdpcGUgb3V0IHRoZSBsYXN0IHRpbGRlLiAqLwotCQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSA9ICdcMCc7Ci0JCQkvKiBwdXQgdGhlIG5ldyBzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyICovCi0JCQlkZ2FwX3RyY2J1ZmkgPSAwOwotCQl9Ci0KLQkJc3RyY3B5KCZkZ2FwX3RyY2J1ZltkZ2FwX3RyY2J1ZmldLCBidWYpOwotCQlkZ2FwX3RyY2J1ZmkgKz0gbGVuYnVmOwotCQlkZ2FwX3RyY2J1ZltkZ2FwX3RyY2J1ZmldID0gJ34nOwotCi0jICBlbGlmIGRlZmluZWQoVFJDX09OX09WRVJGTE9XX1NISUZUX0JVRkZFUikKLQkJLyoKLQkJICogVGhpcyBpcyB0aGUgbW9yZSBDUFUtaW50ZW5zaXZlIHdheSB0byBkbyB0aGluZ3MuICBJZiB3ZQotCQkgKiB2ZW50dXJlIGludG8gdGhlIGxhc3QgMS84IG9mIHRoZSBidWZmZXIsIHdlIHNoaWZ0IHRoZQotCQkgKiBsYXN0IDcvOCBvZiB0aGUgYnVmZmVyIGZvcndhcmQsIHdpcGluZyBvdXQgdGhlIGZpcnN0IDEvOC4KLQkJICogQWR2YW50YWdlOiBObyB3cmFwLWFyb3VuZCwgb25seSB0cnVuY2F0aW9uIGZyb20gdGhlCi0JCSAqIGJlZ2lubmluZy4KLQkJICoKLQkJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIGlmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0Ci0JCSAqIHRpbWluZyBjaGFuZ2VzIGFmZmVjdGluZyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBkcml2ZXIgKGllLAotCQkgKiByYWNlIGNvbmRpdGlvbnMpLgotCQkgKi8KLQkJc3RyY3B5KCZkZ2FwX3RyY2J1ZltkZ2FwX3RyY2J1ZmldLCBidWYpOwotCQlkZ2FwX3RyY2J1ZmkgKz0gbGVuYnVmOwotCQlkZ2FwX3RyY2J1ZltkZ2FwX3RyY2J1ZmldID0gJ34nOwotCQlkZ2FwX3RyY2J1ZltkZ2FwX3RyY2J1ZmkrMV0gPSAnXDAnOwotCi0JCS8qIElmIHdlJ3JlIG5lYXIgdGhlIGVuZCBvZiB0aGUgdHJhY2UgYnVmZmVyLi4uICovCi0JCWlmIChkZ2FwX3RyY2J1ZmkgPiAoZGdhcF90cmNidWZfc2l6ZS84KSo3KSB7Ci0JCQkvKiBXaXBlIG91dCB0aGUgZmlyc3QgZWlnaHRoIHRvIG1ha2Ugc29tZSBtb3JlIHJvb20uICovCi0JCQlzdHJjcHkoZGdhcF90cmNidWYsICZkZ2FwX3RyY2J1ZltkZ2FwX3RyY2J1Zl9zaXplLzhdKTsKLQkJCWRnYXBfdHJjYnVmaSA9IHN0cmxlbihkZ2FwX3RyY2J1ZiktMTsKLQkJCS8qIFBsb3Agb3ZlcmZsb3cgbWVzc2FnZSBhdCB0aGUgdG9wIG9mIHRoZSBidWZmZXIuICovCi0JCQliY29weShUUkNfT1ZFUkZMT1csIGRnYXBfdHJjYnVmLCBzdHJsZW4oVFJDX09WRVJGTE9XKSk7Ci0JCX0KLSMgIGVsc2UKLSMgICBlcnJvciAiVFJDX09OX09WRVJGTE9XX1dSQVBfQVJPVU5EIG9yIFRSQ19PTl9PVkVSRkxPV19TSElGVF9CVUZGRVI/IgotIyAgZW5kaWYKLQl9Ci0JREdBUF9VTkxPQ0soZGdhcF90cmFjZWZfbG9jaywgZmxhZ3MpOwotCi0jIGVuZGlmIC8qIGRlZmluZWQoVFJDX1RPX0tNRU0pICovCi19Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChUUkNfVE9fS01FTSkgJiYgIWRlZmluZWQoVFJDX1RPX0NPTlNPTEUpICovCi0KLSNlbmRpZgotCi0vKgotICogZGdhcF90cmFjZXJfZnJlZSgpCi0gKgotICoKLSAqLwotdm9pZCBkZ2FwX3RyYWNlcl9mcmVlKHZvaWQpCi17Ci0JaWYoZGdhcF90cmNidWYpCi0JCXZmcmVlKGRnYXBfdHJjYnVmKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHJhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxZjQ2MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEhlYWRlciBmaWxlIGZvciBkZ2FwX3RyYWNlLmMKLSAqCi0gKiAkSWQ6IGRnYXBfdHJhY2UuaCx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkCi0gKi8KLQotI2lmbmRlZiBfX0RHQVBfVFJBQ0VfSAotI2RlZmluZSBfX0RHQVBfVFJBQ0VfSAotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLQotdm9pZCBkZ2FwX3RyYWNlZihjb25zdCBjaGFyICpmbXQsIC4uLik7Ci12b2lkIGRnYXBfdHJhY2VyX2ZyZWUodm9pZCk7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmYjRkZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB0dHkgZHJpdmVyIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQotICogRkVQNSBiYXNlZCBwcm9kdWN0IGxpbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAkSWQ6IGRnYXBfdHR5LmMsdiAxLjMgMjAxMS8wNi8yMyAxMjoxMTozMSBtYXJraCBFeHAgJAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogRm9yIGppZmZpZXMsIHRhc2sgc3RhdGVzICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrbGV0IGFuZCBpbnRlcnJ1cHQgc3RydWN0cy9kZWZpbmVzICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLwotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIEZvciBjb3B5X2Zyb21fdXNlci9jb3B5X3RvX3VzZXIgKi8KLSNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIEZvciByZWFkW2J3bF0vd3JpdGVbYndsXSAqLwotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLSNpbmNsdWRlICJkZ2FwX3R0eS5oIgotI2luY2x1ZGUgImRnYXBfdHlwZXMuaCIKLSNpbmNsdWRlICJkZ2FwX2ZlcDUuaCIKLSNpbmNsdWRlICJkZ2FwX3BhcnNlLmgiCi0jaW5jbHVkZSAiZGdhcF9jb25mLmgiCi0jaW5jbHVkZSAiZGdhcF9zeXNmcy5oIgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykKLSNkZWZpbmUgaW5pdF9NVVRFWChzZW0pICAgICAgICAgc2VtYV9pbml0KHNlbSwgMSkKLSNkZWZpbmUgREVDTEFSRV9NVVRFWChuYW1lKSAgICAgXAotICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIG5hbWUgPSBfX1NFTUFQSE9SRV9JTklUSUFMSVpFUihuYW1lLCAxKQotI2VuZGlmCi0KLS8qCi0gKiBpbnRlcm5hbCB2YXJpYWJsZXMKLSAqLwotc3RhdGljIHN0cnVjdCBib2FyZF90CSpkZ2FwX0JvYXJkc0J5TWFqb3JbMjU2XTsKLXN0YXRpYyB1Y2hhcgkJKmRnYXBfVG1wV3JpdGVCdWYgPSBOVUxMOwotc3RhdGljIERFQ0xBUkVfTVVURVgoZGdhcF9UbXBXcml0ZVNlbSk7Ci0KLS8qCi0gKiBEZWZhdWx0IHRyYW5zcGFyZW50IHByaW50IGluZm9ybWF0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IGRpZ2lfdCBkZ2FwX2RpZ2lfaW5pdCA9IHsKLQkuZGlnaV9mbGFncyA9CURJR0lfQ09PSywJLyogRmxhZ3MJCQkqLwotCS5kaWdpX21heGNwcyA9CTEwMCwJCS8qIE1heCBDUFMJCQkqLwotCS5kaWdpX21heGNoYXIgPQk1MCwJCS8qIE1heCBjaGFycyBpbiBwcmludCBxdWV1ZQkqLwotCS5kaWdpX2J1ZnNpemUgPQkxMDAsCQkvKiBQcmludGVyIGJ1ZmZlciBzaXplCQkqLwotCS5kaWdpX29ubGVuID0JNCwJCS8qIHNpemUgb2YgcHJpbnRlciBvbiBzdHJpbmcJKi8KLQkuZGlnaV9vZmZsZW4gPQk0LAkJLyogc2l6ZSBvZiBwcmludGVyIG9mZiBzdHJpbmcJKi8KLQkuZGlnaV9vbnN0ciA9CSJcMDMzWzVpIiwJLyogQU5TSSBwcmludGVyIG9uIHN0cmluZyBdCSovCi0JLmRpZ2lfb2Zmc3RyID0JIlwwMzNbNGkiLAkvKiBBTlNJIHByaW50ZXIgb2ZmIHN0cmluZyBdCSovCi0JLmRpZ2lfdGVybSA9CSJhbnNpIgkJLyogZGVmYXVsdCB0ZXJtaW5hbCB0eXBlCSovCi19OwotCi0KLS8qCi0gKiBEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCi0gKiB3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuCi0gKgotICogVGhpcyBkZWZpbmVzIGEgcmF3IHBvcnQgYXQgOTYwMCBiYXVkLCA4IGRhdGEgYml0cywgbm8gcGFyaXR5LAotICogMSBzdG9wIGJpdC4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGt0ZXJtaW9zIERnYXBEZWZhdWx0VGVybWlvcyA9Ci17Ci0JLmNfaWZsYWcgPQkoREVGQVVMVF9JRkxBR1MpLAkvKiBpZmxhZ3MgKi8KLQkuY19vZmxhZyA9CShERUZBVUxUX09GTEFHUyksCS8qIG9mbGFncyAqLwotCS5jX2NmbGFnID0JKERFRkFVTFRfQ0ZMQUdTKSwJLyogY2ZsYWdzICovCi0JLmNfbGZsYWcgPQkoREVGQVVMVF9MRkxBR1MpLAkvKiBsZmxhZ3MgKi8KLQkuY19jYyA9CQlJTklUX0NfQ0MsCi0JLmNfbGluZSA9IAkwLAotfTsKLQotLyogT3VyIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGRnYXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pOwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZGlnaV90IF9fdXNlciAqbmV3X2luZm8pOwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnJldGluZm8pOwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKm5ld19pbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCogdHR5KTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0KiB0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IGRnYXBfd2FpdF9mb3JfZHJhaW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IGRnYXBfc2V0X21vZGVtX2luZm8oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKTsKLXN0YXRpYyBpbnQgZGdhcF9nZXRfbW9kZW1faW5mbyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpOwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbyk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnJldGluZm8pOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzkpCi1zdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOwotI2Vsc2UKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLSNlbmRpZgotc3RhdGljIGludCBkZ2FwX3R0eV9zZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBtc2VjKTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwotc3RhdGljIGludCBkZ2FwX3R0eV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBkZ2FwX3R0eV9vcHMgPSB7Ci0JLm9wZW4gPSBkZ2FwX3R0eV9vcGVuLAotCS5jbG9zZSA9IGRnYXBfdHR5X2Nsb3NlLAotCS53cml0ZSA9IGRnYXBfdHR5X3dyaXRlLAotCS53cml0ZV9yb29tID0gZGdhcF90dHlfd3JpdGVfcm9vbSwKLQkuZmx1c2hfYnVmZmVyID0gZGdhcF90dHlfZmx1c2hfYnVmZmVyLAotCS5jaGFyc19pbl9idWZmZXIgPSBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIsCi0JLmZsdXNoX2NoYXJzID0gZGdhcF90dHlfZmx1c2hfY2hhcnMsCi0JLmlvY3RsID0gZGdhcF90dHlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0gZGdhcF90dHlfc2V0X3Rlcm1pb3MsCi0JLnN0b3AgPSBkZ2FwX3R0eV9zdG9wLAotCS5zdGFydCA9IGRnYXBfdHR5X3N0YXJ0LAotCS50aHJvdHRsZSA9IGRnYXBfdHR5X3Rocm90dGxlLAotCS51bnRocm90dGxlID0gZGdhcF90dHlfdW50aHJvdHRsZSwKLQkuaGFuZ3VwID0gZGdhcF90dHlfaGFuZ3VwLAotCS5wdXRfY2hhciA9IGRnYXBfdHR5X3B1dF9jaGFyLAotCS50aW9jbWdldCA9IGRnYXBfdHR5X3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9IGRnYXBfdHR5X3Rpb2Ntc2V0LAotCS5icmVha19jdGwgPSBkZ2FwX3R0eV9zZW5kX2JyZWFrLAotCS53YWl0X3VudGlsX3NlbnQgPSBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQsCi0JLnNlbmRfeGNoYXIgPSBkZ2FwX3R0eV9zZW5kX3hjaGFyCi19OwotCi0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUVFkgSW5pdGlhbGl6YXRpb24vQ2xlYW51cCBGdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogZGdhcF90dHlfcHJlaW5pdCgpCi0gKgotICogSW5pdGlhbGl6ZSBhbnkgZ2xvYmFsIHR0eSByZWxhdGVkIGRhdGEgYmVmb3JlIHdlIGRvd25sb2FkIGFueSBib2FyZHMuCi0gKi8KLWludCBkZ2FwX3R0eV9wcmVpbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURHQVBfTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGEgYnVmZmVyIGZvciBkb2luZyB0aGUgY29weSBmcm9tIHVzZXIgc3BhY2UgdG8KLQkgKiBrZXJuZWwgc3BhY2UgaW4gZGdhcF9pbnB1dCgpLiAgV2Ugb25seSB1c2Ugb25lIGJ1ZmZlciBhbmQKLQkgKiBjb250cm9sIGFjY2VzcyB0byBpdCB3aXRoIGEgc2VtYXBob3JlLiAgSWYgd2UgYXJlIHBhZ2luZywgd2UKLQkgKiBhcmUgYWxyZWFkeSBpbiB0cm91YmxlIHNvIG9uZSBidWZmZXIgd29uJ3QgaHVydCBtdWNoIGFueXdheS4KLQkgKi8KLQlkZ2FwX1RtcFdyaXRlQnVmID0ga21hbGxvYyhXUklURUJVRkxFTiwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWRnYXBfVG1wV3JpdGVCdWYpIHsKLQkJREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCQlEUFJfSU5JVCgoInVuYWJsZSB0byBhbGxvY2F0ZSB0bXAgd3JpdGUgYnVmIikpOwotCQlyZXR1cm4gKC1FTk9NRU0pOwotCX0KLQotICAgICAgICBER0FQX1VOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0gICAgICAgIHJldHVybigwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfcmVnaXN0ZXIoKQotICoKLSAqIEluaXQgdGhlIHR0eSBzdWJzeXN0ZW0gZm9yIHRoaXMgYm9hcmQuCi0gKi8KLWludCBkZ2FwX3R0eV9yZWdpc3RlcihzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCWludCByYyA9IDA7Ci0KLQlEUFJfSU5JVCgoInR0eV9yZWdpc3RlciBzdGFydCIpKTsKLQotCWJyZC0+U2VyaWFsRHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhQT1JUUyk7Ci0KLQlzbnByaW50ZihicmQtPlNlcmlhbE5hbWUsIE1BWFRUWU5BTUVMRU4sICJ0dHlfZGdhcF8lZF8iLCBicmQtPmJvYXJkbnVtKTsKLQlicmQtPlNlcmlhbERyaXZlci0+bmFtZSA9IGJyZC0+U2VyaWFsTmFtZTsKLQlicmQtPlNlcmlhbERyaXZlci0+bmFtZV9iYXNlID0gMDsKLQlicmQtPlNlcmlhbERyaXZlci0+bWFqb3IgPSAwOwotCWJyZC0+U2VyaWFsRHJpdmVyLT5taW5vcl9zdGFydCA9IDA7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCWJyZC0+U2VyaWFsRHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOwotCWJyZC0+U2VyaWFsRHJpdmVyLT5pbml0X3Rlcm1pb3MgPSBEZ2FwRGVmYXVsdFRlcm1pb3M7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPmRyaXZlcl9uYW1lID0gRFJWU1RSOwotCWJyZC0+U2VyaWFsRHJpdmVyLT5mbGFncyA9IChUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFViB8IFRUWV9EUklWRVJfSEFSRFdBUkVfQlJFQUspOwotCi0JLyogVGhlIGtlcm5lbCB3YW50cyBzcGFjZSB0byBzdG9yZSBwb2ludGVycyB0byB0dHlfc3RydWN0cyAqLwotCWJyZC0+U2VyaWFsRHJpdmVyLT50dHlzID0ga3phbGxvYyhNQVhQT1JUUyAqIHNpemVvZihzdHJ1Y3QgdHR5X3N0cnVjdCAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFicmQtPlNlcmlhbERyaXZlci0+dHR5cykKLQkJcmV0dXJuKC1FTk9NRU0pOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQotCWJyZC0+U2VyaWFsRHJpdmVyLT5yZWZjb3VudCA9IGJyZC0+VHR5UmVmQ250OwotI2VuZGlmCi0KLQkvKgotCSAqIEVudHJ5IHBvaW50cyBmb3IgZHJpdmVyLiAgQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgZnJvbQotCSAqIHR0eV9pby5jIGFuZCBuX3R0eS5jLgotCSAqLwotCXR0eV9zZXRfb3BlcmF0aW9ucyhicmQtPlNlcmlhbERyaXZlciwgJmRnYXBfdHR5X29wcyk7Ci0KLQkvKgotCSAqIElmIHdlJ3JlIGRvaW5nIHRyYW5zcGFyZW50IHByaW50LCB3ZSBoYXZlIHRvIGRvIGFsbCBvZiB0aGUgYWJvdmUKLQkgKiBhZ2Fpbiwgc2VwYXJhdGVseSBzbyB3ZSBkb24ndCBnZXQgdGhlIExEIGNvbmZ1c2VkIGFib3V0IHdoYXQgbWFqb3IKLQkgKiB3ZSBhcmUgd2hlbiB3ZSBnZXQgaW50byB0aGUgZGdhcF90dHlfb3BlbigpIHJvdXRpbmUuCi0JICovCi0JYnJkLT5QcmludERyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYUE9SVFMpOwotCi0Jc25wcmludGYoYnJkLT5QcmludE5hbWUsIE1BWFRUWU5BTUVMRU4sICJwcl9kZ2FwXyVkXyIsIGJyZC0+Ym9hcmRudW0pOwotCWJyZC0+UHJpbnREcml2ZXItPm5hbWUgPSBicmQtPlByaW50TmFtZTsKLQlicmQtPlByaW50RHJpdmVyLT5uYW1lX2Jhc2UgPSAwOwotCWJyZC0+UHJpbnREcml2ZXItPm1ham9yID0gMDsKLQlicmQtPlByaW50RHJpdmVyLT5taW5vcl9zdGFydCA9IDA7Ci0JYnJkLT5QcmludERyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7Ci0JYnJkLT5QcmludERyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlicmQtPlByaW50RHJpdmVyLT5pbml0X3Rlcm1pb3MgPSBEZ2FwRGVmYXVsdFRlcm1pb3M7Ci0JYnJkLT5QcmludERyaXZlci0+ZHJpdmVyX25hbWUgPSBEUlZTVFI7Ci0JYnJkLT5QcmludERyaXZlci0+ZmxhZ3MgPSAoVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfCBUVFlfRFJJVkVSX0hBUkRXQVJFX0JSRUFLKTsKLQotCS8qIFRoZSBrZXJuZWwgd2FudHMgc3BhY2UgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdHR5X3N0cnVjdHMgKi8KLQlicmQtPlByaW50RHJpdmVyLT50dHlzID0ga3phbGxvYyhNQVhQT1JUUyAqIHNpemVvZihzdHJ1Y3QgdHR5X3N0cnVjdCAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFicmQtPlByaW50RHJpdmVyLT50dHlzKQotCQlyZXR1cm4oLUVOT01FTSk7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjgpCi0JYnJkLT5QcmludERyaXZlci0+cmVmY291bnQgPSBicmQtPlR0eVJlZkNudDsKLSNlbmRpZgotCi0JLyoKLQkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KLQkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KLQkgKi8KLQl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5QcmludERyaXZlciwgJmRnYXBfdHR5X29wcyk7Ci0KLQlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCkgewotCQkvKiBSZWdpc3RlciB0dHkgZGV2aWNlcyAqLwotCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlBUFIoKCJDYW4ndCByZWdpc3RlciB0dHkgZGV2aWNlICglZClcbiIsIHJjKSk7Ci0JCQlyZXR1cm4ocmMpOwotCQl9Ci0JCWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlNlcmlhbERyaXZlci0+bWFqb3JdID0gYnJkOwotCQlicmQtPmRnYXBfU2VyaWFsX01ham9yID0gYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yOwotCX0KLQotCWlmICghYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCkgewotCQkvKiBSZWdpc3RlciBUcmFuc3BhcmVudCBQcmludCBkZXZpY2VzICovCi0gCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUFQUigoIkNhbid0IHJlZ2lzdGVyIFRyYW5zcGFyZW50IFByaW50IGRldmljZSAoJWQpXG4iLCByYykpOwotCQkJcmV0dXJuKHJjKTsKLQkJfQotCQlicmQtPmRnYXBfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkID0gVFJVRTsKLQkJZGdhcF9Cb2FyZHNCeU1ham9yW2JyZC0+UHJpbnREcml2ZXItPm1ham9yXSA9IGJyZDsKLQkJYnJkLT5kZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3IgPSBicmQtPlByaW50RHJpdmVyLT5tYWpvcjsKLQl9Ci0KLQlEUFJfSU5JVCgoIkRHQVAgUkVHSVNURVIgVFRZOiBNQUpPUlM6ICVkICVkXG4iLCBicmQtPlNlcmlhbERyaXZlci0+bWFqb3IsCi0JCWJyZC0+UHJpbnREcml2ZXItPm1ham9yKSk7Ci0KLQlyZXR1cm4gKHJjKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfaW5pdCgpCi0gKgotICogSW5pdCB0aGUgdHR5IHN1YnN5c3RlbS4gIENhbGxlZCBvbmNlIHBlciBib2FyZCBhZnRlciBib2FyZCBoYXMgYmVlbgotICogZG93bmxvYWRlZCBhbmQgaW5pdCdlZC4KLSAqLwotaW50IGRnYXBfdHR5X2luaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgaTsKLQlpbnQgdGx3OwotCXVpbnQgdHJ1ZV9jb3VudCA9IDA7Ci0JdWNoYXIgKnZhZGRyOwotCXVjaGFyIG1vZGVtID0gMDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgYnNfdCAqYnM7Ci0Jc3RydWN0IGNtX3QgKmNtOwotCi0JaWYgKCFicmQpCi0JCXJldHVybiAoLUVOWElPKTsKLQotCURQUl9JTklUKCgiZGdhcF90dHlfaW5pdCBzdGFydFxuIikpOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIGJvYXJkIHN0cnVjdHVyZSBlbGVtZW50cy4KLQkgKi8KLQotCXZhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKLQl0cnVlX2NvdW50ID0gcmVhZHcoKHZhZGRyICsgTkNIQU4pKTsKLQotCWJyZC0+bmFzeW5jID0gZGdhcF9jb25maWdfZ2V0X251bWJlcl9vZl9wb3J0cyhicmQpOwotCi0JaWYgKCFicmQtPm5hc3luYykgewotCQlicmQtPm5hc3luYyA9IGJyZC0+bWF4cG9ydHM7Ci0JfQotCi0JaWYgKGJyZC0+bmFzeW5jID4gYnJkLT5tYXhwb3J0cykgewotCQlicmQtPm5hc3luYyA9IGJyZC0+bWF4cG9ydHM7Ci0JfQotCi0JaWYgKHRydWVfY291bnQgIT0gYnJkLT5uYXN5bmMpIHsKLQkJaWYgKChicmQtPnR5cGUgPT0gUFBDTSkgJiYgKHRydWVfY291bnQgPT0gNjQpKSB7Ci0JCQlBUFIoKCIqKipXQVJOSU5HKioqKiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuUGxlYXNlIG1ha2UgU1VSRSB0aGUgRUJJIGNhYmxlIHJ1bm5pbmcgZnJvbSB0aGUgY2FyZFxudG8gZWFjaCBFTSBtb2R1bGUgaXMgcGx1Z2dlZCBpbnRvIEVCSSBJTiFcbiIsCi0JCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCkpOwotCQl9Ci0JCWVsc2UgaWYgKChicmQtPnR5cGUgPT0gUFBDTSkgJiYgKHRydWVfY291bnQgPT0gMCkpIHsKLQkJCUFQUigoIioqKldBUk5JTkcqKioqICVzIGNvbmZpZ3VyZWQgZm9yICVkIHBvcnRzLCBoYXMgJWQgcG9ydHMuXG5QbGVhc2UgbWFrZSBTVVJFIHRoZSBFQkkgY2FibGUgcnVubmluZyBmcm9tIHRoZSBjYXJkXG50byBlYWNoIEVNIG1vZHVsZSBpcyBwbHVnZ2VkIGludG8gRUJJIElOIVxuIiwKLQkJCQlicmQtPm5hbWUsIGJyZC0+bmFzeW5jLCB0cnVlX2NvdW50KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBUFIoKCIqKipXQVJOSU5HKioqKiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuIiwKLQkJCQlicmQtPm5hbWUsIGJyZC0+bmFzeW5jLCB0cnVlX2NvdW50KSk7Ci0JCX0KLQotCQlicmQtPm5hc3luYyA9IHRydWVfY291bnQ7Ci0KLQkJLyogSWYgbm8gcG9ydHMsIGRvbid0IGJvdGhlciBnb2luZyBhbnkgZnVydGhlciAqLwotCQlpZiAoIWJyZC0+bmFzeW5jKSB7Ci0JCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKLQkJCXJldHVybigtRU5YSU8pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBBbGxvY2F0ZSBjaGFubmVsIG1lbW9yeSB0aGF0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkCi0JICogd2hlbiB0aGUgZHJpdmVyIHdhcyBmaXJzdCBsb2FkZWQuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKLQkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKSB7Ci0JCQlicmQtPmNoYW5uZWxzW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5uZWxfdCksIEdGUF9BVE9NSUMpOwotCQkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKSB7Ci0JCQkJRFBSX0NPUkUoKCIlczolZCBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjaGFubmVsIHN0cnVjdFxuIiwKLQkJCQkgICAgX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljaCA9IGJyZC0+Y2hhbm5lbHNbMF07Ci0JdmFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCi0JYnMgPSAoc3RydWN0IGJzX3QgKikgKCh1bG9uZykgdmFkZHIgKyBDSEFOQlVGKTsKLQljbSA9IChzdHJ1Y3QgY21fdCAqKSAoKHVsb25nKSB2YWRkciArIENNREJVRik7Ci0KLQlicmQtPmJkX2JzID0gYnM7Ci0KLQkvKiBTZXQgdXAgY2hhbm5lbCB2YXJpYWJsZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKywgY2ggPSBicmQtPmNoYW5uZWxzW2ldLCBicysrKSB7Ci0KLQkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKQotCQkJY29udGludWU7Ci0KLQkJREdBUF9TUElOTE9DS19JTklUKGNoLT5jaF9sb2NrKTsKLQotCQkvKiBTdG9yZSBhbGwgb3VyIG1hZ2ljIG51bWJlcnMgKi8KLQkJY2gtPm1hZ2ljID0gREdBUF9DSEFOTkVMX01BR0lDOwotCQljaC0+Y2hfdHVuLm1hZ2ljID0gREdBUF9VTklUX01BR0lDOwotCQljaC0+Y2hfdHVuLnVuX3R5cGUgPSBER0FQX1NFUklBTDsKLQkJY2gtPmNoX3R1bi51bl9jaCA9IGNoOwotCQljaC0+Y2hfdHVuLnVuX2RldiA9IGk7Ci0KLQkJY2gtPmNoX3B1bi5tYWdpYyA9IERHQVBfVU5JVF9NQUdJQzsKLQkJY2gtPmNoX3B1bi51bl90eXBlID0gREdBUF9QUklOVDsKLQkJY2gtPmNoX3B1bi51bl9jaCA9IGNoOwotCQljaC0+Y2hfcHVuLnVuX2RldiA9IGk7Ci0KLQkJY2gtPmNoX3ZhZGRyID0gdmFkZHI7Ci0JCWNoLT5jaF9icyA9IGJzOwotCQljaC0+Y2hfY20gPSBjbTsKLQkJY2gtPmNoX2JkID0gYnJkOwotCQljaC0+Y2hfcG9ydG51bSA9IGk7Ci0JCWNoLT5jaF9kaWdpID0gZGdhcF9kaWdpX2luaXQ7Ci0KLQkJLyoKLQkJICogU2V0IHVwIGRpZ2kgZHNyIGFuZCBkY2QgYml0cyBiYXNlZCBvbiBhbHRwaW4gZmxhZy4KLQkJICovCi0JCWlmIChkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKGJyZCkpIHsKLQkJCWNoLT5jaF9kc3IJPSBETV9DRDsKLQkJCWNoLT5jaF9jZAk9IERNX0RTUjsKLQkJCWNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgfD0gRElHSV9BTFRQSU47Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaC0+Y2hfY2QJPSBETV9DRDsKLQkJCWNoLT5jaF9kc3IJPSBETV9EU1I7Ci0JCX0KLQotCQljaC0+Y2hfdGFkZHIgPSB2YWRkciArICgoY2gtPmNoX2JzLT50eF9zZWcpIDw8IDQpOwotCQljaC0+Y2hfcmFkZHIgPSB2YWRkciArICgoY2gtPmNoX2JzLT5yeF9zZWcpIDw8IDQpOwotCQljaC0+Y2hfdHhfd2luID0gMDsKLQkJY2gtPmNoX3J4X3dpbiA9IDA7Ci0JCWNoLT5jaF90c2l6ZSA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9tYXgpKSArIDE7Ci0JCWNoLT5jaF9yc2l6ZSA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9tYXgpKSArIDE7Ci0JCWNoLT5jaF90c3RhcnQgPSAwOwotCQljaC0+Y2hfcnN0YXJ0ID0gMDsKLQotCQkvKiAuMjUgc2Vjb25kIGRlbGF5ICovCi0JCWNoLT5jaF9jbG9zZV9kZWxheSA9IDI1MDsKLQotCQkvKgotCQkgKiBTZXQgcXVldWUgd2F0ZXIgbWFya3MsIGludGVycnVwdCBtYXNrLAotCQkgKiBhbmQgZ2VuZXJhbCB0dHkgcGFyYW1ldGVycy4KLQkJICovCi0JCWNoLT5jaF90bHcgPSB0bHcgPSBjaC0+Y2hfdHNpemUgPj0gMjAwMCA/ICgoY2gtPmNoX3RzaXplICogNSkgLyA4KSA6IGNoLT5jaF90c2l6ZSAvIDI7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTVExPVywgdGx3LCAwKTsKLQotCQlkZ2FwX2NtZHcoY2gsIFNSTE9XLCBjaC0+Y2hfcnNpemUgLyAyLCAwKTsKLQotCQlkZ2FwX2NtZHcoY2gsIFNSSElHSCwgNyAqIGNoLT5jaF9yc2l6ZSAvIDgsIDApOwotCi0JCWNoLT5jaF9taXN0YXQgPSByZWFkYigmKGNoLT5jaF9icy0+bV9zdGF0KSk7Ci0KLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfc25pZmZfd2FpdCk7Ci0KLQkJLyogVHVybiBvbiBhbGwgbW9kZW0gaW50ZXJydXB0cyBmb3Igbm93ICovCi0JCW1vZGVtID0gKERNX0NEIHwgRE1fRFNSIHwgRE1fQ1RTIHwgRE1fUkkpOwotCQl3cml0ZWIobW9kZW0sICYoY2gtPmNoX2JzLT5tX2ludCkpOwotCi0JCS8qCi0JCSAqIFNldCBlZGVsYXkgdG8gMCBpZiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24sCi0JCSAqIG90aGVyd2lzZSBzZXQgZWRlbGF5IHRvIHRoZSB1c3VhbCAxMDAuCi0JCSAqLwotCQlpZiAoYnJkLT5pbnRyX3VzZWQpCi0JCQl3cml0ZXcoMCwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOwotCQllbHNlCi0JCQl3cml0ZXcoMTAwLCAmKGNoLT5jaF9icy0+ZWRlbGF5KSk7Ci0KLQkJd3JpdGViKDEsICYoY2gtPmNoX2JzLT5pZGF0YSkpOwotCX0KLQotCi0JRFBSX0lOSVQoKCJkZ2FwX3R0eV9pbml0IGZpbmlzaFxuIikpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfcG9zdF91bmluaXQoKQotICoKLSAqIFVuSW5pdGlhbGl6ZSBhbnkgZ2xvYmFsIHR0eSByZWxhdGVkIGRhdGEuCi0gKi8KLXZvaWQgZGdhcF90dHlfcG9zdF91bmluaXQodm9pZCkKLXsKLQlrZnJlZShkZ2FwX1RtcFdyaXRlQnVmKTsKLQlkZ2FwX1RtcFdyaXRlQnVmID0gTlVMTDsKLX0KLQotCi0vKgotICogZGdhcF90dHlfdW5pbml0KCkKLSAqCi0gKiBVbmluaXRpYWxpemUgdGhlIFRUWSBwb3J0aW9uIG9mIHRoaXMgZHJpdmVyLiAgRnJlZSBhbGwgbWVtb3J5IGFuZAotICogcmVzb3VyY2VzLgotICovCi12b2lkIGRnYXBfdHR5X3VuaW5pdChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCWludCBpID0gMDsKLQotCWlmIChicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQpIHsKLQkJZGdhcF9Cb2FyZHNCeU1ham9yW2JyZC0+U2VyaWFsRHJpdmVyLT5tYWpvcl0gPSBOVUxMOwotCQlicmQtPmRnYXBfU2VyaWFsX01ham9yID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKLQkJCWRnYXBfcmVtb3ZlX3R0eV9zeXNmcyhicmQtPmNoYW5uZWxzW2ldLT5jaF90dW4udW5fc3lzZnMpOwotCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+U2VyaWFsRHJpdmVyLCBpKTsKLQkJfQotCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOwotCQlrZnJlZShicmQtPlNlcmlhbERyaXZlci0+dHR5cyk7Ci0JCWJyZC0+U2VyaWFsRHJpdmVyLT50dHlzID0gTlVMTDsKLQkJcHV0X3R0eV9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOwotCQlicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQgPSBGQUxTRTsKLQl9Ci0KLQlpZiAoYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCkgewotCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5QcmludERyaXZlci0+bWFqb3JdID0gTlVMTDsKLQkJYnJkLT5kZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3IgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykgewotCQkJZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKGJyZC0+Y2hhbm5lbHNbaV0tPmNoX3B1bi51bl9zeXNmcyk7Ci0JCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoYnJkLT5QcmludERyaXZlciwgaSk7Ci0JCX0KLQkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGJyZC0+UHJpbnREcml2ZXIpOwotCQlrZnJlZShicmQtPlByaW50RHJpdmVyLT50dHlzKTsKLQkJYnJkLT5QcmludERyaXZlci0+dHR5cyA9IE5VTEw7Ci0JCXB1dF90dHlfZHJpdmVyKGJyZC0+UHJpbnREcml2ZXIpOwotCQlicmQtPmRnYXBfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkID0gRkFMU0U7Ci0JfQotfQotCi0KLSNkZWZpbmUgVE1QQlVGTEVOICgxMDI0KQotCi0vKgotICogZGdhcF9zbmlmZiAtIER1bXAgZGF0YSBvdXQgdG8gdGhlICJzbmlmZiIgYnVmZmVyIGlmIHRoZQotICogcHJvYyBzbmlmZiBmaWxlIGlzIG9wZW5lZC4uLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyICp0ZXh0LCB1Y2hhciAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCB0aW1ldmFsIHR2OwotCWludCBuOwotCWludCByOwotCWludCBuYnVmOwotCWludCBpOwotCWludCB0bXBidWZsZW47Ci0JY2hhciB0bXBidWZbVE1QQlVGTEVOXTsKLQljaGFyICpwID0gdG1wYnVmOwotCWludCB0b29fbXVjaF9kYXRhOwotCi0JLyogTGVhdmUgaWYgc25pZmYgbm90IG9wZW4gKi8KLQlpZiAoIShjaC0+Y2hfc25pZmZfZmxhZ3MgJiBTTklGRl9PUEVOKSkKLQkJcmV0dXJuOwotCi0JZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0KLQkvKiBDcmVhdGUgb3VyIGhlYWRlciBmb3IgZGF0YSBkdW1wICovCi0JcCArPSBzcHJpbnRmKHAsICI8JWxkICVsZD48JXM+PCIsIHR2LnR2X3NlYywgdHYudHZfdXNlYywgdGV4dCk7Ci0JdG1wYnVmbGVuID0gcCAtIHRtcGJ1ZjsKLQotCWRvIHsKLQkJdG9vX211Y2hfZGF0YSA9IDA7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGxlbiAmJiB0bXBidWZsZW4gPCAoVE1QQlVGTEVOIC0gNCk7IGkrKykgewotCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4ICIsICpidWYpOwotCQkJYnVmKys7Ci0JCQl0bXBidWZsZW4gPSBwIC0gdG1wYnVmOwotCQl9Ci0KLQkJaWYgKHRtcGJ1ZmxlbiA8IChUTVBCVUZMRU4gLSA0KSkgewotCQkJaWYgKGkgPiAwKQotCQkJCXAgKz0gc3ByaW50ZihwIC0gMSwgIiVzXG4iLCAiPiIpOwotCQkJZWxzZQotCQkJCXAgKz0gc3ByaW50ZihwLCAiJXNcbiIsICI+Iik7Ci0JCX0gZWxzZSB7Ci0JCQl0b29fbXVjaF9kYXRhID0gMTsKLQkJCWxlbiAtPSBpOwotCQl9Ci0KLQkJbmJ1ZiA9IHN0cmxlbih0bXBidWYpOwotCQlwID0gdG1wYnVmOwotCi0JCS8qCi0JCSAqICBMb29wIHdoaWxlIGRhdGEgcmVtYWlucy4KLQkJICovCi0JCXdoaWxlIChuYnVmID4gMCAmJiBjaC0+Y2hfc25pZmZfYnVmKSB7Ci0JCQkvKgotCQkJICogIERldGVybWluZSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZSBsZWZ0IGluIHRoZQotCQkJICogIGJ1ZmZlci4gIElmIHRoZXJlJ3Mgbm9uZSwgd2FpdCB1bnRpbCBzb21lIGFwcGVhcnMuCi0JCQkgKi8KLQkJCW4gPSAoY2gtPmNoX3NuaWZmX291dCAtIGNoLT5jaF9zbmlmZl9pbiAtIDEpICYgU05JRkZfTUFTSzsKLQotCQkJLyoKLQkJCSAqIElmIHRoZXJlIGlzIG5vIHNwYWNlIGxlZnQgdG8gd3JpdGUgdG8gaW4gb3VyIHNuaWZmIGJ1ZmZlciwKLQkJCSAqIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkcm9wIHRoZSBkYXRhLgotCQkJICogV2UgKmNhbm5vdCogc2xlZXAgaGVyZSB3YWl0aW5nIGZvciBzcGFjZSwgYmVjYXVzZSB0aGlzCi0JCQkgKiBmdW5jdGlvbiB3YXMgcHJvYmFibHkgY2FsbGVkIGJ5IHRoZSBpbnRlcnJ1cHQvdGltZXIgcm91dGluZXMhCi0JCQkgKi8KLQkJCWlmIChuID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBDb3B5IGFzIG11Y2ggZGF0YSBhcyB3aWxsIGZpdC4KLQkJCSAqLwotCi0JCQlpZiAobiA+IG5idWYpCi0JCQkJbiA9IG5idWY7Ci0KLQkJCXIgPSBTTklGRl9NQVggLSBjaC0+Y2hfc25pZmZfaW47Ci0KLQkJCWlmIChyIDw9IG4pIHsKLQkJCQltZW1jcHkoY2gtPmNoX3NuaWZmX2J1ZiArIGNoLT5jaF9zbmlmZl9pbiwgcCwgcik7Ci0KLQkJCQluIC09IHI7Ci0JCQkJY2gtPmNoX3NuaWZmX2luID0gMDsKLQkJCQlwICs9IHI7Ci0JCQkJbmJ1ZiAtPSByOwotCQkJfQotCi0JCQltZW1jcHkoY2gtPmNoX3NuaWZmX2J1ZiArIGNoLT5jaF9zbmlmZl9pbiwgcCwgbik7Ci0KLQkJCWNoLT5jaF9zbmlmZl9pbiArPSBuOwotCQkJcCArPSBuOwotCQkJbmJ1ZiAtPSBuOwotCi0JCQkvKgotCQkJICogIFdha2V1cCBhbnkgdGhyZWFkIHdhaXRpbmcgZm9yIGRhdGEKLQkJCSAqLwotCQkJaWYgKGNoLT5jaF9zbmlmZl9mbGFncyAmIFNOSUZGX1dBSVRfREFUQSkgewotCQkJCWNoLT5jaF9zbmlmZl9mbGFncyAmPSB+U05JRkZfV0FJVF9EQVRBOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3NuaWZmX3dhaXQpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogSWYgdGhlIHVzZXIgc2VudCB1cyB0b28gbXVjaCBkYXRhIHRvIHB1c2ggaW50byBvdXIgdG1wYnVmLAotCQkgKiB3ZSBuZWVkIHRvIGtlZXAgbG9vcGluZyBhcm91bmQgb24gYWxsIHRoZSBkYXRhLgotCQkgKi8KLQkJaWYgKHRvb19tdWNoX2RhdGEpIHsKLQkJCXAgPSB0bXBidWY7Ci0JCQl0bXBidWZsZW4gPSAwOwotCQl9Ci0KLQl9IHdoaWxlICh0b29fbXVjaF9kYXRhKTsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICBkZ2FwX2lucHV0IC0gUHJvY2VzcyByZWNlaXZlZCBkYXRhLgotICoKLSAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotdm9pZCBkZ2FwX2lucHV0KHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgYnNfdAkqYnM7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnRwOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCXVpbnQJcm1hc2s7Ci0JdWludAloZWFkOwotCXVpbnQJdGFpbDsKLQlpbnQJZGF0YV9sZW47Ci0JdWxvbmcJbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCWludCBmbGlwX2xlbjsKLQlpbnQgbGVuID0gMDsKLQlpbnQgbiA9IDA7Ci0JdWNoYXIgKmJ1ZjsKLQl1Y2hhciB0bXBjaGFyOwotCWludCBzID0gMDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JdHAgPSBjaC0+Y2hfdHVuLnVuX3R0eTsKLQotCWJzICA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZighYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9SRUFEKCgiZGdhcF9pbnB1dCBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCS8qCi0JICogICAgICBGaWd1cmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBidWZmZXIuCi0JICogICAgICBFeGl0IGltbWVkaWF0ZWx5IGlmIG5vbmUuCi0JICovCi0KLQlybWFzayA9IGNoLT5jaF9yc2l6ZSAtIDE7Ci0KLQloZWFkID0gcmVhZHcoJihicy0+cnhfaGVhZCkpOwotCWhlYWQgJj0gcm1hc2s7Ci0JdGFpbCA9IHJlYWR3KCYoYnMtPnJ4X3RhaWwpKTsKLQl0YWlsICY9IHJtYXNrOwotCi0JZGF0YV9sZW4gPSAoaGVhZCAtIHRhaWwpICYgcm1hc2s7Ci0KLQlpZiAoZGF0YV9sZW4gPT0gMCkgewotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfUkVBRCgoIk5vIGRhdGEgb24gcG9ydCAlZFxuIiwgY2gtPmNoX3BvcnRudW0pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogSWYgdGhlIGRldmljZSBpcyBub3Qgb3Blbiwgb3IgQ1JFQUQgaXMgb2ZmLCBmbHVzaAotCSAqIGlucHV0IGRhdGEgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkgfHwgIXRwICB8fCAodHAtPm1hZ2ljICE9IFRUWV9NQUdJQykgfHwKLSAgICAgICAgICAgICEoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0lTT1BFTikgfHwgISh0cC0+dGVybWlvcy5jX2NmbGFnICYgQ1JFQUQpIHx8Ci0JICAgIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fQ0xPU0lORykpIHsKLQotCQlEUFJfUkVBRCgoImlucHV0LiBkcm9wcGluZyAlZCBieXRlcyBvbiBwb3J0ICVkLi4uXG4iLCBkYXRhX2xlbiwgY2gtPmNoX3BvcnRudW0pKTsKLQkJRFBSX1JFQUQoKCJpbnB1dC4gdHA6ICVwIHRwLT5tYWdpYzogJXggTUFHSUM6JXggY2ggZmxhZ3M6ICV4XG4iLAotCQkJdHAsIHRwID8gdHAtPm1hZ2ljIDogMCwgVFRZX01BR0lDLCBjaC0+Y2hfdHVuLnVuX2ZsYWdzKSk7Ci0JCXdyaXRldyhoZWFkLCAmKGJzLT5yeF90YWlsKSk7Ci0JCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHdlIGFyZSB0aHJvdHRsZWQsIHNpbXBseSBkb24ndCByZWFkIGFueSBkYXRhLgotCSAqLwotCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SWEJMT0NLKSB7Ci0JCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURQUl9SRUFEKCgiUG9ydCAlZCB0aHJvdHRsZWQsIG5vdCByZWFkaW5nIGFueSBkYXRhLiBoZWFkOiAleCB0YWlsOiAleFxuIiwKLQkJCWNoLT5jaF9wb3J0bnVtLCBoZWFkLCB0YWlsKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqICAgICAgSWdub3JlIG9ydW5zLgotCSAqLwotCXRtcGNoYXIgPSByZWFkYigmKGJzLT5vcnVuKSk7Ci0JaWYgKHRtcGNoYXIpIHsKLQkJY2gtPmNoX2Vycl9vdmVycnVuKys7Ci0JCXdyaXRlYigwLCAmKGJzLT5vcnVuKSk7Ci0JfQotCi0JRFBSX1JFQUQoKCJkZ2FwX2lucHV0IHN0YXJ0IDJcbiIpKTsKLQotCS8qIERlY2lkZSBob3cgbXVjaCBkYXRhIHdlIGNhbiBzZW5kIGludG8gdGhlIHR0eSBsYXllciAqLwotCWZsaXBfbGVuID0gVFRZX0ZMSVBCVUZfU0laRTsKLQotCS8qIENob3AgZG93biB0aGUgbGVuZ3RoLCBpZiBuZWVkZWQgKi8KLQlsZW4gPSBtaW4oZGF0YV9sZW4sIGZsaXBfbGVuKTsKLQlsZW4gPSBtaW4obGVuLCAoTl9UVFlfQlVGX1NJWkUgLSAxKSk7Ci0KLQlsZCA9IHR0eV9sZGlzY19yZWYodHApOwotCi0jaWZkZWYgVFRZX0RPTlRfRkxJUAotCS8qCi0JICogSWYgdGhlIERPTlRfRkxJUCBmbGFnIGlzIG9uLCBkb24ndCBmbHVzaCBvdXIgYnVmZmVyLCBhbmQgYWN0Ci0JICogbGlrZSB0aGUgbGQgZG9lc24ndCBoYXZlIGFueSBzcGFjZSB0byBwdXQgdGhlIGRhdGEgcmlnaHQgbm93LgotCSAqLwotCWlmICh0ZXN0X2JpdChUVFlfRE9OVF9GTElQLCAmdHAtPmZsYWdzKSkKLQkJbGVuID0gMDsKLSNlbmRpZgotCi0JLyoKLQkgKiBJZiB3ZSB3ZXJlIHVuYWJsZSB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxkLAotCSAqIGRvbid0IGZsdXNoIG91ciBidWZmZXIsIGFuZCBhY3QgbGlrZSB0aGUgbGQgZG9lc24ndAotCSAqIGhhdmUgYW55IHNwYWNlIHRvIHB1dCB0aGUgZGF0YSByaWdodCBub3cuCi0JICovCi0JaWYgKCFsZCkgewotCQlsZW4gPSAwOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIGxkIGRvZXNuJ3QgaGF2ZSBhIHBvaW50ZXIgdG8gYSByZWNlaXZlX2J1ZiBmdW5jdGlvbiwKLQkJICogZmx1c2ggdGhlIGRhdGEsIHRoZW4gYWN0IGxpa2UgdGhlIGxkIGRvZXNuJ3QgaGF2ZSBhbnkKLQkJICogc3BhY2UgdG8gcHV0IHRoZSBkYXRhIHJpZ2h0IG5vdy4KLQkJICovCi0JCWlmICghbGQtPm9wcy0+cmVjZWl2ZV9idWYpIHsKLQkJCXdyaXRldyhoZWFkLCAmKGJzLT5yeF90YWlsKSk7Ci0JCQlsZW4gPSAwOwotCQl9Ci0JfQotCi0JaWYgKGxlbiA8PSAwKSB7Ci0JCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURQUl9SRUFEKCgiZGdhcF9pbnB1dCAxIC0gZmluaXNoXG4iKSk7Ci0JCWlmIChsZCkKLQkJCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlidWYgPSBjaC0+Y2hfYmQtPmZsaXBidWY7Ci0JbiA9IGxlbjsKLQotCS8qCi0JICogbiBub3cgY29udGFpbnMgdGhlIG1vc3QgYW1vdW50IG9mIGRhdGEgd2UgY2FuIGNvcHksCi0JICogYm91bmRlZCBlaXRoZXIgYnkgb3VyIGJ1ZmZlciBzaXplIG9yIHRoZSBhbW91bnQKLQkgKiBvZiBkYXRhIHRoZSBjYXJkIGFjdHVhbGx5IGhhcyBwZW5kaW5nLi4uCi0JICovCi0Jd2hpbGUgKG4pIHsKLQotCQlzID0gKChoZWFkID49IHRhaWwpID8gaGVhZCA6IGNoLT5jaF9yc2l6ZSkgLSB0YWlsOwotCQlzID0gbWluKHMsIG4pOwotCi0JCWlmIChzIDw9IDApCi0JCQlicmVhazsKLQotCQltZW1jcHlfZnJvbWlvKGJ1ZiwgKGNoYXIgKikgY2gtPmNoX3JhZGRyICsgdGFpbCwgcyk7Ci0JCWRnYXBfc25pZmZfbm93YWl0X25vbG9jayhjaCwgIlVTRVIgUkVBRCIsIGJ1Ziwgcyk7Ci0KLQkJdGFpbCArPSBzOwotCQlidWYgKz0gczsKLQotCQluIC09IHM7Ci0JCS8qIEZsaXAgcXVldWUgaWYgbmVlZGVkICovCi0JCXRhaWwgJj0gcm1hc2s7Ci0JfQotCi0Jd3JpdGV3KHRhaWwsICYoYnMtPnJ4X3RhaWwpKTsKLQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQljaC0+Y2hfcnhjb3VudCArPSBsZW47Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBjb21wbGV0ZWx5IHJhdywgd2UgZG9uJ3QgbmVlZCB0byBnbyB0aHJvdWdoIGEgbG90Ci0JICogb2YgdGhlIHR0eSBsYXllcnMgdGhhdCBleGlzdC4KLQkgKiBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIHNob3J0ZXN0IGFuZCBmYXN0ZXN0IHJvdXRlIHdlCi0JICogY2FuIHRvIHJlbGF5IHRoZSBkYXRhIHRvIHRoZSB1c2VyLgotCSAqCi0JICogT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGFyZSBub3QgcmF3LCB3ZSBuZWVkIHRvIGdvIHRocm91Z2gKLQkgKiB0aGUgdHR5IGxheWVyLCB3aGljaCBoYXMgaXRzIEFQSSBtb3JlIHdlbGwgZGVmaW5lZC4KLQkgKi8KLQlpZiAoSV9QQVJNUksodHApIHx8IElfQlJLSU5UKHRwKSB8fCBJX0lOUENLKHRwKSkgewotCQlkZ2FwX3Bhcml0eV9zY2FuKGNoLCBjaC0+Y2hfYmQtPmZsaXBidWYsIGNoLT5jaF9iZC0+ZmxpcGZsYWdidWYsICZsZW4pOwotCi0JCWxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHRwLT5wb3J0LCBsZW4pOwotCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nX2ZsYWdzKHRwLT5wb3J0LCBjaC0+Y2hfYmQtPmZsaXBidWYsCi0JCQljaC0+Y2hfYmQtPmZsaXBmbGFnYnVmLCBsZW4pOwotCX0KLQllbHNlIHsKLQkJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHAtPnBvcnQsIGxlbik7Ci0JCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHAtPnBvcnQsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwgbGVuKTsKLQl9Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCS8qIFRlbGwgdGhlIHR0eSBsYXllciBpdHMgb2theSB0byAiZWF0IiB0aGUgZGF0YSBub3cgKi8KLQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0cC0+cG9ydCk7Ci0KLQlpZiAobGQpCi0JCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0KLQlEUFJfUkVBRCgoImRnYXBfaW5wdXQgLSBmaW5pc2hcbiIpKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZXRlcm1pbmVzIHdoZW4gQ0FSUklFUiBjaGFuZ2VzIHN0YXRlIGFuZCB0YWtlcyBhcHByb3ByaWF0ZQotICogYWN0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZGdhcF9jYXJyaWVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQotICAgICAgICBpbnQgdmlydF9jYXJyaWVyID0gMDsKLSAgICAgICAgaW50IHBoeXNfY2FycmllciA9IDA7Ci0KLQlEUFJfQ0FSUigoImRnYXBfY2FycmllciBjYWxsZWQuLi5cbiIpKTsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0KLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKiBNYWtlIHN1cmUgYWx0cGluIGlzIGFsd2F5cyBzZXQgY29ycmVjdGx5ICovCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikgewotCQljaC0+Y2hfZHNyICAgICAgPSBETV9DRDsKLQkJY2gtPmNoX2NkICAgICAgID0gRE1fRFNSOwotCX0KLQllbHNlIHsKLQkJY2gtPmNoX2RzciAgICAgID0gRE1fRFNSOwotCQljaC0+Y2hfY2QgICAgICAgPSBETV9DRDsKLQl9Ci0KLQlpZiAoY2gtPmNoX21pc3RhdCAmIERfQ0QoY2gpKSB7Ci0JCURQUl9DQVJSKCgibWlzdGF0OiAleCAgRF9DRDogJXhcbiIsIGNoLT5jaF9taXN0YXQsIERfQ0QoY2gpKSk7Ci0JCXBoeXNfY2FycmllciA9IDE7Ci0JfQotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0ZPUkNFRENEKSB7Ci0JCXZpcnRfY2FycmllciA9IDE7Ci0JfQotCi0JaWYgKGNoLT5jaF9jX2NmbGFnICYgQ0xPQ0FMKSB7Ci0JCXZpcnRfY2FycmllciA9IDE7Ci0JfQotCi0KLQlEUFJfQ0FSUigoIkRDRDogcGh5c2ljYWw6ICVkIHZpcnQ6ICVkXG4iLCBwaHlzX2NhcnJpZXIsIHZpcnRfY2FycmllcikpOwotCi0JLyoKLQkgKiBUZXN0IGZvciBhIFZJUlRVQUwgY2FycmllciB0cmFuc2l0aW9uIHRvIEhJR0guCi0JICovCi0JaWYgKCgoY2gtPmNoX2ZsYWdzICYgQ0hfRkNBUikgPT0gMCkgJiYgKHZpcnRfY2FycmllciA9PSAxKSkgewotCi0JCS8qCi0JCSAqIFdoZW4gY2FycmllciByaXNlcywgd2FrZSBhbnkgdGhyZWFkcyB3YWl0aW5nCi0JCSAqIGZvciBjYXJyaWVyIGluIHRoZSBvcGVuIHJvdXRpbmUuCi0JCSAqLwotCi0JCURQUl9DQVJSKCgiY2FycmllcjogdmlydCBEQ0Qgcm9zZVxuIikpOwotCi0JCWlmICh3YWl0cXVldWVfYWN0aXZlKCYoY2gtPmNoX2ZsYWdzX3dhaXQpKSkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCX0KLQotCS8qCi0JICogVGVzdCBmb3IgYSBQSFlTSUNBTCBjYXJyaWVyIHRyYW5zaXRpb24gdG8gSElHSC4KLQkgKi8KLQlpZiAoKChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkgPT0gMCkgJiYgKHBoeXNfY2FycmllciA9PSAxKSkgewotCi0JCS8qCi0JCSAqIFdoZW4gY2FycmllciByaXNlcywgd2FrZSBhbnkgdGhyZWFkcyB3YWl0aW5nCi0JCSAqIGZvciBjYXJyaWVyIGluIHRoZSBvcGVuIHJvdXRpbmUuCi0JCSAqLwotCi0JCURQUl9DQVJSKCgiY2FycmllcjogcGh5c2ljYWwgRENEIHJvc2VcbiIpKTsKLQotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQl9Ci0KLQkvKgotCSAqICBUZXN0IGZvciBhIFBIWVNJQ0FMIHRyYW5zaXRpb24gdG8gbG93LCBzbyBsb25nIGFzIHdlIGFyZW4ndAotCSAqICBjdXJyZW50bHkgaWdub3JpbmcgcGh5c2ljYWwgdHJhbnNpdGlvbnMgKHdoaWNoIGlzIHdoYXQgInZpcnR1YWwKLQkgKiAgY2FycmllciIgaW5kaWNhdGVzKS4KLQkgKgotCSAqICBUaGUgdHJhbnNpdGlvbiBvZiB0aGUgdmlydHVhbCBjYXJyaWVyIHRvIGxvdyByZWFsbHkgZG9lc24ndAotCSAqICBtYXR0ZXIuLi4gaXQgcmVhbGx5IG9ubHkgbWVhbnMgImlnbm9yZSBjYXJyaWVyIHN0YXRlIiwgbm90Ci0JICogICJtYWtlIHByZXRlbmQgdGhhdCBjYXJyaWVyIGlzIHRoZXJlIi4KLQkgKi8KLQlpZiAoKHZpcnRfY2FycmllciA9PSAwKSAmJiAoKGNoLT5jaF9mbGFncyAmIENIX0NEKSAhPSAwKSAmJgotCSAgICAocGh5c19jYXJyaWVyID09IDApKQotCXsKLQotCQkvKgotCQkgKiAgIFdoZW4gY2FycmllciBkcm9wczoKLQkJICoKLQkJICogICBEcm9wIGNhcnJpZXIgb24gYWxsIG9wZW4gdW5pdHMuCi0JCSAqCi0JCSAqICAgRmx1c2ggcXVldWVzLCB3YWtpbmcgdXAgYW55IHRhc2sgd2FpdGluZyBpbiB0aGUKLQkJICogICBsaW5lIGRpc2NpcGxpbmUuCi0JCSAqCi0JCSAqICAgU2VuZCBhIGhhbmd1cCB0byB0aGUgY29udHJvbCB0ZXJtaW5hbC4KLQkJICoKLQkJICogICBFbmFibGUgYWxsIHNlbGVjdCBjYWxscy4KLQkJICovCi0JCWlmICh3YWl0cXVldWVfYWN0aXZlKCYoY2gtPmNoX2ZsYWdzX3dhaXQpKSkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCi0JCWlmIChjaC0+Y2hfdHVuLnVuX29wZW5fY291bnQgPiAwKSB7Ci0JCQlEUFJfQ0FSUigoIlNlbmRpbmcgdHR5IGhhbmd1cFxuIikpOwotCQkJdHR5X2hhbmd1cChjaC0+Y2hfdHVuLnVuX3R0eSk7Ci0JCX0KLQotCQlpZiAoY2gtPmNoX3B1bi51bl9vcGVuX2NvdW50ID4gMCkgewotCQkJRFBSX0NBUlIoKCJTZW5kaW5nIHByIGhhbmd1cFxuIikpOwotCQkJdHR5X2hhbmd1cChjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICBNYWtlIHN1cmUgdGhhdCBvdXIgY2FjaGVkIHZhbHVlcyByZWZsZWN0IHRoZSBjdXJyZW50IHJlYWxpdHkuCi0JICovCi0JaWYgKHZpcnRfY2FycmllciA9PSAxKQotCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfRkNBUjsKLQllbHNlCi0JCWNoLT5jaF9mbGFncyAmPSB+Q0hfRkNBUjsKLQotCWlmIChwaHlzX2NhcnJpZXIgPT0gMSkKLQkJY2gtPmNoX2ZsYWdzIHw9IENIX0NEOwotCWVsc2UKLQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9DRDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVFRZIEVudHJ5IHBvaW50cyBhbmQgaGVscGVyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBkZ2FwX3R0eV9vcGVuKCkKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdAkqYnJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90CSp1bjsKLQlzdHJ1Y3QgYnNfdAkqYnM7Ci0JdWludAkJbWFqb3IgPSAwOwotCXVpbnQJCW1pbm9yID0gMDsKLQlpbnQJCXJjID0gMDsKLQl1bG9uZwkJbG9ja19mbGFnczsKLQl1bG9uZwkJbG9ja19mbGFnczI7Ci0JdTE2CQloZWFkOwotCi0JcmMgPSAwOwotCi0JbWFqb3IgPSBNQUpPUih0dHlfZGV2bnVtKHR0eSkpOwotCW1pbm9yID0gTUlOT1IodHR5X2Rldm51bSh0dHkpKTsKLQotCWlmIChtYWpvciA+IDI1NSkgewotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIEdldCBib2FyZCBwb2ludGVyIGZyb20gb3VyIGFycmF5IG9mIG1ham9ycyB3ZSBoYXZlIGFsbG9jYXRlZCAqLwotCWJyZCA9IGRnYXBfQm9hcmRzQnlNYWpvclttYWpvcl07Ci0JaWYgKCFicmQpIHsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKgotCSAqIElmIGJvYXJkIGlzIG5vdCB5ZXQgdXAgdG8gYSBzdGF0ZSBvZiBSRUFEWSwgZ28gdG8KLQkgKiBzbGVlcCB3YWl0aW5nIGZvciBpdCB0byBoYXBwZW4gb3IgdGhleSBjYW5jZWwgdGhlIG9wZW4uCi0JICovCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYnJkLT5zdGF0ZV93YWl0LAotCQkoYnJkLT5zdGF0ZSAmIEJPQVJEX1JFQURZKSk7Ci0KLQlpZiAocmMpIHsKLQkJcmV0dXJuIHJjOwotCX0KLQotCURHQVBfTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyogVGhlIHdhaXQgYWJvdmUgc2hvdWxkIGd1YXJhbnRlZSB0aGlzIGNhbm5vdCBoYXBwZW4gKi8KLQlpZiAoYnJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkgewotCQlER0FQX1VOTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIElmIG9wZW5lZCBkZXZpY2UgaXMgZ3JlYXRlciB0aGFuIG91ciBudW1iZXIgb2YgcG9ydHMsIGJhaWwuICovCi0JaWYgKE1JTk9SKHR0eV9kZXZudW0odHR5KSkgPiBicmQtPm5hc3luYykgewotCQlER0FQX1VOTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWNoID0gYnJkLT5jaGFubmVsc1ttaW5vcl07Ci0JaWYgKCFjaCkgewotCQlER0FQX1VOTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIEdyYWIgY2hhbm5lbCBsb2NrICovCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkvKiBGaWd1cmUgb3V0IG91ciB0eXBlICovCi0JaWYgKG1ham9yID09IGJyZC0+ZGdhcF9TZXJpYWxfTWFqb3IpIHsKLQkJdW4gPSAmYnJkLT5jaGFubmVsc1ttaW5vcl0tPmNoX3R1bjsKLQkJdW4tPnVuX3R5cGUgPSBER0FQX1NFUklBTDsKLQl9Ci0JZWxzZSBpZiAobWFqb3IgPT0gYnJkLT5kZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3IpIHsKLQkJdW4gPSAmYnJkLT5jaGFubmVsc1ttaW5vcl0tPmNoX3B1bjsKLQkJdW4tPnVuX3R5cGUgPSBER0FQX1BSSU5UOwotCX0KLQllbHNlIHsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJRFBSX09QRU4oKCIlZCBVbmtub3duIFRZUEUhXG4iLCBfX0xJTkVfXykpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIFN0b3JlIG91ciB1bml0IGludG8gZHJpdmVyX2RhdGEsIHNvIHdlIGFsd2F5cyBoYXZlIGl0IGF2YWlsYWJsZS4gKi8KLQl0dHktPmRyaXZlcl9kYXRhID0gdW47Ci0KLQlEUFJfT1BFTigoIk9wZW4gY2FsbGVkLiBNQUpPUjogJWQgTUlOT1I6JWQgdW5pdDogJXAgTkFNRTogJXNcbiIsCi0JCU1BSk9SKHR0eV9kZXZudW0odHR5KSksIE1JTk9SKHR0eV9kZXZudW0odHR5KSksIHVuLCBicmQtPm5hbWUpKTsKLQotCS8qCi0JICogRXJyb3IgaWYgY2hhbm5lbCBpbmZvIHBvaW50ZXIgaXMgTlVMTC4KLQkgKi8KLQlicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKSB7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURQUl9PUEVOKCgiJWQgQlMgaXMgMCFcbiIsIF9fTElORV9fKSk7Ci0JCXJldHVybiAtRU5YSU87Ci0gICAgICAgIH0KLQotCURQUl9PUEVOKCgiJWQ6IHRmbGFnPSV4ICBwZmxhZz0leFxuIiwgX19MSU5FX18sIGNoLT5jaF90dW4udW5fZmxhZ3MsIGNoLT5jaF9wdW4udW5fZmxhZ3MpKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0dHkncwotCSAqLwotCWlmICghKHVuLT51bl9mbGFncyAmIFVOX0lTT1BFTikpIHsKLQkJLyogU3RvcmUgaW1wb3J0YW50IHZhcmlhYmxlcy4gKi8KLQkJdW4tPnVuX3R0eSAgICAgPSB0dHk7Ci0KLQkJLyogTWF5YmUgZG8gc29tZXRoaW5nIGhlcmUgdG8gdGhlIFRUWSBzdHJ1Y3QgYXMgd2VsbD8gKi8KLQl9Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgaWYgbmVpdGhlciB0ZXJtaW5hbCBvciBwcmludGVyIGlzIG9wZW4uCi0JICovCi0JaWYgKCEoKGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSAmIFVOX0lTT1BFTikpIHsKLQotCQlEUFJfT1BFTigoImRnYXBfb3BlbjogaW5pdGlhbGl6aW5nIGNoYW5uZWwgaW4gb3Blbi4uLlxuIikpOwotCi0JCWNoLT5jaF9tZm9yY2UgPSAwOwotCQljaC0+Y2hfbXZhbCA9IDA7Ci0KLQkJLyoKLQkJICogRmx1c2ggaW5wdXQgcXVldWUuCi0JCSAqLwotCQloZWFkID0gcmVhZHcoJihicy0+cnhfaGVhZCkpOwotCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOwotCi0JCWNoLT5jaF9mbGFncyA9IDA7Ci0JCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7Ci0JCWNoLT5wc2Nhbl9zYXZlY2hhciA9IDA7Ci0KLQkJY2gtPmNoX2NfY2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2NmbGFnOwotCQljaC0+Y2hfY19pZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfaWZsYWc7Ci0JCWNoLT5jaF9jX29mbGFnICAgPSB0dHktPnRlcm1pb3MuY19vZmxhZzsKLQkJY2gtPmNoX2NfbGZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2xmbGFnOwotCQljaC0+Y2hfc3RhcnRjID0gdHR5LT50ZXJtaW9zLmNfY2NbVlNUQVJUXTsKLQkJY2gtPmNoX3N0b3BjICA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVE9QXTsKLQotCQkvKiBUT0RPOiBmbHVzaCBvdXIgVFRZIHN0cnVjdCBoZXJlPyAqLwotCX0KLQotCWRnYXBfY2FycmllcihjaCk7Ci0JLyoKLQkgKiBSdW4gcGFyYW0gaW4gY2FzZSB3ZSBjaGFuZ2VkIGFueXRoaW5nCi0JICovCi0JZGdhcF9wYXJhbSh0dHkpOwotCi0JLyoKLQkgKiBmb2xsb3cgcHJvdG9jb2wgZm9yIG9wZW5pbmcgcG9ydAotCSAqLwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JcmMgPSBkZ2FwX2Jsb2NrX3RpbF9yZWFkeSh0dHksIGZpbGUsIGNoKTsKLQotCWlmICghdW4tPnVuX3R0eSkgewotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAocmMpIHsKLQkJRFBSX09QRU4oKCJkZ2FwX3R0eV9vcGVuIHJldHVybmluZyBhZnRlciBkZ2FwX2Jsb2NrX3RpbF9yZWFkeSAiCi0JCQkid2l0aCAlZFxuIiwgcmMpKTsKLQl9Ci0KLQkvKiBObyBnb2luZyBiYWNrIG5vdywgaW5jcmVtZW50IG91ciB1bml0IGFuZCBjaGFubmVsIGNvdW50ZXJzICovCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQljaC0+Y2hfb3Blbl9jb3VudCsrOwotCXVuLT51bl9vcGVuX2NvdW50Kys7Ci0JdW4tPnVuX2ZsYWdzIHw9IChVTl9JU09QRU4pOwotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9PUEVOKCgiZGdhcF90dHlfb3BlbiBmaW5pc2hlZFxuIikpOwotCXJldHVybiAocmMpOwotfQotCi0KLS8qCi0gKiBkZ2FwX2Jsb2NrX3RpbF9yZWFkeSgpCi0gKgotICogV2FpdCBmb3IgRENELCBpZiBuZWVkZWQuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzOwotCXVpbnQJb2xkX2ZsYWdzID0gMDsKLQlpbnQgc2xlZXBfb25fdW5fZmxhZ3MgPSAwOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMgfHwgIWZpbGUgfHwgIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpIHsKLQkJcmV0dXJuICgtRU5YSU8pOwotCX0KLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpIHsKLQkJcmV0dXJuICgtRU5YSU8pOwotCX0KLQotCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBiZWZvcmUgYmxvY2suXG4iKSk7Ci0KLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JY2gtPmNoX3dvcGVuKys7Ci0KLQkvKiBMb29wIGZvcmV2ZXIgKi8KLQl3aGlsZSAoMSkgewotCi0JCXNsZWVwX29uX3VuX2ZsYWdzID0gMDsKLQotCQkvKgotCQkgKiBJZiBib2FyZCBoYXMgZmFpbGVkIHNvbWVob3cgZHVyaW5nIG91ciBzbGVlcCwgYmFpbCB3aXRoIGVycm9yLgotCQkgKi8KLQkJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7Ci0JCQlyZXR2YWwgPSAtRU5YSU87Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIElmIHR0eSB3YXMgaHVuZyB1cCwgYnJlYWsgb3V0IG9mIGxvb3AgYW5kIHNldCBlcnJvci4gKi8KLQkJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpIHsKLQkJCXJldHZhbCA9IC1FQUdBSU47Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIElmIGVpdGhlciB1bml0IGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZyYWdpbGUgcGFydCBvZiBjbG9zZSwKLQkJICogd2UganVzdCBjYW5ub3QgdG91Y2ggdGhlIGNoYW5uZWwgc2FmZWx5LgotCQkgKiBHbyBiYWNrIHRvIHNsZWVwLCBrbm93aW5nIHRoYXQgd2hlbiB0aGUgY2hhbm5lbCBjYW4gYmUKLQkJICogdG91Y2hlZCBzYWZlbHksIHRoZSBjbG9zZSByb3V0aW5lIHdpbGwgc2lnbmFsIHRoZQotCQkgKiBjaF93YWl0X2ZsYWdzIHRvIHdha2UgdXMgYmFjayB1cC4KLQkJICovCi0JCWlmICghKChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykgJiBVTl9DTE9TSU5HKSkgewotCi0JCQkvKgotCQkJICogT3VyIGNvbmRpdGlvbnMgdG8gbGVhdmUgY2xlYW5seSBhbmQgaGFwcGlseToKLQkJCSAqIDEpIE5PTkJMT0NLSU5HIG9uIHRoZSB0dHkgaXMgc2V0LgotCQkJICogMikgQ0xPQ0FMIGlzIHNldC4KLQkJCSAqIDMpIERDRCAoZmFrZSBvciByZWFsKSBpcyBhY3RpdmUuCi0JCQkgKi8KLQotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQ0QpIHsKLQkJCQlEUFJfT1BFTigoIiVkOiBjaF9mbGFnczogJXhcbiIsIF9fTElORV9fLCBjaC0+Y2hfZmxhZ3MpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0ZDQVIpIHsKLQkJCQlEUFJfT1BFTigoIiVkOiBjaF9mbGFnczogJXhcbiIsIF9fTElORV9fLCBjaC0+Y2hfZmxhZ3MpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNsZWVwX29uX3VuX2ZsYWdzID0gMTsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIGEgc2lnbmFsIHBlbmRpbmcsIHRoZSB1c2VyIHByb2JhYmx5Ci0JCSAqIGludGVycnVwdGVkIChjdHJsLWMpIHVzLgotCQkgKiBMZWF2ZSBsb29wIHdpdGggZXJyb3Igc2V0LgotCQkgKi8KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlEUFJfT1BFTigoIiVkOiBzaWduYWwgcGVuZGluZy4uLlxuIiwgX19MSU5FX18pKTsKLQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJRFBSX09QRU4oKCJkZ2FwX2Jsb2NrX3RpbF9yZWFkeSAtIGJsb2NraW5nLlxuIikpOwotCi0JCS8qCi0JCSAqIFN0b3JlIHRoZSBmbGFncyBiZWZvcmUgd2UgbGV0IGdvIG9mIGNoYW5uZWwgbG9jawotCQkgKi8KLQkJaWYgKHNsZWVwX29uX3VuX2ZsYWdzKQotCQkJb2xkX2ZsYWdzID0gY2gtPmNoX3R1bi51bl9mbGFncyB8IGNoLT5jaF9wdW4udW5fZmxhZ3M7Ci0JCWVsc2UKLQkJCW9sZF9mbGFncyA9IGNoLT5jaF9mbGFnczsKLQotCQkvKgotCQkgKiBMZXQgZ28gb2YgY2hhbm5lbCBsb2NrIGJlZm9yZSBjYWxsaW5nIHNjaGVkdWxlLgotCQkgKiBPdXIgcG9sbGVyIHdpbGwgZ2V0IGFueSBGRVAgZXZlbnRzIGFuZCB3YWtlIHVzIHVwIHdoZW4gRENECi0JCSAqIGV2ZW50dWFsbHkgZ29lcyBhY3RpdmUuCi0JCSAqLwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfT1BFTigoIkdvaW5nIHRvIHNsZWVwIG9uICVzIGZsYWdzLi4uXG4iLAotCQkJKHNsZWVwX29uX3VuX2ZsYWdzID8gInVuIiA6ICJjaCIpKSk7Ci0KLQkJLyoKLQkJICogV2FpdCBmb3Igc29tZXRoaW5nIGluIHRoZSBmbGFncyB0byBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCB2YWx1ZS4KLQkJICovCi0JCWlmIChzbGVlcF9vbl91bl9mbGFncykgewotCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHVuLT51bl9mbGFnc193YWl0LAotCQkJCShvbGRfZmxhZ3MgIT0gKGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNoLT5jaF9mbGFnc193YWl0LAotCQkJCShvbGRfZmxhZ3MgIT0gY2gtPmNoX2ZsYWdzKSk7Ci0JCX0KLQotCQlEUFJfT1BFTigoIkFmdGVyIHNsZWVwLi4uIHJldHZhbDogJXhcbiIsIHJldHZhbCkpOwotCi0JCS8qCi0JCSAqIFdlIGdvdCB3b2tlbiB1cCBmb3Igc29tZSByZWFzb24uCi0JCSAqIEJlZm9yZSBsb29waW5nIGFyb3VuZCwgZ3JhYiBvdXIgY2hhbm5lbCBsb2NrLgotCQkgKi8KLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl9Ci0KLQljaC0+Y2hfd29wZW4tLTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBhZnRlciBibG9ja2luZy5cbiIpKTsKLQotCWlmIChyZXR2YWwpIHsKLQkJRFBSX09QRU4oKCJkZ2FwX2Jsb2NrX3RpbF9yZWFkeSAtIGRvbmUuIGVycm9yLiByZXR2YWw6ICV4XG4iLCByZXR2YWwpKTsKLQkJcmV0dXJuKHJldHZhbCk7Ci0JfQotCi0JRFBSX09QRU4oKCJkZ2FwX2Jsb2NrX3RpbF9yZWFkeSAtIGRvbmUgbm8gZXJyb3IuIGppZmZpZXM6ICVsdVxuIiwgamlmZmllcykpOwotCi0JcmV0dXJuKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9oYW5ndXAoKQotICoKLSAqIEhhbmd1cCB0aGUgcG9ydC4gIExpa2UgYSBjbG9zZSwgYnV0IGRvbid0IHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbi4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QJKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90CSp1bjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9DTE9TRSgoImRnYXBfaGFuZ3VwIGNhbGxlZC4gY2gtPmNoX29wZW5fY291bnQ6ICVkIHVuLT51bl9vcGVuX2NvdW50OiAlZFxuIiwKLQkJY2gtPmNoX29wZW5fY291bnQsIHVuLT51bl9vcGVuX2NvdW50KSk7Ci0KLQkvKiBmbHVzaCB0aGUgdHJhbnNtaXQgcXVldWVzICovCi0JZGdhcF90dHlfZmx1c2hfYnVmZmVyKHR0eSk7Ci0KLQlEUFJfQ0xPU0UoKCJkZ2FwX2hhbmd1cCBmaW5pc2hlZC4gY2gtPmNoX29wZW5fY291bnQ6ICVkIHVuLT51bl9vcGVuX2NvdW50OiAlZFxuIiwKLQkJY2gtPmNoX29wZW5fY291bnQsIHVuLT51bl9vcGVuX2NvdW50KSk7Ci19Ci0KLQotCi0vKgotICogZGdhcF90dHlfY2xvc2UoKQotICoKLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGt0ZXJtaW9zICp0czsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JaW50IHJjID0gMDsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCXRzID0gJnR0eS0+dGVybWlvczsKLQotCURQUl9DTE9TRSgoIkNsb3NlIGNhbGxlZFxuIikpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCS8qCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2xvc2Ugb3Igbm90IC0gYW5kIGlmIHdlIGFncmVlIGFib3V0Ci0JICogd2hpY2ggdHlwZSBvZiBjbG9zZSBpdCBpcyB3aXRoIHRoZSBMaW5lIERpc2NpcGxpbmUKLQkgKi8KLQlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHVuLT51bl9vcGVuX2NvdW50ICE9IDEpKSB7Ci0JCS8qCi0JCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5Ci0JCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgdW5fb3Blbl9jb3VudCBzaG91bGQgYWx3YXlzCi0JCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KLQkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCi0JCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgotCQkgKi8KLQkJQVBSKCgidHR5LT5jb3VudCBpcyAxLCB1biBvcGVuIGNvdW50IGlzICVkXG4iLCB1bi0+dW5fb3Blbl9jb3VudCkpOwotCQl1bi0+dW5fb3Blbl9jb3VudCA9IDE7Ci0JfQotCi0JaWYgKC0tdW4tPnVuX29wZW5fY291bnQgPCAwKSB7Ci0JCUFQUigoImJhZCBzZXJpYWwgcG9ydCBvcGVuIGNvdW50IG9mICVkXG4iLCB1bi0+dW5fb3Blbl9jb3VudCkpOwotCQl1bi0+dW5fb3Blbl9jb3VudCA9IDA7Ci0JfQotCi0JY2gtPmNoX29wZW5fY291bnQtLTsKLQotCWlmIChjaC0+Y2hfb3Blbl9jb3VudCAmJiB1bi0+dW5fb3Blbl9jb3VudCkgewotCQlEUFJfQ0xPU0UoKCJkZ2FwX3R0eV9jbG9zZTogbm90IGxhc3QgY2xvc2UgY2g6ICVkIHVuOiVkXG4iLAotCQkJY2gtPmNoX29wZW5fY291bnQsIHVuLT51bl9vcGVuX2NvdW50KSk7Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0JLyogT0ssIGl0cyB0aGUgbGFzdCBjbG9zZSBvbiB0aGUgdW5pdCAqLwotCURQUl9DTE9TRSgoImRnYXBfdHR5X2Nsb3NlIC0gbGFzdCBjbG9zZSBvbiB1bml0IHByb2NlZHVyZXNcbiIpKTsKLQotCXVuLT51bl9mbGFncyB8PSBVTl9DTE9TSU5HOwotCi0JdHR5LT5jbG9zaW5nID0gMTsKLQotCS8qCi0JICogT25seSBvZmZpY2lhbGx5IGNsb3NlIGNoYW5uZWwgaWYgY291bnQgaXMgMCBhbmQKLSAgICAgICAgICogRElHSV9QUklOVEVSIGJpdCBpcyBub3Qgc2V0LgotCSAqLwotCWlmICgoY2gtPmNoX29wZW5fY291bnQgPT0gMCkgJiYgIShjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9QUklOVEVSKSkgewotCi0JCWNoLT5jaF9mbGFncyAmPSB+KENIX1JYQkxPQ0spOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkvKiB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4gKi8KLQkJLyogVGhpcyB3aWxsIGFsc28gcmV0dXJuIGlmIHdlIHRha2UgYW4gaW50ZXJydXB0ICovCi0KLQkJRFBSX0NMT1NFKCgiQ2FsbGluZyB3YWl0X2Zvcl9kcmFpblxuIikpOwotCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKLQkJRFBSX0NMT1NFKCgiQWZ0ZXIgY2FsbGluZyB3YWl0X2Zvcl9kcmFpblxuIikpOwotCi0JCWlmIChyYykgewotCQkJRFBSX0JBU0lDKCgiZGdhcF90dHlfY2xvc2UgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQl9Ci0KLQkJZGdhcF90dHlfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCi0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJdHR5LT5jbG9zaW5nID0gMDsKLQotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIEhVUENMIHNldCwgbG93ZXIgRFRSIGFuZCBSVFMKLQkJICovCi0JCWlmIChjaC0+Y2hfY19jZmxhZyAmIEhVUENMICkgewotCQkJRFBSX0NMT1NFKCgiQ2xvc2UuIEhVUENMIHNldCwgZHJvcHBpbmcgRFRSL1JUU1xuIikpOwotCQkJY2gtPmNoX21vc3RhdCAmPSB+KERfUlRTKGNoKXxEX0RUUihjaCkpOwotCQkJZGdhcF9jbWRiKCBjaCwgU01PREVNLCAwLCBEX0RUUihjaCl8RF9SVFMoY2gpLCAwICk7Ci0KLQkJCS8qCi0JCQkgKiBHbyB0byBzbGVlcCB0byBlbnN1cmUgUlRTL0RUUgotCQkJICogaGF2ZSBiZWVuIGRyb3BwZWQgZm9yIG1vZGVtcyB0byBzZWUgaXQuCi0JCQkgKi8KLQkJCWlmIChjaC0+Y2hfY2xvc2VfZGVsYXkpIHsKLQkJCQlEUFJfQ0xPU0UoKCJDbG9zZS4gU2xlZXBpbmcgZm9yIFJUUy9EVFIgZHJvcFxuIikpOwotCi0JCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCWRnYXBfbXNfc2xlZXAoY2gtPmNoX2Nsb3NlX2RlbGF5KTsKLQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCQkJRFBSX0NMT1NFKCgiQ2xvc2UuIEFmdGVyIHNsZWVwaW5nIGZvciBSVFMvRFRSIGRyb3BcbiIpKTsKLQkJCX0KLQkJfQotCi0JCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7Ci0JCWNoLT5wc2Nhbl9zYXZlY2hhciA9IDA7Ci0JCWNoLT5jaF9iYXVkX2luZm8gPSAwOwotCi0JfQotCi0JLyoKLQkgKiB0dXJuIG9mZiBwcmludCBkZXZpY2Ugd2hlbiBjbG9zaW5nIHByaW50IGRldmljZS4KLQkgKi8KLQlpZiAoKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpICAmJiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikgKSB7Ci0JCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAotCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOwotCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1BST047Ci0JfQotCi0JdW4tPnVuX3R0eSA9IE5VTEw7Ci0JdW4tPnVuX2ZsYWdzICY9IH4oVU5fSVNPUEVOIHwgVU5fQ0xPU0lORyk7Ci0JdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0KLQlEUFJfQ0xPU0UoKCJDbG9zZS4gRG9pbmcgd2FrZXVwc1xuIikpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdW4tPnVuX2ZsYWdzX3dhaXQpOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0gICAgICAgIERQUl9CQVNJQygoImRnYXBfdHR5X2Nsb3NlIC0gY29tcGxldGVcbiIpKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyKCkKLSAqCi0gKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBoYXZlIG5vdCBiZWVuIHRyYW5zbWl0dGVkIHlldC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIGRldGVybWluZSBpZiB0aGVyZQotICogaXMgZGF0YSB3YWl0aW5nIHRvIGJlIHRyYW5zbWl0dGVkL2RyYWluZWQvZmx1c2hlZCBvciBub3QuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkID0gTlVMTDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKLQlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOwotCXVjaGFyIHRidXN5OwotCXVpbnQgY2hhcnMgPSAwOwotCXUxNiB0aGVhZCwgdHRhaWwsIHRtYXNrLCBjaGVhZCwgY3RhaWw7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyID0gMDsKLQotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuKDApOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLSAgICAgICAgYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykKLQkJcmV0dXJuICgwKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQl0bWFzayA9IChjaC0+Y2hfdHNpemUgLSAxKTsKLQotCS8qIEdldCBUcmFuc21pdCBxdWV1ZSBwb2ludGVycyAqLwotCXRoZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7Ci0JdHRhaWwgPSByZWFkdygmKGJzLT50eF90YWlsKSkgJiB0bWFzazsKLQotCS8qIEdldCB0YnVzeSBmbGFnICovCi0JdGJ1c3kgPSByZWFkYigmKGJzLT50YnVzeSkpOwotCi0JLyogR2V0IENvbW1hbmQgcXVldWUgcG9pbnRlcnMgKi8KLQljaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2NtLT5jbV9oZWFkKSk7Ci0JY3RhaWwgPSByZWFkdygmKGNoLT5jaF9jbS0+Y21fdGFpbCkpOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkvKgotCSAqIFRoZSBvbmx5IHdheSB3ZSBrbm93IGZvciBzdXJlIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcKLQkgKiBkYXRhIGxlZnQgdG8gYmUgdHJhbnNmZXJyZWQsIGlzIGlmOgotCSAqIDEpIFRyYW5zbWl0IGhlYWQgYW5kIHRhaWwgYXJlIGVxdWFsIChlbXB0eSkuCi0JICogMikgQ29tbWFuZCBxdWV1ZSBoZWFkIGFuZCB0YWlsIGFyZSBlcXVhbCAoZW1wdHkpLgotCSAqIDMpIFRoZSAiVEJVU1kiIGZsYWcgaXMgMC4gKFRyYW5zbWl0dGVyIG5vdCBidXN5KS4KLSAJICovCi0KLQlpZiAoKHR0YWlsID09IHRoZWFkKSAmJiAodGJ1c3kgPT0gMCkgJiYgKGNoZWFkID09IGN0YWlsKSkgewotCQljaGFycyA9IDA7Ci0JfQotCWVsc2UgewotCQlpZiAodGhlYWQgPj0gdHRhaWwpCi0JCQljaGFycyA9IHRoZWFkIC0gdHRhaWw7Ci0JCWVsc2UKLQkJCWNoYXJzID0gdGhlYWQgLSB0dGFpbCArIGNoLT5jaF90c2l6ZTsKLQkJLyoKLQkJICogRnVkZ2UgZmFjdG9yIGhlcmUuCi0JCSAqIElmIGNoYXJzIGlzIHplcm8sIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBxdWV1ZSBoYWQKLQkJICogc29tZXRoaW5nIGluIGl0IG9yIHRidXN5IHdhcyBzZXQuICBCZWNhdXNlIHdlIGNhbm5vdAotCQkgKiBiZSBzdXJlIGlmIHRoZXJlIGlzIHN0aWxsIHNvbWUgZGF0YSB0byBiZSB0cmFuc21pdHRlZCwKLQkJICogbGV0cyBsaWUsIGFuZCB0ZWxsIGxkIHdlIGhhdmUgMSBieXRlIGxlZnQuCi0JCSAqLwotCQlpZiAoY2hhcnMgPT0gMCkgewotCQkJLyoKLQkJCSAqIElmIFRCVVNZIGlzIHN0aWxsIHNldCwgYW5kIG91ciB0eCBidWZmZXJzIGFyZSBlbXB0eSwKLQkJCSAqIGZvcmNlIHRoZSBmaXJtd2FyZSB0byBzZW5kIG1lIGFub3RoZXIgd2FrZXVwIGFmdGVyCi0JCQkgKiBUQlVTWSBoYXMgYmVlbiBjbGVhcmVkLgotCQkJICovCi0JCQlpZiAodGJ1c3kgIT0gMCkgewotCQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOwotCQkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKLQkJCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JCQl9Ci0JCQljaGFycyA9IDE7Ci0JCX0KLQl9Ci0KLSAJRFBSX1dSSVRFKCgiZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyLiBQb3J0OiAleCAtICVkIChoZWFkOiAlZCB0YWlsOiAlZCB0c2l6ZTogJWQpXG4iLAotCQljaC0+Y2hfcG9ydG51bSwgY2hhcnMsIHRoZWFkLCB0dGFpbCwgY2gtPmNoX3RzaXplKSk7Ci0gICAgICAgIHJldHVybihjaGFycyk7Ci19Ci0KLQotc3RhdGljIGludCBkZ2FwX3dhaXRfZm9yX2RyYWluKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXN0cnVjdCBic190ICpiczsKLQlpbnQgcmV0ID0gLUVJTzsKLQl1aW50IGNvdW50ID0gMTsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0gICAgICAgIGJzID0gY2gtPmNoX2JzOwotCWlmICghYnMpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSAwOwotCi0JRFBSX0RSQUlOKCgiZGdhcF93YWl0X2Zvcl9kcmFpbiBzdGFydFxuIikpOwotCi0JLyogTG9vcCB1bnRpbCBkYXRhIGlzIGRyYWluZWQgKi8KLQl3aGlsZSAoY291bnQgIT0gMCkgewotCi0JCWNvdW50ID0gZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSk7Ci0KLQkJaWYgKGNvdW50ID09IDApCi0JCQlicmVhazsKLQotCQkvKiBTZXQgZmxhZyB3YWl0aW5nIGZvciBkcmFpbiAqLwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQl1bi0+dW5fZmxhZ3MgfD0gVU5fRU1QVFk7Ci0JCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCS8qIEdvIHRvIHNsZWVwIHRpbGwgd2UgZ2V0IHdva2VuIHVwICovCi0JCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1bi0+dW5fZmxhZ3Nfd2FpdCwgKCh1bi0+dW5fZmxhZ3MgJiBVTl9FTVBUWSkgPT0gMCkpOwotCQkvKiBJZiByZXQgaXMgbm9uLXplcm8sIHVzZXIgY3RybC1jJ2VkIHVzICovCi0JCWlmIChyZXQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl1bi0+dW5fZmxhZ3MgJj0gfihVTl9FTVBUWSk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0RSQUlOKCgiZGdhcF93YWl0X2Zvcl9kcmFpbiBmaW5pc2hcbiIpKTsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfbWF4Y3BzX3Jvb20KLSAqCi0gKiBSZWR1Y2VzIGJ5dGVzX2F2YWlsYWJsZSB0byB0aGUgbWF4IG51bWJlciBvZiBjaGFyYWN0ZXJzCi0gKiB0aGF0IGNhbiBiZSBzZW50IGN1cnJlbnRseSBnaXZlbiB0aGUgbWF4Y3BzIHZhbHVlLCBhbmQKLSAqIHJldHVybnMgdGhlIG5ldyBieXRlc19hdmFpbGFibGUuICBUaGlzIG9ubHkgYWZmZWN0cyBwcmludGVyCi0gKiBvdXRwdXQuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9tYXhjcHNfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnl0ZXNfYXZhaWxhYmxlKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKLQlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOwotCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm4gKGJ5dGVzX2F2YWlsYWJsZSk7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKGJ5dGVzX2F2YWlsYWJsZSk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoYnl0ZXNfYXZhaWxhYmxlKTsKLQotCS8qCi0JICogSWYgaXRzIG5vdCB0aGUgVHJhbnNwYXJlbnQgcHJpbnQgZGV2aWNlLCByZXR1cm4KLQkgKiB0aGUgZnVsbCBkYXRhIGFtb3VudC4KLQkgKi8KLQlpZiAodW4tPnVuX3R5cGUgIT0gREdBUF9QUklOVCkKLQkJcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCAmJiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPiAwICkgewotCQlpbnQgY3BzX2xpbWl0ID0gMDsKLQkJdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUgPSBqaWZmaWVzOwotCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl90aW1lID0gY3VycmVudF90aW1lICsKLQkJCShIWiAqIGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSkgLyBjaC0+Y2hfZGlnaS5kaWdpX21heGNwczsKLQotCQlpZiAoY2gtPmNoX2Nwc3RpbWUgPCBjdXJyZW50X3RpbWUpIHsKLQkJCS8qIGJ1ZmZlciBpcyBlbXB0eSAqLwotCQkJY2gtPmNoX2Nwc3RpbWUgPSBjdXJyZW50X3RpbWU7ICAgICAgICAgICAgLyogcmVzZXQgY2hfY3BzdGltZSAqLwotCQkJY3BzX2xpbWl0ID0gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplOwotCQl9Ci0JCWVsc2UgaWYgKGNoLT5jaF9jcHN0aW1lIDwgYnVmZmVyX3RpbWUpIHsKLQkJCS8qIHN0aWxsIHJvb20gaW4gdGhlIGJ1ZmZlciAqLwotCQkJY3BzX2xpbWl0ID0gKChidWZmZXJfdGltZSAtIGNoLT5jaF9jcHN0aW1lKSAqIGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzKSAvIEhaOwotCQl9Ci0JCWVsc2UgewotCQkJLyogbm8gcm9vbSBpbiB0aGUgYnVmZmVyICovCi0JCQljcHNfbGltaXQgPSAwOwotCQl9Ci0KLQkJYnl0ZXNfYXZhaWxhYmxlID0gbWluKGNwc19saW1pdCwgYnl0ZXNfYXZhaWxhYmxlKTsKLQl9Ci0KLQlyZXR1cm4gKGJ5dGVzX2F2YWlsYWJsZSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHN0cnVjdCB1bl90ICp1biwgdW5zaWduZWQgaW50IGV2ZW50KQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKLQlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOwotCi0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0gICAgICAgIGJzID0gY2gtPmNoX2JzOwotCWlmICghYnMpCi0JCXJldHVybjsKLQotCWlmICgoZXZlbnQgJiBVTl9MT1cpICE9IDApIHsKLQkJaWYgKCh1bi0+dW5fZmxhZ3MgJiBVTl9MT1cpID09IDApIHsKLQkJCXVuLT51bl9mbGFncyB8PSBVTl9MT1c7Ci0JCQl3cml0ZWIoMSwgJihicy0+aWxvdykpOwotCQl9Ci0JfQotCWlmICgoZXZlbnQgJiBVTl9MT1cpICE9IDApIHsKLQkJaWYgKCh1bi0+dW5fZmxhZ3MgJiBVTl9FTVBUWSkgPT0gMCkgewotCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOwotCQkJd3JpdGViKDEsICYoYnMtPmllbXB0eSkpOwotCQl9Ci0JfQotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV93cml0ZV9yb29tKCkKLSAqCi0gKiBSZXR1cm4gc3BhY2UgYXZhaWxhYmxlIGluIFR4IGJ1ZmZlcgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKLQlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOwotCXUxNiBoZWFkLCB0YWlsLCB0bWFzazsKLQlpbnQgcmV0ID0gMDsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOwotCi0JaWYgKHR0eSA9PSBOVUxMIHx8IGRnYXBfVG1wV3JpdGVCdWYgPT0gTlVMTCkKLQkJcmV0dXJuKDApOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQotICAgICAgICBicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm4gKDApOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXRtYXNrID0gY2gtPmNoX3RzaXplIC0gMTsKLQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7Ci0JdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOwotCi0gICAgICAgIGlmICgocmV0ID0gdGFpbCAtIGhlYWQgLSAxKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0ICs9IGNoLT5jaF90c2l6ZTsKLQotCS8qIExpbWl0IHByaW50ZXIgdG8gbWF4Y3BzICovCi0JcmV0ID0gZGdhcF9tYXhjcHNfcm9vbSh0dHksIHJldCk7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBwcmludGVyIGRldmljZSwgbGVhdmUgc3BhY2UgZm9yCi0JICogcG9zc2libHkgYm90aCB0aGUgb24gYW5kIG9mZiBzdHJpbmdzLgotCSAqLwotCWlmICh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSB7Ci0JCWlmICghKGNoLT5jaF9mbGFncyAmIENIX1BST04pKQotCQkJcmV0IC09IGNoLT5jaF9kaWdpLmRpZ2lfb25sZW47Ci0JCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKQotCQkJcmV0IC09IGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuOwotCX0KLQotCWlmIChyZXQgPCAwKQotCQlyZXQgPSAwOwotCi0JLyoKLQkgKiBTY2hlZHVsZSBGRVAgdG8gd2FrZSB1cyB1cCBpZiBuZWVkZWQuCi0JICoKLQkgKiBUT0RPOiAgVGhpcyBtaWdodCBiZSBvdmVya2lsbC4uLgotCSAqIERvIHdlIHJlYWxseSBuZWVkIHRvIHNjaGVkdWxlIGNhbGxiYWNrcyBmcm9tIHRoZSBGRVAKLQkgKiBpbiBldmVyeSBjYXNlPyAgQ2FuIHdlIGdldCBzbWFydGVyIGJhc2VkIG9uIHJldD8KLQkgKi8KLQlkZ2FwX3NldF9maXJtd2FyZV9ldmVudCh1biwgVU5fTE9XIHwgVU5fRU1QVFkpOwotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9XUklURSgoImRnYXBfdHR5X3dyaXRlX3Jvb20gLSAlZCB0YWlsOiAlZCBoZWFkOiAlZFxuIiwgcmV0LCB0YWlsLCBoZWFkKSk7Ci0KLSAgICAgICAgcmV0dXJuKHJldCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3B1dF9jaGFyKCkKLSAqCi0gKiBQdXQgYSBjaGFyYWN0ZXIgaW50byBjaC0+Y2hfYnVmCi0gKgotICogICAgICAtIHVzZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgT1BPU1QgcHJvY2Vzc2luZwotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgYykKLXsKLQkvKgotCSAqIFNpbXBseSBjYWxsIHR0eV93cml0ZS4KLQkgKi8KLQlEUFJfV1JJVEUoKCJkZ2FwX3R0eV9wdXRfY2hhciBjYWxsZWRcbiIpKTsKLQlkZ2FwX3R0eV93cml0ZSh0dHksICZjLCAxKTsKLQlyZXR1cm4gMTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfd3JpdGUoKQotICoKLSAqIFRha2UgZGF0YSBmcm9tIHRoZSB1c2VyIG9yIGtlcm5lbCBhbmQgc2VuZCBpdCBvdXQgdG8gdGhlIEZFUC4KLSAqIEluIGhlcmUgZXhpc3RzIGFsbCB0aGUgVHJhbnNwYXJlbnQgUHJpbnQgbWFnaWMgYXMgd2VsbC4KLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKLQlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOwotCWNoYXIgKnZhZGRyID0gTlVMTDsKLQl1MTYgaGVhZCwgdGFpbCwgdG1hc2ssIHJlbWFpbjsKLQlpbnQgYnVmY291bnQgPSAwLCBuID0gMDsKLQlpbnQgb3JpZ19jb3VudCA9IDA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQlpbnQgZnJvbV91c2VyID0gMDsKLQotCWlmICh0dHkgPT0gTlVMTCB8fCBkZ2FwX1RtcFdyaXRlQnVmID09IE5VTEwpCi0JCXJldHVybigwKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybigwKTsKLQotICAgICAgICBicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm4oMCk7Ci0KLQlpZiAoIWNvdW50KQotCQlyZXR1cm4oMCk7Ci0KLQlEUFJfV1JJVEUoKCJkZ2FwX3R0eV93cml0ZTogUG9ydDogJXggdHR5PSVwIHVzZXI9JWQgbGVuPSVkXG4iLAotCQljaC0+Y2hfcG9ydG51bSwgdHR5LCBmcm9tX3VzZXIsIGNvdW50KSk7Ci0KLQkvKgotCSAqIFN0b3JlIG9yaWdpbmFsIGFtb3VudCBvZiBjaGFyYWN0ZXJzIHBhc3NlZCBpbi4KLQkgKiBUaGlzIGhlbHBzIHRvIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGFzayB0aGUgRkVQCi0JICogdG8gc2VuZCB1cyBhbiBldmVudCB3aGVuIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZS4KLQkgKi8KLQlvcmlnX2NvdW50ID0gY291bnQ7Ci0KLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyogR2V0IG91ciBzcGFjZSBhdmFpbGFibGUgZm9yIHRoZSBjaGFubmVsIGZyb20gdGhlIGJvYXJkICovCi0JdG1hc2sgPSBjaC0+Y2hfdHNpemUgLSAxOwotCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKLQl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7Ci0KLQlpZiAoKGJ1ZmNvdW50ID0gdGFpbCAtIGhlYWQgLSAxKSA8IDApCi0JCWJ1ZmNvdW50ICs9IGNoLT5jaF90c2l6ZTsKLQotCURQUl9XUklURSgoIiVkOiBidWZjb3VudDogJXggY291bnQ6ICV4IHRhaWw6ICV4IGhlYWQ6ICV4IHRtYXNrOiAleFxuIiwKLQkJX19MSU5FX18sIGJ1ZmNvdW50LCBjb3VudCwgdGFpbCwgaGVhZCwgdG1hc2spKTsKLQotCS8qCi0JICogTGltaXQgcHJpbnRlciBvdXRwdXQgdG8gbWF4Y3BzIG92ZXJhbGwsIHdpdGggYnVyc3RzIGFsbG93ZWQKLQkgKiB1cCB0byBidWZzaXplIGNoYXJhY3RlcnMuCi0JICovCi0JYnVmY291bnQgPSBkZ2FwX21heGNwc19yb29tKHR0eSwgYnVmY291bnQpOwotCi0JLyoKLQkgKiBUYWtlIG1pbmltdW0gb2Ygd2hhdCB0aGUgdXNlciB3YW50cyB0byBzZW5kLCBhbmQgdGhlCi0JICogc3BhY2UgYXZhaWxhYmxlIGluIHRoZSBGRVAgYnVmZmVyLgotCSAqLwotCWNvdW50ID0gbWluKGNvdW50LCBidWZjb3VudCk7Ci0KLQkvKgotCSAqIEJhaWwgaWYgbm8gc3BhY2UgbGVmdC4KLQkgKi8KLQlpZiAoY291bnQgPD0gMCkgewotCQlkZ2FwX3NldF9maXJtd2FyZV9ldmVudCh1biwgVU5fTE9XIHwgVU5fRU1QVFkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKgotCSAqIE91dHB1dCB0aGUgcHJpbnRlciBPTiBzdHJpbmcsIGlmIHdlIGFyZSBpbiB0ZXJtaW5hbCBtb2RlLCBidXQKLQkgKiBuZWVkIHRvIGJlIGluIHByaW50ZXIgbW9kZS4KLQkgKi8KLQlpZiAoKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpICYmICEoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKLQkJZGdhcF93bW92ZShjaCwgY2gtPmNoX2RpZ2kuZGlnaV9vbnN0ciwKLQkJICAgIChpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb25sZW4pOwotCQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7Ci0JCWNoLT5jaF9mbGFncyB8PSBDSF9QUk9OOwotCX0KLQotCS8qCi0JICogT24gdGhlIG90aGVyIGhhbmQsIG91dHB1dCB0aGUgcHJpbnRlciBPRkYgc3RyaW5nLCBpZiB3ZSBhcmUKLQkgKiBjdXJyZW50bHkgaW4gcHJpbnRlciBtb2RlLCBidXQgbmVlZCB0byBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsLgotCSAqLwotCWlmICgodW4tPnVuX3R5cGUgIT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pKSB7Ci0JCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAotCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOwotCQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7Ci0JCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBjb3B5LCBvciBJIGNhbid0IGhhbmRsZSBhbnkgbW9yZSBkYXRhLCBsZWF2ZS4KLQkgKi8KLQlpZiAoY291bnQgPD0gMCkgewotCQlkZ2FwX3NldF9maXJtd2FyZV9ldmVudCh1biwgVU5fTE9XIHwgVU5fRU1QVFkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQlpZiAoZnJvbV91c2VyKSB7Ci0KLQkJY291bnQgPSBtaW4oY291bnQsIFdSSVRFQlVGTEVOKTsKLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJLyoKLQkJICogSWYgZGF0YSBpcyBjb21pbmcgZnJvbSB1c2VyIHNwYWNlLCBjb3B5IGl0IGludG8gYSB0ZW1wb3JhcnkKLQkJICogYnVmZmVyIHNvIHdlIGRvbid0IGdldCBzd2FwcGVkIG91dCB3aGlsZSBkb2luZyB0aGUgY29weSB0bwotCQkgKiB0aGUgYm9hcmQuCi0JCSAqLwotCQkvKiB3ZSdyZSBhbGxvd2VkIHRvIGJsb2NrIGlmIGl0J3MgZnJvbV91c2VyICovCi0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRnYXBfVG1wV3JpdGVTZW0pKSB7Ci0JCQlyZXR1cm4gKC1FSU5UUik7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoZGdhcF9UbXBXcml0ZUJ1ZiwgKGNvbnN0IHVjaGFyIF9fdXNlciAqKSBidWYsIGNvdW50KSkgewotCQkJdXAoJmRnYXBfVG1wV3JpdGVTZW0pOwotCQkJcHJpbnRrKCJXcml0ZTogQ29weSBmcm9tIHVzZXIgZmFpbGVkIVxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJYnVmID0gZGdhcF9UbXBXcml0ZUJ1ZjsKLQl9Ci0KLQluID0gY291bnQ7Ci0KLQkvKgotCSAqIElmIHRoZSB3cml0ZSB3cmFwcyBvdmVyIHRoZSB0b3Agb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciwKLQkgKiBtb3ZlIHRoZSBwb3J0aW9uIHVwIHRvIHRoZSB3cmFwIHBvaW50LCBhbmQgcmVzZXQgdGhlCi0JICogcG9pbnRlcnMgdG8gdGhlIGJvdHRvbS4KLQkgKi8KLQlyZW1haW4gPSBjaC0+Y2hfdHN0YXJ0ICsgY2gtPmNoX3RzaXplIC0gaGVhZDsKLQotCWlmIChuID49IHJlbWFpbikgewotCQluIC09IHJlbWFpbjsKLQkJdmFkZHIgPSBjaC0+Y2hfdGFkZHIgKyBoZWFkOwotCi0JCW1lbWNweV90b2lvKHZhZGRyLCAodWNoYXIgKikgYnVmLCByZW1haW4pOwotCQlkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soY2gsICJVU0VSIFdSSVRFIiwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKLQotCQloZWFkID0gY2gtPmNoX3RzdGFydDsKLQkJYnVmICs9IHJlbWFpbjsKLQl9Ci0KLQlpZiAobiA+IDApIHsKLQotCQkvKgotCQkgKiBNb3ZlIHJlc3Qgb2YgZGF0YS4KLQkJICovCi0JCXZhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQkJcmVtYWluID0gbjsKLQotCQltZW1jcHlfdG9pbyh2YWRkciwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKLQkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBXUklURSIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7Ci0KLQkJaGVhZCArPSByZW1haW47Ci0KLQl9Ci0KLQlpZiAoY291bnQpIHsKLQkJY2gtPmNoX3R4Y291bnQgKz0gY291bnQ7Ci0JCWhlYWQgJj0gdG1hc2s7Ci0JCXdyaXRldyhoZWFkLCAmKGJzLT50eF9oZWFkKSk7Ci0JfQotCi0KLQlkZ2FwX3NldF9maXJtd2FyZV9ldmVudCh1biwgVU5fTE9XIHwgVU5fRU1QVFkpOwotCi0JLyoKLQkgKiBJZiB0aGlzIGlzIHRoZSBwcmludCBkZXZpY2UsIGFuZCB0aGUKLQkgKiBwcmludGVyIGlzIHN0aWxsIG9uLCB3ZSBuZWVkIHRvIHR1cm4gaXQKLQkgKiBvZmYgYmVmb3JlIGdvaW5nIGlkbGUuICBJZiB0aGUgYnVmZmVyIGlzCi0JICogbm9uLWVtcHR5LCB3YWl0IHVudGlsIGl0IGdvZXMgZW1wdHkuCi0JICogT3RoZXJ3aXNlIHR1cm4gaXQgb2ZmIHJpZ2h0IG5vdy4KLQkgKi8KLQlpZiAoKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpICYmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgewotCQl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7Ci0KLQkJaWYgKHRhaWwgIT0gaGVhZCkgewotCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOwotCQkJd3JpdGViKDEsICYoYnMtPmllbXB0eSkpOwotCQl9Ci0JCWVsc2UgewotCQkJZGdhcF93bW92ZShjaCwgY2gtPmNoX2RpZ2kuZGlnaV9vZmZzdHIsCi0JCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOwotCQkJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOwotCQl9Ci0JfQotCi0JLyogVXBkYXRlIHByaW50ZXIgYnVmZmVyIGVtcHR5IHRpbWUuICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPiAwKQotCSAgICAmJiAoY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplID4gMCkpIHsKLSAgICAgICAgICAgICAgICBjaC0+Y2hfY3BzdGltZSArPSAoSFogKiBjb3VudCkgLyBjaC0+Y2hfZGlnaS5kaWdpX21heGNwczsKLQl9Ci0KLQlpZiAoZnJvbV91c2VyKSB7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJdXAoJmRnYXBfVG1wV3JpdGVTZW0pOwotCX0KLQllbHNlIHsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCX0KLQotCURQUl9XUklURSgoIldyaXRlIGZpbmlzaGVkIC0gV3JpdGUgJWQgYnl0ZXMgb2YgJWQuXG4iLCBjb3VudCwgb3JpZ19jb3VudCkpOwotCi0JcmV0dXJuIChjb3VudCk7Ci19Ci0KLQotCi0vKgotICogUmV0dXJuIG1vZGVtIHNpZ25hbHMgdG8gbGQuCi0gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KQotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotI2Vsc2UKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi0jZW5kaWYKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IHJlc3VsdCA9IC1FSU87Ci0JdWNoYXIgbXN0YXQgPSAwOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuIHJlc3VsdDsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aW9jbWdldCBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCW1zdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOwotICAgICAgICAvKiBBcHBlbmQgYW55IG91dGJvdW5kIHNpZ25hbHMgdGhhdCBtaWdodCBiZSBwZW5kaW5nLi4uICovCi0gICAgICAgIG1zdGF0IHw9IGNoLT5jaF9tb3N0YXQ7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlyZXN1bHQgPSAwOwotCi0JaWYgKG1zdGF0ICYgRF9EVFIoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fRFRSOwotCWlmIChtc3RhdCAmIERfUlRTKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX1JUUzsKLQlpZiAobXN0YXQgJiBEX0NUUyhjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9DVFM7Ci0JaWYgKG1zdGF0ICYgRF9EU1IoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fRFNSOwotCWlmIChtc3RhdCAmIERfUkkoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fUkk7Ci0JaWYgKG1zdGF0ICYgRF9DRChjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9DRDsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rpb2NtZ2V0IGZpbmlzaFxuIikpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKgotICogZGdhcF90dHlfdGlvY21zZXQoKQotICoKLSAqIFNldCBtb2RlbSBzaWduYWxzLCBjYWxsZWQgYnkgbGQuCi0gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KQotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKLSNlbHNlCi1zdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAotCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi0jZW5kaWYKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCByZXQgPSAtRUlPOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgbG9ja19mbGFnczI7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfdGlvY21zZXQgc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQlpZiAoc2V0ICYgVElPQ01fUlRTKSB7Ci0JCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOwotCQljaC0+Y2hfbXZhbCAgIHw9IERfUlRTKGNoKTsKLSAgICAgICAgfQotCi0JaWYgKHNldCAmIFRJT0NNX0RUUikgewotCQljaC0+Y2hfbWZvcmNlIHw9IERfRFRSKGNoKTsKLQkJY2gtPmNoX212YWwgICB8PSBEX0RUUihjaCk7Ci0gICAgICAgIH0KLQotCWlmIChjbGVhciAmIFRJT0NNX1JUUykgewotCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJY2gtPmNoX212YWwgICAmPSB+KERfUlRTKGNoKSk7Ci0gICAgICAgIH0KLQotCWlmIChjbGVhciAmIFRJT0NNX0RUUikgewotCQljaC0+Y2hfbWZvcmNlIHw9IERfRFRSKGNoKTsKLQkJY2gtPmNoX212YWwgICAmPSB+KERfRFRSKGNoKSk7Ci0gICAgICAgIH0KLQotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfdGlvY21zZXQgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLQotLyoKLSAqIGRnYXBfdHR5X3NlbmRfYnJlYWsoKQotICoKLSAqIFNlbmQgYSBCcmVhaywgY2FsbGVkIGJ5IGxkLgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X3NlbmRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IG1zZWMpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgcmV0ID0gLUVJTzsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCXN3aXRjaCAobXNlYykgewotCWNhc2UgLTE6Ci0JCW1zZWMgPSAweEZGRkY7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJbXNlYyA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1zZWMgLz0gMTA7Ci0JCWJyZWFrOwotCX0KLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3NlbmRfYnJlYWsgc3RhcnQgMS4gICVseFxuIiwgamlmZmllcykpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLSNpZiAwCi0JZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKLSNlbmRpZgotCWRnYXBfY21kdyhjaCwgU0JSRUFLLCAodTE2KSBtc2VjLCAwKTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfc2VuZF9icmVhayBmaW5pc2hcbiIpKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotCi0KLS8qCi0gKiBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQoKQotICoKLSAqIHdhaXQgdW50aWwgZGF0YSBoYXMgYmVlbiB0cmFuc21pdHRlZCwgY2FsbGVkIGJ5IGxkLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCi17Ci0JaW50IHJjOwotCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCWlmIChyYykgewotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGJhZCByZXR1cm46ICVkICIsIHJjKSk7Ci0JCXJldHVybjsKLQl9Ci0JcmV0dXJuOwotfQotCi0KLQotLyoKLSAqIGRnYXBfc2VuZF94Y2hhcigpCi0gKgotICogc2VuZCBhIGhpZ2ggcHJpb3JpdHkgY2hhcmFjdGVyLCBjYWxsZWQgYnkgbGQuCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JdWxvbmcgbG9ja19mbGFnczsKLQl1bG9uZyBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3NlbmRfeGNoYXIgc3RhcnQgMS4gICVseFxuIiwgamlmZmllcykpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCS8qCi0JICogVGhpcyBpcyB0ZWNobmljYWxseSB3aGF0IHdlIHNob3VsZCBkby4KLQkgKiBIb3dldmVyLCB0aGUgTklTVCB0ZXN0cyBzcGVjaWZpY2FsbHkgd2FudAotCSAqIHRvIHNlZSBlYWNoIFhPTiBvciBYT0ZGIGNoYXJhY3RlciB0aGF0IGl0Ci0JICogc2VuZHMsIHNvIGxldHMganVzdCBzZW5kIGVhY2ggY2hhcmFjdGVyCi0JICogYnkgaGFuZC4uLgotCSAqLwotI2lmIDAKLQlpZiAoYyA9PSBTVE9QX0NIQVIodHR5KSkgewotCQlkZ2FwX2NtZHcoY2gsIFJQQVVTRSwgMCwgMCk7Ci0JfQotCWVsc2UgaWYgKGMgPT0gU1RBUlRfQ0hBUih0dHkpKSB7Ci0JCWRnYXBfY21kdyhjaCwgUlJFU1VNRSwgMCwgMCk7Ci0JfQotCWVsc2UgewotCQlkZ2FwX3dtb3ZlKGNoLCAmYywgMSk7Ci0JfQotI2Vsc2UKLQlkZ2FwX3dtb3ZlKGNoLCAmYywgMSk7Ci0jZW5kaWYKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfc2VuZF94Y2hhciBmaW5pc2hcbiIpKTsKLQotCXJldHVybjsKLX0KLQotCi0KLQotLyoKLSAqIFJldHVybiBtb2RlbSBzaWduYWxzIHRvIGxkLgotICovCi1zdGF0aWMgaW50IGRnYXBfZ2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQotewotCWludCByZXN1bHQgPSAwOwotCXVjaGFyIG1zdGF0ID0gMDsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCWludCByYyA9IDA7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX2dldF9tb2RlbV9pbmZvIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybigtRU5YSU8pOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCW1zdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOwotCS8qIEFwcGVuZCBhbnkgb3V0Ym91bmQgc2lnbmFscyB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuLi4gKi8KLQltc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JcmVzdWx0ID0gMDsKLQotCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKLQlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9SVFM7Ci0JaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fQ1RTOwotCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKLQlpZiAobXN0YXQgJiBEX1JJKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX1JJOwotCWlmIChtc3RhdCAmIERfQ0QoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fQ0Q7Ci0KLQlyYyA9IHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF9nZXRfbW9kZW1faW5mbyBmaW5pc2hcbiIpKTsKLQlyZXR1cm4ocmMpOwotfQotCi0KLS8qCi0gKiBkZ2FwX3NldF9tb2RlbV9pbmZvKCkKLSAqCi0gKiBTZXQgbW9kZW0gc2lnbmFscywgY2FsbGVkIGJ5IGxkLgotICovCi1zdGF0aWMgaW50IGRnYXBfc2V0X21vZGVtX2luZm8oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IHJldCA9IC1FTlhJTzsKLQl1bnNpZ25lZCBpbnQgYXJnID0gMDsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCURQUl9JT0NUTCgoImRnYXBfc2V0X21vZGVtX2luZm8oKSBzdGFydFxuIikpOwotCi0JcmV0ID0gZ2V0X3VzZXIoYXJnLCB2YWx1ZSk7Ci0JaWYgKHJldCkgewotCQlEUFJfSU9DVEwoKCJkZ2FwX3NldF9tb2RlbV9pbmZvICVkIHJldDogJXguIGZpbmlzaGVkLlxuIiwgX19MSU5FX18sIHJldCkpOwotCQlyZXR1cm4ocmV0KTsKLQl9Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3NldF9tb2RlbV9pbmZvOiBjb21tYW5kOiAleCBhcmc6ICV4XG4iLCBjb21tYW5kLCBhcmcpKTsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgVElPQ01CSVM6Ci0JCWlmIChhcmcgJiBUSU9DTV9SVFMpIHsKLQkJCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOwotCQkJY2gtPmNoX212YWwgICB8PSBEX1JUUyhjaCk7Ci0gICAgICAgIAl9Ci0KLQkJaWYgKGFyZyAmIFRJT0NNX0RUUikgewotCQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7Ci0JCQljaC0+Y2hfbXZhbCAgIHw9IERfRFRSKGNoKTsKLSAgICAgICAgCX0KLQotCQlicmVhazsKLQotCWNhc2UgVElPQ01CSUM6Ci0JCWlmIChhcmcgJiBUSU9DTV9SVFMpIHsKLQkJCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOwotCQkJY2gtPmNoX212YWwgICAmPSB+KERfUlRTKGNoKSk7Ci0gICAgICAgIAl9Ci0KLQkJaWYgKGFyZyAmIFRJT0NNX0RUUikgewotCQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7Ci0JCQljaC0+Y2hfbXZhbCAgICY9IH4oRF9EVFIoY2gpKTsKLSAgICAgICAgCX0KLQotCQlicmVhazsKLQotICAgICAgICBjYXNlIFRJT0NNU0VUOgotCQljaC0+Y2hfbWZvcmNlID0gRF9EVFIoY2gpfERfUlRTKGNoKTsKLQotCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7Ci0JCQljaC0+Y2hfbXZhbCB8PSBEX1JUUyhjaCk7Ci0gICAgICAgIAl9Ci0JCWVsc2UgewotCQkJY2gtPmNoX212YWwgJj0gfihEX1JUUyhjaCkpOwotCQl9Ci0KLQkJaWYgKGFyZyAmIFRJT0NNX0RUUikgewotCQkJY2gtPmNoX212YWwgfD0gKERfRFRSKGNoKSk7Ci0gICAgICAgIAl9Ci0JCWVsc2UgewotCQkJY2gtPmNoX212YWwgJj0gfihEX0RUUihjaCkpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4oLUVJTlZBTCk7Ci0JfQotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF9zZXRfbW9kZW1faW5mbyBmaW5pc2hcbiIpKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lnZXRhKCkKLSAqCi0gKiBJb2N0bCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZvciBkaXR0eS4KLSAqCi0gKgotICoKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZGlnaV90IF9fdXNlciAqcmV0aW5mbykKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0Jc3RydWN0IGRpZ2lfdCB0bXA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQotCWlmICghcmV0aW5mbykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0KLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCW1lbWNweSgmdG1wLCAmY2gtPmNoX2RpZ2ksIHNpemVvZih0bXApKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfZGlnaXNldGEoKQotICoKLSAqIElvY3RsIHRvIHNldCB0aGUgaW5mb3JtYXRpb24gZm9yIGRpdHR5LgotICoKLSAqCi0gKgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBkaWdpX3QgX191c2VyICpuZXdfaW5mbykKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXN0cnVjdCBkaWdpX3QgbmV3X2RpZ2k7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKLQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MyOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2RpZ2ksIG5ld19pbmZvLCBzaXplb2Yoc3RydWN0IGRpZ2lfdCkpKSB7Ci0JCURQUl9JT0NUTCgoIkRJR0lfU0VUQSBmYWlsZWQgY29weV9mcm9tX3VzZXJcbiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oLUVGQVVMVCk7Ci0JfQotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCW1lbWNweSgmY2gtPmNoX2RpZ2ksICZuZXdfZGlnaSwgc2l6ZW9mKHN0cnVjdCBkaWdpX3QpKTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA8IDEpCi0JCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID0gMTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA+IDEwMDAwKQotCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA9IDEwMDAwOwotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA8IDEwKQotCQljaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPSAxMDsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPCAxKQotCQljaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPSAxOwotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA+IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyID0gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplOwotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfb25sZW4gPiBESUdJX1BMRU4pCi0JCWNoLT5jaF9kaWdpLmRpZ2lfb25sZW4gPSBESUdJX1BMRU47Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4gPiBESUdJX1BMRU4pCi0JCWNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuID0gRElHSV9QTEVOOwotCi0JZGdhcF9wYXJhbSh0dHkpOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJESUdJX1NFVEEgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkoKQotICoKLSAqIElvY3RsIHRvIGdldCB0aGUgY3VycmVudCBlZGVsYXkgc2V0dGluZy4KLSAqCi0gKgotICoKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnJldGluZm8pCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCB0bXA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQotCWlmICghcmV0aW5mbykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0KLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCXRtcCA9IHJlYWR3KCYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfZGlnaXNldGVkZWxheSgpCi0gKgotICogSW9jdGwgdG8gc2V0IHRoZSBFREVMQVkgc2V0dGluZwotICoKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKm5ld19pbmZvKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IG5ld19kaWdpOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgbG9ja19mbGFnczI7Ci0KLQlEUFJfSU9DVEwoKCJESUdJX1NFVEEgc3RhcnRcbiIpKTsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLSAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfZGlnaSwgbmV3X2luZm8sIHNpemVvZihpbnQpKSkgewotCQlEUFJfSU9DVEwoKCJESUdJX1NFVEVERUxBWSBmYWlsZWQgY29weV9mcm9tX3VzZXJcbiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oLUVGQVVMVCk7Ci0JfQotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCXdyaXRldygodTE2KSBuZXdfZGlnaSwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOwotCi0JZGdhcF9wYXJhbSh0dHkpOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJESUdJX1NFVEEgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKCkKLSAqCi0gKiBJb2N0bCB0byBnZXQgdGhlIGN1cnJlbnQgY3VzdG9tIGJhdWQgcmF0ZSBzZXR0aW5nLgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnJldGluZm8pCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCB0bXA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQotCWlmICghcmV0aW5mbykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0KLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCXRtcCA9IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKGNoKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJESUdJX0dFVENVU1RPTUJBVUQuIFJldHVybmluZyAlZFxuIiwgdG1wKSk7Ci0KLQlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQoKQotICoKLSAqIElvY3RsIHRvIHNldCB0aGUgY3VzdG9tIGJhdWQgcmF0ZSBzZXR0aW5nCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqbmV3X2luZm8pCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1aW50IG5ld19yYXRlOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgbG9ja19mbGFnczI7Ci0KLQlEUFJfSU9DVEwoKCJESUdJX1NFVENVU1RPTUJBVUQgc3RhcnRcbiIpKTsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3JhdGUsIG5ld19pbmZvLCBzaXplb2YodW5zaWduZWQgaW50KSkpIHsKLQkJRFBSX0lPQ1RMKCgiRElHSV9TRVRDVVNUT01CQVVEIGZhaWxlZCBjb3B5X2Zyb21fdXNlclxuIikpOwotCQlyZXR1cm4oLUVGQVVMVCk7Ci0JfQotCi0JaWYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSB7Ci0KLQkJRFBSX0lPQ1RMKCgiRElHSV9TRVRDVVNUT01CQVVELiBTZXR0aW5nICVkXG4iLCBuZXdfcmF0ZSkpOwotCi0JCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JCWNoLT5jaF9jdXN0b21fc3BlZWQgPSBuZXdfcmF0ZTsKLQotCQlkZ2FwX3BhcmFtKHR0eSk7Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCX0KLQotCURQUl9JT0NUTCgoIkRJR0lfU0VUQ1VTVE9NQkFVRCBmaW5pc2hcbiIpKTsKLQotCXJldHVybigwKTsKLX0KLQotCi0vKgotICogZGdhcF9zZXRfdGVybWlvcygpCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQljaC0+Y2hfY19jZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfY2ZsYWc7Ci0JY2gtPmNoX2NfaWZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOwotCWNoLT5jaF9jX29mbGFnICAgPSB0dHktPnRlcm1pb3MuY19vZmxhZzsKLQljaC0+Y2hfY19sZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfbGZsYWc7Ci0JY2gtPmNoX3N0YXJ0YyAgICA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVEFSVF07Ci0JY2gtPmNoX3N0b3BjICAgICA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVE9QXTsKLQotCWRnYXBfY2FycmllcihjaCk7Ci0JZGdhcF9wYXJhbSh0dHkpOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGdhcF90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybjsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybjsKLQotICAgICAgICBjaCA9IHVuLT51bl9jaDsKLSAgICAgICAgaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rocm90dGxlIHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JY2gtPmNoX2ZsYWdzIHw9IChDSF9SWEJMT0NLKTsKLSNpZiAxCi0JZGdhcF9jbWR3KGNoLCBSUEFVU0UsIDAsIDApOwotI2VuZGlmCi0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rocm90dGxlIGZpbmlzaFxuIikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybjsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybjsKLQotICAgICAgICBjaCA9IHVuLT51bl9jaDsKLSAgICAgICAgaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3VudGhyb3R0bGUgc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9SWEJMT0NLKTsKLQotI2lmIDEKLQlkZ2FwX2NtZHcoY2gsIFJSRVNVTUUsIDAsIDApOwotI2VuZGlmCi0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3VudGhyb3R0bGUgZmluaXNoXG4iKSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGdhcF90dHlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybjsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybjsKLQotICAgICAgICBjaCA9IHVuLT51bl9jaDsKLSAgICAgICAgaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3N0YXJ0IHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JZGdhcF9jbWR3KGNoLCBSRVNVTUVUWCwgMCwgMCk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3N0YXJ0IGZpbmlzaFxuIikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybjsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybjsKLQotICAgICAgICBjaCA9IHVuLT51bl9jaDsKLSAgICAgICAgaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3N0b3Agc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQlkZ2FwX2NtZHcoY2gsIFBBVVNFVFgsIDAsIDApOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdG9wIGZpbmlzaFxuIikpOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9mbHVzaF9jaGFycygpCi0gKgotICogRmx1c2ggdGhlIGNvb2sgYnVmZmVyCi0gKgotICogTm90ZSB0byBzZWxmLCBhbmQgYW55IG90aGVyIHBvb3Igc291bHMgd2hvIHZlbnR1cmUgaGVyZToKLSAqCi0gKiBmbHVzaCBpbiB0aGlzIGNhc2UgRE9FUyBOT1QgbWVhbiBkaXNwb3NlIG9mIHRoZSBkYXRhLgotICogaW5zdGVhZCwgaXQgbWVhbnMgInN0b3AgYnVmZmVyaW5nIGFuZCBzZW5kIGl0IGlmIHlvdQotICogaGF2ZW4ndCBhbHJlYWR5LiIgIEp1c3QgZ3Vlc3MgaG93IEkgZmlndXJlZCB0aGF0IG91dC4uLiAgIFNSVyAyLUp1bi05OAotICoKLSAqIEl0IGlzIGFsc28gYWx3YXlzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCAtIEpBUiA4LVNlcHQtOTkKLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybjsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybjsKLQotICAgICAgICBjaCA9IHVuLT51bl9jaDsKLSAgICAgICAgaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X2ZsdXNoX2NoYXJzIHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JLyogVE9ETzogRG8gc29tZXRoaW5nIGhlcmUgKi8KLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfZmx1c2hfY2hhcnMgZmluaXNoXG4iKSk7Ci19Ci0KLQotCi0vKgotICogZGdhcF90dHlfZmx1c2hfYnVmZmVyKCkKLSAqCi0gKiBGbHVzaCBUeCBidWZmZXIgKG1ha2UgaW4gPT0gb3V0KQotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MyOwotCXUxNgloZWFkID0gMDsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9mbHVzaF9idWZmZXIgb24gcG9ydDogJWQgc3RhcnRcbiIsIGNoLT5jaF9wb3J0bnVtKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JY2gtPmNoX2ZsYWdzICY9IH5DSF9TVE9QOwotCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+dHhfaGVhZCkpOwotCWRnYXBfY21kdyhjaCwgRkxVU0hUWCwgKHUxNikgaGVhZCwgMCk7Ci0JZGdhcF9jbWR3KGNoLCBSRVNVTUVUWCwgMCwgMCk7Ci0JaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgewotCQljaC0+Y2hfdHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCX0KLQlpZiAoY2gtPmNoX3B1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7Ci0JCWNoLT5jaF9wdW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9wdW4udW5fZmxhZ3Nfd2FpdCk7Ci0JfQotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+d3JpdGVfd2FpdCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9mbHVzaF9idWZmZXIgZmluaXNoXG4iKSk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgSU9DVEwgZnVuY3Rpb24gYW5kIGFsbCBvZiBpdHMgaGVscGVycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIGRnYXBfdHR5X2lvY3RsKCkKLSAqCi0gKiBUaGUgdXN1YWwgYXNzb3J0bWVudCBvZiBpb2N0bCdzCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgcmM7Ci0JdTE2CWhlYWQgPSAwOwotCXVsb25nICAgbG9ja19mbGFncyA9IDA7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMiA9IDA7Ci0Jdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiAoLUVOT0RFVik7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKC1FTk9ERVYpOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKC1FTk9ERVYpOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgtRU5PREVWKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIHN0YXJ0IG9uIHBvcnQgJWQgLSBjbWQgJXMgKCV4KSwgYXJnICVseFxuIiwKLQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWlmICh1bi0+dW5fb3Blbl9jb3VudCA8PSAwKSB7Ci0JCURQUl9CQVNJQygoImRnYXBfdHR5X2lvY3RsIC0gdW5pdCBub3Qgb3Blbi5cbiIpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oLUVJTyk7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQotCS8qIEhlcmUgYXJlIGFsbCB0aGUgc3RhbmRhcmQgaW9jdGwncyB0aGF0IHdlIE1VU1QgaW1wbGVtZW50ICovCi0KLQljYXNlIFRDU0JSSzoKLQkJLyoKLQkJICogVENTQlJLIGlzIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhawotCQkgKiB0aGlzIGJlaGF2aW91ciBpcyBleHBsb2l0ZWQgYnkgdGNkcmFpbigpLgotCQkgKgotCQkgKiBBY2NvcmRpbmcgdG8gUE9TSVguMSBzcGVjICg3LjIuMi4xLjIpIGJyZWFrcyBzaG91bGQgYmUKLQkJICogYmV0d2VlbiAwLjI1IGFuZCAwLjUgc2Vjb25kcyBzbyB3ZSdsbCBhc2sgZm9yIHNvbWV0aGluZwotCQkgKiBpbiB0aGUgbWlkZGxlOiAwLjM3NSBzZWNvbmRzLgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJaWYgKHJjKSB7Ci0JCQlyZXR1cm4ocmMpOwotCQl9Ci0KLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0KLQkJaWYgKHJjKSB7Ci0JCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGJhZCByZXR1cm46ICVkICIsIHJjKSk7Ci0JCQlyZXR1cm4oLUVJTlRSKTsKLQkJfQotCi0JCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JCWlmKCgoY21kID09IFRDU0JSSykgJiYgKCFhcmcpKSB8fCAoY21kID09IFRDU0JSS1ApKSB7Ci0JCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOwotCQl9Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIGZpbmlzaCBvbiBwb3J0ICVkIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCQljaC0+Y2hfcG9ydG51bSwgZGdhcF9pb2N0bF9uYW1lKGNtZCksIGNtZCwgYXJnKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0KLQotCWNhc2UgVENTQlJLUDoKLSAJCS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkKLQotCQkgKiBBY2NvcmRpbmcgdG8gUE9TSVguMSBzcGVjICg3LjIuMi4xLjIpIGJyZWFrcyBzaG91bGQgYmUKLQkJICogYmV0d2VlbiAwLjI1IGFuZCAwLjUgc2Vjb25kcyBzbyB3ZSdsbCBhc2sgZm9yIHNvbWV0aGluZwotCQkgKiBpbiB0aGUgbWlkZGxlOiAwLjM3NSBzZWNvbmRzLgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJaWYgKHJjKSB7Ci0JCQlyZXR1cm4ocmMpOwotCQl9Ci0KLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JCXJldHVybigwKTsKLQotICAgICAgICBjYXNlIFRJT0NTQlJLOgotCQkvKgotCQkgKiBGRVA1IGRvZXNuJ3Qgc3VwcG9ydCB0dXJuaW5nIG9uIGEgYnJlYWsgdW5jb25kaXRpb25hbGx5LgotCQkgKiBUaGUgRkVQNSBkZXZpY2Ugd2lsbCBzdG9wIHNlbmRpbmcgYSBicmVhayBhdXRvbWF0aWNhbGx5Ci0JCSAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZSB2YWx1ZSB0aGF0IHdhcyBzZW50IHdoZW4gdHVybmluZyBvbgotCQkgKiB0aGUgYnJlYWsuCi0JCSAqLwotCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlpZiAocmMpIHsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQotCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKLQkJaWYgKHJjKSB7Ci0JCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGJhZCByZXR1cm46ICVkICIsIHJjKSk7Ci0JCQlyZXR1cm4oLUVJTlRSKTsKLQkJfQotCi0JCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JCWRnYXBfY21kdyhjaCwgU0JSRUFLLCAodTE2KSBTQlJFQUtfVElNRSwgMCk7Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIGZpbmlzaCBvbiBwb3J0ICVkIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCQljaC0+Y2hfcG9ydG51bSwgZGdhcF9pb2N0bF9uYW1lKGNtZCksIGNtZCwgYXJnKSk7Ci0KLQkJcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBUSU9DQ0JSSzoKLQkJLyoKLQkJICogRkVQNSBkb2Vzbid0IHN1cHBvcnQgdHVybmluZyBvZmYgYSBicmVhayB1bmNvbmRpdGlvbmFsbHkuCi0JCSAqIFRoZSBGRVA1IGRldmljZSB3aWxsIHN0b3Agc2VuZGluZyBhIGJyZWFrIGF1dG9tYXRpY2FsbHkKLQkJICogYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lIHZhbHVlIHRoYXQgd2FzIHNlbnQgd2hlbiB0dXJuaW5nIG9uCi0JCSAqIHRoZSBicmVhay4KLQkJICovCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFRJT0NHU09GVENBUjoKLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJcmMgPSBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpOwotCQlyZXR1cm4ocmMpOwotCi0JY2FzZSBUSU9DU1NPRlRDQVI6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlyYyA9IGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZyk7Ci0JCWlmIChyYykKLQkJCXJldHVybihyYyk7Ci0KLQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCXR0eS0+dGVybWlvcy5jX2NmbGFnID0gKCh0dHktPnRlcm1pb3MuY19jZmxhZyAmIH5DTE9DQUwpIHwgKGFyZyA/IENMT0NBTCA6IDApKTsKLQkJZGdhcF9wYXJhbSh0dHkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJcmV0dXJuKDApOwotCi0JY2FzZSBUSU9DTUdFVDoKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotICAgICAgICAgICAgICAgIHJldHVybihkZ2FwX2dldF9tb2RlbV9pbmZvKGNoLCB1YXJnKSk7Ci0KLQljYXNlIFRJT0NNQklTOgotCWNhc2UgVElPQ01CSUM6Ci0JY2FzZSBUSU9DTVNFVDoKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF9zZXRfbW9kZW1faW5mbyh0dHksIGNtZCwgdWFyZykpOwotCi0JCS8qCi0JCSAqIEhlcmUgYXJlIGFueSBhZGRpdGlvbmFsIGlvY3RsJ3MgdGhhdCB3ZSB3YW50IHRvIGltcGxlbWVudAotCQkgKi8KLQotCWNhc2UgVENGTFNIOgotCQkvKgotCQkgKiBUaGUgbGludXggdHR5IGRyaXZlciBkb2Vzbid0IGhhdmUgYSBmbHVzaAotCQkgKiBpbnB1dCByb3V0aW5lIGZvciB0aGUgZHJpdmVyLCBhc3N1bWluZyBhbGwgYmFja2VkCi0JCSAqIHVwIGRhdGEgaXMgaW4gdGhlIGxpbmUgZGlzYy4gYnVmZmVycy4gIEhvd2V2ZXIsCi0JCSAqIHdlIGFsbCBrbm93IHRoYXQncyBub3QgdGhlIGNhc2UuICBIZXJlLCB3ZQotCQkgKiBhY3Qgb24gdGhlIGlvY3RsLCBidXQgdGhlbiBsaWUgYW5kIHNheSB3ZSBkaWRuJ3QKLQkJICogc28gdGhlIGxpbmUgZGlzY2lwbGluZSB3aWxsIHByb2Nlc3MgdGhlIGZsdXNoCi0JCSAqIGFsc28uCi0JCSAqLwotCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKLQkJaWYgKHJjKSB7Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmV0dXJuKHJjKTsKLQkJfQotCi0JCWlmICgoYXJnID09IFRDSUZMVVNIKSB8fCAoYXJnID09IFRDSU9GTFVTSCkpIHsKLQkJCWlmICghKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpKSB7Ci0JCQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9oZWFkKSk7Ci0JCQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7Ci0JCQkJd3JpdGViKDAsICYoY2gtPmNoX2JzLT5vcnVuKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGFyZyA9PSBUQ09GTFVTSCkgfHwgKGFyZyA9PSBUQ0lPRkxVU0gpKSB7Ci0JCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1NUT1A7Ci0JCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKLQkJCWRnYXBfY21kdyhjaCwgRkxVU0hUWCwgKHUxNikgaGVhZCwgMCApOwotCQkJZGdhcF9jbWR3KGNoLCBSRVNVTUVUWCwgMCwgMCk7Ci0JCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7Ci0JCQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+KFVOX0xPV3xVTl9FTVBUWSk7Ci0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCQkJfQotCQkJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgewotCQkJCWNoLT5jaF9wdW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJCX0KLQkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPndyaXRlX3dhaXQpKQotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKLQotCQkJLyogQ2FuJ3QgaG9sZCBhbnkgbG9ja3Mgd2hlbiBjYWxsaW5nIHR0eV93YWtldXAhICovCi0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJdHR5X3dha2V1cCh0dHkpOwotCQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQl9Ci0KLQkJLyogcHJldGVuZCB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoaXMgSU9DVEwgKi8KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIChMSU5FOiVkKSBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJX19MSU5FX18sIGNoLT5jaF9wb3J0bnVtLCBkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQotCWNhc2UgVENTRVRTRjoKLQljYXNlIFRDU0VUU1c6Ci0JCS8qCi0JCSAqIFRoZSBsaW51eCB0dHkgZHJpdmVyIGRvZXNuJ3QgaGF2ZSBhIGZsdXNoCi0JCSAqIGlucHV0IHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIsIGFzc3VtaW5nIGFsbCBiYWNrZWQKLQkJICogdXAgZGF0YSBpcyBpbiB0aGUgbGluZSBkaXNjLiBidWZmZXJzLiAgSG93ZXZlciwKLQkJICogd2UgYWxsIGtub3cgdGhhdCdzIG5vdCB0aGUgY2FzZS4gIEhlcmUsIHdlCi0JCSAqIGFjdCBvbiB0aGUgaW9jdGwsIGJ1dCB0aGVuIGxpZSBhbmQgc2F5IHdlIGRpZG4ndAotCQkgKiBzbyB0aGUgbGluZSBkaXNjaXBsaW5lIHdpbGwgcHJvY2VzcyB0aGUgZmx1c2gKLQkJICogYWxzby4KLQkJICovCi0JCWlmIChjbWQgPT0gVENTRVRTRikgewotCQkJLyogZmx1c2ggcnggKi8KLQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKLQkJCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOwotCQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7Ci0JCX0KLQotCQkvKiBub3cgd2FpdCBmb3IgYWxsIHRoZSBvdXRwdXQgdG8gZHJhaW4gKi8KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKLQkJaWYgKHJjKSB7Ci0JCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGJhZCByZXR1cm46ICVkICIsIHJjKSk7Ci0JCQlyZXR1cm4oLUVJTlRSKTsKLQkJfQotCi0JCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIGZpbmlzaCBvbiBwb3J0ICVkIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCQljaC0+Y2hfcG9ydG51bSwgZGdhcF9pb2N0bF9uYW1lKGNtZCksIGNtZCwgYXJnKSk7Ci0KLQkJLyogcHJldGVuZCB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoaXMgKi8KLQkJcmV0dXJuKC1FTk9JT0NUTENNRCk7Ci0KLQljYXNlIFRDU0VUQVc6Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKLQkJaWYgKHJjKSB7Ci0JCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGJhZCByZXR1cm46ICVkICIsIHJjKSk7Ci0JCQlyZXR1cm4oLUVJTlRSKTsKLQkJfQotCi0JCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzICovCi0JCXJldHVybigtRU5PSU9DVExDTUQpOwotCi0JY2FzZSBUQ1hPTkM6Ci0JCS8qCi0JCSAqIFRoZSBMaW51eCBMaW5lIERpc2NpcGxpbmUgKExEKSB3b3VsZCBkbyB0aGlzIGZvciB1cyBpZiB3ZQotCQkgKiBsZXQgaXQsIGJ1dCB3ZSBoYXZlIHRoZSBzcGVjaWFsIGZpcm13YXJlIG9wdGlvbnMgdG8gZG8gdGhpcwotCQkgKiB0aGUgInJpZ2h0IHdheSIgcmVnYXJkbGVzcyBvZiBoYXJkd2FyZSBvciBzb2Z0d2FyZSBmbG93Ci0JCSAqIGNvbnRyb2wgc28gd2UnbGwgZG8gaXQgb3V0c2VsdmVzIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgTEQKLQkJICogZG8gaXQuCi0JCSAqLwotCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKLQkJaWYgKHJjKSB7Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmV0dXJuKHJjKTsKLQkJfQotCi0JCURQUl9JT0NUTCgoImRnYXBfaW9jdGwgLSBpbiBUQ1hPTkMgLSAlZFxuIiwgY21kKSk7Ci0JCXN3aXRjaCAoYXJnKSB7Ci0KLQkJY2FzZSBUQ09PTjoKLQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlkZ2FwX3R0eV9zdGFydCh0dHkpOwotCQkJcmV0dXJuKDApOwotCQljYXNlIFRDT09GRjoKLQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlkZ2FwX3R0eV9zdG9wKHR0eSk7Ci0JCQlyZXR1cm4oMCk7Ci0JCWNhc2UgVENJT046Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJLyogTWFrZSB0aGUgbGQgZG8gaXQgKi8KLQkJCXJldHVybigtRU5PSU9DVExDTUQpOwotCQljYXNlIFRDSU9GRjoKLQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkvKiBNYWtlIHRoZSBsZCBkbyBpdCAqLwotCQkJcmV0dXJuKC1FTk9JT0NUTENNRCk7Ci0JCWRlZmF1bHQ6Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmV0dXJuKC1FSU5WQUwpOwotCQl9Ci0KLQljYXNlIERJR0lfR0VUQToKLQkJLyogZ2V0IGluZm9ybWF0aW9uIGZvciBkaXR0eSAqLwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybihkZ2FwX3R0eV9kaWdpZ2V0YSh0dHksIHVhcmcpKTsKLQotCWNhc2UgRElHSV9TRVRBVzoKLQljYXNlIERJR0lfU0VUQUY6Ci0KLQkJLyogc2V0IGluZm9ybWF0aW9uIGZvciBkaXR0eSAqLwotCQlpZiAoY21kID09IChESUdJX1NFVEFXKSkgewotCi0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCQlpZiAocmMpIHsKLQkJCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGJhZCByZXR1cm46ICVkICIsIHJjKSk7Ci0JCQkJcmV0dXJuKC1FSU5UUik7Ci0JCQl9Ci0JCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQkJfQotCQkvKiBmYWxsIHRocnUgKi8KLQotCWNhc2UgRElHSV9TRVRBOgotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybihkZ2FwX3R0eV9kaWdpc2V0YSh0dHksIHVhcmcpKTsKLQotCWNhc2UgRElHSV9HRURFTEFZOgotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybihkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX1NFREVMQVk6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfR0VUQ1VTVE9NQkFVRDoKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaWdldGN1c3RvbWJhdWQodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDoKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfUkVTRVRfUE9SVDoKLQkJZGdhcF9maXJtd2FyZV9yZXNldF9wb3J0KGNoKTsKLQkJZGdhcF9wYXJhbSh0dHkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybiAwOwotCi0JZGVmYXVsdDoKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIC0gaW4gZGVmYXVsdFxuIikpOwotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBlbmQgLSBjbWQgJXMgKCV4KSwgYXJnICVseFxuIiwKLQkJCWRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JCXJldHVybigtRU5PSU9DVExDTUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHR5LmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjRhNDYwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9fREdBUF9UVFlfSAotI2RlZmluZSBfX0RHQVBfVFRZX0gKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0KLWludAlkZ2FwX3R0eV9yZWdpc3RlcihzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKLQotaW50CWRnYXBfdHR5X3ByZWluaXQodm9pZCk7Ci1pbnQgICAgIGRnYXBfdHR5X2luaXQoc3RydWN0IGJvYXJkX3QgKik7Ci0KLXZvaWQJZGdhcF90dHlfcG9zdF91bmluaXQodm9pZCk7Ci12b2lkCWRnYXBfdHR5X3VuaW5pdChzdHJ1Y3QgYm9hcmRfdCAqKTsKLQotdm9pZAlkZ2FwX2NhcnJpZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotdm9pZAlkZ2FwX2lucHV0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhMzhjNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9fREdBUF9UWVBFU19ICi0jZGVmaW5lIF9fREdBUF9UWVBFU19ICi0KLSNpZm5kZWYgVFJVRQotIyBkZWZpbmUgVFJVRSAxCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotIyBkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLS8qIFJlcXVpcmVkIGZvciBvdXIgc2hhcmVkIGhlYWRlcnMhICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVjaGFyOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RpZ2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RpZ2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlYTRmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kaWdpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogJElkOiBkaWdpLmgsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICovCi0KLSNpZm5kZWYgX19ESUdJX0gKLSNkZWZpbmUgX19ESUdJX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKglEZWZpbml0aW9ucyBmb3IgRGlnaSBkaXR0eSgxKSBjb21tYW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LTk2IERpZ2kgSW50ZXJuYXRpb25hbCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFwcGxpY2F0aW9uIGFjY2VzcyB0byBzcGVjaWFsIERpZ2kKLSAqIHNlcmlhbCBsaW5lIGVuaGFuY2VtZW50cyB3aGljaCBhcmUgbm90IHN0YW5kYXJkIFVOSVgodG0pIGZlYXR1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKFRJT0NNT0RHKQotCi0jZGVmaW5lCVRJT0NNT0RHCSgnZCc8PDgpIHwgMjUwCQkvKiBnZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwotI2RlZmluZQlUSU9DTU9EUwkoJ2QnPDw4KSB8IDI1MQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLQotI2lmbmRlZiBUSU9DTV9MRSAKLSNkZWZpbmUJCVRJT0NNX0xFCTB4MDEJCS8qIGxpbmUgZW5hYmxlCQkqLwotI2RlZmluZQkJVElPQ01fRFRSCTB4MDIJCS8qIGRhdGEgdGVybWluYWwgcmVhZHkJKi8KLSNkZWZpbmUJCVRJT0NNX1JUUwkweDA0CQkvKiByZXF1ZXN0IHRvIHNlbmQJKi8KLSNkZWZpbmUJCVRJT0NNX1NUCTB4MDgJCS8qIHNlY29uZGFyeSB0cmFuc21pdAkqLwotI2RlZmluZQkJVElPQ01fU1IJMHgxMAkJLyogc2Vjb25kYXJ5IHJlY2VpdmUJKi8KLSNkZWZpbmUJCVRJT0NNX0NUUwkweDIwCQkvKiBjbGVhciB0byBzZW5kCSovCi0jZGVmaW5lCQlUSU9DTV9DQVIJMHg0MAkJLyogY2FycmllciBkZXRlY3QJKi8KLSNkZWZpbmUJCVRJT0NNX1JORwkweDgwCQkvKiByaW5nCWluZGljYXRvcgkqLwotI2RlZmluZQkJVElPQ01fRFNSCTB4MTAwCQkvKiBkYXRhIHNldCByZWFkeQkqLwotI2RlZmluZQkJVElPQ01fUkkJVElPQ01fUk5HCS8qIHJpbmcgKGFsdGVybmF0ZSkJKi8KLSNkZWZpbmUJCVRJT0NNX0NECVRJT0NNX0NBUgkvKiBjYXJyaWVyIGRldGVjdCAoYWx0KQkqLwotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoVElPQ01TRVQpCi0jZGVmaW5lCVRJT0NNU0VUCSgnZCc8PDgpIHwgMjUyCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwotI2RlZmluZQlUSU9DTUdFVAkoJ2QnPDw4KSB8IDI1MwkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoVElPQ01CSUMpCi0jZGVmaW5lCVRJT0NNQklDCSgnZCc8PDgpIHwgMjU0CQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLwotI2RlZmluZQlUSU9DTUJJUwkoJ2QnPDw4KSB8IDI1NQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KLSNlbmRpZgotCi0KLSNpZiAhZGVmaW5lZChUSU9DU0RUUikKLSNkZWZpbmUJVElPQ1NEVFIJKCdlJzw8OCkgfCAwCQkvKiBzZXQgRFRSCQkqLwotI2RlZmluZQlUSU9DQ0RUUgkoJ2UnPDw4KSB8IDEJCS8qIGNsZWFyIERUUgkJKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJb2N0bCBjb21tYW5kIGFyZ3VtZW50cyBmb3IgRElHSSBwYXJhbWV0ZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRElHSV9HRVRBCSgnZSc8PDgpIHwgOTQJCS8qIFJlYWQgcGFyYW1zCQkqLwotCi0jZGVmaW5lIERJR0lfU0VUQQkoJ2UnPDw4KSB8IDk1CQkvKiBTZXQgcGFyYW1zCQkqLwotI2RlZmluZSBESUdJX1NFVEFXCSgnZSc8PDgpIHwgOTYJCS8qIERyYWluICYgc2V0IHBhcmFtcwkqLwotI2RlZmluZSBESUdJX1NFVEFGCSgnZSc8PDgpIHwgOTcJCS8qIERyYWluLCBmbHVzaCAmIHNldCBwYXJhbXMgKi8KLQotI2RlZmluZSBESUdJX0tNRQkoJ2UnPDw4KSB8IDk4CQkvKiBSZWFkL1dyaXRlIEhvc3QJKi8KLQkJCQkJCS8qIEFkYXB0ZXIgTWVtb3J5CSovCi0KLSNkZWZpbmUJRElHSV9HRVRGTE9XCSgnZSc8PDgpIHwgOTkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLwotCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzIAkgKi8KLSNkZWZpbmUJRElHSV9TRVRGTE9XCSgnZSc8PDgpIHwgMTAwCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KLQkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KLSNkZWZpbmUJRElHSV9HRVRBRkxPVwkoJ2UnPDw4KSB8IDEwMQkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCi0JCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLwotI2RlZmluZQlESUdJX1NFVEFGTE9XCSgnZSc8PDgpIHwgMTAyCQkvKiBTZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KLQkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycwkgKi8KLQotI2RlZmluZSBESUdJX0dFREVMQVkJKCdkJzw8OCkgfCAyNDYJCS8qIEdldCBlZGVsYXkgKi8KLSNkZWZpbmUgRElHSV9TRURFTEFZCSgnZCc8PDgpIHwgMjQ3CQkvKiBTZXQgZWRlbGF5ICovCi0KLXN0cnVjdAlkaWdpZmxvd190IHsKLQl1bnNpZ25lZCBjaGFyCXN0YXJ0YzsJCQkJLyogZmxvdyBjbnRsIHN0YXJ0IGNoYXIJKi8KLQl1bnNpZ25lZCBjaGFyCXN0b3BjOwkJCQkvKiBmbG93IGNudGwgc3RvcCBjaGFyCSovCi19OwotCi0KLSNpZmRlZglGTE9XXzIyMDAKLSNkZWZpbmUJRjIyMDBfR0VUQQkoJ2UnPDw4KSB8IDEwNAkJLyogR2V0IDJ4MzYgZmxvdyBjbnRsIGZsYWdzICovCi0jZGVmaW5lCUYyMjAwX1NFVEFXCSgnZSc8PDgpIHwgMTA1CQkvKiBTZXQgMngzNiBmbG93IGNudGwgZmxhZ3MgKi8KLSNkZWZpbmUJCUYyMjAwX01BU0sJMHgwMwkJLyogMjIwMCBmbG93IGNudGwgYml0IG1hc2sgICovCi0jZGVmaW5lCQlGQ05UTF8yMjAwCTB4MDEJCS8qIDJ4MzYgdGVybWluYWwgZmxvdyBjbnRsICAqLwotI2RlZmluZQkJUENOVExfMjIwMAkweDAyCQkvKiAyeDM2IHByaW50ZXIgZmxvdyBjbnRsICAgKi8KLSNkZWZpbmUJRjIyMDBfWE9OCTB4ZjgKLSNkZWZpbmUJUDIyMDBfWE9OCTB4ZjkKLSNkZWZpbmUJRjIyMDBfWE9GRgkweGZhCi0jZGVmaW5lCVAyMjAwX1hPRkYJMHhmYgotCi0jZGVmaW5lCUZYT0ZGX01BU0sJMHgwMwkJCS8qIDIyMDAgZmxvdyBzdGF0dXMgbWFzayAgICAqLwotI2RlZmluZQlSQ1ZEX0ZYT0ZGCTB4MDEJCQkvKiAyeDM2IFRlcm1pbmFsIFhPRkYgcmN2ZCAgKi8KLSNkZWZpbmUJUkNWRF9QWE9GRgkweDAyCQkJLyogMngzNiBQcmludGVyIFhPRkYgcmN2ZCAgICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFsdWVzIGZvciBkaWdpX2ZsYWdzIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRElHSV9JWE9OCTB4MDAwMQkJLyogSGFuZGxlIElYT04gaW4gdGhlIEZFUAkqLwotI2RlZmluZSBESUdJX0ZBU1QJMHgwMDAyCQkvKiBGYXN0IGJhdWQgcmF0ZXMJCSovCi0jZGVmaW5lIFJUU1BBQ0UJCTB4MDAwNAkJLyogUlRTIGlucHV0IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBDVFNQQUNFCQkweDAwMDgJCS8qIENUUyBvdXRwdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERTUlBBQ0UJCTB4MDAxMAkJLyogRFNSIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgRENEUEFDRQkJMHgwMDIwCQkvKiBEQ0Qgb3V0cHV0IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBEVFJQQUNFCQkweDAwNDAJCS8qIERUUiBpbnB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgRElHSV9DT09LCTB4MDA4MAkJLyogQ29va2VkIHByb2Nlc3NpbmcgZG9uZSBpbiBGRVAgKi8KLSNkZWZpbmUgRElHSV9GT1JDRURDRAkweDAxMDAJCS8qIEZvcmNlIGNhcnJpZXIJCSovCi0jZGVmaW5lCURJR0lfQUxUUElOCTB4MDIwMAkJLyogQWx0ZXJuYXRlIFJKLTQ1IHBpbiBjb25maWcJKi8KLSNkZWZpbmUJRElHSV9BSVhPTgkweDA0MDAJCS8qIEF1eCBmbG93IGNvbnRyb2wgaW4gZmVwCSovCi0jZGVmaW5lCURJR0lfUFJJTlRFUgkweDA4MDAJCS8qIEhvbGQgcG9ydCBvcGVuIGZvciBmbG93IGNudHJsKi8KLSNkZWZpbmUgRElHSV9QUF9JTlBVVAkweDEwMDAJCS8qIENoYW5nZSBwYXJhbGxlbCBwb3J0IHRvIGlucHV0Ki8KLSNkZWZpbmUgRElHSV9EVFJfVE9HR0xFIDB4MjAwMAkJLyogU3VwcG9ydCBEVFIgVG9nZ2xlCQkqLwotI2RlZmluZQlESUdJXzQyMgkweDQwMDAJCS8qIGZvciA0MjIvMjMyIHNlbGVjdGFibGUgcGFuZWwgKi8KLSNkZWZpbmUgRElHSV9SVFNfVE9HR0xFCTB4ODAwMAkJLyogU3VwcG9ydCBSVFMgVG9nZ2xlCQkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGVzZSBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBjb214aS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lCURJR0lfQ09NWEkJKERJR0lfRkFTVHxESUdJX0NPT0t8RFNSUEFDRXxEQ0RQQUNFfERUUlBBQ0UpCi0KLSNkZWZpbmUgRElHSV9QTEVOCTI4CQkvKiBTdHJpbmcgbGVuZ3RoCQkqLwotI2RlZmluZQlESUdJX1RTSVoJMTAJCS8qIFRlcm1pbmFsIHN0cmluZyBsZW4JCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIERJR0kgcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZGlnaV90IHsKLQl1bnNpZ25lZCBzaG9ydAlkaWdpX2ZsYWdzOwkJLyogRmxhZ3MgKHNlZSBhYm92ZSkJKi8KLQl1bnNpZ25lZCBzaG9ydAlkaWdpX21heGNwczsJCS8qIE1heCBwcmludGVyIENQUwkqLwotCXVuc2lnbmVkIHNob3J0CWRpZ2lfbWF4Y2hhcjsJCS8qIE1heCBjaGFycyBpbiBwcmludCBxdWV1ZSAqLwotCXVuc2lnbmVkIHNob3J0CWRpZ2lfYnVmc2l6ZTsJCS8qIEJ1ZmZlciBzaXplCQkqLwotCXVuc2lnbmVkIGNoYXIJZGlnaV9vbmxlbjsJCS8qIExlbmd0aCBvZiBPTiBzdHJpbmcJKi8KLQl1bnNpZ25lZCBjaGFyCWRpZ2lfb2ZmbGVuOwkJLyogTGVuZ3RoIG9mIE9GRiBzdHJpbmcJKi8KLQljaGFyCQlkaWdpX29uc3RyW0RJR0lfUExFTl07CS8qIFByaW50ZXIgb24gc3RyaW5nCSovCi0JY2hhcgkJZGlnaV9vZmZzdHJbRElHSV9QTEVOXTsJLyogUHJpbnRlciBvZmYgc3RyaW5nCSovCi0JY2hhcgkJZGlnaV90ZXJtW0RJR0lfVFNJWl07CS8qIHRlcm1pbmFsIHN0cmluZwkqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogS01FIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUJUldfSURMRQkJMAkvKiBPcGVyYXRpb24gY29tcGxldGUJCQkqLwotI2RlZmluZQlSV19SRUFECQkxCS8qIFJlYWQgQ29uY2VudHJhdG9yIE1lbW9yeQkJKi8KLSNkZWZpbmUJUldfV1JJVEUJMgkvKiBXcml0ZSBDb25jZW50cmF0b3IgTWVtb3J5CQkqLwotCi1zdHJ1Y3QgcndfdCB7Ci0JdW5zaWduZWQgY2hhcglyd19yZXE7CQkvKiBSZXF1ZXN0IHR5cGUJCQkqLwotCXVuc2lnbmVkIGNoYXIJcndfYm9hcmQ7CS8qIEhvc3QgQWRhcHRlciBib2FyZCBudW1iZXIJKi8KLQl1bnNpZ25lZCBjaGFyCXJ3X2NvbmM7CS8qIENvbmNlbnRyYXRvciBudW1iZXIJCSovCi0JdW5zaWduZWQgY2hhcglyd19yZXNlcnZlZDsJLyogUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbgkqLwotCXVuc2lnbmVkIGxvbmcJcndfYWRkcjsJLyogQWRkcmVzcyBpbiBjb25jZW50cmF0b3IJKi8KLQl1bnNpZ25lZCBzaG9ydAlyd19zaXplOwkvKiBSZWFkL3dyaXRlIHJlcXVlc3QgbGVuZ3RoCSovCi0JdW5zaWduZWQgY2hhcglyd19kYXRhWzEyOF07CS8qIERhdGEgdG8gcmVhZC93cml0ZQkJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2hyaW5rIEJ1ZmZlciBhbmQgQm9hcmQgSW5mb3JtYXRpb24gZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkvKiBCb2FyZCB0eXBlIHJldHVybiBjb2RlcyAqLwotI2RlZmluZQlQQ1hJX1RZUEUgMSAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWGkgKi8KLSNkZWZpbmUgUENYTV9UWVBFIDIgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1htICovCi0jZGVmaW5lCVBDWEVfVFlQRSAzICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YZSAqLwotI2RlZmluZQlNQ1hJX1RZUEUgNCAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgTUMvWGkgKi8KLSNkZWZpbmUgQ09NWElfVFlQRSA1ICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBDT00vWGkgKi8KLQotCQkJIC8qIE5vbi1aZXJvIFJlc3VsdCBjb2Rlcy4gKi8KLSNkZWZpbmUgUkVTVUxUX05PQkRGTkQgMSAvKiBBIERpZ2kgcHJvZHVjdCBhdCB0aGF0IHBvcnQgaXMgbm90IGNvbmZpZyBpbnN0YWxsZWQgKi8gCi0jZGVmaW5lIFJFU1VMVF9OT0RFU0NUIDIgLyogQSBtZW1vcnkgZGVzY3JpcHRvciB3YXMgbm90IG9idGFpbmFibGUgKi8gCi0jZGVmaW5lIFJFU1VMVF9OT09TU0lHIDMgLyogRkVQL09TIHNpZ25hdHVyZSB3YXMgbm90IGRldGVjdGVkIG9uIHRoZSBib2FyZCAqLwotI2RlZmluZSBSRVNVTFRfVE9PU01MICA0IC8qIFRvbyBzbWFsbCBhbiBhcmVhIHRvIHNocmluay4gICovCi0jZGVmaW5lIFJFU1VMVF9OT0NIQU4gIDUgLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgZm9yIHRoZSBib2FyZCB3YXMgbm90IGZvdW5kICovCi0KLXN0cnVjdCBzaHJpbmtfYnVmX3N0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3ZhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcGh5czsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBib2FyZCAqLwotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9ic2VnOwkvKiBBbW91bnQgb2YgYm9hcmQgbWVtb3J5ICovCi0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2hzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIER1YWwtUG9ydCAqLwotCi0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2xzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIGZyZWVkIG1lbW9yeQkJCQkJCSovIAotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9tc2VnOwkvKiBMaW5lYXIgYWRkcmVzcyBmcm9tIHN0YXJ0IG9mCi0JCQkJCQkgICBkdWFsLXBvcnQgd2VyZSBmcmVlZCBtZW1vcnkKLQkJCQkJCSAgIGJlZ2lucywgaG9zdCB2aWV3cG9pbnQuICovCi0KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfYmRwYXJhbTsJLyogUGFyYW1ldGVyIGZvciB4eG1lbW9uIGFuZAotCQkJCQkJICAgeHhtZW1vZmYgKi8KLQotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9yZXNlcnZhOwkvKiBSZXNlcnZlZCAqLwotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9yZXNlcnZiOwkvKiBSZXNlcnZlZCAqLwotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9yZXNlcnZjOwkvKiBSZXNlcnZlZCAqLwotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9yZXNlcnZkOwkvKiBSZXNlcnZlZCAqLwotCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX3Jlc3VsdDsJLyogUmVhc29uIGZvciBjYWxsIGZhaWxpbmcKLQkJCQkJCSAgIFplcm8gaXMgR29vZCByZXR1cm4gKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfaW5pdDsJLyogTm9uLVplcm8gaWYgaXQgY2F1c2VkIGFuICAgICAKLQkJCQkJCSAgIHh4aW5pdCBjYWxsLiAqLwotCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2FucG9ydHM7CS8qIE51bWJlciBvZiBhc3luYyBwb3J0cyAgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfc25wb3J0czsgCS8qIE51bWJlciBvZiBzeW5jICBwb3J0cyAqLwotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl90eXBlOwkvKiBCb2FyZCB0eXBlIDEgPSBQQy9YaSwKLQkJCQkJCQkgICAgICAyID0gUEMvWG0sCi0JCQkJCQkJICAgICAgMyA9IFBDL1hlICAKLQkJCQkJCQkgICAgICA0ID0gTUMvWGkgIAotCQkJCQkJCSAgICAgIDUgPSBDT01YL2kgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfY2FyZDsJLyogQ2FyZCBudW1iZXIgKi8KLQkKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSB0byBnZXQgZHJpdmVyIHN0YXR1cyBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkaWdpX2RpbmZvIHsKLQl1bnNpZ25lZCBsb25nCWRpbmZvX25ib2FyZHM7CQkvKiAjIGJvYXJkcyBjb25maWd1cmVkCSovCi0JY2hhcgkJZGluZm9fcmVzZXJ2ZWRbMTJdOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCWNoYXIJCWRpbmZvX3ZlcnNpb25bMTZdOwkvKiBkcml2ZXIgdmVyc2lvbiAgICAgICAqLwotfTsKLQotI2RlZmluZQlESUdJX0dFVERECSgnZCc8PDgpIHwgMjQ4CQkvKiBnZXQgZHJpdmVyIGluZm8gICAgICAqLwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgcGVyLWJvYXJkIGluZm9ybWF0aW9uCi0gKgotICogcGh5c3NpemUgYW5kIG1lbXNpemUgZGlmZmVyIHdoZW4gYm9hcmQgaGFzICJ3aW5kb3dlZCIgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGRpZ2lfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwlpbmZvX2JkbnVtOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9faW9wb3J0OwkJLyogaW8gcG9ydCBhZGRyZXNzICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fcGh5c2FkZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyAgICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19waHlzc2l6ZTsJCS8qIFNpemUgb2YgaG9zdCBtZW0gd2luZG93ICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX21lbXNpemU7CQkvKiBBbW91bnQgb2YgZHVhbC1wb3J0IG1lbSAqLwotCQkJCQkJLyogb24gYm9hcmQgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBzaG9ydAlpbmZvX2JkdHlwZTsJCS8qIEJvYXJkIHR5cGUgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgc2hvcnQJaW5mb19ucG9ydHM7CQkvKiBudW1iZXIgb2YgcG9ydHMgICAgICAgICAqLwotCWNoYXIJCWluZm9fYmRzdGF0ZTsJCS8qIGJvYXJkIHN0YXRlICAgICAgICAgICAgICovCi0JY2hhcgkJaW5mb19yZXNlcnZlZFs3XTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gICAgKi8KLX07Ci0KLSNkZWZpbmUJRElHSV9HRVRCRAkoJ2QnPDw4KSB8IDI0OQkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KLSAKLXN0cnVjdCBkaWdpX3N0YXQgewotCXVuc2lnbmVkIGludAlpbmZvX2NoYW47CQkvKiBDaGFubmVsIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgaW50CWluZm9fYnJkOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fY2ZsYWc7CQkvKiBjZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19pZmxhZzsJCS8qIGlmbGFnIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX29mbGFnOwkJLyogb2ZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fbXN0YXQ7CQkvKiBtc3RhdCBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb190eF9kYXRhOwkJLyogdHhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19yeF9kYXRhOwkJLyogcnhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19oZmxvdzsJCS8qIGhmbG93IGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX3Jlc2VydmVkWzhdOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAgICAqLwotfTsKLQotI2RlZmluZQlESUdJX0dFVFNUQVQJKCdkJzw8OCkgfCAyNDQJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgcGVyLWNoYW5uZWwgaW5mb3JtYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGRpZ2lfY2ggewotCXVuc2lnbmVkIGxvbmcJaW5mb19iZG51bTsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2NoYW5uZWw7CQkvKiBDaGFubmVsIGluZGV4IG51bWJlciAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19jaF9jZmxhZzsJCS8qIENoYW5uZWwgY2ZsYWcgICAJICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fY2hfaWZsYWc7CQkvKiBDaGFubmVsIGlmbGFnICAgCSAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2NoX29mbGFnOwkJLyogQ2hhbm5lbCBvZmxhZyAgIAkgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19jaHNpemU7CQkvKiBDaGFubmVsIHN0cnVjdHVyZSBzaXplICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19zbGVlcF9zdGF0OwkvKiBzbGVlcCBzdGF0dXMJCSAgICovCi0JZGV2X3QJCWluZm9fZGV2OwkJLyogZGV2aWNlIG51bWJlcgkgICAqLwotCXVuc2lnbmVkIGNoYXIJaW5mb19pbml0c3RhdGU7CQkvKiBDaGFubmVsIGluaXQgc3RhdGUJICAgKi8KLQl1bnNpZ25lZCBjaGFyCWluZm9fcnVubmluZzsJCS8qIENoYW5uZWwgcnVubmluZyBzdGF0ZSAgICovCi0JbG9uZwkJcmVzZXJ2ZWRbOF07CQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotfTsKLQotLyoKLSogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB3aXRoIHRoZSBESUdJX0ZFUENNRCBpb2N0bCB0byAKLSogdGVsbCB0aGUgZHJpdmVyIHdoaWNoIHBvcnQgdG8gc2VuZCB0aGUgY29tbWFuZCBmb3IuCi0qLwotc3RydWN0IGRpZ2lfY21kIHsKLQlpbnQJY21kOwotCWludAl3b3JkOwotCWludAluY21kczsKLQlpbnQJY2hhbjsgLyogY2hhbm5lbCBpbmRleCAoemVybyBiYXNlZCkgKi8KLQlpbnQJYmRpZDsgLyogYm9hcmQgaW5kZXggKHplcm8gYmFzZWQpICovCi19OwotCi0vKgotKiAgaW5mb19zbGVlcF9zdGF0IGRlZmluZXMKLSovCi0jZGVmaW5lIElORk9fUlVOV0FJVAkweDAwMDEKLSNkZWZpbmUgSU5GT19XT1BFTgkweDAwMDIKLSNkZWZpbmUgSU5GT19UVElPVwkweDAwMDQKLSNkZWZpbmUgSU5GT19DSF9SV0FJVAkweDAwMDgKLSNkZWZpbmUgSU5GT19DSF9XRU1QVFkJMHgwMDEwCi0jZGVmaW5lIElORk9fQ0hfV0xPVwkweDAwMjAKLSNkZWZpbmUgSU5GT19YWEJVRl9CVVNZIDB4MDA0MAotCi0jZGVmaW5lCURJR0lfR0VUQ0gJKCdkJzw8OCkgfCAyNDUJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCi0KLS8qIEJvYXJkIHR5cGUgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZQlTVUJUWVBFCQkwMDA3Ci0jZGVmaW5lCVRfUENYSQkJMDAwMAotI2RlZmluZSBUX1BDWE0JCTAwMDEKLSNkZWZpbmUgVF9QQ1hFCQkwMDAyCi0jZGVmaW5lIFRfUENYUgkJMDAwMwotI2RlZmluZSBUX1NQCQkwMDA0Ci0jZGVmaW5lIFRfU1BfUExVUwkwMDA1Ci0jCWRlZmluZSBUX0hFUkMJMDAwMAotIwlkZWZpbmUgVF9IT1UJMDAwMQotIwlkZWZpbmUgVF9MT04JMDAwMgotIwlkZWZpbmUgVF9DSEEJMDAwMwotI2RlZmluZSBGQU1JTFkJCTAwNzAKLSNkZWZpbmUgVF9DT01YSQkJMDAwMAotI2RlZmluZSBUX1BDWFgJCTAwMTAKLSNkZWZpbmUgVF9DWAkJMDAyMAotI2RlZmluZSBUX0VQQwkJMDAzMAotI2RlZmluZQlUX1BDTElURQkwMDQwCi0jZGVmaW5lCVRfU1BYWAkJMDA1MAotI2RlZmluZQlUX0FWWFgJCTAwNjAKLSNkZWZpbmUgVF9EWEIJCTAwNzAKLSNkZWZpbmUgVF9BMktfNF84CTAwNzAKLSNkZWZpbmUgQlVTVFlQRQkJMDcwMAotI2RlZmluZSBUX0lTQUJVUwkwMDAwCi0jZGVmaW5lIFRfTUNCVVMJCTAxMDAKLSNkZWZpbmUJVF9FSVNBQlVTCTAyMDAKLSNkZWZpbmUJVF9QQ0lCVVMJMDQwMAotCi0vKiBCb2FyZCBTdGF0ZSBEZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lCUJEX1JVTk5JTkcJMHgwCi0jZGVmaW5lCUJEX1JFQVNPTgkweDdmCi0jZGVmaW5lCUJEX05PVEZPVU5ECTB4MQotI2RlZmluZQlCRF9OT0lPUE9SVAkweDIKLSNkZWZpbmUJQkRfTk9NRU0JMHgzCi0jZGVmaW5lCUJEX05PQklPUwkweDQKLSNkZWZpbmUJQkRfTk9GRVAJMHg1Ci0jZGVmaW5lCUJEX0ZBSUxFRAkweDYKLSNkZWZpbmUgQkRfQUxMT0NBVEVECTB4NwotI2RlZmluZSBCRF9UUklCT09UCTB4OAotI2RlZmluZQlCRF9CQURLTUUJMHg4MAotCi0jZGVmaW5lIERJR0lfTE9PUEJBQ0sJICAgICAgKCdkJzw8OCkgfCAyNTIJCS8qIEVuYWJsZS9kaXNhYmxlIFVBUlQgaW50ZXJuYWwgbG9vcGJhY2sgKi8KLSNkZWZpbmUgRElHSV9TUE9MTCAgICAgICAgICAgICgnZCc8PDgpIHwgMjU0CQkvKiBjaGFuZ2UgcG9sbGVyIHJhdGUgICAqLwotCi0jZGVmaW5lIERJR0lfU0VUQ1VTVE9NQkFVRAlfSU9XKCdlJywgMTA2LCBpbnQpCS8qIFNldCBpbnRlZ2VyIGJhdWQgcmF0ZSAqLwotI2RlZmluZSBESUdJX0dFVENVU1RPTUJBVUQJX0lPUignZScsIDEwNywgaW50KQkvKiBHZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KLSNkZWZpbmUgRElHSV9SRVNFVF9QT1JUCQkoJ2UnPDw4KSB8IDkzCQkvKiBSZXNldCBwb3J0CQkqLwotCi0jZW5kaWYgLyogRElHSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kb3dubGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2Rvd25sZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRhYTJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2Rvd25sZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICRJZDogZG93bmxkLmMsdiAxLjYgMjAwOS8wMS8xNCAxNDoxMDo1NCBtYXJraCBFeHAgJAotICovCi0KLS8qCi0qKiBkb3dubGQuYwotKioKLSoqICBUaGlzIGlzIHRoZSBkYWVtb24gdGhhdCBzZW5kcyB0aGUgZmVwLCBiaW9zLCBhbmQgY29uY2VudHJhdG9yIGltYWdlcwotKiogIGZyb20gdXNlciBzcGFjZSB0byB0aGUgZHJpdmVyLgotKiogQlVHUzoKLSoqICBJZiB0aGUgZmlsZSBjaGFuZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGRvd25sb2FkLCB5b3UgcHJvYmFibHkKLSoqICAgICB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgotKioKLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZXJybm8uaD4KLQotI2luY2x1ZGUgImRnYXBfdHlwZXMuaCIKLSNpbmNsdWRlICJkaWdpLmgiCi0jaW5jbHVkZSAiZGdhcF9mZXA1LmgiCi0KLSNpbmNsdWRlICJkZ2FwX2Rvd25sZC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLWNoYXIJCSpwZ207Ci12b2lkCQlteXBlcnJvcigpOwotCi0vKgotKiogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgZGlmZmVyZW50IGltYWdlcyBhdmFpbGFibGUKLSoqICB0byBnaXZlIHRvIHRoZSBkcml2ZXIuICBJdCBpcyBhcnJhbmdlZCBzbyB0aGF0IHRoZSB0aGluZ3MgdGhhdCBhcmUKLSoqICBjb25zdGFudHMgb3IgdGhhdCBoYXZlIGRlZmF1bHRzIGFyZSBmaXJzdCBpbnRoZSBzdHJ1Y3V0cmUgdG8gc2ltcGxpZnkKLSoqICB0aGUgdGFibGUgb2YgaW5pdGlhbGl6ZXJzLgotKi8KLXN0cnVjdCBpbWFnZV9pbmZvIHsKLQlzaG9ydAl0eXBlOwkJLyogYmlvcywgZmVwLCBjb25jICovCi0Jc2hvcnQJZmFtaWx5OwkJLyogYm9hcmRzIHRoaXMgYXBwbGllcyB0byAqLwotCXNob3J0CXN1YnR5cGU7CS8qIHN1YnR5cGUgKi8KLQlpbnQJbGVuOwkJLyogc2l6ZSBvZiBpbWFnZSAqLwotCWNoYXIJKmltYWdlOwkJLyogaW9jdGwgc3RydWN0ICsgaW1hZ2UgKi8KLQljaGFyCSpuYW1lOwotCWNoYXIJKmZuYW1lOwkJLyogZmlsZW5hbWUgb2YgYmluYXJ5IChpLmUuICJhc2ZlcC5iaW4iKSAqLwotCWNoYXIJKnBhdGhuYW1lOwkvKiBwYXRobmFtZSB0byB0aGlzIGJpbmFyeSAoIi9ldGMvZGdhcC94cmZlcC5iaW4iKTsgKi8KLQl0aW1lX3QJbXRpbWU7CQkvKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lICovCi19OwotCi0jZGVmaW5lIElCSU9TCTAKLSNkZWZpbmUJSUZFUAkxCi0jZGVmaW5lCUlDT05DCTIKLSNkZWZpbmUgSUNPTkZJRwkzCi0jZGVmaW5lCUlCQUQJNAotCi0jZGVmaW5lIERFRkFVTFRfTE9DICIvbGliL2Zpcm13YXJlL2RnYXAvIgotCi1zdHJ1Y3QgaW1hZ2VfaW5mbwkqaW1hZ2VfbGlzdDsKLWludAkJCW5pbWFnZXMsIGNvdW50OwotCi1zdHJ1Y3QgaW1hZ2VfaW5mbyBpbWFnZXNbXSA9IHsKLXtJQklPUywgVF9FUEMsICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkVQQy9YIiwJImZ4Ymlvcy5iaW4iLCBERUZBVUxUX0xPQyAiZnhiaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9FUEMsICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkVQQy9YIiwJImZ4ZmVwLmJpbiIsIERFRkFVTFRfTE9DICJmeGZlcC5iaW4iLCAwIH0sCi17SUNPTkMsIFRfRVBDLCAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJFUEMvWCIsCSJmeGNvbi5iaW4iLCBERUZBVUxUX0xPQyAiZnhjb24uYmluIiwgMCB9LAotCi17SUJJT1MsIFRfQ1gsICAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJDL1giLAkiY3hiaW9zLmJpbiIsIERFRkFVTFRfTE9DICJjeGJpb3MuYmluIiwgMCB9LAote0lGRVAsICBUX0NYLCAgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiQy9YIiwJImN4aG9zdC5iaW4iLCBERUZBVUxUX0xPQyAiY3hob3N0LmJpbiIsIDAgfSwKLQote0lCSU9TLCBUX0NYLCAgICAgICBUX1BDSUJVUywgMCwgTlVMTCwgIkMvWCBQQ0kiLCAiY3hwYmlvcy5iaW4iLCBERUZBVUxUX0xPQyAiY3hwYmlvcy5iaW4iLCAwIH0sCi17SUZFUCwgIFRfQ1gsICAgICAgIFRfUENJQlVTLCAwLCBOVUxMLCAiQy9YIFBDSSIsICJjeHBmZXAuYmluIiwgREVGQVVMVF9MT0MgImN4cGZlcC5iaW4iLCAwIH0sCi0KLXtJQ09OQywgVF9DWCwgICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkMvWCIsCSJjeGNvbi5iaW4iLCBERUZBVUxUX0xPQyAiY3hjb24uYmluIiwgMCB9LAote0lDT05DLCBUX0NYLCAgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiQy9YIiwJImlibWN4Y29uLmJpbiIsIERFRkFVTFRfTE9DICJpYm1jeGNvbi5iaW4iLCAwIH0sCi17SUNPTkMsIFRfQ1gsICAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJDL1giLAkiaWJtZW5jb24uYmluIiwgREVGQVVMVF9MT0MgImlibWVuY29uLmJpbiIsIDAgfSwKLQote0lCSU9TLCBGQU1JTFksICAgVF9QQ1hSLCAwLCBOVUxMLCAiUENYUiIsCSJ4cmJpb3MuYmluIiwgREVGQVVMVF9MT0MgInhyYmlvcy5iaW4iLCAwIH0sCi17SUZFUCwgIEZBTUlMWSwgICBUX1BDWFIsIDAsICBOVUxMLCAgIlBDWFIiLAkieHJmZXAuYmluIiwgREVGQVVMVF9MT0MgInhyZmVwLmJpbiIsIDAgIH0sCi0KLXtJQklPUywgVF9QQ0xJVEUsICAgU1VCVFlQRSwgMCwgTlVMTCwgIlgvZW0iLAkic3hiaW9zLmJpbiIsIERFRkFVTFRfTE9DICJzeGJpb3MuYmluIiwgMCB9LAote0lGRVAsICBUX1BDTElURSwgICBTVUJUWVBFLCAwLCAgTlVMTCwgICJYL2VtIiwJInN4ZmVwLmJpbiIsIERFRkFVTFRfTE9DICJzeGZlcC5iaW4iLCAwICB9LAotCi17SUJJT1MsIFRfRVBDLCAgICAgIFRfUENJQlVTLCAwLCBOVUxMLCAiUENJIiwJInBjaWJpb3MuYmluIiwgREVGQVVMVF9MT0MgInBjaWJpb3MuYmluIiwgMCB9LAote0lGRVAsICBUX0VQQywgICAgICBUX1BDSUJVUywgMCwgTlVMTCwgIlBDSSIsCSJwY2lmZXAuYmluIiwgREVGQVVMVF9MT0MgInBjaWZlcC5iaW4iLCAwIH0sCi17SUNPTkZJRywgMCwJICAgIDAsIDAsIE5VTEwsICAgICAgICAgTlVMTCwJImRnYXAuY29uZiIsCSIvZXRjL2RnYXAuY29uZiIsIDAgfSwKLQotLyogSUJBRC9OVUxMIGVudHJ5IGluZGljYXRpbmcgZW5kLW9mLXRhYmxlICovCi0KLXtJQkFELCAgMCwgICAgIDAsIDAsICBOVUxMLCAgTlVMTCwgTlVMTCwgTlVMTCwgMCB9Ci0KLX0gOwotCi1pbnQgCWVycm9ycHJpbnQgPSAxOwotaW50IAlub2RsZHByaW50ID0gMTsKLWludAlkZWJ1Z2ZsYWc7Ci1pbnQgCWZkOwotCi1zdHJ1Y3QgZG93bmxkX3QgKmlwOwkvKiBJbWFnZSBwb2ludGVyIGluIGN1cnJlbnQgaW1hZ2UgICovCi1zdHJ1Y3QgZG93bmxkX3QgKmRwOyAJLyogY29uYy4gZG93bmxvYWQgKi8KLQotCi0vKgotICogVGhlIHNhbWUgZm9yIGVpdGhlciB0aGUgRkVQIG9yIHRoZSBCSU9TLgotICogIEFwcGVuZCB0aGUgZG93bmxkaW8gaGVhZGVyLCBpc3N1ZSB0aGUgaW9jdGwsIHRoZW4gZnJlZQotICogIHRoZSBidWZmZXIuICBOb3QgaG9ycmlibHkgQ1BVIGVmZmljaWVudCwgYnV0IHF1aXRlIFJBTSBlZmZpY2llbnQuCi0gKi8KLQotdm9pZCBzcXVpcnQoaW50IHJlcV90eXBlLCBpbnQgYmRpZCwgc3RydWN0IGltYWdlX2luZm8gKmlpKQotewotCXN0cnVjdCBkb3dubGRpbwkqZGxpb3A7Ci0JaW50IHNpemVfYnVmOwotCWludCBzZmQ7Ci0Jc3RydWN0IHN0YXQgc2I7Ci0KLQkvKgotCSAqIElmIHRoaXMgYmluYXJ5IGNvbWVzIGZyb20gYSBmaWxlLCBzdGF0IGl0IHRvIHNlZSBob3cKLQkgKiBsYXJnZSBpdCBpcy4gWWVzLCB3ZSBpbnRlbnRpb25hbGx5IGRvIHRoaXMgZWFjaAotCSAqIHRpbWUgZm9yIHRoZSBiaW5hcnkgbWF5IGNoYW5nZSBiZXR3ZWVuIGxvYWRzLgotCSAqLwotCi0JaWYgKGlpLT5wYXRobmFtZSkgewotCQlzZmQgPSBvcGVuKGlpLT5wYXRobmFtZSwgT19SRE9OTFkpOwotCi0JCWlmIChzZmQgPCAwICkgewotCQkJbXlwZXJyb3IoaWktPnBhdGhuYW1lKTsKLQkJCWdvdG8gc3F1aXJ0X2VuZDsKLQkJfQotCi0JCWlmIChmc3RhdChzZmQsICZzYikgPT0gLTEgKSB7Ci0JCQlteXBlcnJvcihpaS0+cGF0aG5hbWUpOwotCQkJZ290byBzcXVpcnRfZW5kOwotCQl9Ci0KLQkJaWktPmxlbiA9IHNiLnN0X3NpemU7Ci0JfQotCi0Jc2l6ZV9idWYgPSBpaS0+bGVuICsgc2l6ZW9mKHN0cnVjdCBkb3dubGRpbyk7Ci0KLQkvKgotCSAqIFRoaXMgYnVmZmVyIHdpbGwgYmUgZnJlZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMKLQkgKiBub3QgcmVzaWxpZW50IGFuZCBzaG91bGQgYmUgYXJvdW5kIG9ubHkgbG9uZyBlbm91Z2ggZm9yIHRoZSBkL2wKLQkgKiB0byBoYXBwZW4uCi0JICovCi0JZGxpb3AgPSAoc3RydWN0IGRvd25sZGlvICopIG1hbGxvYyhzaXplX2J1Zik7Ci0KLQlpZiAoZGxpb3AgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwiJXM6IGNhbid0IGdldCAlZCBieXRlcyBvZiBtZW1vcnk7IGFib3J0aW5nXG4iLAotCQkJcGdtLCBzaXplX2J1Zik7Ci0JCWV4aXQgKDEpOwotCX0KLQotCS8qIE5vdywgc3RpY2sgdGhlIGltYWdlIGluIGZlcGltYWdlLiAgVGhpcyBjYW4gY29tZSBmcm9tIGVpdGhlcgotCSAqICB0aGUgY29tcGlsZWQtaW4gaW1hZ2Ugb3IgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQkgKi8KLQlpZiAoaWktPnBhdGhuYW1lKQotCQlyZWFkKHNmZCwgZGxpb3AtPmltYWdlLmZpLmZlcGltYWdlLCBpaS0+bGVuKTsKLQllbHNlCi0JCW1lbWNweShkbGlvcCAtPmltYWdlLmZpLmZlcGltYWdlLCBpaS0+aW1hZ2UsIGlpLT5sZW4pOwotCi0JZGxpb3AtPnJlcV90eXBlID0gcmVxX3R5cGU7Ci0JZGxpb3AtPmJkaWQgPSBiZGlkOwotCi0JZGxpb3AtPmltYWdlLmZpLmxlbiA9IGlpLT5sZW47Ci0KLQlpZiAoZGVidWdmbGFnKQotCQlwcmludGYoInNlbmRpbmcgJWQgYnl0ZXMgb2YgJXMgJXMgZnJvbSAlc1xuIiwKLQkJCWlpLT5sZW4sCi0JCQkoaWktPnR5cGUgPT0gSUZFUCkgPyAiRkVQIiA6IChpaS0+dHlwZSA9PSBJQklPUykgPyAiQklPUyIgOiAiQ09ORklHIiwKLQkJCWlpLT5uYW1lID8gaWktPm5hbWUgOiAiIiwKLQkJCShpaS0+cGF0aG5hbWUpID8gaWktPnBhdGhuYW1lIDogImludGVybmFsIGltYWdlIiApOwotCi0JaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgKGNoYXIgKikgZGxpb3ApID09IC0xKSB7Ci0JCWlmKGVycm9ycHJpbnQpIHsKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSIlczogd2FybmluZyAtIGRvd25sb2FkIGlvY3RsIGZhaWxlZFxuIixwZ20pOwotCQkJZXJyb3JwcmludCA9IDA7Ci0JCX0KLQkJc2xlZXAoMik7Ci0JfQotCi1zcXVpcnRfZW5kOgotCi0JaWYgKGlpLT5wYXRobmFtZSkgewotCQljbG9zZShzZmQpOwotCX0KLQlmcmVlKGRsaW9wKTsKLX0KLQotCi0vKgotICogIFNlZSBpZiB3ZSBuZWVkIHRvIHJlbG9hZCB0aGUgZG93bmxvYWQgaW1hZ2UgaW4gY29yZQotICoKLSAqLwotdm9pZCBjb25zaWRlcl9maWxlX3Jlc2NhbihzdHJ1Y3QgaW1hZ2VfaW5mbyAqaWkpCi17Ci0JaW50IHNmZDsKLQlpbnQgbGVuOwotCXN0cnVjdCBzdGF0IAlzYjsKLQotCS8qIFRoaXMgb3BlcmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB3ZSdyZSB3b3JraW5nIGZyb20gYSBmaWxlICovCi0KLQlpZiAoaWktPnBhdGhuYW1lKSB7Ci0KLQkJc2ZkID0gb3BlbiAoaWktPnBhdGhuYW1lLCBPX1JET05MWSkgOwotCQlpZiAoc2ZkIDwgMCApIHsKLQkJCW15cGVycm9yKGlpLT5wYXRobmFtZSk7Ci0JCQlleGl0KDEpIDsKLQkJfQotCi0JCWlmKCBmc3RhdChzZmQsJnNiKSA9PSAtMSApIHsKLQkJCW15cGVycm9yKGlpLT5wYXRobmFtZSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLQkJLyogSWYgdGhlIGZpbGUgaGFzbid0IGNoYW5nZWQgc2luY2Ugd2UgbGFzdCBkaWQgdGhpcywKLQkJICogYW5kIHdlIGhhdmUgbm90IGRvbmUgYSBmcmVlKCkgb24gdGhlIGltYWdlLCBiYWlsCi0JCSAqLwotCQlpZiAoaWktPmltYWdlICYmIChzYi5zdF9tdGltZSA9PSBpaS0+bXRpbWUpKQotCQkJZ290byBlbmRfcmVzY2FuOwotCi0JCWlpLT5sZW4gPSBsZW4gPSBzYi5zdF9zaXplOwotCi0JCS8qIFJlY29yZCB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaWxlICovCi0JCWlpLT5tdGltZSA9IHNiLnN0X210aW1lOwotCi0JCS8qIGltYWdlIHNob3VsZCBiZSBOVUxMIHVubGVzcyB0aGVyZSBpcyBhbiBpbWFnZSBtYWxsb2NlZAotCQkgKiBpbiBhbHJlYWR5LiAgQmVmb3JlIHdlIG1hbGxvYyBhZ2FpbiwgbWFrZSBzdXJlIHdlIGRvbid0Ci0JCSAqIGhhdmUgYSBtZW1vcnkgbGVhay4KLQkJICovCi0JCWlmICggaWktPmltYWdlICkgewotCQkJZnJlZSggaWktPmltYWdlICk7Ci0JCQkvKiBpaS0+aW1hZ2UgPSBOVUxMOyAqLyAvKiBub3QgbmVjZXNzYXJ5ICovCi0JCX0KLQotCQkvKiBUaGlzIGltYWdlIHdpbGwgYmUga2VwdCBvbmx5IGxvbmcgZW5vdWdoIGZvciB0aGUKLQkJICogZG93bmxvYWQgdG8gaGFwcGVuLiAgQWZ0ZXIgc2VuZGluZyB0aGUgbGFzdCBibG9jaywKLQkJICogaXQgd2lsbCBiZSBmcmVlZAotCQkgKi8KLQkJaWktPmltYWdlID0gbWFsbG9jKGxlbikgOwotCi0JCWlmIChpaS0+aW1hZ2UgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIiVzOiBjYW4ndCBnZXQgJWQgYnl0ZXMgb2YgbWVtb3J5OyBhYm9ydGluZ1xuIiwKLQkJCQkgcGdtLCBsZW4pOwotCQkJZXhpdCAoMSk7Ci0JCX0KLQotCQlpZiAocmVhZChzZmQsIGlpLT5pbWFnZSwgbGVuKSA8IGxlbikgewotCQkJZnByaW50ZihzdGRlcnIsIiVzOiByZWFkIGVycm9yIG9uICVzOyBhYm9ydGluZ1xuIiwKLQkJCQlwZ20sIGlpLT5wYXRobmFtZSk7Ci0JCQlleGl0ICgxKTsKLQkJfQotCi1lbmRfcmVzY2FuOgotCQljbG9zZShzZmQpOwotCi0JfQotfQotCi0vKgotICogU2NhbiBmb3IgaW1hZ2VzIHRvIG1hdGNoIHRoZSBkcml2ZXIgcmVxdWVzdHMKLSAqLwotCi1zdHJ1Y3QgaW1hZ2VfaW5mbyAqIGZpbmRfY29uY19pbWFnZSgpCi17Ci0JaW50IHg7Ci0Jc3RydWN0IGltYWdlX2luZm8gKmkgPSBOVUxMOwotCi0JZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCWk9JmltYWdlX2xpc3RbeF07Ci0KLQkJaWYoaS0+dHlwZSAhPSBJQ09OQykKLQkJCWNvbnRpbnVlOwotCi0JCWNvbnNpZGVyX2ZpbGVfcmVzY2FuKGkpIDsKLQotCQlpcCA9IChzdHJ1Y3QgZG93bmxkX3QgKikgaW1hZ2VfbGlzdFt4XS5pbWFnZTsKLQkJaWYgKGlwID09IE5VTEwpIGNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIFdoZW4gSSByZW1vdmVkIENsdXN0ZXJwb3J0LCBJIGtlcHQgb25seSB0aGUgY29kZSB0aGF0IEkKLQkJICogd2FzIFNVUkUgd2Fzbid0IENsdXN0ZXJQb3J0LiAgV2UgbWF5IG5vdCBuZWVkIHRoZSBuZXh0IHR3bwotCQkgKiBsaW5lcyBvZiBjb2RlLgotCQkgKi8KLQkJaWYgKChkcC0+ZGxfdHlwZSAhPSAnUCcgKSAmJiAoIGlwLT5kbF9zcmV2ID09IGRwLT5kbF9zcmV2ICkpCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCXN0cnVjdCBkb3dubGRpbwlkbGlvOwotCWludCAJCW9mZnNldCwgYnNpemU7Ci0JaW50IAkJeDsKLQljaGFyIAkJKmRvd24sICppbWFnZSwgKmZuYW1lOwotCXN0cnVjdCBpbWFnZV9pbmZvICppaTsKLQotCXBnbSA9IGFyZ3ZbMF07Ci0JZHAgPSAmZGxpby5pbWFnZS5kbDsJCS8qIGNvbmMuIGRvd25sb2FkICovCi0KLQl3aGlsZSgoYXJnYyA+IDIpICYmICFzdHJjbXAoYXJndlsxXSwiLWQiKSkgewotCQlkZWJ1Z2ZsYWcrKyA7Ci0JCWFyZ2MtLSA7Ci0JCWFyZ3YrKyA7Ci0JfQotCi0JaWYoYXJnYyA8IDIpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkidXNhZ2U6ICVzIGRvd25sb2FkLWRldmljZSBbaW1hZ2UtZmlsZV0gLi4uXG4iLAotCQkJcGdtKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQotCi0JLyoKLQkgKiBEYWVtb25pemUsIHVubGVzcyBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLgotCSAqLwotCWlmIChkZWJ1Z2ZsYWcgPT0gMCkgewotCQlzd2l0Y2ggKGZvcmsoKSkKLQkJewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQotCQljYXNlIC0xOgotCQkJcmV0dXJuIDE7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJc2V0c2lkKCk7Ci0KLQkJLyoKLQkJICogVGhlIGNoaWxkIG5vIGxvbmdlciBuZWVkcyAic3RkaW4iLCAic3Rkb3V0Iiwgb3IgInN0ZGVyciIsCi0JCSAqIGFuZCBzaG91bGQgbm90IGJsb2NrIHByb2Nlc3NlcyB3YWl0aW5nIGZvciB0aGVtIHRvIGNsb3NlLgotCQkgKi8KLQkJZmNsb3NlKHN0ZGluKTsKLQkJZmNsb3NlKHN0ZG91dCk7Ci0JCWZjbG9zZShzdGRlcnIpOwotCi0JfQotCi0Jd2hpbGUgKDEpIHsKLQkJaWYoIChmZCA9IG9wZW4oYXJndlsxXSwgT19SRFdSKSkgPT0gLTEgKSB7Ci0JCQlzbGVlcCgxKTsKLQkJfQotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0KLQkvKgotCSoqIGNyZWF0ZSBhIGxpc3Qgb2YgaW1hZ2VzIHRvIHNlYXJjaCB0aHJvdWdoIHdoZW4gdHJ5aW5nIHRvIG1hdGNoCi0JKiogcmVxdWVzdHMgZnJvbSB0aGUgZHJpdmVyLiAgUHV0IGltYWdlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW4KLQkqKiB0aGUgbGlzdCBiZWZvcmUgYnVpbHQgaW4gaW1hZ2VzIHNvIHRoYXQgdGhlIGNvbW1hbmQgbGluZSBpbWFnZXMKLQkqKiBjYW4gb3ZlcnJpZGUgdGhlIGJ1aWx0IGluIG9uZXMuCi0JKi8KLQotCS8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbGlzdCAqLwotCi0JbmltYWdlcyA9IGFyZ2MgLSAyOwotCi0JLyogY291bnQgdGhlIG51bWJlciBvZiBkZWZhdWx0IGxpc3QgZW50cmllcyAqLwotCi0JZm9yIChjb3VudCA9IDA7IGltYWdlc1tjb3VudF0udHlwZSAhPSBJQkFEOyArK2NvdW50KSA7Ci0KLQluaW1hZ2VzICs9IGNvdW50OwotCi0JLyogUmVhbGx5IHNob3VsZCBqdXN0IHJlbW92ZSB0aGUgdmFyaWFibGUgImltYWdlX2xpc3QiLi4uLiByb2JlcnRsICovCi0JaW1hZ2VfbGlzdCA9IGltYWdlczsKLQotCS8qIGdldCB0aGUgaW1hZ2VzIGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLwotCWZvcih4ID0gMjsgeCA8IGFyZ2M7IHgrKykgewotCQlpbnQgeHg7Ci0KLQkJLyoKLQkJICogc3RyaXAgb2ZmIGFueSBsZWFkaW5nIHBhdGggaW5mb3JtYXRpb24gZm9yCi0JCSAqIGRldGVybWluaW5nIGZpbGUgdHlwZQotCQkgKi8KLQkJaWYoIChmbmFtZSA9IHN0cnJjaHIoYXJndlt4XSwnLycpKSA9PSBOVUxMKQotCQkJZm5hbWUgPSBhcmd2W3hdOwotCQllbHNlCi0JCQlmbmFtZSsrOwkvKiBza2lwIHRoZSBzbGFzaCAqLwotCi0JCWZvciAoeHggPSAwOyB4eCA8IGNvdW50OyB4eCsrKSB7Ci0JCQlpZiAoc3RyY21wKGZuYW1lLCBpbWFnZXNbeHhdLmZuYW1lKSA9PSAwICkgewotCQkJCWltYWdlc1t4eF0ucGF0aG5hbWUgPSBhcmd2W3hdOwotCi0JCQkJLyogaW1hZ2Ugc2hvdWxkIGJlIE5VTEwgdW50aWwgKi8KLQkJCQkvKiBzcGFjZSBpcyBtYWxsb2NlZCAqLwotCQkJCWltYWdlc1t4eF0uaW1hZ2UgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQotCi0gICAgICAgIHNsZWVwKDMpOwotCi0JLyoKLQkqKiBFbmRsZXNzIGxvb3A6IGdldCBhIHJlcXVlc3QgZnJvbSB0aGUgZmVwLCBhbmQgc2VydmljZSB0aGF0IHJlcXVlc3QuCi0JKi8KLQlmb3IoOzspIHsKLQkJLyogZ2V0IHRoZSByZXF1ZXN0ICovCi0JCWlmIChkZWJ1Z2ZsYWcpCi0JCQlwcmludGYoImI0IGdldCBpb2N0bC4uLiIpOwotCi0JCWlmIChpb2N0bChmZCxESUdJX0RMUkVRX0dFVCwgJmRsaW8pID09IC0xICkgewotCQkJaWYgKGVycm9ycHJpbnQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQlwZ20pOwotCQkJCWVycm9ycHJpbnQgPSAwOwotCQkJfQotCQkJc2xlZXAoMik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVidWdmbGFnKQotCQkJCXByaW50ZigiZGxpby5yZXFfdHlwZSBpcyAlZCBiZCAlZFxuIiwKLQkJCQkJZGxpby5yZXFfdHlwZSxkbGlvLmJkaWQpOwotCi0JCQlzd2l0Y2goZGxpby5yZXFfdHlwZSkgewotCQkJY2FzZSBETFJFUV9CSU9TOgotCQkJCS8qCi0JCQkJKiogZmluZCB0aGUgYmlvcyBpbWFnZSBmb3IgdGhpcyB0eXBlCi0JCQkJKi8KLQkJCQlmb3IgKCB4ID0gMDsgeCA8IG5pbWFnZXM7IHgrKyApIHsKLQkJCQkJaWYoaW1hZ2VfbGlzdFt4XS50eXBlICE9IElCSU9TKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBGQU1JTFkpID09Ci0JCQkJCQlpbWFnZV9saXN0W3hdLmZhbWlseSkgewotCi0JCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uZmFtaWx5ID09IFRfQ1ggICApIHsKLQkJCQkJCQlpZiAoKGRsaW8uaW1hZ2UuZmkudHlwZSAmIEJVU1RZUEUpCi0JCQkJCQkJCT09IFRfUENJQlVTICkgewotCQkJCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZQotCQkJCQkJCQkJPT0gVF9QQ0lCVVMgKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICggaW1hZ2VfbGlzdFt4XS5mYW1pbHkgPT0gVF9FUEMgKSB7Ci0JCQkJCQkvKiBJZiBzdWJ0eXBlIG9mIGltYWdlIGlzIFRfUENJQlVTLCBpdCBpcyAqLwotCQkJCQkJLyogYSBQQ0kgRVBDIGltYWdlLCBzbyB0aGUgYm9hcmQgbXVzdCAqLwotCQkJCQkJLyogaGF2ZSBidXMgdHlwZSBUX1BDSUJVUyB0byBtYXRjaCAqLwotCQkJCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgQlVTVFlQRSkKLQkJCQkJCQkJPT0gVF9QQ0lCVVMgKSB7Ci0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQk9PSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogTk9OIFBDSSBFUEMgZG9lc24ndCB1c2UgUENJIGltYWdlICovCi0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQkhPSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKGRsaW8uaW1hZ2UuZmkudHlwZSAmIFNVQlRZUEUpID09IGltYWdlX2xpc3RbeF0uc3VidHlwZSkgewotCQkJCQkJLyogUENYUiBib2FyZCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBoZXJlICovCi0JCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZSA9PSBUX1BDWFIgICApIHsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCB4ID49IG5pbWFnZXMpIHsKLQkJCQkJLyoKLQkJCQkJKiogbm8gdmFsaWQgaW1hZ2VzIGV4aXN0Ci0JCQkJCSovCi0JCQkJCWlmKG5vZGxkcHJpbnQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW5ub3QgZmluZCBjb3JyZWN0IEJJT1MgaW1hZ2VcbiIsCi0JCQkJCQkJcGdtKTsKLQkJCQkJCW5vZGxkcHJpbnQgPSAwOwotCQkJCQl9Ci0JCQkJCWRsaW8uaW1hZ2UuZmkudHlwZSA9IC0xOwotCQkJCQlpZiAoaW9jdGwoZmQsIERJR0lfRExSRVFfU0VULCAmZGxpbykgPT0gLTEpIHsKLQkJCQkJCWlmIChlcnJvcnByaW50KSB7Ci0JCQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCXBnbSk7Ci0JCQkJCQkJZXJyb3JwcmludCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCQlzbGVlcCgyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJc3F1aXJ0KGRsaW8ucmVxX3R5cGUsIGRsaW8uYmRpZCwgJmltYWdlX2xpc3RbeF0pOwotCQkJCWJyZWFrIDsKLQotCQkJY2FzZSBETFJFUV9GRVA6Ci0JCQkJLyoKLQkJCQkqKiBmaW5kIHRoZSBmZXAgaW1hZ2UgZm9yIHRoaXMgdHlwZQotCQkJCSovCi0JCQkJZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJRkVQKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmKCAoZGxpby5pbWFnZS5maS50eXBlICYgRkFNSUxZKSA9PQotCQkJCQkJaW1hZ2VfbGlzdFt4XS5mYW1pbHkgKSB7Ci0JCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uZmFtaWx5ID09IFRfQ1ggICApIHsKLQkJCQkJCQkvKiBDL1ggUENJIGJvYXJkICovCi0JCQkJCQkJaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBCVVNUWVBFKQotCQkJCQkJCQk9PSBUX1BDSUJVUyApIHsKLQkJCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUKLQkJCQkJCQkJCT09IFRfUENJQlVTICkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkvKiBSZWd1bGFyIENYICovCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCBpbWFnZV9saXN0W3hdLmZhbWlseSA9PSBUX0VQQyAgICkgIHsKLQkJCQkJCS8qIElmIHN1YnR5cGUgb2YgaW1hZ2UgaXMgVF9QQ0lCVVMsIGl0IGlzICovCi0JCQkJCQkvKiBhIFBDSSBFUEMgaW1hZ2UsIHNvIHRoZSBib2FyZCBtdXN0ICovCi0JCQkJCQkvKiBoYXZlIGJ1cyB0eXBlIFRfUENJQlVTIHRvIG1hdGNoICovCi0JCQkJCQkJaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBCVVNUWVBFKQotCQkJCQkJCQk9PSBUX1BDSUJVUyApIHsKLQkJCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUKLQkJCQkJCQkJCT09IFRfUENJQlVTICkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkvKiBOT04gUENJIEVQQyBkb2Vzbid0IHVzZSBQQ0kgaW1hZ2UgKi8KLQkJCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUKLQkJCQkJCQkJCSE9IFRfUENJQlVTICkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoZGxpby5pbWFnZS5maS50eXBlICYgU1VCVFlQRSkgPT0gaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlKSB7Ci0JCQkJCQkvKiBQQ1hSIGJvYXJkIHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wIGhlcmUgKi8KLQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlID09IFRfUENYUiAgICkgewotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIHggPj0gbmltYWdlcykgewotCQkJCQkvKgotCQkJCQkqKiBubyB2YWxpZCBpbWFnZXMgZXhpc3QKLQkJCQkJKi8KLQkJCQkJaWYobm9kbGRwcmludCkgewotCQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiJXM6IGNhbm5vdCBmaW5kIGNvcnJlY3QgRkVQIGltYWdlXG4iLAotCQkJCQkJCXBnbSk7Ci0JCQkJCQlub2RsZHByaW50ID0gMDsKLQkJCQkJfQotCQkJCQlkbGlvLmltYWdlLmZpLnR5cGU9LTE7Ci0JCQkJCWlmKCBpb2N0bChmZCxESUdJX0RMUkVRX1NFVCwmZGxpbykgPT0gLTEgKSB7Ci0JCQkJCQlpZihlcnJvcnByaW50KSB7Ci0JCQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiJXM6IHdhcm5pbmcgLSBkb3dubG9hZCBpb2N0bCBmYWlsZWRcbiIsCi0JCQkJCQkJCXBnbSk7Ci0JCQkJCQkJZXJyb3JwcmludD0wOwotCQkJCQkJfQotCQkJCQkJc2xlZXAoMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXNxdWlydChkbGlvLnJlcV90eXBlLCBkbGlvLmJkaWQsICZpbWFnZV9saXN0W3hdKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBETFJFUV9ERVZDUkVBVEU6Ci0JCQkJewotCQkJCQljaGFyIHN0cmluZ1sxMDI0XTsKLSNpZiAwCi0JCQkJCXNwcmludGYoc3RyaW5nLCAiJXMgL3Byb2MvZGdhcC8lZC9ta25vZCIsIERFRlNIRUxMLCBkbGlvLmJkaWQpOwotI2VuZGlmCi0JCQkJCXNwcmludGYoc3RyaW5nLCAiJXMgL3Vzci9zYmluL2RnYXBfdXBkYXRlZGV2cyAlZCIsIERFRlNIRUxMLCBkbGlvLmJkaWQpOwotCQkJCQlzeXN0ZW0oc3RyaW5nKTsKLQotCQkJCQlpZiAoZGVidWdmbGFnKQotCQkJCQkJcHJpbnRmKCJDcmVhdGVkIERldmljZXMuXG4iKTsKLQkJCQkJaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgJmRsaW8pID09IC0xICkgewotCQkJCQkJaWYoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmcgLSBERVZDUkVBVEUgaW9jdGwgZmFpbGVkXG4iLHBnbSk7Ci0JCQkJCQkJZXJyb3JwcmludCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCQlzbGVlcCgyKTsKLQkJCQkJfQotCQkJCQlpZiAoZGVidWdmbGFnKQotCQkJCQkJcHJpbnRmKCJBZnRlciBpb2N0bCBzZXQgLSBDcmVhdGVkIERldmljZS5cbiIpOwotCQkJCX0KLQotCQkJCWJyZWFrOwotCi0JCQljYXNlIERMUkVRX0NPTkZJRzoKLQkJCQlmb3IgKCB4ID0gMDsgeCA8IG5pbWFnZXM7IHgrKyApIHsKLQkJCQkJaWYoaW1hZ2VfbGlzdFt4XS50eXBlICE9IElDT05GSUcpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKCB4ID49IG5pbWFnZXMpIHsKLQkJCQkJLyoKLQkJCQkJKiogbm8gdmFsaWQgaW1hZ2VzIGV4aXN0Ci0JCQkJCSovCi0JCQkJCWlmKG5vZGxkcHJpbnQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW5ub3QgZmluZCBjb3JyZWN0IENPTkZJRyBpbWFnZVxuIiwKLQkJCQkJCQlwZ20pOwotCQkJCQkJbm9kbGRwcmludCA9IDA7Ci0JCQkJCX0KLQkJCQkJZGxpby5pbWFnZS5maS50eXBlPS0xOwotCQkJCQlpZiAoaW9jdGwoZmQsIERJR0lfRExSRVFfU0VULCAmZGxpbykgPT0gLTEgKSB7Ci0JCQkJCQlpZihlcnJvcnByaW50KSB7Ci0JCQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiJXM6IHdhcm5pbmcgLSBkb3dubG9hZCBpb2N0bCBmYWlsZWRcbiIsCi0JCQkJCQkJCXBnbSk7Ci0JCQkJCQkJZXJyb3JwcmludD0wOwotCQkJCQkJfQotCQkJCQkJc2xlZXAoMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJc3F1aXJ0KGRsaW8ucmVxX3R5cGUsIGRsaW8uYmRpZCwgJmltYWdlX2xpc3RbeF0pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERMUkVRX0NPTkM6Ci0JCQkJLyoKLQkJCQkqKiBmaW5kIHRoZSBpbWFnZSBuZWVkZWQgZm9yIHRoaXMgZG93bmxvYWQKLQkJCQkqLwotCQkJCWlmICggZHAtPmRsX3NlcSA9PSAwICkgewotCQkJCQkvKgotCQkJCQkqKiBmaW5kIGltYWdlIGZvciBoYXJkd2FyZSByZXYgcmFuZ2UKLQkJCQkJKi8KLQkJCQkJZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCQkJCQlpaT0maW1hZ2VfbGlzdFt4XTsKLQotCQkJCQkJaWYoaW1hZ2VfbGlzdFt4XS50eXBlICE9IElDT05DKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQljb25zaWRlcl9maWxlX3Jlc2NhbihpaSkgOwotCi0JCQkJCQlpcCA9IChzdHJ1Y3QgZG93bmxkX3QgKikgaW1hZ2VfbGlzdFt4XS5pbWFnZTsKLQkJCQkJCWlmIChpcCA9PSBOVUxMKSBjb250aW51ZTsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIFdoZW4gSSByZW1vdmVkIENsdXN0ZXJwb3J0LCBJIGtlcHQgb25seSB0aGUKLQkJCQkJCSAqIGNvZGUgdGhhdCBJIHdhcyBTVVJFIHdhc24ndCBDbHVzdGVyUG9ydC4KLQkJCQkJCSAqIFdlIG1heSBub3QgbmVlZCB0aGUgbmV4dCBmb3VyIGxpbmVzIG9mIGNvZGUuCi0JCQkJCQkgKi8KLQotCQkJCQkJaWYgKChkcC0+ZGxfdHlwZSAhPSAnUCcgKSAmJgotCQkJCQkJIChpcC0+ZGxfbHJldiA8PSBkcC0+ZGxfbHJldiApICYmCi0JCQkJCQkgKCBkcC0+ZGxfbHJldiA8PSBpcC0+ZGxfaHJldikpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIHggPj0gbmltYWdlcyApIHsKLQkJCQkJCS8qCi0JCQkJCQkqKiBObyB2YWxpZCBpbWFnZXMgZXhpc3QKLQkJCQkJCSovCi0JCQkJCQlpZihub2RsZHByaW50KSB7Ci0JCQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiJXM6IGNhbm5vdCBmaW5kIGNvcnJlY3QgZG93bmxvYWQgaW1hZ2UgJWRcbiIsCi0JCQkJCQkJCXBnbSwgZHAtPmRsX2xyZXYpOwotCQkJCQkJCW5vZGxkcHJpbnQ9MDsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkqKiBmaW5kIGltYWdlIHZlcnNpb24gcmVxdWlyZWQKLQkJCQkJKi8KLQkJCQkJaWYgKChpaSA9IGZpbmRfY29uY19pbWFnZSgpKSA9PSBOVUxMICkgewotCQkJCQkJLyoKLQkJCQkJCSoqIE5vIHZhbGlkIGltYWdlcyBleGlzdAotCQkJCQkJKi8KLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW4ndCBmaW5kIHJlc3Qgb2YgZG93bmxvYWQgaW1hZ2U/P1xuIiwKLQkJCQkJCQlwZ20pOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSoqIGRvd25sb2FkIGJsb2NrIG9mIGltYWdlCi0JCQkJKi8KLQotCQkJCW9mZnNldCA9IDEwMjQgKiBkcC0+ZGxfc2VxOwotCi0JCQkJLyoKLQkJCQkqKiB0ZXN0IGlmIGJsb2NrIHJlcXVlc3RlZCB3aXRoaW4gaW1hZ2UKLQkJCQkqLwotCQkJCWlmICggb2Zmc2V0IDwgaWktPmxlbiApIHsKLQotCQkJCQkvKgotCQkJCQkqKiBpZiBpdCBpcywgZGV0ZXJtaW5lIGJsb2NrIHNpemUsIHNldCBzZWdtZW50LAotCQkJCQkqKiBzZXQgc2l6ZSwgc2V0IHBvaW50ZXJzLCBhbmQgY29weSBibG9jawotCQkJCQkqLwotCQkJCQlpZiAoKCBic2l6ZSA9IGlpLT5sZW4gLSBvZmZzZXQgKSA+IDEwMjQgKQotCQkJCQkJYnNpemUgPSAxMDI0OwotCi0JCQkJCS8qCi0JCQkJCSoqIGNvcHkgaW1hZ2UgdmVyc2lvbiBpbmZvIHRvIGRvd25sb2FkIGFyZWEKLQkJCQkJKi8KLQkJCQkJZHAtPmRsX3NyZXYgPSBpcC0+ZGxfc3JldjsKLQkJCQkJZHAtPmRsX2xyZXYgPSBpcC0+ZGxfbHJldjsKLQkJCQkJZHAtPmRsX2hyZXYgPSBpcC0+ZGxfaHJldjsKLQotCQkJCQlkcC0+ZGxfc2VnID0gKDY0ICogZHAtPmRsX3NlcSkgKyBpcC0+ZGxfc2VnOwotCQkJCQlkcC0+ZGxfc2l6ZSA9IGJzaXplOwotCi0JCQkJCWRvd24gPSAoY2hhciAqKSZkcC0+ZGxfZGF0YVswXTsKLQkJCQkJaW1hZ2UgPSAoY2hhciAqKSgoY2hhciAqKWlwICsgb2Zmc2V0KTsKLQotCQkJCQltZW1jcHkoZG93biwgaW1hZ2UsIGJzaXplKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSoqIEltYWdlIGhhcyBiZWVuIGRvd25sb2FkZWQsIHNldCBzZWdtZW50IGFuZAotCQkJCQkqKiBzaXplIHRvIGluZGljYXRlIG5vIG1vcmUgYmxvY2tzCi0JCQkJCSovCi0JCQkJCWRwLT5kbF9zZWcgPSBpcC0+ZGxfc2VnOwotCQkJCQlkcC0+ZGxfc2l6ZSA9IDA7Ci0KLQkJCQkJLyogTm93LCB3ZSBjYW4gcmVsZWFzZSB0aGUgY29uY2VudHJhdG9yICovCi0JCQkJCS8qIGltYWdlIGZyb20gbWVtb3J5IGlmIHdlJ3JlIHJ1bm5pbmcgICovCi0JCQkJCS8qIGZyb20gZmlsZXN5c3RlbSBpbWFnZXMgKi8KLQotCQkJCQlpZiAoaWktPnBhdGhuYW1lKQotCQkJCQkJaWYgKGlpLT5pbWFnZSkgewotCQkJCQkJCWZyZWUoaWktPmltYWdlKTsKLQkJCQkJCQlpaS0+aW1hZ2UgPSBOVUxMOwotCQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChkZWJ1Z2ZsYWcpCi0JCQkJCQlwcmludGYoCi0JCQkJCQkic2VuZGluZyBjb25jIGRsIHNlY3Rpb24gJWQgdG8gJXMgZnJvbSAlc1xuIiwKLQkJCQkJCQlkcC0+ZGxfc2VxLCBpaS0+bmFtZSwKLQkJCQkJCWlpLT5wYXRobmFtZSA/IGlpLT5wYXRobmFtZSA6ICJJbnRlcm5hbCBJbWFnZSIpOwotCi0JCQkJaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgJmRsaW8pID09IC0xICkgewotCQkJCQlpZiAoZXJyb3JwcmludCkgewotCQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiJXM6IHdhcm5pbmcgLSBkb3dubG9hZCBpb2N0bCBmYWlsZWRcbiIsCi0JCQkJCQkJcGdtKTsKLQkJCQkJCWVycm9ycHJpbnQ9MDsKLQkJCQkJfQotCQkJCQlzbGVlcCgyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9IC8qIHN3aXRjaCAqLwotCQl9Ci0JCWlmIChkZWJ1Z2ZsYWcgPiAxKSB7Ci0JCQlwcmludGYoInBhdXNpbmc6ICIpOyBmZmx1c2goc3Rkb3V0KTsKLQkJCWZmbHVzaChzdGRpbik7Ci0JCQl3aGlsZShnZXRjaGFyKCkgIT0gJ1xuJyk7Ci0JCQkJcHJpbnRmKCJjb250aW51aW5nXG4iKTsKLQkJfQotCX0KLX0KLQotLyoKLSoqIG15cGVycm9yKCkKLSoqCi0qKiAgU2FtZSBhcyBub3JtYWwgcGVycm9yKCksIGJ1dCBwbGFjZXMgdGhlIHByb2dyYW0gbmFtZSBhdCB0aGUgYmVnaW5uaW5nCi0qKiAgb2YgdGhlIG1lc3NhZ2UuCi0qLwotdm9pZCBteXBlcnJvcihjaGFyICpzKQotewotCWZwcmludGYoc3RkZXJyLCIlczogJXM6ICVzLlxuIixwZ20sIHMsIHN0cmVycm9yKGVycm5vKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYwppbmRleCA3MDhhZGJiLi42MGQ5YjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKQEAgLTgyNyw5ICs4MjcsOCBAQAogCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSBpdHMgZm9yIHVzLgogCSAqLwogCWlmIChicmQtPm1hZ2ljICE9IERHTkNfQk9BUkRfTUFHSUMpIHsKLQkJQVBSKCgKLQkJICAgICJSZWNlaXZlZCBpbnRlcnJ1cHQgKCVkKSB3aXRoIGEgYm9hcmQgcG9pbnRlciAiCi0JCQkJCQkidGhhdCB3YXNuJ3Qgb3VycyFcbiIsIGlycSkpOworCQlBUFIoKCJSZWNlaXZlZCBpbnRlcnJ1cHQgKCVkKSB3aXRoIGEgYm9hcmQgcG9pbnRlciB0aGF0IHdhc24ndCBvdXJzIVxuIiwKKwkJCSAgaXJxKSk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKQEAgLTg0Niw4ICs4NDUsNyBAQAogCS8qIElmIDAsIG5vIGludGVycnVwdHMgcGVuZGluZyAqLwogCWlmICghcG9sbF9yZWcpIHsKIAkJRFBSX0lOVFIoKAotCQkJICJLZXJuZWwgaW50ZXJydXB0ZWQgdG8gbWUsIGJ1dCBubyBwZW5kaW5nICIKLQkJCQkJCQkiaW50ZXJydXB0cy4uLlxuIikpOworCQkJICJLZXJuZWwgaW50ZXJydXB0ZWQgdG8gbWUsIGJ1dCBubyBwZW5kaW5nIGludGVycnVwdHMuLi5cbiIpKTsKIAkJREdOQ19VTkxPQ0soYnJkLT5iZF9pbnRyX2xvY2ssIGxvY2tfZmxhZ3MpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQpAQCAtMTM4OCw4ICsxMzg2LDcgQEAKIAkJd3JpdGViKCh0ZW1wIHwgVUFSVF9MQ1JfU0JDKSwgJmNoLT5jaF9jbHNfdWFydC0+bGNyKTsKIAkJY2gtPmNoX2ZsYWdzIHw9IChDSF9CUkVBS19TRU5ESU5HKTsKIAkJRFBSX0lPQ1RMKCgKLQkJCSJQb3J0ICVkLiBTdGFydGluZyBVQVJUX0xDUl9TQkMhIHN0YXJ0OiAlbHggIgotCQkJInNob3VsZCBlbmQ6ICVseFxuIiwKKwkJCSJQb3J0ICVkLiBTdGFydGluZyBVQVJUX0xDUl9TQkMhIHN0YXJ0OiAlbHggc2hvdWxkIGVuZDogJWx4XG4iLAogCQkJY2gtPmNoX3BvcnRudW0sIGppZmZpZXMsIGNoLT5jaF9zdG9wX3NlbmRpbmdfYnJlYWspKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYwppbmRleCBjMjA0MjY2Li5iMWEzOWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKQEAgLTg4LDcgKzg4LDcgQEAKIC8qCiAgKiBGaWxlIG9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIENvbnRyb2wvTWFuYWdlbWVudCBtYWpvci4KICAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGduY19Cb2FyZEZvcHMgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGduY19Cb2FyZEZvcHMgPQogewogCS5vd25lcgkJPQlUSElTX01PRFVMRSwKIAkudW5sb2NrZWRfaW9jdGwgPSAgCWRnbmNfbWdtdF9pb2N0bCwKQEAgLTIzNiw3ICsyMzYsNyBAQAogCQlpZiAoZGduY19OdW1Cb2FyZHMpCiAJCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRnbmNfZHJpdmVyKTsKIAkJZWxzZQotCQkJcHJpbnRrKCJXQVJOSU5HOiBkZ25jIGRyaXZlciBsb2FkIGZhaWxlZC4gIE5vIERpZ2kgTmVvIG9yIENsYXNzaWMgYm9hcmRzIGZvdW5kLlxuIik7CisJCQlwcl93YXJuKCJXQVJOSU5HOiBkZ25jIGRyaXZlciBsb2FkIGZhaWxlZC4gIE5vIERpZ2kgTmVvIG9yIENsYXNzaWMgYm9hcmRzIGZvdW5kLlxuIik7CiAKIAkJZGduY19jbGVhbnVwX21vZHVsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19tZ210LmMKaW5kZXggMWM1YWIzZC4uYzViNDI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19tZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19tZ210LmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2tsZXQgYW5kIGludGVycnVwdCBzdHJ1Y3RzL2RlZmluZXMgKi8KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIEZvciBjb3B5X2Zyb21fdXNlci9jb3B5X3RvX3VzZXIgKi8KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CS8qIEZvciBjb3B5X2Zyb21fdXNlci9jb3B5X3RvX3VzZXIgKi8KIAogI2luY2x1ZGUgImRnbmNfZHJpdmVyLmgiCiAjaW5jbHVkZSAiZGduY19wY2kuaCIKQEAgLTc3LDggKzc3LDcgQEAKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJZGduY19tZ210X2luX3VzZVttaW5vcl0rKzsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJREdOQ19VTkxPQ0soZGduY19nbG9iYWxfbG9jaywgbG9ja19mbGFncyk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTA3LDkgKzEwNiw4IEBACiAKIAkvKiBtZ210IGRldmljZSAqLwogCWlmIChtaW5vciA8IE1BWE1HTVRERVZJQ0VTKSB7Ci0JCWlmIChkZ25jX21nbXRfaW5fdXNlW21pbm9yXSkgeworCQlpZiAoZGduY19tZ210X2luX3VzZVttaW5vcl0pCiAJCQlkZ25jX21nbXRfaW5fdXNlW21pbm9yXSA9IDA7Ci0JCX0KIAl9CiAJREdOQ19VTkxPQ0soZGduY19nbG9iYWxfbG9jaywgbG9ja19mbGFncyk7CiAKQEAgLTE1Myw3ICsxNTEsNyBAQAogCQlEUFJfTUdNVCgoIkRJR0lfR0VUREQgcmV0dXJuaW5nIG51bWJvYXJkczogJWQgdmVyc2lvbjogJXNcbiIsCiAJCQlkZGkuZGluZm9fbmJvYXJkcywgZGRpLmRpbmZvX3ZlcnNpb24pKTsKIAotCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkZGksIHNpemVvZiAoZGRpKSkpCisJCWlmIChjb3B5X3RvX3VzZXIodWFyZywgJmRkaSwgc2l6ZW9mKGRkaSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJYnJlYWs7CkBAIC0xNjUsMTMgKzE2MywxMyBAQAogCiAJCXN0cnVjdCBkaWdpX2luZm8gZGk7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZicmQsIHVhcmcsIHNpemVvZihpbnQpKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJyZCwgdWFyZywgc2l6ZW9mKGludCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KIAogCQlEUFJfTUdNVCgoIkRJR0lfR0VUQkQgYXNraW5nIGFib3V0IGJvYXJkOiAlZFxuIiwgYnJkKSk7CiAKLQkJaWYgKChicmQgPCAwKSB8fCAoYnJkID4gZGduY19OdW1Cb2FyZHMpIHx8IChkZ25jX051bUJvYXJkcyA9PSAwKSkKKwkJaWYgKChicmQgPCAwKSB8fCAoYnJkID4gZGduY19OdW1Cb2FyZHMpIHx8CisJCSAgICAoZGduY19OdW1Cb2FyZHMgPT0gMCkpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKQEAgLTE5NSw3ICsxOTMsNyBAQAogCQlEUFJfTUdNVCgoIkRJR0lfR0VUQkQgcmV0dXJuaW5nIHR5cGU6ICV4IHN0YXRlOiAleCBwb3J0czogJXggc2l6ZTogJXhcbiIsCiAJCQlkaS5pbmZvX2JkdHlwZSwgZGkuaW5mb19iZHN0YXRlLCBkaS5pbmZvX25wb3J0cywgZGkuaW5mb19waHlzc2l6ZSkpOwogCi0JCWlmIChjb3B5X3RvX3VzZXIodWFyZywgJmRpLCBzaXplb2YgKGRpKSkpCisJCWlmIChjb3B5X3RvX3VzZXIodWFyZywgJmRpLCBzaXplb2YoZGkpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWJyZWFrOwpAQCAtMjA5LDkgKzIwNyw4IEBACiAJCXVpbnQgYm9hcmQgPSAwOwogCQl1aW50IGNoYW5uZWwgPSAwOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmbmksIHVhcmcsIHNpemVvZihuaSkpKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmksIHVhcmcsIHNpemVvZihuaSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KIAogCQlEUFJfTUdNVCgoIkRJR0lfR0VUQkQgYXNraW5nIGFib3V0IGJvYXJkOiAlZCBjaGFubmVsOiAlZFxuIiwKIAkJCW5pLmJvYXJkLCBuaS5jaGFubmVsKSk7CkBAIC0yNjgsMTIgKzI2NSwxNCBAQAogCQluaS5jZmxhZyA9IGNoLT5jaF9jX2NmbGFnOwogCQluaS5sZmxhZyA9IGNoLT5jaF9jX2xmbGFnOwogCi0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgQ1RTUEFDRSB8fCBjaC0+Y2hfY19jZmxhZyAmIENSVFNDVFMpCisJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgQ1RTUEFDRSB8fAorCQkgICAgY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKQogCQkJbmkuaGZsb3cgPSAxOwogCQllbHNlCiAJCQluaS5oZmxvdyA9IDA7CiAKLQkJaWYgKChjaC0+Y2hfZmxhZ3MgJiBDSF9TVE9QSSkgfHwgKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QSSkpCisJCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfU1RPUEkpIHx8CisJCSAgICAoY2gtPmNoX2ZsYWdzICYgQ0hfRk9SQ0VEX1NUT1BJKSkKIAkJCW5pLnJlY3Zfc3RvcHBlZCA9IDE7CiAJCWVsc2UKIAkJCW5pLnJlY3Zfc3RvcHBlZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYwppbmRleCBkYzVhMTM4Li5jZjIyYzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKQEAgLTEyMDEsNyArMTIwMSw4IEBACiAJY2gtPmNoX2NhY2hlZF9sc3IgPSAwOwogCiAJLyogU3RvcmUgaG93IG11Y2ggc3BhY2Ugd2UgaGF2ZSBsZWZ0IGluIHRoZSBxdWV1ZSAqLwotCWlmICgocWxlZnQgPSB0YWlsIC0gaGVhZCAtIDEpIDwgMCkKKwlxbGVmdCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAocWxlZnQgPCAwKQogCQlxbGVmdCArPSBSUVVFVUVNQVNLICsgMTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYwppbmRleCBhNmM2YWJhLi5mMGIxN2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKQEAgLTk2NCw4ICs5NjQsMTAgQEAKIAlpbnQgZGVsdGFoaWdoOwogCWludCBkZWx0YWxvdzsKIAotCWlmIChuZXdyYXRlIDwgMCkKLQkJbmV3cmF0ZSA9IDA7CisJaWYgKG5ld3JhdGUgPD0gMCkgeworCQljaC0+Y2hfY3VzdG9tX3NwZWVkID0gMDsKKwkJcmV0dXJuOworCX0KIAogCS8qCiAJICogIFNpbmNlIHRoZSBkaXZpc29yIGlzIHN0b3JlZCBpbiBhIDE2LWJpdCBpbnRlZ2VyLCB3ZSBtYWtlIHN1cmUKQEAgLTk3OCw3ICs5ODAsNyBAQAogCWlmIChuZXdyYXRlICYmIG5ld3JhdGUgPiBjaC0+Y2hfYmQtPmJkX2RpdmlkZW5kKQogCQluZXdyYXRlID0gY2gtPmNoX2JkLT5iZF9kaXZpZGVuZDsKIAotCXdoaWxlIChuZXdyYXRlID4gMCkgeworCWlmIChuZXdyYXRlID4gMCkgewogCQl0ZXN0ZGl2ID0gY2gtPmNoX2JkLT5iZF9kaXZpZGVuZCAvIG5ld3JhdGU7CiAKIAkJLyoKQEAgLTk5NSwyOCArOTk3LDIzIEBACiAJCSAqICBJZiB0aGUgcmF0ZSBmb3IgdGhlIHJlcXVlc3RlZCBkaXZpc29yIGlzIGNvcnJlY3QsIGp1c3QKIAkJICogIHVzZSBpdCBhbmQgYmUgZG9uZS4KIAkJICovCi0JCWlmICh0ZXN0cmF0ZV9oaWdoID09IG5ld3JhdGUgKQotCQkJYnJlYWs7CisJCWlmICh0ZXN0cmF0ZV9oaWdoICE9IG5ld3JhdGUpIHsKKwkJCS8qCisJCQkgKiAgT3RoZXJ3aXNlLCBwaWNrIHRoZSByYXRlIHRoYXQgaXMgY2xvc2VyIChpLmUuIHdoaWNoZXZlciByYXRlCisJCQkgKiAgaGFzIGEgc21hbGxlciBkZWx0YSkuCisJCQkgKi8KKwkJCWRlbHRhaGlnaCA9IHRlc3RyYXRlX2hpZ2ggLSBuZXdyYXRlOworCQkJZGVsdGFsb3cgPSBuZXdyYXRlIC0gdGVzdHJhdGVfbG93OwogCi0JCS8qCi0JCSAqICBPdGhlcndpc2UsIHBpY2sgdGhlIHJhdGUgdGhhdCBpcyBjbG9zZXIgKGkuZS4gd2hpY2hldmVyIHJhdGUKLQkJICogIGhhcyBhIHNtYWxsZXIgZGVsdGEpLgotCQkgKi8KLQkJZGVsdGFoaWdoID0gdGVzdHJhdGVfaGlnaCAtIG5ld3JhdGU7Ci0JCWRlbHRhbG93ID0gbmV3cmF0ZSAtIHRlc3RyYXRlX2xvdzsKLQotCQlpZiAoZGVsdGFoaWdoIDwgZGVsdGFsb3cpIHsKLQkJCW5ld3JhdGUgPSB0ZXN0cmF0ZV9oaWdoOwotCQl9IGVsc2UgewotCQkJbmV3cmF0ZSA9IHRlc3RyYXRlX2xvdzsKKwkJCWlmIChkZWx0YWhpZ2ggPCBkZWx0YWxvdykgeworCQkJCW5ld3JhdGUgPSB0ZXN0cmF0ZV9oaWdoOworCQkJfSBlbHNlIHsKKwkJCQluZXdyYXRlID0gdGVzdHJhdGVfbG93OworCQkJfQogCQl9Ci0KLQkJYnJlYWs7CiAJfQogCiAJY2gtPmNoX2N1c3RvbV9zcGVlZCA9IG5ld3JhdGU7Ci0KLQlyZXR1cm47CiB9CiAKIApAQCAtMTAyNSw3ICsxMDIyLDggQEAKIAlpbnQgcWxlZnQgPSAwOwogCiAJLyogU3RvcmUgaG93IG11Y2ggc3BhY2Ugd2UgaGF2ZSBsZWZ0IGluIHRoZSBxdWV1ZSAqLwotCWlmICgocWxlZnQgPSBjaC0+Y2hfcl90YWlsIC0gY2gtPmNoX3JfaGVhZCAtIDEpIDwgMCkKKwlxbGVmdCA9IGNoLT5jaF9yX3RhaWwgLSBjaC0+Y2hfcl9oZWFkIC0gMTsKKwlpZiAocWxlZnQgPCAwKQogCQlxbGVmdCArPSBSUVVFVUVNQVNLICsgMTsKIAogCS8qCkBAIC0xMTE5LDcgKzExMTcsOCBAQAogCS8qCiAJICogSWYgY2hhbm5lbCBub3cgaGFzIHNwYWNlLCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24uCiAJICovCi0JaWYgKChxbGVuID0gY2gtPmNoX3dfaGVhZCAtIGNoLT5jaF93X3RhaWwpIDwgMCkKKwlxbGVuID0gY2gtPmNoX3dfaGVhZCAtIGNoLT5jaF93X3RhaWw7CisJaWYgKHFsZW4gPCAwKQogCQlxbGVuICs9IFdRVUVVRVNJWkU7CiAKIAlpZiAocWxlbiA+PSAoV1FVRVVFU0laRSAtIDI1NikpIHsKQEAgLTE5MTcsNyArMTkxNiw4IEBACiAJaGVhZCA9IChjaC0+Y2hfd19oZWFkKSAmIHRtYXNrOwogCXRhaWwgPSAoY2gtPmNoX3dfdGFpbCkgJiB0bWFzazsKIAotCWlmICgocmV0ID0gdGFpbCAtIGhlYWQgLSAxKSA8IDApCisJcmV0ID0gdGFpbCAtIGhlYWQgLSAxOworCWlmIChyZXQgPCAwKQogCQlyZXQgKz0gV1FVRVVFU0laRTsKIAogCS8qIExpbWl0IHByaW50ZXIgdG8gbWF4Y3BzICovCkBAIC0yMDE3LDcgKzIwMTcsOCBAQAogCWhlYWQgPSAoY2gtPmNoX3dfaGVhZCkgJiB0bWFzazsKIAl0YWlsID0gKGNoLT5jaF93X3RhaWwpICYgdG1hc2s7CiAKLQlpZiAoKGJ1ZmNvdW50ID0gdGFpbCAtIGhlYWQgLSAxKSA8IDApCisJYnVmY291bnQgPSB0YWlsIC0gaGVhZCAtIDE7CisJaWYgKGJ1ZmNvdW50IDwgMCkKIAkJYnVmY291bnQgKz0gV1FVRVVFU0laRTsKIAogCURQUl9XUklURSgoIiVkOiBidWZjb3VudDogJXggY291bnQ6ICV4IHRhaWw6ICV4IGhlYWQ6ICV4IHRtYXNrOiAleFxuIiwKQEAgLTMzMTYsMTAgKzMzMTcsMTAgQEAKIAogCWNhc2UgRElHSV9TRVRDVVNUT01CQVVEOgogCXsKLQkJdWludCBuZXdfcmF0ZTsKKwkJaW50IG5ld19yYXRlOwogCQkvKiBMZXQgZ28gb2YgbG9ja3Mgd2hlbiBhY2Nlc3NpbmcgdXNlciBzcGFjZSwgY291bGQgc2xlZXAgKi8KIAkJREdOQ19VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyYyA9IGdldF91c2VyKG5ld19yYXRlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpOworCQlyYyA9IGdldF91c2VyKG5ld19yYXRlLCAoaW50IF9fdXNlciAqKSBhcmcpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJCURHTkNfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3N5c2ZzLmMKaW5kZXggOWExOGEyYy4uMmY5MzQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfc3lzZnMuYwpAQCAtNjUsNyArNjUsOSBAQAogCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzc2NhbmYoYnVmLCAiMHgleFxuIiwgJmRncnBfcG9sbF90aWNrKTsKKwlpZiAoc3NjYW5mKGJ1ZiwgIjB4JXhcbiIsICZkZ3JwX3BvbGxfdGljaykgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIocG9sbHJhdGUsIDA2MDAsIGRncnBfY2xhc3NfcG9sbHJhdGVfc2hvdywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfdHR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3R0eS5jCmluZGV4IDdhOTY5NGMuLjMwZDI2MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfdHR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF90dHkuYwpAQCAtMTMxOSw3ICsxMzE5LDggQEAKIAogCWlmIChjaC0+Y2hfdHVuLnVuX29wZW5fY291bnQgIT0gMCAmJgogCSAgICBjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIgJiYKLQkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpKGNoLT5jaF90dW4udW5fdHR5KSAhPSAwKSkgeworCSAgICAoKGNoLT5jaF90dW4udW5fdHR5LT5vcHMtPmNoYXJzX2luX2J1ZmZlcikKKwkgICAgIChjaC0+Y2hfdHVuLnVuX3R0eSkgIT0gMCkpIHsKIAkJKnVuX2ZsYWcgPSBVTl9QV0FJVDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTUwMSw3ICsxNTAyLDggQEAKIAkJICovCiAKIAkJaWYgKGNoLT5jaF90dW4udW5fb3Blbl9jb3VudCAhPSAwICYmCi0JCSAgICAoKGNoLT5jaF90dW4udW5fdHR5LT5vcHMtPmNoYXJzX2luX2J1ZmZlcikoY2gtPmNoX3R1bi51bl90dHkpICE9IDApKSB7CisJCSAgICAoKGNoLT5jaF90dW4udW5fdHR5LT5vcHMtPmNoYXJzX2luX2J1ZmZlcikKKwkJICAgICAoY2gtPmNoX3R1bi51bl90dHkpICE9IDApKSB7CiAJCQl1bi0+dW5fZmxhZyB8PSBVTl9QV0FJVDsKIAkJCWNvdW50ID0gMDsKIAkJCWdvdG8gb3V0OwpAQCAtMTY2Niw3ICsxNjY4LDggQEAKIAogCQlpZiAobiA+PSB0KSB7CiAJCQltZW1jcHkoY2gtPmNoX3RidWYgKyBjaC0+Y2hfdGluLCBidWYsIHQpOwotCQkJaWYgKG5kLT5uZF9kcGFfZGVidWcgJiYgbmQtPm5kX2RwYV9wb3J0ID09IFBPUlRfTlVNKE1JTk9SKHR0eV9kZXZudW0odW4tPnVuX3R0eSkpKSkKKwkJCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PQorCQkJCVBPUlRfTlVNKE1JTk9SKHR0eV9kZXZudW0odW4tPnVuX3R0eSkpKSkKIAkJCQlkZ3JwX2RwYV9kYXRhKG5kLCAwLCAoY2hhciAqKSBidWYsIHQpOwogCQkJYnVmICs9IHQ7CiAJCQluIC09IHQ7CkBAIC0xNjc1LDcgKzE2NzgsOCBAQAogCQl9CiAKIAkJbWVtY3B5KGNoLT5jaF90YnVmICsgY2gtPmNoX3RpbiwgYnVmLCBuKTsKLQkJaWYgKG5kLT5uZF9kcGFfZGVidWcgJiYgbmQtPm5kX2RwYV9wb3J0ID09IFBPUlRfTlVNKE1JTk9SKHR0eV9kZXZudW0odW4tPnVuX3R0eSkpKSkKKwkJaWYgKG5kLT5uZF9kcGFfZGVidWcgJiYgbmQtPm5kX2RwYV9wb3J0ID09CisJCQlQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCiAJCQlkZ3JwX2RwYV9kYXRhKG5kLCAwLCAoY2hhciAqKSBidWYsIG4pOwogCQlidWYgKz0gbjsKIAkJY2gtPmNoX3RpbiArPSBuOwpAQCAtMjY1Niw3ICsyNjYwLDggQEAKIAkJCQljaC0+Y2hfc2VuZCB8PSBSUl9SWF9GTFVTSDsKIAkJCQkoY2gtPmNoX25kKS0+bmRfdHhfd29yayA9IDE7CiAJCQkJKGNoLT5jaF9uZCktPm5kX3R4X3JlYWR5ID0gMTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihjaC0+Y2hfbmQpLT5uZF90eF93YWl0cSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKAorCQkJCQkmKGNoLT5jaF9uZCktPm5kX3R4X3dhaXRxKTsKIAkJCX0KIAkJCWlmIChhcmcgPT0gVENJRkxVU0gpCiAJCQkJYnJlYWs7CkBAIC0yNjgyLDcgKzI2ODcsOCBAQAogCUxpbnV4CQlIUFVYCQlGdW5jdGlvbgogCVRDU0VUQQkJVENTRVRBCQktIHNldCB0aGUgdGVybWlvcwogCVRDU0VUQUYJCVRDU0VUQUYJCS0gd2FpdCBmb3IgZHJhaW4gZmlyc3QsIHRoZW4gc2V0IHRlcm1pb3MKLQlUQ1NFVEFXCQlUQ1NFVEFXCQktIHdhaXQgZm9yIGRyYWluLCBmbHVzaCB0aGUgaW5wdXQgcXVldWUsIHRoZW4gc2V0IHRlcm1pb3MKKwlUQ1NFVEFXCQlUQ1NFVEFXCQktIHdhaXQgZm9yIGRyYWluLAorCQkJCQlmbHVzaCB0aGUgaW5wdXQgcXVldWUsIHRoZW4gc2V0IHRlcm1pb3MKIAktIGxvb2tpbmcgYXQgdGhlIHR0eV9pb2N0bCBjb2RlLCB0aGVzZSBjb21tYW5kIGFsbCBjYWxsIG91cgogCXR0eV9zZXRfdGVybWlvcyBhdCB0aGUgZHJpdmVyJ3MgZW5kLCB3aGVuIGEgVENTRVRBKiBpcyBzZW50LAogCWl0IGlzIGV4cGVjdGluZyB0aGUgdHR5IHRvIGhhdmUgYSB0ZXJtaW8gc3RydWN0dXJlLApAQCAtMjc5OCw2ICsyODA0LDcgQEAKIAkJfQogCiAJCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzICovCisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCiAJY2FzZSBESUdJX1NFVEE6CiAJCXJldHVybiBkZ3JwX3R0eV9kaWdpc2V0YSh0dHksIChzdHJ1Y3QgZGlnaV9zdHJ1Y3QgKikgYXJnKTsKQEAgLTMyMDcsNyArMzIxNCw4IEBACiAJCQkJaW50IG1heF9tYWpvcnMgPSAxVSA8PCAoMzIgLSBNSU5PUkJJVFMpOwogCQkJCWZvciAoaSA9IDI1NjsgaSA8IG1heF9tYWpvcnM7IGkrKykgewogCQkJCQluZC0+bmRfc2VyaWFsX3R0ZHJpdmVyLT5tYWpvciA9IGk7Ci0JCQkJCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihuZC0+bmRfc2VyaWFsX3R0ZHJpdmVyKTsKKwkJCQkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyCisJCQkJCQkobmQtPm5kX3NlcmlhbF90dGRyaXZlcik7CiAJCQkJCWlmIChyYyA+PSAwKQogCQkJCQkJYnJlYWs7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYTMxMWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVE9ETzoKLQktIHNlbmQgdG8gbGttbCBmb3IgcmV2aWV3Ci0KLVBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kIENjOiBTdGV2ZQotVW5kZXJ3b29kIDxzdGV2ZXVAY29wcGljZS5vcmc+IGFuZCBEYXZpZCBSb3dlIDxkYXZpZEByb3dldGVsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jCmluZGV4IGU1MTZiYjYuLmQzMjljZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXguYwpAQCAtNDg1LDggKzQ4NSw2IEBACiAJdTggZWVwcm9tX2RhdGFbMl07CiAKIAkvKiBTcGlubG9ja3MgKi8KLQlzcGlubG9ja190IGxvY2s7Ci0KIAlzcGlubG9ja190IHRjYl9zZW5kX3Fsb2NrOwogCXNwaW5sb2NrX3QgdGNiX3JlYWR5X3Fsb2NrOwogCXNwaW5sb2NrX3Qgc2VuZF9od19sb2NrOwpAQCAtMTM4OCw2ICsxMzg2LDcgQEAKIAkJCSAgICBtaWlfaW5kaWNhdG9yKTsKIAogCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBJZiB3ZSBoaXQgaGVyZSB3ZSB3ZXJlIGFibGUgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgYW5kIHdlIG5lZWQgdG8KQEAgLTEzOTUsNiArMTM5NCw3IEBACiAJICovCiAJKnZhbHVlID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfc3RhdCkgJiBFVF9NQUNfTUlJTUdNVF9TVEFUX1BIWUNSVExfTUFTSzsKIAorb3V0OgogCS8qIFN0b3AgdGhlIHJlYWQgb3BlcmF0aW9uICovCiAJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKQEAgLTIxMjQsNyArMjEyNCwxMSBAQAogCiAJLyogQWxsb2MgbWVtb3J5IGZvciB0aGUgbG9va3VwIHRhYmxlICovCiAJcnhfcmluZy0+ZmJyWzBdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZicl9sb29rdXApLCBHRlBfS0VSTkVMKTsKKwlpZiAocnhfcmluZy0+ZmJyWzBdID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCXJ4X3JpbmctPmZiclsxXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYnJfbG9va3VwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJ4X3JpbmctPmZiclsxXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIFRoZSBmaXJzdCB0aGluZyB3ZSB3aWxsIGRvIGlzIGNvbmZpZ3VyZSB0aGUgc2l6ZXMgb2YgdGhlIGJ1ZmZlcgogCSAqIHJpbmdzLiBUaGVzZSB3aWxsIGNoYW5nZSBiYXNlZCBvbiBqdW1ibyBwYWNrZXQgc3VwcG9ydC4gIExhcmdlcgpAQCAtMjI4OSw3ICsyMjkzLDcgQEAKIAlmb3IgKGlkID0gMDsgaWQgPCBOVU1fRkJSUzsgaWQrKykgewogCQlmYnIgPSByeF9yaW5nLT5mYnJbaWRdOwogCi0JCWlmICghZmJyLT5yaW5nX3ZpcnRhZGRyKQorCQlpZiAoIWZiciB8fCAhZmJyLT5yaW5nX3ZpcnRhZGRyKQogCQkJY29udGludWU7CiAKIAkJLyogRmlyc3QgdGhlIHBhY2tldCBtZW1vcnkgKi8KQEAgLTM1MjMsNyArMzUyNyw3IEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAl9Ci0JbWVtY3B5KGFkYXB0ZXItPmFkZHIsIGFkYXB0ZXItPnJvbV9hZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPmFkZHIsIGFkYXB0ZXItPnJvbV9hZGRyKTsKIG91dDoKIAlyZXR1cm4gcmM7CiBlcnJfb3V0OgpAQCAtMzU5MSw2ICszNTk1LDcgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgImV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7CisJCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCS8qIFJlY2VpdmUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uICovCkBAIC0zNTk4LDcgKzM2MDMsNyBAQAogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJICAiZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2MgRkFJTEVEXG4iKTsKLQkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwkJZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0zNzYwLDcgKzM3NjUsNiBAQAogCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKIAogCS8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGhlcmUgKi8KLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRjYl9zZW5kX3Fsb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dGNiX3JlYWR5X3Fsb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+c2VuZF9od19sb2NrKTsKQEAgLTM3NzAsNyArMzc3NCw3IEBACiAJYWRhcHRlci0+cmVnaXN0cnlfanVtYm9fcGFja2V0ID0gMTUxNDsJLyogMTUxNC05MjE2ICovCiAKIAkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzIHRvIGEgZGVmYXVsdCAqLwotCW1lbWNweShhZGFwdGVyLT5hZGRyLCBkZWZhdWx0X21hYywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5hZGRyLCBkZWZhdWx0X21hYyk7CiAKIAlyZXR1cm4gYWRhcHRlcjsKIH0KQEAgLTQyOTIsMTIgKzQyOTYsOSBAQAogewogCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHBhY2tldF9maWx0ZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCWludCBpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQogCS8qIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGZpbHRlciBmbGFncywgc3RvcmUgdGhlbQogCSAqIGxvY2FsbHkuIFRoaXMgYWxsb3dzIHVzIHRvIGRldGVybWluZSBpZiBhbnl0aGluZydzIGNoYW5nZWQgYW5kIGlmCiAJICogd2UgZXZlbiBuZWVkIHRvIGJvdGhlciB0aGUgaGFyZHdhcmUKQEAgLTQzNDksOCArNDM1MCw2IEBACiAJICovCiAJaWYgKHBhY2tldF9maWx0ZXIgIT0gYWRhcHRlci0+cGFja2V0X2ZpbHRlcikKIAkJZXQxMzF4X3NldF9wYWNrZXRfZmlsdGVyKGFkYXB0ZXIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogfQogCiAvKiBldDEzMXhfdHggLSBUaGUgaGFuZGxlciB0byB0eCBhIHBhY2tldCBvbiB0aGUgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwppbmRleCBlZGQ1Y2VmLi4yMjZiMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKQEAgLTIwOCw3ICsyMDgsOSBAQAogCWtmcmVlKGRldi0+cmluZ19idWZmZXIpOwogCWtmcmVlKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcik7CiAJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7Ci0Ja2ZyZWUoZGV2KTsJCS8qIGZpeG1lIG9sZGlfYnVmZmVyICovCisJa2ZyZWUoZGV2LT5vbGRpX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT53cml0ZV9idWZmZXIpOworCWtmcmVlKGRldik7CiB9CiAKIC8qKiB1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfaW5fY2FsbGJhY2sgKi8KQEAgLTIzMyw4ICsyMzUsOCBAQAogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBJTlBVVF9DTURfU0laRSkgewogCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCi0JCQkgIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEiCi0JCQkgIkRvIHNvbWV0aGluZyBpbnRlbGxpZ2VudFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCSAiVXJiIGxlbmd0aCB3YXMgJWQgYnl0ZXMhISBEbyBzb21ldGhpbmcgaW50ZWxsaWdlbnRcbiIsCisJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAl9IGVsc2UgewogCQlhbHBoYXRyYWNrX29jbWRfaW5mbygmZGV2LT5pbnRmLT5kZXYsCiAJCQkJICAgICAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kLApAQCAtNjg4LDggKzY5MCw3IEBACiAJfQogCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkKIAkJZGV2X3dhcm4oJmludGYtPmRldiwKLQkJCSAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQiCi0JCQkgIih1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKKwkJCSAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQgKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOwogCiAJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9CiAJICAgIGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKaW5kZXggMGU0OTljZS4uMDU3MTk4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYwpAQCAtMjU3LDggKzI1Nyw3IEBACiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IDgpIHsKIAkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAotCQkJIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEiCi0JCQkiRG8gc29tZXRoaW5nIGludGVsbGlnZW50XG4iLAorCQkJIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEgRG8gc29tZXRoaW5nIGludGVsbGlnZW50XG4iLAogCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfSBlbHNlIHsKIAkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LApAQCAtNTQyLDggKzU0MSw3IEBACiAJfQogCiAJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAotCQkiJXM6IGNvcHlpbmcgdG8gdXNlcnNwYWNlOiAiCi0JCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJIiVzOiBjb3B5aW5nIHRvIHVzZXJzcGFjZTogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCiAJCSBfX2Z1bmNfXywKIAkJICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwKIAkJICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwKQEAgLTU3MCw4ICs1NjgsNyBAQAogCQkJICogYW5kIHdlIGFyZSB0aGUgc2FtZSBzaWduLCB3ZSBjYW4gY29tcHJlc3MgKy0gN0YKIAkJCSAqLwogCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAotCQkJCSIlczogdHJ5aW5nIHRvIGNvbXByZXNzOiAiCi0JCQkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJCSIlczogdHJ5aW5nIHRvIGNvbXByZXNzOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKIAkJCQlfX2Z1bmNfXywKIAkJCQkoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sCiAJCQkJKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLApAQCAtODMwLDggKzgyNyw3IEBACiAJfQogCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkKIAkJZGV2X3dhcm4oJmludGYtPmRldiwKLQkJCSJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IG5vdCBmb3VuZCIKLQkJCSIodXNpbmcgY29udHJvbCBlbmRwb2ludCBpbnN0ZWFkKVxuIik7CisJCQkiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQgKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOwogCiAJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9CiAJICAgIGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKaW5kZXggYTQzM2UzMy4uYjZhNzcwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIAogCWNoYXIgKmNtZGJ1ZmZlciA9IGttYWxsb2MoMTYwMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbWRidWZmZXIpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyKGRldiwgMHgyMDAsIGNtZGJ1ZmZlciwgc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaW9jdGwuaAppbmRleCAyNGI4ZDc3Li40MTllNTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9pb2N0bC5oCkBAIC0zMCw3ICszMCw3IEBACiAKIHR5cGVkZWYgc3RydWN0IF9JT0NUTF9HRVRfVkVSIHsKICAgICB1bnNpZ25lZCBsb25nIGRydl92ZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBJT0NUTF9HRVRfVkVSLCAqUElPQ1RMX0dFVF9WRVI7Cit9IF9fcGFja2VkIElPQ1RMX0dFVF9WRVIsICpQSU9DVExfR0VUX1ZFUjsKIAogLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIERzcCBzdGF0aXN0aWNzICovCiB0eXBlZGVmIHN0cnVjdCBfSU9DVExfR0VUX0RTUF9TVEFUIHsKQEAgLTY3LDE5ICs2NywxOSBAQAogICAgIHVuc2lnbmVkIGxvbmcgQ29uVG07ICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIGNvbm5lY3Rpb24gdGltZSBpbiBzZWNvbmRzICovCiAgICAgdW5zaWduZWQgY2hhciBDYWxWZXJbQ0FMVkVSU1pdOyAgICAgICAvKiBQcm9wcmlldGFyeSBDYWxpYnJhdGlvbiBWZXJzaW9uICovCiAgICAgdW5zaWduZWQgY2hhciBDYWxEYXRlW0NBTERBVEVTWl07ICAgICAvKiBQcm9wcmlldGFyeSBDYWxpYnJhdGlvbiBEYXRlICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBJT0NUTF9HRVRfRFNQX1NUQVQsICpQSU9DVExfR0VUX0RTUF9TVEFUOworfSBfX3BhY2tlZCBJT0NUTF9HRVRfRFNQX1NUQVQsICpQSU9DVExfR0VUX0RTUF9TVEFUOwogCiAvKiBEYXRhIHN0cnVjdHVyZSBmb3IgRHVhbCBQb3J0ZWQgUkFNIG1lc3NhZ2luZyBiZXR3ZWVuIEhvc3QgYW5kIERzcCAqLwogdHlwZWRlZiBzdHJ1Y3QgX0lPQ1RMX0RQUkFNX0JMSyB7CiAgICAgdW5zaWduZWQgc2hvcnQgdG90YWxfbGVuOwogCXN0cnVjdCBwc2V1ZG9faGRyIHBzZXVkb2hkcjsKICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNzgwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIElPQ1RMX0RQUkFNX0JMSywgKlBJT0NUTF9EUFJBTV9CTEs7Cit9IF9fcGFja2VkIElPQ1RMX0RQUkFNX0JMSywgKlBJT0NUTF9EUFJBTV9CTEs7CiAKIHR5cGVkZWYgc3RydWN0IF9JT0NUTF9EUFJBTV9DT01NQU5EIHsKICAgICB1bnNpZ25lZCBzaG9ydCBleHRyYTsKICAgICBJT0NUTF9EUFJBTV9CTEsgZHByYW1fYmxrOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSU9DVExfRFBSQU1fQ09NTUFORCwgKlBJT0NUTF9EUFJBTV9DT01NQU5EOworfSBfX3BhY2tlZCBJT0NUTF9EUFJBTV9DT01NQU5ELCAqUElPQ1RMX0RQUkFNX0NPTU1BTkQ7CiAKIC8qCiAqIEN1c3RvbSBJT0NUTCBjb21tYW5kIGNvZGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAuaAppbmRleCAxNzVhYmZhLi5jY2I4MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLmgKQEAgLTIxLDM0ICsyMSw2NCBAQAogI2RlZmluZQlGVDEwMDBfUkVHX1NVUF9DVFJMCTB4MDAyMAkvKiBIQ1RSIC0gSG9zdCBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lCUZUMTAwMF9SRUdfU1VQX1NUQVQJMHgwMDIyCS8qIEhTVEFUIC0gSG9zdCBTdGF0dXMgUmVnaXN0ZXIgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19SRVNFVAkweDAwMjQJLyogSENUUiAtIEhvc3QgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlGVDEwMDBfUkVHX1NVUF9JU1IJMHgwMDI2CS8qIEhJU1IgLSBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRlQxMDAwX1JFR19TVVBfSVNSCTB4MDAyNgkvKiBISVNSIC0gSG9zdCBJbnRlcnJ1cHQgU3RhdHVzCisJCQkJCSAqIFJlZ2lzdGVyCisJCQkJCSAqLwogI2RlZmluZQlGVDEwMDBfUkVHX1NVUF9JTUFTSwkweDAwMjgJLyogSElNQVNLIC0gSG9zdCBJbnRlcnJ1cHQgTWFzayAqLwogI2RlZmluZQlGVDEwMDBfUkVHX0RPT1JCRUxMCTB4MDAyYQkvKiBEQkVMTCAtIERvb3IgQmVsbCBSZWdpc3RlciAqLwotI2RlZmluZSBGVDEwMDBfUkVHX0FTSUNfSUQJMHgwMDJlCS8qIEFTSUNJRCAtIEFTSUMgSWRlbnRpZmljYXRpb24gTnVtYmVyICovCisjZGVmaW5lIEZUMTAwMF9SRUdfQVNJQ19JRAkweDAwMmUJLyogQVNJQ0lEIC0gQVNJQyBJZGVudGlmaWNhdGlvbgorCQkJCQkgKiBOdW1iZXIKKwkJCQkJICovCiAKIC8qIE1FTU9SWSBNQVAgRk9SIEVMRUNUUkFCVVpaIEFTSUMgKi8KICNkZWZpbmUgRlQxMDAwX1JFR19VRklGT19TVEFUCTB4MDAwMAkvKiBVRlNSIC0gVXBsaW5rIEZJRk8gc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfVUZJRk9fQkVHCTB4MDAwMgkvKiBVRkJSCS0gVXBsaW5rIEZJRk8gYmVnaW5uaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lIEZUMTAwMF9SRUdfVUZJRk9fQkVHCTB4MDAwMgkvKiBVRkJSCS0gVXBsaW5rIEZJRk8gYmVnaW5uaW5nCisJCQkJCSAqIHJlZ2lzdGVyCisJCQkJCSAqLwogI2RlZmluZQlGVDEwMDBfUkVHX1VGSUZPX01JRAkweDAwMDQJLyogVUZNUgktIFVwbGluayBGSUZPIG1pZGRsZSByZWdpc3RlciAqLwogI2RlZmluZQlGVDEwMDBfUkVHX1VGSUZPX0VORAkweDAwMDYJLyogVUZFUgktIFVwbGluayBGSUZPIGVuZCByZWdpc3RlciAqLwotI2RlZmluZQlGVDEwMDBfUkVHX0RGSUZPX1NUQVQJMHgwMDA4CS8qIERGU1IgLSBEb3dubGluayBGSUZPIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlGVDEwMDBfUkVHX0RGSUZPX1NUQVQJMHgwMDA4CS8qIERGU1IgLSBEb3dubGluayBGSUZPIHN0YXR1cworCQkJCQkgKiByZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19ERklGTwkweDAwMEEJLyogREZSIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlciAqLwotI2RlZmluZQlGVDEwMDBfUkVHX0RQUkFNX0RBVEEJMHgwMDBDCS8qIERQUkFNIC0gRHVhbCBQb3J0IEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRlQxMDAwX1JFR19EUFJBTV9EQVRBCTB4MDAwQwkvKiBEUFJBTSAtIER1YWwgUG9ydCBJbmRpcmVjdAorCQkJCQkgKiBEYXRhIFJlZ2lzdGVyCisJCQkJCSAqLwogI2RlZmluZQlGVDEwMDBfUkVHX1dBVEVSTUFSSwkweDAwMTAJLyogV01BUksgLSBXYXRlcm1hcmsgUmVnaXN0ZXIgKi8KIAogLyogTUVNT1JZIE1BUCBGT1IgTUFHTkVNSVRFICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1VGRFIJMHgwMDAwCS8qIFVGRFIgLSBVcGxpbmsgRklGTyBEYXRhIFJlZ2lzdGVyICgzMi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRkRSTAkweDAwMDAJLyogVUZEUkwgLSBVcGxpbmsgRklGTyBEYXRhIFJlZ2lzdGVyIGxvdy13b3JkICgxNi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRkRSSAkweDAwMDIJLyogVUZEUkggLSBVcGxpbmsgRklGTyBEYXRhIFJlZ2lzdGVyIGhpZ2gtd29yZCAoMTYtYml0cykgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUgkweDAwMDAJLyogVUZEUiAtIFVwbGluayBGSUZPIERhdGEKKwkJCQkJICogUmVnaXN0ZXIgKDMyLWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRkRSTAkweDAwMDAJLyogVUZEUkwgLSBVcGxpbmsgRklGTyBEYXRhCisJCQkJCSAqIFJlZ2lzdGVyIGxvdy13b3JkICgxNi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkgJMHgwMDAyCS8qIFVGRFJIIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlcgorCQkJCQkgKiBoaWdoLXdvcmQgKDE2LWJpdHMpCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRkVSCTB4MDAwNAkvKiBVRkVSIC0gVXBsaW5rIEZJRk8gRW5kIFJlZ2lzdGVyICovCiAjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1VGU1IJMHgwMDA2CS8qIFVGU1IgLSBVcGxpbmsgRklGTyBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSCTB4MDAwOAkvKiBERlIgLSBEb3dubGluayBGSUZPIFJlZ2lzdGVyICgzMi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlJMCTB4MDAwOAkvKiBERlJMIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSSAkweDAwMGEJLyogREZSSCAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIgaGlnaC13b3JkICgxNi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlNSCTB4MDAwYwkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfRFBEQVRBCTB4MDAxMAkvKiBEUERBVEEgLSBEdWFsIFBvcnQgUkFNIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgKDMyLWJpdHMpICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQUwJMHgwMDEwCS8qIERQREFUQUwgLSBEdWFsIFBvcnQgUkFNIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgbG93LXdvcmQgKDE2LWJpdHMpICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgJMHgwMDEyCS8qIERQREFUQUggLSBEdWFsIFBvcnQgUkFNIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgaGlnaC13b3JkICgxNi1iaXRzKSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlIJMHgwMDA4CS8qIERGUiAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIKKwkJCQkJICogKDMyLWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlJMCTB4MDAwOAkvKiBERlJMIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlcgorCQkJCQkgKiBsb3ctd29yZCAoMTYtYml0cykKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RGUkgJMHgwMDBhCS8qIERGUkggLSBEb3dubGluayBGSUZPIFJlZ2lzdGVyCisJCQkJCSAqIGhpZ2gtd29yZCAoMTYtYml0cykKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RGU1IJMHgwMDBjCS8qIERGU1IgLSBEb3dubGluayBGSUZPIFN0YXR1cworCQkJCQkgKiBSZWdpc3RlcgorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfRFBEQVRBCTB4MDAxMAkvKiBEUERBVEEgLSBEdWFsIFBvcnQgUkFNIEluZGlyZWN0CisJCQkJCSAqIERhdGEgUmVnaXN0ZXIgKDMyLWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19EUERBVEFMCTB4MDAxMAkvKiBEUERBVEFMIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdAorCQkJCQkgKiBEYXRhIFJlZ2lzdGVyIGxvdy13b3JkICgxNi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfRFBEQVRBSAkweDAwMTIJLyogRFBEQVRBSCAtIER1YWwgUG9ydCBSQU0gSW5kaXJlY3QgRGF0YQorCQkJCQkgKiBSZWdpc3RlciBoaWdoLXdvcmQgKDE2LWJpdHMpCisJCQkJCSAqLwogI2RlZmluZQlGVDEwMDBfUkVHX01BR19XQVRFUk1BUksgMHgwMDJjCS8qIFdNQVJLIC0gV2F0ZXJtYXJrIFJlZ2lzdGVyICovCiAjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1ZFUlNJT04JMHgwMDMwCS8qIExMQyBWZXJzaW9uICovCiAKQEAgLTU3LDcgKzg3LDkgQEAKICNkZWZpbmUgRlQxMDAwX0RQUkFNX1JYX0JBU0UJMHgwODAwCS8qIFBDIENhcmQgdG8gSG9zdCBNZXNzYWdpbmcgQXJlYSAqLwogI2RlZmluZSBGVDEwMDBfRklGT19MRU4JCTB4MDdGQwkvKiB0b3RhbCBsZW5ndGggZm9yIERTUCBGSUZPIHRyYWNraW5nICovCiAjZGVmaW5lIEZUMTAwMF9ISV9ITwkJMHgwN0ZFCS8qIGhlYXJ0YmVhdCB3aXRoIEhJL0hPICovCi0jZGVmaW5lIEZUMTAwMF9EU1BfU1RBVFVTCTB4MEZGRQkvKiBkc3Agc3RhdHVzIC0gbm9uLXplcm8gaXMgYSByZXF1ZXN0IHRvIHJlc2V0IGRzcCAqLworI2RlZmluZSBGVDEwMDBfRFNQX1NUQVRVUwkweDBGRkUJLyogZHNwIHN0YXR1cyAtIG5vbi16ZXJvIGlzIGEgcmVxdWVzdAorCQkJCQkgKiB0byByZXNldCBkc3AKKwkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9EU1BfTEVECQkweDBGRkEJLyogZHNwIGxlZCBzdGF0dXMgZm9yIFBBRCBkZXZpY2UgKi8KICNkZWZpbmUgRlQxMDAwX0RTUF9DT05fU1RBVEUJMHgwRkY4CS8qIERTUCBDb25uZWN0aW9uIFN0YXR1cyBJbmZvICovCiAjZGVmaW5lIEZUMTAwMF9EUFJBTV9GRUZFCTB4MDAwMgkvKiBsb2NhdGlvbiBmb3IgZHNwIHJlYWR5IGluZGljYXRvciAqLwpAQCAtNjcsMjYgKzk5LDQ4IEBACiAjZGVmaW5lIEZUMTAwMF9EU1BfVElNRVIzCTB4MUZGNgkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCiAKIC8qIFJlc2VydmVkIER1YWwgUG9ydCBSQU0gb2Zmc2V0cyBmb3IgTWFnbmVtaXRlICovCi0jZGVmaW5lIEZUMTAwMF9EUFJBTV9NQUdfVFhfQkFTRQkweDAwMDAJLyogSG9zdCB0byBQQyBDYXJkIE1lc3NhZ2luZyBBcmVhICovCi0jZGVmaW5lIEZUMTAwMF9EUFJBTV9NQUdfUlhfQkFTRQkweDAyMDAJLyogUEMgQ2FyZCB0byBIb3N0IE1lc3NhZ2luZyBBcmVhICovCisjZGVmaW5lIEZUMTAwMF9EUFJBTV9NQUdfVFhfQkFTRQkweDAwMDAJLyogSG9zdCB0byBQQyBDYXJkCisJCQkJCQkgKiBNZXNzYWdpbmcgQXJlYQorCQkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9EUFJBTV9NQUdfUlhfQkFTRQkweDAyMDAJLyogUEMgQ2FyZCB0byBIb3N0CisJCQkJCQkgKiBNZXNzYWdpbmcgQXJlYQorCQkJCQkJICovCiAKLSNkZWZpbmUgRlQxMDAwX01BR19GSUZPX0xFTgkJMHgxRkYJLyogdG90YWwgbGVuZ3RoIGZvciBEU1AgRklGTyB0cmFja2luZyAqLworI2RlZmluZSBGVDEwMDBfTUFHX0ZJRk9fTEVOCQkweDFGRgkvKiB0b3RhbCBsZW5ndGggZm9yIERTUAorCQkJCQkJICogRklGTyB0cmFja2luZworCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRklGT19MRU5fSU5EWAkweDEJLyogbG93LXdvcmQgaW5kZXggKi8KICNkZWZpbmUgRlQxMDAwX01BR19ISV9ITwkJMHgxRkYJLyogaGVhcnRiZWF0IHdpdGggSEkvSE8gKi8KICNkZWZpbmUgRlQxMDAwX01BR19ISV9IT19JTkRYCQkweDAJLyogaGlnaC13b3JkIGluZGV4ICovCi0jZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0xFRAkJMHgzRkUJLyogZHNwIGxlZCBzdGF0dXMgZm9yIFBBRCBkZXZpY2UgKi8KLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfTEVEX0lORFgJCTB4MAkvKiBkc3AgbGVkIHN0YXR1cyBmb3IgUEFEIGRldmljZSAqLworI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9MRUQJCTB4M0ZFCS8qIGRzcCBsZWQgc3RhdHVzIGZvcgorCQkJCQkJICogUEFEIGRldmljZQorCQkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYCQkweDAJLyogZHNwIGxlZCBzdGF0dXMgZm9yCisJCQkJCQkgKiBQQUQgZGV2aWNlCisJCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFCTB4M0ZFCS8qIERTUCBDb25uZWN0aW9uIFN0YXR1cyBJbmZvICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYCTB4MQkvKiBEU1AgQ29ubmVjdGlvbiBTdGF0dXMgSW5mbyAqLwotI2RlZmluZSBGVDEwMDBfTUFHX0RQUkFNX0ZFRkUJCTB4MDAwCS8qIGxvY2F0aW9uIGZvciBkc3AgcmVhZHkgaW5kaWNhdG9yICovCi0jZGVmaW5lIEZUMTAwMF9NQUdfRFBSQU1fRkVGRV9JTkRYCTB4MAkvKiBsb2NhdGlvbiBmb3IgZHNwIHJlYWR5IGluZGljYXRvciAqLwotI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjAJCTB4M0ZDCS8qIFRpbWVyIEZpZWxkIGZyb20gQmFzZXN0YXRpb24gKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EUFJBTV9GRUZFCQkweDAwMAkvKiBsb2NhdGlvbiBmb3IgZHNwIHJlYWR5CisJCQkJCQkgKiBpbmRpY2F0b3IKKwkJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfTUFHX0RQUkFNX0ZFRkVfSU5EWAkweDAJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeQorCQkJCQkJICogaW5kaWNhdG9yCisJCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIwCQkweDNGQwkvKiBUaW1lciBGaWVsZCBmcm9tCisJCQkJCQkgKiBCYXNlc3RhdGlvbgorCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYCTB4MQotI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjEJCTB4M0ZDCS8qIFRpbWVyIEZpZWxkIGZyb20gQmFzZXN0YXRpb24gKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIxCQkweDNGQwkvKiBUaW1lciBGaWVsZCBmcm9tCisJCQkJCQkgKiBCYXNlc3RhdGlvbgorCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYCTB4MAotI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjIJCTB4M0ZECS8qIFRpbWVyIEZpZWxkIGZyb20gQmFzZXN0YXRpb24gKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIyCQkweDNGRAkvKiBUaW1lciBGaWVsZCBmcm9tCisJCQkJCQkgKiBCYXNlc3RhdGlvbgorCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYCTB4MQotI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjMJCTB4M0ZECS8qIFRpbWVyIEZpZWxkIGZyb20gQmFzZXN0YXRpb24gKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIzCQkweDNGRAkvKiBUaW1lciBGaWVsZCBmcm9tCisJCQkJCQkgKiBCYXNlc3RhdGlvbgorCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYCTB4MAogI2RlZmluZSBGVDEwMDBfTUFHX1RPVEFMX0xFTgkJMHgyMDAKICNkZWZpbmUgRlQxMDAwX01BR19UT1RBTF9MRU5fSU5EWAkweDEKQEAgLTk5LDI0ICsxNTMsMzggQEAKICNkZWZpbmUgSE9TVF9JTlRGX0JFCTB4MQkvKiBIb3N0IGludGVyZmFjZSBiaWcgZW5kaWFuIG1vZGUgKi8KIAogLyogRlQxMDAwIHRvIEhvc3QgRG9vcmJlbGwgYXNzaWdubWVudHMgKi8KLSNkZWZpbmUgRlQxMDAwX0RCX0RQUkFNX1JYCTB4MDAwMQkvKiB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IERTUCBoYXMgZGF0YSBmb3IgaG9zdCBpbiBEUFJBTSAqLworI2RlZmluZSBGVDEwMDBfREJfRFBSQU1fUlgJMHgwMDAxCS8qIHRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgRFNQCisJCQkJCSAqIGhhcyBkYXRhIGZvciBob3N0IGluIERQUkFNCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfREJfRE5MRF9SWAkweDAwMDIJLyogRG93bmxvYWRlciBoYW5kc2hha2UgZG9vcmJlbGwgKi8KLSNkZWZpbmUgRlQxMDAwX0FTSUNfUkVTRVRfUkVRCTB4MDAwNAkvKiBEU1AgcmVxdWVzdGluZyBob3N0IHRvIHJlc2V0IHRoZSBBU0lDICovCi0jZGVmaW5lIEZUMTAwMF9EU1BfQVNJQ19SRVNFVAkweDAwMDgJLyogRFNQIGluZGljYXRpbmcgaG9zdCB0aGF0IGl0IHdpbGwgcmVzZXQgdGhlIEFTSUMgKi8KKyNkZWZpbmUgRlQxMDAwX0FTSUNfUkVTRVRfUkVRCTB4MDAwNAkvKiBEU1AgcmVxdWVzdGluZyBob3N0IHRvCisJCQkJCSAqIHJlc2V0IHRoZSBBU0lDCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfRFNQX0FTSUNfUkVTRVQJMHgwMDA4CS8qIERTUCBpbmRpY2F0aW5nIGhvc3QgdGhhdAorCQkJCQkgKiBpdCB3aWxsIHJlc2V0IHRoZSBBU0lDCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfREJfQ09ORF9SRVNFVAkweDAwMTAJLyogRFNQIHJlcXVlc3QgZm9yIGEgY2FyZCByZXNldC4gKi8KIAogLyogSG9zdCB0byBGVDEwMDAgRG9vcmJlbGwgYXNzaWdubWVudHMgKi8KLSNkZWZpbmUgRlQxMDAwX0RCX0RQUkFNX1RYCTB4MDEwMAkvKiB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IGhvc3QgaGFzIGRhdGEgZm9yIERTUCBpbiBEUFJBTS4gKi8KKyNkZWZpbmUgRlQxMDAwX0RCX0RQUkFNX1RYCTB4MDEwMAkvKiB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IGhvc3QKKwkJCQkJICogaGFzIGRhdGEgZm9yIERTUCBpbiBEUFJBTS4KKwkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9EQl9ETkxEX1RYCTB4MDIwMAkvKiBEb3dubG9hZGVyIGhhbmRzaGFrZSBkb29yYmVsbCAqLwogI2RlZmluZSBGVDEwMDBfQVNJQ19SRVNFVF9EU1AJMHgwNDAwCS8qIFJlc3BvbmRzIHRvIEZUMTAwMF9BU0lDX1JFU0VUX1JFUSAqLwotI2RlZmluZSBGVDEwMDBfREJfSEIJCTB4MTAwMAkvKiBJbmRpY2F0ZXMgdGhhdCBzdXBlcnZpc29yIGhhcyBhIGhlYXJ0YmVhdCBtZXNzYWdlIGZvciBEU1AuICovCisjZGVmaW5lIEZUMTAwMF9EQl9IQgkJMHgxMDAwCS8qIEluZGljYXRlcyB0aGF0IHN1cGVydmlzb3IgaGFzIGEKKwkJCQkJICogaGVhcnRiZWF0IG1lc3NhZ2UgZm9yIERTUC4KKwkJCQkJICovCiAKICNkZWZpbmUgaGkJCQkweDY4NjkJLyogUEMgQ2FyZCBoZWFydGJlYXQgdmFsdWVzICovCiAjZGVmaW5lIGhvCQkJMHg2ODZmCS8qIFBDIENhcmQgaGVhcnRiZWF0IHZhbHVlcyAqLwogCiAvKiBNYWduZW1pdGUgc3BlY2lmaWMgZGVmaW5lcyAqLwotI2RlZmluZSBoaV9tYWcJCQkweDY5NjgJLyogQnl0ZSBzd2FwIGhpIHRvIGF2b2lkIGFkZGl0aW9uYWwgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgaG9fbWFnCQkJMHg2ZjY4CS8qIEJ5dGUgc3dhcCBobyB0byBhdm9pZCBhZGRpdGlvbmFsIHN5c3RlbSBjYWxsICovCisjZGVmaW5lIGhpX21hZwkJCTB4Njk2OAkvKiBCeXRlIHN3YXAgaGkgdG8gYXZvaWQKKwkJCQkJICogYWRkaXRpb25hbCBzeXN0ZW0gY2FsbAorCQkJCQkgKi8KKyNkZWZpbmUgaG9fbWFnCQkJMHg2ZjY4CS8qIEJ5dGUgc3dhcCBobyB0byBhdm9pZAorCQkJCQkgKiBhZGRpdGlvbmFsIHN5c3RlbSBjYWxsCisJCQkJCSAqLwogCiAvKiBCaXQgZmllbGQgZGVmaW5pdGlvbnMgZm9yIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwogLyogSW5kaWNhdGUgdGhlIGNhdXNlIG9mIGFuIGludGVycnVwdC4gKi8KQEAgLTEzMywxMyArMjAxLDE5IEBACiAjZGVmaW5lIElTUl9NQVNLX1JDVgkJMHgwMDA0CS8qIERvd25saW5rIFBhY2tldCBhdmFpbGFibGUgbWFzayAqLwogI2RlZmluZSBJU1JfTUFTS19XQVRFUk1BUksJMHgwMDA4CS8qIFdhdGVybWFyayBpbnRlcnJ1cHQgbWFzayAqLwogI2RlZmluZSBJU1JfTUFTS19BTEwJCTB4ZmZmZgkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzICovCi0vKiBEZWZhdWx0IGludGVycnVwdCBtYXNrIChFbmFibGUgRG9vcmJlbGwgcGVuZGluZyBhbmQgUGFja2V0IGF2YWlsYWJsZSBpbnRlcnJ1cHRzKSAqLworLyogRGVmYXVsdCBpbnRlcnJ1cHQgbWFzaworICogKEVuYWJsZSBEb29yYmVsbCBwZW5kaW5nIGFuZCBQYWNrZXQgYXZhaWxhYmxlIGludGVycnVwdHMpCisgKi8KICNkZWZpbmUgSVNSX0RFRkFVTFRfTUFTSwkweDdmZjkKIAogLyogQml0IGZpZWxkIGRlZmluaXRpb24gZm9yIEhvc3QgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBEU1BfUkVTRVRfQklUCQkweDAwMDEJLyogQml0IGZpZWxkIHRvIGNvbnRyb2wgZHNwIHJlc2V0IHN0YXRlICovCisjZGVmaW5lIERTUF9SRVNFVF9CSVQJCTB4MDAwMQkvKiBCaXQgZmllbGQgdG8gY29udHJvbAorCQkJCQkgKiBkc3AgcmVzZXQgc3RhdGUKKwkJCQkJICovCiAJCQkJCS8qICgwID0gb3V0IG9mIHJlc2V0IDEgPSByZXNldCkgKi8KLSNkZWZpbmUgQVNJQ19SRVNFVF9CSVQJCTB4MDAwMgkvKiBCaXQgZmllbGQgdG8gY29udHJvbCBBU0lDIHJlc2V0IHN0YXRlICovCisjZGVmaW5lIEFTSUNfUkVTRVRfQklUCQkweDAwMDIJLyogQml0IGZpZWxkIHRvIGNvbnRyb2wKKwkJCQkJICogQVNJQyByZXNldCBzdGF0ZQorCQkJCQkgKi8KIAkJCQkJLyogKDAgPSBvdXQgb2YgcmVzZXQgMSA9IHJlc2V0KSAqLwogI2RlZmluZSBEU1BfVU5FTkNSWVBURUQJCTB4MDAwNAogI2RlZmluZSBEU1BfRU5DUllQVEVECQkweDAwMDgKQEAgLTE5NSw3ICsyNjksOSBAQAogCXVuc2lnbmVkIGNoYXIJc291cmNlOwkJLyogaGFyZHdhcmUgc291cmNlIGlkICovCiAJCQkJCS8qICAgIEhvc3QgPSAweDEwICovCiAJCQkJCS8qICAgIERzcCAgPSAweDIwICovCi0JdW5zaWduZWQgY2hhcglkZXN0aW5hdGlvbjsJLyogaGFyZHdhcmUgZGVzdGluYXRpb24gaWQgKHJlZmVyIHRvIHNvdXJjZSkgKi8KKwl1bnNpZ25lZCBjaGFyCWRlc3RpbmF0aW9uOwkvKiBoYXJkd2FyZSBkZXN0aW5hdGlvbiBpZAorCQkJCQkgKiAocmVmZXIgdG8gc291cmNlKQorCQkJCQkgKi8KIAl1bnNpZ25lZCBjaGFyCXBvcnRkZXN0OwkvKiBzb2Z0d2FyZSBkZXN0aW5hdGlvbiBwb3J0IGlkICovCiAJCQkJCS8qICAgIEhvc3QgPSAweDAwICovCiAJCQkJCS8qICAgIEFwcGxpY2F0b24gQnJvYWRjYXN0ID0gMHgxMCAqLwpAQCAtMjA0LDcgKzI4MCw5IEBACiAJCQkJCS8qICAgIERzcCBBaXJsaW5rID0gMHg5MCAqLwogCQkJCQkvKiAgICBEc3AgTG9hZGVyID0gMHhhMCAqLwogCQkJCQkvKiAgICBEc3AgTUlQID0gMHhiMCAqLwotCXVuc2lnbmVkIGNoYXIJcG9ydHNyYzsJLyogc29mdHdhcmUgc291cmNlIHBvcnQgaWQgKHJlZmVyIHRvIHBvcnRkZXN0KSAqLworCXVuc2lnbmVkIGNoYXIJcG9ydHNyYzsJLyogc29mdHdhcmUgc291cmNlIHBvcnQgaWQKKwkJCQkJICogKHJlZmVyIHRvIHBvcnRkZXN0KQorCQkJCQkgKi8KIAl1bnNpZ25lZCBzaG9ydAlzaF9zdHJfaWQ7CS8qIG5vdCB1c2VkICovCiAJdW5zaWduZWQgY2hhcgljb250cm9sOwkvKiBub3QgdXNlZCAqLwogCXVuc2lnbmVkIGNoYXIJcnN2ZDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jCmluZGV4IDhhZjEzNmUuLmIyMjE0MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jCkBAIC0yMDM2LDYgKzIwMzYsMTMgQEAKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwZWVyLT5jb25uZWN0LCBDT05ORUNUX1JFVFJZX0RFTEFZKTsKIH0KIAorc3RhdGljIHZvaWQgZndzZXJpYWxfcGVlcl93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBmd3R0eV9wZWVyICpwZWVyID0gdG9fcGVlcih3b3JrLCB3b3JrKTsKKworCXBlZXItPndvcmtmbih3b3JrKTsKK30KKwogLyoqCiAgKiBmd3NlcmlhbF9hZGRfcGVlciAtIGFkZCBhIG5ld2x5IHByb2JlZCAnc2VyaWFsJyB1bml0IGRldmljZSBhcyBhICdwZWVyJwogICogQHNlcmlhbDogYWdncmVnYXRlIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWMgZndfY2FyZCB0byBhZGQgdGhlIHBlZXIgdG8KQEAgLTIxMDAsNyArMjEwNyw3IEBACiAJcGVlci0+cG9ydCA9IE5VTEw7CiAKIAlpbml0X3RpbWVyKCZwZWVyLT50aW1lcik7Ci0JSU5JVF9XT1JLKCZwZWVyLT53b3JrLCBOVUxMKTsKKwlJTklUX1dPUksoJnBlZXItPndvcmssIGZ3c2VyaWFsX3BlZXJfd29ya2ZuKTsKIAlJTklUX0RFTEFZRURfV09SSygmcGVlci0+Y29ubmVjdCwgZndzZXJpYWxfYXV0b19jb25uZWN0KTsKIAogCS8qIGFzc29jaWF0ZSBwZWVyIHdpdGggc3BlY2lmaWMgZndfY2FyZCAqLwpAQCAtMjcwMiw3ICsyNzA5LDcgQEAKIAogCQl9IGVsc2UgewogCQkJcGVlci0+d29ya19wYXJhbXMucGx1Z19yZXEgPSBwa3QtPnBsdWdfcmVxOwotCQkJUFJFUEFSRV9XT1JLKCZwZWVyLT53b3JrLCBmd3NlcmlhbF9oYW5kbGVfcGx1Z19yZXEpOworCQkJcGVlci0+d29ya2ZuID0gZndzZXJpYWxfaGFuZGxlX3BsdWdfcmVxOwogCQkJcXVldWVfd29yayhzeXN0ZW1fdW5ib3VuZF93cSwgJnBlZXItPndvcmspOwogCQl9CiAJCWJyZWFrOwpAQCAtMjczMSw3ICsyNzM4LDcgQEAKIAkJCWZ3dHR5X2VycigmcGVlci0+dW5pdCwgInVucGx1ZyByZXE6IGJ1c3lcbiIpOwogCQkJcmNvZGUgPSBSQ09ERV9DT05GTElDVF9FUlJPUjsKIAkJfSBlbHNlIHsKLQkJCVBSRVBBUkVfV09SSygmcGVlci0+d29yaywgZndzZXJpYWxfaGFuZGxlX3VucGx1Z19yZXEpOworCQkJcGVlci0+d29ya2ZuID0gZndzZXJpYWxfaGFuZGxlX3VucGx1Z19yZXE7CiAJCQlxdWV1ZV93b3JrKHN5c3RlbV91bmJvdW5kX3dxLCAmcGVlci0+d29yayk7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5oCmluZGV4IDU0ZjdmOWIuLjk4Yjg1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5oCkBAIC05MSw2ICs5MSw3IEBACiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiAKIAlzcGlubG9ja190CQlsb2NrOworCXdvcmtfZnVuY190CQl3b3JrZm47CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAJc3RydWN0IHBlZXJfd29ya19wYXJhbXMgd29ya19wYXJhbXM7CiAJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKaW5kZXggNzRhMDM2MC4uNjRjNTViOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYwpAQCAtMTMxLDcgKzEzMSw4IEBACiAKIAkvKiBHZXQgdGhlIHBvaW50ZXIgb2YgdGhlIG9yaWdpbmFsIHJlcXVlc3QgKi8KIAlhcnBfaW4gPSAoc3RydWN0IGFycGhkciAqKShza2JfaW4tPmRhdGEgKyBtYWNfaGVhZGVyX2xlbik7Ci0JYXJwX2RhdGFfaW4gPSAoc3RydWN0IGFycGRhdGEgKikoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IGFycGhkcikpOworCWFycF9kYXRhX2luID0gKHN0cnVjdCBhcnBkYXRhICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhcnBoZHIpKTsKIAogCS8qIEdldCB0aGUgcG9pbnRlciBvZiB0aGUgb3V0Z29pbmcgcmVzcG9uc2UgKi8KIAlhcnBfb3V0ID0gKHN0cnVjdCBhcnBoZHIgKilhcnBfdGVtcDsKQEAgLTE2MCw5ICsxNjEsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2tiX3Jlc2VydmUoc2tiX291dCwgTkVUX0lQX0FMSUdOKTsKIAotCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIG1hY19oZWFkZXJfbGVuKSwgbWFjX2hlYWRlcl9kYXRhLCBtYWNfaGVhZGVyX2xlbik7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpKSwgYXJwX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpKTsKLQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBzaXplb2Yoc3RydWN0IGFycGRhdGEpKSwgYXJwX2RhdGFfb3V0LCBzaXplb2Yoc3RydWN0IGFycGRhdGEpKTsKKwltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBtYWNfaGVhZGVyX2xlbiksIG1hY19oZWFkZXJfZGF0YSwKKwkJbWFjX2hlYWRlcl9sZW4pOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSksIGFycF9vdXQsCisJCXNpemVvZihzdHJ1Y3QgYXJwaGRyKSk7CisJbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBkYXRhKSksIGFycF9kYXRhX291dCwKKwkJc2l6ZW9mKHN0cnVjdCBhcnBkYXRhKSk7CiAKIAlza2Jfb3V0LT5wcm90b2NvbCA9ICgoc3RydWN0IGV0aGhkciAqKW1hY19oZWFkZXJfZGF0YSktPmhfcHJvdG87CiAJc2tiX291dC0+ZGV2ID0gc2tiX2luLT5kZXY7CkBAIC0xOTgsNyArMjAyLDcgQEAKIAlwc2V1ZG9faGVhZGVyLnBoLnBoX254dCA9IGlwdjYtPm5leHRoZHI7CiAKIAl3ID0gKHUxNiAqKSZwc2V1ZG9faGVhZGVyOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHNldWRvX2hlYWRlci5wYSkgLyBzaXplb2YocHNldWRvX2hlYWRlci5wYVswXSk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwc2V1ZG9faGVhZGVyLnBhKTsgaSsrKQogCQlzdW0gKz0gcHNldWRvX2hlYWRlci5wYVtpXTsKIAogCXcgPSBwdHI7CkBAIC0yNjAsMTEgKzI2NCwxNCBAQAogCQlyZXR1cm4gLTE7CiAKIAkvKiBDaGVjayBpZiB0aGlzIGlzIE5EUCBwYWNrZXQgKi8KLQlpY21wNl9pbiA9IChzdHJ1Y3QgaWNtcDZoZHIgKikoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlpY21wNl9pbiA9IChzdHJ1Y3QgaWNtcDZoZHIgKikoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4gKworCQkJCQlzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAlpZiAoaWNtcDZfaW4tPmljbXA2X3R5cGUgPT0gTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTikgeyAvKiBDaGVjayBSUyAqLwogCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIGlmIChpY21wNl9pbi0+aWNtcDZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OKSB7IC8qIENoZWNrIE5TICovCi0JCXU4IGljbXBfbmFbc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKyBzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KV07CisJfSBlbHNlIGlmIChpY21wNl9pbi0+aWNtcDZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OKSB7CisJCS8qIENoZWNrIE5TICovCisJCXU4IGljbXBfbmFbc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKworCQkJc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCldOwogCQl1OCB6ZXJvX2FkZHI4WzE2XSA9IHswLH07CiAKIAkJaWYgKG1lbWNtcChpcHY2X2luLT5zYWRkci5pbjZfdS51Nl9hZGRyOCwgemVyb19hZGRyOCwgMTYpID09IDApCkBAIC0yNzYsNyArMjgzLDkgQEAKIAkJaWNtcDZfb3V0LmljbXA2X2Nrc3VtID0gMDsKIAkJaWNtcDZfb3V0LmljbXA2X2RhdGF1bi51bl9kYXRhMzJbMF0gPSBodG9ubCgweDYwMDAwMDAwKTsgLyogUj0wLCBTPTEsIE89MSAqLwogCi0JCW5zID0gKHN0cnVjdCBuZWlnaGJvdXJfc29saWNpdGF0aW9uICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKKwkJbnMgPSAoc3RydWN0IG5laWdoYm91cl9zb2xpY2l0YXRpb24gKikKKwkJCShza2JfaW4tPmRhdGEgKyBtYWNfaGVhZGVyX2xlbiArCisJCQkgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKIAkJbWVtY3B5KCZuYS50YXJnZXRfYWRkcmVzcywgbnMtPnRhcmdldF9hZGRyZXNzLCAxNik7CiAJCW5hLnR5cGUgPSAweDAyOwogCQluYS5sZW5ndGggPSAxOwpAQCAtMjg5LDEzICsyOTgsMTcgQEAKIAogCQltZW1jcHkoJmlwdjZfb3V0LCBpcHY2X2luLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAkJbWVtY3B5KGlwdjZfb3V0LnNhZGRyLmluNl91LnU2X2FkZHI4LCAmbmEudGFyZ2V0X2FkZHJlc3MsIDE2KTsKLQkJbWVtY3B5KGlwdjZfb3V0LmRhZGRyLmluNl91LnU2X2FkZHI4LCBpcHY2X2luLT5zYWRkci5pbjZfdS51Nl9hZGRyOCwgMTYpOwotCQlpcHY2X291dC5wYXlsb2FkX2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpOworCQltZW1jcHkoaXB2Nl9vdXQuZGFkZHIuaW42X3UudTZfYWRkcjgsCisJCQlpcHY2X2luLT5zYWRkci5pbjZfdS51Nl9hZGRyOCwgMTYpOworCQlpcHY2X291dC5wYXlsb2FkX2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsKKwkJCQlzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSk7CiAKIAkJbWVtY3B5KGljbXBfbmEsICZpY21wNl9vdXQsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKLQkJbWVtY3B5KGljbXBfbmEgKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSwgJm5hLCBzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSk7CisJCW1lbWNweShpY21wX25hICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksICZuYSwKKwkJCXNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKTsKIAotCQlpY21wNl9vdXQuaWNtcDZfY2tzdW0gPSBpY21wNl9jaGVja3N1bSgmaXB2Nl9vdXQsICh1MTYgKilpY21wX25hLCBzaXplb2YoaWNtcF9uYSkpOworCQlpY21wNl9vdXQuaWNtcDZfY2tzdW0gPSBpY21wNl9jaGVja3N1bSgmaXB2Nl9vdXQsCisJCQkJCSh1MTYgKilpY21wX25hLCBzaXplb2YoaWNtcF9uYSkpOwogCX0gZWxzZSB7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0zMTEsMTAgKzMyNCwxNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlza2JfcmVzZXJ2ZShza2Jfb3V0LCBORVRfSVBfQUxJR04pOwogCi0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgbWFjX2hlYWRlcl9sZW4pLCBtYWNfaGVhZGVyX2RhdGEsIG1hY19oZWFkZXJfbGVuKTsKLQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSwgJmlwdjZfb3V0LCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSksICZpY21wNl9vdXQsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKLQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSksICZuYSwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIG1hY19oZWFkZXJfbGVuKSwgbWFjX2hlYWRlcl9kYXRhLAorCQltYWNfaGVhZGVyX2xlbik7CisJbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSksICZpcHY2X291dCwKKwkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpLCAmaWNtcDZfb3V0LAorCQlzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpLCAmbmEsCisJCXNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKTsKIAogCXNrYl9vdXQtPnByb3RvY29sID0gKChzdHJ1Y3QgZXRoaGRyICopbWFjX2hlYWRlcl9kYXRhKS0+aF9wcm90bzsKIAlza2Jfb3V0LT5kZXYgPSBza2JfaW4tPmRldjsKQEAgLTM2Myw3ICszODAsOCBAQAogCiAJCS8qIENoZWNrIERIQ1B2NCAqLwogCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7Ci0JCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPSAoc3RydWN0IHVkcGhkciAqKShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPSAoc3RydWN0IHVkcGhkciAqKQorCQkJCQkobmV0d29ya19kYXRhICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCQkJaWYgKG50b2hzKHVkcC0+ZGVzdCkgPT0gNjcgfHwgbnRvaHModWRwLT5kZXN0KSA9PSA2OCkKIAkJCQluaWNfdHlwZSB8PSBOSUNfVFlQRV9GX0RIQ1A7CiAJCX0KQEAgLTM3MywxMiArMzkxLDEzIEBACiAJCWlwdjYgPSAoc3RydWN0IGlwdjZoZHIgKiluZXR3b3JrX2RhdGE7CiAKIAkJaWYgKGlwdjYtPm5leHRoZHIgPT0gSVBQUk9UT19JQ01QVjYpIC8qIENoZWNrIE5EUCByZXF1ZXN0ICovIHsKLQkJCXN0cnVjdCBpY21wNmhkciAqaWNtcDYgPSAoc3RydWN0IGljbXA2aGRyICopKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwotCQkJaWYgKC8qaWNtcDYtPmljbXA2X3R5cGUgPT0gTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTiB8fCAqLwotCQkJCWljbXA2LT5pY21wNl90eXBlID09IE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT04pCisJCQlzdHJ1Y3QgaWNtcDZoZHIgKmljbXA2ID0gKHN0cnVjdCBpY21wNmhkciAqKQorCQkJCQkobmV0d29ya19kYXRhICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJCQlpZiAoaWNtcDYtPmljbXA2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTikKIAkJCQluaWNfdHlwZSB8PSBOSUNfVFlQRV9JQ01QVjY7CiAJCX0gZWxzZSBpZiAoaXB2Ni0+bmV4dGhkciA9PSBJUFBST1RPX1VEUCkgLyogQ2hlY2sgREhDUHY2ICovIHsKLQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IChzdHJ1Y3QgdWRwaGRyICopKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQkJc3RydWN0IHVkcGhkciAqdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikKKwkJCQkJKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCQkJaWYgKG50b2hzKHVkcC0+ZGVzdCkgPT0gNTQ2IHx8IG50b2hzKHVkcC0+ZGVzdCkgPT0gNTQ3KQogCQkJCW5pY190eXBlIHw9IE5JQ19UWVBFX0ZfREhDUDsKIAkJfQpAQCAtNDIwLDExICs0MzksMTIgQEAKIAl9CiAKIAkvKgotCU5lZWQgYnl0ZSBzaGlmdCAodGhhdCBpcywgcmVtb3ZlIFZMQU4gdGFnKSBpZiB0aGVyZSBpcyBvbmUKLQlGb3IgdGhlIGNhc2Ugb2YgQVJQLCB0aGlzIGJyZWFrcyB0aGUgb2Zmc2V0IGFzIHZsYW5fZXRoaGRyKzQgaXMgdHJlYXRlZCBhcyBldGhoZHIKLQlIb3dldmVyLCBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGFzIHRoZSByZXNwb25zZSBzdGFydHMgZnJvbSBhcnBfaGRyIGFuZCBldGhoZHIKLQlpcyBjcmVhdGVkIGJ5IHRoaXMgZHJpdmVyIGJhc2VkIG9uIHRoZSBOSUMgbWFjCi0JKi8KKwkgKiBOZWVkIGJ5dGUgc2hpZnQgKHRoYXQgaXMsIHJlbW92ZSBWTEFOIHRhZykgaWYgdGhlcmUgaXMgb25lCisJICogRm9yIHRoZSBjYXNlIG9mIEFSUCwgdGhpcyBicmVha3MgdGhlIG9mZnNldCBhcyB2bGFuX2V0aGhkcis0CisJICogaXMgdHJlYXRlZCBhcyBldGhoZHIJSG93ZXZlciwgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBhcworCSAqIHRoZSByZXNwb25zZSBzdGFydHMgZnJvbSBhcnBfaGRyIGFuZCBldGhoZHIgaXMgY3JlYXRlZCBieSB0aGlzCisJICogZHJpdmVyIGJhc2VkIG9uIHRoZSBOSUMgbWFjCisJICovCiAJaWYgKG5pY190eXBlICYgTklDX1RZUEVfRl9WTEFOKSB7CiAJCXN0cnVjdCB2bGFuX2V0aGhkciAqdmxhbl9ldGggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5kYXRhOwogCQluaWMtPnZsYW5faWQgPSBudG9ocyh2bGFuX2V0aC0+aF92bGFuX1RDSSkgJiBWTEFOX1ZJRF9NQVNLOwpAQCAtNDM2LDE1ICs0NTYsMjMgQEAKIAkJZGF0YV9sZW4gPSBza2ItPmxlbjsKIAl9CiAKLQkvKiBJZiBpdCBpcyBhIElDTVBWNiBwYWNrZXQsIGNsZWFyIGFsbCB0aGUgb3RoZXIgYml0cyA6IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZpcm13YXJlICovCisJLyogSWYgaXQgaXMgYSBJQ01QVjYgcGFja2V0LCBjbGVhciBhbGwgdGhlIG90aGVyIGJpdHMgOgorCSAqIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZpcm13YXJlCisJICovCiAJaWYgKG5pY190eXBlICYgTklDX1RZUEVfSUNNUFY2KQogCQluaWNfdHlwZSA9IE5JQ19UWVBFX0lDTVBWNjsKIAotCS8qIElmIGl0IGlzIG5vdCBhIGRoY3AgcGFja2V0LCBjbGVhciBhbGwgdGhlIGZsYWcgYml0cyA6IG9yaWdpbmFsIE5JQywgb3RoZXJ3aXNlIHRoZSBzcGVjaWFsIGZsYWcgKElQVlggfCBESENQKSAqLworCS8qIElmIGl0IGlzIG5vdCBhIGRoY3AgcGFja2V0LCBjbGVhciBhbGwgdGhlIGZsYWcgYml0cyA6CisJICogb3JpZ2luYWwgTklDLCBvdGhlcndpc2UgdGhlIHNwZWNpYWwgZmxhZyAoSVBWWCB8IERIQ1ApCisJICovCiAJaWYgKCEobmljX3R5cGUgJiBOSUNfVFlQRV9GX0RIQ1ApKQogCQluaWNfdHlwZSAmPSBOSUNfVFlQRV9NQVNLOwogCi0Jc3NjYW5mKGRldi0+bmFtZSwgImx0ZSVkIiwgJmlkeCk7CisJcmV0ID0gc3NjYW5mKGRldi0+bmFtZSwgImx0ZSVkIiwgJmlkeCk7CisJaWYgKHJldCAhPSAxKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJcmV0ID0gbmljLT5waHlfZGV2LT5zZW5kX3NkdV9mdW5jKG5pYy0+cGh5X2Rldi0+cHJpdl9kZXYsCiAJCQkJCSAgZGF0YV9idWYsIGRhdGFfbGVuLApAQCAtNDg1LDggKzUxMywxMSBAQAogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGhjaV9wYWNrZXQgKmhjaSA9IChzdHJ1Y3QgaGNpX3BhY2tldCAqKWJ1ZjsKIAlpbnQgaWR4OworCWludCByZXQ7CiAKLQlzc2NhbmYoZGV2LT5uYW1lLCAibHRlJWQiLCAmaWR4KTsKKwlyZXQgPSBzc2NhbmYoZGV2LT5uYW1lLCAibHRlJWQiLCAmaWR4KTsKKwlpZiAocmV0ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIG5ldGxpbmtfc2VuZChsdGVfZXZlbnQuc29jaywgaWR4LCAwLCBidWYsCiAJCQkgICAgZ2RtX2RldjE2X3RvX2NwdSgKQEAgLTQ5NSw3ICs1MjYsOCBAQAogCQkJICAgICsgSENJX0hFQURFUl9TSVpFKTsKIH0KIAotc3RhdGljIHZvaWQgZ2RtX2x0ZV9ldmVudF9yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHR5cGUsIHZvaWQgKm1zZywgaW50IGxlbikKK3N0YXRpYyB2b2lkIGdkbV9sdGVfZXZlbnRfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLAorCQkJCXZvaWQgKm1zZywgaW50IGxlbikKIHsKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC01MzYsNyArNTY4LDggQEAKIAlyZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyB2b2lkIGdkbV9sdGVfbmV0aWZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ2dlZF9uaWNfdHlwZSkKK3N0YXRpYyB2b2lkIGdkbV9sdGVfbmV0aWZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLAorCQkJaW50IGxlbiwgaW50IGZsYWdnZWRfbmljX3R5cGUpCiB7CiAJdTMyIG5pY190eXBlOwogCXN0cnVjdCBuaWMgKm5pYzsKQEAgLTU1MSwyOCArNTg0LDQ2IEBACiAJbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChmbGFnZ2VkX25pY190eXBlICYgTklDX1RZUEVfRl9ESENQKSB7Ci0JCS8qIENoYW5nZSB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgd2l0aCB0aGUgb25lIHJlcXVlc3RlZCB0aGUgSVAgKi8KKwkJLyogQ2hhbmdlIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcworCQkgKiB3aXRoIHRoZSBvbmUgcmVxdWVzdGVkIHRoZSBJUAorCQkgKi8KIAkJaWYgKGZsYWdnZWRfbmljX3R5cGUgJiBOSUNfVFlQRV9GX0lQVjQpIHsKIAkJCXN0cnVjdCBkaGNwX3BhY2tldCB7CiAJCQkJdTggb3A7ICAgICAgLyogQk9PVFJFUVVFU1Qgb3IgQk9PVFJFUExZICovCi0JCQkJdTggaHR5cGU7ICAgLyogaGFyZHdhcmUgYWRkcmVzcyB0eXBlLiAxID0gMTBtYiBldGhlcm5ldCAqLworCQkJCXU4IGh0eXBlOyAgIC8qIGhhcmR3YXJlIGFkZHJlc3MgdHlwZS4KKwkJCQkJICAgICAqIDEgPSAxMG1iIGV0aGVybmV0CisJCQkJCSAgICAgKi8KIAkJCQl1OCBobGVuOyAgICAvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLwogCQkJCXU4IGhvcHM7ICAgIC8qIHVzZWQgYnkgcmVsYXkgYWdlbnRzIG9ubHkgKi8KIAkJCQl1MzIgeGlkOyAgICAvKiB1bmlxdWUgaWQgKi8KLQkJCQl1MTYgc2VjczsgICAvKiBlbGFwc2VkIHNpbmNlIGNsaWVudCBiZWdhbiBhY3F1aXNpdGlvbi9yZW5ld2FsICovCisJCQkJdTE2IHNlY3M7ICAgLyogZWxhcHNlZCBzaW5jZSBjbGllbnQgYmVnYW4KKwkJCQkJICAgICAqIGFjcXVpc2l0aW9uL3JlbmV3YWwKKwkJCQkJICAgICAqLwogCQkJCXUxNiBmbGFnczsgIC8qIG9ubHkgb25lIGZsYWcgc28gZmFyOiAqLwotCQkJCSNkZWZpbmUgQlJPQURDQVNUX0ZMQUcgMHg4MDAwIC8qICJJIG5lZWQgYnJvYWRjYXN0IHJlcGxpZXMiICovCi0JCQkJdTMyIGNpYWRkcjsgLyogY2xpZW50IElQIChpZiBjbGllbnQgaXMgaW4gQk9VTkQsIFJFTkVXIG9yIFJFQklORElORyBzdGF0ZSkgKi8KKwkJCQkjZGVmaW5lIEJST0FEQ0FTVF9GTEFHIDB4ODAwMAorCQkJCS8qICJJIG5lZWQgYnJvYWRjYXN0IHJlcGxpZXMiICovCisJCQkJdTMyIGNpYWRkcjsgLyogY2xpZW50IElQIChpZiBjbGllbnQgaXMgaW4KKwkJCQkJICAgICAqIEJPVU5ELCBSRU5FVyBvciBSRUJJTkRJTkcgc3RhdGUpCisJCQkJCSAgICAgKi8KIAkJCQl1MzIgeWlhZGRyOyAvKiAneW91cicgKGNsaWVudCkgSVAgYWRkcmVzcyAqLwotCQkJCS8qIElQIGFkZHJlc3Mgb2YgbmV4dCBzZXJ2ZXIgdG8gdXNlIGluIGJvb3RzdHJhcCwgcmV0dXJuZWQgaW4gREhDUE9GRkVSLCBESENQQUNLIGJ5IHNlcnZlciAqLworCQkJCS8qIElQIGFkZHJlc3Mgb2YgbmV4dCBzZXJ2ZXIgdG8gdXNlIGluCisJCQkJICogYm9vdHN0cmFwLCByZXR1cm5lZCBpbiBESENQT0ZGRVIsCisJCQkJICogREhDUEFDSyBieSBzZXJ2ZXIKKwkJCQkgKi8KIAkJCQl1MzIgc2lhZGRyX25pcDsKIAkJCQl1MzIgZ2F0ZXdheV9uaXA7IC8qIHJlbGF5IGFnZW50IElQIGFkZHJlc3MgKi8KLQkJCQl1OCBjaGFkZHJbMTZdOyAgIC8qIGxpbmstbGF5ZXIgY2xpZW50IGhhcmR3YXJlIGFkZHJlc3MgKE1BQykgKi8KKwkJCQl1OCBjaGFkZHJbMTZdOyAgIC8qIGxpbmstbGF5ZXIgY2xpZW50IGhhcmR3YXJlCisJCQkJCQkgICogYWRkcmVzcyAoTUFDKQorCQkJCQkJICAqLwogCQkJCXU4IHNuYW1lWzY0XTsgICAgLyogc2VydmVyIGhvc3QgbmFtZSAoQVNDSVopICovCiAJCQkJdTggZmlsZVsxMjhdOyAgICAvKiBib290IGZpbGUgbmFtZSAoQVNDSVopICovCi0JCQkJdTMyIGNvb2tpZTsgICAgICAvKiBmaXhlZCBmaXJzdCBmb3VyIG9wdGlvbiBieXRlcyAoOTksMTMwLDgzLDk5IGRlYykgKi8KKwkJCQl1MzIgY29va2llOyAgICAgIC8qIGZpeGVkIGZpcnN0IGZvdXIgb3B0aW9uCisJCQkJCQkgICogYnl0ZXMgKDk5LDEzMCw4Myw5OSBkZWMpCisJCQkJCQkgICovCiAJCQl9IF9fcGFja2VkOwotCQkJdm9pZCAqYWRkciA9IGJ1ZiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgb2Zmc2V0b2Yoc3RydWN0IGRoY3BfcGFja2V0LCBjaGFkZHIpOworCQkJdm9pZCAqYWRkciA9IGJ1ZiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsKKwkJCQlzaXplb2Yoc3RydWN0IHVkcGhkcikgKworCQkJCW9mZnNldG9mKHN0cnVjdCBkaGNwX3BhY2tldCwgY2hhZGRyKTsKIAkJCW1lbWNweShuaWMtPmRlc3RfbWFjX2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKIAkJfQogCX0KQEAgLTU5Myw3ICs2NDQsOSBAQAogCXZsYW5fZXRoLmhfdmxhbl9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAogCWlmIChuaWNfdHlwZSA9PSBOSUNfVFlQRV9BUlApIHsKLQkJLyogU2hvdWxkIGJlIHJlc3BvbnNlOiBPbmx5IGhhcHBlbnMgYmVjYXVzZSB0aGVyZSB3YXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QgKi8KKwkJLyogU2hvdWxkIGJlIHJlc3BvbnNlOiBPbmx5IGhhcHBlbnMgYmVjYXVzZQorCQkgKiB0aGVyZSB3YXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QKKwkJICovCiAJCWV0aC5oX3Byb3RvID0gaHRvbnMoRVRIX1BfQVJQKTsKIAkJdmxhbl9ldGguaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CiAJfSBlbHNlIHsKQEAgLTY0MCwxNSArNjkzLDIwIEBACiAJdTMyIG5pY190eXBlOwogCXU4IGluZGV4OwogCi0JaGNpX2xlbiA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIG11bHRpX3NkdS0+bGVuKTsKLQludW1fcGFja2V0ID0gZ2RtX2RldjE2X3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgbXVsdGlfc2R1LT5udW1fcGFja2V0KTsKKwloY2lfbGVuID0gZ2RtX2RldjE2X3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwKKwkJCQltdWx0aV9zZHUtPmxlbik7CisJbnVtX3BhY2tldCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksCisJCQkJbXVsdGlfc2R1LT5udW1fcGFja2V0KTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fcGFja2V0OyBpKyspIHsKIAkJc2R1ID0gKHN0cnVjdCBzZHUgKilkYXRhOwogCi0JCWNtZF9ldnQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPmNtZF9ldnQpOwotCQloY2lfbGVuID0gZ2RtX2RldjE2X3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgc2R1LT5sZW4pOwotCQluaWNfdHlwZSA9IGdkbV9kZXYzMl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+bmljX3R5cGUpOworCQljbWRfZXZ0ID0gZ2RtX2RldjE2X3RvX2NwdShwaHlfZGV2LT4KKwkJCQlnZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgc2R1LT5jbWRfZXZ0KTsKKwkJaGNpX2xlbiA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+CisJCQkJZ2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+bGVuKTsKKwkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPgorCQkJCWdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKIAogCQlpZiAoY21kX2V2dCAhPSBMVEVfUlhfU0RVKSB7CiAJCQlwcl9lcnIoInJ4IHNkdSB3cm9uZyBoY2kgJTA0eFxuIiwgY21kX2V2dCk7CkBAIC02NjIsNyArNzIwLDggQEAKIAkJaW5kZXggPSBmaW5kX2Rldl9pbmRleChuaWNfdHlwZSk7CiAJCWlmIChpbmRleCA8IE1BWF9OSUNfVFlQRSkgewogCQkJZGV2ID0gcGh5X2Rldi0+ZGV2W2luZGV4XTsKLQkJCWdkbV9sdGVfbmV0aWZfcngoZGV2LCAoY2hhciAqKXNkdS0+ZGF0YSwgKGludCkoaGNpX2xlbi0xMiksIG5pY190eXBlKTsKKwkJCWdkbV9sdGVfbmV0aWZfcngoZGV2LCAoY2hhciAqKXNkdS0+ZGF0YSwKKwkJCQkJKGludCkoaGNpX2xlbi0xMiksIG5pY190eXBlKTsKIAkJfSBlbHNlIHsKIAkJCXByX2Vycigicnggc2R1IGludmFsaWQgbmljX3R5cGUgOiV4XG4iLCBuaWNfdHlwZSk7CiAJCX0KQEAgLTcwOSw3ICs3NjgsOCBAQAogCWlmICghbGVuKQogCQlyZXR1cm4gcmV0OwogCi0JY21kX2V2dCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIGhjaS0+Y21kX2V2dCk7CisJY21kX2V2dCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksCisJCQkJaGNpLT5jbWRfZXZ0KTsKIAogCWRldiA9IHBoeV9kZXYtPmRldlswXTsKIAlpZiAoZGV2ID09IE5VTEwpCkBAIC03MTgsNyArNzc4LDggQEAKIAlzd2l0Y2ggKGNtZF9ldnQpIHsKIAljYXNlIExURV9SWF9TRFU6CiAJCXNkdSA9IChzdHJ1Y3Qgc2R1ICopaGNpLT5kYXRhOwotCQluaWNfdHlwZSA9IGdkbV9kZXYzMl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+bmljX3R5cGUpOworCQluaWNfdHlwZSA9IGdkbV9kZXYzMl90b19jcHUocGh5X2Rldi0+CisJCQkJZ2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+bmljX3R5cGUpOwogCQlpbmRleCA9IGZpbmRfZGV2X2luZGV4KG5pY190eXBlKTsKIAkJZGV2ID0gcGh5X2Rldi0+ZGV2W2luZGV4XTsKIAkJZ2RtX2x0ZV9uZXRpZl9yeChkZXYsIGhjaS0+ZGF0YSwgbGVuLCBuaWNfdHlwZSk7CkBAIC03MzMsNyArNzk0LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBMVEVfUEROX1RBQkxFX0lORDoKIAkJcGRuX3RhYmxlID0gKHN0cnVjdCBoY2lfcGRuX3RhYmxlX2luZCAqKWJ1ZjsKLQkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBwZG5fdGFibGUtPm5pY190eXBlKTsKKwkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPgorCQkJCWdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLAorCQkJCXBkbl90YWJsZS0+bmljX3R5cGUpOwogCQlpbmRleCA9IGZpbmRfZGV2X2luZGV4KG5pY190eXBlKTsKIAkJZGV2ID0gcGh5X2Rldi0+ZGV2W2luZGV4XTsKIAkJZ2RtX2x0ZV9wZG5fdGFibGUoZGV2LCBidWYsIGxlbik7CkBAIC03NTgsNyArODIxLDggQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUlhfU1VCTUlUX0NPVU5UOyBpKyspCi0JCXBoeV9kZXYtPnJjdl9mdW5jKHBoeV9kZXYtPnByaXZfZGV2LCByeF9jb21wbGV0ZSwgcGh5X2RldiwgVVNCX0NPTVBMRVRFKTsKKwkJcGh5X2Rldi0+cmN2X2Z1bmMocGh5X2Rldi0+cHJpdl9kZXYsCisJCQkJcnhfY29tcGxldGUsIHBoeV9kZXYsIFVTQl9DT01QTEVURSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZ2RtX25ldGRldl9vcHMgPSB7CkBAIC03NzEsNyArODM1LDggQEAKIAogc3RhdGljIHU4IGdkbV9sdGVfbWFjYWRkcltFVEhfQUxFTl0gPSB7MHgwMCwgMHgwYSwgMHgzYiwgMHgwMCwgMHgwMCwgMHgwMH07CiAKLXN0YXRpYyB2b2lkIGZvcm1fbWFjX2FkZHJlc3ModTggKmRldl9hZGRyLCB1OCAqbmljX3NyYywgdTggKm5pY19kZXN0LCB1OCAqbWFjX2FkZHJlc3MsIHU4IGluZGV4KQorc3RhdGljIHZvaWQgZm9ybV9tYWNfYWRkcmVzcyh1OCAqZGV2X2FkZHIsIHU4ICpuaWNfc3JjLCB1OCAqbmljX2Rlc3QsCisJCQl1OCAqbWFjX2FkZHJlc3MsIHU4IGluZGV4KQogewogCS8qIEZvcm0gdGhlIGRldl9hZGRyICovCiAJaWYgKCFtYWNfYWRkcmVzcykKQEAgLTc3OSwxMCArODQ0LDE0IEBACiAJZWxzZQogCQltZW1jcHkoZGV2X2FkZHIsIG1hY19hZGRyZXNzLCBFVEhfQUxFTik7CiAKLQkvKiBUaGUgbGFzdCBieXRlIG9mIHRoZSBtYWMgYWRkcmVzcyBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDB4RkMgKi8KKwkvKiBUaGUgbGFzdCBieXRlIG9mIHRoZSBtYWMgYWRkcmVzcworCSAqIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMHhGQworCSAqLwogCWRldl9hZGRyW0VUSF9BTEVOLTFdICs9IGluZGV4OwogCi0JLyogQ3JlYXRlIHJhbmRvbSBuaWMgc3JjIGFuZCBjb3B5IHRoZSBmaXJzdCAzIGJ5dGVzIHRvIGJlIHRoZSBzYW1lIGFzIGRldl9hZGRyICovCisJLyogQ3JlYXRlIHJhbmRvbSBuaWMgc3JjIGFuZCBjb3B5IHRoZSBmaXJzdAorCSAqIDMgYnl0ZXMgdG8gYmUgdGhlIHNhbWUgYXMgZGV2X2FkZHIKKwkgKi8KIAlyYW5kb21fZXRoZXJfYWRkcihuaWNfc3JjKTsKIAltZW1jcHkobmljX3NyYywgZGV2X2FkZHIsIDMpOwogCkBAIC03OTksNyArODY4LDggQEAKIAl9CiB9CiAKLWludCByZWdpc3Rlcl9sdGVfZGV2aWNlKHN0cnVjdCBwaHlfZGV2ICpwaHlfZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICptYWNfYWRkcmVzcykKK2ludCByZWdpc3Rlcl9sdGVfZGV2aWNlKHN0cnVjdCBwaHlfZGV2ICpwaHlfZGV2LAorCQkJc3RydWN0IGRldmljZSAqZGV2LCB1OCAqbWFjX2FkZHJlc3MpCiB7CiAJc3RydWN0IG5pYyAqbmljOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CkBAIC04MTQsNyArODg0LDggQEAKIAkJc3ByaW50ZihwZG5fZGV2X25hbWUsICJsdGUlJWRwZG4lZCIsIGluZGV4KTsKIAogCQkvKiBBbGxvY2F0ZSBuZXRkZXYgKi8KLQkJbmV0ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmljKSwgcGRuX2Rldl9uYW1lLCBldGhlcl9zZXR1cCk7CisJCW5ldCA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5pYyksIHBkbl9kZXZfbmFtZSwKKwkJCQlldGhlcl9zZXR1cCk7CiAJCWlmIChuZXQgPT0gTlVMTCkgewogCQkJcHJfZXJyKCJhbGxvY19uZXRkZXYgZmFpbGVkXG4iKTsKIAkJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmggYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmgKaW5kZXggOTI4N2QzMS4uODg0MTRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuaApAQCAtNTYsNyArNTYsNyBAQAogCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsIHZvaWQgKmRhdGEsIGludCBsZW4sCiAJCQkJICBpbnQgY29udGV4dCksCiAJCQl2b2lkICpjYl9kYXRhLCBpbnQgY29udGV4dCk7Ci0Jc3RydWN0IGdkbV9lbmRpYW4gKigqZ2V0X2VuZGlhbikodm9pZCAqcHJpdl9kZXYpOworCXN0cnVjdCBnZG1fZW5kaWFuICogKCpnZXRfZW5kaWFuKSh2b2lkICpwcml2X2Rldik7CiB9OwogCiBzdHJ1Y3QgbmljIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguYwppbmRleCAyZmEzYTVhLi4xMGNlMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5jCkBAIC0xNjUsNyArMTY1LDggQEAKIAlpbnQgbGVuID0gci0+bGVuOwogCiAJd2hpbGUgKDEpIHsKLQkJbXV4X2hlYWRlciA9IChzdHJ1Y3QgbXV4X3BrdF9oZWFkZXIgKikoci0+YnVmICsgcGFja2V0X3NpemVfc3VtKTsKKwkJbXV4X2hlYWRlciA9IChzdHJ1Y3QgbXV4X3BrdF9oZWFkZXIgKikoci0+YnVmICsKKwkJCQkJCSAgICAgICBwYWNrZXRfc2l6ZV9zdW0pOwogCQlzdGFydF9mbGFnID0gX19sZTMyX3RvX2NwdShtdXhfaGVhZGVyLT5zdGFydF9mbGFnKTsKIAkJcGF5bG9hZF9zaXplID0gX19sZTMyX3RvX2NwdShtdXhfaGVhZGVyLT5wYXlsb2FkX3NpemUpOwogCQlwYWNrZXRfdHlwZSA9IF9fbGUxNl90b19jcHUobXV4X2hlYWRlci0+cGFja2V0X3R5cGUpOwpAQCAtMjMxLDcgKzIzMiw4IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+dG9faG9zdF9sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQotCQlyID0gbGlzdF9lbnRyeShyeC0+dG9faG9zdF9saXN0Lm5leHQsIHN0cnVjdCBtdXhfcngsIHRvX2hvc3RfbGlzdCk7CisJCXIgPSBsaXN0X2VudHJ5KHJ4LT50b19ob3N0X2xpc3QubmV4dCwgc3RydWN0IG11eF9yeCwKKwkJCSAgICAgICB0b19ob3N0X2xpc3QpOwogCQlsaXN0X2RlbCgmci0+dG9faG9zdF9saXN0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCkBAIC0yNDksNyArMjUxLDggQEAKIAlzdHJ1Y3QgbXV4X3J4CSpyX3JlbW92ZSwgKnJfcmVtb3ZlX25leHQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9yZW1vdmUsIHJfcmVtb3ZlX25leHQsICZyeC0+cnhfc3VibWl0X2xpc3QsIHJ4X3N1Ym1pdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfcmVtb3ZlLCByX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LAorCQkJCSByeF9zdWJtaXRfbGlzdCkgewogCQlpZiAociA9PSByX3JlbW92ZSkKIAkJCWxpc3RfZGVsKCZyLT5yeF9zdWJtaXRfbGlzdCk7CiAJfQpAQCAtMjc5LDkgKzI4Miw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGdkbV9tdXhfcmVjdih2b2lkICpwcml2X2RldiwKLQkJCWludCAoKmNiKSh2b2lkICpkYXRhLCBpbnQgbGVuLCBpbnQgdHR5X2luZGV4LCBzdHJ1Y3QgdHR5X2RldiAqdHR5X2RldiwgaW50IGNvbXBsZXRlKQotCQkJKQorc3RhdGljIGludCBnZG1fbXV4X3JlY3Yodm9pZCAqcHJpdl9kZXYsIGludCAoKmNiKSh2b2lkICpkYXRhLCBpbnQgbGVuLAorCQkJaW50IHR0eV9pbmRleCwgc3RydWN0IHR0eV9kZXYgKnR0eV9kZXYsIGludCBjb21wbGV0ZSkpCiB7CiAJc3RydWN0IG11eF9kZXYgKm11eF9kZXYgPSBwcml2X2RldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2ID0gbXV4X2Rldi0+dXNiZGV2OwpAQCAtNDE2LDcgKzQxOCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBnZG1fbXV4X3NlbmRfY29udHJvbCh2b2lkICpwcml2X2RldiwgaW50IHJlcXVlc3QsIGludCB2YWx1ZSwgdm9pZCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIGludCBnZG1fbXV4X3NlbmRfY29udHJvbCh2b2lkICpwcml2X2RldiwgaW50IHJlcXVlc3QsIGludCB2YWx1ZSwKKwkJCQl2b2lkICpidWYsIGludCBsZW4pCiB7CiAJc3RydWN0IG11eF9kZXYgKm11eF9kZXYgPSBwcml2X2RldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2ID0gbXV4X2Rldi0+dXNiZGV2OwpAQCAtNDQ4LDcgKzQ1MSw4IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmbXV4X2Rldi0+d29ya19yeCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyLCByX25leHQsICZyeC0+cnhfc3VibWl0X2xpc3QsCisJCQkJIHJ4X3N1Ym1pdF9saXN0KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7CiAJCXVzYl9raWxsX3VyYihyLT51cmIpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9saXN0X2xvY2ssIGZsYWdzKTsKQEAgLTUwMyw3ICs1MDcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZ2RtX211eF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBnZG1fbXV4X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgbXV4X2RldiAqbXV4X2RldjsKIAlzdHJ1Y3QgdHR5X2RldiAqdHR5X2RldjsKQEAgLTYxMCw3ICs2MTUsOCBAQAogCiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyLCByX25leHQsICZyeC0+cnhfc3VibWl0X2xpc3QsCisJCQkJIHJ4X3N1Ym1pdF9saXN0KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7CiAJCXVzYl9raWxsX3VyYihyLT51cmIpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9saXN0X2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYwppbmRleCAzMzQ1OGE1Li5lZTZlNDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCkBAIC0zMCwxNCArMzAsMTcgQEAKICNpbmNsdWRlICJnZG1fZW5kaWFuLmgiCiAKICNkZWZpbmUgVVNCX0RFVklDRV9DRENfREFUQSh2aWQsIHBpZCkgXAotCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MgfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUyxcCisJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfCBcCisJCVVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwgXAorCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUyxcCiAJLmlkVmVuZG9yID0gdmlkLFwKIAkuaWRQcm9kdWN0ID0gcGlkLFwKIAkuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX0NPTU0sXAogCS5iSW50ZXJmYWNlU3ViQ2xhc3MgPSBVU0JfQ0RDX1NVQkNMQVNTX0VUSEVSTkVUCiAKICNkZWZpbmUgVVNCX0RFVklDRV9NQVNTX0RBVEEodmlkLCBwaWQpIFwKLQkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sXAorCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwgXAorCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLFwKIAkuaWRWZW5kb3IgPSB2aWQsXAogCS5pZFByb2R1Y3QgPSBwaWQsXAogCS5iSW50ZXJmYWNlU3ViQ2xhc3MgPSBVU0JfU0NfU0NTSSwgXApAQCAtNTksNyArNjIsOCBAQAogc3RhdGljIHZvaWQgZG9fcngoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIGludCBnZG1fdXNiX3JlY3Yodm9pZCAqcHJpdl9kZXYsCi0JCQlpbnQgKCpjYikodm9pZCAqY2JfZGF0YSwgdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGNvbnRleHQpLAorCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsCisJCQkJdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGNvbnRleHQpLAogCQkJdm9pZCAqY2JfZGF0YSwKIAkJCWludCBjb250ZXh0KTsKIApAQCAtMTE5LDI4ICsxMjMsMTUgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfdHhfc2R1ICphbGxvY190eF9zZHVfc3RydWN0KHZvaWQpCiB7Ci0Jc3RydWN0IHVzYl90eF9zZHUgKnRfc2R1ID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQorCXN0cnVjdCB1c2JfdHhfc2R1ICp0X3NkdTsKIAogCXRfc2R1ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl90eF9zZHUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXRfc2R1KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXRfc2R1KQorCQlyZXR1cm4gTlVMTDsKIAogCXRfc2R1LT5idWYgPSBrbWFsbG9jKFNEVV9CVUZfU0laRSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0X3NkdS0+YnVmKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLW91dDoKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWlmICh0X3NkdSkgewotCQkJa2ZyZWUodF9zZHUtPmJ1Zik7Ci0JCQlrZnJlZSh0X3NkdSk7Ci0JCX0KKwkJa2ZyZWUodF9zZHUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTM4OCw3ICszNzksOCBAQAogCWlmICh0bHYtPnR5cGUgPT0gTUFDX0FERFJFU1MgJiYgdWRldi0+cmVxdWVzdF9tYWNfYWRkcikgewogCQltZW1jcHkobWFjX2FkZHJlc3MsIHRsdi0+ZGF0YSwgdGx2LT5sZW4pOwogCi0JCWlmIChyZWdpc3Rlcl9sdGVfZGV2aWNlKHBoeV9kZXYsICZ1ZGV2LT5pbnRmLT5kZXYsIG1hY19hZGRyZXNzKSA8IDApCisJCWlmIChyZWdpc3Rlcl9sdGVfZGV2aWNlKHBoeV9kZXYsCisJCQkJJnVkZXYtPmludGYtPmRldiwgbWFjX2FkZHJlc3MpIDwgMCkKIAkJCXByX2VycigicmVnaXN0ZXIgbHRlIGRldmljZSBmYWlsZWRcbiIpOwogCiAJCXVkZXYtPnJlcXVlc3RfbWFjX2FkZHIgPSAwOwpAQCAtNDAxLDcgKzM5Myw4IEBACiAKIHN0YXRpYyB2b2lkIGRvX3J4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbHRlX3VkZXYgKnVkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGx0ZV91ZGV2LCB3b3JrX3J4LndvcmspOworCXN0cnVjdCBsdGVfdWRldiAqdWRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbHRlX3VkZXYsIHdvcmtfcngud29yayk7CiAJc3RydWN0IHJ4X2N4dCAqcnggPSAmdWRldi0+cng7CiAJc3RydWN0IHVzYl9yeCAqcjsKIAlzdHJ1Y3QgaGNpX3BhY2tldCAqaGNpOwpAQCAtNDE2LDcgKzQwOSw4IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+dG9faG9zdF9sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQotCQlyID0gbGlzdF9lbnRyeShyeC0+dG9faG9zdF9saXN0Lm5leHQsIHN0cnVjdCB1c2JfcngsIHRvX2hvc3RfbGlzdCk7CisJCXIgPSBsaXN0X2VudHJ5KHJ4LT50b19ob3N0X2xpc3QubmV4dCwKKwkJCXN0cnVjdCB1c2JfcngsIHRvX2hvc3RfbGlzdCk7CiAJCWxpc3RfZGVsKCZyLT50b19ob3N0X2xpc3QpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+dG9faG9zdF9sb2NrLCBmbGFncyk7CiAKQEAgLTQ2Myw3ICs0NTcsOCBAQAogCXN0cnVjdCB1c2JfcngJKnJfcmVtb3ZlLCAqcl9yZW1vdmVfbmV4dDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyeC0+c3VibWl0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9yZW1vdmUsIHJfcmVtb3ZlX25leHQsICZyeC0+cnhfc3VibWl0X2xpc3QsIHJ4X3N1Ym1pdF9saXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyX3JlbW92ZSwKKwkJCXJfcmVtb3ZlX25leHQsICZyeC0+cnhfc3VibWl0X2xpc3QsIHJ4X3N1Ym1pdF9saXN0KQogCXsKIAkJaWYgKHIgPT0gcl9yZW1vdmUpIHsKIAkJCWxpc3RfZGVsKCZyLT5yeF9zdWJtaXRfbGlzdCk7CkBAIC01MDAsNyArNDk1LDggQEAKIH0KIAogc3RhdGljIGludCBnZG1fdXNiX3JlY3Yodm9pZCAqcHJpdl9kZXYsCi0JCQlpbnQgKCpjYikodm9pZCAqY2JfZGF0YSwgdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGNvbnRleHQpLAorCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsCisJCQkJdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGNvbnRleHQpLAogCQkJdm9pZCAqY2JfZGF0YSwKIAkJCWludCBjb250ZXh0KQogewpAQCAtNjU0LDcgKzY1MCw4IEBACiAKIHN0YXRpYyB2b2lkIGRvX3R4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbHRlX3VkZXYgKnVkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGx0ZV91ZGV2LCB3b3JrX3R4LndvcmspOworCXN0cnVjdCBsdGVfdWRldiAqdWRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbHRlX3VkZXYsIHdvcmtfdHgud29yayk7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IHVkZXYtPnVzYmRldjsKIAlzdHJ1Y3QgdHhfY3h0ICp0eCA9ICZ1ZGV2LT50eDsKIAlzdHJ1Y3QgdXNiX3R4ICp0ID0gTlVMTDsKQEAgLTgxMyw3ICs4MTAsOCBAQAogCXJldHVybiAmdWRldi0+Z2RtX2VkOwogfQogCi1zdGF0aWMgaW50IGdkbV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgZ2RtX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHBoeV9kZXYgKnBoeV9kZXYgPSBOVUxMOwpAQCAtODYxLDcgKzg1OSw5IEBACiAJdXNiX2VuYWJsZV9hdXRvc3VzcGVuZCh1c2JkZXYpOwogCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZ1c2JkZXYtPmRldiwgQVVUT19TVVNQRU5EX1RJTUVSKTsKIAotCS8qIExpc3QgdXAgaG9zdHMgd2l0aCBiaWcgZW5kaWFucywgb3RoZXJ3aXNlLCBkZWZhdWx0cyB0byBsaXR0bGUgZW5kaWFuICovCisJLyogTGlzdCB1cCBob3N0cyB3aXRoIGJpZyBlbmRpYW5zLCBvdGhlcndpc2UsCisJICogZGVmYXVsdHMgdG8gbGl0dGxlIGVuZGlhbgorCSAqLwogCWlmIChpZFByb2R1Y3QgPT0gUElEX0dETTcyNDMpCiAJCWdkbV9zZXRfZW5kaWFuKCZ1ZGV2LT5nZG1fZWQsIEVORElBTk5FU1NfQklHKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L25ldGxpbmtfay5jCmluZGV4IDc3ZmM2NGUuLjVkZGQzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L25ldGxpbmtfay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L25ldGxpbmtfay5jCkBAIC0zMiw3ICszMiw4IEBACiAjZGVmaW5lIE5EX01BWF9HUk9VUAkJMzAKICNkZWZpbmUgTkRfSUZJTkRFWF9MRU4JCXNpemVvZihpbnQpCiAjZGVmaW5lIE5EX05MTVNHX1NQQUNFKGxlbikJKE5MTVNHX1NQQUNFKGxlbikgKyBORF9JRklOREVYX0xFTikKLSNkZWZpbmUgTkRfTkxNU0dfREFUQShubGgpCSgodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEobmxoKSArIE5EX0lGSU5ERVhfTEVOKSkKKyNkZWZpbmUgTkRfTkxNU0dfREFUQShubGgpCSgodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEobmxoKSArIFwKKwkJCQkJCSAgTkRfSUZJTkRFWF9MRU4pKQogI2RlZmluZSBORF9OTE1TR19TX0xFTihsZW4pCShsZW4rTkRfSUZJTkRFWF9MRU4pCiAjZGVmaW5lIE5EX05MTVNHX1JfTEVOKG5saCkJKG5saC0+bmxtc2dfbGVuLU5EX0lGSU5ERVhfTEVOKQogI2RlZmluZSBORF9OTE1TR19JRklEWChubGgpCU5MTVNHX0RBVEEobmxoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L1RPRE8KaW5kZXggMzBhYzAxYS4uNWFiMjdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9UT0RPCkBAIC0xLDUgKzEsMyBAQAogVE9ETzoKIC0gUmVwbGFjZSBrZXJuZWxfdGhyZWFkIHdpdGgga3RocmVhZCBpbiBnZG1fdXNiLmMKLS0gUmVwbGFjZSBoYXJkLWNvZGVkIGZpcm13YXJlIHBhdGhzIHdpdGggcmVxdWVzdF9maXJtd2FyZSBpbgotICBzZGlvX2Jvb3QuYyBhbmQgdXNiX2Jvb3QuYwogLSBDbGVhbiB1cCBjb2Rpbmcgc3R5bGUgdG8gbWVldCBrZXJuZWwgc3RhbmRhcmQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fc2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYwppbmRleCAwNDdhNGQ3Li5jMjQ2NTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fc2Rpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9zZGlvLmMKQEAgLTM4LDI2ICszOCw5IEBACiAjZGVmaW5lIFRYX0haCTIwMDAKICNkZWZpbmUgVFhfSU5URVJWQUwJKDEwMDAwMDAvVFhfSFopCiAKLS8qI2RlZmluZSBERUJVRyovCi0KIHN0YXRpYyBpbnQgaW5pdF9zZGlvKHN0cnVjdCBzZGlvd21fZGV2ICpzZGV2KTsKIHN0YXRpYyB2b2lkIHJlbGVhc2Vfc2RpbyhzdHJ1Y3Qgc2Rpb3dtX2RldiAqc2Rldik7CiAKLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgaGV4ZHVtcChjaGFyICp0aXRsZSwgdTggKmRhdGEsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxlbmd0aCA9ICVkXG4iLCB0aXRsZSwgbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCWlmICgoaSAmIDB4ZikgPT0gMHhmKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc2Rpb190eCAqYWxsb2NfdHhfc3RydWN0KHN0cnVjdCB0eF9jeHQgKnR4KQogewogCXN0cnVjdCBzZGlvX3R4ICp0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfQVRPTUlDKTsKQEAgLTI5NywxMCArMjgwLDkgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4LT5sb2NrLCBmbGFncyk7CiAKLSNpZmRlZiBERUJVRwotCWhleGR1bXAoInNkaW9fc2VuZCIsIHR4LT5zZHVfYnVmICsgVFlQRV9BX0hFQURFUl9TSVpFLAotCQlhZ2dyX2xlbiAtIFRZUEVfQV9IRUFERVJfU0laRSk7Ci0jZW5kaWYKKwlwcmludF9oZXhfZHVtcF9kZWJ1Zygic2Rpb19zZW5kOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJCSAgICAgdHgtPnNkdV9idWYgKyBUWVBFX0FfSEVBREVSX1NJWkUsCisJCQkgICAgIGFnZ3JfbGVuIC0gVFlQRV9BX0hFQURFUl9TSVpFLCBmYWxzZSk7CiAKIAlmb3IgKHBvcyA9IFRZUEVfQV9IRUFERVJfU0laRTsgcG9zIDwgYWdncl9sZW47IHBvcyArPSBUWF9DSFVOS19TSVpFKSB7CiAJCWxlbiA9IGFnZ3JfbGVuIC0gcG9zOwpAQCAtMzM1LDEwICszMTcsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSNpZmRlZiBERUJVRwotCWhleGR1bXAoInNkaW9fc2VuZCIsIHQtPmJ1ZiArIFRZUEVfQV9IRUFERVJfU0laRSwKLQkJdC0+bGVuIC0gVFlQRV9BX0hFQURFUl9TSVpFKTsKLSNlbmRpZgorCXByaW50X2hleF9kdW1wX2RlYnVnKCJzZGlvX3NlbmQ6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJICAgICB0LT5idWYgKyBUWVBFX0FfSEVBREVSX1NJWkUsCisJCQkgICAgIHQtPmxlbiAtIFRZUEVfQV9IRUFERVJfU0laRSwgZmFsc2UpOwogCXNlbmRfc2Rpb19wa3QoZnVuYywgdC0+YnVmLCB0LT5sZW4pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnR4LT5sb2NrLCBmbGFncyk7CkBAIC00NzQsMTQgKzQ1NSwxMCBAQAogCQlnb3RvIG91dDsKIAogCWlmIChoY2lfZGF0YVs0XSA9PSAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIldJTUFYID09PiBTVE9QIFNEVSBUWFxuIik7Ci0jZW5kaWYKKwkJZGV2X2RiZygmc2Rldi0+ZnVuYy0+ZGV2LCAiV0lNQVggPT0+IFNUT1AgU0RVIFRYXG4iKTsKIAkJdHgtPnN0b3Bfc2R1X3R4ID0gMTsKIAl9IGVsc2UgaWYgKGhjaV9kYXRhWzRdID09IDEpIHsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiV0lNQVggPT0+IFNUQVJUIFNEVSBUWFxuIik7Ci0jZW5kaWYKKwkJZGV2X2RiZygmc2Rldi0+ZnVuYy0+ZGV2LCAiV0lNQVggPT0+IFNUQVJUIFNEVSBUWFxuIik7CiAJCXR4LT5zdG9wX3NkdV90eCA9IDA7CiAJCWlmICh0eC0+Y2FuX3NlbmQpCiAJCQlzY2hlZHVsZV93b3JrKCZzZGV2LT53cyk7CkBAIC01MzIsMTggKzUwOSwxNCBAQAogCX0KIAogCWlmIChoZHJbM10gPT0gMSkgewkvKiBBY2sgKi8KLSNpZmRlZiBERUJVRwogCQl1MzIgKmFja19zZXEgPSAodTMyICopJmhkcls0XTsKLSNlbmRpZgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHgtPmxvY2ssIGZsYWdzKTsKIAkJdHgtPmNhbl9zZW5kID0gMTsKIAogCQlpZiAoIWxpc3RfZW1wdHkoJnR4LT5zZHVfbGlzdCkgfHwgIWxpc3RfZW1wdHkoJnR4LT5oY2lfbGlzdCkpCiAJCQlzY2hlZHVsZV93b3JrKCZzZGV2LT53cyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4LT5sb2NrLCBmbGFncyk7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkFjay4uLiAlMHhcbiIsIG50b2hsKCphY2tfc2VxKSk7Ci0jZW5kaWYKKwkJZGV2X2RiZygmZnVuYy0+ZGV2LCAiQWNrLi4uICUweFxuIiwgbnRvaGwoKmFja19zZXEpKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtNTc5LDkgKzU1Miw4IEBACiAJfQogCiBlbmRfaW86Ci0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJzZGlvX3JlY2VpdmUiLCByeC0+cnhfYnVmLCBsZW4pOwotI2VuZGlmCisJcHJpbnRfaGV4X2R1bXBfZGVidWcoInNkaW9fcmVjZWl2ZTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkgICAgIHJ4LT5yeF9idWYsIGxlbiwgZmFsc2UpOwogCWxlbiA9IGNvbnRyb2xfc2R1X3R4X2Zsb3coc2RldiwgcngtPnJ4X2J1ZiwgbGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyeC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3VzYi5jCmluZGV4IGNkZWZmZTcuLjIwNTM5ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fdXNiLmMKQEAgLTU1LDIyICs1NSw2IEBACiBzdGF0aWMgaW50IGluaXRfdXNiKHN0cnVjdCB1c2J3bV9kZXYgKnVkZXYpOwogc3RhdGljIHZvaWQgcmVsZWFzZV91c2Ioc3RydWN0IHVzYndtX2RldiAqdWRldik7CiAKLS8qI2RlZmluZSBERUJVRyAqLwotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBoZXhkdW1wKGNoYXIgKnRpdGxlLCB1OCAqZGF0YSwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQotCXByaW50ayhLRVJOX0RFQlVHICIlczogbGVuZ3RoID0gJWRcbiIsIHRpdGxlLCBsZW4pOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAiLCBkYXRhW2ldKTsKLQkJaWYgKChpICYgMHhmKSA9PSAweGYpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci19Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCB1c2JfdHggKmFsbG9jX3R4X3N0cnVjdChzdHJ1Y3QgdHhfY3h0ICp0eCkKIHsKIAlzdHJ1Y3QgdXNiX3R4ICp0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfQVRPTUlDKTsKQEAgLTM2OCw5ICszNTIsOCBAQAogCQkJZ2RtX3VzYl9zZW5kX2NvbXBsZXRlLAogCQkJdCk7CiAKLSNpZmRlZiBERUJVRwotCWhleGR1bXAoInVzYl9zZW5kIiwgdC0+YnVmLCBsZW4gKyBwYWRkaW5nKTsKLSNlbmRpZgorCXByaW50X2hleF9kdW1wX2RlYnVnKCJ1c2Jfc2VuZDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkgICAgIHQtPmJ1ZiwgbGVuICsgcGFkZGluZywgZmFsc2UpOwogI2lmZGVmIENPTkZJR19XSU1BWF9HRE03MlhYX1VTQl9QTQogCWlmICh1c2JkZXYtPnN0YXRlICYgVVNCX1NUQVRFX1NVU1BFTkRFRCkgewogCQlsaXN0X2FkZF90YWlsKCZ0LT5wX2xpc3QsICZ0eC0+cGVuZGluZ19saXN0KTsKQEAgLTQzOCwxMCArNDIxLDcgQEAKIAlzdHJ1Y3QgdXNiX3R4ICp0OwogCXUxNiBjbWRfZXZ0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMjsKLQotI2lmZGVmIENPTkZJR19XSU1BWF9HRE03MlhYX1VTQl9QTQogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB1cmItPmRldjsKLSNlbmRpZgogCiAJLyogQ29tcGxldGlvbiBieSB1c2JfdW5saW5rX3VyYiAqLwogCWlmICh1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkKQEAgLTQ1MSwyMCArNDMxLDE1IEBACiAKIAlpZiAoIXVyYi0+c3RhdHVzKSB7CiAJCWNtZF9ldnQgPSAoci0+YnVmWzBdIDw8IDgpIHwgKHItPmJ1ZlsxXSk7Ci0jaWZkZWYgREVCVUcKLQkJaGV4ZHVtcCgidXNiX3JlY2VpdmUiLCByLT5idWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0jZW5kaWYKKwkJcHJpbnRfaGV4X2R1bXBfZGVidWcoInVzYl9yZWNlaXZlOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJCQkgICAgIHItPmJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoLCBmYWxzZSk7CiAJCWlmIChjbWRfZXZ0ID09IFdJTUFYX1NEVV9UWF9GTE9XKSB7CiAJCQlpZiAoci0+YnVmWzRdID09IDApIHsKLSNpZmRlZiBERUJVRwotCQkJCXByaW50ayhLRVJOX0RFQlVHICJXSU1BWCA9PT4gU1RPUCBTRFUgVFhcbiIpOwotI2VuZGlmCisJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJXSU1BWCA9PT4gU1RPUCBTRFUgVFhcbiIpOwogCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnR4LT5zZHVfbGlzdCwgbGlzdCkKIAkJCQkJdXNiX3VubGlua191cmIodC0+dXJiKTsKIAkJCX0gZWxzZSBpZiAoci0+YnVmWzRdID09IDEpIHsKLSNpZmRlZiBERUJVRwotCQkJCXByaW50ayhLRVJOX0RFQlVHICJXSU1BWCA9PT4gU1RBUlQgU0RVIFRYXG4iKTsKLSNlbmRpZgorCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiV0lNQVggPT0+IFNUQVJUIFNEVSBUWFxuIik7CiAJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmdHgtPnNkdV9saXN0LCBsaXN0KSB7CiAJCQkJCXVzYl9zdWJtaXRfdXJiKHQtPnVyYiwgR0ZQX0FUT01JQyk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguYwppbmRleCBkZDg1NDk3Li4wNWNlMmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguYwpAQCAtNjIsMjEgKzYyLDYgQEAKIHN0YXRpYyB2b2lkIGdkbV93aW1heF9pbmRfZnNtX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZnNtX3MgKmZzbSk7CiBzdGF0aWMgdm9pZCBnZG1fd2ltYXhfaW5kX2lmX3VwZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWZfdXApOwogCi0jaWYgZGVmaW5lZChERUJVR19TRFUpCi1zdGF0aWMgdm9pZCBwcmludGtfaGV4KHU4ICpidWYsIHUzMiBzaXplKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQlpZiAoaSAmJiBpICUgMTYgPT0gMCkKLQkJCXByaW50ayhLRVJOX0RFQlVHICJcbiUwMnggIiwgKmJ1ZisrKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggIiwgKmJ1ZisrKTsKLQl9Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLX0KLQogc3RhdGljIGNvbnN0IGNoYXIgKmdldF9wcm90b2NvbF9uYW1lKHUxNiBwcm90b2NvbCkKIHsKIAlzdGF0aWMgY2hhciBidWZbMzJdOwpAQCAtMTQwLDcgKzEyNSw4IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotc3RhdGljIHZvaWQgZHVtcF9ldGhfcGFja2V0KGNvbnN0IGNoYXIgKnRpdGxlLCB1OCAqZGF0YSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGR1bXBfZXRoX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICp0aXRsZSwKKwkJCSAgICB1OCAqZGF0YSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgaXBoZHIgKmloID0gTlVMTDsKIAlzdHJ1Y3QgdWRwaGRyICp1aCA9IE5VTEw7CkBAIC0xNjIsNDggKzE0OCwyMSBAQAogCQlwb3J0ID0gbnRvaHModWgtPmRlc3QpOwogCX0KIAotCXByaW50ayhLRVJOX0RFQlVHICJbJXNdIGxlbj0lZCwgJXMsICVzLCAlc1xuIiwKKwluZXRkZXZfZGJnKGRldiwgIlslc10gbGVuPSVkLCAlcywgJXMsICVzXG4iLAogCQl0aXRsZSwgbGVuLAogCQlnZXRfcHJvdG9jb2xfbmFtZShwcm90b2NvbCksCiAJCWdldF9pcF9wcm90b2NvbF9uYW1lKGlwX3Byb3RvY29sKSwKIAkJZ2V0X3BvcnRfbmFtZShwb3J0KSk7CiAKIAlpZiAoIShkYXRhWzBdID09IDB4ZmYgJiYgZGF0YVsxXSA9PSAweGZmKSkgewotCQlpZiAocHJvdG9jb2wgPT0gRVRIX1BfSVApIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIgICAgIHNyYz0lcEk0XG4iLCAmaWgtPnNhZGRyKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbCA9PSBFVEhfUF9JUFY2KSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICBzcmM9JXBJNlxuIiwgJmloLT5zYWRkcik7Ci0JCX0KKwkJaWYgKHByb3RvY29sID09IEVUSF9QX0lQKQorCQkJbmV0ZGV2X2RiZyhkZXYsICIgICAgIHNyYz0lcEk0XG4iLCAmaWgtPnNhZGRyKTsKKwkJZWxzZSBpZiAocHJvdG9jb2wgPT0gRVRIX1BfSVBWNikKKwkJCW5ldGRldl9kYmcoZGV2LCAiICAgICBzcmM9JXBJNlxuIiwgJmloLT5zYWRkcik7CiAJfQogCi0JI2lmIChEVU1QX1BBQ0tFVCAmIERVTVBfU0RVX0FMTCkKLQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JI2Vsc2UKLQkJI2lmIChEVU1QX1BBQ0tFVCAmIERVTVBfU0RVX0FSUCkKLQkJaWYgKHByb3RvY29sID09IEVUSF9QX0FSUCkKLQkJCXByaW50a19oZXgoZGF0YSwgbGVuKTsKLQkJI2VuZGlmCi0JCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9JUCkKLQkJaWYgKHByb3RvY29sID09IEVUSF9QX0lQIHx8IHByb3RvY29sID09IEVUSF9QX0lQVjYpCi0JCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCSNlbHNlCi0JCQkjaWYgKERVTVBfUEFDS0VUICYgRFVNUF9TRFVfSVBfVENQKQotCQkJaWYgKGlwX3Byb3RvY29sID09IElQUFJPVE9fVENQKQotCQkJCXByaW50a19oZXgoZGF0YSwgbGVuKTsKLQkJCSNlbmRpZgotCQkJI2lmIChEVU1QX1BBQ0tFVCAmIERVTVBfU0RVX0lQX1VEUCkKLQkJCWlmIChpcF9wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKLQkJCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCQkjZW5kaWYKLQkJCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9JUF9JQ01QKQotCQkJaWYgKGlwX3Byb3RvY29sID09IElQUFJPVE9fSUNNUCkKLQkJCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCQkjZW5kaWYKLQkJI2VuZGlmCi0JI2VuZGlmCisJcHJpbnRfaGV4X2R1bXBfZGVidWcoIiIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBkYXRhLCBsZW4sIGZhbHNlKTsKIH0KLSNlbmRpZgotCiAKIHN0YXRpYyBpbmxpbmUgaW50IGdkbV93aW1heF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewpAQCAtMjM3LDEyICsxOTYsMTAgQEAKIHsKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JI2lmIGRlZmluZWQoREVCVUdfSENJKQogCXU4ICpidWYgPSAodTggKikgbXNnOwogCXUxNiBoY2lfY21kID0gIChidWZbMF08PDgpIHwgYnVmWzFdOwogCXUxNiBoY2lfbGVuID0gKGJ1ZlsyXTw8OCkgfCBidWZbM107Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkg9PkQ6IDB4JTA0eCglZClcbiIsIGhjaV9jbWQsIGhjaV9sZW4pOwotCSNlbmRpZgorCW5ldGRldl9kYmcoZGV2LCAiSD0+RDogMHglMDR4KCVkKVxuIiwgaGNpX2NtZCwgaGNpX2xlbik7CiAKIAlnZG1fd2ltYXhfc2VuZChuaWMsIG1zZywgbGVuKTsKIH0KQEAgLTM1MSwxMSArMzA4LDkgQEAKIAlzdHJ1Y3QgZXZ0X2VudHJ5ICplOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkjaWYgZGVmaW5lZChERUJVR19IQ0kpCiAJdTE2IGhjaV9jbWQgPSAgKCh1OClidWZbMF08PDgpIHwgKHU4KWJ1ZlsxXTsKIAl1MTYgaGNpX2xlbiA9ICgodTgpYnVmWzJdPDw4KSB8ICh1OClidWZbM107Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkQ9Pkg6IDB4JTA0eCglZClcbiIsIGhjaV9jbWQsIGhjaV9sZW4pOwotCSNlbmRpZgorCW5ldGRldl9kYmcoZGV2LCAiRD0+SDogMHglMDR4KCVkKVxuIiwgaGNpX2NtZCwgaGNpX2xlbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd21fZXZlbnQuZXZ0X2xvY2ssIGZsYWdzKTsKIApAQCAtNDE1LDkgKzM3MCw3IEBACiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZnNtX3MgKmZzbSA9IChzdHJ1Y3QgZnNtX3MgKikgbmljLT5zZGtfZGF0YVtTSU9DX0RBVEFfRlNNXS5idWY7CiAKLQkjaWYgZGVmaW5lZChERUJVR19TRFUpCi0JZHVtcF9ldGhfcGFja2V0KCJUWCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCSNlbmRpZgorCWR1bXBfZXRoX3BhY2tldChkZXYsICJUWCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCiAJcmV0ID0gZ2RtX3dpbWF4X2hlYWRlcigmc2tiKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNTQwLDcgKzQ5Myw3IEBACiAJaWYgKHNyYy0+c2l6ZSkgewogCQlpZiAoIWRzdC0+YnVmKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChjb3B5X3RvX3VzZXIoZHN0LT5idWYsIHNyYy0+YnVmLCBzaXplKSkKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilkc3QtPmJ1Ziwgc3JjLT5idWYsIHNpemUpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXJldHVybiAwOwpAQCAtNTYzLDcgKzUxNiw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoZHN0LT5idWYsIHNyYy0+YnVmLCBzcmMtPnNpemUpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKGRzdC0+YnVmLCAodm9pZCBfX3VzZXIgKilzcmMtPmJ1Ziwgc3JjLT5zaXplKSkgewogCQlrZGVsZXRlKCZkc3QtPmJ1Zik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTc1Niw5ICs3MDksNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJldDsKIAotCSNpZiBkZWZpbmVkKERFQlVHX1NEVSkKLQlkdW1wX2V0aF9wYWNrZXQoIlJYIiwgYnVmLCBsZW4pOwotCSNlbmRpZgorCWR1bXBfZXRoX3BhY2tldChkZXYsICJSWCIsIGJ1ZiwgbGVuKTsKIAogCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CiAJaWYgKCFza2IpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmgKaW5kZXggNmVjMGFiNC4uMWZjZmM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmgKQEAgLTYyLDI2ICs2Miw2IEBACiAKIH07CiAKLQotI2lmIDAKLSNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MgLi4uKQlwcmludGsoS0VSTl9ERUJVRyAiIFtHRE1dICIgZm10LCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgZHByaW50ayguLi4pCi0jZW5kaWYKLQotLyojZGVmaW5lIERFQlVHX1NEVSAqLwotI2lmIGRlZmluZWQoREVCVUdfU0RVKQotI2RlZmluZSBEVU1QX1NEVV9BTEwJCSgxPDwwKQotI2RlZmluZSBEVU1QX1NEVV9BUlAJCSgxPDwxKQotI2RlZmluZSBEVU1QX1NEVV9JUAkJCSgxPDwyKQotI2RlZmluZSBEVU1QX1NEVV9JUF9UQ1AJCSgxPDw4KQotI2RlZmluZSBEVU1QX1NEVV9JUF9VRFAJCSgxPDw5KQotI2RlZmluZSBEVU1QX1NEVV9JUF9JQ01QCSgxPDwxMCkKLSNkZWZpbmUgRFVNUF9QQUNLRVQJCQkoRFVNUF9TRFVfQUxMKQotI2VuZGlmCi0KLS8qI2RlZmluZSBERUJVR19IQ0kgKi8KLQogLyojZGVmaW5lIExPT1BCQUNLX1RFU1QgKi8KIAogZXh0ZXJuIGludCByZWdpc3Rlcl93aW1heF9kZXZpY2Uoc3RydWN0IHBoeV9kZXYgKnBoeV9kZXYsIHN0cnVjdCBkZXZpY2UgKnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTA2NDUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L0tjb25maWcKQEAgLTAsMCArMSw4IEBACisjCisjICJ4aWxpbnggRlBHQSBmaXJtd2FyZSBkb3dubG9hZCwgZnBnYWJvb3QiCisjCitjb25maWcgR1NfRlBHQUJPT1QKKwl0cmlzdGF0ZSAiWGlsaW54IEZQR0EgZmlybXdhcmUgZG93bmxvYWQgbW9kdWxlIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFhpbGlueCBGUEdBIGZpcm13YXJlIGRvd25sb2FkIG1vZHVsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2I2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitnc19mcGdhLXkJKz0gZ3NfZnBnYWJvb3QubyBpby5vCitvYmotJChDT05GSUdfR1NfRlBHQUJPT1QpCSs9IGdzX2ZwZ2EubworCitjY2ZsYWdzLSQoQ09ORklHX0dTX0ZQR0FfREVCVUcpCTo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTg2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvUkVBRE1FCkBAIC0wLDAgKzEsNzEgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGludXggRHJpdmVyIFNvdXJjZSBmb3IgWGlsaW54IEZQR0EgZmlybXdhcmUgZG93bmxvYWQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RBQkxFIE9GIENPTlRFTlRTLgorCisxLiAgU1VNTUFSWQorMi4gIEJBQ0tHUk9VTkQKKzMuICBERVNJR04KKzQuICBIT1cgVE8gVVNFCis1LiAgUkVGRVJFTkNFCisKKzEuIFNVTU1BUlkKKworCS0gRG93bmxvYWQgWGlsaW54IEZQR0EgZmlybXdhcmUKKwktIFRoaXMgbW9kdWxlIGRvd25sb2FkcyBYaWxpbnggRlBHQSBmaXJtd2FyZSB1c2luZyBncGlvIHBpbnMuCisKKzIuIEJBQ0tHUk9VTkQKKworCUFuIEZQR0EgKEZpZWxkIFByb2dyYW1tYWJsZSBHYXRlIEFycmF5KSBpcyBhIHByb2dyYW1tYWJsZSBoYXJkd2FyZSB0aGF0IGlzCisJdXNlZCBpbiB2YXJpb3VzIGFwcGxpY2F0aW9ucy4gSGFyZHdhcmUgZGVzaWduIG5lZWRzIHRvIHByb2dyYW1tZWQgdGhyb3VnaAorCWEgZGVkaWNhdGVkIGRldmljZSBvciBDUFUgYXNzaXN0ZWQgd2F5IChzZXJpYWwgb3IgcGFyYWxsZWwpLgorCVRoaXMgZHJpdmVyIHByb3ZpZGVzIGEgd2F5IHRvIGRvd25sb2FkIEZQR0EgZmlybXdhcmUuCisKKzMuIERFU0lHTgorCisJLSBsb2FkIFhpbGlueCBGUEdBIGJpdHN0cmVhbSBmb3JtYXRbMV0gZmlybXdhcmUgaW1hZ2UgZmlsZSB1c2luZyAKKwkgIGtlcm5lbCBmaXJtd2FyZSBmcmFtZXdvcmssIHJlcXVlc3RfZmlybXdhcmUoKQorCS0gcHJvZ3JhbSB0aGUgWGlsaW54IEZQR0EgdXNpbmcgU2VsZWN0TUFQIChwYXJhbGxlbCkgbW9kZSBbMl0KKwktIEZQR0EgcHJncmFtIGlzIGRvbmUgYnkgZ3BpbyBiYXNlZCBiaXQtYmFuZ2luZywgYXMgYW4gZXhhbXBsZQorCS0gcGxhdGZvcm0gaW5kZXBlbmRlbnQgZmlsZTogZ3NfZnBnYWJvb3QuYworCS0gcGxhdGZvcm0gZGVwZW5kZW50IGZpbGU6IGlvLmMKKwkKKworNC4gSE9XIFRPIFVTRQorCisJJCBpbnNtb2QgZ3NfZnBnYS5rbyBmaWxlPSJ4bGlueF9mcGdhX3RvcF9iaXRzdHJlYW0uYml0IgorCSQgcm1tb2QgZ3NfZnBnYQorCis1LiBVU0UgQ0FTRSAoZnJvbSBhIG1haWxpbmcgbGlzdCBkaXNjdXNzaW9uIHdpdGggR3JlZykKKworCWEuIEFzIGEgRlBHQSBkZXZlbG9wbWVudCBzdXBwb3J0IHRvb2wsCisJRHVyaW5nIEZQR0EgZmlybXdhcmUgZGV2ZWxvcG1lbnQsIHlvdSBuZWVkIHRvIGRvd25sb2FkIGEgbmV3IEZQR0EKKwlpbWFnZSBmcmVxdWVudGx5LgorCVlvdSB3b3VsZCBkbyB0aGF0IHdpdGggYSBkZWRpY2F0ZWQgSlRBRywgd2hpY2ggdXN1YWxseSBhIGxpbWl0ZWQKKwlyZXNvdXJjZSBpbiB0aGUgbGFiLgorCUhvd2V2ZXIsIGlmIHlvdSB1c2UgbXkgZHJpdmVyLCB5b3UgZG9uJ3QgaGF2ZSB0byBoYXZlIGEgZGVkaWNhdGVkIEpUQUcuCisJVGhpcyBpcyBhIHJlYWwgZ2FpbiA6KQorCisJYi4gRm9yIHRoZSBGUEdBIHRoYXQgcnVucyB3aXRob3V0IGNvbmZpZyBhZnRlciB0aGUgZG93bmxvYWQsIHdoaWNoCisJZG9lc24ndCB0YWxrIHRvIGFueSBvZiBMaW51eCBpbnRlcmZhY2VzIChzdWNoIGFzIFBDSUUpLgorCisJV2UgZG93bmxvYWQgRlBHQSBmaXJtd2FyZSBmcm9tIHVzZXIgdHJpZ2dlcmVkIG9yIHNvbWUgb3RoZXIgd2F5LCBhbmQgdGhhdCdzIGl0LgorCVNpbmNlIHRoYXQgRlBHQSBydW5zIG9uIGl0cyBvd24sIGl0IGRvZXNuJ3QgcmVxdWlyZSBhIGxpbnV4IGRyaXZlcgorCWFmdGVyIHRoZSBkb3dubG9hZC4KKworCWMuIEZvciB0aGUgRlBHQSB0aGF0IHJlcXVpcmVzIGNvbmZpZyBhZnRlciB0aGUgZG93bmxvYWQsIHdoaWNoIHRhbGsgdG8KKwlhbnkgb2YgbGludXggaW50ZXJmYWNlcyAoc3VjaCBhcyBQQ0lFKQorCisJVGhlbiwgdGhpcyB0eXBlIG9mIEZQR0EgY29uZmlnIGNhbiBiZSBwdXQgaW50byBkZXZpY2UgdHJlZSBhbmQgaGF2ZSBhCisJc2VwYXJhdGUgZHJpdmVyIChwY2llIG9yIG90aGVycyksIHRoZW4gVEhBVCBkcml2ZXIgY2FsbHMgbXkgZHJpdmVyIHRvCisJZG93bmxvYWQgRlBHQSBmaXJtd2FyZSBkdXJpbmcgdGhlIExpbnV4IGJvb3QsIHRoZSB0YWtlIG92ZXIgdGhlIGRldmljZQorCXRocm91Z2ggdGhlIGludGVyZmFjZS4KKworNi4gUkVGRVJFTkNFCisKKwkxLiBYaWxpbnggQVBQIE5PVEUgWEFQUDU4MzoKKwkgIGh0dHA6Ly93d3cueGlsaW54LmNvbS9zdXBwb3J0L2RvY3VtZW50YXRpb24vYXBwbGljYXRpb25fbm90ZXMveGFwcDU4My1mcGdhLWNvbmZpZ3VyYXRpb24ucGRmCisJMi4gYml0c3RyZWFtIGZpbGUgaW5mbzoKKwkgIGh0dHA6Ly9ob21lLmVhcnRobGluay5uZXQvfmRhdmVzdWxsaW5zL3NvZnR3YXJlL2JpdGluZm8uaHRtbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDlmYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1RPRE8KQEAgLTAsMCArMSw3IEBACitUT0RPOgorCS0gZ2V0IGJ1cyB3aWR0aCBpbnB1dCBpbnN0ZWFkIG9mIGhhcmRjb2RlZCBidXMgd2lkdGgKKwktIGdldCBpdCByZXZpZXdlZAorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBmb3IgdGhpcyBkcml2ZXIgdG8gSW5zb3AgU29uZzxpbnNvcC5zb25nQGdhaW5zcGVlZC5jb20+CithbmQgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4uCitBbmQgcGxlYXNlIENDIHRvICJTdGFnaW5nIHN1YnN5c3RlbSIgbWFpbCBsaXN0IDxkZXZlbEBkcml2ZXJkZXYub3N1b3NsLm9yZz4gdG9vLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJjODRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAiZ3NfZnBnYWJvb3QuaCIKKyNpbmNsdWRlICJpby5oIgorCisjZGVmaW5lIERFVklDRV9OQU1FICJkZXZpY2UiCisjZGVmaW5lIENMQVNTX05BTUUgICJmcGdhYm9vdCIKKworc3RhdGljIHVpbnQ4X3QgYml0c19tYWdpY1tdID0geworCTB4MCwgMHg5LCAweGYsIDB4ZjAsIDB4ZiwgMHhmMCwKKwkweGYsIDB4ZjAsIDB4ZiwgMHhmMCwgMHgwLCAweDAsIDB4MX07CisKKy8qIGZha2UgZGV2aWNlIGZvciByZXF1ZXN0X2Zpcm13YXJlICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkqZmlybXdhcmVfcGRldjsKKworc3RhdGljIGNoYXIJKmZpbGUgPSAieGxpbnhfZnBnYV9maXJtd2FyZS5iaXQiOworbW9kdWxlX3BhcmFtKGZpbGUsIGNoYXJwLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZmlsZSwgIlhpbGlueCBGUEdBIGZpcm13YXJlIGZpbGUuIik7CisKKyNpZmRlZiBERUJVR19GUEdBCitzdGF0aWMgdm9pZCBkYXRhZHVtcChjaGFyICptc2csIHZvaWQgKm0sIGludCBuKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmM7CisKKwlwcl9pbmZvKCI9PT0gJXMgPT09XG4iLCBtc2cpOworCisJYyA9IG07CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWlmICgoaSYweGYpID09IDApCisJCQlwcl9pbmZvKEtFUk5fSU5GTyAiXG4gIDB4JTR4OiAiLCBpKTsKKworCQlwcl9pbmZvKCIlMDJYICIsIGNbaV0pOworCX0KKworCXByX2luZm8oIlxuIik7Cit9CisjZW5kaWYgLyogREVCVUdfRlBHQSAqLworCitzdGF0aWMgdm9pZCByZWFkX2JpdHN0cmVhbShjaGFyICpiaXRkYXRhLCBjaGFyICpidWYsIGludCAqb2Zmc2V0LCBpbnQgcmRzaXplKQoreworCW1lbWNweShidWYsIGJpdGRhdGEgKyAqb2Zmc2V0LCByZHNpemUpOworCSpvZmZzZXQgKz0gcmRzaXplOworfQorCitzdGF0aWMgdm9pZCByZWFkaW5mb19iaXRzdHJlYW0oY2hhciAqYml0ZGF0YSwgY2hhciAqYnVmLCBpbnQgKm9mZnNldCkKK3sKKwljaGFyIHRidWZbNjRdOworCWludDMyX3QgbGVuOworCisJLyogcmVhZCBzZWN0aW9uIGNoYXIgKi8KKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCB0YnVmLCBvZmZzZXQsIDEpOworCisJLyogcmVhZCBsZW5ndGggKi8KKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCB0YnVmLCBvZmZzZXQsIDIpOworCisJbGVuID0gdGJ1ZlswXSA8PCA4IHwgdGJ1ZlsxXTsKKworCXJlYWRfYml0c3RyZWFtKGJpdGRhdGEsIGJ1Ziwgb2Zmc2V0LCBsZW4pOworCWJ1ZltsZW5dID0gJ1wwJzsKK30KKworLyoKKyAqIHJlYWQgYml0ZGF0YSBsZW5ndGgKKyAqLworc3RhdGljIGludCByZWFkbGVuZ3RoX2JpdHN0cmVhbShjaGFyICpiaXRkYXRhLCBpbnQgKmxlbmRhdGEsIGludCAqb2Zmc2V0KQoreworCWNoYXIgdGJ1Zls2NF07CisKKwkvKiByZWFkIHNlY3Rpb24gY2hhciAqLworCXJlYWRfYml0c3RyZWFtKGJpdGRhdGEsIHRidWYsIG9mZnNldCwgMSk7CisKKwkvKiBtYWtlIHN1cmUgaXQgaXMgc2VjdGlvbiAnZScgKi8KKwlpZiAodGJ1ZlswXSAhPSAnZScpIHsKKwkJcHJfZXJyKCJlcnJvcjogbGVuZ3RoIHNlY3Rpb24gaXMgbm90ICdlJywgYnV0ICVjXG4iLCB0YnVmWzBdKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHJlYWQgNGJ5dGVzIGxlbmd0aCAqLworCXJlYWRfYml0c3RyZWFtKGJpdGRhdGEsIHRidWYsIG9mZnNldCwgNCk7CisKKwkqbGVuZGF0YSA9IHRidWZbMF0gPDwgMjQgfCB0YnVmWzFdIDw8IDE2IHwKKwkJdGJ1ZlsyXSA8PCA4IHwgdGJ1ZlszXTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiByZWFkIGZpcnN0IDEzIGJ5dGVzIHRvIGNoZWNrIGJpdHN0cmVhbSBtYWdpYyBudW1iZXIKKyAqLworc3RhdGljIGludCByZWFkbWFnaWNfYml0c3RyZWFtKGNoYXIgKmJpdGRhdGEsIGludCAqb2Zmc2V0KQoreworCWNoYXIgYnVmWzEzXTsKKwlpbnQgcjsKKworCXJlYWRfYml0c3RyZWFtKGJpdGRhdGEsIGJ1Ziwgb2Zmc2V0LCAxMyk7CisJciA9IG1lbWNtcChidWYsIGJpdHNfbWFnaWMsIDEzKTsKKwlpZiAocikgeworCQlwcl9lcnIoImVycm9yOiBjb3JydXB0ZWQgaGVhZGVyIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJfaW5mbygiYml0c3RyZWFtIGZpbGUgbWFnaWMgbnVtYmVyIE9rXG4iKTsKKworCSpvZmZzZXQgPSAxMzsJLyogbWFnaWMgbGVuZ3RoICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5PVEU6IHN1cHBvcnRzIG9ubHkgYml0c3RyZWFtIGZvcm1hdAorICovCitzdGF0aWMgZW51bSBmbXRfaW1hZ2UgZ2V0X2ltYWdlZm9ybWF0KHN0cnVjdCBmcGdhaW1hZ2UgKmZpbWFnZSkKK3sKKwlyZXR1cm4gZl9iaXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdzX3ByaW50X2hlYWRlcihzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJcHJfaW5mbygiZmlsZTogJXNcbiIsIGZpbWFnZS0+ZmlsZW5hbWUpOworCXByX2luZm8oInBhcnQ6ICVzXG4iLCBmaW1hZ2UtPnBhcnQpOworCXByX2luZm8oImRhdGU6ICVzXG4iLCBmaW1hZ2UtPmRhdGUpOworCXByX2luZm8oInRpbWU6ICVzXG4iLCBmaW1hZ2UtPnRpbWUpOworCXByX2luZm8oImxlbmRhdGE6ICVkXG4iLCBmaW1hZ2UtPmxlbmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBnc19yZWFkX2JpdHN0cmVhbShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJY2hhciAqYml0ZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gMDsKKwliaXRkYXRhID0gKGNoYXIgKilmaW1hZ2UtPmZ3X2VudHJ5LT5kYXRhOworCXNpemUgPSBmaW1hZ2UtPmZ3X2VudHJ5LT5zaXplOworCisJcmVhZG1hZ2ljX2JpdHN0cmVhbShiaXRkYXRhLCAmb2Zmc2V0KTsKKwlyZWFkaW5mb19iaXRzdHJlYW0oYml0ZGF0YSwgZmltYWdlLT5maWxlbmFtZSwgJm9mZnNldCk7CisJcmVhZGluZm9fYml0c3RyZWFtKGJpdGRhdGEsIGZpbWFnZS0+cGFydCwgJm9mZnNldCk7CisJcmVhZGluZm9fYml0c3RyZWFtKGJpdGRhdGEsIGZpbWFnZS0+ZGF0ZSwgJm9mZnNldCk7CisJcmVhZGluZm9fYml0c3RyZWFtKGJpdGRhdGEsIGZpbWFnZS0+dGltZSwgJm9mZnNldCk7CisJcmVhZGxlbmd0aF9iaXRzdHJlYW0oYml0ZGF0YSwgJmZpbWFnZS0+bGVuZGF0YSwgJm9mZnNldCk7CisKKwlmaW1hZ2UtPmZwZ2FkYXRhID0gYml0ZGF0YSArIG9mZnNldDsKK30KKworc3RhdGljIGludCBnc19yZWFkX2ltYWdlKHN0cnVjdCBmcGdhaW1hZ2UgKmZpbWFnZSkKK3sKKwlpbnQgaW1nX2ZtdDsKKworCWltZ19mbXQgPSBnZXRfaW1hZ2Vmb3JtYXQoZmltYWdlKTsKKworCXN3aXRjaCAoaW1nX2ZtdCkgeworCWNhc2UgZl9iaXQ6CisJCXByX2luZm8oImltYWdlIGlzIGJpdHN0cmVhbSBmb3JtYXRcbiIpOworCQlnc19yZWFkX2JpdHN0cmVhbShmaW1hZ2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVuc3VwcG9ydGVkIGZwZ2EgaW1hZ2UgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWdzX3ByaW50X2hlYWRlcihmaW1hZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NfbG9hZF9pbWFnZShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UsIGNoYXIgKmZpbGUpCit7CisJaW50IGVycjsKKworCXByX2luZm8oImxvYWQgZnBnYWltYWdlICVzXG4iLCBmaWxlKTsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZpbWFnZS0+ZndfZW50cnksIGZpbGUsICZmaXJtd2FyZV9wZGV2LT5kZXYpOworCWlmIChlcnIgIT0gMCkgeworCQlwcl9lcnIoImZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBjb250aW51ZS5cbiIsIGZpbGUpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzX2Rvd25sb2FkX2ltYWdlKHN0cnVjdCBmcGdhaW1hZ2UgKmZpbWFnZSwgZW51bSB3YnVzIGJ1c19ieXRlcykKK3sKKwljaGFyICpiaXRkYXRhOworCWludCBzaXplLCBpLCBjbnQ7CisJY250ID0gMDsKKworCWJpdGRhdGEgPSAoY2hhciAqKWZpbWFnZS0+ZnBnYWRhdGE7CisJc2l6ZSA9IGZpbWFnZS0+bGVuZGF0YTsKKworI2lmZGVmIERFQlVHX0ZQR0EKKwlkYXRhZHVtcCgiYml0ZmlsZSBzYW1wbGUiLCBiaXRkYXRhLCAweDEwMCk7CisjZW5kaWYgLyogREVCVUdfRlBHQSAqLworCisJaWYgKCF4bF9zdXBwb3J0ZWRfcHJvZ19idXNfd2lkdGgoYnVzX2J5dGVzKSkgeworCQlwcl9lcnIoInVuc3VwcG9ydGVkIHByb2dyYW0gYnVzIHdpZHRoICVkXG4iLAorCQkJCWJ1c19ieXRlcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBCcmluZyBjc2lfYiwgcmR3cl9iIExvdyBhbmQgcHJvZ3JhbV9iIEhpZ2ggKi8KKwl4bF9wcm9ncmFtX2IoMSk7CisJeGxfcmR3cl9iKDApOworCXhsX2NzaV9iKDApOworCisJLyogQ29uZmlndXJhdGlvbiByZXNldCAqLworCXhsX3Byb2dyYW1fYigwKTsKKwltc2xlZXAoMjApOworCXhsX3Byb2dyYW1fYigxKTsKKworCS8qIFdhaXQgZm9yIERldmljZSBJbml0aWFsaXphdGlvbiAqLworCXdoaWxlICh4bF9nZXRfaW5pdF9iKCkgPT0gMCkKKwkJOworCisJcHJfaW5mbygiZGV2aWNlIGluaXQgZG9uZVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBidXNfYnl0ZXMpCisJCXhsX3NoaWZ0X2J5dGVzX291dChidXNfYnl0ZXMsIGJpdGRhdGEraSk7CisKKwlwcl9pbmZvKCJwcm9ncmFtIGRvbmVcbiIpOworCisJLyogQ2hlY2sgSU5JVF9CICovCisJaWYgKHhsX2dldF9pbml0X2IoKSA9PSAwKSB7CisJCXByX2VycigiaW5pdF9iIDBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2hpbGUgKHhsX2dldF9kb25lX2IoKSA9PSAwKSB7CisJCWlmIChjbnQrKyA+IE1BWF9XQUlUX0RPTkUpIHsKKwkJCXByX2VycigiaW5pdF9CICVkXG4iLCB4bF9nZXRfaW5pdF9iKCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY250ID4gTUFYX1dBSVRfRE9ORSkgeworCQlwcl9lcnIoImZwZ2EgZG93bmxvYWQgZmFpbFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9pbmZvKCJkb3dubG9hZCBmcGdhaW1hZ2VcbiIpOworCisJLyogQ29tcGVuc2F0ZSBmb3IgU3BlY2lhbCBTdGFydHVwIENvbmRpdGlvbnMgKi8KKwl4bF9zaGlmdF9jY2xrKDgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NfcmVsZWFzZV9pbWFnZShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJcmVsZWFzZV9maXJtd2FyZShmaW1hZ2UtPmZ3X2VudHJ5KTsKKwlwcl9pbmZvKCJyZWxlYXNlIGZwZ2FpbWFnZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5PVEU6IHN1cHBvcnRzIHN5c3RlbW1hcCBwYXJhbGxlbCBwcm9ncmFtbWluZworICovCitzdGF0aWMgaW50IGdzX3NldF9kb3dubG9hZF9tZXRob2Qoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCXByX2luZm8oInNldCBwcm9ncmFtIG1ldGhvZFxuIik7CisKKwlmaW1hZ2UtPmRtZXRob2QgPSBtX3N5c3RlbW1hcDsKKworCXByX2luZm8oInN5c3RlbW1hcCBwcm9ncmFtIG1ldGhvZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2RyaXZlcih2b2lkKQoreworCWZpcm13YXJlX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmcGdhYm9vdCIsIC0xLAorCQkJCQkJCSBOVUxMLCAwKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGZpcm13YXJlX3BkZXYpOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfZHJpdmVyKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZmlybXdhcmVfcGRldik7Cit9CisKK3N0YXRpYyBpbnQgZ3NfZnBnYWJvb3Qodm9pZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmcGdhaW1hZ2UJKmZpbWFnZTsKKworCWZpbWFnZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcGdhaW1hZ2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmltYWdlID09IE5VTEwpIHsKKwkJcHJfZXJyKCJObyBtZW1vcnkgaXMgYXZhaWxhYmxlXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWVyciA9IGdzX2xvYWRfaW1hZ2UoZmltYWdlLCBmaWxlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZ3NfbG9hZF9pbWFnZSBlcnJvclxuIik7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJZXJyID0gZ3NfcmVhZF9pbWFnZShmaW1hZ2UpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJnc19yZWFkX2ltYWdlIGVycm9yXG4iKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwllcnIgPSBnc19zZXRfZG93bmxvYWRfbWV0aG9kKGZpbWFnZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX3NldF9kb3dubG9hZF9tZXRob2QgZXJyb3JcbiIpOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCWVyciA9IGdzX2Rvd25sb2FkX2ltYWdlKGZpbWFnZSwgYnVzXzJieXRlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZ3NfZG93bmxvYWRfaW1hZ2UgZXJyb3JcbiIpOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCWVyciA9IGdzX3JlbGVhc2VfaW1hZ2UoZmltYWdlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZ3NfcmVsZWFzZV9pbWFnZSBlcnJvclxuIik7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJa2ZyZWUoZmltYWdlKTsKKwlyZXR1cm4gMDsKKworZXJyX291dDI6CisJZXJyID0gZ3NfcmVsZWFzZV9pbWFnZShmaW1hZ2UpOworCWlmIChlcnIpCisJCXByX2VycigiZ3NfcmVsZWFzZV9pbWFnZSBlcnJvclxuIik7CitlcnJfb3V0MToKKwlrZnJlZShmaW1hZ2UpOworCitlcnJfb3V0OgorCXJldHVybiAtMTsKKworfQorCitzdGF0aWMgaW50IF9faW5pdCBnc19mcGdhYm9vdF9pbml0KHZvaWQpCit7CisJaW50IGVyciwgcjsKKworCXIgPSAtMTsKKworCXByX2luZm8oIkZQR0EgRE9XTkxPQUQgLS0tPlxuIik7CisJcHJfaW5mbygiYnVpbHQgYXQgJXMgVVRDXG4iLCBfX1RJTUVTVEFNUF9fKTsKKworCXByX2luZm8oIkZQR0EgaW1hZ2UgZmlsZSBuYW1lOiAlc1xuIiwgZmlsZSk7CisKKwllcnIgPSBpbml0X2RyaXZlcigpOworCWlmIChlcnIgIT0gMCkgeworCQlwcl9lcnIoIkZQR0EgRFJJVkVSIElOSVQgRkFJTCEhXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCisJZXJyID0geGxfaW5pdF9pbygpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJHUElPIElOSVQgRkFJTCEhXG4iKTsKKwkJciA9IC0xOworCQlnb3RvIGVycm91dDsKKwl9CisKKwllcnIgPSBnc19mcGdhYm9vdCgpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJGUEdBIERPV05MT0FEIEZBSUwhIVxuIik7CisJCXIgPSAtMTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJcHJfaW5mbygiRlBHQSBET1dOTE9BRCBET05FIDwtLS1cbiIpOworCisJciA9IDA7CisJcmV0dXJuIHI7CisKK2Vycm91dDoKKwlmaW5pc2hfZHJpdmVyKCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdzX2ZwZ2Fib290X2V4aXQodm9pZCkKK3sKKwlmaW5pc2hfZHJpdmVyKCk7CisJcHJfaW5mbygiRlBHQSBpbWFnZSBkb3dubG9hZCBtb2R1bGUgcmVtb3ZlZFxuIik7Cit9CisKK21vZHVsZV9pbml0KGdzX2ZwZ2Fib290X2luaXQpOworbW9kdWxlX2V4aXQoZ3NfZnBnYWJvb3RfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkluc29wIFNvbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGxpbml4IEZQR0EgZmlybXdhcmUgZG93bmxvYWQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxZjRjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNkZWZpbmUJTUFYX1NUUgkyNTYKKworZW51bSBmbXRfaW1hZ2UgeworCWZfYml0LAkvKiBvbmx5IGJpdHN0cmVhbSBpcyBzdXBwb3J0ZWQgKi8KKwlmX3JidCwKKwlmX2JpbiwKKwlmX21jcywKKwlmX2hleCwKK307CisKK2VudW0gbWRvd25sb2FkIHsKKwltX3N5c3RlbW1hcCwJLyogb25seSBzeXN0ZW0gbWFwIGlzIHN1cHBvcnRlZCAqLworCW1fc2VyaWFsLAorCW1fanRhZywKK307CisKKy8qCisgKiB4aWxpbnggZnBnYWltYWdlIGluZm9ybWF0aW9uCisgKiBOT1RFOiB1c2UgTUFYX1NUUiBpbnN0ZWFkIG9mIGR5bmFtaWMgYWxsb2MgZm9yIHNpbXBsaWNpdHkKKyAqLworc3RydWN0IGZwZ2FpbWFnZSB7CisJZW51bSBmbXRfaW1hZ2UJZm10X2ltZzsKKwllbnVtIG1kb3dubG9hZAlkbWV0aG9kOworCisJY29uc3Qgc3RydWN0CWZpcm13YXJlCSpmd19lbnRyeTsKKworCS8qCisJICogdGhlIGZvbGxvd2luZ3MgY2FuIGJlIHJlYWQgZnJvbSBiaXRzdHJlYW0sCisJICogYnV0IG90aGVyIGltYWdlIGZvcm1hdCBzaG91bGQgaGF2ZSBhcyB3ZWxsCisJICovCisJY2hhcglmaWxlbmFtZVtNQVhfU1RSXTsKKwljaGFyCXBhcnRbTUFYX1NUUl07CisJY2hhcglkYXRlW01BWF9TVFJdOworCWNoYXIJdGltZVtNQVhfU1RSXTsKKwlpbnQzMl90CWxlbmRhdGE7CisJY2hhcgkqZnBnYWRhdGE7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JlOGUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImlvLmgiCisKKyNpZmRlZiBDT05GSUdfQjQ4NjBHMTAwCitzdGF0aWMgc3RydWN0IGdwaW9idXMgZ2J1czsKKyNlbmRpZiAvKiBDT05GSUdfQjQ4NjBHMTAwICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBieXRlMF9vdXQodW5zaWduZWQgY2hhciBkYXRhKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBieXRlMV9vdXQodW5zaWduZWQgY2hhciBkYXRhKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bF9jY2xrX2IoaW50MzJfdCBpKTsKKworCisvKiBBc3NlcnQgYW5kIERlYXNzZXJ0IENDTEsgKi8KK3ZvaWQgeGxfc2hpZnRfY2NsayhpbnQgY291bnQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJeGxfY2Nsa19iKDEpOworCQl4bF9jY2xrX2IoMCk7CisJfQorfQorCitpbnQgeGxfc3VwcG9ydGVkX3Byb2dfYnVzX3dpZHRoKGVudW0gd2J1cyBidXNfYnl0ZXMpCit7CisJc3dpdGNoIChidXNfYnl0ZXMpIHsKKwljYXNlIGJ1c18xYnl0ZToKKwkJYnJlYWs7CisJY2FzZSBidXNfMmJ5dGU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigidW5zdXBwb3J0ZWQgcHJvZ3JhbSBidXMgd2lkdGggJWRcbiIsCisJCQkJYnVzX2J5dGVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFNlcmlhbGl6ZSBieXRlIGFuZCBjbG9jayBlYWNoIGJpdCBvbiB0YXJnZXQncyBESU4gYW5kIENDTEsgcGlucyAqLwordm9pZCB4bF9zaGlmdF9ieXRlc19vdXQoZW51bSB3YnVzIGJ1c19ieXRlLCB1bnNpZ25lZCBjaGFyICpwZGF0YSkKK3sKKwkvKgorCSAqIHN1cHBvcnRzIDEgYW5kIDIgYnl0ZXMgcHJvZ3JhbW1pbmcgbW9kZQorCSAqLworCWlmIChsaWtlbHkoYnVzX2J5dGUgPT0gYnVzXzJieXRlKSkKKwkJYnl0ZTBfb3V0KHBkYXRhWzBdKTsKKworCWJ5dGUxX291dChwZGF0YVsxXSk7CisJeGxfc2hpZnRfY2NsaygxKTsKK30KKworLyoKKyAqIGdlbmVyaWMgYml0IHN3YXAgZm9yIHhpbGlueCBTWVNURU1NQVAgRlBHQSBwcm9ncmFtbWluZworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgYml0c3dhcCh1bnNpZ25lZCBjaGFyIHMpCit7CisJdW5zaWduZWQgY2hhciBkOworCWQgPSAoKChzJjB4ODApPj43KSB8ICgocyYweDQwKT4+NSkgfCAoKHMmMHgyMCk+PjMpIHwgKChzJjB4MTApPj4xKSB8CisJCSgocyYweDA4KTw8MSkgfCAoKHMmMHgwNCk8PDMpIHwgKChzJjB4MDIpPDw1KSB8ICgocyYweDAxKTw8NykpOworCXJldHVybiBkOworfQorCisjaWZkZWYgQ09ORklHX0I0ODYwRzEwMAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGJvYXJkIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbXBjODV4eF9ncGlvX3NldF9kaXIoCisJCQlpbnQzMl90IHBvcnQsCisJCQl1aW50MzJfdCBtYXNrLAorCQkJdWludDMyX3QgZGlyKQoreworCWRpciB8PSAoaW5fYmUzMihnYnVzLnJbcG9ydF0rR1BESVIpICYgfm1hc2spOworCW91dF9iZTMyKGdidXMucltwb3J0XStHUERJUiwgZGlyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wYzg1eHhfZ3Bpb19zZXQoaW50MzJfdCBwb3J0LCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpCit7CisJLyogRmlyc3QgbWFzayBvZmYgdGhlIHVud2FudGVkIHBhcnRzIG9mICJkaXIiIGFuZCAidmFsIiAqLworCXZhbCAmPSBtYXNrOworCisJLyogTm93IHJlYWQgaW4gdGhlIHZhbHVlcyB3ZSdyZSBzdXBwb3NlZCB0byBwcmVzZXJ2ZSAqLworCXZhbCB8PSAoaW5fYmUzMihnYnVzLnJbcG9ydF0rR1BEQVQpICYgfm1hc2spOworCisJb3V0X2JlMzIoZ2J1cy5yW3BvcnRdK0dQREFULCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG1wYzg1eHhfZ3Bpb19nZXQoaW50MzJfdCBwb3J0LCB1aW50MzJfdCBtYXNrKQoreworCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgKi8KKwlyZXR1cm4gaW5fYmUzMihnYnVzLnJbcG9ydF0rR1BEQVQpICYgbWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wYzg1eHhfZ3Bpb19zZXRfbG93KGludDMyX3QgcG9ydCwgdWludDMyX3QgZ3Bpb3MpCit7CisJbXBjODV4eF9ncGlvX3NldChwb3J0LCBncGlvcywgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NXh4X2dwaW9fc2V0X2hpZ2goaW50MzJfdCBwb3J0LCB1aW50MzJfdCBncGlvcykKK3sKKwltcGM4NXh4X2dwaW9fc2V0KHBvcnQsIGdwaW9zLCAweEZGRkZGRkZGKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKGludDMyX3QgcG9ydCwgdWludDMyX3QgZ3BpbywgdWludDMyX3QgdmFsdWUpCit7CisJaW50MzJfdCBnOworCWcgPSAzMSAtIGdwaW87CisJaWYgKHZhbHVlKQorCQltcGM4NXh4X2dwaW9fc2V0X2hpZ2gocG9ydCwgMVUgPDwgZyk7CisJZWxzZQorCQltcGM4NXh4X2dwaW9fc2V0X2xvdyhwb3J0LCAxVSA8PCBnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUoaW50MzJfdCBwb3J0LCB1aW50MzJfdCBncGlvKQoreworCWludDMyX3QgZzsKKwlnID0gMzEgLSBncGlvOworCXJldHVybiAhIW1wYzg1eHhfZ3Bpb19nZXQocG9ydCwgMVUgPDwgZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bF9jY2xrX2IoaW50MzJfdCBpKQoreworCWdwaW9fc2V0X3ZhbHVlKFhMX0NDTEtfUE9SVCwgWExfQ0NMS19QSU4sIGkpOworfQorCit2b2lkIHhsX3Byb2dyYW1fYihpbnQzMl90IGkpCit7CisJZ3Bpb19zZXRfdmFsdWUoWExfUFJPR05fUE9SVCwgWExfUFJPR05fUElOLCBpKTsKK30KKwordm9pZCB4bF9yZHdyX2IoaW50MzJfdCBpKQoreworCWdwaW9fc2V0X3ZhbHVlKFhMX1JEV1JOX1BPUlQsIFhMX1JEV1JOX1BJTiwgaSk7Cit9CisKK3ZvaWQgeGxfY3NpX2IoaW50MzJfdCBpKQoreworCWdwaW9fc2V0X3ZhbHVlKFhMX0NTSU5fUE9SVCwgWExfQ1NJTl9QSU4sIGkpOworfQorCitpbnQgeGxfZ2V0X2luaXRfYih2b2lkKQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShYTF9JTklUTl9QT1JULCBYTF9JTklUTl9QSU4pOworfQorCitpbnQgeGxfZ2V0X2RvbmVfYih2b2lkKQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShYTF9ET05FX1BPUlQsIFhMX0RPTkVfUElOKTsKK30KKworCisvKiBHMTAwIHNwZWNpZmljIGJpdCBzd2FwIGFuZCByZW1tYXAgKHRvIGdwaW8gcGlucykgZm9yIGJ5dGUgMCAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBiaXRfcmVtYXBfYnl0ZTAodWludDMyX3QgcykKK3sKKwl1aW50MzJfdCBkOworCWQgPSAoKChzJjB4ODApPj43KSB8ICgocyYweDQwKT4+NSkgfCAoKHMmMHgyMCk+PjMpIHwgKChzJjB4MTApPj4xKSB8CisJCSgocyYweDA4KTw8MSkgfCAoKHMmMHgwNCk8PDMpIHwgKChzJjB4MDIpPDw2KSB8ICgocyYweDAxKTw8OSkpOworCXJldHVybiBkOworfQorCisvKgorICogRzEwMCBzcGVjaWZpYyBNU0IsIGluIHRoaXMgb3JkZXIgW2J5dGUwIHwgYnl0ZTFdLCBvdXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJ5dGUwX291dCh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdWludDMyX3Qgc3dhcDMyOworCXN3YXAzMiA9ICBiaXRfcmVtYXBfYnl0ZTAoKHVpbnQzMl90KSBkYXRhKSA8PCA4OworCisJbXBjODV4eF9ncGlvX3NldCgwLCAweDAwMDJCRjAwLCAodWludDMyX3QpIHN3YXAzMik7Cit9CisKKy8qCisgKiBHMTAwIHNwZWNpZmljIExTQiwgaW4gdGhpcyBvcmRlciBbYnl0ZTAgfCBieXRlMV0sIG91dAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTFfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwltcGM4NXh4X2dwaW9fc2V0KDAsIDB4MDAwMDAwRkYsICh1aW50MzJfdCkgYml0c3dhcChkYXRhKSk7Cit9CisKKy8qCisgKiBjb25maWd1cmFibGUgcGVyIGRldmljZSB0eXBlIGZvciBkaWZmZXJlbnQgSS9PIGNvbmZpZworICovCitpbnQgeGxfaW5pdF9pbyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY29uc3QgdTMyICpwX3JlZzsKKwlpbnQgcmVnLCBjbnQ7CisKKwljbnQgPSAwOworCW1lbXNldCgmZ2J1cywgMCwgc2l6ZW9mKHN0cnVjdCBncGlvYnVzKSk7CisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZnNsLHFvcmlxLWdwaW8iKSB7CisJCXBfcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CisJCWlmIChwX3JlZyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXJlZyA9IChpbnQpICpwX3JlZzsKKwkJZ2J1cy5yW2NudF0gPSBvZl9pb21hcChucCwgMCk7CisKKwkJaWYgKCFnYnVzLnJbY250XSkgeworCQkJcHJfZXJyKCJub3QgZmluZGRpbmcgZ3BpbyBjZWxsLWluZGV4ICVkXG4iLCBjbnQpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJY250Kys7CisJfQorCW1wYzg1eHhfZ3Bpb19zZXRfZGlyKDAsIDB4MDAwMkJGRkYsIDB4MDAwMkJGRkYpOworCW1wYzg1eHhfZ3Bpb19zZXRfZGlyKDEsIDB4MDAyNDAwNjAsIDB4MDAyNDAwNjApOworCisJZ2J1cy5uZ3BpbyA9IGNudDsKKworCXJldHVybiAwOworfQorCisKKyNlbHNlCS8qIHBsYWNlaG9sZGVyIGZvciBib2FyZHMgd2l0aCBkaWZmZXJlbnQgY29uZmlnICovCisKK3ZvaWQgeGxfcHJvZ3JhbV9iKGludDMyX3QgaSkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgeGxfcmR3cl9iKGludDMyX3QgaSkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgeGxfY3NpX2IoaW50MzJfdCBpKQoreworCXJldHVybjsKK30KKworaW50IHhsX2dldF9pbml0X2Iodm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK2ludCB4bF9nZXRfZG9uZV9iKHZvaWQpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTBfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBieXRlMV9vdXQodW5zaWduZWQgY2hhciBkYXRhKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhsX2NjbGtfYihpbnQzMl90IGkpCit7CisJcmV0dXJuOworfQorCisvKgorICogY29uZmlndXJhYmxlIHBlciBkZXZpY2UgdHlwZSBmb3IgZGlmZmVyZW50IEkvTyBjb25maWcKKyAqLworaW50IHhsX2luaXRfaW8odm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQjQ4NjBHMTAwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDZhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvaW8uaApAQCAtMCwwICsxLDkwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNkZWZpbmUgR1BESVIJMAorI2RlZmluZSBHUENGRwk0CS8qIG9wZW4gZHJhaW4gb3Igbm90ICovCisjZGVmaW5lIEdQREFUCTgKKworLyoKKyAqIGdwaW8gcG9ydCBhbmQgcGluIGRlZmluaXRpb25zCisgKiBOT1RFOiBwb3J0IG51bWJlciBzdGFydHMgZnJvbSAwCisgKi8KKyNkZWZpbmUJWExfSU5JVE5fUE9SVAkxCisjZGVmaW5lCVhMX0lOSVROX1BJTgkxNAorI2RlZmluZQlYTF9SRFdSTl9QT1JUCTEKKyNkZWZpbmUJWExfUkRXUk5fUElOCTEzCisjZGVmaW5lCVhMX0NDTEtfUE9SVAkxCisjZGVmaW5lCVhMX0NDTEtfUElOCTEwCisjZGVmaW5lCVhMX1BST0dOX1BPUlQJMQorI2RlZmluZQlYTF9QUk9HTl9QSU4JMjUKKyNkZWZpbmUJWExfQ1NJTl9QT1JUCTEKKyNkZWZpbmUJWExfQ1NJTl9QSU4JMjYKKyNkZWZpbmUJWExfRE9ORV9QT1JUCTEKKyNkZWZpbmUJWExfRE9ORV9QSU4JMjcKKworLyoKKyAqIGdwaW8gbWFwcGluZworICoKKwlYTF9jb25maWdfRDAg4oCTIGdwaW8xXzMxCisJWGxfY29uZmlnX2QxIOKAkyBncGlvMV8zMAorCVhsX2NvbmZpZ19kMiDigJMgZ3BpbzFfMjkKKwlYbF9jb25maWdfZDMg4oCTIGdwaW8xXzI4CisJWGxfY29uZmlnX2Q0IOKAkyBncGlvMV8yNworCVhsX2NvbmZpZ19kNSDigJMgZ3BpbzFfMjYKKwlYbF9jb25maWdfZDYg4oCTIGdwaW8xXzI1CisJWGxfY29uZmlnX2Q3IOKAkyBncGlvMV8yNAorCVhsX2NvbmZpZ19kOCDigJMgZ3BpbzFfMjMKKwlYbF9jb25maWdfZDkg4oCTIGdwaW8xXzIyCisJWGxfY29uZmlnX2QxMCDigJMgZ3BpbzFfMjEKKwlYbF9jb25maWdfZDExIOKAkyBncGlvMV8yMAorCVhsX2NvbmZpZ19kMTIg4oCTIGdwaW8xXzE5CisJWGxfY29uZmlnX2QxMyDigJMgZ3BpbzFfMTgKKwlYbF9jb25maWdfZDE0IOKAkyBncGlvMV8xNgorCVhsX2NvbmZpZ19kMTUg4oCTIGdwaW8xXzE0CisqCisqLworCisvKgorICogcHJvZ3JhbSBidXMgd2lkdGggaW4gYnl0ZXMKKyAqLworZW51bSB3YnVzIHsKKwlidXNfMWJ5dGUJPSAxLAorCWJ1c18yYnl0ZQk9IDIsCit9OworCisKKyNkZWZpbmUgTUFYX1dBSVRfRE9ORQkxMDAwMAorCisKK3N0cnVjdCBncGlvYnVzIHsKKwlpbnQJbmdwaW87CisJdm9pZCBfX2lvbWVtICpyWzRdOworfTsKKworaW50IHhsX3N1cHBvcnRlZF9wcm9nX2J1c193aWR0aChlbnVtIHdidXMgYnVzX2J5dGVzKTsKKwordm9pZCB4bF9wcm9ncmFtX2IoaW50MzJfdCBpKTsKK3ZvaWQgeGxfcmR3cl9iKGludDMyX3QgaSk7Cit2b2lkIHhsX2NzaV9iKGludDMyX3QgaSk7CisKK2ludCB4bF9nZXRfaW5pdF9iKHZvaWQpOworaW50IHhsX2dldF9kb25lX2Iodm9pZCk7CisKK3ZvaWQgeGxfc2hpZnRfY2NsayhpbnQgY291bnQpOwordm9pZCB4bF9zaGlmdF9ieXRlc19vdXQoZW51bSB3YnVzIGJ1c19ieXRlLCB1bnNpZ25lZCBjaGFyICpwZGF0YSk7CisKK2ludCB4bF9pbml0X2lvKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oCmluZGV4IGM5ZmVkYjcuLjIwNjQ4MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKQEAgLTY1MiwzICs2NTIsMjUgQEAKIAlmcmVlKHRlbXApOwogCXJldHVybiByZXQ7CiB9CisKK3JlYWRfc3lzZnNfc3RyaW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpiYXNlZGlyLCBjaGFyICpzdHIpCit7CisJZmxvYXQgcmV0ID0gMDsKKwlGSUxFICAqc3lzZnNmcDsKKwljaGFyICp0ZW1wID0gbWFsbG9jKHN0cmxlbihiYXNlZGlyKSArIHN0cmxlbihmaWxlbmFtZSkgKyAyKTsKKwlpZiAodGVtcCA9PSBOVUxMKSB7CisJCXByaW50ZigiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcHJpbnRmKHRlbXAsICIlcy8lcyIsIGJhc2VkaXIsIGZpbGVuYW1lKTsKKwlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInIiKTsKKwlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7CisJCXJldCA9IC1lcnJubzsKKwkJZ290byBlcnJvcl9mcmVlOworCX0KKwlmc2NhbmYoc3lzZnNmcCwgIiVzXG4iLCBzdHIpOworCWZjbG9zZShzeXNmc2ZwKTsKK2Vycm9yX2ZyZWU6CisJZnJlZSh0ZW1wKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2xzaWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vbHNpaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFlOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2xzaWlvLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBJbmR1c3RyaWFsIEkvTyB1dGlsaXRpZXMgLSBsc2lpby5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hbnVlbCBTdGFobCA8bWFudWVsLnN0YWhsQGlpcy5mcmF1bmhvZmVyLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlICJpaW9fdXRpbHMuaCIKKworCitzdGF0aWMgZW51bSB2ZXJib3NpdHkgeworCVZFUkJMRVZFTF9ERUZBVUxULAkvKiAwIGdpdmVzIGxzcGNpIGJlaGF2aW91ciAqLworCVZFUkJMRVZFTF9TRU5TT1JTLAkvKiAxIGxpc3RzIHNlbnNvcnMgKi8KK30gdmVyYmxldmVsID0gVkVSQkxFVkVMX0RFRkFVTFQ7CisKK2NvbnN0IGNoYXIgKnR5cGVfZGV2aWNlID0gImlpbzpkZXZpY2UiOworY29uc3QgY2hhciAqdHlwZV90cmlnZ2VyID0gInRyaWdnZXIiOworCisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3ByZWZpeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gc3RybGVuKHN0cikgPiBzdHJsZW4ocHJlZml4KSAmJgorCQlzdHJuY21wKHN0ciwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSkgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcG9zdGZpeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBvc3RmaXgpCit7CisJcmV0dXJuIHN0cmxlbihzdHIpID4gc3RybGVuKHBvc3RmaXgpICYmCisJCXN0cmNtcChzdHIgKyBzdHJsZW4oc3RyKSAtIHN0cmxlbihwb3N0Zml4KSwgcG9zdGZpeCkgPT0gMDsKK30KKworc3RhdGljIGludCBkdW1wX2NoYW5uZWxzKGNvbnN0IGNoYXIgKmRldl9kaXJfbmFtZSkKK3sKKwlESVIgKmRwOworCWNvbnN0IHN0cnVjdCBkaXJlbnQgKmVudDsKKwlkcCA9IG9wZW5kaXIoZGV2X2Rpcl9uYW1lKTsKKwlpZiAoZHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1lcnJubzsKKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKQorCQlpZiAoY2hlY2tfcHJlZml4KGVudC0+ZF9uYW1lLCAiaW5fIikgJiYKKwkJICAgIGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfcmF3IikpIHsKKwkJCXByaW50ZigiICAgJS0xMHNcbiIsIGVudC0+ZF9uYW1lKTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9vbmVfZGV2aWNlKGNvbnN0IGNoYXIgKmRldl9kaXJfbmFtZSkKK3sKKwljaGFyIG5hbWVbSUlPX01BWF9OQU1FX0xFTkdUSF07CisJaW50IGRldl9pZHg7CisKKwlzc2NhbmYoZGV2X2Rpcl9uYW1lICsgc3RybGVuKGlpb19kaXIpICsgc3RybGVuKHR5cGVfZGV2aWNlKSwKKwkJCSIlaSIsICZkZXZfaWR4KTsKKwlyZWFkX3N5c2ZzX3N0cmluZygibmFtZSIsIGRldl9kaXJfbmFtZSwgbmFtZSk7CisJcHJpbnRmKCJEZXZpY2UgJTAzZDogJXNcbiIsIGRldl9pZHgsIG5hbWUpOworCisJaWYgKHZlcmJsZXZlbCA+PSBWRVJCTEVWRUxfU0VOU09SUykgeworCQlpbnQgcmV0ID0gZHVtcF9jaGFubmVscyhkZXZfZGlyX25hbWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9vbmVfdHJpZ2dlcihjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCit7CisJY2hhciBuYW1lW0lJT19NQVhfTkFNRV9MRU5HVEhdOworCWludCBkZXZfaWR4OworCisJc3NjYW5mKGRldl9kaXJfbmFtZSArIHN0cmxlbihpaW9fZGlyKSArIHN0cmxlbih0eXBlX3RyaWdnZXIpLAorCQkJIiVpIiwgJmRldl9pZHgpOworCXJlYWRfc3lzZnNfc3RyaW5nKCJuYW1lIiwgZGV2X2Rpcl9uYW1lLCBuYW1lKTsKKwlwcmludGYoIlRyaWdnZXIgJTAzZDogJXNcbiIsIGRldl9pZHgsIG5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2RldmljZXModm9pZCkKK3sKKwljb25zdCBzdHJ1Y3QgZGlyZW50ICplbnQ7CisJaW50IG51bWJlciwgbnVtc3RybGVuOworCisJRklMRSAqbmFtZUZpbGU7CisJRElSICpkcDsKKwljaGFyIHRoaXNuYW1lW0lJT19NQVhfTkFNRV9MRU5HVEhdOworCWNoYXIgKmZpbGVuYW1lOworCisJZHAgPSBvcGVuZGlyKGlpb19kaXIpOworCWlmIChkcCA9PSBOVUxMKSB7CisJCXByaW50ZigiTm8gaW5kdXN0cmlhbCBJL08gZGV2aWNlcyBhdmFpbGFibGVcbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkgeworCQlpZiAoY2hlY2tfcHJlZml4KGVudC0+ZF9uYW1lLCB0eXBlX2RldmljZSkpIHsKKwkJCWNoYXIgKmRldl9kaXJfbmFtZTsKKwkJCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlcyVzIiwgaWlvX2RpciwgZW50LT5kX25hbWUpOworCQkJZHVtcF9vbmVfZGV2aWNlKGRldl9kaXJfbmFtZSk7CisJCQlmcmVlKGRldl9kaXJfbmFtZSk7CisJCQlpZiAodmVyYmxldmVsID49IFZFUkJMRVZFTF9TRU5TT1JTKQorCQkJCXByaW50ZigiXG4iKTsKKwkJfQorCX0KKwlyZXdpbmRkaXIoZHApOworCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpIHsKKwkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgdHlwZV90cmlnZ2VyKSkgeworCQkJY2hhciAqZGV2X2Rpcl9uYW1lOworCQkJYXNwcmludGYoJmRldl9kaXJfbmFtZSwgIiVzJXMiLCBpaW9fZGlyLCBlbnQtPmRfbmFtZSk7CisJCQlkdW1wX29uZV90cmlnZ2VyKGRldl9kaXJfbmFtZSk7CisJCQlmcmVlKGRldl9kaXJfbmFtZSk7CisJCX0KKwl9CisJY2xvc2VkaXIoZHApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGMsIGVyciA9IDA7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImQ6RDp2IikpICE9IEVPRikgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndic6CisJCQl2ZXJibGV2ZWwrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgJz8nOgorCQlkZWZhdWx0OgorCQkJZXJyKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyIHx8IGFyZ2MgPiBvcHRpbmQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogbHNpaW8gW29wdGlvbnNdLi4uXG4iCisJCQkiTGlzdCBpbmR1c3RyaWFsIEkvTyBkZXZpY2VzXG4iCisJCQkiICAtdiwgLS12ZXJib3NlXG4iCisJCQkiICAgICAgSW5jcmVhc2UgdmVyYm9zaXR5IChtYXkgYmUgZ2l2ZW4gbXVsdGlwbGUgdGltZXMpXG4iCisJCQkpOworCQlleGl0KDEpOworCX0KKworCWR1bXBfZGV2aWNlcygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCmluZGV4IGMxMDE2YzUuLmIyODRlNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCkBAIC02NSw3ICs2NSw4IEBACiAKICNkZWZpbmUgU0NBMzAwMF9SSU5HX0JVRl9FTkFCTEUJCQkweDgwCiAjZGVmaW5lIFNDQTMwMDBfUklOR19CVUZfOEJJVAkJCTB4NDAKLS8qIEZyZWUgZmFsbCBkZXRlY3Rpb24gdHJpZ2dlcnMgYW4gaW50ZXJydXB0IGlmIHRoZSBhY2NlbGVyYXRpb24KKy8qCisgKiBGcmVlIGZhbGwgZGV0ZWN0aW9uIHRyaWdnZXJzIGFuIGludGVycnVwdCBpZiB0aGUgYWNjZWxlcmF0aW9uCiAgKiBpcyBiZWxvdyBhIHRocmVzaG9sZCBmb3IgZXF1aXZhbGVudCBvZiAyNWNtIGRyb3AKICAqLwogI2RlZmluZSBTQ0EzMDAwX0ZSRUVfRkFMTF9ERVRFQ1QJCTB4MTAKQEAgLTczLDggKzc0LDkgQEAKICNkZWZpbmUgU0NBMzAwMF9NRUFTX01PREVfT1BfMQkJCTB4MDEKICNkZWZpbmUgU0NBMzAwMF9NRUFTX01PREVfT1BfMgkJCTB4MDIKIAotLyogSW4gbW90aW9uIGRldGVjdGlvbiBtb2RlIHRoZSBhY2NlbGVyYXRpb25zIGFyZSBiYW5kIHBhc3MgZmlsdGVyZWQKLSAqIChhcHJveCAxIC0gMjVIeikgYW5kIHRoZW4gYSBwcm9ncmFtbWFibGUgdGhyZXNob2xkIHVzZWQgdG8gdHJpZ2dlcgorLyoKKyAqIEluIG1vdGlvbiBkZXRlY3Rpb24gbW9kZSB0aGUgYWNjZWxlcmF0aW9ucyBhcmUgYmFuZCBwYXNzIGZpbHRlcmVkCisgKiAoYXBwcm94IDEgLSAyNUh6KSBhbmQgdGhlbiBhIHByb2dyYW1tYWJsZSB0aHJlc2hvbGQgdXNlZCB0byB0cmlnZ2VyCiAgKiBhbmQgaW50ZXJydXB0LgogICovCiAjZGVmaW5lIFNDQTMwMDBfTUVBU19NT0RFX01PVF9ERVQJCTB4MDMKQEAgLTk5LDggKzEwMSwxMCBAQAogI2RlZmluZSBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9ZX1RICQkweDAzCiAjZGVmaW5lIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX1hfVEgJCTB4MDQKICNkZWZpbmUgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfTURfWl9USAkJMHgwNQotLyogQkUgVkVSWSBDQVJFRlVMIFdJVEggVEhJUywgSUYgMyBCSVRTIEFSRSBOT1QgU0VUIHRoZSBkZXZpY2UKLSAgIHdpbGwgbm90IGZ1bmN0aW9uICovCisvKgorICogQkUgVkVSWSBDQVJFRlVMIFdJVEggVEhJUywgSUYgMyBCSVRTIEFSRSBOT1QgU0VUIHRoZSBkZXZpY2UKKyAqIHdpbGwgbm90IGZ1bmN0aW9uCisgKi8KICNkZWZpbmUgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfT1VUX0NUUkwJCTB4MEIKICNkZWZpbmUgU0NBMzAwMF9PVVRfQ1RSTF9QUk9UX01BU0sJCTB4RTAKICNkZWZpbmUgU0NBMzAwMF9PVVRfQ1RSTF9CVUZfWF9FTgkJMHgxMApAQCAtMTA5LDggKzExMyw5IEBACiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl80CQkweDAyCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl8yCQkweDAxCiAKLS8qIENvbnRyb2wgd2hpY2ggbW90aW9uIGRldGVjdG9yIGludGVycnVwdHMgYXJlIG9uLgotICogRm9yIG5vdyBvbmx5IE9SIGNvbWJpbmF0aW9ucyBhcmUgc3VwcG9ydGVkLngKKy8qCisgKiBDb250cm9sIHdoaWNoIG1vdGlvbiBkZXRlY3RvciBpbnRlcnJ1cHRzIGFyZSBvbi4KKyAqIEZvciBub3cgb25seSBPUiBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZC4KICAqLwogI2RlZmluZSBTQ0EzMDAwX01EX0NUUkxfUFJPVF9NQVNLCQkweEMwCiAjZGVmaW5lIFNDQTMwMDBfTURfQ1RSTF9PUl9ZCQkJMHgwMQpAQCAtMTIxLDcgKzEyNiw4IEBACiAjZGVmaW5lIFNDQTMwMDBfTURfQ1RSTF9BTkRfWAkJCTB4MTAKICNkZWZpbmUgU0FDMzAwMF9NRF9DVFJMX0FORF9aCQkJMHgyMAogCi0vKiBTb21lIGNvbnRyb2wgcmVnaXN0ZXJzIG9mIGNvbXBsZXggYWNjZXNzIG1ldGhvZHMgcmVxdWlyaW5nIHRoaXMgcmVnaXN0ZXIgdG8KKy8qCisgKiBTb21lIGNvbnRyb2wgcmVnaXN0ZXJzIG9mIGNvbXBsZXggYWNjZXNzIG1ldGhvZHMgcmVxdWlyaW5nIHRoaXMgcmVnaXN0ZXIgdG8KICAqIGJlIHVzZWQgdG8gcmVtb3ZlIGEgbG9jay4KICAqLwogI2RlZmluZSBTQ0EzMDAwX1JFR19BRERSX1VOTE9DSwkJCTB4MWUKQEAgLTEzOSw3ICsxNDUsOCBAQAogLyogVmFsdWVzIG9mIG11bHRpcGxleGVkIHJlZ2lzdGVycyAod3JpdGUgdG8gY3RybF9kYXRhIGFmdGVyIHNlbGVjdCkgKi8KICNkZWZpbmUgU0NBMzAwMF9SRUdfQUREUl9DVFJMX0RBVEEJCTB4MjIKIAotLyogTWVhc3VyZW1lbnQgbW9kZXMgYXZhaWxhYmxlIG9uIHNvbWUgc2NhMzAwMCBzZXJpZXMgY2hpcHMuIENvZGUgYXNzdW1lcyBvdGhlcnMKKy8qCisgKiBNZWFzdXJlbWVudCBtb2RlcyBhdmFpbGFibGUgb24gc29tZSBzY2EzMDAwIHNlcmllcyBjaGlwcy4gQ29kZSBhc3N1bWVzIG90aGVycwogICogbWF5IGJlY29tZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS4KICAqCiAgKiBCeXBhc3MgLSBCeXBhc3MgdGhlIGxvdy1wYXNzIGZpbHRlciBpbiB0aGUgc2lnbmFsIGNoYW5uZWwgc28gYXMgdG8gaW5jcmVhc2UKQEAgLTE2MCw3ICsxNjcsNiBAQAogICogc3RydWN0IHNjYTMwMDBfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3RhdGUgaW5mb3JtYXRpb24KICAqIEB1czoJCQl0aGUgYXNzb2NpYXRlZCBzcGkgZGV2aWNlCiAgKiBAaW5mbzoJCQljaGlwIHZhcmlhbnQgaW5mb3JtYXRpb24KLSAqIEBpbmRpb19kZXY6CQkJZGV2aWNlIGluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIElJTyBjb3JlCiAgKiBAaW50ZXJydXB0X2hhbmRsZXJfd3M6CWV2ZW50IGludGVycnVwdCBoYW5kbGVyIGZvciBhbGwgZXZlbnRzCiAgKiBAbGFzdF90aW1lc3RhbXA6CQl0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGV2ZW50CiAgKiBAbW9fZGV0X3VzZV9jb3VudDoJCXJlZmVyZW5jZSBjb3VudGVyIGZvciB0aGUgbW90aW9uIGRldGVjdGlvbiB1bml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCA3ZjZjY2RmLi5lZDMwZTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTMyLDcgKzMyLDggQEAKIAllMDUsCiB9OwogCi0vKiBOb3RlIHdoZXJlIG9wdGlvbiBtb2RlcyBhcmUgbm90IGRlZmluZWQsIHRoZSBjaGlwIHNpbXBseSBkb2VzIG5vdAorLyoKKyAqIE5vdGUgd2hlcmUgb3B0aW9uIG1vZGVzIGFyZSBub3QgZGVmaW5lZCwgdGhlIGNoaXAgc2ltcGx5IGRvZXMgbm90CiAgKiBzdXBwb3J0IGFueS4KICAqIE90aGVyIGNoaXBzIGluIHRoZSBzY2EzMDAwIHNlcmllcyB1c2UgaTJjIGFuZCBhcmUgbm90IGluY2x1ZGVkIGhlcmUuCiAgKgpAQCAtMTkxLDcgKzE5Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogQ3J1Y2lhbCB0aGF0IGxvY2sgaXMgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgKi8KIC8qKgogICogc2NhMzAwMF9yZWFkX2N0cmxfcmVnKCkgcmVhZCBmcm9tIGxvY2sgcHJvdGVjdGVkIGNvbnRyb2wgcmVnaXN0ZXIuCiAgKgpAQCAtMjUwLDkgKzI1MCw4IEBACiB9CiAjZW5kaWYgLyogU0NBMzAwMF9ERUJVRyAqLwogCi0KIC8qKgotICogc2NhMzAwMF9zaG93X3JlZygpIC0gc3lzZnMgaW50ZXJmYWNlIHRvIHJlYWQgdGhlIGNoaXAgcmV2aXNpb24gbnVtYmVyCisgKiBzY2EzMDAwX3Nob3dfcmV2KCkgLSBzeXNmcyBpbnRlcmZhY2UgdG8gcmVhZCB0aGUgY2hpcCByZXZpc2lvbiBudW1iZXIKICAqKi8KIHN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfc2hvd19yZXYoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMzEyLDcgKzMxMSw3IEBACiB9CiAKIC8qKgotICogc2NhMzAwMF9zaG93X21lYXN1cm1lbmV0X21vZGUoKSBzeXNmcyByZWFkIG9mIGN1cnJlbnQgbW9kZQorICogc2NhMzAwMF9zaG93X21lYXN1cmVtZW50X21vZGUoKSBzeXNmcyByZWFkIG9mIGN1cnJlbnQgbW9kZQogICoqLwogc3RhdGljIHNzaXplX3QKIHNjYTMwMDBfc2hvd19tZWFzdXJlbWVudF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTQwMyw3ICs0MDIsOCBAQAogfQogCiAKLS8qIE5vdCBldmVuIHZhZ3VlbHkgc3RhbmRhcmQgYXR0cmlidXRlcyBzbyBkZWZpbmVkIGhlcmUgcmF0aGVyIHRoYW4KKy8qCisgKiBOb3QgZXZlbiB2YWd1ZWx5IHN0YW5kYXJkIGF0dHJpYnV0ZXMgc28gZGVmaW5lZCBoZXJlIHJhdGhlciB0aGFuCiAgKiBpbiB0aGUgcmVsZXZhbnQgSUlPIGNvcmUgaGVhZGVycwogICovCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1lYXN1cmVtZW50X21vZGVfYXZhaWxhYmxlLCBTX0lSVUdPLApAQCAtNDUwLDYgKzQ1MCwxOCBAQAogCVNDQTMwMDBfQ0hBTigyLCBJSU9fTU9EX1opLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNjYTMwMDBfY2hhbm5lbHNfd2l0aF90ZW1wW10gPSB7CisJU0NBMzAwMF9DSEFOKDAsIElJT19NT0RfWCksCisJU0NBMzAwMF9DSEFOKDEsIElJT19NT0RfWSksCisJU0NBMzAwMF9DSEFOKDIsIElJT19NT0RfWiksCisJeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CisJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAorCX0sCit9OworCiBzdGF0aWMgdTggc2NhMzAwMF9hZGRyZXNzZXNbM11bM10gPSB7CiAJWzBdID0ge1NDQTMwMDBfUkVHX0FERFJfWF9NU0IsIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX1hfVEgsCiAJICAgICAgIFNDQTMwMDBfTURfQ1RSTF9PUl9YfSwKQEAgLTQ3MiwxOSArNDg0LDMwIEBACiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKIAkJbXV0ZXhfbG9jaygmc3QtPmxvY2spOwotCQlpZiAoc3QtPm1vX2RldF91c2VfY291bnQpIHsKLQkJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX0FDQ0VMKSB7CisJCQlpZiAoc3QtPm1vX2RldF91c2VfY291bnQpIHsKKwkJCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJYWRkcmVzcyA9IHNjYTMwMDBfYWRkcmVzc2VzW2NoYW4tPmFkZHJlc3NdWzBdOworCQkJcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsIGFkZHJlc3MsIDIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJKnZhbCA9IChiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKXN0LT5yeCkgPj4gMykgJiAweDFGRkY7CisJCQkqdmFsID0gKCgqdmFsKSA8PCAoc2l6ZW9mKCp2YWwpKjggLSAxMykpID4+CisJCQkJKHNpemVvZigqdmFsKSo4IC0gMTMpOworCQl9IGVsc2UgeworCQkJLyogZ2V0IHRoZSB0ZW1wZXJhdHVyZSB3aGVuIGF2YWlsYWJsZSAqLworCQkJcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsCisJCQkJU0NBMzAwMF9SRUdfQUREUl9URU1QX01TQiwgMik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQkqdmFsID0gKChzdC0+cnhbMF0gJiAweDNGKSA8PCAzKSB8ICgoc3QtPnJ4WzFdICYgMHhFMCkgPj4gNSk7CiAJCX0KLQkJYWRkcmVzcyA9IHNjYTMwMDBfYWRkcmVzc2VzW2NoYW4tPmFkZHJlc3NdWzBdOwotCQlyZXQgPSBzY2EzMDAwX3JlYWRfZGF0YV9zaG9ydChzdCwgYWRkcmVzcywgMik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJKnZhbCA9IChiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKXN0LT5yeCkgPj4gMykgJiAweDFGRkY7Ci0JCSp2YWwgPSAoKCp2YWwpIDw8IChzaXplb2YoKnZhbCkqOCAtIDEzKSkgPj4KLQkJCShzaXplb2YoKnZhbCkqOCAtIDEzKTsKIAkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CiAJCXJldHVybiBJSU9fVkFMX0lOVDsKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CkBAIC00OTQsNiArNTE3LDEwIEBACiAJCWVsc2UgLyogdGVtcGVyYXR1cmUgKi8KIAkJCSp2YWwyID0gNTU1NTU2OwogCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQkqdmFsID0gLTIxNDsKKwkJKnZhbDIgPSA2MDAwMDA7CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTU0Nyw3ICs1NzQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAvKioKLSAqIF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxdWVuY3koKSBvYnRhaW4gbW9kZSBzcGVjaWZpYyBiYXNlIGZyZXF1ZW5jeQorICogX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoKSBvYnRhaW4gbW9kZSBzcGVjaWZpYyBiYXNlIGZyZXF1ZW5jeQogICoKICAqIGxvY2sgbXVzdCBiZSBoZWxkCiAgKiovCkBAIC02NjMsNyArNjkwLDggQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQogCi0vKiBTaG91bGQgb25seSByZWFsbHkgYmUgcmVnaXN0ZXJlZCBpZiByaW5nIGJ1ZmZlciBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLgorLyoKKyAqIFNob3VsZCBvbmx5IHJlYWxseSBiZSByZWdpc3RlcmVkIGlmIHJpbmcgYnVmZmVyIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4uCiAgKiBEb2VzIG5vIGhhcm0gaG93ZXZlciBhbmQgZG9pbmcgaXQgcmlnaHQgd291bGQgYWRkIGEgZmFpciBiaXQgb2YgY29tcGxleGl0eQogICovCiBzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUV9BVkFJTChzY2EzMDAwX3JlYWRfYXZfZnJlcSk7CkBAIC02NzIsMzcgKzcwMCw2IEBACiAJCQkgICAgICBzY2EzMDAwX3JlYWRfZnJlcXVlbmN5LAogCQkJICAgICAgc2NhMzAwMF9zZXRfZnJlcXVlbmN5KTsKIAotCi0vKioKLSAqIHNjYTMwMDBfcmVhZF90ZW1wKCkgc3lzZnMgaW50ZXJmYWNlIHRvIGdldCB0aGUgdGVtcGVyYXR1cmUgd2hlbiBhdmFpbGFibGUKLSAqCi0qIFRoZSBhbGlnbm1lbnQgb2YgZGF0YSBpbiBoZXJlIGlzIGRvd25yaWdodCBvZGQuIFNlZSBkYXRhIHNoZWV0LgotKiBDb252ZXJ0aW5nIHRoaXMgaW50byBhIG1lYW5pbmdmdWwgdmFsdWUgaXMgbGVmdCB0byBpbmxpbmUgZnVuY3Rpb25zIGluCi0qIHVzZXJzcGFjZSBwYXJ0IG9mIGhlYWRlci4KLSoqLwotc3RhdGljIHNzaXplX3Qgc2NhMzAwMF9yZWFkX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwotCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JaW50IHJldDsKLQlpbnQgdmFsOwotCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX1RFTVBfTVNCLCAyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9yZXQ7Ci0JdmFsID0gKChzdC0+cnhbMF0gJiAweDNGKSA8PCAzKSB8ICgoc3QtPnJ4WzFdICYgMHhFMCkgPj4gNSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKLQotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKHNjYTMwMDBfcmVhZF90ZW1wKTsKLQotc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfU0NBTEUoIjAuNTU1NTU2Iik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9PRkZTRVQoIi0yMTQuNiIpOwotCiAvKioKICAqIHNjYTMwMDBfcmVhZF90aHJlc2goKSAtIHF1ZXJ5IG9mIGEgdGhyZXNob2xkCiAgKiovCkBAIC03ODIsMzMgKzc3OSwxNiBAQAogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2NhMzAwMF9hdHRyaWJ1dGVzX3dpdGhfdGVtcFtdID0gewotCSZpaW9fZGV2X2F0dHJfcmV2aXNpb24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21lYXN1cmVtZW50X21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9tZWFzdXJlbWVudF9tb2RlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKLQkvKiBPbmx5IHByZXNlbnQgaWYgdGVtcCBzZW5zb3IgaXMgKi8KLQkmaWlvX2Rldl9hdHRyX2luX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX2luX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX2luX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQlOVUxMLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2NhMzAwMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CiAJLmF0dHJzID0gc2NhMzAwMF9hdHRyaWJ1dGVzLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2NhMzAwMF9hdHRyaWJ1dGVfZ3JvdXBfd2l0aF90ZW1wID0gewotCS5hdHRycyA9IHNjYTMwMDBfYXR0cmlidXRlc193aXRoX3RlbXAsCi19OwotCi0vKiBSSU5HIFJFTEFURUQgaW50ZXJydXB0IGhhbmRsZXIgKi8KLS8qIGRlcGVuZGluZyBvbiBldmVudCwgcHVzaCB0byB0aGUgcmluZyBidWZmZXIgZXZlbnQgY2hyZGV2IG9yIHRoZSBldmVudCBvbmUgKi8KLQogLyoqCiAgKiBzY2EzMDAwX2V2ZW50X2hhbmRsZXIoKSAtIGhhbmRsaW5nIHJpbmcgYW5kIG5vbiByaW5nIGV2ZW50cwogICoKKyAqIFJpbmcgcmVsYXRlZCBpbnRlcnJ1cHQgaGFuZGxlci4gRGVwZW5kaW5nIG9uIGV2ZW50LCBwdXNoIHRvCisgKiB0aGUgcmluZyBidWZmZXIgZXZlbnQgY2hyZGV2IG9yIHRoZSBldmVudCBvbmUuCisgKgogICogVGhpcyBmdW5jdGlvbiBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBkZXZpY2VzIGNhbiBzaWduaWZ5IHJpbmcKICAqIGFuZCBub24gcmluZyBldmVudHMgdmlhIHRoZSBzYW1lIGludGVycnVwdCBsaW5lIGFuZCB0aGV5IGNhbiBvbmx5CiAgKiBiZSBkaXN0aW5ndWlzaGVkIHZpYSBhIHJlYWQgb2YgdGhlIHJlbGV2YW50IHN0YXR1cyByZWdpc3Rlci4KQEAgLTgyMCw3ICs4MDAsOCBAQAogCWludCByZXQsIHZhbDsKIAlzNjQgbGFzdF90aW1lc3RhbXAgPSBpaW9fZ2V0X3RpbWVfbnMoKTsKIAotCS8qIENvdWxkIGxlYWQgaWYgYmFkbHkgdGltZWQgdG8gYW4gZXh0cmEgcmVhZCBvZiBzdGF0dXMgcmVnLAorCS8qCisJICogQ291bGQgbGVhZCBpZiBiYWRseSB0aW1lZCB0byBhbiBleHRyYSByZWFkIG9mIHN0YXR1cyByZWcsCiAJICogYnV0IGVuc3VyZXMgbm8gaW50ZXJydXB0IGlzIG1pc3NlZC4KIAkgKi8KIAltdXRleF9sb2NrKCZzdC0+bG9jayk7CkBAIC05MzUsNyArOTE2LDYgQEAKICAqIHRoZSBkZXZpY2UgZmFsbHMgbW9yZSB0aGFuIDI1Y20uICBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQgZHVlCiAgKiB0byBmcmFnaWxlIHdpcmluZy4KICAqKi8KLQogc3RhdGljIHNzaXplX3Qgc2NhMzAwMF9zZXRfZnJlZV9mYWxsX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKQEAgLTk1Nyw3ICs5MzcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmV0OwogCi0JLyppZiBvZmYgYW5kIHNob3VsZCBiZSBvbiovCisJLyogaWYgb2ZmIGFuZCBzaG91bGQgYmUgb24gKi8KIAlpZiAodmFsICYmICEoc3QtPnJ4WzBdICYgcHJvdGVjdF9tYXNrKSkKIAkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwKIAkJCQkJKHN0LT5yeFswXSB8IFNDQTMwMDBfRlJFRV9GQUxMX0RFVEVDVCkpOwpAQCAtOTcyLDcgKzk1Miw3IEBACiB9CiAKIC8qKgotICogc2NhMzAwMF9zZXRfbW9fZGV0KCkgc2ltcGxlIG9uIG9mZiBjb250cm9sIGZvciBtb3Rpb24gZGV0ZWN0b3IKKyAqIHNjYTMwMDBfd3JpdGVfZXZlbnRfY29uZmlnKCkgc2ltcGxlIG9uIG9mZiBjb250cm9sIGZvciBtb3Rpb24gZGV0ZWN0b3IKICAqCiAgKiBUaGlzIGlzIGEgcGVyIGF4aXMgY29udHJvbCwgYnV0IGVuYWJsaW5nIGFueSB3aWxsIHJlc3VsdCBpbiB0aGUKICAqIG1vdGlvbiBkZXRlY3RvciB1bml0IGJlaW5nIGVuYWJsZWQuCkBAIC05OTIsMTMgKzk3MiwxNSBAQAogCWludCBudW0gPSBjaGFuLT5jaGFubmVsMjsKIAogCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQkvKiBGaXJzdCByZWFkIHRoZSBtb3Rpb24gZGV0ZWN0b3IgY29uZmlnIHRvIGZpbmQgb3V0IGlmCi0JICogdGhpcyBheGlzIGlzIG9uKi8KKwkvKgorCSAqIEZpcnN0IHJlYWQgdGhlIG1vdGlvbiBkZXRlY3RvciBjb25maWcgdG8gZmluZCBvdXQgaWYKKwkgKiB0aGlzIGF4aXMgaXMgb24KKwkgKi8KIAlyZXQgPSBzY2EzMDAwX3JlYWRfY3RybF9yZWcoc3QsIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX0NUUkwpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGV4aXRfcG9pbnQ7CiAJY3RybHZhbCA9IHJldDsKLQkvKiBPZmYgYW5kIHNob3VsZCBiZSBvbiAqLworCS8qIGlmIG9mZiBhbmQgc2hvdWxkIGJlIG9uICovCiAJaWYgKHN0YXRlICYmICEoY3RybHZhbCAmIHNjYTMwMDBfYWRkcmVzc2VzW251bV1bMl0pKSB7CiAJCXJldCA9IHNjYTMwMDBfd3JpdGVfY3RybF9yZWcoc3QsCiAJCQkJCSAgICAgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfTURfQ1RSTCwKQEAgLTEwMjEsNyArMTAwMyw3IEBACiAJcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwgMSk7CiAJaWYgKHJldCkKIAkJZ290byBleGl0X3BvaW50OwotCS8qaWYgb2ZmIGFuZCBzaG91bGQgYmUgb24qLworCS8qIGlmIG9mZiBhbmQgc2hvdWxkIGJlIG9uICovCiAJaWYgKChzdC0+bW9fZGV0X3VzZV9jb3VudCkKIAkgICAgJiYgKChzdC0+cnhbMF0gJiBwcm90ZWN0X21hc2spICE9IFNDQTMwMDBfTUVBU19NT0RFX01PVF9ERVQpKQogCQlyZXQgPSBzY2EzMDAwX3dyaXRlX3JlZyhzdCwgU0NBMzAwMF9SRUdfQUREUl9NT0RFLApAQCAtMTA2Nyw3ICsxMDQ5LDcgQEAKICAqIERldmljZXMgdXNlIGZsYXNoIG1lbW9yeSB0byBzdG9yZSBtYW55IG9mIHRoZSByZWdpc3RlciB2YWx1ZXMKICAqIGFuZCBoZW5jZSBjYW4gY29tZSB1cCBpbiBzb21ld2hhdCB1bnByZWRpY3RhYmxlIHN0YXRlcy4KICAqIEhlbmNlIHJlc2V0IGV2ZXJ5dGhpbmcgb24gZHJpdmVyIGxvYWQuCi0gICoqLworICoqLwogc3RhdGljIGludCBzY2EzMDAwX2NsZWFuX3NldHVwKHN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCkKIHsKIAlpbnQgcmV0OwpAQCAtMTEwNyw5ICsxMDg5LDExIEBACiAJCQkJfCBTQ0EzMDAwX0lOVF9NQVNLX0FDVElWRV9MT1cpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmV0OwotCS8qIFNlbGVjdCBub3JtYWwgbWVhc3VyZW1lbnQgbW9kZSwgZnJlZSBmYWxsIG9mZiwgcmluZyBvZmYgKi8KLQkvKiBSaW5nIGluIDEyIGJpdCBtb2RlIC0gaXQgaXMgZmluZSB0byBvdmVyd3JpdGUgcmVzZXJ2ZWQgYml0cyAzLDUKLQkgKiBhcyB0aGF0IG9jY3VycyBpbiBvbmUgb2YgdGhlIGV4YW1wbGUgb24gdGhlIGRhdGFzaGVldCAqLworCS8qCisJICogU2VsZWN0IG5vcm1hbCBtZWFzdXJlbWVudCBtb2RlLCBmcmVlIGZhbGwgb2ZmLCByaW5nIG9mZgorCSAqIFJpbmcgaW4gMTIgYml0IG1vZGUgLSBpdCBpcyBmaW5lIHRvIG92ZXJ3cml0ZSByZXNlcnZlZCBiaXRzIDMsNQorCSAqIGFzIHRoYXQgb2NjdXJzIGluIG9uZSBvZiB0aGUgZXhhbXBsZSBvbiB0aGUgZGF0YXNoZWV0CisJICovCiAJcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwgMSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CkBAIC0xMTMzLDE2ICsxMTE3LDYgQEAKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzY2EzMDAwX2luZm9fd2l0aF90ZW1wID0gewotCS5hdHRycyA9ICZzY2EzMDAwX2F0dHJpYnV0ZV9ncm91cF93aXRoX3RlbXAsCi0JLnJlYWRfcmF3ID0gJnNjYTMwMDBfcmVhZF9yYXcsCi0JLnJlYWRfZXZlbnRfdmFsdWUgPSAmc2NhMzAwMF9yZWFkX3RocmVzaCwKLQkud3JpdGVfZXZlbnRfdmFsdWUgPSAmc2NhMzAwMF93cml0ZV90aHJlc2gsCi0JLnJlYWRfZXZlbnRfY29uZmlnID0gJnNjYTMwMDBfcmVhZF9ldmVudF9jb25maWcsCi0JLndyaXRlX2V2ZW50X2NvbmZpZyA9ICZzY2EzMDAwX3dyaXRlX2V2ZW50X2NvbmZpZywKLQkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAotfTsKLQogc3RhdGljIGludCBzY2EzMDAwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaW50IHJldDsKQEAgLTExNjIsMTAgKzExMzYsMTIgQEAKIAogCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKIAlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOwotCWlmIChzdC0+aW5mby0+dGVtcF9vdXRwdXQpCi0JCWluZGlvX2Rldi0+aW5mbyA9ICZzY2EzMDAwX2luZm9fd2l0aF90ZW1wOwotCWVsc2UgewotCQlpbmRpb19kZXYtPmluZm8gPSAmc2NhMzAwMF9pbmZvOworCWluZGlvX2Rldi0+aW5mbyA9ICZzY2EzMDAwX2luZm87CisJaWYgKHN0LT5pbmZvLT50ZW1wX291dHB1dCkgeworCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gc2NhMzAwMF9jaGFubmVsc193aXRoX3RlbXA7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0KKwkJCUFSUkFZX1NJWkUoc2NhMzAwMF9jaGFubmVsc193aXRoX3RlbXApOworCX0gZWxzZSB7CiAJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBzY2EzMDAwX2NoYW5uZWxzOwogCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoc2NhMzAwMF9jaGFubmVscyk7CiAJfQpAQCAtMTIzNiw3ICsxMjEyLDcgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCS8qIE11c3QgZW5zdXJlIG5vIGludGVycnVwdHMgY2FuIGJlIGdlbmVyYXRlZCBhZnRlciB0aGlzISovCisJLyogTXVzdCBlbnN1cmUgbm8gaW50ZXJydXB0cyBjYW4gYmUgZ2VuZXJhdGVkIGFmdGVyIHRoaXMhICovCiAJc2NhMzAwMF9zdG9wX2FsbF9pbnRlcnJ1cHRzKHN0KTsKIAlpZiAoc3BpLT5pcnEpCiAJCWZyZWVfaXJxKHNwaS0+aXJxLCBpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMKaW5kZXggZWEwYWY2ZC4uMTk4NzEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfcmluZy5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKIAlpZiAoc3RhdGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic3VwcG9zZWRseSBlbmFibGluZyByaW5nIGJ1ZmZlclxuIik7CisJCWRldl9pbmZvKCZpbmRpb19kZXYtPmRldiwgInN1cHBvc2VkbHkgZW5hYmxpbmcgcmluZyBidWZmZXJcbiIpOwogCQlyZXQgPSBzY2EzMDAwX3dyaXRlX3JlZyhzdCwKIAkJCQkJU0NBMzAwMF9SRUdfQUREUl9NT0RFLAogCQkJCQkoc3QtPnJ4WzBdIHwgU0NBMzAwMF9SSU5HX0JVRl9FTkFCTEUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4LmgKaW5kZXggYTU5MWFhNi4uZmM4Yzg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4LmgKQEAgLTk1LDcgKzk1LDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKIAljb25zdCBzdHJ1Y3QgYWQ3OTl4X2NoaXBfaW5mbwkqY2hpcF9pbmZvOwogCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7Ci0JdTE2CQkJCWludF92cmVmX212OworCXN0cnVjdCByZWd1bGF0b3IJCSp2cmVmOwogCXVuc2lnbmVkCQkJaWQ7CiAJdTE2CQkJCWNvbmZpZzsKIApAQCAtMTAzLDE0ICsxMDMsNiBAQAogCXVuc2lnbmVkIGludAkJCXRyYW5zZmVyX3NpemU7CiB9OwogCi0vKgotICogVE9ETzogc3RydWN0IGFkNzk5eF9wbGF0Zm9ybV9kYXRhIG5lZWRzIHRvIGdvIGludG8gaW5jbHVkZS9saW51eC9paW8KLSAqLwotCi1zdHJ1Y3QgYWQ3OTl4X3BsYXRmb3JtX2RhdGEgewotCXUxNgkJCQl2cmVmX212OwotfTsKLQogI2lmZGVmIENPTkZJR19BRDc5OVhfUklOR19CVUZGRVIKIGludCBhZDc5OXhfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWQ3OTl4X3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfY29yZS5jCmluZGV4IDU3MDhmZmMuLjk3OWVjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4X2NvcmUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBpaW8vYWRjL2FkNzk5eC5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMTAxMSBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBiYXNlZCBvbiBpaW8vYWRjL21heDEzNjMKICAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEpvbmF0aGFuIENhbWVyb24KQEAgLTE3OSw3ICsxNzksMTAgQEAKIAkJCVJFU19NQVNLKGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyk7CiAJCXJldHVybiBJSU9fVkFMX0lOVDsKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6Ci0JCSp2YWwgPSBzdC0+aW50X3ZyZWZfbXY7CisJCXJldCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdC0+dnJlZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJldCAvIDEwMDA7CiAJCSp2YWwyID0gY2hhbi0+c2Nhbl90eXBlLnJlYWxiaXRzOwogCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CiAJfQpAQCAtNTMzLDcgKzUzNiw2IEBACiAJCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGFkNzk5eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIApAQCAtNTUxLDE3ICs1NTMsMjEgQEAKIAogCS8qIFRPRE86IEFkZCBwZGF0YSBvcHRpb25zIGZvciBmaWx0ZXJpbmcgYW5kIGJpdCBkZWxheSAqLwogCi0JaWYgKCFwZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdC0+aW50X3ZyZWZfbXYgPSBwZGF0YS0+dnJlZl9tdjsKLQogCXN0LT5yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJmNsaWVudC0+ZGV2LCAidmNjIik7Ci0JaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJaWYgKElTX0VSUihzdC0+cmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIoc3QtPnJlZyk7CisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXN0LT52cmVmID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgInZyZWYiKTsKKwlpZiAoSVNfRVJSKHN0LT52cmVmKSkgeworCQlyZXQgPSBQVFJfRVJSKHN0LT52cmVmKTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAl9CisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+dnJlZik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKKwogCXN0LT5jbGllbnQgPSBjbGllbnQ7CiAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CkBAIC01NzcsMjggKzU4MywyOCBAQAogCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOwogCiAJaWYgKGNsaWVudC0+aXJxID4gMCkgewotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKLQkJCQkJICAgTlVMTCwKLQkJCQkJICAgYWQ3OTl4X2V2ZW50X2hhbmRsZXIsCi0JCQkJCSAgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKLQkJCQkJICAgSVJRRl9PTkVTSE9ULAotCQkJCQkgICBjbGllbnQtPm5hbWUsCi0JCQkJCSAgIGluZGlvX2Rldik7CisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmNsaWVudC0+ZGV2LAorCQkJCQkJY2xpZW50LT5pcnEsCisJCQkJCQlOVUxMLAorCQkJCQkJYWQ3OTl4X2V2ZW50X2hhbmRsZXIsCisJCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8CisJCQkJCQlJUlFGX09ORVNIT1QsCisJCQkJCQljbGllbnQtPm5hbWUsCisJCQkJCQlpbmRpb19kZXYpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcl9jbGVhbnVwX3Jpbmc7CiAJfQogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfaXJxOworCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKIAogCXJldHVybiAwOwogCi1lcnJvcl9mcmVlX2lycToKLQlpZiAoY2xpZW50LT5pcnEgPiAwKQotCQlmcmVlX2lycShjbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKIGVycm9yX2NsZWFudXBfcmluZzoKIAlhZDc5OXhfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiBlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+dnJlZikpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52cmVmKTsKIAlpZiAoIUlTX0VSUihzdC0+cmVnKSkKIAkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CiAKQEAgLTYxMSwxMCArNjE3LDEwIEBACiAJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKGNsaWVudC0+aXJxID4gMCkKLQkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7CiAKIAlhZDc5OXhfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CisJaWYgKCFJU19FUlIoc3QtPnZyZWYpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dnJlZik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCWtmcmVlKHN0LT5yeF9idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYwppbmRleCA1MTQ4NDRlLi4xMWZiOTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYwpAQCAtODQ3LDcgKzg0Nyw4IEBACiAJbXhzX2xyYWRjX3JlZ19jbGVhcihscmFkYywgMHhmZiwgTFJBRENfQ1RSTDApOwogCiAJLyogQ2xlYW4gdGhlIHNsb3QncyBwcmV2aW91cyBjb250ZW50LCB0aGVuIHNldCBuZXcgb25lLiAqLwotCW14c19scmFkY19yZWdfY2xlYXIobHJhZGMsIExSQURDX0NUUkw0X0xSQURDU0VMRUNUX01BU0soMCksIExSQURDX0NUUkw0KTsKKwlteHNfbHJhZGNfcmVnX2NsZWFyKGxyYWRjLCBMUkFEQ19DVFJMNF9MUkFEQ1NFTEVDVF9NQVNLKDApLAorCQkJTFJBRENfQ1RSTDQpOwogCW14c19scmFkY19yZWdfc2V0KGxyYWRjLCBjaGFuLCBMUkFEQ19DVFJMNCk7CiAKIAlteHNfbHJhZGNfcmVnX3dydChscmFkYywgMCwgTFJBRENfQ0goMCkpOwpAQCAtODk4LDEwICs4OTksNiBAQAogewogCXN0cnVjdCBteHNfbHJhZGMgKmxyYWRjID0gaWlvX3ByaXYoaWlvX2Rldik7CiAKLQkvKiBDaGVjayBmb3IgaW52YWxpZCBjaGFubmVsICovCi0JaWYgKGNoYW4tPmNoYW5uZWwgPiBMUkFEQ19NQVhfVE9UQUxfQ0hBTlMpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJc3dpdGNoIChtKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKIAkJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApCkBAIC0xMTczLDcgKzExNzAsOCBAQAogCWVsc2UgaWYgKHJlZyAmIExSQURDX0NUUkwxX0xSQURDX0lSUSgwKSkKIAkJY29tcGxldGUoJmxyYWRjLT5jb21wbGV0aW9uKTsKIAotCW14c19scmFkY19yZWdfY2xlYXIobHJhZGMsIHJlZyAmIG14c19scmFkY19pcnFfbWFzayhscmFkYyksIExSQURDX0NUUkwxKTsKKwlteHNfbHJhZGNfcmVnX2NsZWFyKGxyYWRjLCByZWcgJiBteHNfbHJhZGNfaXJxX21hc2sobHJhZGMpLAorCQkJTFJBRENfQ1RSTDEpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTI2NCw3ICsxMjYyLDggQEAKIAl1aW50MzJfdCBjdHJsMV9pcnEgPSAwOwogCWNvbnN0IHVpbnQzMl90IGNoYW5fdmFsdWUgPSBMUkFEQ19DSF9BQ0NVTVVMQVRFIHwKIAkJKChMUkFEQ19ERUxBWV9USU1FUl9MT09QIC0gMSkgPDwgTFJBRENfQ0hfTlVNX1NBTVBMRVNfT0ZGU0VUKTsKLQljb25zdCBpbnQgbGVuID0gYml0bWFwX3dlaWdodChpaW8tPmFjdGl2ZV9zY2FuX21hc2ssIExSQURDX01BWF9UT1RBTF9DSEFOUyk7CisJY29uc3QgaW50IGxlbiA9IGJpdG1hcF93ZWlnaHQoaWlvLT5hY3RpdmVfc2Nhbl9tYXNrLAorCQkJTFJBRENfTUFYX1RPVEFMX0NIQU5TKTsKIAogCWlmICghbGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NjMsNyArMTU2Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IG9mX2NmZy0+aXJxX2NvdW50OyBpKyspIHsKIAkJbHJhZGMtPmlycVtpXSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CiAJCWlmIChscmFkYy0+aXJxW2ldIDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIGxyYWRjLT5pcnFbaV07CiAKIAkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGxyYWRjLT5pcnFbaV0sCiAJCQkJCW14c19scmFkY19oYW5kbGVfaXJxLCAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuYwppbmRleCAxNmE4MjAxLi45ZjBlYmIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKQEAgLTg1OSwxMSArODU5LDE0IEBACiAJZWxzZSB7CiAJCXN3aXRjaCAoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfREFfRU5fTU9ERV9NQVNLKSB7CiAJCWNhc2UgQURUNzMxNl9EQV9FTl9NT0RFX1NJTkdMRToKLQkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgLSBhdXRvIGF0IGFueSBNU0IgREFDIHdyaXRpbmdcbiIpOworCQkJcmV0dXJuIHNwcmludGYoYnVmLAorCQkJCSIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iKTsKIAkJY2FzZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJfQ0Q6Ci0JCQlyZXR1cm4gc3ByaW50ZihidWYsICIxIC0gYXV0byBhdCBNU0IgREFDIEFCIGFuZCBDRCB3cml0aW5nXG4iKTsKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJCQkiMSAtIGF1dG8gYXQgTVNCIERBQyBBQiBhbmQgQ0Qgd3JpdGluZ1xuIik7CiAJCWNhc2UgQURUNzMxNl9EQV9FTl9NT0RFX0FCQ0Q6Ci0JCQlyZXR1cm4gc3ByaW50ZihidWYsICIyIC0gYXV0byBhdCBNU0IgREFDIEFCQ0Qgd3JpdGluZ1xuIik7CisJCQlyZXR1cm4gc3ByaW50ZihidWYsCisJCQkJIjIgLSBhdXRvIGF0IE1TQiBEQUMgQUJDRCB3cml0aW5nXG4iKTsKIAkJZGVmYXVsdDogLyogQURUNzMxNl9EQV9FTl9NT0RFX0xEQUMgKi8KIAkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjMgLSBtYW51YWxcbiIpOwogCQl9CkBAIC0xMTAyLDcgKzExMDUsOCBAQAogCQkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyB8IEFEVDczMTZfREFDX0lOX1ZSRUY7CiAJfQogCi0JcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfTERBQ19DT05GSUcsIGxkYWNfY29uZmlnKTsKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9MREFDX0NPTkZJRywKKwkJCWxkYWNfY29uZmlnKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMTIyNCw3ICsxMjI4LDggQEAKIAlyZXR1cm4gYWR0NzMxNl9zaG93X2FkKGNoaXAsIEFEVDczMTZfQURfU0lOR0xFX0NIX0VYLCBidWYpOwogfQogCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X3RlbXBfQUlOMSwgU19JUlVHTywgYWR0NzMxNl9zaG93X2V4X3RlbXBfQUlOMSwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X3RlbXBfQUlOMSwgU19JUlVHTywgYWR0NzMxNl9zaG93X2V4X3RlbXBfQUlOMSwKKwkJTlVMTCwgMCk7CiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X3RlbXAsIFNfSVJVR08sIGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEsIE5VTEwsIDApOwogCiBzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfQUlOMihzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xMzE5LDcgKzEzMjQsOCBAQAogCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwogCi0JcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9JTl9URU1QX09GRlNFVCwgYnVmLCBsZW4pOworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfSU5fVEVNUF9PRkZTRVQsIGJ1ZiwKKwkJCWxlbik7CiB9CiAKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdGVtcF9vZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLApAQCAtMTM0NCw3ICsxMzUwLDggQEAKIAlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKIAotCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0VYX1RFTVBfT0ZGU0VULCBidWYsCisJCQlsZW4pOwogfQogCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmgKaW5kZXggMmRiZmI0OS4uZWM1MGJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmgKQEAgLTE4LDEwICsxOCwxMCBAQAogCXZvaWQgKmNsaWVudDsKIAlpbnQgaXJxOwogCWludCBpcnFfZmxhZ3M7Ci0JaW50ICgqcmVhZCkgKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCAqZGF0YSk7Ci0JaW50ICgqd3JpdGUpICh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggdmFsKTsKLQlpbnQgKCptdWx0aV9yZWFkKSAodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7Ci0JaW50ICgqbXVsdGlfd3JpdGUpICh2b2lkICpjbGllbnQsIHU4IGZpcnN0X3JlZywgdTggY291bnQsIHU4ICpkYXRhKTsKKwlpbnQgKCpyZWFkKSh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggKmRhdGEpOworCWludCAoKndyaXRlKSh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggdmFsKTsKKwlpbnQgKCptdWx0aV9yZWFkKSh2b2lkICpjbGllbnQsIHU4IGZpcnN0X3JlZywgdTggY291bnQsIHU4ICpkYXRhKTsKKwlpbnQgKCptdWx0aV93cml0ZSkodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CiB9OwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jCmluZGV4IGY4YzY1OTUuLjBhNjBkZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jCkBAIC00MzMsNyArNDMzLDcgQEAKIAkJCQkJVFNMMjU4WF9DTURfUkVHIHwgVFNMMjU4WF9DTlRSTCwgdXRtcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2NoaXBfb24gZmFpbGVkIG9uIENOVFJMIHJlZy5cbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiByZXQ7CiAJfQogCiAJLyogVXNlIHRoZSBmb2xsb3dpbmcgc2hhZG93IGNvcHkgZm9yIG91ciBkZWxheSBiZWZvcmUgZW5hYmxpbmcgQURDLgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwKIAkJCQkidGFvc19jaGlwX29uIGZhaWxlZCBvbiByZWcgJWQuXG4iLCBpKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCQkJCQl1dG1wKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgInRhb3NfY2hpcF9vbiBmYWlsZWQgb24gMm5kIENUUkwgcmVnLlxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIHJldDsKIAl9CiAJY2hpcC0+dGFvc19jaGlwX3N0YXR1cyA9IFRTTDI1OFhfQ0hJUF9XT1JLSU5HOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDJ4N3hfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYwppbmRleCAxZTUzODA4Li45ZTBmMmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDJ4N3hfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMKQEAgLTM1Miw3ICszNTIsNyBAQAogCQkvKiBkZXZpY2UgaXMgbm90IGVuYWJsZWQgKi8KIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICIlczogZGV2aWNlIGlzIG5vdCBlbmFibGVkXG4iLAogCQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVCVVNZIDsKKwkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCkBAIC0xNTA3LDE2ICsxNTA3LDE2IEBACiAJY2FzZSB0c2wyNTcxOgogCWNhc2UgdHNsMjY3MToKIAljYXNlIHRzbDI3NzE6Ci0JCXJldHVybiAoKCppZCAmIDB4ZjApID09IFRSSVRPTl9JRCk7CisJCXJldHVybiAoKmlkICYgMHhmMCkgPT0gVFJJVE9OX0lEOwogCWNhc2UgdG1kMjY3MToKIAljYXNlIHRtZDI3NzE6Ci0JCXJldHVybiAoKCppZCAmIDB4ZjApID09IEhBTElCVVRfSUQpOworCQlyZXR1cm4gKCppZCAmIDB4ZjApID09IEhBTElCVVRfSUQ7CiAJY2FzZSB0c2wyNTcyOgogCWNhc2UgdHNsMjY3MjoKIAljYXNlIHRtZDI2NzI6CiAJY2FzZSB0c2wyNzcyOgogCWNhc2UgdG1kMjc3MjoKLQkJcmV0dXJuICgoKmlkICYgMHhmMCkgPT0gU1dPUkRGSVNIX0lEKTsKKwkJcmV0dXJuICgqaWQgJiAweGYwKSA9PSBTV09SREZJU0hfSUQ7CiAJfQogCiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKaW5kZXggNjk2NmQ1Zi4uN2ZiYWJhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJaWYgKHN0LT5wZGF0YS0+Z3Bpb2luKSB7CiAJCWRhdGEgPSBhZDJzMTIxMF9yZWFkX3Jlc29sdXRpb25fcGluKHN0KTsKIAkJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCi0JCQlwcl93YXJuaW5nKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOworCQkJcHJfd2FybigiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKIAl9IGVsc2UKIAkJYWQyczEyMTBfc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKIApAQCAtMzcyLDcgKzM3Miw3IEBACiAJaWYgKHN0LT5wZGF0YS0+Z3Bpb2luKSB7CiAJCWRhdGEgPSBhZDJzMTIxMF9yZWFkX3Jlc29sdXRpb25fcGluKHN0KTsKIAkJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCi0JCQlwcl93YXJuaW5nKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOworCQkJcHJfd2FybigiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKIAl9IGVsc2UKIAkJYWQyczEyMTBfc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKIAlyZXQgPSBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vS2NvbmZpZwppbmRleCA3ODMxOWFkLi5jNmU4YmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL0tjb25maWcKQEAgLTIwLDYgKzIwLDcgQEAKIAogY29uZmlnIERSTV9JTVhfUEFSQUxMRUxfRElTUExBWQogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBwYXJhbGxlbCBkaXNwbGF5cyIKKwlzZWxlY3QgRFJNX1BBTkVMCiAJZGVwZW5kcyBvbiBEUk1fSU1YCiAJc2VsZWN0IFZJREVPTU9ERV9IRUxQRVJTCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vTWFrZWZpbGUKaW5kZXggNDY3NzU4NS4uMTI5ZTNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vTWFrZWZpbGUKQEAgLTEsMTIgKzEsMTEgQEAKIAotaW14ZHJtLW9ianMgOj0gaW14LWRybS1jb3JlLm8gaW14LWZiLm8KK2lteGRybS1vYmpzIDo9IGlteC1kcm0tY29yZS5vCiAKIG9iai0kKENPTkZJR19EUk1fSU1YKSArPSBpbXhkcm0ubwogCiBvYmotJChDT05GSUdfRFJNX0lNWF9QQVJBTExFTF9ESVNQTEFZKSArPSBwYXJhbGxlbC1kaXNwbGF5Lm8KIG9iai0kKENPTkZJR19EUk1fSU1YX1RWRSkgKz0gaW14LXR2ZS5vCiBvYmotJChDT05GSUdfRFJNX0lNWF9MREIpICs9IGlteC1sZGIubwotb2JqLSQoQ09ORklHX0RSTV9JTVhfRkJfSEVMUEVSKSArPSBpbXgtZmJkZXYubwogb2JqLSQoQ09ORklHX0RSTV9JTVhfSVBVVjNfQ09SRSkgKz0gaXB1LXYzLwogCiBpbXgtaXB1djMtY3J0Yy1vYmpzICA6PSBpcHV2My1jcnRjLm8gaXB1djMtcGxhbmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL1RPRE8KaW5kZXggNmE5ZGE5NC4uMjk2MzZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9UT0RPCkBAIC0xLDE1ICsxLDEwIEBACiBUT0RPOgogLSBnZXQgRFJNIE1haW50YWluZXIgcmV2aWV3IGZvciB0aGlzIGNvZGUKLS0gV2FpdCBmb3IgY29tbW9uIGRpc3BsYXkgZnJhbWV3b3JrIHRvIGhpdCBtYWlubGluZSBhbmQgdXBkYXRlIHRoZSBJUFUKLSAgZHJpdmVyIHRvIHVzZSBpdC4gVGhpcyB3aWxsIG1vc3QgcHJvYmFibHkgbWFrZSBjaGFuZ2VzIHRvIHRoZSBkZXZpY2V0cmVlCi0gIGJpbmRpbmdzIG5lY2Vzc2FyeS4KLS0gRmFjdG9yIG91dCBtb3JlIGNvZGUgdG8gY29tbW9uIGhlbHBlciBmdW5jdGlvbnMKIC0gZGVjaWRlIHdoZXJlIHRvIHB1dCB0aGUgYmFzZSBkcml2ZXIuIEl0IGlzIG5vdCBzcGVjaWZpYyB0byBhIHN1YnN5c3RlbQogICBhbmQgd291bGQgYmUgdXNlZCBieSBEUk0vS01TIGFuZCBtZWRpYS9WNEwyCiAKIE1pc3NpbmcgZmVhdHVyZXMgKG5vdCBuZWNlc3NhcmlseSBmb3IgbW92aW5nIG91dCBvZiBzdGFnaW5nKToKIAotLSBBZGQgaS5NWDYgSERNSSBzdXBwb3J0CiAtIEFkZCBzdXBwb3J0IGZvciBJQyAoSW1hZ2UgY29udmVydGVyKQogLSBBZGQgc3VwcG9ydCBmb3IgQ1NJIChDTU9TIFNlbnNvciBpbnRlcmZhY2UpCiAtIEFkZCBzdXBwb3J0IGZvciBWRElDIChWaWRlbyBEZWludGVybGFjZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0tY29yZS5jCmluZGV4IDIzNmVkNjYuLjQxNDRhNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0tY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0tY29yZS5jCkBAIC0xMywxNCArMTMsMTUgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2ZiX2hlbHBlci5oPgogI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2ZiX2NtYV9oZWxwZXIuaD4KIApAQCAtMjgsNDUgKzI5LDI5IEBACiAKICNkZWZpbmUgTUFYX0NSVEMJNAogCi1zdHJ1Y3QgY3J0Y19jb29raWUgewotCXZvaWQgKmNvb2tpZTsKLQlpbnQgaWQ7CitzdHJ1Y3QgaW14X2RybV9jcnRjOworCitzdHJ1Y3QgaW14X2RybV9jb21wb25lbnQgeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCiBzdHJ1Y3QgaW14X2RybV9kZXZpY2UgewogCXN0cnVjdCBkcm1fZGV2aWNlCQkJKmRybTsKLQlzdHJ1Y3QgZGV2aWNlCQkJCSpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJCWNydGNfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJZW5jb2Rlcl9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJCQljb25uZWN0b3JfbGlzdDsKLQlzdHJ1Y3QgbXV0ZXgJCQkJbXV0ZXg7CisJc3RydWN0IGlteF9kcm1fY3J0YwkJCSpjcnRjW01BWF9DUlRDXTsKIAlpbnQJCQkJCXBpcGVzOwogCXN0cnVjdCBkcm1fZmJkZXZfY21hCQkJKmZiaGVscGVyOwogfTsKIAogc3RydWN0IGlteF9kcm1fY3J0YyB7CiAJc3RydWN0IGRybV9jcnRjCQkJCSpjcnRjOwotCXN0cnVjdCBsaXN0X2hlYWQJCQlsaXN0OwotCXN0cnVjdCBpbXhfZHJtX2RldmljZQkJCSppbXhkcm07CiAJaW50CQkJCQlwaXBlOwogCXN0cnVjdCBpbXhfZHJtX2NydGNfaGVscGVyX2Z1bmNzCWlteF9kcm1faGVscGVyX2Z1bmNzOwotCXN0cnVjdCBtb2R1bGUJCQkJKm93bmVyOwotCXN0cnVjdCBjcnRjX2Nvb2tpZQkJCWNvb2tpZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCQkqcG9ydDsKIH07CiAKLXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgewotCXN0cnVjdCBkcm1fZW5jb2RlcgkJCSplbmNvZGVyOwotCXN0cnVjdCBsaXN0X2hlYWQJCQlsaXN0OwotCXN0cnVjdCBtb2R1bGUJCQkJKm93bmVyOwotCXN0cnVjdCBsaXN0X2hlYWQJCQlwb3NzaWJsZV9jcnRjczsKLX07Ci0KLXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciB7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IJCQkqY29ubmVjdG9yOwotCXN0cnVjdCBsaXN0X2hlYWQJCQlsaXN0OwotCXN0cnVjdCBtb2R1bGUJCQkJKm93bmVyOwotfTsKK3N0YXRpYyBpbnQgbGVnYWN5ZmJfZGVwdGggPSAxNjsKK21vZHVsZV9wYXJhbShsZWdhY3lmYl9kZXB0aCwgaW50LCAwNDQ0KTsKIAogaW50IGlteF9kcm1fY3J0Y19pZChzdHJ1Y3QgaW14X2RybV9jcnRjICpjcnRjKQogewpAQCAtNzYsNjkgKzYxLDcxIEBACiAKIHN0YXRpYyB2b2lkIGlteF9kcm1fZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQogeworI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JTVhfRkJfSEVMUEVSKQogCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKIAogCWlmIChpbXhkcm0tPmZiaGVscGVyKQogCQlkcm1fZmJkZXZfY21hX3Jlc3RvcmVfbW9kZShpbXhkcm0tPmZiaGVscGVyKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IGlteF9kcm1fZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQogeworI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JTVhfRkJfSEVMUEVSKQogCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKKyNlbmRpZgogCi0JaW14X2RybV9kZXZpY2VfcHV0KCk7CisJZHJtX2ttc19oZWxwZXJfcG9sbF9maW5pKGRybSk7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKKwlpZiAoaW14ZHJtLT5mYmhlbHBlcikKKwkJZHJtX2ZiZGV2X2NtYV9maW5pKGlteGRybS0+ZmJoZWxwZXIpOworI2VuZGlmCisKKwljb21wb25lbnRfdW5iaW5kX2FsbChkcm0tPmRldiwgZHJtKTsKIAogCWRybV92YmxhbmtfY2xlYW51cChkcm0pOwotCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm0pOwogCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRybSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFdlIGRvbid0IGNhcmUgYXQgYWxsIGZvciBjcnRjIG51bWJlcnMsIGJ1dCB0aGUgY29yZSBleHBlY3RzIHRoZQotICogY3J0Y3MgdG8gYmUgbnVtYmVyZWQKLSAqLwotc3RhdGljIHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0Y19ieV9udW0oc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0sCi0JCWludCBudW0pCitzdGF0aWMgc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9maW5kX2NydGMoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YzsKKwlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW14X2RybV9jcnRjLCAmaW14ZHJtLT5jcnRjX2xpc3QsIGxpc3QpCi0JCWlmIChpbXhfZHJtX2NydGMtPnBpcGUgPT0gbnVtKQotCQkJcmV0dXJuIGlteF9kcm1fY3J0YzsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NSVEM7IGkrKykKKwkJaWYgKGlteGRybS0+Y3J0Y1tpXSAmJiBpbXhkcm0tPmNydGNbaV0tPmNydGMgPT0gY3J0YykKKwkJCXJldHVybiBpbXhkcm0tPmNydGNbaV07CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotaW50IGlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXRfcGlucyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBlbmNvZGVyX3R5cGUsCitpbnQgaW14X2RybV9wYW5lbF9mb3JtYXRfcGlucyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCXUzMiBpbnRlcmZhY2VfcGl4X2ZtdCwgaW50IGhzeW5jX3BpbiwgaW50IHZzeW5jX3BpbikKIHsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2NydGM7CiAJc3RydWN0IGlteF9kcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmhlbHBlcjsKKwlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfY3J0YzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW14X2NydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkKLQkJaWYgKGlteF9jcnRjLT5jcnRjID09IGNydGMpCi0JCQlnb3RvIGZvdW5kOworCWlteF9jcnRjID0gaW14X2RybV9maW5kX2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJaWYgKCFpbXhfY3J0YykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gLUVJTlZBTDsKLWZvdW5kOgogCWhlbHBlciA9ICZpbXhfY3J0Yy0+aW14X2RybV9oZWxwZXJfZnVuY3M7CiAJaWYgKGhlbHBlci0+c2V0X2ludGVyZmFjZV9waXhfZm10KQotCQlyZXR1cm4gaGVscGVyLT5zZXRfaW50ZXJmYWNlX3BpeF9mbXQoY3J0YywKLQkJCQllbmNvZGVyX3R5cGUsIGludGVyZmFjZV9waXhfZm10LAorCQlyZXR1cm4gaGVscGVyLT5zZXRfaW50ZXJmYWNlX3BpeF9mbXQoZW5jb2Rlci0+Y3J0YywKKwkJCQllbmNvZGVyLT5lbmNvZGVyX3R5cGUsIGludGVyZmFjZV9waXhfZm10LAogCQkJCWhzeW5jX3BpbiwgdnN5bmNfcGluKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXRfcGlucyk7CitFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX3BhbmVsX2Zvcm1hdF9waW5zKTsKIAotaW50IGlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MzIgZW5jb2Rlcl90eXBlLAotCQl1MzIgaW50ZXJmYWNlX3BpeF9mbXQpCitpbnQgaW14X2RybV9wYW5lbF9mb3JtYXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1MzIgaW50ZXJmYWNlX3BpeF9mbXQpCiB7Ci0JcmV0dXJuIGlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXRfcGlucyhjcnRjLCBlbmNvZGVyX3R5cGUsCi0JCQkJCSAgICAgIGludGVyZmFjZV9waXhfZm10LCAyLCAzKTsKKwlyZXR1cm4gaW14X2RybV9wYW5lbF9mb3JtYXRfcGlucyhlbmNvZGVyLCBpbnRlcmZhY2VfcGl4X2ZtdCwgMiwgMyk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fcGFuZWxfZm9ybWF0KTsKIAogaW50IGlteF9kcm1fY3J0Y192YmxhbmtfZ2V0KHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YykKIHsKQEAgLTE2MSwxMCArMTQ4LDkgQEAKIHN0YXRpYyBpbnQgaW14X2RybV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIGludCBjcnRjKQogewogCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGM7CisJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjID0gaW14ZHJtLT5jcnRjW2NydGNdOwogCWludCByZXQ7CiAKLQlpbXhfZHJtX2NydGMgPSBpbXhfZHJtX2NydGNfYnlfbnVtKGlteGRybSwgY3J0Yyk7CiAJaWYgKCFpbXhfZHJtX2NydGMpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xODAsOSArMTY2LDggQEAKIHN0YXRpYyB2b2lkIGlteF9kcm1fZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgaW50IGNydGMpCiB7CiAJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBkcm0tPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YzsKKwlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGMgPSBpbXhkcm0tPmNydGNbY3J0Y107CiAKLQlpbXhfZHJtX2NydGMgPSBpbXhfZHJtX2NydGNfYnlfbnVtKGlteGRybSwgY3J0Yyk7CiAJaWYgKCFpbXhfZHJtX2NydGMpCiAJCXJldHVybjsKIApAQCAtMjE1LDE3MiArMjAwLDU0IEBACiAJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14X2RybV9kZXZpY2U7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKl9faW14X2RybV9kZXZpY2Uodm9pZCkKK2ludCBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7Ci0JcmV0dXJuIGlteF9kcm1fZGV2aWNlOworCXJldHVybiBNT0RFX09LOworfQorRVhQT1JUX1NZTUJPTChpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKTsKKwordm9pZCBpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3kpOworCit2b2lkIGlteF9kcm1fZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3kpOworCitzdGF0aWMgdm9pZCBpbXhfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKKwlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7CisKKwlkcm1fZmJkZXZfY21hX2hvdHBsdWdfZXZlbnQoaW14ZHJtLT5mYmhlbHBlcik7CisjZW5kaWYKIH0KIAotc3RydWN0IGRybV9kZXZpY2UgKmlteF9kcm1fZGV2aWNlX2dldCh2b2lkKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmVuYzsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmNvbjsKLQlzdHJ1Y3QgaW14X2RybV9jcnRjICpjcnRjOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmMsICZpbXhkcm0tPmVuY29kZXJfbGlzdCwgbGlzdCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGVuYy0+b3duZXIpKSB7Ci0JCQlkZXZfZXJyKGlteGRybS0+ZGV2LCAiY291bGQgbm90IGdldCBtb2R1bGUgJXNcbiIsCi0JCQkJCW1vZHVsZV9uYW1lKGVuYy0+b3duZXIpKTsKLQkJCWdvdG8gdW53aW5kX2VuYzsKLQkJfQotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29uLCAmaW14ZHJtLT5jb25uZWN0b3JfbGlzdCwgbGlzdCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNvbi0+b3duZXIpKSB7Ci0JCQlkZXZfZXJyKGlteGRybS0+ZGV2LCAiY291bGQgbm90IGdldCBtb2R1bGUgJXNcbiIsCi0JCQkJCW1vZHVsZV9uYW1lKGNvbi0+b3duZXIpKTsKLQkJCWdvdG8gdW53aW5kX2NvbjsKLQkJfQotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KSB7Ci0JCWlmICghdHJ5X21vZHVsZV9nZXQoY3J0Yy0+b3duZXIpKSB7Ci0JCQlkZXZfZXJyKGlteGRybS0+ZGV2LCAiY291bGQgbm90IGdldCBtb2R1bGUgJXNcbiIsCi0JCQkJCW1vZHVsZV9uYW1lKGNydGMtPm93bmVyKSk7Ci0JCQlnb3RvIHVud2luZF9jcnRjOwotCQl9Ci0JfQotCi0JcmV0dXJuIGlteGRybS0+ZHJtOwotCi11bndpbmRfY3J0YzoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UoY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KQotCQltb2R1bGVfcHV0KGNydGMtPm93bmVyKTsKLXVud2luZF9jb246Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yZXZlcnNlKGNvbiwgJmlteGRybS0+Y29ubmVjdG9yX2xpc3QsIGxpc3QpCi0JCW1vZHVsZV9wdXQoY29uLT5vd25lcik7Ci11bndpbmRfZW5jOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShlbmMsICZpbXhkcm0tPmVuY29kZXJfbGlzdCwgbGlzdCkKLQkJbW9kdWxlX3B1dChlbmMtPm93bmVyKTsKLQotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlyZXR1cm4gTlVMTDsKLQotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9kZXZpY2VfZ2V0KTsKLQotdm9pZCBpbXhfZHJtX2RldmljZV9wdXQodm9pZCkKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICplbmM7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICpjb247Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqY3J0YzsKLQotCW11dGV4X2xvY2soJmlteGRybS0+bXV0ZXgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmaW14ZHJtLT5jcnRjX2xpc3QsIGxpc3QpCi0JCW1vZHVsZV9wdXQoY3J0Yy0+b3duZXIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb24sICZpbXhkcm0tPmNvbm5lY3Rvcl9saXN0LCBsaXN0KQotCQltb2R1bGVfcHV0KGNvbi0+b3duZXIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmMsICZpbXhkcm0tPmVuY29kZXJfbGlzdCwgbGlzdCkKLQkJbW9kdWxlX3B1dChlbmMtPm93bmVyKTsKLQotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2RldmljZV9wdXQpOwotCi1zdGF0aWMgaW50IGRybV9tb2RlX2dyb3VwX3JlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbW9kZV9ncm91cCAqZ3JvdXAgPSAmZGV2LT5wcmltYXJ5LT5tb2RlX2dyb3VwOwotCXVpbnQzMl90ICppZF9saXN0ID0gZ3JvdXAtPmlkX2xpc3Q7Ci0JaW50IHJldDsKLQotCXJldCA9IGRybV9tb2RlX2dyb3VwX2luaXRfbGVnYWN5X2dyb3VwKGRldiwgZ3JvdXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Ja2ZyZWUoaWRfbGlzdCk7Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBpbXhfZHJtX21vZGVfY29uZmlnX2Z1bmNzID0geworCS5mYl9jcmVhdGUgPSBkcm1fZmJfY21hX2NyZWF0ZSwKKwkub3V0cHV0X3BvbGxfY2hhbmdlZCA9IGlteF9kcm1fb3V0cHV0X3BvbGxfY2hhbmdlZCwKK307CiAKIC8qCi0gKiByZWdpc3RlciBhbiBlbmNvZGVyIHRvIHRoZSBkcm0gY29yZQotICovCi1zdGF0aWMgaW50IGlteF9kcm1fZW5jb2Rlcl9yZWdpc3RlcihzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICppbXhfZHJtX2VuY29kZXIpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaW14X2RybV9lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyk7Ci0KLQlkcm1fZW5jb2Rlcl9pbml0KGlteGRybS0+ZHJtLCBpbXhfZHJtX2VuY29kZXItPmVuY29kZXIsCi0JCQlpbXhfZHJtX2VuY29kZXItPmVuY29kZXItPmZ1bmNzLAotCQkJaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyLT5lbmNvZGVyX3R5cGUpOwotCi0JZHJtX21vZGVfZ3JvdXBfcmVpbml0KGlteGRybS0+ZHJtKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogdW5yZWdpc3RlciBhbiBlbmNvZGVyIGZyb20gdGhlIGRybSBjb3JlCi0gKi8KLXN0YXRpYyB2b2lkIGlteF9kcm1fZW5jb2Rlcl91bnJlZ2lzdGVyKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIKLQkJKmlteF9kcm1fZW5jb2RlcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQotCWRybV9lbmNvZGVyX2NsZWFudXAoaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyKTsKLQotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci19Ci0KLS8qCi0gKiByZWdpc3RlciBhIGNvbm5lY3RvciB0byB0aGUgZHJtIGNvcmUKLSAqLwotc3RhdGljIGludCBpbXhfZHJtX2Nvbm5lY3Rvcl9yZWdpc3RlcigKLQkJc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQotCWRybV9jb25uZWN0b3JfaW5pdChpbXhkcm0tPmRybSwgaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3RvciwKLQkJCWlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3ItPmZ1bmNzLAotCQkJaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpOwotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQlyZXR1cm4gZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3Rvcik7Ci19Ci0KLS8qCi0gKiB1bnJlZ2lzdGVyIGEgY29ubmVjdG9yIGZyb20gdGhlIGRybSBjb3JlCi0gKi8KLXN0YXRpYyB2b2lkIGlteF9kcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoCi0JCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqaW14X2RybV9jb25uZWN0b3IpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0KLQlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShpbXhfZHJtX2Nvbm5lY3Rvci0+Y29ubmVjdG9yKTsKLQlkcm1fY29ubmVjdG9yX2NsZWFudXAoaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3Rvcik7Ci0KLQlkcm1fbW9kZV9ncm91cF9yZWluaXQoaW14ZHJtLT5kcm0pOwotfQotCi0vKgotICogQ2FsbGVkIGJ5IHRoZSBDUlRDIGRyaXZlciB3aGVuIGFsbCBDUlRDcyBhcmUgcmVnaXN0ZXJlZC4gVGhpcwotICogcHV0cyBhbGwgdGhlIHBpZWNlcyB0b2dldGhlciBhbmQgaW5pdGlhbGl6ZXMgdGhlIGRyaXZlci4KLSAqIE9uY2UgdGhpcyBpcyBjYWxsZWQgbm8gbW9yZSBDUlRDcyBjYW4gYmUgcmVnaXN0ZXJlZCBzaW5jZQotICogdGhlIGRybSBjb3JlIGhhcyBoYXJkY29kZWQgdGhlIG51bWJlciBvZiBjcnRjcyBpbiBzZXZlcmFsCi0gKiBwbGFjZXMuCisgKiBNYWluIERSTSBpbml0aWFsaXNhdGlvbi4gVGhpcyBiaW5kcywgaW5pdGlhbGlzZXMgYW5kIHJlZ2lzdGVycworICogd2l0aCBEUk0gdGhlIHN1YmNvbXBvbmVudHMgb2YgdGhlIGRyaXZlci4KICAqLwogc3RhdGljIGludCBpbXhfZHJtX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm07CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKIAlpbnQgcmV0OwogCisJaW14ZHJtID0gZGV2bV9remFsbG9jKGRybS0+ZGV2LCBzaXplb2YoKmlteGRybSksIEdGUF9LRVJORUwpOworCWlmICghaW14ZHJtKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlteGRybS0+ZHJtID0gZHJtOwogCiAJZHJtLT5kZXZfcHJpdmF0ZSA9IGlteGRybTsKQEAgLTM5NiwxMjAgKzI2MywxMTggQEAKIAkgKi8KIAlkcm0tPmlycV9lbmFibGVkID0gdHJ1ZTsKIAorCS8qCisJICogc2V0IG1heCB3aWR0aCBhbmQgaGVpZ2h0IGFzIGRlZmF1bHQgdmFsdWUoNDA5Nng0MDk2KS4KKwkgKiB0aGlzIHZhbHVlIHdvdWxkIGJlIHVzZWQgdG8gY2hlY2sgZnJhbWVidWZmZXIgc2l6ZSBsaW1pdGF0aW9uCisJICogYXQgZHJtX21vZGVfYWRkZmIoKS4KKwkgKi8KKwlkcm0tPm1vZGVfY29uZmlnLm1pbl93aWR0aCA9IDY0OworCWRybS0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDY0OworCWRybS0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gNDA5NjsKKwlkcm0tPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA0MDk2OworCWRybS0+bW9kZV9jb25maWcuZnVuY3MgPSAmaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jczsKKwogCWRybV9tb2RlX2NvbmZpZ19pbml0KGRybSk7Ci0JaW14X2RybV9tb2RlX2NvbmZpZ19pbml0KGRybSk7Ci0KLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWRybV9rbXNfaGVscGVyX3BvbGxfaW5pdChkcm0pOwotCi0JLyogc2V0dXAgdGhlIGdyb3VwaW5nIGZvciB0aGUgbGVnYWN5IG91dHB1dCAqLwotCXJldCA9IGRybV9tb2RlX2dyb3VwX2luaXRfbGVnYWN5X2dyb3VwKGRybSwKLQkJCSZkcm0tPnByaW1hcnktPm1vZGVfZ3JvdXApOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2ttczsKIAogCXJldCA9IGRybV92YmxhbmtfaW5pdChkcm0sIE1BWF9DUlRDKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9rbXM7CiAKIAkvKgotCSAqIHdpdGggdmJsYW5rX2Rpc2FibGVfYWxsb3dlZCA9IHRydWUsIHZibGFuayBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZAotCSAqIGJ5IGRybSB0aW1lciBvbmNlIGEgY3VycmVudCBwcm9jZXNzIGdpdmVzIHVwIG93bmVyc2hpcCBvZgotCSAqIHZibGFuayBldmVudC4oYWZ0ZXIgZHJtX3ZibGFua19wdXQgZnVuY3Rpb24gaXMgY2FsbGVkKQorCSAqIHdpdGggdmJsYW5rX2Rpc2FibGVfYWxsb3dlZCA9IHRydWUsIHZibGFuayBpbnRlcnJ1cHQgd2lsbCBiZQorCSAqIGRpc2FibGVkIGJ5IGRybSB0aW1lciBvbmNlIGEgY3VycmVudCBwcm9jZXNzIGdpdmVzIHVwIG93bmVyc2hpcAorCSAqIG9mIHZibGFuayBldmVudC4gKGFmdGVyIGRybV92YmxhbmtfcHV0IGZ1bmN0aW9uIGlzIGNhbGxlZCkKIAkgKi8KIAlkcm0tPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlOwogCi0JaWYgKCFpbXhfZHJtX2RldmljZV9nZXQoKSkgewotCQlyZXQgPSAtRUlOVkFMOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRybS0+cGxhdGZvcm1kZXYsIGRybSk7CisKKwkvKiBOb3cgdHJ5IGFuZCBiaW5kIGFsbCBvdXIgc3ViLWNvbXBvbmVudHMgKi8KKwlyZXQgPSBjb21wb25lbnRfYmluZF9hbGwoZHJtLT5kZXYsIGRybSk7CisJaWYgKHJldCkKIAkJZ290byBlcnJfdmJsYW5rOworCisJLyoKKwkgKiBBbGwgY29tcG9uZW50cyBhcmUgbm93IGFkZGVkLCB3ZSBjYW4gcHVibGlzaCB0aGUgY29ubmVjdG9yIHN5c2ZzCisJICogZW50cmllcyB0byB1c2Vyc3BhY2UuICBUaGlzIHdpbGwgZ2VuZXJhdGUgaG90cGx1ZyBldmVudHMgYW5kIHNvCisJICogdXNlcnNwYWNlIHdpbGwgZXhwZWN0IHRvIGJlIGFibGUgdG8gYWNjZXNzIERSTSBhdCB0aGlzIHBvaW50LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZHJtLT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlyZXQgPSBkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRybS0+ZGV2LAorCQkJCSJbQ09OTkVDVE9SOiVkOiVzXSBkcm1fc3lzZnNfY29ubmVjdG9yX2FkZCBmYWlsZWQ6ICVkXG4iLAorCQkJCWNvbm5lY3Rvci0+YmFzZS5pZCwKKwkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksIHJldCk7CisJCQlnb3RvIGVycl91bmJpbmQ7CisJCX0KIAl9CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkcm0tPnBsYXRmb3JtZGV2LCBkcm0pOwotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CisJLyoKKwkgKiBBbGwgY29tcG9uZW50cyBhcmUgbm93IGluaXRpYWxpc2VkLCBzbyBzZXR1cCB0aGUgZmIgaGVscGVyLgorCSAqIFRoZSBmYiBoZWxwZXIgdGFrZXMgY29waWVzIG9mIGtleSBoYXJkd2FyZSBpbmZvcm1hdGlvbiwgc28gdGhlCisJICogY3J0Y3MvY29ubmVjdG9ycy9lbmNvZGVycyBtdXN0IG5vdCBjaGFuZ2UgYWZ0ZXIgdGhpcyBwb2ludC4KKwkgKi8KKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKKwlpZiAobGVnYWN5ZmJfZGVwdGggIT0gMTYgJiYgbGVnYWN5ZmJfZGVwdGggIT0gMzIpIHsKKwkJZGV2X3dhcm4oZHJtLT5kZXYsICJJbnZhbGlkIGxlZ2FjeWZiX2RlcHRoLiAgRGVmYXVsdGluZyB0byAxNmJwcFxuIik7CisJCWxlZ2FjeWZiX2RlcHRoID0gMTY7CisJfQorCWlteGRybS0+ZmJoZWxwZXIgPSBkcm1fZmJkZXZfY21hX2luaXQoZHJtLCBsZWdhY3lmYl9kZXB0aCwKKwkJCQlkcm0tPm1vZGVfY29uZmlnLm51bV9jcnRjLCBNQVhfQ1JUQyk7CisJaWYgKElTX0VSUihpbXhkcm0tPmZiaGVscGVyKSkgeworCQlyZXQgPSBQVFJfRVJSKGlteGRybS0+ZmJoZWxwZXIpOworCQlpbXhkcm0tPmZiaGVscGVyID0gTlVMTDsKKwkJZ290byBlcnJfdW5iaW5kOworCX0KKyNlbmRpZgorCisJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRybSk7CisKIAlyZXR1cm4gMDsKIAorZXJyX3VuYmluZDoKKwljb21wb25lbnRfdW5iaW5kX2FsbChkcm0tPmRldiwgZHJtKTsKIGVycl92Ymxhbms6CiAJZHJtX3ZibGFua19jbGVhbnVwKGRybSk7CiBlcnJfa21zOgotCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm0pOwogCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRybSk7Ci0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGlteF9kcm1fdXBkYXRlX3Bvc3NpYmxlX2NydGNzKHZvaWQpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmVuYzsKLQlzdHJ1Y3QgY3J0Y19jb29raWUgKmNvb2tpZTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpIHsKLQkJdTMyIHBvc3NpYmxlX2NydGNzID0gMDsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvb2tpZSwgJmVuYy0+cG9zc2libGVfY3J0Y3MsIGxpc3QpIHsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaW14X2RybV9jcnRjLCAmaW14ZHJtLT5jcnRjX2xpc3QsIGxpc3QpIHsKLQkJCQlpZiAoaW14X2RybV9jcnRjLT5jb29raWUuY29va2llID09IGNvb2tpZS0+Y29va2llICYmCi0JCQkJCQlpbXhfZHJtX2NydGMtPmNvb2tpZS5pZCA9PSBjb29raWUtPmlkKSB7Ci0JCQkJCXBvc3NpYmxlX2NydGNzIHw9IDEgPDwgaW14X2RybV9jcnRjLT5waXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbmMtPmVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gcG9zc2libGVfY3J0Y3M7Ci0JCWVuYy0+ZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gcG9zc2libGVfY3J0Y3M7Ci0JfQotfQotCiAvKgogICogaW14X2RybV9hZGRfY3J0YyAtIGFkZCBhIG5ldyBjcnRjCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpZiAhTlVMTCBpcyBhIGNvb2tpZSBmb3IgdGhlIGNhbGxlciB0byBwYXNzIHRvCi0gKiBpbXhfZHJtX3JlbW92ZV9jcnRjIGxhdGVyLgogICovCi1pbnQgaW14X2RybV9hZGRfY3J0YyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCitpbnQgaW14X2RybV9hZGRfY3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCXN0cnVjdCBpbXhfZHJtX2NydGMgKipuZXdfY3J0YywKIAkJY29uc3Qgc3RydWN0IGlteF9kcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmlteF9kcm1faGVscGVyX2Z1bmNzLAotCQlzdHJ1Y3QgbW9kdWxlICpvd25lciwgdm9pZCAqY29va2llLCBpbnQgaWQpCisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydCkKIHsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKKwlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjOwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQogCS8qCiAJICogVGhlIHZibGFuayBhcnJheXMgYXJlIGRpbWVuc2lvbmVkIGJ5IE1BWF9DUlRDIC0gd2UgY2FuJ3QKIAkgKiBwYXNzIElEcyBncmVhdGVyIHRoYW4gdGhpcyB0byB0aG9zZSBmdW5jdGlvbnMuCiAJICovCi0JaWYgKGlteGRybS0+cGlwZXMgPj0gTUFYX0NSVEMpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfYnVzeTsKLQl9CisJaWYgKGlteGRybS0+cGlwZXMgPj0gTUFYX0NSVEMpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlteGRybS0+ZHJtLT5vcGVuX2NvdW50KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfYnVzeTsKLQl9CisJaWYgKGlteGRybS0+ZHJtLT5vcGVuX2NvdW50KQorCQlyZXR1cm4gLUVCVVNZOwogCiAJaW14X2RybV9jcnRjID0ga3phbGxvYyhzaXplb2YoKmlteF9kcm1fY3J0YyksIEdGUF9LRVJORUwpOwotCWlmICghaW14X2RybV9jcnRjKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2FsbG9jOwotCX0KKwlpZiAoIWlteF9kcm1fY3J0YykKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbXhfZHJtX2NydGMtPmlteF9kcm1faGVscGVyX2Z1bmNzID0gKmlteF9kcm1faGVscGVyX2Z1bmNzOwogCWlteF9kcm1fY3J0Yy0+cGlwZSA9IGlteGRybS0+cGlwZXMrKzsKLQlpbXhfZHJtX2NydGMtPmNvb2tpZS5jb29raWUgPSBjb29raWU7Ci0JaW14X2RybV9jcnRjLT5jb29raWUuaWQgPSBpZDsKLQorCWlteF9kcm1fY3J0Yy0+cG9ydCA9IHBvcnQ7CiAJaW14X2RybV9jcnRjLT5jcnRjID0gY3J0YzsKLQlpbXhfZHJtX2NydGMtPmlteGRybSA9IGlteGRybTsKIAotCWlteF9kcm1fY3J0Yy0+b3duZXIgPSBvd25lcjsKLQotCWxpc3RfYWRkX3RhaWwoJmlteF9kcm1fY3J0Yy0+bGlzdCwgJmlteGRybS0+Y3J0Y19saXN0KTsKKwlpbXhkcm0tPmNydGNbaW14X2RybV9jcnRjLT5waXBlXSA9IGlteF9kcm1fY3J0YzsKIAogCSpuZXdfY3J0YyA9IGlteF9kcm1fY3J0YzsKIApAQCAtNTIwLDIzICszODUsMTQgQEAKIAlkcm1fY3J0Y19oZWxwZXJfYWRkKGNydGMsCiAJCQlpbXhfZHJtX2NydGMtPmlteF9kcm1faGVscGVyX2Z1bmNzLmNydGNfaGVscGVyX2Z1bmNzKTsKIAotCWRybV9jcnRjX2luaXQoaW14ZHJtLT5kcm0sIGNydGMsCisJZHJtX2NydGNfaW5pdChkcm0sIGNydGMsCiAJCQlpbXhfZHJtX2NydGMtPmlteF9kcm1faGVscGVyX2Z1bmNzLmNydGNfZnVuY3MpOwogCi0JZHJtX21vZGVfZ3JvdXBfcmVpbml0KGlteGRybS0+ZHJtKTsKLQotCWlteF9kcm1fdXBkYXRlX3Bvc3NpYmxlX2NydGNzKCk7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9yZWdpc3RlcjoKLQlsaXN0X2RlbCgmaW14X2RybV9jcnRjLT5saXN0KTsKKwlpbXhkcm0tPmNydGNbaW14X2RybV9jcnRjLT5waXBlXSA9IE5VTEw7CiAJa2ZyZWUoaW14X2RybV9jcnRjKTsKLWVycl9hbGxvYzoKLWVycl9idXN5OgotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fYWRkX2NydGMpOwpAQCAtNTQ2LDE3ICs0MDIsMTEgQEAKICAqLwogaW50IGlteF9kcm1fcmVtb3ZlX2NydGMoc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjKQogewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gaW14X2RybV9jcnRjLT5pbXhkcm07Ci0KLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKKwlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGlteF9kcm1fY3J0Yy0+Y3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAogCWRybV9jcnRjX2NsZWFudXAoaW14X2RybV9jcnRjLT5jcnRjKTsKIAotCWxpc3RfZGVsKCZpbXhfZHJtX2NydGMtPmxpc3QpOwotCi0JZHJtX21vZGVfZ3JvdXBfcmVpbml0KGlteGRybS0+ZHJtKTsKLQotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CisJaW14ZHJtLT5jcnRjW2lteF9kcm1fY3J0Yy0+cGlwZV0gPSBOVUxMOwogCiAJa2ZyZWUoaW14X2RybV9jcnRjKTsKIApAQCAtNTY1LDIyMCArNDE1LDExNSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9yZW1vdmVfY3J0Yyk7CiAKIC8qCi0gKiBpbXhfZHJtX2FkZF9lbmNvZGVyIC0gYWRkIGEgbmV3IGVuY29kZXIKKyAqIEZpbmQgdGhlIERSTSBDUlRDIHBvc3NpYmxlIG1hc2sgZm9yIHRoZSBjb25uZWN0ZWQgZW5kcG9pbnQuCisgKgorICogVGhlIGVuY29kZXIgcG9zc2libGUgbWFza3MgYXJlIGRlZmluZWQgYnkgdGhlaXIgcG9zaXRpb24gaW4gdGhlCisgKiBtb2RlX2NvbmZpZyBjcnRjX2xpc3QuICBUaGlzIG1lYW5zIHRoYXQgQ1JUQ3MgbXVzdCBub3QgYmUgYWRkZWQKKyAqIG9yIHJlbW92ZWQgb25jZSB0aGUgRFJNIGRldmljZSBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXNlZC4KICAqLwotaW50IGlteF9kcm1fYWRkX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAotCQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICoqbmV3ZW5jLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3N0YXRpYyB1aW50MzJfdCBpbXhfZHJtX2ZpbmRfY3J0Y19tYXNrKHN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtLAorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZW5kcG9pbnQpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyOwotCWludCByZXQ7CisJc3RydWN0IGRldmljZV9ub2RlICpwb3J0OworCXVuc2lnbmVkIGk7CiAKLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKKwlwb3J0ID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KGVuZHBvaW50KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiAwOworCW9mX25vZGVfcHV0KHBvcnQpOwogCi0JaWYgKGlteGRybS0+ZHJtLT5vcGVuX2NvdW50KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfYnVzeTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NSVEM7IGkrKykgeworCQlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGMgPSBpbXhkcm0tPmNydGNbaV07CisJCWlmIChpbXhfZHJtX2NydGMgJiYgaW14X2RybV9jcnRjLT5wb3J0ID09IHBvcnQpCisJCQlyZXR1cm4gZHJtX2NydGNfbWFzayhpbXhfZHJtX2NydGMtPmNydGMpOwogCX0KIAotCWlteF9kcm1fZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteF9kcm1fZW5jb2RlcikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9hbGxvYzsKLQl9Ci0KLQlpbXhfZHJtX2VuY29kZXItPmVuY29kZXIgPSBlbmNvZGVyOwotCWlteF9kcm1fZW5jb2Rlci0+b3duZXIgPSBvd25lcjsKLQotCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9yZWdpc3RlcihpbXhfZHJtX2VuY29kZXIpOwotCWlmIChyZXQpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0JfQotCi0JbGlzdF9hZGRfdGFpbCgmaW14X2RybV9lbmNvZGVyLT5saXN0LCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QpOwotCi0JKm5ld2VuYyA9IGlteF9kcm1fZW5jb2RlcjsKLQotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KIAlyZXR1cm4gMDsKLQotZXJyX3JlZ2lzdGVyOgotCWtmcmVlKGlteF9kcm1fZW5jb2Rlcik7Ci1lcnJfYWxsb2M6Ci1lcnJfYnVzeToKLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fYWRkX2VuY29kZXIpOwogCi1pbnQgaW14X2RybV9lbmNvZGVyX2FkZF9wb3NzaWJsZV9jcnRjcygKLQkJc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyLAotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqaW14X2RybV9vZl9nZXRfbmV4dF9lbmRwb2ludCgKKwkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldikKIHsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7Ci0Jc3RydWN0IGNydGNfY29va2llICpjOwotCWludCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KHBhcmVudCwgcHJldik7CisJb2Zfbm9kZV9wdXQocHJldik7CisJcmV0dXJuIG5vZGU7Cit9CisKK2ludCBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2Yoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBkcm0tPmRldl9wcml2YXRlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXAgPSBOVUxMOworCXVpbnQzMl90IGNydGNfbWFzayA9IDA7CiAJaW50IGk7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJmlteF9kcm1fZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MpKQotCQlyZXR1cm4gLUVCVVNZOworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXUzMiBtYXNrOwogCi0JZm9yIChpID0gMDsgIXJldDsgaSsrKSB7Ci0JCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAiY3J0Y3MiLAotCQkJCSIjY3J0Yy1jZWxscyIsIGksICZhcmdzKTsKLQkJaWYgKHJldCA8IDApCisJCWVwID0gaW14X2RybV9vZl9nZXRfbmV4dF9lbmRwb2ludChucCwgZXApOworCQlpZiAoIWVwKQogCQkJYnJlYWs7CiAKLQkJYyA9IGt6YWxsb2Moc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYykgewotCQkJb2Zfbm9kZV9wdXQoYXJncy5ucCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQorCQltYXNrID0gaW14X2RybV9maW5kX2NydGNfbWFzayhpbXhkcm0sIGVwKTsKIAotCQljLT5jb29raWUgPSBhcmdzLm5wOwotCQljLT5pZCA9IGFyZ3MuYXJnc19jb3VudCA+IDAgPyBhcmdzLmFyZ3NbMF0gOiAwOworCQkvKgorCQkgKiBJZiB3ZSBmYWlsZWQgdG8gZmluZCB0aGUgQ1JUQyhzKSB3aGljaCB0aGlzIGVuY29kZXIgaXMKKwkJICogc3VwcG9zZWQgdG8gYmUgY29ubmVjdGVkIHRvLCBpdCdzIGJlY2F1c2UgdGhlIENSVEMgaGFzCisJCSAqIG5vdCBiZWVuIHJlZ2lzdGVyZWQgeWV0LiAgRGVmZXIgcHJvYmluZywgYW5kIGhvcGUgdGhhdAorCQkgKiB0aGUgcmVxdWlyZWQgQ1JUQyBpcyBhZGRlZCBsYXRlci4KKwkJICovCisJCWlmIChtYXNrID09IDApCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAotCQlvZl9ub2RlX3B1dChhcmdzLm5wKTsKLQotCQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCQlsaXN0X2FkZF90YWlsKCZjLT5saXN0LCAmaW14X2RybV9lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyk7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKKwkJY3J0Y19tYXNrIHw9IG1hc2s7CiAJfQogCi0JaW14X2RybV91cGRhdGVfcG9zc2libGVfY3J0Y3MoKTsKKwlpZiAoZXApCisJCW9mX25vZGVfcHV0KGVwKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gY3J0Y19tYXNrOworCisJLyogRklYTUU6IHRoaXMgaXMgdGhlIG1hc2sgb2Ygb3V0cHV0cyB3aGljaCBjYW4gY2xvbmUgdGhpcyBvdXRwdXQuICovCisJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gfjA7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3MpOwotCi1pbnQgaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyLAotCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2NydGM7Ci0JaW50IGkgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbXhfY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KSB7Ci0JCWlmIChpbXhfY3J0Yy0+Y3J0YyA9PSBjcnRjKQotCQkJZ290byBmb3VuZDsKLQkJaSsrOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotZm91bmQ6Ci0JcmV0dXJuIGk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZCk7CitFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YpOwogCiAvKgotICogaW14X2RybV9yZW1vdmVfZW5jb2RlciAtIHJlbW92ZSBhbiBlbmNvZGVyCisgKiBAbm9kZTogZGV2aWNlIHRyZWUgbm9kZSBjb250YWluaW5nIGVuY29kZXIgaW5wdXQgcG9ydHMKKyAqIEBlbmNvZGVyOiBkcm1fZW5jb2RlcgogICovCi1pbnQgaW14X2RybV9yZW1vdmVfZW5jb2RlcihzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICppbXhfZHJtX2VuY29kZXIpCitpbnQgaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQlzdHJ1Y3QgY3J0Y19jb29raWUgKmMsICp0bXA7Ci0KLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWlteF9kcm1fZW5jb2Rlcl91bnJlZ2lzdGVyKGlteF9kcm1fZW5jb2Rlcik7Ci0KLQlsaXN0X2RlbCgmaW14X2RybV9lbmNvZGVyLT5saXN0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZpbXhfZHJtX2VuY29kZXItPnBvc3NpYmxlX2NydGNzLAotCQkJbGlzdCkKLQkJa2ZyZWUoYyk7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCi0Ja2ZyZWUoaW14X2RybV9lbmNvZGVyKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9yZW1vdmVfZW5jb2Rlcik7Ci0KLS8qCi0gKiBpbXhfZHJtX2FkZF9jb25uZWN0b3IgLSBhZGQgYSBjb25uZWN0b3IKLSAqLwotaW50IGlteF9kcm1fYWRkX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKipuZXdfY29uLAotCQlzdHJ1Y3QgbW9kdWxlICpvd25lcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOworCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9jcnRjID0gaW14X2RybV9maW5kX2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJc3RydWN0IGRldmljZV9ub2RlICplcCA9IE5VTEw7CisJc3RydWN0IG9mX2VuZHBvaW50IGVuZHBvaW50OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydDsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7CisJaWYgKCFub2RlIHx8ICFpbXhfY3J0YykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaW14ZHJtLT5kcm0tPm9wZW5fY291bnQpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycl9idXN5OwotCX0KKwlkbyB7CisJCWVwID0gaW14X2RybV9vZl9nZXRfbmV4dF9lbmRwb2ludChub2RlLCBlcCk7CisJCWlmICghZXApCisJCQlicmVhazsKIAotCWlteF9kcm1fY29ubmVjdG9yID0ga3phbGxvYyhzaXplb2YoKmlteF9kcm1fY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbXhfZHJtX2Nvbm5lY3RvcikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9hbGxvYzsKLQl9CisJCXBvcnQgPSBvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQoZXApOworCQlvZl9ub2RlX3B1dChwb3J0KTsKKwkJaWYgKHBvcnQgPT0gaW14X2NydGMtPnBvcnQpIHsKKwkJCXJldCA9IG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KGVwLCAmZW5kcG9pbnQpOworCQkJcmV0dXJuIHJldCA/IHJldCA6IGVuZHBvaW50LmlkOworCQl9CisJfSB3aGlsZSAoZXApOwogCi0JaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKLQlpbXhfZHJtX2Nvbm5lY3Rvci0+b3duZXIgPSBvd25lcjsKLQotCXJldCA9IGlteF9kcm1fY29ubmVjdG9yX3JlZ2lzdGVyKGlteF9kcm1fY29ubmVjdG9yKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9yZWdpc3RlcjsKLQotCWxpc3RfYWRkX3RhaWwoJmlteF9kcm1fY29ubmVjdG9yLT5saXN0LCAmaW14ZHJtLT5jb25uZWN0b3JfbGlzdCk7Ci0KLQkqbmV3X2NvbiA9IGlteF9kcm1fY29ubmVjdG9yOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCXJldHVybiAwOwotCi1lcnJfcmVnaXN0ZXI6Ci0Ja2ZyZWUoaW14X2RybV9jb25uZWN0b3IpOwotZXJyX2FsbG9jOgotZXJyX2J1c3k6Ci0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIC1FSU5WQUw7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2FkZF9jb25uZWN0b3IpOwotCi12b2lkIGlteF9kcm1fZmJfaGVscGVyX3NldChzdHJ1Y3QgZHJtX2ZiZGV2X2NtYSAqZmJkZXZfaGVscGVyKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCi0JaW14ZHJtLT5mYmhlbHBlciA9IGZiZGV2X2hlbHBlcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZmJfaGVscGVyX3NldCk7Ci0KLS8qCi0gKiBpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IgLSByZW1vdmUgYSBjb25uZWN0b3IKLSAqLwotaW50IGlteF9kcm1fcmVtb3ZlX2Nvbm5lY3RvcihzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlpbXhfZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKGlteF9kcm1fY29ubmVjdG9yKTsKLQotCWxpc3RfZGVsKCZpbXhfZHJtX2Nvbm5lY3Rvci0+bGlzdCk7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCi0Ja2ZyZWUoaW14X2RybV9jb25uZWN0b3IpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IpOworRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pb2N0bF9kZXNjIGlteF9kcm1faW9jdGxzW10gPSB7CiAJLyogbm9uZSBzbyBmYXIgKi8KQEAgLTgxOSw4MCArNTY0LDE1NiBAQAogCS5wYXRjaGxldmVsCQk9IDAsCiB9OwogCitzdGF0aWMgaW50IGNvbXBhcmVfb2Yoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkYXRhOworCisJLyogU3BlY2lhbCBjYXNlIGZvciBMREIsIG9uZSBkZXZpY2UgZm9yIHR3byBjaGFubmVscyAqLworCWlmIChvZl9ub2RlX2NtcChucC0+bmFtZSwgImx2ZHMtY2hhbm5lbCIpID09IDApIHsKKwkJbnAgPSBvZl9nZXRfcGFyZW50KG5wKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworCXJldHVybiBkZXYtPm9mX25vZGUgPT0gbnA7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoaW14X2RybV9jb21wb25lbnRzKTsKKworc3RhdGljIGludCBpbXhfZHJtX2FkZF9jb21wb25lbnRzKHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgc3RydWN0IG1hc3RlciAqbSkKK3sKKwlzdHJ1Y3QgaW14X2RybV9jb21wb25lbnQgKmNvbXBvbmVudDsKKwlpbnQgcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wb25lbnQsICZpbXhfZHJtX2NvbXBvbmVudHMsIGxpc3QpIHsKKwkJcmV0ID0gY29tcG9uZW50X21hc3Rlcl9hZGRfY2hpbGQobSwgY29tcGFyZV9vZiwKKwkJCQkJCSBjb21wb25lbnQtPm9mX25vZGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW14X2RybV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZHJtX3BsYXRmb3JtX2luaXQoJmlteF9kcm1fZHJpdmVyLCB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIGlteF9kcm1fdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkcm1fcHV0X2RldihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X21hc3Rlcl9vcHMgaW14X2RybV9vcHMgPSB7CisJLmFkZF9jb21wb25lbnRzID0gaW14X2RybV9hZGRfY29tcG9uZW50cywKKwkuYmluZCA9IGlteF9kcm1fYmluZCwKKwkudW5iaW5kID0gaW14X2RybV91bmJpbmQsCit9OworCitzdGF0aWMgc3RydWN0IGlteF9kcm1fY29tcG9uZW50ICppbXhfZHJtX2ZpbmRfY29tcG9uZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBpbXhfZHJtX2NvbXBvbmVudCAqY29tcG9uZW50OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wb25lbnQsICZpbXhfZHJtX2NvbXBvbmVudHMsIGxpc3QpCisJCWlmIChjb21wb25lbnQtPm9mX25vZGUgPT0gbm9kZSkKKwkJCXJldHVybiBjb21wb25lbnQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpbXhfZHJtX2FkZF9jb21wb25lbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGlteF9kcm1fY29tcG9uZW50ICpjb21wb25lbnQ7CisKKwlpZiAoaW14X2RybV9maW5kX2NvbXBvbmVudChkZXYsIG5vZGUpKQorCQlyZXR1cm4gMDsKKworCWNvbXBvbmVudCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY29tcG9uZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb21wb25lbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJY29tcG9uZW50LT5vZl9ub2RlID0gbm9kZTsKKwlsaXN0X2FkZF90YWlsKCZjb21wb25lbnQtPmxpc3QsICZpbXhfZHJtX2NvbXBvbmVudHMpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaW14X2RybV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXAsICpwb3J0LCAqcmVtb3RlOwogCWludCByZXQ7CisJaW50IGk7CisKKwkvKgorCSAqIEJpbmQgdGhlIElQVSBkaXNwbGF5IGludGVyZmFjZSBwb3J0cyBmaXJzdCwgc28gdGhhdAorCSAqIGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZiBjYWxsZWQgZnJvbSBlbmNvZGVyIC5iaW5kIGNhbGxiYWNrcworCSAqIHdvcmtzIGFzIGV4cGVjdGVkLgorCSAqLworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXBvcnQgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicG9ydHMiLCBpKTsKKwkJaWYgKCFwb3J0KQorCQkJYnJlYWs7CisKKwkJcmV0ID0gaW14X2RybV9hZGRfY29tcG9uZW50KCZwZGV2LT5kZXYsIHBvcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGkgPT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nICdwb3J0cycgcHJvcGVydHlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUaGVuIGJpbmQgYWxsIGVuY29kZXJzICovCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJcG9ydCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJwb3J0cyIsIGkpOworCQlpZiAoIXBvcnQpCisJCQlicmVhazsKKworCQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBvcnQsIGVwKSB7CisJCQlyZW1vdGUgPSBvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KGVwKTsKKwkJCWlmICghcmVtb3RlIHx8ICFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKHJlbW90ZSkpIHsKKwkJCQlvZl9ub2RlX3B1dChyZW1vdGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyZXQgPSBpbXhfZHJtX2FkZF9jb21wb25lbnQoJnBkZXYtPmRldiwgcmVtb3RlKTsKKwkJCW9mX25vZGVfcHV0KHJlbW90ZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCW9mX25vZGVfcHV0KHBvcnQpOworCX0KIAogCXJldCA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaW14X2RybV9kZXZpY2UtPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXR1cm4gZHJtX3BsYXRmb3JtX2luaXQoJmlteF9kcm1fZHJpdmVyLCBwZGV2KTsKKwlyZXR1cm4gY29tcG9uZW50X21hc3Rlcl9hZGQoJnBkZXYtPmRldiwgJmlteF9kcm1fb3BzKTsKIH0KIAogc3RhdGljIGludCBpbXhfZHJtX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWRybV9wdXRfZGV2KHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKLQorCWNvbXBvbmVudF9tYXN0ZXJfZGVsKCZwZGV2LT5kZXYsICZpbXhfZHJtX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF9kcm1fZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW14X2RybV9kdF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXhfZHJtX3BkcnYgPSB7CiAJLnByb2JlCQk9IGlteF9kcm1fcGxhdGZvcm1fcHJvYmUsCiAJLnJlbW92ZQkJPSBpbXhfZHJtX3BsYXRmb3JtX3JlbW92ZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gImlteC1kcm0iLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBpbXhfZHJtX2R0X2lkcywKIAl9LAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9kcm1fcGRldjsKLQotc3RhdGljIGludCBfX2luaXQgaW14X2RybV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWlteF9kcm1fZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKmlteF9kcm1fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbXhfZHJtX2RldmljZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltdXRleF9pbml0KCZpbXhfZHJtX2RldmljZS0+bXV0ZXgpOwotCUlOSVRfTElTVF9IRUFEKCZpbXhfZHJtX2RldmljZS0+Y3J0Y19saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmaW14X2RybV9kZXZpY2UtPmNvbm5lY3Rvcl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmaW14X2RybV9kZXZpY2UtPmVuY29kZXJfbGlzdCk7Ci0KLQlpbXhfZHJtX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJpbXgtZHJtIiwgLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoaW14X2RybV9wZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKGlteF9kcm1fcGRldik7Ci0JCWdvdG8gZXJyX3BkZXY7Ci0JfQotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbXhfZHJtX3BkcnYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3BkcnY7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3BkcnY6Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaW14X2RybV9wZGV2KTsKLWVycl9wZGV2OgotCWtmcmVlKGlteF9kcm1fZGV2aWNlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpbXhfZHJtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpbXhfZHJtX3BkZXYpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpbXhfZHJtX3BkcnYpOwotCi0Ja2ZyZWUoaW14X2RybV9kZXZpY2UpOwotfQotCi1tb2R1bGVfaW5pdChpbXhfZHJtX2luaXQpOwotbW9kdWxlX2V4aXQoaW14X2RybV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaW14X2RybV9wZHJ2KTsKIAogTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpLk1YIGRybSBkcml2ZXIgY29yZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS5oIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS5oCmluZGV4IGFlOTBjOWMuLmEzMjJiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLmgKQEAgLTEsMTcgKzEsMTUgQEAKICNpZm5kZWYgX0lNWF9EUk1fSF8KICNkZWZpbmUgX0lNWF9EUk1fSF8KIAotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotCi0jZGVmaW5lIElQVV9QSVhfRk1UX0dCUjI0CXY0bDJfZm91cmNjKCdHJywgJ0InLCAnUicsICczJykKLQorc3RydWN0IGRldmljZV9ub2RlOwogc3RydWN0IGRybV9jcnRjOwogc3RydWN0IGRybV9jb25uZWN0b3I7CiBzdHJ1Y3QgZHJtX2RldmljZTsKK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlOwogc3RydWN0IGRybV9lbmNvZGVyOwotc3RydWN0IGlteF9kcm1fY3J0YzsKIHN0cnVjdCBkcm1fZmJkZXZfY21hOwogc3RydWN0IGRybV9mcmFtZWJ1ZmZlcjsKK3N0cnVjdCBpbXhfZHJtX2NydGM7CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogCiBpbnQgaW14X2RybV9jcnRjX2lkKHN0cnVjdCBpbXhfZHJtX2NydGMgKmNydGMpOwpAQCAtMjUsMTAgKzIzLDEwIEBACiAJY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzICpjcnRjX2Z1bmNzOwogfTsKIAotaW50IGlteF9kcm1fYWRkX2NydGMoc3RydWN0IGRybV9jcnRjICpjcnRjLAoraW50IGlteF9kcm1fYWRkX2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQlzdHJ1Y3QgaW14X2RybV9jcnRjICoqbmV3X2NydGMsCiAJCWNvbnN0IHN0cnVjdCBpbXhfZHJtX2NydGNfaGVscGVyX2Z1bmNzICppbXhfaGVscGVyX2Z1bmNzLAotCQlzdHJ1Y3QgbW9kdWxlICpvd25lciwgdm9pZCAqY29va2llLCBpbnQgaWQpOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQpOwogaW50IGlteF9kcm1fcmVtb3ZlX2NydGMoc3RydWN0IGlteF9kcm1fY3J0YyAqKTsKIGludCBpbXhfZHJtX2luaXRfZHJtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCWludCBwcmVmZXJyZWRfYnBwKTsKQEAgLTM4LDM1ICszNiwyMyBAQAogdm9pZCBpbXhfZHJtX2NydGNfdmJsYW5rX3B1dChzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGMpOwogdm9pZCBpbXhfZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjKTsKIAotc3RydWN0IGlteF9kcm1fZW5jb2RlcjsKLWludCBpbXhfZHJtX2FkZF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJc3RydWN0IGlteF9kcm1fZW5jb2RlciAqKm5ld19lbmMsCi0JCXN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLWludCBpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKik7Ci0KLXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvcjsKLWludCBpbXhfZHJtX2FkZF9jb25uZWN0b3Ioc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICoqbmV3X2NvbiwKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIpOwotaW50IGlteF9kcm1fcmVtb3ZlX2Nvbm5lY3RvcihzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKik7Ci0KIHZvaWQgaW14X2RybV9tb2RlX2NvbmZpZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pOwogCiBzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICppbXhfZHJtX2ZiX2dldF9vYmooc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpOwogCi1zdHJ1Y3QgZHJtX2RldmljZSAqaW14X2RybV9kZXZpY2VfZ2V0KHZvaWQpOwotdm9pZCBpbXhfZHJtX2RldmljZV9wdXQodm9pZCk7Ci1pbnQgaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdF9waW5zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGVuY29kZXJfdHlwZSwKK2ludCBpbXhfZHJtX3BhbmVsX2Zvcm1hdF9waW5zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJdTMyIGludGVyZmFjZV9waXhfZm10LCBpbnQgaHN5bmNfcGluLCBpbnQgdnN5bmNfcGluKTsKLWludCBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGVuY29kZXJfdHlwZSwKK2ludCBpbXhfZHJtX3BhbmVsX2Zvcm1hdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCXUzMiBpbnRlcmZhY2VfcGl4X2ZtdCk7Ci12b2lkIGlteF9kcm1fZmJfaGVscGVyX3NldChzdHJ1Y3QgZHJtX2ZiZGV2X2NtYSAqZmJkZXZfaGVscGVyKTsKIAotc3RydWN0IGRldmljZV9ub2RlOworaW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK2ludCBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2Yoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogCi1pbnQgaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyLAotCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwotaW50IGlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3Moc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyLAotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2ludCBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwordm9pZCBpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwordm9pZCBpbXhfZHJtX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCiAjZW5kaWYgLyogX0lNWF9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYi5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTdiNGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogaS5NWCBkcm0gZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgKLSAqCi0gKiBCYXNlZCBvbiBTYW1zdW5nIEV4eW5vcyBjb2RlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9nZW1fY21hX2hlbHBlci5oPgotI2luY2x1ZGUgPGRybS9kcm1fZmJfY21hX2hlbHBlci5oPgotCi0jaW5jbHVkZSAiaW14LWRybS5oIgotCi1zdGF0aWMgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBpbXhfZHJtX21vZGVfY29uZmlnX2Z1bmNzID0gewotCS5mYl9jcmVhdGUgPSBkcm1fZmJfY21hX2NyZWF0ZSwKLX07Ci0KLXZvaWQgaW14X2RybV9tb2RlX2NvbmZpZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JZGV2LT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSA2NDsKLQlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSA2NDsKLQotCS8qCi0JICogc2V0IG1heCB3aWR0aCBhbmQgaGVpZ2h0IGFzIGRlZmF1bHQgdmFsdWUoNDA5Nng0MDk2KS4KLQkgKiB0aGlzIHZhbHVlIHdvdWxkIGJlIHVzZWQgdG8gY2hlY2sgZnJhbWVidWZmZXIgc2l6ZSBsaW1pdGF0aW9uCi0JICogYXQgZHJtX21vZGVfYWRkZmIoKS4KLQkgKi8KLQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDQwOTY7Ci0JZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gNDA5NjsKLQotCWRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAmaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jczsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYmRldi5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWZiZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzE3MzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWZiZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogaS5NWCBkcm0gZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgKLSAqCi0gKiBCYXNlZCBvbiBTYW1zdW5nIEV4eW5vcyBjb2RlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9mYl9jbWFfaGVscGVyLmg+Ci0KLSNpbmNsdWRlICJpbXgtZHJtLmgiCi0KLSNkZWZpbmUgTUFYX0NPTk5FQ1RPUgkJNAotI2RlZmluZSBQUkVGRVJSRURfQlBQCQkxNgotCi1zdGF0aWMgc3RydWN0IGRybV9mYmRldl9jbWEgKmZiZGV2X2NtYTsKLQotc3RhdGljIGludCBsZWdhY3lmYl9kZXB0aCA9IDE2OwotCi1tb2R1bGVfcGFyYW0obGVnYWN5ZmJfZGVwdGgsIGludCwgMDQ0NCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlteF9mYl9oZWxwZXJfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBpbXhfZHJtX2RldmljZV9nZXQoKTsKLQotCWlmICghZHJtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChsZWdhY3lmYl9kZXB0aCAhPSAxNiAmJiBsZWdhY3lmYl9kZXB0aCAhPSAzMikgewotCQlwcl93YXJuKCJpLk1YIGxlZ2FjeWZiOiBpbnZhbGlkIGxlZ2FjeWZiX2RlcHRoIHNldHRpbmcuIGRlZmF1bHRpbmcgdG8gMTZicHBcbiIpOwotCQlsZWdhY3lmYl9kZXB0aCA9IDE2OwotCX0KLQotCWZiZGV2X2NtYSA9IGRybV9mYmRldl9jbWFfaW5pdChkcm0sIGxlZ2FjeWZiX2RlcHRoLAotCQkJZHJtLT5tb2RlX2NvbmZpZy5udW1fY3J0YywgTUFYX0NPTk5FQ1RPUik7Ci0KLQlpZiAoSVNfRVJSKGZiZGV2X2NtYSkpIHsKLQkJaW14X2RybV9kZXZpY2VfcHV0KCk7Ci0JCXJldHVybiBQVFJfRVJSKGZiZGV2X2NtYSk7Ci0JfQotCi0JaW14X2RybV9mYl9oZWxwZXJfc2V0KGZiZGV2X2NtYSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlteF9mYl9oZWxwZXJfZXhpdCh2b2lkKQotewotCWlteF9kcm1fZmJfaGVscGVyX3NldChOVUxMKTsKLQlkcm1fZmJkZXZfY21hX2ZpbmkoZmJkZXZfY21hKTsKLQlpbXhfZHJtX2RldmljZV9wdXQoKTsKLX0KLQotbGF0ZV9pbml0Y2FsbChpbXhfZmJfaGVscGVyX2luaXQpOwotbW9kdWxlX2V4aXQoaW14X2ZiX2hlbHBlcl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgaS5NWCBsZWdhY3kgZmIgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtaGRtaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWhkbWkuYwppbmRleCA2MmNlMGU4Li5kNDdkZWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtaGRtaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1oZG1pLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAxMCwgR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0xMTIsMTUgKzExMywxNSBAQAogCiBzdHJ1Y3QgaW14X2hkbWkgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKIAogCWVudW0gaW14X2hkbWlfZGV2dHlwZSBkZXZfdHlwZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGNsayAqaXNmcl9jbGs7CiAJc3RydWN0IGNsayAqaWFoYl9jbGs7CiAKKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGNvbm5lY3Rvcl9zdGF0dXM7CisKIAlzdHJ1Y3QgaGRtaV9kYXRhX2luZm8gaGRtaV9kYXRhOwogCWludCB2aWM7CiAKQEAgLTEzNCw3ICsxMzUsNiBAQAogCXN0cnVjdCBpMmNfYWRhcHRlciAqZGRjOwogCXZvaWQgX19pb21lbSAqcmVnczsKIAotCXVuc2lnbmVkIGxvbmcgcGl4ZWxfY2xrX3JhdGU7CiAJdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOwogCWludCByYXRpbzsKIH07CkBAIC0xNTYsMzcgKzE1NiwzNCBAQAogCXJldHVybiByZWFkYihoZG1pLT5yZWdzICsgb2Zmc2V0KTsKIH0KIAorc3RhdGljIHZvaWQgaGRtaV9tb2RiKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwgdTggZGF0YSwgdTggbWFzaywgdW5zaWduZWQgcmVnKQoreworCXU4IHZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgcmVnKSAmIH5tYXNrOworCXZhbCB8PSBkYXRhICYgbWFzazsKKwloZG1pX3dyaXRlYihoZG1pLCB2YWwsIHJlZyk7Cit9CisKIHN0YXRpYyB2b2lkIGhkbWlfbWFza193cml0ZWIoc3RydWN0IGlteF9oZG1pICpoZG1pLCB1OCBkYXRhLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkgICAgICB1OCBzaGlmdCwgdTggbWFzaykKIHsKLQl1OCB2YWx1ZSA9IGhkbWlfcmVhZGIoaGRtaSwgcmVnKSAmIH5tYXNrOwotCXZhbHVlIHw9IChkYXRhIDw8IHNoaWZ0KSAmIG1hc2s7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsdWUsIHJlZyk7CisJaGRtaV9tb2RiKGhkbWksIGRhdGEgPDwgc2hpZnQsIG1hc2ssIHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfc2V0X2Nsb2NrX3JlZ2VuZXJhdG9yX24oc3RydWN0IGlteF9oZG1pICpoZG1pLAogCQkJCQkgdW5zaWduZWQgaW50IHZhbHVlKQogewotCXU4IHZhbDsKLQogCWhkbWlfd3JpdGViKGhkbWksIHZhbHVlICYgMHhmZiwgSERNSV9BVURfTjEpOwogCWhkbWlfd3JpdGViKGhkbWksICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIEhETUlfQVVEX04yKTsKIAloZG1pX3dyaXRlYihoZG1pLCAodmFsdWUgPj4gMTYpICYgMHgwZiwgSERNSV9BVURfTjMpOwogCiAJLyogbnNoaWZ0IGZhY3RvciA9IDAgKi8KLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfQVVEX0NUUzMpOwotCXZhbCAmPSB+SERNSV9BVURfQ1RTM19OX1NISUZUX01BU0s7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FVRF9DVFMzKTsKKwloZG1pX21vZGIoaGRtaSwgMCwgSERNSV9BVURfQ1RTM19OX1NISUZUX01BU0ssIEhETUlfQVVEX0NUUzMpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX3JlZ2VuZXJhdGVfY3RzKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwgdW5zaWduZWQgaW50IGN0cykKIHsKLQl1OCB2YWw7Ci0KIAkvKiBNdXN0IGJlIHNldC9jbGVhcmVkIGZpcnN0ICovCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FVRF9DVFMzKTsKLQl2YWwgJj0gfkhETUlfQVVEX0NUUzNfQ1RTX01BTlVBTDsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfQVVEX0NUUzMpOworCWhkbWlfbW9kYihoZG1pLCAwLCBIRE1JX0FVRF9DVFMzX0NUU19NQU5VQUwsIEhETUlfQVVEX0NUUzMpOwogCiAJaGRtaV93cml0ZWIoaGRtaSwgY3RzICYgMHhmZiwgSERNSV9BVURfQ1RTMSk7CiAJaGRtaV93cml0ZWIoaGRtaSwgKGN0cyA+PiA4KSAmIDB4ZmYsIEhETUlfQVVEX0NUUzIpOwpAQCAtMzMxLDM0ICszMjgsMjUgQEAKIAkJcmV0dXJuIChjdHMgKiByYXRpbykgLyAxMDA7CiB9CiAKLXN0YXRpYyB2b2lkIGhkbWlfZ2V0X3BpeGVsX2NsayhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCi17Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCi0JcmF0ZSA9IDY1MDAwMDAwOyAvKiBGSVhNRSAqLwotCi0JaWYgKHJhdGUpCi0JCWhkbWktPnBpeGVsX2Nsa19yYXRlID0gcmF0ZTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9zZXRfY2xrX3JlZ2VuZXJhdG9yKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKK3N0YXRpYyB2b2lkIGhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksCisJdW5zaWduZWQgbG9uZyBwaXhlbF9jbGspCiB7CiAJdW5zaWduZWQgaW50IGNsa19uLCBjbGtfY3RzOwogCi0JY2xrX24gPSBoZG1pX2NvbXB1dGVfbihoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cGl4ZWxfY2xrX3JhdGUsCisJY2xrX24gPSBoZG1pX2NvbXB1dGVfbihoZG1pLT5zYW1wbGVfcmF0ZSwgcGl4ZWxfY2xrLAogCQkJICAgICAgIGhkbWktPnJhdGlvKTsKLQljbGtfY3RzID0gaGRtaV9jb21wdXRlX2N0cyhoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cGl4ZWxfY2xrX3JhdGUsCisJY2xrX2N0cyA9IGhkbWlfY29tcHV0ZV9jdHMoaGRtaS0+c2FtcGxlX3JhdGUsIHBpeGVsX2NsaywKIAkJCQkgICBoZG1pLT5yYXRpbyk7CiAKIAlpZiAoIWNsa19jdHMpIHsKIAkJZGV2X2RiZyhoZG1pLT5kZXYsICIlczogcGl4ZWwgY2xvY2sgbm90IHN1cHBvcnRlZDogJWx1XG4iLAotCQkJIF9fZnVuY19fLCBoZG1pLT5waXhlbF9jbGtfcmF0ZSk7CisJCQkgX19mdW5jX18sIHBpeGVsX2Nsayk7CiAJCXJldHVybjsKIAl9CiAKIAlkZXZfZGJnKGhkbWktPmRldiwgIiVzOiBzYW1wbGVyYXRlPSVkICByYXRpbz0lZCAgcGl4ZWxjbGs9JWx1ICBOPSVkIGN0cz0lZFxuIiwKIAkJX19mdW5jX18sIGhkbWktPnNhbXBsZV9yYXRlLCBoZG1pLT5yYXRpbywKLQkJaGRtaS0+cGl4ZWxfY2xrX3JhdGUsIGNsa19uLCBjbGtfY3RzKTsKKwkJcGl4ZWxfY2xrLCBjbGtfbiwgY2xrX2N0cyk7CiAKIAloZG1pX3NldF9jbG9ja19yZWdlbmVyYXRvcl9uKGhkbWksIGNsa19uKTsKIAloZG1pX3JlZ2VuZXJhdGVfY3RzKGhkbWksIGNsa19jdHMpOwpAQCAtMzY2LDMyICszNTQsMTIgQEAKIAogc3RhdGljIHZvaWQgaGRtaV9pbml0X2Nsa19yZWdlbmVyYXRvcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7Ci0JdW5zaWduZWQgaW50IGNsa19uLCBjbGtfY3RzOwotCi0JY2xrX24gPSBoZG1pX2NvbXB1dGVfbihoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cGl4ZWxfY2xrX3JhdGUsCi0JCQkgICAgICAgaGRtaS0+cmF0aW8pOwotCWNsa19jdHMgPSBoZG1pX2NvbXB1dGVfY3RzKGhkbWktPnNhbXBsZV9yYXRlLCBoZG1pLT5waXhlbF9jbGtfcmF0ZSwKLQkJCQkgICBoZG1pLT5yYXRpbyk7Ci0KLQlpZiAoIWNsa19jdHMpIHsKLQkJZGV2X2RiZyhoZG1pLT5kZXYsICIlczogcGl4ZWwgY2xvY2sgbm90IHN1cHBvcnRlZDogJWx1XG4iLAotCQkJIF9fZnVuY19fLCBoZG1pLT5waXhlbF9jbGtfcmF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXZfZGJnKGhkbWktPmRldiwgIiVzOiBzYW1wbGVyYXRlPSVkICByYXRpbz0lZCAgcGl4ZWxjbGs9JWx1ICBOPSVkIGN0cz0lZFxuIiwKLQkJX19mdW5jX18sIGhkbWktPnNhbXBsZV9yYXRlLCBoZG1pLT5yYXRpbywKLQkJaGRtaS0+cGl4ZWxfY2xrX3JhdGUsIGNsa19uLCBjbGtfY3RzKTsKLQotCWhkbWlfc2V0X2Nsb2NrX3JlZ2VuZXJhdG9yX24oaGRtaSwgY2xrX24pOwotCWhkbWlfcmVnZW5lcmF0ZV9jdHMoaGRtaSwgY2xrX2N0cyk7CisJaGRtaV9zZXRfY2xrX3JlZ2VuZXJhdG9yKGhkbWksIDc0MjUwMDAwKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9jbGtfcmVnZW5lcmF0b3JfdXBkYXRlX3BpeGVsX2Nsb2NrKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQkvKiBHZXQgcGl4ZWwgY2xvY2sgZnJvbSBpcHUgKi8KLQloZG1pX2dldF9waXhlbF9jbGsoaGRtaSk7Ci0JaGRtaV9zZXRfY2xrX3JlZ2VuZXJhdG9yKGhkbWkpOworCWhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihoZG1pLCBoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayk7CiB9CiAKIC8qCkBAIC00NTksMzggKzQyNyw0NSBAQAogCiBzdGF0aWMgaW50IGlzX2NvbG9yX3NwYWNlX2NvbnZlcnNpb24oc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXJldHVybiAoaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgIT0KLQkJaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0KTsKKwlyZXR1cm4gaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgIT0gaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0OwogfQogCiBzdGF0aWMgaW50IGlzX2NvbG9yX3NwYWNlX2RlY2ltYXRpb24oc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXJldHVybiAoKGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCA9PSBZQ0JDUjQyMl84QklUUykgJiYKLQkJKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ID09IFJHQiB8fAotCQloZG1pLT5oZG1pX2RhdGEuZW5jX2luX2Zvcm1hdCA9PSBZQ0JDUjQ0NCkpOworCWlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgIT0gWUNCQ1I0MjJfOEJJVFMpCisJCXJldHVybiAwOworCWlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2Zvcm1hdCA9PSBSR0IgfHwKKwkgICAgaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgPT0gWUNCQ1I0NDQpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlzX2NvbG9yX3NwYWNlX2ludGVycG9sYXRpb24oc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXJldHVybiAoKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ID09IFlDQkNSNDIyXzhCSVRTKSAmJgotCQkoaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ID09IFJHQiB8fAotCQloZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gWUNCQ1I0NDQpKTsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgIT0gWUNCQ1I0MjJfOEJJVFMpCisJCXJldHVybiAwOworCWlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gUkdCIHx8CisJICAgIGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCA9PSBZQ0JDUjQ0NCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9oZG1pX3VwZGF0ZV9jc2NfY29lZmZzKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKIAljb25zdCB1MTYgKCpjc2NfY29lZmYpWzNdWzRdID0gJmNzY19jb2VmZl9kZWZhdWx0OworCXVuc2lnbmVkIGk7CiAJdTMyIGNzY19zY2FsZSA9IDE7Ci0JdTggdmFsOwogCiAJaWYgKGlzX2NvbG9yX3NwYWNlX2NvbnZlcnNpb24oaGRtaSkpIHsKIAkJaWYgKGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCA9PSBSR0IpIHsKLQkJCWlmIChoZG1pLT5oZG1pX2RhdGEuY29sb3JpbWV0cnkgPT0gSERNSV9DT0xPUklNRVRSWV9JVFVfNjAxKQorCQkJaWYgKGhkbWktPmhkbWlfZGF0YS5jb2xvcmltZXRyeSA9PQorCQkJCQlIRE1JX0NPTE9SSU1FVFJZX0lUVV82MDEpCiAJCQkJY3NjX2NvZWZmID0gJmNzY19jb2VmZl9yZ2Jfb3V0X2VpdHU2MDE7CiAJCQllbHNlCiAJCQkJY3NjX2NvZWZmID0gJmNzY19jb2VmZl9yZ2Jfb3V0X2VpdHU3MDk7CiAJCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgPT0gUkdCKSB7Ci0JCQlpZiAoaGRtaS0+aGRtaV9kYXRhLmNvbG9yaW1ldHJ5ID09IEhETUlfQ09MT1JJTUVUUllfSVRVXzYwMSkKKwkJCWlmIChoZG1pLT5oZG1pX2RhdGEuY29sb3JpbWV0cnkgPT0KKwkJCQkJSERNSV9DT0xPUklNRVRSWV9JVFVfNjAxKQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX2luX2VpdHU2MDE7CiAJCQllbHNlCiAJCQkJY3NjX2NvZWZmID0gJmNzY19jb2VmZl9yZ2JfaW5fZWl0dTcwOTsKQEAgLTQ5OCwzNyArNDczLDI0IEBACiAJCX0KIAl9CiAKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzBdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQTFfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzBdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0ExX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVsxXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0EyX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVsxXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9BMl9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMF1bMl0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9BM19MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMF1bMl0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQTNfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzNdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQTRfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzNdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0E0X01TQik7CisJLyogVGhlIENTQyByZWdpc3RlcnMgYXJlIHNlcXVlbnRpYWwsIGFsdGVybmF0aW5nIE1TQiB0aGVuIExTQiAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzY19jb2VmZl9kZWZhdWx0WzBdKTsgaSsrKSB7CisJCXUxNiBjb2VmZl9hID0gKCpjc2NfY29lZmYpWzBdW2ldOworCQl1MTYgY29lZmZfYiA9ICgqY3NjX2NvZWZmKVsxXVtpXTsKKwkJdTE2IGNvZWZmX2MgPSAoKmNzY19jb2VmZilbMl1baV07CiAKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzBdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQjFfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzBdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0IxX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVsxXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0IyX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVsxXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9CMl9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMV1bMl0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9CM19MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMV1bMl0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQjNfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzNdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQjRfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzNdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0I0X01TQik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2EgJiAweGZmLAorCQkJSERNSV9DU0NfQ09FRl9BMV9MU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2EgPj4gOCwgSERNSV9DU0NfQ09FRl9BMV9NU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2IgJiAweGZmLCBIRE1JX0NTQ19DT0VGX0IxX0xTQiArIGkgKiAyKTsKKwkJaGRtaV93cml0ZWIoaGRtaSwgY29lZmZfYiA+PiA4LCBIRE1JX0NTQ19DT0VGX0IxX01TQiArIGkgKiAyKTsKKwkJaGRtaV93cml0ZWIoaGRtaSwgY29lZmZfYyAmIDB4ZmYsCisJCQlIRE1JX0NTQ19DT0VGX0MxX0xTQiArIGkgKiAyKTsKKwkJaGRtaV93cml0ZWIoaGRtaSwgY29lZmZfYyA+PiA4LCBIRE1JX0NTQ19DT0VGX0MxX01TQiArIGkgKiAyKTsKKwl9CiAKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzBdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQzFfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzBdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0MxX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVsxXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0MyX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVsxXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9DMl9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMl1bMl0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9DM19MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMl1bMl0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQzNfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzNdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQzRfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzNdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0M0X01TQik7Ci0KLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfQ1NDX1NDQUxFKTsKLQl2YWwgJj0gfkhETUlfQ1NDX1NDQUxFX0NTQ1NDQUxFX01BU0s7Ci0JdmFsIHw9IGNzY19zY2FsZSAmIEhETUlfQ1NDX1NDQUxFX0NTQ1NDQUxFX01BU0s7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0NTQ19TQ0FMRSk7CisJaGRtaV9tb2RiKGhkbWksIGNzY19zY2FsZSwgSERNSV9DU0NfU0NBTEVfQ1NDU0NBTEVfTUFTSywKKwkJICBIRE1JX0NTQ19TQ0FMRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfdmlkZW9fY3NjKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKQEAgLTUzNiw3ICs0OTgsNiBAQAogCWludCBjb2xvcl9kZXB0aCA9IDA7CiAJaW50IGludGVycG9sYXRpb24gPSBIRE1JX0NTQ19DRkdfSU5UTU9ERV9ESVNBQkxFOwogCWludCBkZWNpbWF0aW9uID0gMDsKLQl1OCB2YWw7CiAKIAkvKiBZQ0M0MjIgaW50ZXJwb2xhdGlvbiB0byA0NDQgbW9kZSAqLwogCWlmIChpc19jb2xvcl9zcGFjZV9pbnRlcnBvbGF0aW9uKGhkbWkpKQpAQCAtNTU3LDEwICs1MTgsOCBAQAogCiAJLyogQ29uZmlndXJlIHRoZSBDU0MgcmVnaXN0ZXJzICovCiAJaGRtaV93cml0ZWIoaGRtaSwgaW50ZXJwb2xhdGlvbiB8IGRlY2ltYXRpb24sIEhETUlfQ1NDX0NGRyk7Ci0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0NTQ19TQ0FMRSk7Ci0JdmFsICY9IH5IRE1JX0NTQ19TQ0FMRV9DU0NfQ09MT1JERV9QVEhfTUFTSzsKLQl2YWwgfD0gY29sb3JfZGVwdGg7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0NTQ19TQ0FMRSk7CisJaGRtaV9tb2RiKGhkbWksIGNvbG9yX2RlcHRoLCBIRE1JX0NTQ19TQ0FMRV9DU0NfQ09MT1JERV9QVEhfTUFTSywKKwkJICBIRE1JX0NTQ19TQ0FMRSk7CiAKIAlpbXhfaGRtaV91cGRhdGVfY3NjX2NvZWZmcyhoZG1pKTsKIH0KQEAgLTU3Niw3ICs1MzUsNyBAQAogCXVuc2lnbmVkIGludCByZW1hcF9zaXplID0gSERNSV9WUF9SRU1BUF9ZQ0M0MjJfMTZiaXQ7CiAJdW5zaWduZWQgaW50IG91dHB1dF9zZWxlY3QgPSBIRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX1BQOwogCXN0cnVjdCBoZG1pX2RhdGFfaW5mbyAqaGRtaV9kYXRhID0gJmhkbWktPmhkbWlfZGF0YTsKLQl1OCB2YWw7CisJdTggdmFsLCB2cF9jb25mOwogCiAJaWYgKGhkbWlfZGF0YS0+ZW5jX291dF9mb3JtYXQgPT0gUkdCCiAJCXx8IGhkbWlfZGF0YS0+ZW5jX291dF9mb3JtYXQgPT0gWUNCQ1I0NDQpIHsKQEAgLTYxNSwxMDcgKzU3NCw3NSBAQAogCQlIRE1JX1ZQX1BSX0NEX0RFU0lSRURfUFJfRkFDVE9SX01BU0spOwogCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9QUl9DRCk7CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfU1RVRkYpOwotCXZhbCAmPSB+SERNSV9WUF9TVFVGRl9QUl9TVFVGRklOR19NQVNLOwotCXZhbCB8PSBIRE1JX1ZQX1NUVUZGX1BSX1NUVUZGSU5HX1NUVUZGSU5HX01PREU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX1NUVUZGKTsKKwloZG1pX21vZGIoaGRtaSwgSERNSV9WUF9TVFVGRl9QUl9TVFVGRklOR19TVFVGRklOR19NT0RFLAorCQkgIEhETUlfVlBfU1RVRkZfUFJfU1RVRkZJTkdfTUFTSywgSERNSV9WUF9TVFVGRik7CiAKIAkvKiBEYXRhIGZyb20gcGl4ZWwgcmVwZWF0ZXIgYmxvY2sgKi8KIAlpZiAoaGRtaV9kYXRhLT5waXhfcmVwZXRfZmFjdG9yID4gMSkgewotCQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfQ09ORik7Ci0JCXZhbCAmPSB+KEhETUlfVlBfQ09ORl9QUl9FTl9NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9CWVBBU1NfU0VMRUNUX01BU0spOwotCQl2YWwgfD0gSERNSV9WUF9DT05GX1BSX0VOX0VOQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9QSVhfUkVQRUFURVI7Ci0JCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9DT05GKTsKKwkJdnBfY29uZiA9IEhETUlfVlBfQ09ORl9QUl9FTl9FTkFCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9QSVhfUkVQRUFURVI7CiAJfSBlbHNlIHsgLyogZGF0YSBmcm9tIHBhY2tldGl6ZXIgYmxvY2sgKi8KLQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX0NPTkYpOwotCQl2YWwgJj0gfihIRE1JX1ZQX0NPTkZfUFJfRU5fTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9NQVNLKTsKLQkJdmFsIHw9IEhETUlfVlBfQ09ORl9QUl9FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9CWVBBU1NfU0VMRUNUX1ZJRF9QQUNLRVRJWkVSOwotCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJCXZwX2NvbmYgPSBIRE1JX1ZQX0NPTkZfUFJfRU5fRElTQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9CWVBBU1NfU0VMRUNUX1ZJRF9QQUNLRVRJWkVSOwogCX0KIAotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9TVFVGRik7Ci0JdmFsICY9IH5IRE1JX1ZQX1NUVUZGX0lERUZBVUxUX1BIQVNFX01BU0s7Ci0JdmFsIHw9IDEgPDwgSERNSV9WUF9TVFVGRl9JREVGQVVMVF9QSEFTRV9PRkZTRVQ7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX1NUVUZGKTsKKwloZG1pX21vZGIoaGRtaSwgdnBfY29uZiwKKwkJICBIRE1JX1ZQX0NPTkZfUFJfRU5fTUFTSyB8CisJCSAgSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfTUFTSywgSERNSV9WUF9DT05GKTsKKworCWhkbWlfbW9kYihoZG1pLCAxIDw8IEhETUlfVlBfU1RVRkZfSURFRkFVTFRfUEhBU0VfT0ZGU0VULAorCQkgIEhETUlfVlBfU1RVRkZfSURFRkFVTFRfUEhBU0VfTUFTSywgSERNSV9WUF9TVFVGRik7CiAKIAloZG1pX3dyaXRlYihoZG1pLCByZW1hcF9zaXplLCBIRE1JX1ZQX1JFTUFQKTsKIAogCWlmIChvdXRwdXRfc2VsZWN0ID09IEhETUlfVlBfQ09ORl9PVVRQVVRfU0VMRUNUT1JfUFApIHsKLQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX0NPTkYpOwotCQl2YWwgJj0gfihIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX01BU0sgfAotCQkJSERNSV9WUF9DT05GX1BQX0VOX0VOTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX01BU0spOwotCQl2YWwgfD0gSERNSV9WUF9DT05GX0JZUEFTU19FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9FTkFCTEUgfAotCQkJSERNSV9WUF9DT05GX1lDQzQyMl9FTl9ESVNBQkxFOwotCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJCXZwX2NvbmYgPSBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfUFBfRU5fRU5BQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX1lDQzQyMl9FTl9ESVNBQkxFOwogCX0gZWxzZSBpZiAob3V0cHV0X3NlbGVjdCA9PSBIRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX1lDQzQyMikgewotCQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfQ09ORik7Ci0JCXZhbCAmPSB+KEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRU5NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fTUFTSyk7Ci0JCXZhbCB8PSBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX0RJU0FCTEUgfAotCQkJSERNSV9WUF9DT05GX1BQX0VOX0RJU0FCTEUgfAotCQkJSERNSV9WUF9DT05GX1lDQzQyMl9FTl9FTkFCTEU7Ci0JCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9DT05GKTsKKwkJdnBfY29uZiA9IEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fRElTQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9QUF9FTl9ESVNBQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX1lDQzQyMl9FTl9FTkFCTEU7CiAJfSBlbHNlIGlmIChvdXRwdXRfc2VsZWN0ID09IEhETUlfVlBfQ09ORl9PVVRQVVRfU0VMRUNUT1JfQllQQVNTKSB7Ci0JCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9DT05GKTsKLQkJdmFsICY9IH4oSERNSV9WUF9DT05GX0JZUEFTU19FTl9NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9FTk1BU0sgfAotCQkJSERNSV9WUF9DT05GX1lDQzQyMl9FTl9NQVNLKTsKLQkJdmFsIHw9IEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fRU5BQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRElTQUJMRTsKLQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCQl2cF9jb25mID0gSERNSV9WUF9DT05GX0JZUEFTU19FTl9FTkFCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfUFBfRU5fRElTQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRElTQUJMRTsKIAl9IGVsc2UgewogCQlyZXR1cm47CiAJfQogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX1NUVUZGKTsKLQl2YWwgJj0gfihIRE1JX1ZQX1NUVUZGX1BQX1NUVUZGSU5HX01BU0sgfAotCQlIRE1JX1ZQX1NUVUZGX1lDQzQyMl9TVFVGRklOR19NQVNLKTsKLQl2YWwgfD0gSERNSV9WUF9TVFVGRl9QUF9TVFVGRklOR19TVFVGRklOR19NT0RFIHwKLQkJSERNSV9WUF9TVFVGRl9ZQ0M0MjJfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERTsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfU1RVRkYpOworCWhkbWlfbW9kYihoZG1pLCB2cF9jb25mLAorCQkgIEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fTUFTSyB8IEhETUlfVlBfQ09ORl9QUF9FTl9FTk1BU0sgfAorCQkgIEhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fTUFTSywgSERNSV9WUF9DT05GKTsKIAotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9DT05GKTsKLQl2YWwgJj0gfkhETUlfVlBfQ09ORl9PVVRQVVRfU0VMRUNUT1JfTUFTSzsKLQl2YWwgfD0gb3V0cHV0X3NlbGVjdDsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJaGRtaV9tb2RiKGhkbWksIEhETUlfVlBfU1RVRkZfUFBfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSB8CisJCQlIRE1JX1ZQX1NUVUZGX1lDQzQyMl9TVFVGRklOR19TVFVGRklOR19NT0RFLAorCQkgIEhETUlfVlBfU1RVRkZfUFBfU1RVRkZJTkdfTUFTSyB8CisJCSAgSERNSV9WUF9TVFVGRl9ZQ0M0MjJfU1RVRkZJTkdfTUFTSywgSERNSV9WUF9TVFVGRik7CisKKwloZG1pX21vZGIoaGRtaSwgb3V0cHV0X3NlbGVjdCwgSERNSV9WUF9DT05GX09VVFBVVF9TRUxFQ1RPUl9NQVNLLAorCQkgIEhETUlfVlBfQ09ORik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3BoeV90ZXN0X2NsZWFyKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwKIAkJCQkJCXVuc2lnbmVkIGNoYXIgYml0KQogewotCXU4IHZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9QSFlfVFNUMCk7Ci0JdmFsICY9IH5IRE1JX1BIWV9UU1QwX1RTVENMUl9NQVNLOwotCXZhbCB8PSAoYml0IDw8IEhETUlfUEhZX1RTVDBfVFNUQ0xSX09GRlNFVCkgJgotCQlIRE1JX1BIWV9UU1QwX1RTVENMUl9NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9QSFlfVFNUMCk7CisJaGRtaV9tb2RiKGhkbWksIGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVENMUl9PRkZTRVQsCisJCSAgSERNSV9QSFlfVFNUMF9UU1RDTFJfTUFTSywgSERNSV9QSFlfVFNUMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3BoeV90ZXN0X2VuYWJsZShzdHJ1Y3QgaW14X2hkbWkgKmhkbWksCiAJCQkJCQl1bnNpZ25lZCBjaGFyIGJpdCkKIHsKLQl1OCB2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfUEhZX1RTVDApOwotCXZhbCAmPSB+SERNSV9QSFlfVFNUMF9UU1RFTl9NQVNLOwotCXZhbCB8PSAoYml0IDw8IEhETUlfUEhZX1RTVDBfVFNURU5fT0ZGU0VUKSAmCi0JCUhETUlfUEhZX1RTVDBfVFNURU5fTUFTSzsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfUEhZX1RTVDApOworCWhkbWlfbW9kYihoZG1pLCBiaXQgPDwgSERNSV9QSFlfVFNUMF9UU1RFTl9PRkZTRVQsCisJCSAgSERNSV9QSFlfVFNUMF9UU1RFTl9NQVNLLCBIRE1JX1BIWV9UU1QwKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhkbWlfcGh5X3Rlc3RfY2xvY2soc3RydWN0IGlteF9oZG1pICpoZG1pLAogCQkJCQkJdW5zaWduZWQgY2hhciBiaXQpCiB7Ci0JdTggdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9UU1QwKTsKLQl2YWwgJj0gfkhETUlfUEhZX1RTVDBfVFNUQ0xLX01BU0s7Ci0JdmFsIHw9IChiaXQgPDwgSERNSV9QSFlfVFNUMF9UU1RDTEtfT0ZGU0VUKSAmCi0JCUhETUlfUEhZX1RTVDBfVFNUQ0xLX01BU0s7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1BIWV9UU1QwKTsKKwloZG1pX21vZGIoaGRtaSwgYml0IDw8IEhETUlfUEhZX1RTVDBfVFNUQ0xLX09GRlNFVCwKKwkJICBIRE1JX1BIWV9UU1QwX1RTVENMS19NQVNLLCBIRE1JX1BIWV9UU1QwKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhkbWlfcGh5X3Rlc3RfZGluKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwKQEAgLTgwNiwxOSArNzMzLDk0IEBACiAJCQkgSERNSV9QSFlfQ09ORjBfU0VMRElQSUZfTUFTSyk7CiB9CiAKK2VudW0geworCVJFU184LAorCVJFU18xMCwKKwlSRVNfMTIsCisJUkVTX01BWCwKK307CisKK3N0cnVjdCBtcGxsX2NvbmZpZyB7CisJdW5zaWduZWQgbG9uZyBtcGl4ZWxjbG9jazsKKwlzdHJ1Y3QgeworCQl1MTYgY3BjZTsKKwkJdTE2IGdtcDsKKwl9IHJlc1tSRVNfTUFYXTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBsbF9jb25maWcgbXBsbF9jb25maWdbXSA9IHsKKwl7CisJCTQ1MjUwMDAwLCB7CisJCQl7IDB4MDFlMCwgMHgwMDAwIH0sCisJCQl7IDB4MjFlMSwgMHgwMDAwIH0sCisJCQl7IDB4NDFlMiwgMHgwMDAwIH0KKwkJfSwKKwl9LCB7CisJCTkyNTAwMDAwLCB7CisJCQl7IDB4MDE0MCwgMHgwMDA1IH0sCisJCQl7IDB4MjE0MSwgMHgwMDA1IH0sCisJCQl7IDB4NDE0MiwgMHgwMDA1IH0sCisJCX0sCisJfSwgeworCQkxNDg1MDAwMDAsIHsKKwkJCXsgMHgwMGEwLCAweDAwMGEgfSwKKwkJCXsgMHgyMGExLCAweDAwMGEgfSwKKwkJCXsgMHg0MGEyLCAweDAwMGEgfSwKKwkJfSwKKwl9LCB7CisJCX4wVUwsIHsKKwkJCXsgMHgwMGEwLCAweDAwMGEgfSwKKwkJCXsgMHgyMDAxLCAweDAwMGYgfSwKKwkJCXsgMHg0MDAyLCAweDAwMGYgfSwKKwkJfSwKKwl9Cit9OworCitzdHJ1Y3QgY3Vycl9jdHJsIHsKKwl1bnNpZ25lZCBsb25nIG1waXhlbGNsb2NrOworCXUxNiBjdXJyW1JFU19NQVhdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjdXJyX2N0cmwgY3Vycl9jdHJsW10gPSB7CisJLyoJcGl4ZWxjbGsgICAgIGJwcDggICAgYnBwMTAgICBicHAxMiAqLworCXsKKwkJIDU0MDAwMDAwLCB7IDB4MDkxYywgMHgwOTFjLCAweDA2ZGMgfSwKKwl9LCB7CisJCSA1ODQwMDAwMCwgeyAweDA5MWMsIDB4MDZkYywgMHgwNmRjIH0sCisJfSwgeworCQkgNzIwMDAwMDAsIHsgMHgwNmRjLCAweDA2ZGMsIDB4MDkxYyB9LAorCX0sIHsKKwkJIDc0MjUwMDAwLCB7IDB4MDZkYywgMHgwYjVjLCAweDA5MWMgfSwKKwl9LCB7CisJCTExODgwMDAwMCwgeyAweDA5MWMsIDB4MDkxYywgMHgwNmRjIH0sCisJfSwgeworCQkyMTYwMDAwMDAsIHsgMHgwNmRjLCAweDBiNWMsIDB4MDkxYyB9LAorCX0KK307CisKIHN0YXRpYyBpbnQgaGRtaV9waHlfY29uZmlndXJlKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwgdW5zaWduZWQgY2hhciBwcmVwLAogCQkJICAgICAgdW5zaWduZWQgY2hhciByZXMsIGludCBjc2NvbikKIHsKKwl1bnNpZ25lZCByZXNfaWR4LCBpOwogCXU4IHZhbCwgbXNlYzsKIAotCS8qIGNvbG9yIHJlc29sdXRpb24gMCBpcyA4IGJpdCBjb2xvdXIgZGVwdGggKi8KLQlpZiAoIXJlcykKLQkJcmVzID0gODsKLQogCWlmIChwcmVwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlIGlmIChyZXMgIT0gOCAmJiByZXMgIT0gMTIpCisKKwlzd2l0Y2ggKHJlcykgeworCWNhc2UgMDoJLyogY29sb3IgcmVzb2x1dGlvbiAwIGlzIDggYml0IGNvbG91ciBkZXB0aCAqLworCWNhc2UgODoKKwkJcmVzX2lkeCA9IFJFU184OworCQlicmVhazsKKwljYXNlIDEwOgorCQlyZXNfaWR4ID0gUkVTXzEwOworCQlicmVhazsKKwljYXNlIDEyOgorCQlyZXNfaWR4ID0gUkVTXzEyOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBFbmFibGUgY3NjIHBhdGggKi8KIAlpZiAoY3Njb24pCkBAIC04NDUsMTY1ICs4NDcsMzAgQEAKIAkJCUhETUlfUEhZX0kyQ01fU0xBVkVfQUREUik7CiAJaGRtaV9waHlfdGVzdF9jbGVhcihoZG1pLCAwKTsKIAotCWlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSA0NTI1MDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQkvKiBQTEwvTVBMTCBDZmcgKi8KLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAxZTAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwMCwgMHgxNSk7ICAvKiBHTVBDVFJMICovCisJLyogUExML01QTEwgQ2ZnIC0gYWx3YXlzIG1hdGNoIG9uIGZpbmFsIGVudHJ5ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXBsbF9jb25maWcpIC0gMTsgaSsrKQorCQlpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0KKwkJICAgIG1wbGxfY29uZmlnW2ldLm1waXhlbGNsb2NrKQogCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgyMWUxLCAweDA2KTsKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDAsIDB4MTUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHg0MWUyLCAweDA2KTsKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDAsIDB4MTUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gOTI1MDAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDE0MCwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDA1LCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MjE0MSwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDA1LCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4NDE0MiwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDA1LCAweDE1KTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSAxNDg1MDAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDBhMCwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDBhLCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MjBhMSwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDBhLCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4NDBhMiwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDBhLCAweDE1KTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDBhMCwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDBhLCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MjAwMSwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDBmLCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4NDAwMiwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDBmLCAweDE1KTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQogCi0JaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDU0MDAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOyAgLyogQ1VSUkNUUkwgKi8KKwloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgbXBsbF9jb25maWdbaV0ucmVzW3Jlc19pZHhdLmNwY2UsIDB4MDYpOworCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCBtcGxsX2NvbmZpZ1tpXS5yZXNbcmVzX2lkeF0uZ21wLCAweDE1KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN1cnJfY3RybCk7IGkrKykKKwkJaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9CisJCSAgICBjdXJyX2N0cmxbaV0ubXBpeGVsY2xvY2spCiAJCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDU4NDAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSA3MjAwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gNzQyNTAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDBiNWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDExODgwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDkxYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gMjE2MDAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwYjVjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDkxYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKKworCWlmIChpID49IEFSUkFZX1NJWkUoY3Vycl9jdHJsKSkgewogCQlkZXZfZXJyKGhkbWktPmRldiwKIAkJCQkiUGl4ZWwgY2xvY2sgJWQgLSB1bnN1cHBvcnRlZCBieSBIRE1JXG4iLAogCQkJCWhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogQ1VSUkNUUkwgKi8KKwloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgY3Vycl9jdHJsW2ldLmN1cnJbcmVzX2lkeF0sIDB4MTApOworCiAJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwMCwgMHgxMyk7ICAvKiBQTExQSEJZQ1RSTCAqLwogCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDYsIDB4MTcpOwogCS8qIFJFU0lTVEFOQ0UgVEVSTSAxMzNPaG0gQ2ZnICovCkBAIC0xMDcyLDcgKzkzOSw3IEBACiAKIHN0YXRpYyB2b2lkIGhkbWlfdHhfaGRjcF9jb25maWcoc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXU4IGRlLCB2YWw7CisJdTggZGU7CiAKIAlpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubWRhdGFlbmFibGVwb2xhcml0eSkKIAkJZGUgPSBIRE1JX0FfVklEUE9MQ0ZHX0RBVEFFTlBPTF9BQ1RJVkVfSElHSDsKQEAgLTEwODAsMjAgKzk0NywxMyBAQAogCQlkZSA9IEhETUlfQV9WSURQT0xDRkdfREFUQUVOUE9MX0FDVElWRV9MT1c7CiAKIAkvKiBkaXNhYmxlIHJ4IGRldGVjdCAqLwotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9BX0hEQ1BDRkcwKTsKLQl2YWwgJj0gSERNSV9BX0hEQ1BDRkcwX1JYREVURUNUX01BU0s7Ci0JdmFsIHw9IEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9ESVNBQkxFOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9BX0hEQ1BDRkcwKTsKKwloZG1pX21vZGIoaGRtaSwgSERNSV9BX0hEQ1BDRkcwX1JYREVURUNUX0RJU0FCTEUsCisJCSAgSERNSV9BX0hEQ1BDRkcwX1JYREVURUNUX01BU0ssIEhETUlfQV9IRENQQ0ZHMCk7CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfQV9WSURQT0xDRkcpOwotCXZhbCAmPSBIRE1JX0FfVklEUE9MQ0ZHX0RBVEFFTlBPTF9NQVNLOwotCXZhbCB8PSBkZTsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfQV9WSURQT0xDRkcpOworCWhkbWlfbW9kYihoZG1pLCBkZSwgSERNSV9BX1ZJRFBPTENGR19EQVRBRU5QT0xfTUFTSywgSERNSV9BX1ZJRFBPTENGRyk7CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfQV9IRENQQ0ZHMSk7Ci0JdmFsICY9IEhETUlfQV9IRENQQ0ZHMV9FTkNSWVBUSU9ORElTQUJMRV9NQVNLOwotCXZhbCB8PSBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfRElTQUJMRTsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfQV9IRENQQ0ZHMSk7CisJaGRtaV9tb2RiKGhkbWksIEhETUlfQV9IRENQQ0ZHMV9FTkNSWVBUSU9ORElTQUJMRV9ESVNBQkxFLAorCQkgIEhETUlfQV9IRENQQ0ZHMV9FTkNSWVBUSU9ORElTQUJMRV9NQVNLLCBIRE1JX0FfSERDUENGRzEpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX2NvbmZpZ19BVkkoc3RydWN0IGlteF9oZG1pICpoZG1pKQpAQCAtMTMxNywxMSArMTE3Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGhkbWlfZW5hYmxlX2F1ZGlvX2NsayhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7Ci0JdTggY2xrZGlzOwotCi0JY2xrZGlzID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX01DX0NMS0RJUyk7Ci0JY2xrZGlzICY9IH5IRE1JX01DX0NMS0RJU19BVURDTEtfRElTQUJMRTsKLQloZG1pX3dyaXRlYihoZG1pLCBjbGtkaXMsIEhETUlfTUNfQ0xLRElTKTsKKwloZG1pX21vZGIoaGRtaSwgMCwgSERNSV9NQ19DTEtESVNfQVVEQ0xLX0RJU0FCTEUsIEhETUlfTUNfQ0xLRElTKTsKIH0KIAogLyogV29ya2Fyb3VuZCB0byBjbGVhciB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uICovCkBAIC0xNDU2LDkgKzEzMTIsNiBAQAogCS8qIENsZWFyIEhvdHBsdWcgaW50ZXJydXB0cyAqLwogCWhkbWlfd3JpdGViKGhkbWksIEhETUlfSUhfUEhZX1NUQVQwX0hQRCwgSERNSV9JSF9QSFlfU1RBVDApOwogCi0JLyogVW5tdXRlIGludGVycnVwdHMgKi8KLQloZG1pX3dyaXRlYihoZG1pLCB+SERNSV9JSF9QSFlfU1RBVDBfSFBELCBIRE1JX0lIX01VVEVfUEhZX1NUQVQwKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNTI3LDEyICsxMzgwLDkgQEAKIHN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGlteF9oZG1pX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IKIAkJCQkJCQkqY29ubmVjdG9yLCBib29sIGZvcmNlKQogewotCS8qIEZJWE1FICovCi0JcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotfQotCi1zdGF0aWMgdm9pZCBpbXhfaGRtaV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoteworCXN0cnVjdCBpbXhfaGRtaSAqaGRtaSA9IGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVjdCBpbXhfaGRtaSwKKwkJCQkJICAgICBjb25uZWN0b3IpOworCXJldHVybiBoZG1pLT5jb25uZWN0b3Jfc3RhdHVzOwogfQogCiBzdGF0aWMgaW50IGlteF9oZG1pX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKQEAgLTE1NjAsMTMgKzE0MTAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlteF9oZG1pX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCi0JcmV0dXJuIE1PREVfT0s7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXIgKmlteF9oZG1pX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IKIAkJCQkJCQkgICAqY29ubmVjdG9yKQogewpAQCAtMTYxNCwyOCArMTQ1NywyMSBAQAogCXN0cnVjdCBpbXhfaGRtaSAqaGRtaSA9IGNvbnRhaW5lcl9vZihlbmNvZGVyLCBzdHJ1Y3QgaW14X2hkbWksIGVuY29kZXIpOwogCiAJaW14X2hkbWlfcG93ZXJvZmYoaGRtaSk7Ci0JaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChlbmNvZGVyLT5jcnRjLCBEUk1fTU9ERV9FTkNPREVSX05PTkUsCi0JCQkJICBWNEwyX1BJWF9GTVRfUkdCMjQpOworCWlteF9kcm1fcGFuZWxfZm9ybWF0KGVuY29kZXIsIFY0TDJfUElYX0ZNVF9SR0IyNCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9oZG1pX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBjb250YWluZXJfb2YoZW5jb2Rlciwgc3RydWN0IGlteF9oZG1pLCBlbmNvZGVyKTsKLQlpbnQgbXV4ID0gaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoaGRtaS0+aW14X2RybV9lbmNvZGVyLAotCQkJCQkgICAgIGVuY29kZXItPmNydGMpOworCWludCBtdXggPSBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChoZG1pLT5kZXYtPm9mX25vZGUsIGVuY29kZXIpOwogCiAJaW14X2hkbWlfc2V0X2lwdV9kaV9tdXgoaGRtaSwgbXV4KTsKIAogCWlteF9oZG1pX3Bvd2Vyb24oaGRtaSk7CiB9CiAKLXN0YXRpYyB2b2lkIGlteF9oZG1pX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGlteF9oZG1pX2VuY29kZXJfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSBpbXhfaGRtaV9lbmNvZGVyX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBpbXhfZHJtX2VuY29kZXJfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGlteF9oZG1pX2VuY29kZXJfaGVscGVyX2Z1bmNzID0gewpAQCAtMTY1MSwyMSArMTQ4NywzMiBAQAogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X2hkbWlfY29ubmVjdG9yX2RldGVjdCwKLQkuZGVzdHJveSA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9jb25uZWN0b3JfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaW14X2hkbWlfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gaW14X2hkbWlfY29ubmVjdG9yX2dldF9tb2RlcywKLQkubW9kZV92YWxpZCA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIAkuYmVzdF9lbmNvZGVyID0gaW14X2hkbWlfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKIH07CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbXhfaGRtaV9oYXJkaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBkZXZfaWQ7CisJdTggaW50cl9zdGF0OworCisJaW50cl9zdGF0ID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0lIX1BIWV9TVEFUMCk7CisJaWYgKGludHJfc3RhdCkKKwkJaGRtaV93cml0ZWIoaGRtaSwgfjAsIEhETUlfSUhfTVVURV9QSFlfU1RBVDApOworCisJcmV0dXJuIGludHJfc3RhdCA/IElSUV9XQUtFX1RIUkVBRCA6IElSUV9OT05FOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgaW14X2hkbWlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBkZXZfaWQ7CiAJdTggaW50cl9zdGF0OwogCXU4IHBoeV9pbnRfcG9sOwotCXU4IHZhbDsKIAogCWludHJfc3RhdCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9JSF9QSFlfU1RBVDApOwogCkBAIC0xNjc1LDU1ICsxNTIyLDQ3IEBACiAJCWlmIChwaHlfaW50X3BvbCAmIEhETUlfUEhZX0hQRCkgewogCQkJZGV2X2RiZyhoZG1pLT5kZXYsICJFVkVOVD1wbHVnaW5cbiIpOwogCi0JCQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfUEhZX1BPTDApOwotCQkJdmFsICY9IH5IRE1JX1BIWV9IUEQ7Ci0JCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfUEhZX1BPTDApOworCQkJaGRtaV9tb2RiKGhkbWksIDAsIEhETUlfUEhZX0hQRCwgSERNSV9QSFlfUE9MMCk7CiAKKwkJCWhkbWktPmNvbm5lY3Rvcl9zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJCWlteF9oZG1pX3Bvd2Vyb24oaGRtaSk7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKGhkbWktPmRldiwgIkVWRU5UPXBsdWdvdXRcbiIpOwogCi0JCQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfUEhZX1BPTDApOwotCQkJdmFsIHw9IEhETUlfUEhZX0hQRDsKLQkJCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9QSFlfUE9MMCk7CisJCQloZG1pX21vZGIoaGRtaSwgSERNSV9QSFlfSFBELCBIRE1JX1BIWV9IUEQsCisJCQkJSERNSV9QSFlfUE9MMCk7CiAKKwkJCWhkbWktPmNvbm5lY3Rvcl9zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAkJCWlteF9oZG1pX3Bvd2Vyb2ZmKGhkbWkpOwogCQl9CisJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChoZG1pLT5jb25uZWN0b3IuZGV2KTsKIAl9CiAKIAloZG1pX3dyaXRlYihoZG1pLCBpbnRyX3N0YXQsIEhETUlfSUhfUEhZX1NUQVQwKTsKKwloZG1pX3dyaXRlYihoZG1pLCB+SERNSV9JSF9QSFlfU1RBVDBfSFBELCBIRE1JX0lIX01VVEVfUEhZX1NUQVQwKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBpbXhfaGRtaV9yZWdpc3RlcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCitzdGF0aWMgaW50IGlteF9oZG1pX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKIAlpbnQgcmV0OwogCi0JaGRtaS0+Y29ubmVjdG9yLmZ1bmNzID0gJmlteF9oZG1pX2Nvbm5lY3Rvcl9mdW5jczsKLQloZG1pLT5lbmNvZGVyLmZ1bmNzID0gJmlteF9oZG1pX2VuY29kZXJfZnVuY3M7CisJcmV0ID0gaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKGRybSwgJmhkbWktPmVuY29kZXIsCisJCQkJICAgICAgIGhkbWktPmRldi0+b2Zfbm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCWhkbWktPmVuY29kZXIuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9UTURTOwotCWhkbWktPmNvbm5lY3Rvci5jb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQTsKKwloZG1pLT5jb25uZWN0b3IucG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKIAogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJmhkbWktPmVuY29kZXIsICZpbXhfaGRtaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7Ci0JcmV0ID0gaW14X2RybV9hZGRfZW5jb2RlcigmaGRtaS0+ZW5jb2RlciwgJmhkbWktPmlteF9kcm1fZW5jb2RlciwKLQkJCVRISVNfTU9EVUxFKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoaGRtaS0+ZGV2LCAiYWRkaW5nIGVuY29kZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJZHJtX2VuY29kZXJfaW5pdChkcm0sICZoZG1pLT5lbmNvZGVyLCAmaW14X2hkbWlfZW5jb2Rlcl9mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOwogCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZoZG1pLT5jb25uZWN0b3IsCiAJCQkmaW14X2hkbWlfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7Ci0KLQlyZXQgPSBpbXhfZHJtX2FkZF9jb25uZWN0b3IoJmhkbWktPmNvbm5lY3RvciwKLQkJCSZoZG1pLT5pbXhfZHJtX2Nvbm5lY3RvciwgVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJaW14X2RybV9yZW1vdmVfZW5jb2RlcihoZG1pLT5pbXhfZHJtX2VuY29kZXIpOwotCQlkZXZfZXJyKGhkbWktPmRldiwgImFkZGluZyBjb25uZWN0b3IgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRybSwgJmhkbWktPmNvbm5lY3RvciwgJmlteF9oZG1pX2Nvbm5lY3Rvcl9mdW5jcywKKwkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSk7CiAKIAloZG1pLT5jb25uZWN0b3IuZW5jb2RlciA9ICZoZG1pLT5lbmNvZGVyOwogCkBAIC0xNzUwLDI4ICsxNTg5LDMzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW14X2hkbWlfZHRfaWRzKTsKIAotc3RhdGljIGludCBpbXhfaGRtaV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBpbXhfaGRtaV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9Ci0JCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF9oZG1pX2R0X2lkcywgJnBkZXYtPmRldik7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCQkJCW9mX21hdGNoX2RldmljZShpbXhfaGRtaV9kdF9pZHMsIGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRkY19ub2RlOwogCXN0cnVjdCBpbXhfaGRtaSAqaGRtaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzOwogCWludCByZXQsIGlycTsKIAotCWhkbWkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpoZG1pKSwgR0ZQX0tFUk5FTCk7CisJaGRtaSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaGRtaSksIEdGUF9LRVJORUwpOwogCWlmICghaGRtaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQloZG1pLT5kZXYgPSAmcGRldi0+ZGV2OworCWhkbWktPmRldiA9IGRldjsKKwloZG1pLT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJaGRtaS0+c2FtcGxlX3JhdGUgPSA0ODAwMDsKKwloZG1pLT5yYXRpbyA9IDEwMDsKIAogCWlmIChvZl9pZCkgewogCQljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpkZXZpY2VfaWQgPSBvZl9pZC0+ZGF0YTsKIAkJaGRtaS0+ZGV2X3R5cGUgPSBkZXZpY2VfaWQtPmRyaXZlcl9kYXRhOwogCX0KIAotCWRkY19ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgImRkYyIsIDApOworCWRkY19ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgImRkYy1pMmMtYnVzIiwgMCk7CiAJaWYgKGRkY19ub2RlKSB7CiAJCWhkbWktPmRkYyA9IG9mX2ZpbmRfaTJjX2FkYXB0ZXJfYnlfbm9kZShkZGNfbm9kZSk7CiAJCWlmICghaGRtaS0+ZGRjKQpAQCAtMTc4NiwxMyArMTYzMCwxNCBAQAogCWlmIChpcnEgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBpbXhfaGRtaV9pcnEsIDAsCi0JCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIGhkbWkpOworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBpcnEsIGlteF9oZG1pX2hhcmRpcnEsCisJCQkJCWlteF9oZG1pX2lycSwgSVJRRl9TSEFSRUQsCisJCQkJCWRldl9uYW1lKGRldiksIGhkbWkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaGRtaS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBpb3Jlcyk7CisJaGRtaS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIGlvcmVzKTsKIAlpZiAoSVNfRVJSKGhkbWktPnJlZ3MpKQogCQlyZXR1cm4gUFRSX0VSUihoZG1pLT5yZWdzKTsKIApAQCAtMTgzMSw3ICsxNjc2LDcgQEAKIAl9CiAKIAkvKiBQcm9kdWN0IGFuZCByZXZpc2lvbiBJRHMgKi8KLQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCWRldl9pbmZvKGRldiwKIAkJIkRldGVjdGVkIEhETUkgY29udHJvbGxlciAweCV4OjB4JXg6MHgleDoweCV4XG4iLAogCQloZG1pX3JlYWRiKGhkbWksIEhETUlfREVTSUdOX0lEKSwKIAkJaGRtaV9yZWFkYihoZG1pLCBIRE1JX1JFVklTSU9OX0lEKSwKQEAgLTE4NTksMTMgKzE3MDQsMTQgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9pYWhiOwogCi0JcmV0ID0gaW14X2hkbWlfcmVnaXN0ZXIoaGRtaSk7CisJcmV0ID0gaW14X2hkbWlfcmVnaXN0ZXIoZHJtLCBoZG1pKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9pYWhiOwogCi0JaW14X2RybV9lbmNvZGVyX2FkZF9wb3NzaWJsZV9jcnRjcyhoZG1pLT5pbXhfZHJtX2VuY29kZXIsIG5wKTsKKwkvKiBVbm11dGUgaW50ZXJydXB0cyAqLworCWhkbWlfd3JpdGViKGhkbWksIH5IRE1JX0lIX1BIWV9TVEFUMF9IUEQsIEhETUlfSUhfTVVURV9QSFlfU1RBVDApOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaGRtaSk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaGRtaSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTg3NywyMCArMTcyMywzNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2hkbWlfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBpbXhfaGRtaV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmhkbWktPmNvbm5lY3RvcjsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaGRtaS0+ZW5jb2RlcjsKKwlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWRybV9tb2RlX2Nvbm5lY3Rvcl9kZXRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwotCWlteF9kcm1fcmVtb3ZlX2Nvbm5lY3RvcihoZG1pLT5pbXhfZHJtX2Nvbm5lY3Rvcik7Ci0JaW14X2RybV9yZW1vdmVfZW5jb2RlcihoZG1pLT5pbXhfZHJtX2VuY29kZXIpOworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwloZG1pX3dyaXRlYihoZG1pLCB+MCwgSERNSV9JSF9NVVRFX1BIWV9TVEFUMCk7CisKKwloZG1pLT5jb25uZWN0b3IuZnVuY3MtPmRlc3Ryb3koJmhkbWktPmNvbm5lY3Rvcik7CisJaGRtaS0+ZW5jb2Rlci5mdW5jcy0+ZGVzdHJveSgmaGRtaS0+ZW5jb2Rlcik7CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoaGRtaS0+aWFoYl9jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZG1pLT5pc2ZyX2Nsayk7CiAJaTJjX3B1dF9hZGFwdGVyKGhkbWktPmRkYyk7Cit9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBoZG1pX29wcyA9IHsKKwkuYmluZAk9IGlteF9oZG1pX2JpbmQsCisJLnVuYmluZAk9IGlteF9oZG1pX3VuYmluZCwKK307CisKK3N0YXRpYyBpbnQgaW14X2hkbWlfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmaGRtaV9vcHMpOworfQorCitzdGF0aWMgaW50IGlteF9oZG1pX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmhkbWlfb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWxkYi5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWxkYi5jCmluZGV4IDdlNTkzMjkuLmZlNGMxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtbGRiLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CkBAIC01OCw5ICs1OSw4IEBACiBzdHJ1Y3QgaW14X2xkYl9jaGFubmVsIHsKIAlzdHJ1Y3QgaW14X2xkYiAqbGRiOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwogCWludCBjaG5vOwogCXZvaWQgKmVkaWQ7CiAJaW50IGVkaWRfbGVuOwpAQCAtOTEsMTEgKzkxLDYgQEAKIAlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiB9CiAKLXN0YXRpYyB2b2lkIGlteF9sZGJfY29ubmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQkvKiBkbyBub3QgZnJlZSBoZXJlICovCi19Ci0KIHN0YXRpYyBpbnQgaW14X2xkYl9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGlteF9sZGJfY2hhbm5lbCAqaW14X2xkYl9jaCA9IGNvbl90b19pbXhfbGRiX2NoKGNvbm5lY3Rvcik7CkBAIC0xMTEsNiArMTA2LDggQEAKIAkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CiAKIAkJbW9kZSA9IGRybV9tb2RlX2NyZWF0ZShjb25uZWN0b3ItPmRldik7CisJCWlmICghbW9kZSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlkcm1fbW9kZV9jb3B5KG1vZGUsICZpbXhfbGRiX2NoLT5tb2RlKTsKIAkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwogCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CkBAIC0xMjAsMTIgKzExNyw2IEBACiAJcmV0dXJuIG51bV9tb2RlczsKIH0KIAotc3RhdGljIGludCBpbXhfbGRiX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICppbXhfbGRiX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoCiAJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CkBAIC0xNjgsNyArMTU5LDkgQEAKIAkvKiBzZXQgZGlzcGxheSBjbG9jayBtdXggdG8gTERCIGlucHV0IGNsb2NrICovCiAJcmV0ID0gY2xrX3NldF9wYXJlbnQobGRiLT5jbGtfc2VsW211eF0sIGxkYi0+Y2xrW2Nobm9dKTsKIAlpZiAocmV0KQotCQlkZXZfZXJyKGxkYi0+ZGV2LCAidW5hYmxlIHRvIHNldCBkaSVkIHBhcmVudCBjbG9jayB0byBsZGJfZGklZFxuIiwgbXV4LCBjaG5vKTsKKwkJZGV2X2VycihsZGItPmRldiwKKwkJCSJ1bmFibGUgdG8gc2V0IGRpJWQgcGFyZW50IGNsb2NrIHRvIGxkYl9kaSVkXG4iLCBtdXgsCisJCQljaG5vKTsKIH0KIAogc3RhdGljIHZvaWQgaW14X2xkYl9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQpAQCAtMTc5LDggKzE3Miw3IEBACiAJdTMyIHBpeGVsX2ZtdDsKIAl1bnNpZ25lZCBsb25nIHNlcmlhbF9jbGs7CiAJdW5zaWduZWQgbG9uZyBkaV9jbGsgPSBtb2RlLT5jbG9jayAqIDEwMDA7Ci0JaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGlteF9sZGJfY2gtPmlteF9kcm1fZW5jb2RlciwKLQkJCQkJICAgICBlbmNvZGVyLT5jcnRjKTsKKwlpbnQgbXV4ID0gaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoaW14X2xkYl9jaC0+Y2hpbGQsIGVuY29kZXIpOwogCiAJaWYgKGxkYi0+bGRiX2N0cmwgJiBMREJfU1BMSVRfTU9ERV9FTikgewogCQkvKiBkdWFsIGNoYW5uZWwgTFZEUyBtb2RlICovCkBAIC0xODksNyArMTgxLDggQEAKIAkJaW14X2xkYl9zZXRfY2xvY2sobGRiLCBtdXgsIDEsIHNlcmlhbF9jbGssIGRpX2Nsayk7CiAJfSBlbHNlIHsKIAkJc2VyaWFsX2NsayA9IDcwMDBVTCAqIG1vZGUtPmNsb2NrOwotCQlpbXhfbGRiX3NldF9jbG9jayhsZGIsIG11eCwgaW14X2xkYl9jaC0+Y2hubywgc2VyaWFsX2NsaywgZGlfY2xrKTsKKwkJaW14X2xkYl9zZXRfY2xvY2sobGRiLCBtdXgsIGlteF9sZGJfY2gtPmNobm8sIHNlcmlhbF9jbGssCisJCQkJZGlfY2xrKTsKIAl9CiAKIAlzd2l0Y2ggKGlteF9sZGJfY2gtPmNobm8pIHsKQEAgLTIwNyw4ICsyMDAsNyBAQAogCQlwaXhlbF9mbXQgPSBWNEwyX1BJWF9GTVRfUkdCMjQ7CiAJfQogCi0JaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChlbmNvZGVyLT5jcnRjLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMsCi0JCQlwaXhlbF9mbXQpOworCWlteF9kcm1fcGFuZWxfZm9ybWF0KGVuY29kZXIsIHBpeGVsX2ZtdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9sZGJfZW5jb2Rlcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQpAQCAtMjE2LDggKzIwOCw3IEBACiAJc3RydWN0IGlteF9sZGJfY2hhbm5lbCAqaW14X2xkYl9jaCA9IGVuY190b19pbXhfbGRiX2NoKGVuY29kZXIpOwogCXN0cnVjdCBpbXhfbGRiICpsZGIgPSBpbXhfbGRiX2NoLT5sZGI7CiAJaW50IGR1YWwgPSBsZGItPmxkYl9jdHJsICYgTERCX1NQTElUX01PREVfRU47Ci0JaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGlteF9sZGJfY2gtPmlteF9kcm1fZW5jb2RlciwKLQkJCQkJICAgICBlbmNvZGVyLT5jcnRjKTsKKwlpbnQgbXV4ID0gaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoaW14X2xkYl9jaC0+Y2hpbGQsIGVuY29kZXIpOwogCiAJaWYgKGR1YWwpIHsKIAkJY2xrX3ByZXBhcmVfZW5hYmxlKGxkYi0+Y2xrWzBdKTsKQEAgLTMxNiwyNiArMzA3LDIxIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpbXhfbGRiX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgaW14X2xkYl9jb25uZWN0b3JfZnVuY3MgPSB7CiAJLmRwbXMgPSBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAogCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAogCS5kZXRlY3QgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmRlc3Ryb3kgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9jb25uZWN0b3JfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaW14X2xkYl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewogCS5nZXRfbW9kZXMgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9sZGJfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKLQkubW9kZV92YWxpZCA9IGlteF9sZGJfY29ubmVjdG9yX21vZGVfdmFsaWQsCisJLm1vZGVfdmFsaWQgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbXhfbGRiX2VuY29kZXJfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSBpbXhfbGRiX2VuY29kZXJfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fZW5jb2Rlcl9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW14X2xkYl9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTM1MSw1NiArMzM3LDQ3IEBACiB7CiAJY2hhciBjbGtuYW1lWzE2XTsKIAotCXNwcmludGYoY2xrbmFtZSwgImRpJWQiLCBjaG5vKTsKKwlzbnByaW50ZihjbGtuYW1lLCBzaXplb2YoY2xrbmFtZSksICJkaSVkIiwgY2hubyk7CiAJbGRiLT5jbGtbY2hub10gPSBkZXZtX2Nsa19nZXQobGRiLT5kZXYsIGNsa25hbWUpOwogCWlmIChJU19FUlIobGRiLT5jbGtbY2hub10pKQogCQlyZXR1cm4gUFRSX0VSUihsZGItPmNsa1tjaG5vXSk7CiAKLQlzcHJpbnRmKGNsa25hbWUsICJkaSVkX3BsbCIsIGNobm8pOworCXNucHJpbnRmKGNsa25hbWUsIHNpemVvZihjbGtuYW1lKSwgImRpJWRfcGxsIiwgY2hubyk7CiAJbGRiLT5jbGtfcGxsW2Nobm9dID0gZGV2bV9jbGtfZ2V0KGxkYi0+ZGV2LCBjbGtuYW1lKTsKIAogCXJldHVybiBQVFJfRVJSX09SX1pFUk8obGRiLT5jbGtfcGxsW2Nobm9dKTsKIH0KIAotc3RhdGljIGludCBpbXhfbGRiX3JlZ2lzdGVyKHN0cnVjdCBpbXhfbGRiX2NoYW5uZWwgKmlteF9sZGJfY2gpCitzdGF0aWMgaW50IGlteF9sZGJfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKKwlzdHJ1Y3QgaW14X2xkYl9jaGFubmVsICppbXhfbGRiX2NoKQogewotCWludCByZXQ7CiAJc3RydWN0IGlteF9sZGIgKmxkYiA9IGlteF9sZGJfY2gtPmxkYjsKKwlpbnQgcmV0OworCisJcmV0ID0gaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKGRybSwgJmlteF9sZGJfY2gtPmVuY29kZXIsCisJCQkJICAgICAgIGlteF9sZGJfY2gtPmNoaWxkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gaW14X2xkYl9nZXRfY2xrKGxkYiwgaW14X2xkYl9jaC0+Y2hubyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwogCWlmIChsZGItPmxkYl9jdHJsICYgTERCX1NQTElUX01PREVfRU4pIHsKLQkJcmV0IHw9IGlteF9sZGJfZ2V0X2NsayhsZGIsIDEpOworCQlyZXQgPSBpbXhfbGRiX2dldF9jbGsobGRiLCAxKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaW14X2xkYl9jaC0+Y29ubmVjdG9yLmZ1bmNzID0gJmlteF9sZGJfY29ubmVjdG9yX2Z1bmNzOwotCWlteF9sZGJfY2gtPmVuY29kZXIuZnVuY3MgPSAmaW14X2xkYl9lbmNvZGVyX2Z1bmNzOwotCi0JaW14X2xkYl9jaC0+ZW5jb2Rlci5lbmNvZGVyX3R5cGUgPSBEUk1fTU9ERV9FTkNPREVSX0xWRFM7Ci0JaW14X2xkYl9jaC0+Y29ubmVjdG9yLmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFM7Ci0KIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZpbXhfbGRiX2NoLT5lbmNvZGVyLAogCQkJJmlteF9sZGJfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOwotCXJldCA9IGlteF9kcm1fYWRkX2VuY29kZXIoJmlteF9sZGJfY2gtPmVuY29kZXIsCi0JCQkmaW14X2xkYl9jaC0+aW14X2RybV9lbmNvZGVyLCBUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGxkYi0+ZGV2LCAiYWRkaW5nIGVuY29kZXIgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9lbmNvZGVyX2luaXQoZHJtLCAmaW14X2xkYl9jaC0+ZW5jb2RlciwgJmlteF9sZGJfZW5jb2Rlcl9mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOwogCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZpbXhfbGRiX2NoLT5jb25uZWN0b3IsCiAJCQkmaW14X2xkYl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKLQotCXJldCA9IGlteF9kcm1fYWRkX2Nvbm5lY3RvcigmaW14X2xkYl9jaC0+Y29ubmVjdG9yLAotCQkJJmlteF9sZGJfY2gtPmlteF9kcm1fY29ubmVjdG9yLCBUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKGlteF9sZGJfY2gtPmlteF9kcm1fZW5jb2Rlcik7Ci0JCWRldl9lcnIobGRiLT5kZXYsICJhZGRpbmcgY29ubmVjdG9yIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlkcm1fY29ubmVjdG9yX2luaXQoZHJtLCAmaW14X2xkYl9jaC0+Y29ubmVjdG9yLAorCQkJICAgJmlteF9sZGJfY29ubmVjdG9yX2Z1bmNzLCBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyk7CiAKIAlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmlteF9sZGJfY2gtPmNvbm5lY3RvciwKIAkJCSZpbXhfbGRiX2NoLT5lbmNvZGVyKTsKQEAgLTQ1OSwxMSArNDM2LDEyIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW14X2xkYl9kdF9pZHMpOwogCi1zdGF0aWMgaW50IGlteF9sZGJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X2xkYl9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KLQkJCW9mX21hdGNoX2RldmljZShpbXhfbGRiX2R0X2lkcywgJnBkZXYtPmRldik7CisJCQlvZl9tYXRjaF9kZXZpY2UoaW14X2xkYl9kdF9pZHMsIGRldik7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKIAljb25zdCB1OCAqZWRpZHA7CiAJc3RydWN0IGlteF9sZGIgKmlteF9sZGI7CkBAIC00NzMsMTcgKzQ1MSwxNyBAQAogCWludCByZXQ7CiAJaW50IGk7CiAKLQlpbXhfbGRiID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaW14X2xkYiksIEdGUF9LRVJORUwpOworCWlteF9sZGIgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlteF9sZGIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlteF9sZGIpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaW14X2xkYi0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShucCwgImdwciIpOwogCWlmIChJU19FUlIoaW14X2xkYi0+cmVnbWFwKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBhcmVudCByZWdtYXBcbiIpOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcGFyZW50IHJlZ21hcFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGlteF9sZGItPnJlZ21hcCk7CiAJfQogCi0JaW14X2xkYi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlpbXhfbGRiLT5kZXYgPSBkZXY7CiAKIAlpZiAob2ZfaWQpCiAJCWlteF9sZGItPmx2ZHNfbXV4ID0gb2ZfaWQtPmRhdGE7CkBAIC01MjEsNyArNDk5LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmIChkdWFsICYmIGkgPiAwKSB7Ci0JCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZHVhbC1jaGFubmVsIG1vZGUsIGlnbm9yaW5nIHNlY29uZCBvdXRwdXRcbiIpOworCQkJZGV2X3dhcm4oZGV2LCAiZHVhbC1jaGFubmVsIG1vZGUsIGlnbm9yaW5nIHNlY29uZCBvdXRwdXRcbiIpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNTMxLDYgKzUwOSw3IEBACiAJCWNoYW5uZWwgPSAmaW14X2xkYi0+Y2hhbm5lbFtpXTsKIAkJY2hhbm5lbC0+bGRiID0gaW14X2xkYjsKIAkJY2hhbm5lbC0+Y2hubyA9IGk7CisJCWNoYW5uZWwtPmNoaWxkID0gY2hpbGQ7CiAKIAkJZWRpZHAgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJlZGlkIiwgJmNoYW5uZWwtPmVkaWRfbGVuKTsKIAkJaWYgKGVkaWRwKSB7CkBAIC01NTMsNTQgKzUzMiw2NyBAQAogCQljYXNlIExWRFNfQklUX01BUF9TUFdHOgogCQkJaWYgKGRhdGF3aWR0aCA9PSAyNCkgewogCQkJCWlmIChpID09IDAgfHwgZHVhbCkKLQkJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0gTERCX0RBVEFfV0lEVEhfQ0gwXzI0OworCQkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PQorCQkJCQkJTERCX0RBVEFfV0lEVEhfQ0gwXzI0OwogCQkJCWlmIChpID09IDEgfHwgZHVhbCkKLQkJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0gTERCX0RBVEFfV0lEVEhfQ0gxXzI0OworCQkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PQorCQkJCQkJTERCX0RBVEFfV0lEVEhfQ0gxXzI0OwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTFZEU19CSVRfTUFQX0pFSURBOgogCQkJaWYgKGRhdGF3aWR0aCA9PSAxOCkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkpFSURBIHN0YW5kYXJkIG9ubHkgc3VwcG9ydGVkIGluIDI0IGJpdFxuIik7CisJCQkJZGV2X2VycihkZXYsICJKRUlEQSBzdGFuZGFyZCBvbmx5IHN1cHBvcnRlZCBpbiAyNCBiaXRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJaWYgKGkgPT0gMCB8fCBkdWFsKQotCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMF8yNCB8IExEQl9CSVRfTUFQX0NIMF9KRUlEQTsKKwkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PSBMREJfREFUQV9XSURUSF9DSDBfMjQgfAorCQkJCQlMREJfQklUX01BUF9DSDBfSkVJREE7CiAJCQlpZiAoaSA9PSAxIHx8IGR1YWwpCi0JCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0gTERCX0RBVEFfV0lEVEhfQ0gxXzI0IHwgTERCX0JJVF9NQVBfQ0gxX0pFSURBOworCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMV8yNCB8CisJCQkJCUxEQl9CSVRfTUFQX0NIMV9KRUlEQTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZGF0YSBtYXBwaW5nIG5vdCBzcGVjaWZpZWQgb3IgaW52YWxpZFxuIik7CisJCQlkZXZfZXJyKGRldiwgImRhdGEgbWFwcGluZyBub3Qgc3BlY2lmaWVkIG9yIGludmFsaWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlyZXQgPSBpbXhfbGRiX3JlZ2lzdGVyKGNoYW5uZWwpOworCQlyZXQgPSBpbXhfbGRiX3JlZ2lzdGVyKGRybSwgY2hhbm5lbCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCi0JCWlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3MoY2hhbm5lbC0+aW14X2RybV9lbmNvZGVyLCBjaGlsZCk7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW14X2xkYik7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW14X2xkYik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfbGRiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgaW14X2xkYl91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaW14X2xkYiAqaW14X2xkYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpbXhfbGRiICppbXhfbGRiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXN0cnVjdCBpbXhfbGRiX2NoYW5uZWwgKmNoYW5uZWwgPSAmaW14X2xkYi0+Y2hhbm5lbFtpXTsKLQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZjaGFubmVsLT5jb25uZWN0b3I7Ci0JCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZjaGFubmVsLT5lbmNvZGVyOwogCi0JCWRybV9tb2RlX2Nvbm5lY3Rvcl9kZXRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwotCi0JCWlteF9kcm1fcmVtb3ZlX2Nvbm5lY3RvcihjaGFubmVsLT5pbXhfZHJtX2Nvbm5lY3Rvcik7Ci0JCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoY2hhbm5lbC0+aW14X2RybV9lbmNvZGVyKTsKKwkJY2hhbm5lbC0+Y29ubmVjdG9yLmZ1bmNzLT5kZXN0cm95KCZjaGFubmVsLT5jb25uZWN0b3IpOworCQljaGFubmVsLT5lbmNvZGVyLmZ1bmNzLT5kZXN0cm95KCZjaGFubmVsLT5lbmNvZGVyKTsKIAl9Cit9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBpbXhfbGRiX29wcyA9IHsKKwkuYmluZAk9IGlteF9sZGJfYmluZCwKKwkudW5iaW5kCT0gaW14X2xkYl91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGlteF9sZGJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmaW14X2xkYl9vcHMpOworfQorCitzdGF0aWMgaW50IGlteF9sZGJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCAmaW14X2xkYl9vcHMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtdHZlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtdHZlLmMKaW5kZXggOWFiYzdjYS4uNTc1NTMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LXR2ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC10dmUuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CiAKKyNpbmNsdWRlICJpcHUtdjMvaW14LWlwdS12My5oIgogI2luY2x1ZGUgImlteC1kcm0uaCIKIAogI2RlZmluZSBUVkVfQ09NX0NPTkZfUkVHCTB4MDAKQEAgLTExMCw5ICsxMTIsNyBAQAogCiBzdHJ1Y3QgaW14X3R2ZSB7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgY29ubmVjdG9yOwotCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqaW14X2RybV9jb25uZWN0b3I7CiAJc3RydWN0IGRybV9lbmNvZGVyIGVuY29kZXI7Ci0Jc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzcGlubG9ja190IGxvY2s7CS8qIHJlZ2lzdGVyIGxvY2sgKi8KIAlib29sIGVuYWJsZWQ7CkBAIC0yMjUsMTEgKzIyNSw2IEBACiAJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfdHZlX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgaW50IGlteF90dmVfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBpbXhfdHZlICp0dmUgPSBjb25fdG9fdHZlKGNvbm5lY3Rvcik7CkBAIC0yNTQsNiArMjQ5LDExIEBACiB7CiAJc3RydWN0IGlteF90dmUgKnR2ZSA9IGNvbl90b190dmUoY29ubmVjdG9yKTsKIAl1bnNpZ25lZCBsb25nIHJhdGU7CisJaW50IHJldDsKKworCXJldCA9IGlteF9kcm1fY29ubmVjdG9yX21vZGVfdmFsaWQoY29ubmVjdG9yLCBtb2RlKTsKKwlpZiAocmV0ICE9IE1PREVfT0spCisJCXJldHVybiByZXQ7CiAKIAkvKiBwaXhlbCBjbG9jayB3aXRoIDJ4IG92ZXJzYW1wbGluZyAqLwogCXJhdGUgPSBjbGtfcm91bmRfcmF0ZSh0dmUtPmNsaywgMjAwMFVMICogbW9kZS0+Y2xvY2spIC8gMjAwMDsKQEAgLTMwNSwxMyArMzA1LDExIEBACiAKIAlzd2l0Y2ggKHR2ZS0+bW9kZSkgewogCWNhc2UgVFZFX01PREVfVkdBOgotCQlpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMoZW5jb2Rlci0+Y3J0YywKLQkJCQlEUk1fTU9ERV9FTkNPREVSX0RBQywgSVBVX1BJWF9GTVRfR0JSMjQsCisJCWlteF9kcm1fcGFuZWxfZm9ybWF0X3BpbnMoZW5jb2RlciwgSVBVX1BJWF9GTVRfR0JSMjQsCiAJCQkJdHZlLT5oc3luY19waW4sIHR2ZS0+dnN5bmNfcGluKTsKIAkJYnJlYWs7CiAJY2FzZSBUVkVfTU9ERV9UVk9VVDoKLQkJaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChlbmNvZGVyLT5jcnRjLCBEUk1fTU9ERV9FTkNPREVSX1RWREFDLAotCQkJCQkgIFY0TDJfUElYX0ZNVF9ZVVY0NDQpOworCQlpbXhfZHJtX3BhbmVsX2Zvcm1hdChlbmNvZGVyLCBWNEwyX1BJWF9GTVRfWVVWNDQ0KTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMzY0LDE2ICszNjIsMTEgQEAKIAl0dmVfZGlzYWJsZSh0dmUpOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfdHZlX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgaW14X3R2ZV9jb25uZWN0b3JfZnVuY3MgPSB7CiAJLmRwbXMgPSBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAogCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAogCS5kZXRlY3QgPSBpbXhfdHZlX2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmRlc3Ryb3kgPSBpbXhfdHZlX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9jb25uZWN0b3JfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaW14X3R2ZV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewpAQCAtMzgzLDcgKzM3Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGlteF90dmVfZW5jb2Rlcl9mdW5jcyA9IHsKLQkuZGVzdHJveSA9IGlteF90dmVfZW5jb2Rlcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbXhfdHZlX2VuY29kZXJfaGVscGVyX2Z1bmNzID0gewpAQCAtNTAzLDM0ICs0OTYsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfdHZlX3JlZ2lzdGVyKHN0cnVjdCBpbXhfdHZlICp0dmUpCitzdGF0aWMgaW50IGlteF90dmVfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IGlteF90dmUgKnR2ZSkKIHsKKwlpbnQgZW5jb2Rlcl90eXBlOwogCWludCByZXQ7CiAKLQl0dmUtPmNvbm5lY3Rvci5mdW5jcyA9ICZpbXhfdHZlX2Nvbm5lY3Rvcl9mdW5jczsKLQl0dmUtPmVuY29kZXIuZnVuY3MgPSAmaW14X3R2ZV9lbmNvZGVyX2Z1bmNzOworCWVuY29kZXJfdHlwZSA9IHR2ZS0+bW9kZSA9PSBUVkVfTU9ERV9WR0EgPworCQkJCURSTV9NT0RFX0VOQ09ERVJfREFDIDogRFJNX01PREVfRU5DT0RFUl9UVkRBQzsKIAotCXR2ZS0+ZW5jb2Rlci5lbmNvZGVyX3R5cGUgPSBEUk1fTU9ERV9FTkNPREVSX05PTkU7Ci0JdHZlLT5jb25uZWN0b3IuY29ubmVjdG9yX3R5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOworCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihkcm0sICZ0dmUtPmVuY29kZXIsCisJCQkJICAgICAgIHR2ZS0+ZGV2LT5vZl9ub2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmdHZlLT5lbmNvZGVyLCAmaW14X3R2ZV9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7Ci0JcmV0ID0gaW14X2RybV9hZGRfZW5jb2RlcigmdHZlLT5lbmNvZGVyLCAmdHZlLT5pbXhfZHJtX2VuY29kZXIsCi0JCQlUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHR2ZS0+ZGV2LCAiYWRkaW5nIGVuY29kZXIgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9lbmNvZGVyX2luaXQoZHJtLCAmdHZlLT5lbmNvZGVyLCAmaW14X3R2ZV9lbmNvZGVyX2Z1bmNzLAorCQkJIGVuY29kZXJfdHlwZSk7CiAKIAlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnR2ZS0+Y29ubmVjdG9yLAogCQkJJmlteF90dmVfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7Ci0KLQlyZXQgPSBpbXhfZHJtX2FkZF9jb25uZWN0b3IoJnR2ZS0+Y29ubmVjdG9yLAotCQkJJnR2ZS0+aW14X2RybV9jb25uZWN0b3IsIFRISVNfTU9EVUxFKTsKLQlpZiAocmV0KSB7Ci0JCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIodHZlLT5pbXhfZHJtX2VuY29kZXIpOwotCQlkZXZfZXJyKHR2ZS0+ZGV2LCAiYWRkaW5nIGNvbm5lY3RvciBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRybSwgJnR2ZS0+Y29ubmVjdG9yLCAmaW14X3R2ZV9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKTsKIAogCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmdHZlLT5jb25uZWN0b3IsICZ0dmUtPmVuY29kZXIpOwogCkBAIC01NzYsOSArNTYyLDExIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgaW14X3R2ZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBpbXhfdHZlX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGRjX25vZGU7CiAJc3RydWN0IGlteF90dmUgKnR2ZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTU4NywxNCArNTc1LDE0IEBACiAJaW50IGlycTsKIAlpbnQgcmV0OwogCi0JdHZlID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHZlKSwgR0ZQX0tFUk5FTCk7CisJdHZlID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp0dmUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXR2ZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl0dmUtPmRldiA9ICZwZGV2LT5kZXY7CisJdHZlLT5kZXYgPSBkZXY7CiAJc3Bpbl9sb2NrX2luaXQoJnR2ZS0+bG9jayk7CiAKLQlkZGNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJkZGMiLCAwKTsKKwlkZGNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJpMmMtZGRjLWJ1cyIsIDApOwogCWlmIChkZGNfbm9kZSkgewogCQl0dmUtPmRkYyA9IG9mX2ZpbmRfaTJjX2FkYXB0ZXJfYnlfbm9kZShkZGNfbm9kZSk7CiAJCW9mX25vZGVfcHV0KGRkY19ub2RlKTsKQEAgLTYwMiw3ICs1OTAsNyBAQAogCiAJdHZlLT5tb2RlID0gb2ZfZ2V0X3R2ZV9tb2RlKG5wKTsKIAlpZiAodHZlLT5tb2RlICE9IFRWRV9NT0RFX1ZHQSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvbmx5IFZHQSBtb2RlIHN1cHBvcnRlZCwgY3VycmVudGx5XG4iKTsKKwkJZGV2X2VycihkZXYsICJvbmx5IFZHQSBtb2RlIHN1cHBvcnRlZCwgY3VycmVudGx5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02MTEsNyArNTk5LDcgQEAKIAkJCQkJICAgJnR2ZS0+aHN5bmNfcGluKTsKIAogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2c3luYyBwaW5cbiIpOworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHZzeW5jIHBpblxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKQEAgLTYxOSw0MCArNjA3LDQwIEBACiAJCQkJCSAgICAmdHZlLT52c3luY19waW4pOwogCiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHZzeW5jIHBpblxuIik7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgdnN5bmMgcGluXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKIAogCXR2ZV9yZWdtYXBfY29uZmlnLmxvY2tfYXJnID0gdHZlOwotCXR2ZS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LCAidHZlIiwgYmFzZSwKKwl0dmUtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoZGV2LCAidHZlIiwgYmFzZSwKIAkJCQkJCSZ0dmVfcmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUih0dmUtPnJlZ21hcCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlbGRcbiIsCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlbGRcbiIsCiAJCQlQVFJfRVJSKHR2ZS0+cmVnbWFwKSk7CiAJCXJldHVybiBQVFJfRVJSKHR2ZS0+cmVnbWFwKTsKIAl9CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChpcnEgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxXG4iKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CiAJCXJldHVybiBpcnE7CiAJfQogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBpcnEsIE5VTEwsCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGlycSwgTlVMTCwKIAkJCQkJaW14X3R2ZV9pcnFfaGFuZGxlciwgSVJRRl9PTkVTSE9ULAogCQkJCQkiaW14LXR2ZSIsIHR2ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXR2ZS0+ZGFjX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAiZGFjIik7CisJdHZlLT5kYWNfcmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgImRhYyIpOwogCWlmICghSVNfRVJSKHR2ZS0+ZGFjX3JlZykpIHsKIAkJcmVndWxhdG9yX3NldF92b2x0YWdlKHR2ZS0+ZGFjX3JlZywgMjc1MDAwMCwgMjc1MDAwMCk7CiAJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUodHZlLT5kYWNfcmVnKTsKQEAgLTY2MCwxNyArNjQ4LDE3IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXR2ZS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJ0dmUiKTsKKwl0dmUtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJ0dmUiKTsKIAlpZiAoSVNfRVJSKHR2ZS0+Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGhpZ2ggc3BlZWQgdHZlIGNsb2NrOiAlbGRcbiIsCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBoaWdoIHNwZWVkIHR2ZSBjbG9jazogJWxkXG4iLAogCQkJUFRSX0VSUih0dmUtPmNsaykpOwogCQlyZXR1cm4gUFRSX0VSUih0dmUtPmNsayk7CiAJfQogCiAJLyogdGhpcyBpcyB0aGUgSVBVIERJIGNsb2NrIGlucHV0IHNlbGVjdG9yLCBjYW4gYmUgcGFyZW50ZWQgdG8gdHZlX2RpICovCi0JdHZlLT5kaV9zZWxfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJkaV9zZWwiKTsKKwl0dmUtPmRpX3NlbF9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiZGlfc2VsIik7CiAJaWYgKElTX0VSUih0dmUtPmRpX3NlbF9jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXB1IGRpIG11eCBjbG9jazogJWxkXG4iLAorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaXB1IGRpIG11eCBjbG9jazogJWxkXG4iLAogCQkJUFRSX0VSUih0dmUtPmRpX3NlbF9jbGspKTsKIAkJcmV0dXJuIFBUUl9FUlIodHZlLT5kaV9zZWxfY2xrKTsKIAl9CkBAIC02ODEsNDIgKzY2OSw1MSBAQAogCiAJcmV0ID0gcmVnbWFwX3JlYWQodHZlLT5yZWdtYXAsIFRWRV9DT01fQ09ORl9SRUcsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI6ICVkXG4iLCByZXQpOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlpZiAodmFsICE9IDB4MDAxMDAwMDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY29uZmlndXJhdGlvbiByZWdpc3RlciBkZWZhdWx0IHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIG5vdCBhIFRWRXYyXG4iKTsKKwkJZGV2X2VycihkZXYsICJjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGRlZmF1bHQgdmFsdWUgaW5kaWNhdGVzIHRoaXMgaXMgbm90IGEgVFZFdjJcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBkaXNhYmxlIGNhYmxlIGRldGVjdGlvbiBmb3IgVkdBIG1vZGUgKi8KIAlyZXQgPSByZWdtYXBfd3JpdGUodHZlLT5yZWdtYXAsIFRWRV9DRF9DT05UX1JFRywgMCk7CiAKLQlyZXQgPSBpbXhfdHZlX3JlZ2lzdGVyKHR2ZSk7CisJcmV0ID0gaW14X3R2ZV9yZWdpc3Rlcihkcm0sIHR2ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3ModHZlLT5pbXhfZHJtX2VuY29kZXIsIG5wKTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHR2ZSk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgdHZlKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlteF90dmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBpbXhfdHZlX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwl2b2lkICpkYXRhKQogewotCXN0cnVjdCBpbXhfdHZlICp0dmUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJnR2ZS0+Y29ubmVjdG9yOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZ0dmUtPmVuY29kZXI7CisJc3RydWN0IGlteF90dmUgKnR2ZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JZHJtX21vZGVfY29ubmVjdG9yX2RldGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7Ci0KLQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IodHZlLT5pbXhfZHJtX2Nvbm5lY3Rvcik7Ci0JaW14X2RybV9yZW1vdmVfZW5jb2Rlcih0dmUtPmlteF9kcm1fZW5jb2Rlcik7CisJdHZlLT5jb25uZWN0b3IuZnVuY3MtPmRlc3Ryb3koJnR2ZS0+Y29ubmVjdG9yKTsKKwl0dmUtPmVuY29kZXIuZnVuY3MtPmRlc3Ryb3koJnR2ZS0+ZW5jb2Rlcik7CiAKIAlpZiAoIUlTX0VSUih0dmUtPmRhY19yZWcpKQogCQlyZWd1bGF0b3JfZGlzYWJsZSh0dmUtPmRhY19yZWcpOworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaW14X3R2ZV9vcHMgPSB7CisJLmJpbmQJPSBpbXhfdHZlX2JpbmQsCisJLnVuYmluZAk9IGlteF90dmVfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBpbXhfdHZlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmlteF90dmVfb3BzKTsKK30KKworc3RhdGljIGludCBpbXhfdHZlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmlteF90dmVfb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lteC1pcHUtdjMuaCBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pbXgtaXB1LXYzLmgKaW5kZXggNDgyNmI1Yy4uYzRkMTRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lteC1pcHUtdjMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaW14LWlwdS12My5oCkBAIC0yNSw2ICsyNSw4IEBACiAJSVBVVjNILAogfTsKIAorI2RlZmluZSBJUFVfUElYX0ZNVF9HQlIyNAl2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnMycpCisKIC8qCiAgKiBCaXRmaWVsZCBvZiBEaXNwbGF5IEludGVyZmFjZSBzaWduYWwgcG9sYXJpdGllcy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kYy5jCmluZGV4IGQwZTNiYzMuLmQ1ZGU4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRjLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAJLyogV2FpdCBmb3IgREMgdHJpcGxlIGJ1ZmZlciB0byBlbXB0eSAqLwogCXdoaWxlICgocmVhZGwocHJpdi0+ZGNfcmVnICsgRENfU1RBVCkgJiB2YWwpICE9IHZhbCkgewotCQltc2xlZXAoMik7CisJCXVzbGVlcF9yYW5nZSgyMDAwLCAyMDAwMCk7CiAJCXRpbWVvdXQgLT0gMjsKIAkJaWYgKHRpbWVvdXQgPD0gMCkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kaS5jCmluZGV4IDk0OGE0OWIuLjgyYTllYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRpLmMKQEAgLTE5LDkgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgogCiAjaW5jbHVkZSAiaW14LWlwdS12My5oIgogI2luY2x1ZGUgImlwdS1wcnYuaCIKQEAgLTMzLDEwICszMCw3IEBACiAJc3RydWN0IGNsayAqY2xrX2RpOwkvKiBkaXNwbGF5IGlucHV0IGNsb2NrICovCiAJc3RydWN0IGNsayAqY2xrX2lwdTsJLyogSVBVIGJ1cyBjbG9jayAqLwogCXN0cnVjdCBjbGsgKmNsa19kaV9waXhlbDsgLyogcmVzdWx0aW5nIHBpeGVsIGNsb2NrICovCi0Jc3RydWN0IGNsa19odyBjbGtfaHdfb3V0OwotCWNoYXIgKmNsa19uYW1lOwogCWJvb2wgaW51c2U7Ci0JdW5zaWduZWQgbG9uZyBjbGtmbGFnczsKIAlzdHJ1Y3QgaXB1X3NvYyAqaXB1OwogfTsKIApAQCAtMTQxLDEzMCArMTM1LDYgQEAKIAl3cml0ZWwodmFsdWUsIGRpLT5iYXNlICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIGludCBpcHVfZGlfY2xrX2NhbGNfZGl2KHVuc2lnbmVkIGxvbmcgaW5yYXRlLCB1bnNpZ25lZCBsb25nIG91dHJhdGUpCi17Ci0JdTY0IHRtcCA9IGlucmF0ZTsKLQlpbnQgZGl2OwotCi0JdG1wICo9IDE2OwotCi0JZG9fZGl2KHRtcCwgb3V0cmF0ZSk7Ci0KLQlkaXYgPSB0bXA7Ci0KLQlpZiAoZGl2IDwgMHgxMCkKLQkJZGl2ID0gMHgxMDsKLQotI2lmZGVmIFdURl9JU19USElTCi0JLyoKLQkgKiBGcmVlc2NhbGUgaGFzIHRoaXMgaW4gdGhlaXIgS2VybmVsLiBJdCBpcyBuZWl0aGVyIGNsZWFyIHdoYXQKLQkgKiBpdCBkb2VzIG5vciB3aHkgaXQgZG9lcyBpdAotCSAqLwotCWlmIChkaXYgJiAweDEwKQotCQlkaXYgJj0gfjB4NzsKLQllbHNlIHsKLQkJLyogUm91bmQgdXAgZGl2aWRlciBpZiBpdCBnZXRzIHVzIGNsb3NlciB0byBkZXNpcmVkIHBpeCBjbGsgKi8KLQkJaWYgKChkaXYgJiAweEMpID09IDB4QykgewotCQkJZGl2ICs9IDB4MTA7Ci0JCQlkaXYgJj0gfjB4RjsKLQkJfQotCX0KLSNlbmRpZgotCXJldHVybiBkaXY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19kaV9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JdW5zaWduZWQgbG9uZyBvdXRyYXRlOwotCXUzMiBkaXYgPSBpcHVfZGlfcmVhZChkaSwgRElfQlNfQ0xLR0VOMCk7Ci0KLQlpZiAoZGl2IDwgMHgxMCkKLQkJZGl2ID0gMHgxMDsKLQotCW91dHJhdGUgPSAocGFyZW50X3JhdGUgLyBkaXYpICogMTY7Ci0KLQlyZXR1cm4gb3V0cmF0ZTsKLX0KLQotc3RhdGljIGxvbmcgY2xrX2RpX3JvdW5kX3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCQl1bnNpZ25lZCBsb25nICpwcmF0ZSkKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JdW5zaWduZWQgbG9uZyBvdXRyYXRlOwotCWludCBkaXY7Ci0JdTMyIHZhbDsKLQotCWRpdiA9IGlwdV9kaV9jbGtfY2FsY19kaXYoKnByYXRlLCByYXRlKTsKLQotCW91dHJhdGUgPSAoKnByYXRlIC8gZGl2KSAqIDE2OwotCi0JdmFsID0gaXB1X2RpX3JlYWQoZGksIERJX0dFTkVSQUwpOwotCi0JaWYgKCEodmFsICYgRElfR0VOX0RJX0NMS19FWFQpICYmIG91dHJhdGUgPiAqcHJhdGUgLyAyKQotCQlvdXRyYXRlID0gKnByYXRlIC8gMjsKLQotCWRldl9kYmcoZGktPmlwdS0+ZGV2LAotCQkiJXM6IGlucmF0ZTogJWxkIGRpdjogMHglMDh4IG91dHJhdGU6ICVsZCB3YW50ZWQ6ICVsZFxuIiwKLQkJCV9fZnVuY19fLCAqcHJhdGUsIGRpdiwgb3V0cmF0ZSwgcmF0ZSk7Ci0KLQlyZXR1cm4gb3V0cmF0ZTsKLX0KLQotc3RhdGljIGludCBjbGtfZGlfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXN0cnVjdCBpcHVfZGkgKmRpID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgaXB1X2RpLCBjbGtfaHdfb3V0KTsKLQlpbnQgZGl2OwotCXUzMiBjbGtnZW4wOwotCi0JY2xrZ2VuMCA9IGlwdV9kaV9yZWFkKGRpLCBESV9CU19DTEtHRU4wKSAmIH4weGZmZjsKLQotCWRpdiA9IGlwdV9kaV9jbGtfY2FsY19kaXYocGFyZW50X3JhdGUsIHJhdGUpOwotCi0JaXB1X2RpX3dyaXRlKGRpLCBjbGtnZW4wIHwgZGl2LCBESV9CU19DTEtHRU4wKTsKLQotCWRldl9kYmcoZGktPmlwdS0+ZGV2LCAiJXM6IGlucmF0ZTogJWxkIGRlc2lyZWQ6ICVsZCBkaXY6IDB4JTA4eFxuIiwKLQkJCV9fZnVuY19fLCBwYXJlbnRfcmF0ZSwgcmF0ZSwgZGl2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU4IGNsa19kaV9nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBpcHVfZGkgKmRpID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgaXB1X2RpLCBjbGtfaHdfb3V0KTsKLQl1MzIgdmFsOwotCi0JdmFsID0gaXB1X2RpX3JlYWQoZGksIERJX0dFTkVSQUwpOwotCi0JcmV0dXJuIHZhbCAmIERJX0dFTl9ESV9DTEtfRVhUID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX2RpX3NldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGluZGV4KQotewotCXN0cnVjdCBpcHVfZGkgKmRpID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgaXB1X2RpLCBjbGtfaHdfb3V0KTsKLQl1MzIgdmFsOwotCi0JdmFsID0gaXB1X2RpX3JlYWQoZGksIERJX0dFTkVSQUwpOwotCi0JaWYgKGluZGV4KQotCQl2YWwgfD0gRElfR0VOX0RJX0NMS19FWFQ7Ci0JZWxzZQotCQl2YWwgJj0gfkRJX0dFTl9ESV9DTEtfRVhUOwotCi0JaXB1X2RpX3dyaXRlKGRpLCB2YWwsIERJX0dFTkVSQUwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBjbGtfZGlfb3BzID0gewotCS5yb3VuZF9yYXRlID0gY2xrX2RpX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlID0gY2xrX2RpX3NldF9yYXRlLAotCS5yZWNhbGNfcmF0ZSA9IGNsa19kaV9yZWNhbGNfcmF0ZSwKLQkuc2V0X3BhcmVudCA9IGNsa19kaV9zZXRfcGFyZW50LAotCS5nZXRfcGFyZW50ID0gY2xrX2RpX2dldF9wYXJlbnQsCi19OwotCiBzdGF0aWMgdm9pZCBpcHVfZGlfZGF0YV93YXZlX2NvbmZpZyhzdHJ1Y3QgaXB1X2RpICpkaSwKIAkJCQkgICAgIGludCB3YXZlX2dlbiwKIAkJCQkgICAgIGludCBhY2Nlc3Nfc2l6ZSwgaW50IGNvbXBvbmVudF9zaXplKQpAQCAtNTI4LDE1ICszOTgsMTI1IEBACiAJCWlwdV9kaV9zeW5jX2NvbmZpZyhkaSwgY2ZnX3ZnYSwgMCwgQVJSQVlfU0laRShjZmdfdmdhKSk7CiB9CiAKK3N0YXRpYyB2b2lkIGlwdV9kaV9jb25maWdfY2xvY2soc3RydWN0IGlwdV9kaSAqZGksCisJY29uc3Qgc3RydWN0IGlwdV9kaV9zaWduYWxfY2ZnICpzaWcpCit7CisJc3RydWN0IGNsayAqY2xrOworCXVuc2lnbmVkIGNsa2dlbjA7CisJdWludDMyX3QgdmFsOworCisJaWYgKHNpZy0+Y2xrZmxhZ3MgJiBJUFVfRElfQ0xLTU9ERV9FWFQpIHsKKwkJLyoKKwkJICogQ0xLTU9ERV9FWFQgbWVhbnMgd2UgbXVzdCB1c2UgdGhlIERJIGNsb2NrOiB0aGlzIGlzCisJCSAqIG5lZWRlZCBmb3IgdGhpbmdzIGxpa2UgTFZEUyB3aGljaCBuZWVkcyB0byBmZWVkIHRoZQorCQkgKiBESSBhbmQgTERCIHdpdGggdGhlIHNhbWUgcGl4ZWwgY2xvY2suCisJCSAqLworCQljbGsgPSBkaS0+Y2xrX2RpOworCisJCWlmIChzaWctPmNsa2ZsYWdzICYgSVBVX0RJX0NMS01PREVfU1lOQykgeworCQkJLyoKKwkJCSAqIENMS01PREVfU1lOQyBtZWFucyB0aGF0IHdlIHdhbnQgdGhlIERJIHRvIGJlCisJCQkgKiBjbG9ja2VkIGF0IHRoZSBzYW1lIHJhdGUgYXMgdGhlIHBhcmVudCBjbG9jay4KKwkJCSAqIFRoaXMgaXMgbmVlZGVkIChlZykgZm9yIExEQiB3aGljaCBuZWVkcyB0byBiZQorCQkJICogZmVkIHdpdGggdGhlIHNhbWUgcGl4ZWwgY2xvY2suICBXZSBhc3N1bWUgdGhhdAorCQkJICogdGhlIExEQiBjbG9jayBoYXMgYWxyZWFkeSBiZWVuIHNldCBjb3JyZWN0bHkuCisJCQkgKi8KKwkJCWNsa2dlbjAgPSAxIDw8IDQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgY2FuIHVzZSB0aGUgZGl2aWRlci4gIFdlIHNob3VsZCByZWFsbHkgaGF2ZQorCQkJICogYSBmbGFnIGhlcmUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBicmlkZ2UgY2FuCisJCQkgKiBjb3BlIHdpdGggYSBmcmFjdGlvbmFsIGRpdmlkZXIgb3Igbm90LiAgRm9yIHRoZQorCQkJICogdGltZSBiZWluZywgbGV0J3MgZ28gZm9yIHNpbXBsaWNpdGx5IGFuZAorCQkJICogcmVsaWFiaWxpdHkuCisJCQkgKi8KKwkJCXVuc2lnbmVkIGxvbmcgaW5fcmF0ZTsKKwkJCXVuc2lnbmVkIGRpdjsKKworCQkJY2xrX3NldF9yYXRlKGNsaywgc2lnLT5waXhlbGNsb2NrKTsKKworCQkJaW5fcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOworCQkJZGl2ID0gKGluX3JhdGUgKyBzaWctPnBpeGVsY2xvY2sgLyAyKSAvIHNpZy0+cGl4ZWxjbG9jazsKKwkJCWlmIChkaXYgPT0gMCkKKwkJCQlkaXYgPSAxOworCisJCQljbGtnZW4wID0gZGl2IDw8IDQ7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3Igb3RoZXIgaW50ZXJmYWNlcywgd2UgY2FuIGFyYml0YXJpbHkgc2VsZWN0IGJldHdlZW4KKwkJICogdGhlIERJIHNwZWNpZmljIGNsb2NrIGFuZCB0aGUgaW50ZXJuYWwgSVBVIGNsb2NrLiAgU2VlCisJCSAqIERJX0dFTkVSQUwgYml0IDIwLiAgV2Ugc2VsZWN0IHRoZSBJUFUgY2xvY2sgaWYgaXQgY2FuCisJCSAqIGdpdmUgdXMgYSBjbG9jayByYXRlIHdpdGhpbiAxJSBvZiB0aGUgcmVxdWVzdGVkIGZyZXF1ZW5jeSwKKwkJICogb3RoZXJ3aXNlIHdlIHVzZSB0aGUgREkgY2xvY2suCisJCSAqLworCQl1bnNpZ25lZCBsb25nIHJhdGUsIGNsa3JhdGU7CisJCXVuc2lnbmVkIGRpdiwgZXJyb3I7CisKKwkJY2xrcmF0ZSA9IGNsa19nZXRfcmF0ZShkaS0+Y2xrX2lwdSk7CisJCWRpdiA9IChjbGtyYXRlICsgc2lnLT5waXhlbGNsb2NrIC8gMikgLyBzaWctPnBpeGVsY2xvY2s7CisJCXJhdGUgPSBjbGtyYXRlIC8gZGl2OworCisJCWVycm9yID0gcmF0ZSAvIChzaWctPnBpeGVsY2xvY2sgLyAxMDAwKTsKKworCQlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIiAgSVBVIGNsb2NrIGNhbiBnaXZlICVsdSB3aXRoIGRpdmlkZXIgJXUsIGVycm9yICVkLiV1JSVcbiIsCisJCQlyYXRlLCBkaXYsIChzaWduZWQpKGVycm9yIC0gMTAwMCkgLyAxMCwgZXJyb3IgJSAxMCk7CisKKwkJLyogQWxsb3cgYSAxJSBlcnJvciAqLworCQlpZiAoZXJyb3IgPCAxMDEwICYmIGVycm9yID49IDk5MCkgeworCQkJY2xrID0gZGktPmNsa19pcHU7CisKKwkJCWNsa2dlbjAgPSBkaXYgPDwgNDsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgaW5fcmF0ZTsKKwkJCXVuc2lnbmVkIGRpdjsKKworCQkJY2xrID0gZGktPmNsa19kaTsKKworCQkJY2xrX3NldF9yYXRlKGNsaywgc2lnLT5waXhlbGNsb2NrKTsKKworCQkJaW5fcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOworCQkJZGl2ID0gKGluX3JhdGUgKyBzaWctPnBpeGVsY2xvY2sgLyAyKSAvIHNpZy0+cGl4ZWxjbG9jazsKKwkJCWlmIChkaXYgPT0gMCkKKwkJCQlkaXYgPSAxOworCisJCQljbGtnZW4wID0gZGl2IDw8IDQ7CisJCX0KKwl9CisKKwlkaS0+Y2xrX2RpX3BpeGVsID0gY2xrOworCisJLyogU2V0IHRoZSBkaXZpZGVyICovCisJaXB1X2RpX3dyaXRlKGRpLCBjbGtnZW4wLCBESV9CU19DTEtHRU4wKTsKKworCS8qCisJICogU2V0IHRoZSBoaWdoL2xvdyBwZXJpb2RzLiAgQml0cyAyNDoxNiBnaXZlIHVzIHRoZSBmYWxsaW5nIGVkZ2UsCisJICogYW5kIGJpdHMgODowIGdpdmUgdGhlIHJpc2luZyBlZGdlLiAgTFNCIGlzIGZyYWN0aW9uLCBhbmQgaXMKKwkgKiBiYXNlZCBvbiB0aGUgZGl2aWRlciBhYm92ZS4gIFdlIHdhbnQgYSA1MCUgZHV0eSBjeWNsZSwgc28gc2V0CisJICogdGhlIGZhbGxpbmcgZWRnZSB0byBiZSBoYWxmIHRoZSBkaXZpZGVyLgorCSAqLworCWlwdV9kaV93cml0ZShkaSwgKGNsa2dlbjAgPj4gNCkgPDwgMTYsIERJX0JTX0NMS0dFTjEpOworCisJLyogRmluYWxseSBzZWxlY3QgdGhlIGlucHV0IGNsb2NrICovCisJdmFsID0gaXB1X2RpX3JlYWQoZGksIERJX0dFTkVSQUwpICYgfkRJX0dFTl9ESV9DTEtfRVhUOworCWlmIChjbGsgPT0gZGktPmNsa19kaSkKKwkJdmFsIHw9IERJX0dFTl9ESV9DTEtfRVhUOworCWlwdV9kaV93cml0ZShkaSwgdmFsLCBESV9HRU5FUkFMKTsKKworCWRldl9kYmcoZGktPmlwdS0+ZGV2LCAiV2FudCAlbHVIeiBJUFUgJWx1SHogREkgJWx1SHogdXNpbmcgJXMsICVsdUh6XG4iLAorCQlzaWctPnBpeGVsY2xvY2ssCisJCWNsa19nZXRfcmF0ZShkaS0+Y2xrX2lwdSksCisJCWNsa19nZXRfcmF0ZShkaS0+Y2xrX2RpKSwKKwkJY2xrID09IGRpLT5jbGtfZGkgPyAiREkiIDogIklQVSIsCisJCWNsa19nZXRfcmF0ZShkaS0+Y2xrX2RpX3BpeGVsKSAvIChjbGtnZW4wID4+IDQpKTsKK30KKwogaW50IGlwdV9kaV9pbml0X3N5bmNfcGFuZWwoc3RydWN0IGlwdV9kaSAqZGksIHN0cnVjdCBpcHVfZGlfc2lnbmFsX2NmZyAqc2lnKQogewogCXUzMiByZWc7CiAJdTMyIGRpX2dlbiwgdnN5bmNfY250OwogCXUzMiBkaXY7CiAJdTMyIGhfdG90YWwsIHZfdG90YWw7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHJvdW5kOwotCXN0cnVjdCBjbGsgKnBhcmVudDsKIAogCWRldl9kYmcoZGktPmlwdS0+ZGV2LCAiZGlzcCAlZDogcGFuZWwgc2l6ZSA9ICVkIHggJWRcbiIsCiAJCWRpLT5pZCwgc2lnLT53aWR0aCwgc2lnLT5oZWlnaHQpOwpAQCAtNTQ0LDMzICs1MjQsMjAgQEAKIAlpZiAoKHNpZy0+dl9zeW5jX3dpZHRoID09IDApIHx8IChzaWctPmhfc3luY193aWR0aCA9PSAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoc2lnLT5jbGtmbGFncyAmIElQVV9ESV9DTEtNT0RFX0VYVCkKLQkJcGFyZW50ID0gZGktPmNsa19kaTsKLQllbHNlCi0JCXBhcmVudCA9IGRpLT5jbGtfaXB1OwotCi0JcmV0ID0gY2xrX3NldF9wYXJlbnQoZGktPmNsa19kaV9waXhlbCwgcGFyZW50KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmlwdS0+ZGV2LAotCQkJInNldHRpbmcgcGl4ZWwgY2xvY2sgdG8gcGFyZW50ICVzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fY2xrX2dldF9uYW1lKHBhcmVudCksIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHNpZy0+Y2xrZmxhZ3MgJiBJUFVfRElfQ0xLTU9ERV9TWU5DKQotCQlyb3VuZCA9IGNsa19nZXRfcmF0ZShwYXJlbnQpOwotCWVsc2UKLQkJcm91bmQgPSBjbGtfcm91bmRfcmF0ZShkaS0+Y2xrX2RpX3BpeGVsLCBzaWctPnBpeGVsY2xvY2spOwotCi0JcmV0ID0gY2xrX3NldF9yYXRlKGRpLT5jbGtfZGlfcGl4ZWwsIHJvdW5kKTsKLQogCWhfdG90YWwgPSBzaWctPndpZHRoICsgc2lnLT5oX3N5bmNfd2lkdGggKyBzaWctPmhfc3RhcnRfd2lkdGggKwogCQlzaWctPmhfZW5kX3dpZHRoOwogCXZfdG90YWwgPSBzaWctPmhlaWdodCArIHNpZy0+dl9zeW5jX3dpZHRoICsgc2lnLT52X3N0YXJ0X3dpZHRoICsKIAkJc2lnLT52X2VuZF93aWR0aDsKIAorCWRldl9kYmcoZGktPmlwdS0+ZGV2LCAiQ2xvY2tzOiBJUFUgJWx1SHogREkgJWx1SHogTmVlZGVkICVsdUh6XG4iLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19pcHUpLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19kaSksCisJCXNpZy0+cGl4ZWxjbG9jayk7CisKIAltdXRleF9sb2NrKCZkaV9tdXRleCk7CiAKKwlpcHVfZGlfY29uZmlnX2Nsb2NrKGRpLCBzaWcpOworCiAJZGl2ID0gaXB1X2RpX3JlYWQoZGksIERJX0JTX0NMS0dFTjApICYgMHhmZmY7CiAJZGl2ID0gZGl2IC8gMTY7CQkvKiBOb3cgZGl2aWRlciBpcyBpbnRlZ2VyIHBvcnRpb24gKi8KIApAQCAtNjU0LDcgKzYyMSwxMSBAQAogCiBpbnQgaXB1X2RpX2VuYWJsZShzdHJ1Y3QgaXB1X2RpICpkaSkKIHsKLQlpbnQgcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRpLT5jbGtfZGlfcGl4ZWwpOworCWludCByZXQ7CisKKwlXQVJOX09OKElTX0VSUihkaS0+Y2xrX2RpX3BpeGVsKSk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGktPmNsa19kaV9waXhlbCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjY2LDYgKzYzNyw4IEBACiAKIGludCBpcHVfZGlfZGlzYWJsZShzdHJ1Y3QgaXB1X2RpICpkaSkKIHsKKwlXQVJOX09OKElTX0VSUihkaS0+Y2xrX2RpX3BpeGVsKSk7CisKIAlpcHVfbW9kdWxlX2Rpc2FibGUoZGktPmlwdSwgZGktPm1vZHVsZSk7CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGktPmNsa19kaV9waXhlbCk7CkBAIC03MjEsMTMgKzY5NCw2IEBACiAJCXUzMiBtb2R1bGUsIHN0cnVjdCBjbGsgKmNsa19pcHUpCiB7CiAJc3RydWN0IGlwdV9kaSAqZGk7Ci0JaW50IHJldDsKLQljb25zdCBjaGFyICpkaV9wYXJlbnRbMl07Ci0Jc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdCA9IHsKLQkJLm9wcyA9ICZjbGtfZGlfb3BzLAotCQkubnVtX3BhcmVudHMgPSAyLAotCQkuZmxhZ3MgPSAwLAotCX07CiAKIAlpZiAoaWQgPiAxKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTc0OSw0NSArNzE1LDE2IEBACiAJaWYgKCFkaS0+YmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkaV9wYXJlbnRbMF0gPSBfX2Nsa19nZXRfbmFtZShkaS0+Y2xrX2lwdSk7Ci0JZGlfcGFyZW50WzFdID0gX19jbGtfZ2V0X25hbWUoZGktPmNsa19kaSk7Ci0KIAlpcHVfZGlfd3JpdGUoZGksIDB4MTAsIERJX0JTX0NMS0dFTjApOwogCi0JaW5pdC5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqKikmZGlfcGFyZW50OwotCWRpLT5jbGtfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfZGklZF9waXhlbCIsCi0JCQlkZXZfbmFtZShkZXYpLCBpZCk7Ci0JaWYgKCFkaS0+Y2xrX25hbWUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaW5pdC5uYW1lID0gZGktPmNsa19uYW1lOwotCi0JZGktPmNsa19od19vdXQuaW5pdCA9ICZpbml0OwotCWRpLT5jbGtfZGlfcGl4ZWwgPSBjbGtfcmVnaXN0ZXIoZGV2LCAmZGktPmNsa19od19vdXQpOwotCi0JaWYgKElTX0VSUihkaS0+Y2xrX2RpX3BpeGVsKSkgewotCQlyZXQgPSBQVFJfRVJSKGRpLT5jbGtfZGlfcGl4ZWwpOwotCQlnb3RvIGZhaWxlZF9jbGtfcmVnaXN0ZXI7Ci0JfQotCiAJZGV2X2RiZyhkZXYsICJESSVkIGJhc2U6IDB4JTA4bHggcmVtYXBwZWQgdG8gJXBcbiIsCiAJCQlpZCwgYmFzZSwgZGktPmJhc2UpOwogCWRpLT5pbnVzZSA9IGZhbHNlOwogCWRpLT5pcHUgPSBpcHU7CiAKIAlyZXR1cm4gMDsKLQotZmFpbGVkX2Nsa19yZWdpc3RlcjoKLQotCWtmcmVlKGRpLT5jbGtfbmFtZSk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGlwdV9kaV9leGl0KHN0cnVjdCBpcHVfc29jICppcHUsIGludCBpZCkKIHsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGlwdS0+ZGlfcHJpdltpZF07Ci0KLQljbGtfdW5yZWdpc3RlcihkaS0+Y2xrX2RpX3BpeGVsKTsKLQlrZnJlZShkaS0+Y2xrX25hbWUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRtZmMuYwppbmRleCA5ODA3MGRkLi40NTIxMzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRtZmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRtZmMuYwpAQCAtMTYxLDkgKzE2MSw2IEBACiAJCQkiZG1mYzogdXNpbmcgJWQgc2xvdHMgc3RhcnRpbmcgZnJvbSBzZWdtZW50ICVkIGZvciBJUFUgY2hhbm5lbCAlZFxuIiwKIAkJCXNsb3RzLCBzZWdtZW50LCBkbWZjLT5kYXRhLT5pcHVfY2hhbm5lbCk7CiAKLQlpZiAoIWRtZmMpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJc3dpdGNoIChzbG90cykgewogCWNhc2UgMToKIAkJZmllbGQgPSBETUZDX0ZJRk9fU0laRV82NDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLWNydGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLWNydGMuYwppbmRleCAyMmJlMTA0Li5hOGQwMTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1jcnRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtY3J0Yy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCiAgKiBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTI4NCw2ICsyODUsNyBAQAogCQlpcHVfY3J0Yy0+ZGlfY2xrZmxhZ3MgPSBJUFVfRElfQ0xLTU9ERV9TWU5DIHwKIAkJCUlQVV9ESV9DTEtNT0RFX0VYVDsKIAkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9FTkNPREVSX1RNRFM6CiAJY2FzZSBEUk1fTU9ERV9FTkNPREVSX05PTkU6CiAJCWlwdV9jcnRjLT5kaV9jbGtmbGFncyA9IDA7CiAJCWJyZWFrOwpAQCAtMzM0LDcgKzMzNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB1X2NydGNfaW5pdChzdHJ1Y3QgaXB1X2NydGMgKmlwdV9jcnRjLAotCQlzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgKnBkYXRhKQorCXN0cnVjdCBpcHVfY2xpZW50X3BsYXRmb3JtZGF0YSAqcGRhdGEsIHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pCiB7CiAJc3RydWN0IGlwdV9zb2MgKmlwdSA9IGRldl9nZXRfZHJ2ZGF0YShpcHVfY3J0Yy0+ZGV2LT5wYXJlbnQpOwogCWludCBkcCA9IC1FSU5WQUw7CkBAIC0zNDgsMTAgKzM1MCw4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gaW14X2RybV9hZGRfY3J0YygmaXB1X2NydGMtPmJhc2UsCi0JCQkmaXB1X2NydGMtPmlteF9jcnRjLAotCQkJJmlwdV9jcnRjX2hlbHBlcl9mdW5jcywgVEhJU19NT0RVTEUsCi0JCQlpcHVfY3J0Yy0+ZGV2LT5wYXJlbnQtPm9mX25vZGUsIHBkYXRhLT5kaSk7CisJcmV0ID0gaW14X2RybV9hZGRfY3J0Yyhkcm0sICZpcHVfY3J0Yy0+YmFzZSwgJmlwdV9jcnRjLT5pbXhfY3J0YywKKwkJCSZpcHVfY3J0Y19oZWxwZXJfZnVuY3MsIGlwdV9jcnRjLT5kZXYtPm9mX25vZGUpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihpcHVfY3J0Yy0+ZGV2LCAiYWRkaW5nIGNydGMgZmFpbGVkIHdpdGggJWQuXG4iLCByZXQpOwogCQlnb3RvIGVycl9wdXRfcmVzb3VyY2VzOwpAQCAtMzk5LDQzICszOTksOTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlwdV9kcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlwdV9kcm1fZ2V0X3BvcnRfYnlfaWQoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCisJCQkJCQkgIGludCBwb3J0X2lkKQogewotCXN0cnVjdCBpcHVfY2xpZW50X3BsYXRmb3JtZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQ7CisJaW50IGlkLCByZXQ7CisKKwlwb3J0ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGFyZW50LCAicG9ydCIpOworCXdoaWxlIChwb3J0KSB7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBvcnQsICJyZWciLCAmaWQpOworCQlpZiAoIXJldCAmJiBpZCA9PSBwb3J0X2lkKQorCQkJcmV0dXJuIHBvcnQ7CisKKwkJZG8geworCQkJcG9ydCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgcG9ydCk7CisJCQlpZiAoIXBvcnQpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0gd2hpbGUgKG9mX25vZGVfY21wKHBvcnQtPm5hbWUsICJwb3J0IikpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGlwdV9kcm1fYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOwogCXN0cnVjdCBpcHVfY3J0YyAqaXB1X2NydGM7CiAJaW50IHJldDsKIAotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpcHVfY3J0YyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlwdV9jcnRjKSwgR0ZQX0tFUk5FTCk7CisJaXB1X2NydGMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlwdV9jcnRjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcHVfY3J0YykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpcHVfY3J0Yy0+ZGV2ID0gJnBkZXYtPmRldjsKKwlpcHVfY3J0Yy0+ZGV2ID0gZGV2OwogCi0JcmV0ID0gaXB1X2NydGNfaW5pdChpcHVfY3J0YywgcGRhdGEpOworCXJldCA9IGlwdV9jcnRjX2luaXQoaXB1X2NydGMsIHBkYXRhLCBkcm0pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpcHVfY3J0Yyk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaXB1X2NydGMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXB1X2RybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGlwdV9kcm1fdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCXZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlwdV9jcnRjICppcHVfY3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpcHVfY3J0YyAqaXB1X2NydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlteF9kcm1fcmVtb3ZlX2NydGMoaXB1X2NydGMtPmlteF9jcnRjKTsKIAogCWlwdV9wbGFuZV9wdXRfcmVzb3VyY2VzKGlwdV9jcnRjLT5wbGFuZVswXSk7CiAJaXB1X3B1dF9yZXNvdXJjZXMoaXB1X2NydGMpOworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaXB1X2NydGNfb3BzID0geworCS5iaW5kID0gaXB1X2RybV9iaW5kLAorCS51bmJpbmQgPSBpcHVfZHJtX3VuYmluZCwKK307CisKK3N0YXRpYyBpbnQgaXB1X2RybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGlwdV9jbGllbnRfcGxhdGZvcm1kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCFkZXYtPnBsYXRmb3JtX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXYtPm9mX25vZGUpIHsKKwkJLyogQXNzb2NpYXRlIGNydGMgZGV2aWNlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgREkgcG9ydCBub2RlICovCisJCWRldi0+b2Zfbm9kZSA9IGlwdV9kcm1fZ2V0X3BvcnRfYnlfaWQoZGV2LT5wYXJlbnQtPm9mX25vZGUsCisJCQkJCQkgICAgICBwZGF0YS0+ZGkgKyAyKTsKKwkJaWYgKCFkZXYtPm9mX25vZGUpIHsKKwkJCWRldl9lcnIoZGV2LCAibWlzc2luZyBwb3J0QCVkIG5vZGUgaW4gJXNcbiIsCisJCQkJcGRhdGEtPmRpICsgMiwgZGV2LT5wYXJlbnQtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldCA9IGRtYV9zZXRfY29oZXJlbnRfbWFzayhkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY29tcG9uZW50X2FkZChkZXYsICZpcHVfY3J0Y19vcHMpOworfQorCitzdGF0aWMgaW50IGlwdV9kcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCAmaXB1X2NydGNfb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtcGxhbmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLXBsYW5lLmMKaW5kZXggMzRiNjQyYS4uYjBjOWI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtcGxhbmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1wbGFuZS5jCkBAIC03Miw4ICs3Miw4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWRldl9kYmcoaXB1X3BsYW5lLT5iYXNlLmRldi0+ZGV2LCAicGh5cyA9IDB4JXgsIHggPSAlZCwgeSA9ICVkIiwKLQkJY21hX29iai0+cGFkZHIsIHgsIHkpOworCWRldl9kYmcoaXB1X3BsYW5lLT5iYXNlLmRldi0+ZGV2LCAicGh5cyA9ICVwYWQsIHggPSAlZCwgeSA9ICVkIiwKKwkJJmNtYV9vYmotPnBhZGRyLCB4LCB5KTsKIAogCWNwbWVtID0gaXB1X2dldF9jcG1lbShpcHVfcGxhbmUtPmlwdV9jaCk7CiAJaXB1X2NwbWVtX3NldF9zdHJpZGUoY3BtZW0sIGZiLT5waXRjaGVzWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL3BhcmFsbGVsLWRpc3BsYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL3BhcmFsbGVsLWRpc3BsYXkuYwppbmRleCAzNTFkNjFkLi5jNjBiNmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vcGFyYWxsZWwtZGlzcGxheS5jCkBAIC0xOCwxMCArMTgsMTIgQEAKICAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2ZiX2hlbHBlci5oPgogI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3BhbmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8dmlkZW8vb2ZfZGlzcGxheV90aW1pbmcuaD4KIApAQCAtMzIsMTUgKzM0LDE0IEBACiAKIHN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSB7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgY29ubmVjdG9yOwotCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqaW14X2RybV9jb25uZWN0b3I7CiAJc3RydWN0IGRybV9lbmNvZGVyIGVuY29kZXI7Ci0Jc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAl2b2lkICplZGlkOwogCWludCBlZGlkX2xlbjsKIAl1MzIgaW50ZXJmYWNlX3BpeF9mbXQ7CiAJaW50IG1vZGVfdmFsaWQ7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbW9kZTsKKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKIH07CiAKIHN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGlteF9wZF9jb25uZWN0b3JfZGV0ZWN0KApAQCAtNDksMTcgKzUwLDE5IEBACiAJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfcGRfY29ubmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQkvKiBkbyBub3QgZnJlZSBoZXJlICovCi19Ci0KIHN0YXRpYyBpbnQgaW14X3BkX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gY29uX3RvX2lteHBkKGNvbm5lY3Rvcik7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGlteHBkLT5kZXYtPm9mX25vZGU7CiAJaW50IG51bV9tb2RlcyA9IDA7CiAKKwlpZiAoaW14cGQtPnBhbmVsICYmIGlteHBkLT5wYW5lbC0+ZnVuY3MgJiYKKwkgICAgaW14cGQtPnBhbmVsLT5mdW5jcy0+Z2V0X21vZGVzKSB7CisJCW51bV9tb2RlcyA9IGlteHBkLT5wYW5lbC0+ZnVuY3MtPmdldF9tb2RlcyhpbXhwZC0+cGFuZWwpOworCQlpZiAobnVtX21vZGVzID4gMCkKKwkJCXJldHVybiBudW1fbW9kZXM7CisJfQorCiAJaWYgKGlteHBkLT5lZGlkKSB7CiAJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIGlteHBkLT5lZGlkKTsKIAkJbnVtX21vZGVzID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgaW14cGQtPmVkaWQpOwpAQCAtNjcsNiArNzAsOCBAQAogCiAJaWYgKGlteHBkLT5tb2RlX3ZhbGlkKSB7CiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gZHJtX21vZGVfY3JlYXRlKGNvbm5lY3Rvci0+ZGV2KTsKKwkJaWYgKCFtb2RlKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWRybV9tb2RlX2NvcHkobW9kZSwgJmlteHBkLT5tb2RlKTsKIAkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVELAogCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CkBAIC03NSw2ICs4MCw4IEBACiAKIAlpZiAobnApIHsKIAkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoY29ubmVjdG9yLT5kZXYpOworCQlpZiAoIW1vZGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJb2ZfZ2V0X2RybV9kaXNwbGF5X21vZGUobnAsICZpbXhwZC0+bW9kZSwgT0ZfVVNFX05BVElWRV9NT0RFKTsKIAkJZHJtX21vZGVfY29weShtb2RlLCAmaW14cGQtPm1vZGUpOwogCQltb2RlLT50eXBlIHw9IERSTV9NT0RFX1RZUEVfRFJJVkVSIHwgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQsCkBAIC04NSwxMiArOTIsNiBAQAogCXJldHVybiBudW1fbW9kZXM7CiB9CiAKLXN0YXRpYyBpbnQgaW14X3BkX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICppbXhfcGRfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcigKIAkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKQEAgLTEwMSw2ICsxMDIsMTIgQEAKIAogc3RhdGljIHZvaWQgaW14X3BkX2VuY29kZXJfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQogeworCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQgPSBlbmNfdG9faW14cGQoZW5jb2Rlcik7CisKKwlpZiAobW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKQorCQlkcm1fcGFuZWxfZGlzYWJsZShpbXhwZC0+cGFuZWwpOworCWVsc2UKKwkJZHJtX3BhbmVsX2VuYWJsZShpbXhwZC0+cGFuZWwpOwogfQogCiBzdGF0aWMgYm9vbCBpbXhfcGRfZW5jb2Rlcl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKQEAgLTExNCw4ICsxMjEsNyBAQAogewogCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQgPSBlbmNfdG9faW14cGQoZW5jb2Rlcik7CiAKLQlpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0KGVuY29kZXItPmNydGMsIERSTV9NT0RFX0VOQ09ERVJfTk9ORSwKLQkJCWlteHBkLT5pbnRlcmZhY2VfcGl4X2ZtdCk7CisJaW14X2RybV9wYW5lbF9mb3JtYXQoZW5jb2RlciwgaW14cGQtPmludGVyZmFjZV9waXhfZm10KTsKIH0KIAogc3RhdGljIHZvaWQgaW14X3BkX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTEzMiwyNiArMTM4LDIxIEBACiB7CiB9CiAKLXN0YXRpYyB2b2lkIGlteF9wZF9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGlteF9wZF9jb25uZWN0b3JfZnVuY3MgPSB7CiAJLmRwbXMgPSBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAogCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAogCS5kZXRlY3QgPSBpbXhfcGRfY29ubmVjdG9yX2RldGVjdCwKLQkuZGVzdHJveSA9IGlteF9wZF9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF9wZF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewogCS5nZXRfbW9kZXMgPSBpbXhfcGRfY29ubmVjdG9yX2dldF9tb2RlcywKIAkuYmVzdF9lbmNvZGVyID0gaW14X3BkX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIsCi0JLm1vZGVfdmFsaWQgPSBpbXhfcGRfY29ubmVjdG9yX21vZGVfdmFsaWQsCisJLm1vZGVfdmFsaWQgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbXhfcGRfZW5jb2Rlcl9mdW5jcyA9IHsKLQkuZGVzdHJveSA9IGlteF9wZF9lbmNvZGVyX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBpbXhfZHJtX2VuY29kZXJfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGlteF9wZF9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTE2Myw1MSArMTY0LDQ2IEBACiAJLmRpc2FibGUgPSBpbXhfcGRfZW5jb2Rlcl9kaXNhYmxlLAogfTsKIAotc3RhdGljIGludCBpbXhfcGRfcmVnaXN0ZXIoc3RydWN0IGlteF9wYXJhbGxlbF9kaXNwbGF5ICppbXhwZCkKK3N0YXRpYyBpbnQgaW14X3BkX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGlteF9wYXJhbGxlbF9kaXNwbGF5ICppbXhwZCkKIHsKIAlpbnQgcmV0OwogCi0JZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZpbXhwZC0+Y29ubmVjdG9yLCAmaW14cGQtPmVuY29kZXIpOwotCi0JaW14cGQtPmNvbm5lY3Rvci5mdW5jcyA9ICZpbXhfcGRfY29ubmVjdG9yX2Z1bmNzOwotCWlteHBkLT5lbmNvZGVyLmZ1bmNzID0gJmlteF9wZF9lbmNvZGVyX2Z1bmNzOwotCi0JaW14cGQtPmVuY29kZXIuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9OT05FOwotCWlteHBkLT5jb25uZWN0b3IuY29ubmVjdG9yX3R5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOworCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihkcm0sICZpbXhwZC0+ZW5jb2RlciwKKwkJCQkgICAgICAgaW14cGQtPmRldi0+b2Zfbm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJmlteHBkLT5lbmNvZGVyLCAmaW14X3BkX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKLQlyZXQgPSBpbXhfZHJtX2FkZF9lbmNvZGVyKCZpbXhwZC0+ZW5jb2RlciwgJmlteHBkLT5pbXhfZHJtX2VuY29kZXIsCi0JCQlUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGlteHBkLT5kZXYsICJhZGRpbmcgZW5jb2RlciBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJZHJtX2VuY29kZXJfaW5pdChkcm0sICZpbXhwZC0+ZW5jb2RlciwgJmlteF9wZF9lbmNvZGVyX2Z1bmNzLAorCQkJIERSTV9NT0RFX0VOQ09ERVJfTk9ORSk7CiAKIAlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJmlteHBkLT5jb25uZWN0b3IsCiAJCQkmaW14X3BkX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCWRybV9jb25uZWN0b3JfaW5pdChkcm0sICZpbXhwZC0+Y29ubmVjdG9yLCAmaW14X3BkX2Nvbm5lY3Rvcl9mdW5jcywKKwkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EpOwogCi0JcmV0ID0gaW14X2RybV9hZGRfY29ubmVjdG9yKCZpbXhwZC0+Y29ubmVjdG9yLAotCQkJJmlteHBkLT5pbXhfZHJtX2Nvbm5lY3RvciwgVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJaW14X2RybV9yZW1vdmVfZW5jb2RlcihpbXhwZC0+aW14X2RybV9lbmNvZGVyKTsKLQkJZGV2X2VycihpbXhwZC0+ZGV2LCAiYWRkaW5nIGNvbm5lY3RvciBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKGlteHBkLT5wYW5lbCkKKwkJZHJtX3BhbmVsX2F0dGFjaChpbXhwZC0+cGFuZWwsICZpbXhwZC0+Y29ubmVjdG9yKTsKKworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmaW14cGQtPmNvbm5lY3RvciwgJmlteHBkLT5lbmNvZGVyKTsKIAogCWlteHBkLT5jb25uZWN0b3IuZW5jb2RlciA9ICZpbXhwZC0+ZW5jb2RlcjsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlteF9wZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBpbXhfcGRfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhbmVsX25vZGU7CiAJY29uc3QgdTggKmVkaWRwOwogCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQ7CiAJaW50IHJldDsKIAljb25zdCBjaGFyICpmbXQ7CiAKLQlpbXhwZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlteHBkKSwgR0ZQX0tFUk5FTCk7CisJaW14cGQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlteHBkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbXhwZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIyNSwzMCArMjIxLDQzIEBACiAJCQlpbXhwZC0+aW50ZXJmYWNlX3BpeF9mbXQgPSBWNEwyX1BJWF9GTVRfQkdSNjY2OwogCX0KIAotCWlteHBkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBhbmVsX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiZnNsLHBhbmVsIiwgMCk7CisJaWYgKHBhbmVsX25vZGUpCisJCWlteHBkLT5wYW5lbCA9IG9mX2RybV9maW5kX3BhbmVsKHBhbmVsX25vZGUpOwogCi0JcmV0ID0gaW14X3BkX3JlZ2lzdGVyKGlteHBkKTsKKwlpbXhwZC0+ZGV2ID0gZGV2OworCisJcmV0ID0gaW14X3BkX3JlZ2lzdGVyKGRybSwgaW14cGQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKGlteHBkLT5pbXhfZHJtX2VuY29kZXIsIG5wKTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlteHBkKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbXhwZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaW14X3BkX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlteHBkLT5lbmNvZGVyLmZ1bmNzLT5kZXN0cm95KCZpbXhwZC0+ZW5jb2Rlcik7CisJaW14cGQtPmNvbm5lY3Rvci5mdW5jcy0+ZGVzdHJveSgmaW14cGQtPmNvbm5lY3Rvcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBpbXhfcGRfb3BzID0geworCS5iaW5kCT0gaW14X3BkX2JpbmQsCisJLnVuYmluZAk9IGlteF9wZF91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGlteF9wZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBjb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsICZpbXhfcGRfb3BzKTsKK30KKwogc3RhdGljIGludCBpbXhfcGRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGlteF9wYXJhbGxlbF9kaXNwbGF5ICppbXhwZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSAmaW14cGQtPmNvbm5lY3RvcjsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaW14cGQtPmVuY29kZXI7Ci0KLQlkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKLQotCWlteF9kcm1fcmVtb3ZlX2Nvbm5lY3RvcihpbXhwZC0+aW14X2RybV9jb25uZWN0b3IpOwotCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaW14cGQtPmlteF9kcm1fZW5jb2Rlcik7Ci0KKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZpbXhfcGRfb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2NvbW1vbi5oCmluZGV4IGNmMzQ3Y2MuLmYwYjk3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvY29tbW9uLmgKQEAgLTEsMTQgKzEsNiBAQAogI2lmbmRlZiBDT01NT05fSU5DRAogI2RlZmluZSBDT01NT05fSU5DRAogCi10eXBlZGVmIHU4IEJPT0xFQU47Ci10eXBlZGVmIHU4IEJZVEU7Ci10eXBlZGVmIHU4ICpQQllURTsKLXR5cGVkZWYgdTE2IFdPUkQ7Ci10eXBlZGVmIHUxNiAqUFdPUkQ7Ci10eXBlZGVmIHUzMiBEV09SRDsKLXR5cGVkZWYgdTMyICpQRFdPUkQ7Ci0KICNkZWZpbmUgQllURV9NQVNLCTB4ZmYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYwppbmRleCBmNWQ0MWUwLi5lNjExODM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmMKQEAgLTE3LDcgKzE3LDcgQEAKIGludCBFTkVfSW5pdE1lZGlhKHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlpbnQJcmVzdWx0OwotCUJZVEUJTWlzY1JlZzAzID0gMDsKKwl1OAlNaXNjUmVnMDMgPSAwOwogCiAJZGV2X2luZm8oJnVzLT5wdXNiX2Rldi0+ZGV2LCAiLS0tIEluaXQgTWVkaWEgLS0tXG4iKTsKIAlyZXN1bHQgPSBlbmVfcmVhZF9ieXRlKHVzLCBSRUdfQ0FSRF9TVEFUVVMsICZNaXNjUmVnMDMpOwpAQCAtNDEsNyArNDEsNyBAQAogLyoKICAqIGVuZV9yZWFkX2J5dGUoKSA6CiAgKi8KLWludCBlbmVfcmVhZF9ieXRlKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBpbmRleCwgdm9pZCAqYnVmKQoraW50IGVuZV9yZWFkX2J5dGUoc3RydWN0IHVzX2RhdGEgKnVzLCB1MTYgaW5kZXgsIHZvaWQgKmJ1ZikKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50IHJlc3VsdDsKQEAgLTUxLDggKzUxLDggQEAKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MDE7CiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhFRDsKLQliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKGluZGV4Pj44KTsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpaW5kZXg7CisJYmNiLT5DREJbMl0JCQk9ICh1OCkoaW5kZXg+PjgpOworCWJjYi0+Q0RCWzNdCQkJPSAodTgpaW5kZXg7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNjUsNyArNjUsNyBAQAogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCUJZVEUJYnVmWzB4MjAwXTsKKwl1OAlidWZbMHgyMDBdOwogCiAJZGV2X2RiZygmdXMtPnB1c2JfZGV2LT5kZXYsICJ0cmFuc3BvcnQgLS0tIEVORV9TTUluaXRcbiIpOwogCkBAIC0xMjIsMTIgKzEyMiwxMiBAQAogLyoKICAqIEVORV9Mb2FkQmluQ29kZSgpCiAgKi8KLWludCBFTkVfTG9hZEJpbkNvZGUoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFIGZsYWcpCitpbnQgRU5FX0xvYWRCaW5Db2RlKHN0cnVjdCB1c19kYXRhICp1cywgdTggZmxhZykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50IHJlc3VsdDsKIAkvKiB2b2lkICpidWY7ICovCi0JUEJZVEUgYnVmOworCXU4ICpidWY7CiAKIAkvKiBkZXZfaW5mbygmdXMtPnB1c2JfZGV2LT5kZXYsICJ0cmFuc3BvcnQgLS0tIEVORV9Mb2FkQmluQ29kZVxuIik7ICovCiAJaWYgKHVzLT5CSU5fRkxBRyA9PSBmbGFnKQpAQCAtMTY0LDcgKzE2NCw3IEBACiAvKgogICogRU5FX1NlbmRTY3NpQ21kKCk6CiAgKi8KLWludCBFTkVfU2VuZFNjc2lDbWQoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFIGZEaXIsIHZvaWQgKmJ1ZiwgaW50IHVzZV9zZykKK2ludCBFTkVfU2VuZFNjc2lDbWQoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCBmRGlyLCB2b2lkICpidWYsIGludCB1c2Vfc2cpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCXN0cnVjdCBidWxrX2NzX3dyYXAgKmJjcyA9IChzdHJ1Y3QgYnVsa19jc193cmFwICopIHVzLT5pb2J1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmggYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oCmluZGV4IGM4YjJjZDYuLjk4ZDJlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaApAQCAtMSwxMSArMSwxMSBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCi1leHRlcm4gRFdPUkQgTWVkaWFDaGFuZ2U7CitleHRlcm4gdTMyIE1lZGlhQ2hhbmdlOwogZXh0ZXJuIGludCBDaGVja19EX01lZGlhRm10KHN0cnVjdCB1c19kYXRhICopOwogCiAKIAotc3RhdGljIEJZVEUgU01fSW5pdFtdID0geworc3RhdGljIHU4IFNNX0luaXRbXSA9IHsKIDB4N0IsIDB4MDksIDB4N0MsIDB4RjAsIDB4N0QsIDB4MTAsIDB4N0UsIDB4RTksCiAweDdGLCAweENDLCAweDEyLCAweDJGLCAweDcxLCAweDkwLCAweEU5LCAweENDLAogMHhFMCwgMHhCNCwgMHgwNywgMHgxMiwgMHg5MCwgMHhGRiwgMHgwOSwgMHhFMCwKQEAgLTI2Myw3ICsyNjMsNyBAQAogMHg1OCwgMHg0NCwgMHgyRCwgMHg0OSwgMHg2RSwgMHg2OSwgMHg3NCwgMHgyMCwKIDB4MjAsIDB4MjAsIDB4MjAsIDB4MzEsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzEgfTsKIAotc3RhdGljIEJZVEUgU01fUmR3cltdID0geworc3RhdGljIHU4IFNNX1Jkd3JbXSA9IHsKIDB4N0IsIDB4MEMsIDB4N0MsIDB4RjAsIDB4N0QsIDB4MTAsIDB4N0UsIDB4RTksCiAweDdGLCAweENDLCAweDEyLCAweDJGLCAweDcxLCAweDkwLCAweEU5LCAweEMzLAogMHhFMCwgMHhCNCwgMHg3MywgMHgwNCwgMHg3NCwgMHg0MCwgMHg4MCwgMHgwOSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsLmggYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oCmluZGV4IDkxMzZlOTQuLjM5OTUxNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWwuaApAQCAtMTY5LDI5ICsxNjksMjkgQEAKIFN0cnVjdCBEZWZpbml0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3Qga2V1Y3JfbWVkaWFfaW5mbyB7Ci0JQllURSBNb2RlbDsKLQlCWVRFIEF0dHJpYnV0ZTsKLQlCWVRFIE1heFpvbmVzOwotCUJZVEUgTWF4U2VjdG9yczsKLQlXT1JEIE1heEJsb2NrczsKLQlXT1JEIE1heExvZ0Jsb2NrczsKKwl1OCBNb2RlbDsKKwl1OCBBdHRyaWJ1dGU7CisJdTggTWF4Wm9uZXM7CisJdTggTWF4U2VjdG9yczsKKwl1MTYgTWF4QmxvY2tzOworCXUxNiBNYXhMb2dCbG9ja3M7CiB9OwogCiBzdHJ1Y3Qga2V1Y3JfbWVkaWFfYWRkcmVzcyB7Ci0JQllURSBab25lOwkvKiBab25lIE51bWJlciAqLwotCUJZVEUgU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCi0JV09SRCBQaHlCbG9jazsJLyogUGh5c2ljYWwgQmxvY2sgTnVtYmVyIG9uIFpvbmUgKi8KLQlXT1JEIExvZ0Jsb2NrOwkvKiBMb2dpY2FsIEJsb2NrIE51bWJlciBvZiBab25lICovCisJdTggWm9uZTsJLyogWm9uZSBOdW1iZXIgKi8KKwl1OCBTZWN0b3I7CS8qIFNlY3Rvcig1MTJieXRlKSBOdW1iZXIgb24gQmxvY2sgKi8KKwl1MTYgUGh5QmxvY2s7CS8qIFBoeXNpY2FsIEJsb2NrIE51bWJlciBvbiBab25lICovCisJdTE2IExvZ0Jsb2NrOwkvKiBMb2dpY2FsIEJsb2NrIE51bWJlciBvZiBab25lICovCiB9OwogCiBzdHJ1Y3Qga2V1Y3JfbWVkaWFfYXJlYSB7Ci0JQllURSBTZWN0b3I7CS8qIFNlY3Rvcig1MTJieXRlKSBOdW1iZXIgb24gQmxvY2sgKi8KLQlXT1JEIFBoeUJsb2NrOwkvKiBQaHlzaWNhbCBCbG9jayBOdW1iZXIgb24gWm9uZSAwICovCisJdTggU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCisJdTE2IFBoeUJsb2NrOwkvKiBQaHlzaWNhbCBCbG9jayBOdW1iZXIgb24gWm9uZSAwICovCiB9OwogCi1leHRlcm4gV09SRAlSZWFkQmxvY2s7Ci1leHRlcm4gV09SRAlXcml0ZUJsb2NrOwotZXh0ZXJuIERXT1JECU1lZGlhQ2hhbmdlOworZXh0ZXJuIHUxNglSZWFkQmxvY2s7CitleHRlcm4gdTE2CVdyaXRlQmxvY2s7CitleHRlcm4gdTMyCU1lZGlhQ2hhbmdlOwogCiBleHRlcm4gc3RydWN0IGtldWNyX21lZGlhX2luZm8gICAgU3NmZGM7CiBleHRlcm4gc3RydWN0IGtldWNyX21lZGlhX2FkZHJlc3MgTWVkaWE7CkBAIC0yMDQsMjQgKzIwNCwyNCBAQAogaW50ICAgICAgICAgSW5pdF9EX1NtYXJ0TWVkaWEodm9pZCk7CiBpbnQgICAgICAgICBQd29mZl9EX1NtYXJ0TWVkaWEodm9pZCk7CiBpbnQgICAgICAgICBDaGVja19EX1NtYXJ0TWVkaWEodm9pZCk7Ci1pbnQgICAgICAgICBDaGVja19EX1BhcmFtZXRlcihzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JEICosIEJZVEUgKiwgQllURSAqKTsKLWludCAgICAgICAgIE1lZGlhX0RfUmVhZFNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCwgV09SRCwgQllURSAqKTsKLWludCAgICAgICAgIE1lZGlhX0RfV3JpdGVTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQsIFdPUkQsIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQsIFdPUkQsIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQsIFdPUkQpOworaW50ICAgICAgICAgQ2hlY2tfRF9QYXJhbWV0ZXIoc3RydWN0IHVzX2RhdGEgKiwgdTE2ICosIHU4ICosIHU4ICopOworaW50ICAgICAgICAgTWVkaWFfRF9SZWFkU2VjdG9yKHN0cnVjdCB1c19kYXRhICosIHUzMiwgdTE2LCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfV3JpdGVTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKiwgdTMyLCB1MTYsIHU4ICopOworaW50ICAgICAgICAgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICosIHUzMiwgdTE2LCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfRXJhc2VCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIsIHUxNik7CiBpbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQWxsKHN0cnVjdCB1c19kYXRhICopOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCAgICAgICAgIE1lZGlhX0RfT25lU2VjdFdyaXRlU3RhcnQoc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQsIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZU5leHQoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfT25lU2VjdFdyaXRlU3RhcnQoc3RydWN0IHVzX2RhdGEgKiwgdTMyLCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfT25lU2VjdFdyaXRlTmV4dChzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqKTsKIGludCAgICAgICAgIE1lZGlhX0RfT25lU2VjdFdyaXRlRmx1c2goc3RydWN0IHVzX2RhdGEgKik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gaW50CVNNX0ZyZWVNZW0odm9pZCk7CS8qIEVORSBTTSBmdW5jdGlvbiAqLwotdm9pZCAgICAgICAgU01fRW5hYmxlTEVEKHN0cnVjdCB1c19kYXRhICosIEJPT0xFQU4pOwordm9pZCAgICAgICAgU01fRW5hYmxlTEVEKHN0cnVjdCB1c19kYXRhICosIGJvb2wpOwogdm9pZCAgICAgICAgTGVkX0RfVGVybk9uKHZvaWQpOwogdm9pZCAgICAgICAgTGVkX0RfVGVybk9mZih2b2lkKTsKIAotaW50ICAgICAgICAgTWVkaWFfRF9FcmFzZUFsbFJlZHREYXRhKERXT1JEIEluZGV4LCBCT09MRUFOIENoZWNrQmxvY2spOworaW50ICAgICAgICAgTWVkaWFfRF9FcmFzZUFsbFJlZHREYXRhKHUzMiBJbmRleCwgYm9vbCBDaGVja0Jsb2NrKTsKIC8qRFdPUkQgTWVkaWFfRF9HZXRNZWRpYUluZm8oc3RydWN0IHVzX2RhdGEgKiBmZG9FeHQsCiAJUElPQ1RMX01FRElBX0lORk9fSU4gcFBhcmFtSW4sIFBJT0NUTF9NRURJQV9JTkZPX09VVCBwUGFyYW1PdXQpOyAqLwogCkBAIC0yMjksMzEgKzIyOSwzMSBAQAogICogU01JTFN1Yi5jCiAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgIENoZWNrX0RfRGF0YUJsYW5rKEJZVEUgKik7Ci1pbnQgIENoZWNrX0RfRmFpbEJsb2NrKEJZVEUgKik7Ci1pbnQgIENoZWNrX0RfRGF0YVN0YXR1cyhCWVRFICopOwotaW50ICBMb2FkX0RfTG9nQmxvY2tBZGRyKEJZVEUgKik7Ci12b2lkIENscl9EX1JlZHVuZGFudERhdGEoQllURSAqKTsKLXZvaWQgU2V0X0RfTG9nQmxvY2tBZGRyKEJZVEUgKik7Ci12b2lkIFNldF9EX0ZhaWxCbG9jayhCWVRFICopOwotdm9pZCBTZXRfRF9EYXRhU3RhdXMoQllURSAqKTsKK2ludCAgQ2hlY2tfRF9EYXRhQmxhbmsodTggKik7CitpbnQgIENoZWNrX0RfRmFpbEJsb2NrKHU4ICopOworaW50ICBDaGVja19EX0RhdGFTdGF0dXModTggKik7CitpbnQgIExvYWRfRF9Mb2dCbG9ja0FkZHIodTggKik7Cit2b2lkIENscl9EX1JlZHVuZGFudERhdGEodTggKik7Cit2b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcih1OCAqKTsKK3ZvaWQgU2V0X0RfRmFpbEJsb2NrKHU4ICopOwordm9pZCBTZXRfRF9EYXRhU3RhdXModTggKik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIFNzZmRjX0RfUmVzZXQoc3RydWN0IHVzX2RhdGEgKik7Ci1pbnQgIFNzZmRjX0RfUmVhZENpc1NlY3Qoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOworaW50ICBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOwogdm9pZCBTc2ZkY19EX1dyaXRlUmVkdE1vZGUodm9pZCk7Ci12b2lkIFNzZmRjX0RfUmVhZElEKEJZVEUgKiwgQllURSk7Ci1pbnQgIFNzZmRjX0RfUmVhZFNlY3Qoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfV3JpdGVTZWN0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9Xcml0ZUJsb2NrKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9Db3B5QmxvY2soc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwordm9pZCBTc2ZkY19EX1JlYWRJRCh1OCAqLCB1OCk7CitpbnQgIFNzZmRjX0RfUmVhZFNlY3Qoc3RydWN0IHVzX2RhdGEgKiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVTZWN0KHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1dyaXRlQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgdTE2LCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Db3B5QmxvY2soc3RydWN0IHVzX2RhdGEgKiwgdTE2LCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOwogaW50ICBTc2ZkY19EX0VyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKik7Ci1pbnQgIFNzZmRjX0RfUmVhZFJlZHREYXRhKHN0cnVjdCB1c19kYXRhICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICopOworaW50ICBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZVJlZHREYXRhKHN0cnVjdCB1c19kYXRhICosIHU4ICopOwogaW50ICBTc2ZkY19EX0NoZWNrU3RhdHVzKHZvaWQpOwotaW50ICBTZXRfRF9Tc2ZkY01vZGVsKEJZVEUpOworaW50ICBTZXRfRF9Tc2ZkY01vZGVsKHU4KTsKIHZvaWQgQ250X0RfUmVzZXQodm9pZCk7CiBpbnQgIENudF9EX1Bvd2VyT24odm9pZCk7CiB2b2lkIENudF9EX1Bvd2VyT2ZmKHZvaWQpOwpAQCAtMjYzLDI2ICsyNjMsMjYgQEAKIGludCAgQ2hlY2tfRF9DYXJkRXhpc3Qodm9pZCk7CiBpbnQgIENoZWNrX0RfQ2FyZFN0c0NoZyh2b2lkKTsKIGludCAgQ2hlY2tfRF9Tc2ZkY1dQKHZvaWQpOwotaW50ICBTTV9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOworaW50ICBTTV9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgdTggKiwgdTggKik7CiAKLWludCAgU3NmZGNfRF9SZWFkU2VjdF9ETUEoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1JlYWRTZWN0X1BJTyhzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfV3JpdGVTZWN0X0RNQShzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfV3JpdGVTZWN0X1BJTyhzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICosIEJZVEUgKik7CitpbnQgIFNzZmRjX0RfUmVhZFNlY3RfRE1BKHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1JlYWRTZWN0X1BJTyhzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZVNlY3RfRE1BKHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgdTggKiwgdTggKik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgIENoZWNrX0RfUmVhZEVycm9yKEJZVEUgKik7Ci1pbnQgIENoZWNrX0RfQ29ycmVjdChCWVRFICosIEJZVEUgKik7Ci1pbnQgIENoZWNrX0RfQ0lTZGF0YShCWVRFICosIEJZVEUgKik7Ci12b2lkIFNldF9EX1JpZ2h0RUNDKEJZVEUgKik7CitpbnQgIENoZWNrX0RfUmVhZEVycm9yKHU4ICopOworaW50ICBDaGVja19EX0NvcnJlY3QodTggKiwgdTggKik7CitpbnQgIENoZWNrX0RfQ0lTZGF0YSh1OCAqLCB1OCAqKTsKK3ZvaWQgU2V0X0RfUmlnaHRFQ0ModTggKik7CiAKIC8qCiAgKiBTTUlMRUNDLmMKICAqLwotdm9pZCBjYWxjdWxhdGVfZWNjKEJZVEUgKiwgQllURSAqLCBCWVRFICosIEJZVEUgKiwgQllURSAqKTsKLUJZVEUgY29ycmVjdF9kYXRhKEJZVEUgKiwgQllURSAqLCBCWVRFLCAgIEJZVEUsICAgQllURSk7Ci1pbnQgIF9Db3JyZWN0X0RfU3dFQ0MoQllURSAqLCBCWVRFICosIEJZVEUgKik7Ci12b2lkIF9DYWxjdWxhdGVfRF9Td0VDQyhCWVRFICosIEJZVEUgKik7Cit2b2lkIGNhbGN1bGF0ZV9lY2ModTggKiwgdTggKiwgdTggKiwgdTggKiwgdTggKik7Cit1OCBjb3JyZWN0X2RhdGEodTggKiwgdTggKiwgdTgsICAgdTgsICAgdTgpOworaW50ICBfQ29ycmVjdF9EX1N3RUNDKHU4ICosIHU4ICosIHU4ICopOwordm9pZCBfQ2FsY3VsYXRlX0RfU3dFQ0ModTggKiwgdTggKik7CiAKIHZvaWQgU01fSW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxlY2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsZWNjLmMKaW5kZXggNmI4ZjdkNy4uZmZlNjAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxlY2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbGVjYy5jCkBAIC0xMyw3ICsxMyw3IEBACiAvKiAjaW5jbHVkZSAiRU1DUklPUy5oIiAqLwogCiAvKiBDUDAtQ1A1IGNvZGUgdGFibGUgKi8KLXN0YXRpYyBCWVRFIGVjY3RhYmxlWzI1Nl0gPSB7CitzdGF0aWMgdTggZWNjdGFibGVbMjU2XSA9IHsKIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MEMsIDB4MEYsIDB4NUEsIDB4NUEsIDB4MEYsIDB4MEMsIDB4NTksIDB4MDMsCiAweDU2LCAweDU1LCAweDAwLCAweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNDLCAweDY5LCAweDZBLCAweDNGLCAweDNGLCAweDZBLAogMHg2OSwgMHgzQywgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzRiwgMHg2QSwgMHg2OSwKQEAgLTM2LDcgKzM2LDcgQEAKIDB4NUEsIDB4NUEsIDB4MEYsIDB4MEMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAKIH07CiAKLXN0YXRpYyB2b2lkICAgdHJhbnNfcmVzdWx0KEJZVEUsICAgQllURSwgICBCWVRFICosIEJZVEUgKik7CitzdGF0aWMgdm9pZCAgIHRyYW5zX3Jlc3VsdCh1OCwgICB1OCwgICB1OCAqLCB1OCAqKTsKIAogI2RlZmluZSBCSVQ3ICAgICAgICAweDgwCiAjZGVmaW5lIEJJVDYgICAgICAgIDB4NDAKQEAgLTU3LDExICs1NywxMSBAQAogICogKmVjYzE7ICogTFAxNSxMUDE0LExQMTMsLi4uCiAgKiAqZWNjMjsgKiBMUDA3LExQMDYsTFAwNSwuLi4KICAqLwotc3RhdGljIHZvaWQgdHJhbnNfcmVzdWx0KEJZVEUgcmVnMiwgQllURSByZWczLCBCWVRFICplY2MxLCBCWVRFICplY2MyKQorc3RhdGljIHZvaWQgdHJhbnNfcmVzdWx0KHU4IHJlZzIsIHU4IHJlZzMsIHU4ICplY2MxLCB1OCAqZWNjMikKIHsKLQlCWVRFIGE7IC8qIFdvcmtpbmcgZm9yIHJlZzIscmVnMyAqLwotCUJZVEUgYjsgLyogV29ya2luZyBmb3IgZWNjMSxlY2MyICovCi0JQllURSBpOyAvKiBGb3IgY291bnRpbmcgKi8KKwl1OCBhOyAvKiBXb3JraW5nIGZvciByZWcyLHJlZzMgKi8KKwl1OCBiOyAvKiBXb3JraW5nIGZvciBlY2MxLGVjYzIgKi8KKwl1OCBpOyAvKiBGb3IgY291bnRpbmcgKi8KIAogCWEgPSBCSVQ3OyBiID0gQklUNzsgLyogODBoPTEwMDAwMDAwYiAqLwogCSplY2MxID0gKmVjYzIgPSAwOyAvKiBDbGVhciBlY2MxLGVjYzIgKi8KQEAgLTk1LDIxICs5NSwyMSBAQAogICogKmVjYzI7ICogTFAwNyxMUDA2LExQMDUsLi4uCiAgKiAqZWNjMzsgKiBDUDUsQ1A0LENQMywuLi4sIjEiLCIxIgogICovCi12b2lkIGNhbGN1bGF0ZV9lY2MoQllURSAqdGFibGUsIEJZVEUgKmRhdGEsIEJZVEUgKmVjYzEsIEJZVEUgKmVjYzIsIEJZVEUgKmVjYzMpCit2b2lkIGNhbGN1bGF0ZV9lY2ModTggKnRhYmxlLCB1OCAqZGF0YSwgdTggKmVjYzEsIHU4ICplY2MyLCB1OCAqZWNjMykKIHsKLQlEV09SRCAgaTsgICAgLyogRm9yIGNvdW50aW5nICovCi0JQllURSBhOyAgICAvKiBXb3JraW5nIGZvciB0YWJsZSAqLwotCUJZVEUgcmVnMTsgLyogRC1hbGwsQ1A1LENQNCxDUDMsLi4uICovCi0JQllURSByZWcyOyAvKiBMUDE0LExQMTIsTDEwLC4uLiAqLwotCUJZVEUgcmVnMzsgLyogTFAxNSxMUDEzLEwxMSwuLi4gKi8KKwl1MzIgIGk7ICAgIC8qIEZvciBjb3VudGluZyAqLworCXU4IGE7ICAgIC8qIFdvcmtpbmcgZm9yIHRhYmxlICovCisJdTggcmVnMTsgLyogRC1hbGwsQ1A1LENQNCxDUDMsLi4uICovCisJdTggcmVnMjsgLyogTFAxNCxMUDEyLEwxMCwuLi4gKi8KKwl1OCByZWczOyAvKiBMUDE1LExQMTMsTDExLC4uLiAqLwogCiAJcmVnMSA9IHJlZzIgPSByZWczID0gMDsgICAvKiBDbGVhciBwYXJhbWV0ZXIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKIAkJYSA9IHRhYmxlW2RhdGFbaV1dOyAvKiBHZXQgQ1AwLUNQNSBjb2RlIGZyb20gdGFibGUgKi8KIAkJcmVnMSBePSAoYSZNQVNLX0NQUyk7IC8qIFhPUiB3aXRoIGEgKi8KIAkJaWYgKChhJkJJVDYpICE9IDApIHsgLyogSWYgRF9hbGwoYWxsIGJpdCBYT1IpID0gMSAqLwotCQkJcmVnMyBePSAoQllURSlpOyAvKiBYT1Igd2l0aCBjb3VudGVyICovCi0JCQlyZWcyIF49IH4oKEJZVEUpaSk7IC8qIFhPUiB3aXRoIGludi4gb2YgY291bnRlciAqLworCQkJcmVnMyBePSAodTgpaTsgLyogWE9SIHdpdGggY291bnRlciAqLworCQkJcmVnMiBePSB+KCh1OClpKTsgLyogWE9SIHdpdGggaW52LiBvZiBjb3VudGVyICovCiAJCX0KIAl9CiAKQEAgLTEyNywyMiArMTI3LDIyIEBACiAgKiBlY2MyOyAqIExQMDcsTFAwNixMUDA1LC4uLgogICogZWNjMzsgKiBDUDUsQ1A0LENQMywuLi4sIjEiLCIxIgogICovCi1CWVRFIGNvcnJlY3RfZGF0YShCWVRFICpkYXRhLCBCWVRFICplY2NkYXRhLCBCWVRFIGVjYzEsIEJZVEUgZWNjMiwgQllURSBlY2MzKQordTggY29ycmVjdF9kYXRhKHU4ICpkYXRhLCB1OCAqZWNjZGF0YSwgdTggZWNjMSwgdTggZWNjMiwgdTggZWNjMykKIHsKLQlEV09SRCBsOyAvKiBXb3JraW5nIHRvIGNoZWNrIGQgKi8KLQlEV09SRCBkOyAvKiBSZXN1bHQgb2YgY29tcGFyaXNvbiAqLwotCURXT1JEIGk7IC8qIEZvciBjb3VudGluZyAqLwotCUJZVEUgZDEsIGQyLCBkMzsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KLQlCWVRFIGE7IC8qIFdvcmtpbmcgZm9yIGFkZCAqLwotCUJZVEUgYWRkOyAvKiBCeXRlIGFkZHJlc3Mgb2YgY29yLiBEQVRBICovCi0JQllURSBiOyAvKiBXb3JraW5nIGZvciBiaXQgKi8KLQlCWVRFIGJpdDsgLyogQml0IGFkZHJlc3Mgb2YgY29yLiBEQVRBICovCisJdTMyIGw7IC8qIFdvcmtpbmcgdG8gY2hlY2sgZCAqLworCXUzMiBkOyAvKiBSZXN1bHQgb2YgY29tcGFyaXNvbiAqLworCXUzMiBpOyAvKiBGb3IgY291bnRpbmcgKi8KKwl1OCBkMSwgZDIsIGQzOyAvKiBSZXN1bHQgb2YgY29tcGFyaXNvbiAqLworCXU4IGE7IC8qIFdvcmtpbmcgZm9yIGFkZCAqLworCXU4IGFkZDsgLyogQnl0ZSBhZGRyZXNzIG9mIGNvci4gREFUQSAqLworCXU4IGI7IC8qIFdvcmtpbmcgZm9yIGJpdCAqLworCXU4IGJpdDsgLyogQml0IGFkZHJlc3Mgb2YgY29yLiBEQVRBICovCiAKIAlkMSA9IGVjYzFeZWNjZGF0YVsxXTsgZDIgPSBlY2MyXmVjY2RhdGFbMF07IC8qIENvbXBhcmUgTFAncyAqLwogCWQzID0gZWNjM15lY2NkYXRhWzJdOyAvKiBDb21wYXJlIENQJ3MgKi8KLQlkID0gKChEV09SRClkMTw8MTYpIC8qIFJlc3VsdCBvZiBjb21wYXJpc29uICovCi0JKygoRFdPUkQpZDI8PDgpCi0JKyhEV09SRClkMzsKKwlkID0gKCh1MzIpZDE8PDE2KSAvKiBSZXN1bHQgb2YgY29tcGFyaXNvbiAqLworCSsoKHUzMilkMjw8OCkKKwkrKHUzMilkMzsKIAogCWlmIChkID09IDApCiAJCXJldHVybiAwOyAvKiBJZiBObyBlcnJvciwgcmV0dXJuICovCkBAIC0xODgsOSArMTg4LDkgQEAKIAlyZXR1cm4gMzsgLyogVW5jb3JyZWN0YWJsZSBlcnJvciAqLwogfQogCi1pbnQgX0NvcnJlY3RfRF9Td0VDQyhCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudF9lY2MsIEJZVEUgKmNhbGN1bGF0ZV9lY2MpCitpbnQgX0NvcnJlY3RfRF9Td0VDQyh1OCAqYnVmLCB1OCAqcmVkdW5kYW50X2VjYywgdTggKmNhbGN1bGF0ZV9lY2MpCiB7Ci0JRFdPUkQgZXJyOworCXUzMiBlcnI7CiAKIAllcnIgPSBjb3JyZWN0X2RhdGEoYnVmLCByZWR1bmRhbnRfZWNjLCAqKGNhbGN1bGF0ZV9lY2MgKyAxKSwKIAkJCSAgICooY2FsY3VsYXRlX2VjYyksICooY2FsY3VsYXRlX2VjYyArIDIpKTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCXJldHVybiAtMTsKIH0KIAotdm9pZCBfQ2FsY3VsYXRlX0RfU3dFQ0MoQllURSAqYnVmLCBCWVRFICplY2MpCit2b2lkIF9DYWxjdWxhdGVfRF9Td0VDQyh1OCAqYnVmLCB1OCAqZWNjKQogewogCWNhbGN1bGF0ZV9lY2MoZWNjdGFibGUsIGJ1ZiwgZWNjKzEsIGVjYyswLCBlY2MrMik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsbWFpbi5jCmluZGV4IDA5ZDA3ZTAuLmZjN2NiYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsbWFpbi5jCkBAIC00LDExICs0LDExIEBACiAjaW5jbHVkZSAic21jb21tb24uaCIKICNpbmNsdWRlICJzbWlsLmgiCiAKLXN0YXRpYyBpbnQgICAgICAgICBDb252X0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICosIERXT1JEKTsKK3N0YXRpYyBpbnQgICAgICAgICBDb252X0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICosIHUzMik7CiBzdGF0aWMgaW50ICAgICAgICAgSW5jX0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICopOwotc3RhdGljIGludCAgICAgICAgIE1lZGlhX0RfUmVhZE9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKK3N0YXRpYyBpbnQgICAgICAgICBNZWRpYV9EX1JlYWRPbmVTZWN0KHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKik7CiAKLXN0YXRpYyBpbnQgIENvcHlfRF9CbG9ja0FsbChzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CitzdGF0aWMgaW50ICBDb3B5X0RfQmxvY2tBbGwoc3RydWN0IHVzX2RhdGEgKiwgdTMyKTsKIAogc3RhdGljIGludCAgQXNzaWduX0RfV3JpdGVCbG9jayh2b2lkKTsKIHN0YXRpYyBpbnQgIFJlbGVhc2VfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKik7CkBAIC0xNiw3ICsxNiw3IEBACiBzdGF0aWMgaW50ICBSZWxlYXNlX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqKTsKIAogc3RhdGljIGludCAgQ29weV9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKik7Ci1zdGF0aWMgaW50ICBSZWFkX0RfUGh5T25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOworc3RhdGljIGludCAgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKiwgdTE2LCB1OCAqKTsKIHN0YXRpYyBpbnQgIEVyYXNlX0RfUGh5T25lQmxvY2soc3RydWN0IHVzX2RhdGEgKik7CiAKIHN0YXRpYyBpbnQgIFNldF9EX1BoeUZtdFZhbHVlKHN0cnVjdCB1c19kYXRhICopOwpAQCAtMjUsMjQgKzI1LDI0IEBACiAKIHN0YXRpYyBpbnQgIE1hcmtGYWlsX0RfUGh5T25lQmxvY2soc3RydWN0IHVzX2RhdGEgKik7CiAKLXN0YXRpYyBEV09SRCBFcnJDb2RlOwotc3RhdGljIEJZVEUgIFdvcmtCdWZbU0VDVFNJWkVdOwotc3RhdGljIEJZVEUgIFJlZHVuZGFudFtSRURUU0laRV07Ci1zdGF0aWMgQllURSAgV29ya1JlZHVuZFtSRURUU0laRV07CitzdGF0aWMgdTMyIEVyckNvZGU7CitzdGF0aWMgdTggIFdvcmtCdWZbU0VDVFNJWkVdOworc3RhdGljIHU4ICBSZWR1bmRhbnRbUkVEVFNJWkVdOworc3RhdGljIHU4ICBXb3JrUmVkdW5kW1JFRFRTSVpFXTsKIC8qIDEyOCB4IDEwMDAsIExvZzJQaHlbTUFYX1pPTkVOVU1dW01BWF9MT0dCTE9DS107ICovCi1zdGF0aWMgV09SRCAgKkxvZzJQaHlbTUFYX1pPTkVOVU1dOwotc3RhdGljIEJZVEUgIEFzc2lnbltNQVhfWk9ORU5VTV1bTUFYX0JMT0NLTlVNIC8gOF07Ci1zdGF0aWMgV09SRCAgQXNzaWduU3RhcnRbTUFYX1pPTkVOVU1dOwotV09SRCAgUmVhZEJsb2NrOwotV09SRCAgV3JpdGVCbG9jazsKLURXT1JEIE1lZGlhQ2hhbmdlOwotc3RhdGljIERXT1JEIFNlY3RDb3B5TW9kZTsKK3N0YXRpYyB1MTYgICpMb2cyUGh5W01BWF9aT05FTlVNXTsKK3N0YXRpYyB1OCAgQXNzaWduW01BWF9aT05FTlVNXVtNQVhfQkxPQ0tOVU0gLyA4XTsKK3N0YXRpYyB1MTYgIEFzc2lnblN0YXJ0W01BWF9aT05FTlVNXTsKK3UxNiAgUmVhZEJsb2NrOwordTE2ICBXcml0ZUJsb2NrOwordTMyIE1lZGlhQ2hhbmdlOworc3RhdGljIHUzMiBTZWN0Q29weU1vZGU7CiAKIC8qIEJJVCBDb250cm9sIE1hY3JvICovCi1zdGF0aWMgQllURSBCaXREYXRhW10gPSB7IDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAgfTsKLSNkZWZpbmUgU2V0X0RfQml0KGEsIGIpICAgIChhWyhCWVRFKSgoYikgLyA4KV0gfD0gQml0RGF0YVsoYikgJSA4XSkKLSNkZWZpbmUgQ2xyX0RfQml0KGEsIGIpICAgIChhWyhCWVRFKSgoYikgLyA4KV0gJj0gfkJpdERhdGFbKGIpICUgOF0pCi0jZGVmaW5lIENoa19EX0JpdChhLCBiKSAgICAoYVsoQllURSkoKGIpIC8gOCldICYgQml0RGF0YVsoYikgJSA4XSkKK3N0YXRpYyB1OCBCaXREYXRhW10gPSB7IDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAgfTsKKyNkZWZpbmUgU2V0X0RfQml0KGEsIGIpICAgIChhWyh1OCkoKGIpIC8gOCldIHw9IEJpdERhdGFbKGIpICUgOF0pCisjZGVmaW5lIENscl9EX0JpdChhLCBiKSAgICAoYVsodTgpKChiKSAvIDgpXSAmPSB+Qml0RGF0YVsoYikgJSA4XSkKKyNkZWZpbmUgQ2hrX0RfQml0KGEsIGIpICAgIChhWyh1OCkoKGIpIC8gOCldICYgQml0RGF0YVsoYikgJSA4XSkKIAogLyogLS0tLS0gU01fRnJlZU1lbSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBTTV9GcmVlTWVtKHZvaWQpCkBAIC02Miw5ICs2Miw5IEBACiAKIC8qIFNtYXJ0TWVkaWEgUmVhZC9Xcml0ZS9FcmFzZSBGdW5jdGlvbiAqLwogLyogLS0tLS0gTWVkaWFfRF9SZWFkU2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IE1lZGlhX0RfUmVhZFNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIHN0YXJ0LCBXT1JEIGNvdW50LCBCWVRFICpidWYpCitpbnQgTWVkaWFfRF9SZWFkU2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cywgdTMyIHN0YXJ0LCB1MTYgY291bnQsIHU4ICpidWYpCiB7Ci0JV09SRCBsZW4sIGJuOworCXUxNiBsZW4sIGJuOwogCiAJaWYgKENvbnZfRF9NZWRpYUFkZHIodXMsIHN0YXJ0KSkKIAkJcmV0dXJuIEVyckNvZGU7CkBAIC05Nyw5ICs5Nyw5IEBACiB9CiAvKiBoZXJlICovCiAvKiAtLS0tLSBNZWRpYV9EX0NvcHlTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBNZWRpYV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBzdGFydCwgV09SRCBjb3VudCwgQllURSAqYnVmKQoraW50IE1lZGlhX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUzMiBzdGFydCwgdTE2IGNvdW50LCB1OCAqYnVmKQogewotCVdPUkQgbGVuLCBibjsKKwl1MTYgbGVuLCBibjsKIAogCS8qIHByX2luZm8oIk1lZGlhX0RfQ29weVNlY3RvciAhISFcbiIpOyAqLwogCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCkBAIC0xODYsMTIgKzE4NiwxMiBAQAogCiAvKiBTbWFydE1lZGlhIFBoeXNpY2FsIEFkZHJlc3MgQ29udHJvbCBTdWJyb3V0aW5lICovCiAvKiAtLS0tLSBDb252X0RfTWVkaWFBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgaW50IENvbnZfRF9NZWRpYUFkZHIoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBhZGRyKQorc3RhdGljIGludCBDb252X0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICp1cywgdTMyIGFkZHIpCiB7Ci0JRFdPUkQgdGVtcDsKKwl1MzIgdGVtcDsKIAogCXRlbXAgICAgICAgICAgID0gYWRkciAvIFNzZmRjLk1heFNlY3RvcnM7Ci0JTWVkaWEuWm9uZSAgICAgPSAoQllURSkgKHRlbXAgLyBTc2ZkYy5NYXhMb2dCbG9ja3MpOworCU1lZGlhLlpvbmUgICAgID0gKHU4KSAodGVtcCAvIFNzZmRjLk1heExvZ0Jsb2Nrcyk7CiAKIAlpZiAoTG9nMlBoeVtNZWRpYS5ab25lXSA9PSBOVUxMKSB7CiAJCWlmIChNYWtlX0RfTG9nVGFibGUodXMpKSB7CkBAIC0yMDAsOCArMjAwLDggQEAKIAkJfQogCX0KIAotCU1lZGlhLlNlY3RvciAgID0gKEJZVEUpIChhZGRyICUgU3NmZGMuTWF4U2VjdG9ycyk7Ci0JTWVkaWEuTG9nQmxvY2sgPSAoV09SRCkgKHRlbXAgJSBTc2ZkYy5NYXhMb2dCbG9ja3MpOworCU1lZGlhLlNlY3RvciAgID0gKHU4KSAoYWRkciAlIFNzZmRjLk1heFNlY3RvcnMpOworCU1lZGlhLkxvZ0Jsb2NrID0gKHUxNikgKHRlbXAgJSBTc2ZkYy5NYXhMb2dCbG9ja3MpOwogCiAJaWYgKE1lZGlhLlpvbmUgPCBTc2ZkYy5NYXhab25lcykgewogCQlDbHJfRF9SZWR1bmRhbnREYXRhKFJlZHVuZGFudCk7CkBAIC0yMTcsNyArMjE3LDcgQEAKIC8qIC0tLS0tIEluY19EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgSW5jX0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQlXT1JEICAgICAgICBMb2dCbG9jayA9IE1lZGlhLkxvZ0Jsb2NrOworCXUxNiAgICAgICAgTG9nQmxvY2sgPSBNZWRpYS5Mb2dCbG9jazsKIAogCWlmICgrK01lZGlhLlNlY3RvciA8IFNzZmRjLk1heFNlY3RvcnMpCiAJCXJldHVybiBTTVNVQ0NFU1M7CkBAIC0yNjUsOSArMjY1LDkgQEAKIAogLyogU21hcnRNZWRpYSBSZWFkL1dyaXRlIFN1YnJvdXRpbmUgd2l0aCBSZXRyeSAqLwogLyogLS0tLS0gTWVkaWFfRF9SZWFkT25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBNZWRpYV9EX1JlYWRPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmKQorc3RhdGljIGludCBNZWRpYV9EX1JlYWRPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGNvdW50LCB1OCAqYnVmKQogewotCURXT1JEIGVyciwgcmV0cnk7CisJdTMyIGVyciwgcmV0cnk7CiAKIAlpZiAoIVJlYWRfRF9QaHlPbmVTZWN0KHVzLCBjb3VudCwgYnVmKSkKIAkJcmV0dXJuIFNNU1VDQ0VTUzsKQEAgLTMwOSw5ICszMDksOSBAQAogCiAvKiBTbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBEYXRhIENvcHkgU3Vicm91dGluZSAqLwogLyogLS0tLS0gQ29weV9EX0Jsb2NrQWxsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBDb3B5X0RfQmxvY2tBbGwoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBtb2RlKQorc3RhdGljIGludCBDb3B5X0RfQmxvY2tBbGwoc3RydWN0IHVzX2RhdGEgKnVzLCB1MzIgbW9kZSkKIHsKLQlCWVRFIHNlY3Q7CisJdTggc2VjdDsKIAogCXNlY3QgPSBNZWRpYS5TZWN0b3I7CiAKQEAgLTM4MSw3ICszODEsNyBAQAogLyogLS0tLS0gUmVsZWFzZV9EX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludCBSZWxlYXNlX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQlEV09SRCBtb2RlOworCXUzMiBtb2RlOwogCiAJbW9kZSA9IFNlY3RDb3B5TW9kZTsKIAlTZWN0Q29weU1vZGUgPSBDT01QTEVURUQ7CkBAIC00MzAsNyArNDMwLDcgQEAKIHN0YXRpYyBpbnQgQ29weV9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCWludCAgICAgICAgICAgaTsKLQlEV09SRCAgZXJyLCByZXRyeTsKKwl1MzIgIGVyciwgcmV0cnk7CiAKIAkvKiBwcl9pbmZvKCJDb3B5X0RfUGh5T25lU2VjdCAtLS0gU2VjdG9yID0gJXhcbiIsIE1lZGlhLlNlY3Rvcik7ICovCiAJaWYgKFJlYWRCbG9jayAhPSBOT19BU1NJR04pIHsKQEAgLTUwNCwxMCArNTA0LDEwIEBACiAKIC8qIFNtYXJ0TWVkaWEgUGh5c2ljYWwgU2VjdG9yIFJlYWQvV3JpdGUvRXJhc2UgU3Vicm91dGluZSAqLwogLyogLS0tLS0gUmVhZF9EX1BoeU9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBSZWFkX0RfUGh5T25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKK3N0YXRpYyBpbnQgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCB1MTYgY291bnQsIHU4ICpidWYpCiB7CiAJaW50ICAgICAgICAgICBpOwotCURXT1JEICByZXRyeTsKKwl1MzIgIHJldHJ5OwogCiAJaWYgKE1lZGlhLlBoeUJsb2NrID09IE5PX0FTU0lHTikgewogCQlmb3IgKGkgPSAwOyBpIDwgU0VDVFNJWkU7IGkrKykKQEAgLTYzNywxMCArNjM3LDEwIEBACiAvKiAtLS0tLSBNYWtlX0RfTG9nVGFibGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IE1ha2VfRF9Mb2dUYWJsZShzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JV09SRCAgcGh5YmxvY2ssIGxvZ2Jsb2NrOworCXUxNiAgcGh5YmxvY2ssIGxvZ2Jsb2NrOwogCiAJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV0gPT0gTlVMTCkgewotCQlMb2cyUGh5W01lZGlhLlpvbmVdID0ga21hbGxvYyhNQVhfTE9HQkxPQ0sgKiBzaXplb2YoV09SRCksCisJCUxvZzJQaHlbTWVkaWEuWm9uZV0gPSBrbWFsbG9jKE1BWF9MT0dCTE9DSyAqIHNpemVvZih1MTYpLAogCQkJCQkJCQlHRlBfS0VSTkVMKTsKIAkJLyogcHJfaW5mbygiRXhBbGxvY2F0ZVBvb2wgWm9uZSA9ICV4LCBBZGRyID0gJXhcbiIsCiAJCQkJTWVkaWEuWm9uZSwgTG9nMlBoeVtNZWRpYS5ab25lXSk7ICovCkBAIC02OTMsNyArNjkzLDcgQEAKIAogCQlwaHlibG9jayAgICAgPSBNZWRpYS5QaHlCbG9jazsKIAkJbG9nYmxvY2sgICAgID0gTWVkaWEuTG9nQmxvY2s7Ci0JCU1lZGlhLlNlY3RvciA9IChCWVRFKShTc2ZkYy5NYXhTZWN0b3JzIC0gMSk7CisJCU1lZGlhLlNlY3RvciA9ICh1OCkoU3NmZGMuTWF4U2VjdG9ycyAtIDEpOwogCiAJCWlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YSh1cywgUmVkdW5kYW50KSkgewogCQkJU3NmZGNfRF9SZXNldCh1cyk7CkBAIC03MzgsNyArNzM4LDcgQEAKIC8qIC0tLS0tIE1hcmtGYWlsX0RfUGh5T25lQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgTWFya0ZhaWxfRF9QaHlPbmVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JQllURSBzZWN0OworCXU4IHNlY3Q7CiAKIAlzZWN0ID0gTWVkaWEuU2VjdG9yOwogCVNldF9EX0ZhaWxCbG9jayhXb3JrUmVkdW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCmluZGV4IDE2ZGE5YTkuLjQ0Y2VkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYwpAQCAtNiwxNiArNiwxNiBAQAogI2luY2x1ZGUgInNtY29tbW9uLmgiCiAjaW5jbHVkZSAic21pbC5oIgogCi1zdGF0aWMgQllURSAgIF9DaGVja19EX0RldkNvZGUoQllURSk7Ci1zdGF0aWMgRFdPUkQJRXJyWERDb2RlOwotc3RhdGljIEJZVEUJSXNTU0ZEQ0NvbXBsaWFuY2U7Ci1zdGF0aWMgQllURQlJc1hEQ29tcGxpYW5jZTsKK3N0YXRpYyB1OCAgIF9DaGVja19EX0RldkNvZGUodTgpOworc3RhdGljIHUzMglFcnJYRENvZGU7CitzdGF0aWMgdTgJSXNTU0ZEQ0NvbXBsaWFuY2U7CitzdGF0aWMgdTgJSXNYRENvbXBsaWFuY2U7CiAKIHN0cnVjdCBrZXVjcl9tZWRpYV9pbmZvICAgICAgICAgU3NmZGM7CiBzdHJ1Y3Qga2V1Y3JfbWVkaWFfYWRkcmVzcyAgICAgIE1lZGlhOwogc3RydWN0IGtldWNyX21lZGlhX2FyZWEgICAgICAgICBDaXNBcmVhOwogCi1zdGF0aWMgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2NCdWZbNl07CitzdGF0aWMgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNjQnVmWzZdOwogCiAjZGVmaW5lIEVWRU4gICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgLyogRXZlbiBQYWdlIGZvciAyNTZieXRlL3BhZ2UgKi8KICNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvKiBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlICovCkBAIC0yNCw3ICsyNCw3IEBACiAvKiBTbWFydE1lZGlhIFJlZHVuZGFudCBidWZmZXIgZGF0YSBDb250cm9sIFN1YnJvdXRpbmUKICAqLS0tLS0gQ2hlY2tfRF9EYXRhQmxhbmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1pbnQgQ2hlY2tfRF9EYXRhQmxhbmsoQllURSAqcmVkdW5kYW50KQoraW50IENoZWNrX0RfRGF0YUJsYW5rKHU4ICpyZWR1bmRhbnQpCiB7CiAJY2hhciBpOwogCkBAIC0zNiw3ICszNiw3IEBACiB9CiAKIC8qIC0tLS0tIENoZWNrX0RfRmFpbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBDaGVja19EX0ZhaWxCbG9jayhCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9GYWlsQmxvY2sodTggKnJlZHVuZGFudCkKIHsKIAlyZWR1bmRhbnQgKz0gUkVEVF9CTE9DSzsKIApAQCAtNTEsNyArNTEsNyBAQAogfQogCiAvKiAtLS0tLSBDaGVja19EX0RhdGFTdGF0dXMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgQ2hlY2tfRF9EYXRhU3RhdHVzKEJZVEUgKnJlZHVuZGFudCkKK2ludCBDaGVja19EX0RhdGFTdGF0dXModTggKnJlZHVuZGFudCkKIHsKIAlyZWR1bmRhbnQgKz0gUkVEVF9EQVRBOwogCkBAIC03MCwxNCArNzAsMTQgQEAKIH0KIAogLyogLS0tLS0gTG9hZF9EX0xvZ0Jsb2NrQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IExvYWRfRF9Mb2dCbG9ja0FkZHIoQllURSAqcmVkdW5kYW50KQoraW50IExvYWRfRF9Mb2dCbG9ja0FkZHIodTggKnJlZHVuZGFudCkKIHsKLQlXT1JEIGFkZHIxLCBhZGRyMjsKKwl1MTYgYWRkcjEsIGFkZHIyOwogCi0JYWRkcjEgPSAoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKSoweDAxMDAgKwotCQkJCQkoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKLQlhZGRyMiA9IChXT1JEKSoocmVkdW5kYW50ICsgUkVEVF9BRERSMkgpKjB4MDEwMCArCi0JCQkJCShXT1JEKSoocmVkdW5kYW50ICsgUkVEVF9BRERSMkwpOworCWFkZHIxID0gKHUxNikqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKSoweDAxMDAgKworCQkJCQkodTE2KSoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOworCWFkZHIyID0gKHUxNikqKHJlZHVuZGFudCArIFJFRFRfQUREUjJIKSoweDAxMDAgKworCQkJCQkodTE2KSoocmVkdW5kYW50ICsgUkVEVF9BRERSMkwpOwogCiAJaWYgKGFkZHIxID09IGFkZHIyKQogCQlpZiAoKGFkZHIxICYgMHhGMDAwKSA9PSAweDEwMDApIHsKQEAgLTg1LDcgKzg1LDcgQEAKIAkJCXJldHVybiBTTVNVQ0NFU1M7CiAJCX0KIAotCWlmIChod2VpZ2h0MTYoKFdPUkQpKGFkZHIxXmFkZHIyKSkgIT0gMHgwMSkKKwlpZiAoaHdlaWdodDE2KCh1MTYpKGFkZHIxXmFkZHIyKSkgIT0gMHgwMSkKIAkJcmV0dXJuIEVSUk9SOwogCiAJaWYgKChhZGRyMSAmIDB4RjAwMCkgPT0gMHgxMDAwKQpAQCAtMTA0LDcgKzEwNCw3IEBACiB9CiAKIC8qIC0tLS0tIENscl9EX1JlZHVuZGFudERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgQ2xyX0RfUmVkdW5kYW50RGF0YShCWVRFICpyZWR1bmRhbnQpCit2b2lkIENscl9EX1JlZHVuZGFudERhdGEodTggKnJlZHVuZGFudCkKIHsKIAljaGFyIGk7CiAKQEAgLTExMyw5ICsxMTMsOSBAQAogfQogCiAvKiAtLS0tLSBTZXRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCit2b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcih1OCAqcmVkdW5kYW50KQogewotCVdPUkQgYWRkcjsKKwl1MTYgYWRkcjsKIAogCSoocmVkdW5kYW50ICsgUkVEVF9CTE9DSykgPSAweEZGOwogCSoocmVkdW5kYW50ICsgUkVEVF9EQVRBKSA9IDB4RkY7CkBAIC0xMjUsMjAgKzEyNSwyMCBAQAogCQlhZGRyKys7CiAKIAkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKSA9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMkgpID0KLQkJCQkJCQkoQllURSkoYWRkciAvIDB4MDEwMCk7Ci0JKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKSA9IChCWVRFKWFkZHI7CisJCQkJCQkJKHU4KShhZGRyIC8gMHgwMTAwKTsKKwkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKSA9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMkwpID0gKHU4KWFkZHI7CiB9CiAKIC8qLS0tLS0gU2V0X0RfRmFpbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBTZXRfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQordm9pZCBTZXRfRF9GYWlsQmxvY2sodTggKnJlZHVuZGFudCkKIHsKIAljaGFyIGk7CiAJZm9yIChpID0gMDsgaSA8IFJFRFRTSVpFOyBpKyspCi0JCSpyZWR1bmRhbnQrKyA9IChCWVRFKSgoaSA9PSBSRURUX0JMT0NLKSA/IDB4RjAgOiAweEZGKTsKKwkJKnJlZHVuZGFudCsrID0gKHU4KSgoaSA9PSBSRURUX0JMT0NLKSA/IDB4RjAgOiAweEZGKTsKIH0KIAogLyogLS0tLS0gU2V0X0RfRGF0YVN0YXVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBTZXRfRF9EYXRhU3RhdXMoQllURSAqcmVkdW5kYW50KQordm9pZCBTZXRfRF9EYXRhU3RhdXModTggKnJlZHVuZGFudCkKIHsKIAlyZWR1bmRhbnQgKz0gUkVEVF9EQVRBOwogCSpyZWR1bmRhbnQgPSAweDAwOwpAQCAtMTU0LDEwICsxNTQsMTAgQEAKIH0KIAogLyogLS0tLS0gU3NmZGNfRF9SZWFkQ2lzU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFNzZmRjX0RfUmVhZENpc1NlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgdTggKmJ1ZiwgdTggKnJlZHVuZGFudCkKIHsKLQlCWVRFIHpvbmUsIHNlY3RvcjsKLQlXT1JEIGJsb2NrOworCXU4IHpvbmUsIHNlY3RvcjsKKwl1MTYgYmxvY2s7CiAKIAl6b25lID0gTWVkaWEuWm9uZTsgYmxvY2sgPSBNZWRpYS5QaHlCbG9jazsgc2VjdG9yID0gTWVkaWEuU2VjdG9yOwogCU1lZGlhLlpvbmUgPSAwOwpAQCAtMTc3LDExICsxNzcsMTEgQEAKIAogLyogNjI1MCBDTUQgMSAqLwogLyogLS0tLS0gU3NmZGNfRF9SZWFkU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFNzZmRjX0RfUmVhZFNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgdTggKmJ1ZiwgdTggKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQlXT1JECWFkZHI7CisJdTE2CWFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CkBAIC0xOTAsOCArMTkwLDggQEAKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKLQlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOworCWFkZHIgPSAodTE2KU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKHUxNilTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOwogCiAJLyogUmVhZCBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwpAQCAtMjAwLDggKzIwMCw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAliY2ItPkNEQlsxXQkJCT0gMHgwMjsKLQliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzRdCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQlszXQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKQEAgLTIxNSw4ICsyMTUsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCWJjYi0+Q0RCWzhdCQkJPSAwOwogCWJjYi0+Q0RCWzldCQkJPSAxOwpAQCAtMjI5LDEyICsyMjksMTIgQEAKIH0KIAogLyogLS0tLS0gU3NmZGNfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZiwKLQkJCQkJCQlCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCB1MTYgY291bnQsIHU4ICpidWYsCisJCQkJCQkJdTggKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQlXT1JECWFkZHI7CisJdTE2CWFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CkBAIC0yNDMsOCArMjQzLDggQEAKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKLQlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOworCWFkZHIgPSAodTE2KU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKHUxNilTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOwogCiAJLyogUmVhZCBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwpAQCAtMjUzLDggKzI1Myw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAliY2ItPkNEQlsxXQkJCT0gMHgwMjsKLQliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzRdCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQlszXQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKQEAgLTI2OCw4ICsyNjgsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCWJjYi0+Q0RCWzhdCQkJPSAwOwogCWJjYi0+Q0RCWzldCQkJPSAxOwpAQCAtMjgzLDEyICsyODMsMTIgQEAKIAogCiAvKiAtLS0tLSBTc2ZkY19EX0NvcHlCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9Db3B5QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYsCi0JCQkJCQkJQllURSAqcmVkdW5kYW50KQoraW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGNvdW50LCB1OCAqYnVmLAorCQkJCQkJCXU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlSZWFkQWRkciwgV3JpdGVBZGRyOworCXUxNglSZWFkQWRkciwgV3JpdGVBZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtMjk3LDEwICsyOTcsMTAgQEAKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlSZWFkQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgUmVhZEJsb2NrOwotCVJlYWRBZGRyID0gUmVhZEFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKLQlXcml0ZUFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIFdyaXRlQmxvY2s7Ci0JV3JpdGVBZGRyID0gV3JpdGVBZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7CisJUmVhZEFkZHIgPSAodTE2KU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgUmVhZEJsb2NrOworCVJlYWRBZGRyID0gUmVhZEFkZHIqKHUxNilTc2ZkYy5NYXhTZWN0b3JzOworCVdyaXRlQWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBXcml0ZUJsb2NrOworCVdyaXRlQWRkciA9IFdyaXRlQWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnM7CiAKIAkvKiBXcml0ZSBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwpAQCAtMzA5LDE2ICszMDksMTYgQEAKIAliY2ItPkZsYWdzCQkJPSAweDAwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwogCWJjYi0+Q0RCWzFdCQkJPSAweDA4OwotCWJjYi0+Q0RCWzddCQkJPSAoQllURSlXcml0ZUFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShXcml0ZUFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzddCQkJPSAodTgpV3JpdGVBZGRyOworCWJjYi0+Q0RCWzZdCQkJPSAodTgpKFdyaXRlQWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKTsKIAliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCk7CiAJYmNiLT5DREJbMTBdCQk9IE1lZGlhLlNlY3RvcjsKIAogCWlmIChSZWFkQmxvY2sgIT0gTk9fQVNTSUdOKSB7Ci0JCWJjYi0+Q0RCWzRdCQk9IChCWVRFKVJlYWRBZGRyOwotCQliY2ItPkNEQlszXQkJPSAoQllURSkoUmVhZEFkZHIgLyAweDAxMDApOworCQliY2ItPkNEQls0XQkJPSAodTgpUmVhZEFkZHI7CisJCWJjYi0+Q0RCWzNdCQk9ICh1OCkoUmVhZEFkZHIgLyAweDAxMDApOwogCQliY2ItPkNEQlsyXQkJPSBNZWRpYS5ab25lIC8gMjsKIAl9IGVsc2UKIAkJYmNiLT5DREJbMTFdCT0gMTsKQEAgLTMzMSwxMSArMzMxLDExIEBACiB9CiAKIC8qIC0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqYnVmLCB1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJYWRkcjsKKwl1MTYJYWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTM0NSw4ICszNDUsOCBAQAogCX0KIAogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCS8qIFdyaXRlIHNlY3QgZGF0YSAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CkBAIC0zNTUsOCArMzU1LDggQEAKIAliY2ItPkZsYWdzCQkJPSAweDAwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwogCWJjYi0+Q0RCWzFdCQkJPSAweDA0OwotCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbN10JCQk9ICh1OClhZGRyOworCWJjYi0+Q0RCWzZdCQkJPSAodTgpKGFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCk7CiAJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOwpAQCAtMzc0LDcgKzM3NCw3IEBACiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlhZGRyOworCXUxNglhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtMzgzLDggKzM4Myw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9yczsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtMzkyLDggKzM5Miw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMjsKIAliY2ItPkNEQlsxXQkJCT0gMHgwNjsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzddCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7CkBAIC00MDUsMTIgKzQwNSwxMiBAQAogCiAvKiA2MjUwIENNRCAyICovCiAvKi0tLS0tIFNzZmRjX0RfUmVhZFJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlhZGRyOwotCUJZVEUJKmJ1ZjsKKwl1MTYJYWRkcjsKKwl1OAkqYnVmOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtNDE5LDggKzQxOSw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtNDI4LDggKzQyOCw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAliY2ItPkNEQlsxXQkJCT0gMHgwMzsKLQliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzRdCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQlszXQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9IDA7CiAJYmNiLT5DREJbOV0JCQk9IDE7CkBAIC00NDYsMTEgKzQ0NiwxMSBAQAogCiAvKiA2MjUwIENNRCA0ICovCiAvKiAtLS0tLSBTc2ZkY19EX1dyaXRlUmVkdERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9Xcml0ZVJlZHREYXRhKHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqcmVkdW5kYW50KQoraW50IFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKKwl1MTYgICAgICAgICAgICAgICAgICAgIGFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CkBAIC00NTksOCArNDU5LDggQEAKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKLQlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOworCWFkZHIgPSAodTE2KU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKHUxNilTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOwogCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CkBAIC00NjgsOCArNDY4LDggQEAKIAliY2ItPkZsYWdzCQkJPSAweDgwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwogCWJjYi0+Q0RCWzFdCQkJPSAweDA1OwotCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbN10JCQk9ICh1OClhZGRyOworCWJjYi0+Q0RCWzZdCQkJPSAodTgpKGFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCk7CiAJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOwpAQCAtNDkyLDcgKzQ5Miw3IEBACiAvKiBTbWFydE1lZGlhIElEIENvZGUgQ2hlY2sgJiBNb2RlIFNldCBTdWJyb3V0aW5lCiAgKiAtLS0tLSBTZXRfRF9Tc2ZkY01vZGVsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWludCBTZXRfRF9Tc2ZkY01vZGVsKEJZVEUgZGNvZGUpCitpbnQgU2V0X0RfU3NmZGNNb2RlbCh1OCBkY29kZSkKIHsKIAlzd2l0Y2ggKF9DaGVja19EX0RldkNvZGUoZGNvZGUpKSB7CiAJY2FzZSBTU0ZEQzFNQjoKQEAgLTYwMCw3ICs2MDAsNyBAQAogfQogCiAvKiAtLS0tLSBfQ2hlY2tfRF9EZXZDb2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CWVRFIF9DaGVja19EX0RldkNvZGUoQllURSBkY29kZSkKK3N0YXRpYyB1OCBfQ2hlY2tfRF9EZXZDb2RlKHU4IGRjb2RlKQogewogCXN3aXRjaCAoZGNvZGUpIHsKIAljYXNlIDB4NkU6CkBAIC02MzAsMjEgKzYzMCwyMSBAQAogLyogU21hcnRNZWRpYSBFQ0MgQ29udHJvbCBTdWJyb3V0aW5lCiAgKiAtLS0tLSBDaGVja19EX1JlYWRFcnJvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IENoZWNrX0RfUmVhZEVycm9yKEJZVEUgKnJlZHVuZGFudCkKK2ludCBDaGVja19EX1JlYWRFcnJvcih1OCAqcmVkdW5kYW50KQogewogCXJldHVybiBTTVNVQ0NFU1M7CiB9CiAKIC8qIC0tLS0tIENoZWNrX0RfQ29ycmVjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBDaGVja19EX0NvcnJlY3QoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9Db3JyZWN0KHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7CiAJcmV0dXJuIFNNU1VDQ0VTUzsKIH0KIAogLyogLS0tLS0gQ2hlY2tfRF9DSVNkYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IENoZWNrX0RfQ0lTZGF0YShCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBDaGVja19EX0NJU2RhdGEodTggKmJ1ZiwgdTggKnJlZHVuZGFudCkKIHsKLQlCWVRFIGNpc1tdID0gezB4MDEsIDB4MDMsIDB4RDksIDB4MDEsIDB4RkYsIDB4MTgsIDB4MDIsCisJdTggY2lzW10gPSB7MHgwMSwgMHgwMywgMHhEOSwgMHgwMSwgMHhGRiwgMHgxOCwgMHgwMiwKIAkJICAgICAgMHhERiwgMHgwMSwgMHgyMH07CiAKIAlpbnQgY2lzX2xlbiA9IHNpemVvZihjaXMpOwpAQCAtNjY5LDcgKzY2OSw3IEBACiB9CiAKIC8qIC0tLS0tIFNldF9EX1JpZ2h0RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBTZXRfRF9SaWdodEVDQyhCWVRFICpyZWR1bmRhbnQpCit2b2lkIFNldF9EX1JpZ2h0RUNDKHU4ICpyZWR1bmRhbnQpCiB7CiAJLyogRHJpdmVyIEVDQyBDaGVjayAqLwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbXNjc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbXNjc2kuYwppbmRleCA1YzAzZWNhLi4yMDg1OGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21zY3NpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3Ntc2NzaS5jCkBAIC02OCw3ICs2OCw3IEBACiAvKiAtLS0tLSBTTV9TQ1NJX0lucXVpcnkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgU01fU0NTSV9JbnF1aXJ5KHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewotCUJZVEUgZGF0YV9wdHJbMzZdID0gezB4MDAsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsCisJdTggZGF0YV9wdHJbMzZdID0gezB4MDAsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsCiAJCQkJIDB4NTUsIDB4NTMsIDB4NDIsIDB4MzIsIDB4MkUsIDB4MzAsIDB4MjAsCiAJCQkJIDB4MjAsIDB4NDMsIDB4NjEsIDB4NzIsIDB4NjQsIDB4NTIsIDB4NjUsCiAJCQkJIDB4NjEsIDB4NjQsIDB4NjUsIDB4NzIsIDB4MjAsIDB4MjAsIDB4MjAsCkBAIC04Miw5ICs4Miw5IEBACiAvKiAtLS0tLSBTTV9TQ1NJX01vZGVfU2Vuc2UoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgU01fU0NTSV9Nb2RlX1NlbnNlKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewotCUJZVEUJbWVkaWFOb1dQWzEyXSA9IHsweDBiLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLAorCXU4CW1lZGlhTm9XUFsxMl0gPSB7MHgwYiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwKIAkJCQkweDcxLCAweGMwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKLQlCWVRFCW1lZGlhV1BbMTJdICAgPSB7MHgwYiwgMHgwMCwgMHg4MCwgMHgwOCwgMHgwMCwgMHgwMCwKKwl1OAltZWRpYVdQWzEyXSAgID0gezB4MGIsIDB4MDAsIDB4ODAsIDB4MDgsIDB4MDAsIDB4MDAsCiAJCQkJMHg3MSwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07CiAKIAlpZiAodXMtPlNNX1N0YXR1cy5XdFApCkBAIC0xMDEsOSArMTAxLDkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKLQlEV09SRCAgIGJsX251bTsKLQlXT1JEICAgIGJsX2xlbjsKLQlCWVRFICAgIGJ1Zls4XTsKKwl1MzIgICBibF9udW07CisJdTE2ICAgIGJsX2xlbjsKKwl1OCAgICBidWZbOF07CiAKIAlkZXZfZGJnKCZ1cy0+cHVzYl9kZXYtPmRldiwgIlNNX1NDU0lfUmVhZF9DYXBhY2l0eVxuIik7CiAKQEAgLTEzMiwxMyArMTMyLDEzIEBACiBzdGF0aWMgaW50IFNNX1NDU0lfUmVhZChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlQQllURQlDZGIgPSBzcmItPmNtbmQ7Ci0JRFdPUkQgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwKKwl1OCAqQ2RiID0gc3JiLT5jbW5kOworCXUzMiBibiAgPSAgKChDZGJbMl0gPDwgMjQpICYgMHhmZjAwMDAwMCkgfAogCQkJKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAogCQkJKChDZGJbNF0gPDwgOCkgJiAweDAwMDBmZjAwKSB8CiAJCQkoKENkYls1XSA8PCAwKSAmIDB4MDAwMDAwZmYpOwotCVdPUkQgIGJsZW4gPSAoKENkYls3XSA8PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF0gPDwgMCkgJiAweDAwZmYpOwotCURXT1JECWJsZW5CeXRlID0gYmxlbiAqIDB4MjAwOworCXUxNiAgYmxlbiA9ICgoQ2RiWzddIDw8IDgpICYgMHhmZjAwKSAgICAgfCAoKENkYls4XSA8PCAwKSAmIDB4MDBmZik7CisJdTMyCWJsZW5CeXRlID0gYmxlbiAqIDB4MjAwOwogCXZvaWQJKmJ1ZjsKIAogCkBAIC0xNjQsMTMgKzE2NCwxMyBAQAogc3RhdGljIGludCBTTV9TQ1NJX1dyaXRlKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewogCWludCByZXN1bHQgPSAwOwotCVBCWVRFCUNkYiA9IHNyYi0+Y21uZDsKLQlEV09SRCBibiAgPSAgKChDZGJbMl0gPDwgMjQpICYgMHhmZjAwMDAwMCkgfAorCXU4ICpDZGIgPSBzcmItPmNtbmQ7CisJdTMyIGJuICA9ICAoKENkYlsyXSA8PCAyNCkgJiAweGZmMDAwMDAwKSB8CiAJCQkoKENkYlszXSA8PCAxNikgJiAweDAwZmYwMDAwKSB8CiAJCQkoKENkYls0XSA8PCA4KSAmIDB4MDAwMGZmMDApIHwKIAkJCSgoQ2RiWzVdIDw8IDApICYgMHgwMDAwMDBmZik7Ci0JV09SRCAgYmxlbiA9ICgoQ2RiWzddIDw8IDgpICYgMHhmZjAwKSAgICAgfCAoKENkYls4XSA8PCAwKSAmIDB4MDBmZik7Ci0JRFdPUkQJYmxlbkJ5dGUgPSBibGVuICogMHgyMDA7CisJdTE2ICBibGVuID0gKChDZGJbN10gPDwgOCkgJiAweGZmMDApICAgICB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKKwl1MzIJYmxlbkJ5dGUgPSBibGVuICogMHgyMDA7CiAJdm9pZAkqYnVmOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuYwppbmRleCBhZWIyMTg2Li5hZTk0MTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5jCkBAIC04Myw4ICs4Myw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIHVzYl9zdG9yX3ByaW50X2NtZChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQlQQllURSAgIENkYiA9IHNyYi0+Y21uZDsKLQlEV09SRCAgIGNtZCA9IENkYlswXTsKKwl1OCAqQ2RiID0gc3JiLT5jbW5kOworCXUzMiAgIGNtZCA9IENkYlswXTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBURVNUX1VOSVRfUkVBRFk6CkBAIC01NDUsOCArNTQ1LDggQEAKICAqLwogdm9pZCBCdWlsZFNlbnNlQnVmZmVyKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgaW50IFNyYlN0YXR1cykKIHsKLQlCWVRFICAgICpidWYgPSBzcmItPnNlbnNlX2J1ZmZlcjsKLQlCWVRFICAgIGFzYzsKKwl1OCAgICAqYnVmID0gc3JiLT5zZW5zZV9idWZmZXI7CisJdTggICAgYXNjOwogCiAJcHJfaW5mbygidHJhbnNwb3J0IC0tLSBCdWlsZFNlbnNlQnVmZmVyXG4iKTsKIAlzd2l0Y2ggKFNyYlN0YXR1cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5oCmluZGV4IGRmMzQ0NzQuLmFiZDhlNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmgKQEAgLTU4LDkgKzU4LDkgQEAKIGV4dGVybiB2b2lkIEVORV9zdG9yX2ludm9rZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqLCBzdHJ1Y3QgdXNfZGF0YSAqKTsKIGV4dGVybiBpbnQgRU5FX0luaXRNZWRpYShzdHJ1Y3QgdXNfZGF0YSAqKTsKIGV4dGVybiBpbnQgRU5FX1NNSW5pdChzdHJ1Y3QgdXNfZGF0YSAqKTsKLWV4dGVybiBpbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhKiwgQllURSwgdm9pZCosIGludCk7Ci1leHRlcm4gaW50IEVORV9Mb2FkQmluQ29kZShzdHJ1Y3QgdXNfZGF0YSosIEJZVEUpOwotZXh0ZXJuIGludCBlbmVfcmVhZF9ieXRlKHN0cnVjdCB1c19kYXRhKiwgV09SRCBpbmRleCwgdm9pZCAqYnVmKTsKK2V4dGVybiBpbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhKiwgdTgsIHZvaWQqLCBpbnQpOworZXh0ZXJuIGludCBFTkVfTG9hZEJpbkNvZGUoc3RydWN0IHVzX2RhdGEqLCB1OCk7CitleHRlcm4gaW50IGVuZV9yZWFkX2J5dGUoc3RydWN0IHVzX2RhdGEqLCB1MTYgaW5kZXgsIHZvaWQgKmJ1Zik7CiBleHRlcm4gaW50IEVORV9SZWFkX0RhdGEoc3RydWN0IHVzX2RhdGEqLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpOwogZXh0ZXJuIGludCBFTkVfV3JpdGVfRGF0YShzdHJ1Y3QgdXNfZGF0YSosIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCk7CiBleHRlcm4gdm9pZCBCdWlsZFNlbnNlQnVmZmVyKHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuYwppbmRleCAzZTNjYTYzLi4xMmViZGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3VzYi5jCkBAIC01MCw3ICs1MCw3IEBACiAKIHN0YXRpYyBpbnQgZXVjcl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQogewotCUJZVEUgICAgdG1wID0gMDsKKwl1OCAgICB0bXAgPSAwOwogCiAJc3RydWN0IHVzX2RhdGEgKnVzID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CiAJcHJfaW5mbygiLS0tIGV1Y3JfcmVzdW1lLS0tXG4iKTsKQEAgLTcxLDcgKzcxLDcgQEAKIAogc3RhdGljIGludCBldWNyX3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCiB7Ci0JQllURSAgICB0bXAgPSAwOworCXU4ICAgIHRtcCA9IDA7CiAJc3RydWN0IHVzX2RhdGEgKnVzID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CiAKIAlwcl9pbmZvKCItLS0gZXVjcl9yZXNldF9yZXN1bWUtLS1cbiIpOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgdXNfZGF0YSAqdXM7CiAJaW50IHJlc3VsdDsKLQlCWVRFCU1pc2NSZWcwMyA9IDA7CisJdTgJTWlzY1JlZzAzID0gMDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRoOwogCiAJcHJfaW5mbygidXNiIC0tLSBldWNyX3Byb2JlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuaAppbmRleCBkNjY1YWYxLi5lODk0Zjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3VzYi5oCkBAIC01MiwzNCArNTIsMzQgQEAKICNkZWZpbmUgRkRJUl9SRUFEICAgICAgICAgMQogCiBzdHJ1Y3Qga2V1Y3Jfc2Rfc3RhdHVzIHsKLQlCWVRFICAgIEluc2VydDoxOwotCUJZVEUgICAgUmVhZHk6MTsKLQlCWVRFICAgIE1lZGlhQ2hhbmdlOjE7Ci0JQllURSAgICBJc01NQzoxOwotCUJZVEUgICAgSGlDYXBhY2l0eToxOwotCUJZVEUgICAgSGlTcGVlZDoxOwotCUJZVEUgICAgV3RQOjE7Ci0JQllURSAgICBSZXNlcnZlZDoxOworCXU4ICAgIEluc2VydDoxOworCXU4ICAgIFJlYWR5OjE7CisJdTggICAgTWVkaWFDaGFuZ2U6MTsKKwl1OCAgICBJc01NQzoxOworCXU4ICAgIEhpQ2FwYWNpdHk6MTsKKwl1OCAgICBIaVNwZWVkOjE7CisJdTggICAgV3RQOjE7CisJdTggICAgUmVzZXJ2ZWQ6MTsKIH07CiAKIHN0cnVjdCBrZXVjcl9tc19zdGF0dXMgewotCUJZVEUgICAgSW5zZXJ0OjE7Ci0JQllURSAgICBSZWFkeToxOwotCUJZVEUgICAgTWVkaWFDaGFuZ2U6MTsKLQlCWVRFICAgIElzTVNQcm86MTsKLQlCWVRFICAgIElzTVNQSEc6MTsKLQlCWVRFICAgIFJlc2VydmVkMToxOwotCUJZVEUgICAgV3RQOjE7Ci0JQllURSAgICBSZXNlcnZlZDI6MTsKKwl1OCAgICBJbnNlcnQ6MTsKKwl1OCAgICBSZWFkeToxOworCXU4ICAgIE1lZGlhQ2hhbmdlOjE7CisJdTggICAgSXNNU1BybzoxOworCXU4ICAgIElzTVNQSEc6MTsKKwl1OCAgICBSZXNlcnZlZDE6MTsKKwl1OCAgICBXdFA6MTsKKwl1OCAgICBSZXNlcnZlZDI6MTsKIH07CiAKIHN0cnVjdCBrZXVjcl9zbV9zdGF0dXMgewotCUJZVEUgICAgSW5zZXJ0OjE7Ci0JQllURSAgICBSZWFkeToxOwotCUJZVEUgICAgTWVkaWFDaGFuZ2U6MTsKLQlCWVRFICAgIFJlc2VydmVkOjM7Ci0JQllURSAgICBXdFA6MTsKLQlCWVRFICAgIElzTVM6MTsKKwl1OCAgICBJbnNlcnQ6MTsKKwl1OCAgICBSZWFkeToxOworCXU4ICAgIE1lZGlhQ2hhbmdlOjE7CisJdTggICAgUmVzZXJ2ZWQ6MzsKKwl1OCAgICBXdFA6MTsKKwl1OCAgICBJc01TOjE7CiB9OwogCiAvKiBTRCBCbG9jayBMZW5ndGggKi8KQEAgLTE4NCwzOCArMTg0LDM4IEBACiAKIAkvKiAtLS0tLSBTRCBDb250cm9sIERhdGEgLS0tLS0tLS0tLS0tLS0tLSAqLwogCS8qIFNEX1JFR0lTVEVSIFNEX1JlZ3M7ICovCi0JV09SRCAgICAgICAgU0RfQmxvY2tfTXVsdDsKLQlCWVRFICAgICAgICBTRF9SRUFEX0JMX0xFTjsKLQlXT1JEICAgICAgICBTRF9DX1NJWkU7Ci0JQllURSAgICAgICAgU0RfQ19TSVpFX01VTFQ7CisJdTE2ICAgICAgICBTRF9CbG9ja19NdWx0OworCXU4ICAgICAgICBTRF9SRUFEX0JMX0xFTjsKKwl1MTYgICAgICAgIFNEX0NfU0laRTsKKwl1OCAgICAgICAgU0RfQ19TSVpFX01VTFQ7CiAKIAkvKiBTRC9NTUMgTmV3IHNwZWMuICovCi0JQllURSAgICAgICAgU0RfU1BFQ19WRVI7Ci0JQllURSAgICAgICAgU0RfQ1NEX1ZFUjsKLQlCWVRFICAgICAgICBTRDIwX0hJR0hfQ0FQQUNJVFk7Ci0JRFdPUkQgICAgICAgSENfQ19TSVpFOwotCUJZVEUgICAgICAgIE1NQ19TUEVDX1ZFUjsKLQlCWVRFICAgICAgICBNTUNfQnVzV2lkdGg7Ci0JQllURSAgICAgICAgTU1DX0hJR0hfQ0FQQUNJVFk7CisJdTggICAgICAgIFNEX1NQRUNfVkVSOworCXU4ICAgICAgICBTRF9DU0RfVkVSOworCXU4ICAgICAgICBTRDIwX0hJR0hfQ0FQQUNJVFk7CisJdTMyICAgICAgIEhDX0NfU0laRTsKKwl1OCAgICAgICAgTU1DX1NQRUNfVkVSOworCXU4ICAgICAgICBNTUNfQnVzV2lkdGg7CisJdTggICAgICAgIE1NQ19ISUdIX0NBUEFDSVRZOwogCiAJLyogLS0tLS0gTVMgQ29udHJvbCBEYXRhIC0tLS0tLS0tLS0tLS0tLS0gKi8KLQlCT09MRUFOICAgICAgICAgICAgIE1TX1NXV1A7Ci0JRFdPUkQgICAgICAgICAgICAgICBNU1BfVG90YWxCbG9jazsKKwlib29sICAgICAgICAgICAgIE1TX1NXV1A7CisJdTMyICAgICAgICAgICAgICAgTVNQX1RvdGFsQmxvY2s7CiAJLyogTVNfTGliQ29udHJvbCAgICAgICBNU19MaWI7ICovCi0JQk9PTEVBTiAgICAgICAgICAgICBNU19Jc1JXUGFnZTsKLQlXT1JEICAgICAgICAgICAgICAgIE1TX01vZGVsOworCWJvb2wgICAgICAgICAgICAgTVNfSXNSV1BhZ2U7CisJdTE2ICAgICAgICAgICAgICAgIE1TX01vZGVsOwogCiAJLyogLS0tLS0gU00gQ29udHJvbCBEYXRhIC0tLS0tLS0tLS0tLS0tLS0gKi8KLQlCWVRFCQlTTV9EZXZpY2VJRDsKLQlCWVRFCQlTTV9DYXJkSUQ7CisJdTgJCVNNX0RldmljZUlEOworCXU4CQlTTV9DYXJkSUQ7CiAKLQlQQllURQkJdGVzdGJ1ZjsKLQlCWVRFCQlCSU5fRkxBRzsKLQlEV09SRAkJYmxfbnVtOworCXU4ICp0ZXN0YnVmOworCXU4CQlCSU5fRkxBRzsKKwl1MzIJCWJsX251bTsKIAlpbnQJCVNyYlN0YXR1czsKIAogCS8qIC0tLS0tLVBvd2VyIE1hbmFnZXJtZW50IC0tLS0tLS0tLS0tLS0tLSAqLwotCUJPT0xFQU4gICAgICAgICBQb3dlcl9Jc1Jlc3VtOworCWJvb2wgICAgICAgICBQb3dlcl9Jc1Jlc3VtOwogfTsKIAogLyogQ29udmVydCBiZXR3ZWVuIHVzX2RhdGEgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFNjc2lfSG9zdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvYXVkaW8uYwppbmRleCBhOTJlMjFmLi4xNzFkODBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvYXVkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvYXVkaW8uYwpAQCAtMjQsOCArMjQsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJICAgICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcobGluZTYtPmlmY2RldiwKKwkJCSAgIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKaW5kZXggZjgzMTZiNy4uMGVkYTUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCkBAIC0xNTcsNiArMTU3LDcgQEAKIAkJICAgY29weSB0d28gc2VwYXJhdGUgY2h1bmtzLgogCQkgKi8KIAkJaW50IGxlbjsKKwogCQlsZW4gPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIGxpbmU2cGNtLT5wb3NfaW5fZG9uZTsKIAogCQlpZiAobGVuID4gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCmluZGV4IDdhNmQ4NWUuLjc3ZjFiNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKQEAgLTU3LDI4ICs1NywzMiBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgbGluZTZfaWRfdGFibGUpOwogCisjZGVmaW5lIEw2UFJPUChkZXZfYml0LCBkZXZfaWQsIGRldl9uYW1lLCBkZXZfY2FwKVwKKwl7LmRldmljZV9iaXQgPSBMSU5FNl9CSVRfIyNkZXZfYml0LCAuaWQgPSBkZXZfaWQsXAorCSAubmFtZSA9IGRldl9uYW1lLCAuY2FwYWJpbGl0aWVzID0gTElORTZfQklUXyMjZGV2X2NhcH0KKwogLyogKklOREVOVC1PRkYqICovCi1zdGF0aWMgc3RydWN0IGxpbmU2X3Byb3BlcnRpZXMgbGluZTZfcHJvcGVydGllc190YWJsZVtdID0gewotCXsgTElORTZfQklUX0JBU1NQT0RYVCwgICAgICJCYXNzUE9EeHQiLCAgICAgIkJhc3NQT0R4dCIsICAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9CQVNTUE9EWFRMSVZFLCAiQmFzc1BPRHh0TGl2ZSIsICJCYXNzUE9EeHQgTGl2ZSIsICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfQkFTU1BPRFhUUFJPLCAgIkJhc3NQT0R4dFBybyIsICAiQmFzc1BPRHh0IFBybyIsICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX0dVSVRBUlBPUlQsICAgICJHdWl0YXJQb3J0IiwgICAgIkd1aXRhclBvcnQiLCAgICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0NLRVRQT0QsICAgICAiUG9ja2V0UE9EIiwgICAgICJQb2NrZXQgUE9EIiwgICAgICAgTElORTZfQklUX0NPTlRST0wgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9ESEQzMDAsICAgICAgIlBPREhEMzAwIiwgICAgICAiUE9EIEhEMzAwIiwgICAgICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX1BPREhENDAwLCAgICAgICJQT0RIRDQwMCIsICAgICAgIlBPRCBIRDQwMCIsICAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9QT0RIRDUwMCwgICAgICAiUE9ESEQ1MDAiLCAgICAgICJQT0QgSEQ1MDAiLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfUE9EU1RVRElPX0dYLCAgIlBPRFN0dWRpb0dYIiwgICAiUE9EIFN0dWRpbyBHWCIsICAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1BPRFNUVURJT19VWDEsICJQT0RTdHVkaW9VWDEiLCAgIlBPRCBTdHVkaW8gVVgxIiwgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0RTVFVESU9fVVgyLCAiUE9EU3R1ZGlvVVgyIiwgICJQT0QgU3R1ZGlvIFVYMiIsICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9EWDMsICAgICAgICAgIlBPRFgzIiwgICAgICAgICAiUE9EIFgzIiwgICAgICAgICAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1BPRFgzTElWRSwgICAgICJQT0RYM0xpdmUiLCAgICAgIlBPRCBYMyBMaXZlIiwgICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0RYVCwgICAgICAgICAiUE9EeHQiLCAgICAgICAgICJQT0R4dCIsICAgICAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfUE9EWFRMSVZFLCAgICAgIlBPRHh0TGl2ZSIsICAgICAiUE9EeHQgTGl2ZSIsICAgICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX1BPRFhUUFJPLCAgICAgICJQT0R4dFBybyIsICAgICAgIlBPRHh0IFBybyIsICAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9UT05FUE9SVF9HWCwgICAiVG9uZVBvcnRHWCIsICAgICJUb25lUG9ydCBHWCIsICAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfVE9ORVBPUlRfVVgxLCAgIlRvbmVQb3J0VVgxIiwgICAiVG9uZVBvcnQgVVgxIiwgICAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1RPTkVQT1JUX1VYMiwgICJUb25lUG9ydFVYMiIsICAgIlRvbmVQb3J0IFVYMiIsICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9WQVJJQVgsICAgICAgICAiVmFyaWF4IiwgICAgICAgICJWYXJpYXggV29ya2JlbmNoIiwgTElORTZfQklUX0NPTlRST0wgICAgICAgICAgIH0sCitzdGF0aWMgY29uc3Qgc3RydWN0IGxpbmU2X3Byb3BlcnRpZXMgbGluZTZfcHJvcGVydGllc190YWJsZVtdID0geworCUw2UFJPUChCQVNTUE9EWFQsICAgICAiQmFzc1BPRHh0IiwgICAgICJCYXNzUE9EeHQiLCAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChCQVNTUE9EWFRMSVZFLCAiQmFzc1BPRHh0TGl2ZSIsICJCYXNzUE9EeHQgTGl2ZSIsICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChCQVNTUE9EWFRQUk8sICAiQmFzc1BPRHh0UHJvIiwgICJCYXNzUE9EeHQgUHJvIiwgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChHVUlUQVJQT1JULCAgICAiR3VpdGFyUG9ydCIsICAgICJHdWl0YXJQb3J0IiwgICAgICAgUENNKSwKKwlMNlBST1AoUE9DS0VUUE9ELCAgICAgIlBvY2tldFBPRCIsICAgICAiUG9ja2V0IFBPRCIsICAgICAgIENPTlRST0wpLAorCUw2UFJPUChQT0RIRDMwMCwgICAgICAiUE9ESEQzMDAiLCAgICAgICJQT0QgSEQzMDAiLCAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RIRDQwMCwgICAgICAiUE9ESEQ0MDAiLCAgICAgICJQT0QgSEQ0MDAiLCAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RIRDUwMCwgICAgICAiUE9ESEQ1MDAiLCAgICAgICJQT0QgSEQ1MDAiLCAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RTVFVESU9fR1gsICAiUE9EU3R1ZGlvR1giLCAgICJQT0QgU3R1ZGlvIEdYIiwgICAgUENNKSwKKwlMNlBST1AoUE9EU1RVRElPX1VYMSwgIlBPRFN0dWRpb1VYMSIsICAiUE9EIFN0dWRpbyBVWDEiLCAgIFBDTSksCisJTDZQUk9QKFBPRFNUVURJT19VWDIsICJQT0RTdHVkaW9VWDIiLCAgIlBPRCBTdHVkaW8gVVgyIiwgICBQQ00pLAorCUw2UFJPUChQT0RYMywgICAgICAgICAiUE9EWDMiLCAgICAgICAgICJQT0QgWDMiLCAgICAgICAgICAgUENNKSwKKwlMNlBST1AoUE9EWDNMSVZFLCAgICAgIlBPRFgzTGl2ZSIsICAgICAiUE9EIFgzIExpdmUiLCAgICAgIFBDTSksCisJTDZQUk9QKFBPRFhULCAgICAgICAgICJQT0R4dCIsICAgICAgICAgIlBPRHh0IiwgICAgICAgICAgICBDVFJMX1BDTV9IVyksCisJTDZQUk9QKFBPRFhUTElWRSwgICAgICJQT0R4dExpdmUiLCAgICAgIlBPRHh0IExpdmUiLCAgICAgICBDVFJMX1BDTV9IVyksCisJTDZQUk9QKFBPRFhUUFJPLCAgICAgICJQT0R4dFBybyIsICAgICAgIlBPRHh0IFBybyIsICAgICAgICBDVFJMX1BDTV9IVyksCisJTDZQUk9QKFRPTkVQT1JUX0dYLCAgICJUb25lUG9ydEdYIiwgICAgIlRvbmVQb3J0IEdYIiwgICAgICBQQ00pLAorCUw2UFJPUChUT05FUE9SVF9VWDEsICAiVG9uZVBvcnRVWDEiLCAgICJUb25lUG9ydCBVWDEiLCAgICAgUENNKSwKKwlMNlBST1AoVE9ORVBPUlRfVVgyLCAgIlRvbmVQb3J0VVgyIiwgICAiVG9uZVBvcnQgVVgyIiwgICAgIFBDTSksCisJTDZQUk9QKFZBUklBWCwgICAgICAgICJWYXJpYXgiLCAgICAgICAgIlZhcmlheCBXb3JrYmVuY2giLCBDT05UUk9MKSwKIH07CiAvKiAqSU5ERU5ULU9OKiAqLwogCkBAIC0xNTIsMTAgKzE1NiwxMCBAQAogCQlpbnQgcmV0dmFsOwogCiAJCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxpbmU2LT51c2JkZXYsCi0JCQkJCSAgIHVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsCi0JCQkJCQkJICBsaW5lNi0+ZXBfY29udHJvbF93cml0ZSksCi0JCQkJCSAgIChjaGFyICopZnJhZ19idWYsIGZyYWdfc2l6ZSwKLQkJCQkJICAgJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJCQkJCXVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsCisJCQkJCQlsaW5lNi0+ZXBfY29udHJvbF93cml0ZSksCisJCQkJCShjaGFyICopZnJhZ19idWYsIGZyYWdfc2l6ZSwKKwkJCQkJJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7CiAKIAkJaWYgKHJldHZhbCkgewogCQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LApAQCAtMjE3LDcgKzIyMSw3IEBACiAJU2V0dXAgYW5kIHN0YXJ0IHRpbWVyLgogKi8KIHZvaWQgbGluZTZfc3RhcnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCB1bnNpZ25lZCBpbnQgbXNlY3MsCi0JCSAgICAgICB2b2lkICgqZnVuY3Rpb24pICh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyBkYXRhKQorCQkgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyBkYXRhKQogewogCXNldHVwX3RpbWVyKHRpbWVyLCBmdW5jdGlvbiwgZGF0YSk7CiAJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3MgKiBIWiAvIDEwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmgKaW5kZXggMzRhZTk1ZS4uMTZlM2ZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuaApAQCAtMjA0LDcgKzIwNCw3IEBACiBleHRlcm4gc3NpemVfdCBsaW5lNl9zZXRfcmF3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIGV4dGVybiB2b2lkIGxpbmU2X3N0YXJ0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgaW50IG1zZWNzLAotCQkJICAgICAgdm9pZCAoKmZ1bmN0aW9uKSAodW5zaWduZWQgbG9uZyksCisJCQkgICAgICB2b2lkICgqZnVuY3Rpb24pKHVuc2lnbmVkIGxvbmcpLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBkYXRhKTsKIGV4dGVybiBpbnQgbGluZTZfdHJhbnNtaXRfcGFyYW1ldGVyKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2LCBpbnQgcGFyYW0sCiAJCQkJICAgIHU4IHZhbHVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCmluZGV4IDNmNmQ3OGMuLjAyMzQ1ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYwpAQCAtNDcsNyArNDcsNyBAQAogCXN0cnVjdCBzbmRfbGluZTZfbWlkaSAqbGluZTZtaWRpID0gbGluZTYtPmxpbmU2bWlkaTsKIAlzdHJ1Y3QgbWlkaV9idWZmZXIgKm1iID0gJmxpbmU2bWlkaS0+bWlkaWJ1Zl9vdXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyIGNodW5rW2xpbmU2LT5tYXhfcGFja2V0X3NpemVdOworCXVuc2lnbmVkIGNoYXIgY2h1bmtbTElORTZfRkFMTEJBQ0tfTUFYUEFDS0VUU0laRV07CiAJaW50IHJlcSwgZG9uZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaW5lNi0+bGluZTZtaWRpLT5taWRpX3RyYW5zbWl0X2xvY2ssIGZsYWdzKTsKQEAgLTY0LDcgKzY0LDggQEAKIAl9CiAKIAlmb3IgKDs7KSB7Ci0JCWRvbmUgPSBsaW5lNl9taWRpYnVmX3JlYWQobWIsIGNodW5rLCBsaW5lNi0+bWF4X3BhY2tldF9zaXplKTsKKwkJZG9uZSA9IGxpbmU2X21pZGlidWZfcmVhZChtYiwgY2h1bmssCisJCQkJCSAgTElORTZfRkFMTEJBQ0tfTUFYUEFDS0VUU0laRSk7CiAKIAkJaWYgKGRvbmUgPT0gMCkKIAkJCWJyZWFrOwpAQCAtMzA3LDggKzMwOCw2IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGxpbmU2LT5jYXJkLCBsaW5lNi0+aWZjZGV2KTsKLQogCWVyciA9IHNuZF9saW5lNl9uZXdfbWlkaShsaW5lNm1pZGkpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jCmluZGV4IGRmODMzMWIuLjY2MTA4MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMKQEAgLTUwMSw4ICs1MDEsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihsaW5lNi0+Y2FyZCwgbGluZTYtPmlmY2Rldik7Ci0KIAllcnIgPSBzbmRfbGluZTZfbmV3X3BjbShsaW5lNnBjbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdXNiZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3VzYmRlZnMuaAppbmRleCA5MGNhZGRkLi4yZDFjYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdXNiZGVmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi91c2JkZWZzLmgKQEAgLTkxLDkgKzkxLDkgQEAKIAlMSU5FNl9CSVRTX1BPRFhUQUxMID0gTElORTZfQklUX1BPRFhUIHwgTElORTZfQklUX1BPRFhUTElWRSB8CiAJCQkgICAgICBMSU5FNl9CSVRfUE9EWFRQUk8sCiAJTElORTZfQklUU19QT0RYM0FMTCA9IExJTkU2X0JJVF9QT0RYMyB8IExJTkU2X0JJVF9QT0RYM0xJVkUsCi0JTElORTZfQklUU19QT0RIREFMTCA9IAlMSU5FNl9CSVRfUE9ESEQzMDAgfAotCQkJCUxJTkU2X0JJVF9QT0RIRDQwMCB8Ci0JCQkJTElORTZfQklUX1BPREhENTAwLAorCUxJTkU2X0JJVFNfUE9ESERBTEwgPSBMSU5FNl9CSVRfUE9ESEQzMDAgfAorCQkJICAgICAgTElORTZfQklUX1BPREhENDAwIHwKKwkJCSAgICAgIExJTkU2X0JJVF9QT0RIRDUwMCwKIAlMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTAk9IExJTkU2X0JJVF9CQVNTUE9EWFQgfAogCQkJCSAgTElORTZfQklUX0JBU1NQT0RYVExJVkUgfAogCQkJCSAgTElORTZfQklUX0JBU1NQT0RYVFBSTwpAQCAtMTA2LDcgKzEwNiw3IEBACiAvKiBkZXZpY2Ugc3VwcG9ydCBoYXJkd2FyZSBtb25pdG9yaW5nICovCiAjZGVmaW5lIExJTkU2X0JJVF9IV01PTiAoMSA8PCAyKQogCi0jZGVmaW5lIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTgkoTElORTZfQklUX0NPTlRST0wgfAlcCisjZGVmaW5lIExJTkU2X0JJVF9DVFJMX1BDTV9IVwkoTElORTZfQklUX0NPTlRST0wgfAlcCiAJCQkJCSBMSU5FNl9CSVRfUENNIHwJXAogCQkJCQkgTElORTZfQklUX0hXTU9OKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2N1cnByb2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvY3VycHJvYy5oCmluZGV4IDUwN2QxNmIuLjhmZDQ3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvY3VycHJvYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvY3VycHJvYy5oCkBAIC00NCwxMyArNDQsNiBAQAogI2RlZmluZSBfX0xJQkNGU19DVVJQUk9DX0hfXwogCiAvKgotICogUG9ydGFibGUgQVBJIHRvIGFjY2VzcyBjb21tb24gY2hhcmFjdGVyaXN0aWNzIG9mICJjdXJyZW50IiBVTklYIHByb2Nlc3MuCi0gKgotICogSW1wbGVtZW50ZWQgaW4gcG9ydGFscy9pbmNsdWRlL2xpYmNmcy88b3M+LwotICovCi1pbnQgICAgY2ZzX2N1cnByb2NfZ3JvdXBzX25yKHZvaWQpOwotCi0vKgogICogUGx1cywgcGxhdGZvcm0tc3BlY2lmaWMgY29uc3RhbnQKICAqCiAgKiBDRlNfQ1VSUFJPQ19DT01NX01BWCwKQEAgLTkxLDggKzg0LDYgQEAKIHZvaWQgY2ZzX2NhcF9sb3dlcihjZnNfY2FwX3QgY2FwKTsKIGludCBjZnNfY2FwX3JhaXNlZChjZnNfY2FwX3QgY2FwKTsKIGNmc19jYXBfdCBjZnNfY3VycHJvY19jYXBfcGFjayh2b2lkKTsKLXZvaWQgY2ZzX2N1cnByb2NfY2FwX3VucGFjayhjZnNfY2FwX3QgY2FwKTsKLWludCBjZnNfY2FwYWJsZShjZnNfY2FwX3QgY2FwKTsKIAogLyogX19MSUJDRlNfQ1VSUFJPQ19IX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaGFzaC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaGFzaC5oCmluZGV4IDlkNWVlMWEuLmU1ZDVkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2hhc2guaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmgKQEAgLTY1LDggKzY1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KIAotI2RlZmluZSBjZnNfaGFzaF9sb25nKHZhbCwgYml0cykgICAgaGFzaF9sb25nKHZhbCwgYml0cykKLQogLyoqIGRpc2FibGUgZGVidWcgKi8KICNkZWZpbmUgQ0ZTX0hBU0hfREVCVUdfTk9ORQkgMAogLyoqIHJlY29yZCBoYXNoIGRlcHRoIGFuZCBvdXRwdXQgdG8gY29uc29sZSB3aGVuIGl0J3MgdG9vIGRlZXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaW9jdGwuaAppbmRleCA3NGRkYTU3Li40OWJhNjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2lvY3RsLmgKQEAgLTIxMSwxMCArMjExLDEwIEBACiB9CiAKIAotZXh0ZXJuIGludCBsaWJjZnNfcmVnaXN0ZXJfaW9jdGwoc3RydWN0IGxpYmNmc19pb2N0bF9oYW5kbGVyICpoYW5kKTsKLWV4dGVybiBpbnQgbGliY2ZzX2RlcmVnaXN0ZXJfaW9jdGwoc3RydWN0IGxpYmNmc19pb2N0bF9oYW5kbGVyICpoYW5kKTsKLWV4dGVybiBpbnQgbGliY2ZzX2lvY3RsX2dldGRhdGEoY2hhciAqYnVmLCBjaGFyICplbmQsIHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IGxpYmNmc19pb2N0bF9wb3BkYXRhKHZvaWQgKmFyZywgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CitpbnQgbGliY2ZzX3JlZ2lzdGVyX2lvY3RsKHN0cnVjdCBsaWJjZnNfaW9jdGxfaGFuZGxlciAqaGFuZCk7CitpbnQgbGliY2ZzX2RlcmVnaXN0ZXJfaW9jdGwoc3RydWN0IGxpYmNmc19pb2N0bF9oYW5kbGVyICpoYW5kKTsKK2ludCBsaWJjZnNfaW9jdGxfZ2V0ZGF0YShjaGFyICpidWYsIGNoYXIgKmVuZCwgdm9pZCAqYXJnKTsKK2ludCBsaWJjZnNfaW9jdGxfcG9wZGF0YSh2b2lkICphcmcsIHZvaWQgKmJ1ZiwgaW50IHNpemUpOwogCiAKICNlbmRpZiAvKiBfX0xJQkNGU19JT0NUTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaW0uaAppbmRleCBlNmU0MTdhLi43Y2YzNGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcmltLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpbS5oCkBAIC00MSwxOSArNDEsMTAgQEAKICNkZWZpbmUgX19MSUJDRlNfUFJJTV9IX18KIAogLyoKLSAqIFNjaGVkdWxlCi0gKi8KLXZvaWQgY2ZzX3BhdXNlKGNmc19kdXJhdGlvbl90IHRpY2tzKTsKLQotLyoKICAqIFRpbWVyCiAgKi8KIHR5cGVkZWYgIHZvaWQgKGNmc190aW1lcl9mdW5jX3QpKHVsb25nX3B0cl90KTsKLXZvaWQgc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKGxvbmcsIGludDY0X3QpOwogCi12b2lkIGluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQod2FpdF9xdWV1ZV90ICpsaW5rKTsKLWludDY0X3Qgd2FpdHFfdGltZWR3YWl0KHdhaXRfcXVldWVfdCAqLCBsb25nLCBpbnQ2NF90KTsKLXZvaWQgd2FpdHFfd2FpdCh3YWl0X3F1ZXVlX3QgKiwgbG9uZyk7CiB2b2lkIGFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZV9oZWFkKHdhaXRfcXVldWVfaGVhZF90ICosIHdhaXRfcXVldWVfdCAqKTsKIAogdm9pZCBjZnNfaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19zdHJpbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3N0cmluZy5oCmluZGV4IGE2YmFjOWMuLjUwOWRjMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3N0cmluZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3N0cmluZy5oCkBAIC00OSwxOCArNDksNiBAQAogLyogQ29udmVydCBhIHRleHQgc3RyaW5nIHRvIGEgYml0bWFzayAqLwogaW50IGNmc19zdHIybWFzayhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKigqYml0MnN0cikoaW50IGJpdCksCiAJCSBpbnQgKm9sZG1hc2ssIGludCBtaW5tYXNrLCBpbnQgYWxsbWFzayk7Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgY29weSBhbiBleGlzdGluZyBzdHJpbmcuCi0gKiBNdXN0IGZyZWUgd2l0aCBrZnJlZSgpLgotICovCi1jaGFyICpjZnNfc3RyZHVwKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQzMl90IGZsYWdzKTsKLQotLyogc2FmZSB2c25wcmludGYgKi8KLWludCBjZnNfdnNucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKLQotLyogc2FmZSBzbnByaW50ZiAqLwotaW50IGNmc19zbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0KIC8qIHRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgY2hhcmFjdGVycyAqLwogY2hhciAqY2ZzX2ZpcnN0c3RyKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpOwogCkBAIC05MCwyNyArNzgsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVsX2V4cHJzOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQKLWNmc19pc3doaXRlKGNoYXIgYykKLXsKLQlzd2l0Y2ggKGMpIHsKLQljYXNlICcgJzoKLQljYXNlICdcdCc6Ci0JY2FzZSAnXG4nOgotCWNhc2UgJ1xyJzoKLQkJcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCiBjaGFyICpjZnNfdHJpbXdoaXRlKGNoYXIgKnN0cik7CiBpbnQgY2ZzX2dldHRvayhzdHJ1Y3QgY2ZzX2xzdHIgKm5leHQsIGNoYXIgZGVsaW0sIHN0cnVjdCBjZnNfbHN0ciAqcmVzKTsKIGludCBjZnNfc3RyMm51bV9jaGVjayhjaGFyICpzdHIsIGludCBub2IsIHVuc2lnbmVkICpudW0sCiAJCSAgICAgIHVuc2lnbmVkIG1pbiwgdW5zaWduZWQgbWF4KTsKLWludCBjZnNfcmFuZ2VfZXhwcl9wYXJzZShzdHJ1Y3QgY2ZzX2xzdHIgKnNyYywgdW5zaWduZWQgbWluLCB1bnNpZ25lZCBtYXgsCi0JCQkgaW50IHNpbmdsZV90b2ssIHN0cnVjdCBjZnNfcmFuZ2VfZXhwciAqKmV4cHIpOwogaW50IGNmc19leHByX2xpc3RfbWF0Y2goX191MzIgdmFsdWUsIHN0cnVjdCBjZnNfZXhwcl9saXN0ICpleHByX2xpc3QpOwogaW50IGNmc19leHByX2xpc3RfdmFsdWVzKHN0cnVjdCBjZnNfZXhwcl9saXN0ICpleHByX2xpc3QsCiAJCQkgaW50IG1heCwgX191MzIgKip2YWx1ZXMpOwpAQCAtMTI0LDcgKzk1LDYgQEAKIH0KIAogdm9pZCBjZnNfZXhwcl9saXN0X2ZyZWUoc3RydWN0IGNmc19leHByX2xpc3QgKmV4cHJfbGlzdCk7Ci12b2lkIGNmc19leHByX2xpc3RfcHJpbnQoc3RydWN0IGNmc19leHByX2xpc3QgKmV4cHJfbGlzdCk7CiBpbnQgY2ZzX2V4cHJfbGlzdF9wYXJzZShjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIG1pbiwgdW5zaWduZWQgbWF4LAogCQkJc3RydWN0IGNmc19leHByX2xpc3QgKiplbHBwKTsKIHZvaWQgY2ZzX2V4cHJfbGlzdF9mcmVlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaAppbmRleCAzYWMyYmI1Li44NTZmY2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgKQEAgLTYyOCw3ICs2MjgsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIGxuZXRfbmlkMnBlZXJoYXNoKGxuZXRfbmlkX3QgbmlkKQogewotCXJldHVybiBjZnNfaGFzaF9sb25nKG5pZCwgTE5FVF9QRUVSX0hBU0hfQklUUyk7CisJcmV0dXJuIGhhc2hfbG9uZyhuaWQsIExORVRfUEVFUl9IQVNIX0JJVFMpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaAppbmRleCBkZDhlZGNmLi4xYzEzZWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaApAQCAtMjgyLDE2ICsyODIsMTQgQEAKICNkZWZpbmUgTE5FVF9NRF9GTEFHX0FVVE9fVU5MSU5LICAgICAgKDEgPDwgMSkKIAogI2lmZGVmIExORVRfVVNFX0xJQl9GUkVFTElTVAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKIAl2b2lkCQkgICpmbF9vYmpzOwkgIC8qIHNpbmdsZSBjb250aWd1b3VzIGFycmF5IG9mIG9iamVjdHMgKi8KIAlpbnQJCSAgICBmbF9ub2JqczsJIC8qIHRoZSBudW1iZXIgb2YgdGhlbSAqLwogCWludAkJICAgIGZsX29ianNpemU7ICAgICAgIC8qIHRoZSBzaXplIChpbmNsdWRpbmcgb3ZlcmhlYWQpIG9mIGVhY2ggb2YgdGhlbSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICBmbF9saXN0OwkgIC8qIHdoZXJlIHRoZXkgYXJlIGVucXVldWVkICovCiB9IGxuZXRfZnJlZWxpc3RfdDsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgZm9fbGlzdDsJICAgICAvKiBlbnF1ZXVlIG9uIGZsX2xpc3QgKi8KIAl2b2lkCQkgICpmb19jb250ZW50czsJIC8qIGFsaWduZWQgY29udGVudHMgKi8KIH0gbG5ldF9mcmVlb2JqX3Q7CkBAIC0zMTIsOCArMzEwLDcgQEAKIAogc3RydWN0IGxuZXRfbmk7CQkJCSAgLyogZm9yd2FyZCByZWYgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgbG5ldF9sbmQKLXsKK3R5cGVkZWYgc3RydWN0IGxuZXRfbG5kIHsKIAkvKiBmaWVsZHMgbWFuYWdlZCBieSBwb3J0YWxzICovCiAJc3RydWN0IGxpc3RfaGVhZAkgICAgbG5kX2xpc3Q7CSAgICAgLyogc3Rhc2ggaW4gdGhlIExORCB0YWJsZSAqLwogCWludAkJICAgbG5kX3JlZmNvdW50OwkgLyogIyBhY3RpdmUgaW5zdGFuY2VzICovCkBAIC0zMjEsOCArMzE4LDggQEAKIAkvKiBmaWVsZHMgaW5pdGlhbGlzZWQgYnkgdGhlIExORCAqLwogCXVuc2lnbmVkIGludAkgIGxuZF90eXBlOwogCi0JaW50ICAoKmxuZF9zdGFydHVwKSAoc3RydWN0IGxuZXRfbmkgKm5pKTsKLQl2b2lkICgqbG5kX3NodXRkb3duKSAoc3RydWN0IGxuZXRfbmkgKm5pKTsKKwlpbnQgICgqbG5kX3N0YXJ0dXApKHN0cnVjdCBsbmV0X25pICpuaSk7CisJdm9pZCAoKmxuZF9zaHV0ZG93bikoc3RydWN0IGxuZXRfbmkgKm5pKTsKIAlpbnQgICgqbG5kX2N0bCkoc3RydWN0IGxuZXRfbmkgKm5pLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwogCiAJLyogSW4gZGF0YSBtb3ZlbWVudCBBUElzIGJlbG93LCBwYXlsb2FkIGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCBhcyBhIHNldApAQCAtNjY4LDggKzY2NSw3IEBACiAjZGVmaW5lIExORVRfUkNfU1RBVEVfUlVOTklORwkJMQkvKiBzdGFydGVkIHVwIE9LICovCiAjZGVmaW5lIExORVRfUkNfU1RBVEVfU1RPUFBJTkcJCTIJLyogdGVsbGluZyB0aHJlYWQgdG8gc3RvcCAqLwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogCS8qIENQVSBwYXJ0aXRpb24gdGFibGUgb2YgTE5ldCAqLwogCXN0cnVjdCBjZnNfY3B0X3RhYmxlCQkqbG5fY3B0X3RhYmxlOwogCS8qIG51bWJlciBvZiBDUFRzIGluIGxuX2NwdF90YWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCmluZGV4IDY0NGEwMDAuLjAwNjFjOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlICJvMmlibG5kLmgiCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKLWxuZF90IHRoZV9vMmlibG5kID0geworc3RhdGljIGxuZF90IHRoZV9vMmlibG5kID0gewogCS5sbmRfdHlwZSAgICAgICA9IE8ySUJMTkQsCiAJLmxuZF9zdGFydHVwICAgID0ga2libG5kX3N0YXJ0dXAsCiAJLmxuZF9zaHV0ZG93biAgID0ga2libG5kX3NodXRkb3duLApAQCAtNTMsOCArNTMsOCBAQAogCiBraWJfZGF0YV90CSAgICAgIGtpYmxuZF9kYXRhOwogCi1fX3UzMgota2libG5kX2Nrc3VtICh2b2lkICpwdHIsIGludCBub2IpCitzdGF0aWMgX191MzIKK2tpYmxuZF9ja3N1bSh2b2lkICpwdHIsIGludCBub2IpCiB7CiAJY2hhciAgKmMgID0gcHRyOwogCV9fdTMyICBzdW0gPSAwOwpAQCAtNDI5LDggKzQyOSw4IEBACiAJa2libG5kX3BlZXJfZGVjcmVmKHBlZXIpOwogfQogCi1pbnQKLWtpYmxuZF9nZXRfcGVlcl9pbmZvIChsbmV0X25pX3QgKm5pLCBpbnQgaW5kZXgsCitzdGF0aWMgaW50CitraWJsbmRfZ2V0X3BlZXJfaW5mbyhsbmV0X25pX3QgKm5pLCBpbnQgaW5kZXgsCiAJCSAgICAgIGxuZXRfbmlkX3QgKm5pZHAsIGludCAqY291bnQpCiB7CiAJa2liX3BlZXJfdAkgICAgKnBlZXI7CkBAIC00NjgsOCArNDY4LDggQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAotdm9pZAota2libG5kX2RlbF9wZWVyX2xvY2tlZCAoa2liX3BlZXJfdCAqcGVlcikKK3N0YXRpYyB2b2lkCitraWJsbmRfZGVsX3BlZXJfbG9ja2VkKGtpYl9wZWVyX3QgKnBlZXIpCiB7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAqY3RtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICpjbnh0OwpAQCAtNDg5LDggKzQ4OSw4IEBACiAJICogbGFzdCByZWYgb24gaXQuICovCiB9CiAKLWludAota2libG5kX2RlbF9wZWVyIChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCkKK3N0YXRpYyBpbnQKK2tpYmxuZF9kZWxfcGVlcihsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCkKIHsKIAlMSVNUX0hFQUQJICh6b21iaWVzKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAqcHRtcDsKQEAgLTU0Myw4ICs1NDMsOCBAQAogCXJldHVybiByYzsKIH0KIAota2liX2Nvbm5fdCAqCi1raWJsbmRfZ2V0X2Nvbm5fYnlfaWR4IChsbmV0X25pX3QgKm5pLCBpbnQgaW5kZXgpCitzdGF0aWMga2liX2Nvbm5fdCAqCitraWJsbmRfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKIHsKIAlraWJfcGVlcl90CSAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAqcHRtcDsKQEAgLTU4NCw3NCArNTg0LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZAota2libG5kX2RlYnVnX3J4IChraWJfcnhfdCAqcngpCi17Ci0JQ0RFQlVHKERfQ09OU09MRSwgIiAgICAgICVwIHN0YXR1cyAlZCBtc2dfdHlwZSAleCBjcmVkICVkXG4iLAotCSAgICAgICByeCwgcngtPnJ4X3N0YXR1cywgcngtPnJ4X21zZy0+aWJtX3R5cGUsCi0JICAgICAgIHJ4LT5yeF9tc2ctPmlibV9jcmVkaXRzKTsKLX0KLQotdm9pZAota2libG5kX2RlYnVnX3R4IChraWJfdHhfdCAqdHgpCi17Ci0JQ0RFQlVHKERfQ09OU09MRSwgIiAgICAgICVwIHNuZCAlZCBxICVkIHcgJWQgcmMgJWQgZGwgJWx4ICIKLQkgICAgICAgImNvb2tpZSAiTFBYNjQiIG1zZyAlcyVzIHR5cGUgJXggY3JlZCAlZFxuIiwKLQkgICAgICAgdHgsIHR4LT50eF9zZW5kaW5nLCB0eC0+dHhfcXVldWVkLCB0eC0+dHhfd2FpdGluZywKLQkgICAgICAgdHgtPnR4X3N0YXR1cywgdHgtPnR4X2RlYWRsaW5lLCB0eC0+dHhfY29va2llLAotCSAgICAgICB0eC0+dHhfbG50bXNnWzBdID09IE5VTEwgPyAiLSIgOiAiISIsCi0JICAgICAgIHR4LT50eF9sbnRtc2dbMV0gPT0gTlVMTCA/ICItIiA6ICIhIiwKLQkgICAgICAgdHgtPnR4X21zZy0+aWJtX3R5cGUsIHR4LT50eF9tc2ctPmlibV9jcmVkaXRzKTsKLX0KLQotdm9pZAota2libG5kX2RlYnVnX2Nvbm4gKGtpYl9jb25uX3QgKmNvbm4pCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkqdG1wOwotCWludAkJaTsKLQotCXNwaW5fbG9jaygmY29ubi0+aWJjX2xvY2spOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgImNvbm5bJWRdICVwIFt2ZXJzaW9uICV4XSAtPiAlczogXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCgmY29ubi0+aWJjX3JlZmNvdW50KSwgY29ubiwKLQkgICAgICAgY29ubi0+aWJjX3ZlcnNpb24sIGxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSk7Ci0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIHN0YXRlICVkIG5wb3N0ZWQgJWQvJWQgY3JlZCAlZCBvX2NyZWQgJWQgcl9jcmVkICVkXG4iLAotCSAgICAgICBjb25uLT5pYmNfc3RhdGUsIGNvbm4tPmliY19ub29wc19wb3N0ZWQsCi0JICAgICAgIGNvbm4tPmliY19uc2VuZHNfcG9zdGVkLCBjb25uLT5pYmNfY3JlZGl0cywKLQkgICAgICAgY29ubi0+aWJjX291dHN0YW5kaW5nX2NyZWRpdHMsIGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzKTsKLQlDREVCVUcoRF9DT05TT0xFLCAiICAgY29tbXNfZXJyICVkXG4iLCBjb25uLT5pYmNfY29tbXNfZXJyb3IpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIGVhcmx5X3J4czpcbiIpOwotCWxpc3RfZm9yX2VhY2godG1wLCAmY29ubi0+aWJjX2Vhcmx5X3J4cykKLQkJa2libG5kX2RlYnVnX3J4KGxpc3RfZW50cnkodG1wLCBraWJfcnhfdCwgcnhfbGlzdCkpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIHR4X25vb3BzOlxuIik7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfdHhfbm9vcHMpCi0JCWtpYmxuZF9kZWJ1Z190eChsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICB0eF9xdWV1ZV9ub2NyZWQ6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNvbm4tPmliY190eF9xdWV1ZV9ub2NyZWQpCi0JCWtpYmxuZF9kZWJ1Z190eChsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICB0eF9xdWV1ZV9yc3J2ZDpcbiIpOwotCWxpc3RfZm9yX2VhY2godG1wLCAmY29ubi0+aWJjX3R4X3F1ZXVlX3JzcnZkKQotCQlraWJsbmRfZGVidWdfdHgobGlzdF9lbnRyeSh0bXAsIGtpYl90eF90LCB0eF9saXN0KSk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgdHhfcXVldWU6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNvbm4tPmliY190eF9xdWV1ZSkKLQkJa2libG5kX2RlYnVnX3R4KGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCkpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIGFjdGl2ZV90eHM6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNvbm4tPmliY19hY3RpdmVfdHhzKQotCQlraWJsbmRfZGVidWdfdHgobGlzdF9lbnRyeSh0bXAsIGtpYl90eF90LCB0eF9saXN0KSk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgcnhzOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IElCTE5EX1JYX01TR1MoY29ubi0+aWJjX3ZlcnNpb24pOyBpKyspCi0JCWtpYmxuZF9kZWJ1Z19yeCgmY29ubi0+aWJjX3J4c1tpXSk7Ci0KLQlzcGluX3VubG9jaygmY29ubi0+aWJjX2xvY2spOwotfQotCiBpbnQKIGtpYmxuZF90cmFuc2xhdGVfbXR1KGludCB2YWx1ZSkKIHsKQEAgLTEwMzksOCArOTcxLDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLWludAota2libG5kX2Nsb3NlX21hdGNoaW5nX2Nvbm5zIChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCkKK3N0YXRpYyBpbnQKK2tpYmxuZF9jbG9zZV9tYXRjaGluZ19jb25ucyhsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCkKIHsKIAlraWJfcGVlcl90CSAgICAgKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICpwdG1wOwpAQCAtMTQ0MCw3ICsxMzcyLDcgQEAKIAlyZXR1cm4gbXI7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBraWJsbmRfZGVzdHJveV9mbXJfcG9vbChraWJfZm1yX3Bvb2xfdCAqcG9vbCkKIHsKIAlMQVNTRVJUIChwb29sLT5mcG9fbWFwX2NvdW50ID09IDApOwpAQCAtMTQ1NCw3ICsxMzg2LDcgQEAKIAlMSUJDRlNfRlJFRShwb29sLCBzaXplb2Yoa2liX2Ztcl9wb29sX3QpKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGtpYmxuZF9kZXN0cm95X2Ztcl9wb29sX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlraWJfZm1yX3Bvb2xfdCAqcG9vbDsKQEAgLTE0ODAsNyArMTQxMiw3IEBACiAJcmV0dXJuIG1heChJQkxORF9GTVJfUE9PTF9GTFVTSCwgc2l6ZSk7CiB9CiAKLWludAorc3RhdGljIGludAoga2libG5kX2NyZWF0ZV9mbXJfcG9vbChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBraWJfZm1yX3Bvb2xfdCAqKnBwX2ZwbykKIHsKIAkvKiBGTVIgcG9vbCBmb3IgUkRNQSAqLwpAQCAtMTcxOSw3ICsxNjUxLDcgQEAKIAlwb29sLT5wb19zaXplICAgICA9IHNpemU7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBraWJsbmRfZGVzdHJveV9wb29sX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlraWJfcG9vbF90ICpwb29sOwpAQCAtMjE5Miw3ICsyMTI0LDcgQEAKIAl0eC0+dHhfY29va2llID0gdHBzLT50cHNfbmV4dF90eF9jb29raWUgKys7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBraWJsbmRfbmV0X2ZpbmlfcG9vbHMoa2liX25ldF90ICpuZXQpCiB7CiAJaW50CWk7CkBAIC0yMjM0LDcgKzIxNjYsNyBAQAogCX0KIH0KIAotaW50CitzdGF0aWMgaW50CiBraWJsbmRfbmV0X2luaXRfcG9vbHMoa2liX25ldF90ICpuZXQsIF9fdTMyICpjcHRzLCBpbnQgbmNwdHMpCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKQEAgLTI0MDgsNyArMjM0MCw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBraWJsbmRfaGRldl9jbGVhbnVwX21ycyhraWJfaGNhX2Rldl90ICpoZGV2KQogewogCWludCAgICAgaTsKQEAgLTI0NDIsNyArMjM3NCw3IEBACiAJTElCQ0ZTX0ZSRUUoaGRldiwgc2l6ZW9mKCpoZGV2KSk7CiB9CiAKLWludAorc3RhdGljIGludAoga2libG5kX2hkZXZfc2V0dXBfbXJzKGtpYl9oY2FfZGV2X3QgKmhkZXYpCiB7CiAJc3RydWN0IGliX21yICptcjsKQEAgLTI3NDYsNyArMjY3OCw3IEBACiAJTElCQ0ZTX0ZSRUUoZGV2LCBzaXplb2YoKmRldikpOwogfQogCi1raWJfZGV2X3QgKgorc3RhdGljIGtpYl9kZXZfdCAqCiBraWJsbmRfY3JlYXRlX2RldihjaGFyICppZm5hbWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTI4MDAsNyArMjczMiw3IEBACiAJcmV0dXJuIGRldjsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGtpYmxuZF9iYXNlX3NodXRkb3duKHZvaWQpCiB7CiAJc3RydWN0IGtpYl9zY2hlZF9pbmZvCSpzY2hlZDsKQEAgLTI4NDIsNyArMjc3NCw4IEBACiAJCQlDREVCVUcoKChpICYgKC1pKSkgPT0gaSkgPyBEX1dBUk5JTkcgOiBEX05FVCwgLyogcG93ZXIgb2YgMj8gKi8KIAkJCSAgICAgICAiV2FpdGluZyBmb3IgJWQgdGhyZWFkcyB0byB0ZXJtaW5hdGVcbiIsCiAJCQkgICAgICAgYXRvbWljX3JlYWQoJmtpYmxuZF9kYXRhLmtpYl9udGhyZWFkcykpOwotCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJfQogCiAJCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtMjkwMyw3ICsyODM2LDggQEAKIAkJCSAgICAgICAiJXM6IHdhaXRpbmcgZm9yICVkIHBlZXJzIHRvIGRpc2Nvbm5lY3RcbiIsCiAJCQkgICAgICAgbGliY2ZzX25pZDJzdHIobmktPm5pX25pZCksCiAJCQkgICAgICAgYXRvbWljX3JlYWQoJm5ldC0+aWJuX25wZWVycykpOwotCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJfQogCiAJCWtpYmxuZF9uZXRfZmluaV9wb29scyhuZXQpOwpAQCAtMjk0MCw3ICsyODc0LDcgQEAKIAlyZXR1cm47CiB9CiAKLWludAorc3RhdGljIGludAoga2libG5kX2Jhc2Vfc3RhcnR1cCh2b2lkKQogewogCXN0cnVjdCBraWJfc2NoZWRfaW5mbwkqc2NoZWQ7CkBAIC0zMDMwLDcgKzI5NjQsNyBAQAogCXJldHVybiAtRU5FVERPV047CiB9CiAKLWludAorc3RhdGljIGludAoga2libG5kX3N0YXJ0X3NjaGVkdWxlcnMoc3RydWN0IGtpYl9zY2hlZF9pbmZvICpzY2hlZCkKIHsKIAlpbnQJcmMgPSAwOwpAQCAtMzA3MSw3ICszMDA1LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAorc3RhdGljIGludAoga2libG5kX2Rldl9zdGFydF90aHJlYWRzKGtpYl9kZXZfdCAqZGV2LCBpbnQgbmV3ZGV2LCBfX3UzMiAqY3B0cywgaW50IG5jcHRzKQogewogCWludAljcHQ7CkBAIC0zMDk3LDcgKzMwMzEsNyBAQAogCXJldHVybiAwOwogfQogCi1raWJfZGV2X3QgKgorc3RhdGljIGtpYl9kZXZfdCAqCiBraWJsbmRfZGV2X3NlYXJjaChjaGFyICppZm5hbWUpCiB7CiAJa2liX2Rldl90CSphbGlhcyA9IE5VTEw7CkBAIC0zMjI2LDEzICszMTYwLDEzIEBACiAJcmV0dXJuIC1FTkVURE9XTjsKIH0KIAotdm9pZCBfX2V4aXQKK3N0YXRpYyB2b2lkIF9fZXhpdAoga2libG5kX21vZHVsZV9maW5pICh2b2lkKQogewogCWxuZXRfdW5yZWdpc3Rlcl9sbmQoJnRoZV9vMmlibG5kKTsKIH0KIAotaW50IF9faW5pdAorc3RhdGljIGludCBfX2luaXQKIGtpYmxuZF9tb2R1bGVfaW5pdCAodm9pZCkKIHsKIAlpbnQgICAgcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKaW5kZXggNmY1OGVhZC4uNjE3M2U3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYwpAQCAtMzEyNyw3ICszMTI3LDcgQEAKIAogCWNmc19ibG9ja19hbGxzaWdzICgpOwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCAoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlraWJsbmRfZGF0YS5raWJfY29ubmQgPSBjdXJyZW50OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF9sb2NrLCBmbGFncyk7CkBAIC0zMjA4LDcgKzMyMDgsNyBAQAogCQlhZGRfd2FpdF9xdWV1ZSgma2libG5kX2RhdGEua2liX2Nvbm5kX3dhaXRxLCAmd2FpdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF9sb2NrLCBmbGFncyk7CiAKLQkJd2FpdHFfdGltZWR3YWl0KCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsIHRpbWVvdXQpOworCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwogCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZraWJsbmRfZGF0YS5raWJfY29ubmRfd2FpdHEsICZ3YWl0KTsKQEAgLTMzMjQsNyArMzMyNCw3IEBACiAKIAljZnNfYmxvY2tfYWxsc2lncygpOwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCiAJc2NoZWQgPSBraWJsbmRfZGF0YS5raWJfc2NoZWRzW0tJQl9USFJFQURfQ1BUKGlkKV07CiAKQEAgLTM0MjMsNyArMzQyMyw3IEBACiAJCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmc2NoZWQtPmlic193YWl0cSwgJndhaXQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hlZC0+aWJzX2xvY2ssIGZsYWdzKTsKIAotCQl3YWl0cV93YWl0KCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOwogCQlidXN5X2xvb3BzID0gMDsKIAogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmc2NoZWQtPmlic193YWl0cSwgJndhaXQpOwpAQCAtMzQ1MCw3ICszNDUwLDcgQEAKIAogCWNmc19ibG9ja19hbGxzaWdzICgpOwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZShnbG9jaywgZmxhZ3MpOwogCiAJd2hpbGUgKCFraWJsbmRfZGF0YS5raWJfc2h1dGRvd24pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYwppbmRleCA4Zjc0ZDBiLi4yMWQzNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCkBAIC0yMzM2LDcgKzIzMzYsOCBAQAogCQkJICAgICAgICJ3YWl0aW5nIGZvciAlZCB0aHJlYWRzIHRvIHRlcm1pbmF0ZVxuIiwKIAkJCQlrc29ja25hbF9kYXRhLmtzbmRfbnRocmVhZHMpOwogCQkJcmVhZF91bmxvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7Ci0JCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQkJcmVhZF9sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCQl9CiAJCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwpAQCAtMjU4NCw3ICsyNTg1LDggQEAKIAkJQ0RFQlVHKCgoaSAmICgtaSkpID09IGkpID8gRF9XQVJOSU5HIDogRF9ORVQsIC8qIHBvd2VyIG9mIDI/ICovCiAJCSAgICAgICAid2FpdGluZyBmb3IgJWQgcGVlcnMgdG8gZGlzY29ubmVjdFxuIiwKIAkJICAgICAgIG5ldC0+a3Nubl9ucGVlcnMpOwotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAogCQlrc29ja25hbF9kZWJ1Z19wZWVyaGFzaChuaSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYwppbmRleCBiN2I1M2I1Li5iZGY5NWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCkBAIC0xODksNyArMTg5LDggQEAKIAlpbnQgICAgICBidWZub2I7CiAKIAlpZiAoa3NvY2tuYWxfZGF0YS5rc25kX3N0YWxsX3R4ICE9IDApIHsKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoa3NvY2tuYWxfZGF0YS5rc25kX3N0YWxsX3R4KSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKGtzb2NrbmFsX2RhdGEua3NuZF9zdGFsbF90eCkpOwogCX0KIAogCUxBU1NFUlQgKHR4LT50eF9yZXNpZCAhPSAwKTsKQEAgLTM0NSw3ICszNDYsOCBAQAogCWludCAgICAgcmM7CiAKIAlpZiAoa3NvY2tuYWxfZGF0YS5rc25kX3N0YWxsX3J4ICE9IDApIHsKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMgKGtzb2NrbmFsX2RhdGEua3NuZF9zdGFsbF9yeCkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcyhrc29ja25hbF9kYXRhLmtzbmRfc3RhbGxfcngpKTsKIAl9CiAKIAlyYyA9IGtzb2NrbmFsX2Nvbm5zb2NrX2FkZHJlZihjb25uKTsKQEAgLTIxNDAsNyArMjE0Miw3IEBACiAKIAljZnNfYmxvY2tfYWxsc2lncyAoKTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQgKCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAKIAlzcGluX2xvY2tfYmgoY29ubmRfbG9jayk7CiAKQEAgLTIyMjksNyArMjIzMSw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKGNvbm5kX2xvY2spOwogCiAJCW5sb29wcyA9IDA7Ci0JCXdhaXRxX3RpbWVkd2FpdCgmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLCB0aW1lb3V0KTsKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgma3NvY2tuYWxfZGF0YS5rc25kX2Nvbm5kX3dhaXRxLCAmd2FpdCk7CkBAIC0yNTMyLDcgKzI1MzQsNyBAQAogCWNmc19ibG9ja19hbGxzaWdzICgpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmVub21lbV9jb25ucyk7Ci0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCAoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAogCXNwaW5fbG9ja19iaCgma3NvY2tuYWxfZGF0YS5rc25kX3JlYXBlcl9sb2NrKTsKIApAQCAtMjYzOSw4ICsyNjQxLDcgQEAKIAkJaWYgKCFrc29ja25hbF9kYXRhLmtzbmRfc2h1dHRpbmdkb3duICYmCiAJCSAgICBsaXN0X2VtcHR5ICgma3NvY2tuYWxfZGF0YS5rc25kX2RlYXRocm93X2Nvbm5zKSAmJgogCQkgICAgbGlzdF9lbXB0eSAoJmtzb2NrbmFsX2RhdGEua3NuZF96b21iaWVfY29ubnMpKQotCQkJd2FpdHFfdGltZWR3YWl0ICgmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLAotCQkJCQkgICAgIHRpbWVvdXQpOworCQkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAogCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUgKCZrc29ja25hbF9kYXRhLmtzbmRfcmVhcGVyX3dhaXRxLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguYwppbmRleCA4MDE0MWFhLi5hNTRiNTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmMKQEAgLTM3Myw3ICszNzMsOCBAQAogCiAJLyogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwogCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuICovCi0JaWYgKChhZGRyID0ga3NvY2tuYWxfbGliX2tpb3Zfdm1hcChraW92LCBuaW92LCBzY3JhdGNoaW92LCBwYWdlcykpICE9IE5VTEwpIHsKKwlhZGRyID0ga3NvY2tuYWxfbGliX2tpb3Zfdm1hcChraW92LCBuaW92LCBzY3JhdGNoaW92LCBwYWdlcyk7CisJaWYgKGFkZHIgIT0gTlVMTCkgewogCQlub2IgPSBzY3JhdGNoaW92WzBdLmlvdl9sZW47CiAJCW1zZy5tc2dfaW92bGVuID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9wcm90by5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9wcm90by5jCmluZGV4IDcxMjA1ZTIuLjJkOTE1NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX3Byb3RvLmMKQEAgLTE2NSw3ICsxNjUsOCBAQAogCUxBU1NFUlQgKHR4X2FjayA9PSBOVUxMIHx8CiAJCSB0eF9hY2stPnR4X21zZy5rc21fdHlwZSA9PSBLU09DS19NU0dfTk9PUCk7CiAKLQlpZiAoKHR4ID0gY29ubi0+a3NuY190eF9jYXJyaWVyKSA9PSBOVUxMKSB7CisJdHggPSBjb25uLT5rc25jX3R4X2NhcnJpZXI7CisJaWYgKHR4ID09IE5VTEwpIHsKIAkJaWYgKHR4X2FjayAhPSBOVUxMKSB7CiAJCQlsaXN0X2FkZF90YWlsKCZ0eF9hY2stPnR4X2xpc3QsCiAJCQkJCSAgJmNvbm4tPmtzbmNfdHhfcXVldWUpOwpAQCAtMzkyLDcgKzM5Myw4IEBACiAJaWYgKHR4ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKChyYyA9IGtzb2NrbmFsX2xhdW5jaF9wYWNrZXQocGVlci0+a3NucF9uaSwgdHgsIHBlZXItPmtzbnBfaWQpKSA9PSAwKQorCXJjID0ga3NvY2tuYWxfbGF1bmNoX3BhY2tldChwZWVyLT5rc25wX25pLCB0eCwgcGVlci0+a3NucF9pZCk7CisJaWYgKHJjID09IDApCiAJCXJldHVybiAwOwogCiAJa3NvY2tuYWxfZnJlZV90eCh0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hY2NlcHRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYWNjZXB0b3IuYwppbmRleCBjYjJlY2Q3Li4wOWVhNmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hY2NlcHRvci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FjY2VwdG9yLmMKQEAgLTM3MSw3ICszNzEsOCBAQAogCQlpZiAocmMgIT0gMCkgewogCQkJaWYgKHJjICE9IC1FQUdBSU4pIHsKIAkJCQlDV0FSTigiQWNjZXB0IGVycm9yICVkOiBwYXVzaW5nLi4uXG4iLCByYyk7Ci0JCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQkJfQogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYXBpLW5pLmMKaW5kZXggYzU2MmZmMy4uNDVjMjMxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYXBpLW5pLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYXBpLW5pLmMKQEAgLTc3MCw3ICs3NzAsNyBAQAogCWlmIChudW1iZXIgPT0gMSkKIAkJcmV0dXJuIDA7CiAKLQl2YWwgPSBjZnNfaGFzaF9sb25nKGtleSwgTE5FVF9DUFRfQklUUyk7CisJdmFsID0gaGFzaF9sb25nKGtleSwgTE5FVF9DUFRfQklUUyk7CiAJLyogTkI6IExORVRfQ1BfTlVNQkVSIGRvZXNuJ3QgaGF2ZSB0byBiZSBQTzIgKi8KIAlpZiAodmFsIDwgbnVtYmVyKQogCQlyZXR1cm4gdmFsOwpAQCAtOTk0LDcgKzk5NCw4IEBACiAJCQkJICAgICAgICJXYWl0aW5nIGZvciB6b21iaWUgTE5JICVzXG4iLAogCQkJCSAgICAgICBsaWJjZnNfbmlkMnN0cihuaS0+bmlfbmlkKSk7CiAJCQl9Ci0JCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQkJbG5ldF9uZXRfbG9jayhMTkVUX0xPQ0tfRVgpOwogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMKaW5kZXggNmEwN2IwYS4uZDk3NDY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCS8qIFNwbGl0ICdzdHInIGludG8gc2VwYXJhdGUgY29tbWFuZHMgKi8KIAlmb3IgKDs7KSB7CiAJCS8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0JCXdoaWxlIChjZnNfaXN3aGl0ZSgqc3RyKSkKKwkJd2hpbGUgKGlzc3BhY2UoKnN0cikpCiAJCQlzdHIrKzsKIAogCQkvKiBzY2FuIGZvciBzZXBhcmF0b3Igb3IgY29tbWVudCAqLwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJCQl9CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBub2I7IGkrKykKLQkJCQlpZiAoY2ZzX2lzd2hpdGUoc3RyW2ldKSkKKwkJCQlpZiAoaXNzcGFjZShzdHJbaV0pKQogCQkJCQlsdGItPmx0Yl90ZXh0W2ldID0gJyAnOwogCQkJCWVsc2UKIAkJCQkJbHRiLT5sdGJfdGV4dFtpXSA9IHN0cltpXTsKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCXNlcCA9IHN0cjsKIAlmb3IgKDs7KSB7CiAJCS8qIHNjYW4gZm9yIHRva2VuIHN0YXJ0ICovCi0JCXdoaWxlIChjZnNfaXN3aGl0ZSgqc2VwKSkKKwkJd2hpbGUgKGlzc3BhY2UoKnNlcCkpCiAJCQlzZXArKzsKIAkJaWYgKCpzZXAgPT0gMCkgewogCQkJaWYgKG50b2tlbnMgPCAoZ290X2hvcHMgPyAzIDogMikpCkBAIC02NzksNyArNjc5LDcgQEAKIAkJdG9rZW4gPSBzZXArKzsKIAogCQkvKiBzY2FuIGZvciB0b2tlbiBlbmQgKi8KLQkJd2hpbGUgKCpzZXAgIT0gMCAmJiAhY2ZzX2lzd2hpdGUoKnNlcCkpCisJCXdoaWxlICgqc2VwICE9IDAgJiYgIWlzc3BhY2UoKnNlcCkpCiAJCQlzZXArKzsKIAkJaWYgKCpzZXAgIT0gMCkKIAkJCSpzZXArKyA9IDA7CkBAIC04NTgsNyArODU4LDcgQEAKIAlzZXAgPSB0b2tlbnM7CiAJZm9yICg7OykgewogCQkvKiBzY2FuIGZvciB0b2tlbiBzdGFydCAqLwotCQl3aGlsZSAoY2ZzX2lzd2hpdGUoKnNlcCkpCisJCXdoaWxlIChpc3NwYWNlKCpzZXApKQogCQkJc2VwKys7CiAJCWlmICgqc2VwID09IDApCiAJCQlicmVhazsKQEAgLTg2Niw3ICs4NjYsNyBAQAogCQl0b2tlbiA9IHNlcCsrOwogCiAJCS8qIHNjYW4gZm9yIHRva2VuIGVuZCAqLwotCQl3aGlsZSAoKnNlcCAhPSAwICYmICFjZnNfaXN3aGl0ZSgqc2VwKSkKKwkJd2hpbGUgKCpzZXAgIT0gMCAmJiAhaXNzcGFjZSgqc2VwKSkKIAkJCXNlcCsrOwogCQlpZiAoKnNlcCAhPSAwKQogCQkJKnNlcCsrID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1lcS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLWVxLmMKaW5kZXggNGNlNjhkMy4uN2NlMDdmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLWVxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLWVxLmMKQEAgLTMzNCwyMSArMzM0LDIwIEBACiAJaWYgKHRtcyA9PSAwKQogCQlyZXR1cm4gLTE7IC8qIGRvbid0IHdhbnQgdG8gd2FpdCBhbmQgbm8gbmV3IGV2ZW50ICovCiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3bCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndsLCBjdXJyZW50KTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCWFkZF93YWl0X3F1ZXVlKCZ0aGVfbG5ldC5sbl9lcV93YWl0cSwgJndsKTsKIAogCWxuZXRfZXFfd2FpdF91bmxvY2soKTsKIAogCWlmICh0bXMgPCAwKSB7Ci0JCXdhaXRxX3dhaXQoJndsLCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOwogCiAJfSBlbHNlIHsKIAkJc3RydWN0IHRpbWV2YWwgdHY7CiAKIAkJbm93ID0gY2ZzX3RpbWVfY3VycmVudCgpOwotCQl3YWl0cV90aW1lZHdhaXQoJndsLCBUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJICAgIGNmc190aW1lX3NlY29uZHModG1zKSAvIDEwMDApOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHModG1zKSAvIDEwMDApOwogCQljZnNfZHVyYXRpb25fdXNlYyhjZnNfdGltZV9zdWIoY2ZzX3RpbWVfY3VycmVudCgpLCBub3cpLCAmdHYpOwogCQl0bXMgLT0gKGludCkodHYudHZfc2VjICogMTAwMCArIHR2LnR2X3VzZWMgLyAxMDAwKTsKIAkJaWYgKHRtcyA8IDApIC8qIG5vIG1vcmUgd2FpdCBidXQgbWF5IGhhdmUgbmV3IGV2ZW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItcHRsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItcHRsLmMKaW5kZXggNmZmZmQ1ZS4uOTIwZGY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXB0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1wdGwuYwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJCXVuc2lnbmVkIGxvbmcgaGFzaCA9IG1iaXRzICsgaWQubmlkICsgaWQucGlkOwogCiAJCUxBU1NFUlQobG5ldF9wdGxfaXNfdW5pcXVlKHB0bCkpOwotCQloYXNoID0gY2ZzX2hhc2hfbG9uZyhoYXNoLCBMTkVUX01UX0hBU0hfQklUUyk7CisJCWhhc2ggPSBoYXNoX2xvbmcoaGFzaCwgTE5FVF9NVF9IQVNIX0JJVFMpOwogCQlyZXR1cm4gJm10YWJsZS0+bXRfbWhhc2hbaGFzaF07CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jCmluZGV4IDI4Njk3NzYuLjcyODAyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3BlZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9wZWVyLmMKQEAgLTE0NSw3ICsxNDUsOCBAQAogCQkJCSAgICAgICAiV2FpdGluZyBmb3IgJWQgcGVlcnMgb24gcGVlciB0YWJsZVxuIiwKIAkJCQkgICAgICAgcHRhYmxlLT5wdF9udW1iZXIpOwogCQkJfQotCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkgLyAyKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIpOwogCQkJbG5ldF9uZXRfbG9jayhpKTsKIAkJfQogCQlsaXN0X3NwbGljZV9pbml0KCZwdGFibGUtPnB0X2RlYXRocm93LCAmZGVhdGhyb3cpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXIuYwppbmRleCBkMWVlNDQyLi45OTVmNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXIuYwpAQCAtNzc5LDcgKzc3OSw4IEBACiAJCWlmIChhbGxfa25vd24pCiAJCQlyZXR1cm47CiAKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJfQogfQogCkBAIC0xMTQ3LDcgKzExNDgsOCBAQAogCQlpKys7CiAJCUNERUJVRygoKGkgJiAoLWkpKSA9PSBpKSA/IERfV0FSTklORyA6IERfTkVULAogCQkgICAgICAgIldhaXRpbmcgZm9yIHJjIGJ1ZmZlcnMgdG8gdW5saW5rXG4iKTsKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkgLyA0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkgLyA0KTsKIAogCQlsbmV0X25ldF9sb2NrKExORVRfTE9DS19FWCk7CiAJfQpAQCAtMTIwNiwxMSArMTIwOCwxMSBAQAogCiAJCWxuZXRfcHJ1bmVfcmNfZGF0YSgwKTsgLyogZG9uJ3Qgd2FpdCBmb3IgVU5MSU5LICovCiAKLQkJLyogQ2FsbCBjZnNfcGF1c2UoKSBoZXJlIGFsd2F5cyBhZGRzIDEgdG8gbG9hZCBhdmVyYWdlCisJCS8qIENhbGwgc2NoZWR1bGVfdGltZW91dCgpIGhlcmUgYWx3YXlzIGFkZHMgMSB0byBsb2FkIGF2ZXJhZ2UKIAkJICogYmVjYXVzZSBrZXJuZWwgY291bnRzICMgYWN0aXZlIHRhc2tzIGFzIG5yX3J1bm5pbmcKIAkJICogKyBucl91bmludGVycnVwdGlibGUuICovCi0JCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJCQkgICBjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAl9CiAKIAlMQVNTRVJUKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU1RPUFBJTkcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyX3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlcl9wcm9jLmMKaW5kZXggMjBkNTNlMC4uMGNiZDlmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyX3Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXJfcHJvYy5jCkBAIC04MzcsOCArODM3LDggQEAKIAlyYyA9IC1FSU5WQUw7CiAJbG5ldF9yZXNfbG9jaygwKTsKIAlmb3IgKGkgPSAwOyBwb3J0YWxfcm90b3JzW2ldLnByX25hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChjZnNfc3RybmNhc2VjbXAocG9ydGFsX3JvdG9yc1tpXS5wcl9uYW1lLCB0bXAsCi0JCQkJICAgIHN0cmxlbihwb3J0YWxfcm90b3JzW2ldLnByX25hbWUpKSA9PSAwKSB7CisJCWlmIChzdHJuY2FzZWNtcChwb3J0YWxfcm90b3JzW2ldLnByX25hbWUsIHRtcCwKKwkJCQlzdHJsZW4ocG9ydGFsX3JvdG9yc1tpXS5wcl9uYW1lKSkgPT0gMCkgewogCQkJcG9ydGFsX3JvdG9yID0gcG9ydGFsX3JvdG9yc1tpXS5wcl92YWx1ZTsKIAkJCXJjID0gMDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jCmluZGV4IDUzZDU4OTIuLjhkMWVlYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25ycGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMKQEAgLTEzNDYsNyArMTM0Niw4IEBACiAJCW11dGV4X3VubG9jaygmY29uc29sZV9zZXNzaW9uLnNlc19tdXRleCk7CiAKIAkJQ1dBUk4oIlNlc3Npb24gaXMgc2h1dHRpbmcgZG93biwgd2FpdGluZyBmb3IgdGVybWluYXRpb24gb2YgdHJhbnNhY3Rpb25zXG4iKTsKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAKIAkJbXV0ZXhfbG9jaygmY29uc29sZV9zZXNzaW9uLnNlc19tdXRleCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKaW5kZXggMmE4ZWRkYy4uMzUyZmM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCkBAIC02MSw3ICs2MSw3IEBACiAKIGxzdGNvbl9zZXNzaW9uX3QJY29uc29sZV9zZXNzaW9uOwogCi12b2lkCitzdGF0aWMgdm9pZAogbHN0Y29uX25vZGVfZ2V0KGxzdGNvbl9ub2RlX3QgKm5kKQogewogCUxBU1NFUlQgKG5kLT5uZF9yZWYgPj0gMSk7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGxzdGNvbl9ub2RlX3B1dChsc3Rjb25fbm9kZV90ICpuZCkKIHsKIAlsc3Rjb25fbmRsaW5rX3QgICpuZGw7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAl9CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX3Nlc3JwY19jb25kaXRpb24oaW50IHRyYW5zb3AsIGxzdGNvbl9ub2RlX3QgKm5kLCB2b2lkICphcmcpCiB7CiAJbHN0Y29uX2dyb3VwX3QgKmdycCA9IChsc3Rjb25fZ3JvdXBfdCAqKWFyZzsKQEAgLTM3Myw3ICszNzMsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9zZXNycGNfcmVhZGVudChpbnQgdHJhbnNvcCwgc3JwY19tc2dfdCAqbXNnLAogCQkgICAgICBsc3Rjb25fcnBjX2VudF90ICplbnRfdXApCiB7CkBAIC04MzAsNyArODMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fYmF0Y2hfZmluZChjb25zdCBjaGFyICpuYW1lLCBsc3Rjb25fYmF0Y2hfdCAqKmJhdHBwKQogewogCWxzdGNvbl9iYXRjaF90ICAgKmJhdDsKQEAgLTk5OCw3ICs5OTgsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fYmF0cnBjX2NvbmRpdGlvbihpbnQgdHJhbnNvcCwgbHN0Y29uX25vZGVfdCAqbmQsIHZvaWQgKmFyZykKIHsKIAlzd2l0Y2ggKHRyYW5zb3ApIHsKQEAgLTExNDEsNyArMTE0MSw3IEBACiAJTElCQ0ZTX0ZSRUUoYmF0LCBzaXplb2YobHN0Y29uX2JhdGNoX3QpKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fdGVzdHJwY19jb25kaXRpb24oaW50IHRyYW5zb3AsIGxzdGNvbl9ub2RlX3QgKm5kLCB2b2lkICphcmcpCiB7CiAJbHN0Y29uX3Rlc3RfdCAgICAqdGVzdDsKQEAgLTEzNzAsNyArMTM3MCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl90ZXN0X2ZpbmQobHN0Y29uX2JhdGNoX3QgKmJhdGNoLCBpbnQgaWR4LCBsc3Rjb25fdGVzdF90ICoqdGVzdHBwKQogewogCWxzdGNvbl90ZXN0X3QgKnRlc3Q7CkBAIC0xMzg1LDcgKzEzODUsNyBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl90c2JycGNfcmVhZGVudChpbnQgdHJhbnNvcCwgc3JwY19tc2dfdCAqbXNnLAogCQkgICAgICBsc3Rjb25fcnBjX2VudF90ICplbnRfdXApCiB7CkBAIC0xNDY0LDcgKzE0NjQsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fc3RhdHJwY19yZWFkZW50KGludCB0cmFuc29wLCBzcnBjX21zZ190ICptc2csCiAJCSAgICAgICBsc3Rjb25fcnBjX2VudF90ICplbnRfdXApCiB7CkBAIC0xNDg4LDcgKzE0ODgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9uZGxpc3Rfc3RhdChzdHJ1Y3QgbGlzdF9oZWFkICpuZGxpc3QsCiAJCSAgIGludCB0aW1lb3V0LCBzdHJ1Y3QgbGlzdF9oZWFkICpyZXN1bHRfdXApCiB7CkBAIC0xNTc3LDcgKzE1NzcsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fZGVidWdfbmRsaXN0KHN0cnVjdCBsaXN0X2hlYWQgKm5kbGlzdCwKIAkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKnRyYW5zbGlzdCwKIAkJICAgIGludCB0aW1lb3V0LCBzdHJ1Y3QgbGlzdF9oZWFkICpyZXN1bHRfdXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKaW5kZXggZDgzODk4NS4uOWZjMDQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYwpAQCAtMTU4NSw3ICsxNTg1LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmc3JwY19kYXRhLnJwY19nbG9jayk7CiAKIAkvKiAxIHNlY29uZCBwYXVzZSB0byBhdm9pZCB0aW1lc3RhbXAgcmV1c2UgKi8KLQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJc3JwY19kYXRhLnJwY19tYXRjaGJpdHMgPSAoKF9fdTY0KSBjZnNfdGltZV9jdXJyZW50X3NlYygpKSA8PCA0ODsKIAogCXNycGNfZGF0YS5ycGNfc3RhdGUgPSBTUlBDX1NUQVRFX05PTkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3Qvc2VsZnRlc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9zZWxmdGVzdC5oCmluZGV4IDIyODkyN2UuLmY0ODA2YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9zZWxmdGVzdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9zZWxmdGVzdC5oCkBAIC01NzIsNyArNTcyLDExIEBACiAjdW5kZWYgU1RBVEUyU1RSCiB9CiAKLSNkZWZpbmUgc2VsZnRlc3Rfd2FpdF9ldmVudHMoKQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDEwKQorI2RlZmluZSBzZWxmdGVzdF93YWl0X2V2ZW50cygpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsJXAorCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkgLyAxMCk7CVwKKwl9IHdoaWxlICgwKQogCiAKICNkZWZpbmUgbHN0X3dhaXRfdW50aWwoY29uZCwgbG9jaywgZm10LCAuLi4pCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMKaW5kZXggNzlmYzJmZS4uMzQwMWM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMKQEAgLTE5Niw4ICsxOTYsOCBAQAogCWlmIChyYW5nZV9pc19leGhhdXN0ZWQoJnNlcS0+bGNzX3NwYWNlKSkgewogCQlyYyA9IHNlcV9jbGllbnRfYWxsb2NfbWV0YShlbnYsIHNlcSk7CiAJCWlmIChyYykgewotCQkJQ0VSUk9SKCIlczogQ2FuJ3QgYWxsb2NhdGUgbmV3IG1ldGEtc2VxdWVuY2UsIgotCQkJICAgICAgICJyYyAlZFxuIiwgc2VxLT5sY3NfbmFtZSwgcmMpOworCQkJQ0VSUk9SKCIlczogQ2FuJ3QgYWxsb2NhdGUgbmV3IG1ldGEtc2VxdWVuY2UsIHJjICVkXG4iLAorCQkJCXNlcS0+bGNzX25hbWUsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfSBlbHNlIHsKIAkJCUNERUJVRyhEX0lORk8sICIlczogTmV3IHJhbmdlIC0gIkRSQU5HRSJcbiIsCkBAIC0yMjUsNyArMjI1LDcgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQltdXRleF91bmxvY2soJnNlcS0+bGNzX211dGV4KTsKIAotCQl3YWl0cV93YWl0KGxpbmssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKIAogCQltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZzZXEtPmxjc193YWl0cSwgbGluayk7CkBAIC0yNTYsNyArMjU2LDcgQEAKIAogCUxBU1NFUlQoc2VxbnIgIT0gTlVMTCk7CiAJbXV0ZXhfbG9jaygmc2VxLT5sY3NfbXV0ZXgpOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJmxpbmspOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZsaW5rLCBjdXJyZW50KTsKIAogCXdoaWxlICgxKSB7CiAJCXJjID0gc2VxX2ZpZF9hbGxvY19wcmVwKHNlcSwgJmxpbmspOwpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKIAogCXJjID0gc2VxX2NsaWVudF9hbGxvY19zZXEoZW52LCBzZXEsIHNlcW5yKTsKIAlpZiAocmMpIHsKLQkJQ0VSUk9SKCIlczogQ2FuJ3QgYWxsb2NhdGUgbmV3IHNlcXVlbmNlLCAiCi0JCSAgICAgICAicmMgJWRcbiIsIHNlcS0+bGNzX25hbWUsIHJjKTsKKwkJQ0VSUk9SKCIlczogQ2FuJ3QgYWxsb2NhdGUgbmV3IHNlcXVlbmNlLCByYyAlZFxuIiwKKwkJCXNlcS0+bGNzX25hbWUsIHJjKTsKIAkJc2VxX2ZpZF9hbGxvY19maW5pKHNlcSk7CiAJCW11dGV4X3VubG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JQ0RFQlVHKERfSU5GTywgIiVzOiBhbGxvY2F0ZSBzZXF1ZW5jZSAiCi0JICAgICAgICJbMHglMTYuMTYiTFBGNjQieF1cbiIsIHNlcS0+bGNzX25hbWUsICpzZXFucik7CisJQ0RFQlVHKERfSU5GTywgIiVzOiBhbGxvY2F0ZSBzZXF1ZW5jZSBbMHglMTYuMTYiTFBGNjQieF1cbiIsCisJCQlzZXEtPmxjc19uYW1lLCAqc2VxbnIpOwogCiAJLyogU2luY2UgdGhlIGNhbGxlciByZXF1aXJlIHRoZSB3aG9sZSBzZXEsCiAJICogc28gbWFya2VkIHRoaXMgc2VxIHRvIGJlIHVzZWQgKi8KQEAgLTMwNiw3ICszMDYsNyBAQAogCUxBU1NFUlQoc2VxICE9IE5VTEwpOwogCUxBU1NFUlQoZmlkICE9IE5VTEwpOwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmbGluayk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJmxpbmssIGN1cnJlbnQpOwogCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKIAogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9TRVFfRVhIQVVTVCkpCkBAIC0zMjksMTUgKzMyOSwxNSBAQAogCiAJCXJjID0gc2VxX2NsaWVudF9hbGxvY19zZXEoZW52LCBzZXEsICZzZXFucik7CiAJCWlmIChyYykgewotCQkJQ0VSUk9SKCIlczogQ2FuJ3QgYWxsb2NhdGUgbmV3IHNlcXVlbmNlLCAiCi0JCQkgICAgICAgInJjICVkXG4iLCBzZXEtPmxjc19uYW1lLCByYyk7CisJCQlDRVJST1IoIiVzOiBDYW4ndCBhbGxvY2F0ZSBuZXcgc2VxdWVuY2UsIHJjICVkXG4iLAorCQkJCXNlcS0+bGNzX25hbWUsIHJjKTsKIAkJCXNlcV9maWRfYWxsb2NfZmluaShzZXEpOwogCQkJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAotCQlDREVCVUcoRF9JTkZPLCAiJXM6IFN3aXRjaCB0byBzZXF1ZW5jZSAiCi0JCSAgICAgICAiWzB4JTE2LjE2IkxQRjY0InhdXG4iLCBzZXEtPmxjc19uYW1lLCBzZXFucik7CisJCUNERUJVRyhEX0lORk8sICIlczogU3dpdGNoIHRvIHNlcXVlbmNlIFsweCUxNi4xNiJMUEY2NCJ4XVxuIiwKKwkJCQlzZXEtPmxjc19uYW1lLCBzZXFucik7CiAKIAkJc2VxLT5sY3NfZmlkLmZfb2lkID0gTFVTVFJFX0ZJRF9JTklUX09JRDsKIAkJc2VxLT5sY3NfZmlkLmZfc2VxID0gc2VxbnI7CkBAIC0zNzAsNyArMzcwLDcgQEAKIAl3YWl0X3F1ZXVlX3QgbGluazsKIAogCUxBU1NFUlQoc2VxICE9IE5VTEwpOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJmxpbmspOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZsaW5rLCBjdXJyZW50KTsKIAltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKIAl3aGlsZSAoc2VxLT5sY3NfdXBkYXRlKSB7CkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQltdXRleF91bmxvY2soJnNlcS0+bGNzX211dGV4KTsKIAotCQl3YWl0cV93YWl0KCZsaW5rLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAKIAkJbXV0ZXhfbG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmc2VxLT5sY3Nfd2FpdHEsICZsaW5rKTsKQEAgLTQyOCw4ICs0MjgsOCBAQAogCXJjID0gbHByb2Nmc19hZGRfdmFycyhzZXEtPmxjc19wcm9jX2RpciwKIAkJCSAgICAgIHNlcV9jbGllbnRfcHJvY19saXN0LCBzZXEpOwogCWlmIChyYykgewotCQlDRVJST1IoIiVzOiBDYW4ndCBpbml0IHNlcXVlbmNlIG1hbmFnZXIgIgotCQkgICAgICAgInByb2MsIHJjICVkXG4iLCBzZXEtPmxjc19uYW1lLCByYyk7CisJCUNFUlJPUigiJXM6IENhbid0IGluaXQgc2VxdWVuY2UgbWFuYWdlciBwcm9jLCByYyAlZFxuIiwKKwkJCXNlcS0+bGNzX25hbWUsIHJjKTsKIAkJR09UTyhvdXRfY2xlYW51cCwgcmMpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9jYWNoZS5jCmluZGV4IDZjMzc5MzAuLmEwNmE2NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2NhY2hlLmMKQEAgLTIzNiw4ICsyMzYsOCBAQAogCQludW0rKzsKIAl9CiAKLQlDREVCVUcoRF9JTkZPLCAiJXM6IEZMRCBjYWNoZSAtIFNocnVuayBieSAiCi0JICAgICAgICIlZCBlbnRyaWVzXG4iLCBjYWNoZS0+ZmNpX25hbWUsIG51bSk7CisJQ0RFQlVHKERfSU5GTywgIiVzOiBGTEQgY2FjaGUgLSBTaHJ1bmsgYnkgJWQgZW50cmllc1xuIiwKKwkJCWNhY2hlLT5mY2lfbmFtZSwgbnVtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzU1LDcgKzM1NSw3IEBACiAJCWZsZF9jYWNoZV9lbnRyeV9hZGQoY2FjaGUsIGZfbmV3LCAmZl9jdXJyLT5mY2VfbGlzdCk7CiAJfSBlbHNlCiAJCUNFUlJPUigiTkVXIHJhbmdlID0iRFJBTkdFIiBjdXJyID0gIkRSQU5HRSJcbiIsCi0JCSAgICAgICBQUkFOR0UocmFuZ2UpLFBSQU5HRSgmZl9jdXJyLT5mY2VfcmFuZ2UpKTsKKwkJICAgICAgIFBSQU5HRShyYW5nZSksIFBSQU5HRSgmZl9jdXJyLT5mY2VfcmFuZ2UpKTsKIH0KIAogc3RydWN0IGZsZF9jYWNoZV9lbnRyeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCmluZGV4IDVmMzkzNWMuLjg2NjFhNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmgKQEAgLTkwLDcgKzkwLDcgQEAKIAlpbnQJCSAgICAgIGZjaV90aHJlc2hvbGQ7CiAKIAkvKioKLQkgKiBQcmVmZXJlZCBudW1iZXIgb2YgY2FjaGVkIGVudHJpZXMgKi8KKwkgKiBQcmVmZXJyZWQgbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzICovCiAJaW50CQkgICAgICBmY2lfY2FjaGVfc2l6ZTsKIAogCS8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX3JlcXVlc3QuYwppbmRleCA4OTZmOWZlLi4xZjhhYmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX3JlcXVlc3QuYwpAQCAtMTM4LDkgKzEzOCw4IEBACiAJCQlyZXR1cm4gdGFyZ2V0OwogCX0KIAotCUNFUlJPUigiJXM6IENhbid0IGZpbmQgdGFyZ2V0IGJ5IGhhc2ggJWQgKHNlcSAiTFBYNjQiKS4gIgotCSAgICAgICAiVGFyZ2V0cyAoJWQpOlxuIiwgZmxkLT5sY2ZfbmFtZSwgaGFzaCwgc2VxLAotCSAgICAgICBmbGQtPmxjZl9jb3VudCk7CisJQ0VSUk9SKCIlczogQ2FuJ3QgZmluZCB0YXJnZXQgYnkgaGFzaCAlZCAoc2VxICJMUFg2NCIpLiBUYXJnZXRzICglZCk6XG4iLAorCQlmbGQtPmxjZl9uYW1lLCBoYXNoLCBzZXEsIGZsZC0+bGNmX2NvdW50KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmZmxkLT5sY2ZfdGFyZ2V0cywgZnRfY2hhaW4pIHsKIAkJY29uc3QgY2hhciAqc3J2X25hbWUgPSB0YXJnZXQtPmZ0X3NydiAhPSBOVUxMICA/CkBAIC0yMDksOSArMjA4LDggQEAKIAlMQVNTRVJUKHRhci0+ZnRfc3J2ICE9IE5VTEwgfHwgdGFyLT5mdF9leHAgIT0gTlVMTCk7CiAKIAlpZiAoZmxkLT5sY2ZfZmxhZ3MgIT0gTFVTVFJFX0ZMRF9JTklUKSB7Ci0JCUNFUlJPUigiJXM6IEF0dGVtcHQgdG8gYWRkIHRhcmdldCAlcyAoaWR4ICJMUFU2NCIpICIKLQkJICAgICAgICJvbiBmbHkgLSBza2lwIGl0XG4iLCBmbGQtPmxjZl9uYW1lLCBuYW1lLAotCQkgICAgICAgdGFyLT5mdF9pZHgpOworCQlDRVJST1IoIiVzOiBBdHRlbXB0IHRvIGFkZCB0YXJnZXQgJXMgKGlkeCAiTFBVNjQiKSBvbiBmbHkgLSBza2lwIGl0XG4iLAorCQkJZmxkLT5sY2ZfbmFtZSwgbmFtZSwgdGFyLT5mdF9pZHgpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQlDREVCVUcoRF9JTkZPLCAiJXM6IEFkZGluZyB0YXJnZXQgJXMgKGlkeCAiCkBAIC00NzYsOSArNDc0LDggQEAKIAl0YXJnZXQgPSBmbGRfY2xpZW50X2dldF90YXJnZXQoZmxkLCBzZXEpOwogCUxBU1NFUlQodGFyZ2V0ICE9IE5VTEwpOwogCi0JQ0RFQlVHKERfSU5GTywgIiVzOiBMb29rdXAgZmxkIGVudHJ5IChzZXE6ICJMUFg2NCIpIG9uICIKLQkgICAgICAgInRhcmdldCAlcyAoaWR4ICJMUFU2NCIpXG4iLCBmbGQtPmxjZl9uYW1lLCBzZXEsCi0JICAgICAgIGZsZF90YXJnZXRfbmFtZSh0YXJnZXQpLCB0YXJnZXQtPmZ0X2lkeCk7CisJQ0RFQlVHKERfSU5GTywgIiVzOiBMb29rdXAgZmxkIGVudHJ5IChzZXE6ICJMUFg2NCIpIG9uIHRhcmdldCAlcyAoaWR4ICJMUFU2NCIpXG4iLAorCQkJZmxkLT5sY2ZfbmFtZSwgc2VxLCBmbGRfdGFyZ2V0X25hbWUodGFyZ2V0KSwgdGFyZ2V0LT5mdF9pZHgpOwogCiAJcmVzLmxzcl9zdGFydCA9IHNlcTsKIAlmbGRfcmFuZ2Vfc2V0X3R5cGUoJnJlcywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmgKaW5kZXggNGQ2OTJkYy4uYzgwOTIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2NsX29iamVjdC5oCkBAIC0xMzE0LDcgKzEzMTQsNyBAQAogICogY2FsbHMuIFRvIGFjaGlldmUgdGhpcywgZXZlcnkgbGF5ZXIgY2FuIGltcGxlbWVudCAtPmNsb19maXRzX2ludG8oKSBtZXRob2QsCiAgKiB0aGF0IGlzIGNhbGxlZCBieSBsb2NrIG1hdGNoaW5nIGNvZGUgKGNsX2xvY2tfbG9va3VwKCkpLCBhbmQgdGhhdCBjYW4gYmUKICAqIHVzZWQgdG8gc2VsZWN0aXZlbHkgZGlzYWJsZSBtYXRjaGluZyBvZiBjZXJ0YWluIGxvY2tzIGZvciBjZXJ0YWluIElPcy4gRm9yCi0gKiBleG1hcGxlLCBsb3YgbGF5ZXIgaW1wbGVtZW50cyBsb3ZfbG9ja19maXRzX2ludG8oKSB0aGF0IGFsbG93IG11bHRpLXN0cmlwZQorICogZXhhbXBsZSwgbG92IGxheWVyIGltcGxlbWVudHMgbG92X2xvY2tfZml0c19pbnRvKCkgdGhhdCBhbGxvdyBtdWx0aS1zdHJpcGUKICAqIGxvY2tzIHRvIGJlIG1hdGNoZWQgb25seSBmb3IgdHJ1bmNhdGVzIGFuZCBPX0FQUEVORCB3cml0ZXMuCiAgKgogICogSW50ZXJhY3Rpb24gd2l0aCBETE0KQEAgLTIzODUsMTQgKzIzODUsMTggQEAKIAkgKiBDaGVjayBpZiBsYXlvdXQgY2hhbmdlZCBhZnRlciB0aGUgSU8gZmluaXNoZXMuIE1haW5seSBmb3IgSFNNCiAJICogcmVxdWlyZW1lbnQuIElmIElPIG9jY3VycyB0byBvcGVubmluZyBmaWxlcywgaXQgZG9lc24ndCBuZWVkIHRvCiAJICogdmVyaWZ5IGxheW91dCBiZWNhdXNlIEhTTSB3b24ndCByZWxlYXNlIG9wZW5uaW5nIGZpbGVzLgotCSAqIFJpZ2h0IG5vdywgb25seSB0d28gb3BlcnRhaW9ucyBuZWVkIHRvIHZlcmlmeSBsYXlvdXQ6IGdsaW1wc2UKKwkgKiBSaWdodCBub3csIG9ubHkgdHdvIG9wZXJhdGlvbnMgbmVlZCB0byB2ZXJpZnkgbGF5b3V0OiBnbGltcHNlCiAJICogYW5kIHNldGF0dHIuCiAJICovCiAJCQkgICAgIGNpX3ZlcmlmeV9sYXlvdXQ6MSwKIAkvKioKIAkgKiBmaWxlIGlzIHJlbGVhc2VkLCByZXN0b3JlIGhhcyB0byB0byBiZSB0cmlnZ2VyZWQgYnkgdnZwIGxheWVyCiAJICovCi0JCQkgICAgIGNpX3Jlc3RvcmVfbmVlZGVkOjE7CisJCQkgICAgIGNpX3Jlc3RvcmVfbmVlZGVkOjEsCisJLyoqCisJICogT19OT0FUSU1FCisJICovCisJCQkgICAgIGNpX25vYXRpbWU6MTsKIAkvKioKIAkgKiBOdW1iZXIgb2YgcGFnZXMgb3duZWQgYnkgdGhpcyBJTy4gRm9yIGludmFyaWFudCBjaGVja2luZy4KIAkgKi8KQEAgLTI1NTIsNyArMjU1Niw3IEBACiAgKi8KIHN0cnVjdCBjbF9yZXEgewogCWVudW0gY2xfcmVxX3R5cGUgICAgICBjcnFfdHlwZTsKLQkvKiogQSBsaXN0IG9mIHBhZ2VzIGJlaW5nIHRyYW5zZmVyZWQgKi8KKwkvKiogQSBsaXN0IG9mIHBhZ2VzIGJlaW5nIHRyYW5zZmVycmVkICovCiAJc3RydWN0IGxpc3RfaGVhZAkgICAgY3JxX3BhZ2VzOwogCS8qKiBOdW1iZXIgb2YgcGFnZXMgaW4gY2xfcmVxOjpjcnFfcGFnZXMgKi8KIAl1bnNpZ25lZAkgICAgICBjcnFfbnJwYWdlczsKQEAgLTMyMjQsNyArMzIyOCw3IEBACiAgKgogICogICAgIC0gY2FsbCBjaGFpbnMgaGF2ZSBubyBub24tbHVzdHJlIHBvcnRpb25zIGluc2VydGVkIGJldHdlZW4gbHVzdHJlIGNvZGUuCiAgKgotICogT24gYSBjbGllbnQgYm90aCB0aGVzZSBhc3N1bXRwaW9uIGZhaWxzLCBiZWNhdXNlIGV2ZXJ5IHVzZXIgdGhyZWFkIGNhbgorICogT24gYSBjbGllbnQgYm90aCB0aGVzZSBhc3N1bXB0aW9uIGZhaWxzLCBiZWNhdXNlIGV2ZXJ5IHVzZXIgdGhyZWFkIGNhbgogICogcG90ZW50aWFsbHkgZXhlY3V0ZSBsdXN0cmUgY29kZSBhcyBwYXJ0IG9mIGEgc3lzdGVtIGNhbGwsIGFuZCBsdXN0cmUgY2FsbHMKICAqIGludG8gVkZTIG9yIE1NIHRoYXQgY2FsbCBiYWNrIGludG8gbHVzdHJlLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW9jdGwuaAppbmRleCAyMjdjMjYxLi5iOTg2OTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9pb2N0bC5oCkBAIC0zOCw3ICszOCw3IEBACiAgKiBhbmQgb24gbmV3ZXIga2VybmVscyB0aGlzIGhlYWRlciBpcyBzaGFyZWQgYXMgX0FTTV9HRU5FUklDX0lPQ1RMX0guCiAgKgogICogV2UgY2FuIGF2b2lkIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBrZXJuZWwgaGVhZGVyIGJlaW5nIGluY2x1ZGVkIGFnYWluIGJ5Ci0gKiBkZWZpbmluZyBfQVNNX0kzODZfSU9DVExfSCBoZXJlIHNvIHRoYXQgYSBsYXRlciBvY2N1cmVuY2Ugb2YgPGFzbS9pb2N0bC5oPgorICogZGVmaW5pbmcgX0FTTV9JMzg2X0lPQ1RMX0ggaGVyZSBzbyB0aGF0IGEgbGF0ZXIgb2NjdXJyZW5jZSBvZiA8YXNtL2lvY3RsLmg+CiAgKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBrZXJuZWwncyBpb2N0bC5oIGFmdGVyIHRoaXMgb25lLiBiPTE0NzQ2ICovCiAjZGVmaW5lIF9BU01fSTM4Nl9JT0NUTF9ICiAjZGVmaW5lIF9BU01fR0VORVJJQ19JT0NUTF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xjbGllbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oCmluZGV4IDI3MzE2ZjcuLjgyNzIwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oCkBAIC0xMTgsOCArMTE4LDggQEAKIH07CiAKIC8qKgotICogVHJ1ZSwgaWYgXGEgaW8gaXMgYSBub3JtYWwgaW8sIEZhbHNlIGZvciBvdGhlciAoc2VuZGZpbGUsIHNwbGljZSopLgotICogbXVzdCBiZSBpbXBlbWVudGF0ZWQgaW4gYXJjaCBzcGVjaWZpYyBjb2RlLgorICogVHJ1ZSwgaWYgXGEgaW8gaXMgYSBub3JtYWwgaW8sIEZhbHNlIGZvciBzcGxpY2Vfe3JlYWQsd3JpdGV9LgorICogbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhcmNoIHNwZWNpZmljIGNvZGUuCiAgKi8KIGludCBjbF9pc19ub3JtYWxpbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIGNvbnN0IHN0cnVjdCBjbF9pbyAqaW8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9hY2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2FjbC5oCmluZGV4IDc3OGIxMjMuLmE5MWM1NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2FjbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2FjbC5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIF9MVVNUUkVfTElOVVhfQUNMX0gKIAogI2lmbmRlZglfTFVTVFJFX0FDTF9ICi0jZXJyb3IJU2hvdWQgbm90IGluY2x1ZGUgZGlyZWVjdGx5LiB1c2UgI2luY2x1ZGUgPGx1c3RyZV9hY2wuaD4gaW5zdGVhZAorI2Vycm9yCVNob3VsZCBub3QgaW5jbHVkZSBkaXJlY3RseS4gdXNlICNpbmNsdWRlIDxsdXN0cmVfYWNsLmg+IGluc3RlYWQKICNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvb2JkLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L29iZC5oCmluZGV4IDAxYTUwMjYuLmRjMzZmNzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L29iZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvb2JkLmgKQEAgLTk2LDcgKzk2LDggQEAKIAkJCUxDT05TT0xFX1dBUk4oIj09PT09PSBmb3IgY3VycmVudCBwcm9jZXNzID09PT09XG4iKTsKIAkJCWR1bXBfc3RhY2soKTsKIAkJCUxDT05TT0xFX1dBUk4oIj09PT09PSBlbmQgPT09PT09PVxuIik7Ci0JCQljZnNfcGF1c2UoMTAwMCAqIEhaKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMTAwMCAqIEhaKTsKIAkJfQogCQljcHVfcmVsYXgoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgKaW5kZXggNWRhMzFjNS4uODc5MDViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaApAQCAtOTEsOCArOTEsOCBAQAogI2lmbmRlZiBfTFVTVFJFX0lETF9IXwogI2RlZmluZSBfTFVTVFJFX0lETF9IXwogCi0jaWYgIWRlZmluZWQoTEFTU0VSVCkgJiYgIWRlZmluZWQoTFBVNjQpCi0jaW5jbHVkZSA8bGludXgvbGliY2ZzL2xpYmNmcy5oPiAvKiBmb3IgTEFTU0VSVCwgTFBVWDY0LCBldGMgKi8KKyNpZiAhZGVmaW5lZChMUFU2NCkKKyNpbmNsdWRlIDxsaW51eC9saWJjZnMvbGliY2ZzLmg+IC8qIGZvciBMUFVYNjQsIGV0YyAqLwogI2VuZGlmCiAKIC8qIERlZm4ncyBzaGFyZWQgd2l0aCB1c2VyLXNwYWNlLiAqLwpAQCAtMjMyLDcgKzIzMiw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZmxkX3JhbmdlX3NldF90eXBlKHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlLAogCQkJCSAgICAgIHVuc2lnbmVkIGZsYWdzKQogewotCUxBU1NFUlQoIShmbGFncyAmIH5MVV9TRVFfUkFOR0VfTUFTSykpOwogCXJhbmdlLT5sc3JfZmxhZ3MgfD0gZmxhZ3M7CiB9CiAKQEAgLTM1MSw3ICszNTAsNyBAQAogCS8qKiBCaXRmaWVsZCBmb3Igc3VwcG9ydGVkIGRhdGEgaW4gdGhpcyBzdHJ1Y3R1cmUuIEZvciBmdXR1cmUgdXNlLiAqLwogCV9fdTMyCXNvbV9jb21wYXQ7CiAKLQkvKiogSW5jb21wYXQgZmVhdHVyZSBsaXN0LiBUaGUgc3VwcG9ydGVkIGZlYXR1cmUgbWFzayBpcyBhdmFpbGFiZSBpbgorCS8qKiBJbmNvbXBhdCBmZWF0dXJlIGxpc3QuIFRoZSBzdXBwb3J0ZWQgZmVhdHVyZSBtYXNrIGlzIGF2YWlsYWJsZSBpbgogCSAqIFNPTV9JTkNPTVBBVF9TVVBQICovCiAJX191MzIJc29tX2luY29tcGF0OwogCkBAIC02MTUsNyArNjE0LDYgQEAKIC8qIGV4dHJhY3Qgb3N0IGluZGV4IGZyb20gSURJRiBGSUQgKi8KIHN0YXRpYyBpbmxpbmUgX191MzIgZmlkX2lkaWZfb3N0X2lkeChjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7Ci0JTEFTU0VSVChmaWRfaXNfaWRpZihmaWQpKTsKIAlyZXR1cm4gKGZpZF9zZXEoZmlkKSA+PiAxNikgJiAweGZmZmY7CiB9CiAKQEAgLTgzMywxMSArODMxLDYgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGZpZF9jcHVfdG9fbGUoc3RydWN0IGx1X2ZpZCAqZHN0LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpzcmMpCiB7Ci0JLyogY2hlY2sgdGhhdCBhbGwgZmllbGRzIGFyZSBjb252ZXJ0ZWQgKi8KLQlDTEFTU0VSVChzaXplb2YoKnNyYykgPT0KLQkJIHNpemVvZihmaWRfc2VxKHNyYykpICsKLQkJIHNpemVvZihmaWRfb2lkKHNyYykpICsKLQkJIHNpemVvZihmaWRfdmVyKHNyYykpKTsKIAlkc3QtPmZfc2VxID0gY3B1X3RvX2xlNjQoZmlkX3NlcShzcmMpKTsKIAlkc3QtPmZfb2lkID0gY3B1X3RvX2xlMzIoZmlkX29pZChzcmMpKTsKIAlkc3QtPmZfdmVyID0gY3B1X3RvX2xlMzIoZmlkX3ZlcihzcmMpKTsKQEAgLTg0NSwxMSArODM4LDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGZpZF9sZV90b19jcHUoc3RydWN0IGx1X2ZpZCAqZHN0LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpzcmMpCiB7Ci0JLyogY2hlY2sgdGhhdCBhbGwgZmllbGRzIGFyZSBjb252ZXJ0ZWQgKi8KLQlDTEFTU0VSVChzaXplb2YoKnNyYykgPT0KLQkJIHNpemVvZihmaWRfc2VxKHNyYykpICsKLQkJIHNpemVvZihmaWRfb2lkKHNyYykpICsKLQkJIHNpemVvZihmaWRfdmVyKHNyYykpKTsKIAlkc3QtPmZfc2VxID0gbGU2NF90b19jcHUoZmlkX3NlcShzcmMpKTsKIAlkc3QtPmZfb2lkID0gbGUzMl90b19jcHUoZmlkX29pZChzcmMpKTsKIAlkc3QtPmZfdmVyID0gbGUzMl90b19jcHUoZmlkX3ZlcihzcmMpKTsKQEAgLTg1NywxMSArODQ1LDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGZpZF9jcHVfdG9fYmUoc3RydWN0IGx1X2ZpZCAqZHN0LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpzcmMpCiB7Ci0JLyogY2hlY2sgdGhhdCBhbGwgZmllbGRzIGFyZSBjb252ZXJ0ZWQgKi8KLQlDTEFTU0VSVChzaXplb2YoKnNyYykgPT0KLQkJIHNpemVvZihmaWRfc2VxKHNyYykpICsKLQkJIHNpemVvZihmaWRfb2lkKHNyYykpICsKLQkJIHNpemVvZihmaWRfdmVyKHNyYykpKTsKIAlkc3QtPmZfc2VxID0gY3B1X3RvX2JlNjQoZmlkX3NlcShzcmMpKTsKIAlkc3QtPmZfb2lkID0gY3B1X3RvX2JlMzIoZmlkX29pZChzcmMpKTsKIAlkc3QtPmZfdmVyID0gY3B1X3RvX2JlMzIoZmlkX3ZlcihzcmMpKTsKQEAgLTg2OSwxMSArODUyLDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGZpZF9iZV90b19jcHUoc3RydWN0IGx1X2ZpZCAqZHN0LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpzcmMpCiB7Ci0JLyogY2hlY2sgdGhhdCBhbGwgZmllbGRzIGFyZSBjb252ZXJ0ZWQgKi8KLQlDTEFTU0VSVChzaXplb2YoKnNyYykgPT0KLQkJIHNpemVvZihmaWRfc2VxKHNyYykpICsKLQkJIHNpemVvZihmaWRfb2lkKHNyYykpICsKLQkJIHNpemVvZihmaWRfdmVyKHNyYykpKTsKIAlkc3QtPmZfc2VxID0gYmU2NF90b19jcHUoZmlkX3NlcShzcmMpKTsKIAlkc3QtPmZfb2lkID0gYmUzMl90b19jcHUoZmlkX29pZChzcmMpKTsKIAlkc3QtPmZfdmVyID0gYmUzMl90b19jcHUoZmlkX3ZlcihzcmMpKTsKQEAgLTg5NywxMSArODc1LDYgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbHVfZmlkX2VxKGNvbnN0IHN0cnVjdCBsdV9maWQgKmYwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmMSkKIHsKLQkvKiBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGFsaWdubWVudCBwYWRkaW5nLiAqLwotCUNMQVNTRVJUKHNpemVvZigqZjApID09Ci0JCSBzaXplb2YoZjAtPmZfc2VxKSArCi0JCSBzaXplb2YoZjAtPmZfb2lkKSArCi0JCSBzaXplb2YoZjAtPmZfdmVyKSk7CiAJcmV0dXJuIG1lbWNtcChmMCwgZjEsIHNpemVvZigqZjApKSA9PSAwOwogfQogCkBAIC05NjAsNyArOTMzLDcgQEAKIAlMVURBX1RZUEUJCT0gMHgwMDAyLAogCUxVREFfNjRCSVRIQVNICQk9IDB4MDAwNCwKIAotCS8qIFRoZSBmb2xsb3dpbmcgYXR0cnMgYXJlIHVzZWQgZm9yIE1EVCBpbnRlcmFubCBvbmx5LAorCS8qIFRoZSBmb2xsb3dpbmcgYXR0cnMgYXJlIHVzZWQgZm9yIE1EVCBpbnRlcm5hbCBvbmx5LAogCSAqIG5vdCB2aXNpYmxlIHRvIGNsaWVudCAqLwogCiAJLyogVmVyaWZ5IHRoZSBkaXJlbnQgY29uc2lzdGVuY3kgKi8KQEAgLTEzMzEsNiArMTMwNCw5IEBACiAjZGVmaW5lIE9CRF9DT05ORUNUX0xJR0hUV0VJR0hUIDB4MTAwMDAwMDAwMDAwMFVMTC8qIGxpZ2h0d2VpZ2h0IGNvbm5lY3Rpb24gKi8KICNkZWZpbmUgT0JEX0NPTk5FQ1RfU0hPUlRJTyAgICAgMHgyMDAwMDAwMDAwMDAwVUxMLyogc2hvcnQgaW8gKi8KICNkZWZpbmUgT0JEX0NPTk5FQ1RfUElOR0xFU1MJMHg0MDAwMDAwMDAwMDAwVUxMLyogcGluZ3Mgbm90IHJlcXVpcmVkICovCisjZGVmaW5lIE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQJMHg4MDAwMDAwMDAwMDAwVUxMLyogZmxvY2sgZGVhZGxvY2sgZGV0ZWN0aW9uICovCisjZGVmaW5lIE9CRF9DT05ORUNUX0RJU1BfU1RSSVBFIDB4MTAwMDAwMDAwMDAwMDBVTEwvKmNyZWF0ZSBzdHJpcGUgZGlzcG9zaXRpb24qLworCiAvKiBYWFggUkVBRE1FIFhYWDoKICAqIFBsZWFzZSBETyBOT1QgYWRkIGZsYWcgdmFsdWVzIGhlcmUgYmVmb3JlIGZpcnN0IGVuc3VyaW5nIHRoYXQgdGhpcyBzYW1lCiAgKiBmbGFnIHZhbHVlIGlzIG5vdCBpbiB1c2Ugb24gc29tZSBvdGhlciBicmFuY2guICBQbGVhc2UgY2xlYXIgYW55IHN1Y2gKQEAgLTEzNjgsNyArMTM0NCwxMCBAQAogCQkJCU9CRF9DT05ORUNUX0VJTlBST0dSRVNTIHwgXAogCQkJCU9CRF9DT05ORUNUX0xJR0hUV0VJR0hUIHwgT0JEX0NPTk5FQ1RfVU1BU0sgfCBcCiAJCQkJT0JEX0NPTk5FQ1RfTFZCX1RZUEUgfCBPQkRfQ09OTkVDVF9MQVlPVVRMT0NLIHxcCi0JCQkJT0JEX0NPTk5FQ1RfUElOR0xFU1MgfCBPQkRfQ09OTkVDVF9NQVhfRUFTSVpFKQorCQkJCU9CRF9DT05ORUNUX1BJTkdMRVNTIHwgT0JEX0NPTk5FQ1RfTUFYX0VBU0laRSB8XAorCQkJCU9CRF9DT05ORUNUX0ZMT0NLX0RFQUQgfCBcCisJCQkJT0JEX0NPTk5FQ1RfRElTUF9TVFJJUEUpCisKICNkZWZpbmUgT1NUX0NPTk5FQ1RfU1VQUE9SVEVEICAoT0JEX0NPTk5FQ1RfU1JWTE9DSyB8IE9CRF9DT05ORUNUX0dSQU5UIHwgXAogCQkJCU9CRF9DT05ORUNUX1JFUVBPUlRBTCB8IE9CRF9DT05ORUNUX1ZFUlNJT04gfCBcCiAJCQkJT0JEX0NPTk5FQ1RfVFJVTkNMT0NLIHwgT0JEX0NPTk5FQ1RfSU5ERVggfCBcCkBAIC0xNzcxLDcgKzE3NTAsNiBAQAogCQkJICBPQkRfTURfRkxHSUQgICB8IE9CRF9NRF9GTEZMQUdTIHwgT0JEX01EX0ZMTkxJTksgfCBcCiAJCQkgIE9CRF9NRF9GTEdFTkVSIHwgT0JEX01EX0ZMUkRFViAgfCBPQkRfTURfRkxHUk9VUCkKIAotI2RlZmluZSBPQkRfTURfRkxYQVRUUkxPQ0tFRCBPQkRfTURfRkxHRVRBVFRSTE9DSwogI2RlZmluZSBPQkRfTURfRkxYQVRUUkFMTCAoT0JEX01EX0ZMWEFUVFIgfCBPQkRfTURfRkxYQVRUUkxTKQogCiAvKiBkb24ndCBmb3JnZXQgb2Jkb19maWQgd2hpY2ggaXMgd2F5IGRvd24gYXQgdGhlIGJvdHRvbSBzbyBpdCBjYW4KQEAgLTIxMzQsMTkgKzIxMTIsMzIgQEAKICNkZWZpbmUgRElTUF9MT09LVVBfUE9TICAgICAgMHgwMDAwMDAwOAogI2RlZmluZSBESVNQX09QRU5fQ1JFQVRFICAgICAweDAwMDAwMDEwCiAjZGVmaW5lIERJU1BfT1BFTl9PUEVOICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRElTUF9FTlFfQ09NUExFVEUgICAgMHgwMDQwMDAwMAorI2RlZmluZSBESVNQX0VOUV9DT01QTEVURSAgICAweDAwNDAwMDAwCQkvKiBvYnNvbGV0ZSBhbmQgdW51c2VkICovCiAjZGVmaW5lIERJU1BfRU5RX09QRU5fUkVGICAgIDB4MDA4MDAwMDAKICNkZWZpbmUgRElTUF9FTlFfQ1JFQVRFX1JFRiAgMHgwMTAwMDAwMAogI2RlZmluZSBESVNQX09QRU5fTE9DSyAgICAgICAweDAyMDAwMDAwCiAjZGVmaW5lIERJU1BfT1BFTl9MRUFTRSAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgRElTUF9PUEVOX1NUUklQRSAgICAgMHgwODAwMDAwMAogCiAvKiBJTk9ERSBMT0NLIFBBUlRTICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfTE9PS1VQIDB4MDAwMDAxICAgICAgIC8qIGRlbnRyeSwgbW9kZSwgb3duZXIsIGdyb3VwICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfVVBEQVRFIDB4MDAwMDAyICAgICAgIC8qIHNpemUsIGxpbmtzLCB0aW1lc3RhbXBzICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfT1BFTiAgIDB4MDAwMDA0ICAgICAgIC8qIEZvciBvcGVuZWQgZmlsZXMgKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19MQVlPVVQgMHgwMDAwMDggICAgICAgLyogZm9yIGxheW91dCAqLwotI2RlZmluZSBNRFNfSU5PREVMT0NLX1BFUk0gICAweDAwMDAxMCAgICAgICAvKiBmb3IgcGVybWlzc2lvbiAqLwotI2RlZmluZSBNRFNfSU5PREVMT0NLX1hBVFRSICAweDAwMDAyMCAgICAgICAvKiBleHRlbmRlZCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfTE9PS1VQIDB4MDAwMDAxCS8qIEZvciBuYW1lc3BhY2UsIGRlbnRyeSBldGMsIGFuZCBhbHNvCisJCQkJCSAqIHdhcyB1c2VkIHRvIHByb3RlY3QgcGVybWlzc2lvbiAobW9kZSwKKwkJCQkJICogb3duZXIsIGdyb3VwIGV0YykgYmVmb3JlIDIuNC4gKi8KKyNkZWZpbmUgTURTX0lOT0RFTE9DS19VUERBVEUgMHgwMDAwMDIJLyogc2l6ZSwgbGlua3MsIHRpbWVzdGFtcHMgKi8KKyNkZWZpbmUgTURTX0lOT0RFTE9DS19PUEVOICAgMHgwMDAwMDQJLyogRm9yIG9wZW5lZCBmaWxlcyAqLworI2RlZmluZSBNRFNfSU5PREVMT0NLX0xBWU9VVCAweDAwMDAwOAkvKiBmb3IgbGF5b3V0ICovCisKKy8qIFRoZSBQRVJNIGJpdCBpcyBhZGRlZCBpbnQgMi40LCBhbmQgaXQgaXMgdXNlZCB0byBwcm90ZWN0IHBlcm1pc3Npb24obW9kZSwKKyAqIG93bmVyLCBncm91cCwgYWNsIGV0YyksIHNvIHRvIHNlcGFyYXRlIHRoZSBwZXJtaXNzaW9uIGZyb20gTE9PS1VQIGxvY2suCisgKiBCZWNhdXNlIGZvciByZW1vdGUgZGlyZWN0b3JpZXMoaW4gRE5FKSwgdGhlc2UgbG9ja3Mgd2lsbCBiZSBncmFudGVkIGJ5CisgKiBkaWZmZXJlbnQgTURUcyhkaWZmZXJlbnQgbGRsbSBuYW1lc3BhY2UpLgorICoKKyAqIEZvciBsb2NhbCBkaXJlY3RvcnksIE1EVCB3aWxsIGFsd2F5cyBncmFudCBVUERBVEVfTE9DS3xQRVJNX0xPQ0sgdG9nZXRoZXIuCisgKiBGb3IgUmVtb3RlIGRpcmVjdG9yeSwgdGhlIG1hc3RlciBNRFQsIHdoZXJlIHRoZSByZW1vdGUgZGlyZWN0b3J5IGlzLCB3aWxsCisgKiBncmFudCBVUERBVEVfTE9DS3xQRVJNX0xPQ0ssIGFuZCB0aGUgcmVtb3RlIE1EVCwgd2hlcmUgdGhlIG5hbWUgZW50cnkgaXMsCisgKiB3aWxsIGdyYW50IExPT0tVUF9MT0NLLiAqLworI2RlZmluZSBNRFNfSU5PREVMT0NLX1BFUk0gICAweDAwMDAxMAorI2RlZmluZSBNRFNfSU5PREVMT0NLX1hBVFRSICAweDAwMDAyMAkvKiBleHRlbmRlZCBhdHRyaWJ1dGVzICovCiAKICNkZWZpbmUgTURTX0lOT0RFTE9DS19NQVhTSElGVCA1CiAvKiBUaGlzIEZVTEwgbG9jayBpcyB1c2VmdWwgdG8gdGFrZSBvbiB1bmxpbmsgc29ydCBvZiBvcGVyYXRpb25zICovCkBAIC0yNTk1LDcgKzI1ODYsNyBAQAogICogRG8gTk9UIGNoYW5nZSB0aGUgc2l6ZSBvZiB2YXJpb3VzIG1lbWJlcnMsIG90aGVyd2lzZSB0aGUgdmFsdWUKICAqIHdpbGwgYmUgYnJva2VuIGluIGx1c3RyZV9zd2FiX21kdF9yZWNfcmVpbnQoKS4KICAqCi0gKiBJZiB5b3UgYWRkIG5ldyBtZW1iZXJzIGluIG90aGVyIG1kdF9yZWludF94eHggc3RydWN0cmVzIGFuZCBuZWVkIHRvIHVzZSB0aGUKKyAqIElmIHlvdSBhZGQgbmV3IG1lbWJlcnMgaW4gb3RoZXIgbWR0X3JlaW50X3h4eCBzdHJ1Y3R1cmVzIGFuZCBuZWVkIHRvIHVzZSB0aGUKICAqIHJyX3BhZGRpbmdfeCBmaWVsZHMsIHRoZW4gdXBkYXRlIGx1c3RyZV9zd2FiX21kdF9yZWNfcmVpbnQoKSBhbHNvLgogICovCiBzdHJ1Y3QgbWR0X3JlY19yZWludCB7CkBAIC0zMzI4LDkgKzMzMTksMTAgQEAKICNkZWZpbmUgb19ncmFudF91c2VkIG9fZGF0YV92ZXJzaW9uCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfc2V0X3dpcmVfb2JkbyhzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAotCQkJCQlzdHJ1Y3Qgb2JkbyAqd29iZG8sIHN0cnVjdCBvYmRvICpsb2JkbykKKwkJCQkJc3RydWN0IG9iZG8gKndvYmRvLAorCQkJCQljb25zdCBzdHJ1Y3Qgb2JkbyAqbG9iZG8pCiB7Ci0JbWVtY3B5KHdvYmRvLCBsb2Jkbywgc2l6ZW9mKCpsb2JkbykpOworCSp3b2JkbyA9ICpsb2JkbzsKIAl3b2Jkby0+b19mbGFncyAmPSB+T0JEX0ZMX0xPQ0FMX01BU0s7CiAJaWYgKG9jZCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0zMzQ1LDE2ICszMzM3LDE1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfZ2V0X3dpcmVfb2JkbyhzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAotCQkJCQlzdHJ1Y3Qgb2JkbyAqbG9iZG8sIHN0cnVjdCBvYmRvICp3b2JkbykKKwkJCQkJc3RydWN0IG9iZG8gKmxvYmRvLAorCQkJCQljb25zdCBzdHJ1Y3Qgb2JkbyAqd29iZG8pCiB7CiAJb2JkX2ZsYWcgbG9jYWxfZmxhZ3MgPSAwOwogCiAJaWYgKGxvYmRvLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpCiAJCSBsb2NhbF9mbGFncyA9IGxvYmRvLT5vX2ZsYWdzICYgT0JEX0ZMX0xPQ0FMX01BU0s7CiAKLQlMQVNTRVJUKCEod29iZG8tPm9fZmxhZ3MgJiBPQkRfRkxfTE9DQUxfTUFTSykpOwotCi0JbWVtY3B5KGxvYmRvLCB3b2Jkbywgc2l6ZW9mKCpsb2JkbykpOworCSpsb2JkbyA9ICp3b2JkbzsKIAlpZiAobG9jYWxfZmxhZ3MgIT0gMCkgewogCQlsb2Jkby0+b192YWxpZCB8PSBPQkRfTURfRkxGTEFHUzsKIAkJbG9iZG8tPm9fZmxhZ3MgJj0gfk9CRF9GTF9MT0NBTF9NQVNLOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgKaW5kZXggNzg5M2Q4My4uZjVmMzY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oCkBAIC0yNjUsMTMgKzI2NSwxMSBAQAogCiAjZGVmaW5lIE1BWF9PQkRfTkFNRSAxMjggLyogSWYgdGhpcyBjaGFuZ2VzLCBhIE5FVyBpb2N0bCBtdXN0IGJlIGFkZGVkICovCiAKLS8qIEhvcGVmdWxseSBPX0xPVl9ERUxBWV9DUkVBVEUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBzdGFuZGFyZCBPX3h4eCBmbGFncy4KLSAqIFByZXZpb3VzbHkgaXQgd2FzIGRlZmluZWQgYXMgMDEwMDAwMDAwMCBhbmQgY29uZmxpY3RzIHdpdGggRk1PREVfTk9OT1RJRlkKLSAqIHdoaWNoIHdhcyBhZGRlZCBzaW5jZSBrZXJuZWwgMi42LjM2LCBzbyB3ZSByZWRlZmluZSBpdCBhcyAwMjAwMDAwMDAuCi0gKiBUbyBiZSBjb21wYXRpYmxlIHdpdGggb2xkIHZlcnNpb24ncyBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcnksIGZpbmFsbHkgd2UKLSAqIGRlZmluZSBpdCBhcyAoMDIwMDAwMDAwIHwgMDEwMDAwMDAwMCkuCi0gKiAqLwotI2RlZmluZSBPX0xPVl9ERUxBWV9DUkVBVEUgICAgICAwMTIwMDAwMDAwCisvKiBEZWZpbmUgT19MT1ZfREVMQVlfQ1JFQVRFIHRvIGJlIGEgbWFzayB0aGF0IGlzIG5vdCB1c2VmdWwgZm9yIHJlZ3VsYXIKKyAqIGZpbGVzLCBidXQgYXJlIHVubGlrZWx5IHRvIGJlIHVzZWQgaW4gcHJhY3RpY2UgYW5kIGFyZSBub3QgaGFybWZ1bCBpZgorICogdXNlZCBpbmNvcnJlY3RseS4gIE9fTk9DVFRZIGFuZCBGQVNZTkMgYXJlIG9ubHkgbWVhbmluZ2Z1bCBmb3IgY2hhcmFjdGVyCisgKiBkZXZpY2VzIGFuZCBhcmUgc2FmZSBmb3IgdXNlIG9uIG5ldyBmaWxlcyAoU2VlIExVLTgxMiwgTFUtNDIwOSkuICovCisjZGVmaW5lIE9fTE9WX0RFTEFZX0NSRUFURQkoT19OT0NUVFkgfCBGQVNZTkMpCiAKICNkZWZpbmUgTExfRklMRV9JR05PUkVfTE9DSyAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBMTF9GSUxFX0dST1VQX0xPQ0tFRCAgICAweDAwMDAwMDAyCkBAIC0zMDAsNyArMjk4LDcgQEAKICNkZWZpbmUgTE9WX01BWF9TVFJJUEVfQ09VTlRfT0xEIDE2MAogLyogVGhpcyBjYWxjdWxhdGlvbiBpcyBjcmFmdGVkIHNvIHRoYXQgaW5wdXQgb2YgNDA5NiB3aWxsIHJlc3VsdCBpbiAxNjAKICAqIHdoaWNoIGluIHR1cm4gaXMgZXF1YWwgdG8gb2xkIG1heGltYWwgc3RyaXBlIGNvdW50LgotICogWFhYOiBJbiBmYWN0IHRoaXMgaXMgdG9vIHNpbXBpZmllZCBmb3Igbm93LCB3aGF0IGl0IGFsc28gbmVlZCBpcyB0byBnZXQKKyAqIFhYWDogSW4gZmFjdCB0aGlzIGlzIHRvbyBzaW1wbGlmaWVkIGZvciBub3csIHdoYXQgaXQgYWxzbyBuZWVkIGlzIHRvIGdldAogICogZWFfdHlwZSBhcmd1bWVudCB0byBjbGVhcmx5IGtub3cgaG93IG11Y2ggc3BhY2UgZWFjaCBzdHJpcGUgY29uc3VtZXMuCiAgKgogICogVGhlIGxpbWl0IG9mIDEyIHBhZ2VzIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGlzIGEgcmVhc29uYWJseSBsYXJnZQpAQCAtOTMwLDcgKzkyOCw3IEBACiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGN1cnJlbnQgaW4tcHJvZ3Jlc3MgYWN0aW9uIGZvciBhIGZpbGUuCi0gKiBpdCBpcyByZXR1bmVkIHRvIHVzZXIgc3BhY2UgYW5kIHNlbmQgb3ZlciB0aGUgd2lyZQorICogaXQgaXMgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSBhbmQgc2VuZCBvdmVyIHRoZSB3aXJlCiAgKi8KIHN0cnVjdCBoc21fY3VycmVudF9hY3Rpb24gewogCS8qKiAgVGhlIGN1cnJlbnQgdW5kZXJnb2luZyBhY3Rpb24sIGlmIHRoZXJlIGlzIG9uZSAqLwpAQCAtMTE1OSwxMiArMTE1Nyw2IEBACiAJX191MzIJCQlwYWRkaW5nOwogfTsKIAotLyoqCi0gKiBVc2UgYnkgY29weXRvb2wgZHVyaW5nIGFueSBoc20gcmVxdWVzdCB0aGV5IGhhbmRsZWQuCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBieSBsbGFwaV9oc21fY29weV9zdGFydCgpCi0gKiB3aGljaCBpcyBhbiBoZWxwZXIgb3ZlciB0aGUgaW9jdGwoKSBpbnRlcmZhY2UKLSAqIFN0b3JlIEx1c3RyZSwgaW50ZXJuYWwgdXNlIG9ubHksIGRhdGEuCi0gKi8KIHN0cnVjdCBoc21fY29weSB7CiAJX191NjQJCQloY19kYXRhX3ZlcnNpb247CiAJX191MTYJCQloY19mbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmgKaW5kZXggZTE0YTVmNi4uMzY4MDY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmgKQEAgLTg4LDYgKzg4LDggQEAKIAlMQ0ZHX1NFVF9MRExNX1RJTUVPVVQgICA9IDB4MDBjZTAzMCwgLyoqPCBzZXQgbGRsbV90aW1lb3V0ICovCiAJTENGR19QUkVfQ0xFQU5VUAk9IDB4MDBjZjAzMSwgLyoqPCBjYWxsIHR5cGUtc3BlY2lmaWMgcHJlCiAJCQkJCSAgICAgICogY2xlYW51cCBjbGVhbnVwICovCisJTENGR19TRVRfUEFSQU0JCT0gMHgwMGNlMDMyLCAvKio8IHVzZSBzZXRfcGFyYW0gc3ludGF4IHRvIHNldAorCQkJCQkgICAgICAqYSBwcm9jIHBhcmFtZXRlcnMgKi8KIH07CiAKIHN0cnVjdCBsdXN0cmVfY2ZnX2J1ZnMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGlzay5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGlzay5oCmluZGV4IDFkZTlhOGIuLmFjMDgxNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2Rpc2suaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kaXNrLmgKQEAgLTk5LDYgKzk5LDggQEAKICNkZWZpbmUgTEREX0ZfSVJfQ0FQQUJMRSAgICAweDIwMDAKIC8qKiB0aGUgTUdTIHJlZnVzZWQgdG8gcmVnaXN0ZXIgdGhlIHRhcmdldC4gKi8KICNkZWZpbmUgTEREX0ZfRVJST1IJIDB4NDAwMAorLyoqIHByb2Nlc3MgYXQgbGN0bCBjb25mX3BhcmFtICovCisjZGVmaW5lIExERF9GX1BBUkFNMgkJMHg4MDAwCiAKIC8qIG9wYyBmb3IgdGFyZ2V0IHJlZ2lzdGVyICovCiAjZGVmaW5lIExERF9GX09QQ19SRUcgICAweDEwMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCmluZGV4IGVjNGJiNWUuLjNlMjVmMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCkBAIC0zMzAsNyArMzMwLDcgQEAKIH07CiAKIHR5cGVkZWYgZW51bSB7Ci0JLyoqIGludmFsaWRlIHR5cGUgKi8KKwkvKiogaW52YWxpZCB0eXBlICovCiAJTERMTV9OU19UWVBFX1VOS05PV04gICAgPSAwLAogCS8qKiBtZGMgbmFtZXNwYWNlICovCiAJTERMTV9OU19UWVBFX01EQywKQEAgLTExODUsNyArMTE4NSw3IEBACiAKIC8qKgogICogVXBkYXRlIExvY2sgVmFsdWUgQmxvY2sgT3BlcmF0aW9ucyAoTFZCTykgb24gYSByZXNvdXJjZSB0YWtpbmcgaW50byBhY2NvdW50Ci0gKiBkYXRhIGZyb20gcmVxZXN0IFxhIHIKKyAqIGRhdGEgZnJvbSByZXF1ZXN0IFxhIHIKICAqLwogc3RhdGljIGlubGluZSBpbnQgbGRsbV9yZXNfbHZib191cGRhdGUoc3RydWN0IGxkbG1fcmVzb3VyY2UgKnJlcywKIAkJCQkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyLCBpbnQgaW5jcmVhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG1fZmxhZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oCmluZGV4IDc1NzE2ZjEuLjE2ZGNkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oCkBAIC0zNSwxMCArMzUsMTAgQEAKICNpZm5kZWYgTERMTV9BTExfRkxBR1NfTUFTSwogCiAvKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAiYWxsX2ZsYWdzIiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfQUxMX0ZMQUdTX01BU0sgICAgICAgICAgMHgwMEZGRkZGRkMwOEYxMzJGVUxMCisjZGVmaW5lIExETE1fRkxfQUxMX0ZMQUdTX01BU0sgICAgICAgICAgMHgwMEZGRkZGRkMwOEY5MzJGVUxMCiAKIC8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJhc3QiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9BU1RfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDAwODAwMDAwMDBVTEwKKyNkZWZpbmUgTERMTV9GTF9BU1RfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDAwODAwMDgwMDBVTEwKIAogLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImJsb2NrZWQiIGJpdHMgKi8KICNkZWZpbmUgTERMTV9GTF9CTE9DS0VEX01BU0sgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMEVVTEwKQEAgLTU2LDcgKzU2LDcgQEAKICNkZWZpbmUgTERMTV9GTF9MT0NBTF9PTkxZX01BU0sgICAgICAgICAweDAwRkZGRkZGMDAwMDAwMDBVTEwKIAogLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgIm9uX3dpcmUiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9PTl9XSVJFX01BU0sgICAgICAgICAgICAweDAwMDAwMDAwQzA4RjEzMkZVTEwKKyNkZWZpbmUgTERMTV9GTF9PTl9XSVJFX01BU0sgICAgICAgICAgICAweDAwMDAwMDAwQzA4RjkzMkZVTEwKIAogLyoqIGV4dGVudCwgbW9kZSwgb3IgcmVzb3VyY2UgY2hhbmdlZCAqLwogI2RlZmluZSBMRExNX0ZMX0xPQ0tfQ0hBTkdFRCAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMVVMTCAvLyBiaXQgICAwCkBAIC0xMTQsNiArMTE0LDEyIEBACiAjZGVmaW5lIGxkbG1fc2V0X2hhc19pbnRlbnQoX2wpICAgICAgICAgTERMTV9TRVRfRkxBRygoICBfbCksIDFVTEwgPDwgMTIpCiAjZGVmaW5lIGxkbG1fY2xlYXJfaGFzX2ludGVudChfbCkgICAgICAgTERMTV9DTEVBUl9GTEFHKChfbCksIDFVTEwgPDwgMTIpCiAKKy8qKiBmbG9jayBkZWFkbG9jayBkZXRlY3RlZCAqLworI2RlZmluZSBMRExNX0ZMX0ZMT0NLX0RFQURMT0NLICAgICAgICAgIDB4MDAwMDAwMDAwMDAwODAwMFVMTCAvKiBiaXQgIDE1ICovCisjZGVmaW5lIGxkbG1faXNfZmxvY2tfZGVhZGxvY2soX2wpICAgICAgTERMTV9URVNUX0ZMQUcoKF9sKSwgMVVMTCA8PCAxNSkKKyNkZWZpbmUgbGRsbV9zZXRfZmxvY2tfZGVhZGxvY2soX2wpICAgICBMRExNX1NFVF9GTEFHKChfbCksIDFVTEwgPDwgMTUpCisjZGVmaW5lIGxkbG1fY2xlYXJfZmxvY2tfZGVhZGxvY2soX2wpICAgTERMTV9DTEVBUl9GTEFHKChfbCksIDFVTEwgPDwgMTUpCisKIC8qKiBkaXNjYXJkIChubyB3cml0ZWJhY2spIG9uIGNhbmNlbCAqLwogI2RlZmluZSBMRExNX0ZMX0RJU0NBUkRfREFUQSAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAxMDAwMFVMTCAvLyBiaXQgIDE2CiAjZGVmaW5lIGxkbG1faXNfZGlzY2FyZF9kYXRhKF9sKSAgICAgICAgTERMTV9URVNUX0ZMQUcoKCBfbCksIDFVTEwgPDwgMTYpCkBAIC0xNDEsNyArMTQ3LDcgQEAKICNkZWZpbmUgbGRsbV9jbGVhcl90ZXN0X2xvY2soX2wpICAgICAgICBMRExNX0NMRUFSX0ZMQUcoKF9sKSwgMVVMTCA8PCAxOSkKIAogLyoqCi0gKiBJbW1lZGlhdGVsbHkgY2FuY2VsIHN1Y2ggbG9ja3Mgd2hlbiB0aGV5IGJsb2NrIHNvbWUgb3RoZXIgbG9ja3MuIFNlbmQKKyAqIEltbWVkaWF0ZWx5IGNhbmNlbCBzdWNoIGxvY2tzIHdoZW4gdGhleSBibG9jayBzb21lIG90aGVyIGxvY2tzLiBTZW5kCiAgKiBjYW5jZWwgbm90aWZpY2F0aW9uIHRvIG9yaWdpbmFsIGxvY2sgaG9sZGVyLCBidXQgZXhwZWN0IG5vIHJlcGx5LiBUaGlzCiAgKiBpcyBmb3IgY2xpZW50cyAobGlrZSBsaWJsdXN0cmUpIHRoYXQgY2Fubm90IGJlIGV4cGVjdGVkIHRvIHJlbGlhYmx5CiAgKiByZXNwb25zZSB0byBibG9ja2luZyBBU1QuICovCkBAIC0yNDIsNyArMjQ4LDcgQEAKIAogLyoqCiAgKiBBIGxvY2sgY29udHJpYnV0ZXMgdG8gdGhlIGtub3duIG1pbmltdW0gc2l6ZSAoS01TKSBjYWxjdWxhdGlvbiB1bnRpbCBpdAotICogaGFzIGZpbmlzaGVkIHRoZSBwYXJ0IG9mIGl0cyBjYW5jZWxhdGlvbiB0aGF0IHBlcmZvcm1zIHdyaXRlIGJhY2sgb24gaXRzCisgKiBoYXMgZmluaXNoZWQgdGhlIHBhcnQgb2YgaXRzIGNhbmNlbGxhdGlvbiB0aGF0IHBlcmZvcm1zIHdyaXRlIGJhY2sgb24gaXRzCiAgKiBkaXJ0eSBwYWdlcy4gIEl0IGNhbiByZW1haW4gb24gdGhlIGdyYW50ZWQgbGlzdCBkdXJpbmcgdGhpcyB3aG9sZSB0aW1lLgogICogVGhyZWFkcyByYWNpbmcgdG8gdXBkYXRlIHRoZSBLTVMgYWZ0ZXIgcGVyZm9ybWluZyB0aGVpciB3cml0ZWJhY2sgbmVlZAogICogdG8ga25vdyB0byBleGNsdWRlIGVhY2ggb3RoZXIncyBsb2NrcyBmcm9tIHRoZSBjYWxjdWxhdGlvbiBhcyB0aGV5IHdhbGsKQEAgLTM5MCw2ICszOTYsNyBAQAogc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9yZXBsYXkgICAgICAgICAgICAgID0gLTE7CiBzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX2ludGVudF9vbmx5ICAgICAgICAgPSAtMTsKIHN0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfaGFzX2ludGVudCAgICAgICAgICA9IC0xOworc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9mbG9ja19kZWFkbG9jayAgICAgID0gLTE7CiBzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX2Rpc2NhcmRfZGF0YSAgICAgICAgPSAtMTsKIHN0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfbm9fdGltZW91dCAgICAgICAgICA9IC0xOwogc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9ibG9ja19ub3dhaXQgICAgICAgID0gLTE7CkBAIC00MzEsNiArNDM4LDcgQEAKIAl7TERMTV9GTF9SRVBMQVksICAgICAgICAgICAgICAiTERMTV9GTF9SRVBMQVkifSwKIAl7TERMTV9GTF9JTlRFTlRfT05MWSwgICAgICAgICAiTERMTV9GTF9JTlRFTlRfT05MWSJ9LAogCXtMRExNX0ZMX0hBU19JTlRFTlQsICAgICAgICAgICJMRExNX0ZMX0hBU19JTlRFTlQifSwKKwl7TERMTV9GTF9GTE9DS19ERUFETE9DSywgICAgICAiTERMTV9GTF9GTE9DS19ERUFETE9DSyJ9LAogCXtMRExNX0ZMX0RJU0NBUkRfREFUQSwgICAgICAgICJMRExNX0ZMX0RJU0NBUkRfREFUQSJ9LAogCXtMRExNX0ZMX05PX1RJTUVPVVQsICAgICAgICAgICJMRExNX0ZMX05PX1RJTUVPVVQifSwKIAl7TERMTV9GTF9CTE9DS19OT1dBSVQsICAgICAgICAiTERMTV9GTF9CTE9DS19OT1dBSVQifSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2V4cG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZXhwb3J0LmgKaW5kZXggMmZlYjM4Yi4uMTAzZjdhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZXhwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZXhwb3J0LmgKQEAgLTE5Miw5ICsxOTIsOSBAQAogCXN0cnVjdCBvYmRfaW1wb3J0CSpleHBfaW1wX3JldmVyc2U7CiAJc3RydWN0IG5pZF9zdGF0CSAgKmV4cF9uaWRfc3RhdHM7CiAJc3RydWN0IGxwcm9jZnNfc3RhdHMgICAgICpleHBfbWRfc3RhdHM7Ci0JLyoqIEFjdGl2ZSBjb25uZXRpb24gKi8KKwkvKiogQWN0aXZlIGNvbm5lY3Rpb24gKi8KIAlzdHJ1Y3QgcHRscnBjX2Nvbm5lY3Rpb24gKmV4cF9jb25uZWN0aW9uOwotCS8qKiBDb25uZWN0aW9uIGNvdW50IHZhbHVlIGZyb20gbGFzdCBzdWNjZXNmdWwgcmVjb25uZWN0IHJwYyAqLworCS8qKiBDb25uZWN0aW9uIGNvdW50IHZhbHVlIGZyb20gbGFzdCBzdWNjZXNzZnVsIHJlY29ubmVjdCBycGMgKi8KIAlfX3UzMgkJICAgICBleHBfY29ubl9jbnQ7CiAJLyoqIEhhc2ggbGlzdCBvZiBhbGwgbGRsbSBsb2NrcyBncmFudGVkIG9uIHRoaXMgZXhwb3J0ICovCiAJc3RydWN0IGNmc19oYXNoCSAgICAgICAqZXhwX2xvY2tfaGFzaDsKQEAgLTM4MCw2ICszODAsMjMgQEAKIAkJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgaW5saW5lIF9fdTY0IGV4cF9jb25uZWN0X2liaXRzKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApCit7CisJc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZDsKKworCW9jZCA9ICZleHAtPmV4cF9jb25uZWN0X2RhdGE7CisJcmV0dXJuIG9jZC0+b2NkX2liaXRzX2tub3duOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaW1wX2Nvbm5lY3RfZGlzcF9zdHJpcGUoc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKK3sKKwlzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkOworCisJTEFTU0VSVChpbXAgIT0gTlVMTCk7CisJb2NkID0gJmltcC0+aW1wX2Nvbm5lY3RfZGF0YTsKKwlyZXR1cm4gb2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0RJU1BfU1RSSVBFOworfQorCiBleHRlcm4gc3RydWN0IG9iZF9leHBvcnQgKmNsYXNzX2Nvbm4yZXhwb3J0KHN0cnVjdCBsdXN0cmVfaGFuZGxlICpjb25uKTsKIGV4dGVybiBzdHJ1Y3Qgb2JkX2RldmljZSAqY2xhc3NfY29ubjJvYmQoc3RydWN0IGx1c3RyZV9oYW5kbGUgKmNvbm4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9maWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oCmluZGV4IDg0YTg5N2UuLjVlN2IzMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oCkBAIC0zMzksNyArMzM5LDcgQEAKIAlzdHJ1Y3QgbXV0ZXgJCWxjc19tdXRleDsKIAogCS8qCi0JICogUmFuZ2Ugb2YgYWxsb3dlZCBmb3IgYWxsb2NhdGlvbiBzZXF1ZWNlcy4gV2hlbiB1c2luZyBsdV9jbGllbnRfc2VxIG9uCisJICogUmFuZ2Ugb2YgYWxsb3dlZCBmb3IgYWxsb2NhdGlvbiBzZXF1ZW5jZXMuIFdoZW4gdXNpbmcgbHVfY2xpZW50X3NlcSBvbgogCSAqIGNsaWVudHMsIHRoaXMgY29udGFpbnMgbWV0YS1zZXF1ZW5jZSByYW5nZS4gQW5kIGZvciBzZXJ2ZXJzIHRoaXMKIAkgKiBjb250YWlucyBzdXBlci1zZXF1ZW5jZSByYW5nZS4KIAkgKi8KQEAgLTM5OCw3ICszOTgsNyBAQAogCS8qIExVU1RSRV9TRVFfU0VSVkVSIG9yIExVU1RSRV9TRVFfQ09OVFJPTExFUiAqLwogCWVudW0gbHVfbWdyX3R5cGUgICAgICAgbHNzX3R5cGU7CiAKLQkvKiBDbGllbnQgaW50ZXJhZmNlIHRvIHJlcXVlc3QgY29udHJvbGxlciAqLworCS8qIENsaWVudCBpbnRlcmZhY2UgdG8gcmVxdWVzdCBjb250cm9sbGVyICovCiAJc3RydWN0IGx1X2NsaWVudF9zZXEgICAqbHNzX2NsaTsKIAogCS8qIE11dGV4IGZvciBwcm90ZWN0aW5nIGFsbG9jYXRpb24gKi8KQEAgLTU2OCwxNCArNTY4LDE0IEBACiAgKiBmaW5hbGx5LCB3aGVuIHdlIHJlcGxhY2Ugb3N0X2lkIHdpdGggRklEIGluIGRhdGEgc3RhY2suCiAgKgogICogQ3VycmVudGx5LCByZXNpZCBmcm9tIHRoZSBvbGQgY2xpZW50LCB3aG9zZSByZXNbMF0gPSBvYmplY3RfaWQsCi0gKiByZXNbMV0gPSBvYmplY3Rfc2VxLCBpcyBqdXN0IG9wb3NpdGUgd2l0aCBNZXRhdGRhdGEKKyAqIHJlc1sxXSA9IG9iamVjdF9zZXEsIGlzIGp1c3Qgb3Bwb3NpdGUgd2l0aCBNZXRhdGRhdGEKICAqIHJlc2lkLCB3aGVyZSwgcmVzWzBdID0gZmlkLT5mX3NlcSwgcmVzWzFdID0gZmlkLT5mX29pZC4KLSAqIFRvIHVuaWZpeSB0aGUgcmVzaWQgaWRlbnRpZmljYXRpb24sIHdlIHdpbGwgcmV2ZXJzZSB0aGUgZGF0YQorICogVG8gdW5pZnkgdGhlIHJlc2lkIGlkZW50aWZpY2F0aW9uLCB3ZSB3aWxsIHJldmVyc2UgdGhlIGRhdGEKICAqIHJlc2lkIHRvIGtlZXAgaXQgc2FtZSB3aXRoIE1ldGFkYXRhIHJlc2lkLCBpLmUuCiAgKgogICogRm9yIHJlc2lkIGZyb20gdGhlIG9sZCBjbGllbnQsCiAgKiAgICByZXNbMF0gPSBvYmppZCwgIHJlc1sxXSA9IDAsIHN0aWxsIGtlZXAgdGhlIG9yaWdpbmFsIG9yZGVyLAotICogICAgZm9yIGNvbXBhdGlibGl0eS4KKyAqICAgIGZvciBjb21wYXRpYmlsaXR5LgogICoKICAqIEZvciBuZXcgcmVzaWQKICAqICAgIHJlcyB3aWxsIGJlIGJ1aWx0IGZyb20gbm9ybWFsIEZJRCBkaXJlY3RseSwgaS5lLiByZXNbMF0gPSBmX3NlcSwKQEAgLTY4NSw3ICs2ODUsNyBAQAogewogCS8qIGFsbCBvYmplY3RzIHdpdGggc2FtZSBpZCBhbmQgZGlmZmVyZW50IHZlcnNpb25zIHdpbGwgYmVsb25nIHRvIHNhbWUKIAkgKiBjb2xsaXNpb25zIGxpc3QuICovCi0JcmV0dXJuIGNmc19oYXNoX2xvbmcoZmlkX2ZsYXR0ZW4oZiksIGJpdHMpOworCXJldHVybiBoYXNoX2xvbmcoZmlkX2ZsYXR0ZW4oZiksIGJpdHMpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmgKaW5kZXggNjcyNTllYi4uMDFlZDc4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmgKQEAgLTE1Miw3ICsxNTIsNyBAQAogfTsKIAogLyoqCi0gKiBEZWZpbnRpb24gb2YgUG9ydGFsUlBDIGltcG9ydCBzdHJ1Y3R1cmUuCisgKiBEZWZpbml0aW9uIG9mIFBvcnRhbFJQQyBpbXBvcnQgc3RydWN0dXJlLgogICogSW1wb3J0cyBhcmUgcmVwcmVzZW50aW5nIGNsaWVudC1zaWRlIHZpZXcgdG8gcmVtb3RlIHRhcmdldC4KICAqLwogc3RydWN0IG9iZF9pbXBvcnQgewpAQCAtMTgwLDYgKzE4MCwxNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJCWltcF9kZWxheWVkX2xpc3Q7CiAJLyoqIEB9ICovCiAKKwkvKioKKwkgKiBMaXN0IG9mIHJlcXVlc3RzIHRoYXQgYXJlIHJldGFpbmVkIGZvciBjb21taXR0ZWQgb3BlbiByZXBsYXkuIE9uY2UKKwkgKiBvcGVuIGlzIGNvbW1pdHRlZCwgb3BlbiByZXBsYXkgcmVxdWVzdCB3aWxsIGJlIG1vdmVkIGZyb20gdGhlCisJICogaW1wX3JlcGxheV9saXN0IGludG8gdGhlIGltcF9jb21taXR0ZWRfbGlzdC4KKwkgKiBUaGUgaW1wX3JlcGxheV9jdXJzb3IgaXMgZm9yIGFjY2VsZXJhdGluZyBzZWFyY2hpbmcgZHVyaW5nIHJlcGxheS4KKwkgKiBAeworCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJCWltcF9jb21taXR0ZWRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgICAqaW1wX3JlcGxheV9jdXJzb3I7CisJLyoqIEB9ICovCisKIAkvKiogb2JkIGRldmljZSBmb3IgdGhpcyBpbXBvcnQgKi8KIAlzdHJ1Y3Qgb2JkX2RldmljZQkqaW1wX29iZDsKIApAQCAtMjE5LDcgKzIzMCw3IEBACiAJKiBhZnRlciBhIGNoZWNrIHRvIHNhdmUgb24gdW5uZWNlc3NhcnkgcmVwbGF5IGxpc3QgaXRlcmF0aW9ucwogCSovCiAJaW50CQkgICAgICAgaW1wX2xhc3RfZ2VuZXJhdGlvbl9jaGVja2VkOwotCS8qKiBMYXN0IHRyYW5ubyB3ZSByZXBsYXllZCAqLworCS8qKiBMYXN0IHRyYW5zbm8gd2UgcmVwbGF5ZWQgKi8KIAlfX3U2NAkJICAgICBpbXBfbGFzdF9yZXBsYXlfdHJhbnNubzsKIAkvKiogTGFzdCB0cmFuc25vIGNvbW1pdHRlZCBvbiByZW1vdGUgc2lkZSAqLwogCV9fdTY0CQkgICAgIGltcF9wZWVyX2NvbW1pdHRlZF90cmFuc25vOwpAQCAtMjM3LDcgKzI0OCw3IEBACiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgICAgICBpbXBfcmVtb3RlX2hhbmRsZTsKIAkvKiogV2hlbiB0byBwZXJmb3JtIG5leHQgcGluZy4gdGltZSBpbiBqaWZmaWVzLiAqLwogCWNmc190aW1lX3QJCWltcF9uZXh0X3Bpbmc7Ci0JLyoqIFdoZW4gd2UgbGFzdCBzdWNjZXNmdWxseSBjb25uZWN0ZWQuIHRpbWUgaW4gNjRiaXQgamlmZmllcyAqLworCS8qKiBXaGVuIHdlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZC4gdGltZSBpbiA2NGJpdCBqaWZmaWVzICovCiAJX191NjQJCSAgICAgaW1wX2xhc3Rfc3VjY2Vzc19jb25uOwogCiAJLyoqIExpc3Qgb2YgYWxsIHBvc3NpYmxlIGNvbm5lY3Rpb24gZm9yIGltcG9ydC4gKi8KQEAgLTI2OCw3ICsyNzksNyBAQAogCQkJCSAgaW1wX25vX2xvY2tfcmVwbGF5OjEsCiAJCQkJICAvKiByZWNvdmVyeSBieSB2ZXJzaW9ucyB3YXMgZmFpbGVkICovCiAJCQkJICBpbXBfdmJyX2ZhaWxlZDoxLAotCQkJCSAgLyogZm9yY2UgYW4gaW1taWRpYXRlIHBpbmcgKi8KKwkJCQkgIC8qIGZvcmNlIGFuIGltbWVkaWF0ZSBwaW5nICovCiAJCQkJICBpbXBfZm9yY2VfdmVyaWZ5OjEsCiAJCQkJICAvKiBmb3JjZSBhIHNjaGVkdWxlZCBwaW5nICovCiAJCQkJICBpbXBfZm9yY2VfbmV4dF92ZXJpZnk6MSwKQEAgLTI4MSw3ICsyOTIsNyBAQAogCQkJCSAgLyogbmVlZCBJUiBNTkUgc3dhYiAqLwogCQkJCSAgaW1wX25lZWRfbW5lX3N3YWI6MSwKIAkJCQkgIC8qIGltcG9ydCBtdXN0IGJlIHJlY29ubmVjdGVkIGluc3RlYWQgb2YKLQkJCQkgICAqIGNob3VzZSBuZXcgY29ubmVjdGlvbiAqLworCQkJCSAgICogY2hvc2UgbmV3IGNvbm5lY3Rpb24gKi8KIAkJCQkgIGltcF9mb3JjZV9yZWNvbm5lY3Q6MSwKIAkJCQkgIC8qIGltcG9ydCBoYXMgdHJpZWQgdG8gY29ubmVjdCB3aXRoIHNlcnZlciAqLwogCQkJCSAgaW1wX2Nvbm5lY3RfdHJpZWQ6MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmgKaW5kZXggNjA5YTA5MC4uMDM2OGNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmgKQEAgLTUzNiw3ICs1MzYsNyBAQAogCWlmIChjb25kaXRpb24pCQkJCQkJCSBcCiAJCWJyZWFrOwkJCQkJCQkgXAogCQkJCQkJCQkJICAgICAgIFwKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZfX3dhaXQpOwkJCQkJICAgIFwKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsJCQkJCSAgICBcCiAJbF9hZGRfd2FpdCgmd3EsICZfX3dhaXQpOwkJCQkJICAgICAgXAogCQkJCQkJCQkJICAgICAgIFwKIAkvKiBCbG9jayBhbGwgc2lnbmFscyAoanVzdCB0aGUgbm9uLWZhdGFsIG9uZXMgaWYgbm8gdGltZW91dCkuICovICAgICAgIFwKQEAgLTU1OCwxNSArNTU4LDEzIEBACiAJCQlicmVhazsJCQkJCQkgXAogCQkJCQkJCQkJICAgICAgIFwKIAkJaWYgKF9fdGltZW91dCA9PSAwKSB7CQkJCQkgIFwKLQkJCXdhaXRxX3dhaXQoJl9fd2FpdCwgX193c3RhdGUpOwkJICAgICBcCisJCQlzY2hlZHVsZSgpOwkJCQkJCVwKIAkJfSBlbHNlIHsJCQkJCQkgICAgICAgXAogCQkJY2ZzX2R1cmF0aW9uX3QgaW50ZXJ2YWwgPSBpbmZvLT5sd2lfaW50ZXJ2YWw/CSAgXAogCQkJCQkgICAgIG1pbl90KGNmc19kdXJhdGlvbl90LAkgICAgIFwKIAkJCQkJCSBpbmZvLT5sd2lfaW50ZXJ2YWwsX190aW1lb3V0KTpcCiAJCQkJCSAgICAgX190aW1lb3V0OwkJCVwKLQkJCWNmc19kdXJhdGlvbl90IHJlbWFpbmluZyA9IHdhaXRxX3RpbWVkd2FpdCgmX193YWl0LFwKLQkJCQkJCSAgIF9fd3N0YXRlLAkJICAgXAotCQkJCQkJICAgaW50ZXJ2YWwpOwkJICBcCisJCQljZnNfZHVyYXRpb25fdCByZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0KGludGVydmFsKTtcCiAJCQlfX3RpbWVvdXQgPSBjZnNfdGltZV9zdWIoX190aW1lb3V0LAkJICAgIFwKIAkJCQkJICAgIGNmc190aW1lX3N1YihpbnRlcnZhbCwgcmVtYWluaW5nKSk7XAogCQkJaWYgKF9fdGltZW91dCA9PSAwKSB7CQkJCSAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGlua2VhLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaAppbmRleCA1NzkwYmU5Li41MDBhY2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaApAQCAtMzMsNyArMzMsNyBAQAogCSAqLwogCXN0cnVjdCBsdV9idWYJCSpsZF9idWY7CiAJLyoqCi0JICogVGhlIG1hdGNoZWQgaGVhZGVyLCBlbnRyeSBhbmQgaXRzIGxlbmdodCBpbiB0aGUgRUEKKwkgKiBUaGUgbWF0Y2hlZCBoZWFkZXIsIGVudHJ5IGFuZCBpdHMgbGVuZ3RoIGluIHRoZSBFQQogCSAqLwogCXN0cnVjdCBsaW5rX2VhX2hlYWRlcgkqbGRfbGVoOwogCXN0cnVjdCBsaW5rX2VhX2VudHJ5CSpsZF9sZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oCmluZGV4IGMxZTAyNzAuLjQ2OGYzNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oCkBAIC0xNjYsNiArMTY2LDE3IEBACiB2b2lkIGl0X3NldF9kaXNwb3NpdGlvbihzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIGludCBmbGFnKTsKIGludCBpdF9vcGVuX2Vycm9yKGludCBwaGFzZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KTsKIAorc3RhdGljIGlubGluZSBib29sIGNsX2lzX2xvdl9kZWxheV9jcmVhdGUodW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiAoZmxhZ3MgJiBPX0xPVl9ERUxBWV9DUkVBVEUpID09IE9fTE9WX0RFTEFZX0NSRUFURTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsX2xvdl9kZWxheV9jcmVhdGVfY2xlYXIodW5zaWduZWQgaW50ICpmbGFncykKK3sKKwlpZiAoKCpmbGFncyAmIE9fTE9WX0RFTEFZX0NSRUFURSkgPT0gT19MT1ZfREVMQVlfQ1JFQVRFKQorCQkqZmxhZ3MgJj0gfk9fTE9WX0RFTEFZX0NSRUFURTsKK30KKwogLyoqIEB9IG1kYyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmgKaW5kZXggZDhkMDg4MC4uNzQ1YWRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmgKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCWxuZXRfaGFuZGxlX21kX3QgICAgICAgcnNfbWRfaDsKIAlhdG9taWNfdAkgICByc19yZWZjb3VudDsKIAotCS8qKiBDb250ZXh0IGZvciB0aGUgc2V2aWNlIHRocmVhZCAqLworCS8qKiBDb250ZXh0IGZvciB0aGUgc2VydmljZSB0aHJlYWQgKi8KIAlzdHJ1Y3QgcHRscnBjX3N2Y19jdHggKnJzX3N2Y19jdHg7CiAJLyoqIFJlcGx5IGJ1ZmZlciAoYWN0dWFsbHkgc2VudCB0byB0aGUgY2xpZW50KSwgZW5jb2RlZCBpZiBuZWVkZWQgKi8KIAlzdHJ1Y3QgbHVzdHJlX21zZyAgICAgKnJzX3JlcGJ1ZjsgICAgICAgLyogd3JhcHBlciAqLwpAQCAtNDU0LDkgKzQ1NCw5IEBACiAJLyoqIFNpemUgb2YgdGhlIHJlcGx5IG1lc3NhZ2UgKi8KIAlpbnQJCSAgICByc19yZXBkYXRhX2xlbjsgIC8qIHdyYXBwZXIgbXNnIGxlbmd0aCAqLwogCS8qKgotCSAqIEFjdHVhbCByZXBseSBtZXNzYWdlLiBJdHMgY29udGVudCBpcyBlbmNydXB0ZWQgKGlmIG5lZWRlZCkgdG8KKwkgKiBBY3R1YWwgcmVwbHkgbWVzc2FnZS4gSXRzIGNvbnRlbnQgaXMgZW5jcnlwdGVkIChpZiBuZWVkZWQpIHRvCiAJICogcHJvZHVjZSByZXBseSBidWZmZXIgZm9yIGFjdHVhbCBzZW5kaW5nLiBJbiBzaW1wbGUgY2FzZQotCSAqIG9mIG5vIG5ldHdvcmsgZW5jcnlwdGlvbiB3ZSBqdXMgc2V0IFxhIHJzX3JlcGJ1ZiB0byBcYSByc19tc2cKKwkgKiBvZiBubyBuZXR3b3JrIGVuY3J5cHRpb24gd2UganVzdCBzZXQgXGEgcnNfcmVwYnVmIHRvIFxhIHJzX21zZwogCSAqLwogCXN0cnVjdCBsdXN0cmVfbXNnICAgICAqcnNfbXNnOwkgIC8qIHJlcGx5IG1lc3NhZ2UgKi8KIApAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJc3BpbmxvY2tfdCBwcnBfbG9jazsKIAkvKiogbGlzdCBvZiBwdGxycGNfcmVxdWVzdCBzdHJ1Y3RzICovCiAJc3RydWN0IGxpc3RfaGVhZCBwcnBfcmVxX2xpc3Q7Ci0JLyoqIE1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgd291bGQgZml0IGludG8gYSBycXVlc3QgZnJvbSB0aGlzIHBvb2wgKi8KKwkvKiogTWF4aW11bSBtZXNzYWdlIHNpemUgdGhhdCB3b3VsZCBmaXQgaW50byBhIHJlcXVlc3QgZnJvbSB0aGlzIHBvb2wgKi8KIAlpbnQgcHJwX3JxX3NpemU7CiAJLyoqIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1vcmUgcmVxdWVzdHMgZm9yIHRoaXMgcG9vbCAqLwogCXZvaWQgKCpwcnBfcG9wdWxhdGUpKHN0cnVjdCBwdGxycGNfcmVxdWVzdF9wb29sICosIGludCk7CkBAIC05MDQsNyArOTA0LDcgQEAKIAkgKi8KIAlzdHJ1Y3QgbW9kdWxlCQkJICAqbmNfb3duZXI7CiAJLyoqCi0JICogUG9saWN5IHJlZ2lzdHJhdGlvbiBmbGFnczsgYSBiaXRtYXN0IG9mIFxlIG5yc19wb2xpY3lfZmxhZ3MKKwkgKiBQb2xpY3kgcmVnaXN0cmF0aW9uIGZsYWdzOyBhIGJpdG1hc2sgb2YgXGUgbnJzX3BvbGljeV9mbGFncwogCSAqLwogCXVuc2lnbmVkCQkJICAgbmNfZmxhZ3M7CiB9OwpAQCAtMTM1MSw3ICsxMzUxLDcgQEAKIAkgKi8KIAllbnVtIG5yc19vcnJfc3VwcAkJb2Rfc3VwcDsKIAkvKioKLQkgKiBSb3VuZCBSb2JpbiBxdWFudHVtOyB0aGUgbWF4aXVtIG51bWJlciBvZiBSUENzIHRoYXQgZWFjaCByZXF1ZXN0CisJICogUm91bmQgUm9iaW4gcXVhbnR1bTsgdGhlIG1heGltdW0gbnVtYmVyIG9mIFJQQ3MgdGhhdCBlYWNoIHJlcXVlc3QKIAkgKiBiYXRjaCBmb3IgZWFjaCBvYmplY3Qgb3IgT1NUIGNhbiBoYXZlIGluIGEgc2NoZWR1bGluZyByb3VuZC4KIAkgKi8KIAlfX3UxNgkJCQlvZF9xdWFudHVtOwpAQCAtMTQ4Niw3ICsxNDg2LDcgQEAKIAkJICovCiAJCXN0cnVjdCBucnNfZmlmb19yZXEJZmlmbzsKIAkJLyoqCi0JCSAqIENSUi1OIHJlcXVlc3QgZGVmaW50aW9uCisJCSAqIENSUi1OIHJlcXVlc3QgZGVmaW5pdGlvbgogCQkgKi8KIAkJc3RydWN0IG5yc19jcnJuX3JlcQljcnI7CiAJCS8qKiBPUlIgYW5kIFRSUiBzaGFyZSB0aGUgc2FtZSByZXF1ZXN0IGRlZmluaXRpb24gKi8KQEAgLTE1NTAsNyArMTU1MCw3IEBACiAJICogcmVxdWVzdHMgaW4gdGltZQogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcnFfdGltZWRfbGlzdDsKLQkvKiogc2VydmVyLXNpZGUgaGlzdG9yeSwgdXNlZCBmb3IgZGVidWdpbmcgcHVycG9zZXMuICovCisJLyoqIHNlcnZlci1zaWRlIGhpc3RvcnksIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJxX2hpc3RvcnlfbGlzdDsKIAkvKiogc2VydmVyLXNpZGUgcGVyLWV4cG9ydCBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBycV9leHBfbGlzdDsKQEAgLTE2MTEsNyArMTYxMSw3IEBACiAJZW51bSBycV9waGFzZSBycV9waGFzZTsgLyogb25lIG9mIFJRX1BIQVNFXyogKi8KIAllbnVtIHJxX3BoYXNlIHJxX25leHRfcGhhc2U7IC8qIG9uZSBvZiBSUV9QSEFTRV8qIHRvIGJlIHVzZWQgbmV4dCAqLwogCWF0b21pY190IHJxX3JlZmNvdW50Oy8qIGNsaWVudC1zaWRlIHJlZmNvdW50IGZvciBTRU5UIHJhY2UsCi0JCQkJICAgIHNlcnZlci1zaWRlIHJlZmNvdW5mIGZvciBtdWx0aXBsZSByZXBsaWVzICovCisJCQkJICAgIHNlcnZlci1zaWRlIHJlZmNvdW50IGZvciBtdWx0aXBsZSByZXBsaWVzICovCiAKIAkvKiogUG9ydGFsIHRvIHdoaWNoIHRoaXMgcmVxdWVzdCB3b3VsZCBiZSBzZW50ICovCiAJc2hvcnQgcnFfcmVxdWVzdF9wb3J0YWw7ICAvKiBYWFggRklYTUUgYnVnIDI0OSAqLwpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAkvKiogeGlkICovCiAJX191NjQgcnFfeGlkOwogCS8qKgotCSAqIExpc3QgaXRlbSB0byBmb3IgcmVwbGF5IGxpc3QuIE5vdCB5ZXQgY29tbWl0ZWQgcmVxdWVzdHMgZ2V0IGxpbmtlZAorCSAqIExpc3QgaXRlbSB0byBmb3IgcmVwbGF5IGxpc3QuIE5vdCB5ZXQgY29tbWl0dGVkIHJlcXVlc3RzIGdldCBsaW5rZWQKIAkgKiB0aGVyZS4KIAkgKiBBbHNvIHNlZSBcYSBycV9yZXBsYXkgY29tbWVudCBhYm92ZS4KIAkgKi8KQEAgLTE5NTIsNyArMTk1Miw3IEBACiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwogCiAvKioKLSAqIEhlbHBlciB0aGF0IGRlY2lkZXMgaWYgd2UgbmVlZCB0byBwcmludCByZXF1ZXN0IGFjY29yZGlnIHRvIGN1cnJlbnQgZGVidWcKKyAqIEhlbHBlciB0aGF0IGRlY2lkZXMgaWYgd2UgbmVlZCB0byBwcmludCByZXF1ZXN0IGFjY29yZGluZyB0byBjdXJyZW50IGRlYnVnCiAgKiBsZXZlbCBzZXR0aW5ncwogICovCiAjZGVmaW5lIGRlYnVnX3JlcShtc2dkYXRhLCBtYXNrLCBjZGxzLCByZXEsIGZtdCwgYS4uLikJCQlcCkBAIC0xOTY2LDcgKzE5NjYsNyBAQAogfSB3aGlsZSgwKQogCiAvKioKLSAqIFRoaXMgaXMgdGhlIGRlYnVnIHByaW50IGZ1bmN0aW9uIHlvdSBuZWVkIHRvIHVzZSB0byBwcmludCByZXF1ZXN0IHN0dXJ1Y3R1cmUKKyAqIFRoaXMgaXMgdGhlIGRlYnVnIHByaW50IGZ1bmN0aW9uIHlvdSBuZWVkIHRvIHVzZSB0byBwcmludCByZXF1ZXN0IHN0cnVjdHVyZQogICogY29udGVudCBpbnRvIGx1c3RyZSBkZWJ1ZyBsb2cuCiAgKiBmb3IgbW9zdCBjYWxsZXJzIChsZXZlbCBpcyBhIGNvbnN0YW50KSB0aGlzIGlzIHJlc29sdmVkIGF0IGNvbXBpbGUgdGltZSAqLwogI2RlZmluZSBERUJVR19SRVEobGV2ZWwsIHJlcSwgZm10LCBhcmdzLi4uKQkJCQkgICBcCkBAIC0yNjIxLDYgKzI2MjEsOCBAQAogICogcmVxdWVzdCBxdWV1ZXMsIHJlcXVlc3QgbWFuYWdlbWVudCwgZXRjLgogICogQHsKICAqLwordm9pZCBwdGxycGNfcmVxdWVzdF9jb21taXR0ZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBmb3JjZSk7CisKIHZvaWQgcHRscnBjX2luaXRfY2xpZW50KGludCByZXFfcG9ydGFsLCBpbnQgcmVwX3BvcnRhbCwgY2hhciAqbmFtZSwKIAkJCXN0cnVjdCBwdGxycGNfY2xpZW50ICopOwogdm9pZCBwdGxycGNfY2xlYW51cF9jbGllbnQoc3RydWN0IG9iZF9pbXBvcnQgKmltcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9xdW90YS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcXVvdGEuaAppbmRleCA3MWI1ZDk3Li4wN2NiN2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9xdW90YS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3F1b3RhLmgKQEAgLTE0MCw3ICsxNDAsNyBAQAogICoJCShpLmUuIHdoZW4gLT5sZG9fcmVjb3ZlcnlfY29tcGxldGUgaXMgY2FsbGVkKS4gVGhpcyBpcyB1c2VkCiAgKgkJdG8gbm90aWZ5IHRoZSBxc2QgbGF5ZXIgdGhhdCBxdW90YSBzaG91bGQgbm93IGJlIGVuZm9yY2VkCiAgKgkJYWdhaW4gdmlhIHRoZSBxc2Rfb3BfYmVnaW4vZW5kIGZ1bmN0aW9ucy4gVGhlIGxhc3Qgc3RlcCBvZiB0aGUKLSAqCQlyZWludGVncmF0aW9uIHByb2RlY3VyZSAobmFtZWx5IHVzYWdlIHJlY29uY2lsaWF0aW9uKSB3aWxsIGJlCisgKgkJcmVpbnRlZ3JhdGlvbiBwcm9jZWR1cmUgKG5hbWVseSB1c2FnZSByZWNvbmNpbGlhdGlvbikgd2lsbCBiZQogICoJCWNvbXBsZXRlZCBkdXJpbmcgc3RhcnQuCiAgKgogICogLSBxc2RfZmluaSgpOiBpcyB1c2VkIHRvIHJlbGVhc2UgYSBxc2RfaW5zdGFuY2Ugc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9zZWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3NlYy5oCmluZGV4IDg4NTI0N2QuLmJmM2VlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3NlYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3NlYy5oCkBAIC01NzIsNyArNTcyLDcgQEAKIAkvKioKIAkgKiBDYWxsZWQgdGhlbiB0aGUgcmVmZXJlbmNlIG9mIFxhIGN0eCBkcm9wcGVkIHRvIDAuIFRoZSBwb2xpY3kgbW9kdWxlCiAJICogaXMgc3VwcG9zZWQgdG8gZGVzdHJveSB0aGlzIGNvbnRleHQgb3Igd2hhdGV2ZXIgZWxzZSBhY2NvcmRpbmcgdG8KLQkgKiBpdHMgY2FjaGUgbWFpbnRhaW5hbmNlIG1lY2hhbWlzbS4KKwkgKiBpdHMgY2FjaGUgbWFpbnRlbmFuY2UgbWVjaGFuaXNtLgogCSAqCiAJICogXHBhcmFtIHN5bmMgaWYgemVybywgd2Ugc2hvdWxkbid0IHdhaXQgZm9yIHRoZSBjb250ZXh0IGJlaW5nCiAJICogZGVzdHJveWVkIGNvbXBsZXRlbHkuCkBAIC0xMDAyLDcgKzEwMDIsNyBAQAogdm9pZCBzcHRscnBjX3NlY19wdXQoc3RydWN0IHB0bHJwY19zZWMgKnNlYyk7CiAKIC8qCi0gKiBpbnRlcm5hbCBhcGlzIHdoaWNoIG9ubHkgdXNlZCBieSBwb2xpY3kgaW1wZWxlbnRhdGlvbgorICogaW50ZXJuYWwgYXBpcyB3aGljaCBvbmx5IHVzZWQgYnkgcG9saWN5IGltcGxlbWVudGF0aW9uCiAgKi8KIGludCAgc3B0bHJwY19nZXRfbmV4dF9zZWNpZCh2b2lkKTsKIHZvaWQgc3B0bHJwY19zZWNfZGVzdHJveShzdHJ1Y3QgcHRscnBjX3NlYyAqc2VjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbWRfb2JqZWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL21kX29iamVjdC5oCmluZGV4IDdiNDViNDcuLmVmNDZiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbWRfb2JqZWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9tZF9vYmplY3QuaApAQCAtMzUsNyArMzUsNyBAQAogICoKICAqIGx1c3RyZS9pbmNsdWRlL21kX29iamVjdC5oCiAgKgotICogRXh0ZW50aW9uIG9mIGx1X29iamVjdC5oIGZvciBtZXRhZGF0YSBvYmplY3RzCisgKiBFeHRlbnNpb24gb2YgbHVfb2JqZWN0LmggZm9yIG1ldGFkYXRhIG9iamVjdHMKICAqLwogCiAjaWZuZGVmIF9MVVNUUkVfTURfT0JKRUNUX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZC5oCmluZGV4IGMzNDcwY2UuLjcyY2YzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaApAQCAtMTU4LDcgKzE1OCw3IEBACiAJLyogc3RhdGZzIGRhdGEgc3BlY2lmaWMgZm9yIGV2ZXJ5IE9TQywgaWYgbmVlZGVkIGF0IGFsbC4gKi8KIAlzdHJ1Y3Qgb2JkX3N0YXRmcyAgICAgICpvaV9vc2ZzOwogCS8qIEFuIHVwZGF0ZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgdG8gdXBkYXRlIHNvbWUgZGF0YSBvbiB1cHBlcgotCSAqIGxldmVsLiBFLmcuIGl0IGlzIHVzZWQgZm9yIHVwZGF0ZSBsc20tPmxzbV9vaW5mbyBhdCBldmVyeSByZWNpZXZlZAorCSAqIGxldmVsLiBFLmcuIGl0IGlzIHVzZWQgZm9yIHVwZGF0ZSBsc20tPmxzbV9vaW5mbyBhdCBldmVyeSByZWNlaXZlZAogCSAqIHJlcXVlc3QgaW4gb3NjIGxldmVsIGZvciBlbnF1ZXVlIHJlcXVlc3RzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvCiAJICogdXBkYXRlIHNvbWUgY2FsbGVyIGRhdGEgZnJvbSBMT1YgbGF5ZXIgaWYgbmVlZGVkLiAqLwogCW9iZF9lbnF1ZXVlX3VwZGF0ZV9mICAgIG9pX2NiX3VwOwpAQCAtMTA0Miw4ICsxMDQyLDggQEAKIH0KIAogc3RydWN0IG1kX29wX2RhdGEgewotCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMTsgLyogb3BlcmF0aW9uIGZpZDEgKHVzdWFseSBwYXJlbnQpICovCi0Jc3RydWN0IGx1X2ZpZAkgICBvcF9maWQyOyAvKiBvcGVyYXRpb24gZmlkMiAodXN1YWx5IGNoaWxkKSAqLworCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMTsgLyogb3BlcmF0aW9uIGZpZDEgKHVzdWFsbHkgcGFyZW50KSAqLworCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMjsgLyogb3BlcmF0aW9uIGZpZDIgKHVzdWFsbHkgY2hpbGQpICovCiAJc3RydWN0IGx1X2ZpZAkgICBvcF9maWQzOyAvKiAyIGV4dHJhIGZpZHMgdG8gZmluZCBjb25mbGljdGluZyAqLwogCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkNDsgLyogdG8gdGhlIG9wZXJhdGlvbiBsb2Nrcy4gKi8KIAltZHNub190CQkgb3BfbWRzOyAgLyogd2hhdCBtZHMgc2VydmVyIG9wZW4gd2lsbCBnbyB0byAqLwpAQCAtMTMyMyw3ICsxMzIzLDggQEAKIAlzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm1vZF9vY2g7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAgICptb2Rfb3Blbl9yZXE7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAgICptb2RfY2xvc2VfcmVxOwotCWF0b21pY190CSAgICAgIG1vZF9yZWZjb3VudDsKKwlhdG9taWNfdAkJICBtb2RfcmVmY291bnQ7CisJYm9vbAkJCSAgbW9kX2lzX2NyZWF0ZTsKIH07CiAKIHN0cnVjdCBsb29rdXBfaW50ZW50OwpAQCAtMTM5Miw3ICsxMzkzLDcgQEAKIAogCWludCAoKm1fc2V0X29wZW5fcmVwbGF5X2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosCiAJCQkJICAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICosCi0JCQkJICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICopOworCQkJCSAgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICopOwogCWludCAoKm1fY2xlYXJfb3Blbl9yZXBsYXlfZGF0YSkoc3RydWN0IG9iZF9leHBvcnQgKiwKIAkJCQkJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICopOwogCWludCAoKm1fc2V0X2xvY2tfZGF0YSkoc3RydWN0IG9iZF9leHBvcnQgKiwgX191NjQgKiwgdm9pZCAqLCBfX3U2NCAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCmluZGV4IDk4MzcxOGYuLjlkMWYyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaApAQCAtMTc1LDkgKzE3NSwxMyBAQAogCUNPTkZJR19UX0NPTkZJRyAgPSAwLAogCUNPTkZJR19UX1NQVExSUEMgPSAxLAogCUNPTkZJR19UX1JFQ09WRVIgPSAyLAotCUNPTkZJR19UX01BWCAgICAgPSAzCisJQ09ORklHX1RfUEFSQU1TICA9IDMsCisJQ09ORklHX1RfTUFYICAgICA9IDQKIH07CiAKKyNkZWZpbmUgUEFSQU1TX0ZJTEVOQU1FCSJwYXJhbXMiCisjZGVmaW5lIExDVExfVVBDQUxMCSJsY3RsIgorCiAvKiBsaXN0IG9mIGFjdGl2ZSBjb25maWd1cmF0aW9uIGxvZ3MgICovCiBzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSB7CiAJc3RydWN0IGxkbG1fcmVzX2lkCSAgY2xkX3Jlc2lkOwpAQCAtMTg1LDcgKzE4OSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZAkJICBjbGRfbGlzdF9jaGFpbjsKIAlhdG9taWNfdAkJY2xkX3JlZmNvdW50OwogCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICAgICpjbGRfc3B0bHJwYzsvKiBkZXBlbmRlZCBzcHRscnBjIGxvZyAqLwotCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICAgICpjbGRfcmVjb3ZlcjsgICAgLyogaW1wZXJhdGl2ZSByZWNvdmVyIGxvZyAqLworCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhCSAgICpjbGRfcGFyYW1zOwkvKiBjb21tb24gcGFyYW1ldGVycyBsb2cgKi8KKwlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAgICAqY2xkX3JlY292ZXI7LyogaW1wZXJhdGl2ZSByZWNvdmVyIGxvZyAqLwogCXN0cnVjdCBvYmRfZXhwb3J0CSAgKmNsZF9tZ2NleHA7CiAJc3RydWN0IG11dGV4CQkgICAgY2xkX2xvY2s7CiAJaW50CQkJIGNsZF90eXBlOwpAQCAtMTYyNiw3ICsxNjMxLDcgQEAKIHsKIAkvKiByZXR1cm5zOiAwIG9uIGhlYWx0aHkKIAkgKgkgPjAgb24gdW5oZWFsdGh5ICsgcmVhc29uIGNvZGUvZmxhZwotCSAqCSAgICBob3dldmVyIHRoZSBvbmx5IHN1cHBvcmVkIHJlYXNvbiA9PSAxIHJpZ2h0IG5vdworCSAqCSAgICBob3dldmVyIHRoZSBvbmx5IHN1cHBvcnRlZCByZWFzb24gPT0gMSByaWdodCBub3cKIAkgKgkgICAgV2UnbGwgbmVlZCB0byBkZWZpbmUgc29tZSBiZXR0ZXIgcmVhc29ucwogCSAqCSAgICBvciBmbGFncyBpbiB0aGUgZnV0dXJlLgogCSAqCSA8MCBvbiBlcnJvcgpAQCAtMTk5NiwxMSArMjAwMSwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBtZF9zZXRfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJCQkgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoLAotCQkJCQkgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqb3Blbl9yZXEpCisJCQkJCSAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQogewogCUVYUF9DSEVDS19NRF9PUChleHAsIHNldF9vcGVuX3JlcGxheV9kYXRhKTsKIAlFWFBfTURfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBzZXRfb3Blbl9yZXBsYXlfZGF0YSk7Ci0JcmV0dXJuIE1EUChleHAtPmV4cF9vYmQsIHNldF9vcGVuX3JlcGxheV9kYXRhKShleHAsIG9jaCwgb3Blbl9yZXEpOworCXJldHVybiBNRFAoZXhwLT5leHBfb2JkLCBzZXRfb3Blbl9yZXBsYXlfZGF0YSkoZXhwLCBvY2gsIGl0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbWRfY2xlYXJfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oCmluZGV4IDk3N2JjMjMuLjVlYzMzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX3N1cHBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmgKQEAgLTY4MSw3ICs2ODEsNyBAQAogICoKICAqIEJlIHZlcnkgY2FyZWZ1bCB3aGVuIGNoYW5naW5nIHRoaXMgdmFsdWUsIGVzcGVjaWFsbHkgd2hlbiBkZWNyZWFzaW5nIGl0LAogICogc2luY2Ugdm1hbGxvYyBpbiBMaW51eCBkb2Vzbid0IHBlcmZvcm0gd2VsbCBvbiBtdWx0aS1jb3JlcyBzeXN0ZW0sIGNhbGxpbmcKLSAqIHZtYWxsb2MgaW4gY3JpdGljYWwgcGF0aCB3b3VsZCBodXJ0IHBlZm9ybWFuY2UgYmFkbHkuIFNlZSBMVS02Ni4KKyAqIHZtYWxsb2MgaW4gY3JpdGljYWwgcGF0aCB3b3VsZCBodXJ0IHBlcmZvcm1hbmNlIGJhZGx5LiBTZWUgTFUtNjYuCiAgKi8KICNkZWZpbmUgT0JEX0FMTE9DX0JJRyAoNCAqIFBBR0VfQ0FDSEVfU0laRSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYwppbmRleCA5NGIxNjQxLi42OTA3YTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYwpAQCAtMTE5NiwxNCArMTE5NiwxNCBAQAogCiAJCWJrdCA9IGx1X3NpdGVfYmt0X2Zyb21fZmlkKHNpdGUsICZoZWFkZXItPmxvaF9maWQpOwogCi0JCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXRlcik7CisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0ZXIsIGN1cnJlbnQpOwogCQlhZGRfd2FpdF9xdWV1ZSgmYmt0LT5sc2JfbWFyY2hlX2Z1bmVicmUsICZ3YWl0ZXIpOwogCiAJCXdoaWxlICgxKSB7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlpZiAoYXRvbWljX3JlYWQoJmhlYWRlci0+bG9oX3JlZikgPT0gMSkKIAkJCQlicmVhazsKLQkJCXdhaXRxX3dhaXQoJndhaXRlciwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGUoKTsKIAkJfQogCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9mbG9jay5jCmluZGV4IGM5YWFlMTMuLjk4NmJmMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9mbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9mbG9jay5jCkBAIC0yMDUsNiArMjA1LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGxkbG1fZmxvY2tfY2FuY2VsX29uX2RlYWRsb2NrKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssCisJCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQoreworCUNERUJVRyhEX0lORk8sICJyZXByb2Nlc3MgZGVhZGxvY2sgcmVxPSVwXG4iLCBsb2NrKTsKKworCWlmICgoZXhwX2Nvbm5lY3RfZmxhZ3MobG9jay0+bF9leHBvcnQpICYKKwkJCQlPQkRfQ09OTkVDVF9GTE9DS19ERUFEKSA9PSAwKSB7CisJCUNFUlJPUigKKwkJICAgICAgImRlYWRsb2NrIGZvdW5kLCBidXQgY2xpZW50IGRvZXNuJ3Qgc3VwcG9ydCBmbG9jayBjYW5jZWxpYXRpb25cbiIpOworCX0gZWxzZSB7CisJCUxBU1NFUlQobG9jay0+bF9jb21wbGV0aW9uX2FzdCk7CisJCUxBU1NFUlQoKGxvY2stPmxfZmxhZ3MgJiBMRExNX0ZMX0FTVF9TRU5UKSA9PSAwKTsKKwkJbG9jay0+bF9mbGFncyB8PSBMRExNX0ZMX0FTVF9TRU5UIHwgTERMTV9GTF9DQU5DRUxfT05fQkxPQ0sgfAorCQkJTERMTV9GTF9GTE9DS19ERUFETE9DSzsKKwkJbGRsbV9mbG9ja19ibG9ja2luZ191bmxpbmsobG9jayk7CisJCWxkbG1fcmVzb3VyY2VfdW5saW5rX2xvY2sobG9jayk7CisJCWxkbG1fYWRkX2FzdF93b3JrX2l0ZW0obG9jaywgTlVMTCwgd29ya19saXN0KTsKKwl9Cit9CisKIC8qKgogICogUHJvY2VzcyBhIGdyYW50aW5nIGF0dGVtcHQgZm9yIGZsb2NrIGxvY2suCiAgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBucyBsb2NrIGhlbGQuCkBAIC0yNzIsNiArMjkyLDcgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7CisJCWludCByZXByb2Nlc3NfZmFpbGVkID0gMDsKIAkJbG9ja21vZGVfdmVyaWZ5KG1vZGUpOwogCiAJCS8qIFRoaXMgbG9vcCBkZXRlcm1pbmVzIGlmIHRoZXJlIGFyZSBleGlzdGluZyBsb2NrcwpAQCAtMjkzLDggKzMxNCwxNSBAQAogCQkJaWYgKCFsZGxtX2Zsb2Nrc19vdmVybGFwKGxvY2ssIHJlcSkpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICghZmlyc3RfZW5xKQotCQkJCXJldHVybiBMRExNX0lURVJfQ09OVElOVUU7CisJCQlpZiAoIWZpcnN0X2VucSkgeworCQkJCXJlcHJvY2Vzc19mYWlsZWQgPSAxOworCQkJCWlmIChsZGxtX2Zsb2NrX2RlYWRsb2NrKHJlcSwgbG9jaykpIHsKKwkJCQkJbGRsbV9mbG9ja19jYW5jZWxfb25fZGVhZGxvY2socmVxLAorCQkJCQkJCXdvcmtfbGlzdCk7CisJCQkJCXJldHVybiBMRExNX0lURVJfQ09OVElOVUU7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQogCiAJCQlpZiAoKmZsYWdzICYgTERMTV9GTF9CTE9DS19OT1dBSVQpIHsKIAkJCQlsZGxtX2Zsb2NrX2Rlc3Ryb3kocmVxLCBtb2RlLCAqZmxhZ3MpOwpAQCAtMzMwLDYgKzM1OCw4IEBACiAJCQkqZmxhZ3MgfD0gTERMTV9GTF9CTE9DS19HUkFOVEVEOwogCQkJcmV0dXJuIExETE1fSVRFUl9TVE9QOwogCQl9CisJCWlmIChyZXByb2Nlc3NfZmFpbGVkKQorCQkJcmV0dXJuIExETE1fSVRFUl9DT05USU5VRTsKIAl9CiAKIAlpZiAoKmZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spIHsKQEAgLTY0Niw3ICs2NzYsMTAgQEAKIAkvKiBsZGxtX2xvY2tfZW5xdWV1ZSgpIGhhcyBhbHJlYWR5IHBsYWNlZCBsb2NrIG9uIHRoZSBncmFudGVkIGxpc3QuICovCiAJbGlzdF9kZWxfaW5pdCgmbG9jay0+bF9yZXNfbGluayk7CiAKLQlpZiAoZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykgeworCWlmIChsb2NrLT5sX2ZsYWdzICYgTERMTV9GTF9GTE9DS19ERUFETE9DSykgeworCQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlIGRlYWRsb2NrIHJlY2VpdmVkIik7CisJCXJjID0gLUVERUFETEs7CisJfSBlbHNlIGlmIChmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKSB7CiAJCS8qIGZjbnRsKEZfR0VUTEspIHJlcXVlc3QgKi8KIAkJLyogVGhlIG9sZCBtb2RlIHdhcyBzYXZlZCBpbiBnZXRsay0+ZmxfdHlwZSBzbyB0aGF0IGlmIHRoZSBtb2RlCiAJCSAqIGluIHRoZSBsb2NrIGNoYW5nZXMgd2UgY2FuIGRlY3JlZiB0aGUgYXBwcm9wcmlhdGUgcmVmY291bnQuKi8KQEAgLTY3Miw3ICs3MDUsNyBAQAogCQlsZGxtX3Byb2Nlc3NfZmxvY2tfbG9jayhsb2NrLCAmbm9yZXByb2MsIDEsICZlcnIsIE5VTEwpOwogCX0KIAl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobGRsbV9mbG9ja19jb21wbGV0aW9uX2FzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCmluZGV4IDY5MjYyM2IuLjA1NDhhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYwpAQCAtMTQ1LDggKzE0NSw2IEBACiAJCXJldHVybiAiZ2V0eGF0dHIiOwogCWNhc2UgSVRfTEFZT1VUOgogCQlyZXR1cm4gImxheW91dCI7Ci0JY2FzZSBJVF9TRVRYQVRUUjoKLQkJcmV0dXJuICJzZXR4YXR0ciI7CiAJZGVmYXVsdDoKIAkJQ0VSUk9SKCJVbmtub3duIGludGVudCAlZFxuIiwgaXQpOwogCQlyZXR1cm4gIlVOS05PV04iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYwppbmRleCAzZWQwMjBlLi43ZTYzY2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYwpAQCAtMTkyLDggKzE5Miw4IEBACiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xETE1fQ0FOQ0VMX0JMX0NCX1JBQ0UpKSB7CiAJCWludCB0byA9IGNmc190aW1lX3NlY29uZHMoMSk7CiAJCXdoaWxlICh0byA+IDApIHsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZSgKLQkJCQlUQVNLX0lOVEVSUlVQVElCTEUsIHRvKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KHRvKTsKIAkJCWlmIChsb2NrLT5sX2dyYW50ZWRfbW9kZSA9PSBsb2NrLT5sX3JlcV9tb2RlIHx8CiAJCQkgICAgbG9jay0+bF9mbGFncyAmIExETE1fRkxfREVTVFJPWUVEKQogCQkJCWJyZWFrOwpAQCAtMjI4LDYgKzIyOCw3IEBACiAKIAkJCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCQkJTEFTU0VSVChsb2NrLT5sX2x2Yl9kYXRhID09IE5VTEwpOworCQkJbG9jay0+bF9sdmJfdHlwZSA9IExWQl9UX0xBWU9VVDsKIAkJCWxvY2stPmxfbHZiX2RhdGEgPSBsdmJfZGF0YTsKIAkJCWxvY2stPmxfbHZiX2xlbiA9IGx2Yl9sZW47CiAJCQl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKaW5kZXggYzBlNTRhZS4uZmNjN2E5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCkBAIC0yOTksNyArMjk5LDcgQEAKICAqIEEgaGVscGVyIHRvIGJ1aWxkIGEgYmxvY2tpbmcgQVNUIGZ1bmN0aW9uCiAgKgogICogUGVyZm9ybSBhIGNvbW1vbiBvcGVyYXRpb24gZm9yIGJsb2NraW5nIEFTVHM6Ci0gKiBkZWZmZXJyZWQgbG9jayBjYW5jZWxsYXRpb24uCisgKiBkZWZlcnJlZCBsb2NrIGNhbmNlbGxhdGlvbi4KICAqCiAgKiBccGFyYW0gbG9jayB0aGUgbG9jayBibG9ja2luZyBvciBjYW5jZWxpbmcgQVNUIHdhcyBjYWxsZWQgb24KICAqIFxyZXR2YWwgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYwppbmRleCA1Zjg5ODY0Li4yODI0ZDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYwpAQCAtNDIxLDkgKzQyMSw5IEBACiAJfSBlbHNlIHsKIAkJdmFsID0gZmlkX29pZCgmZmlkKTsKIAl9Ci0JaGFzaCA9IGNmc19oYXNoX2xvbmcoaGFzaCwgaHMtPmhzX2JrdF9iaXRzKTsKKwloYXNoID0gaGFzaF9sb25nKGhhc2gsIGhzLT5oc19ia3RfYml0cyk7CiAJLyogZ2l2ZSBtZSBhbm90aGVyIHJhbmRvbSBmYWN0b3IgKi8KLQloYXNoIC09IGNmc19oYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaHMsIHZhbCAlIDExICsgMyk7CisJaGFzaCAtPSBoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaHMsIHZhbCAlIDExICsgMyk7CiAKIAloYXNoIDw8PSBocy0+aHNfY3VyX2JpdHMgLSBocy0+aHNfYmt0X2JpdHM7CiAJaGFzaCB8PSBsZGxtX3Jlc19ob3BfaGFzaChocywga2V5LCBDRlNfSEFTSF9OQktUKGhzKSAtIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYwppbmRleCBmMzBjODRmLi4xZTRjNWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJLyogd2UncmUgYmVpbmcgY2FyZWZ1bCB0byBlbnN1cmUgdGhhdCB0aGUga2VybmVsIHRocmVhZCBpcwogCSAqIGFibGUgdG8gc2V0IG91ciBzdGF0ZSB0byBydW5uaW5nIGFzIGl0IGV4aXRzIGJlZm9yZSB3ZQogCSAqIGdldCB0byBzY2hlZHVsZSgpICovCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJYWRkX3dhaXRfcXVldWUoJmRlYnVnX2N0bHdxLCAmd2FpdCk7CiAKQEAgLTM3OSw3ICszNzksNyBAQAogCQlwcmludGsoS0VSTl9FUlIgIkx1c3RyZUVycm9yOiBjYW5ub3Qgc3RhcnQgbG9nIGR1bXAgdGhyZWFkOiIKIAkJICAgICAgICIgJWxkXG4iLCBQVFJfRVJSKGR1bXBlcikpOwogCWVsc2UKLQkJd2FpdHFfd2FpdCgmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKIAogCS8qIGJlIHN1cmUgdG8gdGVhcmRvd24gaWYgY2ZzX2NyZWF0ZV90aHJlYWQoKSBmYWlsZWQgKi8KIAlyZW1vdmVfd2FpdF9xdWV1ZSgmZGVidWdfY3Rsd3EsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9mYWlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZmFpbC5jCmluZGV4IGM1NDQ0OGQuLmJhNDNmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9mYWlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2ZhaWwuYwpAQCAtMTI3LDggKzEyNyw4IEBACiAJaWYgKHJldCkgewogCQlDRVJST1IoImNmc19mYWlsX3RpbWVvdXQgaWQgJXggc2xlZXBpbmcgZm9yICVkbXNcbiIsCiAJCSAgICAgICBpZCwgbXMpOwotCQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUsCi0JCQkJCQkgICBjZnNfdGltZV9zZWNvbmRzKG1zKSAvIDEwMDApOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcyhtcykgLyAxMDAwKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJQ0VSUk9SKCJjZnNfZmFpbF90aW1lb3V0IGlkICV4IGF3YWtlXG4iLCBpZCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2tlcm5lbF91c2VyX2NvbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9rZXJuZWxfdXNlcl9jb21tLmMKaW5kZXggN2IyYzMxNS4uYjZkZGM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2tlcm5lbF91c2VyX2NvbW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMva2VybmVsX3VzZXJfY29tbS5jCkBAIC00NCwxMDYgKzQ0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpYmNmcy9saWJjZnMuaD4KIAotI2lmZGVmIExVU1RSRV9VVElMUwotLyogVGhpcyBpcyB0aGUgdXNlcnNwYWNlIHNpZGUuICovCi0KLS8qKiBTdGFydCB0aGUgdXNlcnNwYWNlIHNpZGUgb2YgYSBLVUMgcGlwZS4KLSAqIEBwYXJhbSBsaW5rIFByaXZhdGUgZGVzY3JpcHRvciBmb3IgcGlwZS9zb2NrZXQuCi0gKiBAcGFyYW0gZ3JvdXBzIEtVQyBicm9hZGNhc3QgZ3JvdXAgdG8gbGlzdGVuIHRvCi0gKgkgIChjYW4gYmUgbnVsbCBmb3IgdW5pY2FzdCB0byB0aGlzIHBpZCkKLSAqLwotaW50IGxpYmNmc191a3VjX3N0YXJ0KGx1c3RyZV9rZXJuZWxjb21tICpsaW5rLCBpbnQgZ3JvdXApCi17Ci0JaW50IHBmZFsyXTsKLQotCWlmIChwaXBlKHBmZCkgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCi0JbWVtc2V0KGxpbmssIDAsIHNpemVvZigqbGluaykpOwotCWxpbmstPmxrX3JmZCA9IHBmZFswXTsKLQlsaW5rLT5sa193ZmQgPSBwZmRbMV07Ci0JbGluay0+bGtfZ3JvdXAgPSBncm91cDsKLQlsaW5rLT5sa191aWQgPSBnZXRwaWQoKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGxpYmNmc191a3VjX3N0b3AobHVzdHJlX2tlcm5lbGNvbW0gKmxpbmspCi17Ci0JaWYgKGxpbmstPmxrX3dmZCA+IDApCi0JCWNsb3NlKGxpbmstPmxrX3dmZCk7Ci0JcmV0dXJuIGNsb3NlKGxpbmstPmxrX3JmZCk7Ci19Ci0KLSNkZWZpbmUgbGhzeiBzaXplb2YoKmt1Y2gpCi0KLS8qKiBSZWFkIGEgbWVzc2FnZSBmcm9tIHRoZSBsaW5rLgotICogQWxsb2NhdGVzIG1lbW9yeSwgcmV0dXJucyBoYW5kbGUKLSAqCi0gKiBAcGFyYW0gbGluayBQcml2YXRlIGRlc2NyaXB0b3IgZm9yIHBpcGUvc29ja2V0LgotICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvLCBtdXN0IGluY2x1ZGUgc2l6ZSBmb3Iga3VjX2hkcgotICogQHBhcmFtIG1heHNpemUgTWF4aW11bSBtZXNzYWdlIHNpemUgYWxsb3dlZAotICogQHBhcmFtIHRyYW5zcG9ydCBPbmx5IGxpc3RlbiB0byBtZXNzYWdlcyBvbiB0aGlzIHRyYW5zcG9ydAotICogICAgICAoYW5kIHRoZSBnZW5lcmljIHRyYW5zcG9ydCkKLSAqLwotaW50IGxpYmNmc191a3VjX21zZ19nZXQobHVzdHJlX2tlcm5lbGNvbW0gKmxpbmssIGNoYXIgKmJ1ZiwgaW50IG1heHNpemUsCi0JCQlpbnQgdHJhbnNwb3J0KQotewotCXN0cnVjdCBrdWNfaGRyICprdWNoOwotCWludCByYyA9IDA7Ci0KLQltZW1zZXQoYnVmLCAwLCBtYXhzaXplKTsKLQotCUNERUJVRyhEX0tVQywgIldhaXRpbmcgZm9yIG1lc3NhZ2UgZnJvbSBrZXJuZWwgb24gZmQgJWRcbiIsCi0JICAgICAgIGxpbmstPmxrX3JmZCk7Ci0KLQl3aGlsZSAoMSkgewotCQkvKiBSZWFkIGhlYWRlciBmaXJzdCB0byBnZXQgbWVzc2FnZSBzaXplICovCi0JCXJjID0gcmVhZChsaW5rLT5sa19yZmQsIGJ1ZiwgbGhzeik7Ci0JCWlmIChyYyA8PSAwKSB7Ci0JCQlyYyA9IC1lcnJubzsKLQkJCWJyZWFrOwotCQl9Ci0JCWt1Y2ggPSAoc3RydWN0IGt1Y19oZHIgKilidWY7Ci0KLQkJQ0RFQlVHKERfS1VDLCAiUmVjZWl2ZWQgbWVzc2FnZSBtZz0leCB0PSVkIG09JWQgbD0lZFxuIiwKLQkJICAgICAgIGt1Y2gtPmt1Y19tYWdpYywga3VjaC0+a3VjX3RyYW5zcG9ydCwga3VjaC0+a3VjX21zZ3R5cGUsCi0JCSAgICAgICBrdWNoLT5rdWNfbXNnbGVuKTsKLQotCQlpZiAoa3VjaC0+a3VjX21hZ2ljICE9IEtVQ19NQUdJQykgewotCQkJQ0VSUk9SKCJiYWQgbWVzc2FnZSBtYWdpYyAleCAhPSAleFxuIiwKLQkJCSAgICAgICBrdWNoLT5rdWNfbWFnaWMsIEtVQ19NQUdJQyk7Ci0JCQlyYyA9IC1FUFJPVE87Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChrdWNoLT5rdWNfbXNnbGVuID4gbWF4c2l6ZSkgewotCQkJcmMgPSAtRU1TR1NJWkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFJlYWQgcGF5bG9hZCAqLwotCQlyYyA9IHJlYWQobGluay0+bGtfcmZkLCBidWYgKyBsaHN6LCBrdWNoLT5rdWNfbXNnbGVuIC0gbGhzeik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXJjID0gLWVycm5vOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJjIDwgKGt1Y2gtPmt1Y19tc2dsZW4gLSBsaHN6KSkgewotCQkJQ0VSUk9SKCJzaG9ydCByZWFkOiBnb3QgJWQgb2YgJWQgYnl0ZXNcbiIsCi0JCQkgICAgICAgcmMsIGt1Y2gtPmt1Y19tc2dsZW4pOwotCQkJcmMgPSAtRVBST1RPOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoa3VjaC0+a3VjX3RyYW5zcG9ydCA9PSB0cmFuc3BvcnQgfHwKLQkJICAgIGt1Y2gtPmt1Y190cmFuc3BvcnQgPT0gS1VDX1RSQU5TUE9SVF9HRU5FUklDKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvKiBEcm9wIG1lc3NhZ2VzIGZvciBvdGhlciB0cmFuc3BvcnRzICovCi0JfQotCXJldHVybiByYzsKLX0KLQotI2Vsc2UgLyogTFVTVFJFX1VUSUxTICovCiAvKiBUaGlzIGlzIHRoZSBrZXJuZWwgc2lkZSAobGlibHVzdHJlIGFzIHdlbGwpLiAqLwogCiAvKioKQEAgLTMzOCw1ICsyMzgsMyBAQAogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobGliY2ZzX2trdWNfZ3JvdXBfZm9yZWFjaCk7Ci0KLSNlbmRpZiAvKiBMVVNUUkVfVVRJTFMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saWJjZnNfc3RyaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGliY2ZzX3N0cmluZy5jCmluZGV4IDkyMmRlYmQuLmVkMGE2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saWJjZnNfc3RyaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpYmNmc19zdHJpbmcuYwpAQCAtNDIsMjYgKzQyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpYmNmcy9saWJjZnMuaD4KIAotLyogbm9uLTAgPSBkb24ndCBtYXRjaCAqLwotaW50IGNmc19zdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQotewotCWlmIChzMSA9PSBOVUxMIHx8IHMyID09IE5VTEwpCi0JCXJldHVybiAxOwotCi0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAobi0tICE9IDAgJiYgdG9sb3dlcigqczEpID09IHRvbG93ZXIoKnMyKSkgewotCQlpZiAobiA9PSAwIHx8ICpzMSA9PSAnXDAnIHx8ICpzMiA9PSAnXDAnKQotCQkJYnJlYWs7Ci0JCXMxKys7Ci0JCXMyKys7Ci0JfQotCi0JcmV0dXJuIHRvbG93ZXIoKih1bnNpZ25lZCBjaGFyICopczEpIC0gdG9sb3dlcigqKHVuc2lnbmVkIGNoYXIgKilzMik7Ci19Ci1FWFBPUlRfU1lNQk9MKGNmc19zdHJuY2FzZWNtcCk7Ci0KIC8qIENvbnZlcnQgYSB0ZXh0IHN0cmluZyB0byBhIGJpdG1hc2sgKi8KIGludCBjZnNfc3RyMm1hc2soY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICooKmJpdDJzdHIpKGludCBiaXQpLAogCQkgaW50ICpvbGRtYXNrLCBpbnQgbWlubWFzaywgaW50IGFsbG1hc2spCkBAIC0xMDEsNyArODEsNyBAQAogCQkJZGVidWdzdHIgPSBiaXQyc3RyKGkpOwogCQkJaWYgKGRlYnVnc3RyICE9IE5VTEwgJiYKIAkJCSAgICBzdHJsZW4oZGVidWdzdHIpID09IGxlbiAmJgotCQkJICAgIGNmc19zdHJuY2FzZWNtcChzdHIsIGRlYnVnc3RyLCBsZW4pID09IDApIHsKKwkJCSAgICBzdHJuY2FzZWNtcChzdHIsIGRlYnVnc3RyLCBsZW4pID09IDApIHsKIAkJCQlpZiAob3AgPT0gJy0nKQogCQkJCQluZXdtYXNrICY9IH4oMSA8PCBpKTsKIAkJCQllbHNlCkBAIC0xMTEsNyArOTEsNyBAQAogCQkJfQogCQl9CiAJCWlmICghZm91bmQgJiYgbGVuID09IDMgJiYKLQkJICAgIChjZnNfc3RybmNhc2VjbXAoc3RyLCAiQUxMIiwgbGVuKSA9PSAwKSkgeworCQkgICAgKHN0cm5jYXNlY21wKHN0ciwgIkFMTCIsIGxlbikgPT0gMCkpIHsKIAkJCWlmIChvcCA9PSAnLScpCiAJCQkJbmV3bWFzayA9IG1pbm1hc2s7CiAJCQllbHNlCkBAIC0xMjksNyArMTA5LDYgQEAKIAkqb2xkbWFzayA9IG5ld21hc2s7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGNmc19zdHIybWFzayk7CiAKIC8qIGdldCB0aGUgZmlyc3Qgc3RyaW5nIG91dCBvZiBAc3RyICovCiBjaGFyICpjZnNfZmlyc3RzdHIoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSkKQEAgLTE2NCwxMiArMTQzLDEyIEBACiB7CiAJY2hhciAqZW5kOwogCi0Jd2hpbGUgKGNmc19pc3doaXRlKCpzdHIpKQorCXdoaWxlIChpc3NwYWNlKCpzdHIpKQogCQlzdHIrKzsKIAogCWVuZCA9IHN0ciArIHN0cmxlbihzdHIpOwogCXdoaWxlIChlbmQgPiBzdHIpIHsKLQkJaWYgKCFjZnNfaXN3aGl0ZShlbmRbLTFdKSkKKwkJaWYgKCFpc3NwYWNlKGVuZFstMV0pKQogCQkJYnJlYWs7CiAJCWVuZC0tOwogCX0KQEAgLTE5OSw3ICsxNzgsNyBAQAogCiAJLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlcyAqLwogCXdoaWxlIChuZXh0LT5sc19sZW4pIHsKLQkJaWYgKCFjZnNfaXN3aGl0ZSgqbmV4dC0+bHNfc3RyKSkKKwkJaWYgKCFpc3NwYWNlKCpuZXh0LT5sc19zdHIpKQogCQkJYnJlYWs7CiAJCW5leHQtPmxzX3N0cisrOwogCQluZXh0LT5sc19sZW4tLTsKQEAgLTIyNiwxNCArMjA1LDEzIEBACiAKIAkvKiBza2lwIGVuZGluZyB3aGl0ZXNwYWNlcyAqLwogCXdoaWxlICgtLWVuZCAhPSByZXMtPmxzX3N0cikgewotCQlpZiAoIWNmc19pc3doaXRlKCplbmQpKQorCQlpZiAoIWlzc3BhY2UoKmVuZCkpCiAJCQlicmVhazsKIAl9CiAKIAlyZXMtPmxzX2xlbiA9IGVuZCAtIHJlcy0+bHNfc3RyICsgMTsKIAlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0woY2ZzX2dldHRvayk7CiAKIC8qKgogICogQ29udmVydHMgc3RyaW5nIHRvIGludGVnZXIuCkBAIC0yNTYsMTMgKzIzNCwxMiBAQAogCQlyZXR1cm4gMDsKIAogCWZvciAoOyBlbmRwIDwgc3RyICsgbm9iOyBlbmRwKyspIHsKLQkJaWYgKCFjZnNfaXN3aGl0ZSgqZW5kcCkpCisJCWlmICghaXNzcGFjZSgqZW5kcCkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKIAlyZXR1cm4gKCpudW0gPj0gbWluICYmICpudW0gPD0gbWF4KTsKIH0KLUVYUE9SVF9TWU1CT0woY2ZzX3N0cjJudW1fY2hlY2spOwogCiAvKioKICAqIFBhcnNlcyBcPHJhbmdlX2V4cHJcPiB0b2tlbiBvZiB0aGUgc3ludGF4LiBJZiBcYSBicmFja2V0ZWQgaXMgZmFsc2UsCkBAIC0yNzcsNyArMjU0LDcgQEAKICAqIFxyZXR2YWwgMCB3aWxsIGJlIHJldHVybmVkIGlmIGl0IGNhbiBiZSBwYXJzZWQsIG90aGVyd2lzZSAtRUlOVkFMIG9yCiAgKiAtRU5PTUVNIHdpbGwgYmUgcmV0dXJuZWQuCiAgKi8KLWludAorc3RhdGljIGludAogY2ZzX3JhbmdlX2V4cHJfcGFyc2Uoc3RydWN0IGNmc19sc3RyICpzcmMsIHVuc2lnbmVkIG1pbiwgdW5zaWduZWQgbWF4LAogCQkgICAgIGludCBicmFja2V0ZWQsIHN0cnVjdCBjZnNfcmFuZ2VfZXhwciAqKmV4cHIpCiB7CkBAIC0zNDAsNyArMzE3LDYgQEAKIAlMSUJDRlNfRlJFRShyZSwgc2l6ZW9mKCpyZSkpOwogCXJldHVybiAtRUlOVkFMOwogfQotRVhQT1JUX1NZTUJPTChjZnNfcmFuZ2VfZXhwcl9wYXJzZSk7CiAKIC8qKgogICogTWF0Y2hlcyB2YWx1ZSAoXGEgdmFsdWUpIGFnYWluc3QgcmFuZ2VzIGV4cHJlc3Npb24gbGlzdCBcYSBleHByX2xpc3QuCkBAIC0zNjEsNyArMzM3LDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjZnNfZXhwcl9saXN0X21hdGNoKTsKIAogLyoqCiAgKiBDb252ZXJ0IGV4cHJlc3MgbGlzdCAoXGEgZXhwcl9saXN0KSB0byBhbiBhcnJheSBvZiBhbGwgbWF0Y2hlZCB2YWx1ZXMKQEAgLTQzMiwxOCArNDA3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2ZzX2V4cHJfbGlzdF9mcmVlKTsKIAotdm9pZAotY2ZzX2V4cHJfbGlzdF9wcmludChzdHJ1Y3QgY2ZzX2V4cHJfbGlzdCAqZXhwcl9saXN0KQotewotCXN0cnVjdCBjZnNfcmFuZ2VfZXhwciAqZXhwcjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXhwciwgJmV4cHJfbGlzdC0+ZWxfZXhwcnMsIHJlX2xpbmspIHsKLQkJQ0RFQlVHKERfV0FSTklORywgIiVkLSVkLyVkXG4iLAotCQkgICAgICAgZXhwci0+cmVfbG8sIGV4cHItPnJlX2hpLCBleHByLT5yZV9zdHJpZGUpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woY2ZzX2V4cHJfbGlzdF9wcmludCk7Ci0KIC8qKgogICogUGFyc2VzIFw8Y2ZzX2V4cHJfbGlzdFw+IHRva2VuIG9mIHRoZSBzeW50YXguCiAgKgpAQCAtNTI2LDcgKzQ4OSw2IEBACiAJCWNmc19leHByX2xpc3RfZnJlZShlbCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChjZnNfZXhwcl9saXN0X2ZyZWVfbGlzdCk7CiAKIGludAogY2ZzX2lwX2FkZHJfcGFyc2UoY2hhciAqc3RyLCBpbnQgbGVuLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jCmluZGV4IDU4YmIyNTYuLjc3YjFlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jcHUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMKQEAgLTk1Miw2ICs5NTIsNyBAQAogY2ZzX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAl1bnNpZ25lZCBpbnQgIGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisJYm9vbAkgICAgIHdhcm47CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX0RFQUQ6CkBAIC05NjIsOSArOTYzLDIxIEBACiAJCWNwdF9kYXRhLmNwdF92ZXJzaW9uKys7CiAJCXNwaW5fdW5sb2NrKCZjcHRfZGF0YS5jcHRfbG9jayk7CiAJZGVmYXVsdDoKLQkJQ1dBUk4oIkx1c3RyZTogY2FuJ3Qgc3VwcG9ydCBDUFUgaG90cGx1ZyB3ZWxsIG5vdywgIgotCQkgICAgICAicGVyZm9ybWFuY2UgYW5kIHN0YWJpbGl0eSBjb3VsZCBiZSBpbXBhY3RlZCIKLQkJICAgICAgIltDUFUgJXUgbm90aWZ5OiAlbHhdXG4iLCBjcHUsIGFjdGlvbik7CisJCWlmIChhY3Rpb24gIT0gQ1BVX0RFQUQgJiYgYWN0aW9uICE9IENQVV9ERUFEX0ZST1pFTikgeworCQkJQ0RFQlVHKERfSU5GTywgIkNQVSBjaGFuZ2VkIFtjcHUgJXUgYWN0aW9uICVseF1cbiIsCisJCQkgICAgICAgY3B1LCBhY3Rpb24pOworCQkJYnJlYWs7CisJCX0KKworCQlkb3duKCZjcHRfZGF0YS5jcHRfbXV0ZXgpOworCQkvKiBpZiBhbGwgSFRzIGluIGEgY29yZSBhcmUgb2ZmbGluZSwgaXQgbWF5IGJyZWFrIGFmZmluaXR5ICovCisJCWNmc19jcHVfaHRfc2libGluZ3MoY3B1LCBjcHRfZGF0YS5jcHRfY3B1bWFzayk7CisJCXdhcm4gPSBhbnlfb25saW5lX2NwdSgqY3B0X2RhdGEuY3B0X2NwdW1hc2spID49IG5yX2NwdV9pZHM7CisJCXVwKCZjcHRfZGF0YS5jcHRfbXV0ZXgpOworCQlDREVCVUcod2FybiA/IERfV0FSTklORyA6IERfSU5GTywKKwkJICAgICAgICJMdXN0cmU6IGNhbid0IHN1cHBvcnQgQ1BVIHBsdWctb3V0IHdlbGwgbm93LCAiCisJCSAgICAgICAicGVyZm9ybWFuY2UgYW5kIHN0YWJpbGl0eSBjb3VsZCBiZSBpbXBhY3RlZCAiCisJCSAgICAgICAiW0NQVSAldSBhY3Rpb246ICVseF1cbiIsIGNwdSwgYWN0aW9uKTsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWN1cnByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jdXJwcm9jLmMKaW5kZXggYTJlZjY0Yy4uZTc0YzNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWN1cnByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3VycHJvYy5jCkBAIC01NSwyNSArNTUsMTMgQEAKICAqIGZvciBMaW51eCBrZXJuZWwuCiAgKi8KIAotaW50ICAgIGNmc19jdXJwcm9jX2dyb3Vwc19ucih2b2lkKQotewotCWludCBucjsKLQotCXRhc2tfbG9jayhjdXJyZW50KTsKLQluciA9IGN1cnJlbnRfY3JlZCgpLT5ncm91cF9pbmZvLT5uZ3JvdXBzOwotCXRhc2tfdW5sb2NrKGN1cnJlbnQpOwotCXJldHVybiBucjsKLX0KLQotLyogQ3VycmVudGx5IGFsbCB0aGUgQ0ZTX0NBUF8qIGRlZmluZXMgbWF0Y2ggQ0FQXyogb25lcy4gKi8KLSNkZWZpbmUgY2ZzX2NhcF9wYWNrKGNhcCkgKGNhcCkKLSNkZWZpbmUgY2ZzX2NhcF91bnBhY2soY2FwKSAoY2FwKQotCiB2b2lkIGNmc19jYXBfcmFpc2UoY2ZzX2NhcF90IGNhcCkKIHsKIAlzdHJ1Y3QgY3JlZCAqY3JlZDsKLQlpZiAoKGNyZWQgPSBwcmVwYXJlX2NyZWRzKCkpKSB7Ci0JCWNhcF9yYWlzZShjcmVkLT5jYXBfZWZmZWN0aXZlLCBjZnNfY2FwX3VucGFjayhjYXApKTsKKworCWNyZWQgPSBwcmVwYXJlX2NyZWRzKCk7CisJaWYgKGNyZWQpIHsKKwkJY2FwX3JhaXNlKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNhcCk7CiAJCWNvbW1pdF9jcmVkcyhjcmVkKTsKIAl9CiB9CkBAIC04MSw0MiArNjksMjggQEAKIHZvaWQgY2ZzX2NhcF9sb3dlcihjZnNfY2FwX3QgY2FwKQogewogCXN0cnVjdCBjcmVkICpjcmVkOwotCWlmICgoY3JlZCA9IHByZXBhcmVfY3JlZHMoKSkpIHsKLQkJY2FwX2xvd2VyKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNmc19jYXBfdW5wYWNrKGNhcCkpOworCisJY3JlZCA9IHByZXBhcmVfY3JlZHMoKTsKKwlpZiAoY3JlZCkgeworCQljYXBfbG93ZXIoY3JlZC0+Y2FwX2VmZmVjdGl2ZSwgY2FwKTsKIAkJY29tbWl0X2NyZWRzKGNyZWQpOwogCX0KIH0KIAogaW50IGNmc19jYXBfcmFpc2VkKGNmc19jYXBfdCBjYXApCiB7Ci0JcmV0dXJuIGNhcF9yYWlzZWQoY3VycmVudF9jYXAoKSwgY2ZzX2NhcF91bnBhY2soY2FwKSk7CisJcmV0dXJuIGNhcF9yYWlzZWQoY3VycmVudF9jYXAoKSwgY2FwKTsKIH0KIAogdm9pZCBjZnNfa2VybmVsX2NhcF9wYWNrKGtlcm5lbF9jYXBfdCBrY2FwLCBjZnNfY2FwX3QgKmNhcCkKIHsKLSNpZiBkZWZpbmVkIChfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OKSAmJiBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OID09IDB4MTk5ODAzMzAKLQkqY2FwID0gY2ZzX2NhcF9wYWNrKGtjYXApOwotI2VsaWYgZGVmaW5lZCAoX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTikgJiYgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiA9PSAweDIwMDcxMDI2Ci0JKmNhcCA9IGNmc19jYXBfcGFjayhrY2FwWzBdKTsKLSNlbGlmIGRlZmluZWQoX0tFUk5FTF9DQVBBQklMSVRZX1ZFUlNJT04pICYmIF9LRVJORUxfQ0FQQUJJTElUWV9WRVJTSU9OID09IDB4MjAwODA1MjIKIAkvKiBYWFggbG9zdCBoaWdoIGJ5dGUgKi8KLQkqY2FwID0gY2ZzX2NhcF9wYWNrKGtjYXAuY2FwWzBdKTsKLSNlbHNlCi0JI2Vycm9yICJuZWVkIGNvcnJlY3QgX0tFUk5FTF9DQVBBQklMSVRZX1ZFUlNJT04gIgotI2VuZGlmCisJKmNhcCA9IGtjYXAuY2FwWzBdOwogfQogCiB2b2lkIGNmc19rZXJuZWxfY2FwX3VucGFjayhrZXJuZWxfY2FwX3QgKmtjYXAsIGNmc19jYXBfdCBjYXApCiB7Ci0jaWYgZGVmaW5lZCAoX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTikgJiYgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiA9PSAweDE5OTgwMzMwCi0JKmtjYXAgPSBjZnNfY2FwX3VucGFjayhjYXApOwotI2VsaWYgZGVmaW5lZCAoX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTikgJiYgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiA9PSAweDIwMDcxMDI2Ci0JKCprY2FwKVswXSA9IGNmc19jYXBfdW5wYWNrKGNhcCk7Ci0jZWxpZiBkZWZpbmVkKF9LRVJORUxfQ0FQQUJJTElUWV9WRVJTSU9OKSAmJiBfS0VSTkVMX0NBUEFCSUxJVFlfVkVSU0lPTiA9PSAweDIwMDgwNTIyCi0Ja2NhcC0+Y2FwWzBdID0gY2ZzX2NhcF91bnBhY2soY2FwKTsKLSNlbHNlCi0JI2Vycm9yICJuZWVkIGNvcnJlY3QgX0tFUk5FTF9DQVBBQklMSVRZX1ZFUlNJT04gIgotI2VuZGlmCisJa2NhcC0+Y2FwWzBdID0gY2FwOwogfQogCiBjZnNfY2FwX3QgY2ZzX2N1cnByb2NfY2FwX3BhY2sodm9pZCkKQEAgLTEyNiwyMCArMTAwLDYgQEAKIAlyZXR1cm4gY2FwOwogfQogCi12b2lkIGNmc19jdXJwcm9jX2NhcF91bnBhY2soY2ZzX2NhcF90IGNhcCkKLXsKLQlzdHJ1Y3QgY3JlZCAqY3JlZDsKLQlpZiAoKGNyZWQgPSBwcmVwYXJlX2NyZWRzKCkpKSB7Ci0JCWNmc19rZXJuZWxfY2FwX3VucGFjaygmY3JlZC0+Y2FwX2VmZmVjdGl2ZSwgY2FwKTsKLQkJY29tbWl0X2NyZWRzKGNyZWQpOwotCX0KLX0KLQotaW50IGNmc19jYXBhYmxlKGNmc19jYXBfdCBjYXApCi17Ci0JcmV0dXJuIGNhcGFibGUoY2ZzX2NhcF91bnBhY2soY2FwKSk7Ci19Ci0KIHN0YXRpYyBpbnQgY2ZzX2FjY2Vzc19wcm9jZXNzX3ZtKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJIHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKQogewpAQCAtMjkyLDEzICsyNTIsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2ZzX2dldF9lbnZpcm9uKTsKIAotRVhQT1JUX1NZTUJPTChjZnNfY3VycHJvY19ncm91cHNfbnIpOwogRVhQT1JUX1NZTUJPTChjZnNfY2FwX3JhaXNlKTsKIEVYUE9SVF9TWU1CT0woY2ZzX2NhcF9sb3dlcik7CiBFWFBPUlRfU1lNQk9MKGNmc19jYXBfcmFpc2VkKTsKIEVYUE9SVF9TWU1CT0woY2ZzX2N1cnByb2NfY2FwX3BhY2spOwotRVhQT1JUX1NZTUJPTChjZnNfY3VycHJvY19jYXBfdW5wYWNrKTsKLUVYUE9SVF9TWU1CT0woY2ZzX2NhcGFibGUpOwogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LW1vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCmluZGV4IDU1Mjk2YTMuLmU2ZWFlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMKQEAgLTE1MCwxMiArMTUwLDEyIEBACiAJLyogSGFuZGxlIHBsYXRmb3JtLWRlcGVuZGVudCBJT0MgcmVxdWVzdHMgKi8KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSU9DX0xJQkNGU19QQU5JQzoKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19CT09UKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0JPT1QpKQogCQkJcmV0dXJuICgtRVBFUk0pOwogCQlwYW5pYygiZGVidWdjdGwtaW52b2tlZCBwYW5pYyIpOwogCQlyZXR1cm4gKDApOwogCWNhc2UgSU9DX0xJQkNGU19NRU1IT0c6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJLyogZ28gdGhvdWdodCAqLwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcmltLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jCmluZGV4IGM3YmM3ZmMuLjlhNDBkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcmltLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYwpAQCAtNDYsMTMgKzQ2LDYgQEAKICNpbmNsdWRlIDxhc20va2dkYi5oPgogI2VuZGlmCiAKLXZvaWQKLWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQod2FpdF9xdWV1ZV90ICpsaW5rKQotewotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KGxpbmssIGN1cnJlbnQpOwotfQotRVhQT1JUX1NZTUJPTChpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KTsKLQogLyoqCiAgKiB3YWl0X3F1ZXVlX3Qgb2YgTGludXggKHZlcnNpb24gPCAyLjYuMzQpIGlzIGEgRklGTyBsaXN0IGZvciBleGNsdXNpdmVseQogICogd2FpdGluZyB0aHJlYWRzLCB3aGljaCBpcyBub3QgYWx3YXlzIGRlc2lyYWJsZSBiZWNhdXNlIGFsbCB0aHJlYWRzIHdpbGwKQEAgLTc3LDM3ICs3MCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZV9oZWFkKTsKIAotdm9pZAotd2FpdHFfd2FpdCh3YWl0X3F1ZXVlX3QgKmxpbmssIGxvbmcgc3RhdGUpCi17Ci0Jc2NoZWR1bGUoKTsKLX0KLUVYUE9SVF9TWU1CT0wod2FpdHFfd2FpdCk7Ci0KLWludDY0X3QKLXdhaXRxX3RpbWVkd2FpdCh3YWl0X3F1ZXVlX3QgKmxpbmssIGxvbmcgc3RhdGUsIGludDY0X3QgdGltZW91dCkKLXsKLQlyZXR1cm4gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLX0KLUVYUE9SVF9TWU1CT0wod2FpdHFfdGltZWR3YWl0KTsKLQotdm9pZAotc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKGxvbmcgc3RhdGUsIGludDY0X3QgdGltZW91dCkKLXsKLQlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7Ci0Jc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLX0KLUVYUE9SVF9TWU1CT0woc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKTsKLQotLyogZGVzY2hlZHVsZSBmb3IgYSBiaXQuLi4gKi8KLXZvaWQKLWNmc19wYXVzZShjZnNfZHVyYXRpb25fdCB0aWNrcykKLXsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dCh0aWNrcyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNmc19wYXVzZSk7Ci0KIHZvaWQgY2ZzX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnQpCiB7CiAJaW5pdF90aW1lcih0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9uaWRzdHJpbmdzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbmlkc3RyaW5ncy5jCmluZGV4IDczMmFlNTUuLmNmYjI3NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9uaWRzdHJpbmdzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL25pZHN0cmluZ3MuYwpAQCAtNjUsMjMgKzY1LDIwIEBACiAJc3Bpbl9sb2NrX2luaXQoJmxpYmNmc19uaWRzdHJpbmdfbG9jayk7CiB9CiAKLSMgZGVmaW5lIE5JRFNUUl9MT0NLKGYpICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxpYmNmc19uaWRzdHJpbmdfbG9jaywgZikKLSMgZGVmaW5lIE5JRFNUUl9VTkxPQ0soZikgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGliY2ZzX25pZHN0cmluZ19sb2NrLCBmKQotCiBzdGF0aWMgY2hhciAqCiBsaWJjZnNfbmV4dF9uaWRzdHJpbmcodm9pZCkKIHsKIAljaGFyCSAgKnN0cjsKIAl1bnNpZ25lZCBsb25nICBmbGFnczsKIAotCU5JRFNUUl9MT0NLKGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGliY2ZzX25pZHN0cmluZ19sb2NrLCBmbGFncyk7CiAKIAlzdHIgPSBsaWJjZnNfbmlkc3RyaW5nc1tsaWJjZnNfbmlkc3RyaW5nX2lkeCsrXTsKIAlpZiAobGliY2ZzX25pZHN0cmluZ19pZHggPT0KIAkgICAgc2l6ZW9mKGxpYmNmc19uaWRzdHJpbmdzKS9zaXplb2YobGliY2ZzX25pZHN0cmluZ3NbMF0pKQogCQlsaWJjZnNfbmlkc3RyaW5nX2lkeCA9IDA7CiAKLQlOSURTVFJfVU5MT0NLKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaWJjZnNfbmlkc3RyaW5nX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gc3RyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMKaW5kZXggNTQyOTBjZS4uYzg1OTllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3RyYWNlZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYwpAQCAtMTA3NiwxMSArMTA3NiwxMCBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJl9fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOwogCQlhZGRfd2FpdF9xdWV1ZSgmdGN0bC0+dGN0bF93YWl0cSwgJl9fd2FpdCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXdhaXRxX3RpbWVkd2FpdCgmX193YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJICAgIGNmc190aW1lX3NlY29uZHMoMSkpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmdGN0bC0+dGN0bF93YWl0cSwgJl9fd2FpdCk7CiAJfQogCWNvbXBsZXRlKCZ0Y3RsLT50Y3RsX3N0b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3VwY2FsbF9jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3VwY2FsbF9jYWNoZS5jCmluZGV4IDI0NWI0NmYuLjgwODVlMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy91cGNhbGxfY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdXBjYWxsX2NhY2hlLmMKQEAgLTIxOCwxMyArMjE4LDEyIEBACiAJCQkgICAgICBNQVhfU0NIRURVTEVfVElNRU9VVDsKIAkJbG9uZyBsZWZ0OwogCi0JCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJCWFkZF93YWl0X3F1ZXVlKCZlbnRyeS0+dWVfd2FpdHEsICZ3YWl0KTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc3Bpbl91bmxvY2soJmNhY2hlLT51Y19sb2NrKTsKIAotCQlsZWZ0ID0gd2FpdHFfdGltZWR3YWl0KCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJCSAgIGV4cGlyeSk7CisJCWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0KGV4cGlyeSk7CiAKIAkJc3Bpbl9sb2NrKCZjYWNoZS0+dWNfbG9jayk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZlbnRyeS0+dWVfd2FpdHEsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMKaW5kZXggMWE1NWM4MS4uYmExNmZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMKQEAgLTMzNCw3ICszMzQsOCBAQAogCQkgICAgICAgc2NoZWQtPndzX250aHJlYWRzLCBzY2hlZC0+d3NfbmFtZSk7CiAKIAkJc3Bpbl91bmxvY2soJmNmc193aV9kYXRhLndpX2dsb2NrKTsKLQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkgLyAyMCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpIC8gMjApOwogCQlzcGluX2xvY2soJmNmc193aV9kYXRhLndpX2dsb2NrKTsKIAl9CiAKQEAgLTM4OSwxMSArMzkwLDExIEBACiAJCXNwaW5fdW5sb2NrKCZjZnNfd2lfZGF0YS53aV9nbG9jayk7CiAKIAkJaWYgKHNjaGVkLT53c19jcHRhYiAhPSBOVUxMICYmIHNjaGVkLT53c19jcHQgPj0gMCkgewotCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfJTAyZF8lMDJkIiwKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzXyUwMmRfJTAydSIsCiAJCQkJIHNjaGVkLT53c19uYW1lLCBzY2hlZC0+d3NfY3B0LAogCQkJCSBzY2hlZC0+d3NfbnRocmVhZHMpOwogCQl9IGVsc2UgewotCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfJTAyZCIsCisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc18lMDJ1IiwKIAkJCQkgc2NoZWQtPndzX25hbWUsIHNjaGVkLT53c19udGhyZWFkcyk7CiAJCX0KIApAQCAtNDU5LDcgKzQ2MCw4IEBACiAKIAkJd2hpbGUgKHNjaGVkLT53c19udGhyZWFkcyAhPSAwKSB7CiAJCQlzcGluX3VubG9jaygmY2ZzX3dpX2RhdGEud2lfZ2xvY2spOwotCQkJY2ZzX3BhdXNlKGNmc190aW1lX3NlY29uZHMoMSkgLyAyMCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkgLyAyMCk7CiAJCQlzcGluX2xvY2soJmNmc193aV9kYXRhLndpX2dsb2NrKTsKIAkJfQogCQlzcGluX3VubG9jaygmY2ZzX3dpX2RhdGEud2lfZ2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYwppbmRleCBjYmQ2NjNlLi44YjU1MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJLyoga2VybmVsID49IDIuNi4zOCBsYXN0IHJlZmNvdW50IGlzIGRlY3JlYXNlZCBhZnRlciB0aGlzIGZ1bmN0aW9uLiAqLwogCUxBU1NFUlQoZF9jb3VudChkZSkgPT0gMSk7CiAKLQkvKiBEaXNhYmxlIHRoaXMgcGllY2Ugb2YgY29kZSB0ZW1wcm9hcmlseSBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkCisJLyogRGlzYWJsZSB0aGlzIHBpZWNlIG9mIGNvZGUgdGVtcG9yYXJpbHkgYmVjYXVzZSB0aGlzIGlzIGNhbGxlZAogCSAqIGluc2lkZSBkY2FjaGVfbG9jayBzbyBpdCdzIG5vdCBhcHByb3ByaWF0ZSB0byBkbyBsb3RzIG9mIHdvcmsKIAkgKiBoZXJlLiBBVFRFTlRJT046IEJlZm9yZSB0aGlzIHBpZWNlIG9mIGNvZGUgZW5hYmxpbmcsIExVLTI0ODcgbXVzdCBiZQogCSAqIHJlc29sdmVkLiAqLwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbGxfc2V0X2RkKHN0cnVjdCBkZW50cnkgKmRlKQoraW50IGxsX2RfaW5pdChzdHJ1Y3QgZGVudHJ5ICpkZSkKIHsKIAlMQVNTRVJUKGRlICE9IE5VTEwpOwogCkBAIC0xOTAsNDAgKzE5MCwyMiBAQAogCQlPQkRfQUxMT0NfUFRSKGxsZCk7CiAJCWlmIChsaWtlbHkobGxkICE9IE5VTEwpKSB7CiAJCQlzcGluX2xvY2soJmRlLT5kX2xvY2spOwotCQkJaWYgKGxpa2VseShkZS0+ZF9mc2RhdGEgPT0gTlVMTCkpCisJCQlpZiAobGlrZWx5KGRlLT5kX2ZzZGF0YSA9PSBOVUxMKSkgewogCQkJCWRlLT5kX2ZzZGF0YSA9IGxsZDsKLQkJCWVsc2UKKwkJCQlfX2RfbHVzdHJlX2ludmFsaWRhdGUoZGUpOworCQkJfSBlbHNlIHsKIAkJCQlPQkRfRlJFRV9QVFIobGxkKTsKKwkJCX0KIAkJCXNwaW5fdW5sb2NrKCZkZS0+ZF9sb2NrKTsKIAkJfSBlbHNlIHsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQorCUxBU1NFUlQoZGUtPmRfb3AgPT0gJmxsX2Rfb3BzKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgbGxfZG9wc19pbml0KHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgYmxvY2ssIGludCBpbml0X3NhKQotewotCXN0cnVjdCBsbF9kZW50cnlfZGF0YSAqbGxkID0gbGxfZDJkKGRlKTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGxsZCA9PSBOVUxMICYmIGJsb2NrICE9IDApIHsKLQkJcmMgPSBsbF9zZXRfZGQoZGUpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0KLQkJbGxkID0gbGxfZDJkKGRlKTsKLQl9Ci0KLQlpZiAobGxkICE9IE5VTEwgJiYgaW5pdF9zYSAhPSAwKQotCQlsbGQtPmxsZF9zYV9nZW5lcmF0aW9uID0gMDsKLQotCS8qIGtlcm5lbCA+PSAyLjYuMzggZF9vcCBpcyBzZXQgaW4gZF9hbGxvYygpICovCi0JTEFTU0VSVChkZS0+ZF9vcCA9PSAmbGxfZF9vcHMpOwotCXJldHVybiByYzsKLX0KLQogdm9pZCBsbF9pbnRlbnRfZHJvcF9sb2NrKHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlpZiAoaXQtPml0X29wICYmIGl0LT5kLmx1c3RyZS5pdF9sb2NrX21vZGUpIHsKQEAgLTI1OSw5ICsyNDEsNiBAQAogCQkgcHRscnBjX3JlcV9maW5pc2hlZChpdC0+ZC5sdXN0cmUuaXRfZGF0YSk7IC8qIGxsX2ZpbGVfb3BlbiAqLwogCWlmIChpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9FTlFfQ1JFQVRFX1JFRikpIC8qIGNyZWF0ZSByZWMgKi8KIAkJcHRscnBjX3JlcV9maW5pc2hlZChpdC0+ZC5sdXN0cmUuaXRfZGF0YSk7Ci0JaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0VOUV9DT01QTEVURSkpIC8qIHNhdmVkIHJlcSBmcm9tIHJldmFsaWRhdGUKLQkJCQkJCSAgICAqIHRvIGxvb2t1cCAqLwotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKGl0LT5kLmx1c3RyZS5pdF9kYXRhKTsKIAogCWl0LT5kLmx1c3RyZS5pdF9kaXNwb3NpdGlvbiA9IDA7CiAJaXQtPmQubHVzdHJlLml0X2RhdGEgPSBOVUxMOwpAQCAtMzQ2LDI2OCArMzI1LDMyIEBACiAKIH0KIAotaW50IGxsX3JldmFsaWRhdGVfaXQoc3RydWN0IGRlbnRyeSAqZGUsIGludCBsb29rdXBfZmxhZ3MsCi0JCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQorc3RhdGljIGludCBsbF9yZXZhbGlkYXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJdW5zaWduZWQgaW50IGxvb2t1cF9mbGFncykKIHsKLQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7Ci0Jc3RydWN0IGxvb2t1cF9pbnRlbnQgbG9va3VwX2l0ID0geyAuaXRfb3AgPSBJVF9MT09LVVAgfTsKLQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwOwotCXN0cnVjdCBpbm9kZSAqcGFyZW50ID0gZGUtPmRfcGFyZW50LT5kX2lub2RlOwotCWludCByYzsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAKLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVzLGludGVudD0lc1xuIiwgZGUtPmRfbmFtZS5uYW1lLAotCSAgICAgICBMTF9JVDJTVFIoaXQpKTsKKwkvKgorCSAqIGlmIG9wZW4mY3JlYXRlIGlzIHNldCwgdGFsayB0byBNRFMgdG8gbWFrZSBzdXJlIGZpbGUgaXMgY3JlYXRlZCBpZgorCSAqIG5lY2Vzc2FyeSwgYmVjYXVzZSB3ZSBjYW4ndCBkbyB0aGlzIGluIC0+b3BlbigpIGxhdGVyIHNpbmNlIHRoYXQncworCSAqIGNhbGxlZCBvbiBhbiBpbm9kZS4gcmV0dXJuIDAgaGVyZSB0byBsZXQgbG9va3VwIHRvIGhhbmRsZSB0aGlzLgorCSAqLworCWlmICgobG9va3VwX2ZsYWdzICYgKExPT0tVUF9PUEVOIHwgTE9PS1VQX0NSRUFURSkpID09CisJICAgIChMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKQorCQlyZXR1cm4gMDsKIAotCWlmIChkZS0+ZF9pbm9kZSA9PSBOVUxMKSB7Ci0JCV9fdTY0IGliaXRzOwotCi0JCS8qIFdlIGNhbiBvbmx5IHVzZSBuZWdhdGl2ZSBkZW50cmllcyBpZiB0aGlzIGlzIHN0YXQgb3IgbG9va3VwLAotCQkgICBmb3Igb3BlbnMgYW5kIHN0dWZmIHdlIGRvIG5lZWQgdG8gcXVlcnkgc2VydmVyLiAqLwotCQkvKiBJZiB0aGVyZSBpcyBJVF9DUkVBVCBpbiBpbnRlbnQgb3Agc2V0LCB0aGVuIHdlIG11c3QgdGhyb3cKLQkJICAgYXdheSB0aGlzIG5lZ2F0aXZlIGRlbnRyeSBhbmQgYWN0dWFsbHkgZG8gdGhlIHJlcXVlc3QgdG8KLQkJICAga2VybmVsIHRvIGNyZWF0ZSB3aGF0ZXZlciBuZWVkcyB0byBiZSBjcmVhdGVkIChpZiBwb3NzaWJsZSkqLwotCQlpZiAoaXQgJiYgKGl0LT5pdF9vcCAmIElUX0NSRUFUKSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChkX2x1c3RyZV9pbnZhbGlkKGRlKSkKLQkJCXJldHVybiAwOwotCi0JCWliaXRzID0gTURTX0lOT0RFTE9DS19VUERBVEU7Ci0JCXJjID0gbGxfaGF2ZV9tZF9sb2NrKHBhcmVudCwgJmliaXRzLCBMQ0tfTUlOTU9ERSk7Ci0JCUdPVE8ob3V0X3NhLCByYyk7Ci0JfQotCi0JLyogTmV2ZXIgZXhlY3V0ZSBpbnRlbnRzIGZvciBtb3VudCBwb2ludHMuCi0JICogQXR0cmlidXRlcyB3aWxsIGJlIGZpeGVkIHVwIGluIGxsX2lub2RlX3JldmFsaWRhdGVfaXQgKi8KLQlpZiAoZF9tb3VudHBvaW50KGRlKSkKLQkJR09UTyhvdXRfc2EsIHJjID0gMSk7Ci0KLQkvKiBuZWVkIHRvIGdldCBhdHRyaWJ1dGVzIGluIGNhc2Ugcm9vdCBnb3QgY2hhbmdlZCBmcm9tIG90aGVyIGNsaWVudCAqLwotCWlmIChkZSA9PSBkZS0+ZF9zYi0+c19yb290KSB7Ci0JCXJjID0gX19sbF9pbm9kZV9yZXZhbGlkYXRlX2l0KGRlLCBpdCwgTURTX0lOT0RFTE9DS19MT09LVVApOwotCQlpZiAocmMgPT0gMCkKLQkJCXJjID0gMTsKLQkJR09UTyhvdXRfc2EsIHJjKTsKLQl9Ci0KLQlleHAgPSBsbF9pMm1kZXhwKGRlLT5kX2lub2RlKTsKLQotCU9CRF9GQUlMX1RJTUVPVVQoT0JEX0ZBSUxfTURDX1JFVkFMSURBVEVfUEFVU0UsIDUpOwotCWxsX2Zyb2JfaW50ZW50KCZpdCwgJmxvb2t1cF9pdCk7Ci0JTEFTU0VSVChpdCk7Ci0KLQlpZiAoaXQtPml0X29wID09IElUX0xPT0tVUCAmJiAhZF9sdXN0cmVfaW52YWxpZChkZSkpCisJaWYgKGxvb2t1cF9mbGFncyAmIChMT09LVVBfUEFSRU5UIHwgTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSkKIAkJcmV0dXJuIDE7CiAKLQlpZiAoaXQtPml0X29wID09IElUX09QRU4pIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IGRlLT5kX2lub2RlOwotCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKLQkJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICoqb2NoX3A7Ci0JCV9fdTY0IGliaXRzOworCWlmIChkX25lZWRfc3RhdGFoZWFkKGRpciwgZGVudHJ5KSA8PSAwKQorCQlyZXR1cm4gMTsKIAotCQkvKgotCQkgKiBXZSB1c2VkIHRvIGNoZWNrIGZvciBNRFNfSU5PREVMT0NLX09QRU4gaGVyZSwgYnV0IGluIGZhY3QKLQkJICoganVzdCBoYXZpbmcgTE9PS1VQIGxvY2sgaXMgZW5vdWdoIHRvIGp1c3RpZnkgaW5vZGUgaXMgdGhlCi0JCSAqIHNhbWUuIEFuZCBpZiBpbm9kZSBpcyB0aGUgc2FtZSBhbmQgd2UgaGF2ZSBzdWl0YWJsZQotCQkgKiBvcGVuaGFuZGxlLCB0aGVuIHRoZXJlIGlzIG5vIHBvaW50IGluIGRvaW5nIGFub3RoZXIgT1BFTiBSUEMKLQkJICoganVzdCB0byB0aHJvdyBhd2F5IG5ld2x5IHJlY2VpdmVkIG9wZW5oYW5kbGUuICBUaGVyZSBhcmUgbm8KLQkJICogc2VjdXJpdHkgaW1wbGljYXRpb25zIHRvbywgaWYgZmlsZSBvd25lciBvciBhY2Nlc3MgbW9kZSBpcwotCQkgKiBjaGFuZ2UsIExPT0tVUCBsb2NrIGlzIHJldm9rZWQuCi0JCSAqLworCWlmIChsb29rdXBfZmxhZ3MgJiBMT09LVVBfUkNVKQorCQlyZXR1cm4gLUVDSElMRDsKIAotCi0JCWlmIChpdC0+aXRfZmxhZ3MgJiBGTU9ERV9XUklURSkKLQkJCW9jaF9wID0gJmxsaS0+bGxpX21kc193cml0ZV9vY2g7Ci0JCWVsc2UgaWYgKGl0LT5pdF9mbGFncyAmIEZNT0RFX0VYRUMpCi0JCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfZXhlY19vY2g7Ci0JCWVsc2UKLQkJCW9jaF9wID0gJmxsaS0+bGxpX21kc19yZWFkX29jaDsKLQotCQkvKiBDaGVjayBmb3IgdGhlIHByb3BlciBsb2NrLiAqLwotCQlpYml0cyA9IE1EU19JTk9ERUxPQ0tfTE9PS1VQOwotCQlpZiAoIWxsX2hhdmVfbWRfbG9jayhpbm9kZSwgJmliaXRzLCBMQ0tfTUlOTU9ERSkpCi0JCQlnb3RvIGRvX2xvY2s7Ci0JCW11dGV4X2xvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7Ci0JCWlmICgqb2NoX3ApIHsgLyogRXZlcnl0aGluZyBpcyBvcGVuIGFscmVhZHksIGRvIG5vdGhpbmcgKi8KLQkJCS8qIE9yaWdpbmFsbHkgaXQgd2FzIGlkZWEgdG8gZG8gbm90IGxldCB0aGVtIHN0ZWFsIG91cgotCQkJICogb3BlbiBoYW5kbGUgZnJvbSB1bmRlciB1cyBieSAoKm9jaF91c2Vjb3VudCkrKyBoZXJlLgotCQkJICogQnV0IGluIGNhc2Ugd2UgaGF2ZSB0aGUgaGFuZGxlLCBidXQgd2UgY2Fubm90IHVzZSBpdAotCQkJICogZHVlIHRvIGxhdGVyIGNoZWNrcyAoZS5nLiBPX0NSRUFUfE9fRVhDTCBmbGFncyBzZXQpLAotCQkJICogbm9ib2R5IHdvdWxkIGRlY3JlbWVudCBjb3VudGVyIGluY3JlYXNlZCBoZXJlLiBTbyB3ZQotCQkJICoganVzdCBob3BlIHRoZSBsb2NrIHdvbid0IGJlIGludmFsaWRhdGVkIGluIGJldHdlZW4uCi0JCQkgKiBCdXQgaWYgaXQgd291bGQgYmUsIHdlJ2xsIHJlb3BlbiB0aGUgb3BlbiByZXF1ZXN0IHRvCi0JCQkgKiBNRFMgbGF0ZXIgZHVyaW5nIGZpbGUgb3BlbiBwYXRoLgotCQkJICovCi0JCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7Ci0JfQotCi0JaWYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSKSB7Ci0JCXJjID0gbGxfc3RhdGFoZWFkX2VudGVyKHBhcmVudCwgJmRlLCAwKTsKLQkJaWYgKHJjID09IDEpCi0JCQlnb3RvIG1hcms7Ci0JCWVsc2UgaWYgKHJjICE9IC1FQUdBSU4gJiYgcmMgIT0gMCkKLQkJCUdPVE8ob3V0LCByYyA9IDApOwotCX0KLQotZG9fbG9jazoKLQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIHBhcmVudCwgZGUtPmRfaW5vZGUsCi0JCQkJICAgICBkZS0+ZF9uYW1lLm5hbWUsIGRlLT5kX25hbWUubGVuLAotCQkJCSAgICAgMCwgTFVTVFJFX09QQ19BTlksIE5VTEwpOwotCWlmIChJU19FUlIob3BfZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwotCi0JaWYgKCFJU19QT1NJWEFDTChwYXJlbnQpIHx8ICFleHBfY29ubmVjdF91bWFzayhleHApKQotCQlpdC0+aXRfY3JlYXRlX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKLQlpdC0+aXRfY3JlYXRlX21vZGUgfD0gTV9DSEVDS19TVEFMRTsKLQlyYyA9IG1kX2ludGVudF9sb2NrKGV4cCwgb3BfZGF0YSwgTlVMTCwgMCwgaXQsCi0JCQkgICAgbG9va3VwX2ZsYWdzLAotCQkJICAgICZyZXEsIGxsX21kX2Jsb2NraW5nX2FzdCwgMCk7Ci0JaXQtPml0X2NyZWF0ZV9tb2RlICY9IH5NX0NIRUNLX1NUQUxFOwotCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCi0JLyogSWYgcmVxIGlzIE5VTEwsIHRoZW4gbWRfaW50ZW50X2xvY2sgb25seSB0cmllZCB0byBkbyBhIGxvY2sgbWF0Y2g7Ci0JICogaWYgYWxsIHdhcyB3ZWxsLCBpdCB3aWxsIHJldHVybiAxIGlmIGl0IGZvdW5kIGxvY2tzLCAwIG90aGVyd2lzZS4gKi8KLQlpZiAocmVxID09IE5VTEwgJiYgcmMgPj0gMCkgewotCQlpZiAoIXJjKQotCQkJZ290byBkb19sb29rdXA7Ci0JCUdPVE8ob3V0LCByYyk7Ci0JfQotCi0JaWYgKHJjIDwgMCkgewotCQlpZiAocmMgIT0gLUVTVEFMRSkgewotCQkJQ0RFQlVHKERfSU5GTywgImxsX2ludGVudF9sb2NrOiByYyAlZCA6IGl0LT5pdF9zdGF0dXMgIgotCQkJICAgICAgICIlZFxuIiwgcmMsIGl0LT5kLmx1c3RyZS5pdF9zdGF0dXMpOwotCQl9Ci0JCUdPVE8ob3V0LCByYyA9IDApOwotCX0KLQotcmV2YWxpZGF0ZV9maW5pc2g6Ci0JcmMgPSBsbF9yZXZhbGlkYXRlX2l0X2ZpbmlzaChyZXEsIGl0LCBkZSk7Ci0JaWYgKHJjICE9IDApIHsKLQkJaWYgKHJjICE9IC1FU1RBTEUgJiYgcmMgIT0gLUVOT0VOVCkKLQkJCWxsX2ludGVudF9yZWxlYXNlKGl0KTsKLQkJR09UTyhvdXQsIHJjID0gMCk7Ci0JfQotCi0JaWYgKChpdC0+aXRfb3AgJiBJVF9PUEVOKSAmJiBkZS0+ZF9pbm9kZSAmJgotCSAgICAhU19JU1JFRyhkZS0+ZF9pbm9kZS0+aV9tb2RlKSAmJgotCSAgICAhU19JU0RJUihkZS0+ZF9pbm9kZS0+aV9tb2RlKSkgewotCQlsbF9yZWxlYXNlX29wZW5oYW5kbGUoZGUsIGl0KTsKLQl9Ci0JcmMgPSAxOwotCi1vdXQ6Ci0JLyogV2UgZG8gbm90IGZyZWUgcmVxdWVzdCBhcyBpdCBtYXkgYmUgcmV1c2VkIGR1cmluZyBmb2xsb3dpbmcgbG9va3VwCi0JICogKHNlZSBjb21tZW50IGluIG1kYy9tZGNfbG9ja3MuYzo6bWRjX2ludGVudF9sb2NrKCkpLCByZXF1ZXN0IHdpbGwKLQkgKiBiZSBmcmVlZCBpbiBsbF9sb29rdXBfaXQgb3IgaW4gbGxfaW50ZW50X3JlbGVhc2UuIEJ1dCBpZgotCSAqIHJlcXVlc3Qgd2FzIG5vdCBjb21wbGV0ZWQsIHdlIG5lZWQgdG8gZnJlZSBpdC4gKGJ1ZyA1MTU0LCA5OTAzKSAqLwotCWlmIChyZXEgIT0gTlVMTCAmJiAhaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfRU5RX0NPTVBMRVRFKSkKLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCWlmIChyYyA9PSAwKSB7Ci0JCS8qIG1kdCBtYXkgZ3JhbnQgbGF5b3V0IGxvY2sgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGZpbGUsIHNvCi0JCSAqIHJlbGVhc2UgdGhlIGxvY2sgdG8gYXZvaWQgbGVha2luZyAqLwotCQlsbF9pbnRlbnRfZHJvcF9sb2NrKGl0KTsKLQkJbGxfaW52YWxpZGF0ZV9hbGlhc2VzKGRlLT5kX2lub2RlKTsKLQl9IGVsc2UgewotCQlfX3U2NCBiaXRzID0gMDsKLQkJX191NjQgbWF0Y2hlZF9iaXRzID0gMDsKLQotCQlDREVCVUcoRF9ERU5UUlksICJyZXZhbGlkYXRlZCBkZW50cnkgJS4qcyAoJXApIHBhcmVudCAlcCAiCi0JCSAgICAgICAiaW5vZGUgJXAgcmVmYyAlZFxuIiwgZGUtPmRfbmFtZS5sZW4sCi0JCSAgICAgICBkZS0+ZF9uYW1lLm5hbWUsIGRlLCBkZS0+ZF9wYXJlbnQsIGRlLT5kX2lub2RlLAotCQkgICAgICAgZF9jb3VudChkZSkpOwotCi0JCWxsX3NldF9sb2NrX2RhdGEoZXhwLCBkZS0+ZF9pbm9kZSwgaXQsICZiaXRzKTsKLQotCQkvKiBOb3RlOiBXZSBoYXZlIHRvIG1hdGNoIGJvdGggTE9PS1VQIGFuZCBQRVJNIGxvY2sKLQkJICogaGVyZSB0byBtYWtlIHN1cmUgdGhlIGRlbnRyeSBpcyB2YWxpZCBhbmQgbm8gb25lCi0JCSAqIGNoYW5naW5nIHRoZSBwZXJtaXNzaW9uLgotCQkgKiBCdXQgaWYgdGhlIGNsaWVudCBjb25uZWN0cyA8IDIuNCBzZXJ2ZXIsIHdoaWNoIHdpbGwKLQkJICogb25seSBncmFudCBMT09LVVAgbG9jaywgc28gd2UgY2FuIG9ubHkgTWF0Y2ggTE9PS1VQCi0JCSAqIGxvY2sgZm9yIG9sZCBzZXJ2ZXIgKi8KLQkJaWYgKGV4cF9jb25uZWN0X2ZsYWdzKGxsX2kybWRleHAoZGUtPmRfaW5vZGUpKSAmJgotCQkJCQkJCU9CRF9DT05ORUNUX0xWQl9UWVBFKQotCQkJbWF0Y2hlZF9iaXRzID0KLQkJCQlNRFNfSU5PREVMT0NLX0xPT0tVUCB8IE1EU19JTk9ERUxPQ0tfUEVSTTsKLQkJZWxzZQotCQkJbWF0Y2hlZF9iaXRzID0gTURTX0lOT0RFTE9DS19MT09LVVA7Ci0KLQkJaWYgKCgoYml0cyAmIG1hdGNoZWRfYml0cykgPT0gbWF0Y2hlZF9iaXRzKSAmJgotCQkgICAgZF9sdXN0cmVfaW52YWxpZChkZSkpCi0JCQlkX2x1c3RyZV9yZXZhbGlkYXRlKGRlKTsKLQkJbGxfbG9va3VwX2ZpbmlzaF9sb2NrcyhpdCwgZGUpOwotCX0KLQotbWFyazoKLQlpZiAoaXQgIT0gTlVMTCAmJiBpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUiAmJiByYyA+IDApCi0JCWxsX3N0YXRhaGVhZF9tYXJrKHBhcmVudCwgZGUpOwotCXJldHVybiByYzsKLQotCS8qCi0JICogVGhpcyBwYXJ0IGlzIGhlcmUgdG8gY29tYmF0IGV2aWwtZXZpbCByYWNlIGluIHJlYWxfbG9va3VwIG9uIDIuNgotCSAqIGtlcm5lbHMuICBUaGUgcmFjZSBkZXRhaWxzIGFyZTogV2UgZW50ZXIgZG9fbG9va3VwKCkgbG9va2luZyBmb3Igc29tZQotCSAqIG5hbWUsIHRoZXJlIGlzIG5vdGhpbmcgaW4gZGNhY2hlIGZvciB0aGlzIG5hbWUgeWV0IGFuZCBkX2xvb2t1cCgpCi0JICogcmV0dXJucyBOVUxMLiAgV2UgcHJvY2VlZCB0byByZWFsX2xvb2t1cCgpLCBhbmQgd2hpbGUgd2UgZG8gdGhpcywKLQkgKiBhbm90aGVyIHByb2Nlc3MgZG9lcyBvcGVuIG9uIHRoZSBzYW1lIGZpbGUgd2UgbG9va2luZyB1cCAobW9zdCBzaW1wbGUKLQkgKiByZXByb2R1Y2VyKSwgb3BlbiBzdWNjZWVkcyBhbmQgdGhlIGRlbnRyeSBpcyBhZGRlZC4gTm93IGJhY2sgdG8KLQkgKiB1cy4gSW4gcmVhbF9sb29rdXAoKSB3ZSBkbyBkX2xvb2t1cCgpIGFnYWluIGFuZCBzdWRkZW5seSBmaW5kIHRoZQotCSAqIGRlbnRyeSwgc28gd2UgY2FsbCBkX3JldmFsaWRhdGUgb24gaXQsIGJ1dCB0aGVyZSBpcyBubyBsb2NrLCBzbwotCSAqIHdpdGhvdXQgdGhpcyBjb2RlIHdlIHdvdWxkIHJldHVybiAwLCBidXQgdW5wYXRjaGVkIHJlYWxfbG9va3VwIGp1c3QKLQkgKiByZXR1cm5zIC1FTk9FTlQgaW4gc3VjaCBhIGNhc2UgaW5zdGVhZCBvZiByZXRyeWluZyB0aGUgbG9va3VwLiBPbmNlCi0JICogdGhpcyBpcyBkZWFsdCB3aXRoIGluIHJlYWxfbG9va3VwKCksIGFsbCBvZiB0aGlzIHVnbHkgbWVzcyBjYW4gZ28gYW5kCi0JICogd2UgY2FuIGp1c3QgY2hlY2sgbG9ja3MgaW4gLT5kX3JldmFsaWRhdGUgd2l0aG91dCBkb2luZyBhbnkgUlBDcwotCSAqIGV2ZXIuCi0JICovCi1kb19sb29rdXA6Ci0JaWYgKGl0ICE9ICZsb29rdXBfaXQpIHsKLQkJLyogTURTX0lOT0RFTE9DS19VUERBVEUgbmVlZGVkIGZvciBJVF9HRVRBVFRSIGNhc2UuICovCi0JCWlmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUikKLQkJCWxvb2t1cF9pdC5pdF9vcCA9IElUX0dFVEFUVFI7Ci0JCWxsX2xvb2t1cF9maW5pc2hfbG9ja3MoaXQsIGRlKTsKLQkJaXQgPSAmbG9va3VwX2l0OwotCX0KLQotCS8qIERvIHJlYWwgbG9va3VwIGhlcmUuICovCi0Jb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBwYXJlbnQsIE5VTEwsIGRlLT5kX25hbWUubmFtZSwKLQkJCQkgICAgIGRlLT5kX25hbWUubGVuLCAwLCAoaXQtPml0X29wICYgSVRfQ1JFQVQgPwotCQkJCQkJCSBMVVNUUkVfT1BDX0NSRUFURSA6Ci0JCQkJCQkJIExVU1RSRV9PUENfQU5ZKSwgTlVMTCk7Ci0JaWYgKElTX0VSUihvcF9kYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7Ci0KLQlyYyA9IG1kX2ludGVudF9sb2NrKGV4cCwgb3BfZGF0YSwgTlVMTCwgMCwgIGl0LCAwLCAmcmVxLAotCQkJICAgIGxsX21kX2Jsb2NraW5nX2FzdCwgMCk7Ci0JaWYgKHJjID49IDApIHsKLQkJc3RydWN0IG1kdF9ib2R5ICptZHRfYm9keTsKLQkJc3RydWN0IGx1X2ZpZCBmaWQgPSB7LmZfc2VxID0gMCwgLmZfb2lkID0gMCwgLmZfdmVyID0gMH07Ci0JCW1kdF9ib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQotCQlpZiAoZGUtPmRfaW5vZGUpCi0JCQlmaWQgPSAqbGxfaW5vZGUyZmlkKGRlLT5kX2lub2RlKTsKLQotCQkvKiBzZWUgaWYgd2UgZ290IHNhbWUgaW5vZGUsIGlmIG5vdCAtIHJldHVybiBlcnJvciAqLwotCQlpZiAobHVfZmlkX2VxKCZmaWQsICZtZHRfYm9keS0+ZmlkMSkpIHsKLQkJCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCQkJb3BfZGF0YSA9IE5VTEw7Ci0JCQlnb3RvIHJldmFsaWRhdGVfZmluaXNoOwotCQl9Ci0JCWxsX2ludGVudF9yZWxlYXNlKGl0KTsKLQl9Ci0JbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JR09UTyhvdXQsIHJjID0gMCk7Ci0KLW91dF9zYToKLQkvKgotCSAqIEZvciByYyA9PSAxIGNhc2UsIHNob3VsZCBub3QgcmV0dXJuIGRpcmVjdGx5IHRvIHByZXZlbnQgbG9zaW5nCi0JICogc3RhdGFoZWFkIHdpbmRvd3M7IGZvciByYyA9PSAwIGNhc2UsIHRoZSAibG9va3VwIiB3aWxsIGJlIGRvbmUgbGF0ZXIuCi0JICovCi0JaWYgKGl0ICE9IE5VTEwgJiYgaXQtPml0X29wID09IElUX0dFVEFUVFIgJiYgcmMgPT0gMSkKLQkJbGxfc3RhdGFoZWFkX2VudGVyKHBhcmVudCwgJmRlLCAxKTsKLQlnb3RvIG1hcms7CisJZG9fc3RhdGFoZWFkX2VudGVyKGRpciwgJmRlbnRyeSwgZGVudHJ5LT5kX2lub2RlID09IE5VTEwpOworCWxsX3N0YXRhaGVhZF9tYXJrKGRpciwgZGVudHJ5KTsKKwlyZXR1cm4gMTsKIH0KIAogLyoKQEAgLTYxNSwyNCArMzU4LDEzIEBACiAgKi8KIGludCBsbF9yZXZhbGlkYXRlX25kKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBpbm9kZSAqcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKLQlpbnQgdW5wbHVnID0gMDsKKwlpbnQgcmM7CiAKLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVzLGZsYWdzPSV1XG4iLAorCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXMsIGZsYWdzPSV1XG4iLAogCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCBmbGFncyk7CiAKLQlpZiAoIShmbGFncyAmIChMT09LVVBfUEFSRU5UfExPT0tVUF9PUEVOfExPT0tVUF9DUkVBVEUpKSAmJgotCSAgICBsbF9uZWVkX3N0YXRhaGVhZChwYXJlbnQsIGRlbnRyeSkgPiAwKSB7Ci0JCWlmIChmbGFncyAmIExPT0tVUF9SQ1UpCi0JCQlyZXR1cm4gLUVDSElMRDsKLQotCQlpZiAoZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCi0JCQl1bnBsdWcgPSAxOwotCQlkb19zdGF0YWhlYWRfZW50ZXIocGFyZW50LCAmZGVudHJ5LCB1bnBsdWcpOwotCQlsbF9zdGF0YWhlYWRfbWFyayhwYXJlbnQsIGRlbnRyeSk7Ci0JfQotCi0JcmV0dXJuIDE7CisJcmMgPSBsbF9yZXZhbGlkYXRlX2RlbnRyeShkZW50cnksIGZsYWdzKTsKKwlyZXR1cm4gcmM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYwppbmRleCA1MmI3NzMxLi43ZmJjMThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYwpAQCAtMzYyLDcgKzM2Miw3IEBACiAJCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdDsKIAkJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAKLQkJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIE5VTEwsIE5VTEwsIDAsIDAsCisJCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBkaXIsIE5VTEwsIDAsIDAsCiAJCUxVU1RSRV9PUENfQU5ZLCBOVUxMKTsKIAkJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJCXJldHVybiAodm9pZCAqKW9wX2RhdGE7CkBAIC0xMDQ4LDIwICsxMDQ4LDI1IEBACiB9CiAKIAotc3RhdGljIGludCBjb3B5X2FuZF9pb2N0bChpbnQgY21kLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCB2b2lkICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBjb3B5X2FuZF9pb2N0bChpbnQgY21kLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJICBjb25zdCB2b2lkIF9fdXNlciAqZGF0YSwgc2l6ZV90IHNpemUpCiB7Ci0Jdm9pZCAqcHRyOworCXZvaWQgKmNvcHk7CiAJaW50IHJjOwogCi0JT0JEX0FMTE9DKHB0ciwgbGVuKTsKLQlpZiAocHRyID09IE5VTEwpCisJT0JEX0FMTE9DKGNvcHksIHNpemUpOworCWlmIChjb3B5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWlmIChjb3B5X2Zyb21fdXNlcihwdHIsIGRhdGEsIGxlbikpIHsKLQkJT0JEX0ZSRUUocHRyLCBsZW4pOwotCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjb3B5LCBkYXRhLCBzaXplKSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCX0KLQlyYyA9IG9iZF9pb2NvbnRyb2woY21kLCBleHAsIGxlbiwgZGF0YSwgTlVMTCk7Ci0JT0JEX0ZSRUUocHRyLCBsZW4pOworCisJcmMgPSBvYmRfaW9jb250cm9sKGNtZCwgZXhwLCBzaXplLCBjb3B5LCBOVUxMKTsKK291dDoKKwlPQkRfRlJFRShjb3B5LCBzaXplKTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtMTA4MCw3ICsxMDg1LDcgQEAKIAljYXNlIFFfUVVPVEFPRkY6CiAJY2FzZSBRX1NFVFFVT1RBOgogCWNhc2UgUV9TRVRJTkZPOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CiAJCSAgICBzYmktPmxsX2ZsYWdzICYgTExfU0JJX1JNVF9DTElFTlQpCiAJCQlyZXR1cm4gLUVQRVJNOwogCQlicmVhazsKQEAgLTEwODksNyArMTA5NCw3IEBACiAJCSAgICAgICF1aWRfZXEoY3VycmVudF9ldWlkKCksIG1ha2Vfa3VpZCgmaW5pdF91c2VyX25zLCBpZCkpKSB8fAogCQkgICAgICh0eXBlID09IEdSUFFVT1RBICYmCiAJCSAgICAgICFpbl9lZ3JvdXBfcChtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgaWQpKSkpICYmCi0JCSAgICAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAorCQkgICAgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAogCQkgICAgIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkpCiAJCQlyZXR1cm4gLUVQRVJNOwogCQlicmVhazsKQEAgLTEzOTUsNyArMTQwMCw3IEBACiAJCWlmICh0bXAgPT0gTlVMTCkKIAkJCUdPVE8oZnJlZV9sbXYsIHJjID0gLUVOT01FTSk7CiAKLQkJbWVtY3B5KHRtcCwgJmx1bSwgc2l6ZW9mKGx1bSkpOworCQkqdG1wID0gbHVtOwogCQl0bXAtPmx1bV90eXBlID0gTE1WX1NUUklQRV9UWVBFOwogCQl0bXAtPmx1bV9zdHJpcGVfY291bnQgPSAxOwogCQltZHRpbmRleCA9IGxsX2dldF9tZHRfaWR4KGlub2RlKTsKQEAgLTE1OTcsNyArMTYwMiw3IEBACiAJCXN0cnVjdCBvYmRfcXVvdGFjdGwgKm9xY3RsOwogCQlpbnQgZXJyb3IgPSAwOwogCi0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKIAkJICAgIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkKIAkJCXJldHVybiAtRVBFUk07CiAKQEAgLTE2MjEsNyArMTYyNiw3IEBACiAJY2FzZSBPQkRfSU9DX1BPTExfUVVPVEFDSEVDSzogewogCQlzdHJ1Y3QgaWZfcXVvdGFjaGVjayAqY2hlY2s7CiAKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAogCQkgICAgc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKQogCQkJcmV0dXJuIC1FUEVSTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCmluZGV4IGMxMjgyMWEuLjhlODQ0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGxsX21kX3JlYWxfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoraW50IGxsX21kX3JlYWxfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgZm1vZGVfdCBmbW9kZSkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKipvY2hfcDsKQEAgLTIxMywzMCArMjEzLDMzIEBACiAJX191NjQgKm9jaF91c2Vjb3VudDsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKGZsYWdzICYgRk1PREVfV1JJVEUpIHsKKwlpZiAoZm1vZGUgJiBGTU9ERV9XUklURSkgewogCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfd3JpdGVfb2NoOwogCQlvY2hfdXNlY291bnQgPSAmbGxpLT5sbGlfb3Blbl9mZF93cml0ZV9jb3VudDsKLQl9IGVsc2UgaWYgKGZsYWdzICYgRk1PREVfRVhFQykgeworCX0gZWxzZSBpZiAoZm1vZGUgJiBGTU9ERV9FWEVDKSB7CiAJCW9jaF9wID0gJmxsaS0+bGxpX21kc19leGVjX29jaDsKIAkJb2NoX3VzZWNvdW50ID0gJmxsaS0+bGxpX29wZW5fZmRfZXhlY19jb3VudDsKIAl9IGVsc2UgewotCQlMQVNTRVJUKGZsYWdzICYgRk1PREVfUkVBRCk7CisJCUxBU1NFUlQoZm1vZGUgJiBGTU9ERV9SRUFEKTsKIAkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX3JlYWRfb2NoOwogCQlvY2hfdXNlY291bnQgPSAmbGxpLT5sbGlfb3Blbl9mZF9yZWFkX2NvdW50OwogCX0KIAogCW11dGV4X2xvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7Ci0JaWYgKCpvY2hfdXNlY291bnQpIHsgLyogVGhlcmUgYXJlIHN0aWxsIHVzZXJzIG9mIHRoaXMgaGFuZGxlLCBzbwotCQkJCXNraXAgZnJlZWluZyBpdC4gKi8KKwlpZiAoKm9jaF91c2Vjb3VudCA+IDApIHsKKwkJLyogVGhlcmUgYXJlIHN0aWxsIHVzZXJzIG9mIHRoaXMgaGFuZGxlLCBzbyBza2lwCisJCSAqIGZyZWVpbmcgaXQuICovCiAJCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKIAkJcmV0dXJuIDA7CiAJfQorCiAJb2NoPSpvY2hfcDsKIAkqb2NoX3AgPSBOVUxMOwogCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKIAotCWlmIChvY2gpIHsgLyogVGhlcmUgbWlnaHQgYmUgYSByYWNlIGFuZCBzb21lYm9keSBoYXZlIGZyZWVkIHRoaXMgb2NoCi0JCSAgICAgIGFscmVhZHkgKi8KKwlpZiAob2NoICE9IE5VTEwpIHsKKwkJLyogVGhlcmUgbWlnaHQgYmUgYSByYWNlIGFuZCB0aGlzIGhhbmRsZSBtYXkgYWxyZWFkeQorCQkgICBiZSBjbG9zZWQuICovCiAJCXJjID0gbGxfY2xvc2VfaW5vZGVfb3BlbmhhbmRsZShsbF9pMnNiaShpbm9kZSktPmxsX21kX2V4cCwKIAkJCQkJICAgICAgIGlub2RlLCBvY2gsIE5VTEwpOwogCX0KQEAgLTQ0Myw4ICs0NDYsNyBAQAogCQkJCSBpdHAsIE5VTEwpOwogCiBvdXQ6Ci0JcHRscnBjX3JlcV9maW5pc2hlZChpdHAtPmQubHVzdHJlLml0X2RhdGEpOwotCWl0X2NsZWFyX2Rpc3Bvc2l0aW9uKGl0cCwgRElTUF9FTlFfQ09NUExFVEUpOworCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAlsbF9pbnRlbnRfZHJvcF9sb2NrKGl0cCk7CiAKIAlyZXR1cm4gcmM7CkBAIC00NzcsNyArNDc5LDcgQEAKIAlvY2gtPm9jaF9tYWdpYyA9IE9CRF9DTElFTlRfSEFORExFX01BR0lDOwogCW9jaC0+b2NoX2ZsYWdzID0gaXQtPml0X2ZsYWdzOwogCi0JcmV0dXJuIG1kX3NldF9vcGVuX3JlcGxheV9kYXRhKG1kX2V4cCwgb2NoLCByZXEpOworCXJldHVybiBtZF9zZXRfb3Blbl9yZXBsYXlfZGF0YShtZF9leHAsIG9jaCwgaXQpOwogfQogCiBpbnQgbGxfbG9jYWxfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LApAQCAtNjcxLDE0ICs2NzMsMTMgQEAKIAogCWxsX2NhcGFfb3Blbihpbm9kZSk7CiAKLQlpZiAoIWxsaS0+bGxpX2hhc19zbWQpIHsKLQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0xPVl9ERUxBWV9DUkVBVEUgfHwKLQkJICAgICEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7Ci0JCQlDREVCVUcoRF9JTk9ERSwgIm9iamVjdCBjcmVhdGlvbiB3YXMgZGVsYXllZFxuIik7Ci0JCQlHT1RPKG91dF9vY2hfZnJlZSwgcmMpOwotCQl9CisJaWYgKCFsbGktPmxsaV9oYXNfc21kICYmCisJICAgIChjbF9pc19sb3ZfZGVsYXlfY3JlYXRlKGZpbGUtPmZfZmxhZ3MpIHx8CisJICAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID09IDApKSB7CisJCUNERUJVRyhEX0lOT0RFLCAib2JqZWN0IGNyZWF0aW9uIHdhcyBkZWxheWVkXG4iKTsKKwkJR09UTyhvdXRfb2NoX2ZyZWUsIHJjKTsKIAl9Ci0JZmlsZS0+Zl9mbGFncyAmPSB+T19MT1ZfREVMQVlfQ1JFQVRFOworCWNsX2xvdl9kZWxheV9jcmVhdGVfY2xlYXIoJmZpbGUtPmZfZmxhZ3MpOwogCUdPVE8ob3V0X29jaF9mcmVlLCByYyk7CiAKIG91dF9vY2hfZnJlZToKQEAgLTgxMywxMCArODE0LDcgQEAKIAkgKiBkb2Vzbid0IGRlYWwgd2l0aCBvcGVuaGFuZGxlLCBzbyBub3JtYWwgb3BlbmhhbmRsZSB3aWxsIGJlIGxlYWtlZC4gKi8KIAkJCQlMRExNX0ZMX05PX0xSVSB8IExETE1fRkxfRVhDTCk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JaWYgKHJlcSAhPSBOVUxMKSB7Ci0JCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQkJaXRfY2xlYXJfZGlzcG9zaXRpb24oJml0LCBESVNQX0VOUV9DT01QTEVURSk7Ci0JfQorCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAlpZiAocmMgPCAwKQogCQlHT1RPKG91dF9yZWxlYXNlX2l0LCByYyk7CiAKQEAgLTEwMzMsNiArMTAzMSwzMyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGJvb2wgZmlsZV9pc19ub2F0aW1lKGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50ID0gZmlsZS0+Zl9wYXRoLm1udDsKKwljb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIEFkYXB0ZWQgZnJvbSBmaWxlX2FjY2Vzc2VkKCkgYW5kIHRvdWNoX2F0aW1lKCkuKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9BVElNRSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpCisJCXJldHVybiB0cnVlOworCisJaWYgKElTX05PQVRJTUUoaW5vZGUpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChtbnQtPm1udF9mbGFncyAmIChNTlRfTk9BVElNRSB8IE1OVF9SRUFET05MWSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICgoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogdm9pZCBsbF9pb19pbml0KHN0cnVjdCBjbF9pbyAqaW8sIGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgd3JpdGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwpAQCAtMTA1Miw2ICsxMDc3LDggQEAKIAl9IGVsc2UgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkgewogCQlpby0+Y2lfbG9ja3JlcSA9IENJTFJfTUFOREFUT1JZOwogCX0KKworCWlvLT5jaV9ub2F0aW1lID0gZmlsZV9pc19ub2F0aW1lKGZpbGUpOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMTA5MiwxNiArMTExOSwxMiBAQAogCQkJCWRvd25fcmVhZCgmbGxpLT5sbGlfdHJ1bmNfc2VtKTsKIAkJCX0KIAkJCWJyZWFrOwotCQljYXNlIElPX1NFTkRGSUxFOgotCQkJdmlvLT51LnNlbmRmaWxlLmN1aV9hY3RvciA9IGFyZ3MtPnUuc2VuZGZpbGUudmlhX2FjdG9yOwotCQkJdmlvLT51LnNlbmRmaWxlLmN1aV90YXJnZXQgPSBhcmdzLT51LnNlbmRmaWxlLnZpYV90YXJnZXQ7Ci0JCQlicmVhazsKIAkJY2FzZSBJT19TUExJQ0U6CiAJCQl2aW8tPnUuc3BsaWNlLmN1aV9waXBlID0gYXJncy0+dS5zcGxpY2UudmlhX3BpcGU7CiAJCQl2aW8tPnUuc3BsaWNlLmN1aV9mbGFncyA9IGFyZ3MtPnUuc3BsaWNlLnZpYV9mbGFnczsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJQ0VSUk9SKCJVbmtub3cgSU8gdHlwZSAtICV1XG4iLCB2aW8tPmN1aV9pb19zdWJ0eXBlKTsKKwkJCUNFUlJPUigiVW5rbm93biBJTyB0eXBlIC0gJXVcbiIsIHZpby0+Y3VpX2lvX3N1YnR5cGUpOwogCQkJTEJVRygpOwogCQl9CiAJCXJlc3VsdCA9IGNsX2lvX2xvb3AoZW52LCBpbyk7CkBAIC0xMzQwLDcgKzEzNjMsNyBAQAogCXN0cnVjdCBsbF9yZWNyZWF0ZV9vYmogdWNyZWF0OwogCXN0cnVjdCBvc3RfaWQJCW9pOwogCi0JaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdWNyZWF0LCAoc3RydWN0IGxsX3JlY3JlYXRlX29iaiAqKWFyZywKQEAgLTEzNTgsNyArMTM4MSw3IEBACiAJc3RydWN0IG9zdF9pZAlvaTsKIAlvYmRfY291bnQJb3N0X2lkeDsKIAotCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmZpZCwgKHN0cnVjdCBsdV9maWQgKilhcmcsIHNpemVvZihmaWQpKSkKQEAgLTEzODEsMjMgKzE0MDQsMjUgQEAKIAkJY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7CiAJCUNERUJVRyhEX0lPQ1RMLCAic3RyaXBlIGFscmVhZHkgZXhpc3RzIGZvciBpbm8gJWx1XG4iLAogCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIC1FRVhJU1Q7CisJCUdPVE8ob3V0LCByYyA9IC1FRVhJU1QpOwogCX0KIAogCWxsX2lub2RlX3NpemVfbG9jayhpbm9kZSk7CiAJcmMgPSBsbF9pbnRlbnRfZmlsZV9vcGVuKGZpbGUsIGx1bSwgbHVtX3NpemUsICZvaXQpOwogCWlmIChyYykKLQkJR09UTyhvdXQsIHJjKTsKKwkJR09UTyhvdXRfdW5sb2NrLCByYyk7CiAJcmMgPSBvaXQuZC5sdXN0cmUuaXRfc3RhdHVzOwogCWlmIChyYyA8IDApCiAJCUdPVE8ob3V0X3JlcV9mcmVlLCByYyk7CiAKIAlsbF9yZWxlYXNlX29wZW5oYW5kbGUoZmlsZS0+Zl9kZW50cnksICZvaXQpOwogCi0gb3V0Ogorb3V0X3VubG9jazoKIAlsbF9pbm9kZV9zaXplX3VubG9jayhpbm9kZSk7CiAJbGxfaW50ZW50X3JlbGVhc2UoJm9pdCk7CiAJY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7CitvdXQ6CisJY2xfbG92X2RlbGF5X2NyZWF0ZV9jbGVhcigmZmlsZS0+Zl9mbGFncyk7CiAJcmV0dXJuIHJjOwogb3V0X3JlcV9mcmVlOgogCXB0bHJwY19yZXFfZmluaXNoZWQoKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKSBvaXQuZC5sdXN0cmUuaXRfZGF0YSk7CkBAIC0xNDk3LDcgKzE1MjIsNyBAQAogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9vc3RfZGF0YSk7CiAJaW50CQkJIHJjOwogCi0JaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCU9CRF9BTExPQ19MQVJHRShsdW1wLCBsdW1fc2l6ZSk7CkBAIC0xNzQ3LDcgKzE3NzIsNyBAQAogCXN0cnVjdCBnZXRpbmZvX2ZpZDJwYXRoCSpnZm91dCwgKmdmaW47CiAJaW50CQkJIG91dHNpemUsIHJjOwogCi0JaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX0RBQ19SRUFEX1NFQVJDSCkgJiYKKwlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9EQUNfUkVBRF9TRUFSQ0gpICYmCiAJICAgICEobGxfaTJzYmkoaW5vZGUpLT5sbF9mbGFncyAmIExMX1NCSV9VU0VSX0ZJRDJQQVRIKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtMjAwNSw3ICsyMDMwLDcgQEAKIAkJbGxzcy0+aWEyLmlhX3ZhbGlkID0gQVRUUl9NVElNRSB8IEFUVFJfQVRJTUU7CiAJfQogCi0JLyogdWx0aW1hdGUgY2hlY2ssIGJlZm9yZSBzd2FwaW5nIHRoZSBsYXlvdXRzIHdlIGNoZWNrIGlmCisJLyogdWx0aW1hdGUgY2hlY2ssIGJlZm9yZSBzd2FwcGluZyB0aGUgbGF5b3V0cyB3ZSBjaGVjayBpZgogCSAqIGRhdGF2ZXJzaW9uIGhhcyBjaGFuZ2VkIChpZiByZXF1ZXN0ZWQpICovCiAJaWYgKGxsc3MtPmNoZWNrX2R2MSkgewogCQlyYyA9IGxsX2RhdGFfdmVyc2lvbihsbHNzLT5pbm9kZTEsICZkdiwgMCk7CkBAIC0yMDkzLDcgKzIxMTgsNyBAQAogCS8qIE5vbi1yb290IHVzZXJzIGFyZSBmb3JiaWRkZW4gdG8gc2V0IG9yIGNsZWFyIGZsYWdzIHdoaWNoIGFyZQogCSAqIE5PVCBkZWZpbmVkIGluIEhTTV9VU0VSX01BU0suICovCiAJaWYgKCgoaHNzLT5oc3Nfc2V0bWFzayB8IGhzcy0+aHNzX2NsZWFybWFzaykgJiB+SFNNX1VTRVJfTUFTSykgJiYKLQkgICAgIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkgICAgIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBpbm9kZSwgTlVMTCwgTlVMTCwgMCwgMCwKQEAgLTI2NzAsNyArMjY5NSw3IEBACiAJCUxBU1NFUlQoKGNtZCA9PSBGX1NFVExLVykgfHwgKGNtZCA9PSBGX1NFVExLKSk7CiAJCS8qIGZsb2NrcyBhcmUgd2hvbGUtZmlsZSBsb2NrcyAqLwogCQlmbG9jay5sX2Zsb2NrLmVuZCA9IE9GRlNFVF9NQVg7Ci0JCS8qIEZvciBmbG9ja3Mgb3duZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9jYWwgZmlsZSBkZXNjdGlwdG9yKi8KKwkJLyogRm9yIGZsb2NrcyBvd25lciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb2NhbCBmaWxlIGRlc2NyaXB0b3IqLwogCQlmbG9jay5sX2Zsb2NrLm93bmVyID0gKHVuc2lnbmVkIGxvbmcpZmlsZV9sb2NrLT5mbF9maWxlOwogCX0gZWxzZSBpZiAoZmlsZV9sb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKSB7CiAJCWZsb2NrLmxfZmxvY2sub3duZXIgPSAodW5zaWduZWQgbG9uZylmaWxlX2xvY2stPmZsX293bmVyOwpAQCAtMjg5MSw3ICsyOTE2LDcgQEAKIAkJCW9pdC5pdF9vcCA9IElUX0xPT0tVUDsKIAogCQkvKiBDYWxsIGdldGF0dHIgYnkgZmlkLCBzbyBkbyBub3QgcHJvdmlkZSBuYW1lIGF0IGFsbC4gKi8KLQkJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLAorCQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRlbnRyeS0+ZF9pbm9kZSwKIAkJCQkJICAgICBkZW50cnktPmRfaW5vZGUsIE5VTEwsIDAsIDAsCiAJCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIE5VTEwpOwogCQlpZiAoSVNfRVJSKG9wX2RhdGEpKQpAQCAtMzE3NSw3ICszMjAwLDcgQEAKIAkuZ2V0X2FjbAk9IGxsX2dldF9hY2wsCiB9OwogCi0vKiBkeW5hbWljIGlvY3RsIG51bWJlciBzdXBwb3J0IHJvdXRpbnMgKi8KKy8qIGR5bmFtaWMgaW9jdGwgbnVtYmVyIHN1cHBvcnQgcm91dGluZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgbGxpb2NfY3RsX2RhdGEgewogCXN0cnVjdCByd19zZW1hcGhvcmUJaW9jX3NlbTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIGlvY19oZWFkOwpAQCAtMzI5OSw3ICszMzI0LDcgQEAKIAkJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCQkvKiBpdCBjYW4gb25seSBiZSBhbGxvd2VkIHRvIG1hdGNoIGFmdGVyIGxheW91dCBpcwogCQkJICogYXBwbGllZCB0byBpbm9kZSBvdGhlcndpc2UgZmFsc2UgbGF5b3V0IHdvdWxkIGJlCi0JCQkgKiBzZWVuLiBBcHBseWluZyBsYXlvdXQgc2hvdWQgaGFwcGVuIGJlZm9yZSBkcm9wcGluZworCQkJICogc2Vlbi4gQXBwbHlpbmcgbGF5b3V0IHNob3VsZCBoYXBwZW4gYmVmb3JlIGRyb3BwaW5nCiAJCQkgKiB0aGUgaW50ZW50IGxvY2suICovCiAJCQlsZGxtX2xvY2tfYWxsb3dfbWF0Y2gobG9jayk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCmluZGV4IGUyOTk2YzQuLjM4YzJkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJCQlicmVhazsKIAogCQlpbm9kZSA9IGxsX2luZm8yaShsbGkpOwotCQlDREVCVUcoRF9JTkZPLCAiZG9uZV93cml0dGluZyBmb3IgaW5vZGUgJWx1LyV1XG4iLAorCQlDREVCVUcoRF9JTkZPLCAiZG9uZV93cml0aW5nIGZvciBpbm9kZSAlbHUvJXVcbiIsCiAJCSAgICAgICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX2dlbmVyYXRpb24pOwogCQlsbF9kb25lX3dyaXRpbmcoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCmluZGV4IDdlZTVjMDIuLjY5YWJhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaApAQCAtMjk2LDEzICsyOTYsNiBAQAogCQkJc2l6ZV90IHNpemUsCiAJCQlfX3U2NCB2YWxpZCk7CiAKLWludCBsbF94YXR0cl9jYWNoZV91cGRhdGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCWNvbnN0IGNoYXIgKm5hbWUsCi0JCQljb25zdCBjaGFyICpuZXd2YWwsCi0JCQlzaXplX3Qgc2l6ZSwKLQkJCV9fdTY0IHZhbGlkLAotCQkJaW50IGZsYWdzKTsKLQogLyoKICAqIExvY2tpbmcgdG8gZ3VhcmFudGVlIGNvbnNpc3RlbmN5IG9mIG5vbi1hdG9taWMgdXBkYXRlcyB0byBsb25nIGxvbmcgaV9zaXplLAogICogY29uc2lzdGVuY3kgYmV0d2VlbiBmaWxlIHNpemUgYW5kIEtNUy4KQEAgLTUzMiw3ICs1MjUsNyBAQAogCWF0b21pY190CQkgIGxsX2FnbF90b3RhbDsgIC8qIEFHTCB0aHJlYWQgc3RhcnRlZCBjb3VudCAqLwogCiAJZGV2X3QJCSAgICAgbGxfc2Rldl9vcmlnOyAvKiBzYXZlIHNfZGV2IGJlZm9yZSBhc3NpZ24gZm9yCi0JCQkJCQkgKiBjbHVzdHJlZCBuZnMgKi8KKwkJCQkJCSAqIGNsdXN0ZXJlZCBuZnMgKi8KIAlzdHJ1Y3Qgcm10YWNsX2N0bF90YWJsZSAgIGxsX3JjdDsKIAlzdHJ1Y3QgZWFjbF90YWJsZQkgbGxfZXQ7CiAJX19rZXJuZWxfZnNpZF90CQkgIGxsX2ZzaWQ7CkBAIC03ODIsNyArNzc1LDcgQEAKIGludCBsbF9yZWxlYXNlX29wZW5oYW5kbGUoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqKTsKIGludCBsbF9tZF9jbG9zZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1pbnQgbGxfbWRfcmVhbF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpOworaW50IGxsX21kX3JlYWxfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgZm1vZGVfdCBmbW9kZSk7CiB2b2lkIGxsX2lvZXBvY2hfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJCSAgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqKm9jaCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIGxsX2RvbmVfd3JpdGluZ19hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKQEAgLTgyOCw3ICs4MjEsNyBAQAogCiAvKiBsbGl0ZS9kY2FjaGUuYyAqLwogCi1pbnQgbGxfZG9wc19pbml0KHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgYmxvY2ssIGludCBpbml0X3NhKTsKK2ludCBsbF9kX2luaXQoc3RydWN0IGRlbnRyeSAqZGUpOwogZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBsbF9kX29wczsKIHZvaWQgbGxfaW50ZW50X2Ryb3BfbG9jayhzdHJ1Y3QgbG9va3VwX2ludGVudCAqKTsKIHZvaWQgbGxfaW50ZW50X3JlbGVhc2Uoc3RydWN0IGxvb2t1cF9pbnRlbnQgKik7CkBAIC05MTUsMTIgKzkwOCwxMCBAQAogdm9pZCB2dnBfd3JpdGVfcGVuZGluZyAoc3RydWN0IGNjY19vYmplY3QgKmNsdWIsIHN0cnVjdCBjY2NfcGFnZSAqcGFnZSk7CiB2b2lkIHZ2cF93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgY2NjX29iamVjdCAqY2x1Yiwgc3RydWN0IGNjY19wYWdlICpwYWdlKTsKIAotLyogc3BlY2lmaWMgYWNoaXRlY3R1cmUgY2FuIGltcGxlbWVudCBvbmx5IHBhcnQgb2YgdGhpcyBsaXN0ICovCisvKiBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgY2FuIGltcGxlbWVudCBvbmx5IHBhcnQgb2YgdGhpcyBsaXN0ICovCiBlbnVtIHZ2cF9pb19zdWJ0eXBlIHsKIAkvKiogbm9ybWFsIElPICovCiAJSU9fTk9STUFMLAotCS8qKiBpbyBjYWxsZWQgZnJvbSAuc2VuZGZpbGUgKi8KLQlJT19TRU5ERklMRSwKIAkvKiogaW8gc3RhcnRlZCBmcm9tIHNwbGljZV97cmVhZHx3cml0ZX0gKi8KIAlJT19TUExJQ0UKIH07CkBAIC05MzIsMTAgKzkyMyw2IEBACiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlyZWFkX2FjdG9yX3QgICAgICBjdWlfYWN0b3I7Ci0JCQl2b2lkCSAgICAgKmN1aV90YXJnZXQ7Ci0JCX0gc2VuZGZpbGU7Ci0JCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpjdWlfcGlwZTsKIAkJCXVuc2lnbmVkIGludAkgICAgY3VpX2ZsYWdzOwogCQl9IHNwbGljZTsKQEAgLTk4MSw3ICs5NjgsNyBAQAogICogSU8gYXJndW1lbnRzIGZvciB2YXJpb3VzIFZGUyBJL08gaW50ZXJmYWNlcy4KICAqLwogc3RydWN0IHZ2cF9pb19hcmdzIHsKLQkvKiogbm9ybWFsL3NlbmRmaWxlL3NwbGljZSAqLworCS8qKiBub3JtYWwvc3BsaWNlICovCiAJZW51bSB2dnBfaW9fc3VidHlwZSB2aWFfaW9fc3VidHlwZTsKIAogCXVuaW9uIHsKQEAgLTk5MSwxMCArOTc4LDYgQEAKIAkJCXVuc2lnbmVkIGxvbmcgICAgICB2aWFfbnJzZWdzOwogCQl9IG5vcm1hbDsKIAkJc3RydWN0IHsKLQkJCXJlYWRfYWN0b3JfdCAgICAgICB2aWFfYWN0b3I7Ci0JCQl2b2lkCSAgICAgICp2aWFfdGFyZ2V0OwotCQl9IHNlbmRmaWxlOwotCQlzdHJ1Y3QgewogCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAgKnZpYV9waXBlOwogCQkJdW5zaWduZWQgaW50ICAgICAgIHZpYV9mbGFnczsKIAkJfSBzcGxpY2U7CkBAIC0xMzIwLDEyICsxMzAzLDEzIEBACiAJaWYgKGxsaS0+bGxpX29wZW5kaXJfcGlkICE9IGN1cnJlbnRfcGlkKCkpCiAJCXJldHVybjsKIAotCWlmIChzYWkgIT0gTlVMTCAmJiBsZGQgIT0gTlVMTCkKKwlMQVNTRVJUKGxkZCAhPSBOVUxMKTsKKwlpZiAoc2FpICE9IE5VTEwpCiAJCWxkZC0+bGxkX3NhX2dlbmVyYXRpb24gPSBzYWktPnNhaV9nZW5lcmF0aW9uOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotbGxfbmVlZF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeXApCitkX25lZWRfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnlwKQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAqbGxpOwogCXN0cnVjdCBsbF9kZW50cnlfZGF0YSAqbGRkOwpAQCAtMTM3MCwxNCArMTM1NCwxNCBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBsbF9uZWVkX3N0YXRhaGVhZChkaXIsICpkZW50cnlwKTsKKwlyZXQgPSBkX25lZWRfc3RhdGFoZWFkKGRpciwgKmRlbnRyeXApOwogCWlmIChyZXQgPD0gMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiBkb19zdGF0YWhlYWRfZW50ZXIoZGlyLCBkZW50cnlwLCBvbmx5X3VucGx1Zyk7CiB9CiAKLS8qIGxsaXRlIGlvY3RsIHJlZ2lzdGVyIHN1cHBvcnQgcm91bnRpbmUgKi8KKy8qIGxsaXRlIGlvY3RsIHJlZ2lzdGVyIHN1cHBvcnQgcm91dGluZSAqLwogZW51bSBsbGlvY19pdGVyIHsKIAlMTElPQ19DT05UID0gMCwKIAlMTElPQ19TVE9QCkBAIC0xMzg5LDcgKzEzNzMsNyBAQAogICogUnVsZXMgdG8gd3JpdGUgYSBjYWxsYmFjayBmdW5jdGlvbjoKICAqCiAgKiBQYXJhbWV0ZXJzOgotICogIEBtYWdpYzogRHluYW1pYyBpb2N0bCBjYWxsIHJvdXRpbmUgd2lsbCBmZWVkIHRoaXMgdmF1bGUgd2l0aCB0aGUgcG9pbnRlcgorICogIEBtYWdpYzogRHluYW1pYyBpb2N0bCBjYWxsIHJvdXRpbmUgd2lsbCBmZWVkIHRoaXMgdmFsdWUgd2l0aCB0aGUgcG9pbnRlcgogICogICAgICByZXR1cm5lZCB0byBsbF9pb2NvbnRyb2xfcmVnaXN0ZXIuICBDYWxsYmFjayBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0aGlzCiAgKiAgICAgIGRhdGEgdG8gY2hlY2sgdGhlIHBvdGVudGlhbCBjb2xsYXNpb24gb2YgaW9jdGwgY21kLiBJZiBjb2xsYXNpb24gaXMKICAqICAgICAgZm91bmQsIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gTExJT0NfQ09OVC4KQEAgLTE0MTQsNyArMTM5OCw3IEBACiAgKiBAY2I6IGNhbGxiYWNrIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCBpZiBhbiBpb2N0bCBjb21tYW5kIGlzIGZvdW5kIHRvCiAgKiAgICAgIGJlbG9uZyB0byB0aGUgY29tbWFuZCBsaXN0IEBjbWQuCiAgKgotICogUmV0dXJuIHZhdWxlOgorICogUmV0dXJuIHZhbHVlOgogICogICAgICBBIG1hZ2ljIHBvaW50ZXIgd2lsbCBiZSByZXR1cm5lZCBpZiBzdWNjZXNzOwogICogICAgICBvdGhlcndpc2UsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KICAqICovCkBAIC0xNTI0LDcgKzE1MDgsNyBAQAogCQkgKiBzZXBhcmF0ZSBsb2NrcyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcywgTWFzdGVyIE1EVCwKIAkJICogd2hlcmUgdGhlIG5hbWUgZW50cnkgaXMsIHdpbGwgZ3JhbnQgTE9PS1VQIGxvY2ssCiAJCSAqIHJlbW90ZSBNRFQsIHdoZXJlIHRoZSBvYmplY3QgaXMsIHdpbGwgZ3JhbnQKLQkJICogVVBEQVRFfFBFUk0gbG9jay4gVGhlIGlub2RlIHdpbGwgYmUgYXR0Y2hlZCB0byBib3RoCisJCSAqIFVQREFURXxQRVJNIGxvY2suIFRoZSBpbm9kZSB3aWxsIGJlIGF0dGFjaGVkIHRvIGJvdGgKIAkJICogTE9PS1VQIGFuZCBQRVJNIGxvY2tzLCBzbyByZXZva2luZyBlaXRoZXIgbG9ja3Mgd2lsbAogCQkgKiBjYXNlIHRoZSBkY2FjaGUgYmVpbmcgY2xlYXJlZCAqLwogCQlpZiAoaXQtPmQubHVzdHJlLml0X3JlbW90ZV9sb2NrX21vZGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKaW5kZXggNmNmZGI5ZS4uMjYwMDNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKQEAgLTE1NSwxMSArMTU1LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgbGxfZF9yb290X29wcyA9IHsKLQkuZF9jb21wYXJlID0gbGxfZGNvbXBhcmUsCi0JLmRfcmV2YWxpZGF0ZSA9IGxsX3JldmFsaWRhdGVfbmQsCi19OwotCiBzdGF0aWMgaW50IGNsaWVudF9jb21tb25fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICptZCwgY2hhciAqZHQsCiAJCQkJICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewpAQCAtMjExLDcgKzIwNiwxMCBAQAogCQkJCSAgT0JEX0NPTk5FQ1RfRUlOUFJPR1JFU1MgfAogCQkJCSAgT0JEX0NPTk5FQ1RfSk9CU1RBVFMgfCBPQkRfQ09OTkVDVF9MVkJfVFlQRSB8CiAJCQkJICBPQkRfQ09OTkVDVF9MQVlPVVRMT0NLIHwKLQkJCQkgIE9CRF9DT05ORUNUX1BJTkdMRVNTIHwgT0JEX0NPTk5FQ1RfTUFYX0VBU0laRTsKKwkJCQkgIE9CRF9DT05ORUNUX1BJTkdMRVNTIHwKKwkJCQkgIE9CRF9DT05ORUNUX01BWF9FQVNJWkUgfAorCQkJCSAgT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRCB8CisJCQkJICBPQkRfQ09OTkVDVF9ESVNQX1NUUklQRTsKIAogCWlmIChzYmktPmxsX2ZsYWdzICYgTExfU0JJX1NPTV9QUkVWSUVXKQogCQlkYXRhLT5vY2RfY29ubmVjdF9mbGFncyB8PSBPQkRfQ09OTkVDVF9TT007CkBAIC0yODEsNyArMjc5LDcgQEAKIAogCS8qIEZvciBtb3VudCwgd2Ugb25seSBuZWVkIGZzIGluZm8gZnJvbSBNRFQwLCBhbmQgYWxzbyBpbiBETkUsIGl0CiAJICogY2FuIG1ha2Ugc3VyZSB0aGUgY2xpZW50IGNhbiBiZSBtb3VudGVkIGFzIGxvbmcgYXMgTURUMCBpcwotCSAqIGF2YWlibGUgKi8KKwkgKiBhdmFpbGFibGUgKi8KIAllcnIgPSBvYmRfc3RhdGZzKE5VTEwsIHNiaS0+bGxfbWRfZXhwLCBvc2ZzLAogCQkJY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQlPQkRfU1RBVEZTX0ZPUl9NRFQwKTsKQEAgLTU3OSwxMCArNTc3LDYgQEAKIAkJR09UTyhvdXRfcm9vdCwgZXJyID0gLUVOT01FTSk7CiAJfQogCi0JLyoga2VybmVsID49IDIuNi4zOCBzdG9yZSBkZW50cnkgb3BlcmF0aW9ucyBpbiBzYi0+c19kX29wLiAqLwotCWRfc2V0X2Rfb3Aoc2ItPnNfcm9vdCwgJmxsX2Rfcm9vdF9vcHMpOwotCXNiLT5zX2Rfb3AgPSAmbGxfZF9vcHM7Ci0KIAlzYmktPmxsX3NkZXZfb3JpZyA9IHNiLT5zX2RldjsKIAogCS8qIFdlIHNldCBzYi0+c19kZXYgZXF1YWwgb24gYWxsIGx1c3RyZSBjbGllbnRzIGluIG9yZGVyIHRvIHN1cHBvcnQKQEAgLTcyMyw3ICs3MTcsNyBAQAogCQlyZXR1cm47CiAKIAlzYmkgPSBsbF9zMnNiaShzYik7Ci0JLyogd2UgbmVlZCByZXN0b3JlIHNfZGV2IGZyb20gY2hhbmdlZCBmb3IgY2x1c3RyZWQgTkZTIGJlZm9yZSBwdXRfc3VwZXIKKwkvKiB3ZSBuZWVkIHRvIHJlc3RvcmUgc19kZXYgZnJvbSBjaGFuZ2VkIGZvciBjbHVzdGVyZWQgTkZTIGJlZm9yZSBwdXRfc3VwZXIKIAkgKiBiZWNhdXNlIG5ldyBrZXJuZWxzIGhhdmUgY2FjaGVkIHNfZGV2IGFuZCBjaGFuZ2Ugc2ItPnNfZGV2IGluCiAJICogcHV0X3N1cGVyIG5vdCBhZmZlY3RlZCByZWFsIHJlbW92aW5nIGRldmljZXMgKi8KIAlpZiAoc2JpKSB7CkBAIC03NDAsNyArNzM0LDggQEAKIAlDREVCVUcoRF9TVVBFUiwgIm9wdGlvbjogJXMsIGRhdGEgJXNcbiIsIG9wdCwgZGF0YSk7CiAJaWYgKHN0cm5jbXAob3B0LCBkYXRhLCBzdHJsZW4ob3B0KSkpCiAJCXJldHVybiBOVUxMOwotCWlmICgodmFsdWUgPSBzdHJjaHIoZGF0YSwgJz0nKSkgPT0gTlVMTCkKKwl2YWx1ZSA9IHN0cmNocihkYXRhLCAnPScpOworCWlmICh2YWx1ZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCXZhbHVlKys7CkBAIC0xMDEzLDYgKzEwMDgsOCBAQAogCQlHT1RPKG91dF9mcmVlLCBlcnIpOwogCiAJc2ItPnNfYmRpID0gJmxzaS0+bHNpX2JkaTsKKwkvKiBrZXJuZWwgPj0gMi42LjM4IHN0b3JlIGRlbnRyeSBvcGVyYXRpb25zIGluIHNiLT5zX2Rfb3AuICovCisJc2ItPnNfZF9vcCA9ICZsbF9kX29wczsKIAogCS8qIEdlbmVyYXRlIGEgc3RyaW5nIHVuaXF1ZSB0byB0aGlzIHN1cGVyLCBpbiBjYXNlIHNvbWUgam9rZXIgdHJpZXMKIAkgICB0byBtb3VudCB0aGUgc2FtZSBmcyBhdCB0d28gbW91bnQgcG9pbnRzLgpAQCAtMTA2Nyw3ICsxMDY0LDcgQEAKIAogdm9pZCBsbF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UgY2ZnOworCXN0cnVjdCBjb25maWdfbGxvZ19pbnN0YW5jZSBjZmcsIHBhcmFtc19jZmc7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZDsKIAlzdHJ1Y3QgbHVzdHJlX3NiX2luZm8gKmxzaSA9IHMybHNpKHNiKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwpAQCAtMTA4MSw2ICsxMDc4LDkgQEAKIAljZmcuY2ZnX2luc3RhbmNlID0gc2I7CiAJbHVzdHJlX2VuZF9sb2coc2IsIHByb2ZpbGVubSwgJmNmZyk7CiAKKwlwYXJhbXNfY2ZnLmNmZ19pbnN0YW5jZSA9IHNiOworCWx1c3RyZV9lbmRfbG9nKHNiLCBQQVJBTVNfRklMRU5BTUUsICZwYXJhbXNfY2ZnKTsKKwogCWlmIChzYmktPmxsX21kX2V4cCkgewogCQlvYmQgPSBjbGFzc19leHAyb2JkKHNiaS0+bGxfbWRfZXhwKTsKIAkJaWYgKG9iZCkKQEAgLTE0MDUsNyArMTQwNSw3IEBACiAJLyogUE9TSVg6IGNoZWNrIGJlZm9yZSBBVFRSXypUSU1FX1NFVCBzZXQgKGZyb20gaW5vZGVfY2hhbmdlX29rKSAqLwogCWlmIChhdHRyLT5pYV92YWxpZCAmIFRJTUVTX1NFVF9GTEFHUykgewogCQlpZiAoKCF1aWRfZXEoY3VycmVudF9mc3VpZCgpLCBpbm9kZS0+aV91aWQpKSAmJgotCQkgICAgIWNmc19jYXBhYmxlKENGU19DQVBfRk9XTkVSKSkKKwkJICAgICFjYXBhYmxlKENGU19DQVBfRk9XTkVSKSkKIAkJCXJldHVybiAtRVBFUk07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKaW5kZXggY2FlZDY0Mi4uOTBiMmMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgKiBMdXN0cmUgaW1wbGVtZW50YXRpb24gb2YgYSB2bV9vcGVyYXRpb25zX3N0cnVjdDo6ZmF1bHQoKSBtZXRob2QsIGNhbGxlZCBieQogICogVk0gdG8gc2VydmVyIHBhZ2UgZmF1bHQgKGJvdGggaW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlKS4KICAqCi0gKiBccGFyYW0gdm1hIC0gaXMgdmlydGl1YWwgYXJlYSBzdHJ1Y3QgcmVsYXRlZCB0byBwYWdlIGZhdWx0CisgKiBccGFyYW0gdm1hIC0gaXMgdmlydHVhbCBhcmVhIHN0cnVjdCByZWxhdGVkIHRvIHBhZ2UgZmF1bHQKICAqIFxwYXJhbSB2bWYgLSBzdHJ1Y3R1cmUgd2hpY2ggZGVzY3JpYmUgdHlwZSBhbmQgYWRkcmVzcyB3aGVyZSBoaXQgZmF1bHQKICAqCiAgKiBccmV0dXJuIGFsbG9jYXRlZCBhbmQgZmlsbGVkIF9sb2NrZWRfIHBhZ2UgZm9yIGFkZHJlc3MKQEAgLTM3MCw3ICszNzAsNyBAQAogCQkJZ290byByZXN0YXJ0OwogCQl9CiAKLQkJcmVzdWx0IHw9IFZNX0ZBVUxUX0xPQ0tFRDsKKwkJcmVzdWx0ID0gVk1fRkFVTFRfTE9DS0VEOwogCX0KIAljZnNfcmVzdG9yZV9zaWdzKHNldCk7CiAJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMKaW5kZXggMTc2N2M3NC4uMzU4MDA2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMKQEAgLTE2NywxMCArMTY3LDEwIEBACiAJfQogCiAJcmVzdWx0ID0gZF9vYnRhaW5fYWxpYXMoaW5vZGUpOwotCWlmIChJU19FUlIocmVzdWx0KSkKKwlpZiAoSVNfRVJSKHJlc3VsdCkpIHsKKwkJaXB1dChpbm9kZSk7CiAJCXJldHVybiByZXN1bHQ7Ci0KLQlsbF9kb3BzX2luaXQocmVzdWx0LCAxLCAwKTsKKwl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMKaW5kZXggMDcxODkwNS4uZjc4ZWRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAkgKiAgICB0byBzdG9yZSBwYXJpdHk7CiAJICogMi4gUmVzZXJ2ZSB0aGUgIyBvZiAocGFnZV9jb3VudCAqIGRlcHRoKSBjbF9wYWdlcyBmcm9tIHRoZSByZXNlcnZlZAogCSAqICAgIHBvb2wuIEFmdGVyd2FyZHMsIHRoZSBjbGlvIHdvdWxkIGFsbG9jYXRlIHRoZSBwYWdlcyBmcm9tIHJlc2VydmVkCi0JICogICAgcG9vbCwgdGhpcyBndWFyYW50ZWVzIHdlIG5lZWVkbid0IGFsbG9jYXRlIHRoZSBjbF9wYWdlcyBmcm9tCisJICogICAgcG9vbCwgdGhpcyBndWFyYW50ZWVzIHdlIG5lZWRuJ3QgYWxsb2NhdGUgdGhlIGNsX3BhZ2VzIGZyb20KIAkgKiAgICBnZW5lcmljIGNsX3BhZ2Ugc2xhYiBjYWNoZS4KIAkgKiAgICBPZiBjb3Vyc2UsIGlmIHRoZXJlIGlzIE5PVCBlbm91Z2ggcGFnZXMgaW4gdGhlIHBvb2wsIHdlIG1pZ2h0CiAJICogICAgYmUgYXNrZWQgdG8gd3JpdGUgbGVzcyBwYWdlcyBvbmNlLCB0aGlzIHB1cmVseSBkZXBlbmRzIG9uCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJYmlvID0gJigqYmlvKS0+YmlfbmV4dDsKIAl9CiAJaWYgKCpiaW8pIHsKLQkJLyogU29tZSBvZiBiaW9zIGNhbid0IGJlIG1lcmdhYmxlLiAqLworCQkvKiBTb21lIG9mIGJpb3MgY2FuJ3QgYmUgbWVyZ2VhYmxlLiAqLwogCQlsby0+bG9fYmlvID0gKmJpbzsKIAkJKmJpbyA9IE5VTEw7CiAJfSBlbHNlIHsKQEAgLTY1OCw3ICs2NTgsNyBAQAogICogbGxfaW9jb250cm9sX2NhbGwuCiAgKgogICogVGhpcyBpcyBhIGxsaXRlIHJlZ3VsYXIgZmlsZSBpb2N0bCBmdW5jdGlvbi4gSXQgdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0gKiBvZiBhdHRhY2hpbmcgb3IgZGV0YWNoaW5nIGEgZmlsZSBieSBhIGxsb29wJ3MgZGV2aWNlIG51bW5lci4KKyAqIG9mIGF0dGFjaGluZyBvciBkZXRhY2hpbmcgYSBmaWxlIGJ5IGEgbGxvb3AncyBkZXZpY2UgbnVtYmVyLgogICovCiBzdGF0aWMgZW51bSBsbGlvY19pdGVyIGxsb29wX2lvY3RsKHN0cnVjdCBpbm9kZSAqdW51c2VkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCmluZGV4IGZjOGQyNjQuLjI1YTZlYTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKQEAgLTE5NSwxMDEgKzE5NSwxMDcgQEAKIGludCBsbF9tZF9ibG9ja2luZ19hc3Qoc3RydWN0IGxkbG1fbG9jayAqbG9jaywgc3RydWN0IGxkbG1fbG9ja19kZXNjICpkZXNjLAogCQkgICAgICAgdm9pZCAqZGF0YSwgaW50IGZsYWcpCiB7Ci0JaW50IHJjOwogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toOworCWludCByYzsKIAogCXN3aXRjaCAoZmxhZykgewogCWNhc2UgTERMTV9DQl9CTE9DS0lORzoKIAkJbGRsbV9sb2NrMmhhbmRsZShsb2NrLCAmbG9ja2gpOwogCQlyYyA9IGxkbG1fY2xpX2NhbmNlbCgmbG9ja2gsIExDRl9BU1lOQyk7CiAJCWlmIChyYyA8IDApIHsKLQkJCUNERUJVRyhEX0lOT0RFLCAibGRsbV9jbGlfY2FuY2VsOiAlZFxuIiwgcmMpOworCQkJQ0RFQlVHKERfSU5PREUsICJsZGxtX2NsaV9jYW5jZWw6IHJjID0gJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQogCQlicmVhazsKIAljYXNlIExETE1fQ0JfQ0FOQ0VMSU5HOiB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBsbF9pbm9kZV9mcm9tX3Jlc291cmNlX2xvY2sobG9jayk7Ci0JCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGk7CiAJCV9fdTY0IGJpdHMgPSBsb2NrLT5sX3BvbGljeV9kYXRhLmxfaW5vZGViaXRzLmJpdHM7Ci0JCXN0cnVjdCBsdV9maWQgKmZpZDsKLQkJbGRsbV9tb2RlX3QgbW9kZSA9IGxvY2stPmxfcmVxX21vZGU7CiAKIAkJLyogSW5vZGUgaXMgc2V0IHRvIGxvY2stPmxfcmVzb3VyY2UtPmxyX2x2Yl9pbm9kZQogCQkgKiBmb3IgbWRjIC0gYnVnIDI0NTU1ICovCiAJCUxBU1NFUlQobG9jay0+bF9hc3RfZGF0YSA9PSBOVUxMKTsKIAotCQkvKiBJbnZhbGlkYXRlIGFsbCBkZW50cmllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZSAqLwogCQlpZiAoaW5vZGUgPT0gTlVMTCkKIAkJCWJyZWFrOwogCisJCS8qIEludmFsaWRhdGUgYWxsIGRlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlICovCiAJCUxBU1NFUlQobG9jay0+bF9mbGFncyAmIExETE1fRkxfQ0FOQ0VMSU5HKTsKIAotCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfWEFUVFIpCisJCWlmICghZmlkX3Jlc19uYW1lX2VxKGxsX2lub2RlMmZpZChpbm9kZSksCisJCQkJICAgICAmbG9jay0+bF9yZXNvdXJjZS0+bHJfbmFtZSkpIHsKKwkJCUxETE1fRVJST1IobG9jaywgImRhdGEgbWlzbWF0Y2ggd2l0aCBvYmplY3QgIkRGSUQiKCVwKSIsCisJCQkJICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUpOworCQkJTEJVRygpOworCQl9CisKKwkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX1hBVFRSKSB7CiAJCQlsbF94YXR0cl9jYWNoZV9kZXN0cm95KGlub2RlKTsKKwkJCWJpdHMgJj0gfk1EU19JTk9ERUxPQ0tfWEFUVFI7CisJCX0KIAogCQkvKiBGb3IgT1BFTiBsb2NrcyB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jayBtb2RlcwogCQkgKiBMQ0tfQ1IsIExDS19DVywgTENLX1BSIC0gYnVnIDIyODkxICovCisJCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19PUEVOKQorCQkJbGxfaGF2ZV9tZF9sb2NrKGlub2RlLCAmYml0cywgbG9jay0+bF9yZXFfbW9kZSk7CisKKwkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX09QRU4pIHsKKwkJCWZtb2RlX3QgZm1vZGU7CisKKwkJCXN3aXRjaCAobG9jay0+bF9yZXFfbW9kZSkgeworCQkJY2FzZSBMQ0tfQ1c6CisJCQkJZm1vZGUgPSBGTU9ERV9XUklURTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTENLX1BSOgorCQkJCWZtb2RlID0gRk1PREVfRVhFQzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTENLX0NSOgorCQkJCWZtb2RlID0gRk1PREVfUkVBRDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJTERMTV9FUlJPUihsb2NrLCAiYmFkIGxvY2sgbW9kZSBmb3IgT1BFTiBsb2NrIik7CisJCQkJTEJVRygpOworCQkJfQorCisJCQlsbF9tZF9yZWFsX2Nsb3NlKGlub2RlLCBmbW9kZSk7CisJCX0KKwogCQlpZiAoYml0cyAmIChNRFNfSU5PREVMT0NLX0xPT0tVUCB8IE1EU19JTk9ERUxPQ0tfVVBEQVRFIHwKIAkJCSAgICBNRFNfSU5PREVMT0NLX0xBWU9VVCB8IE1EU19JTk9ERUxPQ0tfUEVSTSkpCiAJCQlsbF9oYXZlX21kX2xvY2soaW5vZGUsICZiaXRzLCBMQ0tfTUlOTU9ERSk7CiAKLQkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX09QRU4pCi0JCQlsbF9oYXZlX21kX2xvY2soaW5vZGUsICZiaXRzLCBtb2RlKTsKLQotCQlmaWQgPSBsbF9pbm9kZTJmaWQoaW5vZGUpOwotCQlpZiAoIWZpZF9yZXNfbmFtZV9lcShmaWQsICZsb2NrLT5sX3Jlc291cmNlLT5scl9uYW1lKSkKLQkJCUxETE1fRVJST1IobG9jaywgImRhdGEgbWlzbWF0Y2ggd2l0aCBvYmplY3QgIgotCQkJCSAgIERGSUQiICglcCkiLCBQRklEKGZpZCksIGlub2RlKTsKLQotCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfT1BFTikgewotCQkJaW50IGZsYWdzID0gMDsKLQkJCXN3aXRjaCAobG9jay0+bF9yZXFfbW9kZSkgewotCQkJY2FzZSBMQ0tfQ1c6Ci0JCQkJZmxhZ3MgPSBGTU9ERV9XUklURTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTENLX1BSOgotCQkJCWZsYWdzID0gRk1PREVfRVhFQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTENLX0NSOgotCQkJCWZsYWdzID0gRk1PREVfUkVBRDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQ0VSUk9SKCJVbmV4cGVjdGVkIGxvY2sgbW9kZSBmb3IgT1BFTiBsb2NrICIKLQkJCQkgICAgICAgIiVkLCBpbm9kZSAlbGRcbiIsIGxvY2stPmxfcmVxX21vZGUsCi0JCQkJICAgICAgIGlub2RlLT5pX2lubyk7Ci0JCQl9Ci0JCQlsbF9tZF9yZWFsX2Nsb3NlKGlub2RlLCBmbGFncyk7Ci0JCX0KLQotCQlsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfTEFZT1VUKSB7Ci0JCQlzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgY29uZiA9IHsgeyAwIH0gfTsKKwkJCXN0cnVjdCBjbF9vYmplY3RfY29uZiBjb25mID0geworCQkJCS5jb2Nfb3BjID0gT0JKRUNUX0NPTkZfSU5WQUxJREFURSwKKwkJCQkuY29jX2lub2RlID0gaW5vZGUsCisJCQl9OwogCi0JCQljb25mLmNvY19vcGMgPSBPQkpFQ1RfQ09ORl9JTlZBTElEQVRFOwotCQkJY29uZi5jb2NfaW5vZGUgPSBpbm9kZTsKIAkJCXJjID0gbGxfbGF5b3V0X2NvbmYoaW5vZGUsICZjb25mKTsKLQkJCWlmIChyYykKLQkJCQlDREVCVUcoRF9JTk9ERSwgImludmFsaWRpbmcgbGF5b3V0ICVkLlxuIiwgcmMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlDREVCVUcoRF9JTk9ERSwgImNhbm5vdCBpbnZhbGlkYXRlIGxheW91dCBvZiAiCisJCQkJICAgICAgIERGSUQiOiByYyA9ICVkXG4iLAorCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCByYyk7CiAJCX0KIAogCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfVVBEQVRFKSB7CisJCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKwogCQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKIAkJCWxsaS0+bGxpX2ZsYWdzICY9IH5MTElGX01EU19TSVpFX0xPQ0s7CiAJCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7CiAJCX0KIAotCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgotCQkgICAgIChiaXRzICYgTURTX0lOT0RFTE9DS19VUERBVEUpKSB7CisJCWlmICgoYml0cyAmIE1EU19JTk9ERUxPQ0tfVVBEQVRFKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQlDREVCVUcoRF9JTk9ERSwgImludmFsaWRhdGluZyBpbm9kZSAlbHVcbiIsCiAJCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKIAkJCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwogCQkJbGxfaW52YWxpZGF0ZV9uZWdhdGl2ZV9jaGlsZHJlbihpbm9kZSk7CiAJCX0KIAotCQlpZiAoaW5vZGUtPmlfc2ItPnNfcm9vdCAmJgotCQkgICAgaW5vZGUgIT0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSAmJgotCQkgICAgKGJpdHMgJiAoTURTX0lOT0RFTE9DS19MT09LVVAgfCBNRFNfSU5PREVMT0NLX1BFUk0pKSkKKwkJaWYgKChiaXRzICYgKE1EU19JTk9ERUxPQ0tfTE9PS1VQIHwgTURTX0lOT0RFTE9DS19QRVJNKSkgJiYKKwkJICAgIGlub2RlLT5pX3NiLT5zX3Jvb3QgIT0gTlVMTCAmJgorCQkgICAgaW5vZGUgIT0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSkKIAkJCWxsX2ludmFsaWRhdGVfYWxpYXNlcyhpbm9kZSk7CisKIAkJaXB1dChpbm9kZSk7CiAJCWJyZWFrOwogCX0KQEAgLTQwMCwxMSArNDA2LDE2IEBACiBzdHJ1Y3QgZGVudHJ5ICpsbF9zcGxpY2VfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGUpCiB7CiAJc3RydWN0IGRlbnRyeSAqbmV3OworCWludCByYzsKIAogCWlmIChpbm9kZSkgewogCQluZXcgPSBsbF9maW5kX2FsaWFzKGlub2RlLCBkZSk7CiAJCWlmIChuZXcpIHsKLQkJCWxsX2RvcHNfaW5pdChuZXcsIDEsIDEpOworCQkJcmMgPSBsbF9kX2luaXQobmV3KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlkcHV0KG5ldyk7CisJCQkJcmV0dXJuIEVSUl9QVFIocmMpOworCQkJfQogCQkJZF9tb3ZlKG5ldywgZGUpOwogCQkJaXB1dChpbm9kZSk7CiAJCQlDREVCVUcoRF9ERU5UUlksCkBAIC00MTMsOCArNDI0LDkgQEAKIAkJCXJldHVybiBuZXc7CiAJCX0KIAl9Ci0JbGxfZG9wc19pbml0KGRlLCAxLCAxKTsKLQlfX2RfbHVzdHJlX2ludmFsaWRhdGUoZGUpOworCXJjID0gbGxfZF9pbml0KGRlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyYyk7CiAJZF9hZGQoZGUsIGlub2RlKTsKIAlDREVCVUcoRF9ERU5UUlksICJBZGQgZGVudHJ5ICVwIGlub2RlICVwIHJlZmMgJWQgZmxhZ3MgJSN4XG4iLAogCSAgICAgICBkZSwgZGUtPmRfaW5vZGUsIGRfY291bnQoZGUpLCBkZS0+ZF9mbGFncyk7CkBAIC00NTMsMTAgKzQ2NSwyMiBAQAogCX0KIAogCS8qIE9ubHkgaGFzaCAqZGUgaWYgaXQgaXMgdW5oYXNoZWQgKG5ldyBkZW50cnkpLgotCSAqIEF0b2ltY19vcGVuIG1heSBwYXNzaW4gaGFzaGVkIGRlbnRyaWVzIGZvciBvcGVuLgorCSAqIEF0b2ltY19vcGVuIG1heSBwYXNzaW5nIGhhc2hlZCBkZW50cmllcyBmb3Igb3Blbi4KIAkgKi8KLQlpZiAoZF91bmhhc2hlZCgqZGUpKQotCQkqZGUgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsICpkZSk7CisJaWYgKGRfdW5oYXNoZWQoKmRlKSkgeworCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKKworCQlhbGlhcyA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwgKmRlKTsKKwkJaWYgKElTX0VSUihhbGlhcykpCisJCQlyZXR1cm4gUFRSX0VSUihhbGlhcyk7CisJCSpkZSA9IGFsaWFzOworCX0gZWxzZSBpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpICAmJgorCQkgICAhaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfT1BFTl9DUkVBVEUpKSB7CisJCS8qIFdpdGggRElTUF9PUEVOX0NSRUFURSBkZW50cnkgd2lsbAorCQkgICBpbnN0YW50aWF0ZWQgaW4gbGxfY3JlYXRlX2l0LiAqLworCQlMQVNTRVJUKCgqZGUpLT5kX2lub2RlID09IE5VTEwpOworCQlkX2luc3RhbnRpYXRlKCpkZSwgaW5vZGUpOworCX0KIAogCWlmICghaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRykpIHsKIAkJLyogd2UgaGF2ZSBsb29rdXAgbG9vayAtIHVuaGlkZSBkZW50cnkgKi8KQEAgLTUwNSwxNiArNTI5LDYgQEAKIAogCWxsX2Zyb2JfaW50ZW50KCZpdCwgJmxvb2t1cF9pdCk7CiAKLQkvKiBBcyBkb19sb29rdXAgaXMgY2FsbGVkIGJlZm9yZSBmb2xsb3dfbW91bnQsIHJvb3QgZGVudHJ5IG1heSBiZSBsZWZ0Ci0JICogbm90IHZhbGlkLCByZXZhbGlkYXRlIGl0IGhlcmUuICovCi0JaWYgKHBhcmVudC0+aV9zYi0+c19yb290ICYmIChwYXJlbnQtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSA9PSBwYXJlbnQpICYmCi0JICAgIChpdC0+aXRfb3AgJiAoSVRfT1BFTiB8IElUX0NSRUFUKSkpIHsKLQkJcmMgPSBsbF9pbm9kZV9yZXZhbGlkYXRlX2l0KHBhcmVudC0+aV9zYi0+c19yb290LCBpdCwKLQkJCQkJICAgIE1EU19JTk9ERUxPQ0tfTE9PS1VQKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIEVSUl9QVFIocmMpOwotCX0KLQogCWlmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUikgewogCQlyYyA9IGxsX3N0YXRhaGVhZF9lbnRlcihwYXJlbnQsICZkZW50cnksIDApOwogCQlpZiAocmMgPT0gMSkgewpAQCAtNTg0LDEyICs1OTgsOCBAQAogCSAgICAgICBwYXJlbnQtPmlfZ2VuZXJhdGlvbiwgcGFyZW50LCBmbGFncyk7CiAKIAkvKiBPcHRpbWl6ZSBhd2F5IChDUkVBVEUgJiYgIU9QRU4pLiBMZXQgLmNyZWF0ZSBoYW5kbGUgdGhlIHJhY2UuICovCi0JaWYgKChmbGFncyAmIExPT0tVUF9DUkVBVEUgKSAmJiAhKGZsYWdzICYgTE9PS1VQX09QRU4pKSB7Ci0JCWxsX2RvcHNfaW5pdChkZW50cnksIDEsIDEpOwotCQlfX2RfbHVzdHJlX2ludmFsaWRhdGUoZGVudHJ5KTsKLQkJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwlpZiAoKGZsYWdzICYgTE9PS1VQX0NSRUFURSkgJiYgIShmbGFncyAmIExPT0tVUF9PUEVOKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJaWYgKGZsYWdzICYgKExPT0tVUF9QQVJFTlR8TE9PS1VQX09QRU58TE9PS1VQX0NSRUFURSkpCiAJCWl0cCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwppbmRleCBlOWJhMzhhLi40MTZmN2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQl9CiAKIAkJLyoKLQkJICogTG9vcC1iYWNrIGRyaXZlciBjYWxscyAtPnByZXBhcmVfd3JpdGUoKSBhbmQgLT5zZW5kZmlsZSgpCisJCSAqIExvb3AtYmFjayBkcml2ZXIgY2FsbHMgLT5wcmVwYXJlX3dyaXRlKCkuCiAJCSAqIG1ldGhvZHMgZGlyZWN0bHksIGJ5cGFzc2luZyBmaWxlIHN5c3RlbSAtPndyaXRlKCkgb3BlcmF0aW9uLAogCQkgKiBzbyBjbF9pbyBoYXMgdG8gYmUgY3JlYXRlZCBoZXJlLgogCQkgKi8KQEAgLTU1OCwxMCArNTU4LDEwIEBACiAgKiBzdHJpcGVkIG92ZXIsIHJhdGhlciB0aGFuIGhhdmluZyBhIGNvbnN0YW50IHZhbHVlIGZvciBhbGwgZmlsZXMgaGVyZS4gKi8KIAogLyogUkFTX0lOQ1JFQVNFX1NURVAgc2hvdWxkIGJlICgxVUwgPDwgKGlub2RlLT5pX2Jsa2JpdHMgLSBQQUdFX0NBQ0hFX1NISUZUKSkuCi0gKiBUZW1wcmFyaWx5IHNldCBSQVNfSU5DUkVBU0VfU1RFUCB0byAxTUIuIEFmdGVyIDRNQiBSUEMgaXMgZW5hYmxlZAorICogVGVtcG9yYXJpbHkgc2V0IFJBU19JTkNSRUFTRV9TVEVQIHRvIDFNQi4gQWZ0ZXIgNE1CIFJQQyBpcyBlbmFibGVkCiAgKiBieSBkZWZhdWx0LCB0aGlzIHNob3VsZCBiZSBhZGp1c3RlZCBjb3JyZXNwb25kaW5nIHdpdGggbWF4X3JlYWRfYWhlYWRfbWIKICAqIGFuZCBtYXhfcmVhZF9haGVhZF9wZXJfZmlsZV9tYiBvdGhlcndpc2UgdGhlIHJlYWRhaGVhZCBidWRnZXQgY2FuIGJlIHVzZWQKLSAqIHVwIHF1aWNrbHkgd2hpY2ggd2lsbCBhZmZlY3QgcmVhZCBwZXJmb3JtYW5jZSBzaWdpbmlmaWNhbnRseS4gU2VlIExVLTI4MTYgKi8KKyAqIHVwIHF1aWNrbHkgd2hpY2ggd2lsbCBhZmZlY3QgcmVhZCBwZXJmb3JtYW5jZSBzaWduaWZpY2FudGx5LiBTZWUgTFUtMjgxNiAqLwogI2RlZmluZSBSQVNfSU5DUkVBU0VfU1RFUChpbm9kZSkgKE9ORV9NQl9CUldfU0laRSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCiBzdGF0aWMgaW5saW5lIGludCBzdHJpZGVfaW9fbW9kZShzdHJ1Y3QgbGxfcmVhZGFoZWFkX3N0YXRlICpyYXMpCkBAIC01NzAsNyArNTcwLDcgQEAKIH0KIC8qIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGhvdyBtdWNoIHBhZ2VzIHdpbGwgYmUgcmVhZCBpbgogICogW29mZiwgb2ZmICsgbGVuZ3RoXSwgaW4gc3VjaCBzdHJpZGUgSU8gYXJlYSwKLSAqIHN0cmlkZV9vZmZzZXQgPSBzdF9vZmYsIHN0cmlkZV9sZW5naCA9IHN0X2xlbiwKKyAqIHN0cmlkZV9vZmZzZXQgPSBzdF9vZmYsIHN0cmlkZV9sZW5ndGggPSBzdF9sZW4sCiAgKiBzdHJpZGVfcGFnZXMgPSBzdF9wZ3MKICAqCiAgKiAgIHwtLS0tLS0tLS0tLS0tLS0tLS18KioqKip8LS0tLS0tLS0tLS0tLS0tLS0tfCoqKioqfC0tLS0tLS0tLS0tLXwqKioqKnwuLi4uCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCXJhc19zZXRfc3RhcnQoaW5vZGUsIHJhcywgaW5kZXgpOwogCiAJaWYgKHN0cmlkZV9pb19tb2RlKHJhcykpCi0JCS8qIFNpbmNlIHN0cmlkZSByZWFkYWhlYWQgaXMgc2VudGl2aXRlIHRvIHRoZSBvZmZzZXQKKwkJLyogU2luY2Ugc3RyaWRlIHJlYWRhaGVhZCBpcyBzZW5zaXRpdmUgdG8gdGhlIG9mZnNldAogCQkgKiBvZiByZWFkLWFoZWFkLCBzbyB3ZSB1c2Ugb3JpZ2luYWwgb2Zmc2V0IGhlcmUsCiAJCSAqIGluc3RlYWQgb2YgcmFzX3dpbmRvd19zdGFydCwgd2hpY2ggaXMgUlBDIGFsaWduZWQgKi8KIAkJcmFzLT5yYXNfbmV4dF9yZWFkYWhlYWQgPSBtYXgoaW5kZXgsIHJhcy0+cmFzX25leHRfcmVhZGFoZWFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKaW5kZXggZjZiNWY0YjkuLmM4NjI0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jCkBAIC01NzcsNyArNTc3LDcgQEAKIAkgKiBTb21lb25lIHRyaWdnZXJlZCBnbGltcHNlIHdpdGhpbiAxIHNlYyBiZWZvcmUuCiAJICogMSkgVGhlIGZvcm1lciBnbGltcHNlIHN1Y2NlZWRlZCB3aXRoIGdsaW1wc2UgbG9jayBncmFudGVkIGJ5IE9TVCwgYW5kCiAJICogICAgaWYgdGhlIGxvY2sgaXMgc3RpbGwgY2FjaGVkIG9uIGNsaWVudCwgQUdMIG5lZWRzIHRvIGRvIG5vdGhpbmcuIElmCi0JICogICAgaXQgaXMgY2FuY2VsbGVkIGJ5IG90aGVyIGNsaWVudCwgQUdMIG1heWJlIGNhbm5vdCBvYnRhaW9uIG5ldyBsb2NrCisJICogICAgaXQgaXMgY2FuY2VsbGVkIGJ5IG90aGVyIGNsaWVudCwgQUdMIG1heWJlIGNhbm5vdCBvYnRhaW4gbmV3IGxvY2sKIAkgKiAgICBmb3Igbm8gZ2xpbXBzZSBjYWxsYmFjayB0cmlnZ2VyZWQgYnkgQUdMLgogCSAqIDIpIFRoZSBmb3JtZXIgZ2xpbXBzZSBzdWNjZWVkZWQsIGJ1dCBPU1QgZGlkIG5vdCBncmFudCBnbGltcHNlIGxvY2suCiAJICogICAgVW5kZXIgc3VjaCBjYXNlLCBpdCBpcyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHRoZSBPU1Qgd2lsbCBub3QgZ3JhbnQKQEAgLTg3Nyw5ICs4NzcsNiBAQAogCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkKIAkJcmV0dXJuIDE7CiAKLQlpZiAodW5saWtlbHkoZGVudHJ5ID09IGRlbnRyeS0+ZF9zYi0+c19yb290KSkKLQkJcmV0dXJuIDE7Ci0KIAllbnRyeS0+c2VfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CiAJcmMgPSBtZF9yZXZhbGlkYXRlX2xvY2sobGxfaTJtZGV4cChkaXIpLCAmaXQsIGxsX2lub2RlMmZpZChpbm9kZSksTlVMTCk7CiAJaWYgKHJjID09IDEpIHsKQEAgLTE1ODgsOCArMTU4NSwxNSBAQAogCQkJCQkJbGxfaW5vZGUyZmlkKGlub2RlKSwgJmJpdHMpOwogCQkJaWYgKHJjID09IDEpIHsKIAkJCQlpZiAoKCpkZW50cnlwKS0+ZF9pbm9kZSA9PSBOVUxMKSB7Ci0JCQkJCSpkZW50cnlwID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKKworCQkJCQlhbGlhcyA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwKIAkJCQkJCQkJICAgKmRlbnRyeXApOworCQkJCQlpZiAoSVNfRVJSKGFsaWFzKSkgeworCQkJCQkJbGxfc2FpX3VucGx1ZyhzYWksIGVudHJ5KTsKKwkJCQkJCXJldHVybiBQVFJfRVJSKGFsaWFzKTsKKwkJCQkJfQorCQkJCQkqZGVudHJ5cCA9IGFsaWFzOwogCQkJCX0gZWxzZSBpZiAoKCpkZW50cnlwKS0+ZF9pbm9kZSAhPSBpbm9kZSkgewogCQkJCQkvKiByZXZhbGlkYXRlLCBidXQgaW5vZGUgaXMgcmVjcmVhdGVkICovCiAJCQkJCUNERUJVRyhEX1JFQURBLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYwppbmRleCA5M2NiZmJiLi5jN2Q3MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYwpAQCAtNTEsNyArNTEsNyBAQAogCQkJCWNvbnN0IHN0cnVjdCBjbF9pb19zbGljZSAqc2xpY2UpOwogCiAvKioKLSAqIFRydWUsIGlmIFxhIGlvIGlzIGEgbm9ybWFsIGlvLCBGYWxzZSBmb3Igc2VuZGZpbGUoKSAvIHNwbGljZV97cmVhZHx3cml0ZX0KKyAqIFRydWUsIGlmIFxhIGlvIGlzIGEgbm9ybWFsIGlvLCBGYWxzZSBmb3Igc3BsaWNlX3tyZWFkLHdyaXRlfQogICovCiBpbnQgY2xfaXNfbm9ybWFsaW8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBjb25zdCBzdHJ1Y3QgY2xfaW8gKmlvKQogewpAQCAtNDc0LDIwICs0NzQsNiBAQAogCXZ2cF9pb19maW5pKGVudiwgaW9zKTsKIH0KIAotc3RhdGljIHNzaXplX3QgbHVzdHJlX2dlbmVyaWNfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQlzdHJ1Y3QgY2NjX2lvICp2aW8sIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb19yZWFkKHZpby0+Y3VpX2lvY2IsIHZpby0+Y3VpX2lvdiwKLQkJCQkgICAgIHZpby0+Y3VpX25yc2VncywgKnBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdXN0cmVfZ2VuZXJpY19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQlzdHJ1Y3QgY2NjX2lvICp2aW8sIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZSh2aW8tPmN1aV9pb2NiLCB2aW8tPmN1aV9pb3YsCi0JCQkJICAgICAgdmlvLT5jdWlfbnJzZWdzLCAqcHBvcyk7Ci19Ci0KIHN0YXRpYyBpbnQgdnZwX2lvX3JlYWRfc3RhcnQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgY2xfaW9fc2xpY2UgKmlvcykKIHsKQEAgLTU0MCw4ICs1MjYsMTEgQEAKIAlmaWxlX2FjY2Vzc2VkKGZpbGUpOwogCXN3aXRjaCAodmlvLT5jdWlfaW9fc3VidHlwZSkgewogCWNhc2UgSU9fTk9STUFMOgotCQkgcmVzdWx0ID0gbHVzdHJlX2dlbmVyaWNfZmlsZV9yZWFkKGZpbGUsIGNpbywgJnBvcyk7Ci0JCSBicmVhazsKKwkJTEFTU0VSVChjaW8tPmN1aV9pb2NiLT5raV9wb3MgPT0gcG9zKTsKKwkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGNpby0+Y3VpX2lvY2IsCisJCQkJCSAgICAgICBjaW8tPmN1aV9pb3YsIGNpby0+Y3VpX25yc2VncywKKwkJCQkJICAgICAgIGNpby0+Y3VpX2lvY2ItPmtpX3Bvcyk7CisJCWJyZWFrOwogCWNhc2UgSU9fU1BMSUNFOgogCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQoZmlsZSwgJnBvcywKIAkJCQl2aW8tPnUuc3BsaWNlLmN1aV9waXBlLCBjbnQsCkBAIC01ODYsNyArNTc1LDYgQEAKIAlzdHJ1Y3QgY2xfaW8gICAgICAgKmlvICAgID0gaW9zLT5jaXNfaW87CiAJc3RydWN0IGNsX29iamVjdCAgICpvYmogICA9IGlvLT5jaV9vYmo7CiAJc3RydWN0IGlub2RlICAgICAgICppbm9kZSA9IGNjY19vYmplY3RfaW5vZGUob2JqKTsKLQlzdHJ1Y3QgZmlsZQkqZmlsZSAgPSBjaW8tPmN1aV9mZC0+ZmRfZmlsZTsKIAlzc2l6ZV90IHJlc3VsdCA9IDA7CiAJbG9mZl90IHBvcyA9IGlvLT51LmNpX3dyLndyLmNyd19wb3M7CiAJc2l6ZV90IGNudCA9IGlvLT51LmNpX3dyLndyLmNyd19jb3VudDsKQEAgLTYwMSw2ICs1ODksOCBAQAogCQkgKi8KIAkJcG9zID0gaW8tPnUuY2lfd3Iud3IuY3J3X3BvcyA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJY2lvLT5jdWlfaW9jYi0+a2lfcG9zID0gcG9zOworCX0gZWxzZSB7CisJCUxBU1NFUlQoY2lvLT5jdWlfaW9jYi0+a2lfcG9zID09IHBvcyk7CiAJfQogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJ3cml0ZTogWyVsbGksICVsbGkpXG4iLCBwb3MsIHBvcyArIChsb25nIGxvbmcpY250KTsKQEAgLTYwOCw4ICs1OTgsOSBAQAogCWlmIChjaW8tPmN1aV9pb3YgPT0gTlVMTCkgLyogZnJvbSBhIHRlbXAgaW8gaW4gbGxfY2xfaW5pdCgpLiAqLwogCQlyZXN1bHQgPSAwOwogCWVsc2UKLQkJcmVzdWx0ID0gbHVzdHJlX2dlbmVyaWNfZmlsZV93cml0ZShmaWxlLCBjaW8sICZwb3MpOwotCisJCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoY2lvLT5jdWlfaW9jYiwKKwkJCQkJCWNpby0+Y3VpX2lvdiwgY2lvLT5jdWlfbnJzZWdzLAorCQkJCQkJY2lvLT5jdWlfaW9jYi0+a2lfcG9zKTsKIAlpZiAocmVzdWx0ID4gMCkgewogCQlpZiAocmVzdWx0IDwgY250KQogCQkJaW8tPmNpX2NvbnRpbnVlID0gMDsKQEAgLTY1NSw3ICs2NDYsNyBAQAogCWlmIChjZmlvLT5mYXVsdC5mdF9mbGFncyAmIFZNX0ZBVUxUX1JFVFJZKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCUNFUlJPUigidW5rbm93IGVycm9yIGluIHBhZ2UgZmF1bHQgJWQhXG4iLCBjZmlvLT5mYXVsdC5mdF9mbGFncyk7CisJQ0VSUk9SKCJVbmtub3duIGVycm9yIGluIHBhZ2UgZmF1bHQgJWQhXG4iLCBjZmlvLT5mYXVsdC5mdF9mbGFncyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTEyMDEsNyArMTE5Miw3IEBACiAJCWlmIChyZXN1bHQgPT0gLUVOT0VOVCkKIAkJCS8qIElmIHRoZSBpbm9kZSBvbiBNRFMgaGFzIGJlZW4gcmVtb3ZlZCwgYnV0IHRoZSBvYmplY3RzCiAJCQkgKiBvbiBPU1RzIGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQgKGFzeW5jIHVubGluayksIGxheW91dAotCQkJICogZmV0Y2ggd2lsbCByZXR1cm4gLUVOT0VOVCwgd2UnZCBpbmdvcmUgdGhpcyBlcnJvcgorCQkJICogZmV0Y2ggd2lsbCByZXR1cm4gLUVOT0VOVCwgd2UnZCBpZ25vcmUgdGhpcyBlcnJvcgogCQkJICogYW5kIGNvbnRpbnVlIHdpdGggZGlydHkgZmx1c2guIExVLTMyMzAuICovCiAJCQlyZXN1bHQgPSAwOwogCQlpZiAocmVzdWx0IDwgMCkKQEAgLTEyMTYsNyArMTIwNyw3IEBACiBzdGF0aWMgc3RydWN0IHZ2cF9pbyAqY2wydnZwX2lvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQljb25zdCBzdHJ1Y3QgY2xfaW9fc2xpY2UgKnNsaWNlKQogewotCS8qIENhbGluZyBqdXN0IGZvciBhc3NlcnRpb24gKi8KKwkvKiBDYWxsaW5nIGp1c3QgZm9yIGFzc2VydGlvbiAqLwogCWNsMmNjY19pbyhlbnYsIHNsaWNlKTsKIAlyZXR1cm4gdnZwX2Vudl9pbyhlbnYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMKaW5kZXggM2E3ZDAzYy4uYjFlZDRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jCkBAIC05NSw3ICs5NSw3IEBACiAKIAlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9VU0VSX1QgJiYgIShzYmktPmxsX2ZsYWdzICYgTExfU0JJX1VTRVJfWEFUVFIpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfVFJVU1RFRF9UICYmICFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfVFJVU1RFRF9UICYmICFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9PVEhFUl9UKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0xODMsMTcgKzE4MywxMSBAQAogCQl2YWxpZCB8PSByY2Vfb3BzMnZhbGlkKHJjZS0+cmNlX29wcyk7CiAJfQogI2VuZGlmCi0JaWYgKHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCAmJgotCSAgICAocmNlID09IE5VTEwgfHwgcmNlLT5yY2Vfb3BzID09IFJNVF9MU0VURkFDTCkpIHsKLQkJcmMgPSBsbF94YXR0cl9jYWNoZV91cGRhdGUoaW5vZGUsIG5hbWUsIHB2LCBzaXplLCB2YWxpZCwgZmxhZ3MpOwotCX0gZWxzZSB7CiAJCW9jID0gbGxfbWRzY2FwYV9nZXQoaW5vZGUpOwogCQlyYyA9IG1kX3NldHhhdHRyKHNiaS0+bGxfbWRfZXhwLCBsbF9pbm9kZTJmaWQoaW5vZGUpLCBvYywKIAkJCQl2YWxpZCwgbmFtZSwgcHYsIHNpemUsIDAsIGZsYWdzLAogCQkJCWxsX2kyc3VwcGdpZChpbm9kZSksICZyZXEpOwogCQljYXBhX3B1dChvYyk7Ci0JfQotCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCWlmIChuZXdfdmFsdWUgIT0gTlVMTCkKIAkJbHVzdHJlX3Bvc2l4X2FjbF94YXR0cl9mcmVlKG5ld192YWx1ZSwgc2l6ZSk7CkBAIC0yOTIsNiArMjg2LDcgQEAKIAl2b2lkICp4ZGF0YTsKIAlzdHJ1Y3Qgb2JkX2NhcGEgKm9jOwogCXN0cnVjdCBybXRhY2xfY3RsX2VudHJ5ICpyY2UgPSBOVUxMOworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9JWx1LyV1KCVwKVxuIiwKIAkgICAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9nZW5lcmF0aW9uLCBpbm9kZSk7CkBAIC0zMzksNyArMzM0LDcgQEAKIAkgKi8KIAlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9BQ0xfQUNDRVNTX1QgJiYKIAkgICAgIShzYmktPmxsX2ZsYWdzICYgTExfU0JJX1JNVF9DTElFTlQpKSB7Ci0JCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCiAJCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAogCQlzcGluX2xvY2soJmxsaS0+bGxpX2xvY2spOwpAQCAtMzU4LDEzICszNTMsMjcgQEAKICNlbmRpZgogCiBkb19nZXR4YXR0cjoKLQlpZiAoc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkICYmIChyY2UgPT0gTlVMTCB8fAotCQkJCQkgICAgcmNlLT5yY2Vfb3BzID09IFJNVF9MR0VURkFDTCB8fAotCQkJCQkgICAgcmNlLT5yY2Vfb3BzID09IFJNVF9MU0VURkFDTCkpIHsKKwlpZiAoc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkICYmIHhhdHRyX3R5cGUgIT0gWEFUVFJfQUNMX0FDQ0VTU19UKSB7CiAJCXJjID0gbGxfeGF0dHJfY2FjaGVfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIHZhbGlkKTsKKwkJaWYgKHJjID09IC1FQUdBSU4pCisJCQlnb3RvIGdldHhhdHRyX25vY2FjaGU7CiAJCWlmIChyYyA8IDApCiAJCQlHT1RPKG91dF94YXR0ciwgcmMpOworCisJCS8qIEFkZCAic3lzdGVtLnBvc2l4X2FjbF9hY2Nlc3MiIHRvIHRoZSBsaXN0ICovCisJCWlmIChsbGktPmxsaV9wb3NpeF9hY2wgIT0gTlVMTCAmJiB2YWxpZCAmIE9CRF9NRF9GTFhBVFRSTFMpIHsKKwkJCWlmIChzaXplID09IDApIHsKKwkJCQlyYyArPSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKwkJCX0gZWxzZSBpZiAoc2l6ZSAtIHJjID49IHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpKSB7CisJCQkJbWVtY3B5KGJ1ZmZlciArIHJjLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MsCisJCQkJICAgICAgIHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpKTsKKwkJCQlyYyArPSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKwkJCX0gZWxzZSB7CisJCQkJR09UTyhvdXRfeGF0dHIsIHJjID0gLUVSQU5HRSk7CisJCQl9CisJCX0KIAl9IGVsc2UgeworZ2V0eGF0dHJfbm9jYWNoZToKIAkJb2MgPSBsbF9tZHNjYXBhX2dldChpbm9kZSk7CiAJCXJjID0gbWRfZ2V0eGF0dHIoc2JpLT5sbF9tZF9leHAsIGxsX2lub2RlMmZpZChpbm9kZSksIG9jLAogCQkJCXZhbGlkIHwgKHJjZSA/IHJjZV9vcHMydmFsaWQocmNlLT5yY2Vfb3BzKSA6IDApLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKaW5kZXggM2UzYmUxZi4uNGRlZmEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCkBAIC05OCwxMyArOTgsMTMgQEAKIH0KIAogLyoqCi0gKiBUaGlzIGFkZHMgb3IgdXBkYXRlcyBhbiB4YXR0ci4KKyAqIFRoaXMgYWRkcyBhbiB4YXR0ci4KICAqCiAgKiBBZGQgQHhhdHRyX25hbWUgYXR0ciB3aXRoIEB4YXR0cl92YWwgdmFsdWUgYW5kIEB4YXR0cl92YWxfbGVuIGxlbmd0aCwKLSAqIGlmIHRoZSBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMsIHRoZW4gdXBkYXRlIGl0cyB2YWx1ZS4KICAqCiAgKiBccmV0dmFsIDAgICAgICAgc3VjY2VzcwogICogXHJldHZhbCAtRU5PTUVNIGlmIG5vIG1lbW9yeSBjb3VsZCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBjYWNoZWQgYXR0cgorICogXHJldHZhbCAtRVBST1RPIGlmIGR1cGxpY2F0ZSB4YXR0ciBpcyBiZWluZyBhZGRlZAogICovCiBzdGF0aWMgaW50IGxsX3hhdHRyX2NhY2hlX2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpjYWNoZSwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKnhhdHRyX25hbWUsCkBAIC0xMTYsMjcgKzExNiw4IEBACiAKIAogCWlmIChsbF94YXR0cl9jYWNoZV9maW5kKGNhY2hlLCB4YXR0cl9uYW1lLCAmeGF0dHIpID09IDApIHsKLQkJLyogRm91bmQgYSBjYWNoZWQgRUEsIHVwZGF0ZSBpdCAqLwotCi0JCWlmICh4YXR0cl92YWxfbGVuICE9IHhhdHRyLT54ZV92YWxsZW4pIHsKLQkJCWNoYXIgKnZhbDsKLQkJCU9CRF9BTExPQyh2YWwsIHhhdHRyX3ZhbF9sZW4pOwotCQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQkJQ0RFQlVHKERfQ0FDSEUsCi0JCQkJICAgICAgICJmYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgZm9yIHhhdHRyICVzIHVwZGF0ZVxuIiwKLQkJCQkgICAgICAgeGF0dHJfdmFsX2xlbiwgeGF0dHJfbmFtZSk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQlPQkRfRlJFRSh4YXR0ci0+eGVfdmFsdWUsIHhhdHRyLT54ZV92YWxsZW4pOwotCQkJeGF0dHItPnhlX3ZhbHVlID0gdmFsOwotCQkJeGF0dHItPnhlX3ZhbGxlbiA9IHhhdHRyX3ZhbF9sZW47Ci0JCX0KLQkJbWVtY3B5KHhhdHRyLT54ZV92YWx1ZSwgeGF0dHJfdmFsLCB4YXR0cl92YWxfbGVuKTsKLQotCQlDREVCVUcoRF9DQUNIRSwgInVwZGF0ZTogWyVzXT0lLipzXG4iLCB4YXR0cl9uYW1lLAotCQkJeGF0dHJfdmFsX2xlbiwgeGF0dHJfdmFsKTsKLQotCQlyZXR1cm4gMDsKKwkJQ0RFQlVHKERfQ0FDSEUsICJkdXBsaWNhdGUgeGF0dHI6IFslc11cbiIsIHhhdHRyX25hbWUpOworCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKIAlPQkRfU0xBQl9BTExPQ19QVFJfR0ZQKHhhdHRyLCB4YXR0cl9rbWVtLCBfX0dGUF9JTyk7CkBAIC0yNjEsNyArMjQyLDcgQEAKICAqCiAgKiBGcmVlIGFsbCB4YXR0ciBtZW1vcnkuIEBsbGkgaXMgdGhlIGlub2RlIGluZm8gcG9pbnRlci4KICAqCi0gKiBccmV0dmFsIDAgbm8gZXJyb3Igb2NjdXJlZAorICogXHJldHZhbCAwIG5vIGVycm9yIG9jY3VycmVkCiAgKi8KIHN0YXRpYyBpbnQgbGxfeGF0dHJfY2FjaGVfZGVzdHJveV9sb2NrZWQoc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSkKIHsKQEAgLTI5MiwxNCArMjczLDE0IEBACiB9CiAKIC8qKgotICogTWF0Y2ggb3IgZW5xdWV1ZSBhIFBSIG9yIFBXIExETE0gbG9jay4KKyAqIE1hdGNoIG9yIGVucXVldWUgYSBQUiBsb2NrLgogICoKICAqIEZpbmQgb3IgcmVxdWVzdCBhbiBMRExNIGxvY2sgd2l0aCB4YXR0ciBkYXRhLgogICogU2luY2UgTERMTSBkb2VzIG5vdCBwcm92aWRlIEFQSSBmb3IgYXRvbWljIG1hdGNoX29yX2VucXVldWUsCiAgKiB0aGUgZnVuY3Rpb24gaGFuZGxlcyBpdCB3aXRoIGEgc2VwYXJhdGUgZW5xIGxvY2suCiAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgZnVuY3Rpb24gZXhpdHMgd2l0aCB0aGUgbGlzdCBsb2NrIGhlbGQuCiAgKgotICogXHJldHZhbCAwICAgICAgIG5vIGVycm9yIG9jY3VyZWQKKyAqIFxyZXR2YWwgMCAgICAgICBubyBlcnJvciBvY2N1cnJlZAogICogXHJldHZhbCAtRU5PTUVNIG5vdCBlbm91Z2ggbWVtb3J5CiAgKi8KIHN0YXRpYyBpbnQgbGxfeGF0dHJfZmluZF9nZXRfbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtMzIyLDkgKzMwMyw3IEBACiAKIAltdXRleF9sb2NrKCZsbGktPmxsaV94YXR0cnNfZW5xX2xvY2spOwogCS8qIFRyeSBtYXRjaGluZyBmaXJzdC4gKi8KLQltb2RlID0gbGxfdGFrZV9tZF9sb2NrKGlub2RlLCBNRFNfSU5PREVMT0NLX1hBVFRSLCAmbG9ja2gsIDAsCi0JCQkgICAgICAgb2l0LT5pdF9vcCA9PSBJVF9TRVRYQVRUUiA/IExDS19QVyA6Ci0JCQkJCQkJICAgKExDS19QUiB8IExDS19QVykpOworCW1vZGUgPSBsbF90YWtlX21kX2xvY2soaW5vZGUsIE1EU19JTk9ERUxPQ0tfWEFUVFIsICZsb2NraCwgMCwgTENLX1BSKTsKIAlpZiAobW9kZSAhPSAwKSB7CiAJCS8qIGZha2Ugb2l0IGluIG1kY19yZXZhbGlkYXRlX2xvY2soKSBtYW5uZXIgKi8KIAkJb2l0LT5kLmx1c3RyZS5pdF9sb2NrX2hhbmRsZSA9IGxvY2toLmNvb2tpZTsKQEAgLTM0MCwxMyArMzE5LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAJfQogCi0Jb3BfZGF0YS0+b3BfdmFsaWQgPSBPQkRfTURfRkxYQVRUUiB8IE9CRF9NRF9GTFhBVFRSTFMgfAotCQkJICAgIE9CRF9NRF9GTFhBVFRSTE9DS0VEOwotI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKLQkvKiBJZiB3b3JraW5nIHdpdGggQUNMcywgd2Ugd291bGQgbGlrZSB0byBjYWNoZSBsb2NhbCBBQ0xzICovCi0JaWYgKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkKLQkJb3BfZGF0YS0+b3BfdmFsaWQgfD0gT0JEX01EX0ZMUk1UTEdFVEZBQ0w7Ci0jZW5kaWYKKwlvcF9kYXRhLT5vcF92YWxpZCA9IE9CRF9NRF9GTFhBVFRSIHwgT0JEX01EX0ZMWEFUVFJMUzsKIAogCXJjID0gbWRfZW5xdWV1ZShleHAsICZlaW5mbywgb2l0LCBvcF9kYXRhLCAmbG9ja2gsIE5VTEwsIDAsIE5VTEwsIDApOwogCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwpAQCAtMzc0LDcgKzM0Nyw3IEBACiAgKiBhIHJlYWQgb3IgYSB3cml0ZSB4YXR0ciBsb2NrIGRlcGVuZGluZyBvbiBvcGVyYXRpb24gaW4gQG9pdC4KICAqIEludGVudCBpcyBkcm9wcGVkIG9uIGV4aXQgdW5sZXNzIHRoZSBvcGVyYXRpb24gaXMgc2V0eGF0dHIuCiAgKgotICogXHJldHZhbCAwICAgICAgIG5vIGVycm9yIG9jY3VyZWQKKyAqIFxyZXR2YWwgMCAgICAgICBubyBlcnJvciBvY2N1cnJlZAogICogXHJldHZhbCAtRVBST1RPIG5ldHdvcmsgcHJvdG9jb2wgZXJyb3IKICAqIFxyZXR2YWwgLUVOT01FTSBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNhY2hlCiAgKi8KQEAgLTQwOSw3ICszODIsMTEgQEAKIAlpZiAob2l0LT5kLmx1c3RyZS5pdF9zdGF0dXMgPCAwKSB7CiAJCUNERUJVRyhEX0NBQ0hFLCAiZ2V0eGF0dHIgaW50ZW50IHJldHVybmVkICVkIGZvciBmaWQgIkRGSUQiXG4iLAogCQkgICAgICAgb2l0LT5kLmx1c3RyZS5pdF9zdGF0dXMsIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOwotCQlHT1RPKG91dF9kZXN0cm95LCByYyA9IG9pdC0+ZC5sdXN0cmUuaXRfc3RhdHVzKTsKKwkJcmMgPSBvaXQtPmQubHVzdHJlLml0X3N0YXR1czsKKwkJLyogeGF0dHIgZGF0YSBpcyBzbyBsYXJnZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gY2FjaGUgaXQgKi8KKwkJaWYgKHJjID09IC1FUkFOR0UpCisJCQlyYyA9IC1FQUdBSU47CisJCUdPVE8ob3V0X2Rlc3Ryb3ksIHJjKTsKIAl9CiAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKQEAgLTQ0Nyw2ICs0MjQsMTEgQEAKIAkJCXJjID0gLUVQUk9UTzsKIAkJfSBlbHNlIGlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MTElURV9YQVRUUl9FTk9NRU0pKSB7CiAJCQlyYyA9IC1FTk9NRU07CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh4ZGF0YSwgWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKSkgeworCQkJLyogRmlsdGVyIG91dCBBQ0wgQUNDRVNTIHNpbmNlIGl0J3MgY2FjaGVkIHNlcGFyYXRlbHkgKi8KKwkJCUNERUJVRyhEX0NBQ0hFLCAibm90IGNhY2hpbmcgJXNcbiIsCisJCQkgICAgICAgWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKwkJCXJjID0gMDsKIAkJfSBlbHNlIHsKIAkJCXJjID0gbGxfeGF0dHJfY2FjaGVfYWRkKCZsbGktPmxsaV94YXR0cnMsIHhkYXRhLCB4dmFsLAogCQkJCQkJKnhzaXplcyk7CkBAIC00NjcsOCArNDQ5LDcgQEAKIAogCUdPVE8ob3V0X21heWJlX2Ryb3AsIHJjKTsKIG91dF9tYXliZV9kcm9wOgotCS8qIGRyb3AgbG9jayBvbiBlcnJvciBvciBnZXR4YXR0ciAqLwotCWlmIChyYyAhPSAwIHx8IG9pdC0+aXRfb3AgIT0gSVRfU0VUWEFUVFIpCisKIAkJbGxfaW50ZW50X2Ryb3BfbG9jayhvaXQpOwogCiAJaWYgKHJjICE9IDApCkBAIC00OTYsNyArNDc3LDcgQEAKICAqIFRoZSByZXN1bHRpbmcgdmFsdWUvbGlzdCBpcyBzdG9yZWQgaW4gQGJ1ZmZlciBpZiB0aGUgZm9ybWVyCiAgKiBpcyBub3QgbGFyZ2VyIHRoYW4gQHNpemUuCiAgKgotICogXHJldHZhbCAwICAgICAgICBubyBlcnJvciBvY2N1cmVkCisgKiBccmV0dmFsIDAgICAgICAgIG5vIGVycm9yIG9jY3VycmVkCiAgKiBccmV0dmFsIC1FUFJPVE8gIG5ldHdvcmsgcHJvdG9jb2wgZXJyb3IKICAqIFxyZXR2YWwgLUVOT01FTSAgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjYWNoZQogICogXHJldHZhbCAtRVJBTkdFICB0aGUgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gKQEAgLTU1Myw2NSArNTM0LDMgQEAKIAogCXJldHVybiByYzsKIH0KLQotCi0vKioKLSAqIFNldC91cGRhdGUgYW4geGF0dHIgdmFsdWUgb3IgcmVtb3ZlIHhhdHRyIHVzaW5nIHRoZSB3cml0ZS10aHJvdWdoIGNhY2hlLgotICoKLSAqIFNldC91cGRhdGUgdGhlIHhhdHRyIHZhbHVlIChpZiBAdmFsaWQgaGFzIE9CRF9NRF9GTFhBVFRSKSBvZiBAbmFtZSB0byBAbmV3dmFsCi0gKiBvcgotICogcmVtb3ZlIHRoZSB4YXR0ciBAbmFtZSAoQHZhbGlkIGhhcyBPQkRfTURfRkxYQVRUUlJNIHNldCkgZnJvbSBAaW5vZGUuCi0gKiBAZmxhZ3MgaXMgZWl0aGVyIFhBVFRSX0NSRUFURSBvciBYQVRUUl9SRVBMQUNFIGFzIGRlZmluZWQgYnkgc2V0eGF0dHIoMikKLSAqCi0gKiBccmV0dmFsIDAgICAgICAgIG5vIGVycm9yIG9jY3VyZWQKLSAqIFxyZXR2YWwgLUVQUk9UTyAgbmV0d29yayBwcm90b2NvbCBlcnJvcgotICogXHJldHZhbCAtRU5PTUVNICBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNhY2hlCi0gKiBccmV0dmFsIC1FUkFOR0UgIHRoZSBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaAotICogXHJldHZhbCAtRU5PREFUQSBubyBzdWNoIGF0dHIgKGluIHRoZSByZW1vdmFsIGNhc2UpCi0gKi8KLWludCBsbF94YXR0cl9jYWNoZV91cGRhdGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCWNvbnN0IGNoYXIgKm5hbWUsCi0JCQljb25zdCBjaGFyICpuZXd2YWwsCi0JCQlzaXplX3Qgc2l6ZSwKLQkJCV9fdTY0IHZhbGlkLAotCQkJaW50IGZsYWdzKQotewotCXN0cnVjdCBsb29rdXBfaW50ZW50IG9pdCA9IHsgLml0X29wID0gSVRfU0VUWEFUVFIgfTsKLQlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKLQlzdHJ1Y3Qgb2JkX2NhcGEgKm9jOwotCWludCByYzsKLQotCi0KLQlMQVNTRVJUKCEhKHZhbGlkICYgT0JEX01EX0ZMWEFUVFIpIF4gISEodmFsaWQgJiBPQkRfTURfRkxYQVRUUlJNKSk7Ci0KLQlyYyA9IGxsX3hhdHRyX2NhY2hlX3JlZmlsbChpbm9kZSwgJm9pdCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlvYyA9IGxsX21kc2NhcGFfZ2V0KGlub2RlKTsKLQlyYyA9IG1kX3NldHhhdHRyKHNiaS0+bGxfbWRfZXhwLCBsbF9pbm9kZTJmaWQoaW5vZGUpLCBvYywKLQkJCXZhbGlkIHwgT0JEX01EX0ZMWEFUVFJMT0NLRUQsIG5hbWUsIG5ld3ZhbCwKLQkJCXNpemUsIDAsIGZsYWdzLCBsbF9pMnN1cHBnaWQoaW5vZGUpLCAmcmVxKTsKLQljYXBhX3B1dChvYyk7Ci0KLQlpZiAocmMpIHsKLQkJbGxfaW50ZW50X2Ryb3BfbG9jaygmb2l0KTsKLQkJR09UTyhvdXQsIHJjKTsKLQl9Ci0KLQlpZiAodmFsaWQgJiBPQkRfTURfRkxYQVRUUikKLQkJcmMgPSBsbF94YXR0cl9jYWNoZV9hZGQoJmxsaS0+bGxpX3hhdHRycywgbmFtZSwgbmV3dmFsLCBzaXplKTsKLQllbHNlIGlmICh2YWxpZCAmIE9CRF9NRF9GTFhBVFRSUk0pCi0JCXJjID0gbGxfeGF0dHJfY2FjaGVfZGVsKCZsbGktPmxsaV94YXR0cnMsIG5hbWUpOwotCi0JbGxfaW50ZW50X2Ryb3BfbG9jaygmb2l0KTsKLQlHT1RPKG91dCwgcmMpOwotb3V0OgotCXVwX3dyaXRlKCZsbGktPmxsaV94YXR0cnNfbGlzdF9yd3NlbSk7Ci0JcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCi0JcmV0dXJuIHJjOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMKaW5kZXggNTZkZWRjZS4uOWJhNWEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jCkBAIC0xMTksNyArMTE5LDYgQEAKIAlDREVCVUcoRF9JTk9ERSwgIlJFTU9URV9JTlRFTlQgd2l0aCBmaWQ9IkRGSUQiIC0+IG1kcyAjJWRcbiIsCiAJICAgICAgIFBGSUQoJmJvZHktPmZpZDEpLCB0Z3QtPmx0ZF9pZHgpOwogCi0JaXQtPmQubHVzdHJlLml0X2Rpc3Bvc2l0aW9uICY9IH5ESVNQX0VOUV9DT01QTEVURTsKIAlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdCwKIAkJCSAgICBmbGFncywgJnJlcSwgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCmluZGV4IDFiZGRkOGYuLjNiYTBhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYwpAQCAtMTc0NCw3ICsxNzQ0LDYgQEAKIAlpdC0+ZC5sdXN0cmUuaXRfZGF0YSA9IE5VTEw7CiAJZmlkMSA9IGJvZHktPmZpZDE7CiAKLQlpdC0+ZC5sdXN0cmUuaXRfZGlzcG9zaXRpb24gJj0gfkRJU1BfRU5RX0NPTVBMRVRFOwogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAogCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZmaWQxKTsKQEAgLTI1OTMsNyArMjU5Miw3IEBACiAKIGludCBsbXZfc2V0X29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2gsCi0JCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqb3Blbl9yZXEpCisJCQkgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwpAQCAtMjYwMyw3ICsyNjAyLDcgQEAKIAlpZiAoSVNfRVJSKHRndCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKLQlyZXR1cm4gbWRfc2V0X29wZW5fcmVwbGF5X2RhdGEodGd0LT5sdGRfZXhwLCBvY2gsIG9wZW5fcmVxKTsKKwlyZXR1cm4gbWRfc2V0X29wZW5fcmVwbGF5X2RhdGEodGd0LT5sdGRfZXhwLCBvY2gsIGl0KTsKIH0KIAogaW50IGxtdl9jbGVhcl9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKaW5kZXggYjM1NWQwMS4uNWQ1YzMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYwpAQCAtODcsOCArODcsOSBAQAogCiAjZGVmaW5lIE1BWF9QT0xJQ1lfU1RSSU5HX1NJWkUgNjQKIAotc3RhdGljIHNzaXplX3QgbG12X3BsYWNlbWVudF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLQkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQorc3RhdGljIHNzaXplX3QgbG12X3BsYWNlbWVudF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9ICgoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+cHJpdmF0ZTsKIAljaGFyCQkgICAgIGR1bW15W01BWF9QT0xJQ1lfU1RSSU5HX1NJWkUgKyAxXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwppbmRleCBlNmM2MDE1Li42ZjM1NmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCkBAIC05OCw3ICs5OCw3IEBACiAKIAlPQkRfQUxMT0NfTEFSR0UobHNtLCAqc2l6ZSk7CiAJaWYgKCFsc20pCi0JCXJldHVybiBOVUxMOzsKKwkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RyaXBlX2NvdW50OyBpKyspIHsKIAkJT0JEX1NMQUJfQUxMT0NfUFRSX0dGUChsb2ksIGxvdl9vaW5mb19zbGFiLCBfX0dGUF9JTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKaW5kZXggNWE2YWI3MC4uNjUxMzNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYwpAQCAtMTk0LDYgKzE5NCw3IEBACiAJCXN1Yl9pby0+Y2lfbG9ja3JlcSA9IGlvLT5jaV9sb2NrcmVxOwogCQlzdWJfaW8tPmNpX3R5cGUgICAgPSBpby0+Y2lfdHlwZTsKIAkJc3ViX2lvLT5jaV9ub19zcnZsb2NrID0gaW8tPmNpX25vX3NydmxvY2s7CisJCXN1Yl9pby0+Y2lfbm9hdGltZSA9IGlvLT5jaV9ub2F0aW1lOwogCiAJCWxvdl9zdWJfZW50ZXIoc3ViKTsKIAkJcmVzdWx0ID0gY2xfaW9fc3ViX2luaXQoc3ViLT5zdWJfZW52LCBzdWJfaW8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYwppbmRleCA1MGE3N2M1Li4wMjUwOWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKQEAgLTMzOSw3ICszMzksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBsb3YtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKIAkJaWYgKGxvdi0+bG92X3RndHNbaV0gJiYgbG92LT5sb3ZfdGd0c1tpXS0+bHRkX2V4cCkgewogCQkJLyogRGlzY29ubmVjdGlvbiBpcyB0aGUgbGFzdCB3ZSBrbm93IGFib3V0IGFuIG9iZCAqLwotCQkJbG92X2RlbF90YXJnZXQob2JkLCBpLCAwLCBsb3YtPmxvdl90Z3RzW2ldLT5sdGRfZ2VuKTsKKwkJCWxvdl9kZWxfdGFyZ2V0KG9iZCwgaSwgTlVMTCwgbG92LT5sb3ZfdGd0c1tpXS0+bHRkX2dlbik7CiAJCX0KIAl9CiAJb2JkX3B1dHJlZihvYmQpOwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJaWYgKHJjKSB7CiAJCUNFUlJPUigiYWRkIGZhaWxlZCAoJWQpLCBkZWxldGluZyAlc1xuIiwgcmMsCiAJCSAgICAgICBvYmRfdXVpZDJzdHIoJnRndC0+bHRkX3V1aWQpKTsKLQkJbG92X2RlbF90YXJnZXQob2JkLCBpbmRleCwgMCwgMCk7CisJCWxvdl9kZWxfdGFyZ2V0KG9iZCwgaW5kZXgsIE5VTEwsIDApOwogCX0KIAlvYmRfcHV0cmVmKG9iZCk7CiAJcmV0dXJuIHJjOwpAQCAtNzY4LDcgKzc2OCw3IEBACiAKIGludCBsb3Zfc2V0dXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpCiB7Ci0Jc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgbHZhcnMgPSB7IDAgfTsKKwlzdHJ1Y3QgbHByb2Nmc19zdGF0aWNfdmFycyBsdmFycyA9IHsgTlVMTCB9OwogCXN0cnVjdCBsb3ZfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgbG92X29iZCAqbG92ID0gJm9iZC0+dS5sb3Y7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKaW5kZXggZGY4YjViNS4uZDZiMmNiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCkBAIC0xMjIsOCArMTIyLDggQEAKIH0KIAogc3RhdGljIGludCBsb3ZfaW5pdF9zdWIoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbG92X29iamVjdCAqbG92LAotCQkJc3RydWN0IGNsX29iamVjdCAqc3RyaXBlLAotCQkJc3RydWN0IGxvdl9sYXlvdXRfcmFpZDAgKnIwLCBpbnQgaWR4KQorCQkJc3RydWN0IGNsX29iamVjdCAqc3RyaXBlLCBzdHJ1Y3QgbG92X2xheW91dF9yYWlkMCAqcjAsCisJCQlpbnQgaWR4KQogewogCXN0cnVjdCBjbF9vYmplY3RfaGVhZGVyICpoZHI7CiAJc3RydWN0IGNsX29iamVjdF9oZWFkZXIgKnN1YmhkcjsKQEAgLTE0NCw3ICsxNDQsNiBAQAogCiAJaGRyICAgID0gY2xfb2JqZWN0X2hlYWRlcihsb3YyY2wobG92KSk7CiAJc3ViaGRyID0gY2xfb2JqZWN0X2hlYWRlcihzdHJpcGUpOwotCXBhcmVudCA9IHN1Ymhkci0+Y29oX3BhcmVudDsKIAogCW9pbmZvID0gbG92LT5sb19sc20tPmxzbV9vaW5mb1tpZHhdOwogCUNERUJVRyhEX0lOT0RFLCBERklEIkAlcFslZF0gLT4gIkRGSUQiQCVwOiBvc3RpZDogIkRPU1RJRApAQCAtMTUzLDggKzE1MiwxMiBAQAogCSAgICAgICBQRklEKCZoZHItPmNvaF9sdS5sb2hfZmlkKSwgaGRyLCBQT1NUSUQoJm9pbmZvLT5sb2lfb2kpLAogCSAgICAgICBvaW5mby0+bG9pX29zdF9pZHgsIG9pbmZvLT5sb2lfb3N0X2dlbik7CiAKKwkvKiByZXVzZSAtPmNvaF9hdHRyX2d1YXJkIHRvIHByb3RlY3QgY29oX3BhcmVudCBjaGFuZ2UgKi8KKwlzcGluX2xvY2soJnN1Ymhkci0+Y29oX2F0dHJfZ3VhcmQpOworCXBhcmVudCA9IHN1Ymhkci0+Y29oX3BhcmVudDsKIAlpZiAocGFyZW50ID09IE5VTEwpIHsKIAkJc3ViaGRyLT5jb2hfcGFyZW50ID0gaGRyOworCQlzcGluX3VubG9jaygmc3ViaGRyLT5jb2hfYXR0cl9ndWFyZCk7CiAJCXN1Ymhkci0+Y29oX25lc3RpbmcgPSBoZHItPmNvaF9uZXN0aW5nICsgMTsKIAkJbHVfb2JqZWN0X3JlZl9hZGQoJnN0cmlwZS0+Y29fbHUsICJsb3YtcGFyZW50IiwgbG92KTsKIAkJcjAtPmxvX3N1YltpZHhdID0gY2wybG92c3ViKHN0cmlwZSk7CkBAIC0xNjYsNiArMTY5LDcgQEAKIAkJc3RydWN0IGxvdl9vYmplY3QgKm9sZF9sb3Y7CiAJCXVuc2lnbmVkIGludCBtYXNrID0gRF9JTk9ERTsKIAorCQlzcGluX3VubG9jaygmc3ViaGRyLT5jb2hfYXR0cl9ndWFyZCk7CiAJCW9sZF9vYmogPSBsdV9vYmplY3RfbG9jYXRlKCZwYXJlbnQtPmNvaF9sdSwgJmxvdl9kZXZpY2VfdHlwZSk7CiAJCUxBU1NFUlQob2xkX29iaiAhPSBOVUxMKTsKIAkJb2xkX2xvdiA9IGNsMmxvdihsdTJjbChvbGRfb2JqKSk7CkBAIC0zMDYsNyArMzEwLDcgQEAKIAkgKiAtPmxvX3N1YltdIHNsb3QgaW4gbG92c3ViX29iamVjdF9maW5pKCkgKi8KIAlpZiAocjAtPmxvX3N1YltpZHhdID09IGxvcykgewogCQl3YWl0ZXIgPSAmbG92X2Vudl9pbmZvKGVudiktPmx0aV93YWl0ZXI7Ci0JCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQod2FpdGVyKTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkod2FpdGVyLCBjdXJyZW50KTsKIAkJYWRkX3dhaXRfcXVldWUoJmJrdC0+bHNiX21hcmNoZV9mdW5lYnJlLCB3YWl0ZXIpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXdoaWxlICgxKSB7CkBAIC0zMTYsNyArMzIwLDcgQEAKIAkJCXNwaW5fbG9jaygmcjAtPmxvX3N1Yl9sb2NrKTsKIAkJCWlmIChyMC0+bG9fc3ViW2lkeF0gPT0gbG9zKSB7CiAJCQkJc3Bpbl91bmxvY2soJnIwLT5sb19zdWJfbG9jayk7Ci0JCQkJd2FpdHFfd2FpdCh3YWl0ZXIsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZSgpOwogCQkJfSBlbHNlIHsKIAkJCQlzcGluX3VubG9jaygmcjAtPmxvX3N1Yl9sb2NrKTsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpAQCAtNTA4LDcgKzUxMiw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotY29uc3Qgc3RhdGljIHN0cnVjdCBsb3ZfbGF5b3V0X29wZXJhdGlvbnMgbG92X2Rpc3BhdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxvdl9sYXlvdXRfb3BlcmF0aW9ucyBsb3ZfZGlzcGF0Y2hbXSA9IHsKIAlbTExUX0VNUFRZXSA9IHsKIAkJLmxsb19pbml0ICAgICAgPSBsb3ZfaW5pdF9lbXB0eSwKIAkJLmxsb19kZWxldGUgICAgPSBsb3ZfZGVsZXRlX2VtcHR5LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhY2suYwppbmRleCAyN2VkMjdlLi43NDIwMGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhY2suYwpAQCAtMzM5LDcgKzMzOSw4IEBACiAKIAkqbHNtcCA9IE5VTEw7CiAJTEFTU0VSVChhdG9taWNfcmVhZCgmbHNtLT5sc21fcmVmYykgPiAwKTsKLQlpZiAoKHJlZmMgPSBhdG9taWNfZGVjX3JldHVybigmbHNtLT5sc21fcmVmYykpID09IDApIHsKKwlyZWZjID0gYXRvbWljX2RlY19yZXR1cm4oJmxzbS0+bHNtX3JlZmMpOworCWlmIChyZWZjID09IDApIHsKIAkJTEFTU0VSVChsc21fb3BfZmluZChsc20tPmxzbV9tYWdpYykgIT0gTlVMTCk7CiAJCWxzbV9vcF9maW5kKGxzbS0+bHNtX21hZ2ljKS0+bHNtX2ZyZWUobHNtKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcmVxdWVzdC5jCmluZGV4IGNhODFjYWMuLmE1NDgxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcmVxdWVzdC5jCkBAIC01MCw3ICs1MCw3IEBACiAJYXRvbWljX3NldCgmc2V0LT5zZXRfY29tcGxldGVzLCAwKTsKIAlhdG9taWNfc2V0KCZzZXQtPnNldF9zdWNjZXNzLCAwKTsKIAlhdG9taWNfc2V0KCZzZXQtPnNldF9maW5pc2hfY2hlY2tlZCwgMCk7Ci0Jc2V0LT5zZXRfY29va2llcyA9IDA7CisJc2V0LT5zZXRfY29va2llcyA9IE5VTEw7CiAJSU5JVF9MSVNUX0hFQUQoJnNldC0+c2V0X2xpc3QpOwogCWF0b21pY19zZXQoJnNldC0+c2V0X3JlZmNvdW50LCAxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXQtPnNldF93YWl0cSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9kZXYuYwppbmRleCA5OThlYTFjLi45MjZjMzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfZGV2LmMKQEAgLTEzMSw2ICsxMzEsMTAgQEAKIAlzdHJ1Y3QgbG92c3ViX2RldmljZSAqbHNkICA9IGx1MmxvdnN1Yl9kZXYoZCk7CiAJc3RydWN0IGx1X2RldmljZSAgICAgKm5leHQgPSBjbDJsdV9kZXYobHNkLT5hY2lkX25leHQpOwogCisJaWYgKGF0b21pY19yZWFkKCZkLT5sZF9yZWYpICYmIGQtPmxkX3NpdGUpIHsKKwkJTElCQ0ZTX0RFQlVHX01TR19EQVRBX0RFQ0wobXNnZGF0YSwgRF9FUlJPUiwgTlVMTCk7CisJCWx1X3NpdGVfcHJpbnQoZW52LCBkLT5sZF9zaXRlLCAmbXNnZGF0YSwgbHVfY2RlYnVnX3ByaW50ZXIpOworCX0KIAljbF9kZXZpY2VfZmluaShsdTJjbF9kZXYoZCkpOwogCU9CRF9GUkVFX1BUUihsc2QpOwogCXJldHVybiBuZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbHZmcy9sdmZzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sdmZzL2x2ZnNfbGludXguYwppbmRleCA0MjhmZmQ4Li5lNDRiN2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sdmZzL2x2ZnNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sdmZzL2x2ZnNfbGludXguYwpAQCAtNTUsNyArNTUsNyBAQAogCiBzdHJ1Y3QgbHByb2Nmc19zdGF0cyAqb2JkX21lbW9yeSA9IE5VTEw7CiBFWFBPUlRfU1lNQk9MKG9iZF9tZW1vcnkpOwotLyogcmVmaW5lIGxhdGVyIGFuZCBjaGFuZ2UgdG8gc2VxbG9jayBvciBzaW1sYXIgZnJvbSBsaWJjZnMgKi8KKy8qIHJlZmluZSBsYXRlciBhbmQgY2hhbmdlIHRvIHNlcWxvY2sgb3Igc2ltaWxhciBmcm9tIGxpYmNmcyAqLwogCiAvKiBEZWJ1Z2dpbmcgY2hlY2sgb25seSBuZWVkZWQgZHVyaW5nIGRldmVsb3BtZW50ICovCiAjaWZkZWYgT0JEX0NUWFRfREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaAppbmRleCA1MDY5ODI5Li5jNzhiZjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCB2b2lkICpsbW0sIGludCBsbW1zaXplLAogCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXEsIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpOwogCi1pbnQgbWRjX3Jlc291cmNlX2dldF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAoraW50IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKIAkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpjYW5jZWxzLCBsZGxtX21vZGVfdCBtb2RlLAogCQkJICAgIF9fdTY0IGJpdHMpOwogLyogbWRjL21kY19yZXF1ZXN0LmMgKi8KQEAgLTEyMiw3ICsxMjIsNyBAQAogCiBpbnQgbWRjX3NldF9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoLAotCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKm9wZW5fcmVxKTsKKwkJCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KTsKIAogaW50IG1kY19jbGVhcl9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMKaW5kZXggOTFmNjg3Ni4uNWI5ZjM3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAlpZiAoZmxhZ3MgJiBGTU9ERV9FWEVDKQogCQljcl9mbGFncyB8PSBNRFNfRk1PREVfRVhFQzsKICNlbmRpZgotCWlmIChmbGFncyAmIE9fTE9WX0RFTEFZX0NSRUFURSkKKwlpZiAoY2xfaXNfbG92X2RlbGF5X2NyZWF0ZShmbGFncykpCiAJCWNyX2ZsYWdzIHw9IE1EU19PUEVOX0RFTEFZX0NSRUFURTsKIAogCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMKaW5kZXggOGFhN2M4MC4uNTMwMjJlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYwpAQCAtMzcsMTUgKzM3LDE1IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX01EQwogCiAjIGluY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotIyBpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jIGluY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KIAotI2luY2x1ZGUgPGx1c3RyZV9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9sdXN0cmVfaW50ZW50Lmg+CisjaW5jbHVkZSA8b2JkLmg+CiAjaW5jbHVkZSA8b2JkX2NsYXNzLmg+CiAjaW5jbHVkZSA8bHVzdHJlX2RsbS5oPgotLyogZmlkX3Jlc19uYW1lX2VxKCkgKi8KLSNpbmNsdWRlIDxsdXN0cmVfZmlkLmg+Ci0jaW5jbHVkZSA8bHByb2Nmc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxsdXN0cmVfZmlkLmg+IC8qIGZpZF9yZXNfbmFtZV9lcSgpICovCisjaW5jbHVkZSA8bHVzdHJlX21kYy5oPgorI2luY2x1ZGUgPGx1c3RyZV9uZXQuaD4KKyNpbmNsdWRlIDxsdXN0cmVfcmVxX2xheW91dC5oPgogI2luY2x1ZGUgIm1kY19pbnRlcm5hbC5oIgogCiBzdHJ1Y3QgbWRjX2dldGF0dHJfYXJncyB7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrOwogCXN0cnVjdCBpbm9kZSAqbmV3X2lub2RlID0gZGF0YTsKIAotCWlmKGJpdHMpCisJaWYgKGJpdHMpCiAJCSpiaXRzID0gMDsKIAogCWlmICghKmxvY2toKQpAQCAtMTYwLDYgKzE2MCw4IEBACiAJbGRsbV9tb2RlX3QgcmM7CiAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgJnJlc19pZCk7CisJLyogTFUtNDQwNTogQ2xlYXIgYml0cyBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlciAqLworCXBvbGljeS0+bF9pbm9kZWJpdHMuYml0cyAmPSBleHBfY29ubmVjdF9pYml0cyhleHApOwogCXJjID0gbGRsbV9sb2NrX21hdGNoKGNsYXNzX2V4cDJvYmQoZXhwKS0+b2JkX25hbWVzcGFjZSwgZmxhZ3MsCiAJCQkgICAgICZyZXNfaWQsIHR5cGUsIHBvbGljeSwgbW9kZSwgbG9ja2gsIDApOwogCXJldHVybiByYzsKQEAgLTE5NCw3ICsxOTYsNyBAQAogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZmlkLCAmcmVzX2lkKTsKIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCAmcmVzX2lkLCAwLCAwKTsKLQlpZihyZXMgPT0gTlVMTCkKKwlpZiAocmVzID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJbG9ja19yZXMocmVzKTsKQEAgLTMzNCw5ICszMzYsOSBAQAogCQkJICAgICBtYXgobG1tc2l6ZSwgb2JkZGV2LT51LmNsaS5jbF9kZWZhdWx0X21kc19lYXNpemUpKTsKIAogCXJjID0gbGRsbV9wcmVwX2VucXVldWVfcmVxKGV4cCwgcmVxLCAmY2FuY2VscywgY291bnQpOwotCWlmIChyYykgeworCWlmIChyYyA8IDApIHsKIAkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIocmMpOwogCX0KIAogCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKQEAgLTM3OCwxMyArMzgwLDYgQEAKIAogCW1kY19zZXRfY2FwYV9zaXplKHJlcSwgJlJNRl9DQVBBMSwgb3BfZGF0YS0+b3BfY2FwYTEpOwogCi0JaWYgKGl0LT5pdF9vcCA9PSBJVF9TRVRYQVRUUikKLQkJLyogSWYgd2Ugd2FudCB0byB1cGdyYWRlIHRvIExDS19QVywgbGV0J3MgY2FuY2VsIExDS19QUgotCQkgKiBsb2NrcyBub3cuIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IEFTVHMuICovCi0JCWNvdW50ID0gbWRjX3Jlc291cmNlX2dldF91bnVzZWQoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMSwKLQkJCQkJCSZjYW5jZWxzLCBMQ0tfUFcsCi0JCQkJCQlNRFNfSU5PREVMT0NLX1hBVFRSKTsKLQogCXJjID0gbGRsbV9wcmVwX2VucXVldWVfcmVxKGV4cCwgcmVxLCAmY2FuY2VscywgY291bnQpOwogCWlmIChyYykgewogCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7CkBAIC02NDYsNyArNjQxLDcgQEAKIAkJCSAqIGhhcHBlbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgc3dhYmJpbmcgYmVsb3csIG5ldyByZXBseQogCQkJICogaXMgc3dhYmJlZCBieSB0aGF0IGhhbmRsZXIgY29ycmVjdGx5LgogCQkJICovCi0JCQltZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoTlVMTCwgTlVMTCwgcmVxKTsKKwkJCW1kY19zZXRfb3Blbl9yZXBsYXlfZGF0YShOVUxMLCBOVUxMLCBpdCk7CiAJCX0KIAogCQlpZiAoKGJvZHktPnZhbGlkICYgKE9CRF9NRF9GTERJUkVBIHwgT0JEX01EX0ZMRUFTSVpFKSkgIT0gMCkgewpAQCAtNzU4LDYgKzc1Myw3IEBACiAJCS8qIGluc3RhbGwgbHZiX2RhdGEgKi8KIAkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAJCWlmIChsb2NrLT5sX2x2Yl9kYXRhID09IE5VTEwpIHsKKwkJCWxvY2stPmxfbHZiX3R5cGUgPSBMVkJfVF9MQVlPVVQ7CiAJCQlsb2NrLT5sX2x2Yl9kYXRhID0gbG1tOwogCQkJbG9jay0+bF9sdmJfbGVuID0gbHZiX2xlbjsKIAkJCWxtbSA9IE5VTEw7CkBAIC04NDIsNyArODM4LDcgQEAKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJcmVxID0gbWRjX2ludGVudF9sYXlvdXRfcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAkJbHZiX3R5cGUgPSBMVkJfVF9MQVlPVVQ7Ci0JfSBlbHNlIGlmIChpdC0+aXRfb3AgJiAoSVRfR0VUWEFUVFIgfCBJVF9TRVRYQVRUUikpIHsKKwl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX0dFVFhBVFRSKSB7CiAJCXJlcSA9IG1kY19pbnRlbnRfZ2V0eGF0dHJfcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAl9IGVsc2UgewogCQlMQlVHKCk7CkBAIC04ODAsNyArODc2LDcgQEAKIAlyYyA9IGxkbG1fY2xpX2VucXVldWUoZXhwLCAmcmVxLCBlaW5mbywgJnJlc19pZCwgcG9saWN5LCAmZmxhZ3MsIE5VTEwsCiAJCQkgICAgICAwLCBsdmJfdHlwZSwgbG9ja2gsIDApOwogCWlmICghaXQpIHsKLQkJLyogRm9yIGZsb2NrIHJlcXVlc3RzIHdlIGltbWVkaWF0ZWxseSByZXR1cm4gd2l0aG91dCBmdXJ0aGVyCisJCS8qIEZvciBmbG9jayByZXF1ZXN0cyB3ZSBpbW1lZGlhdGVseSByZXR1cm4gd2l0aG91dCBmdXJ0aGVyCiAJCSAgIGRlbGF5IGFuZCBsZXQgY2FsbGVyIGRlYWwgd2l0aCB0aGUgcmVzdCwgc2luY2UgcmVzdCBvZgogCQkgICB0aGlzIGZ1bmN0aW9uIG1ldGFkYXRhIHByb2Nlc3NpbmcgbWFrZXMgbm8gc2Vuc2UgZm9yIGZsb2NrCiAJCSAgIHJlcXVlc3RzIGFueXdheS4gQnV0IGluIGNhc2Ugb2YgcHJvYmxlbSBkdXJpbmcgY29tbXMgd2l0aApAQCAtOTczLDcgKzk2OSw2IEBACiAJaWYgKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSAmJgogCSAgICBpdC0+aXRfY3JlYXRlX21vZGUgJiBNX0NIRUNLX1NUQUxFICYmCiAJICAgIGl0LT5pdF9vcCAhPSBJVF9HRVRBVFRSKSB7Ci0JCWl0X3NldF9kaXNwb3NpdGlvbihpdCwgRElTUF9FTlFfQ09NUExFVEUpOwogCiAJCS8qIEFsc286IGRpZCB3ZSBmaW5kIHRoZSBzYW1lIGlub2RlPyAqLwogCQkvKiBzZXZlciBjYW4gcmV0dXJuIG9uZSBvZiB0d28gZmlkczoKQEAgLTEwNjgsNyArMTA2MywyMyBAQAogCQlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgJnJlc19pZCk7CiAJCXN3aXRjaCAoaXQtPml0X29wKSB7CiAJCWNhc2UgSVRfR0VUQVRUUjoKLQkJCXBvbGljeS5sX2lub2RlYml0cy5iaXRzID0gTURTX0lOT0RFTE9DS19VUERBVEU7CisJCQkvKiBGaWxlIGF0dHJpYnV0ZXMgYXJlIGhlbGQgdW5kZXIgbXVsdGlwbGUgYml0czoKKwkJCSAqIG5saW5rIGlzIHVuZGVyIGxvb2t1cCBsb2NrLCBzaXplIGFuZCB0aW1lcyBhcmUKKwkJCSAqIHVuZGVyIFVQREFURSBsb2NrIGFuZCByZWNlbnRseSB3ZSd2ZSBhbHNvIGdvdAorCQkJICogYSBzZXBhcmF0ZSBwZXJtaXNzaW9ucyBsb2NrIGZvciBvd25lci9ncm91cC9hY2wgdGhhdAorCQkJICogd2VyZSBwcm90ZWN0ZWQgYnkgbG9va3VwIGxvY2sgYmVmb3JlLgorCQkJICogR2V0YXR0ciBtdXN0IHByb3ZpZGUgYWxsIG9mIHRoYXQgaW5mb3JtYXRpb24sCisJCQkgKiBzbyB3ZSBuZWVkIHRvIGVuc3VyZSB3ZSBoYXZlIGFsbCBvZiB0aG9zZSBsb2Nrcy4KKwkJCSAqIFVuZm9ydHVuYXRlbHksIGlmIHRoZSBiaXRzIGFyZSBzcGxpdCBhY3Jvc3MgbXVsdGlwbGUKKwkJCSAqIGxvY2tzLCB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIG1hdGNoIGFsbCBvZiB0aGVtIGhlcmUsCisJCQkgKiBzbyBhbiBleHRyYSBSUEMgd291bGQgYmUgcGVyZm9ybWVkIHRvIGZldGNoIGFsbAorCQkJICogb2YgdGhvc2UgYml0cyBhdCBvbmNlIGZvciBub3cuICovCisJCQkvKiBGb3IgbmV3IE1EVHMoPiAyLjQpLCBVUERBVEV8UEVSTSBzaG91bGQgYmUgZW5vdWdoLAorCQkJICogYnV0IGZvciBvbGQgTURUcyAoPCAyLjQpLCBwZXJtaXNzaW9uIGlzIGNvdmVyZWQKKwkJCSAqIGJ5IExPT0tVUCBsb2NrLCBzbyBpdCBuZWVkcyB0byBtYXRjaCBhbGwgYml0cyBoZXJlLiovCisJCQlwb2xpY3kubF9pbm9kZWJpdHMuYml0cyA9IE1EU19JTk9ERUxPQ0tfVVBEQVRFIHwKKwkJCQkJCSAgTURTX0lOT0RFTE9DS19MT09LVVAgfAorCQkJCQkJICBNRFNfSU5PREVMT0NLX1BFUk07CiAJCQlicmVhazsKIAkJY2FzZSBJVF9MQVlPVVQ6CiAJCQlwb2xpY3kubF9pbm9kZWJpdHMuYml0cyA9IE1EU19JTk9ERUxPQ0tfTEFZT1VUOwpAQCAtMTA3NywxMCArMTA4OCwxMSBAQAogCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX0xPT0tVUDsKIAkJCWJyZWFrOwogCQl9Ci0JCW1vZGUgPSBsZGxtX2xvY2tfbWF0Y2goZXhwLT5leHBfb2JkLT5vYmRfbmFtZXNwYWNlLAotCQkJCSAgICAgICBMRExNX0ZMX0JMT0NLX0dSQU5URUQsICZyZXNfaWQsCisKKwkJbW9kZSA9IG1kY19sb2NrX21hdGNoKGV4cCwgTERMTV9GTF9CTE9DS19HUkFOVEVELCBmaWQsCiAJCQkJICAgICAgIExETE1fSUJJVFMsICZwb2xpY3ksCi0JCQkJICAgICAgIExDS19DUnxMQ0tfQ1d8TENLX1BSfExDS19QVywgJmxvY2toLCAwKTsKKwkJCQkgICAgICBMQ0tfQ1IgfCBMQ0tfQ1cgfCBMQ0tfUFIgfCBMQ0tfUFcsCisJCQkJICAgICAgJmxvY2toKTsKIAl9CiAKIAlpZiAobW9kZSkgewpAQCAtMTEyNyw2ICsxMTM5LDEyIEBACiAJCSAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkgICAgX191NjQgZXh0cmFfbG9ja19mbGFncykKIHsKKwlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gZWluZm8gPSB7CisJCS5laV90eXBlCT0gTERMTV9JQklUUywKKwkJLmVpX21vZGUJPSBpdF90b19sb2NrX21vZGUoaXQpLAorCQkuZWlfY2JfYmwJPSBjYl9ibG9ja2luZywKKwkJLmVpX2NiX2NwCT0gbGRsbV9jb21wbGV0aW9uX2FzdCwKKwl9OwogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toOwogCWludCByYyA9IDA7CiAKQEAgLTExNTIsNDIgKzExNzAsMTkgQEAKIAkJCXJldHVybiByYzsKIAl9CiAKLQkvKiBsb29rdXBfaXQgbWF5IGJlIGNhbGxlZCBvbmx5IGFmdGVyIHJldmFsaWRhdGVfaXQgaGFzIHJ1biwgYmVjYXVzZQotCSAqIHJldmFsaWRhdGVfaXQgY2Fubm90IHJldHVybiBlcnJvcnMsIG9ubHkgemVyby4gIFJldHVybmluZyB6ZXJvIGNhdXNlcwotCSAqIHRoaXMgY2FsbCB0byBsb29rdXAsIHdoaWNoICpjYW4qIHJldHVybiBhbiBlcnJvci4KLQkgKgotCSAqIFdlIG9ubHkgd2FudCB0byBleGVjdXRlIHRoZSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZW50IG9uZQotCSAqIHRpbWUsIGhvd2V2ZXIsIHNvIGRvbid0IHNlbmQgdGhlIHJlcXVlc3QgYWdhaW4uICBJbnN0ZWFkLCBza2lwIHBhc3QKLQkgKiB0aGlzIGFuZCB1c2UgdGhlIHJlcXVlc3QgZnJvbSByZXZhbGlkYXRlLiAgSW4gdGhpcyBjYXNlLCByZXZhbGlkYXRlCi0JICogbmV2ZXIgZHJvcHBlZCBpdHMgcmVmZXJlbmNlLCBzbyB0aGUgcmVmY291bnRzIGFyZSBhbGwgT0sgKi8KLQlpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0VOUV9DT01QTEVURSkpIHsKLQkJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvIGVpbmZvID0gewotCQkJLmVpX3R5cGUJPSBMRExNX0lCSVRTLAotCQkJLmVpX21vZGUJPSBpdF90b19sb2NrX21vZGUoaXQpLAotCQkJLmVpX2NiX2JsCT0gY2JfYmxvY2tpbmcsCi0JCQkuZWlfY2JfY3AJPSBsZGxtX2NvbXBsZXRpb25fYXN0LAotCQl9OwotCi0JCS8qIEZvciBjYXNlIGlmIHVwcGVyIGxheWVyIGRpZCBub3QgYWxsb2MgZmlkLCBkbyBpdCBub3cuICovCi0JCWlmICghZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmIGl0LT5pdF9vcCAmIElUX0NSRUFUKSB7Ci0JCQlyYyA9IG1kY19maWRfYWxsb2MoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJQ0VSUk9SKCJDYW4ndCBhbGxvYyBuZXcgZmlkLCByYyAlZFxuIiwgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJfQotCQlyYyA9IG1kY19lbnF1ZXVlKGV4cCwgJmVpbmZvLCBpdCwgb3BfZGF0YSwgJmxvY2toLAotCQkJCSBsbW0sIGxtbXNpemUsIE5VTEwsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCQlpZiAocmMgPCAwKQorCS8qIEZvciBjYXNlIGlmIHVwcGVyIGxheWVyIGRpZCBub3QgYWxsb2MgZmlkLCBkbyBpdCBub3cuICovCisJaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYgaXQtPml0X29wICYgSVRfQ1JFQVQpIHsKKwkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlpZiAocmMgPCAwKSB7CisJCQlDRVJST1IoIkNhbid0IGFsbG9jIG5ldyBmaWQsIHJjICVkXG4iLCByYyk7CiAJCQlyZXR1cm4gcmM7Ci0JfSBlbHNlIGlmICghZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpIHx8Ci0JCSAgICEoaXQtPml0X2NyZWF0ZV9tb2RlICYgTV9DSEVDS19TVEFMRSkpIHsKLQkJLyogRElTUF9FTlFfQ09NUExFVEUgc2V0IG1lYW5zIHRoZXJlIGlzIGV4dHJhIHJlZmVyZW5jZSBvbgotCQkgKiByZXF1ZXN0IHJlZmVyZW5jZWQgZnJvbSB0aGlzIGludGVudCwgc2F2ZWQgZm9yIHN1YnNlcXVlbnQKLQkJICogbG9va3VwLiAgVGhpcyBwYXRoIGlzIGV4ZWN1dGVkIHdoZW4gd2UgcHJvY2VlZCB0byB0aGlzCi0JCSAqIGxvb2t1cCwgc28gd2UgY2xlYXIgRElTUF9FTlFfQ09NUExFVEUgKi8KLQkJaXRfY2xlYXJfZGlzcG9zaXRpb24oaXQsIERJU1BfRU5RX0NPTVBMRVRFKTsKKwkJfQogCX0KKwlyYyA9IG1kY19lbnF1ZXVlKGV4cCwgJmVpbmZvLCBpdCwgb3BfZGF0YSwgJmxvY2toLCBsbW0sIGxtbXNpemUsIE5VTEwsCisJCQkgZXh0cmFfbG9ja19mbGFncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCiAJKnJlcXAgPSBpdC0+ZC5sdXN0cmUuaXRfZGF0YTsKIAlyYyA9IG1kY19maW5pc2hfaW50ZW50X2xvY2soZXhwLCAqcmVxcCwgb3BfZGF0YSwgaXQsICZsb2NraCk7CiAJcmV0dXJuIHJjOwpAQCAtMTI2OSw4ICsxMjY0LDggQEAKIAogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoJm9wX2RhdGEtPm9wX2ZpZDEsICZyZXNfaWQpOwogCXJlcSA9IG1kY19pbnRlbnRfZ2V0YXR0cl9wYWNrKGV4cCwgaXQsIG9wX2RhdGEpOwotCWlmICghcmVxKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoSVNfRVJSKHJlcSkpCisJCXJldHVybiBQVFJfRVJSKHJlcSk7CiAKIAlyYyA9IG1kY19lbnRlcl9yZXF1ZXN0KCZvYmRkZXYtPnUuY2xpKTsKIAlpZiAocmMgIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jCmluZGV4IDlmM2EzNDUuLmQ3OWFhMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMKQEAgLTY2LDcgKzY2LDcgQEAKIC8qIEZpbmQgYW5kIGNhbmNlbCBsb2NhbGx5IGxvY2tzIG1hdGNoZWQgYnkgaW5vZGUgQGJpdHMgJiBAbW9kZSBpbiB0aGUgcmVzb3VyY2UKICAqIGZvdW5kIGJ5IEBmaWQuIEZvdW5kIGxvY2tzIGFyZSBhZGRlZCBpbnRvIEBjYW5jZWwgbGlzdC4gUmV0dXJucyB0aGUgYW1vdW50IG9mCiAgKiBsb2NrcyBhZGRlZCB0byBAY2FuY2VscyBsaXN0LiAqLwotaW50IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKK2ludCBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCiAJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqY2FuY2VscywgbGRsbV9tb2RlX3QgbW9kZSwKIAkJCSAgICBfX3U2NCBiaXRzKQogewpAQCAtMTY1LDYgKzE2NSw3IEBACiAJCQlyZXEtPnJxX2NiX2RhdGEgPSAqbW9kOwogCQkJKCptb2QpLT5tb2Rfb3Blbl9yZXEgPSByZXE7CiAJCQlyZXEtPnJxX2NvbW1pdF9jYiA9IG1kY19jb21taXRfb3BlbjsKKwkJCSgqbW9kKS0+bW9kX2lzX2NyZWF0ZSA9IHRydWU7CiAJCQkvKioKIAkJCSAqIFRha2UgYW4gZXh0cmEgcmVmZXJlbmNlIG9uIFx2YXIgbW9kLCBpdCBwcm90ZWN0cyBcdmFyCiAJCQkgKiBtb2QgZnJvbSBiZWluZyBmcmVlZCBvbiBldmljdGlvbiAoY29tbWl0IGNhbGxiYWNrIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCmluZGV4IDgzMDEzOTIuLmJkZTlmOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCkBAIC0zNTUsMTAgKzM1NSwzMiBAQAogCQkJCSAgICAgaW5wdXRfc2l6ZSk7CiAJfQogCi0JcmMgPSBwdGxycGNfcmVxdWVzdF9wYWNrKHJlcSwgTFVTVFJFX01EU19WRVJTSU9OLCBvcGNvZGUpOwotCWlmIChyYykgewotCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7Ci0JCXJldHVybiByYzsKKwkvKiBGbHVzaCBsb2NhbCBYQVRUUiBsb2NrcyB0byBnZXQgcmlkIG9mIGEgcG9zc2libGUgY2FuY2VsIFJQQyAqLworCWlmIChvcGNvZGUgPT0gTURTX1JFSU5UICYmIGZpZF9pc19zYW5lKGZpZCkgJiYKKwkgICAgZXhwLT5leHBfY29ubmVjdF9kYXRhLm9jZF9pYml0c19rbm93biAmIE1EU19JTk9ERUxPQ0tfWEFUVFIpIHsKKwkJTElTVF9IRUFEKGNhbmNlbHMpOworCQlpbnQgY291bnQ7CisKKwkJLyogV2l0aG91dCB0aGF0IHBhY2tpbmcgd291bGQgZmFpbCAqLworCQlpZiAoaW5wdXRfc2l6ZSA9PSAwKQorCQkJcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgJlJNRl9FQURBVEEsCisJCQkJCSAgICAgUkNMX0NMSUVOVCwgMCk7CisKKwkJY291bnQgPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsIGZpZCwKKwkJCQkJCSZjYW5jZWxzLCBMQ0tfRVgsCisJCQkJCQlNRFNfSU5PREVMT0NLX1hBVFRSKTsKKworCQlyYyA9IG1kY19wcmVwX2VsY19yZXEoZXhwLCByZXEsIE1EU19SRUlOVCwgJmNhbmNlbHMsIGNvdW50KTsKKwkJaWYgKHJjKSB7CisJCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IHB0bHJwY19yZXF1ZXN0X3BhY2socmVxLCBMVVNUUkVfTURTX1ZFUlNJT04sIG9wY29kZSk7CisJCWlmIChyYykgeworCQkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOworCQkJcmV0dXJuIHJjOworCQl9CiAJfQogCiAJaWYgKG9wY29kZSA9PSBNRFNfUkVJTlQpIHsKQEAgLTcwMCwxMSArNzIyLDEyIEBACiAKIGludCBtZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2gsCi0JCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqb3Blbl9yZXEpCisJCQkgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlzdHJ1Y3QgbWRfb3Blbl9kYXRhICAgKm1vZDsKIAlzdHJ1Y3QgbWR0X3JlY19jcmVhdGUgKnJlYzsKIAlzdHJ1Y3QgbWR0X2JvZHkgICAgICAgKmJvZHk7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSA9IGl0LT5kLmx1c3RyZS5pdF9kYXRhOwogCXN0cnVjdCBvYmRfaW1wb3J0ICAgICAqaW1wID0gb3Blbl9yZXEtPnJxX2ltcG9ydDsKIAogCWlmICghb3Blbl9yZXEtPnJxX3JlcGxheSkKQEAgLTczOCw2ICs3NjEsOCBAQAogCQlzcGluX2xvY2soJm9wZW5fcmVxLT5ycV9sb2NrKTsKIAkJb2NoLT5vY2hfbW9kID0gbW9kOwogCQltb2QtPm1vZF9vY2ggPSBvY2g7CisJCW1vZC0+bW9kX2lzX2NyZWF0ZSA9IGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX09QRU5fQ1JFQVRFKSB8fAorCQkJCSAgICAgaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfT1BFTl9TVFJJUEUpOwogCQltb2QtPm1vZF9vcGVuX3JlcSA9IG9wZW5fcmVxOwogCQlvcGVuX3JlcS0+cnFfY2JfZGF0YSA9IG1vZDsKIAkJb3Blbl9yZXEtPnJxX2NvbW1pdF9jYiA9IG1kY19jb21taXRfb3BlbjsKQEAgLTc1OCw2ICs3ODMsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWRjX2ZyZWVfb3BlbihzdHJ1Y3QgbWRfb3Blbl9kYXRhICptb2QpCit7CisJaW50IGNvbW1pdHRlZCA9IDA7CisKKwlpZiAobW9kLT5tb2RfaXNfY3JlYXRlID09IDAgJiYKKwkgICAgaW1wX2Nvbm5lY3RfZGlzcF9zdHJpcGUobW9kLT5tb2Rfb3Blbl9yZXEtPnJxX2ltcG9ydCkpCisJCWNvbW1pdHRlZCA9IDE7CisKKwlMQVNTRVJUKG1vZC0+bW9kX29wZW5fcmVxLT5ycV9yZXBsYXkgPT0gMCk7CisKKwlERUJVR19SRVEoRF9SUENUUkFDRSwgbW9kLT5tb2Rfb3Blbl9yZXEsICJmcmVlIG9wZW4gcmVxdWVzdFxuIik7CisKKwlwdGxycGNfcmVxdWVzdF9jb21taXR0ZWQobW9kLT5tb2Rfb3Blbl9yZXEsIGNvbW1pdHRlZCk7CisJaWYgKG1vZC0+bW9kX2Nsb3NlX3JlcSkKKwkJcHRscnBjX3JlcXVlc3RfY29tbWl0dGVkKG1vZC0+bW9kX2Nsb3NlX3JlcSwgY29tbWl0dGVkKTsKK30KKwogaW50IG1kY19jbGVhcl9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2gpCiB7CkBAIC03NzEsNiArODEzLDggQEAKIAkJcmV0dXJuIDA7CiAKIAlMQVNTRVJUKG1vZCAhPSBMUF9QT0lTT04pOworCUxBU1NFUlQobW9kLT5tb2Rfb3Blbl9yZXEgIT0gTlVMTCk7CisJbWRjX2ZyZWVfb3Blbihtb2QpOwogCiAJbW9kLT5tb2Rfb2NoID0gTlVMTDsKIAlvY2gtPm9jaF9tb2QgPSBOVUxMOwpAQCAtOTY5LDYgKzEwMTMsOSBAQAogCWlmIChtb2QpIHsKIAkJaWYgKHJjICE9IDApCiAJCQltb2QtPm1vZF9jbG9zZV9yZXEgPSBOVUxMOworCQlMQVNTRVJUKG1vZC0+bW9kX29wZW5fcmVxICE9IE5VTEwpOworCQltZGNfZnJlZV9vcGVuKG1vZCk7CisKIAkJLyogU2luY2Ugbm93LCBtb2QgaXMgYWNjZXNzZWQgdGhyb3VnaCBzZXRhdHRyIHJlcSBvbmx5LAogCQkgKiB0aHVzIERXIHJlcSBkb2VzIG5vdCBrZWVwIGEgcmVmZXJlbmNlIG9uIG1vZCBhbnltb3JlLiAqLwogCQlvYmRfbW9kX3B1dChtb2QpOwpAQCAtMTUyNyw4ICsxNTc0LDggQEAKIAlyYyA9IGxsb2dfY2F0X3Byb2Nlc3MoTlVMTCwgbGxoLCBjaGFuZ2Vsb2dfa2t1Y19jYiwgY3MsIDAsIDApOwogCiAJLyogU2VuZCBFT0Ygbm8gbWF0dGVyIHdoYXQgb3VyIHJlc3VsdCAqLwotCWlmICgoa3VjaCA9IGNoYW5nZWxvZ19rdWNfaGRyKGNzLT5jc19idWYsIHNpemVvZigqa3VjaCksCi0JCQkJICAgICAgY3MtPmNzX2ZsYWdzKSkpIHsKKwlrdWNoID0gY2hhbmdlbG9nX2t1Y19oZHIoY3MtPmNzX2J1Ziwgc2l6ZW9mKCprdWNoKSwgY3MtPmNzX2ZsYWdzKTsKKwlpZiAoa3VjaCkgewogCQlrdWNoLT5rdWNfbXNndHlwZSA9IENMX0VPRjsKIAkJbGliY2ZzX2trdWNfbXNnX3B1dChjcy0+Y3NfZnAsIGt1Y2gpOwogCX0KQEAgLTE2NTAsMTEgKzE2OTcsMTYgQEAKIAlpZiAocmMpCiAJCUNFUlJPUigicHRscnBjX3F1ZXVlX3dhaXQgZmFpbGVkLCByYzogJWRcbiIsIHJjKTsKIAotCWlmIChyZXEtPnJxX3JlcG1zZyAmJgotCSAgICAob3FjID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX09CRF9RVU9UQUNUTCkpKSB7Ci0JCSpvcWN0bCA9ICpvcWM7CisJaWYgKHJlcS0+cnFfcmVwbXNnKSB7CisJCW9xYyA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9PQkRfUVVPVEFDVEwpOworCQlpZiAob3FjKSB7CisJCQkqb3FjdGwgPSAqb3FjOworCQl9IGVsc2UgaWYgKCFyYykgeworCQkJQ0VSUk9SICgiQ2FuJ3QgdW5wYWNrIG9iZF9xdW90YWN0bFxuIik7CisJCQlyYyA9IC1FUFJPVE87CisJCX0KIAl9IGVsc2UgaWYgKCFyYykgewotCQlDRVJST1IgKCJDYW4ndCB1bnBhY2sgb2JkX3F1b3RhY3RsXG4iKTsKKwkJQ0VSUk9SKCJDYW4ndCB1bnBhY2sgb2JkX3F1b3RhY3RsXG4iKTsKIAkJcmMgPSAtRVBST1RPOwogCX0KIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jCmluZGV4IDNiZGJiOTQuLmRlOWZiMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jCkBAIC01Niw3ICs1Niw3IEBACiB7CiAJX191NjQgcmVzbmFtZSA9IDA7CiAKLQlpZiAobGVuID4gOCkgeworCWlmIChsZW4gPiBzaXplb2YocmVzbmFtZSkpIHsKIAkJQ0VSUk9SKCJuYW1lIHRvbyBsb25nOiAlc1xuIiwgbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTc2LDYgKzc2LDcgQEAKIAkJcmVzbmFtZSA9IDA7CiAJCWJyZWFrOwogCWNhc2UgQ09ORklHX1RfUkVDT1ZFUjoKKwljYXNlIENPTkZJR19UX1BBUkFNUzoKIAkJcmVzbmFtZSA9IHR5cGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMDEsMTAgKzEwMiwxMyBAQAogCWludCBsZW47CiAKIAkvKiBsb2duYW1lIGNvbnNpc3RzIG9mICJmc25hbWUtbm9kZXR5cGUiLgotCSAqIGUuZy4gImx1c3RyZS1NRFQwMDAxIiwgIlNVTi0wMDAtY2xpZW50IiAqLworCSAqIGUuZy4gImx1c3RyZS1NRFQwMDAxIiwgIlNVTi0wMDAtY2xpZW50IgorCSAqIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbjogbGxvZyAicGFyYW1zIiAqLwogCW5hbWVfZW5kID0gc3RycmNocihsb2duYW1lLCAnLScpOwotCUxBU1NFUlQobmFtZV9lbmQpOwotCWxlbiA9IG5hbWVfZW5kIC0gbG9nbmFtZTsKKwlpZiAoIW5hbWVfZW5kKQorCQlsZW4gPSBzdHJsZW4obG9nbmFtZSk7CisJZWxzZQorCQlsZW4gPSBuYW1lX2VuZCAtIGxvZ25hbWU7CiAJcmV0dXJuIG1nY19uYW1lMnJlc2lkKGxvZ25hbWUsIGxlbiwgcmVzX2lkLCB0eXBlKTsKIH0KIApAQCAtMTQwLDYgKzE0NCw4IEBACiAJCQljb25maWdfbG9nX3B1dChjbGQtPmNsZF9yZWNvdmVyKTsKIAkJaWYgKGNsZC0+Y2xkX3NwdGxycGMpCiAJCQljb25maWdfbG9nX3B1dChjbGQtPmNsZF9zcHRscnBjKTsKKwkJaWYgKGNsZC0+Y2xkX3BhcmFtcykKKwkJCWNvbmZpZ19sb2dfcHV0KGNsZC0+Y2xkX3BhcmFtcyk7CiAJCWlmIChjbGRfaXNfc3B0bHJwYyhjbGQpKQogCQkJc3B0bHJwY19jb25mX2xvZ19zdG9wKGNsZC0+Y2xkX2xvZ25hbWUpOwogCkBAIC0yNzEsNiArMjc3LDE5IEBACiAJcmV0dXJuIGNsZDsKIH0KIAorc3RhdGljIHN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpjb25maWdfcGFyYW1zX2xvZ19hZGQoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwKKwlzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UgKmNmZywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UJbGNmZyA9ICpjZmc7CisJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEJCSpjbGQ7CisKKwlsY2ZnLmNmZ19pbnN0YW5jZSA9IHNiOworCisJY2xkID0gZG9fY29uZmlnX2xvZ19hZGQob2JkLCBQQVJBTVNfRklMRU5BTUUsIENPTkZJR19UX1BBUkFNUywKKwkJCQkmbGNmZywgc2IpOworCisJcmV0dXJuIGNsZDsKK30KIAogLyoqIEFkZCB0aGlzIGxvZyB0byB0aGUgbGlzdCBvZiBhY3RpdmUgbG9ncyB3YXRjaGVkIGJ5IGFuIE1HQy4KICAqIEFjdGl2ZSBtZWFucyB3ZSdyZSB3YXRjaGluZyBmb3IgdXBkYXRlcy4KQEAgLTI4NCw4ICszMDMsMTAgQEAKIAlzdHJ1Y3QgbHVzdHJlX3NiX2luZm8gKmxzaSA9IHMybHNpKHNiKTsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqY2xkOwogCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpzcHRscnBjX2NsZDsKLQljaGFyCQkgICAgIHNlY2xvZ25hbWVbMzJdOwotCWNoYXIJCSAgICAqcHRyOworCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpwYXJhbXNfY2xkOworCWNoYXIJCQlzZWNsb2duYW1lWzMyXTsKKwljaGFyCQkJKnB0cjsKKwlpbnQJCQlyYzsKIAogCUNERUJVRyhEX01HQywgImFkZGluZyBjb25maWcgbG9nICVzOiVwXG4iLCBsb2duYW1lLCBjZmctPmNmZ19pbnN0YW5jZSk7CiAKQEAgLTMwOCwzMiArMzI5LDQ5IEBACiAJCQkJCQlDT05GSUdfVF9TUFRMUlBDLCBOVUxMLCBOVUxMKTsKIAkJaWYgKElTX0VSUihzcHRscnBjX2NsZCkpIHsKIAkJCUNFUlJPUigiY2FuJ3QgY3JlYXRlIHNwdGxycGMgbG9nOiAlc1xuIiwgc2VjbG9nbmFtZSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihzcHRscnBjX2NsZCk7CisJCQlHT1RPKG91dF9lcnIsIHJjID0gUFRSX0VSUihzcHRscnBjX2NsZCkpOwogCQl9CiAJfQorCXBhcmFtc19jbGQgPSBjb25maWdfcGFyYW1zX2xvZ19hZGQob2JkLCBjZmcsIHNiKTsKKwlpZiAoSVNfRVJSKHBhcmFtc19jbGQpKSB7CisJCXJjID0gUFRSX0VSUihwYXJhbXNfY2xkKTsKKwkJQ0VSUk9SKCIlczogY2FuJ3QgY3JlYXRlIHBhcmFtcyBsb2c6IHJjID0gJWRcbiIsCisJCSAgICAgICBvYmQtPm9iZF9uYW1lLCByYyk7CisJCUdPVE8ob3V0X2VycjEsIHJjKTsKKwl9CiAKIAljbGQgPSBkb19jb25maWdfbG9nX2FkZChvYmQsIGxvZ25hbWUsIENPTkZJR19UX0NPTkZJRywgY2ZnLCBzYik7CiAJaWYgKElTX0VSUihjbGQpKSB7CiAJCUNFUlJPUigiY2FuJ3QgY3JlYXRlIGxvZzogJXNcbiIsIGxvZ25hbWUpOwotCQljb25maWdfbG9nX3B1dChzcHRscnBjX2NsZCk7Ci0JCXJldHVybiBQVFJfRVJSKGNsZCk7CisJCUdPVE8ob3V0X2VycjIsIHJjID0gUFRSX0VSUihjbGQpKTsKIAl9CiAKIAljbGQtPmNsZF9zcHRscnBjID0gc3B0bHJwY19jbGQ7CisJY2xkLT5jbGRfcGFyYW1zID0gcGFyYW1zX2NsZDsKIAogCUxBU1NFUlQobHNpLT5sc2lfbG1kKTsKIAlpZiAoIShsc2ktPmxzaV9sbWQtPmxtZF9mbGFncyAmIExNRF9GTEdfTk9JUikpIHsKIAkJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKnJlY292ZXJfY2xkOwogCQkqc3RycmNocihzZWNsb2duYW1lLCAnLScpID0gMDsKIAkJcmVjb3Zlcl9jbGQgPSBjb25maWdfcmVjb3Zlcl9sb2dfYWRkKG9iZCwgc2VjbG9nbmFtZSwgY2ZnLCBzYik7Ci0JCWlmIChJU19FUlIocmVjb3Zlcl9jbGQpKSB7Ci0JCQljb25maWdfbG9nX3B1dChjbGQpOwotCQkJcmV0dXJuIFBUUl9FUlIocmVjb3Zlcl9jbGQpOwotCQl9CisJCWlmIChJU19FUlIocmVjb3Zlcl9jbGQpKQorCQkJR09UTyhvdXRfZXJyMywgcmMgPSBQVFJfRVJSKHJlY292ZXJfY2xkKSk7CiAJCWNsZC0+Y2xkX3JlY292ZXIgPSByZWNvdmVyX2NsZDsKIAl9CiAKIAlyZXR1cm4gMDsKKworb3V0X2VycjM6CisJY29uZmlnX2xvZ19wdXQoY2xkKTsKKworb3V0X2VycjI6CisJY29uZmlnX2xvZ19wdXQocGFyYW1zX2NsZCk7CisKK291dF9lcnIxOgorCWNvbmZpZ19sb2dfcHV0KHNwdGxycGNfY2xkKTsKKworb3V0X2VycjoKKwlyZXR1cm4gcmM7CiB9CiAKIERFRklORV9NVVRFWChsbG9nX3Byb2Nlc3NfbG9jayk7CkBAIC0zNDQsNiArMzgyLDcgQEAKIHsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqY2xkOwogCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpjbGRfc3B0bHJwYyA9IE5VTEw7CisJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZF9wYXJhbXMgPSBOVUxMOwogCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpjbGRfcmVjb3ZlciA9IE5VTEw7CiAJaW50IHJjID0gMDsKIApAQCAtMzgyLDExICs0MjEsMjAgQEAKIAlzcGluX2xvY2soJmNvbmZpZ19saXN0X2xvY2spOwogCWNsZF9zcHRscnBjID0gY2xkLT5jbGRfc3B0bHJwYzsKIAljbGQtPmNsZF9zcHRscnBjID0gTlVMTDsKKwljbGRfcGFyYW1zID0gY2xkLT5jbGRfcGFyYW1zOworCWNsZC0+Y2xkX3BhcmFtcyA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmNvbmZpZ19saXN0X2xvY2spOwogCiAJaWYgKGNsZF9zcHRscnBjKQogCQljb25maWdfbG9nX3B1dChjbGRfc3B0bHJwYyk7CiAKKwlpZiAoY2xkX3BhcmFtcykgeworCQltdXRleF9sb2NrKCZjbGRfcGFyYW1zLT5jbGRfbG9jayk7CisJCWNsZF9wYXJhbXMtPmNsZF9zdG9wcGluZyA9IDE7CisJCW11dGV4X3VubG9jaygmY2xkX3BhcmFtcy0+Y2xkX2xvY2spOworCQljb25maWdfbG9nX3B1dChjbGRfcGFyYW1zKTsKKwl9CisKIAkvKiBkcm9wIHRoZSByZWYgZnJvbSB0aGUgZmluZCAqLwogCWNvbmZpZ19sb2dfcHV0KGNsZCk7CiAJLyogZHJvcCB0aGUgc3RhcnQgcmVmICovCkBAIC0xNTg0LDcgKzE2MzIsNyBAQAogCS8qCiAJICogLSBjb3B5IGl0IHRvIGJhY2t1cCB1c2luZyBsbG9nX2JhY2t1cCgpCiAJICogLSBjb3B5IHJlbW90ZSBsbG9nIHRvIGxvZ25hbWUgdXNpbmcgbGxvZ19iYWNrdXAoKQotCSAqIC0gaWYgZmFpbGVkIHRoZW4gbW92ZSBiYWt1cCB0byBsb2duYW1lIGFnYWluCisJICogLSBpZiBmYWlsZWQgdGhlbiBtb3ZlIGJhY2t1cCB0byBsb2duYW1lIGFnYWluCiAJICovCiAKIAlPQkRfQUxMT0ModGVtcF9sb2csIHN0cmxlbihsb2duYW1lKSArIDEpOwpAQCAtMTY2NCw3ICsxNzEyLDcgQEAKIAkJCQlMQ09OU09MRV9FUlJPUl9NU0coMHgxM2EsCiAJCQkJCQkgICAiRmFpbGVkIHRvIGdldCBNR1MgbG9nICVzIGFuZCBubyBsb2NhbCBjb3B5LlxuIiwKIAkJCQkJCSAgIGNsZC0+Y2xkX2xvZ25hbWUpOwotCQkJCUdPVE8ob3V0X3BvcCwgcmMgPSAtRU5PVENPTk4pOworCQkJCUdPVE8ob3V0X3BvcCwgcmMgPSAtRU5PRU5UKTsKIAkJCX0KIAkJCUNERUJVRyhEX01HQywKIAkJCSAgICAgICAiRmFpbGVkIHRvIGdldCBNR1MgbG9nICVzLCB1c2luZyBsb2NhbCBjb3B5IGZvciBub3csIHdpbGwgdHJ5IHRvIHVwZGF0ZSBsYXRlci5cbiIsCkBAIC0xODYzLDYgKzE5MTEsMjAgQEAKIAkJCWlmIChyYykKIAkJCQlDRVJST1IoIkNhbm5vdCBwcm9jZXNzIHJlY292ZXIgbGxvZyAlZFxuIiwgcmMpOwogCQl9CisKKwkJaWYgKHJjID09IDAgJiYgY2xkLT5jbGRfcGFyYW1zICE9IE5VTEwpIHsKKwkJCXJjID0gbWdjX3Byb2Nlc3NfbG9nKG9iZCwgY2xkLT5jbGRfcGFyYW1zKTsKKwkJCWlmIChyYyA9PSAtRU5PRU5UKSB7CisJCQkJQ0RFQlVHKERfTUdDLAorCQkJCSAgICAgICAiVGhlcmUgaXMgbm8gcGFyYW1zIGNvbmZpZyBmaWxlIHlldFxuIik7CisJCQkJcmMgPSAwOworCQkJfQorCQkJLyogcGFyYW1zIGxvZyBpcyBvcHRpb25hbCAqLworCQkJaWYgKHJjKQorCQkJCUNFUlJPUigKKwkJCQkgICAgICAgIiVzOiBjYW4ndCBwcm9jZXNzIHBhcmFtcyBsbG9nOiByYyA9ICVkXG4iLAorCQkJCSAgICAgICBvYmQtPm9iZF9uYW1lLCByYyk7CisJCX0KIAkJY29uZmlnX2xvZ19wdXQoY2xkKTsKIAogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jCmluZGV4IGUwNDg1MDAuLjNiZWJjNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYwpAQCAtOTQyLDcgKzk0Miw3IEBACiAJc3RydWN0IGNsX3BhZ2UgKnBhZ2U7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlDRVJST1IoIkNhbmNlbGluZyBvbmdvaW5nIHBhZ2UgdHJhc21pc3Npb25cbiIpOworCUNFUlJPUigiQ2FuY2VsaW5nIG9uZ29pbmcgcGFnZSB0cmFuc21pc3Npb25cbiIpOwogCWNsX3BhZ2VfbGlzdF9mb3JfZWFjaChwYWdlLCBxdWV1ZSkgewogCQlpbnQgcmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2xvY2suYwppbmRleCA3NDllYjA4Li5kNzk1Y2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfbG9jay5jCkBAIC05MzIsNyArOTMyLDcgQEAKIAkJICogTFUtMzA1ICovCiAJCWJsb2NrZWQgPSBjZnNfYmxvY2tfc2lnc2ludihMVVNUUkVfRkFUQUxfU0lHUyk7CiAKLQkJaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdGVyKTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXRlciwgY3VycmVudCk7CiAJCWFkZF93YWl0X3F1ZXVlKCZsb2NrLT5jbGxfd3EsICZ3YWl0ZXIpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQljbF9sb2NrX211dGV4X3B1dChlbnYsIGxvY2spOwpAQCAtOTQzLDcgKzk0Myw3IEBACiAJCSAqIGNhbiBiZSByZXN0YXJ0ZWQgaWYgc2lnbmFscyBhcmUgcGVuZGluZyBoZXJlICovCiAJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKIAkJaWYgKGxpa2VseSghT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTE9DS19TVEFURV9XQUlUX0lOVFIpKSkgewotCQkJd2FpdHFfd2FpdCgmd2FpdGVyLCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGUoKTsKIAkJCWlmICghY2ZzX3NpZ25hbF9wZW5kaW5nKCkpCiAJCQkJcmVzdWx0ID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYwppbmRleCAxYTkyNjAzLi4wZmMyNTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYwpAQCAtNTA4LDcgKzUwOCw3IEBACiAgKiBhYm91dCBqb3VybmFsX2luZm8uIEN1cnJlbnRseSBmb2xsb3dpbmcgZmllbGRzIGluIHRhc2tfc3RydWN0IGFyZSBpZGVudGlmaWVkCiAgKiBjYW4gYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlOgogICogIC0gY2xfZW52OiBmb3IgbGlibHVzdHJlLgotICogIC0gdHV4X2luZm86IG9ueSBvbiBSZWRIYXQga2VybmVsLgorICogIC0gdHV4X2luZm86IG9ubHkgb24gUmVkSGF0IGtlcm5lbC4KICAqICAtIC4uLgogICogXG5vdGUgQXMgbG9uZyBhcyB3ZSB1c2UgdGFza19zdHJ1Y3QgdG8gc3RvcmUgY2xfZW52LCB3ZSBhc3N1bWUgdGhhdCBvbmNlCiAgKiBjYWxsZWQgaW50byBMdXN0cmUsIHdlJ2xsIG5ldmVyIGNhbGwgaW50byB0aGUgb3RoZXIgcGFydCBvZiB0aGUga2VybmVsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCmluZGV4IGQ5Zjc1MGQuLmYyYmRlYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCkBAIC0xMDEwLDYgKzEwMTAsOCBAQAogCUlOSVRfTElTVF9IRUFEKCZpbXAtPmltcF9yZXBsYXlfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmltcC0+aW1wX3NlbmRpbmdfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmltcC0+aW1wX2RlbGF5ZWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0KTsKKwlpbXAtPmltcF9yZXBsYXlfY3Vyc29yID0gJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0OwogCXNwaW5fbG9ja19pbml0KCZpbXAtPmltcF9sb2NrKTsKIAlpbXAtPmltcF9sYXN0X3N1Y2Nlc3NfY29ubiA9IDA7CiAJaW1wLT5pbXBfc3RhdGUgPSBMVVNUUkVfSU1QX05FVzsKQEAgLTE1MzIsOCArMTUzNCw4IEBACiAJc3Bpbl9sb2NrKCZvYmQtPm9iZF9kZXZfbG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZvYmQtPm9iZF91bmxpbmtlZF9leHBvcnRzKSkgewogCQlzcGluX3VubG9jaygmb2JkLT5vYmRfZGV2X2xvY2spOwotCQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUsCi0JCQkJCQkgICBjZnNfdGltZV9zZWNvbmRzKHdhaXRlZCkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcyh3YWl0ZWQpKTsKIAkJaWYgKHdhaXRlZCA+IDUgJiYgSVNfUE8yKHdhaXRlZCkpIHsKIAkJCUxDT05TT0xFX1dBUk4oIiVzIGlzIHdhaXRpbmcgZm9yIG9iZF91bmxpbmtlZF9leHBvcnRzICIKIAkJCQkgICAgICAibW9yZSB0aGFuICVkIHNlY29uZHMuICIKQEAgLTE2MjUsNyArMTYyNyw3IEBACiB9CiAKIC8qKgotICogQWRkIGV4cG9ydCB0byB0aGUgb2JkX3pvbWJlIHRocmVhZCBhbmQgbm90aWZ5IGl0LgorICogQWRkIGV4cG9ydCB0byB0aGUgb2JkX3pvbWJpZSB0aHJlYWQgYW5kIG5vdGlmeSBpdC4KICAqLwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9leHBvcnRfYWRkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApIHsKIAlzcGluX2xvY2soJmV4cC0+ZXhwX29iZC0+b2JkX2Rldl9sb2NrKTsKQEAgLTE2NDEsNyArMTY0Myw3IEBACiB9CiAKIC8qKgotICogQWRkIGltcG9ydCB0byB0aGUgb2JkX3pvbWJlIHRocmVhZCBhbmQgbm90aWZ5IGl0LgorICogQWRkIGltcG9ydCB0byB0aGUgb2JkX3pvbWJpZSB0aHJlYWQgYW5kIG5vdGlmeSBpdC4KICAqLwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9pbXBvcnRfYWRkKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApIHsKIAlMQVNTRVJUKGltcC0+aW1wX3NlYyA9PSBOVUxMKTsKQEAgLTE2NjEsNyArMTY2Myw3IEBACiBzdGF0aWMgdm9pZCBvYmRfem9tYmllX2ltcGV4cF9ub3RpZnkodm9pZCkKIHsKIAkvKgotCSAqIE1ha2Ugc3VyZSBvYmRfem9tZWJpZV9pbXBleHBfdGhyZWFkIGdldCB0aGlzIG5vdGlmaWNhdGlvbi4KKwkgKiBNYWtlIHN1cmUgb2JkX3pvbWJpZV9pbXBleHBfdGhyZWFkIGdldCB0aGlzIG5vdGlmaWNhdGlvbi4KIAkgKiBJdCBpcyBwb3NzaWJsZSB0aGlzIHNpZ25hbCBvbmx5IGdldCBieSBvYmRfem9tYmllX2JhcnJpZXIsIGFuZAogCSAqIGJhcnJpZXIgZ3VscHMgdGhpcyBub3RpZmljYXRpb24gYW5kIHNsZWVwcyBhd2F5IGFuZCBoYW5ncyBlbnN1ZXMKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggMTIxYTg1Ni4uYmEyMDc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCWludCBlcnIgPSAwOwogCiAJLyogQWxsb3cgbm9uLXJvb3QgYWNjZXNzIGZvciBPQkRfSU9DX1BJTkdfVEFSR0VUIC0gdXNlZCBieSBsZnMgY2hlY2sgKi8KLQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSAmJiAoY21kICE9IE9CRF9JT0NfUElOR19UQVJHRVQpKQorCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgJiYgKGNtZCAhPSBPQkRfSU9DX1BJTkdfVEFSR0VUKSkKIAkJcmV0dXJuIGVyciA9IC1FQUNDRVM7CiAJaWYgKChjbWQgJiAweGZmZmZmZjAwKSA9PSAoKGludCknVCcpIDw8IDgpIC8qIGlnbm9yZSBhbGwgdHR5IGlvY3RscyAqLwogCQlyZXR1cm4gZXJyID0gLUVOT1RUWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCmluZGV4IGMwZjNhZjcuLjFkOTk5MzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKQEAgLTU1MSw5ICs1NTEsOCBAQAogCiAJaWYgKHJlYy0+bHJoX2luZGV4IDwgZC0+bHBkX3N0YXJ0Y2F0KQogCQkvKiBTa2lwIHByb2Nlc3Npbmcgb2YgdGhlIGxvZ3MgdW50aWwgc3RhcnRjYXQgKi8KLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZC0+bHBkX3N0YXJ0aWR4ID4gMCkgeworCQlyYyA9IDA7CisJZWxzZSBpZiAoZC0+bHBkX3N0YXJ0aWR4ID4gMCkgewogCQlzdHJ1Y3QgbGxvZ19wcm9jZXNzX2NhdF9kYXRhIGNkOwogCiAJCWNkLmxwY2RfZmlyc3RfaWR4ID0gZC0+bHBkX3N0YXJ0aWR4OwpAQCAtNTY2LDYgKzU2NSw3IEBACiAJCXJjID0gbGxvZ19wcm9jZXNzX29yX2ZvcmsoZW52LCBsbGgsIGQtPmxwZF9jYiwgZC0+bHBkX2RhdGEsCiAJCQkJCSAgTlVMTCwgZmFsc2UpOwogCX0KKwogCWxsb2dfaGFuZGxlX3B1dChsbGgpOwogCiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19sdmZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2x2ZnMuYwppbmRleCA1Mzg1ZDhlLi5kODZiYjhjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19sdmZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19sdmZzLmMKQEAgLTM3Niw3ICszNzYsNyBAQAogCiAvKiBzZXRzOgogICogIC0gY3VyX29mZnNldCB0byB0aGUgZnVydGhlc3QgcG9pbnQgcmVhZCBpbiB0aGUgbG9nIGZpbGUKLSAqICAtIGN1cl9pZHggdG8gdGhlIGxvZyBpbmRleCBwcmVjZWVkaW5nIGN1cl9vZmZzZXQKKyAqICAtIGN1cl9pZHggdG8gdGhlIGxvZyBpbmRleCBwcmVjZWRpbmcgY3VyX29mZnNldAogICogcmV0dXJucyAtRUlPLy1FSU5WQUwgb24gZXJyb3IKICAqLwogc3RhdGljIGludCBsbG9nX2x2ZnNfbmV4dF9ibG9jayhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29zZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vc2QuYwppbmRleCA2NTRjOGUxLi42ODIyNzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb3NkLmMKQEAgLTUxNCw3ICs1MTQsNyBAQAogCiAvKiBzZXRzOgogICogIC0gY3VyX29mZnNldCB0byB0aGUgZnVydGhlc3QgcG9pbnQgcmVhZCBpbiB0aGUgbG9nIGZpbGUKLSAqICAtIGN1cl9pZHggdG8gdGhlIGxvZyBpbmRleCBwcmVjZWVkaW5nIGN1cl9vZmZzZXQKKyAqICAtIGN1cl9pZHggdG8gdGhlIGxvZyBpbmRleCBwcmVjZWRpbmcgY3VyX29mZnNldAogICogcmV0dXJucyAtRUlPLy1FSU5WQUwgb24gZXJyb3IKICAqLwogc3RhdGljIGludCBsbG9nX29zZF9uZXh0X2Jsb2NrKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKQEAgLTEwNzMsNyArMTA3Myw3IEBACiAJTEFTU0VSVChjdHh0KTsKIAogCS8qIGluaXRpYWxpemUgZGF0YSBhbGxvd2luZyB0byBnZW5lcmF0ZSBuZXcgZmlkcywKLQkgKiBsaXRlcmFsbHkgd2UgbmVlZCBhIHNlcXVlY2UgKi8KKwkgKiBsaXRlcmFsbHkgd2UgbmVlZCBhIHNlcXVlbmNlICovCiAJbGdpLT5sZ2lfZmlkLmZfc2VxID0gRklEX1NFUV9MTE9HOwogCWxnaS0+bGdpX2ZpZC5mX29pZCA9IDE7CiAJbGdpLT5sZ2lfZmlkLmZfdmVyID0gMDsKQEAgLTEyODAsNyArMTI4MCw3IEBACiAJbGdpLT5sZ2lfYnVmLmxiX2xlbiA9IHNpemU7CiAJcmMgPSBkdF9yZWNvcmRfd3JpdGUoZW52LCBvLCAmbGdpLT5sZ2lfYnVmLCAmbGdpLT5sZ2lfb2ZmLCB0aCk7CiAJaWYgKHJjKQotCQlDREVCVUcoRF9JTk9ERSwgImVycm9yIHdyaXRlaW5nIENBVEFMT0dTOiByYyA9ICVkXG4iLCByYyk7CisJCUNERUJVRyhEX0lOT0RFLCAiZXJyb3Igd3JpdGluZyBDQVRBTE9HUzogcmMgPSAlZFxuIiwgcmMpOwogb3V0X3RyYW5zOgogCWR0X3RyYW5zX3N0b3AoZW52LCBkLCB0aCk7CiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sb2NhbF9zdG9yYWdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sb2NhbF9zdG9yYWdlLmMKaW5kZXggZTc5ZTRiZS4uZTc2ZjdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbG9jYWxfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xvY2FsX3N0b3JhZ2UuYwpAQCAtNzM3LDcgKzczNyw3IEBACiAgKiBBbGwgZHluYW1pYyBmaWRzIHdpbGwgYmUgZ2VuZXJhdGVkIHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgYW5kIGluY3JlbWVudGVkCiAgKiBPSURzCiAgKgotICogUmV0dXJuZWQgbG9jYWxfb2lkX3N0b3JhZ2UgaXMgaW4tbWVtb3J5IHJlcHJlc2VudGFpb24gb2YgT0lEIHN0b3JhZ2UKKyAqIFJldHVybmVkIGxvY2FsX29pZF9zdG9yYWdlIGlzIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBPSUQgc3RvcmFnZQogICovCiBpbnQgbG9jYWxfb2lkX3N0b3JhZ2VfaW5pdChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBkdF9kZXZpY2UgKmRldiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpcnN0X2ZpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCmluZGV4IGVjM2I2MDUuLjE0MzJkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYwpAQCAtOTgsNiArOTgsOCBAQAogCSJsaWdodHdlaWdodF9jb25uIiwKIAkic2hvcnRfaW8iLAogCSJwaW5nbGVzcyIsCisJImZsb2NrX2RlYWRsb2NrIiwKKwkiZGlzcF9zdHJpcGUiLAogCSJ1bmtub3duIiwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdV9vYmplY3QuYwppbmRleCA5ODg3ZDhmLi45MmU4YTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdV9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdV9vYmplY3QuYwpAQCAtNTcxLDcgKzU3MSw3IEBACiAJICogZHJhaW5lZCksIGFuZCBtb3Jlb3ZlciwgbG9va3VwIGhhcyB0byB3YWl0IHVudGlsIG9iamVjdCBpcyBmcmVlZC4KIAkgKi8KIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQod2FpdGVyKTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSh3YWl0ZXIsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKCZia3QtPmxzYl9tYXJjaGVfZnVuZWJyZSwgd2FpdGVyKTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJbHByb2Nmc19jb3VudGVyX2luY3Iocy0+bHNfc3RhdHMsIExVX1NTX0NBQ0hFX0RFQVRIX1JBQ0UpOwpAQCAtNzEyLDcgKzcxMiw3IEBACiAJCSAqIGx1X29iamVjdF9maW5kX3RyeSgpIGFscmVhZHkgYWRkZWQgd2FpdGVyIGludG8gdGhlCiAJCSAqIHdhaXQgcXVldWUuCiAJCSAqLwotCQl3YWl0cV93YWl0KCZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAJCWJrdCA9IGx1X3NpdGVfYmt0X2Zyb21fZmlkKGRldi0+bGRfc2l0ZSwgKHZvaWQgKilmKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJmJrdC0+bHNiX21hcmNoZV9mdW5lYnJlLCAmd2FpdCk7CiAJfQpAQCAtODkwLDEwICs4OTAsMTAgQEAKIAogCWhhc2ggPSBmaWRfZmxhdHRlbjMyKGZpZCk7CiAJaGFzaCArPSAoaGFzaCA+PiA0KSArIChoYXNoIDw8IDEyKTsgLyogbWl4aW5nIG9pZCBhbmQgc2VxICovCi0JaGFzaCA9IGNmc19oYXNoX2xvbmcoaGFzaCwgaHMtPmhzX2JrdF9iaXRzKTsKKwloYXNoID0gaGFzaF9sb25nKGhhc2gsIGhzLT5oc19ia3RfYml0cyk7CiAKIAkvKiBnaXZlIG1lIGFub3RoZXIgcmFuZG9tIGZhY3RvciAqLwotCWhhc2ggLT0gY2ZzX2hhc2hfbG9uZygodW5zaWduZWQgbG9uZylocywgZmlkX29pZChmaWQpICUgMTEgKyAzKTsKKwloYXNoIC09IGhhc2hfbG9uZygodW5zaWduZWQgbG9uZylocywgZmlkX29pZChmaWQpICUgMTEgKyAzKTsKIAogCWhhc2ggPDw9IGhzLT5oc19jdXJfYml0cyAtIGhzLT5oc19ia3RfYml0czsKIAloYXNoIHw9IChmaWRfc2VxKGZpZCkgKyBmaWRfb2lkKGZpZCkpICYgKENGU19IQVNIX05CS1QoaHMpIC0gMSk7CkBAIC0yMTAwLDcgKzIxMDAsNyBAQAogRVhQT1JUX1NZTUJPTChsdV9vYmplY3RfYXNzaWduX2ZpZCk7CiAKIC8qKgotICogYWxsb2NhdGVzIG9iamVjdCB3aXRoIDAgKG5vbi1hc3NpZ2VkKSBmaWQKKyAqIGFsbG9jYXRlcyBvYmplY3Qgd2l0aCAwIChub24tYXNzaWduZWQpIGZpZAogICogWFhYOiB0ZW1wb3Jhcnkgc29sdXRpb24gdG8gYmUgYWJsZSB0byBhc3NpZ24gZmlkIGluIC0+ZG9fY3JlYXRlKCkKICAqICAgICAgdGlsbCB3ZSBoYXZlIGZ1bGx5LWZ1bmN0aW9uYWwgT1NUIGZpZHMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbWRfYXR0cnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL21kX2F0dHJzLmMKaW5kZXggZjcxODc4Mi4uZjA4MGNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbWRfYXR0cnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9tZF9hdHRycy5jCkBAIC02MCw3ICs2MCw3IEBACiAgKi8KIHZvaWQgbHVzdHJlX2xtYV9zd2FiKHN0cnVjdCBsdXN0cmVfbWR0X2F0dHJzICpsbWEpCiB7Ci0JLyogVXNlIExVU1RSRV9NU0dfTUFHSUMgdG8gZGV0ZWN0IGxvY2FsIGVuZGlhbmVzcy4gKi8KKwkvKiBVc2UgTFVTVFJFX01TR19NQUdJQyB0byBkZXRlY3QgbG9jYWwgZW5kaWFubmVzcy4gKi8KIAlpZiAoTFVTVFJFX01TR19NQUdJQyAhPSBjcHVfdG9fbGUzMihMVVNUUkVfTVNHX01BR0lDKSkgewogCQlfX3N3YWIzMnMoJmxtYS0+bG1hX2NvbXBhdCk7CiAJCV9fc3dhYjMycygmbG1hLT5sbWFfaW5jb21wYXQpOwpAQCAtNzcsNyArNzcsNyBAQAogICovCiB2b2lkIGx1c3RyZV9zb21fc3dhYihzdHJ1Y3Qgc29tX2F0dHJzICphdHRycykKIHsKLQkvKiBVc2UgTFVTVFJFX01TR19NQUdJQyB0byBkZXRlY3QgbG9jYWwgZW5kaWFuZXNzLiAqLworCS8qIFVzZSBMVVNUUkVfTVNHX01BR0lDIHRvIGRldGVjdCBsb2NhbCBlbmRpYW5uZXNzLiAqLwogCWlmIChMVVNUUkVfTVNHX01BR0lDICE9IGNwdV90b19sZTMyKExVU1RSRV9NU0dfTUFHSUMpKSB7CiAJCV9fc3dhYjMycygmYXR0cnMtPnNvbV9jb21wYXQpOwogCQlfX3N3YWIzMnMoJmF0dHJzLT5zb21faW5jb21wYXQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgKi8KIHZvaWQgbHVzdHJlX2hzbV9zd2FiKHN0cnVjdCBoc21fYXR0cnMgKmF0dHJzKQogewotCS8qIFVzZSBMVVNUUkVfTVNHX01BR0lDIHRvIGRldGVjdCBsb2NhbCBlbmRpYW5lc3MuICovCisJLyogVXNlIExVU1RSRV9NU0dfTUFHSUMgdG8gZGV0ZWN0IGxvY2FsIGVuZGlhbm5lc3MuICovCiAJaWYgKExVU1RSRV9NU0dfTUFHSUMgIT0gY3B1X3RvX2xlMzIoTFVTVFJFX01TR19NQUdJQykpIHsKIAkJX19zd2FiMzJzKCZhdHRycy0+aHNtX2NvbXBhdCk7CiAJCV9fc3dhYjMycygmYXR0cnMtPmhzbV9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMKaW5kZXggMzYyYWU1NC4uMmQ1Nzc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYwpAQCAtNjEsNyArNjEsOCBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gMTsKIAotCWlmICgocHRyID0gc3Ryc3RyKGJ1Ziwga2V5KSkgPT0gTlVMTCkKKwlwdHIgPSBzdHJzdHIoYnVmLCBrZXkpOworCWlmIChwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIDE7CiAKIAlpZiAodmFscCkKQEAgLTU5Miw3ICs1OTMsNyBAQAogfQogRVhQT1JUX1NZTUJPTChjbGFzc19kZXRhY2gpOwogCi0vKiogU3RhcnQgc2h1dHRpbmcgZG93biB0aGUgb2JkLiAgVGhlcmUgbWF5IGJlIGluLXByb2dlc3Mgb3BzIHdoZW4KKy8qKiBTdGFydCBzaHV0dGluZyBkb3duIHRoZSBvYmQuICBUaGVyZSBtYXkgYmUgaW4tcHJvZ3Jlc3Mgb3BzIHdoZW4KICAqIHRoaXMgaXMgY2FsbGVkLiAgV2UgdGVsbCB0aGVtIHRvIHN0YXJ0IHNodXR0aW5nIGRvd24gd2l0aCBhIGNhbGwKICAqIHRvIGNsYXNzX2Rpc2Nvbm5lY3RfZXhwb3J0cygpLgogICovCkBAIC02NTUsNyArNjU2LDcgQEAKIAkvKiBUaGUgdGhyZWUgcmVmZXJlbmNlcyB0aGF0IHNob3VsZCBiZSByZW1haW5pbmcgYXJlIHRoZQogCSAqIG9iZF9zZWxmX2V4cG9ydCBhbmQgdGhlIGF0dGFjaCBhbmQgc2V0dXAgcmVmZXJlbmNlcy4gKi8KIAlpZiAoYXRvbWljX3JlYWQoJm9iZC0+b2JkX3JlZmNvdW50KSA+IDMpIHsKLQkJLyogcmVmY291bmYgLSAzIG1pZ2h0IGJlIHRoZSBudW1iZXIgb2YgcmVhbCBleHBvcnRzCisJCS8qIHJlZmNvdW50IC0gMyBtaWdodCBiZSB0aGUgbnVtYmVyIG9mIHJlYWwgZXhwb3J0cwogCQkgICAoZXhjbHVkaW5nIHNlbGYgZXhwb3J0KS4gQnV0IGNsYXNzX2luY3JlZiBpcyBjYWxsZWQKIAkJICAgYnkgb3RoZXIgdGhpbmdzIGFzIHdlbGwsIHNvIGRvbid0IGNvdW50IG9uIGl0LiAqLwogCQlDREVCVUcoRF9JT0NUTCwgIiVzOiBmb3JjaW5nIGV4cG9ydHMgdG8gZGlzY29ubmVjdDogJWRcbiIsCkBAIC0xMDI3LDYgKzEwMjgsNDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX2NmZ19yZW5hbWUpOwogCitzdGF0aWMgaW50IHByb2Nlc3NfcGFyYW0yX2NvbmZpZyhzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZykKK3sKKwljaGFyICpwYXJhbSA9IGx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIDEpOworCWNoYXIgKnVwY2FsbCA9IGx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIDIpOworCWNoYXIgKmFyZ3ZbXSA9IHsKKwkJWzBdID0gIi91c3Ivc2Jpbi9sY3RsIiwKKwkJWzFdID0gInNldF9wYXJhbSIsCisJCVsyXSA9IHBhcmFtLAorCQlbM10gPSBOVUxMCisJfTsKKwlzdHJ1Y3QgdGltZXZhbAlzdGFydDsKKwlzdHJ1Y3QgdGltZXZhbAllbmQ7CisJaW50CQlyYzsKKworCisJLyogQWRkIHVwY2FsbCBwcm9jZXNzaW5nIGhlcmUuIE5vdyBvbmx5IGxjdGwgaXMgc3VwcG9ydGVkICovCisJaWYgKHN0cmNtcCh1cGNhbGwsIExDVExfVVBDQUxMKSAhPSAwKSB7CisJCUNFUlJPUigiVW5zdXBwb3J0ZWQgdXBjYWxsICVzXG4iLCB1cGNhbGwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb19nZXR0aW1lb2ZkYXkoJnN0YXJ0KTsKKwlyYyA9IFVTRVJNT0RFSEVMUEVSKGFyZ3ZbMF0sIGFyZ3YsIE5VTEwpOworCWRvX2dldHRpbWVvZmRheSgmZW5kKTsKKworCWlmIChyYyA8IDApIHsKKwkJQ0VSUk9SKAorCQkgICAgICAgImxjdGw6IGVycm9yIGludm9raW5nIHVwY2FsbCAlcyAlcyAlczogcmMgPSAlZDsgdGltZSAlbGR1c1xuIiwKKwkJICAgICAgIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0sIHJjLAorCQkgICAgICAgY2ZzX3RpbWV2YWxfc3ViKCZlbmQsICZzdGFydCwgTlVMTCkpOworCX0gZWxzZSB7CisJCUNERUJVRyhEX0hBLCAibGN0bDogaW52b2tlZCB1cGNhbGwgJXMgJXMgJXMsIHRpbWUgJWxkdXNcbiIsCisJCSAgICAgICBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLAorCQkgICAgICAgY2ZzX3RpbWV2YWxfc3ViKCZlbmQsICZzdGFydCwgTlVMTCkpOworCQkgICAgICAgcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKwogdm9pZCBsdXN0cmVfcmVnaXN0ZXJfcXVvdGFfcHJvY2Vzc19jb25maWcoaW50ICgqcXBjKShzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZykpCiB7CiAJcXVvdGFfcHJvY2Vzc19jb25maWcgPSBxcGM7CkBAIC0xMTQyLDExICsxMTgzLDE0IEBACiAJCQllcnIgPSAoKnF1b3RhX3Byb2Nlc3NfY29uZmlnKShsY2ZnKTsKIAkJCUdPVE8ob3V0LCBlcnIpOwogCQl9Ci0JCS8qIEZhbGwgdGhyb3VnaCAqLworCiAJCWJyZWFrOwogCX0KKwljYXNlIExDRkdfU0VUX1BBUkFNOiB7CisJCWVyciA9IHByb2Nlc3NfcGFyYW0yX2NvbmZpZyhsY2ZnKTsKKwkJR09UTyhvdXQsIDApOwogCX0KLQorCX0KIAkvKiBDb21tYW5kcyB0aGF0IHJlcXVpcmUgYSBkZXZpY2UgKi8KIAlvYmQgPSBjbGFzc19uYW1lMm9iZChsdXN0cmVfY2ZnX3N0cmluZyhsY2ZnLCAwKSk7CiAJaWYgKG9iZCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCmluZGV4IGE2OWE2MzAuLjZmOGJhNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCkBAIC01MDEsNyArNTAxLDcgQEAKIAl9CiAKIAkvKiBUaGUgTUdDIGhhcyBubyByZWNvdmVyYWJsZSBkYXRhIGluIGFueSBjYXNlLgotCSAqIGZvcmNlIHNob3Rkb3duIHNldCBpbiB1bW91bnRfYmVnaW4gKi8KKwkgKiBmb3JjZSBzaHV0ZG93biBzZXQgaW4gdW1vdW50X2JlZ2luICovCiAJb2JkLT5vYmRfbm9fcmVjb3YgPSAxOwogCiAJaWYgKG9iZC0+dS5jbGkuY2xfbWdjX21nc2V4cCkgewpAQCAtNzU0LDcgKzc1NCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNlcnZlcl9uYW1lMmluZGV4KTsKIAotLyoqKioqKioqKioqKioqKiBtb3VudCBjb21tb24gYmV0d2VlZW4gc2VydmVyIGFuZCBjbGllbnQgKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKiBtb3VudCBjb21tb24gYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudCAqKioqKioqKioqKioqKiovCiAKIC8qIENvbW1vbiB1bW91bnQgKi8KIGludCBsdXN0cmVfY29tbW9uX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jCmluZGV4IDcwOTk3NjQuLjNiMWIyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCX0KIAlpZiAoIGNvbXBhcmUgJiBPQkRfTURfRkxHRU5FUiApCiAJCXJlcyA9IChyZXMgfHwgKGRzdC0+b19wYXJlbnRfb2lkICE9IHNyYy0+b19wYXJlbnRfb2lkKSk7Ci0JLyogWFhYIERvbid0IGtub3cgaWYgdGhzZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUgLSB3YXNuJ3QgcHJldmlvdXNseQorCS8qIFhYWCBEb24ndCBrbm93IGlmIHRoZXNlIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIC0gd2Fzbid0IHByZXZpb3VzbHkKIAlpZiAoIGNvbXBhcmUgJiBPQkRfTURfRkxJTkxJTkUgKQogCQlyZXMgPSAocmVzIHx8IG1lbWNtcChkc3QtPm9faW5saW5lLCBzcmMtPm9faW5saW5lKSk7CiAJKi8KQEAgLTIzMyw3ICsyMzMsNyBAQAogCQlvYS0+b19tb2RlID0gYXR0ci0+aWFfbW9kZTsKIAkJb2EtPm9fdmFsaWQgfD0gT0JEX01EX0ZMVFlQRSB8IE9CRF9NRF9GTE1PREU7CiAJCWlmICghaW5fZ3JvdXBfcChtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgb2EtPm9fZ2lkKSkgJiYKLQkJICAgICFjZnNfY2FwYWJsZShDRlNfQ0FQX0ZTRVRJRCkpCisJCSAgICAhY2FwYWJsZShDRlNfQ0FQX0ZTRVRJRCkpCiAJCQlvYS0+b19tb2RlICY9IH5TX0lTR0lEOwogCX0KIAlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkgewpAQCAtMjgyLDcgKzI4Miw3IEBACiAJCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIFNfSUZNVCl8KG9hLT5vX21vZGUgJiB+U19JRk1UKTsKIAkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOwogCQlpZiAoIWluX2dyb3VwX3AobWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIG9hLT5vX2dpZCkpICYmCi0JCSAgICAhY2ZzX2NhcGFibGUoQ0ZTX0NBUF9GU0VUSUQpKQorCQkgICAgIWNhcGFibGUoQ0ZTX0NBUF9GU0VUSUQpKQogCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU0dJRDsKIAl9CiAJaWYgKHZhbGlkICYgT0JEX01EX0ZMVUlEKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNoby5jCmluZGV4IGRlYmI5Y2UuLjk2YTgwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNoby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNoby5jCkBAIC02MDYsNyArNjA2LDggQEAKIAogCS8qIFhYWCBCdWcgMzQxMzsgd2FpdCBmb3IgYSBiaXQgdG8gZW5zdXJlIHRoZSBCTCBjYWxsYmFjayBoYXMKIAkgKiBoYXBwZW5lZCBiZWZvcmUgY2FsbGluZyBsZGxtX25hbWVzcGFjZV9mcmVlKCkgKi8KLQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUsIGNmc190aW1lX3NlY29uZHMoMSkpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCiAJbGRsbV9uYW1lc3BhY2VfZnJlZShvYmQtPm9iZF9uYW1lc3BhY2UsIE5VTEwsIG9iZC0+b2JkX2ZvcmNlKTsKIAlvYmQtPm9iZF9uYW1lc3BhY2UgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCmluZGV4IDliMmRlYTIuLjc1NGFhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKQEAgLTk5Nyw4ICs5OTcsOCBAQAogCQlzcGluX3VubG9jaygmZWMtPmVjX2xvY2spOwogCQlDRVJST1IoImVjaG9fY2xpZW50IHN0aWxsIGhhcyBvYmplY3RzIGF0IGNsZWFudXAgdGltZSwgIgogCQkgICAgICAgIndhaXQgZm9yIDEgc2Vjb25kXG4iKTsKLQkJc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFLAotCQkJCQkJICAgY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAkJbHVfc2l0ZV9wdXJnZShlbnYsICZlZC0+ZWRfc2l0ZS0+Y3NfbHUsIC0xKTsKIAkJc3Bpbl9sb2NrKCZlYy0+ZWNfbG9jayk7CiAJfQpAQCAtMjc2NCw3ICsyNzY0LDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPQkRfSU9DX0NSRUFURToJCSAgICAvKiBtYXkgY3JlYXRlIGVjaG8gb2JqZWN0ICovCi0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyAob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJcmMgPSBlY2hvX2NyZWF0ZV9vYmplY3QoZW52LCBlZCwgMSwgb2EsIGRhdGEtPmlvY19wYnVmMSwKQEAgLTI3NzgsNyArMjc3OCw3IEBACiAJCWludCBkaXJsZW47CiAJCV9fdTY0IGlkOwogCi0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyhvdXQsIHJjID0gLUVQRVJNKTsKIAogCQljb3VudCA9IGRhdGEtPmlvY19jb3VudDsKQEAgLTI4MDYsNyArMjgwNiw3IEBACiAJCV9fdTY0CSAgICBzZXE7CiAJCWludAkgICAgICBtYXhfY291bnQ7CiAKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCWNsX2VudiA9IGNsX2Vudl9nZXQoJnJlZmNoZWNrKTsKQEAgLTI4MzgsNyArMjgzOCw3IEBACiAJCUdPVE8ob3V0LCByYyk7CiAJfQogCWNhc2UgT0JEX0lPQ19ERVNUUk9ZOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8gKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCXJjID0gZWNob19nZXRfb2JqZWN0KCZlY28sIGVkLCBvYSk7CkBAIC0yODYzLDcgKzI4NjMsNyBAQAogCQlHT1RPKG91dCwgcmMpOwogCiAJY2FzZSBPQkRfSU9DX1NFVEFUVFI6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyAob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJcmMgPSBlY2hvX2dldF9vYmplY3QoJmVjbywgZWQsIG9hKTsKQEAgLTI4NzgsNyArMjg3OCw3IEBACiAJCUdPVE8ob3V0LCByYyk7CiAKIAljYXNlIE9CRF9JT0NfQlJXX1dSSVRFOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8gKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCXJ3ID0gT0JEX0JSV19XUklURTsKQEAgLTI4OTcsNyArMjg5Nyw3IEBACiAJCUdPVE8ob3V0LCByYyk7CiAKIAljYXNlIEVDSE9fSU9DX1NFVF9TVFJJUEU6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyAob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJaWYgKGRhdGEtPmlvY19wYnVmMSA9PSBOVUxMKSB7ICAvKiB1bnNldCAqLwpAQCAtMjkxNCw3ICsyOTE0LDcgQEAKIAkJR09UTyAob3V0LCByYyk7CiAKIAljYXNlIEVDSE9fSU9DX0VOUVVFVUU6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyAob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJcmMgPSBlY2hvX2NsaWVudF9lbnF1ZXVlKGV4cCwgb2EsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKaW5kZXggYmU0NTExZS4uZmU5OTg5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAogLyoqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFrZSB0aGUgZXh0ZW50IHByZXBhcmVkIGZvciB0cmFuc2Zlci4KLSAqIEEgcmFjZSB3aXRoIGZsdXNpbmcgcGFnZSAtIGxsX3dyaXRlcGFnZSgpIGhhcyB0byBiZSBoYW5kbGVkIGNhdXRpb3VzbHkuCisgKiBBIHJhY2Ugd2l0aCBmbHVzaGluZyBwYWdlIC0gbGxfd3JpdGVwYWdlKCkgaGFzIHRvIGJlIGhhbmRsZWQgY2F1dGlvdXNseS4KICAqLwogc3RhdGljIGludCBvc2NfZXh0ZW50X21ha2VfcmVhZHkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCSBzdHJ1Y3Qgb3NjX2V4dGVudCAqZXh0KQpAQCAtMjE0Niw3ICsyMTQ2LDcgQEAKIAlvYXAtPm9hcF9vYmpfb2ZmID0gb2Zmc2V0OwogCUxBU1NFUlQoIShvZmZzZXQgJiB+Q0ZTX1BBR0VfTUFTSykpOwogCi0JaWYgKCFjbGllbnRfaXNfcmVtb3RlKGV4cCkgJiYgY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKQorCWlmICghY2xpZW50X2lzX3JlbW90ZShleHApICYmIGNhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKQogCQlvYXAtPm9hcF9icndfZmxhZ3MgPSBPQkRfQlJXX05PUVVPVEE7CiAKIAlJTklUX0xJU1RfSEVBRCgmb2FwLT5vYXBfcGVuZGluZ19pdGVtKTsKQEAgLTIxODYsNyArMjE4Niw3IEBACiAJLyogU2V0IHRoZSBPQkRfQlJXX1NSVkxPQ0sgYmVmb3JlIHRoZSBwYWdlIGlzIHF1ZXVlZC4gKi8KIAlicndfZmxhZ3MgfD0gb3BzLT5vcHNfc3J2bG9jayA/IE9CRF9CUldfU1JWTE9DSyA6IDA7CiAJaWYgKCFjbGllbnRfaXNfcmVtb3RlKG9zY19leHBvcnQob3NjKSkgJiYKLQkgICAgY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKSB7CisJICAgIGNhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKSB7CiAJCWJyd19mbGFncyB8PSBPQkRfQlJXX05PUVVPVEE7CiAJCWNtZCB8PSBPQkRfQlJXX05PUVVPVEE7CiAJfQpAQCAtMjM5NCw2ICsyMzk0LDEyIEBACiAJCSAqIHJlYWxseSBzZW5kaW5nIHRoZSBSUEMuICovCiAJY2FzZSBPRVNfVFJVTkM6CiAJCS8qIHJhY2Ugd2l0aCB0cnVuY2F0ZSwgcGFnZSB3aWxsIGJlIHJlZGlydGllZCAqLworCWNhc2UgT0VTX0FDVElWRToKKwkJLyogVGhlIGV4dGVudCBpcyBhY3RpdmUgc28gd2UgbmVlZCB0byBhYm9ydCBhbmQgbGV0IHRoZSBjYWxsZXIKKwkJICogcmUtZGlydHkgdGhlIHBhZ2UuIElmIHdlIGNvbnRpbnVlZCBvbiBoZXJlLCBhbmQgd2Ugd2VyZSB0aGUKKwkJICogb25lIG1ha2luZyB0aGUgZXh0ZW50IGFjdGl2ZSwgd2UgY291bGQgZGVhZGxvY2sgd2FpdGluZyBmb3IKKwkJICogdGhlIHBhZ2Ugd3JpdGViYWNrIHRvIGNsZWFyIGJ1dCBpdCB3b24ndCBiZWNhdXNlIHRoZSBleHRlbnQKKwkJICogaXMgYWN0aXZlIGFuZCB3b24ndCBiZSB3cml0dGVuIG91dC4gKi8KIAkJR09UTyhvdXQsIHJjID0gLUVBR0FJTik7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKaW5kZXggNjgxZDYwYS4uNWYzYzU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJICovCiAJb3NjX3BhZ2VfdG91Y2goZW52LCBjbDJvc2NfcGFnZShzbGljZSksIHRvKTsKIAlpZiAoIWNsaWVudF9pc19yZW1vdGUob3NjX2V4cG9ydChvYmopKSAmJgotCSAgICBjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpCisJICAgIGNhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKQogCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19OT1FVT1RBOwogCiAJaWYgKG9pby0+b2lfbG9ja2xlc3MpCkBAIC01MTIsMTkgKzUxMiwxNSBAQAogCXN0cnVjdCBvc2NfaW8gICAgKm9pbyAgID0gY2wyb3NjX2lvKGVudiwgc2xpY2UpOwogCXN0cnVjdCBjbF9vYmplY3QgKm9iaiAgID0gc2xpY2UtPmNpc19vYmo7CiAJc3RydWN0IGNsX2F0dHIgICAqYXR0ciAgPSAmb3NjX2Vudl9pbmZvKGVudiktPm90aV9hdHRyOwotCWludAkgICAgICByZXN1bHQgPSAwOworCWludCByYyA9IDA7CiAKLQlpZiAob2lvLT5vaV9sb2NrbGVzcyA9PSAwKSB7CisJaWYgKG9pby0+b2lfbG9ja2xlc3MgPT0gMCAmJiAhc2xpY2UtPmNpc19pby0+Y2lfbm9hdGltZSkgewogCQljbF9vYmplY3RfYXR0cl9sb2NrKG9iaik7Ci0JCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX2dldChlbnYsIG9iaiwgYXR0cik7Ci0JCWlmIChyZXN1bHQgPT0gMCkgewotCQkJYXR0ci0+Y2F0X2F0aW1lID0gTFRJTUVfUyhDVVJSRU5UX1RJTUUpOwotCQkJcmVzdWx0ID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLAotCQkJCQkJICAgIENBVF9BVElNRSk7Ci0JCX0KKwkJYXR0ci0+Y2F0X2F0aW1lID0gTFRJTUVfUyhDVVJSRU5UX1RJTUUpOworCQlyYyA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgQ0FUX0FUSU1FKTsKIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJfQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IG9zY19pb193cml0ZV9zdGFydChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCmluZGV4IDQ5MDllNDg2Li45NmNiNmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYwpAQCAtNTYxLDcgKzU2MSw3IEBACiAJb2FwLT5vYXBfYnJ3X2ZsYWdzID0gT0JEX0JSV19TWU5DIHwgYnJ3X2ZsYWdzOwogCiAJaWYgKCFjbGllbnRfaXNfcmVtb3RlKG9zY19leHBvcnQob2JqKSkgJiYKLQkJCWNmc19jYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkgeworCQkJY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpIHsKIAkJb2FwLT5vYXBfYnJ3X2ZsYWdzIHw9IE9CRF9CUldfTk9RVU9UQTsKIAkJb2FwLT5vYXBfY21kIHw9IE9CRF9CUldfTk9RVU9UQTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3F1b3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3F1b3RhLmMKaW5kZXggNjA0NWE3OC4uMDIzNWZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19xdW90YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcXVvdGEuYwpAQCAtNTEsMTEgKzUxLDggQEAKIAogCQlvcWkgPSBjZnNfaGFzaF9sb29rdXAoY2xpLT5jbF9xdW90YV9oYXNoW3R5cGVdLCAmcWlkW3R5cGVdKTsKIAkJaWYgKG9xaSkgewotCQkJb2JkX3VpZCBpZCA9IG9xaS0+b3FpX2lkOwotCi0JCQlMQVNTRVJURihpZCA9PSBxaWRbdHlwZV0sCi0JCQkJICJUaGUgaWRzIGRvbid0IG1hdGNoICV1ICE9ICV1XG4iLAotCQkJCSBpZCwgcWlkW3R5cGVdKTsKKwkJCS8qIGRvIG5vdCB0cnkgdG8gYWNjZXNzIG9xaSBoZXJlLCBpdCBjb3VsZCBoYXZlIGJlZW4KKwkJCSAqIGZyZWVkIGJ5IG9zY19xdW90YV9zZXRkcSgpICovCiAKIAkJCS8qIHRoZSBzbG90IGlzIGJ1c3ksIHRoZSB1c2VyIGlzIGFib3V0IHRvIHJ1biBvdXQgb2YKIAkJCSAqIHF1b3RhIHNwYWNlIG9uIHRoaXMgT1NUICovCkBAIC0yNjgsMTEgKzI2NSwxNiBAQAogCWlmIChyYykKIAkJQ0VSUk9SKCJwdGxycGNfcXVldWVfd2FpdCBmYWlsZWQsIHJjOiAlZFxuIiwgcmMpOwogCi0JaWYgKHJlcS0+cnFfcmVwbXNnICYmCi0JICAgIChvcWMgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT0JEX1FVT1RBQ1RMKSkpIHsKLQkJKm9xY3RsID0gKm9xYzsKKwlpZiAocmVxLT5ycV9yZXBtc2cpIHsKKwkJb3FjID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX09CRF9RVU9UQUNUTCk7CisJCWlmIChvcWMpIHsKKwkJCSpvcWN0bCA9ICpvcWM7CisJCX0gZWxzZSBpZiAoIXJjKSB7CisJCQlDRVJST1IoIkNhbid0IHVucGFjayBvYmRfcXVvdGFjdGxcbiIpOworCQkJcmMgPSAtRVBST1RPOworCQl9CiAJfSBlbHNlIGlmICghcmMpIHsKLQkJQ0VSUk9SICgiQ2FuJ3QgdW5wYWNrIG9iZF9xdW90YWN0bFxuIik7CisJCUNFUlJPUigiQ2FuJ3QgdW5wYWNrIG9iZF9xdW90YWN0bFxuIik7CiAJCXJjID0gLUVQUk9UTzsKIAl9CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCmluZGV4IGQ5MGVmZTQuLjRjOWUwMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlICJwdGxycGNfaW50ZXJuYWwuaCIKIAogc3RhdGljIGludCBwdGxycGNfc2VuZF9uZXdfcmVxKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcHRscnBjZF9jaGVja193b3JrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIHBhc3NlZCBpbiBjbGllbnQgc3RydWN0dXJlIFxhIGNsLgpAQCAtNjIsNyArNjMsNyBAQAogRVhQT1JUX1NZTUJPTChwdGxycGNfaW5pdF9jbGllbnQpOwogCiAvKioKLSAqIFJldHVybiBQb3J0YWxSUEMgY29ubmVjdGlvbiBmb3IgcmVtb3JlIHV1ZCBcYSB1dWlkCisgKiBSZXR1cm4gUG9ydGFsUlBDIGNvbm5lY3Rpb24gZm9yIHJlbW90ZSB1dWQgXGEgdXVpZAogICovCiBzdHJ1Y3QgcHRscnBjX2Nvbm5lY3Rpb24gKnB0bHJwY191dWlkX3RvX2Nvbm5lY3Rpb24oc3RydWN0IG9iZF91dWlkICp1dWlkKQogewpAQCAtMTI3LDcgKzEyOCw3IEBACiAgKiBQcmVwYXJlIGJ1bGsgZGVzY3JpcHRvciBmb3Igc3BlY2lmaWVkIG91dGdvaW5nIHJlcXVlc3QgXGEgcmVxIHRoYXQKICAqIGNhbiBmaXQgXGEgbnBhZ2VzICogcGFnZXMuIFxhIHR5cGUgaXMgYnVsayB0eXBlLiBcYSBwb3J0YWwgaXMgd2hlcmUKICAqIHRoZSBidWxrIHRvIGJlIHNlbnQuIFVzZWQgb24gY2xpZW50LXNpZGUuCi0gKiBSZXR1cm5zIHBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdHJkIGluaXRpYWxpemVkIGJ1bGsgZGVzY3JpcHRvciBvciBOVUxMIG9uCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdGVkIGluaXRpYWxpemVkIGJ1bGsgZGVzY3JpcHRvciBvciBOVUxMIG9uCiAgKiBlcnJvci4KICAqLwogc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKnB0bHJwY19wcmVwX2J1bGtfaW1wKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLApAQCAtNjMxLDcgKzYzMiw3IEBACiAKIAkvKiBGb3Igc29tZSBvbGQgMS44IGNsaWVudHMgKDwgMS44LjcpLCB0aGV5IHdpbGwgTEFTU0VSVCB0aGUgc2l6ZSBvZgogCSAqIHB0bHJwY19ib2R5IHNlbnQgZnJvbSBzZXJ2ZXIgZXF1YWwgdG8gbG9jYWwgcHRscnBjX2JvZHkgc2l6ZSwgc28gd2UKLQkgKiBoYXZlIHRvIHNlbmQgb2xkIHB0bHJwY19ib2R5IHRvIGtlZXAgaW50ZXJvcHJhYmlsaXR5IHdpdGggdGhlc2UKKwkgKiBoYXZlIHRvIHNlbmQgb2xkIHB0bHJwY19ib2R5IHRvIGtlZXAgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIHRoZXNlCiAJICogY2xpZW50cy4KIAkgKgogCSAqIE9ubHkgdGhyZWUga2luZHMgb2Ygc2VydmVyLT5jbGllbnQgUlBDcyBzbyBmYXI6CkBAIC02MzksNyArNjQwLDcgQEAKIAkgKiAgLSBMRExNX0NQX0NBTExCQUNLCiAJICogIC0gTERMTV9HTF9DQUxMQkFDSwogCSAqCi0JICogWFhYIFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbmV2ZXIgd2UgZHJvcCB0aGUgaW50ZXJvcHJhYmlsaXR5IHdpdGgKKwkgKiBYWFggVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuZXZlciB3ZSBkcm9wIHRoZSBpbnRlcm9wZXJhYmlsaXR5IHdpdGgKIAkgKiAgICAgdGhlIHRoZXNlIG9sZCBjbGllbnRzLgogCSAqLwogCWlmIChvcGNvZGUgPT0gTERMTV9CTF9DQUxMQkFDSyB8fCBvcGNvZGUgPT0gTERMTV9DUF9DQUxMQkFDSyB8fApAQCAtNjg2LDcgKzY4Nyw3IEBACiAKIC8qKgogICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlcXVlc3QuCi0gKiBDYWxscyBfX3B0bHJwY19yZXF1ZXN0X2FsbG9jIHRvIGFsbG9jYXRlIG5ldyByZXF1ZXN0IHN0dXJjdHVyZSBhbmQgaW5pdHMKKyAqIENhbGxzIF9fcHRscnBjX3JlcXVlc3RfYWxsb2MgdG8gYWxsb2NhdGUgbmV3IHJlcXVlc3Qgc3RydWN0dXJlIGFuZCBpbml0cwogICogYnVmZmVyIHN0cnVjdHVyZXMgYWNjb3JkaW5nIHRvIGNhcHN1bGUgdGVtcGxhdGUgXGEgZm9ybWF0LgogICogUmV0dXJucyBhbGxvY2F0ZWQgcmVxdWVzdCBzdHJ1Y3R1cmUgcG9pbnRlciBvciBOVUxMIG9uIGVycm9yLgogICovCkBAIC03NDMsNyArNzQ0LDcgQEAKIEVYUE9SVF9TWU1CT0wocHRscnBjX3JlcXVlc3RfZnJlZSk7CiAKIC8qKgotICogQWxsb2NhdGUgbmV3IHJlcXVlc3QgZm9yIG9wZXJhdGlvbmUgXGEgb3Bjb2RlIGFuZCBpbW1lZGlhdGVsbHkgcGFjayBpdCBmb3IKKyAqIEFsbG9jYXRlIG5ldyByZXF1ZXN0IGZvciBvcGVyYXRpb24gXGEgb3Bjb2RlIGFuZCBpbW1lZGlhdGVseSBwYWNrIGl0IGZvcgogICogbmV0d29yayB0cmFuc2Zlci4KICAqIE9ubHkgdXNlZCBmb3Igc2ltcGxlIHJlcXVlc3RzIGxpa2UgT0JEX1BJTkcgd2hlcmUgdGhlIG9ubHkgaW1wb3J0YW50CiAgKiBwYXJ0IG9mIHRoZSByZXF1ZXN0IGlzIG9wZXJhdGlvbiBpdHNlbGYuCkBAIC03NjgsNyArNzY5LDcgQEAKIEVYUE9SVF9TWU1CT0wocHRscnBjX3JlcXVlc3RfYWxsb2NfcGFjayk7CiAKIC8qKgotICogUHJlcGFyZSByZXF1ZXN0IChmZXRjaGVkIGZyb20gcG9vbCBcYSBwb29saWYgbm90IE5VTEwpIG9uIGltcG9ydCBcYSBpbXAKKyAqIFByZXBhcmUgcmVxdWVzdCAoZmV0Y2hlZCBmcm9tIHBvb2wgXGEgcG9vbCBpZiBub3QgTlVMTCkgb24gaW1wb3J0IFxhIGltcAogICogZm9yIG9wZXJhdGlvbiBcYSBvcGNvZGUuIFJlcXVlc3Qgd291bGQgY29udGFpbiBcYSBjb3VudCBidWZmZXJzLgogICogU2l6ZXMgb2YgYnVmZmVycyBhcmUgZGVzY3JpYmVkIGluIGFycmF5IFxhIGxlbmd0aHMgYW5kIGJ1ZmZlcnMgdGhlbXNlbHZlcwogICogYXJlIHByb3ZpZGVkIGJ5IGEgcG9pbnRlciBcYSBidWZzLgpAQCAtMTA3Myw3ICsxMDc0LDcgQEAKIH0KIAogLyoqCi0gKiBEZWNpZGUgaWYgdGhlIGVyb3IgbWVzc2FnZSByZWdhcmRpbmcgcHJvdmlkZWQgcmVxdWVzdCBcYSByZXEKKyAqIERlY2lkZSBpZiB0aGUgZXJyb3IgbWVzc2FnZSByZWdhcmRpbmcgcHJvdmlkZWQgcmVxdWVzdCBcYSByZXEKICAqIHNob3VsZCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlIG9yIG5vdC4KICAqIE1ha2VzIGl0J3MgZGVjaXNpb24gb24gcmVxdWVzdCBzdGF0dXMgYW5kIG90aGVyIHByb3BlcnRpZXMuCiAgKiBSZXR1cm5zIDEgdG8gcHJpbnQgZXJyb3Igb24gdGhlIHN5c3RlbSBjb25zb2xlIG9yIDAgaWYgbm90LgpAQCAtMTE1OSw3ICsxMTYwLDcgQEAKIC8qKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gY2xpZW50IHJlY2VpdmVzIFJQQyByZXBseSBmb3IgXGEgcmVxLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KLSAqIFRoZSByZXR1cm4gYWx1ZSB3b3VsZCBiZSBhc3NpZ25lZCB0byByZXEtPnJxX3N0YXR1cyBieSB0aGUgY2FsbGVyCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdvdWxkIGJlIGFzc2lnbmVkIHRvIHJlcS0+cnFfc3RhdHVzIGJ5IHRoZSBjYWxsZXIKICAqIGFzIHJlcXVlc3QgcHJvY2Vzc2luZyBzdGF0dXMuCiAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gZGVjaWRlcyBpZiB0aGUgcmVxdWVzdCBuZWVkcyB0byBiZSBzYXZlZCBmb3IgbGF0ZXIgcmVwbGF5LgogICovCkBAIC0xMTkwLDcgKzExOTEsOSBAQAogCQkgKiB3aWxsIHJvdW5kdXAgaXQgKi8KIAkJcmVxLT5ycV9yZXBsZW4gICAgICAgPSByZXEtPnJxX25vYl9yZWNlaXZlZDsKIAkJcmVxLT5ycV9ub2JfcmVjZWl2ZWQgPSAwOworCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJCXJlcS0+cnFfcmVzZW5kICAgICAgID0gMTsKKwkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTMxMyw3ICsxMzE2LDExIEBACiAJCQkvKiogdmVyc2lvbiByZWNvdmVyeSAqLwogCQkJcHRscnBjX3NhdmVfdmVyc2lvbnMocmVxKTsKIAkJCXB0bHJwY19yZXRhaW5fcmVwbGF5YWJsZV9yZXF1ZXN0KHJlcSwgaW1wKTsKLQkJfSBlbHNlIGlmIChyZXEtPnJxX2NvbW1pdF9jYiAhPSBOVUxMKSB7CisJCX0gZWxzZSBpZiAocmVxLT5ycV9jb21taXRfY2IgIT0gTlVMTCAmJgorCQkJICAgbGlzdF9lbXB0eSgmcmVxLT5ycV9yZXBsYXlfbGlzdCkpIHsKKwkJCS8qIE5COiBkb24ndCBjYWxsIHJxX2NvbW1pdF9jYiBpZiBpdCdzIGFscmVhZHkgb24KKwkJCSAqIHJxX3JlcGxheV9saXN0LCBwdGxycGNfZnJlZV9jb21taXR0ZWQoKSB3aWxsIGNhbGwKKwkJCSAqIGl0IGxhdGVyLCBzZWUgTFUtMzYxOCBmb3IgZGV0YWlscyAqLwogCQkJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOwogCQkJcmVxLT5ycV9jb21taXRfY2IocmVxKTsKIAkJCXNwaW5fbG9jaygmaW1wLT5pbXBfbG9jayk7CkBAIC0xNDA4LDcgKzE0MTUsOSBAQAogCQkJcmVxLT5ycV9zdGF0dXMgPSByYzsKIAkJCXJldHVybiAxOwogCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCQkJcmVxLT5ycV93YWl0X2N0eCA9IDE7CisJCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMTQyMyw3ICsxNDMyLDkgQEAKIAlyYyA9IHB0bF9zZW5kX3JwYyhyZXEsIDApOwogCWlmIChyYykgewogCQlERUJVR19SRVEoRF9IQSwgcmVxLCAic2VuZCBmYWlsZWQgKCVkKTsgZXhwZWN0IHRpbWVvdXQiLCByYyk7CisJCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJcmVxLT5ycV9uZXRfZXJyID0gMTsKKwkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiAJCXJldHVybiByYzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNjg4LDYgKzE2OTksNyBAQAogCQkJCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJCQkJCXJlcS0+cnFfbmV0X2VyciA9IDE7CiAJCQkJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOworCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJLyogbmVlZCB0byByZXNldCB0aGUgdGltZW91dCAqLwogCQkJCWZvcmNlX3RpbWVyX3JlY2FsYyA9IDE7CkBAIC0xNzczLDYgKzE3ODUsMTAgQEAKIAogCQlwdGxycGNfcmVxX2ludGVycHJldChlbnYsIHJlcSwgcmVxLT5ycV9zdGF0dXMpOwogCisJCWlmIChwdGxycGNkX2NoZWNrX3dvcmsocmVxKSkgeworCQkJYXRvbWljX2RlYygmc2V0LT5zZXRfcmVtYWluaW5nKTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCXB0bHJwY19ycXBoYXNlX21vdmUocmVxLCBSUV9QSEFTRV9DT01QTEVURSk7CiAKIAkJQ0RFQlVHKHJlcS0+cnFfcmVxbXNnICE9IE5VTEwgPyBEX1JQQ1RSQUNFIDogMCwKQEAgLTIwMzEsNyArMjA0Nyw3IEBACiBFWFBPUlRfU1lNQk9MKHB0bHJwY19zZXRfbmV4dF90aW1lb3V0KTsKIAogLyoqCi0gKiBTZW5kIGFsbCB1bnNldCByZXF1ZXN0IGZyb20gdGhlIHNldCBhbmQgdGhlbiB3YWl0IHVudGlsbCBhbGwKKyAqIFNlbmQgYWxsIHVuc2V0IHJlcXVlc3QgZnJvbSB0aGUgc2V0IGFuZCB0aGVuIHdhaXQgdW50aWwgYWxsCiAgKiByZXF1ZXN0cyBpbiB0aGUgc2V0IGNvbXBsZXRlIChlaXRoZXIgZ2V0IGEgcmVwbHksIHRpbWVvdXQsIGdldCBhbgogICogZXJyb3Igb3Igb3RoZXJ3aXNlIGJlIGludGVycnVwdGVkKS4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgpAQCAtMjE1Niw3ICsyMTcyLDcgQEAKIEVYUE9SVF9TWU1CT0wocHRscnBjX3NldF93YWl0KTsKIAogLyoqCi0gKiBIZWxwZXIgZnVjdGlvbiBmb3IgcmVxdWVzdCBmcmVlaW5nLgorICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGZyZWVpbmcuCiAgKiBDYWxsZWQgd2hlbiByZXF1ZXN0IGNvdW50IHJlYWNoZWQgemVybyBhbmQgcmVxdWVzdCBuZWVkcyB0byBiZSBmcmVlZC4KICAqIFJlbW92ZXMgcmVxdWVzdCBmcm9tIGFsbCBzb3J0cyBvZiBzZW5kaW5nL3JlcGxheSBsaXN0cyBpdCBtaWdodCBiZSBvbiwKICAqIGZyZWVzIG5ldHdvcmsgYnVmZmVycyBpZiBhbnkgYXJlIHByZXNlbnQuCkBAIC0yMjIzLDcgKzIyMzksNyBAQAogc3RhdGljIGludCBfX3B0bHJwY19yZXFfZmluaXNoZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgbG9ja2VkKTsKIC8qKgogICogRHJvcCBvbmUgcmVxdWVzdCByZWZlcmVuY2UuIE11c3QgYmUgY2FsbGVkIHdpdGggaW1wb3J0IGltcF9sb2NrIGhlbGQuCi0gKiBXaGVuIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLCByZXVxZXN0IGlzIGZyZWVkLgorICogV2hlbiByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybywgcmVxdWVzdCBpcyBmcmVlZC4KICAqLwogdm9pZCBwdGxycGNfcmVxX2ZpbmlzaGVkX3dpdGhfaW1wX2xvY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0KQogewpAQCAtMjIzNiw3ICsyMjUyLDcgQEAKICAqIEhlbHBlciBmdW5jdGlvbgogICogRHJvcHMgb25lIHJlZmVyZW5jZSBjb3VudCBmb3IgcmVxdWVzdCBcYSByZXF1ZXN0LgogICogXGEgbG9ja2VkIHNldCBpbmRpY2F0ZXMgdGhhdCBjYWxsZXIgaG9sZHMgaW1wb3J0IGltcF9sb2NrLgotICogRnJlZXMgdGhlIHJlcXVlc3Qgd2hlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCisgKiBGcmVlcyB0aGUgcmVxdWVzdCB3aGVuIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCiAgKi8KIHN0YXRpYyBpbnQgX19wdGxycGNfcmVxX2ZpbmlzaGVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgaW50IGxvY2tlZCkKIHsKQEAgLTIzNjAsMTkgKzIzNzYsNTIgQEAKIH0KIEVYUE9SVF9TWU1CT0wocHRscnBjX3VucmVnaXN0ZXJfcmVwbHkpOwogCitzdGF0aWMgdm9pZCBwdGxycGNfZnJlZV9yZXF1ZXN0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQoreworCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKKwlyZXEtPnJxX3JlcGxheSA9IDA7CisJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CisKKwlpZiAocmVxLT5ycV9jb21taXRfY2IgIT0gTlVMTCkKKwkJcmVxLT5ycV9jb21taXRfY2IocmVxKTsKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3JlcGxheV9saXN0KTsKKworCV9fcHRscnBjX3JlcV9maW5pc2hlZChyZXEsIDEpOworfQorCisvKioKKyAqIHRoZSByZXF1ZXN0IGlzIGNvbW1pdHRlZCBhbmQgZHJvcHBlZCBmcm9tIHRoZSByZXBsYXkgbGlzdCBvZiBpdHMgaW1wb3J0CisgKi8KK3ZvaWQgcHRscnBjX3JlcXVlc3RfY29tbWl0dGVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IG9iZF9pbXBvcnQJKmltcCA9IHJlcS0+cnFfaW1wb3J0OworCisJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmcmVxLT5ycV9yZXBsYXlfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKGZvcmNlIHx8IHJlcS0+cnFfdHJhbnNubyA8PSBpbXAtPmltcF9wZWVyX2NvbW1pdHRlZF90cmFuc25vKQorCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CisKKwlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZCk7CisKIC8qKgogICogSXRlcmF0ZXMgdGhyb3VnaCByZXBsYXlfbGlzdCBvbiBpbXBvcnQgYW5kIHBydW5lcwogICogYWxsIHJlcXVlc3RzIGhhdmUgdHJhbnNubyBzbWFsbGVyIHRoYW4gbGFzdF9jb21taXR0ZWQgZm9yIHRoZQogICogaW1wb3J0IGFuZCBkb24ndCBoYXZlIHJxX3JlcGxheSBzZXQuCi0gKiBTaW5jZSByZXF1ZXN0cyBhcmUgc29ydGVkIGluIHRyYW5zbm8gb3JkZXIsIHN0b3BzIHdoZW4gbWVldGlnbiBmaXJzdAorICogU2luY2UgcmVxdWVzdHMgYXJlIHNvcnRlZCBpbiB0cmFuc25vIG9yZGVyLCBzdG9wcyB3aGVuIG1lZXRpbmcgZmlyc3QKICAqIHRyYW5zbm8gYmlnZ2VyIHRoYW4gbGFzdF9jb21taXR0ZWQuCiAgKiBjYWxsZXIgbXVzdCBob2xkIGltcC0+aW1wX2xvY2sKICAqLwogdm9pZCBwdGxycGNfZnJlZV9jb21taXR0ZWQoc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICpzYXZlZDsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgKnNhdmVkOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqbGFzdF9yZXEgPSBOVUxMOyAvKiB0ZW1wb3JhcnkgZmlyZSBlc2NhcGUgKi8KKwlib29sCQkgICAgICAgc2tpcF9jb21taXR0ZWRfbGlzdCA9IHRydWU7CiAKIAlMQVNTRVJUKGltcCAhPSBOVUxMKTsKIApAQCAtMjM4OCwxMyArMjQzNywxNSBAQAogCUNERUJVRyhEX1JQQ1RSQUNFLCAiJXM6IGNvbW1pdHRpbmcgZm9yIGxhc3RfY29tbWl0dGVkICJMUFU2NCIgZ2VuICVkXG4iLAogCSAgICAgICBpbXAtPmltcF9vYmQtPm9iZF9uYW1lLCBpbXAtPmltcF9wZWVyX2NvbW1pdHRlZF90cmFuc25vLAogCSAgICAgICBpbXAtPmltcF9nZW5lcmF0aW9uKTsKKworCWlmIChpbXAtPmltcF9nZW5lcmF0aW9uICE9IGltcC0+aW1wX2xhc3RfZ2VuZXJhdGlvbl9jaGVja2VkKQorCQlza2lwX2NvbW1pdHRlZF9saXN0ID0gZmFsc2U7CisKIAlpbXAtPmltcF9sYXN0X3RyYW5zbm9fY2hlY2tlZCA9IGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm87CiAJaW1wLT5pbXBfbGFzdF9nZW5lcmF0aW9uX2NoZWNrZWQgPSBpbXAtPmltcF9nZW5lcmF0aW9uOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgc2F2ZWQsICZpbXAtPmltcF9yZXBsYXlfbGlzdCkgewotCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0LAotCQkJCSAgICAgcnFfcmVwbGF5X2xpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgc2F2ZWQsICZpbXAtPmltcF9yZXBsYXlfbGlzdCwKKwkJCQkgcnFfcmVwbGF5X2xpc3QpIHsKIAkJLyogWFhYIG9rIHRvIHJlbW92ZSB3aGVuIDEzNTcgcmVzb2x2ZWQgLSBycmVhZCAwNS8yOS8wMyAgKi8KIAkJTEFTU0VSVChyZXEgIT0gbGFzdF9yZXEpOwogCQlsYXN0X3JlcSA9IHJlcTsKQEAgLTI0MDgsMjcgKzI0NTksMzQgQEAKIAkJCUdPVE8oZnJlZV9yZXEsIDApOwogCQl9CiAKLQkJaWYgKHJlcS0+cnFfcmVwbGF5KSB7Ci0JCQlERUJVR19SRVEoRF9SUENUUkFDRSwgcmVxLCAia2VlcGluZyAoRkxfUkVQTEFZKSIpOwotCQkJY29udGludWU7Ci0JCX0KLQogCQkvKiBub3QgeWV0IGNvbW1pdHRlZCAqLwogCQlpZiAocmVxLT5ycV90cmFuc25vID4gaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubykgewogCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgInN0b3BwaW5nIHNlYXJjaCIpOwogCQkJYnJlYWs7CiAJCX0KIAorCQlpZiAocmVxLT5ycV9yZXBsYXkpIHsKKwkJCURFQlVHX1JFUShEX1JQQ1RSQUNFLCByZXEsICJrZWVwaW5nIChGTF9SRVBMQVkpIik7CisJCQlsaXN0X21vdmVfdGFpbCgmcmVxLT5ycV9yZXBsYXlfbGlzdCwKKwkJCQkgICAgICAgJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJREVCVUdfUkVRKERfSU5GTywgcmVxLCAiY29tbWl0IChsYXN0X2NvbW1pdHRlZCAiTFBVNjQiKSIsCiAJCQkgIGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm8pOwogZnJlZV9yZXE6Ci0JCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKLQkJcmVxLT5ycV9yZXBsYXkgPSAwOwotCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKLQkJaWYgKHJlcS0+cnFfY29tbWl0X2NiICE9IE5VTEwpCi0JCQlyZXEtPnJxX2NvbW1pdF9jYihyZXEpOwotCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3JlcGxheV9saXN0KTsKLQkJX19wdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSwgMSk7CisJCXB0bHJwY19mcmVlX3JlcXVlc3QocmVxKTsKKwl9CisJaWYgKHNraXBfY29tbWl0dGVkX2xpc3QpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHNhdmVkLCAmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QsCisJCQkJIHJxX3JlcGxheV9saXN0KSB7CisJCUxBU1NFUlQocmVxLT5ycV90cmFuc25vICE9IDApOworCQlpZiAocmVxLT5ycV9pbXBvcnRfZ2VuZXJhdGlvbiA8IGltcC0+aW1wX2dlbmVyYXRpb24pIHsKKwkJCURFQlVHX1JFUShEX1JQQ1RSQUNFLCByZXEsICJmcmVlIHN0YWxlIG9wZW4gcmVxdWVzdCIpOworCQkJcHRscnBjX2ZyZWVfcmVxdWVzdChyZXEpOworCQl9CiAJfQogfQogCkBAIC0yNTg1LDcgKzI2NDMsNyBAQAogCiAvKioKICAqIENhbGxiYWNrIHVzZWQgZm9yIHJlcGxheWVkIHJlcXVlc3RzIHJlcGx5IHByb2Nlc3NpbmcuCi0gKiBJbiBjYXNlIG9mIHN1Y2Nlc2Z1bCByZXBseSBjYWxscyByZWdpc3RlcmVzZCByZXF1ZXN0IHJlcGxheSBjYWxsYmFjay4KKyAqIEluIGNhc2Ugb2Ygc3VjY2Vzc2Z1bCByZXBseSBjYWxscyByZWdpc3RlcmVkIHJlcXVlc3QgcmVwbGF5IGNhbGxiYWNrLgogICogSW4gY2FzZSBvZiBlcnJvciByZXN0YXJ0IHJlcGxheSBwcm9jZXNzLgogICovCiBzdGF0aWMgaW50IHB0bHJwY19yZXBsYXlfaW50ZXJwcmV0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKQEAgLTI4MzQsNyArMjg5Miw3IEBACiAJCXB0bHJwY19sYXN0X3hpZCA9IChfX3U2NClub3cgPDwgMjA7CiAJfQogCi0JLyogTmVlZCB0byBhbHdheXMgYmUgYWxpZ25lZCB0byBhIHBvd2VyLW9mLXR3byBmb3IgbXV0bGktYnVsayBCUlcgKi8KKwkvKiBBbHdheXMgbmVlZCB0byBiZSBhbGlnbmVkIHRvIGEgcG93ZXItb2YtdHdvIGZvciBtdWx0aS1idWxrIEJSVyAqLwogCUNMQVNTRVJUKChQVExSUENfQlVMS19PUFNfQ09VTlQgJiAoUFRMUlBDX0JVTEtfT1BTX0NPVU5UIC0gMSkpID09IDApOwogCXB0bHJwY19sYXN0X3hpZCAmPSBQVExSUENfQlVMS19PUFNfTUFTSzsKIH0KQEAgLTI5MDQsMjIgKzI5NjIsNTAgQEAKICAqICAgIGhhdmUgZGVsYXkgYmVmb3JlIGl0IHJlYWxseSBydW5zIGJ5IHB0bHJwY2QgdGhyZWFkLgogICovCiBzdHJ1Y3QgcHRscnBjX3dvcmtfYXN5bmNfYXJncyB7Ci0JX191NjQgICBtYWdpYzsKIAlpbnQgICAoKmNiKShjb25zdCBzdHJ1Y3QgbHVfZW52ICosIHZvaWQgKik7CiAJdm9pZCAgICpjYmRhdGE7CiB9OwogCi0jZGVmaW5lIFBUTFJQQ19XT1JLX01BR0lDIDB4NjY1NTQzNmI2NzZmNGY0NFVMTCAvKiBtYWdpYyBjb2RlICovCitzdGF0aWMgdm9pZCBwdGxycGNkX2FkZF93b3JrX3JlcShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKK3sKKwkvKiByZS1pbml0aWFsaXplIHRoZSByZXEgKi8KKwlyZXEtPnJxX3RpbWVvdXQJCT0gb2JkX3RpbWVvdXQ7CisJcmVxLT5ycV9zZW50CQk9IGNmc190aW1lX2N1cnJlbnRfc2VjKCk7CisJcmVxLT5ycV9kZWFkbGluZQk9IHJlcS0+cnFfc2VudCArIHJlcS0+cnFfdGltZW91dDsKKwlyZXEtPnJxX3JlcGx5X2RlYWRsaW5lCT0gcmVxLT5ycV9kZWFkbGluZTsKKwlyZXEtPnJxX3BoYXNlCQk9IFJRX1BIQVNFX0lOVEVSUFJFVDsKKwlyZXEtPnJxX25leHRfcGhhc2UJPSBSUV9QSEFTRV9DT01QTEVURTsKKwlyZXEtPnJxX3hpZAkJPSBwdGxycGNfbmV4dF94aWQoKTsKKwlyZXEtPnJxX2ltcG9ydF9nZW5lcmF0aW9uID0gcmVxLT5ycV9pbXBvcnQtPmltcF9nZW5lcmF0aW9uOworCisJcHRscnBjZF9hZGRfcmVxKHJlcSwgUERMX1BPTElDWV9ST1VORCwgLTEpOworfQogCiBzdGF0aWMgaW50IHdvcmtfaW50ZXJwcmV0ZXIoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCB2b2lkICpkYXRhLCBpbnQgcmMpCiB7CiAJc3RydWN0IHB0bHJwY193b3JrX2FzeW5jX2FyZ3MgKmFyZyA9IGRhdGE7CiAKLQlMQVNTRVJUKGFyZy0+bWFnaWMgPT0gUFRMUlBDX1dPUktfTUFHSUMpOworCUxBU1NFUlQocHRscnBjZF9jaGVja193b3JrKHJlcSkpOwogCUxBU1NFUlQoYXJnLT5jYiAhPSBOVUxMKTsKIAotCXJldHVybiBhcmctPmNiKGVudiwgYXJnLT5jYmRhdGEpOworCXJjID0gYXJnLT5jYihlbnYsIGFyZy0+Y2JkYXRhKTsKKworCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfc2V0X2NoYWluKTsKKwlyZXEtPnJxX3NldCA9IE5VTEw7CisKKwlpZiAoYXRvbWljX2RlY19yZXR1cm4oJnJlcS0+cnFfcmVmY291bnQpID4gMSkgeworCQlhdG9taWNfc2V0KCZyZXEtPnJxX3JlZmNvdW50LCAyKTsKKwkJcHRscnBjZF9hZGRfd29ya19yZXEocmVxKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdvcmtlcl9mb3JtYXQ7CisKK3N0YXRpYyBpbnQgcHRscnBjZF9jaGVja193b3JrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQoreworCXJldHVybiByZXEtPnJxX3BpbGwucmNfZm10ID09ICh2b2lkICopJndvcmtlcl9mb3JtYXQ7CiB9CiAKIC8qKgpAQCAtMjk1Miw2ICszMDM4LDcgQEAKIAlyZXEtPnJxX3JlY2VpdmluZ19yZXBseSA9IDA7CiAJcmVxLT5ycV9tdXN0X3VubGluayA9IDA7CiAJcmVxLT5ycV9ub19kZWxheSA9IHJlcS0+cnFfbm9fcmVzZW5kID0gMTsKKwlyZXEtPnJxX3BpbGwucmNfZm10ID0gKHZvaWQgKikmd29ya2VyX2Zvcm1hdDsKIAogCXNwaW5fbG9ja19pbml0KCZyZXEtPnJxX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZyZXEtPnJxX2xpc3QpOwpAQCAtMjk2NSw3ICszMDUyLDYgQEAKIAogCUNMQVNTRVJUKHNpemVvZigqYXJncykgPD0gc2l6ZW9mKHJlcS0+cnFfYXN5bmNfYXJncykpOwogCWFyZ3MgPSBwdGxycGNfcmVxX2FzeW5jX2FyZ3MocmVxKTsKLQlhcmdzLT5tYWdpYyAgPSBQVExSUENfV09SS19NQUdJQzsKIAlhcmdzLT5jYiAgICAgPSBjYjsKIAlhcmdzLT5jYmRhdGEgPSBjYmRhdGE7CiAKQEAgLTI5OTUsMjUgKzMwODEsOCBAQAogCSAqIHJlcSBhcyBvcGFxdWUgZGF0YS4gLSBKaW5zaGFuCiAJICovCiAJTEFTU0VSVChhdG9taWNfcmVhZCgmcmVxLT5ycV9yZWZjb3VudCkgPiAwKTsKLQlpZiAoYXRvbWljX3JlYWQoJnJlcS0+cnFfcmVmY291bnQpID4gMSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmIChhdG9taWNfaW5jX3JldHVybigmcmVxLT5ycV9yZWZjb3VudCkgPiAyKSB7IC8qIHJhY2UgKi8KLQkJYXRvbWljX2RlYygmcmVxLT5ycV9yZWZjb3VudCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyogcmUtaW5pdGlhbGl6ZSB0aGUgcmVxICovCi0JcmVxLT5ycV90aW1lb3V0CT0gb2JkX3RpbWVvdXQ7Ci0JcmVxLT5ycV9zZW50CSAgID0gY2ZzX3RpbWVfY3VycmVudF9zZWMoKTsKLQlyZXEtPnJxX2RlYWRsaW5lICAgICAgID0gcmVxLT5ycV9zZW50ICsgcmVxLT5ycV90aW1lb3V0OwotCXJlcS0+cnFfcmVwbHlfZGVhZGxpbmUgPSByZXEtPnJxX2RlYWRsaW5lOwotCXJlcS0+cnFfcGhhc2UJICA9IFJRX1BIQVNFX0lOVEVSUFJFVDsKLQlyZXEtPnJxX25leHRfcGhhc2UgICAgID0gUlFfUEhBU0VfQ09NUExFVEU7Ci0JcmVxLT5ycV94aWQJICAgID0gcHRscnBjX25leHRfeGlkKCk7Ci0JcmVxLT5ycV9pbXBvcnRfZ2VuZXJhdGlvbiA9IHJlcS0+cnFfaW1wb3J0LT5pbXBfZ2VuZXJhdGlvbjsKLQotCXB0bHJwY2RfYWRkX3JlcShyZXEsIFBETF9QT0xJQ1lfUk9VTkQsIC0xKTsKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnJlcS0+cnFfcmVmY291bnQpID09IDIpCisJCXB0bHJwY2RfYWRkX3dvcmtfcmVxKHJlcSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHB0bHJwY2RfcXVldWVfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMKaW5kZXggZjY2Y2ZlYS4uNmVhMGE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYwpAQCAtNTQ1LDcgKzU0NSw3IEBACiAJICogZGlmZmVyZW50IGRlcGVuZGluZyBvbi4uLiAqLwogCS8qIGtlcm5lbCBMTmV0IGNhbGxzIG91ciBtYXN0ZXIgY2FsbGJhY2sgd2hlbiB0aGVyZSBhcmUgbmV3IGV2ZW50LAogCSAqIGJlY2F1c2Ugd2UgYXJlIGd1YXJhbnRlZWQgdG8gZ2V0IGV2ZXJ5IGV2ZW50IHZpYSBjYWxsYmFjaywKLQkgKiBzbyB3ZSBqdXN0IHNldCBFUSBzaXplIHRvIDAgdG8gYXZvaWQgb3ZlcmhyZWFkIG9mIHNlcmlhbGl6aW5nCisJICogc28gd2UganVzdCBzZXQgRVEgc2l6ZSB0byAwIHRvIGF2b2lkIG92ZXJoZWFkIG9mIHNlcmlhbGl6aW5nCiAJICogZW5xdWV1ZS9kZXF1ZXVlIG9wZXJhdGlvbnMgaW4gTE5ldC4gKi8KIAlyYyA9IExOZXRFUUFsbG9jKDAsIHB0bHJwY19tYXN0ZXJfY2FsbGJhY2ssICZwdGxycGNfZXFfaCk7CiAJaWYgKHJjID09IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19jbGlfdXBjYWxsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19jbGlfdXBjYWxsLmMKaW5kZXggNTUyNDdhZi4uYzI3OWVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfY2xpX3VwY2FsbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2NsaV91cGNhbGwuYwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJaWYgKHJjKSB7CiAJCS8qIElmIGFueSBfcmVhbF8gZGVuaWFsIGJlIG1hZGUsIHdlIGV4cGVjdCBzZXJ2ZXIgcmV0dXJuCiAJCSAqIC1FQUNDRVMgcmVwbHkgb3IgcmV0dXJuIHN1Y2Nlc3MgYnV0IGluZGljYXRlIGdzcyBlcnJvcgotCQkgKiBpbnNpZGUgcmVwbHkgbWVzc3NhZ2UuIEFsbCBvdGhlciBlcnJvcnMgYXJlIHRyZWF0ZWQgYXMKKwkJICogaW5zaWRlIHJlcGx5IG1lc3NhZ2UuIEFsbCBvdGhlciBlcnJvcnMgYXJlIHRyZWF0ZWQgYXMKIAkJICogdGltZW91dCwgY2FsbGVyIG1pZ2h0IHRyeSB0aGUgbmVnb3RpYXRpb24gcmVwZWF0ZWRseSwKIAkJICogbGVhdmUgcmVjb3ZlcnkgZGVjaXNpb25zIHRvIGdlbmVyYWwgcHRscnBjIGxheWVyLgogCQkgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jCmluZGV4IDU2YzI4MjguLjhkYzVjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19nZW5lcmljX3Rva2VuLmMKQEAgLTE0NCw3ICsxNDQsOCBAQAogCXNmID0gKigqYnVmKSsrOwogCSgqYnVmc2l6ZSktLTsKIAlpZiAoc2YgJiAweDgwKSB7Ci0JCWlmICgoc2YgJj0gMHg3ZikgPiAoKCpidWZzaXplKSAtIDEpKQorCQlzZiAmPSAweDdmOworCQlpZiAoKCgqYnVmc2l6ZSkgLSAxKSA8IHNmKQogCQkJcmV0dXJuIC0xOwogCQlpZiAoc2YgPiBTSVpFT0ZfSU5UKQogCQkJcmV0dXJuIC0xOwpAQCAtMTk5LDI3ICsyMDAsMzIgQEAKIAlyYXdvYmpfdCB0b2lkOwogCWludCByZXQgPSAwOwogCi0JaWYgKCh0b2tzaXplIC09IDEpIDwgMCkKKwl0b2tzaXplIC09IDE7CisJaWYgKDAgPiB0b2tzaXplKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCWlmICgqYnVmKysgIT0gMHg2MCkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAotCWlmICgoc2Vxc2l6ZSA9IGRlcl9yZWFkX2xlbmd0aCgmYnVmLCAmdG9rc2l6ZSkpIDwgMCkKKwlzZXFzaXplID0gZGVyX3JlYWRfbGVuZ3RoKCZidWYsICZ0b2tzaXplKTsKKwlpZiAoc2Vxc2l6ZSA8IDApCiAJCXJldHVybihHX0JBRF9UT0tfSEVBREVSKTsKIAogCWlmIChzZXFzaXplICE9IHRva3NpemUpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKLQlpZiAoKHRva3NpemUgLT0gMSkgPCAwKQorCXRva3NpemUgLT0gMTsKKwlpZiAoMCA+IHRva3NpemUpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJaWYgKCpidWYrKyAhPSAweDA2KQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCi0JaWYgKCh0b2tzaXplIC09IDEpIDwgMCkKKwl0b2tzaXplIC09IDE7CisJaWYgKDAgPiB0b2tzaXplKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCXRvaWQubGVuID0gKmJ1ZisrOwogCi0JaWYgKCh0b2tzaXplIC09IHRvaWQubGVuKSA8IDApCisJdG9rc2l6ZSAtPSB0b2lkLmxlbjsKKwlpZiAoMCA+IHRva3NpemUpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJdG9pZC5kYXRhID0gYnVmOwogCWJ1ZiArPSB0b2lkLmxlbjsKQEAgLTIzMSw3ICsyMzcsOCBAQAogCSAqIGltcG9ydGFudCB0byByZXR1cm4gR19CQURfVE9LX0hFQURFUiBpZiB0aGUgdG9rZW4gaGVhZGVyIGlzCiAJICogaW4gZmFjdCBiYWQKIAkgKi8KLQlpZiAoKHRva3NpemUgLT0gMikgPCAwKQorCXRva3NpemUgLT0gMjsKKwlpZiAoMCA+IHRva3NpemUpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKIAlpZiAocmV0KQpAQCAtMjU2LDI0ICsyNjMsMjkgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgc2Vxc2l6ZTsKIAotCWlmICgobGVuIC09IDEpIDwgMCkKKwlsZW4gLT0gMTsKKwlpZiAoMCA+IGxlbikKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAlpZiAoKmJ1ZisrICE9IDB4NjApCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKLQlpZiAoKHNlcXNpemUgPSBkZXJfcmVhZF9sZW5ndGgoJmJ1ZiwgJmxlbikpIDwgMCkKKwlzZXFzaXplID0gZGVyX3JlYWRfbGVuZ3RoKCZidWYsICZsZW4pOworCWlmIChzZXFzaXplIDwgMCkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAotCWlmICgobGVuIC09IDEpIDwgMCkKKwlsZW4gLT0gMTsKKwlpZiAoMCA+IGxlbikKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAlpZiAoKmJ1ZisrICE9IDB4MDYpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKLQlpZiAoKGxlbiAtPSAxKSA8IDApCisJbGVuIC09IDE7CisJaWYgKDAgPiBsZW4pCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJbWVjaC0+bGVuID0gKmJ1ZisrOwogCi0JaWYgKChsZW4gLT0gbWVjaC0+bGVuKSA8IDApCisJbGVuIC09IG1lY2gtPmxlbjsKKwlpZiAoMCA+IGxlbikKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAlPQkRfQUxMT0NfTEFSR0UobWVjaC0+ZGF0YSwgbWVjaC0+bGVuKTsKIAlpZiAoIW1lY2gtPmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rZXlyaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rZXlyaW5nLmMKaW5kZXggZDQzYTEzYy4uNDY0MmJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa2V5cmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tleXJpbmcuYwpAQCAtMTE3Niw3ICsxMTc2LDcgQEAKIAogLyoKICAqIGNhbGxlZCB3aXRoIGtleSBzZW1hcGhvcmUgd3JpdGUgbG9ja2VkLiBpdCBtZWFucyB3ZSBjYW4gb3BlcmF0ZQotICogb24gdGhlIGNvbnRleHQgd2l0aG91dCBmZWFyIG9mIGxvb3NpbmcgcmVmY291bnQuCisgKiBvbiB0aGUgY29udGV4dCB3aXRob3V0IGZlYXIgb2YgbG9zaW5nIHJlZmNvdW50LgogICovCiBzdGF0aWMKIGludCBnc3Nfa3RfdXBkYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rcmI1X21lY2guYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IGI5ZmEzYjQuLmQwM2Y2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC01NCw3ICs1NCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAKICNpbmNsdWRlIDxvYmQuaD4KICNpbmNsdWRlIDxvYmRfY2xhc3MuaD4KQEAgLTY3OSw3ICs2NzgsOCBAQAogCV9fdTMyCQkgIGNvZGUgPSBHU1NfU19GQUlMVVJFOwogCWludAkJICAgIHJjOwogCi0JaWYgKCEodGZtID0gbGxfY3J5cHRvX2FsbG9jX2hhc2goa2UtPmtlX2hhc2hfbmFtZSwgMCwgMCkpKSB7CisJdGZtID0gbGxfY3J5cHRvX2FsbG9jX2hhc2goa2UtPmtlX2hhc2hfbmFtZSwgMCwgMCk7CisJaWYgKCF0Zm0pIHsKIAkJQ0VSUk9SKCJmYWlsZWQgdG8gYWxsb2MgVEZNOiAlc1xuIiwga2UtPmtlX2hhc2hfbmFtZSk7CiAJCXJldHVybiBHU1NfU19GQUlMVVJFOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3BpcGVmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfcGlwZWZzLmMKaW5kZXggYzYyNDUxOC4uN2ExZmY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfcGlwZWZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfcGlwZWZzLmMKQEAgLTg1LDcgKzg1LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGludGVybmVsIGNvbnRleHQgaGVscGVycwkgICAgICoKKyAqIGludGVybmFsIGNvbnRleHQgaGVscGVycwkgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMKQEAgLTY1Miw3ICs2NTIsNyBAQAogCiAvKiBwaXBlZnMgZGVudHJpZXMgZm9yIGVhY2ggbWVjaGFuaXNtcyAqLwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlX3BpcGVzW01FQ0hfTUFYXSA9IHsgTlVMTCwgfTsKLS8qIGFsbCB1cGNhbGwgbWVzc2dhZXMgbGlua2VkIGhlcmUgKi8KKy8qIGFsbCB1cGNhbGwgbWVzc2FnZXMgbGlua2VkIGhlcmUgKi8KIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVwY2FsbF9saXN0c1tNRUNIX01BWF07CiAvKiBhbmQgcHJvdGVjdGVkIGJ5IHRoaXMgKi8KIHN0YXRpYyBzcGlubG9ja190IHVwY2FsbF9sb2Nrc1tNRUNIX01BWF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19zdmNfdXBjYWxsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19zdmNfdXBjYWxsLmMKaW5kZXggNWI1MzY1Yi4uMzU5YzQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfc3ZjX3VwY2FsbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3N2Y191cGNhbGwuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCWxlbisrOwogCiAJCWlmICgobGVuICYgKEJJVFNfUEVSX0xPTkcvOC0xKSkgPT0gMCkKLQkJCWhhc2ggPSBjZnNfaGFzaF9sb25nKGhhc2hebCwgQklUU19QRVJfTE9ORyk7CisJCQloYXNoID0gaGFzaF9sb25nKGhhc2hebCwgQklUU19QRVJfTE9ORyk7CiAJfSB3aGlsZSAobGVuKTsKIAogCXJldHVybiBoYXNoID4+IChCSVRTX1BFUl9MT05HIC0gYml0cyk7CkBAIC01ODYsNyArNTg2LDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCS8qIGN1cnJlbnRseSB0aGUgZXhwaXJ5IHRpbWUgcGFzc2VkIGRvd24gZnJvbSB1c2VyLXNwYWNlCi0JCSAqIGlzIGludmFsaWQsIGhlcmUgd2UgcmV0cml2ZSBpdCBmcm9tIG1lY2guICovCisJCSAqIGlzIGludmFsaWQsIGhlcmUgd2UgcmV0cmlldmUgaXQgZnJvbSBtZWNoLiAqLwogCQlpZiAobGdzc19pbnF1aXJlX2NvbnRleHQocnNjaS5jdHguZ3NjX21lY2hjdHgsICZjdHhfZXhwaXJ5KSkgewogCQkJQ0VSUk9SKCJ1bmFibGUgdG8gZ2V0IGV4cGlyZSB0aW1lLCBkcm9wIGl0XG4iKTsKIAkJCWdvdG8gb3V0OwpAQCAtODgwLDcgKzg4MCw3IEBACiAKIAljYWNoZV9nZXQoJnJzaXAtPmgpOyAvKiB0YWtlIGFuIGV4dHJhIHJlZiAqLwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJzaXAtPndhaXRxKTsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoJnJzaXAtPndhaXRxLCAmd2FpdCk7CiAKIGNhY2hlX2NoZWNrOgpAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKIAkgKiB0aGUgaW5pdCB1cGNhbGwgY2hhbm5lbCwgb3RoZXJ3aXNlIHRoZXJlJ3MgYmlnIGNoYW5jZSB0aGF0IHRoZSBmaXJzdAogCSAqIHVwY2FsbCBpc3N1ZWQgYmVmb3JlIHRoZSBjaGFubmVsIGJlIG9wZW5lZCB0aHVzIG5mc3Y0IGNhY2hlIGNvZGUgd2lsbAogCSAqIGRyb3AgdGhlIHJlcXVlc3QgZGlyZWNsdHksIHRodXMgbGVhZCB0byB1bm5lY2Vzc2FyeSByZWNvdmVyeSB0aW1lLgotCSAqIGhlcmUgd2Ugd2FpdCBhdCBtaXhpbXVtIDEuNSBzZWNvbmRzLiAqLworCSAqIGhlcmUgd2Ugd2FpdCBhdCBtYXhpbXVtIDEuNSBzZWNvbmRzLiAqLwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJaWYgKGF0b21pY19yZWFkKCZyc2lfY2FjaGUucmVhZGVycykgPiAwKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL3NlY19nc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3Mvc2VjX2dzcy5jCmluZGV4IDhjZTYyNzEuLjM4MzYwMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3Mvc2VjX2dzcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3Mvc2VjX2dzcy5jCkBAIC0zODIsNyArMzgyLDcgQEAKIAkvKiBBdCB0aGlzIHBvaW50IHRoaXMgY3R4IG1pZ2h0IGhhdmUgYmVlbiBtYXJrZWQgYXMgZGVhZCBieQogCSAqIHNvbWVvbmUgZWxzZSwgaW4gd2hpY2ggY2FzZSBub2JvZHkgd2lsbCBtYWtlIGZ1cnRoZXIgdXNlCiAJICogb2YgaXQuIHdlIGRvbid0IGNhcmUsIGFuZCBtYXJrIGl0IFVQVE9EQVRFIHdpbGwgaGVscAotCSAqIGRlc3Ryb3lpbmcgc2VydmVyIHNpZGUgY29udGV4dCB3aGVuIGl0IGJlIGRlc3Ryb2llZC4gKi8KKwkgKiBkZXN0cm95aW5nIHNlcnZlciBzaWRlIGNvbnRleHQgd2hlbiBpdCBiZSBkZXN0cm95ZWQuICovCiAJc2V0X2JpdChQVExSUENfQ1RYX1VQVE9EQVRFX0JJVCwgJmN0eC0+Y2NfZmxhZ3MpOwogCiAJaWYgKHNlY19pc19yZXZlcnNlKGN0eC0+Y2Nfc2VjKSkgewpAQCAtNjc2LDcgKzY3Niw3IEBACiAJICogbGVhZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIGZhbGwgYmVoaW5kIHRoZSB3aW5kb3cgb24gc2VydmVyIGFuZAogCSAqIGJlIGRyb3BwZWQuIGFsc28gYXBwbGllcyB0byBnc3NfY2xpX2N0eF9zZWFsKCkuCiAJICoKLQkgKiBOb3RlOiBudWxsIG1vZGUgZG9zZW4ndCBjaGVjayBzZXF1ZW5jZSBudW1iZXIuICovCisJICogTm90ZTogbnVsbCBtb2RlIGRvZXNuJ3QgY2hlY2sgc2VxdWVuY2UgbnVtYmVyLiAqLwogCWlmIChzdmMgIT0gU1BUTFJQQ19TVkNfTlVMTCAmJgogCSAgICBhdG9taWNfcmVhZCgmZ2N0eC0+Z2Nfc2VxKSAtIHNlcSA+IEdTU19TRVFfUkVQQUNLX1RIUkVTSE9MRCkgewogCQlpbnQgYmVoaW5kID0gYXRvbWljX3JlYWQoJmdjdHgtPmdjX3NlcSkgLSBzZXE7CkBAIC0xMjE1LDcgKzEyMTUsNyBAQAogCS8qCiAJICogcmVtb3ZlIFVQVE9EQVRFIGZsYWcgb2YgcmV2ZXJzZSBjdHggdGh1cyB3ZSB3b24ndCBzZW5kIGZpbmkgcnBjLAogCSAqIHRoaXMgaXMgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9mIGNsaWVudCBzaWRlIHJldmVyc2Ugc3ZjIGN0eAotCSAqIGJlIG1pcy1kZXN0cm95ZWQgaW4gdmFyaW91cyByZWNvdmVyeSBzZW5hcmlvcy4gYW55d2F5IGNsaWVudCBjYW4KKwkgKiBiZSBtaXMtZGVzdHJveWVkIGluIHZhcmlvdXMgcmVjb3Zlcnkgc2NlbmFyaW9zLiBhbnl3YXkgY2xpZW50IGNhbgogCSAqIG1hbmFnZSBpdHMgcmV2ZXJzZSBjdHggd2VsbCBieSBhc3NvY2lhdGluZyBpdCB3aXRoIGl0cyBidWRkeSBjdHguCiAJICovCiAJaWYgKHNlY19pc19yZXZlcnNlKHNlYykpCkBAIC0xODgyLDcgKzE4ODIsNyBAQAogCiAJTEFTU0VSVChycy0+cnNfbXNnID09IGx1c3RyZV9tc2dfYnVmKHJzLT5yc19yZXBidWYsIDEsIDApKTsKIAotCS8qIGVtYmVkZGVkIGx1c3RyZV9tc2cgbWlnaHQgaGF2ZSBiZWVuIHNocmlua2VkICovCisJLyogZW1iZWRkZWQgbHVzdHJlX21zZyBtaWdodCBoYXZlIGJlZW4gc2hydW5rICovCiAJaWYgKHJlcS0+cnFfcmVwbGVuICE9IHJzLT5yc19yZXBidWYtPmxtX2J1ZmxlbnNbMV0pCiAJCWx1c3RyZV9zaHJpbmtfbXNnKHJzLT5yc19yZXBidWYsIDEsIHJlcS0+cnFfcmVwbGVuLCAxKTsKIApAQCAtMjU5Niw3ICsyNTk2LDcgQEAKIAlpbnQJCSAgICAgIG1zZ2xlbiwgcmM7CiAKIAkvKiBnZXQgY2xlYXIgZGF0YSBsZW5ndGguIG5vdGUgZW1iZWRkZWQgbHVzdHJlX21zZyBtaWdodAotCSAqIGhhdmUgYmVlbiBzaHJpbmtlZCAqLworCSAqIGhhdmUgYmVlbiBzaHJ1bmsgKi8KIAlpZiAocmVxLT5ycV9yZXBsZW4gIT0gbHVzdHJlX21zZ19idWZsZW4ocnMtPnJzX3JlcGJ1ZiwgMCkpCiAJCW1zZ2xlbiA9IGx1c3RyZV9zaHJpbmtfbXNnKHJzLT5yc19yZXBidWYsIDAsIHJlcS0+cnFfcmVwbGVuLCAxKTsKIAllbHNlCkBAIC0yNzY1LDcgKzI3NjUsNyBAQAogCSAqIHJlcGxheS4KIAkgKgogCSAqIGVhY2ggcmV2ZXJzZSByb290IGN0eCB3aWxsIHJlY29yZCBpdHMgbGF0ZXN0IHNlcXVlbmNlIG51bWJlciBvbiBpdHMKLQkgKiBidWRkeSBzdmNjdHggYmVmb3JlIGJlIGRlc3Ryb2llZCwgc28gaGVyZSB3ZSBjb250aW51ZSB1c2UgaXQuCisJICogYnVkZHkgc3ZjY3R4IGJlZm9yZSBiZSBkZXN0cm95ZWQsIHNvIGhlcmUgd2UgY29udGludWUgdXNlIGl0LgogCSAqLwogCWF0b21pY19zZXQoJmNsaV9nY3R4LT5nY19zZXEsIHN2Y19nY3R4LT5nc2NfcnZzX3NlcSk7CiAKQEAgLTI4MzYsNyArMjgzNiw3IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9zdmNfdXBjYWxsOwogCi0JLyogcmVnaXN0ZXIgcG9saWN5IGFmdGVyIGFsbCBvdGhlciBzdHVmZiBiZSBpbnRpYWxpemVkLCBiZWNhdXNlIGl0CisJLyogcmVnaXN0ZXIgcG9saWN5IGFmdGVyIGFsbCBvdGhlciBzdHVmZiBiZSBpbml0aWFsaXplZCwgYmVjYXVzZSBpdAogCSAqIG1pZ2h0IGJlIGluIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHJlZ2lzdHJhdGlvbi4gKi8KIAogCXJjID0gZ3NzX2luaXRfa2V5cmluZygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCmluZGV4IGY0NjU1NDcuLjUzN2FhNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKQEAgLTU2MCwxNyArNTYwLDMwIEBACiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCi0JaWYgKGxpc3RfZW1wdHkoJmltcC0+aW1wX3JlcGxheV9saXN0KSkKLQkJcmV0dXJuIDA7Ci0JdG1wID0gaW1wLT5pbXBfcmVwbGF5X2xpc3QubmV4dDsKLQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0LCBycV9yZXBsYXlfbGlzdCk7Ci0JKnRyYW5zbm8gPSByZXEtPnJxX3RyYW5zbm87Ci0JaWYgKHJlcS0+cnFfdHJhbnNubyA9PSAwKSB7Ci0JCURFQlVHX1JFUShEX0VSUk9SLCByZXEsICJ6ZXJvIHRyYW5zbm8gaW4gcmVwbGF5Iik7Ci0JCUxCVUcoKTsKKwkvKiBUaGUgcmVxdWVzdHMgaW4gY29tbWl0dGVkX2xpc3QgYWx3YXlzIGhhdmUgc21hbGxlciB0cmFuc25vcyB0aGFuCisJICogdGhlIHJlcXVlc3RzIGluIHJlcGxheV9saXN0ICovCisJaWYgKCFsaXN0X2VtcHR5KCZpbXAtPmltcF9jb21taXR0ZWRfbGlzdCkpIHsKKwkJdG1wID0gaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QubmV4dDsKKwkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwgcnFfcmVwbGF5X2xpc3QpOworCQkqdHJhbnNubyA9IHJlcS0+cnFfdHJhbnNubzsKKwkJaWYgKHJlcS0+cnFfdHJhbnNubyA9PSAwKSB7CisJCQlERUJVR19SRVEoRF9FUlJPUiwgcmVxLAorCQkJCSAgInplcm8gdHJhbnNubyBpbiBjb21taXR0ZWRfbGlzdCIpOworCQkJTEJVRygpOworCQl9CisJCXJldHVybiAxOwogCX0KLQotCXJldHVybiAxOworCWlmICghbGlzdF9lbXB0eSgmaW1wLT5pbXBfcmVwbGF5X2xpc3QpKSB7CisJCXRtcCA9IGltcC0+aW1wX3JlcGxheV9saXN0Lm5leHQ7CisJCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsIHJxX3JlcGxheV9saXN0KTsKKwkJKnRyYW5zbm8gPSByZXEtPnJxX3RyYW5zbm87CisJCWlmIChyZXEtPnJxX3RyYW5zbm8gPT0gMCkgeworCQkJREVCVUdfUkVRKERfRVJST1IsIHJlcSwgInplcm8gdHJhbnNubyBpbiByZXBsYXlfbGlzdCIpOworCQkJTEJVRygpOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMDQyLDcgKzEwNTUsNyBAQAogCQkJaWYgKChvY2QtPm9jZF9ja3N1bV90eXBlcyAmCiAJCQkgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSkgPT0gMCkgewogCQkJCUxDT05TT0xFX1dBUk4oIlRoZSBuZWdvdGlhdGlvbiBvZiB0aGUgY2hlY2tzdW0gIgotCQkJCQkgICAgICAiYWxvZ3JpdGhtIHRvIHVzZSB3aXRoIHNlcnZlciAlcyAiCisJCQkJCSAgICAgICJhbGdvcml0aG0gdG8gdXNlIHdpdGggc2VydmVyICVzICIKIAkJCQkJICAgICAgImZhaWxlZCAoJXgvJXgpLCBkaXNhYmxpbmcgIgogCQkJCQkgICAgICAiY2hlY2tzdW1zXG4iLAogCQkJCQkgICAgICBvYmQyY2xpX3RndChpbXAtPmltcF9vYmQpLApAQCAtMTI2MCw3ICsxMjczLDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgc3RhdGUgbWFjaGluZSBmb3IgY2xpZW50LXNpZGUgcmVjb3Zlcnkgb24gaW1wb3J0LgogICoKLSAqIFR5cGljYWx5IHdlIGhhdmUgdHdvIHBvc3NpYmx5IHBhdGhzLiBJZiB3ZSBjYW1lIHRvIHNlcnZlciBhbmQgaXQgaXMgbm90CisgKiBUeXBpY2FsbHkgd2UgaGF2ZSB0d28gcG9zc2libHkgcGF0aHMuIElmIHdlIGNhbWUgdG8gc2VydmVyIGFuZCBpdCBpcyBub3QKICAqIGluIHJlY292ZXJ5LCB3ZSBqdXN0IGVudGVyIElNUF9FVklDVEVEIHN0YXRlLCBpbnZhbGlkYXRlIG91ciBpbXBvcnQKICAqIHN0YXRlIGFuZCByZWNvbm5lY3QgZnJvbSBzY3JhdGNoLgogICogSWYgd2UgY2FtZSB0byBzZXJ2ZXIgdGhhdCBpcyBpbiByZWNvdmVyeSwgd2UgZW50ZXIgSU1QX1JFUExBWSBpbXBvcnQgc3RhdGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKaW5kZXggZGZjYjQxMC4uNDFjMTJlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYwpAQCAtMjk1LDcgKzI5NSw4IEBACiAJJlJNRl9SRUNfUkVJTlQsCiAJJlJNRl9DQVBBMSwKIAkmUk1GX05BTUUsCi0JJlJNRl9FQURBVEEKKwkmUk1GX0VBREFUQSwKKwkmUk1GX0RMTV9SRVEKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqbWR0X3N3YXBfbGF5b3V0c1tdID0gewpAQCAtMjE1NCw3ICsyMTU1LDcgQEAKICAqIHJlcXVlc3QgKGlmIHRoZSBjYWxsZXIgaXMgZXhlY3V0aW5nIG9uIHRoZSBzZXJ2ZXItc2lkZSkgb3IgcmVwbHkgKGlmIHRoZQogICogY2FsbGVyIGlzIGV4ZWN1dGluZyBvbiB0aGUgY2xpZW50LXNpZGUpLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gY29udmllbmllbnQgZm9yIHVzZSBpcyBjb2RlIHRoYXQgY291bGQgYmUgZXhlY3V0ZWQgb24gdGhlCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlbmllbnQgZm9yIHVzZSBpcyBjb2RlIHRoYXQgY291bGQgYmUgZXhlY3V0ZWQgb24gdGhlCiAgKiBjbGllbnQgYW5kIHNlcnZlciBhbGlrZS4KICAqLwogY29uc3Qgdm9pZCAqcmVxX2NhcHN1bGVfb3RoZXJfZ2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwppbmRleCAxYmU5Nzg2Li41OGYxYzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCkBAIC02MTYsNyArNjE2LDcgQEAKIH0KIAogLyoqCi0gKiBUaGUgbG9uZ2VzdCB2YWxpZCBjb21tYW5kIHN0cmluZyBpcyB0aGUgbWF4aXVtIHBvbGljeSBuYW1lIHNpemUsIHBsdXMgdGhlCisgKiBUaGUgbG9uZ2VzdCB2YWxpZCBjb21tYW5kIHN0cmluZyBpcyB0aGUgbWF4aW11bSBwb2xpY3kgbmFtZSBzaXplLCBwbHVzIHRoZQogICogbGVuZ3RoIG9mIHRoZSAiIHJlZyIgc3Vic3RyaW5nCiAgKi8KICNkZWZpbmUgTFBST0NGU19OUlNfV1JfTUFYX0NNRAkoTlJTX1BPTF9OQU1FX01BWCArIHNpemVvZigiIHJlZyIpIC0gMSkKQEAgLTExODQsNyArMTE4NCw3IEBACiAJfQogCXRtcGJ1ZiA9IGNmc19maXJzdHN0cihrYnVmLCBtaW5fdCh1bnNpZ25lZCBsb25nLCBCVUZMRU4gLSAxLCBjb3VudCkpOwogCS8qIEtsdWRnZSBjb2RlKGRlYWRsb2NrIHNpdHVhdGlvbik6IHRoZSBscHJvY2ZzIGxvY2sgaGFzIGJlZW4gaGVsZAotCSAqIHNpbmNlIHRoZSBjbGllbnQgaXMgZXZpY3RlZCBieSB3cml0dGluZyBjbGllbnQncworCSAqIHNpbmNlIHRoZSBjbGllbnQgaXMgZXZpY3RlZCBieSB3cml0aW5nIGNsaWVudCdzCiAJICogdXVpZC9uaWQgdG8gcHJvY2ZzICJldmljdF9jbGllbnQiIGVudHJ5LiBIb3dldmVyLAogCSAqIG9iZF9leHBvcnRfZXZpY3RfYnlfdXVpZCgpIHdpbGwgY2FsbCBscHJvY2ZzX3JlbW92ZSgpIHRvIGRlc3Ryb3kKIAkgKiB0aGUgcHJvYyBlbnRyaWVzIHVuZGVyIHRoZSBiZWluZyBkZXN0cm95ZWQgZXhwb3J0e30sIHNvIEkgaGF2ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCmluZGV4IDNjNmJmMjMuLmE0N2E4ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKQEAgLTM0OSw3ICszNDksNyBAQAogLyoqCiAgKiBTZW5kIHJlcXVlc3QgcmVwbHkgZnJvbSByZXF1ZXN0IFxhIHJlcSByZXBseSBidWZmZXIuCiAgKiBcYSBmbGFncyBkZWZpbmVzIHJlcGx5IHR5cGVzCi0gKiBSZXR1cm5zIDAgb24gc3VjZXNzIG9yIGVycm9yIGNvZGUKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUKICAqLwogaW50IHB0bHJwY19zZW5kX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgZmxhZ3MpCiB7CkBAIC0zODksNyArMzg5LDcgQEAKIAkgKiBwdGxycGNfYm9keSBpbiByZXBseSBidWZmZXIgdG8gcHRscnBjX2JvZHlfdjIsIG90aGVyd2lzZSwgdGhlCiAJICogcmVwbHkgYnVmZmVyIG9uIGNsaWVudCB3aWxsIGJlIG92ZXJmbG93LgogCSAqCi0JICogWFhYIFJlbW92ZSB0aGlzIHdoZW52ZXIgd2UgZHJvcCB0aGUgaW50ZXJvcHJhYmlsaXR5IHdpdGggc3VjaCBjbGllbnQuCisJICogWFhYIFJlbW92ZSB0aGlzIHdoZW5ldmVyIHdlIGRyb3AgdGhlIGludGVyb3ByYWJpbGl0eSB3aXRoIHN1Y2ggY2xpZW50LgogCSAqLwogCXJlcS0+cnFfcmVwbGVuID0gbHVzdHJlX3Nocmlua19tc2cocmVxLT5ycV9yZXBtc2csIDAsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjIpLCAxKTsKQEAgLTUxMSw3ICs1MTEsOSBAQAogCQlDREVCVUcoRF9IQSwgIm11dGluZyBycGMgZm9yIGZhaWxlZCBpbXAgb2JkICVzXG4iLAogCQkgICAgICAgcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSk7CiAJCS8qIHRoaXMgcHJldmVudHMgdXMgZnJvbSB3YWl0aW5nIGluIHB0bHJwY19xdWV1ZV93YWl0ICovCisJCXNwaW5fbG9jaygmcmVxdWVzdC0+cnFfbG9jayk7CiAJCXJlcXVlc3QtPnJxX2VyciA9IDE7CisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5ycV9sb2NrKTsKIAkJcmVxdWVzdC0+cnFfc3RhdHVzID0gLUVOT0RFVjsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNTUzLDcgKzU1NSw5IEBACiAJCQlpZiAocmMpIHsKIAkJCQkvKiB0aGlzIHByZXZlbnRzIHVzIGZyb20gbG9vcGluZyBpbgogCQkJCSAqIHB0bHJwY19xdWV1ZV93YWl0ICovCisJCQkJc3Bpbl9sb2NrKCZyZXF1ZXN0LT5ycV9sb2NrKTsKIAkJCQlyZXF1ZXN0LT5ycV9lcnIgPSAxOworCQkJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5ycV9sb2NrKTsKIAkJCQlyZXF1ZXN0LT5ycV9zdGF0dXMgPSByYzsKIAkJCQlHT1RPKGNsZWFudXBfYnVsaywgcmMpOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jCmluZGV4IDBhYmNkNmQuLmJjYmExYzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbnJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jCkBAIC0xMzIyLDcgKzEzMjIsNyBAQAogICogU2V0dXAgTlJTIGhlYWRzIG9uIGFsbCBzZXJ2aWNlIHBhcnRpdGlvbnMgb2Ygc2VydmljZSBcYSBzdmMsIGFuZCByZWdpc3RlcgogICogYWxsIGNvbXBhdGlibGUgcG9saWNpZXMgb24gdGhvc2UgTlJTIGhlYWRzLgogICoKLSAqIFRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbmcgcHRsCisgKiBUbyBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gcHRsCiAgKiBccGFyYW1baW5dIHN2YyB0aGUgc2VydmljZSB0byBzZXR1cAogICoKICAqIFxyZXR2YWwgLXZlIGVycm9yLCB0aGUgY2FsbGluZyBsb2dpYyBzaG91bGQgZXZlbnR1YWxseSBjYWxsCkBAIC0xNzM2LDcgKzE3MzYsNyBAQAogfQogCiAvKioKLSAqIFJlbW92ZXMgYWxsIHBvbGljeSBkZXNjaXB0b3JzIGZyb20gbnJzX2NvcmU6Om5yc19wb2xpY2llcywgYW5kIGZyZWVzIHRoZQorICogUmVtb3ZlcyBhbGwgcG9saWN5IGRlc2NyaXB0b3JzIGZyb20gbnJzX2NvcmU6Om5yc19wb2xpY2llcywgYW5kIGZyZWVzIHRoZQogICogcG9saWN5IGRlc2NyaXB0b3JzLgogICoKICAqIFNpbmNlIGFsbCBQVExSUEMgc2VydmljZXMgYXJlIHN0b3BwZWQgYXQgdGhpcyBwb2ludCwgdGhlcmUgYXJlIG5vIG1vcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYwppbmRleCA0NjQ0NzljLi40NWMwYjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAkJICogd2l0aCB0aGUgb2xkIGNsaWVudCAoPCAyLjMpIHdoaWNoIGRvZXNuJ3QgaGF2ZSBwYl9qb2JpZAogCQkgKiBpbiB0aGUgcHRscnBjX2JvZHkuCiAJCSAqCi0JCSAqIFhYWCBSZW1vdmUgdGhpcyB3aGVuZXZlciB3ZSBkb3JwIGludGVyb3ByYWJpbGl0eSB3aXRoIHN1Y2gKKwkJICogWFhYIFJlbW92ZSB0aGlzIHdoZW5ldmVyIHdlIGRyb3AgaW50ZXJvcHJhYmlsaXR5IHdpdGggc3VjaAogCQkgKiAgICAgY2xpZW50LgogCQkgKi8KIAkJX191MzIgcGJsZW4gPSBzaXplb2Yoc3RydWN0IHB0bHJwY19ib2R5X3YyKTsKQEAgLTI0NCwxNSArMjQ0LDcgQEAKIAlMQVNTRVJUKGxlbnNbTVNHX1BUTFJQQ19CT0RZX09GRl0gPT0gc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keSkpOwogCiAJLyogb25seSB1c2UgbmV3IGZvcm1hdCwgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggMS40ICovCi0JbWFnaWMgPSBMVVNUUkVfTVNHX01BR0lDX1YyOwotCi0Jc3dpdGNoIChtYWdpYykgewotCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKLQkJcmV0dXJuIGx1c3RyZV9wYWNrX3JlcXVlc3RfdjIocmVxLCBjb3VudCwgbGVucywgYnVmcyk7Ci0JZGVmYXVsdDoKLQkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlyZXR1cm4gbHVzdHJlX3BhY2tfcmVxdWVzdF92MihyZXEsIGNvdW50LCBsZW5zLCBidWZzKTsKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX3BhY2tfcmVxdWVzdCk7CiAKQEAgLTE1NDUsNyArMTUzNyw3IEBACiAJCV9fdTMyIG9wYyA9IGx1c3RyZV9tc2dfZ2V0X29wYyhtc2cpOwogCQlzdHJ1Y3QgcHRscnBjX2JvZHkgKnBiOwogCi0JCS8qIERvbid0IHNldCBqb2JpZCBmb3IgbGRsbSBhc3QgUlBDcywgdGhleSd2ZSBiZWVuIHNocmlua2VkLgorCQkvKiBEb24ndCBzZXQgam9iaWQgZm9yIGxkbG0gYXN0IFJQQ3MsIHRoZXkndmUgYmVlbiBzaHJ1bmsuCiAJCSAqIFNlZSB0aGUgY29tbWVudCBpbiBwdGxycGNfcmVxdWVzdF9wYWNrKCkuICovCiAJCWlmICghb3BjIHx8IG9wYyA9PSBMRExNX0JMX0NBTExCQUNLIHx8CiAJCSAgICBvcGMgPT0gTERMTV9DUF9DQUxMQkFDSyB8fCBvcGMgPT0gTERMTV9HTF9DQUxMQkFDSykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCmluZGV4IDJkMjZmZDUuLmNhNzM0Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogCQlsX3dhaXRfZXZlbnQocmVxLT5ycV9zZXRfd2FpdHEsIChyZXEtPnJxX3NldCA9PSBOVUxMKSwgJmx3aSk7CiAJfSBlbHNlIGlmIChyZXEtPnJxX3NldCkgewotCQkvKiBJZiB3ZSBoYXZlIGEgdmFpZCAicnFfc2V0IiwganVzdCByZXVzZSBpdCB0byBhdm9pZCBkb3VibGUKKwkJLyogSWYgd2UgaGF2ZSBhIHZhbGlkICJycV9zZXQiLCBqdXN0IHJldXNlIGl0IHRvIGF2b2lkIGRvdWJsZQogCQkgKiBsaW5rZWQuICovCiAJCUxBU1NFUlQocmVxLT5ycV9waGFzZSA9PSBSUV9QSEFTRV9ORVcpOwogCQlMQVNTRVJUKHJlcS0+cnFfc2VuZF9zdGF0ZSA9PSBMVVNUUkVfSU1QX1JFUExBWSk7CkBAIC00NzEsNyArNDcxLDcgQEAKICAqICAgICAgYmUgYmV0dGVyLiBCdXQgaXQgYnJlYWtzIGZvcm1lciBkYXRhIHRyYW5zZmVyIHBvbGljeS4KICAqCiAgKiAgICAgIFNvIHdlIHNob3VsZG4ndCBiZSBibGluZCBmb3IgYXZvaWRpbmcgdGhlIGRhdGEgdHJhbnNmZXIuIFdlIG1ha2Ugc29tZQotICogICAgICBjb21wcm9taXNlOiBkaXZpZGUgdGhlIHB0bHJwY2QgdGhyZWRzIHBvb2wgaW50byB0d28gcGFydHMuIE9uZSBwYXJ0IGlzCisgKiAgICAgIGNvbXByb21pc2U6IGRpdmlkZSB0aGUgcHRscnBjZCB0aHJlYWRzIHBvb2wgaW50byB0d28gcGFydHMuIE9uZSBwYXJ0IGlzCiAgKiAgICAgIGZvciBib3VuZCBtb2RlLCBlYWNoIHB0bHJwY2QgdGhyZWFkIGluIHRoaXMgcGFydCBpcyBib3VuZCB0byBzb21lIENQVQogICogICAgICBjb3JlLiBUaGUgb3RoZXIgcGFydCBpcyBmb3IgZnJlZSBtb2RlLCBhbGwgdGhlIHB0bHJwY2QgdGhyZWFkcyBpbiB0aGUKICAqICAgICAgcGFydCBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBDUFUgY29yZS4gV2Ugc3BlY2lmeSBzb21lIHBhcnRuZXJzaGlwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYwppbmRleCA4NGMzOWUwLi40OGFlMzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMKQEAgLTEwNSwyNCArMTA1LDU5IEBACiAJICogaW1wX2xvY2sgaXMgYmVpbmcgaGVsZCBieSBwdGxycGNfcmVwbGF5LCBidXQgaXQncyBub3QuIGl0J3MKIAkgKiBqdXN0IGEgbGl0dGxlIHJhY2UuLi4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBwb3MsICZpbXAtPmltcF9yZXBsYXlfbGlzdCkgeworCisJLyogUmVwbGF5IGFsbCB0aGUgY29tbWl0dGVkIG9wZW4gcmVxdWVzdHMgb24gY29tbWl0dGVkX2xpc3QgZmlyc3QgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0KSkgeworCQl0bXAgPSBpbXAtPmltcF9jb21taXR0ZWRfbGlzdC5wcmV2OwogCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0LAogCQkJCSAgICAgcnFfcmVwbGF5X2xpc3QpOwogCi0JCS8qIElmIG5lZWQgdG8gcmVzZW5kIHRoZSBsYXN0IHNlbnQgdHJhbnNubyAoYmVjYXVzZSBhCi0JCSAgIHJlY29ubmVjdCBoYXMgb2NjdXJyZWQpLCB0aGVuIHN0b3Agb24gdGhlIG1hdGNoaW5nCi0JCSAgIHJlcSBhbmQgc2VuZCBpdCBhZ2Fpbi4gSWYsIGhvd2V2ZXIsIHRoZSBsYXN0IHNlbnQKLQkJICAgdHJhbnNubyBoYXMgYmVlbiBjb21taXR0ZWQgdGhlbiB3ZSBjb250aW51ZSByZXBsYXkKLQkJICAgZnJvbSB0aGUgbmV4dCByZXF1ZXN0LiAqLworCQkvKiBUaGUgbGFzdCByZXF1ZXN0IG9uIGNvbW1pdHRlZF9saXN0IGhhc24ndCBiZWVuIHJlcGxheWVkICovCiAJCWlmIChyZXEtPnJxX3RyYW5zbm8gPiBsYXN0X3RyYW5zbm8pIHsKLQkJCWlmIChpbXAtPmltcF9yZXNlbmRfcmVwbGF5KQotCQkJCWx1c3RyZV9tc2dfYWRkX2ZsYWdzKHJlcS0+cnFfcmVxbXNnLAotCQkJCQkJICAgICBNU0dfUkVTRU5UKTsKLQkJCWJyZWFrOworCQkJLyogU2luY2UgdGhlIGltcF9jb21taXR0ZWRfbGlzdCBpcyBpbW11dGFibGUgYmVmb3JlCisJCQkgKiBhbGwgb2YgaXQncyByZXF1ZXN0cyBiZWluZyByZXBsYXllZCwgaXQncyBzYWZlIHRvCisJCQkgKiB1c2UgYSBjdXJzb3IgdG8gYWNjZWxlcmF0ZSB0aGUgc2VhcmNoICovCisJCQlpbXAtPmltcF9yZXBsYXlfY3Vyc29yID0gaW1wLT5pbXBfcmVwbGF5X2N1cnNvci0+bmV4dDsKKworCQkJd2hpbGUgKGltcC0+aW1wX3JlcGxheV9jdXJzb3IgIT0KKwkJCSAgICAgICAmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QpIHsKKwkJCQlyZXEgPSBsaXN0X2VudHJ5KGltcC0+aW1wX3JlcGxheV9jdXJzb3IsCisJCQkJCQkgc3RydWN0IHB0bHJwY19yZXF1ZXN0LAorCQkJCQkJIHJxX3JlcGxheV9saXN0KTsKKwkJCQlpZiAocmVxLT5ycV90cmFuc25vID4gbGFzdF90cmFuc25vKQorCQkJCQlicmVhazsKKworCQkJCXJlcSA9IE5VTEw7CisJCQkJaW1wLT5pbXBfcmVwbGF5X2N1cnNvciA9CisJCQkJCWltcC0+aW1wX3JlcGxheV9jdXJzb3ItPm5leHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBbGwgcmVxdWVzdHMgb24gY29tbWl0dGVkX2xpc3QgaGF2ZSBiZWVuIHJlcGxheWVkICovCisJCQlpbXAtPmltcF9yZXBsYXlfY3Vyc29yID0gJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0OworCQkJcmVxID0gTlVMTDsKIAkJfQotCQlyZXEgPSBOVUxMOwogCX0KIAorCS8qIEFsbCB0aGUgcmVxdWVzdHMgaW4gY29tbWl0dGVkIGxpc3QgaGF2ZSBiZWVuIHJlcGxheWVkLCBsZXQncyByZXBsYXkKKwkgKiB0aGUgaW1wX3JlcGxheV9saXN0ICovCisJaWYgKHJlcSA9PSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHBvcywgJmltcC0+aW1wX3JlcGxheV9saXN0KSB7CisJCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0LAorCQkJCQkgcnFfcmVwbGF5X2xpc3QpOworCisJCQlpZiAocmVxLT5ycV90cmFuc25vID4gbGFzdF90cmFuc25vKQorCQkJCWJyZWFrOworCQkJcmVxID0gTlVMTDsKKwkJfQorCX0KKworCS8qIElmIG5lZWQgdG8gcmVzZW5kIHRoZSBsYXN0IHNlbnQgdHJhbnNubyAoYmVjYXVzZSBhIHJlY29ubmVjdAorCSAqIGhhcyBvY2N1cnJlZCksIHRoZW4gc3RvcCBvbiB0aGUgbWF0Y2hpbmcgcmVxIGFuZCBzZW5kIGl0IGFnYWluLgorCSAqIElmLCBob3dldmVyLCB0aGUgbGFzdCBzZW50IHRyYW5zbm8gaGFzIGJlZW4gY29tbWl0dGVkIHRoZW4gd2UKKwkgKiBjb250aW51ZSByZXBsYXkgZnJvbSB0aGUgbmV4dCByZXF1ZXN0LiAqLworCWlmIChyZXEgIT0gTlVMTCAmJiBpbXAtPmltcF9yZXNlbmRfcmVwbGF5KQorCQlsdXN0cmVfbXNnX2FkZF9mbGFncyhyZXEtPnJxX3JlcW1zZywgTVNHX1JFU0VOVCk7CisKIAlzcGluX2xvY2soJmltcC0+aW1wX2xvY2spOwogCWltcC0+aW1wX3Jlc2VuZF9yZXBsYXkgPSAwOwogCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYwppbmRleCA5NjJiMzFkLi5kODA0MTgwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYwpAQCAtNTQzLDggKzU0Myw4IEBACiAJCSAgICAgICAiY3R4ICglcCwgZmwgJWx4KSBkb2Vzbid0IHN3aXRjaCwgcmVsYXggYSBsaXR0bGUgYml0XG4iLAogCQkgICAgICAgbmV3Y3R4LCBuZXdjdHgtPmNjX2ZsYWdzKTsKIAotCQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFLAotCQkJCQkJICAgSFopOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBpdCdzIHBvc3NpYmxlIG5ld2N0eCA9PSBvbGRjdHggaWYgd2UncmUgc3dpdGNoaW5nCkBAIC03NzksNyArNzc5LDcgQEAKIAkgKiAgIGUuZy4gcHRscnBjX2Fib3J0X2luZmxpZ2h0KCk7CiAJICovCiAJaWYgKCFjbGlfY3R4X2lzX3JlZnJlc2hlZChjdHgpKSB7Ci0JCS8qIHRpbWVkIG91dCBvciBpbnRlcnJ1cHR0ZWQgKi8KKwkJLyogdGltZWQgb3V0IG9yIGludGVycnVwdGVkICovCiAJCXJlcV9vZmZfY3R4X2xpc3QocmVxLCBjdHgpOwogCiAJCUxBU1NFUlQocmMgIT0gMCk7CkBAIC04MDUsNyArODA1LDcgQEAKIAlMQVNTRVJUKHJlcS0+cnFfY2xpX2N0eC0+Y2Nfc2VjKTsKIAlMQVNTRVJUKHJlcS0+cnFfYnVsa19yZWFkID09IDAgfHwgcmVxLT5ycV9idWxrX3dyaXRlID09IDApOwogCi0JLyogc3BlY2lhbCBzZWN1cml0eSBmbGFncyBhY2NvZGluZyB0byBvcGNvZGUgKi8KKwkvKiBzcGVjaWFsIHNlY3VyaXR5IGZsYWdzIGFjY29yZGluZyB0byBvcGNvZGUgKi8KIAlzd2l0Y2ggKG9wY29kZSkgewogCWNhc2UgT1NUX1JFQUQ6CiAJY2FzZSBNRFNfUkVBRFBBR0U6CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCUxBU1NFUlRfQVRPTUlDX1pFUk8oJnNlYy0+cHNfbmN0eCk7CiAJTEFTU0VSVChwb2xpY3ktPnNwX2NvcHMtPmRlc3Ryb3lfc2VjKTsKIAotCUNERUJVRyhEX1NFQywgIiVzQCVwOiBiZWluZyBkZXN0cm9pZWRcbiIsIHNlYy0+cHNfcG9saWN5LT5zcF9uYW1lLCBzZWMpOworCUNERUJVRyhEX1NFQywgIiVzQCVwOiBiZWluZyBkZXN0cm95ZWRcbiIsIHNlYy0+cHNfcG9saWN5LT5zcF9uYW1lLCBzZWMpOwogCiAJcG9saWN5LT5zcF9jb3BzLT5kZXN0cm95X3NlYyhzZWMpOwogCXNwdGxycGNfcG9saWN5X3B1dChwb2xpY3kpOwpAQCAtMTI2NCw3ICsxMjY0LDcgQEAKIEVYUE9SVF9TWU1CT0woc3B0bHJwY19zZWNfcHV0KTsKIAogLyoKLSAqIHBvbGljeSBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIHRha2luZyByZWZyZW5jZSBvZiBpbXBvcnQKKyAqIHBvbGljeSBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIHRha2luZyByZWZlcmVuY2Ugb2YgaW1wb3J0CiAgKi8KIHN0YXRpYwogc3RydWN0IHB0bHJwY19zZWMgKiBzcHRscnBjX3NlY19jcmVhdGUoc3RydWN0IG9iZF9pbXBvcnQgKmltcCwKQEAgLTE0MTksNyArMTQxOSw3IEBACiAKIAkJc3AgPSBpbXAtPmltcF9vYmQtPnUuY2xpLmNsX3NwX21lOwogCX0gZWxzZSB7Ci0JCS8qIHJldmVyc2UgaW1wb3J0LCBkZXRlcm1pbmUgZmxhdm9yIGZyb20gaW5jb21pbmcgcmVxZXVzdCAqLworCQkvKiByZXZlcnNlIGltcG9ydCwgZGV0ZXJtaW5lIGZsYXZvciBmcm9tIGluY29taW5nIHJlcXVlc3QgKi8KIAkJc2YgPSAqZmx2cjsKIAogCQlpZiAoc2Yuc2ZfcnBjICE9IFNQVExSUENfRkxWUl9OVUxMKQpAQCAtMjA1Nyw3ICsyMDU3LDcgQEAKIAogCS8qCiAJICogaWYgaXQncyBub3QgbnVsbCBmbGF2b3IgKHdoaWNoIG1lYW5zIGVtYmVkZGVkIHBhY2tpbmcgbXNnKSwKLQkgKiByZXNldCB0aGUgc3dhYiBtYXNrIGZvciB0aGUgY29tbWluZyBpbm5lciBtc2cgdW5wYWNraW5nLgorCSAqIHJlc2V0IHRoZSBzd2FiIG1hc2sgZm9yIHRoZSBjb21pbmcgaW5uZXIgbXNnIHVucGFja2luZy4KIAkgKi8KIAlpZiAoU1BUTFJQQ19GTFZSX1BPTElDWShyZXEtPnJxX2ZsdnIuc2ZfcnBjKSAhPSBTUFRMUlBDX1BPTElDWV9OVUxMKQogCQlyZXEtPnJxX3JlcV9zd2FiX21hc2sgPSAwOwpAQCAtMjEwOCw3ICsyMTA4LDcgQEAKIC8qKgogICogVXNlZCBieSBwdGxycGMgc2VydmVyLCB0byBwZXJmb3JtIHRyYW5zZm9ybWF0aW9uIHVwb24gcmVwbHkgbWVzc2FnZS4KICAqCi0gKiBccG9zdCByZXEtPnJxX3JlcGx5X29mZiBpcyBzZXQgdG8gYXBwcm9yaWF0ZSBzZXJ2ZXItY29udHJvbGxlZCByZXBseSBvZmZzZXQuCisgKiBccG9zdCByZXEtPnJxX3JlcGx5X29mZiBpcyBzZXQgdG8gYXBwcm9wcmlhdGUgc2VydmVyLWNvbnRyb2xsZWQgcmVwbHkgb2Zmc2V0LgogICogXHBvc3QgcmVxLT5ycV9yZXBtc2cgYW5kIHJlcS0+cnFfcmVwbHlfc3RhdGUtPnJzX21zZyBiZWNvbWVzIGluYWNjZXNzaWJsZS4KICAqLwogaW50IHNwdGxycGNfc3ZjX3dyYXBfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCmluZGV4IDMxNjEwM2EuLjk2NTY2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAl1bnNpZ25lZCBsb25nICAgIGVwcF9zdF9taXNzaW5nczsgICAgICAgLyogIyBvZiBjYWNoZSBtaXNzaW5nICovCiAJdW5zaWduZWQgbG9uZyAgICBlcHBfc3RfbG93ZnJlZTsJLyogbG93ZXN0IGZyZWUgcGFnZXMgcmVhY2hlZCAqLwogCXVuc2lnbmVkIGludCAgICAgZXBwX3N0X21heF93cWxlbjsgICAgICAvKiBoaWdoZXN0IHdhaXRxdWV1ZSBsZW5ndGggKi8KLQljZnNfdGltZV90ICAgICAgIGVwcF9zdF9tYXhfd2FpdDsgICAgICAgLyogaW4gamVmZmllcyAqLworCWNmc190aW1lX3QgICAgICAgZXBwX3N0X21heF93YWl0OyAgICAgICAvKiBpbiBqaWZmaWVzICovCiAJLyoKIAkgKiBwb2ludGVycyB0byBwb29scwogCSAqLwpAQCAtNTQ1LDExICs1NDUsMTEgQEAKIAkJCQkJCXBhZ2VfcG9vbHMuZXBwX3dhaXRxbGVuOwogCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0bGluayk7CisJCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdGxpbmssIGN1cnJlbnQpOwogCQkJYWRkX3dhaXRfcXVldWUoJnBhZ2VfcG9vbHMuZXBwX3dhaXRxLCAmd2FpdGxpbmspOwogCiAJCQlzcGluX3VubG9jaygmcGFnZV9wb29scy5lcHBfbG9jayk7Ci0JCQl3YWl0cV93YWl0KCZ3YWl0bGluaywgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwYWdlX3Bvb2xzLmVwcF93YWl0cSwgJndhaXRsaW5rKTsKIAkJCUxBU1NFUlQocGFnZV9wb29scy5lcHBfd2FpdHFsZW4gPiAwKTsKIAkJCXNwaW5fbG9jaygmcGFnZV9wb29scy5lcHBfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYwppbmRleCA2Y2MzZjIzLi5iZjU2MTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogRVhQT1JUX1NZTUJPTChzcHRscnBjX3J1bGVfc2V0X2ZyZWUpOwogCiAvKgotICogcmV0dXJuIDAgaWYgdGhlIHJ1bGUgc2V0IGNvdWxkIGFjY29tb2RhdGUgb25lIG1vcmUgcnVsZS4KKyAqIHJldHVybiAwIGlmIHRoZSBydWxlIHNldCBjb3VsZCBhY2NvbW1vZGF0ZSBvbmUgbW9yZSBydWxlLgogICovCiBpbnQgc3B0bHJwY19ydWxlX3NldF9leHBhbmQoc3RydWN0IHNwdGxycGNfcnVsZV9zZXQgKnJzZXQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYwppbmRleCA1OTBmYThkLi4xOTJhZGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAvKioKICAqIFBhcnQgb2YgUmVwLUFjayBsb2dpYy4KLSAqIFB1dHMgYSBsb2NrIGFuZCBpdHMgbW9kZSBpbnRvIHJlcGx5IHN0YXRlIGFzc290aWF0ZWQgdG8gcmVxdWVzdCByZXBseS4KKyAqIFB1dHMgYSBsb2NrIGFuZCBpdHMgbW9kZSBpbnRvIHJlcGx5IHN0YXRlIGFzc29jaWF0ZWQgdG8gcmVxdWVzdCByZXBseS4KICAqLwogdm9pZAogcHRscnBjX3NhdmVfbG9jayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKQEAgLTI1Miw3ICsyNTIsNyBAQAogc3RhdGljIHN0cnVjdCBwdGxycGNfaHJfc2VydmljZQkJcHRscnBjX2hyOwogCiAvKioKLSAqIG1heGltdW0gbXVtYmVyIG9mIHJlcGxpZXMgc2NoZWR1bGVkIGluIG9uZSBiYXRjaAorICogbWF4aW11bSBudW1iZXIgb2YgcmVwbGllcyBzY2hlZHVsZWQgaW4gb25lIGJhdGNoCiAgKi8KICNkZWZpbmUgTUFYX1NDSEVEVUxFRCAyNTYKIApAQCAtNjEyLDcgKzYxMiw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnN2Y3B0LT5zY3BfaGlzdF9yZXFzKTsKIAlJTklUX0xJU1RfSEVBRCgmc3ZjcHQtPnNjcF9oaXN0X3JxYmRzKTsKIAotCS8qIGFjaXR2ZSByZXF1ZXN0cyBhbmQgaHAgcmVxdWVzdHMgKi8KKwkvKiBhY3RpdmUgcmVxdWVzdHMgYW5kIGhwIHJlcXVlc3RzICovCiAJc3Bpbl9sb2NrX2luaXQoJnN2Y3B0LT5zY3BfcmVxX2xvY2spOwogCiAJLyogcmVwbHkgc3RhdGVzICovCkBAIC03NTIsNyArNzUyLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmc2VydmljZS0+c3J2X2xvY2spOwogCXNlcnZpY2UtPnNydl9uYW1lCQk9IGNvbmYtPnBzY19uYW1lOwogCXNlcnZpY2UtPnNydl93YXRjaGRvZ19mYWN0b3IJPSBjb25mLT5wc2Nfd2F0Y2hkb2dfZmFjdG9yOwotCUlOSVRfTElTVF9IRUFEKCZzZXJ2aWNlLT5zcnZfbGlzdCk7IC8qIGZvciBzYWZ0eSBvZiBjbGVhbnVwICovCisJSU5JVF9MSVNUX0hFQUQoJnNlcnZpY2UtPnNydl9saXN0KTsgLyogZm9yIHNhZmV0eSBvZiBjbGVhbnVwICovCiAKIAkvKiBidWZmZXIgY29uZmlndXJhdGlvbiAqLwogCXNlcnZpY2UtPnNydl9uYnVmX3Blcl9ncm91cAk9IHRlc3RfcmVxX2J1ZmZlcl9wcmVzc3VyZSA/CkBAIC0xOTgyLDcgKzE5ODIsNyBAQAogCWRvX2dldHRpbWVvZmRheSgmd29ya19lbmQpOwogCXRpbWVkaWZmID0gY2ZzX3RpbWV2YWxfc3ViKCZ3b3JrX2VuZCwgJndvcmtfc3RhcnQsIE5VTEwpOwogCUNERUJVRyhEX1JQQ1RSQUNFLCAiSGFuZGxlZCBSUEMgcG5hbWU6Y2x1dWlkK3JlZjpwaWQ6eGlkOm5pZDpvcGMgIgotCSAgICAgICAiJXM6JXMrJWQ6JWQ6eCJMUFU2NCI6JXM6JWQgUmVxdWVzdCBwcm9jZXNlZCBpbiAiCisJICAgICAgICIlczolcyslZDolZDp4IkxQVTY0IjolczolZCBSZXF1ZXN0IHByb2Nlc3NlZCBpbiAiCiAJICAgICAgICIlbGR1cyAoJWxkdXMgdG90YWwpIHRyYW5zICJMUFU2NCIgcmMgJWQvJWRcbiIsCiAJCWN1cnJlbnRfY29tbSgpLAogCQkocmVxdWVzdC0+cnFfZXhwb3J0ID8KQEAgLTI3MzYsNyArMjczNiw3IEBACiAJCXNwaW5fbG9jaygmc3ZjcHQtPnNjcF9sb2NrKTsKIAkJLS1zdmNwdC0+c2NwX250aHJzX3N0YXJ0aW5nOwogCQlpZiAodGhyZWFkX2lzX3N0b3BwaW5nKHRocmVhZCkpIHsKLQkJCS8qIHRoaXMgcHRscnBjX3RocmVhZCBpcyBiZWluZyBoYW5sZWQKKwkJCS8qIHRoaXMgcHRscnBjX3RocmVhZCBpcyBiZWluZyBoYW5kbGVkCiAJCQkgKiBieSBwdGxycGNfc3ZjcHRfc3RvcF90aHJlYWRzIG5vdwogCQkJICovCiAJCQl0aHJlYWRfYWRkX2ZsYWdzKHRocmVhZCwgU1ZDX1NUT1BQRUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3dpcmV0ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYwppbmRleCAzYWE0NDU5Li4zYzg4NDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYwpAQCAtMTE1Miw2ICsxMTUyLDggQEAKIAkJIE9CRF9DT05ORUNUX1NIT1JUSU8pOwogCUxBU1NFUlRGKE9CRF9DT05ORUNUX1BJTkdMRVNTID09IDB4NDAwMDAwMDAwMDAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKIAkJIE9CRF9DT05ORUNUX1BJTkdMRVNTKTsKKwlMQVNTRVJURihPQkRfQ09OTkVDVF9GTE9DS19ERUFEID09IDB4ODAwMDAwMDAwMDAwMFVMTCwKKwkJICJmb3VuZCAweCUuMTZsbHhVTExcbiIsIE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQpOwogCUxBU1NFUlRGKE9CRF9DS1NVTV9DUkMzMiA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKIAkJKHVuc2lnbmVkKU9CRF9DS1NVTV9DUkMzMik7CiAJTEFTU0VSVEYoT0JEX0NLU1VNX0FETEVSID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2hhbmRsZS5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2hhbmRsZS5oCmluZGV4IDYyYjk3OTUuLjU2MzhiMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9oYW5kbGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmgKQEAgLTI4LDI2ICsyOCwyNiBAQAogI2RlZmluZSBSRUdNT0RFMzIJMzIKIAogc3RydWN0IGFzMTAyX3ByaXZfb3BzX3QgewotCWludCAoKnVwbG9hZF9md19wa3QpIChzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJaW50ICgqdXBsb2FkX2Z3X3BrdCkoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAogCQkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgc3dhcDMyKTsKIAotCWludCAoKnNlbmRfY21kKSAoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCWludCAoKnNlbmRfY21kKShzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCiAJCQkgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKIAotCWludCAoKnhmZXJfY21kKSAoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCWludCAoKnhmZXJfY21kKShzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCiAJCQkgdW5zaWduZWQgY2hhciAqc2VuZF9idWYsIGludCBzZW5kX2J1Zl9sZW4sCiAJCQkgdW5zaWduZWQgY2hhciAqcmVjdl9idWYsIGludCByZWN2X2J1Zl9sZW4pOwogCi0JaW50ICgqc3RhcnRfc3RyZWFtKSAoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOwotCXZvaWQgKCpzdG9wX3N0cmVhbSkgKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KTsKKwlpbnQgKCpzdGFydF9zdHJlYW0pKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KTsKKwl2b2lkICgqc3RvcF9zdHJlYW0pKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KTsKIAotCWludCAoKnJlc2V0X3RhcmdldCkgKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCk7CisJaW50ICgqcmVzZXRfdGFyZ2V0KShzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXApOwogCiAJaW50ICgqcmVhZF93cml0ZSkoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLCB1aW50OF90IG1vZGUsCiAJCQkgIHVpbnQzMl90IHJkX2FkZHIsIHVpbnQxNl90IHJkX2xlbiwKIAkJCSAgdWludDMyX3Qgd3JfYWRkciwgdWludDE2X3Qgd3JfbGVuKTsKIAotCWludCAoKmFzMTAyX3JlYWRfZXAyKSAoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCWludCAoKmFzMTAyX3JlYWRfZXAyKShzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCiAJCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmVjdl9idWYsCiAJCQkgICAgICAgaW50IHJlY3ZfYnVmX2xlbik7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCmluZGV4IDZjYjc0ZGEuLmEyYTUxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKQEAgLTMyOSwxMSArMzI5LDE0IEBACiAJCQlicmVhazsKIAogI2lmIDAKLQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA5LCAweDREKTsgLyogSW5wdXQgTW9kZSBDLCBCWVBhc3MgU2VyaWFsLCBUSVZBTCA9IGxvdywgTVNCICovCisJCS8qIElucHV0IE1vZGUgQywgQllQYXNzIFNlcmlhbCwgVElWQUwgPSBsb3csIE1TQiAqLworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDksIDB4NEQpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogI2VuZGlmCi0JCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwQSwgMHhBNyk7IC8qIFRPU1RSVCA9IDgsIE1vZGUgQiAoZ2F0ZWQgY2xvY2spLCBmYWxsaW5nIEVkZ2UsIFNlcmlhbCwgUE9MPUhJR0gsIE1TQiAqLworCQkvKiBUT1NUUlQgPSA4LCBNb2RlIEIgKGdhdGVkIGNsb2NrKSwgZmFsbGluZyBFZGdlLAorCQkgKiBTZXJpYWwsIFBPTD1ISUdILCBNU0IgKi8KKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDBBLCAweEE3KTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKIApAQCAtNTg5LDcgKzU5Miw3IEBACiAJCXJlYWRfcmVnKGNpLCAweDAxLCAmc2xvdHN0YXQpOwogCQlpZiAoISgyJnNsb3RzdGF0KSkgewogCQkJaWYgKCFjaS0+c2xvdF9zdGF0KSB7Ci0JCQkJY2ktPnNsb3Rfc3RhdCB8PSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UOworCQkJCWNpLT5zbG90X3N0YXQgPSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UOwogCQkJCXdyaXRlX3JlZ20oY2ksIDB4MDMsIDB4MDgsIDB4MDgpOwogCQkJfQogCkBAIC02MDEsNyArNjA0LDggQEAKIAkJCQljaS0+cmVhZHkgPSAwOwogCQkJfQogCQl9Ci0JCWlmIChpc3RhdCY4ICYmIGNpLT5zbG90X3N0YXQgPT0gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCkgeworCQlpZiAoaXN0YXQmOCAmJgorCQkgICAgY2ktPnNsb3Rfc3RhdCA9PSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UKSB7CiAJCQljaS0+cmVhZHkgPSAxOwogCQkJY2ktPnNsb3Rfc3RhdCB8PSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9SRUFEWTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uaAppbmRleCBkZjBhZWVjLi5jYTlhNzAyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmgKQEAgLTMyLDcgKzMyLDcgQEAKICAqCQlpZiB0aGVyZSB3YXMgbm8gYnVmZmVyIHByZXZpb3VzbHkgcXVldWVkLgogICovCiBzdHJ1Y3QgdnBmZV92aWRlb19vcGVyYXRpb25zIHsKLQlpbnQoKnF1ZXVlKSAoc3RydWN0IHZwZmVfZGV2aWNlICp2cGZlX2RldiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKKwlpbnQgKCpxdWV1ZSkoc3RydWN0IHZwZmVfZGV2aWNlICp2cGZlX2RldiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIH07CiAKIGVudW0gdnBmZV9waXBlbGluZV9zdHJlYW1fc3RhdGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvZHQzMTU1djRsLmMKaW5kZXggZTcyOWU1Mi4uOTdlN2E5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL2R0MzE1NXY0bC5jCkBAIC0yOTksNyArMjk5LDcgQEAKICAqCWVuZCBkcml2ZXItc3BlY2lmaWMgY2FsbGJhY2tzCiAgKi8KIAotY29uc3Qgc3RydWN0IHZiMl9vcHMgcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZiMl9vcHMgcV9vcHMgPSB7CiAJLnF1ZXVlX3NldHVwID0gZHQzMTU1X3F1ZXVlX3NldHVwLAogCS53YWl0X3ByZXBhcmUgPSBkdDMxNTVfd2FpdF9wcmVwYXJlLAogCS53YWl0X2ZpbmlzaCA9IGR0MzE1NV93YWl0X2ZpbmlzaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctbG9hZGVyLmMKaW5kZXggZWVjYjFmMi4uNDkxZDBlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctbG9hZGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctbG9hZGVyLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAljb25zdCBjaGFyICogY29uc3QgZndfbmFtZTI7CiB9OwogCi1zdHJ1Y3QgZndfY29uZmlnIGZ3X2NvbmZpZ3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZndfY29uZmlnIGZ3X2NvbmZpZ3NbXSA9IHsKIAl7IDB4MTk0MywgMHhhMjUwLCAiZ283MDA3L3MyMjUwLTEuZnciLCAiZ283MDA3L3MyMjUwLTIuZnciIH0sCiAJeyAweDA5M2IsIDB4YTAwMiwgImdvNzAwNy9weC1tNDAydS5mdyIsIE5VTEwgfSwKIAl7IDB4MDkzYiwgMHhhMDA0LCAiZ283MDA3L3B4LXR2NDAydS5mdyIsIE5VTEwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXY0bDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXY0bDIuYwppbmRleCBlZGM1MmUyLi5iZGY0MTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy12NGwyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctdjRsMi5jCkBAIC00MzMsNyArNDMzLDggQEAKIAlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAwKTsKIH0KIAotc3RhdGljIGludCBnbzcwMDdfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcSwgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCitzdGF0aWMgaW50IGdvNzAwN19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICpxLAorCQljb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKIAkJdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAogCQl1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQogewpAQCAtNzM3LDcgKzczOCw4IEBACiAKIAlpZiAoYS0+aW5kZXggPj0gZ28tPmJvYXJkX2luZm8tPm51bV9hdWRfaW5wdXRzKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlzdHJsY3B5KGEtPm5hbWUsIGdvLT5ib2FyZF9pbmZvLT5hdWRfaW5wdXRzW2EtPmluZGV4XS5uYW1lLCBzaXplb2YoYS0+bmFtZSkpOworCXN0cmxjcHkoYS0+bmFtZSwgZ28tPmJvYXJkX2luZm8tPmF1ZF9pbnB1dHNbYS0+aW5kZXhdLm5hbWUsCisJCXNpemVvZihhLT5uYW1lKSk7CiAJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NywxMiArNzQ5LDE0IEBACiAJc3RydWN0IGdvNzAwNyAqZ28gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJYS0+aW5kZXggPSBnby0+YXVkX2lucHV0OwotCXN0cmxjcHkoYS0+bmFtZSwgZ28tPmJvYXJkX2luZm8tPmF1ZF9pbnB1dHNbZ28tPmF1ZF9pbnB1dF0ubmFtZSwgc2l6ZW9mKGEtPm5hbWUpKTsKKwlzdHJsY3B5KGEtPm5hbWUsIGdvLT5ib2FyZF9pbmZvLT5hdWRfaW5wdXRzW2dvLT5hdWRfaW5wdXRdLm5hbWUsCisJCXNpemVvZihhLT5uYW1lKSk7CiAJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2F1ZGlvICphKQorc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJY29uc3Qgc3RydWN0IHY0bDJfYXVkaW8gKmEpCiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCkBAIC03NjAsNyArNzY0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZ28tPmF1ZF9pbnB1dCA9IGEtPmluZGV4OwogCXY0bDJfc3ViZGV2X2NhbGwoZ28tPnNkX2F1ZGlvLCBhdWRpbywgc19yb3V0aW5nLAotCQkJZ28tPmJvYXJkX2luZm8tPmF1ZF9pbnB1dHNbZ28tPmF1ZF9pbnB1dF0uYXVkaW9faW5wdXQsIDAsIDApOworCQlnby0+Ym9hcmRfaW5mby0+YXVkX2lucHV0c1tnby0+YXVkX2lucHV0XS5hdWRpb19pbnB1dCwgMCwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2MCw4ICs5NjQsMTAgQEAKIAkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxKTsKIAljdHJsID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCBOVUxMLAogCQkJVjRMMl9DSURfSlBFR19BQ1RJVkVfTUFSS0VSLCAwLAotCQkJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfRFFUIHwgVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfREhULCAwLAotCQkJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfRFFUIHwgVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfREhUKTsKKwkJCVY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RRVCB8CisJCQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9ESFQsIDAsCisJCQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9EUVQgfAorCQkJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfREhUKTsKIAlpZiAoY3RybCkKIAkJY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOwogCWlmIChoZGwtPmVycm9yKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NuZC1nbzcwMDcuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvc25kLWdvNzAwNy5jCmluZGV4IDE2ZGQ2NDkuLjllYjJhMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvc25kLWdvNzAwNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvc25kLWdvNzAwNy5jCkBAIC0yNDUsOCArMjQ1LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmZ29zbmQtPmxvY2spOwogCWdvc25kLT5od19wdHIgPSBnb3NuZC0+d19pZHggPSBnb3NuZC0+YXZhaWwgPSAwOwogCWdvc25kLT5jYXB0dXJpbmcgPSAwOwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwKLQkJCSAgICAgICZnb3NuZC0+Y2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KGdvLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLAorCQkJICAgJmdvc25kLT5jYXJkKTsKIAlpZiAocmV0IDwgMCkgewogCQlrZnJlZShnb3NuZCk7CiAJCXJldHVybiByZXQ7CkBAIC0yNTcsNyArMjU3LDYgQEAKIAkJa2ZyZWUoZ29zbmQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGdvc25kLT5jYXJkLCBnby0+ZGV2KTsKIAlyZXQgPSBzbmRfcGNtX25ldyhnb3NuZC0+Y2FyZCwgImdvNzAwNyIsIDAsIDAsIDEsICZnb3NuZC0+cGNtKTsKIAlpZiAocmV0IDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGdvc25kLT5jYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaWdvcnBsdWd1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaWdvcnBsdWd1c2IuYwppbmRleCBmMmRjYzRhLi5mNTA4YTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jCkBAIC02Miw3ICs2Miw3IEBACiAKIC8qIGRlYnVnZ2luZyBzdXBwb3J0ICovCiAjaWZkZWYgQ09ORklHX1VTQl9ERUJVRwotc3RhdGljIGJvb2wgZGVidWcgPSAxOworc3RhdGljIGJvb2wgZGVidWcgPSB0cnVlOwogI2Vsc2UKIHN0YXRpYyBib29sIGRlYnVnOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCmluZGV4IGYyZDM5NmMuLmE1YjYyZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCkBAIC05NDMsMTMgKzk0MywxNyBAQAogCQl1c2JfZnJlZV91cmIodHhfdXJiKTsKIAljYXNlIDY6CiAJCXVzYl9mcmVlX3VyYihyeF91cmIpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDU6CiAJCWlmIChyYnVmKQogCQkJbGlyY19idWZmZXJfZnJlZShyYnVmKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSA0OgogCQlrZnJlZShyYnVmKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSAzOgogCQlrZnJlZShkcml2ZXIpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDI6CiAJCWtmcmVlKGNvbnRleHQpOwogCQljb250ZXh0ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwppbmRleCAwYjU4OTg5Li42MmY1MTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCkBAIC02OCwyOSArNjgsMjkgQEAKIHN0YXRpYyBib29sIGRlYnVnOwogc3RhdGljIGJvb2wgY2hlY2tfcHNlbGVjZDsKIAotdW5zaWduZWQgaW50IGlycSA9IExJUkNfSVJROwotdW5zaWduZWQgaW50IGlvID0gTElSQ19QT1JUOworc3RhdGljIHVuc2lnbmVkIGludCBpcnEgPSBMSVJDX0lSUTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW8gPSBMSVJDX1BPUlQ7CiAjaWZkZWYgTElSQ19USU1FUgotdW5zaWduZWQgaW50IHRpbWVyOwotdW5zaWduZWQgaW50IGRlZmF1bHRfdGltZXIgPSBMSVJDX1RJTUVSOworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lcjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVmYXVsdF90aW1lciA9IExJUkNfVElNRVI7CiAjZW5kaWYKIAogI2RlZmluZSBSQlVGX1NJWkUgKDI1NikgLyogdGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YgMiBsYXJnZXIgdGhhbiAxICovCiAKIHN0YXRpYyBpbnQgcmJ1ZltSQlVGX1NJWkVdOwogCi1ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsaXJjX3dhaXQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGxpcmNfd2FpdCk7CiAKLXVuc2lnbmVkIGludCBycHRyOwotdW5zaWduZWQgaW50IHdwdHI7Ci11bnNpZ25lZCBpbnQgbG9zdF9pcnFzOwotaW50IGlzX29wZW47CitzdGF0aWMgdW5zaWduZWQgaW50IHJwdHI7CitzdGF0aWMgdW5zaWduZWQgaW50IHdwdHI7CitzdGF0aWMgdW5zaWduZWQgaW50IGxvc3RfaXJxczsKK3N0YXRpYyBpbnQgaXNfb3BlbjsKIAotc3RydWN0IHBhcnBvcnQgKnBwb3J0Owotc3RydWN0IHBhcmRldmljZSAqcHBkZXZpY2U7Ci1pbnQgaXNfY2xhaW1lZDsKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydCAqcHBvcnQ7CitzdGF0aWMgc3RydWN0IHBhcmRldmljZSAqcHBkZXZpY2U7CitzdGF0aWMgaW50IGlzX2NsYWltZWQ7CiAKLXVuc2lnbmVkIGludCB0eF9tYXNrID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHhfbWFzayA9IDE7CiAKIC8qKiogSW50ZXJuYWwgRnVuY3Rpb25zICoqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCmluZGV4IGQyNDQ1ZmQuLjgxZjkwZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKQEAgLTc0LDcgKzc0LDcgQEAKIHN0YXRpYyBpbnQgdmZkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgdmZkX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IHZmZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgdmZkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCXNpemVfdCBuX2J5dGVzLCBsb2ZmX3QgKnBvcyk7CiAKIC8qIExJUkMgZHJpdmVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KQEAgLTEyMCw3ICsxMjAsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmZkX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9ICZ2ZmRfb3BlbiwKLQkud3JpdGUJCT0gJnZmZF93cml0ZSwKKwkud3JpdGUJCT0gdmZkX3dyaXRlLAogCS51bmxvY2tlZF9pb2N0bAk9ICZ2ZmRfaW9jdGwsCiAJLnJlbGVhc2UJPSAmdmZkX2Nsb3NlLAogCS5sbHNlZWsJCT0gbm9vcF9sbHNlZWssCkBAIC0zNjAsNyArMzYwLDcgQEAKICAqIGFuZCByZXF1aXJlcyBkYXRhIGluIDkgY29uc2VjdXRpdmUgVVNCIGludGVycnVwdCBwYWNrZXRzLAogICogZWFjaCBwYWNrZXQgY2FycnlpbmcgOCBieXRlcy4KICAqLwotc3RhdGljIHNzaXplX3QgdmZkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IG5fYnl0ZXMsIGxvZmZfdCAqcG9zKQogewogCWludCBpOwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlkYXRhX2J1ZiA9IG1lbWR1cF91c2VyKGJ1Ziwgbl9ieXRlcyk7CisJZGF0YV9idWYgPSBtZW1kdXBfdXNlcigodm9pZCBjb25zdCBfX3VzZXIgKilidWYsIG5fYnl0ZXMpOwogCWlmIChJU19FUlIoZGF0YV9idWYpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIoZGF0YV9idWYpOwogCQlnb3RvIGV4aXQ7CkBAIC04NjUsMTUgKzg2NSwyMCBAQAogCQkJdXNiX2ZyZWVfdXJiKHR4X3VyYik7CiAJY2FzZSA2OgogCQl1c2JfZnJlZV91cmIocnhfdXJiKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSA1OgogCQlsaXJjX2J1ZmZlcl9mcmVlKHJidWYpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDQ6CiAJCWtmcmVlKHJidWYpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDM6CiAJCWtmcmVlKGRyaXZlcik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgMjoKIAkJa2ZyZWUoY29udGV4dCk7CiAJCWNvbnRleHQgPSBOVUxMOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDE6CiAJCWlmIChyZXR2YWwgPT0gMCkKIAkJCXJldHZhbCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbXNpMzEwMS9zZHItbXNpMzEwMS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL21zaTMxMDEvc2RyLW1zaTMxMDEuYwppbmRleCA0YzNiZjc3Li41YTA0MDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbXNpMzEwMS9zZHItbXNpMzEwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tc2kzMTAxL3Nkci1tc2kzMTAxLmMKQEAgLTQxMSw3ICs0MTEsNyBAQAogCXVuc2lnbmVkIGludCB2Yl9mdWxsOyAvKiB2YiBpcyBmdWxsIGFuZCBwYWNrZXRzIGRyb3BwZWQgKi8KIAogCXN0cnVjdCB1cmIgKnVyYnNbTUFYX0lTT19CVUZTXTsKLQlpbnQgKCpjb252ZXJ0X3N0cmVhbSkgKHN0cnVjdCBtc2kzMTAxX3N0YXRlICpzLCB1MzIgKmRzdCwgdTggKnNyYywKKwlpbnQgKCpjb252ZXJ0X3N0cmVhbSkoc3RydWN0IG1zaTMxMDFfc3RhdGUgKnMsIHUzMiAqZHN0LCB1OCAqc3JjLAogCQkJdW5zaWduZWQgaW50IHNyY19sZW4pOwogCiAJLyogQ29udHJvbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5jCmluZGV4IGIxYWU4ZTkuLmY0ZGQzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguYwpAQCAtMjQ5LDExICsyNDksMTEgQEAKIH07CiAKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0Y204MjV4X3JlZyAqdGNtODI1eF9zaXpfcmVnW05VTV9JTUFHRV9TSVpFU10gPQoteyAmc3VicWNpZiwgJnFxdmdhLCAmcWNpZiwgJnF2Z2EsICZjaWYsICZ2Z2EgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGNtODI1eF9yZWcgKnRjbTgyNXhfc2l6X3JlZ1tOVU1fSU1BR0VfU0laRVNdID0geworCSZzdWJxY2lmLCAmcXF2Z2EsICZxY2lmLCAmcXZnYSwgJmNpZiwgJnZnYSB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRjbTgyNXhfcmVnICp0Y204MjV4X2ZtdF9yZWdbTlVNX1BJWEVMX0ZPUk1BVFNdID0KLXsgJnl1djQyMiwgJnJnYjU2NSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0Y204MjV4X3JlZyAqdGNtODI1eF9mbXRfcmVnW05VTV9QSVhFTF9GT1JNQVRTXSA9IHsKKwkmeXV2NDIyLCAmcmdiNTY1IH07CiAKIC8qCiAgKiBSZWFkIGEgdmFsdWUgZnJvbSBhIHJlZ2lzdGVyIGluIGFuIFRDTTgyNVggc2Vuc29yIGRldmljZS4gIFRoZSB2YWx1ZSBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmgKaW5kZXggZTJkMWJjZC4uOTk3MGZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5oCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkvKiBTZXQgcG93ZXIgc3RhdGUsIHplcm8gaXMgb2ZmLCBub24temVybyBpcyBvbi4gKi8KIAlpbnQgKCpwb3dlcl9zZXQpKGludCBwb3dlcik7CiAJLyogRGVmYXVsdCByZWdpc3RlcnMgd3JpdHRlbiBhZnRlciBwb3dlci1vbiBvciByZXNldC4gKi8KLQljb25zdCBzdHJ1Y3QgdGNtODI1eF9yZWcgKigqZGVmYXVsdF9yZWdzKSh2b2lkKTsKKwljb25zdCBzdHJ1Y3QgdGNtODI1eF9yZWcgKiAoKmRlZmF1bHRfcmVncykodm9pZCk7CiAJaW50ICgqbmVlZHNfcmVzZXQpKHN0cnVjdCB2NGwyX2ludF9kZXZpY2UgKnMsIHZvaWQgKmJ1ZiwKIAkJCSAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmZtdCk7CiAJaW50ICgqaWZwYXJtKShzdHJ1Y3QgdjRsMl9pZnBhcm0gKnApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCAyY2I0NGRlLi43MWY1OTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2NvcmUuYwpAQCAtMTU4LDggKzE1OCw4IEBACiAKIAljYW0tPm5idWZmZXJzID0gY291bnQ7CiAJd2hpbGUgKGNhbS0+bmJ1ZmZlcnMgPiAwKSB7Ci0JCWlmICgoYnVmZiA9IHZtYWxsb2NfMzJfdXNlcihjYW0tPm5idWZmZXJzICoKLQkJCQkJICAgIFBBR0VfQUxJR04oaW1hZ2VzaXplKSkpKQorCQlidWZmID0gdm1hbGxvY18zMl91c2VyKGNhbS0+bmJ1ZmZlcnMgKiBQQUdFX0FMSUdOKGltYWdlc2l6ZSkpOworCQlpZiAoYnVmZikKIAkJCWJyZWFrOwogCQljYW0tPm5idWZmZXJzLS07CiAJfQpAQCAtMTEyMSw3ICsxMTIxLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCh2YWwgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgY2FtLT5zeXNmcy5yZWcpKSA8IDApIHsKKwl2YWwgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgY2FtLT5zeXNmcy5yZWcpOworCWlmICh2YWwgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmc245YzEwMl9zeXNmc19sb2NrKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTI1Niw3ICsxMjU3LDggQEAKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCi0JaWYgKCh2YWwgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgY2FtLT5zeXNmcy5pMmNfcmVnKSkgPCAwKSB7CisJdmFsID0gc245YzEwMl9pMmNfcmVhZChjYW0sIGNhbS0+c3lzZnMuaTJjX3JlZyk7CisJaWYgKHZhbCA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZzbjljMTAyX3N5c2ZzX2xvY2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xNDQwLDI3ICsxNDQyLDM1IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJihjYW0tPnY0bGRldi0+ZGV2KTsKIAlpbnQgZXJyID0gMDsKIAotCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZykpKQorCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWcpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dDsKLQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92YWwpKSkKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdmFsKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycl9yZWc7Ci0JaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZnJhbWVfaGVhZGVyKSkpCisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2ZyYW1lX2hlYWRlcik7CisJaWYgKGVycikKIAkJZ290byBlcnJfdmFsOwogCiAJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykgewotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pMmNfcmVnKSkpCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pMmNfcmVnKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gZXJyX2ZyYW1lX2hlYWRlcjsKLQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaTJjX3ZhbCkpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaTJjX3ZhbCk7CisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9pMmNfcmVnOwogCX0KIAogCWlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMSB8fCBjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMikgewotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9ncmVlbikpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZ3JlZW4pOworCQlpZiAoZXJyKQogCQkJZ290byBlcnJfaTJjX3ZhbDsKIAl9IGVsc2UgewotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9ibHVlKSkpCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9ibHVlKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gZXJyX2kyY192YWw7Ci0JCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZCkpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVkKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gZXJyX2JsdWU7CiAJfQogCkBAIC0xNjg0LDExICsxNjk0LDEzIEBACiAJZWxzZQogCQlEQkcoMywgIlVuY29tcHJlc3NlZCB2aWRlbyBmb3JtYXQgaXMgYWN0aXZlIik7CiAKLQlpZiAocy0+c2V0X2Nyb3ApCi0JCWlmICgoZXJyID0gcy0+c2V0X2Nyb3AoY2FtLCByZWN0KSkpIHsKKwlpZiAocy0+c2V0X2Nyb3ApIHsKKwkJZXJyID0gcy0+c2V0X2Nyb3AoY2FtLCByZWN0KTsKKwkJaWYgKGVycikgewogCQkJREJHKDMsICJzZXRfY3JvcCgpIGZhaWxlZCIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQorCX0KIAogCWlmIChzLT5zZXRfY3RybCkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5xY3RybCk7IGkrKykKQEAgLTE4MzUsNyArMTg0Nyw4IEBACiAJCWNhbS0+c3RhdGUgJj0gfkRFVl9NSVNDT05GSUdVUkVEOwogCX0KIAotCWlmICgoZXJyID0gc245YzEwMl9zdGFydF90cmFuc2ZlcihjYW0pKSkKKwllcnIgPSBzbjljMTAyX3N0YXJ0X3RyYW5zZmVyKGNhbSk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBjYW07CkBAIC0yMzA4LDcgKzIzMjEsOCBAQAogCX0KIAlpZiAoaSA9PSBBUlJBWV9TSVpFKHMtPnFjdHJsKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChlcnIgPSBzLT5zZXRfY3RybChjYW0sICZjdHJsKSkpCisJZXJyID0gcy0+c2V0X2N0cmwoY2FtLCAmY3RybCk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCXMtPl9xY3RybFtpXS5kZWZhdWx0X3ZhbHVlID0gY3RybC52YWx1ZTsKQEAgLTI0MTYsOSArMjQzMCwxMSBAQAogCX0gZWxzZQogCQlzY2FsZSA9IDE7CiAKLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQotCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKSB7CisJCWVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKKwl9CiAKIAlpZiAoY29weV90b191c2VyKGFyZywgJmNyb3AsIHNpemVvZihjcm9wKSkpIHsKIAkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CkBAIC0yNjcyLDkgKzI2ODgsMTEgQEAKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfQogCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikgeworCQllcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJfQogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKSkgewogCQljYW0tPnN0cmVhbSA9IHN0cmVhbTsKQEAgLTI3NDYsOSArMjc2NCwxMSBAQAogCWlmIChqYy5xdWFsaXR5ICE9IDAgJiYgamMucXVhbGl0eSAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pIHsKKwkJZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCX0KIAogCWVyciArPSBzbjljMTAyX3NldF9jb21wcmVzc2lvbihjYW0sICZqYyk7CiAJaWYgKGVycikgeyAvKiBhdG9taWMsIG5vIHJvbGxiYWNrIGluIGlvY3RsKCkgKi8KQEAgLTI3OTQsOSArMjgxNCwxMSBAQAogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikgeworCQllcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJfQogCiAJc245YzEwMl9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOwogCkBAIC0yOTc0LDkgKzI5OTYsMTEgQEAKIAlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pIHsKKwkJZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCX0KIAogCXNuOWMxMDJfZW1wdHlfZnJhbWVxdWV1ZXMoY2FtKTsKIApAQCAtMzI1MCw3ICszMjc0LDggQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgZXJyID0gMCwgcjsKIAotCWlmICghKGNhbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbjljMTAyX2RldmljZSksIEdGUF9LRVJORUwpKSkKKwljYW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljYW0tPnVzYmRldiA9IHVkZXY7CkBAIC0zMjYyLDEzICszMjg3LDE1IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoIShjYW0tPmNvbnRyb2xfYnVmZmVyID0ga3phbGxvYyg4LCBHRlBfS0VSTkVMKSkpIHsKKwljYW0tPmNvbnRyb2xfYnVmZmVyID0ga3phbGxvYyg4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbS0+Y29udHJvbF9idWZmZXIpIHsKIAkJREJHKDEsICJremFsbG9jKCkgZmFpbGVkIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoIShjYW0tPnY0bGRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpKSkgeworCWNhbS0+djRsZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCFjYW0tPnY0bGRldikgewogCQlEQkcoMSwgInZpZGVvX2RldmljZV9hbGxvYygpIGZhaWxlZCIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCmluZGV4IDJkY2U1YzkuLjQ2ODA3MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCkBAIC01MywyNyArNTMsMzIgQEAKIAkJfQogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzEpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzEpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gMHgzZiAtIChjdHJsLT52YWx1ZSAmIDB4M2YpOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMzKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMzKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IDB4M2YgLSAoY3RybC0+dmFsdWUgJiAweDNmKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMikpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMik7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAweDNmIC0gKGN0cmwtPnZhbHVlICYgMHgzZik7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9SRVNFVF9MRVZFTDoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDNmOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfUElYRUxfQklBU19WT0xUQUdFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzQpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzQpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MDc7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYwppbmRleCA0Mjk1ODg3Li4yNmE5MTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYwpAQCAtMTQyLDI2ICsxNDIsMzEgQEAKIHsKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSBjdHJsLT52YWx1ZSAmIDB4M2Y7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgJiAweDNmOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMyKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMyKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IGN0cmwtPnZhbHVlICYgMHgzZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTDoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDAxKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDAxKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IChjdHJsLT52YWx1ZSAmIDB4MDgpID8gMSA6IDA7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKaW5kZXggODAzNzEyYy4uZDNhMWJkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzYzMC5jCkBAIC0yNjAsNyArMjYwLDggQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CkBAIC0yODAsMzcgKzI4MSw0NCBAQAogCQlicmVhazsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4M2Y7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDNmOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1dISVRFTkVTUzoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBkKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBkKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDNmOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MDE7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHg3NSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHg3NSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDgwKSA/IDEgOiAwOwogCQlicmVhazsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR0FNTUE6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxNCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxNCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDAyKSA/IDEgOiAwOwogCQlicmVhazsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfQkFORF9GSUxURVI6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgyZCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgyZCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDAyKSA/IDEgOiAwOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzY2MC5jCmluZGV4IDc5Nzc3OTUuLjUzMDE1N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYwpAQCAtMjc4LDQxICsyNzgsNDkgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDAyKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDAyKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IChjdHJsLT52YWx1ZSAmIDB4MDQpID8gMSA6IDA7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHg3ZjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNikpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNik7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHg3ZjsKIAkJYnJlYWs7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHg3ZjsKIAkJYnJlYWs7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0JBTkRfRklMVEVSOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4M2IpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4M2IpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MDg7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDAwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDAwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDFmOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MDE7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczEwNmIuYwppbmRleCA4MWNkOTY5Li40N2JkODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczEwNmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczEwNmIuYwpAQCAtNjIsMzIgKzYyLDM4IEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDFmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA5KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA5KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDFmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgxZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBmKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBmKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDA3OwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBhKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBhKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IChjdHJsLT52YWx1ZSAmIDB4MWYpIDw8IDE7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9EQUNfTUFHTklUVURFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDgpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDgpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4Zjg7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMKaW5kZXggMmU4NmZkYy4uY2JmYWNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCkBAIC05MiwyNyArOTIsMzIgQEAKIAkJfQogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDkpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDkpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MGY7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDcpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDcpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MGY7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDFmOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA4KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA4KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDBmOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1jb3JlLmMKaW5kZXggNDgwYjdjNC4uZjY3MDQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtY29yZS5jCkBAIC00MCw3ICs0MCw3IEBACiBNT0RVTEVfVkVSU0lPTihTT0xPNlgxMF9WRVJTSU9OKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotdW5zaWduZWQgdmlkZW9fbnIgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCB2aWRlb19uciA9IC0xOwogbW9kdWxlX3BhcmFtKHZpZGVvX25yLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsICJ2aWRlb1ggc3RhcnQgbnVtYmVyLCAtMSBpcyBhdXRvZGV0ZWN0IChkZWZhdWx0KSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtZzcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWc3MjMuYwppbmRleCAxZGIxOGM3Li43NGYwMzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtZzcyMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1nNzIzLmMKQEAgLTM2Niw4ICszNjYsOSBAQAogCS8qIEFsbG93cyBmb3IgZWFzaWVyIG1hcHBpbmcgYmV0d2VlbiB2aWRlbyBhbmQgYXVkaW8gKi8KIAlzcHJpbnRmKG5hbWUsICJTb2Z0bG9naWMlZCIsIHNvbG9fZGV2LT52ZmQtPm51bSk7CiAKLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBuYW1lLCBUSElTX01PRFVMRSwgMCwKLQkJCSAgICAgICZzb2xvX2Rldi0+c25kX2NhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmc29sb19kZXYtPnBkZXYtPmRldiwKKwkJCSAgIFNORFJWX0RFRkFVTFRfSURYMSwgbmFtZSwgVEhJU19NT0RVTEUsIDAsCisJCQkgICAmc29sb19kZXYtPnNuZF9jYXJkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzc3LDcgKzM3OCw2IEBACiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlNPTE8tNngxMCBBdWRpbyIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBvbiAlcyBJUlEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCiAJCXBjaV9uYW1lKHNvbG9fZGV2LT5wZGV2KSwgc29sb19kZXYtPnBkZXYtPmlycSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmc29sb19kZXYtPnBkZXYtPmRldik7CiAKIAlyZXQgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIHNvbG9fZGV2LCAmb3BzKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC10dzI4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdHcyOC5jCmluZGV4IGFmNjVlYTYuLjM2ZGFhMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC10dzI4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXR3MjguYwpAQCAtNTE2LDcgKzUxNiw3IEBACiBzdGF0aWMgdm9pZCBzYWE3MTJ4X3dyaXRlX3JlZ3Moc3RydWN0IHNvbG9fZGV2ICpkZXYsIGNvbnN0IHVpbnQ4X3QgKnZhbHMsCiAJCWludCBzdGFydCwgaW50IG4pCiB7Ci0JZm9yICg7c3RhcnQgPCBuOyBzdGFydCsrLCB2YWxzKyspIHsKKwlmb3IgKDsgc3RhcnQgPCBuOyBzdGFydCsrLCB2YWxzKyspIHsKIAkJLyogU2tpcCByZWFkLW9ubHkgcmVnaXN0ZXJzICovCiAJCXN3aXRjaCAoc3RhcnQpIHsKIAkJLyogY2FzZSAweDAwIC4uLiAweDI1OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdjRsMi1lbmMuYwppbmRleCBjZTllNWFhLi41YWViOWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdjRsMi1lbmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdjRsMi1lbmMuYwpAQCAtMzk5LDggKzM5OSw4IEBACiAJaWYgKHNvbG9fZW5jLT5kZXNjX2NvdW50IDw9IDEpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHNvbG9fcDJtX2RtYV9kZXNjKHNvbG9fZGV2LCBzb2xvX2VuYy0+ZGVzY19pdGVtcywgc29sb19lbmMtPmRlc2NfZG1hLAotCQkJCSBzb2xvX2VuYy0+ZGVzY19jb3VudCAtIDEpOworCXJldHVybiBzb2xvX3AybV9kbWFfZGVzYyhzb2xvX2Rldiwgc29sb19lbmMtPmRlc2NfaXRlbXMsCisJCQlzb2xvX2VuYy0+ZGVzY19kbWEsIHNvbG9fZW5jLT5kZXNjX2NvdW50IC0gMSk7CiB9CiAKIC8qIEV4dHJhY3QgdmFsdWVzIGZyb20gVk9QIGhlYWRlciAtIFZFX1NUQVRVU3h4ICovCkBAIC00NzIsOCArNDcyLDcgQEAKIAlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgdm9wX2pwZWdfc2l6ZSh2aCkgKyBzb2xvX2VuYy0+anBlZ19sZW4pCiAJCXJldHVybiAtRUlPOwogCi0JZnJhbWVfc2l6ZSA9ICh2b3BfanBlZ19zaXplKHZoKSArIHNvbG9fZW5jLT5qcGVnX2xlbiArIChETUFfQUxJR04gLSAxKSkKLQkJJiB+KERNQV9BTElHTiAtIDEpOworCWZyYW1lX3NpemUgPSBBTElHTih2b3BfanBlZ19zaXplKHZoKSArIHNvbG9fZW5jLT5qcGVnX2xlbiwgRE1BX0FMSUdOKTsKIAl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIHZvcF9qcGVnX3NpemUodmgpICsgc29sb19lbmMtPmpwZWdfbGVuKTsKIAogCS8qIG1heSBkaXNjYXJkIGFsbCBwcmV2aW91cyBkYXRhIGluIHZidWYtPnNnbCAqLwpAQCAtNTA2LDIxICs1MDUsMjIgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiBJZiB0aGlzIGlzIGEga2V5IGZyYW1lLCBhZGQgZXh0cmEgaGVhZGVyICovCi0JdmItPnY0bDJfYnVmLmZsYWdzICY9IH4oVjRMMl9CVUZfRkxBR19LRVlGUkFNRSB8IFY0TDJfQlVGX0ZMQUdfUEZSQU1FIHwgVjRMMl9CVUZfRkxBR19CRlJBTUUpOworCXZiLT52NGwyX2J1Zi5mbGFncyAmPSB+KFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUgfCBWNEwyX0JVRl9GTEFHX1BGUkFNRSB8CisJCVY0TDJfQlVGX0ZMQUdfQkZSQU1FKTsKIAlpZiAoIXZvcF90eXBlKHZoKSkgewogCQlza2lwID0gc29sb19lbmMtPnZvcF9sZW47CiAJCXZiLT52NGwyX2J1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOwotCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIHZvcF9tcGVnX3NpemUodmgpICsgc29sb19lbmMtPnZvcF9sZW4pOworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIHZvcF9tcGVnX3NpemUodmgpICsKKwkJCXNvbG9fZW5jLT52b3BfbGVuKTsKIAl9IGVsc2UgewogCQl2Yi0+djRsMl9idWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19QRlJBTUU7CiAJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgdm9wX21wZWdfc2l6ZSh2aCkpOwogCX0KIAogCS8qIE5vdyBnZXQgdGhlIGFjdHVhbCBtcGVnIHBheWxvYWQgKi8KLQlmcmFtZV9vZmYgPSAodm9wX21wZWdfb2Zmc2V0KHZoKSAtIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBzaXplb2YoKnZoKSkKLQkJJSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpOwotCWZyYW1lX3NpemUgPSAodm9wX21wZWdfc2l6ZSh2aCkgKyBza2lwICsgKERNQV9BTElHTiAtIDEpKQotCQkmIH4oRE1BX0FMSUdOIC0gMSk7CisJZnJhbWVfb2ZmID0gKHZvcF9tcGVnX29mZnNldCh2aCkgLSBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsKKwkJc2l6ZW9mKCp2aCkpICUgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KTsKKwlmcmFtZV9zaXplID0gQUxJR04odm9wX21wZWdfc2l6ZSh2aCkgKyBza2lwLCBETUFfQUxJR04pOwogCiAJLyogbWF5IGRpc2NhcmQgYWxsIHByZXZpb3VzIGRhdGEgaW4gdmJ1Zi0+c2dsICovCiAJZG1hX21hcF9zZygmc29sb19kZXYtPnBkZXYtPmRldiwgdmJ1Zi0+c2dsLCB2YnVmLT5uZW50cywKQEAgLTU4OSw3ICs1ODksOCBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2xvX2VuYy0+YXZfbG9jaywgZmxhZ3MpOwogCQlnb3RvIHVubG9jazsKIAl9Ci0JdmIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzb2xvX2VuYy0+dmlkcV9hY3RpdmUsIHN0cnVjdCBzb2xvX3ZiMl9idWYsIGxpc3QpOworCXZiID0gbGlzdF9maXJzdF9lbnRyeSgmc29sb19lbmMtPnZpZHFfYWN0aXZlLCBzdHJ1Y3Qgc29sb192YjJfYnVmLAorCQlsaXN0KTsKIAlsaXN0X2RlbCgmdmItPmxpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvbG9fZW5jLT5hdl9sb2NrLCBmbGFncyk7CiAKQEAgLTY0NSw3ICs2NDYsOCBAQAogCQllbmNfYnVmLnZoID0gc29sb19kZXYtPnZoX2J1ZjsKIAogCQkvKiBTYW5pdHkgY2hlY2sgKi8KLQkJaWYgKHZvcF9tcGVnX29mZnNldChlbmNfYnVmLnZoKSAhPSBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmKQorCQlpZiAodm9wX21wZWdfb2Zmc2V0KGVuY19idWYudmgpICE9CisJCQlTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmKQogCQkJY29udGludWU7CiAKIAkJaWYgKHNvbG9fbW90aW9uX2RldGVjdGVkKHNvbG9fZW5jKSkKQEAgLTY4MCw5ICs2ODIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzb2xvX2VuY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKLQkJCSAgIHVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywKLQkJCSAgIHVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCitzdGF0aWMgaW50IHNvbG9fZW5jX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnEsCisJCQkJY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisJCQkJdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywKKwkJCQl1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsIHVuc2lnbmVkIGludCBzaXplc1tdLAorCQkJCXZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzaXplc1swXSA9IEZSQU1FX0JVRl9TSVpFOwogCSpudW1fcGxhbmVzID0gMTsKQEAgLTExMTIsMTQgKzExMTYsMTUgQEAKIAkJc29sb19lbmMtPm1vdGlvbl90aHJlc2ggPSBjdHJsLT52YWw7CiAJCWlmICghc29sb19lbmMtPm1vdGlvbl9nbG9iYWwgfHwgIXNvbG9fZW5jLT5tb3Rpb25fZW5hYmxlZCkKIAkJCXJldHVybiAwOwotCQlyZXR1cm4gc29sb19zZXRfbW90aW9uX3RocmVzaG9sZChzb2xvX2Rldiwgc29sb19lbmMtPmNoLCBjdHJsLT52YWwpOworCQlyZXR1cm4gc29sb19zZXRfbW90aW9uX3RocmVzaG9sZChzb2xvX2Rldiwgc29sb19lbmMtPmNoLAorCQkJY3RybC0+dmFsKTsKIAljYXNlIFY0TDJfQ0lEX01PVElPTl9NT0RFOgogCQlzb2xvX2VuYy0+bW90aW9uX2dsb2JhbCA9IGN0cmwtPnZhbCA9PSAxOwogCQlzb2xvX2VuYy0+bW90aW9uX2VuYWJsZWQgPSBjdHJsLT52YWwgPiAwOwogCQlpZiAoY3RybC0+dmFsKSB7CiAJCQlpZiAoc29sb19lbmMtPm1vdGlvbl9nbG9iYWwpCi0JCQkJc29sb19zZXRfbW90aW9uX3RocmVzaG9sZChzb2xvX2Rldiwgc29sb19lbmMtPmNoLAotCQkJCQkJc29sb19lbmMtPm1vdGlvbl90aHJlc2gpOworCQkJCXNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc29sb19kZXYsCisJCQkJCXNvbG9fZW5jLT5jaCwgc29sb19lbmMtPm1vdGlvbl90aHJlc2gpOwogCQkJZWxzZQogCQkJCXNvbG9fc2V0X21vdGlvbl9ibG9jayhzb2xvX2Rldiwgc29sb19lbmMtPmNoLAogCQkJCQkJJnNvbG9fZW5jLT5tb3Rpb25fdGhyZXNob2xkcyk7CkBAIC0xMzA3LDcgKzEzMTIsOCBAQAogCXNvbG9fZW5jLT5kZXNjX25lbHRzID0gMzI7CiAJc29sb19lbmMtPmRlc2NfaXRlbXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzb2xvX2Rldi0+cGRldiwKIAkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNvbG9fcDJtX2Rlc2MpICoKLQkJCQkgICAgICBzb2xvX2VuYy0+ZGVzY19uZWx0cywgJnNvbG9fZW5jLT5kZXNjX2RtYSk7CisJCQkJICAgICAgc29sb19lbmMtPmRlc2NfbmVsdHMsCisJCQkJICAgICAgJnNvbG9fZW5jLT5kZXNjX2RtYSk7CiAJcmV0ID0gLUVOT01FTTsKIAlpZiAoc29sb19lbmMtPmRlc2NfaXRlbXMgPT0gTlVMTCkKIAkJZ290byBoZGxfZnJlZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCmluZGV4IDMxYjI2OWEuLmM4M2UzMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwpAQCAtMzA3LDcgKzMwNyw4IEBACiB9CiAKIHN0YXRpYyB1MTYgeGxyX25ldF9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJdm9pZCAqYWNjZWxfcHJpdiwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2spCisJCQkJdm9pZCAqYWNjZWxfcHJpdiwKKwkJCQlzZWxlY3RfcXVldWVfZmFsbGJhY2tfdCBmYWxsYmFjaykKIHsKIAlyZXR1cm4gKHUxNilzbXBfcHJvY2Vzc29yX2lkKCk7CiB9CkBAIC02MTQsOCArNjE1LDYgQEAKIAkJayA9IChrICsgMSkgJSBqOwogCQliMiA9IGJrdHNba107CiAJCWsgPSAoayArIDEpICUgajsKLQkJdmFsID0gKChjMSA8PCAyMykgfCAoYjEgPDwgMTcpIHwgKHVzZV9ia3QgPDwgMTYpIHwKLQkJCQkoYzIgPDwgNykgfCAoYjIgPDwgMSkgfCAodXNlX2JrdCA8PCAwKSk7CiAKIAkJdmFsID0gKChjMSA8PCAyMykgfCAoYjEgPDwgMTcpIHwgKHVzZV9ia3QgPDwgMTYpIHwKIAkJCQkoYzIgPDwgNykgfCAoYjIgPDwgMSkgfCAodXNlX2JrdCA8PCAwKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzNmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK2NvbmZpZyBCVF9OT0tJQV9INFAKKwl0cmlzdGF0ZSAiSENJIGRyaXZlciB3aXRoIEg0IE5va2lhIGV4dGVuc2lvbnMiCisJZGVwZW5kcyBvbiBCVCAmJiBBUkNIX09NQVAKKwloZWxwCisJICBCbHVldG9vdGggSENJIGRyaXZlciB3aXRoIEg0IGV4dGVuc2lvbnMuICBUaGlzIGRyaXZlciBwcm92aWRlcworCSAgc3VwcG9ydCBmb3IgSDQrIEJsdWV0b290aCBjaGlwIHdpdGggdmVuZG9yLXNwZWNpZmljIEg0IGV4dGVuc2lvbnMuCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBoNCBleHRlbmRlZCBkZXZpY2VzIGludG8gdGhlIGtlcm5lbAorCSAgb3Igc2F5IE0gdG8gY29tcGlsZSBpdCBhcyBtb2R1bGUgKGJ0bm9raWFfaDRwKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MjVkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorCitvYmotJChDT05GSUdfQlRfTk9LSUFfSDRQKQkJKz0gYnRub2tpYV9oNHAubworYnRub2tpYV9oNHAtb2JqcyA6PSBub2tpYV9jb3JlLm8gbm9raWFfZncubyBub2tpYV91YXJ0Lm8gbm9raWFfZnctY3NyLm8gXAorCQlub2tpYV9mdy1iY20ubyBub2tpYV9mdy10aTEyNzMubworCitjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNTgyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvVE9ETwpAQCAtMCwwICsxLDEzMiBAQAorRmV3IGF0dGVtcHRzIHRvIHN1Ym1pc3Npb24gaGF2ZSBiZWVuIG1hZGUsIGxhc3QgcmV2aWV3IGNvbW1lbnRzIHdlcmUgcmVjZWl2ZWQgaW4KKworRGF0ZTogV2VkLCAxNSBKYW4gMjAxNCAxOTowMTo1MSAtMDgwMAorRnJvbTogTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorU3ViamVjdDogUmU6IFtQQVRDSCB2Nl0gQmx1ZXRvb3RoOiBBZGQgaGNpX2g0cCBkcml2ZXIKKworU29tZSBjb2RlIHJlZmFjdG9yaW5nIGlzIHN0aWxsIG5lZWRlZC4KKworVE9ETzoKKworPiArKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDRwLmgKKworY2FuIHdlIHBsZWFzZSBnZXQgdGhlIG5hbWluZyBzdHJhaWdodC4gRmlsZSBuYW1lcyBkbyBub3Qgc3RhcnQgd2l0aAoraGNpXyBhbnltb3JlLiBXZSBtb3ZlZCBhd2F5IGZyb20gaXQgc2luY2UgdGhhdCB0ZXJtIGlzIHRvbyBnZW5lcmljLgorCis+ICtzdHJ1Y3QgaGNpX2g0cF9pbmZvIHsKKworQ2FuIHdlIHBsZWFzZSBnZXQgcmlkIG9mIHRoZSBoY2lfIHByZWZpeCBmb3IgZXZlcnl0aGluZy4gQ29weWluZyBmcm9tCitkcml2ZXJzIHRoYXQgYXJlIG92ZXIgMTAgeWVhcnMgb2xkIGlzIG5vdCBhIGdvb2QgaWRlYS4gUGxlYXNlIGxvb2sgYXQKK3JlY2VudCBvbmVzLgorCis+ICsgICAgIHN0cnVjdCB0aW1lcl9saXN0IGxhenlfcmVsZWFzZTsKKworVGltZXI/IE5vdCBkZWxheWVkIHdvcms/CisKKz4gK3ZvaWQgaGNpX2g0cF9vdXRiKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQsIHU4IHZhbCk7Cis+ICt1OCBoY2lfaDRwX2luYihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKKz4gK3ZvaWQgaGNpX2g0cF9zZXRfcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBhY3RpdmUpOworPiAraW50IGhjaV9oNHBfd2FpdF9mb3JfY3RzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBhY3RpdmUsIGludCB0aW1lb3V0X21zKTsKKz4gK3ZvaWQgX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgb24sIHU4IHdoaWNoKTsKKz4gK3ZvaWQgaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IG9uLCB1OCB3aGljaCk7Cis+ICt2b2lkIGhjaV9oNHBfY2hhbmdlX3NwZWVkKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgc3BlZWQpOworPiAraW50IGhjaV9oNHBfcmVzZXRfdWFydChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKKz4gK3ZvaWQgaGNpX2g0cF9pbml0X3VhcnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cis+ICt2b2lkIGhjaV9oNHBfZW5hYmxlX3R4KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOworPiArdm9pZCBoY2lfaDRwX3N0b3JlX3JlZ3Moc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cis+ICt2b2lkIGhjaV9oNHBfcmVzdG9yZV9yZWdzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOworPiArdm9pZCBoY2lfaDRwX3NtYXJ0X2lkbGUoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgYm9vbCBlbmFibGUpOworCitUaGVzZSBhcmUgYSBsb3Qgb2YgcHVibGljIGZ1bmN0aW9ucy4gQXJlIHRoZXkgYWxsIHJlYWxseSBuZWVkZWQgb3IgY2FuCit0aGUgY29kZSBiZSBkb25lIHNtYXJ0LgorCis+ICtzdGF0aWMgc3NpemVfdCBoY2lfaDRwX3N0b3JlX2JkYWRkcihzdHJ1Y3QgZGV2aWNlICpkZXYsCis+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKz4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorPiAreworPiArICAgICBzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKK1NpbmNlIG5vbmUgb2YgdGhlc2UgZGV2aWNlcyBjYW4gZnVuY3Rpb24gd2l0aG91dCBoYXZpbmcgYSB2YWxpZAorYWRkcmVzcywgdGhlIHdheSB0aGlzIHNob3VsZCB3b3JrIGlzIHRoYXQgd2Ugc2hvdWxkIG5vdCByZWdpc3RlciB0aGUKK0hDSSBkZXZpY2Ugd2hlbiBwcm9iaW5nIHRoZSBwbGF0Zm9ybSBkZXZpY2UuCisgICAgCitUaGUgSENJIGRldmljZSBzaG91bGQgYmUgcmVnaXN0ZXJlZCBvbmNlIGEgdmFsaWQgYWRkcmVzcyBoYXMgYmVlbgord3JpdHRlbiBpbnRvIHRoZSBzeXNmcyBmaWxlLiBJIGRvIG5vdCB3YW50IHRvIHBsYXkgdGhlIHRyaWNrcyB3aXRoCiticmluZ2luZyB1cCB0aGUgZGV2aWNlIHdpdGhvdXQgYSB2YWxpZCBhZGRyZXNzLgorCis+ICsgICAgIGhkZXYtPmNsb3NlID0gaGNpX2g0cF9oY2lfY2xvc2U7Cis+ICsgICAgIGhkZXYtPmZsdXNoID0gaGNpX2g0cF9oY2lfZmx1c2g7Cis+ICsgICAgIGhkZXYtPnNlbmQgPSBoY2lfaDRwX2hjaV9zZW5kX2ZyYW1lOworICAgIAorSXQgbmVlZHMgdG8gdXNlIGhkZXYtPnNldHVwIHRvIGxvYWQgdGhlIGZpcm13YXJlLiBJIGFzc3VtZSB0aGUKK2Zpcm13YXJlIG9ubHkgbmVlZHMgdG8gYmUgbG9hZGVkIG9uY2UuIFRoYXQgaXMgZXhhY3RseSB3aGF0CitoZGV2LT5zZXR1cCBkb2VzLiBJdCBnZXRzIGV4ZWN1dGVkIG9uY2UuCisgICAgCis+ICsgICAgIHNldF9iaXQoSENJX1FVSVJLX1JFU0VUX09OX0NMT1NFLCAmaGRldi0+cXVpcmtzKTsKKworSXMgdGhpcyBxdWlyayByZWFsbHkgbmVlZGVkPyBOb3JtYWxseSBvbmx5IEJsdWV0b290aCAxLjEgYW5kIGVhcmx5CitkZXZpY2VzIHF1YWxpZnkgZm9yIGl0LgorCis+ICtzdGF0aWMgaW50IGhjaV9oNHBfYmNtX3NldF9iZGFkZHIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKKz4gK3sKKz4gKyAgICAgaW50IGk7Cis+ICsgICAgIHN0YXRpYyBjb25zdCB1OCBub2tpYV9vdWlbM10gPSB7MHgwMCwgMHgxZiwgMHhkZn07Cis+ICsgICAgIGludCBub3RfdmFsaWQ7CisKK0hhcyB0aGlzIGFjdHVhbGx5IGJlZW4gY29uZmlybWVkIHRoYXQgd2UgY2FuIGp1c3QgcmFuZG9tbHkgc2V0IGFuCithZGRyZXNzIG91dCBvZiB0aGUgTm9raWEgcmFuZ2UuIEkgZG8gbm90IHRoaW5rIHNvLiBUaGlzIGlzIGEgcHJldHR5CitiYWQgaWRlYS4KKworSSBoYXZlIG5vIGludGVyZXN0IGluIG1lcmdpbmcgYSBkcml2ZXIgd2l0aCBzdWNoIGEgaGFjay4KKworPiArICAgICBub3RfdmFsaWQgPSAxOworPiArICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Cis+ICsgICAgICAgICAgICAgaWYgKGluZm8tPmJkX2FkZHJbaV0gIT0gMHgwMCkgeworPiArICAgICAgICAgICAgICAgICAgICAgbm90X3ZhbGlkID0gMDsKKz4gKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworPiArICAgICAgICAgICAgIH0gICAKKz4gKyAgICAgfQorCitBbnlib2R5IGV2ZXJ5IGhlYXJkIG9mIG1lbWNtcCBvciBiYWNtcCBhbmQgQkRBRERSX0FOWT8KKworPiArICAgICAgICAgICAgIGlmIChub3RfdmFsaWQpIHsKKz4gKyAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvKGluZm8tPmRldiwgIlZhbGlkIGJsdWV0b290aCBhZGRyZXNzIG5vdCBmb3VuZCwiCis+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzZXR0aW5nIHNvbWUgcmFuZG9tXG4iKTsKKz4gKyAgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gYWRkcmVzcyBpcyBub3QgdmFsaWQsIHVzZSBzb21lIHJhbmRvbSAqLworPiArICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGluZm8tPmJkX2FkZHIsIG5va2lhX291aSwgMyk7Cis+ICsgICAgICAgICAgICAgICAgICAgICBnZXRfcmFuZG9tX2J5dGVzKGluZm8tPmJkX2FkZHIgKyAzLCAzKTsKKz4gKyAgICAgICAgICAgICB9CisKKworQW5kIHdoeSBkb2VzIGV2ZXJ5IHNpbmdsZSBjaGlwIGZpcm13YXJlIGRvZXMgdGhpcyBkaWZmZXJlbnRseS4gU2VyaW91c2x5LCB0aGlzIGlzIGEgbWVzcy4KKworPiArdm9pZCBoY2lfaDRwX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IpCis+ICt7Cis+ICsgICAgIHN3aXRjaCAoaW5mby0+bWFuX2lkKSB7Cis+ICsgICAgIGNhc2UgSDRQX0lEX0NTUjoKKz4gKyAgICAgICAgICAgICBoY2lfaDRwX2JjNF9wYXJzZV9md19ldmVudChpbmZvLCBza2IpOworPiArICAgICAgICAgICAgIGJyZWFrOworLi4uCis+ICt9CisKK1dlIGhhdmUgcHJvcGVyIEhDSSBzeW5jIGNvbW1hbmQgaGFuZGxpbmcgaW4gcmVjZW50IGtlcm5lbHMuIEkgcmVhbGx5CitkbyBub3Qga25vdyB3aHkgdGhpcyBpcyBoYW5kIGNvZGVkIHRoZXNlIGRheXMuIENoZWNrIGhvdyB0aGUgSW50ZWwKK2Zpcm13YXJlIGxvYWRpbmcgaW5zaWRlIGJ0dXNiLmMgZG9lcyBpdC4KKworPiAraW5saW5lIHU4IGhjaV9oNHBfaW5iKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQpCis+ICt7IAorPiArICAgICByZXR1cm4gX19yYXdfcmVhZGIoaW5mby0+dWFydF9iYXNlICsgKG9mZnNldCA8PCAyKSk7Cis+ICt9CisKK0lubGluZSBpbiBhICouYyBmaWxlIGZvciBhIG5vbi1zdGF0aWMgZnVuY3Rpb24uIE1ha2VzIG5vIHNlbnNlIHRvIG1lLgorCis+ICsvKioKKz4gKyAqIHN0cnVjdCBoY2lfaDRwX3BsYXRmb3JtIGRhdGEgLSBoY2lfaDRwIFBsYXRmb3JtIGRhdGEgc3RydWN0dXJlCis+ICsgKi8KKz4gK3N0cnVjdCBoY2lfaDRwX3BsYXRmb3JtX2RhdGEgeworCitwbGVhc2UgaGF2ZSBhIHByb3BlciBuYW1lIGhlcmUuIEZvciBleGFtcGxlCitidG5va2lhX2g0cF9wbGF0Zm9ybV9kYXRhLgorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzoKK1BhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9oY2lfaDRwLmggYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL2hjaV9oNHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM0ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9oY2lfaDRwLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0RSSVZFUlNfQkxVRVRPT1RIX0hDSV9INFBfSAorI2RlZmluZSBfX0RSSVZFUlNfQkxVRVRPT1RIX0hDSV9INFBfSAorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2kuaD4KKworI2RlZmluZSBVQVJUX1NZU0NfT01BUF9SRVNFVAkweDAzCisjZGVmaW5lIFVBUlRfU1lTU19SRVNFVERPTkUJMHgwMQorI2RlZmluZSBVQVJUX09NQVBfU0NSX0VNUFRZX1RIUgkweDA4CisjZGVmaW5lIFVBUlRfT01BUF9TQ1JfV0FLRVVQCTB4MTAKKyNkZWZpbmUgVUFSVF9PTUFQX1NTUl9XQUtFVVAJMHgwMgorI2RlZmluZSBVQVJUX09NQVBfU1NSX1RYRlVMTAkweDAxCisKKyNkZWZpbmUgVUFSVF9PTUFQX1NZU0NfSURMRU1PREUJCTB4MDMKKyNkZWZpbmUgVUFSVF9PTUFQX1NZU0NfSURMRU1BU0sJCSgzIDw8IFVBUlRfT01BUF9TWVNDX0lETEVNT0RFKQorCisjZGVmaW5lIFVBUlRfT01BUF9TWVNDX0ZPUkNFX0lETEUJKDAgPDwgVUFSVF9PTUFQX1NZU0NfSURMRU1PREUpCisjZGVmaW5lIFVBUlRfT01BUF9TWVNDX05PX0lETEUJCSgxIDw8IFVBUlRfT01BUF9TWVNDX0lETEVNT0RFKQorI2RlZmluZSBVQVJUX09NQVBfU1lTQ19TTUFSVF9JRExFCSgyIDw8IFVBUlRfT01BUF9TWVNDX0lETEVNT0RFKQorCisjZGVmaW5lIEg0UF9UUkFOU0ZFUl9NT0RFCQkxCisjZGVmaW5lIEg0UF9TQ0hFRF9UUkFOU0ZFUl9NT0RFCQkyCisjZGVmaW5lIEg0UF9BQ1RJVkVfTU9ERQkJCTMKKworc3RydWN0IGhjaV9oNHBfaW5mbyB7CisJc3RydWN0IHRpbWVyX2xpc3QgbGF6eV9yZWxlYXNlOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXNwaW5sb2NrX3QgbG9jazsKKworCXZvaWQgX19pb21lbSAqdWFydF9iYXNlOworCXVuc2lnbmVkIGxvbmcgdWFydF9waHlzX2Jhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdTggY2hpcF90eXBlOworCXU4IGJ0X3dha2V1cF9ncGlvOworCXU4IGhvc3Rfd2FrZXVwX2dwaW87CisJdTggcmVzZXRfZ3BpbzsKKwl1OCByZXNldF9ncGlvX3NoYXJlZDsKKwl1OCBidF9zeXNjbGs7CisJdTggbWFuX2lkOworCXU4IHZlcl9pZDsKKworCXN0cnVjdCBza19idWZmX2hlYWQgZndfcXVldWU7CisJc3RydWN0IHNrX2J1ZmYgKmFsaXZlX2NtZF9za2I7CisJc3RydWN0IGNvbXBsZXRpb24gaW5pdF9jb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uIGZ3X2NvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24gdGVzdF9jb21wbGV0aW9uOworCWludCBmd19lcnJvcjsKKwlpbnQgaW5pdF9lcnJvcjsKKworCXN0cnVjdCBza19idWZmX2hlYWQgdHhxOworCisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsKKwlsb25nIHJ4X2NvdW50OworCXVuc2lnbmVkIGxvbmcgcnhfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBnYXJiYWdlX2J5dGVzOworCisJdTggYmRfYWRkcls2XTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xOworCisJaW50IHBtX2VuYWJsZWQ7CisJaW50IHR4X2VuYWJsZWQ7CisJaW50IGF1dG9ydHM7CisJaW50IHJ4X2VuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBwbV9mbGFnczsKKworCWludCB0eF9jbG9ja3NfZW47CisJaW50IHJ4X2Nsb2Nrc19lbjsKKwlzcGlubG9ja190IGNsb2Nrc19sb2NrOworCXN0cnVjdCBjbGsgKnVhcnRfaWNsazsKKwlzdHJ1Y3QgY2xrICp1YXJ0X2ZjbGs7CisJYXRvbWljX3QgY2xrX3VzZXJzOworCXUxNiBkbGw7CisJdTE2IGRsaDsKKwl1MTYgaWVyOworCXUxNiBtZHIxOworCXUxNiBlZnI7Cit9OworCitzdHJ1Y3QgaGNpX2g0cF9yYWRpb19oZHIgeworCV9fdTggZXZ0OworCV9fdTggZGxlbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoY2lfaDRwX25lZ19oZHIgeworCV9fdTggZGxlbjsKK30gX19wYWNrZWQ7CisjZGVmaW5lIEg0UF9ORUdfSERSX1NJWkUgMQorCisjZGVmaW5lIEg0UF9ORUdfUkVRCTB4MDAKKyNkZWZpbmUgSDRQX05FR19BQ0sJMHgyMAorI2RlZmluZSBINFBfTkVHX05BSwkweDQwCisKKyNkZWZpbmUgSDRQX1BST1RPX1BLVAkweDQ0CisjZGVmaW5lIEg0UF9QUk9UT19CWVRFCTB4NGMKKworI2RlZmluZSBINFBfSURfQ1NSCTB4MDIKKyNkZWZpbmUgSDRQX0lEX0JDTTIwNDgJMHgwNAorI2RlZmluZSBINFBfSURfVEkxMjcxCTB4MzEKKworc3RydWN0IGhjaV9oNHBfbmVnX2NtZCB7CisJX191OAlhY2s7CisJX191MTYJYmF1ZDsKKwlfX3UxNgl1bnVzZWQxOworCV9fdTgJcHJvdG87CisJX191MTYJc3lzX2NsazsKKwlfX3UxNgl1bnVzZWQyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGhjaV9oNHBfbmVnX2V2dCB7CisJX191OAlhY2s7CisJX191MTYJYmF1ZDsKKwlfX3UxNgl1bnVzZWQxOworCV9fdTgJcHJvdG87CisJX191MTYJc3lzX2NsazsKKwlfX3UxNgl1bnVzZWQyOworCV9fdTgJbWFuX2lkOworCV9fdTgJdmVyX2lkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBINFBfQUxJVkVfUkVRCTB4NTUKKyNkZWZpbmUgSDRQX0FMSVZFX1JFU1AJMHhjYworCitzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgeworCV9fdTgJZGxlbjsKK30gX19wYWNrZWQ7CisjZGVmaW5lIEg0UF9BTElWRV9IRFJfU0laRSAxCisKK3N0cnVjdCBoY2lfaDRwX2FsaXZlX3BrdCB7CisJX191OAltaWQ7CisJX191OAl1bnVzZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1BWF9CQVVEX1JBVEUJCTkyMTYwMAorI2RlZmluZSBCQzRfTUFYX0JBVURfUkFURQkzNjkyMzAwCisjZGVmaW5lIFVBUlRfQ0xPQ0sJCTQ4MDAwMDAwCisjZGVmaW5lIEJUX0lOSVRfRElWSURFUgkJMzIwCisjZGVmaW5lIEJUX0JBVURSQVRFX0RJVklERVIJMzg0MDAwMDAwCisjZGVmaW5lIEJUX1NZU0NMS19ESVYJCTEwMDAKKyNkZWZpbmUgSU5JVF9TUEVFRAkJMTIwMDAwCisKKyNkZWZpbmUgSDRfVFlQRV9TSVpFCQkxCisjZGVmaW5lIEg0X1JBRElPX0hEUl9TSVpFCTIKKworLyogSDQrIHBhY2tldCB0eXBlcyAqLworI2RlZmluZSBINF9DTURfUEtUCQkweDAxCisjZGVmaW5lIEg0X0FDTF9QS1QJCTB4MDIKKyNkZWZpbmUgSDRfU0NPX1BLVAkJMHgwMworI2RlZmluZSBINF9FVlRfUEtUCQkweDA0CisjZGVmaW5lIEg0X05FR19QS1QJCTB4MDYKKyNkZWZpbmUgSDRfQUxJVkVfUEtUCQkweDA3CisjZGVmaW5lIEg0X1JBRElPX1BLVAkJMHgwOAorCisvKiBUWCBzdGF0ZXMgKi8KKyNkZWZpbmUgV0FJVF9GT1JfUEtUX1RZUEUJMQorI2RlZmluZSBXQUlUX0ZPUl9IRUFERVIJCTIKKyNkZWZpbmUgV0FJVF9GT1JfREFUQQkJMworCitzdHJ1Y3QgaGNpX2Z3X2V2ZW50IHsKKwlzdHJ1Y3QgaGNpX2V2ZW50X2hkciBoZXY7CisJc3RydWN0IGhjaV9ldl9jbWRfY29tcGxldGUgY21kOworCXU4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKK2ludCBoY2lfaDRwX3NlbmRfYWxpdmVfcGFja2V0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOworCit2b2lkIGhjaV9oNHBfYmNtX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgaGNpX2g0cF9iY21fc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpOworCit2b2lkIGhjaV9oNHBfYmM0X3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgaGNpX2g0cF9iYzRfc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpOworCit2b2lkIGhjaV9oNHBfdGkxMjczX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGhjaV9oNHBfdGkxMjczX3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSk7CisKK2ludCBoY2lfaDRwX3JlYWRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpOworaW50IGhjaV9oNHBfc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSk7Cit2b2lkIGhjaV9oNHBfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3ZvaWQgaGNpX2g0cF9vdXRiKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQsIHU4IHZhbCk7Cit1OCBoY2lfaDRwX2luYihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK3ZvaWQgaGNpX2g0cF9zZXRfcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBhY3RpdmUpOworaW50IGhjaV9oNHBfd2FpdF9mb3JfY3RzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBhY3RpdmUsIGludCB0aW1lb3V0X21zKTsKK3ZvaWQgX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgb24sIHU4IHdoaWNoKTsKK3ZvaWQgaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IG9uLCB1OCB3aGljaCk7Cit2b2lkIGhjaV9oNHBfY2hhbmdlX3NwZWVkKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgc3BlZWQpOworaW50IGhjaV9oNHBfcmVzZXRfdWFydChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKK3ZvaWQgaGNpX2g0cF9pbml0X3VhcnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cit2b2lkIGhjaV9oNHBfZW5hYmxlX3R4KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOwordm9pZCBoY2lfaDRwX3N0b3JlX3JlZ3Moc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cit2b2lkIGhjaV9oNHBfcmVzdG9yZV9yZWdzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOwordm9pZCBoY2lfaDRwX3NtYXJ0X2lkbGUoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgYm9vbCBlbmFibGUpOworCisjZW5kaWYgLyogX19EUklWRVJTX0JMVUVUT09USF9IQ0lfSDRQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxOWNkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfY29yZS5jCkBAIC0wLDAgKzEsMTIwNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqIFRoYW5rcyB0byBhbGwgdGhlIE5va2lhIHBlb3BsZSB0aGF0IGhlbHBlZCB3aXRoIHRoaXMgZHJpdmVyLAorICogaW5jbHVkaW5nIFZpbGxlIFRlcnZvIGFuZCBSb2dlciBRdWFkcm9zLgorICoKKyAqIFBvd2VyIHNhdmluZyBmdW5jdGlvbmFsaXR5IHdhcyByZW1vdmVkIGZyb20gdGhpcyBkcml2ZXIgdG8gbWFrZQorICogbWVyZ2luZyBlYXNpZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaS5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9idC1ub2tpYS1oNHAuaD4KKworI2luY2x1ZGUgImhjaV9oNHAuaCIKKworLyogVGhpcyBzaG91bGQgYmUgdXNlZCBpbiBmdW5jdGlvbiB0aGF0IGNhbm5vdCByZWxlYXNlIGNsb2NrcyAqLworc3RhdGljIHZvaWQgaGNpX2g0cF9zZXRfY2xrKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCAqY2xvY2ssIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5jbG9ja3NfbG9jaywgZmxhZ3MpOworCWlmIChlbmFibGUgJiYgISpjbG9jaykgeworCQlCVF9EQkcoIkVuYWJsaW5nICVwIiwgY2xvY2spOworCQljbGtfcHJlcGFyZV9lbmFibGUoaW5mby0+dWFydF9mY2xrKTsKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPnVhcnRfaWNsayk7CisJCWlmIChhdG9taWNfcmVhZCgmaW5mby0+Y2xrX3VzZXJzKSA9PSAwKQorCQkJaGNpX2g0cF9yZXN0b3JlX3JlZ3MoaW5mbyk7CisJCWF0b21pY19pbmMoJmluZm8tPmNsa191c2Vycyk7CisJfQorCisJaWYgKCFlbmFibGUgJiYgKmNsb2NrKSB7CisJCUJUX0RCRygiRGlzYWJsaW5nICVwIiwgY2xvY2spOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW5mby0+Y2xrX3VzZXJzKSkKKwkJCWhjaV9oNHBfc3RvcmVfcmVncyhpbmZvKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPnVhcnRfZmNsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT51YXJ0X2ljbGspOworCX0KKworCSpjbG9jayA9IGVuYWJsZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5jbG9ja3NfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX2xhenlfY2xvY2tfcmVsZWFzZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaGNpX2g0cF9pbmZvICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCit2b2lkIGhjaV9oNHBfc21hcnRfaWRsZShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBib29sIGVuYWJsZSkKK3sKKwl1OCB2OworCisJdiA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TWVNDKTsKKwl2ICY9IH4oVUFSVF9PTUFQX1NZU0NfSURMRU1BU0spOworCisJaWYgKGVuYWJsZSkKKwkJdiB8PSBVQVJUX09NQVBfU1lTQ19TTUFSVF9JRExFOworCWVsc2UKKwkJdiB8PSBVQVJUX09NQVBfU1lTQ19OT19JRExFOworCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9TWVNDLCB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGg0cF9zY2hlZHVsZV9wbShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX2Rpc2FibGVfdHgoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPnBtX2VuYWJsZWQpCisJCXJldHVybjsKKworCS8qIFJlLWVuYWJsZSBzbWFydC1pZGxlICovCisJaGNpX2g0cF9zbWFydF9pZGxlKGluZm8sIDEpOworCisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDApOworCW1vZF90aW1lcigmaW5mby0+bGF6eV9yZWxlYXNlLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApKTsKKwlpbmZvLT50eF9lbmFibGVkID0gMDsKK30KKwordm9pZCBoY2lfaDRwX2VuYWJsZV90eChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPnBtX2VuYWJsZWQpCisJCXJldHVybjsKKworCWg0cF9zY2hlZHVsZV9wbShpbmZvKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZpbmZvLT5sYXp5X3JlbGVhc2UpOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAxKTsKKwlpbmZvLT50eF9lbmFibGVkID0gMTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMSk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkgICAgIFVBUlRfSUVSX1RIUkkpOworCS8qCisJICogRGlzYWJsZSBzbWFydC1pZGxlIGFzIFVBUlQgVFggaW50ZXJydXB0cworCSAqIGFyZSBub3Qgd2FrZS11cCBjYXBhYmxlCisJICovCisJaGNpX2g0cF9zbWFydF9pZGxlKGluZm8sIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX2Rpc2FibGVfcngoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPnBtX2VuYWJsZWQpCisJCXJldHVybjsKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAwOworCisJaWYgKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKQorCQlyZXR1cm47CisKKwlpZiAoIShoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwkJcmV0dXJuOworCisJX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAwLCBVQVJUX0VGUl9SVFMpOworCWluZm8tPmF1dG9ydHMgPSAwOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAwKTsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9lbmFibGVfcngoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPnBtX2VuYWJsZWQpCisJCXJldHVybjsKKworCWg0cF9zY2hlZHVsZV9wbShpbmZvKTsKKworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAxKTsKKwlpbmZvLT5yeF9lbmFibGVkID0gMTsKKworCWlmICghKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCQlyZXR1cm47CisKKwlfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDEsIFVBUlRfRUZSX1JUUyk7CisJaW5mby0+YXV0b3J0cyA9IDE7Cit9CisKKy8qIE5lZ290aWF0aW9uIGZ1bmN0aW9ucyAqLworaW50IGhjaV9oNHBfc2VuZF9hbGl2ZV9wYWNrZXQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgKmhkcjsKKwlzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9wa3QgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxlbjsKKworCUJUX0RCRygiU2VuZGluZyBhbGl2ZSBwYWNrZXQiKTsKKworCWxlbiA9IEg0X1RZUEVfU0laRSArIHNpemVvZigqaGRyKSArIHNpemVvZigqcGt0KTsKKwlza2IgPSBidF9za2JfYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoc2tiLT5kYXRhLCAweDAwLCBsZW4pOworCSpza2JfcHV0KHNrYiwgMSkgPSBINF9BTElWRV9QS1Q7CisJaGRyID0gKHN0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKmhkcikpOworCWhkci0+ZGxlbiA9IHNpemVvZigqcGt0KTsKKwlwa3QgPSAoc3RydWN0IGhjaV9oNHBfYWxpdmVfcGt0ICopc2tiX3B1dChza2IsIHNpemVvZigqcGt0KSk7CisJcGt0LT5taWQgPSBINFBfQUxJVkVfUkVROworCisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJICAgICBVQVJUX0lFUl9USFJJKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlCVF9EQkcoIkFsaXZlIHBhY2tldCBzZW50Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9hbGl2ZV9wYWNrZXQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgKmhkcjsKKwlzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9wa3QgKnBrdDsKKworCUJUX0RCRygiUmVjZWl2ZWQgYWxpdmUgcGFja2V0Iik7CisJaGRyID0gKHN0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciAqKXNrYi0+ZGF0YTsKKwlpZiAoaGRyLT5kbGVuICE9IHNpemVvZigqcGt0KSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNvcnJ1cHRlZCBhbGl2ZSBtZXNzYWdlXG4iKTsKKwkJaW5mby0+aW5pdF9lcnJvciA9IC1FSU87CisJCWdvdG8gZmluaXNoX2FsaXZlOworCX0KKworCXBrdCA9IChzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9wa3QgKilza2JfcHVsbChza2IsIHNpemVvZigqaGRyKSk7CisJaWYgKHBrdC0+bWlkICE9IEg0UF9BTElWRV9SRVNQKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ291bGQgbm90IG5lZ290aWF0ZSBoY2lfaDRwIHNldHRpbmdzXG4iKTsKKwkJaW5mby0+aW5pdF9lcnJvciA9IC1FSU5WQUw7CisJfQorCitmaW5pc2hfYWxpdmU6CisJY29tcGxldGUoJmluZm8tPmluaXRfY29tcGxldGlvbik7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9zZW5kX25lZ290aWF0aW9uKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJc3RydWN0IGhjaV9oNHBfbmVnX2NtZCAqbmVnX2NtZDsKKwlzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyICpuZWdfaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyLCBsZW47CisJdTE2IHN5c2NsazsKKworCUJUX0RCRygiU2VuZGluZyBuZWdvdGlhdGlvbi4uIik7CisKKwlzd2l0Y2ggKGluZm8tPmJ0X3N5c2NsaykgeworCWNhc2UgMToKKwkJc3lzY2xrID0gMTIwMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3lzY2xrID0gMzg0MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxlbiA9IHNpemVvZigqbmVnX2NtZCkgKyBzaXplb2YoKm5lZ19oZHIpICsgSDRfVFlQRV9TSVpFOworCXNrYiA9IGJ0X3NrYl9hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChza2ItPmRhdGEsIDB4MDAsIGxlbik7CisJKnNrYl9wdXQoc2tiLCAxKSA9IEg0X05FR19QS1Q7CisJbmVnX2hkciA9IChzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyICopc2tiX3B1dChza2IsIHNpemVvZigqbmVnX2hkcikpOworCW5lZ19jbWQgPSAoc3RydWN0IGhjaV9oNHBfbmVnX2NtZCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKm5lZ19jbWQpKTsKKworCW5lZ19oZHItPmRsZW4gPSBzaXplb2YoKm5lZ19jbWQpOworCW5lZ19jbWQtPmFjayA9IEg0UF9ORUdfUkVROworCW5lZ19jbWQtPmJhdWQgPSBjcHVfdG9fbGUxNihCVF9CQVVEUkFURV9ESVZJREVSL01BWF9CQVVEX1JBVEUpOworCW5lZ19jbWQtPnByb3RvID0gSDRQX1BST1RPX0JZVEU7CisJbmVnX2NtZC0+c3lzX2NsayA9IGNwdV90b19sZTE2KHN5c2Nsayk7CisKKwloY2lfaDRwX2NoYW5nZV9zcGVlZChpbmZvLCBJTklUX1NQRUVEKTsKKworCWhjaV9oNHBfc2V0X3J0cyhpbmZvLCAxKTsKKwlpbmZvLT5pbml0X2Vycm9yID0gMDsKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmluaXRfY29tcGxldGlvbik7CisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJICAgICBVQVJUX0lFUl9USFJJKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZpbmZvLT5pbml0X2NvbXBsZXRpb24sCisJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJaWYgKGluZm8tPmluaXRfZXJyb3IgPCAwKQorCQlyZXR1cm4gaW5mby0+aW5pdF9lcnJvcjsKKworCS8qIENoYW5nZSB0byBvcGVyYXRpb25hbCBzZXR0aW5ncyAqLworCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDAsIFVBUlRfRUZSX1JUUyk7CisJaGNpX2g0cF9zZXRfcnRzKGluZm8sIDApOworCWhjaV9oNHBfY2hhbmdlX3NwZWVkKGluZm8sIE1BWF9CQVVEX1JBVEUpOworCisJZXJyID0gaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMSwgMTAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDEsIFVBUlRfRUZSX1JUUyk7CisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5pbml0X2NvbXBsZXRpb24pOworCWVyciA9IGhjaV9oNHBfc2VuZF9hbGl2ZV9wYWNrZXQoaW5mbyk7CisKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmluZm8tPmluaXRfY29tcGxldGlvbiwKKwkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoaW5mby0+aW5pdF9lcnJvciA8IDApCisJCXJldHVybiBpbmZvLT5pbml0X2Vycm9yOworCisJQlRfREJHKCJOZWdvdGlhdGlvbiBzdWNjZXNzZnVsIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfbmVnb3RpYXRpb25fcGFja2V0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9oNHBfbmVnX2hkciAqaGRyOworCXN0cnVjdCBoY2lfaDRwX25lZ19ldnQgKmV2dDsKKworCWhkciA9IChzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyICopc2tiLT5kYXRhOworCWlmIChoZHItPmRsZW4gIT0gc2l6ZW9mKCpldnQpKSB7CisJCWluZm8tPmluaXRfZXJyb3IgPSAtRUlPOworCQlnb3RvIGZpbmlzaF9uZWc7CisJfQorCisJZXZ0ID0gKHN0cnVjdCBoY2lfaDRwX25lZ19ldnQgKilza2JfcHVsbChza2IsIHNpemVvZigqaGRyKSk7CisKKwlpZiAoZXZ0LT5hY2sgIT0gSDRQX05FR19BQ0spIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDb3VsZCBub3QgbmVnb3RpYXRlIGhjaV9oNHAgc2V0dGluZ3NcbiIpOworCQlpbmZvLT5pbml0X2Vycm9yID0gLUVJTlZBTDsKKwl9CisKKwlpbmZvLT5tYW5faWQgPSBldnQtPm1hbl9pZDsKKwlpbmZvLT52ZXJfaWQgPSBldnQtPnZlcl9pZDsKKworZmluaXNoX25lZzoKKworCWNvbXBsZXRlKCZpbmZvLT5pbml0X2NvbXBsZXRpb24pOworCWtmcmVlX3NrYihza2IpOworfQorCisvKiBINCBwYWNrZXQgaGFuZGxpbmcgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGhjaV9oNHBfZ2V0X2hkcl9sZW4oc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdTggcGt0X3R5cGUpCit7CisJbG9uZyByZXR2YWw7CisKKwlzd2l0Y2ggKHBrdF90eXBlKSB7CisJY2FzZSBINF9FVlRfUEtUOgorCQlyZXR2YWwgPSBIQ0lfRVZFTlRfSERSX1NJWkU7CisJCWJyZWFrOworCWNhc2UgSDRfQUNMX1BLVDoKKwkJcmV0dmFsID0gSENJX0FDTF9IRFJfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBINF9TQ09fUEtUOgorCQlyZXR2YWwgPSBIQ0lfU0NPX0hEUl9TSVpFOworCQlicmVhazsKKwljYXNlIEg0X05FR19QS1Q6CisJCXJldHZhbCA9IEg0UF9ORUdfSERSX1NJWkU7CisJCWJyZWFrOworCWNhc2UgSDRfQUxJVkVfUEtUOgorCQlyZXR2YWwgPSBINFBfQUxJVkVfSERSX1NJWkU7CisJCWJyZWFrOworCWNhc2UgSDRfUkFESU9fUEtUOgorCQlyZXR2YWwgPSBINF9SQURJT19IRFJfU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpbmZvLT5kZXYsICJVbmtub3duIEg0IHBhY2tldCB0eXBlIDB4JS4yeFxuIiwgcGt0X3R5cGUpOworCQlyZXR2YWwgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoY2lfaDRwX2dldF9kYXRhX2xlbihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsb25nIHJldHZhbCA9IC0xOworCXN0cnVjdCBoY2lfYWNsX2hkciAqYWNsX2hkcjsKKwlzdHJ1Y3QgaGNpX3Njb19oZHIgKnNjb19oZHI7CisJc3RydWN0IGhjaV9ldmVudF9oZHIgKmV2dF9oZHI7CisJc3RydWN0IGhjaV9oNHBfbmVnX2hkciAqbmVnX2hkcjsKKwlzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgKmFsaXZlX2hkcjsKKwlzdHJ1Y3QgaGNpX2g0cF9yYWRpb19oZHIgKnJhZGlvX2hkcjsKKworCXN3aXRjaCAoYnRfY2Ioc2tiKS0+cGt0X3R5cGUpIHsKKwljYXNlIEg0X0VWVF9QS1Q6CisJCWV2dF9oZHIgPSAoc3RydWN0IGhjaV9ldmVudF9oZHIgKilza2ItPmRhdGE7CisJCXJldHZhbCA9IGV2dF9oZHItPnBsZW47CisJCWJyZWFrOworCWNhc2UgSDRfQUNMX1BLVDoKKwkJYWNsX2hkciA9IChzdHJ1Y3QgaGNpX2FjbF9oZHIgKilza2ItPmRhdGE7CisJCXJldHZhbCA9IGxlMTZfdG9fY3B1KGFjbF9oZHItPmRsZW4pOworCQlicmVhazsKKwljYXNlIEg0X1NDT19QS1Q6CisJCXNjb19oZHIgPSAoc3RydWN0IGhjaV9zY29faGRyICopc2tiLT5kYXRhOworCQlyZXR2YWwgPSBzY29faGRyLT5kbGVuOworCQlicmVhazsKKwljYXNlIEg0X1JBRElPX1BLVDoKKwkJcmFkaW9faGRyID0gKHN0cnVjdCBoY2lfaDRwX3JhZGlvX2hkciAqKXNrYi0+ZGF0YTsKKwkJcmV0dmFsID0gcmFkaW9faGRyLT5kbGVuOworCQlicmVhazsKKwljYXNlIEg0X05FR19QS1Q6CisJCW5lZ19oZHIgPSAoc3RydWN0IGhjaV9oNHBfbmVnX2hkciAqKXNrYi0+ZGF0YTsKKwkJcmV0dmFsID0gbmVnX2hkci0+ZGxlbjsKKwkJYnJlYWs7CisJY2FzZSBINF9BTElWRV9QS1Q6CisJCWFsaXZlX2hkciA9IChzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9oZHIgKilza2ItPmRhdGE7CisJCXJldHZhbCA9IGFsaXZlX2hkci0+ZGxlbjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhjaV9oNHBfcmVjdl9mcmFtZShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChIQ0lfUlVOTklORywgJmluZm8tPmhkZXYtPmZsYWdzKSkpIHsKKwkJc3dpdGNoIChidF9jYihza2IpLT5wa3RfdHlwZSkgeworCQljYXNlIEg0X05FR19QS1Q6CisJCQloY2lfaDRwX25lZ290aWF0aW9uX3BhY2tldChpbmZvLCBza2IpOworCQkJaW5mby0+cnhfc3RhdGUgPSBXQUlUX0ZPUl9QS1RfVFlQRTsKKwkJCXJldHVybjsKKwkJY2FzZSBINF9BTElWRV9QS1Q6CisJCQloY2lfaDRwX2FsaXZlX3BhY2tldChpbmZvLCBza2IpOworCQkJaW5mby0+cnhfc3RhdGUgPSBXQUlUX0ZPUl9QS1RfVFlQRTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaW5mby0+aGRldi0+ZmxhZ3MpKSB7CisJCQlCVF9EQkcoImZ3X2V2ZW50Iik7CisJCQloY2lfaDRwX3BhcnNlX2Z3X2V2ZW50KGluZm8sIHNrYik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwloY2lfcmVjdl9mcmFtZShpbmZvLT5oZGV2LCBza2IpOworCUJUX0RCRygiRnJhbWUgc2VudCB0byB1cHBlciBsYXllciIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2g0cF9oYW5kbGVfYnl0ZShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1OCBieXRlKQoreworCXN3aXRjaCAoaW5mby0+cnhfc3RhdGUpIHsKKwljYXNlIFdBSVRfRk9SX1BLVF9UWVBFOgorCQlidF9jYihpbmZvLT5yeF9za2IpLT5wa3RfdHlwZSA9IGJ5dGU7CisJCWluZm8tPnJ4X2NvdW50ID0gaGNpX2g0cF9nZXRfaGRyX2xlbihpbmZvLCBieXRlKTsKKwkJaWYgKGluZm8tPnJ4X2NvdW50IDwgMCkgeworCQkJaW5mby0+aGRldi0+c3RhdC5lcnJfcngrKzsKKwkJCWtmcmVlX3NrYihpbmZvLT5yeF9za2IpOworCQkJaW5mby0+cnhfc2tiID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPnJ4X3N0YXRlID0gV0FJVF9GT1JfSEVBREVSOworCQl9CisJCWJyZWFrOworCWNhc2UgV0FJVF9GT1JfSEVBREVSOgorCQlpbmZvLT5yeF9jb3VudC0tOworCQkqc2tiX3B1dChpbmZvLT5yeF9za2IsIDEpID0gYnl0ZTsKKwkJaWYgKGluZm8tPnJ4X2NvdW50ICE9IDApCisJCQlicmVhazsKKwkJaW5mby0+cnhfY291bnQgPSBoY2lfaDRwX2dldF9kYXRhX2xlbihpbmZvLCBpbmZvLT5yeF9za2IpOworCQlpZiAoaW5mby0+cnhfY291bnQgPiBza2JfdGFpbHJvb20oaW5mby0+cnhfc2tiKSkgeworCQkJZGV2X2VycihpbmZvLT5kZXYsICJmcmFtZSB0b28gbG9uZ1xuIik7CisJCQlpbmZvLT5nYXJiYWdlX2J5dGVzID0gaW5mby0+cnhfY291bnQKKwkJCQktIHNrYl90YWlscm9vbShpbmZvLT5yeF9za2IpOworCQkJa2ZyZWVfc2tiKGluZm8tPnJ4X3NrYik7CisJCQlpbmZvLT5yeF9za2IgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaW5mby0+cnhfc3RhdGUgPSBXQUlUX0ZPUl9EQVRBOworCQlicmVhazsKKwljYXNlIFdBSVRfRk9SX0RBVEE6CisJCWluZm8tPnJ4X2NvdW50LS07CisJCSpza2JfcHV0KGluZm8tPnJ4X3NrYiwgMSkgPSBieXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwl9CisKKwlpZiAoaW5mby0+cnhfY291bnQgPT0gMCkgeworCQkvKiBINCsgZGV2aWNlcyBzaG91bGQgYWx3YXlzIHNlbmQgd29yZCBhbGlnbmVkIHBhY2tldHMgKi8KKwkJaWYgKCEoaW5mby0+cnhfc2tiLT5sZW4gJSAyKSkKKwkJCWluZm8tPmdhcmJhZ2VfYnl0ZXMrKzsKKwkJaGNpX2g0cF9yZWN2X2ZyYW1lKGluZm8sIGluZm8tPnJ4X3NrYik7CisJCWluZm8tPnJ4X3NrYiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX3J4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXU4IGJ5dGU7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaGNpX2g0cF9pbmZvICopZGF0YTsKKworCUJUX0RCRygidGFza2xldCB3b2tlIHVwIik7CisJQlRfREJHKCJyeF90YXNrbGV0IHdva2UgdXAiKTsKKworCXdoaWxlIChoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9EUikgeworCQlieXRlID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9SWCk7CisJCWlmIChpbmZvLT5nYXJiYWdlX2J5dGVzKSB7CisJCQlpbmZvLT5nYXJiYWdlX2J5dGVzLS07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaW5mby0+cnhfc2tiID09IE5VTEwpIHsKKwkJCWluZm8tPnJ4X3NrYiA9IGJ0X3NrYl9hbGxvYyhIQ0lfTUFYX0ZSQU1FX1NJWkUsCisJCQkJCQkgICAgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOworCQkJaWYgKCFpbmZvLT5yeF9za2IpIHsKKwkJCQlkZXZfZXJyKGluZm8tPmRldiwKKwkJCQkJIk5vIG1lbW9yeSBmb3IgbmV3IHBhY2tldFxuIik7CisJCQkJZ290byBmaW5pc2hfcng7CisJCQl9CisJCQlpbmZvLT5yeF9zdGF0ZSA9IFdBSVRfRk9SX1BLVF9UWVBFOworCQkJaW5mby0+cnhfc2tiLT5kZXYgPSAodm9pZCAqKWluZm8tPmhkZXY7CisJCX0KKwkJaW5mby0+aGRldi0+c3RhdC5ieXRlX3J4Kys7CisJCWhjaV9oNHBfaGFuZGxlX2J5dGUoaW5mbywgYnl0ZSk7CisJfQorCisJaWYgKCFpbmZvLT5yeF9lbmFibGVkKSB7CisJCWlmIChoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UICYmCisJCQkJCQkgIGluZm8tPmF1dG9ydHMpIHsKKwkJCV9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMCAsIFVBUlRfRUZSX1JUUyk7CisJCQlpbmZvLT5hdXRvcnRzID0gMDsKKwkJfQorCQkvKiBGbHVzaCBwb3N0ZWQgd3JpdGUgdG8gYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cyAqLworCQloY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU0NSKTsKKwkJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDApOworCX0KKworZmluaXNoX3J4OgorCUJUX0RCRygicnhfZW5kZWQiKTsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF90eF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgc2VudCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gKHN0cnVjdCBoY2lfaDRwX2luZm8gKilkYXRhOworCisJQlRfREJHKCJ0YXNrbGV0IHdva2UgdXAiKTsKKwlCVF9EQkcoInR4X3Rhc2tsZXQgd29rZSB1cCIpOworCisJaWYgKGluZm8tPmF1dG9ydHMgIT0gaW5mby0+cnhfZW5hYmxlZCkgeworCQlpZiAoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkgeworCQkJaWYgKGluZm8tPmF1dG9ydHMgJiYgIWluZm8tPnJ4X2VuYWJsZWQpIHsKKwkJCQlfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDAsCisJCQkJCQkJICBVQVJUX0VGUl9SVFMpOworCQkJCWluZm8tPmF1dG9ydHMgPSAwOworCQkJfQorCQkJaWYgKCFpbmZvLT5hdXRvcnRzICYmIGluZm8tPnJ4X2VuYWJsZWQpIHsKKwkJCQlfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDEsCisJCQkJCQkJICBVQVJUX0VGUl9SVFMpOworCQkJCWluZm8tPmF1dG9ydHMgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9TQ1IsCisJCQkJICAgICBoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU0NSKSB8CisJCQkJICAgICBVQVJUX09NQVBfU0NSX0VNUFRZX1RIUik7CisJCQlnb3RvIGZpbmlzaF90eDsKKwkJfQorCX0KKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZpbmZvLT50eHEpOworCWlmICghc2tiKSB7CisJCS8qIE5vIGRhdGEgaW4gYnVmZmVyICovCisJCUJUX0RCRygic2tiIHJlYWR5Iik7CisJCWlmIChoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSB7CisJCQloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsCisJCQkJICAgICBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgJgorCQkJCSAgICAgflVBUlRfSUVSX1RIUkkpOworCQkJaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NDUik7CisJCQloY2lfaDRwX2Rpc2FibGVfdHgoaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwkJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9TQ1IsCisJCQkgICAgIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TQ1IpIHwKKwkJCSAgICAgVUFSVF9PTUFQX1NDUl9FTVBUWV9USFIpOworCQlnb3RvIGZpbmlzaF90eDsKKwl9CisKKwkvKiBDb3B5IGRhdGEgdG8gdHggZmlmbyAqLworCXdoaWxlICghKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TU1IpICYgVUFSVF9PTUFQX1NTUl9UWEZVTEwpICYmCisJICAgICAgIChzZW50IDwgc2tiLT5sZW4pKSB7CisJCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX1RYLCBza2ItPmRhdGFbc2VudF0pOworCQlzZW50Kys7CisJfQorCisJaW5mby0+aGRldi0+c3RhdC5ieXRlX3R4ICs9IHNlbnQ7CisJaWYgKHNrYi0+bGVuID09IHNlbnQpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJc2tiX3B1bGwoc2tiLCBzZW50KTsKKwkJc2tiX3F1ZXVlX2hlYWQoJmluZm8tPnR4cSwgc2tiKTsKKwl9CisKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX1NDUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NDUikgJgorCQkJCQkJICAgICB+VUFSVF9PTUFQX1NDUl9FTVBUWV9USFIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJCQkJCSBVQVJUX0lFUl9USFJJKTsKKworZmluaXNoX3R4OgorCS8qIEZsdXNoIHBvc3RlZCB3cml0ZSB0byBhdm9pZCBzcHVyaW91cyBpbnRlcnJ1cHRzICovCisJaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NDUik7CisKK30KKworc3RhdGljIGlycXJldHVybl90IGhjaV9oNHBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaGNpX2g0cF9pbmZvICopZGF0YTsKKwl1OCBpaXIsIG1zcjsKKwlpbnQgcmV0OworCisJcmV0ID0gSVJRX05PTkU7CisKKwlpaXIgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lJUik7CisJaWYgKGlpciAmIFVBUlRfSUlSX05PX0lOVCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJQlRfREJHKCJJbiBpbnRlcnJ1cHQgaGFuZGxlciBpaXIgMHglLjJ4IiwgaWlyKTsKKworCWlpciAmPSBVQVJUX0lJUl9JRDsKKworCWlmIChpaXIgPT0gVUFSVF9JSVJfTVNJKSB7CisJCW1zciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTVNSKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCWlmIChpaXIgPT0gVUFSVF9JSVJfUkxTSSkgeworCQloY2lfaDRwX2luYihpbmZvLCBVQVJUX1JYKTsKKwkJaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoaWlyID09IFVBUlRfSUlSX1JESSkgeworCQloY2lfaDRwX3J4X3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpZGF0YSk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChpaXIgPT0gVUFSVF9JSVJfVEhSSSkgeworCQloY2lfaDRwX3R4X3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpZGF0YSk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoY2lfaDRwX3dha2V1cF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3QpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IGRldl9pbnN0OworCWludCBzaG91bGRfd2FrZXVwOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCisJaWYgKCFpbmZvLT5oZGV2KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzaG91bGRfd2FrZXVwID0gZ3Bpb19nZXRfdmFsdWUoaW5mby0+aG9zdF93YWtldXBfZ3Bpbyk7CisJaGRldiA9IGluZm8tPmhkZXY7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9SVU5OSU5HLCAmaGRldi0+ZmxhZ3MpKSB7CisJCWlmIChzaG91bGRfd2FrZXVwID09IDEpCisJCQljb21wbGV0ZV9hbGwoJmluZm8tPnRlc3RfY29tcGxldGlvbik7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCUJUX0RCRygiZ3BpbyBpbnRlcnJ1cHQgJWQiLCBzaG91bGRfd2FrZXVwKTsKKworCS8qIENoZWNrIGlmIHdlZSBoYXZlIG1pc3NlZCBzb21lIGludGVycnVwdHMgKi8KKwlpZiAoaW5mby0+cnhfZW5hYmxlZCA9PSBzaG91bGRfd2FrZXVwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAoc2hvdWxkX3dha2V1cCkKKwkJaGNpX2g0cF9lbmFibGVfcngoaW5mbyk7CisJZWxzZQorCQloY2lfaDRwX2Rpc2FibGVfcngoaW5mbyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaDRwX3NldF9wbV9saW1pdHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgYm9vbCBzZXQpCit7CisJc3RydWN0IGhjaV9oNHBfcGxhdGZvcm1fZGF0YSAqYnRfcGxhdF9kYXRhID0gaW5mby0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWNvbnN0IGNoYXIgKnNzZXQgPSBzZXQgPyAic2V0IiA6ICJjbGVhciI7CisKKwlpZiAodW5saWtlbHkoIWJ0X3BsYXRfZGF0YSB8fCAhYnRfcGxhdF9kYXRhLT5zZXRfcG1fbGltaXRzKSkKKwkJcmV0dXJuOworCisJaWYgKHNldCAhPSAhIXRlc3RfYml0KEg0UF9BQ1RJVkVfTU9ERSwgJmluZm8tPnBtX2ZsYWdzKSkgeworCQlidF9wbGF0X2RhdGEtPnNldF9wbV9saW1pdHMoaW5mby0+ZGV2LCBzZXQpOworCQlpZiAoc2V0KQorCQkJc2V0X2JpdChINFBfQUNUSVZFX01PREUsICZpbmZvLT5wbV9mbGFncyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChINFBfQUNUSVZFX01PREUsICZpbmZvLT5wbV9mbGFncyk7CisJCUJUX0RCRygiQ2hhbmdlIHBtIGNvbnN0cmFpbnRzIHRvOiAlcyIsIHNzZXQpOworCQlyZXR1cm47CisJfQorCisJQlRfREJHKCJwbSBjb25zdHJhaW50cyByZW1haW5zOiAlcyIsIHNzZXQpOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfcmVzZXQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaGNpX2g0cF9yZXNldF91YXJ0KGluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiVWFydCByZXNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwloY2lfaDRwX2luaXRfdWFydChpbmZvKTsKKwloY2lfaDRwX3NldF9ydHMoaW5mbywgMCk7CisKKwlncGlvX3NldF92YWx1ZShpbmZvLT5yZXNldF9ncGlvLCAwKTsKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMSk7CisJbXNsZWVwKDEwKTsKKworCWlmIChncGlvX2dldF92YWx1ZShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSA9PSAxKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiaG9zdF93YWtldXBfZ3BpbyBub3QgbG93XG4iKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT50ZXN0X2NvbXBsZXRpb24pOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPnJlc2V0X2dwaW8sIDEpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmaW5mby0+dGVzdF9jb21wbGV0aW9uLAorCQkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJ3YWtldXAgdGVzdCB0aW1lZCBvdXRcbiIpOworCQljb21wbGV0ZV9hbGwoJmluZm8tPnRlc3RfY29tcGxldGlvbik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCWVyciA9IGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDEsIDEwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJObyBjdHMgZnJvbSBidCBjaGlwXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwloY2lfaDRwX3NldF9ydHMoaW5mbywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaGNpIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBoY2lfaDRwX2hjaV9mbHVzaChzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCXNrYl9xdWV1ZV9wdXJnZSgmaW5mby0+dHhxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfYnRfd2FrZXVwX3Rlc3Qoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwkvKgorCSAqIFRlc3QgU2VxdWVuY2U6CisJICogSG9zdCBkZS1hc3NlcnRzIHRoZSBCVF9XQUtFX1VQIGxpbmUuCisJICogSG9zdCBwb2xscyB0aGUgVUFSVF9DVFMgbGluZSwgd2FpdGluZyBmb3IgaXQgdG8gYmUgZGUtYXNzZXJ0ZWQuCisJICogSG9zdCBhc3NlcnRzIHRoZSBCVF9XQUtFX1VQIGxpbmUuCisJICogSG9zdCBwb2xscyB0aGUgVUFSVF9DVFMgbGluZSwgd2FpdGluZyBmb3IgaXQgdG8gYmUgYXNzZXJ0ZWQuCisJICogSG9zdCBkZS1hc3NlcnRzIHRoZSBCVF9XQUtFX1VQIGxpbmUgKGFsbG93IHRoZSBCbHVldG9vdGggZGV2aWNlIHRvCisJICogc2xlZXApLgorCSAqIEhvc3QgcG9sbHMgdGhlIFVBUlRfQ1RTIGxpbmUsIHdhaXRpbmcgZm9yIGl0IHRvIGJlIGRlLWFzc2VydGVkLgorCSAqLworCWludCBlcnI7CisJaW50IHJldCA9IC1FQ09NTTsKKworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEaXNhYmxlIHdha2V1cCBpbnRlcnJ1cHRzICovCisJZGlzYWJsZV9pcnEoZ3Bpb190b19pcnEoaW5mby0+aG9zdF93YWtldXBfZ3BpbykpOworCisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDApOworCWVyciA9IGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDAsIDEwMCk7CisJaWYgKGVycikgeworCQlkZXZfd2FybihpbmZvLT5kZXYsCisJCQkJImJ0X3dha2V1cF90ZXN0OiBmYWlsOiBDVFMgbG93IHRpbWVkIG91dDogJWRcbiIsCisJCQkJZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDEpOworCWVyciA9IGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDEsIDEwMCk7CisJaWYgKGVycikgeworCQlkZXZfd2FybihpbmZvLT5kZXYsCisJCQkJImJ0X3dha2V1cF90ZXN0OiBmYWlsOiBDVFMgaGlnaCB0aW1lZCBvdXQ6ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gb3V0OworCX0KKworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAwKTsKKwllcnIgPSBoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAwLCAxMDApOworCWlmIChlcnIpIHsKKwkJZGV2X3dhcm4oaW5mby0+ZGV2LAorCQkJCSJidF93YWtldXBfdGVzdDogZmFpbDogQ1RTIHJlLWxvdyB0aW1lZCBvdXQ6ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IDA7CisKK291dDoKKworCS8qIFJlLWVuYWJsZSB3YWtldXAgaW50ZXJydXB0cyAqLworCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEoaW5mby0+aG9zdF93YWtldXBfZ3BpbykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoY2lfaDRwX2hjaV9vcGVuKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm87CisJaW50IGVyciwgcmV0cmllcyA9IDA7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBmd19xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5mbyA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICh0ZXN0X2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUSTEyNzEgaGFzIEhXIGJ1ZyBhbmQgYm9vdCB1cCBtaWdodCBmYWlsLiBSZXRyeSB1cCB0byB0aHJlZSB0aW1lcyAqLworYWdhaW46CisKKwlpbmZvLT5yeF9lbmFibGVkID0gMTsKKwlpbmZvLT5yeF9zdGF0ZSA9IFdBSVRfRk9SX1BLVF9UWVBFOworCWluZm8tPnJ4X2NvdW50ID0gMDsKKwlpbmZvLT5nYXJiYWdlX2J5dGVzID0gMDsKKwlpbmZvLT5yeF9za2IgPSBOVUxMOworCWluZm8tPnBtX2VuYWJsZWQgPSAwOworCWluaXRfY29tcGxldGlvbigmaW5mby0+ZndfY29tcGxldGlvbik7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDEpOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+cnhfY2xvY2tzX2VuLCAxKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZmd19xdWV1ZSk7CisKKwllcnIgPSBoY2lfaDRwX3Jlc2V0KGluZm8pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9jbGVhbjsKKworCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDEsIFVBUlRfRUZSX0NUUyB8IFVBUlRfRUZSX1JUUyk7CisJaW5mby0+YXV0b3J0cyA9IDE7CisKKwllcnIgPSBoY2lfaDRwX3NlbmRfbmVnb3RpYXRpb24oaW5mbyk7CisKKwllcnIgPSBoY2lfaDRwX3JlYWRfZncoaW5mbywgJmZ3X3F1ZXVlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNhbm5vdCByZWFkIGZpcm13YXJlXG4iKTsKKwkJZ290byBlcnJfY2xlYW47CisJfQorCisJZXJyID0gaGNpX2g0cF9zZW5kX2Z3KGluZm8sICZmd19xdWV1ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJTZW5kaW5nIGZpcm13YXJlIGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9jbGVhbjsKKwl9CisKKwlpbmZvLT5wbV9lbmFibGVkID0gMTsKKworCWVyciA9IGhjaV9oNHBfYnRfd2FrZXVwX3Rlc3QoaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJCVCB3YWtldXAgdGVzdCBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfY2xlYW47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5yeF9lbmFibGVkID0gZ3Bpb19nZXRfdmFsdWUoaW5mby0+aG9zdF93YWtldXBfZ3Bpbyk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIGluZm8tPnJ4X2VuYWJsZWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAwKTsKKworCWtmcmVlX3NrYihpbmZvLT5hbGl2ZV9jbWRfc2tiKTsKKwlpbmZvLT5hbGl2ZV9jbWRfc2tiID0gTlVMTDsKKwlzZXRfYml0KEhDSV9SVU5OSU5HLCAmaGRldi0+ZmxhZ3MpOworCisJQlRfREJHKCJoY2kgdXAgYW5kIHJ1bm5pbmciKTsKKwlyZXR1cm4gMDsKKworZXJyX2NsZWFuOgorCWhjaV9oNHBfaGNpX2ZsdXNoKGhkZXYpOworCWhjaV9oNHBfcmVzZXRfdWFydChpbmZvKTsKKwlkZWxfdGltZXJfc3luYygmaW5mby0+bGF6eV9yZWxlYXNlKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMCk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDApOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPnJlc2V0X2dwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAwKTsKKwlza2JfcXVldWVfcHVyZ2UoJmZ3X3F1ZXVlKTsKKwlrZnJlZV9za2IoaW5mby0+YWxpdmVfY21kX3NrYik7CisJaW5mby0+YWxpdmVfY21kX3NrYiA9IE5VTEw7CisJa2ZyZWVfc2tiKGluZm8tPnJ4X3NrYik7CisJaW5mby0+cnhfc2tiID0gTlVMTDsKKworCWlmIChyZXRyaWVzKysgPCAzKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRlcgbG9hZGluZyB0cnkgJWQgZmFpbC4gUmV0cnkuXG4iLCByZXRyaWVzKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfaGNpX2Nsb3NlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwloY2lfaDRwX2hjaV9mbHVzaChoZGV2KTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMSk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDEpOworCWhjaV9oNHBfcmVzZXRfdWFydChpbmZvKTsKKwlkZWxfdGltZXJfc3luYygmaW5mby0+bGF6eV9yZWxlYXNlKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMCk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDApOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPnJlc2V0X2dwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAwKTsKKwlrZnJlZV9za2IoaW5mby0+cnhfc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfaGNpX3NlbmRfZnJhbWUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbzsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiZGV2ICVwLCBza2IgJXAiLCBoZGV2LCBza2IpOworCisJaW5mbyA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICghdGVzdF9iaXQoSENJX1JVTk5JTkcsICZoZGV2LT5mbGFncykpIHsKKwkJZGV2X3dhcm4oaW5mby0+ZGV2LCAiRnJhbWUgZm9yIG5vbi1ydW5uaW5nIGRldmljZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoYnRfY2Ioc2tiKS0+cGt0X3R5cGUpIHsKKwljYXNlIEhDSV9DT01NQU5EX1BLVDoKKwkJaGRldi0+c3RhdC5jbWRfdHgrKzsKKwkJYnJlYWs7CisJY2FzZSBIQ0lfQUNMREFUQV9QS1Q6CisJCWhkZXYtPnN0YXQuYWNsX3R4Kys7CisJCWJyZWFrOworCWNhc2UgSENJX1NDT0RBVEFfUEtUOgorCQloZGV2LT5zdGF0LnNjb190eCsrOworCQlicmVhazsKKwl9CisKKwkvKiBQdXNoIGZyYW1lIHR5cGUgdG8gc2tiICovCisJKnNrYl9wdXNoKHNrYiwgMSkgPSAoYnRfY2Ioc2tiKS0+cGt0X3R5cGUpOworCS8qIFdlIHNob3VsZCBhbGx3YXlzIHNlbmQgd29yZCBhbGlnbmVkIGRhdGEgdG8gaDQrIGRldmljZXMgKi8KKwlpZiAoc2tiLT5sZW4gJSAyKSB7CisJCWVyciA9IHNrYl9wYWQoc2tiLCAxKTsKKwkJaWYgKCFlcnIpCisJCQkqc2tiX3B1dChza2IsIDEpID0gMHgwMDsKKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIHNrYik7CisJaGNpX2g0cF9lbmFibGVfdHgoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaGNpX2g0cF9zdG9yZV9iZGFkZHIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBiZGFkZHJbNl07CisJaW50IHJldCwgaTsKKworCXJldCA9IHNzY2FuZihidWYsICIlMng6JTJ4OiUyeDolMng6JTJ4OiUyeFxuIiwKKwkJCSZiZGFkZHJbMF0sICZiZGFkZHJbMV0sICZiZGFkZHJbMl0sCisJCQkmYmRhZGRyWzNdLCAmYmRhZGRyWzRdLCAmYmRhZGRyWzVdKTsKKworCWlmIChyZXQgIT0gNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmIChiZGFkZHJbaV0gPiAweGZmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWluZm8tPmJkX2FkZHJbaV0gPSBiZGFkZHJbaV0gJiAweGZmOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgaGNpX2g0cF9zaG93X2JkYWRkcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcE1SXG4iLCBpbmZvLT5iZF9hZGRyKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGJkYWRkciwgU19JUlVHTyB8IFNfSVdVU1IsIGhjaV9oNHBfc2hvd19iZGFkZHIsCisJCSAgIGhjaV9oNHBfc3RvcmVfYmRhZGRyKTsKKworc3RhdGljIGludCBoY2lfaDRwX3N5c2ZzX2NyZWF0ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iZGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX3N5c2ZzX3JlbW92ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JkYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9yZWdpc3Rlcl9oZGV2KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisKKwkvKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBIQ0kgZGV2aWNlICovCisKKwloZGV2ID0gaGNpX2FsbG9jX2RldigpOworCWlmICghaGRldikgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWluZm8tPmhkZXYgPSBoZGV2OworCisJaGRldi0+YnVzID0gSENJX1VBUlQ7CisJaGNpX3NldF9kcnZkYXRhKGhkZXYsIGluZm8pOworCisJaGRldi0+b3BlbiA9IGhjaV9oNHBfaGNpX29wZW47CisJaGRldi0+Y2xvc2UgPSBoY2lfaDRwX2hjaV9jbG9zZTsKKwloZGV2LT5mbHVzaCA9IGhjaV9oNHBfaGNpX2ZsdXNoOworCWhkZXYtPnNlbmQgPSBoY2lfaDRwX2hjaV9zZW5kX2ZyYW1lOworCXNldF9iaXQoSENJX1FVSVJLX1JFU0VUX09OX0NMT1NFLCAmaGRldi0+cXVpcmtzKTsKKworCVNFVF9IQ0lERVZfREVWKGhkZXYsIGluZm8tPmRldik7CisKKwlpZiAoaGNpX2g0cF9zeXNmc19jcmVhdGVfZmlsZXMoaW5mby0+ZGV2KSA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKKwkJZ290byBmcmVlOworCX0KKworCWlmIChoY2lfcmVnaXN0ZXJfZGV2KGhkZXYpID49IDApCisJCXJldHVybiAwOworCisJZGV2X2VycihpbmZvLT5kZXYsICJoY2lfcmVnaXN0ZXIgZmFpbGVkICVzLlxuIiwgaGRldi0+bmFtZSk7CisJaGNpX2g0cF9zeXNmc19yZW1vdmVfZmlsZXMoaW5mby0+ZGV2KTsKK2ZyZWU6CisJaGNpX2ZyZWVfZGV2KGluZm8tPmhkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9wbGF0Zm9ybV9kYXRhICpidF9wbGF0X2RhdGE7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbzsKKwlpbnQgZXJyOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJlZ2lzdGVyaW5nIEhDSSBINFAgZGV2aWNlXG4iKTsKKwlpbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgaGNpX2g0cF9pbmZvKSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5kZXYgPSAmcGRldi0+ZGV2OworCWluZm8tPnR4X2VuYWJsZWQgPSAxOworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworCXNwaW5fbG9ja19pbml0KCZpbmZvLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+Y2xvY2tzX2xvY2spOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmluZm8tPnR4cSk7CisKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IEJsdWV0b290aCBjb25maWcgZGF0YVxuIik7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CisKKwlidF9wbGF0X2RhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbmZvLT5jaGlwX3R5cGUgPSBidF9wbGF0X2RhdGEtPmNoaXBfdHlwZTsKKwlpbmZvLT5idF93YWtldXBfZ3BpbyA9IGJ0X3BsYXRfZGF0YS0+YnRfd2FrZXVwX2dwaW87CisJaW5mby0+aG9zdF93YWtldXBfZ3BpbyA9IGJ0X3BsYXRfZGF0YS0+aG9zdF93YWtldXBfZ3BpbzsKKwlpbmZvLT5yZXNldF9ncGlvID0gYnRfcGxhdF9kYXRhLT5yZXNldF9ncGlvOworCWluZm8tPnJlc2V0X2dwaW9fc2hhcmVkID0gYnRfcGxhdF9kYXRhLT5yZXNldF9ncGlvX3NoYXJlZDsKKwlpbmZvLT5idF9zeXNjbGsgPSBidF9wbGF0X2RhdGEtPmJ0X3N5c2NsazsKKworCUJUX0RCRygiUkVTRVQgZ3BpbzogJWQiLCBpbmZvLT5yZXNldF9ncGlvKTsKKwlCVF9EQkcoIkJUV1UgZ3BpbzogJWQiLCBpbmZvLT5idF93YWtldXBfZ3Bpbyk7CisJQlRfREJHKCJIT1NUV1UgZ3BpbzogJWQiLCBpbmZvLT5ob3N0X3dha2V1cF9ncGlvKTsKKwlCVF9EQkcoInN5c2NsazogJWQiLCBpbmZvLT5idF9zeXNjbGspOworCisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT50ZXN0X2NvbXBsZXRpb24pOworCWNvbXBsZXRlX2FsbCgmaW5mby0+dGVzdF9jb21wbGV0aW9uKTsKKworCWlmICghaW5mby0+cmVzZXRfZ3Bpb19zaGFyZWQpIHsKKwkJZXJyID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZwZGV2LT5kZXYsIGluZm8tPnJlc2V0X2dwaW8sCisJCQkJCSAgICBHUElPRl9PVVRfSU5JVF9MT1csICJidF9yZXNldCIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBHUElPIGxpbmUgJWRcbiIsCisJCQkJaW5mby0+cmVzZXRfZ3Bpbyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJZXJyID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZwZGV2LT5kZXYsIGluZm8tPmJ0X3dha2V1cF9ncGlvLAorCQkJCSAgICBHUElPRl9PVVRfSU5JVF9MT1csICJidF93YWtldXAiKTsKKworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ2Fubm90IGdldCBHUElPIGxpbmUgMHglZCIsCisJCQlpbmZvLT5idF93YWtldXBfZ3Bpbyk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZwZGV2LT5kZXYsIGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8sCisJCQkJICAgIEdQSU9GX0RJUl9JTiwgImhvc3Rfd2FrZXVwIik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDYW5ub3QgZ2V0IEdQSU8gbGluZSAlZCIsCisJCSAgICAgICBpbmZvLT5ob3N0X3dha2V1cF9ncGlvKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpbmZvLT5pcnEgPSBidF9wbGF0X2RhdGEtPnVhcnRfaXJxOworCWluZm8tPnVhcnRfYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCBidF9wbGF0X2RhdGEtPnVhcnRfYmFzZSwKKwkJCQkJU1pfMkspOworCWluZm8tPnVhcnRfaWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBidF9wbGF0X2RhdGEtPnVhcnRfaWNsayk7CisJaW5mby0+dWFydF9mY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIGJ0X3BsYXRfZGF0YS0+dWFydF9mY2xrKTsKKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaW5mby0+aXJxLCBoY2lfaDRwX2ludGVycnVwdCwKKwkJCQlJUlFGX0RJU0FCTEVELCAiaGNpX2g0cCIsIGluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiaGNpX2g0cDogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsCisJCQlpbmZvLT5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgZ3Bpb190b19pcnEoaW5mby0+aG9zdF93YWtldXBfZ3BpbyksCisJCQkgIGhjaV9oNHBfd2FrZXVwX2ludGVycnVwdCwgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCSAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfRElTQUJMRUQsCisJCQkgICJoY2lfaDRwX3drdXAiLCBpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImhjaV9oNHA6IHVuYWJsZSB0byBnZXQgd2FrZXVwIElSUSAlZFxuIiwKKwkJCSAgZ3Bpb190b19pcnEoaW5mby0+aG9zdF93YWtldXBfZ3BpbykpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGlycV9zZXRfaXJxX3dha2UoZ3Bpb190b19pcnEoaW5mby0+aG9zdF93YWtldXBfZ3BpbyksIDEpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiaGNpX2g0cDogdW5hYmxlIHRvIHNldCB3YWtldXAgZm9yIElSUSAlZFxuIiwKKwkJCQlncGlvX3RvX2lycShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaW5pdF90aW1lcl9kZWZlcnJhYmxlKCZpbmZvLT5sYXp5X3JlbGVhc2UpOworCWluZm8tPmxhenlfcmVsZWFzZS5mdW5jdGlvbiA9IGhjaV9oNHBfbGF6eV9jbG9ja19yZWxlYXNlOworCWluZm8tPmxhenlfcmVsZWFzZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMSk7CisJZXJyID0gaGNpX2g0cF9yZXNldF91YXJ0KGluZm8pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPnJlc2V0X2dwaW8sIDApOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAwKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJaWYgKGhjaV9oNHBfcmVnaXN0ZXJfaGRldihpbmZvKSA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaGNpX2g0cCBoY2kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvOworCisJaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaGNpX2g0cF9zeXNmc19yZW1vdmVfZmlsZXMoaW5mby0+ZGV2KTsKKwloY2lfaDRwX2hjaV9jbG9zZShpbmZvLT5oZGV2KTsKKwloY2lfdW5yZWdpc3Rlcl9kZXYoaW5mby0+aGRldik7CisJaGNpX2ZyZWVfZGV2KGluZm8tPmhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhjaV9oNHBfZHJpdmVyID0geworCS5wcm9iZQkJPSBoY2lfaDRwX3Byb2JlLAorCS5yZW1vdmUJCT0gaGNpX2g0cF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImhjaV9oNHAiLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhjaV9oNHBfZHJpdmVyKTsKKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpoY2lfaDRwIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJsdWV0b290aCBoNCBkcml2ZXIgd2l0aCBub2tpYSBleHRlbnNpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJWaWxsZSBUZXJ2byIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy1iY20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctYmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExYWU5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctYmNtLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSAiaGNpX2g0cC5oIgorCitzdGF0aWMgaW50IGhjaV9oNHBfYmNtX3NldF9iZGFkZHIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBpOworCXN0YXRpYyBjb25zdCB1OCBub2tpYV9vdWlbM10gPSB7MHgwMCwgMHgxZiwgMHhkZn07CisJaW50IG5vdF92YWxpZDsKKworCW5vdF92YWxpZCA9IDE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAoaW5mby0+YmRfYWRkcltpXSAhPSAweDAwKSB7CisJCQlub3RfdmFsaWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobm90X3ZhbGlkKSB7CisJCWRldl9pbmZvKGluZm8tPmRldiwgIlZhbGlkIGJsdWV0b290aCBhZGRyZXNzIG5vdCBmb3VuZCwgc2V0dGluZyBzb21lIHJhbmRvbVxuIik7CisJCS8qIFdoZW4gYWRkcmVzcyBpcyBub3QgdmFsaWQsIHVzZSBzb21lIHJhbmRvbSBidXQgTm9raWEgTUFDICovCisJCW1lbWNweShpbmZvLT5iZF9hZGRyLCBub2tpYV9vdWksIDMpOworCQlnZXRfcmFuZG9tX2J5dGVzKGluZm8tPmJkX2FkZHIgKyAzLCAzKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlza2ItPmRhdGFbOSAtIGldID0gaW5mby0+YmRfYWRkcltpXTsKKworCXJldHVybiAwOworfQorCit2b2lkIGhjaV9oNHBfYmNtX3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKmZ3X3NrYjsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2tiLT5kYXRhWzVdICE9IDB4MDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJGaXJtd2FyZSBzZW5kaW5nIGNvbW1hbmQgZmFpbGVkIDB4JS4yeFxuIiwKKwkJCXNrYi0+ZGF0YVs1XSk7CisJCWluZm8tPmZ3X2Vycm9yID0gLUVQUk9UTzsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCWZ3X3NrYiA9IHNrYl9kZXF1ZXVlKGluZm8tPmZ3X3EpOworCWlmIChmd19za2IgPT0gTlVMTCB8fCBpbmZvLT5md19lcnJvcikgeworCQljb21wbGV0ZSgmaW5mby0+ZndfY29tcGxldGlvbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZndfc2tiLT5kYXRhWzFdID09IDB4MDEgJiYgZndfc2tiLT5kYXRhWzJdID09IDB4ZmMgJiYgZndfc2tiLT5sZW4gPj0gMTApIHsKKwkJQlRfREJHKCJTZXR0aW5nIGJsdWV0b290aCBhZGRyZXNzIik7CisJCWVyciA9IGhjaV9oNHBfYmNtX3NldF9iZGFkZHIoaW5mbywgZndfc2tiKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlX3NrYihmd19za2IpOworCQkJaW5mby0+ZndfZXJyb3IgPSBlcnI7CisJCQljb21wbGV0ZSgmaW5mby0+ZndfY29tcGxldGlvbik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBmd19za2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkJVUFSVF9JRVJfVEhSSSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCisKK2ludCBoY2lfaDRwX2JjbV9zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRpbWU7CisKKwlpbmZvLT5md19lcnJvciA9IDA7CisKKwlCVF9EQkcoIlNlbmRpbmcgZmlybXdhcmUiKTsKKworCXRpbWUgPSBqaWZmaWVzOworCisJaW5mby0+ZndfcSA9IGZ3X3F1ZXVlOworCXNrYiA9IHNrYl9kZXF1ZXVlKGZ3X3F1ZXVlKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJQlRfREJHKCJTZW5kaW5nIGNvbW1hbmRzIik7CisKKwkvKgorCSAqIERpc2FibGUgc21hcnQtaWRsZSBhcyBVQVJUIFRYIGludGVycnVwdHMKKwkgKiBhcmUgbm90IHdha2UtdXAgY2FwYWJsZQorCSAqLworCWhjaV9oNHBfc21hcnRfaWRsZShpbmZvLCAwKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYmRfYWRkcmVzcyBwYWNrZXQgKi8KKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIHNrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCQlVQVJUX0lFUl9USFJJKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5mby0+ZndfY29tcGxldGlvbiwKKwkJCQltc2Vjc190b19qaWZmaWVzKDIwMDApKSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIk5vIHJlcGx5IHRvIGZ3IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlpZiAoaW5mby0+ZndfZXJyb3IpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJGVyBlcnJvclxuIik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCUJUX0RCRygiRmlybXdhcmUgc2VudCBpbiAlZCBtc2VjcyIsCisJCSAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcy10aW1lKSk7CisKKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAwLCBVQVJUX0VGUl9SVFMpOworCWhjaV9oNHBfc2V0X3J0cyhpbmZvLCAwKTsKKwloY2lfaDRwX2NoYW5nZV9zcGVlZChpbmZvLCBCQzRfTUFYX0JBVURfUkFURSk7CisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMSwgVUFSVF9FRlJfUlRTKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy1jc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctY3NyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2YjcwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctY3NyLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSAiaGNpX2g0cC5oIgorCit2b2lkIGhjaV9oNHBfYmM0X3BhcnNlX2Z3X2V2ZW50KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogQ2hlY2sgaWYgdGhpcyBpcyBmdyBwYWNrZXQgKi8KKwlpZiAoc2tiLT5kYXRhWzBdICE9IDB4ZmYpIHsKKwkJaGNpX3JlY3ZfZnJhbWUoaW5mby0+aGRldiwgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2ItPmRhdGFbMTFdIHx8IHNrYi0+ZGF0YVsxMl0pIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJGaXJtd2FyZSBzZW5kaW5nIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJaW5mby0+ZndfZXJyb3IgPSAtRVBST1RPOworCX0KKworCWtmcmVlX3NrYihza2IpOworCWNvbXBsZXRlKCZpbmZvLT5md19jb21wbGV0aW9uKTsKK30KKworaW50IGhjaV9oNHBfYmM0X3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKQoreworCXN0YXRpYyBjb25zdCB1OCBub2tpYV9vdWlbM10gPSB7MHgwMCwgMHgxOSwgMHg0Rn07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCByZXRyaWVzLCBjb3VudCwgaSwgbm90X3ZhbGlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbmZvLT5md19lcnJvciA9IDA7CisKKwlCVF9EQkcoIlNlbmRpbmcgZmlybXdhcmUiKTsKKwlza2IgPSBza2JfZGVxdWV1ZShmd19xdWV1ZSk7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NU0c7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGJkX2FkZHJlc3MgcGFja2V0ICovCisJaWYgKHNrYi0+ZGF0YVsxNV0gPT0gMHgwMSAmJiBza2ItPmRhdGFbMTZdID09IDB4MDApIHsKKwkJb2Zmc2V0ID0gMjE7CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyAxXSA9IDB4MDA7CisJCXNrYi0+ZGF0YVtvZmZzZXQgKyA1XSA9IDB4MDA7CisKKwkJbm90X3ZhbGlkID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJaWYgKGluZm8tPmJkX2FkZHJbaV0gIT0gMHgwMCkgeworCQkJCW5vdF92YWxpZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAobm90X3ZhbGlkKSB7CisJCQlkZXZfaW5mbyhpbmZvLT5kZXYsICJWYWxpZCBibHVldG9vdGggYWRkcmVzcyBub3QgZm91bmQsIHNldHRpbmcgc29tZSByYW5kb21cbiIpOworCQkJLyogV2hlbiBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgdXNlIHNvbWUgcmFuZG9tICovCisJCQltZW1jcHkoaW5mby0+YmRfYWRkciwgbm9raWFfb3VpLCAzKTsKKwkJCWdldF9yYW5kb21fYnl0ZXMoaW5mby0+YmRfYWRkciArIDMsIDMpOworCQl9CisKKwkJc2tiLT5kYXRhW29mZnNldCArIDddID0gaW5mby0+YmRfYWRkclswXTsKKwkJc2tiLT5kYXRhW29mZnNldCArIDZdID0gaW5mby0+YmRfYWRkclsxXTsKKwkJc2tiLT5kYXRhW29mZnNldCArIDRdID0gaW5mby0+YmRfYWRkclsyXTsKKwkJc2tiLT5kYXRhW29mZnNldCArIDBdID0gaW5mby0+YmRfYWRkclszXTsKKwkJc2tiLT5kYXRhW29mZnNldCArIDNdID0gaW5mby0+YmRfYWRkcls0XTsKKwkJc2tiLT5kYXRhW29mZnNldCArIDJdID0gaW5mby0+YmRfYWRkcls1XTsKKwl9CisKKwlmb3IgKGNvdW50ID0gMTsgOyBjb3VudCsrKSB7CisJCUJUX0RCRygiU2VuZGluZyBmaXJtd2FyZSBjb21tYW5kICVkIiwgY291bnQpOworCQlpbml0X2NvbXBsZXRpb24oJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCQlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBza2IpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCQkJCQkJIFVBUlRfSUVSX1RIUkkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkJc2tiID0gc2tiX2RlcXVldWUoZndfcXVldWUpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLT5md19jb21wbGV0aW9uLAorCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKSB7CisJCQlkZXZfZXJyKGluZm8tPmRldiwgIk5vIHJlcGx5IHRvIGZ3IGNvbW1hbmRcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQlpZiAoaW5mby0+ZndfZXJyb3IpIHsKKwkJCWRldl9lcnIoaW5mby0+ZGV2LCAiRlcgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FUFJPVE87CisJCX0KKwl9OworCisJLyogV2FpdCBmb3IgY2hpcCB3YXJtIHJlc2V0ICovCisJcmV0cmllcyA9IDEwMDsKKwl3aGlsZSAoKCFza2JfcXVldWVfZW1wdHkoJmluZm8tPnR4cSkgfHwKKwkgICAgICAgIShoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkgJiYKKwkgICAgICAgcmV0cmllcy0tKSB7CisJCW1zbGVlcCgxMCk7CisJfQorCWlmICghcmV0cmllcykgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIlRyYW5zbWl0dGVyIG5vdCBlbXB0eVxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCWhjaV9oNHBfY2hhbmdlX3NwZWVkKGluZm8sIEJDNF9NQVhfQkFVRF9SQVRFKTsKKworCWlmIChoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAxLCAxMDApKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiY3RzIGRpZG4ndCBkZWFzc2VydCBhZnRlciBmaW5hbCBzcGVlZFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHJpZXMgPSAxMDA7CisJZG8geworCQlpbml0X2NvbXBsZXRpb24oJmluZm8tPmluaXRfY29tcGxldGlvbik7CisJCWhjaV9oNHBfc2VuZF9hbGl2ZV9wYWNrZXQoaW5mbyk7CisJCXJldHJpZXMtLTsKKwl9IHdoaWxlICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLT5pbml0X2NvbXBsZXRpb24sIDEwMCkgJiYKKwkJIHJldHJpZXMgPiAwKTsKKworCWlmICghcmV0cmllcykgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIk5vIGFsaXZlIHJlcGx5IGFmdGVyIHNwZWVkIGNoYW5nZVxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy10aTEyNzMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctdGkxMjczLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MDBmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZnctdGkxMjczLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKworI2luY2x1ZGUgImhjaV9oNHAuaCIKKworc3RhdGljIHN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3E7CisKK3ZvaWQgaGNpX2g0cF90aTEyNzNfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKmZ3X3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNrYi0+ZGF0YVs1XSAhPSAweDAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRmlybXdhcmUgc2VuZGluZyBjb21tYW5kIGZhaWxlZCAweCUuMnhcbiIsCisJCQlza2ItPmRhdGFbNV0pOworCQlpbmZvLT5md19lcnJvciA9IC1FUFJPVE87CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlmd19za2IgPSBza2JfZGVxdWV1ZShmd19xKTsKKwlpZiAoZndfc2tiID09IE5VTEwgfHwgaW5mby0+ZndfZXJyb3IpIHsKKwkJY29tcGxldGUoJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCQlyZXR1cm47CisJfQorCisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgZndfc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJCVVBUlRfSUVSX1RIUkkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworCitpbnQgaGNpX2g0cF90aTEyNzNfc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lOworCisJaW5mby0+ZndfZXJyb3IgPSAwOworCisJQlRfREJHKCJTZW5kaW5nIGZpcm13YXJlIik7CisKKwl0aW1lID0gamlmZmllczsKKworCWZ3X3EgPSBmd19xdWV1ZTsKKwlza2IgPSBza2JfZGVxdWV1ZShmd19xdWV1ZSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PREFUQTsKKworCUJUX0RCRygiU2VuZGluZyBjb21tYW5kcyIpOworCS8qIENoZWNrIGlmIHRoaXMgaXMgYmRfYWRkcmVzcyBwYWNrZXQgKi8KKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmZ3X2NvbXBsZXRpb24pOworCWhjaV9oNHBfc21hcnRfaWRsZShpbmZvLCAwKTsKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBza2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkJVUFSVF9JRVJfVEhSSSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8tPmZ3X2NvbXBsZXRpb24sCisJCQkJbXNlY3NfdG9famlmZmllcygyMDAwKSkpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJObyByZXBseSB0byBmdyBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaWYgKGluZm8tPmZ3X2Vycm9yKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRlcgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlCVF9EQkcoIkZpcm13YXJlIHNlbnQgaW4gJWQgbXNlY3MiLAorCQkgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMtdGltZSkpOworCisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMCwgVUFSVF9FRlJfUlRTKTsKKwloY2lfaDRwX3NldF9ydHMoaW5mbywgMCk7CisJaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoaW5mbywgQkM0X01BWF9CQVVEX1JBVEUpOworCWlmIChoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAxLCAxMDApKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LAorCQkJImN0cyBkaWRuJ3QgZ28gZG93biBhZnRlciBmaW5hbCBzcGVlZCBjaGFuZ2VcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMSwgVUFSVF9FRlJfUlRTKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy5jIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmEyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBoY2lfaDRwIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogQ29udGFjdDogVmlsbGUgVGVydm8gPHZpbGxlLnRlcnZvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKworI2luY2x1ZGUgImhjaV9oNHAuaCIKKworI2RlZmluZSBGV19OQU1FX1RJMTI3MV9QUkVMRQkidGkxMjczX3ByZWxlLmJpbiIKKyNkZWZpbmUgRldfTkFNRV9USTEyNzFfTEUJInRpMTI3M19sZS5iaW4iCisjZGVmaW5lIEZXX05BTUVfVEkxMjcxCQkidGkxMjczLmJpbiIKKyNkZWZpbmUgRldfTkFNRV9CQ00yMDQ4CQkiYmNtZncuYmluIgorI2RlZmluZSBGV19OQU1FX0NTUgkJImJjNGZ3LmJpbiIKKworc3RhdGljIGludCBmd19wb3M7CisKKy8qIEZpcm13YXJlIGhhbmRsaW5nICovCitzdGF0aWMgaW50IGhjaV9oNHBfb3Blbl9maXJtd2FyZShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCSBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmd19lbnRyeSkKK3sKKwlpbnQgZXJyOworCisJZndfcG9zID0gMDsKKwlCVF9EQkcoIk9wZW5pbmcgZmlybXdhcmUgbWFuX2lkIDB4JS4yeCB2ZXJfaWQgMHglLjJ4IiwKKwkJCWluZm8tPm1hbl9pZCwgaW5mby0+dmVyX2lkKTsKKwlzd2l0Y2ggKGluZm8tPm1hbl9pZCkgeworCWNhc2UgSDRQX0lEX1RJMTI3MToKKwkJc3dpdGNoIChpbmZvLT52ZXJfaWQpIHsKKwkJY2FzZSAweGUxOgorCQkJZXJyID0gcmVxdWVzdF9maXJtd2FyZShmd19lbnRyeSwgRldfTkFNRV9USTEyNzFfUFJFTEUsCisJCQkJCQlpbmZvLT5kZXYpOworCQkJYnJlYWs7CisJCWNhc2UgMHhkMToKKwkJY2FzZSAweGYxOgorCQkJZXJyID0gcmVxdWVzdF9maXJtd2FyZShmd19lbnRyeSwgRldfTkFNRV9USTEyNzFfTEUsCisJCQkJCQlpbmZvLT5kZXYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBGV19OQU1FX1RJMTI3MSwKKwkJCQkJCWluZm8tPmRldik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBINFBfSURfQ1NSOgorCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBGV19OQU1FX0NTUiwgaW5mby0+ZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBINFBfSURfQkNNMjA0ODoKKwkJZXJyID0gcmVxdWVzdF9maXJtd2FyZShmd19lbnRyeSwgRldfTkFNRV9CQ00yMDQ4LCBpbmZvLT5kZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgIkludmFsaWQgY2hpcCB0eXBlXG4iKTsKKwkJKmZ3X2VudHJ5ID0gTlVMTDsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX2Nsb3NlX2Zpcm13YXJlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnkpCit7CisJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7Cit9CisKKy8qIFJlYWQgZncuIFJldHVybiBsZW5ndGggb2YgdGhlIGNvbW1hbmQuIElmIG5vIG1vcmUgY29tbWFuZHMgaW4KKyAqIGZ3IDAgaXMgcmV0dXJuZWQuIEluIGVycm9yIGNhc2UgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLgorICovCitzdGF0aWMgaW50IGhjaV9oNHBfcmVhZF9md19jbWQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKipza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSwgZ2ZwX3QgaG93KQoreworCXVuc2lnbmVkIGludCBjbWRfbGVuOworCisJaWYgKGZ3X3BvcyA+PSBmd19lbnRyeS0+c2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZndfcG9zICsgMiA+IGZ3X2VudHJ5LT5zaXplKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ29ycnVwdGVkIGZpcm13YXJlIGltYWdlIDFcbiIpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCWNtZF9sZW4gPSBmd19lbnRyeS0+ZGF0YVtmd19wb3MrK107CisJY21kX2xlbiArPSBmd19lbnRyeS0+ZGF0YVtmd19wb3MrK10gPDwgODsKKwlpZiAoY21kX2xlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChmd19wb3MgKyBjbWRfbGVuID4gZndfZW50cnktPnNpemUpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDb3JydXB0ZWQgZmlybXdhcmUgaW1hZ2UgMlxuIik7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCisJKnNrYiA9IGJ0X3NrYl9hbGxvYyhjbWRfbGVuLCBob3cpOworCWlmICghKnNrYikgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNhbm5vdCByZXNlcnZlIG1lbW9yeSBmb3IgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweShza2JfcHV0KCpza2IsIGNtZF9sZW4pLCAmZndfZW50cnktPmRhdGFbZndfcG9zXSwgY21kX2xlbik7CisKKwlmd19wb3MgKz0gY21kX2xlbjsKKworCXJldHVybiAoKnNrYiktPmxlbjsKK30KKworaW50IGhjaV9oNHBfcmVhZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgZXJyOworCisJZXJyID0gaGNpX2g0cF9vcGVuX2Zpcm13YXJlKGluZm8sICZmd19lbnRyeSk7CisJaWYgKGVyciA8IDAgfHwgIWZ3X2VudHJ5KQorCQlnb3RvIGVycl9jbGVhbjsKKworCXdoaWxlICgoZXJyID0gaGNpX2g0cF9yZWFkX2Z3X2NtZChpbmZvLCAmc2tiLCBmd19lbnRyeSwgR0ZQX0tFUk5FTCkpKSB7CisJCWlmIChlcnIgPCAwIHx8ICFza2IpCisJCQlnb3RvIGVycl9jbGVhbjsKKworCQlza2JfcXVldWVfdGFpbChmd19xdWV1ZSwgc2tiKTsKKwl9CisKKwkvKiBDaGlwIGRldGVjdGlvbiBjb2RlIGRvZXMgbmVnIGFuZCBhbGl2ZSBzdHVmZgorCSAqIGRpc2NhcmQgdHdvIGZpcnN0IHNrYnMgKi8KKwlza2IgPSBza2JfZGVxdWV1ZShmd19xdWV1ZSk7CisJaWYgKCFza2IpIHsKKwkJZXJyID0gLUVNU0dTSVpFOworCQlnb3RvIGVycl9jbGVhbjsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisJc2tiID0gc2tiX2RlcXVldWUoZndfcXVldWUpOworCWlmICghc2tiKSB7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBlcnJfY2xlYW47CisJfQorCWtmcmVlX3NrYihza2IpOworCitlcnJfY2xlYW46CisJaGNpX2g0cF9jbG9zZV9maXJtd2FyZShmd19lbnRyeSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhjaV9oNHBfc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSkKK3sKKwlpbnQgZXJyOworCisJc3dpdGNoIChpbmZvLT5tYW5faWQpIHsKKwljYXNlIEg0UF9JRF9DU1I6CisJCWVyciA9IGhjaV9oNHBfYmM0X3NlbmRfZncoaW5mbywgZndfcXVldWUpOworCQlicmVhazsKKwljYXNlIEg0UF9JRF9USTEyNzE6CisJCWVyciA9IGhjaV9oNHBfdGkxMjczX3NlbmRfZncoaW5mbywgZndfcXVldWUpOworCQlicmVhazsKKwljYXNlIEg0UF9JRF9CQ00yMDQ4OgorCQllcnIgPSBoY2lfaDRwX2JjbV9zZW5kX2Z3KGluZm8sIGZ3X3F1ZXVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpbmZvLT5kZXYsICJEb24ndCBrbm93IGhvdyB0byBzZW5kIGZpcm13YXJlXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGhjaV9oNHBfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzd2l0Y2ggKGluZm8tPm1hbl9pZCkgeworCWNhc2UgSDRQX0lEX0NTUjoKKwkJaGNpX2g0cF9iYzRfcGFyc2VfZndfZXZlbnQoaW5mbywgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBINFBfSURfVEkxMjcxOgorCQloY2lfaDRwX3RpMTI3M19wYXJzZV9md19ldmVudChpbmZvLCBza2IpOworCQlicmVhazsKKwljYXNlIEg0UF9JRF9CQ00yMDQ4OgorCQloY2lfaDRwX2JjbV9wYXJzZV9md19ldmVudChpbmZvLCBza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgIkRvbid0IGtub3cgaG93IHRvIHBhcnNlIGZ3IGV2ZW50XG4iKTsKKwkJaW5mby0+ZndfZXJyb3IgPSAtRUlOVkFMOworCX0KKworCXJldHVybjsKK30KKworTU9EVUxFX0ZJUk1XQVJFKEZXX05BTUVfVEkxMjcxX1BSRUxFKTsKK01PRFVMRV9GSVJNV0FSRShGV19OQU1FX1RJMTI3MV9MRSk7CitNT0RVTEVfRklSTVdBUkUoRldfTkFNRV9USTEyNzEpOworTU9EVUxFX0ZJUk1XQVJFKEZXX05BTUVfQkNNMjA0OCk7CitNT0RVTEVfRklSTVdBUkUoRldfTkFNRV9DU1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV91YXJ0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX3VhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI1N2RlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV91YXJ0LmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOb2tpYSBINFAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJoY2lfaDRwLmgiCisKK2lubGluZSB2b2lkIGhjaV9oNHBfb3V0YihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1OCB2YWwpCit7CisJX19yYXdfd3JpdGViKHZhbCwgaW5mby0+dWFydF9iYXNlICsgKG9mZnNldCA8PCAyKSk7Cit9CisKK2lubGluZSB1OCBoY2lfaDRwX2luYihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBfX3Jhd19yZWFkYihpbmZvLT51YXJ0X2Jhc2UgKyAob2Zmc2V0IDw8IDIpKTsKK30KKwordm9pZCBoY2lfaDRwX3NldF9ydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IGFjdGl2ZSkKK3sKKwl1OCBiOworCisJYiA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTUNSKTsKKwlpZiAoYWN0aXZlKQorCQliIHw9IFVBUlRfTUNSX1JUUzsKKwllbHNlCisJCWIgJj0gflVBUlRfTUNSX1JUUzsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9NQ1IsIGIpOworfQorCitpbnQgaGNpX2g0cF93YWl0X2Zvcl9jdHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IGFjdGl2ZSwKKwkJCSBpbnQgdGltZW91dF9tcykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IHN0YXRlOworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXMpOworCWZvciAoOzspIHsKKwkJc3RhdGUgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX01TUikgJiBVQVJUX01TUl9DVFM7CisJCWlmIChhY3RpdmUpIHsKKwkJCWlmIChzdGF0ZSkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICghc3RhdGUpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJbXNsZWVwKDEpOworCX0KK30KKwordm9pZCBfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBvbiwgdTggd2hpY2gpCit7CisJdTggbGNyLCBiOworCisJbGNyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MQ1IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgMHhiZik7CisJYiA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfRUZSKTsKKwlpZiAob24pCisJCWIgfD0gd2hpY2g7CisJZWxzZQorCQliICY9IH53aGljaDsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9FRlIsIGIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgbGNyKTsKK30KKwordm9pZCBoY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgb24sIHU4IHdoaWNoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCV9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgb24sIHdoaWNoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBzcGVlZCkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjsKKwl1OCBsY3IsIG1kcjE7CisKKwlCVF9EQkcoIlNldHRpbmcgc3BlZWQgJWx1Iiwgc3BlZWQpOworCisJaWYgKHNwZWVkID49IDQ2MDgwMCkgeworCQlkaXZpc29yID0gVUFSVF9DTE9DSyAvIDEzIC8gc3BlZWQ7CisJCW1kcjEgPSAzOworCX0gZWxzZSB7CisJCWRpdmlzb3IgPSBVQVJUX0NMT0NLIC8gMTYgLyBzcGVlZDsKKwkJbWRyMSA9IDA7CisJfQorCisJLyogTWFrZSBzdXJlIFVBUlQgbW9kZSBpcyBkaXNhYmxlZCAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfTURSMSwgNyk7CisKKwlsY3IgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xDUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBVQVJUX0xDUl9ETEFCKTsgICAgIC8qIFNldCBETEFCICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRExMLCBkaXZpc29yICYgMHhmZik7ICAgIC8qIFNldCBzcGVlZCAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0RMTSwgZGl2aXNvciA+PiA4KTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIGxjcik7CisKKwkvKiBNYWtlIHN1cmUgVUFSVCBtb2RlIGlzIGVuYWJsZWQgKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX01EUjEsIG1kcjEpOworfQorCitpbnQgaGNpX2g0cF9yZXNldF91YXJ0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJaW50IGNvdW50ID0gMDsKKworCS8qIFJlc2V0IHRoZSBVQVJUICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9TWVNDLCBVQVJUX1NZU0NfT01BUF9SRVNFVCk7CisJd2hpbGUgKCEoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NZU1MpICYgVUFSVF9TWVNTX1JFU0VURE9ORSkpIHsKKwkJaWYgKGNvdW50KysgPiAxMDApIHsKKwkJCWRldl9lcnIoaW5mby0+ZGV2LCAiaGNpX2g0cDogVUFSVCByZXNldCB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoY2lfaDRwX3N0b3JlX3JlZ3Moc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwl1MTYgbGNyID0gMDsKKworCWxjciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTENSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIDB4QkYpOworCWluZm8tPmRsbCA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfRExMKTsKKwlpbmZvLT5kbGggPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0RMTSk7CisJaW5mby0+ZWZyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9FRlIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgbGNyKTsKKwlpbmZvLT5tZHIxID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX01EUjEpOworCWluZm8tPmllciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKTsKK30KKwordm9pZCBoY2lfaDRwX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXUxNiBsY3IgPSAwOworCisJaGNpX2g0cF9pbml0X3VhcnQoaW5mbyk7CisKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX01EUjEsIDcpOworCWxjciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTENSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIDB4QkYpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0RMTCwgaW5mby0+ZGxsKTsgICAgLyogU2V0IHNwZWVkICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRExNLCBpbmZvLT5kbGgpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0VGUiwgaW5mby0+ZWZyKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIGxjcik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9NRFIxLCBpbmZvLT5tZHIxKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGluZm8tPmllcik7Cit9CisKK3ZvaWQgaGNpX2g0cF9pbml0X3VhcnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwl1OCBtY3IsIGVmcjsKKworCS8qIEVuYWJsZSBhbmQgc2V0dXAgRklGTyAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfTURSMSwgMHgwMCk7CisKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIDB4YmYpOworCWVmciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfRUZSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9FRlIsIFVBUlRfRUZSX0VDQik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBVQVJUX0xDUl9ETEFCKTsKKwltY3IgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX01DUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTUNSLCBVQVJUX01DUl9UQ1JUTFIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAorCQkJVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQgfAorCQkJKDMgPDwgNikgfCAoMCA8PCA0KSk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCAweGJmKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9USTc1Ml9UTFIsIDB4ZWQpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX1RJNzUyX1RDUiwgMHhlZik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRUZSLCBlZnIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgVUFSVF9MQ1JfRExBQik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTUNSLCAweDAwKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU44KTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIFVBUlRfSUVSX1JESSk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9TWVNDLCAoMSA8PCAwKSB8ICgxIDw8IDIpIHwgKDIgPDwgMykpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCmluZGV4IDNlZTBiMTguLjkwZjFjNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKQEAgLTY3OCw4ICs2NzgsNyBAQAogCQkJbnZlYy0+cngtPmRhdGFbbnZlYy0+cngtPnBvcysrXSA9IHJlY2VpdmVkOwogCQllbHNlCiAJCQlkZXZfZXJyKG52ZWMtPmRldiwKLQkJCQkiUlggYnVmZmVyIG92ZXJmbG93IG9uICVwOiAiCi0JCQkJIlRyeWluZyB0byB3cml0ZSBieXRlICV1IG9mICV1XG4iLAorCQkJCSJSWCBidWZmZXIgb3ZlcmZsb3cgb24gJXA6IFRyeWluZyB0byB3cml0ZSBieXRlICV1IG9mICV1XG4iLAogCQkJCW52ZWMtPnJ4LCBudmVjLT5yeCA/IG52ZWMtPnJ4LT5wb3MgOiAwLAogCQkJCU5WRUNfTVNHX1NJWkUpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jCmluZGV4IDA2ZGJiMDIuLjQ1YjJmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJc3RydWN0IHNlcmlvICpzZXJfZGV2OwogCWNoYXIgbW91c2VfcmVzZXRbXSA9IHsgTlZFQ19QUzIsIFNFTkRfQ09NTUFORCwgUFNNT1VTRV9SU1QsIDMgfTsKIAotCXNlcl9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKKwlzZXJfZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2VyX2RldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCmluZGV4IDVhMDAxZDkuLjhiOGNlNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKQEAgLTQ2NSw2ICs0NjUsMTEyIEBACiAjZGVmaW5lIFVTQl9GSUZPX0FERFJFU1MoY2hhbm5lbCwgdXNiX2luZGV4KSAoQ1ZNWF9VU0JDWF9HT1RHQ1RMKHVzYl9pbmRleCkgKyAoKGNoYW5uZWwpKzEpKjB4MTAwMCkKIAogLyoqCisgKiBzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyIC0gYSBib3VuY2UgYnVmZmVyIGZvciBVU0IgdHJhbnNmZXJzCisgKiBAdGVtcF9idWZmZXI6IHRoZSBuZXdseSBhbGxvY2F0ZWQgdGVtcG9yYXJ5IGJ1ZmZlciAoaW5jbHVkaW5nIG1ldGEtZGF0YSkKKyAqIEBvcmlnX2J1ZmZlcjogdGhlIG9yaWdpbmFsIGJ1ZmZlciBwYXNzZWQgYnkgdGhlIFVTQiBzdGFjaworICogQGRhdGE6CSB0aGUgbmV3bHkgYWxsb2NhdGVkIHRlbXBvcmFyeSBidWZmZXIgKGV4Y2x1ZGluZyBtZXRhLWRhdGEpCisgKgorICogQm90aCB0aGUgRE1BIGVuZ2luZSBhbmQgRklGTyBtb2RlIHdpbGwgYWx3YXlzIHRyYW5zZmVyIGZ1bGwgMzItYml0IHdvcmRzLiBJZgorICogdGhlIGJ1ZmZlciBpcyB0b28gc2hvcnQsIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSB0ZW1wb3Jhcnkgb25lLCBhbmQgdGhpcyBzdHJ1Y3QKKyAqIHJlcHJlc2VudHMgaXQuCisgKi8KK3N0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIgeworCXZvaWQgKnRlbXBfYnVmZmVyOworCXZvaWQgKm9yaWdfYnVmZmVyOworCXU4IGRhdGFbMF07Cit9OworCisvKioKKyAqIG9jdGVvbl9hbGxvY190ZW1wX2J1ZmZlciAtIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgVVNCIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbmVlZGVkKQorICogQHVyYjoJVVJCLgorICogQG1lbV9mbGFnczoJTWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSB0ZW1wb3JhcnkgYm91bmNlIGJ1ZmZlciB3aGVuZXZlciBpdCdzIG5lZWRlZAorICogZHVlIHRvIEhXIGxpbWl0YXRpb25zLgorICovCitzdGF0aWMgaW50IG9jdGVvbl9hbGxvY190ZW1wX2J1ZmZlcihzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyICp0ZW1wOworCisJaWYgKHVyYi0+bnVtX3NncyB8fCB1cmItPnNnIHx8CisJICAgICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVApIHx8CisJICAgICEodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICUgc2l6ZW9mKHUzMikpKQorCQlyZXR1cm4gMDsKKworCXRlbXAgPSBrbWFsbG9jKEFMSUdOKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgc2l6ZW9mKHUzMikpICsKKwkJICAgICAgIHNpemVvZigqdGVtcCksIG1lbV9mbGFncyk7CisJaWYgKCF0ZW1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRlbXAtPnRlbXBfYnVmZmVyID0gdGVtcDsKKwl0ZW1wLT5vcmlnX2J1ZmZlciA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWlmICh1c2JfdXJiX2Rpcl9vdXQodXJiKSkKKwkJbWVtY3B5KHRlbXAtPmRhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkgICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRlbXAtPmRhdGE7CisJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQUxJR05FRF9URU1QX0JVRkZFUjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG9jdGVvbl9mcmVlX3RlbXBfYnVmZmVyIC0gZnJlZSBhIHRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBVU0IgdHJhbnNmZXJzLgorICogQHVyYjogVVJCLgorICoKKyAqIEZyZWVzIGEgYnVmZmVyIGFsbG9jYXRlZCBieSBvY3Rlb25fYWxsb2NfdGVtcF9idWZmZXIoKS4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2ZyZWVfdGVtcF9idWZmZXIoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIgKnRlbXA7CisKKwlpZiAoISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX0FMSUdORURfVEVNUF9CVUZGRVIpKQorCQlyZXR1cm47CisKKwl0ZW1wID0gY29udGFpbmVyX29mKHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyLAorCQkJICAgIGRhdGEpOworCWlmICh1c2JfdXJiX2Rpcl9pbih1cmIpKQorCQltZW1jcHkodGVtcC0+b3JpZ19idWZmZXIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRlbXAtPm9yaWdfYnVmZmVyOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BTElHTkVEX1RFTVBfQlVGRkVSOworCWtmcmVlKHRlbXAtPnRlbXBfYnVmZmVyKTsKK30KKworLyoqCisgKiBvY3Rlb25fbWFwX3VyYl9mb3JfZG1hIC0gT2N0ZW9uLXNwZWNpZmljIG1hcF91cmJfZm9yX2RtYSgpLgorICogQGhjZDoJVVNCIEhDRCBzdHJ1Y3R1cmUuCisgKiBAdXJiOglVUkIuCisgKiBAbWVtX2ZsYWdzOglNZW1vcnkgYWxsb2NhdGlvbiBmbGFncy4KKyAqLworc3RhdGljIGludCBvY3Rlb25fbWFwX3VyYl9mb3JfZG1hKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCQkgIGdmcF90IG1lbV9mbGFncykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gb2N0ZW9uX2FsbG9jX3RlbXBfYnVmZmVyKHVyYiwgbWVtX2ZsYWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdXNiX2hjZF9tYXBfdXJiX2Zvcl9kbWEoaGNkLCB1cmIsIG1lbV9mbGFncyk7CisJaWYgKHJldCkKKwkJb2N0ZW9uX2ZyZWVfdGVtcF9idWZmZXIodXJiKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb2N0ZW9uX3VubWFwX3VyYl9mb3JfZG1hIC0gT2N0ZW9uLXNwZWNpZmljIHVubWFwX3VyYl9mb3JfZG1hKCkKKyAqIEBoY2Q6CVVTQiBIQ0Qgc3RydWN0dXJlLgorICogQHVyYjoJVVJCLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fdW5tYXBfdXJiX2Zvcl9kbWEoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiKQoreworCXVzYl9oY2RfdW5tYXBfdXJiX2Zvcl9kbWEoaGNkLCB1cmIpOworCW9jdGVvbl9mcmVlX3RlbXBfYnVmZmVyKHVyYik7Cit9CisKKy8qKgogICogUmVhZCBhIFVTQiAzMmJpdCBDU1IuIEl0IHBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgYWRkcmVzcyBzd2l6emxlCiAgKiBmb3IgMzJiaXQgQ1NScyBhbmQgbG9ncyB0aGUgdmFsdWUgaW4gYSByZWFkYWJsZSBmb3JtYXQgaWYKICAqIGRlYnVnZ2luZyBpcyBvbi4KQEAgLTYwNSw3ICs3MTEsOCBAQAogCSAqIDJhLiBXcml0ZSBVU0JOMC8xX0NMS19DVExbUE9SXSA9IDEgYW5kCiAJICogICAgIFVTQk4wLzFfQ0xLX0NUTFtIUlNULFBSU1QsSENMS19SU1RdID0gMAogCSAqLwotCXVzYm5fY2xrX2N0bC51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOworCXVzYm5fY2xrX2N0bC51NjQgPQorCQlfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOwogCXVzYm5fY2xrX2N0bC5zLnBvciA9IDE7CiAJdXNibl9jbGtfY3RsLnMuaHJzdCA9IDA7CiAJdXNibl9jbGtfY3RsLnMucHJzdCA9IDA7CkBAIC02OTEsNyArNzk4LDggQEAKIAkgKiAgICBVU0JQIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcjoKIAkgKiAgICBVU0JOX1VTQlBfQ1RMX1NUQVRVU1tBVEVfUkVTRVRdID0gMQogCSAqLwotCXVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsIENWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpKTsKKwl1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLAorCQkJQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCkpOwogCXVzYm5fdXNicF9jdGxfc3RhdHVzLnMuYXRlX3Jlc2V0ID0gMTsKIAlfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCksCiAJCQkgICAgICAgdXNibl91c2JwX2N0bF9zdGF0dXMudTY0KTsKQEAgLTc1OCw3ICs4NjYsOCBAQAogCQlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjMxWFgpKQogCQkJdXNiLT5pbml0X2ZsYWdzIHw9IENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BOwogCQl1c2JjeF9nYWhiY2ZnLnUzMiA9IDA7Ci0JCXVzYmN4X2dhaGJjZmcucy5kbWFlbiA9ICEodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpOworCQl1c2JjeF9nYWhiY2ZnLnMuZG1hZW4gPSAhKHVzYi0+aW5pdF9mbGFncyAmCisJCQkJCSAgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpOwogCQlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCiAJCQkvKiBPbmx5IHVzZSBvbmUgY2hhbm5lbCB3aXRoIG5vbiBETUEgKi8KIAkJCXVzYi0+aWRsZV9oYXJkd2FyZV9jaGFubmVscyA9IDB4MTsKQEAgLTc4Myw3ICs4OTIsOCBAQAogCSAqLwogCXsKIAkJdW5pb24gY3ZteF91c2JjeF9ndXNiY2ZnIHVzYmN4X2d1c2JjZmc7Ci0JCXVzYmN4X2d1c2JjZmcudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HVVNCQ0ZHKHVzYi0+aW5kZXgpKTsKKwkJdXNiY3hfZ3VzYmNmZy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfR1VTQkNGRyh1c2ItPmluZGV4KSk7CiAJCXVzYmN4X2d1c2JjZmcucy50b3V0Y2FsID0gMDsKIAkJdXNiY3hfZ3VzYmNmZy5zLmRkcnNlbCA9IDA7CiAJCXVzYmN4X2d1c2JjZmcucy51c2J0cmR0aW0gPSAweDU7CkBAIC04MDEsNyArOTExLDggQEAKIAkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrIHVzYmN4X2dpbnRtc2s7CiAJCWludCBjaGFubmVsOwogCi0JCXVzYmN4X2dpbnRtc2sudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpKTsKKwkJdXNiY3hfZ2ludG1zay51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSk7CiAJCXVzYmN4X2dpbnRtc2sucy5vdGdpbnRtc2sgPSAxOwogCQl1c2JjeF9naW50bXNrLnMubW9kZW1pc21zayA9IDE7CiAJCXVzYmN4X2dpbnRtc2sucy5oY2hpbnRtc2sgPSAxOwpAQCAtODE3LDcgKzkyOCw4IEBACiAJCSAqIGxhdGVyLgogCQkgKi8KIAkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IDg7IGNoYW5uZWwrKykKLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLCB1c2ItPmluZGV4KSwgMCk7CisJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLCB1c2ItPmluZGV4KSwgMCk7CiAJfQogCiAJewpAQCAtODI3LDI2ICs5MzksMzAgQEAKIAkJICogMS4gUHJvZ3JhbSB0aGUgaG9zdC1wb3J0IGludGVycnVwdC1tYXNrIGZpZWxkIHRvIHVubWFzaywKIAkJICogICAgVVNCQ19HSU5UTVNLW1BSVElOVF0gPSAxCiAJCSAqLwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCi0JCQkJcHJ0aW50bXNrLCAxKTsKLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAotCQkJCWRpc2Nvbm5pbnRtc2ssIDEpOworCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgcHJ0aW50bXNrLCAxKTsKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIGRpc2Nvbm5pbnRtc2ssIDEpOwogCQkvKgogCQkgKiAyLiBQcm9ncmFtIHRoZSBVU0JDX0hDRkcgcmVnaXN0ZXIgdG8gc2VsZWN0IGZ1bGwtc3BlZWQgaG9zdAogCQkgKiAgICBvciBoaWdoLXNwZWVkIGhvc3QuCiAJCSAqLwogCQl7CiAJCQl1bmlvbiBjdm14X3VzYmN4X2hjZmcgdXNiY3hfaGNmZzsKLQkJCXVzYmN4X2hjZmcudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0ZHKHVzYi0+aW5kZXgpKTsKKwkJCXVzYmN4X2hjZmcudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJQ1ZNWF9VU0JDWF9IQ0ZHKHVzYi0+aW5kZXgpKTsKIAkJCXVzYmN4X2hjZmcucy5mc2xzc3VwcCA9IDA7CiAJCQl1c2JjeF9oY2ZnLnMuZnNsc3BjbGtzZWwgPSAwOwotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSwgdXNiY3hfaGNmZy51MzIpOworCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSwKKwkJCQkJdXNiY3hfaGNmZy51MzIpOwogCQl9CiAJCS8qCiAJCSAqIDMuIFByb2dyYW0gdGhlIHBvcnQgcG93ZXIgYml0IHRvIGRyaXZlIFZCVVMgb24gdGhlIFVTQiwKIAkJICogICAgVVNCQ19IUFJUW1BSVFBXUl0gPSAxCiAJCSAqLwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydHB3ciwgMSk7CisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRwd3IsIDEpOwogCiAJCS8qCiAJCSAqIFN0ZXBzIDQtMTUgZnJvbSB0aGUgbWFudWFsIGFyZSBkb25lIGxhdGVyIGluIHRoZSBwb3J0IGVuYWJsZQpAQCAtODc5LDcgKzk5NSw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBEaXNhYmxlIHRoZSBjbG9ja3MgYW5kIHB1dCB0aGVtIGluIHBvd2VyIG9uIHJlc2V0ICovCi0JdXNibl9jbGtfY3RsLnU2NCA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSk7CisJdXNibl9jbGtfY3RsLnU2NCA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsCisJCQlDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOwogCXVzYm5fY2xrX2N0bC5zLmVuYWJsZSA9IDE7CiAJdXNibl9jbGtfY3RsLnMucG9yID0gMTsKIAl1c2JuX2Nsa19jdGwucy5oY2xrX3JzdCA9IDE7CkBAIC05MDMsNyArMTAyMCw4IEBACiB7CiAJdW5pb24gY3ZteF91c2JjeF9naHdjZmczIHVzYmN4X2dod2NmZzM7CiAKLQl1c2ItPnVzYmN4X2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKKwl1c2ItPnVzYmN4X2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CiAKIAkvKgogCSAqIElmIHRoZSBwb3J0IGlzIGFscmVhZHkgZW5hYmxlZCB0aGUganVzdCByZXR1cm4uIFdlIGRvbid0IG5lZWQgdG8gZG8KQEAgLTkxMywxMiArMTAzMSwxMiBAQAogCQlyZXR1cm4gMDsKIAogCS8qIElmIHRoZXJlIGlzIG5vdGhpbmcgcGx1Z2dlZCBpbnRvIHRoZSBwb3J0IHRoZW4gZmFpbCBpbW1lZGlhdGVseSAqLwotCWlmICghdXNiLT51c2JjeF9ocHJ0LnMucHJ0Y29ubnN0cykgeworCWlmICghdXNiLT51c2JjeF9ocHJ0LnMucHJ0Y29ubnN0cykKIAkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQogCiAJLyogUHJvZ3JhbSB0aGUgcG9ydCByZXNldCBiaXQgdG8gc3RhcnQgdGhlIHJlc2V0IHByb2Nlc3MgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydHJzdCwgMSk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LAorCQkJcHJ0cnN0LCAxKTsKIAogCS8qCiAJICogV2FpdCBhdCBsZWFzdCA1MG1zIChoaWdoIHNwZWVkKSwgb3IgMTBtcyAoZnVsbCBzcGVlZCkgZm9yIHRoZSByZXNldApAQCAtOTI3LDI2ICsxMDQ1LDMwIEBACiAJbWRlbGF5KDUwKTsKIAogCS8qIFByb2dyYW0gdGhlIHBvcnQgcmVzZXQgYml0IHRvIDAsIFVTQkNfSFBSVFtQUlRSU1RdID0gMCAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0cnN0LCAwKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsCisJCQlwcnRyc3QsIDApOwogCiAJLyogV2FpdCBmb3IgdGhlIFVTQkNfSFBSVFtQUlRFTkFdLiAqLwotCWlmIChDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsCi0JCQkJICBwcnRlbmEsID09LCAxLCAxMDAwMDApKQorCWlmIChDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0ZW5hLCA9PSwgMSwgMTAwMDAwKSkKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAKIAkvKgogCSAqIFJlYWQgdGhlIHBvcnQgc3BlZWQgZmllbGQgdG8gZ2V0IHRoZSBlbnVtZXJhdGVkIHNwZWVkLAogCSAqIFVTQkNfSFBSVFtQUlRTUERdLgogCSAqLwotCXVzYi0+dXNiY3hfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwotCXVzYmN4X2dod2NmZzMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HSFdDRkczKHVzYi0+aW5kZXgpKTsKKwl1c2ItPnVzYmN4X2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CisJdXNiY3hfZ2h3Y2ZnMy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9HSFdDRkczKHVzYi0+aW5kZXgpKTsKIAogCS8qCiAJICogMTMuIFByb2dyYW0gdGhlIFVTQkNfR1JYRlNJWiByZWdpc3RlciB0byBzZWxlY3QgdGhlIHNpemUgb2YgdGhlCiAJICogICAgIHJlY2VpdmUgRklGTyAoMjUlKS4KIAkgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlhGU0laKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dyeGZzaXosCi0JCQlyeGZkZXAsIHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNCk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JYRlNJWih1c2ItPmluZGV4KSwKKwkJCXVuaW9uIGN2bXhfdXNiY3hfZ3J4ZnNpeiwgcnhmZGVwLAorCQkJdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0KTsKIAkvKgogCSAqIDE0LiBQcm9ncmFtIHRoZSBVU0JDX0dOUFRYRlNJWiByZWdpc3RlciB0byBzZWxlY3QgdGhlIHNpemUgYW5kIHRoZQogCSAqICAgICBzdGFydCBhZGRyZXNzIG9mIHRoZSBub24tIHBlcmlvZGljIHRyYW5zbWl0IEZJRk8gZm9yIG5vbnBlcmlvZGljCkBAIC05NTQsMTAgKzEwNzYsMTIgQEAKIAkgKi8KIAl7CiAJCXVuaW9uIGN2bXhfdXNiY3hfZ25wdHhmc2l6IHNpejsKLQkJc2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR05QVFhGU0laKHVzYi0+aW5kZXgpKTsKKwkJc2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCkpOwogCQlzaXoucy5ucHR4ZmRlcCA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gMjsKIAkJc2l6LnMubnB0eGZzdGFkZHIgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSwgc2l6LnUzMik7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSwKKwkJCQkgICAgICAgc2l6LnUzMik7CiAJfQogCS8qCiAJICogMTUuIFByb2dyYW0gdGhlIFVTQkNfSFBUWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIGFuZCBzdGFydApAQCAtOTY2LDE4ICsxMDkwLDI1IEBACiAJICovCiAJewogCQl1bmlvbiBjdm14X3VzYmN4X2hwdHhmc2l6IHNpejsKLQkJc2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBUWEZTSVoodXNiLT5pbmRleCkpOworCQlzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpKTsKIAkJc2l6LnMucHR4ZnNpemUgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7CiAJCXNpei5zLnB0eGZzdGFkZHIgPSAzICogdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0OwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFRYRlNJWih1c2ItPmluZGV4KSwgc2l6LnUzMik7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpLAorCQkJCSAgICAgICBzaXoudTMyKTsKIAl9CiAJLyogRmx1c2ggYWxsIEZJRk9zICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZudW0sIDB4MTApOwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmZmxzaCwgMSk7Ci0JQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLAorCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQl1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHR4Zm51bSwgMHgxMCk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCXVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmZmxzaCwgMSk7CisJQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCSAgICAgIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwKIAkJCSAgICAgIHR4ZmZsc2gsID09LCAwLCAxMDApOwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgcnhmZmxzaCwgMSk7Ci0JQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLAorCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQl1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHJ4ZmZsc2gsIDEpOworCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQkgICAgICB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsCiAJCQkgICAgICByeGZmbHNoLCA9PSwgMCwgMTAwKTsKIAogCXJldHVybiAwOwpAQCAtOTk3LDcgKzExMjgsOCBAQAogc3RhdGljIGludCBjdm14X3VzYl9kaXNhYmxlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQogewogCS8qIERpc2FibGUgdGhlIHBvcnQgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydGVuYSwgMSk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LAorCQkJcHJ0ZW5hLCAxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAxMywyMCArMTE0NSwyMyBAQAogICoKICAqIFJldHVybnM6IFBvcnQgc3RhdHVzIGluZm9ybWF0aW9uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfcG9ydF9zdGF0dXMgY3ZteF91c2JfZ2V0X3N0YXR1cyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfcG9ydF9zdGF0dXMgY3ZteF91c2JfZ2V0X3N0YXR1cygKKwkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCiB7CiAJdW5pb24gY3ZteF91c2JjeF9ocHJ0IHVzYmNfaHBydDsKIAlzdHJ1Y3QgY3ZteF91c2JfcG9ydF9zdGF0dXMgcmVzdWx0OwogCiAJbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKIAotCXVzYmNfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOworCXVzYmNfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIAlyZXN1bHQucG9ydF9lbmFibGVkID0gdXNiY19ocHJ0LnMucHJ0ZW5hOwogCXJlc3VsdC5wb3J0X292ZXJfY3VycmVudCA9IHVzYmNfaHBydC5zLnBydG92cmN1cnJhY3Q7CiAJcmVzdWx0LnBvcnRfcG93ZXJlZCA9IHVzYmNfaHBydC5zLnBydHB3cjsKIAlyZXN1bHQucG9ydF9zcGVlZCA9IHVzYmNfaHBydC5zLnBydHNwZDsKIAlyZXN1bHQuY29ubmVjdGVkID0gdXNiY19ocHJ0LnMucHJ0Y29ubnN0czsKLQlyZXN1bHQuY29ubmVjdF9jaGFuZ2UgPSAocmVzdWx0LmNvbm5lY3RlZCAhPSB1c2ItPnBvcnRfc3RhdHVzLmNvbm5lY3RlZCk7CisJcmVzdWx0LmNvbm5lY3RfY2hhbmdlID0KKwkJKHJlc3VsdC5jb25uZWN0ZWQgIT0gdXNiLT5wb3J0X3N0YXR1cy5jb25uZWN0ZWQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTExMjEsNyArMTI1Niw4IEBACiAJaWYgKHVubGlrZWx5KChkZXZpY2Vfc3BlZWQgIT0gQ1ZNWF9VU0JfU1BFRURfSElHSCkgJiYKIAkJKG11bHRpX2NvdW50ICE9IDApKSkKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KChodWJfZGV2aWNlX2FkZHIgPCAwKSB8fCAoaHViX2RldmljZV9hZGRyID4gTUFYX1VTQl9BRERSRVNTKSkpCisJaWYgKHVubGlrZWx5KChodWJfZGV2aWNlX2FkZHIgPCAwKSB8fAorCQkoaHViX2RldmljZV9hZGRyID4gTUFYX1VTQl9BRERSRVNTKSkpCiAJCXJldHVybiBOVUxMOwogCWlmICh1bmxpa2VseSgoaHViX3BvcnQgPCAwKSB8fCAoaHViX3BvcnQgPiBNQVhfVVNCX0hVQl9QT1JUKSkpCiAJCXJldHVybiBOVUxMOwpAQCAtMTE4Niw3ICsxMzIyLDggQEAKIAl1aW50NjRfdCBhZGRyZXNzOwogCXVpbnQzMl90ICpwdHI7CiAKLQlyeF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HUlhTVFNQSCh1c2ItPmluZGV4KSk7CisJcnhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0dSWFNUU1BIKHVzYi0+aW5kZXgpKTsKIAkvKiBPbmx5IHJlYWQgZGF0YSBpZiBJTiBkYXRhIGlzIHRoZXJlICovCiAJaWYgKHJ4X3N0YXR1cy5zLnBrdHN0cyAhPSAyKQogCQlyZXR1cm47CkBAIC0xMjM2LDcgKzEzNzMsOCBAQAogCXdoaWxlIChhdmFpbGFibGUgJiYgKGZpZm8tPmhlYWQgIT0gZmlmby0+dGFpbCkpIHsKIAkJaW50IGkgPSBmaWZvLT50YWlsOwogCQljb25zdCB1aW50MzJfdCAqcHRyID0gY3ZteF9waHlzX3RvX3B0cihmaWZvLT5lbnRyeVtpXS5hZGRyZXNzKTsKLQkJdWludDY0X3QgY3NyX2FkZHJlc3MgPSBVU0JfRklGT19BRERSRVNTKGZpZm8tPmVudHJ5W2ldLmNoYW5uZWwsIHVzYi0+aW5kZXgpIF4gNDsKKwkJdWludDY0X3QgY3NyX2FkZHJlc3MgPSBVU0JfRklGT19BRERSRVNTKGZpZm8tPmVudHJ5W2ldLmNoYW5uZWwsCisJCQkJCQkJdXNiLT5pbmRleCkgXiA0OwogCQlpbnQgd29yZHMgPSBhdmFpbGFibGU7CiAKIAkJLyogTGltaXQgdGhlIGFtb3VudCBvZiBkYXRhIHRvIHdhaHQgdGhlIFNXIGZpZm8gaGFzICovCkBAIC0xMjYwLDcgKzEzOTgsOCBAQAogCQkJY3ZteF93cml0ZTY0X3VpbnQzMihjc3JfYWRkcmVzcywgKnB0cisrKTsKIAkJCWN2bXhfd3JpdGU2NF91aW50MzIoY3NyX2FkZHJlc3MsICpwdHIrKyk7CiAJCQljdm14X3dyaXRlNjRfdWludDMyKGNzcl9hZGRyZXNzLCAqcHRyKyspOwotCQkJY3ZteF9yZWFkNjRfdWludDY0KENWTVhfVVNCTlhfRE1BMF9JTkJfQ0hOMCh1c2ItPmluZGV4KSk7CisJCQljdm14X3JlYWQ2NF91aW50NjQoCisJCQkJCUNWTVhfVVNCTlhfRE1BMF9JTkJfQ0hOMCh1c2ItPmluZGV4KSk7CiAJCQl3b3JkcyAtPSAzOwogCQl9CiAJCWN2bXhfd3JpdGU2NF91aW50MzIoY3NyX2FkZHJlc3MsICpwdHIrKyk7CkBAIC0xMjg0LDIwICsxNDIzLDMyIEBACiB7CiAJaWYgKHVzYi0+cGVyaW9kaWMuaGVhZCAhPSB1c2ItPnBlcmlvZGljLnRhaWwpIHsKIAkJdW5pb24gY3ZteF91c2JjeF9ocHR4c3RzIHR4X3N0YXR1czsKLQkJdHhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBUWFNUUyh1c2ItPmluZGV4KSk7Ci0JCWlmIChfX2N2bXhfdXNiX2ZpbGxfdHhfaHcodXNiLCAmdXNiLT5wZXJpb2RpYywgdHhfc3RhdHVzLnMucHR4ZnNwY2F2YWlsKSkKLQkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgcHR4ZmVtcG1zaywgMSk7CisJCXR4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSFBUWFNUUyh1c2ItPmluZGV4KSk7CisJCWlmIChfX2N2bXhfdXNiX2ZpbGxfdHhfaHcodXNiLCAmdXNiLT5wZXJpb2RpYywKKwkJCQkJICB0eF9zdGF0dXMucy5wdHhmc3BjYXZhaWwpKQorCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAorCQkJCQlwdHhmZW1wbXNrLCAxKTsKIAkJZWxzZQotCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBwdHhmZW1wbXNrLCAwKTsKKwkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKKwkJCQkJcHR4ZmVtcG1zaywgMCk7CiAJfQogCiAJaWYgKHVzYi0+bm9ucGVyaW9kaWMuaGVhZCAhPSB1c2ItPm5vbnBlcmlvZGljLnRhaWwpIHsKIAkJdW5pb24gY3ZteF91c2JjeF9nbnB0eHN0cyB0eF9zdGF0dXM7Ci0JCXR4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dOUFRYU1RTKHVzYi0+aW5kZXgpKTsKLQkJaWYgKF9fY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPm5vbnBlcmlvZGljLCB0eF9zdGF0dXMucy5ucHR4ZnNwY2F2YWlsKSkKLQkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgbnB0eGZlbXBtc2ssIDEpOworCQl0eF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0dOUFRYU1RTKHVzYi0+aW5kZXgpKTsKKwkJaWYgKF9fY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPm5vbnBlcmlvZGljLAorCQkJCQkgIHR4X3N0YXR1cy5zLm5wdHhmc3BjYXZhaWwpKQorCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAorCQkJCQlucHR4ZmVtcG1zaywgMSk7CiAJCWVsc2UKLQkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgbnB0eGZlbXBtc2ssIDApOworCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAorCQkJCQlucHR4ZmVtcG1zaywgMCk7CiAJfQogCiAJcmV0dXJuOwpAQCAtMTMxOCwxMiArMTQ2OSwxNCBAQAogCXN0cnVjdCBjdm14X3VzYl90eF9maWZvICpmaWZvOwogCiAJLyogV2Ugb25seSBuZWVkIHRvIGZpbGwgZGF0YSBvbiBvdXRib3VuZCBjaGFubmVscyAqLwotCWhjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCWhjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAlpZiAoaGNjaGFyLnMuZXBkaXIgIT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkKIAkJcmV0dXJuOwogCiAJLyogT1VUIFNwbGl0cyBvbmx5IGhhdmUgZGF0YSBvbiB0aGUgc3RhcnQgYW5kIG5vdCB0aGUgY29tcGxldGUgKi8KLQl1c2JjX2hjc3BsdC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGNzcGx0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCWlmICh1c2JjX2hjc3BsdC5zLnNwbHRlbmEgJiYgdXNiY19oY3NwbHQucy5jb21wc3BsdCkKIAkJcmV0dXJuOwogCkBAIC0xMzMxLDcgKzE0ODQsOCBAQAogCSAqIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIHdlIG5lZWQgdG8gZmlsbCBhbmQgY29udmVydCBpdCBpbnRvIDMyYml0CiAJICogd29yZHMuCiAJICovCi0JdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAlpZiAoIXVzYmNfaGN0c2l6LnMueGZlcnNpemUpCiAJCXJldHVybjsKIApAQCAtMTM3MSwxMSArMTUyNSwxMyBAQAogCQkJCSBub2RlKTsKIAl1bmlvbiBjdm14X3VzYl9jb250cm9sX2hlYWRlciAqaGVhZGVyID0KIAkJY3ZteF9waHlzX3RvX3B0cih0cmFuc2FjdGlvbi0+Y29udHJvbF9oZWFkZXIpOwotCWludCBieXRlc190b190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT5idWZmZXJfbGVuZ3RoIC0gdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKKwlpbnQgYnl0ZXNfdG9fdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+YnVmZmVyX2xlbmd0aCAtCisJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAJaW50IHBhY2tldHNfdG9fdHJhbnNmZXI7CiAJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4IHVzYmNfaGN0c2l6OwogCi0JdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCXN3aXRjaCAodHJhbnNhY3Rpb24tPnN0YWdlKSB7CiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTDoKQEAgLTE0MjMsMTIgKzE1NzksMTQgQEAKIAkJCQkoKGhlYWRlci0+cy5yZXF1ZXN0X3R5cGUgJiAweDgwKSA/CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9JTiA6CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQpKTsKLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOgogCQl1c2JjX2hjdHNpei5zLnBpZCA9IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwogCQlieXRlc190b190cmFuc2ZlciA9IDA7Ci0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQkoKGhlYWRlci0+cy5yZXF1ZXN0X3R5cGUgJiAweDgwKSA/CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQgOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4pKTsKQEAgLTE0MzYsMTEgKzE1OTQsMTMgQEAKIAljYXNlIENWTVhfVVNCX1NUQUdFX1NUQVRVU19TUExJVF9DT01QTEVURToKIAkJdXNiY19oY3RzaXoucy5waWQgPSBfX2N2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKIAkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAorCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCiAJCQkJKChoZWFkZXItPnMucmVxdWVzdF90eXBlICYgMHg4MCkgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUIDoKIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOKSk7Ci0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGNzcGx0eCwgY29tcHNwbHQsIDEpOworCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNzcGx0eCwgY29tcHNwbHQsIDEpOwogCQlicmVhazsKIAl9CiAKQEAgLTE0NTgsMTAgKzE2MTgsMTIgQEAKIAkgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWNrZXRzIHRvIHRyYW5zZmVyLiBJZiB0aGUgbGVuZ3RoIGlzIHplcm8KIAkgKiB3ZSBzdGlsbCBuZWVkIHRvIHRyYW5zZmVyIG9uZSBwYWNrZXQKIAkgKi8KLQlwYWNrZXRzX3RvX3RyYW5zZmVyID0gKGJ5dGVzX3RvX3RyYW5zZmVyICsgcGlwZS0+bWF4X3BhY2tldCAtIDEpIC8gcGlwZS0+bWF4X3BhY2tldDsKKwlwYWNrZXRzX3RvX3RyYW5zZmVyID0gKGJ5dGVzX3RvX3RyYW5zZmVyICsgcGlwZS0+bWF4X3BhY2tldCAtIDEpIC8KKwkJcGlwZS0+bWF4X3BhY2tldDsKIAlpZiAocGFja2V0c190b190cmFuc2ZlciA9PSAwKQogCQlwYWNrZXRzX3RvX3RyYW5zZmVyID0gMTsKLQllbHNlIGlmICgocGFja2V0c190b190cmFuc2ZlciA+IDEpICYmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkpIHsKKwllbHNlIGlmICgocGFja2V0c190b190cmFuc2ZlciA+IDEpICYmCisJCQkodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpKSB7CiAJCS8qCiAJCSAqIExpbWl0IHRvIG9uZSBwYWNrZXQgd2hlbiBub3QgdXNpbmcgRE1BLiBDaGFubmVscyBtdXN0IGJlCiAJCSAqIHJlc3RhcnRlZCBiZXR3ZWVuIGV2ZXJ5IHBhY2tldCBmb3IgSU4gdHJhbnNhY3Rpb25zLCBzbyB0aGVyZQpAQCAtMTQ4MSw3ICsxNjQzLDggQEAKIAl1c2JjX2hjdHNpei5zLnhmZXJzaXplID0gYnl0ZXNfdG9fdHJhbnNmZXI7CiAJdXNiY19oY3RzaXoucy5wa3RjbnQgPSBwYWNrZXRzX3RvX3RyYW5zZmVyOwogCi0JX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY3RzaXoudTMyKTsKKwlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJICAgICAgIHVzYmNfaGN0c2l6LnUzMik7CiAJcmV0dXJuOwogfQogCkBAIC0xNTE5LDggKzE2ODIsMTEgQEAKIAkJdW5pb24gY3ZteF91c2JjeF9oYWludG1zayB1c2JjX2hhaW50bXNrOwogCiAJCS8qIENsZWFyIGFsbCBjaGFubmVsIHN0YXR1cyBiaXRzICovCi0JCXVzYmNfaGNpbnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGNpbnQudTMyKTsKKwkJdXNiY19oY2ludC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJICAgICAgIENWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgICB1c2JjX2hjaW50LnUzMik7CiAKIAkJdXNiY19oY2ludG1zay51MzIgPSAwOwogCQl1c2JjX2hjaW50bXNrLnMuY2hobHRkbXNrID0gMTsKQEAgLTE1NjcsMTQgKzE3MzMsMTcgQEAKIAkJdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4IHVzYmNfaGNzcGx0ID0gey51MzIgPSAwfTsKIAkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4IHVzYmNfaGN0c2l6ID0gey51MzIgPSAwfTsKIAkJaW50IHBhY2tldHNfdG9fdHJhbnNmZXI7Ci0JCWludCBieXRlc190b190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT5idWZmZXJfbGVuZ3RoIC0gdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKKwkJaW50IGJ5dGVzX3RvX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPmJ1ZmZlcl9sZW5ndGggLQorCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKIAogCQkvKgogCQkgKiBJU09DSFJPTk9VUyB0cmFuc2FjdGlvbnMgc3RvcmUgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyIHNpemUKIAkJICogaW4gdGhlIHBhY2tldCBzdHJ1Y3R1cmUsIG5vdCB0aGUgZ2xvYmFsIGJ1ZmZlcl9sZW5ndGgKIAkJICovCiAJCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUykKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPmlzb19wYWNrZXRzWzBdLmxlbmd0aCAtIHRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CisJCQlieXRlc190b190cmFuc2ZlciA9CisJCQkJdHJhbnNhY3Rpb24tPmlzb19wYWNrZXRzWzBdLmxlbmd0aCAtCisJCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKIAogCQkvKgogCQkgKiBXZSBuZWVkIHRvIGRvIHNwbGl0IHRyYW5zYWN0aW9ucyB3aGVuIHdlIGFyZSB0YWxraW5nIHRvIG5vbgpAQCAtMTU4OSwxNiArMTc1OCwxOSBAQAogCQkJICovCiAJCQlpZiAoKHRyYW5zYWN0aW9uLT5zdGFnZSYxKSA9PSAwKSB7CiAJCQkJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0JVTEspCi0JCQkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0gKHVzYi0+ZnJhbWVfbnVtYmVyICsgMSkgJiAweDdmOworCQkJCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9CisJCQkJCQkodXNiLT5mcmFtZV9udW1iZXIgKyAxKSAmIDB4N2Y7CiAJCQkJZWxzZQotCQkJCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9ICh1c2ItPmZyYW1lX251bWJlciArIDIpICYgMHg3ZjsKKwkJCQkJcGlwZS0+c3BsaXRfc2NfZnJhbWUgPQorCQkJCQkJKHVzYi0+ZnJhbWVfbnVtYmVyICsgMikgJiAweDdmOwogCQkJfSBlbHNlCiAJCQkJcGlwZS0+c3BsaXRfc2NfZnJhbWUgPSAtMTsKIAogCQkJdXNiY19oY3NwbHQucy5zcGx0ZW5hID0gMTsKIAkJCXVzYmNfaGNzcGx0LnMuaHViYWRkciA9IHBpcGUtPmh1Yl9kZXZpY2VfYWRkcjsKIAkJCXVzYmNfaGNzcGx0LnMucHJ0YWRkciA9IHBpcGUtPmh1Yl9wb3J0OwotCQkJdXNiY19oY3NwbHQucy5jb21wc3BsdCA9ICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0gQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEUpOworCQkJdXNiY19oY3NwbHQucy5jb21wc3BsdCA9ICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0KKwkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURSk7CiAKIAkJCS8qCiAJCQkgKiBTUExJVCB0cmFuc2FjdGlvbnMgY2FuIG9ubHkgZXZlciB0cmFuc21pdCBvbmUgZGF0YQpAQCAtMTYxNCw4ICsxNzg2LDEwIEBACiAJCQkgKiBiZWdpbi9taWRkbGUvZW5kIG9mIHRoZSBkYXRhIG9yIGFsbAogCQkJICovCiAJCQlpZiAoIXVzYmNfaGNzcGx0LnMuY29tcHNwbHQgJiYKLQkJCQkocGlwZS0+dHJhbnNmZXJfZGlyID09IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpICYmCi0JCQkJKHBpcGUtPnRyYW5zZmVyX3R5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMpKSB7CisJCQkJKHBpcGUtPnRyYW5zZmVyX2RpciA9PQorCQkJCSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSAmJgorCQkJCShwaXBlLT50cmFuc2Zlcl90eXBlID09CisJCQkJIENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTKSkgewogCQkJCS8qCiAJCQkJICogQ2xlYXIgdGhlIHNwbGl0IGNvbXBsZXRlIGZyYW1lIG51bWJlciBhcwogCQkJCSAqIHRoZXJlIGlzbid0IGdvaW5nIHRvIGJlIGEgc3BsaXQgY29tcGxldGUKQEAgLTE2NjcsNyArMTg0MSw4IEBACiAJCQkgKiBSb3VuZCBNQVhfVFJBTlNGRVJfQllURVMgdG8gYSBtdWx0aXBsZSBvZiBvdXQgcGFja2V0CiAJCQkgKiBzaXplCiAJCQkgKi8KLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gTUFYX1RSQU5TRkVSX0JZVEVTIC8gcGlwZS0+bWF4X3BhY2tldDsKKwkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gTUFYX1RSQU5TRkVSX0JZVEVTIC8KKwkJCQlwaXBlLT5tYXhfcGFja2V0OwogCQkJYnl0ZXNfdG9fdHJhbnNmZXIgKj0gcGlwZS0+bWF4X3BhY2tldDsKIAkJfQogCkBAIC0xNjc1LDEwICsxODUwLDE0IEBACiAJCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdG8gdHJhbnNmZXIuIElmIHRoZSBsZW5ndGggaXMKIAkJICogemVybyB3ZSBzdGlsbCBuZWVkIHRvIHRyYW5zZmVyIG9uZSBwYWNrZXQKIAkJICovCi0JCXBhY2tldHNfdG9fdHJhbnNmZXIgPSAoYnl0ZXNfdG9fdHJhbnNmZXIgKyBwaXBlLT5tYXhfcGFja2V0IC0gMSkgLyBwaXBlLT5tYXhfcGFja2V0OworCQlwYWNrZXRzX3RvX3RyYW5zZmVyID0KKwkJCShieXRlc190b190cmFuc2ZlciArIHBpcGUtPm1heF9wYWNrZXQgLSAxKSAvCisJCQlwaXBlLT5tYXhfcGFja2V0OwogCQlpZiAocGFja2V0c190b190cmFuc2ZlciA9PSAwKQogCQkJcGFja2V0c190b190cmFuc2ZlciA9IDE7Ci0JCWVsc2UgaWYgKChwYWNrZXRzX3RvX3RyYW5zZmVyID4gMSkgJiYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKSkgeworCQllbHNlIGlmICgocGFja2V0c190b190cmFuc2ZlciA+IDEpICYmCisJCQkJKHVzYi0+aW5pdF9mbGFncyAmCisJCQkJIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKSkgewogCQkJLyoKIAkJCSAqIExpbWl0IHRvIG9uZSBwYWNrZXQgd2hlbiBub3QgdXNpbmcgRE1BLiBDaGFubmVscyBtdXN0CiAJCQkgKiBiZSByZXN0YXJ0ZWQgYmV0d2VlbiBldmVyeSBwYWNrZXQgZm9yIElOCkBAIC0xNjg2LDE0ICsxODY1LDE2IEBACiAJCQkgKiBwYWNrZXRzIGluIGEgcm93CiAJCQkgKi8KIAkJCXBhY2tldHNfdG9fdHJhbnNmZXIgPSAxOwotCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBwYWNrZXRzX3RvX3RyYW5zZmVyICogcGlwZS0+bWF4X3BhY2tldDsKKwkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gcGFja2V0c190b190cmFuc2ZlciAqCisJCQkJcGlwZS0+bWF4X3BhY2tldDsKIAkJfSBlbHNlIGlmIChwYWNrZXRzX3RvX3RyYW5zZmVyID4gTUFYX1RSQU5TRkVSX1BBQ0tFVFMpIHsKIAkJCS8qCiAJCQkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIHBhY2tldCBhbmQgZGF0YSB0cmFuc2ZlcnJlZCB0bwogCQkJICogd2hhdCB0aGUgaGFyZHdhcmUgY2FuIGhhbmRsZQogCQkJICovCiAJCQlwYWNrZXRzX3RvX3RyYW5zZmVyID0gTUFYX1RSQU5TRkVSX1BBQ0tFVFM7Ci0JCQlieXRlc190b190cmFuc2ZlciA9IHBhY2tldHNfdG9fdHJhbnNmZXIgKiBwaXBlLT5tYXhfcGFja2V0OworCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBwYWNrZXRzX3RvX3RyYW5zZmVyICoKKwkJCQlwaXBlLT5tYXhfcGFja2V0OwogCQl9CiAKIAkJdXNiY19oY3RzaXoucy54ZmVyc2l6ZSA9IGJ5dGVzX3RvX3RyYW5zZmVyOwpAQCAtMTcwNyw4ICsxODg4LDExIEBACiAJCWlmIChwaXBlLT5mbGFncyAmIF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkcpCiAJCQl1c2JjX2hjdHNpei5zLmRvcG5nID0gMTsKIAotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjc3BsdC51MzIpOwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjdHNpei51MzIpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkgICAgICAgQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgICB1c2JjX2hjc3BsdC51MzIpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsCisJCQkJCXVzYi0+aW5kZXgpLCB1c2JjX2hjdHNpei51MzIpOwogCX0KIAogCS8qIFNldHVwIHRoZSBIb3N0IENoYW5uZWwgQ2hhcmFjdGVyaXN0aWNzIFJlZ2lzdGVyICovCkBAIC0xNzM5LDExICsxOTIzLDE0IEBACiAJCS8qIFNldCB0aGUgcmVzdCBvZiB0aGUgZW5kcG9pbnQgc3BlY2lmaWMgc2V0dGluZ3MgKi8KIAkJdXNiY19oY2NoYXIucy5kZXZhZGRyID0gcGlwZS0+ZGV2aWNlX2FkZHI7CiAJCXVzYmNfaGNjaGFyLnMuZXB0eXBlID0gdHJhbnNhY3Rpb24tPnR5cGU7Ci0JCXVzYmNfaGNjaGFyLnMubHNwZGRldiA9IChwaXBlLT5kZXZpY2Vfc3BlZWQgPT0gQ1ZNWF9VU0JfU1BFRURfTE9XKTsKKwkJdXNiY19oY2NoYXIucy5sc3BkZGV2ID0KKwkJCShwaXBlLT5kZXZpY2Vfc3BlZWQgPT0gQ1ZNWF9VU0JfU1BFRURfTE9XKTsKIAkJdXNiY19oY2NoYXIucy5lcGRpciA9IHBpcGUtPnRyYW5zZmVyX2RpcjsKIAkJdXNiY19oY2NoYXIucy5lcG51bSA9IHBpcGUtPmVuZHBvaW50X251bTsKIAkJdXNiY19oY2NoYXIucy5tcHMgPSBwaXBlLT5tYXhfcGFja2V0OwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjY2hhci51MzIpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkgICAgICAgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgICB1c2JjX2hjY2hhci51MzIpOwogCX0KIAogCS8qIERvIHRyYW5zYWN0aW9uIHR5cGUgc3BlY2lmaWMgZml4dXBzIGFzIG5lZWRlZCAqLwpAQCAtMTc2MiwyMiArMTk0OSwzMyBAQAogCQkJICovCiAJCQlpZiAocGlwZS0+dHJhbnNmZXJfZGlyID09IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpIHsKIAkJCQlpZiAocGlwZS0+bXVsdGlfY291bnQgPCAyKSAvKiBOZWVkIERBVEEwICovCi0JCQkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCwgcGlkLCAwKTsKKwkJCQkJVVNCX1NFVF9GSUVMRDMyKAorCQkJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsCisJCQkJCQkJCSAgIHVzYi0+aW5kZXgpLAorCQkJCQkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4LAorCQkJCQkJcGlkLCAwKTsKIAkJCQllbHNlIC8qIE5lZWQgTURBVEEgKi8KLQkJCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4LCBwaWQsIDMpOworCQkJCQlVU0JfU0VUX0ZJRUxEMzIoCisJCQkJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwKKwkJCQkJCQkJICAgdXNiLT5pbmRleCksCisJCQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjdHNpengsCisJCQkJCQlwaWQsIDMpOwogCQkJfQogCQl9CiAJCWJyZWFrOwogCX0KIAl7Ci0JCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCB1c2JjX2hjdHNpeiA9IHsudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKX07CisJCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCB1c2JjX2hjdHNpeiA9IHsudTMyID0KKwkJCV9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKX07CiAJCXRyYW5zYWN0aW9uLT54ZmVyc2l6ZSA9IHVzYmNfaGN0c2l6LnMueGZlcnNpemU7CiAJCXRyYW5zYWN0aW9uLT5wa3RjbnQgPSB1c2JjX2hjdHNpei5zLnBrdGNudDsKIAl9CiAJLyogUmVtZWJlciB3aGVuIHdlIHN0YXJ0IGEgc3BsaXQgdHJhbnNhY3Rpb24gKi8KIAlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCiAJCXVzYi0+YWN0aXZlX3NwbGl0ID0gdHJhbnNhY3Rpb247Ci0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBjaGVuYSwgMSk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgY2hlbmEsIDEpOwogCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkKIAkJX19jdm14X3VzYl9maWxsX3R4X2ZpZm8odXNiLCBjaGFubmVsKTsKIAlyZXR1cm47CkBAIC0xNzkzLDE2ICsxOTkxLDIyIEBACiAgKgogICogUmV0dXJuczogUGlwZSBvciBOVUxMIGlmIG5vbmUgYXJlIHJlYWR5CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHVpbnQ2NF90IGN1cnJlbnRfZnJhbWUpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3BpcGUgKl9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKAorCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJdWludDY0X3QgY3VycmVudF9mcmFtZSkKIHsKIAlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGlwZSwgbGlzdCwgbm9kZSkgewogCQlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnQgPQotCQkJbGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLCB0eXBlb2YoKnQpLCBub2RlKTsKKwkJCWxpc3RfZmlyc3RfZW50cnkoJnBpcGUtPnRyYW5zYWN0aW9ucywgdHlwZW9mKCp0KSwKKwkJCQkJIG5vZGUpOwogCQlpZiAoIShwaXBlLT5mbGFncyAmIF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQpICYmIHQgJiYKIAkJCShwaXBlLT5uZXh0X3R4X2ZyYW1lIDw9IGN1cnJlbnRfZnJhbWUpICYmCi0JCQkoKHBpcGUtPnNwbGl0X3NjX2ZyYW1lID09IC0xKSB8fCAoKCgoaW50KWN1cnJlbnRfZnJhbWUgLSAoaW50KXBpcGUtPnNwbGl0X3NjX2ZyYW1lKSAmIDB4N2YpIDwgMHg0MCkpICYmCisJCQkoKHBpcGUtPnNwbGl0X3NjX2ZyYW1lID09IC0xKSB8fAorCQkJICgoKChpbnQpY3VycmVudF9mcmFtZSAtIChpbnQpcGlwZS0+c3BsaXRfc2NfZnJhbWUpCisJCQkgICAmIDB4N2YpIDwgMHg0MCkpICYmCiAJCQkoIXVzYi0+YWN0aXZlX3NwbGl0IHx8ICh1c2ItPmFjdGl2ZV9zcGxpdCA9PSB0KSkpIHsKIAkJCUNWTVhfUFJFRkVUQ0gocGlwZSwgMTI4KTsKIAkJCUNWTVhfUFJFRkVUQ0godCwgMCk7CkBAIC0xODUyLDE0ICsyMDU2LDI2IEBACiAJCQkgKiB3YXkgd2UgYXJlIHN1cmUgdGhhdCB0aGUgcGVyaW9kaWMgZGF0YSBpcyBzZW50IGluIHRoZQogCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFtZQogCQkJICovCi0JCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLCB1c2ItPmFjdGl2ZV9waXBlcyArIENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTLCB1c2ItPmZyYW1lX251bWJlcik7CisJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAorCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCisJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTLAorCQkJCQl1c2ItPmZyYW1lX251bWJlcik7CiAJCQlpZiAobGlrZWx5KCFwaXBlKSkKLQkJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLCB1c2ItPmFjdGl2ZV9waXBlcyArIENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCwgdXNiLT5mcmFtZV9udW1iZXIpOworCQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCisJCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCisJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQsCisJCQkJCQl1c2ItPmZyYW1lX251bWJlcik7CiAJCX0KIAkJaWYgKGxpa2VseSghcGlwZSkpIHsKLQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsIHVzYi0+YWN0aXZlX3BpcGVzICsgQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTCwgdXNiLT5mcmFtZV9udW1iZXIpOworCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCQkJdXNiLT5hY3RpdmVfcGlwZXMgKworCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MLAorCQkJCQl1c2ItPmZyYW1lX251bWJlcik7CiAJCQlpZiAobGlrZWx5KCFwaXBlKSkKLQkJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLCB1c2ItPmFjdGl2ZV9waXBlcyArIENWTVhfVVNCX1RSQU5TRkVSX0JVTEssIHVzYi0+ZnJhbWVfbnVtYmVyKTsKKwkJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAorCQkJCQkJdXNiLT5hY3RpdmVfcGlwZXMgKworCQkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSywKKwkJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyKTsKIAkJfQogCQlpZiAoIXBpcGUpCiAJCQlicmVhazsKQEAgLTE4NzMsNyArMjA4OSw4IEBACiAJICogZnV0dXJlIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBzY2hlZHVsZWQKIAkgKi8KIAluZWVkX3NvZiA9IDA7Ci0JZm9yICh0dHlwZSA9IENWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0w7IHR0eXBlIDw9IENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVDsgdHR5cGUrKykgeworCWZvciAodHR5cGUgPSBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MOworCQkJdHR5cGUgPD0gQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUOyB0dHlwZSsrKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocGlwZSwgJnVzYi0+YWN0aXZlX3BpcGVzW3R0eXBlXSwgbm9kZSkgewogCQkJaWYgKHBpcGUtPm5leHRfdHhfZnJhbWUgPiB1c2ItPmZyYW1lX251bWJlcikgewogCQkJCW5lZWRfc29mID0gMTsKQEAgLTE4ODEsNyArMjA5OCw4IEBACiAJCQl9CiAJCX0KIAl9Ci0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBzb2Ztc2ssIG5lZWRfc29mKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBzb2Ztc2ssIG5lZWRfc29mKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE5MzIsMTAgKzIxNTAsMTMgQEAKIAkJLyogUmVjYWxjdWxhdGUgdGhlIHRyYW5zZmVyIHNpemUgYnkgYWRkaW5nIHVwIGVhY2ggcGFja2V0ICovCiAJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJCWlmIChpc29fcGFja2V0W2ldLnN0YXR1cyA9PSBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKSB7CisJCQlpZiAoaXNvX3BhY2tldFtpXS5zdGF0dXMgPT0KKwkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUykgewogCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gMDsKLQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPSBpc29fcGFja2V0W2ldLmxlbmd0aDsKLQkJCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9CisJCQkJCWlzb19wYWNrZXRbaV0ubGVuZ3RoOworCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCArPQorCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CiAJCQl9IGVsc2UgewogCQkJCWRldl9kYmcoZGV2LCAiSVNPQ0hST05PVVMgcGFja2V0PSVkIG9mICVkIHN0YXR1cz0lZCBwaXBlPSVwIHRyYW5zYWN0aW9uPSVwIHNpemU9JWRcbiIsCiAJCQkJCWksIHVyYi0+bnVtYmVyX29mX3BhY2tldHMsCkBAIC0xOTk3LDEwICsyMjE4LDExIEBACiAgKiBAY29tcGxldGVfY29kZToKICAqCQkgQ29tcGxldGlvbiBjb2RlCiAgKi8KLXN0YXRpYyB2b2lkIF9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZShzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCi0JCQkJCXN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCi0JCQkJCWVudW0gY3ZteF91c2JfY29tcGxldGUgY29tcGxldGVfY29kZSkKK3N0YXRpYyB2b2lkIF9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKKwkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCWVudW0gY3ZteF91c2JfY29tcGxldGUgY29tcGxldGVfY29kZSkKIHsKIAkvKiBJZiB0aGlzIHdhcyBhIHNwbGl0IHRoZW4gY2xlYXIgb3VyIHNwbGl0IGluIHByb2dyZXNzIG1hcmtlciAqLwogCWlmICh1c2ItPmFjdGl2ZV9zcGxpdCA9PSB0cmFuc2FjdGlvbikKQEAgLTIwMTksNyArMjI0MSw4IEBACiAJCSAqIElmIHRoZXJlIGFyZSBtb3JlIElTT3MgcGVuZGluZyBhbmQgd2Ugc3VjY2VlZGVkLCBzY2hlZHVsZSB0aGUKIAkJICogbmV4dCBvbmUKIAkJICovCi0JCWlmICgodHJhbnNhY3Rpb24tPmlzb19udW1iZXJfcGFja2V0cyA+IDEpICYmIChjb21wbGV0ZV9jb2RlID09IENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpKSB7CisJCWlmICgodHJhbnNhY3Rpb24tPmlzb19udW1iZXJfcGFja2V0cyA+IDEpICYmCisJCQkoY29tcGxldGVfY29kZSA9PSBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKSkgewogCQkJLyogTm8gYnl0ZXMgdHJhbnNmZXJyZWQgZm9yIHRoaXMgcGFja2V0IGFzIG9mIHlldCAqLwogCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlcyA9IDA7CiAJCQkvKiBPbmUgbGVzcyBJU08gd2FpdGluZyB0byB0cmFuc2ZlciAqLwpAQCAtMjA2NywxNiArMjI5MCwxNyBAQAogICoKICAqIFJldHVybnM6IFRyYW5zYWN0aW9uIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCQkJCSAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCi0JCQkJCQkJCSAgZW51bSBjdm14X3VzYl90cmFuc2ZlciB0eXBlLAotCQkJCQkJCQkgIHVpbnQ2NF90IGJ1ZmZlciwKLQkJCQkJCQkJICBpbnQgYnVmZmVyX2xlbmd0aCwKLQkJCQkJCQkJICB1aW50NjRfdCBjb250cm9sX2hlYWRlciwKLQkJCQkJCQkJICBpbnQgaXNvX3N0YXJ0X2ZyYW1lLAotCQkJCQkJCQkgIGludCBpc29fbnVtYmVyX3BhY2tldHMsCi0JCQkJCQkJCSAgc3RydWN0IGN2bXhfdXNiX2lzb19wYWNrZXQgKmlzb19wYWNrZXRzLAotCQkJCQkJCQkgIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKl9fY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKAorCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAorCQkJCWVudW0gY3ZteF91c2JfdHJhbnNmZXIgdHlwZSwKKwkJCQl1aW50NjRfdCBidWZmZXIsCisJCQkJaW50IGJ1ZmZlcl9sZW5ndGgsCisJCQkJdWludDY0X3QgY29udHJvbF9oZWFkZXIsCisJCQkJaW50IGlzb19zdGFydF9mcmFtZSwKKwkJCQlpbnQgaXNvX251bWJlcl9wYWNrZXRzLAorCQkJCXN0cnVjdCBjdm14X3VzYl9pc29fcGFja2V0ICppc29fcGFja2V0cywKKwkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKIApAQCAtMjEyOCw5ICsyMzUyLDEwIEBACiAgKgogICogUmV0dXJuczogQSBzdWJtaXR0ZWQgdHJhbnNhY3Rpb24gb3IgTlVMTCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfYnVsayhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJCQkgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCi0JCQkJCQkJIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9idWxrKAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKIAlyZXR1cm4gX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24odXNiLCBwaXBlLCBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLLAogCQkJCQkgICAgIHVyYi0+dHJhbnNmZXJfZG1hLApAQCAtMjE1Miw5ICsyMzc3LDEwIEBACiAgKgogICogUmV0dXJuczogQSBzdWJtaXR0ZWQgdHJhbnNhY3Rpb24gb3IgTlVMTCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfaW50ZXJydXB0KHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkJCSAgICAgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCQkJCSAgICAgIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9pbnRlcnJ1cHQoCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAorCQkJCQkJc3RydWN0IHVyYiAqdXJiKQogewogCXJldHVybiBfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCiAJCQkJCSAgICAgQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBULApAQCAtMjE3Nyw5ICsyNDAzLDEwIEBACiAgKgogICogUmV0dXJuczogQSBzdWJtaXR0ZWQgdHJhbnNhY3Rpb24gb3IgTlVMTCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfY29udHJvbChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJCQkgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCi0JCQkJCQkJICAgIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9jb250cm9sKAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKIAlpbnQgYnVmZmVyX2xlbmd0aCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKIAl1aW50NjRfdCBjb250cm9sX2hlYWRlciA9IHVyYi0+c2V0dXBfZG1hOwpAQCAtMjIwOSw5ICsyNDM2LDEwIEBACiAgKgogICogUmV0dXJuczogQSBzdWJtaXR0ZWQgdHJhbnNhY3Rpb24gb3IgTlVMTCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfaXNvY2hyb25vdXMoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfaXNvY2hyb25vdXMoCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAorCQkJCQkJc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBjdm14X3VzYl9pc29fcGFja2V0ICpwYWNrZXRzOwogCkBAIC0yMjU3LDE3ICsyNDg1LDIyIEBACiAKIAkJQ1ZNWF9TWU5DVzsKIAotCQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgocGlwZS0+Y2hhbm5lbCwgdXNiLT5pbmRleCkpOworCQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChwaXBlLT5jaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJCS8qCiAJCSAqIElmIHRoZSBjaGFubmVsIGlzbid0IGVuYWJsZWQgdGhlbiB0aGUgdHJhbnNhY3Rpb24gYWxyZWFkeQogCQkgKiBjb21wbGV0ZWQuCiAJCSAqLwogCQlpZiAodXNiY19oY2NoYXIucy5jaGVuYSkgewogCQkJdXNiY19oY2NoYXIucy5jaGRpcyA9IDE7Ci0JCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKHBpcGUtPmNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjY2hhci51MzIpOworCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChwaXBlLT5jaGFubmVsLAorCQkJCQkJdXNiLT5pbmRleCksCisJCQkJCXVzYmNfaGNjaGFyLnUzMik7CiAJCX0KIAl9Ci0JX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX0NBTkNFTCk7CisJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX0NBTkNFTCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMzEsNyArMjU2NCw4IEBACiAJaW50IGZyYW1lX251bWJlcjsKIAl1bmlvbiBjdm14X3VzYmN4X2hmbnVtIHVzYmNfaGZudW07CiAKLQl1c2JjX2hmbnVtLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpOworCXVzYmNfaGZudW0udTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpOwogCWZyYW1lX251bWJlciA9IHVzYmNfaGZudW0ucy5mcm51bTsKIAogCXJldHVybiBmcmFtZV9udW1iZXI7CkBAIC0yMzU5LDEwICsyNTkzLDEyIEBACiAJaW50IGJ1ZmZlcl9zcGFjZV9sZWZ0OwogCiAJLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyBiaXRzIGZvciB0aGUgY2hhbm5lbCAqLwotCXVzYmNfaGNpbnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGNpbnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkgewotCQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAKIAkJaWYgKHVzYmNfaGNjaGFyLnMuY2hlbmEgJiYgdXNiY19oY2NoYXIucy5jaGRpcykgewogCQkJLyoKQEAgLTIzNzAsNyArMjYwNiwxMCBAQAogCQkJICogaW50ZXJydXB0IElOIHRyYW5zZmVycyB0byBnZXQgc3R1Y2sgdW50aWwgd2UgZG8gYQogCQkJICogd3JpdGUgb2YgSENDSEFSWCB3aXRob3V0IGNoYW5naW5nIHRoaW5ncwogCQkJICovCi0JCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjY2hhci51MzIpOworCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLAorCQkJCQkJCSAgIHVzYi0+aW5kZXgpLAorCQkJCQl1c2JjX2hjY2hhci51MzIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMjM4NCw5ICsyNjIzLDE1IEBACiAJCQkJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBleGNlcHQgQ0hITFREICovCiAJCQkJaGNpbnRtc2sudTMyID0gMDsKIAkJCQloY2ludG1zay5zLmNoaGx0ZG1zayA9IDE7Ci0JCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENJTlRNU0tYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCBoY2ludG1zay51MzIpOworCQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCQkJQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwKKwkJCQkJCQl1c2ItPmluZGV4KSwKKwkJCQkJCWhjaW50bXNrLnUzMik7CiAJCQkJdXNiY19oY2NoYXIucy5jaGRpcyA9IDE7Ci0JCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY2NoYXIudTMyKTsKKwkJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLAorCQkJCQkJCXVzYi0+aW5kZXgpLAorCQkJCQkJdXNiY19oY2NoYXIudTMyKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLnhmZXJjb21wbCkgewogCQkJCS8qCkBAIC0yMzk0LDcgKzI2MzksOCBAQAogCQkJCSAqIENoYW5uZWwgaGFsdCBpc24ndCBuZWVkZWQuCiAJCQkJICovCiAJCQl9IGVsc2UgewotCQkJCWN2bXhfZHByaW50ZigiVVNCJWQ6IENoYW5uZWwgJWQgaW50ZXJydXB0IHdpdGhvdXQgaGFsdFxuIiwgdXNiLT5pbmRleCwgY2hhbm5lbCk7CisJCQkJY3ZteF9kcHJpbnRmKCJVU0IlZDogQ2hhbm5lbCAlZCBpbnRlcnJ1cHQgd2l0aG91dCBoYWx0XG4iLAorCQkJCQkJdXNiLT5pbmRleCwgY2hhbm5lbCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTI0MTcsNyArMjY2Myw4IEBACiAJQ1ZNWF9QUkVGRVRDSChwaXBlLCAxMjgpOwogCWlmICghcGlwZSkKIAkJcmV0dXJuIDA7Ci0JdHJhbnNhY3Rpb24gPSBsaXN0X2ZpcnN0X2VudHJ5KCZwaXBlLT50cmFuc2FjdGlvbnMsIHR5cGVvZigqdHJhbnNhY3Rpb24pLAorCXRyYW5zYWN0aW9uID0gbGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLAorCQkJCSAgICAgICB0eXBlb2YoKnRyYW5zYWN0aW9uKSwKIAkJCQkgICAgICAgbm9kZSk7CiAJQ1ZNWF9QUkVGRVRDSCh0cmFuc2FjdGlvbiwgMCk7CiAKQEAgLTI0MzIsOCArMjY3OSwxMCBAQAogCSAqIFJlYWQgdGhlIGNoYW5uZWwgY29uZmlnIGluZm8gc28gd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG11Y2ggZGF0YQogCSAqIHRyYW5zZmVyZWQKIAkgKi8KLQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwotCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAKIAkvKgogCSAqIENhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkIGlzIGRlcGVuZGVudApAQCAtMjQ0Nyw3ICsyNjk2LDggQEAKIAkJICogdGhlIGN1cnJlbnQgdmFsdWUgb2YgeGZlcnNpemUgZnJvbSBpdHMgc3RhcnRpbmcgdmFsdWUgYW5kIHdlCiAJCSAqIGtub3cgaG93IG1hbnkgYnl0ZXMgd2VyZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKIAkJICovCi0JCWJ5dGVzX3RoaXNfdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+eGZlcnNpemUgLSB1c2JjX2hjdHNpei5zLnhmZXJzaXplOworCQlieXRlc190aGlzX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPnhmZXJzaXplIC0KKwkJCXVzYmNfaGN0c2l6LnMueGZlcnNpemU7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogT1VUIHRyYW5zYWN0aW9uIGRvbid0IGRlY3JlbWVudCB4ZmVyc2l6ZS4gSW5zdGVhZCBwa3RjbnQgaXMKQEAgLTI0NjUsNyArMjcxNSw4IEBACiAJfQogCS8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgd2VyZSBpbiB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHRyYW5zZmVyICovCiAJaWYgKHBhY2tldHNfcHJvY2Vzc2VkKQotCQlieXRlc19pbl9sYXN0X3BhY2tldCA9IGJ5dGVzX3RoaXNfdHJhbnNmZXIgLSAocGFja2V0c19wcm9jZXNzZWQtMSkgKiB1c2JjX2hjY2hhci5zLm1wczsKKwkJYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPSBieXRlc190aGlzX3RyYW5zZmVyIC0KKwkJCShwYWNrZXRzX3Byb2Nlc3NlZCAtIDEpICogdXNiY19oY2NoYXIucy5tcHM7CiAJZWxzZQogCQlieXRlc19pbl9sYXN0X3BhY2tldCA9IGJ5dGVzX3RoaXNfdHJhbnNmZXI7CiAKQEAgLTI0ODUsOSArMjczNiwxMSBAQAogCSAqLwogCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXMgKz0gYnl0ZXNfdGhpc190cmFuc2ZlcjsKIAlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMpCi0JCWJ1ZmZlcl9zcGFjZV9sZWZ0ID0gdHJhbnNhY3Rpb24tPmlzb19wYWNrZXRzWzBdLmxlbmd0aCAtIHRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CisJCWJ1ZmZlcl9zcGFjZV9sZWZ0ID0gdHJhbnNhY3Rpb24tPmlzb19wYWNrZXRzWzBdLmxlbmd0aCAtCisJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCWVsc2UKLQkJYnVmZmVyX3NwYWNlX2xlZnQgPSB0cmFuc2FjdGlvbi0+YnVmZmVyX2xlbmd0aCAtIHRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CisJCWJ1ZmZlcl9zcGFjZV9sZWZ0ID0gdHJhbnNhY3Rpb24tPmJ1ZmZlcl9sZW5ndGggLQorCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKIAogCS8qCiAJICogV2UgbmVlZCB0byByZW1lbWJlciB0aGUgUElEIHRvZ2dsZSBzdGF0ZSBmb3IgdGhlIG5leHQgdHJhbnNhY3Rpb24uCkBAIC0yNTEzLDcgKzI3NjYsOCBAQAogCQkgKiB0aGUgYWN0dWFsIGJ5dGVzIHRyYW5zZmVycmVkCiAJCSAqLwogCQlwaXBlLT5waWRfdG9nZ2xlID0gMDsKLQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NUQUxMKTsKKwkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9TVEFMTCk7CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMueGFjdGVycikgewogCQkvKgogCQkgKiBXZSBrbm93IGF0IGxlYXN0IG9uZSBwYWNrZXQgd29ya2VkIGlmIHdlIGdldCBhIEFDSyBvciBOQUsuCkBAIC0yNTI4LDcgKzI3ODIsOCBAQAogCQkJICogc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIHRyYW5zZmVyLiBGb3IgZXhhbXBsZSwgUElECiAJCQkgKiB0b2dnbGUgZXJyb3JzIGNhdXNlIHRoZXNlCiAJCQkgKi8KLQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9YQUNURVJSKTsKKwkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX1hBQ1RFUlIpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIElmIHRoaXMgd2FzIGEgc3BsaXQgdGhlbiBjbGVhciBvdXIgc3BsaXQgaW4gcHJvZ3Jlc3MKQEAgLTI1NDQsMTIgKzI3OTksMTUgQEAKIAkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0gLTE7CiAJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwogCQkJaWYgKHBpcGUtPm5leHRfdHhfZnJhbWUgPCB1c2ItPmZyYW1lX251bWJlcikKLQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lID0gdXNiLT5mcmFtZV9udW1iZXIgKyBwaXBlLT5pbnRlcnZhbCAtCi0JCQkJCQkgICAgICAodXNiLT5mcmFtZV9udW1iZXIgLSBwaXBlLT5uZXh0X3R4X2ZyYW1lKSAlIHBpcGUtPmludGVydmFsOworCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgPQorCQkJCQl1c2ItPmZyYW1lX251bWJlciArIHBpcGUtPmludGVydmFsIC0KKwkJCQkJKHVzYi0+ZnJhbWVfbnVtYmVyIC0KKwkJCQkJIHBpcGUtPm5leHRfdHhfZnJhbWUpICUgcGlwZS0+aW50ZXJ2YWw7CiAJCX0KIAl9IGVsc2UgaWYgKHVzYmNfaGNpbnQucy5iYmxlcnIpIHsKIAkJLyogQmFiYmxlIEVycm9yIChCYmxFcnIpICovCi0JCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9CQUJCTEVFUlIpOworCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX0JBQkJMRUVSUik7CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMuZGF0YXRnbGVycikgewogCQkvKiBXZSdsbCByZXRyeSB0aGUgZXhhY3Qgc2FtZSB0cmFuc2FjdGlvbiBhZ2FpbiAqLwogCQl0cmFuc2FjdGlvbi0+cmV0cmllcysrOwpAQCAtMjU2Niw4ICsyODI0LDExIEBACiAJCQkgKiBJZiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gZ28gdGhlbiB3ZSBuZWVkIHRvIHRyeQogCQkJICogYWdhaW4uIE90aGVyd2lzZSB0aGlzIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlCiAJCQkgKi8KLQkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwgKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwgcGlwZS0+bWF4X3BhY2tldCkpCi0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fAorCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKQorCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCisJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFNwbGl0IHRyYW5zYWN0aW9ucyByZXRyeSB0aGUgc3BsaXQgY29tcGxldGUgNCB0aW1lcwpAQCAtMjYwNSwxMiArMjg2NiwxNCBAQAogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTDoKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEU6CiAJCQkJLyogVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZSAqLwotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CisJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQkJdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX0VSUk9SKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU0VUVVA6CiAJCQkJcGlwZS0+cGlkX3RvZ2dsZSA9IDE7CiAJCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9TRVRVUF9TUExJVF9DT01QTEVURTsKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX1NFVFVQX1NQTElUX0NPTVBMRVRFOwogCQkJCWVsc2UgewogCQkJCQl1bmlvbiBjdm14X3VzYl9jb250cm9sX2hlYWRlciAqaGVhZGVyID0KIAkJCQkJCWN2bXhfcGh5c190b19wdHIodHJhbnNhY3Rpb24tPmNvbnRyb2xfaGVhZGVyKTsKQEAgLTI2MzIsNyArMjg5NSw4IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX0RBVEE6CiAJCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7Ci0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX0RBVEFfU1BMSVRfQ09NUExFVEU7CisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9EQVRBX1NQTElUX0NPTVBMRVRFOwogCQkJCQkvKgogCQkJCQkgKiBGb3Igc2V0dXAgT1VUIGRhdGEgdGhhdCBhcmUgc3BsaXRzLAogCQkJCQkgKiB0aGUgaGFyZHdhcmUgZG9lc24ndCBhcHBlYXIgdG8gY291bnQKQEAgLTI2NDEsMzEgKzI5MDUsNDUgQEAKIAkJCQkJICovCiAJCQkJCWlmICghdXNiY19oY2NoYXIucy5lcGRpcikgewogCQkJCQkJaWYgKGJ1ZmZlcl9zcGFjZV9sZWZ0IDwgcGlwZS0+bWF4X3BhY2tldCkKLQkJCQkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzICs9IGJ1ZmZlcl9zcGFjZV9sZWZ0OworCQkJCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXMgKz0KKwkJCQkJCQkJYnVmZmVyX3NwYWNlX2xlZnQ7CiAJCQkJCQllbHNlCi0JCQkJCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlcyArPSBwaXBlLT5tYXhfcGFja2V0OworCQkJCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXMgKz0KKwkJCQkJCQkJcGlwZS0+bWF4X3BhY2tldDsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8IChieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKSB7CisJCQkJfSBlbHNlIGlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwKKwkJCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA8CisJCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpIHsKIAkJCQkJcGlwZS0+cGlkX3RvZ2dsZSA9IDE7Ci0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX1NUQVRVUzsKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX1NUQVRVUzsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX0RBVEFfU1BMSVRfQ09NUExFVEU6Ci0JCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fCAoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkgeworCQkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwKKwkJCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA8CisJCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpIHsKIAkJCQkJcGlwZS0+cGlkX3RvZ2dsZSA9IDE7Ci0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX1NUQVRVUzsKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX1NUQVRVUzsKIAkJCQl9IGVsc2UgewotCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9EQVRBOworCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfREFUQTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX1NUQVRVUzoKIAkJCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCi0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX1NUQVRVU19TUExJVF9DT01QTEVURTsKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX1NUQVRVU19TUExJVF9DT01QTEVURTsKIAkJCQllbHNlCi0JCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX1NUQVRVU19TUExJVF9DT01QTEVURToKLQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI2NzgsMjcgKzI5NTYsNDkgQEAKIAkJCSAqIGRhdGEgaXMgbmVlZGVkCiAJCQkgKi8KIAkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgewotCQkJCWlmICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0gQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0wpCi0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFOworCQkJCWlmICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MKQorCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEU7CiAJCQkJZWxzZSB7Ci0JCQkJCWlmIChidWZmZXJfc3BhY2VfbGVmdCAmJiAoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPT0gcGlwZS0+bWF4X3BhY2tldCkpCi0JCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTDsKKwkJCQkJaWYgKGJ1ZmZlcl9zcGFjZV9sZWZ0ICYmCisJCQkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPT0KKwkJCQkJCSBwaXBlLT5tYXhfcGFja2V0KSkKKwkJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0w7CiAJCQkJCWVsc2UgewotCQkJCQkJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCkKLQkJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQkJCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PQorCQkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCkKKwkJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9CisJCQkJCQkJCXBpcGUtPmludGVydmFsOworCQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKKwkJCQkJCQkJdXNiLAorCQkJCQkJCQlwaXBlLAorCQkJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWlmICgocGlwZS0+ZGV2aWNlX3NwZWVkID09IENWTVhfVVNCX1NQRUVEX0hJR0gpICYmCi0JCQkJICAgIChwaXBlLT50cmFuc2Zlcl90eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0JVTEspICYmCi0JCQkJICAgIChwaXBlLT50cmFuc2Zlcl9kaXIgPT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKKwkJCQlpZiAoKHBpcGUtPmRldmljZV9zcGVlZCA9PQorCQkJCQlDVk1YX1VTQl9TUEVFRF9ISUdIKSAmJgorCQkJCSAgICAocGlwZS0+dHJhbnNmZXJfdHlwZSA9PQorCQkJCSAgICAgQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSykgJiYKKwkJCQkgICAgKHBpcGUtPnRyYW5zZmVyX2RpciA9PQorCQkJCSAgICAgQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKIAkJCQkgICAgKHVzYmNfaGNpbnQucy5uYWspKQotCQkJCQlwaXBlLT5mbGFncyB8PSBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOwotCQkJCWlmICghYnVmZmVyX3NwYWNlX2xlZnQgfHwgKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwgcGlwZS0+bWF4X3BhY2tldCkpIHsKLQkJCQkJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCkKLQkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQkJcGlwZS0+ZmxhZ3MgfD0KKwkJCQkJCV9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc7CisJCQkJaWYgKCFidWZmZXJfc3BhY2VfbGVmdCB8fAorCQkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPAorCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpIHsKKwkJCQkJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09CisJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQpCisJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9CisJCQkJCQkJcGlwZS0+aW50ZXJ2YWw7CisJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsCisJCQkJCQlwaXBlLAorCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKQEAgLTI3MTksMjggKzMwMTksNDUgQEAKIAkJCQkJICogY29tcGxldGUuIE90aGVyd2lzZSBzdGFydCBpdCBhZ2FpbiB0bwogCQkJCQkgKiBzZW5kIHRoZSBuZXh0IDE4OCBieXRlcwogCQkJCQkgKi8KLQkJCQkJaWYgKCFidWZmZXJfc3BhY2VfbGVmdCB8fCAoYnl0ZXNfdGhpc190cmFuc2ZlciA8IDE4OCkpIHsKKwkJCQkJaWYgKCFidWZmZXJfc3BhY2VfbGVmdCB8fAorCQkJCQkJKGJ5dGVzX3RoaXNfdHJhbnNmZXIgPCAxODgpKSB7CiAJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAorCQkJCQkJCXVzYiwKKwkJCQkJCQlwaXBlLAorCQkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHRyYW5zYWN0aW9uLT5zdGFnZSA9PSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURSkgeworCQkJCQlpZiAodHJhbnNhY3Rpb24tPnN0YWdlID09CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURSkgewogCQkJCQkJLyoKIAkJCQkJCSAqIFdlIGFyZSBpbiB0aGUgaW5jb21pbmcgZGF0YQogCQkJCQkJICogcGhhc2UuIEtlZXAgZ2V0dGluZyBkYXRhCiAJCQkJCQkgKiB1bnRpbCB3ZSBydW4gb3V0IG9mIHNwYWNlIG9yCiAJCQkJCQkgKiBnZXQgYSBzbWFsbCBwYWNrZXQKIAkJCQkJCSAqLwotCQkJCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fCAoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkgewotCQkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fAorCQkJCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA8CisJCQkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKSB7CisJCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPQorCQkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKKwkJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCisJCQkJCQkJCXVzYiwKKwkJCQkJCQkJcGlwZSwKKwkJCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCQkJfQogCQkJCQl9IGVsc2UKLQkJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFOworCQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsCisJCQkJCQlwaXBlLAorCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CkBAIC0yNzYwLDggKzMwNzcsMTAgQEAKIAkJdHJhbnNhY3Rpb24tPnN0YWdlICY9IH4xOwogCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwogCQlpZiAocGlwZS0+bmV4dF90eF9mcmFtZSA8IHVzYi0+ZnJhbWVfbnVtYmVyKQotCQkJcGlwZS0+bmV4dF90eF9mcmFtZSA9IHVzYi0+ZnJhbWVfbnVtYmVyICsgcGlwZS0+aW50ZXJ2YWwgLQotCQkJCSh1c2ItPmZyYW1lX251bWJlciAtIHBpcGUtPm5leHRfdHhfZnJhbWUpICUgcGlwZS0+aW50ZXJ2YWw7CisJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lID0gdXNiLT5mcmFtZV9udW1iZXIgKworCQkJCXBpcGUtPmludGVydmFsIC0KKwkJCQkodXNiLT5mcmFtZV9udW1iZXIgLSBwaXBlLT5uZXh0X3R4X2ZyYW1lKSAlCisJCQkJcGlwZS0+aW50ZXJ2YWw7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGN2bXhfdXNiX3BvcnRfc3RhdHVzIHBvcnQ7CiAJCXBvcnQgPSBjdm14X3VzYl9nZXRfc3RhdHVzKHVzYik7CkBAIC0yNzczLDcgKzMwOTIsOCBAQAogCQkJICogV2UgZ2V0IGNoYW5uZWwgaGFsdGVkIGludGVycnVwdHMgd2l0aCBubyByZXN1bHQgYml0cwogCQkJICogc2V0cyB3aGVuIHRoZSBjYWJsZSBpcyB1bnBsdWdnZWQKIAkJCSAqLwotCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX0VSUk9SKTsKKwkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQlDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC0yODU2LDkgKzMxNzYsMTEgQEAKIAkJICovCiAJCW9jdGVvbl91c2JfcG9ydF9jYWxsYmFjayh1c2IpOwogCQkvKiBDbGVhciB0aGUgcG9ydCBjaGFuZ2UgYml0cyAqLwotCQl1c2JjX2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKKwkJdXNiY19ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIAkJdXNiY19ocHJ0LnMucHJ0ZW5hID0gMDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdXNiY19ocHJ0LnUzMik7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksCisJCQkJICAgICAgIHVzYmNfaHBydC51MzIpOwogCX0KIAlpZiAodXNiY19naW50c3RzLnMuaGNoaW50KSB7CiAJCS8qCkBAIC0zMDAyLDEzICszMzI0LDE1IEBACiAJCX0KIAkJcGlwZSA9IGN2bXhfdXNiX29wZW5fcGlwZSgmcHJpdi0+dXNiLCB1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAogCQkJCQkgIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSwgc3BlZWQsCi0JCQkJCSAgbGUxNl90b19jcHUoZXAtPmRlc2Mud01heFBhY2tldFNpemUpICYgMHg3ZmYsCisJCQkJCSAgbGUxNl90b19jcHUoZXAtPmRlc2Mud01heFBhY2tldFNpemUpCisJCQkJCSAgJiAweDdmZiwKIAkJCQkJICB0cmFuc2Zlcl90eXBlLAogCQkJCQkgIHVzYl9waXBlaW4odXJiLT5waXBlKSA/CiAJCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4gOgogCQkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCwKIAkJCQkJICB1cmItPmludGVydmFsLAotCQkJCQkgIChsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSkgPj4gMTEpICYgMHgzLAorCQkJCQkgIChsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSkKKwkJCQkJICAgPj4gMTEpICYgMHgzLAogCQkJCQkgIHNwbGl0X2RldmljZSwgc3BsaXRfcG9ydCk7CiAJCWlmICghcGlwZSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMzAyMyw3ICszMzQ3LDggQEAKIAlzd2l0Y2ggKHVzYl9waXBldHlwZSh1cmItPnBpcGUpKSB7CiAJY2FzZSBQSVBFX0lTT0NIUk9OT1VTOgogCQlkZXZfZGJnKGRldiwgIlN1Ym1pdCBpc29jaHJvbm91cyB0byAlZC4lZFxuIiwKLQkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CisJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKIAkJLyoKIAkJICogQWxsb2NhdGUgYSBzdHJ1Y3R1cmUgdG8gdXNlIGZvciBvdXIgcHJpdmF0ZSBsaXN0IG9mCiAJCSAqIGlzb2Nocm9ub3VzIHBhY2tldHMuCkBAIC0zMDM1LDkgKzMzNjAsMTIgQEAKIAkJCWludCBpOwogCQkJLyogRmlsbCB0aGUgbGlzdCB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIFVSQiAqLwogCQkJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewotCQkJCWlzb19wYWNrZXRbaV0ub2Zmc2V0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7Ci0JCQkJaXNvX3BhY2tldFtpXS5sZW5ndGggPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aDsKLQkJCQlpc29fcGFja2V0W2ldLnN0YXR1cyA9IENWTVhfVVNCX0NPTVBMRVRFX0VSUk9SOworCQkJCWlzb19wYWNrZXRbaV0ub2Zmc2V0ID0KKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7CisJCQkJaXNvX3BhY2tldFtpXS5sZW5ndGggPQorCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aDsKKwkJCQlpc29fcGFja2V0W2ldLnN0YXR1cyA9CisJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX0VSUk9SOwogCQkJfQogCQkJLyoKIAkJCSAqIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgbGlzdCBpbiB0aGUgVVJCIHNldHVwX3BhY2tldApAQCAtMzA1OSwxNyArMzM4NywyMCBAQAogCQlicmVhazsKIAljYXNlIFBJUEVfSU5URVJSVVBUOgogCQlkZXZfZGJnKGRldiwgIlN1Ym1pdCBpbnRlcnJ1cHQgdG8gJWQuJWRcbiIsCi0JCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOworCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKKwkJCXVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CiAJCXRyYW5zYWN0aW9uID0gY3ZteF91c2Jfc3VibWl0X2ludGVycnVwdCgmcHJpdi0+dXNiLCBwaXBlLCB1cmIpOwogCQlicmVhazsKIAljYXNlIFBJUEVfQ09OVFJPTDoKIAkJZGV2X2RiZyhkZXYsICJTdWJtaXQgY29udHJvbCB0byAlZC4lZFxuIiwKLQkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CisJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKIAkJdHJhbnNhY3Rpb24gPSBjdm14X3VzYl9zdWJtaXRfY29udHJvbCgmcHJpdi0+dXNiLCBwaXBlLCB1cmIpOwogCQlicmVhazsKIAljYXNlIFBJUEVfQlVMSzoKIAkJZGV2X2RiZyhkZXYsICJTdWJtaXQgYnVsayB0byAlZC4lZFxuIiwKLQkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CisJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKIAkJdHJhbnNhY3Rpb24gPSBjdm14X3VzYl9zdWJtaXRfYnVsaygmcHJpdi0+dXNiLCBwaXBlLCB1cmIpOwogCQlicmVhazsKIAl9CkBAIC0zMTAwLDcgKzM0MzEsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBvY3Rlb25fdXNiX3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKK3N0YXRpYyBpbnQgb2N0ZW9uX3VzYl91cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCSAgc3RydWN0IHVyYiAqdXJiLAorCQkJCSAgaW50IHN0YXR1cykKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2hjZCAqcHJpdiA9IGhjZF90b19vY3Rlb24oaGNkKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzEyMCw3ICszNDUzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgb2N0ZW9uX3VzYl9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApCitzdGF0aWMgdm9pZCBvY3Rlb25fdXNiX2VuZHBvaW50X2Rpc2FibGUoc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYuY29udHJvbGxlcjsKIApAQCAtMzIwMyw3ICszNTM3LDggQEAKIAkJCWRldl9kYmcoZGV2LCAiIENfQ09OTkVDVElPTlxuIik7CiAJCQkvKiBDbGVhcnMgZHJpdmVycyBpbnRlcm5hbCBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgZmxhZyAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9IGN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CisJCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPQorCQkJCWN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CkBAIC0zMjEyLDcgKzM1NDcsOCBAQAogCQkJICogQ2xlYXJzIHRoZSBkcml2ZXIncyBpbnRlcm5hbCBQb3J0IFJlc2V0IENoYW5nZSBmbGFnLgogCQkJICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0gY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKKwkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9CisJCQkJY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEU6CkBAIC0zMjIyLDcgKzM1NTgsOCBAQAogCQkJICogQ2hhbmdlIGZsYWcuCiAJCQkgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPSBjdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOworCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0KKwkJCQljdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CkBAIC0zMjM3LDcgKzM1NzQsOCBAQAogCQkJZGV2X2RiZyhkZXYsICIgQ19PVkVSX0NVUlJFTlRcbiIpOwogCQkJLyogQ2xlYXJzIHRoZSBkcml2ZXIncyBvdmVyY3VycmVudCBDaGFuZ2UgZmxhZyAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9IGN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CisJCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPQorCQkJCWN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTMzNjksNiArMzcwNyw4IEBACiAJLmdldF9mcmFtZV9udW1iZXIJPSBvY3Rlb25fdXNiX2dldF9mcmFtZV9udW1iZXIsCiAJLmh1Yl9zdGF0dXNfZGF0YQk9IG9jdGVvbl91c2JfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbAkJPSBvY3Rlb25fdXNiX2h1Yl9jb250cm9sLAorCS5tYXBfdXJiX2Zvcl9kbWEJPSBvY3Rlb25fbWFwX3VyYl9mb3JfZG1hLAorCS51bm1hcF91cmJfZm9yX2RtYQk9IG9jdGVvbl91bm1hcF91cmJfZm9yX2RtYSwKIH07CiAKIHN0YXRpYyBpbnQgb2N0ZW9uX3VzYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMzQxMSw3ICszNzUxLDggQEAKIAkJaW5pdGlhbGl6ZV9mbGFncyA9IENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfQ0xPQ0tfNDhNSFo7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiSWxsZWJhbCBVU0JOIFwicmVmY2xrLWZyZXF1ZW5jeVwiICV1XG4iLCBjbG9ja19yYXRlKTsKKwkJZGV2X2VycihkZXYsICJJbGxlYmFsIFVTQk4gXCJyZWZjbGstZnJlcXVlbmN5XCIgJXVcbiIsCisJCQkJY2xvY2tfcmF0ZSk7CiAJCXJldHVybiAtRU5YSU87CiAKIAl9CkBAIC0zNDc3LDcgKzM4MTgsOCBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCi0JdGFza2xldF9pbml0KCZwcml2LT5kZXF1ZXVlX3Rhc2tsZXQsIG9jdGVvbl91c2JfdXJiX2RlcXVldWVfd29yaywgKHVuc2lnbmVkIGxvbmcpcHJpdik7CisJdGFza2xldF9pbml0KCZwcml2LT5kZXF1ZXVlX3Rhc2tsZXQsIG9jdGVvbl91c2JfdXJiX2RlcXVldWVfd29yaywKKwkJICAgICAodW5zaWduZWQgbG9uZylwcml2KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+ZGVxdWV1ZV9saXN0KTsKIAogCXN0YXR1cyA9IGN2bXhfdXNiX2luaXRpYWxpemUoJnByaXYtPnVzYiwgdXNiX251bSwgaW5pdGlhbGl6ZV9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LWRlZmluZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtZGVmaW5lcy5oCmluZGV4IGJkYWVjOGQuLjJhOThhMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtZGVmaW5lcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtZGVmaW5lcy5oCkBAIC0zMywxMCArMzMsNiBAQAogICogICAgICBkcml2ZXIgd2lsbCB1c2UgdGhpcyBtZW1vcnkgaW5zdGVhZCBvZiBrZXJuZWwgbWVtb3J5IGZvciBwb29scy4gVGhpcwogICogICAgICBhbGxvd3MgMzJiaXQgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0aGUgYnVmZmVycywgYnV0IGFsc28KICAqICAgICAgcmVxdWlyZXMgYWxsIHJlY2VpdmVkIHBhY2tldHMgdG8gYmUgY29waWVkLgotICogIENPTkZJR19DQVZJVU1fT0NURU9OX05VTV9QQUNLRVRfQlVGRkVSUwotICogICAgICBUaGlzIGtlcm5lbCBjb25maWcgb3B0aW9uIGFsbG93cyB0aGUgdXNlciB0byBjb250cm9sIHRoZSBudW1iZXIgb2YKLSAqICAgICAgcGFja2V0IGFuZCB3b3JrIHF1ZXVlIGJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIuIElmIHRoaXMgaXMgemVybywKLSAqICAgICAgdGhlIGRyaXZlciB1c2VzIHRoZSBkZWZhdWx0IGZyb20gYmVsb3cuCiAgKiAgVVNFX1NLQlVGRlNfSU5fSFcKICAqICAgICAgVGVsbHMgdGhlIGRyaXZlciB0byBwb3B1bGF0ZSB0aGUgcGFja2V0IGJ1ZmZlcnMgd2l0aCBrZXJuZWwgc2tidWZmcy4KICAqICAgICAgVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byByZWNlaXZlIHBhY2tldHMgd2l0aG91dCBjb3B5aW5nIHRoZW0uIEl0IGFsc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKaW5kZXggODNiMTAzMC4uM2YwNjdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKQEAgLTEyNywyMyArMTI3LDIxIEBACiAJCWxpbmtfaW5mby5zLmxpbmtfdXAgPSBwcml2LT5sYXN0X2xpbmsgPyAxIDogMDsKIAkJbGlua19pbmZvLnMuZnVsbF9kdXBsZXggPSBwcml2LT5waHlkZXYtPmR1cGxleCA/IDEgOiAwOwogCQlsaW5rX2luZm8ucy5zcGVlZCA9IHByaXYtPnBoeWRldi0+c3BlZWQ7Ci0JCWN2bXhfaGVscGVyX2xpbmtfc2V0KCBwcml2LT5wb3J0LCBsaW5rX2luZm8pOworCQljdm14X2hlbHBlcl9saW5rX3NldChwcml2LT5wb3J0LCBsaW5rX2luZm8pOwogCQlpZiAocHJpdi0+bGFzdF9saW5rKSB7CiAJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCQlpZiAocHJpdi0+cXVldWUgIT0gLTEpCiAJCQkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogJXUgTWJwcyAlcyBkdXBsZXgsICIKLQkJCQkJCSAgICJwb3J0ICUyZCwgcXVldWUgJTJkXG4iLAotCQkJCQkJICAgZGV2LT5uYW1lLCBwcml2LT5waHlkZXYtPnNwZWVkLAotCQkJCQkJICAgcHJpdi0+cGh5ZGV2LT5kdXBsZXggPwotCQkJCQkJICAgIkZ1bGwiIDogIkhhbGYiLAotCQkJCQkJICAgcHJpdi0+cG9ydCwgcHJpdi0+cXVldWUpOworCQkJCQkicG9ydCAlMmQsIHF1ZXVlICUyZFxuIiwgZGV2LT5uYW1lLAorCQkJCQlwcml2LT5waHlkZXYtPnNwZWVkLAorCQkJCQlwcml2LT5waHlkZXYtPmR1cGxleCA/ICJGdWxsIiA6ICJIYWxmIiwKKwkJCQkJcHJpdi0+cG9ydCwgcHJpdi0+cXVldWUpOwogCQkJZWxzZQogCQkJCXByaW50a19yYXRlbGltaXRlZCgiJXM6ICV1IE1icHMgJXMgZHVwbGV4LCAiCi0JCQkJCQkgICAicG9ydCAlMmQsIFBPV1xuIiwKLQkJCQkJCSAgIGRldi0+bmFtZSwgcHJpdi0+cGh5ZGV2LT5zcGVlZCwKLQkJCQkJCSAgIHByaXYtPnBoeWRldi0+ZHVwbGV4ID8KLQkJCQkJCSAgICJGdWxsIiA6ICJIYWxmIiwKLQkJCQkJCSAgIHByaXYtPnBvcnQpOworCQkJCQkicG9ydCAlMmQsIFBPV1xuIiwgZGV2LT5uYW1lLAorCQkJCQlwcml2LT5waHlkZXYtPnNwZWVkLAorCQkJCQlwcml2LT5waHlkZXYtPmR1cGxleCA/ICJGdWxsIiA6ICJIYWxmIiwKKwkJCQkJcHJpdi0+cG9ydCk7CiAJCX0gZWxzZSB7CiAJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCQkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogTGluayBkb3duXG4iLCBkZXYtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWVtLmMKaW5kZXggMTk5MDU5ZC4uYmY2NjZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1lbS5jCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgogCisjaW5jbHVkZSAiZXRoZXJuZXQtbWVtLmgiCiAjaW5jbHVkZSAiZXRoZXJuZXQtZGVmaW5lcy5oIgogCiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWZwYS5oPgpAQCAtNzksMTAgKzgwLDEwIEBACiAJfSB3aGlsZSAobWVtb3J5KTsKIAogCWlmIChlbGVtZW50cyA8IDApCi0JCXByX3dhcm5pbmcoIkZyZWVpbmcgb2YgcG9vbCAldSBoYWQgdG9vIG1hbnkgc2tidWZmcyAoJWQpXG4iLAorCQlwcl93YXJuKCJGcmVlaW5nIG9mIHBvb2wgJXUgaGFkIHRvbyBtYW55IHNrYnVmZnMgKCVkKVxuIiwKIAkJICAgICBwb29sLCBlbGVtZW50cyk7CiAJZWxzZSBpZiAoZWxlbWVudHMgPiAwKQotCQlwcl93YXJuaW5nKCJGcmVlaW5nIG9mIHBvb2wgJXUgaXMgbWlzc2luZyAlZCBza2J1ZmZzXG4iLAorCQlwcl93YXJuKCJGcmVlaW5nIG9mIHBvb2wgJXUgaXMgbWlzc2luZyAlZCBza2J1ZmZzXG4iLAogCQkgICAgICAgcG9vbCwgZWxlbWVudHMpOwogfQogCkBAIC0xMTMsNyArMTE0LDcgQEAKIAkJICovCiAJCW1lbW9yeSA9IGttYWxsb2Moc2l6ZSArIDI1NiwgR0ZQX0FUT01JQyk7CiAJCWlmICh1bmxpa2VseShtZW1vcnkgPT0gTlVMTCkpIHsKLQkJCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhbGxvY2F0ZSAldSBieXRlcyBmb3IgRlBBIHBvb2wgJWRcbiIsCisJCQlwcl93YXJuKCJVbmFibGUgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgZm9yIEZQQSBwb29sICVkXG4iLAogCQkJCSAgIGVsZW1lbnRzICogc2l6ZSwgcG9vbCk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTQ2LDEwICsxNDcsMTAgQEAKIAl9IHdoaWxlIChmcGEpOwogCiAJaWYgKGVsZW1lbnRzIDwgMCkKLQkJcHJfd2FybmluZygiRnJlZWluZyBvZiBwb29sICV1IGhhZCB0b28gbWFueSBidWZmZXJzICglZClcbiIsCisJCXByX3dhcm4oIkZyZWVpbmcgb2YgcG9vbCAldSBoYWQgdG9vIG1hbnkgYnVmZmVycyAoJWQpXG4iLAogCQkJcG9vbCwgZWxlbWVudHMpOwogCWVsc2UgaWYgKGVsZW1lbnRzID4gMCkKLQkJcHJfd2FybmluZygiV2FybmluZzogRnJlZWluZyBvZiBwb29sICV1IGlzIG1pc3NpbmcgJWQgYnVmZmVyc1xuIiwKKwkJcHJfd2FybigiV2FybmluZzogRnJlZWluZyBvZiBwb29sICV1IGlzIG1pc3NpbmcgJWQgYnVmZmVyc1xuIiwKIAkJCXBvb2wsIGVsZW1lbnRzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCmluZGV4IGVhNTNhZjMuLjBlYzBkYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtbnBpLWRlZnMuaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtZ214eC1kZWZzLmg+CiAKLURFRklORV9TUElOTE9DSyhnbG9iYWxfcmVnaXN0ZXJfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdsb2JhbF9yZWdpc3Rlcl9sb2NrKTsKIAogc3RhdGljIGludCBudW1iZXJfcmdtaWlfcG9ydHM7CiAKQEAgLTcyLDcgKzcyLDggQEAKIAkJICogSWYgdGhlIDEwTWJwcyBwcmVhbWJsZSB3b3JrYXJvdW5kIGlzIHN1cHBvcnRlZCBhbmQgd2UncmUKIAkJICogYXQgMTBNYnBzIHdlIG1heSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCBjaGVja2luZy4KIAkJICovCi0JCWlmIChVU0VfMTBNQlBTX1BSRUFNQkxFX1dPUktBUk9VTkQgJiYgKGxpbmtfaW5mby5zLnNwZWVkID09IDEwKSkgeworCQlpZiAoVVNFXzEwTUJQU19QUkVBTUJMRV9XT1JLQVJPVU5EICYmCisJCQkJKGxpbmtfaW5mby5zLnNwZWVkID09IDEwKSkgewogCiAJCQkvKgogCQkJICogUmVhZCB0aGUgR01YWF9SWFhfSU5UX1JFR1tQQ1RFUlJdIGJpdCBhbmQKQEAgLTE2Niw5ICsxNjcsOCBAQAogCiAJaWYgKHVzZV9nbG9iYWxfcmVnaXN0ZXJfbG9jaykKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsX3JlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKLQllbHNlIHsKKwllbHNlCiAJCW11dGV4X3VubG9jaygmcHJpdi0+cGh5ZGV2LT5idXMtPm1kaW9fbG9jayk7Ci0JfQogCiAJaWYgKHByaXYtPnBoeWRldiA9PSBOVUxMKSB7CiAJCS8qIFRlbGwgY29yZS4gKi8KQEAgLTIzMiw4ICsyMzIsMTAgQEAKIAkJCQkJCSAgIChpbnRlcmZhY2UsIGluZGV4KV07CiAJCQkJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQkJCQlpZiAoZGV2ICYmICFhdG9taWNfcmVhZCgmY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nKSkKLQkJCQkJcXVldWVfd29yayhjdm1fb2N0X3BvbGxfcXVldWUsICZwcml2LT5wb3J0X3dvcmspOworCQkJCWlmIChkZXYgJiYKKwkJCQkhYXRvbWljX3JlYWQoJmN2bV9vY3RfcG9sbF9xdWV1ZV9zdG9wcGluZykpCisJCQkJCXF1ZXVlX3dvcmsoY3ZtX29jdF9wb2xsX3F1ZXVlLAorCQkJCQkJJnByaXYtPnBvcnRfd29yayk7CiAKIAkJCQlnbXhfcnhfaW50X3JlZy51NjQgPSAwOwogCQkJCWdteF9yeF9pbnRfcmVnLnMucGh5X2R1cHggPSAxOwpAQCAtMjc0LDggKzI3NiwxMCBAQAogCQkJCQkJICAgKGludGVyZmFjZSwgaW5kZXgpXTsKIAkJCQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCQkJCWlmIChkZXYgJiYgIWF0b21pY19yZWFkKCZjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmcpKQotCQkJCQlxdWV1ZV93b3JrKGN2bV9vY3RfcG9sbF9xdWV1ZSwgJnByaXYtPnBvcnRfd29yayk7CisJCQkJaWYgKGRldiAmJgorCQkJCSFhdG9taWNfcmVhZCgmY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nKSkKKwkJCQkJcXVldWVfd29yayhjdm1fb2N0X3BvbGxfcXVldWUsCisJCQkJCQkmcHJpdi0+cG9ydF93b3JrKTsKIAogCQkJCWdteF9yeF9pbnRfcmVnLnU2NCA9IDA7CiAJCQkJZ214X3J4X2ludF9yZWcucy5waHlfZHVweCA9IDE7CkBAIC0zMjcsNyArMzMxLDggQEAKIAogc3RhdGljIHZvaWQgY3ZtX29jdF9yZ21paV9pbW1lZGlhdGVfcG9sbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0LCBwb3J0X3dvcmspOworCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9jdGVvbl9ldGhlcm5ldCwgcG9ydF93b3JrKTsKIAljdm1fb2N0X3JnbWlpX3BvbGwoY3ZtX29jdF9kZXZpY2VbcHJpdi0+cG9ydF0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMKaW5kZXggNDc1NDFlMS4uOGNhNTVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYwpAQCAtOTUsNyArOTUsNyBAQAogCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1RJTVgoMSksIGNpdV90aW14LnU2NCk7CiB9CiAKLXZvaWQgY3ZtX29jdF9mcmVlX3R4X3NrYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGN2bV9vY3RfZnJlZV90eF9za2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50MzJfdCBza2JfdG9fZnJlZTsKIAlpbnQgcW9zLCBxdWV1ZXNfcGVyX3BvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKaW5kZXggMDg5ZGM0Yi4uZmY3MjE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYwpAQCAtNTUsMTcgKzU1LDExIEBACiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWdteHgtZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1zbWl4LWRlZnMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0NBVklVTV9PQ1RFT05fTlVNX1BBQ0tFVF9CVUZGRVJTKSBcCi0JJiYgQ09ORklHX0NBVklVTV9PQ1RFT05fTlVNX1BBQ0tFVF9CVUZGRVJTCi1pbnQgbnVtX3BhY2tldF9idWZmZXJzID0gQ09ORklHX0NBVklVTV9PQ1RFT05fTlVNX1BBQ0tFVF9CVUZGRVJTOwotI2Vsc2UKLWludCBudW1fcGFja2V0X2J1ZmZlcnMgPSAxMDI0OwotI2VuZGlmCitzdGF0aWMgaW50IG51bV9wYWNrZXRfYnVmZmVycyA9IDEwMjQ7CiBtb2R1bGVfcGFyYW0obnVtX3BhY2tldF9idWZmZXJzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhudW1fcGFja2V0X2J1ZmZlcnMsICJcbiIKIAkiXHROdW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgdG8gYWxsb2NhdGUgYW5kIHN0b3JlIGluIHRoZVxuIgotCSJcdEZQQS4gQnkgZGVmYXVsdCwgMTAyNCBwYWNrZXQgYnVmZmVycyBhcmUgdXNlZCB1bmxlc3NcbiIKLQkiXHRDT05GSUdfQ0FWSVVNX09DVEVPTl9OVU1fUEFDS0VUX0JVRkZFUlMgaXMgZGVmaW5lZC4iKTsKKwkiXHRGUEEuIEJ5IGRlZmF1bHQsIDEwMjQgcGFja2V0IGJ1ZmZlcnMgYXJlIHVzZWQuXG4iKTsKIAogaW50IHBvd19yZWNlaXZlX2dyb3VwID0gMTU7CiBtb2R1bGVfcGFyYW0ocG93X3JlY2VpdmVfZ3JvdXAsIGludCwgMDQ0NCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaAppbmRleCA5MzYwZTIyLi40Y2YzODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmgKQEAgLTU4LDcgKzU4LDcgQEAKIAkvKiBMYXN0IG5lZ290aWF0ZWQgbGluayBzdGF0ZSAqLwogCXVpbnQ2NF90IGxpbmtfaW5mbzsKIAkvKiBDYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGNoZWNrIGxpbmsgc3RhdHVzICovCi0Jdm9pZCAoKnBvbGwpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcG9sbCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJc3RydWN0IGRlbGF5ZWRfd29yawlwb3J0X3BlcmlvZGljX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0CXBvcnRfd29yazsJLyogbWF5IGJlIHVudXNlZC4gKi8KIAlzdHJ1Y3QgZGV2aWNlX25vZGUJKm9mX25vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5oIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uaAppbmRleCBlMjY2M2IxLi5hZWM5ODk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmgKQEAgLTM3LDcgKzM3LDcgQEAKIC8qIExvYWQgRGVsYXkgTG9ja2VkIExvb3AgKERMTCkgc2V0dGluZ3MgZm9yIGNsb2NrIGRlbGF5ICovCiAjZGVmaW5lIE1FTV9ETExfQ0xPQ0tfREVMQVkJKDE8PDApCiAvKiBNZW1vcnkgY29udHJvbGxlciBwb3dlciBkb3duIGZ1bmN0aW9uICovCi0jZGVmaW5lIE1FTV9QT1dFUl9ET1dOICAJKDE8PDgpCisjZGVmaW5lIE1FTV9QT1dFUl9ET1dOCQkoMTw8OCkKIC8qIE1lbW9yeSBjb250cm9sbGVyIHNvZnR3YXJlIHJlc2V0ICovCiAjZGVmaW5lIE1FTV9TT0ZUX1JFU0VUCQkoMTw8MCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemNkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pjZGV2LmMKaW5kZXggNWRlNTk4MS4uMTBjMGE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemNkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296Y2Rldi5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAlwZCA9IG96X3BkX2ZpbmQoYWRkcik7CiAJaWYgKHBkKSB7CiAJCXNwaW5fbG9ja19iaCgmZ19jZGV2LmxvY2spOwotCQltZW1jcHkoZ19jZGV2LmFjdGl2ZV9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShnX2NkZXYuYWN0aXZlX2FkZHIsIGFkZHIpOwogCQlvbGRfcGQgPSBnX2NkZXYuYWN0aXZlX3BkOwogCQlnX2NkZXYuYWN0aXZlX3BkID0gcGQ7CiAJCXNwaW5fdW5sb2NrX2JoKCZnX2NkZXYubG9jayk7CkBAIC0yODMsNyArMjgzLDcgQEAKIAkJCXU4IGFkZHJbRVRIX0FMRU5dOwogCQkJb3pfZGJnKE9OLCAiT1pfSU9DVExfR0VUX0FDVElWRV9QRFxuIik7CiAJCQlzcGluX2xvY2tfYmgoJmdfY2Rldi5sb2NrKTsKLQkJCW1lbWNweShhZGRyLCBnX2NkZXYuYWN0aXZlX2FkZHIsIEVUSF9BTEVOKTsKKwkJCWV0aGVyX2FkZHJfY29weShhZGRyLCBnX2NkZXYuYWN0aXZlX2FkZHIpOwogCQkJc3Bpbl91bmxvY2tfYmgoJmdfY2Rldi5sb2NrKTsKIAkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBhZGRyLCBFVEhfQUxFTikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMKaW5kZXggZWZhZjI2Zi4uYjNkNDAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemhjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYwpAQCAtMzU0LDcgKzM1NCw4IEBACiAgKiBkaXNhYmxlZC4KICAqIENvbnRleHQ6IHNvZnRpcnEgb3IgcHJvY2VzcwogICovCi1zdGF0aWMgc3RydWN0IG96X3VyYl9saW5rICpvel91bmNhbmNlbF91cmIoc3RydWN0IG96X2hjZCAqb3poY2QsIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBzdHJ1Y3Qgb3pfdXJiX2xpbmsgKm96X3VuY2FuY2VsX3VyYihzdHJ1Y3Qgb3pfaGNkICpvemhjZCwKKwkJc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBvel91cmJfbGluayAqdXJibDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplOwpAQCAtMTk4Niw4ICsxOTg3LDcgQEAKIAltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CiAJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKIAlkZXNjLT5iRGVzY0xlbmd0aCA9IDk7Ci0JZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IChfX2ZvcmNlIF9fdTE2KQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpOworCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSAoX19mb3JjZSBfX3UxNiljcHVfdG9fbGUxNigweDAwMDEpOwogCWRlc2MtPmJOYnJQb3J0cyA9IE9aX05CX1BPUlRTOwogfQogCkBAIC0yMTgxLDcgKzIxODEsNyBAQAogCQlicmVhazsKIAljYXNlIEdldEh1YlN0YXR1czoKIAkJb3pfZGJnKEhVQiwgIkdldEh1YlN0YXR1czogcmVxX3R5cGUgPSAweCV4XG4iLCByZXFfdHlwZSk7Ci0JCXB1dF91bmFsaWduZWQoX19jb25zdGFudF9jcHVfdG9fbGUzMigwKSwgKF9fbGUzMiAqKWJ1Zik7CisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIoMCksIChfX2xlMzIgKilidWYpOwogCQlicmVhazsKIAljYXNlIEdldFBvcnRTdGF0dXM6CiAJCWVyciA9IG96X2dldF9wb3J0X3N0YXR1cyhoY2QsIHdpbmRleCwgYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMKaW5kZXggNzQzNjk1MC4uMTBmMWIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlICJvemRiZy5oIgogI2luY2x1ZGUgIm96cHJvdG9jb2wuaCIKQEAgLTE3Myw3ICsxNzQsNyBAQAogCQlwZC0+bGFzdF9yeF9wa3RfbnVtID0gMHhmZmZmZmZmZjsKIAkJb3pfcGRfc2V0X3N0YXRlKHBkLCBPWl9QRF9TX0lETEUpOwogCQlwZC0+bWF4X3R4X3NpemUgPSBPWl9NQVhfVFhfU0laRTsKLQkJbWVtY3B5KHBkLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHBkLT5tYWNfYWRkciwgbWFjX2FkZHIpOwogCQlpZiAoMCAhPSBvel9lbHRfYnVmX2luaXQoJnBkLT5lbHRfYnVmZikpIHsKIAkJCWtmcmVlKHBkKTsKIAkJCXBkID0gTlVMTDsKQEAgLTI4NCwxMSArMjg1LDExIEBACiAJCQkJCSAgYWktPmFwcF9pZCk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlvel9wb2xsaW5nX2xvY2tfYmgoKTsKKwkJCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQkJcGQtPnRvdGFsX2FwcHMgfD0gKDE8PGFpLT5hcHBfaWQpOwogCQkJaWYgKHJlc3VtZSkKIAkJCQlwZC0+cGF1c2VkX2FwcHMgJj0gfigxPDxhaS0+YXBwX2lkKTsKLQkJCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJCQlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQl9CiAJfQogCXJldHVybiByYzsKQEAgLTMwNCwxNCArMzA1LDE0IEBACiAJb3pfcGRfZGJnKHBkLCBPTiwgIiVzOiAoMHgleCkgcGF1c2UoJWQpXG4iLCBfX2Z1bmNfXywgYXBwcywgcGF1c2UpOwogCWZvciAoYWkgPSBnX2FwcF9pZjsgYWkgPCAmZ19hcHBfaWZbT1pfQVBQSURfTUFYXTsgYWkrKykgewogCQlpZiAoYXBwcyAmICgxPDxhaS0+YXBwX2lkKSkgewotCQkJb3pfcG9sbGluZ19sb2NrX2JoKCk7CisJCQlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJCWlmIChwYXVzZSkgewogCQkJCXBkLT5wYXVzZWRfYXBwcyB8PSAoMTw8YWktPmFwcF9pZCk7CiAJCQl9IGVsc2UgewogCQkJCXBkLT50b3RhbF9hcHBzICY9IH4oMTw8YWktPmFwcF9pZCk7CiAJCQkJcGQtPnBhdXNlZF9hcHBzICY9IH4oMTw8YWktPmFwcF9pZCk7CiAJCQl9Ci0JCQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCQkJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJCWFpLT5zdG9wKHBkLCBwYXVzZSk7CiAJCX0KIAl9CkBAIC0zNDksMTcgKzM1MCwxNyBAQAogCiAJb3pfZGJnKE9OLCAib3pfcGRfc3RvcCgpIFN0YXRlID0gMHgleFxuIiwgcGQtPnN0YXRlKTsKIAlvel9wZF9pbmRpY2F0ZV9mYXJld2VsbHMocGQpOwotCW96X3BvbGxpbmdfbG9ja19iaCgpOworCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCXN0b3BfYXBwcyA9IHBkLT50b3RhbF9hcHBzOwogCXBkLT50b3RhbF9hcHBzID0gMDsKIAlwZC0+cGF1c2VkX2FwcHMgPSAwOwotCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAlvel9zZXJ2aWNlc19zdG9wKHBkLCBzdG9wX2FwcHMsIDApOwotCW96X3BvbGxpbmdfbG9ja19iaCgpOworCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCW96X3BkX3NldF9zdGF0ZShwZCwgT1pfUERfU19TVE9QUEVEKTsKIAkvKiBSZW1vdmUgZnJvbSBQRCBsaXN0LiovCiAJbGlzdF9kZWwoJnBkLT5saW5rKTsKLQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJb3pfZGJnKE9OLCAicGQgcmVmIGNvdW50ID0gJWRcbiIsIGF0b21pY19yZWFkKCZwZC0+cmVmX2NvdW50KSk7CiAJb3pfcGRfcHV0KHBkKTsKIH0KQEAgLTM3Miw5ICszNzMsOSBAQAogCWludCBkb19zdG9wID0gMDsKIAl1MTYgc3RvcF9hcHBzOwogCi0Jb3pfcG9sbGluZ19sb2NrX2JoKCk7CisJc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJaWYgKHBkLT5zdGF0ZSAmIChPWl9QRF9TX1NMRUVQIHwgT1pfUERfU19TVE9QUEVEKSkgewotCQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCQlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHBkLT5rZWVwX2FsaXZlICYmIHBkLT5zZXNzaW9uX2lkKQpAQCAtMzgzLDcgKzM4NCw3IEBACiAJCWRvX3N0b3AgPSAxOwogCiAJc3RvcF9hcHBzID0gcGQtPnRvdGFsX2FwcHM7Ci0Jb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCWlmIChkb19zdG9wKSB7CiAJCW96X3BkX3N0b3AocGQpOwogCX0gZWxzZSB7CkBAIC05OTksMTUgKzEwMDAsMTUgQEAKIAljb25zdCBzdHJ1Y3Qgb3pfYXBwX2lmICphaSA9ICZnX2FwcF9pZltPWl9BUFBJRF9VU0ItMV07CiAKIAl3aGlsZSAoMSkgewotCQlvel9wb2xsaW5nX2xvY2tfYmgoKTsKKwkJc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCWlmIChsaXN0X2VtcHR5KCZwZC0+ZmFyZXdlbGxfbGlzdCkpIHsKLQkJCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJCQlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KIAkJZiA9IGxpc3RfZmlyc3RfZW50cnkoJnBkLT5mYXJld2VsbF9saXN0LAogCQkJCXN0cnVjdCBvel9mYXJld2VsbCwgbGluayk7CiAJCWxpc3RfZGVsKCZmLT5saW5rKTsKLQkJb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJaWYgKGFpLT5mYXJld2VsbCkKIAkJCWFpLT5mYXJld2VsbChwZCwgZi0+ZXBfbnVtLCBmLT5yZXBvcnQsIGYtPmxlbik7CiAJCWtmcmVlKGYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmggYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuaAppbmRleCAxMmM3MTI5Li5hZDVmZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuaApAQCAtMjIsNiArMjIsMTEgQEAKICNkZWZpbmUgT1pfVElNRVJfSEVBUlRCRUFUCTIKICNkZWZpbmUgT1pfVElNRVJfU1RPUAkJMwogCisvKgorICpFeHRlcm5hbCBzcGlubG9jayB2YXJpYWJsZQorICovCitleHRlcm4gc3BpbmxvY2tfdCBnX3BvbGxpbmdfbG9jazsKKwogLyogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIGluZm9ybWF0aW9uIG9uIGEgZnJhbWUgZm9yIHRyYW5zbWlzc29uLiBUaGlzIGlzCiAgKiBidWlsdCB3aGVuIHRoZSBmcmFtZSBpcyBmaXJzdCB0cmFuc21pdHRlZCBhbmQgaXMgdXNlZCB0byByZWJ1aWxkIHRoZSBmcmFtZQogICogaWYgYSByZS10cmFuc21pc3Npb24gaXMgcmVxdWlyZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5jCmluZGV4IDVkOTY1Y2YuLmYwOWFjZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5jCkBAIC0zOCw5ICszOCwxMyBAQAogfTsKIAogLyoKKyAqIEV4dGVybmFsIHZhcmlhYmxlCisgKi8KKworREVGSU5FX1NQSU5MT0NLKGdfcG9sbGluZ19sb2NrKTsKKy8qCiAgKiBTdGF0aWMgZXh0ZXJuYWwgdmFyaWFibGVzLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdfcG9sbGluZ19sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQoZ19wZF9saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoZ19iaW5kaW5nKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ19iaW5kaW5nX2xvY2spOwpAQCAtNjY0LDMyICs2NjgsMjYgQEAKIHsKIAlzdHJ1Y3Qgb3pfYmluZGluZyAqYmluZGluZzsKIAotCWJpbmRpbmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3pfYmluZGluZyksIEdGUF9LRVJORUwpOwotCWlmIChiaW5kaW5nKSB7Ci0JCWJpbmRpbmctPnB0eXBlLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKE9aX0VUSEVSVFlQRSk7Ci0JCWJpbmRpbmctPnB0eXBlLmZ1bmMgPSBvel9wa3RfcmVjdjsKLQkJaWYgKG5ldF9kZXYgJiYgKm5ldF9kZXYpIHsKLQkJCW1lbWNweShiaW5kaW5nLT5uYW1lLCBuZXRfZGV2LCBPWl9NQVhfQklORElOR19MRU4pOwotCQkJb3pfZGJnKE9OLCAiQWRkaW5nIGJpbmRpbmc6ICVzXG4iLCBuZXRfZGV2KTsKLQkJCWJpbmRpbmctPnB0eXBlLmRldiA9Ci0JCQkJZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgbmV0X2Rldik7Ci0JCQlpZiAoYmluZGluZy0+cHR5cGUuZGV2ID09IE5VTEwpIHsKLQkJCQlvel9kYmcoT04sICJOZXRkZXYgJXMgbm90IGZvdW5kXG4iLCBuZXRfZGV2KTsKLQkJCQlrZnJlZShiaW5kaW5nKTsKLQkJCQliaW5kaW5nID0gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW96X2RiZyhPTiwgIkJpbmRpbmcgdG8gYWxsIG5ldGNhcmRzXG4iKTsKLQkJCW1lbXNldChiaW5kaW5nLT5uYW1lLCAwLCBPWl9NQVhfQklORElOR19MRU4pOwotCQkJYmluZGluZy0+cHR5cGUuZGV2ID0gTlVMTDsKLQkJfQotCQlpZiAoYmluZGluZykgewotCQkJZGV2X2FkZF9wYWNrKCZiaW5kaW5nLT5wdHlwZSk7Ci0JCQlzcGluX2xvY2tfYmgoJmdfYmluZGluZ19sb2NrKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJpbmRpbmctPmxpbmssICZnX2JpbmRpbmcpOwotCQkJc3Bpbl91bmxvY2tfYmgoJmdfYmluZGluZ19sb2NrKTsKKwliaW5kaW5nID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG96X2JpbmRpbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJpbmRpbmcpCisJCXJldHVybjsKKworCWJpbmRpbmctPnB0eXBlLnR5cGUgPSBodG9ucyhPWl9FVEhFUlRZUEUpOworCWJpbmRpbmctPnB0eXBlLmZ1bmMgPSBvel9wa3RfcmVjdjsKKwlpZiAobmV0X2RldiAmJiAqbmV0X2RldikgeworCQltZW1jcHkoYmluZGluZy0+bmFtZSwgbmV0X2RldiwgT1pfTUFYX0JJTkRJTkdfTEVOKTsKKwkJb3pfZGJnKE9OLCAiQWRkaW5nIGJpbmRpbmc6ICVzXG4iLCBuZXRfZGV2KTsKKwkJYmluZGluZy0+cHR5cGUuZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgbmV0X2Rldik7CisJCWlmIChiaW5kaW5nLT5wdHlwZS5kZXYgPT0gTlVMTCkgeworCQkJb3pfZGJnKE9OLCAiTmV0ZGV2ICVzIG5vdCBmb3VuZFxuIiwgbmV0X2Rldik7CisJCQlrZnJlZShiaW5kaW5nKTsKKwkJCXJldHVybjsKIAkJfQogCX0KKwlkZXZfYWRkX3BhY2soJmJpbmRpbmctPnB0eXBlKTsKKwlzcGluX2xvY2tfYmgoJmdfYmluZGluZ19sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZiaW5kaW5nLT5saW5rLCAmZ19iaW5kaW5nKTsKKwlzcGluX3VubG9ja19iaCgmZ19iaW5kaW5nX2xvY2spOwogfQogCiAvKgpAQCAtODAwLDEyICs3OTgsMyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotdm9pZCBvel9wb2xsaW5nX2xvY2tfYmgodm9pZCkKLXsKLQlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKLX0KLQotdm9pZCBvel9wb2xsaW5nX3VubG9ja19iaCh2b2lkKQotewotCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5oCmluZGV4IDBjNDljOGEuLmNiMzhlMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5oCkBAIC01OSw4ICs1OSw2IEBACiB2b2lkIG96X3RpbWVyX2FkZChzdHJ1Y3Qgb3pfcGQgKnBkLCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBkdWVfdGltZSk7CiB2b2lkIG96X3RpbWVyX2RlbGV0ZShzdHJ1Y3Qgb3pfcGQgKnBkLCBpbnQgdHlwZSk7CiB2b2lkIG96X3BkX3JlcXVlc3RfaGVhcnRiZWF0KHN0cnVjdCBvel9wZCAqcGQpOwotdm9pZCBvel9wb2xsaW5nX2xvY2tfYmgodm9pZCk7Ci12b2lkIG96X3BvbGxpbmdfdW5sb2NrX2JoKHZvaWQpOwogdm9pZCBvel9wZF9oZWFydGJlYXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCBvel9wZF90aW1lb3V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IG96X3BkX2hlYXJ0YmVhdF9ldmVudChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvY29sLmggYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG9jb2wuaAppbmRleCAxN2IwOWI5Li45YmJiMTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG9jb2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG9jb2wuaApAQCAtMTkyLDcgKzE5Miw3IEBACiAJdTE2CXNpemU7CiAJdTgJcmVxX3R5cGU7CiAJdTgJZGVzY190eXBlOwotCXUxNgl3X2luZGV4OworCV9fbGUxNgl3X2luZGV4OwogCXU4CWluZGV4OwogfSBQQUNLRUQ7CiAKQEAgLTIxOSw4ICsyMTksOCBAQAogCXU4CWVsdF9zZXFfbnVtOwogCXU4CXR5cGU7CiAJdTgJcmVxX2lkOwotCXUxNglvZmZzZXQ7Ci0JdTE2CXRvdGFsX3NpemU7CisJX19sZTE2CW9mZnNldDsKKwlfX2xlMTYJdG90YWxfc2l6ZTsKIAl1OAlyY29kZTsKIAl1OAlkYXRhWzFdOwogfSBQQUNLRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNiaWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JpZi5oCmluZGV4IDg1MzE0MzguLjQyNDlmYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JpZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JpZi5oCkBAIC0yMyw3ICsyMyw3IEBACiBpbnQgb3pfdXNiX2NvbnRyb2xfcmVxKHZvaWQgKmhwZCwgdTggcmVxX2lkLCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpzZXR1cCwKIAkJY29uc3QgdTggKmRhdGEsIGludCBkYXRhX2xlbik7CiBpbnQgb3pfdXNiX2dldF9kZXNjX3JlcSh2b2lkICpocGQsIHU4IHJlcV9pZCwgdTggcmVxX3R5cGUsIHU4IGRlc2NfdHlwZSwKLQl1OCBpbmRleCwgdTE2IHdpbmRleCwgaW50IG9mZnNldCwgaW50IGxlbik7CisJdTggaW5kZXgsIF9fbGUxNiB3aW5kZXgsIGludCBvZmZzZXQsIGludCBsZW4pOwogaW50IG96X3VzYl9zZW5kX2lzb2Modm9pZCAqaHBkLCB1OCBlcF9udW0sIHN0cnVjdCB1cmIgKnVyYik7CiB2b2lkIG96X3VzYl9yZXF1ZXN0X2hlYXJ0YmVhdCh2b2lkICpocGQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNic3ZjMS5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYnN2YzEuYwppbmRleCA2MTdmNTFjLi5mMzJkMDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNic3ZjMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JzdmMxLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqIENvbnRleHQ6IHNvZnRpcnEKICAqLwogaW50IG96X3VzYl9nZXRfZGVzY19yZXEodm9pZCAqaHBkLCB1OCByZXFfaWQsIHU4IHJlcV90eXBlLCB1OCBkZXNjX3R5cGUsCi0JdTggaW5kZXgsIHUxNiB3aW5kZXgsIGludCBvZmZzZXQsIGludCBsZW4pCisJdTggaW5kZXgsIF9fbGUxNiB3aW5kZXgsIGludCBvZmZzZXQsIGludCBsZW4pCiB7CiAJc3RydWN0IG96X3VzYl9jdHggKnVzYl9jdHggPSAoc3RydWN0IG96X3VzYl9jdHggKilocGQ7CiAJc3RydWN0IG96X3BkICpwZCA9IHVzYl9jdHgtPnBkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwppbmRleCBlYzRiMWZkLi4wOGY5YTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpAQCAtMTcxLDggKzE3MSw4IEBACiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CS8qIHZhbGlkIHdoZW4gdHlwZSA9PSBJTlBVVF9UWVBFX1NURCAqLwotCQkJdm9pZCAoKnByZXNzX2ZjdCkgKGludCk7Ci0JCQl2b2lkICgqcmVsZWFzZV9mY3QpIChpbnQpOworCQkJdm9pZCAoKnByZXNzX2ZjdCkoaW50KTsKKwkJCXZvaWQgKCpyZWxlYXNlX2ZjdCkoaW50KTsKIAkJCWludCBwcmVzc19kYXRhOwogCQkJaW50IHJlbGVhc2VfZGF0YTsKIAkJfSBzdGQ7CkBAIC00MTcsOSArNDE3LDkgQEAKIHN0YXRpYyBjaGFyIGxjZF9sZWZ0X3NoaWZ0Owogc3RhdGljIGNoYXIgaW5pdF9pbl9wcm9ncmVzczsKIAotc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfY21kKSAoaW50KTsKLXN0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2RhdGEpIChpbnQpOwotc3RhdGljIHZvaWQgKCpsY2RfY2xlYXJfZmFzdCkgKHZvaWQpOworc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfY21kKShpbnQpOworc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfZGF0YSkoaW50KTsKK3N0YXRpYyB2b2lkICgqbGNkX2NsZWFyX2Zhc3QpKHZvaWQpOwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBwcnRfbG9jayk7CiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKQEAgLTQ1NywxNCArNDU3LDEyIEBACiBzdGF0aWMgaW50IGxjZF90eXBlID0gLTE7CiBtb2R1bGVfcGFyYW0obGNkX3R5cGUsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF90eXBlLAotCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsICIKLQkJICIzPWhhbnRyb25peCAvLywgND1uZXhjb20gLy8sIDU9Y29tcGlsZWQtaW4iKTsKKwkJICJMQ0QgdHlwZTogMD1ub25lLCAxPW9sZCAvLywgMj1zZXJpYWwga3MwMDc0LCAzPWhhbnRyb25peCAvLywgND1uZXhjb20gLy8sIDU9Y29tcGlsZWQtaW4iKTsKIAogc3RhdGljIGludCBsY2RfcHJvdG8gPSAtMTsKIG1vZHVsZV9wYXJhbShsY2RfcHJvdG8sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9wcm90bywKLQkJIkxDRCBjb21tdW5pY2F0aW9uOiAwPXBhcmFsbGVsICgvLyksIDE9c2VyaWFsLCIKLQkJIjI9VEkgTENEIEludGVyZmFjZSIpOworCQkiTENEIGNvbW11bmljYXRpb246IDA9cGFyYWxsZWwgKC8vKSwgMT1zZXJpYWwsIDI9VEkgTENEIEludGVyZmFjZSIpOwogCiBzdGF0aWMgaW50IGxjZF9jaGFyc2V0ID0gLTE7CiBtb2R1bGVfcGFyYW0obGNkX2NoYXJzZXQsIGludCwgMDAwMCk7CkBAIC00NzMsOCArNDcxLDcgQEAKIHN0YXRpYyBpbnQga2V5cGFkX3R5cGUgPSAtMTsKIG1vZHVsZV9wYXJhbShrZXlwYWRfdHlwZSwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0Moa2V5cGFkX3R5cGUsCi0JCSAiS2V5cGFkIHR5cGU6IDA9bm9uZSwgMT1vbGQgNiBrZXlzLCAyPW5ldyA2KzEga2V5cywgIgotCQkgIjM9bmV4Y29tIDQga2V5cyIpOworCQkgIktleXBhZCB0eXBlOiAwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNisxIGtleXMsIDM9bmV4Y29tIDQga2V5cyIpOwogCiBzdGF0aWMgaW50IHByb2ZpbGUgPSBERUZBVUxUX1BST0ZJTEU7CiBtb2R1bGVfcGFyYW0ocHJvZmlsZSwgaW50LCAwMDAwKTsKQEAgLTQ5NCwzOCArNDkxLDMyIEBACiBzdGF0aWMgaW50IGxjZF9lX3BpbiAgPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfZV9waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9lX3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdFJyBzaWduYWwsICIKLQkJICJ3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ0UnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGludCBsY2RfcnNfcGluID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX3JzX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX3JzX3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSUycgc2lnbmFsLCAiCi0JCSAid2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSUycgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgaW50IGxjZF9yd19waW4gPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfcndfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfcndfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JXJyBzaWduYWwsICIKLQkJICJ3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JXJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX2JsX3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9ibF9waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9ibF9waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCBiYWNrbGlnaHQsICIKLQkJICJ3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgYmFja2xpZ2h0LCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgaW50IGxjZF9kYV9waW4gPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfZGFfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfZGFfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTREEnICIKLQkJICJzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NEQScgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgaW50IGxjZF9jbF9waW4gPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfY2xfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfY2xfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTQ0wnICIKLQkJICJzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NDTCcgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqbGNkX2NoYXJfY29udjsKIApAQCAtMjAxNyw5ICsyMDA4LDkgQEAKICAqIGJlIGJvdW5kLgogICovCiBzdGF0aWMgc3RydWN0IGxvZ2ljYWxfaW5wdXQgKnBhbmVsX2JpbmRfY2FsbGJhY2soY2hhciAqbmFtZSwKLQkJCQkJCSB2b2lkICgqcHJlc3NfZmN0KSAoaW50KSwKKwkJCQkJCSB2b2lkICgqcHJlc3NfZmN0KShpbnQpLAogCQkJCQkJIGludCBwcmVzc19kYXRhLAotCQkJCQkJIHZvaWQgKCpyZWxlYXNlX2ZjdCkgKGludCksCisJCQkJCQkgdm9pZCAoKnJlbGVhc2VfZmN0KShpbnQpLAogCQkJCQkJIGludCByZWxlYXNlX2RhdGEpCiB7CiAJc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmNhbGxiYWNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9Nb2R1bGUuc3ltdmVycyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTW9kdWxlLnN5bXZlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTW9kdWxlLnN5bXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKaW5kZXggNjNmNGYzYy4uZjk5NjY5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKQEAgLTExLDEzICsxMSwxMyBAQAogCXU4IEZpcnN0Q2hubDsKIAl1OCAgTnVtQ2hubHM7CiAJdTggIE1heFR4UG93ZXJJbkRibTsKLX1DSE5MX1RYUE9XRVJfVFJJUExFLCAqUENITkxfVFhQT1dFUl9UUklQTEU7Cit9IENITkxfVFhQT1dFUl9UUklQTEUsICpQQ0hOTF9UWFBPV0VSX1RSSVBMRTsKIAogdHlwZWRlZiBlbnVtIF9ET1QxMURfU1RBVEUgewogCURPVDExRF9TVEFURV9OT05FID0gMCwKIAlET1QxMURfU1RBVEVfTEVBUk5FRCwKIAlET1QxMURfU1RBVEVfRE9ORSwKLX1ET1QxMURfU1RBVEU7Cit9IERPVDExRF9TVEFURTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsKIAkvKiBERUNMQVJFX1JUX09CSkVDVChSVF9ET1QxMkRfSU5GTyk7ICovCkBAIC0zNSw5ICszNSwxMCBAQAogCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwogCiAJRE9UMTFEX1NUQVRFIFN0YXRlOwotfVJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOwotI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKLSNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkKK30gUlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87CisKKyNkZWZpbmUgZXFNYWNBZGRyKGEsIGIpICgoKGEpWzBdID09IChiKVswXSAmJiAoYSlbMV0gPT0gKGIpWzFdICYmIChhKVsyXSA9PSAoYilbMl0gJiYgKGEpWzNdID09IChiKVszXSAmJiAoYSlbNF0gPT0gKGIpWzRdICYmIChhKVs1XSA9PSAoYilbNV0pID8gMTowKQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLCBzcmMpICgoZGVzKVswXSA9IChzcmMpWzBdLCAoZGVzKVsxXSA9IChzcmMpWzFdLCAoZGVzKVsyXSA9IChzcmMpWzJdLCAoZGVzKVszXSA9IChzcmMpWzNdLCAoZGVzKVs0XSA9IChzcmMpWzRdLCAoZGVzKVs1XSA9IChzcmMpWzVdKQogI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQogCiAjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaAppbmRleCAwOWZmZDliLi5kMTc2M2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtNDczLDcgKzQ3Myw3IEBACiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKLQl1MTYgZnJhbWVfY3RsOworCV9fbGUxNiBmcmFtZV9jdGw7CiAJdTE2IGR1cmF0aW9uX2lkOwogCXU4IGFkZHIxWzZdOwogCXU4IGFkZHIyWzZdOwpAQCAtNDgyLDcgKzQ4Miw3IEBACiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciB7Ci0JdTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZnJhbWVfY3RsOwogCXUxNiBkdXJhdGlvbl9pZDsKIAl1OCBhZGRyMVtFVEhfQUxFTl07CiAJdTggYWRkcjJbRVRIX0FMRU5dOwpAQCAtNzA5LDEwICs3MDksMTAgQEAKIAogI2RlZmluZSBNQVhfSUVfTEVOCQkJCQkJMHhGRiAvLytZSiwwODA2MjUKIAotdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVHsKLQl1OAlDaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOwotCXU4CUxlbjsKLX1DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworc3RydWN0IHJ0bDgxODdzZV9jaGFubmVsX2xpc3QgeworCXU4CWNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNQkVSICsgMV07CisJdTgJbGVuOworfTsKIAogLy9ieSBhbXkgZm9yIHBzCiAjZGVmaW5lIElFRUU4MDIxMV9XQVRDSF9ET0dfVElNRSAgICAyMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwppbmRleCBjODAxM2QzLi40ZmUyNTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAl1OCByeF9iMFtBRVNfQkxPQ0tfTEVOXSwgcnhfYltBRVNfQkxPQ0tfTEVOXSwgcnhfYVtBRVNfQkxPQ0tfTEVOXTsKIH07CiAKLXZvaWQgaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAJCQkJY29uc3QgdTggcHRbMTZdLCB1OCBjdFsxNl0pCiB7CiAJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSgodm9pZCAqKXRmbSwgY3QsIHB0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCmluZGV4IGM1OTA3OTYuLjZjMWFjYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpAQCAtMTg3LDggKzE4Nyw3IEBACiB9CiAKIAotc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPQoteworc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPSB7CiAJMHhDNkE1LCAweEY4ODQsIDB4RUU5OSwgMHhGNjhELCAweEZGMEQsIDB4RDZCRCwgMHhERUIxLCAweDkxNTQsCiAJMHg2MDUwLCAweDAyMDMsIDB4Q0VBOSwgMHg1NjdELCAweEU3MTksIDB4QjU2MiwgMHg0REU2LCAweEVDOUEsCiAJMHg4RjQ1LCAweDFGOUQsIDB4ODk0MCwgMHhGQTg3LCAweEVGMTUsIDB4QjJFQiwgMHg4RUM5LCAweEZCMEIsCkBAIC0zMDcsNyArMzA2LDcgQEAKIAlpbnQgbGVuOwogCXU4ICAqcG9zOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7Ci0JdTggcmM0a2V5WzE2XSwqaWN2OworCXU4IHJjNGtleVsxNl0sICppY3Y7CiAJdTMyIGNyYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJaW50IHJldDsKQEAgLTM0OCw3ICszNDcsNyBAQAogCWljdlszXSA9IGNyYyA+PiAyNDsKIAljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT50eF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CiAJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIGxlbiArIDQpOwotCXJldD0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisJcmV0ID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CiAKIAl0a2V5LT50eF9pdjE2Kys7CiAJaWYgKHRrZXktPnR4X2l2MTYgPT0gMCkgewpAQCAtNTM3LDkgKzUzNiw5IEBACiAKIAltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT50eF9oZHIpOwogCi0JaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwlpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpCiAJCXRrZXktPnR4X2hkclsxMl0gPSAqKHNrYi0+ZGF0YSArIGhkcl9sZW4gLSAyKSAmIDB4MDc7Ci0JfQorCiAJcG9zID0gc2tiX3B1dChza2IsIDgpOwogCiAJaWYgKG1pY2hhZWxfbWljKHRrZXktPnR4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzE2XSwgdGtleS0+dHhfaGRyLApAQCAtNTgzLDkgKzU4Miw4IEBACiAJCXJldHVybiAtMTsKIAogCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnJ4X2hkcik7Ci0JaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwlpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpCiAJCXRrZXktPnJ4X2hkclsxMl0gPSAqKHNrYi0+ZGF0YSArIGhkcl9sZW4gLSAyKSAmIDB4MDc7Ci0JfQogCiAJaWYgKG1pY2hhZWxfbWljKHRrZXktPnJ4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAogCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwppbmRleCBmMTE0ZjlhLi5mMjUzNjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCkBAIC0xMSw3ICsxMSw2IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpAQCAtMjgsOCArMjcsNiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBXRVAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotCi0KIHN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgewogCXUzMiBpdjsKICNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKQEAgLTQwLDcgKzM3LDYgQEAKIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtOwogfTsKIAotCiBzdGF0aWMgdm9pZCAqcHJpc20yX3dlcF9pbml0KGludCBrZXlpZHgpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqcHJpdjsKQEAgLTc5LDcgKzc1LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotCiBzdGF0aWMgdm9pZCBwcmlzbTJfd2VwX2RlaW5pdCh2b2lkICpwcml2KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKl9wcml2ID0gcHJpdjsKQEAgLTk0LDcgKzg5LDYgQEAKIAlrZnJlZShwcml2KTsKIH0KIAotCiAvKiBQZXJmb3JtIFdFUCBlbmNyeXB0aW9uIG9uIGdpdmVuIHNrYiB0aGF0IGhhcyBhdCBsZWFzdCA0IGJ5dGVzIG9mIGhlYWRyb29tCiAgKiBmb3IgSVYgYW5kIDQgYnl0ZXMgb2YgdGFpbHJvb20gZm9yIElDVi4gQm90aCBJViBhbmQgSUNWIHdpbGwgYmUgdHJhbnNtaXR0ZWQsCiAgKiBzbyB0aGUgcGF5bG9hZCBsZW5ndGggaW5jcmVhc2VzIHdpdGggOCBieXRlcy4KQEAgLTE1Nyw3ICsxNTEsNiBAQAogCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKIH0KIAotCiAvKiBQZXJmb3JtIFdFUCBkZWNyeXB0aW9uIG9uIGdpdmVuIGJ1ZmZlci4gQnVmZmVyIGluY2x1ZGVzIHdob2xlIFdFUCBwYXJ0IG9mCiAgKiB0aGUgZnJhbWU6IElWICg0IGJ5dGVzKSwgZW5jcnlwdGVkIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQIGhlYWRlciksCiAgKiBJQ1YgKDQgYnl0ZXMpLiBsZW4gaW5jbHVkZXMgYm90aCBJViBhbmQgSUNWLgpAQCAtMjE5LDcgKzIxMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBwcmlzbTJfd2VwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CkBAIC0yMzMsNyArMjI1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHByaXNtMl93ZXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKQEAgLTI0Niw3ICsyMzcsNiBAQAogCXJldHVybiB3ZXAtPmtleV9sZW47CiB9CiAKLQogc3RhdGljIGNoYXIgKnByaXNtMl93ZXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OwpAQCAtMjU1LDcgKzI0NSw2IEBACiAJcmV0dXJuIHA7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfd2VwID0gewogCS5uYW1lCQkJPSAiV0VQIiwKIAkuaW5pdAkJCT0gcHJpc20yX3dlcF9pbml0LApAQCAtMjcyLDIxICsyNjEsMTcgQEAKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogfTsKIAotCiBpbnQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKQogewogCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpCiB7CiAJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCkKIHsKLS8vCXByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBjMjczOTJkLi4wM2ViMTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTEzLDcgKzEzLDYgQEAKICAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0KICNpbmNsdWRlICJpZWVlODAyMTEuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpAQCAtMjQsMTQgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAjaW5jbHVkZSAiZG90MTFkLmgiCi11OCByc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsxNl1bNF0gPSB7Ci0JezB4MDAsIDB4MEYsIDB4QUMsIDB4MDB9LCAvL1VzZSBncm91cCBrZXksIC8vUmVzZXJ2ZWQKLQl7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX0sIC8vV0VQLTQwICAgICAgICAgLy9SU05BIGRlZmF1bHQKLQl7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn0sIC8vVEtJUCAgICAgICAgICAgLy9OT05FCQkvL3t1c2VkIGp1c3QgYXMgZGVmYXVsdH0KLQl7MHgwMCwgMHgwRiwgMHhBQywgMHgwM30sIC8vV1JBUC1oaXN0b3JpY2FsCi0JezB4MDAsIDB4MEYsIDB4QUMsIDB4MDR9LCAvL0NDTVAKLQl7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX0sIC8vV0VQLTEwNAotfTsKIAogc2hvcnQgaWVlZTgwMjExX2lzXzU0Zyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKIHsKQEAgLTYyLDE0ICs1MywxMyBAQAogfQogCiAvKiBwbGFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2lzZWQuCi0gKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAotICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCisgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdCBpdCBwb2ludHMgYWZ0ZXIgdGhlIG5ldyBNRklFIHRhZyBhZGRlZC4KICAqLwogc3RhdGljIHZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIAotCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgewogCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVM7CiAJCSp0YWcrKyA9IDQ7CiAJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwpAQCAtODYsOCArNzYsNyBAQAogewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKLQkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKLQorCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pIHsKIAkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTX0VYOwogCQkqdGFnKysgPSA4OwogCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CkBAIC0xMDAsMjIgKzg5LDIwIEBACiAJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CiAKIAl9Ci0KIAkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLwogCSp0YWdfcCA9IHRhZzsKIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfV01NX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIAotCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvLzAKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLyogMCAqLwogCSp0YWcrKyA9IDc7CiAJKnRhZysrID0gMHgwMDsKIAkqdGFnKysgPSAweDUwOwogCSp0YWcrKyA9IDB4ZjI7Ci0JKnRhZysrID0gMHgwMjsvLzUKKwkqdGFnKysgPSAweDAyOyAvKiA1ICovCiAJKnRhZysrID0gMHgwMDsKIAkqdGFnKysgPSAweDAxOwogI2lmZGVmIFNVUFBPUlRfVVNQRApAQCAtMTQ4LDMyICsxMzUsMjMgQEAKIHN0YXRpYyB2b2lkIGVucXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgbmg7Ci0JbmggPSAoaWVlZS0+bWdtdF9xdWV1ZV9oZWFkICsxKSAlIE1HTVRfUVVFVUVfTlVNOworCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArIDEpICUgTUdNVF9RVUVVRV9OVU07CiAKLS8qCi0gKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgotICoganVzdCBvdmVyd3JpdGVzIHRoZSBvbGRlc3QuCi0gKgotICogaWYgKG5oID09IGllZWUtPm1nbXRfcXVldWVfdGFpbCkKLSAqCQlyZXR1cm4gLTE7Ci0gKi8KIAlpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSBuaDsKIAlpZWVlLT5tZ210X3F1ZXVlX3JpbmdbbmhdID0gc2tiOwotCi0JLy9yZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICpkZXF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnJldDsKIAotCWlmKGllZWUtPm1nbXRfcXVldWVfdGFpbCA9PSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpCisJaWYgKGllZWUtPm1nbXRfcXVldWVfdGFpbCA9PSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0ID0gaWVlZS0+bWdtdF9xdWV1ZV9yaW5nW2llZWUtPm1nbXRfcXVldWVfdGFpbF07CiAKIAlpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPQotCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsKzEpICUgTUdNVF9RVUVVRV9OVU07CisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwgKyAxKSAlIE1HTVRfUVVFVUVfTlVNOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4Myw3ICsxNjEsNiBAQAogCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpOwogCiBpbmxpbmUgdm9pZCBzb2Z0bWFjX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTkxLDIwICsxNjgsMTggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyPQorCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyID0KIAkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CiAKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBjYWxsZWQgd2l0aCAybmQgcGFyYW0gMCwgbm8gbWdtdCBsb2NrIHJlcXVpcmVkICovCi0JaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLCAwKTsKIAotCWlmKHNpbmdsZSl7Ci0JCWlmKGllZWUtPnF1ZXVlX3N0b3ApewotCi0JCQllbnF1ZXVlX21nbXQoaWVlZSxza2IpOwotCQl9ZWxzZXsKKwlpZiAoc2luZ2xlKSB7CisJCWlmIChpZWVlLT5xdWV1ZV9zdG9wKSB7CisJCQllbnF1ZXVlX21nbXQoaWVlZSwgc2tiKTsKKwkJfSBlbHNlIHsKIAkJCWhlYWRlci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCk7CiAKIAkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKQEAgLTIxNCwxMSArMTg5LDExIEBACiAKIAkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCiAJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYsIGllZWUtPmJhc2ljX3JhdGUpOwogCQl9CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCX1lbHNleworCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOwogCkBAIC0yMzEsMjQgKzIwNiwyMCBAQAogCiAJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCiAJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKwkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOwogCX0KIH0KIAotCiBpbmxpbmUgdm9pZCBzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQogCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyID0KIAkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CiAKLQotCWlmKHNpbmdsZSl7Ci0KKwlpZiAoc2luZ2xlKSB7CiAJCWhlYWRlci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKIAogCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCkBAIC0yNTgsMTAgKzIyOSw4IEBACiAKIAkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KIAkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKLQotCX1lbHNlewotCisJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYsIGllZWUtPmJhc2ljX3JhdGUpOworCX0gZWxzZSB7CiAJCWhlYWRlci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKIAogCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCkBAIC0yNzEsMTIgKzI0MCwxMCBAQAogCiAJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCiAJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKLQorCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUtPmRldik7CiAJfQotLy8JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiB9Ci0vL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorCiBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgogaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2Ioc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggYXNSc24pCkBAIC0yODgsNyArMjU1LDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKLQlkaXNhc3MgPSAoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSkpOworCWRpc2FzcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lICopIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSkpOwogCWRpc2Fzcy0+aGVhZGVyLmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOwogCWRpc2Fzcy0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKIApAQCAtMjk5LDIxICsyNjYsMTkgQEAKIAlkaXNhc3MtPnJlYXNvbmNvZGUgPSBhc1JzbjsKIAlyZXR1cm4gc2tiOwogfQorCiB2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmFzU3RhLCB1OCBhc1JzbikKIHsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwotICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotICAgICAgICBza2IgPSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYihiZWFjb24saWVlZSxhc1Jzbik7Ci0gICAgICAgIGlmIChza2IpewotICAgICAgICAgICAgICAgIHNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0gICAgICAgICAgICAgICAgLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKLSAgICAgICAgfQorCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbiwgaWVlZSwgYXNSc24pOworCWlmIChza2IpCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiB9CiAKLS8vYnkgYW15IGZvciBwb3dlciBzYXZlCiBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JdW5zaWduZWQgaW50IGxlbixyYXRlX2xlbjsKKwl1bnNpZ25lZCBpbnQgbGVuLCByYXRlX2xlbjsKIAl1OCAqdGFnOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICpyZXE7CkBAIC0zMjcsNzUgKzI5Miw0NSBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKIAotCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkpOworCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpKTsKIAlyZXEtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKLQlyZXEtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUU6IGlzIHRoaXMgT0sgPworCXJlcS0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLyogRklYTUU6IGlzIHRoaXMgT0sgPyAqLwogCiAJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIxLCAweGZmLCBFVEhfQUxFTik7CiAJbWVtY3B5KHJlcS0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CiAKLQl0YWcgPSAodTggKikgc2tiX3B1dChza2IsbGVuKzIrcmF0ZV9sZW4pOworCXRhZyA9ICh1OCAqKSBza2JfcHV0KHNrYiwgbGVuICsgMiArIHJhdGVfbGVuKTsKIAogCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOwogCSp0YWcrKyA9IGxlbjsKIAltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbGVuKTsKIAl0YWcgKz0gbGVuOwotCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsJnRhZyk7Ci0JaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKIAogCXJldHVybiBza2I7CiB9CiAKIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogCi12b2lkIGV4dF9pZWVlODAyMTFfc2VuZF9iZWFjb25fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKLQotCWlmIChza2IpewotCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCi0JfQotCi0KLQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsxXSBiZWFjb24gc2VuZGluZyFcbiIpOwotCWllZWUtPmJlYWNvbl90aW1lci5leHBpcmVzID0gamlmZmllcyArCi0JCShNU0VDUyggaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAtNSkpOwotCi0JLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwotCWlmKGllZWUtPmJlYWNvbl90eGluZykKLQkJYWRkX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOwotCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKIAotCWlmIChza2IpeworCWlmIChza2IpIHsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0KIAotCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGJlYWNvbiBzZW5kaW5nIVxuIik7CiAJaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKLQkJKE1TRUNTKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC01KSk7CisJCShNU0VDUyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC0gNSkpOwogCi0JLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwotCWlmKGllZWUtPmJlYWNvbl90eGluZykKKwlpZiAoaWVlZS0+YmVhY29uX3R4aW5nKQogCQlhZGRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7Ci0JLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CiB9CiAKIApAQCAtNDE1LDE2ICszNTAsMTUgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJc2tiID0gaWVlZTgwMjExX3Byb2JlX3JlcShpZWVlKTsKLQlpZiAoc2tiKXsKKwlpZiAoc2tiKSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnErKzsKLQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSl7CisJaWYgKGllZWUtPmFjdGl2ZV9zY2FuICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlEpKSB7CiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOwogCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKIAl9CkBAIC00MzksMTcgKzM3MywxNCBAQAogCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKIAltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKIAlkb3duKCZpZWVlLT5zY2FuX3NlbSk7Ci0vLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gU3luYyBzY2FuXG4iKTsKIAotCXdoaWxlKDEpCi0JewotCi0JCWRveworCXdoaWxlICgxKSB7CisJCWRvIHsKIAkJCWNoKys7CiAJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCiAJCQkJZ290byBvdXQ7IC8qIHNjYW4gY29tcGxldGVkICovCiAKLQkJfXdoaWxlKCFjaGFubmVsX21hcFtjaF0pOworCQl9IHdoaWxlICghY2hhbm5lbF9tYXBbY2hdKTsKIAkJLyogdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCiAJCSAqIDEtIFdlIGhhdmUgc3dpdGNoZWQgdG8gYWQtaG9jIG1vZGUgYW5kIHdlIGFyZQogCQkgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCkBAIC00NzMsMTAxICs0MDQsNzQgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOwotLy8JCXByaW50aygiPT09PT0+Y2hhbm5lbD0lZCAgICIsY2gpOwotCQlpZihjaGFubmVsX21hcFtjaF0gPT0gMSkKLQkJewotLy8JCQlwcmludGsoIj09PT1zZW5kIHByb2JlIHJlcXVlc3RcbiIpOworCQlpZiAoY2hhbm5lbF9tYXBbY2hdID09IDEpCiAJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKLQkJfQorCiAJCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKIAkJICogbmVlZCB0byB3YWl0IGZvciBhIHN5bmNybyBzY2FuIHRvIGVuZC4uCiAJCSAqLwogCQlpZiAoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCiAJCQlnb3RvIG91dDsKIAotCiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlX3J0bChJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOwotCiAJfQogb3V0OgogCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaXBzX3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWludCBjaDsKLSAgICAgICAgdW5zaWduZWQgaW50IHdhdGNoX2RvZyA9IDA7CisJdW5zaWduZWQgaW50IHdhdGNoX2RvZyA9IDA7CiAJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwogCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotICAgICAgICBkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwogCWNoID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7Ci0vLyAgICAgIAlpZihpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKLS8vCXsKIAotLy8JCXByaW50aygic3RvcCBzY2FuIHN5bmNcbiIpOwotLy8gICAJCWdvdG8gb3V0OwotLy8gIAl9Ci0vLwlwcmludGsoIj09PT09PT1oaD09PT09PT09PT09PT09PT5pcHMgc2NhblxuIik7Ci0gICAgIAl3aGlsZSgxKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCi0gICAgICAgICAgICAgICAgICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCi0gICAgICAgICAgICAgICAgICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQotICAgICAgICAgICAgICAgICAqICAgIHRoZXJlIGFyZSBubyBpbnRlcmVzdGluZyBjZWxsIGFuZCB0byBjcmVhdGUgYQotICAgICAgICAgICAgICAgICAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcwotICAgICAgICAgICAgICAgICAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KLSAgICAgICAgICAgICAgICAgKiAgICBJZiBzbyB0aGUgaWVlZTgwMjFfbmV3X25ldCwgY2FsbGVkIGJ5IHRoZSBSWCBwYXRoCi0gICAgICAgICAgICAgICAgICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsIHNvIHdlIHN0b3AKLSAgICAgICAgICAgICAgICAgKiAgICBzY2FubmluZwotICAgICAgICAgICAgICAgICAqIDItIFdlIGFyZSBsaW5rZWQgYW5kIHRoZSByb290IHVzZXMgcnVuIGl3bGlzdCBzY2FuLgotICAgICAgICAgICAgICAgICAqICAgIFNvIHdlIHN3aXRjaCB0byBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCi0gICAgICAgICAgICAgICAgICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KLSAgICAgICAgICAgICAgICAgKiAgICBuZXcgbmV0d29yayBldmVudHMsIGRlc3BpdGUgZm9yIHVwZGF0aW5nIHRoZSBuZXQgbGlzdCwKLSAgICAgICAgICAgICAgICAgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFyaWx5ICd1bmxpbmtlZCcgYXMgdGhlIGRyaXZlciBzaGFsbAotICAgICAgICAgICAgICAgICAqICAgIG5vdCBmaWx0ZXIgUlggZnJhbWVzIGFuZCB0aGUgY2hhbm5lbCBpcyBjaGFuZ2luZy4KLSAgICAgICAgICAgICAgICAgKiBTbyB0aGUgb25seSBzaXR1YXRpb24gaW4gd2l0Y2ggYXJlIGludGVyZXN0ZWQgaXMgdG8gY2hlY2sKLSAgICAgICAgICAgICAgICAgKiBpZiB0aGUgc3RhdGUgYmVjb21lIExJTktFRCBiZWNhdXNlIG9mIHRoZSAjMSBzaXR1YXRpb24KLSAgICAgICAgICAgICAgICAgKi8KKwl3aGlsZSAoMSkgeworCQkvKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKKwkJICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCisJCSAqICAgIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzeW5jcm8gc2NhbiBiZWZvcmUgY29uY2x1ZGUKKwkJICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCisJCSAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcworCQkgKiAgICBJRUVFODAyMTFfTk9MSU5LIHVudGlsIHdlIGZvdW5kIGFuIGludGVyZXN0aW5nIGNlbGwuCisJCSAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKKwkJICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsIHNvIHdlIHN0b3AKKwkJICogICAgc2Nhbm5pbmcKKwkJICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCisJCSAqICAgIFNvIHdlIHN3aXRjaCB0byBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCisJCSAqICAgIHRoYXQgd2UgYXJlIHN0aWxsIGxvZ2ljYWxseSBsaW5rZWQgKG5vdCBpbnRlcmVzdGVkIGluCisJCSAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAorCQkgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFyaWx5ICd1bmxpbmtlZCcgYXMgdGhlIGRyaXZlciBzaGFsbAorCQkgKiAgICBub3QgZmlsdGVyIFJYIGZyYW1lcyBhbmQgdGhlIGNoYW5uZWwgaXMgY2hhbmdpbmcuCisJCSAqIFNvIHRoZSBvbmx5IHNpdHVhdGlvbiBpbiB3aXRjaCBhcmUgaW50ZXJlc3RlZCBpcyB0byBjaGVjaworCQkgKiBpZiB0aGUgc3RhdGUgYmVjb21lIExJTktFRCBiZWNhdXNlIG9mIHRoZSAjMSBzaXR1YXRpb24KKwkJICovCiAJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQl7CiAJCQlnb3RvIG91dDsKLQkJfQotCQlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPiAwKQotCQl7CisKKwkJaWYgKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA+IDApCiAJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLS8vCQkJcHJpbnRrKCI9PT09PT0+Y2hhbm5lbD0lZCAgIixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0JCX0KLQkJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCi0JCXsKLS8vCQkJcHJpbnRrKCI9PT09c2VuZCBwcm9iZSByZXF1ZXN0XG4iKTsKKworCQlpZiAoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCiAJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKLSAgICAgICAgICAgICAgICB9Ci0JCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKLSAgICAgICAgICAgICAgICAgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KLSAgICAgICAgICAgICAgICAgKi8KLS8vICAgICAgICAgICAgICAgIGlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CiAKIAkJbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CiAKLQkJZG97CisJCWRvIHsKIAkJCWlmICh3YXRjaF9kb2crKyA+PSBNQVhfQ0hBTk5FTF9OVU1CRVIpCi0JCS8vCWlmICgrK3dhdGNoX2RvZyA+PSAxNSk7Ly9NQVhfQ0hBTk5FTF9OVU1CRVIpICAvL1lKLG1vZGlmaWVkLDA4MDYzMAogCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLwogCiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpJU1BWF9DSEFOTkVMX05VTUJFUjsKLQkJfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotICAgICAgICB9CisJCX0gd2hpbGUgKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworCX0KIG91dDoKLQkvL2llZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKLSAgIAkvL2llZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOwotICAgCS8vaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKIAlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOwogCXVwKCZpZWVlLT5zY2FuX3NlbSk7Ci0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKIH0KIApAQCAtNTc1LDI5ICs0NzksMjQgQEAKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7Ci0Jc3RhdGljIHNob3J0IHdhdGNoZG9nID0gMDsKKwlzdGF0aWMgc2hvcnQgd2F0Y2hkb2c7CiAJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwogCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotLy8JcHJpbnRrKCJpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxIEVOQUJMRV9JUFNcbiIpOwotLy8JcHJpbnRrKCJpbiAlc1xuIixfX2Z1bmNfXyk7CiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwogCi0JZG97CisJZG8gewogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CiAJCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKIAkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCiAJCQkJZ290byBvdXQ7IC8qIG5vIGdvb2QgY2hhbnMgKi8KKwl9IHdoaWxlICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKIAotIAl9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7Ci0KLQkvL3ByaW50aygiY3VycmVudF9uZXR3b3JrLmNoYW5uZWw6JWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCi0JeworCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKSB7CiAJCXByaW50aygiZXJyb3Igb3V0LCBzY2FubmluZyA9IDBcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0JaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCisJaWYgKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQogCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKIAogCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKQEAgLTYwOSw3ICs1MDgsNyBAQAogCWllZWUtPnNjYW5uaW5nID0gMDsKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogCi0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKIAlyZXR1cm47CiB9CkBAIC02MTgsNjIgKzUxNyw1MSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOwogCiAJaWVlZS0+YmVhY29uX3R4aW5nID0gMTsKIAlpZWVlODAyMTFfc2VuZF9iZWFjb24oaWVlZSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKIAogCWllZWUtPmJlYWNvbl90eGluZyA9IDA7Ci0gCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5iZWFjb25fdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5iZWFjb25fdGltZXIpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihpZWVlLT5zdG9wX3NlbmRfYmVhY29ucykKKwlpZiAoaWVlZS0+c3RvcF9zZW5kX2JlYWNvbnMpCiAJCWllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKGllZWUtPmRldik7CiAJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKIAkJaWVlZTgwMjExX2JlYWNvbnNfc3RvcChpZWVlKTsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYoaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKQorCWlmIChpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMpCiAJCWllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOwotCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQogCQlpZWVlODAyMTFfYmVhY29uc19zdGFydChpZWVlKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0vLwl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLy9pZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7Ci0KIAlkb3duKCZpZWVlLT5zY2FuX3NlbSk7Ci0vLwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGllZWUtPnNjYW5uaW5nID09IDEpeworCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKSB7CiAJCWllZWUtPnNjYW5uaW5nID0gMDsKLQkJLy9kZWxfdGltZXJfc3luYygmaWVlZS0+c2Nhbl90aW1lcik7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CiAJfQogCi0vLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKIH0KIApAQCAtNjg4LDM4ICs1NzYsMjggQEAKIC8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwogdm9pZCBpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCi0JewotCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQotCQl7CisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpIHsKKwkJaWYgKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Ci0JCX0KIAl9Ci0JaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7Ci0JCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKQotCQl7CisKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKSB7CisJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKSB7CiAJCQlpZWVlLT5zY2FubmluZyA9IDE7Ci0JCQkvL2llZWU4MDIxMV9zb2Z0bWFjX3NjYW4oaWVlZSk7Ci0JCS8vCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOwotCQkvL2NhcmUgdGhpcywxMjAzLDIwMDcsYnkgbGF3cmVuY2UKICNpZiAxCi0JCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsMCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIDApOwogI2VuZGlmCiAJCX0KIAl9ZWxzZQogCQlpZWVlLT5zdGFydF9zY2FuKGllZWUtPmRldik7Ci0KIH0KIAogLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQotCXsKLQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKLQkJeworCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKSB7CisJCWlmIChJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQogCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwotCQl9CiAJfQogCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKIApAQCAtNzI3LDcgKzYwNSw2IEBACiAJCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKGllZWUpOwogCWVsc2UKIAkJaWVlZS0+c2Nhbl9zeW5jcm8oaWVlZS0+ZGV2KTsKLQogfQogCiBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgpAQCAtNzM5LDE1ICs2MTYsMTcgQEAKIAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICsgY2hhbGxlbmdlbGVuKTsKIAotCWlmICghc2tiKSByZXR1cm4gTlVMTDsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CiAKIAlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikKIAkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSk7CiAKIAlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FVVEg7Ci0JaWYgKGNoYWxsZW5nZWxlbikgYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9XRVA7CisJaWYgKGNoYWxsZW5nZWxlbikKKwkJYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9XRVA7CiAKLQlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7IC8vRklYTUUKKwlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7IC8qIEZJWE1FICovCiAKIAltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CiAJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwpAQCAtNzYxLDcgKzY0MCw2IEBACiAJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CiAKIAlyZXR1cm4gc2tiOwotCiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCkBAIC03NzIsMjkgKzY1MCwzMCBAQAogCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbl9idWY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZW5jcnlwdDsKLQlpbnQgYXRpbV9sZW4sZXJwX2xlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCWludCBhdGltX2xlbiwgZXJwX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OwogCiAJY2hhciAqc3NpZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkOwogCWludCBzc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKIAlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CiAJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKIAlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47Ci0JaWYocmF0ZV9leF9sZW4gPiAwKSByYXRlX2V4X2xlbis9MjsKKwlpZiAocmF0ZV9leF9sZW4gPiAwKQorCQlyYXRlX2V4X2xlbiArPSAyOwogCi0JaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykKIAkJYXRpbV9sZW4gPSA0OwogCWVsc2UKIAkJYXRpbV9sZW4gPSAwOwogCi0JaWYoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSkKKwlpZiAoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSkKIAkJZXJwX2xlbiA9IDM7CiAJZWxzZQogCQllcnBfbGVuID0gMDsKIAogCWJlYWNvbl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UpKwogCQlzc2lkX2xlbgotCQkrMyAvL2NoYW5uZWwKKwkJKzMgLyogY2hhbm5lbCAqLwogCQkrcmF0ZV9sZW4KIAkJK3JhdGVfZXhfbGVuCiAJCSthdGltX2xlbgpAQCAtODA2LDE5ICs2ODUsMTkgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKLQliZWFjb25fYnVmID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UqKSBza2JfcHV0KHNrYiwgYmVhY29uX3NpemUpOworCWJlYWNvbl9idWYgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2JfcHV0KHNrYiwgYmVhY29uX3NpemUpOwogCi0JbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOwotCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwltZW1jcHkoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CiAKLQliZWFjb25fYnVmLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLyogRklYTUUgKi8KIAliZWFjb25fYnVmLT5iZWFjb25faW50ZXJ2YWwgPQogCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKIAliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KIAkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CiAKLQlpZihpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKKwlpZiAoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpCiAJCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOwogCiAJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwpAQCAtODM1LDUxICs3MTQsNTIgQEAKIAliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuaWQgPSBNRklFX1RZUEVfU1NJRDsKIAliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQubGVuID0gc3NpZF9sZW47CiAKLQl0YWcgPSAodTgqKSBiZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuZGF0YTsKKwl0YWcgPSAodTggKikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmRhdGE7CiAKIAltZW1jcHkodGFnLCBzc2lkLCBzc2lkX2xlbik7CiAKIAl0YWcgKz0gc3NpZF9sZW47CiAKIAkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFUzsKLQkqKHRhZysrKSA9IHJhdGVfbGVuLTI7Ci0JbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXMscmF0ZV9sZW4tMik7Ci0JdGFnKz1yYXRlX2xlbi0yOworCSoodGFnKyspID0gcmF0ZV9sZW4gLSAyOworCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlcywgcmF0ZV9sZW4tMik7CisJdGFnICs9IHJhdGVfbGVuIC0gMjsKIAogCSoodGFnKyspID0gTUZJRV9UWVBFX0RTX1NFVDsKIAkqKHRhZysrKSA9IDE7CiAJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKIAotCWlmKGF0aW1fbGVuKXsKKwlpZiAoYXRpbV9sZW4pIHsKIAkJKih0YWcrKykgPSBNRklFX1RZUEVfSUJTU19TRVQ7CiAJCSoodGFnKyspID0gMjsKLQkJKigodTE2KikodGFnKSkgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOwotCQl0YWcrPTI7CisJCSooKHUxNiAqKSh0YWcpKSA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisJCXRhZyArPSAyOwogCX0KIAotCWlmKGVycF9sZW4peworCWlmIChlcnBfbGVuKSB7CiAJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKIAkJKih0YWcrKykgPSAxOwogCQkqKHRhZysrKSA9IDA7CiAJfQogCi0JaWYocmF0ZV9leF9sZW4peworCWlmIChyYXRlX2V4X2xlbikgewogCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKIAkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOwotCQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCxyYXRlX2V4X2xlbi0yKTsKLQkJdGFnKz1yYXRlX2V4X2xlbi0yOworCQltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgsIHJhdGVfZXhfbGVuLTIpOworCQl0YWcgKz0gcmF0ZV9leF9sZW4gLSAyOwogCX0KIAotCWlmICh3cGFfaWVfbGVuKQotCXsKLQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKLQkJey8vYXMgV2luZG93cyB3aWxsIHNldCBwYWlyd2lzZSBrZXkgc2FtZSBhcyB0aGUgZ3JvdXAga2V5IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIExpbnV4LCBzbyBzZXQgdGhpcyBmb3IgSU9UIGlzc3VlLiBXQiAyMDA4LjA3LjA3CisJaWYgKHdwYV9pZV9sZW4pCXsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkJLyogYXMgV2luZG93cyB3aWxsIHNldCBwYWlyd2lzZSBrZXkgc2FtZSBhcyB0aGUgZ3JvdXAKKwkJCSAqIGtleSB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiBMaW51eCwgc28gc2V0IHRoaXMgZm9yCisJCQkgKiBJT1QgaXNzdWUuCisJCQkgKi8KIAkJCW1lbWNweSgmaWVlZS0+d3BhX2llWzE0XSwgJmllZWUtPndwYV9pZVs4XSwgNCk7CiAJCX0KIAogCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOwogCX0KLQogCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OwogCXJldHVybiBza2I7CiB9CkBAIC04ODgsOSArNzY4LDkgQEAKIAkJCQkJICAgIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTgqIHRhZzsKKwl1OCAqdGFnOwogCi0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OwogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jOwogCXNob3J0IGVuY3J5cHQ7CiAKQEAgLTkwMywzNCArNzgzLDM2IEBACiAJCXJldHVybiBOVUxMOwogCiAJYXNzb2MgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKQotCQlza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpOworCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKIAogCWFzc29jLT5oZWFkZXIuZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQKTsKLQltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKIAltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJYXNzb2MtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSID8KIAkJV0xBTl9DQVBBQklMSVRZX0JTUyA6IFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKIAotCi0JaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwlpZiAoaWVlZS0+c2hvcnRfc2xvdCkKIAkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOwogCiAJaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKIAkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwotCWVsc2UgY3J5cHQgPSBOVUxMOworCWVsc2UKKwkJY3J5cHQgPSBOVUxMOwogCi0JZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisJZW5jcnlwdCA9IChjcnlwdCAmJiBjcnlwdC0+b3BzKTsKIAogCWlmIChlbmNyeXB0KQogCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CiAKIAlhc3NvYy0+c3RhdHVzID0gMDsKIAlhc3NvYy0+YWlkID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NfaWQpOwotCWlmIChpZWVlLT5hc3NvY19pZCA9PSAweDIwMDcpIGllZWUtPmFzc29jX2lkPTA7Ci0JZWxzZSBpZWVlLT5hc3NvY19pZCsrOworCWlmIChpZWVlLT5hc3NvY19pZCA9PSAweDIwMDcpCisJCWllZWUtPmFzc29jX2lkID0gMDsKKwllbHNlCisJCWllZWUtPmFzc29jX2lkKys7CiAKLQl0YWcgPSAodTgqKSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCXRhZyA9ICh1OCAqKSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOwogCiAJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CiAJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CkBAIC05NjIsMjEgKzg0NCwxOSBAQAogCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKIAlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOwogCXJldHVybiBza2I7Ci0KLQogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9udWxsX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBoZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKIAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqKXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCW1lbWNweShoZHItPmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKIAltZW1jcHkoaGRyLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwpAQCAtOTg3LDgzICs4NjcsNjQgQEAKIAkJKHB3ciA/IElFRUU4MDIxMV9GQ1RMX1BNOjApKTsKIAogCXJldHVybiBza2I7Ci0KLQogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CiAKLQlpZiAoYnVmKXsKKwlpZiAoYnVmKSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Ci0JCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOwogCX0KIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzcF90b19hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgcywgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hdXRoX3Jlc3AoaWVlZSwgcywgZGVzdCk7CiAKLQlpZiAoYnVmKXsKKwlpZiAoYnVmKSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Ci0JCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOwogCX0KIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzcF90b19wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCiB7Ci0KIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgZGVzdCk7CiAKIAlpZiAoYnVmKSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Ci0JCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOwogCX0KIH0KIAotCiBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgogaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKIAl1OCAqdGFnOwotCS8vc2hvcnQgaW5mb19hZGRyID0gMDsKLQkvL2ludCBpOwotCS8vdTE2IHN1aXRlX2NvdW50ID0gMDsKLQkvL3U4IHN1aXRfc2VsZWN0ID0gMDsKIAl1bnNpZ25lZCBpbnQgd3BhX2xlbiA9IGJlYWNvbi0+d3BhX2llX2xlbjsKLQkvL3N0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7Ci0JLy91bmlvbiBpd3JlcV9kYXRhIHdycXU7Ci0JLy91OCAqYnVmZjsKLQkvL3U4ICpwOwogI2lmIDEKLQkvLyBmb3IgdGVzdGluZyBwdXJwb3NlCisJLyogZm9yIHRlc3RpbmcgcHVycG9zZSAqLwogCXVuc2lnbmVkIGludCByc25fbGVuID0gYmVhY29uLT5yc25faWVfbGVuOwotI2Vsc2UKLQl1bnNpZ25lZCBpbnQgcnNuX2xlbiA9IGJlYWNvbi0+cnNuX2llX2xlbiAtIDQ7CiAjZW5kaWYKIAl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKIAl1bnNpZ25lZCBpbnQgd21tX2luZm9fbGVuID0gYmVhY29uLT5Rb1NfRW5hYmxlPzk6MDsKIAl1bnNpZ25lZCBpbnQgdHVyYm9faW5mb19sZW4gPSBiZWFjb24tPlR1cmJvX0VuYWJsZT85OjA7CiAKIAl1OCAgZW5jcnlfcHJvdG8gPSBpZWVlLT53cGF4X3R5cGVfbm90aWZ5ICYgMHhmZjsKLQkvL3U4ICBwYWlyd2lzZV90eXBlID0gKGllZWUtPndwYXhfdHlwZV9ub3RpZnkgPj4gOCkgJiAweGZmOwotCS8vdTggIGF1dGhlbl90eXBlID0gKGllZWUtPndwYXhfdHlwZV9ub3RpZnkgPj4gMTYpICYgMHhmZjsKIAogCWludCBsZW4gPSAwOwogCi0JLy9bMF0gTm90aWZ5IHR5cGUgb2YgZW5jcnlwdGlvbjogV1BBL1dQQTIKLQkvL1sxXSBwYWlyIHdpc2UgdHlwZQotCS8vWzJdIGF1dGhlbiB0eXBlCi0JaWYoaWVlZS0+d3BheF90eXBlX3NldCkgeworCS8qIFswXSBOb3RpZnkgdHlwZSBvZiBlbmNyeXB0aW9uOiBXUEEvV1BBMgorCSAqIFsxXSBwYWlyIHdpc2UgdHlwZQorCSAqIFsyXSBhdXRoZW4gdHlwZQorCSAqLworCWlmIChpZWVlLT53cGF4X3R5cGVfc2V0KSB7CiAJCWlmIChJRUVFX1BST1RPX1dQQSA9PSBlbmNyeV9wcm90bykgewogCQkJcnNuX2xlbiA9IDA7CiAJCX0gZWxzZSBpZiAoSUVFRV9QUk9UT19SU04gPT0gZW5jcnlfcHJvdG8pIHsKQEAgLTEwNzEsOCArOTMyLDggQEAKIAkJfQogCX0KIAlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsKLQkJKyBiZWFjb24tPnNzaWRfbGVuLy9lc3NpZCB0YWdnZWQgdmFsCi0JCSsgcmF0ZV9sZW4vL3JhdGVzIHRhZ2dlZCB2YWwKKwkJKyBiZWFjb24tPnNzaWRfbGVuIC8qIGVzc2lkIHRhZ2dlZCB2YWwgKi8KKwkJKyByYXRlX2xlbiAvKiByYXRlcyB0YWdnZWQgdmFsICovCiAJCSsgd3BhX2xlbgogCQkrIHJzbl9sZW4KIAkJKyB3bW1faW5mb19sZW4KQEAgLTEwODYsMjQgKzk0NywyMyBAQAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKikKIAkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKTsKIAotCiAJaGRyLT5oZWFkZXIuZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE7Ci0JaGRyLT5oZWFkZXIuZHVyYXRpb25faWQ9IDM3OyAvL0ZJWE1FCisJaGRyLT5oZWFkZXIuZHVyYXRpb25faWQgPSAzNzsgLyogRklYTUUgKi8KIAltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKIAltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoaWVlZS0+YXBfbWFjX2FkZHIsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsvL2ZvciBIVyBzZWN1cml0eSwgSm9obgorCW1lbWNweShpZWVlLT5hcF9tYWNfYWRkciwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOyAvKiBmb3IgSFcgc2VjdXJpdHkgKi8KIAogCWhkci0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9CU1MpOwotCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSApCisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQogCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOwogCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCiAJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpOwogCi0JaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwlpZiAoaWVlZS0+c2hvcnRfc2xvdCkKIAkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKIAotCWhkci0+bGlzdGVuX2ludGVydmFsID0gMHhhOyAvL0ZJWE1FCisJaGRyLT5saXN0ZW5faW50ZXJ2YWwgPSAweGE7IC8qIEZJWE1FICovCiAKIAloZHItPmluZm9fZWxlbWVudC5pZCA9IE1GSUVfVFlQRV9TU0lEOwogCkBAIC0xMTE2LDI3ICs5NzYsMjYgQEAKIAlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKIAlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKIAotCS8vYWRkIHJzbj09MCBjb25kaXRpb24gZm9yIGFwJ3MgbWl4IHNlY3VyaXR5IG1vZGUod3BhK3dwYTIpLCBqb2huMjAwNy44LjkKLQkvL2Nob29zZSBBRVMgZW5jcnlwdGlvbiBhcyBkZWZhdWx0IGFsZ29yaXRobSB3aGlsZSB1c2luZyBtaXhlZCBtb2RlCisJLyogYWRkIHJzbj09MCBjb25kaXRpb24gZm9yIGFwJ3MgbWl4IHNlY3VyaXR5IG1vZGUod3BhK3dwYTIpCisJICogY2hvb3NlIEFFUyBlbmNyeXB0aW9uIGFzIGRlZmF1bHQgYWxnb3JpdGhtIHdoaWxlIHVzaW5nIG1peGVkIG1vZGUuCisJICovCiAKLQl0YWcgPSBza2JfcHV0KHNrYixpZWVlLT53cGFfaWVfbGVuKTsKLQltZW1jcHkodGFnLGllZWUtPndwYV9pZSxpZWVlLT53cGFfaWVfbGVuKTsKKwl0YWcgPSBza2JfcHV0KHNrYiwgaWVlZS0+d3BhX2llX2xlbik7CisJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKIAotCXRhZyA9IHNrYl9wdXQoc2tiLHdtbV9pbmZvX2xlbik7Ci0JaWYod21tX2luZm9fbGVuKSB7CisJdGFnID0gc2tiX3B1dChza2IsIHdtbV9pbmZvX2xlbik7CisJaWYgKHdtbV9pbmZvX2xlbikKIAkgIGllZWU4MDIxMV9XTU1fSW5mbyhpZWVlLCAmdGFnKTsKLQl9Ci0JdGFnID0gc2tiX3B1dChza2IsdHVyYm9faW5mb19sZW4pOwotICAgICAgICBpZih0dXJib19pbmZvX2xlbikgewotICAgICAgICAgICAgICAgIGllZWU4MDIxMV9UVVJCT19JbmZvKGllZWUsICZ0YWcpOwotICAgICAgICB9CisKKwl0YWcgPSBza2JfcHV0KHNrYiwgdHVyYm9faW5mb19sZW4pOworCWlmICh0dXJib19pbmZvX2xlbikKKwkJaWVlZTgwMjExX1RVUkJPX0luZm8oaWVlZSwgJnRhZyk7CiAKIAlyZXR1cm4gc2tiOwogfQogCiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKQEAgLTExNDgsMTcgKzEwMDcsMTcgQEAKIAkgKiBIZXJlIHdlIHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIGdvb2QgbmV0cyB0byBhc3NvY2lhdGUKIAkgKiB3aXRoLCBzbyB3ZSByZXRyeSBvciBqdXN0IGdldCBiYWNrIHRvIE5PX0xJTksgYW5kIHNjYW5uaW5nCiAJICovCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyl7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORykgewogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hdXRoX3JzKys7Ci0JfWVsc2V7CisJfSBlbHNlIHsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkFzc29jaWF0aW9uIGZhaWxlZFxuIik7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXNzX3JzKys7CiAJfQogCiAJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlk7CiAKLQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSk7CisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTExNjgsNyArMTAyNyw2IEBACiAJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydCgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikgZGV2KTsKIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKQEAgLTExNzYsMjYgKzEwMzQsMjQgQEAKIAogCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTdG9wcGluZyBzY2FuXG4iKTsKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKLQlza2I9aWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIDApOwotCWlmICghc2tiKXsKLQorCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCAwKTsKKwlpZiAoIXNrYikgewogCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwotCX0KLQllbHNlewotCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyA7CisJfSBlbHNlIHsKKwkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkc7CiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcbiIpOwotCQkvL3ByaW50aygiLS0tU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKLQkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQkvKiBCVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5CisJCSAqIGJlIGJldHRlci4KKwkJICovCisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSkgewogCQkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CiAJCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJCX0KLQkJLy9JZiBjYWxsIGRldl9rZnJlZV9za2JfYW55LGEgd2FybmluZyB3aWxsIG9jdXIuLi4uCi0JCS8vS0VSTkVMOiBhc3NlcnRpb24gKCFhdG9taWNfcmVhZCgmc2tiLT51c2VycykpIGZhaWxlZCBhdCBuZXQvY29yZS9kZXYuYyAoMTcwOCkKLQkJLy9TbyAuLi4gMTIwNCBieSBsYXdyZW5jZS4KLQkJLy9wcmludGsoIlxuSW4gJXMsbGluZSAlZCBjYWxsIGtmcmVlIHNrYi4iLF9fZnVuY19fLF9fTElORV9fKTsKLQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJLyogSWYgY2FsbCBkZXZfa2ZyZWVfc2tiX2FueSxhIHdhcm5pbmcgd2lsbCBvY3VyLi4uLgorCQkgKiBLRVJORUw6IGFzc2VydGlvbiAoIWF0b21pY19yZWFkKCZza2ItPnVzZXJzKSkgZmFpbGVkIGF0CisJCSAqIG5ldC9jb3JlL2Rldi5jICgxNzA4KQorCQkgKi8KIAl9CiB9CiAKQEAgLTEyMDUsNyArMTA2MSw2IEBACiAJdTggKmM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7Ci0vLwlpbnQgaGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CiAJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7CkBAIC0xMjEzLDcgKzEwNjgsNyBAQAogCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCBjaGxlbisyKTsKIAlpZiAoIXNrYikKIAkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQllbHNleworCWVsc2UgewogCQljID0gc2tiX3B1dChza2IsIGNobGVuKzIpOwogCQkqKGMrKykgPSBNRklFX1RZUEVfQ0hBTExFTkdFOwogCQkqKGMrKykgPSBjaGxlbjsKQEAgLTEyMjEsMzggKzEwNzYsMzYgQEAKIAogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgcmVzcG9uc2VcbiIpOwogCi0JCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApKTsKKwkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpewotCQkvL3ByaW50aygiPT09PT09PT09PmFkZCB0aW1lciBhZ2FpbiwgdG8gY3Jhc2hcbiIpOworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpIHsKIAkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CiAJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAkJfQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CiAJa2ZyZWUoY2hhbGxlbmdlKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwogCiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAKIAlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0XG4iKTsKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2Fzc19ycSsrOwotCXNrYj1pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKGJlYWNvbiwgaWVlZSk7CisJc2tiID0gaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShiZWFjb24sIGllZWUpOwogCWlmICghc2tiKQogCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwotCWVsc2V7CisJZWxzZSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSkgewogCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKIAkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCQl9Ci0JCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJfQogfQogCkBAIC0xMjYxLDEyICsxMTE0LDExIEBACiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7Ci0JaWYoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgotCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKLQorCWlmIChpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpIHsKIAkJaWVlZS0+cmF0ZSA9IDU0MDsKIAkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKLQl9ZWxzZXsKKwl9IGVsc2UgewogCQlpZWVlLT5yYXRlID0gMTEwOwogCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXNcbiIpOwogCX0KQEAgLTEyNzksMTIgKzExMzEsOCBAQAogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWludCBpOwogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCi0JZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JICAvL2llZWUtPnNlcV9jdHJsW2ldID0gMDsKLQl9CiAJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwogCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZFxuIik7CiAKQEAgLTEzMTYsNyArMTE2NCw3IEBACiAJdTggdG1wX3NzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CiAJaW50IHRtcF9zc2lkX2xlbiA9IDA7CiAKLQlzaG9ydCBhcHNldCxzc2lkc2V0LHNzaWRicm9hZCxhcG1hdGNoLHNzaWRtYXRjaDsKKwlzaG9ydCBhcHNldCwgc3NpZHNldCwgc3NpZGJyb2FkLCBhcG1hdGNoLCBzc2lkbWF0Y2g7CiAKIAkvKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBuZXcgbmV3IG9ubHkgaWYgd2UgYXJlIG5vdCBhc3NvY2lhdGVkCiAJICogYW5kIHdlIGFyZSBub3QgYXNzb2NpYXRpbmcgLyBhdXRoZW50aWNhdGluZwpAQCAtMTMzMCw3NCArMTE3OCw3MCBAQAogCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKIAkJcmV0dXJuOwogCi0KLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyl7CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBBUCBNQUMsIHdlIG5lZWQgYWxzbyB0aGUgZXNzaWQKIAkJICogVGhpcyBjb3VsZCBiZSBvYnRhaW5lZCBieSBiZWFjb25zIG9yLCBpZiB0aGUgbmV0d29yayBkb2VzIG5vdAogCQkgKiBicm9hZGNhc3QgaXQsIGl0IGNhbiBiZSBwdXQgbWFudWFsbHkuCiAJCSAqLwotCQlhcHNldCA9IGllZWUtPndhcF9zZXQ7Ly8obWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgemVybyxFVEhfQUxFTikhPTAgKTsKLQkJc3NpZHNldCA9IGllZWUtPnNzaWRfc2V0Oy8vaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gIT0gJ1wwJzsKLQkJc3NpZGJyb2FkID0gICEobmV0LT5zc2lkX2xlbiA9PSAwIHx8IG5ldC0+c3NpZFswXT09ICdcMCcpOwotCQlhcG1hdGNoID0gKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIG5ldC0+YnNzaWQsIEVUSF9BTEVOKT09MCk7CisJCWFwc2V0ID0gaWVlZS0+d2FwX3NldDsKKwkJc3NpZHNldCA9IGllZWUtPnNzaWRfc2V0OworCQlzc2lkYnJvYWQgPSAgIShuZXQtPnNzaWRfbGVuID09IDAgfHwgbmV0LT5zc2lkWzBdID09ICdcMCcpOworCQlhcG1hdGNoID0gKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIG5ldC0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwKTsKIAotCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gIT0gbmV0LT5zc2lkX2xlbikKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiAhPSBuZXQtPnNzaWRfbGVuKQogCQkJc3NpZG1hdGNoID0gMDsKIAkJZWxzZQotCQkJc3NpZG1hdGNoID0gKDA9PXN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbikpOworCQkJc3NpZG1hdGNoID0gKDAgPT0gc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKSk7CiAKLQkJLy9wcmludGsoImN1cjogJXMsICVkLCBuZXQ6JXMsICVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuLCBuZXQtPnNzaWQsIG5ldC0+c3NpZF9sZW4pOwotCQkvL3ByaW50aygiYXBzZXQ9JWQgYXBtYXRjaD0lZCBzc2lkc2V0PSVkIHNzaWRicm9hZD0lZCBzc2lkbWF0Y2g9JWRcbiIsYXBzZXQsYXBtYXRjaCxzc2lkc2V0LHNzaWRicm9hZCxzc2lkbWF0Y2gpOwotCi0JCWlmICgJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBBUCBjaGVjayBpZiBtYXRjaC4KLQkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90IGJyb2FkY2FzdCBlc3NpZCB3ZSBjaGVjayB0aGUgdXNlciBzdXBwbGllZCBBTlkgZXNzaWQKLQkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkb2VzIG5vdCBzZXQgZXNzaWQgaXQgaXMgT0sKLQkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkaWQgc2V0IGVzc2lkIGNoZWNoIGlmIGVzc2lkIG1hdGNoCi0JCQkgKi8KLQkJCQkoIGFwc2V0ICYmIGFwbWF0Y2ggJiYKLQkJCQkgICgoc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fCAoc3NpZGJyb2FkICYmICFzc2lkc2V0KSB8fCAoIXNzaWRicm9hZCAmJiBzc2lkc2V0KSkgKSB8fAotCQkJCS8qIGlmIHRoZSBhcCBpcyBub3Qgc2V0LCBjaGVjayB0aGF0IHRoZSB1c2VyIHNldCB0aGUgYnNzaWQKLQkJCQkgKiBhbmQgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoYXQgdGhvc2UgdHdvIGJzc2lkIG1hdGNoZXMKLQkJCQkgKi8KLQkJCQkoIWFwc2V0ICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkKLQkJICAgKXsKLQotCisJCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgQVAgY2hlY2sgaWYgbWF0Y2guCisJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90IGJyb2FkY2FzdCBlc3NpZCB3ZSBjaGVjayB0aGUgdXNlcgorCQkgKiBzdXBwbGllZCBBTlkgZXNzaWQKKwkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRvZXMgbm90IHNldCBlc3NpZAorCQkgKiBpdCBpcyBPSworCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZGlkIHNldCBlc3NpZAorCQkgKiBjaGVjaCBpZiBlc3NpZCBtYXRjaAorCQkgKiAoYXBzZXQgJiYgYXBtYXRjaCAmJiAoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwKKwkJICogIChzc2lkYnJvYWQgJiYgIXNzaWRzZXQpIHx8ICghc3NpZGJyb2FkICYmIHNzaWRzZXQpKSkgfHwKKwkJICogaWYgdGhlIGFwIGlzIG5vdCBzZXQsIGNoZWNrIHRoYXQgdGhlIHVzZXIgc2V0IHRoZSBic3NpZCBhbmQKKwkJICogdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoYXQgdGhvc2UgdHdvIGJzc2lkIG1hdGNoZXMKKwkJICogKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpCisJCSAqLworCQlpZiAoKGFwc2V0ICYmIGFwbWF0Y2ggJiYgKChzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpIHx8CisJCSAgICAgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpKSB8fAorCQkgICAgKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpKSB7CiAJCQkvKiBpZiB0aGUgZXNzaWQgaXMgaGlkZGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUKIAkJCSAqIGVzc2lkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgogCQkJICovCi0JCQlpZiAoIXNzaWRicm9hZCl7CisJCQlpZiAoIXNzaWRicm9hZCkgewogCQkJCXN0cm5jcHkodG1wX3NzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7CiAJCQkJdG1wX3NzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOwogCQkJfQogCQkJbWVtY3B5KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIG5ldCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOwogCi0JCQlpZiAoIXNzaWRicm9hZCl7CisJCQlpZiAoIXNzaWRicm9hZCkgewogCQkJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHRtcF9zc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7CiAJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gdG1wX3NzaWRfbGVuOwogCQkJfQotCQkJcHJpbnRrKEtFUk5fSU5GTyJMaW5raW5nIHdpdGggJXM6IGNoYW5uZWwgaXMgJWRcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQkJcHJpbnRrKEtFUk5fSU5GTyJMaW5raW5nIHdpdGggJXM6IGNoYW5uZWwgaXMgJWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CiAKLQkJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgewogCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOwogCQkJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOwogCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKLQkJCX1lbHNlewotCQkJCWlmKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKLQkJCQkJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpeworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSkgewogCQkJCQlpZWVlLT5yYXRlID0gNTQwOwogCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOwotCQkJCX1lbHNleworCQkJCX0gZWxzZSB7CiAJCQkJCWllZWUtPnJhdGUgPSAxMTA7CiAJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CiAJCQkJfQogCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKIAkJCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKIAkJCX0KLQogCQl9CiAJfQotCiB9CiAKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCkBAIC0xNDA3LDYwICsxMjUxLDUyIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7Ci0KIAkJLyogaWYgdGhlIHN0YXRlIGJlY29tZSBkaWZmZXJlbnQgdGhhdCBOT0xJTksgbWVhbnMKIAkJICogd2UgaGFkIGZvdW5kIHdoYXQgd2UgYXJlIHNlYXJjaGluZyBmb3IKIAkJICovCi0KIAkJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCiAJCQlicmVhazsKIAogCQlpZiAoaWVlZS0+c2Nhbl9hZ2UgPT0gMCB8fCB0aW1lX2FmdGVyKHRhcmdldC0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQogCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCB0YXJnZXQpOwogCX0KLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQogfQogCi0KIHN0YXRpYyBpbmxpbmUgdTE2IGF1dGhfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKipjaGFsbGVuZ2UsIGludCAqY2hsZW4pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKIAl1OCAqdDsKLQlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7Ci0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLHNrYi0+bGVuKTsKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsIHNrYi0+bGVuKTsKIAkJcmV0dXJuIDB4Y2FmZTsKIAl9CiAJKmNoYWxsZW5nZSA9IE5VTEw7Ci0JYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOwotCWlmKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArMykpeworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKSBza2ItPmRhdGE7CisJaWYgKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArIDMpKSB7CiAJCXQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CiAKLQkJaWYoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpeworCQlpZiAoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpIHsKIAkJCSpjaGxlbiA9ICoodCsrKTsKIAkJCSpjaGFsbGVuZ2UgPSBrbWVtZHVwKHQsICpjaGxlbiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoISpjaGFsbGVuZ2UpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9Ci0KIAlyZXR1cm4gY3B1X3RvX2xlMTYoYS0+c3RhdHVzKTsKLQogfQogCi0KIHN0YXRpYyBpbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOwogCi0JaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpewotCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiAlZFxuIixza2ItPmxlbik7CisJaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKSB7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6ICVkXG4iLCBza2ItPmxlbik7CiAJCXJldHVybiAtMTsKIAl9Ci0JYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKSBza2ItPmRhdGE7CiAKLQltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGVzdCwgYS0+aGVhZGVyLmFkZHIyLCBFVEhfQUxFTik7CiAKIAlpZiAobGUxNl90b19jcHUoYS0+YWxnb3JpdGhtKSAhPSBXTEFOX0FVVEhfT1BFTikKIAkJcmV0dXJuICBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHOwpAQCAtMTQ3MywyMyArMTMwOSwyMyBAQAogewogCXU4ICp0YWc7CiAJdTggKnNrYmVuZDsKLQl1OCAqc3NpZD1OVUxMOworCXU4ICpzc2lkID0gTlVMTDsKIAl1OCBzc2lkbGVuID0gMDsKIAogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKmhlYWRlciA9CiAJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICopIHNrYi0+ZGF0YTsKIAotCWlmIChza2ItPmxlbiA8IHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSkKIAkJcmV0dXJuIC0xOyAvKiBjb3JydXB0ZWQgKi8KIAotCW1lbWNweShzcmMsaGVhZGVyLT5hZGRyMiwgRVRIX0FMRU4pOworCW1lbWNweShzcmMsIGhlYWRlci0+YWRkcjIsIEVUSF9BTEVOKTsKIAotCXNrYmVuZCA9ICh1OCopc2tiLT5kYXRhICsgc2tiLT5sZW47CisJc2tiZW5kID0gKHU4ICopc2tiLT5kYXRhICsgc2tiLT5sZW47CiAKLQl0YWcgPSBza2ItPmRhdGEgKyBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApOworCXRhZyA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKLQl3aGlsZSAodGFnKzEgPCBza2JlbmQpewotCQlpZiAoKnRhZyA9PSAwKXsKKwl3aGlsZSAodGFnKzEgPCBza2JlbmQpIHsKKwkJaWYgKCp0YWcgPT0gMCkgewogCQkJc3NpZCA9IHRhZysyOwogCQkJc3NpZGxlbiA9ICoodGFnKzEpOwogCQkJYnJlYWs7CkBAIC0xNDk5LDEwICsxMzM1LDEyIEBACiAJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbmV4dCB0YWcgKi8KIAl9CiAKLQkvL0lFRUU4MDIxMURNRVNHKCJDYXJkIE1BQyBhZGRyZXNzIGlzICJNQUNTVFIsIE1BQzJTVFIoc3JjKSk7Ci0JaWYgKHNzaWRsZW4gPT0gMCkgcmV0dXJuIDE7CisJaWYgKHNzaWRsZW4gPT0gMCkKKwkJcmV0dXJuIDE7CiAKLQlpZiAoIXNzaWQpIHJldHVybiAxOyAvKiBzc2lkIG5vdCBmb3VuZCBpbiB0YWdnZWQgcGFyYW0gKi8KKwlpZiAoIXNzaWQpCisJCSByZXR1cm4gMTsgLyogc3NpZCBub3QgZm91bmQgaW4gdGFnZ2VkIHBhcmFtICovCisKIAlyZXR1cm4gKCFzdHJuY21wKHNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBzc2lkbGVuKSk7CiAKIH0KQEAgLTE1MTQsMTMgKzEzNTIsMTMgQEAKIAlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkgLQogCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgewogCi0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6JWQgXG4iLCBza2ItPmxlbik7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6JWRcbiIsIHNrYi0+bGVuKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKikgc2tiLT5kYXRhOworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICopIHNrYi0+ZGF0YTsKIAotCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMixFVEhfQUxFTik7CisJbWVtY3B5KGRlc3QsIGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTI4LDEyICsxMzY2LDEyIEBACiBzdGF0aWMgaW5saW5lIHUxNiBhc3NvY19wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKmFpZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphOwotCWlmIChza2ItPmxlbiA8ICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpeworCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSkgewogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIiwgc2tiLT5sZW4pOwogCQlyZXR1cm4gMHhjYWZlOwogCX0KIAotCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopIHNrYi0+ZGF0YTsKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikgc2tiLT5kYXRhOwogCSphaWQgPSBsZTE2X3RvX2NwdShhLT5haWQpICYgMHgzZmZmOwogCXJldHVybiBsZTE2X3RvX2NwdShhLT5zdGF0dXMpOwogfQpAQCAtMTU0MywxMSArMTM4MSw4IEBACiB7CiAJdTggZGVzdFtFVEhfQUxFTl07CiAKLQkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfcHJvYmVfcnErKzsKLQkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOwotCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKLQkJLy9JRUVFODAyMTFETUVTRygiV2FzIGZvciBtZSEiKTsKKwlpZiAocHJvYmVfcnFfcGFyc2UoaWVlZSwgc2tiLCBkZXN0KSkgewogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JzKys7CiAJCWllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKGllZWUsIGRlc3QpOwogCX0KQEAgLTE1NTgsMTE1ICsxMzkzLDkyIEBACiB7CiAJdTggZGVzdFtFVEhfQUxFTl07CiAJaW50IHN0YXR1czsKLQkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9ycSsrOwogCiAJc3RhdHVzID0gYXV0aF9ycV9wYXJzZShza2IsIGRlc3QpOwotCWlmIChzdGF0dXMgIT0gLTEpIHsKKwlpZiAoc3RhdHVzICE9IC0xKQogCQlpZWVlODAyMTFfcmVzcF90b19hdXRoKGllZWUsIHN0YXR1cywgZGVzdCk7Ci0JfQotCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7Ci0KIH0KIAotIGlubGluZSB2b2lkCitpbmxpbmUgdm9pZAogaWVlZTgwMjExX3J4X2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCiAJdTggZGVzdFtFVEhfQUxFTl07Ci0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfcnErKzsKLQlpZiAoYXNzb2NfcnFfcGFyc2Uoc2tiLGRlc3QpICE9IC0xKXsKKwlpZiAoYXNzb2NfcnFfcGFyc2Uoc2tiLCBkZXN0KSAhPSAtMSkKIAkJaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoaWVlZSwgZGVzdCk7Ci0JfQorCiAKIAlwcmludGsoS0VSTl9JTkZPIk5ldyBjbGllbnQgYXNzb2NpYXRlZDogJXBNXG4iLCBkZXN0KTsKIH0KIAotCi0KIHZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKIHsKLQogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfbnVsbF9mdW5jKGllZWUsIHB3cik7CiAKIAlpZiAoYnVmKQogCQlzb2Z0bWFjX3BzX21nbXRfeG1pdChidWYsIGllZWUpOwotCiB9CiAKLQogc3RhdGljIHNob3J0IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHUzMiAqdGltZV9oLAogCQkJICAgICB1MzIgKnRpbWVfbCkKIHsKLSAgICAgICAgaW50IHRpbWVvdXQgPSAwOworCWludCB0aW1lb3V0ID0gMDsKIAogCXU4IGR0aW07Ci0JLyppZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKLQkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8Ci0JCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCi0KLQkJcmV0dXJuIDA7Ci0JKi8KIAlkdGltID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YTsKLQkvL3ByaW50aygiRFRJTVxuIik7CiAKLQlpZighKGR0aW0gJiBJRUVFODAyMTFfRFRJTV9WQUxJRCkpCisJaWYgKCEoZHRpbSAmIElFRUU4MDIxMV9EVElNX1ZBTElEKSkKIAkJcmV0dXJuIDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aW1lb3V0ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKKwllbHNlCisJCXRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOwogCi0JLy9wcmludGsoIlZBTElEXG4iKTsKIAlpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fSU5WQUxJRDsKIAotCWlmKGR0aW0gJiAoKElFRUU4MDIxMV9EVElNX1VDQVNUIHwgSUVFRTgwMjExX0RUSU1fTUJDQVNUKSYgaWVlZS0+cHMpKQorCWlmIChkdGltICYgKChJRUVFODAyMTFfRFRJTV9VQ0FTVCB8IElFRUU4MDIxMV9EVElNX01CQ0FTVCkgJiBpZWVlLT5wcykpCiAJCXJldHVybiAyOwogCi0JaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+ZGV2LT50cmFuc19zdGFydCArIE1TRUNTKHRpbWVvdXQpKSkKKwlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+ZGV2LT50cmFuc19zdGFydCArIE1TRUNTKHRpbWVvdXQpKSkKIAkJcmV0dXJuIDA7CiAKLQlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBNU0VDUyh0aW1lb3V0KSkpCisJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmxhc3RfcnhfcHNfdGltZSArIE1TRUNTKHRpbWVvdXQpKSkKIAkJcmV0dXJuIDA7CiAKLQlpZigoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKSAmJgorCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpICYmCiAJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwgIT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKSkKIAkJcmV0dXJuIDA7CiAKLQlpZih0aW1lX2wpeworCWlmICh0aW1lX2wpIHsKIAkJKnRpbWVfbCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0KIAkJCSsgTVNFQ1MoKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpKTsKLQkJCS8vKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpKTsKLQkJCS8vcHJpbnRrKCJiZWFjb25faW50ZXJ2YWw6JXgsIGR0aW1fcGVyaW9kOiV4LCB0b3RvbCB0byBNc2VjczoleCwgSFo6JXhcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwsIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCwgTVNFQ1MoKChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSkpLCBIWik7CiAJfQogCi0JaWYodGltZV9oKXsKKwlpZiAodGltZV9oKSB7CiAJCSp0aW1lX2ggPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzFdOwotCQlpZih0aW1lX2wgJiYgKnRpbWVfbCA8IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0pCisJCWlmICh0aW1lX2wgJiYgKnRpbWVfbCA8IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0pCiAJCQkqdGltZV9oICs9IDE7CiAJfQogCiAJcmV0dXJuIDE7Ci0KLQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YV9wcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAotCXUzMiB0aCx0bDsKKwl1MzIgdGgsIHRsOwogCXNob3J0IHNsZWVwOwogCi0JdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MyOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmKChpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKLQorCWlmICgoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CiAJCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAotCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSl7CisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKSB7CiAKLQkJLy8jd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwkJLyogI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAKIAkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMSk7CkBAIC0xNjc0LDcxICsxNDg2LDU3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAl9CiAKLQlzbGVlcCA9IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoaWVlZSwmdGgsICZ0bCk7Ci0vLwlwcmludGsoIj09PT4lcywlZFsyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZ10sIGllZWUtPnN0YV9zbGVlcCA9ICVkXG4iLF9fZnVuY19fLCBzbGVlcCxpZWVlLT5zdGFfc2xlZXApOworCXNsZWVwID0gaWVlZTgwMjExX3N0YV9wc19zbGVlcChpZWVlLCAmdGgsICZ0bCk7CiAJLyogMiB3YWtlLCAxIHNsZWVwLCAwIGRvIG5vdGhpbmcgKi8KLQlpZihzbGVlcCA9PSAwKQorCWlmIChzbGVlcCA9PSAwKQogCQlnb3RvIG91dDsKIAotCWlmKHNsZWVwID09IDEpeworCWlmIChzbGVlcCA9PSAxKSB7CisJCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gMSkKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldiwgdGgsIHRsKTsKIAotCQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMSkKLQkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldix0aCx0bCk7Ci0KLQkJZWxzZSBpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7Ci0JLy8JCXByaW50aygic2VuZCBudWxsIDFcbiIpOworCQllbHNlIGlmIChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKLQotCQkJaWYoaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkoaWVlZS0+ZGV2KSl7Ci0KLQorCQkJaWYgKGllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KGllZWUtPmRldikpIHsKIAkJCQlpZWVlLT5zdGFfc2xlZXAgPSAyOwogCiAJCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKIAotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsMSk7CisJCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMSk7CiAKIAkJCQlpZWVlLT5wc190aCA9IHRoOwogCQkJCWllZWUtPnBzX3RsID0gdGw7CiAJCQl9CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7Ci0KIAkJfQotCi0KLQl9ZWxzZSBpZihzbGVlcCA9PSAyKXsKLS8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJfSBlbHNlIGlmIChzbGVlcCA9PSAyKSB7CisJCS8qICN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRSAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwogCi0JLy8JcHJpbnRrKCJzZW5kIHdha2V1cCBwYWNrZXRcbiIpOwotCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDEpOworCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLCAxKTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAJfQotCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCiB9CiAKIHZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKQogewotCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAwKXsKLQkJaWYobmwpewotCQkvLwlwcmludGsoIldhcm5pbmc6IGRyaXZlciBpcyBwcm9iYWJseSBmYWlsaW5nIHRvIHJlcG9ydCBUWCBwcyBlcnJvclxuIik7CisJaWYgKGllZWUtPnN0YV9zbGVlcCA9PSAwKSB7CisJCWlmIChubCkgewogCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKIAkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwogCQl9CiAJCXJldHVybjsKLQogCX0KIAotCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAxKQorCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gMSkKIAkJaWVlZS0+c3RhX3dha2VfdXAoaWVlZS0+ZGV2KTsKIAogCWllZWUtPnN0YV9zbGVlcCA9IDA7CiAKLQlpZihubCl7CisJaWYgKG5sKSB7CiAJCWllZWUtPnBzX3JlcXVlc3RfdHhfYWNrKGllZWUtPmRldik7CiAJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwogCX0KQEAgLTE3NDYsMjUgKzE1NDQsMjAgQEAKIAogdm9pZCBpZWVlODAyMTFfcHNfdHhfYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBzdWNjZXNzKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsZmxhZ3MyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0JaWYoaWVlZS0+c3RhX3NsZWVwID09IDIpeworCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gMikgewogCQkvKiBOdWxsIGZyYW1lIHdpdGggUFMgYml0IHNldCAqLwotCQlpZihzdWNjZXNzKXsKLQotCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gJXM6OmVudGVyIHNsZWVwIHN0YXRlXG4iLF9fZnVuY19fKTsKKwkJaWYgKHN1Y2Nlc3MpIHsKIAkJCWllZWUtPnN0YV9zbGVlcCA9IDE7Ci0JCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsaWVlZS0+cHNfdGgsaWVlZS0+cHNfdGwpOworCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LCBpZWVlLT5wc190aCwgaWVlZS0+cHNfdGwpOwogCQl9CiAJCS8qIGlmIHRoZSBjYXJkIHJlcG9ydCBub3Qgc3VjY2VzcyB3ZSBjYW4ndCBiZSBzdXJlIHRoZSBBUAogCQkgKiBoYXMgbm90IFJYZWQgc28gd2UgY2FuJ3QgYXNzdW1lIHRoZSBBUCBiZWxpZXZlIHVzIGF3YWtlCiAJCSAqLwotCX0KLQkvKiAyMTExMjAwNSAtIHR4IGFnYWluIG51bGwgd2l0aG91dCBQUyBiaXQgaWYgbG9zdCAqLwotCWVsc2UgewotCi0JCWlmKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpeworCX0gZWxzZSB7CisJCWlmICgoaWVlZS0+c3RhX3NsZWVwID09IDApICYmICFzdWNjZXNzKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwogCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CkBAIC0xNzgwLDE2ICsxNTczLDE2IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CiAJdTE2IGVycmNvZGU7Ci0JdTgqIGNoYWxsZW5nZT1OVUxMOwotCWludCBjaGxlbj0wOwotCWludCBhaWQ9MDsKKwl1OCAqY2hhbGxlbmdlID0gTlVMTDsKKwlpbnQgY2hsZW4gPSAwOworCWludCBhaWQgPSAwOwogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jX3Jlc3A7CiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudDsKIAotCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZihpZWVlLT5zdGFfc2xlZXAgfHwgKGllZWUtPnBzICE9IElFRUU4MDIxMV9QU19ESVNBQkxFRCAmJgorCWlmIChpZWVlLT5zdGFfc2xlZXAgfHwgKGllZWUtPnBzICE9IElFRUU4MDIxMV9QU19ESVNBQkxFRCAmJgogCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgJiYKIAkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpCiAKQEAgLTE4MDAsMzAgKzE1OTMsMjcgQEAKIAkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKIAogCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jb250cm9sKSkgewotCiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6CiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUDoKLQogCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFtSRV1BU1NPQ0lBVElPTiBSRVNQT05TRSAoJWQpXG4iLAogCQkJCQlXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOwogCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKIAkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRCAmJgotCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7Ci0JCQkJaWYgKDAgPT0gKGVycmNvZGU9YXNzb2NfcGFyc2Uoc2tiLCAmYWlkKSkpeworCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJCWVycmNvZGUgPSBhc3NvY19wYXJzZShza2IsICZhaWQpOworCQkJCWlmICgwID09IGVycmNvZGUpIHsKIAkJCQkJdTE2IGxlZnQ7CiAKLQkJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKKwkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwogCQkJCQlpZWVlLT5hc3NvY19pZCA9IGFpZDsKIAkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3Nfb2srKzsKLQotCQkJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIm5pY190eXBlID0gJXMiLCAocnhfc3RhdHMtPm5pY190eXBlID09IDEpPyJydGw4MTg3IjoicnRsODE4N0IiKTsKLQkJCQkJaWYoMSA9PSByeF9zdGF0cy0+bmljX3R5cGUpIC8vY2FyZCB0eXBlIGlzIDgxODcKLQkJCQkJeworCQkJCQkvKiBjYXJkIHR5cGUgaXMgODE4NyAqLworCQkJCQlpZiAoMSA9PSByeF9zdGF0cy0+bmljX3R5cGUpCiAJCQkJCQlnb3RvIGFzc29jaWF0ZV9jb21wbGV0ZTsKLQkJCQkJfQotCQkJCQlhc3NvY19yZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKXNrYi0+ZGF0YTsKLQkJCQkJaW5mb19lbGVtZW50ID0gCSZhc3NvY19yZXNwLT5pbmZvX2VsZW1lbnQ7Ci0JCQkJCWxlZnQgPSBza2ItPmxlbiAtICgodm9pZCopaW5mb19lbGVtZW50IC0gKHZvaWQqKWFzc29jX3Jlc3ApOworCisJCQkJCWFzc29jX3Jlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKXNrYi0+ZGF0YTsKKwkJCQkJaW5mb19lbGVtZW50ID0gJmFzc29jX3Jlc3AtPmluZm9fZWxlbWVudDsKKwkJCQkJbGVmdCA9IHNrYi0+bGVuIC0gKCh2b2lkICopaW5mb19lbGVtZW50IC0gKHZvaWQgKilhc3NvY19yZXNwKTsKIAogCQkJCQl3aGlsZSAobGVmdCA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSkgewogCQkJCQkJaWYgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsgaW5mb19lbGVtZW50LT5sZW4gPiBsZWZ0KSB7CkBAIC0xODMyLDMyICsxNjIyLDMzIEBACiAJCQkJCQl9CiAJCQkJCQlzd2l0Y2ggKGluZm9fZWxlbWVudC0+aWQpIHsKIAkJCQkJCSAgY2FzZSBNRklFX1RZUEVfR0VORVJJQzoKLQkJCQkJCSAgICAgICAgIElFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCQkJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLCBpbmZvX2VsZW1lbnQtPmxlbik7CiAJCQkJCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDggICYmCiAJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCiAJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCiAJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCiAJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyICYmCiAJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVs0XSA9PSAweDAxKSB7Ci0JCQkJCQkJICAgIC8vIE5vdCBjYXJlIGFib3V0IHZlcnNpb24gYXQgcHJlc2VudC4KLQkJCQkJCQkgICAgLy9XTU0gUGFyYW1ldGVyIEVsZW1lbnQKLQkJCQkJCQkgICAgbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1fcGFyYW0sKHU4KikoaW5mb19lbGVtZW50LT5kYXRhXAotCQkJCQkJCQkJCSAgICArIDgpLChpbmZvX2VsZW1lbnQtPmxlbiAtIDgpKTsKKwkJCQkJCQkJLyogTm90IGNhcmUgYWJvdXQgdmVyc2lvbiBhdCBwcmVzZW50LgorCQkJCQkJCQkgKiBXTU0gUGFyYW1ldGVyIEVsZW1lbnQuCisJCQkJCQkJCSAqLworCQkJCQkJCQltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9wYXJhbSwgKHU4ICopKGluZm9fZWxlbWVudC0+ZGF0YVwKKwkJCQkJCQkJCSsgOCksIChpbmZvX2VsZW1lbnQtPmxlbiAtIDgpKTsKIAotCQkJCQkgCSAgICAgICAgICAgIGlmICgoKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mb15pbmZvX2VsZW1lbnQtPmRhdGFbNl0pJiBcCi0JCQkJCQkJCQkJICAgIDB4MGYpfHwoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykpIHsKLQkJCQkJCSAgIAkgICAgICAvLyByZWZyZXNoIHBhcmFtZXRlciBlbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKLQkJCQkJCQkgICAgICAvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIHBhcmFtZXRlciBmb3IgaGFyZHdhcmUKLQkJCQkJCQkgICAgICBpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOwotCQkJCQkJCSAgICAgIHF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKLQotCQkJCQkJICAgICAgICAgICAgfQotCQkJCQkJICAgICAgICAgICAgLy91cGRhdGUgaW5mb19lbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKLQkJCQkJCSAgICAgICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mbyAgPSBpbmZvX2VsZW1lbnQtPmRhdGFbNl07CisJCQkJCQkJCWlmICgoKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mb15pbmZvX2VsZW1lbnQtPmRhdGFbNl0pJiBcCisJCQkJCQkJCQkJICAgIDB4MGYpIHx8ICghaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSkgeworCQkJCQkJCQkJLyogcmVmcmVzaCBwYXJhbWV0ZXIgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCisJCQkJCQkJCQkgKiB1cGRhdGUgdGhlIHJlZ2lzdGVyIHBhcmFtZXRlciBmb3IgaGFyZHdhcmUuCisJCQkJCQkJCQkgKi8KKwkJCQkJCQkJCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7CisJCQkJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJLyogdXBkYXRlIGluZm9fZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrICovCisJCQkJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mbyAgPSBpbmZvX2VsZW1lbnQtPmRhdGFbNl07CiAJCQkJCQkJfQogCQkJCQkJCWJyZWFrOwogCQkJCQkJICBkZWZhdWx0OgotCQkJCQkJCS8vbm90aGluZyB0byBkbyBhdCBwcmVzZW50ISEhCisJCQkJCQkJLyogbm90aGluZyB0byBkbyBhdCBwcmVzZW50ISEhICovCiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAKQEAgLTE4NjYsMTQgKzE2NTcsMTQgQEAKIAkJCQkJCWluZm9fZWxlbWVudCA9IChzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqKQogCQkJCQkJCSZpbmZvX2VsZW1lbnQtPmRhdGFbaW5mb19lbGVtZW50LT5sZW5dOwogCQkJCQl9Ci0JCQkJCWlmKCFpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcpIC8vbGVnYWN5IEFQLCByZXNldCB0aGUgQUNfeHhfcGFyYW0gcmVnaXN0ZXIKLQkJCQkJewotCQkJCQkJcXVldWVfd29yayhpZWVlLT53cSwmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7Ci0JCQkJCQlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOy8vaW5kaWNhdGUgQUNfeHhfcGFyYW0gdXBhdGVkIHNpbmNlIGxhc3QgYXNzb2NpYXRlCisJCQkJCS8qIGxlZ2FjeSBBUCwgcmVzZXQgdGhlIEFDX3h4X3BhcmFtIHJlZ2lzdGVyICovCisJCQkJCWlmICghaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSB7CisJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7CisJCQkJCQlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOyAvKiBpbmRpY2F0ZSBBQ194eF9wYXJhbSB1cGF0ZWQgc2luY2UgbGFzdCBhc3NvY2lhdGUgKi8KIAkJCQkJfQogYXNzb2NpYXRlX2NvbXBsZXRlOgogCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKGllZWUpOwotCQkJCX1lbHNleworCQkJCX0gZWxzZSB7CiAJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX2VycisrOwogCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgKIAkJCQkJCSJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLApAQCAtMTg4Miw0NyArMTY3Myw0MSBAQAogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwotCiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUToKIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6Ci0KIAkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCiAJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKIAogCQkJCWllZWU4MDIxMV9yeF9hc3NvY19ycShpZWVlLCBza2IpOwogCQkJYnJlYWs7Ci0KIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKLQotCQkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKXsKKwkJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgewogCQkJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgJiYKIAkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpewotCiAJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKIAotCQkJCQkJaWYgKDAgPT0gKGVycmNvZGU9YXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbikpKXsKLQkJCQkJCQlpZihpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKXsKKwkJCQkJCWVycmNvZGUgPSBhdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKTsKKwkJCQkJCWlmICgwID09IGVycmNvZGUpIHsKKwkJCQkJCQlpZiAoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSkgewogCQkJCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEOwogCQkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKIAogCQkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOwotCQkJCQkJCX1lbHNleworCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCWllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CiAJCQkJCQkJfQotCQkJCQkJfWVsc2V7CisJCQkJCQl9IGVsc2UgewogCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19lcnIrKzsKLQkJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7CisJCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXgiLCBlcnJjb2RlKTsKIAkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwogCQkJCQkJfQogCi0JCQkJCX1lbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJCQkJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CiAJCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOwogCQkJCQl9CiAJCQkJfQogCQkJYnJlYWs7Ci0KIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgotCiAJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUykgJiYKIAkJCQkoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAogCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCkBAIC0xOTMwLDM2ICsxNzE1LDI4IEBACiAKIAkJCQlpZWVlODAyMTFfcnhfcHJvYmVfcnEoaWVlZSwgc2tiKTsKIAkJCWJyZWFrOwotCiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DOgogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6CiAJCQkvKiBGSVhNRSBmb3Igbm93IHJlcGVhdCBhbGwgdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZQotCQkJKiBib3RoIGZvciBkaXNhc3NvY2lhdGlvbiBhbmQgZGVhdXRoZW50aWNhdGlvbgotCQkJKi8KKwkJCSAqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCisJCQkgKi8KIAkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCiAJCQkJKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmCiAJCQkJKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYKLQkJCQkoIW1lbWNtcChoZWFkZXItPmFkZHIyLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCxFVEhfQUxFTikpKXsKKwkJCQkoIW1lbWNtcChoZWFkZXItPmFkZHIyLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKSkpIHsKIAkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKIAkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJlYXNzb2MrKzsKIAotCQkJCS8vbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOyAgLy9ZSixkZWwsMDgwODI4LCBkbyBub3Qgbm90aWZ5IG9zIGhlcmUKIAkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CiAJCQl9Ci0KIAkJCWJyZWFrOwotCiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLTE7CiAJCQlicmVhazsKIAl9Ci0KLQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKLQotCiAvKiBmb2xsb3dpbmcgYXJlIGZvciBhIHNpbXBsZXIgVFggcXVldWUgbWFuYWdlbWVudC4KICAqIEluc3RlYWQgb2YgdXNpbmcgbmV0aWZfW3N0b3Avd2FrZV1fcXVldWUgdGhlIGRyaXZlcgogICogd2lsbCB1c2VzIHRoZXNlIHR3byBmdW5jdGlvbiAocGx1cyBhIHJlc2V0IG9uZSksIHRoYXQKQEAgLTE5ODIsMjcgKzE3NTksMjMgQEAKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLAogCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCi0KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCAgaTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCiAJLyogY2FsbGVkIHdpdGggMm5kIHBhcm0gMCwgbm8gdHggbWdtdCBsb2NrIHJlcXVpcmVkICovCi0JaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLCAwKTsKIAotCWZvcihpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykgewotCi0JCWlmIChpZWVlLT5xdWV1ZV9zdG9wKXsKKwlmb3IgKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CisJCWlmIChpZWVlLT5xdWV1ZV9zdG9wKSB7CiAJCQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IHR4YjsKIAkJCWllZWUtPnR4X3BlbmRpbmcuZnJhZyA9IGk7CiAJCQlnb3RvIGV4aXQ7Ci0JCX1lbHNleworCQl9IGVsc2UgewogCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKIAkJCQl0eGItPmZyYWdtZW50c1tpXSwKLQkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7Ci0JCQkJLy8oaSsxKTx0eGItPm5yX2ZyYWdzKTsKKwkJCQlpZWVlLT5kZXYsIGllZWUtPnJhdGUpOwogCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJaWVlZS0+c3RhdHMudHhfYnl0ZXMgKz0gdHhiLT5mcmFnbWVudHNbaV0tPmxlbjsKIAkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwpAQCAtMjAxMiw2NiArMTc4NSw1OSBAQAogCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOwogCiAJZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLwogc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3VtZV90eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpbnQgaTsKLQlmb3IoaSA9IGllZWUtPnR4X3BlbmRpbmcuZnJhZzsgaSA8IGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFnczsgaSsrKSB7CisJZm9yIChpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKIAotCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7CisJCWlmIChpZWVlLT5xdWV1ZV9zdG9wKSB7CiAJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOwogCQkJcmV0dXJuOwotCQl9ZWxzZXsKLQorCQl9IGVsc2UgewogCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKIAkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAotCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKLQkJCQkvLyhpKzEpPGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFncyk7CisJCQkJaWVlZS0+ZGV2LCBpZWVlLT5yYXRlKTsKIAkJCWllZWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCQl9CiAJfQogCi0KIAlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOwogCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJaW5pdF9tZ210X3F1ZXVlKGllZWUpOwotCWlmIChpZWVlLT50eF9wZW5kaW5nLnR4Yil7CisJaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKSB7CiAJCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CiAJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKIAl9CiAJaWVlZS0+cXVldWVfc3RvcCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX3J0bF93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCWlmICghIGllZWUtPnF1ZXVlX3N0b3ApIGdvdG8gZXhpdDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWlmICghaWVlZS0+cXVldWVfc3RvcCkKKwkJZ290byBleGl0OwogCiAJaWVlZS0+cXVldWVfc3RvcCA9IDA7CiAKLQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSl7Ci0JCXdoaWxlICghaWVlZS0+cXVldWVfc3RvcCAmJiAoc2tiID0gZGVxdWV1ZV9tZ210KGllZWUpKSl7Ci0KKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpIHsKKwkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKSB7CiAJCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKIAogCQkJaGVhZGVyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOwpAQCAtMjA4MSw0MiArMTg0NywzMiBAQAogCQkJZWxzZQogCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CiAKLQkJCS8vcHJpbnRrKEtFUk5fQUxFUlQgImllZWU4MDIxMV93YWtlX3F1ZXVlIFxuIik7Ci0JCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYsIGllZWUtPmJhc2ljX3JhdGUpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJfQogCX0KIAlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgaWVlZS0+dHhfcGVuZGluZy50eGIpCiAJCWllZWU4MDIxMV9yZXN1bWVfdHgoaWVlZSk7CiAKLQlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKSB7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eGF3YWtlKys7CiAJCW5ldGlmX3dha2VfcXVldWUoaWVlZS0+ZGV2KTsKIAl9Ci0KLWV4aXQgOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9CiAKLQogdm9pZCBpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwotCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCi0JaWYgKCEgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGllZWUtPmRldik7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eHN0b3ArKzsKIAl9CiAJaWVlZS0+cXVldWVfc3RvcCA9IDE7Ci0JLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKLQogfQogCi0KIGlubGluZSB2b2lkIGllZWU4MDIxMV9yYW5kb21pemVfY2VsbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQogCXJhbmRvbV9ldGhlcl9hZGRyKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCk7CiB9CiAKQEAgLTIxMjUsNyArMTg4MSw3IEBACiB7CiAJaWVlZS0+YXNzb2NfaWQgPSAxOwogCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKIAkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKIAkJCUlFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lELAogCQkJSVdfRVNTSURfTUFYX1NJWkUpOwpAQCAtMjE0OSw3ICsxOTA1LDcgQEAKIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihpZWVlLT5yYXdfdHgpeworCWlmIChpZWVlLT5yYXdfdHgpIHsKIAogCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKIAkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKQEAgLTIxNzMsOSArMTkyOSw4IEBACiAKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCi0KLQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApewotCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCkgeworCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gc3RybGVuKElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKIAkJaWVlZS0+c3NpZF9zZXQgPSAxOwogCX0KQEAgLTIxODMsNyArMTkzOCw3IEBACiAJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGNlbGwgaW4gb3VyIG5ldHdvcmsgbGlzdCAqLwogCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOwogCi0JaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSAxMDsKIAkvKiBpZiBub3QgdGhlbiB0aGUgc3RhdGUgaXMgbm90IGxpbmtlZC4gTWF5YmUgdGhlIHVzZXIgc3dpdGNoZWQgdG8KIAkgKiBhZC1ob2MgbW9kZSBqdXN0IGFmdGVyIGJlaW5nIGluIG1vbml0b3IgbW9kZSwgb3IganVzdCBhZnRlcgpAQCAtMjIwMywxMyArMTk1OCwxMiBAQAogCQlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7CiAKIAkvKiB0aGUgbmV0d29yayBkZWZpbml0aXZlbHkgaXMgbm90IGhlcmUuLiBjcmVhdGUgYSBuZXcgY2VsbCAqLwotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgewogCQlwcmludGsoImNyZWF0aW5nIG5ldyBJQlNTIGNlbGxcbiIpOwotCQlpZighaWVlZS0+d2FwX3NldCkKKwkJaWYgKCFpZWVlLT53YXBfc2V0KQogCQkJaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKGllZWUpOwogCi0JCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pewotCisJCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSB7CiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gNDsKIAogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CkBAIC0yMjE3LDEwICsxOTcxLDEwIEBACiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1szXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKIAotCQl9ZWxzZQorCQl9IGVsc2UKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOwogCi0JCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSB7CiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gODsKIAogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwpAQCAtMjIzMywxOSArMTk4NywxOCBAQAogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzddID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKIAogCQkJaWVlZS0+cmF0ZSA9IDU0MDsKLQkJfWVsc2V7CisJCX0gZWxzZSB7CiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gMDsKIAkJCWllZWUtPnJhdGUgPSAxMTA7CiAJCX0KIAotCQkvLyBCeSBkZWZhdWx0LCBXTU0gZnVuY3Rpb24gd2lsbCBiZSBkaXNhYmxlZCBpbiBJQlNTIG1vZGUKKwkJLyogQnkgZGVmYXVsdCwgV01NIGZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgaW4gSUJTUyBtb2RlICovCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlID0gMDsKIAogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cgPSAwOwogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOwotCQlpZihpZWVlLT5zaG9ydF9zbG90KQorCQlpZiAoaWVlZS0+c2hvcnRfc2xvdCkKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UOwotCiAJfQogCiAJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwpAQCAtMjI2NCw2ICsyMDE3LDcgQEAKIAogCXVwKCZpZWVlLT53eF9zZW0pOwogfQorCiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zdGFydF9pYnNzX3dxLCAxMDApOwpAQCAtMjI3MywxOSArMjAyNywxNSBAQAogdm9pZCBpZWVlODAyMTFfc3RhcnRfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLy8KLQkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKLQkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCi0JLy8KLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQotCXsKLQkJaWYoISBpZWVlLT5iR2xvYmFsRG9tYWluKQotCQl7CisJLyogUmVmOiA4MDIuMTFkIDExLjEuMy4zCisJICogU1RBIHNoYWxsIG5vdCBzdGFydCBhIEJTUyB1bmxlc3MgcHJvcGVybHkgZm9ybWVkIEJlYWNvbiBmcmFtZQorCSAqIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCisJICovCisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpIHsKKwkJaWYgKCFpZWVlLT5iR2xvYmFsRG9tYWluKQogCQkJcmV0dXJuOwotCQl9CiAJfQotCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlCi0JICogYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCisJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGZvdW5kIHRoZSBuZXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCiAJICogaWYgbm90ICh3ZSBhcmUgZGlzYXNzb2NpYXRlZCBhbmQgd2UgYXJlIG5vdAogCSAqIGluIGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcgcGhhc2UpIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nLgogCSAqLwpAQCAtMjMwMCwxNCArMjA1MCwxMCBAQAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKLS8vI2lmZGVmIEVOQUJMRV9JUFMKLS8vCXByaW50aygic3RhcnQgYnNzIEVOQUJMRV9JUFNcbiIpOwotLy8jZWxzZQotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgewogCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CiAJCWllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihpZWVlKTsKIAl9Ci0vLyNlbmRpZgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjMyMiw3ICsyMDY4LDcgQEAKIAlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCiAJCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOwogCi0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRG90MTFkX1Jlc2V0KGllZWUpOwogCiAJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKQEAgLTIzMzcsOSArMjA4Myw5IEBACiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcmV0cnlfd3EpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKLQlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCiAJCWdvdG8gZXhpdDsKLQlpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlkpCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSkKIAkJZ290byBleGl0OwogCS8qIHVudGlsIHdlIGRvIG5vdCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksKIAkqIHRoZXJlIGFyZSBubyBwb3NzaWJpbGl0eSB0byBoYXZlIHNvbWVvbmUgZWxzZSB0cnlpbmcKQEAgLTIzNjAsMTcgKzIxMDYsMTMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKLQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgewogCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKIAkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOwogCQlpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oaWVlZSk7CiAJfQotCS8vWUosYWRkLDA4MDgyOCwgbm90aWZ5IG9zIGhlcmUKLQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQotCXsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKIAkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOwotCX0KLQkvL1lKLGFkZCwwODA4MjgsZW5kCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCiBleGl0OgpAQCAtMjM3OSw3ICsyMTIxLDcgQEAKIAogc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogCiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYjsKQEAgLTIzOTIsNyArMjEzNCw2IEBACiAJYi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwogCiAJcmV0dXJuIHNrYjsKLQogfQogCiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCkBAIC0yNDAxLDcgKzIxNDIsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7CiAKIAlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7Ci0JaWYoIXNrYikKKwlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKIAliID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikgc2tiLT5kYXRhOwpAQCAtMjQyMyw3ICsyMTY0LDYgQEAKIAl1cCgmaWVlZS0+d3hfc2VtKTsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKQEAgLTI0MzIsOSArMjE3Miw5IEBACiAJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CiAKIAlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7Ci0JaWYoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkmJihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkgewotCQlTZW5kRGlzYXNzb2NpYXRpb24oaWVlZSxOVUxMLFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCk7Ci0JfQorCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSAmJiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpCisJCVNlbmREaXNhc3NvY2lhdGlvbihpZWVlLCBOVUxMLCBXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQpOworCiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5zdGFydF9pYnNzX3dxKTsKQEAgLTI0NTQsMzYgKzIxOTQsMzUgQEAKIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXNob3J0IGNoID0gMDsKLSAJaW50IGkgPSAwOworCWludCBpID0gMDsKIAogCWlmIChpZWVlLT5wcm90b19zdGFydGVkKQogCQlyZXR1cm47CiAKIAlpZWVlLT5wcm90b19zdGFydGVkID0gMTsKIAotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKXsKLQkJZG97CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApIHsKKwkJZG8gewogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlyZXR1cm47IC8qIG5vIGNoYW5uZWwgZm91bmQgKi8KIAotCQl9d2hpbGUoIUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbY2hdKTsKKwkJfSB3aGlsZSAoIUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbY2hdKTsKIAogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOwogCX0KIAogCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID09IDApCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSAxMDA7Ci0JaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKIAotICAgICAgIAlmb3IoaSA9IDA7IGkgPCAxNzsgaSsrKSB7Ci0JICBpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOwotCSAgaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7Ci0JICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCQlpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOworCQlpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKKwkJaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CiAJfQogCi0JaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsvL3JlaW5pdGlhbGl6ZSBBQ194eF9QQVJBTSByZWdpc3RlcnMuCi0KKwlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOyAvKiByZWluaXRpYWxpemUgQUNfeHhfUEFSQU0gcmVnaXN0ZXJzLiAqLwogCiAJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBNQUMgb2YgdGhlIGFkLWhvYyBjZWxsIGFuZCB0aGVuCiAJICogc3dpdGNoIHRvIG1hbmFnZWQgbW9kZSwgc2hhbGwgd2UgIG1ha2Ugc3VyZSB0aGF0IGFzc29jaWF0aW9uCkBAIC0yNDkzLDcgKzIyMzIsNyBAQAogCXN3aXRjaCAoaWVlZS0+aXdfbW9kZSkgewogCQljYXNlIElXX01PREVfQVVUTzoKIAkJCWllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOwotCQkJLy9ub3Qgc2V0IGJyZWFrIGhlcmUgaW50ZW50aW9ubHkKKwkJCS8qIG5vdCBzZXQgYnJlYWsgaGVyZSBpbnRlbnRpb25seSAqLwogCQljYXNlIElXX01PREVfSU5GUkE6CiAJCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOwogCQkJYnJlYWs7CkBAIC0yNTE3LDcgKzIyNTYsNiBAQAogCX0KIH0KIAotCiAjZGVmaW5lIERSVl9OQU1FICAiSWVlZTgwMjExIgogdm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewpAQCAtMjUyNiwzNiArMjI2NCwyOSBAQAogCiAJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwogCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKLQlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkgIGllZWUtPnNlcV9jdHJsW2ldID0gMDsKLQl9CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJaWVlZS0+c2VxX2N0cmxbaV0gPSAwOwogCiAJaWVlZS0+YXNzb2NfaWQgPSAwOwogCWllZWUtPnF1ZXVlX3N0b3AgPSAwOwogCWllZWUtPnNjYW5uaW5nID0gMDsKLQlpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzID0gMDsgLy9zbyBJRUVFMjEwMC1saWtlIGRyaXZlciBhcmUgaGFwcHkKKwlpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzID0gMDsgLyogc28gSUVFRTIxMDAtbGlrZSBkcml2ZXIgYXJlIGhhcHB5ICovCiAJaWVlZS0+d2FwX3NldCA9IDA7CiAJaWVlZS0+c3NpZF9zZXQgPSAwOwogCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOwogCWllZWUtPmJhc2ljX3JhdGUgPSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFOwogCWllZWUtPnJhdGUgPSAzOwotLy8jaWZkZWYgRU5BQkxFX0xQUwogCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX01CQ0FTVHxJRUVFODAyMTFfUFNfVU5JQ0FTVDsKLS8vI2Vsc2UKLS8vCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOwotLy8jZW5kaWYKIAlpZWVlLT5zdGFfc2xlZXAgPSAwOwotLy9ieSBhbXkKIAlpZWVlLT5iSW5hY3RpdmVQcyA9IGZhbHNlOwogCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CiAJaWVlZS0+TGlzdGVuSW50ZXJ2YWwgPSAyOwotCWllZWUtPk51bVJ4RGF0YUluUGVyaW9kID0gMDsgLy9ZSixhZGQsMDgwODI4Ci0JaWVlZS0+TnVtUnhCY25JblBlcmlvZCA9IDA7IC8vWUosYWRkLDA4MDgyOAotCWllZWUtPk51bVJ4T2tUb3RhbCA9IDA7Ly8rYnkgYW15IDA4MDMxMgotCWllZWUtPk51bVJ4VW5pY2FzdCA9IDA7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJaWVlZS0+TnVtUnhEYXRhSW5QZXJpb2QgPSAwOworCWllZWUtPk51bVJ4QmNuSW5QZXJpb2QgPSAwOworCWllZWUtPk51bVJ4T2tUb3RhbCA9IDA7CisJaWVlZS0+TnVtUnhVbmljYXN0ID0gMDsgLyogZm9yIGtlZXAgYWxpdmUgKi8KIAlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKIAlpZWVlLT5iSHdSYWRpb09mZiA9IGZhbHNlOwotLy9ieSBhbXkKIAogCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKIApAQCAtMjU3MSwxMyArMjMwMiwxMiBAQAogCiAJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKIAotCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zdGFydF9pYnNzX3dxLCh2b2lkKikgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOwotCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSk7Ci0JSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKTsKLQlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSk7Ci0JSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKTsKLS8vCUlOSVRfV09SSygmaWVlZS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgaWVlZTgwMjExX3dhdGNoX2RvZ193cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsICh2b2lkICopIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwgKHZvaWQgKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCAodm9pZCAqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgKHZvaWQgKikgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwgKHZvaWQgKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsICh2b2lkICopIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EpOwogCiAJc2VtYV9pbml0KCZpZWVlLT53eF9zZW0sIDEpOwogCXNlbWFfaW5pdCgmaWVlZS0+c2Nhbl9zZW0sIDEpOwpAQCAtMjU5OCw4ICsyMzI4LDcgQEAKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwogCi0KLQkvL2FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2YgYnkgbGl6aGFvbWluZyAwODA1MTIKKwkvKiBhZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mICovCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOwogCiAJZGVzdHJveV93b3JrcXVldWUoaWVlZS0+d3EpOwpAQCAtMjYwNywyMiArMjMzNiwxNiBAQAogCXVwKCZpZWVlLT53eF9zZW0pOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0YXJ0IG9mIFdQQSBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogdGhpcyBpcyBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQorLyogU3RhcnQgb2YgV1BBIGNvZGUuIFRoaXMgaXMgc3RvbGVuIGZyb20gdGhlIGlwdzIyMDAgZHJpdmVyICAqLwogc3RhdGljIGludCBpZWVlODAyMTFfd3BhX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQogewogCS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3BhX3N1cHBsaWNhbnQgbG9hZHMgYW5kIGNsb3NlcyB0aGUgZHJpdmVyCiAJICogaW50ZXJmYWNlLiAqLwotCXByaW50aygiJXMgV1BBXG4iLHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwlwcmludGsoIiVzIFdQQVxuIiwgdmFsdWUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwogCWllZWUtPndwYV9lbmFibGVkID0gdmFsdWU7CiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqd3BhX2llLAogCQkJICAgICAgIGludCB3cGFfaWVfbGVuKQogewpAQCAtMjYzMiwxNiArMjM1NSwxNCBAQAogCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CiB9CiAKLQogc3RhdGljIGludCBpZWVlODAyMTFfd3BhX21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjb21tYW5kLAogCQkJICAgICAgaW50IHJlYXNvbikKIHsKLQogCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBJRUVFX01MTUVfU1RBX0RFQVVUSDoKLQkJLy8gc2lsZW50bHkgaWdub3JlCisJCS8qIHNpbGVudGx5IGlnbm9yZSAqLwogCQlicmVhazsKIAogCWNhc2UgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQzoKQEAgLTI2NTYsNyArMjM3Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3dwYV9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkgICAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKIHsKQEAgLTI2OTAsNyArMjQxMCw2IEBACiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCiB7Ci0KIAlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKIAkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKIAl9OwpAQCAtMjcxNSw3ICsyNDM0LDcgQEAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5hbWUsCiAJCQkJICAgdTMyIHZhbHVlKQogewotCWludCByZXQ9MDsKKwlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3dpdGNoIChuYW1lKSB7CkBAIC0yNzI0LDcgKzI0NDMsNyBAQAogCQlicmVhazsKIAogCWNhc2UgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUzoKLQkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXM9dmFsdWU7CisJCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gdmFsdWU7CiAJCWJyZWFrOwogCiAJY2FzZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6IHsKQEAgLTI3NDMsMTUgKzI0NjIsMTQgQEAKIAkJCS5mbGFncyA9IFNFQ19FTkFCTEVELAogCQkJLmVuYWJsZWQgPSB2YWx1ZSwKIAkJfTsKLSAJCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSB2YWx1ZTsKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOwogCQkvKiBXZSBvbmx5IGNoYW5nZSBTRUNfTEVWRUwgZm9yIG9wZW4gbW9kZS4gT3RoZXJzCiAJCSAqIGFyZSBzZXQgYnkgaXB3X3dwYV9zZXRfZW5jcnlwdGlvbi4KIAkJICovCiAJCWlmICghdmFsdWUpIHsKIAkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKIAkJfQpAQCAtMjc2MSwyNyArMjQ3OSwyMiBAQAogCX0KIAogCWNhc2UgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6Ci0JCWllZWUtPnByaXZhY3lfaW52b2tlZD12YWx1ZTsKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gdmFsdWU7CiAJCWJyZWFrOwotCiAJY2FzZSBJRUVFX1BBUkFNX0FVVEhfQUxHUzoKIAkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfYXV0aF9hbGdzKGllZWUsIHZhbHVlKTsKIAkJYnJlYWs7Ci0KIAljYXNlIElFRUVfUEFSQU1fSUVFRV84MDJfMVg6Ci0JCWllZWUtPmllZWU4MDJfMXg9dmFsdWU7CisJCWllZWUtPmllZWU4MDJfMXggPSB2YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUOgotCQkvLyBhZGRlZCBmb3IgV1BBMiBtaXhlZCBtb2RlCi0JCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPndwYXggdmFsdWUgPSAleFxuIiwgdmFsdWUpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jaywgZmxhZ3MpOwogCQlpZWVlLT53cGF4X3R5cGVfc2V0ID0gMTsKIAkJaWVlZS0+d3BheF90eXBlX25vdGlmeSA9IHZhbHVlOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7Ci0KIAlkZWZhdWx0OgotCQlwcmludGsoIlVua25vd24gV1BBIHBhcmFtOiAlZFxuIixuYW1lKTsKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBwYXJhbTogJWRcbiIsIG5hbWUpOwogCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTI4MjMsOCArMjUzNiw3IEBACiAJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIikgPT0gMCkgewogCQlpZiAoY3J5cHQpIHsKIAkJCXNlYy5lbmFibGVkID0gMDsKLQkJCS8vIEZJWE1FIEZJWE1FCi0JCQkvL3NlYy5lbmNyeXB0ID0gMDsKKwkJCS8qIEZJWE1FIEZJWE1FICovCiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKIAkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKIAkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CkBAIC0yODMyLDggKzI1NDQsNyBAQAogCQlnb3RvIGRvbmU7CiAJfQogCXNlYy5lbmFibGVkID0gMTsKLS8vIEZJWE1FIEZJWE1FCi0vLwlzZWMuZW5jcnlwdCA9IDE7CisJLyogRklYTUUgRklYTUUgKi8KIAlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CiAKIAkvKiBJUFcgSFcgY2Fubm90IGJ1aWxkIFRLSVAgTUlDLCBob3N0IGRlY3J5cHRpb24gc3RpbGwgbmVlZGVkLiAqLwpAQCAtMjk0MiwxMiArMjY1MywxMSBAQAogCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqcCkKIHsKIAlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07Ci0JaW50IHJldD0wOworCWludCByZXQgPSAwOwogCiAJZG93bigmaWVlZS0+d3hfc2VtKTsKLQkvL0lFRUVfREVCVUdfSU5GTygid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKIAotCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcikgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yOTU5LDI3ICsyNjY5LDIyIEBACiAJfQogCiAJc3dpdGNoIChwYXJhbS0+Y21kKSB7Ci0KIAljYXNlIElFRUVfQ01EX1NFVF9XUEFfUEFSQU06CiAJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKGllZWUsIHBhcmFtLT51LndwYV9wYXJhbS5uYW1lLAogCQkJCQlwYXJhbS0+dS53cGFfcGFyYW0udmFsdWUpOwogCQlicmVhazsKLQogCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9JRToKIAkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgpOwogCQlicmVhazsKLQogCWNhc2UgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT046CiAJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CiAJCWJyZWFrOwotCiAJY2FzZSBJRUVFX0NNRF9NTE1FOgogCQlyZXQgPSBpZWVlODAyMTFfd3BhX21sbWUoaWVlZSwgcGFyYW0tPnUubWxtZS5jb21tYW5kLAogCQkJCSAgIHBhcmFtLT51Lm1sbWUucmVhc29uX2NvZGUpOwogCQlicmVhazsKLQogCWRlZmF1bHQ6Ci0JCXByaW50aygiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIixwYXJhbS0+Y21kKTsKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLCBwYXJhbS0+Y21kKTsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKaW5kZXggM2I3OTU1Zi4uMDdjM2Y3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKQEAgLTEsMzggKzEsMzggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qCisgKiAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAqIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAotICBDb3B5cmlnaHQoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGJhc2VkIG9uIHRoZSBXRVAgZW5hYmxlbWVudCBjb2RlIHByb3ZpZGVkIGJ5IHRoZQotICBIb3N0IEFQIHByb2plY3QgaG9zdGFwLWRyaXZlcnMgdjAuMS4zCi0gIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICA8amttYWxpbmVAY2MuaHV0LmZpPgotICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgogc3RhdGljIGNvbnN0IGNoYXIgKmllZWU4MDIxMV9tb2Rlc1tdID0gewpAQCAtNTQsNyArNTQsNyBAQAogCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0FQOwogCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIG5ldHdvcmstPmJzc2lkLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQpOwogCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKIAogCS8qIFJlbWFpbmluZyBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBwcm92aWRlIHRoZW0gKi8KQEAgLTYyLDE3ICs2MiwxMyBAQAogCS8qIEFkZCB0aGUgRVNTSUQgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOwogCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOwotCS8vWUosbW9kaWZpZWQsMDgwOTAzLGZvciBoaWRkZW4gYXAKLQkvL2lmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfRU1QVFlfRVNTSUQpIHsKIAlpZiAobmV0d29yay0+c3NpZF9sZW4gPT0gMCkgewotCS8vWUosbW9kaWZpZWQsMDgwOTAzLGVuZAogCQlpd2UudS5kYXRhLmxlbmd0aCA9IHNpemVvZigiPGhpZGRlbj4iKTsKIAkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7CiAJfSBlbHNlIHsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4obmV0d29yay0+c3NpZF9sZW4sICh1OCkzMik7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluX3QodTgsIG5ldHdvcmstPnNzaWRfbGVuLCAzMik7CiAJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOwogCX0KLQkvL3ByaW50aygiRVNTSUQ6ICVzXG4iLG5ldHdvcmstPnNzaWQpOwogCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKIAlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLCBpZWVlODAyMTFfbW9kZXNbbmV0d29yay0+bW9kZV0pOwpAQCAtOTIsOCArODgsNiBAQAogCiAJLyogQWRkIGZyZXF1ZW5jeS9jaGFubmVsICovCiAJaXdlLmNtZCA9IFNJT0NHSVdGUkVROwotLyoJaXdlLnUuZnJlcS5tID0gaWVlZTgwMjExX2ZyZXF1ZW5jeShuZXR3b3JrLT5jaGFubmVsLCBuZXR3b3JrLT5tb2RlKTsKLQlpd2UudS5mcmVxLmUgPSAzOyAqLwogCWl3ZS51LmZyZXEubSA9IG5ldHdvcmstPmNoYW5uZWw7CiAJaXdlLnUuZnJlcS5lID0gMDsKIAlpd2UudS5mcmVxLmkgPSAwOwpAQCAtMTQ1LDEwICsxMzksOSBAQAogCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KIAkvKiBUT0RPOiBGaXggdGhlc2UgdmFsdWVzLi4uICovCiAJaWYgKG5ldHdvcmstPnN0YXRzLnNpZ25hbCA9PSAwIHx8IG5ldHdvcmstPnN0YXRzLnJzc2kgPT0gMCkKLQkJcHJpbnRrKCI9PT09PT09PT5zaWduYWw6JWQsIHJzc2k6JWRcbiIsIG5ldHdvcmstPnN0YXRzLnNpZ25hbCwKLQkJICAgICAgIG5ldHdvcmstPnN0YXRzLnJzc2kpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICI9PT09PT09PT5zaWduYWw6JWQsIHJzc2k6JWRcbiIsCisJCQkgICAgbmV0d29yay0+c3RhdHMuc2lnbmFsLCBuZXR3b3JrLT5zdGF0cy5yc3NpKTsKIAlpd2UuY21kID0gSVdFVlFVQUw7Ci0vLwlwcmludGsoIlNJR05BTDogJWQsUlNTSTogJWQsTk9JU0U6ICVkXG4iLG5ldHdvcmstPnN0YXRzLnNpZ25hbCxuZXR3b3JrLT5zdGF0cy5yc3NpLG5ldHdvcmstPnN0YXRzLm5vaXNlKTsKIAlpd2UudS5xdWFsLnF1YWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWxzdHJlbmd0aDsKIAlpd2UudS5xdWFsLmxldmVsID0gbmV0d29yay0+c3RhdHMuc2lnbmFsOwogCWl3ZS51LnF1YWwubm9pc2UgPSBuZXR3b3JrLT5zdGF0cy5ub2lzZTsKQEAgLTE3MSw3ICsxNjQsNiBAQAogCiAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAlpZiAobmV0d29yay0+d3BhX2llX2xlbikgewotCS8vCXByaW50aygid3BhX2llX2xlbjolZFxuIiwgbmV0d29yay0+d3BhX2llX2xlbik7CiAJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOXTsKIAkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+d3BhX2llLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKIAkJaXdlLmNtZCA9IElXRVZHRU5JRTsKQEAgLTE4MSw3ICsxNzMsNiBAQAogCiAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAlpZiAobmV0d29yay0+cnNuX2llX2xlbikgewotCS8vCXByaW50aygiPT09PT0+cnNuX2llX2xlbjpcbiIsIG5ldHdvcmstPnJzbl9pZV9sZW4pOwogCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07CiAJCW1lbWNweShidWYsIG5ldHdvcmstPnJzbl9pZSwgbmV0d29yay0+cnNuX2llX2xlbik7CiAJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CkBAIC0xOTAsNyArMTgxLDggQEAKIAl9CiAKIAkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKLQkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KKwkgKiBmb3IgZ2l2ZW4gbmV0d29yay4KKwkgKi8KIAlpd2UuY21kID0gSVdFVkNVU1RPTTsKIAlwID0gY3VzdG9tOwogCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCkBAIC0yMTAsOCArMjAyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAwOwogCWNoYXIgKmV2ID0gZXh0cmE7Ci0JY2hhciAqc3RvcCA9IGV2ICsgd3JxdS0+ZGF0YS5sZW5ndGg7Ly9JV19TQ0FOX01BWF9EQVRBOwotCS8vY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKKwljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsKIAlpbnQgaSA9IDA7CiAKIAlJRUVFODAyMTFfREVCVUdfV1goIkdldHRpbmcgc2NhblxuIik7CkBAIC0yODcsNyArMjc4LDggQEAKIAkJCUlFRUU4MDIxMV9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24uXG4iKTsKIAogCQkvKiBDaGVjayBhbGwgdGhlIGtleXMgdG8gc2VlIGlmIGFueSBhcmUgc3RpbGwgY29uZmlndXJlZCwKLQkJICogYW5kIGlmIG5vIGtleSBpbmRleCB3YXMgcHJvdmlkZWQsIGRlLWluaXQgdGhlbSBhbGwgKi8KKwkJICogYW5kIGlmIG5vIGtleSBpbmRleCB3YXMgcHJvdmlkZWQsIGRlLWluaXQgdGhlbSBhbGwuCisJCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgewogCQkJaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpIHsKIAkJCQlpZiAoa2V5X3Byb3ZpZGVkKQpAQCAtMzA2LDE1ICsyOTgsMTQgQEAKIAkJZ290byBkb25lOwogCX0KIAotCi0KIAlzZWMuZW5hYmxlZCA9IDE7CiAJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOwogCiAJaWYgKCpjcnlwdCAhPSBOVUxMICYmICgqY3J5cHQpLT5vcHMgIT0gTlVMTCAmJgogCSAgICBzdHJjbXAoKCpjcnlwdCktPm9wcy0+bmFtZSwgIldFUCIpICE9IDApIHsKIAkJLyogY2hhbmdpbmcgdG8gdXNlIFdFUDsgZGVpbml0IHByZXZpb3VzbHkgdXNlZCBhbGdvcml0aG0KLQkJICogb24gdGhpcyBrZXkgKi8KKwkJICogb24gdGhpcyBrZXkuCisJCSAqLwogCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOwogCX0KIApAQCAtMzU5LDEwICszNTAsMTEgQEAKIAkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOwogCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKIAkJLyogVGhpcyBlbnN1cmVzIGEga2V5IHdpbGwgYmUgYWN0aXZhdGVkIGlmIG5vIGtleSBpcwotCQkgKiBleHBsaWNpdGx5IHNldCAqLworCQkgKiBleHBsaWNpdGx5IHNldC4KKwkJICovCiAJCWlmIChrZXkgPT0gc2VjLmFjdGl2ZV9rZXkpCiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7Ci0JCWllZWUtPnR4X2tleWlkeCA9IGtleTsvL2J5IHdiIDA4MDMxMgorCQlpZWVlLT50eF9rZXlpZHggPSBrZXk7CiAJfSBlbHNlIHsKIAkJbGVuID0gKCpjcnlwdCktPm9wcy0+Z2V0X2tleShzZWMua2V5c1trZXldLCBXRVBfS0VZX0xFTiwKIAkJCQkJICAgICBOVUxMLCAoKmNyeXB0KS0+cHJpdik7CkBAIC0zOTUsNyArMzg3LDggQEAKIAkJCSAgICJPUEVOIiA6ICJTSEFSRUQgS0VZIik7CiAKIAkvKiBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBXRVAsIHNvIG9ubHkgc2V0IHRoYXQgc2VjdXJpdHkgbGV2ZWwuLi4KLQkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZSAqLworCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlCisJICovCiAJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCiAKQEAgLTQwNiw3ICszOTksOCBAQAogCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKIAkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAogCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgotCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suCisJICovCiAJaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgogCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKIAkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKQEAgLTQ0OCw3ICs0NDIsOCBAQAogCiAJaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgewogCQkvKiBvbmx5IFdFUCBpcyBzdXBwb3J0ZWQgd2l0aCB3aXJlbGVzcyBleHRlbnNpb25zLCBzbyBqdXN0Ci0JCSAqIHJlcG9ydCB0aGF0IGVuY3J5cHRpb24gaXMgdXNlZCAqLworCQkgKiByZXBvcnQgdGhhdCBlbmNyeXB0aW9uIGlzIHVzZWQuCisJCSAqLwogCQllcnEtPmxlbmd0aCA9IDA7CiAJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CiAJCXJldHVybiAwOwpAQCAtNDgzLDcgKzQ3OCw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CiAJCS5mbGFncyA9IDAsCiAJfTsKLQkvL3ByaW50aygiPT09PT09PmVuY29kaW5nIGZsYWc6JXgsZXh0IGZsYWc6JXgsIGV4dCBhbGc6JWRcbiIsIGVuY29kaW5nLT5mbGFncyxleHQtPmV4dF9mbGFncywgZXh0LT5hbGcpOwogCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKIAlpZiAoaWR4KSB7CiAJCWlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQpAQCAtNDk3LDcgKzQ5MSw2IEBACiAJCWdyb3VwX2tleSA9IDE7CiAJfSBlbHNlIHsKIAkJLyogc29tZSBDaXNjbyBBUHMgdXNlIGlkeD4wIGZvciB1bmljYXN0IGluIGR5bmFtaWMgV0VQICovCi0JCS8vcHJpbnRrKCJub3QgZ3JvdXAga2V5LCBmbGFnczoleCwgZXh0LT5hbGc6JWRcbiIsIGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CiAJCWlmIChpZHggIT0gMCAmJiBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQpAQCAtNTA2LDcgKzQ5OSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7Ly8gfCBTRUNfRU5DUllQVDsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CiAJaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8CiAJICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgewogCQlpZiAoKmNyeXB0KQpAQCAtNTE4LDE2ICs1MTEsMTMgQEAKIAogCQlpZiAoaSA9PSBXRVBfS0VZUykgewogCQkJc2VjLmVuYWJsZWQgPSAwOwotCQkJLy8gc2VjLmVuY3J5cHQgPSAwOwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQl9Ci0JCS8vcHJpbnRrKCJkaXNhYmxlZDogZmxhZzoleFxuIiwgZW5jb2RpbmctPmZsYWdzKTsKIAkJZ290byBkb25lOwogCX0KIAogCXNlYy5lbmFibGVkID0gMTsKLSAgICAvLyAgICBzZWMuZW5jcnlwdCA9IDE7CiAKIAlzd2l0Y2ggKGV4dC0+YWxnKSB7CiAJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKQEAgLTU0NSw3ICs1MzUsNiBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQotLy8JcHJpbnRrKCI4LTA5LTA4LTk9PT09PT4lcywgYWxnIG5hbWU6JXNcbiIsX19mdW5jX18sIGFsZyk7CiAKIAlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKIAlpZiAob3BzID09IE5VTEwpCkBAIC01NTMsNyArNTQyLDggQEAKIAlpZiAob3BzID09IE5VTEwpIHsKIAkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAogCQkJCSAgIGRldi0+bmFtZSwgZXh0LT5hbGcpOwotCQlwcmludGsoIj09PT09PT09PnVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwgZXh0LT5hbGcpOworCQluZXRkZXZfZXJyKGllZWUtPmRldiwgIj09PT09PT09PnVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKwkJCSAgIGV4dC0+YWxnKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KQEAgLTU4NCwxMyArNTc0LDExIEBACiAJICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkoZXh0LT5rZXksIGV4dC0+a2V5X2xlbiwgZXh0LT5yeF9zZXEsCiAJCQkJICAgKCpjcnlwdCktPnByaXYpIDwgMCkgewogCQlJRUVFODAyMTFfREVCVUdfV1goIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7Ci0JCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJbmV0ZGV2X2VycihpZWVlLT5kZXYsICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQogI2lmIDEKLSAvL3NraXBfaG9zdF9jcnlwdDoKLQkvL3ByaW50aygic2tpcF9ob3N0X2NyeXB0OmV4dF9mbGFnczoleFxuIiwgZXh0LT5leHRfZmxhZ3MpOwogCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgewogCQlpZWVlLT50eF9rZXlpZHggPSBpZHg7CiAJCXNlYy5hY3RpdmVfa2V5ID0gaWR4OwpAQCAtNjAyLDE1ICs1OTAsMTIgQEAKIAkJc2VjLmtleV9zaXplc1tpZHhdID0gZXh0LT5rZXlfbGVuOwogCQlzZWMuZmxhZ3MgfD0gKDEgPDwgaWR4KTsKIAkJaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7Ci0JCSAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19XRVA7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CiAJCX0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB7Ci0JCSAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19US0lQOwogCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOwogCQl9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgewotCQkgICAgICAgLy8gc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfQ0NNUDsKIAkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMzsKIAkJfQpAQCAtNjMyLDIwICs2MTcsMTkgQEAKIAogCXJldHVybiByZXQ7CiB9CisKIGludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopIGV4dHJhOwotLy8JcHJpbnRrKCJcbmRrZ2FkZnNsa2RqZ2Fsc2tkZj09PT09PT09PT09PT09PT4lcygpLCBjbWQ6JXhcbiIsIF9fZnVuY19fLCBtbG1lLT5jbWQpOwogI2lmIDEKIAlzd2l0Y2ggKG1sbWUtPmNtZCkgewogCWNhc2UgSVdfTUxNRV9ERUFVVEg6CiAJY2FzZSBJV19NTE1FX0RJU0FTU09DOgotCS8vCXByaW50aygiZGlzYXNzb2Mgbm93XG4iKTsKIAkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKIAkJYnJlYWs7Ci0JIGRlZmF1bHQ6CisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KICNlbmRpZgpAQCAtNjU2LDI0ICs2NDAsMTYgQEAKIAkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSkKIHsKLS8qCi0JIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0gewotCQkuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAotCX0KLSovCi0JLy9wcmludGsoInNldCBhdXRoOmZsYWc6JXgsIGRhdGEgdmFsdWU6JXhcbiIsIGRhdGEtPmZsYWdzLCBkYXRhLT52YWx1ZSk7CiAJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046Ci0JICAgICAvKm5lZWQgdG8gc3VwcG9ydCB3cGEyIGhlcmUqLwotCQkvL3ByaW50aygid3BhIHZlcnNpb246JXhcbiIsIGRhdGEtPnZhbHVlKTsKKwkJLyogbmVlZCB0byBzdXBwb3J0IHdwYTIgaGVyZSAqLwogCQlicmVhazsKIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgogCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CiAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgotCQkvKgotICogICAgICAgICAgICAgICAgICAqIEhvc3QgQVAgZHJpdmVyIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBhbGxvd3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IHRvIGNvbnRyb2wgdGhlbSBpbnRlcm5hbGx5LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworCQkgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KKwkJICovCiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKIAkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSBkYXRhLT52YWx1ZTsKQEAgLTY4NCwxMyArNjYwLDExIEBACiAKIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CiAJCWllZWUtPm9wZW5fd2VwID0gKGRhdGEtPnZhbHVlJklXX0FVVEhfQUxHX09QRU5fU1lTVEVNKSA/IDEgOiAwOwotCQkvL3ByaW50aygib3Blbl93ZXA6JWRcbiIsIGllZWUtPm9wZW5fd2VwKTsKIAkJYnJlYWs7CiAKICNpZiAxCiAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgogCQlpZWVlLT53cGFfZW5hYmxlZCA9IChkYXRhLT52YWx1ZSkgPyAxIDogMDsKLQkJLy9wcmludGsoImVuYWJsZSB3cGE6JWRcbiIsIGllZWUtPndwYV9lbmFibGVkKTsKIAkJYnJlYWs7CiAKICNlbmRpZgpAQCAtNzEyLDEzICs2ODYsMTMgQEAKIAl1OCAqYnVmID0gTlVMTDsKIAogCWlmIChsZW4gPiBNQVhfV1BBX0lFX0xFTiB8fCAobGVuICYmIGllID09IE5VTEwpKSB7Ci0JCXByaW50aygicmV0dXJuIGVycm9yIG91dCwgbGVuOiV6dVxuIiwgbGVuKTsKKwkJbmV0ZGV2X2VycihpZWVlLT5kZXYsICJyZXR1cm4gZXJyb3Igb3V0LCBsZW46JXp1XG4iLCBsZW4pOwogCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChsZW4pIHsKIAkJaWYgKGxlbiAhPSBpZVsxXSsyKSB7Ci0JCQlwcmludGsoImxlbjolenUsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKKwkJCW5ldGRldl9lcnIoaWVlZS0+ZGV2LCAibGVuOiV6dSwgaWU6JWRcbiIsIGxlbiwgaWVbMV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnVmID0ga21lbWR1cChpZSwgbGVuLCBHRlBfS0VSTkVMKTsKQEAgLTczMiw3ICs3MDYsNiBAQAogCQlpZWVlLT53cGFfaWUgPSBOVUxMOwogCQlpZWVlLT53cGFfaWVfbGVuID0gMDsKIAl9Ci0vLwlwcmludGsoIjw9PT09PW91dCAlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCmluZGV4IDg5OTllYzYuLjlmOTMxZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKQEAgLTEsMTkgKzEsMTggQEAKIC8qCi0gICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KLSAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgotICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKLSAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KLSAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKLQotICAgV2Ugd2FudCB0byB0aGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgotICAgcHJvamVjdCBBdXRob3JzLgotKi8KKyAqIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisgKgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYworICogU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisgKgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisgKgorICogV2Ugd2FudCB0byB0aGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0CisgKiBBdXRob3JzLgorICovCiAKICNpZm5kZWYgUjgxODBICiAjZGVmaW5lIFI4MTgwSApAQCAtMjEsMTMgKzIwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNkZWZpbmUgUlRMODE4MF9NT0RVTEVfTkFNRSAicjgxODAiCi0jZGVmaW5lIERNRVNHKHgsYS4uLikgcHJpbnRrKEtFUk5fSU5GTyBSVEw4MTgwX01PRFVMRV9OQU1FICI6ICIgeCAiXG4iLCAjIyBhKQotI2RlZmluZSBETUVTR1coeCxhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFJUTDgxODBfTU9EVUxFX05BTUUgIjogV1c6IiB4ICJcbiIsICMjIGEpCi0jZGVmaW5lIERNRVNHRSh4LGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBFRToiIHggIlxuIiwgIyMgYSkKKyNkZWZpbmUgRE1FU0coeCwgYS4uLikgcHJpbnRrKEtFUk5fSU5GTyBSVEw4MTgwX01PRFVMRV9OQU1FICI6ICIgeCAiXG4iLCAjIyBhKQorI2RlZmluZSBETUVTR1coeCwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBSVEw4MTgwX01PRFVMRV9OQU1FICI6IFdXOiIgeCAiXG4iLCAjIyBhKQorI2RlZmluZSBETUVTR0UoeCwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBSVEw4MTgwX01PRFVMRV9OQU1FICI6IEVFOiIgeCAiXG4iLCAjIyBhKQogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0zNiwyMiArMzQsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CS8vZm9yIHJ0bmxfbG9jaygpCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+IC8qIGZvciBydG5sX2xvY2soKSAqLwogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CS8vIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4gLyogTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzLiAqLwogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgImllZWU4MDIxMS9pZWVlODAyMTEuaCIKICNpbmNsdWRlIDxhc20vaW8uaD4KLS8vI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2RlZmluZSBFUFJPTV85M2M0NiAwCiAjZGVmaW5lIEVQUk9NXzkzYzU2IDEKIAotI2RlZmluZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQJCVNJT0NJV0ZJUlNUUFJJViszMAorI2RlZmluZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQgKFNJT0NJV0ZJUlNUUFJJViArIDMwKQogCiAjZGVmaW5lIERFRkFVTFRfRlJBR19USFJFU0hPTEQgMjM0MlUKLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAyNTZVCiAjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQyVQogI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAwVQogI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAyMzQyVQpAQCAtNjAsMTMyICs1Nyw5OSBAQAogI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUyA3CiAjZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQSA3CiAKLSNkZWZpbmUgQkVBQ09OX1FVRVVFCQkJCQk2CisjZGVmaW5lIEJFQUNPTl9RVUVVRSA2CiAKLSNkZWZpbmUgYVNpZnNUaW1lIAkxMAorI2RlZmluZSBhU2lmc1RpbWUgMTAKIAotI2RlZmluZSBzQ3JjTG5nICAgICAgICAgNAotI2RlZmluZSBzQWNrQ3RzTG5nCTExMgkJLy8gYml0cyBpbiBBQ0sgYW5kIENUUyBmcmFtZXMKLS8vK2J5IGFteSAwODAzMTIKLSNkZWZpbmUgUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0QJMzAwCisjZGVmaW5lIHNDcmNMbmcgNAorI2RlZmluZSBzQWNrQ3RzTG5nIDExMiAvKiBiaXRzIGluIEFDSyBhbmQgQ1RTIGZyYW1lcy4gKi8KKy8qICtieSBhbXkgMDgwMzEyLiAqLworI2RlZmluZSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRCAzMDAKIAotdHlwZWRlZiBlbnVtIF9XSVJFTEVTU19NT0RFIHsKK2VudW0gd2lyZWxlc3NfbW9kZSB7CiAJV0lSRUxFU1NfTU9ERV9VTktOT1dOID0gMHgwMCwKIAlXSVJFTEVTU19NT0RFX0EgPSAweDAxLAogCVdJUkVMRVNTX01PREVfQiA9IDB4MDIsCiAJV0lSRUxFU1NfTU9ERV9HID0gMHgwNCwKIAlXSVJFTEVTU19NT0RFX0FVVE8gPSAweDA4LAotfSBXSVJFTEVTU19NT0RFOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKLQl1MTYgU0lGU19UaW1lcjsKLQl1MTYgRElGU19UaW1lcjsKLQl1MTYgU2xvdFRpbWVUaW1lcjsKLQl1MTYgRUlGU19UaW1lcjsKLQl1MTYgQ1dtaW5JbmRleDsKLQl1MTYgQ1dtYXhJbmRleDsKLX0qUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcsQ0hBTk5FTF9BQ0NFU1NfU0VUVElORzsKK3N0cnVjdCBjaG5sX2FjY2Vzc19zZXR0aW5nIHsKKwl1MTYgc2lmc190aW1lcjsKKwl1MTYgZGlmc190aW1lcjsKKwl1MTYgc2xvdF90aW1lX3RpbWVyOworCXUxNiBlaWZzX3RpbWVyOworCXUxNiBjd21pbl9pbmRleDsKKwl1MTYgY3dtYXhfaW5kZXg7Cit9OwogCi10eXBlZGVmIGVudW17Ci0gICAgICAgIE5JQ184MTg1ID0gMSwKLSAgICAgICAgTklDXzgxODVCCi0gICAgICAgIH0gbmljX3Q7CitlbnVtIG5pY190IHsKKwlOSUNfODE4NSA9IDEsCisJTklDXzgxODVCCit9OwogCiB0eXBlZGVmIHUzMiBBQ19DT0RJTkc7Ci0jZGVmaW5lIEFDMF9CRQkwCQkvLyBBQ0k6IDB4MDAJLy8gQmVzdCBFZmZvcnQKLSNkZWZpbmUgQUMxX0JLCTEJCS8vIEFDSTogMHgwMQkvLyBCYWNrZ3JvdW5kCi0jZGVmaW5lIEFDMl9WSQkyCQkvLyBBQ0k6IDB4MTAJLy8gVmlkZW8KLSNkZWZpbmUgQUMzX1ZPCTMJCS8vIEFDSTogMHgxMQkvLyBWb2ljZQotI2RlZmluZSBBQ19NQVgJNAkJLy8gTWF4OiBkZWZpbmUgdG90YWwgbnVtYmVyOyBTaG91bGQgbm90IHRvIGJlIHVzZWQgYXMgYSByZWFsIGVudW0uCisjZGVmaW5lIEFDMF9CRQkwIC8qIEFDSTogMHgwMCAqLyAvKiBCZXN0IEVmZm9ydC4gKi8KKyNkZWZpbmUgQUMxX0JLCTEgLyogQUNJOiAweDAxICovIC8qIEJhY2tncm91bmQuICovCisjZGVmaW5lIEFDMl9WSQkyIC8qIEFDSTogMHgxMCAqLyAvKiBWaWRlby4gKi8KKyNkZWZpbmUgQUMzX1ZPCTMgLyogQUNJOiAweDExICovIC8qIFZvaWNlLiAqLworI2RlZmluZSBBQ19NQVgJNCAvKiBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwKKwkJICAgKiBlbnVtLgorCQkgICAqLwogCi0vLwotLy8gRUNXbWluL0VDV21heCBmaWVsZC4KLS8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMy4KLS8vCi10eXBlZGVmCXVuaW9uIF9FQ1d7Ci0JdTgJY2hhckRhdGE7Ci0Jc3RydWN0Ci0JewotCQl1OAlFQ1dtaW46NDsKLQkJdTgJRUNXbWF4OjQ7Ci0JfWY7CS8vIEZpZWxkCi19RUNXLCAqUEVDVzsKLQotLy8KLS8vIEFDSS9BSUZTTiBGaWVsZC4KLS8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KLS8vCi10eXBlZGVmCXVuaW9uIF9BQ0lfQUlGU057Ci0JdTgJY2hhckRhdGE7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCXU4CUFJRlNOOjQ7Ci0JCXU4CUFDTToxOwotCQl1OAlBQ0k6MjsKLQkJdTgJUmVzZXJ2ZWQ6MTsKLQl9ZjsJLy8gRmllbGQKLX1BQ0lfQUlGU04sICpQQUNJX0FJRlNOOwotCi0vLwotLy8gQUMgUGFyYW1ldGVycyBSZWNvcmQgRm9ybWF0LgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgotLy8KLXR5cGVkZWYJdW5pb24gX0FDX1BBUkFNewotCXUzMglsb25nRGF0YTsKLQl1OAljaGFyRGF0YVs0XTsKLQotCXN0cnVjdAotCXsKLQkJQUNJX0FJRlNOCUFjaUFpZnNuOwotCQlFQ1cJCUVjdzsKLQkJdTE2CQlUWE9QTGltaXQ7Ci0JfWY7CS8vIEZpZWxkCi19QUNfUEFSQU0sICpQQUNfUEFSQU07Ci0KLS8qIGl0IGlzIGEgd3JvbmcgZGVmaW5pdGlvbi4gLXhpb25nLTIwMDYtMTEtMTcKLXR5cGVkZWYgc3RydWN0IFRocmVlV2lyZVJlZyB7Ci0JdTE2CWxvbmdEYXRhOworLyoKKyAqIEVDV21pbi9FQ1dtYXggZmllbGQuCisgKiBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTMuCisgKi8KK3R5cGVkZWYgdW5pb24gX0VDVyB7CisJdTggY2hhckRhdGE7CiAJc3RydWN0IHsKLQkJdTgJZW5hYmxlQjsKLQkJdTgJZGF0YTsKLQkJdTgJY2xrOwotCQl1OAlyZWFkX3dyaXRlOwotCX0gc3RydWM7Ci19IFRocmVlV2lyZVJlZzsKLSovCisJCXU4IEVDV21pbjo0OworCQl1OCBFQ1dtYXg6NDsKKwl9IGY7CS8qIEZpZWxkICovCit9IEVDVywgKlBFQ1c7CiAKLXR5cGVkZWYJdW5pb24gX1RocmVlV2lyZXsKLQlzdHJ1Y3QgX1RocmVlV2lyZVN0cnVjewotCQl1MTYJCWRhdGE6MTsKLQkJdTE2CQljbGs6MTsKLQkJdTE2CQllbmFibGVCOjE7Ci0JCXUxNgkJcmVhZF93cml0ZToxOwotCQl1MTYJCXJlc3YxOjEyOwotLy8JCXUyQnl0ZQlyZXN2MjoxNDsKLS8vCQl1MkJ5dGUJVGhyZWVXaXJlRW5hYmxlOjE7Ci0vLwkJdTJCeXRlCXJlc3YzOjE7Ci0JfXN0cnVjOwotCXUxNgkJCWxvbmdEYXRhOwotfVRocmVlV2lyZVJlZzsKKy8qCisgKiBBQ0kvQUlGU04gRmllbGQuIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKyAqLwordHlwZWRlZiB1bmlvbiBfQUNJX0FJRlNOIHsKKwl1OCBjaGFyRGF0YTsKIAorCXN0cnVjdCB7CisJCXU4IEFJRlNOOjQ7CisJCXU4IEFDTToxOworCQl1OCBBQ0k6MjsKKwkJdTggUmVzZXJ2ZWQ6MTsKKwl9IGY7CS8qIEZpZWxkICovCit9IEFDSV9BSUZTTiwgKlBBQ0lfQUlGU047CiAKLXR5cGVkZWYgc3RydWN0IGJ1ZmZlcgoteworLyoKKyAqIEFDIFBhcmFtZXRlcnMgUmVjb3JkIEZvcm1hdC4KKyAqIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKyAqLwordHlwZWRlZiB1bmlvbiBfQUNfUEFSQU0geworCXUzMiBsb25nRGF0YTsKKwl1OCBjaGFyRGF0YVs0XTsKKworCXN0cnVjdCB7CisJCUFDSV9BSUZTTiBBY2lBaWZzbjsKKwkJRUNXIEVjdzsKKwkJdTE2IFRYT1BMaW1pdDsKKwl9IGY7CS8qIEZpZWxkICovCit9IEFDX1BBUkFNLCAqUEFDX1BBUkFNOworCitzdHJ1Y3QgYnVmZmVyIHsKIAlzdHJ1Y3QgYnVmZmVyICpuZXh0OwogCXUzMiAqYnVmOwogCWRtYV9hZGRyX3QgZG1hOwotfSBidWZmZXI7Cit9OwogCi0vL1lKLG1vZGlmaWVkLDA4MDgyOAotdHlwZWRlZiBzdHJ1Y3QgU3RhdHMKLXsKKy8qIFlKLG1vZGlmaWVkLDA4MDgyOC4gKi8KK3N0cnVjdCBzdGF0cyB7CiAJdW5zaWduZWQgbG9uZyB0eHJkdTsKIAl1bnNpZ25lZCBsb25nIHJ4cmR1OwogCXVuc2lnbmVkIGxvbmcgcnhub2xhc3Q7CiAJdW5zaWduZWQgbG9uZyByeG5vZGF0YTsKLS8vCXVuc2lnbmVkIGxvbmcgcnhyZXNldDsKLS8vCXVuc2lnbmVkIGxvbmcgcnh3cmthcm91bmQ7CiAJdW5zaWduZWQgbG9uZyByeG5vcG9pbnRlcjsKIAl1bnNpZ25lZCBsb25nIHR4bnBlcnI7CiAJdW5zaWduZWQgbG9uZyB0eHJlc3VtZWQ7CkBAIC0yMDcsMTI2ICsxNzEsMTIzIEBACiAJdW5zaWduZWQgbG9uZyB0eGJlYWNvbmVycjsKIAl1bnNpZ25lZCBsb25nIHR4bHBva2ludDsKIAl1bnNpZ25lZCBsb25nIHR4bHBlcnI7Ci0JdW5zaWduZWQgbG9uZyB0eHJldHJ5Oy8vcmV0cnkgbnVtYmVyICB0b255IDIwMDYwNjAxCi0JdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pbjsvL2NyYyBlcnJvciAoMC01MDApCi0JdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pZDsvL2NyYyBlcnJvciAoNTAwLTEwMDApCi0JdW5zaWduZWQgbG9uZyByeGNyY2Vycm1heDsvL2NyYyBlcnJvciAoPjEwMDApCi0JdW5zaWduZWQgbG9uZyByeGljdmVycjsvL0lDViBlcnJvcgotfSBTdGF0czsKKwl1bnNpZ25lZCBsb25nIHR4cmV0cnk7IC8qIHJldHJ5IG51bWJlciB0b255IDIwMDYwNjAxICovCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pbjsgLyogY3JjIGVycm9yICgwLTUwMCkgKi8KKwl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWlkOyAvKiBjcmMgZXJyb3IgKDUwMC0xMDAwKSAqLworCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtYXg7IC8qIGNyYyBlcnJvciAoPjEwMDApICovCisJdW5zaWduZWQgbG9uZyByeGljdmVycjsgLyogSUNWIGVycm9yICovCit9OwogCiAjZGVmaW5lIE1BWF9MRF9TTE9UX05VTSAxMAotI2RlZmluZSBLRUVQX0FMSVZFX0lOVEVSVkFMIAkJCQkyMCAvLyBpbiBzZWNvbmRzLgotI2RlZmluZSBDSEVDS19GT1JfSEFOR19QRVJJT0QJCQkyIC8vYmUgZXF1YWwgdG8gd2F0Y2hkb2cgY2hlY2sgdGltZQotI2RlZmluZSBERUZBVUxUX0tFRVBfQUxJVkVfTEVWRUwJCQkxCi0jZGVmaW5lIERFRkFVTFRfU0xPVF9OVU0JCQkJCTIKLSNkZWZpbmUgUE9XRVJfUFJPRklMRV9BQwkJCQkJMAotI2RlZmluZSBQT1dFUl9QUk9GSUxFX0JBVFRFUlkJCQkxCisjZGVmaW5lIEtFRVBfQUxJVkVfSU5URVJWQUwgMjAgLyogaW4gc2Vjb25kcy4gKi8KKyNkZWZpbmUgQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EIDIgLyogYmUgZXF1YWwgdG8gd2F0Y2hkb2cgY2hlY2sgdGltZS4gKi8KKyNkZWZpbmUgREVGQVVMVF9LRUVQX0FMSVZFX0xFVkVMIDEKKyNkZWZpbmUgREVGQVVMVF9TTE9UX05VTSAyCisjZGVmaW5lIFBPV0VSX1BST0ZJTEVfQUMgMAorI2RlZmluZSBQT1dFUl9QUk9GSUxFX0JBVFRFUlkgMQogCi10eXBlZGVmIHN0cnVjdCBfbGlua19kZXRlY3RfdAotewotCXUzMgkJCQlSeEZyYW1lTnVtW01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBGcmFtZSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cwotCXUxNgkJCQlTbG90TnVtOwkvLyBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMsIGRlZmF1bHQgaXMgMgotCXUxNgkJCQlTbG90SW5kZXg7CitzdHJ1Y3QgbGlua19kZXRlY3RfdCB7CisJdTMyIHJ4X2ZyYW1lX251bVtNQVhfTERfU0xPVF9OVU1dOyAvKiBudW1iZXIgb2YgUnggRnJhbWUuCisJCQkJCSAgICAqIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZQorCQkJCQkgICAgKiBsaW5rIHN0YXR1cy4KKwkJCQkJICAgICovCisJdTE2IHNsb3RfbnVtOyAvKiBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMsCisJCSAgICAgICAqIGRlZmF1bHQgaXMgMi4KKwkJICAgICAgICovCisJdTE2IHNsb3RfaW5kZXg7CisJdTMyIG51bV90eF9va19pbl9wZXJpb2Q7IC8qIG51bWJlciBvZiBwYWNrZXQgdHJhbnNtaXR0ZWQgZHVyaW5nCisJCQkJICAqIENoZWNrRm9ySGFuZy4KKwkJCQkgICovCisJdTMyIG51bV9yeF9va19pbl9wZXJpb2Q7IC8qIG51bWJlciBvZiBwYWNrZXQgcmVjZWl2ZWQgZHVyaW5nCisJCQkJICAqIENoZWNrRm9ySGFuZy4KKwkJCQkgICovCisJdTggaWRsZV9jb3VudDsgLyogKEtFRVBfQUxJVkVfSU5URVJWQUwgLyBDSEVDS19GT1JfSEFOR19QRVJJT0QpICovCisJdTMyIGxhc3RfbnVtX3R4X3VuaWNhc3Q7CisJdTMyIGxhc3RfbnVtX3J4X3VuaWNhc3Q7CiAKLQl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOyAgLy9udW1iZXIgb2YgcGFja2V0IHRyYW5zbWl0dGVkIGR1cmluZyBDaGVja0ZvckhhbmcKLQl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOyAgLy9udW1iZXIgb2YgcGFja2V0IHJlY2VpdmVkIGR1cmluZyBDaGVja0ZvckhhbmcKKwlib29sIGJfYnVzeV90cmFmZmljOyAvKiB3aGVuIGl0IGlzIHNldCB0byAxLCBVSSBjYW5uJ3Qgc2NhbiBhdCB3aWxsLiAqLworfTsKIAotCXU4CQkJCUlkbGVDb3VudDsgICAgIC8vIChLRUVQX0FMSVZFX0lOVEVSVkFMIC8gQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKQotCXUzMgkJCQlMYXN0TnVtVHhVbmljYXN0OwotCXUzMgkJCQlMYXN0TnVtUnhVbmljYXN0OworLyogWUosbW9kaWZpZWQsMDgwODI4LGVuZCAqLwogCi0JYm9vbAkJCQliQnVzeVRyYWZmaWM7ICAgIC8vd2hlbiBpdCBpcyBzZXQgdG8gMSwgVUkgY2Fubid0IHNjYW4gYXQgd2lsbC4KLX1saW5rX2RldGVjdF90LCAqcGxpbmtfZGV0ZWN0X3Q7CisvKiBieSBhbXkgZm9yIGxlZAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExFRCBjdXN0b21pemF0aW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworZW51bSBsZWRfc3RyYXRlZ3lfODE4NSB7CisJU1dfTEVEX01PREUwLAorCVNXX0xFRF9NT0RFMSwKKwlIV19MRUQsIC8qIEhXIGNvbnRyb2wgMiBMRURzLCBMRUQwIGFuZCBMRUQxICh0aGVyZSBhcmUgNCBkaWZmZXJlbnQKKwkJICogY29udHJvbCBtb2RlcykuICovCit9OwogCi0vL1lKLG1vZGlmaWVkLDA4MDgyOCxlbmQKK2VudW0gcnRfcmZfcG93ZXJfc3RhdGUgeworCVJGX09OLAorCVJGX1NMRUVQLAorCVJGX09GRgorfTsKIAotLy9ieSBhbXkgZm9yIGxlZAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTEVEIGN1c3RvbWl6YXRpb24uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitlbnVtIF9SZWFzb25Db2RlIHsKKwl1bnNwZWNfcmVhc29uID0gMHgxLAorCWF1dGhfbm90X3ZhbGlkID0gMHgyLAorCWRlYXV0aF9sdl9zcyA9IDB4MywKKwlpbmFjdGl2aXR5ID0gMHg0LAorCWFwX292ZXJsb2FkID0gMHg1LAorCWNsYXNzMl9lcnIgPSAweDYsCisJY2xhc3MzX2VyciA9IDB4NywKKwlkaXNhc19sdl9zcyA9IDB4OCwKKwlhc29jX25vdF9hdXRoID0gMHg5LAogCi10eXBlZGVmCWVudW0gX0xFRF9TVFJBVEVHWV84MTg1ewotCVNXX0xFRF9NT0RFMCwgLy8KLQlTV19MRURfTU9ERTEsIC8vCi0JSFdfTEVELCAvLyBIVyBjb250cm9sIDIgTEVEcywgTEVEMCBhbmQgTEVEMSAodGhlcmUgYXJlIDQgZGlmZmVyZW50IGNvbnRyb2wgbW9kZXMpCi19TEVEX1NUUkFURUdZXzgxODUsICpQTEVEX1NUUkFURUdZXzgxODU7Ci0vL2J5IGFteSBmb3IgbGVkCi0vL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQotdHlwZWRlZgllbnVtIF9MRURfQ1RMX01PREV7Ci0JTEVEX0NUTF9QT1dFUl9PTiA9IDEsCi0JTEVEX0NUTF9MSU5LID0gMiwKLQlMRURfQ1RMX05PX0xJTksgPSAzLAotCUxFRF9DVExfVFggPSA0LAotCUxFRF9DVExfUlggPSA1LAotCUxFRF9DVExfU0lURV9TVVJWRVkgPSA2LAotCUxFRF9DVExfUE9XRVJfT0ZGID0gNwotfUxFRF9DVExfTU9ERTsKKwkvKiAtLS0tTUlDX0NIRUNLICovCisJbWljX2ZhaWx1cmUgPSAweGUsCisJLyogLS0tLUVORCBNSUNfQ0hFQ0sgKi8KIAotdHlwZWRlZgllbnVtIF9SVF9SRl9QT1dFUl9TVEFURQotewotCWVSZk9uLAotCWVSZlNsZWVwLAotCWVSZk9mZgotfVJUX1JGX1BPV0VSX1NUQVRFOwotCi1lbnVtCV9SZWFzb25Db2RlewotCXVuc3BlY19yZWFzb24JPSAweDEsCi0JYXV0aF9ub3RfdmFsaWQJPSAweDIsCi0JZGVhdXRoX2x2X3NzCT0gMHgzLAotCWluYWN0aXZpdHkJCT0gMHg0LAotCWFwX292ZXJsb2FkCQk9IDB4NSwKLQljbGFzczJfZXJyCQk9IDB4NiwKLQljbGFzczNfZXJyCQk9IDB4NywKLQlkaXNhc19sdl9zcwkJPSAweDgsCi0JYXNvY19ub3RfYXV0aAk9IDB4OSwKLQotCS8vLS0tLU1JQ19DSEVDSwotCW1pY19mYWlsdXJlCQk9IDB4ZSwKLQkvLy0tLS1FTkQgTUlDX0NIRUNLCi0KLQkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4KLQlpbnZhbGlkX0lFCQk9IDB4MGQsCi0JZm91cl93YXlfdG1vdXQJPSAweDBmLAotCXR3b193YXlfdG1vdXQJPSAweDEwLAotCUlFX2Rpc21hdGNoCQk9IDB4MTEsCisJLyogUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA4MDIuMTFpIEQxMC4wIHAuMjguICovCisJaW52YWxpZF9JRSA9IDB4MGQsCisJZm91cl93YXlfdG1vdXQgPSAweDBmLAorCXR3b193YXlfdG1vdXQgPSAweDEwLAorCUlFX2Rpc21hdGNoID0gMHgxMSwKIAlpbnZhbGlkX0djaXBoZXIJPSAweDEyLAogCWludmFsaWRfUGNpcGhlcgk9IDB4MTMsCi0JaW52YWxpZF9BS01QCT0gMHgxNCwKKwlpbnZhbGlkX0FLTVAgPSAweDE0LAogCXVuc3VwX1JTTklFdmVyID0gMHgxNSwKLQlpbnZhbGlkX1JTTklFCT0gMHgxNiwKLQlhdXRoXzgwMl8xeF9mYWlsPSAweDE3LAotCWNpcGVyX3JlamVjdAkJPSAweDE4LAorCWludmFsaWRfUlNOSUUgPSAweDE2LAorCWF1dGhfODAyXzF4X2ZhaWwgPSAweDE3LAorCWNpcGVyX3JlamVjdCA9IDB4MTgsCiAKLQkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMTUuCi0JUW9TX3Vuc3BlYwkJPSAweDIwLAkvLyAzMgotCVFBUF9iYW5kd2lkdGgJPSAweDIxLAkvLyAzMwotCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwJLy8gMzQKLQlub19mYWNpbGl0eQkJPSAweDIzLAkvLyAzNQotCQkJCQkJCS8vIFdoZXJlIGlzIDM2Pz8/Ci0JcmVxX2RlY2xpbmVkCT0gMHgyNSwJLy8gMzcKLQlpbnZhbGlkX3BhcmFtCT0gMHgyNiwJLy8gMzgKLQlyZXFfbm90X2hvbm9yZWQ9IDB4MjcsCS8vIDM5Ci0JVFNfbm90X2NyZWF0ZWQJPSAweDJGLAkvLyA0NwotCURMX25vdF9hbGxvd2VkCT0gMHgzMCwJLy8gNDgKLQlkZXN0X25vdF9leGlzdAk9IDB4MzEsCS8vIDQ5Ci0JZGVzdF9ub3RfUVNUQQk9IDB4MzIsCS8vIDUwCisJLyogUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA3LjMuMS43LCA4MDIuMWUgRDEzLjAsIHAuNDIuIEFkZGVkIGJ5IEFubmllLAorCSAqIDIwMDUtMTEtMTUuCisJICovCisJUW9TX3Vuc3BlYyA9IDB4MjAsIC8qIDMyICovCisJUUFQX2JhbmR3aWR0aCA9IDB4MjEsIC8qIDMzICovCisJcG9vcl9jb25kaXRpb24gPSAweDIyLCAvKiAzNCAqLworCW5vX2ZhY2lsaXR5ID0gMHgyMywgLyogMzUgKi8KKwkvKiBXaGVyZSBpcyAzNj8/PyAqLworCXJlcV9kZWNsaW5lZCA9IDB4MjUsIC8qIDM3ICovCisJaW52YWxpZF9wYXJhbSA9IDB4MjYsIC8qIDM4ICovCisJcmVxX25vdF9ob25vcmVkID0gMHgyNywgLyogMzkgKi8KKwlUU19ub3RfY3JlYXRlZCA9IDB4MkYsIC8qIDQ3ICovCisJRExfbm90X2FsbG93ZWQgPSAweDMwLCAvKiA0OCAqLworCWRlc3Rfbm90X2V4aXN0ID0gMHgzMSwgLyogNDkgKi8KKwlkZXN0X25vdF9RU1RBID0gMHgzMiwgLyogNTAgKi8KIH07Ci10eXBlZGVmCWVudW0gX1JUX1BTX01PREUKLXsKLQllQWN0aXZlLAkvLyBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuCi0JZU1heFBzLAkJLy8gTWF4IHBvd2VyIHNhdmUgbW9kZS4KLQllRmFzdFBzCQkvLyBGYXN0IHBvd2VyIHNhdmUgbW9kZS4KLX1SVF9QU19NT0RFOwotLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKLXR5cGVkZWYgc3RydWN0IHI4MTgwX3ByaXYKLXsKKworZW51bSBydF9wc19tb2RlIHsKKwlBQ1RJVkUsIC8qIEFjdGl2ZS9Db250aW51b3VzIGFjY2Vzcy4gKi8KKwlNQVhfUFMsCS8qIE1heCBwb3dlciBzYXZlIG1vZGUuICovCisJRkFTVF9QUyAvKiBGYXN0IHBvd2VyIHNhdmUgbW9kZS4gKi8KK307CisKKy8qIGJ5IGFteSBmb3IgcG93ZXIgc2F2ZS4gKi8KK3N0cnVjdCByODE4MF9wcml2IHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAogCXNob3J0IGVwcm9tdHlwZTsKIAlpbnQgaXJxOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CiAKLQlzaG9ydCBwbGNwX3ByZWFtYmxlX21vZGU7IC8vIDA6YXV0byAxOnNob3J0IDI6bG9uZworCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsgLyogMDphdXRvIDE6c2hvcnQgMjpsb25nICovCiAKIAlzcGlubG9ja190IGlycV90aF9sb2NrOwogCXNwaW5sb2NrX3QgdHhfbG9jazsKQEAgLTMzOSwxOSArMzAwLDE1IEBACiAJc2hvcnQgY2hhbjsKIAlzaG9ydCBzZW5zOwogCXNob3J0IG1heF9zZW5zOwotCXU4IGNodHhwd3JbMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAotCXU4IGNodHhwd3Jfb2ZkbVsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCi0JLy91OCBjaGFsbG93WzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKLQl1OCBjaGFubmVsX3BsYW47ICAvLyBpdCdzIHRoZSBjaGFubmVsIHBsYW4gaW5kZXgKKwl1OCBjaHR4cHdyWzE1XTsgLyogY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkLiAqLworCXU4IGNodHhwd3Jfb2ZkbVsxNV07IC8qIGNoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZC4gKi8KKwl1OCBjaGFubmVsX3BsYW47ICAvKiBpdCdzIHRoZSBjaGFubmVsIHBsYW4gaW5kZXguICovCiAJc2hvcnQgdXA7Ci0Jc2hvcnQgY3JjbW9uOyAvL2lmIDEgYWxsb3cgYmFkIGNyYyBmcmFtZSByZWNlcHRpb24gaW4gbW9uaXRvciBtb2RlCisJc2hvcnQgY3JjbW9uOyAvKiBpZiAxIGFsbG93IGJhZCBjcmMgZnJhbWUgcmVjZXB0aW9uIGluIG1vbml0b3IgbW9kZS4gKi8KIAogCXN0cnVjdCB0aW1lcl9saXN0IHNjYW5fdGltZXI7Ci0JLypzaG9ydCBzY2FucGVuZGluZzsKLQlzaG9ydCBzdG9wc2NhbjsqLwogCXNwaW5sb2NrX3Qgc2Nhbl9sb2NrOwogCXU4IGFjdGl2ZV9wcm9iZTsKLQkvL3U4IGFjdGl2ZV9zY2FuX251bTsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKIAlzaG9ydCBod193ZXA7CiAKQEAgLTM1OSwyMCArMzE2LDIwIEBACiAJc2hvcnQgYW50YjsKIAlzaG9ydCBkaXZlcnNpdHk7CiAJdTMyIGtleTBbNF07Ci0Jc2hvcnQgKCpyZl9zZXRfc2Vucykoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBzZW5zKTsKLQl2b2lkICgqcmZfc2V0X2NoYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHNlbnMpOworCXZvaWQgKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpOwogCXZvaWQgKCpyZl9jbG9zZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnJmX2luaXQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpyZl9zbGVlcCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnJmX3dha2V1cCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0JLy9zaG9ydCByYXRlOworCS8qIHNob3J0IHJhdGU7ICovCiAJc2hvcnQgcHJvbWlzYzsKLQkvKnN0YXRzKi8KLQlzdHJ1Y3QgU3RhdHMgc3RhdHM7Ci0Jc3RydWN0IF9saW5rX2RldGVjdF90IGxpbmtfZGV0ZWN0OyAgLy9ZSixhZGQsMDgwODI4CisJLyogc3RhdHMgKi8KKwlzdHJ1Y3Qgc3RhdHMgc3RhdHM7CisJc3RydWN0IGxpbmtfZGV0ZWN0X3QgbGlua19kZXRlY3Q7IC8qIFlKLGFkZCwwODA4MjggKi8KIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CiAKLQkvKlJYIHN0dWZmKi8KKwkvKiBSWCBzdHVmZi4gKi8KIAl1MzIgKnJ4cmluZzsKIAl1MzIgKnJ4cmluZ3RhaWw7CiAJZG1hX2FkZHJfdCByeHJpbmdkbWE7CkBAIC0zODcsMjcgKzM0NCw2IEBACiAKIAl1MzIgcnhfcHJldmxlbjsKIAotCS8qVFggc3R1ZmYqLwotLyoKLQl1MzIgKnR4bHByaW5nOwotCXUzMiAqdHhocHJpbmc7Ci0JdTMyICp0eG5wcmluZzsKLQlkbWFfYWRkcl90IHR4bHByaW5nZG1hOwotCWRtYV9hZGRyX3QgdHhocHJpbmdkbWE7Ci0JZG1hX2FkZHJfdCB0eG5wcmluZ2RtYTsKLQl1MzIgKnR4bHByaW5ndGFpbDsKLQl1MzIgKnR4aHByaW5ndGFpbDsKLQl1MzIgKnR4bnByaW5ndGFpbDsKLQl1MzIgKnR4bHByaW5naGVhZDsKLQl1MzIgKnR4aHByaW5naGVhZDsKLQl1MzIgKnR4bnByaW5naGVhZDsKLQlzdHJ1Y3QgYnVmZmVyICp0eGxwYnVmczsKLQlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmczsKLQlzdHJ1Y3QgYnVmZmVyICp0eG5wYnVmczsKLQlzdHJ1Y3QgYnVmZmVyICp0eGxwYnVmc3RhaWw7Ci0Jc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnN0YWlsOwotCXN0cnVjdCBidWZmZXIgKnR4bnBidWZzdGFpbDsKLSovCiAJdTMyICp0eG1hcHJpbmc7CiAJdTMyICp0eGJrcHJpbmc7CiAJdTMyICp0eGJlcHJpbmc7CkBAIC00NDcsNTQgKzM4Myw0NyBAQAogCiAJaW50IHR4cmluZ2NvdW50OwogCWludCB0eGJ1ZmZzaXplOwotCS8vc3RydWN0IHR4X3BlbmRpbmdidWYgdHhucF9wZW5kaW5nOwotCS8vc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90eF90YXNrbGV0OwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcnhfdGFza2xldDsKIAl1OCBkbWFfcG9sbF9tYXNrOwotCS8vc2hvcnQgdHhfc3VzcGVuZDsKIAotCS8qIGFkaG9jL21hc3RlciBtb2RlIHN0dWZmICovCisJLyogYWRob2MvbWFzdGVyIG1vZGUgc3R1ZmYuICovCiAJdTMyICp0eGJlYWNvbnJpbmd0YWlsOwogCWRtYV9hZGRyX3QgdHhiZWFjb25yaW5nZG1hOwogCXUzMiAqdHhiZWFjb25yaW5nOwogCWludCB0eGJlYWNvbmNvdW50OwogCXN0cnVjdCBidWZmZXIgKnR4YmVhY29uYnVmczsKIAlzdHJ1Y3QgYnVmZmVyICp0eGJlYWNvbmJ1ZnN0YWlsOwotCS8vY2hhciAqbWFzdGVyX2Vzc2lkOwotCS8vdTE2IG1hc3Rlcl9iZWFjb25pbnRlcnZhbDsKLQkvL3UzMiBtYXN0ZXJfYmVhY29uc2l6ZTsKLQkvL3UxNiBiZWFjb25faW50ZXJ2YWw7CiAKIAl1OCByZXRyeV9kYXRhOwogCXU4IHJldHJ5X3J0czsKIAl1MTYgcnRzOwogCi0vL2J5IGFteSBmb3IgbGVkCi0JTEVEX1NUUkFURUdZXzgxODUgTGVkU3RyYXRlZ3k7Ci0vL2J5IGFteSBmb3IgbGVkCisJLyogYnkgYW15IGZvciBsZWQuICovCisJZW51bSBsZWRfc3RyYXRlZ3lfODE4NSBsZWRfc3RyYXRlZ3k7CisJLyogYnkgYW15IGZvciBsZWQuICovCiAKLS8vYnkgYW15IGZvciBwb3dlciBzYXZlCisJLyogYnkgYW15IGZvciBwb3dlciBzYXZlLiAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoX2RvZ190aW1lcjsKIAlib29sIGJJbmFjdGl2ZVBzOwogCWJvb2wgYlN3UmZQcm9jZXNzaW5nOwotCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVJbmFjdGl2ZVBvd2VyU3RhdGU7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlOwogCXUzMiBSZk9mZlJlYXNvbjsKIAlib29sIFJGQ2hhbmdlSW5Qcm9ncmVzczsKIAlib29sIFNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7Ci0JdTggICBSRlByb2dUeXBlOworCXU4IFJGUHJvZ1R5cGU7CiAJYm9vbCBiTGVpc3VyZVBzOwotCVJUX1BTX01PREUgZG90MTFQb3dlclNhdmVNb2RlOwotCS8vdTMyIE51bVJ4T2tJblBlcmlvZDsgICAvL1lKLGRlbCwwODA4MjgKLQkvL3UzMiBOdW1UeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4Ci0JdTggICBUeFBvbGxpbmdUaW1lczsKKwllbnVtIHJ0X3BzX21vZGUgZG90MTFQb3dlclNhdmVNb2RlOworCXU4IFR4UG9sbGluZ1RpbWVzOwogCi0JYm9vbAliQXBCdWZPdXJGcmFtZTsvLyBUUlVFIGlmIEFQIGJ1ZmZlciBvdXIgdW5pY2FzdCBkYXRhICwgd2Ugd2lsbCBrZWVwIGVBd2FrZSB1bnRpbCByZWNlaXZlIGRhdGEgb3IgdGltZW91dC4KLQl1OAlXYWl0QnVmRGF0YUJjbkNvdW50OwotCXU4CVdhaXRCdWZEYXRhVGltZU91dDsKKwlib29sIGJBcEJ1Zk91ckZyYW1lOyAvKiBUUlVFIGlmIEFQIGJ1ZmZlciBvdXIgdW5pY2FzdCBkYXRhICwgd2Ugd2lsbAorCQkJICAgICAgKiBrZWVwIGVBd2FrZSB1bnRpbCByZWNlaXZlIGRhdGEgb3IgdGltZW91dC4KKwkJCSAgICAgICovCisJdTggV2FpdEJ1ZkRhdGFCY25Db3VudDsKKwl1OCBXYWl0QnVmRGF0YVRpbWVPdXQ7CiAKLS8vYnkgYW15IGZvciBwb3dlciBzYXZlCi0vL2J5IGFteSBmb3IgYW50ZW5uYQorCS8qIGJ5IGFteSBmb3IgcG93ZXIgc2F2ZS4gKi8KKwkvKiBieSBhbXkgZm9yIGFudGVubmEuICovCiAJdTggRUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5OwogCWJvb2wgRUVQUk9NRGVmYXVsdEFudGVubmExOwogCXU4IFJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbTsKQEAgLTUwMywxMTUgKzQzMiwxMjggQEAKIAlib29sIGJEZWZhdWx0QW50ZW5uYTE7CiAJdTggU2lnbmFsU3RyZW5ndGg7CiAJbG9uZyBTdGF0c19TaWduYWxTdHJlbmd0aDsKLQlsb25nIExhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudDsgLy8gSW4gcGVyY2VudGFnZSwgdXNlZCBmb3Igc21vb3RoaW5nLCBlLmcuIE1vdmluZyBBdmVyYWdlLgotCXU4CSBTaWduYWxRdWFsaXR5OyAvLyBpbiAwLTEwMCBpbmRleC4KKwlsb25nIExhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudDsgLyogSW4gcGVyY2VudGFnZSwgdXNlZCBmb3Igc21vb3RoaW5nLAorCQkJCQkgICAqIGUuZy4gTW92aW5nIEF2ZXJhZ2UuCisJCQkJCSAgICovCisJdTggU2lnbmFsUXVhbGl0eTsgLyogaW4gMC0xMDAgaW5kZXguICovCiAJbG9uZyBTdGF0c19TaWduYWxRdWFsaXR5OwotCWxvbmcgUmVjdlNpZ25hbFBvd2VyOyAvLyBpbiBkQm0uCisJbG9uZyBSZWN2U2lnbmFsUG93ZXI7IC8qIGluIGRCbS4gKi8KIAlsb25nIFN0YXRzX1JlY3ZTaWduYWxQb3dlcjsKLQl1OAkgTGFzdFJ4UGt0QW50ZW5uYTsJLy8gK2J5IGFteSAwODAzMTIgQW50ZW5uYSB3aGljaCByZWNlaXZlZCB0aGUgbGFzdGVkIHBhY2tldC4gMDogQXV4LCAxOk1haW4uIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjI1LgorCXU4IExhc3RSeFBrdEFudGVubmE7IC8qICtieSBhbXkgMDgwMzEyIEFudGVubmEgd2hpY2ggcmVjZWl2ZWQgdGhlIGxhc3RlZAorCQkJICAgICAgKiBwYWNrZXQuIDA6IEF1eCwgMTpNYWluLiBBZGRlZCBieSBSb2dlciwKKwkJCSAgICAgICogMjAwOC4wMS4yNS4KKwkJCSAgICAgICovCiAJdTMyIEFkUnhPa0NudDsKIAlsb25nIEFkUnhTaWduYWxTdHJlbmd0aDsKLQl1OCBDdXJyQW50ZW5uYUluZGV4OwkJCS8vIEluZGV4IHRvIGN1cnJlbnQgQW50ZW5uYSAoYm90aCBUeCBhbmQgUngpLgotCXU4IEFkVGlja0NvdW50OwkJCQkvLyBUaW1lcyBvZiBTd0FudGVubmFEaXZlcnNpdHlUaW1lciBoYXBwZW5lZC4KLQl1OCBBZENoZWNrUGVyaW9kOwkJCQkvLyAjIG9mIHBlcmlvZCBTd0FudGVubmFEaXZlcnNpdHlUaW1lciB0byBjaGVjayBSeCBzaWduYWwgc3RyZW5ndGggZm9yIFNXIEFudGVubmEgRGl2ZXJzaXR5LgotCXU4IEFkTWluQ2hlY2tQZXJpb2Q7CQkJLy8gTWluIHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuCi0JdTggQWRNYXhDaGVja1BlcmlvZDsJCQkvLyBNYXggdmFsdWUgb2YgQWRDaGVja1BlcmlvZC4KLQlsb25nIEFkUnhTc1RocmVzaG9sZDsJCQkvLyBTaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIHRvIHN3aXRjaCBhbnRlbm5hLgotCWxvbmcgQWRNYXhSeFNzVGhyZXNob2xkOwkJCS8vIE1heCB2YWx1ZSBvZiBBZFJ4U3NUaHJlc2hvbGQuCi0JYm9vbCBiQWRTd2l0Y2hlZENoZWNraW5nOwkJLy8gVFJVRSBpZiB3ZSBzaGFsbCBzaGFsbCBjaGVjayBSeCBzaWduYWwgc3RyZW5ndGggZm9yIGxhc3QgdGltZSBzd2l0Y2hpbmcgYW50ZW5uYS4KLQlsb25nIEFkUnhTc0JlZm9yZVN3aXRjaGVkOwkJLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGJlZm9yZSB3ZSBzd2l0Y2hlZCBhbnRlbm5hLgorCXU4IEN1cnJBbnRlbm5hSW5kZXg7IC8qIEluZGV4IHRvIGN1cnJlbnQgQW50ZW5uYSAoYm90aCBUeCBhbmQgUngpLiAqLworCXU4IEFkVGlja0NvdW50OyAvKiBUaW1lcyBvZiBTd0FudGVubmFEaXZlcnNpdHlUaW1lciBoYXBwZW5lZC4gKi8KKwl1OCBBZENoZWNrUGVyaW9kOyAvKiAjIG9mIHBlcmlvZCBTd0FudGVubmFEaXZlcnNpdHlUaW1lciB0byBjaGVjayBSeAorCQkJICAgKiBzaWduYWwgc3RyZW5ndGggZm9yIFNXIEFudGVubmEgRGl2ZXJzaXR5LgorCQkJICAgKi8KKwl1OCBBZE1pbkNoZWNrUGVyaW9kOyAvKiBNaW4gdmFsdWUgb2YgQWRDaGVja1BlcmlvZC4gKi8KKwl1OCBBZE1heENoZWNrUGVyaW9kOyAvKiBNYXggdmFsdWUgb2YgQWRDaGVja1BlcmlvZC4gKi8KKwlsb25nIEFkUnhTc1RocmVzaG9sZDsgLyogU2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCB0byBzd2l0Y2ggYW50ZW5uYS4gKi8KKwlsb25nIEFkTWF4UnhTc1RocmVzaG9sZDsgLyogTWF4IHZhbHVlIG9mIEFkUnhTc1RocmVzaG9sZC4gKi8KKwlib29sIGJBZFN3aXRjaGVkQ2hlY2tpbmc7IC8qIFRSVUUgaWYgd2Ugc2hhbGwgc2hhbGwgY2hlY2sgUnggc2lnbmFsCisJCQkJICAgKiBzdHJlbmd0aCBmb3IgbGFzdCB0aW1lIHN3aXRjaGluZyBhbnRlbm5hLgorCQkJCSAgICovCisJbG9uZyBBZFJ4U3NCZWZvcmVTd2l0Y2hlZDsgLyogUnggc2lnbmFsIHN0cmVuZ3RoIGJlZm9yZSB3ZSBzd2l0Y2hlZAorCQkJCSAgICAqIGFudGVubmEuCisJCQkJICAgICovCiAJc3RydWN0IHRpbWVyX2xpc3QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXI7Ci0vL2J5IGFteSBmb3IgYW50ZW5uYQotLy97YnkgYW15IDA4MDMxMgotLy8KLQkvLyBDcnlzdGFsIGNhbGlicmF0aW9uLgotCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgotCS8vCi0JYm9vbAkJYlh0YWxDYWxpYnJhdGlvbjsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbi4KLQl1OAkJCVh0YWxDYWxfWGluOyAvLyBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4uIDB+Ny41cEYKLQl1OAkJCVh0YWxDYWxfWG91dDsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWG91dC4gMH43LjVwRgotCS8vCi0JLy8gVHggcG93ZXIgdHJhY2tpbmcgd2l0aCB0aGVybWFsIG1ldGVyIGluZGljYXRpb24uCi0JLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCi0JLy8KLQlib29sCQliVHhQb3dlclRyYWNrOyAvLyBUeCBQb3dlciB0cmFja2luZy4KLQl1OAkJCVRoZXJtYWxNZXRlcjsgLy8gVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgaW5kaWNhdGlvbi4KLQkvLwotCS8vIER5bmFtaWMgSW5pdGlhbCBHYWluIEFkanVzdG1lbnQgTWVjaGFuaXNtLiBBZGRlZCBieSBCcnVjZSwgMjAwNy0wMi0xNC4KLQkvLwotCWJvb2wJCQkJYkRpZ01lY2hhbmlzbTsgLy8gVFJVRSBpZiBESUcgaXMgZW5hYmxlZCwgRkFMU0Ugb3cuCi0JYm9vbAkJCQliUmVnSGlnaFBvd2VyTWVjaGFuaXNtOyAvLyBGb3IgSGlnaCBQb3dlciBNZWNoYW5pc20uIDA2MTAxMCwgYnkgcmNuamtvLgotCXUzMgkJCQkJRmFsc2VBbGFybVJlZ1ZhbHVlOwotCXU4CQkJCQlSZWdEaWdPZmRtRmFVcFRoOyAvLyBVcHBlciB0aHJlc2hvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwgd2hpY2ggaXMgdXNlZCBpbiBESUcuCi0JdTgJCQkJCURJR19OdW1iZXJGYWxsYmFja1ZvdGU7Ci0JdTgJCQkJCURJR19OdW1iZXJVcGdyYWRlVm90ZTsKLQkvLyBGb3IgSFcgYW50ZW5uYSBkaXZlcnNpdHksIGFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjMwLgotCXUzMgkJCUFkTWFpbkFudGVubmFSeE9rQ250OwkJLy8gTWFpbiBhbnRlbm5hIFJ4IE9LIGNvdW50LgotCXUzMgkJCUFkQXV4QW50ZW5uYVJ4T2tDbnQ7CQkvLyBBdXggYW50ZW5uYSBSeCBPSyBjb3VudC4KLQlib29sCQliSFdBZFN3aXRjaGVkOwkJCQkvLyBUUlVFIGlmIHdlIGhhcyBzd2l0Y2hlZCBkZWZhdWx0IGFudGVubmEgYnkgSFcgZXZhbHVhdGlvbi4KLQkvLyBSRiBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIHRocmVzaG9sZC4KLQl1OAkJCQkJUmVnSGlQd3JVcHBlclRoOwotCXU4CQkJCQlSZWdIaVB3ckxvd2VyVGg7Ci0JLy8gUkYgUlNTSSBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIFRocmVzaG9sZC4KLQl1OAkJCQkJUmVnUlNTSUhpUHdyVXBwZXJUaDsKLQl1OAkJCQkJUmVnUlNTSUhpUHdyTG93ZXJUaDsKLQkvLyBDdXJyZW50IENDSyBSU1NJIHZhbHVlIHRvIGRldGVybWluZSBDQ0sgaGlnaCBwb3dlciwgYXNrZWQgYnkgU0QzIERaLCBieSBCcnVjZSwgMjAwNy0wNC0xMi4KLQl1OAkJCUN1ckNDS1JTU0k7Ci0JYm9vbCAgICAgICAgYkN1ckNDS1BrdDsKLQkvLwotCS8vIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiBBZGRlZCBieSBhbXksIDA4MDMxMi4KLQkvLwotCWJvb2wJCQkJCWJUb1VwZGF0ZVR4UHdyOwotCWxvbmcJCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRTUzsKLQlsb25nCQkJCQlVbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlcjsKLQl1OAkJCQkJCVJTU0k7Ci0JY2hhcgkJCQkJUnhQb3dlcjsKLQkgdTggSW5pdGlhbEdhaW47Ci0JIC8vRm9yIGFkanVzdCBEaWcgVGhyZXNob2xkIGR1cmluZyBMZWdhY3kvTGVpc3VyZSBQb3dlciBTYXZlIE1vZGUKLQl1MzIJCQkJRG96ZVBlcmlvZEluUGFzdDJTZWM7Ci0JIC8vIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uCi0JdTgJCQkJCUluaXRpYWxHYWluQmFja1VwOwotCSB1OCBSZWdCTW9kZUdhaW5TdGFnZTsKLS8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCi0gICAgc3RydWN0IHRpbWVyX2xpc3QgcmF0ZWFkYXB0ZXJfdGltZXI7Ci0JdTMyICAgIFJhdGVBZGFwdGl2ZVBlcmlvZDsKLQlib29sICAgYkVuaGFuY2VUeFB3cjsKLQlib29sICAgYlVwZGF0ZUFSRlI7Ci0JaW50CSAgIEZvcmNlZERhdGFSYXRlOyAvLyBGb3JjZSBEYXRhIFJhdGUuIDA6IEF1dG8sIDB4MDI6IDFNIH4gMHg2QzogNTRNLikKLQl1MzIgICAgIE51bVR4VW5pY2FzdDsgLy9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCi0JdTggICAgICBrZWVwQWxpdmVMZXZlbDsgLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKLQl1bnNpZ25lZCBsb25nIAlOdW1UeE9rVG90YWw7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFJldHJ5Q250OwotICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFJldHJ5UmF0ZTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICBMYXN0VHhva0NudDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgTGFzdFJ4b2tDbnQ7Ci0gICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyUmV0cnlDbnQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIExhc3RUeE9LQnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyAJCSAgICBOdW1UeE9rQnl0ZXNUb3RhbDsKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RGYWlsVHhSYXRlOwotICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgTGFzdEZhaWxUeFJhdGVTUzsKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxUeFJhdGVDb3VudDsKLSAgICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RUeFRocm91Z2hwdXQ7Ci0gICAgICAgIC8vZm9yIHVwIHJhdGUKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgYlRyeXVwaW5nOwotICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclR4UmF0ZTsgICAgIC8vdGhlIHJhdGUgYmVmb3JlIHVwCi0gICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyUmV0cnlSYXRlOwotICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5dXBpbmdDb3VudDsKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeURvd25Db3VudExvd0RhdGE7Ci0gICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnl1cGluZ0NvdW50Tm9EYXRhOworCS8qIGJ5IGFteSBmb3IgYW50ZW5uYSB7YnkgYW15IDA4MDMxMiAqLwogCi0gICAgICAgIHU4ICAgICAgICAgICAgICAgICAgQ3VycmVudE9wZXJhUmF0ZTsKLS8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCi0vL2J5IGFteSAwODAzMTJ9Ci0vLwlzaG9ydCB3cV9odXJyeXVwOwotLy8Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwkvKiBDcnlzdGFsIGNhbGlicmF0aW9uLiBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4gKi8KKworCWJvb2wgYlh0YWxDYWxpYnJhdGlvbjsgLyogQ3J5c3RhbCBjYWxpYnJhdGlvbi4qLworCXU4IFh0YWxDYWxfWGluOyAvKiBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4uIDB+Ny41cEYgKi8KKwl1OCBYdGFsQ2FsX1hvdXQ7IC8qIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhvdXQuIDB+Ny41cEYgKi8KKworCS8qIFR4IHBvd2VyIHRyYWNraW5nIHdpdGggdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLgorCSAqIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCSAqLworCisJYm9vbCBiVHhQb3dlclRyYWNrOyAvKiBUeCBQb3dlciB0cmFja2luZy4gKi8KKwl1OCBUaGVybWFsTWV0ZXI7IC8qIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGluZGljYXRpb24uICovCisKKwkvKiBEeW5hbWljIEluaXRpYWwgR2FpbiBBZGp1c3RtZW50IE1lY2hhbmlzbS4gQWRkZWQgYnkgQnJ1Y2UsCisJICogMjAwNy0wMi0xNC4KKwkgKi8KKwlib29sIGJEaWdNZWNoYW5pc207IC8qIFRSVUUgaWYgRElHIGlzIGVuYWJsZWQsIEZBTFNFIG93LiAqLworCWJvb2wgYlJlZ0hpZ2hQb3dlck1lY2hhbmlzbTsgLyogRm9yIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiAwNjEwMTAsCisJCQkJICAgICAgKiBieSByY25qa28uCisJCQkJICAgICAgKi8KKwl1MzIgRmFsc2VBbGFybVJlZ1ZhbHVlOworCXU4IFJlZ0RpZ09mZG1GYVVwVGg7IC8qIFVwcGVyIHRocmVzaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLCB3aGljaCBpcworCQkJICAgICAgKiB1c2VkIGluIERJRy4KKwkJCSAgICAgICovCisJdTggRElHX051bWJlckZhbGxiYWNrVm90ZTsKKwl1OCBESUdfTnVtYmVyVXBncmFkZVZvdGU7CisJLyogRm9yIEhXIGFudGVubmEgZGl2ZXJzaXR5LCBhZGRlZCBieSBSb2dlciwgMjAwOC4wMS4zMC4gKi8KKwl1MzIgQWRNYWluQW50ZW5uYVJ4T2tDbnQ7IC8qIE1haW4gYW50ZW5uYSBSeCBPSyBjb3VudC4gKi8KKwl1MzIgQWRBdXhBbnRlbm5hUnhPa0NudDsgLyogQXV4IGFudGVubmEgUnggT0sgY291bnQuICovCisJYm9vbCBiSFdBZFN3aXRjaGVkOyAvKiBUUlVFIGlmIHdlIGhhcyBzd2l0Y2hlZCBkZWZhdWx0IGFudGVubmEgYnkgSFcKKwkJCSAgICAgKiBldmFsdWF0aW9uLgorCQkJICAgICAqLworCS8qIFJGIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgdGhyZXNob2xkLiAqLworCXU4IFJlZ0hpUHdyVXBwZXJUaDsKKwl1OCBSZWdIaVB3ckxvd2VyVGg7CisJLyogUkYgUlNTSSBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIFRocmVzaG9sZC4gKi8KKwl1OCBSZWdSU1NJSGlQd3JVcHBlclRoOworCXU4IFJlZ1JTU0lIaVB3ckxvd2VyVGg7CisJLyogQ3VycmVudCBDQ0sgUlNTSSB2YWx1ZSB0byBkZXRlcm1pbmUgQ0NLIGhpZ2ggcG93ZXIsIGFza2VkIGJ5IFNEMyBEWiwKKwkgKiBieSBCcnVjZSwgMjAwNy0wNC0xMi4KKwkgKi8KKwl1OCBDdXJDQ0tSU1NJOworCWJvb2wgYkN1ckNDS1BrdDsKKwkvKiBIaWdoIFBvd2VyIE1lY2hhbmlzbS4gQWRkZWQgYnkgYW15LCAwODAzMTIuICovCisJYm9vbCBiVG9VcGRhdGVUeFB3cjsKKwlsb25nIFVuZGVjb3JhdGVkU21vb3RoZWRTUzsKKwlsb25nIFVuZGVjb3JhdGVkU21vb3RoZWRSeFBvd2VyOworCXU4IFJTU0k7CisJY2hhciBSeFBvd2VyOworCXU4IEluaXRpYWxHYWluOworCS8qIEZvciBhZGp1c3QgRGlnIFRocmVzaG9sZCBkdXJpbmcgTGVnYWN5L0xlaXN1cmUgUG93ZXIgU2F2ZSBNb2RlLiAqLworCXUzMiBEb3plUGVyaW9kSW5QYXN0MlNlYzsKKwkvKiBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLiAqLworCXU4IEluaXRpYWxHYWluQmFja1VwOworCXU4IFJlZ0JNb2RlR2FpblN0YWdlOworCS8qIGJ5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAqLworCXN0cnVjdCB0aW1lcl9saXN0IHJhdGVhZGFwdGVyX3RpbWVyOworCXUzMiBSYXRlQWRhcHRpdmVQZXJpb2Q7CisJYm9vbCBiRW5oYW5jZVR4UHdyOworCWJvb2wgYlVwZGF0ZUFSRlI7CisJaW50IEZvcmNlZERhdGFSYXRlOyAvKiBGb3JjZSBEYXRhIFJhdGUuIDA6IEF1dG8sIDB4MDI6IDFNIH4gMHg2QzogNTRNLikKKwkJCSAgICAgKi8KKwl1MzIgTnVtVHhVbmljYXN0OyAvKiBZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlLiAqLworCXU4IGtlZXBBbGl2ZUxldmVsOyAvKllKLGFkZCwwODA4MjgsZm9yIEtlZXBBbGl2ZS4gKi8KKwl1bnNpZ25lZCBsb25nIE51bVR4T2tUb3RhbDsKKwl1MTYgTGFzdFJldHJ5Q250OworCXUxNiBMYXN0UmV0cnlSYXRlOworCXVuc2lnbmVkIGxvbmcgTGFzdFR4b2tDbnQ7CisJdW5zaWduZWQgbG9uZyBMYXN0Unhva0NudDsKKwl1MTYgQ3VyclJldHJ5Q250OworCXVuc2lnbmVkIGxvbmcgTGFzdFR4T0tCeXRlczsKKwl1bnNpZ25lZCBsb25nIE51bVR4T2tCeXRlc1RvdGFsOworCXU4IExhc3RGYWlsVHhSYXRlOworCWxvbmcgTGFzdEZhaWxUeFJhdGVTUzsKKwl1OCBGYWlsVHhSYXRlQ291bnQ7CisJdTMyIExhc3RUeFRocm91Z2hwdXQ7CisJLyogZm9yIHVwIHJhdGUuICovCisJdW5zaWduZWQgc2hvcnQgYlRyeXVwaW5nOworCXU4IEN1cnJUeFJhdGU7IC8qIHRoZSByYXRlIGJlZm9yZSB1cC4gKi8KKwl1MTYgQ3VyclJldHJ5UmF0ZTsKKwl1MTYgVHJ5dXBpbmdDb3VudDsKKwl1OCBUcnlEb3duQ291bnRMb3dEYXRhOworCXU4IFRyeXVwaW5nQ291bnROb0RhdGE7CisKKwl1OCBDdXJyZW50T3BlcmFSYXRlOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOwogCXNob3J0IGFja190eF90b19pZWVlOwogCiAJdTggZG1hX3BvbGxfc3RvcF9tYXNrOwogCi0JLy91OCBSZWdUaHJlZVdpcmVNb2RlOwogCXUxNiBTaG9ydFJldHJ5TGltaXQ7CiAJdTE2IExvbmdSZXRyeUxpbWl0OwogCXUxNiBFYXJseVJ4VGhyZXNob2xkOwpAQCAtNjE5LDggKzU2MSw4IEBACiAJdTMyIFJlY2VpdmVDb25maWc7CiAJdTMyIEludHJNYXNrOwogCi0Jc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyAgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7Ci19cjgxODBfcHJpdjsKKwlzdHJ1Y3QgY2hubF9hY2Nlc3Nfc2V0dGluZyBDaGFubmVsQWNjZXNzU2V0dGluZzsKK307CiAKICNkZWZpbmUgTUFOQUdFX1BSSU9SSVRZIDAKICNkZWZpbmUgQktfUFJJT1JJVFkgMQpAQCAtNjMyLDE0ICs1NzQsMTQgQEAKIAogI2RlZmluZSBMT1dfUFJJT1JJVFkgVklfUFJJT1JJVFkKICNkZWZpbmUgTk9STV9QUklPUklUWSBWT19QUklPUklUWQotLy9BQzJRdWV1ZSBtYXBwaW5nCisvKiBBQzJRdWV1ZSBtYXBwaW5nLiAqLwogI2RlZmluZSBBQzJRKF9hYykgKCgoX2FjKSA9PSBXTUVfQUNfVk8pID8gVk9fUFJJT1JJVFkgOiBcCiAJCSgoX2FjKSA9PSBXTUVfQUNfVkkpID8gVklfUFJJT1JJVFkgOiBcCiAJCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gQktfUFJJT1JJVFkgOiBcCiAJCUJFX1BSSU9SSVRZKQogCiBzaG9ydCBydGw4MTgwX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpza2J1ZiwgaW50IGxlbiwgaW50IHByaW9yaXR5LAotCQkgc2hvcnQgbW9yZWZyYWcsIHNob3J0IGZyYWdkZXNjLCBpbnQgcmF0ZSk7CisJCSBib29sIG1vcmVmcmFnLCBzaG9ydCBmcmFnZGVzYywgaW50IHJhdGUpOwogCiB1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKIHUzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7CkBAIC02NzMsNyArNjE1LDYgQEAKIGJvb2wgU2V0QW50ZW5uYUNvbmZpZzg3U0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggRGVmYXVsdEFudCwKIAkJCSAgYm9vbCBiQW50RGl2ZXJzaXR5KTsKIAotLy8jaWZkZWYgQ09ORklHX1JUTDgxODVCCiB2b2lkIHJ0bDgxODViX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIHJ0bDgxODViX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgcnRsODE4NWJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNjgyLDkgKzYyMyw4IEBACiB2b2lkIGZpeF9yeF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBmaXhfdHhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCk7Ci12b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspOwotLy8jZW5kaWYKLWJvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSVF9SRl9QT1dFUl9TVEFURSBTdGF0ZVRvU2V0LAordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworYm9vbCBNZ250QWN0U2V0X1JGX1N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gcnRfcmZfcG93ZXJfc3RhdGUgU3RhdGVUb1NldCwKIAkJCSB1MzIgQ2hhbmdlU291cmNlKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCmluZGV4IDZjYWZlZTIuLmE2MDIyZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCkBAIC0xLDMxICsxLDMxIEBACiAvKgotICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxOHggcGNpIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjEKLSAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgotICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkKLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwKLSAgIFJlYWx0ZWsgZHJpdmVyLgotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCi0gICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KLQotICAgUGFydHMgb2YgQkIvUkYgY29kZSBhcmUgZGVyaXZlZCBmcm9tIERhdmlkIFlvdW5nIHJ0bDgxODAgbmV0YnNkIGRyaXZlci4KLQotICAgUlNTSSBjYWxjIGZ1bmN0aW9uIGZyb20gJ1RoZSBEZXVjZScKLQotICAgU29tZSBpZGVhcyBib3Jyb3dlZCBmcm9tIHRoZSA4MTM5dG9vLmMgZHJpdmVyIGluY2x1ZGVkIGluIGxpbnV4IGtlcm5lbC4KLQotICAgV2UgKEk/KSB3YW50IHRvIHRoYW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWNzIGFuZCBhbHNvIHRoZQotICAgTmRpc3dyYXBwZXIncyBwcm9qZWN0IEF1dGhvcnMuCi0KLSAgIEEgYmlnIGJpZyB0aGFua3MgZ29lcyBhbHNvIHRvIFJlYWx0ZWsgY29ycC4gZm9yIHRoZWlyIGhlbHAgaW4gbXkgYXR0ZW1wdCB0bwotICAgYWRkIFJUTDgxODUgYW5kIFJUTDgyMjUgc3VwcG9ydCwgYW5kIHRvIERhdmlkIFlvdW5nIGFsc28uCi0KLSAgIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgotICAgV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgotKi8KKyAqIFRoaXMgaXMgcGFydCBvZiBydGw4MTh4IHBjaSBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4xCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2Vuc2UpCisgKgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwKKyAqIFJlYWx0ZWsgZHJpdmVyLgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAqIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisgKgorICogUGFydHMgb2YgQkIvUkYgY29kZSBhcmUgZGVyaXZlZCBmcm9tIERhdmlkIFlvdW5nIHJ0bDgxODAgbmV0YnNkIGRyaXZlci4KKyAqCisgKiBSU1NJIGNhbGMgZnVuY3Rpb24gZnJvbSAnVGhlIERldWNlJworICoKKyAqIFNvbWUgaWRlYXMgYm9ycm93ZWQgZnJvbSB0aGUgODEzOXRvby5jIGRyaXZlciBpbmNsdWRlZCBpbiBsaW51eCBrZXJuZWwuCisgKgorICogV2UgKEk/KSB3YW50IHRvIHRoYW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWNzIGFuZCBhbHNvIHRoZQorICogTmRpc3dyYXBwZXIncyBwcm9qZWN0IEF1dGhvcnMuCisgKgorICogQSBiaWcgYmlnIHRoYW5rcyBnb2VzIGFsc28gdG8gUmVhbHRlayBjb3JwLiBmb3IgdGhlaXIgaGVscCBpbiBteSBhdHRlbXB0IHRvCisgKiBhZGQgUlRMODE4NSBhbmQgUlRMODIyNSBzdXBwb3J0LCBhbmQgdG8gRGF2aWQgWW91bmcgYWxzby4KKyAqCisgKiBQb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KKyAqIFdyaXR0ZW4gYnkgTWFyaXVzeiBNYXR1c3play4KKyAqLwogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKQEAgLTI1OCw3ICsyNTgsOSBAQAogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIHRvdGFsT0s7CiAKLQl0b3RhbE9LID0gcHJpdi0+c3RhdHMudHhucG9raW50K3ByaXYtPnN0YXRzLnR4aHBva2ludCtwcml2LT5zdGF0cy50eGxwb2tpbnQ7CisJdG90YWxPSyA9IHByaXYtPnN0YXRzLnR4bnBva2ludCArIHByaXYtPnN0YXRzLnR4aHBva2ludCArCisJCXByaXYtPnN0YXRzLnR4bHBva2ludDsKKwogCXNlcV9wcmludGYobSwKIAkJIlRYIE9LOiAlbHVcbiIKIAkJIlRYIEVycm9yOiAlbHVcbiIKQEAgLTM0Nyw5ICszNDksOSBAQAogfQogCiAvKgotICBGSVhNRTogY2hlY2sgaWYgd2UgY2FuIHVzZSBzb21lIHN0YW5kYXJkIGFscmVhZHktZXhpc3RlbnQKLSAgZGF0YSB0eXBlK2Z1bmN0aW9ucyBpbiBrZXJuZWwKLSovCisgKiBGSVhNRTogY2hlY2sgaWYgd2UgY2FuIHVzZSBzb21lIHN0YW5kYXJkIGFscmVhZHktZXhpc3RlbnQKKyAqIGRhdGEgdHlwZStmdW5jdGlvbnMgaW4ga2VybmVsLgorICovCiAKIHN0YXRpYyBzaG9ydCBidWZmZXJfYWRkKHN0cnVjdCBidWZmZXIgKipidWZmZXIsIHUzMiAqYnVmLCBkbWFfYWRkcl90IGRtYSwKIAkJCXN0cnVjdCBidWZmZXIgKipidWZmZXJoZWFkKQpAQCAtNDY4LDkgKzQ3MCwxMSBAQAogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJlcXVpcmVkYnl0ZSwgcmVxdWlyZWQ7CisJaW50IHJlcXVpcmVkYnl0ZTsKKwlpbnQgcmVxdWlyZWQ7CiAKLQlyZXF1aXJlZGJ5dGUgPSBwcml2LT5pZWVlODAyMTEtPmZ0cyArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhKTsKKwlyZXF1aXJlZGJ5dGUgPSBwcml2LT5pZWVlODAyMTEtPmZ0cyArCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhKTsKIAogCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkKIAkJcmVxdWlyZWRieXRlICs9IDI7CkBAIC00ODQsNyArNDg4LDcgQEAKIAkgKiBiZXR3ZWVuIHRoZSB0YWlsIGFuZCB0aGUgaGVhZAogCSAqLwogCi0JcmV0dXJuIChyZXF1aXJlZCsyIDwgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldiwgcHJpb3JpdHkpKTsKKwlyZXR1cm4gcmVxdWlyZWQgKyAyIDwgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldiwgcHJpb3JpdHkpOwogfQogCiB2b2lkIGZpeF90eF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02NDksNyArNjUzLDcgQEAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAKIAlpZiAoKGNoID4gMTQpIHx8IChjaCA8IDEpKSB7Ci0JCXByaW50aygiSW4gJXM6IEludmFsaWQgY2huYW5lbCAlZFxuIiwgX19mdW5jX18sIGNoKTsKKwkJbmV0ZGV2X2VycihkZXYsICJJbiAlczogSW52YWxpZCBjaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgY2gpOwogCQlyZXR1cm47CiAJfQogCkBAIC03NDIsNDMgKzc0Niw1MCBAQAogCiAJCXN3aXRjaCAoYWRkcikgewogCQljYXNlIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhtYXBidWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4bWFwYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRYX0JLUFJJT1JJVFlfUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJrcGJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHhia3BidWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBMUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFhfQkVQUklPUklUWV9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4YmVwYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eGJlcGJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHh2aXBidWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4dmlwYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTFAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eHZvcGJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHh2b3BidWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhocGJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHhocGJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEhQIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUWF9CRUFDT05fUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJlYWNvbmJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHhiZWFjb25idWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBCUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQpAQCAtODk3LDggKzkwOCw4IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlkZXNjID0gKHUzMiAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKnJ4X2Rlc2Nfc2l6ZSpjb3VudCsyNTYsCi0JCQkJCSAgJmRtYV9kZXNjKTsKKwlkZXNjID0gKHUzMiAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCXNpemVvZih1MzIpICogcnhfZGVzY19zaXplICogY291bnQgKyAyNTYsICZkbWFfZGVzYyk7CiAKIAlpZiAoZG1hX2Rlc2MgJiAweGZmKQogCQkvKgpAQCAtOTM1LDcgKzk0Niw4IEBACiAJCXRtcCA9IHRtcCtyeF9kZXNjX3NpemU7CiAJfQogCi0JKih0bXAtcnhfZGVzY19zaXplKSA9ICoodG1wLXJ4X2Rlc2Nfc2l6ZSkgfCAoMTw8MzApOyAvKiB0aGlzIGlzIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkvKiB0aGlzIGlzIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkqKHRtcCAtIHJ4X2Rlc2Nfc2l6ZSkgPSAqKHRtcCAtIHJ4X2Rlc2Nfc2l6ZSkgfCAoMSA8PCAzMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMDksNyArMTAyMSw4IEBACiAJfQogfQogCi1zdGF0aWMgdTE2IHJ0bF9yYXRlW10gPSB7MTAsIDIwLCA1NSwgMTEwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDcyMH07CitzdGF0aWMgdTE2IHJ0bF9yYXRlW10gPSB7MTAsIDIwLCA1NSwgMTEwLCA2MCwKKwk5MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNzIwfTsKIAogaW5saW5lIHUxNiBydGw4MTgwX3JhdGUycmF0ZShzaG9ydCByYXRlKQogewpAQCAtMTE0MywyMyArMTE1NiwzMCBAQAogLyoKICAqIFBlcmZvcm0gc2lnbmFsIHNtb290aGluZyBmb3IgZHluYW1pYyBtZWNoYW5pc20uCiAgKiBUaGlzIGlzIGRpZmZlcmVudCB3aXRoIFBlcmZvcm1TaWduYWxTbW9vdGhpbmc4MTg1IGluIHNtb290aGluZyBmb3JtdWxhLgotICogTm8gZHJhbWF0aWMgYWRqdXN0aW9uIGlzIGFwcGx5IGJlY2F1c2UgZHluYW1pYyBtZWNoYW5pc20gbmVlZCBzb21lIGRlZ3JlZQotICogb2YgY29ycmVjdG5lc3MuIFBvcnRlZCBmcm9tIDgxODdCLgorICogTm8gZHJhbWF0aWMgYWRqdXN0bWVudCBpcyBhcHBsaWVkIGJlY2F1c2UgZHluYW1pYyBtZWNoYW5pc20gbmVlZCBzb21lCisgKiBkZWdyZWUgb2YgY29ycmVjdG5lc3MuIFBvcnRlZCBmcm9tIDgxODdCLgogICovCiBzdGF0aWMgdm9pZCBQZXJmb3JtVW5kZWNvcmF0ZWRTaWduYWxTbW9vdGhpbmc4MTg1KHN0cnVjdCByODE4MF9wcml2ICpwcml2LAogCQkJCQkJICBib29sIGJDY2tSYXRlKQogewotCS8qIERldGVybWluIHRoZSBjdXJyZW50IHBhY2tldCBpcyBDQ0sgcmF0ZS4gKi8KKwlsb25nIHNtb290aGVkU1M7CisJbG9uZyBzbW9vdGhlZFJ4OworCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHBhY2tldCBpcyBDQ0sgcmF0ZS4gKi8KIAlwcml2LT5iQ3VyQ0NLUGt0ID0gYkNja1JhdGU7CiAKLQlpZiAocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID49IDApCi0JCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA9ICgocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTICogNSkgKwotCQkJCQkgICAgICAgKHByaXYtPlNpZ25hbFN0cmVuZ3RoICogMTApKSAvIDY7Ci0JZWxzZQotCQlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPSBwcml2LT5TaWduYWxTdHJlbmd0aCAqIDEwOworCXNtb290aGVkU1MgPSBwcml2LT5TaWduYWxTdHJlbmd0aCAqIDEwOwogCi0JcHJpdi0+VW5kZXJjb3JhdGVTbW9vdGhlZFJ4UG93ZXIgPSAoKHByaXYtPlVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyICogNTApICsKLQkJCQkJICAgIChwcml2LT5SeFBvd2VyICogMTEpKSAvIDYwOworCWlmIChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPj0gMCkKKwkJc21vb3RoZWRTUyA9ICgocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTICogNSkgKworCQkJCXNtb290aGVkU1MpIC8gNjsKKworCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA9IHNtb290aGVkU1M7CisKKwlzbW9vdGhlZFJ4ID0gKChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkUnhQb3dlciAqIDUwKSArCisJCQkocHJpdi0+UnhQb3dlciAqIDExKSkgLyA2MDsKKworCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRSeFBvd2VyID0gc21vb3RoZWRSeDsKIAogCWlmIChiQ2NrUmF0ZSkKIAkJcHJpdi0+Q3VyQ0NLUlNTSSA9IHByaXYtPlJTU0k7CkBAIC0xMjA2LDggKzEyMjYsOSBAQAogCXJ4X2Rlc2Nfc2l6ZSA9IDg7CiAKIAlpZiAoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDE8PDMxKSkgewotCQkvKiB3ZSBoYXZlIGdvdCBhbiBSWCBpbnQsIGJ1dCB0aGUgZGVzY3JpcHRvcgotCQkgKiB3ZSBhcmUgcG9pbnRpbmcgaXMgZW1wdHkgKi8KKwkJLyogd2UgaGF2ZSBnb3QgYW4gUlggaW50LCBidXQgdGhlIGRlc2NyaXB0b3IuIHdlIGFyZSBwb2ludGluZworCQkgKiBpcyBlbXB0eS4KKwkJICovCiAKIAkJcHJpdi0+c3RhdHMucnhub2RhdGErKzsKIAkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTEyMTYsNyArMTIzNyw4IEBACiAJCXRtcCA9IHByaXYtPnJ4cmluZ3RhaWw7CiAJCWRvIHsKIAkJCWlmICh0bXAgPT0gcHJpdi0+cnhyaW5nKQotCQkJCXRtcCAgPSBwcml2LT5yeHJpbmcgKyAocHJpdi0+cnhyaW5nY291bnQgLSAxKSpyeF9kZXNjX3NpemU7CisJCQkJdG1wICA9IHByaXYtPnJ4cmluZyArIChwcml2LT5yeHJpbmdjb3VudCAtIDEpICoKKwkJCQkJcnhfZGVzY19zaXplOwogCQkJZWxzZQogCQkJCXRtcCAtPSByeF9kZXNjX3NpemU7CiAKQEAgLTEyMzcsNyArMTI1OSw2IEBACiAKIAkJaWYgKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjcpKSB7CiAJCQlwcml2LT5zdGF0cy5yeGRtYWZhaWwrKzsKLQkJCS8qIERNRVNHKCJFRTogUlggRE1BIEZBSUxFRCBhdCBidWZmZXIgcG9pbnRlZCBieSBkZXNjcmlwdG9yICV4IiwodTMyKXByaXYtPnJ4cmluZ3RhaWwpOyAqLwogCQkJZ290byBkcm9wOwogCQl9CiAKQEAgLTEyNTQsMTAgKzEyNzUsOSBAQAogCQlpZiAobGFzdCkgewogCQkJbGFzdGxlbiA9ICgoKnByaXYtPnJ4cmluZ3RhaWwpICYgMHhmZmYpOwogCi0JCQkvKiBpZiB0aGUgbGFzdCBkZXNjcmlwdG9yICh0aGF0IHNob3VsZAotCQkJICogdGVsbCB1cyB0aGUgdG90YWwgcGFja2V0IGxlbikgdGVsbAotCQkJICogdXMgc29tZXRoaW5nIGxlc3MgdGhhbiB0aGUgZGVzY3JpcHRvcnMKLQkJCSAqIGxlbiB3ZSBoYWQgdW50aWwgbm93LCB0aGVuIHRoZXJlIGlzIHNvbWUKKwkJCS8qIGlmIHRoZSBsYXN0IGRlc2NyaXB0b3IgKHRoYXQgc2hvdWxkIHRlbGwgdXMgdGhlIHRvdGFsCisJCQkgKiBwYWNrZXQgbGVuKSB0ZWxsIHVzIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlCisJCQkgKiBkZXNjcmlwdG9ycyBsZW4gd2UgaGFkIHVudGlsIG5vdywgdGhlbiB0aGVyZSBpcyBzb21lCiAJCQkgKiBwcm9ibGVtLi4KIAkJCSAqIHdvcmthcm91bmQgdG8gcHJldmVudCBrZXJuZWwgcGFuaWMKIAkJCSAqLwpAQCAtMTI5MywzMSArMTMxMywzNiBAQAogCQlwcml2LT5yeF9wcmV2bGVuICs9IGxlbjsKIAogCQlpZiAocHJpdi0+cnhfcHJldmxlbiA+IE1BWF9GUkFHX1RIUkVTSE9MRCArIDEwMCkgewotCQkJLyogSFcgaXMgcHJvYmFibHkgcGFzc2luZyBzZXZlcmFsIGJ1Z2d5IGZyYW1lcwotCQkJKiB3aXRob3V0IEZEIG9yIExEIGZsYWcgc2V0LgotCQkJKiBUaHJvdyB0aGlzIGdhcmJhZ2UgYXdheSB0byBwcmV2ZW50IHNrYgotCQkJKiBtZW1vcnkgZXhoYXVzdGluZwotCQkJKi8KKwkJCS8qIEhXIGlzIHByb2JhYmx5IHBhc3Npbmcgc2V2ZXJhbCBidWdneSBmcmFtZXMgd2l0aG91dAorCQkJICogRkQgb3IgTEQgZmxhZyBzZXQuCisJCQkgKiBUaHJvdyB0aGlzIGdhcmJhZ2UgYXdheSB0byBwcmV2ZW50IHNrYiBtZW1vcnkKKwkJCSAqIGV4aGF1c3RpbmcKKwkJCSAqLwogCQkJaWYgKCFwcml2LT5yeF9za2JfY29tcGxldGUpCiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKIAkJCXByaXYtPnJ4X3NrYl9jb21wbGV0ZSA9IDE7CiAJCX0KIAotCQlzaWduYWwgPSAodW5zaWduZWQgY2hhcikoKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpICYgKDB4MDBmZjAwMDApKT4+MTYpOworCQlzaWduYWwgPSAodW5zaWduZWQgY2hhcikoKCoocHJpdi0+cnhyaW5ndGFpbCArIDMpICYKKwkJCTB4MDBmZjAwMDApID4+IDE2KTsKIAkJc2lnbmFsID0gKHNpZ25hbCAmIDB4ZmUpID4+IDE7CiAKIAkJcXVhbGl0eSA9ICh1bnNpZ25lZCBjaGFyKSgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweGZmKSk7CiAKIAkJc3RhdHMubWFjX3RpbWVbMF0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMSk7CiAJCXN0YXRzLm1hY190aW1lWzFdID0gKihwcml2LT5yeHJpbmd0YWlsKzIpOwotCQlyeHBvd2VyID0gKChjaGFyKSgoKCoocHJpdi0+cnhyaW5ndGFpbCs0KSkgJiAoMHgwMGZmMDAwMCkpPj4xNikpLzIgLSA0MjsKLQkJUlNTSSA9ICgodTgpKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweDAwMDBmZjAwKSk+PjgpKSAmICgweDdmKTsKKworCQlyeHBvd2VyID0gKChjaGFyKSgoKihwcml2LT5yeHJpbmd0YWlsICsgNCkgJgorCQkJMHgwMGZmMDAwMCkgPj4gMTYpKSAvIDIgLSA0MjsKKworCQlSU1NJID0gKCh1OCkoKCoocHJpdi0+cnhyaW5ndGFpbCArIDMpICYKKwkJCTB4MDAwMGZmMDApID4+IDgpKSAmIDB4N2Y7CiAKIAkJcmF0ZSA9ICgoKihwcml2LT5yeHJpbmd0YWlsKSkgJgogCQkJKCgxPDwyMyl8KDE8PDIyKXwoMTw8MjEpfCgxPDwyMCkpKT4+MjA7CiAKIAkJc3RhdHMucmF0ZSA9IHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpOwotCQlBbnRlbm5hID0gKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweDAwMDA4MDAwKSkgPT0gMCkgPyAwIDogMTsKKwkJQW50ZW5uYSA9ICgqKHByaXYtPnJ4cmluZ3RhaWwgKyAzKSAmIDB4MDAwMDgwMDApID09IDAgPyAwIDogMTsKIAkJaWYgKCFydGw4MTgwX0lzV2lyZWxlc3NCTW9kZShzdGF0cy5yYXRlKSkgeyAvKiBPRkRNIHJhdGUuICovCiAJCQlSeEFHQ19kQm0gPSByeHBvd2VyKzE7CS8qIGJpYXMgKi8KIAkJfSBlbHNlIHsgLyogQ0NLIHJhdGUuICovCkBAIC0xMzI2LDcgKzEzNTEsOCBAQAogCQkJTE5BID0gKHU4KSAoUnhBR0NfZEJtICYgMHg2MCkgPj4gNTsgLyogYml0IDZ+IGJpdCA1ICovCiAJCQlCQiAgPSAodTgpIChSeEFHQ19kQm0gJiAweDFGKTsgLyogYml0IDQgfiBiaXQgMCAqLwogCi0JCQlSeEFHQ19kQm0gPSAtKExOQV9nYWluW0xOQV0gKyAoQkIqMikpOyAvKiBQaW5fMTFiPS0oTE5BX2dhaW4rQkJfZ2FpbikgKGRCbSkgKi8KKwkJCS8qIFBpbl8xMWI9LShMTkFfZ2FpbitCQl9nYWluKSAoZEJtKSAqLworCQkJUnhBR0NfZEJtID0gLShMTkFfZ2FpbltMTkFdICsgKEJCICogMikpOwogCiAJCQlSeEFHQ19kQm0gKz0gNDsgLyogYmlhcyAqLwogCQl9CkBAIC0xMzU0LDIxICsxMzgwLDIzIEBACiAJCXByaXYtPlJTU0kgPSBSU1NJOwogCQkvKiBTUSB0cmFuc2xhdGlvbiBmb3JtdWxhIGlzIHByb3ZpZGVkIGJ5IFNEMyBEWi4gMjAwNi4wNi4yNyAqLwogCQlpZiAocXVhbGl0eSA+PSAxMjcpCi0JCQlxdWFsaXR5ID0gMTsgLyowOyAqLyAvKiAwIHdpbGwgY2F1c2UgZXBjIHRvIHNob3cgc2lnbmFsIHplcm8gLCB3YWxrIGFyb3VuZCBub3c7ICovCisJCQkvKiAwIGNhdXNlcyBlcGMgdG8gc2hvdyBzaWduYWwgemVybywgd2FsayBhcm91bmQgbm93ICovCisJCQlxdWFsaXR5ID0gMTsKIAkJZWxzZSBpZiAocXVhbGl0eSA8IDI3KQogCQkJcXVhbGl0eSA9IDEwMDsKIAkJZWxzZQogCQkJcXVhbGl0eSA9IDEyNyAtIHF1YWxpdHk7CiAJCXByaXYtPlNpZ25hbFF1YWxpdHkgPSBxdWFsaXR5OwogCi0JCXN0YXRzLnNpZ25hbCA9ICh1OClxdWFsaXR5OyAvKnByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gcHJpdi0+U2lnbmFsU3RyZW5ndGg7ICovCisJCXN0YXRzLnNpZ25hbCA9ICh1OCkgcXVhbGl0eTsKKwogCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IFJYQUdDOwogCQlpZiAoc3RhdHMuc2lnbmFsc3RyZW5ndGggPiAxMDApCiAJCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IDEwMDsKLQkJc3RhdHMuc2lnbmFsc3RyZW5ndGggPSAoc3RhdHMuc2lnbmFsc3RyZW5ndGggKiA3MCkvMTAwICsgMzA7Ci0JCS8qIHByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT0+cnggOiBSWEFHQyBpcyAlZCxzaWduYWxzdHJlbmd0aCBpcyAlZFxuIixSWEFHQyxzdGF0cy5zaWduYWxzdHJlbmd0aCk7ICovCisJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gKHN0YXRzLnNpZ25hbHN0cmVuZ3RoICogNzApIC8gMTAwICsgMzA7CiAJCXN0YXRzLnJzc2kgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsID0gcHJpdi0+U2lnbmFsUXVhbGl0eTsKLQkJc3RhdHMubm9pc2UgPSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9IDEwMCAtIHByaXYtPndzdGF0cy5xdWFsLnF1YWw7CisJCXN0YXRzLm5vaXNlID0gcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPQorCQkJMTAwIC0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbDsKIAkJYkh3RXJyb3IgPSAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgweDAwMDAwZmZmKSkgPT0gNDA4MCkgfAogCQkJICAgKCgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwNDAwMDAwMCkpICE9IDApIHwKIAkJCSAgICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDB4MDgwMDAwMDApKSAhPSAwKSB8CkBAIC0xMzk3LDI3ICsxNDI1LDQwIEBACiAKIAkJCS8qIEZvciBnb29kLWxvb2tpbmcgc2luZ2FsIHN0cmVuZ3RoLiAqLwogCQkJU2lnbmFsU3RyZW5ndGhJbmRleCA9IE5ldGdlYXJTaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKLQkJCQkJCQlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQsCi0JCQkJCQkJcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCQkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCwKKwkJCQlwcml2LT5TaWduYWxTdHJlbmd0aCk7CiAKIAkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCA9IFNpZ25hbFN0cmVuZ3RoSW5kZXg7Ci0JCQlwcml2LT5TdGF0c19TaWduYWxTdHJlbmd0aCA9IFRyYW5zbGF0ZVRvRGJtODE4NSgodTgpU2lnbmFsU3RyZW5ndGhJbmRleCk7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgbW9yZSBjb3JyZWN0IHBvd2VyIG9mIHJlY2VpdmVkIHBhY2tldHMgYW5kIHRoZSAgIlNpZ25hbFN0cmVuZ3RoIiBvZiBSeFN0YXRzIGlzIGJlYXV0aWZpZWQsCi0JCSAqIHNvIHdlIHJlY29yZCB0aGUgY29ycmVjdCBwb3dlciBoZXJlLgotCQkgKi8KLQkJCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgPSAobG9uZykocHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSAqIDUgKyAobG9uZylwcml2LT5TaWduYWxRdWFsaXR5ICsgNSkgLyA2OwotCQkJcHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyID0gKGxvbmcpKHByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciAqIDUgKyBwcml2LT5SZWN2U2lnbmFsUG93ZXIgLSAxKSAvIDY7CisJCQlwcml2LT5TdGF0c19TaWduYWxTdHJlbmd0aCA9CisJCQkJVHJhbnNsYXRlVG9EYm04MTg1KCh1OClTaWduYWxTdHJlbmd0aEluZGV4KTsKIAotCQkvKiBGaWd1cmUgb3V0IHdoaWNoIGFudGVubmEgdGhhdCByZWNlaXZlZCB0aGUgbGFzdCBwYWNrZXQuICovCi0JCQlwcml2LT5MYXN0UnhQa3RBbnRlbm5hID0gQW50ZW5uYSA/IDEgOiAwOyAvKiAwOiBhdXgsIDE6IG1haW4uICovCisJCQkvKgorCQkJICogV2UgbmVlZCBtb3JlIGNvcnJlY3QgcG93ZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBhbmQKKwkJCSAqIHRoZSAiU2lnbmFsU3RyZW5ndGgiIG9mIFJ4U3RhdHMgaXMgYmVhdXRpZmllZCwgc28gd2UKKwkJCSAqIHJlY29yZCB0aGUgY29ycmVjdCBwb3dlciBoZXJlLgorCQkJICovCisKKwkJCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgPSAobG9uZykoCisJCQkJcHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSAqIDUgKworCQkJCShsb25nKXByaXYtPlNpZ25hbFF1YWxpdHkgKyA1KSAvIDY7CisKKwkJCXByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciA9IChsb25nKSgKKwkJCQlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgKiA1ICsKKwkJCQlwcml2LT5SZWN2U2lnbmFsUG93ZXIgLSAxKSAvIDY7CisKKwkJCS8qCisJCQkgKiBGaWd1cmUgb3V0IHdoaWNoIGFudGVubmEgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0LgorCQkJICogMDogYXV4LCAxOiBtYWluCisJCQkgKi8KKwkJCXByaXYtPkxhc3RSeFBrdEFudGVubmEgPSBBbnRlbm5hID8gMSA6IDA7CiAJCQlTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NShkZXYsIHByaXYtPlNpZ25hbFN0cmVuZ3RoKTsKIAkJfQogCiAJCWlmIChmaXJzdCkgewogCQkJaWYgKCFwcml2LT5yeF9za2JfY29tcGxldGUpIHsKIAkJCQkvKiBzZWVtcyB0aGF0IEhXIHNvbWV0aW1lcyBmYWlscyB0byByZWNlaXZlIGFuZAotCQkJCSAgIGRvZXNuJ3QgcHJvdmlkZSB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJCQkJICogZG9lc24ndCBwcm92aWRlIHRoZSBsYXN0IGRlc2NyaXB0b3IuCisJCQkJICovCiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKIAkJCQlwcml2LT5zdGF0cy5yeG5vbGFzdCsrOwogCQkJfQpAQCAtMTQyOCwxNSArMTQ2OSwxNiBAQAogCQkJcHJpdi0+cnhfc2tiX2NvbXBsZXRlID0gMDsKIAkJCXByaXYtPnJ4X3NrYi0+ZGV2ID0gZGV2OwogCQl9IGVsc2UgewotCQkJLyogaWYgd2UgYXJlIGhlcmUgd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBSWGVkCi0JCQkqIHRoZSBmaXJzdCBmcmFtZS4KLQkJCSogSWYgd2UgZ2V0IGhlcmUgYW5kIHRoZSBza2IgaXMgbm90IGFsbG9jYXRlZCB0aGVuCi0JCQkqIHdlIGhhdmUganVzdCB0aHJvdyBvdXQgZ2FyYmFnZSAoc2tiIG5vdCBhbGxvY2F0ZWQpCi0JCQkqIGFuZCB3ZSBhcmUgc3RpbGwgcnhpbmcgZ2FyYmFnZS4uLi4KLQkJCSovCisJCQkvKiBpZiB3ZSBhcmUgaGVyZSB3ZSBzaG91bGQgaGF2ZSBhbHJlYWR5IFJYZWQgdGhlIGZpcnN0CisJCQkgKiBmcmFtZS4KKwkJCSAqIElmIHdlIGdldCBoZXJlIGFuZCB0aGUgc2tiIGlzIG5vdCBhbGxvY2F0ZWQgdGhlbgorCQkJICogd2UgaGF2ZSBqdXN0IHRocm93IG91dCBnYXJiYWdlIChza2Igbm90IGFsbG9jYXRlZCkKKwkJCSAqIGFuZCB3ZSBhcmUgc3RpbGwgcnhpbmcgZ2FyYmFnZS4uLi4KKwkJCSAqLwogCQkJaWYgKCFwcml2LT5yeF9za2JfY29tcGxldGUpIHsKIAotCQkJCXRtcF9za2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4X3NrYi0+bGVuK2xlbisyKTsKKwkJCQl0bXBfc2tiID0gZGV2X2FsbG9jX3NrYigKKwkJCQkJcHJpdi0+cnhfc2tiLT5sZW4gKyBsZW4gKyAyKTsKIAogCQkJCWlmICghdG1wX3NrYikKIAkJCQkJZ290byBkcm9wOwpAQCAtMTQ1NCwxMyArMTQ5Niw4IEBACiAJCX0KIAogCQlpZiAoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkgewotCQkJaWYgKHBhZGRpbmcpIHsKLQkJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsIGxlbiksCi0JCQkJCSgoKHVuc2lnbmVkIGNoYXIgKilwcml2LT5yeGJ1ZmZlci0+YnVmKSArIDIpLCBsZW4pOwotCQkJfSBlbHNlIHsKLQkJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsIGxlbiksCi0JCQkJCXByaXYtPnJ4YnVmZmVyLT5idWYsIGxlbik7Ci0JCQl9CisJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsIGxlbiksICgodW5zaWduZWQgY2hhciAqKQorCQkJCXByaXYtPnJ4YnVmZmVyLT5idWYpICsgKHBhZGRpbmcgPyAyIDogMCksIGxlbik7CiAJCX0KIAogCQlpZiAobGFzdCAmJiAhcHJpdi0+cnhfc2tiX2NvbXBsZXRlKSB7CkBAIC0xNTM4LDggKzE1NzUsOCBAQAogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpbnQgbW9kZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7Ci0Jc2hvcnQgbW9yZWZyYWcgPSAoaC0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmggPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7CisJYm9vbCBtb3JlZnJhZyA9IGxlMTZfdG9fY3B1KGgtPmZyYW1lX2NvbnRyb2wpICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHByaW9yaXR5OwogCkBAIC0xNTQ3LDExICsxNTg0LDEwIEBACiAKIAlyYXRlID0gaWVlZXJhdGUycnRscmF0ZShyYXRlKTsKIAkvKgotCSAqIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXF1aXJlIGxvY2sgYmVjYXVzZSB3ZSBtYWtlCi0JICogc3VyZSBpdCdzIGNhbGxlZCB3aXRoIHRoZSB0eF9sb2NrIGFscmVhZHkgYWNxdWlyZWQuCi0JICogdGhpcyBjb21lIGZyb20gdGhlIGtlcm5lbCdzIGhhcmRfeG1pdCBjYWxsYmFjayAodGhyb3VnaAotCSAqIHRoZSBpZWVlIHN0YWNrLCBvciBmcm9tIHRoZSB0cnlfd2FrZV9xdWV1ZSAoYWdhaW4gdGhyb3VnaAotCSAqIHRoZSBpZWVlIHN0YWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXF1aXJlIGxvY2sgYmVjYXVzZSB3ZSBtYWtlIHN1cmUgaXQncyBjYWxsZWQKKwkgKiB3aXRoIHRoZSB0eF9sb2NrIGFscmVhZHkgYWNxdWlyZWQuCisJICogVGhpcyBjb21lIGZyb20gdGhlIGtlcm5lbCdzIGhhcmRfeG1pdCBjYWxsYmFjayAodGhyb3VnaCB0aGUgaWVlZQorCSAqIHN0YWNrLCBvciBmcm9tIHRoZSB0cnlfd2FrZV9xdWV1ZSAoYWdhaW4gdGhyb3VnaCB0aGUgaWVlZSBzdGFjay4KIAkgKi8KIAlwcmlvcml0eSA9IEFDMlEoc2tiLT5wcmlvcml0eSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKQEAgLTE2MTMsNTUgKzE2NDksNiBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLS8qIGxvbmdwcmUgMTQ0KzQ4IHNob3J0cHJlIDcyKzI0ICovCi11MTYgcnRsODE4MF9sZW4yZHVyYXRpb24odTMyIGxlbiwgc2hvcnQgcmF0ZSwgc2hvcnQgKmV4dCkKLXsKLQl1MTYgZHVyYXRpb247Ci0JdTE2IGRyaWZ0OwotCSpleHQgPSAwOwotCi0Jc3dpdGNoIChyYXRlKSB7Ci0JY2FzZSAwOiAvKiAxbWJwcyAqLwotCQkqZXh0ID0gMDsKLQkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLyAweDI7Ci0JCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHgyOwotCQlpZiAoZHJpZnQgPT0gMCkKLQkJCWJyZWFrOwotCQlkdXJhdGlvbisrOwotCQlicmVhazsKLQljYXNlIDE6IC8qIDJtYnBzICovCi0JCSpleHQgPSAwOwotCQlkdXJhdGlvbiA9ICgobGVuKzQpPDw0KSAvIDB4NDsKLQkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDQ7Ci0JCWlmIChkcmlmdCA9PSAwKQotCQkJYnJlYWs7Ci0JCWR1cmF0aW9uKys7Ci0JCWJyZWFrOwotCWNhc2UgMjogLyogNS41bWJwcyAqLwotCQkqZXh0ID0gMDsKLQkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLyAweGI7Ci0JCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHhiOwotCQlpZiAoZHJpZnQgPT0gMCkKLQkJCWJyZWFrOwotCQlkdXJhdGlvbisrOwotCQlicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgMzogLyogMTFtYnBzICovCi0JCSpleHQgPSAwOwotCQlkdXJhdGlvbiA9ICgobGVuKzQpPDw0KSAvIDB4MTY7Ci0JCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHgxNjsKLQkJaWYgKGRyaWZ0ID09IDApCi0JCQlicmVhazsKLQkJZHVyYXRpb24rKzsKLQkJaWYgKGRyaWZ0ID4gNikKLQkJCWJyZWFrOwotCQkqZXh0ID0gMTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGR1cmF0aW9uOwotfQotCiBzdGF0aWMgdm9pZCBydGw4MTgwX3ByZXBhcmVfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMTY2OSw3ICsxNjU2LDEwIEBACiAKIAl1MTYgd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQmNuSXR2KTsKIAl3b3JkICY9IH5CY25JdHZfQmNuSXR2OyAvKiBjbGVhciBCY25fSXR2ICovCi0Jd29yZCB8PSBjcHVfdG9fbGUxNihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOyAvKiAweDY0OyAqLworCisJLyogd29yZCB8PSAweDY0OyAqLworCXdvcmQgfD0gY3B1X3RvX2xlMTYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKKwogCXdyaXRlX25pY193b3JkKGRldiwgQmNuSXR2LCB3b3JkKTsKIAogCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uKHByaXYtPmllZWU4MDIxMSk7CkBAIC0xNjgxLDEyICsxNjcxLDEyIEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGRvIHRoZSByZWFsIGRpcnR5IHdvcms6IGl0IGVucXVldWVzIGEgVFggY29tbWFuZAotICogZGVzY3JpcHRvciBpbiB0aGUgcmluZyBidWZmZXIsIGNvcHllcyB0aGUgZnJhbWUgaW4gYSBUWCBidWZmZXIKLSAqIGFuZCBraWNrcyB0aGUgTklDIHRvIGVuc3VyZSBpdCBkb2VzIHRoZSBETUEgdHJhbnNmZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGRvIHRoZSByZWFsIGRpcnR5IHdvcms6IGl0IGVucXVldWVzIGEgVFggY29tbWFuZCBkZXNjcmlwdG9yIGluCisgKiB0aGUgcmluZyBidWZmZXIsIGNvcHllcyB0aGUgZnJhbWUgaW4gYSBUWCBidWZmZXIgYW5kIGtpY2tzIHRoZSBOSUMgdG8gZW5zdXJlCisgKiBpdCBkb2VzIHRoZSBETUEgdHJhbnNmZXIuCiAgKi8KIHNob3J0IHJ0bDgxODBfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnR4YnVmLCBpbnQgbGVuLCBpbnQgcHJpb3JpdHksCi0JCSBzaG9ydCBtb3JlZnJhZywgc2hvcnQgZGVzY2ZyYWcsIGludCByYXRlKQorCQkgYm9vbCBtb3JlZnJhZywgc2hvcnQgZGVzY2ZyYWcsIGludCByYXRlKQogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIgKnRhaWwsICp0ZW1wX3RhaWw7CkBAIC0xNjk3LDE2ICsxNjg3LDE3IEBACiAJaW50IGJ1ZmxlbjsKIAlpbnQgY291bnQ7CiAJc3RydWN0IGJ1ZmZlciAqYnVmbGlzdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKil0eGJ1ZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHIgPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKil0eGJ1ZjsKIAl1OCBkZXN0W0VUSF9BTEVOXTsKLQl1OAkJCWJVc2VTaG9ydFByZWFtYmxlID0gMDsKLQl1OAkJCWJDVFNFbmFibGUgPSAwOwotCXU4CQkJYlJUU0VuYWJsZSA9IDA7Ci0JdTE2CQkJRHVyYXRpb24gPSAwOwotCXUxNgkJCVJ0c0R1ciA9IDA7Ci0JdTE2CQkJVGhpc0ZyYW1lVGltZSA9IDA7Ci0JdTE2CQkJVHhEZXNjRHVyYXRpb24gPSAwOwotCWJvb2wJCQlvd25iaXRfZmxhZyA9IGZhbHNlOworCXU4IGJVc2VTaG9ydFByZWFtYmxlID0gMDsKKwl1OCBiQ1RTRW5hYmxlID0gMDsKKwl1OCBiUlRTRW5hYmxlID0gMDsKKwl1MTYgRHVyYXRpb24gPSAwOworCXUxNiBSdHNEdXIgPSAwOworCXUxNiBUaGlzRnJhbWVUaW1lID0gMDsKKwl1MTYgVHhEZXNjRHVyYXRpb24gPSAwOworCWJvb2wgb3duYml0X2ZsYWcgPSBmYWxzZTsKIAogCXN3aXRjaCAocHJpb3JpdHkpIHsKIAljYXNlIE1BTkFHRV9QUklPUklUWToKQEAgLTE3NTYsNzQgKzE3NDcsNzkgQEAKIAkJYnJlYWs7CiAJfQogCi0JCW1lbWNweSgmZGVzdCwgZnJhZ19oZHItPmFkZHIxLCBFVEhfQUxFTik7Ci0JCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewotCQkJRHVyYXRpb24gPSAwOwotCQkJUnRzRHVyID0gMDsKLQkJCWJSVFNFbmFibGUgPSAwOworCW1lbWNweSgmZGVzdCwgZnJhZ19oZHItPmFkZHIxLCBFVEhfQUxFTik7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJCUR1cmF0aW9uID0gMDsKKwkJUnRzRHVyID0gMDsKKwkJYlJUU0VuYWJsZSA9IDA7CisJCWJDVFNFbmFibGUgPSAwOworCisJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsCisJCQlydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOworCQlUeERlc2NEdXJhdGlvbiA9IFRoaXNGcmFtZVRpbWU7CisJfSBlbHNlIHsgLyogVW5pY2FzdCBwYWNrZXQgKi8KKwkJdTE2IEFja1RpbWU7CisKKwkJLyogZm9yIEtlZXAgYWxpdmUgKi8KKwkJcHJpdi0+TnVtVHhVbmljYXN0Kys7CisKKwkJLyogRmlndXJlIG91dCBBQ0sgcmF0ZSBhY2NvcmRpbmcgdG8gQlNTIGJhc2ljIHJhdGUKKwkJICogYW5kIFR4IHJhdGUuCisJCSAqIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCQkgKi8KKwkJQWNrVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDEwLCAwLCAwKTsKKworCQlpZiAoKChsZW4gKyBzQ3JjTG5nKSA+IHByaXYtPnJ0cykgJiYgcHJpdi0+cnRzKSB7IC8qIFJUUy9DVFMuICovCisJCQl1MTYgUnRzVGltZSwgQ3RzVGltZTsKKwkJCWJSVFNFbmFibGUgPSAxOwogCQkJYkNUU0VuYWJsZSA9IDA7CiAKLQkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAotCQkJCQkJICAgICAgMCwgYlVzZVNob3J0UHJlYW1ibGUpOwotCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lOwotCQl9IGVsc2UgeyAvKiBVbmljYXN0IHBhY2tldCAqLwotCQkJdTE2IEFja1RpbWU7CisJCQkvKiBSYXRlIGFuZCB0aW1lIHJlcXVpcmVkIGZvciBSVFMuICovCisJCQlSdHNUaW1lID0gQ29tcHV0ZVR4VGltZShzQWNrQ3RzTG5nIC8gOCwKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUsIDAsIDApOwogCi0JCQkvKiBZSixhZGQsMDgwODI4LGZvciBLZWVwIGFsaXZlICovCi0JCQlwcml2LT5OdW1UeFVuaWNhc3QrKzsKKwkJCS8qIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIENUUy4KKwkJCSAqIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCQkJICovCisJCQlDdHNUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsIDAsIDApOwogCi0JCQkvKiBGaWd1cmUgb3V0IEFDSyByYXRlIGFjY29yZGluZyB0byBCU1MgYmFzaWMgcmF0ZQotCQkJICogYW5kIFR4IHJhdGUuICovCi0JCQlBY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsIDAsIDApOwkvKiBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQgKi8KKwkJCS8qIEZpZ3VyZSBvdXQgdGltZSByZXF1aXJlZCB0byB0cmFuc21pdCB0aGlzIGZyYW1lLiAqLworCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKKwkJCQlydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwKKwkJCQliVXNlU2hvcnRQcmVhbWJsZSk7CiAKLQkJCWlmICgoKGxlbiArIHNDcmNMbmcpID4gcHJpdi0+cnRzKSAmJiBwcml2LT5ydHMpIHsgLyogUlRTL0NUUy4gKi8KLQkJCQl1MTYgUnRzVGltZSwgQ3RzVGltZTsKLQkJCQkvKiB1MTYgQ3RzUmF0ZTsgKi8KLQkJCQliUlRTRW5hYmxlID0gMTsKLQkJCQliQ1RTRW5hYmxlID0gMDsKKwkJCS8qIFJUUy1DVFMtVGhpc0ZyYW1lLUFDSy4gKi8KKwkJCVJ0c0R1ciA9IEN0c1RpbWUgKyBUaGlzRnJhbWVUaW1lICsKKwkJCQlBY2tUaW1lICsgMyAqIGFTaWZzVGltZTsKIAotCQkJCS8qIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIFJUUy4gKi8KLQkJCQlSdHNUaW1lID0gQ29tcHV0ZVR4VGltZShzQWNrQ3RzTG5nLzgsIHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSwgMCwgMCk7Ci0JCQkJLyogUmF0ZSBhbmQgdGltZSByZXF1aXJlZCBmb3IgQ1RTLiAqLwotCQkJCUN0c1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwgMCwgMCk7CS8qIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZCAqLworCQkJVHhEZXNjRHVyYXRpb24gPSBSdHNUaW1lICsgUnRzRHVyOworCQl9IGVsc2UgeyAvKiBOb3JtYWwgY2FzZS4gKi8KKwkJCWJDVFNFbmFibGUgPSAwOworCQkJYlJUU0VuYWJsZSA9IDA7CisJCQlSdHNEdXIgPSAwOwogCi0JCQkJLyogRmlndXJlIG91dCB0aW1lIHJlcXVpcmVkIHRvIHRyYW5zbWl0IHRoaXMgZnJhbWUuICovCi0JCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKLQkJCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAotCQkJCQkJMCwKLQkJCQkJCWJVc2VTaG9ydFByZWFtYmxlKTsKKwkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsCisJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksIDAsIGJVc2VTaG9ydFByZWFtYmxlKTsKKwkJCVR4RGVzY0R1cmF0aW9uID0gVGhpc0ZyYW1lVGltZSArIGFTaWZzVGltZSArIEFja1RpbWU7CisJCX0KIAotCQkJCS8qIFJUUy1DVFMtVGhpc0ZyYW1lLUFDSy4gKi8KLQkJCQlSdHNEdXIgPSBDdHNUaW1lICsgVGhpc0ZyYW1lVGltZSArIEFja1RpbWUgKyAzKmFTaWZzVGltZTsKKwkJaWYgKCEobGUxNl90b19jcHUoZnJhZ19oZHItPmZyYW1lX2NvbnRyb2wpICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgeworCQkJLyogVGhpc0ZyYW1lLUFDSy4gKi8KKwkJCUR1cmF0aW9uID0gYVNpZnNUaW1lICsgQWNrVGltZTsKKwkJfSBlbHNlIHsgLyogT25lIG9yIG1vcmUgZnJhZ21lbnRzIHJlbWFpbmVkLiAqLworCQkJdTE2IE5leHRGcmFnVGltZTsKIAotCQkJCVR4RGVzY0R1cmF0aW9uID0gUnRzVGltZSArIFJ0c0R1cjsKLQkJCX0gZWxzZSB7IC8qIE5vcm1hbCBjYXNlLiAqLwotCQkJCWJDVFNFbmFibGUgPSAwOwotCQkJCWJSVFNFbmFibGUgPSAwOwotCQkJCVJ0c0R1ciA9IDA7CisJCQkvKiBwcmV0ZW5kIGZvbGxvd2luZyBwYWNrZXQgbGVuZ3RoID0gY3VycmVudCBwYWNrZXQgKi8KKwkJCU5leHRGcmFnVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKKwkJCQlydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOwogCi0JCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywgcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCi0JCQkJCQkJICAgICAgMCwgYlVzZVNob3J0UHJlYW1ibGUpOwotCQkJCVR4RGVzY0R1cmF0aW9uID0gVGhpc0ZyYW1lVGltZSArIGFTaWZzVGltZSArIEFja1RpbWU7Ci0JCQl9CisJCQkvKiBUaGlzRnJhZy1BQ2stTmV4dEZyYWctQUNLLiAqLworCQkJRHVyYXRpb24gPSBOZXh0RnJhZ1RpbWUgKyAzICogYVNpZnNUaW1lICsgMiAqIEFja1RpbWU7CisJCX0KIAotCQkJaWYgKCEoZnJhZ19oZHItPmZyYW1lX2NvbnRyb2wgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSB7Ci0JCQkJLyogVGhpc0ZyYW1lLUFDSy4gKi8KLQkJCQlEdXJhdGlvbiA9IGFTaWZzVGltZSArIEFja1RpbWU7Ci0JCQl9IGVsc2UgeyAvKiBPbmUgb3IgbW9yZSBmcmFnbWVudHMgcmVtYWluZWQuICovCi0JCQkJdTE2IE5leHRGcmFnVGltZTsKLQkJCQlOZXh0RnJhZ1RpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIC8qIHByZXRlbmQgZm9sbG93aW5nIHBhY2tldCBsZW5ndGggZXF1YWwgY3VycmVudCBwYWNrZXQgKi8KLQkJCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAotCQkJCQkJMCwKLQkJCQkJCWJVc2VTaG9ydFByZWFtYmxlKTsKKwl9IC8qIEVuZCBvZiBVbmljYXN0IHBhY2tldCAqLwogCi0JCQkJLyogVGhpc0ZyYWctQUNrLU5leHRGcmFnLUFDSy4gKi8KLQkJCQlEdXJhdGlvbiA9IE5leHRGcmFnVGltZSArIDMqYVNpZnNUaW1lICsgMipBY2tUaW1lOwotCQkJfQotCi0JCX0gLyogRW5kIG9mIFVuaWNhc3QgcGFja2V0ICovCi0KLQkJZnJhZ19oZHItPmR1cmF0aW9uX2lkID0gRHVyYXRpb247CisJZnJhZ19oZHItPmR1cmF0aW9uX2lkID0gRHVyYXRpb247CiAKIAlidWZsZW4gPSBwcml2LT50eGJ1ZmZzaXplOwogCXJlbWFpbiA9IGxlbjsKQEAgLTE4MzIsNyArMTgyOCw4IEBACiAJd2hpbGUgKHJlbWFpbiAhPSAwKSB7CiAJCW1iKCk7CiAJCWlmICghYnVmbGlzdCkgewotCQkJRE1FU0dFKCJUWCBidWZmZXIgZXJyb3IsIGNhbm5vdCBUWCBmcmFtZXMuIHByaSAlZC4iLCBwcmlvcml0eSk7CisJCQlETUVTR0UoIlRYIGJ1ZmZlciBlcnJvciwgY2Fubm90IFRYIGZyYW1lcy4gcHJpICVkLiIsCisJCQkJcHJpb3JpdHkpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCWJ1ZiA9IGJ1Zmxpc3QtPmJ1ZjsKQEAgLTE4NTEsNDMgKzE4NDgsNDMgQEAKIAkJKih0YWlsKzYpID0gMDsKIAkJKih0YWlsKzcpID0gMDsKIAotCQkvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IEhXIGVuY3J5cHRpb24gcGFyYW1ldGVycy4qLworCQkvKiBGSVhNRTogc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBIVyBlbmNyeXB0aW9uIHBhcmFtZXRlcnMuKi8KIAkJKnRhaWwgfD0gKDE8PDE1KTsgLyogbm8gZW5jcnlwdCAqLwogCiAJCWlmIChyZW1haW4gPT0gbGVuICYmICFkZXNjZnJhZykgewogCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsKLQkJCSp0YWlsID0gKnRhaWwgfCAoMTw8MjkpOyAvKiBmaXN0IHNlZ21lbnQgb2YgdGhlIHBhY2tldCAqLworCQkJKnRhaWwgPSAqdGFpbCB8ICgxIDw8IDI5KTsgLyogZmlyc3Qgc2VnbWVudCBvZiBwYWNrZXQgKi8KIAkJCSp0YWlsID0gKnRhaWwgfCAobGVuKTsKIAkJfSBlbHNlIHsKIAkJCW93bmJpdF9mbGFnID0gdHJ1ZTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBidWZsZW4gJiYgcmVtYWluID4gMDsgaSsrLCByZW1haW4tLSkgewotCQkJKCh1OCAqKWJ1ZilbaV0gPSB0eGJ1ZltpXTsgLyogY29weSBkYXRhIGludG8gZGVzY3JpcHRvciBwb2ludGVkIERNQWJsZSBidWZmZXIgKi8KKwkJCS8qIGNvcHkgZGF0YSBpbnRvIGRlc2NyaXB0b3IgcG9pbnRlZCBETUFibGUgYnVmZmVyICovCisJCQkoKHU4ICopYnVmKVtpXSA9IHR4YnVmW2ldOworCiAJCQlpZiAocmVtYWluID09IDQgJiYgaSs0ID49IGJ1ZmxlbikKIAkJCQlicmVhazsKIAkJCS8qIGVuc3VyZSB0aGUgbGFzdCBkZXNjIGhhcyBhdCBsZWFzdCA0IGJ5dGVzIHBheWxvYWQgKi8KLQogCQl9CiAJCXR4YnVmID0gdHhidWYgKyBpOwogCQkqKHRhaWwrMykgPSAqKHRhaWwrMykgJiB+MHhmZmY7CiAJCSoodGFpbCszKSA9ICoodGFpbCszKSB8IGk7IC8qIGJ1ZmZlciBsZW5ndGggKi8KLQkJLyogVXNlIHNob3J0IHByZWFtYmxlIG9yIG5vdCAqLwotCQlpZiAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSZXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCi0JCQlpZiAocHJpdi0+cGxjcF9wcmVhbWJsZV9tb2RlID09IDEgJiYgcmF0ZSAhPSAwKQkvKiAgc2hvcnQgbW9kZSBub3csIG5vdCBsb25nISAqLwotCQkJOyAvKiAqdGFpbCB8PSAoMTw8MTYpOyAqLwkJCQkvKiBlbmFibGUgc2hvcnQgcHJlYW1ibGUgbW9kZS4gKi8KIAogCQlpZiAoYkNUU0VuYWJsZSkKIAkJCSp0YWlsIHw9ICgxPDwxOCk7CiAKIAkJaWYgKGJSVFNFbmFibGUpIHsgLyogcnRzIGVuYWJsZSAqLwotCQkJKnRhaWwgfD0gKChpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSkpPDwxOSk7IC8qIFJUUyBSQVRFICovCisJCQkvKiBSVFMgUkFURSAqLworCQkJKnRhaWwgfD0gKGllZWVyYXRlMnJ0bHJhdGUoCisJCQkJcHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSA8PCAxOSk7CisKIAkJCSp0YWlsIHw9ICgxPDwyMyk7IC8qIHJ0cyBlbmFibGUgKi8KIAkJCSoodGFpbCsxKSB8PSAoUnRzRHVyJjB4ZmZmZik7IC8qIFJUUyBEdXJhdGlvbiAqLwogCQl9CiAJCSoodGFpbCszKSB8PSAoKFR4RGVzY0R1cmF0aW9uJjB4ZmZmZik8PDE2KTsgLyogRFVSQVRJT04gKi8KLQkJLyogKih0YWlsKzMpIHw9ICgweGU2PDwxNik7ICovCi0JCSoodGFpbCs1KSB8PSAoMTE8PDgpOyAvKiAocHJpdi0+cmV0cnlfZGF0YTw8OCk7ICovIC8qIHJldHJ5IGxpbTsgKi8KKworCQkqKHRhaWwgKyA1KSB8PSAoMTEgPDwgOCk7IC8qIHJldHJ5IGxpbTsgKi8KIAogCQkqdGFpbCA9ICp0YWlsIHwgKChyYXRlJjB4ZikgPDwgMjQpOwogCkBAIC0xOTAxLDcgKzE4OTgsOCBAQAogCiAJCXdtYigpOwogCQlpZiAob3duYml0X2ZsYWcpCi0JCQkqdGFpbCA9ICp0YWlsIHwgKDE8PDMxKTsgLyogZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkICovCisJCQkvKiBkZXNjcmlwdG9yIHJlYWR5IHRvIGJlIHR4ZWQgKi8KKwkJCSp0YWlsIHw9ICgxIDw8IDMxKTsKIAogCQlpZiAoKHRhaWwgLSBiZWdpbikvOCA9PSBjb3VudC0xKQogCQkJdGFpbCA9IGJlZ2luOwpAQCAtMTk4Myw3ICsxOTgxLDggQEAKIAogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAotCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzQpIHwgQ09ORklHNF9QV1JNR1QpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwKKwkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzQpIHwgQ09ORklHNF9QV1JNR1QpOwogCXByaXYtPmFja190eF90b19pZWVlID0gMTsKIH0KIApAQCAtMjAzMSw3ICsyMDMwLDggQEAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwotCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzQpICYgfkNPTkZJRzRfUFdSTUdUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzQsCisJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc0KSAmIH5DT05GSUc0X1BXUk1HVCk7CiAJaWYgKHByaXYtPnJmX3dha2V1cCkKIAkJcHJpdi0+cmZfd2FrZXVwKGRldik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwpAQCAtMjA2MywxMyArMjA2MywxMyBAQAogCXRsIC09IE1TRUNTKDQrMTYrNyk7CiAKIAkvKgotCSAqIElmIHRoZSBpbnRlcnZhbCBpbiB3aXRjaCB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNsZWVwIGlzIHRvbworCSAqIElmIHRoZSBpbnRlcnZhbCBpbiB3aGljaCB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNsZWVwIGlzIHRvbwogCSAqIHNob3J0IHRoZW4gZ2l2ZSB1cCBhbmQgcmVtYWluIGF3YWtlCiAJICovCiAJaWYgKCgodGwgPj0gcmIpICYmICh0bC1yYikgPD0gTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKQogCQl8fCAoKHJiID4gdGwpICYmIChyYi10bCkgPCBNU0VDUyhNSU5fU0xFRVBfVElNRSkpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssIGZsYWdzKTsKLQkJcHJpbnRrKCJ0b28gc2hvcnQgdG8gc2xlZXBcbiIpOworCQluZXRkZXZfd2FybihkZXYsICJ0b28gc2hvcnQgdG8gc2xlZXBcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMDc4LDcgKzIwNzgsOCBAQAogCiAJCXByaXYtPkRvemVQZXJpb2RJblBhc3QyU2VjICs9IGppZmZpZXNfdG9fbXNlY3ModG1wKTsKIAkJLyogYXMgdGwgbWF5IGJlIGxlc3MgdGhhbiByYiAqLwotCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxLCB0bXApOworCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwKKwkJCSZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwgdG1wKTsKIAl9CiAJLyoKIAkgKiBJZiB3ZSBzdXNwZWN0IHRoZSBUaW1lckludCBpcyBnb25lIGJleW9uZCB0bApAQCAtMjA5NSwxNiArMjA5Niw0OSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgcnRsODE4MF93bW1fc2luZ2xlX3BhcmFtX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4IG1vZGUsIEFDX0NPRElORyBlQUNJLCBQQUNfUEFSQU0gcGFyYW0pCit7CisJdTggdTFiQUlGUzsKKwl1MzIgdTRiQWNQYXJhbTsKKworCS8qIFJldHJpZXZlIHBhcmFtZXRlcnMgdG8gdXBkYXRlLiAqLworCS8qIE1vZGUgRy9BOiBzbG90VGltZVRpbWVyID0gOTsgTW9kZSBCOiAyMCAqLworCXUxYkFJRlMgPSBwYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICogKChtb2RlICYgSUVFRV9HKSA9PSBJRUVFX0cgPworCQk5IDogMjApICsgYVNpZnNUaW1lOworCXU0YkFjUGFyYW0gPSAoKCh1MzIpcGFyYW0tPmYuVFhPUExpbWl0IDw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKSB8CisJCSgodTMyKXBhcmFtLT5mLkVjdy5mLkVDV21heCA8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCkgfAorCQkoKHUzMilwYXJhbS0+Zi5FY3cuZi5FQ1dtaW4gPDwgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpIHwKKwkJKCh1MzIpdTFiQUlGUyA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCisJc3dpdGNoIChlQUNJKSB7CisJY2FzZSBBQzFfQks6CisJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJcmV0dXJuOworCWNhc2UgQUMwX0JFOgorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCXJldHVybjsKKwljYXNlIEFDMl9WSToKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOworCQlyZXR1cm47CisJY2FzZSBBQzNfVk86CisJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCXByX3dhcm4oIlNldEh3UmVnODE4NSgpOiBpbnZhbGlkIEFDSTogJWQhXG4iLCBlQUNJKTsKKwkJcmV0dXJuOworCX0KK30KKwogc3RhdGljIHZvaWQgcnRsODE4MF93bW1fcGFyYW1fdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd21tX3BhcmFtX3VwZGF0ZV93cSk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdtbV9wYXJhbV91cGRhdGVfd3EpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CiAJdTggKmFjX3BhcmFtID0gKHU4ICopKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1fcGFyYW0pOwogCXU4IG1vZGUgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZTsKLQlBQ19DT0RJTkcJZUFDSTsKLQlBQ19QQVJBTQlBY1BhcmFtOwotCVBBQ19QQVJBTQlwQWNQYXJhbTsKLQl1OCBpOworCUFDX0NPRElORyBlQUNJOworCUFDX1BBUkFNIEFjUGFyYW07CiAKIAlpZiAoIWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKSB7CiAJCS8qIGxlZ2FjeSBhY194eF9wYXJhbSB1cGRhdGUgKi8KQEAgLTIxMTQsODMgKzIxNDgsMjYgQEAKIAkJQWNQYXJhbS5mLkVjdy5mLkVDV21pbiA9IDM7IC8qIEZvbGxvdyA4MDIuMTEgQ1dtaW4uICovCiAJCUFjUGFyYW0uZi5FY3cuZi5FQ1dtYXggPSA3OyAvKiBGb2xsb3cgODAyLjExIENXbWF4LiAqLwogCQlBY1BhcmFtLmYuVFhPUExpbWl0ID0gMDsKKwogCQlmb3IgKGVBQ0kgPSAwOyBlQUNJIDwgQUNfTUFYOyBlQUNJKyspIHsKIAkJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFDSSA9ICh1OCllQUNJOwotCQkJewotCQkJCXU4CQl1MWJBSUZTOwotCQkJCXUzMgkJdTRiQWNQYXJhbTsKLQkJCQlwQWNQYXJhbSA9IChQQUNfUEFSQU0pKCZBY1BhcmFtKTsKLQkJCQkvKiBSZXRyaWV2ZSBwYXJhbWV0ZXJzIHRvIHVwZGF0ZS4gKi8KLQkJCQl1MWJBSUZTID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BSUZTTiAqICgoKG1vZGUmSUVFRV9HKSA9PSBJRUVFX0cpID8gOSA6IDIwKSArIGFTaWZzVGltZTsKLQkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSk8PEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKLQkJCQkJICAgICAgKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKTw8QUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAotCQkJCQkgICAgICAoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpPDxBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCl8Ci0JCQkJCSAgICAgICAoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKLQkJCQlzd2l0Y2ggKGVBQ0kpIHsKLQkJCQljYXNlIEFDMV9CSzoKLQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFDMF9CRToKLQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFDMl9WSToKLQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFDM19WTzoKLQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwcl93YXJuKCJTZXRId1JlZzgxODUoKTppbnZhbGlkIEFDSTogJWQhXG4iLAotCQkJCQkJZUFDSSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKworCQkJcnRsODE4MF93bW1fc2luZ2xlX3BhcmFtX3VwZGF0ZShkZXYsIG1vZGUsIGVBQ0ksCisJCQkJKFBBQ19QQVJBTSkmQWNQYXJhbSk7CiAJCX0KIAkJcmV0dXJuOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBBQ19NQVg7IGkrKykgewotCQkvKiBBY1BhcmFtLmxvbmdEYXRhID0gMDsgKi8KLQkJcEFjUGFyYW0gPSAoQUNfUEFSQU0gKilhY19wYXJhbTsKLQkJewotCQkJQUNfQ09ESU5HCWVBQ0k7Ci0JCQl1OAkJdTFiQUlGUzsKLQkJCXUzMgkJdTRiQWNQYXJhbTsKKwlmb3IgKGVBQ0kgPSAwOyBlQUNJIDwgQUNfTUFYOyBlQUNJKyspIHsKKwkJcnRsODE4MF93bW1fc2luZ2xlX3BhcmFtX3VwZGF0ZShkZXYsIG1vZGUsCisJCQkoKFBBQ19QQVJBTSlhY19wYXJhbSktPmYuQWNpQWlmc24uZi5BQ0ksCisJCQkoUEFDX1BBUkFNKWFjX3BhcmFtKTsKIAotCQkJLyogUmV0cmlldmUgcGFyYW1ldGVycyB0byB1cGRhdGUuICovCi0JCQllQUNJID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BQ0k7Ci0JCQkvKiBNb2RlIEcvQTogc2xvdFRpbWVUaW1lciA9IDk7IE1vZGUgQjogMjAgKi8KLQkJCXUxYkFJRlMgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICogKCgobW9kZSZJRUVFX0cpID09IElFRUVfRykgPyA5IDogMjApICsgYVNpZnNUaW1lOwotCQkJdTRiQWNQYXJhbSA9ICgoKCh1MzIpKHBBY1BhcmFtLT5mLlRYT1BMaW1pdCkpIDw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKQl8Ci0JCQkJCSgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWF4KSkgPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpCXwKLQkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtaW4pKSA8PCBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCkJfAotCQkJCQkoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKLQotCQkJc3dpdGNoIChlQUNJKSB7Ci0JCQljYXNlIEFDMV9CSzoKLQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CS19QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFDMF9CRToKLQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFDMl9WSToKLQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFDM19WTzoKLQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WT19QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByX3dhcm4oIlNldEh3UmVnODE4NSgpOiBpbnZhbGlkIEFDSTogJWQgIVxuIiwKLQkJCQkJZUFDSSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYWNfcGFyYW0gKz0gKHNpemVvZihBQ19QQVJBTSkpOworCQlhY19wYXJhbSArPSBzaXplb2YoQUNfUEFSQU0pOwogCX0KIH0KIAogdm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLS8qIHZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsgKi8KIHZvaWQgcnRsODE4MF93YXRjaF9kb2dfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcnRsODE4MF9od193YWtldXBfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpAQCAtMjIwOCw3ICsyMTg1LDggQEAKIAogCS8qIFR4IEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiAqLwogCWlmIChDaGVja0hpZ2hQb3dlcigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSkKLQkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKKwkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLAorCQkJKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CiAKIAkvKiBUeCBQb3dlciBUcmFja2luZyBvbiA4N1NFLiAqLwogCWlmIChDaGVja1R4UHdyVHJhY2tpbmcoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSkpCkBAIC0yMjE2LDI3ICsyMTk0LDU5IEBACiAKIAkvKiBQZXJmb3JtIERJRyBpbW1lZGlhdGVseS4gKi8KIAlpZiAoQ2hlY2tEaWcoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSkpCi0JCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EpOworCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsCisJCQkodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CisKIAlydGw4MTgwX3dhdGNoX2RvZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsKIAotCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSk7CisJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLAorCQkodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPkdQSU9DaGFuZ2VSRldvcmtJdGVtKTsKIAotCXByaXYtPndhdGNoX2RvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKElFRUU4MDIxMV9XQVRDSF9ET0dfVElNRSk7CisJcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJTVNFQ1MoSUVFRTgwMjExX1dBVENIX0RPR19USU1FKTsKKwogCWFkZF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKIH0KIAotc3RhdGljIENIQU5ORUxfTElTVCBDaGFubmVsUGxhbltdID0gewotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDE5fSwJCS8qIEZDQyAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTF9LDExfSwJCQkJCS8qIElDICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LAkvKiBFVFNJICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LAkvKiBTcGFpbi4gQ2hhbmdlIHRvIEVUU0kuICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LAkvKiBGcmFuY2UuIENoYW5nZSB0byBFVFNJLiAqLwotCXt7MTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDl9LAkJCQkvKiBNS0sgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LCAzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LC8qIE1LSzEgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8qIElzcmFlbC4gKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM0LDM4LDQyLDQ2fSwxN30sCQkvKiBGb3IgMTFhICwgVEVMRUMgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0sICAvKiBGb3IgR2xvYmFsIERvbWFpbi4gMS0xMTphY3RpdmUgc2NhbiwgMTItMTQgcGFzc2l2ZSBzY2FuLiAvLytZSiwgMDgwNjI2ICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9IC8qIHdvcmxkIHdpZGUgMTM6IGNoMX5jaDExIGFjdGl2ZSBzY2FuLCBjaDEyfjEzIHBhc3NpdmUgLy9sem0gYWRkIDA4MDgyNiAqLworc3RhdGljIHN0cnVjdCBydGw4MTg3c2VfY2hhbm5lbF9saXN0IGNoYW5uZWxfcGxhbl9saXN0W10gPSB7CisJLyogRkNDICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDM2LCA0MCwKKwkJNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDE5fSwKKworCS8qIElDICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTF9LCAxMX0sCisKKwkvKiBFVFNJICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLAorCQk0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMjF9LAorCisJLyogU3BhaW4uIENoYW5nZSB0byBFVFNJLiAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDM2LCA0MCwKKwkJNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDIxfSwKKworCS8qIEZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLAorCQk0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMjF9LAorCisJLyogTUtLICovCisJe3sxNCwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgOX0sCisKKwkvKiBNS0sxICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDM2LAorCQk0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDIyfSwKKworCS8qIElzcmFlbC4gKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAzNiwgNDAsCisJCTQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAyMX0sCisKKwkvKiBGb3IgMTFhICwgVEVMRUMgKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAzNCwgMzgsIDQyLCA0Nn0sIDE3fSwKKworCS8qIEZvciBHbG9iYWwgRG9tYWluLiAxLTExIGFjdGl2ZSwgMTItMTQgcGFzc2l2ZS4gKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIDE0fSwKKworCS8qIHdvcmxkIHdpZGUgMTM6IGNoMX5jaDExIGFjdGl2ZSwgY2gxMn4xMyBwYXNzaXZlICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxM30sIDEzfQogfTsKIAogc3RhdGljIHZvaWQgcnRsODE4MF9zZXRfY2hhbm5lbF9tYXAodTggY2hhbm5lbF9wbGFuLApAQCAtMjI0NCw3ICsyMjU0LDYgQEAKIHsKIAlpbnQgaTsKIAotCS8qIGx6bSBhZGQgMDgwODI2ICovCiAJaWVlZS0+TWluUGFzc2l2ZUNobmxOdW0gPSBNQVhfQ0hBTk5FTF9OVU1CRVIrMTsKIAlpZWVlLT5JYnNzU3RhcnRDaG5sID0gMDsKIApAQCAtMjI2MSwxMyArMjI3MCwxMyBAQAogCQl7CiAJCQlEb3QxMWRfSW5pdChpZWVlKTsKIAkJCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKLQkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbiAhPSAwKSB7CisJCQlpZiAoY2hhbm5lbF9wbGFuX2xpc3RbY2hhbm5lbF9wbGFuXS5sZW4gIT0gMCkgewogCQkJCS8qIENsZWFyIG9sZCBjaGFubmVsIG1hcCAqLwogCQkJCW1lbXNldChHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCAwLCBzaXplb2YoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCkpOwogCQkJCS8qIFNldCBuZXcgY2hhbm5lbCBtYXAgKi8KLQkJCQlmb3IgKGkgPSAwOyBpIDwgQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW47IGkrKykgewotCQkJCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldIDw9IDE0KQotCQkJCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV1dID0gMTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbF9wbGFuX2xpc3RbY2hhbm5lbF9wbGFuXS5sZW47IGkrKykgeworCQkJCQlpZiAoY2hhbm5lbF9wbGFuX2xpc3RbY2hhbm5lbF9wbGFuXS5jaGFubmVsW2ldIDw9IDE0KQorCQkJCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaGFubmVsX3BsYW5fbGlzdFtjaGFubmVsX3BsYW5dLmNoYW5uZWxbaV1dID0gMTsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKQEAgLTIyNzksNyArMjI4OCw3IEBACiAJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9Ci0JY2FzZSBDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWDovKiBsem0gYWRkIDA4MDgyNiAqLworCWNhc2UgQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTNfSU5ERVg6CiAJCXsKIAkJCWllZWUtPk1pblBhc3NpdmVDaG5sTnVtID0gMTI7CiAJCQlpZWVlLT5JYnNzU3RhcnRDaG5sID0gMTA7CkBAIC0yMjk5LDE5ICsyMzA4LDE3IEBACiAKIHZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCi0vKiBZSixhZGQsMDgwODI4ICovCi1zdGF0aWMgdm9pZCBydGw4MTgwX3N0YXRpc3RpY3NfaW5pdChzdHJ1Y3QgU3RhdHMgKnBzdGF0cykKK3N0YXRpYyB2b2lkIHJ0bDgxODBfc3RhdGlzdGljc19pbml0KHN0cnVjdCBzdGF0cyAqcHN0YXRzKQogewotCW1lbXNldChwc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgU3RhdHMpKTsKKwltZW1zZXQocHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHN0YXRzKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxODBfbGlua19kZXRlY3RfaW5pdChwbGlua19kZXRlY3RfdCBwbGlua19kZXRlY3QpCitzdGF0aWMgdm9pZCBydGw4MTgwX2xpbmtfZGV0ZWN0X2luaXQoc3RydWN0IGxpbmtfZGV0ZWN0X3QgKnBsaW5rX2RldGVjdCkKIHsKLQltZW1zZXQocGxpbmtfZGV0ZWN0LCAwLCBzaXplb2YobGlua19kZXRlY3RfdCkpOwotCXBsaW5rX2RldGVjdC0+U2xvdE51bSA9IERFRkFVTFRfU0xPVF9OVU07CisJbWVtc2V0KHBsaW5rX2RldGVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBsaW5rX2RldGVjdF90KSk7CisJcGxpbmtfZGV0ZWN0LT5zbG90X251bSA9IERFRkFVTFRfU0xPVF9OVU07CiB9CiAKLS8qIFlKLGFkZCwwODA4MjgsZW5kICovCiBzdGF0aWMgdm9pZCBydGw4MTg3c2VfZWVwcm9tX3JlZ2lzdGVyX3JlYWQoc3RydWN0IGVlcHJvbV85M2N4NiAqZWVwcm9tKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBlZXByb20tPmRhdGE7CkBAIC0yMzYwLDcgKzIzNjcsNyBAQAogCWVlcHJvbV85M2N4Nl9yZWFkKCZlZXByb20sIEVFUFJPTV9DT1VOVFJZX0NPREU+PjEsICZlZXByb21fdmFsKTsKIAlwcml2LT5jaGFubmVsX3BsYW4gPSBlZXByb21fdmFsICYgMHhGRjsKIAlpZiAocHJpdi0+Y2hhbm5lbF9wbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4pIHsKLQkJcHJpbnRrKCJydGw4MTgwX2luaXQ6RXJyb3IgY2hhbm5lbCBwbGFuISBTZXQgdG8gZGVmYXVsdC5cbiIpOworCQluZXRkZXZfZXJyKGRldiwgInJ0bDgxODBfaW5pdDogSW52YWxpZCBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CiAJCXByaXYtPmNoYW5uZWxfcGxhbiA9IDA7CiAJfQogCkBAIC0yMzg1LDcgKzIzOTIsOCBAQAogCXJ0bDgxODBfbGlua19kZXRlY3RfaW5pdCgmcHJpdi0+bGlua19kZXRlY3QpOwogCiAJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOwotCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IERFRkFVTFRfQkVBQ09OSU5URVJWQUw7CisJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0KKwkJREVGQVVMVF9CRUFDT05JTlRFUlZBTDsKIAlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOwogCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19mZWF0dXJlcyAgPSBJRUVFX1NPRlRNQUNfU0NBTiB8CiAJCUlFRUVfU09GVE1BQ19BU1NPQ0lBVEUgfCBJRUVFX1NPRlRNQUNfUFJPQkVSUSB8CkBAIC0yNDEwLDEyICsyNDE4LDEyIEBACiAJcHJpdi0+YkluYWN0aXZlUHMgPSB0cnVlOyAvKiBmYWxzZTsgKi8KIAlwcml2LT5pZWVlODAyMTEtPmJJbmFjdGl2ZVBzID0gcHJpdi0+YkluYWN0aXZlUHM7CiAJcHJpdi0+YlN3UmZQcm9jZXNzaW5nID0gZmFsc2U7Ci0JcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwlwcml2LT5lUkZQb3dlclN0YXRlID0gUkZfT0ZGOwogCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKLQlwcml2LT5MZWRTdHJhdGVneSA9IFNXX0xFRF9NT0RFMDsKLQlwcml2LT5UeFBvbGxpbmdUaW1lcyA9IDA7IC8qIGx6bSBhZGQgMDgwODI2ICovCisJcHJpdi0+bGVkX3N0cmF0ZWd5ID0gU1dfTEVEX01PREUwOworCXByaXYtPlR4UG9sbGluZ1RpbWVzID0gMDsKIAlwcml2LT5iTGVpc3VyZVBzID0gdHJ1ZTsKLQlwcml2LT5kb3QxMVBvd2VyU2F2ZU1vZGUgPSBlQWN0aXZlOworCXByaXYtPmRvdDExUG93ZXJTYXZlTW9kZSA9IEFDVElWRTsKIAlwcml2LT5BZE1pbkNoZWNrUGVyaW9kID0gNTsKIAlwcml2LT5BZE1heENoZWNrUGVyaW9kID0gMTA7CiAJcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkID0gMzA7CS8qIDYwLT4zMCAqLwpAQCAtMjQzMSw3ICsyNDM5LDggQEAKIAlwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCA9IDA7CiAJaW5pdF90aW1lcigmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOwogCXByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7Ci0JcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2s7CisJcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZnVuY3Rpb24gPQorCQkodm9pZCAqKVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2s7CiAJcHJpdi0+YkRpZ01lY2hhbmlzbSA9IHRydWU7CiAJcHJpdi0+SW5pdGlhbEdhaW4gPSA2OwogCXByaXYtPmJYdGFsQ2FsaWJyYXRpb24gPSBmYWxzZTsKQEAgLTI0NDAsNyArMjQ0OSw4IEBACiAJcHJpdi0+YlR4UG93ZXJUcmFjayA9IGZhbHNlOwogCXByaXYtPlRoZXJtYWxNZXRlciA9IDA7CiAJcHJpdi0+RmFsc2VBbGFybVJlZ1ZhbHVlID0gMDsKLQlwcml2LT5SZWdEaWdPZmRtRmFVcFRoID0gMHhjOyAvKiBVcHBlciB0aHJlc2hvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwgd2hpY2ggaXMgdXNlZCBpbiBESUcuICovCisJcHJpdi0+UmVnRGlnT2ZkbUZhVXBUaCA9IDB4YzsgLyogVXBwZXIgdGhyZXNob2xkIG9mIE9GRE0gZmFsc2UgYWxhcm0sCisJCQkJCXdoaWNoIGlzIHVzZWQgaW4gRElHLiAqLwogCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPSAwOwogCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZSA9IDA7CiAJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50ID0gMDsKQEAgLTI1ODUsNyArMjU5NSw4IEBACiAJCXByaXYtPmJTd0FudGVubmFEaXZlcml0eSA9IHByaXYtPkVFUFJPTVN3QW50ZW5uYURpdmVyc2l0eTsKIAllbHNlCiAJCS8qIDE6ZGlzYWJsZSBhbnRlbm5hIGRpdmVyc2l0eSwgMjogZW5hYmxlIGFudGVubmEgZGl2ZXJzaXR5LiAqLwotCQlwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgPSBwcml2LT5SZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc20gPT0gMjsKKwkJcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ID0KKwkJCXByaXYtPlJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbSA9PSAyOwogCiAJaWYgKHByaXYtPlJlZ0RlZmF1bHRBbnRlbm5hID09IDApCiAJCS8qIDA6IGRlZmF1bHQgZnJvbSBFRVBST00uICovCkBAIC0yNjY5LDcgKzI2ODAsOCBAQAogCQkJCSAgVFhfQkVBQ09OX1JJTkdfQUREUikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBydGw4MTgwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSkgeworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcnRsODE4MF9pbnRlcnJ1cHQsCisJCUlSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikpIHsKIAkJRE1FU0dFKCJFcnJvciBhbGxvY2F0aW5nIElSUSAlZCIsIGRldi0+aXJxKTsKIAkJcmV0dXJuIC0xOwogCX0gZWxzZSB7CkBAIC0yNzE4LDggKzI3MzAsNiBAQAogCiB2b2lkIHJ0bDgxODVfcmZfcGluc19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQkvKiB1MTYgdG1wOyAqLwotCS8qIHRtcCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUpOyAqLwogCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDFmZmYpOyAvKiB8IHRtcCk7ICovCiB9CiAKQEAgLTI3NjgsMTYgKzI3NzgsMTEgQEAKIAogCXBoeXcgPSAoKGRhdGE8PDgpIHwgYWRyKTsKIAotCS8qIE5vdGUgdGhhdCwgd2UgbXVzdCB3cml0ZSAweGZmN2MgYWZ0ZXIgMHg3ZC0weDdmIHRvIHdyaXRlIEJCIHJlZ2lzdGVyLiAqLworCS8qIE5vdGU6IHdlIG11c3Qgd3JpdGUgMHhmZjdjIGFmdGVyIDB4N2QtMHg3ZiB0byB3cml0ZSBCQiByZWdpc3Rlci4gKi8KIAl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2YsICgocGh5dyAmIDB4ZmYwMDAwMDApID4+IDI0KSk7CiAJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdlLCAoKHBoeXcgJiAweDAwZmYwMDAwKSA+PiAxNikpOwogCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZCwgKChwaHl3ICYgMHgwMDAwZmYwMCkgPj4gOCkpOwogCXdyaXRlX25pY19ieXRlKGRldiwgMHg3YywgKChwaHl3ICYgMHgwMDAwMDBmZikpKTsKLQotCS8qIHRoaXMgaXMgb2sgdG8gZmFpbCB3aGVuIHdlIHdyaXRlIEFHQyB0YWJsZS4gY2hlY2sgZm9yIEFHQyB0YWJsZSBtaWdodCBiZQotCSAqIGRvbmUgYnkgbWFza2luZyB3aXRoIDB4N2YgaW5zdGVhZCBvZiAweGZmCi0JICovCi0JLyogaWYgKHBoeXIgIT0gKGRhdGEmMHhmZikpIERNRVNHVygiUGh5IHdyaXRlIHRpbWVvdXQgJXggJXggJXgiLCBwaHlyLCBkYXRhLCBhZHIpOyAqLwogfQogCiBpbmxpbmUgdm9pZCB3cml0ZV9waHlfb2ZkbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKQpAQCAtMjgxMiw5ICsyODE3LDkgQEAKIAl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCaW50ckl0dik7CiAJd29yZCAmPSB+QmludHJJdHZfQmludHJJdHY7CiAJd29yZCB8PSAxMDAwOyAvKiBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKgotCQkoKHByaXYtPnR4YmVhY29uY291bnQgPiAxKT8ocHJpdi0+dHhiZWFjb25jb3VudC0xKToxKTsKLQkvLyBGSVhNRTogY2hlY2sgaWYgY29ycmVjdCBeXiB3b3JrZWQgd2l0aCAweDNlODsKLQkqLworCQkgICAgICAgKiAoKHByaXYtPnR4YmVhY29uY291bnQgPiAxKT8ocHJpdi0+dHhiZWFjb25jb3VudC0xKToxKTsKKwkJICAgICAgICogRklYTUU6IGNoZWNrIGlmIGNvcnJlY3QgXl4gd29ya2VkIHdpdGggMHgzZTg7CisJCSAgICAgICAqLwogCXdyaXRlX25pY193b3JkKGRldiwgQmludHJJdHYsIHdvcmQpOwogCiAJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwpAQCAtMjgzMyw3ICsyODM4LDcgQEAKICAqIENoYW5nZSBjdXJyZW50IGFuZCBkZWZhdWx0IHByZWFtYmxlIG1vZGUuCiAgKi8KIHN0YXRpYyBib29sIE1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCi0JCQkJICAgICBSVF9QU19NT0RFIHJ0UHNNb2RlKQorCQkJCSAgICAgZW51bSBydF9wc19tb2RlIHJ0UHNNb2RlKQogewogCS8qIEN1cnJlbnRseSwgd2UgZG8gbm90IGNoYW5nZSBwb3dlciBzYXZlIG1vZGUgb24gSUJTUyBtb2RlLiAqLwogCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKQEAgLTI4NDYsMjUgKzI4NTEsMjYgQEAKIAogc3RhdGljIHZvaWQgTGVpc3VyZVBTRW50ZXIoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYpCiB7Ci0JaWYgKHByaXYtPmJMZWlzdXJlUHMpIHsKKwlpZiAocHJpdi0+YkxlaXN1cmVQcykKIAkJaWYgKHByaXYtPmllZWU4MDIxMS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKQogCQkJLyogSUVFRTgwMjExX1BTX0VOQUJMRSAqLwotCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LCBJRUVFODAyMTFfUFNfTUJDQVNUfElFRUU4MDIxMV9QU19VTklDQVNUKTsKLQl9CisJCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHByaXYsCisJCQkJSUVFRTgwMjExX1BTX01CQ0FTVCB8IElFRUU4MDIxMV9QU19VTklDQVNUKTsKIH0KIAogc3RhdGljIHZvaWQgTGVpc3VyZVBTTGVhdmUoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYpCiB7Ci0JaWYgKHByaXYtPmJMZWlzdXJlUHMpIHsKKwlpZiAocHJpdi0+YkxlaXN1cmVQcykKIAkJaWYgKHByaXYtPmllZWU4MDIxMS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKQotCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LCBJRUVFODAyMTFfUFNfRElTQUJMRUQpOwotCX0KKwkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoCisJCQkJcHJpdiwgSUVFRTgwMjExX1BTX0RJU0FCTEVEKTsKIH0KIAogdm9pZCBydGw4MTgwX2h3X3dha2V1cF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBod193YWtldXBfd3EpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKAorCQlkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGh3X3dha2V1cF93cSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKIAogCXJ0bDgxODBfaHdfd2FrZXVwKGRldik7CkBAIC0yODczLDcgKzI4NzksOCBAQAogdm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGh3X3NsZWVwX3dxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZigKKwkJZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBod19zbGVlcF93cSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKIAogCXJ0bDgxODBfaHdfc2xlZXBfZG93bihkZXYpOwpAQCAtMjg5MCwyMyArMjg5NywzMCBAQAogCQkgKi8KIAogCQlpZiAoKHByaXYtPmtlZXBBbGl2ZUxldmVsID09IDIpIHx8Ci0JCQkocHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVR4VW5pY2FzdCA9PSBwcml2LT5OdW1UeFVuaWNhc3QgJiYKLQkJCXByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1SeFVuaWNhc3QgPT0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3QpCisJCQkocHJpdi0+bGlua19kZXRlY3QubGFzdF9udW1fdHhfdW5pY2FzdCA9PQorCQkJCXByaXYtPk51bVR4VW5pY2FzdCAmJgorCQkJcHJpdi0+bGlua19kZXRlY3QubGFzdF9udW1fcnhfdW5pY2FzdCA9PQorCQkJCXByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0KQogCQkJKSB7Ci0JCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQrKzsKKwkJCXByaXYtPmxpbmtfZGV0ZWN0LmlkbGVfY291bnQrKzsKIAogCQkJLyoKLQkJCSAqIFNlbmQgYSBLZWVwLUFsaXZlIHBhY2tldCBwYWNrZXQgdG8gQVAgaWYgd2UgaGFkIGJlZW4gaWRsZSBmb3IgYSB3aGlsZS4KKwkJCSAqIFNlbmQgYSBLZWVwLUFsaXZlIHBhY2tldCBwYWNrZXQgdG8gQVAgaWYgd2UgaGFkCisJCQkgKiBiZWVuIGlkbGUgZm9yIGEgd2hpbGUuCiAJCQkgKi8KLQkJCWlmIChwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPj0gKChLRUVQX0FMSVZFX0lOVEVSVkFMIC8gQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKS0xKSkgewotCQkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA9IDA7Ci0JCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUocHJpdi0+aWVlZTgwMjExLCBmYWxzZSk7CisJCQlpZiAocHJpdi0+bGlua19kZXRlY3QuaWRsZV9jb3VudCA+PQorCQkJCUtFRVBfQUxJVkVfSU5URVJWQUwgLworCQkJCUNIRUNLX0ZPUl9IQU5HX1BFUklPRCAtIDEpIHsKKwkJCQlwcml2LT5saW5rX2RldGVjdC5pZGxlX2NvdW50ID0gMDsKKwkJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZSgKKwkJCQkJcHJpdi0+aWVlZTgwMjExLCBmYWxzZSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPSAwOworCQkJcHJpdi0+bGlua19kZXRlY3QuaWRsZV9jb3VudCA9IDA7CiAJCX0KLQkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVR4VW5pY2FzdCA9IHByaXYtPk51bVR4VW5pY2FzdDsKLQkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVJ4VW5pY2FzdCA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0OworCQlwcml2LT5saW5rX2RldGVjdC5sYXN0X251bV90eF91bmljYXN0ID0gcHJpdi0+TnVtVHhVbmljYXN0OworCQlwcml2LT5saW5rX2RldGVjdC5sYXN0X251bV9yeF91bmljYXN0ID0KKwkJCXByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0OwogCX0KIH0KIApAQCAtMjkyMiwzNiArMjkzNiw0MiBAQAogCQlpZiAoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSAmJgogCQkgICAgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgJiYKIAkJICAgIChwcml2LT5pZWVlODAyMTEtPmJlaW5yZXRyeSA9PSBmYWxzZSkgJiYKLQkJICAgIChwcml2LT5lUkZQb3dlclN0YXRlID09IGVSZk9uKSkKKwkJICAgIChwcml2LT5lUkZQb3dlclN0YXRlID09IFJGX09OKSkKIAkJCUlQU0VudGVyKGRldik7CiAJfQotCS8qIFlKLGFkZCwwODA4MjgsZm9yIGxpbmsgc3RhdGUgY2hlY2sgKi8KLQlpZiAoKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgewotCQlTbG90SW5kZXggPSAocHJpdi0+bGlua19kZXRlY3QuU2xvdEluZGV4KyspICUgcHJpdi0+bGlua19kZXRlY3QuU2xvdE51bTsKLQkJcHJpdi0+bGlua19kZXRlY3QuUnhGcmFtZU51bVtTbG90SW5kZXhdID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCArIHByaXYtPmllZWU4MDIxMS0+TnVtUnhCY25JblBlcmlvZDsKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmxpbmtfZGV0ZWN0LlNsb3ROdW07IGkrKykKLQkJCVRvdGFsUnhOdW0gKz0gcHJpdi0+bGlua19kZXRlY3QuUnhGcmFtZU51bVtpXTsKKwlpZiAoKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYKKwkJKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgeworCQlTbG90SW5kZXggPSAocHJpdi0+bGlua19kZXRlY3Quc2xvdF9pbmRleCsrKSAlCisJCQlwcml2LT5saW5rX2RldGVjdC5zbG90X251bTsKKworCQlwcml2LT5saW5rX2RldGVjdC5yeF9mcmFtZV9udW1bU2xvdEluZGV4XSA9CisJCQlwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kICsKKwkJCXByaXYtPmllZWU4MDIxMS0+TnVtUnhCY25JblBlcmlvZDsKKworCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bGlua19kZXRlY3Quc2xvdF9udW07IGkrKykKKwkJCVRvdGFsUnhOdW0gKz0gcHJpdi0+bGlua19kZXRlY3QucnhfZnJhbWVfbnVtW2ldOwogCiAJCWlmIChUb3RhbFJ4TnVtID09IDApIHsKIAkJCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7Ci0JCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLAorCQkJCSZwcml2LT5pZWVlODAyMTEtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwogCQl9CiAJfQogCi0JLyogWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlICovCiAJTWdudExpbmtLZWVwQWxpdmUocHJpdik7CiAKLQkvKiBZSixhZGQsMDgwODI4LGZvciBMUFMgKi8KIAlMZWlzdXJlUFNMZWF2ZShwcml2KTsKIAogCWlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpIHsKLQkJcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZDsKLQkJaWYgKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA+IDY2NiB8fAotCQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kID4gNjY2KSB7CisJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV9yeF9va19pbl9wZXJpb2QgPQorCQkJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZDsKKwkJaWYgKHByaXYtPmxpbmtfZGV0ZWN0Lm51bV9yeF9va19pbl9wZXJpb2QgPiA2NjYgfHwKKwkJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QgPiA2NjYpIHsKIAkJCWJCdXN5VHJhZmZpYyA9IHRydWU7CiAJCX0KLQkJaWYgKCgocHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kICsgcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKSA+IDgpCi0JCQl8fCAocHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID4gMikpIHsKKwkJaWYgKChwcml2LT5saW5rX2RldGVjdC5udW1fcnhfb2tfaW5fcGVyaW9kICsKKwkJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QgPiA4KQorCQkJfHwgKHByaXYtPmxpbmtfZGV0ZWN0Lm51bV9yeF9va19pbl9wZXJpb2QgPiAyKSkgewogCQkJYkVudGVyUFMgPSBmYWxzZTsKIAkJfSBlbHNlCiAJCQliRW50ZXJQUyA9IHRydWU7CkBAIC0yOTYyLDkgKzI5ODIsOSBAQAogCQkJTGVpc3VyZVBTTGVhdmUocHJpdik7CiAJfSBlbHNlCiAJCUxlaXN1cmVQU0xlYXZlKHByaXYpOwotCXByaXYtPmxpbmtfZGV0ZWN0LmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKLQlwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPSAwOwotCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+bGlua19kZXRlY3QuYl9idXN5X3RyYWZmaWMgPSBiQnVzeVRyYWZmaWM7CisJcHJpdi0+bGlua19kZXRlY3QubnVtX3J4X29rX2luX3BlcmlvZCA9IDA7CisJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCA9IDA7CiAJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7CiAJcHJpdi0+aWVlZTgwMjExLT5OdW1SeEJjbkluUGVyaW9kID0gMDsKIH0KQEAgLTMwNDcsMTUgKzMwNjcsMTcgQEAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CiAJZGVsX3RpbWVyX3N5bmMoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsKLQlTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoZGV2LCBlUmZPZmYpOwotCW1lbXNldCgmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCVNldFplYnJhUkZQb3dlclN0YXRlODE4NShkZXYsIFJGX09GRik7CisJbWVtc2V0KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaywKKwkJMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOwogCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwogCXJldHVybiAwOwogfQogCiB2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHJlc2V0X3dxKTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZigKKwkJd29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHJlc2V0X3dxKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+ZGV2OwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTMxMTYsNyArMzEzOCw4IEBACiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAogCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCi0JCW1lbWNweShwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsCisJCQlkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKIAlpZiAocHJpdi0+dXApIHsKIAkJcnRsODE4MF9kb3duKGRldik7CkBAIC0zMTM3LDcgKzMxNjAsOCBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKLQkJcmV0ID0gaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHByaXYtPmllZWU4MDIxMSwgJndycS0+dS5kYXRhKTsKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKAorCQkJcHJpdi0+aWVlZTgwMjExLCAmd3JxLT51LmRhdGEpOwogCQlyZXR1cm4gcmV0OwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTMzODcsNyArMzQxMSw3IEBACiAJaW50IGosIGk7CiAJaW50IGhkOwogCWlmIChlcnJvcikKLQkJcHJpdi0+c3RhdHMudHhyZXRyeSsrOyAvKiB0b255IDIwMDYwNjAxICovCisJCXByaXYtPnN0YXRzLnR4cmV0cnkrKzsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZyk7CiAJc3dpdGNoIChwcmkpIHsKIAljYXNlIE1BTkFHRV9QUklPUklUWToKQEAgLTM1NDAsNyArMzU2NCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7CiAKIAkvKiBJU1I6IDRieXRlcyAqLwotCWludGEgPSByZWFkX25pY19kd29yZChkZXYsIElTUik7IC8qICYgcHJpdi0+SW50ck1hc2s7ICovCisJaW50YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgSVNSKTsKIAl3cml0ZV9uaWNfZHdvcmQoZGV2LCBJU1IsIGludGEpOyAvKiByZXNldCBpbnQgc2l0dWF0aW9uICovCiAKIAlwcml2LT5zdGF0cy5zaGludHMrKzsKQEAgLTM1ODYsNyArMzYxMCw3IEBACiAJfQogCiAJaWYgKGludGEgJiBJU1JfVEhQRE9LKSB7IC8qIEhpZ2ggcHJpb3JpdHkgdHggb2sgKi8KLQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8qIFlKLGFkZCwwODA4MjggKi8KKwkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCsrOwogCQlwcml2LT5zdGF0cy50eGhwb2tpbnQrKzsKIAkJcnRsODE4MF90eF9pc3IoZGV2LCBISV9QUklPUklUWSwgMCk7CiAJfQpAQCAtMzY0OSwxNCArMzY3MywxNCBAQAogCQlwcml2LT5zdGF0cy50eG92ZXJmbG93Kys7CiAKIAlpZiAoaW50YSAmIElTUl9UTlBET0spIHsgLyogTm9ybWFsIHByaW9yaXR5IHR4IG9rICovCi0JCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvKiBZSixhZGQsMDgwODI4ICovCisJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QrKzsKIAkJcHJpdi0+c3RhdHMudHhucG9raW50Kys7CiAJCXJ0bDgxODBfdHhfaXNyKGRldiwgTk9STV9QUklPUklUWSwgMCk7CiAJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBOT1JNX1BSSU9SSVRZKTsKIAl9CiAKIAlpZiAoaW50YSAmIElTUl9UTFBET0spIHsgLyogTG93IHByaW9yaXR5IHR4IG9rICovCi0JCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvKiBZSixhZGQsMDgwODI4ICovCisJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QrKzsKIAkJcHJpdi0+c3RhdHMudHhscG9raW50Kys7CiAJCXJ0bDgxODBfdHhfaXNyKGRldiwgTE9XX1BSSU9SSVRZLCAwKTsKIAkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIExPV19QUklPUklUWSk7CkBAIC0zNjY0LDE0ICszNjg4LDE0IEBACiAKIAlpZiAoaW50YSAmIElTUl9UQktET0spIHsgLyogY29ycmVzcG9uZGluZyB0byBCS19QUklPUklUWSAqLwogCQlwcml2LT5zdGF0cy50eGJrcG9raW50Kys7Ci0JCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvKiBZSixhZGQsMDgwODI4ICovCisJCXByaXYtPmxpbmtfZGV0ZWN0Lm51bV90eF9va19pbl9wZXJpb2QrKzsKIAkJcnRsODE4MF90eF9pc3IoZGV2LCBCS19QUklPUklUWSwgMCk7CiAJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CiAJfQogCiAJaWYgKGludGEgJiBJU1JfVEJFRE9LKSB7IC8qIGNvcnJlc3BvbmRpbmcgdG8gQkVfUFJJT1JJVFkgKi8KIAkJcHJpdi0+c3RhdHMudHhiZXBlcnIrKzsKLQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8qIFlKLGFkZCwwODA4MjggKi8KKwkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCsrOwogCQlydGw4MTgwX3R4X2lzcihkZXYsIEJFX1BSSU9SSVRZLCAwKTsKIAkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKIAl9CkBAIC0zNjg4LDE3ICszNzEyLDE5IEBACiAKIHZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIEdQSU9DaGFuZ2VSRldvcmtJdGVtLndvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKAorCQl3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgR1BJT0NoYW5nZVJGV29ya0l0ZW0ud29yayk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTggYnRQU1I7CiAJdTggYnRDb25maWcwOwotCVJUX1JGX1BPV0VSX1NUQVRFCWVSZlBvd2VyU3RhdGVUb1NldDsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSZlBvd2VyU3RhdGVUb1NldDsKIAlib29sIGJBY3R1YWxseVNldCA9IGZhbHNlOwogCiAJY2hhciAqYXJndlszXTsKIAlzdGF0aWMgY2hhciAqUmFkaW9Qb3dlclBhdGggPSAiL2V0Yy9hY3BpL2V2ZW50cy9SYWRpb1Bvd2VyLnNoIjsKLQlzdGF0aWMgY2hhciAqZW52cFtdID0geyJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS91c3IvYmluOi9iaW4iLCBOVUxMfTsKKwlzdGF0aWMgY2hhciAqZW52cFtdID0geyJIT01FPS8iLCAiVEVSTT1saW51eCIsCisJCSJQQVRIPS91c3IvYmluOi9iaW4iLCBOVUxMfTsKIAlzdGF0aWMgaW50IHJlYWRmX2NvdW50OwogCiAJcmVhZGZfY291bnQgPSAocmVhZGZfY291bnQrMSklMHhmZmZmOwpAQCAtMzcwOCwyNCArMzczNCwyNCBAQAogCWJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CiAJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChidFBTUiAmIH5CSVQzKSk7CiAKLQkvKiBJdCBuZWVkIHRvIGRlbGF5IDR1cyBzdWdnZXN0ZWQgYnkgSm9uZywgMjAwOC0wMS0xNiAqLworCS8qIEl0IG5lZWQgdG8gZGVsYXkgNHVzIHN1Z2dlc3RlZCAqLwogCXVkZWxheSg0KTsKIAogCS8qIEhXIHJhZGlvIE9uL09mZiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIEZGNTFbNF0oY29uZmlnMCkgKi8KIAlidENvbmZpZzAgPSBidFBTUiA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUcwKTsKIAotCWVSZlBvd2VyU3RhdGVUb1NldCA9IChidENvbmZpZzAgJiBCSVQ0KSA/ICBlUmZPbiA6IGVSZk9mZjsKKwllUmZQb3dlclN0YXRlVG9TZXQgPSAoYnRDb25maWcwICYgQklUNCkgPyAgUkZfT04gOiBSRl9PRkY7CiAKIAkvKiBUdXJuIExFRCBiYWNrIG9uIHdoZW4gcmFkaW8gZW5hYmxlZCAqLwotCWlmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT24pCisJaWYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBSRl9PTikKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIGJ0UFNSIHwgQklUMyk7CiAKIAlpZiAoKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgJiYKLQkgICAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9uKSkgeworCSAgIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gUkZfT04pKSB7CiAJCXByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKIAkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKChwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID09IGZhbHNlKSAmJgotCQkgIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT2ZmKSkgeworCQkgIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gUkZfT0ZGKSkgewogCQlwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID0gdHJ1ZTsKIAkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKaW5kZXggMmNjZDJjYi4uOGMwMjBlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYwpAQCAtMTExNiwxNCArMTExNiwxNCBAQAogdm9pZCBTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwotCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOwogCiAJIC8qIFdlIGRvIE5PVCBuZWVkIHRvIHN3aXRjaCBhbnRlbm5hIHdoaWxlIFJGIGlzIG9mZi4gKi8KIAlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKIAlkbyB7Ci0JCWlmIChydFN0YXRlID09IGVSZk9mZikgeworCQlpZiAocnRTdGF0ZSA9PSBSRl9PRkYpIHsKIAkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJ0U3RhdGUgPT0gZVJmU2xlZXApIHsKKwkJfSBlbHNlIGlmIChydFN0YXRlID09IFJGX1NMRUVQKSB7CiAJCQkvKiBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgRGlzYWJsZSBQTEwgc2l0dWF0aW9uLiAqLwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmgKaW5kZXggZGUwODRmMC4uN2RmNzM5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmgKQEAgLTEsMTQgKzEsMTMgQEAKIC8qCi0JVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKLQlyZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KLQlDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KLQotCVRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyMjUKLQlyYWRpbyBmcm9udGVuZC4KLQotCSpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKLQotKi8KKyAqIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlCisgKiBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjI1IHJhZGlvIGZyb250ZW5kLgorICoKKyAqICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKyAqLwogCiAjaW5jbHVkZSAicjgxODAuaCIKIApAQCAtMjksNyArMjgsNyBAQAogdm9pZCBydGw4MTgwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtb2RlKTsKIHZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbW9kZSk7CiBib29sIFNldFplYnJhUkZQb3dlclN0YXRlODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSk7CisJCQkgICAgICBlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpOwogdm9pZCBydGw4MjI1ejRfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIHJ0bDgyMjV6NF9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCmluZGV4IDdjOWE4YmYuLjQ3MTA0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwpAQCAtMjc5LDggKzI3OSw4IEBACiAgKiBNYXAgZEJtIGludG8gVHggcG93ZXIgaW5kZXggYWNjb3JkaW5nIHRvIGN1cnJlbnQgSFcgbW9kZWwsIGZvciBleGFtcGxlLAogICogUkYgYW5kIFBBLCBhbmQgY3VycmVudCB3aXJlbGVzcyBtb2RlLgogICovCi1zdGF0aWMgczggRGJtVG9UeFB3cklkeChzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwgV0lSRUxFU1NfTU9ERSBXaXJlbGVzc01vZGUsCi0JCQlzMzIgUG93ZXJJbkRibSkKK3N0YXRpYyBzOCBEYm1Ub1R4UHdySWR4KHN0cnVjdCByODE4MF9wcml2ICpwcml2LAorCQkJZW51bSB3aXJlbGVzc19tb2RlIG1vZGUsIHMzMiBQb3dlckluRGJtKQogewogCWJvb2wgYlVzZURlZmF1bHQgPSB0cnVlOwogCXM4IFR4UHdySWR4ID0gMDsKQEAgLTI5MSw3ICsyOTEsNyBAQAogCSAqLwogCXMzMiB0bXAgPSAwOwogCi0JaWYgKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0cpIHsKKwlpZiAobW9kZSA9PSBXSVJFTEVTU19NT0RFX0cpIHsKIAkJYlVzZURlZmF1bHQgPSBmYWxzZTsKIAkJdG1wID0gKDIgKiBQb3dlckluRGJtKTsKIApAQCAtMzAxLDcgKzMwMSw3IEBACiAJCQlUeFB3cklkeCA9IDQwOwogCQllbHNlCiAJCQlUeFB3cklkeCA9IChzOCl0bXA7Ci0JfSBlbHNlIGlmIChXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKSB7CisJfSBlbHNlIGlmIChtb2RlID09IFdJUkVMRVNTX01PREVfQikgewogCQliVXNlRGVmYXVsdCA9IGZhbHNlOwogCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CiAKQEAgLTYwNiw1MSArNjA2LDEyIEBACiAJcnRsODIyNXoyX3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CiB9CiAKLXZvaWQgcnRsODIyNXoyX3JmX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBJRUVFX0EpIHsKLQkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHgxODY1KTsKLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDA4NCk7Ci0JCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHhhODAwOCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwLCAweDApOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg2KTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4OTkpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg3KTsKLQotCQlydGw4MjI1ejJfc2V0X2dhaW4oZGV2LCA0KTsKLQotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOwotCi0JCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4MTAwMDAwMDApOwotCX0gZWxzZSB7Ci0JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4MTg2NCk7Ci0JCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwNDQpOwotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4YTgwMDgpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDk5KTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nyk7Ci0KLQkJcnRsODIyNXoyX3NldF9nYWluKGRldiwgNCk7Ci0KLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsKLQotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDA0MDAwMDAyKTsKLQl9Ci19Ci0KICNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIJCTIwCiAjZGVmaW5lIE1BWF9QT0xMSU5HXzI0Rl9USU1FU184N1NFCQkxMAogI2RlZmluZSBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRQk1CiAKIGJvb2wgU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlKQorCQkJICAgICAgZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlKQogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OAkJCWJ0Q1I5MzQ2LCBidENvbmZpZzM7CkBAIC02NzIsNyArNjMzLDcgQEAKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIChidENvbmZpZzMgfCBDT05GSUczX1BBUk1fRW4pKTsKIAogCXN3aXRjaCAoZVJGUG93ZXJTdGF0ZSkgewotCWNhc2UgZVJmT246CisJY2FzZSBSRl9PTjoKIAkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMEVDKTsKIAogCQkvKiB0dXJuIG9uIEFGRSAqLwpAQCAtNjk3LDcgKzY1OCw3IEBACiAJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWJUbXAgJiAofihCSVQ1IHwgQklUNikpKSk7CiAJCWJyZWFrOwotCWNhc2UgZVJmU2xlZXA6CisJY2FzZSBSRl9TTEVFUDoKIAkJZm9yIChRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCA2OykgewogCQkJaWYgKGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsIFF1ZXVlSUQpID09CiAJCQkJCQkJcHJpdi0+dHhyaW5nY291bnQpIHsKQEAgLTc2NCw3ICs3MjUsNyBAQAogCQkJfQogCQl9CiAJCWJyZWFrOwotCWNhc2UgZVJmT2ZmOgorCWNhc2UgUkZfT0ZGOgogCQlmb3IgKFF1ZXVlSUQgPSAwLCBpID0gMDsgUXVldWVJRCA8IDY7KSB7CiAJCQlpZiAoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldiwgUXVldWVJRCkgPT0KIAkJCQkJcHJpdi0+dHhyaW5nY291bnQpIHsKQEAgLTg0MSwxMCArODAyLDEwIEBACiAKIHZvaWQgcnRsODIyNXo0X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZlNsZWVwLCBSRl9DSEFOR0VfQllfUFMpOworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBSRl9TTEVFUCwgUkZfQ0hBTkdFX0JZX1BTKTsKIH0KIAogdm9pZCBydGw4MjI1ejRfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCBSRl9DSEFOR0VfQllfUFMpOworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBSRl9PTiwgUkZfQ0hBTkdFX0JZX1BTKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwppbmRleCA5YjY3NmUwLi5iNTUyNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKICNkZWZpbmUgUkFURV9DT1VOVCBBUlJBWV9TSVpFKHJ0bDgxODBfcmF0ZXMpCiAKLXN0YXRpYyBDSEFOTkVMX0xJU1QgRGVmYXVsdENoYW5uZWxQbGFuW10gPSB7CitzdGF0aWMgc3RydWN0IHJ0bDgxODdzZV9jaGFubmVsX2xpc3QgZGVmYXVsdF9jaGFubmVsX3BsYW5bXSA9IHsKIAl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMTl9LAkJLyogRkNDICovCiAJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTF9LCAxMX0sCQkJCQkJLyogSUMgKi8KIAl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAyMX0sCS8qIEVUU0kJKi8KQEAgLTMzNyw3ICszMzcsNyBAQAogCQl9CWVsc2UJewogCQkJLyogcHJldmVudCBzY2FuIGluIEJ1c3lUcmFmZmljICovCiAJCQkvKiBGSVhNRTogTmVlZCB0byBjb25zaWRlciBsYXN0IHNjYW4gdGltZSAqLwotCQkJaWYgKChwcml2LT5saW5rX2RldGVjdC5iQnVzeVRyYWZmaWMpICYmICh0cnVlKSkJeworCQkJaWYgKChwcml2LT5saW5rX2RldGVjdC5iX2J1c3lfdHJhZmZpYykgJiYgKHRydWUpKSB7CiAJCQkJcmV0ID0gMDsKIAkJCQlwcmludGsoIk5vdyB0cmFmZmljIGlzIGJ1c3ksIHBsZWFzZSB0cnkgbGF0ZXIhXG4iKTsKIAkJCX0JZWxzZQpAQCAtMTAzMCwxNSArMTAzMCwxNSBAQAogCiAJLyogdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KIAlkb3duKCZwcml2LT53eF9zZW0pOwotCWlmIChEZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uTGVuICE9IDApCXsKKwlpZiAoZGVmYXVsdF9jaGFubmVsX3BsYW5bKnZhbF0ubGVuICE9IDApIHsKIAkJcHJpdi0+Y2hhbm5lbF9wbGFuID0gKnZhbDsKIAkJLyogQ2xlYXIgb2xkIGNoYW5uZWwgbWFwIDggKi8KIAkJZm9yIChpID0gMTsgaSA8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKIAkJCUdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcFtpXSA9IDA7CiAKIAkJLyogU2V0IG5ldyBjaGFubmVsIG1hcCAqLwotCQlmb3IgKGkgPSAxOyBpIDw9IERlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5MZW47IGkrKykKLQkJCUdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcFtEZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uQ2hhbm5lbFtpLTFdXSA9IDE7CisJCWZvciAoaSA9IDE7IGkgPD0gZGVmYXVsdF9jaGFubmVsX3BsYW5bKnZhbF0ubGVuOyBpKyspCisJCQlHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXBbZGVmYXVsdF9jaGFubmVsX3BsYW5bKnZhbF0uY2hhbm5lbFtpLTFdXSA9IDE7CiAKIAl9CiAJdXAoJnByaXYtPnd4X3NlbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKaW5kZXggYzhiOWJhZi4uY2M2ZjEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwpAQCAtNjE5LDEwICs2MTksMTAgQEAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAKIAkvKiBsem0gYWRkIDA4MDgyNiAqLwotCWlmIChwcml2LT5lUkZQb3dlclN0YXRlICE9IGVSZk9uKSB7CisJaWYgKHByaXYtPmVSRlBvd2VyU3RhdGUgIT0gUkZfT04pIHsKIAkJLyoJRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIGRpc2FibGUgUExMIHNpdHVhdGlvbi4KIAkJICoJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCAoIlVwZGF0ZUluaXRpYWxHYWluIC0KLQkJICoJcEhhbERhdGEtPmVSRlBvd2VyU3RhdGUhPWVSZk9uXG4iKSk7CisJCSAqCXBIYWxEYXRhLT5lUkZQb3dlclN0YXRlIT1SRl9PTlxuIikpOwogCQkgKglCYWNrIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZQogCQkgKi8KIAkJcHJpdi0+SW5pdGlhbEdhaW4gPSBwcml2LT5Jbml0aWFsR2FpbkJhY2tVcDsKQEAgLTg3Miw4ICs4NzIsOCBAQAogCiBzdGF0aWMgdm9pZAogQWN0VXBkYXRlQ2hhbm5lbEFjY2Vzc1NldHRpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIFdJUkVMRVNTX01PREUgV2lyZWxlc3NNb2RlLAotCQkJICAgICAgUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcgQ2hubEFjY2Vzc1NldHRpbmcpCisJCQkgICAgICBlbnVtIHdpcmVsZXNzX21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjaG5sX2FjY2Vzc19zZXR0aW5nICpjaG5sX2FjY2Vzc19zZXR0aW5nKQogewogCUFDX0NPRElORwllQUNJOwogCkBAIC04OTAsMjUgKzg5MCwyNSBAQAogCSAqLwogCiAJLyogU3VnZ2VzdGVkIGJ5IEpvbmcsIDIwMDUuMTIuMDguICovCi0JQ2hubEFjY2Vzc1NldHRpbmctPlNJRlNfVGltZXIgPSAweDIyOwotCUNobmxBY2Nlc3NTZXR0aW5nLT5ESUZTX1RpbWVyID0gMHgxQzsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLwotCUNobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyID0gOTsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLworCWNobmxfYWNjZXNzX3NldHRpbmctPnNpZnNfdGltZXIgPSAweDIyOworCWNobmxfYWNjZXNzX3NldHRpbmctPmRpZnNfdGltZXIgPSAweDFDOyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCisJY2hubF9hY2Nlc3Nfc2V0dGluZy0+c2xvdF90aW1lX3RpbWVyID0gOTsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLwogCS8qCiAJICogU3VnZ2VzdGVkIGJ5IHdjY2h1LCBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBFSUZTIHJlZ2lzdGVyLAogCSAqIDIwMDUuMTIuMDguCiAJICovCi0JQ2hubEFjY2Vzc1NldHRpbmctPkVJRlNfVGltZXIgPSAweDVCOwotCUNobmxBY2Nlc3NTZXR0aW5nLT5DV21pbkluZGV4ID0gMzsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLwotCUNobmxBY2Nlc3NTZXR0aW5nLT5DV21heEluZGV4ID0gNzsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLworCWNobmxfYWNjZXNzX3NldHRpbmctPmVpZnNfdGltZXIgPSAweDVCOworCWNobmxfYWNjZXNzX3NldHRpbmctPmN3bWluX2luZGV4ID0gMzsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLworCWNobmxfYWNjZXNzX3NldHRpbmctPmN3bWF4X2luZGV4ID0gNzsgLyogMjAwNi4wNi4wMiwgYnkgcmNuamtvLiAqLwogCi0Jd3JpdGVfbmljX2J5dGUoZGV2LCBTSUZTLCBDaG5sQWNjZXNzU2V0dGluZy0+U0lGU19UaW1lcik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBTSUZTLCBjaG5sX2FjY2Vzc19zZXR0aW5nLT5zaWZzX3RpbWVyKTsKIAkvKgogCSAqIFJld3JpdGVkIGZyb20gZGlyZWN0bHkgdXNlIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoKSwKIAkgKiBieSBBbm5pZSwgMjAwNi0wMy0yOS4KIAkgKi8KLQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNMT1QsIENobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNMT1QsIGNobmxfYWNjZXNzX3NldHRpbmctPnNsb3RfdGltZV90aW1lcik7CiAKLQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVJRlMsIENobmxBY2Nlc3NTZXR0aW5nLT5FSUZTX1RpbWVyKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVJRlMsIGNobmxfYWNjZXNzX3NldHRpbmctPmVpZnNfdGltZXIpOwogCiAJLyoKIAkgKiA8UkpfRVhQUl9RT1M+IFN1Z2dlc3RlZCBieSB3Y2NodSwgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRUlGUwpAQCAtOTU5LDcgKzk1OSw3IEBACiAJICogd2lyZWxlc3MgbW9kZSBpZiB3ZSBzd2l0Y2ggdG8gc3BlY2lmaWVkIGJhbmQgc3VjY2Vzc2Z1bGx5LgogCSAqLwogCi0JaWVlZS0+bW9kZSA9IChXSVJFTEVTU19NT0RFKWJ0V2lyZWxlc3NNb2RlOworCWllZWUtPm1vZGUgPSAoZW51bSB3aXJlbGVzc19tb2RlKWJ0V2lyZWxlc3NNb2RlOwogCiAJLyogMy4gQ2hhbmdlIHJlbGF0ZWQgc2V0dGluZy4gKi8KIAlpZiAoaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0EpCkBAIC0xMDg1LDcgKzEwODUsNyBAQAogICoJCVBBU1NJVkUgTEVWRUwuCiAgKi8KIHN0YXRpYyBib29sIFNldFJGUG93ZXJTdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIFJUX1JGX1BPV0VSX1NUQVRFIGVSRlBvd2VyU3RhdGUpCisJCQkgICAgZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlKQogewogCXN0cnVjdAlyODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlib29sCWJSZXN1bHQgPSBmYWxzZTsKQEAgLTEwOTgsMTMgKzEwOTgsMTMgQEAKIAlyZXR1cm4gYlJlc3VsdDsKIH0KIAotYm9vbCBNZ250QWN0U2V0X1JGX1N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFJUX1JGX1BPV0VSX1NUQVRFIFN0YXRlVG9TZXQsCitib29sIE1nbnRBY3RTZXRfUkZfU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBTdGF0ZVRvU2V0LAogCQkJIHUzMiBDaGFuZ2VTb3VyY2UpCiB7CiAJc3RydWN0CXI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCWJvb2wJYkFjdGlvbkFsbG93ZWQgPSBmYWxzZTsKIAlib29sCWJDb25uZWN0QnlTU0lEID0gZmFsc2U7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CiAJdTE2CVJGV2FpdENvdW50ZXIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAkvKgpAQCAtMTE0MCw3ICsxMTQwLDcgQEAKIAlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKIAogCXN3aXRjaCAoU3RhdGVUb1NldCkgewotCWNhc2UgZVJmT246CisJY2FzZSBSRl9PTjoKIAkJLyoKIAkJICoJVHVybiBPbiBSRiBubyBtYXR0ZXIgdGhlIElQUyBzZXR0aW5nIGJlY2F1c2Ugd2UgbmVlZCB0bwogCQkgKgl1cGRhdGUgdGhlIFJGIHN0YXRlIHRvIE5kaXMgdW5kZXIgVmlzdGEsIG9yIHRoZSBXaW5kb3dzCkBAIC0xMTUzLDEzICsxMTUzLDEzIEBACiAJCQlwcml2LT5SZk9mZlJlYXNvbiA9IDA7CiAJCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CiAKLQkJCWlmIChydFN0YXRlID09IGVSZk9mZiAmJgorCQkJaWYgKHJ0U3RhdGUgPT0gUkZfT0ZGICYmCiAJCQkgICAgQ2hhbmdlU291cmNlID49IFJGX0NIQU5HRV9CWV9IVykKIAkJCQliQ29ubmVjdEJ5U1NJRCA9IHRydWU7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIGVSZk9mZjoKKwljYXNlIFJGX09GRjoKIAkJIC8qIDA3MDEyNSwgcmNuamtvOiB3ZSBhbHdheXMga2VlcCBjb25uZWN0ZWQgaW4gQVAgbW9kZS4gKi8KIAogCQlpZiAocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKSB7CkBAIC0xMTgyLDcgKzExODIsNyBAQAogCQlwcml2LT5SZk9mZlJlYXNvbiB8PSBDaGFuZ2VTb3VyY2U7CiAJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKIAkJYnJlYWs7Ci0JY2FzZSBlUmZTbGVlcDoKKwljYXNlIFJGX1NMRUVQOgogCQlwcml2LT5SZk9mZlJlYXNvbiB8PSBDaGFuZ2VTb3VyY2U7CiAJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKIAkJYnJlYWs7CkBAIC0xMjMzLDcgKzEyMzMsNyBAQAogdm9pZCBJUFNFbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKIAlpZiAocHJpdi0+YkluYWN0aXZlUHMpIHsKIAkJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CiAKQEAgLTEyNDUsOSArMTI0NSw5IEBACiAJCSAqCXRyaWdnZXIgSVBTKSg0KSBJQlNTIChzZW5kIEJlYWNvbikKIAkJICoJKDUpIEFQIG1vZGUgKHNlbmQgQmVhY29uKQogCQkgKi8KLQkJaWYgKHJ0U3RhdGUgPT0gZVJmT24gJiYgIXByaXYtPmJTd1JmUHJvY2Vzc2luZworCQlpZiAocnRTdGF0ZSA9PSBSRl9PTiAmJiAhcHJpdi0+YlN3UmZQcm9jZXNzaW5nCiAJCQkmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSkgewotCQkJcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBSRl9PRkY7CiAJCQlJbmFjdGl2ZVBvd2VyU2F2ZShkZXYpOwogCQl9CiAJfQpAQCAtMTI1NSwxMyArMTI1NSwxMyBAQAogdm9pZCBJUFNMZWF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKIAlpZiAocHJpdi0+YkluYWN0aXZlUHMpIHsKIAkJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7Ci0JCWlmICgocnRTdGF0ZSA9PSBlUmZPZmYgfHwgcnRTdGF0ZSA9PSBlUmZTbGVlcCkgJiYKKwkJaWYgKChydFN0YXRlID09IFJGX09GRiB8fCBydFN0YXRlID09IFJGX1NMRUVQKSAmJgogCQkgICAgIXByaXYtPmJTd1JmUHJvY2Vzc2luZwogCQkgICAgJiYgcHJpdi0+UmZPZmZSZWFzb24gPD0gUkZfQ0hBTkdFX0JZX0lQUykgewotCQkJcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IGVSZk9uOworCQkJcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IFJGX09OOwogCQkJSW5hY3RpdmVQb3dlclNhdmUoZGV2KTsKIAkJfQogCX0KQEAgLTEzODUsMjMgKzEzODUsMjMgQEAKIAogCQkvKiBJbml0aWFsaXplIFJlZ1dpcmVsZXNzTW9kZSBpZiBpdCBpcyBub3QgYSB2YWxpZCBvbmUuCSovCiAJCWlmIChiSW52YWxpZFdpcmVsZXNzTW9kZSkKLQkJCWllZWUtPm1vZGUgPSAoV0lSRUxFU1NfTU9ERSlJbml0V2lyZWxlc3NNb2RlOworCQkJaWVlZS0+bW9kZSA9IChlbnVtIHdpcmVsZXNzX21vZGUpSW5pdFdpcmVsZXNzTW9kZTsKIAogCX0gZWxzZSB7CiAJLyogT25lIG9mIEIsIEcsIEEuICovCiAJCUluaXRXaXJlbGVzc01vZGUgPSBpZWVlLT5tb2RlOwogCX0KLQlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT2ZmOworCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBSRl9PRkY7CiAJcHJpdi0+UmZPZmZSZWFzb24gPSAwOwogCXsKLQkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCAwKTsKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIFJGX09OLCAwKTsKIAl9CiAJCS8qCiAJCSAqIElmIGluYWN0aXZlIHBvd2VyIG1vZGUgaXMgZW5hYmxlZCwgZGlzYWJsZSByZiB3aGlsZSBpbgogCQkgKiBkaXNjb25uZWN0ZWQgc3RhdGUuCiAJCSAqLwogCWlmIChwcml2LT5iSW5hY3RpdmVQcykKLQkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYgLCBlUmZPZmYsIFJGX0NIQU5HRV9CWV9JUFMpOworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiAsIFJGX09GRiwgUkZfQ0hBTkdFX0JZX0lQUyk7CiAKIAlBY3RTZXRXaXJlbGVzc01vZGU4MTg1KGRldiwgKHU4KShJbml0V2lyZWxlc3NNb2RlKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvS2NvbmZpZwppbmRleCBjOWM1NDhmLi45YTU3ZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9LY29uZmlnCkBAIC0xMiw3ICsxMiw3IEBACiAKIGNvbmZpZyA4OEVVX0FQX01PREUKIAlib29sICJSZWFsdGVrIFJUTDgxODhFVSBBUCBtb2RlIgotCWRlZmF1bHQgWQorCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAlUaGlzIG9wdGlvbiBlbmFibGVzIEFjY2VzcyBQb2ludCBtb2RlLiBVbmxlc3MgeW91IGtub3cgdGhhdCB5b3VyIHN5c3RlbQogCXdpbGwgbmV2ZXIgYmUgdXNlZCBhcyBhbiBBUCwgb3IgdGhlIHRhcmdldCBzeXN0ZW0gaGFzIGxpbWl0ZWQgbWVtb3J5LApAQCAtMjAsNyArMjAsNyBAQAogCiBjb25maWcgODhFVV9QMlAKIAlib29sICJSZWFsdGVrIFJUTDgxODhFVSBQZWVyLXRvLXBlZXIgbW9kZSIKLQlkZWZhdWx0IFkKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb24gZW5hYmxlcyBwZWVyLXRvLXBlZXIgbW9kZSBmb3IgdGhlIHI4MTg4ZXUgZHJpdmVyLiBVbmxlc3MgeW91CiAJa25vdyB0aGF0IHBlZXItdG8tcGVlciAoUDJQKSBtb2RlIHdpbGwgbmV2ZXIgYmUgdXNlZCwgb3IgdGhlIHRhcmdldCBzeXN0ZW0gaGFzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9NYWtlZmlsZQppbmRleCAwYTYxN2I0Li42YTEzOGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvTWFrZWZpbGUKQEAgLTM0LDcgKzM0LDYgQEAKIAkJaGFsL2hhbF9jb20ubwkJXAogCQloYWwvb2RtLm8JCVwKIAkJaGFsL29kbV9kZWJ1Zy5vCQlcCi0JCWhhbC9vZG1faW50ZXJmYWNlLm8JXAogCQloYWwvb2RtX0hXQ29uZmlnLm8JXAogCQloYWwvb2RtX1JlZ0NvbmZpZzgxODhFLm9cCiAJCWhhbC9vZG1fUlRMODE4OEUubwlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L1RPRE8KaW5kZXggZjdmMzg5Yy4uYjU3NGIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvVE9ETwpAQCAtOSw2ICs5LDExIEBACiAtIG1lcmdlIFJlYWx0ZWsncyBidWdmaXhlcyBhbmQgbmV3IGZlYXR1cmVzIGludG8gdGhlIGRyaXZlcgogLSBzd2l0Y2ggdG8gdXNlIExJQjgwMjExCiAtIHN3aXRjaCB0byB1c2UgTUFDODAyMTEKKy0gZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggdGhpcyBjb2RlIGluIHJ0d19yZWN2X2luZGljYXRlcGt0KCk6CisJcmN1X3JlYWRfbG9jaygpOworCXJjdV9kZXJlZmVyZW5jZShwYWRhcHRlci0+cG5ldGRldi0+cnhfaGFuZGxlcl9kYXRhKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKyAgUGVyaGFwcyBkZWxldGUgaXQsIHBlcmhhcHMgYXNzaWduIHRvIHNvbWUgbG9jYWwgdmFyaWFibGUuCiAKIFBsZWFzZSBzZW5kIGFueSBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4LmNvbT4sCiBhbmQgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0Pi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYwppbmRleCA4ZWJlNmJjLi5mZjc0ZDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCkBAIC05NCw3ICs5NCw3IEBACiAJCX0gZWxzZSB7CiAJCQl0aW1faWVsZW4gPSAwOwogCi0JCQkvKiBjYWx1Y2F0ZSBoZWFkX2xlbiAqLworCQkJLyogY2FsY3VsYXRlIGhlYWRfbGVuICovCiAJCQlvZmZzZXQgPSBfRklYRURfSUVfTEVOR1RIXzsKIAkJCW9mZnNldCArPSBwbmV0d29ya19tbG1lZXh0LT5Tc2lkLlNzaWRMZW5ndGggKyAyOwogCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJKmRzdF9pZSsrID0gdGltX2llbGVuOwogCiAJCSpkc3RfaWUrKyA9IDA7LyogRFRJTSBjb3VudCAqLwotCQkqZHN0X2llKysgPSAxOy8qIERUSU0gcGVyb2lkICovCisJCSpkc3RfaWUrKyA9IDE7LyogRFRJTSBwZXJpb2QgKi8KIAogCQlpZiAocHN0YXByaXYtPnRpbV9iaXRtYXAmQklUKDApKS8qIGZvciBiYy9tYyBmcmFtZXMgKi8KIAkJCSpkc3RfaWUrKyA9IEJJVCgwKTsvKiBiaXRtYXAgY3RybCAqLwpAQCAtMjg1LDEyICsyODUsMTIgQEAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7CiAKIAlwaGVhZCA9ICZwc3RhcHJpdi0+YXV0aF9saXN0OwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiBjaGVjayBhdXRoX3F1ZXVlICovCiAJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXV0aF9saXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXV0aF9saXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlpZiAocHN0YS0+ZXhwaXJlX3RvID4gMCkgewogCQkJcHN0YS0+ZXhwaXJlX3RvLS07CkBAIC0zMTksMTIgKzMxOSwxMiBAQAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAogCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qIGNoZWNrIGFzb2NfcXVldWUgKi8KIAl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCWlmIChjaGtfc3RhX2lzX2FsaXZlKHBzdGEpIHx8ICFwc3RhLT5leHBpcmVfdG8pIHsKIAkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87CkBAIC04MjEsNyArODIxLDcgQEAKIAkvKiB1cGRhdGUgY3VyX3dpcmVsZXNzX21vZGUgKi8KIAl1cGRhdGVfd2lyZWxlc3NfbW9kZShwYWRhcHRlcik7CiAKLQkvKiB1ZHBhdGUgY2FwYWJpbGl0eSBhZnRlciBjdXJfd2lyZWxlc3NfbW9kZSB1cGRhdGVkICovCisJLyogdXBkYXRlIGNhcGFiaWxpdHkgYWZ0ZXIgY3VyX3dpcmVsZXNzX21vZGUgdXBkYXRlZCAqLwogCXVwZGF0ZV9jYXBpbmZvKHBhZGFwdGVyLCBydHdfZ2V0X2NhcGFiaWxpdHkoKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcG5ldHdvcmspKTsKIAogCS8qIGxldCBwbmV0d29ya19tbG1lZXh0ID09IHBuZXR3b3JrX21sbWUuICovCkBAIC05ODAsNyArOTgwLDcgQEAKIAlmb3IgKHAgPSBpZSArIF9CRUFDT05fSUVfT0ZGU0VUXzs7IHAgKz0gKGllX2xlbiArIDIpKSB7CiAJCXAgPSBydHdfZ2V0X2llKHAsIF9TU05fSUVfMV8sICZpZV9sZW4sCiAJCQkgICAgICAgKHBic3NfbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8gLSAoaWVfbGVuICsgMikpKTsKLQkJaWYgKChwKSAmJiAoX3J0d19tZW1jbXAocCsyLCBPVUkxLCA0KSkpIHsKKwkJaWYgKChwKSAmJiAoIW1lbWNtcChwKzIsIE9VSTEsIDQpKSkgewogCQkJaWYgKHJ0d19wYXJzZV93cGFfaWUocCwgaWVfbGVuKzIsICZncm91cF9jaXBoZXIsCiAJCQkJCSAgICAgJnBhaXJ3aXNlX2NpcGhlciwgTlVMTCkgPT0gX1NVQ0NFU1MpIHsKIAkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV84MDIxWDsKQEAgLTEwMDUsNyArMTAwNSw3IEBACiAJCWZvciAocCA9IGllICsgX0JFQUNPTl9JRV9PRkZTRVRfOzsgcCArPSAoaWVfbGVuICsgMikpIHsKIAkJCXAgPSBydHdfZ2V0X2llKHAsIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLCAmaWVfbGVuLAogCQkJCSAgICAgICAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXyAtIChpZV9sZW4gKyAyKSkpOwotCQkJaWYgKChwKSAmJiBfcnR3X21lbWNtcChwKzIsIFdNTV9QQVJBX0lFLCA2KSkgeworCQkJaWYgKChwKSAmJiAhbWVtY21wKHArMiwgV01NX1BBUkFfSUUsIDYpKSB7CiAJCQkJcG1sbWVwcml2LT5xb3Nwcml2LnFvc19vcHRpb24gPSAxOwogCiAJCQkJKihwKzgpIHw9IEJJVCg3KTsvKiBRb1MgSW5mbywgc3VwcG9ydCBVLUFQU0QgKi8KQEAgLTExNDQsMTMgKzExNDQsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwYWNsX25vZGVfcS0+bG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBhY2xfbm9kZV9xKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7Ci0JCXBhY2xub2RlID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwYWNsbm9kZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAotCQlpZiAoX3J0d19tZW1jbXAocGFjbG5vZGUtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChwYWNsbm9kZS0+YWRkciwgYWRkciwgRVRIX0FMRU4pKSB7CiAJCQlpZiAocGFjbG5vZGUtPnZhbGlkKSB7CiAJCQkJYWRkZWQgPSB0cnVlOwogCQkJCURCR184OEUoIiVzLCBzdGEgaGFzIGJlZW4gYWRkZWRcbiIsIF9fZnVuY19fKTsKQEAgLTEyMDUsMTMgKzEyMDUsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwYWNsX25vZGVfcS0+bG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBhY2xfbm9kZV9xKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7Ci0JCXBhY2xub2RlID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwYWNsbm9kZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAotCQlpZiAoX3J0d19tZW1jbXAocGFjbG5vZGUtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChwYWNsbm9kZS0+YWRkciwgYWRkciwgRVRIX0FMRU4pKSB7CiAJCQlpZiAocGFjbG5vZGUtPnZhbGlkKSB7CiAJCQkJcGFjbG5vZGUtPnZhbGlkID0gZmFsc2U7CiAKQEAgLTEzMzksOCArMTMzOSw3IEBACiAJCXBuZXR3b3JrLT5JRUxlbmd0aCA9IHdwc19vZmZzZXQgKyAod3BzX2llbGVuKzIpICsgcmVtYWluZGVyX2llbGVuOwogCX0KIAotCWlmIChwYmFja3VwX3JlbWFpbmRlcl9pZSkKLQkJa2ZyZWUocGJhY2t1cF9yZW1haW5kZXJfaWUpOworCWtmcmVlKHBiYWNrdXBfcmVtYWluZGVyX2llKTsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2Jjbl9wMnBfaWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMTM1MSwxMyArMTM1MCwxMyBAQAogewogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoX3J0d19tZW1jbXAoUlRXX1dQQV9PVUksIG91aSwgNCkpCisJaWYgKCFtZW1jbXAoUlRXX1dQQV9PVUksIG91aSwgNCkpCiAJCXVwZGF0ZV9iY25fd3BhX2llKHBhZGFwdGVyKTsKLQllbHNlIGlmIChfcnR3X21lbWNtcChXTU1fT1VJLCBvdWksIDQpKQorCWVsc2UgaWYgKCFtZW1jbXAoV01NX09VSSwgb3VpLCA0KSkKIAkJdXBkYXRlX2Jjbl93bW1faWUocGFkYXB0ZXIpOwotCWVsc2UgaWYgKF9ydHdfbWVtY21wKFdQU19PVUksIG91aSwgNCkpCisJZWxzZSBpZiAoIW1lbWNtcChXUFNfT1VJLCBvdWksIDQpKQogCQl1cGRhdGVfYmNuX3dwc19pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoX3J0d19tZW1jbXAoUDJQX09VSSwgb3VpLCA0KSkKKwllbHNlIGlmICghbWVtY21wKFAyUF9PVUksIG91aSwgNCkpCiAJCXVwZGF0ZV9iY25fcDJwX2llKHBhZGFwdGVyKTsKIAllbHNlCiAJCURCR184OEUoInVua25vd24gT1VJIHR5cGUhXG4iKTsKQEAgLTE0MTUsNyArMTQxNCw3IEBACiAKIC8qCiBvcF9tb2RlCi1TZXQgdG8gMCAoSFQgcHVyZSkgdW5kZXIgdGhlIGZvbGxvd2lnbiBjb25kaXRpb25zCitTZXQgdG8gMCAoSFQgcHVyZSkgdW5kZXIgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAJLSBhbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQgaW4gMjAvNDAgTUh6IEJTUyBvcgogCS0gYWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAgTUh6IEhUIGluIDIwIE1IeiBCU1MKIFNldCB0byAxIChIVCBub24tbWVtYmVyIHByb3RlY3Rpb24pIGlmIHRoZXJlIG1heSBiZSBub24tSFQgU1RBcwpAQCAtMTQ5NCw3ICsxNDkzLDcgQEAKIAogdm9pZCBhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggdXBkYXRlZCkKIHsKLQkvKiB1cGRhdGUgYXNzb2NpY2F0ZWQgc3RhdGlvbnMgY2FwLiAqLworCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KIAlpZiAodXBkYXRlZCkgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwogCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwpAQCAtMTUwMywxMyArMTUwMiwxMyBAQAogCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAKIAkJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJLyogY2hlY2sgYXNvY19xdWV1ZSAqLwogCQl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKIAotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQlWQ1NfdXBkYXRlKHBhZGFwdGVyLCBwc3RhKTsKIAkJfQpAQCAtMTY0Nyw3ICsxNjQ2LDcgQEAKIAkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX0hUX0FERF9JTkZPX0lFXywgTlVMTCwgdHJ1ZSk7CiAJfQogCi0JLyogdXBkYXRlIGFzc29jaWNhdGVkIHN0YXRpb25zIGNhcC4gKi8KKwkvKiB1cGRhdGUgYXNzb2NpYXRlZCBzdGF0aW9ucyBjYXAuICovCiAJYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZShwYWRhcHRlciwgIGJlYWNvbl91cGRhdGVkKTsKIAogCURCR184OEUoIiVzLCB1cGRhdGVkID0lZFxuIiwgX19mdW5jX18sIGJlYWNvbl91cGRhdGVkKTsKQEAgLTE3MTEsNyArMTcxMCw3IEBACiAJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9IVF9BRERfSU5GT19JRV8sIE5VTEwsIHRydWUpOwogCX0KIAotCS8qIHVwZGF0ZSBhc3NvY2ljYXRlZCBzdGF0aW9ucyBjYXAuICovCisJLyogdXBkYXRlIGFzc29jaWF0ZWQgc3RhdGlvbnMgY2FwLiAqLwogCiAJREJHXzg4RSgiJXMsIHVwZGF0ZWQgPSVkXG4iLCBfX2Z1bmNfXywgYmVhY29uX3VwZGF0ZWQpOwogCkBAIC0xNzc3LDEyICsxNzc2LDEyIEBACiAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogZm9yIGVhY2ggc3RhIGluIGFzb2NfcXVldWUgKi8KIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJaXNzdWVfYWN0aW9uX3NwY3RfY2hfc3dpdGNoKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIG5ld19jaCwgY2hfb2Zmc2V0KTsKIAkJcHN0YS0+ZXhwaXJlX3RvID0gKChwc3RhcHJpdi0+ZXhwaXJlX3RvICogMikgPiA1KSA/IDUgOiAocHN0YXByaXYtPmV4cGlyZV90byAqIDIpOwpAQCAtMTgxMSwxMyArMTgxMCwxMyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qIGZyZWUgc3RhIGFzb2NfcXVldWUgKi8KIAl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCZwc3RhLT5hc29jX2xpc3QpOwogCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwpAQCAtMTk0MiwxMCArMTk0MSwxMCBAQAogCS8qIGZvciBBQ0wgKi8KIAlzcGluX2xvY2tfYmgoJihwYWNsX25vZGVfcS0+bG9jaykpOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCXBhY2xub2RlID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwYWNsbm9kZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlpZiAocGFjbG5vZGUtPnZhbGlkKSB7CiAJCQlwYWNsbm9kZS0+dmFsaWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYnJfZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2JyX2V4dC5jCmluZGV4IDc1ZTM4ZDQuLmU4NDNjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYnJfZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19icl9leHQuYwpAQCAtNDA5LDcgKzQwOSw3IEBACiAJZGIgPSBwcml2LT5uZXRoYXNoW2hhc2hdOwogCXdoaWxlIChkYiAhPSBOVUxMKSB7CiAJCWlmICghbWVtY21wKGRiLT5uZXR3b3JrQWRkciwgbmV0d29ya0FkZHIsIE1BWF9ORVRXT1JLX0FERFJfTEVOKSkgewotCQkJbWVtY3B5KGRiLT5tYWNBZGRyLCBtYWNBZGRyLCBFVEhfQUxFTik7CisJCQlldGhlcl9hZGRyX2NvcHkoZGItPm1hY0FkZHIsIG1hY0FkZHIpOwogCQkJZGItPmFnZWluZ190aW1lciA9IGppZmZpZXM7CiAJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+YnJfZXh0X2xvY2spOwogCQkJcmV0dXJuOwpAQCAtNDIyLDcgKzQyMiw3IEBACiAJCXJldHVybjsKIAl9CiAJbWVtY3B5KGRiLT5uZXR3b3JrQWRkciwgbmV0d29ya0FkZHIsIE1BWF9ORVRXT1JLX0FERFJfTEVOKTsKLQltZW1jcHkoZGItPm1hY0FkZHIsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoZGItPm1hY0FkZHIsIG1hY0FkZHIpOwogCWF0b21pY19zZXQoJmRiLT51c2VfY291bnQsIDEpOwogCWRiLT5hZ2VpbmdfdGltZXIgPSBqaWZmaWVzOwogCkBAIC01NDMsMTMgKzU0MywxNCBAQAogCQkJaWYgKCFfX25hdDI1X2RiX25ldHdvcmtfbG9va3VwX2FuZF9yZXBsYWNlKHByaXYsIHNrYiwgbmV0d29ya0FkZHIpKSB7CiAJCQkJaWYgKCooKHVuc2lnbmVkIGNoYXIgKikmaXBoLT5kYWRkciArIDMpID09IDB4ZmYpIHsKIAkJCQkJLyogIEwyIGlzIHVuaWNhc3QgYnV0IEwzIGlzIGJyb2FkY2FzdCwgbWFrZSBMMiBiYWNvbWUgYnJvYWRjYXN0ICovCi0JCQkJCURFQlVHX0lORk8oIk5BVDI1OiBTZXQgREEgYXMgYm9hcmRjYXN0XG4iKTsKKwkJCQkJREVCVUdfSU5GTygiTkFUMjU6IFNldCBEQSBhcyBicm9hZGNhc3RcbiIpOwogCQkJCQltZW1zZXQoc2tiLT5kYXRhLCAweGZmLCBFVEhfQUxFTik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJLyogIGZvcndhcmQgdW5rbm93IElQIHBhY2tldCB0byB1cHBlciBUQ1AvSVAgKi8KKwkJCQkJLyogIGZvcndhcmQgdW5rbm93biBJUCBwYWNrZXQgdG8gdXBwZXIgVENQL0lQICovCiAJCQkJCURFQlVHX0lORk8oIk5BVDI1OiBSZXBsYWNlIERBIHdpdGggQlIncyBNQUNcbiIpOwogCQkJCQlpZiAoKCoodTMyICopcHJpdi0+YnJfbWFjKSA9PSAwICYmICgqKHUxNiAqKShwcml2LT5icl9tYWMrNCkpID09IDApIHsKLQkJCQkJCXByaW50aygiUmUtaW5pdCBuZXRkZXZfYnJfaW5pdCgpIGR1ZSB0byBicl9tYWMgPT0gMCFcbiIpOworCQkJCQkJbmV0ZGV2X2luZm8oc2tiLT5kZXYsCisJCQkJCQkJCSJSZS1pbml0IG5ldGRldl9icl9pbml0KCkgZHVlIHRvIGJyX21hYyA9PSAwIVxuIik7CiAJCQkJCQluZXRkZXZfYnJfaW5pdChwcml2LT5wbmV0ZGV2KTsKIAkJCQkJfQogCQkJCQltZW1jcHkoc2tiLT5kYXRhLCBwcml2LT5icl9tYWMsIEVUSF9BTEVOKTsKQEAgLTkzMiw3ICs5MzMsNyBAQAogCQkJCQkJKHBoLT5jb2RlID09IFBBRE9fQ09ERSA/ICJQQURPIiA6ICJQQURTIiksCXNrYi0+ZGV2LT5uYW1lKTsKIAkJCQl9IGVsc2UgeyAvKiAgbm90IGFkZCByZWxheSB0YWcgKi8KIAkJCQkJaWYgKCFwcml2LT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzKSB7Ci0JCQkJCQlERUJVR19FUlIoIkRpc2NhcmQgUFBQb0UgcGFja2V0IGR1ZSB0byBubyBjb25uZWN0aW9uIGluIHByb2dyZXNzcyFcbiIpOworCQkJCQkJREVCVUdfRVJSKCJEaXNjYXJkIFBQUG9FIHBhY2tldCBkdWUgdG8gbm8gY29ubmVjdGlvbiBpbiBwcm9ncmVzcyFcbiIpOwogCQkJCQkJcmV0dXJuIC0xOwogCQkJCQl9CiAJCQkJCW1lbWNweShza2ItPmRhdGEsIHByaXYtPnBwcG9lX2FkZHIsIEVUSF9BTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCmluZGV4IDgyZmU4YzQuLmMyZmIwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYwpAQCAtMzIsMTEgKzMyLDEwIEBACiBObyBpcnFzYXZlIGlzIG5lY2Vzc2FyeS4KICovCiAKLWludAlfcnR3X2luaXRfY21kX3ByaXYgKHN0cnVjdAljbWRfcHJpdiAqcGNtZHByaXYpCitpbnQgX3J0d19pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlzZW1hX2luaXQoJihwY21kcHJpdi0+Y21kX3F1ZXVlX3NlbWEpLCAwKTsKIAkvKiBzZW1hX2luaXQoJihwY21kcHJpdi0+Y21kX2RvbmVfc2VtYSksIDApOyAqLwpAQCAtNzEsNyArNzAsNiBAQAogCXBjbWRwcml2LT5jbWRfZG9uZV9jbnQgPSAwOwogCXBjbWRwcml2LT5yc3BfY250ID0gMDsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC04MSwyNCArNzksMjEgQEAKIHsKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCS8qIGFsbG9jYXRlIERNQS1hYmxlL05vbi1QYWdlIG1lbW9yeSBmb3IgY21kX2J1ZiBhbmQgcnNwX2J1ZiAqLwogCWF0b21pY19zZXQoJnBldnRwcml2LT5ldmVudF9zZXEsIDApOwogCXBldnRwcml2LT5ldnRfZG9uZV9jbnQgPSAwOwogCi0JX2luaXRfd29ya2l0ZW0oJnBldnRwcml2LT5jMmhfd2ssIGMyaF93a19jYWxsYmFjaywgTlVMTCk7CisJSU5JVF9XT1JLKCZwZXZ0cHJpdi0+YzJoX3drLCBjMmhfd2tfY2FsbGJhY2spOwogCXBldnRwcml2LT5jMmhfd2tfYWxpdmUgPSBmYWxzZTsKIAlwZXZ0cHJpdi0+YzJoX3F1ZXVlID0gcnR3X2NidWZfYWxsb2MoQzJIX1FVRVVFX01BWF9MRU4rMSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KIAotdm9pZCBydHdfZnJlZV9ldnRfcHJpdihzdHJ1Y3QJZXZ0X3ByaXYgKnBldnRwcml2KQordm9pZCBydHdfZnJlZV9ldnRfcHJpdihzdHJ1Y3QgZXZ0X3ByaXYgKnBldnRwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywgKCIrcnR3X2ZyZWVfZXZ0X3ByaXZcbiIpKTsKIApAQCAtMTEzLDIxICsxMDgsMTUgQEAKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywgKCItcnR3X2ZyZWVfZXZ0X3ByaXZcbiIpKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKLXZvaWQgX3J0d19mcmVlX2NtZF9wcml2IChzdHJ1Y3QJY21kX3ByaXYgKnBjbWRwcml2KQordm9pZCBfcnR3X2ZyZWVfY21kX3ByaXYoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwY21kcHJpdikgewotCQlpZiAocGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmKQotCQkJa2ZyZWUocGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmKTsKLQotCQlpZiAocGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmKQotCQkJa2ZyZWUocGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmKTsKKwkJa2ZyZWUocGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmKTsKKwkJa2ZyZWUocGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmKTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTE0MCwxMSArMTI5LDEwIEBACiAKICovCiAKLWludAlfcnR3X2VucXVldWVfY21kKHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGNtZF9vYmogKm9iaikKK2ludCBfcnR3X2VucXVldWVfY21kKHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGNtZF9vYmogKm9iaikKIHsKIAl1bnNpZ25lZCBsb25nIGlycUw7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChvYmogPT0gTlVMTCkKIAkJZ290byBleGl0OwpAQCAtMTU3LDcgKzE0NSw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTY3LDQ3ICsxNTQsMzkgQEAKIAl1bnNpZ25lZCBsb25nIGlycUw7CiAJc3RydWN0IGNtZF9vYmogKm9iajsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKIAlpZiAocnR3X2lzX2xpc3RfZW1wdHkoJihxdWV1ZS0+cXVldWUpKSkgewogCQlvYmogPSBOVUxMOwogCX0gZWxzZSB7Ci0JCW9iaiA9IExJU1RfQ09OVEFJTk9SKGdldF9uZXh0KCYocXVldWUtPnF1ZXVlKSksIHN0cnVjdCBjbWRfb2JqLCBsaXN0KTsKKwkJb2JqID0gY29udGFpbmVyX29mKCgmcXVldWUtPnF1ZXVlKS0+bmV4dCwgc3RydWN0IGNtZF9vYmosIGxpc3QpOwogCQlydHdfbGlzdF9kZWxldGUoJm9iai0+bGlzdCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGlycUwpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBvYmo7CiB9CiAKLXUzMglydHdfaW5pdF9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQordTMyIHJ0d19pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7CiAJdTMyCXJlczsKLV9mdW5jX2VudGVyXzsKLQlyZXMgPSBfcnR3X2luaXRfY21kX3ByaXYgKHBjbWRwcml2KTsKLV9mdW5jX2V4aXRfOworCXJlcyA9IF9ydHdfaW5pdF9jbWRfcHJpdihwY21kcHJpdik7CiAJcmV0dXJuIHJlczsKIH0KIAotdTMyCXJ0d19pbml0X2V2dF9wcml2IChzdHJ1Y3QJZXZ0X3ByaXYgKnBldnRwcml2KQordTMyIHJ0d19pbml0X2V2dF9wcml2KHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpCiB7Ci0JaW50CXJlczsKLV9mdW5jX2VudGVyXzsKKwlpbnQgcmVzOwogCXJlcyA9IF9ydHdfaW5pdF9ldnRfcHJpdihwZXZ0cHJpdik7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCi12b2lkIHJ0d19mcmVlX2NtZF9wcml2KHN0cnVjdAljbWRfcHJpdiAqcGNtZHByaXYpCit2b2lkIHJ0d19mcmVlX2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywgKCJydHdfZnJlZV9jbWRfcHJpdlxuIikpOwogCV9ydHdfZnJlZV9jbWRfcHJpdihwY21kcHJpdik7Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIGludCBydHdfY21kX2ZpbHRlcihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2LCBzdHJ1Y3QgY21kX29iaiAqY21kX29iaikKQEAgLTIzOCw3ICsyMTcsNiBAQAogCWludCByZXMgPSBfRkFJTDsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwY21kcHJpdi0+cGFkYXB0ZXI7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChjbWRfb2JqID09IE5VTEwpCiAJCWdvdG8gZXhpdDsKQEAgLTI1OCwzNCArMjM2LDI4IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KIAotc3RydWN0CWNtZF9vYmoJKnJ0d19kZXF1ZXVlX2NtZChzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQorc3RydWN0IGNtZF9vYmoJKnJ0d19kZXF1ZXVlX2NtZChzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewogCXN0cnVjdCBjbWRfb2JqICpjbWRfb2JqOwogCi1fZnVuY19lbnRlcl87CiAKIAljbWRfb2JqID0gX3J0d19kZXF1ZXVlX2NtZCgmcGNtZHByaXYtPmNtZF9xdWV1ZSk7CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiBjbWRfb2JqOwogfQogCi12b2lkIHJ0d19jbWRfY2xyX2lzcihzdHJ1Y3QJY21kX3ByaXYgKnBjbWRwcml2KQordm9pZCBydHdfY21kX2Nscl9pc3Ioc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAlwY21kcHJpdi0+Y21kX2RvbmVfY250Kys7CiAJLyogdXAoJihwY21kcHJpdi0+Y21kX2RvbmVfc2VtYSkpOyAqLwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2ZyZWVfY21kX29iaihzdHJ1Y3QgY21kX29iaiAqcGNtZCkKIHsKLV9mdW5jX2VudGVyXzsKIAogCWlmICgocGNtZC0+Y21kY29kZSAhPSBfSm9pbkJzc19DTURfKSAmJiAocGNtZC0+Y21kY29kZSAhPSBfQ3JlYXRlQnNzX0NNRF8pKSB7CiAJCS8qIGZyZWUgcGFybWJ1ZiBpbiBjbWRfb2JqICovCkBAIC0zMDIsNyArMjc0LDYgQEAKIAkvKiBmcmVlIGNtZF9vYmogKi8KIAlrZnJlZShwY21kKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIGludCBydHdfY21kX3RocmVhZCh2b2lkICpjb250ZXh0KQpAQCAtMzE1LDcgKzI4Niw2IEBACiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopY29udGV4dDsKIAlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJihwYWRhcHRlci0+Y21kcHJpdik7CiAKLV9mdW5jX2VudGVyXzsKIAogCXRocmVhZF9lbnRlcigiUlRXX0NNRF9USFJFQUQiKTsKIApAQCAtNDEwLDcgKzM4MCw2IEBACiAKIAl1cCgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJY29tcGxldGVfYW5kX2V4aXQoTlVMTCwgMCk7CiB9CkBAIC00MjMsMTUgKzM5MiwxNCBAQAogCiAJdTggcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAotCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKKwlwaDJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfS0VSTkVMKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JcHNldHVzYnN1c3BlbmQgPSAoc3RydWN0IHVzYl9zdXNwZW5kX3Bhcm0gKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zdXNwZW5kX3Bhcm0pKTsKKwlwc2V0dXNic3VzcGVuZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc3VzcGVuZF9wYXJtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBzZXR1c2JzdXNwZW5kID09IE5VTEwpIHsKIAkJa2ZyZWUocGgyYyk7CiAJCXJldCA9IF9GQUlMOwpAQCAtNDQ2LDcgKzQxNCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ2NSwxNCArNDMyLDExIEBACiAJc3RydWN0IGNtZF9wcml2CQkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkgeworCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkKIAkJcnR3X2xwc19jdHJsX3drX2NtZChwYWRhcHRlciwgTFBTX0NUUkxfU0NBTiwgMSk7Ci0JfQogCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlKSB7CisJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlKQogCQlwMnBfcHNfd2tfY21kKHBhZGFwdGVyLCBQMlBfUFNfU0NBTiwgMSk7Ci0JfQogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpCkBAIC01MDAsOSArNDY0LDYgQEAKIAkJCWlmIChzc2lkW2ldLlNzaWRMZW5ndGgpIHsKIAkJCQltZW1jcHkoJnBzdXJ2ZXlQYXJhLT5zc2lkW2ldLCAmc3NpZFtpXSwgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSk7CiAJCQkJcHN1cnZleVBhcmEtPnNzaWRfbnVtKys7Ci0JCQkJaWYgKDApCi0JCQkJREJHXzg4RShGVU5DX0FEUFRfRk1UIiBzc2lkOiglcywgJWQpXG4iLCBGVU5DX0FEUFRfQVJHKHBhZGFwdGVyKSwKLQkJCQkJcHN1cnZleVBhcmEtPnNzaWRbaV0uU3NpZCwgcHN1cnZleVBhcmEtPnNzaWRbaV0uU3NpZExlbmd0aCk7CiAJCQl9CiAJCX0KIAl9CkBAIC01MTQsOSArNDc1LDYgQEAKIAkJCWlmIChjaFtpXS5od192YWx1ZSAmJiAhKGNoW2ldLmZsYWdzICYgUlRXX0lFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkgewogCQkJCW1lbWNweSgmcHN1cnZleVBhcmEtPmNoW2ldLCAmY2hbaV0sIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7CiAJCQkJcHN1cnZleVBhcmEtPmNoX251bSsrOwotCQkJCWlmICgwKQotCQkJCURCR184OEUoRlVOQ19BRFBUX0ZNVCIgY2g6JXVcbiIsIEZVTkNfQURQVF9BUkcocGFkYXB0ZXIpLAotCQkJCQlwc3VydmV5UGFyYS0+Y2hbaV0uaHdfdmFsdWUpOwogCQkJfQogCQl9CiAJfQpAQCAtNTM3LDcgKzQ5NSw2IEBACiAJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTU0OSw3ICs1MDYsNiBAQAogCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC01NzAsNyArNTI2LDYgQEAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNTgyLDcgKzUzNyw2IEBACiAJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTYwNCw3ICs1NTgsNiBAQAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC02MjQsNyArNTc3LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtNjQ4LDcgKzYwMCw2IEBACiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTY1OSw3ICs2MTAsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKQEAgLTY4MCw3ICs2MzAsNiBAQAogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC02OTEsNyArNjQwLDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC03MTUsNyArNjYzLDYgQEAKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNzI1LDcgKzY3Miw2IEBACiAJc3RydWN0IHdyaXRlUkZfcGFybSAqcHdyaXRlcmZwYXJtOwogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC03NDYsNyArNjkyLDYgQEAKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNzU3LDcgKzcwMiw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTc4NSwzMyArNzI5LDI4IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KIAogdm9pZCBydHdfZ2V0YmJyZnJlZ19jbWRyc3BfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7Ci0gX2Z1bmNfZW50ZXJfOwogCiAJa2ZyZWUocGNtZC0+cGFybWJ1Zik7CiAJa2ZyZWUocGNtZCk7CiAKIAlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDEpCiAJCXBhZGFwdGVyLT5tcHByaXYud29ya3BhcmFtLmJjb21wbGV0ZWQgPSB0cnVlOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3JlYWR0c3NpX2NtZHJzcF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKIHsKLSBfZnVuY19lbnRlcl87CiAKIAlrZnJlZShwY21kLT5wYXJtYnVmKTsKIAlrZnJlZShwY21kKTsKIAogCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1wX21vZGUgPT0gMSkKIAkJcGFkYXB0ZXItPm1wcHJpdi53b3JrcGFyYW0uYmNvbXBsZXRlZCA9IHRydWU7Ci1fZnVuY19leGl0XzsKIH0KIAogdTggcnR3X2NyZWF0ZWJzc19jbWQoc3RydWN0IGFkYXB0ZXIgICpwYWRhcHRlcikKQEAgLTgyMiw3ICs3NjEsNiBAQAogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcmsgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yazsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcnR3X2xlZF9jb250cm9sKHBhZGFwdGVyLCBMRURfQ1RMX1NUQVJUX1RPX0xJTkspOwogCkBAIC04NDcsNyArNzg1LDYgQEAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBjbWQpOwogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtODU4LDcgKzc5NSw2IEBACiAJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGNtZCA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwY21kID09IE5VTEwpIHsKQEAgLTg3Nyw3ICs4MTMsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC04OTgsMTUgKzgzMywxMyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcnR3X2xlZF9jb250cm9sKHBhZGFwdGVyLCBMRURfQ1RMX1NUQVJUX1RPX0xJTkspOwogCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoID09IDApIHsKKwlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGggPT0gMCkKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywgKCIrSm9pbiBjbWQ6IEFueSBTU2lkXG4iKSk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywgKCIrSm9pbiBjbWQ6IFNTaWQgPVslc11cbiIsIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkKSk7Ci0JfQogCiAJcGNtZCA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwY21kID09IE5VTEwpIHsKQEAgLTk1MiwxMSArODg1LDEwIEBACiAKIAlwc2VjdXJpdHlwcml2LT5hdXRoZW50aWNhdG9yX2llWzBdID0gKHVuc2lnbmVkIGNoYXIpcHNlY25ldHdvcmstPklFTGVuZ3RoOwogCi0JaWYgKChwc2VjbmV0d29yay0+SUVMZW5ndGgtMTIpIDwgKDI1Ni0xKSkgeworCWlmICgocHNlY25ldHdvcmstPklFTGVuZ3RoLTEyKSA8ICgyNTYtMSkpCiAJCW1lbWNweSgmcHNlY3VyaXR5cHJpdi0+YXV0aGVudGljYXRvcl9pZVsxXSwgJnBzZWNuZXR3b3JrLT5JRXNbMTJdLCBwc2VjbmV0d29yay0+SUVMZW5ndGgtMTIpOwotCX0gZWxzZSB7CisJZWxzZQogCQltZW1jcHkoJnBzZWN1cml0eXByaXYtPmF1dGhlbnRpY2F0b3JfaWVbMV0sICZwc2VjbmV0d29yay0+SUVzWzEyXSwgKDI1Ni0xKSk7Ci0JfQogCiAJcHNlY25ldHdvcmstPklFTGVuZ3RoID0gMDsKIAkvKiAgQWRkZWQgYnkgQWxiZXJ0IDIwMDkvMDIvMTggKi8KQEAgLTk4Nyw5ICs5MTksMTIgQEAKIAogCXBodHByaXYtPmh0X29wdGlvbiA9IGZhbHNlOwogCWlmIChwcmVnaXN0cnlwcml2LT5odF9lbmFibGUpIHsKLQkJLyogCUFkZGVkIGJ5IEFsYmVydCAyMDEwLzA2LzIzICovCi0JCS8qIAlGb3IgdGhlIFdFUCBtb2RlLCB3ZSB3aWxsIHVzZSB0aGUgYmcgbW9kZSB0byBkbyB0aGUgY29ubmVjdGlvbiB0byBhdm9pZCBzb21lIElPVCBpc3N1ZS4gKi8KLQkJLyogCUVzcGVjaWFsbHkgZm9yIFJlYWx0ZWsgODE5MnUgU29mdEFQLiAqLworCQkvKgorCQkgKiBBZGRlZCBieSBBbGJlcnQgMjAxMC8wNi8yMworCQkgKiBGb3IgdGhlIFdFUCBtb2RlLCB3ZSB3aWxsIHVzZSB0aGUgYmcgbW9kZSB0byBkbworCQkgKiB0aGUgY29ubmVjdGlvbiB0byBhdm9pZCBzb21lIElPVCBpc3N1ZS4KKwkJICogRXNwZWNpYWxseSBmb3IgUmVhbHRlayA4MTkydSBTb2Z0QVAuCisJCSAqLwogCQlpZiAoKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPSBfV0VQNDBfKSAmJgogCQkgICAgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPSBfV0VQMTA0XykgJiYKIAkJICAgIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0gX1RLSVBfKSkgewpAQCAtMTAyMCw3ICs5NTUsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDMyLDcgKzk2Niw2IEBACiAJc3RydWN0IGNtZF9wcml2ICpjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4IHJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sICgiK3J0d19kaXNhc3NvY19jbWRcbiIpKTsKIApAQCAtMTA2Myw3ICs5OTYsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDc2LDcgKzEwMDgsNiBAQAogCXN0cnVjdAljbWRfcHJpdiAgICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTEwOTgsNyArMTAyOSw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTExMTUsNyArMTA0NSw2IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopcHN0YTsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTExNDIsNyArMTA3MSw3IEBACiAJcGgyYy0+cnNwID0gKHU4ICopcHNldHN0YWtleV9yc3A7CiAJcGgyYy0+cnNwc3ogPSBzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcnNwKTsKIAotCW1lbWNweShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIpOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKQogCQlwc2V0c3Rha2V5X3BhcmEtPmFsZ29yaXRobSA9ICh1bnNpZ25lZCBjaGFyKSBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtOwpAQCAtMTE2MSw3ICsxMDkwLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTE3NSw3ICsxMTAzLDYgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKilwc3RhOwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoIWVucXVldWUpIHsKIAkJY2xlYXJfY2FtX2VudHJ5KHBhZGFwdGVyLCBlbnRyeSk7CkBAIC0xMjA1LDcgKzExMzIsNyBAQAogCQlwaDJjLT5yc3AgPSAodTggKilwc2V0c3Rha2V5X3JzcDsKIAkJcGgyYy0+cnNwc3ogPSBzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcnNwKTsKIAotCQltZW1jcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkciwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkcik7CiAKIAkJcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPSBfTk9fUFJJVkFDWV87CiAKQEAgLTEyMTUsNyArMTE0Miw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTIyNiw3ICsxMTUyLDYgQEAKIAlzdHJ1Y3Qgc2V0cmF0YWJsZV9wYXJtICpwc2V0cnR0YmxwYXJtOwogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTI0Nyw3ICsxMTcyLDYgQEAKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTI1Nyw3ICsxMTgxLDYgQEAKIAlzdHJ1Y3QgZ2V0cmF0YWJsZV9wYXJtICpwZ2V0cnR0YmxwYXJtOwogCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTI3Miw4ICsxMTk1LDYgQEAKIAkJZ290byBleGl0OwogCX0KIAotLyogCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRydHRibHBhcm0sIEdFTl9DTURfQ09ERShfU2V0UmFUYWJsZSkpOyAqLwotCiAJX3J0d19pbml0X2xpc3RoZWFkKCZwaDJjLT5saXN0KTsKIAlwaDJjLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9HZXRSYVRhYmxlKTsKIAlwaDJjLT5wYXJtYnVmID0gKHVuc2lnbmVkIGNoYXIgKilwZ2V0cnR0YmxwYXJtOwpAQCAtMTI4NSw3ICsxMjA2LDYgQEAKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTI5OCw3ICsxMjE4LDYgQEAKIAogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTMyNCwxNiArMTI0MywxNSBAQAogCXBoMmMtPnJzcCA9ICh1OCAqKXBzZXRhc3NvY3N0YV9yc3A7CiAJcGgyYy0+cnNwc3ogPSBzaXplb2Yoc3RydWN0IHNldF9hc3NvY3N0YV9yc3ApOwogCi0JbWVtY3B5KHBzZXRhc3NvY3N0YV9wYXJhLT5hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwc2V0YXNzb2NzdGFfcGFyYS0+YWRkciwgbWFjX2FkZHIpOwogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwotIH0KK30KIAogdTggcnR3X2FkZGJhcmVxX2NtZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHRpZCwgdTggKmFkZHIpCiB7CkBAIC0xMzQyLDcgKzEyNjAsNiBAQAogCXN0cnVjdCBhZGRCYVJlcV9wYXJtICpwYWRkYmFyZXFfcGFybTsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTEzNjksNyArMTI4Niw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEzODEsNyArMTI5Nyw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTE0MDYsNyArMTMyMSw2IEBACiAJLyogcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsgKi8KIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE0MTgsNyArMTMzMiw2IEBACiAKIAl1OCByZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RShGVU5DX05ERVZfRk1UIiBjaDoldSwgYnc6JXUsIGNoX29mZnNldDoldVxuIiwKIAkJRlVOQ19OREVWX0FSRyhwYWRhcHRlci0+cG5ldGRldiksIGNoLCBidywgY2hfb2Zmc2V0KTsKQEAgLTE0NjAsNyArMTM3Myw2IEBACiAKIAlEQkdfODhFKEZVTkNfTkRFVl9GTVQiIHJlczoldVxuIiwgRlVOQ19OREVWX0FSRyhwYWRhcHRlci0+cG5ldGRldiksIHJlcyk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE0NzMsNyArMTM4NSw2IEBACiAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLCAoIitydHdfc2V0X2NocGxhbl9jbWRcbiIpKTsKIApAQCAtMTUxNiw3ICsxNDI3LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTUyOSw3ICsxNDM5LDYgQEAKIAogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sICgiK3J0d19sZWRfYmxpbmtfY21kXG4iKSk7CiAKQEAgLTE1NTMsNyArMTQ2Miw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE1NjYsNyArMTQ3NCw2IEBACiAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLCAoIitydHdfc2V0X2NzYV9jbWRcbiIpKTsKIApAQCAtMTU5MCw3ICsxNDk3LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTY4NSw3ICsxNTkxLDYgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmKHBhZGFwdGVyLT5tbG1lcHJpdik7CiAJdTgJbXN0YXR1czsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpID09IHRydWUpIHx8CiAJICAgIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgPT0gdHJ1ZSkpCkBAIC0xNzI0LDcgKzE2MjksNiBAQAogCQlicmVhazsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiB1OCBydHdfbHBzX2N0cmxfd2tfY21kKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggbHBzX2N0cmxfdHlwZSwgdTggZW5xdWV1ZSkKQEAgLTE3MzUsMTEgKzE2MzksNiBAQAogCS8qIHN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsgKi8KIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwotCi0JLyogaWYgKCFwd3JjdHJscHJpdi0+YkxlaXN1cmVQcykgKi8KLQkvKiAJcmV0dXJuIHJlczsgKi8KLQogCWlmIChlbnF1ZXVlKSB7CiAJCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAkJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTc2Nyw3ICsxNjY2LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTc4NSw3ICsxNjgzLDYgQEAKIAogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC0xODA2LDcgKzE3MDMsNiBAQAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xODI0LDcgKzE3MjAsNiBAQAogCXU4CXN1cHBvcnRfYW50X2RpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCXJ0d19oYWxfZ2V0X2RlZl92YXIocGFkYXB0ZXIsIEhBTF9ERUZfSVNfU1VQUE9SVF9BTlRfRElWLCAmc3VwcG9ydF9hbnRfZGl2KTsKIAlpZiAoIXN1cHBvcnRfYW50X2RpdikKIAkJcmV0dXJuIHJlczsKQEAgLTE4NTQsNyArMTc0OSw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTg3Myw3ICsxNzY3LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX05PTkUpKQogCQlyZXR1cm4gcmVzOwpAQCAtMTg5Miw4ICsxNzg1LDggQEAKIAl9CiAKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gUDJQX1BST1RPX1dLX0NJRDsKLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IGludENtZFR5cGU7CS8qIAlBcyB0aGUgY29tbWFuZCB0cHBlLiAqLwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7CQkvKiAJTXVzdCBiZSBOVUxMIGhlcmUgKi8KKwlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IGludENtZFR5cGU7IC8qIEFzIHRoZSBjb21tYW5kIHRwcGUuICovCisJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsJICAgIC8qIE11c3QgYmUgTlVMTCBoZXJlICovCiAKIAlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwogCkBAIC0xOTAxLDcgKzE3OTQsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xOTE0LDcgKzE4MDYsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCXBwc2NtZCA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwcHNjbWQgPT0gTlVMTCkgewpAQCAtMTkzNyw3ICsxODI4LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjA4NCwxMiArMTk3NCwxNiBAQAogCWV2dHByaXYtPmMyaF93a19hbGl2ZSA9IHRydWU7CiAKIAl3aGlsZSAoIXJ0d19jYnVmX2VtcHR5KGV2dHByaXYtPmMyaF9xdWV1ZSkpIHsKLQkJaWYgKChjMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKXJ0d19jYnVmX3BvcChldnRwcml2LT5jMmhfcXVldWUpKSAhPSBOVUxMKSB7CisJCWMyaF9ldnQgPSAoc3RydWN0IGMyaF9ldnRfaGRyICopCisJCQlydHdfY2J1Zl9wb3AoZXZ0cHJpdi0+YzJoX3F1ZXVlKTsKKwkJaWYgKGMyaF9ldnQgIT0gTlVMTCkKIAkJCS8qIFRoaXMgQzJIIGV2ZW50IGlzIHJlYWQsIGNsZWFyIGl0ICovCiAJCQljMmhfZXZ0X2NsZWFyKGFkYXB0ZXIpOwotCQl9IGVsc2UgaWYgKChjMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKXJ0d19tYWxsb2MoMTYpKSAhPSBOVUxMKSB7CisJCWVsc2UgeworCQkJYzJoX2V2dCA9IChzdHJ1Y3QgYzJoX2V2dF9oZHIgKilydHdfbWFsbG9jKDE2KTsKIAkJCS8qIFRoaXMgQzJIIGV2ZW50IGlzIG5vdCByZWFkLCByZWFkICYgY2xlYXIgbm93ICovCi0JCQlpZiAoYzJoX2V2dF9yZWFkKGFkYXB0ZXIsICh1OCAqKWMyaF9ldnQpICE9IF9TVUNDRVNTKQorCQkJaWYgKGMyaF9ldnQgIT0gTlVMTCAmJgorCQkJICAgIGMyaF9ldnRfcmVhZChhZGFwdGVyLCAodTggKiljMmhfZXZ0KSAhPSBfU1VDQ0VTUykKIAkJCQljb250aW51ZTsKIAkJfQogCkBAIC0yMTQ3LDggKzIwNDEsMTAgQEAKIAkJcDJwX3BzX3drX2hkbChwYWRhcHRlciwgcGRydmV4dHJhX2NtZC0+dHlwZV9zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBQMlBfUFJPVE9fV0tfQ0lEOgotCQkvKiAJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExLzA3LzAxICovCi0JCS8qIAlJIHVzZWQgdGhlIHR5cGVfc2l6ZSBhcyB0aGUgdHlwZSBjb21tYW5kICovCisJCS8qCisJCSAqIENvbW1lbnRlZCBieSBBbGJlcnQgMjAxMS8wNy8wMQorCQkgKiBJIHVzZWQgdGhlIHR5cGVfc2l6ZSBhcyB0aGUgdHlwZSBjb21tYW5kCisJCSAqLwogCQlwMnBfcHJvdG9jb2xfd2tfaGRsKHBhZGFwdGVyLCBwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUpOwogCQlicmVhazsKICNlbmRpZgpAQCAtMjE3NCwxMyArMjA3MCwxMiBAQAogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwY21kLT5yZXMgPT0gSDJDX0RST1BQRUQpIHsKIAkJLyogVE9ETzogY2FuY2VsIHRpbWVyIGFuZCBkbyB0aW1lb3V0IGhhbmRsZXIgZGlyZWN0bHkuLi4gKi8KIAkJLyogbmVlZCB0byBtYWtlIHRpbWVvdXQgaGFuZGxlck9TIGluZGVwZW5kZW50ICovCiAJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgMSk7Ci0JCX0gZWxzZSBpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CisJfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKIAkJX3NldF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCAxKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuICoqKioqKioqRXJyb3I6IE1nbnRBY3RydHdfc2V0XzgwMl8xMV9ic3NpZF9MSVNUX1NDQU4gRmFpbCAqKioqKioqKioqKipcblxuLiIpKTsKIAl9CkBAIC0yMTg4LDEzICsyMDgzLDExIEBACiAJLyogIGZyZWUgY21kICovCiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKIAotX2Z1bmNfZXhpdF87CiB9CiB2b2lkIHJ0d19kaXNhc3NvY19jbWRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CiAJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKQEAgLTIyMDIsMjQgKzIwOTUsMTggQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuICoqKkVycm9yOiBkaXNjb25uZWN0X2NtZF9jYWxsYmFjayBGYWlsICoqKlxuLiIpKTsKLQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAl9IGVsc2UgLyogY2xlYXIgYnJpZGdlIGRhdGFiYXNlICovCiAJCW5hdDI1X2RiX2NsZWFudXAocGFkYXB0ZXIpOwogCiAJLyogIGZyZWUgY21kICovCiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKLQotZXhpdDoKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2pvaW5ic3NfY21kX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgIHN0cnVjdCBjbWRfb2JqICpwY21kKQogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwY21kLT5yZXMgPT0gSDJDX0RST1BQRUQpIHsKIAkJLyogVE9ETzogY2FuY2VsIHRpbWVyIGFuZCBkbyB0aW1lb3V0IGhhbmRsZXIgZGlyZWN0bHkuLi4gKi8KQEAgLTIyMzIsNyArMjExOSw2IEBACiAKIAlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfY3JlYXRlYnNzX2NtZF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKQpAQCAtMjI0NCw5ICsyMTMwLDggQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwY21kLT5wYXJtYnVmOwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrKTsKIAotX2Z1bmNfZW50ZXJfOwogCi0JaWYgKChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpKSB7CisJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG4gKioqKioqKipFcnJvcjogcnR3X2NyZWF0ZWJzc19jbWRfY2FsbGJhY2sgIEZhaWwgKioqKioqKioqKioqXG5cbi4iKSk7CiAJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOwogCX0KQEAgLTIyNjEsNyArMjE0Niw3IEBACiAJCQlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAJCQlpZiAocHN0YSA9PSBOVUxMKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuQ2FuJ3QgYWxsb2Mgc3RhX2luZm8gd2hlbiBjcmVhdGVic3NfY21kX2NhbGxiYWNrXG4iKSk7Ci0JCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWwgOworCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsOwogCQkJfQogCQl9CiAKQEAgLTIyOTgsNyArMjE4Myw2IEBACiAKIAlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2V0c3RhS2V5X2NtZHJzcF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKQEAgLTIzMDcsNyArMjE5MSw2IEBACiAJc3RydWN0IHNldF9zdGFrZXlfcnNwICpwc2V0c3Rha2V5X3JzcCA9IChzdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgKikocGNtZC0+cnNwKTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBzZXRzdGFrZXlfcnNwLT5hZGRyKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBzdGEgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG5FUlJPUjogcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2sgPT4gY2FuJ3QgZ2V0IHN0YV9pbmZvXG5cbiIpKTsKQEAgLTIzMTUsNyArMjE5OCw2IEBACiAJfQogZXhpdDoKIAlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKQEAgLTIzMjYsNyArMjIwOCw2IEBACiAJc3RydWN0IHNldF9hc3NvY3N0YV9yc3AgKnBhc3NvY3N0YV9yc3AgPSAoc3RydWN0IHNldF9hc3NvY3N0YV9yc3AgKikocGNtZC0+cnNwKTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBhc3NvY3N0YV9wYXJtLT5hZGRyKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBzdGEgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG5FUlJPUjogc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWMgPT4gY2FuJ3QgZ2V0IHN0YV9pbmZvXG5cbiIpKTsKQEAgLTIzNDcsNSArMjIyOCw0IEBACiBleGl0OgogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7CiAKLV9mdW5jX2V4aXRfOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jCmluZGV4IGFmMzIwNDEuLjJiZWIyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJaW50IGxlbiA9IDA7CiAKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJjdXJfY2g9JWQsIGN1cl9idz0lZCwgY3VyX2NoX29mZmV0PSVkXG4iLAorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImN1cl9jaD0lZCwgY3VyX2J3PSVkLCBjdXJfY2hfb2Zmc2V0PSVkXG4iLAogCQkJCQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIHBtbG1lZXh0LT5jdXJfYndtb2RlLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCk7CiAJKmVvZiA9IDE7CiAJcmV0dXJuIGxlbjsKQEAgLTc4Myw3ICs3ODMsNyBAQAogCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKIAkJaWYgKHByZWdwcml2KSB7CiAJCQlwcmVncHJpdi0+cnhfc3RiYyA9IG1vZGU7Ci0JCQlwcmludGsoInJ4X3N0YmM9JWRcbiIsIG1vZGUpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAicnhfc3RiYz0lZFxuIiwgbW9kZSk7CiAJCX0KIAl9CiAJcmV0dXJuIGNvdW50OwpAQCAtODIwLDcgKzgyMCw3IEBACiAKIAkJaWYgKGVuYWJsZSkgewogCQkJREJHXzg4RSgiVHVybiBPbiBSeCBSU1NJIERpc3BsYXkgRnVuY3Rpb25cbiIpOwotCQkJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gZW5hYmxlIDsKKwkJCXBhZGFwdGVyLT5iUnhSU1NJRGlzcGxheSA9IGVuYWJsZTsKIAkJfSBlbHNlIHsKIAkJCURCR184OEUoIlR1cm4gT2ZmIFJ4IFJTU0kgRGlzcGxheSBGdW5jdGlvblxuIik7CiAJCQlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSAwOwpAQCAtODUxLDEyICs4NTEsMTIgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fU1RBOyBpKyspIHsKIAkJcGhlYWQgPSAmKHBzdGFwcml2LT5zdGFfaGFzaFtpXSk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBoYXNoX2xpc3QpOworCQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBoYXNoX2xpc3QpOwogCi0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInN0YSdzIG1hY2FkZHI6ICVwTVxuIiwgcHN0YS0+aHdhZGRyKTsKIAkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInJ0c2VuPSVkLCBjdHMyc2xlZj0lZFxuIiwgcHN0YS0+cnRzZW4sIHBzdGEtPmN0czJzZWxmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYwppbmRleCA2MTQ5ZTNhLi40MGFmZTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCkBAIC03NiwxMSArNzYsMTAgQEAKIHsKIAlpZiAoT2Zmc2V0ID49IEVGVVNFX01BWF9IV19TSVpFKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGZha2VFZnVzZUJhbmsgPT0gMCkgeworCWlmIChmYWtlRWZ1c2VCYW5rID09IDApCiAJCWZha2VFZnVzZUNvbnRlbnRbT2Zmc2V0XSA9IFZhbHVlOwotCX0gZWxzZSB7CisJZWxzZQogCQlmYWtlQlRFZnVzZUNvbnRlbnRbZmFrZUVmdXNlQmFuay0xXVtPZmZzZXRdID0gVmFsdWU7Ci0JfQogCXJldHVybiB0cnVlOwogfQogCkBAIC0xNTYsMTcgKzE1NSwxNSBAQAogCXJldHVybiB3b3JkX2NudHM7CiB9CiAKLS8qICAqLwotLyogCURlc2NyaXB0aW9uOiAqLwotLyogCQlFeGVjdXRlIEUtRnVzZSByZWFkIGJ5dGUgb3BlcmF0aW9uLiAqLwotLyogCQlSZWZlcnJlZCBmcm9tIFNEMSBSaWNoYXJkLiAqLwotLyogICovCi0vKiAJQXNzdW1wdGlvbjogKi8KLS8qIAkJMS4gQm9vdCBmcm9tIEUtRnVzZSBhbmQgc3VjY2Vzc2Z1bGx5IGF1dG8tbG9hZC4gKi8KLS8qIAkJMi4gUEFTU0lWRV9MRVZFTCAoVVNCIGludGVyZmFjZSkgKi8KLS8qICAqLwotLyogCUNyZWF0ZWQgYnkgUm9nZXIsIDIwMDguMTAuMjEuICovCi0vKiAgKi8KKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEV4ZWN1dGUgRS1GdXNlIHJlYWQgYnl0ZSBvcGVyYXRpb24uCisgKiBSZWZlcnJlZCBmcm9tIFNEMSBSaWNoYXJkLgorICogQXNzdW1wdGlvbjoKKyAqCQkxLiBCb290IGZyb20gRS1GdXNlIGFuZCBzdWNjZXNzZnVsbHkgYXV0by1sb2FkLgorICoJCTIuIFBBU1NJVkVfTEVWRUwgKFVTQiBpbnRlcmZhY2UpCisgKiBDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA4LjEwLjIxLgorICovCiB2b2lkCiBSZWFkRUZ1c2VCeXRlKAogCQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwKQEAgLTIxMCwyMyArMjA3LDIxIEBACiAJKnBidWYgPSAodTgpKHZhbHVlMzIgJiAweGZmKTsKIH0KIAotLyogICovCi0vKiAJRGVzY3JpcHRpb246ICovCi0vKiAJCTEuIEV4ZWN1dGUgRS1GdXNlIHJlYWQgYnl0ZSBvcGVyYXRpb24gYWNjb3JkaW5nIGFzIG1hcCBvZmZzZXQgYW5kICovCi0vKiAJCSAgICBzYXZlIHRvIEUtRnVzZSB0YWJsZS4gKi8KLS8qIAkJMi4gUmVmZXJyZWQgZnJvbSBTRDEgUmljaGFyZC4gKi8KLS8qICAqLwotLyogCUFzc3VtcHRpb246ICovCi0vKiAJCTEuIEJvb3QgZnJvbSBFLUZ1c2UgYW5kIHN1Y2Nlc3NmdWxseSBhdXRvLWxvYWQuICovCi0vKiAJCTIuIFBBU1NJVkVfTEVWRUwgKFVTQiBpbnRlcmZhY2UpICovCi0vKiAgKi8KLS8qIAlDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA4LjEwLjIxLiAqLwotLyogICovCi0vKiAJMjAwOC8xMi8xMiBNSAkxLiBSZW9yZ2FuaXplIGNvZGUgZmxvdyBhbmQgcmVzZXJ2ZSBieXRlcy4gYW5kIGFkZCBkZXNjcmlwdGlvbi4gKi8KLS8qIAkJCQkJMi4gQWRkIGVmdXNlIHV0aWxpemF0aW9uIGNvbGxlY3QuICovCi0vKiAJMjAwOC8xMi8yMiBNSAlSZWFkIEVmdXNlIG11c3QgY2hlY2sgaWYgd2Ugd3JpdGUgc2VjdGlvbiAxIGRhdGEgYWdhaW4hISEgU2VjMSAqLwotLyogCQkJCQl3cml0ZSBhZGRyIG11c3QgYmUgYWZ0ZXIgc2VjNS4gKi8KLS8qICAqLworLyogRGVzY3JpcHRpb246CisgKgkxLiBFeGVjdXRlIEUtRnVzZSByZWFkIGJ5dGUgb3BlcmF0aW9uIGFjY29yZGluZyBhcyBtYXAgb2Zmc2V0IGFuZAorICoJc2F2ZSB0byBFLUZ1c2UgdGFibGUuCisgKgkyLiBSZWZlcnJlZCBmcm9tIFNEMSBSaWNoYXJkLgorICogQXNzdW1wdGlvbjoKKyAqCTEuIEJvb3QgZnJvbSBFLUZ1c2UgYW5kIHN1Y2Nlc3NmdWxseSBhdXRvLWxvYWQuCisgKgkyLiBQQVNTSVZFX0xFVkVMIChVU0IgaW50ZXJmYWNlKQorICoJQ3JlYXRlZCBieSBSb2dlciwgMjAwOC4xMC4yMS4KKyAqIDIwMDgvMTIvMTIgTUgKKyAqCTEuIFJlb3JnYW5pemUgY29kZSBmbG93IGFuZCByZXNlcnZlIGJ5dGVzLiBhbmQgYWRkIGRlc2NyaXB0aW9uLgorICoJMi4gQWRkIGVmdXNlIHV0aWxpemF0aW9uIGNvbGxlY3QuCisgKiAyMDA4LzEyLzIyIE1ICisgKglSZWFkIEVmdXNlIG11c3QgY2hlY2sgaWYgd2Ugd3JpdGUgc2VjdGlvbiAxIGRhdGEgYWdhaW4hISEKKyAqCVNlYzEgd3JpdGUgYWRkciBtdXN0IGJlIGFmdGVyIHNlYzUuCisgKi8KIAogc3RhdGljIHZvaWQgZWZ1c2VfUmVhZEVGdXNlKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCBlZnVzZVR5cGUsIHUxNiBfb2Zmc2V0LCB1MTYgX3NpemVfYnl0ZSwgdTggKnBidWYsIGJvb2wgcHNldWRvKQogewpAQCAtNDUwLDcgKzQ0NSw3IEBACiB7CiAJaW50IGkgPSAwOwogCXUxNiByZWFsX2NvbnRlbnRfbGVuID0gMCwgbWF4X2F2YWlsYWJsZV9zaXplID0gMDsKLQl1OCByZXMgPSBfRkFJTCA7CisJdTggcmVzID0gX0ZBSUw7CiAJdTggKCpydzgpKHN0cnVjdCBhZGFwdGVyICosIHUxNiwgdTgqKTsKIAogCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbihwYWRhcHRlciwgRUZVU0VfV0lGSSwgVFlQRV9FRlVTRV9SRUFMX0NPTlRFTlRfTEVOLCAodm9pZCAqKSZyZWFsX2NvbnRlbnRfbGVuLCBmYWxzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwppbmRleCBlNmY5OGZiLi4wNTUyMDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKQEAgLTE0Nyw3ICsxNDcsNiBAQAogCXVpbnQgKmZybGVuIC8qIGZyYW1lIGxlbmd0aCAqLwogKQogewotX2Z1bmNfZW50ZXJfOwogCSpwYnVmID0gKHU4KWluZGV4OwogCiAJKihwYnVmICsgMSkgPSAodTgpbGVuOwpAQCAtMTU3LDcgKzE1Niw2IEBACiAKIAkqZnJsZW4gPSAqZnJsZW4gKyAobGVuICsgMik7CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiBwYnVmICsgbGVuICsgMjsKIH0KIApAQCAtMjIxLDExICsyMTksOCBAQAogewogCWludCB0bXAsIGk7CiAJdTggKnA7Ci1fZnVuY19lbnRlcl87Ci0JaWYgKGxpbWl0IDwgMSkgewotCQlfZnVuY19leGl0XzsKKwlpZiAobGltaXQgPCAxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlwID0gcGJ1ZjsKIAlpID0gMDsKQEAgLTI0Miw3ICsyMzcsNiBAQAogCQlpZiAoaSA+PSBsaW1pdCkKIAkJCWJyZWFrOwogCX0KLV9mdW5jX2V4aXRfOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0yNzMsNyArMjY3LDcgQEAKIAljbnQgPSAwOwogCiAJd2hpbGUgKGNudCA8IGluX2xlbikgewotCQlpZiAoZWlkID09IGluX2llW2NudF0gJiYgKCFvdWkgfHwgX3J0d19tZW1jbXAoJmluX2llW2NudCsyXSwgb3VpLCBvdWlfbGVuKSkpIHsKKwkJaWYgKGVpZCA9PSBpbl9pZVtjbnRdICYmICghb3VpIHx8ICFtZW1jbXAoJmluX2llW2NudCsyXSwgb3VpLCBvdWlfbGVuKSkpIHsKIAkJCXRhcmdldF9pZSA9ICZpbl9pZVtjbnRdOwogCiAJCQlpZiAoaWUpCkBAIC0zMzksNyArMzMzLDYgQEAKIAogdm9pZCBydHdfc2V0X3N1cHBvcnRlZF9yYXRlKHU4ICpTdXBwb3J0ZWRSYXRlcywgdWludCBtb2RlKQogewotX2Z1bmNfZW50ZXJfOwogCiAJX3J0d19tZW1zZXQoU3VwcG9ydGVkUmF0ZXMsIDAsIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCk7CiAKQEAgLTM2MSwxMyArMzU0LDExIEBACiAJCW1lbWNweShTdXBwb3J0ZWRSYXRlcyArIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4sIFdJRklfT0ZETVJBVEVTLCBJRUVFODAyMTFfTlVNX09GRE1fUkFURVNMRU4pOwogCQlicmVhazsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogdWludAlydHdfZ2V0X3JhdGVzZXRfbGVuKHU4CSpyYXRlc2V0KQogewogCXVpbnQgaSA9IDA7Ci1fZnVuY19lbnRlcl87CiAJd2hpbGUgKDEpIHsKIAkJaWYgKChyYXRlc2V0W2ldKSA9PSAwKQogCQkJYnJlYWs7CkBAIC0zNzUsNyArMzY2LDYgQEAKIAkJCWJyZWFrOwogCQlpKys7CiAJfQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTM4Niw3ICszNzYsNiBAQAogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcmsgPSAmcHJlZ2lzdHJ5cHJpdi0+ZGV2X25ldHdvcms7CiAJdTggKmllID0gcGRldl9uZXR3b3JrLT5JRXM7CiAKLV9mdW5jX2VudGVyXzsKIAogCS8qIHRpbWVzdGFtcCB3aWxsIGJlIGluc2VydGVkIGJ5IGhhcmR3YXJlICovCiAJc3ogKz0gODsKQEAgLTQ0NCw3ICs0MzMsNiBAQAogCiAJaWYgKHJhdGVMZW4gPiA4KQogCQlpZSA9IHJ0d19zZXRfaWUoaWUsIF9FWFRfU1VQUE9SVEVEUkFURVNfSUVfLCAocmF0ZUxlbiAtIDgpLCAocGRldl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyArIDgpLCAmc3opOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3o7CiB9CkBAIC00NjMsNyArNDUxLDcgQEAKIAogCQlpZiAocGJ1ZikgewogCQkJLyogY2hlY2sgaWYgb3VpIG1hdGNoZXMuLi4gKi8KLQkJCWlmIChfcnR3X21lbWNtcCgocGJ1ZiArIDIpLCB3cGFfb3VpX3R5cGUsIHNpemVvZiAod3BhX291aV90eXBlKSkgPT0gZmFsc2UpCisJCQlpZiAoIW1lbWNtcCgocGJ1ZiArIDIpLCB3cGFfb3VpX3R5cGUsIHNpemVvZih3cGFfb3VpX3R5cGUpKSA9PSBmYWxzZSkKIAkJCQlnb3RvIGNoZWNrX25leHRfaWU7CiAKIAkJCS8qIGNoZWNrIHZlcnNpb24uLi4gKi8KQEAgLTQ5NywxNSArNDg1LDE1IEBACiAKIGludCBydHdfZ2V0X3dwYV9jaXBoZXJfc3VpdGUodTggKnMpCiB7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfTk9ORSwgV1BBX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX05PTkUsIFdQQV9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9OT05FOwotCWlmIChfcnR3X21lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwLCBXUEFfU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfV0VQNDAsIFdQQV9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVA0MDsKLQlpZiAoX3J0d19tZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9US0lQLCBXUEFfU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfVEtJUCwgV1BBX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX1RLSVA7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCwgV1BBX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAsIFdQQV9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9DQ01QOwotCWlmIChfcnR3X21lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNCwgV1BBX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNCwgV1BBX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX1dFUDEwNDsKIAogCXJldHVybiAwOwpAQCAtNTEzLDE1ICs1MDEsMTUgQEAKIAogaW50IHJ0d19nZXRfd3BhMl9jaXBoZXJfc3VpdGUodTggKnMpCiB7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfTk9ORSwgUlNOX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX05PTkUsIFJTTl9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9OT05FOwotCWlmIChfcnR3X21lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwLCBSU05fU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQNDAsIFJTTl9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVA0MDsKLQlpZiAoX3J0d19tZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9US0lQLCBSU05fU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfVEtJUCwgUlNOX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX1RLSVA7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUCwgUlNOX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAsIFJTTl9TRUxFQ1RPUl9MRU4pKQogCQlyZXR1cm4gV1BBX0NJUEhFUl9DQ01QOwotCWlmIChfcnR3X21lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1dFUDEwNCwgUlNOX1NFTEVDVE9SX0xFTikgPT0gdHJ1ZSkKKwlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1dFUDEwNCwgUlNOX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX1dFUDEwNDsKIAogCXJldHVybiAwOwpAQCAtNTQyLDcgKzUzMCw3IEBACiAKIAogCWlmICgoKndwYV9pZSAhPSBfV1BBX0lFX0lEXykgfHwgKCood3BhX2llKzEpICE9ICh1OCkod3BhX2llX2xlbiAtIDIpKSB8fAotCSAgICAoX3J0d19tZW1jbXAod3BhX2llKzIsIFJUV19XUEFfT1VJX1RZUEUsIFdQQV9TRUxFQ1RPUl9MRU4pICE9IHRydWUpKQorCSAgICAobWVtY21wKHdwYV9pZSsyLCBSVFdfV1BBX09VSV9UWVBFLCBXUEFfU0VMRUNUT1JfTEVOKSkpCiAJCXJldHVybiBfRkFJTDsKIAogCXBvcyA9IHdwYV9pZTsKQEAgLTU4Nyw3ICs1NzUsNyBAQAogCWlmIChpc184MDIxeCkgewogCQlpZiAobGVmdCA+PSA2KSB7CiAJCQlwb3MgKz0gMjsKLQkJCWlmIChfcnR3X21lbWNtcChwb3MsIFNVSVRFXzFYLCA0KSA9PSAxKSB7CisJCQlpZiAoIW1lbWNtcChwb3MsIFNVSVRFXzFYLCA0KSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoIiVzIDogdGhlcmUgaGFzIDgwMi4xeCBhdXRoXG4iLCBfX2Z1bmNfXykpOwogCQkJCSppc184MDIxeCA9IDE7CiAJCQl9CkBAIC02NTcsNyArNjQ1LDcgQEAKIAlpZiAoaXNfODAyMXgpIHsKIAkJaWYgKGxlZnQgPj0gNikgewogCQkJcG9zICs9IDI7Ci0JCQlpZiAoX3J0d19tZW1jbXAocG9zLCBTVUlURV8xWCwgNCkgPT0gMSkgeworCQkJaWYgKCFtZW1jbXAocG9zLCBTVUlURV8xWCwgNCkpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCIlcyAoKTogdGhlcmUgaGFzIDgwMi4xeCBhdXRoXG4iLCBfX2Z1bmNfXykpOwogCQkJCSppc184MDIxeCA9IDE7CiAJCQl9CkBAIC02NzIsNyArNjYwLDYgQEAKIAl1OCB3cGFfb3VpWzRdID0gezB4MCwgMHg1MCwgMHhmMiwgMHgwMX07CiAJdWludAljbnQ7CiAKLV9mdW5jX2VudGVyXzsKIAogCS8qIFNlYXJjaCByZXF1aXJlZCBXUEEgb3IgV1BBMiBJRSBhbmQgY29weSB0byBzZWNfaWVbXSAqLwogCkBAIC02ODMsNyArNjcwLDcgQEAKIAl3aGlsZSAoY250IDwgaW5fbGVuKSB7CiAJCWF1dGhtb2RlID0gaW5faWVbY250XTsKIAotCQlpZiAoKGF1dGhtb2RlID09IF9XUEFfSUVfSURfKSAmJiAoX3J0d19tZW1jbXAoJmluX2llW2NudCsyXSwgJndwYV9vdWlbMF0sIDQpKSkgeworCQlpZiAoKGF1dGhtb2RlID09IF9XUEFfSUVfSURfKSAmJiAoIW1lbWNtcCgmaW5faWVbY250KzJdLCAmd3BhX291aVswXSwgNCkpKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCiAJCQkJCSAoIlxuIHJ0d19nZXRfd3BhX2llOiBzZWNfaWR4ID0lZCBpbl9pZVtjbnQrMV0rMiA9JWRcbiIsCiAJCQkJCSBzZWNfaWR4LCBpbl9pZVtjbnQrMV0rMikpOwpAQCAtNzI2LDcgKzcxMyw2IEBACiAJCX0KIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuICpyc25fbGVuICsgKndwYV9sZW47CiB9CkBAIC03NDEsNyArNzI3LDcgQEAKIAogCWVpZCA9IGllX3B0clswXTsKIAotCWlmICgoZWlkID09IF9XUEFfSUVfSURfKSAmJiAoX3J0d19tZW1jbXAoJmllX3B0clsyXSwgd3BzX291aSwgNCkpKSB7CisJaWYgKChlaWQgPT0gX1dQQV9JRV9JRF8pICYmICghbWVtY21wKCZpZV9wdHJbMl0sIHdwc19vdWksIDQpKSkgewogCQkqd3BzX2llbGVuID0gaWVfcHRyWzFdKzI7CiAJCW1hdGNoID0gdHJ1ZTsKIAl9CkBAIC03NzQsNyArNzYwLDcgQEAKIAl3aGlsZSAoY250IDwgaW5fbGVuKSB7CiAJCWVpZCA9IGluX2llW2NudF07CiAKLQkJaWYgKChlaWQgPT0gX1dQQV9JRV9JRF8pICYmIChfcnR3X21lbWNtcCgmaW5faWVbY250KzJdLCB3cHNfb3VpLCA0KSkpIHsKKwkJaWYgKChlaWQgPT0gX1dQQV9JRV9JRF8pICYmICghbWVtY21wKCZpbl9pZVtjbnQrMl0sIHdwc19vdWksIDQpKSkgewogCQkJd3BzaWVfcHRyID0gJmluX2llW2NudF07CiAKIAkJCWlmICh3cHNfaWUpCkBAIC04MTMsNyArNzk5LDcgQEAKIAkJKmxlbl9hdHRyID0gMDsKIAogCWlmICgod3BzX2llWzBdICE9IF9WRU5ET1JfU1BFQ0lGSUNfSUVfKSB8fAotCSAgICAoX3J0d19tZW1jbXAod3BzX2llICsgMiwgd3BzX291aSAsIDQpICE9IHRydWUpKQorCSAgICAobWVtY21wKHdwc19pZSArIDIsIHdwc19vdWkgLCA0KSkpCiAJCXJldHVybiBhdHRyX3B0cjsKIAogCS8qICA2ID0gMShFbGVtZW50IElEKSArIDEoTGVuZ3RoKSArIDQoV1BTIE9VSSkgKi8KQEAgLTEyMjMsNyArMTIwOSw3IEBACiAJCQlkdW1wX3N0YWNrKCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlpZiAoKGVpZCA9PSBfVkVORE9SX1NQRUNJRklDX0lFXykgJiYgKF9ydHdfbWVtY21wKCZpbl9pZVtjbnQrMl0sIHAycF9vdWksIDQpID09IHRydWUpKSB7CisJCWlmICgoZWlkID09IF9WRU5ET1JfU1BFQ0lGSUNfSUVfKSAmJiAoIW1lbWNtcCgmaW5faWVbY250KzJdLCBwMnBfb3VpLCA0KSkpIHsKIAkJCXAycF9pZV9wdHIgPSBpbl9pZSArIGNudDsKIAogCQkJaWYgKHAycF9pZSAhPSBOVUxMKQpAQCAtMTI1OCw3ICsxMjQ0LDcgQEAKIAkJKmxlbl9hdHRyID0gMDsKIAogCWlmICghcDJwX2llIHx8IChwMnBfaWVbMF0gIT0gX1ZFTkRPUl9TUEVDSUZJQ19JRV8pIHx8Ci0JICAgIChfcnR3X21lbWNtcChwMnBfaWUgKyAyLCBwMnBfb3VpICwgNCkgIT0gdHJ1ZSkpCisJICAgIChtZW1jbXAocDJwX2llICsgMiwgcDJwX291aSAsIDQpKSkKIAkJcmV0dXJuIGF0dHJfcHRyOwogCiAJLyogIDYgPSAxKEVsZW1lbnQgSUQpICsgMShMZW5ndGgpICsgMyAoT1VJKSArIDEoT1VJIFR5cGUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvLmMKaW5kZXggZmYwMzk4Zi4uNzUzMDUzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW8uYwpAQCAtNTksMTAgKzU5LDggQEAKIAlzdHJ1Y3QJaW50Zl9oZGwgKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJdTggKCpfcmVhZDgpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyKTsKIAotCV9mdW5jX2VudGVyXzsKIAlfcmVhZDggPSBwaW50ZmhkbC0+aW9fb3BzLl9yZWFkODsKIAlyX3ZhbCA9IF9yZWFkOChwaW50ZmhkbCwgYWRkcik7Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJfdmFsOwogfQogCkBAIC03MiwxMSArNzAsOSBAQAogCXN0cnVjdCBpb19wcml2ICpwaW9fcHJpdiA9ICZhZGFwdGVyLT5pb3ByaXY7CiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAl1MTYgKCpfcmVhZDE2KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkcik7Ci1fZnVuY19lbnRlcl87CiAJX3JlYWQxNiA9IHBpbnRmaGRsLT5pb19vcHMuX3JlYWQxNjsKIAogCXJfdmFsID0gX3JlYWQxNihwaW50ZmhkbCwgYWRkcik7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcl92YWw7CiB9CiAKQEAgLTg2LDExICs4Miw5IEBACiAJc3RydWN0IGlvX3ByaXYgKnBpb19wcml2ID0gJmFkYXB0ZXItPmlvcHJpdjsKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCXUzMgkoKl9yZWFkMzIpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyKTsKLV9mdW5jX2VudGVyXzsKIAlfcmVhZDMyID0gcGludGZoZGwtPmlvX29wcy5fcmVhZDMyOwogCiAJcl92YWwgPSBfcmVhZDMyKHBpbnRmaGRsLCBhZGRyKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiByX3ZhbDsKIH0KIApAQCAtMTAwLDExICs5NCw5IEBACiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAlpbnQgKCpfd3JpdGU4KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTggdmFsKTsKIAlpbnQgcmV0OwotCV9mdW5jX2VudGVyXzsKIAlfd3JpdGU4ID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGU4OwogCiAJcmV0ID0gX3dyaXRlOChwaW50ZmhkbCwgYWRkciwgdmFsKTsKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTExNSwxMSArMTA3LDkgQEAKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCWludCAoKl93cml0ZTE2KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTE2IHZhbCk7CiAJaW50IHJldDsKLQlfZnVuY19lbnRlcl87CiAJX3dyaXRlMTYgPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZTE2OwogCiAJcmV0ID0gX3dyaXRlMTYocGludGZoZGwsIGFkZHIsIHZhbCk7Ci0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0xMjksMTEgKzExOSw5IEBACiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAlpbnQgKCpfd3JpdGUzMikoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiB2YWwpOwogCWludCByZXQ7Ci0JX2Z1bmNfZW50ZXJfOwogCV93cml0ZTMyID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGUzMjsKIAogCXJldCA9IF93cml0ZTMyKHBpbnRmaGRsLCBhZGRyLCB2YWwpOwotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMTQ0LDExICsxMzIsOSBAQAogCXN0cnVjdAlpbnRmX2hkbCAqcGludGZoZGwgPSAoc3RydWN0IGludGZfaGRsICopKCYocGlvX3ByaXYtPmludGYpKTsKIAlpbnQgKCpfd3JpdGVOKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGxlbmd0aCwgdTggKnBkYXRhKTsKIAlpbnQgcmV0OwotCV9mdW5jX2VudGVyXzsKIAlfd3JpdGVOID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGVOOwogCiAJcmV0ID0gX3dyaXRlTihwaW50ZmhkbCwgYWRkciwgbGVuZ3RoLCBwZGF0YSk7Ci0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0xNTgsMTEgKzE0NCw5IEBACiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAlpbnQgKCpfd3JpdGU4X2FzeW5jKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTggdmFsKTsKIAlpbnQgcmV0OwotCV9mdW5jX2VudGVyXzsKIAlfd3JpdGU4X2FzeW5jID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGU4X2FzeW5jOwogCiAJcmV0ID0gX3dyaXRlOF9hc3luYyhwaW50ZmhkbCwgYWRkciwgdmFsKTsKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTE3NCwxMCArMTU4LDggQEAKIAlpbnQgKCpfd3JpdGUxNl9hc3luYykoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUxNiB2YWwpOwogCWludCByZXQ7CiAKLV9mdW5jX2VudGVyXzsKIAlfd3JpdGUxNl9hc3luYyA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlMTZfYXN5bmM7CiAJcmV0ID0gX3dyaXRlMTZfYXN5bmMocGludGZoZGwsIGFkZHIsIHZhbCk7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTE4OSwxMCArMTcxLDggQEAKIAlpbnQgKCpfd3JpdGUzMl9hc3luYykoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiB2YWwpOwogCWludCByZXQ7CiAKLV9mdW5jX2VudGVyXzsKIAlfd3JpdGUzMl9hc3luYyA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlMzJfYXN5bmM7CiAJcmV0ID0gX3dyaXRlMzJfYXN5bmMocGludGZoZGwsIGFkZHIsIHZhbCk7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTIwMyw3ICsxODMsNiBAQAogCXN0cnVjdCBpb19wcml2ICpwaW9fcHJpdiA9ICZhZGFwdGVyLT5pb3ByaXY7CiAJc3RydWN0CWludGZfaGRsCQkqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAotCV9mdW5jX2VudGVyXzsKIAlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9fY18sIF9kcnZfaW5mb18sCiAJCQkgKCJydHdfcmVhZF9tZW06YkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpIiwKQEAgLTIxMiw3ICsxOTEsNiBAQAogCX0KIAlfcmVhZF9tZW0gPSBwaW50ZmhkbC0+aW9fb3BzLl9yZWFkX21lbTsKIAlfcmVhZF9tZW0ocGludGZoZGwsIGFkZHIsIGNudCwgcG1lbSk7Ci0JX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgX3J0d193cml0ZV9tZW0oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSkKQEAgLTIyMSwxMyArMTk5LDExIEBACiAJc3RydWN0IGlvX3ByaXYgKnBpb19wcml2ID0gJmFkYXB0ZXItPmlvcHJpdjsKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJX3dyaXRlX21lbSA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlX21lbTsKIAogCV93cml0ZV9tZW0ocGludGZoZGwsIGFkZHIsIGNudCwgcG1lbSk7CiAKLQlfZnVuY19leGl0XzsKIH0KIAogdm9pZCBfcnR3X3JlYWRfcG9ydChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICpwbWVtKQpAQCAtMjM2LDcgKzIxMiw2IEBACiAJc3RydWN0IGlvX3ByaXYgKnBpb19wcml2ID0gJmFkYXB0ZXItPmlvcHJpdjsKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvX2NfLCBfZHJ2X2luZm9fLApAQCAtMjQ5LDcgKzIyNCw2IEBACiAKIAlfcmVhZF9wb3J0KHBpbnRmaGRsLCBhZGRyLCBjbnQsIHBtZW0pOwogCi0JX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgX3J0d19yZWFkX3BvcnRfY2FuY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQpAQCAtMjcxLDEzICsyNDUsMTEgQEAKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCXUzMiByZXQgPSBfU1VDQ0VTUzsKIAotCV9mdW5jX2VudGVyXzsKIAogCV93cml0ZV9wb3J0ID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGVfcG9ydDsKIAogCXJldCA9IF93cml0ZV9wb3J0KHBpbnRmaGRsLCBhZGRyLCBjbnQsIHBtZW0pOwogCi0JIF9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCmluZGV4IGUyNWIzOWIuLmYxMzk4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYwpAQCAtNDIsNyArNDIsNiBAQAogCXU4CSBpOwogCXU4CXJldCA9IHRydWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChzc2lkLT5Tc2lkTGVuZ3RoID4gMzIpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLCAoInNzaWQgbGVuZ3RoID4zMlxuIikpOwpAQCAtNjEsOCArNjAsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc0LDExICs3MSwxMCBAQAogCXN0cnVjdCBfX3F1ZXVlICpxdWV1ZQk9ICYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlKTsKIAl1OCByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLCAoIlxuIHJ0d19kb19qb2luOiBwaGVhZCA9ICVwOyBwbGlzdCA9ICVwXG5cblxuIiwgcGhlYWQsIHBsaXN0KSk7CiAKQEAgLTE3MCw3ICsxNjYsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xODEsNyArMTc2LDYgQEAKIAl1MzIgY3VyX3RpbWUgPSAwOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCURCR184OEVfTEVWRUwoX2Rydl9pbmZvXywgInNldCBic3NpZDolcE1cbiIsIGJzc2lkKTsKIApAQCAtMjA1LDcgKzE5OSw3IEBACiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLCAoInNldF9ic3NpZDogX0ZXX0xJTktFRHx8V0lGSV9BREhPQ19NQVNURVJfU1RBVEVcbiIpKTsKIAotCQlpZiAoX3J0d19tZW1jbXAoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzLCBic3NpZCwgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcywgYnNzaWQsIEVUSF9BTEVOKSkgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpID09IGZhbHNlKQogCQkJCWdvdG8gcmVsZWFzZV9tbG1lX2xvY2s7LyogaXQgbWVhbnMgZHJpdmVyIGlzIGluIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFLCB3ZSBuZWVkbid0IGNyZWF0ZSBic3MgYWdhaW4uICovCiAJCX0gZWxzZSB7CkBAIC0yNTcsNyArMjUxLDYgQEAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCiAJCSAoInJ0d19zZXRfODAyXzExX2Jzc2lkOiBzdGF0dXM9JWRcbiIsIHN0YXR1cykpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yNzAsNyArMjYzLDYgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7CiAKLV9mdW5jX2VudGVyXzsKIAogCURCR184OEVfTEVWRUwoX2Rydl9pbmZvXywgInNldCBzc2lkIFslc10gZndfc3RhdGU9MHglMDh4XG4iLAogCQkgICAgICBzc2lkLT5Tc2lkLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKQEAgLTI4NSwxOCArMjc3LDE3IEBACiAJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCiAJREJHXzg4RSgiU2V0IFNTSUQgdW5kZXIgZndfc3RhdGUgPSAweCUwOHhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgPT0gdHJ1ZSkgeworCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgPT0gdHJ1ZSkKIAkJZ290byBoYW5kbGVfdGtpcF9jb3VudGVybWVhc3VyZTsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykgPT0gdHJ1ZSkgeworCWVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykgPT0gdHJ1ZSkKIAkJZ290byByZWxlYXNlX21sbWVfbG9jazsKLQl9CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUR8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCiAJCQkgKCJzZXRfc3NpZDogX0ZXX0xJTktFRHx8V0lGSV9BREhPQ19NQVNURVJfU1RBVEVcbiIpKTsKIAogCQlpZiAoKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoID09IHNzaWQtPlNzaWRMZW5ndGgpICYmCi0JCSAgICAoX3J0d19tZW1jbXAoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkLCBzc2lkLT5Tc2lkLCBzc2lkLT5Tc2lkTGVuZ3RoKSkpIHsKKwkJICAgICghbWVtY21wKCZwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCwgc3NpZC0+U3NpZCwgc3NpZC0+U3NpZExlbmd0aCkpKSB7CiAJCQlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpID09IGZhbHNlKSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKIAkJCQkJICgiU2V0IFNTSUQgaXMgdGhlIHNhbWUgc3NpZCwgZndfc3RhdGUgPSAweCUwOHhcbiIsCkBAIC0zNTcsMTEgKzM0OCwxMCBAQAogCW1lbWNweSgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCBzc2lkLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKIAlwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkID0gZmFsc2U7CiAKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpID09IHRydWUpIHsKKwlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpID09IHRydWUpCiAJCXBtbG1lcHJpdi0+dG9fam9pbiA9IHRydWU7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXN0YXR1cyA9IHJ0d19kb19qb2luKHBhZGFwdGVyKTsKLQl9CiAKIHJlbGVhc2VfbWxtZV9sb2NrOgogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwpAQCAtMzY5LDcgKzM1OSw2IEBACiBleGl0OgogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKIAkJICgiLXJ0d19zZXRfODAyXzExX3NzaWQ6IHN0YXR1cyA9JWRcbiIsIHN0YXR1cykpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzgwLDcgKzM2OSw2IEBACiAJc3RydWN0CXdsYW5fbmV0d29yawkqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKIAllbnVtIG5kaXNfODAyXzExX25ldHdvcmtfaW5mcmEgKnBvbGRfc3RhdGUgPSAmKGN1cl9uZXR3b3JrLT5uZXR3b3JrLkluZnJhc3RydWN0dXJlTW9kZSk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfbm90aWNlXywKIAkJICgiK3J0d19zZXRfODAyXzExX2luZnJhc3RydWN0dXJlX21vZGU6IG9sZCA9JWQgbmV3ID0lZCBmd19zdGF0ZSA9IDB4JTA4eFxuIiwKQEAgLTQxMSw3ICszOTksNyBAQAogCiAJCWlmICgoKnBvbGRfc3RhdGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKSB8fCAoKnBvbGRfc3RhdGUgPT0gTmRpczgwMl8xMUlCU1MpKSB7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpCi0JCQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QocGFkYXB0ZXIpOyAvKiB3aWxsIGNsciBMaW5rZWRfc3RhdGU7IGJlZm9yZSB0aGlzIGZ1bmN0aW9uLCB3ZSBtdXN0IGhhdmUgY2hrZWQgd2hldGhlciAgaXNzdWUgZGlzLWFzc29jX2NtZCBvciBub3QgKi8KKwkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdChwYWRhcHRlcik7IC8qIHdpbGwgY2xyIExpbmtlZF9zdGF0ZTsgYmVmb3JlIHRoaXMgZnVuY3Rpb24sIHdlIG11c3QgaGF2ZSBjaGVja2VkIHdoZXRoZXIgIGlzc3VlIGRpcy1hc3NvY19jbWQgb3Igbm90ICovCiAJICAgICAgIH0KIAogCQkqcG9sZF9zdGF0ZSA9IG5ldHdvcmt0eXBlOwpAQCAtNDM4LDcgKzQyNiw2IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTQ0OCw3ICs0MzUsNiBAQAogewogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIApAQCAtNDY0LDcgKzQ1MCw2IEBACiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTQ3NCw3ICs0NTksNiBAQAogCXN0cnVjdAltbG1lX3ByaXYJCSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXU4CXJlcyA9IHRydWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywgKCIrcnR3X3NldF84MDJfMTFfYnNzaWRfbGlzdF9zY2FuKCksIGZ3X3N0YXRlID0leFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOwogCkBAIC00OTQsMTEgKzQ3OCwxMiBAQAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sICgicnR3X3NldF84MDJfMTFfYnNzaWRfbGlzdF9zY2FuIGZhaWwgc2luY2UgZndfc3RhdGUgPSAleFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOwogCQlyZXMgPSB0cnVlOwogCi0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgKF9GV19VTkRFUl9TVVJWRVl8X0ZXX1VOREVSX0xJTktJTkcpKSA9PSB0cnVlKSB7CisJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKKwkJCQkoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpID09IHRydWUpCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sICgiXG4jIyNfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HXG5cbiIpKTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLCAoIlxuIyMjcG1sbWVwcml2LT5zaXRlc3VydmV5Y3RybC50cmFmZmljX2J1c3kgPT0gdHJ1ZVxuXG4iKSk7Ci0JCX0KKwogCX0gZWxzZSB7CiAJCWlmIChydHdfaXNfc2Nhbl9kZW55KHBhZGFwdGVyKSkgewogCQkJREJHXzg4RShGVU5DX0FEUFRfRk1UIjogc2NhbiBkZW55XG4iLCBGVU5DX0FEUFRfQVJHKHBhZGFwdGVyKSk7CkBAIC01MTQsNyArNDk5LDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC01MjUsNyArNTA5LDYgQEAKIAlpbnQgcmVzOwogCXU4IHJldDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywgKCJzZXRfODAyXzExX2F1dGgubW9kZSgpOiBtb2RlID0leFxuIiwgYXV0aG1vZGUpKTsKIApAQCAtNTQ1LDcgKzUyOCw2IEBACiAJZWxzZQogCQlyZXQgPSBmYWxzZTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTU2LDcgKzUzOCw2IEBACiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmKHBhZGFwdGVyLT5zZWN1cml0eXByaXYpOwogCXU4CQlyZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJa2V5aWQgPSB3ZXAtPktleUluZGV4ICYgMHgzZmZmZmZmZjsKIApAQCAtNTgxLDcgKzU2Miw3IEBACiAJCWJyZWFrOwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfc2V0XzgwMl8xMV9hZGRfd2VwOmJlZm9yIG1lbWNweSwgd2VwLT5LZXlMZW5ndGggPSAweCV4IHdlcC0+S2V5SW5kZXggPSAweCV4ICBrZXlpZCA9JXhcbiIsCisJCSAoInJ0d19zZXRfODAyXzExX2FkZF93ZXA6YmVmb3JlIG1lbWNweSwgd2VwLT5LZXlMZW5ndGggPSAweCV4IHdlcC0+S2V5SW5kZXggPSAweCV4ICBrZXlpZCA9JXhcbiIsCiAJCSB3ZXAtPktleUxlbmd0aCwgd2VwLT5LZXlJbmRleCwga2V5aWQpKTsKIAogCW1lbWNweSgmKHBzZWN1cml0eXByaXYtPmRvdDExRGVmS2V5W2tleWlkXS5za2V5WzBdKSwgJih3ZXAtPktleU1hdGVyaWFsKSwgd2VwLT5LZXlMZW5ndGgpOwpAQCAtNjExLDcgKzU5Miw2IEBACiAJaWYgKHJlcyA9PSBfRkFJTCkKIAkJcmV0ID0gZmFsc2U7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjE5LDcgKzU5OSw2IEBACiB7CiAJdTggcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAoa2V5aW5kZXggPj0gMHg4MDAwMDAwMCB8fCBwYWRhcHRlciA9PSBOVUxMKSB7CiAJCXJldCA9IGZhbHNlOwogCQlnb3RvIGV4aXQ7CkBAIC02MzgsNyArNjE3LDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02NTEsNyArNjI5LDYgQEAKIAl1OAliZ3JvdXB0a2V5ID0gZmFsc2U7LyogY2FuIGJlIHJlbW92ZWQgbGF0ZXIgKi8KIAl1OAlyZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCgoa2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApID09IDApICYmICgoa2V5LT5LZXlJbmRleCAmIDB4NDAwMDAwMDApID4gMCkpIHsKIAkJLyogIEl0IGlzIGludmFsaWQgdG8gY2xlYXIgYml0IDMxIGFuZCBzZXQgYml0IDMwLiBJZiB0aGUgbWluaXBvcnQgZHJpdmVyIGVuY291bnRlcnMgdGhpcyBjb21iaW5hdGlvbiwgKi8KQEAgLTk5Miw3ICs5NjksNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMDQsNyArOTgwLDYgQEAKIAl1OAlrZXlJbmRleCA9ICh1OClrZXktPktleUluZGV4ICYgMHgwMzsKIAl1OAlyZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKChrZXktPktleUluZGV4ICYgMHhiZmZmZmZmYykgPiAwKSB7CiAJCXJldCA9IF9GQUlMOwpAQCAtMTAzMiw3ICsxMDA3LDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYwppbmRleCBhZmFjNTM3Li40MmI0MWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2xlZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbGVkLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAlpZiAoKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB8fCAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSkKIAkJcmV0dXJuOwogCi0JX3NldF93b3JraXRlbSgmKHBMZWQtPkJsaW5rV29ya0l0ZW0pKTsKKwlzY2hlZHVsZV93b3JrKCYocExlZC0+QmxpbmtXb3JrSXRlbSkpOwogfQogCiAvKiAgKi8KQEAgLTgwLDcgKzgwLDcgQEAKIAogCV9pbml0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LCBCbGlua1RpbWVyQ2FsbGJhY2ssIHBMZWQpOwogCi0JX2luaXRfd29ya2l0ZW0oJihwTGVkLT5CbGlua1dvcmtJdGVtKSwgQmxpbmtXb3JrSXRlbUNhbGxiYWNrLCBwTGVkKTsKKwlJTklUX1dPUksoJihwTGVkLT5CbGlua1dvcmtJdGVtKSwgQmxpbmtXb3JrSXRlbUNhbGxiYWNrKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZS5jCmluZGV4IGM3MzgyMzAuLjc2OWQ0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZS5jCkBAIC0zMSwxMSArMzEsMTIgQEAKICNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgogI2luY2x1ZGUgPHJ0d19pb2N0bF9zZXQuaD4KICNpbmNsdWRlIDx1c2Jfb3NpbnRmLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiBleHRlcm4gdW5zaWduZWQgY2hhcglNQ1NfcmF0ZV8yUlsxNl07CiBleHRlcm4gdW5zaWduZWQgY2hhcglNQ1NfcmF0ZV8xUlsxNl07CiAKLWludAlfcnR3X2luaXRfbWxtZV9wcml2IChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCitpbnQgX3J0d19pbml0X21sbWVfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50CWk7CiAJdTgJKnBidWY7CkBAIC00Myw5ICs0NCw3IEBACiAJc3RydWN0IG1sbWVfcHJpdgkJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJaW50CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87Ci0KLQkvKiAgV2UgZG9uJ3QgbmVlZCB0byBtZW1zZXQgcGFkYXB0ZXItPlhYWCB0byB6ZXJvLCBiZWNhdXNlIGFkYXB0ZXIgaXMgYWxsb2NhdGVkIGJ5IHJ0d196dm1hbGxvYygpLiAqLworCS8qICBXZSBkb24ndCBuZWVkIHRvIG1lbXNldCBwYWRhcHRlci0+WFhYIHRvIHplcm8sIGJlY2F1c2UgYWRhcHRlciBpcyBhbGxvY2F0ZWQgYnkgdnphbGxvYygpLiAqLwogCiAJcG1sbWVwcml2LT5uaWNfaGRsID0gKHU4ICopcGFkYXB0ZXI7CiAKQEAgLTYyLDcgKzYxLDcgQEAKIAogCV9ydHdfbWVtc2V0KCZwbWxtZXByaXYtPmFzc29jX3NzaWQsIDAsIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCkpOwogCi0JcGJ1ZiA9IHJ0d196dm1hbGxvYyhNQVhfQlNTX0NOVCAqIChzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yaykpKTsKKwlwYnVmID0gdnphbGxvYyhNQVhfQlNTX0NOVCAqIChzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yaykpKTsKIAogCWlmIChwYnVmID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC04NywxMyArODYsMTAgQEAKIAlydHdfaW5pdF9tbG1lX3RpbWVyKHBhZGFwdGVyKTsKIAogZXhpdDoKLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcmVzOwogfQogCi0jaWYgZGVmaW5lZCAoQ09ORklHXzg4RVVfQVBfTU9ERSkKKyNpZiBkZWZpbmVkKENPTkZJR184OEVVX0FQX01PREUpCiBzdGF0aWMgdm9pZCBydHdfZnJlZV9tbG1lX2llX2RhdGEodTggKipwcGllLCB1MzIgKnBsZW4pCiB7CiAJa2ZyZWUoKnBwaWUpOwpAQCAtMTIyLDI0ICsxMTgsMTggQEAKIH0KICNlbmRpZgogCi12b2lkIF9ydHdfZnJlZV9tbG1lX3ByaXYgKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKK3ZvaWQgX3J0d19mcmVlX21sbWVfcHJpdihzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCiB7Ci1fZnVuY19lbnRlcl87Ci0KIAlydHdfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShwbWxtZXByaXYpOwogCiAJaWYgKHBtbG1lcHJpdikgewotCQlpZiAocG1sbWVwcml2LT5mcmVlX2Jzc19idWYpIHsKLQkJCXJ0d192bWZyZWUocG1sbWVwcml2LT5mcmVlX2Jzc19idWYsIE1BWF9CU1NfQ05UICogc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspKTsKLQkJfQorCQlpZiAocG1sbWVwcml2LT5mcmVlX2Jzc19idWYpCisJCQl2ZnJlZShwbWxtZXByaXYtPmZyZWVfYnNzX2J1Zik7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIGludAlfcnR3X2VucXVldWVfbmV0d29yayhzdHJ1Y3QgX19xdWV1ZSAqcXVldWUsIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQogewotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKHBuZXR3b3JrID09IE5VTEwpCiAJCWdvdG8gZXhpdDsKIApAQCAtMTUwLDkgKzE0MCw2IEBACiAJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAogZXhpdDoKLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTE2MCwyMiArMTQ3LDE4IEBACiB7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcms7CiAKLV9mdW5jX2VudGVyXzsKLQogCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwogCiAJaWYgKF9ydHdfcXVldWVfZW1wdHkocXVldWUpKSB7CiAJCXBuZXR3b3JrID0gTlVMTDsKIAl9IGVsc2UgewotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKGdldF9uZXh0KCZxdWV1ZS0+cXVldWUpLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YoKCZxdWV1ZS0+cXVldWUpLT5uZXh0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQlydHdfbGlzdF9kZWxldGUoJihwbmV0d29yay0+bGlzdCkpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHBuZXR3b3JrOwogfQogCkBAIC0xODUsMTcgKzE2OCwxNSBAQAogCXN0cnVjdCBfX3F1ZXVlICpmcmVlX3F1ZXVlID0gJnBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCA9IE5VTEw7CiAKLV9mdW5jX2VudGVyXzsKLQogCXNwaW5fbG9ja19iaCgmZnJlZV9xdWV1ZS0+bG9jayk7CiAKIAlpZiAoX3J0d19xdWV1ZV9lbXB0eShmcmVlX3F1ZXVlKSA9PSB0cnVlKSB7CiAJCXBuZXR3b3JrID0gTlVMTDsKIAkJZ290byBleGl0OwogCX0KLQlwbGlzdCA9IGdldF9uZXh0KCYoZnJlZV9xdWV1ZS0+cXVldWUpKTsKKwlwbGlzdCA9IGZyZWVfcXVldWUtPnF1ZXVlLm5leHQ7CiAKLQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0ICwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QgLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCXJ0d19saXN0X2RlbGV0ZSgmcG5ldHdvcmstPmxpc3QpOwogCkBAIC0yMTEsOCArMTkyLDYgQEAKIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCi1fZnVuY19leGl0XzsKLQogCXJldHVybiBwbmV0d29yazsKIH0KIApAQCAtMjIyLDEzICsyMDEsMTEgQEAKIAl1MzIgbGlmZXRpbWUgPSBTQ0FOUVVFVUVfTElGRVRJTUU7CiAJc3RydWN0IF9fcXVldWUgKmZyZWVfcXVldWUgPSAmKHBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbCk7CiAKLV9mdW5jX2VudGVyXzsKLQogCWlmIChwbmV0d29yayA9PSBOVUxMKQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAogCWlmIChwbmV0d29yay0+Zml4ZWQpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCWN1cnJfdGltZSA9IGppZmZpZXM7CiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB8fAogCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSkKQEAgLTIzNiwzMyArMjEzLDI2IEBACiAJaWYgKCFpc2ZyZWVhbGwpIHsKIAkJZGVsdGFfdGltZSA9IChjdXJyX3RpbWUgLSBwbmV0d29yay0+bGFzdF9zY2FubmVkKS9IWjsKIAkJaWYgKGRlbHRhX3RpbWUgPCBsaWZldGltZSkvKiAgdW5pdDpzZWMgKi8KLQkJCWdvdG8gZXhpdDsKKwkJCXJldHVybjsKIAl9CiAJc3Bpbl9sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIAlydHdfbGlzdF9kZWxldGUoJihwbmV0d29yay0+bGlzdCkpOwogCXJ0d19saXN0X2luc2VydF90YWlsKCYocG5ldHdvcmstPmxpc3QpLCAmKGZyZWVfcXVldWUtPnF1ZXVlKSk7CiAJcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZC0tOwogCXNwaW5fdW5sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKLQotZXhpdDoKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIF9ydHdfZnJlZV9uZXR3b3JrX25vbG9jayhzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYsIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQogewogCXN0cnVjdCBfX3F1ZXVlICpmcmVlX3F1ZXVlID0gJihwbWxtZXByaXYtPmZyZWVfYnNzX3Bvb2wpOwogCi1fZnVuY19lbnRlcl87CiAJaWYgKHBuZXR3b3JrID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCWlmIChwbmV0d29yay0+Zml4ZWQpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCXJ0d19saXN0X2RlbGV0ZSgmKHBuZXR3b3JrLT5saXN0KSk7CiAJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwbmV0d29yay0+bGlzdCksIGdldF9saXN0X2hlYWQoZnJlZV9xdWV1ZSkpOwogCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQtLTsKLWV4aXQ6Ci0KLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtMjc2LDI0ICsyNDYsMjIgQEAKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IE5VTEw7CiAJdTggemVyb19hZGRyW0VUSF9BTEVOXSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKIAotX2Z1bmNfZW50ZXJfOwotCWlmIChfcnR3X21lbWNtcCh6ZXJvX2FkZHIsIGFkZHIsIEVUSF9BTEVOKSkgeworCWlmICghbWVtY21wKHplcm9fYWRkciwgYWRkciwgRVRIX0FMRU4pKSB7CiAJCXBuZXR3b3JrID0gTlVMTDsKIAkJZ290byBleGl0OwogCX0KIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbm5lZF9xdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlIChwbGlzdCAhPSBwaGVhZCkgewotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICwgbGlzdCk7Ci0JCWlmIChfcnR3X21lbWNtcChhZGRyLCBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBFVEhfQUxFTikgPT0gdHJ1ZSkKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmsgLCBsaXN0KTsKKwkJaWYgKCFtZW1jbXAoYWRkciwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgRVRIX0FMRU4pKQogCQkJYnJlYWs7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAlpZiAocGxpc3QgPT0gcGhlYWQpCiAJCXBuZXR3b3JrID0gTlVMTDsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcG5ldHdvcms7CiB9CiAKQEAgLTMwNSwyOSArMjczLDI0IEBACiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgX19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKLQotCiAJc3Bpbl9sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gZmFsc2UpIHsKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlfcnR3X2ZyZWVfbmV0d29yayhwbWxtZXByaXYsIHBuZXR3b3JrLCBpc2ZyZWVhbGwpOwogCX0KIAlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci1fZnVuY19leGl0XzsKIH0KIAogaW50IHJ0d19pZl91cChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50IHJlczsKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwKIAkgICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gZmFsc2UpKSB7CkBAIC0zMzgsOCArMzAxLDYgQEAKIAl9IGVsc2UgewogCQlyZXMgPSAgdHJ1ZTsKIAl9Ci0KLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTM0NywxNCArMzA4LDEyIEBACiB7CiAJdTMyCWN1cnRpbWUgPSBqaWZmaWVzOwogCi1fZnVuY19lbnRlcl87CiAJcGlic3NbMF0gPSAweDAyOyAgLyogaW4gYWQtaG9jIG1vZGUgYml0MSBtdXN0IHNldCB0byAxICovCiAJcGlic3NbMV0gPSAweDExOwogCXBpYnNzWzJdID0gMHg4NzsKIAlwaWJzc1szXSA9ICh1OCkoY3VydGltZSAmIDB4ZmYpOy8qIHBbMF07ICovCiAJcGlic3NbNF0gPSAodTgpKChjdXJ0aW1lPj44KSAmIDB4ZmYpOy8qIHBbMV07ICovCiAJcGlic3NbNV0gPSAodTgpKChjdXJ0aW1lPj4xNikgJiAweGZmKTsvKiBwWzJdOyAqLwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuOwogfQogCkBAIC0zNjcsMTEgKzMyNiw5IEBACiB1MTYgcnR3X2dldF9jYXBhYmlsaXR5KHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3MpCiB7CiAJX19sZTE2CXZhbDsKLV9mdW5jX2VudGVyXzsKIAogCW1lbWNweSgodTggKikmdmFsLCBydHdfZ2V0X2NhcGFiaWxpdHlfZnJvbV9pZShic3MtPklFcyksIDIpOwogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gbGUxNl90b19jcHUodmFsKTsKIH0KIApAQCAtMzg1LDQ2ICszNDIsMzQgQEAKIAlyZXR1cm4gaWUgKyA4OwogfQogCi1pbnQJcnR3X2luaXRfbWxtZV9wcml2IChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpLyogc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2KSAqLworaW50IHJ0d19pbml0X21sbWVfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50CXJlczsKLV9mdW5jX2VudGVyXzsKIAlyZXMgPSBfcnR3X2luaXRfbWxtZV9wcml2KHBhZGFwdGVyKTsvKiAgKHBtbG1lcHJpdik7ICovCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCi12b2lkIHJ0d19mcmVlX21sbWVfcHJpdiAoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQordm9pZCBydHdfZnJlZV9tbG1lX3ByaXYoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgicnR3X2ZyZWVfbWxtZV9wcml2XG4iKSk7Ci0JX3J0d19mcmVlX21sbWVfcHJpdiAocG1sbWVwcml2KTsKLV9mdW5jX2V4aXRfOworCV9ydHdfZnJlZV9tbG1lX3ByaXYocG1sbWVwcml2KTsKIH0KIAogc3RhdGljIHN0cnVjdCB3bGFuX25ldHdvcmsgKnJ0d19hbGxvY19uZXR3b3JrKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKIHsKLQlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpwbmV0d29yazsKLV9mdW5jX2VudGVyXzsKLQlwbmV0d29yayA9IF9ydHdfYWxsb2NfbmV0d29yayhwbWxtZXByaXYpOwotX2Z1bmNfZXhpdF87Ci0JcmV0dXJuIHBuZXR3b3JrOworCXJldHVybiBfcnR3X2FsbG9jX25ldHdvcmsocG1sbWVwcml2KTsKIH0KIAogc3RhdGljIHZvaWQgcnR3X2ZyZWVfbmV0d29ya19ub2xvY2soc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LAogCQkJCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKIHsKLV9mdW5jX2VudGVyXzsKIAlfcnR3X2ZyZWVfbmV0d29ya19ub2xvY2socG1sbWVwcml2LCBwbmV0d29yayk7Ci1fZnVuY19leGl0XzsKIH0KIAogCiB2b2lkIHJ0d19mcmVlX25ldHdvcmtfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmRldiwgdTggaXNmcmVlYWxsKQogewotX2Z1bmNfZW50ZXJfOwogCV9ydHdfZnJlZV9uZXR3b3JrX3F1ZXVlKGRldiwgaXNmcmVlYWxsKTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtNDU4LDcgKzQwMyw3IEBACiBzdGF0aWMgaW50IGlzX3NhbWVfZXNzKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICphLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYikKIHsKIAlyZXR1cm4gKGEtPlNzaWQuU3NpZExlbmd0aCA9PSBiLT5Tc2lkLlNzaWRMZW5ndGgpICYmCi0JICAgICAgIF9ydHdfbWVtY21wKGEtPlNzaWQuU3NpZCwgYi0+U3NpZC5Tc2lkLCBhLT5Tc2lkLlNzaWRMZW5ndGgpOworCSAgICAgICAhbWVtY21wKGEtPlNzaWQuU3NpZCwgYi0+U3NpZC5Tc2lkLCBhLT5Tc2lkLlNzaWRMZW5ndGgpOwogfQogCiBpbnQgaXNfc2FtZV9uZXR3b3JrKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QpCkBAIC00NjYsNyArNDExLDYgQEAKIAkgdTE2IHNfY2FwLCBkX2NhcDsKIAlfX2xlMTYgbGVfc2NhcCwgbGVfZGNhcDsKIAotX2Z1bmNfZW50ZXJfOwogCW1lbWNweSgodTggKikmbGVfc2NhcCwgcnR3X2dldF9jYXBhYmlsaXR5X2Zyb21faWUoc3JjLT5JRXMpLCAyKTsKIAltZW1jcHkoKHU4ICopJmxlX2RjYXAsIHJ0d19nZXRfY2FwYWJpbGl0eV9mcm9tX2llKGRzdC0+SUVzKSwgMik7CiAKQEAgLTQ3NCwxMSArNDE4LDkgQEAKIAlzX2NhcCA9IGxlMTZfdG9fY3B1KGxlX3NjYXApOwogCWRfY2FwID0gbGUxNl90b19jcHUobGVfZGNhcCk7CiAKLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuICgoc3JjLT5Tc2lkLlNzaWRMZW5ndGggPT0gZHN0LT5Tc2lkLlNzaWRMZW5ndGgpICYmCi0JCSgoX3J0d19tZW1jbXAoc3JjLT5NYWNBZGRyZXNzLCBkc3QtPk1hY0FkZHJlc3MsIEVUSF9BTEVOKSkgPT0gdHJ1ZSkgJiYKLQkJKChfcnR3X21lbWNtcChzcmMtPlNzaWQuU3NpZCwgZHN0LT5Tc2lkLlNzaWQsIHNyYy0+U3NpZC5Tc2lkTGVuZ3RoKSkgPT0gdHJ1ZSkgJiYKKwkJKCghbWVtY21wKHNyYy0+TWFjQWRkcmVzcywgZHN0LT5NYWNBZGRyZXNzLCBFVEhfQUxFTikpID09IHRydWUpICYmCisJCSgoIW1lbWNtcChzcmMtPlNzaWQuU3NpZCwgZHN0LT5Tc2lkLlNzaWQsIHNyYy0+U3NpZC5Tc2lkTGVuZ3RoKSkgPT0gdHJ1ZSkgJiYKIAkJKChzX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA9PQogCQkoZF9jYXAgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpICYmCiAJCSgoc19jYXAgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQpAQCAtNDkxLDI1ICs0MzMsMjMgQEAKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpwd2xhbiA9IE5VTEw7CiAJc3RydWN0CXdsYW5fbmV0d29yawkqb2xkZXN0ID0gTlVMTDsKIAotX2Z1bmNfZW50ZXJfOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKIAotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcHdsYW4gPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXB3bGFuID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQlpZiAoIXB3bGFuLT5maXhlZCkgewogCQkJaWYgKG9sZGVzdCA9PSBOVUxMIHx8IHRpbWVfYWZ0ZXIob2xkZXN0LT5sYXN0X3NjYW5uZWQsIHB3bGFuLT5sYXN0X3NjYW5uZWQpKQogCQkJCW9sZGVzdCA9IHB3bGFuOwogCQl9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIG9sZGVzdDsKIH0KIApAQCAtNTIyLDcgKzQ2Miw2IEBACiAJdTggc3FfZmluYWw7CiAJbG9uZyByc3NpX2ZpbmFsOwogCi1fZnVuY19lbnRlcl87CiAJcnR3X2hhbF9hbnRkaXZfcnNzaV9jb21wYXJlZChwYWRhcHRlciwgZHN0LCBzcmMpOyAvKiB0aGlzIHdpbGwgdXBkYXRlIHNyYy5Sc3NpLCBuZWVkIGNvbnNpZGVyIGFnYWluICovCiAKIAkvKiBUaGUgcnVsZSBiZWxvdyBpcyAxLzUgZm9yIHNhbXBsZSB2YWx1ZSwgNC81IGZvciBoaXN0b3J5IHZhbHVlICovCkBAIC01NTMsMjIgKzQ5MiwxOCBAQAogCWRzdC0+UGh5SW5mby5TaWduYWxRdWFsaXR5ID0gc3FfZmluYWw7CiAJZHN0LT5Sc3NpID0gcnNzaV9maW5hbDsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9jdXJyZW50X25ldHdvcmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaykKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmKGFkYXB0ZXItPm1sbWVwcml2KTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkgJiYKIAkgICAgKGlzX3NhbWVfbmV0d29yaygmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yayksIHBuZXR3b3JrKSkpIHsKIAkJdXBkYXRlX25ldHdvcmsoJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmspLCBwbmV0d29yaywgYWRhcHRlciwgdHJ1ZSk7CiAJCXJ0d191cGRhdGVfcHJvdGVjdGlvbihhZGFwdGVyLCAocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLklFcykgKyBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSwKIAkJCQkgICAgICBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuSUVMZW5ndGgpOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtNTgzLDI0ICs1MTgsMjIgQEAKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCSpwbmV0d29yayA9IE5VTEw7CiAJc3RydWN0IHdsYW5fbmV0d29yawkqb2xkZXN0ID0gTlVMTDsKIAotX2Z1bmNfZW50ZXJfOwotCiAJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrCT0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yawk9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJaWYgKGlzX3NhbWVfbmV0d29yaygmKHBuZXR3b3JrLT5uZXR3b3JrKSwgdGFyZ2V0KSkKIAkJCWJyZWFrOwogCQlpZiAoKG9sZGVzdCA9PSAoKHN0cnVjdCB3bGFuX25ldHdvcmsgKikwKSkgfHwKIAkJICAgIHRpbWVfYWZ0ZXIob2xkZXN0LT5sYXN0X3NjYW5uZWQsIHBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpKQogCQkJb2xkZXN0ID0gcG5ldHdvcms7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQogCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLwpAQCAtNjYzLDI3ICs1OTYsMjYgQEAKIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHJ0d19hZGRfbmV0d29yayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspCiB7Ci1fZnVuY19lbnRlcl87CiAjaWYgZGVmaW5lZChDT05GSUdfODhFVV9QMlApCiAJcnR3X3dsYW5fYnNzaWRfZXhfcmVtb3ZlX3AycF9hdHRyKHBuZXR3b3JrLCBQMlBfQVRUUl9HUk9VUF9JTkZPKTsKICNlbmRpZgogCXVwZGF0ZV9jdXJyZW50X25ldHdvcmsoYWRhcHRlciwgcG5ldHdvcmspOwogCXJ0d191cGRhdGVfc2Nhbm5lZF9uZXR3b3JrKGFkYXB0ZXIsIHBuZXR3b3JrKTsKLV9mdW5jX2V4aXRfOwogfQogCi0vKiBzZWxlY3QgdGhlIGRlc2lyZWQgbmV0d29yayBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgKGkpYnNzLiAqLwotLyogIGNoZWNrIGl0ZW1zOgkoMSkgc2VjdXJpdHkgKi8KLS8qIAkJCSgyKSBuZXR3b3JrX3R5cGUgKi8KLS8qIAkJCSgzKSBXTU0gKi8KLS8qCQkJKDQpIEhUICovCi0vKgkJCSg1KSBvdGhlcnMgKi8KKy8qCisgKiBzZWxlY3QgdGhlIGRlc2lyZWQgbmV0d29yayBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgKGkpYnNzLgorICogY2hlY2sgaXRlbXM6CSgxKSBzZWN1cml0eQorICoJCQkoMikgbmV0d29ya190eXBlCisgKgkJCSgzKSBXTU0KKyAqCQkJKDQpIEhUCisgKgkJCSg1KSBvdGhlcnMKKyAqLwogc3RhdGljIGludCBydHdfaXNfZGVzaXJlZF9uZXR3b3JrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKIHsKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7CkBAIC03MjgsOSArNjYwLDcgQEAKIC8qIFRPRE86IFBlcnJ5OiBGb3IgUG93ZXIgTWFuYWdlbWVudCAqLwogdm9pZCBydHdfYXRpbWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgLCB1OCAqcGJ1ZikKIHsKLV9mdW5jX2VudGVyXzsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoInJlY2VpdmUgYXRpbWRvbmVfZXZldFxuIikpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuOwogfQogCkBAIC03NDEsOCArNjcxLDYgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcms7CiAJc3RydWN0CW1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJihhZGFwdGVyLT5tbG1lcHJpdik7CiAKLV9mdW5jX2VudGVyXzsKLQogCXBuZXR3b3JrID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcGJ1ZjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d19zdXJ2ZXlfZXZlbnRfY2FsbGJhY2ssIHNzaWQ9JXNcbiIsICBwbmV0d29yay0+U3NpZC5Tc2lkKSk7CkBAIC03NTYsNyArNjg0LDcgQEAKIAogCS8qICB1cGRhdGUgSUJTU19uZXR3b3JrICdzIHRpbWVzdGFtcCAqLwogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgPT0gdHJ1ZSkgewotCQlpZiAoX3J0d19tZW1jbXAoJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcyksIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAoJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcyksIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTikpIHsKIAkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmlic3Nfd2xhbiA9IE5VTEw7CiAKIAkJCW1lbWNweShwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuSUVzLCBwbmV0d29yay0+SUVzLCA4KTsKQEAgLTc4MSwyMCArNzA5LDE0IEBACiBleGl0OgogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuOwogfQogCi0KLQogdm9pZCBydHdfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciwgdTggKnBidWYpCiB7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJihhZGFwdGVyLT5tbG1lcHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwogCi1fZnVuY19lbnRlcl87CiAJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCiAJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewpAQCAtODg0LDcgKzgwNiw2IEBACiAJcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5ic3NfY250ID09IDApCiAJCXJ0d19oYWxfc3Jlc2V0X3Jlc2V0KGFkYXB0ZXIpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2R1bW15X2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyICwgdTggKnBidWYpCkBAIC05MDEsMTcgKzgyMiwxNSBAQAogCXN0cnVjdCBfX3F1ZXVlICpzY2FuX3F1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkLCAqcHRlbXA7CiAKLV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sICgiK2ZyZWVfc2NhbnF1ZXVlXG4iKSk7CiAJc3Bpbl9sb2NrX2JoKCZzY2FuX3F1ZXVlLT5sb2NrKTsKIAlzcGluX2xvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5fcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAocGxpc3QgIT0gcGhlYWQpIHsKLQkJcHRlbXAgPSBnZXRfbmV4dChwbGlzdCk7CisJCXB0ZW1wID0gcGxpc3QtPm5leHQ7CiAJCXJ0d19saXN0X2RlbGV0ZShwbGlzdCk7CiAJCXJ0d19saXN0X2luc2VydF90YWlsKHBsaXN0LCAmZnJlZV9xdWV1ZS0+cXVldWUpOwogCQlwbGlzdCA9IHB0ZW1wOwpAQCAtOTIwLDggKzgzOSw2IEBACiAKIAlzcGluX3VubG9ja19iaCgmZnJlZV9xdWV1ZS0+bG9jayk7CiAJc3Bpbl91bmxvY2tfYmgoJnNjYW5fcXVldWUtPmxvY2spOwotCi1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTkzNCw4ICs4NTEsNiBAQAogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwogCi1fZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLCAoIitydHdfZnJlZV9hc3NvY19yZXNvdXJjZXNcbiIpKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKIAkJICgidGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcz0lcE0gc3NpZD0lc1xuIiwKQEAgLTk3OSw3ICs4OTQsNiBAQAogCWlmIChsb2NrX3NjYW5uZWRfcXVldWUpCiAJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CiAJcG1sbWVwcml2LT5rZXlfbWFzayA9IDA7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTk4OSw4ICs5MDMsNiBAQAogewogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiK3J0d19pbmRpY2F0ZV9jb25uZWN0XG4iKSk7CiAKIAlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKQEAgLTEwMDgsNyArOTIwLDYgQEAKIAlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIi1ydHdfaW5kaWNhdGVfY29ubmVjdDogZndfc3RhdGU9MHglMDh4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTEwMTgsNyArOTI5LDYgQEAKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCIrcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3RcbiIpKTsKIAogCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyB8IFdJRklfVU5ERVJfV1BTKTsKQEAgLTEwMzgsOCArOTQ4LDYgQEAKIAlwMnBfcHNfd2tfY21kKHBhZGFwdGVyLCBQMlBfUFNfRElTQUJMRSwgMSk7CiAKIAlydHdfbHBzX2N0cmxfd2tfY21kKHBhZGFwdGVyLCBMUFNfQ1RSTF9ESVNDT05ORUNULCAxKTsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIGlubGluZSB2b2lkIHJ0d19pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGFib3J0ZWQpCkBAIC0xMTAwLDkgKzEwMDgsMTIgQEAKIAkJCV9ydHdfbWVtc2V0KCh1OCAqKSZwc3RhLT5kb3QxMXR4cG4sIDAsIHNpemVvZih1bmlvbiBwbjQ4KSk7CiAJCQlfcnR3X21lbXNldCgodTggKikmcHN0YS0+ZG90MTFyeHBuLCAwLCBzaXplb2YodW5pb24gcG40OCkpOwogCQl9Ci0JCS8qIAlDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTIvMDcvMjEgKi8KLQkJLyogCVdoZW4gZG9pbmcgdGhlIFdQUywgdGhlIHdwc19pZV9sZW4gd29uJ3QgZXF1YWwgdG8gMCAqLwotCQkvKiAJQW5kIHRoZSBXaS1GaSBkcml2ZXIgc2hvdWxkbid0IGFsbG93IHRoZSBkYXRhIHBhY2tldCB0byBiZSB0cmFtc21pdHRlZC4gKi8KKwkJLyoKKwkJICogQ29tbWVudGVkIGJ5IEFsYmVydCAyMDEyLzA3LzIxCisJCSAqIFdoZW4gZG9pbmcgdGhlIFdQUywgdGhlIHdwc19pZV9sZW4gd29uJ3QgZXF1YWwgdG8gMAorCQkgKiBBbmQgdGhlIFdpLUZpIGRyaXZlciBzaG91bGRuJ3QgYWxsb3cgdGhlIGRhdGEKKwkJICogcGFja2V0IHRvIGJlIHRyYW1zbWl0dGVkLgorCQkgKi8KIAkJaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYud3BzX2llX2xlbiAhPSAwKSB7CiAJCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IHRydWU7CiAJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZV9sZW4gPSAwOwpAQCAtMTIwNiw4ICsxMTE3LDYgQEAKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCSpwY3VyX3dsYW4gPSBOVUxMLCAqcHRhcmdldF93bGFuID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQJCXRoZV9zYW1lX21hY2FkZHIgPSBmYWxzZTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiam9pbmJzcyBldmVudCBjYWxsIGJhY2sgcmVjZWl2ZWQgd2l0aCByZXM9JWRcbiIsIHBuZXR3b3JrLT5qb2luX3JlcykpOwogCiAJcnR3X2dldF9lbmNyeXB0X2RlY3J5cHRfZnJvbV9yZWdpc3RyeXByaXYoYWRhcHRlcik7CkBAIC0xMjE4LDEyICsxMTI3LDEyIEBACiAJZWxzZQogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIkBAQEBAICAgcnR3X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2sgZm9yIFNTaWQ6JXNcbiIsIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkKSk7CiAKLQl0aGVfc2FtZV9tYWNhZGRyID0gX3J0d19tZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgRVRIX0FMRU4pOworCXRoZV9zYW1lX21hY2FkZHIgPSAhbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKIAogCXBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KCZwbmV0d29yay0+bmV0d29yayk7CiAJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCA+IHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJcblxuICoqKmpvaW5ic3NfZXZ0X2NhbGxiYWNrIHJldHVybiBhIHdyb25nIGJzcyAqKipcblxuIikpOwotCQlnb3RvIGlnbm9yZV9ub2xvY2s7CisJCXJldHVybjsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CkBAIC0xMzE5LDI3ICsxMjI4LDIxIEBACiAKIGlnbm9yZV9qb2luYnNzX2NhbGxiYWNrOgogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotaWdub3JlX25vbG9jazoKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19qb2luYnNzX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqcGJ1ZikKIHsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCSpwbmV0d29yawk9IChzdHJ1Y3Qgd2xhbl9uZXR3b3JrICopcGJ1ZjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrKGFkYXB0ZXIsIHBuZXR3b3JrLT5qb2luX3Jlcyk7CiAKIAlydHdfb3NfeG1pdF9zY2hlZHVsZShhZGFwdGVyKTsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB1OCBzZWFyY2hfbWF4X21hY19pZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJdTggbWFjX2lkOwotI2lmIGRlZmluZWQgKENPTkZJR184OEVVX0FQX01PREUpCisjaWYgZGVmaW5lZChDT05GSUdfODhFVV9BUF9NT0RFKQogCXU4IGFpZDsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmKHBhZGFwdGVyLT5tbG1lcHJpdik7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKQEAgLTEzNDcsNyArMTI1MCw3IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihwYWRhcHRlci0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKLSNpZiBkZWZpbmVkIChDT05GSUdfODhFVV9BUF9NT0RFKQorI2lmIGRlZmluZWQoQ09ORklHXzg4RVVfQVBfTU9ERSkKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7CiAJCWZvciAoYWlkID0gKHBzdGFwcml2LT5tYXhfbnVtX3N0YSk7IGFpZCA+IDA7IGFpZC0tKSB7CiAJCQlpZiAocHN0YXByaXYtPnN0YV9haWRbYWlkLTFdICE9IE5VTEwpCkBAIC0xMzg4LDE5ICsxMjkxLDE3IEBACiAJc3RydWN0IHdsYW5fbmV0d29yawkqY3VyX25ldHdvcmsgPSAmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmspOwogCXN0cnVjdCB3bGFuX25ldHdvcmsJKnB0YXJnZXRfd2xhbiA9IE5VTEw7CiAKLV9mdW5jX2VudGVyXzsKLQogCWlmIChydHdfYWNjZXNzX2N0cmwoYWRhcHRlciwgcHN0YXNzb2MtPm1hY2FkZHIpID09IGZhbHNlKQogCQlyZXR1cm47CiAKLSNpZiBkZWZpbmVkIChDT05GSUdfODhFVV9BUF9NT0RFKQorI2lmIGRlZmluZWQoQ09ORklHXzg4RVVfQVBfTU9ERSkKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7CiAJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8oJmFkYXB0ZXItPnN0YXByaXYsIHBzdGFzc29jLT5tYWNhZGRyKTsKIAkJaWYgKHBzdGEpIHsKIAkJCWFwX3N0YV9pbmZvX2RlZmVyX3VwZGF0ZShhZGFwdGVyLCBwc3RhKTsKIAkJCXJ0d19zdGFzc29jX2h3X3JwdChhZGFwdGVyLCBwc3RhKTsKIAkJfQotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAl9CiAjZW5kaWYKIAkvKiBmb3IgQUQtSE9DIG1vZGUgKi8KQEAgLTE0MDgsMTIgKzEzMDksMTIgQEAKIAlpZiAocHN0YSAhPSBOVUxMKSB7CiAJCS8qIHRoZSBzdGEgaGF2ZSBiZWVuIGluIHN0YV9pbmZvX3F1ZXVlID0+IGRvIG5vdGhpbmcgKi8KIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJFcnJvcjogcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2s6IHN0YSBoYXMgYmVlbiBpbiBzdGFfaGFzaF9xdWV1ZVxuIikpOwotCQlnb3RvIGV4aXQ7IC8qIGJldHdlZW4gZHJ2IGhhcyByZWNlaXZlZCB0aGlzIGV2ZW50IGJlZm9yZSBhbmQgIGZ3IGhhdmUgbm90IHlldCB0byBzZXQga2V5IHRvIENBTV9FTlRSWSkgKi8KKwkJcmV0dXJuOyAvKiBiZXR3ZWVuIGRydiBoYXMgcmVjZWl2ZWQgdGhpcyBldmVudCBiZWZvcmUgYW5kICBmdyBoYXZlIG5vdCB5ZXQgdG8gc2V0IGtleSB0byBDQU1fRU5UUlkpICovCiAJfQogCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbygmYWRhcHRlci0+c3RhcHJpdiwgcHN0YXNzb2MtPm1hY2FkZHIpOwogCWlmIChwc3RhID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJDYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrXG4iKSk7Ci0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCX0KIAkvKiB0byBkbzogaW5pdCBzdGFfaW5mbyB2YXJpYWJsZSAqLwogCXBzdGEtPnFvc19vcHRpb24gPSAwOwpAQCAtMTQ0MCw4ICsxMzQxLDYgQEAKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAJbWxtZWV4dF9zdGFfYWRkX2V2ZW50X2NhbGxiYWNrKGFkYXB0ZXIsIHBzdGEpOwotZXhpdDoKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zdGFkZWxfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKQpAQCAtMTQ1Niw4ICsxMzU1LDYgQEAKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmspOwogCi1fZnVuY19lbnRlcl87Ci0KIAlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZhZGFwdGVyLT5zdGFwcml2LCBwc3RhZGVsLT5tYWNhZGRyKTsKIAlpZiAocHN0YSkKIAkJbWFjX2lkID0gcHN0YS0+bWFjX2lkOwpAQCAtMTU0MSwxNCArMTQzOCwxMSBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2Nwd21fZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1ZikKIHsKLV9mdW5jX2VudGVyXzsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIitydHdfY3B3bV9ldmVudF9jYWxsYmFjayAhISFcbiIpKTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtMTU2MCw4ICsxNDU0LDYgQEAKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7CiAJaW50IGRvX2pvaW5fcjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJREJHXzg4RSgiJXMsIGZ3X3N0YXRlPSV4XG4iLCBfX2Z1bmNfXywgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CiAKIAlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKQEAgLTE1OTIsNyArMTQ4NCw2IEBACiAJCWZyZWVfc2NhbnF1ZXVlKHBtbG1lcHJpdik7LyogICovCiAJfQogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC0xNjU4LDE0ICsxNTQ5LDEyIEBACiAJCS8qICBleHBpcmUgTkFUMi41IGVudHJ5ICovCiAJCW5hdDI1X2RiX2V4cGlyZShhZGFwdGVyKTsKIAotCQlpZiAoYWRhcHRlci0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcyA+IDApIHsKKwkJaWYgKGFkYXB0ZXItPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MgPiAwKQogCQkJYWRhcHRlci0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcy0tOwotCQl9CiAKIAkJLyogIGR1ZSB0byBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGRlcigpIGlzIGNhbGxlZCBldmVyeSAyIHNlY29uZHMgKi8KLQkJaWYgKGFkYXB0ZXItPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MgPiAwKSB7CisJCWlmIChhZGFwdGVyLT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzID4gMCkKIAkJCWFkYXB0ZXItPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MtLTsKLQkJfQogCX0KIAogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTY4NywxNCArMTU3NiwxNCBAQAogCiAJLyogY2hlY2sgYnNzaWQsIGlmIG5lZWRlZCAqLwogCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkKSB7Ci0JCWlmICghX3J0d19tZW1jbXAoY29tcGV0aXRvci0+bmV0d29yay5NYWNBZGRyZXNzLCBwbWxtZXByaXYtPmFzc29jX2Jzc2lkLCBFVEhfQUxFTikpCisJCWlmIChtZW1jbXAoY29tcGV0aXRvci0+bmV0d29yay5NYWNBZGRyZXNzLCBwbWxtZXByaXYtPmFzc29jX2Jzc2lkLCBFVEhfQUxFTikpCiAJCQlnb3RvIGV4aXQ7CiAJfQogCiAJLyogY2hlY2sgc3NpZCwgaWYgbmVlZGVkICovCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkICYmIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoKSB7CisJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoKSB7CiAJCWlmIChjb21wZXRpdG9yLT5uZXR3b3JrLlNzaWQuU3NpZExlbmd0aCAhPSBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCB8fAotCQkgICAgX3J0d19tZW1jbXAoY29tcGV0aXRvci0+bmV0d29yay5Tc2lkLlNzaWQsIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkLCBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCkgPT0gZmFsc2UpCisJCSAgICAhbWVtY21wKGNvbXBldGl0b3ItPm5ldHdvcmsuU3NpZC5Tc2lkLCBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZCwgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGgpID09IGZhbHNlKQogCQkJZ290byBleGl0OwogCX0KIApAQCAtMTc0MiwyMCArMTYzMSwxOCBAQAogCXN0cnVjdAl3bGFuX25ldHdvcmsJKmNhbmRpZGF0ZSA9IE5VTEw7CiAJdTgJc3VwcF9hbnRfZGl2ID0gZmFsc2U7CiAKLV9mdW5jX2VudGVyXzsKLQogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKIAlhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcG1sbWVwcml2LT5uaWNfaGRsOwotCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwaGVhZCk7CisJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBoZWFkLT5uZXh0OwogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBtbG1lcHJpdi0+cHNjYW5uZWQpKSB7Ci0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocG1sbWVwcml2LT5wc2Nhbm5lZCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBtbG1lcHJpdi0+cHNjYW5uZWQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAocG5ldHdvcmsgPT0gTlVMTCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCIlcyByZXR1cm4gX0ZBSUw6KHBuZXR3b3JrPT1OVUxMKVxuIiwgX19mdW5jX18pKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9Ci0JCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwbWxtZXByaXYtPnBzY2FubmVkKTsKKwkJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBtbG1lcHJpdi0+cHNjYW5uZWQtPm5leHQ7CiAJCXJ0d19jaGVja19qb2luX2NhbmRpZGF0ZShwbWxtZXByaXYsICZjYW5kaWRhdGUsIHBuZXR3b3JrKTsKIAl9CiAJaWYgKGNhbmRpZGF0ZSA9PSBOVUxMKSB7CkBAIC0xNzkyLDkgKzE2NzksNiBAQAogCiBleGl0OgogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTgwNSw4ICsxNjg5LDYgQEAKIAlzdHJ1Y3QJY21kX3ByaXYgKnBjbWRwcml2ID0gJihhZGFwdGVyLT5jbWRwcml2KTsKIAlpbnQJCXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87Ci0KIAlwY21kID0gKHN0cnVjdAljbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBjbWQgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsgIC8qIHRyeSBhZ2FpbiAqLwpAQCAtMTgzMiw3ICsxNzE0LDYgQEAKIAkJIHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0pKTsKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBjbWQpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE4NDUsNyArMTcyNiw2IEBACiAJc3RydWN0IG1sbWVfcHJpdgkJKnBtbG1lcHJpdiA9ICYoYWRhcHRlci0+bWxtZXByaXYpOwogCWludAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCXBjbWQgPSAoc3RydWN0CWNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0CWNtZF9vYmopKTsKIAlpZiAocGNtZCA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOyAgLyogdHJ5IGFnYWluICovCkBAIC0xOTE0LDcgKzE3OTQsNiBAQAogCV9ydHdfaW5pdF9saXN0aGVhZCgmcGNtZC0+bGlzdCk7CiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwY21kKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xOTQ2LDE3ICsxODI1LDE1IEBACiAJcmV0dXJuIGllbGVuZ3RoOwogfQogCi0vKiAgKi8KLS8qICBQb3J0ZWQgZnJvbSA4MTg1OiBJc0luUHJlQXV0aEtleUxpc3QoKS4gKFJlbmFtZWQgZnJvbSBTZWNJc0luUHJlQXV0aEtleUxpc3QoKSwgMjAwNi0xMC0xMy4pICovCi0vKiAgQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDUtMDcuICovCi0vKiAgKi8KLS8qICBTZWFyY2ggYnkgQlNTSUQsICovCi0vKiAgUmV0dXJuIFZhbHVlOiAqLwotLyogCQktMQkJOmlmIHRoZXJlIGlzIG5vIHByZS1hdXRoIGtleSBpbiB0aGUgIHRhYmxlICovCi0vKiAJCT49IDAJCTppZiB0aGVyZSBpcyBwcmUtYXV0aCBrZXksIGFuZCAgIHJldHVybiB0aGUgZW50cnkgaWQgKi8KLS8qICAqLwotLyogICovCi0KKy8qCisgKiBQb3J0ZWQgZnJvbSA4MTg1OiBJc0luUHJlQXV0aEtleUxpc3QoKS4KKyAqIChSZW5hbWVkIGZyb20gU2VjSXNJblByZUF1dGhLZXlMaXN0KCksIDIwMDYtMTAtMTMuKQorICogQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDUtMDcuCisgKiBTZWFyY2ggYnkgQlNTSUQsCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJLTEJOmlmIHRoZXJlIGlzIG5vIHByZS1hdXRoIGtleSBpbiB0aGUgdGFibGUKKyAqCQk+PSAwCTppZiB0aGVyZSBpcyBwcmUtYXV0aCBrZXksIGFuZCByZXR1cm4gdGhlIGVudHJ5IGlkCisgKi8KIHN0YXRpYyBpbnQgU2VjSXNJblBNS0lETGlzdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggKmJzc2lkKQogewogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJkFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKQEAgLTE5NjQsNyArMTg0MSw3IEBACiAKIAlkbyB7CiAJCWlmICgocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2ldLmJVc2VkKSAmJgotCQkgICAgKF9ydHdfbWVtY21wKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5Cc3NpZCwgYnNzaWQsIEVUSF9BTEVOKSA9PSB0cnVlKSkgeworCQkgICAgKCFtZW1jbXAocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2ldLkJzc2lkLCBic3NpZCwgRVRIX0FMRU4pKSkgewogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlpKys7CkBAIC0xOTczLDExICsxODUwLDkgQEAKIAogCX0gd2hpbGUgKGkgPCBOVU1fUE1LSURfQ0FDSEUpOwogCi0JaWYgKGkgPT0gTlVNX1BNS0lEX0NBQ0hFKSB7CisJaWYgKGkgPT0gTlVNX1BNS0lEX0NBQ0hFKQogCQlpID0gLTE7LyogIENvdWxkIG5vdCBmaW5kLiAqLwotCX0gZWxzZSB7Ci0JCS8qICBUaGVyZSBpcyBvbmUgUHJlLUF1dGhlbnRpY2F0aW9uIEtleSBmb3IgdGhlIHNwZWNpZmljIEJTU0lELiAqLwotCX0KKwogCXJldHVybiBpOwogfQogCkBAIC0yMDE4LDggKzE4OTMsNiBAQAogCXVpbnQJbmRpc2F1dGhtb2RlID0gcHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlOwogCXVpbnQgbmRpc3NlY3VyaXR5dHlwZSA9IHBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzOwogCi1fZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAogCQkgKCIrcnR3X3Jlc3RydWN0X3NlY19pZTogbmRpc2F1dGhtb2RlPSVkIG5kaXNzZWN1cml0eXR5cGU9JWRcbiIsCiAJCSAgbmRpc2F1dGhtb2RlLCBuZGlzc2VjdXJpdHl0eXBlKSk7CkBAIC0yMDUyLDkgKzE5MjUsNiBAQAogCQlpZiAoYXV0aG1vZGUgPT0gX1dQQTJfSUVfSURfKQogCQkJaWVsZW5ndGggPSBydHdfYXBwZW5kX3Bta2lkKGFkYXB0ZXIsIGlFbnRyeSwgb3V0X2llLCBpZWxlbmd0aCk7CiAJfQotCi1fZnVuY19leGl0XzsKLQogCXJldHVybiBpZWxlbmd0aDsKIH0KIApAQCAtMjA2NSw4ICsxOTM1LDYgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgICAqcGRldl9uZXR3b3JrID0gJnByZWdpc3RyeXByaXYtPmRldl9uZXR3b3JrOwogCXU4ICpteWh3YWRkciA9IG15aWQocGVlcHJpdik7CiAKLV9mdW5jX2VudGVyXzsKLQogCW1lbWNweShwZGV2X25ldHdvcmstPk1hY0FkZHJlc3MsIG15aHdhZGRyLCBFVEhfQUxFTik7CiAKIAltZW1jcHkoJnBkZXZfbmV0d29yay0+U3NpZCwgJnByZWdpc3RyeXByaXYtPnNzaWQsIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCkpOwpAQCAtMjA3Nyw4ICsxOTQ1LDYgQEAKIAlwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRkhDb25maWcuSG9wUGF0dGVybiA9IDA7CiAJcGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkZIQ29uZmlnLkhvcFNldCA9IDA7CiAJcGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkZIQ29uZmlnLkR3ZWxsVGltZSA9IDA7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQpAQCAtMjA4OSw4ICsxOTU1LDYgQEAKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0CXdsYW5fbmV0d29yawkqY3VyX25ldHdvcmsgPSAmYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcms7CiAKLV9mdW5jX2VudGVyXzsKLQogCXBkZXZfbmV0d29yay0+UHJpdmFjeSA9IChwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID4gMCA/IDEgOiAwKTsgLyogIGFkaG9jIG5vIDgwMi4xeCAqLwogCiAJcGRldl9uZXR3b3JrLT5Sc3NpID0gMDsKQEAgLTIxNDAsMTMgKzIwMDQsMTAgQEAKIAogCS8qIG5vdGVzOiB0cmFuc2xhdGUgSUVMZW5ndGggJiBMZW5ndGggYWZ0ZXIgYXNzaWduIHRoZSBMZW5ndGggdG8gY21kc3ogaW4gY3JlYXRlYnNzX2NtZCgpOyAqLwogCS8qIHBkZXZfbmV0d29yay0+SUVMZW5ndGggPSBjcHVfdG9fbGUzMihzeik7ICovCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfZ2V0X2VuY3J5cHRfZGVjcnlwdF9mcm9tX3JlZ2lzdHJ5cHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLV9mdW5jX2VudGVyXzsKLV9mdW5jX2V4aXRfOwogfQogCiAvKiB0aGUgZnVuY3Rpb24gaXMgYXQgcGFzc2l2ZV9sZXZlbCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCmluZGV4IDZmN2U0MTUuLjNlZDU5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCXsweDAzfSwJLyogMHg0MSwgUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTl8yRyAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fbWFwIFJUV19DSEFOTkVMX1BMQU5fTUFQX1JFQUxURUtfREVGSU5FID0gezB4MDN9OyAvKiB1c2UgdGhlIGNvbmJpbmF0aW9uIGZvciBtYXggY2hhbm5lbCBudW1iZXJzICovCitzdGF0aWMgc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl9tYXAgUlRXX0NIQU5ORUxfUExBTl9NQVBfUkVBTFRFS19ERUZJTkUgPSB7MHgwM307IC8qIHVzZSB0aGUgY29tYmluYXRpb24gZm9yIG1heCBjaGFubmVsIG51bWJlcnMgKi8KIAogLyoKICAqIFNlYXJjaCB0aGUgQHBhcmFtIGNoYW5uZWxfbnVtIGluIGdpdmVuIEBwYXJhbSBjaGFubmVsX3NldApAQCAtNDE0LDIxICs0MTQsMjEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9tZ3RfZGlzcGF0Y2hlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZSwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgdm9pZCBfbWd0X2Rpc3BhdGNoZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgbWxtZV9oYW5kbGVyICpwdGFibGUsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCiAJICBpZiAocHRhYmxlLT5mdW5jKSB7CiAJIC8qIHJlY2VpdmUgdGhlIGZyYW1lcyB0aGF0IHJhKGExKSBpcyBteSBhZGRyZXNzIG9yIHJhKGExKSBpcyBiYyBhZGRyZXNzLiAqLwotCQlpZiAoIV9ydHdfbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pICYmCi0JCSAgICAhX3J0d19tZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgYmNfYWRkciwgRVRIX0FMRU4pKQorCQlpZiAobWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pICYmCisJCSAgICBtZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgYmNfYWRkciwgRVRIX0FMRU4pKQogCQkJcmV0dXJuOwogCQlwdGFibGUtPmZ1bmMocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKIAl9CiB9CiAKLXZvaWQgbWd0X2Rpc3BhdGNoZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3ZvaWQgbWd0X2Rpc3BhdGNoZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJaW50IGluZGV4OwogCXN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZTsKQEAgLTQzNiw3ICs0MzYsNyBAQAogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfQVBfTU9ERSAqLwogCXU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgR2V0QWRkcjJQdHIocGZyYW1lKSk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKQEAgLTQ0OSw4ICs0NDksOCBAQAogCX0KIAogCS8qIHJlY2VpdmUgdGhlIGZyYW1lcyB0aGF0IHJhKGExKSBpcyBteSBhZGRyZXNzIG9yIHJhKGExKSBpcyBiYyBhZGRyZXNzLiAqLwotCWlmICghX3J0d19tZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikgJiYKLQkgICAgIV9ydHdfbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIGJjX2FkZHIsIEVUSF9BTEVOKSkKKwlpZiAobWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pICYmCisJICAgIG1lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBiY19hZGRyLCBFVEhfQUxFTikpCiAJCXJldHVybjsKIAogCXB0YWJsZSA9IG1sbWVfc3RhX3RibDsKQEAgLTQ2NSwxMyArNDY1LDE1IEBACiAKIAlpZiAocHN0YSAhPSBOVUxMKSB7CiAJCWlmIChHZXRSZXRyeShwZnJhbWUpKSB7Ci0JCQlpZiAocHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5zZXFfbnVtID09IHBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtKSB7CisJCQlpZiAocHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtID09CisJCQkgICAgcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0pIHsKIAkJCQkvKiBkcm9wIHRoZSBkdXBsaWNhdGUgbWFuYWdlbWVudCBmcmFtZSAqLwotCQkJCURCR184OEUoIkRyb3AgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgd2l0aCBzZXFfbnVtPSVkLlxuIiwgcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5zZXFfbnVtKTsKKwkJCQlEQkdfODhFKCJEcm9wIGR1cGxpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lIHdpdGggc2VxX251bT0lZC5cbiIsCisJCQkJCXByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9Ci0JCXBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5zZXFfbnVtOworCQlwc3RhLT5SeE1nbXRGcmFtZVNlcU51bSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bTsKIAl9CiAKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCkBAIC01MzIsNyArNTM0LDcgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuc2lnbmVkIGludCBPblByb2JlUmVxKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25Qcm9iZVJlcShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1bnNpZ25lZCBpbnQJaWVsZW47CiAJdW5zaWduZWQgY2hhcgkqcDsKQEAgLTU0MCw4ICs1NDIsOCBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAl1OCBpc192YWxpZF9wMnBfcHJvYmVyZXEgPSBmYWxzZTsKIAogI2lmZGVmIENPTkZJR184OEVVX1AyUApAQCAtNTk2LDcgKzU5OCw3IEBACiAJCWlmIChpc192YWxpZF9wMnBfcHJvYmVyZXEpCiAJCQlnb3RvIF9pc3N1ZV9wcm9iZXJzcDsKIAotCQlpZiAoKGllbGVuICE9IDAgJiYgIV9ydHdfbWVtY21wKCh2b2lkICopKHArMiksICh2b2lkICopY3VyLT5Tc2lkLlNzaWQsIGN1ci0+U3NpZC5Tc2lkTGVuZ3RoKSkgfHwKKwkJaWYgKChpZWxlbiAhPSAwICYmIG1lbWNtcCgodm9pZCAqKShwKzIpLCAodm9pZCAqKWN1ci0+U3NpZC5Tc2lkLCBjdXItPlNzaWQuU3NpZExlbmd0aCkpIHx8CiAJCSAgICAoaWVsZW4gPT0gMCAmJiBwbWxtZWluZm8tPmhpZGRlbl9zc2lkX21vZGUpKQogCQkJcmV0dXJuIF9TVUNDRVNTOwogCkBAIC02MDksMTggKzYxMSwxOCBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uUHJvYmVSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPblByb2JlUnNwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbwkqcHdkaW5mbyA9ICZwYWRhcHRlci0+d2RpbmZvOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR184OEVVX1AyUAogCWlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfVFhfUFJPVklTSU9OX0RJU19SRVEpKSB7CiAJCWlmIChwd2RpbmZvLT50eF9wcm92X2Rpc2NfaW5mby5iZW5hYmxlKSB7Ci0JCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+dHhfcHJvdl9kaXNjX2luZm8ucGVlcklGQWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pKSB7CisJCQlpZiAoIW1lbWNtcChwd2RpbmZvLT50eF9wcm92X2Rpc2NfaW5mby5wZWVySUZBZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTikpIHsKIAkJCQlpZiAocnR3X3AycF9jaGtfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9DTElFTlQpKSB7CiAJCQkJCXB3ZGluZm8tPnR4X3Byb3ZfZGlzY19pbmZvLmJlbmFibGUgPSBmYWxzZTsKIAkJCQkJaXNzdWVfcDJwX3Byb3Zpc2lvbl9yZXF1ZXN0KHBhZGFwdGVyLApAQCAtNjM4LDcgKzY0MCw3IEBACiAJfSBlbHNlIGlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfR09ORUdPX0lORykpIHsKIAkJaWYgKHB3ZGluZm8tPm5lZ29fcmVxX2luZm8uYmVuYWJsZSkgewogCQkJREJHXzg4RSgiWyVzXSBQMlAgU3RhdGUgaXMgR09ORUdPIElORyFcbiIsIF9fZnVuY19fKTsKLQkJCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5uZWdvX3JlcV9pbmZvLnBlZXJEZXZBZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTikpIHsKKwkJCWlmICghbWVtY21wKHB3ZGluZm8tPm5lZ29fcmVxX2luZm8ucGVlckRldkFkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkgewogCQkJCXB3ZGluZm8tPm5lZ29fcmVxX2luZm8uYmVuYWJsZSA9IGZhbHNlOwogCQkJCWlzc3VlX3AycF9HT19yZXF1ZXN0KHBhZGFwdGVyLCBwd2RpbmZvLT5uZWdvX3JlcV9pbmZvLnBlZXJEZXZBZGRyKTsKIAkJCX0KQEAgLTY0Niw3ICs2NDgsNyBAQAogCX0gZWxzZSBpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX1RYX0lOVklURV9SRVEpKSB7CiAJCWlmIChwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5iZW5hYmxlKSB7CiAJCQlEQkdfODhFKCJbJXNdIFAyUF9TVEFURV9UWF9JTlZJVEVfUkVRIVxuIiwgX19mdW5jX18pOwotCQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLnBlZXJfbWFjYWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pKSB7CisJCQlpZiAoIW1lbWNtcChwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5wZWVyX21hY2FkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkgewogCQkJCXB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmJlbmFibGUgPSBmYWxzZTsKIAkJCQlpc3N1ZV9wMnBfaW52aXRhdGlvbl9yZXF1ZXN0KHBhZGFwdGVyLCBwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5wZWVyX21hY2FkZHIpOwogCQkJfQpAQCAtNjYzLDcgKzY2NSw3IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25CZWFjb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlpbnQgY2FtX2lkeDsKIAlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7CkBAIC02NzEsOCArNjczLDggQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IHN0YV9wcml2CSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBic3M7CiAJaW50IHJldCA9IF9TVUNDRVNTOwogCkBAIC02ODEsNyArNjgzLDcgQEAKIAkJcmV0dXJuIF9TVUNDRVNTOwogCX0KIAotCWlmIChfcnR3X21lbWNtcChHZXRBZGRyM1B0cihwZnJhbWUpLCBnZXRfbXlfYnNzaWQoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKSkgeworCWlmICghbWVtY21wKEdldEFkZHIzUHRyKHBmcmFtZSksIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pKSB7CiAJCWlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX05VTEwpIHsKIAkJCS8qIHdlIHNob3VsZCB1cGRhdGUgY3VycmVudCBuZXR3b3JrIGJlZm9yZSBhdXRoLCBvciBzb21lIElFIGlzIHdyb25nICovCiAJCQlwYnNzID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcnR3X21hbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKQEAgLTc1Myw3ICs3NTUsNyBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAJdW5zaWduZWQgaW50CWF1dGhfbW9kZSwgaWVfbGVuOwpAQCAtNzY3LDggKzc2OSw4IEBACiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCiAJaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpICE9IFdJRklfRldfQVBfU1RBVEUpCiAJCXJldHVybiBfRkFJTDsKQEAgLTg3OCw3ICs4ODAsNyBAQAogCQkJCWdvdG8gYXV0aF9mYWlsOwogCQkJfQogCi0JCQlpZiAoX3J0d19tZW1jbXAoKHZvaWQgKikocCArIDIpLCBwc3RhdC0+Y2hnX3R4dCwgMTI4KSkgeworCQkJaWYgKCFtZW1jbXAoKHZvaWQgKikocCArIDIpLCBwc3RhdC0+Y2hnX3R4dCwgMTI4KSkgewogCQkJCXBzdGF0LT5zdGF0ZSAmPSAofldJRklfRldfQVVUSF9TVEFURSk7CiAJCQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVVUSF9TVUNDRVNTOwogCQkJCS8qICBjaGFsbGVuZ2luZyB0eHQgaXMgY29ycmVjdC4uLiAqLwpAQCAtOTI2LDIwICs5MjgsMjAgQEAKIAlyZXR1cm4gX0ZBSUw7CiB9CiAKLXVuc2lnbmVkIGludCBPbkF1dGhDbGllbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkF1dGhDbGllbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdW5zaWduZWQgaW50CXNlcSwgbGVuLCBzdGF0dXMsIG9mZnNldDsKIAl1bnNpZ25lZCBjaGFyCSpwOwogCXVuc2lnbmVkIGludAlnbzJhc29jID0gMDsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgcGt0X2xlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgcGt0X2xlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogY2hlY2sgQTEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIV9ydHdfbWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBnZXRfZGEocGZyYW1lKSwgRVRIX0FMRU4pKQorCWlmIChtZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIGdldF9kYShwZnJhbWUpLCBFVEhfQUxFTikpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCWlmICghKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1RBVEUpKQpAQCAtMTAwMSw3ICsxMDAzLDcgQEAKIAlyZXR1cm4gX0ZBSUw7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFzc29jUmVxKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25Bc3NvY1JlcShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAJdTE2IGNhcGFiX2luZm87CkBAIC0xMDIwLDggKzEwMjIsOCBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1ciA9ICYocG1sbWVpbmZvLT5uZXR3b3JrKTsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IHBrdF9sZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IHBrdF9sZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogI2lmZGVmIENPTkZJR184OEVVX1AyUAogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8JKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwogCXU4IHAycF9zdGF0dXNfY29kZSA9IFAyUF9TVEFUVVNfU1VDQ0VTUzsKQEAgLTEwOTcsNyArMTA5OSw3IEBACiAJCXN0YXR1cyA9IF9TVEFUU19GQUlMVVJFXzsKIAl9IGVsc2UgewogCQkvKiAgY2hlY2sgaWYgc3NpZCBtYXRjaCAqLwotCQlpZiAoIV9ydHdfbWVtY21wKCh2b2lkICopKHArMiksIGN1ci0+U3NpZC5Tc2lkLCBjdXItPlNzaWQuU3NpZExlbmd0aCkpCisJCWlmIChtZW1jbXAoKHZvaWQgKikocCsyKSwgY3VyLT5Tc2lkLlNzaWQsIGN1ci0+U3NpZC5Tc2lkTGVuZ3RoKSkKIAkJCXN0YXR1cyA9IF9TVEFUU19GQUlMVVJFXzsKIAogCQlpZiAoaWVfbGVuICE9IGN1ci0+U3NpZC5Tc2lkTGVuZ3RoKQpAQCAtMTI3MCw3ICsxMjcyLDcgQEAKIAkJZm9yICg7OykgewogCQkJcCA9IHJ0d19nZXRfaWUocCwgX1ZFTkRPUl9TUEVDSUZJQ19JRV8sICZpZV9sZW4sIHBrdF9sZW4gLSBXTEFOX0hEUl9BM19MRU4gLSBpZV9vZmZzZXQpOwogCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCWlmIChfcnR3X21lbWNtcChwKzIsIFdNTV9JRSwgNikpIHsKKwkJCQlpZiAoIW1lbWNtcChwKzIsIFdNTV9JRSwgNikpIHsKIAkJCQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX1dNRTsKIAogCQkJCQlwc3RhdC0+cW9zX29wdGlvbiA9IDE7CkBAIC0xNDcwLDcgKzE0NzIsNyBAQAogCXJldHVybiBfRkFJTDsKIH0KIAotdW5zaWduZWQgaW50IE9uQXNzb2NSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFzc29jUnNwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVpbnQgaTsKIAlpbnQgcmVzOwpAQCAtMTQ4MCwxMyArMTQ4MiwxMyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAkvKiBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmKHBtbG1laW5mby0+bmV0d29yayk7ICovCi0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgcGt0X2xlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgcGt0X2xlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogY2hlY2sgQTEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIV9ydHdfbWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBnZXRfZGEocGZyYW1lKSwgRVRIX0FMRU4pKQorCWlmIChtZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIGdldF9kYShwZnJhbWUpLCBFVEhfQUxFTikpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCWlmICghKHBtbG1laW5mby0+c3RhdGUgJiAoV0lGSV9GV19BVVRIX1NVQ0NFU1MgfCBXSUZJX0ZXX0FTU09DX1NUQVRFKSkpCkBAIC0xNTI0LDcgKzE1MjYsNyBAQAogCiAJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzoKLQkJCWlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFdNTV9QQVJBX09VSSwgNikpCS8qIFdNTSAqLworCQkJaWYgKCFtZW1jbXAocElFLT5kYXRhLCBXTU1fUEFSQV9PVUksIDYpKSAvKiBXTU0gKi8KIAkJCQlXTU1fcGFyYW1faGFuZGxlcihwYWRhcHRlciwgcElFKTsKIAkJCWJyZWFrOwogCQljYXNlIF9IVF9DQVBBQklMSVRZX0lFXzoJLyogSFQgY2FwcyAqLwpAQCAtMTU2MCwxOSArMTU2MiwyMCBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uRGVBdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25EZUF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdW5zaWduZWQgc2hvcnQJcmVhc29uOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAKIAkvKiBjaGVjayBBMyAqLwotCWlmICghKF9ydHdfbWVtY21wKEdldEFkZHIzUHRyKHBmcmFtZSksIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pKSkKKwlpZiAobWVtY21wKEdldEFkZHIzUHRyKHBmcmFtZSksIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKKwkJICAgRVRIX0FMRU4pKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKQEAgLTE2MjMsMTkgKzE2MjYsMjAgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkRpc2Fzc29jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25EaXNhc3NvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1MTYgcmVhc29uOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAKIAkvKiBjaGVjayBBMyAqLwotCWlmICghKF9ydHdfbWVtY21wKEdldEFkZHIzUHRyKHBmcmFtZSksIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pKSkKKwlpZiAobWVtY21wKEdldEFkZHIzUHRyKHBmcmFtZSksIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKKwkJICAgRVRIX0FMRU4pKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKQEAgLTE2ODUsMTggKzE2ODksMTggQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkF0aW0oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkF0aW0oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBvbl9hY3Rpb25fc3BjdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IG9uX2FjdGlvbl9zcGN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAqZnJhbWVfYm9keSA9ICh1OCAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAJdTggY2F0ZWdvcnk7CiAJdTggYWN0aW9uOwpAQCAtMTcyOSwxNyArMTczMywxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbl9xb3Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbl9xb3Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb25fZGxzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb25fZGxzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uX2JhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbl9iYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXU4ICphZGRyOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CkBAIC0xNzQ5LDEwICsxNzUzLDExIEBACiAJdW5zaWduZWQgc2hvcnQJdGlkLCBzdGF0dXMsIHJlYXNvbl9jb2RlID0gMDsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFfcnR3X21lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgR2V0QWRkcjFQdHIocGZyYW1lKSwgRVRIX0FMRU4pKS8qIGZvciBpZjEsIHN0YS9hcCBtb2RlICovCisJaWYgKG1lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgR2V0QWRkcjFQdHIocGZyYW1lKSwKKwkJICAgRVRIX0FMRU4pKS8qIGZvciBpZjEsIHN0YS9hcCBtb2RlICovCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CkBAIC0xOTM3LDcgKzE5NDIsNyBAQAogCXAycGllW3AycGllbGVuKytdID0gMHgwOTsJLyoJV0ZBIFAyUCB2MS4wICovCiAKIAkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEwMzA2ICovCi0JLyoJQWNjb3JkaW5nIHRvIHRoZSBQMlAgU3BlY2lmaWNhdGlvbiwgdGhlIGdyb3VwIG5lZ29pdGF0aW9uIHJlcXVlc3QgZnJhbWUgc2hvdWxkIGNvbnRhaW4gOSBQMlAgYXR0cmlidXRlcyAqLworCS8qCUFjY29yZGluZyB0byB0aGUgUDJQIFNwZWNpZmljYXRpb24sIHRoZSBncm91cCBuZWdvdGlhdGlvbiByZXF1ZXN0IGZyYW1lIHNob3VsZCBjb250YWluIDkgUDJQIGF0dHJpYnV0ZXMgKi8KIAkvKgkxLiBQMlAgQ2FwYWJpbGl0eSAqLwogCS8qCTIuIEdyb3VwIE93bmVyIEludGVudCAqLwogCS8qCTMuIENvbmZpZ3VyYXRpb24gVGltZW91dCAqLwpAQCAtMjI4MCw3ICsyMjg1LDcgQEAKIAkvKglDb21tZW50ZWQgYnkgS3VydCAyMDEyMDExMyAqLwogCS8qCUlmIHNvbWUgZGV2aWNlIHdhbnRzIHRvIGRvIHAycCBoYW5kc2hha2Ugd2l0aG91dCBzZW5kaW5nIHByb3ZfZGlzY19yZXEgKi8KIAkvKglXZSBoYXZlIHRvIGdldCBwZWVyX3JlcV9jbSBmcm9tIGhlcmUuICovCi0JaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnN0cmNvbmZpZ19tZXRob2RfZGVzY19vZl9wcm92X2Rpc2NfcmVxLCAiMDAwIiwgMykpIHsKKwlpZiAoIW1lbWNtcChwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5zdHJjb25maWdfbWV0aG9kX2Rlc2Nfb2ZfcHJvdl9kaXNjX3JlcSwgIjAwMCIsIDMpKSB7CiAJCWlmICh3cHNfZGV2aWNlcGFzc3dvcmRfaWQgPT0gV1BTX0RQSURfVVNFUl9TUEVDKQogCQkJbWVtY3B5KHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnN0cmNvbmZpZ19tZXRob2RfZGVzY19vZl9wcm92X2Rpc2NfcmVxLCAiZGlzIiwgMyk7CiAJCWVsc2UgaWYgKHdwc19kZXZpY2VwYXNzd29yZF9pZCA9PSBXUFNfRFBJRF9SRUdJU1RSQVJfU1BFQykKQEAgLTIzMDIsNyArMjMwNyw3IEBACiAJcDJwaWVbcDJwaWVsZW4rK10gPSAweDA5OwkvKglXRkEgUDJQIHYxLjAgKi8KIAogCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMDA5MDggKi8KLQkvKglBY2NvcmRpbmcgdG8gdGhlIFAyUCBTcGVjaWZpY2F0aW9uLCB0aGUgZ3JvdXAgbmVnb2l0YXRpb24gcmVzcG9uc2UgZnJhbWUgc2hvdWxkIGNvbnRhaW4gOSBQMlAgYXR0cmlidXRlcyAqLworCS8qCUFjY29yZGluZyB0byB0aGUgUDJQIFNwZWNpZmljYXRpb24sIHRoZSBncm91cCBuZWdvdGlhdGlvbiByZXNwb25zZSBmcmFtZSBzaG91bGQgY29udGFpbiA5IFAyUCBhdHRyaWJ1dGVzICovCiAJLyoJMS4gU3RhdHVzICovCiAJLyoJMi4gUDJQIENhcGFiaWxpdHkgKi8KIAkvKgkzLiBHcm91cCBPd25lciBJbnRlbnQgKi8KQEAgLTI2MDQsNyArMjYwOSw3IEBACiAJcDJwaWVbcDJwaWVsZW4rK10gPSAweDA5OwkvKglXRkEgUDJQIHYxLjAgKi8KIAogCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMTAzMDYgKi8KLQkvKglBY2NvcmRpbmcgdG8gdGhlIFAyUCBTcGVjaWZpY2F0aW9uLCB0aGUgZ3JvdXAgbmVnb2l0YXRpb24gcmVxdWVzdCBmcmFtZSBzaG91bGQgY29udGFpbiA1IFAyUCBhdHRyaWJ1dGVzICovCisJLyoJQWNjb3JkaW5nIHRvIHRoZSBQMlAgU3BlY2lmaWNhdGlvbiwgdGhlIGdyb3VwIG5lZ290aWF0aW9uIHJlcXVlc3QgZnJhbWUgc2hvdWxkIGNvbnRhaW4gNSBQMlAgYXR0cmlidXRlcyAqLwogCS8qCTEuIFN0YXR1cyAqLwogCS8qCTIuIFAyUCBDYXBhYmlsaXR5ICovCiAJLyoJMy4gT3BlcmF0aW5nIENoYW5uZWwgKi8KQEAgLTI4MjUsNyArMjgzMCw4IEBACiAJLyoJQ2hhbm5lbCBOdW1iZXIgKi8KIAlwMnBpZVtwMnBpZWxlbisrXSA9IHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLm9wZXJhdGluZ19jaDsJLyoJb3BlcmF0aW5nIGNoYW5uZWwgbnVtYmVyICovCiAKLQlpZiAoX3J0d19tZW1jbXAobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5nb19ic3NpZCwgRVRIX0FMRU4pKSB7CisJaWYgKCFtZW1jbXAobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLAorCQkgICAgcHdkaW5mby0+aW52aXRlcmVxX2luZm8uZ29fYnNzaWQsIEVUSF9BTEVOKSkgewogCQkvKglQMlAgR3JvdXAgQlNTSUQgKi8KIAkJLyoJVHlwZTogKi8KIAkJcDJwaWVbcDJwaWVsZW4rK10gPSBQMlBfQVRUUl9HUk9VUF9CU1NJRDsKQEAgLTMyNjAsNyArMzI2Niw3IEBACiAJZm9yIChpID0gMDsgaSA8IFAyUF9NQVhfUEVSU0lTVEVOVF9HUk9VUF9OVU07IGkrKywgcHJvZmlsZWluZm8rKykgewogCSAgICAgICBEQkdfODhFKCJbJXNdIHByb2ZpbGVpbmZvX21hYz0lLjJYICUuMlggJS4yWCAlLjJYICUuMlggJS4yWFxuIiwgX19mdW5jX18sCiAJCQkgICAgcHJvZmlsZWluZm8tPnBlZXJtYWNbMF0sIHByb2ZpbGVpbmZvLT5wZWVybWFjWzFdLCBwcm9maWxlaW5mby0+cGVlcm1hY1syXSwgcHJvZmlsZWluZm8tPnBlZXJtYWNbM10sIHByb2ZpbGVpbmZvLT5wZWVybWFjWzRdLCBwcm9maWxlaW5mby0+cGVlcm1hY1s1XSk7Ci0JCWlmIChfcnR3X21lbWNtcChwZWVybWFjYWRkciwgcHJvZmlsZWluZm8tPnBlZXJtYWMsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChwZWVybWFjYWRkciwgcHJvZmlsZWluZm8tPnBlZXJtYWMsIEVUSF9BTEVOKSkgewogCQkJbWF0Y2hfcmVzdWx0ID0gMTsKIAkJCURCR184OEUoIlslc10gTWF0Y2ghXG4iLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKQEAgLTM4NTMsMTMgKzM4NTksMTMgQEAKIAogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCi1zdGF0aWMgczMyIHJ0d19hY3Rpb25fcHVibGljX2RlY2FjaGUodW5pb24gcmVjdl9mcmFtZSAqcmVjdl9mcmFtZSwgczMyIHRva2VuKQorc3RhdGljIHMzMiBydHdfYWN0aW9uX3B1YmxpY19kZWNhY2hlKHN0cnVjdCByZWN2X2ZyYW1lICpyZWN2X2ZyYW1lLCBzMzIgdG9rZW4pCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSByZWN2X2ZyYW1lLT51Lmhkci5hZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcmVjdl9mcmFtZS0+YWRhcHRlcjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqbWxtZWV4dCA9ICYoYWRhcHRlci0+bWxtZWV4dHByaXYpOwotCXU4ICpmcmFtZSA9IHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdTE2IHNlcV9jdHJsID0gKChyZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuc2VxX251bSYweGZmZmYpIDw8IDQpIHwKLQkJKHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5mcmFnX251bSAmIDB4Zik7CisJdTggKmZyYW1lID0gcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1MTYgc2VxX2N0cmwgPSAoKHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtJjB4ZmZmZikgPDwgNCkgfAorCQkocmVjdl9mcmFtZS0+YXR0cmliLmZyYWdfbnVtICYgMHhmKTsKIAogCWlmIChHZXRSZXRyeShmcmFtZSkpIHsKIAkJaWYgKHRva2VuID49IDApIHsKQEAgLTM4ODUsMTQgKzM4OTEsMTQgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpY19wMnAodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWNfcDJwKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5OwogCXU4IGRpYWxvZ1Rva2VuID0gMDsKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdl9mcmFtZS0+dS5oZHIuYWRhcHRlcjsKLQl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZfZnJhbWUtPmFkYXB0ZXI7CisJdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCXU4ICpwMnBfaWU7CiAJdTMyCXAycF9pZWxlbjsKIAlzdHJ1Y3QJd2lmaWRpcmVjdF9pbmZvCSpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKQEAgLTM5MzksNyArMzk0NSw4IEBACiAKIAkJLyoJQ29tbWVudGVkIGJ5IEt1cnQgMjAxMjAxMTMgKi8KIAkJLyoJR2V0IHBlZXJfZGV2X2FkZHIgaGVyZSBpZiBwZWVyIGRvZXNuJ3QgaXNzdWUgcHJvdl9kaXNjIGZyYW1lLiAqLwotCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8ucGVlckRldkFkZHIsIGVtcHR5X2FkZHIsIEVUSF9BTEVOKSkKKwkJaWYgKCFtZW1jbXAocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8ucGVlckRldkFkZHIsIGVtcHR5X2FkZHIsCisJCQkgICAgRVRIX0FMRU4pKQogCQkJbWVtY3B5KHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnBlZXJEZXZBZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTik7CiAKIAkJcmVzdWx0ID0gcHJvY2Vzc19wMnBfZ3JvdXBfbmVnb3RhdGlvbl9yZXEocHdkaW5mbywgZnJhbWVfYm9keSwgbGVuKTsKQEAgLTQwMjEsNyArNDAyOCw3IEBACiAJCQkJCV9ydHdfbWVtc2V0KCZncm91cF9pZCwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBncm91cF9pZF9pbmZvKSk7CiAJCQkJCXJ0d19nZXRfcDJwX2F0dHJfY29udGVudChwMnBfaWUsIHAycF9pZWxlbiwgUDJQX0FUVFJfR1JPVVBfSUQsICh1OCAqKSZncm91cF9pZCwgJmF0dHJfY29udGVudGxlbik7CiAJCQkJCWlmIChhdHRyX2NvbnRlbnRsZW4pIHsKLQkJCQkJCWlmIChfcnR3X21lbWNtcChncm91cF9pZC5nb19kZXZpY2VfYWRkciwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKKwkJCQkJCWlmICghbWVtY21wKGdyb3VwX2lkLmdvX2RldmljZV9hZGRyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgewogCQkJCQkJCS8qCVRoZSBwMnAgZGV2aWNlIHNlbmRpbmcgdGhpcyBwMnAgaW52aXRhdGlvbiByZXF1ZXN0IHdhbnRzIHRoaXMgV2ktRmkgZGV2aWNlIHRvIGJlIHRoZSBwZXJzaXN0ZW50IEdPLiAqLwogCQkJCQkJCXJ0d19wMnBfc2V0X3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9SRUNWX0lOVklURV9SRVFfR08pOwogCQkJCQkJCXJ0d19wMnBfc2V0X3JvbGUocHdkaW5mbywgUDJQX1JPTEVfR08pOwpAQCAtNDA2OSw3ICs0MDc2LDcgQEAKIAkJCQkJX3J0d19tZW1zZXQoJmdyb3VwX2lkLCAweDAwLCBzaXplb2Yoc3RydWN0IGdyb3VwX2lkX2luZm8pKTsKIAkJCQkJcnR3X2dldF9wMnBfYXR0cl9jb250ZW50KHAycF9pZSwgcDJwX2llbGVuLCBQMlBfQVRUUl9HUk9VUF9JRCwgKHU4ICopJmdyb3VwX2lkLCAmYXR0cl9jb250ZW50bGVuKTsKIAkJCQkJaWYgKGF0dHJfY29udGVudGxlbikgewotCQkJCQkJaWYgKF9ydHdfbWVtY21wKGdyb3VwX2lkLmdvX2RldmljZV9hZGRyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgeworCQkJCQkJaWYgKCFtZW1jbXAoZ3JvdXBfaWQuZ29fZGV2aWNlX2FkZHIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CiAJCQkJCQkJLyoJSW4gdGhpcyBjYXNlLCB0aGUgR08gY2FuJ3QgYmUgbXlzZWxmLiAqLwogCQkJCQkJCXJ0d19wMnBfc2V0X3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9SRUNWX0lOVklURV9SRVFfRElTTUFUQ0gpOwogCQkJCQkJCXN0YXR1c19jb2RlID0gUDJQX1NUQVRVU19GQUlMX0lORk9fVU5BVkFJTEFCTEU7CkBAIC00MTE2LDcgKzQxMjMsNyBAQAogCQkJCXB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmJlbmFibGUgPSBmYWxzZTsKIAogCQkJCWlmIChhdHRyX2NvbnRlbnQgPT0gUDJQX1NUQVRVU19TVUNDRVNTKSB7Ci0JCQkJCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5nb19ic3NpZCwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKKwkJCQkJaWYgKCFtZW1jbXAocHdkaW5mby0+aW52aXRlcmVxX2luZm8uZ29fYnNzaWQsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CiAJCQkJCQlydHdfcDJwX3NldF9yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0dPKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXJ0d19wMnBfc2V0X3JvbGUocHdkaW5mbywgUDJQX1JPTEVfQ0xJRU5UKTsKQEAgLTQxNzUsMjMgKzQxODIsMjIgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpY192ZW5kb3IodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWNfdmVuZG9yKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwogCi0JaWYgKF9ydHdfbWVtY21wKGZyYW1lX2JvZHkgKyAyLCBQMlBfT1VJLCA0KSA9PSB0cnVlKSB7CisJaWYgKCFtZW1jbXAoZnJhbWVfYm9keSArIDIsIFAyUF9PVUksIDQpKQogCQlyZXQgPSBvbl9hY3Rpb25fcHVibGljX3AycChwcmVjdl9mcmFtZSk7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljX2RlZmF1bHQodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHU4IGFjdGlvbikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpY19kZWZhdWx0KHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgdTggYWN0aW9uKQogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggdG9rZW47CiAKQEAgLTQyMDYsMTUgKzQyMTIsMTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi11bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdW5zaWduZWQgaW50IHJldCA9IF9GQUlMOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKIAl1OCBjYXRlZ29yeSwgYWN0aW9uOwogCiAJLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIV9ydHdfbWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBHZXRBZGRyMVB0cihwZnJhbWUpLCBFVEhfQUxFTikpCisJaWYgKG1lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgR2V0QWRkcjFQdHIocGZyYW1lKSwgRVRIX0FMRU4pKQogCQlnb3RvIGV4aXQ7CiAKIAljYXRlZ29yeSA9IGZyYW1lX2JvZHlbMF07CkBAIC00MjM1LDMwICs0MjQxLDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uX2h0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb25faHQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb25fd21tKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb25fd21tKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uX3AycChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uX3AycChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKIAl1OCAqZnJhbWVfYm9keTsKIAl1OCBjYXRlZ29yeSwgT1VJX1N1YnR5cGU7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCXN0cnVjdAl3aWZpZGlyZWN0X2luZm8JKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwogCiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIV9ydHdfbWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBHZXRBZGRyMVB0cihwZnJhbWUpLCBFVEhfQUxFTikpLyogZm9yIGlmMSwgc3RhL2FwIG1vZGUgKi8KKwlpZiAobWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBHZXRBZGRyMVB0cihwZnJhbWUpLCBFVEhfQUxFTikpLyogZm9yIGlmMSwgc3RhL2FwIG1vZGUgKi8KIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAJZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKQEAgLTQyOTAsMTMgKzQyOTYsMTMgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCWludCBpOwogCXVuc2lnbmVkIGNoYXIJY2F0ZWdvcnk7CiAJc3RydWN0IGFjdGlvbl9oYW5kbGVyICpwdGFibGU7CiAJdW5zaWduZWQgY2hhcgkqZnJhbWVfYm9keTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCiAJZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKIApAQCAtNDMxMCw3ICs0MzE2LDcgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBEb1Jlc2VydmVkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgRG9SZXNlcnZlZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC00MzQxLDcgKzQzNDcsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi1Gb2xsb3dpbmcgYXJlIHNvbWUgVFggZnVjdGlvbnMgZm9yIFdpRmkgTUxNRQorRm9sbG93aW5nIGFyZSBzb21lIFRYIGZ1bmN0aW9ucyBmb3IgV2lGaSBNTE1FCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00NDMyLDcgKzQ0MzgsNyBAQAogCX0KIAogCXB4bWl0cHJpdi0+YWNrX3R4ID0gZmFsc2U7Ci0JX2V4aXRfY3JpdGljYWxfbXV0ZXgoJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4LCBOVUxMKTsKKwltdXRleF91bmxvY2soJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKIAogCSByZXR1cm4gcmV0OwogfQpAQCAtNDk5NSw3ICs1MDAxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiAgaWYgcHN0YSA9PSBOVUxMLCBpbmRpYXRlIHdlIGFyZSBzdGF0aW9uKGNsaWVudCkgbm93Li4uICovCisvKiAgaWYgcHN0YSA9PSBOVUxMLCBpbmRpY2F0ZSB3ZSBhcmUgc3RhdGlvbihjbGllbnQpIG5vdy4uLiAqLwogdm9pZCBpc3N1ZV9hdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpCiB7CiAJc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7CkBAIC01MjM0LDcgKzUyNDAsNyBAQAogCiAJCWZvciAocGJ1ZiA9IGllICsgX0JFQUNPTl9JRV9PRkZTRVRfOzsgcGJ1ZiArPSAoaWVfbGVuICsgMikpIHsKIAkJCXBidWYgPSBydHdfZ2V0X2llKHBidWYsIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLCAmaWVfbGVuLCAocG5ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfIC0gKGllX2xlbiArIDIpKSk7Ci0JCQlpZiAocGJ1ZiAmJiBfcnR3X21lbWNtcChwYnVmKzIsIFdNTV9QQVJBX0lFLCA2KSkgeworCQkJaWYgKHBidWYgJiYgIW1lbWNtcChwYnVmKzIsIFdNTV9QQVJBX0lFLCA2KSkgewogCQkJCW1lbWNweShwZnJhbWUsIHBidWYsIGllX2xlbisyKTsKIAkJCQlwZnJhbWUgKz0gKGllX2xlbisyKTsKIAkJCQlwYXR0cmliLT5wa3RsZW4gKz0gKGllX2xlbisyKTsKQEAgLTU0MzksMTQgKzU0NDUsMTQgQEAKIAogCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86Ci0JCQlpZiAoKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpKSB8fAotCQkJICAgIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFdNTV9PVUksIDQpKSB8fAotCQkJICAgIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFdQU19PVUksIDQpKSkgeworCQkJaWYgKCghbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpKSB8fAorCQkJICAgICghbWVtY21wKHBJRS0+ZGF0YSwgV01NX09VSSwgNCkpIHx8CisJCQkgICAgKCFtZW1jbXAocElFLT5kYXRhLCBXUFNfT1VJLCA0KSkpIHsKIAkJCQlpZiAoIXBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKSB7CiAJCQkJCS8qIENvbW1lbnRlZCBieSBLdXJ0IDIwMTEwNjI5ICovCiAJCQkJCS8qIEluIHNvbWUgb2xkZXIgQVBzLCBXUFMgaGFuZHNoYWtlICovCiAJCQkJCS8qIHdvdWxkIGJlIGZhaWwgaWYgd2UgYXBwZW5kIHZlbmRlciBleHRlbnNpb25zIGluZm9ybWF0aW9ucyB0byBBUCAqLwotCQkJCQlpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBXUFNfT1VJLCA0KSkKKwkJCQkJaWYgKCFtZW1jbXAocElFLT5kYXRhLCBXUFNfT1VJLCA0KSkKIAkJCQkJCXBJRS0+TGVuZ3RoID0gMTQ7CiAJCQkJfQogCQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUocGZyYW1lLCBfVkVORE9SX1NQRUNJRklDX0lFXywgcElFLT5MZW5ndGgsIHBJRS0+ZGF0YSwgJihwYXR0cmliLT5wa3RsZW4pKTsKQEAgLTU2MDYsNyArNTYxMiw3IEBACiAJcmV0dXJuOwogfQogCi0vKiB3aGVuIHdhaXRfYWNrIGlzIHR1cmUsIHRoaXMgZnVuY3Rpb24gc2hvdWxlIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KKy8qIHdoZW4gd2FpdF9hY2sgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLwogc3RhdGljIGludCBfaXNzdWVfbnVsbGRhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwgdW5zaWduZWQgaW50IHBvd2VyX21vZGUsIGludCB3YWl0X2FjaykKIHsKIAlpbnQgcmV0ID0gX0ZBSUw7CkBAIC01Njc2LDcgKzU2ODIsNyBAQAogfQogCiAKLS8qIHdoZW4gd2FpdF9tcyA+IDAgLCB0aGlzIGZ1bmN0aW9uIHNob3VsZSBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCisvKiB3aGVuIHdhaXRfbXMgPiAwICwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLwogLyogZGEgPT0gTlVMTCBmb3Igc3RhdGlvbiBtb2RlICovCiBpbnQgaXNzdWVfbnVsbGRhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwgdW5zaWduZWQgaW50IHBvd2VyX21vZGUsIGludCB0cnlfY250LCBpbnQgd2FpdF9tcykKIHsKQEAgLTU2ODYsNyArNTY5Miw3IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJihwYWRhcHRlci0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKLQkvKiBkYSA9PSBOVUxMLCBhc3N1bSBpdCdzIG51bGwgZGF0YSBmb3Igc3RhIHRvIGFwKi8KKwkvKiBkYSA9PSBOVUxMLCBhc3N1bWUgaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCiAJaWYgKGRhID09IE5VTEwpCiAJCWRhID0gZ2V0X215X2Jzc2lkKCYocG1sbWVpbmZvLT5uZXR3b3JrKSk7CiAKQEAgLTU3MjEsNyArNTcyNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogd2hlbiB3YWl0X2FjayBpcyB0dXJlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZSBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCisvKiB3aGVuIHdhaXRfYWNrIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KIHN0YXRpYyBpbnQgX2lzc3VlX3Fvc19udWxsZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLCB1MTYgdGlkLCBpbnQgd2FpdF9hY2spCiB7CiAJaW50IHJldCA9IF9GQUlMOwpAQCAtNTc5OSw3ICs1ODA1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiB3aGVuIHdhaXRfbXMgPiAwICwgdGhpcyBmdW5jdGlvbiBzaG91bGUgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLworLyogd2hlbiB3YWl0X21zID4gMCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KIC8qIGRhID09IE5VTEwgZm9yIHN0YXRpb24gbW9kZSAqLwogaW50IGlzc3VlX3Fvc19udWxsZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLCB1MTYgdGlkLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpCiB7CkBAIC01ODA5LDcgKzU4MTUsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICYocGFkYXB0ZXItPm1sbWVleHRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCi0JLyogZGEgPT0gTlVMTCwgYXNzdW0gaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCisJLyogZGEgPT0gTlVMTCwgYXNzdW1lIGl0J3MgbnVsbCBkYXRhIGZvciBzdGEgdG8gYXAqLwogCWlmIChkYSA9PSBOVUxMKQogCQlkYSA9IGdldF9teV9ic3NpZCgmKHBtbG1laW5mby0+bmV0d29yaykpOwogCkBAIC02MTAzLDE3ICs2MTA5LDI2IEBACiAJCWNhc2UgMTogLyogQUREQkEgcnNwICovCiAJCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMSwgJihwbWxtZWluZm8tPkFEREJBX3JlcS5kaWFsb2dfdG9rZW4pLCAmKHBhdHRyaWItPnBrdGxlbikpOwogCQkJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDIsICh1bnNpZ25lZCBjaGFyICopKCZzdGF0dXMpLCAmKHBhdHRyaWItPnBrdGxlbikpOworCisJCQlCQV9wYXJhX3NldCA9IGxlMTZfdG9fY3B1KHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2Y7CiAJCQlydHdfaGFsX2dldF9kZWZfdmFyKHBhZGFwdGVyLCBIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUiwgJm1heF9yeF9hbXBkdV9mYWN0b3IpOwotCQkJaWYgKE1BWF9BTVBEVV9GQUNUT1JfNjRLID09IG1heF9yeF9hbXBkdV9mYWN0b3IpCi0JCQkJQkFfcGFyYV9zZXQgPSAoKChwbWxtZWluZm8tPkFEREJBX3JlcS5CQV9wYXJhX3NldCkgJiAweDNmKSB8IDB4MTAwMCk7IC8qIDY0IGJ1ZmZlciBzaXplICovCi0JCQllbHNlIGlmIChNQVhfQU1QRFVfRkFDVE9SXzMySyA9PSBtYXhfcnhfYW1wZHVfZmFjdG9yKQotCQkJCUJBX3BhcmFfc2V0ID0gKCgocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZikgfCAweDA4MDApOyAvKiAzMiBidWZmZXIgc2l6ZSAqLwotCQkJZWxzZSBpZiAoTUFYX0FNUERVX0ZBQ1RPUl8xNksgPT0gbWF4X3J4X2FtcGR1X2ZhY3RvcikKLQkJCQlCQV9wYXJhX3NldCA9ICgoKHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2YpIHwgMHgwNDAwKTsgLyogMTYgYnVmZmVyIHNpemUgKi8KLQkJCWVsc2UgaWYgKE1BWF9BTVBEVV9GQUNUT1JfOEsgPT0gbWF4X3J4X2FtcGR1X2ZhY3RvcikKLQkJCQlCQV9wYXJhX3NldCA9ICgoKHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2YpIHwgMHgwMjAwKTsgLyogOCBidWZmZXIgc2l6ZSAqLwotCQkJZWxzZQotCQkJCUJBX3BhcmFfc2V0ID0gKCgocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZikgfCAweDEwMDApOyAvKiA2NCBidWZmZXIgc2l6ZSAqLworCQkJc3dpdGNoIChtYXhfcnhfYW1wZHVfZmFjdG9yKSB7CisJCQljYXNlIE1BWF9BTVBEVV9GQUNUT1JfNjRLOgorCQkJCUJBX3BhcmFfc2V0IHw9IDB4MTAwMDsgLyogNjQgYnVmZmVyIHNpemUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgTUFYX0FNUERVX0ZBQ1RPUl8zMks6CisJCQkJQkFfcGFyYV9zZXQgfD0gMHgwODAwOyAvKiAzMiBidWZmZXIgc2l6ZSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBNQVhfQU1QRFVfRkFDVE9SXzE2SzoKKwkJCQlCQV9wYXJhX3NldCB8PSAweDA0MDA7IC8qIDE2IGJ1ZmZlciBzaXplICovCisJCQkJYnJlYWs7CisJCQljYXNlIE1BWF9BTVBEVV9GQUNUT1JfOEs6CisJCQkJQkFfcGFyYV9zZXQgfD0gMHgwMjAwOyAvKiA4IGJ1ZmZlciBzaXplICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUJBX3BhcmFfc2V0IHw9IDB4MTAwMDsgLyogNjQgYnVmZmVyIHNpemUgKi8KKwkJCQlicmVhazsKKwkJCX0KIAogCQkJaWYgKHByZWdwcml2LT5hbXBkdV9hbXNkdSA9PSAwKS8qIGRpc2FibGVkICovCiAJCQkJQkFfcGFyYV9zZXQgPSBCQV9wYXJhX3NldCAmIH5CSVQoMCk7CkBAIC02MjIyLDcgKzYyMzcsNyBAQAogCQlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCXdoaWxlICgxKSB7CiAJCQlpbnQgbGVuOwpAQCAtNjIzMiw5ICs2MjQ3LDkgQEAKIAkJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKQogCQkJCWJyZWFrOwogCi0JCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQlwYnNzX25ldHdvcmsgPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKikmcG5ldHdvcmstPm5ldHdvcms7CiAKQEAgLTYzNTUsNyArNjM3MCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLUZvbGxvd2luZyBhcmUgc29tZSB1dGl0aXR5IGZ1Y3Rpb25zIGZvciBXaUZpIE1MTUUKK0ZvbGxvd2luZyBhcmUgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgV2lGaSBNTE1FCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC02NDY4LDcgKzY0ODMsNyBAQAogCQl7CiAJCQkvKiAgMjAxMDA3MjE6SW50ZXJydXB0IHNjYW4gb3BlcmF0aW9uIGhlcmUuICovCiAJCQkvKiAgRm9yIFNXIGFudGVubmEgZGl2ZXJzaXR5IGJlZm9yZSBsaW5rLCBpdCBuZWVkcyB0byBzd2l0Y2ggdG8gYW5vdGhlciBhbnRlbm5hIGFuZCBzY2FuIGFnYWluLiAqLwotCQkJLyogIEl0IGNvbXBhcmVzIHRoZSBzY2FuIHJlc3VsdCBhbmQgc2VsZWN0IGJldGVyIG9uZSB0byBkbyBjb25uZWN0aW9uLiAqLworCQkJLyogIEl0IGNvbXBhcmVzIHRoZSBzY2FuIHJlc3VsdCBhbmQgc2VsZWN0IGJldHRlciBvbmUgdG8gZG8gY29ubmVjdGlvbi4gKi8KIAkJCWlmIChydHdfaGFsX2FudGRpdl9iZWZvcmVfbGlua2VkKHBhZGFwdGVyKSkgewogCQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5ic3NfY250ID0gMDsKIAkJCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPSAtMTsKQEAgLTY1MjYsMTQgKzY1NDEsMTQgQEAKIH0KIAogLyogY29sbGVjdCBic3MgaW5mbyBmcm9tIEJlYWNvbiBhbmQgUHJvYmUgcmVxdWVzdC9yZXNwb25zZSBmcmFtZXMuICovCi11OCBjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3NpZCkKK3U4IGNvbGxlY3RfYnNzX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3NpZCkKIHsKIAlpbnQJaTsKIAl1MzIJbGVuOwogCXU4ICpwOwogCXUxNiB2YWwxNiwgc3VidHlwZTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdTMyCXBhY2tldF9sZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1MzIJcGFja2V0X2xlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAJdTggaWVfb2Zmc2V0OwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKQEAgLTY1NzIsMTAgKzY1ODcsMTAgQEAKIAlic3NpZC0+SUVMZW5ndGggPSBsZW47CiAJbWVtY3B5KGJzc2lkLT5JRXMsIChwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSksIGJzc2lkLT5JRUxlbmd0aCk7CiAKLQkvKiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCAqLwotCWJzc2lkLT5Sc3NpID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5waHlfaW5mby5yZWN2cG93ZXI7IC8qICBpbiBkQk0ucmF3IGRhdGEgKi8KLQlic3NpZC0+UGh5SW5mby5TaWduYWxRdWFsaXR5ID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5waHlfaW5mby5TaWduYWxRdWFsaXR5Oy8qIGluIHBlcmNlbnRhZ2UgKi8KLQlic3NpZC0+UGh5SW5mby5TaWduYWxTdHJlbmd0aCA9IHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIucGh5X2luZm8uU2lnbmFsU3RyZW5ndGg7LyogaW4gcGVyY2VudGFnZSAqLworCS8qIGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoIGluIGRCTS5yYXcgZGF0YSAqLworCWJzc2lkLT5Sc3NpID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5waHlfaW5mby5yZWN2cG93ZXI7CisJYnNzaWQtPlBoeUluZm8uU2lnbmFsUXVhbGl0eSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8uU2lnbmFsUXVhbGl0eTsvKiBpbiBwZXJjZW50YWdlICovCisJYnNzaWQtPlBoeUluZm8uU2lnbmFsU3RyZW5ndGggPSBwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLlNpZ25hbFN0cmVuZ3RoOy8qIGluIHBlcmNlbnRhZ2UgKi8KIAlydHdfaGFsX2dldF9kZWZfdmFyKHBhZGFwdGVyLCBIQUxfREVGX0NVUlJFTlRfQU5URU5OQSwgICZic3NpZC0+UGh5SW5mby5PcHRpbXVtX2FudGVubmEpOwogCiAJLyogIGNoZWNraW5nIFNTSUQgKi8KQEAgLTY3MDcsNyArNjcyMiw3IEBACiAJLyogdXBkYXRlIHdpcmVsZXNzIG1vZGUgKi8KIAl1cGRhdGVfd2lyZWxlc3NfbW9kZShwYWRhcHRlcik7CiAKLQkvKiB1ZHBhdGUgY2FwYWJpbGl0eSAqLworCS8qIHVwZGF0ZSBjYXBhYmlsaXR5ICovCiAJY2FwcyA9IHJ0d19nZXRfY2FwYWJpbGl0eSgoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwbmV0d29yayk7CiAJdXBkYXRlX2NhcGluZm8ocGFkYXB0ZXIsIGNhcHMpOwogCWlmIChjYXBzJmNhcF9JQlNTKSB7LyogYWRob2MgbWFzdGVyICovCkBAIC02NzU5LDcgKzY3NzQsNyBAQAogCS8qIHVwZGF0ZSB3aXJlbGVzcyBtb2RlICovCiAJdXBkYXRlX3dpcmVsZXNzX21vZGUocGFkYXB0ZXIpOwogCi0JLyogdWRwYXRlIGNhcGFiaWxpdHkgKi8KKwkvKiB1cGRhdGUgY2FwYWJpbGl0eSAqLwogCWNhcHMgPSBydHdfZ2V0X2NhcGFiaWxpdHkoKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcG5ldHdvcmspOwogCXVwZGF0ZV9jYXBpbmZvKHBhZGFwdGVyLCBjYXBzKTsKIAlpZiAoY2FwcyZjYXBfRVNTKSB7CkBAIC02ODUxLDcgKzY4NjYsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKIAkvKiBjaGVjayBBMyAqLwotCWlmICghKF9ydHdfbWVtY21wKE1hY0FkZHIsIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pKSkKKwlpZiAobWVtY21wKE1hY0FkZHIsIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwpAQCAtNzAyOCw3ICs3MDQzLDggQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgcmVwb3J0X3N1cnZleV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordm9pZCByZXBvcnRfc3VydmV5X2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJc3RydWN0IGNtZF9vYmogKnBjbWRfb2JqOwogCXU4ICpwZXZ0Y21kOwpAQCAtNzAzNyw4ICs3MDUzLDYgQEAKIAlzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICpwYzJoX2V2dF9oZHI7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwogCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXY7Ci0JLyogdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOyAqLwotCS8qIHVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsgKi8KIAogCWlmICghcGFkYXB0ZXIpCiAJCXJldHVybjsKQEAgLTczNzMsNyArNzM4Nyw3IEBACiAJLyogdHVybiBvbiBkeW5hbWljIGZ1bmN0aW9ucyAqLwogCVN3aXRjaF9ETV9GdW5jKHBhZGFwdGVyLCBEWU5BTUlDX0FMTF9GVU5DX0VOQUJMRSwgdHJ1ZSk7CiAKLQkvKiAgdXBkYXRlIElPVC1yZWxlYXRlZCBpc3N1ZSAqLworCS8qICB1cGRhdGUgSU9ULXJlbGF0ZWQgaXNzdWUgKi8KIAl1cGRhdGVfSU9UX2luZm8ocGFkYXB0ZXIpOwogCiAJcnR3X2hhbF9zZXRfaHdyZWcocGFkYXB0ZXIsIEhXX1ZBUl9CQVNJQ19SQVRFLCBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwpAQCAtNzM4MSw3ICs3Mzk1LDcgQEAKIAkvKiBCQ04gaW50ZXJ2YWwgKi8KIAlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX0JFQUNPTl9JTlRFUlZBTCwgKHU4ICopKCZwbWxtZWluZm8tPmJjbl9pbnRlcnZhbCkpOwogCi0JLyogdWRwYXRlIGNhcGFiaWxpdHkgKi8KKwkvKiB1cGRhdGUgY2FwYWJpbGl0eSAqLwogCXVwZGF0ZV9jYXBpbmZvKHBhZGFwdGVyLCBwbWxtZWluZm8tPmNhcGFiaWxpdHkpOwogCiAJLyogV01NLCBVcGRhdGUgRURDQSBwYXJhbSAqLwpAQCAtNzkwMiw3ICs3OTE2LDcgQEAKIAogCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86LyogR2V0IFdNTSBJRS4gKi8KLQkJCWlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFdNTV9PVUksIDQpKQorCQkJaWYgKCFtZW1jbXAocElFLT5kYXRhLCBXTU1fT1VJLCA0KSkKIAkJCQlwbWxtZWluZm8tPldNTV9lbmFibGUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgX0hUX0NBUEFCSUxJVFlfSUVfOgkvKiBHZXQgSFQgQ2FwIElFLiAqLwpAQCAtODAxNiw3ICs4MDMwLDcgQEAKIAkJc2V0X2lkeCA9IHJ0d19jaF9zZXRfc2VhcmNoX2NoKHBtbG1lZXh0LT5jaGFubmVsX3NldCwgaW5baV0uaHdfdmFsdWUpOwogCQlpZiAoaW5baV0uaHdfdmFsdWUgJiYgIShpbltpXS5mbGFncyAmIFJUV19JRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkgJiYKIAkJICAgIHNldF9pZHggPj0gMCkgewotCQkJbWVtY3B5KCZvdXRbal0sICZpbltpXSwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKKwkJCW91dFtqXSA9IGluW2ldOwogCiAJCQlpZiAocG1sbWVleHQtPmNoYW5uZWxfc2V0W3NldF9pZHhdLlNjYW5UeXBlID09IFNDQU5fUEFTU0lWRSkKIAkJCQlvdXRbal0uZmxhZ3MgJj0gUlRXX0lFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKQEAgLTgyNjEsNyArODI3NSw2IEBACiAJdTggcmVzID0gX1NVQ0NFU1M7CiAJaW50IGxlbl9kaWZmID0gMDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTgyOTAsNyArODMwMyw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTgzNjgsMTIgKzgzODAsMTIgQEAKIAkJCXNwaW5fbG9ja19iaCgmcHN0YV9ibWMtPnNsZWVwX3EubG9jayk7CiAKIAkJCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGFfYm1jLT5zbGVlcF9xKTsKLQkJCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAkJCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSB7Ci0JCQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQkJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQkJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQkJCXJ0d19saXN0X2RlbGV0ZSgmcHhtaXRmcmFtZS0+bGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXAuYwppbmRleCA2NDUxZWZkLi43MDVmNjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcC5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgogI2luY2x1ZGUgInJ0bDgxODhlX2hhbC5oIgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogdTMyIHJlYWRfbWFjcmVnKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBzeikKIHsKQEAgLTQwNiw3ICs0MDcsNyBAQAogCQlnb3RvIGVuZF9vZl9tcF9zdGFydF90ZXN0OwogCX0KIAotCS8qIDMgMy4gam9pbiBwc3VkbyBBZEhvYyAqLworCS8qIDMgMy4gam9pbiBwc2V1ZG8gQWRIb2MgKi8KIAl0Z3RfbmV0d29yay0+am9pbl9yZXMgPSAxOwogCXRndF9uZXR3b3JrLT5haWQgPSAxOwogCXBzdGEtPmFpZCA9IDE7CkBAIC00NDIsNyArNDQzLDcgQEAKIAkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSA9PSBmYWxzZSkKIAkJCWdvdG8gZW5kX29mX21wX3N0b3BfdGVzdDsKIAotCQkvKiAzIDEuIGRpc2Nvbm5lY3QgcHN1ZG8gQWRIb2MgKi8KKwkJLyogMyAxLiBkaXNjb25uZWN0IHBzZXVkbyBBZEhvYyAqLwogCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdChwYWRhcHRlcik7CiAKIAkJLyogMyAyLiBjbGVhciBwc3RhIHVzZWQgaW4gbXAgdGVzdCBtb2RlLiAqLwpAQCAtODgyLDcgKzg4Myw3IEBACiB7CiAJdTMyIGksIHBzZF9wdHMgPSAwLCBwc2Rfc3RhcnQgPSAwLCBwc2Rfc3RvcCA9IDA7CiAJdTMyIHBzZF9kYXRhID0gMDsKLQorCWludCByZXQ7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcocEFkYXB0ZXItPnBuZXRkZXYpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X3dhcm5pbmdfLCAoIm1wX3F1ZXJ5X3BzZDogRmFpbCEgaW50ZXJmYWNlIG5vdCBvcGVuZWQhXG4iKSk7CkBAIC04OTksNyArOTAwLDEwIEBACiAJCXBzZF9zdGFydCA9IDY0OwogCQlwc2Rfc3RvcCA9IDEyODsKIAl9IGVsc2UgewotCQlzc2NhbmYoZGF0YSwgInB0cyA9JWQsIHN0YXJ0ID0lZCwgc3RvcCA9JWQiLCAmcHNkX3B0cywgJnBzZF9zdGFydCwgJnBzZF9zdG9wKTsKKwkJcmV0ID0gc3NjYW5mKGRhdGEsICJwdHMgPSVkLCBzdGFydCA9JWQsIHN0b3AgPSVkIiwKKwkJCQkmcHNkX3B0cywgJnBzZF9zdGFydCwgJnBzZF9zdG9wKTsKKwkJaWYgKHJldCAhPSAzKQorCQkJcmV0dXJuIDA7CiAJfQogCiAJX3J0d19tZW1zZXQoZGF0YSwgJ1wwJywgc2l6ZW9mKCpkYXRhKSk7CkBAIC05NDMsNyArOTQ3LDcgQEAKIAl9CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmKQotCQlydHdfdm1mcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiwgbnVtX3htaXRfZXh0YnVmICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKKwkJdmZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmKTsKIAogCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1wX21vZGUgPT0gMCkgewogCQltYXhfeG1pdF9leHRidWZfc2l6ZSA9IDIwMDAwOwpAQCAtOTU2LDcgKzk2MCw3IEBACiAJLyogIEluaXQgeG1pdCBleHRlbnNpb24gYnVmZiAqLwogCV9ydHdfaW5pdF9xdWV1ZSgmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlKTsKIAotCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiA9IHJ0d196dm1hbGxvYyhudW1feG1pdF9leHRidWYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOworCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiA9IHZ6YWxsb2MobnVtX3htaXRfZXh0YnVmICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYgID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJhbGxvYyB4bWl0X2V4dGJ1ZiBmYWlsIVxuIikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcF9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcF9pb2N0bC5jCmluZGV4IGVkY2Q4YTUuLmU3ODM5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXBfaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wX2lvY3RsLmMKQEAgLTMzLDcgKzMzLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmX2xlbiA8IHNpemVvZih1OCkpCiAJCXJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0xFTkdUSDsKQEAgLTQ4LDcgKzQ3LDYgQEAKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNjEsNyArNTksNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3dyaXRlX2JiX3JlZ19oZGxcbiIpKTsKIApAQCAtODcsNyArODQsNiBAQAogCXdyaXRlX2JicmVnKEFkYXB0ZXIsIG9mZnNldCwgMHhGRkZGRkZGRiwgdmFsdWUpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDAsNyArOTYsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3JlYWRfYmJfcmVnX2hkbFxuIikpOwogCkBAIC0xMjYsNyArMTIxLDYgQEAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fcmVhZF9iYl9yZWdfaGRsOiBvZmZzZXQ9MHglMDNYIHZhbHVlOjB4JTA4WFxuIiwKIAkJICBvZmZzZXQsIHZhbHVlKSk7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDAsNyArMTM0LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb193cml0ZV9yZl9yZWdfaGRsXG4iKSk7CiAKQEAgLTE3MSw3ICsxNjQsNiBAQAogCXdyaXRlX3JmcmVnKEFkYXB0ZXIsIHBhdGgsIG9mZnNldCwgdmFsdWUpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xODUsNyArMTc3LDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19yZWFkX3JmX3JlZ19oZGxcbiIpKTsKIApAQCAtMjE3LDcgKzIwOCw2IEBACiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb19yZWFkX3JmX3JlZ19oZGw6IHBhdGg9JWQgb2Zmc2V0PTB4JTAyWCB2YWx1ZT0weCUwNVhcbiIsCiAJCSAgcGF0aCwgb2Zmc2V0LCB2YWx1ZSkpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMzIsNyArMjIyLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLAogCQkgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X2RhdGFfcmF0ZV9oZGxcbiIpKTsKQEAgLTI1NSw3ICsyNDQsNiBAQAogCVNldERhdGFSYXRlKEFkYXB0ZXIpOwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yNjYsNyArMjU0LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zdGFydF90ZXN0X2hkbFxuIikpOwogCkBAIC0yOTMsNyArMjgwLDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX3N0YXJ0X3Rlc3RfaGRsOiBtcF9tb2RlPSVkXG4iLCBBZGFwdGVyLT5tcHByaXYubW9kZSkpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zMDMsNyArMjg5LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitTZXQgT0lEX1JUX1BST19TVE9QX1RFU1RcbiIpKTsKIApAQCAtMzE2LDcgKzMwMSw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIi1TZXQgT0lEX1JUX1BST19TVE9QX1RFU1RcbiIpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzI3LDcgKzMxMSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X2NoYW5uZWxfZGlyZWN0X2NhbGxfaGRsXG4iKSk7CiAKQEAgLTM1Miw3ICszMzUsNiBAQAogCVNldENoYW5uZWwoQWRhcHRlcik7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTM2NCw3ICszNDYsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywKIAkJICgiK3J0bDgxODhldV9vaWRfcnRfc2V0X2JhbmR3aWR0aF9oZGxcbiIpKTsKQEAgLTM5MSw3ICszNzIsNiBAQAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9zZXRfYmFuZHdpZHRoX2hkbDogYmFuZHdpZHRoPSVkIGNoYW5uZWxfb2Zmc2V0PSVkXG4iLAogCQkgIGJhbmR3aWR0aCwgY2hhbm5lbF9vZmZzZXQpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDAyLDcgKzM4Miw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X2FudGVubmFfYmJfaGRsXG4iKSk7CiAKQEAgLTQyNiw3ICs0MDUsNiBAQAogCQkqKHUzMiAqKXBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1ZiA9IGFudGVubmE7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00MzcsNyArNDE1LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X3R4X3Bvd2VyX2NvbnRyb2xfaGRsXG4iKSk7CiAKQEAgLTQ2MSw3ICs0MzgsNiBAQAogCVNldFR4UG93ZXIoQWRhcHRlcik7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ3NCw3ICs0NTAsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBRVUVSWV9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtNDg4LDcgKzQ2Myw2IEBACiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfTEVOR1RIOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDk4LDcgKzQ3Miw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFFVRVJZX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC01MTMsNyArNDg2LDYgQEAKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9MRU5HVEg7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01MjMsNyArNDk1LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gUVVFUllfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTUzOCw3ICs1MDksNiBAQAogCQlzdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0xFTkdUSDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU0OSw3ICs1MTksNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBTRVRfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTU1OSw3ICs1MjgsNiBAQAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2FsZXJ0XywgKCI9PT0+IHJ0bDgxODhldV9vaWRfcnRfcHJvX3Jlc2V0X3R4X3BhY2tldF9zZW50X2hkbC5cbiIpKTsKIAlBZGFwdGVyLT5tcHByaXYudHhfcGt0Y291bnQgPSAwOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NjksNyArNTM3LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gU0VUX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC01ODMsNyArNTUwLDYgQEAKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9MRU5HVEg7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01OTMsNyArNTU5LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gU0VUX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC02MDQsNyArNTY5LDYgQEAKIAlSZXNldFBoeVJ4UGt0Q291bnQoQWRhcHRlcik7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTYxNCw3ICs1NzgsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLCAoIitydGw4MTg4ZXVfb2lkX3J0X2dldF9waHlfcnhfcGFja2V0X3JlY2VpdmVkX2hkbFxuIikpOwogCkBAIC02MzIsNyArNTk1LDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiLXJ0bDgxODhldV9vaWRfcnRfZ2V0X3BoeV9yeF9wYWNrZXRfcmVjZWl2ZWRfaGRsOiByZWN2X29rPSVkXG4iLCAqKHUzMiAqKXBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1ZikpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02NDIsNyArNjA0LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywgKCIrcnRsODE4OGV1X29pZF9ydF9nZXRfcGh5X3J4X3BhY2tldF9jcmMzMl9lcnJvcl9oZGxcbiIpKTsKIApAQCAtNjYzLDcgKzYyNCw2IEBACiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X2dldF9waHlfcnhfcGFja2V0X2NyYzMyX2Vycm9yX2hkbDogcmVjdl9lcnIgPSVkXG4iLAogCQkgKih1MzIgKilwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWYpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNjc0LDcgKzYzNCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X2NvbnRpbnVvdXNfdHhfaGRsXG4iKSk7CiAKQEAgLTY5OCw3ICs2NTcsNiBAQAogCX0KIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNzA5LDcgKzY2Nyw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfYWxlcnRfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfc2luZ2xlX2NhcnJpZXJfdHhfaGRsXG4iKSk7CiAKQEAgLTczMyw3ICs2OTAsNiBAQAogCX0KIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNzQ0LDcgKzcwMCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fc2V0X2NhcnJpZXJfc3VwcHJlc3Npb25fdHhfaGRsXG4iKSk7CiAKQEAgLTc2OCw3ICs3MjMsNiBAQAogCX0KIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNzc5LDcgKzczMyw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfYWxlcnRfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfc2luZ2xlX3RvbmVfdHhfaGRsXG4iKSk7CiAKQEAgLTc5Miw3ICs3NDUsNiBAQAogCVNldFNpbmdsZVRvbmVUeChBZGFwdGVyLCAodTgpYlN0YXJ0VGVzdCk7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTgwNiw3ICs3NTgsNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gU0VUX09JRCkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTgxNSw3ICs3NjYsNiBAQAogCXJ0d19oYWxfc2V0X2h3cmVnKEFkYXB0ZXIsIEhXX1ZBUl9UUklHR0VSX0dQSU9fMCwgTlVMTCk7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTgzMyw3ICs3ODMsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLAogCQkgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fcmVhZF9yZWdpc3Rlcl9oZGxcbiIpKTsKQEAgLTg3MCw3ICs4MTksNiBAQAogCiAJKnBvaWRfcGFyX3ByaXYtPmJ5dGVzX3J3ID0gd2lkdGg7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTg4Miw3ICs4MzAsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywKIAkJICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3dyaXRlX3JlZ2lzdGVyX2hkbFxuIikpOwpAQCAtOTI5LDcgKzg3Niw2IEBACiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb193cml0ZV9yZWdpc3Rlcl9oZGw6IG9mZnNldD0weCUwOFggd2lkdGg9JWQgdmFsdWU9MHglWFxuIiwKIAkJICBvZmZzZXQsIHdpZHRoLCB2YWx1ZSkpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDAyLDcgKzk0OCw2IEBACiAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrT0lEX1JUX1BST19TRVRfREFUQV9SQVRFX0VYXG4iKSk7CiAKQEAgLTEwMTYsNyArOTYxLDYgQEAKIAogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDI3LDcgKzk3MSw2IEBACiAJdTggdGhlcm1hbCA9IDA7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9nZXRfdGhlcm1hbF9tZXRlcl9oZGxcbiIpKTsKIApAQCAtMTA0NCw3ICs5ODcsNiBAQAogCSoodTMyICopcG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmID0gKHUzMil0aGVybWFsOwogCSpwb2lkX3Bhcl9wcml2LT5ieXRlc19ydyA9IHNpemVvZih1MzIpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDYwLDcgKzEwMDIsNiBAQAogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1Zl9sZW4gPCBzaXplb2YodTgpKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfSU5WQUxJRF9MRU5HVEg7CkBAIC0xMDc5LDcgKzEwMjAsNiBAQAogCX0KIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTE0Myw3ICsxMDgzLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gUVVFUllfT0lEKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtMTE3Niw3ICsxMTE1LDYgQEAKIAl9CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExOTAsNyArMTEyOCw2IEBACiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gU0VUX09JRCkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTEyMTYsNyArMTE1Myw2IEBACiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEyMjcsNyArMTE2Myw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJKnBvaWRfcGFyX3ByaXYtPmJ5dGVzX3J3ID0gMDsKIApAQCAtMTI2Nyw3ICsxMjAyLDYgQEAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX3J3X2VmdXNlX3BncGt0X2hkbDogc3RhdHVzPTB4JTA4WFxuIiwgc3RhdHVzKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEyNzksNyArMTIxMyw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFFVRVJZX09JRCkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTEyOTYsNyArMTIyOSw2IEBACiAJfSBlbHNlIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMzA2LDcgKzEyMzgsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBRVUVSWV9PSUQpCiAJCXJldHVybiBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC0xMzIxLDcgKzEyNTIsNiBAQAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9nZXRfZWZ1c2VfbWF4X3NpemVfaGRsOiBzaXplPSVkIHN0YXR1cz0weCUwOFhcbiIsCiAJCSAgKihpbnQgKilwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWYsIHN0YXR1cykpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMzMwLDcgKzEyNjAsNiBAQAogewogCWludCBzdGF0dXM7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19lZnVzZV9oZGxcbiIpKTsKIApAQCAtMTM0MSw3ICsxMjcwLDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLCAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb19lZnVzZV9oZGw6IHN0YXR1cz0weCUwOFhcbiIsIHN0YXR1cykpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMzUzLDcgKzEyODEsNiBAQAogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAJdTE2CW1hcGxlbiA9IDA7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX2VmdXNlX21hcF9oZGxcbiIpKTsKIApAQCAtMTM5OCw3ICsxMzI1LDYgQEAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX2VmdXNlX21hcF9oZGw6IHN0YXR1cz0weCUwOFhcbiIsIHN0YXR1cykpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDE0LDcgKzEzNDAsNiBAQAogCXU4CQlyeF9wa3RfdHlwZTsKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9zZXRfcnhfcGFja2V0X3R5cGVfaGRsXG4iKSk7CiAKQEAgLTE0MjcsNyArMTM1Miw2IEBACiAJcnhfcGt0X3R5cGUgPSAqKCh1OCAqKXBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1Zik7LyogNCAqLwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sICgicnhfcGt0X3R5cGU6ICV4XG4iLCByeF9wa3RfdHlwZSkpOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQ4Miw3ICsxNDA2LDYgQEAKIHsKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFNFVF9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtMTQ5Nyw3ICsxNDIwLDYgQEAKIAkvKiBDQUxMICB0aGUgcG93ZXJfZG93biBmdW5jdGlvbiAqLwogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3AycC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wMnAuYwppbmRleCA2ZThjMDZlLi45NDI1YzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3AycC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcDJwLmMKQEAgLTU3LDEzICs1NywxMyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qIGxvb2sgdXAgc3RhIGFzb2NfcXVldWUgKi8KIAl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAogCQlpZiAocHN0YS0+aXNfcDJwX2RldmljZSkgewpAQCAtODI0LDcgKzgyNCw3IEBACiAJaWYgKHJ0d19wMnBfY2hrX3JvbGUocHdkaW5mbywgUDJQX1JPTEVfREVWSUNFKSB8fCBydHdfcDJwX2Noa19yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0dPKSkgewogCQlwMnBpZSA9IHJ0d19nZXRfcDJwX2llKHBmcmFtZSArIFdMQU5fSERSX0EzX0xFTiArIF9QUk9CRVJFUV9JRV9PRkZTRVRfICwgbGVuIC0gV0xBTl9IRFJfQTNfTEVOIC0gX1BST0JFUkVRX0lFX09GRlNFVF8gLCBOVUxMLCAmcDJwaWVsZW4pOwogCQlpZiAocDJwaWUpIHsKLQkJCWlmICgocCAhPSBOVUxMKSAmJiBfcnR3X21lbWNtcCgodm9pZCAqKShwKzIpLCAodm9pZCAqKXB3ZGluZm8tPnAycF93aWxkY2FyZF9zc2lkICwgNykpIHsKKwkJCWlmICgocCAhPSBOVUxMKSAmJiAhbWVtY21wKCh2b2lkICopKHArMiksICh2b2lkICopcHdkaW5mby0+cDJwX3dpbGRjYXJkX3NzaWQgLCA3KSkgewogCQkJCS8qIHRvZG86ICovCiAJCQkJLyogQ2hlY2sgUmVxdWVzdGVkIERldmljZSBUeXBlIGF0dHJpYnV0ZXMgaW4gV1NDIElFLiAqLwogCQkJCS8qIENoZWNrIERldmljZSBJRCBhdHRyaWJ1dGUgaW4gUDJQIElFICovCkBAIC05NzIsMjQgKzk3MiwyNCBAQAogCQl1MzIJYXR0cl9jb250ZW50bGVuID0gMDsKIAogCQlpZiAocnR3X2dldF9wMnBfYXR0cl9jb250ZW50KHAycF9pZSwgcDJwX2llbGVuLCBQMlBfQVRUUl9HUk9VUF9JRCwgZ3JvdXBpZCwgJmF0dHJfY29udGVudGxlbikpIHsKLQkJCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5kZXZpY2VfYWRkciwgZ3JvdXBpZCwgRVRIX0FMRU4pICYmCi0JCQkgICAgX3J0d19tZW1jbXAocHdkaW5mby0+cDJwX2dyb3VwX3NzaWQsIGdyb3VwaWQrRVRIX0FMRU4sIHB3ZGluZm8tPnAycF9ncm91cF9zc2lkX2xlbikpIHsKKwkJCWlmICghbWVtY21wKHB3ZGluZm8tPmRldmljZV9hZGRyLCBncm91cGlkLCBFVEhfQUxFTikgJiYKKwkJCSAgICAhbWVtY21wKHB3ZGluZm8tPnAycF9ncm91cF9zc2lkLCBncm91cGlkK0VUSF9BTEVOLCBwd2RpbmZvLT5wMnBfZ3JvdXBfc3NpZF9sZW4pKSB7CiAJCQkJYXR0cl9jb250ZW50bGVuID0gMDsKIAkJCQlpZiAocnR3X2dldF9wMnBfYXR0cl9jb250ZW50KHAycF9pZSwgcDJwX2llbGVuLCBQMlBfQVRUUl9ERVZJQ0VfSUQsIGRldl9hZGRyLCAmYXR0cl9jb250ZW50bGVuKSkgewogCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwogCiAJCQkJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAkJCQkJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQkJCQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCQkJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJCQkJLyogbG9vayB1cCBzdGEgYXNvY19xdWV1ZSAqLwogCQkJCQl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCQkJCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJCQkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKIAotCQkJCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQkJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQkJCQlpZiAocHN0YS0+aXNfcDJwX2RldmljZSAmJiAocHN0YS0+ZGV2X2NhcCZQMlBfREVWQ0FQX0NMSUVOVF9ESVNDT1ZFUkFCSUxJVFkpICYmCi0JCQkJCQkgICAgX3J0d19tZW1jbXAocHN0YS0+ZGV2X2FkZHIsIGRldl9hZGRyLCBFVEhfQUxFTikpIHsKKwkJCQkJCSAgICAhbWVtY21wKHBzdGEtPmRldl9hZGRyLCBkZXZfYWRkciwgRVRIX0FMRU4pKSB7CiAJCQkJCQkJLyogaXNzdWUgR08gRGlzY292ZXJhYmlsaXR5IFJlcXVlc3QgKi8KIAkJCQkJCQlpc3N1ZV9ncm91cF9kaXNjX3JlcShwd2RpbmZvLCBwc3RhLT5od2FkZHIpOwogCQkJCQkJCXN0YXR1cyA9IFAyUF9TVEFUVVNfU1VDQ0VTUzsKQEAgLTExMTgsNyArMTExOCw3IEBACiAJCS8qCUNvbW1lbnRlZCBieSBLdXJ0IDIwMTIwMTEzICovCiAJCS8qCUlmIHNvbWUgZGV2aWNlIHdhbnRzIHRvIGRvIHAycCBoYW5kc2hha2Ugd2l0aG91dCBzZW5kaW5nIHByb3ZfZGlzY19yZXEgKi8KIAkJLyoJV2UgaGF2ZSB0byBnZXQgcGVlcl9yZXFfY20gZnJvbSBoZXJlLiAqLwotCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8uc3RyY29uZmlnX21ldGhvZF9kZXNjX29mX3Byb3ZfZGlzY19yZXEsICIwMDAiLCAzKSkgeworCQlpZiAoIW1lbWNtcChwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5zdHJjb25maWdfbWV0aG9kX2Rlc2Nfb2ZfcHJvdl9kaXNjX3JlcSwgIjAwMCIsIDMpKSB7CiAJCQlydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQod3BzaWUsIHdwc19pZWxlbiwgV1BTX0FUVFJfREVWSUNFX1BXSUQsICh1OCAqKSZiZV90bXAsICZ3cHNfZGV2aWNlcGFzc3dvcmRfaWRfbGVuKTsKIAkJCXdwc19kZXZpY2VwYXNzd29yZF9pZCA9IGJlMTZfdG9fY3B1KGJlX3RtcCk7CiAKQEAgLTE0OTgsNyArMTQ5OCw2IEBACiAJc3RydWN0IG5kaXNfODAyXzExX3NzaWQJc3NpZDsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlfcnR3X21lbXNldCgodW5zaWduZWQgY2hhciAqKSZzc2lkLCAwLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKIAltZW1jcHkoc3NpZC5Tc2lkLCBwd2RpbmZvLT5wMnBfd2lsZGNhcmRfc3NpZCwgUDJQX1dJTERDQVJEX1NTSURfTEVOKTsKQEAgLTE1MDksNyArMTUwOCw2IEBACiAgICAgICAgIHNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKICAgICAgICAgcnR3X3NpdGVzdXJ2ZXlfY21kKHBhZGFwdGVyLCAmc3NpZCwgMSwgTlVMTCwgMCk7CiAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcDJwX2NvbmN1cnJlbnRfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpAQCAtMTUxOCw3ICsxNTE2LDYgQEAKIHsKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICAqcHdkaW5mbyA9ICZwYWRhcHRlci0+d2RpbmZvOwogCi1fZnVuY19lbnRlcl87CiAJaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9HT05FR09fSU5HKSB8fCBydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfR09ORUdPX0ZBSUwpKQogCQlydHdfcDJwX3NldF9yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0RFVklDRSk7CiAJcnR3X3AycF9zZXRfc3RhdGUocHdkaW5mbywgcnR3X3AycF9wcmVfc3RhdGUocHdkaW5mbykpOwpAQCAtMTUyOCw1NCArMTUyNSw0NiBAQAogCQkvKgliZWNhdXNlIHRoaXMgUDJQIGNsaWVudCBzaG91bGQgc3RheSBhdCB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgb2YgUDJQIEdPLiAqLwogCQlzZXRfY2hhbm5lbF9id21vZGUocGFkYXB0ZXIsIHB3ZGluZm8tPmxpc3Rlbl9jaGFubmVsLCBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFLCBIVF9DSEFOTkVMX1dJRFRIXzIwKTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgcHJlX3R4X2ludml0ZXJlcV9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICAqcHdkaW5mbyA9ICZwYWRhcHRlci0+d2RpbmZvOwogCXU4CXZhbDggPSAxOwotX2Z1bmNfZW50ZXJfOwogCiAJc2V0X2NoYW5uZWxfYndtb2RlKHBhZGFwdGVyLCBwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5wZWVyX2NoLCBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFLCBIVF9DSEFOTkVMX1dJRFRIXzIwKTsKIAlwYWRhcHRlci0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIocGFkYXB0ZXIsIEhXX1ZBUl9NTE1FX1NJVEVTVVJWRVksICh1OCAqKSgmdmFsOCkpOwogCWlzc3VlX3Byb2JlcmVxX3AycChwYWRhcHRlciwgTlVMTCk7CiAJX3NldF90aW1lcigmcHdkaW5mby0+cHJlX3R4X3NjYW5fdGltZXIsIFAyUF9UWF9QUkVTQ0FOX1RJTUVPVVQpOwogCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgcHJlX3R4X3Byb3ZkaXNjX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gICpwd2RpbmZvID0gJnBhZGFwdGVyLT53ZGluZm87CiAJdTgJdmFsOCA9IDE7Ci1fZnVuY19lbnRlcl87CiAKIAlzZXRfY2hhbm5lbF9id21vZGUocGFkYXB0ZXIsIHB3ZGluZm8tPnR4X3Byb3ZfZGlzY19pbmZvLnBlZXJfY2hhbm5lbF9udW1bMF0sIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsIEhUX0NIQU5ORUxfV0lEVEhfMjApOwogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfTUxNRV9TSVRFU1VSVkVZLCAodTggKikoJnZhbDgpKTsKIAlpc3N1ZV9wcm9iZXJlcV9wMnAocGFkYXB0ZXIsIE5VTEwpOwogCV9zZXRfdGltZXIoJnB3ZGluZm8tPnByZV90eF9zY2FuX3RpbWVyLCBQMlBfVFhfUFJFU0NBTl9USU1FT1VUKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHByZV90eF9uZWdvcmVxX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gICpwd2RpbmZvID0gJnBhZGFwdGVyLT53ZGluZm87CiAJdTgJdmFsOCA9IDE7Ci1fZnVuY19lbnRlcl87CiAKIAlzZXRfY2hhbm5lbF9id21vZGUocGFkYXB0ZXIsIHB3ZGluZm8tPm5lZ29fcmVxX2luZm8ucGVlcl9jaGFubmVsX251bVswXSwgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwgSFRfQ0hBTk5FTF9XSURUSF8yMCk7CiAJcnR3X2hhbF9zZXRfaHdyZWcocGFkYXB0ZXIsIEhXX1ZBUl9NTE1FX1NJVEVTVVJWRVksICh1OCAqKSgmdmFsOCkpOwogCWlzc3VlX3Byb2JlcmVxX3AycChwYWRhcHRlciwgTlVMTCk7CiAJX3NldF90aW1lcigmcHdkaW5mby0+cHJlX3R4X3NjYW5fdGltZXIsIFAyUF9UWF9QUkVTQ0FOX1RJTUVPVVQpOwogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBwMnBfcHJvdG9jb2xfd2tfaGRsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgaW50IGludENtZFR5cGUpCiB7Ci1fZnVuY19lbnRlcl87CiAJc3dpdGNoIChpbnRDbWRUeXBlKSB7CiAJY2FzZSBQMlBfRklORF9QSEFTRV9XSzoKIAkJZmluZF9waGFzZV9oYW5kbGVyKHBhZGFwdGVyKTsKQEAgLTE1OTQsNyArMTU4Myw2IEBACiAJCWJyZWFrOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcHJvY2Vzc19wMnBfcHNfaWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqSUVzLCB1MzIgSUVMZW5ndGgpCkBAIC0xNjEwLDcgKzE1OTgsNiBAQAogCXU4CWZpbmRfcDJwID0gZmFsc2UsIGZpbmRfcDJwX3BzID0gZmFsc2U7CiAJdTgJbm9hX29mZnNldCwgbm9hX251bSwgbm9hX2luZGV4OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX05PTkUpKQogCQlyZXR1cm47CkBAIC0xNjgzLDcgKzE2NzAsNiBAQAogCQkJcDJwX3BzX3drX2NtZChwYWRhcHRlciwgUDJQX1BTX0RJU0FCTEUsIDEpOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcDJwX3BzX3drX2hkbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHAycF9wc19zdGF0ZSkKQEAgLTE2OTEsNyArMTY3Nyw2IEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdgkJKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8JKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwogCi1fZnVuY19lbnRlcl87CiAKIAkvKiAgUHJlIGFjdGlvbiBmb3IgcDJwIHN0YXRlICovCiAJc3dpdGNoIChwMnBfcHNfc3RhdGUpIHsKQEAgLTE3MzgsNyArMTcyMyw2IEBACiAJCWJyZWFrOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHU4IHAycF9wc193a19jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwMnBfcHNfc3RhdGUsIHU4IGVucXVldWUpCkBAIC0xNzQ5LDcgKzE3MzMsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfTk9ORSkpCiAJCXJldHVybiByZXM7CkBAIC0xNzgxLDcgKzE3NjQsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0yMDI0LDExICsyMDA2LDExIEBACiAKIAkJLyogRGlzYWJsZSBQMlAgZnVuY3Rpb24gKi8KIAkJaWYgKCFydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfTk9ORSkpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJnB3ZGluZm8tPmZpbmRfcGhhc2VfdGltZXIpOwotCQkJX2NhbmNlbF90aW1lcl9leCgmcHdkaW5mby0+cmVzdG9yZV9wMnBfc3RhdGVfdGltZXIpOwotCQkJX2NhbmNlbF90aW1lcl9leCgmcHdkaW5mby0+cHJlX3R4X3NjYW5fdGltZXIpOwotCQkJX2NhbmNlbF90aW1lcl9leCgmcHdkaW5mby0+cmVzZXRfY2hfc2l0ZXN1cnZleSk7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCZwd2RpbmZvLT5yZXNldF9jaF9zaXRlc3VydmV5Mik7CisJCQlkZWxfdGltZXJfc3luYygmcHdkaW5mby0+ZmluZF9waGFzZV90aW1lcik7CisJCQlkZWxfdGltZXJfc3luYygmcHdkaW5mby0+cmVzdG9yZV9wMnBfc3RhdGVfdGltZXIpOworCQkJZGVsX3RpbWVyX3N5bmMoJnB3ZGluZm8tPnByZV90eF9zY2FuX3RpbWVyKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwd2RpbmZvLT5yZXNldF9jaF9zaXRlc3VydmV5KTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwd2RpbmZvLT5yZXNldF9jaF9zaXRlc3VydmV5Mik7CiAJCQlyZXNldF9jaF9zaXRlc3VydmV5X3RpbWVyX3Byb2Nlc3MocGFkYXB0ZXIpOwogCQkJcmVzZXRfY2hfc2l0ZXN1cnZleV90aW1lcl9wcm9jZXNzMihwYWRhcHRlcik7CiAJCQlydHdfcDJwX3NldF9zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfTk9ORSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCmluZGV4IGI1ZGIyMmMuLmY2NTgzNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCkBAIC0yMjYsMTEgKzIyNiw4IEBACiAJdTgJcnB3bTsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJcHNsdiA9IFBTX1NUQVRFKHBzbHYpOwogCi0KIAlpZiAocHdycHJpdi0+YnRjb2V4X3Jmb24pIHsKIAkJaWYgKHBzbHYgPCBQU19TVEFURV9TNCkKIAkJCXBzbHYgPSBQU19TVEFURV9TMzsKQEAgLTI3NCw4ICsyNzEsNiBAQAogCiAJcHdycHJpdi0+dG9nICs9IDB4ODA7CiAJcHdycHJpdi0+Y3B3bSA9IHBzbHY7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdTggUFNfUkRZX0NIRUNLKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKQEAgLTMxMyw4ICszMDgsNiBAQAogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8JKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCi1fZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9ub3RpY2VfLAogCQkgKCIlczogUG93ZXJNb2RlPSVkIFNtYXJ0X1BTPSVkXG4iLAogCQkgIF9fZnVuY19fLCBwc19tb2RlLCBzbWFydF9wcykpOwpAQCAtMzYyLDggKzM1NSw2IEBACiAJCQlydHdfc2V0X3Jwd20ocGFkYXB0ZXIsIFBTX1NUQVRFX1MyKTsKIAkJfQogCX0KLQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC00MTAsOCArNDAxLDYgQEAKIHsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2CSpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKFBTX1JEWV9DSEVDSyhwYWRhcHRlcikgPT0gZmFsc2UpCiAJCXJldHVybjsKIApAQCAtNDI4LDggKzQxNyw2IEBACiAJCQlwd3Jwcml2LT5McHNJZGxlQ291bnQrKzsKIAkJfQogCX0KLQotX2Z1bmNfZXhpdF87CiB9CiAKICNkZWZpbmUgTFBTX0xFQVZFX1RJTUVPVVRfTVMgMTAwCkBAIC00NDAsOCArNDI3LDYgQEAKIHsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2CSpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKHB3cnByaXYtPmJMZWlzdXJlUHMpIHsKIAkJaWYgKHB3cnByaXYtPnB3cl9tb2RlICE9IFBTX01PREVfQUNUSVZFKSB7CiAJCQlydHdfc2V0X3BzX21vZGUocGFkYXB0ZXIsIFBTX01PREVfQUNUSVZFLCAwLCAwKTsKQEAgLTQ1Miw4ICs0MzcsNiBAQAogCX0KIAogCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSBmYWxzZTsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qICAqLwpAQCAtNDY1LDIzICs0NDgsMTcgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmKEFkYXB0ZXItPm1sbWVwcml2KTsKIAl1OAllbnF1ZXVlID0gMDsKIAotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgeyAvKiBjb25uZWN0ICovCiAJCXAycF9wc193a19jbWQoQWRhcHRlciwgUDJQX1BTX0RJU0FCTEUsIGVucXVldWUpOwogCiAJCXJ0d19scHNfY3RybF93a19jbWQoQWRhcHRlciwgTFBTX0NUUkxfTEVBVkUsIGVucXVldWUpOwogCX0KLQotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2luaXRfcHdyY3RybF9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLV9mdW5jX2VudGVyXzsKLQogCV9pbml0X3B3cmxvY2soJnB3cmN0cmxwcml2LT5sb2NrKTsKIAlwd3JjdHJscHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vbjsKIAlwd3JjdHJscHJpdi0+aXBzX2VudGVyX2NudHMgPSAwOwpAQCAtNTE4LDggKzQ5NSw2IEBACiAJcHdyY3RybHByaXYtPmJ0Y29leF9yZm9uID0gZmFsc2U7CiAKIAlfaW5pdF90aW1lcigmKHB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgcHdyX3N0YXRlX2NoZWNrX2hhbmRsZXIsICh1OCAqKXBhZGFwdGVyKTsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHU4IHJ0d19pbnRlcmZhY2VfcHNfZnVuYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIGVudW0gaGFsX2ludGZfcHNfZnVuYyBlZnVuY19pZCwgdTggKnZhbCkKQEAgLTU0MCw3ICs1MTUsNyBAQAogLyoKICogcnR3X3B3cl93YWtldXAgLSBXYWtlIHRoZSBOSUMgdXAgZnJvbTogMSlJUFMuIDIpVVNCIGF1dG9zdXNwZW5kCiAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHN0cnVjdCBhZGFwdGVyIHN0cnVjdHVyZQotKiBAaXBzX2RlZmZlcl9tczogdGhlIG1zIHdpaWwgcHJldmVudCBmcm9tIGZhbGxpbmcgaW50byBJUFMgYWZ0ZXIgd2FrZXVwCisqIEBpcHNfZGVmZmVyX21zOiB0aGUgbXMgd2lsbCBwcmV2ZW50IGZyb20gZmFsbGluZyBpbnRvIElQUyBhZnRlciB3YWtldXAKICogUmV0dXJuIF9TVUNDRVNTIG9yIF9GQUlMCiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCmluZGV4IGM5YzE4MDYuLjYzNmVjNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCkBAIC0yMywxMSArMjMsMTIgQEAKICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KICNpbmNsdWRlIDxyZWN2X29zZGVwLmg+CiAjaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgotI2luY2x1ZGUgPGlwLmg+Ci0jaW5jbHVkZSA8aWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxldGhlcm5ldC5oPgogI2luY2x1ZGUgPHVzYl9vcHMuaD4KICNpbmNsdWRlIDx3aWZpLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFCTE0CS8qICBFdGhlcm5ldCBIZWFkZXIgTGVuZ3RoICovCisjZGVmaW5lIExMQ19IRUFERVJfU0laRQkJCTYJLyogIExMQyBIZWFkZXIgTGVuZ3RoICovCiAKIHN0YXRpYyB1OCBTTkFQX0VUSF9UWVBFX0lQWFsyXSA9IHsweDgxLCAweDM3fTsKIHN0YXRpYyB1OCBTTkFQX0VUSF9UWVBFX0FQUExFVEFMS19BQVJQWzJdID0gezB4ODAsIDB4ZjN9OwpAQCAtNDUsNyArNDYsNiBAQAogCiB2b2lkIF9ydHdfaW5pdF9zdGFfcmVjdl9wcml2KHN0cnVjdCBzdGFfcmVjdl9wcml2ICpwc3RhX3JlY3Zwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCiAJX3J0d19tZW1zZXQoKHU4ICopcHN0YV9yZWN2cHJpdiwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhX3JlY3ZfcHJpdikpOwogCkBAIC01MywxOCArNTMsMTYgQEAKIAogCV9ydHdfaW5pdF9xdWV1ZSgmcHN0YV9yZWN2cHJpdi0+ZGVmcmFnX3EpOwogCi1fZnVuY19leGl0XzsKIH0KIAogaW50IF9ydHdfaW5pdF9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LCBzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50IGk7CiAKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lOwogCiAJaW50CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJc3Bpbl9sb2NrX2luaXQoJnByZWN2cHJpdi0+bG9jayk7CiAKIAlfcnR3X2luaXRfcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKTsKQEAgLTc3LDcgKzc1LDcgQEAKIAogCXJ0d19vc19yZWN2X3Jlc291cmNlX2luaXQocHJlY3Zwcml2LCBwYWRhcHRlcik7CiAKLQlwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmID0gcnR3X3p2bWFsbG9jKE5SX1JFQ1ZGUkFNRSAqIHNpemVvZih1bmlvbiByZWN2X2ZyYW1lKSArIFJYRlJBTUVfQUxJR05fU1opOworCXByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgPSB2emFsbG9jKE5SX1JFQ1ZGUkFNRSAqIHNpemVvZihzdHJ1Y3QgcmVjdl9mcmFtZSkgKyBSWEZSQU1FX0FMSUdOX1NaKTsKIAogCWlmIChwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC04NiwxOCArODQsMTkgQEAKIAogCXByZWN2cHJpdi0+cHJlY3ZfZnJhbWVfYnVmID0gKHU4ICopTl9CWVRFX0FMSUdNRU5UKChzaXplX3QpKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpLCBSWEZSQU1FX0FMSUdOX1NaKTsKIAotCXByZWN2ZnJhbWUgPSAodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2cHJpdi0+cHJlY3ZfZnJhbWVfYnVmOworCXByZWN2ZnJhbWUgPSAoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdnByaXYtPnByZWN2X2ZyYW1lX2J1ZjsKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9SRUNWRlJBTUU7IGkrKykgewotCQlfcnR3X2luaXRfbGlzdGhlYWQoJihwcmVjdmZyYW1lLT51Lmxpc3QpKTsKKwkJX3J0d19pbml0X2xpc3RoZWFkKCYocHJlY3ZmcmFtZS0+bGlzdCkpOwogCi0JCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJlY3ZmcmFtZS0+dS5saXN0KSwgJihwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZS5xdWV1ZSkpOworCQlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZWN2ZnJhbWUtPmxpc3QpLAorCQkJCSAgICAgJihwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZS5xdWV1ZSkpOwogCiAJCXJlcyA9IHJ0d19vc19yZWN2X3Jlc291cmNlX2FsbG9jKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKIAotCQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gPSAwOworCQlwcmVjdmZyYW1lLT5sZW4gPSAwOwogCi0JCXByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXIgPSBwYWRhcHRlcjsKKwkJcHJlY3ZmcmFtZS0+YWRhcHRlciA9IHBhZGFwdGVyOwogCQlwcmVjdmZyYW1lKys7CiAJfQogCXByZWN2cHJpdi0+cnhfcGVuZGluZ19jbnQgPSAxOwpAQCAtMTEzLDcgKzExMiw2IEBACiAJcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcihwcmVjdnByaXYpOwogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTIyLDQwICsxMjAsMzcgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlcgkqcGFkYXB0ZXIgPSBwcmVjdnByaXYtPmFkYXB0ZXI7CiAKLV9mdW5jX2VudGVyXzsKIAogCXJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUocGFkYXB0ZXIpOwogCiAJcnR3X29zX3JlY3ZfcmVzb3VyY2VfZnJlZShwcmVjdnByaXYpOwogCiAJaWYgKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpIHsKLQkJcnR3X3ZtZnJlZShwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmLCBOUl9SRUNWRlJBTUUgKiBzaXplb2YodW5pb24gcmVjdl9mcmFtZSkgKyBSWEZSQU1FX0FMSUdOX1NaKTsKKwkJdmZyZWUocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1Zik7CiAJfQogCiAJcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihwYWRhcHRlcik7CiAKLV9mdW5jX2V4aXRfOwogfQogCi11bmlvbiByZWN2X2ZyYW1lICpfcnR3X2FsbG9jX3JlY3ZmcmFtZSAoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCitzdHJ1Y3QgcmVjdl9mcmFtZSAqX3J0d19hbGxvY19yZWN2ZnJhbWUgKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQogewotCXVuaW9uIHJlY3ZfZnJhbWUgICpwcmVjdmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpoZHI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXI7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKF9ydHdfcXVldWVfZW1wdHkocGZyZWVfcmVjdl9xdWV1ZSkpIHsKLQkJcHJlY3ZmcmFtZSA9IE5VTEw7CisJCWhkciA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmVlX3JlY3ZfcXVldWUpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCi0JCXByZWN2ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7CisJCWhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOwogCi0JCXJ0d19saXN0X2RlbGV0ZSgmcHJlY3ZmcmFtZS0+dS5oZHIubGlzdCk7Ci0JCXBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlcjsKKwkJcnR3X2xpc3RfZGVsZXRlKCZoZHItPmxpc3QpOworCQlwYWRhcHRlciA9IGhkci0+YWRhcHRlcjsKIAkJaWYgKHBhZGFwdGVyICE9IE5VTEwpIHsKIAkJCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAJCQlpZiAocGZyZWVfcmVjdl9xdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCkBAIC0xNjMsMTQgKzE1OCwxMyBAQAogCQl9CiAJfQogCi1fZnVuY19leGl0XzsKIAotCXJldHVybiBwcmVjdmZyYW1lOworCXJldHVybiAoc3RydWN0IHJlY3ZfZnJhbWUgKiloZHI7CiB9CiAKLXVuaW9uIHJlY3ZfZnJhbWUgKnJ0d19hbGxvY19yZWN2ZnJhbWUgKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQorc3RydWN0IHJlY3ZfZnJhbWUgKnJ0d19hbGxvY19yZWN2ZnJhbWUoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCiB7Ci0JdW5pb24gcmVjdl9mcmFtZSAgKnByZWN2ZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgICpwcmVjdmZyYW1lOwogCiAJc3Bpbl9sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKIApAQCAtMTgxLDM2ICsxNzUsMzYgQEAKIAlyZXR1cm4gcHJlY3ZmcmFtZTsKIH0KIAotdm9pZCBydHdfaW5pdF9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KQordm9pZCBydHdfaW5pdF9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdikKIHsKIAkvKiBQZXJyeTogVGhpcyBjYW4gYmUgcmVtb3ZlZCAqLwotCV9ydHdfaW5pdF9saXN0aGVhZCgmcHJlY3ZmcmFtZS0+dS5oZHIubGlzdCk7CisJX3J0d19pbml0X2xpc3RoZWFkKCZwcmVjdmZyYW1lLT5saXN0KTsKIAotCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiA9IDA7CisJcHJlY3ZmcmFtZS0+bGVuID0gMDsKIH0KIAotaW50IHJ0d19mcmVlX3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKK2ludCBydHdfZnJlZV9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCisJCSAgICAgICBzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXI7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwogCi1fZnVuY19lbnRlcl87CiAJaWYgKCFwcmVjdmZyYW1lKQogCQlyZXR1cm4gX0ZBSUw7Ci0JcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyOworCXBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKIAlwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCWlmIChwcmVjdmZyYW1lLT51Lmhkci5wa3QpIHsKLQkJZGV2X2tmcmVlX3NrYl9hbnkocHJlY3ZmcmFtZS0+dS5oZHIucGt0KTsvKiBmcmVlIHNrYiBieSBkcml2ZXIgKi8KLQkJcHJlY3ZmcmFtZS0+dS5oZHIucGt0ID0gTlVMTDsKKwlpZiAocHJlY3ZmcmFtZS0+cGt0KSB7CisJCWRldl9rZnJlZV9za2JfYW55KHByZWN2ZnJhbWUtPnBrdCk7LyogZnJlZSBza2IgYnkgZHJpdmVyICovCisJCXByZWN2ZnJhbWUtPnBrdCA9IE5VTEw7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKIAotCXJ0d19saXN0X2RlbGV0ZSgmKHByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpKTsKKwlydHdfbGlzdF9kZWxldGUoJihwcmVjdmZyYW1lLT5saXN0KSk7CiAKLQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gPSAwOworCXByZWN2ZnJhbWUtPmxlbiA9IDA7CiAKLQlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpLCBnZXRfbGlzdF9oZWFkKHBmcmVlX3JlY3ZfcXVldWUpKTsKKwlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZWN2ZnJhbWUtPmxpc3QpLCBnZXRfbGlzdF9oZWFkKHBmcmVlX3JlY3ZfcXVldWUpKTsKIAogCWlmIChwYWRhcHRlciAhPSBOVUxMKSB7CiAJCWlmIChwZnJlZV9yZWN2X3F1ZXVlID09ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSkKQEAgLTIxOSwzMiArMjEzLDI5IEBACiAKICAgICAgIHNwaW5fdW5sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLWludCBfcnR3X2VucXVldWVfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSkKK2ludCBfcnR3X2VucXVldWVfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlcjsKKwlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAotCXJ0d19saXN0X2RlbGV0ZSgmKHByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpKTsKLQlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpLCBnZXRfbGlzdF9oZWFkKHF1ZXVlKSk7CisJcnR3X2xpc3RfZGVsZXRlKCYocHJlY3ZmcmFtZS0+bGlzdCkpOworCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJlY3ZmcmFtZS0+bGlzdCksIGdldF9saXN0X2hlYWQocXVldWUpKTsKIAogCWlmIChwYWRhcHRlciAhPSBOVUxMKSB7CiAJCWlmIChxdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCiAJCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudCsrOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLWludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKQoraW50IHJ0d19lbnF1ZXVlX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKQogewogCWludCByZXQ7CiAKQEAgLTI2NSwzMiArMjU2LDMwIEBACiAKIHZvaWQgcnR3X2ZyZWVfcmVjdmZyYW1lX3F1ZXVlKHN0cnVjdCBfX3F1ZXVlICpwZnJhbWVxdWV1ZSwgIHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQogewotCXVuaW9uCXJlY3ZfZnJhbWUJKnByZWN2ZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKmhkcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCi1fZnVuY19lbnRlcl87CiAJc3Bpbl9sb2NrKCZwZnJhbWVxdWV1ZS0+bG9jayk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyYW1lcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSBmYWxzZSkgewotCQlwcmVjdmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOworCQloZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAotCQlydHdfZnJlZV9yZWN2ZnJhbWUocHJlY3ZmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CisJCXJ0d19mcmVlX3JlY3ZmcmFtZSgoc3RydWN0IHJlY3ZfZnJhbWUgKiloZHIsIHBmcmVlX3JlY3ZfcXVldWUpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZwZnJhbWVxdWV1ZS0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiB1MzIgcnR3X2ZyZWVfdWNfc3dkZWNfcGVuZGluZ19xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MzIgY250ID0gMDsKLQl1bmlvbiByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOwogCXdoaWxlICgocGVuZGluZ19mcmFtZSA9IHJ0d19hbGxvY19yZWN2ZnJhbWUoJmFkYXB0ZXItPnJlY3Zwcml2LnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpKSkgewogCQlydHdfZnJlZV9yZWN2ZnJhbWUocGVuZGluZ19mcmFtZSwgJmFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZSk7CiAJCURCR184OEUoIiVzOiBkZXF1ZXVlIHVjX3N3ZGVjX3BlbmRpbmdfcXVldWVcbiIsIF9fZnVuY19fKTsKQEAgLTMzNyw5ICszMjYsOSBAQAogCX0gZWxzZSB7CiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKLQkJcHJlY3ZidWYgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHJlY3ZfYnVmLCBsaXN0KTsKKwkJcHJlY3ZidWYgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2J1ZiwgbGlzdCk7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCZwcmVjdmJ1Zi0+bGlzdCk7CiAJfQpAQCAtMzQ5LDcgKzMzOCw4IEBACiAJcmV0dXJuIHByZWN2YnVmOwogfQogCi1zdGF0aWMgaW50IHJlY3ZmcmFtZV9jaGttaWMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQorc3RhdGljIGludCByZWN2ZnJhbWVfY2hrbWljKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewogCWludAlpLCByZXMgPSBfU1VDQ0VTUzsKIAl1MzIJZGF0YWxlbjsKQEAgLTM1OCwxMiArMzQ4LDExIEBACiAJdTgJKnBmcmFtZSwgKnBheWxvYWQsICpwZnJhbWVtaWM7CiAJdTgJKm1pY2tleTsKIAlzdHJ1Y3QJc3RhX2luZm8JCSpzdGFpbmZvOwotCXN0cnVjdAlyeF9wa3RfYXR0cmliCSpwcnhhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdAlyeF9wa3RfYXR0cmliCSpwcnhhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwogCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotX2Z1bmNfZW50ZXJfOwogCiAJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbygmYWRhcHRlci0+c3RhcHJpdiwgJnByeGF0dHJpYi0+dGFbMF0pOwogCkBAIC0zNzUsMjMgKzM2NCwyNCBAQAogCQkvKiBjYWxjdWxhdGUgbWljIGNvZGUgKi8KIAkJaWYgKHN0YWluZm8gIT0gTlVMTCkgewogCQkJaWYgKElTX01DQVNUKHByeGF0dHJpYi0+cmEpKSB7Ci0JCQkJbWlja2V5ID0gJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnByeG1pY2tleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleVswXTsKLQotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6IGJjbWMga2V5XG4iKSk7Ci0KIAkJCQlpZiAoIXBzZWN1cml0eXByaXYpIHsKIAkJCQkJcmVzID0gX0ZBSUw7CiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiXG4gcmVjdmZyYW1lX2Noa21pYzpkaWRuJ3QgaW5zdGFsbCBncm91cCBrZXkhISEhISEhISEhXG4iKSk7CiAJCQkJCURCR184OEUoIlxuIHJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0IGluc3RhbGwgZ3JvdXAga2V5ISEhISEhISEhIVxuIik7CiAJCQkJCWdvdG8gZXhpdDsKIAkJCQl9CisJCQkJbWlja2V5ID0gJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnByeG1pY2tleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleVswXTsKKworCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6IGJjbWMga2V5XG4iKSk7CiAJCQl9IGVsc2UgewogCQkJCW1pY2tleSA9ICZzdGFpbmZvLT5kb3QxMXRraXByeG1pY2tleS5za2V5WzBdOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiXG4gcmVjdmZyYW1lX2Noa21pYzogdW5pY2FzdCBrZXlcbiIpKTsKIAkJCX0KIAotCQkJZGF0YWxlbiA9IHByZWN2ZnJhbWUtPnUuaGRyLmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbi1wcnhhdHRyaWItPmljdl9sZW4tODsvKiBpY3ZfbGVuIGluY2x1ZGVkIHRoZSBtaWMgY29kZSAqLwotCQkJcGZyYW1lID0gcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YTsKKwkJCS8qIGljdl9sZW4gaW5jbHVkZWQgdGhlIG1pYyBjb2RlICovCisJCQlkYXRhbGVuID0gcHJlY3ZmcmFtZS0+bGVuLXByeGF0dHJpYi0+aGRybGVuIC0KKwkJCQkgIHByeGF0dHJpYi0+aXZfbGVuLXByeGF0dHJpYi0+aWN2X2xlbi04OworCQkJcGZyYW1lID0gcHJlY3ZmcmFtZS0+cnhfZGF0YTsKIAkJCXBheWxvYWQgPSBwZnJhbWUrcHJ4YXR0cmliLT5oZHJsZW4rcHJ4YXR0cmliLT5pdl9sZW47CiAKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoIlxuIHByeGF0dHJpYi0+aXZfbGVuPSVkIHByeGF0dHJpYi0+aWN2X2xlbj0lZFxuIiwgcHJ4YXR0cmliLT5pdl9sZW4sIHByeGF0dHJpYi0+aWN2X2xlbikpOwpAQCAtNDI0LDE2ICs0MTQsMzAgQEAKIAkJCQkJICoocGZyYW1lbWljLTEwKSwgKihwZnJhbWVtaWMtOSkpKTsKIAkJCQl7CiAJCQkJCXVpbnQgaTsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJcbiA9PT09PT1kZW1wIHBhY2tldCAobGVuPSVkKT09PT09PVxuIiwgcHJlY3ZmcmFtZS0+dS5oZHIubGVuKSk7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBwcmVjdmZyYW1lLT51Lmhkci5sZW47IGkgPSBpKzgpIHsKLQkJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiMHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeCIsCi0JCQkJCQkJICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKSwgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krMSksCi0JCQkJCQkJICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzIpLCAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSszKSwKLQkJCQkJCQkgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krNCksICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzUpLAotCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSs2KSwgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krNykpKTsKKwkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKKwkJCQkJCSAoIlxuID09PT09PWRlbXAgcGFja2V0IChsZW49JWQpPT09PT09XG4iLAorCQkJCQkJIHByZWN2ZnJhbWUtPmxlbikpOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlY3ZmcmFtZS0+bGVuOyBpICs9IDgpIHsKKwkJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAorCQkJCQkJCSBfZHJ2X2Vycl8sCisJCQkJCQkJICgiMHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeCIsCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krMSksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzIpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSszKSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krNCksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzUpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSs2KSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krNykpKTsKIAkJCQkJfQotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIlxuID09PT09PSBkZW1wIHBhY2tldCBlbmQgW2xlbj0lZF09PT09PT1cbiIsIHByZWN2ZnJhbWUtPnUuaGRyLmxlbikpOwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIlxuIGhyZGxlbj0lZCxcbiIsIHByeGF0dHJpYi0+aGRybGVuKSk7CisJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAorCQkJCQkJIF9kcnZfZXJyXywKKwkJCQkJCSAoIlxuID09PT09PSBkZW1wIHBhY2tldCBlbmQgW2xlbj0lZF09PT09PT1cbiIsCisJCQkJCQkgcHJlY3ZmcmFtZS0+bGVuKSk7CisJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAorCQkJCQkJIF9kcnZfZXJyXywKKwkJCQkJCSAoIlxuIGhyZGxlbj0lZCxcbiIsCisJCQkJCQkgcHJ4YXR0cmliLT5oZHJsZW4pKTsKIAkJCQl9CiAKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLApAQCAtNDcxLDI0ICs0NzUsMjMgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQogCiAvKiBkZWNyeXB0IGFuZCBzZXQgdGhlIGl2bGVuLCBpY3ZsZW4gb2YgdGhlIHJlY3ZfZnJhbWUgKi8KLXN0YXRpYyB1bmlvbiByZWN2X2ZyYW1lICpkZWNyeXB0b3Ioc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyBzdHJ1Y3QgcmVjdl9mcmFtZSAqZGVjcnlwdG9yKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQl1bmlvbiByZWN2X2ZyYW1lICpyZXR1cm5fcGFja2V0ID0gcHJlY3ZfZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnJldHVybl9wYWNrZXQgPSBwcmVjdl9mcmFtZTsKIAl1MzIJIHJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgicHJ4c3RhdC0+ZGVjcnlwdGVkPSV4IHByeGF0dHJpYi0+ZW5jcnlwdD0weCUwM3hcbiIsIHByeGF0dHJpYi0+YmRlY3J5cHRlZCwgcHJ4YXR0cmliLT5lbmNyeXB0KSk7CiAKIAlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ID4gMCkgewotCQl1OCAqaXYgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YStwcnhhdHRyaWItPmhkcmxlbjsKKwkJdTggKml2ID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGErcHJ4YXR0cmliLT5oZHJsZW47CiAJCXByeGF0dHJpYi0+a2V5X2luZGV4ID0gKCgoaXZbM10pPj42KSYweDMpOwogCiAJCWlmIChwcnhhdHRyaWItPmtleV9pbmRleCA+IFdFUF9LRVlTKSB7CkBAIC01MzQsMzQgKzUzNywzMyBAQAogCQlyZXR1cm5fcGFja2V0ID0gTlVMTDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldHVybl9wYWNrZXQ7CiB9CiAKIC8qIHNldCB0aGUgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW4gdGhlIHJlY3ZfZnJhbWUgKi8KLXN0YXRpYyB1bmlvbiByZWN2X2ZyYW1lICpwb3J0Y3RybChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgc3RydWN0IHJlY3ZfZnJhbWUgKnBvcnRjdHJsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1OCAgICpwc3RhX2FkZHIgPSBOVUxMLCAqcHRyOwogCXVpbnQgIGF1dGhfYWxnOwotCXN0cnVjdCByZWN2X2ZyYW1lX2hkciAqcGZoZHI7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwotCXVuaW9uIHJlY3ZfZnJhbWUgKnBydG5mcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJ0bmZyYW1lOwogCXUxNglldGhlcl90eXBlID0gMDsKIAl1MTYgIGVhcG9sX3R5cGUgPSAweDg4OGU7LyogZm9yIEZ1bmlhIEJEJ3MgV1BBIGlzc3VlICovCiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7CiAJX19iZTE2IGJlX3RtcDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlwc3RhID0gcnR3X2dldF9zdGFpbmZvKHBzdGFwcml2LCBwc3RhX2FkZHIpOwogCiAJYXV0aF9hbGcgPSBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobTsKIAotCXB0ciA9IGdldF9yZWN2ZnJhbWVfZGF0YShwcmVjdl9mcmFtZSk7Ci0JcGZoZHIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyOworCXB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXBmaGRyID0gcHJlY3ZfZnJhbWU7CiAJcGF0dHJpYiA9ICZwZmhkci0+YXR0cmliOwogCXBzdGFfYWRkciA9IHBhdHRyaWItPnRhOwogCkBAIC01OTMsNyArNTk1LDkgQEAKIAkJCS8qIGFsbG93ZWQgKi8KIAkJCS8qIGNoZWNrIGRlY3J5cHRpb24gc3RhdHVzLCBhbmQgZGVjcnlwdCB0aGUgZnJhbWUgaWYgbmVlZGVkICovCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCIjIyMjIyMjI3BvcnRjdHJsOnBzdGEtPmllZWU4MDIxeF9ibG9ja2VkPT0wXG4iKSk7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJwb3J0Y3RybDpwcmVjdl9mcmFtZS0+aGRyLmF0dHJpYi5wcml2YWN5PSV4XG4iLCBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnByaXZhY3kpKTsKKwkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAorCQkJCSAoInBvcnRjdHJsOnByZWN2X2ZyYW1lLT5oZHIuYXR0cmliLnByaXZhY3k9JXhcbiIsCisJCQkJIHByZWN2X2ZyYW1lLT5hdHRyaWIucHJpdmFjeSkpOwogCiAJCQlpZiAocGF0dHJpYi0+YmRlY3J5cHRlZCA9PSAwKQogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoInBvcnRjdHJsOnByeHN0YXQtPmRlY3J5cHRlZD0leFxuIiwgcGF0dHJpYi0+YmRlY3J5cHRlZCkpOwpAQCAtNjEzLDE5ICs2MTcsMTggQEAKIAkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCQlyZXR1cm4gcHJ0bmZyYW1lOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZGVjYWNoZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgdTggYnJldHJ5LCBzdHJ1Y3Qgc3RhaW5mb19yeGNhY2hlICpwcnhjYWNoZSkKK3N0YXRpYyBpbnQgcmVjdl9kZWNhY2hlKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgdTggYnJldHJ5LAorCQkJc3RydWN0IHN0YWluZm9fcnhjYWNoZSAqcHJ4Y2FjaGUpCiB7Ci0JaW50IHRpZCA9IHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIucHJpb3JpdHk7CisJaW50IHRpZCA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucHJpb3JpdHk7CiAKLQl1MTYgc2VxX2N0cmwgPSAoKHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuc2VxX251bSYweGZmZmYpIDw8IDQpIHwKLQkJKHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIuZnJhZ19udW0gJiAweGYpOworCXUxNiBzZXFfY3RybCA9ICgocHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtJjB4ZmZmZikgPDwgNCkgfAorCQkocHJlY3ZfZnJhbWUtPmF0dHJpYi5mcmFnX251bSAmIDB4Zik7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICh0aWQgPiAxNSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLCAoInJlY3ZfZGVjYWNoZSwgKHRpZD4xNSkhIHNlcV9jdHJsPTB4JXgsIHRpZD0weCV4XG4iLCBzZXFfY3RybCwgdGlkKSk7CkBAIC02NDMsMTggKzY0NiwxNyBAQAogCiAJcHJ4Y2FjaGUtPnRpZF9yeHNlcVt0aWRdID0gc2VxX2N0cmw7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi12b2lkIHByb2Nlc3NfcHdyYml0X2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci12b2lkIHByb2Nlc3NfcHdyYml0X2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3ZvaWQgcHJvY2Vzc19wd3JiaXRfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKIAl1bnNpZ25lZCBjaGFyIHB3cmJpdDsKLQl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAKQEAgLTY3NSwxMCArNjc3LDExIEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc193bW1wc19kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgdm9pZCBwcm9jZXNzX3dtbXBzX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCi0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIApAQCAtNzMwLDE1ICs3MzMsMTcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBjb3VudF9yeF9zdGF0cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQorc3RhdGljIHZvaWQgY291bnRfcnhfc3RhdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUsCisJCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlpbnQJc3o7CiAJc3RydWN0IHN0YV9pbmZvCQkqcHN0YSA9IE5VTEw7CiAJc3RydWN0IHN0YWluZm9fc3RhdHMJKnBzdGF0cyA9IE5VTEw7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliCSpwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QgcmVjdl9wcml2CSpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCi0Jc3ogPSBnZXRfcmVjdmZyYW1lX2xlbihwcmZyYW1lKTsKKwlzeiA9IHByZnJhbWUtPmxlbjsKIAlwcmVjdnByaXYtPnJ4X2J5dGVzICs9IHN6OwogCiAJcGFkYXB0ZXItPm1sbWVwcml2LkxpbmtEZXRlY3RJbmZvLk51bVJ4T2tJblBlcmlvZCsrOwpAQCAtNzQ5LDcgKzc1NCw3IEBACiAJaWYgKHN0YSkKIAkJcHN0YSA9IHN0YTsKIAllbHNlCi0JCXBzdGEgPSBwcmZyYW1lLT51Lmhkci5wc3RhOworCQlwc3RhID0gcHJmcmFtZS0+cHN0YTsKIAogCWlmIChwc3RhKSB7CiAJCXBzdGF0cyA9ICZwc3RhLT5zdGFfc3RhdHM7CkBAIC03NjEsMTUgKzc2NiwxNiBAQAogCiBpbnQgc3RhMnN0YV9kYXRhX2ZyYW1lKAogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAorCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKIAlzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhCiApOwogCi1pbnQgc3RhMnN0YV9kYXRhX2ZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgc3RydWN0IHN0YV9pbmZvICoqcHN0YSkKK2ludCBzdGEyc3RhX2RhdGFfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpCiB7Ci0JdTggKnB0ciA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7CiAJdTggKm15YnNzaWQgID0gZ2V0X2Jzc2lkKHBtbG1lcHJpdik7CkBAIC03NzcsMjUgKzc4MywyNCBAQAogCXU4ICpzdGFfYWRkciA9IE5VTEw7CiAJaW50IGJtY2FzdCA9IElTX01DQVNUKHBhdHRyaWItPmRzdCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpID09IHRydWUpIHx8CiAJICAgIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpID09IHRydWUpKSB7CiAJCS8qICBmaWx0ZXIgcGFja2V0cyB0aGF0IFNBIGlzIG15c2VsZiBvciBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCi0JCWlmIChfcnR3X21lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIiBTQT09bXlzZWxmXG4iKSk7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCWlmICgoIV9ydHdfbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkJJiYgKCFibWNhc3QpKSB7CisJCWlmICgobWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkgJiYgKCFibWNhc3QpKSB7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCWlmIChfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAotCQkgICAgX3J0d19tZW1jbXAobXlic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAotCQkgICAgIV9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAocGF0dHJpYi0+YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKKwkJICAgICFtZW1jbXAobXlic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAorCQkgICAgbWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpIHsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC04MDMsNyArODA4LDcgQEAKIAkJc3RhX2FkZHIgPSBwYXR0cmliLT5zcmM7CiAJfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewogCQkvKiAgRm9yIFN0YXRpb24gbW9kZSwgc2EgYW5kIGJzc2lkIHNob3VsZCBhbHdheXMgYmUgQlNTSUQsIGFuZCBEQSBpcyBteSBtYWMtYWRkcmVzcyAqLwotCQlpZiAoIV9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkgeworCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJic3NpZCE9VEEgdW5kZXIgU1RBVElPTl9NT0RFOyBkcm9wIHBrdFxuIikpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CkBAIC04MTgsNyArODIzLDcgQEAKIAkJCX0KIAkJfSBlbHNlIHsgLyogIG5vdCBtYy1mcmFtZSAqLwogCQkJLyogIEZvciBBUCBtb2RlLCBpZiBEQSBpcyBub24tTUNBU1QsIHRoZW4gaXQgbXVzdCBiZSBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lEICovCi0JCQlpZiAoIV9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkgeworCQkJaWYgKG1lbWNtcChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikpIHsKIAkJCQlyZXQgPSBfRkFJTDsKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CkBAIC04NTMsMTcgKzg1OCwxNiBAQAogCX0KIAogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXAyc3RhX2RhdGFfZnJhbWUgKAogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAorCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKIAlzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQogewotCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCWludCByZXQgPSBfU1VDQ0VTUzsKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwpAQCAtODcxLDIwICs4NzUsMTkgQEAKIAl1OCAqbXlod2FkZHIgPSBteWlkKCZhZGFwdGVyLT5lZXByb21wcml2KTsKIAlpbnQgYm1jYXN0ID0gSVNfTUNBU1QocGF0dHJpYi0+ZHN0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSA9PSB0cnVlKSAmJgogCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUgfHwKIAkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkpIHsKIAkJLyogIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KLQkJaWYgKF9ydHdfbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiIFNBPT1teXNlbGZcbiIpKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CiAKIAkJLyogIGRhIHNob3VsZCBiZSBmb3IgbWUgKi8KLQkJaWYgKCghX3J0d19tZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKSAmJiAoIWJtY2FzdCkpIHsKKwkJaWYgKChtZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKSAmJiAoIWJtY2FzdCkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAogCQkJCSAoIiBhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgREEgZmFpbDsgREE9JXBNXG4iLCAocGF0dHJpYi0+ZHN0KSkpOwogCQkJcmV0ID0gX0ZBSUw7CkBAIC04OTIsOSArODk1LDkgQEAKIAkJfQogCiAJCS8qICBjaGVjayBCU1NJRCAqLwotCQlpZiAoX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKLQkJICAgIF9ydHdfbWVtY21wKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKLQkJICAgICAoIV9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpKSB7CisJCWlmICghbWVtY21wKHBhdHRyaWItPmJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8CisJCSAgICAhbWVtY21wKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKKwkJICAgICAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKIAkJCQkgKCIgYXAyc3RhX2RhdGFfZnJhbWU6ICBjb21wYXJlIEJTU0lEIGZhaWwgOyBCU1NJRD0lcE1cbiIsIChwYXR0cmliLT5ic3NpZCkpKTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoIm15YnNzaWQ9JXBNXG4iLCAobXlic3NpZCkpKTsKQEAgLTk1MCw3ICs5NTMsNyBAQAogCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKIAkJZ290byBleGl0OwogCX0gZWxzZSB7Ci0JCWlmIChfcnR3X21lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikgJiYgKCFibWNhc3QpKSB7CisJCWlmICghbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSAmJiAoIWJtY2FzdCkpIHsKIAkJCSpwc3RhID0gcnR3X2dldF9zdGFpbmZvKHBzdGFwcml2LCBwYXR0cmliLT5ic3NpZCk7IC8qICBnZXQgc3RhX2luZm8gKi8KIAkJCWlmICgqcHN0YSA9PSBOVUxMKSB7CiAJCQkJREJHXzg4RSgiaXNzdWVfZGVhdXRoIHRvIHRoZSBhcCA9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLCAocGF0dHJpYi0+YnNzaWQpKTsKQEAgLTk2NCwyNyArOTY3LDI1IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzdGEyYXBfZGF0YV9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCisJCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKIAkJCSAgICAgc3RydWN0IHN0YV9pbmZvICoqcHN0YSkKIHsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXVuc2lnbmVkIGNoYXIgKm15YnNzaWQgID0gZ2V0X2Jzc2lkKHBtbG1lcHJpdik7CiAJaW50IHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpID09IHRydWUpIHsKIAkJLyogRm9yIEFQIG1vZGUsIFJBID0gQlNTSUQsIFRYID0gU1RBKFNSQ19BRERSKSwgQTMgPSBEU1RfQUREUiAqLwotCQlpZiAoIV9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpIHsKKwkJaWYgKG1lbWNtcChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCwgRVRIX0FMRU4pKSB7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMTAxNCw3ICsxMDE1LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwotCQlpZiAoIV9ydHdfbWVtY21wKHBhdHRyaWItPnJhLCBteWh3YWRkciwgRVRIX0FMRU4pKSB7CisJCWlmIChtZW1jbXAocGF0dHJpYi0+cmEsIG15aHdhZGRyLCBFVEhfQUxFTikpIHsKIAkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0xMDI2LDI1ICsxMDI3LDIzIEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X2N0cmxfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKKwkJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JLyogdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOyAqLworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAogCWlmIChHZXRGcmFtZVR5cGUocGZyYW1lKSAhPSBXSUZJX0NUUkxfVFlQRSkKIAkJcmV0dXJuIF9GQUlMOwogCiAJLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3MgKi8KLQlpZiAoIV9ydHdfbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKQorCWlmIChtZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpCiAJCXJldHVybiBfRkFJTDsKIAogCS8qIG9ubHkgaGFuZGxlIHBzLXBvbGwgKi8KQEAgLTEwOTgsMTIgKzEwOTcsMTIgQEAKIAkJCXNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsKIAogCQkJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSk7Ci0JCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCQkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJCQlpZiAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgPT0gZmFsc2UpIHsKLQkJCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCQkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQkJCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCQkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCQkJcnR3X2xpc3RfZGVsZXRlKCZweG1pdGZyYW1lLT5saXN0KTsKIApAQCAtMTEyNCw3ICsxMTIzLDcgQEAKIAkJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA9PSAwKSB7CiAJCQkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5CSVQocHN0YS0+YWlkKTsKIAotCQkJCQkvKiB1cGF0ZSBCQ04gZm9yIFRJTSBJRSAqLworCQkJCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KIAkJCQkJLyogdXBkYXRlX0JDTlRJTShwYWRhcHRlcik7ICovCiAJCQkJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9USU1fSUVfLCBOVUxMLCBmYWxzZSk7CiAJCQkJfQpAQCAtMTE0Miw3ICsxMTQxLDcgQEAKIAogCQkJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+QklUKHBzdGEtPmFpZCk7CiAKLQkJCQkJLyogdXBhdGUgQkNOIGZvciBUSU0gSUUgKi8KKwkJCQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCiAJCQkJCS8qIHVwZGF0ZV9CQ05USU0ocGFkYXB0ZXIpOyAqLwogCQkJCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfVElNX0lFXywgTlVMTCwgZmFsc2UpOwogCQkJCX0KQEAgLTExNTcsMTAgKzExNTYsMTEgQEAKIAlyZXR1cm4gX0ZBSUw7CiB9CiAKLXVuaW9uIHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9jaGtfZGVmcmFnKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9jaGtfZGVmcmFnKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIAogc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKKwkJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKIApAQCAtMTE3MywxOCArMTE3MywyMCBAQAogCX0KIAogCS8qIGZvciByeCBwa3Qgc3RhdGlzdGljcyAqLwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LCBHZXRBZGRyMlB0cihwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkpOworCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LAorCQkJICAgICAgIEdldEFkZHIyUHRyKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSk7CiAJaWYgKHBzdGEpIHsKIAkJcHN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0cysrOwotCQlpZiAoR2V0RnJhbWVTdWJUeXBlKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSA9PSBXSUZJX0JFQUNPTikgeworCQlpZiAoR2V0RnJhbWVTdWJUeXBlKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSA9PSBXSUZJX0JFQUNPTikgewogCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X2JlYWNvbl9wa3RzKys7Ci0JCX0gZWxzZSBpZiAoR2V0RnJhbWVTdWJUeXBlKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSA9PSBXSUZJX1BST0JFUkVRKSB7CisJCX0gZWxzZSBpZiAoR2V0RnJhbWVTdWJUeXBlKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSA9PSBXSUZJX1BST0JFUkVRKSB7CiAJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyZXFfcGt0cysrOwotCQl9IGVsc2UgaWYgKEdldEZyYW1lU3ViVHlwZShwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkgPT0gV0lGSV9QUk9CRVJTUCkgewotCQkJaWYgKF9ydHdfbWVtY21wKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyLCBHZXRBZGRyMVB0cihwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSksIEVUSF9BTEVOKSA9PSB0cnVlKQorCQl9IGVsc2UgaWYgKEdldEZyYW1lU3ViVHlwZShwcmVjdl9mcmFtZS0+cnhfZGF0YSkgPT0gV0lGSV9QUk9CRVJTUCkgeworCQkJaWYgKCFtZW1jbXAocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsCisJCQkJICAgIEdldEFkZHIxUHRyKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSwgRVRIX0FMRU4pKQogCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9wa3RzKys7Ci0JCQllbHNlIGlmIChpc19icm9hZGNhc3RfbWFjX2FkZHIoR2V0QWRkcjFQdHIocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpKSB8fAotCQkJCSBpc19tdWx0aWNhc3RfbWFjX2FkZHIoR2V0QWRkcjFQdHIocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpKSkKKwkJCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9tYWNfYWRkcihHZXRBZGRyMVB0cihwcmVjdl9mcmFtZS0+cnhfZGF0YSkpIHx8CisJCQkJIGlzX211bHRpY2FzdF9tYWNfYWRkcihHZXRBZGRyMVB0cihwcmVjdl9mcmFtZS0+cnhfZGF0YSkpKQogCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9ibV9wa3RzKys7CiAJCQllbHNlCiAJCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3VvX3BrdHMrKzsKQEAgLTExOTcsMTcgKzExOTksMTYgQEAKIH0KIAogc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdTggYnJldHJ5OwogCXU4ICpwc2EsICpwZGEsICpwYnNzaWQ7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJaW50IHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlicmV0cnkgPSBHZXRSZXRyeShwdHIpOwogCXBkYSA9IGdldF9kYShwdHIpOwpAQCAtMTI2NSw3ICsxMjY2LDcgQEAKIAogCS8qIHBzdGEtPnJzc2kgPSBwcnhjbWQtPnJzc2k7ICovCiAJLyogcHN0YS0+c2lnbmFsX3F1YWxpdHkgPSBwcnhjbWQtPnNxOyAqLwotCXByZWN2X2ZyYW1lLT51Lmhkci5wc3RhID0gcHN0YTsKKwlwcmVjdl9mcmFtZS0+cHN0YSA9IHBzdGE7CiAKIAlwYXR0cmliLT5hbXNkdSA9IDA7CiAJcGF0dHJpYi0+YWNrX3BvbGljeSA9IDA7CkBAIC0xMjg2LDcgKzEyODcsNyBAQAogCWlmIChwYXR0cmliLT5vcmRlcikvKiBIVC1DVFJMIDExbiAqLwogCQlwYXR0cmliLT5oZHJsZW4gKz0gNDsKIAotCXByZWN2X2ZyYW1lLT51Lmhkci5wcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbcGF0dHJpYi0+cHJpb3JpdHldOworCXByZWN2X2ZyYW1lLT5wcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbcGF0dHJpYi0+cHJpb3JpdHldOwogCiAJLyogIGRlY2FjaGUsIGRyb3AgZHVwbGljYXRlIHJlY3YgcGFja2V0cyAqLwogCWlmIChyZWN2X2RlY2FjaGUocHJlY3ZfZnJhbWUsIGJyZXRyeSwgJnBzdGEtPnN0YV9yZWN2cHJpdi5yeGNhY2hlKSA9PSBfRkFJTCkgewpAQCAtMTMxMiwxMiArMTMxMywxMiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCS8qIHNoYWxsIGNoZWNrIGZyYW1lIHN1YnR5cGUsIHRvIC8gZnJvbSBkcywgZGEsIGJzc2lkICovCiAKQEAgLTEzMjcsMTIgKzEzMjgsMTEgQEAKIAl1OCBzdWJ0eXBlOwogCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKIAl1OCBiRHVtcFJ4UGt0OwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7Ci0JdTggKnB0ciA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CisJdTggKnB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICB2ZXIgPSAodW5zaWduZWQgY2hhcikgKCpwdHIpJjB4MzsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKSB7CiAJCWludCBjaF9zZXRfaWR4ID0gcnR3X2NoX3NldF9zZWFyY2hfY2gocG1sbWVleHQtPmNoYW5uZWxfc2V0LCBydHdfZ2V0X29wZXJfY2goYWRhcHRlcikpOwpAQCAtMTQyMiwxNCArMTQyMiwxMyBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKIC8qIHJlbW92ZSB0aGUgd2xhbmhkciBhbmQgYWRkIHRoZSBldGhfaGRyICovCiAKLXN0YXRpYyBpbnQgd2xhbmhkcl90b19ldGhoZHIgKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCitzdGF0aWMgaW50IHdsYW5oZHJfdG9fZXRoaGRyKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewogCWludAlybXZfbGVuOwogCXUxNglldGhfdHlwZSwgbGVuOwpAQCAtMTQzOSwxMyArMTQzOCwxMCBAQAogCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIJKnBzbmFwOwogCiAJaW50IHJldCA9IF9TVUNDRVNTOwotCXN0cnVjdCBhZGFwdGVyCQkJKmFkYXB0ZXIgPSBwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JdTgJKnB0ciA9IGdldF9yZWN2ZnJhbWVfZGF0YShwcmVjdmZyYW1lKTsgLyogIHBvaW50IHRvIGZyYW1lX2N0cmwgZmllbGQgKi8KLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT51Lmhkci5hdHRyaWI7Ci0KLV9mdW5jX2VudGVyXzsKKwl1OCAqcHRyID0gcHJlY3ZmcmFtZS0+cnhfZGF0YTsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7CiAKIAlpZiAocGF0dHJpYi0+ZW5jcnlwdCkKIAkJcmVjdmZyYW1lX3B1bGxfdGFpbChwcmVjdmZyYW1lLCBwYXR0cmliLT5pY3ZfbGVuKTsKQEAgLTE0NTMsMTAgKzE0NDksMTAgQEAKIAlwc25hcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICopKHB0citwYXR0cmliLT5oZHJsZW4gKyBwYXR0cmliLT5pdl9sZW4pOwogCXBzbmFwX3R5cGUgPSBwdHIrcGF0dHJpYi0+aGRybGVuICsgcGF0dHJpYi0+aXZfbGVuK1NOQVBfU0laRTsKIAkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCi0JaWYgKChfcnR3X21lbWNtcChwc25hcCwgcnR3X3JmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpICYmCi0JICAgICAoX3J0d19tZW1jbXAocHNuYXBfdHlwZSwgU05BUF9FVEhfVFlQRV9JUFgsIDIpID09IGZhbHNlKSAmJgotCSAgICAgKF9ydHdfbWVtY21wKHBzbmFwX3R5cGUsIFNOQVBfRVRIX1RZUEVfQVBQTEVUQUxLX0FBUlAsIDIpID09IGZhbHNlKSkgfHwKLQkgICAgX3J0d19tZW1jbXAocHNuYXAsIHJ0d19icmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkgeworCWlmICgoIW1lbWNtcChwc25hcCwgcnR3X3JmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpICYmCisJICAgICAoIW1lbWNtcChwc25hcF90eXBlLCBTTkFQX0VUSF9UWVBFX0lQWCwgMikgPT0gZmFsc2UpICYmCisJICAgICAoIW1lbWNtcChwc25hcF90eXBlLCBTTkFQX0VUSF9UWVBFX0FQUExFVEFMS19BQVJQLCAyKSA9PSBmYWxzZSkpIHx8CisJICAgICAhbWVtY21wKHBzbmFwLCBydHdfYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkpIHsKIAkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZCByZXBsYWNlIEV0aGVyVHlwZSAqLwogCQlic25hcGhkciA9IHRydWU7CiAJfSBlbHNlIHsKQEAgLTE0NjUsNyArMTQ2MSw3IEBACiAJfQogCiAJcm12X2xlbiA9IHBhdHRyaWItPmhkcmxlbiArIHBhdHRyaWItPml2X2xlbiArIChic25hcGhkciA/IFNOQVBfU0laRSA6IDApOwotCWxlbiA9IHByZWN2ZnJhbWUtPnUuaGRyLmxlbiAtIHJtdl9sZW47CisJbGVuID0gcHJlY3ZmcmFtZS0+bGVuIC0gcm12X2xlbjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAogCQkgKCJcbj09PXBhdHRyaWItPmhkcmxlbjogJXgsICBwYXR0cmliLT5pdl9sZW46JXg9PT1cblxuIiwgcGF0dHJpYi0+aGRybGVuLCAgcGF0dHJpYi0+aXZfbGVuKSk7CkBAIC0xNDk2LDMwICsxNDkyLDI5IEBACiAJCW1lbWNweShwdHIrMTIsICZiZV90bXAsIDIpOwogCX0KIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIAogLyogcGVyZm9ybSBkZWZyYWcgKi8KLXN0YXRpYyB1bmlvbiByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfZGVmcmFnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgX19xdWV1ZSAqZGVmcmFnX3EpCitzdGF0aWMgc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9kZWZyYWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgIHN0cnVjdCBfX3F1ZXVlICpkZWZyYWdfcSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXU4IHdsYW5oZHJfb2Zmc2V0OwogCXU4CWN1cmZyYWdudW07Ci0Jc3RydWN0IHJlY3ZfZnJhbWVfaGRyICpwZmhkciwgKnBuZmhkcjsKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lLCAqcG5leHRyZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyLCAqcG5maGRyOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lLCAqcG5leHRyZnJhbWU7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCWN1cmZyYWdudW0gPSAwOwogCXBmcmVlX3JlY3ZfcXVldWUgPSAmYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKGRlZnJhZ19xKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKLQlwcmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOwotCXBmaGRyID0gJnByZnJhbWUtPnUuaGRyOwotCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPnUubGlzdCkpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CisJcGZoZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKKwlwcmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcGZoZHI7CisJcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+bGlzdCkpOwogCiAJaWYgKGN1cmZyYWdudW0gIT0gcGZoZHItPmF0dHJpYi5mcmFnX251bSkgewogCQkvKiB0aGUgZmlyc3QgZnJhZ21lbnQgbnVtYmVyIG11c3QgYmUgMCAqLwpAQCAtMTUzNCwxMSArMTUyOSwxMSBAQAogCiAJcGxpc3QgPSBnZXRfbGlzdF9oZWFkKGRlZnJhZ19xKTsKIAotCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAl3aGlsZSAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSBmYWxzZSkgewotCQlwbmV4dHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lICwgdSk7Ci0JCXBuZmhkciA9ICZwbmV4dHJmcmFtZS0+dS5oZHI7CisJCXBuZmhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOworCQlwbmV4dHJmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXBuZmhkcjsKIAogCQkvKiBjaGVjayB0aGUgZnJhZ21lbnQgc2VxdWVuY2UgICgybmQgfm4gZnJhZ21lbnQgZnJhbWUpICovCiAKQEAgLTE1NjgsNyArMTU2Myw3IEBACiAJCXJlY3ZmcmFtZV9wdXQocHJmcmFtZSwgcG5maGRyLT5sZW4pOwogCiAJCXBmaGRyLT5hdHRyaWIuaWN2X2xlbiA9IHBuZmhkci0+YXR0cmliLmljdl9sZW47Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCS8qIGZyZWUgdGhlIGRlZnJhZ19xIHF1ZXVlIGFuZCByZXR1cm4gdGhlIHByZnJhbWUgKi8KQEAgLTE1NzYsMjkgKzE1NzEsMjggQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoIlBlcmZvcm1hbmNlIGRlZnJhZyEhISEhXG4iKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHByZnJhbWU7CiB9CiAKIC8qIGNoZWNrIGlmIG5lZWQgdG8gZGVmcmFnLCBpZiBuZWVkZWQgcXVldWUgdGhlIGZyYW1lIHRvIGRlZnJhZ19xICovCi11bmlvbiByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9jaGtfZGVmcmFnKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXU4CWlzbWZyYWc7CiAJdTgJZnJhZ251bTsKIAl1OAkqcHN0YV9hZGRyOwotCXN0cnVjdCByZWN2X2ZyYW1lX2hkciAqcGZoZHI7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwogCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXVuaW9uIHJlY3ZfZnJhbWUgKnBydG5mcmFtZSA9IE5VTEw7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnBydG5mcmFtZSA9IE5VTEw7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUsICpwZGVmcmFnX3E7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCi0JcGZoZHIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyOworCXBmaGRyID0gcHJlY3ZfZnJhbWU7CiAKIAlwZnJlZV9yZWN2X3F1ZXVlID0gJnBhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWU7CiAKQEAgLTE2NzAsNyArMTY2NCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoKHBydG5mcmFtZSAhPSBOVUxMKSAmJiAocHJ0bmZyYW1lLT51Lmhkci5hdHRyaWIucHJpdmFjeSkpIHsKKwlpZiAoKHBydG5mcmFtZSAhPSBOVUxMKSAmJiAocHJ0bmZyYW1lLT5hdHRyaWIucHJpdmFjeSkpIHsKIAkJLyogYWZ0ZXIgZGVmcmFnIHdlIG11c3QgY2hlY2sgdGtpcCBtaWMgY29kZSAqLwogCQlpZiAocmVjdmZyYW1lX2Noa21pYyhwYWRhcHRlciwgIHBydG5mcmFtZSkgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgicmVjdmZyYW1lX2Noa21pYyhwYWRhcHRlciwgIHBydG5mcmFtZSk9PV9GQUlMXG4iKSk7CkBAIC0xNjc5LDEyICsxNjczLDExIEBACiAJCX0KIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHBydG5mcmFtZTsKIH0KIAotc3RhdGljIGludCBhbXNkdV90b19tc2R1KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK3N0YXRpYyBpbnQgYW1zZHVfdG9fbXNkdShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewogCWludAlhX2xlbiwgcGFkZGluZ19sZW47CiAJdTE2CWV0aF90eXBlLCBuU3ViZnJhbWVfTGVuZ3RoOwpAQCAtMTY5OCwxNiArMTY5MSwxNiBAQAogCWludAlyZXQgPSBfU1VDQ0VTUzsKIAlucl9zdWJmcmFtZXMgPSAwOwogCi0JcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CiAKLQlyZWN2ZnJhbWVfcHVsbChwcmZyYW1lLCBwcmZyYW1lLT51Lmhkci5hdHRyaWIuaGRybGVuKTsKKwlyZWN2ZnJhbWVfcHVsbChwcmZyYW1lLCBwcmZyYW1lLT5hdHRyaWIuaGRybGVuKTsKIAotCWlmIChwcmZyYW1lLT51Lmhkci5hdHRyaWIuaXZfbGVuID4gMCkKLQkJcmVjdmZyYW1lX3B1bGwocHJmcmFtZSwgcHJmcmFtZS0+dS5oZHIuYXR0cmliLml2X2xlbik7CisJaWYgKHByZnJhbWUtPmF0dHJpYi5pdl9sZW4gPiAwKQorCQlyZWN2ZnJhbWVfcHVsbChwcmZyYW1lLCBwcmZyYW1lLT5hdHRyaWIuaXZfbGVuKTsKIAotCWFfbGVuID0gcHJmcmFtZS0+dS5oZHIubGVuOworCWFfbGVuID0gcHJmcmFtZS0+bGVuOwogCi0JcGRhdGEgPSBwcmZyYW1lLT51Lmhkci5yeF9kYXRhOworCXBkYXRhID0gcHJmcmFtZS0+cnhfZGF0YTsKIAogCXdoaWxlIChhX2xlbiA+IEVUSF9ITEVOKSB7CiAJCS8qIE9mZnNldCAxMiBkZW5vdGUgMiBtYWMgYWRkcmVzcyAqLwpAQCAtMTcyOSw3ICsxNzIyLDcgQEAKIAkJCWRhdGFfcHRyID0gKHU4ICopc2tiX3B1dChzdWJfc2tiLCBuU3ViZnJhbWVfTGVuZ3RoKTsKIAkJCW1lbWNweShkYXRhX3B0ciwgcGRhdGEsIG5TdWJmcmFtZV9MZW5ndGgpOwogCQl9IGVsc2UgewotCQkJc3ViX3NrYiA9IHNrYl9jbG9uZShwcmZyYW1lLT51Lmhkci5wa3QsIEdGUF9BVE9NSUMpOworCQkJc3ViX3NrYiA9IHNrYl9jbG9uZShwcmZyYW1lLT5wa3QsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHN1Yl9za2IpIHsKIAkJCQlzdWJfc2tiLT5kYXRhID0gcGRhdGE7CiAJCQkJc3ViX3NrYi0+bGVuID0gblN1YmZyYW1lX0xlbmd0aDsKQEAgLTE3NjgsOSArMTc2MSw5IEBACiAJCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KIAkJZXRoX3R5cGUgPSBSVFdfR0VUX0JFMTYoJnN1Yl9za2ItPmRhdGFbNl0pOwogCQlpZiAoc3ViX3NrYi0+bGVuID49IDggJiYKLQkJICAgICgoX3J0d19tZW1jbXAoc3ViX3NrYi0+ZGF0YSwgcnR3X3JmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpICYmCisJCSAgICAoKCFtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgcnR3X3JmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpICYmCiAJCQkgIGV0aF90eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoX3R5cGUgIT0gRVRIX1BfSVBYKSB8fAotCQkJIF9ydHdfbWVtY21wKHN1Yl9za2ItPmRhdGEsIHJ0d19icmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkpIHsKKwkJCSAhbWVtY21wKHN1Yl9za2ItPmRhdGEsIHJ0d19icmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkpIHsKIAkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQgcmVwbGFjZSBFdGhlclR5cGUgKi8KIAkJCXNrYl9wdWxsKHN1Yl9za2IsIFNOQVBfU0laRSk7CiAJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKTsKQEAgLTE3OTYsNyArMTc4OSw3IEBACiAKIGV4aXQ6CiAKLQlwcmZyYW1lLT51Lmhkci5sZW4gPSAwOworCXByZnJhbWUtPmxlbiA9IDA7CiAJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOy8qIGZyZWUgdGhpcyByZWN2X2ZyYW1lICovCiAKIAlyZXR1cm4gcmV0OwpAQCAtMTgzMiw3MCArMTgyNSw3MiBAQAogCXJldHVybiB0cnVlOwogfQogCi1pbnQgZW5xdWV1ZV9yZW9yZGVyX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpOwotaW50IGVucXVldWVfcmVvcmRlcl9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQoraW50IGVucXVldWVfcmVvcmRlcl9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLAorCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QgX19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcG5leHRyZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKmhkcjsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcG5leHRhdHRyaWI7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gZmFsc2UpIHsKLQkJcG5leHRyZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7Ci0JCXBuZXh0YXR0cmliID0gJnBuZXh0cmZyYW1lLT51Lmhkci5hdHRyaWI7CisJCWhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOworCQlwbmV4dGF0dHJpYiA9ICZoZHItPmF0dHJpYjsKIAogCQlpZiAoU05fTEVTUyhwbmV4dGF0dHJpYi0+c2VxX251bSwgcGF0dHJpYi0+c2VxX251bSkpCi0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJCWVsc2UgaWYgKFNOX0VRVUFMKHBuZXh0YXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5zZXFfbnVtKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJZWxzZQogCQkJYnJlYWs7CiAJfQogCi0JcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+dS5oZHIubGlzdCkpOworCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPmxpc3QpKTsKIAotCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJmcmFtZS0+dS5oZHIubGlzdCksIHBsaXN0KTsKKwlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHByZnJhbWUtPmxpc3QpLCBwbGlzdCk7CiAJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBpbnQgcmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsIGludCBiZm9yY2VkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJoZHI7CiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7CiAJaW50IGJQa3RJbkJ1ZiA9IGZhbHNlOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAJc3RydWN0IF9fcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKIAogCXBoZWFkID0JCWdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogIEhhbmRsaW5nIHNvbWUgY29uZGl0aW9uIGZvciBmb3JjZWQgaW5kaWNhdGUgY2FzZS4gKi8KIAlpZiAoYmZvcmNlZCkgewogCQlpZiAocnR3X2lzX2xpc3RfZW1wdHkocGhlYWQpKQogCQkJcmV0dXJuIHRydWU7CiAKLQkJcHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKLQkJcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJCXByaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CisJICAgICAgICBwYXR0cmliID0gJnByaGRyLT5hdHRyaWI7CiAJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07CiAJfQogCiAJLyogIFByZXBhcmUgaW5kaWNhdGlvbiBsaXN0IGFuZCBpbmRpY2F0aW9uLiAqLwogCS8qICBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuICovCiAJd2hpbGUgKCFydHdfaXNfbGlzdF9lbXB0eShwaGVhZCkpIHsKLQkJcHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKLQkJcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJCXByaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CisJCXByZnJhbWUgPSAoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmhkcjsKKwkJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CiAKIAkJaWYgKCFTTl9MRVNTKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCiAJCQkJICgicmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXI6IGluZGljYXRlPSVkIHNlcT0lZCBhbXNkdT0lZFxuIiwKIAkJCQkgIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSwgcGF0dHJpYi0+YW1zZHUpKTsKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOwotCQkJcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+dS5oZHIubGlzdCkpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKKwkJCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPmxpc3QpKTsKIAogCQkJaWYgKFNOX0VRVUFMKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSkpCiAJCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSArIDEpICYgMHhGRkY7CkBAIC0xOTI0LDExICsxOTE5LDEyIEBACiAJcmV0dXJuIGJQa3RJbkJ1ZjsKIH0KIAotc3RhdGljIGludCByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQorc3RhdGljIGludCByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKIAlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9IHByZnJhbWUtPnUuaGRyLnByZW9yZGVyX2N0cmw7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOworCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9IHByZnJhbWUtPnByZW9yZGVyX2N0cmw7CiAJc3RydWN0IF9fcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKIAogCWlmICghcGF0dHJpYi0+YW1zZHUpIHsKQEAgLTIwMDEsNyArMTk5Nyw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwogCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCQlfY2FuY2VsX3RpbWVyX2V4KCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKIAl9CiAKIF9zdWNjZXNzX2V4aXQ6CkBAIC0yMDMyLDE3ICsyMDI4LDE0IEBACiAJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitzdGF0aWMgaW50IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7CiAJaW50IHJldHZhbCA9IF9TVUNDRVNTOwotCS8qIHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7ICovCi0JLyogc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+dS5oZHIuYXR0cmliOyAqLwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IGh0X3ByaXYJKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7CiAKIAlpZiAocGh0cHJpdi0+aHRfb3B0aW9uKSB7ICAvKiBCL0cvTiBNb2RlICovCi0JCS8qIHByZnJhbWUtPnUuaGRyLnByZW9yZGVyX2N0cmwgPSAmcHJlY3Zwcml2LT5yZWN2cmVvcmRlcl9jdHJsW3BhdHRyaWItPnByaW9yaXR5XTsgKi8KLQogCQlpZiAocmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyKHBhZGFwdGVyLCBwcmZyYW1lKSAhPSBfU1VDQ0VTUykgewogCQkJLyogIGluY2x1ZGluZyBwZXJmb3JtIEEtTVBEVSBSeCBPcmRlcmluZyBCdWZmZXIgQ29udHJvbCAqLwogCQkJaWYgKCghcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSAmJgpAQCAtMjA3NSwxMCArMjA2OCwxMSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9mdW5jX3ByZWhhbmRsZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnJmcmFtZSkKK3N0YXRpYyBpbnQgcmVjdl9mdW5jX3ByZWhhbmRsZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnJmcmFtZSkKIHsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCkBAIC0yMTEwLDEwICsyMTA0LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCByZWN2X2Z1bmNfcG9zdGhhbmRsZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitzdGF0aWMgaW50IHJlY3ZfZnVuY19wb3N0aGFuZGxlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdW5pb24gcmVjdl9mcmFtZSAqb3JpZ19wcmZyYW1lID0gcHJmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqb3JpZ19wcmZyYW1lID0gcHJmcmFtZTsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlID0gJnBhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWU7CiAKQEAgLTIxNTUsMTYgKzIxNTAsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZnVuYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnJmcmFtZSkKK3N0YXRpYyBpbnQgcmVjdl9mdW5jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnJmcmFtZSkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZyZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAogCS8qIGNoZWNrIGlmIG5lZWQgdG8gaGFuZGxlIHVjX3N3ZGVjX3BlbmRpbmdfcXVldWUqLwogCWlmIChjaGVja19md3N0YXRlKG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmIHBzZWN1cml0eXByaXYtPmJ1c2V0a2lwa2V5KSB7Ci0JCXVuaW9uIHJlY3ZfZnJhbWUgKnBlbmRpbmdfZnJhbWU7CisJCXN0cnVjdCByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOwogCiAJCXdoaWxlICgocGVuZGluZ19mcmFtZSA9IHJ0d19hbGxvY19yZWN2ZnJhbWUoJnBhZGFwdGVyLT5yZWN2cHJpdi51Y19zd2RlY19wZW5kaW5nX3F1ZXVlKSkpIHsKIAkJCWlmIChyZWN2X2Z1bmNfcG9zdGhhbmRsZShwYWRhcHRlciwgcGVuZGluZ19mcmFtZSkgPT0gX1NVQ0NFU1MpCkBAIC0yMTkzLDE1ICsyMTg4LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotczMyIHJ0d19yZWN2X2VudHJ5KHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCitzMzIgcnR3X3JlY3ZfZW50cnkoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdjsKIAlzMzIgcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAotCXBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlcjsKKwlwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7CiAKIAlwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCkBAIC0yMjEzLDcgKzIyMDcsNiBAQAogCiAJcHJlY3Zwcml2LT5yeF9wa3RzKys7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIApAQCAtMjIyMiw3ICsyMjE1LDYgQEAKIAlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDEpCiAJCXBhZGFwdGVyLT5tcHByaXYucnhfcGt0bG9zcyA9IHByZWN2cHJpdi0+cnhfZHJvcDsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjI0NCwxMyArMjIzNiwxMyBAQAogCX0gZWxzZSB7CiAJCWlmIChyZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudXBkYXRlX3JlcSA9PSAwKSB7LyogIHVwZGF0ZV9yZXEgaXMgY2xlYXIsIG1lYW5zIHdlIGdvdCByeCAqLwogCQkJYXZnX3NpZ25hbF9zdHJlbmd0aCA9IHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGhfZGF0YS5hdmdfdmFsOwotCQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY2NxdWlyZWQsIHdlIGNhbiByZS1zdGF0IHRoZSBzaWduYWwgdmFsdWVzICovCisJCQkvKiAgYWZ0ZXIgYXZnX3ZhbHMgYXJlIGFjcXVpcmVkLCB3ZSBjYW4gcmUtc3RhdCB0aGUgc2lnbmFsIHZhbHVlcyAqLwogCQkJcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLnVwZGF0ZV9yZXEgPSAxOwogCQl9CiAKIAkJaWYgKHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLnVwZGF0ZV9yZXEgPT0gMCkgey8qICB1cGRhdGVfcmVxIGlzIGNsZWFyLCBtZWFucyB3ZSBnb3QgcnggKi8KIAkJCWF2Z19zaWduYWxfcXVhbCA9IHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLmF2Z192YWw7Ci0JCQkvKiAgYWZ0ZXIgYXZnX3ZhbHMgYXJlIGFjY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgdGhlIHNpZ25hbCB2YWx1ZXMgKi8KKwkJCS8qICBhZnRlciBhdmdfdmFscyBhcmUgYWNxdWlyZWQsIHdlIGNhbiByZS1zdGF0IHRoZSBzaWduYWwgdmFsdWVzICovCiAJCQlyZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS51cGRhdGVfcmVxID0gMTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKaW5kZXggZTA4ODQ1Ny4uYzRiMTZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYwpAQCAtNDEsNyArNDEsNiBAQAogCXUzMglzdGF0ZWluZGV4OwogCXU4ICpzdGF0ZTsKIAl1MzIJY291bnRlcjsKLV9mdW5jX2VudGVyXzsKIAlzdGF0ZSA9IHBhcmM0Y3R4LT5zdGF0ZTsKIAlwYXJjNGN0eC0+eCA9IDA7CiAJcGFyYzRjdHgtPnkgPSAwOwpAQCAtNTgsNyArNTcsNiBAQAogCQlpZiAoKytrZXlpbmRleCA+PSBrZXlfbGVuKQogCQkJa2V5aW5kZXggPSAwOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdTMyIGFyY2ZvdXJfYnl0ZShzdHJ1Y3QgYXJjNGNvbnRleHQgKnBhcmM0Y3R4KQpAQCAtNjcsNyArNjUsNiBAQAogCXUzMiB5OwogCXUzMiBzeCwgc3k7CiAJdTggKnN0YXRlOwotX2Z1bmNfZW50ZXJfOwogCXN0YXRlID0gcGFyYzRjdHgtPnN0YXRlOwogCXggPSAocGFyYzRjdHgtPnggKyAxKSAmIDB4ZmY7CiAJc3ggPSBzdGF0ZVt4XTsKQEAgLTc3LDE3ICs3NCwxNCBAQAogCXBhcmM0Y3R4LT55ID0geTsKIAlzdGF0ZVt5XSA9ICh1OClzeDsKIAlzdGF0ZVt4XSA9ICh1OClzeTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXTsKIH0KIAogc3RhdGljIHZvaWQgYXJjZm91cl9lbmNyeXB0KHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgsIHU4ICpkZXN0LCB1OCAqc3JjLCB1MzIgbGVuKQogewogCXUzMglpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJZGVzdFtpXSA9IHNyY1tpXSBeICh1bnNpZ25lZCBjaGFyKWFyY2ZvdXJfYnl0ZShwYXJjNGN0eCk7Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIGludCBiY3JjMzJpbml0aWFsaXplZDsKQEAgLTEwMiw5ICs5Niw4IEBACiAKIHN0YXRpYyB2b2lkIGNyYzMyX2luaXQodm9pZCkKIHsKLV9mdW5jX2VudGVyXzsKIAlpZiAoYmNyYzMyaW5pdGlhbGl6ZWQgPT0gMSkgewotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAl9IGVsc2UgewogCQlpbnQgaSwgajsKIAkJdTMyIGM7CkBAIC0xMjYsMTUgKzExOSwxMiBAQAogCQl9CiAJCWJjcmMzMmluaXRpYWxpemVkID0gMTsKIAl9Ci1leGl0OgotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyBfX2xlMzIgZ2V0Y3JjMzIodTggKmJ1ZiwgaW50IGxlbikKIHsKIAl1OCAqcDsKIAl1MzIgIGNyYzsKLV9mdW5jX2VudGVyXzsKIAlpZiAoYmNyYzMyaW5pdGlhbGl6ZWQgPT0gMCkKIAkJY3JjMzJfaW5pdCgpOwogCkBAIC0xNDIsNyArMTMyLDYgQEAKIAogCWZvciAocCA9IGJ1ZjsgbGVuID4gMDsgKytwLCAtLWxlbikKIAkJY3JjID0gY3JjMzJfdGFibGVbKGNyYyBeICpwKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBjcHVfdG9fbGUzMih+Y3JjKTsgICAgLyogdHJhbnNtaXQgY29tcGxlbWVudCwgcGVyIENSQy0zMiBzcGVjICovCiB9CiAKQEAgLTE2NSw3ICsxNTQsNiBAQAogCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0CXhtaXRfcHJpdgkJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICgoKHN0cnVjdCB4bWl0X2ZyYW1lICopcHhtaXRmcmFtZSktPmJ1Zl9hZGRyID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTIwNiw3ICsxOTQsNiBAQAogCQl9CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfd2VwX2RlY3J5cHQoc3RydWN0IGFkYXB0ZXIgICpwYWRhcHRlciwgdTggKnByZWN2ZnJhbWUpCkBAIC0yMTgsMTIgKzIwNSwxMSBAQAogCXUzMglrZXlsZW5ndGg7CiAJdTgJKnBmcmFtZSwgKnBheWxvYWQsICppdiwgd2Vwa2V5WzE2XTsKIAl1OAkga2V5aW5kZXg7Ci0Jc3RydWN0CXJ4X3BrdF9hdHRyaWIJICpwcnhhdHRyaWIgPSAmKCgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5hdHRyaWIpOworCXN0cnVjdAlyeF9wa3RfYXR0cmliCSAqcHJ4YXR0cmliID0gJigoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPmF0dHJpYik7CiAJc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCi0JcGZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIucnhfZGF0YTsKKwlwZnJhbWUgPSAodW5zaWduZWQgY2hhciAqKSgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+cnhfZGF0YTsKIAogCS8qIHN0YXJ0IHRvIGRlY3J5cHQgcmVjdmZyYW1lICovCiAJaWYgKChwcnhhdHRyaWItPmVuY3J5cHQgPT0gX1dFUDQwXykgfHwgKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBfV0VQMTA0XykpIHsKQEAgLTIzMiw3ICsyMTgsNyBAQAogCQlrZXlsZW5ndGggPSBwc2VjdXJpdHlwcml2LT5kb3QxMURlZktleWxlbltrZXlpbmRleF07CiAJCW1lbWNweSgmd2Vwa2V5WzBdLCBpdiwgMyk7CiAJCW1lbWNweSgmd2Vwa2V5WzNdLCAmcHNlY3VyaXR5cHJpdi0+ZG90MTFEZWZLZXlba2V5aW5kZXhdLnNrZXlbMF0sIGtleWxlbmd0aCk7Ci0JCWxlbmd0aCA9ICgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47CisJCWxlbmd0aCA9ICgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+bGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuOwogCiAJCXBheWxvYWQgPSBwZnJhbWUrcHJ4YXR0cmliLT5pdl9sZW4rcHJ4YXR0cmliLT5oZHJsZW47CiAKQEAgLTI1Miw3ICsyMzgsNiBAQAogCQkJCSAmY3JjLCAmcGF5bG9hZFtsZW5ndGgtNF0pKTsKIAkJfQogCX0KLV9mdW5jX2V4aXRfOwogCXJldHVybjsKIH0KIApAQCAtMjYzLDEwICsyNDgsOCBAQAogewogCXMzMiBpOwogCXUzMiByZXMgPSAwOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCXJlcyB8PSAoKHUzMikoKnArKykpIDw8ICg4KmkpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMjc0LDM5ICsyNTcsMzIgQEAKIC8qICBDb252ZXJ0IGZyb20gVXMzMjMyIHRvIEJ5dGVbXSBpbiBhIHBvcnRhYmxlIHdheSAqLwogewogCWxvbmcgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCSpwKysgPSAodTgpICh2YWwgJiAweGZmKTsKIAkJdmFsID4+PSA4OwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBzZWNtaWNjbGVhcihzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhKQogewogLyogIFJlc2V0IHRoZSBzdGF0ZSB0byB0aGUgZW1wdHkgbWVzc2FnZS4gKi8KLV9mdW5jX2VudGVyXzsKIAlwbWljZGF0YS0+TCA9IHBtaWNkYXRhLT5LMDsKIAlwbWljZGF0YS0+UiA9IHBtaWNkYXRhLT5LMTsKIAlwbWljZGF0YS0+bkJ5dGVzSW5NID0gMDsKIAlwbWljZGF0YS0+TSA9IDA7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2VjbWljc2V0a2V5KHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICprZXkpCiB7CiAJLyogIFNldCB0aGUga2V5ICovCi1fZnVuY19lbnRlcl87CiAJcG1pY2RhdGEtPkswID0gc2VjbWljZ2V0dWludDMyKGtleSk7CiAJcG1pY2RhdGEtPksxID0gc2VjbWljZ2V0dWludDMyKGtleSArIDQpOwogCS8qICBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UgKi8KIAlzZWNtaWNjbGVhcihwbWljZGF0YSk7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2VjbWljYXBwZW5kYnl0ZShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCBiKQogewotX2Z1bmNfZW50ZXJfOwogCS8qICBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyICovCiAJcG1pY2RhdGEtPk0gfD0gKCh1bnNpZ25lZCBsb25nKWIpIDw8ICg4KnBtaWNkYXRhLT5uQnl0ZXNJbk0pOwogCXBtaWNkYXRhLT5uQnl0ZXNJbk0rKzsKQEAgLTMyNSwyMyArMzAxLDE5IEBACiAJCXBtaWNkYXRhLT5NID0gMDsKIAkJcG1pY2RhdGEtPm5CeXRlc0luTSA9IDA7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NlY21pY2FwcGVuZChzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqc3JjLCB1MzIgbmJ5dGVzKQogewotX2Z1bmNfZW50ZXJfOwogCS8qICBUaGlzIGlzIHNpbXBsZSAqLwogCXdoaWxlIChuYnl0ZXMgPiAwKSB7CiAJCXJ0d19zZWNtaWNhcHBlbmRieXRlKHBtaWNkYXRhLCAqc3JjKyspOwogCQluYnl0ZXMtLTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2VjZ2V0bWljKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpkc3QpCiB7Ci1fZnVuY19lbnRlcl87CiAJLyogIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nICovCiAJcnR3X3NlY21pY2FwcGVuZGJ5dGUocG1pY2RhdGEsIDB4NWEpOwogCXJ0d19zZWNtaWNhcHBlbmRieXRlKHBtaWNkYXRhLCAwKTsKQEAgLTM1NiwxNCArMzI4LDEyIEBACiAJc2VjbWljcHV0dWludDMyKGRzdCs0LCBwbWljZGF0YS0+Uik7CiAJLyogIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLiAqLwogCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZWNjYWxjdGtpcG1pYyh1OCAqa2V5LCB1OCAqaGVhZGVyLCB1OCAqZGF0YSwgdTMyIGRhdGFfbGVuLCB1OCAqbWljX2NvZGUsIHU4IHByaSkKIHsKIAlzdHJ1Y3QgbWljX2RhdGEJbWljZGF0YTsKIAl1OCBwcmlvcml0eVs0XSA9IHsweDAsIDB4MCwgMHgwLCAweDB9OwotX2Z1bmNfZW50ZXJfOwogCXJ0d19zZWNtaWNzZXRrZXkoJm1pY2RhdGEsIGtleSk7CiAJcHJpb3JpdHlbMF0gPSBwcmk7CiAKQEAgLTM4Niw3ICszNTYsNiBAQAogCXJ0d19zZWNtaWNhcHBlbmQoJm1pY2RhdGEsIGRhdGEsIGRhdGFfbGVuKTsKIAogCXJ0d19zZWNnZXRtaWMoJm1pY2RhdGEsIG1pY19jb2RlKTsKLV9mdW5jX2V4aXRfOwogfQogCiAKQEAgLTUwNSw3ICs0NzQsNiBAQAogc3RhdGljIHZvaWQgcGhhc2UxKHUxNiAqcDFrLCBjb25zdCB1OCAqdGssIGNvbnN0IHU4ICp0YSwgdTMyIGl2MzIpCiB7CiAJaW50ICBpOwotX2Z1bmNfZW50ZXJfOwogCS8qIEluaXRpYWxpemUgdGhlIDgwIGJpdHMgb2YgUDFLW10gZnJvbSBJVjMyIGFuZCBUQVswLi41XSAgICAgKi8KIAlwMWtbMF0gICAgICA9IExvMTYoaXYzMik7CiAJcDFrWzFdICAgICAgPSBIaTE2KGl2MzIpOwpAQCAtNTIzLDcgKzQ5MSw2IEBACiAJCXAxa1s0XSArPSBfU18ocDFrWzNdIF4gVEsxNigoaSYxKSswKSk7CiAJCXAxa1s0XSArPSAgKHVuc2lnbmVkIHNob3J0KWk7ICAgLyogYXZvaWQgInNsaWRlIGF0dGFja3MiICovCiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC01NTMsNyArNTIwLDYgQEAKIHsKIAlpbnQgIGk7CiAJdTE2IFBQS1s2XTsJCQkvKiB0ZW1wb3Jhcnkga2V5IGZvciBtaXhpbmcgICAgKi8KLV9mdW5jX2VudGVyXzsKIAkvKiBOb3RlOiBhbGwgYWRkcyBpbiB0aGUgUFBLW10gZXF1YXRpb25zIGJlbG93IGFyZSBtb2QgMioqMTYJICovCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKIAkJUFBLW2ldID0gcDFrW2ldOwkvKiBmaXJzdCwgY29weSBQMUsgdG8gUFBLICAgICAgKi8KQEAgLTU5MCw3ICs1NTYsNiBAQAogCQlyYzRrZXlbNCsyKmldID0gTG84KFBQS1tpXSk7CiAJCXJjNGtleVs1KzIqaV0gPSBIaTgoUFBLW2ldKTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogLyogVGhlIGhsZW4gaXNuJ3QgaW5jbHVkZSB0aGUgSVYgKi8KQEAgLTYxMiw3ICs1NzcsNiBAQAogCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0CXhtaXRfcHJpdgkJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJdTMyCXJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCgoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGZyYW1lKS0+YnVmX2FkZHIgPT0gTlVMTCkKIAkJcmV0dXJuIF9GQUlMOwpAQCAtNjcyLDcgKzYzNiw2IEBACiAJCQlyZXMgPSBfRkFJTDsKIAkJfQogCX0KLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTY5MCwxMyArNjUzLDEyIEBACiAJdTgJKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7CiAJdW5pb24gcG40OCBkb3QxMXR4cG47CiAJc3RydWN0CXN0YV9pbmZvCQkqc3RhaW5mbzsKLQlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkgKnByeGF0dHJpYiA9ICYoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIuYXR0cmliOworCXN0cnVjdAlyeF9wa3RfYXR0cmliCSAqcHJ4YXR0cmliID0gJigoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+YXR0cmliOwogCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJdTMyCQlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCi0JcGZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIucnhfZGF0YTsKKwlwZnJhbWUgPSAodW5zaWduZWQgY2hhciAqKSgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+cnhfZGF0YTsKIAogCS8qIDQgc3RhcnQgdG8gZGVjcnlwdCByZWN2ZnJhbWUgKi8KIAlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ID09IF9US0lQXykgewpAQCAtNzE2LDcgKzY3OCw3IEBACiAKIAkJCWl2ID0gcGZyYW1lK3ByeGF0dHJpYi0+aGRybGVuOwogCQkJcGF5bG9hZCA9IHBmcmFtZStwcnhhdHRyaWItPml2X2xlbitwcnhhdHRyaWItPmhkcmxlbjsKLQkJCWxlbmd0aCA9ICgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47CisJCQlsZW5ndGggPSAoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKIAogCQkJR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7CiAKQEAgLTc0Nyw3ICs3MDksNiBAQAogCQkJcmVzID0gX0ZBSUw7CiAJCX0KIAl9Ci1fZnVuY19leGl0XzsKIGV4aXQ6CiAJcmV0dXJuIHJlczsKIH0KQEAgLTgyMSwxOSArNzgyLDE1IEBACiBzdGF0aWMgdm9pZCB4b3JfMTI4KHU4ICphLCB1OCAqYiwgdTggKm91dCkKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgeG9yXzMyKHU4ICphLCB1OCAqYiwgdTggKm91dCkKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdTggc2JveCh1OCBhKQpAQCAtODQ5LDcgKzgwNiw2IEBACiAJCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCiAJCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKIAl9OwotX2Z1bmNfZW50ZXJfOwogCXNib3hfa2V5WzBdID0gc2JveChrZXlbMTNdKTsKIAlzYm94X2tleVsxXSA9IHNib3goa2V5WzE0XSk7CiAJc2JveF9rZXlbMl0gPSBzYm94KGtleVsxNV0pOwpAQCAtODYzLDIxICs4MTksMTcgQEAKIAl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7CiAJeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwogCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIGJ5dGVfc3ViKHU4ICppbiwgdTggKm91dCkKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJb3V0W2ldID0gc2JveChpbltpXSk7Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgc2hpZnRfcm93KHU4ICppbiwgdTggKm91dCkKIHsKLV9mdW5jX2VudGVyXzsKIAlvdXRbMF0gPSAgaW5bMF07CiAJb3V0WzFdID0gIGluWzVdOwogCW91dFsyXSA9ICBpblsxMF07CkBAIC04OTQsNyArODQ2LDYgQEAKIAlvdXRbMTNdID0gaW5bMV07CiAJb3V0WzE0XSA9IGluWzZdOwogCW91dFsxNV0gPSBpblsxMV07Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgbWl4X2NvbHVtbih1OCAqaW4sIHU4ICpvdXQpCkBAIC05MDgsNyArODU5LDYgQEAKIAl1OCByb3RyWzRdOwogCXU4IHRlbXBbNF07CiAJdTggdGVtcGJbNF07Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMCA7IGkgPCA0OyBpKyspIHsKIAkJaWYgKChpbltpXSAmIDB4ODApID09IDB4ODApCiAJCQlhZGQxYltpXSA9IDB4MWI7CkBAIC05NTIsNyArOTAyLDYgQEAKIAl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7CiAJeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsIHRlbXBiKTsKIAl4b3JfMzIodGVtcCwgdGVtcGIsIG91dCk7Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgYWVzMTI4azEyOGQodTggKmtleSwgdTggKmRhdGEsIHU4ICpjaXBoZXJ0ZXh0KQpAQCAtOTYyLDcgKzkxMSw2IEBACiAJdTggaW50ZXJtZWRpYXRlYVsxNl07CiAJdTggaW50ZXJtZWRpYXRlYlsxNl07CiAJdTggcm91bmRfa2V5WzE2XTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJcm91bmRfa2V5W2ldID0ga2V5W2ldOwogCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKSB7CkBAIC05ODQsNyArOTMyLDYgQEAKIAkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwogCQl9CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05OTUsNyArOTQyLDYgQEAKIAkJCSAgICAgdWludCBwYXlsb2FkX2xlbmd0aCwgdTggKnBuX3ZlY3RvcikKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAltaWNfaXZbMF0gPSAweDU5OwogCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQogCQltaWNfaXZbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgIC8qIFFvU19UQwkgICAqLwpAQCAtMTAwOSw3ICs5NTUsNiBAQAogCQltaWNfaXZbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsJLyogbWljX2l2Wzg6MTNdID0gUE5bNTowXSAqLwogCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKIAltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwMTksNyArOTY0LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEodTggKm1pY19oZWFkZXIxLCBpbnQgaGVhZGVyX2xlbmd0aCwgdTggKm1wZHUpCiB7Ci1fZnVuY19lbnRlcl87CiAJbWljX2hlYWRlcjFbMF0gPSAodTgpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOwogCW1pY19oZWFkZXIxWzFdID0gKHU4KSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKIAltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLwpAQCAtMTAzNiw3ICs5ODAsNiBAQAogCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwogCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOwogCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDQ3LDcgKzk5MCw2IEBACiBzdGF0aWMgdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIodTggKm1pY19oZWFkZXIyLCB1OCAqbXBkdSwgaW50IGE0X2V4aXN0cywgaW50IHFjX2V4aXN0cykKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJbWljX2hlYWRlcjJbaV0gPSAweDAwOwogCkBAIC0xMDc5LDcgKzEwMjEsNiBAQAogCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwOTAsNyArMTAzMSw2IEBACiBzdGF0aWMgdm9pZCBjb25zdHJ1Y3RfY3RyX3ByZWxvYWQodTggKmN0cl9wcmVsb2FkLCBpbnQgYTRfZXhpc3RzLCBpbnQgcWNfZXhpc3RzLCB1OCAqbXBkdSwgdTggKnBuX3ZlY3RvciwgaW50IGMpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCWN0cl9wcmVsb2FkW2ldID0gMHgwMDsKIAlpID0gMDsKQEAgLTExMDcsNyArMTA0Nyw2IEBACiAJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yWzEzIC0gaV07CSAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCiAJY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8qIEN0ciAqLwogCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTE3LDEwICsxMDU2LDggQEAKIHN0YXRpYyB2b2lkIGJpdHdpc2VfeG9yKHU4ICppbmEsIHU4ICppbmIsIHU4ICpvdXQpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgaW50IGFlc19jaXBoZXIodTggKmtleSwgdWludCBoZHJsZW4sIHU4ICpwZnJhbWUsIHVpbnQgcGxlbikKQEAgLTExNDIsNyArMTA3OSw2IEBACiAJdWludAlmcnR5cGUgID0gR2V0RnJhbWVUeXBlKHBmcmFtZSk7CiAJdWludAlmcnN1YnR5cGUgID0gR2V0RnJhbWVTdWJUeXBlKHBmcmFtZSk7CiAKLV9mdW5jX2VudGVyXzsKIAlmcnN1YnR5cGUgPSBmcnN1YnR5cGU+PjQ7CiAKIAlfcnR3X21lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwpAQCAtMTI1Myw3ICsxMTg5LDYgQEAKIAliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwogCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCiAJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC0xMjc0LDcgKzEyMDksNiBAQAogCiAvKgl1aW50CW9mZnNldCA9IDA7ICovCiAJdTMyIHJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCgoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGZyYW1lKS0+YnVmX2FkZHIgPT0gTlVMTCkKIAkJcmV0dXJuIF9GQUlMOwpAQCAtMTMxOCw3ICsxMjUyLDYgQEAKIAl9CiAKIAotX2Z1bmNfZXhpdF87CiAJCXJldHVybiByZXM7CiB9CiAKQEAgLTEzNDQsNyArMTI3Nyw2IEBACiAvKgl1aW50CW9mZnNldCA9IDA7ICovCiAJdWludAlmcnR5cGUgID0gR2V0RnJhbWVUeXBlKHBmcmFtZSk7CiAJdWludAlmcnN1YnR5cGUgID0gR2V0RnJhbWVTdWJUeXBlKHBmcmFtZSk7Ci1fZnVuY19lbnRlcl87CiAJZnJzdWJ0eXBlID0gZnJzdWJ0eXBlPj40OwogCiAJX3J0d19tZW1zZXQoKHZvaWQgKiltaWNfaXYsIDAsIDE2KTsKQEAgLTE1MTQsNyArMTQ0Niw2IEBACiAJCQlyZXMgPSBfRkFJTDsKIAkJfQogCX0KLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE1MjQsMTEgKzE0NTUsMTAgQEAKIAlpbnQJCWxlbmd0aDsKIAl1OAkqcGZyYW1lLCAqcHJ3c2tleTsJLyogICpwYXlsb2FkLCppdiAqLwogCXN0cnVjdAlzdGFfaW5mbwkJKnN0YWluZm87Ci0Jc3RydWN0CXJ4X3BrdF9hdHRyaWIJICpwcnhhdHRyaWIgPSAmKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkgKnByeGF0dHJpYiA9ICYoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPmF0dHJpYjsKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXUzMglyZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKLQlwZnJhbWUgPSAodW5zaWduZWQgY2hhciAqKSgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5yeF9kYXRhOworCXBmcmFtZSA9ICh1bnNpZ25lZCBjaGFyICopKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5yeF9kYXRhOwogCS8qIDQgc3RhcnQgdG8gZW5jcnlwdCBlYWNoIGZyYWdtZW50ICovCiAJaWYgKChwcnhhdHRyaWItPmVuY3J5cHQgPT0gX0FFU18pKSB7CiAJCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LCAmcHJ4YXR0cmliLT50YVswXSk7CkBAIC0xNTUyLDE0ICsxNDgyLDEzIEBACiAJCQl9IGVsc2UgewogCQkJCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwogCQkJfQotCQkJbGVuZ3RoID0gKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKKwkJCWxlbmd0aCA9ICgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+bGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuOwogCQkJcmVzID0gYWVzX2RlY2lwaGVyKHByd3NrZXksIHByeGF0dHJpYi0+aGRybGVuLCBwZnJhbWUsIGxlbmd0aCk7CiAJCX0gZWxzZSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJydHdfYWVzX2VuY3J5cHQ6IHN0YWluZm89PU5VTEwhISFcbiIpKTsKIAkJCXJlcyA9IF9GQUlMOwogCQl9CiAJfQotX2Z1bmNfZXhpdF87CiBleGl0OgogCXJldHVybiByZXM7CiB9CkBAIC0xNzY3LDcgKzE2OTYsNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgiXl5ecnR3X3VzZV90a2lwa2V5X2hhbmRsZXIgXl5eXG4iKSk7CiAKQEAgLTE3NzUsNSArMTcwMyw0IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJeXl5ydHdfdXNlX3RraXBrZXlfaGFuZGxlciBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5PSVkXl5eXG4iLCBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KSk7CiAKLV9mdW5jX2V4aXRfOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zdGFfbWd0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3N0YV9tZ3QuYwppbmRleCAwMmUxZTFmLi4yZDBiNjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3N0YV9tZ3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3N0YV9tZ3QuYwpAQCAtMjUsMTAgKzI1LDEwIEBACiAjaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgogI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KICNpbmNsdWRlIDxzdGFfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogc3RhdGljIHZvaWQgX3J0d19pbml0X3N0YWluZm8oc3RydWN0IHN0YV9pbmZvICpwc3RhKQogewotX2Z1bmNfZW50ZXJfOwogCV9ydHdfbWVtc2V0KCh1OCAqKXBzdGEsIDAsIHNpemVvZiAoc3RydWN0IHN0YV9pbmZvKSk7CiAKIAkgc3Bpbl9sb2NrX2luaXQoJnBzdGEtPmxvY2spOwpAQCAtNjksNyArNjksNiBAQAogCiAjZW5kaWYJLyogIENPTkZJR184OEVVX0FQX01PREUgKi8KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHUzMglfcnR3X2luaXRfc3RhX3ByaXYoc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdikKQEAgLTc3LDkgKzc2LDggQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7CiAJczMyIGk7CiAKLV9mdW5jX2VudGVyXzsKIAotCXBzdGFwcml2LT5wYWxsb2NhdGVkX3N0YWluZm9fYnVmID0gcnR3X3p2bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pICogTlVNX1NUQSArIDQpOworCXBzdGFwcml2LT5wYWxsb2NhdGVkX3N0YWluZm9fYnVmID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHN0YV9pbmZvKSAqIE5VTV9TVEEgKyA0KTsKIAogCWlmICghcHN0YXByaXYtPnBhbGxvY2F0ZWRfc3RhaW5mb19idWYpCiAJCXJldHVybiBfRkFJTDsKQEAgLTEyNSw3ICsxMjMsNiBAQAogCXBzdGFwcml2LT5tYXhfbnVtX3N0YSA9IE5VTV9TVEE7CiAjZW5kaWYKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNTQsMjEgKzE1MSwxOSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGFwcml2LT5mcmVlX3N0YV9xdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8gLCBsaXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbyAsIGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBydHdfbWZyZWVfc3RhX3ByaXZfbG9jayhzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2KQpAQCAtMTgzLDIyICsxNzgsMjEgQEAKIAlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7CiAJaW50CWluZGV4OwogCi1fZnVuY19lbnRlcl87CiAJaWYgKHBzdGFwcml2KSB7CiAJCS8qCWRlbGV0ZSBhbGwgcmVvcmRlcmluZ19jdHJsX3RpbWVyCQkqLwogCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKIAkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1NUQTsgaW5kZXgrKykgewogCQkJcGhlYWQgPSAmKHBzdGFwcml2LT5zdGFfaGFzaFtpbmRleF0pOwotCQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCQl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7CiAJCQkJaW50IGk7Ci0JCQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8gLCBoYXNoX2xpc3QpOwotCQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbyAsIGhhc2hfbGlzdCk7CisJCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKLQkJCQkJX2NhbmNlbF90aW1lcl9leCgmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKKwkJCQkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0yMDgsMTAgKzIwMiw5IEBACiAJCXJ0d19tZnJlZV9zdGFfcHJpdl9sb2NrKHBzdGFwcml2KTsKIAogCQlpZiAocHN0YXByaXYtPnBhbGxvY2F0ZWRfc3RhaW5mb19idWYpCi0JCQlydHdfdm1mcmVlKHBzdGFwcml2LT5wYWxsb2NhdGVkX3N0YWluZm9fYnVmLCBzaXplb2Yoc3RydWN0IHN0YV9pbmZvKSpOVU1fU1RBKzQpOworCQkJdmZyZWUocHN0YXByaXYtPnBhbGxvY2F0ZWRfc3RhaW5mb19idWYpOwogCX0KIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC0yMjUsNyArMjE4LDYgQEAKIAlpbnQgaSA9IDA7CiAJdTE2ICB3UnhTZXFJbml0aWFsVmFsdWUgPSAweGZmZmY7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBmcmVlX3N0YV9xdWV1ZSA9ICZwc3RhcHJpdi0+ZnJlZV9zdGFfcXVldWU7CiAKQEAgLTIzNSw3ICsyMjcsNyBAQAogCQlzcGluX3VubG9ja19iaCgmcGZyZWVfc3RhX3F1ZXVlLT5sb2NrKTsKIAkJcHN0YSA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKGdldF9uZXh0KCZwZnJlZV9zdGFfcXVldWUtPnF1ZXVlKSwgc3RydWN0IHN0YV9pbmZvLCBsaXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZigoJnBmcmVlX3N0YV9xdWV1ZS0+cXVldWUpLT5uZXh0LCBzdHJ1Y3Qgc3RhX2luZm8sIGxpc3QpOwogCQlydHdfbGlzdF9kZWxldGUoJihwc3RhLT5saXN0KSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV9zdGFfcXVldWUtPmxvY2spOwogCQlfcnR3X2luaXRfc3RhaW5mbyhwc3RhKTsKQEAgLTI5Nyw5ICsyODksNiBAQAogCX0KIAogZXhpdDoKLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcHN0YTsKIH0KIApAQCAtMzEzLDcgKzMwMiw2IEBACiAJc3RydWN0CXhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocHN0YSA9PSBOVUxMKQogCQlnb3RvIGV4aXQ7CkBAIC0zNTMsMzIgKzM0MSwzNCBAQAogCV9ydHdfaW5pdF9zdGFfeG1pdF9wcml2KCZwc3RhLT5zdGFfeG1pdHByaXYpOwogCV9ydHdfaW5pdF9zdGFfcmVjdl9wcml2KCZwc3RhLT5zdGFfcmVjdnByaXYpOwogCi0JX2NhbmNlbF90aW1lcl9leCgmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lcik7CiAKIAkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wsIGNhbmNlbCByZW9yZGVyaW5nX2N0cmxfdGltZXIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwotCQl1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lOworCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJoZHI7CisJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lOwogCQlzdHJ1Y3QgX19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwogCQlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSA9ICZwYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwogCiAJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKIAotCQlfY2FuY2VsX3RpbWVyX2V4KCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKIAogCQlwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAKIAkJc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwogCiAJCXBoZWFkID0JCWdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKCFydHdfaXNfbGlzdF9lbXB0eShwaGVhZCkpIHsKLQkJCXByZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7CisJCQlwcmhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOworCQkJcHJmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByaGRyOwogCi0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKLQkJCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPnUuaGRyLmxpc3QpKTsKKwkJCXJ0d19saXN0X2RlbGV0ZSgmKHByZnJhbWUtPmxpc3QpKTsKIAogCQkJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQl9CkBAIC00MjgsNyArNDE4LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC00NDIsMzIgKzQzMSwyNiBAQAogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0IHN0YV9pbmZvICpwYmNtY19zdGFpbmZvID0gcnR3X2dldF9iY21jX3N0YWluZm8ocGFkYXB0ZXIpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50ID09IDEpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fU1RBOyBpbmRleCsrKSB7CiAJCXBoZWFkID0gJihwc3RhcHJpdi0+c3RhX2hhc2hbaW5kZXhdKTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKCghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkpIHsKLQkJCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvICwgaGFzaF9saXN0KTsKKwkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbyAsIGhhc2hfbGlzdCk7CiAKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJaWYgKHBiY21jX3N0YWluZm8gIT0gcHN0YSkKIAkJCQlydHdfZnJlZV9zdGFpbmZvKHBhZGFwdGVyICwgcHN0YSk7CiAJCX0KIAl9Ci0KIAlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi1leGl0OgotCi1fZnVuY19leGl0XzsKIH0KIAogLyogYW55IHN0YXRpb24gYWxsb2NhdGVkIGNhbiBiZSBzZWFyY2hlZCBieSBoYXNoIGxpc3QgKi8KQEAgLTQ3OSw3ICs0NjIsNiBAQAogCXU4ICphZGRyOwogCXU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoaHdhZGRyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtNDk0LDIxICs0NzYsMjAgQEAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKIAogCXBoZWFkID0gJihwc3RhcHJpdi0+c3RhX2hhc2hbaW5kZXhdKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKIAotCQlpZiAoKF9ydHdfbWVtY21wKHBzdGEtPmh3YWRkciwgYWRkciwgRVRIX0FMRU4pKSA9PSB0cnVlKSB7CisJCWlmICgoIW1lbWNtcChwc3RhLT5od2FkZHIsIGFkZHIsIEVUSF9BTEVOKSkgPT0gdHJ1ZSkgewogCQkJLyogIGlmIGZvdW5kIHRoZSBtYXRjaGVkIGFkZHJlc3MgKi8KIAkJCWJyZWFrOwogCQl9CiAJCXBzdGEgPSBOVUxMOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHBzdGE7CiB9CiAKQEAgLTUxOSw3ICs1MDAsNiBAQAogCXVuc2lnbmVkIGNoYXIgYmNhc3RfYWRkcltFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvKHBzdGFwcml2LCBiY2FzdF9hZGRyKTsKIApAQCAtNTMzLDcgKzUxMyw2IEBACiAJcHN0YS0+bWFjX2lkID0gMTsKIAogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTU0Miw5ICs1MjEsNyBAQAogCXN0cnVjdCBzdGFfaW5mbwkJKnBzdGE7CiAJc3RydWN0IHN0YV9wcml2CQkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAJdTggYmNfYWRkcltFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci1fZnVuY19lbnRlcl87CiAJIHBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIGJjX2FkZHIpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHBzdGE7CiB9CiAKQEAgLTU2MSwxMiArNTM4LDEyIEBACiAKIAlzcGluX2xvY2tfYmgoJihwYWNsX25vZGVfcS0+bG9jaykpOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAl3aGlsZSAoKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSkgewotCQlwYWNsbm9kZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGFjbG5vZGUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKLQkJaWYgKF9ydHdfbWVtY21wKHBhY2xub2RlLT5hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKHBhY2xub2RlLT5hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pKSB7CiAJCQlpZiAocGFjbG5vZGUtPnZhbGlkKSB7CiAJCQkJbWF0Y2ggPSB0cnVlOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKaW5kZXggOTZkZjYyZi4uM2RkOTA1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCkBAIC05MjksNyArOTI5LDcgQEAKIAkJcmV0dXJuIF9GQUlMOwogCX0KIAotCWlmIChfcnR3X21lbWNtcChjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwYnNzaWQsIDYpID09IGZhbHNlKSB7CisJaWYgKCFtZW1jbXAoY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGJzc2lkLCA2KSA9PSBmYWxzZSkgewogCQlEQkdfODhFKCJPb3BzOiBydHdfY2hlY2tfbmV0d29ya19lbmNyeXB0IGxpbmtlZCBidXQgcmVjdiBvdGhlciBic3NpZCBiY25cbiVwTSAlcE1cbiIsCiAJCQkocGJzc2lkKSwgKGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKTsKIAkJcmV0dXJuIHRydWU7CkBAIC0xMDE0LDcgKzEwMTQsNyBAQAogCQkJCWJzc2lkLT5Tc2lkLlNzaWRMZW5ndGgsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZCwKIAkJCQljdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWRMZW5ndGgpKTsKIAotCWlmICghX3J0d19tZW1jbXAoYnNzaWQtPlNzaWQuU3NpZCwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkLCAzMikgfHwKKwlpZiAobWVtY21wKGJzc2lkLT5Tc2lkLlNzaWQsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZCwgMzIpIHx8CiAJICAgIGJzc2lkLT5Tc2lkLlNzaWRMZW5ndGggIT0gY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkTGVuZ3RoKSB7CiAJCWlmIChic3NpZC0+U3NpZC5Tc2lkWzBdICE9ICdcMCcgJiYgYnNzaWQtPlNzaWQuU3NpZExlbmd0aCAhPSAwKSB7IC8qIG5vdCBoaWRkZW4gc3NpZCAqLwogCQkJREJHXzg4RSgiJXMoKSwgU1NJRCBpcyBub3QgbWF0Y2ggcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAJfQogCiAJaWYgKGN1cl9uZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCAhPSBlbmNyeXBfcHJvdG9jb2wpIHsKLQkJREJHXzg4RSgiJXMoKTogZW5jdHlwIGlzIG5vdCBtYXRjaCAsIHJldHVybiBGQUlMXG4iLCBfX2Z1bmNfXyk7CisJCURCR184OEUoIiVzKCk6IGVuY3J5cHRpb24gcHJvdG9jb2wgaXMgbm90IG1hdGNoICwgcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKIAkJZ290byBfbWlzbWF0Y2g7CiAJfQogCkBAIC0xMDkwLDEyICsxMDkwLDEwIEBACiAJfQogCiAJa2ZyZWUoYnNzaWQpOwotCV9mdW5jX2V4aXRfOwogCXJldHVybiBfU1VDQ0VTUzsKIAogX21pc21hdGNoOgogCWtmcmVlKGJzc2lkKTsKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gX0ZBSUw7CiB9CiAKQEAgLTExNDEsMTEgKzExMzksMTEgQEAKIAogCQkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzoKLQkJCQlpZiAoKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpKSAmJiAoX3J0d19tZW1jbXAoKHBJRS0+ZGF0YSArIDEyKSwgV1BBX1RLSVBfQ0lQSEVSLCA0KSkpCisJCQkJaWYgKCghbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpKSAmJiAoIW1lbWNtcCgocElFLT5kYXRhICsgMTIpLCBXUEFfVEtJUF9DSVBIRVIsIDQpKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJYnJlYWs7CiAJCQljYXNlIF9SU05fSUVfMl86Ci0JCQkJaWYgKF9ydHdfbWVtY21wKChwSUUtPmRhdGEgKyA4KSwgUlNOX1RLSVBfQ0lQSEVSLCA0KSkKKwkJCQlpZiAoIW1lbWNtcCgocElFLT5kYXRhICsgOCksIFJTTl9US0lQX0NJUEhFUiwgNCkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsKQEAgLTExNzIsMTQgKzExNzAsMTQgQEAKIAogCQkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzoKLQkJCQlpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkgJiYKLQkJCQkgICAgKChfcnR3X21lbWNtcCgocElFLT5kYXRhICsgMTIpLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSB8fAotCQkJCSAgICAoX3J0d19tZW1jbXAoKHBJRS0+ZGF0YSArIDE2KSwgV1BBX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkpKQorCQkJCWlmICghbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpICYmCisJCQkJICAgICgoIW1lbWNtcCgocElFLT5kYXRhICsgMTIpLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSB8fAorCQkJCSAgICAoIW1lbWNtcCgocElFLT5kYXRhICsgMTYpLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSkpCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQlicmVhazsKIAkJCWNhc2UgX1JTTl9JRV8yXzoKLQkJCQlpZiAgKChfcnR3X21lbWNtcCgocElFLT5kYXRhICsgOCksIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpICB8fAotCQkJCSAgICAgICAoX3J0d19tZW1jbXAoKHBJRS0+ZGF0YSArIDEyKSwgUlNOX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkpCisJCQkJaWYgICgoIW1lbWNtcCgocElFLT5kYXRhICsgOCksIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpICB8fAorCQkJCSAgICAgICAoIW1lbWNtcCgocElFLT5kYXRhICsgMTIpLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSkKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsKQEAgLTEyMDgsNyArMTIwNiw3IEBACiAKIAkJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86Ci0JCQkJaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpKQorCQkJCWlmICghbWVtY21wKHBJRS0+ZGF0YSwgUlRXX1dQQV9PVUksIDQpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJYnJlYWs7CiAJCQljYXNlIF9SU05fSUVfMl86CkBAIC0xNDAwLDM1ICsxMzk4LDM1IEBACiAKIAkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOgotCQkJaWYgKChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEFSVEhFUk9TX09VSTEsIDMpKSB8fAotCQkJICAgIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEFSVEhFUk9TX09VSTIsIDMpKSkgeworCQkJaWYgKCghbWVtY21wKHBJRS0+ZGF0YSwgQVJUSEVST1NfT1VJMSwgMykpIHx8CisJCQkgICAgKCFtZW1jbXAocElFLT5kYXRhLCBBUlRIRVJPU19PVUkyLCAzKSkpIHsKIAkJCQlEQkdfODhFKCJsaW5rIHRvIEFydGhlcm9zIEFQXG4iKTsKIAkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfQVRIRVJPUzsKLQkJCX0gZWxzZSBpZiAoKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQlJPQURDT01fT1VJMSwgMykpIHx8Ci0JCQkJICAgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQlJPQURDT01fT1VJMiwgMykpIHx8Ci0JCQkJICAgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQlJPQURDT01fT1VJMiwgMykpKSB7CisJCQl9IGVsc2UgaWYgKCghbWVtY21wKHBJRS0+ZGF0YSwgQlJPQURDT01fT1VJMSwgMykpIHx8CisJCQkJICAgKCFtZW1jbXAocElFLT5kYXRhLCBCUk9BRENPTV9PVUkyLCAzKSkgfHwKKwkJCQkgICAoIW1lbWNtcChwSUUtPmRhdGEsIEJST0FEQ09NX09VSTIsIDMpKSkgewogCQkJCURCR184OEUoImxpbmsgdG8gQnJvYWRjb20gQVBcbiIpOwogCQkJCXJldHVybiBIVF9JT1RfUEVFUl9CUk9BRENPTTsKLQkJCX0gZWxzZSBpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBNQVJWRUxMX09VSSwgMykpIHsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChwSUUtPmRhdGEsIE1BUlZFTExfT1VJLCAzKSkgewogCQkJCURCR184OEUoImxpbmsgdG8gTWFydmVsbCBBUFxuIik7CiAJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX01BUlZFTEw7Ci0JCQl9IGVsc2UgaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgUkFMSU5LX09VSSwgMykpIHsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFJBTElOS19PVUksIDMpKSB7CiAJCQkJaWYgKCFyYWxpbmtfdmVuZG9yX2ZsYWcpIHsKIAkJCQkJcmFsaW5rX3ZlbmRvcl9mbGFnID0gMTsKIAkJCQl9IGVsc2UgewogCQkJCQlEQkdfODhFKCJsaW5rIHRvIFJhbGluayBBUFxuIik7CiAJCQkJCXJldHVybiBIVF9JT1RfUEVFUl9SQUxJTks7CiAJCQkJfQotCQkJfSBlbHNlIGlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIENJU0NPX09VSSwgMykpIHsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChwSUUtPmRhdGEsIENJU0NPX09VSSwgMykpIHsKIAkJCQlEQkdfODhFKCJsaW5rIHRvIENpc2NvIEFQXG4iKTsKIAkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfQ0lTQ087Ci0JCQl9IGVsc2UgaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgUkVBTFRFS19PVUksIDMpKSB7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAocElFLT5kYXRhLCBSRUFMVEVLX09VSSwgMykpIHsKIAkJCQlEQkdfODhFKCJsaW5rIHRvIFJlYWx0ZWsgOTZCXG4iKTsKIAkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfUkVBTFRFSzsKLQkJCX0gZWxzZSBpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBBSVJHT0NBUF9PVUksIDMpKSB7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAocElFLT5kYXRhLCBBSVJHT0NBUF9PVUksIDMpKSB7CiAJCQkJREJHXzg4RSgibGluayB0byBBaXJnbyBDYXBcbiIpOwogCQkJCXJldHVybiBIVF9JT1RfUEVFUl9BSVJHTzsKLQkJCX0gZWxzZSBpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBFUElHUkFNX09VSSwgMykpIHsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChwSUUtPmRhdGEsIEVQSUdSQU1fT1VJLCAzKSkgewogCQkJCWVwaWdyYW1fdmVuZG9yX2ZsYWcgPSAxOwogCQkJCWlmIChyYWxpbmtfdmVuZG9yX2ZsYWcpIHsKIAkJCQkJREJHXzg4RSgibGluayB0byBUZW5kYSBXMzExUiBBUFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCmluZGV4IDI0MTgyZmIuLjhkNDI2NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCkBAIC0yMywyNSArMjMsMjIgQEAKICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KICNpbmNsdWRlIDx3aWZpLmg+CiAjaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPGlwLmg+CiAjaW5jbHVkZSA8dXNiX29wcy5oPgogI2luY2x1ZGUgPHVzYl9vc2ludGYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKIHN0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKIHN0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKIAogc3RhdGljIHZvaWQgX2luaXRfdHhzZXJ2cShzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxKQogewotX2Z1bmNfZW50ZXJfOwogCV9ydHdfaW5pdF9saXN0aGVhZCgmcHR4c2VydnEtPnR4X3BlbmRpbmcpOwogCV9ydHdfaW5pdF9xdWV1ZSgmcHR4c2VydnEtPnN0YV9wZW5kaW5nKTsKIAlwdHhzZXJ2cS0+cWNudCA9IDA7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZAlfcnR3X2luaXRfc3RhX3htaXRfcHJpdihzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YV94bWl0cHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAlfcnR3X21lbXNldCgodW5zaWduZWQgY2hhciAqKXBzdGFfeG1pdHByaXYsIDAsIHNpemVvZiAoc3RydWN0IHN0YV94bWl0X3ByaXYpKTsKIAlzcGluX2xvY2tfaW5pdCgmcHN0YV94bWl0cHJpdi0+bG9jayk7CiAJX2luaXRfdHhzZXJ2cSgmcHN0YV94bWl0cHJpdi0+YmVfcSk7CkBAIC01MSw3ICs0OCw2IEBACiAJX3J0d19pbml0X2xpc3RoZWFkKCZwc3RhX3htaXRwcml2LT5sZWdhY3lfZHopOwogCV9ydHdfaW5pdF9saXN0aGVhZCgmcHN0YV94bWl0cHJpdi0+YXBzZCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzMzIJX3J0d19pbml0X3htaXRfcHJpdihzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKQEAgLTYzLDkgKzU5LDggQEAKIAl1MzIgbWF4X3htaXRfZXh0YnVmX3NpemUgPSBNQVhfWE1JVF9FWFRCVUZfU1o7CiAJdTMyIG51bV94bWl0X2V4dGJ1ZiA9IE5SX1hNSVRfRVhUQlVGRjsKIAotX2Z1bmNfZW50ZXJfOwogCi0JLyogIFdlIGRvbid0IG5lZWQgdG8gbWVtc2V0IHBhZGFwdGVyLT5YWFggdG8gemVybywgYmVjYXVzZSBhZGFwdGVyIGlzIGFsbG9jYXRlZCBieSBydHdfenZtYWxsb2MoKS4gKi8KKwkvKiAgV2UgZG9uJ3QgbmVlZCB0byBtZW1zZXQgcGFkYXB0ZXItPlhYWCB0byB6ZXJvLCBiZWNhdXNlIGFkYXB0ZXIgaXMgYWxsb2NhdGVkIGJ5IHZ6YWxsb2MoKS4gKi8KIAogCXNwaW5fbG9ja19pbml0KCZweG1pdHByaXYtPmxvY2spOwogCXNlbWFfaW5pdCgmcHhtaXRwcml2LT54bWl0X3NlbWEsIDApOwpAQCAtOTEsNyArODYsNyBAQAogCVBsZWFzZSBhbHNvIGFwcGx5ICBmcmVlX3R4b2JqIHRvIGxpbmtfdXAgYWxsIHRoZSB4bWl0X2ZyYW1lcy4uLgogCSovCiAKLQlweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmID0gcnR3X3p2bWFsbG9jKE5SX1hNSVRGUkFNRSAqIHNpemVvZihzdHJ1Y3QgeG1pdF9mcmFtZSkgKyA0KTsKKwlweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmID0gdnphbGxvYyhOUl9YTUlURlJBTUUgKiBzaXplb2Yoc3RydWN0IHhtaXRfZnJhbWUpICsgNCk7CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiAgPT0gTlVMTCkgewogCQlweG1pdHByaXYtPnB4bWl0X2ZyYW1lX2J1ZiA9IE5VTEw7CkBAIC0xMjksNyArMTI0LDcgQEAKIAlfcnR3X2luaXRfcXVldWUoJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlKTsKIAlfcnR3X2luaXRfcXVldWUoJnB4bWl0cHJpdi0+cGVuZGluZ194bWl0YnVmX3F1ZXVlKTsKIAotCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmID0gcnR3X3p2bWFsbG9jKE5SX1hNSVRCVUZGICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKKwlweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZiA9IHZ6YWxsb2MoTlJfWE1JVEJVRkYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOwogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmICA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sICgiYWxsb2MgeG1pdF9idWYgZmFpbCFcbiIpKTsKQEAgLTE3MSw3ICsxNjYsNyBAQAogCS8qICBJbml0IHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KIAlfcnR3X2luaXRfcXVldWUoJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZSk7CiAKLQlweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYgPSBydHdfenZtYWxsb2MobnVtX3htaXRfZXh0YnVmICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKKwlweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYgPSB2emFsbG9jKG51bV94bWl0X2V4dGJ1ZiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmICA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sICgiYWxsb2MgeG1pdF9leHRidWYgZmFpbCFcbiIpKTsKQEAgLTIyNiw3ICsyMjEsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0yNDAsMTIgKzIzNCwxMSBAQAogCXUzMiBtYXhfeG1pdF9leHRidWZfc2l6ZSA9IE1BWF9YTUlUX0VYVEJVRl9TWjsKIAl1MzIgbnVtX3htaXRfZXh0YnVmID0gTlJfWE1JVF9FWFRCVUZGOwogCi0gX2Z1bmNfZW50ZXJfOwogCiAJcnR3X2hhbF9mcmVlX3htaXRfcHJpdihwYWRhcHRlcik7CiAKIAlpZiAocHhtaXRwcml2LT5weG1pdF9mcmFtZV9idWYgPT0gTlVMTCkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9YTUlURlJBTUU7IGkrKykgewogCQlydHdfb3NfeG1pdF9jb21wbGV0ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7CkBAIC0yNTksMTAgKzI1MiwxMCBAQAogCX0KIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKQotCQlydHdfdm1mcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYsIE5SX1hNSVRGUkFNRSAqIHNpemVvZihzdHJ1Y3QgeG1pdF9mcmFtZSkgKyA0KTsKKwkJdmZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1Zik7CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYpCi0JCXJ0d192bWZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYsIE5SX1hNSVRCVUZGICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKKwkJdmZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYpOwogCiAJLyogIGZyZWUgeG1pdCBleHRlbnNpb24gYnVmZiAqLwogCXB4bWl0YnVmID0gKHN0cnVjdCB4bWl0X2J1ZiAqKXB4bWl0cHJpdi0+cHhtaXRfZXh0YnVmOwpAQCAtMjcyLDE2ICsyNjUsMTIgQEAKIAl9CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmKSB7Ci0JCXJ0d192bWZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmLCBudW1feG1pdF9leHRidWYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOworCQl2ZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpOwogCX0KIAogCXJ0d19mcmVlX2h3eG1pdHMocGFkYXB0ZXIpOwogCiAJbXV0ZXhfZGVzdHJveSgmcHhtaXRwcml2LT5hY2tfdHhfbXV0ZXgpOwotCi1vdXQ6Ci0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfYXR0cmliX3Zjc19pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCkBAIC00NTUsNyArNDQ0LDYgQEAKIAlzdHJ1Y3QgcW9zX3ByaXYJCSpwcW9zcHJpdiA9ICZwbWxtZXByaXYtPnFvc3ByaXY7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCi0gX2Z1bmNfZW50ZXJfOwogCiAJX3J0d19vcGVuX3BrdGZpbGUocGt0LCAmcGt0ZmlsZSk7CiAJX3J0d19wa3RmaWxlX3JlYWQoJnBrdGZpbGUsICh1OCAqKSZldGhlcmhkciwgRVRIX0hMRU4pOwpAQCAtNjM5LDcgKzYyNyw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTY2Miw3ICs2NDksNiBAQAogCWVsc2UKIAkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYgLCAmcGF0dHJpYi0+cmFbMF0pOwogCi1fZnVuY19lbnRlcl87CiAKIAlod19oZHJfb2Zmc2V0ID0gVFhERVNDX1NJWkUgKyAocHhtaXRmcmFtZS0+cGt0X29mZnNldCAqIFBBQ0tFVF9PRkZTRVRfU1opOwogCkBAIC02NzYsMTIgKzY2MiwxMiBAQAogCQkJcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwogCiAJCQlpZiAoYm1jc3QpIHsKLQkJCQlpZiAoX3J0d19tZW1jbXAocHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHR4bWlja2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleSwgbnVsbF9rZXksIDE2KSkKKwkJCQlpZiAoIW1lbWNtcChwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwdHhtaWNrZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5LCBudWxsX2tleSwgMTYpKQogCQkJCQlyZXR1cm4gX0ZBSUw7CiAJCQkJLyogc3RhcnQgdG8gY2FsY3VsYXRlIHRoZSBtaWMgY29kZSAqLwogCQkJCXJ0d19zZWNtaWNzZXRrZXkoJm1pY2RhdGEsIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnB0eG1pY2tleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXkpOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoX3J0d19tZW1jbXAoJnN0YWluZm8tPmRvdDExdGtpcHR4bWlja2V5LnNrZXlbMF0sIG51bGxfa2V5LCAxNikgPT0gdHJ1ZSkgeworCQkJCWlmICghbWVtY21wKCZzdGFpbmZvLT5kb3QxMXRraXB0eG1pY2tleS5za2V5WzBdLCBudWxsX2tleSwgMTYpKSB7CiAJCQkJCS8qIERiZ1ByaW50KCJcbnhtaXRmcmFtZV9hZGRtaWM6c3RhaW5mby0+ZG90MTF0a2lwdHhtaWNrZXkgPT0gMFxuIik7ICovCiAJCQkJCS8qIG1zbGVlcCgxMCk7ICovCiAJCQkJCXJldHVybiBfRkFJTDsKQEAgLTc2MCw3ICs3NDYsNiBAQAogCQkJfQogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC03NjksNyArNzU0LDYgQEAKIHsKIAlzdHJ1Y3QJcGt0X2F0dHJpYgkgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocGF0dHJpYi0+YnN3ZW5jKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2FsZXJ0XywgKCIjIyMgeG1pdGZyYW1lX3N3ZW5jcnlwdFxuIikpOwpAQCAtNzkxLDcgKzc3NSw2IEBACiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X25vdGljZV8sICgiIyMjIHhtaXRmcmFtZV9od2VuY3J5cHRcbiIpKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtODEyLDcgKzc5NSw2IEBACiAKIAlpbnQgYm1jc3QgPSBJU19NQ0FTVChwYXR0cmliLT5yYSk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwYXR0cmliLT5wc3RhKSB7CiAJCXBzdGEgPSBwYXR0cmliLT5wc3RhOwpAQCAtOTE4LDcgKzkwMCw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTAwNyw3ICs5ODgsNiBAQAogCXMzMiBibWNzdCA9IElTX01DQVNUKHBhdHRyaWItPnJhKTsKIAlzMzIgcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LCBwYXR0cmliLT5yYSk7CiAKQEAgLTExNDUsNyArMTEyNSw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTExNjIsNyArMTE0MSw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqc25hcDsKIAl1OCAqb3VpOwogCi1fZnVuY19lbnRlcl87CiAKIAlzbmFwID0gKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKilkYXRhOwogCXNuYXAtPmRzYXAgPSAweGFhOwpAQCAtMTE4MCw3ICsxMTU4LDYgQEAKIAogCSooX19iZTE2ICopKGRhdGEgKyBTTkFQX1NJWkUpID0gaHRvbnMoaF9wcm90byk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOwogfQpAQCAtMTE5Myw3ICsxMTcwLDYgQEAKIAlzdHJ1Y3QJeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwogCXN0cnVjdAlyZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCXN3aXRjaCAocHhtaXRwcml2LT52Y3Nfc2V0dGluZykgewogCWNhc2UgRElTQUJMRV9WQ1M6CkBAIC0xMjIwLDcgKzExOTYsNiBAQAogCQlicmVhazsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19jb3VudF90eF9zdGF0cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCBpbnQgc3opCkBAIC0xMjUwLDcgKzEyMjUsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFsKTsKIApAQCAtMTI1OSw5ICsxMjMzLDkgQEAKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyZWVfcXVldWUpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCi0JCXB4bWl0YnVmID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7CisJCXB4bWl0YnVmID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgeG1pdF9idWYsIGxpc3QpOwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmKHB4bWl0YnVmLT5saXN0KSk7CiAJfQpAQCAtMTI4MCw3ICsxMjU0LDYgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFsKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcHhtaXRidWY7CiB9CkBAIC0xMjkwLDcgKzEyNjMsNiBAQAogCXVuc2lnbmVkIGxvbmcgaXJxbDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocHhtaXRidWYgPT0gTlVMTCkKIAkJcmV0dXJuIF9GQUlMOwpAQCAtMTMwNCw3ICsxMjc2LDYgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFsKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xMzE2LDcgKzEyODcsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3htaXRidWZfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCS8qIERCR184OEUoIitydHdfYWxsb2NfeG1pdGJ1ZlxuIik7ICovCiAKQEAgLTEzMjcsOSArMTI5Nyw5IEBACiAJfSBlbHNlIHsKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRidWZfcXVldWUpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCi0JCXB4bWl0YnVmID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7CisJCXB4bWl0YnVmID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgeG1pdF9idWYsIGxpc3QpOwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmKHB4bWl0YnVmLT5saXN0KSk7CiAJfQpAQCAtMTM0NCw3ICsxMzE0LDYgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxbCk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHB4bWl0YnVmOwogfQpAQCAtMTM1NCw3ICsxMzIzLDYgQEAKIAl1bnNpZ25lZCBsb25nIGlycWw7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3htaXRidWZfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAocHhtaXRidWYgPT0gTlVMTCkKIAkJcmV0dXJuIF9GQUlMOwogCkBAIC0xMzc2LDcgKzEzNDQsNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV94bWl0YnVmX3F1ZXVlLT5sb2NrLCBpcnFsKTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTQwNSw3ICsxMzcyLDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV94bWl0X3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X3F1ZXVlOwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfYmgoJnBmcmVlX3htaXRfcXVldWUtPmxvY2spOwogCkBAIC0xNDE1LDkgKzEzODEsOSBAQAogCX0gZWxzZSB7CiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV94bWl0X3F1ZXVlKTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAotCQlweGZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJcHhmcmFtZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmKHB4ZnJhbWUtPmxpc3QpKTsKIAl9CkBAIC0xNDQ0LDcgKzE0MTAsNiBAQAogCiAJc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3htaXRfcXVldWUtPmxvY2spOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBweGZyYW1lOwogfQpAQCAtMTQ1NSw3ICsxNDIwLDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdHByaXYtPmFkYXB0ZXI7CiAJc3RydWN0IHNrX2J1ZmYgKnBuZGlzX3BrdCA9IE5VTEw7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChweG1pdGZyYW1lID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCI9PT09PT0gcnR3X2ZyZWVfeG1pdGZyYW1lKCk6cHhtaXRmcmFtZSA9PSBOVUxMISEhISEhISEhIVxuIikpOwpAQCAtMTQ4Myw3ICsxNDQ3LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNDkzLDIzICsxNDU2LDIxIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAlzdHJ1Y3QJeG1pdF9mcmFtZQkqcHhtaXRmcmFtZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2JoKCYocGZyYW1lcXVldWUtPmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgewotCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCXJ0d19mcmVlX3htaXRmcmFtZShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwogCX0KIAlzcGluX3VubG9ja19iaCgmKHBmcmFtZXF1ZXVlLT5sb2NrKSk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzMzIgcnR3X3htaXRmcmFtZV9lbnF1ZXVlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCkBAIC0xNTMwLDEyICsxNDkxLDEyIEBACiAJc3RydWN0CXhtaXRfZnJhbWUJKnB4bWl0ZnJhbWUgPSBOVUxMOwogCiAJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVfcXVldWUpOwotCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJaWYgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpIHsKLQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQlydHdfbGlzdF9kZWxldGUoJnB4bWl0ZnJhbWUtPmxpc3QpOwogCkBAIC0xNTU1LDcgKzE1MTYsNiBAQAogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCWludCBpLCBpbnhbNF07CiAKLV9mdW5jX2VudGVyXzsKIAogCWlueFswXSA9IDA7IGlueFsxXSA9IDE7IGlueFsyXSA9IDI7IGlueFszXSA9IDM7CiAKQEAgLTE1NzIsMTAgKzE1MzIsMTAgQEAKIAkJcGh3eG1pdCA9IHBod3htaXRfaSArIGlueFtpXTsKIAogCQlzdGFfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBod3htaXQtPnN0YV9xdWV1ZSk7Ci0JCXN0YV9wbGlzdCA9IGdldF9uZXh0KHN0YV9waGVhZCk7CisJCXN0YV9wbGlzdCA9IHN0YV9waGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHN0YV9waGVhZCwgc3RhX3BsaXN0KSkgewotCQkJcHR4c2VydnEgPSBMSVNUX0NPTlRBSU5PUihzdGFfcGxpc3QsIHN0cnVjdCB0eF9zZXJ2cSwgdHhfcGVuZGluZyk7CisJCQlwdHhzZXJ2cSA9IGNvbnRhaW5lcl9vZihzdGFfcGxpc3QsIHN0cnVjdCB0eF9zZXJ2cSwgdHhfcGVuZGluZyk7CiAKIAkJCXBmcmFtZV9xdWV1ZSA9ICZwdHhzZXJ2cS0+c3RhX3BlbmRpbmc7CiAKQEAgLTE1OTAsMTIgKzE1NTAsMTEgQEAKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAKLQkJCXN0YV9wbGlzdCA9IGdldF9uZXh0KHN0YV9wbGlzdCk7CisJCQlzdGFfcGxpc3QgPSBzdGFfcGxpc3QtPm5leHQ7CiAJCX0KIAl9CiBleGl0OgogCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHB4bWl0ZnJhbWU7CiB9CiAKQEAgLTE2MDMsNyArMTU2Miw2IEBACiB7CiAJc3RydWN0IHR4X3NlcnZxICpwdHhzZXJ2cTsKIAotX2Z1bmNfZW50ZXJfOwogCXN3aXRjaCAodXApIHsKIAljYXNlIDE6CiAJY2FzZSAyOgpAQCAtMTYzMiw3ICsxNTkwLDYgQEAKIAlicmVhazsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHB0eHNlcnZxOwogfQpAQCAtMTY1MSw3ICsxNjA4LDYgQEAKIAlzdHJ1Y3QgaHdfeG1pdAkqcGh3eG1pdHMgPSAgcGFkYXB0ZXItPnhtaXRwcml2Lmh3eG1pdHM7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocGF0dHJpYi0+cHN0YSkgewogCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKQEAgLTE2NzYsNyArMTYzMiw2IEBACiAJcGh3eG1pdHNbYWNfaW5kZXhdLmFjY250Kys7CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNzE5LDEwICsxNjc0LDggQEAKIHZvaWQgcnR3X2luaXRfaHd4bWl0cyhzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdCwgaW50IGVudHJ5KQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCBlbnRyeTsgaSsrLCBwaHd4bWl0KyspCiAJCXBod3htaXQtPmFjY250ID0gMDsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgaW50IHJ0d19icl9jbGllbnRfdHgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCkBAIC0xOTk3LDcgKzE5NTAsNyBAQAogCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgfD0gQklUKDApOy8qICAqLwogCQkJcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgfD0gQklUKDApOwogCi0JCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfVElNX0lFXywgTlVMTCwgZmFsc2UpOy8qIHR4IGJjL21jIHBhY2tldHMgYWZ0ZXIgdXBhdGUgYmNuICovCisJCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfVElNX0lFXywgTlVMTCwgZmFsc2UpOy8qIHR4IGJjL21jIHBhY2tldHMgYWZ0ZXIgdXBkYXRlIGJjbiAqLwogCiAJCQlyZXQgPSB0cnVlOwogCQl9CkBAIC0yMDQ3LDcgKzIwMDAsNyBAQAogCQkJCXBzdGFwcml2LT50aW1fYml0bWFwIHw9IEJJVChwc3RhLT5haWQpOwogCiAJCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPT0gMSkgewotCQkJCQkvKiB1cGF0ZSBCQ04gZm9yIFRJTSBJRSAqLworCQkJCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KIAkJCQkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX1RJTV9JRV8sIE5VTEwsIGZhbHNlKTsKIAkJCQl9CiAJCQl9CkBAIC0yMDcwLDEyICsyMDIzLDEyIEBACiAJc3RydWN0IGh3X3htaXQgKnBod3htaXRzID0gIHBhZGFwdGVyLT54bWl0cHJpdi5od3htaXRzOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZXF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJeG1pdGZyYW1lX2VucXVldWVfZm9yX3NsZWVwaW5nX3N0YShwYWRhcHRlciwgcHhtaXRmcmFtZSk7CiAKQEAgLTIxMzcsMTIgKzIwOTAsMTIgQEAKIAlzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7CiAKIAl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCZweG1pdGZyYW1lLT5saXN0KTsKIApAQCAtMjIxOCwxMiArMjE3MSwxMiBAQAogCQlzcGluX2xvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOwogCiAJCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGFfYm1jLT5zbGVlcF9xKTsKLQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSB7Ci0JCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCQlydHdfbGlzdF9kZWxldGUoJnB4bWl0ZnJhbWUtPmxpc3QpOwogCkBAIC0yMjY1LDEyICsyMjE4LDEyIEBACiAJc3Bpbl9sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwogCiAJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSk7Ci0JeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgewotCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCXN3aXRjaCAocHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5KSB7CiAJCWNhc2UgMToKQEAgLTIzMTYsNyArMjI2OSw3IEBACiAJCWlmICgocHN0YS0+c2xlZXBxX2FjX2xlbiA9PSAwKSAmJiAoIXBzdGEtPmhhc19sZWdhY3lfYWMpICYmICh3bW1wc19hYykpIHsKIAkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5CSVQocHN0YS0+YWlkKTsKIAotCQkJLyogdXBhdGUgQkNOIGZvciBUSU0gSUUgKi8KKwkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwogCQkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX1RJTV9JRV8sIE5VTEwsIGZhbHNlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbDgxODhFUmF0ZUFkYXB0aXZlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWw4MTg4RVJhdGVBZGFwdGl2ZS5jCmluZGV4IDNkZjMzYmMuLmRlYTIyMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbDgxODhFUmF0ZUFkYXB0aXZlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYwpAQCAtMzMxLDYgKzMzMSw3IEBACiAKIHN0YXRpYyBpbnQgb2RtX0FSRkJSZWZyZXNoXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sIHN0cnVjdCBvZG1fcmFfaW5mbyAqcFJhSW5mbykKIHsgIC8qICBXaWxzb24gMjAxMS8xMC8yNiAqLworCXN0cnVjdCBhZGFwdGVyICphZGFwdCA9IGRtX29kbS0+QWRhcHRlcjsKIAl1MzIgTWFza0Zyb21SZWc7CiAJczggaTsKIApAQCAtMzU3LDE5ICszNTgsMTkgQEAKIAkJcFJhSW5mby0+UkFVc2VSYXRlID0gKHBSYUluZm8tPlJhdGVNYXNrKSYweDAwMDAwMDBkOwogCQlicmVhazsKIAljYXNlIDEyOgotCQlNYXNrRnJvbVJlZyA9IE9ETV9SZWFkNEJ5dGUoZG1fb2RtLCBSRUdfQVJGUjApOworCQlNYXNrRnJvbVJlZyA9IHJ0d19yZWFkMzIoYWRhcHQsIFJFR19BUkZSMCk7CiAJCXBSYUluZm8tPlJBVXNlUmF0ZSA9IChwUmFJbmZvLT5SYXRlTWFzaykmTWFza0Zyb21SZWc7CiAJCWJyZWFrOwogCWNhc2UgMTM6Ci0JCU1hc2tGcm9tUmVnID0gT0RNX1JlYWQ0Qnl0ZShkbV9vZG0sIFJFR19BUkZSMSk7CisJCU1hc2tGcm9tUmVnID0gcnR3X3JlYWQzMihhZGFwdCwgUkVHX0FSRlIxKTsKIAkJcFJhSW5mby0+UkFVc2VSYXRlID0gKHBSYUluZm8tPlJhdGVNYXNrKSZNYXNrRnJvbVJlZzsKIAkJYnJlYWs7CiAJY2FzZSAxNDoKLQkJTWFza0Zyb21SZWcgPSBPRE1fUmVhZDRCeXRlKGRtX29kbSwgUkVHX0FSRlIyKTsKKwkJTWFza0Zyb21SZWcgPSBydHdfcmVhZDMyKGFkYXB0LCBSRUdfQVJGUjIpOwogCQlwUmFJbmZvLT5SQVVzZVJhdGUgPSAocFJhSW5mby0+UmF0ZU1hc2spJk1hc2tGcm9tUmVnOwogCQlicmVhazsKIAljYXNlIDE1OgotCQlNYXNrRnJvbVJlZyA9IE9ETV9SZWFkNEJ5dGUoZG1fb2RtLCBSRUdfQVJGUjMpOworCQlNYXNrRnJvbVJlZyA9IHJ0d19yZWFkMzIoYWRhcHQsIFJFR19BUkZSMyk7CiAJCXBSYUluZm8tPlJBVXNlUmF0ZSA9IChwUmFJbmZvLT5SYXRlTWFzaykmTWFza0Zyb21SZWc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC02NjcsNyArNjY4LDkgQEAKIAogdm9pZCBPRE1fUkFfU2V0X1R4UlBUX1RpbWUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSwgdTE2IG1pblJwdFRpbWUpCiB7Ci0JT0RNX1dyaXRlMkJ5dGUoZG1fb2RtLCBSRUdfVFhfUlBUX1RJTUUsIG1pblJwdFRpbWUpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdCA9IGRtX29kbS0+QWRhcHRlcjsKKworCXJ0d193cml0ZTE2KGFkYXB0LCBSRUdfVFhfUlBUX1RJTUUsIG1pblJwdFRpbWUpOwogfQogCiB2b2lkIE9ETV9SQV9UeFJQVDJIYW5kbGVfODE4OEUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSwgdTggKlR4UlBUX0J1ZiwgdTE2IFR4UlBUX0xlbiwgdTMyIG1hY2lkX2VudHJ5MCwgdTMyIG1hY2lkX2VudHJ5MSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbFBoeVJmXzgxODhlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWxQaHlSZl84MTg4ZS5jCmluZGV4IDE1ZThlM2YuLjA1NjA1MmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWxQaHlSZl84MTg4ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbFBoeVJmXzgxODhlLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBDQ0tfVEFCTEVfU0laRTsgaSsrKSB7CiAJCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYkNDS2luQ0gxNCkgewotCQkJCWlmIChPRE1fQ29tcGFyZU1lbW9yeShkbV9vZG0sICh2b2lkICopJlRlbXBDQ2ssICh2b2lkICopJkNDS1N3aW5nVGFibGVfQ2gxNFtpXVsyXSwgNCkgPT0gMCkgeworCQkJCWlmIChtZW1jbXAoJlRlbXBDQ2ssICZDQ0tTd2luZ1RhYmxlX0NoMTRbaV1bMl0sIDQpKSB7CiAJCQkJCUNDS19pbmRleF9vbGQgPSAodTgpaTsKIAkJCQkJZG1fb2RtLT5CYlN3aW5nSWR4Q2NrQmFzZSA9ICh1OClpOwogCQkJCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9DQUxJQlJBVElPTiwgT0RNX0RCR19MT1VELApAQCAtMjI5LDcgKzIyOSw3IEBACiAJCQkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfQ0FMSUJSQVRJT04sIE9ETV9EQkdfTE9VRCwKIAkJCQkJICAgICAoIlJlZ0EyNDogMHglWCwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1slZF1bMl06IENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl06IDB4JVhcbiIsCiAJCQkJCSAgICAgVGVtcENDaywgaSwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSkpOwotCQkJCWlmIChPRE1fQ29tcGFyZU1lbW9yeShkbV9vZG0sICh2b2lkICopJlRlbXBDQ2ssICh2b2lkICopJkNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0sIDQpID09IDApIHsKKwkJCQlpZiAobWVtY21wKCZUZW1wQ0NrLCAmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSwgNCkpIHsKIAkJCQkJQ0NLX2luZGV4X29sZCA9ICh1OClpOwogCQkJCQlkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlID0gKHU4KWk7CiAJCQkJCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX0NBTElCUkFUSU9OLCBPRE1fREJHX0xPVUQsCkBAIC04MzksOSArODM5LDkgQEAKIAlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwogCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX0NBTElCUkFUSU9OLCBPRE1fREJHX0xPVUQsICgiU2F2ZSBNQUMgcGFyYW1ldGVycy5cbiIpKTsKIAlmb3IgKGkgPSAwOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspIHsKLQkJTUFDQmFja3VwW2ldID0gT0RNX1JlYWQxQnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSk7CisJCU1BQ0JhY2t1cFtpXSA9IHJ0d19yZWFkOChhZGFwdCwgTUFDUmVnW2ldKTsKIAl9Ci0JTUFDQmFja3VwW2ldID0gT0RNX1JlYWQ0Qnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSk7CisJTUFDQmFja3VwW2ldID0gcnR3X3JlYWQzMihhZGFwdCwgTUFDUmVnW2ldKTsKIH0KIAogc3RhdGljIHZvaWQgcmVsb2FkX2FkZGFfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyICpBRERBUmVnLCB1MzIgKkFEREFCYWNrdXAsIHUzMiBSZWdpZXN0ZXJOdW0pCkBAIC04NjgsOSArODY4LDkgQEAKIAogCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX0NBTElCUkFUSU9OLCBPRE1fREJHX0xPVUQsICAoIlJlbG9hZCBNQUMgcGFyYW1ldGVycyAhXG4iKSk7CiAJZm9yIChpID0gMDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKSB7Ci0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgTUFDUmVnW2ldLCAodTgpTUFDQmFja3VwW2ldKTsKKwkJcnR3X3dyaXRlOChhZGFwdCwgTUFDUmVnW2ldLCAodTgpTUFDQmFja3VwW2ldKTsKIAl9Ci0JT0RNX1dyaXRlNEJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0sIE1BQ0JhY2t1cFtpXSk7CisJcnR3X3dyaXRlMzIoYWRhcHQsIE1BQ1JlZ1tpXSwgTUFDQmFja3VwW2ldKTsKIH0KIAogdm9pZApAQCAtOTEyLDEyICs5MTIsMTIgQEAKIAogCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX0NBTElCUkFUSU9OLCBPRE1fREJHX0xPVUQsICgiTUFDIHNldHRpbmdzIGZvciBDYWxpYnJhdGlvbi5cbiIpKTsKIAotCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgTUFDUmVnW2ldLCAweDNGKTsKKwlydHdfd3JpdGU4KGFkYXB0LCBNQUNSZWdbaV0sIDB4M0YpOwogCiAJZm9yIChpID0gMTsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKSB7Ci0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgTUFDUmVnW2ldLCAodTgpKE1BQ0JhY2t1cFtpXSYofkJJVDMpKSk7CisJCXJ0d193cml0ZTgoYWRhcHQsIE1BQ1JlZ1tpXSwgKHU4KShNQUNCYWNrdXBbaV0mKH5CSVQzKSkpOwogCX0KLQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSwgKHU4KShNQUNCYWNrdXBbaV0mKH5CSVQ1KSkpOworCXJ0d193cml0ZTgoYWRhcHQsIE1BQ1JlZ1tpXSwgKHU4KShNQUNCYWNrdXBbaV0mKH5CSVQ1KSkpOwogfQogCiB2b2lkCkBAIC0xMjIzLDE2ICsxMjIzLDE0IEBACiB7CiAJdTggdG1wcmVnOwogCXUzMiBSRl9BbW9kZSA9IDAsIFJGX0Jtb2RlID0gMCwgTENfQ2FsOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7CiAKIAkvKiBDaGVjayBjb250aW51b3VzIFRYIGFuZCBQYWNrZXQgVFggKi8KLQl0bXByZWcgPSBPRE1fUmVhZDFCeXRlKGRtX29kbSwgMHhkMDMpOworCXRtcHJlZyA9IHJ0d19yZWFkOChhZGFwdCwgMHhkMDMpOwogCiAJaWYgKCh0bXByZWcmMHg3MCkgIT0gMCkJCQkvKiBEZWFsIHdpdGggY29udGlzdW91cyBUWCBjYXNlICovCi0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgMHhkMDMsIHRtcHJlZyYweDhGKTsJLyogZGlzYWJsZSBhbGwgY29udGludW91cyBUWCAqLworCQlydHdfd3JpdGU4KGFkYXB0LCAweGQwMywgdG1wcmVnJjB4OEYpOwkvKiBkaXNhYmxlIGFsbCBjb250aW51b3VzIFRYICovCiAJZWxzZQkJCQkJCQkvKiAgRGVhbCB3aXRoIFBhY2tldCBUWCBjYXNlICovCi0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgUkVHX1RYUEFVU0UsIDB4RkYpOwkJCS8qICBibG9jayBhbGwgcXVldWVzICovCisJCXJ0d193cml0ZTgoYWRhcHQsIFJFR19UWFBBVVNFLCAweEZGKTsJCQkvKiAgYmxvY2sgYWxsIHF1ZXVlcyAqLwogCiAJaWYgKCh0bXByZWcmMHg3MCkgIT0gMCkgewogCQkvKiAxLiBSZWFkIG9yaWdpbmFsIFJGIG1vZGUgKi8KQEAgLTEyNjQsNyArMTI2Miw3IEBACiAJaWYgKCh0bXByZWcmMHg3MCkgIT0gMCkgewogCQkvKiBEZWFsIHdpdGggY29udGludW91cyBUWCBjYXNlICovCiAJCS8qIFBhdGgtQSAqLwotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIDB4ZDAzLCB0bXByZWcpOworCQlydHdfd3JpdGU4KGFkYXB0LCAweGQwMywgdG1wcmVnKTsKIAkJUEhZX1NldFJGUmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0FDLCBiTWFzazEyQml0cywgUkZfQW1vZGUpOwogCiAJCS8qIFBhdGgtQiAqLwpAQCAtMTI3Miw3ICsxMjcwLDcgQEAKIAkJCVBIWV9TZXRSRlJlZyhhZGFwdCwgUkZfUEFUSF9CLCBSRl9BQywgYk1hc2sxMkJpdHMsIFJGX0Jtb2RlKTsKIAl9IGVsc2UgewogCQkvKiAgRGVhbCB3aXRoIFBhY2tldCBUWCBjYXNlICovCi0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgUkVHX1RYUEFVU0UsIDB4MDApOworCQlydHdfd3JpdGU4KGFkYXB0LCBSRUdfVFhQQVVTRSwgMHgwMCk7CiAJfQogfQogCkBAIC0xNDY4LDEzICsxNDY2LDEwIEBACiAKIHN0YXRpYyB2b2lkIHBoeV9zZXRyZnBhdGhzd2l0Y2hfODE4OGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBib29sIG1haW4sIGJvb2wgaXMydCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCiAJaWYgKCFhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQpIHsKIAkJdTggdTFidG1wOwotCQl1MWJ0bXAgPSBPRE1fUmVhZDFCeXRlKGRtX29kbSwgUkVHX0xFRENGRzIpIHwgQklUNzsKLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBSRUdfTEVEQ0ZHMiwgdTFidG1wKTsKKwkJdTFidG1wID0gcnR3X3JlYWQ4KGFkYXB0LCBSRUdfTEVEQ0ZHMikgfCBCSVQ3OworCQlydHdfd3JpdGU4KGFkYXB0LCBSRUdfTEVEQ0ZHMiwgdTFidG1wKTsKIAkJUEhZX1NldEJCUmVnKGFkYXB0LCByRlBHQTBfWEFCX1JGUGFyYW1ldGVyLCBCSVQxMywgMHgwMSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYwppbmRleCA1OTgxNDA0Li5kNzVjYTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMKQEAgLTExNiw4ICsxMTYsNiBAQAogewogCXVpbnQJc3RhdHVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKLQogCXN0YXR1cyA9IGFkYXB0LT5IYWxGdW5jLmhhbF9kZWluaXQoYWRhcHQpOwogCiAJaWYgKHN0YXR1cyA9PSBfU1VDQ0VTUykKQEAgLTEyNSw4ICsxMjMsNiBAQAogCWVsc2UKIAkJREJHXzg4RSgiXG4gcnR3X2hhbF9kZWluaXQ6IGhhbF9pbml0IGZhaWxcbiIpOwogCi1fZnVuY19leGl0XzsKLQogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMKaW5kZXggMzU1NWZmYS4uODlhMjZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMKQEAgLTg4Nyw5ICs4ODcsMTAgQEAKIHZvaWQgT0RNX1dyaXRlX0NDS19DQ0FfVGhyZXMoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHU4IEN1ckNDS19DQ0FUaHJlcykKIHsKIAlzdHJ1Y3QgcnR3X2RpZyAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOworCXN0cnVjdCBhZGFwdGVyICphZGFwdCA9IHBETV9PZG0tPkFkYXB0ZXI7CiAKIAlpZiAocERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgIT0gQ3VyQ0NLX0NDQVRocmVzKQkJLyogbW9kaWZ5IGJ5IEd1by5NaW5nemhpIDIwMTItMDEtMDMgKi8KLQkJT0RNX1dyaXRlMUJ5dGUocERNX09kbSwgT0RNX1JFRyhDQ0tfQ0NBLCBwRE1fT2RtKSwgQ3VyQ0NLX0NDQVRocmVzKTsKKwkJcnR3X3dyaXRlOChhZGFwdCwgT0RNX1JFRyhDQ0tfQ0NBLCBwRE1fT2RtKSwgQ3VyQ0NLX0NDQVRocmVzKTsKIAlwRE1fRGlnVGFibGUtPlByZUNDS19DQ0FUaHJlcyA9IHBETV9EaWdUYWJsZS0+Q3VyQ0NLX0NDQVRocmVzOwogCXBETV9EaWdUYWJsZS0+Q3VyQ0NLX0NDQVRocmVzID0gQ3VyQ0NLX0NDQVRocmVzOwogfQpAQCAtMTMwMSw4ICsxMzAyLDggQEAKIAkJcHN0YSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKIAkJaWYgKElTX1NUQV9WQUxJRChwc3RhKSAmJgogCQkgICAgKHBzdGEtPnN0YXRlICYgV0lGSV9BU09DX1NUQVRFKSAmJgotCQkgICAgIV9ydHdfbWVtY21wKHBzdGEtPmh3YWRkciwgYmNhc3RfYWRkciwgRVRIX0FMRU4pICYmCi0JCSAgICAhX3J0d19tZW1jbXAocHN0YS0+aHdhZGRyLCBteWlkKCZBZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CisJCSAgICBtZW1jbXAocHN0YS0+aHdhZGRyLCBiY2FzdF9hZGRyLCBFVEhfQUxFTikgJiYKKwkJICAgIG1lbWNtcChwc3RhLT5od2FkZHIsIG15aWQoJkFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKIAkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCB0bXBFbnRyeU1pblBXREIpCiAJCQkJdG1wRW50cnlNaW5QV0RCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwogCkBAIC0xNDMzLDEwICsxNDM0LDEwIEBACiAJcERNX09kbS0+RE1fRURDQV9UYWJsZS5iSXNDdXJSRExTdGF0ZSA9IGZhbHNlOwogCUFkYXB0ZXItPnJlY3Zwcml2LmJJc0FueU5vbkJFUGt0cyA9IGZhbHNlOwogCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBWTyBQQVJBTTogMHgleFxuIiwgT0RNX1JlYWQ0Qnl0ZShwRE1fT2RtLCBPRE1fRURDQV9WT19QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIFZJIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX1ZJX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgQkUgUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfQkVfUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBCSyBQQVJBTTogMHgleFxuIiwgT0RNX1JlYWQ0Qnl0ZShwRE1fT2RtLCBPRE1fRURDQV9CS19QQVJBTSkpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIFZPIFBBUkFNOiAweCV4XG4iLCBydHdfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX1ZPX1BBUkFNKSkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgVkkgUEFSQU06IDB4JXhcbiIsIHJ0d19yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfVklfUEFSQU0pKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBCRSBQQVJBTTogMHgleFxuIiwgcnR3X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9CRV9QQVJBTSkpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIEJLIFBBUkFNOiAweCV4XG4iLCBydHdfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JLX1BBUkFNKSkpOwogfQkvKiAgT0RNX0luaXRFZGNhVHVyYm8gKi8KIAogdm9pZCBvZG1fRWRjYVR1cmJvQ2hlY2soc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fUmVnQ29uZmlnODE4OEUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9SZWdDb25maWc4MTg4RS5jCmluZGV4IDYxOTNkOWYuLmE5ODg2MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9SZWdDb25maWc4MTg4RS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9SZWdDb25maWc4MTg4RS5jCkBAIC02Niw3ICs2Niw5IEBACiAKIHZvaWQgb2RtX0NvbmZpZ01BQ184MTg4RShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIEFkZHIsIHU4IERhdGEpCiB7Ci0JT0RNX1dyaXRlMUJ5dGUocERNX09kbSwgQWRkciwgRGF0YSk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ID0gcERNX09kbS0+QWRhcHRlcjsKKworCXJ0d193cml0ZTgoYWRhcHQsIEFkZHIsIERhdGEpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9JTklULCBPRE1fREJHX1RSQUNFLCAoIj09PT4gT0RNX0NvbmZpZ01BQ1dpdGhIZWFkZXJGaWxlOiBbTUFDX1JFR10gJTA4WCAlMDhYXG4iLCBBZGRyLCBEYXRhKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkNjgyMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1faW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotLyogIE9ETSBJTyBSZWxhdGl2ZSBBUEkuICovCi0KLXU4IE9ETV9SZWFkMUJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlyZXR1cm4gcnR3X3JlYWQ4KEFkYXB0ZXIsIFJlZ0FkZHIpOwotfQotCi11MTYgT0RNX1JlYWQyQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXJldHVybiBydHdfcmVhZDE2KEFkYXB0ZXIsIFJlZ0FkZHIpOwotfQotCi11MzIgT0RNX1JlYWQ0Qnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXJldHVybiBydHdfcmVhZDMyKEFkYXB0ZXIsIFJlZ0FkZHIpOwotfQotCi12b2lkIE9ETV9Xcml0ZTFCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTggRGF0YSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JcnR3X3dyaXRlOChBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotdm9pZCBPRE1fV3JpdGUyQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUxNiBEYXRhKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlydHdfd3JpdGUxNihBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotdm9pZCBPRE1fV3JpdGU0Qnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUzMiBEYXRhKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlydHdfd3JpdGUzMihBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotLyogIE9ETSBNZW1vcnkgcmVsYXRpdmUgQVBJLiAqLwotdm9pZCBPRE1fQWxsb2NhdGVNZW1vcnkoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHZvaWQgKipwUHRyLCB1MzIgbGVuZ3RoKQotewotCSpwUHRyID0gcnR3X3p2bWFsbG9jKGxlbmd0aCk7Ci19Ci0KLS8qICBsZW5ndGggY291bGQgYmUgaWdub3JlZCwgdXNlZCB0byBkZXRlY3QgbWVtb3J5IGxlYWthZ2UuICovCi12b2lkIE9ETV9GcmVlTWVtb3J5KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB2b2lkICpwUHRyLCB1MzIgbGVuZ3RoKQotewotCXJ0d192bWZyZWUocFB0ciwgbGVuZ3RoKTsKLX0KLQotczMyIE9ETV9Db21wYXJlTWVtb3J5KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB2b2lkICpwQnVmMSwgdm9pZCAqcEJ1ZjIsIHUzMiBsZW5ndGgpCi17Ci0JcmV0dXJuIF9ydHdfbWVtY21wKHBCdWYxLCBwQnVmMiwgbGVuZ3RoKTsKLX0KLQotdm9pZCBPRE1fU2V0VGltZXIoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHN0cnVjdCB0aW1lcl9saXN0ICpwVGltZXIsIHUzMiBtc0RlbGF5KQotewotCV9zZXRfdGltZXIocFRpbWVyLCBtc0RlbGF5KTsgLyogbXMgKi8KLX0KLQotdm9pZCBPRE1fSW5pdGlhbGl6ZVRpbWVyKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCBzdHJ1Y3QgdGltZXJfbGlzdCAqcFRpbWVyLAotCQkJIHZvaWQgKkNhbGxCYWNrRnVuYywgdm9pZCAqcENvbnRleHQsCi0JCQkgY29uc3QgY2hhciAqc3pJRCkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JX2luaXRfdGltZXIocFRpbWVyLCBBZGFwdGVyLT5wbmV0ZGV2LCBDYWxsQmFja0Z1bmMsIHBETV9PZG0pOwotfQotCi12b2lkIE9ETV9DYW5jZWxUaW1lcihzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgc3RydWN0IHRpbWVyX2xpc3QgKnBUaW1lcikKLXsKLQlfY2FuY2VsX3RpbWVyX2V4KHBUaW1lcik7Ci19Ci0KLS8qICBPRE0gRlcgcmVsYXRpdmUgQVBJLiAqLwotdTMyIE9ETV9GaWxsSDJDQ21kKHU4ICpwSDJDQnVmZmVyLCB1MzIgSDJDQnVmZmVyTGVuLCB1MzIgQ21kTnVtLAotCQkgICAgICB1MzIgKnBFbGVtZW50SUQsIHUzMiAqcENtZExlbiwKLQkJICAgICAgdTggKipwQ21iQnVmZmVyLCB1OCAqQ21kU3RhcnRTZXEpCi17Ci0JcmV0dXJuCXRydWU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCmluZGV4IGNhMGE3MDguLjAyMWU1ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCkBAIC03Miw3ICs3Miw2IEBACiAJdTMyIGgyY19jbWRfZXggPSAwOwogCXMzMiByZXQgPSBfRkFJTDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCFhZGFwdC0+YkZXUmVhZHkpIHsKIAkJREJHXzg4RSgiRmlsbEgyQ0NtZF84OEUoKTogcmV0dXJuIEgyQyBjbWQgYmVjYXVzZSBmdyBpcyBub3QgcmVhZHlcbiIpOwpAQCAtMTI1LDcgKzEyNCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNCw3ICsxMzIsNiBAQAogewogCXU4IHJlcyA9IF9TVUNDRVNTOwogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAoaGFsZGF0YS0+ZndfcmFjdHJsKSB7CiAJCTsKQEAgLTE0Myw3ICsxNDAsNiBAQAogCQlyZXMgPSBfRkFJTDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE1NCw3ICsxNTAsNiBAQAogCXU4IHJlcyA9IF9TVUNDRVNTOwogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAoaGFsZGF0YS0+ZndfcmFjdHJsKSB7CiAJCV9fbGUzMiBsbWFzazsKIApAQCAtMTY4LDcgKzE2Myw2IEBACiAJCXJlcyA9IF9GQUlMOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjE1LDcgKzIwOSw2IEBACiAJc3RydWN0IHNldHB3cm1vZGVfcGFybSBIMkNTZXRQd3JNb2RlOwogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmYWRhcHQtPnB3cmN0cmxwcml2OwogCXU4IFJMQk0gPSAwOyAvKiAgMDpNaW4sIDE6TWF4LCAyOlVzZXIgZGVmaW5lICovCi1fZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCIlczogTW9kZT0lZCBTbWFydFBTPSVkIFVBUFNEPSVkXG4iLCBfX2Z1bmNfXywKIAkJTW9kZSwgcHdycHJpdi0+c21hcnRfcHMsIGFkYXB0LT5yZWdpc3RyeXByaXYudWFwc2RfZW5hYmxlKTsKQEAgLTI1Niw3ICsyNDksNiBAQAogCiAJRmlsbEgyQ0NtZF84OEUoYWRhcHQsIEgyQ19QU19QV1JfTU9ERSwgc2l6ZW9mKEgyQ1NldFB3ck1vZGUpLCAodTggKikmSDJDU2V0UHdyTW9kZSk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0bDgxODhlX3NldF9Gd01lZGlhU3RhdHVzX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIF9fbGUxNiBtc3RhdHVzX3JwdCkKQEAgLTYxNyw3ICs2MDksNiBAQAogCXU4IERMQmNuQ291bnQgPSAwOwogCXUzMiBwb2xsID0gMDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiJXMgbXN0YXR1cygleClcbiIsIF9fZnVuY19fLCBtc3RhdHVzKTsKIApAQCAtNzAxLDcgKzY5Miw2IEBACiAJCWhhbGRhdGEtPlJlZ0NSXzEgJj0gKH5CSVQwKTsKIAkJcnR3X3dyaXRlOChhZGFwdCwgIFJFR19DUisxLCBoYWxkYXRhLT5SZWdDUl8xKTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydGw4MTg4ZV9zZXRfcDJwX3BzX29mZmxvYWRfY21kKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggcDJwX3BzX3N0YXRlKQpAQCAtNzEyLDcgKzcwMiw2IEBACiAJc3RydWN0IFAyUF9QU19PZmZsb2FkX3QJKnAycF9wc19vZmZsb2FkID0gJmhhbGRhdGEtPnAycF9wc19vZmZsb2FkOwogCXU4IGk7CiAKLV9mdW5jX2VudGVyXzsKIAogCXN3aXRjaCAocDJwX3BzX3N0YXRlKSB7CiAJY2FzZSBQMlBfUFNfRElTQUJMRToKQEAgLTc3NSw1ICs3NjQsNCBAQAogCUZpbGxIMkNDbWRfODhFKGFkYXB0LCBIMkNfUFNfUDJQX09GRkxPQUQsIDEsICh1OCAqKXAycF9wc19vZmZsb2FkKTsKICNlbmRpZgogCi1fZnVuY19leGl0XzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jCmluZGV4IDRjOTM0ZTIuLmNmODhiZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYwpAQCAtMTYwLDcgKzE2MCw2IEBACiAJdTggaHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCi0JX2Z1bmNfZW50ZXJfOwogCWh3X2luaXRfY29tcGxldGVkID0gQWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQ7CiAKIAlpZiAoIWh3X2luaXRfY29tcGxldGVkKQpAQCAtMTc4LDcgKzE3Nyw2IEBACiAJCS8qICBDYWxjdWxhdGUgVHgvUnggc3RhdGlzdGljcy4gKi8KIAkJZG1fQ2hlY2tTdGF0aXN0aWNzKEFkYXB0ZXIpOwogCi0JX2Z1bmNfZXhpdF87CiAJfQogCiAJLyogT0RNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwppbmRleCA1OTIxZGI4Li5mOWQ1NTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgX0hBTF9JTklUX0NfCiAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KICNpbmNsdWRlIDxydHdfZWZ1c2UuaD4KIApAQCAtMzY1LDcgKzM2Niw3IEBACiAJdTMyIGZpZm9fZGF0YSwgcmVnXzE0MDsKIAl1MzIgYWRkciwgcnN0YXR1cywgbG9vcCA9IDA7CiAJdTE2IGRhdGFfY250cyA9IChkYXRhX2xlbi84KSsxOwotCXU4ICpwYnVmID0gcnR3X3p2bWFsbG9jKGRhdGFfbGVuKzEwKTsKKwl1OCAqcGJ1ZiA9IHZ6YWxsb2MoZGF0YV9sZW4rMTApOwogCURCR184OEUoIiMjIyMjIyAlcyAjIyMjIyNcbiIsIF9fZnVuY19fKTsKIAogCXJ0d193cml0ZTgoQWRhcHRlciwgUkVHX1BLVF9CVUZGX0FDQ0VTU19DVFJMLCBUWFBLVF9CVUZfU0VMRUNUKTsKQEAgLTM4Nyw3ICszODgsNyBAQAogCQkJfSB3aGlsZSAoIXJzdGF0dXMgJiYgKGxvb3ArKyA8IDEwKSk7CiAJCX0KIAkJcnR3X0lPTF9jbWRfYnVmX2R1bXAoQWRhcHRlciwgZGF0YV9sZW4sIHBidWYpOwotCQlydHdfdm1mcmVlKHBidWYsIGRhdGFfbGVuKzEwKTsKKwkJdmZyZWUocGJ1Zik7CiAJfQogCURCR184OEUoIiMjIyMjIyAlcyAjIyMjIyNcbiIsIF9fZnVuY19fKTsKIH0KQEAgLTU4Myw2ICs1ODQsNDUgQEAKIAogI2RlZmluZSBJU19GV184MXh4QyhwYWRhcHRlcikJKCgoR0VUX0hBTF9EQVRBKHBhZGFwdGVyKSktPkZpcm13YXJlU2lnbmF0dXJlICYgMHhGRkYwKSA9PSAweDg4QzApCiAKK3N0YXRpYyBpbnQgbG9hZF9maXJtd2FyZShzdHJ1Y3QgcnRfZmlybXdhcmUgKnBGaXJtd2FyZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWludCBydHN0YXR1cyA9IF9TVUNDRVNTOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3QgY2hhciBmd19uYW1lW10gPSAicnRsd2lmaS9ydGw4MTg4ZXVmdy5iaW4iOworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCBkZXZpY2UpKSB7CisJCXJ0c3RhdHVzID0gX0ZBSUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCFmdykgeworCQlwcl9lcnIoIkZpcm13YXJlICVzIG5vdCBhdmFpbGFibGVcbiIsIGZ3X25hbWUpOworCQlydHN0YXR1cyA9IF9GQUlMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmIChmdy0+c2l6ZSA+IEZXXzgxODhFX1NJWkUpIHsKKwkJcnRzdGF0dXMgPSBfRkFJTDsKKwkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAorCQkJICgiRmlybXdhcmUgc2l6ZSBleGNlZWQgMHglWC4gQ2hlY2sgaXQuXG4iLAorCQkJIEZXXzgxODhFX1NJWkUpKTsKKwkJZ290byBleGl0OworCX0KKworCXBGaXJtd2FyZS0+c3pGd0J1ZmZlciA9IGt6YWxsb2MoRldfODE4OEVfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwRmlybXdhcmUtPnN6RndCdWZmZXIpIHsKKwkJcnRzdGF0dXMgPSBfRkFJTDsKKwkJZ290byBleGl0OworCX0KKwltZW1jcHkocEZpcm13YXJlLT5zekZ3QnVmZmVyLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCXBGaXJtd2FyZS0+dWxGd0xlbmd0aCA9IGZ3LT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJREJHXzg4RV9MRVZFTChfZHJ2X2luZm9fLAorCQkgICAgICAiKyVzOiAhYlVzZWRXb1dMQU5GdywgRm1ybXdhcmVMZW46JWQrXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgcEZpcm13YXJlLT51bEZ3TGVuZ3RoKTsKK2V4aXQ6CisJcmV0dXJuIHJ0c3RhdHVzOworfQorCiBzMzIgcnRsODE4OGVfRmlybXdhcmVEb3dubG9hZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJczMyCXJ0U3RhdHVzID0gX1NVQ0NFU1M7CkBAIC01OTEsNTEgKzYzMSwyMyBAQAogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwogCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwogCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9IGR2b2JqX3RvX2Rldihkdm9iaik7Ci0Jc3RydWN0IHJ0X2Zpcm13YXJlICpwRmlybXdhcmUgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJc3RydWN0IHJ0X2Zpcm13YXJlX2hkciAqcEZ3SGRyID0gTlVMTDsKIAl1OCAqcEZpcm13YXJlQnVmOwogCXUzMiBGaXJtd2FyZUxlbjsKLQljaGFyIGZ3X25hbWVbXSA9ICJydGx3aWZpL3J0bDgxODhldWZ3LmJpbiI7CiAJc3RhdGljIGludCBsb2dfdmVyc2lvbjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiKyVzXG4iLCBfX2Z1bmNfXykpOwotCXBGaXJtd2FyZSA9IChzdHJ1Y3QgcnRfZmlybXdhcmUgKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X2Zpcm13YXJlKSk7Ci0JaWYgKCFwRmlybXdhcmUpIHsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKKwlpZiAoIWR2b2JqLT5maXJtd2FyZS5zekZ3QnVmZmVyKQorCQlydFN0YXR1cyA9IGxvYWRfZmlybXdhcmUoJmR2b2JqLT5maXJtd2FyZSwgZGV2aWNlKTsKKwlpZiAocnRTdGF0dXMgPT0gX0ZBSUwpIHsKKwkJZHZvYmotPmZpcm13YXJlLnN6RndCdWZmZXIgPSBOVUxMOwogCQlnb3RvIEV4aXQ7CiAJfQotCi0JaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCBkZXZpY2UpKSB7Ci0JCXJ0U3RhdHVzID0gX0ZBSUw7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0JaWYgKCFmdykgewotCQlwcl9lcnIoIkZpcm13YXJlICVzIG5vdCBhdmFpbGFibGVcbiIsIGZ3X25hbWUpOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCWlmIChmdy0+c2l6ZSA+IEZXXzgxODhFX1NJWkUpIHsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLCAoIkZpcm13YXJlIHNpemUgZXhjZWVkIDB4JVguIENoZWNrIGl0LlxuIiwgRldfODE4OEVfU0laRSkpOwotCQlnb3RvIEV4aXQ7Ci0JfQotCi0JcEZpcm13YXJlLT5zekZ3QnVmZmVyID0ga3phbGxvYyhGV184MTg4RV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBGaXJtd2FyZS0+c3pGd0J1ZmZlcikgewotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCW1lbWNweShwRmlybXdhcmUtPnN6RndCdWZmZXIsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7Ci0JcEZpcm13YXJlLT51bEZ3TGVuZ3RoID0gZnctPnNpemU7Ci0JcEZpcm13YXJlQnVmID0gcEZpcm13YXJlLT5zekZ3QnVmZmVyOwotCUZpcm13YXJlTGVuID0gcEZpcm13YXJlLT51bEZ3TGVuZ3RoOwotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCi0JREJHXzg4RV9MRVZFTChfZHJ2X2luZm9fLCAiKyVzOiAhYlVzZWRXb1dMQU5GdywgRm1ybXdhcmVMZW46JWQrXG4iLCBfX2Z1bmNfXywgRmlybXdhcmVMZW4pOworCXBGaXJtd2FyZUJ1ZiA9IGR2b2JqLT5maXJtd2FyZS5zekZ3QnVmZmVyOworCUZpcm13YXJlTGVuID0gZHZvYmotPmZpcm13YXJlLnVsRndMZW5ndGg7CiAKIAkvKiAgVG8gQ2hlY2sgRncgaGVhZGVyLiBBZGRlZCBieSB0eW5saS4gMjAwOS4xMi4wNC4gKi8KLQlwRndIZHIgPSAoc3RydWN0IHJ0X2Zpcm13YXJlX2hkciAqKXBGaXJtd2FyZS0+c3pGd0J1ZmZlcjsKKwlwRndIZHIgPSAoc3RydWN0IHJ0X2Zpcm13YXJlX2hkciAqKWR2b2JqLT5maXJtd2FyZS5zekZ3QnVmZmVyOwogCiAJcEhhbERhdGEtPkZpcm13YXJlVmVyc2lvbiA9ICBsZTE2X3RvX2NwdShwRndIZHItPlZlcnNpb24pOwogCXBIYWxEYXRhLT5GaXJtd2FyZVN1YlZlcnNpb24gPSBwRndIZHItPlN1YnZlcnNpb247CkBAIC02ODcsMTAgKzY5OSw3IEBACiAJCWdvdG8gRXhpdDsKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCJGaXJtd2FyZSBpcyByZWFkeSB0byBydW4hXG4iKSk7Ci0Ja2ZyZWUocEZpcm13YXJlLT5zekZ3QnVmZmVyKTsKIEV4aXQ6Ci0KLQlrZnJlZShwRmlybXdhcmUpOwogCXJldHVybiBydFN0YXR1czsKIH0KIApAQCAtNzA3LDEwICs3MTYsOCBAQAogCiBzdGF0aWMgdm9pZCBydGw4MTg4ZV9mcmVlX2hhbF9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKLV9mdW5jX2VudGVyXzsKIAlrZnJlZShwYWRhcHRlci0+SGFsRGF0YSk7CiAJcGFkYXB0ZXItPkhhbERhdGEgPSBOVUxMOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX21wLmMKaW5kZXggM2QwZTZjOS4uYTRkMDU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9tcC5jCkBAIC0xMTUsMTQgKzExNSwxMiBAQAogCiAKIAkJLyogV3JpdGUgMHhhMjQgfiAweGEyNyAqLwotCQlUZW1wVmFsMiA9IDA7CiAJCVRlbXBWYWwyID0gQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tTd2luZ0luZGV4XVsyXSArCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLU3dpbmdJbmRleF1bM108PDgpICsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tTd2luZ0luZGV4XVs0XTw8MTYpKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS1N3aW5nSW5kZXhdWzVdPDwyNCk7CiAKIAkJLyogV3JpdGUgMHhhMjggIDB4YTI5ICovCi0JCVRlbXBWYWwzID0gMDsKIAkJVGVtcFZhbDMgPSBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS1N3aW5nSW5kZXhdWzZdICsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tTd2luZ0luZGV4XVs3XTw8OCk7CiAJfSBlbHNlIHsKQEAgLTEzOSwxNCArMTM3LDEyIEBACiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVsxXTw8OCk7CiAKIAkJLyogV3JpdGUgMHhhMjQgfiAweGEyNyAqLwotCQlUZW1wVmFsMiA9IDA7CiAJCVRlbXBWYWwyID0gQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzJdICsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzNdPDw4KSArCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVs0XTw8MTYpKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bNV08PDI0KTsKIAogCQkvKiBXcml0ZSAweGEyOCAgMHhhMjkgKi8KLQkJVGVtcFZhbDMgPSAwOwogCQlUZW1wVmFsMyA9IENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVs2XSArCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVs3XTw8OCk7CiAJfQpAQCAtMTg0LDEyICsxODAsMTIgQEAKIAkJVGVtcENDayA9IHJlYWRfYmJyZWcocEFkYXB0ZXIsIHJDQ0swX1R4RmlsdGVyMiwgYk1hc2tEV29yZCkgJiBiTWFza0NDSzsKIAkJZm9yIChpID0gMDsgaSA8IENDS19UQUJMRV9TSVpFOyBpKyspIHsKIAkJCWlmIChwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uYkNDS2luQ0gxNCkgewotCQkJCWlmIChfcnR3X21lbWNtcCgodm9pZCAqKSZUZW1wQ0NrLCAodm9pZCAqKSZDQ0tTd2luZ1RhYmxlX0NoMTRbaV1bMl0sIDQpKSB7CisJCQkJaWYgKCFtZW1jbXAoKHZvaWQgKikmVGVtcENDaywgKHZvaWQgKikmQ0NLU3dpbmdUYWJsZV9DaDE0W2ldWzJdLCA0KSkgewogCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKF9ydHdfbWVtY21wKCh2b2lkICopJlRlbXBDQ2ssICh2b2lkICopJkNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0sIDQpKSB7CisJCQkJaWYgKCFtZW1jbXAoKHZvaWQgKikmVGVtcENDaywgKHZvaWQgKikmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSwgNCkpIHsKIAkJCQkJQ0NLX2luZGV4X29sZCA9ICh1OClpOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0yMDEsNiArMTk3LDggQEAKIAkJZWxzZQogCQkJQ0NLX2luZGV4ID0gQ0NLX2luZGV4X29sZCArIDE7CiAKKwkJaWYgKENDS19pbmRleCA+IDMyKQorCQkJQ0NLX2luZGV4ID0gMzI7CiAJCS8qIEFkanVzdCBDQ0sgYWNjb3JkaW5nIHRvIGdhaW4gaW5kZXggKi8KIAkJaWYgKCFwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uYkNDS2luQ0gxNCkgewogCQkJcnR3X3dyaXRlOChwQWRhcHRlciwgMHhhMjIsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLX2luZGV4XVswXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9yeGRlc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jCmluZGV4IDUxMWY2MWMuLjQzZWI5NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jCkBAIC0yMyw5ICsyMyw5IEBACiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8cnRsODE4OGVfaGFsLmg+CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3NfcnNzaShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Jzc2koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzaWduYWxfc3RhdCAqc2lnbmFsX3N0YXQgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aF9kYXRhOwogCiAJaWYgKHNpZ25hbF9zdGF0LT51cGRhdGVfcmVxKSB7CkBAIC0zOSw3ICszOSw4IEBACiAJc2lnbmFsX3N0YXQtPmF2Z192YWwgPSBzaWduYWxfc3RhdC0+dG90YWxfdmFsIC8gc2lnbmFsX3N0YXQtPnRvdGFsX251bTsKIH0gLyogIFByb2Nlc3NfVUlfUlNTSV84MTkyQyAqLwogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2xpbmtfcXVhbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xpbmtfcXVhbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKIAlzdHJ1Y3Qgc2lnbmFsX3N0YXQgKnNpZ25hbF9zdGF0OwpAQCAtNDcsNyArNDgsNyBAQAogCWlmIChwcmZyYW1lID09IE5VTEwgfHwgcGFkYXB0ZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CiAJc2lnbmFsX3N0YXQgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9xdWFsX2RhdGE7CiAKIAlpZiAoc2lnbmFsX3N0YXQtPnVwZGF0ZV9yZXEpIHsKQEAgLTYzLDcgKzY0LDcgQEAKIAogdm9pZCBydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSkKIHsKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lID0gKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcHJmcmFtZTsKIAogCS8qICBDaGVjayBSU1NJICovCiAJcHJvY2Vzc19yc3NpKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKQEAgLTcxLDcgKzcyLDggQEAKIAlwcm9jZXNzX2xpbmtfcXVhbChwYWRhcHRlciwgIHByZWN2ZnJhbWUpOwogfQogCi12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliXzg4ZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcmVjdl9zdGF0ICpwcnhzdGF0KQordm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCisJCQkJIHN0cnVjdCByZWN2X3N0YXQgKnByeHN0YXQpCiB7CiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWI7CiAJc3RydWN0IHJlY3Zfc3RhdAlyZXBvcnQ7CkBAIC04Myw3ICs4NSw3IEBACiAJcmVwb3J0LnJ4ZHc0ID0gcHJ4c3RhdC0+cnhkdzQ7CiAJcmVwb3J0LnJ4ZHc1ID0gcHJ4c3RhdC0+cnhkdzU7CiAKLQlwYXR0cmliID0gJnByZWN2ZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKIAlfcnR3X21lbXNldChwYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IHJ4X3BrdF9hdHRyaWIpKTsKIAogCXBhdHRyaWItPmNyY19lcnIgPSAodTgpKChsZTMyX3RvX2NwdShyZXBvcnQucnhkdzApID4+IDE0KSAmIDB4MSk7LyogdTgpcHJ4cmVwb3J0LT5jcmMzMjsgKi8KQEAgLTEzNiwxMiArMTM4LDEzIEBACiAvKgogICogTm90aWNlOgogICoJQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwKLSAqCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgc2hvdWxkIGJlIHJlYWR5IQorICoJcHJlY3ZmcmFtZS0+cnhfZGF0YSBzaG91bGQgYmUgcmVhZHkhCiAgKi8KLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvXzg4ZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcGh5X3N0YXQgKnBwaHlfc3RhdHVzKQordm9pZCB1cGRhdGVfcmVjdmZyYW1lX3BoeWluZm9fODhlKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAorCQkJCSAgc3RydWN0IHBoeV9zdGF0ICpwcGh5X3N0YXR1cykKIHsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKIAlzdHJ1Y3Qgb2RtX3BoeV9zdGF0dXNfaW5mbyAqcFBIWUluZm8gID0gKHN0cnVjdCBvZG1fcGh5X3N0YXR1c19pbmZvICopKCZwYXR0cmliLT5waHlfaW5mbyk7CiAJdTggKndsYW5oZHI7CkBAIC0xNTQsMTUgKzE1NywxNSBAQAogCXBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgPSBmYWxzZTsKIAlwa3RfaW5mby5iUGFja2V0QmVhY29uID0gZmFsc2U7CiAKLQl3bGFuaGRyID0gZ2V0X3JlY3ZmcmFtZV9kYXRhKHByZWN2ZnJhbWUpOworCXdsYW5oZHIgPSBwcmVjdmZyYW1lLT5yeF9kYXRhOwogCiAJcGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgPSAoKCFJc0ZyYW1lVHlwZUN0cmwod2xhbmhkcikpICYmCiAJCSFwYXR0cmliLT5pY3ZfZXJyICYmICFwYXR0cmliLT5jcmNfZXJyICYmCi0JCV9ydHdfbWVtY21wKGdldF9oZHJfYnNzaWQod2xhbmhkciksCisJCSFtZW1jbXAoZ2V0X2hkcl9ic3NpZCh3bGFuaGRyKSwKIAkJIGdldF9ic3NpZCgmcGFkYXB0ZXItPm1sbWVwcml2KSwgRVRIX0FMRU4pKTsKIAogCXBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgPSBwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgotCQkJCSAoX3J0d19tZW1jbXAoZ2V0X2RhKHdsYW5oZHIpLAorCQkJCSAoIW1lbWNtcChnZXRfZGEod2xhbmhkciksCiAJCQkJICBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSk7CiAKIAlwa3RfaW5mby5iUGFja2V0QmVhY29uID0gcGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKQEAgLTE4NSwxNyArMTg4LDE3IEBACiAKIAlPRE1fUGh5U3RhdHVzUXVlcnkoJnBIYWxEYXRhLT5vZG1wcml2LCBwUEhZSW5mbywgKHU4ICopcHBoeV9zdGF0dXMsICYocGt0X2luZm8pKTsKIAotCXByZWN2ZnJhbWUtPnUuaGRyLnBzdGEgPSBOVUxMOworCXByZWN2ZnJhbWUtPnBzdGEgPSBOVUxMOwogCWlmIChwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgogCSAgICAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkpIHsKIAkJaWYgKHBzdGEpIHsKLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnBzdGEgPSBwc3RhOworCQkJcHJlY3ZmcmFtZS0+cHN0YSA9IHBzdGE7CiAJCQlydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKIAkJfQogCX0gZWxzZSBpZiAocGt0X2luZm8uYlBhY2tldFRvU2VsZiB8fCBwa3RfaW5mby5iUGFja2V0QmVhY29uKSB7CiAJCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEV8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7CiAJCQlpZiAocHN0YSkKLQkJCQlwcmVjdmZyYW1lLT51Lmhkci5wc3RhID0gcHN0YTsKKwkJCQlwcmVjdmZyYW1lLT5wc3RhID0gcHN0YTsKIAkJfQogCQlydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYwppbmRleCAxN2M5NGY0Li5iMWIxNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKQEAgLTIyLDkgKzIyLDYgQEAKICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KICNpbmNsdWRlIDxyZWN2X29zZGVwLmg+CiAjaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgotI2luY2x1ZGUgPGlwLmg+Ci0jaW5jbHVkZSA8aWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxldGhlcm5ldC5oPgogCiAjaW5jbHVkZSA8dXNiX29wcy5oPgogI2luY2x1ZGUgPHdpZmkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jCmluZGV4IDZmYjZhNDYuLjM0NzZmODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYwpAQCAtNTM3LDExICs1MzcsMTEgQEAKIAlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7CiAKIAl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwdHhzZXJ2cS0+c3RhX3BlbmRpbmcpOwotCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpIHsKLQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwotCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJcHhtaXRmcmFtZS0+YWdnX251bSA9IDA7IC8qICBub3QgZmlyc3QgZnJhbWUgb2YgYWdncmVnYXRpb24gKi8KIAkJcHhtaXRmcmFtZS0+cGt0X29mZnNldCA9IDA7IC8qICBub3QgZmlyc3QgZnJhbWUgb2YgYWdncmVnYXRpb24sIG5vIG5lZWQgdG8gcmVzZXJ2ZSBvZmZzZXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCmluZGV4IGIyNGFkNDkuLmM5MjA2N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYwpAQCAtNzA5LDcgKzcwOSw2IEBACiAKIAkjZGVmaW5lIEhBTF9JTklUX1BST0ZJTEVfVEFHKHN0YWdlKSBkbyB7fSB3aGlsZSAoMCkKIAotX2Z1bmNfZW50ZXJfOwogCiAJSEFMX0lOSVRfUFJPRklMRV9UQUcoSEFMX0lOSVRfU1RBR0VTX0JFR0lOKTsKIApAQCAtOTY3LDcgKzk2Niw2IEBACiAKIAlEQkdfODhFKCIlcyBpbiAlZG1zXG4iLCBfX2Z1bmNfXywgcnR3X2dldF9wYXNzaW5nX3RpbWVfbXMoaW5pdF9zdGFydF90aW1lKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEwODQsNyArMTA4Miw2IEBACiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJihBZGFwdGVyLT5yZWN2cHJpdik7CiAJdTMyICgqX3JlYWRfcG9ydCkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICpwbWVtKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJX3JlYWRfcG9ydCA9IHBpbnRmaGRsLT5pb19vcHMuX3JlYWRfcG9ydDsKIApAQCAtMTExMiw3ICsxMTA5LDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIjw9PT0gdXNiX2luaXJwX2luaXRcbiIpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQwMiw3ICsxMzk4LDYgQEAKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmaGFsZGF0YS0+ZG1wcml2OwogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZoYWxkYXRhLT5vZG1wcml2OwotX2Z1bmNfZW50ZXJfOwogCiAJc3dpdGNoICh2YXJpYWJsZSkgewogCWNhc2UgSFdfVkFSX01FRElBX1NUQVRVUzoKQEAgLTE5MjEsMTQgKzE5MTYsMTIgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgR2V0SHdSZWc4MTg4RVUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcG9kbXByaXYgPSAmaGFsZGF0YS0+b2RtcHJpdjsKLV9mdW5jX2VudGVyXzsKIAogCXN3aXRjaCAodmFyaWFibGUpIHsKIAljYXNlIEhXX1ZBUl9CQVNJQ19SQVRFOgpAQCAtMTk4MCw3ICsxOTczLDYgQEAKIAkJYnJlYWs7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogLyogICovCkBAIC0yMzAyLDcgKzIyOTQsNiBAQAogewogCXN0cnVjdCBoYWxfb3BzCSpoYWxmdW5jID0gJmFkYXB0LT5IYWxGdW5jOwogCi1fZnVuY19lbnRlcl87CiAKIAlhZGFwdC0+SGFsRGF0YSA9IHJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgaGFsX2RhdGFfODE4OGUpKTsKIAlpZiAoYWRhcHQtPkhhbERhdGEgPT0gTlVMTCkKQEAgLTIzNDIsNSArMjMzMyw0IEBACiAJaGFsZnVuYy0+aW50ZXJmYWNlX3BzX2Z1bmMgPSAmcnRsODE4OGV1X3BzX2Z1bmM7CiAKIAlydGw4MTg4ZV9zZXRfaGFsX29wcyhoYWxmdW5jKTsKLV9mdW5jX2V4aXRfOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX29wc19saW51eC5jCmluZGV4IDMxYWUyMWEuLjFmYTUzNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9vcHNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2Jfb3BzX2xpbnV4LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCQkJYnJlYWs7CiAJfQogcmVsZWFzZV9tdXRleDoKLQlfZXhpdF9jcml0aWNhbF9tdXRleCgmZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKIGV4aXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEyNSw3ICsxMjUsNiBAQAogCXUxNiBsZW47CiAJdTggZGF0YSA9IDA7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDE7LyogcmVhZF9pbiAqLwpAQCAtMTM2LDcgKzEzNSw2IEBACiAKIAl1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gZGF0YTsKIApAQCAtMTUxLDE0ICsxNDksMTIgQEAKIAl1MTYgbGVuOwogCV9fbGUzMiBkYXRhOwogCi1fZnVuY19lbnRlcl87CiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAxOy8qIHJlYWRfaW4gKi8KIAlpbmRleCA9IDA7Lyogbi9hICovCiAJd3ZhbHVlID0gKHUxNikoYWRkciYweDAwMDBmZmZmKTsKIAlsZW4gPSAyOwogCXVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiAodTE2KShsZTMyX3RvX2NwdShkYXRhKSYweGZmZmYpOwogfQpAQCAtMTcyLDcgKzE2OCw2IEBACiAJdTE2IGxlbjsKIAlfX2xlMzIgZGF0YTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAxOy8qIHJlYWRfaW4gKi8KQEAgLTE4Myw3ICsxNzgsNiBAQAogCiAJdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gbGUzMl90b19jcHUoZGF0YSk7CiB9CkBAIC0xOTgsNyArMTkyLDYgQEAKIAl1OCBkYXRhOwogCWludCByZXQ7CiAKLQlfZnVuY19lbnRlcl87CiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAwOy8qIHdyaXRlX291dCAqLwogCWluZGV4ID0gMDsvKiBuL2EgKi8KQEAgLTIwNiw3ICsxOTksNiBAQAogCWxlbiA9IDE7CiAJZGF0YSA9IHZhbDsKIAlyZXQgPSB1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwotCV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIyMCw3ICsyMTIsNiBAQAogCV9fbGUzMiBkYXRhOwogCWludCByZXQ7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDA7Lyogd3JpdGVfb3V0ICovCkBAIC0yMzMsNyArMjI0LDYgQEAKIAogCXJldCA9IHVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNDgsNyArMjM4LDYgQEAKIAlfX2xlMzIgZGF0YTsKIAlpbnQgcmV0OwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAwOy8qIHdyaXRlX291dCAqLwpAQCAtMjYwLDcgKzI0OSw2IEBACiAKIAlyZXQgPSB1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjc1LDcgKzI2Myw2IEBACiAJdTggYnVmW1ZFTkRPUl9DTURfTUFYX0RBVEFfTEVOXSA9IHswfTsKIAlpbnQgcmV0OwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJcmVxdWVzdCA9IDB4MDU7CiAJcmVxdWVzdHR5cGUgPSAweDAwOy8qIHdyaXRlX291dCAqLwpAQCAtMjg3LDcgKzI3NCw2IEBACiAKIAlyZXQgPSB1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgYnVmLCBsZW4sIHJlcXVlc3R0eXBlKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMyMCw3ICszMDYsNyBAQAogCXN0cnVjdCByZWN2X3N0YXQJKnByeHN0YXQ7CiAJc3RydWN0IHBoeV9zdGF0CSpwcGh5X3N0YXR1cyA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKnBrdF9jb3B5ID0gTlVMTDsKLQl1bmlvbiByZWN2X2ZyYW1lCSpwcmVjdmZyYW1lID0gTlVMTDsKKwlzdHJ1Y3QgcmVjdl9mcmFtZQkqcHJlY3ZmcmFtZSA9IE5VTEw7CiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWIgPSBOVUxMOwogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJc3RydWN0IHJlY3ZfcHJpdgkqcHJlY3Zwcml2ID0gJmFkYXB0LT5yZWN2cHJpdjsKQEAgLTM0NiwxMyArMzMyLDEzIEBACiAJCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwogCQl9CiAKLQkJX3J0d19pbml0X2xpc3RoZWFkKCZwcmVjdmZyYW1lLT51Lmhkci5saXN0KTsKLQkJcHJlY3ZmcmFtZS0+dS5oZHIucHJlY3ZidWYgPSBOVUxMOwkvKiBjYW4ndCBhY2Nlc3MgdGhlIHByZWN2YnVmIGZvciBuZXcgYXJjaC4gKi8KLQkJcHJlY3ZmcmFtZS0+dS5oZHIubGVuID0gMDsKKwkJX3J0d19pbml0X2xpc3RoZWFkKCZwcmVjdmZyYW1lLT5saXN0KTsKKwkJcHJlY3ZmcmFtZS0+cHJlY3ZidWYgPSBOVUxMOwkvKiBjYW4ndCBhY2Nlc3MgdGhlIHByZWN2YnVmIGZvciBuZXcgYXJjaC4gKi8KKwkJcHJlY3ZmcmFtZS0+bGVuID0gMDsKIAogCQl1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUocHJlY3ZmcmFtZSwgcHJ4c3RhdCk7CiAKLQkJcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT51Lmhkci5hdHRyaWI7CisJCXBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwogCiAJCWlmICgocGF0dHJpYi0+Y3JjX2VycikgfHwgKHBhdHRyaWItPmljdl9lcnIpKSB7CiAJCQlEQkdfODhFKCIlczogUlggV2FybmluZyEgY3JjX2Vycj0lZCBpY3ZfZXJyPSVkLCBza2lwIVxuIiwgX19mdW5jX18sIHBhdHRyaWItPmNyY19lcnIsIHBhdHRyaWItPmljdl9lcnIpOwpAQCAtMzk5LDI2ICszODUsMjYgQEAKIAkJcGt0X2NvcHkgPSBuZXRkZXZfYWxsb2Nfc2tiKGFkYXB0LT5wbmV0ZGV2LCBhbGxvY19zeik7CiAJCWlmIChwa3RfY29weSkgewogCQkJcGt0X2NvcHktPmRldiA9IGFkYXB0LT5wbmV0ZGV2OwotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucGt0ID0gcGt0X2NvcHk7Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9oZWFkID0gcGt0X2NvcHktPmRhdGE7Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9lbmQgPSBwa3RfY29weS0+ZGF0YSArIGFsbG9jX3N6OworCQkJcHJlY3ZmcmFtZS0+cGt0ID0gcGt0X2NvcHk7CisJCQlwcmVjdmZyYW1lLT5yeF9oZWFkID0gcGt0X2NvcHktPmRhdGE7CisJCQlwcmVjdmZyYW1lLT5yeF9lbmQgPSBwa3RfY29weS0+ZGF0YSArIGFsbG9jX3N6OwogCQkJc2tiX3Jlc2VydmUocGt0X2NvcHksIDggLSAoKHNpemVfdCkocGt0X2NvcHktPmRhdGEpICYgNykpOy8qIGZvcmNlIHBrdF9jb3B5LT5kYXRhIGF0IDgtYnl0ZSBhbGlnbm1lbnQgYWRkcmVzcyAqLwogCQkJc2tiX3Jlc2VydmUocGt0X2NvcHksIHNoaWZ0X3N6KTsvKiBmb3JjZSBpcF9oZHIgYXQgOC1ieXRlIGFsaWdubWVudCBhZGRyZXNzIGFjY29yZGluZyB0byBzaGlmdF9zei4gKi8KIAkJCW1lbWNweShwa3RfY29weS0+ZGF0YSwgKHBidWYgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUpLCBza2JfbGVuKTsKLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgPSBwa3RfY29weS0+ZGF0YTsKLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgPSBwa3RfY29weS0+ZGF0YTsKKwkJCXByZWN2ZnJhbWUtPnJ4X3RhaWwgPSBwa3RfY29weS0+ZGF0YTsKKwkJCXByZWN2ZnJhbWUtPnJ4X2RhdGEgPSBwa3RfY29weS0+ZGF0YTsKIAkJfSBlbHNlIHsKIAkJCWlmICgocGF0dHJpYi0+bWZyYWcgPT0gMSkgJiYgKHBhdHRyaWItPmZyYWdfbnVtID09IDApKSB7CiAJCQkJREJHXzg4RSgicmVjdmJ1ZjJyZWN2ZnJhbWU6IGFsbG9jX3NrYiBmYWlsICwgZHJvcCBmcmFnIGZyYW1lXG4iKTsKIAkJCQlydHdfZnJlZV9yZWN2ZnJhbWUocHJlY3ZmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAJCQkJZ290byBfZXhpdF9yZWN2YnVmMnJlY3ZmcmFtZTsKIAkJCX0KLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnBrdCA9IHNrYl9jbG9uZShwc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChwcmVjdmZyYW1lLT51Lmhkci5wa3QpIHsKLQkJCQlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsID0gcGJ1ZiArIHBhdHRyaWItPmRydmluZm9fc3ogKyBSWERFU0NfU0laRTsKLQkJCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9oZWFkID0gcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbDsKLQkJCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhID0gcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbDsKLQkJCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9lbmQgPSAgcGJ1ZiArIHBhdHRyaWItPmRydmluZm9fc3ogKyBSWERFU0NfU0laRSArIGFsbG9jX3N6OworCQkJcHJlY3ZmcmFtZS0+cGt0ID0gc2tiX2Nsb25lKHBza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKHByZWN2ZnJhbWUtPnBrdCkgeworCQkJCXByZWN2ZnJhbWUtPnJ4X3RhaWwgPSBwYnVmICsgcGF0dHJpYi0+ZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFOworCQkJCXByZWN2ZnJhbWUtPnJ4X2hlYWQgPSBwcmVjdmZyYW1lLT5yeF90YWlsOworCQkJCXByZWN2ZnJhbWUtPnJ4X2RhdGEgPSBwcmVjdmZyYW1lLT5yeF90YWlsOworCQkJCXByZWN2ZnJhbWUtPnJ4X2VuZCA9ICBwYnVmICsgcGF0dHJpYi0+ZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFICsgYWxsb2Nfc3o7CiAJCQl9IGVsc2UgewogCQkJCURCR184OEUoInJlY3ZidWYycmVjdmZyYW1lOiBza2JfY2xvbmUgZmFpbFxuIik7CiAJCQkJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZWN2ZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwpAQCAtNDUxLDE3ICs0MzcsMTcgQEAKIAkJCS8qIGVucXVldWUgcmVjdmZyYW1lIHRvIHR4cnRwIHF1ZXVlICovCiAJCQlpZiAocGF0dHJpYi0+cGt0X3JwdF90eXBlID09IFRYX1JFUE9SVDEpIHsKIAkJCQkvKiBDQ1gtVFhSUFQgYWNrIGZvciB4bWl0IG1nbXQgZnJhbWVzLiAqLwotCQkJCWhhbmRsZV90eHJwdF9jY3hfODhlKGFkYXB0LCBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhKTsKKwkJCQloYW5kbGVfdHhycHRfY2N4Xzg4ZShhZGFwdCwgcHJlY3ZmcmFtZS0+cnhfZGF0YSk7CiAJCQl9IGVsc2UgaWYgKHBhdHRyaWItPnBrdF9ycHRfdHlwZSA9PSBUWF9SRVBPUlQyKSB7CiAJCQkJT0RNX1JBX1R4UlBUMkhhbmRsZV84MTg4RSgKIAkJCQkJCQkmaGFsZGF0YS0+b2RtcHJpdiwKLQkJCQkJCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhLAorCQkJCQkJCXByZWN2ZnJhbWUtPnJ4X2RhdGEsCiAJCQkJCQkJcGF0dHJpYi0+cGt0X2xlbiwKIAkJCQkJCQlwYXR0cmliLT5NYWNJRFZhbGlkRW50cnlbMF0sCiAJCQkJCQkJcGF0dHJpYi0+TWFjSURWYWxpZEVudHJ5WzFdCiAJCQkJCQkJKTsKIAkJCX0gZWxzZSBpZiAocGF0dHJpYi0+cGt0X3JwdF90eXBlID09IEhJU19SRVBPUlQpIHsKLQkJCQlpbnRlcnJ1cHRfaGFuZGxlcl84MTg4ZXUoYWRhcHQsIHBhdHRyaWItPnBrdF9sZW4sIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEpOworCQkJCWludGVycnVwdF9oYW5kbGVyXzgxODhldShhZGFwdCwgcGF0dHJpYi0+cGt0X2xlbiwgcHJlY3ZmcmFtZS0+cnhfZGF0YSk7CiAJCQl9CiAJCQlydHdfZnJlZV9yZWN2ZnJhbWUocHJlY3ZmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAJCX0KQEAgLTUxOSw3ICs1MDUsNyBAQAogCQlEQkdfODhFKCIlcygpIFJYIFdhcm5pbmchIGJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKSBiUmVhZFBvcnRDYW5jZWwoJWQpXG4iLAogCQkJX19mdW5jX18sIGFkYXB0LT5iRHJpdmVyU3RvcHBlZCwKIAkJCWFkYXB0LT5iU3VycHJpc2VSZW1vdmVkLCBhZGFwdC0+YlJlYWRQb3J0Q2FuY2VsKTsKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJfQogCiAJaWYgKHB1cmItPnN0YXR1cyA9PSAwKSB7IC8qIFNVQ0NFU1MgKi8KQEAgLTU3OSw5ICs1NjUsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KLWV4aXQ6Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHUzMiB1c2JfcmVhZF9wb3J0KHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcm1lbSkKQEAgLTU5OCw3ICs1ODEsNiBAQAogCXNpemVfdCBhbGlnbm1lbnQgPSAwOwogCXUzMiByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwKIAkgICAgYWRhcHRlci0+cHdyY3RybHByaXYucG5wX2JzdG9wX3RyeCkgewpAQCAtNjcyLDcgKzY1NCw2IEBACiAJCXJldCA9IF9GQUlMOwogCX0KIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzAyLDcgKzY4Myw2IEBACiAKIHZvaWQgcnRsODE4OGV1X3NldF9pbnRmX29wcyhzdHJ1Y3QgX2lvX29wcwkqcG9wcykKIHsKLQlfZnVuY19lbnRlcl87CiAJX3J0d19tZW1zZXQoKHU4ICopcG9wcywgMCwgc2l6ZW9mKHN0cnVjdCBfaW9fb3BzKSk7CiAJcG9wcy0+X3JlYWQ4ID0gJnVzYl9yZWFkODsKIAlwb3BzLT5fcmVhZDE2ID0gJnVzYl9yZWFkMTY7CkBAIC03MTcsNyArNjk3LDYgQEAKIAlwb3BzLT5fd3JpdGVfcG9ydCA9ICZ1c2Jfd3JpdGVfcG9ydDsKIAlwb3BzLT5fcmVhZF9wb3J0X2NhbmNlbCA9ICZ1c2JfcmVhZF9wb3J0X2NhbmNlbDsKIAlwb3BzLT5fd3JpdGVfcG9ydF9jYW5jZWwgPSAmdXNiX3dyaXRlX3BvcnRfY2FuY2VsOwotCV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0bDgxODhldV9zZXRfaHdfdHlwZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKaW5kZXggYTQ5MmExYy4uOTM2YzE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaApAQCAtMTU5LDkgKzE1OSwxNSBAQAogCiAjZGVmaW5lIE1BWF9DT05USU5VQUxfVVJCX0VSUgkJNAogCitzdHJ1Y3QgcnRfZmlybXdhcmUgeworCXU4CQkJKnN6RndCdWZmZXI7CisJdTMyCQkJdWxGd0xlbmd0aDsKK307CisKIHN0cnVjdCBkdm9ial9wcml2IHsKIAlzdHJ1Y3QgYWRhcHRlciAqaWYxOwogCXN0cnVjdCBhZGFwdGVyICppZjI7CisJc3RydWN0IHJ0X2Zpcm13YXJlIGZpcm13YXJlOwogCiAJLyogRm9yIDkyRCwgRE1EUCBoYXZlIDIgaW50ZXJmYWNlLiAqLwogCXU4CUludGVyZmFjZU51bWJlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ldGhlcm5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2V0aGVybmV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OWY5MTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2V0aGVybmV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qISBcZmlsZSAqLwotI2lmbmRlZiBfX0lOQ19FVEhFUk5FVF9ICi0jZGVmaW5lIF9fSU5DX0VUSEVSTkVUX0gKLQotI2RlZmluZSBFVEhFUk5FVF9BRERSRVNTX0xFTkdUSAkJNgkvKiAgRXRoZXJuZXQgQWRkcmVzcyBMZW5ndGggKi8KLSNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUJCTE0CS8qICBFdGhlcm5ldCBIZWFkZXIgTGVuZ3RoICovCi0jZGVmaW5lIExMQ19IRUFERVJfU0laRQkJCTYJLyogIExMQyBIZWFkZXIgTGVuZ3RoICovCi0jZGVmaW5lIFRZUEVfTEVOR1RIX0ZJRUxEX1NJWkUJCTIJLyogIFR5cGUvTGVuZ3RoIFNpemUgKi8KLSNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9QQUNLRVRfU0laRQk2MAkvKiAgTWluIEV0aGVybmV0IFBhY2tldCBTaXplICovCi0jZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfUEFDS0VUX1NJWkUJMTUxNAkvKiAgTWF4IEV0aGVybmV0IFBhY2tldCBTaXplICovCi0KLS8qICBJcyBNdWx0aWNhc3QgQWRkcmVzcz8gKi8KLSNkZWZpbmUgUlRfRVRIX0lTX01VTFRJQ0FTVChfYWRkcikJKCgoKHU4ICopKF9hZGRyKSlbMF0mMHgwMSkgIT0gMCkKLSNkZWZpbmUgUlRfRVRIX0lTX0JST0FEQ0FTVChfYWRkcikJKAkJCVwKLQkJKCh1OCAqKShfYWRkcikpWzBdID09IDB4ZmYgJiYJCVwKLQkJKCh1OCAqKShfYWRkcikpWzFdID09IDB4ZmYgJiYJCVwKLQkJKCh1OCAqKShfYWRkcikpWzJdID09IDB4ZmYgJiYJCVwKLQkJKCh1OCAqKShfYWRkcikpWzNdID09IDB4ZmYgJiYJCVwKLQkJKCh1OCAqKShfYWRkcikpWzRdID09IDB4ZmYgJiYJCVwKLQkJKCh1OCAqKShfYWRkcikpWzVdID09IDB4ZmYpCS8qICBJcyBCcm9hZGNhc3QgQWRkcmVzcz8gKi8KLQotCi0jZW5kaWYgLyogICNpZm5kZWYgX19JTkNfRVRIRVJORVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2gyY2xiay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2gyY2xiay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk1MDMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oMmNsYmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgX0gyQ0xCS19IXwotCi0KLSNpbmNsdWRlIDxydGw4NzExX3NwZWMuaD4KLSNpbmNsdWRlIDxUeXBlRGVmLmg+Ci0KLQotdm9pZCBfbGJrX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgX2xia19yc3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIF9sYmtfZXZ0KElOIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLQotdm9pZCBoMmNfZXZlbnRfY2FsbGJhY2sodW5zaWduZWQgY2hhciAqZGV2LCB1bnNpZ25lZCBjaGFyICpwYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZl9ldGhlci5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lmX2V0aGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTU3NzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lmX2V0aGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0xJTlVYX0lGX0VUSEVSX0gKLSNkZWZpbmUgX0xJTlVYX0lGX0VUSEVSX0gKLQotLyoKLSAqCUlFRUUgODAyLjMgRXRoZXJuZXQgbWFnaWMgY29uc3RhbnRzLiAgVGhlIGZyYW1lIHNpemVzIG9taXQgdGhlIHByZWFtYmxlCi0gKglhbmQgRkNTL0NSQyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLgotICovCi0KLSNkZWZpbmUgRVRIX0FMRU4JNgkJLyogT2N0ZXRzIGluIG9uZSBldGhlcm5ldCBhZGRyCSAqLwotI2RlZmluZSBFVEhfSExFTgkxNAkJLyogVG90YWwgb2N0ZXRzIGluIGhlYWRlci4JICovCi0jZGVmaW5lIEVUSF9aTEVOCTYwCQkvKiBNaW4uIG9jdGV0cyBpbiBmcmFtZSBzYW5zIEZDUyAqLwotI2RlZmluZSBFVEhfREFUQV9MRU4JMTUwMAkJLyogTWF4LiBvY3RldHMgaW4gcGF5bG9hZAkgKi8KLSNkZWZpbmUgRVRIX0ZSQU1FX0xFTgkxNTE0CQkvKiBNYXguIG9jdGV0cyBpbiBmcmFtZSBzYW5zIEZDUyAqLwotCi0vKgotICoJVGhlc2UgYXJlIHRoZSBkZWZpbmVkIEV0aGVybmV0IFByb3RvY29sIElEJ3MuCi0gKi8KLQotI2RlZmluZSBFVEhfUF9MT09QCTB4MDA2MAkJLyogRXRoZXJuZXQgTG9vcGJhY2sgcGFja2V0CSovCi0jZGVmaW5lIEVUSF9QX1BVUAkweDAyMDAJCS8qIFhlcm94IFBVUCBwYWNrZXQJCSovCi0jZGVmaW5lIEVUSF9QX1BVUEFUCTB4MDIwMQkJLyogWGVyb3ggUFVQIEFkZHIgVHJhbnMgcGFja2V0CSovCi0jZGVmaW5lIEVUSF9QX0lQCTB4MDgwMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0CSovCi0jZGVmaW5lIEVUSF9QX1gyNQkweDA4MDUJCS8qIENDSVRUIFguMjUJCQkqLwotI2RlZmluZSBFVEhfUF9BUlAJMHgwODA2CQkvKiBBZGRyZXNzIFJlc29sdXRpb24gcGFja2V0CSovCi0jZGVmaW5lCUVUSF9QX0JQUQkweDA4RkYJCS8qIEc4QlBRIEFYLjI1IEV0aGVybmV0IFBhY2tldCAgKi8KLSNkZWZpbmUgRVRIX1BfSUVFRVBVUAkweDBhMDAJCS8qIFhlcm94IElFRUU4MDIuMyBQVVAgcGFja2V0ICAgKi8KLSNkZWZpbmUgRVRIX1BfSUVFRVBVUEFUCTB4MGEwMQkJLyogWGVyb3ggSUVFRTgwMi4zIFBVUAkJKi8KLSNkZWZpbmUgRVRIX1BfREVDICAgICAgIDB4NjAwMCAgICAgICAgICAvKiBERUMgQXNzaWduZWQgcHJvdG8gICAgICAgICAgICovCi0jZGVmaW5lIEVUSF9QX0ROQV9ETCAgICAweDYwMDEgICAgICAgICAgLyogREVDIEROQSBEdW1wL0xvYWQgICAgICAgICAgICAqLwotI2RlZmluZSBFVEhfUF9ETkFfUkMgICAgMHg2MDAyICAgICAgICAgIC8qIERFQyBETkEgUmVtb3RlIENvbnNvbGUgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfRE5BX1JUICAgIDB4NjAwMyAgICAgICAgICAvKiBERUMgRE5BIFJvdXRpbmcgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVUSF9QX0xBVCAgICAgICAweDYwMDQgICAgICAgICAgLyogREVDIExBVCAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBFVEhfUF9ESUFHICAgICAgMHg2MDA1ICAgICAgICAgIC8qIERFQyBEaWFnbm9zdGljcyAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfQ1VTVCAgICAgIDB4NjAwNiAgICAgICAgICAvKiBERUMgQ3VzdG9tZXIgdXNlICAgICAgICAgICAgICovCi0jZGVmaW5lIEVUSF9QX1NDQSAgICAgICAweDYwMDcgICAgICAgICAgLyogREVDIFN5c3RlbXMgQ29tbXMgQXJjaCAgICAgICAqLwotI2RlZmluZSBFVEhfUF9SQVJQICAgICAgMHg4MDM1CQkvKiBSZXZlcnNlIEFkZHIgUmVzIHBhY2tldAkqLwotI2RlZmluZSBFVEhfUF9BVEFMSwkweDgwOUIJCS8qIEFwcGxldGFsayBERFAJCSovCi0jZGVmaW5lIEVUSF9QX0FBUlAJMHg4MEYzCQkvKiBBcHBsZXRhbGsgQUFSUAkJKi8KLSNkZWZpbmUgRVRIX1BfODAyMVEJMHg4MTAwICAgICAgICAgIC8qIDgwMi4xUSBWTEFOIEV4dGVuZGVkIEhlYWRlciAgKi8KLSNkZWZpbmUgRVRIX1BfSVBYCTB4ODEzNwkJLyogSVBYIG92ZXIgRElYCQkJKi8KLSNkZWZpbmUgRVRIX1BfSVBWNgkweDg2REQJCS8qIElQdjYgb3ZlciBibHVlYm9vawkJKi8KLSNkZWZpbmUgRVRIX1BfUFBQX0RJU0MJMHg4ODYzCQkvKiBQUFBvRSBkaXNjb3ZlcnkgbWVzc2FnZXMgICAgICovCi0jZGVmaW5lIEVUSF9QX1BQUF9TRVMJMHg4ODY0CQkvKiBQUFBvRSBzZXNzaW9uIG1lc3NhZ2VzCSovCi0jZGVmaW5lIEVUSF9QX0FUTU1QT0EJMHg4ODRjCQkvKiBNdWx0aVByb3RvY29sIE92ZXIgQVRNCSovCi0jZGVmaW5lIEVUSF9QX0FUTUZBVEUJMHg4ODg0CQkvKiBGcmFtZS1iYXNlZCBBVE0gVHJhbnNwb3J0Ci0JCQkJCSAqIG92ZXIgRXRoZXJuZXQKLQkJCQkJICovCi0KLS8qCi0gKglOb24gRElYIHR5cGVzLiBXb24ndCBjbGFzaCBmb3IgMTUwMCB0eXBlcy4KLSAqLwotCi0jZGVmaW5lIEVUSF9QXzgwMl8zCTB4MDAwMQkJLyogRHVtbXkgdHlwZSBmb3IgODAyLjMgZnJhbWVzICAqLwotI2RlZmluZSBFVEhfUF9BWDI1CTB4MDAwMgkJLyogRHVtbXkgcHJvdG9jb2wgaWQgZm9yIEFYLjI1ICAqLwotI2RlZmluZSBFVEhfUF9BTEwJMHgwMDAzCQkvKiBFdmVyeSBwYWNrZXQgKGJlIGNhcmVmdWwhISEpICovCi0jZGVmaW5lIEVUSF9QXzgwMl8yCTB4MDAwNAkJLyogODAyLjIgZnJhbWVzCQkJKi8KLSNkZWZpbmUgRVRIX1BfU05BUAkweDAwMDUJCS8qIEludGVybmFsIG9ubHkJCSovCi0jZGVmaW5lIEVUSF9QX0REQ01QICAgICAweDAwMDYgICAgICAgICAgLyogREVDIEREQ01QOiBJbnRlcm5hbCBvbmx5ICAgICAqLwotI2RlZmluZSBFVEhfUF9XQU5fUFBQICAgMHgwMDA3ICAgICAgICAgIC8qIER1bW15IHR5cGUgZm9yIFdBTiBQUFAgZnJhbWVzKi8KLSNkZWZpbmUgRVRIX1BfUFBQX01QICAgIDB4MDAwOCAgICAgICAgICAvKiBEdW1teSB0eXBlIGZvciBQUFAgTVAgZnJhbWVzICovCi0jZGVmaW5lIEVUSF9QX0xPQ0FMVEFMSyAweDAwMDkJCS8qIExvY2FsdGFsayBwc2V1ZG8gdHlwZQkqLwotI2RlZmluZSBFVEhfUF9QUFBUQUxLCTB4MDAxMAkJLyogRHVtbXkgdHlwZSBmb3IgQXRhbGsgb3ZlciBQUFAqLwotI2RlZmluZSBFVEhfUF9UUl84MDJfMgkweDAwMTEJCS8qIDgwMi4yIGZyYW1lcwkJCSovCi0jZGVmaW5lIEVUSF9QX01PQklURVgJMHgwMDE1CQkvKiBNb2JpdGV4IChrYXpAY2FmZS5uZXQpCSovCi0jZGVmaW5lIEVUSF9QX0NPTlRST0wJMHgwMDE2CQkvKiBDYXJkIHNwZWNpZmljIGNvbnRyb2wgZnJhbWVzICovCi0jZGVmaW5lIEVUSF9QX0lSREEJMHgwMDE3CQkvKiBMaW51eC1JckRBCQkJKi8KLSNkZWZpbmUgRVRIX1BfRUNPTkVUCTB4MDAxOAkJLyogQWNvcm4gRWNvbmV0CQkJKi8KLQotLyoKLSAqCVRoaXMgaXMgYW4gRXRoZXJuZXQgZnJhbWUgaGVhZGVyLgotICovCi0KLXN0cnVjdCBldGhoZHIgewotCXVuc2lnbmVkIGNoYXIJaF9kZXN0W0VUSF9BTEVOXTsJLyogZGVzdGluYXRpb24gZXRoIGFkZHIJKi8KLQl1bnNpZ25lZCBjaGFyCWhfc291cmNlW0VUSF9BTEVOXTsJLyogc291cmNlIGV0aGVyIGFkZHIJKi8KLQl1bnNpZ25lZCBzaG9ydAloX3Byb3RvOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQJKi8KLX07Ci0KLXN0cnVjdCBfdmxhbiB7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgaF92bGFuX1RDSTsJLyogIEVuY2FwIHByaW8gYW5kIFZMQU4gSUQgKi8KLQl1bnNpZ25lZCBzaG9ydCAgICAgICBoX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwotfTsKLQotI2RlZmluZSBnZXRfdmxhbl9pZChwdmxhbikJCQkJXAotCSgobnRvaHMoKHVuc2lnbmVkIHNob3J0KXB2bGFuLT5oX3ZsYW5fVENJKSkgJiAweGZmZikKLSNkZWZpbmUgZ2V0X3ZsYW5fcHJpb3JpdHkocHZsYW4pCQkJXAotCSgobnRvaHMoKHVuc2lnbmVkIHNob3J0KXB2bGFuLT5oX3ZsYW5fVENJKSk+PjEzKQotI2RlZmluZSBnZXRfdmxhbl9lbmNhcF9wcm90byhwdmxhbikJCQlcCi0JIChudG9ocygodW5zaWduZWQgc2hvcnQpcHZsYW4tPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8pKQotCi0jZW5kaWYJLyogX0xJTlVYX0lGX0VUSEVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lvY3RsX2NmZzgwMjExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2U5YTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lvY3RsX2NmZzgwMjExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSU9DVExfQ0ZHODAyMTFfSF9fCi0jZGVmaW5lIF9fSU9DVExfQ0ZHODAyMTFfSF9fCi0KLXN0cnVjdCBydHdfd2Rldl9pbnZpdF9pbmZvIHsKLQl1OCB0b2tlbjsKLQl1OCBmbGFnczsKLQl1OCBzdGF0dXM7Ci0JdTggcmVxX29wX2NoOwotCXU4IHJzcF9vcF9jaDsKLX07Ci0KLSNkZWZpbmUgcnR3X3dkZXZfaW52aXRfaW5mb19pbml0KGludml0X2luZm8pIFwKLQlkbyB7IFwKLQkJKGludml0X2luZm8pLT50b2tlbiA9IDA7IFwKLQkJKGludml0X2luZm8pLT5mbGFncyA9IDB4MDA7IFwKLQkJKGludml0X2luZm8pLT5zdGF0dXMgPSAweGZmOyBcCi0JCShpbnZpdF9pbmZvKS0+cmVxX29wX2NoID0gMDsgXAotCQkoaW52aXRfaW5mbyktPnJzcF9vcF9jaCA9IDA7IFwKLQl9IHdoaWxlICgwKQotCi1zdHJ1Y3QgcnR3X3dkZXZfcHJpdiB7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcnR3X3dkZXY7Ci0KLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7Ci0Jc3BpbmxvY2tfdCBzY2FuX3JlcV9sb2NrOwotCi0Jc3RydWN0IG5ldF9kZXZpY2UgKnBtb25fbmRldjsvKiBmb3IgbW9uaXRvciBpbnRlcmZhY2UgKi8KLQljaGFyIGlmbmFtZV9tb25bSUZOQU1TSVogKyAxXTsgLyogbmFtZSBvZiBtb25pdG9yIGludGVyZmFjZSAqLwotCi0JdTggcDJwX2VuYWJsZWQ7Ci0KLQl1OCBwcm92ZGlzY19yZXFfaXNzdWVkOwotCi0Jc3RydWN0IHJ0d193ZGV2X2ludml0X2luZm8gaW52aXRfaW5mbzsKLQotCXU4IGJhbmRyb2lkX3NjYW47Ci0JYm9vbCBibG9jazsKLQlib29sIHBvd2VyX21nbXQ7Ci19OwotCi0jZGVmaW5lIHdkZXZfdG9fcHJpdih3KSAoKHN0cnVjdCBydHdfd2Rldl9wcml2ICopKHdkZXZfcHJpdih3KSkpCi0KLSNkZWZpbmUgd2lwaHlfdG9fd2Rldih4KQkJCQlcCi0oKHN0cnVjdCB3aXJlbGVzc19kZXYgKikoKChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKXdpcGh5X3ByaXYoeCkpLT5ydHdfd2RldikpCi0KLWludCBydHdfd2Rldl9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci12b2lkIHJ0d193ZGV2X2ZyZWUoc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7Ci12b2lkIHJ0d193ZGV2X3VucmVnaXN0ZXIoc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7Ci0KLXZvaWQgcnR3X2NmZzgwMjExX2luaXRfd2lwaHkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2ZnODAyMTFfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9jb25uZWN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9kaXNjb25uZWN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYsCi0JCQkJICAgICBib29sIGFib3J0ZWQpOwotCi0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Fzc29jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHU4ICpwbWdtdF9mcmFtZSwgdWludCBmcmFtZV9sZW4pOwotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Rpc2Fzc29jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJdW5zaWduZWQgY2hhciAqZGEsCi0JCQkJCXVuc2lnbmVkIHNob3J0IHJlYXNvbik7Ci0jZW5kaWYgLyogQ09ORklHXzg4RVVfQVBfTU9ERSAqLwotCi12b2lkIHJ0d19jZmc4MDIxMV9pc3N1ZV9wMnBfcHJvdmlzaW9uX3JlcXVlc3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKLXZvaWQgcnR3X2NmZzgwMjExX3J4X3AycF9hY3Rpb25fcHVibGljKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgdTggKnBtZ210X2ZyYW1lLCB1aW50IGZyYW1lX2xlbik7Ci12b2lkIHJ0d19jZmc4MDIxMV9yeF9hY3Rpb25fcDJwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnBtZ210X2ZyYW1lLAotCQkJCXVpbnQgZnJhbWVfbGVuKTsKLXZvaWQgcnR3X2NmZzgwMjExX3J4X2FjdGlvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKmZyYW1lLAotCQkJICAgIHVpbnQgZnJhbWVfbGVuLCBjb25zdCBjaGFyICptc2cpOwotCi1pbnQgcnR3X2NmZzgwMjExX3NldF9tZ250X3dwc3AycGllKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCi0JCQkJICAgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgdHlwZSk7Ci0KLWJvb2wgcnR3X2NmZzgwMjExX3B3cl9tZ210KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLQotI2RlZmluZSBydHdfY2ZnODAyMTFfcnhfbWdtdChkZXYsIGZyZXEsIHNpZ19kYm0sIGJ1ZiwgbGVuLCBnZnApCQlcCi0JY2ZnODAyMTFfcnhfbWdtdChkZXYsIGZyZXEsIHNpZ19kYm0sIGJ1ZiwgbGVuLCBnZnApCi0jZGVmaW5lIHJ0d19jZmc4MDIxMV9zZW5kX3J4X2Fzc29jKGRldiwgYnNzLCBidWYsIGxlbikJCQlcCi0JY2ZnODAyMTFfc2VuZF9yeF9hc3NvYyhkZXYsIGJzcywgYnVmLCBsZW4pCi0KLSNlbmRpZiAvKiBfX0lPQ1RMX0NGRzgwMjExX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkYWM2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX0xJTlVYX0lQX0gKLSNkZWZpbmUgX0xJTlVYX0lQX0gKLQotLyogU09MX0lQIHNvY2tldCBvcHRpb25zICovCi0KLSNkZWZpbmUgSVBUT1NfVE9TX01BU0sJCTB4MUUKLSNkZWZpbmUgSVBUT1NfVE9TKHRvcykJCSgodG9zKSZJUFRPU19UT1NfTUFTSykKLSNkZWZpbmUJSVBUT1NfTE9XREVMQVkJCTB4MTAKLSNkZWZpbmUJSVBUT1NfVEhST1VHSFBVVAkweDA4Ci0jZGVmaW5lCUlQVE9TX1JFTElBQklMSVRZCTB4MDQKLSNkZWZpbmUJSVBUT1NfTUlOQ09TVAkJMHgwMgotCi0jZGVmaW5lIElQVE9TX1BSRUNfTUFTSwkJMHhFMAotI2RlZmluZSBJUFRPU19QUkVDKHRvcykJCSgodG9zKSZJUFRPU19QUkVDX01BU0spCi0jZGVmaW5lIElQVE9TX1BSRUNfTkVUQ09OVFJPTCAgICAgICAgICAgMHhlMAotI2RlZmluZSBJUFRPU19QUkVDX0lOVEVSTkVUQ09OVFJPTCAgICAgIDB4YzAKLSNkZWZpbmUgSVBUT1NfUFJFQ19DUklUSUNfRUNQICAgICAgICAgICAweGEwCi0jZGVmaW5lIElQVE9TX1BSRUNfRkxBU0hPVkVSUklERSAgICAgICAgMHg4MAotI2RlZmluZSBJUFRPU19QUkVDX0ZMQVNIICAgICAgICAgICAgICAgIDB4NjAKLSNkZWZpbmUgSVBUT1NfUFJFQ19JTU1FRElBVEUgICAgICAgICAgICAweDQwCi0jZGVmaW5lIElQVE9TX1BSRUNfUFJJT1JJVFkgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBJUFRPU19QUkVDX1JPVVRJTkUgICAgICAgICAgICAgIDB4MDAKLQotCi0vKiBJUCBvcHRpb25zICovCi0jZGVmaW5lIElQT1BUX0NPUFkJCTB4ODAKLSNkZWZpbmUgSVBPUFRfQ0xBU1NfTUFTSwkweDYwCi0jZGVmaW5lIElQT1BUX05VTUJFUl9NQVNLCTB4MWYKLQotI2RlZmluZQlJUE9QVF9DT1BJRUQobykJCSgobykmSVBPUFRfQ09QWSkKLSNkZWZpbmUJSVBPUFRfQ0xBU1MobykJCSgobykmSVBPUFRfQ0xBU1NfTUFTSykKLSNkZWZpbmUJSVBPUFRfTlVNQkVSKG8pCQkoKG8pJklQT1BUX05VTUJFUl9NQVNLKQotCi0jZGVmaW5lCUlQT1BUX0NPTlRST0wJCTB4MDAKLSNkZWZpbmUJSVBPUFRfUkVTRVJWRUQxCQkweDIwCi0jZGVmaW5lCUlQT1BUX01FQVNVUkVNRU5UCTB4NDAKLSNkZWZpbmUJSVBPUFRfUkVTRVJWRUQyCQkweDYwCi0KLSNkZWZpbmUgSVBPUFRfRU5ECSgwIHwgSVBPUFRfQ09OVFJPTCkKLSNkZWZpbmUgSVBPUFRfTk9PUAkoMSB8IElQT1BUX0NPTlRST0wpCi0jZGVmaW5lIElQT1BUX1NFQwkoMiB8IElQT1BUX0NPTlRST0wgfCBJUE9QVF9DT1BZKQotI2RlZmluZSBJUE9QVF9MU1JSCSgzIHwgSVBPUFRfQ09OVFJPTCB8IElQT1BUX0NPUFkpCi0jZGVmaW5lIElQT1BUX1RJTUVTVEFNUAkoNCB8IElQT1BUX01FQVNVUkVNRU5UKQotI2RlZmluZSBJUE9QVF9SUgkoNyB8IElQT1BUX0NPTlRST0wpCi0jZGVmaW5lIElQT1BUX1NJRAkoOCB8IElQT1BUX0NPTlRST0wgfCBJUE9QVF9DT1BZKQotI2RlZmluZSBJUE9QVF9TU1JSCSg5IHwgSVBPUFRfQ09OVFJPTCB8IElQT1BUX0NPUFkpCi0jZGVmaW5lIElQT1BUX1JBCSgyMCB8IElQT1BUX0NPTlRST0wgfCBJUE9QVF9DT1BZKQotCi0jZGVmaW5lIElQVkVSU0lPTgk0Ci0jZGVmaW5lIE1BWFRUTAkJMjU1Ci0jZGVmaW5lIElQREVGVFRMCTY0Ci0jZGVmaW5lIElQT1BUX09QVFZBTCAwCi0jZGVmaW5lIElQT1BUX09MRU4gICAxCi0jZGVmaW5lIElQT1BUX09GRlNFVCAyCi0jZGVmaW5lIElQT1BUX01JTk9GRiA0Ci0jZGVmaW5lIE1BWF9JUE9QVExFTiA0MAotI2RlZmluZSBJUE9QVF9OT1AgSVBPUFRfTk9PUAotI2RlZmluZSBJUE9QVF9FT0wgSVBPUFRfRU5ECi0jZGVmaW5lIElQT1BUX1RTICBJUE9QVF9USU1FU1RBTVAKLQotI2RlZmluZQlJUE9QVF9UU19UU09OTFkJCTAJLyogdGltZXN0YW1wcyBvbmx5ICovCi0jZGVmaW5lCUlQT1BUX1RTX1RTQU5EQUREUgkxCS8qIHRpbWVzdGFtcHMgYW5kIGFkZHJlc3NlcyAqLwotI2RlZmluZQlJUE9QVF9UU19QUkVTUEVDCTMJLyogc3BlY2lmaWVkIG1vZHVsZXMgb25seSAqLwotCi1zdHJ1Y3QgaXBfb3B0aW9ucyB7Ci0JX191MzIJCWZhZGRyOwkJCS8qIFNhdmVkIGZpcnN0IGhvcCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhcglvcHRsZW47Ci0JdW5zaWduZWQgY2hhciBzcnI7Ci0JdW5zaWduZWQgY2hhciBycjsKLQl1bnNpZ25lZCBjaGFyIHRzOwotCXVuc2lnbmVkIGNoYXIJaXNfc2V0Ynl1c2VyOjEsCS8qIFNldCBieSBzZXRzb2Nrb3B0PwkJKi8KLQkJCWlzX2RhdGE6MSwJLyogT3B0aW9ucyBpbiBfX2RhdGEsIHJhdGhlciB0aGFuIHNrYiovCi0JCQlpc19zdHJpY3Ryb3V0ZToxLC8qIFN0cmljdCBzb3VyY2Ugcm91dGUJCSovCi0JCQlzcnJfaXNfaGl0OjEsCS8qIFBhY2tldCBkZXN0biBhZGRyIHdhcyBvdXJzICovCi0JCQlpc19jaGFuZ2VkOjEsCS8qIElQIGNoZWNrc3VtIG1vcmUgbm90IHZhbGlkCSovCi0JCQlycl9uZWVkYWRkcjoxLAkvKiBOZWVkIHRvIHJlY29yZCBhZGRyIG9mIG91dCBkZXYqLwotCQkJdHNfbmVlZHRpbWU6MSwJLyogTmVlZCB0byByZWNvcmQgdGltZXN0YW1wCSovCi0JCQl0c19uZWVkYWRkcjoxOwkvKiBOZWVkIHRvIHJlY29yZCBhZGRyIG9mIG91dCBkZXYgICovCi0JdW5zaWduZWQgY2hhciByb3V0ZXJfYWxlcnQ7Ci0JdW5zaWduZWQgY2hhciBfX3BhZDE7Ci0JdW5zaWduZWQgY2hhciBfX3BhZDI7Ci0JdW5zaWduZWQgY2hhciBfX2RhdGFbMF07Ci19OwotCi0jZGVmaW5lIG9wdGxlbmd0aChvcHQpIChzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpICsgb3B0LT5vcHRsZW4pCi0KLXN0cnVjdCBpcGhkciB7Ci0jaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0JX191OAlpaGw6NCwKLQkJdmVyc2lvbjo0OwotI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCi0JX191OAl2ZXJzaW9uOjQsCi0JCWlobDo0OwotI2VuZGlmCi0JX191OAl0b3M7Ci0JX191MTYJdG90X2xlbjsKLQlfX3UxNglpZDsKLQlfX3UxNglmcmFnX29mZjsKLQlfX3U4CXR0bDsKLQlfX3U4CXByb3RvY29sOwotCV9fdTE2CWNoZWNrOwotCV9fdTMyCXNhZGRyOwotCV9fdTMyCWRhZGRyOwotCS8qVGhlIG9wdGlvbnMgc3RhcnQgaGVyZS4gKi8KLX07Ci0KLSNlbmRpZgkvKiBfTElOVVhfSVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL25pY19zcGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvbmljX3NwZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyMjQ0Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvbmljX3NwZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19OSUNfU1BFQ19IX18KLSNkZWZpbmUgX19OSUNfU1BFQ19IX18KLQotI2RlZmluZSBSVEw4NzExX01DVFJMXwkJKDB4MjAwMDApCi0jZGVmaW5lIFJUTDg3MTFfVUFSVF8JCSgweDMwMDAwKQotI2RlZmluZSBSVEw4NzExX1RJTUVSXwkJKDB4NDAwMDApCi0jZGVmaW5lIFJUTDg3MTFfRklOVF8JCSgweDUwMDAwKQotI2RlZmluZSBSVEw4NzExX0hJTlRfCQkoMHg1MDAwMCkKLSNkZWZpbmUgUlRMODcxMV9HUElPXwkJKDB4NjAwMDApCi0jZGVmaW5lIFJUTDg3MTFfV0xBTkNUUkxfCSgweDIwMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9XTEFORkZfCQkoMHhlMDAwMDApCi0jZGVmaW5lIFJUTDg3MTFfSENJQ1RSTF8JKDB4NjAwMDAwKQotI2RlZmluZSBSVEw4NzExX1NZU0NGR18JCSgweDYyMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9TWVNDVFJMXwkoMHg2MjAwMDApCi0jZGVmaW5lIFJUTDg3MTFfTUNDVFJMXwkJKDB4MDIwMDAwKQotCi0KLSNpbmNsdWRlIDxydGw4NzExX3JlZ2RlZi5oPgotCi0jaW5jbHVkZSA8cnRsODcxMV9iaXRkZWYuaD4KLQotCi0jZW5kaWYgLyogIF9fUlRMODcxMV9TUEVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmgKaW5kZXggYTUwZWFlMy4uNTQ4YTMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCkBAIC03NywzMiArNzcsOSBAQAogCiAvKiAgPT09PT09PT09PT0gRVh0ZXJuIEZ1bmN0aW9uIFByb3RvdHlwZSAqLwogCi11OCBPRE1fUmVhZDFCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkcik7Ci0KLXUxNiBPRE1fUmVhZDJCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkcik7Ci0KLXUzMiBPRE1fUmVhZDRCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkcik7Ci0KLXZvaWQgT0RNX1dyaXRlMUJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1OCBEYXRhKTsKLQotdm9pZCBPRE1fV3JpdGUyQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUxNiBEYXRhKTsKLQotdm9pZCBPRE1fV3JpdGU0Qnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUzMiBEYXRhKTsKLQogLyogIE1lbW9yeSBSZWxhdGl2ZSBGdW5jdGlvbi4gKi8KLXZvaWQgT0RNX0FsbG9jYXRlTWVtb3J5KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB2b2lkICoqcFB0ciwgdTMyIGxlbmd0aCk7Ci12b2lkIE9ETV9GcmVlTWVtb3J5KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB2b2lkICpwUHRyLCB1MzIgbGVuZ3RoKTsKLQotczMyIE9ETV9Db21wYXJlTWVtb3J5KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB2b2lkICpwQnVmMSwgdm9pZCAqcEJ1ZjIsCi0JCSAgICAgIHUzMiBsZW5ndGgpOwogCiAvKiAgT0RNIFRpbWVyIHJlbGF0aXZlIEFQSS4gKi8KLXZvaWQgT0RNX1NldFRpbWVyKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCBzdHJ1Y3QgdGltZXJfbGlzdCAqcFRpbWVyLAotCQkgIHUzMiBtc0RlbGF5KTsKLQotdm9pZCBPRE1fSW5pdGlhbGl6ZVRpbWVyKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLAotCQkJIHN0cnVjdCB0aW1lcl9saXN0ICpwVGltZXIsIHZvaWQgKkNhbGxCYWNrRnVuYywKLQkJCSB2b2lkICpwQ29udGV4dCwgY29uc3QgY2hhciAqc3pJRCk7CiAKIHZvaWQgT0RNX0NhbmNlbFRpbWVyKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCBzdHJ1Y3QgdGltZXJfbGlzdCAqcFRpbWVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKaW5kZXggNzk1NmYwYy4uNTg4OWY1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCkBAIC02MiwyMCArNjIsMTEgQEAKIAlzcGlubG9ja190IGxvY2s7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKmdldF9uZXh0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCi17Ci0JcmV0dXJuIGxpc3QtPm5leHQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqZ2V0X2xpc3RfaGVhZChzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpCiB7CiAJcmV0dXJuICYocXVldWUtPnF1ZXVlKTsKIH0KIAotCi0jZGVmaW5lIExJU1RfQ09OVEFJTk9SKHB0ciwgdHlwZSwgbWVtYmVyKSBcCi0JKCh0eXBlICopKChjaGFyICopKHB0ciktKHNpemVfdCkoJigodHlwZSAqKTApLT5tZW1iZXIpKSkKLQogc3RhdGljIGlubGluZSBpbnQgX2VudGVyX2NyaXRpY2FsX211dGV4KHN0cnVjdCBtdXRleCAqcG11dGV4LAogCQkJCQl1bnNpZ25lZCBsb25nICpwaXJxTCkKIHsKQEAgLTg1LDEzICs3Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2V4aXRfY3JpdGljYWxfbXV0ZXgoc3RydWN0IG11dGV4ICpwbXV0ZXgsCi0JCQkJCXVuc2lnbmVkIGxvbmcgKnBpcnFMKQotewotCQltdXRleF91bmxvY2socG11dGV4KTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHJ0d19saXN0X2RlbGV0ZShzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCkKIHsKIAlsaXN0X2RlbF9pbml0KHBsaXN0KTsKQEAgLTEyMiwxNyArMTA2LDYgQEAKICNkZWZpbmUgUlRXX0RFQ0xBUkVfVElNRVJfSERMKG5hbWUpIFwKIAl2b2lkIFJUV19USU1FUl9IRExfTkFNRShuYW1lKShSVFdfVElNRVJfSERMX0FSR1MpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfaW5pdF93b3JraXRlbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnB3b3JrLCB2b2lkICpwZnVuYywKLQkJCQkgIHZvaWQgKmNudHgpCi17Ci0JSU5JVF9XT1JLKHB3b3JrLCBwZnVuYyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfc2V0X3dvcmtpdGVtKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHdvcmspCi17Ci0Jc2NoZWR1bGVfd29yayhwd29yayk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfY2FuY2VsX3dvcmtpdGVtX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICpwd29yaykKIHsKIAljYW5jZWxfd29ya19zeW5jKHB3b3JrKTsKQEAgLTIzMCwxNSArMjAzLDkgQEAKIGV4dGVybiB1bnNpZ25lZCBjaGFyIFJTTl9US0lQX0NJUEhFUls0XTsKIAogI2RlZmluZSBydHdfdXBkYXRlX21lbV9zdGF0KGZsYWcsIHN6KSBkbyB7fSB3aGlsZSAoMCkKLXU4ICpfcnR3X3ZtYWxsb2ModTMyIHN6KTsKLXU4ICpfcnR3X3p2bWFsbG9jKHUzMiBzeik7Ci12b2lkIF9ydHdfdm1mcmVlKHU4ICpwYnVmLCB1MzIgc3opOwogdTggKl9ydHdfem1hbGxvYyh1MzIgc3opOwogdTggKl9ydHdfbWFsbG9jKHUzMiBzeik7CiB2b2lkIF9ydHdfbWZyZWUodTggKnBidWYsIHUzMiBzeik7Ci0jZGVmaW5lIHJ0d192bWFsbG9jKHN6KQkJCV9ydHdfdm1hbGxvYygoc3opKQotI2RlZmluZSBydHdfenZtYWxsb2Moc3opCQkJX3J0d196dm1hbGxvYygoc3opKQotI2RlZmluZSBydHdfdm1mcmVlKHBidWYsIHN6KQkJX3J0d192bWZyZWUoKHBidWYpLCAoc3opKQogI2RlZmluZSBydHdfbWFsbG9jKHN6KQkJCV9ydHdfbWFsbG9jKChzeikpCiAjZGVmaW5lIHJ0d196bWFsbG9jKHN6KQkJCV9ydHdfem1hbGxvYygoc3opKQogI2RlZmluZSBydHdfbWZyZWUocGJ1Ziwgc3opCQlfcnR3X21mcmVlKChwYnVmKSwgKHN6KSkKQEAgLTI0Nyw3ICsyMTQsNiBAQAogdm9pZCBydHdfbWZyZWUyZCh2b2lkICpwYnVmLCBpbnQgaCwgaW50IHcsIGludCBzaXplKTsKIAogdm9pZCBfcnR3X21lbWNweSh2b2lkICpkZWMsIHZvaWQgKnNvdXIsIHUzMiBzeik7Ci1pbnQgIF9ydHdfbWVtY21wKHZvaWQgKmRzdCwgdm9pZCAqc3JjLCB1MzIgc3opOwogdm9pZCBfcnR3X21lbXNldCh2b2lkICpwYnVmLCBpbnQgYywgdTMyIHN6KTsKIAogdm9pZCBfcnR3X2luaXRfbGlzdGhlYWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaAppbmRleCA2OTEyMzgwLi5kNzZjYzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKQEAgLTI4LDE4ICsyOCwyMCBAQAogdm9pZCBfcnR3X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7CiAKIAotczMyICBydHdfcmVjdl9lbnRyeSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1pbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnJlY3ZfZnJhbWUpOworczMyICBydHdfcmVjdl9lbnRyeShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworaW50IHJ0d19yZWN2X2luZGljYXRlcGt0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpyZWN2X2ZyYW1lKTsKIHZvaWQgcnR3X3JlY3ZfcmV0dXJucGFja2V0KHN0cnVjdCAgbmV0X2RldmljZSAqY254dCwgc3RydWN0IHNrX2J1ZmYgKnJldHBrdCk7CiAKLXZvaWQgcnR3X2hvc3RhcGRfbWxtZV9yeChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnJlY3ZfZnIpOwordm9pZCBydHdfaG9zdGFwZF9tbG1lX3J4KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZfZnIpOwogdm9pZCBydHdfaGFuZGxlX3RraXBfbWljX2VycihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJncm91cCk7CiAKIGludCBydHdfaW5pdF9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LCBzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCBydHdfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKIAogaW50IHJ0d19vc19yZWN2X3Jlc291cmNlX2luaXQoc3RydWN0IHJlY3ZfcHJpdiAqcmVjdnByLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpOwotaW50IHJ0d19vc19yZWN2X3Jlc291cmNlX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdW5pb24gcmVjdl9mcmFtZSAqcmVjdmZyKTsKK2ludCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCisJCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3Zmcik7CiB2b2lkIHJ0d19vc19yZWN2X3Jlc291cmNlX2ZyZWUoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKIAogaW50IHJ0d19vc19yZWN2YnVmX3Jlc291cmNlX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHJlY3ZfYnVmICpidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oCmluZGV4IDE2MWYxZTUuLjc1ZTQxYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmgKQEAgLTc2LDE3ICs3Niw2IEBACiAJKGxlMTZfdG9fY3B1KF9wRndIZHItPlNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDIzMDAgfHwJXAogCShsZTE2X3RvX2NwdShfcEZ3SGRyLT5TaWduYXR1cmUpJjB4RkZGMCkgPT0gMHg4OEUwKQogCi1lbnVtIGZpcm13YXJlX3NvdXJjZSB7Ci0JRldfU09VUkNFX0lNR19GSUxFID0gMCwKLQlGV19TT1VSQ0VfSEVBREVSX0ZJTEUgPSAxLAkJLyogZnJvbSBoZWFkZXIgZmlsZSAqLwotfTsKLQotc3RydWN0IHJ0X2Zpcm13YXJlIHsKLQllbnVtIGZpcm13YXJlX3NvdXJjZQllRldTb3VyY2U7Ci0JdTgJCQkqc3pGd0J1ZmZlcjsKLQl1MzIJCQl1bEZ3TGVuZ3RoOwotfTsKLQogLyogIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgY2FyZWZ1bCB3aXRoIGJ5dGUtb3JkZXJpbmcgKi8KIAogc3RydWN0IHJ0X2Zpcm13YXJlX2hkciB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaAppbmRleCBhOGZhY2YwLi4wN2U1ZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmgKQEAgLTYxLDkgKzYxLDEwIEBACiB2b2lkIHJ0bDgxODhldV9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCBydGw4MTg4ZXVfcmVjdl9oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmKTsKIHZvaWQgcnRsODE4OGV1X3JlY3ZfdGFza2xldCh2b2lkICpwcml2KTsKLXZvaWQgcnRsODE4OGVfcXVlcnlfcnhfcGh5X3N0YXR1cyh1bmlvbiByZWN2X2ZyYW1lICpmciwgc3RydWN0IHBoeV9zdGF0ICpwaHkpOwordm9pZCBydGw4MTg4ZV9xdWVyeV9yeF9waHlfc3RhdHVzKHN0cnVjdCByZWN2X2ZyYW1lICpmciwgc3RydWN0IHBoeV9zdGF0ICpwaHkpOwogdm9pZCBydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSk7Ci12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mb184OGUodW5pb24gcmVjdl9mcmFtZSAqZnJhLCBzdHJ1Y3QgcGh5X3N0YXQgKnBoeSk7Ci12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliXzg4ZSh1bmlvbiByZWN2X2ZyYW1lICpmcmEsIHN0cnVjdCByZWN2X3N0YXQgKnN0YXQpOwordm9pZCB1cGRhdGVfcmVjdmZyYW1lX3BoeWluZm9fODhlKHN0cnVjdCByZWN2X2ZyYW1lICpmcmEsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKK3ZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWJfODhlKHN0cnVjdCByZWN2X2ZyYW1lICpmcmEsCisJCQkJIHN0cnVjdCByZWN2X3N0YXQgKnN0YXQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaAppbmRleCBjNmIxOTNhLi5hZTA1MTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oCkBAIC05OSwyMCArOTksNiBAQAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9mdW5jX2VudGVyXwkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoR2xvYmFsRGVidWdMZXZlbCA+PSBfZHJ2X2RlYnVnXykJCQlcCi0JCQlwcl9pbmZvKCIlcyA6ICVzIGVudGVycyBhdCAlZFxuIiwJCVwKLQkJCQkgRFJJVkVSX1BSRUZJWCwgX19mdW5jX18sIF9fTElORV9fKTsJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX2Z1bmNfZXhpdF8JCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKEdsb2JhbERlYnVnTGV2ZWwgPj0gX2Rydl9kZWJ1Z18pCQkJXAotCQkJcHJfaW5mbygiJXMgOiAlcyBleGl0cyBhdCAlZFxuIiwJCVwKLQkJCQkgRFJJVkVSX1BSRUZJWCwgX19mdW5jX18sIF9fTElORV9fKTsJXAotCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgUlRfUFJJTlRfREFUQShfY29tcCwgX2xldmVsLCBfdGl0bGVzdHJpbmcsIF9oZXhkYXRhLCBfaGV4ZGF0YWxlbilcCiAJZG8gewkJCQkJCQkJXAogCQlpZiAoX2xldmVsIDw9IEdsb2JhbERlYnVnTGV2ZWwpIHsJCQlcCkBAIC0yNzcsMTQgKzI2Myw0IEBACiBpbnQgcHJvY19zZXRfcnNzaV9kaXNwKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CiAKLSNpZmRlZiBDT05GSUdfQlRfQ09FWElTVAotaW50IHByb2NfZ2V0X2J0Y29leF9kYmcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9idGNvZXhfZGJnKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCi0JCQlzaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfQlRfQ09FWElTVCAqLwotCiAjZW5kaWYJLyogX19SVFdfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvLmgKaW5kZXggM2QxZGZjYy4uZTg3OTBmOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvLmgKQEAgLTk5LDcgKzk5LDYgQEAKIAogc3RydWN0IGludGZfcHJpdjsKIHN0cnVjdCBpbnRmX2hkbDsKLXN0cnVjdCBpb19xdWV1ZTsKIAogc3RydWN0IF9pb19vcHMgewogCXU4ICgqX3JlYWQ4KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkcik7CkBAIC0xMTcsNyArMTE2LDYgQEAKIAkJCSAgdTggKnBtZW0pOwogCXZvaWQgKCpfd3JpdGVfbWVtKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwKIAkJCSAgIHU4ICpwbWVtKTsKLQl2b2lkICgqX3N5bmNfaXJwX3Byb3RvY29sX3J3KShzdHJ1Y3QgaW9fcXVldWUgKnBpb19xKTsKIAl1MzIgKCpfcmVhZF9pbnRlcnJ1cHQpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyKTsKIAl1MzIgKCpfcmVhZF9wb3J0KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwKIAkJCSAgdTggKnBtZW0pOwpAQCAtMjM3LDM0ICsyMzUsMTEgQEAKIEJlbG93IGlzIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IF9pb19oYW5kbGVyCiAqLwogCi1zdHJ1Y3QgaW9fcXVldWUgewotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfaW9yZXFzOwotCXN0cnVjdCBsaXN0X2hlYWQgcGVuZGluZzsJLyogVGhlIGlvX3JlcSBsaXN0IHRoYXQgd2lsbCBiZSBzZXJ2ZWQKLQkJCQkJICogaW4gdGhlIHNpbmdsZSBwcm90b2NvbCByZWFkL3dyaXRlLiovCi0Jc3RydWN0IGxpc3RfaGVhZCBwcm9jZXNzaW5nOwotCXU4CSpmcmVlX2lvcmVxc19idWY7IC8qICA0LWJ5dGUgYWxpZ25lZCAqLwotCXU4CSpwYWxsb2NhdGVkX2ZyZWVfaW9yZXFzX2J1ZjsKLQlzdHJ1Y3QJaW50Zl9oZGwJaW50ZjsKLX07Ci0KIHN0cnVjdCBpb19wcml2IHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXI7CiAJc3RydWN0IGludGZfaGRsIGludGY7CiB9OwogCi11aW50IGlvcmVxX2ZsdXNoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaW9fcXVldWUgKmlvcXVldWUpOwotdm9pZCBzeW5jX2lvcmVxX2VucXVldWUoc3RydWN0IGlvX3JlcSAqcHJlcSwgc3RydWN0IGlvX3F1ZXVlICppb3F1ZXVlKTsKLXVpbnQgc3luY19pb3JlcV9mbHVzaChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGlvX3F1ZXVlICppb3F1ZXVlKTsKLXVpbnQgZnJlZV9pb3JlcShzdHJ1Y3QgaW9fcmVxICpwcmVxLCBzdHJ1Y3QgaW9fcXVldWUgKnBpb19xdWV1ZSk7Ci1zdHJ1Y3QgaW9fcmVxICphbGxvY19pb3JlcShzdHJ1Y3QgaW9fcXVldWUgKnBpb19xKTsKLQotdWludCByZWdpc3Rlcl9pbnRmX2hkbCh1OCAqZGV2LCBzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsKTsKLXZvaWQgdW5yZWdpc3Rlcl9pbnRmX2hkbChzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsKTsKLQotdm9pZCBfcnR3X2F0dHJpYl9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnBtZW0pOwotdm9pZCBfcnR3X2F0dHJpYl93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICpwbWVtKTsKLQogdTggX3J0d19yZWFkOChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIpOwogdTE2IF9ydHdfcmVhZDE2KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkcik7CiB1MzIgX3J0d19yZWFkMzIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyKTsKQEAgLTM2MywyNSArMzM4LDYgQEAKIGludCBydHdfaW5pdF9pb19wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKIAkJICAgICB2b2lkICgqc2V0X2ludGZfb3BzKShzdHJ1Y3QgX2lvX29wcyAqcG9wcykpOwogCi11aW50IGFsbG9jX2lvX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgZnJlZV9pb19xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGFzeW5jX2J1c19pbyhzdHJ1Y3QgaW9fcXVldWUgKnBpb19xKTsKLXZvaWQgYnVzX3N5bmNfaW8oc3RydWN0IGlvX3F1ZXVlICpwaW9fcSk7Ci11MzIgX2lvcmVxMnJ3bWVtKHN0cnVjdCBpb19xdWV1ZSAqcGlvX3EpOwogdm9pZCBkZXZfcG93ZXJfZG93bihzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggYnB3cnVwKTsKIAotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnR3X3dyaXRlOChfYSwgX2IsIF9jKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnR3X3dyaXRlMTYoX2EsIF9iLCBfYykKLSNkZWZpbmUgUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShfYSwgX2IsIF9jKQkJXAotCXJ0d193cml0ZTMyKF9hLCBfYiwgX2MpCi0KLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDFCeXRlKF9hLCBfYikJCVwKLQkJcnR3X3JlYWQ4KF9hLCBfYikKLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDJCeXRlKF9hLCBfYikJCVwKLQkJcnR3X3JlYWQxNihfYSwgX2IpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1JlYWQ0Qnl0ZShfYSwgX2IpCQlcCi0JCXJ0d19yZWFkMzIoX2EsIF9iKQotCiAjZW5kaWYJLyogX1JUTDg3MTFfSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaAppbmRleCA4NzcyZDFkLi5mM2FhOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oCkBAIC0xMDIsOCArMTAyLDYgQEAKIAogI2lmIGRlZmluZWQoX1JUV19NUF9JT0NUTF9DXykKIHN0YXRpYyBpbnQgb2lkX251bGxfZnVuY3Rpb24oc3RydWN0IG9pZF9wYXJfcHJpdiAqcG9pZF9wYXJfcHJpdikgewotCV9mdW5jX2VudGVyXzsKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAppbmRleCA2Y2Q5ODhmLi40NWMyMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaApAQCAtMTA2LDEzICsxMDYsNiBAQAogI2RlZmluZSB0cmFmZmljX3RocmVzaG9sZAkxMAogI2RlZmluZQl0cmFmZmljX3NjYW5fcGVyaW9kCTUwMAogCi1zdHJ1Y3Qgc2l0ZXN1cnZleV9jdHJsIHsKLQl1NjQJbGFzdF90eF9wa3RzOwotCXVpbnQJbGFzdF9yeF9wa3RzOwotCWludAl0cmFmZmljX2J1c3k7Ci0Jc3RydWN0IHRpbWVyX2xpc3Qgc2l0ZXN1cnZleV9jdHJsX3RpbWVyOwotfTsKLQogc3RydWN0IHJ0X2xpbmtfZGV0ZWN0IHsKIAl1MzIJTnVtVHhPa0luUGVyaW9kOwogCXUzMglOdW1SeE9rSW5QZXJpb2Q7CkBAIC0zMDQsMzEgKzI5Nyw2IEBACiAJdTMyIG5vYV9zdGFydF90aW1lW1AyUF9NQVhfTk9BX05VTV07CiB9OwogCi1zdHJ1Y3QgdGRsc19zc19yZWNvcmQgewkvKiBzaWduYWwgc3RyZW5ndGggcmVjb3JkICovCi0JdTggbWFjYWRkcltFVEhfQUxFTl07Ci0JdTggUnhQV0RCQWxsOwotCXU4IGlzX3RkbHNfc3RhOwkvKiAgdHJ1ZTogZGlyZWN0IGxpbmsgc3RhLCBmYWxzZTogZWxzZSAqLwotfTsKLQotc3RydWN0IHRkbHNfaW5mbyB7Ci0JdTggYXBfcHJvaGliaXRlZDsKLQl1aW50IHNldHVwX3N0YXRlOwotCXU4IHN0YV9jbnQ7Ci0JdTggc3RhX21heGltdW07CS8qICAxOnRkbHMgc3RhIGlzIGVxdWFsIChOVU1fU1RBLTEpLCByZWFjaCBtYXggZGlyZWN0IGxpbmsgbnVtYmVyOyAwOiBlbHNlOyAqLwotCXN0cnVjdCB0ZGxzX3NzX3JlY29yZAlzc19yZWNvcmQ7Ci0JdTggbWFjaWRfaW5kZXg7CS8qIG1hY2lkIGVudHJ5IHRoYXQgaXMgcmVhZHkgdG8gd3JpdGUgKi8KLQl1OCBjbGVhcl9jYW07CS8qIGNhbSBlbnRyeSB0aGF0IGlzIHRyeWluZyB0byBjbGVhciwgdXNpbmcgaXQgaW4gZGlyZWN0IGxpbmsgdGVhcmRvd24gKi8KLQl1OCBjaF9zZW5zaW5nOwotCXU4IGN1cl9jaGFubmVsOwotCXU4IGNhbmRpZGF0ZV9jaDsKLQl1OCBjb2xsZWN0X3BrdF9udW1bTUFYX0NIQU5ORUxfTlVNXTsKLQlzcGlubG9ja190IGNtZF9sb2NrOwotCXNwaW5sb2NrX3QgaGRsX2xvY2s7Ci0JdTggd2F0Y2hkb2dfY291bnQ7Ci0JdTggZGV2X2Rpc2NvdmVyZWQ7CQkvKiBXRkRfVERMUzogZm9yIHNpZ21hIHRlc3QgKi8KLQl1OCBlbmFibGU7Ci19OwotCiBzdHJ1Y3QgbWxtZV9wcml2IHsKIAlzcGlubG9ja190IGxvY2s7CiAJaW50IGZ3X3N0YXRlOwkvKiBzaGFsbCB3ZSBwcm90ZWN0IHRoaXMgdmFyaWFibGU/IG1heWJlIG5vdCBuZWNlc3NhcmlseS4uLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCmluZGV4IGYwYzk4MmQuLjA5ZTJhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKQEAgLTIzNiwxMyArMjM2LDEzIEBACiBzdHJ1Y3QgbWxtZV9oYW5kbGVyIHsKIAl1bnNpZ25lZCBpbnQgICBudW07CiAJY2hhciAqc3RyOwotCXVuc2lnbmVkIGludCAoKmZ1bmMpKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdW5pb24gcmVjdl9mcmFtZSAqZnJhbWUpOworCXVuc2lnbmVkIGludCAoKmZ1bmMpKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHJlY3ZfZnJhbWUgKmZyYW1lKTsKIH07CiAKIHN0cnVjdCBhY3Rpb25faGFuZGxlciB7CiAJdW5zaWduZWQgaW50ICAgbnVtOwogCWNoYXIgKnN0cjsKLQl1bnNpZ25lZCBpbnQgKCpmdW5jKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHVuaW9uIHJlY3ZfZnJhbWUgKmZyYW1lKTsKKwl1bnNpZ25lZCBpbnQgKCpmdW5jKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCByZWN2X2ZyYW1lICpmcmFtZSk7CiB9OwogCiBzdHJ1Y3QJc3NfcmVzIHsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogdm9pZCBmbHVzaF9hbGxfY2FtX2VudHJ5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKIHZvaWQgc2l0ZV9zdXJ2ZXkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IGNvbGxlY3RfYnNzX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKK3U4IGNvbGxlY3RfYnNzX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCiAJCSAgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzaWQpOwogdm9pZCB1cGRhdGVfbmV0d29yayhzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjLAogCQkgICAgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgdXBkYXRlX2llKTsKQEAgLTU0NCw3ICs1NDQsOCBAQAogdW5zaWduZWQgaW50IHNob3VsZF9mb3JiaWRfbl9yYXRlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKIHZvaWQgcmVwb3J0X2pvaW5fcmVzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgaW50IHJlcyk7Ci12b2lkIHJlcG9ydF9zdXJ2ZXlfZXZlbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Cit2b2lkIHJlcG9ydF9zdXJ2ZXlfZXZlbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB2b2lkIHJlcG9ydF9zdXJ2ZXlkb25lX2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHJlcG9ydF9kZWxfc3RhX2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKIAkJCSAgdW5zaWduZWQgY2hhciAqYWRkciwgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKQEAgLTYwOSw0NiArNjEwLDQ2IEBACiB2b2lkIHN0YXJ0X2NyZWF0ZV9pYnNzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKIHVuc2lnbmVkIGludCBPbkFzc29jUmVxKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25Bc3NvY1JzcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uUHJvYmVSZXEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPblByb2JlUnNwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgRG9SZXNlcnZlZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQmVhY29uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQXRpbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uRGlzYXNzb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkF1dGhDbGllbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25EZUF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiAKIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fc3BjdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb25fcW9zKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uX2RscyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbl9iYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uX2h0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbl93bW0oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb25fcDJwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogCiB2b2lkIG1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIGludCBqb2luX3Jlcyk7CiB2b2lkIG1sbWVleHRfc3RhX2RlbF9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAppbmRleCA0YTBlOWZmLi45YTQyODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaApAQCAtMjA2LDEwICsyMDYsNiBAQAogCiAJdTgJCWJJbnRlcm5hbEF1dG9TdXNwZW5kOwogCXU4CQliSW5TdXNwZW5kOwotI2lmZGVmCUNPTkZJR19CVF9DT0VYSVNUCi0JdTgJCWJBdXRvUmVzdW1lOwotCXU4CQlhdXRvcG1fY250OwotI2VuZGlmCiAJdTgJCWJTdXBwb3J0UmVtb3RlV2FrZXVwOwogCXN0cnVjdCB0aW1lcl9saXN0IHB3cl9zdGF0ZV9jaGVja190aW1lcjsKIAlpbnQJCXB3cl9zdGF0ZV9jaGVja19pbnRlcnZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKaW5kZXggYmU5YzMwYy4uYmNiY2U0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKQEAgLTI3MCw3ICsyNzAsNyBAQAogCWxlbiA9ICh1bnNpZ25lZCBpbnQgKSh0YWlsIC0gZGF0YSk7CiAKICovCi1zdHJ1Y3QgcmVjdl9mcmFtZV9oZHIgeworc3RydWN0IHJlY3ZfZnJhbWUgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3Qgc2tfYnVmZgkgKnBrdDsKIAlzdHJ1Y3Qgc2tfYnVmZgkgKnBrdF9uZXdhbGxvYzsKQEAgLTI4OSwyMyArMjg5LDE2IEBACiAJc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwogfTsKIAotdW5pb24gcmVjdl9mcmFtZSB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JCXN0cnVjdCByZWN2X2ZyYW1lX2hkciBoZHI7Ci0JCXVpbnQgbWVtW1JFQ1ZGUkFNRV9IRFJfQUxJR04+PjJdOwotCX0gdTsKLX07Ci0KLXVuaW9uIHJlY3ZfZnJhbWUgKl9ydHdfYWxsb2NfcmVjdmZyYW1lKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKLXVuaW9uIHJlY3ZfZnJhbWUgKnJ0d19hbGxvY19yZWN2ZnJhbWUoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwotdm9pZCBydHdfaW5pdF9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKK3N0cnVjdCByZWN2X2ZyYW1lICpfcnR3X2FsbG9jX3JlY3ZmcmFtZShzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSk7CitzdHJ1Y3QgcmVjdl9mcmFtZSAqcnR3X2FsbG9jX3JlY3ZmcmFtZShzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSk7Cit2b2lkIHJ0d19pbml0X3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKIAkJCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7Ci1pbnQgIHJ0d19mcmVlX3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAoraW50ICBydHdfZnJlZV9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCiAJCQlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSk7CiAjZGVmaW5lIHJ0d19kZXF1ZXVlX3JlY3ZmcmFtZShxdWV1ZSkgcnR3X2FsbG9jX3JlY3ZmcmFtZShxdWV1ZSkKLWludCBfcnR3X2VucXVldWVfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSk7Ci1pbnQgcnR3X2VucXVldWVfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSk7CitpbnQgX3J0d19lbnF1ZXVlX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKKwkJCSAgIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSk7CitpbnQgcnR3X2VucXVldWVfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpOwogdm9pZCBydHdfZnJlZV9yZWN2ZnJhbWVfcXVldWUoc3RydWN0IF9fcXVldWUgKnBmcmFtZXF1ZXVlLAogCQkJICAgICAgc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwogdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMzE1LDI5ICszMDgsMjAgQEAKIAogdm9pZCBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlcih2b2lkICpwY29udGV4dCk7CiAKLXN0YXRpYyBpbmxpbmUgdTggKmdldF9yeG1lbSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQorc3RhdGljIGlubGluZSB1OCAqZ2V0X3J4bWVtKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewogCS8qIGFsd2F5cyByZXR1cm4gcnhfaGVhZC4uLiAqLwogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5yeF9oZWFkOworCXJldHVybiBwcmVjdmZyYW1lLT5yeF9oZWFkOwogfQogCi1zdGF0aWMgaW5saW5lIHU4ICpnZXRfcnhfc3RhdHVzKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCitzdGF0aWMgaW5saW5lIHU4ICpnZXRfcnhfc3RhdHVzKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewogCXJldHVybiBnZXRfcnhtZW0ocHJlY3ZmcmFtZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggKmdldF9yZWN2ZnJhbWVfZGF0YSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewotCS8qIGFsd2F5cyByZXR1cm4gcnhfZGF0YSAqLwotCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdXNoKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKK3N0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdXNoKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCiB7CiAJLyogIGFwcGVuZCBkYXRhIGJlZm9yZSByeF9kYXRhICovCiAKQEAgLTM0OCwxNiArMzMyLDE2IEBACiAgKi8KIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhIC09IHN6IDsKLQlpZiAocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSA8IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2hlYWQpIHsKLQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSArPSBzejsKKwlwcmVjdmZyYW1lLT5yeF9kYXRhIC09IHN6OworCWlmIChwcmVjdmZyYW1lLT5yeF9kYXRhIDwgcHJlY3ZmcmFtZS0+cnhfaGVhZCkgeworCQlwcmVjdmZyYW1lLT5yeF9kYXRhICs9IHN6OwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcHJlY3ZmcmFtZS0+dS5oZHIubGVuICs9IHN6OwotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhOworCXByZWN2ZnJhbWUtPmxlbiArPSBzejsKKwlyZXR1cm4gcHJlY3ZmcmFtZS0+cnhfZGF0YTsKIH0KIAotc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1bGwodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQorc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1bGwoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKIHsKIAkvKiAgcnhfZGF0YSArPSBzejsgbW92ZSByeF9kYXRhIHN6IGJ5dGVzICBoZXJlYWZ0ZXIgKi8KIApAQCAtMzY2LDE2ICszNTAsMTYgQEAKIAogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgKz0gc3o7Ci0JaWYgKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgPiBwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsKSB7Ci0JCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgLT0gc3o7CisJcHJlY3ZmcmFtZS0+cnhfZGF0YSArPSBzejsKKwlpZiAocHJlY3ZmcmFtZS0+cnhfZGF0YSA+IHByZWN2ZnJhbWUtPnJ4X3RhaWwpIHsKKwkJcHJlY3ZmcmFtZS0+cnhfZGF0YSAtPSBzejsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiAtPSBzejsKLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YTsKKwlwcmVjdmZyYW1lLT5sZW4gLT0gc3o7CisJcmV0dXJuIHByZWN2ZnJhbWUtPnJ4X2RhdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdXQodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQorc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1dChzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQogewogCS8qIHVzZWQgZm9yIGFwcGVuZCBzeiBieXRlcyBmcm9tIHB0ciB0byByeF90YWlsLCB1cGRhdGUgcnhfdGFpbAogCSAqIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgcnhfdGFpbCB0byB0aGUgY2FsbGVyICovCkBAIC0zODQsMTcgKzM2OCwxNyBAQAogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCArPSBzejsKKwlwcmVjdmZyYW1lLT5yeF90YWlsICs9IHN6OwogCi0JaWYgKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgPiBwcmVjdmZyYW1lLT51Lmhkci5yeF9lbmQpIHsKLQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCAtPSBzejsKKwlpZiAocHJlY3ZmcmFtZS0+cnhfdGFpbCA+IHByZWN2ZnJhbWUtPnJ4X2VuZCkgeworCQlwcmVjdmZyYW1lLT5yeF90YWlsIC09IHN6OwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcHJlY3ZmcmFtZS0+dS5oZHIubGVuICs9IHN6OwotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsOworCXByZWN2ZnJhbWUtPmxlbiArPSBzejsKKwlyZXR1cm4gcHJlY3ZmcmFtZS0+cnhfdGFpbDsKIH0KIAotc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1bGxfdGFpbCh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCitzdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHVsbF90YWlsKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCiB7CiAJLyogIHJtdiBkYXRhIGZyb20gcnhfdGFpbCAoYnkgeWl0c2VuKSAqLwogCkBAIC00MDQsNjQgKzM4OCwxMyBAQAogCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCAtPSBzejsKLQlpZiAocHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCA8IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEpIHsKLQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCArPSBzejsKKwlwcmVjdmZyYW1lLT5yeF90YWlsIC09IHN6OworCWlmIChwcmVjdmZyYW1lLT5yeF90YWlsIDwgcHJlY3ZmcmFtZS0+cnhfZGF0YSkgeworCQlwcmVjdmZyYW1lLT5yeF90YWlsICs9IHN6OwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcHJlY3ZmcmFtZS0+dS5oZHIubGVuIC09IHN6OwotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKmdldF9yeGJ1Zl9kZXNjKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0JdW5zaWduZWQgY2hhciAqYnVmX2Rlc2M7Ci0KLQlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gYnVmX2Rlc2M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5pb24gcmVjdl9mcmFtZSAqcnhtZW1fdG9fcmVjdmZyYW1lKHU4ICpyeG1lbSkKLXsKLQkvKiBkdWUgdG8gdGhlIGRlc2lnbiBvZiAyMDQ4IGJ5dGVzIGFsaWdubWVudCBvZiByZWN2X2ZyYW1lLAotCSAqIHdlIGNhbiByZWZlcmVuY2UgdGhlIHVuaW9uIHJlY3ZfZnJhbWUgKi8KLQkvKiBmcm9tIGFueSBnaXZlbiBtZW1iZXIgb2YgcmVjdl9mcmFtZS4gKi8KLQkvKiAgcnhtZW0gaW5kaWNhdGVzIHRoZSBhbnkgbWVtYmVyL2FkZHJlc3MgaW4gcmVjdl9mcmFtZSAqLwotCi0JcmV0dXJuICh1bmlvbiByZWN2X2ZyYW1lICopKCgoc2l6ZV90KXJ4bWVtID4+IFJYRlJBTUVfQUxJR04pIDw8IFJYRlJBTUVfQUxJR04pOwotfQotCi1zdGF0aWMgaW5saW5lIHVuaW9uIHJlY3ZfZnJhbWUgKnBrdF90b19yZWN2ZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnBrdCkKLXsKLQl1OCAqYnVmX3N0YXI7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWU7Ci0JcHJlY3ZfZnJhbWUgPSByeG1lbV90b19yZWN2ZnJhbWUoKHVuc2lnbmVkIGNoYXIgKilidWZfc3Rhcik7Ci0KLQlyZXR1cm4gcHJlY3ZfZnJhbWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggKnBrdF90b19yZWN2bWVtKHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0JLyogIHJldHVybiB0aGUgcnhfaGVhZCAqLwotCi0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUgPSBwa3RfdG9fcmVjdmZyYW1lKHBrdCk7Ci0KLQlyZXR1cm4JcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2hlYWQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggKnBrdF90b19yZWN2ZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCS8qICByZXR1cm4gdGhlIHJ4X2RhdGEgKi8KLQotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lID0gcGt0X3RvX3JlY3ZmcmFtZShwa3QpOwotCi0JcmV0dXJuCXByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRfcmVjdmZyYW1lX2xlbih1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5sZW47CisJcHJlY3ZmcmFtZS0+bGVuIC09IHN6OworCXJldHVybiBwcmVjdmZyYW1lLT5yeF90YWlsOwogfQogCiBzdGF0aWMgaW5saW5lIHMzMiB0cmFuc2xhdGVfcGVyY2VudGFnZV90b19kYm0odTMyIHNpZ19zdHJlbl9pbmRleCkKQEAgLTQ4MCw2ICs0MTMsNiBAQAogCiB2b2lkIF9ydHdfaW5pdF9zdGFfcmVjdl9wcml2KHN0cnVjdCBzdGFfcmVjdl9wcml2ICpwc3RhX3JlY3Zwcml2KTsKIAotdm9pZCAgbWd0X2Rpc3BhdGNoZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Cit2b2lkICBtZ3RfZGlzcGF0Y2hlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d194bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaAppbmRleCAxYWMxZGQzLi42MmY1ZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaApAQCAtMTA1LDExICsxMDUsNiBAQAogCV9fbGUzMiB0eGR3NzsKIH07CiAKLXVuaW9uIHR4ZGVzYyB7Ci0Jc3RydWN0IHR4X2Rlc2MgdHhkZXNjOwotCXVuc2lnbmVkIGludCB2YWx1ZVtUWERFU0NfU0laRT4+Ml07Ci19OwotCiBzdHJ1Y3QJaHdfeG1pdAl7CiAJc3RydWN0IF9fcXVldWUgKnN0YV9xdWV1ZTsKIAlpbnQJYWNjbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaAppbmRleCAyZTczMDdmLi5hODhlYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKQEAgLTY5NCw3ICs2OTQsNyBAQAogCiBzdHJ1Y3QgQUREQkFfcmVxdWVzdCB7CiAJdW5zaWduZWQgY2hhcglkaWFsb2dfdG9rZW47Ci0JdW5zaWduZWQgc2hvcnQJQkFfcGFyYV9zZXQ7CisJX19sZTE2CQlCQV9wYXJhX3NldDsKIAl1bnNpZ25lZCBzaG9ydAlCQV90aW1lb3V0X3ZhbHVlOwogCXVuc2lnbmVkIHNob3J0CUJBX3N0YXJ0aW5nX3NlcWN0cmw7CiB9IF9fcGFja2VkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKaW5kZXggNGFkODBhZS4uMjYzNmU3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCkBAIC0zNSw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxydHdfbXAuaD4KICNpbmNsdWRlIDxydHdfaW9sLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkoU0lPQ0lXRklSU1RQUklWICsgMzApCiAKQEAgLTQ3Miw4ICs0NzMsNiBAQAogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gKnB3ZGluZm8gPSAmcGFkYXB0ZXItPndkaW5mbzsKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAotX2Z1bmNfZW50ZXJfOwotCiAJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKIAlwYXJhbS0+dS5jcnlwdC5hbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CiAKQEAgLTYxNCw5ICs2MTMsNiBAQAogZXhpdDoKIAogCWtmcmVlKHB3ZXApOwotCi1fZnVuY19leGl0XzsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc3MCw4ICs3NjYsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiY21kX2NvZGUgPSV4XG4iLCBpbmZvLT5jbWQpKTsKIAotCV9mdW5jX2VudGVyXzsKLQogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRHxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgPT0gdHJ1ZSkgewogCQkvKiBwYXJzaW5nIEhUX0NBUF9JRSAqLwogCQlwID0gcnR3X2dldF9pZSgmcGN1cl9ic3MtPklFc1sxMl0sIF9IVF9DQVBBQklMSVRZX0lFXywgJmh0X2llbGVuLCBwY3VyX2Jzcy0+SUVMZW5ndGgtMTIpOwpAQCAtODA2LDkgKzgwMCw2IEBACiAJfSBlbHNlIHsKIAkJc25wcmludGYod3JxdS0+bmFtZSwgSUZOQU1TSVosICJ1bmFzc29jaWF0ZWQiKTsKIAl9Ci0KLQlfZnVuY19leGl0XzsKLQogCXJldHVybiAwOwogfQogCkBAIC04MTYsMTIgKzgwNyw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sICgiK3J0d193eF9zZXRfZnJlcVxuIikpOwotCi0JX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODU0LDggKzg0MCw2IEBACiAJZW51bSBuZGlzXzgwMl8xMV9uZXR3b3JrX2luZnJhIG5ldHdvcmtUeXBlOwogCWludCByZXQgPSAwOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJaWYgKF9GQUlMID09IHJ0d19wd3Jfd2FrZXVwKHBhZGFwdGVyKSkgewogCQlyZXQgPSAtRVBFUk07CiAJCWdvdG8gZXhpdDsKQEAgLTg5NCw3ICs4NzgsNiBAQAogCX0KIAlydHdfc2V0b3Btb2RlX2NtZChwYWRhcHRlciwgbmV0d29ya1R5cGUpOwogZXhpdDoKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MDYsOCArODg5LDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoIiBydHdfd3hfZ2V0X21vZGVcbiIpKTsKIAotCV9mdW5jX2VudGVyXzsKLQogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKIAkJd3JxdS0+bW9kZSA9IElXX01PREVfSU5GUkE7CiAJZWxzZSBpZiAgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB8fApAQCAtOTE4LDggKzg5OSw2IEBACiAJZWxzZQogCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9BVVRPOwogCi0JX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAxMSw4ICs5OTAsNiBAQAogCXUxNiB2YWw7CiAJaW50IGk7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfZ2V0X3JhbmdlLiBjbWRfY29kZSA9JXhcbiIsIGluZm8tPmNtZCkpOwogCiAJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2YoKnJhbmdlKTsKQEAgLTEwOTMsOCArMTA3MCw2IEBACiAJcmFuZ2UtPnNjYW5fY2FwYSA9IElXX1NDQU5fQ0FQQV9FU1NJRCB8IElXX1NDQU5fQ0FQQV9UWVBFIHwKIAkJCSAgIElXX1NDQU5fQ0FQQV9CU1NJRCB8IElXX1NDQU5fQ0FQQV9DSEFOTkVMIHwKIAkJCSAgIElXX1NDQU5fQ0FQQV9NT0RFIHwgSVdfU0NBTl9DQVBBX1JBVEU7Ci0JX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExOCw4ICsxMDkzLDYgQEAKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpwbmV0d29yayA9IE5VTEw7CiAJZW51bSBuZGlzXzgwMl8xMV9hdXRoX21vZGUJYXV0aG1vZGU7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlpZiAoX0ZBSUwgPT0gcnR3X3B3cl93YWtldXAocGFkYXB0ZXIpKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIGV4aXQ7CkBAIC0xMTM4LDE1ICsxMTExLDE1IEBACiAJYXV0aG1vZGUgPSBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZTsKIAlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwaGVhZCk7CisJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcG1sbWVwcml2LT5wc2Nhbm5lZCkpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBtbG1lcHJpdi0+cHNjYW5uZWQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbWxtZXByaXYtPnBzY2FubmVkLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAotCQlwbWxtZXByaXYtPnBzY2FubmVkID0gZ2V0X25leHQocG1sbWVwcml2LT5wc2Nhbm5lZCk7CisJCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBwbWxtZXByaXYtPnBzY2FubmVkLT5uZXh0OwogCiAJCWRzdF9ic3NpZCA9IHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3M7CiAKQEAgLTExNzMsOCArMTE0Niw2IEBACiAKIGV4aXQ6CiAKLQlfZnVuY19leGl0XzsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExOTIsMTcgKzExNjMsMTIgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d193eF9nZXRfd2FwXG4iKSk7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlpZiAoKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpID09IHRydWUpIHx8CiAJICAgICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgPT0gdHJ1ZSkgfHwKIAkgICAgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpID09IHRydWUpKQogCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBwY3VyX2Jzcy0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOwogCWVsc2UKIAkJX3J0d19tZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7Ci0KLQlfZnVuY19leGl0XzsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMjUyLDcgKzEyMTgsNiBAQAogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d193eF9zZXRfc2NhblxuIikpOwogCi1fZnVuY19lbnRlcl87CiAJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSA9PSAxKSB7CiAJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKIAkJCXJldCA9IC0xOwpAQCAtMTM4Myw3ICsxMzQ4LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQwNyw4ICsxMzcxLDYgQEAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfZ2V0X3NjYW5cbiIpKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9pbmZvXywgKCIgU3RhcnQgb2YgUXVlcnkgU0lPQ0dJV1NDQU4gLlxuIikpOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5icmZvZmZieWh3ICYmIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CkBAIC0xNDQwLDcgKzE0MDIsNyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkKQEAgLTE0NTEsMTMgKzE0MTMsMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQkvKiByZXBvcnQgbmV0d29yayBvbmx5IGlmIHRoZSBjdXJyZW50IGNoYW5uZWwgc2V0IGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIHdoaWNoIHRoaXMgbmV0d29yayBiZWxvbmdzICovCiAJCWlmIChydHdfY2hfc2V0X3NlYXJjaF9jaChwYWRhcHRlci0+bWxtZWV4dHByaXYuY2hhbm5lbF9zZXQsIHBuZXR3b3JrLT5uZXR3b3JrLkNvbmZpZ3VyYXRpb24uRFNDb25maWcpID49IDApCiAJCQlldiA9IHRyYW5zbGF0ZV9zY2FuKHBhZGFwdGVyLCBhLCBwbmV0d29yaywgZXYsIHN0b3ApOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0xNDY2LDcgKzE0MjgsNiBAQAogCXdycXUtPmRhdGEuZmxhZ3MgPSAwOwogCiBleGl0OgotCV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0OTAsNyArMTQ1MSw2IEBACiAKIAl1aW50IHJldCA9IDAsIGxlbjsKIAotCV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2luZm9fLAogCQkgKCIrcnR3X3d4X3NldF9lc3NpZDogZndfc3RhdGUgPSAweCUwOHhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKQEAgLTE1MzAsNyArMTQ5MCw3IEBACiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2luZm9fLCAoInJ0d193eF9zZXRfZXNzaWQ6IHNzaWQgPVslc11cbiIsIHNyY19zc2lkKSk7CiAJCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwogCSAgICAgICBwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCSAgICAgIHBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwaGVhZCk7CisJICAgICAgcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBoZWFkLT5uZXh0OwogCiAJCXdoaWxlICgxKSB7CiAJCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBtbG1lcHJpdi0+cHNjYW5uZWQpID09IHRydWUpIHsKQEAgLTE1NDAsOSArMTUwMCw5IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocG1sbWVwcml2LT5wc2Nhbm5lZCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbWxtZXByaXYtPnBzY2FubmVkLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAotCQkJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IGdldF9uZXh0KHBtbG1lcHJpdi0+cHNjYW5uZWQpOworCQkJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBtbG1lcHJpdi0+cHNjYW5uZWQtPm5leHQ7CiAKIAkJCWRzdF9zc2lkID0gcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkOwogCkBAIC0xNTgzLDcgKzE1NDMsNiBAQAogCiAJREJHXzg4RSgiPD0lcywgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1OTksNyArMTU1OCw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfZ2V0X2Vzc2lkXG4iKSk7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgfHwKIAkgICAgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpKSB7CkBAIC0xNjE3LDcgKzE1NzUsNiBAQAogCiBleGl0OgogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYzNCw3ICsxNTkxLDYgQEAKIAl1MzIJcmF0ZXZhbHVlID0gMDsKIAkgdTggbXBkYXRhcmF0ZVtOdW1SYXRlc10gPSB7MTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwLCAweGZmfTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiIHJ0d193eF9zZXRfcmF0ZVxuIikpOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2luZm9fLCAoInRhcmdldF9yYXRlID0gJWQsIGZpeGVkID0gJWRcbiIsIHRhcmdldF9yYXRlLCBmaXhlZCkpOwpAQCAtMTcwNiw3ICsxNjYyLDYgQEAKIAkJcmV0ID0gLTE7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNzM0LDcgKzE2ODksNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHdycXUtPnJ0cy5kaXNhYmxlZCkgewogCQlwYWRhcHRlci0+cmVnaXN0cnlwcml2LnJ0c190aHJlc2ggPSAyMzQ3OwpAQCAtMTc0OCw3ICsxNzAyLDYgQEAKIAogCURCR184OEUoIiVzLCBydHNfdGhyZXNoID0lZFxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaCk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiAwOwogfQpAQCAtMTc1OSw3ICsxNzEyLDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKIAotCV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIiVzLCBydHNfdGhyZXNoID0lZFxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaCk7CiAKQEAgLTE3NjcsNyArMTcxOSw2IEBACiAJd3JxdS0+cnRzLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KIAkvKiB3cnF1LT5ydHMuZGlzYWJsZWQgPSAod3JxdS0+cnRzLnZhbHVlID09IERFRkFVTFRfUlRTX1RIUkVTSE9MRCk7ICovCiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiAwOwogfQpAQCAtMTc3OCw3ICsxNzI5LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKSB7CiAJCXBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbiA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKQEAgLTE3OTIsNyArMTc0Miw2IEBACiAKIAlEQkdfODhFKCIlcywgZnJhZ19sZW4gPSVkXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXItPnhtaXRwcml2LmZyYWdfbGVuKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODAzLDE0ICsxNzUyLDEyIEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCIlcywgZnJhZ19sZW4gPSVkXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXItPnhtaXRwcml2LmZyYWdfbGVuKTsKIAogCXdycXUtPmZyYWcudmFsdWUgPSBwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW47CiAJd3JxdS0+ZnJhZy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiAwOwogfQpAQCAtMTg0NCw3ICsxNzkxLDYgQEAKIAogCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewogCQlEQkdfODhFKCJFbmNyeXB0aW9uRGlzYWJsZWRcbiIpOwpAQCAtMTkzOSw3ICsxODg1LDYgQEAKIAogZXhpdDoKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE5NTMsNyArMTg5OCw2IEBACiAJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKIAlzdHJ1Y3QJbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmKHBhZGFwdGVyLT5tbG1lcHJpdik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpICE9IHRydWUpIHsKIAkJaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7CkBAIC0yMDA3LDcgKzE5NTEsNiBAQAogCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKIAkJYnJlYWs7CiAJfQotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIyMTAsNiArMjE1Myw3IEBACiAJdTMyIGRhdGEzMjsKIAl1MzIgYnl0ZXM7CiAJdTggKnB0bXA7CisJaW50IHJ2OwogCiAJcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKIAlwID0gJndycXUtPmRhdGE7CkBAIC0yMjI1LDcgKzIxNjksMTEgQEAKIAogCWJ5dGVzID0gMDsKIAlhZGRyID0gMDsKLQlzc2NhbmYocHRtcCwgIiVkLCV4IiwgJmJ5dGVzLCAmYWRkcik7CisJcnYgPSBzc2NhbmYocHRtcCwgIiVkLCV4IiwgJmJ5dGVzLCAmYWRkcik7CisJaWYgKHJ2ICE9IDIpIHsKKwkJa2ZyZWUocHRtcCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXN3aXRjaCAoYnl0ZXMpIHsKIAljYXNlIDE6CkBAIC0yMjU1LDYgKzIyMDMsNyBAQAogCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOworCWludCBydjsKIAogCXUzMiBhZGRyOwogCXUzMiBkYXRhMzI7CkBAIC0yMjYzLDcgKzIyMTIsOSBAQAogCWJ5dGVzID0gMDsKIAlhZGRyID0gMDsKIAlkYXRhMzIgPSAwOwotCXNzY2FuZihleHRyYSwgIiVkLCV4LCV4IiwgJmJ5dGVzLCAmYWRkciwgJmRhdGEzMik7CisJcnYgPSBzc2NhbmYoZXh0cmEsICIlZCwleCwleCIsICZieXRlcywgJmFkZHIsICZkYXRhMzIpOworCWlmIChydiAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN3aXRjaCAoYnl0ZXMpIHsKIAljYXNlIDE6CkBAIC0yNjA3LDEzICsyNTU4LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCWlmIChod2FkZHJfYXRvbl9pKGRhdGEsIGJzc2lkKSkgewogCQkJREJHXzg4RSgiSW52YWxpZCBCU1NJRCAnJXMnLlxuIiwgKHU4ICopZGF0YSk7CkBAIC0yNjM4LDcgKzI1ODksNyBAQAogCQkJfQogCQl9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTI2OTAsMTMgKzI2NDEsMTMgQEAKIAlzdHJ1Y3QgaXdfcG9pbnQgKnBkYXRhID0gJndycXUtPmRhdGE7CiAJdTMyICAgdTMyd3BzX3N0YXJ0ID0gMDsKIAotCXJldCA9IGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnUzMndwc19zdGFydCwgcGRhdGEtPnBvaW50ZXIsIDQpOwotCWlmIChyZXQpIHsKKwlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgfHwgKHBkYXRhID09IE5VTEwpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgfHwgKHBkYXRhID09IE5VTEwpKSB7CisJcmV0ID0gY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdTMyd3BzX3N0YXJ0LCBwZGF0YS0+cG9pbnRlciwgNCk7CisJaWYgKHJldCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzExMCwxMyArMzA2MSwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGVlck1BQywgRVRIX0FMRU4pKSB7CiAJCQl1OCAqd3BzaWU7CiAJCQl1aW50IHdwc2llX2xlbiA9IDA7CkBAIC0zMTM0LDcgKzMwODUsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCX0KLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTMxODAsMTMgKzMxMzEsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBlZXJNQUMsIEVUSF9BTEVOKSkgewogCQkJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExLzA1LzE4ICovCiAJCQkvKglNYXRjaCB0aGUgZGV2aWNlIGFkZHJlc3MgbG9jYXRlZCBpbiB0aGUgUDJQIElFICovCkBAIC0zMjE1LDcgKzMxNjYsNyBAQAogCQkJfQogCSAgICAgfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zMjY0LDEzICszMjE1LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwZWVyTUFDLCBFVEhfQUxFTikpIHsKIAkJCXU4ICp3cHNpZTsKIAkJCXVpbnQgd3BzaWVfbGVuID0gMDsKQEAgLTMyOTUsNyArMzI0Niw3IEBACiAJCQlicmVhazsKIAkgICAgIH0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzM0MywxMyArMzI5NCwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGVlck1BQywgRVRIX0FMRU4pKSB7CiAJCQl1OCAqd3BzaWU7CiAJCQl1aW50IHdwc2llX2xlbiA9IDA7CkBAIC0zMzY2LDcgKzMzMTcsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzQxNCwxMyArMzM2NSwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGVlck1BQywgRVRIX0FMRU4pKSB7CiAJCQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTIxMjI2ICovCiAJCQkvKglNYXRjaCB0aGUgZGV2aWNlIGFkZHJlc3MgbG9jYXRlZCBpbiB0aGUgUDJQIElFICovCkBAIC0zNDQwLDcgKzMzOTEsNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzQ5NiwxOSArMzQ0NywxOSBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGVlck1BQywgRVRIX0FMRU4pKSB7CiAJCQl1aW50UGVlckNoYW5uZWwgPSBwbmV0d29yay0+bmV0d29yay5Db25maWd1cmF0aW9uLkRTQ29uZmlnOwogCQkJYnJlYWs7CiAJCX0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzU5MSwxMyArMzU0MiwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEvMDUvMTggKi8KIAkJLyoJTWF0Y2ggdGhlIGRldmljZSBhZGRyZXNzIGxvY2F0ZWQgaW4gdGhlIFAyUCBJRSAqLwpAQCAtMzYyMiw3ICszNTczLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTM3NDEsNyArMzY5Miw3IEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCkBAIC0zNzUwLDcgKzM3MDEsNyBAQAogCQlpZiAodWludFBlZXJDaGFubmVsICE9IDApCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMS8wNS8xOCAqLwogCQkvKglNYXRjaCB0aGUgZGV2aWNlIGFkZHJlc3MgbG9jYXRlZCBpbiB0aGUgUDJQIElFICovCkBAIC0zNzgxLDcgKzM3MzIsNyBAQAogCQkJfQogCQl9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTM5MTQsMjQgKzM4NjUsMzMgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChwYWRhcHRlci0+YlNob3dHZXRQMlBTdGF0ZSkKLQkJREJHXzg4RSgiWyVzXSBleHRyYSA9ICVzXG4iLCBfX2Z1bmNfXywgKGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIpOwotCWlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgInN0YXR1cyIsIDYpKSB7CisJCURCR184OEUoIlslc10gZXh0cmEgPSAlc1xuIiwgX19mdW5jX18sCisJCQkoY2hhciBfX3VzZXIgKil3cnF1LT5kYXRhLnBvaW50ZXIpOworCWlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkic3RhdHVzIiwgNikpIHsKIAkJcnR3X3AycF9nZXRfc3RhdHVzKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJyb2xlIiwgNCkpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJyb2xlIiwgNCkpIHsKIAkJcnR3X3AycF9nZXRfcm9sZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAicGVlcl9pZmEiLCA4KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJInBlZXJfaWZhIiwgOCkpIHsKIAkJcnR3X3AycF9nZXRfcGVlcl9pZmFkZHIoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgInJlcV9jbSIsIDYpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkicmVxX2NtIiwgNikpIHsKIAkJcnR3X3AycF9nZXRfcmVxX2NtKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJwZWVyX2RldmEiLCA5KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJInBlZXJfZGV2YSIsIDkpKSB7CiAJCS8qCUdldCB0aGUgUDJQIGRldmljZSBhZGRyZXNzIHdoZW4gcmVjZWl2aW5nIHRoZSBwcm92aXNpb24gZGlzY292ZXJ5IHJlcXVlc3QgZnJhbWUuICovCiAJCXJ0d19wMnBfZ2V0X3BlZXJfZGV2YWRkcihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAiZ3JvdXBfaWQiLCA4KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJImdyb3VwX2lkIiwgOCkpIHsKIAkJcnR3X3AycF9nZXRfZ3JvdXBpZChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAicGVlcl9kZXZhX2ludiIsIDkpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkicGVlcl9kZXZhX2ludiIsIDkpKSB7CiAJCS8qCUdldCB0aGUgUDJQIGRldmljZSBhZGRyZXNzIHdoZW4gcmVjZWl2aW5nIHRoZSBQMlAgSW52aXRhdGlvbiByZXF1ZXN0IGZyYW1lLiAqLwogCQlydHdfcDJwX2dldF9wZWVyX2RldmFkZHJfYnlfaW52aXRhdGlvbihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAib3BfY2giLCA1KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJIm9wX2NoIiwgNSkpIHsKIAkJcnR3X3AycF9nZXRfb3BfY2goZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CiAJfQogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwpAQCAtMzk0NSw3ICszOTA1LDggQEAKIAlpbnQgcmV0ID0gMDsKIAogI2lmZGVmIENPTkZJR184OEVVX1AyUAotCURCR184OEUoIlslc10gZXh0cmEgPSAlc1xuIiwgX19mdW5jX18sIChjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlEQkdfODhFKCJbJXNdIGV4dHJhID0gJXNcbiIsIF9fZnVuY19fLAorCQkJKGNoYXIgX191c2VyICopd3JxdS0+ZGF0YS5wb2ludGVyKTsKIAlpZiAoIW1lbWNtcChleHRyYSwgIndwc0NNID0iLCA2KSkgewogCQl3cnF1LT5kYXRhLmxlbmd0aCAtPSA2OwogCQlydHdfcDJwX2dldF93cHNfY29uZmlnbWV0aG9kKGRldiwgaW5mbywgd3JxdSwgICZleHRyYVs2XSk7CkBAIC00NDM2LDEyICs0Mzk3LDEyIEBACiAKIAkJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKSB7CiAJCQkJCXBoZWFkID0gJihwc3RhcHJpdi0+c3RhX2hhc2hbaV0pOwotCQkJCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJCQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQkJCQl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCQkJCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKKwkJCQkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKIAotCQkJCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQkJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQkJCQlpZiAoZXh0cmFfYXJnID09IHBzdGEtPmFpZCkgewogCQkJCQkJCURCR184OEUoInN0YSdzIG1hY2FkZHI6JXBNXG4iLCAocHN0YS0+aHdhZGRyKSk7CkBAIC00NTA3LDExICs0NDY4LDkgQEAKIAkJCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCQkJLyogIDA6IGRpc2FibGUsIGJpdCgwKTplbmFibGUgMi40ZywgYml0KDEpOmVuYWJsZSA1ZywgMHgzOiBlbmFibGUgYm90aCAyLjRnIGFuZCA1ZyAqLwogCQkJLyogZGVmYXVsdCBpcyBzZXQgdG8gZW5hYmxlIDIuNEdIWiBmb3IgSU9UIGlzc3VlIHdpdGggYnVmZmxhbydzIEFQIGF0IDVHSFogKi8KLQkJCWlmIChwcmVncHJpdiAmJgotCQkJICAgIChleHRyYV9hcmcgPT0gMCB8fAotCQkJICAgICBleHRyYV9hcmcgPT0gMSB8fAotCQkJICAgICBleHRyYV9hcmcgPT0gMiB8fAotCQkJICAgICBleHRyYV9hcmcgPT0gMykpIHsKKwkJCWlmICghcHJlZ3ByaXYpCisJCQkJYnJlYWs7CisJCQlpZiAoZXh0cmFfYXJnID49IDAgJiYgZXh0cmFfYXJnIDw9IDMpIHsKIAkJCQlwcmVncHJpdi0+cnhfc3RiYyA9IGV4dHJhX2FyZzsKIAkJCQlEQkdfODhFKCJzZXQgcnhfc3RiYyA9JWRcbiIsIHByZWdwcml2LT5yeF9zdGJjKTsKIAkJCX0gZWxzZSB7CkBAIC00NTIzLDcgKzQ0ODIsOSBAQAogCQl7CiAJCQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAkJCS8qICAwOiBkaXNhYmxlLCAweDE6ZW5hYmxlIChidXQgd2lmaV9zcGVjIHNob3VsZCBiZSAwKSwgMHgyOiBmb3JjZSBlbmFibGUgKGRvbid0IGNhcmUgd2lmaV9zcGVjKSAqLwotCQkJaWYgKHByZWdwcml2ICYmIGV4dHJhX2FyZyA+PSAwICYmIGV4dHJhX2FyZyA8IDMpIHsKKwkJCWlmICghcHJlZ3ByaXYpCisJCQkJYnJlYWs7CisJCQlpZiAoZXh0cmFfYXJnID49IDAgJiYgZXh0cmFfYXJnIDwgMykgewogCQkJCXByZWdwcml2LT5hbXBkdV9lbmFibGUgPSBleHRyYV9hcmc7CiAJCQkJREJHXzg4RSgic2V0IGFtcGR1X2VuYWJsZSA9JWRcbiIsIHByZWdwcml2LT5hbXBkdV9lbmFibGUpOwogCQkJfSBlbHNlIHsKQEAgLTU2NDgsMTIgKzU2MDksMTIgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsZW4gPSBkd3JxLT5sZW5ndGg7Ci0JZXh0ID0gcnR3X3ZtYWxsb2MobGVuKTsKKwlleHQgPSB2bWFsbG9jKGxlbik7CiAJaWYgKCFleHQpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGV4dCwgZHdycS0+cG9pbnRlciwgbGVuKSkgewotCQlydHdfdm1mcmVlKGV4dCwgbGVuKTsKKwkJdmZyZWUoZXh0KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC01NjkzLDcgKzU2NTQsNyBAQAogCiBGUkVFX0VYVDoKIAotCXJ0d192bWZyZWUoZXh0LCBsZW4pOworCXZmcmVlKGV4dCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTcwOSwxMCArNTY3MCwxNCBAQAogCURCR184OEUoIlslc10gZXh0cmEgPSAlc1xuIiwgX19mdW5jX18sIGV4dHJhKTsKIAogCWlmICghbWVtY21wKGV4dHJhLCAibHBzID0iLCA0KSkgewotCQlzc2NhbmYoZXh0cmErNCwgIiV1IiwgJm1vZGUpOworCQlyZXQgPSBzc2NhbmYoZXh0cmErNCwgIiV1IiwgJm1vZGUpOworCQlpZiAocmV0ICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0ID0gcnR3X3BtX3NldF9scHMocGFkYXB0ZXIsIG1vZGUpOwogCX0gZWxzZSBpZiAoIW1lbWNtcChleHRyYSwgImlwcyA9IiwgNCkpIHsKLQkJc3NjYW5mKGV4dHJhKzQsICIldSIsICZtb2RlKTsKKwkJcmV0ID0gc3NjYW5mKGV4dHJhKzQsICIldSIsICZtb2RlKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldCA9IHJ0d19wbV9zZXRfaXBzKHBhZGFwdGVyLCBtb2RlKTsKIAl9IGVsc2UgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtNjgxMiw4ICs2Nzc3LDExIEBACiB7CiAJdTMyIGJhbmR3aWR0aCA9IDAsIHNnID0gMDsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBydHdfbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcnY7CiAKLQlzc2NhbmYoZXh0cmEsICI0ME0gPSVkLCBzaG9ydEdJID0lZCIsICZiYW5kd2lkdGgsICZzZyk7CisJcnYgPSBzc2NhbmYoZXh0cmEsICI0ME0gPSVkLCBzaG9ydEdJID0lZCIsICZiYW5kd2lkdGgsICZzZyk7CisJaWYgKHJ2ICE9IDIpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGJhbmR3aWR0aCAhPSBIVF9DSEFOTkVMX1dJRFRIXzQwKQogCQliYW5kd2lkdGggPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwpAQCAtNjgzMyw2ICs2ODAxLDcgQEAKIAl1MzIJCWlkeF9hID0gMCwgaWR4X2IgPSAwOwogCWNoYXIJKmlucHV0ID0ga21hbGxvYyh3cnF1LT5sZW5ndGgsIEdGUF9LRVJORUwpOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHJ0d19uZXRkZXZfcHJpdihkZXYpOworCWludCBydjsKIAogCWlmICghaW5wdXQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjg0MCw3ICs2ODA5LDExIEBACiAJCWtmcmVlKGlucHV0KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXNzY2FuZihpbnB1dCwgInBhdGhhID0lZCwgcGF0aGIgPSVkIiwgJmlkeF9hLCAmaWR4X2IpOworCXJ2ID0gc3NjYW5mKGlucHV0LCAicGF0aGEgPSVkLCBwYXRoYiA9JWQiLCAmaWR4X2EsICZpZHhfYik7CisJaWYgKHJ2ICE9IDIpIHsKKwkJa2ZyZWUoaW5wdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlzcHJpbnRmKGV4dHJhLCAiU2V0IHBvd2VyIGxldmVsIHBhdGhfQTolZCBwYXRoX0I6JWQiLCBpZHhfYSwgaWR4X2IpOwogCXBhZGFwdGVyLT5tcHByaXYudHhwb3dlcmlkeCA9ICh1OClpZHhfYTsKQEAgLTY5MzQsNiArNjkwNyw3IEBACiAJdTMyIHBrVHggPSAxLCBjb3VudFBrVHggPSAxLCBjb3R1VHggPSAxLCBDYXJyU3ByVHggPSAxLCBzY1R4ID0gMSwgc2dsZVR4ID0gMSwgc3RvcCA9IDE7CiAJdTMyIGJTdGFydFRlc3QgPSAxOwogCXUzMiBjb3VudCA9IDA7CisJaW50IHJ2OwogCXN0cnVjdCBtcF9wcml2ICpwbXBfcHJpdjsKIAlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKIApAQCAtNjk1Myw3ICs2OTI3LDkgQEAKIAlzZ2xlVHggPSBzdHJuY21wKGV4dHJhLCAiYmFja2dyb3VuZCwgc3RvbmUiLCAyMCk7CiAJcGtUeCA9IHN0cm5jbXAoZXh0cmEsICJiYWNrZ3JvdW5kLCBwa3QiLCAyMCk7CiAJc3RvcCA9IHN0cm5jbXAoZXh0cmEsICJzdG9wIiwgNCk7Ci0Jc3NjYW5mKGV4dHJhLCAiY291bnQgPSVkLCBwa3QiLCAmY291bnQpOworCXJ2ID0gc3NjYW5mKGV4dHJhLCAiY291bnQgPSVkLCBwa3QiLCAmY291bnQpOworCWlmIChydiAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCV9ydHdfbWVtc2V0KGV4dHJhLCAnXDAnLCBzaXplb2YoKmV4dHJhKSk7CiAKQEAgLTczMTIsNiArNzI4OCw3IEBACiB7CiAJY2hhcgkqaW5wdXQgPSBrbWFsbG9jKHdycXUtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJdTMyCQl2YWx4Y2FwOworCWludCBydjsKIAogCWlmICghaW5wdXQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNzMyMiw3ICs3Mjk5LDExIEBACiAKIAlEQkdfODhFKCIlczppd3ByaXYgaW4gPSVzXG4iLCBfX2Z1bmNfXywgaW5wdXQpOwogCi0Jc3NjYW5mKGlucHV0LCAieGNhcCA9JWQiLCAmdmFseGNhcCk7CisJcnYgPSBzc2NhbmYoaW5wdXQsICJ4Y2FwID0lZCIsICZ2YWx4Y2FwKTsKKwlpZiAocnYgIT0gMSkgeworCQlrZnJlZShpbnB1dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWtmcmVlKGlucHV0KTsKIAlyZXR1cm4gMDsKQEAgLTc4ODgsNiArNzg2OSw3IEBACiAJczMyIGxlbjsKIAl1OCAqZXh0cmEgPSBOVUxMOwogCXUzMiBleHRyYV9zaXplID0gMDsKKwlpbnQgcnY7CiAKIAlzMzIgazsKIAljb25zdCBpd19oYW5kbGVyICpwcml2OwkJLyogUHJpdmF0ZSBpb2N0bCAqLwpAQCAtNzkxMyw3ICs3ODk1LDExIEBACiAJcHRyID0gaW5wdXQ7CiAJbGVuID0gaW5wdXRfbGVuOwogCi0Jc3NjYW5mKHB0ciwgIiUxNnMiLCBjbWRuYW1lKTsKKwlydiA9IHNzY2FuZihwdHIsICIlMTZzIiwgY21kbmFtZSk7CisJaWYgKHJ2ICE9IDEpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KIAljbWRsZW4gPSBzdHJsZW4oY21kbmFtZSk7CiAJREJHXzg4RSgiJXM6IGNtZCA9JXNcbiIsIF9fZnVuY19fLCBjbWRuYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvbWxtZV9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvbWxtZV9saW51eC5jCmluZGV4IDU3ZDFmZjcuLjA2MjQzNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9tbG1lX2xpbnV4LmMKQEAgLTYxLDEyICs2MSwxMCBAQAogCiB2b2lkIHJ0d19vc19pbmRpY2F0ZV9jb25uZWN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotX2Z1bmNfZW50ZXJfOwogCXJ0d19pbmRpY2F0ZV93eF9hc3NvY19ldmVudChhZGFwdGVyKTsKIAluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPnBuZXRkZXYpOwogCWlmIChhZGFwdGVyLT5waWRbMl0gIT0gMCkKIAkJcnR3X3NpZ25hbF9wcm9jZXNzKGFkYXB0ZXItPnBpZFsyXSwgU0lHQUxSTSk7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfb3NfaW5kaWNhdGVfc2Nhbl9kb25lKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgYm9vbCBhYm9ydGVkKQpAQCAtMTE5LDExICsxMTcsOSBAQAogCiB2b2lkIHJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotX2Z1bmNfZW50ZXJfOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPnBuZXRkZXYpOyAvKiAgRG8gaXQgZmlyc3QgZm9yIHR4IGJyb2FkY2FzdCBwa3QgYWZ0ZXIgZGlzY29ubmVjdGlvbiBpc3N1ZSEgKi8KIAlydHdfaW5kaWNhdGVfd3hfZGlzYXNzb2NfZXZlbnQoYWRhcHRlcik7CiAJIHJ0d19yZXNldF9zZWN1cml0eXByaXYoYWRhcHRlcik7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfcmVwb3J0X3NlY19pZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggYXV0aG1vZGUsIHU4ICpzZWNfaWUpCkBAIC0xMzIsNyArMTI4LDYgQEAKIAl1OAkqYnVmZiwgKnAsIGk7CiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogCi1fZnVuY19lbnRlcl87CiAJUlRfVFJBQ0UoX21vZHVsZV9tbG1lX29zZGVwX2NfLCBfZHJ2X2luZm9fLAogCQkgKCIrcnR3X3JlcG9ydF9zZWNfaWUsIGF1dGhtb2RlPSVkXG4iLCBhdXRobW9kZSkpOwogCWJ1ZmYgPSBOVUxMOwpAQCAtMTQxLDcgKzEzNiw3IEBACiAJCQkgKCJydHdfcmVwb3J0X3NlY19pZSwgYXV0aG1vZGU9JWRcbiIsIGF1dGhtb2RlKSk7CiAJCWJ1ZmYgPSBydHdfbWFsbG9jKElXX0NVU1RPTV9NQVgpOwogCQlpZiAoIWJ1ZmYpCi0JCQlnb3RvIGV4aXQ7CisJCQlyZXR1cm47CiAJCV9ydHdfbWVtc2V0KGJ1ZmYsIDAsIElXX0NVU1RPTV9NQVgpOwogCQlwID0gYnVmZjsKIAkJcCArPSBzcHJpbnRmKHAsICJBU1NPQ0lORk8oUmVxSUVzID0iKTsKQEAgLTE1Nyw4ICsxNTIsNiBAQAogCQl3aXJlbGVzc19zZW5kX2V2ZW50KGFkYXB0ZXItPnBuZXRkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWZmKTsKIAkJa2ZyZWUoYnVmZik7CiAJfQotZXhpdDoKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBfc3VydmV5X3RpbWVyX2hkbCh2b2lkICpGdW5jdGlvbkNvbnRleHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwppbmRleCA3YzllZTU4Li5iMjI1ZDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKQEAgLTUyMCw3ICs1MjAsNiBAQAogCXVpbnQgc3RhdHVzID0gX1NVQ0NFU1M7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJR2xvYmFsRGVidWdMZXZlbCA9IHJ0d19kZWJ1ZzsKIAlyZWdpc3RyeV9wYXItPmNoaXBfdmVyc2lvbiA9ICh1OClydHdfY2hpcF92ZXJzaW9uOwpAQCAtNTg4LDcgKzU4Nyw2IEBACiAJc25wcmludGYocmVnaXN0cnlfcGFyLT5pZm5hbWUsIDE2LCAiJXMiLCBpZm5hbWUpOwogCXNucHJpbnRmKHJlZ2lzdHJ5X3Bhci0+aWYybmFtZSwgMTYsICIlcyIsIGlmMm5hbWUpOwogCXJlZ2lzdHJ5X3Bhci0+bm90Y2hfZmlsdGVyID0gKHU4KXJ0d19ub3RjaF9maWx0ZXI7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC04NTUsNyArODUzLDYgQEAKIHsKIAl1OAlyZXQ4ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiK3J0d19pbml0X2Rydl9zd1xuIikpOwogCkBAIC05MzAsNyArOTI3LDYgQEAKIGV4aXQ6CiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItcnR3X2luaXRfZHJ2X3N3XG4iKSk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ4OwogfQpAQCAtMTExNSw3ICsxMTExLDcgQEAKIAogCV9lbnRlcl9jcml0aWNhbF9tdXRleChwYWRhcHRlci0+aHdfaW5pdF9tdXRleCwgTlVMTCk7CiAJcmV0ID0gX25ldGRldl9vcGVuKHBuZXRkZXYpOwotCV9leGl0X2NyaXRpY2FsX211dGV4KHBhZGFwdGVyLT5od19pbml0X211dGV4LCBOVUxMKTsKKwltdXRleF91bmxvY2socGFkYXB0ZXItPmh3X2luaXRfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMDgsNiArMTIwNCw3IEBACiBpbnQgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihwbmV0ZGV2KTsKKwlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiKzg4ZXVfZHJ2IC0gZHJ2X2Nsb3NlXG4iKSk7CiAKQEAgLTEyNDYsNiArMTI0Myw5IEBACiAJcnR3X3AycF9lbmFibGUocGFkYXB0ZXIsIFAyUF9ST0xFX0RJU0FCTEUpOwogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCisJa2ZyZWUoZHZvYmotPmZpcm13YXJlLnN6RndCdWZmZXIpOworCWR2b2JqLT5maXJtd2FyZS5zekZ3QnVmZmVyID0gTlVMTDsKKwogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLTg4ZXVfZHJ2IC0gZHJ2X2Nsb3NlXG4iKSk7CiAJREJHXzg4RSgiLTg4ZXVfZHJ2IC0gZHJ2X2Nsb3NlLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYwppbmRleCA4YzNiMDc3Li4yNTc5YTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jCkBAIC01NSwyNyArNTUsNiBAQAogCXJldHVybiBudW07CiB9CiAKLWlubGluZSB1OCAqX3J0d192bWFsbG9jKHUzMiBzeikKLXsKLQl1OAkqcGJ1ZjsKLQlwYnVmID0gdm1hbGxvYyhzeik7Ci0JcmV0dXJuIHBidWY7Ci19Ci0KLWlubGluZSB1OCAqX3J0d196dm1hbGxvYyh1MzIgc3opCi17Ci0JdTgJKnBidWY7Ci0JcGJ1ZiA9IF9ydHdfdm1hbGxvYyhzeik7Ci0JaWYgKHBidWYgIT0gTlVMTCkKLQkJbWVtc2V0KHBidWYsIDAsIHN6KTsKLQlyZXR1cm4gcGJ1ZjsKLX0KLQotaW5saW5lIHZvaWQgX3J0d192bWZyZWUodTggKnBidWYsIHUzMiBzeikKLXsKLQl2ZnJlZShwYnVmKTsKLX0KLQogdTggKl9ydHdfbWFsbG9jKHUzMiBzeikKIHsKIAl1OAkqcGJ1ZiA9IE5VTEw7CkBAIC0xMTQsMTYgKzkzLDYgQEAKIAlrZnJlZShwYnVmKTsKIH0KIAotaW50IF9ydHdfbWVtY21wKHZvaWQgKmRzdCwgdm9pZCAqc3JjLCB1MzIgc3opCi17Ci0vKiB1bmRlciBMaW51eC9HTlUvR0xpYmMsIHRoZSByZXR1cm4gdmFsdWUgb2YgbWVtY21wIGZvciB0d28gc2FtZQotICogbWVtLiBjaHVuayBpcyAwICovCi0JaWYgKCEobWVtY21wKGRzdCwgc3JjLCBzeikpKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQogdm9pZCBfcnR3X21lbXNldCh2b2lkICpwYnVmLCBpbnQgYywgdTMyIHN6KQogewogCW1lbXNldChwYnVmLCBjLCBzeik7CkBAIC0yNTIsNyArMjIxLDcgQEAKIAogCXBucGkgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAotCXBucGktPnByaXYgPSBydHdfenZtYWxsb2Moc2l6ZW9mX3ByaXYpOworCXBucGktPnByaXYgPSB2emFsbG9jKHNpemVvZl9wcml2KTsKIAlpZiAoIXBucGktPnByaXYpIHsKIAkJZnJlZV9uZXRkZXYocG5ldGRldik7CiAJCXBuZXRkZXYgPSBOVUxMOwpAQCAtMjc2LDcgKzI0NSw3IEBACiAJaWYgKCFwbnBpLT5wcml2KQogCQlnb3RvIFJFVFVSTjsKIAotCXJ0d192bWZyZWUocG5waS0+cHJpdiwgcG5waS0+c2l6ZW9mX3ByaXYpOworCXZmcmVlKHBucGktPnByaXYpOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAKIFJFVFVSTjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYwppbmRleCAyYTE4YjMyLi5kYTM5N2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgogCiAjaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPGV0aGVybmV0Lmg+CiAjaW5jbHVkZSA8dXNiX29wcy5oPgogCiAvKiBpbml0IG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gc3RydWN0IHJlY3ZfcHJpdiAqLwpAQCAtMzYsMTYgKzM1LDE2IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi0vKiBhbGxvYyBvcyByZWxhdGVkIHJlc291cmNlIGluIHVuaW9uIHJlY3ZfZnJhbWUgKi8KKy8qIGFsbG9jIG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gc3RydWN0IHJlY3ZfZnJhbWUgKi8KIGludCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKLQlwcmVjdmZyYW1lLT51Lmhkci5wa3RfbmV3YWxsb2MgPSBOVUxMOwotCXByZWN2ZnJhbWUtPnUuaGRyLnBrdCA9IE5VTEw7CisJcHJlY3ZmcmFtZS0+cGt0X25ld2FsbG9jID0gTlVMTDsKKwlwcmVjdmZyYW1lLT5wa3QgPSBOVUxMOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotLyogZnJlZSBvcyByZWxhdGVkIHJlc291cmNlIGluIHVuaW9uIHJlY3ZfZnJhbWUgKi8KKy8qIGZyZWUgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiBzdHJ1Y3QgcmVjdl9mcmFtZSAqLwogdm9pZCBydHdfb3NfcmVjdl9yZXNvdXJjZV9mcmVlKHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdikKIHsKIH0KQEAgLTExOCwyNCArMTE3LDIzIEBACiB9CiAKIHZvaWQgcnR3X2hvc3RhcGRfbWxtZV9yeChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogfQogCiBpbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXY7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlwcmVjdnByaXYgPSAmKHBhZGFwdGVyLT5yZWN2cHJpdik7CiAJcGZyZWVfcmVjdl9xdWV1ZSA9ICYocHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpOwogCi0Jc2tiID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnBrdDsKKwlza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwogCWlmIChza2IgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfZXJyXywKIAkJCSAoInJ0d19yZWN2X2luZGljYXRlcGt0KCk6c2tiID09IE5VTEwgc29tZXRoaW5nIHdyb25nISEhIVxuIikpOwpAQCAtMTQ1LDE4ICsxNDMsMTggQEAKIAlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCiAJCSAoInJ0d19yZWN2X2luZGljYXRlcGt0KCk6c2tiICE9IE5VTEwgISEhXG4iKSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfcmVjdl9pbmRpY2F0ZXBrdCgpOnByZWN2X2ZyYW1lLT51Lmhkci5yeF9oZWFkID0lcCAgcHJlY3ZfZnJhbWUtPmhkci5yeF9kYXRhID0lcFxuIiwKLQkJIHByZWN2X2ZyYW1lLT51Lmhkci5yeF9oZWFkLCBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkpOworCQkgKCJydHdfcmVjdl9pbmRpY2F0ZXBrdCgpOnByZWN2X2ZyYW1lLT5yeF9oZWFkID0lcCAgcHJlY3ZfZnJhbWUtPmhkci5yeF9kYXRhID0lcFxuIiwKKwkJIHByZWN2X2ZyYW1lLT5yeF9oZWFkLCBwcmVjdl9mcmFtZS0+cnhfZGF0YSkpOwogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICgicHJlY3ZfZnJhbWUtPmhkci5yeF90YWlsID0lcCBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZW5kID0lcCBwcmVjdl9mcmFtZS0+aGRyLmxlbiA9JWRcbiIsCi0JCSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfdGFpbCwgcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2VuZCwKLQkJIHByZWN2X2ZyYW1lLT51Lmhkci5sZW4pKTsKKwkJICgicHJlY3ZfZnJhbWUtPmhkci5yeF90YWlsID0lcCBwcmVjdl9mcmFtZS0+cnhfZW5kID0lcCBwcmVjdl9mcmFtZS0+aGRyLmxlbiA9JWRcbiIsCisJCSBwcmVjdl9mcmFtZS0+cnhfdGFpbCwgcHJlY3ZfZnJhbWUtPnJ4X2VuZCwKKwkJIHByZWN2X2ZyYW1lLT5sZW4pKTsKIAotCXNrYi0+ZGF0YSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXNrYi0+ZGF0YSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCi0Jc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBwcmVjdl9mcmFtZS0+dS5oZHIubGVuKTsKKwlza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIHByZWN2X2ZyYW1lLT5sZW4pOwogCi0Jc2tiLT5sZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXNrYi0+bGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKIAkJICgic2tiLT5oZWFkID0lcCBza2ItPmRhdGEgPSVwIHNrYi0+dGFpbCA9JXAgc2tiLT5lbmQgPSVwIHNrYi0+bGVuID0lZFxuIiwKQEAgLTE2NywxMSArMTY1LDExIEBACiAJCXN0cnVjdCBza19idWZmICpwc2tiMiA9IE5VTEw7CiAJCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAJCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJCWludCBibWNhc3QgPSBJU19NQ0FTVChwYXR0cmliLT5kc3QpOwogCi0JCWlmICghX3J0d19tZW1jbXAocGF0dHJpYi0+ZHN0LCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksCi0JCQkJIEVUSF9BTEVOKSkgeworCQlpZiAobWVtY21wKHBhdHRyaWItPmRzdCwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLAorCQkJICAgRVRIX0FMRU4pKSB7CiAJCQlpZiAoYm1jYXN0KSB7CiAJCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvKHBhZGFwdGVyKTsKIAkJCQlwc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwpAQCAtMjA5LDE0ICsyMDcsMTMgQEAKIF9yZWN2X2luZGljYXRlcGt0X2VuZDoKIAogCS8qICBwb2ludGVycyB0byBOVUxMIGJlZm9yZSBydHdfZnJlZV9yZWN2ZnJhbWUoKSAqLwotCXByZWN2X2ZyYW1lLT51Lmhkci5wa3QgPSBOVUxMOworCXByZWN2X2ZyYW1lLT5wa3QgPSBOVUxMOwogCiAJcnR3X2ZyZWVfcmVjdmZyYW1lKHByZWN2X2ZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKIAkJICgiXG4gcnR3X3JlY3ZfaW5kaWNhdGVwa3QgOmFmdGVyIG5ldGlmX3J4ISEhIVxuIikpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIApAQCAtMjI1LDcgKzIyMiw2IEBACiAJIC8qIGVucXVldWUgYmFjayB0byBmcmVlX3JlY3ZfcXVldWUgKi8KIAlydHdfZnJlZV9yZWN2ZnJhbWUocHJlY3ZfZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCi1fZnVuY19leGl0XzsKIAkgcmV0dXJuIF9GQUlMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9ydHdfYW5kcm9pZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcnR3X2FuZHJvaWQuYwppbmRleCBhM2MyYmM1Li5jYTI3MzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9ydHdfYW5kcm9pZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3J0d19hbmRyb2lkLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxydHdfYW5kcm9pZC5oPgogI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KICNpbmNsdWRlIDxydHdfZGVidWcuaD4KLSNpbmNsdWRlIDxpb2N0bF9jZmc4MDIxMS5oPgogI2luY2x1ZGUgPHJ0d19pb2N0bF9zZXQuaD4KIAogc3RhdGljIGNvbnN0IGNoYXIgKmFuZHJvaWRfd2lmaV9jbWRfc3RyW0FORFJPSURfV0lGSV9DTURfTUFYXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCmluZGV4IDJmNDBmZjUuLjJlNDljZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGhhbF9pbnRmLmg+CiAjaW5jbHVkZSA8cnR3X3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgogCiAjaW5jbHVkZSA8dXNiX3ZlbmRvcl9yZXEuaD4KQEAgLTE2Miw3ICsxNjMsNiBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqcGVuZHBfZGVzYzsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqcHVzYmQ7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBkdm9ianByaXYgPSAoc3RydWN0IGR2b2JqX3ByaXYgKilydHdfem1hbGxvYyhzaXplb2YoKnBkdm9ianByaXYpKTsKIAlpZiAocGR2b2JqcHJpdiA9PSBOVUxMKQpAQCAtMjU1LDcgKzI1NSw2IEBACiAJCXBkdm9ianByaXYgPSBOVUxMOwogCX0KIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcGR2b2JqcHJpdjsKIH0KIApAQCAtMjYzLDcgKzI2Miw2IEBACiB7CiAJc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gdXNiX2dldF9pbnRmZGF0YSh1c2JfaW50Zik7CiAKLV9mdW5jX2VudGVyXzsKIAogCXVzYl9zZXRfaW50ZmRhdGEodXNiX2ludGYsIE5VTEwpOwogCWlmIChkdm9iaikgewpAQCAtMjg4LDcgKzI4Niw2IEBACiAKIAl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHVzYl9pbnRmKSk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBjaGlwX2J5X3VzYl9pZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCkBAIC0zOTAsNyArMzg3LDYgQEAKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCghcGFkYXB0ZXItPmJ1cCkgfHwgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgfHwKIAkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSkgewpAQCAtNDQzLDcgKzQzOSw2IEBACiAJfSBlbHNlIHsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gMDsKIAogZXJyb3JfZXhpdDoKQEAgLTQ1Niw3ICs0NTEsNiBAQAogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAocGFkYXB0ZXIpIHsgLyogc3lzdGVtIHJlc3VtZSAqLwogCQlEQkdfODhFKCI9PT4gcnR3X2h3X3Jlc3VtZVxuIik7CkBAIC00ODgsNyArNDgyLDYgQEAKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIDA7CiBlcnJvcl9leGl0OgpAQCAtNTA3LDcgKzUwMCw2IEBACiAJaW50IHJldCA9IDA7CiAJdTMyIHN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiPT0+ICVzICglczolZClcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwogCkBAIC01NjQsNyArNTU2LDYgQEAKIAlEQkdfODhFKCI8PT09ICAlcyByZXR1cm4gJWQuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLCBfX2Z1bmNfXwogCQksIHJldCwgcnR3X2dldF9wYXNzaW5nX3RpbWVfbXMoc3RhcnRfdGltZSkpOwogCi0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTg4LDcgKzU3OSw2IEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9IE5VTEw7CiAJaW50IHJldCA9IC0xOwogCXUzMiBzdGFydF90aW1lID0gamlmZmllczsKLQlfZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCI9PT4gJXMgKCVzOiVkKVxuIiwgX19mdW5jX18sIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CiAKQEAgLTYyNyw3ICs2MTcsNiBAQAogCURCR184OEUoIjw9PT0gICVzIHJldHVybiAlZC4uLi4uLi4uLi4uLi4uIGluICVkbXNcbiIsIF9fZnVuY19fLAogCQlyZXQsIHJ0d19nZXRfcGFzc2luZ190aW1lX21zKHN0YXJ0X3RpbWUpKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTY0Nyw3ICs2MzYsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gTlVMTDsKIAlpbnQgc3RhdHVzID0gX0ZBSUw7CiAKLQlwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d196dm1hbGxvYyhzaXplb2YoKnBhZGFwdGVyKSk7CisJcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKil2emFsbG9jKHNpemVvZigqcGFkYXB0ZXIpKTsKIAlpZiAocGFkYXB0ZXIgPT0gTlVMTCkKIAkJZ290byBleGl0OwogCXBhZGFwdGVyLT5kdm9iaiA9IGR2b2JqOwpAQCAtNzQ3LDcgKzczNiw3IEBACiAJCWlmIChwbmV0ZGV2KQogCQkJcnR3X2ZyZWVfbmV0ZGV2KHBuZXRkZXYpOwogCQllbHNlIGlmIChwYWRhcHRlcikKLQkJCXJ0d192bWZyZWUoKHU4ICopcGFkYXB0ZXIsIHNpemVvZigqcGFkYXB0ZXIpKTsKKwkJCXZmcmVlKHBhZGFwdGVyKTsKIAkJcGFkYXB0ZXIgPSBOVUxMOwogCX0KIGV4aXQ6CkBAIC04MzYsNyArODI1LDYgQEAKIAlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50Zik7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gZHZvYmotPmlmMTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiK3J0d19kZXZfcmVtb3ZlXG4iKTsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIitkZXZfcmVtb3ZlKClcbiIpKTsKQEAgLTg1NSw3ICs4NDMsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCItZGV2X3JlbW92ZSgpXG4iKSk7CiAJREJHXzg4RSgiLXI4NzF4dV9kZXZfcmVtb3ZlLCBkb25lXG4iKTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCmluZGV4IDdlM2YyZmEuLmZiMGJiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKQEAgLTgwLDcgKzgwLDYgQEAKIAlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3dpdGNoIChweG1pdGJ1Zi0+ZmxhZ3MpIHsKIAljYXNlIFZPX1FVRVVFX0lOWDoKQEAgLTE1Niw4ICsxNTUsNiBAQAogCXJ0d19mcmVlX3htaXRidWYocHhtaXRwcml2LCBweG1pdGJ1Zik7CiAKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZweG1pdHByaXYtPnhtaXRfdGFza2xldCk7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiB1MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICp3bWVtKQpAQCAtMTc0LDcgKzE3MSw2IEBACiAJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSAoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGJ1Zi0+cHJpdl9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZCA9IHBkdm9iai0+cHVzYmRldjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sICgiK3VzYl93cml0ZV9wb3J0XG4iKSk7CiAKQEAgLTI1NSw3ICsyNTEsNiBAQAogZXhpdDoKIAlpZiAocmV0ICE9IF9TVUNDRVNTKQogCQlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jCmluZGV4IDkwMDU5NzEuLjJjOGUzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxpZl9ldGhlci5oPgotI2luY2x1ZGUgPGlwLmg+CiAjaW5jbHVkZSA8d2lmaS5oPgogI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KICNpbmNsdWRlIDx4bWl0X29zZGVwLmg+CkBAIC0zOSw3ICszNyw2IEBACiAKIHZvaWQgX3J0d19vcGVuX3BrdGZpbGUoc3RydWN0IHNrX2J1ZmYgKnBrdHB0ciwgc3RydWN0IHBrdF9maWxlICpwZmlsZSkKIHsKLV9mdW5jX2VudGVyXzsKIAogCXBmaWxlLT5wa3QgPSBwa3RwdHI7CiAJcGZpbGUtPmN1cl9hZGRyID0gcGt0cHRyLT5kYXRhOwpAQCAtNDksMTQgKzQ2LDEyIEBACiAKIAlwZmlsZS0+Y3VyX2J1ZmZlciA9IHBmaWxlLT5idWZfc3RhcnQ7CiAKLV9mdW5jX2V4aXRfOwogfQogCiB1aW50IF9ydHdfcGt0ZmlsZV9yZWFkIChzdHJ1Y3QgcGt0X2ZpbGUgKnBmaWxlLCB1OCAqcm1lbSwgdWludCBybGVuKQogewogCXVpbnQJbGVuID0gMDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJbGVuID0gIHJ0d19yZW1haW5kZXJfbGVuKHBmaWxlKTsKIAlsZW4gPSAocmxlbiA+IGxlbikgPyBsZW4gOiBybGVuOwpAQCAtNjcsMjEgKzYyLDE3IEBACiAJcGZpbGUtPmN1cl9hZGRyICs9IGxlbjsKIAlwZmlsZS0+cGt0X2xlbiAtPSBsZW47CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIGxlbjsKIH0KIAogaW50IHJ0d19lbmRvZnBrdGZpbGUoc3RydWN0IHBrdF9maWxlICpwZmlsZSkKIHsKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwZmlsZS0+cGt0X2xlbiA9PSAwKSB7Ci0JX2Z1bmNfZXhpdF87CiAJCXJldHVybiB0cnVlOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC0yMDAsMTMgKzE5MSwxMyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qIGZyZWUgc3RhIGFzb2NfcXVldWUgKi8KIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkvKiBhdm9pZCAgIGNvbWUgZnJvbSBTVEExIGFuZCBzZW5kIGJhY2sgU1RBMSAqLwogCQlpZiAoIW1lbWNtcChwc3RhLT5od2FkZHIsICZza2ItPmRhdGFbNl0sIDYpKQpAQCAtMjQ2LDcgKzIzNyw2IEBACiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzMzIgcmVzID0gMDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiK3htaXRfZW5yeVxuIikpOwogCkBAIC0yODIsNyArMjcyLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYwppbmRleCBlYjMzYzUxLi41M2RhNjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCkBAIC0xMzMsMTQgKzEzMywxMiBAQAogCXBUcmlwbGUgPSAoc3RydWN0IGNobmxfdHhwb3dfdHJpcGxlICopKHBDb3V0cnlJZSArIDMpOwogCWZvciAoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspIHsKIAkJaWYgKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQiCi0JCQkgICAgICAgIiBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCQlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArCiAJCSAgICBwVHJpcGxlLT5OdW1DaG5scykpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCAiCi0JCQkgICAgICAgImNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTE2Nyw4ICsxNjUsNyBAQAogCXU4IE1heFR4UHdySW5EYm0gPSAyNTU7CiAKIAlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgQ2hhbm5lbCkgewotCQlwcmludGsoS0VSTl9JTkZPICJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkICIKLQkJICAgICAgICJDaGFubmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCBDaGFubmVsXG4iKTsKIAkJcmV0dXJuIE1heFR4UHdySW5EYm07CiAJfQogCWlmIChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbQ2hhbm5lbF0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wY2kuaAppbmRleCAzNTZhZWM0Li40Yjk0NjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmgKQEAgLTI4LDMxICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotc3RhdGljIGlubGluZSB2b2lkIE5kaXNSYXdXcml0ZVBvcnRVbG9uZyh1MzIgcG9ydCwgIHUzMiB2YWwpCi17Ci0Jb3V0bCh2YWwsIHBvcnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1dyaXRlUG9ydFVjaGFyKHUzMiBwb3J0LCAgdTggdmFsKQotewotCW91dGIodmFsLCBwb3J0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNSYXdSZWFkUG9ydFVjaGFyKHUzMiBwb3J0LCB1OCAqcHZhbCkKLXsKLQkqcHZhbCA9IGluYihwb3J0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNSYXdSZWFkUG9ydFVzaG9ydCh1MzIgcG9ydCwgdTE2ICpwdmFsKQotewotCSpwdmFsID0gaW53KHBvcnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1JlYWRQb3J0VWxvbmcodTMyIHBvcnQsIHUzMiAqcHZhbCkKLXsKLQkqcHZhbCA9IGlubChwb3J0KTsKLX0KLQogc3RydWN0IG1wX2FkYXB0ZXIgewogCXU4CQlMaW5rQ3RybFJlZzsKIApAQCAtNzAsMzMgKzQ1LDYgQEAKIAl1OAkJUGNpQnJpZGdlTGlua0N0cmxSZWc7CiB9OwogCi1zdHJ1Y3QgcnRfcGNpX2NhcGFiX2hlYWRlciB7Ci0JdW5zaWduZWQgY2hhciAgIENhcGFiaWxpdHlJRDsKLQl1bnNpZ25lZCBjaGFyICAgTmV4dDsKLX07Ci0KLSNkZWZpbmUgUENJX01BWF9CUklER0VfTlVNQkVSCQkJCTI1NQotI2RlZmluZSBQQ0lfTUFYX0RFVklDRVMJCQkJCQkzMgotI2RlZmluZSBQQ0lfTUFYX0ZVTkNUSU9OCQkJCQk4Ci0KLSNkZWZpbmUgUENJX0NPTkZfQUREUkVTUwkJCQkJMHgwQ0Y4Ci0jZGVmaW5lIFBDSV9DT05GX0RBVEEJCQkJCQkweDBDRkMKLQotI2RlZmluZQlQQ0lfQ0xBU1NfQlJJREdFX0RFVgkJCQkweDA2Ci0jZGVmaW5lCVBDSV9TVUJDTEFTU19CUl9QQ0lfVE9fUENJCQkweDA0Ci0KLSNkZWZpbmUJVTFET05UQ0FSRQkJCQkJCTB4RkYKLSNkZWZpbmUJVTJET05UQ0FSRQkJCQkJCTB4RkZGRgotI2RlZmluZQlVNERPTlRDQVJFCQkJCQkJMHhGRkZGRkZGRgotCi0jZGVmaW5lCUlOVEVMX1ZFTkRPUl9JRAkJCQkJMHg4MDg2Ci0jZGVmaW5lCVNJU19WRU5ET1JfSUQJCQkJCQkweDEwMzkKLSNkZWZpbmUJQVRJX1ZFTkRPUl9JRAkJCQkJCTB4MTAwMgotI2RlZmluZQlBVElfREVWSUNFX0lECQkJCQkJMHg3OTE0Ci0jZGVmaW5lCUFNRF9WRU5ET1JfSUQJCQkJCQkweDEwMjIKLQotI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9JRF9QQ0lfRVhQUkVTUwkJMHgxMAotCiBzdHJ1Y3QgbmV0X2RldmljZTsKIGJvb2wgcnRsODE5Ml9wY2lfZmluZGFkYXB0ZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKaW5kZXggNjIwMjM1OC4uNDk4OTk1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYwpAQCAtNjA5LDcgKzYwOSw3IEBACiAJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCiAJCXJldHVybiAtRTJCSUc7CiAJZG93bigmcHJpdi0+d3hfc2VtKTsKLQl3cnF1LT5kYXRhLmxlbmd0aCA9IG1pbigoc2l6ZV90KSB3cnF1LT5kYXRhLmxlbmd0aCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IG1pbl90KHNpemVfdCwgd3JxdS0+ZGF0YS5sZW5ndGgsIHNpemVvZihwcml2LT5uaWNrKSk7CiAJbWVtc2V0KHByaXYtPm5pY2ssIDAsIHNpemVvZihwcml2LT5uaWNrKSk7CiAJbWVtY3B5KHByaXYtPm5pY2ssIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CiAJdXAoJnByaXYtPnd4X3NlbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKaW5kZXggNzc5NjQ4OC4uMTFkMGE5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwpAQCAtOTM5LDEyICs5MzksMTIgQEAKIAlpZiAodHhiKSB7CiAJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSB7CiAJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlMTZfdG9fY3B1KHR4Yi0+cGF5bG9hZF9zaXplKTsKIAkJCXJ0bGxpYl9zb2Z0bWFjX3htaXQodHhiLCBpZWVlKTsKIAkJfSBlbHNlIHsKIAkJCWlmICgoKmllZWUtPmhhcmRfc3RhcnRfeG1pdCkodHhiLCBkZXYpID09IDApIHsKIAkJCQlzdGF0cy0+dHhfcGFja2V0cysrOwotCQkJCXN0YXRzLT50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKKwkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gbGUxNl90b19jcHUodHhiLT5wYXlsb2FkX3NpemUpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJcnRsbGliX3R4Yl9mcmVlKHR4Yik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg1ZmI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSNpZm5kZWYgX19JTkNfRU5ESUFORlJFRV9ICi0jZGVmaW5lIF9fSU5DX0VORElBTkZSRUVfSAotCi0vKgotICoJQ2FsbCBlbmRpYW4gZnJlZSBmdW5jdGlvbiB3aGVuCi0gKgkJMS4gUmVhZC93cml0ZSBwYWNrZXQgY29udGVudC4KLSAqCQkyLiBCZWZvcmUgd3JpdGUgaW50ZWdlciB0byBJTy4KLSAqCQkzLiBBZnRlciByZWFkIGludGVnZXIgZnJvbSBJTy4KLSAqLwotCi0jZGVmaW5lIF9fTUFDSElORV9MSVRUTEVfRU5ESUFOIDEyMzQgICAgLyogTFNCIGZpcnN0OiBpMzg2LCB2YXggKi8KLSNkZWZpbmUgX19NQUNISU5FX0JJR19FTkRJQU4gICAgNDMyMSAgICAvKiBNU0IgZmlyc3Q6IDY4MDAwLCBpYm0sIG5ldCwgcHBjICovCi0KLSNkZWZpbmUgQllURV9PUkRFUiBfX01BQ0hJTkVfTElUVExFX0VORElBTgotCi0jaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgotLy8gQ29udmVydCBkYXRhCi0jZGVmaW5lIEVGMUJ5dGUoX3ZhbCkJCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEVGMkJ5dGUoX3ZhbCkJCQkJKCh1MTYpKF92YWwpKQotI2RlZmluZSBFRjRCeXRlKF92YWwpCQkJCSgodTMyKShfdmFsKSkKLQotI2Vsc2UKLS8vIENvbnZlcnQgZGF0YQotI2RlZmluZSBFRjFCeXRlKF92YWwpCQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBFRjJCeXRlKF92YWwpCQkJCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8KCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQotI2RlZmluZSBFRjRCeXRlKF92YWwpCQkJCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCi0JCQkJCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpfFwKLQkJCQkJCSgoKCh1MzIpKF92YWwpKSYweDAwZmYwMDAwKT4+OCl8XAotCQkJCQkJKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCi0jZW5kaWYKLQotLy8gUmVhZCBkYXRhIGZyb20gbWVtb3J5Ci0jZGVmaW5lIFJlYWRFRjFCeXRlKF9wdHIpCQlFRjFCeXRlKCooKHU4ICopKF9wdHIpKSkKLSNkZWZpbmUgUmVhZEVGMkJ5dGUoX3B0cikJCUVGMkJ5dGUoKigodTE2ICopKF9wdHIpKSkKLSNkZWZpbmUgUmVhZEVGNEJ5dGUoX3B0cikJCUVGNEJ5dGUoKigodTMyICopKF9wdHIpKSkKLQotLy8gV3JpdGUgZGF0YSB0byBtZW1vcnkKLSNkZWZpbmUgV3JpdGVFRjFCeXRlKF9wdHIsIF92YWwpCSgqKCh1OCAqKShfcHRyKSkpPUVGMUJ5dGUoX3ZhbCkKLSNkZWZpbmUgV3JpdGVFRjJCeXRlKF9wdHIsIF92YWwpCSgqKCh1MTYgKikoX3B0cikpKT1FRjJCeXRlKF92YWwpCi0jZGVmaW5lIFdyaXRlRUY0Qnl0ZShfcHRyLCBfdmFsKQkoKigodTMyICopKF9wdHIpKSk9RUY0Qnl0ZShfdmFsKQotLy8gQ29udmVydCBIb3N0IHN5c3RlbSBzcGVjaWZpYyBieXRlIG9yZGluZyAobGl0dGVuIG9yIGJpZyBlbmRpYSkgdG8gTmV0d29yayBieXRlIG9yZGluZyAoYmlnIGVuZGlhbikuCi0vLyAyMDA2LjA1LjA3LCBieSByY25qa28uCi0jaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgotI2RlZmluZSBIMk4xQllURShfdmFsKQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgSDJOMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCi0JCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCi0jZGVmaW5lIEgyTjRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKLSNlbHNlCi0jZGVmaW5lIEgyTjFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEgyTjJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQotI2RlZmluZSBIMk40QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKLSNlbmRpZgotCi0vLyBDb252ZXJ0IGZyb20gTmV0d29yayBieXRlIG9yZGluZyAoYmlnIGVuZGlhbikgdG8gSG9zdCBzeXN0ZW0gc3BlY2lmaWMgYnl0ZSBvcmRpbmcgKGxpdHRlbiBvciBiaWcgZW5kaWEpLgotLy8gMjAwNi4wNS4wNywgYnkgcmNuamtvLgotI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTjJIMUJZVEUoX3ZhbCkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIE4ySDJCWVRFKF92YWwpCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8XAotCQkJKCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQotI2RlZmluZSBOMkg0QllURShfdmFsKQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCi0jZWxzZQotI2RlZmluZSBOMkgxQllURShfdmFsKQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBOMkgyQllURShfdmFsKQkJCSgodTE2KShfdmFsKSkKLSNkZWZpbmUgTjJINEJZVEUoX3ZhbCkJCQkoKHUzMikoX3ZhbCkpCi0jZW5kaWYKLQotLy8KLS8vCUV4YW1wbGU6Ci0vLwkJQklUX0xFTl9NQVNLXzMyKDApID0+IDB4MDAwMDAwMDAKLS8vCQlCSVRfTEVOX01BU0tfMzIoMSkgPT4gMHgwMDAwMDAwMQotLy8JCUJJVF9MRU5fTUFTS18zMigyKSA9PiAweDAwMDAwMDAzCi0vLwkJQklUX0xFTl9NQVNLXzMyKDMyKSA9PiAweEZGRkZGRkZGCi0vLwotI2RlZmluZSBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pICgweEZGRkZGRkZGID4+ICgzMiAtIChfX0JpdExlbikpKQotLy8KLS8vCUV4YW1wbGU6Ci0vLwkJQklUX09GRlNFVF9MRU5fTUFTS18zMigwLCAyKSA9PiAweDAwMDAwMDAzCi0vLwkJQklUX09GRlNFVF9MRU5fTUFTS18zMigxNiwgMikgPT4gMHgwMDAzMDAwMAotLy8KLSNkZWZpbmUgQklUX09GRlNFVF9MRU5fTUFTS18zMihfX0JpdE9mZnNldCwgX19CaXRMZW4pIChCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCi0KLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlSZXR1cm4gNC1ieXRlIHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlcmluZyBmcm9tCi0vLwkJNC1ieXRlIHBvaW50ZXIgaW4gbGl0dGVuLWVuZGlhbiBzeXN0ZW0uCi0vLwotI2RlZmluZSBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BTdGFydCkgKEVGNEJ5dGUoKigodTMyICopKF9fcFN0YXJ0KSkpKQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJVHJhbnNsYXRlIHN1YmZpZWxkIChjb250aW51b3VzIGJpdHMgaW4gbGl0dGxlLWVuZGlhbikgb2YgNC1ieXRlIHZhbHVlIGluIGxpdHRlbiBieXRlIHRvCi0vLwkJNC1ieXRlIHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlcmluZy4KLS8vCi0jZGVmaW5lIExFX0JJVFNfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgKCBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BTdGFydCkgPj4gKF9fQml0T2Zmc2V0KSApIFwKLQkgICYgXAotCSAgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSBcCi0JKQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJTWFzayBzdWJmaWVsZCAoY29udGludW91cyBiaXRzIGluIGxpdHRsZS1lbmRpYW4pIG9mIDQtYnl0ZSB2YWx1ZSBpbiBsaXR0ZW4gYnl0ZSBvcmVkZXJpbmcKLS8vCQlhbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4gNC1ieXRlIHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlcmluZy4KLS8vCi0jZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BTdGFydCkgXAotCSAgJiBcCi0JICAoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKSBcCi0JKQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJU2V0IHN1YmZpZWxkIG9mIGxpdHRsZS1lbmRpYW4gNC1ieXRlIHZhbHVlIHRvIHNwZWNpZmllZCB2YWx1ZS4KLS8vCi0jZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4sIF9fVmFsdWUpIFwKLQkqKCh1MzIgKikoX19wU3RhcnQpKSA9IFwKLQlFRjRCeXRlKCBcCi0JTEVfQklUU19DTEVBUkVEX1RPXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQl8IFwKLQkoICgoKHUzMilfX1ZhbHVlKSAmIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikpIDw8IChfX0JpdE9mZnNldCkgKSBcCi0gICAgICAgKTsKLQotCi0jZGVmaW5lIEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikgXAotCSgweEZGRkYgPj4gKDE2IC0gKF9fQml0TGVuKSkpCi0KLSNkZWZpbmUgQklUX09GRlNFVF9MRU5fTUFTS18xNihfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQotCi0jZGVmaW5lIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSBcCi0JKEVGMkJ5dGUoKigodTE2ICopKF9fcFN0YXJ0KSkpKQotCi0jZGVmaW5lIExFX0JJVFNfVE9fMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgKCBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgPj4gKF9fQml0T2Zmc2V0KSApIFwKLQkgICYgXAotCSAgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCi0JKQotCi0jZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgXAotCSAgJiBcCi0JICAoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKSBcCi0JKQotCi0jZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4sIF9fVmFsdWUpIFwKLQkqKCh1MTYgKikoX19wU3RhcnQpKSA9IFwKLQlFRjJCeXRlKCBcCi0JCUxFX0JJVFNfQ0xFQVJFRF9UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JCXwgXAotCQkoICgoKHUxNilfX1ZhbHVlKSAmIEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikpIDw8IChfX0JpdE9mZnNldCkgKSBcCi0gICAgICAgKTsKLQotI2RlZmluZSBCSVRfTEVOX01BU0tfOChfX0JpdExlbikgXAotCSgweEZGID4+ICg4IC0gKF9fQml0TGVuKSkpCi0KLSNkZWZpbmUgQklUX09GRlNFVF9MRU5fTUFTS184KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCShCSVRfTEVOX01BU0tfOChfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKLQotI2RlZmluZSBMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BTdGFydCkgXAotCShFRjFCeXRlKCooKHU4ICopKF9fcFN0YXJ0KSkpKQotCi0jZGVmaW5lIExFX0JJVFNfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgKCBMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BTdGFydCkgPj4gKF9fQml0T2Zmc2V0KSApIFwKLQkgICYgXAotCSAgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIFwKLQkpCi0KLSNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCi0JICAmIFwKLQkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfOChfX0JpdE9mZnNldCwgX19CaXRMZW4pICkgXAotCSkKLQotI2RlZmluZSBTRVRfQklUU19UT19MRV8xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCi0JKigodTggKikoX19wU3RhcnQpKSA9IFwKLQlFRjFCeXRlKCBcCi0JCUxFX0JJVFNfQ0xFQVJFRF9UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JCXwgXAotCQkoICgoKHU4KV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pKSA8PCAoX19CaXRPZmZzZXQpICkgXAotICAgICAgICk7Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9fSU5DX0VORElBTkZSRUVfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzEwMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQUVTIENpcGhlciBBbGdvcml0aG0uCi0gKgotICogQmFzZWQgb24gQnJpYW4gR2xhZG1hbidzIGNvZGUuCi0gKgotICogTGludXggZGV2ZWxvcGVyczoKLSAqICBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGZhc3Qubm8+Ci0gKiAgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGh2cmxhYi5vcmc+Ci0gKiAgS3lsZSBNY01hcnRpbiA8a3lsZUBkZWJpYW4ub3JnPgotICogIEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPiAoY29udmVyc2lvbiB0byAyLjUgQVBJKS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChjKSAyMDAyLCBEciBCcmlhbiBHbGFkbWFuIDxicmdAZ2xhZG1hbi5tZS51az4sIFdvcmNlc3RlciwgVUsuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIExJQ0VOU0UgVEVSTVMKLSAqCi0gKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKLSAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6Ci0gKgotICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKLSAqCi0gKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7Ci0gKgotICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cwotICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0Ci0gKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKLSAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgotICoKLSAqIERJU0NMQUlNRVIKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKLSAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcwotICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKiBTb21lIGNoYW5nZXMgZnJvbSB0aGUgR2xhZG1hbiB2ZXJzaW9uOgotICAgIHMvUklKTkRBRUwoZV9rZXkpL0VfS0VZL2cKLSAgICBzL1JJSk5EQUVMKGRfa2V5KS9EX0tFWS9nCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLSNkZWZpbmUgQUVTX01JTl9LRVlfU0laRQkxNgotI2RlZmluZSBBRVNfTUFYX0tFWV9TSVpFCTMyCi0KLSNkZWZpbmUgQUVTX0JMT0NLX1NJWkUJCTE2Ci0KLXN0YXRpYyBpbmxpbmUKLXUzMiBnZW5lcmljX3JvdHIzMiAoY29uc3QgdTMyIHgsIGNvbnN0IHVuc2lnbmVkIGJpdHMpCi17Ci0JY29uc3QgdW5zaWduZWQgbiA9IGJpdHMgJSAzMjsKLQlyZXR1cm4gKHggPj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXUzMiBnZW5lcmljX3JvdGwzMiAoY29uc3QgdTMyIHgsIGNvbnN0IHVuc2lnbmVkIGJpdHMpCi17Ci0JY29uc3QgdW5zaWduZWQgbiA9IGJpdHMgJSAzMjsKLQlyZXR1cm4gKHggPDwgbikgfCAoeCA+PiAoMzIgLSBuKSk7Ci19Ci0KLSNkZWZpbmUgcm90bCBnZW5lcmljX3JvdGwzMgotI2RlZmluZSByb3RyIGdlbmVyaWNfcm90cjMyCi0KLS8qCi0gKiAjZGVmaW5lIGJ5dGUoeCwgbnIpICgodW5zaWduZWQgY2hhcikoKHgpID4+IChucio4KSkpCi0gKi8KLWlubGluZSBzdGF0aWMgdTgKLWJ5dGUoY29uc3QgdTMyIHgsIGNvbnN0IHVuc2lnbmVkIG4pCi17Ci0JcmV0dXJuIHggPj4gKG4gPDwgMyk7Ci19Ci0KLSNkZWZpbmUgdTMyX2luKHgpIGxlMzJfdG9fY3B1KCooY29uc3QgdTMyICopKHgpKQotI2RlZmluZSB1MzJfb3V0KHRvLCBmcm9tKSAoKih1MzIgKikodG8pID0gY3B1X3RvX2xlMzIoZnJvbSkpCi0KLXN0cnVjdCBhZXNfY3R4IHsKLQlpbnQga2V5X2xlbmd0aDsKLQl1MzIgRVs2MF07Ci0JdTMyIERbNjBdOwotfTsKLQotI2RlZmluZSBFX0tFWSBjdHgtPkUKLSNkZWZpbmUgRF9LRVkgY3R4LT5ECi0KLXN0YXRpYyB1OCBwb3dfdGFiWzI1Nl0gX19pbml0ZGF0YTsKLXN0YXRpYyB1OCBsb2dfdGFiWzI1Nl0gX19pbml0ZGF0YTsKLXN0YXRpYyB1OCBzYnhfdGFiWzI1Nl0gX19pbml0ZGF0YTsKLXN0YXRpYyB1OCBpc2JfdGFiWzI1Nl0gX19pbml0ZGF0YTsKLXN0YXRpYyB1MzIgcmNvX3RhYlsxMF07Ci1zdGF0aWMgdTMyIGZ0X3RhYls0XVsyNTZdOwotc3RhdGljIHUzMiBpdF90YWJbNF1bMjU2XTsKLQotc3RhdGljIHUzMiBmbF90YWJbNF1bMjU2XTsKLXN0YXRpYyB1MzIgaWxfdGFiWzRdWzI1Nl07Ci0KLXN0YXRpYyBpbmxpbmUgdTggX19pbml0Ci1mX211bHQgKHU4IGEsIHU4IGIpCi17Ci0JdTggYWEgPSBsb2dfdGFiW2FdLCBjYyA9IGFhICsgbG9nX3RhYltiXTsKLQotCXJldHVybiBwb3dfdGFiW2NjICsgKGNjIDwgYWEgPyAxIDogMCldOwotfQotCi0jZGVmaW5lIGZmX211bHQoYSxiKSAgICAoYSAmJiBiID8gZl9tdWx0KGEsIGIpIDogMCkKLQotI2RlZmluZSBmX3JuKGJvLCBiaSwgbiwgaykJCQkJCVwKLSAgICBib1tuXSA9ICBmdF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCi0JICAgICBmdF90YWJbMV1bYnl0ZShiaVsobiArIDEpICYgM10sMSldIF4JCVwKLQkgICAgIGZ0X3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAotCSAgICAgZnRfdGFiWzNdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDMpXSBeICooayArIG4pCi0KLSNkZWZpbmUgaV9ybihibywgYmksIG4sIGspCQkJCQlcCi0gICAgYm9bbl0gPSAgaXRfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAotCSAgICAgaXRfdGFiWzFdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDEpXSBeCQlcCi0JICAgICBpdF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKLQkgICAgIGl0X3RhYlszXVtieXRlKGJpWyhuICsgMSkgJiAzXSwzKV0gXiAqKGsgKyBuKQotCi0jZGVmaW5lIGxzX2JveCh4KQkJCQlcCi0gICAgKCBmbF90YWJbMF1bYnl0ZSh4LCAwKV0gXgkJCVwKLSAgICAgIGZsX3RhYlsxXVtieXRlKHgsIDEpXSBeCQkJXAotICAgICAgZmxfdGFiWzJdW2J5dGUoeCwgMildIF4JCQlcCi0gICAgICBmbF90YWJbM11bYnl0ZSh4LCAzKV0gKQotCi0jZGVmaW5lIGZfcmwoYm8sIGJpLCBuLCBrKQkJCQkJXAotICAgIGJvW25dID0gIGZsX3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKLQkgICAgIGZsX3RhYlsxXVtieXRlKGJpWyhuICsgMSkgJiAzXSwxKV0gXgkJXAotCSAgICAgZmxfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCi0JICAgICBmbF90YWJbM11bYnl0ZShiaVsobiArIDMpICYgM10sMyldIF4gKihrICsgbikKLQotI2RlZmluZSBpX3JsKGJvLCBiaSwgbiwgaykJCQkJCVwKLSAgICBib1tuXSA9ICBpbF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCi0JICAgICBpbF90YWJbMV1bYnl0ZShiaVsobiArIDMpICYgM10sMSldIF4JCVwKLQkgICAgIGlsX3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAotCSAgICAgaWxfdGFiWzNdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDMpXSBeICooayArIG4pCi0KLXN0YXRpYyB2b2lkIF9faW5pdAotZ2VuX3RhYnMgKHZvaWQpCi17Ci0JdTMyIGksIHQ7Ci0JdTggcCwgcTsKLQotCS8qIGxvZyBhbmQgcG93ZXIgdGFibGVzIGZvciBHRigyKio4KSBmaW5pdGUgZmllbGQgd2l0aAotCSAgIDB4MDExYiBhcyBtb2R1bGFyIHBvbHlub21pYWwgLSB0aGUgc2ltcGxlc3QgcHJpbWl0aXZlCi0JICAgcm9vdCBpcyAweDAzLCB1c2VkIGhlcmUgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlcyAqLwotCi0JZm9yIChpID0gMCwgcCA9IDE7IGkgPCAyNTY7ICsraSkgewotCQlwb3dfdGFiW2ldID0gKHU4KSBwOwotCQlsb2dfdGFiW3BdID0gKHU4KSBpOwotCi0JCXAgXj0gKHAgPDwgMSkgXiAocCAmIDB4ODAgPyAweDAxYiA6IDApOwotCX0KLQotCWxvZ190YWJbMV0gPSAwOwotCi0JZm9yIChpID0gMCwgcCA9IDE7IGkgPCAxMDsgKytpKSB7Ci0JCXJjb190YWJbaV0gPSBwOwotCi0JCXAgPSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0JCXAgPSAoaSA/IHBvd190YWJbMjU1IC0gbG9nX3RhYltpXV0gOiAwKTsKLQkJcSA9ICgocCA+PiA3KSB8IChwIDw8IDEpKSBeICgocCA+PiA2KSB8IChwIDw8IDIpKTsKLQkJcCBePSAweDYzIF4gcSBeICgocSA+PiA2KSB8IChxIDw8IDIpKTsKLQkJc2J4X3RhYltpXSA9IHA7Ci0JCWlzYl90YWJbcF0gPSAodTgpIGk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0JCXAgPSBzYnhfdGFiW2ldOwotCi0JCXQgPSBwOwotCQlmbF90YWJbMF1baV0gPSB0OwotCQlmbF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKLQkJZmxfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOwotCQlmbF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7Ci0KLQkJdCA9ICgodTMyKSBmZl9tdWx0ICgyLCBwKSkgfAotCQkgICAgKCh1MzIpIHAgPDwgOCkgfAotCQkgICAgKCh1MzIpIHAgPDwgMTYpIHwgKCh1MzIpIGZmX211bHQgKDMsIHApIDw8IDI0KTsKLQotCQlmdF90YWJbMF1baV0gPSB0OwotCQlmdF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKLQkJZnRfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOwotCQlmdF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7Ci0KLQkJcCA9IGlzYl90YWJbaV07Ci0KLQkJdCA9IHA7Ci0JCWlsX3RhYlswXVtpXSA9IHQ7Ci0JCWlsX3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOwotCQlpbF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7Ci0JCWlsX3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKLQotCQl0ID0gKCh1MzIpIGZmX211bHQgKDE0LCBwKSkgfAotCQkgICAgKCh1MzIpIGZmX211bHQgKDksIHApIDw8IDgpIHwKLQkJICAgICgodTMyKSBmZl9tdWx0ICgxMywgcCkgPDwgMTYpIHwKLQkJICAgICgodTMyKSBmZl9tdWx0ICgxMSwgcCkgPDwgMjQpOwotCi0JCWl0X3RhYlswXVtpXSA9IHQ7Ci0JCWl0X3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOwotCQlpdF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7Ci0JCWl0X3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKLQl9Ci19Ci0KLSNkZWZpbmUgc3Rhcl94KHgpICgoKHgpICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXiAoKCgoeCkgJiAweDgwODA4MDgwKSA+PiA3KSAqIDB4MWIpCi0KLSNkZWZpbmUgaW1peF9jb2woeSx4KSAgICAgICBcCi0gICAgdSAgID0gc3Rhcl94KHgpOyAgICAgICAgXAotICAgIHYgICA9IHN0YXJfeCh1KTsgICAgICAgIFwKLSAgICB3ICAgPSBzdGFyX3godik7ICAgICAgICBcCi0gICAgdCAgID0gdyBeICh4KTsgICAgICAgICAgXAotICAgKHkpICA9IHUgXiB2IF4gdzsgICAgICAgIFwKLSAgICh5KSBePSByb3RyKHUgXiB0LCAgOCkgXiBcCi0JICByb3RyKHYgXiB0LCAxNikgXiBcCi0JICByb3RyKHQsMjQpCi0KLS8qIGluaXRpYWxpc2UgdGhlIGtleSBzY2hlZHVsZSBmcm9tIHRoZSB1c2VyIHN1cHBsaWVkIGtleSAqLwotCi0jZGVmaW5lIGxvb3A0KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgIHQgPSByb3RyKHQsICA4KTsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07ICAgIFwKLSAgICB0IF49IEVfS0VZWzQgKiBpXTsgICAgIEVfS0VZWzQgKiBpICsgNF0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs0ICogaSArIDFdOyBFX0tFWVs0ICogaSArIDVdID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAyXTsgRV9LRVlbNCAqIGkgKyA2XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzQgKiBpICsgM107IEVfS0VZWzQgKiBpICsgN10gPSB0OyAgICBcCi19Ci0KLSNkZWZpbmUgbG9vcDYoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgdCA9IHJvdHIodCwgIDgpOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsgICAgXAotICAgIHQgXj0gRV9LRVlbNiAqIGldOyAgICAgRV9LRVlbNiAqIGkgKyA2XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzYgKiBpICsgMV07IEVfS0VZWzYgKiBpICsgN10gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs2ICogaSArIDJdOyBFX0tFWVs2ICogaSArIDhdID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAzXTsgRV9LRVlbNiAqIGkgKyA5XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzYgKiBpICsgNF07IEVfS0VZWzYgKiBpICsgMTBdID0gdDsgICBcCi0gICAgdCBePSBFX0tFWVs2ICogaSArIDVdOyBFX0tFWVs2ICogaSArIDExXSA9IHQ7ICAgXAotfQotCi0jZGVmaW5lIGxvb3A4KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgIHQgPSByb3RyKHQsICA4KTsgOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpXTsgICAgIEVfS0VZWzggKiBpICsgOF0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs4ICogaSArIDFdOyBFX0tFWVs4ICogaSArIDldID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAyXTsgRV9LRVlbOCAqIGkgKyAxMF0gPSB0OyAgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpICsgM107IEVfS0VZWzggKiBpICsgMTFdID0gdDsgICBcCi0gICAgdCAgPSBFX0tFWVs4ICogaSArIDRdIF4gbHNfYm94KHQpOyAgICBcCi0gICAgRV9LRVlbOCAqIGkgKyAxMl0gPSB0OyAgICAgICAgICAgICAgICBcCi0gICAgdCBePSBFX0tFWVs4ICogaSArIDVdOyBFX0tFWVs4ICogaSArIDEzXSA9IHQ7ICAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA2XTsgRV9LRVlbOCAqIGkgKyAxNF0gPSB0OyAgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpICsgN107IEVfS0VZWzggKiBpICsgMTVdID0gdDsgICBcCi19Ci0KLXN0YXRpYyBpbnQKLWFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQotewotCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOwotCXUzMiBpLCB0LCB1LCB2LCB3OwotCi0JaWYgKGtleV9sZW4gIT0gMTYgJiYga2V5X2xlbiAhPSAyNCAmJiBrZXlfbGVuICE9IDMyKSB7Ci0JCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKLQotCUVfS0VZWzBdID0gdTMyX2luIChpbl9rZXkpOwotCUVfS0VZWzFdID0gdTMyX2luIChpbl9rZXkgKyA0KTsKLQlFX0tFWVsyXSA9IHUzMl9pbiAoaW5fa2V5ICsgOCk7Ci0JRV9LRVlbM10gPSB1MzJfaW4gKGluX2tleSArIDEyKTsKLQotCXN3aXRjaCAoa2V5X2xlbikgewotCWNhc2UgMTY6Ci0JCXQgPSBFX0tFWVszXTsKLQkJZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCi0JCQlsb29wNCAoaSk7Ci0JCWJyZWFrOwotCi0JY2FzZSAyNDoKLQkJRV9LRVlbNF0gPSB1MzJfaW4gKGluX2tleSArIDE2KTsKLQkJdCA9IEVfS0VZWzVdID0gdTMyX2luIChpbl9rZXkgKyAyMCk7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JCQlsb29wNiAoaSk7Ci0JCWJyZWFrOwotCi0JY2FzZSAzMjoKLQkJRV9LRVlbNF0gPSB1MzJfaW4gKGluX2tleSArIDE2KTsKLQkJRV9LRVlbNV0gPSB1MzJfaW4gKGluX2tleSArIDIwKTsKLQkJRV9LRVlbNl0gPSB1MzJfaW4gKGluX2tleSArIDI0KTsKLQkJdCA9IEVfS0VZWzddID0gdTMyX2luIChpbl9rZXkgKyAyOCk7Ci0JCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCi0JCQlsb29wOCAoaSk7Ci0JCWJyZWFrOwotCX0KLQotCURfS0VZWzBdID0gRV9LRVlbMF07Ci0JRF9LRVlbMV0gPSBFX0tFWVsxXTsKLQlEX0tFWVsyXSA9IEVfS0VZWzJdOwotCURfS0VZWzNdID0gRV9LRVlbM107Ci0KLQlmb3IgKGkgPSA0OyBpIDwga2V5X2xlbiArIDI0OyArK2kpIHsKLQkJaW1peF9jb2wgKERfS0VZW2ldLCBFX0tFWVtpXSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGVuY3J5cHQgYSBibG9jayBvZiB0ZXh0ICovCi0KLSNkZWZpbmUgZl9ucm91bmQoYm8sIGJpLCBrKSBcCi0gICAgZl9ybihibywgYmksIDAsIGspOyAgICAgXAotICAgIGZfcm4oYm8sIGJpLCAxLCBrKTsgICAgIFwKLSAgICBmX3JuKGJvLCBiaSwgMiwgayk7ICAgICBcCi0gICAgZl9ybihibywgYmksIDMsIGspOyAgICAgXAotICAgIGsgKz0gNAotCi0jZGVmaW5lIGZfbHJvdW5kKGJvLCBiaSwgaykgXAotICAgIGZfcmwoYm8sIGJpLCAwLCBrKTsgICAgIFwKLSAgICBmX3JsKGJvLCBiaSwgMSwgayk7ICAgICBcCi0gICAgZl9ybChibywgYmksIDIsIGspOyAgICAgXAotICAgIGZfcmwoYm8sIGJpLCAzLCBrKQotCi1zdGF0aWMgdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCi17Ci0JY29uc3Qgc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7Ci0JdTMyIGIwWzRdLCBiMVs0XTsKLQljb25zdCB1MzIgKmtwID0gRV9LRVkgKyA0OwotCi0JYjBbMF0gPSB1MzJfaW4gKGluKSBeIEVfS0VZWzBdOwotCWIwWzFdID0gdTMyX2luIChpbiArIDQpIF4gRV9LRVlbMV07Ci0JYjBbMl0gPSB1MzJfaW4gKGluICsgOCkgXiBFX0tFWVsyXTsKLQliMFszXSA9IHUzMl9pbiAoaW4gKyAxMikgXiBFX0tFWVszXTsKLQotCWlmIChjdHgtPmtleV9sZW5ndGggPiAyNCkgewotCQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQl9Ci0KLQlpZiAoY3R4LT5rZXlfbGVuZ3RoID4gMTYpIHsKLQkJZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JfQotCi0JZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JZl9ucm91bmQgKGIwLCBiMSwga3ApOwotCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JZl9scm91bmQgKGIwLCBiMSwga3ApOwotCi0JdTMyX291dCAob3V0LCBiMFswXSk7Ci0JdTMyX291dCAob3V0ICsgNCwgYjBbMV0pOwotCXUzMl9vdXQgKG91dCArIDgsIGIwWzJdKTsKLQl1MzJfb3V0IChvdXQgKyAxMiwgYjBbM10pOwotfQotCi0vKiBkZWNyeXB0IGEgYmxvY2sgb2YgdGV4dCAqLwotCi0jZGVmaW5lIGlfbnJvdW5kKGJvLCBiaSwgaykgXAotICAgIGlfcm4oYm8sIGJpLCAwLCBrKTsgICAgIFwKLSAgICBpX3JuKGJvLCBiaSwgMSwgayk7ICAgICBcCi0gICAgaV9ybihibywgYmksIDIsIGspOyAgICAgXAotICAgIGlfcm4oYm8sIGJpLCAzLCBrKTsgICAgIFwKLSAgICBrIC09IDQKLQotI2RlZmluZSBpX2xyb3VuZChibywgYmksIGspIFwKLSAgICBpX3JsKGJvLCBiaSwgMCwgayk7ICAgICBcCi0gICAgaV9ybChibywgYmksIDEsIGspOyAgICAgXAotICAgIGlfcmwoYm8sIGJpLCAyLCBrKTsgICAgIFwKLSAgICBpX3JsKGJvLCBiaSwgMywgaykKLQotc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQotewotCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOwotCXUzMiBiMFs0XSwgYjFbNF07Ci0JY29uc3QgaW50IGtleV9sZW4gPSBjdHgtPmtleV9sZW5ndGg7Ci0JY29uc3QgdTMyICprcCA9IERfS0VZICsga2V5X2xlbiArIDIwOwotCi0JYjBbMF0gPSB1MzJfaW4gKGluKSBeIEVfS0VZW2tleV9sZW4gKyAyNF07Ci0JYjBbMV0gPSB1MzJfaW4gKGluICsgNCkgXiBFX0tFWVtrZXlfbGVuICsgMjVdOwotCWIwWzJdID0gdTMyX2luIChpbiArIDgpIF4gRV9LRVlba2V5X2xlbiArIDI2XTsKLQliMFszXSA9IHUzMl9pbiAoaW4gKyAxMikgXiBFX0tFWVtrZXlfbGVuICsgMjddOwotCi0JaWYgKGtleV9sZW4gPiAyNCkgewotCQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQl9Ci0KLQlpZiAoa2V5X2xlbiA+IDE2KSB7Ci0JCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQkJaV9ucm91bmQgKGIwLCBiMSwga3ApOwotCX0KLQotCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JaV9ucm91bmQgKGIwLCBiMSwga3ApOwotCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCWlfbHJvdW5kIChiMCwgYjEsIGtwKTsKLQotCXUzMl9vdXQgKG91dCwgYjBbMF0pOwotCXUzMl9vdXQgKG91dCArIDQsIGIwWzFdKTsKLQl1MzJfb3V0IChvdXQgKyA4LCBiMFsyXSk7Ci0JdTMyX291dCAob3V0ICsgMTIsIGIwWzNdKTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWVzX2FsZyA9IHsKLQkuY3JhX25hbWUJCT0JImFlcyIsCi0JLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAotCS5jcmFfYmxvY2tzaXplCQk9CUFFU19CTE9DS19TSVpFLAotCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGFlc19jdHgpLAotCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAotCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChhZXNfYWxnLmNyYV9saXN0KSwKLQkuY3JhX3UJCQk9CXsKLQkJLmNpcGhlciA9IHsKLQkJCS5jaWFfbWluX2tleXNpemUJPQlBRVNfTUlOX0tFWV9TSVpFLAotCQkJLmNpYV9tYXhfa2V5c2l6ZQk9CUFFU19NQVhfS0VZX1NJWkUsCi0JCQkuY2lhX3NldGtleQkJPQlhZXNfc2V0X2tleSwKLQkJCS5jaWFfZW5jcnlwdAkJPQlhZXNfZW5jcnlwdCwKLQkJCS5jaWFfZGVjcnlwdAkJPQlhZXNfZGVjcnlwdAotCQl9Ci0JfQotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWVzX2luaXQodm9pZCkKLXsKLQlnZW5fdGFicygpOwotCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFlc19maW5pKHZvaWQpCi17Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKLX0KLQotbW9kdWxlX2luaXQoYWVzX2luaXQpOwotbW9kdWxlX2V4aXQoYWVzX2ZpbmkpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlJpam5kYWVsIChBRVMpIENpcGhlciBBbGdvcml0aG0iKTsKLU1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXJjNC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTBlOWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJCi0gKgotICogQVJDNCBDaXBoZXIgQWxnb3JpdGhtCi0gKgotICogSm9uIE9iZXJoZWlkZSA8am9uQG9iZXJoZWlkZS5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotCi0jZGVmaW5lIEFSQzRfTUlOX0tFWV9TSVpFCTEKLSNkZWZpbmUgQVJDNF9NQVhfS0VZX1NJWkUJMjU2Ci0jZGVmaW5lIEFSQzRfQkxPQ0tfU0laRQkJMQotCi1zdHJ1Y3QgYXJjNF9jdHggewotCXU4IFNbMjU2XTsKLQl1OCB4LCB5OwotfTsKLQotc3RhdGljIGludCBhcmM0X3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCi17Ci0Jc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjdHhfYXJnOwotCWludCBpLCBqID0gMCwgayA9IDA7Ci0KLQljdHgtPnggPSAxOwotCWN0eC0+eSA9IDA7Ci0KLQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJY3R4LT5TW2ldID0gaTsKLQotCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQotCXsKLQkJdTggYSA9IGN0eC0+U1tpXTsKLQkJaiA9IChqICsgaW5fa2V5W2tdICsgYSkgJiAweGZmOwotCQljdHgtPlNbaV0gPSBjdHgtPlNbal07Ci0JCWN0eC0+U1tqXSA9IGE7Ci0JCWlmKCh1bnNpZ25lZCBpbnQpKytrID49IGtleV9sZW4pCi0JCQlrID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXJjNF9jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCi17Ci0Jc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjdHhfYXJnOwotCi0JdTggKmNvbnN0IFMgPSBjdHgtPlM7Ci0JdTggeCA9IGN0eC0+eDsKLQl1OCB5ID0gY3R4LT55OwotCXU4IGEsIGI7Ci0KLQlhID0gU1t4XTsKLQl5ID0gKHkgKyBhKSAmIDB4ZmY7Ci0JYiA9IFNbeV07Ci0JU1t4XSA9IGI7Ci0JU1t5XSA9IGE7Ci0JeCA9ICh4ICsgMSkgJiAweGZmOwotCSpvdXQrKyA9ICppbiBeIFNbKGEgKyBiKSAmIDB4ZmZdOwotCi0JY3R4LT54ID0geDsKLQljdHgtPnkgPSB5OwotfQotCi1zdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYXJjNF9hbGcgPSB7Ci0JLmNyYV9uYW1lCQk9CSJhcmM0IiwKLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JQVJDNF9CTE9DS19TSVpFLAotCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGFyYzRfY3R4KSwKLQkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKLQkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYXJjNF9hbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewotCS5jaWFfbWluX2tleXNpemUJPQlBUkM0X01JTl9LRVlfU0laRSwKLQkuY2lhX21heF9rZXlzaXplCT0JQVJDNF9NQVhfS0VZX1NJWkUsCi0JLmNpYV9zZXRrZXkJCT0JYXJjNF9zZXRfa2V5LAotCS5jaWFfZW5jcnlwdAkJPQlhcmM0X2NyeXB0LAotCS5jaWFfZGVjcnlwdAkJPQlhcmM0X2NyeXB0IH0gfQotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXJjNF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFyYzRfYWxnKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXJjNF9leGl0KHZvaWQpCi17Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhcmM0X2FsZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGFyYzRfaW5pdCk7Ci1tb2R1bGVfZXhpdChhcmM0X2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFSQzQgQ2lwaGVyIEFsZ29yaXRobSIpOwotTU9EVUxFX0FVVEhPUigiSm9uIE9iZXJoZWlkZSA8am9uQG9iZXJoZWlkZS5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2F1dG9sb2FkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2F1dG9sb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Nzc1NmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIEFsZ29yaXRobSBhdXRvbG9hZGVyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgImttYXBfdHlwZXMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi0vKgotICogQSBmYXIgbW9yZSBpbnRlbGxpZ2VudCB2ZXJzaW9uIG9mIHRoaXMgaXMgcGxhbm5lZC4gIEZvciBub3csIGp1c3QKLSAqIHRyeSBhbiBleGFjdCBtYXRjaCBvbiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLgotICovCi12b2lkIGNyeXB0b19hbGdfYXV0b2xvYWQoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlyZXF1ZXN0X21vZHVsZShuYW1lKTsKLX0KLQotc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSBjcnlwdG9fYWxnX2xvb2t1cChuYW1lKTsKLQlpZiAoYWxnID09IE5VTEwpIHsKLQkJY3J5cHRvX2FsZ19hdXRvbG9hZChuYW1lKTsKLQkJYWxnID0gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7Ci0JfQotCXJldHVybiBhbGc7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NpcGhlci5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3MzQ1Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NpcGhlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBDaXBoZXIgb3BlcmF0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAic2NhdHRlcndhbGsuaCIKLQotdHlwZWRlZiB2b2lkIChjcnlwdGZuX3QpKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKik7Ci10eXBlZGVmIHZvaWQgKHByb2Nmbl90KShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLAotCQkJdTgqLCBjcnlwdGZuX3QsIGludCBlbmMsIHZvaWQgKiwgaW50KTsKLQotc3RhdGljIGlubGluZSB2b2lkIHhvcl82NCh1OCAqYSwgY29uc3QgdTggKmIpCi17Ci0JKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOwotCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHhvcl8xMjgodTggKmEsIGNvbnN0IHU4ICpiKQotewotCSgodTMyICopYSlbMF0gXj0gKCh1MzIgKiliKVswXTsKLQkoKHUzMiAqKWEpWzFdIF49ICgodTMyICopYilbMV07Ci0JKCh1MzIgKilhKVsyXSBePSAoKHUzMiAqKWIpWzJdOwotCSgodTMyICopYSlbM10gXj0gKCh1MzIgKiliKVszXTsKLX0KLQotCi0vKgotICogR2VuZXJpYyBlbmNyeXB0L2RlY3J5cHQgd3JhcHBlciBmb3IgY2lwaGVycywgaGFuZGxlcyBvcGVyYXRpb25zIGFjcm9zcwotICogbXVsdGlwbGUgcGFnZSBib3VuZGFyaWVzIGJ5IHVzaW5nIHRlbXBvcmFyeSBibG9ja3MuICBJbiB1c2VyIGNvbnRleHQsCi0gKiB0aGUga2VybmVsIGlzIGdpdmVuIGEgY2hhbmNlIHRvIHNjaGVkdWxlIHVzIG9uY2UgcGVyIGJsb2NrLgotICovCi1zdGF0aWMgaW50IGNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgdW5zaWduZWQgaW50IG5ieXRlcywgY3J5cHRmbl90IGNyZm4sCi0JCSBwcm9jZm5fdCBwcmZuLCBpbnQgZW5jLCB2b2lkICppbmZvKQotewotCXN0cnVjdCBzY2F0dGVyX3dhbGsgd2Fsa19pbiwgd2Fsa19vdXQ7Ci0JY29uc3QgdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7Ci0JdTggdG1wX3NyY1tic2l6ZV07Ci0JdTggdG1wX2RzdFtic2l6ZV07Ci0KLQlpZiAoIW5ieXRlcykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobmJ5dGVzICUgYnNpemUpIHsKLQkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfaW4sIHNyYyk7Ci0Jc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfb3V0LCBkc3QpOwotCi0JZm9yKDs7KSB7Ci0JCXU4ICpzcmNfcCwgKmRzdF9wOwotCQlpbnQgaW5fcGxhY2U7Ci0KLQkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX2luKTsKLQkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX291dCk7Ci0JCXNyY19wID0gc2NhdHRlcndhbGtfd2hpY2hidWYoJndhbGtfaW4sIGJzaXplLCB0bXBfc3JjKTsKLQkJZHN0X3AgPSBzY2F0dGVyd2Fsa193aGljaGJ1Zigmd2Fsa19vdXQsIGJzaXplLCB0bXBfZHN0KTsKLQkJaW5fcGxhY2UgPSBzY2F0dGVyd2Fsa19zYW1lYnVmKCZ3YWxrX2luLCAmd2Fsa19vdXQsCi0JCQkJCSAgICAgICBzcmNfcCwgZHN0X3ApOwotCi0JCW5ieXRlcyAtPSBic2l6ZTsKLQotCQlzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHNyY19wLCAmd2Fsa19pbiwgYnNpemUsIDApOwotCi0JCXByZm4odGZtLCBkc3RfcCwgc3JjX3AsIGNyZm4sIGVuYywgaW5mbywgaW5fcGxhY2UpOwotCi0JCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfaW4sIG5ieXRlcyk7Ci0KLQkJc2NhdHRlcndhbGtfY29weWNodW5rcyhkc3RfcCwgJndhbGtfb3V0LCBic2l6ZSwgMSk7Ci0JCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfb3V0LCBuYnl0ZXMpOwotCi0JCWlmICghbmJ5dGVzKQotCQkJcmV0dXJuIDA7Ci0KLQkJY3J5cHRvX3lpZWxkKHRmbSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjYmNfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAotCQkJY3J5cHRmbl90IGZuLCBpbnQgZW5jLCB2b2lkICppbmZvLCBpbnQgaW5fcGxhY2UpCi17Ci0JdTggKml2ID0gaW5mbzsKLQotCS8qIE51bGwgZW5jcnlwdGlvbiAqLwotCWlmICghaXYpCi0JCXJldHVybjsKLQotCWlmIChlbmMpIHsKLQkJdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jayhpdiwgc3JjKTsKLQkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBpdik7Ci0JCW1lbWNweShpdiwgZHN0LCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7Ci0JfSBlbHNlIHsKLQkJdTggc3RhY2tbaW5fcGxhY2UgPyBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSA6IDBdOwotCQl1OCAqYnVmID0gaW5fcGxhY2UgPyBzdGFjayA6IGRzdDsKLQotCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBidWYsIHNyYyk7Ci0JCXRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2soYnVmLCBpdik7Ci0JCW1lbWNweShpdiwgc3JjLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7Ci0JCWlmIChidWYgIT0gZHN0KQotCQkJbWVtY3B5KGRzdCwgYnVmLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlY2JfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAotCQkJY3J5cHRmbl90IGZuLCBpbnQgZW5jLCB2b2lkICppbmZvLCBpbnQgaW5fcGxhY2UpCi17Ci0JZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOwotfQotCi1zdGF0aWMgaW50IHNldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQotewotCXN0cnVjdCBjaXBoZXJfYWxnICpjaWEgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7Ci0KLQlpZiAoa2V5bGVuIDwgY2lhLT5jaWFfbWluX2tleXNpemUgfHwga2V5bGVuID4gY2lhLT5jaWFfbWF4X2tleXNpemUpIHsKLQkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZQotCQlyZXR1cm4gY2lhLT5jaWFfc2V0a2V5KGNyeXB0b190Zm1fY3R4KHRmbSksIGtleSwga2V5bGVuLAotCQkJCSAgICAgICAmdGZtLT5jcnRfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGVjYl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCi0JCSAgICAgZWNiX3Byb2Nlc3MsIDEsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCQkgICAgIGVjYl9wcm9jZXNzLCAxLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBjYmNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKLQkJICAgICBjYmNfcHJvY2VzcywgMSwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKLQkJICAgICBjYmNfcHJvY2VzcywgMSwgaXYpOwotfQotCi1zdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCQkgICAgIGNiY19wcm9jZXNzLCAwLCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKLX0KLQotc3RhdGljIGludCBjYmNfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCQkgICAgIGNiY19wcm9jZXNzLCAwLCBpdik7Ci19Ci0KLXN0YXRpYyBpbnQgbm9jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgbm9jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCi17Ci0JdTMyIG1vZGUgPSBmbGFncyAmIENSWVBUT19URk1fTU9ERV9NQVNLOwotCi0JdGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID0gbW9kZSA/IG1vZGUgOiBDUllQVE9fVEZNX01PREVfRUNCOwotCWlmIChmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKQotCQl0Zm0tPmNydF9mbGFncyA9IENSWVBUT19URk1fUkVRX1dFQUtfS0VZOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGNpcGhlcl90Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jaXBoZXI7Ci0KLQlvcHMtPmNpdF9zZXRrZXkgPSBzZXRrZXk7Ci0KLQlzd2l0Y2ggKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSkgewotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0VDQjoKLQkJb3BzLT5jaXRfZW5jcnlwdCA9IGVjYl9lbmNyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gZWNiX2RlY3J5cHQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUllQVE9fVEZNX01PREVfQ0JDOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gY2JjX2VuY3J5cHQ7Ci0JCW9wcy0+Y2l0X2RlY3J5cHQgPSBjYmNfZGVjcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IGNiY19lbmNyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gY2JjX2RlY3J5cHRfaXY7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUllQVE9fVEZNX01PREVfQ0ZCOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZGVjcnlwdCA9IG5vY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJYnJlYWs7Ci0KLQljYXNlIENSWVBUT19URk1fTU9ERV9DVFI6Ci0JCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCWlmIChvcHMtPmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9DQkMpIHsKLQotCQlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKSB7Ci0JCWNhc2UgODoKLQkJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl82NDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMTY6Ci0JCQlvcHMtPmNpdF94b3JfYmxvY2sgPSB4b3JfMTI4OwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBibG9jayBzaXplICV1IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pLAotCQkJICAgICAgIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCW9wcy0+Y2l0X2l2c2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCQlvcHMtPmNpdF9pdiA9IGttYWxsb2Mob3BzLT5jaXRfaXZzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKG9wcy0+Y2l0X2l2ID09IE5VTEwpCi0JCQlyZXQgPSAtRU5PTUVNOwotCX0KLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCWtmcmVlKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE2YWI2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBDb21wcmVzc2lvbiBvcGVyYXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0vKiNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4qLwotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIGludCBjcnlwdG9fY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCSAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCi17Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2NvbXByZXNzKGNyeXB0b190Zm1fY3R4KHRmbSksCi0JCQkJCQkJIHNyYywgc2xlbiwgZHN0LAotCQkJCQkJCSBkbGVuKTsKLX0KLQotc3RhdGljIGludCBjcnlwdG9fZGVjb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCSAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQotewotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9kZWNvbXByZXNzKGNyeXB0b190Zm1fY3R4KHRmbSksCi0JCQkJCQkJICAgc3JjLCBzbGVuLCBkc3QsCi0JCQkJCQkJICAgZGxlbik7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIGZsYWdzID8gLUVJTlZBTCA6IDA7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY29tcHJlc3NfdGZtICpvcHMgPSAmdGZtLT5jcnRfY29tcHJlc3M7Ci0KLQlyZXQgPSB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9pbml0KGNyeXB0b190Zm1fY3R4KHRmbSkpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0Jb3BzLT5jb3RfY29tcHJlc3MgPSBjcnlwdG9fY29tcHJlc3M7Ci0Jb3BzLT5jb3RfZGVjb21wcmVzcyA9IGNyeXB0b19kZWNvbXByZXNzOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBjcnlwdG9fZXhpdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9leGl0KGNyeXB0b190Zm1fY3R4KHRmbSkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jcnlwdG9fY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhMzc0YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBIZWFkZXIgZmlsZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IGFtb25nIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgIDxsYXdyZW5jZV93YW5nQHJlYWxzaWwuY29tLmNuPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLSBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7Ci0JaW50IGVycjsKLQlwcmludGsoImNhbGwgY3J5cHRvX2FsbG9jX3RmbSEhIVxuIik7Ci0JZG8gewotCQlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOwotCi0JCWFsZyA9IGNyeXB0b19hbGdfbW9kX2xvb2t1cChuYW1lLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKLQkJZXJyID0gUFRSX0VSUihhbGcpOwotCQlpZiAoSVNfRVJSKGFsZykpCi0JCQljb250aW51ZTsKLQotCQl0Zm0gPSBfX2NyeXB0b19hbGxvY190Zm0oYWxnLCBmbGFncyk7Ci0JCWVyciA9IDA7Ci0JCWlmIChJU19FUlIodGZtKSkgewotCQkJY3J5cHRvX21vZF9wdXQoYWxnKTsKLQkJCWVyciA9IFBUUl9FUlIodGZtKTsKLQkJCXRmbSA9IE5VTEw7Ci0JCX0KLQl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTiAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOwotCi0JcmV0dXJuIHRmbTsKLX0KLS8vRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsbG9jX3RmbSk7Ci0vL0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19mcmVlX3RmbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kaWdlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlNzQ5Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBEaWdlc3Qgb3BlcmF0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0YXRpYyB2b2lkIGluaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspIHsKLQotCQlzdHJ1Y3QgcGFnZSAqcGcgPSBzZ1tpXS5wYWdlOwotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2dbaV0ub2Zmc2V0OwotCQl1bnNpZ25lZCBpbnQgbCA9IHNnW2ldLmxlbmd0aDsKLQotCQlkbyB7Ci0JCQl1bnNpZ25lZCBpbnQgYnl0ZXNfZnJvbV9wYWdlID0gbWluKGwsICgodW5zaWduZWQgaW50KQotCQkJCQkJCSAgIChQQUdFX1NJWkUpKSAtCi0JCQkJCQkJICAgb2Zmc2V0KTsKLQkJCWNoYXIgKnAgPSBrbWFwX2F0b21pYyhwZykgKyBvZmZzZXQ7Ci0KLQkJCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV91cGRhdGUKLQkJCQkJKGNyeXB0b190Zm1fY3R4KHRmbSksIHAsCi0JCQkJCSBieXRlc19mcm9tX3BhZ2UpOwotCQkJa3VubWFwX2F0b21pYyhwKTsKLQkJCWNyeXB0b195aWVsZCh0Zm0pOwotCQkJb2Zmc2V0ID0gMDsKLQkJCXBnKys7Ci0JCQlsIC09IGJ5dGVzX2Zyb21fcGFnZTsKLQkJfSB3aGlsZSAobCA+IDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKLXsKLQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZmluYWwoY3J5cHRvX3RmbV9jdHgodGZtKSwgb3V0KTsKLX0KLQotc3RhdGljIGludCBzZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQl1MzIgZmxhZ3M7Ci0JaWYgKHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkoY3J5cHRvX3RmbV9jdHgodGZtKSwKLQkJCQkJCSAgICAga2V5LCBrZXlsZW4sICZmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQotewotCXVuc2lnbmVkIGludCBpOwotCi0JdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspIHsKLQkJY2hhciAqcCA9IGttYXBfYXRvbWljKHNnW2ldLnBhZ2UpICsgc2dbaV0ub2Zmc2V0OwotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfdXBkYXRlKGNyeXB0b190Zm1fY3R4KHRmbSksCi0JCQkJCQkgICAgICBwLCBzZ1tpXS5sZW5ndGgpOwotCQlrdW5tYXBfYXRvbWljKHApOwotCQljcnlwdG9feWllbGQodGZtKTsKLQl9Ci0JY3J5cHRvX2RpZ2VzdF9maW5hbCh0Zm0sIG91dCk7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQotewotCXJldHVybiBmbGFncyA/IC1FSU5WQUwgOiAwOwotfQotCi1pbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXN0cnVjdCBkaWdlc3RfdGZtICpvcHMgPSAmdGZtLT5jcnRfZGlnZXN0OwotCi0Jb3BzLT5kaXRfaW5pdAk9IGluaXQ7Ci0Jb3BzLT5kaXRfdXBkYXRlCT0gdXBkYXRlOwotCW9wcy0+ZGl0X2ZpbmFsCT0gZmluYWw7Ci0Jb3BzLT5kaXRfZGlnZXN0CT0gZGlnZXN0OwotCW9wcy0+ZGl0X3NldGtleQk9IHNldGtleTsKLQotCXJldHVybiBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayh0Zm0pOwotfQotCi12b2lkIGNyeXB0b19leGl0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQljcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHRmbSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwppbmRleCAzNGVkY2ZhLi45MGFjZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTEsMTYgKzEsOCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8JRmlsZToKLS8vCQlEb3QxMWQuYwotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCUltcGxlbWVudCA4MDIuMTFkLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIEltcGxlbWVudCA4MDIuMTFkLiAqLwogCiAjaW5jbHVkZSAiZG90MTFkLmgiCiAKLXZvaWQKLURvdDExZF9Jbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQordm9pZCBEb3QxMWRfSW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7CiAKQEAgLTIyLDU1ICsxNCw0MiBAQAogCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CiAJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwogCi0JcHJpbnRrKCJEb3QxMWRfSW5pdCgpXG4iKTsKKwluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJEb3QxMWRfSW5pdCgpXG4iKTsKIH0KK0VYUE9SVF9TWU1CT0woRG90MTFkX0luaXQpOwogCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJUmVzZXQgdG8gdGhlIHN0YXRlIGFzIHdlIGFyZSBqdXN0IGVudGVyaW5nIGEgcmVndWxhdG9yeSBkb21haW4uCi0vLwotdm9pZAotRG90MTFkX1Jlc2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorLyogUmVzZXQgdG8gdGhlIHN0YXRlIGFzIHdlIGFyZSBqdXN0IGVudGVyaW5nIGEgcmVndWxhdG9yeSBkb21haW4uICovCit2b2lkIERvdDExZF9SZXNldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1MzIgaTsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7Ci0JLy8gQ2xlYXIgb2xkIGNoYW5uZWwgbWFwCisJLyogQ2xlYXIgb2xkIGNoYW5uZWwgbWFwICovCiAJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwogCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0JLy8gU2V0IG5ldyBjaGFubmVsIG1hcAotCWZvciAoaT0xOyBpPD0xMTsgaSsrKSB7CisJLyogU2V0IG5ldyBjaGFubmVsIG1hcCAqLworCWZvciAoaSA9IDE7IGkgPD0gMTE7IGkrKykKIAkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAxOwotCX0KLQlmb3IgKGk9MTI7IGk8PTE0OyBpKyspIHsKKworCWZvciAoaSA9IDEyOyBpIDw9IDE0OyBpKyspCiAJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMjsKLQl9CiAKIAlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsKIAlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKIAlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Ci0KLQkvL3ByaW50aygiRG90MTFkX1Jlc2V0KClcbiIpOwogfQorRVhQT1JUX1NZTUJPTChEb3QxMWRfUmVzZXQpOwogCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJVXBkYXRlIGNvdW50cnkgSUUgZnJvbSBCZWFjb24gb3IgUHJvYmUgUmVzb3Buc2UKLS8vCQlhbmQgY29uZmlndXJlIFBIWSBmb3Igb3BlcmF0aW9uIGluIHRoZSByZWd1bGF0b3J5IGRvbWFpbi4KLS8vCi0vLwlUT0RPOgotLy8JCUNvbmZpZ3VyZSBUeCBwb3dlci4KLS8vCi0vLwlBc3N1bXB0aW9uOgotLy8JCTEuIElTX0RPVDExRF9FTkFCTEUoKSBpcyBUUlVFLgotLy8JCTIuIElucHV0IElFIGlzIGFuIHZhbGlkIG9uZS4KLS8vCi12b2lkCi1Eb3QxMWRfVXBkYXRlQ291bnRyeUllKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCi0JdTggKnBUYWRkciwKLQl1MTYJQ291dHJ5SWVMZW4sCi0JdTggKnBDb3V0cnlJZQotCSkKKy8qCisgKiBVcGRhdGUgY291bnRyeSBJRSBmcm9tIEJlYWNvbiBvciBQcm9iZSBSZXNvcG5zZSBhbmQgY29uZmlndXJlIFBIWSBmb3IKKyAqIG9wZXJhdGlvbiBpbiB0aGUgcmVndWxhdG9yeSBkb21haW4uCisgKgorICogVE9ETzogQ29uZmlndXJlIFR4IHBvd2VyLgorICogQXNzdW1wdGlvbjoKKyAqIDEuIElTX0RPVDExRF9FTkFCTEUoKSBpcyBUUlVFLgorICogMi4gSW5wdXQgSUUgaXMgYW4gdmFsaWQgb25lLgorICovCit2b2lkIERvdDExZF9VcGRhdGVDb3VudHJ5SWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwgdTggKnBUYWRkciwKKwkJCSAgICB1MTYgQ291dHJ5SWVMZW4sIHU4ICpwQ291dHJ5SWUpCiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CiAJdTggaSwgaiwgTnVtVHJpcGxlcywgTWF4Q2hubE51bTsKQEAgLTc5LDIzICs1OCwyNSBAQAogCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKIAltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwogCU1heENobmxOdW0gPSAwOwotCU51bVRyaXBsZXMgPSAoQ291dHJ5SWVMZW4gLSAzKSAvIDM7IC8vIHNraXAgMy1ieXRlIGNvdW50cnkgc3RyaW5nLgorCU51bVRyaXBsZXMgPSAoQ291dHJ5SWVMZW4gLSAzKSAvIDM7IC8qIHNraXAgMy1ieXRlIGNvdW50cnkgc3RyaW5nLiAqLwogCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKHBDb3V0cnlJZSArIDMpOwotCWZvcihpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykKLQl7Ci0JCWlmKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKQotCQl7IC8vIEl0IGlzIG5vdCBpbiBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvcmRlciwgc28gc3RvcCBwcm9jZXNzaW5nLgotCQkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7CisJZm9yIChpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykgeworCQlpZiAoTWF4Q2hubE51bSA+PSBwVHJpcGxlLT5GaXJzdENobmwpIHsKKwkJCS8qIEl0IGlzIG5vdCBpbiBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvcmRlciwgc28KKwkJCSAqIHN0b3AgcHJvY2Vzc2luZy4KKwkJCSAqLworCQkJbmV0ZGV2X2VycihkZXYtPmRldiwgIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCAocFRyaXBsZS0+Rmlyc3RDaG5sICsgcFRyaXBsZS0+TnVtQ2hubHMpKQotCQl7IC8vIEl0IGlzIG5vdCBhIHZhbGlkIHNldCBvZiBjaGFubmVsIGlkLCBzbyBzdG9wIHByb2Nlc3NpbmcuCi0JCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsKKwkJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IChwVHJpcGxlLT5GaXJzdENobmwgKyBwVHJpcGxlLT5OdW1DaG5scykpIHsKKwkJCS8qIEl0IGlzIG5vdCBhIHZhbGlkIHNldCBvZiBjaGFubmVsIGlkLCBzbyBzdG9wCisJCQkgKiBwcm9jZXNzaW5nLgorCQkJICovCisJCQluZXRkZXZfZXJyKGRldi0+ZGV2LCAiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJZm9yKGogPSAwIDsgaiA8IHBUcmlwbGUtPk51bUNobmxzOyBqKyspCi0JCXsKKwkJZm9yIChqID0gMDsgaiA8IHBUcmlwbGUtPk51bUNobmxzOyBqKyspIHsKIAkJCXBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtwVHJpcGxlLT5GaXJzdENobmwgKyBqXSA9IDE7CiAJCQlwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtOwogCQkJTWF4Q2hubE51bSA9IHBUcmlwbGUtPkZpcnN0Q2hubCArIGo7CkBAIC0xMDMsNjAgKzg0LDQ4IEBACiAKIAkJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkoKHU4ICopcFRyaXBsZSArIDMpOwogCX0KLQkvL3ByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBDaGFubmVsIExpc3Q6XG4iKTsKLQlwcmludGsoIkNoYW5uZWwgTGlzdDoiKTsKLQlmb3IoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCi0JCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCi0JCQlwcmludGsoIiAlZCIsIGkpOwotCXByaW50aygiXG4iKTsKKwluZXRkZXZfaW5mbyhkZXYtPmRldiwgIkNoYW5uZWwgTGlzdDoiKTsKKwlmb3IgKGkgPSAxOyBpIDw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQorCQlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkKKwkJCW5ldGRldl9pbmZvKGRldi0+ZGV2LCAiICVkIiwgaSk7CisJbmV0ZGV2X2luZm8oZGV2LT5kZXYsICJcbiIpOwogCiAJVVBEQVRFX0NJRV9TUkMoZGV2LCBwVGFkZHIpOwogCiAJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IENvdXRyeUllTGVuOwotCW1lbWNweShwRG90MTFkSW5mby0+Q291bnRyeUllQnVmLCBwQ291dHJ5SWUsQ291dHJ5SWVMZW4pOworCW1lbWNweShwRG90MTFkSW5mby0+Q291bnRyeUllQnVmLCBwQ291dHJ5SWUsIENvdXRyeUllTGVuKTsKIAlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTEVBUk5FRDsKIH0KK0VYUE9SVF9TWU1CT0woRG90MTFkX1VwZGF0ZUNvdW50cnlJZSk7CiAKLQotdTgKLURPVDExRF9HZXRNYXhUeFB3ckluRGJtKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCi0JdTggQ2hhbm5lbAotCSkKK3U4IERPVDExRF9HZXRNYXhUeFB3ckluRGJtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsIHU4IENoYW5uZWwpCiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CiAJdTggTWF4VHhQd3JJbkRibSA9IDI1NTsKIAotCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IENoYW5uZWwpCi0JewotCQlwcmludGsoIkRPVDExRF9HZXRNYXhUeFB3ckluRGJtKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CisJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IENoYW5uZWwpIHsKKwkJbmV0ZGV2X2VycihkZXYtPmRldiwgIkRPVDExRF9HZXRNYXhUeFB3ckluRGJtKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CiAJCXJldHVybiBNYXhUeFB3ckluRGJtOwogCX0KLQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbQ2hhbm5lbF0pCi0JeworCWlmIChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbQ2hhbm5lbF0pCiAJCU1heFR4UHdySW5EYm0gPSBwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W0NoYW5uZWxdOwotCX0KIAogCXJldHVybiBNYXhUeFB3ckluRGJtOwogfQorRVhQT1JUX1NZTUJPTChET1QxMURfR2V0TWF4VHhQd3JJbkRibSk7CiAKLQotdm9pZAotRE9UMTFEX1NjYW5Db21wbGV0ZSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2Ci0JKQordm9pZCBET1QxMURfU2NhbkNvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYpCiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CiAKLQlzd2l0Y2ggKHBEb3QxMWRJbmZvLT5TdGF0ZSkKLQl7CisJc3dpdGNoIChwRG90MTFkSW5mby0+U3RhdGUpIHsKIAljYXNlIERPVDExRF9TVEFURV9MRUFSTkVEOgogCQlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfRE9ORTsKIAkJYnJlYWs7CiAKIAljYXNlIERPVDExRF9TVEFURV9ET05FOgotCQlpZiggR0VUX0NJRV9XQVRDSERPRyhkZXYpID09IDAgKQotCQl7IC8vIFJlc2V0IGNvdW50cnkgSUUgaWYgcHJldmlvdXMgb25lIGlzIGdvbmUuCisJCWlmIChHRVRfQ0lFX1dBVENIRE9HKGRldikgPT0gMCkgeworCQkJLyogUmVzZXQgY291bnRyeSBJRSBpZiBwcmV2aW91cyBvbmUgaXMgZ29uZS4gKi8KIAkJCURvdDExZF9SZXNldChkZXYpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTY0LDU3ICsxMzMsNDMgQEAKIAkJYnJlYWs7CiAJfQogfQorRVhQT1JUX1NZTUJPTChET1QxMURfU2NhbkNvbXBsZXRlKTsKIAotaW50IElzTGVnYWxDaGFubmVsKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCi0JdTggY2hhbm5lbAotKQoraW50IElzTGVnYWxDaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CiAKLQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKQotCXsKLQkJcHJpbnRrKCJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOworCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKSB7CisJCW5ldGRldl9lcnIoZGV2LT5kZXYsICJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKKwlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKElzTGVnYWxDaGFubmVsKTsKIAotaW50IFRvTGVnYWxDaGFubmVsKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCi0JdTggY2hhbm5lbAotKQoraW50IFRvTGVnYWxDaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CiAJdTggZGVmYXVsdF9jaG4gPSAwOwogCXUzMiBpID0gMDsKIAotCWZvciAoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCi0JewotCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQotCQl7CisJZm9yIChpID0gMTsgaSA8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykgeworCQlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkgewogCQkJZGVmYXVsdF9jaG4gPSBpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKQotCXsKLQkJcHJpbnRrKCJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOworCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKSB7CisJCW5ldGRldl9lcnIoZGV2LT5kZXYsICJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOwogCQlyZXR1cm4gZGVmYXVsdF9jaG47CiAJfQogCi0JaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKKwlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKIAkJcmV0dXJuIGNoYW5uZWw7CiAKIAlyZXR1cm4gZGVmYXVsdF9jaG47CiB9Ci1FWFBPUlRfU1lNQk9MKERvdDExZF9Jbml0KTsKLUVYUE9SVF9TWU1CT0woRG90MTFkX1Jlc2V0KTsKLUVYUE9SVF9TWU1CT0woRG90MTFkX1VwZGF0ZUNvdW50cnlJZSk7Ci1FWFBPUlRfU1lNQk9MKERPVDExRF9HZXRNYXhUeFB3ckluRGJtKTsKLUVYUE9SVF9TWU1CT0woRE9UMTFEX1NjYW5Db21wbGV0ZSk7Ci1FWFBPUlRfU1lNQk9MKElzTGVnYWxDaGFubmVsKTsKIEVYUE9SVF9TWU1CT0woVG9MZWdhbENoYW5uZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggYmM2NGYwNS4uY2FjMjA1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiBzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7Ci0JdTMyIHRpbWVfc3RhbXBbMl07CisJX19sZTMyIHRpbWVfc3RhbXBbMl07CiAJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKIAlfX2xlMTYgY2FwYWJpbGl0eTsKIAkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggZTczMGVkNi4uYTk4NDE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC01MTcsMTEgKzUxNyw4IEBACiAKIAlyZXR1cm4gMTsKIH0KLWJvb2wKLUFkZFJlb3JkZXJFbnRyeSgKLQlQUlhfVFNfUkVDT1JECQkJcFRTLAotCVBSWF9SRU9SREVSX0VOVFJZCQlwUmVvcmRlckVudHJ5Ci0JKQorCitzdGF0aWMgYm9vbCBBZGRSZW9yZGVyRW50cnkoUFJYX1RTX1JFQ09SRCBwVFMsIFBSWF9SRU9SREVSX0VOVFJZIHBSZW9yZGVyRW50cnkpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcExpc3QgPSAmcFRTLT5SeFBlbmRpbmdQa3RMaXN0OwogCXdoaWxlKHBMaXN0LT5uZXh0ICE9ICZwVFMtPlJ4UGVuZGluZ1BrdExpc3QpCkBAIC02MDEsMTAgKzU5OCw5IEBACiB9CiAKIAotdm9pZCBSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCXN0cnVjdCBpZWVlODAyMTFfcnhiICpwcnhiLAotCQlQUlhfVFNfUkVDT1JECQlwVFMsCi0JCXUxNgkJCVNlcU51bSkKK3N0YXRpYyB2b2lkIFJ4UmVvcmRlckluZGljYXRlUGFja2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcHJ4YiwKKwkJCQkgICAgUFJYX1RTX1JFQ09SRCBwVFMsIHUxNiBTZXFOdW0pCiB7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKIAlQUlhfUkVPUkRFUl9FTlRSWQlwUmVvcmRlckVudHJ5ID0gTlVMTDsKQEAgLTc3MSw5ICs3NjcsOSBAQAogCX0KIH0KIAotdTggcGFyc2Vfc3ViZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywKLQkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcnhiLHU4ICpzcmMsdTggKmRzdCkKK3N0YXRpYyB1OCBwYXJzZV9zdWJmcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhiICpyeGIsdTggKnNyYyx1OCAqZHN0KQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiLT5kYXRhOwogCXUxNgkJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CkBAIC0yMjAwLDcgKzIxOTYsNyBAQAogCW5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CiAJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+dGltZV9zdGFtcFswXSk7CiAJbmV0d29yay0+dGltZV9zdGFtcFsxXSA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+dGltZV9zdGFtcFsxXSk7Ci0JbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25faW50ZXJ2YWwpOworCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGJlYWNvbi0+YmVhY29uX2ludGVydmFsKTsKIAkvKiBXaGVyZSB0byBwdWxsIHRoaXM/IGJlYWNvbi0+bGlzdGVuX2ludGVydmFsOyovCiAJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMHgwQTsKIAluZXR3b3JrLT5yYXRlc19sZW4gPSBuZXR3b3JrLT5yYXRlc19leF9sZW4gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDY2MmM3ZTQuLjIxMzE5MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTI0LDE1ICsyNCw2IEBACiAKICNpbmNsdWRlICJkb3QxMWQuaCIKIAotdTggcnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbMTZdWzRdID0gewotCXsweDAwLDB4MEYsMHhBQywweDAwfSwgLy9Vc2UgZ3JvdXAga2V5LCAvL1Jlc2VydmVkCi0JezB4MDAsMHgwRiwweEFDLDB4MDF9LCAvL1dFUC00MCAgICAgICAgIC8vUlNOQSBkZWZhdWx0Ci0JezB4MDAsMHgwRiwweEFDLDB4MDJ9LCAvL1RLSVAgICAgICAgICAgIC8vTk9ORQkJLy97dXNlZCBqdXN0IGFzIGRlZmF1bHR9Ci0JezB4MDAsMHgwRiwweEFDLDB4MDN9LCAvL1dSQVAtaGlzdG9yaWNhbAotCXsweDAwLDB4MEYsMHhBQywweDA0fSwgLy9DQ01QCi0JezB4MDAsMHgwRiwweEFDLDB4MDV9LCAvL1dFUC0xMDQKLX07Ci0KIHNob3J0IGllZWU4MDIxMV9pc181NGcoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCiB7CiAJcmV0dXJuIChuZXQtPnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQtPnJhdGVzX2xlbiA+IDQpOwpAQCAtNDcsNyArMzgsNyBAQAogICogdGFnIGFuZCB0aGUgRVhURU5ERUQgUkFURSBNRklFIHRhZyBpZiBuZWVkZWQuCiAgKiBJdCBlbmNsdWRlcyB0d28gYnl0ZXMgcGVyIHRhZyBmb3IgdGhlIHRhZyBpdHNlbGYgYW5kIGl0cyBsZW4KICAqLwotdW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHVuc2lnbmVkIGludCBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSAwOwogCkBAIC02NSw3ICs1Niw3IEBACiAgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAogICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCiAgKi8KLXZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfTUZJRV9CcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKIHsKIAl1OCAqdGFnID0gKnRhZ19wOwogCkBAIC04Miw3ICs3Myw3IEBACiAJKnRhZ19wID0gdGFnOwogfQogCi12b2lkIGllZWU4MDIxMV9NRklFX0dyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIApAQCAtMTA2LDcgKzk3LDggQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworc3RhdGljIHZvaWQgaWVlZTgwMjExX1dNTV9JbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQorewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKIAkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCkBAIC0xNDgsNyArMTQwLDcgQEAKIH0KICNlbmRpZgogCi12b2lkIGVucXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGVucXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgbmg7CiAJbmggPSAoaWVlZS0+bWdtdF9xdWV1ZV9oZWFkICsxKSAlIE1HTVRfUVVFVUVfTlVNOwpAQCAtMTY2LDcgKzE1OCw3IEBACiAJLy9yZXR1cm4gMDsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpyZXQ7CiAKQEAgLTE4MSwxMiArMTczLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBpbml0X21nbXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpbml0X21nbXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gMDsKIH0KIAotdTggTWdudFF1ZXJ5X01nbnRGcmFtZVR4UmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB1OCBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCVBSVF9ISUdIX1RIUk9VR0hQVVQgICAgICBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKIAl1OCByYXRlOwpAQCAtMzY1LDcgKzM1Nyw4IEBACiB9CiAKIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWlmKCFpZWVlLT5pZWVlX3VwKQpAQCAtMzkxLDcgKzM4NCw3IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2IodW5zaWduZWQgbG9uZyBfaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYih1bnNpZ25lZCBsb25nIF9pZWVlKQogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0KIAkJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIF9pZWVlOwpAQCAtNDAzLDcgKzM5Niw3IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTQ5NCw3ICs0ODcsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7CkBAIC01MzgsNyArNTMxLDcgQEAKIAogCiAKLXZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYmVhY29uc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CkBAIC01NDksNyArNTQyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNTgxLDcgKzU3NCw3IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAvLwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC02MDksNyArNjAyLDcgQEAKIH0KIAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCi12b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewpAQCAtODQxLDcgKzgzNCw4IEBACiB9CiAKIAotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hc3NvY19yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Fzc29jX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgICB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICp0YWc7CkBAIC04OTYsNyArODkwLDggQEAKIAlyZXR1cm4gc2tiOwogfQogCi1zdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxpbnQgc3RhdHVzLCB1OCAqZGVzdCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgaW50IHN0YXR1cywgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphdXRoOwpAQCAtOTI0LDcgKzkxOSw4IEBACiAKIH0KIAotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9udWxsX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsc2hvcnQgcHdyKQorc3RhdGljIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfbnVsbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBzaG9ydCBwd3IpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOwpAQCAtOTUwLDcgKzk0Niw3IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hc3NvY19yZXNwKGllZWUsIGRlc3QpOwogCkBAIC05NTksNyArOTU1LDggQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9yZXNwX3RvX2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBzLCB1OCAqZGVzdCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBzLAorCQkJCSAgIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOwogCkBAIC05NjgsNyArOTY1LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKIHsKIAogCkBAIC0xMjUwLDEzICsxMjQ3LDEzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQogCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2IodW5zaWduZWQgbG9uZyBkZXYpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiKHVuc2lnbmVkIGxvbmcgZGV2KQogewogCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIGRldik7CiB9CiAKIAotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTEyODIsNyArMTI3OSw5IEBACiAJfQogfQogCi12b2lkIGllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmNoYWxsZW5nZSwgaW50IGNobGVuKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICAgdTggKmNoYWxsZW5nZSwKKwkJCQkgICAgIGludCBjaGxlbikKIHsKIAl1OCAqYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTMxMiw3ICsxMzExLDcgQEAKIAlrZnJlZShjaGFsbGVuZ2UpOwogfQogCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwpAQCAtMTMzMSw3ICsxMzMwLDcgQEAKIAkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAl9CiB9Ci12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQXNzb2NpYXRlZCBzdWNjZXNzZnVsbHlcbiIpOwpAQCAtMTM3OCw3ICsxMzc3LDcgQEAKIAluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAvLwlpbnQgaTsKIC8vCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBpZWVlLT5kZXY7CkBAIC0xMzg5LDcgKzEzODgsNyBAQAogCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EpOwogfQogCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CiAJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOwpAQCAtMTU2Miw3ICsxNTYxLDcgQEAKIH0KIAogCi1pbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4ICpkZXN0KQorc3RhdGljIGludCBhdXRoX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpkZXN0KQogewogCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CiAKQEAgLTE2MTgsNyArMTYxNyw3IEBACiAKIH0KIAotaW50IGFzc29jX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTggKmRlc3QpCitzdGF0aWMgaW50IGFzc29jX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpkZXN0KQogewogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqYTsKIApAQCAtMTcxMiw3ICsxNzExLDggQEAKIAogCiAKLXZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICAgIHNob3J0IHB3cikKIHsKIAogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfbnVsbF9mdW5jKGllZWUsIHB3cik7CkBAIC0xNzIzLDcgKzE3MjMsOCBAQAogfQogCiAKLXNob3J0IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHUzMiAqdGltZV9oLCB1MzIgKnRpbWVfbCkKK3N0YXRpYyBzaG9ydCBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1MzIgKnRpbWVfaCwKKwkJCQkgICAgdTMyICp0aW1lX2wpCiB7CiAJaW50IHRpbWVvdXQgPSBpZWVlLT5wc190aW1lb3V0OwogCXU4IGR0aW07CkBAIC0xNzcxLDcgKzE3NzIsNyBAQAogCiB9CiAKLWlubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YV9wcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAogCXUzMiB0aCx0bDsKQEAgLTE4ODgsNyArMTg4OSw4IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KLXZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCXU4ICphY3QgPSBpZWVlODAyMTFfZ2V0X3BheWxvYWQoaGVhZGVyKTsKQEAgLTE5NTksNyArMTk2MSw4IEBACiAJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29ya19yZXNwOwogCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrID0gJm5ldHdvcmtfcmVzcDsKIAotCQkJaWYgKDAgPT0gKGVycmNvZGU9YXNzb2NfcGFyc2UoaWVlZSxza2IsICZhaWQpKSl7CisJCQllcnJjb2RlID0gYXNzb2NfcGFyc2UoaWVlZSwgc2tiLCAmYWlkKTsKKwkJCWlmICghZXJyY29kZSkgewogCQkJCWllZWUtPnN0YXRlPUlFRUU4MDIxMV9MSU5LRUQ7CiAJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CiAJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3Nfb2srKzsKQEAgLTIwMTcsNyArMjAyMCw4IEBACiAKIAkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7CiAKLQkJCQkJaWYgKDAgPT0gKGVycmNvZGU9YXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbikpKXsKKwkJCQkJZXJyY29kZSA9IGF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pOworCQkJCQlpZiAoIWVycmNvZGUpIHsKIAkJCQkJCWlmKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpewogCQkJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7CiAJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7CkBAIC0yMTg5LDcgKzIxOTMsNyBAQAogfQogCiAvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGFjcXVpcmVkICovCi12b2lkIGllZWU4MDIxMV9yZXN1bWVfdHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWludCBpOwogCWZvcihpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKQEAgLTIzMTgsNyArMjMyMiw3IEBACiAJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOwogfQogCi12b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWlmKGllZWUtPnJhd190eCl7CiAKQEAgLTIzMjgsNyArMjMzMiw3IEBACiAJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKIAl9CiB9Ci12b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwpAQCAtMjUwMSw3ICsyNTA1LDcgQEAKIAlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CiAKIH0KLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7CkBAIC0yNzcyLDcgKzI3NzYsOCBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqd3BhX2llLCBpbnQgd3BhX2llX2xlbikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgY2hhciAqd3BhX2llLCBpbnQgd3BhX2llX2xlbikKIHsKIAkvKiBtYWtlIHN1cmUgV1BBIGlzIGVuYWJsZWQgKi8KIAlpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IDE1N2IyZDcuLjY3NzliZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMzc4LDcgKzM3OCw4IEBACiAJCXJldHVybjsKIH0KIAotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3F1cmV5X1Nob3J0UHJlYW1ibGVNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBjYl9kZXNjICp0Y2JfZGVzYykKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9xdXJleV9TaG9ydFByZWFtYmxlTW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgICAgY2JfZGVzYyAqdGNiX2Rlc2MpCiB7CiAJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gZmFsc2U7CiAJaWYgKHRjYl9kZXNjLT5kYXRhX3JhdGUgPT0gMikKQEAgLTM5MSw3ICszOTIsNyBAQAogCX0KIAlyZXR1cm47CiB9Ci1leHRlcm4Jdm9pZAorc3RhdGljIHZvaWQKIGllZWU4MDIxMV9xdWVyeV9IVENhcFNob3J0R0koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNiX2Rlc2MgKnRjYl9kZXNjKQogewogCVBSVF9ISUdIX1RIUk9VR0hQVVQJCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKaW5kZXggZTFmZTU0YS4uYmRmNjdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0zOSw3ICszOSw3IEBACiAJY2hhciAqbW9kZV9zdHJpbmc7CiAJaW50IG1vZGVfc2l6ZTsKIH07Ci1zdHJ1Y3QgbW9kZXNfdW5pdCBpZWVlODAyMTFfbW9kZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbW9kZXNfdW5pdCBpZWVlODAyMTFfbW9kZXNbXSA9IHsKIAl7ImEiLDF9LAogCXsiYiIsMX0sCiAJeyJnIiwxfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1NGNmZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaWZuZGVmIF9DUllQVE9fSU5URVJOQUxfSAotI2RlZmluZSBfQ1JZUFRPX0lOVEVSTkFMX0gKLQotCi0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NvZnRpcnEuaD4KLSNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9feWllbGQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlpZiAoIWluX3NvZnRpcnEoKSkKLQkJY29uZF9yZXNjaGVkKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX3RmbV9jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gKHZvaWQgKikmdGZtWzFdOwotfQotCi1zdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSNpZmRlZiBDT05GSUdfS01PRAotdm9pZCBjcnlwdG9fYWxnX2F1dG9sb2FkKGNvbnN0IGNoYXIgKm5hbWUpOwotc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwotaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotdm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17IH0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXZvaWQgX19pbml0IGNyeXB0b19pbml0X3Byb2Modm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19pbml0X3Byb2Modm9pZCkKLXsgfQotI2VuZGlmCi0KLWludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKLWludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKLWludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwotCi1pbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLWludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLQotdm9pZCBjcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotdm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotdm9pZCBjcnlwdG9fZXhpdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci0KLSNlbmRpZgkvKiBfQ1JZUFRPX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvbWljaGFlbF9taWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvbWljaGFlbF9taWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNTZlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJCi0gKgotICogTWljaGFlbCBNSUMgKElFRUUgODAyLjExaS9US0lQKSBrZXllZCBkaWdlc3QKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLQotCi1zdHJ1Y3QgbWljaGFlbF9taWNfY3R4IHsKLQl1OCBwZW5kaW5nWzRdOwotCXNpemVfdCBwZW5kaW5nX2xlbjsKLQotCXUzMiBsLCByOwotfTsKLQotCi1zdGF0aWMgaW5saW5lIHUzMiByb3RsKHUzMiB2YWwsIGludCBiaXRzKQotewotCXJldHVybiAodmFsIDw8IGJpdHMpIHwgKHZhbCA+PiAoMzIgLSBiaXRzKSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1MzIgcm90cih1MzIgdmFsLCBpbnQgYml0cykKLXsKLQlyZXR1cm4gKHZhbCA+PiBiaXRzKSB8ICh2YWwgPDwgKDMyIC0gYml0cykpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTMyIHhzd2FwKHUzMiB2YWwpCi17Ci0JcmV0dXJuICgodmFsICYgMHgwMGZmMDBmZikgPDwgOCkgfCAoKHZhbCAmIDB4ZmYwMGZmMDApID4+IDgpOwotfQotCi0KLSNkZWZpbmUgbWljaGFlbF9ibG9jayhsLCByKQlcCi1kbyB7CQkJCVwKLQlyIF49IHJvdGwobCwgMTcpOwlcCi0JbCArPSByOwkJCVwKLQlyIF49IHhzd2FwKGwpOwkJXAotCWwgKz0gcjsJCQlcCi0JciBePSByb3RsKGwsIDMpOwlcCi0JbCArPSByOwkJCVwKLQlyIF49IHJvdHIobCwgMik7CVwKLQlsICs9IHI7CQkJXAotfSB3aGlsZSAoMCkKLQotCi1zdGF0aWMgaW5saW5lIHUzMiBnZXRfbGUzMihjb25zdCB1OCAqcCkKLXsKLQlyZXR1cm4gcFswXSB8IChwWzFdIDw8IDgpIHwgKHBbMl0gPDwgMTYpIHwgKHBbM10gPDwgMjQpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGUzMih1OCAqcCwgdTMyIHYpCi17Ci0JcFswXSA9IHY7Ci0JcFsxXSA9IHYgPj4gODsKLQlwWzJdID0gdiA+PiAxNjsKLQlwWzNdID0gdiA+PiAyNDsKLX0KLQotCi1zdGF0aWMgdm9pZCBtaWNoYWVsX2luaXQodm9pZCAqY3R4KQotewotCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7Ci0JbWN0eC0+cGVuZGluZ19sZW4gPSAwOwotfQotCi0KLXN0YXRpYyB2b2lkIG1pY2hhZWxfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0Jc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKLQotCWlmIChtY3R4LT5wZW5kaW5nX2xlbikgewotCQlpbnQgZmxlbiA9IDQgLSBtY3R4LT5wZW5kaW5nX2xlbjsKLQkJaWYgKGZsZW4gPiBsZW4pCi0JCQlmbGVuID0gbGVuOwotCQltZW1jcHkoJm1jdHgtPnBlbmRpbmdbbWN0eC0+cGVuZGluZ19sZW5dLCBkYXRhLCBmbGVuKTsKLQkJbWN0eC0+cGVuZGluZ19sZW4gKz0gZmxlbjsKLQkJZGF0YSArPSBmbGVuOwotCQlsZW4gLT0gZmxlbjsKLQotCQlpZiAobWN0eC0+cGVuZGluZ19sZW4gPCA0KQotCQkJcmV0dXJuOwotCi0JCW1jdHgtPmwgXj0gZ2V0X2xlMzIobWN0eC0+cGVuZGluZyk7Ci0JCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7Ci0JCW1jdHgtPnBlbmRpbmdfbGVuID0gMDsKLQl9Ci0KLQl3aGlsZSAobGVuID49IDQpIHsKLQkJbWN0eC0+bCBePSBnZXRfbGUzMihkYXRhKTsKLQkJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKLQkJZGF0YSArPSA0OwotCQlsZW4gLT0gNDsKLQl9Ci0KLQlpZiAobGVuID4gMCkgewotCQltY3R4LT5wZW5kaW5nX2xlbiA9IGxlbjsKLQkJbWVtY3B5KG1jdHgtPnBlbmRpbmcsIGRhdGEsIGxlbik7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIG1pY2hhZWxfZmluYWwodm9pZCAqY3R4LCB1OCAqb3V0KQotewotCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7Ci0JdTggKmRhdGEgPSBtY3R4LT5wZW5kaW5nOwotCi0JLyogTGFzdCBibG9jayBhbmQgcGFkZGluZyAoMHg1YSwgNC4uNyB4IDApICovCi0Jc3dpdGNoIChtY3R4LT5wZW5kaW5nX2xlbikgewotCWNhc2UgMDoKLQkJbWN0eC0+bCBePSAweDVhOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCW1jdHgtPmwgXj0gZGF0YVswXSB8IDB4NWEwMDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQltY3R4LT5sIF49IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IDB4NWEwMDAwOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCW1jdHgtPmwgXj0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpIHwKLQkJCTB4NWEwMDAwMDA7Ci0JCWJyZWFrOwotCX0KLQltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOwotCS8qIGwgXj0gMDsgKi8KLQltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOwotCi0JcHV0X2xlMzIob3V0LCBtY3R4LT5sKTsKLQlwdXRfbGUzMihvdXQgKyA0LCBtY3R4LT5yKTsKLX0KLQotCi1zdGF0aWMgaW50IG1pY2hhZWxfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKLQkJCSAgdTMyICpmbGFncykKLXsKLQlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OwotCWlmIChrZXlsZW4gIT0gOCkgewotCQlpZiAoZmxhZ3MpCi0JCQkqZmxhZ3MgPSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1jdHgtPmwgPSBnZXRfbGUzMihrZXkpOwotCW1jdHgtPnIgPSBnZXRfbGUzMihrZXkgKyA0KTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgbWljaGFlbF9taWNfYWxnID0gewotCS5jcmFfbmFtZQk9ICJtaWNoYWVsX21pYyIsCi0JLmNyYV9mbGFncwk9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QsCi0JLmNyYV9ibG9ja3NpemUJPSA4LAotCS5jcmFfY3R4c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbWljaGFlbF9taWNfY3R4KSwKLQkuY3JhX21vZHVsZQk9IFRISVNfTU9EVUxFLAotCS5jcmFfbGlzdAk9IExJU1RfSEVBRF9JTklUKG1pY2hhZWxfbWljX2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQk9IHsgLmRpZ2VzdCA9IHsKLQkuZGlhX2RpZ2VzdHNpemUJPSA4LAotCS5kaWFfaW5pdAk9IG1pY2hhZWxfaW5pdCwKLQkuZGlhX3VwZGF0ZQk9IG1pY2hhZWxfdXBkYXRlLAotCS5kaWFfZmluYWwJPSBtaWNoYWVsX2ZpbmFsLAotCS5kaWFfc2V0a2V5CT0gbWljaGFlbF9zZXRrZXkgfSB9Ci19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IG1pY2hhZWxfbWljX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmbWljaGFlbF9taWNfYWxnKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbWljaGFlbF9taWNfZXhpdCh2b2lkKQotewotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmbWljaGFlbF9taWNfYWxnKTsKLX0KLQotCi1tb2R1bGVfaW5pdChtaWNoYWVsX21pY19pbml0KTsKLW1vZHVsZV9leGl0KG1pY2hhZWxfbWljX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1pY2hhZWwgTUlDIik7Ci1NT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI2ZGZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcHJvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBQcm9jZnMgaW5mb3JtYXRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3J5cHRvX2FsZ19saXN0OwotZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgY3J5cHRvX2FsZ19zZW07Ci0KLXN0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdjsKLQlsb2ZmX3QgbiA9ICpwb3M7Ci0KLQlkb3duX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKLQlsaXN0X2Zvcl9lYWNoKHYsICZjcnlwdG9fYWxnX2xpc3QpCi0JCWlmICghbi0tKQotCQkJcmV0dXJuIGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnYgPSBwOwotCi0JKCpwb3MpKys7Ci0JdiA9IHYtPm5leHQ7Ci0JcmV0dXJuICh2ID09ICZjcnlwdG9fYWxnX2xpc3QpID8KLQkJTlVMTCA6IGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKLXsKLQl1cF9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7Ci19Ci0KLXN0YXRpYyBpbnQgY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gKHN0cnVjdCBjcnlwdG9fYWxnICopcDsKLQotCXNlcV9wcmludGYobSwgIm5hbWUgICAgICAgICA6ICVzXG4iLCBhbGctPmNyYV9uYW1lKTsKLQlzZXFfcHJpbnRmKG0sICJtb2R1bGUgICAgICAgOiAlc1xuIiwKLQkJICAgKGFsZy0+Y3JhX21vZHVsZSA/Ci0JCSAgICBhbGctPmNyYV9tb2R1bGUtPm5hbWUgOgotCQkgICAgImtlcm5lbCIpKTsKLQotCXN3aXRjaCAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgewotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKLQkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogY2lwaGVyXG4iKTsKLQkJc2VxX3ByaW50ZihtLCAiYmxvY2tzaXplICAgIDogJXVcbiIsIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSk7Ci0JCXNlcV9wcmludGYobSwgIm1pbiBrZXlzaXplICA6ICV1XG4iLAotCQkJCQlhbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplKTsKLQkJc2VxX3ByaW50ZihtLCAibWF4IGtleXNpemUgIDogJXVcbiIsCi0JCQkJCWFsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemUpOwotCQlicmVhazsKLQotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKLQkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogZGlnZXN0XG4iKTsKLQkJc2VxX3ByaW50ZihtLCAiYmxvY2tzaXplICAgIDogJXVcbiIsIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSk7Ci0JCXNlcV9wcmludGYobSwgImRpZ2VzdHNpemUgICA6ICV1XG4iLAotCQkJICAgYWxnLT5jcmFfZGlnZXN0LmRpYV9kaWdlc3RzaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6Ci0JCXNlcV9wcmludGYobSwgInR5cGUgICAgICAgICA6IGNvbXByZXNzaW9uXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogdW5rbm93blxuIik7Ci0JCWJyZWFrOwotCX0KLQotCXNlcV9wdXRjKG0sICdcbicpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNyeXB0b19zZXFfb3BzID0gewotCS5zdGFydAkJPSBjX3N0YXJ0LAotCS5uZXh0CQk9IGNfbmV4dCwKLQkuc3RvcAkJPSBjX3N0b3AsCi0JLnNob3cJCT0gY19zaG93Ci19OwotCi1zdGF0aWMgaW50IGNyeXB0b19pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjcnlwdG9fc2VxX29wcyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY3J5cHRvX29wcyA9IHsKLQkub3BlbgkJPSBjcnlwdG9faW5mb19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UKLX07Ci0KLXZvaWQgX19pbml0IGNyeXB0b19pbml0X3Byb2Modm9pZCkKLXsKLQlwcm9jX2NyZWF0ZSgiY3J5cHRvIiwgMCwgTlVMTCwgJnByb2NfY3J5cHRvX29wcyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKaW5kZXggMzY4NGRhMy4uN2JmNTVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwpAQCAtMTMsNyArMTMsNyBAQAogICoJICAgICB1MTYJCQlUaW1lIC8vaW5kaWNhdGUgdGltZSBkZWxheS4KICAqICBvdXRwdXQ6ICBub25lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWN0aXZhdGVCQUVudHJ5KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQQkFfUkVDT1JEIHBCQSwgdTE2IFRpbWUpCitzdGF0aWMgdm9pZCBBY3RpdmF0ZUJBRW50cnkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBCQV9SRUNPUkQgcEJBLCB1MTYgVGltZSkKIHsKIAlwQkEtPmJWYWxpZCA9IHRydWU7CiAJaWYoVGltZSAhPSAwKQpAQCAtMjUsNyArMjUsNyBAQAogICogICBpbnB1dDogIFBCQV9SRUNPUkQJCQlwQkEgIC8vQkEgZW50cnkgdG8gYmUgZGlzYWJsZWQKICAqICBvdXRwdXQ6ICBub25lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRGVBY3RpdmF0ZUJBRW50cnkoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQQkFfUkVDT1JEIHBCQSkKK3N0YXRpYyB2b2lkIERlQWN0aXZhdGVCQUVudHJ5KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQQkFfUkVDT1JEIHBCQSkKIHsKIAlwQkEtPmJWYWxpZCA9IGZhbHNlOwogCWRlbF90aW1lcl9zeW5jKCZwQkEtPlRpbWVyKTsKQEAgLTM3LDcgKzM3LDcgQEAKICAqICBvdXRwdXQ6ICBub25lCiAgKiAgbm90aWNlOiAgQXMgUFRYX1RTX1JFQ09SRCBzdHJ1Y3R1cmUgd2lsbCBiZSBkZWZpbmVkIGluIFFPUywgc28gd2FpdCB0byBiZSBtZXJnZWQuIC8vRklYTUUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggVHhUc0RlbGV0ZUJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRYX1RTX1JFQ09SRAlwVHhUcykKK3N0YXRpYyB1OCBUeFRzRGVsZXRlQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBUWF9UU19SRUNPUkQgcFR4VHMpCiB7CiAJUEJBX1JFQ09SRAkJcEFkbWl0dGVkQmEgPSAmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZDsgIC8vVGhlc2UgdHdvIEJBIGVudHJpZXMgbXVzdCBleGlzdCBpbiBUUyBzdHJ1Y3R1cmUKIAlQQkFfUkVDT1JECQlwUGVuZGluZ0JhID0gJnBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZDsKQEAgLTY3LDcgKzY3LDcgQEAKICAqICBvdXRwdXQ6ICBub25lCiAgKiAgbm90aWNlOiAgQXMgUFJYX1RTX1JFQ09SRCBzdHJ1Y3R1cmUgd2lsbCBiZSBkZWZpbmVkIGluIFFPUywgc28gd2FpdCB0byBiZSBtZXJnZWQuIC8vRklYTUUsIHNhbWUgd2l0aCBhYm92ZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBSeFRzRGVsZXRlQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQUlhfVFNfUkVDT1JECXBSeFRzKQorc3RhdGljIHU4IFJ4VHNEZWxldGVCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFJYX1RTX1JFQ09SRCBwUnhUcykKIHsKIAlQQkFfUkVDT1JECQlwQmEgPSAmcFJ4VHMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKIAl1OAkJCWJTZW5kREVMQkEgPSBmYWxzZTsKQEAgLTMwNyw3ICszMDcsOSBAQAogICogIG5vdGljZTogSWYgYW55IHBvc3NpYmxlLCBwbGVhc2UgaGlkZSBwQkEgaW4gaWVlZS4gQW5kIHRlbXBvcmFyaWx5IHVzZSBNYW5hZ2UgUXVldWUgYXMgc29mdG1hY19tZ210X3htaXQoKSB1c3VhbGx5IGRvZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGllZWU4MDIxMV9zZW5kX0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZHN0LCBQQkFfUkVDT1JEIHBCQSwgVFJfU0VMRUNUIFR4UnhTZWxlY3QsIHUxNiBSZWFzb25Db2RlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkc3QsCisJCQkJIFBCQV9SRUNPUkQgcEJBLCBUUl9TRUxFQ1QgVHhSeFNlbGVjdCwKKwkJCQkgdTE2IFJlYXNvbkNvZGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc2tiID0gaWVlZTgwMjExX0RFTEJBKGllZWUsIGRzdCwgcEJBLCBUeFJ4U2VsZWN0LCBSZWFzb25Db2RlKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUlNQIGZyYW1lcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCmluZGV4IGU5NTZkYTUuLjUzZWMyZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogLyoKICoJUmV0dXJuOgkJdHJ1ZSBpZiBzdGF0aW9uIGluIGhhbGYgbiBtb2RlIGFuZCBBUCBzdXBwb3J0cyA0MCBidwogKi8KLWJvb2wgSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGJvb2wgSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJcmV0dXJuIHJldFZhbHVlOwogfQogCi1ib29sIElzSFRIYWxmTm1vZGVTR0koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGJvb2wgaXM0ME1IeikKK3N0YXRpYyBib29sIElzSFRIYWxmTm1vZGVTR0koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGJvb2wgaXM0ME1IeikKIHsKIAlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKIAlQUlRfSElHSF9USFJPVUdIUFVUCSBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKQEAgLTM3Niw3ICszNzYsNyBAQAogICogIHJldHVybjoKICAqICBub3RpY2U6CiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgSFRJT1RQZWVyRGV0ZXJtaW5lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgSFRJT1RQZWVyRGV0ZXJtaW5lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAgKiAgb3V0cHV0OiAgbm9uZQogICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGVjbGFyZSBNQ1MxMyBvbmx5KG90aGVyd2lzZSByZXR1cm4gMCkKICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpQZWVyTWFjQWRkcikKK3N0YXRpYyB1OCBIVElPVEFjdElzRGlzYWJsZU1DUzE0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqUGVlck1hY0FkZHIpCiB7CiAJdTggcmV0ID0gMDsKIAlyZXR1cm4gcmV0OwpAQCAtNDMyLDcgKzQzMiw3IEBACiAqIFJldHVybjoJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgTUNTMTUKICogMjAwOC4wNC4xNQlFbWlseQogKi8KLWJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJYm9vbCByZXRWYWx1ZSA9IGZhbHNlOwogCkBAIC00NjksNyArNDY5LDggQEAKICogUmV0dXJuOgl0cnVlIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBhbGwgdHdvIHNwYXRpYWwgc3RyZWFtIHBhY2tldAogKiAyMDA4LjA0LjIxCUVtaWx5CiAqLwotYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpQZWVyTWFjQWRkcikKK3N0YXRpYyBib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTVHdvU3BhdGlhbFN0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJCSB1OCAqUGVlck1hY0FkZHIpCiB7CiAJYm9vbCByZXRWYWx1ZSA9IGZhbHNlOwogCkBAIC00ODYsNyArNDg3LDggQEAKICAqICBvdXRwdXQ6ICBub25lCiAgKiAgcmV0dXJuOiAgcmV0dXJuIDEgaWYgZHJpdmVyIHNob3VsZCBkaXNhYmxlIEVEQ0EgdHVyYm8gbW9kZShvdGhlcndpc2UgcmV0dXJuIDApCiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKlBlZXJNYWNBZGRyKQorc3RhdGljIHU4IEhUSU9UQWN0SXNEaXNhYmxlRURDQVR1cmJvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICAgdTggKlBlZXJNYWNBZGRyKQogewogCXU4CXJldFZhbHVlID0gZmFsc2U7CS8vIGRlZmF1bHQgZW5hYmxlIEVEQ0EgVHVyYm8gbW9kZS4KIAkvLyBTZXQgc3BlY2lmaWMgRURDQSBwYXJhbWV0ZXIgZm9yIGRpZmZlcmVudCBBUCBpbiBETSBoYW5kbGVyLgpAQCAtNTAwLDcgKzUwMiw3IEBACiAgKiAgb3V0cHV0OiAgbm9uZQogICogIHJldHVybjogIHJldHVybiAxIGlmIHRydWUKICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUSU9UQWN0SXNNZ250VXNlQ0NLNk0oc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQorc3RhdGljIHU4IEhUSU9UQWN0SXNNZ250VXNlQ0NLNk0oc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQogewogCXU4CXJldFZhbHVlID0gMDsKIApAQCAtNTE1LDcgKzUxNyw3IEBACiAJcmV0dXJuIHJldFZhbHVlOwogfQogCi11OCBIVElPVEFjdElzQ0NERnN5bmModTggKlBlZXJNYWNBZGRyKQorc3RhdGljIHU4IEhUSU9UQWN0SXNDQ0RGc3luYyh1OCAqUGVlck1hY0FkZHIpCiB7CiAJdTgJcmV0VmFsdWUgPSAwOwogCWlmKAkobWVtY21wKFBlZXJNYWNBZGRyLCBVTktOT1dOX0JPUkFEQ09NLCAzKT09MCkgfHwKQEAgLTc5Miw3ICs3OTQsNyBAQAogICogIHJldHVybjogIGFsd2F5cyB3ZSByZXR1cm4gdHJ1ZQogICogIG5vdGljZToKICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUX1BpY2tNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqcE9wZXJhdGVNQ1MpCitzdGF0aWMgdTggSFRfUGlja01DU1JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwT3BlcmF0ZU1DUykKIHsKIAl1OAkJCQkJaTsKIAlpZiAocE9wZXJhdGVNQ1MgPT0gTlVMTCkKQEAgLTkwNyw3ICs5MDksOCBAQAogKioKICoqIFxwSFRTdXBwb3J0ZWRDYXA6IHRoZSBjb25uZWN0ZWQgU1RBJ3Mgc3VwcG9ydGVkIHJhdGUgQ2FwYWJpbGl0eSBlbGVtZW50CiAqLwotdTggSFRGaWx0ZXJNQ1NSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBTdXBwb3J0TUNTLCB1OCAqcE9wZXJhdGVNQ1MpCitzdGF0aWMgdTggSFRGaWx0ZXJNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqcFN1cHBvcnRNQ1MsCisJCQkgIHU4ICpwT3BlcmF0ZU1DUykKIHsKIAogCXU4IGk9MDsKQEAgLTEzMTcsNTEgKzEzMjAsNiBAQAogCX0KIH0KIAotdm9pZCBIVFVzZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0vLwl1OAlyZWdCd09wTW9kZTsKLQotCWlmKHBIVEluZm8tPmJFbmFibGVIVCkKLQl7Ci0JCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gdHJ1ZTsKLQotCQlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9IHBIVEluZm8tPmJSZWdTdXBwQ0NLOwotCi0JCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gcEhUSW5mby0+YlJlZ0JXNDBNSHo7Ci0KLQkJcEhUSW5mby0+YkN1clNob3J0R0kyME1Iej0gcEhUSW5mby0+YlJlZ1Nob3J0R0kyME1IejsKLQotCQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6PSBwSFRJbmZvLT5iUmVnU2hvcnRHSTQwTUh6OwotCi0JCXBIVEluZm8tPmJDdXJyZW50X0FNU0RVX1N1cHBvcnQgPSBwSFRJbmZvLT5iQU1TRFVfU3VwcG9ydDsKLQotCQlwSFRJbmZvLT5uQ3VycmVudF9BTVNEVV9NYXhTaXplID0gcEhUSW5mby0+bkFNU0RVX01heFNpemU7Ci0KLQkJcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IHBIVEluZm8tPmJBTVBEVUVuYWJsZTsKLQotCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwSFRJbmZvLT5BTVBEVV9GYWN0b3I7Ci0KLQkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcEhUSW5mby0+TVBEVV9EZW5zaXR5OwotCi0JCS8vIFNldCBCV09wTW9kZSByZWdpc3RlcgotCi0JCS8vdXBkYXRlIFJBVFIgaW5kZXgwCi0JCUhURmlsdGVyTUNTUmF0ZShpZWVlLCBpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0KTsKLQkvL2Z1bmN0aW9uIGJlbG93IGlzIG5vdCBpbXBsZW1lbnRlZCBhdCBhbGwuIFdCCi0jaWZkZWYgVE9ETwotCQlBZGFwdGVyLT5IYWxGdW5jLkluaXRIYWxSQVRSVGFibGVIYW5kbGVyKCBBZGFwdGVyLCAmcE1nbnRJbmZvLT5kb3QxMU9wZXJhdGlvbmFsUmF0ZVNldCwgcE1nbnRJbmZvLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0KTsKLSNlbmRpZgotCQlpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGUgPSBIVEdldEhpZ2hlc3RNQ1NSYXRlKGllZWUsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIE1DU19GSUxURVJfQUxMKTsKLQkJaWVlZS0+SFRDdXJyZW50T3BlcmFSYXRlID0gaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlOwotCi0JfQotCWVsc2UKLQl7Ci0JCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gZmFsc2U7Ci0JfQotCXJldHVybjsKLX0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICpmdW5jdGlvbjogIGNoZWNrIHdoZXRoZXIgSFQgY29udHJvbCBmaWVsZCBleGlzdHMKICAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZQkqaWVlZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCmluZGV4IDMwNTgxMjAuLjQyNmYyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKQEAgLTMsMTMgKzMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAicnRsODE5eF9UUy5oIgogCi12b2lkIFRzU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIFRzU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAkvLyBOb3QgaW1wbGVtZW50IHlldAogCS8vIFRoaXMgaXMgdXNlZCBmb3IgV01NU0EgYW5kIEFDTSAsIHRoYXQgd291bGQgc2VuZCBBRERUU1JlcSBmcmFtZS4KIH0KIAotdm9pZCBUc0luYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBUc0luYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJLy8gTm90IGltcGxlbWVudCB5ZXQKIAkvLyBUaGlzIGlzIHVzZWQgZm9yIFdNTVNBIGFuZCBBQ00uCkBAIC0yMiw3ICsyMiw3IEBACiAgKiAgcmV0dXJuOiAgTlVMTAogICogIG5vdGljZToKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSeFBrdFBlbmRpbmdUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIFJ4UGt0UGVuZGluZ1RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCVBSWF9UU19SRUNPUkQJcFJ4VHMgPSAoUFJYX1RTX1JFQ09SRClkYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBSeFRzLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgUnhUc1JlY29yZFtwUnhUcy0+bnVtXSk7CkBAIC05OSw3ICs5OSw3IEBACiAgKiAgcmV0dXJuOiAgTlVMTAogICogIG5vdGljZToKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBUc0FkZEJhUHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBUc0FkZEJhUHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJUFRYX1RTX1JFQ09SRAlwVHhUcyA9IChQVFhfVFNfUkVDT1JEKWRhdGE7CiAJdTggbnVtID0gcFR4VHMtPm51bTsKQEAgLTExMCw3ICsxMTAsNyBAQAogfQogCiAKLXZvaWQgUmVzZXRUc0NvbW1vbkluZm8oUFRTX0NPTU1PTl9JTkZPCXBUc0NvbW1vbkluZm8pCitzdGF0aWMgdm9pZCBSZXNldFRzQ29tbW9uSW5mbyhQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbykKIHsKIAltZW1zZXQocFRzQ29tbW9uSW5mby0+QWRkciwgMCwgNik7CiAJbWVtc2V0KCZwVHNDb21tb25JbmZvLT5UU3BlYywgMCwgc2l6ZW9mKFRTUEVDX0JPRFkpKTsKQEAgLTExOSw3ICsxMTksNyBAQAogCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gMDsKIH0KIAotdm9pZCBSZXNldFR4VHNFbnRyeShQVFhfVFNfUkVDT1JEIHBUUykKK3N0YXRpYyB2b2lkIFJlc2V0VHhUc0VudHJ5KFBUWF9UU19SRUNPUkQgcFRTKQogewogCVJlc2V0VHNDb21tb25JbmZvKCZwVFMtPlRzQ29tbW9uSW5mbyk7CiAJcFRTLT5UeEN1clNlcSA9IDA7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAlSZXNldEJhRW50cnkoJnBUUy0+VHhQZW5kaW5nQkFSZWNvcmQpOwogfQogCi12b2lkIFJlc2V0UnhUc0VudHJ5KFBSWF9UU19SRUNPUkQgcFRTKQorc3RhdGljIHZvaWQgUmVzZXRSeFRzRW50cnkoUFJYX1RTX1JFQ09SRCBwVFMpCiB7CiAJUmVzZXRUc0NvbW1vbkluZm8oJnBUUy0+VHNDb21tb25JbmZvKTsKIAlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAweGZmZmY7IC8vIFRoaXMgaW5kaWNhdGUgdGhlIFJ4SW5kaWNhdGVTZXEgaXMgbm90IHVzZWQgbm93ISEKQEAgLTIyNCw3ICsyMjQsOCBAQAogCiB9CiAKLXZvaWQgQWRtaXRUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIHUzMiBJbmFjdFRpbWUpCitzdGF0aWMgdm9pZCBBZG1pdFRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkgICAgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIHUzMiBJbmFjdFRpbWUpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPlNldHVwVGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyKTsKQEAgLTIzNCw3ICsyMzUsOSBAQAogfQogCiAKLVBUU19DT01NT05fSU5GTyBTZWFyY2hBZG1pdFRSU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqQWRkciwgdTggVElELCBUUl9TRUxFQ1QJVHhSeFNlbGVjdCkKK3N0YXRpYyBQVFNfQ09NTU9OX0lORk8gU2VhcmNoQWRtaXRUUlN0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgdTggKkFkZHIsIHU4IFRJRCwKKwkJCQkJICAgVFJfU0VMRUNUIFR4UnhTZWxlY3QpCiB7CiAJLy9ESVJFQ1RJT05fVkFMVUUJZGlyOwogCXU4CWRpcjsKQEAgLTMwOSwxNCArMzEyLDkgQEAKIAkJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgTWFrZVRTRW50cnkoCi0JCVBUU19DT01NT05fSU5GTwlwVHNDb21tb25JbmZvLAotCQl1OAkJKkFkZHIsCi0JCVBUU1BFQ19CT0RZCXBUU1BFQywKLQkJUFFPU19UQ0xBUwlwVENMQVMsCi0JCXU4CQlUQ0xBU19OdW0sCi0JCXU4CQlUQ0xBU19Qcm9jCi0JKQorc3RhdGljIHZvaWQgTWFrZVRTRW50cnkoUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIHU4ICpBZGRyLAorCQkJUFRTUEVDX0JPRFkgcFRTUEVDLCBQUU9TX1RDTEFTIHBUQ0xBUywgdTggVENMQVNfTnVtLAorCQkJdTggVENMQVNfUHJvYykKIHsKIAl1OAljb3VudDsKIApAQCAtNDcyLDExICs0NzAsOCBAQAogCX0KIH0KIAotdm9pZCBSZW1vdmVUc0VudHJ5KAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlCQkqaWVlZSwKLQlQVFNfQ09NTU9OX0lORk8JCQlwVHMsCi0JVFJfU0VMRUNUCQkJVHhSeFNlbGVjdAotCSkKK3N0YXRpYyB2b2lkIFJlbW92ZVRzRW50cnkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBUU19DT01NT05fSU5GTyBwVHMsCisJCQkgIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KQogewogCS8vdTMyIGZsYWdzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsX2NyeXB0by5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzg3MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoKLSAqIFNjYXR0ZXJsaXN0IENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqIENvcHlyaWdodCAoYykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCi0gKgotICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgotICogYW5kIE5ldHRsZSwgYnkgTmllbHMgTemwiGxlci4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2lmbmRlZiBfTElOVVhfQ1JZUFRPX0gKLSNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0jZGVmaW5lIGNyeXB0b19yZWdpc3Rlcl9hbGcgY3J5cHRvX3JlZ2lzdGVyX2FsZ19yc2wKLSNkZWZpbmUgY3J5cHRvX3VucmVnaXN0ZXJfYWxnIGNyeXB0b191bnJlZ2lzdGVyX2FsZ19yc2wKLSNkZWZpbmUgY3J5cHRvX2FsbG9jX3RmbSBjcnlwdG9fYWxsb2NfdGZtX3JzbAotI2RlZmluZSBjcnlwdG9fZnJlZV90Zm0gY3J5cHRvX2ZyZWVfdGZtX3JzbAotI2RlZmluZSBjcnlwdG9fYWxnX2F2YWlsYWJsZSBjcnlwdG9fYWxnX2F2YWlsYWJsZV9yc2wKLQotLyoKLSAqIEFsZ29yaXRobSBtYXNrcyBhbmQgdHlwZXMuCi0gKi8KLSNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX01BU0sJCTB4MDAwMDAwZmYKLSNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUgkJMHgwMDAwMDAwMQotI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUCQkweDAwMDAwMDAyCi0jZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUwkweDAwMDAwMDA0Ci0KLS8qCi0gKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCi0gKi8KLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX01BU0sJCTB4MDAwMDAwZmYKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19NQVNLCQkweGZmZjAwMDAwCi0KLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0VDQgkJMHgwMDAwMDAwMQotI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0JDCQkweDAwMDAwMDAyCi0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9DRkIJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NUUgkJMHgwMDAwMDAwOAotCi0jZGVmaW5lIENSWVBUT19URk1fUkVRX1dFQUtfS0VZCQkweDAwMDAwMTAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX1dFQUtfS0VZCQkweDAwMTAwMDAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOCTB4MDAyMDAwMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRAkweDAwNDAwMDAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4JMHgwMDgwMDAwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MJMHgwMTAwMDAwMAotCi0vKgotICogTWlzY2VsbGFuZW91cyBzdHVmZi4KLSAqLwotI2RlZmluZSBDUllQVE9fVU5TUEVDCQkJMAotI2RlZmluZSBDUllQVE9fTUFYX0FMR19OQU1FCQk2NAotCi1zdHJ1Y3Qgc2NhdHRlcmxpc3Q7Ci0KLS8qCi0gKiBBbGdvcml0aG1zOiBtb2R1bGFyIGNyeXB0byBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zLCBtYW5hZ2VkCi0gKiB2aWEgY3J5cHRvX3JlZ2lzdGVyX2FsZygpIGFuZCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoKS4KLSAqLwotc3RydWN0IGNpcGhlcl9hbGcgewotCXVuc2lnbmVkIGludCBjaWFfbWluX2tleXNpemU7Ci0JdW5zaWduZWQgaW50IGNpYV9tYXhfa2V5c2l6ZTsKLQlpbnQgKCpjaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCi0JCQkgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOwotCXZvaWQgKCpjaWFfZW5jcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKLQl2b2lkICgqY2lhX2RlY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci19OwotCi1zdHJ1Y3QgZGlnZXN0X2FsZyB7Ci0JdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOwotCXZvaWQgKCpkaWFfaW5pdCkodm9pZCAqY3R4KTsKLQl2b2lkICgqZGlhX3VwZGF0ZSkodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7Ci0Jdm9pZCAoKmRpYV9maW5hbCkodm9pZCAqY3R4LCB1OCAqb3V0KTsKLQlpbnQgKCpkaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCi0JCQkgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOwotfTsKLQotc3RydWN0IGNvbXByZXNzX2FsZyB7Ci0JaW50ICgqY29hX2luaXQpKHZvaWQgKmN0eCk7Ci0Jdm9pZCAoKmNvYV9leGl0KSh2b2lkICpjdHgpOwotCWludCAoKmNvYV9jb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCSAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwotCWludCAoKmNvYV9kZWNvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKLX07Ci0KLSNkZWZpbmUgY3JhX2NpcGhlcgljcmFfdS5jaXBoZXIKLSNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKLSNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCi0KLXN0cnVjdCBjcnlwdG9fYWxnIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNyYV9saXN0OwotCXUzMiBjcmFfZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7Ci0JdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOwotCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07Ci0KLQl1bmlvbiB7Ci0JCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKLQkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OwotCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOwotCX0gY3JhX3U7Ci0KLQlzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOwotfTsKLQotLyoKLSAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgotICovCi1pbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKLWludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7Ci0KLS8qCi0gKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgotICovCi1pbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKLQotLyoKLSAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcwotICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY190Zm0oKSBhbmQKLSAqIGNyeXB0b19mcmVlX3RmbSgpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCi0gKi8KLXN0cnVjdCBjcnlwdG9fdGZtOwotCi1zdHJ1Y3QgY2lwaGVyX3RmbSB7Ci0Jdm9pZCAqY2l0X2l2OwotCXVuc2lnbmVkIGludCBjaXRfaXZzaXplOwotCXUzMiBjaXRfbW9kZTsKLQlpbnQgKCpjaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKLQlpbnQgKCpjaXRfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKLQlpbnQgKCpjaXRfZW5jcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOwotCWludCAoKmNpdF9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwotCWludCAoKmNpdF9kZWNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7Ci0Jdm9pZCAoKmNpdF94b3JfYmxvY2spKHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwotfTsKLQotc3RydWN0IGRpZ2VzdF90Zm0gewotCXZvaWQgKCpkaXRfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci0Jdm9pZCAoKmRpdF91cGRhdGUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKLQl2b2lkICgqZGl0X2ZpbmFsKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KTsKLQl2b2lkICgqZGl0X2RpZ2VzdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOwotCWludCAoKmRpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOwotI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwotCXZvaWQgKmRpdF9obWFjX2Jsb2NrOwotI2VuZGlmCi19OwotCi1zdHJ1Y3QgY29tcHJlc3NfdGZtIHsKLQlpbnQgKCpjb3RfY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKLQlpbnQgKCpjb3RfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKLX07Ci0KLSNkZWZpbmUgY3J0X2NpcGhlcgljcnRfdS5jaXBoZXIKLSNkZWZpbmUgY3J0X2RpZ2VzdAljcnRfdS5kaWdlc3QKLSNkZWZpbmUgY3J0X2NvbXByZXNzCWNydF91LmNvbXByZXNzCi0KLXN0cnVjdCBjcnlwdG9fdGZtIHsKLQotCXUzMiBjcnRfZmxhZ3M7Ci0KLQl1bmlvbiB7Ci0JCXN0cnVjdCBjaXBoZXJfdGZtIGNpcGhlcjsKLQkJc3RydWN0IGRpZ2VzdF90Zm0gZGlnZXN0OwotCQlzdHJ1Y3QgY29tcHJlc3NfdGZtIGNvbXByZXNzOwotCX0gY3J0X3U7Ci0KLQlzdHJ1Y3QgY3J5cHRvX2FsZyAqX19jcnRfYWxnOwotfTsKLQotLyoKLSAqIFRyYW5zZm9ybSB1c2VyIGludGVyZmFjZS4KLSAqLwotCi0vKgotICogY3J5cHRvX2FsbG9jX3RmbSgpIHdpbGwgZmlyc3QgYXR0ZW1wdCB0byBsb2NhdGUgYW4gYWxyZWFkeSBsb2FkZWQgYWxnb3JpdGhtLgotICogSWYgdGhhdCBmYWlscyBhbmQgdGhlIGtlcm5lbCBzdXBwb3J0cyBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzLCBpdAotICogd2lsbCB0aGVuIGF0dGVtcHQgdG8gbG9hZCBhIG1vZHVsZSBvZiB0aGUgc2FtZSBuYW1lIG9yIGFsaWFzLiAgQSByZWZjb3VudAotICogaXMgZ3JhYmJlZCBvbiB0aGUgYWxnb3JpdGhtIHdoaWNoIGlzIHRoZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgdHJhbnNmb3JtLgotICoKLSAqIGNyeXB0b19mcmVlX3RmbSgpIGZyZWVzIHVwIHRoZSB0cmFuc2Zvcm0gYW5kIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcywKLSAqIHRoZW4gZHJvcHMgdGhlIHJlZmNvdW50IG9uIHRoZSBhc3NvY2lhdGVkIGFsZ29yaXRobS4KLSAqLwotc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0Zm1fZmxhZ3MpOwotdm9pZCBjcnlwdG9fZnJlZV90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci0KLS8qCi0gKiBUcmFuc2Zvcm0gaGVscGVycyB3aGljaCBxdWVyeSB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0uCi0gKi8KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX25hbWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbW9kbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKLQotCWlmIChhbGctPmNyYV9tb2R1bGUpCi0JCXJldHVybiBhbGctPmNyYV9tb2R1bGUtPm5hbWU7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgY3J5cHRvX3RmbV9hbGdfdHlwZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19tYXhfa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2Jsb2Nrc2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9kaWdlc3RzaXplOwotfQotCi0vKgotICogQVBJIHdyYXBwZXJzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQl0Zm0tPmNydF9kaWdlc3QuZGl0X2luaXQodGZtKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJCXVuc2lnbmVkIGludCBuc2cpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQl0Zm0tPmNydF9kaWdlc3QuZGl0X3VwZGF0ZSh0Zm0sIHNnLCBuc2cpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JdGZtLT5jcnRfZGlnZXN0LmRpdF9maW5hbCh0Zm0sIG91dCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2RpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCQl1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JdGZtLT5jcnRfZGlnZXN0LmRpdF9kaWdlc3QodGZtLCBzZywgbnNnLCBvdXQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JaWYgKHRmbS0+Y3J0X2RpZ2VzdC5kaXRfc2V0a2V5ID09IE5VTEwpCi0JCXJldHVybiAtRU5PU1lTOwotCXJldHVybiB0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JQlVHX09OKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfRUNCKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQljb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JbWVtY3B5KHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIHNyYywgbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCQkgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKLQlyZXR1cm4gdGZtLT5jcnRfY29tcHJlc3MuY290X2NvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCSBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCQkJIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9kZWNvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOwotfQotCi0vKgotICogSE1BQyBzdXBwb3J0LgotICovCi0jaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCi12b2lkIGNyeXB0b19obWFjX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4pOwotdm9pZCBjcnlwdG9faG1hY191cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwotdm9pZCBjcnlwdG9faG1hY19maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LAotCQkgICAgICAgdW5zaWduZWQgaW50ICprZXlsZW4sIHU4ICpvdXQpOwotdm9pZCBjcnlwdG9faG1hYyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbiwKLQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOwotI2VuZGlmCS8qIENPTkZJR19DUllQVE9fSE1BQyAqLwotCi0jZW5kaWYJLyogX0xJTlVYX0NSWVBUT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzNmNmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBDaXBoZXIgb3BlcmF0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKiAgICAgICAgICAgICAgIDIwMDIgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+Ci0gKiAgICAgICAgICAgICAgIDIwMDQgSmVhbi1MdWMgQ29va2UgPGpsY29va2VAY2VydGFpbmtleS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgotCi12b2lkICpzY2F0dGVyd2Fsa193aGljaGJ1ZihzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB2b2lkICpzY3JhdGNoKQotewotCWlmIChuYnl0ZXMgPD0gd2Fsay0+bGVuX3RoaXNfcGFnZSAmJgotCSAgICAoKCh1bnNpZ25lZCBsb25nKXdhbGstPmRhdGEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIG5ieXRlcyA8PQotCSAgICBQQUdFX0NBQ0hFX1NJWkUpCi0JCXJldHVybiB3YWxrLT5kYXRhOwotCWVsc2UKLQkJcmV0dXJuIHNjcmF0Y2g7Ci19Ci0KLXN0YXRpYyB2b2lkIG1lbWNweV9kaXIodm9pZCAqYnVmLCB2b2lkICpzZ2RhdGEsIHNpemVfdCBuYnl0ZXMsIGludCBvdXQpCi17Ci0JaWYgKG91dCkKLQkJbWVtY3B5KHNnZGF0YSwgYnVmLCBuYnl0ZXMpOwotCWVsc2UKLQkJbWVtY3B5KGJ1Ziwgc2dkYXRhLCBuYnl0ZXMpOwotfQotCi12b2lkIHNjYXR0ZXJ3YWxrX3N0YXJ0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCi17Ci0JdW5zaWduZWQgaW50IHJlc3Rfb2ZfcGFnZTsKLQotCXdhbGstPnNnID0gc2c7Ci0KLQl3YWxrLT5wYWdlID0gc2ctPnBhZ2U7Ci0Jd2Fsay0+bGVuX3RoaXNfc2VnbWVudCA9IHNnLT5sZW5ndGg7Ci0KLQlyZXN0X29mX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLSAoc2ctPm9mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7Ci0Jd2Fsay0+bGVuX3RoaXNfcGFnZSA9IG1pbihzZy0+bGVuZ3RoLCByZXN0X29mX3BhZ2UpOwotCXdhbGstPm9mZnNldCA9IHNnLT5vZmZzZXQ7Ci19Ci0KLXZvaWQgc2NhdHRlcndhbGtfbWFwKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGspCi17Ci0Jd2Fsay0+ZGF0YSA9IGttYXBfYXRvbWljKHdhbGstPnBhZ2UpICsgd2Fsay0+b2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCBzY2F0dGVyd2Fsa19wYWdlZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LAotCQkJCSB1bnNpZ25lZCBpbnQgbW9yZSkKLXsKLQkvKiB3YWxrLT5kYXRhIG1heSBiZSBwb2ludGluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCBwYWdlOwotCSAgIGhvd2V2ZXIsIHdlIGtub3cgd2UgdHJhbnNmZXJyZWQgYXQgbGVhc3Qgb25lIGJ5dGUuICBTbywKLQkgICB3YWxrLT5kYXRhIC0gMSB3aWxsIGJlIGEgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBtYXBwZWQgcGFnZS4gKi8KLQotCWlmIChvdXQpCi0JCWZsdXNoX2RjYWNoZV9wYWdlKHdhbGstPnBhZ2UpOwotCi0JaWYgKG1vcmUpIHsKLQkJd2Fsay0+bGVuX3RoaXNfc2VnbWVudCAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOwotCi0JCWlmICh3YWxrLT5sZW5fdGhpc19zZWdtZW50KSB7Ci0JCQl3YWxrLT5wYWdlKys7Ci0JCQl3YWxrLT5sZW5fdGhpc19wYWdlID0gbWluKHdhbGstPmxlbl90aGlzX3NlZ21lbnQsCi0JCQkJCQkgICh1bnNpZ25lZClQQUdFX0NBQ0hFX1NJWkUpOwotCQkJd2Fsay0+b2Zmc2V0ID0gMDsKLQkJfQotCQllbHNlCi0JCQlzY2F0dGVyd2Fsa19zdGFydCh3YWxrLCBzZ19uZXh0KHdhbGstPnNnKSk7Ci0JfQotfQotCi12b2lkIHNjYXR0ZXJ3YWxrX2RvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwgaW50IG1vcmUpCi17Ci0JY3J5cHRvX2t1bm1hcCh3YWxrLT5kYXRhLCBvdXQpOwotCWlmICh3YWxrLT5sZW5fdGhpc19wYWdlID09IDAgfHwgIW1vcmUpCi0JCXNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHdhbGssIG91dCwgbW9yZSk7Ci19Ci0KLS8qCi0gKiBEbyBub3QgY2FsbCB0aGlzIHVubGVzcyB0aGUgdG90YWwgbGVuZ3RoIG9mIGFsbCBvZiB0aGUgZnJhZ21lbnRzCi0gKiBoYXMgYmVlbiB2ZXJpZmllZCBhcyBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KLSAqLwotaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAotCQkJICAgc2l6ZV90IG5ieXRlcykKLXsKLQlpZiAoYnVmICE9IHdhbGstPmRhdGEpIHsKLQkJd2hpbGUgKG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UpIHsKLQkJCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCB3YWxrLT5sZW5fdGhpc19wYWdlLCBvdXQpOwotCQkJYnVmICs9IHdhbGstPmxlbl90aGlzX3BhZ2U7Ci0JCQluYnl0ZXMgLT0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKLQotCQkJa3VubWFwX2F0b21pYyh3YWxrLT5kYXRhKTsKLQkJCXNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHdhbGssIG91dCwgMSk7Ci0JCQlzY2F0dGVyd2Fsa19tYXAod2Fsayk7Ci0JCX0KLQotCQltZW1jcHlfZGlyKGJ1Ziwgd2Fsay0+ZGF0YSwgbmJ5dGVzLCBvdXQpOwotCX0KLQotCXdhbGstPm9mZnNldCArPSBuYnl0ZXM7Ci0Jd2Fsay0+bGVuX3RoaXNfcGFnZSAtPSBuYnl0ZXM7Ci0Jd2Fsay0+bGVuX3RoaXNfc2VnbWVudCAtPSBuYnl0ZXM7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjQ0NjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwNCBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9DUllQVE9fU0NBVFRFUldBTEtfSAotI2RlZmluZSBfQ1JZUFRPX1NDQVRURVJXQUxLX0gKLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotCi1zdHJ1Y3Qgc2NhdHRlcl93YWxrIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwotCXN0cnVjdCBwYWdlCQkqcGFnZTsKLQl2b2lkCQkJKmRhdGE7Ci0JdW5zaWduZWQgaW50CQlsZW5fdGhpc19wYWdlOwotCXVuc2lnbmVkIGludAkJbGVuX3RoaXNfc2VnbWVudDsKLQl1bnNpZ25lZCBpbnQJCW9mZnNldDsKLX07Ci0KLS8qIERlZmluZSBzZ19uZXh0IGlzIGFuIGlubGluZSByb3V0aW5lIG5vdyBpbiBjYXNlIHdlIHdhbnQgdG8gY2hhbmdlCi0gICBzY2F0dGVybGlzdCB0byBhIGxpbmtlZCBsaXN0IGxhdGVyLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX25leHQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKLXsKLQlyZXR1cm4gc2cgKyAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzY2F0dGVyd2Fsa19zYW1lYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGtfaW4sCi0JCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsa19vdXQsCi0JCQkJICAgICAgdm9pZCAqc3JjX3AsIHZvaWQgKmRzdF9wKQotewotCXJldHVybiB3YWxrX2luLT5wYWdlID09IHdhbGtfb3V0LT5wYWdlICYmCi0JICAgICAgIHdhbGtfaW4tPm9mZnNldCA9PSB3YWxrX291dC0+b2Zmc2V0ICYmCi0JICAgICAgIHdhbGtfaW4tPmRhdGEgPT0gc3JjX3AgJiYgd2Fsa19vdXQtPmRhdGEgPT0gZHN0X3A7Ci19Ci0KLXZvaWQgKnNjYXR0ZXJ3YWxrX3doaWNoYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHVuc2lnbmVkIGludCBuYnl0ZXMsIHZvaWQgKnNjcmF0Y2gpOwotdm9pZCBzY2F0dGVyd2Fsa19zdGFydChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKTsKLWludCBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc2l6ZV90IG5ieXRlcywgaW50IG91dCk7Ci12b2lkIHNjYXR0ZXJ3YWxrX21hcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0KTsKLXZvaWQgc2NhdHRlcndhbGtfZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LCBpbnQgbW9yZSk7Ci0KLSNlbmRpZiAgLyogX0NSWVBUT19TQ0FUVEVSV0FMS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF85M2N4Ni5jCmluZGV4IGM2MTcyOWIuLmNkMDYwNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF85M2N4Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF85M2N4Ni5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlICJyODE4MF85M2N4Ni5oIgogCi12b2lkIGVwcm9tX2NzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJpdCkKK3N0YXRpYyB2b2lkIGVwcm9tX2NzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJpdCkKIHsKIAl1OCBjbWRyZWc7CiAKQEAgLTM3LDcgKzM3LDcgQEAKIH0KIAogCi12b2lkIGVwcm9tX2NrX2N5Y2xlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBlcHJvbV9ja19jeWNsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXU4IGNtZHJlZzsKIApAQCAtNTMsNyArNTMsNyBAQAogfQogCiAKLXZvaWQgZXByb21fdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGJpdCkKK3N0YXRpYyB2b2lkIGVwcm9tX3coc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBiaXQpCiB7CiAJdTggY21kcmVnOwogCkBAIC02OCw3ICs2OCw3IEBACiB9CiAKIAotc2hvcnQgZXByb21fcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHNob3J0IGVwcm9tX3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1OCBiaXQ7CiAKQEAgLTgyLDcgKzgyLDcgQEAKIH0KIAogCi12b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYltdLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgZXByb21fc2VuZF9iaXRzX3N0cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiW10sIGludCBsZW4pCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKaW5kZXggYzJiY2JlMi4uMWJiNjE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCiAKIAotdm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTMyIHVsY29tbWFuZCA9IDA7CiAJLy8yMDA0LzAyLzExICBJbiBzdGF0aWMgV0VQLCBPSURfQUREX0tFWSBvciBPSURfQUREX1dFUCBhcmUgc2V0IGJlZm9yZSBTVEEgYXNzb2NpYXRlIHRvIEFQLgpAQCAtNTkxLDEyICs1OTEsNiBAQAogCXJ0bDgxOTJfcHJvYyA9IHByb2NfbWtkaXIoUlRMODE5eFVfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKIH0KIAotCi12b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKHZvaWQpCi17Ci0JcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKLX0KLQogLyoKICAqIHNlcV9maWxlIHdyYXBwZXJzIGZvciBwcm9jZmlsZSBzaG93IHJvdXRpbmVzLgogICovCkBAIC02NzMsNyArNjY3LDcgQEAKIAlyZXR1cm4gKHVzZWQgPCBNQVhfVFhfVVJCKTsKIH0KIAotdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC02ODksMjQgKzY4Myw2IEBACiAJCVJUX1RSQUNFKENPTVBfRVBST00sICJFRVBST00gYWRkciAleCA6ICV4IiwgaSwgZXByb21fcmVhZChkZXYsIGkpKTsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSFcgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXZvaWQgcnRsODE5Ml9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbW9kZSkKLXsKLQl1OCBlY21kOwotCXJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsICZlY21kKTsKLQllY21kID0gZWNtZCAmIH5FUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSzsKLQllY21kID0gZWNtZCB8IChtb2RlPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpOwotCWVjbWQgPSBlY21kICYgfkVQUk9NX0NTX0JJVDsKLQllY21kID0gZWNtZCAmIH5FUFJPTV9DS19CSVQ7Ci0Jd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsIGVjbWQpOwotfQotCi0KIHZvaWQgcnRsODE5Ml91cGRhdGVfbXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtOTAzLDEyICs4NzksNiBAQAogCXJldHVybjsKIH0KIAotCi1pbnQgYWxsb2NfdHhfYmVhY29uX2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIGlubGluZSB1MTYgaWVlZXJhdGUycnRscmF0ZShpbnQgcmF0ZSkKIHsKIAlzd2l0Y2ggKHJhdGUpIHsKQEAgLTEwMTEsMTMgKzk4MSwxMyBAQAogfQogCiAKLXZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCS8vRklYTUUgISEKIH0KIAogCi12b2lkIHJ0bDgxOTJfZGF0YV9oYXJkX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJLy8gRklYTUUgISEKIH0KQEAgLTEwMjUsNyArOTk1LDcgQEAKIC8qIHRoaXMgZnVuY3Rpb24gVFggZGF0YSBmcmFtZXMgd2hlbiB0aGUgaWVlZTgwMjExIHN0YWNrIHJlcXVpcmVzIHRoaXMuCiAgKiBJdCBjaGVja3MgYWxzbyBpZiB3ZSBuZWVkIHRvIHN0b3AgdGhlIGllZWUgdHggcXVldWUsIGV2ZW50dWFsbHkgZG8gaXQKICAqLwotdm9pZCBydGw4MTkyX2hhcmRfZGF0YV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByYXRlKQorc3RhdGljIHZvaWQgcnRsODE5Ml9oYXJkX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmF0ZSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IHJldDsKQEAgLTEwNTMsNyArMTAyMyw3IEBACiAgKiBJZiB0aGUgcmluZyBpcyBmdWxsIHBhY2tldCBhcmUgZHJvcHBlZCAoZm9yIGRhdGEgZnJhbWUgdGhlIHF1ZXVlCiAgKiBpcyBzdG9wcGVkIGJlZm9yZSB0aGlzIGNhbiBoYXBwZW4pLgogICovCi1pbnQgcnRsODE5Ml9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcnRsODE5Ml9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IHJldDsKQEAgLTEzMTgsNyArMTI4OCw4IEBACiAJCS8qIERvbid0IHNlbmQgZGF0YSBmcmFtZSBkdXJpbmcgc2Nhbm5pbmcuKi8KIAkJaWYgKChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pICE9IDApICYmCiAJCSAgICAoIShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApKSkgewotCQkJaWYgKE5VTEwgIT0gKHNrYiA9IHNrYl9kZXF1ZXVlKCYocHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSkpKQorCQkJc2tiID0gc2tiX2RlcXVldWUoJihwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pKTsKKwkJCWlmIChza2IpCiAJCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CiAKIAkJCXJldHVybjsgLy9tb2RpZmllZCBieSBkYXZpZCB0byBhdm9pZCBmdXJ0aGVyIHByb2Nlc3NpbmcgQU1TRFUKQEAgLTEzNTgsMjUgKzEzMjksNyBAQAogCiB9CiAKLXZvaWQgcnRsODE5Ml9iZWFjb25fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXU4IG1zciwgbXNybSwgbXNyMjsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlyZWFkX25pY19ieXRlKGRldiwgTVNSLCAmbXNyKTsKLQltc3JtID0gbXNyICYgTVNSX0xJTktfTUFTSzsKLQltc3IyID0gbXNyICYgfk1TUl9MSU5LX01BU0s7Ci0KLQlpZiAoTklDXzgxOTJVID09IHByaXYtPmNhcmRfODE5MikKLQkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYltNQVhfUlhfVVJCXSk7Ci0JaWYgKChtc3JtID09IChNU1JfTElOS19BREhPQzw8TVNSX0xJTktfU0hJRlQpIHx8Ci0JICAgIChtc3JtID09IChNU1JfTElOS19NQVNURVI8PE1TUl9MSU5LX1NISUZUKSkpKSB7Ci0JCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IyIHwgTVNSX0xJTktfTk9ORSk7Ci0JCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IpOwotCX0KLX0KLQotdm9pZCBydGw4MTkyX2NvbmZpZ19yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqcmF0ZV9jb25maWcpCitzdGF0aWMgdm9pZCBydGw4MTkyX2NvbmZpZ19yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqcmF0ZV9jb25maWcpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0OwpAQCAtMTQyMyw3ICsxMzc2LDcgQEAKICNkZWZpbmUgU0hPUlRfU0xPVF9USU1FIDkKICNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRSAyMAogCi12b2lkIHJ0bDgxOTJfdXBkYXRlX2NhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY2FwKQorc3RhdGljIHZvaWQgcnRsODE5Ml91cGRhdGVfY2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjYXApCiB7CiAJdTMyIHRtcCA9IDA7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMTQ0NSw3ICsxMzk4LDcgQEAKIAl9CiAKIH0KLXZvaWQgcnRsODE5Ml9uZXRfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX25ldF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTE1NjAsMTEgKzE1MTMsNiBAQAogCXJldHVybiBOX0RCUFM7CiB9CiAKLXZvaWQgcnRsODE5eFVfY21kX2lzcihzdHJ1Y3QgdXJiICp0eF9jbWRfdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1c2JfZnJlZV91cmIodHhfY21kX3VyYik7Ci19Ci0KIHVuc2lnbmVkIGludCB0eHF1ZXVlMm91dHBpcGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCB0eF9xdWV1ZSkKIHsKIAlpZiAodHhfcXVldWUgPj0gOSkgewpAQCAtMTY3Myw3ICsxNjIxLDcgQEAKIAlyZXR1cm4gUXVldWVTZWxlY3Q7CiB9CiAKLXU4IE1SYXRlVG9Id1JhdGU4MTkwUGNpKHU4IHJhdGUpCitzdGF0aWMgdTggTVJhdGVUb0h3UmF0ZTgxOTBQY2kodTggcmF0ZSkKIHsKIAl1OCAgcmV0ID0gREVTQzkwX1JBVEUxTTsKIApAQCAtMjAzOSw3ICsxOTg3LDcgQEAKICNlbmRpZgogCiBleHRlcm4gdm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBydGw4MTkyX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOwpAQCAtMjA3MSw3ICsyMDE5LDcgQEAKIH07CiAKIAotdm9pZCBydGw4MTkyX3VwZGF0ZV9iZWFjb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgcnRsODE5Ml91cGRhdGVfYmVhY29uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxOTJfcHJpdiwgdXBkYXRlX2JlYWNvbl93cS53b3JrKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CkBAIC0yMDg2LDggKzIwMzQsOCBAQAogLyoKICogYmFja2dyb3VuZCBzdXBwb3J0IHRvIHJ1biBRb1MgYWN0aXZhdGUgZnVuY3Rpb25hbGl0eQogKi8KLWludCBXRENBUEFSQV9BRERbXSA9IHtFRENBUEFSQV9CRSwgRURDQVBBUkFfQkssIEVEQ0FQQVJBX1ZJLCBFRENBUEFSQV9WT307Ci12b2lkIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbnQgV0RDQVBBUkFfQUREW10gPSB7RURDQVBBUkFfQkUsIEVEQ0FQQVJBX0JLLCBFRENBUEFSQV9WSSwgRURDQVBBUkFfVk99Oworc3RhdGljIHZvaWQgcnRsODE5Ml9xb3NfYWN0aXZhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCBxb3NfYWN0aXZhdGUpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKQEAgLTIzMTUsNyArMjI2Myw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzODE5eFVzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGJvb2wgR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzODE5eFVzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWJvb2wJCQlSZXZhbDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0yMzI5LDcgKzIyNzcsNyBAQAogCXJldHVybiBSZXZhbDsKIH0KIAotdm9pZCBydGw4MTkyX3JlZnJlc2hfc3VwcG9ydHJhdGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX3JlZnJlc2hfc3VwcG9ydHJhdGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CiAJLy93ZSBkbyBub3QgY29uc2lkZXIgc2V0IHN1cHBvcnQgcmF0ZSBmb3IgQUJHIG1vZGUsIG9ubHkgSFQgTUNTIHJhdGUgaXMgc2V0IGhlcmUuCkBAIC0yMzQwLDcgKzIyODgsNyBAQAogCXJldHVybjsKIH0KIAotdTggcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHU4IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTggcmV0ID0gMDsKQEAgLTIzNTksNyArMjMwNyw3IEBACiAJfQogCXJldHVybiByZXQ7CiB9Ci12b2lkIHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHdpcmVsZXNzX21vZGUpCitzdGF0aWMgdm9pZCBydGw4MTkyX1NldFdpcmVsZXNzTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB3aXJlbGVzc19tb2RlKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OCBiU3VwcG9ydE1vZGUgPSBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKGRldik7CkBAIC0yNzc5LDcgKzI3MjcsNyBAQAogCXJldHVybjsKIH0KIAotc2hvcnQgcnRsODE5Ml9nZXRfY2hhbm5lbF9tYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpZiAocHJpdi0+Q2hhbm5lbFBsYW4gPiBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTikgewpAQCAtMjc5Miw3ICsyNzQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc2hvcnQgcnRsODE5Ml9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc2hvcnQgcnRsODE5Ml9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0yODQwLDcgKzI3ODgsNyBAQAogICogIHJldHVybjogIG5vbmUKICAqICBub3RpY2U6ICBUaGlzIHBhcnQgbmVlZCB0byBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHJhdGUgc2V0IHdlIGZpbHRlcmVkCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX2h3Y29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX2h3Y29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTMyIHJlZ1JBVFIgPSAwLCByZWdSUlNSID0gMDsKIAl1OCByZWdCd09wTW9kZSA9IDAsIHJlZ1RtcCA9IDA7CkBAIC0yOTIzLDcgKzI4NzEsNyBAQAogCiAKIC8vSW5pdGlhbGl6ZUFkYXB0ZXIgYW5kIFBoeUNmZwotYm9vbCBydGw4MTkyX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBib29sIHJ0bDgxOTJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIgZHdSZWdSZWFkID0gMDsKQEAgLTMxNzksNyArMzEyNyw3IEBACiAqCTxBc3N1bXB0aW9uOiBSVF9UWF9TUElOTE9DSyBpcyBhY3F1aXJlZC4+CiAqCUZpcnN0IGFkZGVkOiAyMDA2LjExLjE5IGJ5IGVtaWx5CiAqLwotUkVTRVRfVFlQRSBUeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBSRVNFVF9UWVBFIFR4Q2hlY2tTdHVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OAkJCVF1ZXVlSUQ7CkBAIC0zMjgyLDcgKzMyMzAsNyBAQAogKgogKgk4MTg1IGFuZCA4MTg1YiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4gVGhpcyBpcyBhZGRlZCBieSBFbWlseSBhdCAyMDA2LjExLjI0CiAqLwotUkVTRVRfVFlQRSBydGw4MTl4X2lmY2hlY2tfcmVzZXRvcm5vdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIFJFU0VUX1RZUEUgcnRsODE5eF9pZmNoZWNrX3Jlc2V0b3Jub3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJUkVTRVRfVFlQRQlUeFJlc2V0VHlwZSA9IFJFU0VUX1RZUEVfTk9SRVNFVDsKQEAgLTMzMjEsNyArMzI2OSw3IEBACiAKIAogCi12b2lkIENhbVJlc3RvcmVBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgQ2FtUmVzdG9yZUFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTggRW50cnlJZCA9IDA7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMzM5Nyw3ICszMzQ1LDcgQEAKIC8vIFRoZSBtZXRob2QgY2hlY2tpbmcgVHgvUnggc3R1Y2sgb2YgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgYnkgRlcsCiAvLyB3aGljaCByZXBvcnRzIFR4IGFuZCBSeCBjb3VudGVyIHRvIHJlZ2lzdGVyIDB4MTI4IGFuZCAweDEzMC4KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIHJ0bDgxOXhfaWZzaWxlbnRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5eF9pZnNpbGVudHJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4CXJlc2V0X3RpbWVzID0gMDsKQEAgLTM1MTcsNyArMzQ2NSw3IEBACiAJcHJpbnRrKCJcbiIpOwogfQogCi12b2lkIHJ0bDgxOXhfdXBkYXRlX3J4Y291bnRzKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1MzIgKlRvdGFsUnhCY25OdW0sCitzdGF0aWMgdm9pZCBydGw4MTl4X3VwZGF0ZV9yeGNvdW50cyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTMyICpUb3RhbFJ4QmNuTnVtLAogCQkJICAgICB1MzIgKlRvdGFsUnhEYXRhTnVtKQogewogCXUxNgkJCVNsb3RJbmRleDsKQEAgLTM1MzYsNyArMzQ4NCw3IEBACiB9CiAKIAotZXh0ZXJuIHZvaWQgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3ZvaWQgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHdhdGNoX2RvZ193cSk7CkBAIC0zNjM0LDcgKzM1ODIsNyBAQAogfQogCiAKLWludCBydGw4MTkyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcnRsODE5Ml9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCWludCByZXQ7CkBAIC0zNzU0LDcgKzM3MDIsNyBAQAogfQogCiAKLWludCByODE5Ml9zZXRfbWFjX2FkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICptYWMpCitzdGF0aWMgaW50IHI4MTkyX3NldF9tYWNfYWRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKm1hYykKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gbWFjOwpAQCAtMzc3MCw3ICszNzE4LDcgQEAKIH0KIAogLyogYmFzZWQgb24gaXB3MjIwMCBkcml2ZXIgKi8KLWludCBydGw4MTkyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCitzdGF0aWMgaW50IHJ0bDgxOTJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7CkBAIC0zODYxLDcgKzM4MDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXU4IEh3UmF0ZVRvTVJhdGU5MChib29sIGJJc0hULCB1OCByYXRlKQorc3RhdGljIHU4IEh3UmF0ZVRvTVJhdGU5MChib29sIGJJc0hULCB1OCByYXRlKQogewogCXU4ICByZXRfcmF0ZSA9IDB4ZmY7CiAKQEAgLTM5NDcsNyArMzg5NSw3IEBACiAKIC8vYnkgYW15IDA4MDYwNgogCi1sb25nIHJ0bDgxOXhfdHJhbnNsYXRlX3RvZGJtKHU4IHNpZ25hbF9zdHJlbmd0aF9pbmRleCkvLyAwLTEwMCBpbmRleC4KK3N0YXRpYyBsb25nIHJ0bDgxOXhfdHJhbnNsYXRlX3RvZGJtKHU4IHNpZ25hbF9zdHJlbmd0aF9pbmRleCkvLyAwLTEwMCBpbmRleC4KIHsKIAlsb25nCXNpZ25hbF9wb3dlcjsgLy8gaW4gZEJtLgogCkBAIC0zOTYzLDcgKzM5MTEsOSBAQAogICAgIGJlIGEgbG9jYWwgc3RhdGljLiBPdGhlcndpc2UsIGl0IG1heSBpbmNyZWFzZSB3aGVuIHdlIHJldHVybiBmcm9tIFMzL1M0LiBUaGUKICAgICB2YWx1ZSB3aWxsIGJlIGtlcHQgaW4gbWVtb3J5IG9yIGRpc2suIERlY2xhcmUgdGhlIHZhbHVlIGluIHRoZSBhZGFwdG9yCiAgICAgYW5kIGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZCB3aGVuIHJldHVybmVkIGZyb20gUzMvUzQuICovCi12b2lkIHJ0bDgxOTJfcHJvY2Vzc19waHlpbmZvKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCAqYnVmZmVyLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwcHJldmlvdXNfc3RhdHMsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBjdXJyZW50X3N0YXRzKQorc3RhdGljIHZvaWQgcnRsODE5Ml9wcm9jZXNzX3BoeWluZm8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4ICpidWZmZXIsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBwcmV2aW91c19zdGF0cywKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcGN1cnJlbnRfc3RhdHMpCiB7CiAJYm9vbCBiY2hlY2sgPSBmYWxzZTsKIAl1OAlyZnBhdGg7CkBAIC00NDQ5LDggKzQzOTksOCBAQAogCX0KIH0JLyogUXVlcnlSeFBoeVN0YXR1czgxOTBQY2kgKi8KIAotdm9pZCBydGw4MTkyX3JlY29yZF9yeGRlc2NfZm9ybGF0ZXJ1c2Uoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHNyY19zdGF0cywKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHRhcmdldF9zdGF0cykKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcmVjb3JkX3J4ZGVzY19mb3JsYXRlcnVzZShzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3JjX3N0YXRzLAorCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwdGFyZ2V0X3N0YXRzKQogewogCXB0YXJnZXRfc3RhdHMtPmJJc0FNUERVID0gcHNyY19zdGF0cy0+YklzQU1QRFU7CiAJcHRhcmdldF9zdGF0cy0+YkZpcnN0TVBEVSA9IHBzcmNfc3RhdHMtPmJGaXJzdE1QRFU7CkBAIC00NzIxLDcgKzQ2NzEsNyBAQAogCQkJKyBTdGF0dXMtPlJ4QnVmU2hpZnQpOwogfQogCi12b2lkIHJ0bDgxOTJfcnhfbm9tYWwoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcnhfbm9tYWwoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlydGw4MTkyX3J4X2luZm8gKmluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKQEAgLTQ4NzEsOCArNDgyMSw4IEBACiAKIH0KIAotdm9pZCBydGw4MTl4dXNiX3Byb2Nlc3NfcmVjZWl2ZWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBzdGF0cykKK3N0YXRpYyB2b2lkIHJ0bDgxOXh1c2JfcHJvY2Vzc19yZWNlaXZlZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBzdGF0cykKIHsKIAl1OAkqZnJhbWU7CiAJdTE2ICAgICBmcmFtZV9sZW4gPSAwOwpAQCAtNDkzMiw3ICs0ODgyLDcgQEAKIH0KIAogCi12b2lkIHJ0bDgxOTJfcnhfY21kKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBydGw4MTkyX3J4X2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYwppbmRleCA0MWZiNjdiLi5kOTdhZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCkBAIC01MCwzNCArNTAsNyBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybgl2b2lkCWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuCXZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0KLWV4dGVybgl2b2lkCWluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybgl2b2lkCWRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCi1leHRlcm4Jdm9pZAlkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldixib29sICBiaW5jaDE0KTsKLWV4dGVybgl2b2lkCWRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4Jdm9pZAlkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4Jdm9pZAlkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCQkJdTMyCQlkbV90eXBlLAotCQkJCQkJCQl1MzIJCWRtX3ZhbHVlKTsKLWV4dGVybgl2b2lkCURNX0NoYW5nZUZzeW5jU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCQkJCQkJczMyCQlETV9UeXBlLAotCQkJCQkJCQkJCQkJczMyCQlETV9WYWx1ZSk7Ci1leHRlcm4Jdm9pZCBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJCQkJdTMyCQlmb3JjZV90eXBlLAotCQkJCQkJCQkJCXUzMgkJZm9yY2VfdmFsdWUpOwotZXh0ZXJuCXZvaWQJZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuCXZvaWQJZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKLWV4dGVybgl2b2lkCWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1leHRlcm4Jdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOwogZXh0ZXJuCXZvaWQgZG1fY2hlY2tfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4Jdm9pZAlkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTE1NSw4ICsxMjgsNyBAQAogLy8JCVRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnZva2VkIGF0IGRyaXZlciBpbnRpYWxpemF0aW9uIG9uY2UuCiAvLwogLy8KLWV4dGVybgl2b2lkCi1pbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtMTc2LDcgKzE0OCw3IEBACiAKIH0JLy8gSW5pdEhhbERtCiAKLWV4dGVybiB2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCiAJZG1fZGVJbml0X2ZzeW5jKGRldik7CkBAIC0yNDIsNyArMjE0LDcgQEAKIAogCiAKLWV4dGVybiAgdm9pZCAgICBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTI3NSw3ICsyNDcsNyBAQAogICAqCTAxLzE2LzIwMDgJTUhDCQlSRl9UeXBlIGlzIGFzc2lnbmVkIGluIFJlYWRBZGFwdGVySW5mbygpLiBXZSBtdXN0IGNhbGwKICAgKgkJCQkJCXRoZSBmdW5jdGlvbiBhZnRlciBtYWtpbmcgc3VyZSBSRl9UeXBlLgogICAqLwotZXh0ZXJuIHZvaWQgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtODc1LDcgKzg0Nyw3IEBACiAJcHJpdi0+dHhwb3dlcl9jb3VudCA9IDA7CiB9CiAKLWV4dGVybgl2b2lkCWRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit2b2lkIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOwogICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHR4cG93ZXJfdHJhY2tpbmdfd3EpOwpAQCAtMTYwNiwxMCArMTU3OCw3IEBACiAKIAogCi1leHRlcm4gdm9pZCBkbV9jY2tfdHhwb3dlcl9hZGp1c3QoCi0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlib29sICBiaW5jaDE0Ci0pCit2b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIGJpbmNoMTQpCiB7CS8vIGRtX0NDS1R4UG93ZXJBZGp1c3QKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTE2NDIsNyArMTYxMSw3IEBACiAKIH0JLy8gZG1fVFhQb3dlclJlc2V0UmVjb3ZlcnkKIAotZXh0ZXJuIHZvaWQgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMglyZWdfcmF0ciA9IHByaXYtPnJhdGVfYWRhcHRpdmUubGFzdF9yYXRyOwpAQCAtMTcxOCw3ICsxNjg3LDcgQEAKIH0JLy8gZG1fQkJJbml0aWFsR2FpblJlc3RvcmUKIAogCi1leHRlcm4gdm9pZCBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC0xNzczLDkgKzE3NDIsOSBAQAogICoJMDUvMjkvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4gdm9pZCBkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCQkJdTMyCQlkbV90eXBlLAotCQkJCQkJCQl1MzIJCWRtX3ZhbHVlKQorCit2b2lkIGRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZG1fdHlwZSwKKwkJCQkgICAgICAgdTMyIGRtX3ZhbHVlKQogewogCWlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9ISUdIKQogCXsKQEAgLTE4NDIsMjQgKzE4MTEsOCBAQAogCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9ICh1OClkbV92YWx1ZTsKIAl9CiB9CS8qIERNX0NoYW5nZUR5bmFtaWNJbml0R2FpblRocmVzaCAqLwotZXh0ZXJuCXZvaWQKLWRtX2NoYW5nZV9mc3luY19zZXR0aW5nKAotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JczMyCQlETV9UeXBlLAotCXMzMgkJRE1fVmFsdWUpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCi0JaWYgKERNX1R5cGUgPT0gMCkJLy8gbW9uaXRvciAweGMzOCByZWdpc3RlcgotCXsKLQkJaWYoRE1fVmFsdWUgPiAxKQotCQkJRE1fVmFsdWUgPSAxOwotCQlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gKHU4KURNX1ZhbHVlOwotCQkvL0RiZ1ByaW50KCJwSGFsRGF0YS0+ZnJhbWVzeW5jTW9uaXRvciA9ICVkIiwgcEhhbERhdGEtPmZyYW1lc3luY01vbml0b3IpOwotCX0KLX0KLQotZXh0ZXJuIHZvaWQKK3ZvaWQKIGRtX2NoYW5nZV9yeHBhdGhfc2VsZWN0aW9uX3NldHRpbmcoCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAlzMzIJCURNX1R5cGUsCkBAIC0yNTQwLDcgKzI0OTMsNyBAQAogCX0KIH0KIAotZXh0ZXJuIHZvaWQgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtMjY2MCwyNiArMjYxMyw2IEBACiAJbGFzdFJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKIH0JLy8gZG1fQ2hlY2tFZGNhVHVyYm8KIAotZXh0ZXJuIHZvaWQgRE1fQ1RTVG9TZWxmU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBETV9UeXBlLCB1MzIgRE1fVmFsdWUpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOwotCi0JaWYgKERNX1R5cGUgPT0gMCkJLy8gQ1RTIHRvIHNlbGYgZGlzYWJsZS9lbmFibGUKLQl7Ci0JCWlmKERNX1ZhbHVlID4gMSkKLQkJCURNX1ZhbHVlID0gMTsKLQkJcHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlID0gKGJvb2wpRE1fVmFsdWU7Ci0JCS8vRGJnUHJpbnQoInBNZ250SW5mby0+YkNUU1RvU2VsZkVuYWJsZSA9ICVkXG4iLCBwTWdudEluZm8tPmJDVFNUb1NlbGZFbmFibGUpOwotCX0KLQllbHNlIGlmKERNX1R5cGUgPT0gMSkgLy9DVFMgdG8gc2VsZiBUaAotCXsKLQkJaWYoRE1fVmFsdWUgPj0gNTApCi0JCQlETV9WYWx1ZSA9IDUwOwotCQlwcml2LT5pZWVlODAyMTEtPkNUU1RvU2VsZlRIID0gKHU4KURNX1ZhbHVlOwotCQkvL0RiZ1ByaW50KCJwTWdudEluZm8tPkNUU1RvU2VsZlRIID0gJWRcbiIsIHBNZ250SW5mby0+Q1RTVG9TZWxmVEgpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgZG1faW5pdF9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CkBAIC0yNzc5LDcgKzI3MTIsNyBAQAogICoJMDEvMzAvMjAwOAlNSEMJCUNyZWF0ZSBWZXJzaW9uIDAuCiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuCXZvaWQJZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQordm9pZCBkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOwogICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHJmcGF0aF9jaGVja193cSk7CkBAIC0zMTM5LDcgKzMwNzIsNyBAQAogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7CiB9CiAKLWV4dGVybiB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3ZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CkBAIC0zNDc4LDcgKzM0MTEsNyBAQAogICoJMDUvMjkvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4gdm9pZCBkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXU4CXBhZ2U7CiAJdTE2CW9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uaAppbmRleCBhZTU1MDUyLi4zMDA4ZjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCkBAIC0yMDAsOSArMjAwLDkgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybglkaWdfdAlkbV9kaWd0YWJsZTsKLWV4dGVybgl1OAkJZG1fc2hhZG93WzE2XVsyNTZdOwotZXh0ZXJuIERSeFBhdGhTZWwgICAgICBETV9SeFBhdGhTZWxUYWJsZTsKK2V4dGVybiBkaWdfdCBkbV9kaWd0YWJsZTsKK2V4dGVybiB1OCBkbV9zaGFkb3dbMTZdWzI1Nl07CitleHRlcm4gRFJ4UGF0aFNlbCBETV9SeFBhdGhTZWxUYWJsZTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKQEAgLTIxMiwyNSArMjEyLDIzIEBACiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4gIHZvaWQgICAgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gIHZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQorZXh0ZXJuIHZvaWQgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi1leHRlcm4gIHZvaWQgICAgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuICB2b2lkICAgIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotZXh0ZXJuICB2b2lkICAgIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gIHZvaWQgICAgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuICB2b2lkICAgIGRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJdTMyIGRtX3R5cGUsIHUzMiBkbV92YWx1ZSk7Ci1leHRlcm4gIHZvaWQgICAgZG1fZm9yY2VfdHhfZndfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQl1MzIgZm9yY2VfdHlwZSwgdTMyIGZvcmNlX3ZhbHVlKTsKLWV4dGVybiAgdm9pZCAgICBkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gIHZvaWQgICAgZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKLWV4dGVybiAgdm9pZCAgICBkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotZXh0ZXJuICB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1leHRlcm4Jdm9pZAlkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCAgYmluY2gxNCk7Ci1leHRlcm4gIHZvaWQgICAgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiB2b2lkIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgdTMyIGRtX3R5cGUsIHUzMiBkbV92YWx1ZSk7CitleHRlcm4gdm9pZCBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJdTMyIGZvcmNlX3R5cGUsIHUzMiBmb3JjZV92YWx1ZSk7CitleHRlcm4gdm9pZCBkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkbV9yZl9vcGVyYXRpb25fdGVzdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCAgYmluY2gxNCk7CitleHRlcm4gdm9pZCBkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUR2VuLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUR2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDY3OGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8KLS8vIElPVCBBY3Rpb24gZm9yIGRpZmZlcmVudCBBUAotLy8KLXR5cGVkZWYgZW51bSBfSFRfSU9UX0FDVElPTnsKLQlIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV80SyA9IDB4MDAwMDAwMDEsCi0JSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfOEsgPSAweDAwMDAwMDAyLAotCUhUX0lPVF9BQ1RfREVDTEFSRV9NQ1MxMyA9IDB4MDAwMDAwMDQsCi0JSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8gPSAweDAwMDAwMDA4LAotCUhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNID0gMHgwMDAwMDAxMCwKLQlIVF9JT1RfQUNUX0NERF9GU1lOQyA9IDB4MDAwMDAwMjAsCi0JSFRfSU9UX0FDVF9QVVJFX05fTU9ERSA9IDB4MDAwMDAwNDAsCi19SFRfSU9UX0FDVElPTl9FLCAqUEhUX0lPVF9BQ1RJT05fRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2JiOGU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotI2lmbmRlZiBfUjgxOVhVX0hUVFlQRV9IXwotI2RlZmluZSBfUjgxOVhVX0hUVFlQRV9IXwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhlIEhUIENhcGFiaWxpdHkgZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMsIGFzc29jaWF0aW9uIHJlcXVlc3QsCi0gKiByZWFzc29jaWF0aW9uIHJlcXVlc3QgYW5kIHByb2JlIHJlc3BvbnNlIGZyYW1lcwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogT3BlcmF0aW9uIG1vZGUgdmFsdWUgKi8KLSNkZWZpbmUgSFRfT1BNT0RFX05PX1BST1RFQ1QJCTAKLSNkZWZpbmUgSFRfT1BNT0RFX09QVElPTkFMCQkxCi0jZGVmaW5lIEhUX09QTU9ERV80ME1IWl9QUk9URUNUCQkyCi0jZGVmaW5lIEhUX09QTU9ERV9NSVhFRAkJCTMKLQotLyogTUlNTyBQb3dlciBTYXZlIFNldHRpbmdzICovCi0jZGVmaW5lIE1JTU9fUFNfU1RBVElDCQkJMAotI2RlZmluZSBNSU1PX1BTX0RZTkFNSUMJCQkxCi0jZGVmaW5lIE1JTU9fUFNfTk9MSU1JVAkJCTMKLQotCi0vKiBUaGVyZSBzaG91bGQgYmUgMTI4IGJpdHMgdG8gY292ZXIgYWxsIG9mIHRoZSBNQ1MgcmF0ZXMuIEhvd2V2ZXIsIHNpbmNlCi0gKiA4MTkwIGRvZXMgbm90IHN1cHBvcnQgdG9vIG11Y2ggcmF0ZXMsIG9uZSBpbnRlZ2VyIGlzIHF1aXRlIGVub3VnaC4gKi8KLQotI2RlZmluZSBzSFRDTG5nCQkJCTQKLQotCi0jZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMVNTX0JJVE1BUAkweDAwMDAwMGZmCi0jZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMlNTX0JJVE1BUAkweDAwMDBmZjAwCi0jZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMVNTXzJTU19CSVRNQVAJXAotCQkoSFRfTUNTXzFTU19CSVRNQVAgfCBIVF9NQ1NfMVNTXzJTU19CSVRNQVApCi0KLQotdHlwZWRlZiBlbnVtIF9IVF9NQ1NfUkFURSB7Ci0JSFRfTUNTMCAgID0gMHgwMDAwMDAwMSwKLQlIVF9NQ1MxICAgPSAweDAwMDAwMDAyLAotCUhUX01DUzIgICA9IDB4MDAwMDAwMDQsCi0JSFRfTUNTMyAgID0gMHgwMDAwMDAwOCwKLQlIVF9NQ1M0ICAgPSAweDAwMDAwMDEwLAotCUhUX01DUzUgICA9IDB4MDAwMDAwMjAsCi0JSFRfTUNTNiAgID0gMHgwMDAwMDA0MCwKLQlIVF9NQ1M3ICAgPSAweDAwMDAwMDgwLAotCUhUX01DUzggICA9IDB4MDAwMDAxMDAsCi0JSFRfTUNTOSAgID0gMHgwMDAwMDIwMCwKLQlIVF9NQ1MxMCAgPSAweDAwMDAwNDAwLAotCUhUX01DUzExICA9IDB4MDAwMDA4MDAsCi0JSFRfTUNTMTIgID0gMHgwMDAwMTAwMCwKLQlIVF9NQ1MxMyAgPSAweDAwMDAyMDAwLAotCUhUX01DUzE0ICA9IDB4MDAwMDQwMDAsCi0JSFRfTUNTMTUgID0gMHgwMDAwODAwMCwKLQkvKiBEbyBub3QgZGVmaW5lIE1DUzMyIGhlcmUgYWx0aG91Z2ggODE5MCBzdXBwb3J0IE1DUzMyICovCi19IEhUX01DU19SQVRFLCAqUEhUX01DU19SQVRFOwotCi0vKiBSZXByZXNlbnQgQ2hhbm5lbCBXaWR0aCBpbiBIVCBDYXBhYmlsaXRpZXMgKi8KLXR5cGVkZWYgZW51bSBfSFRfQ0hBTk5FTF9XSURUSCB7Ci0JSFRfQ0hBTk5FTF9XSURUSF8yMCAgICA9IDAsCi0JSFRfQ0hBTk5FTF9XSURUSF8yMF80MCA9IDEsCi19IEhUX0NIQU5ORUxfV0lEVEgsICpQSFRfQ0hBTk5FTF9XSURUSDsKLQotLyogUmVwcmVzZW50IEV4dGVuc2lvbiBDaGFubmVsIE9mZnNldCBpbiBIVCBDYXBhYmlsaXRpZXMKLSAqIFRoaXMgaXMgYXZhaWxhYmxlIG9ubHkgaW4gNDBNaHogbW9kZS4gKi8KLXR5cGVkZWYgZW51bSBfSFRfRVhUQ0hOTF9PRkZTRVQgewotCUhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCA9IDAsCi0JSFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIgID0gMSwKLQlIVF9FWFRDSE5MX09GRlNFVF9OT19ERUYgPSAyLAotCUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSICA9IDMsCi19IEhUX0VYVENITkxfT0ZGU0VULCAqUEhUX0VYVENITkxfT0ZGU0VUOwotCi10eXBlZGVmIGVudW0gX0NITkxPUCB7Ci0JQ0hOTE9QX05PTkUgICA9IDAsCS8qIE5vIEFjdGlvbiBub3cgKi8KLQlDSE5MT1BfU0NBTiAgID0gMSwJLyogU2NhbiBpbiBwcm9ncmVzcyAqLwotCUNITkxPUF9TV0JXICAgPSAyLAkvKiBCYW5kd2lkdGggc3dpdGNoaW5nIGluIHByb2dyZXNzICovCi0JQ0hOTE9QX1NXQ0hOTCA9IDMsCS8qIFNvZnR3YXJlIENoYW5uZWwgc3dpdGNoaW5nIGluIHByb2dyZXNzICovCi19IENITkxPUCwgKlBDSE5MT1A7Ci0KLS8qIERldGVybWluZSBpZiB0aGUgQ2hhbm5lbCBPcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUgQ0hITE9QX0lOX1BST0dSRVNTKF9wSFRJbmZvKQlcCi0JCSgoKF9wSFRJbmZvKS0+Q2hubE9wID4gQ0hOTE9QX05PTkUpID8gVFJVRSA6IEZBTFNFKQotCi0KLXR5cGVkZWYgZW51bSBfSFRfQUNUSU9OIHsKLQlBQ1RfUkVDT01NQU5EX1dJRFRICQk9IDAsCi0JQUNUX01JTU9fUFdSX1NBVkUJCT0gMSwKLQlBQ1RfUFNNUAkJCT0gMiwKLQlBQ1RfU0VUX1BDT19QSEFTRQkJPSAzLAotCUFDVF9NSU1PX0NITF9NRUFTVVJFCQk9IDQsCi0JQUNUX1JFQ0lQUk9DSVRZX0NPUlJFQ1QJCT0gNSwKLQlBQ1RfTUlNT19DU0lfTUFUUklDUwkJPSA2LAotCUFDVF9NSU1PX05PQ09NUFJfU1RFRVIJCT0gNywKLQlBQ1RfTUlNT19DT01QUl9TVEVFUgkJPSA4LAotCUFDVF9BTlRFTk5BX1NFTEVDVAkJPSA5LAotfSBIVF9BQ1RJT04sICpQSFRfQUNUSU9OOwotCi0KLS8qIERlZmluZSBzdWItY2FycmllciBtb2RlIGZvciA0ME1IWi4gKi8KLXR5cGVkZWYgZW51bSBfSFRfQmFuZHdpZHRoXzQwTUhaX1N1Yl9DYXJyaWVyIHsKLQlTQ19NT0RFX0RVUExJQ0FURSA9IDAsCi0JU0NfTU9ERV9MT1dFUiAgICAgPSAxLAotCVNDX01PREVfVVBQRVIgICAgID0gMiwKLQlTQ19NT0RFX0ZVTEw0ME1IWiA9IDMsCi19IEhUX0JXNDBfU0NfRTsKLQotdHlwZWRlZglzdHJ1Y3QgX0hUX0NBUEFCSUxJVFlfRUxFIHsKLQotCS8qIEhUIGNhcGFiaWxpdHkgaW5mbyAqLwotCXU4CUFkdkNvZGluZzoxOwotCXU4CUNobFdpZHRoOjE7Ci0JdTgJTWltb1B3clNhdmU6MjsKLQl1OAlHcmVlbkZpZWxkOjE7Ci0JdTgJU2hvcnRHSTIwTWh6OjE7Ci0JdTgJU2hvcnRHSTQwTWh6OjE7Ci0JdTgJVHhTVEJDOjE7Ci0JdTgJUnhTVEJDOjI7Ci0JdTgJRGVsYXlCQToxOwotCXU4CU1heEFNU0RVU2l6ZToxOwotCXU4CURzc0NDazoxOwotCXU4CVBTTVA6MTsKLQl1OAlSc3ZkMToxOwotCXU4CUxTaWdUeG9wUHJvdGVjdDoxOwotCi0JLyogTUFDIEhUIHBhcmFtZXRlcnMgaW5mbyAqLwotCXU4CU1heFJ4QU1QRFVGYWN0b3I6MjsKLQl1OAlNUERVRGVuc2l0eTozOwotCXU4CVJzdmQyOjM7Ci0KLQkvKiBTdXBwb3J0ZWQgTUNTIHNldCAqLwotCXU4CU1DU1sxNl07Ci0KLQotCS8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLwotCXUxNglFeHRIVENhcEluZm87Ci0KLQkvKiBUWEJGIENhcGFiaWxpdGllcyAqLwotCXU4CVR4QkZDYXBbNF07Ci0KLQkvKiBBbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMgKi8KLQl1OAlBU0NhcDsKLQotfSBfX3BhY2tlZCBIVF9DQVBBQklMSVRZX0VMRSwgKlBIVF9DQVBBQklMSVRZX0VMRTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoZSBIVCBJbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQgaW4gYmVhY29ucwotICogT25seSBBUCBpcyByZXF1aXJlZCB0byBpbmNsdWRlIHRoaXMgZWxlbWVudAotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCBfSFRfSU5GT1JNQVRJT05fRUxFIHsKLQl1OAlDb250cm9sQ2hsOwotCi0JdTgJRXh0Q2hsT2Zmc2V0OjI7Ci0JdTgJUmVjb21tZW1kZWRUeFdpZHRoOjE7Ci0JdTgJUklGUzoxOwotCXU4CVBTTVBBY2Nlc3NPbmx5OjE7Ci0JdTgJU3J2SW50R3JhbnVsYXJpdHk6MzsKLQotCXU4CU9wdE1vZGU6MjsKLQl1OAlOb25HRkRldlByZXNlbnQ6MTsKLQl1OAlSZXZkMTo1OwotCXU4CVJldmQyOjg7Ci0KLQl1OAlSc3ZkMzo2OwotCXU4CUR1YWxCZWFjb246MTsKLQl1OAlEdWFsQ1RTUHJvdGVjdDoxOwotCi0JdTgJU2Vjb25kYXJ5QmVhY29uOjE7Ci0JdTgJTFNpZ1R4b3BQcm90ZWN0RnVsbDoxOwotCXU4CVBjb0FjdGl2ZToxOwotCXU4CVBjb1BoYXNlOjE7Ci0JdTgJUnN2ZDQ6NDsKLQotCXU4CUJhc2ljTVNDWzE2XTsKLX0gX19wYWNrZWQgSFRfSU5GT1JNQVRJT05fRUxFLCAqUEhUX0lORk9STUFUSU9OX0VMRTsKLQotLyogTUlNTyBQb3dlciBTYXZlIGNvbnRyb2wgZmllbGQuCi0gKiBUaGlzIGlzIGFwcGVhciBpbiBNSU1PIFBvd2VyIFNhdmUgQWN0aW9uIEZyYW1lICovCi10eXBlZGVmIHN0cnVjdCBfTUlNT1BTX0NUUkwgewotCXU4CU1pbW9Qc0VuYWJsZToxOwotCXU4CU1pbW9Qc01vZGU6MTsKLQl1OAlSZXNlcnZlZDo2OwotfSBNSU1PUFNfQ1RSTCwgKlBNSU1PUFNfQ1RSTDsKLQotdHlwZWRlZiBlbnVtIF9IVF9TUEVDX1ZFUiB7Ci0JSFRfU1BFQ19WRVJfSUVFRSA9IDAsCi0JSFRfU1BFQ19WRVJfRVdDID0gMSwKLX0gSFRfU1BFQ19WRVIsICpQSFRfU1BFQ19WRVI7Ci0KLXR5cGVkZWYgZW51bSBfSFRfQUdHUkVfTU9ERV9FIHsKLQlIVF9BR0dfQVVUTyA9IDAsCi0JSFRfQUdHX0ZPUkNFX0VOQUJMRSA9IDEsCi0JSFRfQUdHX0ZPUkNFX0RJU0FCTEUgPSAyLAotfSBIVF9BR0dSRV9NT0RFX0UsICpQSFRfQUdHUkVfTU9ERV9FOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGVzIHdoZW4gY2FyZCBpcwotICogIGNvbmZpZ3VyZWQgYXMgbm9uLUFQIFNUQSBtb2RlLgotICogICoqTm90ZSoqIEN1cnJlbnRfeHh4IHNob3VsZCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZSBpbiBIVEluaXRpYWxpemVIVEluZm8oKQotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX1JUX0hJR0hfVEhST1VHSFBVVCB7Ci0JdTgJCQliRW5hYmxlSFQ7Ci0JdTgJCQliQ3VycmVudEhUU3VwcG9ydDsKLQkvKiBUeCA0ME1IeiBjaGFubmVsIGNhcGFiaWxpdHkgKi8KLQl1OAkJCWJSZWdCVzQwTUh6OwotCXU4CQkJYkN1ckJXNDBNSHo7Ci0JLyogVHggU2hvcnQgR0kgZm9yIDQwTWh6ICovCi0JdTgJCQliUmVnU2hvcnRHSTQwTUh6OwotCXU4CQkJYkN1clNob3J0R0k0ME1IejsKLQkvKiBUeCBTaG9ydCBHSSBmb3IgMjBNSHogKi8KLQl1OAkJCWJSZWdTaG9ydEdJMjBNSHo7Ci0JdTgJCQliQ3VyU2hvcnRHSTIwTUh6OwotCS8qIFR4IENDSyByYXRlIGNhcGFiaWxpdHkgKi8KLQl1OAkJCWJSZWdTdXBwQ0NLOwotCXU4CQkJYkN1clN1cHBDQ0s7Ci0KLQkvKiA4MDIuMTFuIHNwZWMgdmVyc2lvbiBmb3IgInBlZXIiICovCi0JSFRfU1BFQ19WRVIJCWVQZWVySFRTcGVjVmVyOwotCi0KLQkvKiBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciAiU2VsZiIgKi8KLQkvKiBUaGlzIGlzIEhUIGNhcCBlbGVtZW50IHNlbnQgdG8gcGVlciBTVEEsIHdoaWNoIGFsc28gaW5kaWNhdGUKLQkgKiBIVCBSeCBjYXBhYmlsaXRpZXMuICovCi0JSFRfQ0FQQUJJTElUWV9FTEUJU2VsZkhUQ2FwOwotCUhUX0lORk9STUFUSU9OX0VMRQlTZWxmSFRJbmZvOwotCi0JLyogSFQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgIlBlZXIiICovCi0JdTgJCQlQZWVySFRDYXBCdWZbMzJdOwotCXU4CQkJUGVlckhUSW5mb0J1ZlszMl07Ci0KLQotCS8qIEEtTVNEVSByZWxhdGVkICovCi0JLyogVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkgKi8KLQl1OAkJCWJBTVNEVV9TdXBwb3J0OwotCXUxNgkJCW5BTVNEVV9NYXhTaXplOwotCXU4CQkJYkN1cnJlbnRfQU1TRFVfU3VwcG9ydDsKLQl1MTYJCQluQ3VycmVudF9BTVNEVV9NYXhTaXplOwotCi0KLQkvKiBBLU1QRFUgcmVsYXRlZCAqLwotCS8qIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkgKi8KLQl1OAkJCWJBTVBEVUVuYWJsZTsKLQl1OAkJCWJDdXJyZW50QU1QRFVFbmFibGU7Ci0JdTgJCQlBTVBEVV9GYWN0b3I7Ci0JdTgJCQlDdXJyZW50QU1QRFVGYWN0b3I7Ci0JdTgJCQlNUERVX0RlbnNpdHk7Ci0JdTgJCQlDdXJyZW50TVBEVURlbnNpdHk7Ci0KLQkvKiBGb3JjZWQgQS1NUERVIGVuYWJsZSAqLwotCUhUX0FHR1JFX01PREVfRQkJRm9yY2VkQU1QRFVNb2RlOwotCXU4CQkJRm9yY2VkQU1QRFVGYWN0b3I7Ci0JdTgJCQlGb3JjZWRNUERVRGVuc2l0eTsKLQotCS8qIEZvcmNlZCBBLU1TRFUgZW5hYmxlICovCi0JSFRfQUdHUkVfTU9ERV9FCQlGb3JjZWRBTVNEVU1vZGU7Ci0JdTE2CQkJRm9yY2VkQU1TRFVNYXhTaXplOwotCi0JdTgJCQliRm9yY2VkU2hvcnRHSTsKLQotCXU4CQkJQ3VycmVudE9wTW9kZTsKLQotCS8qIE1JTU8gUFMgcmVsYXRlZCAqLwotCXU4CQkJU2VsZk1pbW9QczsKLQl1OAkJCVBlZXJNaW1vUHM7Ci0KLQkvKiA0ME1IeiBDaGFubmVsIE9mZnNldCBzZXR0aW5ncy4gKi8KLQlIVF9FWFRDSE5MX09GRlNFVAlDdXJTVEFFeHRDaG5sT2Zmc2V0OwotCXU4CQkJYkN1clR4Qlc0ME1IejsJLyogSWYgd2UgdXNlIDQwIE1IeiB0byBUeCAqLwotCXU4CQkJUGVlckJhbmR3aWR0aDsKLQotCS8qIEZvciBCYW5kd2lkdGggU3dpdGNoaW5nICovCi0JdTgJCQliU3dCd0luUHJvZ3Jlc3M7Ci0JQ0hOTE9QCQkJQ2hubE9wOyAvKiBzdyBzd2l0Y2hpbmcgY2hhbm5lbCBpbiBwcm9ncmVzcy4gKi8KLQl1OAkJCVN3QndTdGVwOwotCXN0cnVjdCB0aW1lcl9saXN0CVN3QndUaW1lcjsKLQotCS8qIEZvciBSZWFsdGVrIHByb3ByaWV0YXJ5IEEtTVBEVSBmYWN0b3IgZm9yIGFnZ3JlZ2F0aW9uICovCi0JdTgJCQliUmVnUlQyUlRBZ2dyZWdhdGlvbjsKLQl1OAkJCWJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbjsKLQl1OAkJCWJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWU7Ci0JdTgJCQlzelJUMlJUQWdnQnVmZmVyWzEwXTsKLQotCS8qIFJ4IFJlb3JkZXIgY29udHJvbCAqLwotCXU4CQkJYlJlZ1J4UmVvcmRlckVuYWJsZTsKLQl1OAkJCWJDdXJSeFJlb3JkZXJFbmFibGU7Ci0JdTgJCQlSeFJlb3JkZXJXaW5TaXplOwotCXU4CQkJUnhSZW9yZGVyUGVuZGluZ1RpbWU7Ci0JdTE2CQkJUnhSZW9yZGVyRHJvcENvdW50ZXI7Ci0KLSNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQotCXU4CQkJVXNiVHhBZ2dyTnVtOwotI2VuZGlmCi0jaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKLQl1OAkJCVVzYlJ4RndBZ2dyRW47Ci0JdTgJCQlVc2JSeEZ3QWdnclBhZ2VOdW07Ci0JdTgJCQlVc2JSeEZ3QWdnclBhY2tldE51bTsKLQl1OAkJCVVzYlJ4RndBZ2dyVGltZW91dDsKLSNlbmRpZgotCi0JLyogQWRkIGZvciBCcm9hZGNvbShMaW5rc3lzKSBJT1QuICovCi0JdTgJCQliSXNQZWVyQmNtOwotCi0JLyogRm9yIElPVCBpc3N1ZS4gKi8KLQl1MzIJCQlJT1RBY3Rpb247Ci19IFJUX0hJR0hfVEhST1VHSFBVVCwgKlBSVF9ISUdIX1RIUk9VR0hQVVQ7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIFN0YSIKLSAqIHdoZW4gY2FyZCBpcyBjb25maWd1cmVkIGFzICJBUCBtb2RlIgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX1JUX0hUSU5GT19TVEFfRU5UUlkgewotCXU4CQkJYkVuYWJsZUhUOwotCi0JdTgJCQliU3VwcG9ydENjazsKLQotCXUxNgkJCUFNU0RVX01heFNpemU7Ci0KLQl1OAkJCUFNUERVX0ZhY3RvcjsKLQl1OAkJCU1QRFVfRGVuc2l0eTsKLQotCXU4CQkJSFRIaWdoZXN0T3BlcmFSYXRlOwotCi0JdTgJCQliQnc0ME1IejsKLQotCXU4CQkJTWltb1BzOwotCi0JdTgJCQlNY3NSYXRlU2V0WzE2XTsKLQotCi19IFJUX0hUSU5GT19TVEFfRU5UUlksICpQUlRfSFRJTkZPX1NUQV9FTlRSWTsKLQotCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlIGZvciAiZWFjaCBBUCIKLSAqIHdoZW4gY2FyZCBpcyBjb25maWd1cmVkIGFzICJTVEEgbW9kZSIKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX0JTU19IVCB7Ci0KLQl1OAkJCQliZFN1cHBvcnRIVDsKLQotCS8qIEhUIHJlbGF0ZWQgZWxlbWVudHMgKi8KLQl1OAkJCQliZEhUQ2FwQnVmWzMyXTsKLQl1MTYJCQkJYmRIVENhcExlbjsKLQl1OAkJCQliZEhUSW5mb0J1ZlszMl07Ci0JdTE2CQkJCWJkSFRJbmZvTGVuOwotCi0JSFRfU1BFQ19WRVIJCQliZEhUU3BlY1ZlcjsKLQotCXU4CQkJCWJkUlQyUlRBZ2dyZWdhdGlvbjsKLQl1OAkJCQliZFJUMlJUTG9uZ1Nsb3RUaW1lOwotfSBCU1NfSFQsICpQQlNTX0hUOwotCi10eXBlZGVmIHN0cnVjdCBfTUlNT19SU1NJIHsKLQl1MzIJRW5hYmxlQW50ZW5uYTsKLQl1MzIJQW50ZW5uYUE7Ci0JdTMyCUFudGVubmFCOwotCXUzMglBbnRlbm5hQzsKLQl1MzIJQW50ZW5uYUQ7Ci0JdTMyCUF2ZXJhZ2U7Ci19IE1JTU9fUlNTSSwgKlBNSU1PX1JTU0k7Ci0KLXR5cGVkZWYgc3RydWN0IF9NSU1PX0VWTSB7Ci0JdTMyCUVWTTE7Ci0JdTMyCUVWTTI7Ci19IE1JTU9fRVZNLCAqUE1JTU9fRVZNOwotCi10eXBlZGVmIHN0cnVjdCBfRkFMU0VfQUxBUk1fU1RBVElTVElDUyB7Ci0JdTMyCUNudF9QYXJpdHlfRmFpbDsKLQl1MzIJQ250X1JhdGVfSWxsZWdhbDsKLQl1MzIJQ250X0NyYzhfZmFpbDsKLQl1MzIJQ250X2FsbDsKLX0gRkFMU0VfQUxBUk1fU1RBVElTVElDUywgKlBGQUxTRV9BTEFSTV9TVEFUSVNUSUNTOwotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYwppbmRleCA3YmRjYmQzLi43MjNjODYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCiB9CiAKLXZvaWQgY21kcGt0X2JlYWNvbnRpbWVyaW50ZXJydXB0XzgxOXh1c2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGNtZHBrdF9iZWFjb250aW1lcmludGVycnVwdF84MTl4dXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUxNiB0eF9yYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCmluZGV4IGQ2YTZkZTMuLmVjZmI2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKQEAgLTE3LDcgKzE3LDggQEAKICNpbmNsdWRlICJyODE5eFVfZmlybXdhcmVfaW1nLmgiCiAjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlLmgiCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLXZvaWQgZmlybXdhcmVfaW5pdF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCitzdGF0aWMgdm9pZCBmaXJtd2FyZV9pbml0X3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYJKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXJ0X2Zpcm13YXJlCQkqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOwpAQCAtMjksNyArMzAsOCBAQAogICogc2VnbWVudCB0aGUgaW1nIGFuZCB1c2UgdGhlIHB0ciBhbmQgbGVuZ3RoIHRvIHJlbWVtYmVyIGluZm8gb24gZWFjaCBzZWdtZW50CiAgKgogICovCi1ib29sIGZ3X2Rvd25sb2FkX2NvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmNvZGVfdmlydHVhbF9hZGRyZXNzLCB1MzIgYnVmZmVyX2xlbikKK3N0YXRpYyBib29sIGZ3X2Rvd25sb2FkX2NvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmNvZGVfdmlydHVhbF9hZGRyZXNzLAorCQkJICAgICB1MzIgYnVmZmVyX2xlbikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAgICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlib29sCQkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKQEAgLTEwMyw0NiArMTA1LDYgQEAKIAogfQogCi1ib29sCi1md1NlbmROdWxsUGFja2V0KAotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JdTMyCQkJTGVuZ3RoCi0pCi17Ci0JYm9vbAlydFN0YXR1cyA9IHRydWU7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgICAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0Jc3RydWN0IHNrX2J1ZmYJICAgICpza2I7Ci0JY2JfZGVzYwkJICAgICp0Y2JfZGVzYzsKLQl1bnNpZ25lZCBjaGFyCSAgICAqcHRyX2J1ZjsKLQlib29sCWJMYXN0SW5pdFBhY2tldCA9IGZhbHNlOwotCi0JLy9QbGF0Zm9ybUFjcXVpcmVTcGluTG9jayhBZGFwdGVyLCBSVF9UWF9TUElOTE9DSyk7Ci0KLQkvL0dldCBUQ0IgYW5kIGxvY2FsIGJ1ZmZlciBmcm9tIGNvbW1vbiBwb29sLiAoSXQgaXMgc2hhcmVkIGJ5IENtZFEsIE1nbnRRLCBhbmQgVVNCIGNvYWxlc2NlIERhdGFRKQotCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCsgNCk7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOwotCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKLQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBUWENNRF9RVUVVRTsKLQl0Y2JfZGVzYy0+YkNtZE9ySW5pdCA9IERFU0NfUEFDS0VUX1RZUEVfSU5JVDsKLQl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaXRQYWNrZXQ7Ci0JcHRyX2J1ZiA9IHNrYl9wdXQoc2tiLCBMZW5ndGgpOwotCW1lbXNldChwdHJfYnVmLDAsTGVuZ3RoKTsKLQl0Y2JfZGVzYy0+dHhidWZfc2l6ZT0gKHUxNilMZW5ndGg7Ci0KLQlpZiAoIXByaXYtPmllZWU4MDIxMS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldix0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHwKLQkJCSghc2tiX3F1ZXVlX2VtcHR5KCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSl8fFwKLQkJCShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApICkgewotCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwiPT09PT09PT09PT09PT09PT09PU5VTEwgcGFja2V0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gdHggZnVsbCFcbiIpOwotCQkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7Ci0JCX0gZWxzZSB7Ci0JCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixkZXYpOwotCQl9Ci0KLQkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKLQlyZXR1cm4gcnRTdGF0dXM7Ci19Ci0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUHJvY2VkdXJlOiAgICBDaGVjayB3aGV0aGVyIG1haW4gY29kZSBpcyBkb3dubG9hZCBPSy4gSWYgT0ssIHR1cm4gb24gQ1BVCiAvLwpAQCAtMTU2LDcgKzExOCw3IEBACiAvLyAgICAgICAgTkRJU19TVEFUVVNfRkFJTFVSRSAtIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaG91bGQgYmUgdGVybWluYXRlZAogLy8gICAgICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MgLSBpZiBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHN1Y2Nlc3MKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJvb2wgQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub25DUFUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBib29sIENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJYm9vbAkJcnRfc3RhdHVzID0gdHJ1ZTsKIAlpbnQJCWNoZWNrX3B1dGNvZGVPS190aW1lID0gMjAwMDAwLCBjaGVja19ib290T2tfdGltZSA9IDIwMDAwMDsKQEAgLTIwNSw3ICsxNjcsNyBAQAogCXJldHVybiBydF9zdGF0dXM7CiB9CiAKLWJvb2wgQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBib29sIENQVWNoZWNrX2Zpcm13YXJlX3JlYWR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKIAlib29sCQlydF9zdGF0dXMgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmMKaW5kZXggZGYwZjlkMS4uMDc4NWRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jCkBAIC0xLDUgKzEsNiBAQAogLypDcmVhdGVkIG9uICAyMDA4LyA3LzE2LCAgNTozMSovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJyODE5eFVfZmlybXdhcmVfaW1nLmgiCiAKIHUzMiBSdGw4MTkyVXNiUEhZX1JFR0FycmF5W10gPSB7CiAweDAsIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYwppbmRleCAzOWNkNDI2Li5iOWYzNTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKICAqIG91dHB1dDogICBub25lCiAgKiByZXR1cm46ICAgdTMyCXJldHVybiB0aGUgc2hpZnQgYml0IHBvc2l0aW9uIG9mIHRoZSBtYXNrCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQodTMyIGJpdG1hc2spCitzdGF0aWMgdTMyIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQodTMyIGJpdG1hc2spCiB7CiAJdTMyIGk7CiAKQEAgLTE0NCw4ICsxNDQsOCBAQAogICogICAgICAgICAgICBEcml2ZXIgaGVyZSBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKQogICogICAgICAgICAgICAtLS1uZWVkIG1vcmUgc3BlYyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsCi0JCQkgICAgIHUzMiBvZmZzZXQpCitzdGF0aWMgdTMyIHJ0bDgxOTJfcGh5X1JGU2VyaWFsUmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgb2Zmc2V0KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIgcmV0ID0gMDsKQEAgLTIyOSw4ICsyMjksOSBAQAogICogUmVnX01vZGUyCTEJCTEJCQlSZWcgMzEgfiA0NSgweDEgfiAweGYpCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBvZmZzZXQsIHUzMiBkYXRhKQorc3RhdGljIHZvaWQgcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBvZmZzZXQsCisJCQkJICAgICAgdTMyIGRhdGEpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMiBEYXRhQW5kQWRkciA9IDAsIG5ld19vZmZzZXQgPSAwOwpAQCAtNTcxLDcgKzU3Miw3IEBACiAgKiBub3RpY2U6ICAgIEluaXRpYWxpemF0aW9uIHZhbHVlIGhlcmUgaXMgY29uc3RhbnQgYW5kIGl0IHNob3VsZCBuZXZlcgogICogICAgICAgICAgICBiZSBjaGFuZ2VkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJ0bDgxOTJfSW5pdEJCUkZSZWdEZWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfSW5pdEJCUkZSZWdEZWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTc4MCw3ICs3ODEsNyBAQAogICogbm90aWNlOiAgICBJbml0aWFsaXphdGlvbiB2YWx1ZSBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKICAqICAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfQkJfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4IHJlZ191OCA9IDAsIGVDaGVja0l0ZW0gPSAwLCBzdGF0dXMgPSAwOwpAQCAtMTA3MCw3ICsxMDcxLDcgQEAKICAqIHJldHVybjogICAgbm9uZQogICogbm90aWNlOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfU2V0VHhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4CXBvd2VybGV2ZWwgPSBwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbY2hhbm5lbC0xXTsKQEAgLTEyMzksOSArMTI0MCw5IEBACiAgKiByZXR1cm46ICAgIHRydWUgaWYgZmluaXNoZWQsIGZhbHNlIG90aGVyd2lzZQogICogbm90aWNlOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFN3Q2hubENtZCAqQ21kVGFibGUsIHUzMiBDbWRUYWJsZUlkeCwKLQkJCQkgdTMyIENtZFRhYmxlU3osIFN3Q2hubENtZElEIENtZElELCB1MzIgUGFyYTEsCi0JCQkJIHUzMiBQYXJhMiwgdTMyIG1zRGVsYXkpCitzdGF0aWMgdTggcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoU3dDaG5sQ21kICpDbWRUYWJsZSwgdTMyIENtZFRhYmxlSWR4LAorCQkJCQl1MzIgQ21kVGFibGVTeiwgU3dDaG5sQ21kSUQgQ21kSUQsCisJCQkJCXUzMiBQYXJhMSwgdTMyIFBhcmEyLCB1MzIgbXNEZWxheSkKIHsKIAlTd0NobmxDbWQgKnBDbWQ7CiAKQEAgLTEyNzYsOCArMTI3Nyw4IEBACiAgKiByZXR1cm46ICAgIHRydWUgaWYgZmluaXNoZWQsIGZhbHNlIG90aGVyd2lzZQogICogbm90aWNlOiAgICBXYWl0IGZvciBzaW1wbGVyIGZ1bmN0aW9uIHRvIHJlcGxhY2UgaXQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJ0bDgxOTJfcGh5X1N3Q2hubFN0ZXBCeVN0ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCwgdTggKnN0YWdlLAotCQkJCXU4ICpzdGVwLCB1MzIgKmRlbGF5KQorc3RhdGljIHU4IHJ0bDgxOTJfcGh5X1N3Q2hubFN0ZXBCeVN0ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCwKKwkJCQkgICAgICAgdTggKnN0YWdlLCB1OCAqc3RlcCwgdTMyICpkZWxheSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJU3dDaG5sQ21kCVByZUNvbW1vbkNtZFtNQVhfUFJFQ01EX0NOVF07CkBAIC0xNDMzLDcgKzE0MzQsNyBAQAogICogcmV0dXJuOiAgICBub25lCiAgKiBub3RpY2U6ICAgIFdlIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJ0bDgxOTJfcGh5X0ZpbmlzaFN3Q2hubE5vdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQorc3RhdGljIHZvaWQgcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMglkZWxheSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9kcnZfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oCmluZGV4IGEwNzRmZTguLjMzNjJlNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnhtaXRUaHJlYWQ7CiAJcGlkX3QgcmVjdlRocmVhZDsKIAl1aW50KCpkdm9ial9pbml0KShzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIpOwotCXZvaWQgICgqZHZvYmpfZGVpbml0KShzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIpOworCXZvaWQgKCpkdm9ial9kZWluaXQpKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlcik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXY7CiAJaW50IGJ1cDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKaW5kZXggY2M2OGQ5Ny4uNTdmZWY3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKQEAgLTc4LDkgKzc4LDkgQEAKIAkJaWYgKCgoKHJhdGVbaV0pICYgMHg3ZikgPT0gMikgfHwgKCgocmF0ZVtpXSkgJiAweDdmKSA9PSA0KSB8fAogCQkgICAgKCgocmF0ZVtpXSkgJiAweDdmKSA9PSAxMSkgfHwgKCgocmF0ZVtpXSkgJiAweDdmKSA9PSAyMikpCiAJCQlyZXR1cm4gdHJ1ZTsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CisJCWkrKzsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQogCiB1aW50IHI4NzEyX2lzX2Nja3JhdGVzb25seV9pbmNsdWRlZCh1OCAqcmF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCmluZGV4IDM3ZmUzMzAuLjZiZDA4MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiB7CiAJcGFkYXB0ZXItPmNtZFRocmVhZCA9IGt0aHJlYWRfcnVuKHI4NzEyX2NtZF90aHJlYWQsIHBhZGFwdGVyLCAiJXMiLAogCQkJICAgICAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUpOwotCWlmIChJU19FUlIocGFkYXB0ZXItPmNtZFRocmVhZCkgPCAwKQorCWlmIChJU19FUlIocGFkYXB0ZXItPmNtZFRocmVhZCkpCiAJCXJldHVybiBfRkFJTDsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKaW5kZXggZjFjY2M3ZS4uNTY2MjM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaApAQCAtMTQ3LDcgKzE0Nyw4IEBACiAJcmV0dXJuIGlzX2xpc3RfZW1wdHkoJihwcXVldWUtPnF1ZXVlKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGVuZF9vZl9xdWV1ZV9zZWFyY2goc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QpCitzdGF0aWMgaW5saW5lIHUzMiBlbmRfb2ZfcXVldWVfc2VhcmNoKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0KQogewogCWlmIChoZWFkID09IHBsaXN0KQogCQlyZXR1cm4gdHJ1ZTsKQEAgLTE2NCw3ICsxNjUsNyBAQAogCQlkZWx0YSA9IDE7LyogMSBtcyAqLwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJaWYgKHNjaGVkdWxlX3RpbWVvdXQoZGVsdGEpICE9IDApCi0JCXJldHVybiA7CisJCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSB1OCAqX21hbGxvYyh1MzIgc3opCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jCmluZGV4IGVhOTY1MzcuLjA3MjNiMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jCkBAIC05MCw3ICs5MCw2IEBACiAJCXBza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHBhZGFwdGVyLT5wbmV0ZGV2LCBNQVhfUkVDVkJVRl9TWiArCiAJCSAgICAgICBSRUNWQlVGRl9BTElHTl9TWik7CiAJCWlmIChwc2tiKSB7Ci0JCQlwc2tiLT5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKIAkJCXRtcGFkZHIgPSAoYWRkcl90KXBza2ItPmRhdGE7CiAJCQlhbGlnbm1lbnQgPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaLTEpOwogCQkJc2tiX3Jlc2VydmUocHNrYiwgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7CkBAIC0xMDgzLDcgKzEwODIsNiBAQAogCQlhbGxvY19zeiArPSA2OwogCQlwa3RfY29weSA9IG5ldGRldl9hbGxvY19za2IocGFkYXB0ZXItPnBuZXRkZXYsIGFsbG9jX3N6KTsKIAkJaWYgKHBrdF9jb3B5KSB7Ci0JCQlwa3RfY29weS0+ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7CiAJCQlwcmVjdmZyYW1lLT51Lmhkci5wa3QgPSBwa3RfY29weTsKIAkJCXNrYl9yZXNlcnZlKHBrdF9jb3B5LCA0IC0gKChhZGRyX3QpKHBrdF9jb3B5LT5kYXRhKQogCQkJCSAgICAlIDQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCmluZGV4IGM3MWM3ZTUuLmE2NzE4NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYwpAQCAtNDY4LDEwICs0NjgsOSBAQAogCXBjbWQtPnJzcCA9IE5VTEw7CiAJcGNtZC0+cnNwc3ogPSAwOwogCS8qIG5vdGVzOiB0cmFuc2xhdGUgSUVMZW5ndGggJiBMZW5ndGggYWZ0ZXIgYXNzaWduIHRvIGNtZHN6OyAqLwotCXBkZXZfbmV0d29yay0+TGVuZ3RoID0gY3B1X3RvX2xlMzIocGNtZC0+Y21kc3opOwotCXBkZXZfbmV0d29yay0+SUVMZW5ndGggPSBjcHVfdG9fbGUzMihwZGV2X25ldHdvcmstPklFTGVuZ3RoKTsKLQlwZGV2X25ldHdvcmstPlNzaWQuU3NpZExlbmd0aCA9IGNwdV90b19sZTMyKAotCQkJCQlwZGV2X25ldHdvcmstPlNzaWQuU3NpZExlbmd0aCk7CisJcGRldl9uZXR3b3JrLT5MZW5ndGggPSBwY21kLT5jbWRzejsKKwlwZGV2X25ldHdvcmstPklFTGVuZ3RoID0gcGRldl9uZXR3b3JrLT5JRUxlbmd0aDsKKwlwZGV2X25ldHdvcmstPlNzaWQuU3NpZExlbmd0aCA9CXBkZXZfbmV0d29yay0+U3NpZC5Tc2lkTGVuZ3RoOwogCXI4NzEyX2VucXVldWVfY21kKHBjbWRwcml2LCBwY21kKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC05MTEsNyArOTEwLDcgQEAKIHsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi0JaWYgKChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpKQorCWlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpCiAJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOwogCXI4NzEyX2ZyZWVfY21kX29iaihwY21kKTsKIH0KQEAgLTkyOCw3ICs5MjcsNyBAQAogCQkJCQkgICAgICBwY21kLT5wYXJtYnVmOwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJihwbWxtZXByaXYtPmN1cl9uZXR3b3JrKTsKIAotCWlmICgocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSkKKwlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKQogCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKIAlfY2FuY2VsX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAmdGltZXJfY2FuY2VsbGVkKTsKICNpZmRlZiBfX0JJR19FTkRJQU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYwppbmRleCBhYWU1MTI1Li41ZmZjNDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jCkBAIC0xMjQ0LDE3ICsxMjQ0LDE4IEBACiAJICAgIChmcnR5cGUgPT0gV0lGSV9EQVRBX0NGUE9MTCkgfHwKIAkgICAgKGZydHlwZSA9PSBXSUZJX0RBVEFfQ0ZBQ0tQT0xMKSkgewogCQlxY19leGlzdHMgPSAxOwotCQlpZiAoaGRybGVuICE9ICBXTEFOX0hEUl9BM19RT1NfTEVOKQorCQlpZiAoaGRybGVuICE9IFdMQU5fSERSX0EzX1FPU19MRU4pCiAJCQloZHJsZW4gKz0gMjsKLQkJfSAgZWxzZSBpZiAoKGZyc3VidHlwZSA9PSAweDA4KSB8fAorCX0gZWxzZSBpZiAoKGZyc3VidHlwZSA9PSAweDA4KSB8fAogCQkgICAoZnJzdWJ0eXBlID09IDB4MDkpIHx8CiAJCSAgIChmcnN1YnR5cGUgPT0gMHgwYSkgfHwKIAkJICAgKGZyc3VidHlwZSA9PSAweDBiKSkgewotCQkJaWYgKGhkcmxlbiAhPSAgV0xBTl9IRFJfQTNfUU9TX0xFTikKLQkJCQloZHJsZW4gKz0gMjsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JfSBlbHNlCisJCWlmIChoZHJsZW4gIT0gV0xBTl9IRFJfQTNfUU9TX0xFTikKKwkJCWhkcmxlbiArPSAyOworCQlxY19leGlzdHMgPSAxOworCX0gZWxzZSB7CiAJCXFjX2V4aXN0cyA9IDA7CisJfQogCS8qIG5vdywgZGVjcnlwdCBwZnJhbWUgd2l0aCBoZHJsZW4gb2Zmc2V0IGFuZCBwbGVuIGxvbmcgKi8KIAlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsgLyogOCBpcyBmb3IgZXh0aXYgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYmFzZS5jCmluZGV4IDE4YzkzNmYuLmU1MDczZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYmFzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYmFzZS5jCkBAIC0zOSwxMCArMzksMTAgQEAKICNpbmNsdWRlICJwY2kuaCIKIAogLyoKLSAqTk9USUNFISEhOiBUaGlzIGZpbGUgd2lsbCBiZSB2ZXJ5IGJpZywgd2UgaHNvdWxkCi0gKmtlZXAgaXQgY2xlYXIgdW5kZXIgZm9sbHdpbmcgcm9sZXM6CisgKk5PVElDRSEhITogVGhpcyBmaWxlIHdpbGwgYmUgdmVyeSBiaWcsIHdlIHNob3VsZAorICprZWVwIGl0IGNsZWFyIHVuZGVyIGZvbGxvd2luZyByb2xlczoKICAqCi0gKlRoaXMgZmlsZSBpbmNsdWRlIGZvbGx3aW5nIHBhcnQsIHNvLCBpZiB5b3UgYWRkIG5ldworICpUaGlzIGZpbGUgaW5jbHVkZSBmb2xsb3dpbmcgcGFydCwgc28sIGlmIHlvdSBhZGQgbmV3CiAgKmZ1bmN0aW9ucyBpbnRvIHRoaXMgZmlsZSwgcGxlYXNlIGNoZWNrIHdoaWNoIHBhcnQgaXQKICAqc2hvdWxkIGluY2x1ZGVzLiBvciBjaGVjayBpZiB5b3Ugc2hvdWxkIGFkZCBuZXcgcGFydAogICpmb3IgdGhpcyBmaWxlOgpAQCAtNjQsNzMgKzY0LDczIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgcnRsX2NoYW5uZWx0YWJsZV8yZ1tdID0gewotCXsuY2VudGVyX2ZyZXEgPSAyNDEyLC5od192YWx1ZSA9IDEsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQxNywuaHdfdmFsdWUgPSAyLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0MjIsLmh3X3ZhbHVlID0gMyx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDI3LC5od192YWx1ZSA9IDQsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQzMiwuaHdfdmFsdWUgPSA1LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0MzcsLmh3X3ZhbHVlID0gNix9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDQyLC5od192YWx1ZSA9IDcsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ0NywuaHdfdmFsdWUgPSA4LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NTIsLmh3X3ZhbHVlID0gOSx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDU3LC5od192YWx1ZSA9IDEwLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NjIsLmh3X3ZhbHVlID0gMTEsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ2NywuaHdfdmFsdWUgPSAxMix9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDcyLC5od192YWx1ZSA9IDEzLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0ODQsLmh3X3ZhbHVlID0gMTQsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDE3LCAuaHdfdmFsdWUgPSAyLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MjIsIC5od192YWx1ZSA9IDMsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQyNywgLmh3X3ZhbHVlID0gNCx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDMyLCAuaHdfdmFsdWUgPSA1LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MzcsIC5od192YWx1ZSA9IDYsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ0MiwgLmh3X3ZhbHVlID0gNyx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDQ3LCAuaHdfdmFsdWUgPSA4LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NTIsIC5od192YWx1ZSA9IDksfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ1NywgLmh3X3ZhbHVlID0gMTAsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ2MiwgLmh3X3ZhbHVlID0gMTEsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ2NywgLmh3X3ZhbHVlID0gMTIsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ3MiwgLmh3X3ZhbHVlID0gMTMsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ4NCwgLmh3X3ZhbHVlID0gMTQsfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgcnRsX2NoYW5uZWx0YWJsZV81Z1tdID0gewotCXsuY2VudGVyX2ZyZXEgPSA1MTgwLC5od192YWx1ZSA9IDM2LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUyMDAsLmh3X3ZhbHVlID0gNDAsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTIyMCwuaHdfdmFsdWUgPSA0NCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1MjQwLC5od192YWx1ZSA9IDQ4LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUyNjAsLmh3X3ZhbHVlID0gNTIsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTI4MCwuaHdfdmFsdWUgPSA1Nix9LAotCXsuY2VudGVyX2ZyZXEgPSA1MzAwLC5od192YWx1ZSA9IDYwLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUzMjAsLmh3X3ZhbHVlID0gNjQsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTUwMCwuaHdfdmFsdWUgPSAxMDAsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTUyMCwuaHdfdmFsdWUgPSAxMDQsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTU0MCwuaHdfdmFsdWUgPSAxMDgsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTU2MCwuaHdfdmFsdWUgPSAxMTIsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTU4MCwuaHdfdmFsdWUgPSAxMTYsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTYwMCwuaHdfdmFsdWUgPSAxMjAsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTYyMCwuaHdfdmFsdWUgPSAxMjQsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTY0MCwuaHdfdmFsdWUgPSAxMjgsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTY2MCwuaHdfdmFsdWUgPSAxMzIsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTY4MCwuaHdfdmFsdWUgPSAxMzYsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTcwMCwuaHdfdmFsdWUgPSAxNDAsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTc0NSwuaHdfdmFsdWUgPSAxNDksfSwKLQl7LmNlbnRlcl9mcmVxID0gNTc2NSwuaHdfdmFsdWUgPSAxNTMsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTc4NSwuaHdfdmFsdWUgPSAxNTcsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTgwNSwuaHdfdmFsdWUgPSAxNjEsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTgyNSwuaHdfdmFsdWUgPSAxNjUsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTE4MCwgLmh3X3ZhbHVlID0gMzYsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTIwMCwgLmh3X3ZhbHVlID0gNDAsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTIyMCwgLmh3X3ZhbHVlID0gNDQsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTI0MCwgLmh3X3ZhbHVlID0gNDgsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTI2MCwgLmh3X3ZhbHVlID0gNTIsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTI4MCwgLmh3X3ZhbHVlID0gNTYsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTMwMCwgLmh3X3ZhbHVlID0gNjAsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTMyMCwgLmh3X3ZhbHVlID0gNjQsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTUwMCwgLmh3X3ZhbHVlID0gMTAwLH0sCisJey5jZW50ZXJfZnJlcSA9IDU1MjAsIC5od192YWx1ZSA9IDEwNCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTQwLCAuaHdfdmFsdWUgPSAxMDgsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTU2MCwgLmh3X3ZhbHVlID0gMTEyLH0sCisJey5jZW50ZXJfZnJlcSA9IDU1ODAsIC5od192YWx1ZSA9IDExNix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjAwLCAuaHdfdmFsdWUgPSAxMjAsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTYyMCwgLmh3X3ZhbHVlID0gMTI0LH0sCisJey5jZW50ZXJfZnJlcSA9IDU2NDAsIC5od192YWx1ZSA9IDEyOCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjYwLCAuaHdfdmFsdWUgPSAxMzIsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTY4MCwgLmh3X3ZhbHVlID0gMTM2LH0sCisJey5jZW50ZXJfZnJlcSA9IDU3MDAsIC5od192YWx1ZSA9IDE0MCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NzQ1LCAuaHdfdmFsdWUgPSAxNDksfSwKKwl7LmNlbnRlcl9mcmVxID0gNTc2NSwgLmh3X3ZhbHVlID0gMTUzLH0sCisJey5jZW50ZXJfZnJlcSA9IDU3ODUsIC5od192YWx1ZSA9IDE1Nyx9LAorCXsuY2VudGVyX2ZyZXEgPSA1ODA1LCAuaHdfdmFsdWUgPSAxNjEsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTgyNSwgLmh3X3ZhbHVlID0gMTY1LH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHJ0bF9yYXRldGFibGVfMmdbXSA9IHsKLQl7LmJpdHJhdGUgPSAxMCwuaHdfdmFsdWUgPSAweDAwLH0sCi0Jey5iaXRyYXRlID0gMjAsLmh3X3ZhbHVlID0gMHgwMSx9LAotCXsuYml0cmF0ZSA9IDU1LC5od192YWx1ZSA9IDB4MDIsfSwKLQl7LmJpdHJhdGUgPSAxMTAsLmh3X3ZhbHVlID0gMHgwMyx9LAotCXsuYml0cmF0ZSA9IDYwLC5od192YWx1ZSA9IDB4MDQsfSwKLQl7LmJpdHJhdGUgPSA5MCwuaHdfdmFsdWUgPSAweDA1LH0sCi0Jey5iaXRyYXRlID0gMTIwLC5od192YWx1ZSA9IDB4MDYsfSwKLQl7LmJpdHJhdGUgPSAxODAsLmh3X3ZhbHVlID0gMHgwNyx9LAotCXsuYml0cmF0ZSA9IDI0MCwuaHdfdmFsdWUgPSAweDA4LH0sCi0Jey5iaXRyYXRlID0gMzYwLC5od192YWx1ZSA9IDB4MDksfSwKLQl7LmJpdHJhdGUgPSA0ODAsLmh3X3ZhbHVlID0gMHgwYSx9LAotCXsuYml0cmF0ZSA9IDU0MCwuaHdfdmFsdWUgPSAweDBiLH0sCisJey5iaXRyYXRlID0gMTAsIC5od192YWx1ZSA9IDB4MDAsfSwKKwl7LmJpdHJhdGUgPSAyMCwgLmh3X3ZhbHVlID0gMHgwMSx9LAorCXsuYml0cmF0ZSA9IDU1LCAuaHdfdmFsdWUgPSAweDAyLH0sCisJey5iaXRyYXRlID0gMTEwLCAuaHdfdmFsdWUgPSAweDAzLH0sCisJey5iaXRyYXRlID0gNjAsIC5od192YWx1ZSA9IDB4MDQsfSwKKwl7LmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMHgwNSx9LAorCXsuYml0cmF0ZSA9IDEyMCwgLmh3X3ZhbHVlID0gMHgwNix9LAorCXsuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMHgwNyx9LAorCXsuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gMHgwOCx9LAorCXsuYml0cmF0ZSA9IDM2MCwgLmh3X3ZhbHVlID0gMHgwOSx9LAorCXsuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gMHgwYSx9LAorCXsuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMHgwYix9LAogfTsKIAogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBydGxfcmF0ZXRhYmxlXzVnW10gPSB7Ci0Jey5iaXRyYXRlID0gNjAsLmh3X3ZhbHVlID0gMHgwNCx9LAotCXsuYml0cmF0ZSA9IDkwLC5od192YWx1ZSA9IDB4MDUsfSwKLQl7LmJpdHJhdGUgPSAxMjAsLmh3X3ZhbHVlID0gMHgwNix9LAotCXsuYml0cmF0ZSA9IDE4MCwuaHdfdmFsdWUgPSAweDA3LH0sCi0Jey5iaXRyYXRlID0gMjQwLC5od192YWx1ZSA9IDB4MDgsfSwKLQl7LmJpdHJhdGUgPSAzNjAsLmh3X3ZhbHVlID0gMHgwOSx9LAotCXsuYml0cmF0ZSA9IDQ4MCwuaHdfdmFsdWUgPSAweDBhLH0sCi0Jey5iaXRyYXRlID0gNTQwLC5od192YWx1ZSA9IDB4MGIsfSwKKwl7LmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMHgwNCx9LAorCXsuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSAweDA1LH0sCisJey5iaXRyYXRlID0gMTIwLCAuaHdfdmFsdWUgPSAweDA2LH0sCisJey5iaXRyYXRlID0gMTgwLCAuaHdfdmFsdWUgPSAweDA3LH0sCisJey5iaXRyYXRlID0gMjQwLCAuaHdfdmFsdWUgPSAweDA4LH0sCisJey5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSAweDA5LH0sCisJey5iaXRyYXRlID0gNDgwLCAuaHdfdmFsdWUgPSAweDBhLH0sCisJey5iaXRyYXRlID0gNTQwLCAuaHdfdmFsdWUgPSAweDBiLH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBydGxfYmFuZF8yZ2h6ID0gewpAQCAtMzIwLDcgKzMyMCw3IEBACiAJLyogPDU+IHNldCBodyBjYXBzICovCiAJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAogCSAgICBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw0LDApKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKIAkgICAgSUVFRTgwMjExX0hXX0JFQUNPTl9GSUxURVIgfAogI2VuZGlmCiAJICAgIElFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTiB8CkBAIC0zMzIsMTEgKzMzMiwxMSBAQAogCS8qIHN3bHBzIG9yIGh3bHBzIGhhcyBiZWVuIHNldCBpbiBkaWZmIGNoaXAgaW4gaW5pdF9zd192YXJzICovCiAJaWYgKHJ0bHByaXYtPnBzYy5iX3N3Y3RybF9scHMpCiAJCWh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAotCSAgICAJCUlFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSyB8Ci0JICAgIAkJLyogSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFMgfCAqLworCQkJSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLIHwKKwkJCS8qIElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTIHwgKi8KIAkJCTA7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzcpKQogCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KIAkgICAgQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CiAJICAgIEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CkBAIC0zNTQsMTEgKzM1NCwxMSBAQAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2VuZGlmCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMzkpKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAzOSkpCiAJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0lCU1NfUlNOOwogI2VuZGlmCiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMywwKSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDMsIDApKQogCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw7CiAjZW5kaWYKIApAQCAtNDAyLDcgKzQwMiw3IEBACiAJLyogPDI+IHdvcmsgcXVldWUgKi8KIAlydGxwcml2LT53b3Jrcy5odyA9IGh3OwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM3KSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM3KSkKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCiAJcnRscHJpdi0+d29ya3MucnRsX3dxID0gYWxsb2Nfd29ya3F1ZXVlKHJ0bHByaXYtPmNmZy0+bmFtZSwgMCwgMCk7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCkBAIC02NjIsMzAgKzY2MiwyNyBAQAogCiAJaWYgKHJ0bHByaXYtPmRtLmJfdXNlcmFtYXNrKSB7CiAJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gcmF0cl9pbmRleDsKLQkJLyogVE9ETyB3ZSB3aWxsIGRpZmZlcmVudGlhdGUgYWRob2MgYW5kIHN0YXRpb24gZnV0cnVlICAqLworCQkvKiBUT0RPIHdlIHdpbGwgZGlmZmVyZW50aWF0ZSBhZGhvYyBhbmQgc3RhdGlvbiBmdXR1cmUgICovCiAJCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CiAJCQltYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB7CiAJCQl0Y2JfZGVzYy0+bWFjX2lkID0gMDsKLQotCQkJaWYgKG1hYy0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKSB7CisJCQlpZiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpCiAJCQkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19OR0I7Ci0JCQl9IGVsc2UgaWYgKG1hYy0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpIHsKKwkJCWVsc2UgaWYgKG1hYy0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpCiAJCQkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19ORzsKLQkJCX0gZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9HKSB7CisJCQllbHNlIGlmIChtYWMtPm1vZGUgJiBXSVJFTEVTU19NT0RFX0cpCiAJCQkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19HQjsKLQkJCX0gZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9CKSB7CisJCQllbHNlIGlmIChtYWMtPm1vZGUgJiBXSVJFTEVTU19NT0RFX0IpCiAJCQkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19COwotCQkJfSBlbHNlIGlmIChtYWMtPm1vZGUgJiBXSVJFTEVTU19NT0RFX0EpIHsKKwkJCWVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfQSkKIAkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0c7Ci0JCQl9CiAJCX0gZWxzZSBpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKIAkJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCQlpZiAoTlVMTCAhPSBzdGEpIHsKLQkJCQlpZiAoc3RhLT5haWQgPiAwKSB7CisJCQkJaWYgKHN0YS0+YWlkID4gMCkKIAkJCQkJdGNiX2Rlc2MtPm1hY19pZCA9IHN0YS0+YWlkICsgMTsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UKIAkJCQkJdGNiX2Rlc2MtPm1hY19pZCA9IDE7Ci0JCQkJfQogCQkJfSBlbHNlIHsKIAkJCQl0Y2JfZGVzYy0+bWFjX2lkID0gMDsKIAkJCX0KQEAgLTcxMSw3ICs3MDgsNyBAQAogCQkJcmV0dXJuOwogCX0gZWxzZSBpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewogCQlpZiAoIW1hYy0+YndfNDAgfHwgIShzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpKQotCQlyZXR1cm47CisJCQlyZXR1cm47CiAJfQogCWlmICh0Y2JfZGVzYy0+Yl9tdWx0aWNhc3QgfHwgdGNiX2Rlc2MtPmJfYnJvYWRjYXN0KQogCQlyZXR1cm47CkBAIC03MzAsNyArNzI3LDcgQEAKIAlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOwogCXU4IGh3X3JhdGU7CiAKLQlpZiAoKGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMlQyUikgJiYgKHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdIT0wKSkKKwlpZiAoKGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMlQyUikgJiYgKHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdICE9IDApKQogCQlod19yYXRlID0gcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9SQ19IVF9SQVRFTUNTMTVdOwogCWVsc2UKIAkJaHdfcmF0ZSA9IHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfUkNfSFRfUkFURU1DUzddOwpAQCAtNzcyLDE2ICs3NjksMTYgQEAKIAkJCXRjYl9kZXNjLT5kaXNhYmxlX3JhdGVmYWxsYmFjayA9IDE7CiAJCX0gZWxzZSB7CiAJCQkvKgotCQkJICpiZWNhdXNlIGh3IHdpbGwgbmVydmVyIHVzZSBod19yYXRlCisJCQkgKmJlY2F1c2UgaHcgd2lsbCBuZXZlciB1c2UgaHdfcmF0ZQogCQkJICp3aGVuIHRjYl9kZXNjLT51c2VfZHJpdmVyX3JhdGUgPSBmYWxzZQogCQkJICpzbyB3ZSBuZXZlciBzZXQgaGlnaGVzdCBOIHJhdGUgaGVyZSwKLQkJCSAqYW5kIE4gcmF0ZSB3aWxsIGFsbCBiZSBjb250cm9sZWQgYnkgRlcKKwkJCSAqYW5kIE4gcmF0ZSB3aWxsIGFsbCBiZSBjb250cm9sbGVkIGJ5IEZXCiAJCQkgKndoZW4gdGNiX2Rlc2MtPnVzZV9kcml2ZXJfcmF0ZSA9IGZhbHNlCiAJCQkgKi8KIAkJCWlmIChzdGEgJiYgKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkpIHsKIAkJCQl0Y2JfZGVzYy0+aHdfcmF0ZSA9IF9ydGxfZ2V0X2hpZ2hlc3Rfbl9yYXRlKGh3LCBzdGEpOwogCQkJfSBlbHNlIHsKLQkJCQlpZihydGxtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKSB7CisJCQkJaWYgKHJ0bG1hYy0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKIAkJCQkJdGNiX2Rlc2MtPmh3X3JhdGUgPQogCQkJCQkgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9SQ19DQ0tfUkFURTExTV07CiAJCQkJfSBlbHNlIHsKQEAgLTgwOSw3ICs4MDYsNyBAQAogCQl0Y2JfZGVzYy0+Yl9wYWNrZXRfYncgPSBmYWxzZTsKIAl9CiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX2dldF90Y2JfZGVzYyk7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9nZXRfdGNiX2Rlc2MpOyAqLwogCiBib29sIHJ0bF90eF9tZ210X3Byb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC04NjIsOCArODU5LDggQEAKIAkJCVJUX1RSQUNFKChDT01QX1NFTkQgfCBDT01QX1JFQ1YpLCBEQkdfRE1FU0csCiAJCQkJICgiJXMgQUNUX0FEREJBUkVRIEZyb20gOiVwTVxuIiwKIAkJCQkgIGlzX3R4ID8gIlR4IiA6ICJSeCIsIGhkci0+YWRkcjIpKTsKLQkJCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9JTklULCBEQkdfRE1FU0csICgicmVxIFxuIiksCi0JCSAgICAgIAlza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9JTklULCBEQkdfRE1FU0csICgicmVxXG4iKSwKKwkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQkJaWYgKCFpc190eCkgewogCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBOVUxMOwogCQkJCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeSA9IE5VTEw7CkBAIC04OTcsNyArODk0LDcgQEAKIAkJCQkJCQkJICAgIGhkci0+YWRkcjMsCiAJCQkJCQkJCSAgICB0aWQpOwogCQkJCQlpZiAoc2tiX2RlbGJhKSB7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTAsIDApKQogCQkJCQkJcnhfc3RhdHVzLmZyZXEgPSBody0+Y29uZi5jaGFuZGVmLmNoYW4tPmNlbnRlcl9mcmVxOwogCQkJCQkJcnhfc3RhdHVzLmJhbmQgPSBody0+Y29uZi5jaGFuZGVmLmNoYW4tPmJhbmQ7CiAjZWxzZQpAQCAtMTE4NCw3ICsxMTgxLDcgQEAKIAlpZiAoZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIzLCBydGxwcml2LT5tYWM4MDIxMS5ic3NpZCkpCiAJCXJldHVybjsKIAotCXJ0bHByaXYtPmxpbmtfaW5mby5iY25fcnhfaW5wZXJpb2QgKys7CisJcnRscHJpdi0+bGlua19pbmZvLmJjbl9yeF9pbnBlcmlvZCsrOwogfQogCiB2b2lkIHJ0bF93YXRjaGRvZ193cV9jYWxsYmFjayh2b2lkICpkYXRhKQpAQCAtMTM2Myw3ICsxMzYwLDcgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9wcml2ICpidWRkeV9wcml2ID0gcnRscHJpdi0+YnVkZHlfcHJpdjsKIAotCWlmKGJ1ZGR5X3ByaXYgPT0gTlVMTCkKKwlpZiAoYnVkZHlfcHJpdiA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlydGxwcml2LT5jZmctPm9wcy0+ZHVhbG1hY19lYXN5X2NvbmN1cnJlbnQoaHcpOwpAQCAtMTQ3OCwxMyArMTQ3NSwxMyBAQAogCQkvKiBydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX3JhdGVfdGJsKGh3LCBzdGEsIDApOyAqLwogCiAJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gMDsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMCwgMCkpCiAJCWluZm8tPmJhbmQgPSBody0+Y29uZi5jaGFuZGVmLmNoYW4tPmJhbmQ7CiAjZWxzZQogCQlpbmZvLT5iYW5kID0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKICNlbmRpZgogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDcsIDApKQogCQlpbmZvLT5jb250cm9sLnN0YSA9IHN0YTsKIAkJcnRscHJpdi0+aW50Zl9vcHMtPmFkYXB0ZXJfdHgoaHcsIHNrYiwgJnRjYl9kZXNjKTsKICNlbHNlCkBAIC0xNDk5LDcgKzE0OTYsNyBAQAogZXJyX2ZyZWU6CiAJcmV0dXJuIDA7CiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX3NlbmRfc21wc19hY3Rpb24pOworLyogRVhQT1JUX1NZTUJPTChydGxfc2VuZF9zbXBzX2FjdGlvbik7ICovCiAKIC8qIGJlY2F1c2UgbWFjODAyMTEgaGF2ZSBpc3N1ZXMgd2hlbiBjYW4gcmVjZWl2ZSBkZWwgYmEKICAqIHNvIGhlcmUgd2UganVzdCBtYWtlIGEgZmFrZSBkZWxfYmEgaWYgd2UgcmVjZWl2ZSBhIGJhX3JlcQpAQCAtMTUyOCw4ICsxNTI1LDggQEAKIAkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CiAJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfQkFDSzsKIAlhY3Rpb25fZnJhbWUtPnUuYWN0aW9uLnUuZGVsYmEuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9ERUxCQTsKLQlwYXJhbXMgPSAodTE2KSgxIDw8IDExKTsgCS8qIGJpdCAxMSBpbml0aWF0b3IgKi8KLQlwYXJhbXMgfD0gKHUxNikodGlkIDw8IDEyKTsgCQkvKiBiaXQgMTU6MTIgVElEIG51bWJlciAqLworCXBhcmFtcyA9ICh1MTYpKDEgPDwgMTEpOwkvKiBiaXQgMTEgaW5pdGlhdG9yICovCisJcGFyYW1zIHw9ICh1MTYpKHRpZCA8PCAxMik7CS8qIGJpdCAxNToxMiBUSUQgbnVtYmVyICovCiAKIAlhY3Rpb25fZnJhbWUtPnUuYWN0aW9uLnUuZGVsYmEucGFyYW1zID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKIAlhY3Rpb25fZnJhbWUtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUgPQpAQCAtMTY1Miw5ICsxNjQ5LDggQEAKIAlpZiAoZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIzLCBydGxwcml2LT5tYWM4MDIxMS5ic3NpZCkpCiAJCXJldHVybjsKIAotCWlmIChydGxfZmluZF8yMjFfaWUoaHcsIGRhdGEsIGxlbikpIHsKKwlpZiAocnRsX2ZpbmRfMjIxX2llKGh3LCBkYXRhLCBsZW4pKQogCQl2ZW5kb3IgPSBtYWMtPnZlbmRvcjsKLQl9CiAKIAlpZiAoKG1lbWNtcChtYWMtPmJzc2lkLCBhcDVfMSwgMykgPT0gMCkgfHwKIAkJKG1lbWNtcChtYWMtPmJzc2lkLCBhcDVfMiwgMykgPT0gMCkgfHwKQEAgLTE2NzEsNyArMTY2Nyw3IEBACiAJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzIsIDMpID09IDApIHx8CiAJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzMsIDMpID09IDApIHx8CiAJCXZlbmRvciA9PSBQRUVSX1JBTCkgewotCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwgKCI9PnJhbCBmaW5kblxuIikpOworCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwgKCI9PnJhbCBmaW5kXG4iKSk7CiAJCXZlbmRvciA9IFBFRVJfUkFMOwogCX0gZWxzZSBpZiAobWVtY21wKG1hYy0+YnNzaWQsIGFwNl8xLCAzKSA9PSAwIHx8CiAJCXZlbmRvciA9PSBQRUVSX0NJU0NPKSB7CkBAIC0xNzE1LDcgKzE3MTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXQ7CiAKLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwogCX0gZWxzZSB7CkBAIC0xODQ1LDggKzE4NDEsNyBAQAogaW50IHJ0bF9jb3JlX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaWYgKHJ0bF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bDogVW5hYmxlIHRvIHJlZ2lzdGVyIHJ0bF9yYywiCi0JCQkgICJ1c2UgZGVmYXVsdCBSQyAhIVxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJydGw6IFVuYWJsZSB0byByZWdpc3RlciBydGxfcmMsIHVzZSBkZWZhdWx0IFJDICEhXG4iKTsKIAogCS8qIGFkZCBwcm9jIGZvciBkZWJ1ZyAqLwogCXJ0bF9wcm9jX2FkZF90b3BkaXIoKTsKQEAgLTE4NjEsNyArMTg1Niw3IEBACiB2b2lkIHJ0bF9jb3JlX21vZHVsZV9leGl0KHZvaWQpCiB7CiAJLypSQyovCi0gICAJcnRsX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7CisJcnRsX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7CiAKIAkvKiBhZGQgcHJvYyBmb3IgZGVidWcgKi8KIAlydGxfcHJvY19yZW1vdmVfdG9wZGlyKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9IYWxCdGM4ODEyYTFBbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5jCmluZGV4IGIzMGYxN2EuLjVhNTRiYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5jCkBAIC0xNjUzLDcgKzE2NTMsNyBAQAogCX0KIAllbHNlCiAJewotCQkvL2FjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCisJCS8vYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgogCQlyZXRyeV9jb3VudCA9IGNvZXhfc3RhLT5idF9yZXRyeV9jbnQ7CiAJCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeV9jb3VudCA9ICVkXG4iLCByZXRyeV9jb3VudCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFidGM4NzIzYTFhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhYnRjODcyM2ExYW50LmMKaW5kZXggZTYxOTkyMy4uOGU0MjkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFidGM4NzIzYTFhbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5jCkBAIC02MjksNyArNjI5LDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJLy9hY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgorCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKIAkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCkpOwogCQlyZXN1bHQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUxYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuYwppbmRleCA5NzNkMGVhLi4xYjA0NTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuYwpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJLy9hY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgorCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKIAkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OwogCQlidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUyYW50LmMKaW5kZXggNDRlYzc4NS4uMTE1OTA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUyYW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUyYW50LmMKQEAgLTE4MDMsNyArMTgwMyw3IEBACiAJCXJlc3VsdCA9IDA7CiAJCXdhaXRfY250ID0gMDsKIAl9IGVsc2UgewotCQkvKiBhY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiAqLworCQkvKiBhY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCiAJCXJldHJ5X2NudCA9IGNvZXhfc3RhLT5idF9yZXRyeV9jbnQ7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCiAJCQkgICJbQlRDb2V4XSwgcmV0cnlfY250ID0gJWRcbiIsIHJldHJ5X2NudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYTJhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNhMmFudC5jCmluZGV4IDE4MGQ2ZjEuLjNmNWM0ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNhMmFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNhMmFudC5jCkBAIC0xNjg3LDcgKzE2ODcsNyBAQAogCX0KIAllbHNlCiAJewotCQkvL2FjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCisJCS8vYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgogCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCkpOwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCB1cD0lZCwgZG49JWQsIG09JWQsIG49JWQsIFdhaXRDb3VudD0lZFxuIiwgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjFhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5jCmluZGV4IDM0MTRiYTcuLjk2Nzc5NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5jCkBAIC0xOTUwLDcgKzE5NTAsNyBAQAogCQlyZXN1bHQgPSAwOwogCQl3YWl0X2NvdW50ID0gMDsKIAl9IGVsc2UgewotCQkvKmFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCisJCS8qYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiAqLwogCQlyZXRyeV9jb3VudCA9IGNvZXhfc3RhLT5idF9yZXRyeV9jbnQ7CiAJCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OwogCQlyZXN1bHQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IyYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuYwppbmRleCA4M2IxYjQyLi5kMzM3YmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuYwpAQCAtMTgzMCw3ICsxODMwLDcgQEAKIAkJcmVzdWx0ID0gMDsKIAkJd2FpdF9jb3VudCA9IDA7CiAJfSBlbHNlIHsKLQkJLyphY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiovCisJCS8qYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiovCiAJCXJldHJ5Q291bnQgPSBjb2V4X3N0YS0+YnRfcmV0cnlfY250OwogCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAogCQkJICAiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGNvdXRzcmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5jCmluZGV4IDlkOWZhNGQuLmM0ZTgzNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5jCkBAIC03MzIsMTcgKzczMiw3IEBACiAJZWxzZQogCQlidGNvZXhpc3QtPmJpbmRlZCA9IHRydWU7CiAKLSNpZiAoIGRlZmluZWQoQ09ORklHX1BDSV9IQ0kpKQotCWJ0Y29leGlzdC0+Y2hpcF9pbnRlcmZhY2UgPSBCVENfSU5URl9QQ0k7Ci0jZWxpZiAoIGRlZmluZWQoQ09ORklHX1VTQl9IQ0kpKQotCWJ0Y29leGlzdC0+Y2hpcF9pbnRlcmZhY2UgPSBCVENfSU5URl9VU0I7Ci0jZWxpZiAoIGRlZmluZWQoQ09ORklHX1NESU9fSENJKSkKLQlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfU0RJTzsKLSNlbGlmICggZGVmaW5lZChDT05GSUdfR1NQSV9IQ0kpKQotCWJ0Y29leGlzdC0+Y2hpcF9pbnRlcmZhY2UgPSBCVENfSU5URl9HU1BJOwotI2Vsc2UKIAlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfVU5LTk9XTjsKLSNlbmRpZgogCiAJaWYgKE5VTEwgPT0gYnRjb2V4aXN0LT5hZGFwdGVyKQogCQlidGNvZXhpc3QtPmFkYXB0ZXIgPSBhZGFwdGVyOwpAQCAtMTA4Nyw3ICsxMDc3LDcgQEAKIAlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2RiZ19jdHJsKys7CiB9CiAKLXZvaWQgZXhoYWxidGNfc3RhY2tfdXBkYXRlX3Byb2ZpbGVfaW5mbygpCit2b2lkIGV4aGFsYnRjX3N0YWNrX3VwZGF0ZV9wcm9maWxlX2luZm8odm9pZCkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYwppbmRleCA0MGRlNjA4Li5mZjMxMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYwpAQCAtMzczLDcgKzM3Myw3IEBACiAJCQkvKiBzbGVlcCBoZXJlIGlzIG11c3QsIG9yIHdlIG1heSByZWN2IHRoZSBiZWFjb24gYW5kCiAJCQkgKiBjYXVzZSBtYWM4MDIxMSBpbnRvIHdyb25nIHBzIHN0YXRlLCB0aGlzIHdpbGwgY2F1c2UKIAkJCSAqIHBvd2VyIHNhdmUgbnVsbGZ1bmMgc2VuZCBmYWlsLCBhbmQgZnVydGhlciBjYXVzZQotCQkJICogcGt0IGxvc3MsIFNvIHNsZWVwIG11c3QgcXVpY2tseSBidXQgbm90IGltbWVkaWF0bHkKKwkJCSAqIHBrdCBsb3NzLCBTbyBzbGVlcCBtdXN0IHF1aWNrbHkgYnV0IG5vdCBpbW1lZGlhdGVseQogCQkJICogYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgbnVsbGZ1bmMgc2VuZCBieSBtYWM4MDIxMQogCQkJICogZmFpbCwgYW5kIGNhdXNlIHBrdCBsb3NzLCB3ZSBoYXZlIHRlc3RlZCB0aGF0IDVtQQogCQkJICogaXMgd29ya2VkIHZlcnkgd2VsbCAqLwpAQCAtMTIwMCw4ICsxMjAwLDggQEAKIAkJa2V5X3R5cGUgPSBBRVNDTUFDX0VOQ1JZUFRJT047CiAJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csICgiYWxnOkNNQUNcbiIpKTsKIAkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKLQkJCQkoIkhXIGRvbid0IHN1cHBvcnQgQ01BQyBlbmNyeXBpdG9uLCAiCi0JCQkJInVzZSBzb2Z0d2FyZSBDTUFDIGVuY3J5cGl0b25cbiIpKTsKKwkJCQkoIkhXIGRvbid0IHN1cHBvcnQgQ01BQyBlbmNyeXB0aW9uLCAiCisJCQkJInVzZSBzb2Z0d2FyZSBDTUFDIGVuY3J5cHRpb25cbiIpKTsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0X3VubG9jazsKIAlkZWZhdWx0OgpAQCAtMTIzNSw4ICsxMjM1LDggQEAKIAkJa2V5X3R5cGUgPSBBRVNDTUFDX0VOQ1JZUFRJT047CiAJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csICgiYWxnOkNNQUNcbiIpKTsKIAkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKLQkJCSAoIkhXIGRvbid0IHN1cHBvcnQgQ01BQyBlbmNyeXBpdG9uLCAiCi0JCQkgICJ1c2Ugc29mdHdhcmUgQ01BQyBlbmNyeXBpdG9uXG4iKSk7CisJCQkgKCJIVyBkb24ndCBzdXBwb3J0IENNQUMgZW5jcnlwdGlvbiwgIgorCQkJICAidXNlIHNvZnR3YXJlIENNQUMgZW5jcnlwdGlvblxuIikpOwogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXRfdW5sb2NrOwogCWRlZmF1bHQ6CkBAIC0xNDExLDcgKzE0MTEsNyBAQAogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBtYWM4MDIxMSB0byBmbHVzaCB0eCBidWZmZXIKLSAqIGJlZm9yZSBzd2l0Y2ggY2hhbm5sZSBvciBwb3dlciBzYXZlLCBvciB0eCBidWZmZXIgcGFja2V0CisgKiBiZWZvcmUgc3dpdGNoIGNoYW5uZWwgb3IgcG93ZXIgc2F2ZSwgb3IgdHggYnVmZmVyIHBhY2tldAogICogbWF5YmUgc2VuZCBhZnRlciBvZmZjaGFubmVsIG9yIHJmIHNsZWVwLCB0aGlzIG1heSBjYXVzZQogICogZGlzLWFzc29jaWF0aW9uIGJ5IEFQICovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuaAppbmRleCA0YjI0N2RiLi5mMGM3NGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuaApAQCAtMiwyMCArMiwyMCBAQAogICoKICAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRtaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKICAqCi0gKiBUbWUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQogICogZmlsZSBjYWxsZWQgTElDRU5TRS4KICAqCiAgKiBDb250YWN0IEluZm9ybWF0aW9uOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5jCmluZGV4IGNiMDUxMjIuLjhhNmM3OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmMKQEAgLTIsMjAgKzIsMjAgQEAKICAqCiAgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0bWlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCiAgKgotICogVG1lIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKQEAgLTk4NSw0ICs5ODUsNCBAQAogewogCWlmIChwcm9jX3RvcGRpcikKIAkJcmVtb3ZlX3Byb2NfZW50cnkoInJ0bHdpZmkiLCBpbml0X25ldC5wcm9jX25ldCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5oCmluZGV4IDVlYjYyNTEuLjZjMGE1NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmgKQEAgLTIsMjAgKzIsMjAgQEAKICAqCiAgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRtaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0bWlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCiAgKgotICogVG1lIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKQEAgLTQ0LDcgKzQ0LDcgQEAKICNkZWZpbmUgREJHX0VNRVJHCQkJMAogCiAvKgotICpBYm5vcm1hbCwgcmFyZSwgb3IgdW5leHBldGVkIGNhc2VzLgorICpBYm5vcm1hbCwgcmFyZSwgb3IgdW5leHBlY3RlZCBjYXNlcy4KICAqRm9yIGV4YW1wbGUsIFBhY2tldC9JTyBDdGwgY2FuY2VsZWQsCiAgKmRldmljZSBzdXByaXNlbHkgdW5yZW1vdmVkIGFuZCBzbyBvbi4KICAqLwpAQCAtNTQsNyArNTQsNyBAQAogICpOb3JtYWwgY2FzZSBkcml2ZXIgZGV2ZWxvcGVyIHNob3VsZAogICpvcGVuLCB3ZSBjYW4gc2VlIGxpbmsgc3RhdHVzIGxpa2UKICAqYXNzb2MvQWRkQkEvREhDUC9hZGFwdGVyIHN0YXJ0IGFuZAotICpzbyBvbiBiYXNpYyBhbmQgdXNlZnVsIGluZnJvbWF0aW9ucy4KKyAqc28gb24gYmFzaWMgYW5kIHVzZWZ1bCBpbmZvcm1hdGlvbnMuCiAgKi8KICNkZWZpbmUgREJHX0RNRVNHCQkJMwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2VmdXNlLmMKaW5kZXggNzRjMTllYy4uMjUwYWFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZWZ1c2UuYwpAQCAtMiwyMCArMiwyMCBAQAogICoKICAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRtaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKICAqCi0gKiBUbWUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQogICogZmlsZSBjYWxsZWQgTElDRU5TRS4KICAqCiAgKiBDb250YWN0IEluZm9ybWF0aW9uOgpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCXJldHVybiAweEZGOwogCiB9Ci0vL0VYUE9SVF9TWU1CT0woZWZ1c2VfcmVhZF8xYnl0ZSk7CisvKiBFWFBPUlRfU1lNQk9MKGVmdXNlX3JlYWRfMWJ5dGUpOyAqLwogCiB2b2lkIGVmdXNlX3dyaXRlXzFieXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgYWRkcmVzcywgdTggdmFsdWUpCiB7CkBAIC01MTcsNyArNTE3LDcgQEAKIAkJCXJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9IV1NFVF9NQVhfU0laRV0pOwogCiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX2VmdXNlX3NoYWRvd19tYXBfdXBkYXRlKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX2VmdXNlX3NoYWRvd19tYXBfdXBkYXRlKTsgKi8KIAogdm9pZCBlZnVzZV9mb3JjZV93cml0ZV92ZW5kb3JfSWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CkBAIC02MjgsNyArNjI4LDcgQEAKIAl9CiAJcmV0dXJuIGJyZXN1bHQ7CiB9Ci0vL0VYUE9SVF9TWU1CT0woZWZ1c2Vfb25lX2J5dGVfcmVhZCk7CisvKiBFWFBPUlRfU1lNQk9MKGVmdXNlX29uZV9ieXRlX3JlYWQpOyAqLwogCiBzdGF0aWMgaW50IGVmdXNlX29uZV9ieXRlX3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgYWRkciwgdTggZGF0YSkKIHsKQEAgLTExMjAsMTYgKzExMjAsMTYgQEAKIAkJewogCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0FDQ0VTU10sIDB4NjkpOwogCi0JCQkvLyAxLjJWIFBvd2VyOiBGcm9tIFZERE9OIHdpdGggUG93ZXIgQ3V0KDB4MDAwMGhbMTVdKSwgZGVmdWFsdCB2YWxpZAorCQkJLyogMS4yViBQb3dlcjogRnJvbSBWRERPTiB3aXRoIFBvd2VyIEN1dCgweDAwMDBoWzE1XSksIGRlZmF1bHQgdmFsaWQgKi8KIAkJCXRtcFYxNiA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwKIAkJCQkJICAgICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfSVNPX0NUUkxdKTsKIAogCQkJcHJpbnRrKCJTWVNfSVNPX0NUUkw9JTA0eC5cbiIsdG1wVjE2KTsKIAkJCWlmKCAhICh0bXBWMTYgJiBQV0NfRVYxMlYgKSApewogCQkJCXRtcFYxNiB8PSBQV0NfRVYxMlYgOwotCQkJCSAvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsUkVHX1NZU19JU09fQ1RSTCx0bXBWMTYpOworCQkJCSAvKiBQbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLFJFR19TWVNfSVNPX0NUUkwsdG1wVjE2KTsgKi8KIAkJCX0KLQkJCS8vIFJlc2V0OiAweDAwMDBoWzI4XSwgZGVmYXVsdCB2YWxpZAorCQkJLyogUmVzZXQ6IDB4MDAwMGhbMjhdLCBkZWZhdWx0IHZhbGlkICovCiAgCQkJdG1wVjE2ID0gcnRsX3JlYWRfd29yZChydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW1NZU19GVU5DX0VOXSk7CiAJCQlwcmludGsoIlNZU19GVU5DX0VOPSUwNHguXG4iLHRtcFYxNik7CiAJCQlpZiggISh0bXBWMTYgJiBGRU5fRUxEUikgKXsKQEAgLTExMzcsNyArMTEzNyw3IEBACiAJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW1NZU19GVU5DX0VOXSwgdG1wVjE2KTsKIAkJCX0KIAotCQkJLy8gQ2xvY2s6IEdhdGVkKDB4MDAwOGhbNV0pIDhNKDB4MDAwOGhbMV0pIGNsb2NrIGZyb20gQU5BLCBkZWZhdWx0IHZhbGlkCisJCQkvKiBDbG9jazogR2F0ZWQoMHgwMDA4aFs1XSkgOE0oMHgwMDA4aFsxXSkgY2xvY2sgZnJvbSBBTkEsIGRlZmF1bHQgdmFsaWQgKi8KIAkJCXRtcFYxNiA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfQ0xLXSApOwogCQkJcHJpbnRrKCJTWVNfQ0xLPSUwNHguXG4iLHRtcFYxNik7CiAJCQlpZiggKCEodG1wVjE2ICYgTE9BREVSX0NMS19FTikgKSAgfHwoISh0bXBWMTYgJiBBTkE4TSkgKSApCkBAIC0xMTQ4LDcgKzExNDgsNyBAQAogCiAJCQlpZihid3JpdGUgPT0gdHJ1ZSkKIAkJCXsKLQkJCQkvLyBFbmFibGUgTERPIDIuNVYgYmVmb3JlIHJlYWQvd3JpdGUgYWN0aW9uCisJCQkJLyogRW5hYmxlIExETyAyLjVWIGJlZm9yZSByZWFkL3dyaXRlIGFjdGlvbiAqLwogCQkJCXRlbXB2YWwgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzKTsKIAkJCQlwcmludGsoIkVGVVNFX1RFU1Q9JTA0eC5cbiIsdG1wVjE2KTsKIAkJCQl0ZW1wdmFsICY9IH4oQklUKDMpIHwgQklUKDQpIHxCSVQoNSkgfCBCSVQoNikpOwpAQCAtMTE2MSw3ICsxMTYxLDcgQEAKIAkJewogCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0FDQ0VTU10sIDB4MDApOwogCQkJaWYoYndyaXRlID09IHRydWUpewotCQkJCS8vIERpc2FibGUgTERPIDIuNVYgYWZ0ZXIgcmVhZC93cml0ZSBhY3Rpb24KKwkJCQkvKiBEaXNhYmxlIExETyAyLjVWIGFmdGVyIHJlYWQvd3JpdGUgYWN0aW9uICovCiAJCQkJdGVtcHZhbCA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9URVNUXSArIDMpOwogCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzLCAodGVtcHZhbCAmIDB4N0YpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5jCmluZGV4IGNmYTY1MWUuLmE1NjJhYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuYwpAQCAtMzg4LDEzICszODgsMTMgQEAKIAkJICogY2FwYWJpbGl0eSB0aGF0IHdlIGFyZSBsb29raW5nIGZvciwgZm9sbG93IHRoZSBsaW5rIHRvCiAJCSAqIHRoZSBuZXh0IGNhcGFiaWxpdHkgYW5kIGNvbnRpbnVlIGxvb3BpbmcuCiAJCSAqLwotCQlydGxfcGNpX3Jhd193cml0ZV9wb3J0X3Vsb25nKFBDSV9DT05GX0FERFJFU1MgLCAKLQkJCQkJICAgICBwY2ljZmdfYWRkcl9wb3J0ICsgCisJCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWxvbmcoUENJX0NPTkZfQUREUkVTUyAsCisJCQkJCSAgICAgcGNpY2ZnX2FkZHJfcG9ydCArCiAJCQkJCSAgICAgKG51bTRieXRlcyA8PCAyKSk7CiAJCXJ0bF9wY2lfcmF3X3JlYWRfcG9ydF91c2hvcnQoUENJX0NPTkZfREFUQSwKIAkJCQkJICAgICAodTE2KikmY2FwYWJpbGl0eV9oZHIpOwogCQkvKiBGb3VuZCB0aGUgUENJIGV4cHJlc3MgY2FwYWJpbGl0eS4gKi8KLQkJaWYgKGNhcGFiaWxpdHlfaGRyLmNhcGFiaWxpdHlfaWQgPT0gCisJCWlmIChjYXBhYmlsaXR5X2hkci5jYXBhYmlsaXR5X2lkID09CiAJCSAgICBQQ0lfQ0FQQUJJTElUWV9JRF9QQ0lfRVhQUkVTUykKIAkJCWJyZWFrOwogCQllbHNlCkBAIC00MTgsNyArNDE4LDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wX3ByaXYsICZydGxwcml2LT5nbGJfdmFyLT5nbGJfcHJpdl9saXN0LAogCQkJbGlzdCkgewogCQkJaWYgKHRlbXBfcHJpdikgewotCQkJCXRlbXBfcGNpcHJpdiA9IAorCQkJCXRlbXBfcGNpcHJpdiA9CiAJCQkJCShzdHJ1Y3QgcnRsX3BjaV9wcml2ICopdGVtcF9wcml2LT5wcml2OwogCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCiAJCQkJCSgoInBjaXByaXYtPm5kaXNfYWRhcHRlci5mdW5jbnVtYmVyICV4IFxuIiksCkBAIC01MjYsOCArNTI2LDggQEAKIH0KIAogc3RhdGljIGJvb2wgX3J0bF9wY2lfdXBkYXRlX2Vhcmx5bW9kZV9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKLQkJCQkJICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqdGNiX2Rlc2MsIAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICp0Y2JfZGVzYywKIAkJCQkJICAgdTggdGlkKQogewogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CiAJdTggYWRkaXRpb25sZW4gPSBGQ1NfTEVOOwogCXN0cnVjdCBza19idWZmICpuZXh0X3NrYjsKLQkJCisKIAkvKiBoZXJlIG9wZW4gaXMgNCwgd2VwL3RraXAgaXMgOCwgYWVzIGlzIDEyKi8KIAlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpCiAJCWFkZGl0aW9ubGVuICs9IGluZm8tPmNvbnRyb2wuaHdfa2V5LT5pY3ZfbGVuOwpAQCAtNTQ0LDcgKzU0NCw3IEBACiAJdGNiX2Rlc2MtPmVtcGt0X251bSA9IDA7CiAJc3Bpbl9sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy53YWl0cV9sb2NrKTsKIAlza2JfcXVldWVfd2FsaygmcnRscHJpdi0+bWFjODAyMTEuc2tiX3dhaXRxW3RpZF0sIG5leHRfc2tiKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqbmV4dF9pbmZvID0gCisJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqbmV4dF9pbmZvID0KIAkJCQkJSUVFRTgwMjExX1NLQl9DQihuZXh0X3NrYik7CiAJCWlmIChuZXh0X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgewogCQkJdGNiX2Rlc2MtPmVtcGt0X2xlblt0Y2JfZGVzYy0+ZW1wa3RfbnVtXSA9CkBAIC01NTQsNyArNTU0LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHNrYl9xdWV1ZV9pc19sYXN0KCZydGxwcml2LT5tYWM4MDIxMS5za2Jfd2FpdHFbdGlkXSwgCisJCWlmIChza2JfcXVldWVfaXNfbGFzdCgmcnRscHJpdi0+bWFjODAyMTEuc2tiX3dhaXRxW3RpZF0sCiAJCQkJICAgICAgbmV4dF9za2IpKQogCQkJYnJlYWs7CiAKQEAgLTU3NSwyNiArNTc1LDI2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gTlVMTDsKIAlpbnQgdGlkOyAvKiBzaG91bGQgYmUgaW50ICovCi0JCisKIAlpZiAoIXJ0bHByaXYtPnJ0bGhhbC5iX2Vhcmx5bW9kZV9lbmFibGUpCi0JCXJldHVybjsJCisJCXJldHVybjsKIAlpZiAocnRscHJpdi0+ZG0uc3VwcF9waHltb2RlX3N3aXRjaCAmJgogCQkocnRscHJpdi0+ZWFzeV9jb25jdXJyZW50X2N0bC5ic3dpdGNoX2luX3Byb2Nlc3MgfHwKLQkJKHJ0bHByaXYtPmJ1ZGR5X3ByaXYgJiYgCisJCShydGxwcml2LT5idWRkeV9wcml2ICYmCiAJCSBydGxwcml2LT5idWRkeV9wcml2LT5lYXN5X2NvbmN1cnJlbnRfY3RsLmJzd2l0Y2hfaW5fcHJvY2VzcykpKQogCQlyZXR1cm47Ci0JLyogd2UganVzZSB1c2UgZW0gZm9yIEJFL0JLL1ZJL1ZPICovCisJLyogd2UganVzdCB1c2UgZW0gZm9yIEJFL0JLL1ZJL1ZPICovCiAJZm9yICh0aWQgPSA3OyB0aWQgPj0gMDsgdGlkLS0pIHsKIAkJdTggaHdfcXVldWUgPSBhY190b19od3FbcnRsX3RpZF90b19hYyhodywgdGlkKV07CiAJCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcnRscGNpLT50eF9yaW5nW2h3X3F1ZXVlXTsKLQkJd2hpbGUgKCFtYWMtPmFjdF9zY2FubmluZyAmJiAKKwkJd2hpbGUgKCFtYWMtPmFjdF9zY2FubmluZyAmJgogCQkgICAgICAgcnRscHJpdi0+cHNjLnJmcHdyX3N0YXRlID09IEVSRk9OKSB7CiAJCQlzdHJ1Y3QgcnRsX3RjYl9kZXNjIHRjYl9kZXNjOwotCQkJbWVtc2V0KCZ0Y2JfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBydGxfdGNiX2Rlc2MpKTsJCQkKKwkJCW1lbXNldCgmdGNiX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgcnRsX3RjYl9kZXNjKSk7CiAKIAkJCXNwaW5fbG9ja19iaCgmcnRscHJpdi0+bG9ja3Mud2FpdHFfbG9jayk7CiAJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbWFjLT5za2Jfd2FpdHFbdGlkXSkgJiYKLQkJCSAgICAocmluZy0+ZW50cmllcyAtIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA+IAorCQkJICAgIChyaW5nLT5lbnRyaWVzIC0gc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID4KIAkJCSAgICAgcnRsaGFsLT5tYXhfZWFybHltb2RlX251bSkpIHsKIAkJCQlza2IgPSBza2JfZGVxdWV1ZSgmbWFjLT5za2Jfd2FpdHFbdGlkXSk7CiAJCQl9IGVsc2UgewpAQCAtNjA3LDcgKzYwNyw3IEBACiAJCQkgKiBtdWx0aWNhc3QvYnJvYWRjYXN0L25vX3FvcyBkYXRhICovCiAJCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCQkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJCQlfcnRsX3BjaV91cGRhdGVfZWFybHltb2RlX2luZm8oaHcsIHNrYiwgCisJCQkJX3J0bF9wY2lfdXBkYXRlX2Vhcmx5bW9kZV9pbmZvKGh3LCBza2IsCiAJCQkJCQkJICAgICAgICZ0Y2JfZGVzYywgdGlkKTsKIAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJCXU4IHRpZDsKIAkJdTggKmVudHJ5OwogCi0JCQorCiAJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQogCQkJZW50cnkgPSAodTggKikoJnJpbmctPmJ1ZmZlcl9kZXNjW3JpbmctPmlkeF0pOwogCQllbHNlCkBAIC02NDMsMTEgKzY0MywxMSBAQAogCiAJCWlmICghcnRscHJpdi0+Y2ZnLT5vcHMtPmlzX3R4X2Rlc2NfY2xvc2VkKGh3LCBwcmlvLCByaW5nLT5pZHgpKQogCQkJcmV0dXJuOwotCQkJCisKIAkJcmluZy0+aWR4ID0gKHJpbmctPmlkeCArIDEpICUgcmluZy0+ZW50cmllczsKLQkJCisKIAkJc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOwotCQkKKwogCQlwY2lfdW5tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwKIAkJCQkgbGUzMl90b19jcHUocnRscHJpdi0+Y2ZnLT5vcHMtPgogCQkJCQkgICAgIGdldF9kZXNjKCh1OCAqKSBlbnRyeSwgdHJ1ZSwKQEAgLTY3Miw3ICs2NzIsNyBAQAogCQl9CiAKIAkJLyogZm9yIHN3IExQUywganVzdCBhZnRlciBOVUxMIHNrYiBzZW5kIG91dCwgd2UgY2FuCi0JCSAqIHN1cmUgQVAga293biB3ZSBhcmUgc2xlZXBlZCwgb3VyIHdlIHNob3VsZCBub3QgbGV0CisJCSAqIHN1cmUgQVAga25vd24gd2UgYXJlIHNsZXB0LCBvdXIgd2Ugc2hvdWxkIG5vdCBsZXQKIAkJICogcmYgdG8gc2xlZXAqLwogCQlmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKIAkJaWYgKGllZWU4MDIxMV9pc19udWxsZnVuYyhmYykpIHsKQEAgLTc0MCw3ICs3NDAsNyBAQAogCXU4IHRtcF9vbmUgPSAxOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJ0bHBjaS0+cnhidWZmZXJzaXplKTsJCisJc2tiID0gZGV2X2FsbG9jX3NrYihydGxwY2ktPnJ4YnVmZmVyc2l6ZSk7CiAJaWYgKCFza2IpCiAJCXJldHVybiAwOwogCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5yeF9idWZbZGVzY19pZHhdID0gc2tiOwpAQCAtNzU0LDI1ICs3NTQsMjUgQEAKIAlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHJ0bHBjaS0+cGRldiwgYnVmZmVyYWRkcmVzcykpCiAJCXJldHVybiAwOwogCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7Ci0JCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwgCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwKIAkJCQkJICAgIEhXX0RFU0NfUlhfUFJFUEFSRSwKIAkJCQkJICAgICh1OCAqKSAmIGJ1ZmZlcmFkZHJlc3MpOwotCX0gZWxzZSB7CQotCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsIAorCX0gZWxzZSB7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwKIAkJCQkJICAgIEhXX0RFU0NfUlhCVUZGX0FERFIsCiAJCQkJCSAgICAodTggKikgJiBidWZmZXJhZGRyZXNzKTsKLQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLCAKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLAogCQkJCQkgICAgSFdfREVTQ19SWFBLVF9MRU4sCiAJCQkJCSAgICAodTggKikgJiBydGxwY2ktPnJ4YnVmZmVyc2l6ZSk7Ci0JCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwgCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwKIAkJCQkJICAgIEhXX0RFU0NfUlhPV04sCiAJCQkJCSAgICAodTggKikgJiB0bXBfb25lKTsKIAl9Ci0JCisKIAlyZXR1cm4gMTsKIH0KIAotLyogaW5vcmRlciB0byByZWNlaXZlIDhLIEFNU0RVIHdlIGhhdmUgc2V0IHNrYiB0bworLyogSW4gb3JkZXIgdG8gcmVjZWl2ZSA4SyBBTVNEVSB3ZSBoYXZlIHNldCBza2IgdG8KICAqIDkxMDBieXRlcyBpbiBpbml0IHJ4IHJpbmcsIGJ1dCBpZiB0aGlzIHBhY2tldCBpcwogICogbm90IGEgQU1TRFUsIHRoaXMgc28gYmlnIHBhY2tldCB3aWxsIGJlIHNlbnQgdG8KICAqIFRDUC9JUCBkaXJlY3RseSwgdGhpcyBjYXVzZSBiaWcgcGFja2V0IHBpbmcgZmFpbApAQCAtNzgzLDcgKzc4Myw3IEBACiAvKiBidXQgc29tZSBwbGF0Zm9ybSB3aWxsIGZhaWwgd2hlbiBhbGxvYyBza2Igc29tZXRpbWVzLgogICogaW4gdGhpcyBjb25kaXRpb24sIHdlIHdpbGwgc2VuZCB0aGUgb2xkIHNrYiB0bwogICogbWFjODAyMTEgZGlyZWN0bHksIHRoaXMgd2lsbCBub3QgY2F1c2UgYW55IG90aGVyCi0gKiBpc3N1ZXMsIGJ1dCBvbmx5IGJlIGxvc3RlZCBieSBUQ1AvSVAgKi8KKyAqIGlzc3VlcywgYnV0IG9ubHkgYmUgbG9zdCBieSBUQ1AvSVAgKi8KIHN0YXRpYyB2b2lkIF9ydGxfcGNpX3J4X3RvX21hYzgwMjExKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1cykKIHsKQEAgLTc5Miw3ICs3OTIsNyBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCBza19idWZmICp1c2tiID0gTlVMTDsKIAkJdTggKnBkYXRhOwotCQkKKwogCQl1c2tiID0gZGV2X2FsbG9jX3NrYihza2ItPmxlbiArIDEyOCk7CiAJCWlmIChsaWtlbHkodXNrYikpIHsKIAkJCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0IodXNrYiksICZyeF9zdGF0dXMsCkBAIC04MDQsNyArODA0LDcgQEAKIAkJCWllZWU4MDIxMV9yeF9pcnFzYWZlKGh3LCB1c2tiKTsKIAkJfSBlbHNlIHsKIAkJCWllZWU4MDIxMV9yeF9pcnFzYWZlKGh3LCBza2IpOwotCQl9CQorCQl9CiAJfQogfQogCkBAIC04MTQsMTEgKzgxNCwxMSBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOwogCi0JcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19IU0lTUl0sIAotCQkgICAgICAgcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hTSVNSXSkgfCAKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hTSVNSXSwKKwkJICAgICAgIHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19IU0lTUl0pIHwKIAkJICAgICAgIHJ0bHBjaS0+c3lzX2lycV9tYXNrKTsKIAotCQorCiB9CiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9yeF9pbnRlcnJ1cHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CkBAIC04MzksNyArODM5LDcgQEAKIAkJLm5vaXNlID0gLTk4LAogCQkucmF0ZSA9IDAsCiAJfTsKLQkKKwogCS8qUlggTk9STUFMIFBLVCAqLwogCXdoaWxlIChjb3VudC0tKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CkBAIC04NTIsNjUgKzg1Miw2NSBAQAogCQkvKnJ4IHBrdCAqLwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLnJ4X2J1ZlsKIAkJCQkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeF07Ci0JCQorCiAJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7Ci0JCQlyeF9yZW1haW5lZF9jbnQgPSAKKwkJCXJ4X3JlbWFpbmVkX2NudCA9CiAJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnJ4X2Rlc2NfYnVmZl9yZW1haW5lZF9jbnQoaHcsCiAJCQkJCQkJCSAgICAgIGh3X3F1ZXVlKTsKLQkJCWlmIChyeF9yZW1haW5lZF9jbnQgPCAxKSAKKwkJCWlmIChyeF9yZW1haW5lZF9jbnQgPCAxKQogCQkJCXJldHVybjsKLQkJCQorCiAJCX0gZWxzZSB7CS8qIHJ4IGRlc2NyaXB0b3IgKi8KIAkJCXBkZXNjID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjWwogCQkJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHhdOwotCQkJCisKIAkJCW93biA9ICh1OCkgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKSBwZGVzYywKLQkJCQkJCQkgICAgICAgZmFsc2UsIAorCQkJCQkJCSAgICAgICBmYWxzZSwKIAkJCQkJCQkgICAgICAgSFdfREVTQ19PV04pOwogCQkJaWYgKG93bikgLyogd2FpdCBkYXRhIHRvIGJlIGZpbGxlZCBieSBoYXJkd2FyZSAqLwogCQkJCXJldHVybjsKIAkJfQotCQkKKwogCQkvKiBHZXQgaGVyZSBtZWFuczogZGF0YSBpcyBmaWxsZWQgYWxyZWFkeSovCiAJCS8qIEFBQUFBQXR0ZW50aW9uICEhIQogCQkgKiBXZSBjYW4gTk9UIGFjY2VzcyAnc2tiJyBiZWZvcmUgJ3BjaV91bm1hcF9zaW5nbGUnICovCiAJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LCAqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpLAogCQkJIAkgcnRscGNpLT5yeGJ1ZmZlcnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQorCiAJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7CiAJCQlidWZmZXJfZGVzYyA9ICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2NbCiAJCQkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeF07CiAJCQkvKm1lYW5zIHJ4IHdpZmkgaW5mbyovCiAJCQlwZGVzYyA9IChzdHJ1Y3QgcnRsX3J4X2Rlc2MgKilza2ItPmRhdGE7CiAJCX0KLQkJCisKIAkJcnRscHJpdi0+Y2ZnLT5vcHMtPnF1ZXJ5X3J4X2Rlc2MoaHcsICZzdGF0dXMsCiAJCQkJCQkgJnJ4X3N0YXR1cywgKHU4ICopIHBkZXNjLCBza2IpOwotCQkJCisKIAkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCi0JCQlydGxwcml2LT5jZmctPm9wcy0+cnhfY2hlY2tfZG1hX29rKGh3LCAKLQkJCQkJCQkgICAodTggKilidWZmZXJfZGVzYywgCisJCQlydGxwcml2LT5jZmctPm9wcy0+cnhfY2hlY2tfZG1hX29rKGh3LAorCQkJCQkJCSAgICh1OCAqKWJ1ZmZlcl9kZXNjLAogCQkJCQkJCSAgIGh3X3F1ZXVlKTsKIAotCQkJCi0JCWxlbiA9IHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfZGVzYygodTggKilwZGVzYywgZmFsc2UsIAorCisJCWxlbiA9IHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfZGVzYygodTggKilwZGVzYywgZmFsc2UsCiAJCQkJCQkgIEhXX0RFU0NfUlhQS1RfTEVOKTsKLQkJCQorCiAJCWlmIChza2ItPmVuZCAtIHNrYi0+dGFpbCA+IGxlbikgewogCQkJc2tiX3B1dChza2IsIGxlbik7Ci0JCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykJCi0JCQkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0dXMucnhfZHJ2aW5mb19zaXplICsgCisJCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKKwkJCQlza2JfcmVzZXJ2ZShza2IsIHN0YXR1cy5yeF9kcnZpbmZvX3NpemUgKwogCQkJCQkJIHN0YXR1cy5yeF9idWZzaGlmdCArIDI0KTsKIAkJCWVsc2UKLQkJCQlza2JfcmVzZXJ2ZShza2IsIHN0YXR1cy5yeF9kcnZpbmZvX3NpemUgKyAKKwkJCQlza2JfcmVzZXJ2ZShza2IsIHN0YXR1cy5yeF9kcnZpbmZvX3NpemUgKwogCQkJCQkJIHN0YXR1cy5yeF9idWZzaGlmdCk7CiAKIAkJfSBlbHNlIHsKLQkJCXByaW50aygic2tiLT5lbmQgLSBza2ItPnRhaWwgPSAlZCwgbGVuIGlzICVkXG4iLCAKKwkJCXByaW50aygic2tiLT5lbmQgLSBza2ItPnRhaWwgPSAlZCwgbGVuIGlzICVkXG4iLAogCQkJICAgICAgIHNrYi0+ZW5kIC0gc2tiLT50YWlsLCBsZW4pOwogCQkJYnJlYWs7CiAJCX0KLQkJCQorCiAJCXJ0bHByaXYtPmNmZy0+b3BzLT5yeF9jb21tYW5kX3BhY2tldF9oYW5kbGVyKGh3LCBzdGF0dXMsIHNrYik7CiAKIAkJLyoKQEAgLTkyMiw5ICs5MjIsOSBAQAogCiAJCWhkciA9IHJ0bF9nZXRfaGRyKHNrYik7CiAJCWZjID0gcnRsX2dldF9mYyhza2IpOwotCQkKKwogCQlpZiAoIXN0YXR1cy5iX2NyYyAmJiAhc3RhdHVzLmJfaHdlcnJvcikgewotCQkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmcnhfc3RhdHVzLCAKKwkJCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgJnJ4X3N0YXR1cywKIAkJCSAgICAgICBzaXplb2Yocnhfc3RhdHVzKSk7CiAKIAkJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgewpAQCAtOTQ3LDEzICs5NDcsMTMgQEAKIAogCQkJLyogc3RhdGljIGJjbiBmb3Igcm9hbWluZyAqLwogCQkJcnRsX2JlYWNvbl9zdGF0aXN0aWMoaHcsIHNrYik7Ci0JCQlydGxfcDJwX2luZm8oaHcsICh2b2lkKilza2ItPmRhdGEsIHNrYi0+bGVuKTsJCisJCQlydGxfcDJwX2luZm8oaHcsICh2b2lkKilza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJCS8qIGZvciBzdyBscHMgKi8KIAkJCXJ0bF9zd2xwc19iZWFjb24oaHcsICh2b2lkKilza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJCXJ0bF9yZWNvZ25pemVfcGVlcihodywgKHZvaWQqKXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQkJaWYgKChydGxwcml2LT5tYWM4MDIxMS5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApICYmCiAJCQkgICAgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykmJgotCQkJICAgIChpZWVlODAyMTFfaXNfYmVhY29uKGZjKSB8fCAKKwkJCSAgICAoaWVlZTgwMjExX2lzX2JlYWNvbihmYykgfHwKIAkJCSAgICAgaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpKSkgewogCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQl9IGVsc2UgewpAQCAtOTY0LDEzICs5NjQsMTMgQEAKIAkJfQogCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewogCQkJcnRscGNpLT5yeF9yaW5nW2h3X3F1ZXVlXS5uZXh0X3J4X3JwICs9IDE7Ci0JCQlydGxwY2ktPnJ4X3JpbmdbaHdfcXVldWVdLm5leHRfcnhfcnAgJT0gCisJCQlydGxwY2ktPnJ4X3JpbmdbaHdfcXVldWVdLm5leHRfcnhfcnAgJT0KIAkJCQkJCQlSVExfUENJX01BWF9SWF9DT1VOVDsKIAogCiAJCQlyeF9yZW1haW5lZF9jbnQtLTsKIAkJCWlmICgxLypyeF9yZW1haW5lZF9jbnQgPT0gMCovKSB7Ci0JCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgMHgzQjQsIAorCQkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIDB4M0I0LAogCQkJCQlydGxwY2ktPnJ4X3JpbmdbaHdfcXVldWVdLm5leHRfcnhfcnApOwogCQkJfQogCQl9CkBAIC05ODEsMjIgKzk4MSwyMiBAQAogCQl9CiAKIAkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKLQkJCV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopYnVmZmVyX2Rlc2MsIAorCQkJX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKilidWZmZXJfZGVzYywKIAkJCQkJCSByeHJpbmdfaWR4LAotCQkJCQkgICAgICAgcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCk7CQkJCisJCQkJCSAgICAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4KTsKIAkJfSBlbHNlIHsKIAkJCV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopcGRlc2MsIHJ4cmluZ19pZHgsCi0JCQkJCSAgICAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4KTsJCQkKKwkJCQkJICAgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHgpOwogCi0JCQlpZiAocnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9PSAKKwkJCWlmIChydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID09CiAJCQkgICAgcnRscGNpLT5yeHJpbmdjb3VudCAtIDEpCi0JCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgcGRlc2MsIAotCQkJCQkJCSAgICBmYWxzZSwgCisJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgcGRlc2MsCisJCQkJCQkJICAgIGZhbHNlLAogCQkJCQkJCSAgICBIV19ERVNDX1JYRVJPLAogCQkJCQkJCSAgICAodTggKikgJiB0bXBfb25lKTsKIAkJfQotCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID0gCi0JCQkJKHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggKyAxKSAlIAorCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID0KKwkJCQkocnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCArIDEpICUKIAkJCQlydGxwY2ktPnJ4cmluZ2NvdW50OwogCX0KIH0KQEAgLTEwMTEsNyArMTAxMSw3IEBACiAJdTMyIGludGEgPSAwOwogCXUzMiBpbnRiID0gMDsKIAotCQorCiAKIAlpZiAocnRscGNpLT5pcnFfZW5hYmxlZCA9PSAwKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogCiAKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19ISU1SXSwgMHgwKTsKLQkKKwogCiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSElNUkVdLCAweDApOwogCkBAIC0xMDI5LDcgKzEwMjksNyBAQAogCXJ0bHByaXYtPmNmZy0+b3BzLT5pbnRlcnJ1cHRfcmVjb2duaXplZChodywgJmludGEsICZpbnRiKTsKIAogCi0JLypTaGFyZWQgSVJRIG9yIEhXIGRpc2FwcGFyZWQgKi8KKwkvKlNoYXJlZCBJUlEgb3IgSFcgZGlzYXBwZWFyZWQgKi8KIAlpZiAoIWludGEgfHwgaW50YSA9PSAweGZmZmYpCiAJCWdvdG8gZG9uZTsKIAkvKjwxPiBiZWFjb24gcmVsYXRlZCAqLwpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkvKjw0PiBmdyByZWxhdGVkKi8KIAlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODcyM0FFKSB7CiAJCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfQzJIQ01EXSkgewotCQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsIAorCQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsCiAJCQkJICgiZmlybXdhcmUgaW50ZXJydXB0IVxuIikpOwogCQkJcXVldWVfZGVsYXllZF93b3JrKHJ0bHByaXYtPndvcmtzLnJ0bF93cSwKIAkJCQkJICAgJnJ0bHByaXYtPndvcmtzLmZ3ZXZ0X3dxLCAwKTsKQEAgLTExNDIsMTIgKzExNDIsMTIgQEAKIAlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE4OEVFIHx8CiAJICAgIHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgewogCQlpZiAodW5saWtlbHkoaW50YSAmIHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfSU1SX0hTSVNSX0lORF0pKSB7Ci0JCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwgCisJCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwKIAkJCQkJICgiaHNpc3IgaW50ZXJydXB0IVxuIikpOwogCQkJX3J0bF9wY2lfaHNfaW50ZXJydXB0KGh3KTsKIAkJfQogCX0KLQkKKwogCiAJaWYocnRscHJpdi0+cnRsaGFsLmJfZWFybHltb2RlX2VuYWJsZSkKIAkJdGFza2xldF9zY2hlZHVsZSgmcnRscHJpdi0+d29ya3MuaXJxX3Rhc2tsZXQpOwpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19ISU1SRV0sCiAJCQlydGxwY2ktPmlycV9tYXNrWzFdKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCQorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogCiBkb25lOgpAQCAtMTIwMCwxNiArMTIwMCwxNiBAQAogCXBkZXNjID0gJnJpbmctPmRlc2NbMF07CiAJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCiAJCXBidWZmZXJfZGVzYyA9ICZyaW5nLT5idWZmZXJfZGVzY1swXTsKLQkKKwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCi0JcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsIAotCQkJCSAgICAgICAgKHU4ICopcGJ1ZmZlcl9kZXNjLCBpbmZvLCBwc2tiLCAKKwlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywKKwkJCQkgICAgICAgICh1OCAqKXBidWZmZXJfZGVzYywgaW5mbywgcHNrYiwKIAkJCQkgICAgICAgIEJFQUNPTl9RVUVVRSwgJnRjYl9kZXNjKTsKICNlbHNlCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwogCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLAotCQkJCQkodTggKilwYnVmZmVyX2Rlc2MsIGluZm8sIE5VTEwsIHBza2IsIAorCQkJCQkodTggKilwYnVmZmVyX2Rlc2MsIGluZm8sIE5VTEwsIHBza2IsCiAJCQkJCUJFQUNPTl9RVUVVRSwgJnRjYl9kZXNjKTsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNlbmRpZgpAQCAtMTIzNSw3ICsxMjM1LDcgQEAKIAkJZGVzY19udW0gPSBUWF9ERVNDX05VTV85MkU7CiAJZWxzZQogCQlkZXNjX251bSA9IFJUX1RYREVTQ19OVU07Ci0JCisKIAlmb3IgKGkgPSAwOyBpIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7IGkrKykgewogCQlydGxwY2ktPnR4cmluZ2NvdW50W2ldID0gZGVzY19udW07CiAJfQpAQCAtMTMwOSwxMiArMTMwOSwxMiBAQAogCS8qIGFsbG9jIHR4IGJ1ZmZlciBkZXNjIGZvciBuZXcgdHJ4IGZsb3cqLwogCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7CiAJCWJ1ZmZlcl9kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAotCQkJCQkgICAgc2l6ZW9mKCpidWZmZXJfZGVzYykgKiBlbnRyaWVzLCAKKwkJCQkJICAgIHNpemVvZigqYnVmZmVyX2Rlc2MpICogZW50cmllcywKIAkJCQkJICAgICZidWZmZXJfZGVzY19kbWEpOwogCiAJCWlmICghYnVmZmVyX2Rlc2MgfHwgKHVuc2lnbmVkIGxvbmcpYnVmZmVyX2Rlc2MgJiAweEZGKSB7CiAJCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAoIkNhbm5vdCBhbGxvY2F0ZSBUWCByaW5nIChwcmlvID0gJWQpXG4iLCAKKwkJCQkgKCJDYW5ub3QgYWxsb2NhdGUgVFggcmluZyAocHJpbyA9ICVkKVxuIiwKIAkJCQkgcHJpbykpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTEzMjIsMTMgKzEzMjIsMTMgQEAKIAkJbWVtc2V0KGJ1ZmZlcl9kZXNjLCAwLCBzaXplb2YoKmJ1ZmZlcl9kZXNjKSAqIGVudHJpZXMpOwogCQlydGxwY2ktPnR4X3JpbmdbcHJpb10uYnVmZmVyX2Rlc2MgPSBidWZmZXJfZGVzYzsKIAkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmJ1ZmZlcl9kZXNjX2RtYSA9IGJ1ZmZlcl9kZXNjX2RtYTsKLQkJCisKIAkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmN1cl90eF9ycCA9IDA7CiAJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5jdXJfdHhfd3AgPSAwOwogCQlydGxwY2ktPnR4X3JpbmdbcHJpb10uYXZsX2Rlc2MgPSBlbnRyaWVzOwogCiAJfQotCQorCiAJLyogYWxsb2MgZG1hIGZvciB0aGlzIHJpbmcgKi8KIAlkZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAogCQkJCSAgICBzaXplb2YoKmRlc2MpICogZW50cmllcywgJmRlc2NfZG1hKTsKQEAgLTEzNDIsNyArMTM0Miw3IEBACiAJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykgKiBlbnRyaWVzKTsKIAlydGxwY2ktPnR4X3JpbmdbcHJpb10uZGVzYyA9IGRlc2M7CiAJcnRscGNpLT50eF9yaW5nW3ByaW9dLmRtYSA9IGRlc2NfZG1hOwotCQorCiAJcnRscGNpLT50eF9yaW5nW3ByaW9dLmlkeCA9IDA7CiAJcnRscGNpLT50eF9yaW5nW3ByaW9dLmVudHJpZXMgPSBlbnRyaWVzOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnJ0bHBjaS0+dHhfcmluZ1twcmlvXS5xdWV1ZSk7CkBAIC0xMzU3LDcgKzEzNTcsNyBAQAogCQkJCQkJICAgICAgc2l6ZW9mKCpkZXNjKSk7CiAKIAkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopICYgKGRlc2NbaV0pLAotCQkJCQkJICAgIHRydWUsIAorCQkJCQkJICAgIHRydWUsCiAJCQkJCQkgICAgSFdfREVTQ19UWF9ORVhUREVTQ19BRERSLAogCQkJCQkJICAgICh1OCAqKSAmIG5leHRkZXNjYWRkcmVzcyk7CiAJCX0KQEAgLTEzNzEsMTUgKzEzNzEsMTUgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAKIAlpbnQgaTsKLQkKKwogCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7CiAJCXN0cnVjdCBydGxfcnhfYnVmZmVyX2Rlc2MgKmVudHJ5ID0gTlVMTDsKIAkJLyogYWxsb2MgZG1hIGZvciB0aGlzIHJpbmcgKi8KLQkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjID0gCisJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzYyA9CiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChydGxwY2ktPnBkZXYsCiAJCQkJCSBzaXplb2YoKnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS4KLQkJCQkJICAgICAgICBidWZmZXJfZGVzYykgKiAKLQkJCQkJICAgICAgICBydGxwY2ktPnJ4cmluZ2NvdW50LCAKKwkJCQkJICAgICAgICBidWZmZXJfZGVzYykgKgorCQkJCQkgICAgICAgIHJ0bHBjaS0+cnhyaW5nY291bnQsCiAJCQkJCSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRtYSk7CiAJCWlmICghcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjIHx8CiAJCSAgICAodW5zaWduZWQgbG9uZylydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MgJiAweEZGKSB7CkBAIC0xMzkzLDkgKzEzOTMsOSBAQAogCiAJCS8qIGluaXQgZXZlcnkgZGVzYyBpbiB0aGlzIHJpbmcgKi8KIAkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsJCQkKKwkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgewogCQkJZW50cnkgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjW2ldOwotCQkJaWYgKCFfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKWVudHJ5LCAKKwkJCWlmICghX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKillbnRyeSwKIAkJCQkJCSAgICAgIHJ4cmluZ19pZHgsIGkpKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xNDAzLDE0ICsxNDAzLDE0IEBACiAJCXN0cnVjdCBydGxfcnhfZGVzYyAqZW50cnkgPSBOVUxMOwogCQl1OCB0bXBfb25lID0gMTsKIAkJLyogYWxsb2MgZG1hIGZvciB0aGlzIHJpbmcgKi8KLQkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgPSAKKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgPQogCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAogCQkJCQkgc2l6ZW9mKCpydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uCi0JCQkJCSAgICAgICAgZGVzYykgKiBydGxwY2ktPnJ4cmluZ2NvdW50LCAKKwkJCQkJICAgICAgICBkZXNjKSAqIHJ0bHBjaS0+cnhyaW5nY291bnQsCiAJCQkJCSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRtYSk7CiAJCWlmICghcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgfHwKIAkJICAgICh1bnNpZ25lZCBsb25nKXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjICYgMHhGRikgewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywgCisJCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAogCQkJCSAoIkNhbm5vdCBhbGxvY2F0ZSBSWCByaW5nXG4iKSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTQyMSw5ICsxNDIxLDkgQEAKIAogCQkvKiBpbml0IGV2ZXJ5IGRlc2MgaW4gdGhpcyByaW5nICovCiAJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgcnRscGNpLT5yeHJpbmdjb3VudDsgaSsrKSB7CQkJCisJCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsKIAkJCWVudHJ5ID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjW2ldOwotCQkJaWYgKCFfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKWVudHJ5LCAKKwkJCWlmICghX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKillbnRyeSwKIAkJCQkJCSAgICAgIHJ4cmluZ19pZHgsIGkpKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xNDY3LDcgKzE0NjcsNyBAQAogCQkJCSAgICBzaXplb2YoKnJpbmctPmJ1ZmZlcl9kZXNjKSAqIHJpbmctPmVudHJpZXMsCiAJCQkJICAgIHJpbmctPmJ1ZmZlcl9kZXNjLCByaW5nLT5idWZmZXJfZGVzY19kbWEpOwogCQlyaW5nLT5idWZmZXJfZGVzYyA9IE5VTEw7Ci0JfQkKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9ydGxfcGNpX2ZyZWVfcnhfcmluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IHJ4cmluZ19pZHgpCkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogCQlfcnRsX3BjaV9mcmVlX3J4X3JpbmcoaHcsIHJ4cmluZ19pZHgpOwogCiAJZm9yIChpID0gMDsgaSA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspCi0JCWlmIChydGxwY2ktPnR4X3JpbmdbaV0uZGVzYyB8fCAKKwkJaWYgKHJ0bHBjaS0+dHhfcmluZ1tpXS5kZXNjIHx8CiAJCSAgICBydGxwY2ktPnR4X3JpbmdbaV0uYnVmZmVyX2Rlc2MpCiAJCQlfcnRsX3BjaV9mcmVlX3R4X3JpbmcoaHcsIGkpOwogCkBAIC0xNTY3LDE2ICsxNTY3LDE2IEBACiAJCS8qIGZvcmNlIHRoZSByeF9yaW5nW1JYX01QRFVfUVVFVUUvCiAJCSAqIFJYX0NNRF9RVUVVRV0uaWR4IHRvIHRoZSBmaXJzdCBvbmUgKi8KIAkJLypuZXcgdHJ4IGZsb3csIGRvIG5vdGhpbmcqLwotCQlpZiAoKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cgPT0gZmFsc2UpICYmIAorCQlpZiAoKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cgPT0gZmFsc2UpICYmCiAJCSAgICAgcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MpIHsKIAkJCXN0cnVjdCBydGxfcnhfZGVzYyAqZW50cnkgPSBOVUxMOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgcnRscGNpLT5yeHJpbmdjb3VudDsgaSsrKSB7Ci0JCQkJZW50cnkgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2NbaV07CQkJCi0JCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIAorCQkJCWVudHJ5ID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjW2ldOworCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LAogCQkJCQkJCSAgICBmYWxzZSwKLQkJCQkJCQkgICAgSFdfREVTQ19SWE9XTiwgCi0JCQkJCQkJICAgICh1OCAqKSAmIHRtcF9vbmUpOwkJCisJCQkJCQkJICAgIEhXX0RFU0NfUlhPV04sCisJCQkJCQkJICAgICh1OCAqKSAmIHRtcF9vbmUpOwogCQkJfQogCQl9CiAJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPSAwOwl9CkBAIC0xNTg1LDEzICsxNTg1LDEzIEBACiAJICogYW5kIGZvcmNlIHRoZSAgdHggaWR4IHRvIHRoZSBmaXJzdCBvbmUgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7IGkrKykgewotCQlpZiAocnRscGNpLT50eF9yaW5nW2ldLmRlc2MgfHwgCisJCWlmIChydGxwY2ktPnR4X3JpbmdbaV0uZGVzYyB8fAogCQkJcnRscGNpLT50eF9yaW5nW2ldLmJ1ZmZlcl9kZXNjKSB7CiAJCQlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnJ0bHBjaS0+dHhfcmluZ1tpXTsKIAogCQkJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkgewogCQkJCXU4ICplbnRyeTsKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9CiAJCQkJCV9fc2tiX2RlcXVldWUoJnJpbmctPnF1ZXVlKTsKIAkJCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKIAkJCQkJZW50cnkgPSAodTggKikoJnJpbmctPmJ1ZmZlcl9kZXNjCkBAIC0xNjE4LDcgKzE2MTgsNyBAQAogCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKLXN0YXRpYyBib29sIHJ0bF9wY2lfdHhfY2hrX3dhaXRxX2luc2VydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgCitzdGF0aWMgYm9vbCBydGxfcGNpX3R4X2Noa193YWl0cV9pbnNlcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IpCiAjZWxzZQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KQEAgLTE3NDEsMTAgKzE3NDEsMTAgQEAKIAl9CiAKIAlwZGVzYyA9ICZyaW5nLT5kZXNjW2lkeF07Ci0JCisKIAlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewogCQlwdHhfYmRfZGVzYyA9ICZyaW5nLT5idWZmZXJfZGVzY1tpZHhdOwotCX0gZWxzZSB7CQorCX0gZWxzZSB7CiAJCW93biA9ICh1OCkgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKSBwZGVzYywKIAkJCQl0cnVlLCBIV19ERVNDX09XTik7CiAKQEAgLTE3NTUsMTcgKzE3NTUsMTcgQEAKIAkJCQkgIGh3X3F1ZXVlLCByaW5nLT5pZHgsIGlkeCwKIAkJCQkgIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkpOwogCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywKIAkJCQkJICAgICAgIGZsYWdzKTsKIAkJCXJldHVybiBza2ItPmxlbjsKIAkJfQogCX0KLQkKKwogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CiAJCXRpZCA9IHJ0bF9nZXRfdGlkKHNrYik7CiAJCWlmIChzdGEpIHsKIAkJCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopc3RhLT5kcnZfcHJpdjsKLQkJCXNlcV9udW1iZXIgPSAobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiAKKwkJCXNlcV9udW1iZXIgPSAobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJgogCQkJCSAgICAgIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNDsKIAkJCXNlcV9udW1iZXIgKz0gMTsKIApAQCAtMTc3OSwxMyArMTc3OSwxMyBAQAogCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKLQlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywgCi0JCQkJCSh1OCAqKXB0eF9iZF9kZXNjLCBpbmZvLCBza2IsIAorCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLAorCQkJCQkodTggKilwdHhfYmRfZGVzYywgaW5mbywgc2tiLAogCQkJCQlod19xdWV1ZSwgcHRjYl9kZXNjKTsKICNlbHNlCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwotCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLCAKLQkJCQkJKHU4ICopcHR4X2JkX2Rlc2MsIGluZm8sIHN0YSwgc2tiLCAKKwlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywKKwkJCQkJKHU4ICopcHR4X2JkX2Rlc2MsIGluZm8sIHN0YSwgc2tiLAogCQkJCQlod19xdWV1ZSwgcHRjYl9kZXNjKTsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNlbmRpZgpAQCAtMTgzMiwxMCArMTgzMiwxMCBAQAogCXUxNiBpID0gMDsKIAlpbnQgcXVldWVfaWQ7CiAJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZzsKLQkKKwogCWlmIChtYWMtPnNraXBfc2NhbikKIAkJcmV0dXJuOwotCQorCiAJZm9yIChxdWV1ZV9pZCA9IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UIC0gMTsgcXVldWVfaWQgPj0gMDspIHsKIAkJdTMyIHF1ZXVlX2xlbjsKICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogCXU4IFJGSW5Qcm9ncmVzc1RpbWVPdXQgPSAwOwogCiAJLyoKLQkgKnNob3VsZCBiZWZvcmUgZGlzYWJsZSBpbnRlcnJydXB0JmFkYXB0ZXIKKwkgKnNob3VsZCBiZWZvcmUgZGlzYWJsZSBpbnRlcnJ1cHQmYWRhcHRlcgogCSAqYW5kIHdpbGwgZG8gaXQgaW1tZWRpYXRlbHkuCiAJICovCiAJc2V0X2hhbF9zdG9wKHJ0bGhhbCk7CkBAIC0yMDgxLDEzICsyMDgxLDEzIEBACiAJCQlydGxoYWwtPmludGVyZmFjZWluZGV4ID0gMDsKIAkJfQogCX0KLQkKKwogCS8qIDkyZWUgdXNlIG5ldyB0cnggZmxvdyAqLwogCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpCiAJCXJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cgPSB0cnVlOwogCWVsc2UKIAkJcnRscHJpdi0+dXNlX25ld190cnhfZmxvdyA9IGZhbHNlOwotCQorCiAJLypmaW5kIGJ1cyBpbmZvICovCiAJcGNpcHJpdi0+bmRpc19hZGFwdGVyLmJ1c251bWJlciA9IHBkZXYtPmJ1cy0+bnVtYmVyOwogCXBjaXByaXYtPm5kaXNfYWRhcHRlci5kZXZudW1iZXIgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CkBAIC0yMDk1LDcgKzIwOTUsNyBAQAogCiAJLypmaW5kIGJyaWRnZSBpbmZvICovCiAJcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV92ZW5kb3IgPSBQQ0lfQlJJREdFX1ZFTkRPUl9VTktOT1dOOwotCS8qIHNvbWUgQVJNIGhhdmUgbm8gYnJpZGdlX3BkZXYgYW5kIHdpbGwgY3Jhc2ggaGVyZSAKKwkvKiBzb21lIEFSTSBoYXZlIG5vIGJyaWRnZV9wZGV2IGFuZCB3aWxsIGNyYXNoIGhlcmUKIAkgKiBzbyB3ZSBzaG91bGQgY2hlY2sgaWYgYnJpZGdlX3BkZXYgaXMgTlVMTCAqLwogCWlmIChicmlkZ2VfcGRldikgewogCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvcmlkID0gYnJpZGdlX3BkZXYtPnZlbmRvcjsKQEAgLTIxODcsNyArMjE4Nyw3IEBACiAJfQogCiAJcnRscGNpLT51c2luZ19tc2kgPSB0cnVlOwotCQorCiAJUlRfVFJBQ0UoQ09NUF9JTklUfENPTVBfSU5UUiwgREJHX0RNRVNHLCAoIk1TSSBJbnRlcnJ1cHQgTW9kZSFcbiIpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxOTgsNyArMjE5OCw3IEBACiAJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihwY2lwcml2KTsKIAlpbnQgcmV0OwotCQorCiAJcmV0ID0gcmVxdWVzdF9pcnEocnRscGNpLT5wZGV2LT5pcnEsICZfcnRsX3BjaV9pbnRlcnJ1cHQsCiAJCQkgIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgaHcpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0yMjA2LDcgKzIyMDYsNyBAQAogCX0KIAogCXJ0bHBjaS0+dXNpbmdfbXNpID0gZmFsc2U7Ci0JUlRfVFJBQ0UoQ09NUF9JTklUfENPTVBfSU5UUiwgREJHX0RNRVNHLCAKKwlSVF9UUkFDRShDT01QX0lOSVR8Q09NUF9JTlRSLCBEQkdfRE1FU0csCiAJCSAoIlBpbi1iYXNlZCBJbnRlcnJ1cHQgTW9kZSFcbiIpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIyOTMsNyArMjI5Myw3IEBACiAJLyoKIAkgKmluaXQgZGJncCBmbGFncyBiZWZvcmUgYWxsCiAJICpvdGhlciBmdW5jdGlvbnMsIGJlY2F1c2Ugd2Ugd2lsbAotCSAqdXNlIGl0IGluIG90aGVyIGZ1bnRpb25zIGxpa2UKKwkgKnVzZSBpdCBpbiBvdGhlciBmdW5jdGlvbnMgbGlrZQogCSAqUlRfVFJBQ0UvUlRfUFJJTlQvUlRMX1BSSU5UX0RBVEEKIAkgKnlvdSBjYW4gbm90IHVzZSB0aGVzZSBtYWNybwogCSAqYmVmb3JlIHRoaXMKQEAgLTIzNzcsNyArMjM3Nyw3IEBACiAJfSBlbHNlIHsKIAkJcnRscHJpdi0+bWFjODAyMTEubWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CiAJfQotCS8qIHRoZSB3aXBoeSBtdXN0IGhhdmUgYmVlbiByZWdpc3RlZCB0byAKKwkvKiB0aGUgd2lwaHkgbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZWQgdG8KIAkgKiBjZmc4MDIxMSBwcmlvciB0byByZWd1bGF0b3J5X2hpbnQgKi8KIAlpZiAocmVndWxhdG9yeV9oaW50KGh3LT53aXBoeSwgcnRscHJpdi0+cmVnZC5hbHBoYTIpKSB7CiAJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywgKCJyZWd1bGF0b3J5X2hpbnQgZmFpbFxuIikpOwpAQCAtMjQyOCwxMyArMjQyOCwxMyBAQAogCXJldHVybiAtRU5PREVWOwogCiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9wcm9iZSk7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9wY2lfcHJvYmUpOyAqLwogCiBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpydGxfcGNpX2dldF9od19wb2ludGVyKHZvaWQpCiB7CiAJcmV0dXJuIGh3X2V4cG9ydDsKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfcGNpX2dldF9od19wb2ludGVyKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX3BjaV9nZXRfaHdfcG9pbnRlcik7ICovCiAKIHZvaWQgcnRsX3BjaV9kaXNjb25uZWN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewpAQCAtMjQ1MCw3ICsyNDUwLDcgQEAKIAogCS8qIGFkZCBmb3IgcHJvdiAqLwogCXJ0bF9wcm9jX3JlbW92ZV9vbmUoaHcpOwotCQorCiAKIAkvKmllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IHdpbGwgY2FsbCBvcHNfc3RvcCAqLwogCWlmIChydGxtYWMtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPT0gMSkgewpAQCAtMjQ5MSw3ICsyNDkxLDcgQEAKIAogCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfcGNpX2Rpc2Nvbm5lY3QpOworLyogRVhQT1JUX1NZTUJPTChydGxfcGNpX2Rpc2Nvbm5lY3QpOyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBrZXJuZWwgcGNpIHBvd2VyIHN0YXRlIGRlZmluZToKQEAgLTI1MTksNyArMjUxOSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfcGNpX3N1c3BlbmQpOworLyogRVhQT1JUX1NZTUJPTChydGxfcGNpX3N1c3BlbmQpOyAqLwogCiBpbnQgcnRsX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMjUyOSwxMCArMjUyOSwxMCBAQAogCiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmh3X3Jlc3VtZShodyk7CiAJcnRsX2luaXRfcmZraWxsKGh3KTsKLQkKKwogCXJldHVybiAwOwogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfcmVzdW1lKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX3BjaV9yZXN1bWUpOyAqLwogCiBzdHJ1Y3QgcnRsX2ludGZfb3BzIHJ0bF9wY2lfb3BzID0gewogCS5yZWFkX2VmdXNlX2J5dGUgPSByZWFkX2VmdXNlX2J5dGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuaAppbmRleCA5ZjIwNjU1Li4wNmVhYTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmgKQEAgLTE0OCwxMSArMTQ4LDExIEBACiAgICogUlggd2lmaSBpbmZvID09IFJYIGRlc2NyaXB0b3IgaW4gb2xkIGZsb3cgKi8KIHN0cnVjdCBydGxfdHhfYnVmZmVyX2Rlc2MgewogI2lmIChSVEw4MTkyRUVfU0VHX05VTSA9PSAyKQotCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSo4XTsgLy9zZWcgPSA4CisJdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjhdOyAvKiBzZWcgPSA4ICovCiAjZWxpZiAoUlRMODE5MkVFX1NFR19OVU0gPT0gMSkKLQl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqNF07IC8vc2VnID0gNAorCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSo0XTsgLyogc2VnID0gNCAqLwogI2VsaWYgKFJUTDgxOTJFRV9TRUdfTlVNID09IDApCi0JdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjJdOyAvL3NlZyA9IDIKKwl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqMl07IC8qIHNlZyA9IDIgKi8KICNlbmRpZgogfSBfX3BhY2tlZDsKIApAQCAtMTg3LDcgKzE4Nyw3IEBACiB9OwogCiBzdHJ1Y3QgcnRsODE5Ml9yeF9yaW5nIHsKLQlzdHJ1Y3QgcnRsX3J4X2Rlc2MgKmRlc2M7Lypmb3Igb2xkIHRyeCBmbG93LCBub3QgdWVzZCBpbiBuZXcgdHJ4Ki8KKwlzdHJ1Y3QgcnRsX3J4X2Rlc2MgKmRlc2M7Lypmb3Igb2xkIHRyeCBmbG93LCBub3QgdXNlZCBpbiBuZXcgdHJ4Ki8KIAkvKmRtYSBtYXRjaGVzIGVpdGhlciAnZGVzYycgb3IgJ2J1ZmZlcl9kZXNjJyovCiAJZG1hX2FkZHJfdCBkbWE7CiAJdW5zaWduZWQgaW50IGlkeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuYwppbmRleCBmMTJmZmE4Li43ODc2NDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wcy5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJICpEbyBub3QgZW50ZXIgSVBTIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAkJICooMSkgUkYgaXMgYWxyZWFkeSBPRkYgb3IgU2xlZXAKIAkJICooMikgYl9zd3JmX3Byb2Nlc3NpbmcgKGluZGljYXRlcyB0aGUgSVBTIGlzIHN0aWxsIHVuZGVyIGdvaW5nKQotCQkgKigzKSBDb25uZWN0dGVkIChvbmx5IGRpc2Nvbm5lY3RlZCBjYW4gdHJpZ2dlciBJUFMpCisJCSAqKDMpIENvbm5lY3RlZCAob25seSBkaXNjb25uZWN0ZWQgY2FuIHRyaWdnZXIgSVBTKQogCQkgKig0KSBJQlNTIChzZW5kIEJlYWNvbikKIAkJICooNSkgQVAgbW9kZSAoc2VuZCBCZWFjb24pCiAJCSAqKDYpIG1vbml0b3IgbW9kZSAocmN2IHBhY2tldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmMKaW5kZXggZDg5ZjE1Yy4uMGE0YjM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCX0KIAogCS8qCi0JICpJZiBhIGNvdW50cnkgSUUgaGFzIGJlZW4gcmVjaWV2ZWQgY2hlY2sgaXRzIHJ1bGUgZm9yIHRoaXMKKwkgKklmIGEgY291bnRyeSBJRSBoYXMgYmVlbiByZWNlaXZlZCBjaGVjayBpdHMgcnVsZSBmb3IgdGhpcwogCSAqY2hhbm5lbCBmaXJzdCBiZWZvcmUgZW5hYmxpbmcgYWN0aXZlIHNjYW4uIFRoZSBwYXNzaXZlIHNjYW4KIAkgKndvdWxkIGhhdmUgYmVlbiBlbmZvcmNlZCBieSB0aGUgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIG91cgogCSAqY3VzdG9tIHJlZ3VsYXRvcnkgZG9tYWluLgpAQCAtNDU1LDcgKzQ1NSw3IEBACiAKIAlpZiAocnRscHJpdi0+cmVnZC5jb3VudHJ5X2NvZGUgPj0gQ09VTlRSWV9DT0RFX01BWCkgewogCQlSVF9UUkFDRShDT01QX1JFR0QsIERCR19ETUVTRywKLQkJCSAoS0VSTl9ERUJVRyAicnRsOiBFRVBST00gaW5kaWNhdGVzIGludmFsaWQgY29udHJ5IGNvZGUiCisJCQkgKEtFUk5fREVCVUcgInJ0bDogRUVQUk9NIGluZGljYXRlcyBpbnZhbGlkIGNvdW50cnkgY29kZSIKIAkJCSAgIndvcmxkIHdpZGUgMTMgc2hvdWxkIGJlIHVzZWRcbiIpKTsKIAogCQlydGxwcml2LT5yZWdkLmNvdW50cnlfY29kZSA9IENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuaAppbmRleCBhYmM2MGFiLi5kY2ViM2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuaApAQCAtMzAsOCArMzAsOCBAQAogI2lmbmRlZiBfX1JUTF9SRUdEX0hfXwogI2RlZmluZSBfX1JUTF9SRUdEX0hfXwogCi0jZGVmaW5lIElFRUU4MDIxMV9DSEFOX05PX0lCU1MJCTE8PDIKLSNkZWZpbmUgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOCTE8PDEKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fTk9fSUJTUwkJKDEgPDwgMikKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOCSgxIDw8IDEpCiAjZGVmaW5lIFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkJQklUKDApCiAjZGVmaW5lIFdJUEhZX0ZMQUdfU1RSSUNUX1JFR1VMQVRPUlkJQklUKDEpCiAjZGVmaW5lIFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMJQklUKDIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZG0uYwppbmRleCA4NjM0MjA2Li5lMGVmY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RtLmMKQEAgLTczMSw3ICs3MzEsNyBAQAogCQlydGxfZG1fZGlnLT5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPQogCQkgICAgcnRscHJpdi0+ZG0uZW50cnlfbWluX3VuZGVjb3JhdGVkc21vb3RoZWRfcHdkYjsKIAkJUlRfVFJBQ0UoQ09NUF9CQl9QT1dFUlNBVklORywgREJHX0xPVUQsCi0JCQkgKCJBUCBFeHQgUG9ydCBvciBkaXNjb25uZXQgUFdEQiA9IDB4JXggXG4iLAorCQkJICgiQVAgRXh0IFBvcnQgb3IgZGlzY29ubmVjdCBQV0RCID0gMHgleCBcbiIsCiAJCQkgIHJ0bF9kbV9kaWctPm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSkpOwogCX0KIAlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsICgiTWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPSVkXG4iLApAQCAtOTI1LDcgKzkyNSw3IEBACiAKIAlpZiAocnRscHJpdi0+ZmFsc2VhbG1fY250LmNudF9hbGwgPiAxMDAwMCkgewogCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsCi0JCQkoInJ0bDg4MjFhZV9kbV9kaWcoKTogQWJub3JuYWxseSBmYWxzZSBhbGFybSBjYXNlLiBcbiIpKTsKKwkJCSgicnRsODgyMWFlX2RtX2RpZygpOiBBYm5vcm1hbGx5IGZhbHNlIGFsYXJtIGNhc2UuIFxuIikpOwogCiAJCWlmIChkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgIT0gMykKIAkJICAgICAgICBkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQrKzsKQEAgLTEwODcsNyArMTA4Nyw3IEBACiAJZWxzZQogCQlmYWxzZWFsbV9jbnQtPmNudF9hbGwgPSBmYWxzZWFsbV9jbnQtPmNudF9vZmRtX2ZhaWw7CiAKLQkvKnJlc2V0IE9GRE0gRkEgY291dG5lciovCisJLypyZXNldCBPRkRNIEZBIGNvdW50ZXIqLwogCXJ0bF9zZXRfYmJyZWcoaHcsIE9ETV9SRUdfT0ZETV9GQV9SU1RfMTFBQywgQklUKDE3KSwgMSk7CiAJcnRsX3NldF9iYnJlZyhodywgT0RNX1JFR19PRkRNX0ZBX1JTVF8xMUFDLCBCSVQoMTcpLCAwKTsKIAkvKiByZXNldCBDQ0sgRkEgY291bnRlciovCkBAIC0xMzE2LDcgKzEzMTYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CW9kbV9UeFB3clRyYWNrU2V0UHdyODhFKCkKICAqCi0gKiBPdmVydmlldzoJODhFIGNoYW5nZSBhbGwgY2hhbm5lbCB0eCBwb3dlciBhY2NvcmRpZ24gdG8gZmxhZy4KKyAqIE92ZXJ2aWV3Ogk4OEUgY2hhbmdlIGFsbCBjaGFubmVsIHR4IHBvd2VyIGFjY29yZGluZyB0byBmbGFnLgogICoJCQkJT0ZETSAmIENDSyBhcmUgYWxsIGRpZmZlcmVudC4KICAqCiAgKiBJbnB1dDoJCU5PTkUKQEAgLTE1MzcsNyArMTUzNyw3IEBACiAJCQkJCXJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2IgPSBmYWxzZTsKIAogCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKLQkJCQkJCSgiKioqKioqUGF0aF9CIHBETV9PZG0tPk1vZGlmeV9UeEFHQ19GbGFnID0gRkFMU0UgXG4iKSk7CisJCQkJCQkoIioqKioqKlBhdGhfQiBkbV9PZG0tPk1vZGlmeV9UeEFHQ19GbGFnID0gRkFMU0UgXG4iKSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xNjU0LDcgKzE2NTQsNyBAQAogCiAJaWYgKGRlbHRhID4gMCAmJiBydGxkbS0+dHhwb3dlcl90cmFja19jb250cm9sKQogCXsKLQkJLyoiZGVsdGEiIGhlcmUgaXMgdXNlZCB0byByZWNvcmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGRpZmZlcnJlbmNlLiovCisJCS8qImRlbHRhIiBoZXJlIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBkaWZmZXJlbmNlLiovCiAJICAgIAlkZWx0YSA9IHRoZXJtYWxfdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA/IFwKIAkJICAgIAkodGhlcm1hbF92YWx1ZSAtIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSA6IFwKIAkJICAgIAkocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsX3ZhbHVlKTsKQEAgLTE5NzYsNyArMTk3Niw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbjoJb2RtX1R4UHdyVHJhY2tTZXRQd3I4OEUoKQogICoKLSAqIE92ZXJ2aWV3Ogk4OEUgY2hhbmdlIGFsbCBjaGFubmVsIHR4IHBvd2VyIGFjY29yZGlnbiB0byBmbGFnLgorICogT3ZlcnZpZXc6CTg4RSBjaGFuZ2UgYWxsIGNoYW5uZWwgdHggcG93ZXIgYWNjb3JkaW5nIHRvIGZsYWcuCiAgKgkJCQlPRkRNICYgQ0NLIGFyZSBhbGwgZGlmZmVyZW50LgogICoKICAqIElucHV0OgkJTk9ORQpAQCAtMjE1OSw3ICsyMTU5LDcgQEAKIAl1OCAqZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9iOwogCXU4ICpkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYjsKIAotCS8qMi4gSW5pdGlsaXphdGlvbiAoIDcgc3RlcHMgaW4gdG90YWwgKSovCisJLyoyLiBJbml0aWFsaXphdGlvbiAoIDcgc3RlcHMgaW4gdG90YWwgKSovCiAJcnRsODgyMWFlX2dldF9kZWx0YV9zd2luZ190YWJsZShodywgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYSwKIAkJCQkJCQkJCSh1OCoqKSZkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYSwKIAkJCQkJCQkJCSAgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYiwKQEAgLTIyNDQsNyArMjI0NCw3IEBACiAKIAlpZiAoZGVsdGEgPiAwICYmIHJ0bGRtLT50eHBvd2VyX3RyYWNrX2NvbnRyb2wpCiAJewotCQkvKiJkZWx0YSIgaGVyZSBpcyB1c2VkIHRvIHJlY29yZCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgZGlmZmVycmVuY2UuKi8KKwkJLyoiZGVsdGEiIGhlcmUgaXMgdXNlZCB0byByZWNvcmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGRpZmZlcmVuY2UuKi8KIAkgICAgCWRlbHRhID0gdGhlcm1hbF92YWx1ZSA+IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyID8gXAogCQkgICAgCSh0aGVybWFsX3ZhbHVlIC0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpIDogXAogCQkgICAgCShydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciAtIHRoZXJtYWxfdmFsdWUpOwpAQCAtMjYxMywxMSArMjYxMywxMSBAQAogCVJUX1RSQUNFKENPTVBfVFVSQk8sIERCR19MT1VELAogCQkoInJ0bDg4MjFhZV9kbV9jaGVja19lZGNhX3R1cmJvPT09PT0+IikpOwogCVJUX1RSQUNFKENPTVBfVFVSQk8sIERCR19MT1VELAotCQkoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLAorCQkoIk9yaWdpbmFsIEJFIFBBUkFNOiAweCV4XG4iLAogCQlydGxfcmVhZF9kd29yZChydGxwcml2LCBETV9SRUdfRURDQV9CRV8xMU4pKSk7CiAKIAkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlsaXN0IHBhcmFtdGVyIGZvciBkaWZmZXJlbnQgcGxhdGZvcm0KKwlsaXN0IHBhcmFtZXRlciBmb3IgZGlmZmVyZW50IHBsYXRmb3JtCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAJYl9sYXN0X2lzX2N1cl9yZGxfc3RhdGUgPSBydGxwcml2LT5kbS5iaXNfY3VyX3JkbHN0YXRlOwogCXBiX2lzX2N1cl9yZGxfc3RhdGUgPSAmKCBydGxwcml2LT5kbS5iaXNfY3VyX3JkbHN0YXRlKTsKQEAgLTI5NjMsNyArMjk2Myw3IEBACiAJCQkiQ3J5c3RhbCBjYXAgPSAweCV4LCBDcnlzdGFsIGNhcCBvZmZzZXQgPSAlZFxuIiwKIAkJCXJ0bGRtLT5jcnlzdGFsX2NhcCwgYWRqdXN0X3h0YWwpKTsKIAotCQkvKjMuQWRqdWR0IENyeXN0YWwgQ2FwLiovCisJCS8qMy5BZGp1c3QgQ3J5c3RhbCBDYXAuKi8KIAkJaWYgKGFkanVzdF94dGFsICE9IDApewogCQkJcnRsZG0tPmlzX2ZyZWV6ZSA9IDA7CiAJCQlydGxkbS0+Y3J5c3RhbF9jYXAgKz0gYWRqdXN0X3h0YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZncuYwppbmRleCA0MDgzY2FiLi40NmViNDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2Z3LmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAJaWYgKGNvdW50ZXIgPj0gRldfODgyMUFFX1BPTExJTkdfVElNRU9VVF9DT1VOVCkgewogCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgKCJjaGtzdW0gcmVwb3J0IGZhaWxsICEgUkVHX01DVUZXREw6MHglMDh4IC5cbiIsCisJCQkgKCJjaGtzdW0gcmVwb3J0IGZhaWwgISBSRUdfTUNVRldETDoweCUwOHggLlxuIiwKIAkJCSAgdmFsdWUzMikpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzY4LDcgKzM2OCw3IEBACiAJCQkJd2FpdF9oMmNfbGltbWl0LS07CiAJCQkJaWYgKHdhaXRfaDJjX2xpbW1pdCA9PSAwKSB7CiAJCQkJCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfTE9VRCwKLQkJCQkJCSAoIldhdGluZyB0b28gbG9uZyBmb3IgRlcgcmVhZCAiCisJCQkJCQkgKCJXYWl0aW5nIHRvbyBsb25nIGZvciBGVyByZWFkICIKIAkJCQkJCSAgImNsZWFyIEhNRUJveCglZCkhXG4iLCBib3hudW0pKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMzc4LDcgKzM3OCw3IEBACiAJCQkJaXNmd19yZWFkID0gX3J0bDg4MjFhZV9jaGVja19md19yZWFkX2xhc3RfaDJjKGh3LCBib3hudW0pOwogCQkJCXUxYl90bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIDB4MTMwKTsKIAkJCQlSVF9UUkFDRShDT01QX0NNRCwgREJHX0xPVUQsCi0JCQkJCSAoIldhdGluZyBmb3IgRlcgcmVhZCBjbGVhciBITUVCb3goJWQpISEhICIKKwkJCQkJICgiV2FpdGluZyBmb3IgRlcgcmVhZCBjbGVhciBITUVCb3goJWQpISEhICIKIAkJCQkJICAiMHgxMzAgPSAlMnhcbiIsIGJveG51bSwgdTFiX3RtcCkpOwogCQkJfQogCQl9CkBAIC0xMTc5LDcgKzExNzksNyBAQAogCQkJICgiU2V0IFJTVkQgcGFnZSBsb2NhdGlvbiB0byBGdyBGQUlMISEhISEhLlxuIikpOwogfQogCi0vKlNob3VkIGNoZWNrIEZXIHN1cHBvcnQgcDJwIG9yIG5vdC4qLworLypTaG91bGQgY2hlY2sgRlcgc3VwcG9ydCBwMnAgb3Igbm90LiovCiB2b2lkIHJ0bDg4MjFhZV9zZXRfcDJwX2N0d19wZXJpb2RfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjdHdpbmRvdykKIHsKIAl1OCB1MV9jdHdpbmRvd19wZXJpb2RbMV0gPXsgY3R3aW5kb3d9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idF9jb2V4aXN0LmgKaW5kZXggNzk5Y2M2Zi4uYjM2NWY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRfY29leGlzdC5oCkBAIC0xNDIsNyArMTQyLDcgQEAKIGxvbmcgcnRsODgyMWFlX2RtX2J0X2dldF9yeF9zcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIHJ0bDg4MjFhZV9kbV9idF9iYWxhbmNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJYm9vbCBiX2JhbGFuY2Vfb24sIHU4IG1zMCwgdTggbXMxKTsKLXZvaWQgcnRsODgyMWFlX2RtX2J0X2FnY190YWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHllcCk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9idF9hZ2NfdGFibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5cGUpOwogdm9pZCBydGw4ODIxYWVfZG1fYnRfYmJfYmFja19vZmZfbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5cGUpOwogdTggcnRsODgyMWFlX2RtX2J0X2NoZWNrX2NvZXhfcnNzaV9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkJCXU4CWxldmVsX251bSwgdTgJcnNzaV90aHJlc2gsIHU4IHJzc2lfdGhyZXNoMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRjLmMKaW5kZXggNzkzODZlZS4uN2IxZDExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0Yy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCSYmKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5wcmV2aW91c19zdGF0ZV9oCiAJCT09IHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2gpKSB7CiAJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAotCQkJCSgiW0RNXVtCVF0sIENvZXhpc3Qgc3RhdGUgZG8gbm90IGNoYW5nISFcbiIpKTsKKwkJCQkoIltETV1bQlRdLCBDb2V4aXN0IHN0YXRlIGRvIG5vdCBjaGFuZ2UhIVxuIikpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9IGVsc2UgewogCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKQEAgLTkwMiw3ICs5MDIsNyBAQAogCiAJLyoKIAkgKiBOb3RlOgotCSAqIFdlIHNob3VsZCBhZGQgZGVsYXkgZm9yIG1ha2luZyBzdXJlIHN3IERhY1N3aW5nIGNhbiBiZSBzZXQgc3VjZXNzZnVsbHkuCisJICogV2Ugc2hvdWxkIGFkZCBkZWxheSBmb3IgbWFraW5nIHN1cmUgc3cgRGFjU3dpbmcgY2FuIGJlIHNldCBzdWNjZXNzZnVsbHkuCiAJICogYmVjYXVzZSBvZiB0aGF0IHJ0bDg4MjFhZV9kbV9idF9zZXRfZndfMl9hbnRfaGlkKCkgYW5kIHJ0bDg4MjFhZV9kbV9idF9zZXRfZndfdGRtYV9jdHJsKCkKIAkgKiB3aWxsIG92ZXJ3cml0ZSB0aGUgcmVnIDB4ODgwLgogCSovCkBAIC0yMDI1LDcgKzIwMjUsNyBAQAogCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDFBRiwgMHgwMCk7CiAJCXJldHVybjsKIAl9Ci0JcHRtcF9idWYgPSAodTggKikga21hbGxvYyhjMmhfZXZlbnQuY21kX2xlbiwgR0ZQX0tFUk5FTCk7CisJcHRtcF9idWYgPSBrbWFsbG9jKGMyaF9ldmVudC5jbWRfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZihwdG1wX2J1ZiA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKENPTVBfRlcsIERCR19UUkFDRSwgKCJtYWxsb2MgY21kIGJ1ZiBmYWlsZWRcbiIpKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmMKaW5kZXggNWVkN2ExMS4uMWI4NTgzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9ody5jCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXJ0bGhhbC0+YmZ3X2Nsa19jaGFuZ2VfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5md19wc19sb2NrKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC0xMDE2LDcgKzEwMTcsNyBAQAogCS8qIEFSRkIgdGFibGUgMTIgZm9yIDExYWMgMjRHIDFTUyAqLwogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQVJGUjMsIDB4MDAwMDAwMTUpOwogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQVJGUjMgKyA0LCAweGZmY2ZmMDAwKTsKLQkvKiAweDQyMFs3XSA9IDAgLCBlbmFibGUgcmV0cnkgQU1QRFUgaW4gbmV3IEFNUEQgbm90IHNpbmdhbCBNUERVLiAqLworCS8qIDB4NDIwWzddID0gMCAsIGVuYWJsZSByZXRyeSBBTVBEVSBpbiBuZXcgQU1QRCBub3Qgc2lnbmFsIE1QRFUuICovCiAJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwsIDB4MUYwMCk7CiAJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FNUERVX01BWF9USU1FLCAweDcwKTsKIApAQCAtMTQwNiw3ICsxNDA3LDcgQEAKIAlydGw4ODIxYWVfcGh5X21hY19jb25maWcoaHcpOwogCS8qIGJlY2F1c2UgbGFzdCBmdW5jdGlvbiBtb2RpZnkgUkNSLCBzbyB3ZSB1cGRhdGUKIAkgKiByY3IgdmFyIGhlcmUsIG9yIFRQIHdpbGwgdW5zdGFibGUgZm9yIHJlY2VpdmVfY29uZmlnCi0JICogaXMgd3JvbmcsIFJYIFJDUl9BQ1JDMzIgd2lsbCBjYXVzZSBUUCB1bnN0YWJlbCAmIFJ4CisJICogaXMgd3JvbmcsIFJYIFJDUl9BQ1JDMzIgd2lsbCBjYXVzZSBUUCB1bnN0YWJsZSAmIFJ4CiAJICogUkNSX0FQUF9JQ1Ygd2lsbCBjYXVzZSBtYWM4MDIxMSB1bmFzc29jIGZvciBjaXNjbyAxMjUyCiAJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IpOwogCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgJj0gfihSQ1JfQUNSQzMyIHwgUkNSX0FJQ1YpOwpAQCAtMTU2Miw3ICsxNTYzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKLQkJCQkoIkNoaXAgVmVyc2lvbiBJRDogVW5rbm93ICgweCVYKS5cbiIsIHZlcnNpb24pKTsKKwkJCQkoIkNoaXAgVmVyc2lvbiBJRDogVW5rbm93biAoMHglWCkuXG4iLCB2ZXJzaW9uKSk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTE2MjIsNyArMTYyMyw3IEBACiAKIAlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoTVNSKSwgYnRfbXNyKTsKIAlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsIGxlZGFjdGlvbik7Ci0JaWYgKChidF9tc3IgJiAweGZjKSA9PSBNU1JfQVApCisJaWYgKChidF9tc3IgJiB+MHhmYykgPT0gTVNSX0FQKQogCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQkNOVENGRyArIDEsIDB4MDApOwogCWVsc2UKIAkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTlRDRkcgKyAxLCAweDY2KTsKQEAgLTIzNzEsNyArMjM3Miw3IEBACiAJaWYgKHJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPT0gMHhmZikKIAkJcnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbiA9IDB4N0Y7CiAKLQkvKiBzZXQgY2hhbm5lbCBwYWxuIHRvIHdvcmxkIHdpZGUgMTMgKi8KKwkvKiBzZXQgY2hhbm5lbCBwbGFuIHRvIHdvcmxkIHdpZGUgMTMgKi8KIAkvL3J0bGVmdXNlLT5jaGFubmVsX3BsYW4gPSAodTgpIHJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW47CiAKIAkvKnBhcnNlIHh0YWwqLwpAQCAtMjUzNCw3ICsyNTM1LDcgQEAKIAlpZiAocnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbiA9PSAweGZmKQogCQlydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID0gMHg3RjsKIAotCS8qIHNldCBjaGFubmVsIHBhbG4gdG8gd29ybGQgd2lkZSAxMyAqLworCS8qIHNldCBjaGFubmVsIHBsYW4gdG8gd29ybGQgd2lkZSAxMyAqLwogCS8vcnRsZWZ1c2UtPmNoYW5uZWxfcGxhbiA9ICh1OCkgcnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbjsKIAogCS8qcGFyc2UgeHRhbCovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5jCmluZGV4IGQwMmZjYTMuLjFkZDMzMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5jCkBAIC04Niw3ICs4Niw3IEBACiAJCQkvKiAweDhBQ1sxMToxMF0gPSAyJ2IxMCovCiAKIAotCQkvKiA8MjAxMjA5MTQsIEtvcmRhbj4gQSB3b3JrYXJvdWxkIHRvIHJlc29sdmUKKwkJLyogPDIwMTIwOTE0LCBLb3JkYW4+IEEgd29ya2Fyb3VuZCB0byByZXNvbHZlCiAJCTI0ODBNaHogc3B1ciBieSBzZXR0aW5nIEFEQyBjbG9jayBhcyAxNjBNLiAoQXNrZWQgYnkgQmluc29uKSovCiAJCWlmIChiYW5kX3dpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgJiYKIAkJCShjaGFubmVsID09IDEzIHx8IGNoYW5uZWwgPT0gMTQpKSB7CkBAIC0xMDcsNyArMTA3LDcgQEAKIAl9CiAJZWxzZSBpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQogCXsKLQkJLyogPDIwMTIwOTE0LCBLb3JkYW4+IEEgd29ya2Fyb3VsZCB0byByZXNvbHZlCisJCS8qIDwyMDEyMDkxNCwgS29yZGFuPiBBIHdvcmthcm91bmQgdG8gcmVzb2x2ZQogCQkyNDgwTWh6IHNwdXIgYnkgc2V0dGluZyBBREMgY2xvY2sgYXMgMTYwTS4gKEFza2VkIGJ5IEJpbnNvbikqLwogCQlpZiAoYmFuZF93aWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwICYmCiAJCQkoY2hhbm5lbCA9PSAxMyB8fCBjaGFubmVsID09IDE0KSkKQEAgLTQ0MSw4ICs0NDEsOCBAQAogCXN0cnVjdCBydGxfZG0gKnJ0bGRtID0gcnRsX2RtKHJ0bHByaXYpOwogCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CiAKLQljaGFyIGJiX3N3aW5nXzJnID0gKGNoYXIpICgtMSAqIDB4RkYpOwotCWNoYXIgYmJfc3dpbmdfNWcgPSAoY2hhcikgKC0xICogMHhGRik7CisJY2hhciBiYl9zd2luZ18yZyA9IChjaGFyKSAoKC0xICogMHhGRikgJiAweEZGKTsKKwljaGFyIGJiX3N3aW5nXzVnID0gKGNoYXIpICgoLTEgKiAweEZGKSAmIDB4RkYpOwogCXUzMiAgb3V0ID0gMHgyMDA7CiAJY29uc3QgY2hhciBhdXRvX3RlbXAgPSAtMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuaAppbmRleCBhOTMyZDhjLi5hODBiZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuaApAQCAtMzAsNyArMzAsNyBAQAogI2lmbmRlZiBfX1JUTDg4MjFBRV9QSFlfSF9fCiAjZGVmaW5lIF9fUlRMODgyMUFFX1BIWV9IX18KIAotLypJdCBtdXN0IGFsd2F5cyBzZXQgdG8gNCwgb3RoZXJ3aXNlIHJlYWQgZWZ1c2UgdGFibGUgc2VjcXVlbmNlIHdpbGwgYmUgd3JvbmcuKi8KKy8qSXQgbXVzdCBhbHdheXMgc2V0IHRvIDQsIG90aGVyd2lzZSByZWFkIGVmdXNlIHRhYmxlIHNlcXVlbmNlIHdpbGwgYmUgd3JvbmcuKi8KICNkZWZpbmUgTUFYX1RYX0NPVU5UCTQKICNkZWZpbmUJVFhfMVMJCQkwCiAjZGVmaW5lCVRYXzJTCQkJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXEuaAppbmRleCA4YjM5YzA0Li40ODBhNmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXEuaApAQCAtODEsNyArODEsNyBAQAogCXsweDAwNDcsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMH0sLyogMHg0N1s3OjBdID0gMDAgZ3BpbyBtb2RlICovCVwKIAl7MHgwMDA3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qIHN1c3BlbmQgb3B0aW9uIGFsbCBvZmYgKi8JXAogCXsweDAwMTQsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHg4MCwgQklUN30sLyoweDE0WzddID0gMSB0dXJuIG9uIFpDRCAqLwlcCi0JezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCBCSVQwfSwvKiAweDE1WzBdID0xIHRydW4gb24gWkNEICovCVwKKwl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIEJJVDB9LC8qIDB4MTVbMF0gPTEgdHVybiBvbiBaQ0QgKi8JXAogCXsweDAwMjMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgxMCwgQklUNH0sLyoweDIzWzRdID0gMSBocG9uIExETyBzbGVlcCBtb2RlICovCVwKIAl7MHgwMDA4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDIsIDB9LC8qMHg4WzFdID0gMCBBTkEgY2xrID01MDBrICovCVwKIAl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDMsIEJJVDN9LCAvKjB4MDRbMTFdID0gMmInMTEgZW5hYmxlIFdMIHN1c3BlbmQgZm9yIFBDSWUqLwpAQCAtOTEsNyArOTEsNyBAQAogCS8qIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sIC8vIGNvbW1lbnRzIGhlcmUqLwkJCQkJCQkJXAogCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMywgMH0sIC8qMHgwNFsxMV0gPSAyYicwMWVuYWJsZSBXTCBzdXNwZW5kKi8gICBcCiAJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDEwLCAwfSwvKjB4MjNbNF0gPSAwIGhwb24gTERPIHNsZWVwIG1vZGUgbGVhdmUgKi8JXAotCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgMH0sLyogMHgxNVswXSA9MCB0cnVuIG9mZiBaQ0QgKi8JXAorCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgMH0sLyogMHgxNVswXSA9MCB0dXJuIG9mZiBaQ0QgKi8JXAogCXsweDAwMTQsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHg4MCwgMH0sLyoweDE0WzddID0gMCB0dXJuIG9mZiBaQ0QgKi8JXAogCXsweDAwNDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbzB+NyBpbnB1dCBtb2RlICovCVwKIAl7MHgwMDQzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDB9LC8qIGdwaW8xMSBpbnB1dCBtb2RlLCBncGlvMTB+OCBpbnB1dCBtb2RlICovCkBAIC0xMTAsNyArMTEwLDcgQEAKIAl7MHgwMDQ2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4ZmZ9LC8qIGdwaW8wfjcgb3V0cHV0IG1vZGUgKi8JXAogCXsweDAwNDcsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMH0sLyogMHg0N1s3OjBdID0gMDAgZ3BpbyBtb2RlICovCVwKIAl7MHgwMDE0LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4ODAsIEJJVDd9LC8qMHgxNFs3XSA9IDEgdHVybiBvbiBaQ0QgKi8JXAotCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgQklUMH0sLyogMHgxNVswXSA9MSB0cnVuIG9uIFpDRCAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCBCSVQwfSwvKiAweDE1WzBdID0xIHR1cm4gb24gWkNEICovCVwKIAl7MHgwMDEyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIDB9LC8qMHgxMlswXSA9IDAgZm9yY2UgUEZNIG1vZGUgKi8JXAogCXsweDAwMjMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgxMCwgQklUNH0sLyoweDIzWzRdID0gMSBocG9uIExETyBzbGVlcCBtb2RlICovCVwKIAl7MHgwMDA4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDIsIDB9LC8qMHg4WzFdID0gMCBBTkEgY2xrID01MDBrICovCVwKQEAgLTEyNCw3ICsxMjQsNyBAQAogCS8qIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sIC8vIGNvbW1lbnRzIGhlcmUqLyAgICAgICAgICAgICAgICAgICAgICAgXAogCXsweDAwMTIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgQklUMH0sLyoweDEyWzBdID0gMSBmb3JjZSBQV00gbW9kZSAqLwlcCiAJezB4MDAxNCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDgwLCAwfSwvKjB4MTRbN10gPSAwIHR1cm4gb2ZmIFpDRCAqLwlcCi0JezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKiAweDE1WzBdID0wIHRydW4gb2ZmIFpDRCAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKiAweDE1WzBdID0wIHR1cm4gb2ZmIFpDRCAqLwlcCiAJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDEwLCAwfSwvKjB4MjNbNF0gPSAwIGhwb24gTERPIGxlYXZlIHNsZWVwIG1vZGUgKi8JXAogCXsweDAwNDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbzB+NyBpbnB1dCBtb2RlICovCVwKIAl7MHgwMDQzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDB9LC8qIGdwaW8xMSBpbnB1dCBtb2RlLCBncGlvMTB+OCBpbnB1dCBtb2RlICovIFwKQEAgLTIwNCw3ICsyMDQsNyBAQAogCTQ6IExQUy0tTG93IFBvd2VyIFN0YXRlCiAJNTogU1VTLS1TdXNwZW5kCiAKLQlUaGUgdHJhbnNpc2lvbiBmcm9tIGRpZmZlcmVudCBzdGF0ZXMgYXJlIGRlZmluZWQgYmVsb3cKKwlUaGUgdHJhbnNpdGlvbiBmcm9tIGRpZmZlcmVudCBzdGF0ZXMgYXJlIGRlZmluZWQgYmVsb3cKIAlUUkFOU19DQVJERU1VX1RPX0FDVAogCVRSQU5TX0FDVF9UT19DQVJERU1VCiAJVFJBTlNfQ0FSREVNVV9UT19TVVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxY21kLmMKaW5kZXggNzEwYmMwMS4uZmYxODg3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxY21kLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCQkJdmFsdWUgPSB2YWx1ZSB8IChHRVRfUFdSX0NGR19WQUxVRShwd3JfY2ZnX2NtZCkKIAkJCQkJCQkmIEdFVF9QV1JfQ0ZHX01BU0socHdyX2NmZ19jbWQpKTsKIAotCQkJCQkvKldyaXRlIHRoZSB2YWx1ZSBiYWNrIHRvIHN5dGVtIHJlZ2lzdGVyKi8KKwkJCQkJLypXcml0ZSB0aGUgdmFsdWUgYmFjayB0byBzeXN0ZW0gcmVnaXN0ZXIqLwogCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBvZmZzZXQsIHZhbHVlKTsKIAkJCQl9CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JlZy5oCmluZGV4IDA5YzVmMDAuLmJlZmZiNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JlZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JlZy5oCkBAIC01OTYsMTMgKzU5NiwxMyBAQAogI2RlZmluZQlJTVJfQkNORE1BSU5UMwkJCUJJVCgyMykJCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDMJCSovCiAjZGVmaW5lCUlNUl9CQ05ETUFJTlQyCQkJQklUKDIyKQkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMgkJKi8KICNkZWZpbmUJSU1SX0JDTkRNQUlOVDEJCQlCSVQoMjEpCQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAxCQkqLwotI2RlZmluZQlJTVJfQkNORE9LNwkJCQlCSVQoMjApCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDcgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzYJCQkJQklUKDE5KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA2ICovCi0jZGVmaW5lCUlNUl9CQ05ET0s1CQkJCUJJVCgxOCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNSAqLwotI2RlZmluZQlJTVJfQkNORE9LNAkJCQlCSVQoMTcpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDQgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzMJCQkJQklUKDE2KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAzICovCi0jZGVmaW5lCUlNUl9CQ05ET0syCQkJCUJJVCgxNSkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMiAqLwotI2RlZmluZQlJTVJfQkNORE9LMQkJCQlCSVQoMTQpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDEgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzcJCQkJQklUKDIwKQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNyAqLworI2RlZmluZQlJTVJfQkNORE9LNgkJCQlCSVQoMTkpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA2ICovCisjZGVmaW5lCUlNUl9CQ05ET0s1CQkJCUJJVCgxOCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDUgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzQJCQkJQklUKDE3KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNCAqLworI2RlZmluZQlJTVJfQkNORE9LMwkJCQlCSVQoMTYpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAzICovCisjZGVmaW5lCUlNUl9CQ05ET0syCQkJCUJJVCgxNSkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDIgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzEJCQkJQklUKDE0KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgMSAqLwogI2RlZmluZQlJTVJfQVRJTUVORF9FCQlCSVQoMTMpCQkvKiBBVElNIFdpbmRvdyBFbmQgRXh0ZW5zaW9uIGZvciBXaW43ICovCiAjZGVmaW5lCUlNUl9UWEVSUgkJCQlCSVQoMTEpCQkvKiBUeCBFcnJvciBGbGFnIEludGVycnVwdCBTdGF0dXMsIHdyaXRlIDEgY2xlYXIuICovCiAjZGVmaW5lCUlNUl9SWEVSUgkJCQlCSVQoMTApCQkvKiBSeCBFcnJvciBGbGFnIElOVCBTdGF0dXMsIFdyaXRlIDEgY2xlYXIgKi8KQEAgLTYxMyw3ICs2MTMsNyBAQAogI2RlZmluZQlIV1NFVF9NQVhfU0laRQkJCQk1MTIKICNkZWZpbmUgICBFRlVTRV9NQVhfU0VDVElPTgkJCTY0CiAjZGVmaW5lICAgRUZVU0VfUkVBTF9DT05URU5UX0xFTgkJCTI1NgotI2RlZmluZSAJRUZVU0VfT09CX1BST1RFQ1RfQllURVMgICAgCTE4IAkvKiBQRyBkYXRhIGV4Y2x1ZGUgaGVhZGVyLCBkdW1teSA3IGJ5dGVzIGZyb21lIENQIHRlc3QgYW5kIHJlc2VydmVkIDFieXRlLiovCisjZGVmaW5lIAlFRlVTRV9PT0JfUFJPVEVDVF9CWVRFUyAgICAJMTggCS8qIFBHIGRhdGEgZXhjbHVkZSBoZWFkZXIsIGR1bW15IDcgYnl0ZXMgZnJvbSBDUCB0ZXN0IGFuZCByZXNlcnZlZCAxYnl0ZS4qLwogCiAKICNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfVFNTSQkJCQkJMHgwCkBAIC0xNTExLDcgKzE1MTEsNyBAQAogI2RlZmluZQlST0ZETTBfVFhDT0VGRjUJCQkJMHhjYjQKICNkZWZpbmUJUk9GRE0wX1RYQ09FRkY2CQkJCTB4Y2I4CiAKLS8qUGF0aF9BIFJGRSBjb3Ryb2wgKi8KKy8qUGF0aF9BIFJGRSBjb250cm9sICovCiAjZGVmaW5lCVJBX1JGRV9DVFJMXzg4MTIJCQkJMHhjYjgKIC8qUGF0aF9CIFJGRSBjb250cm9sKi8KICNkZWZpbmUJUkJfUkZFX0NUUkxfODgxMgkJCQkweGViOApAQCAtMjMzNiwxOSArMjMzNiwxOSBAQAogI2RlZmluZQkJV09MX1JFQVNPTl9ERUFVVEgJCQlCSVQoMykKICNkZWZpbmUJCVdPTF9SRUFTT05fRldfRElTQ09OTkVDVAlCSVQoNCkKIAotI2RlZmluZQkJUkFfUkZFX1BJTk1VWAkweGNiMCAgLyogUGF0aF9BIFJGRSBjb3Ryb2wgcGlubXV4Ki8KKyNkZWZpbmUJCVJBX1JGRV9QSU5NVVgJMHhjYjAgIC8qIFBhdGhfQSBSRkUgY29udHJvbCBwaW5tdXgqLwogI2RlZmluZQkJUkJfUkZFX1BJTk1VWAkweGViMCAvKiBQYXRoX0IgUkZFIGNvbnRyb2wgcGlubXV4Ki8KIAogI2RlZmluZQkJUkFfUkZFX0lOViAweGNiNAogI2RlZmluZQkJUkJfUkZFX0lOViAweGViNAogCiAvKiBSWElRQyAqLwotI2RlZmluZQkJUkFfUlhJUUNfQUIgICAgCTB4YzEwICAvKlJ4SVEgaW1ibGFuY2UgbWF0cml4IGNvZWZmLiBBICYgQiovCi0jZGVmaW5lCQlSQV9SWElRQ19DRCAgICAJMHhjMTQgIC8qUnhJUSBpbWJsYW5jZSBtYXRyaXggY29lZmYuIEMgJiBEKi8KKyNkZWZpbmUJCVJBX1JYSVFDX0FCICAgIAkweGMxMCAgLypSeElRIGltYmFsYW5jZSBtYXRyaXggY29lZmYuIEEgJiBCKi8KKyNkZWZpbmUJCVJBX1JYSVFDX0NEICAgIAkweGMxNCAgLypSeElRIGltYmFsYW5jZSBtYXRyaXggY29lZmYuIEMgJiBEKi8KICNkZWZpbmUJIAlSQV9UWFNDQUxFIAkJMHhjMWMgIC8qIFBhaF9BIFRYIHNjYWxpbmcgZmFjdG9yKi8KICNkZWZpbmUJCVJCX1RYU0NBTEUgCQkweGUxYyAgLyogUGF0aF9CIFRYIHNjYWxpbmcgZmFjdG9yKi8KLSNkZWZpbmUJCVJCX1JYSVFDX0FCICAgIAkweGUxMCAgLypSeElRIGltYmxhbmNlIG1hdHJpeCBjb2VmZi4gQSAmIEIqLwotI2RlZmluZQkJUkJfUlhJUUNfQ0QgICAgCTB4ZTE0ICAvKlJ4SVEgaW1ibGFuY2UgbWF0cml4IGNvZWZmLiBDICYgRCovCisjZGVmaW5lCQlSQl9SWElRQ19BQiAgICAJMHhlMTAgIC8qUnhJUSBpbWJhbGFuY2UgbWF0cml4IGNvZWZmLiBBICYgQiovCisjZGVmaW5lCQlSQl9SWElRQ19DRCAgICAJMHhlMTQgIC8qUnhJUSBpbWJhbGFuY2UgbWF0cml4IGNvZWZmLiBDICYgRCovCiAjZGVmaW5lCQlSWElRQ19BQwkJMHgwMmZmICAvKmJpdCBtYXNrIGZvciBJUUMgbWF0cml4IGVsZW1lbnQgQSAmIEMqLwogI2RlZmluZQkJUlhJUUNfQkQJCTB4MDJmZjAwMDAgLypiaXQgbWFzayBmb3IgSVFDIG1hdHJpeCBlbGVtZW50IEEgJiBDKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3N3LmMKaW5kZXggODVhMzQ3NC4uYThkMTc1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9zdy5jCkBAIC01Nyw5ICs1Nyw5IEBACiAJICogMCAtIERpc2FibGUgQVNQTSwKIAkgKiAxIC0gRW5hYmxlIEFTUE0gd2l0aG91dCBDbG9jayBSZXEsCiAJICogMiAtIEVuYWJsZSBBU1BNIHdpdGggQ2xvY2sgUmVxLAotCSAqIDMgLSBBbHd5YXMgRW5hYmxlIEFTUE0gd2l0aCBDbG9jayBSZXEsCisJICogMyAtIEFsd2F5cyBFbmFibGUgQVNQTSB3aXRoIENsb2NrIFJlcSwKIAkgKiA0IC0gQWx3YXlzIEVuYWJsZSBBU1BNIHdpdGhvdXQgQ2xvY2sgUmVxLgotCSAqIHNldCBkZWZ1bHQgdG8gUlRMODE5MkNFOjMgUlRMODE5MkU6MgorCSAqIHNldCBkZWZhdWx0IHRvIFJUTDgxOTJDRTozIFJUTDgxOTJFOjIKIAkgKiAqLwogCXJ0bHBjaS0+Y29uc3RfcGNpX2FzcG0gPSAzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90cnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RyeC5jCmluZGV4IDc1YWU0MzguLmRkMGY2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RyeC5jCkBAIC0zNyw4ICszNyw4IEBACiAjaW5jbHVkZSAidHJ4LmgiCiAjaW5jbHVkZSAibGVkLmgiCiAjaW5jbHVkZSAiZG0uaCIKLSNpbmNsdWRlICJwaHkuaCIKLXU4IF9ydGw4ODIxYWVfbWFwX2h3cXVldWVfdG9fZndxdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBod19xdWV1ZSkKKworc3RhdGljIHU4IF9ydGw4ODIxYWVfbWFwX2h3cXVldWVfdG9fZndxdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBod19xdWV1ZSkKIHsKIAl1MTYgZmMgPSBydGxfZ2V0X2ZjKHNrYik7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQljY2tfYWdjX3JwdCA9IGNja19idWYtPmNja19hZ2NfcnB0OwogCiAJCS8qICgxKUhhcmR3YXJlIGRvZXMgbm90IHByb3ZpZGUgUlNTSSBmb3IgQ0NLICovCi0JCS8qICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkKKwkJLyogKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhbGN1bGF0ZWQgYnkKIAkJICogaGFyZHdhcmUgKGZvciByYXRlIGFkYXB0aXZlKSAqLwogCQlpZiAocHBzYy0+cmZwd3Jfc3RhdGUgPT0gRVJGT04pCiAJCQljY2tfaGlnaHB3ciA9ICh1OCkgcnRsX2dldF9iYnJlZyhodywgUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIyLApAQCAtMzYzLDcgKzM2Myw3IEBACiAJCQkJcHN0YXR1cy0+cnhfbWltb19zaWduYWxzdHJlbmd0aFtpXSA9ICh1OCkgcnNzaTsKIAkJfQogCi0JCS8qICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkKKwkJLyogKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhbGN1bGF0ZWQgYnkKIAkJICogaGFyZHdhcmUgKGZvciByYXRlIGFkYXB0aXZlKSAqLwogCQlyeF9wd3JfYWxsID0gKChwX2RydmluZm8tPnB3ZGJfYWxsID4+IDEpICYgMHg3ZikgLSAxMTA7CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiAJLyogaHcgd2lsbCBzZXQgc3RhdHVzLT5kZWNyeXB0ZWQgdHJ1ZSwgaWYgaXQgZmluZHMgdGhlCiAJICogZnJhbWUgaXMgb3BlbiBkYXRhIGZyYW1lIG9yIG1nbXQgZnJhbWUuICovCi0JLyogU28gaHcgd2lsbCBub3QgZGVjcnlwdGlvbiByb2J1c3QgbWFuYWdtZW50IGZyYW1lCisJLyogU28gaHcgd2lsbCBub3QgZGVjcnlwdGlvbiByb2J1c3QgbWFuYWdlbWVudCBmcmFtZQogCSAqIGZvciBJRUVFODAyMTF3IGJ1dCBzdGlsbCBzZXQgc3RhdHVzLT5kZWNyeXB0ZWQKIAkgKiB0cnVlLCBzbyBoZXJlIHdlIHNob3VsZCBzZXQgaXQgYmFjayB0byB1bmRlY3J5cHRlZAogCSAqIGZvciBJRUVFODAyMTF3IGZyYW1lLCBhbmQgbWFjODAyMTEgc3cgd2lsbCBoZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3dpZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvd2lmaS5oCmluZGV4IDc2YmVmOTMuLjE3YTlkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvd2lmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvd2lmaS5oCkBAIC00MCwxMCArNDAsMTAgQEAKIAogCiAjZGVmaW5lIFJGX0NIQU5HRV9CWV9JTklUCQkwCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgCQlCSVQoMjgpCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9QUyAJCUJJVCgyOSkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0hXIAkJQklUKDMwKQotI2RlZmluZSBSRl9DSEFOR0VfQllfU1cgCQlCSVQoMzEpCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMJCUJJVCgyOCkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTCQkJQklUKDI5KQorI2RlZmluZSBSRl9DSEFOR0VfQllfSFcJCQlCSVQoMzApCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9TVwkJCUJJVCgzMSkKIAogI2RlZmluZSBJUUtfQUREQV9SRUdfTlVNCQkxNgogI2RlZmluZSBJUUtfTUFDX1JFR19OVU0JCQk0CkBAIC02OSwzNSArNjksMzUgQEAKICNkZWZpbmUgUUJTU19MT0FEX1NJWkUJCQk1CiAjZGVmaW5lIE1BWF9XTU1FTEVfTEVOR1RICQk2NAogCi0jZGVmaW5lIFRPVEFMX0NBTV9FTlRSWSAJCTMyCisjZGVmaW5lIFRPVEFMX0NBTV9FTlRSWQkJCTMyCiAKIC8qc2xvdCB0aW1lIGZvciAxMWcuICovCiAjZGVmaW5lIFJUTF9TTE9UX1RJTUVfOQkJCTkKICNkZWZpbmUgUlRMX1NMT1RfVElNRV8yMAkJMjAKIAogLypyZWxhdGVkIHdpdGggdGNwL2lwLiAqLwotLyppZl9laHRoZXIuaCovCi0jZGVmaW5lIEVUSF9QX1BBRSAJCQkweDg4OEUJLypQb3J0IEFjY2VzcyBFbnRpdHkKKy8qaWZfZXRoZXIuaCovCisjZGVmaW5lIEVUSF9QX1BBRQkJCTB4ODg4RQkvKlBvcnQgQWNjZXNzIEVudGl0eQogCQkJCQkJICooSUVFRSA4MDIuMVgpICovCi0jZGVmaW5lIEVUSF9QX0lQICAgICAgICAJCTB4MDgwMAkvKkludGVybmV0IFByb3RvY29sIHBhY2tldCAqLwotI2RlZmluZSBFVEhfUF9BUlAgICAgICAgCQkweDA4MDYJLypBZGRyZXNzIFJlc29sdXRpb24gcGFja2V0ICovCi0jZGVmaW5lIFNOQVBfU0laRSAJCQk2CisjZGVmaW5lIEVUSF9QX0lQCQkJMHgwODAwCS8qSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0ICovCisjZGVmaW5lIEVUSF9QX0FSUAkJCTB4MDgwNgkvKkFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQgKi8KKyNkZWZpbmUgU05BUF9TSVpFCQkJNgogI2RlZmluZSBQUk9UT0NfVFlQRV9TSVpFCQkyCiAKIC8qcmVsYXRlZCB3aXRoIDgwMi4xMSBmcmFtZSovCi0jZGVmaW5lIE1BQzgwMjExXzNBRERSX0xFTiAJCTI0Ci0jZGVmaW5lIE1BQzgwMjExXzRBRERSX0xFTiAJCTMwCisjZGVmaW5lIE1BQzgwMjExXzNBRERSX0xFTgkJMjQKKyNkZWZpbmUgTUFDODAyMTFfNEFERFJfTEVOCQkzMAogCiAjZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUgkJKDE0ICsgMjQgKyAyMSkJLyogMTQgaXMgdGhlIG1heAogCQkJCQkJCSAqIGNoYW5uZWwgbnVtYmVyICovCiAjZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUl8yRwkJMTQKLSNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSXzVHCSAgICAJNTQgLyogUGxlYXNlIHJlZmVyIHRvCisjZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUl81RwkJNTQgLyogUGxlYXNlIHJlZmVyIHRvCiAJCQkJCSAgICAqInBoeV9HZXRDaG5sR3JvdXA4ODEyQSIgYW5kCiAJCQkJCSAgICAqICJIYWxfUmVhZFR4UG93ZXJJbmZvODgxMkEiKi8KICNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSXzVHXzgwTQk3CiAjZGVmaW5lIENIQU5ORUxfR1JPVVBfTUFYCQkoMyArIDkpCS8qIGNoMX4zLCBjaDR+OSwgY2gxMH4xNAogCQkJCQkJICogdG90YWwgdGhyZWUgZ3JvdXBzICovCi0jZGVmaW5lIE1BWF9QR19HUk9VUCAJCQkxMworI2RlZmluZSBNQVhfUEdfR1JPVVAJCQkxMwogI2RlZmluZQlDSEFOTkVMX0dST1VQX01BWF8yRwkJMwogI2RlZmluZQlDSEFOTkVMX0dST1VQX0lEWF81R0wJCTMKICNkZWZpbmUJQ0hBTk5FTF9HUk9VUF9JRFhfNUdNCQk2CkBAIC0xMTIsMTQgKzExMiwxNCBAQAogI2RlZmluZSBNQVhfTlVNX1JBVEVTCQkJMjY0CiAKIC8qZm9yIDg4RSB1c2UqLwotLypJdCBtdXN0IGFsd2F5cyBzZXQgdG8gNCwgb3RoZXJ3aXNlIHJlYWQgZWZ1c2UgdGFibGUgc2VjcXVlbmNlIHdpbGwgYmUgd3JvbmcuKi8KKy8qSXQgbXVzdCBhbHdheXMgc2V0IHRvIDQsIG90aGVyd2lzZSByZWFkIGVmdXNlIHRhYmxlIHNlcXVlbmNlIHdpbGwgYmUgd3JvbmcuKi8KICNkZWZpbmUgTUFYX1RYX0NPVU5UCQkJNAogI2RlZmluZQlNQVhfUkZfUEFUSAkJCTQKICNkZWZpbmUJTUFYX0NITkxfR1JPVVBfMjRHCQk2CiAjZGVmaW5lCU1BWF9DSE5MX0dST1VQXzVHCQkxNAogCiAvKiBCSywgQkUsIFZJLCBWTywgSENDQSwgTUFOQUdFTUVOVCwgQ09NTUFORCwgSElHSCwgQkVBQ09OLiAqLwotI2RlZmluZSBNQVhfVFhfUVVFVUUgCQkJOQorI2RlZmluZSBNQVhfVFhfUVVFVUUJCQk5CiAKICNkZWZpbmUgVFhfUFdSX0JZX1JBVEVfTlVNX0JBTkQJCTIKICNkZWZpbmUgVFhfUFdSX0JZX1JBVEVfTlVNX1JGCQk0CkBAIC0xMjcsMTEgKzEyNywxMSBAQAogI2RlZmluZSBNQVhfQkFTRV9OVU1fSU5fUEhZX1JFR19QR18yNEcgIDYKICNkZWZpbmUgTUFYX0JBU0VfTlVNX0lOX1BIWV9SRUdfUEdfNUcJNQogCi0jZGVmaW5lIERFTFRBX1NXSU5HSURYX1NJWkUJMzAKLSNkZWZpbmUgQkFORF9OVU0gCQkJCTMKKyNkZWZpbmUgREVMVEFfU1dJTkdJRFhfU0laRQkJMzAKKyNkZWZpbmUgQkFORF9OVU0JCQkzCiAvKk5vdywgaXQncyBqdXN0IGZvciA4MTkyZWUKICAqbm90IE9LIHlldCwga2VlcCBpdCAwKi8KLSNkZWZpbmUgRE1BX0lTXzY0QklUIDAKKyNkZWZpbmUgRE1BX0lTXzY0QklUCQkJMAogI2RlZmluZSBSVEw4MTkyRUVfU0VHX05VTQkJMSAvKiAwOjIgc2VnLCAxOiA0IHNlZywgMjogOCBzZWcgKi8KIAogc3RydWN0IHR4cG93ZXJfaW5mb18yZyB7CkBAIC0yMTksNyArMjE5LDcgQEAKIH07CiAKIGVudW0gc2Nhbl9vcGVyYXRpb25fYmFja3VwX29wdCB7Ci0JU0NBTl9PUFRfQkFDS1VQX0JBTkQwPTAsCisJU0NBTl9PUFRfQkFDS1VQX0JBTkQwID0gMCwKIAlTQ0FOX09QVF9CQUNLVVBfQkFORDEsCiAJU0NBTl9PUFRfUkVTVE9SRSwKIAlTQ0FOX09QVF9NQVgKQEAgLTQzNSw3ICs0MzUsNyBAQAogCUhUX0NIQU5ORUxfV0lEVEhfODAgPSAyLAogfTsKIAotLyogUmVmOiA4MDIuMTFpIHNlcGMgRDEwLjAgNy4zLjIuMjUuMQorLyogUmVmOiA4MDIuMTFpIHNwZWMgRDEwLjAgNy4zLjIuMjUuMQogQ2lwaGVyIFN1aXRlcyBFbmNyeXB0aW9uIEFsZ29yaXRobXMgKi8KIGVudW0gcnRfZW5jX2FsZyB7CiAJTk9fRU5DUllQVElPTiA9IDAsCkBAIC00OTksMTQgKzQ5OSwxNCBAQAogCVJUTF9JTVJfQkNORE1BSU5UMywJLypCZWFjb24gRE1BIEludGVycnVwdCAzICovCiAJUlRMX0lNUl9CQ05ETUFJTlQyLAkvKkJlYWNvbiBETUEgSW50ZXJydXB0IDIgKi8KIAlSVExfSU1SX0JDTkRNQUlOVDEsCS8qQmVhY29uIERNQSBJbnRlcnJ1cHQgMSAqLwotCVJUTF9JTVJfQkNORE9LOCwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDggKi8KLQlSVExfSU1SX0JDTkRPSzcsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA3ICovCi0JUlRMX0lNUl9CQ05ET0s2LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNiAqLwotCVJUTF9JTVJfQkNORE9LNSwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDUgKi8KLQlSVExfSU1SX0JDTkRPSzQsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA0ICovCi0JUlRMX0lNUl9CQ05ET0szLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMyAqLwotCVJUTF9JTVJfQkNORE9LMiwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDIgKi8KLQlSVExfSU1SX0JDTkRPSzEsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAxICovCisJUlRMX0lNUl9CQ05ET0s4LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDggKi8KKwlSVExfSU1SX0JDTkRPSzcsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNyAqLworCVJUTF9JTVJfQkNORE9LNiwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA2ICovCisJUlRMX0lNUl9CQ05ET0s1LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDUgKi8KKwlSVExfSU1SX0JDTkRPSzQsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNCAqLworCVJUTF9JTVJfQkNORE9LMywJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAzICovCisJUlRMX0lNUl9CQ05ET0syLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDIgKi8KKwlSVExfSU1SX0JDTkRPSzEsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgMSAqLwogCVJUTF9JTVJfVElNRU9VVDIsCS8qVGltZW91dCBpbnRlcnJ1cHQgMiAqLwogCVJUTF9JTVJfVElNRU9VVDEsCS8qVGltZW91dCBpbnRlcnJ1cHQgMSAqLwogCVJUTF9JTVJfVFhGT1ZXLAkJLypUcmFuc21pdCBGSUZPIE92ZXJmbG93ICovCkBAIC01MTUsMTAgKzUxNSwxMCBAQAogCVJUTF9JTVJfUlhGT1ZXLAkJLypSZWNlaXZlIEZJRk8gT3ZlcmZsb3cgKi8KIAlSVExfSU1SX1JEVSwJCS8qUmVjZWl2ZSBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlICovCiAJUlRMX0lNUl9BVElNRU5ELAkvKkZvciA5MkMsQVRJTSBXaW5kb3cgRW5kIEludGVycnVwdCAqLwotCVJUTF9JTVJfQkRPSywJCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAqLworCVJUTF9JTVJfQkRPSywJCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgKi8KIAlSVExfSU1SX0hJR0hET0ssCS8qSGlnaCBRdWV1ZSBETUEgT0sgSW50ZXJydXB0ICovCiAJUlRMX0lNUl9DT01ET0ssCQkvKkNvbW1hbmQgUXVldWUgRE1BIE9LIEludGVycnVwdCovCi0JUlRMX0lNUl9UQkRPSywJCS8qVHJhbnNtaXQgQmVhY29uIE9LIGludGVycnVwICovCisJUlRMX0lNUl9UQkRPSywJCS8qVHJhbnNtaXQgQmVhY29uIE9LIGludGVycnVwdCAqLwogCVJUTF9JTVJfTUdOVERPSywJLypNYW5hZ2VtZW50IFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgKi8KIAlSVExfSU1SX1RCREVSLAkJLypGb3IgOTJDLFRyYW5zbWl0IEJlYWNvbiBFcnJvciBJbnRlcnJ1cHQgKi8KIAlSVExfSU1SX0JLRE9LLAkJLypBQ19CSyBETUEgT0sgSW50ZXJydXB0ICovCkBAIC02NDUsOSArNjQ1LDkgQEAKIH07CiAKIGVudW0gcmF0cl90YWJsZV9tb2RlIHsKLQlSQVRSX0lOWF9XSVJFTEVTU19OR0IgPSAwLAkJLy8gQkdOIDQwIE1oeiAyU1MgMVNTCi0JUkFUUl9JTlhfV0lSRUxFU1NfTkcgPSAxLAkJLy8gR04gb3IgTgotCVJBVFJfSU5YX1dJUkVMRVNTX05CID0gMiwJCS8vIEJHTiAyMCBNaHogMlNTIDFTUyAgb3IgQk4KKwlSQVRSX0lOWF9XSVJFTEVTU19OR0IgPSAwLAkJLyogQkdOIDQwIE1oeiAyU1MgMVNTICovCisJUkFUUl9JTlhfV0lSRUxFU1NfTkcgPSAxLAkJLyogR04gb3IgTiAqLworCVJBVFJfSU5YX1dJUkVMRVNTX05CID0gMiwJCS8qIEJHTiAyMCBNaHogMlNTIDFTUyAgb3IgQk4gKi8KIAlSQVRSX0lOWF9XSVJFTEVTU19OID0gMywKIAlSQVRSX0lOWF9XSVJFTEVTU19HQiA9IDQsCiAJUkFUUl9JTlhfV0lSRUxFU1NfRyA9IDUsCkBAIC03NTksNyArNzU5LDcgQEAKIAlzdHJ1Y3QgcnRsX2h0X2FnZyBhZ2c7CiB9OwogCi1zdHJ1Y3QgcnNzaV9zdGF7CitzdHJ1Y3QgcnNzaV9zdGEgewogCWxvbmcgdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKIH07CiAKQEAgLTg5OSw3ICs4OTksNyBAQAogCXUxNiByZWdfMmdoel9jdGw7CiB9OwogCi1zdHJ1Y3QgZHluYW1pY19wcmltYXJ5X2NjYXsKK3N0cnVjdCBkeW5hbWljX3ByaW1hcnlfY2NhIHsKIAl1OCBwcmljY2FfZmxhZzsKIAl1OCBpbnRmX2ZsYWc7CiAJdTggaW50Zl90eXBlOwpAQCAtOTM5LDE0ICs5MzksMTQgQEAKIAlQMlBfUFNfRU5BQkxFID0gMSwKIAlQMlBfUFNfU0NBTiA9IDIsCiAJUDJQX1BTX1NDQU5fRE9ORSA9IDMsCi0JUDJQX1BTX0FMTFNUQVNMRUVQID0gNCwgLy8gZm9yIFAyUCBHTworCVAyUF9QU19BTExTVEFTTEVFUCA9IDQsIC8qIGZvciBQMlAgR08gKi8KIH07CiAKIGVudW0gcDJwX3BzX21vZGUgewogCVAyUF9QU19OT05FID0gMCwKIAlQMlBfUFNfQ1RXSU5ET1cgPSAxLAogCVAyUF9QU19OT0EgPSAyLAotCVAyUF9QU19NSVggPSAzLCAvLyBDVFdpbmRvdyBhbmQgTm9BCisJUDJQX1BTX01JWCA9IDMsIC8qIENUV2luZG93IGFuZCBOb0EgKi8KIH07CiAKIHN0cnVjdCBydGxfcDJwX3BzX2luZm8gewpAQCAtOTY5LDcgKzk2OSw3IEBACiAJdTMyIG5vYV9zdGFydF90aW1lW1AyUF9NQVhfTk9BX05VTV07CiB9OwogCi0gc3RydWN0IHAycF9wc19vZmZsb2FkX3Qgeworc3RydWN0IHAycF9wc19vZmZsb2FkX3QgewogCXU4IE9mZmxvYWRfRW46MTsKIAl1OCByb2xlOjE7IC8qIDE6IE93bmVyLCAwOiBDbGllbnQgKi8KIAl1OCBDVFdpbmRvd19FbjoxOwpAQCAtOTgxLDcgKzk4MSw3IEBACiB9OwogCiAjZGVmaW5lIElRS19NQVRSSVhfUkVHX05VTQk4Ci0jZGVmaW5lIElRS19NQVRSSVhfU0VUVElOR1NfTlVNCSAoMTQrMjQrMjEpIC8vIENoYW5uZWxzXzJfNEdfTlVNICsgQ2hhbm5lbHNfNUdfMjBNX05VTSArIENoYW5uZWxzXzVHCisjZGVmaW5lIElRS19NQVRSSVhfU0VUVElOR1NfTlVNCSAoMTQrMjQrMjEpIC8qIENoYW5uZWxzXzJfNEdfTlVNICsgQ2hhbm5lbHNfNUdfMjBNX05VTSArIENoYW5uZWxzXzVHICovCiBzdHJ1Y3QgaXFrX21hdHJpeF9yZWdzIHsKIAlib29sIGJfaXFrX2RvbmU7CiAJbG9uZyB2YWx1ZVsxXVtJUUtfTUFUUklYX1JFR19OVU1dOwpAQCAtMTA3NCwxMiArMTA3NCwxMiBAQAogCWVudW0gcnRfcG9sYXJpdHlfY3RsIHBvbGFyaXR5X2N0bDsKIH07CiAKLSNkZWZpbmUgUlRMX0FHR19TVE9QIAkJCQkJCTAKKyNkZWZpbmUgUlRMX0FHR19TVE9QCQkJCQkJMAogI2RlZmluZSBSVExfQUdHX1BST0dSRVNTCQkJCQkxCi0jZGVmaW5lIFJUTF9BR0dfU1RBUlQgCQkJCQkJMgorI2RlZmluZSBSVExfQUdHX1NUQVJUCQkJCQkJMgogI2RlZmluZSBSVExfQUdHX09QRVJBVElPTkFMCQkJCQkzCi0jZGVmaW5lIFJUTF9SWF9BR0dfU1RBUlQgCQkJCQkxCi0jZGVmaW5lIFJUTF9SWF9BR0dfU1RPUCAJCQkJCTAKKyNkZWZpbmUgUlRMX1JYX0FHR19TVEFSVAkJCQkJMQorI2RlZmluZSBSVExfUlhfQUdHX1NUT1AJCQkJCQkwCiAKIHN0cnVjdCBydGxfcHJpdjsKIHN0cnVjdCBydGxfaW8gewpAQCAtMTA5MiwxMyArMTA5MiwxMyBAQAogCS8qUENJIElPIG1hcCAqLwogCXVuc2lnbmVkIGxvbmcgcGNpX2Jhc2VfYWRkcjsJLypkZXZpY2UgSS9PIGFkZHJlc3MgKi8KIAotCXZvaWQgKCp3cml0ZThfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkciwgdTggdmFsKTsKLQl2b2lkICgqd3JpdGUxNl9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTsKLQl2b2lkICgqd3JpdGUzMl9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyLCB1MzIgdmFsKTsKKwl2b2lkICgqd3JpdGU4X2FzeW5jKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1OCB2YWwpOworCXZvaWQgKCp3cml0ZTE2X2FzeW5jKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTsKKwl2b2lkICgqd3JpdGUzMl9hc3luYykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdTMyIHZhbCk7CiAKLQl1OCgqcmVhZDhfc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyKTsKLQl1MTYoKnJlYWQxNl9zeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIpOwotCXUzMigqcmVhZDMyX3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkcik7CisJdTggKCpyZWFkOF9zeW5jKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKTsKKwl1MTYgKCpyZWFkMTZfc3luYykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcik7CisJdTMyICgqcmVhZDMyX3N5bmMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIpOwogCiB9OwogCkBAIC0xMjU2LDcgKzEyNTYsNyBAQAogCWJvb2wgdXNlX2RlZmF1bHRrZXk7CiAJLypFbmNyeXB0aW9uIEFsZ29yaXRobSBmb3IgVW5pY2FzdCBQYWNrZXQgKi8KIAllbnVtIHJ0X2VuY19hbGcgcGFpcndpc2VfZW5jX2FsZ29yaXRobTsKLQkvKkVuY3J5cHRpb24gQWxnb3JpdGhtIGZvciBCcm9jYXN0L011bHRpY2FzdCAqLworCS8qRW5jcnlwdGlvbiBBbGdvcml0aG0gZm9yIEJyb2FkY2FzdC9NdWx0aWNhc3QgKi8KIAllbnVtIHJ0X2VuY19hbGcgZ3JvdXBfZW5jX2FsZ29yaXRobTsKIAkvKkNhbSBFbnRyeSBCaXRtYXAgKi8KIAl1MzIgaHdzZWNfY2FtX2JpdG1hcDsKQEAgLTEzMTcsOSArMTMxNyw5IEBACiAKIH07CiAKLSNkZWZpbmUgQVNTT0NJQVRFX0VOVFJZX05VTQkzMisxCisjZGVmaW5lIEFTU09DSUFURV9FTlRSWV9OVU0JKDMyKzEpCiAKLXN0cnVjdCBmYXN0X2FudF90cmFpbm5pbmd7CitzdHJ1Y3QgZmFzdF9hbnRfdHJhaW5uaW5nIHsKIAl1OCBic3NpZFs2XTsKIAl1OCBhbnRzZWxfcnhfa2VlcF8wOwogCXU4IGFudHNlbF9yeF9rZWVwXzE7CkBAIC0xNDI3LDE5ICsxNDI3LDE5IEBACiAJY2hhciBiYl9zd2luZ19kaWZmXzVnOwogCiAJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX3BbREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOwogCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX25bREVMVEFfU1dJTkdJRFhfU0laRV07CiAJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgIAl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3BbREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3BbQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfbltCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25bQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3BfODE4OGVbREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Ffbl84MTg4ZVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3BbREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3BbQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfbltCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25bQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3BfODE4OGVbREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Ffbl84MTg4ZVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKIAogCiAJLyogRE1TUCAqLwpAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKIAlzdHJ1Y3QgZmFzdF9hbnRfdHJhaW5uaW5nIGZhdF90YWJsZTsKIAogCXU4CXJlc3BfdHhfcGF0aDsKLQl1OCAJcGF0aF9zZWw7CisJdTgJcGF0aF9zZWw7CiAJdTMyCXBhdGhhX3N1bTsKIAl1MzIJcGF0aGJfc3VtOwogCXUzMglwYXRoYV9jbnQ7CkBAIC0xNjcxLDcgKzE2NzEsNiBAQAogCXU4IHJ4X21pbW9fZXZtX2RibVs0XTsKIAl1MTYgY2ZvX3Nob3J0WzRdOyAJCS8qIHBlci1wYXRoJ3MgQ2ZvX3Nob3J0ICovCiAJdTE2IGNmb190YWlsWzRdOwotCiAJdTggcnhfcHdyWzRdOyAvKiBwZXItcGF0aCdzIHB3ZGIgKi8KIAl1OCByeF9zbnJbNF07IC8qIHBlci1wYXRoJ3MgU05SICovCiAJdTggYmFuZHdpZHRoOwpAQCAtMTY5Miw3ICsxNjkxLDcgQEAKIH07CiAKIHN0cnVjdCBydF9saW5rX2RldGVjdCB7Ci0JLyogY291bnQgZm9yIHJhb21pbmcgKi8KKwkvKiBjb3VudCBmb3Igcm9hbWluZyAqLwogCXUzMiBiY25fcnhfaW5wZXJpb2Q7CiAJdTMyIHJvYW1fdGltZXM7CiAKQEAgLTE3NTYsNDggKzE3NTUsNDggQEAKIAl2b2lkICpwcm94aW1pdHlfcHJpdjsKIAlpbnQgKCpwcm94aW1fcngpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX3N0YXRzICpzdGF0dXMsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0JdTggICgqcHJveGltX2dldF92YXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlKTsKKwl1OCAoKnByb3hpbV9nZXRfdmFyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHlwZSk7CiB9OwogCiBzdHJ1Y3QgcnRsX2hhbF9vcHMgewotCWludCAoKmluaXRfc3dfdmFycykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmRlaW5pdF9zd192YXJzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqcmVhZF9lZXByb21faW5mbykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmludGVycnVwdF9yZWNvZ25pemVkKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJCSAgICAgIHUzMiAqIHBfaW50YSwgdTMyICogcF9pbnRiKTsKLQlpbnQgKCpod19pbml0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqaHdfZGlzYWJsZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmh3X3N1c3BlbmQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpod19yZXN1bWUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCplbmFibGVfaW50ZXJydXB0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqZGlzYWJsZV9pbnRlcnJ1cHQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCWludCAoKnNldF9uZXR3b3JrX3R5cGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkJIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSk7CisJaW50ICgqaW5pdF9zd192YXJzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmRlaW5pdF9zd192YXJzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKnJlYWRfZWVwcm9tX2luZm8pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqaW50ZXJydXB0X3JlY29nbml6ZWQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgdTMyICpwX2ludGEsIHUzMiAqcF9pbnRiKTsKKwlpbnQgKCpod19pbml0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmh3X2Rpc2FibGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqaHdfc3VzcGVuZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpod19yZXN1bWUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZW5hYmxlX2ludGVycnVwdCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpkaXNhYmxlX2ludGVycnVwdCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCWludCAoKnNldF9uZXR3b3JrX3R5cGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSk7CiAJdm9pZCAoKnNldF9jaGtfYnNzaWQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICAgYm9vbCBjaGVja19ic3NpZCk7Ci0Jdm9pZCAoKnNldF9id19tb2RlKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoX3R5cGUpOwotCSB1OCgqc3dpdGNoX2NoYW5uZWwpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpzZXRfcW9zKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBpbnQgYWNpKTsKLQl2b2lkICgqc2V0X2Jjbl9yZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpzZXRfYmNuX2ludHYpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCp1cGRhdGVfaW50ZXJydXB0X21hc2spIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkJICAgICAgIHUzMiBhZGRfbXNyLCB1MzIgcm1fbXNyKTsKLQl2b2lkICgqZ2V0X2h3X3JlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggdmFyaWFibGUsIHU4ICogdmFsKTsKLQl2b2lkICgqc2V0X2h3X3JlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggdmFyaWFibGUsIHU4ICogdmFsKTsKLQl2b2lkICgqdXBkYXRlX3JhdGVfdGJsKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCByc3NpX2xldmVsKTsKLQl2b2lkICgqcHJlX2ZpbGxfdHhfYmRfZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqdHhfYmRfZGVzYywKLQkJCQkgICAgIHU4ICpkZXNjLCB1OCBxdWV1ZV9pbmRleCwKLQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGRtYV9hZGRyX3QgYWRkcik7Ci0JdTE2ICgqcnhfZGVzY19idWZmX3JlbWFpbmVkX2NudCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCQkgIHU4IHF1ZXVlX2luZGV4KTsKLQl2b2lkICgqcnhfY2hlY2tfZG1hX29rKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpoZWFkZXJfZGVzYywKLQkJCQkgdTggcXVldWVfaW5kZXgpOwotCXZvaWQgKCpmaWxsX3R4X2Rlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqIGhkciwKLQkJCSAgICAgIHU4ICogcGRlc2NfdHgsIHU4ICogcGJkX2Rlc2MsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKiBpbmZvLAorCXZvaWQgKCpzZXRfYndfbW9kZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaF90eXBlKTsKKwl1OCAoKnN3aXRjaF9jaGFubmVsKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKnNldF9xb3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgYWNpKTsKKwl2b2lkICgqc2V0X2Jjbl9yZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqc2V0X2Jjbl9pbnR2KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKnVwZGF0ZV9pbnRlcnJ1cHRfbWFzaykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgdTMyIGFkZF9tc3IsIHUzMiBybV9tc3IpOworCXZvaWQgKCpnZXRfaHdfcmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdmFyaWFibGUsIHU4ICp2YWwpOworCXZvaWQgKCpzZXRfaHdfcmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdmFyaWFibGUsIHU4ICp2YWwpOworCXZvaWQgKCp1cGRhdGVfcmF0ZV90YmwpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHJzc2lfbGV2ZWwpOworCXZvaWQgKCpwcmVfZmlsbF90eF9iZF9kZXNjKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnR4X2JkX2Rlc2MsCisJCQkJICAgIHU4ICpkZXNjLCB1OCBxdWV1ZV9pbmRleCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZG1hX2FkZHJfdCBhZGRyKTsKKwl1MTYgKCpyeF9kZXNjX2J1ZmZfcmVtYWluZWRfY250KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIHU4IHF1ZXVlX2luZGV4KTsKKwl2b2lkICgqcnhfY2hlY2tfZG1hX29rKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmhlYWRlcl9kZXNjLAorCQkJCXU4IHF1ZXVlX2luZGV4KTsKKwl2b2lkICgqZmlsbF90eF9kZXNjKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgICAgdTggKnBkZXNjX3R4LCB1OCAqcGJkX2Rlc2MsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCkBAIC0xODA1LDc0ICsxODA0LDc3IEBACiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjZW5kaWYKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgdTggaHdfcXVldWUsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBod19xdWV1ZSwKIAkJCSAgICAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7Ci0Jdm9pZCAoKmZpbGxfdHhfY21kZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggKiBwZGVzYywKLQkJCQkgYm9vbCBiX2ZpcnN0c2VnLCBib29sIGJfbGFzdHNlZywKLQkJCQkgc3RydWN0IHNrX2J1ZmYgKiBza2IpOwotCSBib29sKCpxdWVyeV9yeF9kZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJICAgICAgIHN0cnVjdCBydGxfc3RhdHMgKiBzdGF0dXMsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKiByeF9zdGF0dXMsCi0JCQkgICAgICAgdTggKiBwZGVzYywgc3RydWN0IHNrX2J1ZmYgKiBza2IpOwotCXZvaWQgKCpzZXRfY2hhbm5lbF9hY2Nlc3MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCSBib29sKCpyYWRpb19vbm9mZl9jaGVja2luZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggKiB2YWxpZCk7Ci0Jdm9pZCAoKmRtX3dhdGNoZG9nKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqc2Nhbl9vcGVyYXRpb25fYmFja3VwKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCBvcGVyYXRpb24pOwotCSBib29sKCpzZXRfcmZfcG93ZXJfc3RhdGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkJICAgIGVudW0gcmZfcHdyc3RhdGUgcmZwd3Jfc3RhdGUpOwotCXZvaWQgKCpsZWRfY29udHJvbCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCSAgICAgZW51bSBsZWRfY3RsX21vZGUgbGVkYWN0aW9uKTsKLQl2b2lkICgqc2V0X2Rlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKiBwZGVzYywgYm9vbCBpc3R4LAotCQkJICB1OCBkZXNjX25hbWUsIHU4ICogdmFsKTsKLQkgdTMyKCpnZXRfZGVzYykgKHU4ICogcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lKTsKLQlib29sICgqaXNfdHhfZGVzY19jbG9zZWQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICB1OCBod19xdWV1ZSwgdTE2IGluZGV4KTsKLQl2b2lkICgqdHhfcG9sbGluZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggaHdfcXVldWUpOwotCXZvaWQgKCplbmFibGVfaHdfc2VjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqc2V0X2tleSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTMyIGtleV9pbmRleCwKLQkJCSB1OCAqIHBfbWFjYWRkciwgYm9vbCBpc19ncm91cCwgdTggZW5jX2FsZ28sCi0JCQkgYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKTsKLQl2b2lkICgqaW5pdF9zd19sZWRzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQkgdTMyKCpnZXRfYmJyZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzayk7Ci0Jdm9pZCAoKnNldF9iYnJlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLAotCQkJICAgdTMyIGRhdGEpOwotCSB1MzIoKmdldF9yZnJlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKLQkJCSAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKLQl2b2lkICgqc2V0X3JmcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLAotCQkJICAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSk7CisJdm9pZCAoKmZpbGxfdHhfY21kZGVzYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpwZGVzYywKKwkJCQlib29sIGJfZmlyc3RzZWcsIGJvb2wgYl9sYXN0c2VnLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpOworCWJvb2wgKCpxdWVyeV9yeF9kZXNjKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBydGxfc3RhdHMgKnN0YXR1cywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCQkgICAgICB1OCAqcGRlc2MsIHN0cnVjdCBza19idWZmICpza2IpOworCXZvaWQgKCpzZXRfY2hhbm5lbF9hY2Nlc3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwlib29sICgqcmFkaW9fb25vZmZfY2hlY2tpbmcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqdmFsaWQpOworCXZvaWQgKCpkbV93YXRjaGRvZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpzY2FuX29wZXJhdGlvbl9iYWNrdXApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBvcGVyYXRpb24pOworCWJvb2wgKCpzZXRfcmZfcG93ZXJfc3RhdGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgIGVudW0gcmZfcHdyc3RhdGUgcmZwd3Jfc3RhdGUpOworCXZvaWQgKCpsZWRfY29udHJvbCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgZW51bSBsZWRfY3RsX21vZGUgbGVkYWN0aW9uKTsKKwl2b2lkICgqc2V0X2Rlc2MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqcGRlc2MsIGJvb2wgaXN0eCwKKwkJCSB1OCBkZXNjX25hbWUsIHU4ICp2YWwpOworCXUzMiAoKmdldF9kZXNjKSh1OCAqcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lKTsKKwlib29sICgqaXNfdHhfZGVzY19jbG9zZWQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgdTggaHdfcXVldWUsIHUxNiBpbmRleCk7CisJdm9pZCAoKnR4X3BvbGxpbmcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBod19xdWV1ZSk7CisJdm9pZCAoKmVuYWJsZV9od19zZWMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqc2V0X2tleSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBrZXlfaW5kZXgsCisJCQl1OCAqcF9tYWNhZGRyLCBib29sIGlzX2dyb3VwLCB1OCBlbmNfYWxnbywKKwkJCWJvb2wgaXNfd2Vwa2V5LCBib29sIGNsZWFyX2FsbCk7CisJdm9pZCAoKmluaXRfc3dfbGVkcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXUzMiAoKmdldF9iYnJlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzayk7CisJdm9pZCAoKnNldF9iYnJlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywKKwkJCSAgdTMyIGRhdGEpOworCXUzMiAoKmdldF9yZnJlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gcmFkaW9fcGF0aCByZnBhdGgsCisJCQkgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKKwl2b2lkICgqc2V0X3JmcmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKKwkJCSAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSk7CiAJdm9pZCAoKmFsbG93X2FsbF9kZXN0YWRkcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCWJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKTsKLQl2b2lkICgqbGlua2VkX3NldF9yZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpjaGVja19zd2l0Y2hfdG9fZG1kcCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmR1YWxtYWNfZWFzeV9jb25jdXJyZW50KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotCXZvaWQgKCpkdWFsbWFjX3N3aXRjaF90b19kbWRwKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotCXZvaWQgKCpjMmhfY29tbWFuZF9oYW5kbGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci0Jdm9pZCAoKmJ0X3dpZmlfbWVkaWFfc3RhdHVzX25vdGlmeSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIG1zdGF0ZSk7Ci0Jdm9pZCAoKmJ0X3R1cm5fb2ZmX2J0X2NvZXhpc3RfYmVmb3JlX2VudGVyX2xwcykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLQl2b2lkICgqZmlsbF9oMmNfY21kKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGVsZW1lbnRfaWQsCi0JCQkgICAgICB1MzIgY21kX2xlbiwgdTggKnBfY21kYnVmZmVyKTsKLQlib29sICgqZ2V0X2J0Y19zdGF0dXMpICh2b2lkKTsKLSAgCXUzMiAoKnJ4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX3N0YXRzIHN0YXR1cywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJCQkJICAgYm9vbCBhbGxvd19hbGxfZGEsIGJvb2wgd3JpdGVfaW50b19yZWcpOworCXZvaWQgKCpsaW5rZWRfc2V0X3JlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpjaGVja19zd2l0Y2hfdG9fZG1kcCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpkdWFsbWFjX2Vhc3lfY29uY3VycmVudCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpkdWFsbWFjX3N3aXRjaF90b19kbWRwKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmMyaF9jb21tYW5kX2hhbmRsZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpidF93aWZpX21lZGlhX3N0YXR1c19ub3RpZnkpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgYm9vbCBtc3RhdGUpOworCXZvaWQgKCpidF90dXJuX29mZl9idF9jb2V4aXN0X2JlZm9yZV9lbnRlcl9scHMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZmlsbF9oMmNfY21kKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggZWxlbWVudF9pZCwKKwkJCSAgICAgdTMyIGNtZF9sZW4sIHU4ICpwX2NtZGJ1ZmZlcik7CisJYm9vbCAoKmdldF9idGNfc3RhdHVzKSh2b2lkKTsKKwl1MzIgKCpyeF9jb21tYW5kX3BhY2tldF9oYW5kbGVyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIHN0cnVjdCBydGxfc3RhdHMgc3RhdHVzLAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB9OwogCiBzdHJ1Y3QgcnRsX2ludGZfb3BzIHsKIAkvKmNvbSAqLwogCXZvaWQgKCpyZWFkX2VmdXNlX2J5dGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgX29mZnNldCwgdTggKnBidWYpOwotCWludCAoKmFkYXB0ZXJfc3RhcnQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCphZGFwdGVyX3N0b3ApIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCWludCAoKmFkYXB0ZXJfc3RhcnQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqYWRhcHRlcl9zdG9wKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJYm9vbCAoKmNoZWNrX2J1ZGR5X3ByaXYpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJc3RydWN0IHJ0bF9wcml2ICoqYnVkZHlfcHJpdik7CisJCQkJIHN0cnVjdCBydGxfcHJpdiAqKmJ1ZGR5X3ByaXYpOwogCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKLQlpbnQgKCphZGFwdGVyX3R4KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwKLQkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CisJaW50ICgqYWRhcHRlcl90eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CiAjZWxzZQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KLQlpbnQgKCphZGFwdGVyX3R4KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CisJaW50ICgqYWRhcHRlcl90eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjZW5kaWYKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCkBAIC0xODgxLDIyICsxODgzLDIyIEBACiAjZWxzZQogCXZvaWQgKCpmbHVzaCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCk7CiAjZW5kaWYKLQlpbnQgKCpyZXNldF90cnhfcmluZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJaW50ICgqcmVzZXRfdHJ4X3JpbmcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQotCWJvb2wgKCp3YWl0cV9pbnNlcnQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJYm9vbCAoKndhaXRxX2luc2VydCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwogI2Vsc2UKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCi0JYm9vbCAoKndhaXRxX2luc2VydCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworCWJvb2wgKCp3YWl0cV9pbnNlcnQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNlbmRpZgogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KIAogCS8qcGNpICovCi0Jdm9pZCAoKmRpc2FibGVfYXNwbSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmVuYWJsZV9hc3BtKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqZGlzYWJsZV9hc3BtKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmVuYWJsZV9hc3BtKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAKIAkvKnVzYiAqLwogfTsKQEAgLTIwMjcsMjEgKzIwMjksMjEgQEAKIH07CiAKIHN0cnVjdCBydGxfYnRjX29wcyB7Ci0Jdm9pZCAoKmJ0Y19pbml0X3ZhcmlhYmxlcykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Ci0Jdm9pZCAoKmJ0Y19pbml0X2hhbF92YXJzKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKLQl2b2lkICgqYnRjX2luaXRfaHdfY29uZmlnKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKLQl2b2lkICgqYnRjX2lwc19ub3RpZnkpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IHR5cGUpOwotCXZvaWQgKCpidGNfc2Nhbl9ub3RpZnkpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IHNjYW50eXBlKTsKLQl2b2lkICgqYnRjX2Nvbm5lY3Rfbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBhY3Rpb24pOwotCXZvaWQgKCpidGNfbWVkaWFzdGF0dXNfbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAotCQkJCQllbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLQl2b2lkICgqYnRjX3BlcmlvZGljYWwpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwotCXZvaWQgKCpidGNfaGFsdF9ub3RpZnkpICh2b2lkKTsKLQl2b2lkICgqYnRjX2J0aW5mb19ub3RpZnkpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsCi0JCQkJICAgdTggKiB0bXBfYnVmLCB1OCBsZW5ndGgpOwotCWJvb2wgKCpidGNfaXNfbGltaXRlZF9kaWcpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwotCWJvb2wgKCpidGNfaXNfZGlzYWJsZV9lZGNhX3R1cmJvKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKLQlib29sICgqYnRjX2lzX2J0X2Rpc2FibGVkKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwl2b2lkICgqYnRjX2luaXRfdmFyaWFibGVzKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCXZvaWQgKCpidGNfaW5pdF9oYWxfdmFycykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwl2b2lkICgqYnRjX2luaXRfaHdfY29uZmlnKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCXZvaWQgKCpidGNfaXBzX25vdGlmeSkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCB0eXBlKTsKKwl2b2lkICgqYnRjX3NjYW5fbm90aWZ5KShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IHNjYW50eXBlKTsKKwl2b2lkICgqYnRjX2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IGFjdGlvbik7CisJdm9pZCAoKmJ0Y19tZWRpYXN0YXR1c19ub3RpZnkpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwKKwkJCQkgICAgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cyk7CisJdm9pZCAoKmJ0Y19wZXJpb2RpY2FsKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCXZvaWQgKCpidGNfaGFsdF9ub3RpZnkpKHZvaWQpOworCXZvaWQgKCpidGNfYnRpbmZvX25vdGlmeSkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgdTggKnRtcF9idWYsIHU4IGxlbmd0aCk7CisJYm9vbCAoKmJ0Y19pc19saW1pdGVkX2RpZykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwlib29sICgqYnRjX2lzX2Rpc2FibGVfZWRjYV90dXJibykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwlib29sICgqYnRjX2lzX2J0X2Rpc2FibGVkKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwogfTsKIAogc3RydWN0IHJ0bF9idF9jb2V4aXN0IHsKQEAgLTIwODcsNyArMjA4OSw3IEBACiAKIAkvKgogCSAqaGFsX2NmZyA6IGZvciBkaWZmIGNhcmRzCi0JICppbnRmX29wcyA6IGZvciBkaWZmIGludGVycmZhY2UgdXNiL3BjaWUKKwkgKmludGZfb3BzIDogZm9yIGRpZmYgaW50ZXJmYWNlIHVzYi9wY2llCiAJICovCiAJc3RydWN0IHJ0bF9oYWxfY2ZnICpjZmc7CiAJc3RydWN0IHJ0bF9pbnRmX29wcyAqaW50Zl9vcHM7CkBAIC0yMTA1LDcgKzIxMDcsNyBAQAogCS8qZm9yIGJ0IGNvZXhpc3QgdXNlKi8KIAlzdHJ1Y3QgcnRsX2J0X2NvZXhpc3QgYnRjb2V4aXN0OwogCi0JLyogc2VwZXJhdGUgOTJlZSBmcm9tIG90aGVyIElDcywKKwkvKiBzZXBhcmF0ZSA5MmVlIGZyb20gb3RoZXIgSUNzLAogCSAgKiA5MmVlIHVzZSBuZXcgdHJ4IGZsb3cuICovCiAJYm9vbCB1c2VfbmV3X3RyeF9mbG93OwogCS8qVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28KQEAgLTIxMjAsNTcgKzIxMjIsNTcgQEAKICNkZWZpbmUgcnRsX2hhbChydGxwcml2KQkoJigocnRscHJpdiktPnJ0bGhhbCkpCiAjZGVmaW5lIHJ0bF9lZnVzZShydGxwcml2KQkoJigocnRscHJpdiktPmVmdXNlKSkKICNkZWZpbmUgcnRsX3BzYyhydGxwcml2KQkoJigocnRscHJpdiktPnBzYykpCi0jZGVmaW5lIHJ0bF9zZWMocnRscHJpdikgCSgmKChydGxwcml2KS0+c2VjKSkKLSNkZWZpbmUgcnRsX2RtKHJ0bHByaXYpCSgmKChydGxwcml2KS0+ZG0pKQorI2RlZmluZSBydGxfc2VjKHJ0bHByaXYpCSgmKChydGxwcml2KS0+c2VjKSkKKyNkZWZpbmUgcnRsX2RtKHJ0bHByaXYpCQkoJigocnRscHJpdiktPmRtKSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBCbHVldG9vdGggQ28tZXhpc3RhbmNlIFJlbGF0ZWQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGVudW0gYnRfYW50X251bSB7Ci0gICAgICAgIEFOVF9YMiA9IDAsCi0gICAgICAgIEFOVF9YMSA9IDEsCisJQU5UX1gyID0gMCwKKwlBTlRfWDEgPSAxLAogfTsKIAogZW51bSBidF9jb190eXBlIHsKLSAgICAgICAgQlRfMldJUkUgPSAwLAotICAgICAgICBCVF9JU1NDXzNXSVJFID0gMSwKLSAgICAgICAgQlRfQUNDRUwgPSAyLAotICAgICAgICBCVF9DU1JfQkM0ID0gMywKLSAgICAgICAgQlRfQ1NSX0JDOCA9IDQsCi0gICAgICAgIEJUX1JUTDg3NTYgPSA1LAotICAgICAgICBCVF9SVEw4NzIzQSA9IDYsCi0gICAgICAgIEJUX1JUTDg4MjFBID0gNywKLSAgICAgICAgQlRfUlRMODcyM0IgPSA4LAotICAgICAgICBCVF9SVEw4MTkyRSA9IDksCi0gICAgICAgIEJUX1JUTDg4MTJBID0gMTEsCisJQlRfMldJUkUgPSAwLAorCUJUX0lTU0NfM1dJUkUgPSAxLAorCUJUX0FDQ0VMID0gMiwKKwlCVF9DU1JfQkM0ID0gMywKKwlCVF9DU1JfQkM4ID0gNCwKKwlCVF9SVEw4NzU2ID0gNSwKKwlCVF9SVEw4NzIzQSA9IDYsCisJQlRfUlRMODgyMUEgPSA3LAorCUJUX1JUTDg3MjNCID0gOCwKKwlCVF9SVEw4MTkyRSA9IDksCisJQlRfUlRMODgxMkEgPSAxMSwKIH07CiAKLWVudW0gYnRfdG90YWxfYW50X251bXsKK2VudW0gYnRfdG90YWxfYW50X251bSB7CiAJQU5UX1RPVEFMX1gyID0gMCwKIAlBTlRfVE9UQUxfWDEgPSAxCiB9OwogCiBlbnVtIGJ0X2N1cl9zdGF0ZSB7Ci0gICAgICAgIEJUX09GRiA9IDAsCi0gICAgICAgIEJUX09OID0gMSwKKwlCVF9PRkYgPSAwLAorCUJUX09OID0gMSwKIH07CiAKIGVudW0gYnRfc2VydmljZV90eXBlIHsKLSAgICAgICAgQlRfU0NPID0gMCwKLSAgICAgICAgQlRfQTJEUCA9IDEsCi0gICAgICAgIEJUX0hJRCA9IDIsCi0gICAgICAgIEJUX0hJRF9JRExFID0gMywKLSAgICAgICAgQlRfU0NBTiA9IDQsCi0gICAgICAgIEJUX0lETEUgPSA1LAotICAgICAgICBCVF9PVEhFUl9BQ1RJT04gPSA2LAotICAgICAgICBCVF9CVVNZID0gNywKLSAgICAgICAgQlRfT1RIRVJCVVNZID0gOCwKLSAgICAgICAgQlRfUEFOID0gOSwKKwlCVF9TQ08gPSAwLAorCUJUX0EyRFAgPSAxLAorCUJUX0hJRCA9IDIsCisJQlRfSElEX0lETEUgPSAzLAorCUJUX1NDQU4gPSA0LAorCUJUX0lETEUgPSA1LAorCUJUX09USEVSX0FDVElPTiA9IDYsCisJQlRfQlVTWSA9IDcsCisJQlRfT1RIRVJCVVNZID0gOCwKKwlCVF9QQU4gPSA5LAogfTsKIAogZW51bSBidF9yYWRpb19zaGFyZWQgewotICAgICAgICBCVF9SQURJT19TSEFSRUQgPSAwLAotICAgICAgICBCVF9SQURJT19JTkRJVklEVUFMID0gMSwKKwlCVF9SQURJT19TSEFSRUQgPSAwLAorCUJUX1JBRElPX0lORElWSURVQUwgPSAxLAogfTsKIAogc3RydWN0IGJ0X2NvZXhpc3RfaW5mbyB7CkBAIC0yMjU1LDExICsyMjU3LDExIEBACiAKIC8qIFdyaXRlIGRhdGEgdG8gbWVtb3J5ICovCiAjZGVmaW5lIFdSSVRFRUYxQllURShfcHRyLCBfdmFsKQlcCi0JKCooKHU4ICopKF9wdHIpKSk9RUYxQllURShfdmFsKQorCSgoKigodTggKikoX3B0cikpKSA9IEVGMUJZVEUoX3ZhbCkpCiAjZGVmaW5lIFdSSVRFRUYyQllURShfcHRyLCBfdmFsKQlcCi0JKCooKHUxNiAqKShfcHRyKSkpPUVGMkJZVEUoX3ZhbCkKKwkoKCooKHUxNiAqKShfcHRyKSkpID0gRUYyQllURShfdmFsKSkKICNkZWZpbmUgV1JJVEVFRjRCWVRFKF9wdHIsIF92YWwpCVwKLQkoKigodTMyICopKF9wdHIpKSk9RUY0QllURShfdmFsKQorCSgoKigodTMyICopKF9wdHIpKSkgPSBFRjRCWVRFKF92YWwpKQogCiAvKkV4YW1wbGU6CiBCSVRfTEVOX01BU0tfMzIoMCkgPT4gMHgwMDAwMDAwMApAQCAtMjI5OCwxNyArMjMwMCwxNyBAQAogdmFsdWUgdG8gaG9zdCBieXRlIG9yZGVyaW5nLiovCiAjZGVmaW5lIExFX0JJVFNfVE9fNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAogCSggXAotCQkoIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpICkgICYgXAorCQkoTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkpICAmIFwKIAkJQklUX0xFTl9NQVNLXzMyKF9fYml0bGVuKSBcCiAJKQogI2RlZmluZSBMRV9CSVRTX1RPXzJCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIFwKIAkoIFwKLQkJKCBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BzdGFydCkgPj4gKF9fYml0b2Zmc2V0KSApICYgXAorCQkoTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkpICYgXAogCQlCSVRfTEVOX01BU0tfMTYoX19iaXRsZW4pIFwKIAkpCiAjZGVmaW5lIExFX0JJVFNfVE9fMUJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAogCSggXAotCQkoIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpICkgJiBcCisJCShMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BzdGFydCkgPj4gKF9fYml0b2Zmc2V0KSkgJiBcCiAJCUJJVF9MRU5fTUFTS184KF9fYml0bGVuKSBcCiAJKQogCkBAIC0yMzE4LDE3ICsyMzIwLDE3IEBACiAjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCiAJKCBcCiAJCUxFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcHN0YXJ0KSAgJiBcCi0JCSggfkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19iaXRvZmZzZXQsIF9fYml0bGVuKSApIFwKKwkJKH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fYml0b2Zmc2V0LCBfX2JpdGxlbikpIFwKIAkpCiAjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18yQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCiAJKCBcCiAJCUxFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcHN0YXJ0KSAmIFwKLQkJKCB+QklUX09GRlNFVF9MRU5fTUFTS18xNihfX2JpdG9mZnNldCwgX19iaXRsZW4pICkgXAorCQkofkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19iaXRvZmZzZXQsIF9fYml0bGVuKSkgXAogCSkKICNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIFwKIAkoIFwKIAkJTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wc3RhcnQpICYgXAotCQkoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19iaXRvZmZzZXQsIF9fYml0bGVuKSApIFwKKwkJKH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19iaXRvZmZzZXQsIF9fYml0bGVuKSkgXAogCSkKIAogLypEZXNjcmlwdGlvbjoKQEAgLTIzMzcsMTkgKzIzMzksMTkgQEAKIAkqKCh1MzIgKikoX19wc3RhcnQpKSA9IEVGNEJZVEUgXAogCSggXAogCQlMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgfCBcCi0JCSggKCgodTMyKV9fdmFsKSAmIEJJVF9MRU5fTUFTS18zMihfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkgKVwKKwkJKCgoKHUzMilfX3ZhbCkgJiBCSVRfTEVOX01BU0tfMzIoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpKVwKICAgICAgICApOwogI2RlZmluZSBTRVRfQklUU19UT19MRV8yQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuLCBfX3ZhbCkgXAogCSooKHUxNiAqKShfX3BzdGFydCkpID0gRUYyQllURSBcCiAJKCBcCiAJCUxFX0JJVFNfQ0xFQVJFRF9UT18yQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSB8IFwKLQkJKCAoKCh1MTYpX192YWwpICYgQklUX0xFTl9NQVNLXzE2KF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSApXAorCQkoKCgodTE2KV9fdmFsKSAmIEJJVF9MRU5fTUFTS18xNihfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkpXAogICAgICAgICk7CiAjZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4sIF9fdmFsKSBcCiAJKigodTggKikoX19wc3RhcnQpKSA9IEVGMUJZVEUgXAogCSggXAogCQlMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgfCBcCi0JCSggKCgodTgpX192YWwpICYgQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpICkgXAorCQkoKCgodTgpX192YWwpICYgQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpKSBcCiAgICAgICAgKTsKIAogI2RlZmluZQlOX0JZVEVfQUxJR01FTlQoX192YWx1ZSwgX19hbGlnbWVudCkgKChfX2FsaWdtZW50ID09IDEpID8gXApAQCAtMjM1OSwxOCArMjM2MSwxOCBAQAogCW1lbSBhY2Nlc3MgbWFjcm8gZGVmaW5lIGVuZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBieXRlKHgsbikgKCh4ID4+ICg4ICogbikpICYgMHhmZikKKyNkZWZpbmUgYnl0ZSh4LCBuKSAoKHggPj4gKDggKiBuKSkgJiAweGZmKQogCiAjZGVmaW5lIHBhY2tldF9nZXRfdHlwZShfcGFja2V0KSAoRUYxQllURSgoX3BhY2tldCkub2N0ZXRbMF0pICYgMHhGQykKLSNkZWZpbmUgUlRMX1dBVENIX0RPR19USU1FICAgIAkyMDAwCisjZGVmaW5lIFJUTF9XQVRDSF9ET0dfVElNRQkyMDAwCiAjZGVmaW5lIE1TRUNTKHQpCQltc2Vjc190b19qaWZmaWVzKHQpCi0jZGVmaW5lIFdMQU5fRkNfR0VUX1ZFUlMoZmMpIAkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpCi0jZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpIAkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQotI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCi0jZGVmaW5lIFdMQU5fRkNfTU9SRV9EQVRBKGZjKSAJKChmYykgJiBJRUVFODAyMTFfRkNUTF9NT1JFREFUQSkKLSNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgCQkoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQotI2RlZmluZSBTTl9UT19TRVEoc3NuKSAJCSgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCi0jZGVmaW5lIE1BWF9TTiAJCQkoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykJKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKQkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykJKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19NT1JFX0RBVEEoZmMpCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpCisjZGVmaW5lIFNFUV9UT19TTihzZXEpCQkoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorI2RlZmluZSBTTl9UT19TRVEoc3NuKQkJKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKyNkZWZpbmUgTUFYX1NOCQkJKChJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCiAKICNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfQVNQTQkJQklUKDApCS8qUENJIEFTUE0gKi8KICNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfQ0xLX1JFUQkJQklUKDEpCS8qUENJIGNsb2NrIHJlcXVlc3QgKi8KQEAgLTIzODMsNyArMjM4NSw3IEBACiAjZGVmaW5lCVJUX1JGX1BTX0xFVkVMX0FMV0FZU19BU1BNCUJJVCg2KQogLyogbm8gbWF0dGVyIFJGT0ZGIG9yIFNMRUVQIHdlIHNldCBQU19BU1BNX0xFVkwqLwogI2RlZmluZQlSVF9QU19MRVZFTF9BU1BNCQlCSVQoNykKLS8qV2hlbiBMUFMgaXMgb24sIGRpc2FibGUgMlIgaWYgbm8gcGFja2V0IGlzIHJlY2VpdmVkIG9yIHRyYW5zbWl0dGQuKi8KKy8qV2hlbiBMUFMgaXMgb24sIGRpc2FibGUgMlIgaWYgbm8gcGFja2V0IGlzIHJlY2VpdmVkIG9yIHRyYW5zbWl0dGVkLiovCiAjZGVmaW5lCVJUX1JGX0xQU19ESVNBTEJFXzJSCQlCSVQoMzApCiAjZGVmaW5lCVJUX1JGX0xQU19MRVZFTF9BU1BNCQlCSVQoMzEpCS8qTFBTIHdpdGggQVNQTSAqLwogI2RlZmluZQlSVF9JTl9QU19MRVZFTChwcHNjLCBfcHNfZmxnKQkJXApAQCAtMjM5NywxMyArMjM5OSwxMyBAQAogCWNvbnRhaW5lcl9vZihjb250YWluZXJfb2YoeCwgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayksIHksIHopCiAKICNkZWZpbmUgRklMTF9PQ1RFVF9TVFJJTkcoX29zLF9vY3RldCxfbGVuKQlcCi0JCShfb3MpLm9jdGV0PSh1OCopKF9vY3RldCk7CQlcCi0JCShfb3MpLmxlbmd0aD0oX2xlbik7CisJCShfb3MpLm9jdGV0ID0gKHU4ICopKF9vY3RldCk7CQlcCisJCShfb3MpLmxlbmd0aCA9IChfbGVuKTsKIAogI2RlZmluZSBDUF9NQUNBRERSKGRlcyxzcmMpCVwKLQkoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sXAotCShkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLFwKLQkoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkKKwkoKGRlcylbMF0gPSAoc3JjKVswXSwoZGVzKVsxXSA9IChzcmMpWzFdLFwKKwkoZGVzKVsyXSA9IChzcmMpWzJdLChkZXMpWzNdID0gKHNyYylbM10sXAorCShkZXMpWzRdID0gKHNyYylbNF0sKGRlcylbNV0gPSAoc3JjKVs1XSkKIAogc3RhdGljIGlubGluZSB1OCBydGxfcmVhZF9ieXRlKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXMuYwppbmRleCA5MjUzZjZhLi4zOTAyOTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmMKQEAgLTEwMzMsOCArMTAzMyw3IEBACiAJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyA1XSA8PCAxNikgfAogCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgNl0gPDwgOCkgfAogCQkJICAgIGJ1ZltjdXJfYWRkcl9vZmYgKyA3XTsKLQkJCVJUUzUxWF9ERUJVR1AoInN5c19pbmZvX2FkZHIgPSAweCV4LCIKLQkJCQkJInN5c19pbmZvX3NpemUgPSAweCV4XG4iLAorCQkJUlRTNTFYX0RFQlVHUCgic3lzX2luZm9fYWRkciA9IDB4JXgsIHN5c19pbmZvX3NpemUgPSAweCV4XG4iLAogCQkJCQkJc3lzX2luZm9fYWRkciwgc3lzX2luZm9fc2l6ZSk7CiAJCQlpZiAoc3lzX2luZm9fc2l6ZSAhPSA5NikgewogCQkJCWtmcmVlKGJ1Zik7CkBAIC0xMDY5LDggKzEwNjgsNyBAQAogCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgNV0gPDwgMTYpIHwKIAkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDZdIDw8IDgpIHwKIAkJCSAgICBidWZbY3VyX2FkZHJfb2ZmICsgN107Ci0JCQlSVFM1MVhfREVCVUdQKCJtb2RlbF9uYW1lX2FkZHIgPSAweCV4LCIKLQkJCQkJIm1vZGVsX25hbWVfc2l6ZSA9IDB4JXhcbiIsCisJCQlSVFM1MVhfREVCVUdQKCJtb2RlbF9uYW1lX2FkZHIgPSAweCV4LCBtb2RlbF9uYW1lX3NpemUgPSAweCV4XG4iLAogCQkJCQltb2RlbF9uYW1lX2FkZHIsIG1vZGVsX25hbWVfc2l6ZSk7CiAJCQlpZiAobW9kZWxfbmFtZV9zaXplICE9IDQ4KSB7CiAJCQkJa2ZyZWUoYnVmKTsKQEAgLTE3NTEsOCArMTc0OSw3IEBACiAJCQkJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOwogCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJdW5jb3JyZWN0X2ZsYWcgPSAxOwotCQkJCQlSVFM1MVhfREVCVUdQKCJVbmNvcnJlY3RhYmxlIgotCQkJCQkJCQkiZXJyb3JcbiIpOworCQkJCQlSVFM1MVhfREVCVUdQKCJVbmNvcnJlY3RhYmxlIGVycm9yXG4iKTsKIAkJCQl9IGVsc2UgewogCQkJCQl1bmNvcnJlY3RfZmxhZyA9IDA7CiAJCQkJfQpAQCAtMTc3MCw4ICsxNzY3LDcgQEAKIAkJCQkJbXNfd3JpdGVfZXh0cmFfZGF0YShjaGlwLCBvbGRfYmxrLCBpLAogCQkJCQkJCSAgICBleHRyYSwKIAkJCQkJCQkgICAgTVNfRVhUUkFfU0laRSk7Ci0JCQkJCVJUUzUxWF9ERUJVR1AoInBhZ2UgJWQgOiIKLQkJCQkJCQkiZXh0cmFbMF0gPSAweCV4XG4iLAorCQkJCQlSVFM1MVhfREVCVUdQKCJwYWdlICVkIDogZXh0cmFbMF0gPSAweCV4XG4iLAogCQkJCQkJCWksIGV4dHJhWzBdKTsKIAkJCQkJTVNfU0VUX0JBRF9CTE9DS19GTEcobXNfY2FyZCk7CiAKQEAgLTE5MzIsOCArMTkyOCw3IEBACiAJdTggcGFnZV9sZW4sIGJ1c193aWR0aCwgdmFsID0gMDsKIAl1OCBleHRyYVtNU19FWFRSQV9TSVpFXTsKIAotCVJUUzUxWF9ERUJVR1AoIkF1dG8gY29weSBwYWdlIGZyb20gMHgleCB0byAweCV4LCIKLQkJCQkibG9naWNhbCBibG9jayBpcyAweCV4XG4iLAorCVJUUzUxWF9ERUJVR1AoIkF1dG8gY29weSBwYWdlIGZyb20gMHgleCB0byAweCV4LCBsb2dpY2FsIGJsb2NrIGlzIDB4JXhcbiIsCiAJCQkJb2xkX2JsaywgbmV3X2JsaywgbG9nX2Jsayk7CiAJUlRTNTFYX0RFQlVHUCgic3RhcnRfcGFnZSA9ICVkLCBlbmRfcGFnZSA9ICVkXG4iLCBzdGFydF9wYWdlLAogCQkgICAgICAgZW5kX3BhZ2UpOwpAQCAtMjU1NSw4ICsyNTUwLDcgQEAKIAkJZm9yIChsb2dfYmxrID0gMDsgbG9nX2JsayA8IDQ5NDsgbG9nX2JsaysrKSB7CiAJCQl0bXBfYmxrID0gc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19ibGtdOwogCQkJaWYgKHRtcF9ibGsgPCBtc19jYXJkLT5ib290X2Jsb2NrKSB7Ci0JCQkJUlRTNTFYX0RFQlVHUCgiQm9vdCBibG9jayBpcyBub3QgdGhlIGZpcnN0IgotCQkJCQkJCSJub3JtYWwgYmxvY2suXG4iKTsKKwkJCQlSVFM1MVhfREVCVUdQKCJCb290IGJsb2NrIGlzIG5vdCB0aGUgZmlyc3Qgbm9ybWFsIGJsb2NrLlxuIik7CiAKIAkJCQlpZiAoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpCiAJCQkJCWJyZWFrOwpAQCAtMzk3Niw4ICszOTcwLDcgQEAKIAkJCWVuZF9wYWdlID0gc3RhcnRfcGFnZSArICh1OCkgdG90YWxfc2VjX2NudDsKIAkJcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CiAKLQkJUlRTNTFYX0RFQlVHUCgic3RhcnRfcGFnZSA9ICVkLCBlbmRfcGFnZSA9ICVkLCIKLQkJCQkJInBhZ2VfY250ID0gJWRcbiIsCisJCVJUUzUxWF9ERUJVR1AoInN0YXJ0X3BhZ2UgPSAlZCwgZW5kX3BhZ2UgPSAlZCwgcGFnZV9jbnQgPSAlZFxuIiwKIAkJCQkJc3RhcnRfcGFnZSwgZW5kX3BhZ2UsIHBhZ2VfY250KTsKIAogCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tc19tZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXNfbWcuYwppbmRleCA1NGNmZDg1Li4wMDg2MmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tc19tZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgogI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCiAjaW5jbHVkZSAibXMuaCIKKyNpbmNsdWRlICJtc19tZy5oIgogCiAjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4LmMKaW5kZXggYThkMmQwNC4uYzhkMDZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4LmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogICogYSBVU0IgcG9ydCByZXNldCwgd2hldGhlciBmcm9tIHRoaXMgZHJpdmVyIG9yIGEgZGlmZmVyZW50IG9uZS4KICAqLwogCi1pbnQgcnRzNTF4X3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCitzdGF0aWMgaW50IHJ0czUxeF9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQogewogCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJ0czUxeF9wb3N0X3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3N0YXRpYyBpbnQgcnRzNTF4X3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQogewogCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCkBAIC04MzIsNyArODMyLDcgQEAKICAqIEluaXRpYWxpemF0aW9uIGFuZCByZWdpc3RyYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRzNTEzOV91c2JfaWRzW10gPSB7CitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRzNTEzOV91c2JfaWRzW10gPSB7CiAJe1VTQl9ERVZJQ0UoMHgwQkRBLCAweDAxMzkpfSwKIAl7VVNCX0RFVklDRSgweDBCREEsIDB4MDEyOSl9LAogCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuYwppbmRleCBkZWU3ZDhhLi42NzdkMThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5jCkBAIC05Myw3ICs5Myw3IEBACiAJCX0KIAogCQlyZXR2YWwgPQotCQkgICAgY29weV90b191c2VyKCh2b2lkICopY21uZC0+YnVmLCAodm9pZCAqKWJ1ZiwgY21uZC0+YnVmX2xlbik7CisJCSAgICBjb3B5X3RvX3VzZXIoY21uZC0+YnVmLCAodm9pZCAqKWJ1ZiwgY21uZC0+YnVmX2xlbik7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWtmcmVlKGJ1Zik7CiAJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CiAKIAkJcmV0dmFsID0KLQkJICAgIGNvcHlfZnJvbV91c2VyKCh2b2lkICopYnVmLCAodm9pZCAqKWNtbmQtPmJ1ZiwKKwkJICAgIGNvcHlfZnJvbV91c2VyKCh2b2lkICopYnVmLCBjbW5kLT5idWYsCiAJCQkJICAgY21uZC0+YnVmX2xlbik7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWtmcmVlKGJ1Zik7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAllbHNlCiAJCWNvdW50ID0gKHJzcC0+cnNwX2xlbiA8IDYpID8gcnNwLT5yc3BfbGVuIDogNjsKIAotCXJldHZhbCA9IGNvcHlfdG9fdXNlcigodm9pZCAqKXJzcC0+cnNwLCAodm9pZCAqKXNkX2NhcmQtPnJzcCwgY291bnQpOworCXJldHZhbCA9IGNvcHlfdG9fdXNlcihyc3AtPnJzcCwgKHZvaWQgKilzZF9jYXJkLT5yc3AsIGNvdW50KTsKIAlpZiAocmV0dmFsKQogCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKIApAQCAtMjUwLDcgKzI1MCw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJUUzUxMzlfSU9DX1NEX0RJUkVDVDoKIAkJcmV0dmFsID0KLQkJICAgIGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmNtbmQsICh2b2lkICopYXJnLAorCQkgICAgY29weV9mcm9tX3VzZXIoKHZvaWQgKikmY21uZCwgKHZvaWQgX191c2VyICopYXJnLAogCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2RfZGlyZWN0X2NtbmQpKTsKIAkJaWYgKHJldHZhbCkgewogCQkJcmV0dmFsID0gLUVOT01FTTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiAJY2FzZSBSVFM1MTM5X0lPQ19TRF9HRVRfUlNQOgogCQlyZXR2YWwgPQotCQkgICAgY29weV9mcm9tX3VzZXIoKHZvaWQgKikmcnNwLCAodm9pZCAqKWFyZywKKwkJICAgIGNvcHlfZnJvbV91c2VyKCZyc3AsICh2b2lkIF9fdXNlciAqKWFyZywKIAkJCQkgICBzaXplb2Yoc3RydWN0IHNkX3JzcCkpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlyZXR2YWwgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5oCmluZGV4IGViNDVhY2YuLmM2OTFlZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmgKQEAgLTM1LDEyICszNSwxMiBAQAogCiBzdHJ1Y3Qgc2RfZGlyZWN0X2NtbmQgewogCXU4IGNtbmRbMTJdOwotCXZvaWQgKmJ1ZjsKKwl2b2lkIF9fdXNlciAqYnVmOwogCWludCBidWZfbGVuOwogfTsKIAogc3RydWN0IHNkX3JzcCB7Ci0Jdm9pZCAqcnNwOworCXZvaWQgX191c2VyICpyc3A7CiAJaW50IHJzcF9sZW47CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYwppbmRleCAzYTk5MDI1Li43NTI4MmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zY3NpLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKIH0KIAotdW5zaWduZWQgY2hhciBmb3JtYXR0ZXJfaW5xdWlyeV9zdHJbMjBdID0geworc3RhdGljIHVuc2lnbmVkIGNoYXIgZm9ybWF0dGVyX2lucXVpcnlfc3RyWzIwXSA9IHsKIAknTScsICdFJywgJ00nLCAnTycsICdSJywgJ1knLCAnUycsICdUJywgJ0knLCAnQycsICdLJywKIAknLScsICdNJywgJ0cnLAkJLyogQnl0ZVs0Nzo0OV0gKi8KIAkweDBCLAkJCS8qIEJ5dGVbNTBdOiBNRywgTVMsIE1TUHJvLCBNU1hDICovCkBAIC0xOTkwLDcgKzE5OTAsNyBAQAogCiAvKiBxdWV1ZSBhIGNvbW1hbmQgKi8KIC8qIFRoaXMgaXMgYWx3YXlzIGNhbGxlZCB3aXRoIHNjc2lfbG9jayhob3N0KSBoZWxkICovCi1pbnQgcXVldWVjb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3N0YXRpYyBpbnQgcXVldWVjb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKIAlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSBob3N0X3RvX3J0czUxeChzcmItPmRldmljZS0+aG9zdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuYwppbmRleCBjMTcyZjRhZS4uNzQ1ODhkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuYwpAQCAtNjQ2LDkgKzY0Niw5IEBACiAJCQkJICAgIGNoaXAtPnVzYi0+aW50cl91cmItPmFjdHVhbF9sZW5ndGgpOwogfQogCi11OCBtZWRpYV9ub3RfcHJlc2VudFtdID0geworc3RhdGljIHU4IG1lZGlhX25vdF9wcmVzZW50W10gPSB7CiAJMHg3MCwgMCwgMHgwMiwgMCwgMCwgMCwgMCwgMTAsIDAsIDAsIDAsIDAsIDB4M0EsIDAsIDAsIDAsIDAsIDAgfTsKLXU4IGludmFsaWRfY21kX2ZpZWxkW10gPSB7CitzdGF0aWMgdTggaW52YWxpZF9jbWRfZmllbGRbXSA9IHsKIAkweDcwLCAwLCAweDA1LCAwLCAwLCAwLCAwLCAxMCwgMCwgMCwgMCwgMCwgMHgyNCwgMCwgMCwgMCwgMCwgMCB9OwogCiB2b2lkIHJ0czUxeF9pbnZva2VfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmMKaW5kZXggNDI4M2IwOS4uZGE1YTliOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZC5jCkBAIC0xNTI5LDcgKzE1MjksNyBAQAogCWludCBpLCBqOwogCXUzMiByYXdfcGhhc2VfbWFwWzNdLCBwaGFzZV9tYXA7CiAJdTggZmluYWxfcGhhc2U7Ci0JaW50ICgqdHVuaW5nX2NtZCkgKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KTsKKwlpbnQgKCp0dW5pbmdfY21kKShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCk7CiAKIAlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CiAJCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpCkBAIC0xNjI3LDcgKzE2MjcsNyBAQAogCWludCBpLCBqOwogCXUzMiByYXdfcGhhc2VfbWFwWzNdLCBwaGFzZV9tYXA7CiAJdTggZmluYWxfcGhhc2U7Ci0JaW50ICgqdHVuaW5nX2NtZCkgKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KTsKKwlpbnQgKCp0dW5pbmdfY21kKShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCk7CiAKIAlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CiAJCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZF9jcHJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZF9jcHJtLmMKaW5kZXggZDQ2ODk4My4uY2VkZTZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2RfY3BybS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgInJ0czUxeF9zY3NpLmgiCiAjaW5jbHVkZSAicnRzNTF4X2NhcmQuaCIKICNpbmNsdWRlICJydHM1MXhfY2hpcC5oIgorI2luY2x1ZGUgInNkX2Nwcm0uaCIKICNpbmNsdWRlICJzZC5oIgogCiAjaWZkZWYgU1VQUE9SVF9DUFJNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS94ZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuYwppbmRleCAxMGZlYTdlLi5iZTQzMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS94ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3hkLmMKQEAgLTQ3Myw3ICs0NzMsOCBAQAogCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9EVENUTCwgMHhGRiwKIAkJCVhEX1RJTUVfU0VUVVBfU1RFUCAqIDMgKyBYRF9USU1FX1JXX1NURVAgKgogCQkJKDIgKyBpICsgY2hpcC0+b3B0aW9uLnJ0czUxeF94ZF9yd19zdGVwKQotCQkJKyBYRF9USU1FX1JXTl9TVEVQICogKGkgKyBjaGlwLT5vcHRpb24ucnRzNTF4X3hkX3J3bl9zdGVwKSk7CisJCQkrIFhEX1RJTUVfUldOX1NURVAgKgorCQkJKGkgKyBjaGlwLT5vcHRpb24ucnRzNTF4X3hkX3J3bl9zdGVwKSk7CiAJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NBVENUTCwgMHhGRiwKIAkJCVhEX1RJTUVfU0VUVVBfU1RFUCAqIDMgKyBYRF9USU1FX1JXX1NURVAgKiAoNCArCiAJCQlpKSArIFhEX1RJTUVfUldOX1NURVAgKiAoMyArIGkpKTsKQEAgLTE1MjYsOCArMTUyNyw4IEBACiAJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0hLX0RBVEFfU1RBVFVTLAogCQkgICAgICAgWERfQVVUT19DSEtfREFUQV9TVEFUVVMsIFhEX0FVVE9fQ0hLX0RBVEFfU1RBVFVTKTsKIAotCXJ0czUxeF90cmFuc19kbWFfZW5hYmxlKGNoaXAtPnNyYi0+c2NfZGF0YV9kaXJlY3Rpb24sIGNoaXAsIHBhZ2VfY250ICogNTEyLAotCQkJIERNQV81MTIpOworCXJ0czUxeF90cmFuc19kbWFfZW5hYmxlKGNoaXAtPnNyYi0+c2NfZGF0YV9kaXJlY3Rpb24sIGNoaXAsCisJCQlwYWdlX2NudCAqIDUxMiwgRE1BXzUxMik7CiAKIAlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKIAkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfUkVBRF9QQUdFUyk7CkBAIC0xNzQ1LDggKzE3NDYsOCBAQAogCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCiAJCSAgICAgICBSSU5HX0JVRkZFUik7CiAKLQlydHM1MXhfdHJhbnNfZG1hX2VuYWJsZShjaGlwLT5zcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLCBwYWdlX2NudCAqIDUxMiwKLQkJCSBETUFfNTEyKTsKKwlydHM1MXhfdHJhbnNfZG1hX2VuYWJsZShjaGlwLT5zcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLAorCQkJcGFnZV9jbnQgKiA1MTIsIERNQV81MTIpOwogCiAJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCiAJCSAgICAgICBYRF9UUkFOU0ZFUl9TVEFSVCB8IFhEX1dSSVRFX1BBR0VTKTsKQEAgLTE4NDIsOCArMTg0Myw4IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi1pbnQgcnRzNTF4X3hkX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgc3RhcnRfc2VjdG9yLAotCSAgdTE2IHNlY3Rvcl9jbnQpCitpbnQgcnRzNTF4X3hkX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCXUzMiBzdGFydF9zZWN0b3IsIHUxNiBzZWN0b3JfY250KQogewogCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKQEAgLTE4ODMsNyArMTg4NCw4IEBACiAJCXJldHZhbCA9IHhkX2J1aWxkX2wycF90YmwoY2hpcCwgem9uZV9ubyk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWNoaXAtPmNhcmRfZmFpbCB8PSBYRF9DQVJEOwotCQkJcnRzNTF4X3NldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQlydHM1MXhfc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCVNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYwppbmRleCBlZGY5NzlmLi5kMjI5MTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCQlNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YV9sZW4gLSAxOyBpKyspCi0JICAgICAgIHJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgaSwgMCwgMCk7CisJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgaSwgMCwgMCk7CiAKIAlpZiAoZGF0YV9sZW4gJSAyKQogCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGRhdGFfbGVuLCAwLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYwppbmRleCA4NTg2YWM1Li5kMmQxMzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCkBAIC0xMDMxLDggKzEwMzEsMTAgQEAKIAogLyogUENJIElEcyAqLwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHJ0c3hfaWRzKSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDUyMDgpLCBQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4NTI4OCksIFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg1MjA4KSwKKwkJUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDUyODgpLAorCQlQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAogCXsgMCwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKaW5kZXggMzA1NWViMS4uMDFhZWIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKQEAgLTEwNSw4ICsxMDUsMTAgQEAKIAlSVFNYX0RFQlVHUCgicmVnIDB4RkYzNDogMHgleCwgcmVnIDB4RkYzODogMHgleFxuIiwgcmVnMSwgcmVnMik7CiAJaWYgKChyZWcxICYgMHhDMCkgJiYgKHJlZzIgJiAweEMwKSkgewogCQljaGlwLT5zZF9pbnQgPSAxOwotCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNESU9fQ1RSTCwgMHhGRiwgU0RJT19CVVNfQ1RSTCB8IFNESU9fQ0RfQ1RSTCk7Ci0JCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUFdSX0dBVEVfQ1RSTCwgTERPMzMxOF9QV1JfTUFTSywgTERPX09OKTsKKwkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRElPX0NUUkwsIDB4RkYsCisJCQkJU0RJT19CVVNfQ1RSTCB8IFNESU9fQ0RfQ1RSTCk7CisJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUFdSX0dBVEVfQ1RSTCwKKwkJCQlMRE8zMzE4X1BXUl9NQVNLLCBMRE9fT04pOwogCX0KIH0KIApAQCAtNDUyLDcgKzQ1NCw4IEBACiB9CiAKICNpZmRlZiBESVNBQkxFX0NBUkRfSU5UCi12b2lkIGNhcmRfY2RfZGVib3VuY2Uoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyAqbmVlZF9yZXNldCwgdW5zaWduZWQgbG9uZyAqbmVlZF9yZWxlYXNlKQordm9pZCBjYXJkX2NkX2RlYm91bmNlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGxvbmcgKm5lZWRfcmVzZXQsCisJCXVuc2lnbmVkIGxvbmcgKm5lZWRfcmVsZWFzZSkKIHsKIAl1OCByZWxlYXNlX21hcCA9IDAsIHJlc2V0X21hcCA9IDA7CiAKQEAgLTUwNCwxMSArNTA3LDE0IEBACiAJCX0KIAogCQlyZXNldF9tYXAgPSAwOwotCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgWERfQ0FSRCkgJiYgKHhkX2NudCA+IChERUJPVU5DRV9DTlQtMSkpKQorCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgWERfQ0FSRCkgJiYKKwkJCQkoeGRfY250ID4gKERFQk9VTkNFX0NOVC0xKSkpCiAJCQlyZXNldF9tYXAgfD0gWERfQ0FSRDsKLQkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIFNEX0NBUkQpICYmIChzZF9jbnQgPiAoREVCT1VOQ0VfQ05ULTEpKSkKKwkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIFNEX0NBUkQpICYmCisJCQkJKHNkX2NudCA+IChERUJPVU5DRV9DTlQtMSkpKQogCQkJcmVzZXRfbWFwIHw9IFNEX0NBUkQ7Ci0JCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBNU19DQVJEKSAmJiAobXNfY250ID4gKERFQk9VTkNFX0NOVC0xKSkpCisJCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBNU19DQVJEKSAmJgorCQkJCShtc19jbnQgPiAoREVCT1VOQ0VfQ05ULTEpKSkKIAkJCXJlc2V0X21hcCB8PSBNU19DQVJEOwogCX0KIApAQCAtNTQ5LDcgKzU1NSw4IEBACiAJCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBNU19DQVJEKSkKIAkJCWNsZWFyX2JpdChNU19OUiwgJihjaGlwLT5uZWVkX3JlbGVhc2UpKTsKIAotCQlSVFNYX0RFQlVHUCgiY2hpcC0+bmVlZF9yZWxlYXNlID0gMHgleFxuIiwgKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZWxlYXNlKSk7CisJCVJUU1hfREVCVUdQKCJjaGlwLT5uZWVkX3JlbGVhc2UgPSAweCV4XG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpKGNoaXAtPm5lZWRfcmVsZWFzZSkpOwogCiAjaWZkZWYgU1VQUE9SVF9PQ1AKIAkJaWYgKGNoaXAtPm5lZWRfcmVsZWFzZSkgewpAQCAtNTg4LDggKzU5NSwxMCBAQAogCiAJCQlyZWxlYXNlX3hkX2NhcmQoY2hpcCk7CiAKLQkJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSAmJiBDSEVDS19CQVJPX1BLRyhjaGlwLCBRRk4pKQotCQkJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgSE9TVF9TTEVFUF9TVEFURSwgMHhDMCwgMHhDMCk7CisJCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkgJiYKKwkJCQkJQ0hFQ0tfQkFST19QS0coY2hpcCwgUUZOKSkKKwkJCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEhPU1RfU0xFRVBfU1RBVEUsCisJCQkJCQkweEMwLCAweEMwKTsKIAkJfQogCiAJCWlmIChjaGlwLT5uZWVkX3JlbGVhc2UgJiBNU19DQVJEKSB7CkBAIC02MTAsMTMgKzYxOSwxNSBAQAogCX0KIAogCWlmIChjaGlwLT5uZWVkX3Jlc2V0KSB7Ci0JCVJUU1hfREVCVUdQKCJjaGlwLT5uZWVkX3Jlc2V0ID0gMHgleFxuIiwgKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZXNldCkpOworCQlSVFNYX0RFQlVHUCgiY2hpcC0+bmVlZF9yZXNldCA9IDB4JXhcbiIsCisJCQkJKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZXNldCkpOwogCiAJCXJ0c3hfcmVzZXRfY2FyZHMoY2hpcCk7CiAJfQogCiAJaWYgKGNoaXAtPm5lZWRfcmVpbml0KSB7Ci0JCVJUU1hfREVCVUdQKCJjaGlwLT5uZWVkX3JlaW5pdCA9IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpKGNoaXAtPm5lZWRfcmVpbml0KSk7CisJCVJUU1hfREVCVUdQKCJjaGlwLT5uZWVkX3JlaW5pdCA9IDB4JXhcbiIsCisJCQkJKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZWluaXQpKTsKIAogCQlydHN4X3JlaW5pdF9jYXJkcyhjaGlwLCAwKTsKIAl9CkBAIC02MjQsNyArNjM1LDcgQEAKIAogc3RhdGljIGlubGluZSB1OCBkb3VibGVfZGVwdGgodTggZGVwdGgpCiB7Ci0JcmV0dXJuICgoZGVwdGggPiAxKSA/IChkZXB0aCAtIDEpIDogZGVwdGgpOworCXJldHVybiAoZGVwdGggPiAxKSA/IChkZXB0aCAtIDEpIDogZGVwdGg7CiB9CiAKIGludCBzd2l0Y2hfc3NjX2Nsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjbGspCkBAIC02NDEsNyArNjUyLDggQEAKIAltYXhfTiA9IDEyMDsKIAltYXhfZGl2ID0gQ0xLX0RJVl80OwogCi0JUlRTWF9ERUJVR1AoIlN3aXRjaCBTU0MgY2xvY2sgdG8gJWRNSHogKGN1cl9jbGsgPSAlZClcbiIsIGNsaywgY2hpcC0+Y3VyX2Nsayk7CisJUlRTWF9ERUJVR1AoIlN3aXRjaCBTU0MgY2xvY2sgdG8gJWRNSHogKGN1cl9jbGsgPSAlZClcbiIsCisJCQljbGssIGNoaXAtPmN1cl9jbGspOwogCiAJaWYgKChjbGsgPD0gMikgfHwgKE4gPiBtYXhfTikpCiAJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CkBAIC02NzYsOCArNjg4LDEwIEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19ESVZfTl8wLCAweEZGLCBOKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDEsIFNTQ19SU1RCLCBTU0NfUlNUQik7CiAJaWYgKHNkX3ZwY2xrX3BoYXNlX3Jlc2V0KSB7Ci0JCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIDApOwotCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOworCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVlBDTEswX0NUTCwKKwkJCVBIQVNFX05PVF9SRVNFVCwgMCk7CisJCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLAorCQkJUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOwogCX0KIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgV0FJVF9USU1FKTsKQEAgLTc4Niw4ICs4MDAsMTAgQEAKIAogCWlmIChzZF92cGNsa19waGFzZV9yZXNldCkgewogCQl1ZGVsYXkoMjAwKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzFfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIFBIQVNFX05PVF9SRVNFVCk7CisJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsIFBIQVNFX05PVF9SRVNFVCwKKwkJCQlQSEFTRV9OT1RfUkVTRVQpOworCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzFfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsCisJCQkJUEhBU0VfTk9UX1JFU0VUKTsKIAkJdWRlbGF5KDIwMCk7CiAJfQogCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19DVEwsIDB4RkYsIDApOwpAQCAtNzk3LDcgKzgxMyw4IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi12b2lkIHRyYW5zX2RtYV9lbmFibGUoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MzIgYnl0ZV9jbnQsIHU4IHBhY2tfc2l6ZSkKK3ZvaWQgdHJhbnNfZG1hX2VuYWJsZShlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCisJCXUzMiBieXRlX2NudCwgdTggcGFja19zaXplKQogewogCWlmIChwYWNrX3NpemUgPiBETUFfMTAyNCkKIAkJcGFja19zaXplID0gRE1BXzUxMjsKQEAgLTgxMCwxMCArODI3LDEyIEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIERNQVRDMCwgMHhGRiwgKHU4KWJ5dGVfY250KTsKIAogCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB7Ci0JCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBETUFDVEwsIDB4MDMgfCBETUFfUEFDS19TSVpFX01BU0ssCisJCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBETUFDVEwsCisJCQkweDAzIHwgRE1BX1BBQ0tfU0laRV9NQVNLLAogCQkJICAgICBETUFfRElSX0ZST01fQ0FSRCB8IERNQV9FTiB8IHBhY2tfc2l6ZSk7CiAJfSBlbHNlIHsKLQkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIERNQUNUTCwgMHgwMyB8IERNQV9QQUNLX1NJWkVfTUFTSywKKwkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIERNQUNUTCwKKwkJCTB4MDMgfCBETUFfUEFDS19TSVpFX01BU0ssCiAJCQkgICAgIERNQV9ESVJfVE9fQ0FSRCB8IERNQV9FTiB8IHBhY2tfc2l6ZSk7CiAJfQogCkBAIC05MDMsNyArOTIyLDggQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLWludCBjYXJkX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTMyIHNlY19hZGRyLCB1MTYgc2VjX2NudCkKK2ludCBjYXJkX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKKwl1MzIgc2VjX2FkZHIsIHUxNiBzZWNfY250KQogewogCWludCByZXR2YWw7CiAJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CkBAIC05MjEsNyArOTQxLDggQEAKIAkJCQlydHN4X3JlbGVhc2VfY2hpcChjaGlwKTsKIAkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOwogCQkJfQotCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIGNoaXAtPmN1cl9jYXJkKSAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBjaGlwLT5jdXJfY2FyZCkgIT0KKwkJCQkJCQlTVEFUVVNfU1VDQ0VTUykKIAkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOwogCiAJCQlpZiAoIWNoaXAtPnJ3X25lZWRfcmV0cnkpIHsKQEAgLTEwMTYsNyArMTAzNyw4IEBACiB2b2lkIHR1cm5fb25fbGVkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGdwaW8pCiB7CiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKQotCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgKHU4KSgxIDw8IGdwaW8pLCAodTgpKDEgPDwgZ3BpbykpOworCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgKHU4KSgxIDw8IGdwaW8pLAorCQkJCSh1OCkoMSA8PCBncGlvKSk7CiAJZWxzZQogCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgKHU4KSgxIDw8IGdwaW8pLCAwKTsKIH0KQEAgLTEwMjYsNyArMTA0OCw4IEBACiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKQogCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgKHU4KSgxIDw8IGdwaW8pLCAwKTsKIAllbHNlCi0JCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAodTgpKDEgPDwgZ3BpbyksICh1OCkoMSA8PCBncGlvKSk7CisJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAodTgpKDEgPDwgZ3BpbyksCisJCQkJKHU4KSgxIDw8IGdwaW8pKTsKIH0KIAogaW50IGRldGVjdF9jYXJkX2NkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjYXJkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYwppbmRleCAzODJlNzNhLi5iYmZhNjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYwpAQCAtMjg2Nyw3ICsyODY3LDcgQEAKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KLQlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpKSB7CisJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9CkBAIC0yOTgzLDcgKzI5ODMsNyBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQotCWlmICgoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gU0RfQ0FSRCkpIHsKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gU0RfQ0FSRCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KQEAgLTMwNDYsNyArMzA0Niw3IEBACiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9Ci0JaWYgKChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSkgeworCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQpAQCAtMzE1MSw3ICszMTUxLDcgQEAKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX1BST1RFQ1QpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQotCWlmICgoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkpIHsKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jCmluZGV4IDk3YjdiMDEuLjY5NGQzODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYwpAQCAtNjI1LDggKzYyNSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBydHN4X3RyYW5zZmVyX2J1ZihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjYXJkLCB2b2lkICpidWYsIHNpemVfdCBsZW4sCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIsIGludCB0aW1lb3V0KQorc3RhdGljIGludCBydHN4X3RyYW5zZmVyX2J1ZihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjYXJkLCB2b2lkICpidWYsCisJCXNpemVfdCBsZW4sIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIsIGludCB0aW1lb3V0KQogewogCXN0cnVjdCBydHN4X2RldiAqcnRzeCA9IGNoaXAtPnJ0c3g7CiAJc3RydWN0IGNvbXBsZXRpb24gdHJhbnNfZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1ZTc4NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWNvbmZpZyBTQjEwNVgKLQl0cmlzdGF0ZSAiU3lzdGVtQmFzZSBQQ0kgTXVsdGlwb3J0IFVBUlQiCi0Jc2VsZWN0IFNFUklBTF9DT1JFCi0JZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmIFRUWSAmJiBCUk9LRU4KLQloZWxwCi0JICBBIGRyaXZlciBmb3IgdGhlIFN5c3RlbUJhc2UgTXVsdGktMi9QQ0kgc2VyaWFsIGNhcmQKLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgInNiMTA1eCIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZjM3Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vYmotJChDT05GSUdfU0IxMDVYKSArPQlzYjEwNXgubwotCi1zYjEwNXgteSA6PSAgc2JfcGNpX21wLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfbXBfcmVnaXN0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfbXBfcmVnaXN0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2YzFiYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX21wX3JlZ2lzdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotCi0vKgotICogU0IxMDVYX1VBUlQuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBzeXN0ZW1iYXNlCi0gKgotICogVUFSVCByZWdpc3RlcnMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIFVBUlRfU0IxMDVYX0gKLSNkZWZpbmUgVUFSVF9TQjEwNVhfSAotCi0vKgotICogb3B0aW9uIHJlZ2lzdGVyCi0gKi8KLQotLyogRGV2aWNlIEluZm9ybWF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfRElSMAkJMHgwNCAJLyogcG9ydDAgfiBwb3J0OCAqLwotI2RlZmluZSBNUF9PUFRSX0RJUjEJCTB4MDUgCS8qIHBvcnQ4IH4gcG9ydDE1ICovCi0jZGVmaW5lIE1QX09QVFJfRElSMgkJMHgwNiAJLyogcG9ydDE2IH4gcG9ydDIzICovCi0jZGVmaW5lIE1QX09QVFJfRElSMwkJMHgwNyAJLyogcG9ydDI0IH4gcG9ydDMxICovCi0KLSNkZWZpbmUgRElSX1VBUlRfMTZDNTUwIAkwCi0jZGVmaW5lIERJUl9VQVJUXzE2QzEwNTAJMQotI2RlZmluZSBESVJfVUFSVF8xNkMxMDUwQQkyCi0KLSNkZWZpbmUJRElSX0NMS18xODQzMjAwCQkweDAJCS8qIGlucHV0IGNsb2NrIDE4NDMyMDAgSHogKi8KLSNkZWZpbmUJRElSX0NMS18zNjg2NDAwCQkweDEJCS8qIGlucHV0IGNsb2NrIDM2ODY0MDAgSHogKi8KLSNkZWZpbmUJRElSX0NMS183MzcyODAwCQkweDIJCS8qIGlucHV0IGNsb2NrIDczNzI4MDAgSHogKi8KLSNkZWZpbmUJRElSX0NMS18xNDc0NTYwMAkweDMJCS8qIGlucHV0IGNsb2NrIDE0NzQ1NjAwIEh6ICovCi0jZGVmaW5lCURJUl9DTEtfMjk0OTEyMDAJMHg0CQkvKiBpbnB1dCBjbG9jayAyOTQ5MTIwMCBIeiAqLwotI2RlZmluZQlESVJfQ0xLXzU4OTg1NDAwCTB4NQkJLyogaW5wdXQgY2xvY2sgNTg5ODU0MDAgSHogKi8KLQotLyogSW50ZXJmYWNlIEluZm9ybWF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfSUlSMAkJMHgwOCAJLyogcG9ydDAgfiBwb3J0OCAqLwotI2RlZmluZSBNUF9PUFRSX0lJUjEJCTB4MDkgCS8qIHBvcnQ4IH4gcG9ydDE1ICovCi0jZGVmaW5lIE1QX09QVFJfSUlSMgkJMHgwQSAJLyogcG9ydDE2IH4gcG9ydDIzICovCi0jZGVmaW5lIE1QX09QVFJfSUlSMwkJMHgwQiAJLyogcG9ydDI0IH4gcG9ydDMxICovCi0KLSNkZWZpbmUgSUlSX1JTMjMyCQkweDAwCQkvKiBSUzIzMiB0eXBlICovCi0jZGVmaW5lIElJUl9SUzQyMgkJMHgxMAkJLyogUlM0MjIgdHlwZSAqLwotI2RlZmluZSBJSVJfUlM0ODUJCTB4MjAJCS8qIFJTNDg1IHR5cGUgKi8KLSNkZWZpbmUgSUlSX1RZUEVfTUFTSwkJMHgzMAotCi0vKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX0lNUjAJCTB4MEMgCS8qIHBvcnQwIH4gcG9ydDggKi8KLSNkZWZpbmUgTVBfT1BUUl9JTVIxCQkweDBEIAkvKiBwb3J0OCB+IHBvcnQxNSAqLwotI2RlZmluZSBNUF9PUFRSX0lNUjIJCTB4MEUgCS8qIHBvcnQxNiB+IHBvcnQyMyAqLwotI2RlZmluZSBNUF9PUFRSX0lNUjMJCTB4MEYgCS8qIHBvcnQyNCB+IHBvcnQzMSAqLwotCi0vKiBJbnRlcnJ1cHQgUG9sbCBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX0lQUjAJCTB4MTAgCS8qIHBvcnQwIH4gcG9ydDggKi8KLSNkZWZpbmUgTVBfT1BUUl9JUFIxCQkweDExIAkvKiBwb3J0OCB+IHBvcnQxNSAqLwotI2RlZmluZSBNUF9PUFRSX0lQUjIJCTB4MTIgCS8qIHBvcnQxNiB+IHBvcnQyMyAqLwotI2RlZmluZSBNUF9PUFRSX0lQUjMJCTB4MTMgCS8qIHBvcnQyNCB+IHBvcnQzMSAqLwotCi0vKiBHZW5lcmFsIFB1cnBvc2UgT3V0cHV0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9HUE9DUgkJMHgyMAotCi0vKiBHZW5lcmFsIFB1cnBvc2UgT3V0cHV0IERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9HUE9EUgkJMHgyMQotCi0vKiBQYXJhbGxlbCBBZGRpdGlvbmFsIEZ1bmN0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfUEFGUgkJMHgyMwotCi0vKgotICogc3lzdGVtYmFzZSAxNmMxMDV4IFVBUlQgcmVnaXN0ZXIKLSAqLwotCi0jZGVmaW5lIFBBR0VfMCAwCi0jZGVmaW5lIFBBR0VfMSAxCi0jZGVmaW5lIFBBR0VfMiAyCi0jZGVmaW5lIFBBR0VfMyAzCi0jZGVmaW5lIFBBR0VfNCA0Ci0KLS8qCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgKiBETEFCPTAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT0gICAgICAgUGFnZSAwIFJlZ2lzdGVycyAqCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2RlZmluZSBTQjEwNVhfUlgJCTAJLyogSW46ICBSZWNlaXZlIGJ1ZmZlciAqLwotI2RlZmluZSBTQjEwNVhfVFgJCTAJLyogT3V0OiBUcmFuc21pdCBidWZmZXIgKi8KLQotI2RlZmluZSBTQjEwNVhfSUVSCQkxCS8qIE91dDogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFNCMTA1WF9JRVJfQ1RTSQkgIAkweDgwCS8qIENUUyMgSW50ZXJydXB0IEVuYWJsZSAoUmVxdWlyZXMgRUZSWzRdID0gMSkgKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9SVFNJCSAgCTB4NDAJLyogUlRTIyBJbnRlcnJ1cHQgRW5hYmxlIChSZXF1aXJlcyBFRlJbNF0gPSAxKSAqLwotI2RlZmluZSBTQjEwNVhfSUVSX1hPSQkgIAkweDIwCS8qIFhvZmYgSW50ZXJydXB0IEVuYWJsZSAoUmVxdWlyZXMgRUZSWzRdID0gMSkgKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9TTUUJICAJMHgxMAkvKiBTbGVlcCBNb2RlIEVuYWJsZSAoUmVxdWlyZXMgRUZSWzRdID0gMSkgKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9NU0kJICAJMHgwOAkvKiBFbmFibGUgTW9kZW0gc3RhdHVzIGludGVycnVwdCAqLwotI2RlZmluZSBTQjEwNVhfSUVSX1JMU0kJICAJMHgwNAkvKiBFbmFibGUgcmVjZWl2ZXIgbGluZSBzdGF0dXMgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfVEhSSQkgIAkweDAyCS8qIEVuYWJsZSBUcmFuc21pdHRlciBob2xkaW5nIHJlZ2lzdGVyIGludC4gKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9SREkJICAJMHgwMQkvKiBFbmFibGUgcmVjZWl2ZXIgZGF0YSBpbnRlcnJ1cHQgKi8KLQotI2RlZmluZSBTQjEwNVhfSVNSCQkyCS8qIEluOiAgSW50ZXJydXB0IElEIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgU0IxMDVYX0lTUl9OT0lOVAkweDAxCS8qIE5vIGludGVycnVwdHMgcGVuZGluZyAqLwotI2RlZmluZSBTQjEwNVhfSVNSX1JMU0kJICAJMHgwNgkvKiBSZWNlaXZlciBsaW5lIHN0YXR1cyBpbnRlcnJ1cHQgKFByaW9yaXR5ID0gMSkqLwotI2RlZmluZSBTQjEwNVhfSVNSX1JEQUkJICAJMHgwYwkvKiBSZWNlaXZlIERhdGEgQXZhaWxhYmxlIGludGVycnVwdCAqLwotI2RlZmluZSBTQjEwNVhfSVNSX0NUSUkJICAJMHgwNAkvKiBDaGFyYWN0ZXIgVGltZW91dCBJbmRpY2F0aW9uIGludGVycnVwdCAqLwotI2RlZmluZSBTQjEwNVhfSVNSX1RIUkkJICAJMHgwMgkvKiBUcmFuc21pdHRlciBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5ICovCi0jZGVmaW5lIFNCMTA1WF9JU1JfTVNJCSAgCTB4MDAJLyogTW9kZW0gc3RhdHVzIGludGVycnVwdCAqLwotI2RlZmluZSBTQjEwNVhfSVNSX1JYQ0kJICAJMHgxMAkvKiBSZWNlaXZlIFhvZmYgb3IgU3BlY2lhbCBDaGFyYWN0ZXIgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNCMTA1WF9JU1JfUkNTSQkgIAkweDIwCS8qIFJUUyMsIENUUyMgc3RhdHVzIGludGVycnVwdCBkdXJpbmcgQXV0byBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLwotCi0jZGVmaW5lIFNCMTA1WF9GQ1IJCTIJLyogT3V0OiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTQjEwNVhfRkNSX0ZFTiAgICAJMHgwMQkvKiBGSUZPIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1JYRlIJICAJMHgwMgkvKiBSWCBGSUZPIFJlc2V0ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfVFhGUgkgIAkweDA0CS8qIFRYIEZJRk8gUmVzZXQgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9ETVMJICAJMHgwOAkvKiBETUEgTW9kZSBTZWxlY3QgKi8KLQotI2RlZmluZSBTQjEwNVhfRkNSX1JUUjA4ICAJMHgwMCAgLyogUmVjZWl2ZSBUcmlnZ2VyIExldmVsIHNldCBhdCA4ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfUlRSMTYgIAkweDQwICAvKiBSZWNlaXZlIFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDE2ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfUlRSNTYgIAkweDgwICAvKiBSZWNlaXZlIFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDU2ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfUlRSNjAgIAkweGMwICAvKiBSZWNlaXZlIFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDYwICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfVFRSMDggIAkweDAwICAvKiBUcmFuc21pdCBUcmlnZ2VyIExldmVsIHNldCBhdCA4ICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfVFRSMTYJMHgxMCAgLyogVHJhbnNtaXQgVHJpZ2dlciBMZXZlbCBzZXQgYXQgMTYgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9UVFIzMgkweDIwICAvKiBUcmFuc21pdCBUcmlnZ2VyIExldmVsIHNldCBhdCAzMiAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1RUUjU2CTB4MzAgIC8qIFRyYW5zbWl0IFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDU2ICovCi0KLSNkZWZpbmUgU0IxMDVYX0xDUgkJMwkvKiBPdXQ6IExpbmUgQ29udHJvbCBSZWdpc3RlciAqLwotLyoKLSAqICAqIE5vdGU6IGlmIHRoZSB3b3JkIGxlbmd0aCBpcyA1IGJpdHMgKFNCMTA1WF9MQ1JfV0xFTjUpLCB0aGVuIHNldHRpbmcgCi0gKiAgKiBTQjEwNVhfTENSX1NUT1Agd2lsbCBzZWxlY3QgMS41IHN0b3AgYml0cywgbm90IDIgc3RvcCBiaXRzLgotICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfRExBQiAgIAkweDgwICAvKiBEaXZpc29yIExhdGNoIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfTENSX1NCQyAgICAJMHg0MCAgLyogQnJlYWsgRW5hYmxlKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9TUEFSICAgCTB4MjAgIC8qIFNldCBTdGljayBwYXJpdHkgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9FUEFSICAgCTB4MTAgIC8qIEV2ZW4gcGFyaXR5IHNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfTENSX1BBUkVOICAJMHgwOCAgLyogUGFyaXR5IEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfTENSX1NUT1AgICAJMHgwNCAgLyogU3RvcCBiaXRzOiAwLT4xIGJpdCwgMS0+MiBiaXRzLCAxIGFuZCBTQjEwNVhfTENSX1dMRU41IC0+IDEuNSBiaXQgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9XTEVONSAgCTB4MDAgIC8qIFdvcmRsZW5ndGg6IDUgYml0cyAqLwotI2RlZmluZSBTQjEwNVhfTENSX1dMRU42ICAJMHgwMSAgLyogV29yZGxlbmd0aDogNiBiaXRzICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfV0xFTjcgIAkweDAyICAvKiBXb3JkbGVuZ3RoOiA3IGJpdHMgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9XTEVOOCAgCTB4MDMgIC8qIFdvcmRsZW5ndGg6IDggYml0cyAqLwotCi0jZGVmaW5lIFNCMTA1WF9MQ1JfQkYJCTB4QkYKLQotI2RlZmluZSBTQjEwNVhfTUNSCQk0CS8qIE91dDogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfTUNSX0NQUyAgICAJMHg4MCAgLyogQ2xvY2sgUHJlc2NhbGVyIFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfTUNSX1AyUyAgICAJMHg0MCAgLyogUGFnZSAyIFNlbGVjdCAvWG9mZiBSZS1UcmFuc21pdCBBY2Nlc3MgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfWE9BICAgIAkweDIwICAvKiBYb24gQW55IEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfTUNSX0lMQgkJMHgxMCAgLyogSW50ZXJuYWwgTG9vcGJhY2sgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfT1VUMgkJMHgwOCAgLyogT3V0Mi9JbnRlcnJ1cHQgT3V0cHV0IEVuYWJsZSovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfT1VUMQkJMHgwNCAgLyogT3V0MS9JbnRlcnJ1cHQgT3V0cHV0IEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfTUNSX1JUUyAgICAJMHgwMiAgLyogUlRTIyBPdXRwdXQgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9EVFIgICAgCTB4MDEgIC8qIERUUiMgT3V0cHV0ICovCi0KLSNkZWZpbmUgU0IxMDVYX0xTUgkJNQkvKiBJbjogIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfUkZFSSAgIAkweDgwICAvKiBSZWNlaXZlIEZJRk8gZGF0YSBlcnJvciBJbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9URU1JICAgCTB4NDAgIC8qIFRIUiBhbmQgVFNSIEVtcHR5IEluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX1RIUkUJCTB4MjAgIC8qIFRIUiBFbXB0eSBJbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9CSUkJCTB4MTAgIC8qIEJyZWFrIGludGVycnVwdCBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9GRUkJCTB4MDggIC8qIEZyYW1lIGVycm9yIGluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX1BFSQkJMHgwNCAgLyogUGFyaXR5IGVycm9yIGluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX09FSQkJMHgwMiAgLyogT3ZlcnJ1biBlcnJvciBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9SRFJJCQkweDAxICAvKiBSZWNlaXZlIGRhdGEgcmVhZHkgSW5kaWNhdG9yKi8KLQotI2RlZmluZSBTQjEwNVhfTVNSCQk2CS8qIEluOiAgTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfRENECQkweDgwICAvKiBEYXRhIENhcnJpZXIgRGV0ZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfUkkJCTB4NDAgIC8qIFJpbmcgSW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfRFNSCQkweDIwICAvKiBEYXRhIFNldCBSZWFkeSAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0NUUwkJMHgxMCAgLyogQ2xlYXIgdG8gU2VuZCAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0REQ0QJCTB4MDggIC8qIERlbHRhIERDRCAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0RSSQkJMHgwNCAgLyogRGVsdGEgcmluZyBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9ERFNSCQkweDAyICAvKiBEZWx0YSBEU1IgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9EQ1RTCQkweDAxICAvKiBEZWx0YSBDVFMgKi8KLQotI2RlZmluZSBTQjEwNVhBX01EUgkJNgkvKiBPdXQ6IE11bHRpIERyb3AgbW9kZSBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhBX01EUl9OUFMJCTB4MDggIC8qIDl0aCBCaXQgUG9sYXJpdHkgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WEFfTURSX0FNRQkJMHgwMiAgLyogQXV0byBNdWx0aS1kcm9wIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhBX01EUl9NREUJCTB4MDEgIC8qIE11bHRpIERyb3AgRW5hYmxlICovCi0KLSNkZWZpbmUgU0IxMDVYX1NQUgkJNwkvKiBJL086IFNjcmF0Y2ggUmVnaXN0ZXIgKi8KLQotLyoKLSAqIERMQUI9MQotICovCi0jZGVmaW5lIFNCMTA1WF9ETEwJCTAJLyogT3V0OiBEaXZpc29yIExhdGNoIExvdyAqLwotI2RlZmluZSBTQjEwNVhfRExNCQkxCS8qIE91dDogRGl2aXNvciBMYXRjaCBIaWdoICovCi0KLS8qCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgKiBETEFCKExDUls3XSkgPSAwICwgTUNSWzZdID0gMSAgPT09PT09PT09PT09PSAgUGFnZSAyIFJlZ2lzdGVycyAqCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0IxMDVYX0dJQ1IJCTEJLyogR2xvYmFsIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9HSUNSX0dJTSAgIAkweDAxICAvKiBHbG9iYWwgSW50ZXJydXB0IE1hc2sgKi8KLQotI2RlZmluZSBTQjEwNVhfR0lTUgkJMgkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfR0lTUl9NR0lDUjAgIAkweDgwICAvKiBNaXJyb3IgdGhlIGNvbnRlbnQgb2YgR0lDUlswXSAqLwotI2RlZmluZSBTQjEwNVhfR0lTUl9DUzNJUyAgIAkweDA4ICAvKiBTQjEwNVggb2YgQ1MzIyBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9HSVNSX0NTMklTICAgCTB4MDQgIC8qIFNCMTA1WCBvZiBDUzIjIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX0dJU1JfQ1MxSVMgICAJMHgwMiAgLyogU0IxMDVYIG9mIENTMSMgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfR0lTUl9DUzBJUyAgIAkweDAxICAvKiBTQjEwNVggb2YgQ1MwIyBJbnRlcnJ1cHQgU3RhdHVzICovCi0KLSNkZWZpbmUgU0IxMDVYX1RGQ1IJCTUJLyogVHJhbnNtaXQgRklGTyBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFNCMTA1WF9SRkNSCQk2CS8qIFJlY2VpdmUgRklGTyBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCVNCMTA1WF9GU1IJCTcJLyogRmxvdyBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfRlNSX1RIRlMgICAgIAkweDIwICAvKiBUcmFuc21pdCBIYXJkd2FyZSBGbG93IENvbnRyb2wgU3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9GU1JfVFNGUyAgICAgCTB4MTAgIC8qIFRyYW5zbWl0IFNvZnR3YXJlIEZsb3cgQ29udHJvbCBTdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX0ZTUl9SSEZTICAgICAJMHgwMiAgLyogUmVjZWl2ZSBIYXJkd2FyZSBGbG93IENvbnRyb2wgU3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9GU1JfUlNGUyAgICAgCTB4MDEgIC8qIFJlY2VpdmUgU29mdHdhcmUgRmxvdyBDb250cm9sIFN0YXR1cyAqLwotCi0vKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICogTENSID0gMHhCRiwgUFNSWzBdID0gMCAgICAgICA9PT09PT09PT09PT09ICAgIFBhZ2UgMyBSZWdpc3RlcnMgKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNkZWZpbmUgU0IxMDVYX1BTUgkJMAkvKiBQYWdlIFNlbGVjdCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfUFNSX1AzS0VZICAgIAkweEE0IC8qIFBhZ2UgMyBTZWxlY3QgS2V5ICovCi0jZGVmaW5lIFNCMTA1WF9QU1JfUDRLRVkgICAgCTB4QTUgLyogUGFnZSA1IFNlbGVjdCBLZXkgKi8KLQotI2RlZmluZSBTQjEwNVhfQVRSCQkxCS8qIEF1dG8gVG9nZ2xlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9SUFMgICAgICAJMHg4MCAgLyogUlhFTiBQb2xhcml0eSBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9SQ01TICAgICAJMHg0MCAgLyogUlhFTiBDb250cm9sIE1vZGUgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfVFBTICAgICAgCTB4MjAgIC8qIFRYRU4gUG9sYXJpdHkgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfVENNUyAgICAgCTB4MTAgIC8qIFRYRU4gQ29udHJvbCBNb2RlIFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfQVRSX0FURElTICAgIAkweDAwICAvKiBBdXRvIFRvZ2dsZSBpcyBkaXNhYmxlZCAqLwotI2RlZmluZSBTQjEwNVhfQVRSX0FSVCAgICAgIAkweDAxICAvKiBSVFMjL1RYRU4gcGluIG9wZXJhdGVzIGFzIFRYRU4gKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9BRFQgICAgICAJMHgwMiAgLyogRFRSIy9UWEVOIHBpbiBvcGVyYXRlcyBhcyBUWEVOICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfQTgwICAgICAgCTB4MDMgIC8qIG9ubHkgaW4gODAgcGluIHVzZSAqLwotCi0jZGVmaW5lIFNCMTA1WF9FRlIJCTIJLyogKEF1dG8pIEVuaGFuY2VkIEZlYXR1cmUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0VGUl9BQ1RTICAgICAJMHg4MCAgLyogQXV0by1DVFMgRmxvdyBDb250cm9sIEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfRUZSX0FSVFMgICAgIAkweDQwICAvKiBBdXRvLVJUUyBGbG93IENvbnRyb2wgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9FRlJfU0NEICAgICAgCTB4MjAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIERldGVjdCAqLwotI2RlZmluZSBTQjEwNVhfRUZSX0VGQkVOICAgIAkweDEwICAvKiBFbmhhbmNlZCBGdW5jdGlvbiBCaXRzIEVuYWJsZSAqLwotCi0jZGVmaW5lIFNCMTA1WF9YT04xCQk0CS8qIFhvbjEgQ2hhcmFjdGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9YT04yCQk1CS8qIFhvbjIgQ2hhcmFjdGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9YT0ZGMQkJNgkvKiBYb2ZmMSBDaGFyYWN0ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1hPRkYyCQk3CS8qIFhvZmYyIENoYXJhY3RlciBSZWdpc3RlciAqLwotCi0vKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICogTENSID0gMHhCRiwgUFNSWzBdID0gMSAgICAgICA9PT09PT09PT09PT0gICAgIFBhZ2UgNCBSZWdpc3RlcnMgKgotICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNkZWZpbmUgU0IxMDVYX0FGUgkJMQkvKiBBZGRpdGlvbmFsIEZlYXR1cmUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0FGUl9HSVBTICAgICAJMHgyMCAgLyogR2xvYmFsIEludGVycnVwdCBQb2xhcml0eSBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0FGUl9HSUVOICAgICAJMHgxMCAgLyogR2xvYmFsIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX0FGUl9BRkVOICAgICAJMHgwMSAgLyogMjU2LWJ5dGUgRklGTyBFbmFibGUgKi8KLQotI2RlZmluZSBTQjEwNVhfWFJDUgkJMgkvKiBYb2ZmIFJlLXRyYW5zbWl0IENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9YUkNSX05SQzEgICAgCTB4MDAgIC8qIFRyYW5zbWl0cyBYb2ZmIENoYXJhY3RlciB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGRhdGEgaXMgMSBkdXJpbmcgWE9GRiBzdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX1hSQ1JfTlJDNCAgICAJMHgwMSAgLyogVHJhbnNtaXRzIFhvZmYgQ2hhcmFjdGVyIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZGF0YSBpcyA0IGR1cmluZyBYT0ZGIHN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfWFJDUl9OUkM4ICAgIAkweDAyICAvKiBUcmFuc21pdHMgWG9mZiBDaGFyYWN0ZXIgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIGlzIDggZHVyaW5nIFhPRkYgc3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9YUkNSX05SQzE2ICAgCTB4MDMgIC8qIFRyYW5zbWl0cyBYb2ZmIENoYXJhY3RlciB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGRhdGEgaXMgMTYgZHVyaW5nIFhPRkYgc3RhdHVzICovCi0KLSNkZWZpbmUgU0IxMDVYX1RUUgkJNAkvKiBUcmFuc21pdCBGSUZPIFRyaWdnZXIgTGV2ZWwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1JUUgkJNQkvKiBSZWNlaXZlIEZJRk8gVHJpZ2dlciBMZXZlbCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfRlVSCQk2CS8qIEZsb3cgQ29udHJvbCBVcHBlciBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0ZMUgkJNwkvKiBGbG93IENvbnRyb2wgTG93ZXIgVGhyZXNob2xkIFJlZ2lzdGVyICovCi0KLQotLyogcGFnZSAwICovCi0KLSNkZWZpbmUgU0IxMDVYX0dFVF9DSEFSKHBvcnQpCWluYigocG9ydCktPmlvYmFzZSArIFNCMTA1WF9SWCkKLSNkZWZpbmUgU0IxMDVYX0dFVF9JRVIocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0lFUikKLSNkZWZpbmUgU0IxMDVYX0dFVF9JU1IocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0lTUikKLSNkZWZpbmUgU0IxMDVYX0dFVF9MQ1IocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0xDUikKLSNkZWZpbmUgU0IxMDVYX0dFVF9NQ1IocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX01DUikKLSNkZWZpbmUgU0IxMDVYX0dFVF9MU1IocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0xTUikKLSNkZWZpbmUgU0IxMDVYX0dFVF9NU1IocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX01TUikKLSNkZWZpbmUgU0IxMDVYX0dFVF9TUFIocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX1NQUikKLQotI2RlZmluZSBTQjEwNVhfUFVUX0NIQVIocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9UWCApCi0jZGVmaW5lIFNCMTA1WF9QVVRfSUVSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfSUVSICkKLSNkZWZpbmUgU0IxMDVYX1BVVF9GQ1IocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9GQ1IgKQotI2RlZmluZSBTQjEwNVhfUFVUX0xDUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0xDUiApCi0jZGVmaW5lIFNCMTA1WF9QVVRfTUNSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfTUNSICkKLSNkZWZpbmUgU0IxMDVYX1BVVF9TUFIocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9TUFIgKQotCi0KLS8qIHBhZ2UgMSAqLwotI2RlZmluZSBTQjEwNVhfR0VUX1JFRyhwb3J0LHJlZykJaW5iKChwb3J0KS0+aW9iYXNlICsgKHJlZykpCi0jZGVmaW5lIFNCMTA1WF9QVVRfUkVHKHBvcnQscmVnLHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgKHJlZykpCi0KLS8qIHBhZ2UgMiAqLwotCi0jZGVmaW5lIFNCMTA1WF9QVVRfUFNSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfUFNSICkKLQotI2VuZGlmIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9wY2lfbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfcGNpX21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDZlZTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9wY2lfbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxODkgKzAsMCBAQAotI2luY2x1ZGUgInNiX3BjaV9tcC5oIgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KLQotZXh0ZXJuIHN0cnVjdCBwYXJwb3J0ICpwYXJwb3J0X3BjX3Byb2JlX3BvcnQodW5zaWduZWQgbG9uZyBiYXNlX2xvLAotCQl1bnNpZ25lZCBsb25nIGJhc2VfaGksCi0JCWludCBpcnEsIGludCBkbWEsCi0JCXN0cnVjdCBkZXZpY2UgKmRldiwKLQkJaW50IGlycWZsYWdzKTsKLQotc3RhdGljIHN0cnVjdCBtcF9kZXZpY2VfdCBtcF9kZXZzW01BWF9NUF9ERVZdOwotc3RhdGljIGludCBtcF9ucnBjaWJyZHMgPSBzaXplb2YobXBfcGNpYm9hcmRzKS9zaXplb2YobXBwY2licmRfdCk7Ci1zdGF0aWMgaW50IE5SX0JPQVJEPTA7Ci1zdGF0aWMgaW50IE5SX1BPUlRTPTA7Ci1zdGF0aWMgc3RydWN0IG1wX3BvcnQgbXVsdGlfcG9ydHNbTUFYX01QX1BPUlRdOwotc3RhdGljIHN0cnVjdCBpcnFfaW5mbyBpcnFfbGlzdHNbTlJfSVJRU107Ci0KLXN0YXRpYyBfSU5MSU5FXyB1bnNpZ25lZCBpbnQgc2VyaWFsX2luKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgb2Zmc2V0KTsKLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHNlcmlhbF9vdXQoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBvZmZzZXQsIGludCB2YWx1ZSk7Ci1zdGF0aWMgX0lOTElORV8gdW5zaWduZWQgaW50IHJlYWRfb3B0aW9uX3JlZ2lzdGVyKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgb2Zmc2V0KTsKLXN0YXRpYyBpbnQgc2IxMDU0X2dldF9yZWdpc3RlcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgcGFnZSwgaW50IHJlZyk7Ci1zdGF0aWMgaW50IHNiMTA1NF9zZXRfcmVnaXN0ZXIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHBhZ2UsIGludCByZWcsIGludCB2YWx1ZSk7Ci1zdGF0aWMgdm9pZCBTZW5kQVRDb21tYW5kKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyBpbnQgc2V0X2RlZXBfZmlmbyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgc3RhdHVzKTsKLXN0YXRpYyBpbnQgZ2V0X2RlZXBfZmlmbyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBpbnQgZ2V0X2RldmljZV90eXBlKGludCBhcmcpOwotc3RhdGljIGludCBzZXRfYXV0b19ydHMoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBtcF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgX19tcF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIG1wX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXBfdGFza2xldF9hY3Rpb24odW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBtcF91cGRhdGVfbWN0cmwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLXN0YXRpYyBpbnQgbXBfc3RhcnR1cChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIGludCBpbml0X2h3KTsKLXN0YXRpYyB2b2lkIG1wX3NodXRkb3duKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSk7Ci1zdGF0aWMgdm9pZCBtcF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkX3Rlcm1pb3MpOwotCi1zdGF0aWMgaW5saW5lIGludCBfX21wX3B1dF9jaGFyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBjaXJjX2J1ZiAqY2lyYywgdW5zaWduZWQgY2hhciBjKTsKLXN0YXRpYyBpbnQgbXBfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCk7Ci0KLXN0YXRpYyB2b2lkIG1wX3B1dF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgbXBfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwotc3RhdGljIGludCBtcF93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBtcF9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBtcF9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBtcF9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOwotc3RhdGljIHZvaWQgbXBfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBtcF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBtcF9nZXRfaW5mbyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpyZXRpbmZvKTsKLXN0YXRpYyBpbnQgbXBfc2V0X2luZm8oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqbmV3aW5mbyk7Ci1zdGF0aWMgaW50IG1wX2dldF9sc3JfaW5mbyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCAqdmFsdWUpOwotCi1zdGF0aWMgaW50IG1wX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBtcF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOwotc3RhdGljIGludCBtcF9icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKTsKLXN0YXRpYyBpbnQgbXBfZG9fYXV0b2NvbmZpZyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpOwotc3RhdGljIGludCBtcF93YWl0X21vZGVtX3N0YXR1cyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQgbXBfZ2V0X2NvdW50KHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgKmljbnQpOwotc3RhdGljIGludCBtcF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCBtcF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkX3Rlcm1pb3MpOwotc3RhdGljIHZvaWQgbXBfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgbXBfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKLXN0YXRpYyB2b2lkIG1wX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIG1wX3VwZGF0ZV90ZXJtaW9zKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSk7Ci1zdGF0aWMgaW50IG1wX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKTsKLXN0YXRpYyBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqdWFydF9nZXQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIGludCBsaW5lKTsKLXN0YXRpYyBpbnQgbXBfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbXBfdHlwZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG1wX2NoYW5nZV9wbShzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIGludCBwbV9zdGF0ZSk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgbXBfcmVwb3J0X3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXBfY29uZmlndXJlX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtcF91bmNvbmZpZ3VyZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpOwotc3RhdGljIGludCBtcF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYpOwotc3RhdGljIHZvaWQgbXBfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYpOwotc3RhdGljIGludCBtcF9hZGRfb25lX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIGludCBtcF9yZW1vdmVfb25lX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgYXV0b2NvbmZpZyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgdW5zaWduZWQgaW50IHByb2JlZmxhZ3MpOwotc3RhdGljIHZvaWQgYXV0b2NvbmZpZ19pcnEoc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIHZvaWQgbXVsdGlfc3RvcF90eChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3N0YXJ0X3R4KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXVsdGlfc3RvcF9yeChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG11bHRpX2VuYWJsZV9tcyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHJlY2VpdmVfY2hhcnMoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCAqc3RhdHVzICk7Ci1zdGF0aWMgX0lOTElORV8gdm9pZCB0cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgX0lOTElORV8gdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIGlubGluZSB2b2lkIG11bHRpX2hhbmRsZV9wb3J0KHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBtdWx0aV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyB2b2lkIHNlcmlhbF9kb191bmxpbmsoc3RydWN0IGlycV9pbmZvICppLCBzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgaW50IHNlcmlhbF9saW5rX2lycV9jaGFpbihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgdm9pZCBzZXJpYWxfdW5saW5rX2lycV9jaGFpbihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG11bHRpX3R4X2VtcHR5KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aV9nZXRfbWN0cmwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9zZXRfbWN0cmwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKTsKLXN0YXRpYyB2b2lkIG11bHRpX2JyZWFrX2N0bChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUpOwotc3RhdGljIGludCBtdWx0aV9zdGFydHVwKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXVsdGlfc2h1dGRvd24oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG11bHRpX2dldF9kaXZpc29yKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBiYXVkKTsKLXN0YXRpYyB2b2lkIG11bHRpX3NldF90ZXJtaW9zKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBNUF9URVJNSU9TICp0ZXJtaW9zLCBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkKTsKLXN0YXRpYyB2b2lkIG11bHRpX3BtKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzdGF0ZSwgdW5zaWduZWQgaW50IG9sZHN0YXRlKTsKLXN0YXRpYyB2b2lkIG11bHRpX3JlbGVhc2Vfc3RkX3Jlc291cmNlKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3JlbGVhc2VfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBpbnQgbXVsdGlfcmVxdWVzdF9wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXVsdGlfY29uZmlnX3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKTsKLXN0YXRpYyBpbnQgbXVsdGlfdmVyaWZ5X3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcik7Ci1zdGF0aWMgY29uc3QgY2hhciAqbXVsdGlfdHlwZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIF9faW5pdCBtdWx0aV9pbml0X3BvcnRzKHZvaWQpOwotc3RhdGljIHZvaWQgX19pbml0IG11bHRpX3JlZ2lzdGVyX3BvcnRzKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KTsKLXN0YXRpYyBpbnQgaW5pdF9tcF9kZXYoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgbXBwY2licmRfdCBicmQpOwotCi1zdGF0aWMgaW50IGRlZXBbMjU2XTsKLXN0YXRpYyBpbnQgZGVlcF9jb3VudDsKLXN0YXRpYyBpbnQgZmNyX2FyclsyNTZdOwotc3RhdGljIGludCBmY3JfY291bnQ7Ci1zdGF0aWMgaW50IHR0clsyNTZdOwotc3RhdGljIGludCB0dHJfY291bnQ7Ci1zdGF0aWMgaW50IHJ0clsyNTZdOwotc3RhdGljIGludCBydHJfY291bnQ7Ci0KLW1vZHVsZV9wYXJhbV9hcnJheShkZWVwLGludCwmZGVlcF9jb3VudCwwKTsKLW1vZHVsZV9wYXJhbV9hcnJheShmY3JfYXJyLGludCwmZmNyX2NvdW50LDApOwotbW9kdWxlX3BhcmFtX2FycmF5KHR0cixpbnQsJnR0cl9jb3VudCwwKTsKLW1vZHVsZV9wYXJhbV9hcnJheShydHIsaW50LCZydHJfY291bnQsMCk7Ci0KLXN0YXRpYyBfSU5MSU5FXyB1bnNpZ25lZCBpbnQgc2VyaWFsX2luKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgb2Zmc2V0KQotewotCXJldHVybiBpbmIobXRwdC0+cG9ydC5pb2Jhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCBzZXJpYWxfb3V0KHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jb3V0Yih2YWx1ZSwgbXRwdC0+cG9ydC5pb2Jhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgX0lOTElORV8gdW5zaWduZWQgaW50IHJlYWRfb3B0aW9uX3JlZ2lzdGVyKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgb2Zmc2V0KQotewotCXJldHVybiBpbmIobXRwdC0+b3B0aW9uX2Jhc2VfYWRkciArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2IxMDUzYV9nZXRfaW50ZXJmYWNlKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgcG9ydF9udW0pCi17Ci0JdW5zaWduZWQgbG9uZyBvcHRpb25fYmFzZV9hZGRyID0gbXRwdC0+b3B0aW9uX2Jhc2VfYWRkcjsKLQl1bnNpZ25lZCBpbnQgIGludGVyZmFjZSA9IDA7Ci0KLQlzd2l0Y2ggKHBvcnRfbnVtKQotCXsKLQkJY2FzZSAwOgotCQljYXNlIDE6Ci0JCQkvKiBzZXQgR1BPWzE6MF0gPSAwMCAqLwotCQkJb3V0YigweDAwLCBvcHRpb25fYmFzZV9hZGRyICsgTVBfT1BUUl9HUE9EUik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQljYXNlIDM6Ci0JCQkvKiBzZXQgR1BPWzE6MF0gPSAwMSAqLwotCQkJb3V0YigweDAxLCBvcHRpb25fYmFzZV9hZGRyICsgTVBfT1BUUl9HUE9EUik7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQljYXNlIDU6Ci0JCQkvKiBzZXQgR1BPWzE6MF0gPSAxMCAqLwotCQkJb3V0YigweDAyLCBvcHRpb25fYmFzZV9hZGRyICsgTVBfT1BUUl9HUE9EUik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCXBvcnRfbnVtICY9IDB4MTsKLQotCS8qIGdldCBpbnRlcmZhY2UgKi8KLQlpbnRlcmZhY2UgPSBpbmIob3B0aW9uX2Jhc2VfYWRkciArIE1QX09QVFJfSUlSMCArIHBvcnRfbnVtKTsKLQotCS8qIHNldCBHUE9bMTowXSA9IDExICovCi0Jb3V0YigweDAzLCBvcHRpb25fYmFzZV9hZGRyICsgTVBfT1BUUl9HUE9EUik7Ci0KLQlyZXR1cm4gKGludGVyZmFjZSk7Ci19Ci0JCQotc3RhdGljIGludCBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBwYWdlLCBpbnQgcmVnKQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGludCBsY3IgPSAwOwotCXVuc2lnbmVkIGludCBtY3IgPSAwOwotCXVuc2lnbmVkIGludCB0bXAgPSAwOwotCi0JaWYoIHBhZ2UgPD0gMCkKLQl7Ci0JCXByaW50aygiIHBhZ2UgMCBjYW4gbm90IHVzZSB0aGlzIGZ1bmN0aW9uXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXN3aXRjaChwYWdlKQotCXsKLQkJY2FzZSAxOgotCQkJbGNyID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0JCQl0bXAgPSBsY3IgfCBTQjEwNVhfTENSX0RMQUI7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCB0bXApOwotCi0JCQl0bXAgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQotCQkJcmV0ID0gU0IxMDVYX0dFVF9SRUcocG9ydCxyZWcpOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCxsY3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW1jciA9IFNCMTA1WF9HRVRfTUNSKHBvcnQpOwotCQkJdG1wID0gbWNyIHwgU0IxMDVYX01DUl9QMlM7Ci0JCQlTQjEwNVhfUFVUX01DUihwb3J0LHRtcCk7Ci0KLQkJCXJldCA9IFNCMTA1WF9HRVRfUkVHKHBvcnQscmVnKTsKLQotCQkJU0IxMDVYX1BVVF9NQ1IocG9ydCxtY3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWxjciA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCQkJdG1wID0gbGNyIHwgU0IxMDVYX0xDUl9CRjsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsdG1wKTsKLQkJCVNCMTA1WF9QVVRfUkVHKHBvcnQsU0IxMDVYX1BTUixTQjEwNVhfUFNSX1AzS0VZKTsKLQotCQkJcmV0ID0gU0IxMDVYX0dFVF9SRUcocG9ydCxyZWcpOwotCi0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LGxjcik7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJbGNyID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0JCQl0bXAgPSBsY3IgfCBTQjEwNVhfTENSX0JGOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCx0bXApOwotCQkJU0IxMDVYX1BVVF9SRUcocG9ydCxTQjEwNVhfUFNSLFNCMTA1WF9QU1JfUDRLRVkpOwotCi0JCQlyZXQgPSBTQjEwNVhfR0VUX1JFRyhwb3J0LHJlZyk7Ci0KLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsbGNyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCIgZXJyb3IgaW52YWxpZCBwYWdlIG51bWJlciBcbiIpOwotCQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2IxMDU0X3NldF9yZWdpc3RlcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgcGFnZSwgaW50IHJlZywgaW50IHZhbHVlKQoteyAgCi0JaW50IGxjciA9IDA7Ci0JaW50IG1jciA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiggcGFnZSA8PSAwKQotCXsKLQkJcHJpbnRrKCIgcGFnZSAwIGNhbiBub3QgdXNlIHRoaXMgZnVuY3Rpb25cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXN3aXRjaChwYWdlKQotCXsKLQkJY2FzZSAxOgotCQkJbGNyID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCBsY3IgfCBTQjEwNVhfTENSX0RMQUIpOwotCi0JCQlTQjEwNVhfUFVUX1JFRyhwb3J0LHJlZyx2YWx1ZSk7Ci0KLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIGxjcik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW1jciA9IFNCMTA1WF9HRVRfTUNSKHBvcnQpOwotCQkJU0IxMDVYX1BVVF9NQ1IocG9ydCwgbWNyIHwgU0IxMDVYX01DUl9QMlMpOwotCi0JCQlTQjEwNVhfUFVUX1JFRyhwb3J0LHJlZyx2YWx1ZSk7Ci0KLQkJCVNCMTA1WF9QVVRfTUNSKHBvcnQsIG1jcik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWxjciA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgbGNyIHwgU0IxMDVYX0xDUl9CRik7Ci0JCQlTQjEwNVhfUFVUX1BTUihwb3J0LCBTQjEwNVhfUFNSX1AzS0VZKTsKLQotCQkJU0IxMDVYX1BVVF9SRUcocG9ydCxyZWcsdmFsdWUpOwotCi0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCBsY3IpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlsY3IgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIGxjciB8IFNCMTA1WF9MQ1JfQkYpOwotCQkJU0IxMDVYX1BVVF9QU1IocG9ydCwgU0IxMDVYX1BTUl9QNEtFWSk7Ci0KLQkJCVNCMTA1WF9QVVRfUkVHKHBvcnQscmVnLHZhbHVlKTsKLQotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgbGNyKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiIGVycm9yIGludmFsaWQgcGFnZSBudW1iZXIgXG4iKTsKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNldF9tdWx0aWRyb3BfbW9kZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQlpbnQgbWRyID0gU0IxMDVYQV9NRFJfTlBTOwotCi0JaWYgKG1vZGUgJiBNRE1PREVfRU5BQkxFKQotCXsKLQkJbWRyIHw9IFNCMTA1WEFfTURSX01ERTsKLQl9Ci0KLQlpZiAoMSkgLy8obW9kZSAmIE1ETU9ERV9BVVRPKQotCXsKLQkJaW50IGVmciA9IDA7Ci0JCW1kciB8PSBTQjEwNVhBX01EUl9BTUU7Ci0JCWVmciA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfRUZSKTsKLQkJZWZyIHw9IFNCMTA1WF9FRlJfU0NEOwotCQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX0VGUiwgZWZyKTsKLQl9Ci0KLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMSwgU0IxMDVYQV9NRFIsIG1kcik7Ci0JcG9ydC0+bWRtb2RlICY9IH4weDY7Ci0JcG9ydC0+bWRtb2RlIHw9IG1vZGU7Ci0JcHJpbnRrKCJbJWRdIG11bHRpZHJvcCBpbml0OiAleFxuIiwgcG9ydC0+bGluZSwgcG9ydC0+bWRtb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9tdWx0aWRyb3BfYWRkcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX1hPRkYyKTsKLX0KLQotc3RhdGljIGludCBzZXRfbXVsdGlkcm9wX2FkZHIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9YT0ZGMiwgYWRkcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgU2VuZEFUQ29tbWFuZChzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQkvLwkJICAgICAgYSAgICB0CWNyICAgbGYKLQl1bnNpZ25lZCBjaGFyIGNoW10gPSB7MHg2MSwweDc0LDB4MGQsMHgwYSwweDB9OwotCXVuc2lnbmVkIGNoYXIgbGluZUNvbnRyb2w7Ci0JdW5zaWduZWQgY2hhciBpPTA7Ci0JdW5zaWduZWQgY2hhciBEaXZpc29yID0gMHhjOwotCi0JbGluZUNvbnRyb2wgPSBzZXJpYWxfaW5wKG10cHQsVUFSVF9MQ1IpOwotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9MQ1IsKGxpbmVDb250cm9sIHwgVUFSVF9MQ1JfRExBQikpOwotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9ETEwsKERpdmlzb3IgJiAweGZmKSk7Ci0Jc2VyaWFsX291dHAobXRwdCxVQVJUX0RMTSwoRGl2aXNvciAmIDB4ZmYwMCk+PjgpOyAvL2JhdWRyYXRlIGlzIDQ4MDAKLQotCi0Jc2VyaWFsX291dHAobXRwdCxVQVJUX0xDUixsaW5lQ29udHJvbCk7CQotCXNlcmlhbF9vdXRwKG10cHQsVUFSVF9MQ1IsMHgwMyk7IC8vIE4tOC0xCi0Jc2VyaWFsX291dHAobXRwdCxVQVJUX0ZDUiw3KTsgCi0Jc2VyaWFsX291dHAobXRwdCxVQVJUX01DUiwweDMpOwotCXdoaWxlKGNoW2ldKXsKLQkJd2hpbGUoKHNlcmlhbF9pbnAobXRwdCxVQVJUX0xTUikgJiAweDYwKSAhPTB4NjApewotCQkJOwotCQl9Ci0JCXNlcmlhbF9vdXRwKG10cHQsMCxjaFtpKytdKTsKLQl9Ci0KLQotfS8vIGVuZCBvZiBTZW5kQVRDb21tYW5kKCkKLQotc3RhdGljIGludCBzZXRfZGVlcF9maWZvKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBzdGF0dXMpCi17Ci0JaW50IGFmcl9zdGF0dXMgPSAwOwotCWFmcl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfNCwgU0IxMDVYX0FGUik7Ci0KLQlpZihzdGF0dXMgPT0gRU5BQkxFKQotCXsKLQkJYWZyX3N0YXR1cyB8PSBTQjEwNVhfQUZSX0FGRU47Ci0JfQotCWVsc2UKLQl7Ci0JCWFmcl9zdGF0dXMgJj0gflNCMTA1WF9BRlJfQUZFTjsKLQl9Ci0JCQotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCxQQUdFXzQsU0IxMDVYX0FGUixhZnJfc3RhdHVzKTsKLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsUEFHRV80LFNCMTA1WF9UVFIsdHRyW3BvcnQtPmxpbmVdKTsgCi0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LFBBR0VfNCxTQjEwNVhfUlRSLHJ0cltwb3J0LT5saW5lXSk7IAotCWFmcl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfNCwgU0IxMDVYX0FGUik7Ci0JCQotCXJldHVybiBhZnJfc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGdldF9kZXZpY2VfdHlwZShpbnQgYXJnKQotewotCWludCByZXQ7Ci0gICAgICAgIHJldCA9IGluYihtcF9kZXZzW2FyZ10ub3B0aW9uX3JlZ19hZGRyK01QX09QVFJfRElSMCk7Ci0gICAgICAgIHJldCA9IChyZXQgJiAweGYwKSA+PiA0OwotICAgICAgICBzd2l0Y2ggKHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSBESVJfVUFSVF8xNkM1NTA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQT1JUXzE2QzU1WDsKLSAgICAgICAgICAgICAgIGNhc2UgRElSX1VBUlRfMTZDMTA1MDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfMTZDMTA1WDsKLSAgICAgICAgICAgICAgIGNhc2UgRElSX1VBUlRfMTZDMTA1MEE6Ci0gICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgaWYgKG10cHQtPnBvcnQubGluZSA8IDIpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQT1JUXzE2QzEwNVhBOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmIChtdHB0LT5kZXZpY2UtPmRldmljZV9pZCAmIDB4NTApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF8xNkM1NVg7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQT1JUXzE2QzEwNVg7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICByZXR1cm4gUE9SVF8xNkMxMDVYQTsKLSAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQT1JUX1VOS05PV047Ci0gICAgICAgIH0KLQotfQotc3RhdGljIGludCBnZXRfZGVlcF9maWZvKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaW50IGFmcl9zdGF0dXMgPSAwOwotCWFmcl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfNCwgU0IxMDVYX0FGUik7Ci0JcmV0dXJuIGFmcl9zdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2F1dG9fcnRzKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBzdGF0dXMpCi17Ci0JaW50IGF0cl9zdGF0dXMgPSAwOwotCi0jaWYgMAotCWludCBlZnJfc3RhdHVzID0gMDsKLQotCWVmcl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX0VGUik7Ci0JaWYoc3RhdHVzID09IEVOQUJMRSkKLQkJZWZyX3N0YXR1cyB8PSBTQjEwNVhfRUZSX0FSVFM7Ci0JZWxzZQotCQllZnJfc3RhdHVzICY9IH5TQjEwNVhfRUZSX0FSVFM7Ci0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LFBBR0VfMyxTQjEwNVhfRUZSLGVmcl9zdGF0dXMpOwotCWVmcl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX0VGUik7Ci0jZW5kaWYKLQkJCi0vL0FUUgotCWF0cl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX0FUUik7Ci0Jc3dpdGNoKHN0YXR1cykKLQl7Ci0JCWNhc2UgUlM0MjJQVFA6Ci0JCQlhdHJfc3RhdHVzID0gKFNCMTA1WF9BVFJfVFBTKSB8IChTQjEwNVhfQVRSX0E4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSUzQyMk1EOgotCQkJYXRyX3N0YXR1cyA9IChTQjEwNVhfQVRSX1RQUykgfCAoU0IxMDVYX0FUUl9UQ01TKSB8IChTQjEwNVhfQVRSX0E4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSUzQ4NU5FOgotCQkJYXRyX3N0YXR1cyA9IChTQjEwNVhfQVRSX1JDTVMpIHwgKFNCMTA1WF9BVFJfVFBTKSB8IChTQjEwNVhfQVRSX1RDTVMpIHwgKFNCMTA1WF9BVFJfQTgwKTsKLQkJCWJyZWFrOwotCQljYXNlIFJTNDg1RUNITzoKLQkJCWF0cl9zdGF0dXMgPSAoU0IxMDVYX0FUUl9UUFMpIHwgKFNCMTA1WF9BVFJfVENNUykgfCAoU0IxMDVYX0FUUl9BODApOwotCQkJYnJlYWs7Ci0JfQotCi0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LFBBR0VfMyxTQjEwNVhfQVRSLGF0cl9zdGF0dXMpOwotCWF0cl9zdGF0dXMgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX0FUUik7Ci0KLQlyZXR1cm4gYXRyX3N0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgbXBfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXBvcnQtPm9wcy0+c3RvcF90eChwb3J0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fbXBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCWlmICghdWFydF9jaXJjX2VtcHR5KCZzdGF0ZS0+aW5mby0+eG1pdCkgJiYgc3RhdGUtPmluZm8tPnhtaXQuYnVmICYmCi0JCQkhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQpCi0JCXBvcnQtPm9wcy0+c3RhcnRfdHgocG9ydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JX19tcF9zdGFydCh0dHkpOwotfQotCi1zdGF0aWMgdm9pZCBtcF90YXNrbGV0X2FjdGlvbih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzYl91YXJ0X3N0YXRlICopZGF0YTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCi0JcHJpbnRrKCJ0YXNrbGV0IGlzIGNhbGxlZCFcbiIpOwotCXR0eSA9IHN0YXRlLT5pbmZvLT50dHk7Ci0JdHR5X3dha2V1cCh0dHkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXBfdXBkYXRlX21jdHJsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKLXsKLQl1bnNpZ25lZCBpbnQgb2xkOwotCi0Jb2xkID0gcG9ydC0+bWN0cmw7Ci0JcG9ydC0+bWN0cmwgPSAob2xkICYgfmNsZWFyKSB8IHNldDsKLQlpZiAob2xkICE9IHBvcnQtPm1jdHJsKQotCQlwb3J0LT5vcHMtPnNldF9tY3RybChwb3J0LCBwb3J0LT5tY3RybCk7Ci19Ci0KLSNkZWZpbmUgdWFydF9zZXRfbWN0cmwocG9ydCxzZXQpCW1wX3VwZGF0ZV9tY3RybChwb3J0LHNldCwwKQotI2RlZmluZSB1YXJ0X2NsZWFyX21jdHJsKHBvcnQsY2xlYXIpCW1wX3VwZGF0ZV9tY3RybChwb3J0LDAsY2xlYXIpCi0KLXN0YXRpYyBpbnQgbXBfc3RhcnR1cChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIGludCBpbml0X2h3KQotewotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBzdGF0ZS0+aW5mbzsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBwYWdlOwotCWludCByZXR2YWwgPSAwOwotCi0JaWYgKGluZm8tPmZsYWdzICYgVUlGX0lOSVRJQUxJWkVEKQotCQlyZXR1cm4gMDsKLQotCWlmIChpbmZvLT50dHkpCi0JCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7Ci0KLQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04pCi0JCXJldHVybiAwOwotCi0JaWYgKCFpbmZvLT54bWl0LmJ1ZikgewotCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAoIXBhZ2UpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpbmZvLT54bWl0LmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7Ci0JCQkKLQkJdWFydF9jaXJjX2NsZWFyKCZpbmZvLT54bWl0KTsKLQl9Ci0KLQlyZXR2YWwgPSBwb3J0LT5vcHMtPnN0YXJ0dXAocG9ydCk7Ci0JaWYgKHJldHZhbCA9PSAwKSB7Ci0JCWlmIChpbml0X2h3KSB7Ci0JCQltcF9jaGFuZ2Vfc3BlZWQoc3RhdGUsIE5VTEwpOwotCi0JCQlpZiAoaW5mby0+dHR5ICYmIChpbmZvLT50dHktPnRlcm1pb3MuY19jZmxhZyAmIENCQVVEKSkKLQkJCQl1YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9SVFMgfCBUSU9DTV9EVFIpOwotCQl9Ci0KLQkJaW5mby0+ZmxhZ3MgfD0gVUlGX0lOSVRJQUxJWkVEOwotCi0JCWlmIChpbmZvLT50dHkpCi0JCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7Ci0JfQotCi0JaWYgKHJldHZhbCAmJiBjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR2YWwgPSAwOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgbXBfc2h1dGRvd24oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBzdGF0ZS0+aW5mbzsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlpZiAoaW5mby0+dHR5KQotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCi0JaWYgKGluZm8tPmZsYWdzICYgVUlGX0lOSVRJQUxJWkVEKSB7Ci0JCWluZm8tPmZsYWdzICY9IH5VSUZfSU5JVElBTElaRUQ7Ci0KLQkJaWYgKCFpbmZvLT50dHkgfHwgKGluZm8tPnR0eS0+dGVybWlvcy5jX2NmbGFnICYgSFVQQ0wpKQotCQkJdWFydF9jbGVhcl9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwotCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwotCi0JCXBvcnQtPm9wcy0+c2h1dGRvd24ocG9ydCk7Ci0KLQkJc3luY2hyb25pemVfaXJxKHBvcnQtPmlycSk7Ci0JfQotCXRhc2tsZXRfa2lsbCgmaW5mby0+dGxldCk7Ci0KLQlpZiAoaW5mby0+eG1pdC5idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWluZm8tPnhtaXQuYnVmKTsKLQkJaW5mby0+eG1pdC5idWYgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXBfY2hhbmdlX3NwZWVkKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IE1QX1RFUk1JT1MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBzdGF0ZS0+aW5mby0+dHR5OwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCWlmICghdHR5IHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9VTktOT1dOKQotCQlyZXR1cm47Ci0KLQlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDUlRTQ1RTKQotCQlzdGF0ZS0+aW5mby0+ZmxhZ3MgfD0gVUlGX0NUU19GTE9XOwotCWVsc2UKLQkJc3RhdGUtPmluZm8tPmZsYWdzICY9IH5VSUZfQ1RTX0ZMT1c7Ci0KLQlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDTE9DQUwpCi0JCXN0YXRlLT5pbmZvLT5mbGFncyAmPSB+VUlGX0NIRUNLX0NEOwotCWVsc2UKLQkJc3RhdGUtPmluZm8tPmZsYWdzIHw9IFVJRl9DSEVDS19DRDsKLQotCXBvcnQtPm9wcy0+c2V0X3Rlcm1pb3MocG9ydCwgJnR0eS0+dGVybWlvcywgb2xkX3Rlcm1pb3MpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX21wX3B1dF9jaGFyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBjaXJjX2J1ZiAqY2lyYywgdW5zaWduZWQgY2hhciBjKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNpcmMtPmJ1ZikKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCWlmICh1YXJ0X2NpcmNfY2hhcnNfZnJlZShjaXJjKSAhPSAwKSB7Ci0JCWNpcmMtPmJ1ZltjaXJjLT5oZWFkXSA9IGM7Ci0JCWNpcmMtPmhlYWQgPSAoY2lyYy0+aGVhZCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCXJldCA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1wX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCXJldHVybiBfX21wX3B1dF9jaGFyKHN0YXRlLT5wb3J0LCAmc3RhdGUtPmluZm8tPnhtaXQsIGNoKTsKLX0KLQotc3RhdGljIHZvaWQgbXBfcHV0X2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JbXBfc3RhcnQodHR5KTsKLX0KLQotc3RhdGljIGludCBtcF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQ7Ci0Jc3RydWN0IGNpcmNfYnVmICpjaXJjOwotCWludCBjLCByZXQgPSAwOwotCi0JaWYgKCFzdGF0ZSB8fCAhc3RhdGUtPmluZm8pIHsKLQkJcmV0dXJuIC1FTDNITFQ7Ci0JfQotCi0JcG9ydCA9IHN0YXRlLT5wb3J0OwotCWNpcmMgPSAmc3RhdGUtPmluZm8tPnhtaXQ7Ci0KLQlpZiAoIWNpcmMtPmJ1ZikKLQkJcmV0dXJuIDA7Ci0JCQotCXdoaWxlICgxKSB7Ci0JCWMgPSBDSVJDX1NQQUNFX1RPX0VORChjaXJjLT5oZWFkLCBjaXJjLT50YWlsLCBVQVJUX1hNSVRfU0laRSk7Ci0JCWlmIChjb3VudCA8IGMpCi0JCQljID0gY291bnQ7Ci0JCWlmIChjIDw9IDApCi0JCQlicmVhazsKLQltZW1jcHkoY2lyYy0+YnVmICsgY2lyYy0+aGVhZCwgYnVmLCBjKTsKLQotCQljaXJjLT5oZWFkID0gKGNpcmMtPmhlYWQgKyBjKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJcmV0ICs9IGM7Ci0JfQotCW1wX3N0YXJ0KHR0eSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcF93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCXJldHVybiB1YXJ0X2NpcmNfY2hhcnNfZnJlZSgmc3RhdGUtPmluZm8tPnhtaXQpOwotfQotCi1zdGF0aWMgaW50IG1wX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gdWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoJnN0YXRlLT5pbmZvLT54bWl0KTsKLX0KLQotc3RhdGljIHZvaWQgbXBfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXN0YXRlIHx8ICFzdGF0ZS0+aW5mbykgewotCQlyZXR1cm47Ci0JfQotCi0JcG9ydCA9IHN0YXRlLT5wb3J0OwotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JdWFydF9jaXJjX2NsZWFyKCZzdGF0ZS0+aW5mby0+eG1pdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHBvcnQtPm9wcy0+c2VuZF94Y2hhcikKLQkJcG9ydC0+b3BzLT5zZW5kX3hjaGFyKHBvcnQsIGNoKTsKLQllbHNlIHsKLQkJcG9ydC0+eF9jaGFyID0gY2g7Ci0JCWlmIChjaCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXBvcnQtPm9wcy0+c3RhcnRfdHgocG9ydCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmIChJX0lYT0ZGKHR0eSkpCi0JCW1wX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7Ci0KLQlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDUlRTQ1RTKQotCQl1YXJ0X2NsZWFyX21jdHJsKHN0YXRlLT5wb3J0LCBUSU9DTV9SVFMpOwotfQotCi1zdGF0aWMgdm9pZCBtcF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlpZiAoSV9JWE9GRih0dHkpKSB7Ci0JCWlmIChwb3J0LT54X2NoYXIpCi0JCQlwb3J0LT54X2NoYXIgPSAwOwotCQllbHNlCi0JCQltcF9zZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKLQl9Ci0KLQlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDUlRTQ1RTKQotCQl1YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9SVFMpOwotfQotCi1zdGF0aWMgaW50IG1wX2dldF9pbmZvKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJldGluZm8pCi17Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKLQotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JdG1wLnR5cGUJICAgID0gcG9ydC0+dHlwZTsKLQl0bXAubGluZQkgICAgPSBwb3J0LT5saW5lOwotCXRtcC5wb3J0CSAgICA9IHBvcnQtPmlvYmFzZTsKLQlpZiAoSElHSF9CSVRTX09GRlNFVCkKLQkJdG1wLnBvcnRfaGlnaCA9IChsb25nKSBwb3J0LT5pb2Jhc2UgPj4gSElHSF9CSVRTX09GRlNFVDsKLQl0bXAuaXJxCQkgICAgPSBwb3J0LT5pcnE7Ci0JdG1wLmZsYWdzCSAgICA9IHBvcnQtPmZsYWdzOwotCXRtcC54bWl0X2ZpZm9fc2l6ZSAgPSBwb3J0LT5maWZvc2l6ZTsKLQl0bXAuYmF1ZF9iYXNlCSAgICA9IHBvcnQtPnVhcnRjbGsgLyAxNjsKLQl0bXAuY2xvc2VfZGVsYXkJICAgID0gc3RhdGUtPmNsb3NlX2RlbGF5OwotCXRtcC5jbG9zaW5nX3dhaXQgICAgPSBzdGF0ZS0+Y2xvc2luZ193YWl0ID09IFVTRl9DTE9TSU5HX1dBSVRfTk9ORSA/Ci0JCUFTWU5DX0NMT1NJTkdfV0FJVF9OT05FIDoKLQkJc3RhdGUtPmNsb3Npbmdfd2FpdDsKLQl0bXAuY3VzdG9tX2Rpdmlzb3IgID0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7Ci0JdG1wLmh1YjYJICAgID0gcG9ydC0+aHViNjsKLQl0bXAuaW9fdHlwZSAgICAgICAgID0gcG9ydC0+aW90eXBlOwotCXRtcC5pb21lbV9yZWdfc2hpZnQgPSBwb3J0LT5yZWdzaGlmdDsKLQl0bXAuaW9tZW1fYmFzZSAgICAgID0gKHZvaWQgKilwb3J0LT5tYXBiYXNlOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfc2V0X2luZm8oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqbmV3aW5mbykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBsb25nIG5ld19wb3J0OwotCXVuc2lnbmVkIGludCBjaGFuZ2VfaXJxLCBjaGFuZ2VfcG9ydCwgY2xvc2luZ193YWl0OwotCXVuc2lnbmVkIGludCBvbGRfY3VzdG9tX2Rpdmlzb3I7Ci0JdW5zaWduZWQgaW50IG9sZF9mbGFncywgbmV3X2ZsYWdzOwotCWludCByZXR2YWwgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdpbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW5ld19wb3J0ID0gbmV3X3NlcmlhbC5wb3J0OwotCWlmIChISUdIX0JJVFNfT0ZGU0VUKQotCQluZXdfcG9ydCArPSAodW5zaWduZWQgbG9uZykgbmV3X3NlcmlhbC5wb3J0X2hpZ2ggPDwgSElHSF9CSVRTX09GRlNFVDsKLQotCW5ld19zZXJpYWwuaXJxID0gaXJxX2Nhbm9uaWNhbGl6ZShuZXdfc2VyaWFsLmlycSk7Ci0KLQljbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCA9PSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA/Ci0JCVVTRl9DTE9TSU5HX1dBSVRfTk9ORSA6IG5ld19zZXJpYWwuY2xvc2luZ193YWl0OwotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCi0JY2hhbmdlX2lycSAgPSBuZXdfc2VyaWFsLmlycSAhPSBwb3J0LT5pcnE7Ci0JY2hhbmdlX3BvcnQgPSBuZXdfcG9ydCAhPSBwb3J0LT5pb2Jhc2UgfHwKLQkJKHVuc2lnbmVkIGxvbmcpbmV3X3NlcmlhbC5pb21lbV9iYXNlICE9IHBvcnQtPm1hcGJhc2UgfHwKLQkJbmV3X3NlcmlhbC5odWI2ICE9IHBvcnQtPmh1YjYgfHwKLQkJbmV3X3NlcmlhbC5pb190eXBlICE9IHBvcnQtPmlvdHlwZSB8fAotCQluZXdfc2VyaWFsLmlvbWVtX3JlZ19zaGlmdCAhPSBwb3J0LT5yZWdzaGlmdCB8fAotCQluZXdfc2VyaWFsLnR5cGUgIT0gcG9ydC0+dHlwZTsKLQlvbGRfZmxhZ3MgPSBwb3J0LT5mbGFnczsKLQluZXdfZmxhZ3MgPSBuZXdfc2VyaWFsLmZsYWdzOwotCW9sZF9jdXN0b21fZGl2aXNvciA9IHBvcnQtPmN1c3RvbV9kaXZpc29yOwotCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCXJldHZhbCA9IC1FUEVSTTsKLQkJaWYgKGNoYW5nZV9pcnEgfHwgY2hhbmdlX3BvcnQgfHwKLQkJCQkobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gcG9ydC0+dWFydGNsayAvIDE2KSB8fAotCQkJCShuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IHN0YXRlLT5jbG9zZV9kZWxheSkgfHwKLQkJCQkoY2xvc2luZ193YWl0ICE9IHN0YXRlLT5jbG9zaW5nX3dhaXQpIHx8Ci0JCQkJKG5ld19zZXJpYWwueG1pdF9maWZvX3NpemUgIT0gcG9ydC0+Zmlmb3NpemUpIHx8Ci0JCQkJKCgobmV3X2ZsYWdzIF4gb2xkX2ZsYWdzKSAmIH5VUEZfVVNSX01BU0spICE9IDApKQotCQkJZ290byBleGl0OwotCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+VVBGX1VTUl9NQVNLKSB8Ci0JCQkJKG5ld19mbGFncyAmIFVQRl9VU1JfTUFTSykpOwotCQlwb3J0LT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7Ci0JCWdvdG8gY2hlY2tfYW5kX2V4aXQ7Ci0JfQotCi0JaWYgKHBvcnQtPm9wcy0+dmVyaWZ5X3BvcnQpCi0JCXJldHZhbCA9IHBvcnQtPm9wcy0+dmVyaWZ5X3BvcnQocG9ydCwgJm5ld19zZXJpYWwpOwotCi0JaWYgKChuZXdfc2VyaWFsLmlycSA+PSBOUl9JUlFTKSB8fCAobmV3X3NlcmlhbC5pcnEgPCAwKSB8fAotCQkJKG5ld19zZXJpYWwuYmF1ZF9iYXNlIDwgOTYwMCkpCi0JCXJldHZhbCA9IC1FSU5WQUw7Ci0KLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoY2hhbmdlX3BvcnQgfHwgY2hhbmdlX2lycSkgewotCQlyZXR2YWwgPSAtRUJVU1k7Ci0KLQkJaWYgKHVhcnRfdXNlcnMoc3RhdGUpID4gMSkKLQkJCWdvdG8gZXhpdDsKLQotCQltcF9zaHV0ZG93bihzdGF0ZSk7Ci0JfQotCi0JaWYgKGNoYW5nZV9wb3J0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgb2xkX2lvYmFzZSwgb2xkX21hcGJhc2U7Ci0JCXVuc2lnbmVkIGludCBvbGRfdHlwZSwgb2xkX2lvdHlwZSwgb2xkX2h1YjYsIG9sZF9zaGlmdDsKLQotCQlvbGRfaW9iYXNlID0gcG9ydC0+aW9iYXNlOwotCQlvbGRfbWFwYmFzZSA9IHBvcnQtPm1hcGJhc2U7Ci0JCW9sZF90eXBlID0gcG9ydC0+dHlwZTsKLQkJb2xkX2h1YjYgPSBwb3J0LT5odWI2OwotCQlvbGRfaW90eXBlID0gcG9ydC0+aW90eXBlOwotCQlvbGRfc2hpZnQgPSBwb3J0LT5yZWdzaGlmdDsKLQotCQlpZiAob2xkX3R5cGUgIT0gUE9SVF9VTktOT1dOKQotCQkJcG9ydC0+b3BzLT5yZWxlYXNlX3BvcnQocG9ydCk7Ci0KLQkJcG9ydC0+aW9iYXNlID0gbmV3X3BvcnQ7Ci0JCXBvcnQtPnR5cGUgPSBuZXdfc2VyaWFsLnR5cGU7Ci0JCXBvcnQtPmh1YjYgPSBuZXdfc2VyaWFsLmh1YjY7Ci0JCXBvcnQtPmlvdHlwZSA9IG5ld19zZXJpYWwuaW9fdHlwZTsKLQkJcG9ydC0+cmVnc2hpZnQgPSBuZXdfc2VyaWFsLmlvbWVtX3JlZ19zaGlmdDsKLQkJcG9ydC0+bWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKW5ld19zZXJpYWwuaW9tZW1fYmFzZTsKLQotCQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUX1VOS05PV04pIHsKLQkJCXJldHZhbCA9IHBvcnQtPm9wcy0+cmVxdWVzdF9wb3J0KHBvcnQpOwotCQl9IGVsc2UgewotCQkJcmV0dmFsID0gMDsKLQkJfQotCi0JCWlmIChyZXR2YWwgJiYgb2xkX3R5cGUgIT0gUE9SVF9VTktOT1dOKSB7Ci0JCQlwb3J0LT5pb2Jhc2UgPSBvbGRfaW9iYXNlOwotCQkJcG9ydC0+dHlwZSA9IG9sZF90eXBlOwotCQkJcG9ydC0+aHViNiA9IG9sZF9odWI2OwotCQkJcG9ydC0+aW90eXBlID0gb2xkX2lvdHlwZTsKLQkJCXBvcnQtPnJlZ3NoaWZ0ID0gb2xkX3NoaWZ0OwotCQkJcG9ydC0+bWFwYmFzZSA9IG9sZF9tYXBiYXNlOwotCQkJcmV0dmFsID0gcG9ydC0+b3BzLT5yZXF1ZXN0X3BvcnQocG9ydCk7Ci0JCQlpZiAocmV0dmFsKQotCQkJCXBvcnQtPnR5cGUgPSBQT1JUX1VOS05PV047Ci0KLQkJCXJldHZhbCA9IC1FQlVTWTsKLQkJfQotCX0KLQotCXBvcnQtPmlycSAgICAgICAgICAgICAgPSBuZXdfc2VyaWFsLmlycTsKLQlwb3J0LT51YXJ0Y2xrICAgICAgICAgID0gbmV3X3NlcmlhbC5iYXVkX2Jhc2UgKiAxNjsKLQlwb3J0LT5mbGFncyAgICAgICAgICAgID0gKHBvcnQtPmZsYWdzICYgflVQRl9DSEFOR0VfTUFTSykgfAotCQkobmV3X2ZsYWdzICYgVVBGX0NIQU5HRV9NQVNLKTsKLQlwb3J0LT5jdXN0b21fZGl2aXNvciAgID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKLQlzdGF0ZS0+Y2xvc2VfZGVsYXkgICAgID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheTsKLQlzdGF0ZS0+Y2xvc2luZ193YWl0ICAgID0gY2xvc2luZ193YWl0OwotCXBvcnQtPmZpZm9zaXplICAgICAgICAgPSBuZXdfc2VyaWFsLnhtaXRfZmlmb19zaXplOwotCWlmIChzdGF0ZS0+aW5mby0+dHR5KQotCQlzdGF0ZS0+aW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9Ci0JCQkocG9ydC0+ZmxhZ3MgJiBVUEZfTE9XX0xBVEVOQ1kpID8gMSA6IDA7Ci0KLWNoZWNrX2FuZF9leGl0OgotCXJldHZhbCA9IDA7Ci0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9VTktOT1dOKQotCQlnb3RvIGV4aXQ7Ci0JaWYgKHN0YXRlLT5pbmZvLT5mbGFncyAmIFVJRl9JTklUSUFMSVpFRCkgewotCQlpZiAoKChvbGRfZmxhZ3MgXiBwb3J0LT5mbGFncykgJiBVUEZfU1BEX01BU0spIHx8Ci0JCQkJb2xkX2N1c3RvbV9kaXZpc29yICE9IHBvcnQtPmN1c3RvbV9kaXZpc29yKSB7Ci0JCQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfU1BEX01BU0spIHsKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCQkJCSIlcyBzZXRzIGN1c3RvbSBzcGVlZCBvbiB0dHlNUCVkLiBUaGlzICIKLQkJCQkJCSJpcyBkZXByZWNhdGVkLlxuIiwgY3VycmVudC0+Y29tbSwKLQkJCQkJCXBvcnQtPmxpbmUpOwotCQkJfQotCQkJbXBfY2hhbmdlX3NwZWVkKHN0YXRlLCBOVUxMKTsKLQkJfQotCX0gZWxzZQotCQlyZXR2YWwgPSBtcF9zdGFydHVwKHN0YXRlLCAxKTsKLWV4aXQ6Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0KLXN0YXRpYyBpbnQgbXBfZ2V0X2xzcl9pbmZvKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50ICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgaW50IHJlc3VsdDsKLQotCXJlc3VsdCA9IHBvcnQtPm9wcy0+dHhfZW1wdHkocG9ydCk7Ci0KLQlpZiAocG9ydC0+eF9jaGFyIHx8Ci0JCQkoKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKCZzdGF0ZS0+aW5mby0+eG1pdCkgPiAwKSAmJgotCQkJCSFzdGF0ZS0+aW5mby0+dHR5LT5zdG9wcGVkICYmICFzdGF0ZS0+aW5mby0+dHR5LT5od19zdG9wcGVkKSkKLQkJcmVzdWx0ICY9IH5USU9DU0VSX1RFTVQ7Ci0KLQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlpbnQgcmVzdWx0ID0gLUVJTzsKLQotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCWlmICghKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewotCQlyZXN1bHQgPSBwb3J0LT5tY3RybDsKLQkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JCXJlc3VsdCB8PSBwb3J0LT5vcHMtPmdldF9tY3RybChwb3J0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQl9Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG1wX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlpbnQgcmV0ID0gLUVJTzsKLQotCi0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0JaWYgKCEodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCW1wX3VwZGF0ZV9tY3RybChwb3J0LCBzZXQsIGNsZWFyKTsKLQkJcmV0ID0gMDsKLQl9Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfYnJlYWtfY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCi0JaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9VTktOT1dOKQotCQlwb3J0LT5vcHMtPmJyZWFrX2N0bChwb3J0LCBicmVha19zdGF0ZSk7Ci0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1wX2RvX2F1dG9jb25maWcoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlpbnQgZmxhZ3MsIHJldDsKLQotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JcmV0ID0gLUVCVVNZOwotCWlmICh1YXJ0X3VzZXJzKHN0YXRlKSA9PSAxKSB7Ci0JCW1wX3NodXRkb3duKHN0YXRlKTsKLQotCQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUX1VOS05PV04pCi0JCQlwb3J0LT5vcHMtPnJlbGVhc2VfcG9ydChwb3J0KTsKLQotCQlmbGFncyA9IFVBUlRfQ09ORklHX1RZUEU7Ci0JCWlmIChwb3J0LT5mbGFncyAmIFVQRl9BVVRPX0lSUSkKLQkJCWZsYWdzIHw9IFVBUlRfQ09ORklHX0lSUTsKLQotCQlwb3J0LT5vcHMtPmNvbmZpZ19wb3J0KHBvcnQsIGZsYWdzKTsKLQotCQlyZXQgPSBtcF9zdGFydHVwKHN0YXRlLCAxKTsKLQl9Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1wX3dhaXRfbW9kZW1fc3RhdHVzKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBzYl91YXJ0X2ljb3VudCBjcHJldiwgY25vdzsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JbWVtY3B5KCZjcHJldiwgJnBvcnQtPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X2ljb3VudCkpOwotCi0JcG9ydC0+b3BzLT5lbmFibGVfbXMocG9ydCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQotCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+aW5mby0+ZGVsdGFfbXNyX3dhaXQsICZ3YWl0KTsKLQlmb3IgKDs7KSB7Ci0JCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQltZW1jcHkoJmNub3csICZwb3J0LT5pY291bnQsIHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9pY291bnQpKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0JCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNub3cucm5nICE9IGNwcmV2LnJuZykpIHx8Ci0JCQkJKChhcmcgJiBUSU9DTV9EU1IpICYmIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAotCQkJCSgoYXJnICYgVElPQ01fQ0QpICAmJiAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKLQkJCQkoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7Ci0JCQlyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzY2hlZHVsZSgpOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljcHJldiA9IGNub3c7Ci0JfQotCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnN0YXRlLT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCwgJndhaXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcF9nZXRfY291bnQoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCAqaWNudCkKLXsKLQlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQgPSB7fTsKLQlzdHJ1Y3Qgc2JfdWFydF9pY291bnQgY25vdzsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0KLQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQltZW1jcHkoJmNub3csICZwb3J0LT5pY291bnQsIHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9pY291bnQpKTsKLQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCi0JaWNvdW50LmN0cyAgICAgICAgID0gY25vdy5jdHM7Ci0JaWNvdW50LmRzciAgICAgICAgID0gY25vdy5kc3I7Ci0JaWNvdW50LnJuZyAgICAgICAgID0gY25vdy5ybmc7Ci0JaWNvdW50LmRjZCAgICAgICAgID0gY25vdy5kY2Q7Ci0JaWNvdW50LnJ4ICAgICAgICAgID0gY25vdy5yeDsKLQlpY291bnQudHggICAgICAgICAgPSBjbm93LnR4OwotCWljb3VudC5mcmFtZSAgICAgICA9IGNub3cuZnJhbWU7Ci0JaWNvdW50Lm92ZXJydW4gICAgID0gY25vdy5vdmVycnVuOwotCWljb3VudC5wYXJpdHkgICAgICA9IGNub3cucGFyaXR5OwotCWljb3VudC5icmsgICAgICAgICA9IGNub3cuYnJrOwotCWljb3VudC5idWZfb3ZlcnJ1biA9IGNub3cuYnVmX292ZXJydW47Ci0KLQlyZXR1cm4gY29weV90b191c2VyKGljbnQsICZpY291bnQsIHNpemVvZihpY291bnQpKSA/IC1FRkFVTFQgOiAwOwotfQotCi1zdGF0aWMgaW50IG1wX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IG1wX3BvcnQgKmluZm8gPSAoc3RydWN0IG1wX3BvcnQgKilzdGF0ZS0+cG9ydDsKLQlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOwotCi0KLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFRJT0NTTVVMVElEUk9QOgotCQkJLyogc2V0IG11bHRpLWRyb3AgbW9kZSBlbmFibGUgb3IgZGlzYWJsZSwgYW5kIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUgaXMgSC9XIG1vZGUgKi8KLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSkKLQkJCXsKLQkJCQkvL2FyZyAmPSB+MHg2OwotCQkJCS8vc3RhdGUtPnBvcnQtPm1kbW9kZSA9IDA7Ci0JCQkJcmV0dXJuIHNldF9tdWx0aWRyb3BfbW9kZSgoc3RydWN0IHNiX3VhcnRfcG9ydCAqKWluZm8sICh1bnNpZ25lZCBpbnQpYXJnKTsKLQkJCX0KLQkJCXJldCA9IC1FTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIEdFVERFRVBGSUZPOgotCQkJcmV0ID0gZ2V0X2RlZXBfZmlmbyhzdGF0ZS0+cG9ydCk7Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIFNFVERFRVBGSUZPOgotCQkJcmV0ID0gc2V0X2RlZXBfZmlmbyhzdGF0ZS0+cG9ydCxhcmcpOwotCQkJZGVlcFtzdGF0ZS0+cG9ydC0+bGluZV0gPSBhcmc7Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIFNFVFRUUjoKLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYIHx8IGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKXsKLQkJCQlyZXQgPSBzYjEwNTRfc2V0X3JlZ2lzdGVyKHN0YXRlLT5wb3J0LFBBR0VfNCxTQjEwNVhfVFRSLGFyZyk7Ci0JCQkJdHRyW3N0YXRlLT5wb3J0LT5saW5lXSA9IGFyZzsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgU0VUUlRSOgotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVggfHwgaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpewotCQkJCXJldCA9IHNiMTA1NF9zZXRfcmVnaXN0ZXIoc3RhdGUtPnBvcnQsUEFHRV80LFNCMTA1WF9SVFIsYXJnKTsKLQkJCQlydHJbc3RhdGUtPnBvcnQtPmxpbmVdID0gYXJnOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBHRVRUVFI6Ci0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCB8fCBpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSl7Ci0JCQkJcmV0ID0gc2IxMDU0X2dldF9yZWdpc3RlcihzdGF0ZS0+cG9ydCxQQUdFXzQsU0IxMDVYX1RUUik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIEdFVFJUUjoKLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYIHx8IGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKXsKLQkJCQlyZXQgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHN0YXRlLT5wb3J0LFBBR0VfNCxTQjEwNVhfUlRSKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0KLQkJY2FzZSBTRVRGQ1I6Ci0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCB8fCBpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSl7Ci0JCQkJcmV0ID0gc2IxMDU0X3NldF9yZWdpc3RlcihzdGF0ZS0+cG9ydCxQQUdFXzEsU0IxMDVYX0ZDUixhcmcpOwotCQkJfQotCQkJZWxzZXsKLQkJCQlzZXJpYWxfb3V0KGluZm8sMixhcmcpOwotCQkJfQotCi0JCQlyZXR1cm4gcmV0OwotCQljYXNlIFRJT0NTTURBRERSOgotCQkJLyogc2V0IG11bHRpLWRyb3AgYWRkcmVzcyAqLwotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKQotCQkJewotCQkJCXN0YXRlLT5wb3J0LT5tZG1vZGUgfD0gTURNT0RFX0FERFI7Ci0JCQkJcmV0dXJuIHNldF9tdWx0aWRyb3BfYWRkcigoc3RydWN0IHNiX3VhcnRfcG9ydCAqKWluZm8sICh1bnNpZ25lZCBpbnQpYXJnKTsKLQkJCX0KLQkJCXJldCA9IC1FTk9UU1VQUDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ0dNREFERFI6Ci0JCQkvKiBzZXQgbXVsdGktZHJvcCBhZGRyZXNzICovCi0JCQlpZiAoKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKSAmJiAoc3RhdGUtPnBvcnQtPm1kbW9kZSAmIE1ETU9ERV9BRERSKSkKLQkJCXsKLQkJCQlyZXR1cm4gZ2V0X211bHRpZHJvcF9hZGRyKChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopaW5mbyk7Ci0JCQl9Ci0JCQlyZXQgPSAtRU5PVFNVUFA7Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NTRU5EQUREUjoKLQkJCS8qIHNlbmQgYWRkcmVzcyBpbiBtdWx0aS1kcm9wIG1vZGUgKi8KLQkJCWlmICgoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpIAotCQkJCQkmJiAoc3RhdGUtPnBvcnQtPm1kbW9kZSAmIChNRE1PREVfRU5BQkxFKSkpCi0JCQl7Ci0JCQkJaWYgKG1wX2NoYXJzX2luX2J1ZmZlcih0dHkpID4gMCkKLQkJCQl7Ci0JCQkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKLQkJCQl9Ci0JCQkJLy93aGlsZSAoKHNlcmlhbF9pbihpbmZvLCBVQVJUX0xTUikgJiAweDYwKSAhPSAweDYwKTsKLQkJCQkvL3doaWxlIChzYjEwNTRfZ2V0X3JlZ2lzdGVyKHN0YXRlLT5wb3J0LCBQQUdFXzIsIFNCMTA1WF9URkNSKSAhPSAwKTsKLQkJCQl3aGlsZSAoKHNlcmlhbF9pbihpbmZvLCBVQVJUX0xTUikgJiAweDYwKSAhPSAweDYwKTsKLQkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfU0NSLCAoaW50KWFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NHU0VSSUFMOgotCQkJcmV0ID0gbXBfZ2V0X2luZm8oc3RhdGUsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKWFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJcmV0ID0gbXBfc2V0X2luZm8oc3RhdGUsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKWFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFRJT0NTRVJDT05GSUc6Ci0JCQlyZXQgPSBtcF9kb19hdXRvY29uZmlnKHN0YXRlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ1NFUkdXSUxEOiAvKiBvYnNvbGV0ZSAqLwotCQljYXNlIFRJT0NTRVJTV0lMRDogLyogb2Jzb2xldGUgKi8KLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJCS8qIGZvciBNdWx0aXBvcnQgKi8KLQkJY2FzZSBUSU9DR05VTU9GUE9SVDogLyogR2V0IG51bWJlciBvZiBwb3J0cyAqLwotCQkJcmV0dXJuIE5SX1BPUlRTOwotCQljYXNlIFRJT0NHR0VUREVWSUQ6Ci0JCQlyZXR1cm4gbXBfZGV2c1thcmddLmRldmljZV9pZDsKLQkJY2FzZSBUSU9DR0dFVFJFVjoKLQkJCXJldHVybiBtcF9kZXZzW2FyZ10ucmV2aXNpb247Ci0JCWNhc2UgVElPQ0dHRVROUlBPUlRTOgotCQkJcmV0dXJuIG1wX2RldnNbYXJnXS5ucl9wb3J0czsKLQkJY2FzZSBUSU9DR0dFVEJETk86Ci0JCQlyZXR1cm4gTlJfQk9BUkQ7Ci0JCWNhc2UgVElPQ0dHRVRJTlRFUkZBQ0U6Ci0JCQlpZiAobXBfZGV2c1thcmddLnJldmlzaW9uID09IDB4YzApCi0JCQl7Ci0JCQkJLyogZm9yIFNCMTZDMTA1M0FQQ0kgKi8KLQkJCQlyZXR1cm4gKHNiMTA1M2FfZ2V0X2ludGVyZmFjZShpbmZvLCBpbmZvLT5wb3J0LmxpbmUpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gKGluYihtcF9kZXZzW2FyZ10ub3B0aW9uX3JlZ19hZGRyK01QX09QVFJfSUlSMCsoc3RhdGUtPnBvcnQtPmxpbmUvOCkpKTsKLQkJCX0KLQkJY2FzZSBUSU9DR0dFVFBPUlRUWVBFOgotCQkJcmV0ID0gZ2V0X2RldmljZV90eXBlKGFyZyk7Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIFRJT0NTTVVMVElFQ0hPOiAvKiBzZXQgdG8gbXVsdGktZHJvcCBtb2RlKFJTNDIyKSBvciBlY2hvIG1vZGUoUlM0ODUpKi8KLQkJCW91dGIoICggaW5iKGluZm8tPmludGVyZmFjZV9jb25maWdfYWRkcikgJiB+MHgwMyApIHwgMHgwMSAsICAKLQkJCQkJaW5mby0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyKTsKLQkJCXJldHVybiAwOwotCQljYXNlIFRJT0NTUFRQTk9FQ0hPOiAvKiBzZXQgdG8gbXVsdGktZHJvcCBtb2RlKFJTNDIyKSBvciBlY2hvIG1vZGUoUlM0ODUpICovCi0JCQlvdXRiKCAoIGluYihpbmZvLT5pbnRlcmZhY2VfY29uZmlnX2FkZHIpICYgfjB4MDMgKSAgLCAgICAgICAgICAgICAKLQkJCQkJaW5mby0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyKTsKLQkJCXJldHVybiAwOwotCX0KLQotCWlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKQotCQlnb3RvIG91dDsKLQotCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFRJT0NNSVdBSVQ6Ci0JCQlyZXQgPSBtcF93YWl0X21vZGVtX3N0YXR1cyhzdGF0ZSwgYXJnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ0dJQ09VTlQ6Ci0JCQlyZXQgPSBtcF9nZXRfY291bnQoc3RhdGUsIChzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCAqKWFyZyk7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKLQkJZ290byBvdXQ7Ci0KLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFRJT0NTRVJHRVRMU1I6IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLwotCQkJcmV0ID0gbXBfZ2V0X2xzcl9pbmZvKHN0YXRlLCAodW5zaWduZWQgaW50ICopYXJnKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6IHsKLQkJCQkJc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCQkJCQlpZiAocG9ydC0+b3BzLT5pb2N0bCkKLQkJCQkJCXJldCA9IHBvcnQtPm9wcy0+aW9jdGwocG9ydCwgY21kLCBhcmcpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JfQotCi0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtcF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkX3Rlcm1pb3MpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBjZmxhZyA9IHR0eS0+dGVybWlvcy5jX2NmbGFnOwotCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoKGlmbGFnKSAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCi0JaWYgKChjZmxhZyBeIG9sZF90ZXJtaW9zLT5jX2NmbGFnKSA9PSAwICYmCi0JCQlSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MuY19pZmxhZyBeIG9sZF90ZXJtaW9zLT5jX2lmbGFnKSA9PSAwKQotCQlyZXR1cm47Ci0KLQltcF9jaGFuZ2Vfc3BlZWQoc3RhdGUsIG9sZF90ZXJtaW9zKTsKLQotCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYgIShjZmxhZyAmIENCQVVEKSkKLQkJdWFydF9jbGVhcl9tY3RybChzdGF0ZS0+cG9ydCwgVElPQ01fUlRTIHwgVElPQ01fRFRSKTsKLQotCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmIChjZmxhZyAmIENCQVVEKSkgewotCQl1bnNpZ25lZCBpbnQgbWFzayA9IFRJT0NNX0RUUjsKLQkJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSB8fAotCQkJCSF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpCi0JCQltYXNrIHw9IFRJT0NNX1JUUzsKLQkJdWFydF9zZXRfbWN0cmwoc3RhdGUtPnBvcnQsIG1hc2spOwotCX0KLQotCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKGNmbGFnICYgQ1JUU0NUUykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5wb3J0LT5sb2NrLCBmbGFncyk7Ci0JCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCV9fbXBfc3RhcnQodHR5KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmIChjZmxhZyAmIENSVFNDVFMpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoIShzdGF0ZS0+cG9ydC0+b3BzLT5nZXRfbWN0cmwoc3RhdGUtPnBvcnQpICYgVElPQ01fQ1RTKSkgewotCQkJdHR5LT5od19zdG9wcGVkID0gMTsKLQkJCXN0YXRlLT5wb3J0LT5vcHMtPnN0b3BfdHgoc3RhdGUtPnBvcnQpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5wb3J0LT5sb2NrLCBmbGFncyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtcF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQ7Ci0KLQlwcmludGsoIm1wX2Nsb3NlIVxuIik7Ci0JaWYgKCFzdGF0ZSB8fCAhc3RhdGUtPnBvcnQpCi0JCXJldHVybjsKLQotCXBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCXByaW50aygiY2xvc2UxICVkXG4iLCBfX0xJTkVfXyk7Ci0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0KLQlwcmludGsoImNsb3NlMiAlZFxuIiwgX19MSU5FX18pOwotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQotCQlnb3RvIGRvbmU7Ci0KLQlwcmludGsoImNsb3NlMyAlZFxuIiwgX19MSU5FX18pOwotCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoc3RhdGUtPmNvdW50ICE9IDEpKSB7Ci0JCXByaW50aygibXBfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCi0JCQkJInN0YXRlLT5jb3VudCBpcyAlZFxuIiwgc3RhdGUtPmNvdW50KTsKLQkJc3RhdGUtPmNvdW50ID0gMTsKLQl9Ci0JcHJpbnRrKCJjbG9zZTQgJWRcbiIsIF9fTElORV9fKTsKLQlpZiAoLS1zdGF0ZS0+Y291bnQgPCAwKSB7Ci0JCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5TVAlZDogJWRcbiIsCi0JCQkJcG9ydC0+bGluZSwgc3RhdGUtPmNvdW50KTsKLQkJc3RhdGUtPmNvdW50ID0gMDsKLQl9Ci0JaWYgKHN0YXRlLT5jb3VudCkKLQkJZ290byBkb25lOwotCi0JdHR5LT5jbG9zaW5nID0gMTsKLQotCXByaW50aygiY2xvc2U1ICVkXG4iLCBfX0xJTkVfXyk7Ci0JaWYgKHN0YXRlLT5jbG9zaW5nX3dhaXQgIT0gVVNGX0NMT1NJTkdfV0FJVF9OT05FKQotCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgc3RhdGUtPmNsb3Npbmdfd2FpdCk7Ci0KLQlwcmludGsoImNsb3NlNiAlZFxuIiwgX19MSU5FX18pOwotCWlmIChzdGF0ZS0+aW5mby0+ZmxhZ3MgJiBVSUZfSU5JVElBTElaRUQpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJcG9ydC0+b3BzLT5zdG9wX3J4KHBvcnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCW1wX3dhaXRfdW50aWxfc2VudCh0dHksIHBvcnQtPnRpbWVvdXQpOwotCX0KLQlwcmludGsoImNsb3NlNyAlZFxuIiwgX19MSU5FX18pOwotCi0JbXBfc2h1dGRvd24oc3RhdGUpOwotCXByaW50aygiY2xvc2U4ICVkXG4iLCBfX0xJTkVfXyk7Ci0JbXBfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0JdHR5LT5jbG9zaW5nID0gMDsKLQlzdGF0ZS0+aW5mby0+dHR5ID0gTlVMTDsKLQlpZiAoc3RhdGUtPmluZm8tPmJsb2NrZWRfb3BlbikgCi0JewotCQlpZiAoc3RhdGUtPmNsb3NlX2RlbGF5KQotCQl7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dChzdGF0ZS0+Y2xvc2VfZGVsYXkpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCW1wX2NoYW5nZV9wbShzdGF0ZSwgMyk7Ci0JfQotCXByaW50aygiY2xvc2U4ICVkXG4iLCBfX0xJTkVfXyk7Ci0KLQlzdGF0ZS0+aW5mby0+ZmxhZ3MgJj0gflVJRl9OT1JNQUxfQUNUSVZFOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmluZm8tPm9wZW5fd2FpdCk7Ci0KLWRvbmU6Ci0JcHJpbnRrKCJjbG9zZSBkb25lXG4iKTsKLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotfQotCi1zdGF0aWMgdm9pZCBtcF93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBjaGFyX3RpbWUsIGV4cGlyZTsKLQotCWlmIChwb3J0LT50eXBlID09IFBPUlRfVU5LTk9XTiB8fCBwb3J0LT5maWZvc2l6ZSA9PSAwKQotCQlyZXR1cm47Ci0KLQljaGFyX3RpbWUgPSAocG9ydC0+dGltZW91dCAtIEhaLzUwKSAvIHBvcnQtPmZpZm9zaXplOwotCWNoYXJfdGltZSA9IGNoYXJfdGltZSAvIDU7Ci0JaWYgKGNoYXJfdGltZSA9PSAwKQotCQljaGFyX3RpbWUgPSAxOwotCWlmICh0aW1lb3V0ICYmIHRpbWVvdXQgPCBjaGFyX3RpbWUpCi0JCWNoYXJfdGltZSA9IHRpbWVvdXQ7Ci0KLQlpZiAodGltZW91dCA9PSAwIHx8IHRpbWVvdXQgPiAyICogcG9ydC0+dGltZW91dCkKLQkJdGltZW91dCA9IDIgKiBwb3J0LT50aW1lb3V0OwotCi0JZXhwaXJlID0gamlmZmllcyArIHRpbWVvdXQ7Ci0KLQl3aGlsZSAoIXBvcnQtPm9wcy0+dHhfZW1wdHkocG9ydCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChjaGFyX3RpbWUpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZXhwaXJlKSkKLQkJCWJyZWFrOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOyAvKiBtaWdodCBub3QgYmUgbmVlZGVkICovCi19Ci0KLXN0YXRpYyB2b2lkIG1wX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQlpZiAoc3RhdGUtPmluZm8gJiYgc3RhdGUtPmluZm8tPmZsYWdzICYgVUlGX05PUk1BTF9BQ1RJVkUpIHsKLQkJbXBfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JCW1wX3NodXRkb3duKHN0YXRlKTsKLQkJc3RhdGUtPmNvdW50ID0gMDsKLQkJc3RhdGUtPmluZm8tPmZsYWdzICY9IH5VSUZfTk9STUFMX0FDVElWRTsKLQkJc3RhdGUtPmluZm8tPnR0eSA9IE5VTEw7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmluZm8tPm9wZW5fd2FpdCk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKLQl9Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQgbXBfdXBkYXRlX3Rlcm1pb3Moc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBzdGF0ZS0+aW5mby0+dHR5OwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCWlmICghKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewotCQltcF9jaGFuZ2Vfc3BlZWQoc3RhdGUsIE5VTEwpOwotCi0JCWlmICh0dHktPnRlcm1pb3MuY19jZmxhZyAmIENCQVVEKQotCQkJdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHN0YXRlLT5pbmZvOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBpbnQgbWN0cmw7Ci0KLQlpbmZvLT5ibG9ja2VkX29wZW4rKzsKLQlzdGF0ZS0+Y291bnQtLTsKLQotCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0JCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8IGluZm8tPnR0eSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBVSUZfSU5JVElBTElaRUQpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKLQkJCQkoaW5mby0+dHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDTE9DQUwpIHx8Ci0JCQkJKGluZm8tPnR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaW5mby0+dHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDQkFVRCkKLQkJCXVhcnRfc2V0X21jdHJsKHBvcnQsIFRJT0NNX0RUUik7Ci0KLQkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JCXBvcnQtPm9wcy0+ZW5hYmxlX21zKHBvcnQpOwotCQltY3RybCA9IHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpOwotCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQlpZiAobWN0cmwgJiBUSU9DTV9DQVIpCi0JCQlicmVhazsKLQotCQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCQlzY2hlZHVsZSgpOwotCQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7Ci0KLQlzdGF0ZS0+Y291bnQrKzsKLQlpbmZvLT5ibG9ja2VkX29wZW4tLTsKLQotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWlmICghaW5mby0+dHR5IHx8IHR0eV9odW5nX3VwX3AoZmlscCkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqdWFydF9nZXQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIGludCBsaW5lKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZTsKLQotCU1QX01VVEVYX0xPQ0sobXBfbXV0ZXgpOwotCXN0YXRlID0gZHJ2LT5zdGF0ZSArIGxpbmU7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSkgewotCQlzdGF0ZSA9IEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKLQkJZ290byBvdXQ7Ci0JfQotCXN0YXRlLT5jb3VudCsrOwotCWlmICghc3RhdGUtPnBvcnQpIHsKLQkJc3RhdGUtPmNvdW50LS07Ci0JCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JCXN0YXRlID0gRVJSX1BUUigtRU5YSU8pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIXN0YXRlLT5pbmZvKSB7Ci0JCXN0YXRlLT5pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNiX3VhcnRfaW5mbyksIEdGUF9LRVJORUwpOwotCQlpZiAoc3RhdGUtPmluZm8pIHsKLQkJCW1lbXNldChzdGF0ZS0+aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X2luZm8pKTsKLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0YXRlLT5pbmZvLT5vcGVuX3dhaXQpOwotCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3RhdGUtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKLQotCQkJc3RhdGUtPnBvcnQtPmluZm8gPSBzdGF0ZS0+aW5mbzsKLQotCQkJdGFza2xldF9pbml0KCZzdGF0ZS0+aW5mby0+dGxldCwgbXBfdGFza2xldF9hY3Rpb24sCi0JCQkJCSh1bnNpZ25lZCBsb25nKXN0YXRlKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXRlLT5jb3VudC0tOwotCQkJTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQkJCXN0YXRlID0gRVJSX1BUUigtRU5PTUVNKTsKLQkJfQotCX0KLQotb3V0OgotCU1QX01VVEVYX1VOTE9DSyhtcF9tdXRleCk7Ci0JcmV0dXJuIHN0YXRlOwotfQotCi1zdGF0aWMgaW50IG1wX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IHVhcnRfZHJpdmVyICpkcnYgPSAoc3RydWN0IHVhcnRfZHJpdmVyICopdHR5LT5kcml2ZXItPmRyaXZlcl9zdGF0ZTsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGU7Ci0JaW50IHJldHZhbDsKLQlpbnQgIGxpbmUgPSB0dHktPmluZGV4OwotCXN0cnVjdCBtcF9wb3J0ICptdHB0OwotCi0JcmV0dmFsID0gLUVOT0RFVjsKLQlpZiAobGluZSA+PSB0dHktPmRyaXZlci0+bnVtKQotCQlnb3RvIGZhaWw7Ci0KLQlzdGF0ZSA9IHVhcnRfZ2V0KGRydiwgbGluZSk7Ci0KLQlpZiAoSVNfRVJSKHN0YXRlKSkgewotCQlyZXR2YWwgPSBQVFJfRVJSKHN0YXRlKTsKLQkJZ290byBmYWlsOwotCX0KLQotCW10cHQgID0gKHN0cnVjdCBtcF9wb3J0ICopc3RhdGUtPnBvcnQ7Ci0KLQl0dHktPmRyaXZlcl9kYXRhID0gc3RhdGU7Ci0JdHR5LT5sb3dfbGF0ZW5jeSA9IChzdGF0ZS0+cG9ydC0+ZmxhZ3MgJiBVUEZfTE9XX0xBVEVOQ1kpID8gMSA6IDA7Ci0JdHR5LT5hbHRfc3BlZWQgPSAwOwotCXN0YXRlLT5pbmZvLT50dHkgPSB0dHk7Ci0KLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgewotCQlyZXR2YWwgPSAtRUFHQUlOOwotCQlzdGF0ZS0+Y291bnQtLTsKLQkJTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmIChzdGF0ZS0+Y291bnQgPT0gMSkKLQkJbXBfY2hhbmdlX3BtKHN0YXRlLCAwKTsKLQotCXJldHZhbCA9IG1wX3N0YXJ0dXAoc3RhdGUsIDApOwotCi0JaWYgKHJldHZhbCA9PSAwKQotCQlyZXR2YWwgPSBtcF9ibG9ja190aWxfcmVhZHkoZmlscCwgc3RhdGUpOwotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0KLQlpZiAocmV0dmFsID09IDAgJiYgIShzdGF0ZS0+aW5mby0+ZmxhZ3MgJiBVSUZfTk9STUFMX0FDVElWRSkpIHsKLQkJc3RhdGUtPmluZm8tPmZsYWdzIHw9IFVJRl9OT1JNQUxfQUNUSVZFOwotCi0JCW1wX3VwZGF0ZV90ZXJtaW9zKHN0YXRlKTsKLQl9Ci0KLQl1YXJ0X2NsZWFyX21jdHJsKHN0YXRlLT5wb3J0LCBUSU9DTV9SVFMpOwotCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLWZhaWw6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqbXBfdHlwZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCWNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7Ci0KLQlpZiAocG9ydC0+b3BzLT50eXBlKQotCQlzdHIgPSBwb3J0LT5vcHMtPnR5cGUocG9ydCk7Ci0KLQlpZiAoIXN0cikKLQkJc3RyID0gInVua25vd24iOwotCi0JcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIHZvaWQgbXBfY2hhbmdlX3BtKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgaW50IHBtX3N0YXRlKQotewotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlpZiAocG9ydC0+b3BzLT5wbSkKLQkJcG9ydC0+b3BzLT5wbShwb3J0LCBwbV9zdGF0ZSwgc3RhdGUtPnBtX3N0YXRlKTsKLQlzdGF0ZS0+cG1fc3RhdGUgPSBwbV9zdGF0ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1wX3JlcG9ydF9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCWNoYXIgYWRkcmVzc1s2NF07Ci0KLQlzd2l0Y2ggKHBvcnQtPmlvdHlwZSkgewotCQljYXNlIFVQSU9fUE9SVDoKLQkJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwiSS9PIDB4JXgiLCBwb3J0LT5pb2Jhc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVBJT19IVUI2OgotCQkJc25wcmludGYoYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpLCJJL08gMHgleCBvZmZzZXQgMHgleCIsIHBvcnQtPmlvYmFzZSwgcG9ydC0+aHViNik7Ci0JCQlicmVhazsKLQkJY2FzZSBVUElPX01FTToKLQkJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwiTU1JTyAweCVseCIsIHBvcnQtPm1hcGJhc2UpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzbnByaW50ZihhZGRyZXNzLCBzaXplb2YoYWRkcmVzcyksIip1bmtub3duKiIgKTsKLQkJCXN0cmxjcHkoYWRkcmVzcywgIip1bmtub3duKiIsIHNpemVvZihhZGRyZXNzKSk7Ci0JCQlicmVhazsKLQl9Ci0KLQlwcmludGsoICIlcyVkIGF0ICVzIChpcnEgPSAlZCkgaXMgYSAlc1xuIiwKLQkJCWRydi0+ZGV2X25hbWUsIHBvcnQtPmxpbmUsIGFkZHJlc3MsIHBvcnQtPmlycSwgbXBfdHlwZShwb3J0KSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgbXBfY29uZmlndXJlX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0KLQotCWlmICghcG9ydC0+aW9iYXNlICYmICFwb3J0LT5tYXBiYXNlICYmICFwb3J0LT5tZW1iYXNlKQotCXsKLQkJRFBSSU5USygiJXMgZXJyb3IgXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKLQl9Ci0JZmxhZ3MgPSBVQVJUX0NPTkZJR19UWVBFOwotCWlmIChwb3J0LT5mbGFncyAmIFVQRl9BVVRPX0lSUSkKLQkJZmxhZ3MgfD0gVUFSVF9DT05GSUdfSVJROwotCWlmIChwb3J0LT5mbGFncyAmIFVQRl9CT09UX0FVVE9DT05GKSB7Ci0JCXBvcnQtPnR5cGUgPSBQT1JUX1VOS05PV047Ci0JCXBvcnQtPm9wcy0+Y29uZmlnX3BvcnQocG9ydCwgZmxhZ3MpOwotCX0KLQotCWlmIChwb3J0LT50eXBlICE9IFBPUlRfVU5LTk9XTikgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCW1wX3JlcG9ydF9wb3J0KGRydiwgcG9ydCk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJcG9ydC0+b3BzLT5zZXRfbWN0cmwocG9ydCwgMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQotCQltcF9jaGFuZ2VfcG0oc3RhdGUsIDMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXBfdW5jb25maWd1cmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gc3RhdGUtPmluZm87Ci0KLQlpZiAoaW5mbyAmJiBpbmZvLT50dHkpCi0JCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKLQotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCi0Jc3RhdGUtPmluZm8gPSBOVUxMOwotCi0JaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9VTktOT1dOKQotCQlwb3J0LT5vcHMtPnJlbGVhc2VfcG9ydChwb3J0KTsKLQotCXBvcnQtPnR5cGUgPSBQT1JUX1VOS05PV047Ci0KLQlpZiAoaW5mbykgewotCQl0YXNrbGV0X2tpbGwoJmluZm8tPnRsZXQpOwotCQlrZnJlZShpbmZvKTsKLQl9Ci0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotfQotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBtcF9vcHMgPSB7Ci0JLm9wZW4JCT0gbXBfb3BlbiwKLQkuY2xvc2UJCT0gbXBfY2xvc2UsCi0JLndyaXRlCQk9IG1wX3dyaXRlLAotCS5wdXRfY2hhcgk9IG1wX3B1dF9jaGFyLAotCS5mbHVzaF9jaGFycwk9IG1wX3B1dF9jaGFycywKLQkud3JpdGVfcm9vbQk9IG1wX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlcj0gbXBfY2hhcnNfaW5fYnVmZmVyLAotCS5mbHVzaF9idWZmZXIJPSBtcF9mbHVzaF9idWZmZXIsCi0JLmlvY3RsCQk9IG1wX2lvY3RsLAotCS50aHJvdHRsZQk9IG1wX3Rocm90dGxlLAotCS51bnRocm90dGxlCT0gbXBfdW50aHJvdHRsZSwKLQkuc2VuZF94Y2hhcgk9IG1wX3NlbmRfeGNoYXIsCi0JLnNldF90ZXJtaW9zCT0gbXBfc2V0X3Rlcm1pb3MsCi0JLnN0b3AJCT0gbXBfc3RvcCwKLQkuc3RhcnQJCT0gbXBfc3RhcnQsCi0JLmhhbmd1cAkJPSBtcF9oYW5ndXAsCi0JLmJyZWFrX2N0bAk9IG1wX2JyZWFrX2N0bCwKLQkud2FpdF91bnRpbF9zZW50PSBtcF93YWl0X3VudGlsX3NlbnQsCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQkucHJvY19mb3BzCT0gTlVMTCwKLSNlbmRpZgotCS50aW9jbWdldAk9IG1wX3Rpb2NtZ2V0LAotCS50aW9jbXNldAk9IG1wX3Rpb2Ntc2V0LAotfTsKLQotc3RhdGljIGludCBtcF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKm5vcm1hbCA9IE5VTEw7Ci0JaW50IGksIHJldHZhbDsKLQotCWRydi0+c3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSkgKiBkcnYtPm5yLCBHRlBfS0VSTkVMKTsKLQlyZXR2YWwgPSAtRU5PTUVNOwotCWlmICghZHJ2LT5zdGF0ZSkKLQl7Ci0JCXByaW50aygiU0IgUENJIEVycm9yOiBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IhXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCW1lbXNldChkcnYtPnN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IHNiX3VhcnRfc3RhdGUpICogZHJ2LT5ucik7Ci0KLQlub3JtYWwgPSBhbGxvY190dHlfZHJpdmVyKGRydi0+bnIpOwotCWlmICghbm9ybWFsKQotCXsKLQkJcHJpbnRrKCJTQiBQQ0kgRXJyb3I6IHR0eSBhbGxvY2F0aW9uIGVycm9yIVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRydi0+dHR5X2RyaXZlciA9IG5vcm1hbDsKLQotCW5vcm1hbC0+b3duZXIgICAgICAgICAgID0gZHJ2LT5vd25lcjsKLQlub3JtYWwtPm1hZ2ljCQk9IFRUWV9EUklWRVJfTUFHSUM7Ci0Jbm9ybWFsLT5kcml2ZXJfbmFtZSAgICAgPSBkcnYtPmRyaXZlcl9uYW1lOwotCW5vcm1hbC0+bmFtZQkJPSBkcnYtPmRldl9uYW1lOwotCW5vcm1hbC0+bWFqb3IJCT0gZHJ2LT5tYWpvcjsKLQlub3JtYWwtPm1pbm9yX3N0YXJ0CT0gZHJ2LT5taW5vcjsKLQotCW5vcm1hbC0+bnVtCQk9IE1BWF9NUF9QT1JUIDsgCi0KLQlub3JtYWwtPnR5cGUJCT0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKLQlub3JtYWwtPnN1YnR5cGUJCT0gU0VSSUFMX1RZUEVfTk9STUFMOwotCW5vcm1hbC0+aW5pdF90ZXJtaW9zCT0gdHR5X3N0ZF90ZXJtaW9zOwotCW5vcm1hbC0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7Ci0Jbm9ybWFsLT5mbGFncwkJPSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKLQlub3JtYWwtPmRyaXZlcl9zdGF0ZSAgICA9IGRydjsKLQotCXR0eV9zZXRfb3BlcmF0aW9ucyhub3JtYWwsICZtcF9vcHMpOwotCi1mb3IgKGkgPSAwOyBpIDwgZHJ2LT5ucjsgaSsrKSB7Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gZHJ2LT5zdGF0ZSArIGk7Ci0KLQlzdGF0ZS0+Y2xvc2VfZGVsYXkgICAgID0gNTAwOyAgIAotCXN0YXRlLT5jbG9zaW5nX3dhaXQgICAgPSAzMDAwMDsgCi0KLQltdXRleF9pbml0KCZzdGF0ZS0+bXV0ZXgpOwotCX0KLQotCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIobm9ybWFsKTsKLW91dDoKLQlpZiAocmV0dmFsIDwgMCkgewotCQlwcmludGsoIlJlZ2lzdGVyIHR0eSBkcml2ZXIgRmFpbCFcbiIpOwotCQlwdXRfdHR5X2RyaXZlcihub3JtYWwpOwotCQlrZnJlZShkcnYtPnN0YXRlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi12b2lkIG1wX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KQotewotICAgIHN0cnVjdCB0dHlfZHJpdmVyICpub3JtYWwgPSBOVUxMOwotCi0gICAgbm9ybWFsID0gZHJ2LT50dHlfZHJpdmVyOwotCi0gICAgaWYgKCFub3JtYWwpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHR5X3VucmVnaXN0ZXJfZHJpdmVyKG5vcm1hbCk7Ci0gICAgcHV0X3R0eV9kcml2ZXIobm9ybWFsKTsKLSAgICBkcnYtPnR0eV9kcml2ZXIgPSBOVUxMOwotCi0KLSAgICBrZnJlZShkcnYtPnN0YXRlKTsKLQotfQotCi1zdGF0aWMgaW50IG1wX2FkZF9vbmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGU7Ci0JaW50IHJldCA9IDA7Ci0KLQotCWlmIChwb3J0LT5saW5lID49IGRydi0+bnIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RhdGUgPSBkcnYtPnN0YXRlICsgcG9ydC0+bGluZTsKLQotCU1QX01VVEVYX0xPQ0sobXBfbXV0ZXgpOwotCWlmIChzdGF0ZS0+cG9ydCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzdGF0ZS0+cG9ydCA9IHBvcnQ7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7Ci0JcG9ydC0+Y29ucyA9IGRydi0+Y29uczsKLQlwb3J0LT5pbmZvID0gc3RhdGUtPmluZm87Ci0KLQltcF9jb25maWd1cmVfcG9ydChkcnYsIHN0YXRlLCBwb3J0KTsKLQotCXR0eV9yZWdpc3Rlcl9kZXZpY2UoZHJ2LT50dHlfZHJpdmVyLCBwb3J0LT5saW5lLCBwb3J0LT5kZXYpOwotCi1vdXQ6Ci0JTVBfTVVURVhfVU5MT0NLKG1wX211dGV4KTsKLQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcF9yZW1vdmVfb25lX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gZHJ2LT5zdGF0ZSArIHBvcnQtPmxpbmU7Ci0KLQlpZiAoc3RhdGUtPnBvcnQgIT0gcG9ydCkKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIlJlbW92aW5nIHdyb25nIHBvcnQ6ICVwICE9ICVwXG4iLAotCQkJCXN0YXRlLT5wb3J0LCBwb3J0KTsKLQotCU1QX01VVEVYX0xPQ0sobXBfbXV0ZXgpOwotCi0JdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGRydi0+dHR5X2RyaXZlciwgcG9ydC0+bGluZSk7Ci0KLQltcF91bmNvbmZpZ3VyZV9wb3J0KGRydiwgc3RhdGUpOwotCXN0YXRlLT5wb3J0ID0gTlVMTDsKLQlNUF9NVVRFWF9VTkxPQ0sobXBfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1dG9jb25maWcoc3RydWN0IG1wX3BvcnQgKm10cHQsIHVuc2lnbmVkIGludCBwcm9iZWZsYWdzKQotewotCXVuc2lnbmVkIGNoYXIgc3RhdHVzMSwgc2NyYXRjaCwgc2NyYXRjaDIsIHNjcmF0Y2gzOwotCXVuc2lnbmVkIGNoYXIgc2F2ZV9sY3IsIHNhdmVfbWNyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl1bnNpZ25lZCBjaGFyIHVfdHlwZTsKLQl1bnNpZ25lZCBjaGFyIGJfcmV0ID0gMDsKLQotCWlmICghbXRwdC0+cG9ydC5pb2Jhc2UgJiYgIW10cHQtPnBvcnQubWFwYmFzZSAmJiAhbXRwdC0+cG9ydC5tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQlERUJVR19BVVRPQ09ORigidHR5TVAlZDogYXV0b2NvbmYgKDB4JTA0eCwgMHglcCk6ICIsCi0JCQltdHB0LT5wb3J0LmxpbmUsIG10cHQtPnBvcnQuaW9iYXNlLCBtdHB0LT5wb3J0Lm1lbWJhc2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0JaWYgKCEobXRwdC0+cG9ydC5mbGFncyAmIFVQRl9CVUdHWV9VQVJUKSkgewotCQlzY3JhdGNoID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX0lFUik7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCAwKTsKLSNpZmRlZiBfX2kzODZfXwotCQlvdXRiKDB4ZmYsIDB4MDgwKTsKLSNlbmRpZgotCQlzY3JhdGNoMiA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9JRVIpICYgMHgwZjsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIDB4MEYpOwotI2lmZGVmIF9faTM4Nl9fCi0JCW91dGIoMCwgMHgwODApOwotI2VuZGlmCi0JCXNjcmF0Y2gzID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX0lFUikgJiAweDBGOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgc2NyYXRjaCk7Ci0JCWlmIChzY3JhdGNoMiAhPSAwIHx8IHNjcmF0Y2gzICE9IDB4MEYpIHsKLQkJCURFQlVHX0FVVE9DT05GKCJJRVIgdGVzdCBmYWlsZWQgKCUwMngsICUwMngpICIsCi0JCQkJCXNjcmF0Y2gyLCBzY3JhdGNoMyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCXNhdmVfbWNyID0gc2VyaWFsX2luKG10cHQsIFVBUlRfTUNSKTsKLQlzYXZlX2xjciA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX0xDUik7Ci0KLQlpZiAoIShtdHB0LT5wb3J0LmZsYWdzICYgVVBGX1NLSVBfVEVTVCkpIHsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsIFVBUlRfTUNSX0xPT1AgfCAweDBBKTsKLQkJc3RhdHVzMSA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9NU1IpICYgMHhGMDsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsIHNhdmVfbWNyKTsKLQkJaWYgKHN0YXR1czEgIT0gMHg5MCkgewotCQkJREVCVUdfQVVUT0NPTkYoIkxPT1AgdGVzdCBmYWlsZWQgKCUwMngpICIsCi0JCQkJCXN0YXR1czEpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMHhCRik7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9FRlIsIDApOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAwKTsKLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7Ci0Jc2NyYXRjaCA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX0lJUikgPj4gNjsKLQotCURFQlVHX0FVVE9DT05GKCJpaXI9JWQgIiwgc2NyYXRjaCk7Ci0JaWYobXRwdC0+ZGV2aWNlLT5ucl9wb3J0cyA+PSA4KQotCQliX3JldCA9IHJlYWRfb3B0aW9uX3JlZ2lzdGVyKG10cHQsKE1QX09QVFJfRElSMCArICgobXRwdC0+cG9ydC5saW5lKS84KSkpOwotCWVsc2UJCi0JCWJfcmV0ID0gcmVhZF9vcHRpb25fcmVnaXN0ZXIobXRwdCxNUF9PUFRSX0RJUjApOwotCXVfdHlwZSA9IChiX3JldCAmIDB4ZjApID4+IDQ7Ci0JaWYobXRwdC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9XTiApCi0JewotCQlzd2l0Y2ggKHVfdHlwZSkKLQkJewotCQkJY2FzZSBESVJfVUFSVF8xNkM1NTA6Ci0JCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF8xNkM1NVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERJUl9VQVJUXzE2QzEwNTA6Ci0JCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF8xNkMxMDVYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBESVJfVUFSVF8xNkMxMDUwQToKLQkJCQlpZiAobXRwdC0+cG9ydC5saW5lIDwgMikKLQkJCQl7Ci0JCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfMTZDMTA1WEE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChtdHB0LT5kZXZpY2UtPmRldmljZV9pZCAmIDB4NTApCi0JCQkJCXsKLQkJCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfMTZDNTVYOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF8xNkMxMDVYOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoJCi0JCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF9VTktOT1dOOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYobXRwdC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9XTiApCi0JewotcHJpbnRrKCJ1bmtub3cyXG4iKTsKLQkJc3dpdGNoIChzY3JhdGNoKSB7Ci0JCQljYXNlIDA6Ci0JCQljYXNlIDE6Ci0JCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF9VTktOT1dOOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJY2FzZSAzOgotCQkJCW10cHQtPnBvcnQudHlwZSA9IFBPUlRfMTZDNTVYOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIHNhdmVfbGNyKTsKLQotCW10cHQtPnBvcnQuZmlmb3NpemUgPSB1YXJ0X2NvbmZpZ1ttdHB0LT5wb3J0LnR5cGVdLmRmbF94bWl0X2ZpZm9fc2l6ZTsKLQltdHB0LT5jYXBhYmlsaXRpZXMgPSB1YXJ0X2NvbmZpZ1ttdHB0LT5wb3J0LnR5cGVdLmZsYWdzOwotCi0JaWYgKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pCi0JCWdvdG8gb3V0OwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLCBzYXZlX21jcik7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIChVQVJUX0ZDUl9FTkFCTEVfRklGTyB8Ci0JCQkJVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8Ci0JCQkJVUFSVF9GQ1JfQ0xFQVJfWE1JVCkpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCAwKTsKLQkodm9pZClzZXJpYWxfaW4obXRwdCwgVUFSVF9SWCk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIDApOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JREVCVUdfQVVUT0NPTkYoInR5cGU9JXNcbiIsIHVhcnRfY29uZmlnW210cHQtPnBvcnQudHlwZV0ubmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1dG9jb25maWdfaXJxKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXVuc2lnbmVkIGNoYXIgc2F2ZV9tY3IsIHNhdmVfaWVyOwotCXVuc2lnbmVkIGxvbmcgaXJxczsKLQlpbnQgaXJxOwotCi0JLyogZm9yZ2V0IHBvc3NpYmxlIGluaXRpYWxseSBtYXNrZWQgYW5kIHBlbmRpbmcgSVJRICovCi0JcHJvYmVfaXJxX29mZihwcm9iZV9pcnFfb24oKSk7Ci0Jc2F2ZV9tY3IgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTUNSKTsKLQlzYXZlX2llciA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9JRVIpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLCBVQVJUX01DUl9PVVQxIHwgVUFSVF9NQ1JfT1VUMik7Ci0KLQlpcnFzID0gcHJvYmVfaXJxX29uKCk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsIDApOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLAotCQlVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKTsKLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCAweDBmKTsgICAgLyogZW5hYmxlIGFsbCBpbnRycyAqLwotCSh2b2lkKXNlcmlhbF9pbnAobXRwdCwgVUFSVF9MU1IpOwotCSh2b2lkKXNlcmlhbF9pbnAobXRwdCwgVUFSVF9SWCk7Ci0JKHZvaWQpc2VyaWFsX2lucChtdHB0LCBVQVJUX0lJUik7Ci0JKHZvaWQpc2VyaWFsX2lucChtdHB0LCBVQVJUX01TUik7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9UWCwgMHhGRik7Ci0JaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTUNSLCBzYXZlX21jcik7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIHNhdmVfaWVyKTsKLQotCW10cHQtPnBvcnQuaXJxID0gKGlycSA+IDApID8gaXJxIDogMDsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfc3RvcF90eChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQotCWlmIChtdHB0LT5pZXIgJiBVQVJUX0lFUl9USFJJKSB7Ci0JCW10cHQtPmllciAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJc2VyaWFsX291dChtdHB0LCBVQVJUX0lFUiwgbXRwdC0+aWVyKTsKLQl9Ci0KLQl0YXNrbGV0X3NjaGVkdWxlKCZwb3J0LT5pbmZvLT50bGV0KTsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfc3RhcnRfdHgoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0KLQlpZiAoIShtdHB0LT5pZXIgJiBVQVJUX0lFUl9USFJJKSkgewotCQltdHB0LT5pZXIgfD0gVUFSVF9JRVJfVEhSSTsKLQkJc2VyaWFsX291dChtdHB0LCBVQVJUX0lFUiwgbXRwdC0+aWVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3N0b3Bfcngoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0KLQltdHB0LT5pZXIgJj0gflVBUlRfSUVSX1JMU0k7Ci0JbXRwdC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrICY9IH5VQVJUX0xTUl9EUjsKLQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfSUVSLCBtdHB0LT5pZXIpOwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9lbmFibGVfbXMoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0KLQltdHB0LT5pZXIgfD0gVUFSVF9JRVJfTVNJOwotCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9JRVIsIG10cHQtPmllcik7Ci19Ci0KLQotc3RhdGljIF9JTkxJTkVfIHZvaWQgcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50ICpzdGF0dXMgKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBtdHB0LT5wb3J0LmluZm8tPnR0eTsKLQl1bnNpZ25lZCBjaGFyIGxzciA9ICpzdGF0dXM7Ci0JaW50IG1heF9jb3VudCA9IDI1NjsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCWNoYXIgZmxhZzsKLQotCS8vbHNyICY9IG10cHQtPnBvcnQucmVhZF9zdGF0dXNfbWFzazsKLQotCWRvIHsKLQkJaWYgKChsc3IgJiBVQVJUX0xTUl9QRSkgJiYgKG10cHQtPnBvcnQubWRtb2RlICYgTURNT0RFX0VOQUJMRSkpCi0JCXsKLQkJCWNoID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX1JYKTsKLQkJfQotCQllbHNlIGlmIChsc3IgJiBVQVJUX0xTUl9TUEVDSUFMKSAKLQkJewotCQkJZmxhZyA9IDA7Ci0JCQljaCA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9SWCk7Ci0KLQkJCWlmIChsc3IgJiBVQVJUX0xTUl9CSSkgCi0JCQl7Ci0KLQkJCQltdHB0LT5wb3J0Lmljb3VudC5icmsrKzsKLQkJCQlmbGFnID0gVFRZX0JSRUFLOwotCi0JCQkJaWYgKHNiX3VhcnRfaGFuZGxlX2JyZWFrKCZtdHB0LT5wb3J0KSkKLQkJCQkJZ290byBpZ25vcmVfY2hhcjsKLQkJCX0gCi0JCQlpZiAobHNyICYgVUFSVF9MU1JfUEUpCi0JCQl7Ci0JCQkJbXRwdC0+cG9ydC5pY291bnQucGFyaXR5Kys7Ci0JCQkJZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCQl9Ci0JCQlpZiAobHNyICYgVUFSVF9MU1JfRkUpCi0JCQl7Ci0JCQkJbXRwdC0+cG9ydC5pY291bnQuZnJhbWUrKzsKLQkJCQlmbGFnID0gVFRZX0ZSQU1FOwotCQkJfQotCQkJaWYgKGxzciAmIFVBUlRfTFNSX09FKQotCQkJewotCQkJCW10cHQtPnBvcnQuaWNvdW50Lm92ZXJydW4rKzsKLQkJCQlmbGFnID0gVFRZX09WRVJSVU47Ci0JCQl9Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNoID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX1JYKTsKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIDApOwotCQl9Ci1pZ25vcmVfY2hhcjoKLQkJbHNyID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX0xTUik7Ci0JfSB3aGlsZSAoKGxzciAmIFVBUlRfTFNSX0RSKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7Ci0KLQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotfQotCi0KLQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCB0cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmbXRwdC0+cG9ydC5pbmZvLT54bWl0OwotCWludCBjb3VudDsKLQotCWlmIChtdHB0LT5wb3J0LnhfY2hhcikgewotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX1RYLCBtdHB0LT5wb3J0LnhfY2hhcik7Ci0JCW10cHQtPnBvcnQuaWNvdW50LnR4Kys7Ci0JCW10cHQtPnBvcnQueF9jaGFyID0gMDsKLQkJcmV0dXJuOwotCX0KLQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmbXRwdC0+cG9ydCkpIHsKLQkJbXVsdGlfc3RvcF90eCgmbXRwdC0+cG9ydCk7Ci0JCXJldHVybjsKLQl9Ci0KLQljb3VudCA9IHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpOwotCi0JaWYoY291bnQgPiBtdHB0LT5wb3J0LmZpZm9zaXplKQotCXsKLQkJY291bnQgPSBtdHB0LT5wb3J0LmZpZm9zaXplOwotCX0KLQotCXByaW50aygiWyVkXSBtZG1vZGU6ICV4XG4iLCBtdHB0LT5wb3J0LmxpbmUsIG10cHQtPnBvcnQubWRtb2RlKTsKLQlkbyB7Ci0jaWYgMAotCQkvKiBjaGVjayBtdWx0aS1kcm9wIG1vZGUgKi8KLQkJaWYgKChtdHB0LT5wb3J0Lm1kbW9kZSAmIChNRE1PREVfRU5BQkxFIHwgTURNT0RFX0FERFIpKSA9PSAoTURNT0RFX0VOQUJMRSB8IE1ETU9ERV9BRERSKSkKLQkJewotCQkJcHJpbnRrKCJzZW5kIGFkZHJlc3NcbiIpOwotCQkJLyogc2VuZCBtdWx0aS1kcm9wIGFkZHJlc3MgKi8KLQkJCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9TQ1IsIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmCi0JCXsKLQkJCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9UWCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKLQkJfQotCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCQltdHB0LT5wb3J0Lmljb3VudC50eCsrOwotCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKLX0KLQotCi0KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gc2VyaWFsX2luKG10cHQsIFVBUlRfTVNSKTsKLQotCWlmICgoc3RhdHVzICYgVUFSVF9NU1JfQU5ZX0RFTFRBKSA9PSAwKQotCQlyZXR1cm47Ci0KLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKLQkJbXRwdC0+cG9ydC5pY291bnQucm5nKys7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCi0JCW10cHQtPnBvcnQuaWNvdW50LmRzcisrOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQotCQlzYl91YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKCZtdHB0LT5wb3J0LCBzdGF0dXMgJiBVQVJUX01TUl9EQ0QpOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQotCQlzYl91YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKCZtdHB0LT5wb3J0LCBzdGF0dXMgJiBVQVJUX01TUl9DVFMpOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtdHB0LT5wb3J0LmluZm8tPmRlbHRhX21zcl93YWl0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG11bHRpX2hhbmRsZV9wb3J0KHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXVuc2lnbmVkIGludCBzdGF0dXMgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTFNSKTsKLQotCS8vcHJpbnRrKCJsc3I6ICV4XG4iLCBzdGF0dXMpOwotCi0JaWYgKChzdGF0dXMgJiBVQVJUX0xTUl9EUikgfHwgKHN0YXR1cyAmIFVBUlRfTFNSX1NQRUNJQUwpKQotCQlyZWNlaXZlX2NoYXJzKG10cHQsICZzdGF0dXMpOwotCWNoZWNrX21vZGVtX3N0YXR1cyhtdHB0KTsKLQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkKLQl7Ci0JCWlmICgobXRwdC0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCkKLQkJCXx8IChtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSkpCi0JCQl0cmFuc21pdF9jaGFycyhtdHB0KTsKLQkJZWxzZQotCQl7Ci0JCQlpZiAobXRwdC0+aW50ZXJmYWNlID49IFJTNDg1TkUpCi0JCQkJdWFydF9zZXRfbWN0cmwoJm10cHQtPnBvcnQsIFRJT0NNX1JUUyk7Ci0JCQkKLQkJCXRyYW5zbWl0X2NoYXJzKG10cHQpOwotCi0KLQkJCWlmIChtdHB0LT5pbnRlcmZhY2UgPj0gUlM0ODVORSkKLQkJCXsKLQkJCQl3aGlsZSgoc3RhdHVzPXNlcmlhbF9pbihtdHB0LFVBUlRfTFNSKSAmMHg2MCkhPTB4NjApOwotCQkJCXVhcnRfY2xlYXJfbWN0cmwoJm10cHQtPnBvcnQsIFRJT0NNX1JUUyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXVsdGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgaXJxX2luZm8gKmlpbmZvID0gZGV2X2lkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxoZWFkLCAqZW5kID0gTlVMTDsKLQlpbnQgcGFzc19jb3VudGVyID0gMDsKLQotCi0Jc3Bpbl9sb2NrKCZpaW5mby0+bG9jayk7Ci0KLQlsaGVhZCA9IGlpbmZvLT5oZWFkOwotCWRvIHsKLQkJc3RydWN0IG1wX3BvcnQgKm10cHQ7Ci0JCXVuc2lnbmVkIGludCBpaXI7Ci0KLQkJbXRwdCA9IGxpc3RfZW50cnkobGhlYWQsIHN0cnVjdCBtcF9wb3J0LCBsaXN0KTsKLQkJCi0JCWlpciA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX0lJUik7Ci0JCXByaW50aygiaW50ZXJydXB0ISBwb3J0ICVkLCBpaXIgMHgleFxuIiwgbXRwdC0+cG9ydC5saW5lLCBpaXIpOyAvL3dsZWUKLQkJaWYgKCEoaWlyICYgVUFSVF9JSVJfTk9fSU5UKSkgCi0JCXsKLQkJCXByaW50aygiaW50ZXJydXB0IGhhbmRsZVxuIik7Ci0JCQlzcGluX2xvY2soJm10cHQtPnBvcnQubG9jayk7Ci0JCQltdWx0aV9oYW5kbGVfcG9ydChtdHB0KTsKLQkJCXNwaW5fdW5sb2NrKCZtdHB0LT5wb3J0LmxvY2spOwotCi0JCQllbmQgPSBOVUxMOwotCQl9IGVsc2UgaWYgKGVuZCA9PSBOVUxMKQotCQkJZW5kID0gbGhlYWQ7Ci0KLQkJbGhlYWQgPSBsaGVhZC0+bmV4dDsKLQkJaWYgKGxoZWFkID09IGlpbmZvLT5oZWFkICYmIHBhc3NfY291bnRlcisrID4gUEFTU19MSU1JVCkgCi0JCXsKLQkJCXByaW50ayhLRVJOX0VSUiAibXVsdGk6IHRvbyBtdWNoIHdvcmsgZm9yICIKLQkJCQkJImlycSVkXG4iLCBpcnEpOwotCQkJcHJpbnRrKCAibXVsdGk6IHRvbyBtdWNoIHdvcmsgZm9yICIKLQkJCQkJImlycSVkXG4iLCBpcnEpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlIChsaGVhZCAhPSBlbmQpOwotCi0Jc3Bpbl91bmxvY2soJmlpbmZvLT5sb2NrKTsKLQotCi0gICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgc2VyaWFsX2RvX3VubGluayhzdHJ1Y3QgaXJxX2luZm8gKmksIHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXNwaW5fbG9ja19pcnEoJmktPmxvY2spOwotCi0JaWYgKCFsaXN0X2VtcHR5KGktPmhlYWQpKSB7Ci0JCWlmIChpLT5oZWFkID09ICZtdHB0LT5saXN0KQotCQkJaS0+aGVhZCA9IGktPmhlYWQtPm5leHQ7Ci0JCWxpc3RfZGVsKCZtdHB0LT5saXN0KTsKLQl9IGVsc2UgewotCQlpLT5oZWFkID0gTlVMTDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnEoJmktPmxvY2spOwotfQotCi1zdGF0aWMgaW50IHNlcmlhbF9saW5rX2lycV9jaGFpbihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQlzdHJ1Y3QgaXJxX2luZm8gKmkgPSBpcnFfbGlzdHMgKyBtdHB0LT5wb3J0LmlycTsKLQlpbnQgcmV0LCBpcnFfZmxhZ3MgPSBtdHB0LT5wb3J0LmZsYWdzICYgVVBGX1NIQVJFX0lSUSA/IElSUUZfU0hBUkVEIDogMDsKLQlzcGluX2xvY2tfaXJxKCZpLT5sb2NrKTsKLQotCWlmIChpLT5oZWFkKSB7Ci0JCWxpc3RfYWRkKCZtdHB0LT5saXN0LCBpLT5oZWFkKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpLT5sb2NrKTsKLQotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZtdHB0LT5saXN0KTsKLQkJaS0+aGVhZCA9ICZtdHB0LT5saXN0OwotCQlzcGluX3VubG9ja19pcnEoJmktPmxvY2spOwotCi0JCXJldCA9IHJlcXVlc3RfaXJxKG10cHQtPnBvcnQuaXJxLCBtdWx0aV9pbnRlcnJ1cHQsCi0JCQkJaXJxX2ZsYWdzLCAic2VyaWFsIiwgaSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJc2VyaWFsX2RvX3VubGluayhpLCBtdHB0KTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBzZXJpYWxfdW5saW5rX2lycV9jaGFpbihzdHJ1Y3QgbXBfcG9ydCAqbXRwdCkKLXsKLQlzdHJ1Y3QgaXJxX2luZm8gKmkgPSBpcnFfbGlzdHMgKyBtdHB0LT5wb3J0LmlycTsKLQotCWlmIChsaXN0X2VtcHR5KGktPmhlYWQpKQotCXsKLQkJZnJlZV9pcnEobXRwdC0+cG9ydC5pcnEsIGkpOwotCX0KLQlzZXJpYWxfZG9fdW5saW5rKGksIG10cHQpOwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKWRhdGE7Ci0KLQotCXNwaW5fbG9jaygmbXRwdC0+cG9ydC5sb2NrKTsKLQltdWx0aV9oYW5kbGVfcG9ydChtdHB0KTsKLQlzcGluX3VubG9jaygmbXRwdC0+cG9ydC5sb2NrKTsKLQotCW1vZF90aW1lcigmbXRwdC0+dGltZXIsIGppZmZpZXMrMSApOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG11bHRpX3R4X2VtcHR5KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQlyZXQgPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCA/IFRJT0NTRVJfVEVNVCA6IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfZ2V0X21jdHJsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQlzdGF0dXMgPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9NU1IpOwotCi0JcmV0ID0gMDsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQotCQlyZXQgfD0gVElPQ01fQ0FSOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9SSSkKLQkJcmV0IHw9IFRJT0NNX1JORzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRFNSKQotCQlyZXQgfD0gVElPQ01fRFNSOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpCi0JCXJldCB8PSBUSU9DTV9DVFM7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfc2V0X21jdHJsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgY2hhciBtY3IgPSAwOwotCi0JbWN0cmwgJj0gMHhmZjsKLQotCWlmIChtY3RybCAmIFRJT0NNX1JUUykKLQkJbWNyIHw9IFVBUlRfTUNSX1JUUzsKLQlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCi0JCW1jciB8PSBVQVJUX01DUl9EVFI7Ci0JaWYgKG1jdHJsICYgVElPQ01fT1VUMSkKLQkJbWNyIHw9IFVBUlRfTUNSX09VVDE7Ci0JaWYgKG1jdHJsICYgVElPQ01fT1VUMikKLQkJbWNyIHw9IFVBUlRfTUNSX09VVDI7Ci0JaWYgKG1jdHJsICYgVElPQ01fTE9PUCkKLQkJbWNyIHw9IFVBUlRfTUNSX0xPT1A7Ci0KLQotCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9NQ1IsIG1jcik7Ci19Ci0KLQotc3RhdGljIHZvaWQgbXVsdGlfYnJlYWtfY3RsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCi0JCW10cHQtPmxjciB8PSBVQVJUX0xDUl9TQkM7Ci0JZWxzZQotCQltdHB0LT5sY3IgJj0gflVBUlRfTENSX1NCQzsKLQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfTENSLCBtdHB0LT5sY3IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQotCi0KLQotc3RhdGljIGludCBtdWx0aV9zdGFydHVwKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbDsKLQotCW10cHQtPmNhcGFiaWxpdGllcyA9IHVhcnRfY29uZmlnW210cHQtPnBvcnQudHlwZV0uZmxhZ3M7Ci0JbXRwdC0+bWNyID0gMDsKLQotCWlmIChtdHB0LT5jYXBhYmlsaXRpZXMgJiBVQVJUX0NMRUFSX0ZJRk8pIHsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKLQkJCQlVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCk7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCAwKTsKLQl9Ci0KLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX0xTUik7Ci0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9SWCk7Ci0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9JSVIpOwotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTVNSKTsKLQkvL3Rlc3Qtd2xlZSA5LWJpdCBkaXNhYmxlCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9NU1IsIDApOwotCi0KLQlpZiAoIShtdHB0LT5wb3J0LmZsYWdzICYgVVBGX0JVR0dZX1VBUlQpICYmCi0JCQkoc2VyaWFsX2lucChtdHB0LCBVQVJUX0xTUikgPT0gMHhmZikpIHsKLQkJcHJpbnRrKCJ0dHlTJWQ6IExTUiBzYWZldHkgY2hlY2sgZW5nYWdlZCFcbiIsIG10cHQtPnBvcnQubGluZSk7Ci0JCS8vcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKCghaXNfcmVhbF9pbnRlcnJ1cHQobXRwdC0+cG9ydC5pcnEpKSB8fCAobXRwdC0+cG9sbF90eXBlPT1UWVBFX1BPTEwpKSB7Ci0JCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gbXRwdC0+cG9ydC50aW1lb3V0OwotCi0JCXRpbWVvdXQgPSB0aW1lb3V0ID4gNiA/ICh0aW1lb3V0IC8gMiAtIDIpIDogMTsKLQotCQltdHB0LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbXRwdDsKLQkJbW9kX3RpbWVyKCZtdHB0LT50aW1lciwgamlmZmllcyArIHRpbWVvdXQpOwotCX0gCi0JZWxzZSAKLQl7Ci0JCXJldHZhbCA9IHNlcmlhbF9saW5rX2lycV9jaGFpbihtdHB0KTsKLQkJaWYgKHJldHZhbCkKLQkJCXJldHVybiByZXR2YWw7Ci0JfQotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU44KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQlpZiAoKGlzX3JlYWxfaW50ZXJydXB0KG10cHQtPnBvcnQuaXJxKSl8fChtdHB0LT5wb2xsX3R5cGU9PVRZUEVfSU5URVJSVVBUKSkKLQkJbXRwdC0+cG9ydC5tY3RybCB8PSBUSU9DTV9PVVQyOwotCi0JbXVsdGlfc2V0X21jdHJsKCZtdHB0LT5wb3J0LCBtdHB0LT5wb3J0Lm1jdHJsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCQotCW10cHQtPmllciA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIG10cHQtPmllcik7Ci0KLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX0xTUik7Ci0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9SWCk7Ci0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9JSVIpOwotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTVNSKTsKLQotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIHZvaWQgbXVsdGlfc2h1dGRvd24oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCi0JbXRwdC0+aWVyID0gMDsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JbXRwdC0+cG9ydC5tY3RybCAmPSB+VElPQ01fT1VUMjsKLQotCW11bHRpX3NldF9tY3RybCgmbXRwdC0+cG9ydCwgbXRwdC0+cG9ydC5tY3RybCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfTENSLCBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTENSKSAmIH5VQVJUX0xDUl9TQkMpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8Ci0JCQlVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwKLQkJCVVBUlRfRkNSX0NMRUFSX1hNSVQpOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCAwKTsKLQotCi0JKHZvaWQpIHNlcmlhbF9pbihtdHB0LCBVQVJUX1JYKTsKLQotCWlmICgoIWlzX3JlYWxfaW50ZXJydXB0KG10cHQtPnBvcnQuaXJxKSl8fChtdHB0LT5wb2xsX3R5cGU9PVRZUEVfUE9MTCkpCi0JewotCQlkZWxfdGltZXJfc3luYygmbXRwdC0+dGltZXIpOwotCX0KLQllbHNlCi0JewotCQlzZXJpYWxfdW5saW5rX2lycV9jaGFpbihtdHB0KTsKLQl9Ci19Ci0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG11bHRpX2dldF9kaXZpc29yKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBiYXVkKQotewotCXVuc2lnbmVkIGludCBxdW90OwotCi0JaWYgKChwb3J0LT5mbGFncyAmIFVQRl9NQUdJQ19NVUxUSVBMSUVSKSAmJgotCQkJYmF1ZCA9PSAocG9ydC0+dWFydGNsay80KSkKLQkJcXVvdCA9IDB4ODAwMTsKLQllbHNlIGlmICgocG9ydC0+ZmxhZ3MgJiBVUEZfTUFHSUNfTVVMVElQTElFUikgJiYKLQkJCWJhdWQgPT0gKHBvcnQtPnVhcnRjbGsvOCkpCi0JCXF1b3QgPSAweDgwMDI7Ci0JZWxzZQotCQlxdW90ID0gc2JfdWFydF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKLQotCXJldHVybiBxdW90OwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBtdWx0aV9zZXRfdGVybWlvcyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgTVBfVEVSTUlPUyAqdGVybWlvcywgc3RydWN0IE1QX1RFUk1JT1MgKm9sZCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgY2hhciBjdmFsLCBmY3IgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGJhdWQsIHF1b3Q7Ci0KLQlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewotCQljYXNlIENTNToKLQkJCWN2YWwgPSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1M2OgotCQkJY3ZhbCA9IDB4MDE7Ci0JCQlicmVhazsKLQkJY2FzZSBDUzc6Ci0JCQljdmFsID0gMHgwMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQljYXNlIENTODoKLQkJCWN2YWwgPSAweDAzOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIpCi0JCWN2YWwgfD0gMHgwNDsKLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKLQkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7Ci0JaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCi0JCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKLQotI2lmZGVmIENNU1BBUgotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ01TUEFSKQotCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7Ci0jZW5kaWYKLQotCWJhdWQgPSBzYl91YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgdGVybWlvcywgb2xkLCAwLCBwb3J0LT51YXJ0Y2xrLzE2KTsKLQlxdW90ID0gbXVsdGlfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7Ci0KLQlpZiAobXRwdC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9VU0VfRklGTykgewotCQkvL2lmIChiYXVkIDwgMjQwMCkKLQkJLy8JZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9UUklHR0VSXzE7Ci0JCS8vZWxzZQotCQkvLwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX1RSSUdHRVJfODsKLQotCQkvLwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IDB4OTA7Ci0JCQlmY3IgPSBmY3JfYXJyW210cHQtPnBvcnQubGluZV07Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0Jc2JfdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKLQotCW10cHQtPnBvcnQucmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOwotCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSU5QQ0spCi0JCW10cHQtPnBvcnQucmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOwotCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgKEJSS0lOVCB8IFBBUk1SSykpCi0JCW10cHQtPnBvcnQucmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKLQotCW10cHQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrID0gMDsKLQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKLQkJbXRwdC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKLQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTkJSSykgewotCQltdHB0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKLQkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCi0JCQltdHB0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRTsKLQl9Ci0KLQlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkgPT0gMCkKLQkJbXRwdC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRFI7Ci0KLQltdHB0LT5pZXIgJj0gflVBUlRfSUVSX01TSTsKLQlpZiAoVUFSVF9FTkFCTEVfTVMoJm10cHQtPnBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcpKQotCQltdHB0LT5pZXIgfD0gVUFSVF9JRVJfTVNJOwotCi0Jc2VyaWFsX291dChtdHB0LCBVQVJUX0lFUiwgbXRwdC0+aWVyKTsKLQotCWlmIChtdHB0LT5jYXBhYmlsaXRpZXMgJiBVQVJUX1NUQVJURUNIKSB7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAweEJGKTsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9FRlIsCi0JCQkJdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgPyBVQVJUX0VGUl9DVFMgOjApOwotCX0KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCBjdmFsIHwgVUFSVF9MQ1JfRExBQik7Lyogc2V0IERMQUIgKi8KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRExMLCBxdW90ICYgMHhmZik7ICAgICAvKiBMUyBvZiBkaXZpc29yICovCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9ETE0sIHF1b3QgPj4gOCk7ICAgICAgIC8qIE1TIG9mIGRpdmlzb3IgKi8KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCBjdmFsKTsgICAgICAgIC8qIHJlc2V0IERMQUIgKi8KLQltdHB0LT5sY3IgPSBjdmFsOyAgICAgICAgICAgICAgICAgLyogU2F2ZSBMQ1IgKi8KLQotCWlmIChmY3IgJiBVQVJUX0ZDUl9FTkFCTEVfRklGTykgewotCQkvKiBlbXVsYXRlZCBVQVJUcyAoTHVjZW50IFZlbnVzIDE2N3gpIG5lZWQgdHdvIHN0ZXBzICovCi0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7Ci0JfQotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIGZjcik7ICAgICAvKiBzZXQgZmNyICovCi0KLQotCWlmICgobXRwdC0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCkKLQkJfHwgKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKSkKLQl7Ci0JCWlmKGRlZXBbbXRwdC0+cG9ydC5saW5lXSE9MCkKLQkJCXNldF9kZWVwX2ZpZm8ocG9ydCwgRU5BQkxFKTsKLQotCQlpZiAobXRwdC0+aW50ZXJmYWNlICE9IFJTMjMyKQotCQkJc2V0X2F1dG9fcnRzKHBvcnQsbXRwdC0+aW50ZXJmYWNlKTsKLQotCX0KLQllbHNlCi0JewotCQlpZiAobXRwdC0+aW50ZXJmYWNlID49IFJTNDg1TkUpCi0JCXsKLQkJCXVhcnRfY2xlYXJfbWN0cmwoJm10cHQtPnBvcnQsIFRJT0NNX1JUUyk7Ci0JCX0KLQl9Ci0KLQlpZihtdHB0LT5kZXZpY2UtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX01QNE0pCi0JewotCQlTZW5kQVRDb21tYW5kKG10cHQpOwotCQlwcmludGsoIlNlbmRBVENvbW1hbmRcbiIpOwotCX0JCi0JbXVsdGlfc2V0X21jdHJsKCZtdHB0LT5wb3J0LCBtdHB0LT5wb3J0Lm1jdHJsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfcG0oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgb2xkc3RhdGUpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCWlmIChzdGF0ZSkgewotCQlpZiAobXRwdC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9TVEFSVEVDSCkgewotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDB4QkYpOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9FRlIsIFVBUlRfRUZSX0VDQik7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMCk7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgVUFSVF9JRVJYX1NMRUVQKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAweEJGKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRUZSLCAwKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAwKTsKLQkJfQotCi0JCWlmIChtdHB0LT5wbSkKLQkJCW10cHQtPnBtKHBvcnQsIHN0YXRlLCBvbGRzdGF0ZSk7Ci0JfSAKLQllbHNlIAotCXsKLQkJaWYgKG10cHQtPmNhcGFiaWxpdGllcyAmIFVBUlRfU1RBUlRFQ0gpIHsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAweEJGKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfRUZSLCBVQVJUX0VGUl9FQ0IpOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDApOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIDApOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDB4QkYpOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9FRlIsIDApOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDApOwotCQl9Ci0KLQkJaWYgKG10cHQtPnBtKQotCQkJbXRwdC0+cG0ocG9ydCwgc3RhdGUsIG9sZHN0YXRlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3JlbGVhc2Vfc3RkX3Jlc291cmNlKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXVuc2lnbmVkIGludCBzaXplID0gOCA8PCBtdHB0LT5wb3J0LnJlZ3NoaWZ0OwotCi0Jc3dpdGNoIChtdHB0LT5wb3J0LmlvdHlwZSkgewotCQljYXNlIFVQSU9fTUVNOgotCQkJaWYgKCFtdHB0LT5wb3J0Lm1hcGJhc2UpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChtdHB0LT5wb3J0LmZsYWdzICYgVVBGX0lPUkVNQVApIHsKLQkJCQlpb3VubWFwKG10cHQtPnBvcnQubWVtYmFzZSk7Ci0JCQkJbXRwdC0+cG9ydC5tZW1iYXNlID0gTlVMTDsKLQkJCX0KLQotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKG10cHQtPnBvcnQubWFwYmFzZSwgc2l6ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVQSU9fSFVCNjoKLQkJY2FzZSBVUElPX1BPUlQ6Ci0JCQlyZWxlYXNlX3JlZ2lvbihtdHB0LT5wb3J0LmlvYmFzZSxzaXplKTsKLQkJCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfcmVsZWFzZV9wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci19Ci0KLXN0YXRpYyBpbnQgbXVsdGlfcmVxdWVzdF9wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX2NvbmZpZ19wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JaW50IHByb2JlZmxhZ3MgPSBQUk9CRV9BTlk7Ci0KLQlpZiAoZmxhZ3MgJiBVQVJUX0NPTkZJR19UWVBFKQotCQlhdXRvY29uZmlnKG10cHQsIHByb2JlZmxhZ3MpOwotCWlmIChtdHB0LT5wb3J0LnR5cGUgIT0gUE9SVF9VTktOT1dOICYmIGZsYWdzICYgVUFSVF9DT05GSUdfSVJRKQotCQlhdXRvY29uZmlnX2lycShtdHB0KTsKLQotCWlmIChtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF9VTktOT1dOKQotCQltdWx0aV9yZWxlYXNlX3N0ZF9yZXNvdXJjZShtdHB0KTsKLX0KLQotc3RhdGljIGludCBtdWx0aV92ZXJpZnlfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQotewotCWlmIChzZXItPmlycSA+PSBOUl9JUlFTIHx8IHNlci0+aXJxIDwgMCB8fAotCQkJc2VyLT5iYXVkX2Jhc2UgPCA5NjAwIHx8IHNlci0+dHlwZSA8IFBPUlRfVU5LTk9XTiB8fAotCQkJc2VyLT50eXBlID09IFBPUlRfU1RBUlRFQ0gpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbXVsdGlfdHlwZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCWludCB0eXBlID0gcG9ydC0+dHlwZTsKLQotCWlmICh0eXBlID49IEFSUkFZX1NJWkUodWFydF9jb25maWcpKQotCQl0eXBlID0gMDsKLQlyZXR1cm4gdWFydF9jb25maWdbdHlwZV0ubmFtZTsKLX0KLQotc3RhdGljIHN0cnVjdCBzYl91YXJ0X29wcyBtdWx0aV9wb3BzID0gewotCS50eF9lbXB0eSAgID0gbXVsdGlfdHhfZW1wdHksCi0JLnNldF9tY3RybCAgPSBtdWx0aV9zZXRfbWN0cmwsCi0JLmdldF9tY3RybCAgPSBtdWx0aV9nZXRfbWN0cmwsCi0JLnN0b3BfdHggICAgPSBtdWx0aV9zdG9wX3R4LAotCS5zdGFydF90eCAgID0gbXVsdGlfc3RhcnRfdHgsCi0JLnN0b3BfcnggICAgPSBtdWx0aV9zdG9wX3J4LAotCS5lbmFibGVfbXMgID0gbXVsdGlfZW5hYmxlX21zLAotCS5icmVha19jdGwgID0gbXVsdGlfYnJlYWtfY3RsLAotCS5zdGFydHVwICAgID0gbXVsdGlfc3RhcnR1cCwKLQkuc2h1dGRvd24gICA9IG11bHRpX3NodXRkb3duLAotCS5zZXRfdGVybWlvcyAgICA9IG11bHRpX3NldF90ZXJtaW9zLAotCS5wbSAgICAgCT0gbXVsdGlfcG0sCi0JLnR5cGUgICAgICAgCT0gbXVsdGlfdHlwZSwKLQkucmVsZWFzZV9wb3J0ICAgPSBtdWx0aV9yZWxlYXNlX3BvcnQsCi0JLnJlcXVlc3RfcG9ydCAgID0gbXVsdGlfcmVxdWVzdF9wb3J0LAotCS5jb25maWdfcG9ydCAgICA9IG11bHRpX2NvbmZpZ19wb3J0LAotCS52ZXJpZnlfcG9ydCAgICA9IG11bHRpX3ZlcmlmeV9wb3J0LAotfTsKLQotc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBtdWx0aV9yZWcgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmRyaXZlcl9uYW1lICAgID0gImdvbGRlbF90dWxpcCIsCi0JLmRldl9uYW1lICAgICAgID0gInR0eU1QIiwKLQkubWFqb3IgICAgICAgICAgPSBTQl9UVFlfTVBfTUFKT1IsCi0JLm1pbm9yICAgICAgICAgID0gMCwKLQkubnIgICAgICAgICAgICAgPSBNQVhfTVBfUE9SVCwgCi0JLmNvbnMgICAgICAgICAgID0gTlVMTCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBtdWx0aV9pbml0X3BvcnRzKHZvaWQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQ7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JaW50IGksaixrOwotCXVuc2lnbmVkIGNoYXIgb3NjOwotCXVuc2lnbmVkIGNoYXIgYl9yZXQgPSAwOwotCXN0YXRpYyBzdHJ1Y3QgbXBfZGV2aWNlX3QgKnNiZGV2OyAKLQotCWlmICghZmlyc3QpCi0JCXJldHVybjsKLQlmaXJzdCA9IDA7Ci0KLQltdHB0ID0gbXVsdGlfcG9ydHM7IAotCi0JZm9yIChrPTA7azxOUl9CT0FSRDtrKyspCi0JewotCQlzYmRldiA9ICZtcF9kZXZzW2tdOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzYmRldi0+bnJfcG9ydHM7IGkrKywgbXRwdCsrKSAKLQkJewotCQkJbXRwdC0+ZGV2aWNlIAkJPSBzYmRldjsKLQkJCW10cHQtPnBvcnQuaW9iYXNlICAgPSBzYmRldi0+dWFydF9hY2Nlc3NfYWRkciArIDgqaTsKLQkJCW10cHQtPnBvcnQuaXJxICAgICAgPSBzYmRldi0+aXJxOwotCQkJaWYgKCAoKHNiZGV2LT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9NUDQpJiYoc2JkZXYtPnJldmlzaW9uPT0weDkxKSkpCi0JCQkJbXRwdC0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyID0gc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIDB4MDggKyBpOwotCQkJZWxzZSBpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JCQkJbXRwdC0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyID0gc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIDB4MDggKyAoaSAmIDB4MSk7Ci0JCQllbHNlCi0JCQkJbXRwdC0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyID0gc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIDB4MDggKyBpLzg7Ci0KLQkJCW10cHQtPm9wdGlvbl9iYXNlX2FkZHIgPSBzYmRldi0+b3B0aW9uX3JlZ19hZGRyOwotCi0JCQltdHB0LT5wb2xsX3R5cGUgPSBzYmRldi0+cG9sbF90eXBlOwotCi0JCQltdHB0LT5wb3J0LnVhcnRjbGsgID0gQkFTRV9CQVVEICogMTY7Ci0KLQkJCS8qIGdldCBpbnB1dCBjbG9jayBpbmZvcm1hdGlvbiAqLwotCQkJb3NjID0gaW5iKHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyBNUF9PUFRSX0RJUjAgKyBpLzgpICYgMHgwRjsKLQkJCWlmIChvc2M9PTB4MGYpCi0JCQkJb3NjID0gMDsKLQkJCWZvcihqPTA7ajxvc2M7aisrKQotCQkJCW10cHQtPnBvcnQudWFydGNsayAqPSAyOwotCQkJbXRwdC0+cG9ydC5mbGFncyAgICB8PSBTVERfQ09NX0ZMQUdTIHwgVVBGX1NIQVJFX0lSUSA7Ci0JCQltdHB0LT5wb3J0LmlvdHlwZSAgID0gVVBJT19QT1JUOwotCQkJbXRwdC0+cG9ydC5vcHMgICAgICA9ICZtdWx0aV9wb3BzOwotCi0JCQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JCQl7Ci0JCQkJLyogZm9yIFNCMTZDMTA1M0FQQ0kgKi8KLQkJCQliX3JldCA9IHNiMTA1M2FfZ2V0X2ludGVyZmFjZShtdHB0LCBpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQliX3JldCA9IHJlYWRfb3B0aW9uX3JlZ2lzdGVyKG10cHQsKE1QX09QVFJfSUlSMCArIGkvOCkpOwotCQkJCXByaW50aygiSUlSX1JFVCA9ICV4XG4iLGJfcmV0KTsKLQkJCX0KLQotCQkJLyogZGVmYXVsdCB0byBSUzIzMiAqLwotCQkJbXRwdC0+aW50ZXJmYWNlID0gUlMyMzI7Ci0JCQlpZiAoSUlSX1JTNDIyID09IChiX3JldCAmIElJUl9UWVBFX01BU0spKQotCQkJCW10cHQtPmludGVyZmFjZSA9IFJTNDIyUFRQOwotCQkJaWYgKElJUl9SUzQ4NSA9PSAoYl9yZXQgJiBJSVJfVFlQRV9NQVNLKSkKLQkJCQltdHB0LT5pbnRlcmZhY2UgPSBSUzQ4NU5FOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXVsdGlfcmVnaXN0ZXJfcG9ydHMoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYpCi17Ci0JaW50IGk7Ci0KLQltdWx0aV9pbml0X3BvcnRzKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgewotCQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9ICZtdWx0aV9wb3J0c1tpXTsKLQotCQltdHB0LT5wb3J0LmxpbmUgPSBpOwotCQltdHB0LT5wb3J0Lm9wcyA9ICZtdWx0aV9wb3BzOwotCQlpbml0X3RpbWVyKCZtdHB0LT50aW1lcik7Ci0JCW10cHQtPnRpbWVyLmZ1bmN0aW9uID0gbXVsdGlfdGltZW91dDsKLQkJbXBfYWRkX29uZV9wb3J0KGRydiwgJm10cHQtPnBvcnQpOwotCX0KLX0KLQotLyoqCi0gKiBwY2lfcmVtYXBfYmFzZSAtIHJlbWFwIEJBUiB2YWx1ZSBvZiBwY2kgZGV2aWNlCi0gKgotICogUEFSQU1FVEVSUwotICogIHBjaWRldiAgLSBwY2lfZGV2IHN0cnVjdHVyZSBhZGRyZXNzCi0gKiAgb2Zmc2V0ICAtIEJBUiBvZmZzZXQgUENJX0JBU0VfQUREUkVTU18wIH4gUENJX0JBU0VfQUREUkVTU180Ci0gKiAgYWRkcmVzcyAtIGFkZHJlc3MgdG8gYmUgY2hhbmdlZCBCQVIgdmFsdWUKLSAqICBzaXplCS0gc2l6ZSBvZiBhZGRyZXNzIHNwYWNlIAotICoKLSAqIFJFVFVSTlMKLSAqICBJZiB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgMC4gT3RoZXJ3aXNlLCBJdCByZXR1cm5zIC0xLgotICovCi1zdGF0aWMgaW50IHBjaV9yZW1hcF9iYXNlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsIAotCQl1bnNpZ25lZCBpbnQgYWRkcmVzcywgdW5zaWduZWQgaW50IHNpemUpIAotewotI2lmIDAKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3Q7Ci0JdW5zaWduZWQgaW5kZXggPSAob2Zmc2V0IC0gMHgxMCkgPj4gMjsKLSNlbmRpZgotCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIG9mZnNldCwgYWRkcmVzcyk7Ci0jaWYgMAotCXJvb3QgPSBwY2lkZXYtPnJlc291cmNlW2luZGV4XS5wYXJlbnQ7Ci0JcmVsZWFzZV9yZXNvdXJjZSgmcGNpZGV2LT5yZXNvdXJjZVtpbmRleF0pOwotCWFkZHJlc3MgJj0gfjB4MTsKLQlwY2lkZXYtPnJlc291cmNlW2luZGV4XS5zdGFydCA9IGFkZHJlc3M7Ci0JcGNpZGV2LT5yZXNvdXJjZVtpbmRleF0uZW5kCSAgPSBhZGRyZXNzICsgc2l6ZSAtIDE7Ci0KLQlpZiAocmVxdWVzdF9yZXNvdXJjZShyb290LCAmcGNpZGV2LT5yZXNvdXJjZVtpbmRleF0pICE9IE5VTEwpCi0JewotCQlwcmludGsoS0VSTl9FUlIgInBjaSByZW1hcCBjb25mbGljdCEhIDB4JXhcbiIsIGFkZHJlc3MpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9tcF9kZXYoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgbXBwY2licmRfdCBicmQpCi17Ci0Jc3RhdGljIHN0cnVjdCBtcF9kZXZpY2VfdCAqc2JkZXYgPSBtcF9kZXZzOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7Ci0JaW50IGo7Ci0Jc3RydWN0IHJlc291cmNlICpyZXQgPSBOVUxMOwotCi0Jc2JkZXYtPmRldmljZV9pZCA9IGJyZC5kZXZpY2VfaWQ7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICYoc2JkZXYtPnJldmlzaW9uKSk7Ci0Jc2JkZXYtPm5hbWUgPSBicmQubmFtZTsKLQlzYmRldi0+dWFydF9hY2Nlc3NfYWRkciA9IHBjaWRldi0+cmVzb3VyY2VbMF0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0KLQkvKiBjaGVjayByZXZpc2lvbi4gVGhlIFNCMTZDMTA1M0FQQ0kncyBvcHRpb24gaS9vIGFkZHJlc3MgaXMgQkFSNCAqLwotCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQl7Ci0JCS8qIFNCMTZDMTA1M0FQQ0kgKi8KLQkJc2JkZXYtPm9wdGlvbl9yZWdfYWRkciA9IHBjaWRldi0+cmVzb3VyY2VbNF0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JfQotCWVsc2UKLQl7Ci0JCXNiZGV2LT5vcHRpb25fcmVnX2FkZHIgPSBwY2lkZXYtPnJlc291cmNlWzFdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCX0KLSNpZiAxCQotCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQl7Ci0JCW91dGIoMHgwMCwgc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIE1QX09QVFJfR1BPQ1IpOwotCQlpbmIoc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIE1QX09QVFJfR1BPQ1IpOwotCQlvdXRiKDB4ODMsIHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyBNUF9PUFRSX0dQT0NSKTsKLQl9Ci0jZW5kaWYKLQotCXNiZGV2LT5pcnEgPSBwY2lkZXYtPmlycTsKLQotCWlmICgoYnJkLmRldmljZV9pZCAmIDB4MDgwMCkgfHwgIShicmQuZGV2aWNlX2lkICYweGZmMDApKQotCXsKLQkJc2JkZXYtPnBvbGxfdHlwZSA9IFRZUEVfSU5URVJSVVBUOwotCX0KLQllbHNlCi0JewotCQlzYmRldi0+cG9sbF90eXBlID0gVFlQRV9QT0xMOwotCX0KLQotCS8qIGNvZGVzIHdoaWNoIGlzIHNwZWNpZmljIHRvIGVhY2ggYm9hcmQqLwotCXN3aXRjaChicmQuZGV2aWNlX2lkKXsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QMSA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVAxIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDFFIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDEgOgotCQkJc2JkZXYtPm5yX3BvcnRzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVAyIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDIgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX0dUX01QMiA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVAyQiA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVAyRSA6Ci0JCQlzYmRldi0+bnJfcG9ydHMgPSAyOwotCi0JCQkvKiBzZXJpYWwgYmFzZSBhZGRyZXNzIHJlbWFwICovCi0JCQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JCQl7Ci0JCQkJaW50IHByZXZfcG9ydF9hZGRyID0gMDsKLQotCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnByZXZfcG9ydF9hZGRyKTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgcHJldl9wb3J0X2FkZHIgKyA4LCA4KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVA0IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QNEEgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QNCA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9HVF9NUDQgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfR1RfTVA0QSA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfR1RfTVA0IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QNE0gOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QNEIgOgotCQkJc2JkZXYtPm5yX3BvcnRzID0gNDsKLQotCQkJaWYoc2JkZXYtPnJldmlzaW9uID09IDB4OTEpewotCQkJCXNiZGV2LT5yZXNlcnZlZF9hZGRyWzBdID0gcGNpZGV2LT5yZXNvdXJjZVswXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQkJCQlvdXRiKDB4MDMgLCBzYmRldi0+cmVzZXJ2ZWRfYWRkclswXSArIDB4MDEpOwotCQkJCW91dGIoMHgwMyAsIHNiZGV2LT5yZXNlcnZlZF9hZGRyWzBdICsgMHgwMik7Ci0JCQkJb3V0YigweDAxICwgc2JkZXYtPnJlc2VydmVkX2FkZHJbMF0gKyAweDIwKTsKLQkJCQlvdXRiKDB4MDAgLCBzYmRldi0+cmVzZXJ2ZWRfYWRkclswXSArIDB4MjEpOwotCQkJCXJlcXVlc3RfcmVnaW9uKHNiZGV2LT5yZXNlcnZlZF9hZGRyWzBdLCAzMiwgc2JkZXYtPm5hbWUpOwotCQkJCXNiZGV2LT51YXJ0X2FjY2Vzc19hZGRyID0gcGNpZGV2LT5yZXNvdXJjZVsxXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQkJCQlzYmRldi0+b3B0aW9uX3JlZ19hZGRyID0gcGNpZGV2LT5yZXNvdXJjZVsyXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQkJCX0KLQotCQkJLyogU0IxNkMxMDUzQVBDSSAqLwotCQkJaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCQkJewotCQkJCWludCBwcmV2X3BvcnRfYWRkciA9IDA7Ci0KLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZwcmV2X3BvcnRfYWRkcik7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsIHByZXZfcG9ydF9hZGRyICsgOCwgOCk7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsIHByZXZfcG9ydF9hZGRyICsgMTYsIDgpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18zLCBwcmV2X3BvcnRfYWRkciArIDI0LCA4KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVA2IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QNkEgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfR1RfTVA2IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0dUX01QNkEgOgotCQkJc2JkZXYtPm5yX3BvcnRzID0gNjsKLQotCQkJLyogU0IxNkMxMDUzQVBDSSAqLwotCQkJaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCQkJewotCQkJCWludCBwcmV2X3BvcnRfYWRkciA9IDA7Ci0KLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZwcmV2X3BvcnRfYWRkcik7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsIHByZXZfcG9ydF9hZGRyICsgOCwgOCk7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsIHByZXZfcG9ydF9hZGRyICsgMTYsIDE2KTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMywgcHJldl9wb3J0X2FkZHIgKyAzMiwgMTYpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDggOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QOCA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9HVF9NUDggOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX0dUX01QOCA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVA4QiA6Ci0JCQlzYmRldi0+bnJfcG9ydHMgPSA4OwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDMyIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDMyIDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0dUX01QMzIgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX0dUX01QMzIgOgotCQkJewotCQkJCWludCBwb3J0bnVtX2hleD0wOwotCQkJCXBvcnRudW1faGV4ID0gaW5iKHNiZGV2LT5vcHRpb25fcmVnX2FkZHIpOwotCQkJCXNiZGV2LT5ucl9wb3J0cyA9ICgocG9ydG51bV9oZXgvMTYpKjEwKSArIChwb3J0bnVtX2hleCAlIDE2KTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmZGVmIENPTkZJR19QQVJQT1JUX1BDCi0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDJTMVAgOgotCQkJc2JkZXYtPm5yX3BvcnRzID0gMjsKLQotCQkJLyogU0IxNkMxMDUzQVBDSSAqLwotCQkJaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCQkJewotCQkJCWludCBwcmV2X3BvcnRfYWRkciA9IDA7Ci0KLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZwcmV2X3BvcnRfYWRkcik7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsIHByZXZfcG9ydF9hZGRyICsgOCwgOCk7Ci0JCQl9Ci0KLQkJCS8qIGFkZCBQQyBjb21wYXRpYmxlIHBhcmFsbGVsIHBvcnQgKi8KLQkJCXBhcnBvcnRfcGNfcHJvYmVfcG9ydChwY2lkZXYtPnJlc291cmNlWzJdLnN0YXJ0LCBwY2lkZXYtPnJlc291cmNlWzNdLnN0YXJ0LCBQQVJQT1JUX0lSUV9OT05FLCBQQVJQT1JUX0RNQV9OT05FLCAmcGNpZGV2LT5kZXYsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDFQIDoKLQkJCS8qIGFkZCBQQyBjb21wYXRpYmxlIHBhcmFsbGVsIHBvcnQgKi8KLQkJCXBhcnBvcnRfcGNfcHJvYmVfcG9ydChwY2lkZXYtPnJlc291cmNlWzJdLnN0YXJ0LCBwY2lkZXYtPnJlc291cmNlWzNdLnN0YXJ0LCBQQVJQT1JUX0lSUV9OT05FLCBQQVJQT1JUX0RNQV9OT05FLCAmcGNpZGV2LT5kZXYsIDApOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQl9Ci0KLQlyZXQgPSByZXF1ZXN0X3JlZ2lvbihzYmRldi0+dWFydF9hY2Nlc3NfYWRkciwgKDgqc2JkZXYtPm5yX3BvcnRzKSwgc2JkZXYtPm5hbWUpOwotCi0JaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCXsKLQkJcmV0ID0gcmVxdWVzdF9yZWdpb24oc2JkZXYtPm9wdGlvbl9yZWdfYWRkciwgMHg0MCwgc2JkZXYtPm5hbWUpOwotCX0KLQllbHNlCi0JewotCQlyZXQgPSByZXF1ZXN0X3JlZ2lvbihzYmRldi0+b3B0aW9uX3JlZ19hZGRyLCAweDIwLCBzYmRldi0+bmFtZSk7Ci0JfQotCi0KLQlOUl9CT0FSRCsrOwotCU5SX1BPUlRTICs9IHNiZGV2LT5ucl9wb3J0czsKLQotCS8qIEVuYWJsZSBQQ0kgaW50ZXJydXB0ICovCi0JYWRkciA9IHNiZGV2LT5vcHRpb25fcmVnX2FkZHIgKyBNUF9PUFRSX0lNUjA7Ci0JZm9yKGo9MDsgaiA8IChzYmRldi0+bnJfcG9ydHMvOCkrMTsgaisrKQotCXsKLQkJaWYgKHNiZGV2LT5wb2xsX3R5cGUgPT0gVFlQRV9JTlRFUlJVUFQpCi0JCXsKLQkJCW91dGIoMHhmZixhZGRyICtqKTsKLQkJfQotCX0KLQlzYmRldisrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG11bHRpX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0LCBpOwotCXN0cnVjdCBwY2lfZGV2ICAqZGV2ID0gTlVMTDsKLQotCWlmKGZjcl9jb3VudD09MCkKLQl7Ci0JCWZvcihpPTA7aTwyNTY7aSsrKQotCQl7Ci0JCQlmY3JfYXJyW2ldID0gMHgwMTsKLQkJCQotCQl9Ci0JfQotCWlmKGRlZXBfY291bnQ9PTApCi0JewotCQlmb3IoaT0wO2k8MjU2O2krKykKLQkJewotCQkJZGVlcFtpXSA9IDE7Ci0JCQkKLQkJfQotCX0KLQlpZihydHJfY291bnQ9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoaT0wO2k8MjU2O2krKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydHJbaV0gPSAweDEwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCWlmKHR0cl9jb3VudD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwyNTY7aSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR0cltpXSA9IDB4Mzg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotcHJpbnRrKCJNVUxUSSBJTklUXG4iKTsKLQlmb3IoIGk9MDsgaTwgbXBfbnJwY2licmRzOyBpKyspCi0JewotCi0JCXdoaWxlKCAoZGV2ID0gcGNpX2dldF9kZXZpY2UobXBfcGNpYm9hcmRzW2ldLnZlbmRvcl9pZCwgbXBfcGNpYm9hcmRzW2ldLmRldmljZV9pZCwgZGV2KSApICkKLQotCQl7Ci1wcmludGsoIkZPVU5Efn5+XG4iKTsKLS8vCUNlbnQgT1MgYnVnIGZpeAotLy8JCQlpZiAobXBfcGNpYm9hcmRzW2ldLmRldmljZV9pZCAmIDB4MDgwMCkKLQkJCXsKLQkJCQlpbnQgc3RhdHVzOwotCSAgICAgICAgCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQkgICAgICAgIAkJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKLSAgICAgICAgICAgIAotCSAgIAkJICAgICAJaWYgKHN0YXR1cyAhPSAwKQotICAgICAgICAJCQl7IAotICAgICAgICAgICAgICAgCQkJCXByaW50aygiTXVsdGlwb3J0IEJvYXJkIEVuYWJsZSBGYWlsICFcblxuIik7Ci0gICAgICAgICAgICAgICAJCQkJc3RhdHVzID0gLUVOWElPOwotICAgICAgICAgICAgICAgIAkJCXJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgIAkJCX0KLQkJCX0KLQotCQkJaW5pdF9tcF9kZXYoZGV2LCBtcF9wY2lib2FyZHNbaV0pOwkKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspCi0JCXNwaW5fbG9ja19pbml0KCZpcnFfbGlzdHNbaV0ubG9jayk7Ci0KLQlyZXQgPSBtcF9yZWdpc3Rlcl9kcml2ZXIoJm11bHRpX3JlZyk7Ci0KLQlpZiAocmV0ID49IDApCi0JCW11bHRpX3JlZ2lzdGVyX3BvcnRzKCZtdWx0aV9yZWcpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG11bHRpX2V4aXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKQotCQltcF9yZW1vdmVfb25lX3BvcnQoJm11bHRpX3JlZywgJm11bHRpX3BvcnRzW2ldLnBvcnQpOwotCi0JbXBfdW5yZWdpc3Rlcl9kcml2ZXIoJm11bHRpX3JlZyk7Ci19Ci0KLW1vZHVsZV9pbml0KG11bHRpX2luaXQpOwotbW9kdWxlX2V4aXQobXVsdGlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiU3lzdGVtQmFzZSBNdWx0aXBvcnQgUENJL1BDSWUgQ09SRSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9wY2lfbXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfcGNpX21wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYWU0YWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9wY2lfbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0KLSNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0KLQotI2RlZmluZSBNUF9URVJNSU9TICBrdGVybWlvcwotCi0jaW5jbHVkZSAic2JfbXBfcmVnaXN0ZXIuaCIKLSNpbmNsdWRlICJzYl9zZXJfY29yZS5oIgotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICAiMS4xIgotI2RlZmluZSBEUklWRVJfREFURSAgICAgIjIwMTIvMDEvMDUiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgICJTWVNURU1CQVNFPHRlY2hAc3lzYmFzLmNvbT4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICAiU3lzdGVtQmFzZSBQQ0kvUENJZSBNdWx0aXBvcnQgQ29yZSIKLQotI2RlZmluZSBTQl9UVFlfTVBfTUFKT1IJCQk1NAotI2RlZmluZSBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVAkJMHgxNEExCi0KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDEJCTB4NGQwMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QMgkJMHg0ZDAyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVA0CQkweDRkMDQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDRBCQkweDRkNTQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDYJCTB4NGQwNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QNkEJCTB4NGQ1NgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QOAkJMHg0ZDA4Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVAzMgkJMHg0ZDMyCi0vKiBQYXJhbGxlbCBwb3J0ICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVAxUAkJMHg0MzAxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVAyUzFQCQkweDQzMDMKLQotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDEJCTB4NDUwMQotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDIJCTB4NDUwMgotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDQJCTB4NDUwNAotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDgJCTB4NDUwOAotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDMyCQkweDQ1MzIKLQotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDFFCQkweDRlMDEKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVAyRQkJMHg0ZTAyCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QMkIJCTB4NGIwMgotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDRCCQkweDRiMDQKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVA4QgkJMHg0YjA4Ci0KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HVF9NUDQJCTB4MDAwNAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dUX01QNEEJCTB4MDA1NAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dUX01QNgkJMHgwMDA2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfR1RfTVA2QQkJMHgwMDU2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfR1RfTVA4CQkweDAwMDgKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HVF9NUDMyCQkweDAwMzIKLQotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDEJCTB4MTUwMQotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDIJCTB4MTUwMgotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDQJCTB4MTUwNAotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDgJCTB4MTUwOAotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDMyCQkweDE1MzIKLQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QNE0JCTB4NDYwNCAgLy9tb2RlbQotCi0jZGVmaW5lIE1BWF9NUF9ERVYgIDgKLSNkZWZpbmUgQkRfTUFYX1BPUlQgMzIgCS8qIE1heCBzZXJpYWwgcG9ydCBpbiBvbmUgYm9hcmQgKi8KLSNkZWZpbmUgTUFYX01QX1BPUlQgMjU2IC8qIE1heCBzZXJpYWwgcG9ydCBpbiBvbmUgUEMgKi8KLQotI2RlZmluZSBQT1JUXzE2QzEwNVhBCTMKLSNkZWZpbmUgUE9SVF8xNkMxMDVYCTIKLSNkZWZpbmUgUE9SVF8xNkM1NVgJCTEKLQotI2RlZmluZSBFTkFCTEUJCTEKLSNkZWZpbmUgRElTQUJMRQkJMAotCi0vKiBpb2N0bHMgKi8KLSNkZWZpbmUgVElPQ0dOVU1PRlBPUlQJCTB4NTQ1RgotI2RlZmluZSBUSU9DU01VTFRJRUNITwkJMHg1NDQwCi0jZGVmaW5lIFRJT0NTUFRQTk9FQ0hPCQkweDU0NDEKLQotI2RlZmluZSBUSU9DR09QVElPTlJFRwkJMHg1NDYxCi0jZGVmaW5lIFRJT0NHRElTQUJMRUlSUQkJMHg1NDYyCi0jZGVmaW5lIFRJT0NHRU5BQkxFSVJRCQkweDU0NjMKLSNkZWZpbmUgVElPQ0dTT0ZUUkVTRVQJCTB4NTQ2NAotI2RlZmluZSBUSU9DR1NPRlRSRVNFVFIJCTB4NTQ2NQotI2RlZmluZSBUSU9DR1JFR0lORk8JCTB4NTQ2NgotI2RlZmluZSBUSU9DR0dFVExTUgkJMHg1NDY3Ci0jZGVmaW5lIFRJT0NHR0VUREVWSUQJCTB4NTQ2OAotI2RlZmluZSBUSU9DR0dFVEJETk8JCTB4NTQ2OQotI2RlZmluZSBUSU9DR0dFVElOVEVSRkFDRQkweDU0NkEKLSNkZWZpbmUgVElPQ0dHRVRSRVYJCTB4NTQ2QgotI2RlZmluZSBUSU9DR0dFVE5SUE9SVFMJCTB4NTQ2QwotI2RlZmluZSBUSU9DR0dFVFBPUlRUWVBFCTB4NTQ2RAotI2RlZmluZSBHRVRERUVQRklGTwkJMHg1NEFBCi0jZGVmaW5lIFNFVERFRVBGSUZPCQkweDU0QUIKLSNkZWZpbmUgU0VURkNSCQkJMHg1NEJBCi0jZGVmaW5lIFNFVFRUUgkJCTB4NTRCMQotI2RlZmluZSBTRVRSVFIJCQkweDU0QjIKLSNkZWZpbmUgR0VUVFRSCQkJMHg1NEIzCi0jZGVmaW5lIEdFVFJUUgkJCTB4NTRCNAotCi0vKiBtdWx0aS1kcm9wIG1vZGUgcmVsYXRlZCBpb2N0bCBjb21tYW5kcyAqLwotI2RlZmluZSBUSU9DU01VTFRJRFJPUAkJMHg1NDcwCi0jZGVmaW5lIFRJT0NTTURBRERSICAgCQkweDU0NzEKLSNkZWZpbmUgVElPQ0dNREFERFIgICAJCTB4NTQ3MgotI2RlZmluZSBUSU9DU0VOREFERFIJCTB4NTQ3MwotCi0KLS8qIHNlcmlhbCBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgUlMyMzIJCTEgCi0jZGVmaW5lIFJTNDIyUFRQCTIKLSNkZWZpbmUgUlM0MjJNRAkJMwotI2RlZmluZSBSUzQ4NU5FCQk0Ci0jZGVmaW5lIFJTNDg1RUNITwk1Ci0KLSNkZWZpbmUgc2VyaWFsX2lucCh1cCwgb2Zmc2V0KSAgICAgIHNlcmlhbF9pbih1cCwgb2Zmc2V0KQotI2RlZmluZSBzZXJpYWxfb3V0cCh1cCwgb2Zmc2V0LCB2YWx1ZSkgIHNlcmlhbF9vdXQodXAsIG9mZnNldCwgdmFsdWUpCi0JCi0jZGVmaW5lIFBBU1NfTElNSVQgIDI1NgotI2RlZmluZSBpc19yZWFsX2ludGVycnVwdChpcnEpICAoKGlycSkgIT0gMCkKLQotI2RlZmluZSBQUk9CRV9BTlkgICAofjApCi0KLXN0YXRpYyBERUZJTkVfTVVURVgobXBfbXV0ZXgpOwotI2RlZmluZSBNUF9NVVRFWF9MT0NLKHgpIG11dGV4X2xvY2soJih4KSkgCi0jZGVmaW5lIE1QX01VVEVYX1VOTE9DSyh4KSBtdXRleF91bmxvY2soJih4KSkgCi0jZGVmaW5lIE1QX1NUQVRFX0xPQ0soeCkgbXV0ZXhfbG9jaygmKCh4KS0+bXV0ZXgpKSAKLSNkZWZpbmUgTVBfU1RBVEVfVU5MT0NLKHgpIG11dGV4X3VubG9jaygmKCh4KS0+bXV0ZXgpKSAKLSAgICAgICAgCi0KLSNkZWZpbmUgVUFSVF9MU1JfU1BFQ0lBTCAgICAweDFFCi0gICAgICAgIAotI2RlZmluZSBISUdIX0JJVFNfT0ZGU0VUICAgICAgICAoKHNpemVvZihsb25nKS1zaXplb2YoaW50KSkqOCkKLSNkZWZpbmUgdWFydF91c2VycyhzdGF0ZSkgICAgICAgKChzdGF0ZSktPmNvdW50ICsgKChzdGF0ZSktPmluZm8gPyAoc3RhdGUpLT5pbmZvLT5ibG9ja2VkX29wZW4gOiAwKSkKLQotCi0vLyNkZWZpbmUgTVBfREVCVUcgMQotI3VuZGVmIE1QX0RFQlVHCi0KLSNpZmRlZiBNUF9ERUJVRwotI2RlZmluZSBEUFJJTlRLKHguLi4pICAgcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZSBEUFJJTlRLKHguLi4pICAgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBNUF9ERUJVRwotI2RlZmluZSBERUJVR19BVVRPQ09ORihmbXQuLi4pICBwcmludGsoZm10KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQVVUT0NPTkYoZm10Li4uKSAgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBNUF9ERUJVRwotI2RlZmluZSBERUJVR19JTlRSKGZtdC4uLikgIHByaW50ayhmbXQpCi0jZWxzZQotI2RlZmluZSBERUJVR19JTlRSKGZtdC4uLikgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfTTQ4NikKLSNkZWZpbmUgU0VSSUFMX0lOTElORQotI2VuZGlmCi0jaWZkZWYgU0VSSUFMX0lOTElORQotI2RlZmluZSBfSU5MSU5FXyBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIF9JTkxJTkVfCi0jZW5kaWYKLQotI2RlZmluZSBUWVBFX1BPTEwJMQotI2RlZmluZSBUWVBFX0lOVEVSUlVQVAkyCi0KLQotc3RydWN0IG1wX2RldmljZV90IHsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIGRldmljZV9pZDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHJldmlzaW9uOwotICAgICAgICBjaGFyICAgICAgICAgICAgKm5hbWU7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICB1YXJ0X2FjY2Vzc19hZGRyOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgb3B0aW9uX3JlZ19hZGRyOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgcmVzZXJ2ZWRfYWRkcls0XTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGlycTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG5yX3BvcnRzOwotICAgICAgICBpbnQgICAgICAgICAgICAgcG9sbF90eXBlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbXBwY2licmQgewotICAgICAgICBjaGFyICAgICAgICAgICAgKm5hbWU7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICB2ZW5kb3JfaWQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICBkZXZpY2VfaWQ7Ci19IG1wcGNpYnJkX3Q7Ci0KLXN0YXRpYyBtcHBjaWJyZF90IG1wX3BjaWJvYXJkc1tdID0gewotCi0gICAgICAgIHsgIk11bHRpLTEgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QMX0gLAotICAgICAgICB7ICJNdWx0aS0yIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDJ9ICwKLSAgICAgICAgeyAiTXVsdGktNCBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVA0fSAsCi0gICAgICAgIHsgIk11bHRpLTQgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QNEF9ICwKLSAgICAgICAgeyAiTXVsdGktNiBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVA2fSAsCi0gICAgICAgIHsgIk11bHRpLTYgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QNkF9ICwKLSAgICAgICAgeyAiTXVsdGktOCBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVA4fSAsCi0gICAgICAgIHsgIk11bHRpLTMyIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDMyfSAsCi0KLSAgICAgICAgeyAiTXVsdGktMVAgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QMVB9ICwKLSAgICAgICAgeyAiTXVsdGktMlMxUCBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVAyUzFQfSAsCi0KLSAgICAgICAgeyAiTXVsdGktNChHVCkgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX0dUX01QNH0gLAotICAgICAgICB7ICJNdWx0aS00KEdUKSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfR1RfTVA0QX0gLAotICAgICAgICB7ICJNdWx0aS02KEdUKSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfR1RfTVA2fSAsCi0gICAgICAgIHsgIk11bHRpLTYoR1QpIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9HVF9NUDZBfSAsCi0gICAgICAgIHsgIk11bHRpLTgoR1QpIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9HVF9NUDh9ICwKLSAgICAgICAgeyAiTXVsdGktMzIoR1QpIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9HVF9NUDMyfSAsCi0KLSAgICAgICAgeyAiTXVsdGktMSBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDF9ICwKLSAgICAgICAgeyAiTXVsdGktMiBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDJ9ICwKLSAgICAgICAgeyAiTXVsdGktNCBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDR9ICwKLSAgICAgICAgeyAiTXVsdGktOCBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDh9ICwKLSAgICAgICAgeyAiTXVsdGktMzIgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfTVAzMn0gLAotCi0gICAgICAgIHsgIk11bHRpLTEgUENJZSBFIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDFFfSAsCi0gICAgICAgIHsgIk11bHRpLTIgUENJZSBFIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDJFfSAsCi0gICAgICAgIHsgIk11bHRpLTIgUENJZSBCIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDJCfSAsCi0gICAgICAgIHsgIk11bHRpLTQgUENJZSBCIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDRCfSAsCi0gICAgICAgIHsgIk11bHRpLTggUENJZSBCIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDhCfSAsCi0KLSAgICAgICAgeyAiTXVsdGktMShHVCkgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfR1RfTVAxfSAsCi0gICAgICAgIHsgIk11bHRpLTIoR1QpIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX0dUX01QMn0gLAotICAgICAgICB7ICJNdWx0aS00KEdUKSBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9HVF9NUDR9ICwKLSAgICAgICAgeyAiTXVsdGktOChHVCkgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfR1RfTVA4fSAsCi0gICAgICAgIHsgIk11bHRpLTMyKEdUKSBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9HVF9NUDMyfSAsCi0KLSAgICAgICAgeyAiTXVsdGktNE0gUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QNE19ICwKLX07Ci0KLXN0cnVjdCBtcF9wb3J0IHsKLSAgICAgICAgc3RydWN0IHNiX3VhcnRfcG9ydCBwb3J0OwotCi0gICAgICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgdGltZXI7ICAgICAgLyogIm5vIGlycSIgdGltZXIgKi8KLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAgICBsaXN0OyAgICAgICAvKiBwb3J0cyBvbiB0aGlzIElSUSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgIGNhcGFiaWxpdGllczsgICAvKiBwb3J0IGNhcGFiaWxpdGllcyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHJldjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBhY3I7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgaWVyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIGxjcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBtY3I7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbWNyX21hc2s7ICAgLyogbWFzayBvZiB1c2VyIGJpdHMgKi8KLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBtY3JfZm9yY2U7ICAvKiBtYXNrIG9mIGZvcmNlZCBiaXRzICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbHNyX2JyZWFrX2ZsYWc7Ci0KLSAgICAgICAgdm9pZCAgICAgICAgICAgICgqcG0pKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RhdGUsIHVuc2lnbmVkIGludCBvbGQpOwotICAgICAgICBzdHJ1Y3QgbXBfZGV2aWNlX3QgKmRldmljZTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgIGludGVyZmFjZV9jb25maWdfYWRkcjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9wdGlvbl9iYXNlX2FkZHI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBpbnRlcmZhY2U7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBwb2xsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgaXJxX2luZm8gewotICAgICAgICBzcGlubG9ja190ICAgICAgbG9jazsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAgICAqaGVhZDsKLX07Ci0KLXN0cnVjdCBzYjEwNXhfdWFydF9jb25maWcgewotCWNoYXIgICAgKm5hbWU7Ci0JaW50ICAgICBkZmxfeG1pdF9maWZvX3NpemU7Ci0JaW50ICAgICBmbGFnczsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2IxMDV4X3VhcnRfY29uZmlnIHVhcnRfY29uZmlnW10gPSB7Ci0gICAgICAgIHsgInVua25vd24iLCAgICAxLCAgMCB9LAotICAgICAgICB7ICIxNjU1MEEiLCAxNiwgVUFSVF9DTEVBUl9GSUZPIHwgVUFSVF9VU0VfRklGTyB9LAotICAgICAgICB7ICJTQjE2QzEwNTAiLCAgICAxMjgsICAgIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk8gfCBVQVJUX1NUQVJURUNIIH0sCi0gICAgICAgIHsgIlNCMTZDMTA1MEEiLCAgICAxMjgsICAgIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk8gfCBVQVJUX1NUQVJURUNIIH0sCi19OwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9zZXJfY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9zZXJfY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGZiOTkxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2Jfc2VyX2NvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jZGVmaW5lIFVBUlRfQ09ORklHX1RZUEUJKDEgPDwgMCkKLSNkZWZpbmUgVUFSVF9DT05GSUdfSVJRCQkoMSA8PCAxKQotI2RlZmluZSBVUElPX1BPUlQJCSgwKQotI2RlZmluZSBVUElPX0hVQjYJCSgxKQotI2RlZmluZSBVUElPX01FTQkJKDIpCi0jZGVmaW5lIFVQSU9fTUVNMzIJCSgzKQotI2RlZmluZSBVUElPX0FVCQkJKDQpCQkJLyogQXUxeDAwIHR5cGUgSU8gKi8KLSNkZWZpbmUgVVBJT19UU0kJCSg1KQkJCS8qIFRzaTEwOC8xMDkgdHlwZSBJTyAqLwotI2RlZmluZSBVUEZfRk9VUlBPUlQJCSgxIDw8IDEpCi0jZGVmaW5lIFVQRl9TQUsJCQkoMSA8PCAyKQotI2RlZmluZSBVUEZfU1BEX01BU0sJCSgweDEwMzApCi0jZGVmaW5lIFVQRl9TUERfSEkJCSgweDAwMTApCi0jZGVmaW5lIFVQRl9TUERfVkhJCQkoMHgwMDIwKQotI2RlZmluZSBVUEZfU1BEX0NVU1QJCSgweDAwMzApCi0jZGVmaW5lIFVQRl9TUERfU0hJCQkoMHgxMDAwKQotI2RlZmluZSBVUEZfU1BEX1dBUlAJCSgweDEwMTApCi0jZGVmaW5lIFVQRl9TS0lQX1RFU1QJCSgxIDw8IDYpCi0jZGVmaW5lIFVQRl9BVVRPX0lSUQkJKDEgPDwgNykKLSNkZWZpbmUgVVBGX0hBUkRQUFNfQ0QJCSgxIDw8IDExKQotI2RlZmluZSBVUEZfTE9XX0xBVEVOQ1kJCSgxIDw8IDEzKQotI2RlZmluZSBVUEZfQlVHR1lfVUFSVAkJKDEgPDwgMTQpCi0jZGVmaW5lIFVQRl9NQUdJQ19NVUxUSVBMSUVSCSgxIDw8IDE2KQotI2RlZmluZSBVUEZfQ09OU19GTE9XCQkoMSA8PCAyMykKLSNkZWZpbmUgVVBGX1NIQVJFX0lSUQkJKDEgPDwgMjQpCi0jZGVmaW5lIFVQRl9CT09UX0FVVE9DT05GCSgxIDw8IDI4KQotI2RlZmluZSBVUEZfREVBRAkJKDEgPDwgMzApCi0jZGVmaW5lIFVQRl9JT1JFTUFQCQkoMSA8PCAzMSkKLSNkZWZpbmUgVVBGX0NIQU5HRV9NQVNLCQkoMHgxN2ZmZikKLSNkZWZpbmUgVVBGX1VTUl9NQVNLCQkoVVBGX1NQRF9NQVNLfFVQRl9MT1dfTEFURU5DWSkKLSNkZWZpbmUgVVNGX0NMT1NJTkdfV0FJVF9JTkYJKDApCi0jZGVmaW5lIFVTRl9DTE9TSU5HX1dBSVRfTk9ORQkofjBVKQotCi0jZGVmaW5lIFVBUlRfWE1JVF9TSVpFCVBBR0VfU0laRQotCi0jZGVmaW5lIFVJRl9DSEVDS19DRAkJKDEgPDwgMjUpCi0jZGVmaW5lIFVJRl9DVFNfRkxPVwkJKDEgPDwgMjYpCi0jZGVmaW5lIFVJRl9OT1JNQUxfQUNUSVZFCSgxIDw8IDI5KQotI2RlZmluZSBVSUZfSU5JVElBTElaRUQJCSgxIDw8IDMxKQotI2RlZmluZSBVSUZfU1VTUEVOREVECQkoMSA8PCAzMCkKLQotI2RlZmluZSBXQUtFVVBfQ0hBUlMJCTI1NgotCi0jZGVmaW5lIHVhcnRfY2lyY19lbXB0eShjaXJjKQkJKChjaXJjKS0+aGVhZCA9PSAoY2lyYyktPnRhaWwpCi0jZGVmaW5lIHVhcnRfY2lyY19jbGVhcihjaXJjKQkJKChjaXJjKS0+aGVhZCA9IChjaXJjKS0+dGFpbCA9IDApCi0KLSNkZWZpbmUgdWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoY2lyYykJXAotCShDSVJDX0NOVCgoY2lyYyktPmhlYWQsIChjaXJjKS0+dGFpbCwgVUFSVF9YTUlUX1NJWkUpKQotCi0jZGVmaW5lIHVhcnRfY2lyY19jaGFyc19mcmVlKGNpcmMpCVwKLQkoQ0lSQ19TUEFDRSgoY2lyYyktPmhlYWQsIChjaXJjKS0+dGFpbCwgVUFSVF9YTUlUX1NJWkUpKQotCi0jZGVmaW5lIHVhcnRfdHhfc3RvcHBlZChwb3J0KQkJXAotCSgocG9ydCktPmluZm8tPnR0eS0+c3RvcHBlZCB8fCAocG9ydCktPmluZm8tPnR0eS0+aHdfc3RvcHBlZCkKLQotI2RlZmluZSBVQVJUX0VOQUJMRV9NUyhwb3J0LGNmbGFnKQkoKHBvcnQpLT5mbGFncyAmIFVQRl9IQVJEUFBTX0NEIHx8IFwKLQkJCQkJIChjZmxhZykgJiBDUlRTQ1RTIHx8IFwKLQkJCQkJICEoKGNmbGFnKSAmIENMT0NBTCkpCi0KLQotc3RydWN0IHNiX3VhcnRfcG9ydDsKLXN0cnVjdCBzYl91YXJ0X2luZm87Ci1zdHJ1Y3Qgc2VyaWFsX3N0cnVjdDsKLXN0cnVjdCBkZXZpY2U7Ci0KLXN0cnVjdCBzYl91YXJ0X29wcyB7Ci0JdW5zaWduZWQgaW50CSgqdHhfZW1wdHkpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpzZXRfbWN0cmwpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50IG1jdHJsKTsKLQl1bnNpZ25lZCBpbnQJKCpnZXRfbWN0cmwpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpzdG9wX3R4KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqc3RhcnRfdHgpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpzZW5kX3hjaGFyKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIGNoYXIgY2gpOwotCXZvaWQJCSgqc3RvcF9yeCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKmVuYWJsZV9tcykoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKmJyZWFrX2N0bCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCBpbnQgY3RsKTsKLQlpbnQJCSgqc3RhcnR1cCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnNodXRkb3duKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqc2V0X3Rlcm1pb3MpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgc3RydWN0IE1QX1RFUk1JT1MgKm5ldywKLQkJCQkgICAgICAgc3RydWN0IE1QX1RFUk1JT1MgKm9sZCk7Ci0Jdm9pZAkJKCpwbSkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQgc3RhdGUsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgb2xkc3RhdGUpOwotCWludAkJKCpzZXRfd2FrZSkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQgc3RhdGUpOwotCi0JY29uc3QgY2hhciAqKCp0eXBlKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCi0Jdm9pZAkJKCpyZWxlYXNlX3BvcnQpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0KLQlpbnQJCSgqcmVxdWVzdF9wb3J0KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqY29uZmlnX3BvcnQpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgaW50KTsKLQlpbnQJCSgqdmVyaWZ5X3BvcnQpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKik7Ci0JaW50CQkoKmlvY3RsKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci19OwotCi0KLXN0cnVjdCBzYl91YXJ0X2ljb3VudCB7Ci0JX191MzIJY3RzOwotCV9fdTMyCWRzcjsKLQlfX3UzMglybmc7Ci0JX191MzIJZGNkOwotCV9fdTMyCXJ4OwotCV9fdTMyCXR4OwotCV9fdTMyCWZyYW1lOwotCV9fdTMyCW92ZXJydW47Ci0JX191MzIJcGFyaXR5OwotCV9fdTMyCWJyazsKLQlfX3UzMglidWZfb3ZlcnJ1bjsKLX07Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgdXBmX3Q7Ci0KLXN0cnVjdCBzYl91YXJ0X3BvcnQgewotCXNwaW5sb2NrX3QJCWxvY2s7CQkJLyogcG9ydCBsb2NrICovCi0JdW5zaWduZWQgaW50CQlpb2Jhc2U7CQkJLyogaW4vb3V0W2J3bF0gKi8KLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0JKm1lbWJhc2U7CQkvKiByZWFkL3dyaXRlW2J3bF0gKi8KLQl1bnNpZ25lZCBpbnQJCWlycTsJCQkvKiBpcnEgbnVtYmVyICovCi0JdW5zaWduZWQgaW50CQl1YXJ0Y2xrOwkJLyogYmFzZSB1YXJ0IGNsb2NrICovCi0JdW5zaWduZWQgaW50CQlmaWZvc2l6ZTsJCS8qIHR4IGZpZm8gc2l6ZSAqLwotCXVuc2lnbmVkIGNoYXIJCXhfY2hhcjsJCQkvKiB4b24veG9mZiBjaGFyICovCi0JdW5zaWduZWQgY2hhcgkJcmVnc2hpZnQ7CQkvKiByZWcgb2Zmc2V0IHNoaWZ0ICovCi0JdW5zaWduZWQgY2hhcgkJaW90eXBlOwkJCS8qIGlvIGFjY2VzcyBzdHlsZSAqLwotCXVuc2lnbmVkIGNoYXIJCXVudXNlZDE7Ci0KLQotCXVuc2lnbmVkIGludAkJcmVhZF9zdGF0dXNfbWFzazsJLyogZHJpdmVyIHNwZWNpZmljICovCi0JdW5zaWduZWQgaW50CQlpZ25vcmVfc3RhdHVzX21hc2s7CS8qIGRyaXZlciBzcGVjaWZpYyAqLwotCXN0cnVjdCBzYl91YXJ0X2luZm8JKmluZm87CQkJLyogcG9pbnRlciB0byBwYXJlbnQgaW5mbyAqLwotCXN0cnVjdCBzYl91YXJ0X2ljb3VudAlpY291bnQ7CQkJLyogc3RhdGlzdGljcyAqLwotCi0Jc3RydWN0IGNvbnNvbGUJCSpjb25zOwkJCS8qIHN0cnVjdCBjb25zb2xlLCBpZiBhbnkgKi8KLSNpZmRlZiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRQotCXVuc2lnbmVkIGxvbmcJCXN5c3JxOwkJCS8qIHN5c3JxIHRpbWVvdXQgKi8KLSNlbmRpZgotCi0JdXBmX3QJCQlmbGFnczsKLQotCXVuc2lnbmVkIGludAkJbWN0cmw7CQkJLyogY3VycmVudCBtb2RlbSBjdHJsIHNldHRpbmdzICovCi0JdW5zaWduZWQgaW50CQl0aW1lb3V0OwkJLyogY2hhcmFjdGVyLWJhc2VkIHRpbWVvdXQgKi8KLQl1bnNpZ25lZCBpbnQJCXR5cGU7CQkJLyogcG9ydCB0eXBlICovCi0JY29uc3Qgc3RydWN0IHNiX3VhcnRfb3BzCSpvcHM7Ci0JdW5zaWduZWQgaW50CQljdXN0b21fZGl2aXNvcjsKLQl1bnNpZ25lZCBpbnQJCWxpbmU7CQkJLyogcG9ydCBpbmRleCAqLwotCXVuc2lnbmVkIGxvbmcJCW1hcGJhc2U7CQkvKiBmb3IgaW9yZW1hcCAqLwotCXN0cnVjdCBkZXZpY2UJCSpkZXY7CQkJLyogcGFyZW50IGRldmljZSAqLwotCXVuc2lnbmVkIGNoYXIJCWh1YjY7CQkJLyogdGhpcyBzaG91bGQgYmUgaW4gdGhlIDgyNTAgZHJpdmVyICovCi0JdW5zaWduZWQgY2hhcgkJdW51c2VkWzNdOwotfTsKLQotI2RlZmluZSBtZG1vZGUJCQl1bnVzZWRbMl0KLSNkZWZpbmUgTURNT0RFX0FERFIJCTB4MQotI2RlZmluZSBNRE1PREVfRU5BQkxFCTB4MgotI2RlZmluZSBNRE1PREVfQVVUTwkJMHg0Ci0jZGVmaW5lIE1ETU9ERV9BRERSU0VORAkweDgKLQotc3RydWN0IHNiX3VhcnRfc3RhdGUgewotCXVuc2lnbmVkIGludAkJY2xvc2VfZGVsYXk7CQkvKiBtc2VjICovCi0JdW5zaWduZWQgaW50CQljbG9zaW5nX3dhaXQ7CQkvKiBtc2VjICovCi0KLQotCWludAkJCWNvdW50OwotCWludAkJCXBtX3N0YXRlOwotCXN0cnVjdCBzYl91YXJ0X2luZm8JKmluZm87Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydAkqcG9ydDsKLQotCXN0cnVjdCBtdXRleAkJbXV0ZXg7Ci19OwotCi10eXBlZGVmIHVuc2lnbmVkIGludCAgdWlmX3Q7Ci0KLXN0cnVjdCBzYl91YXJ0X2luZm8gewotCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7Ci0Jc3RydWN0IGNpcmNfYnVmCQl4bWl0OwotCXVpZl90CQkJZmxhZ3M7Ci0KLQlpbnQJCQlibG9ja2VkX29wZW47Ci0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGxldDsKLQotCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdAlkZWx0YV9tc3Jfd2FpdDsKLX07Ci0KLQotc3RydWN0IG1vZHVsZTsKLXN0cnVjdCB0dHlfZHJpdmVyOwotCi1zdHJ1Y3QgdWFydF9kcml2ZXIgewotCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKLQljb25zdCBjaGFyCQkqZHJpdmVyX25hbWU7Ci0JY29uc3QgY2hhcgkJKmRldl9uYW1lOwotCWludAkJCSBtYWpvcjsKLQlpbnQJCQkgbWlub3I7Ci0JaW50CQkJIG5yOwotCXN0cnVjdCBjb25zb2xlCQkqY29uczsKLQotCXN0cnVjdCBzYl91YXJ0X3N0YXRlCSpzdGF0ZTsKLSAgICAgICAgc3RydWN0IHR0eV9kcml2ZXIgICAgICAgICAgICAgICAqdHR5X2RyaXZlcjsKLX07Ci0KLXZvaWQgc2JfdWFydF93cml0ZV93YWtldXAoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLSAgICBzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gcG9ydC0+aW5mbzsKLSAgICB0YXNrbGV0X3NjaGVkdWxlKCZpbmZvLT50bGV0KTsKLX0KLQotdm9pZCBzYl91YXJ0X3VwZGF0ZV90aW1lb3V0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZywKLQkJCSB1bnNpZ25lZCBpbnQgYmF1ZCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgYml0czsKLQotICAgIHN3aXRjaCAoY2ZsYWcgJiBDU0laRSkKLSAgICB7Ci0gICAgICAgIGNhc2UgQ1M1OgotICAgICAgICAgICAgYml0cyA9IDc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENTNjoKLSAgICAgICAgICAgIGJpdHMgPSA4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDUzc6Ci0gICAgICAgICAgICBiaXRzID0gOTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBiaXRzID0gMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY2ZsYWcgJiBDU1RPUEIpCi0gICAgewotICAgICAgICBiaXRzKys7Ci0gICAgfQotCi0gICAgaWYgKGNmbGFnICYgUEFSRU5CKQotICAgIHsKLSAgICAgICAgYml0cysrOwotICAgIH0KLQotICAgIGJpdHMgPSBiaXRzICogcG9ydC0+Zmlmb3NpemU7Ci0KLSAgICBwb3J0LT50aW1lb3V0ID0gKEhaICogYml0cykgLyBiYXVkICsgSFovNTA7Ci19Ci11bnNpZ25lZCBpbnQgc2JfdWFydF9nZXRfYmF1ZF9yYXRlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBNUF9URVJNSU9TICp0ZXJtaW9zLAotCQkJCXN0cnVjdCBNUF9URVJNSU9TICpvbGQsIHVuc2lnbmVkIGludCBtaW4sCi0JCQkJdW5zaWduZWQgaW50IG1heCkKLXsKLSAgICAgICAgdW5zaWduZWQgaW50IHRyeSwgYmF1ZCwgYWx0YmF1ZCA9IDM4NDAwOwotICAgICAgICB1cGZfdCBmbGFncyA9IHBvcnQtPmZsYWdzICYgVVBGX1NQRF9NQVNLOwotCi0gICAgICAgIGlmIChmbGFncyA9PSBVUEZfU1BEX0hJKQotICAgICAgICAgICAgICAgIGFsdGJhdWQgPSA1NzYwMDsKLSAgICAgICAgaWYgKGZsYWdzID09IFVQRl9TUERfVkhJKQotICAgICAgICAgICAgICAgIGFsdGJhdWQgPSAxMTUyMDA7Ci0gICAgICAgIGlmIChmbGFncyA9PSBVUEZfU1BEX1NISSkKLSAgICAgICAgICAgICAgICBhbHRiYXVkID0gMjMwNDAwOwotICAgICAgICBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9XQVJQKQotICAgICAgICAgICAgICAgIGFsdGJhdWQgPSA0NjA4MDA7Ci0KLSAgICAgICAgZm9yICh0cnkgPSAwOyB0cnkgPCAyOyB0cnkrKykgewotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgKENCQVVEIHwgQ0JBVURFWCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAljYXNlIEI5MjE2MDAgICAgOiBiYXVkID0gOTIxNjAwOyAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCNDYwODAwICAgIDogYmF1ZCA9IDQ2MDgwMDsgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjIzMDQwMCAgICA6IGJhdWQgPSAyMzA0MDA7ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxMTUyMDAgICAgOiBiYXVkID0gMTE1MjAwOyAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCNTc2MDAgICAgIDogYmF1ZCA9IDU3NjAwOyAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjM4NDAwICAgICA6IGJhdWQgPSAzODQwMDsgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxOTIwMCAgICAgOiBiYXVkID0gMTkyMDA7ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCOTYwMCAgICAgIDogYmF1ZCA9IDk2MDA7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjQ4MDAgICAgICA6IGJhdWQgPSA0ODAwOyAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIyNDAwICAgICAgOiBiYXVkID0gMjQwMDsgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTgwMCAgICAgIDogYmF1ZCA9IDE4MDA7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjEyMDAgICAgICA6IGJhdWQgPSAxMjAwOyAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI2MDAgICAgICAgOiBiYXVkID0gNjAwOyAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMzAwICAgICAgIDogYmF1ZCA9IDMwMDsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEIyMDAgICAgICAgOiBiYXVkID0gMjAwOyAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTUwICAgICAgIDogYmF1ZCA9IDE1MDsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjEzNCAgICAgICA6IGJhdWQgPSAxMzQ7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxMTAgICAgICAgOiBiYXVkID0gMTEwOyAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCNzUgICAgICAgIDogYmF1ZCA9IDc1OyAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjUwICAgICAgICA6IGJhdWQgPSA1MDsgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAlkZWZhdWx0ICAgICAgICAgOiBiYXVkID0gOTYwMDsgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmF1ZCA9PSAzODQwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhdWQgPSBhbHRiYXVkOwotCi0gICAgICAgICAgICAgICAgaWYgKGJhdWQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhdWQgPSA5NjAwOwotCi0gICAgICAgICAgICAgICAgaWYgKGJhdWQgPj0gbWluICYmIGJhdWQgPD0gbWF4KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhdWQ7Ci0KLSAgICAgICAgICAgICAgICB0ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKLSAgICAgICAgICAgICAgICBpZiAob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW9zLT5jX2NmbGFnIHw9IG9sZC0+Y19jZmxhZyAmIENCQVVEOwotICAgICAgICAgICAgICAgICAgICAgICAgb2xkID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRlcm1pb3MtPmNfY2ZsYWcgfD0gQjk2MDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLX0KLXVuc2lnbmVkIGludCBzYl91YXJ0X2dldF9kaXZpc29yKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBiYXVkKQotewotICAgICAgICB1bnNpZ25lZCBpbnQgcXVvdDsKLQotICAgICAgICBpZiAoYmF1ZCA9PSAzODQwMCAmJiAocG9ydC0+ZmxhZ3MgJiBVUEZfU1BEX01BU0spID09IFVQRl9TUERfQ1VTVCkKLSAgICAgICAgICAgICAgICBxdW90ID0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBxdW90ID0gKHBvcnQtPnVhcnRjbGsgKyAoOCAqIGJhdWQpKSAvICgxNiAqIGJhdWQpOwotCi0gICAgICAgIHJldHVybiBxdW90OwotfQotCi0KLQotc3RhdGljIGlubGluZSBpbnQgc2JfdWFydF9oYW5kbGVfYnJlYWsoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gcG9ydC0+aW5mbzsKLQotCWlmIChwb3J0LT5mbGFncyAmIFVQRl9TQUspCi0JCWRvX1NBSyhpbmZvLT50dHkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2JfdWFydF9oYW5kbGVfZGNkX2NoYW5nZShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdHVzKQotewotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBwb3J0LT5pbmZvOwotCi0JcG9ydC0+aWNvdW50LmRjZCsrOwotCi0JaWYgKGluZm8tPmZsYWdzICYgVUlGX0NIRUNLX0NEKSB7Ci0JCWlmIChzdGF0dXMpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Ci0JCWVsc2UgaWYgKGluZm8tPnR0eSkKLQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYl91YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzdGF0dXMpCi17Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHBvcnQtPmluZm87Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKLQotCXBvcnQtPmljb3VudC5jdHMrKzsKLQotCWlmIChpbmZvLT5mbGFncyAmIFVJRl9DVFNfRkxPVykgewotCQlpZiAodHR5LT5od19zdG9wcGVkKSB7Ci0JCQlpZiAoc3RhdHVzKSB7Ci0JCQkJdHR5LT5od19zdG9wcGVkID0gMDsKLQkJCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQpOwotCQkJCXNiX3VhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwotCQkJCXBvcnQtPm9wcy0+c3RvcF90eChwb3J0KTsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvMnQzZTMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvMnQzZTMuaAppbmRleCBjY2FkMDQ5Li5lN2JmNzIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy8ydDNlMy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvMnQzZTMuaApAQCAtNjEzLDEyICs2MTMsMTIgQEAKICAqIGRlc2NyaXB0b3IgbGlzdCBhbmQgZGF0YSBidWZmZXIKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCB0M2UzX3J4X2Rlc2MgewogCXUzMiByZGVzMDsKIAl1MzIgcmRlczE7CiAJdTMyIHJkZXMyOwogCXUzMiByZGVzMzsKLX0gdDNlM19yeF9kZXNjX3Q7Cit9OwogCiAjZGVmaW5lIFNCRV8yVDNFM19SWF9ERVNDX1JJTkdfU0laRQkJCTY0CiAKQEAgLTY0OCwxMiArNjQ4LDEyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCB0M2UzX3R4X2Rlc2MgewogCXUzMiB0ZGVzMDsKIAl1MzIgdGRlczE7CiAJdTMyIHRkZXMyOwogCXUzMiB0ZGVzMzsKLX0gdDNlM190eF9kZXNjX3Q7Cit9OwogCiAjZGVmaW5lIFNCRV8yVDNFM19UWF9ERVNDX1JJTkdfU0laRQkJCTI1NgogCkBAIC03MDEsNyArNzAxLDcgQEAKIAl9IGg7CiAKIAkvKiBzdGF0aXN0aWNzICovCi0JdDNlM19zdGF0c190IHM7CisJc3RydWN0IHQzZTNfc3RhdHMgczsKIAogCS8qIHJ1bm5pbmcgKi8KIAlzdHJ1Y3QgewpAQCAtNzA5LDcgKzcwOSw3IEBACiAJfSByOwogCiAJLyogcGFyYW1ldGVycyAqLwotCXQzZTNfcGFyYW1fdCBwOworCXN0cnVjdCB0M2UzX3BhcmFtIHA7CiAKIAl1MzIgbGl1X3JlZ3NbU0JFXzJUM0UzX0xJVV9SRUdfTUFYXTsJICAgLyogTElVIHJlZ2lzdGVycyAqLwogCXUzMiBmcmFtZXJfcmVnc1tTQkVfMlQzRTNfRlJBTUVSX1JFR19NQVhdOyAvKiBGcmFtZXIgcmVnaXN0ZXJzICovCkBAIC03MjMsMTIgKzcyMywxMiBAQAogCQl1MzIgaW50ZXJydXB0X2VuYWJsZV9tYXNrOwogCiAJCS8qIHJlY2VpdmUgY2hhaW4vcmluZyAqLwotCQl0M2UzX3J4X2Rlc2NfdCAqcnhfcmluZzsKKwkJc3RydWN0IHQzZTNfcnhfZGVzYyAqcnhfcmluZzsKIAkJc3RydWN0IHNrX2J1ZmYgKnJ4X2RhdGFbU0JFXzJUM0UzX1JYX0RFU0NfUklOR19TSVpFXTsKIAkJdTMyIHJ4X3JpbmdfY3VycmVudF9yZWFkOwogCiAJCS8qIHRyYW5zbWl0IGNoYWluL3JpbmcgKi8KLQkJdDNlM190eF9kZXNjX3QgKnR4X3Jpbmc7CisJCXN0cnVjdCB0M2UzX3R4X2Rlc2MgKnR4X3Jpbmc7CiAJCXN0cnVjdCBza19idWZmICp0eF9kYXRhW1NCRV8yVDNFM19UWF9ERVNDX1JJTkdfU0laRV07CiAJCXUzMiB0eF9yaW5nX2N1cnJlbnRfcmVhZDsKIAkJdTMyIHR4X3JpbmdfY3VycmVudF93cml0ZTsKQEAgLTc2MCw4ICs3NjAsNyBAQAogdm9pZCB0M2UzX2lmX3VwKHN0cnVjdCBjaGFubmVsICopOwogdm9pZCB0M2UzX2lmX2Rvd24oc3RydWN0IGNoYW5uZWwgKik7CiBpbnQgdDNlM19pZl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCB0M2UzX2lmX2NvbmZpZyhzdHJ1Y3QgY2hhbm5lbCAqLCB1MzIsIGNoYXIgKiwKLQkJICAgIHQzZTNfcmVzcF90ICosIGludCAqKTsKK3ZvaWQgdDNlM19pZl9jb25maWcoc3RydWN0IGNoYW5uZWwgKiwgdTMyLCBjaGFyICosIHN0cnVjdCB0M2UzX3Jlc3AgKiwgaW50ICopOwogdm9pZCB0M2UzX3NldF9mcmFtZV90eXBlKHN0cnVjdCBjaGFubmVsICosIHUzMik7CiB1MzIgdDNlM19lZXByb21fcmVhZF93b3JkKHN0cnVjdCBjaGFubmVsICosIHUzMik7CiB2b2lkIHQzZTNfcmVhZF9jYXJkX3NlcmlhbF9udW1iZXIoc3RydWN0IGNoYW5uZWwgKik7CkBAIC04MzgsNyArODM3LDcgQEAKIAlyZXR1cm4gcGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfU1VCREVWSUNFX0lEX1NCRV8yVDNFM19QMDsKIH0KIAotI2RlZmluZSBkZXZfdG9fcHJpdihkZXYpICgqKHN0cnVjdCBjaGFubmVsICoqKSAoKGhkbGNfZGV2aWNlKikoZGV2KSArIDEpKQorI2RlZmluZSBkZXZfdG9fcHJpdihkZXYpICgqKHN0cnVjdCBjaGFubmVsICoqKSAoKGhkbGNfZGV2aWNlICopKGRldikgKyAxKSkKIAogc3RhdGljIGlubGluZSB1MzIgZGNfcmVhZCh1bnNpZ25lZCBsb25nIGFkZHIsIHUzMiByZWcpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5jCmluZGV4IGQyODBiY2YuLmUwOTY0YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5jCkBAIC0xNjQsMTIgKzE2NCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgdDNlM19wb3J0X2dldChzdHJ1Y3QgY2hhbm5lbCAqc2MsIHQzZTNfcGFyYW1fdCAqcGFyYW0pCitzdGF0aWMgdm9pZCB0M2UzX3BvcnRfZ2V0KHN0cnVjdCBjaGFubmVsICpzYywgc3RydWN0IHQzZTNfcGFyYW0gKnBhcmFtKQogewotCW1lbWNweShwYXJhbSwgJihzYy0+cCksIHNpemVvZih0M2UzX3BhcmFtX3QpKTsKKwltZW1jcHkocGFyYW0sICYoc2MtPnApLCBzaXplb2Yoc3RydWN0IHQzZTNfcGFyYW0pKTsKIH0KIAotc3RhdGljIHZvaWQgdDNlM19wb3J0X3NldChzdHJ1Y3QgY2hhbm5lbCAqc2MsIHQzZTNfcGFyYW1fdCAqcGFyYW0pCitzdGF0aWMgdm9pZCB0M2UzX3BvcnRfc2V0KHN0cnVjdCBjaGFubmVsICpzYywgc3RydWN0IHQzZTNfcGFyYW0gKnBhcmFtKQogewogCWlmIChwYXJhbS0+ZnJhbWVfbW9kZSAhPSAweGZmKQogCQljcGxkX3NldF9mcmFtZV9tb2RlKHNjLCBwYXJhbS0+ZnJhbWVfbW9kZSk7CkBAIC0yMTYsOCArMjE2LDcgQEAKIAkJY3BsZF9zZXRfc2NyYW1ibGVyKHNjLCBwYXJhbS0+c2NyYW1ibGVyKTsKIH0KIAotc3RhdGljIHZvaWQgdDNlM19wb3J0X2dldF9zdGF0cyhzdHJ1Y3QgY2hhbm5lbCAqc2MsCi0JCQkgdDNlM19zdGF0c190ICpzdGF0cykKK3N0YXRpYyB2b2lkIHQzZTNfcG9ydF9nZXRfc3RhdHMoc3RydWN0IGNoYW5uZWwgKnNjLCBzdHJ1Y3QgdDNlM19zdGF0cyAqc3RhdHMpCiB7CiAJdTMyIHJlc3VsdDsKIApAQCAtMjc5LDE4ICsyNzgsMTggQEAKIAlyZXN1bHQgKz0gZXhhcjcyNTBfcmVhZChzYywgU0JFXzJUM0UzX0ZSQU1FUl9SRUdfUE1PTl9IT0xESU5HX1JFR0lTVEVSKTsKIAlzYy0+cy5DUF9CSVQgKz0gcmVzdWx0OwogCi0JbWVtY3B5KHN0YXRzLCAmKHNjLT5zKSwgc2l6ZW9mKHQzZTNfc3RhdHNfdCkpOworCW1lbWNweShzdGF0cywgJihzYy0+cyksIHNpemVvZihzdHJ1Y3QgdDNlM19zdGF0cykpOwogfQogCiBzdGF0aWMgdm9pZCB0M2UzX3BvcnRfZGVsX3N0YXRzKHN0cnVjdCBjaGFubmVsICpzYykKIHsKLQltZW1zZXQoJihzYy0+cyksIDAsIHNpemVvZih0M2UzX3N0YXRzX3QpKTsKKwltZW1zZXQoJihzYy0+cyksIDAsIHNpemVvZihzdHJ1Y3QgdDNlM19zdGF0cykpOwogfQogCiB2b2lkIHQzZTNfaWZfY29uZmlnKHN0cnVjdCBjaGFubmVsICpzYywgdTMyIGNtZCwgY2hhciAqc2V0LAotCQkgICAgdDNlM19yZXNwX3QgKnJldCwgaW50ICpybGVuKQorCQkgICAgc3RydWN0IHQzZTNfcmVzcCAqcmV0LCBpbnQgKnJsZW4pCiB7Ci0JdDNlM19wYXJhbV90ICpwYXJhbSA9ICh0M2UzX3BhcmFtX3QgKilzZXQ7CisJc3RydWN0IHQzZTNfcGFyYW0gKnBhcmFtID0gKHN0cnVjdCB0M2UzX3BhcmFtICopc2V0OwogCXUzMiAqZGF0YSA9ICh1MzIgKilzZXQ7CiAKIAkvKiB0dXJuIG9mZiBhbGwgaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2N0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5oCmluZGV4IGMxMWE1ODguLjQxZjE0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5oCkBAIC04NCw3ICs4NCw3IEBACiAjZGVmaW5lIE5HX1NCRV8yVDNFM19OT0RFX1RZUEUgICJzYmUyVDNFMyIKICNkZWZpbmUgTkdfU0JFXzJUM0UzX0NPT0tJRSAgICAgMHgwMzgwMDg5MQogCi10eXBlZGVmIHN0cnVjdCB0M2UzX3BhcmFtIHsKK3N0cnVjdCB0M2UzX3BhcmFtIHsKIAl1X2ludDhfdCBmcmFtZV9tb2RlOwkJLyogRlJBTUVfTU9ERV8qICovCiAJdV9pbnQ4X3QgY3JjOwkJCS8qIENSQ18qICovCiAJdV9pbnQ4X3QgcmVjZWl2ZXJfb247CQkvKiBPTi9PRkYgKi8KQEAgLTEwMiw5ICsxMDIsOSBAQAogCXVfaW50OF90IGZyYWN0aW9uYWxfbW9kZTsJLyogRlJBQ1RJT05BTF9NT0RFXyogKi8KIAl1X2ludDhfdCBiYW5kd2lkdGhfc3RhcnQ7CS8qIDAtMjU1ICovCiAJdV9pbnQ4X3QgYmFuZHdpZHRoX3N0b3A7CS8qIDAtMjU1ICovCi19IHQzZTNfcGFyYW1fdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHQzZTNfc3RhdHMgeworc3RydWN0IHQzZTNfc3RhdHMgewogCXVfaW50NjRfdCBpbl9ieXRlczsKIAl1MzIgaW5fcGFja2V0cywgaW5fZHJvcHBlZDsKIAl1MzIgaW5fZXJyb3JzLCBpbl9lcnJvcl9kZXNjLCBpbl9lcnJvcl9jb2xsLCBpbl9lcnJvcl9kcmliLApAQCAtMTE3LDE1ICsxMTcsMTUgQEAKIAl1X2ludDhfdCBMT0MsIExPRiwgT09GLCBMT1MsIEFJUywgRkVSRiwgSURMRSwgQUlDLCBGRUFDOwogCXVfaW50MTZfdCBGRUJFX2NvZGU7CiAJdTMyIExDViwgRlJBTUlOR19CSVQsIFBBUklUWV9FUlJPUiwgRkVCRV9jb3VudCwgQ1BfQklUOwotfSB0M2UzX3N0YXRzX3Q7Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IHQzZTNfcmVzcCB7CitzdHJ1Y3QgdDNlM19yZXNwIHsKIAl1bmlvbiB7Ci0JCXQzZTNfcGFyYW1fdCBwYXJhbTsKLQkJdDNlM19zdGF0c190IHN0YXRzOworCQlzdHJ1Y3QgdDNlM19wYXJhbSBwYXJhbTsKKwkJc3RydWN0IHQzZTNfc3RhdHMgc3RhdHM7CiAJCXUzMiBkYXRhOwogCX0gdTsKLX0gdDNlM19yZXNwX3Q7Cit9OwogCiAjZW5kaWYgLyogQ1RSTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2RjLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2RjLmMKaW5kZXggZjIwN2I5ZS4uMDI1MTBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9kYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvZGMuYwpAQCAtMzE2LDEzICszMTYsMTMgQEAKIAogCWlmIChzYy0+ZXRoZXIucnhfcmluZyA9PSBOVUxMKQogCQlzYy0+ZXRoZXIucnhfcmluZyA9IGtjYWxsb2MoU0JFXzJUM0UzX1JYX0RFU0NfUklOR19TSVpFLAotCQkJCQkgICAgc2l6ZW9mKHQzZTNfcnhfZGVzY190KSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHQzZTNfcnhfZGVzYyksIEdGUF9LRVJORUwpOwogCWlmIChzYy0+ZXRoZXIucnhfcmluZyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChzYy0+ZXRoZXIudHhfcmluZyA9PSBOVUxMKQogCQlzYy0+ZXRoZXIudHhfcmluZyA9IGtjYWxsb2MoU0JFXzJUM0UzX1RYX0RFU0NfUklOR19TSVpFLAotCQkJCQkgICAgc2l6ZW9mKHQzZTNfdHhfZGVzY190KSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHQzZTNfdHhfZGVzYyksIEdGUF9LRVJORUwpOwogCWlmIChzYy0+ZXRoZXIudHhfcmluZyA9PSBOVUxMKSB7CiAJCWtmcmVlKHNjLT5ldGhlci5yeF9yaW5nKTsKIAkJc2MtPmV0aGVyLnJ4X3JpbmcgPSBOVUxMOwpAQCAtMzM5LDcgKzMzOSw4IEBACiAJCQlTQkVfMlQzRTNfUlhfREVTQ19TRUNPTkRfQUREUkVTU19DSEFJTkVEIHwgU0JFXzJUM0UzX01UVTsKIAogCQlpZiAoc2MtPmV0aGVyLnJ4X2RhdGFbaV0gPT0gTlVMTCkgewotCQkJaWYgKCEobSA9IGRldl9hbGxvY19za2IoTUNMQllURVMpKSkgeworCQkJbSA9IGRldl9hbGxvY19za2IoTUNMQllURVMpOworCQkJaWYgKCFtKSB7CiAJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewogCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShzYy0+ZXRoZXIucnhfZGF0YVtqXSk7CiAJCQkJCXNjLT5ldGhlci5yeF9kYXRhW2pdID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvaW50ci5jIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9pbnRyLmMKaW5kZXggZWZkZWI3NS4uMWJmNzRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9pbnRyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9pbnRyLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogewogCXUzMiBjdXJyZW50X3JlYWQ7CiAJdTMyIGVycm9yX21hc2ssIGVycm9yOwotCXQzZTNfcnhfZGVzY190ICpjdXJyZW50X2Rlc2M7CisJc3RydWN0IHQzZTNfcnhfZGVzYyAqY3VycmVudF9kZXNjOwogCXN0cnVjdCBza19idWZmICptLCAqbTI7CiAJdW5zaWduZWQgcmN2X2xlbjsKIApAQCAtMjkyLDcgKzI5Miw3IEBACiB7CiAJdTMyIGN1cnJlbnRfcmVhZCwgY3VycmVudF93cml0ZTsKIAl1MzIgbGFzdF9zZWdtZW50LCBlcnJvcjsKLQl0M2UzX3R4X2Rlc2NfdCAqY3VycmVudF9kZXNjOworCXN0cnVjdCB0M2UzX3R4X2Rlc2MgKmN1cnJlbnRfZGVzYzsKIAogCXNwaW5fbG9jaygmc2MtPmV0aGVyLnR4X2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21hcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbWFwcy5jCmluZGV4IDcwODRmYmUuLmU1NDk0NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbWFwcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbWFwcy5jCkBAIC0xMyw4ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSAiMnQzZTMuaCIKIAotY29uc3QgdTMyIGNwbGRfcmVnX21hcFtdWzJdID0KLXsKK2NvbnN0IHUzMiBjcGxkX3JlZ19tYXBbXVsyXSA9IHsKIAl7IDB4MDAwMCwgMHgwMDgwIH0sIC8qIDAgLSBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgQSAoUENSQSkgKi8KIAl7IDB4MDAwNCwgMHgwMDg0IH0sIC8qIDEgLSBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgQiAoUENSQikgKi8KIAl7IDB4MDAwOCwgMHgwMDg4IH0sIC8qIDIgLSBMQ1YgQ291bnQgUmVnaXN0ZXIgKFBMQ1IpICovCkBAIC0zNSw4ICszNCw3IEBACiAJeyAweDAwNzAsIDB4MDBmMCB9LCAvKiAxNyAtIFBvcnQgQmFuZHdpZHRoIFN0b3AgKFBCV0wpICovCiB9OwogCi1jb25zdCB1MzIgY3BsZF92YWxfbWFwW11bMl0gPQoteworY29uc3QgdTMyIGNwbGRfdmFsX21hcFtdWzJdID0gewogCXsgMHgwMSwgMHgwMiB9LCAvKiBMSVUxIC8gTElVMiBzZWxlY3QgZm9yIFNlcmlhbCBDaGlwIFNlbGVjdCAqLwogCXsgMHgwNCwgMHgwOCB9LCAvKiBEQUMxIC8gREFDMiBzZWxlY3QgZm9yIFNlcmlhbCBDaGlwIFNlbGVjdCAqLwogCXsgMHgwMCwgMHgwNCB9LCAvKiBMT09QMSAvIExPT1AyIC0gc2VsZWN0IG9mIGxvb3AgdGltaW5nIHNvdXJjZSAqLwpAQCAtOTQsOCArOTIsNyBAQAogCTB4ODEgIC8qIDQ3IC0gTElORV9JTlRFUkZBQ0VfU0NBTiAqLwogfTsKIAotY29uc3QgdTMyIHQzZTNfbGl1X3JlZ19tYXBbXSA9Ci17Citjb25zdCB1MzIgdDNlM19saXVfcmVnX21hcFtdID0gewogCTB4MDAsIC8qIFJFRzAgKi8KIAkweDAxLCAvKiBSRUcxICovCiAJMHgwMiwgLyogUkVHMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbW9kdWxlLmMKaW5kZXggMGUzMmJlNS4uYTZmOTNhNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tb2R1bGUuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJc3RydWN0IGNoYW5uZWwgKmNoYW5uZWwwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBjYXJkICpjYXJkID0gY2hhbm5lbDAtPmNhcmQ7CiAKLQlkZWxfdGltZXIoJmNhcmQtPnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FyZC0+dGltZXIpOwogCWlmIChoYXNfdHdvX3BvcnRzKGNoYW5uZWwwLT5wZGV2KSkgewogCQl0M2UzX3JlbW92ZV9jaGFubmVsKCZjYXJkLT5jaGFubmVsc1sxXSk7CiAJCXBjaV9kZXZfcHV0KGNhcmQtPmNoYW5uZWxzWzFdLnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbmV0ZGV2LmMKaW5kZXggMWY1MDg4Yi4uZmU2Yzk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9uZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL25ldGRldi5jCkBAIC0yNSw4ICsyNSw4IEBACiB7CiAJc3RydWN0IGNoYW5uZWwgKnNjID0gZGV2X3RvX3ByaXYoZGV2KTsKIAlpbnQgY21kXzJ0M2UzLCBsZW4sIHJsZW47Ci0JdDNlM19wYXJhbV90IHBhcmFtOwotCXQzZTNfcmVzcF90ICByZXNwOworCXN0cnVjdCB0M2UzX3BhcmFtIHBhcmFtOworCXN0cnVjdCB0M2UzX3Jlc3AgcmVzcDsKIAl2b2lkIF9fdXNlciAqZGF0YSA9IGlmci0+aWZyX2RhdGEgKyBzaXplb2YoY21kXzJ0M2UzKSArIHNpemVvZihsZW4pOwogCiAJaWYgKGNtZCA9PSBTSU9DV0FOREVWKQpAQCAtNjEsNyArNjEsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuc3RhdHMgPSAmZGV2LT5zdGF0czsKIAlzdHJ1Y3QgY2hhbm5lbCAqc2MgPSBkZXZfdG9fcHJpdihkZXYpOwotCXQzZTNfc3RhdHNfdCAqc3RhdHMgPSAmc2MtPnM7CisJc3RydWN0IHQzZTNfc3RhdHMgKnN0YXRzID0gJnNjLT5zOwogCiAJbWVtc2V0KG5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CiAJbnN0YXRzLT5yeF9wYWNrZXRzID0gc3RhdHMtPmluX3BhY2tldHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2NyeXB0by5jCmluZGV4IDdmYzI2NzUuLjk2NTQ4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2NyeXB0by5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2NyeXB0by5jCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqCW9uIHdoYXQgb3BlcmF0aW9uIGlzIHRvIGJlIGRvbmUKICAqLwogc3RhdGljIGludCBzZXBfc3VibWl0X3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtfcXVldWUsCi0Jdm9pZCgqZnVuY3QpKHZvaWQgKiksCisJdm9pZCAoKmZ1bmN0KSh2b2lkICopLAogCXZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNlcF93b3JrX3N0cnVjdCAqc2VwX3dvcms7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9tYWluLmMKaW5kZXggMTIyNjE0Yy4uZTMwMTIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX21haW4uYwpAQCAtMTI2Niw5ICsxMjY2LDggQEAKIAkvKiBDaGVjayB0aGUgbnVtYmVyIG9mIHBhZ2VzIGxvY2tlZCAtIGlmIG5vdCBhbGwgdGhlbiBleGl0IHdpdGggZXJyb3IgKi8KIAlpZiAocmVzdWx0ICE9IG51bV9wYWdlcykgewogCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBub3QgYWxsIHBhZ2VzIGxvY2tlZCBieSBnZXRfdXNlcl9wYWdlcywgIgotCQkJInJlc3VsdCAweCVYLCBudW1fcGFnZXMgMHglWFxuIiwKLQkJCQljdXJyZW50LT5waWQsIHJlc3VsdCwgbnVtX3BhZ2VzKTsKKwkJCSJbUElEJWRdIG5vdCBhbGwgcGFnZXMgbG9ja2VkIGJ5IGdldF91c2VyX3BhZ2VzLCByZXN1bHQgMHglWCwgbnVtX3BhZ2VzIDB4JVhcbiIsCisJCQljdXJyZW50LT5waWQsIHJlc3VsdCwgbnVtX3BhZ2VzKTsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yMzsKIAl9CkBAIC0xMjkzLDkgKzEyOTIsOSBAQAogCQlsbGlfYXJyYXlbY291bnRdLmJsb2NrX3NpemUgPSBQQUdFX1NJWkU7CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLCBjdXJyZW50LT5waWQsCi0JCQljb3VudCwgKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcywKKwkJCSJbUElEJWRdIGxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJCWN1cnJlbnQtPnBpZCwgY291bnQsCisJCQkodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAogCQkJY291bnQsIGxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSk7CiAJfQogCkBAIC0xMzE0LDggKzEzMTMsNyBAQAogCQkJIltQSUQlZF0gQWZ0ZXIgY2hlY2sgaWYgcGFnZSAwIGhhcyBhbGwgZGF0YVxuIiwKIAkJCWN1cnJlbnQtPnBpZCk7CiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WzBdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQkiW1BJRCVkXSBsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzLAogCQkJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUpOwpAQCAtMTMzMiw4ICsxMzMwLDcgQEAKIAkJCSJbUElEJWRdIEFmdGVyIGxhc3QgcGFnZSBzaXplIGFkanVzdG1lbnRcbiIsCiAJCQljdXJyZW50LT5waWQpOwogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIGxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsICIKLQkJCSJsbGlfYXJyYXlbJXhdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCBsbGlfYXJyYXlbJXhdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCiAJCQljdXJyZW50LT5waWQsCiAJCQludW1fcGFnZXMgLSAxLAogCQkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W251bV9wYWdlcyAtIDFdLmJ1c19hZGRyZXNzLApAQCAtMTQ0OSw4ICsxNDQ2LDcgQEAKIAkJc3RhcnRfcGFnZSArPSBQQUdFX1NJWkU7CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgbGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJY291bnQsICh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtjb3VudF0uYnVzX2FkZHJlc3MsCiAJCQljb3VudCwgbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplKTsKQEAgLTE0NjksOCArMTQ2NSw3IEBACiAKIAlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKIAkJIltQSUQlZF0gQWZ0ZXIgY2hlY2sgaWYgcGFnZSAwIGhhcyBhbGwgZGF0YVxuIgotCQkibGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCAiCi0JCSJsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJImxsaV9hcnJheVswXS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgbGxpX2FycmF5WzBdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCiAJCWN1cnJlbnQtPnBpZCwKIAkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzLAogCQlsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSk7CkBAIC0xNDg0LDggKzE0NzksNyBAQAogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAogCQkJIltQSUQlZF0gQWZ0ZXIgbGFzdCBwYWdlIHNpemUgYWRqdXN0bWVudFxuIgotCQkJImxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsICIKLQkJCSJsbGlfYXJyYXlbJXhdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQkibGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgbGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLCBudW1fcGFnZXMgLSAxLAogCQkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W251bV9wYWdlcyAtIDFdLmJ1c19hZGRyZXNzLAogCQkJbnVtX3BhZ2VzIC0gMSwKQEAgLTE3NDUsOSArMTczOSw4IEBACiAKIAl3aGlsZSAoKHVuc2lnbmVkIGxvbmcpIGxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzICE9IDB4ZmZmZmZmZmYpIHsKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBsbGkgdGFibGUgJTA4bHgsICIKLQkJCSJ0YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJWx4XG4iLAotCQkJCWN1cnJlbnQtPnBpZCwgdGFibGVfY291bnQsIHRhYmxlX2RhdGFfc2l6ZSk7CisJCQkiW1BJRCVkXSBsbGkgdGFibGUgJTA4bHgsIHRhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAlbHhcbiIsCisJCQljdXJyZW50LT5waWQsIHRhYmxlX2NvdW50LCB0YWJsZV9kYXRhX3NpemUpOwogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKIAkJCSJbUElEJWRdIG51bV90YWJsZV9lbnRyaWVzIGlzIChoZXgpICVseFxuIiwKIAkJCQljdXJyZW50LT5waWQsIG51bV90YWJsZV9lbnRyaWVzKTsKQEAgLTE3NjIsOCArMTc1NSw4IEBACiAJCQkJKHVuc2lnbmVkIGxvbmcpIGxsaV90YWJsZV9wdHIpOwogCiAJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkiW1BJRCVkXSBwaHlzIGFkZHJlc3MgaXMgJTA4bHggIgotCQkJCSJibG9jayBzaXplIGlzIChoZXgpICV4XG4iLCBjdXJyZW50LT5waWQsCisJCQkJIltQSUQlZF0gcGh5cyBhZGRyZXNzIGlzICUwOGx4IGJsb2NrIHNpemUgaXMgKGhleCkgJXhcbiIsCisJCQkJY3VycmVudC0+cGlkLAogCQkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzLAogCQkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOwogCQl9CkBAIC0xNzcyLDE0ICsxNzY1LDEyIEBACiAJCWxsaV90YWJsZV9wdHItLTsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIHBoeXMgbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSAiCi0JCQkiaXMgKGhleCkgJXhcbiIsCisJCQkiW1BJRCVkXSBwaHlzIGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCiAJCQljdXJyZW50LT5waWQsCiAJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIHBoeXMgbGxpX3RhYmxlX3B0ci0+cGh5c2ljYWxfYWRkcmVzcyAiCi0JCQkiaXMgJTA4bHhcbiIsCisJCQkiW1BJRCVkXSBwaHlzIGxsaV90YWJsZV9wdHItPnBoeXNpY2FsX2FkZHJlc3MgaXMgJTA4bHhcbiIsCiAJCQljdXJyZW50LT5waWQsCiAJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyk7CiAKQEAgLTE3ODgsMTMgKzE3NzksMTEgQEAKIAkJbnVtX3RhYmxlX2VudHJpZXMgPSAobGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSA+PiAyNCkgJiAweGZmOwogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gcGh5cyB0YWJsZV9kYXRhX3NpemUgaXMgIgotCQkJIihoZXgpICVseCBudW1fdGFibGVfZW50cmllcyBpcyIKLQkJCSIgJWx4IGJ1c19hZGRyZXNzIGlzJWx4XG4iLAotCQkJCWN1cnJlbnQtPnBpZCwKLQkJCQl0YWJsZV9kYXRhX3NpemUsCi0JCQkJbnVtX3RhYmxlX2VudHJpZXMsCi0JCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCQkJIltQSUQlZF0gcGh5cyB0YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJWx4IG51bV90YWJsZV9lbnRyaWVzIGlzICVseCBidXNfYWRkcmVzcyBpcyVseFxuIiwKKwkJCWN1cnJlbnQtPnBpZCwKKwkJCXRhYmxlX2RhdGFfc2l6ZSwKKwkJCW51bV90YWJsZV9lbnRyaWVzLAorCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOwogCiAJCWlmICgodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyAhPSAweGZmZmZmZmZmKQogCQkJbGxpX3RhYmxlX3B0ciA9IChzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKQpAQCAtMjI0NCwxNCArMjIzMywxMiBAQAogCQkJdGFibGVfZGF0YV9zaXplID0gb3V0X3RhYmxlX2RhdGFfc2l6ZTsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIGNvbnN0cnVjdCB0YWJsZXMgZnJvbSBsbGkiCi0JCQkiIGluX3RhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAotCQkJaW5fdGFibGVfZGF0YV9zaXplKTsKKwkJCSJbUElEJWRdIGNvbnN0cnVjdCB0YWJsZXMgZnJvbSBsbGkgaW5fdGFibGVfZGF0YV9zaXplIGlzIChoZXgpICV4XG4iLAorCQkJY3VycmVudC0+cGlkLCBpbl90YWJsZV9kYXRhX3NpemUpOwogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gY29uc3RydWN0IHRhYmxlcyBmcm9tIGxsaSIKLQkJCSJvdXRfdGFibGVfZGF0YV9zaXplIGlzIChoZXgpICV4XG4iLCBjdXJyZW50LT5waWQsCi0JCQlvdXRfdGFibGVfZGF0YV9zaXplKTsKKwkJCSJbUElEJWRdIGNvbnN0cnVjdCB0YWJsZXMgZnJvbSBsbGkgb3V0X3RhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJCWN1cnJlbnQtPnBpZCwgb3V0X3RhYmxlX2RhdGFfc2l6ZSk7CiAKIAkJLyogQ29uc3RydWN0IGlucHV0IGxsaSB0YWJsZSAqLwogCQlzZXBfYnVpbGRfbGxpX3RhYmxlKHNlcCwgJmxsaV9pbl9hcnJheVtjdXJyZW50X2luX2VudHJ5XSwKQEAgLTIzMTYsOCArMjMwMyw3IEBACiAJCQkJaW5mb19pbl9lbnRyeV9wdHItPmJsb2NrX3NpemUpOwogCiAJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkiW1BJRCVkXSBvdXRwdXQgbGxpX3RhYmxlX291dF9wdHI6IgotCQkJCSIlMDhseCAgJTA4eFxuIiwKKwkJCQkiW1BJRCVkXSBvdXRwdXQgbGxpX3RhYmxlX291dF9wdHI6ICUwOGx4ICAlMDh4XG4iLAogCQkJCWN1cnJlbnQtPnBpZCwKIAkJCQkodW5zaWduZWQgbG9uZylpbmZvX291dF9lbnRyeV9wdHItPmJ1c19hZGRyZXNzLAogCQkJCWluZm9fb3V0X2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSk7CkBAIC0yNDQ2LDggKzI0MzIsOCBAQAogCQkJCWRtYV9jdHgpOwogCQlpZiAoZXJyb3IpIHsKIAkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIGlucHV0ICIKLQkJCQkidmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLCBjdXJyZW50LT5waWQpOworCQkJCSJbUElEJWRdIHNlcF9sb2NrX2tlcm5lbF9wYWdlcyBmb3IgaW5wdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLAorCQkJCWN1cnJlbnQtPnBpZCk7CiAKIAkJCWdvdG8gZW5kX2Z1bmN0aW9uOwogCQl9CkBAIC0yNDYwLDggKzI0NDYsOCBAQAogCiAJCWlmIChlcnJvcikgewogCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJCSJbUElEJWRdIHNlcF9sb2NrX2tlcm5lbF9wYWdlcyBmb3Igb3V0cHV0ICIKLQkJCQkidmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLCBjdXJyZW50LT5waWQpOworCQkJCSJbUElEJWRdIHNlcF9sb2NrX2tlcm5lbF9wYWdlcyBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQljdXJyZW50LT5waWQpOwogCiAJCQlnb3RvIGVuZF9mdW5jdGlvbl9mcmVlX2xsaV9pbjsKIAkJfQpAQCAtMjQ3Niw4ICsyNDYyLDggQEAKIAkJCQlkbWFfY3R4KTsKIAkJaWYgKGVycm9yKSB7CiAJCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gc2VwX2xvY2tfdXNlcl9wYWdlcyBmb3IgaW5wdXQgIgotCQkJCSJ2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsIGN1cnJlbnQtPnBpZCk7CisJCQkJIltQSUQlZF0gc2VwX2xvY2tfdXNlcl9wYWdlcyBmb3IgaW5wdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLAorCQkJCWN1cnJlbnQtPnBpZCk7CiAKIAkJCWdvdG8gZW5kX2Z1bmN0aW9uOwogCQl9CkBAIC0yNDkxLDggKzI0NzcsNyBAQAogCQkJCVNFUF9EUklWRVJfT1VUX0ZMQUcsIGRtYV9jdHgpOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJCQkiW1BJRCVkXSBzZWN1cmUgZG1hIHRhYmxlIHNldHVwICIKLQkJCQkJIiBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQkJIltQSUQlZF0gc2VjdXJlIGRtYSB0YWJsZSBzZXR1cCBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKIAkJCQkJY3VycmVudC0+cGlkKTsKIAogCQkJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfbGxpX2luOwpAQCAtMjUxMiw4ICsyNDk3LDcgQEAKIAogCQkJaWYgKGVycm9yKSB7CiAJCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJCQkiW1BJRCVkXSBzZXBfbG9ja191c2VyX3BhZ2VzIgotCQkJCQkiIGZvciBvdXRwdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLAorCQkJCQkiW1BJRCVkXSBzZXBfbG9ja191c2VyX3BhZ2VzIGZvciBvdXRwdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLAogCQkJCQljdXJyZW50LT5waWQpOwogCiAJCQkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9sbGlfaW47CkBAIC0yODI2LDggKzI4MTAsNyBAQAogCiAJaWYgKGVycm9yKSB7CiAJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJwcmVwYXJlIERNQSB0YWJsZSBjYWxsIGZhaWxlZCAiCi0JCQkiZnJvbSBwcmVwYXJlIERDQiBjYWxsXG4iKTsKKwkJCSJwcmVwYXJlIERNQSB0YWJsZSBjYWxsIGZhaWxlZCBmcm9tIHByZXBhcmUgRENCIGNhbGxcbiIpOwogCQlnb3RvIGVuZF9mdW5jdGlvbl9lcnJvcjsKIAl9CiAKQEAgLTI4ODksNyArMjg3Miw4IEBACiAJCSAqIEdvIG92ZXIgZWFjaCBEQ0IgYW5kIHNlZSBpZgogCQkgKiB0YWlsIHBvaW50ZXIgbXVzdCBiZSB1cGRhdGVkCiAJCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgKCpkbWFfY3R4KS0+bnJfZGNiX2NyZWF0OyBpKyssIGRjYl90YWJsZV9wdHIrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgKCpkbWFfY3R4KS0+bnJfZGNiX2NyZWF0OworCQkgICAgIGkrKywgZGNiX3RhYmxlX3B0cisrKSB7CiAJCQlpZiAoZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQpIHsKIAkJCQlwdF9ob2xkID0gKHVuc2lnbmVkIGxvbmcpZGNiX3RhYmxlX3B0ci0+CiAJCQkJCW91dF92cl90YWlsX3B0OwpAQCAtMzA4OSw2ICszMDczLDcgQEAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCiAJCQkiW1BJRCVkXSBTRVBfSU9DUFJFUEFSRURDQiBzdGFydFxuIiwKIAkJCWN1cnJlbnQtPnBpZCk7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgU0VQX0lPQ1BSRVBBUkVEQ0JfU0VDVVJFX0RNQToKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCiAJCQkiW1BJRCVkXSBTRVBfSU9DUFJFUEFSRURDQl9TRUNVUkVfRE1BIHN0YXJ0XG4iLApAQCAtMzc2Miw4ICszNzQ3LDcgQEAKIAogCWlmIChhY3R1YWxfY291bnQgIT0gY291bnRfdXNlcikgewogCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkgIltQSUQlZF0gaW5jb25zaXN0ZW50IG1lc3NhZ2UgIgotCQkJICJzaXplcyAweCUwOHpYIHZzIDB4JTA4elhcbiIsCisJCQkgIltQSUQlZF0gaW5jb25zaXN0ZW50IG1lc3NhZ2Ugc2l6ZXMgMHglMDh6WCB2cyAweCUwOHpYXG4iLAogCQkJIGN1cnJlbnQtPnBpZCwgYWN0dWFsX2NvdW50LCBjb3VudF91c2VyKTsKIAkJZXJyb3IgPSAtRU1TR1NJWkU7CiAJCWdvdG8gZW5kX2Z1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jIGIvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCmluZGV4IGYwZmNiZjcuLjAyNjdkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKQEAgLTcyNCw3ICs3MjQsNyBAQAogCQlnb3RvIHN0YXJ0dXBfZXJyb3I7CiAJfQogCi0Jc3dpdGNoIChzZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpIHsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKIAljYXNlIFFVQVRFQ0hfRFNVMTAwOgogCWNhc2UgUVVBVEVDSF9RU1UxMDA6CiAJY2FzZSBRVUFURUNIX0VTVTEwMEE6CkBAIC03NjIsNyArNzYyLDkgQEAKIAogCX0KIAotCXN0YXR1cyA9IGJveF9zZXRfcHJlYnVmZmVyX2xldmVsKHNlcmlhbCk7CS8qIHNldHMgdG8gZGVmYXVsdCB2YWx1ZSAqLworCXN0YXR1cyA9IGJveF9zZXRfcHJlYnVmZmVyX2xldmVsKHNlcmlhbCk7CS8qIHNldHMgdG8KKwkJCQkJCQkgKiBkZWZhdWx0IHZhbHVlCisJCQkJCQkJICovCiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2RiZyhkZXYsICJib3hfc2V0X3ByZWJ1ZmZlcl9sZXZlbCBmYWlsZWRcbiIpOwogCQlnb3RvIHN0YXJ0dXBfZXJyb3I7CkBAIC04ODcsNyArODg5LDggQEAKIAkgICAgKFNFUklBTF9NU1JfQ1RTIHwgU0VSSUFMX01TUl9EU1IgfCBTRVJJQUxfTVNSX1JJIHwgU0VSSUFMX01TUl9DRCk7CiAKIAkvKiBTZXQgQmF1ZCByYXRlIHRvIGRlZmF1bHQgYW5kIHR1cm4gb2ZmIChkZWZhdWx0KWZsb3cgY29udHJvbCBoZXJlICovCi0JcmVzdWx0ID0gcXRfc2V0dWFydChzZXJpYWwsIHBvcnQtPnBvcnRfbnVtYmVyLCBERUZBVUxUX0RJVklTT1IsIERFRkFVTFRfTENSKTsKKwlyZXN1bHQgPSBxdF9zZXR1YXJ0KHNlcmlhbCwgcG9ydC0+cG9ydF9udW1iZXIsIERFRkFVTFRfRElWSVNPUiwKKwkJCURFRkFVTFRfTENSKTsKIAlpZiAocmVzdWx0IDwgMCkgewogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICJxdF9zZXR1YXJ0IGZhaWxlZFxuIik7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xMDE0LDExICsxMDE3LDEzIEBACiAJLyogQ2xvc2UgdWFydCBjaGFubmVsICovCiAJc3RhdHVzID0gcXRfY2xvc2VfY2hhbm5lbChzZXJpYWwsIGluZGV4KTsKIAlpZiAoc3RhdHVzIDwgMCkKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBxdF9jbG9zZV9jaGFubmVsIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBxdF9jbG9zZV9jaGFubmVsIGZhaWxlZC5cbiIsCisJCQlfX2Z1bmNfXyk7CiAKIAlwb3J0MC0+b3Blbl9wb3J0cy0tOwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAicXRfbnVtX29wZW5fcG9ydHMgaW4gY2xvc2UlZFxuIiwgcG9ydDAtPm9wZW5fcG9ydHMpOworCWRldl9kYmcoJnBvcnQtPmRldiwgInF0X251bV9vcGVuX3BvcnRzIGluIGNsb3NlJWRcbiIsCisJCXBvcnQwLT5vcGVuX3BvcnRzKTsKIAogCWlmIChwb3J0MC0+b3Blbl9wb3J0cyA9PSAwKSB7CiAJCWlmIChzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmIpIHsKQEAgLTEyMzUsNyArMTI0MCw4IEBACiAKIAkvKiBOb3cgZGV0ZXJtaW5lIGZsb3cgY29udHJvbCAqLwogCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBFbmFibGluZyBIVyBmbG93IGNvbnRyb2xcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBFbmFibGluZyBIVyBmbG93IGNvbnRyb2xcbiIsCisJCQlfX2Z1bmNfXyk7CiAKIAkJLyogRW5hYmxlIFJUUy9DVFMgZmxvdyBjb250cm9sICovCiAJCXN0YXR1cyA9IGJveF9zZXRfaHdfZmxvd19jdHJsKHBvcnQtPnNlcmlhbCwgaW5kZXgsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmggYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icF9tb2QuaAppbmRleCA4MTU0YTdiLi44MmI0OTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icF9tb2QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icF9tb2QuaApAQCAtNDk3LDExICs0OTcsMTkgQEAKICNkZWZpbmUgQlBDVExJX1NUQVRVUyAgIDB4MDAwMDgJLyogRGV2aWNlIFN0YXR1cyAtIFJPICovCiAKIC8qIEhXIHJlbGF0ZWQgKi8KLSNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDZfREFUQSAweDAwMDAwMDQwCS8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDYgKi8KLSNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDdfREFUQSAweDAwMDAwMDgwCS8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDcgKi8KKyNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDZfREFUQSAweDAwMDAwMDQwCS8qIFZhbHVlIG9mIFNXCisJCQkJCQkJCQkJICAgICAqIERlZmluZWFibGUgUGluIDYKKwkJCQkJCQkJCQkgICAgICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RBVEEgMHgwMDAwMDA4MAkvKiBWYWx1ZSBvZiBTVworCQkJCQkJCQkJCSAgICAgKiBEZWZpbmVhYmxlIFBpbiA3CisJCQkJCQkJCQkJICAgICAqLwogI2RlZmluZSBCUENUTElfQ1RSTF9TRFAwX0RBVEEgICAgIDB4MDAwNDAwMDAJLyogU1dEUElOIDAgdmFsdWUgKi8KLSNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDZfRElSICAweDAwMDAwNDAwCS8qIERpcmVjdGlvbiBvZiBTRFA2IDA9aW4gMT1vdXQgKi8KLSNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDdfRElSICAweDAwMDAwODAwCS8qIERpcmVjdGlvbiBvZiBTRFA3IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDZfRElSICAweDAwMDAwNDAwCS8qIERpcmVjdGlvbiBvZiBTRFA2CisJCQkJCQkJCQkJICAgKiAwPWluIDE9b3V0CisJCQkJCQkJCQkJICAgKi8KKyNkZWZpbmUgQlBDVExJX0NUUkxfRVhUX1NEUDdfRElSICAweDAwMDAwODAwCS8qIERpcmVjdGlvbiBvZiBTRFA3CisJCQkJCQkJCQkJICAgKiAwPWluIDE9b3V0CisJCQkJCQkJCQkJICAgKi8KICNkZWZpbmUgQlBDVExJX0NUUkxfU0RQMF9ESVIgICAgICAweDAwNDAwMDAwCS8qIFNEUDAgSW5wdXQgb3Igb3V0cHV0ICovCiAjZGVmaW5lIEJQQ1RMSV9DVFJMX1NXRFBJTjEgICAgICAgMHgwMDA4MDAwMAogI2RlZmluZSBCUENUTElfQ1RSTF9TRFAxX0RJUiAgICAgIDB4MDA4MDAwMDAKQEAgLTU2NSw3ICs1NzMsOSBAQAogI2RlZmluZSBCUENUTElfU1dGV19QSFkwX1NNICAweDAyCiAjZGVmaW5lIEJQQ1RMSV9TV0ZXX1BIWTFfU00gIDB4MDQKIAotI2RlZmluZSBCUENUTElfU1dfRldfU1lOQyAgMHgwNUI1QwkvKiBTb2Z0d2FyZS1GaXJtd2FyZSBTeW5jaHJvbml6YXRpb24gLSBSVyAqLworI2RlZmluZSBCUENUTElfU1dfRldfU1lOQyAgMHgwNUI1QwkvKiBTb2Z0d2FyZS1GaXJtd2FyZQorCQkJCQkJCQkgICAgICogU3luY2hyb25pemF0aW9uIC0gUlcKKwkJCQkJCQkJICAgICAqLwogCiAjZGVmaW5lIEJQQ1RMSV9TV1NNICAgICAgMHgwNUI1MAkvKiBTVyBTZW1hcGhvcmUgKi8KICNkZWZpbmUgQlBDVExJX0ZXU00gICAgICAweDA1QjU0CS8qIEZXIFNlbWFwaG9yZSAqLwpAQCAtNjIzLDcgKzYzMyw4IEBACiAvKiNkZWZpbmUgQlAxMEdfTUNMS19EQVRBX09VVDkgICAgICAgQlAxMEdfSTJDX0NMS19PVVQKICNkZWZpbmUgQlAxMEdfTURJT19EQVRBX09VVDkgICAgICAgQlAxMEdfSTJDX0RBVEFfT1VUKi8KIAotCQkJCSAgICAgICAvKiNkZWZpbmUgQlAxMEdfTUNMS19EQVRBX09VVDkqLy8qQlAxMEdfSTJDX0RBVEFfT1VUICovCisJCQkJICAgICAgIC8qI2RlZmluZSBCUDEwR19NQ0xLX0RBVEFfT1VUOSovCisJCQkJCS8qQlAxMEdfSTJDX0RBVEFfT1VUICovCiAjZGVmaW5lIEJQMTBHX01ESU9fREFUQV9PVVQ5ICAgICAgICAgICBCUDEwR19JMkNfREFUQV9PVVQJLypCUDEwR19JMkNfQ0xLX09VVCAqLwogCiAvKiBWSUEgRU9TRFAgISAqLwpAQCAtNjk4LDUgKzcwOSwzIEBACiAJcmVhZGwoKHZvaWQgKikoKGEpLT5tZW1fbWFwKSArIEJQMTBHQl8jI3JlZykpCiAKICNlbmRpZgotCi1pbnQgYnBfcHJvY19jcmVhdGUodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2JwY3RsX21vZC5jCmluZGV4IDIwMzI1ZjUuLjZiOTM2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2JwY3RsX21vZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2JwY3RsX21vZC5jCkBAIC0xMTcsMTIgKzExNywxMiBAQAogc3RhdGljIHN0cnVjdCBicGN0bF9kZXYgKmdldF9zdGF0dXNfcG9ydF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KTsKIHN0YXRpYyB2b2lkIGlmX3NjYW5faW5pdCh2b2lkKTsKIAotaW50IGJ5cGFzc19wcm9jX2NyZWF0ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7Ci1pbnQgYnlwYXNzX3Byb2NfcmVtb3ZlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKTsKLWludCBicF9wcm9jX2NyZWF0ZSh2b2lkKTsKK3N0YXRpYyBpbnQgYnlwYXNzX3Byb2NfY3JlYXRlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKTsKK3N0YXRpYyBpbnQgYnlwYXNzX3Byb2NfcmVtb3ZlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKTsKK3N0YXRpYyBpbnQgYnBfcHJvY19jcmVhdGUodm9pZCk7CiAKLWludCBpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7Ci1pbnQgZ2V0X2Rldl9pZHhfYnNmKGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYyk7CitzdGF0aWMgaW50IGlzX2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KTsKK3N0YXRpYyBpbnQgZ2V0X2Rldl9pZHhfYnNmKGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYyk7CiAKIHN0YXRpYyBpbnQgYnBfZ2V0X2Rldl9pZHhfYnNmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqaW5kZXgpCiB7CkBAIC0yNjIsNyArMjYyLDcgQEAKIAkubm90aWZpZXJfY2FsbCA9IGJwX2RldmljZV9ldmVudCwKIH07CiAKLWludCBpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CitzdGF0aWMgaW50IGlzX2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KTsKIGludCB3ZHRfdGltZV9sZWZ0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpOwogCiBzdGF0aWMgdm9pZCB3cml0ZV9wdWxzZShzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LApAQCAtMTUwMiw3ICsxNTAyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBzZW5kX2J5cGFzc19jbGVhcl9wdWxzZShzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgdmFsdWUpCitzdGF0aWMgdm9pZCBzZW5kX2J5cGFzc19jbGVhcl9wdWxzZShzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7CiAJdWludDMyX3QgY3RybF9leHQgPSAwOwogCkBAIC0xNzU3LDcgKzE3NTgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIENNTkRfT04gIDB4NCAoMTAwKSovCi1pbnQgY21uZF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBjbW5kX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTE3NzQsNyArMTc3NSw3IEBACiB9CiAKIC8qIENNTkRfT0ZGICAweDIgKDEwKSovCi1pbnQgY21uZF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgY21uZF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIApAQCAtMTc5Miw3ICsxNzkzLDcgQEAKIH0KIAogLyogQllQQVNTX09OICgweGEpKi8KLWludCBieXBhc3Nfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTE4MTMsNyArMTgxNCw3IEBACiB9CiAKIC8qIEJZUEFTU19PRkYgKDB4OCAxMTEpKi8KLWludCBieXBhc3Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIApAQCAtMTgzNiw3ICsxODM3LDcgQEAKIH0KIAogLyogVEFQX09GRiAoMHg5KSovCi1pbnQgdGFwX29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX0NBUCkKQEAgLTE4NDksNyArMTg1MCw3IEBACiB9CiAKIC8qIFRBUF9PTiAoMHhiKSovCi1pbnQgdGFwX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRhcF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9DQVApCkBAIC0xODYyLDcgKzE4NjMsNyBAQAogfQogCiAvKiBESVNDX09GRiAoMHg5KSovCi1pbnQgZGlzY19vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzY19vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBESVNDX0NBUCkgJiYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gMHg4KSkgewpAQCAtMTg3NCw3ICsxODc1LDcgQEAKIH0KIAogLyogRElTQ19PTiAoMHhiKSovCi1pbnQgZGlzY19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19DQVApICYmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkpIHsKQEAgLTE4ODUsNTggKzE4ODYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIERJU0NfUE9SVF9PTiAqLwotaW50IGRpc2NfcG9ydF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbTsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRElTQSk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9ESVNCKTsKLQotCQltc2VjX2RlbGF5X2JwKExBVENIX0RFTEFZKTsKLQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBESVNDX1BPUlRfT0ZGICovCi1pbnQgZGlzY19wb3J0X29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbTsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRU5BKTsKLQkJZWxzZQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0VOQik7Ci0KLQkJbXNlY19kZWxheV9icChMQVRDSF9ERUxBWSk7Ci0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogLypUV09fUE9SVF9MSU5LX0hXX0VOICgweGUpKi8KLWludCB0cGxfaHdfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdHBsX2h3X29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDAsIGN0cmwgPSAwOwogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC0xOTY0LDcgKzE5MTUsNyBAQAogfQogCiAvKlRXT19QT1JUX0xJTktfSFdfRElTICgweGMpKi8KLWludCB0cGxfaHdfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRwbF9od19vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMCwgY3RybCA9IDA7CiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKQEAgLTE5OTAsNyArMTk0MSw3IEBACiB9CiAKIC8qIFdEVF9PRkYgKDB4NiAxMTApKi8KLWludCB3ZHRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHdkdF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIApAQCAtMjAxMyw3ICsxOTY0LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKICAgICB3ZHRfdmFsX2FycmF5W10gPSB7IDEwMDAsIDE1MDAsIDIwMDAsIDMwMDAsIDQwMDAsIDgwMDAsIDE2MDAwLCAzMjAwMCwgMCB9OwogCi1pbnQgd2R0X29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCB3ZHRfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHRpbWVvdXQpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFdEX0NUTF9DQVApIHsKQEAgLTIwNjUsNyArMjAxNiw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLXZvaWQgYnA3NV9wdXRfaHdfc2VtYXBob3JlX2dlbmVyaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyB2b2lkIGJwNzVfcHV0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdTMyIHN3c207CiAKQEAgLTIwNzYsNyArMjAyNyw3IEBACiAJQlBDVExfV1JJVEVfUkVHKHBicGN0bF9kZXYsIFNXU00sIHN3c20pOwogfQogCi1zMzIgYnA3NV9nZXRfaHdfc2VtYXBob3JlX2dlbmVyaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBzMzIgYnA3NV9nZXRfaHdfc2VtYXBob3JlX2dlbmVyaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAl1MzIgc3dzbTsKIAlzMzIgcmV0X3ZhbCA9IDA7CkBAIC0yMTkwLDcgKzIxNDEsOCBAQAogCXJldHVybiByZXRfdmFsOwogfQogCi1zMzIgYnA3NV9yZWFkX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCitzdGF0aWMgczMyIGJwNzVfcmVhZF9waHlfcmVnX21kaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdTMyIG9mZnNldCwKKwkJCQkgIHUxNiAqZGF0YSkKIHsKIAl1MzIgaSwgbWRpYyA9IDA7CiAJczMyIHJldF92YWwgPSAwOwpAQCAtMjIyMyw3ICsyMTc1LDggQEAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotczMyIGJwNzVfd3JpdGVfcGh5X3JlZ19tZGljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKQorc3RhdGljIHMzMiBicDc1X3dyaXRlX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1MzIgb2Zmc2V0LAorCQkJCSAgIHUxNiBkYXRhKQogewogCXUzMiBpLCBtZGljID0gMDsKIAlzMzIgcmV0X3ZhbCA9IDA7CkBAIC0yMzUzLDExICsyMzA2LDEwIEBACiAJCWlmIChQRUc1X0lGX1NFUklFUyhwYnBjdGxfZGV2LT5zdWJkZXZpY2UpKSB7CiAJCQlpZiAodHhfc3RhdGUpIHsKIAkJCQl1aW50MTZfdCBtaWlfcmVnOwotCQkJCWlmICghCi0JCQkJICAgIChyZXQgPQotCQkJCSAgICAgYnA3NV9yZWFkX3BoeV9yZWcocGJwY3RsX2RldiwKLQkJCQkJCSAgICAgICBCUENUTElfUEhZX0NPTlRST0wsCi0JCQkJCQkgICAgICAgJm1paV9yZWcpKSkgeworCQkJCXJldCA9IGJwNzVfcmVhZF9waHlfcmVnKHBicGN0bF9kZXYsCisJCQkJCSAgICAgIEJQQ1RMSV9QSFlfQ09OVFJPTCwKKwkJCQkJICAgICAgJm1paV9yZWcpOworCQkJCWlmICghcmV0KSB7CiAJCQkJCWlmIChtaWlfcmVnICYgQlBDVExJX01JSV9DUl9QT1dFUl9ET1dOKSB7CiAJCQkJCQlyZXQgPQogCQkJCQkJICAgIGJwNzVfd3JpdGVfcGh5X3JlZwpAQCAtMjM2OSwxNyArMjMyMSwxNSBAQAogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJdWludDE2X3QgbWlpX3JlZzsKLQkJCQlpZiAoIQotCQkJCSAgICAocmV0ID0KLQkJCQkgICAgIGJwNzVfcmVhZF9waHlfcmVnKHBicGN0bF9kZXYsCi0JCQkJCQkgICAgICAgQlBDVExJX1BIWV9DT05UUk9MLAotCQkJCQkJICAgICAgICZtaWlfcmVnKSkpIHsKKwkJCQlyZXQgPSBicDc1X3JlYWRfcGh5X3JlZyhwYnBjdGxfZGV2LAorCQkJCQkgICAgICBCUENUTElfUEhZX0NPTlRST0wsCisJCQkJCSAgICAgICZtaWlfcmVnKTsKKwkJCQlpZiAoIXJldCkgewogCiAJCQkJCW1paV9yZWcgfD0gQlBDVExJX01JSV9DUl9QT1dFUl9ET1dOOwotCQkJCQlyZXQgPQotCQkJCQkgICAgYnA3NV93cml0ZV9waHlfcmVnKHBicGN0bF9kZXYsCi0JCQkJCQkJICAgICAgIEJQQ1RMSV9QSFlfQ09OVFJPTCwKLQkJCQkJCQkgICAgICAgbWlpX3JlZyk7CisJCQkJCXJldCA9IGJwNzVfd3JpdGVfcGh5X3JlZyhwYnBjdGxfZGV2LAorCQkJCQkJICAgICAgIEJQQ1RMSV9QSFlfQ09OVFJPTCwKKwkJCQkJCSAgICAgICBtaWlfcmVnKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTI1MzQsNyArMjQ4NCw3IEBACiB9CiAKIC8qUkVTRVRfQ09OVCAweDIwICovCi1pbnQgcmVzZXRfY29udChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCByZXNldF9jb250KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTI1NTEsNyArMjUwMSw3IEBACiB9CiAKIC8qRElTX0JZUEFTU19DQVAgMHgyMiAqLwotaW50IGRpc19ieXBhc3NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc19ieXBhc3NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX0RJU19DQVApIHsKQEAgLTI1NzAsNyArMjUyMCw3IEBACiB9CiAKIC8qRU5fQllQQVNTX0NBUCAweDI0ICovCi1pbnQgZW5fYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBlbl9ieXBhc3NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9ESVNfQ0FQKSB7CiAJCWlmIChJTlRFTF9JRl9TRVJJRVMocGJwY3RsX2Rldi0+c3ViZGV2aWNlKSkgewpAQCAtMjU4Niw3ICsyNTM2LDcgQEAKIH0KIAogLyogQllQQVNTX1NUQVRFX1BXUk9OIDB4MjYqLwotaW50IGJ5cGFzc19zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX1BXVVBfQ1RMX0NBUCkgewogCQl3cml0ZV9kYXRhKHBicGN0bF9kZXYsIEJZUEFTU19TVEFURV9QV1JPTik7CkBAIC0yNjAwLDcgKzI1NTAsNyBAQAogfQogCiAvKiBOT1JNQUxfU1RBVEVfUFdST04gMHgyOCovCi1pbnQgbm9ybWFsX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IG5vcm1hbF9zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX1BXVVBfQ1RMX0NBUCkKIAkgICAgfHwgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfUFdVUF9DVExfQ0FQKSkgewpAQCAtMjYxNSw3ICsyNTY1LDcgQEAKIH0KIAogLyogQllQQVNTX1NUQVRFX1BXUk9GRiAweDI3Ki8KLWludCBieXBhc3Nfc3RhdGVfcHdyb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19zdGF0ZV9wd3JvZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX1BXT0ZGX0NUTF9DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBCWVBBU1NfU1RBVEVfUFdST0ZGKTsKQEAgLTI2MjYsNyArMjU3Niw3IEBACiB9CiAKIC8qIE5PUk1BTF9TVEFURV9QV1JPRkYgMHgyOSovCi1pbnQgbm9ybWFsX3N0YXRlX3B3cm9mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBub3JtYWxfc3RhdGVfcHdyb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfUFdPRkZfQ1RMX0NBUCkpIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBOT1JNQUxfU1RBVEVfUFdST0ZGKTsKQEAgLTI2MzcsNyArMjU4Nyw3IEBACiB9CiAKIC8qVEFQX1NUQVRFX1BXUk9OIDB4MmEqLwotaW50IHRhcF9zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9QV1VQX0NUTF9DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBUQVBfU1RBVEVfUFdST04pOwpAQCAtMjY0OCw3ICsyNTk4LDcgQEAKIH0KIAogLypESVNfVEFQX0NBUCAweDJjKi8KLWludCBkaXNfdGFwX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNfdGFwX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX0RJU19DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBESVNfVEFQX0NBUCk7CkBAIC0yNjU5LDcgKzI2MDksNyBAQAogfQogCiAvKkVOX1RBUF9DQVAgMHgyZSovCi1pbnQgZW5fdGFwX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBlbl90YXBfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfRElTX0NBUCkgewogCQl3cml0ZV9kYXRhKHBicGN0bF9kZXYsIEVOX1RBUF9DQVApOwpAQCAtMjY3MCw3ICsyNjIwLDcgQEAKIH0KIAogLypESVNDX1NUQVRFX1BXUk9OIDB4MmEqLwotaW50IGRpc2Nfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzY19zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19QV1VQX0NUTF9DQVApIHsKIAkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gMHg4KSB7CkBAIC0yNjgzLDcgKzI2MzMsNyBAQAogfQogCiAvKkRJU19ESVNDX0NBUCAweDJjKi8KLWludCBkaXNfZGlzY19jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzX2Rpc2NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBESVNDX0RJU19DQVApIHsKIAkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gMHg4KSB7CkBAIC0yNjk1LDYwICsyNjQ1LDggQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotLypESVNDX1NUQVRFX1BXUk9OIDB4MmEqLwotaW50IGRpc2NfcG9ydF9zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbTsKLQotCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKChpc19ieXBhc3NfZm4ocGJwY3RsX2RldikpID09IDEpCi0JCXBicGN0bF9kZXZfbSA9IHBicGN0bF9kZXY7Ci0JZWxzZQotCQlwYnBjdGxfZGV2X20gPSBnZXRfbWFzdGVyX3BvcnRfZm4ocGJwY3RsX2Rldik7Ci0JaWYgKHBicGN0bF9kZXZfbSA9PSBOVUxMKQotCQlyZXR1cm4gQlBfTk9UX0NBUDsKLQotCWlmIChwYnBjdGxfZGV2X20tPmJwX2NhcHNfZXggJiBESVNDX1BPUlRfQ0FQX0VYKSB7Ci0JCWlmIChpc19ieXBhc3NfZm4ocGJwY3RsX2RldikgPT0gMSkKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9ESVNBX1BXUlVQKTsKLQkJZWxzZQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0RJU0JfUFdSVVApOwotCi0JCW1zZWNfZGVsYXlfYnAoTEFUQ0hfREVMQVkpOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBub3JtYWxfcG9ydF9zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbTsKLQlyZXR1cm4gQlBfTk9UX0NBUDsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRU5BX1BXUlVQKTsKLQkJZWxzZQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0VOQl9QV1JVUCk7Ci0KLQkJbXNlY19kZWxheV9icChMQVRDSF9ERUxBWSk7Ci0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogLypFTl9UQVBfQ0FQIDB4MmUqLwotaW50IGVuX2Rpc2NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGVuX2Rpc2NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBESVNDX0RJU19DQVApIHsKIAkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gMHg4KSB7CkBAIC0yNzYwLDcgKzI2NTgsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgc3RkX25pY19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBzdGRfbmljX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNURF9OSUNfQ0FQKSB7CkBAIC0yODE0LDcgKzI3MTIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgc3RkX25pY19vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgc3RkX25pY19vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1REX05JQ19DQVApIHsKQEAgLTI5NzcsNyArMjg3NSw3IEBACiB9CiAKIC8qV0FJVF9BVF9QV1JVUCAweDgwICAgKi8KLWludCBicF93YWl0X2F0X3B3dXBfZW4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnBfd2FpdF9hdF9wd3VwX2VuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKQEAgLTI5OTIsNyArMjg5MCw3IEBACiB9CiAKIC8qRElTX1dBSVRfQVRfUFdSVVAgICAgICAgMHg4MSAqLwotaW50IGJwX3dhaXRfYXRfcHd1cF9kaXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnBfd2FpdF9hdF9wd3VwX2RpcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0zMDA5LDcgKzI5MDcsNyBAQAogCiAvKkVOX0hXX1JFU0VUICAweDgyICAgKi8KIAotaW50IGJwX2h3X3Jlc2V0X2VuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX2h3X3Jlc2V0X2VuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKQEAgLTMwMjUsNyArMjkyMyw3IEBACiAKIC8qRElTX0hXX1JFU0VUICAgICAgICAgICAgIDB4ODMgICAqLwogCi1pbnQgYnBfaHdfcmVzZXRfZGlzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX2h3X3Jlc2V0X2RpcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0zMDQwLDcgKzI5MzgsNyBAQAogfQogCiAKLWludCB3ZHRfZXhwX21vZGUoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IG1vZGUpCitzdGF0aWMgaW50IHdkdF9leHBfbW9kZShzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgbW9kZSkKIHsKIAl1aW50MzJfdCBzdGF0dXNfcmVnID0gMCwgc3RhdHVzX3JlZzEgPSAwOwogCkBAIC0zMDkxLDcgKzI5ODksNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX2Z3X3ZlcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3NfZndfdmVyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkKIAkJcmV0dXJuIHJlYWRfcmVnKHBicGN0bF9kZXYsIFZFUl9SRUdfQUREUik7CkBAIC0zMDk5LDcgKzI5OTcsNyBAQAogCQlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19zaWduX2NoZWNrKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19zaWduX2NoZWNrKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKQpAQCAtMzIxMCw3ICszMTA4LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19mcm9tX2xhc3RfcmVhZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3NfZnJvbV9sYXN0X3JlYWQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAl1aW50MzJfdCBjdHJsX2V4dCA9IDA7CiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKQEAgLTMyMzAsNyArMzEyOCw3IEBACiAJCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKIApAQCAtMzI0NCw3ICszMTQyLDcgQEAKIAkJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBieXBhc3NfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAoKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9DQVApKSB7CkBAIC0zMjU3LDcgKzMxNTUsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9DQVApIHsKQEAgLTMyNzIsNyArMzE3MCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBieXBhc3NfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3NfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0zMjkxLDE4ICszMTg5LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYnlwYXNzX29mZl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQotCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJCUElfVkVSKSB7Ci0JCQlyZXR1cm4gKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsIFNUQVRVU19SRUdfQUREUikpICYKLQkJCQkgIEJZUEFTU19PRkZfTUFTSykgPT0gQllQQVNTX09GRl9NQVNLKSA/IDEgOiAwKTsKLQkJfQotCX0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQogc3RhdGljIGludCBieXBhc3Nfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdTMyIGN0cmxfZXh0ID0gMDsKQEAgLTMzODYsNyArMzI3Miw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkZWZhdWx0X3B3cm9uX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkZWZhdWx0X3B3cm9uX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0zNDE4LDcgKzMzMDQsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzX2J5cGFzc19jYXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc19ieXBhc3NfY2FwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9ESVNfQ0FQKSB7CkBAIC0zNDMxLDMxICszMzE3LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGNtZF9lbl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQotCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewotCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyQlBJX1ZFUikgewotCQkJcmV0dXJuICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBTVEFUVVNfUkVHX0FERFIpKSAmCi0JCQkJICBDTU5EX0VOX01BU0spID09IENNTkRfRU5fTUFTSykgPyAxIDogMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KLWludCB3ZHRfZW5fc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFdEX0NUTF9DQVApIHsKLQkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMkJQSV9WRVIpIHsKLQkJCXJldHVybiAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgU1RBVFVTX1JFR19BRERSKSkgJgotCQkJCSAgV0RUX0VOX01BU0spID09IFdEVF9FTl9NQVNLKSA/IDEgOiAwKTsKLQkJfQotCX0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQotaW50IHdkdF9wcm9ncmFtbWVkKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZW91dCkKK3N0YXRpYyBpbnQgd2R0X3Byb2dyYW1tZWQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50ICp0aW1lb3V0KQogewogCWludCByZXQgPSAwOwogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewpAQCAtMzQ4MSw0MCArMzM0Myw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ5cGFzc19zdXBwb3J0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKLQkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMlRCUElfVkVSKSB7Ci0JCQlyZXQgPQotCQkJICAgICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBQUk9EVUNUX0NBUF9SRUdfQUREUikpICYKLQkJCSAgICAgICBCWVBBU1NfU1VQUE9SVF9NQVNLKSA9PQotCQkJICAgICAgQllQQVNTX1NVUFBPUlRfTUFTSykgPyAxIDogMCk7Ci0JCX0gZWxzZSBpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA9PSBQWEcyQlBJX1ZFUikKLQkJCXJldCA9IDE7Ci0JfSBlbHNlCi0JCXJldCA9IEJQX05PVF9DQVA7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHRhcF9zdXBwb3J0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKLQkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMlRCUElfVkVSKSB7Ci0JCQlyZXQgPQotCQkJICAgICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBQUk9EVUNUX0NBUF9SRUdfQUREUikpICYKLQkJCSAgICAgICBUQVBfU1VQUE9SVF9NQVNLKSA9PSBUQVBfU1VQUE9SVF9NQVNLKSA/IDEgOiAwKTsKLQkJfSBlbHNlIGlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID09IFBYRzJCUElfVkVSKQotCQkJcmV0ID0gMDsKLQl9IGVsc2UKLQkJcmV0ID0gQlBfTk9UX0NBUDsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbm9ybWFsX3N1cHBvcnQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgbm9ybWFsX3N1cHBvcnQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIApAQCAtMzUzMCw3ICszMzU5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2JwX3Byb2RfY2FwcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnBfcHJvZF9jYXBzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgJiYKIAkgICAgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMlRCUElfVkVSKSkKQEAgLTM1MzksNyArMzM2OCw3IEBACiAKIH0KIAotaW50IHRhcF9mbGFnX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1NUQVRVU19DQVApIHsKQEAgLTM1NTEsNyArMzM4MCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCB0YXBfZmxhZ19zdGF0dXNfY2xlYXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdWludDMyX3Qgc3RhdHVzX3JlZyA9IDA7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfU1RBVFVTX0NBUCkgewpAQCAtMzU2NSw3ICszMzk0LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IHRhcF9jaGFuZ2Vfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRhcF9jaGFuZ2Vfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMlRCUElfVkVSKSB7CkBAIC0zNTgyLDE3ICszNDExLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgdGFwX29mZl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9DQVApIHsKLQkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMlRCUElfVkVSKQotCQkJcmV0dXJuICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBTVEFUVVNfVEFQX1JFR19BRERSKSkgJgotCQkJCSAgVEFQX09GRl9NQVNLKSA9PSBUQVBfT0ZGX01BU0spID8gMSA6IDApOwotCX0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQotaW50IHRhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXUzMiBjdHJsX2V4dCA9IDA7CiAKQEAgLTM2MzEsNyArMzQ1MCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkZWZhdWx0X3B3cm9uX3RhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGVmYXVsdF9wd3Jvbl90YXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfUFdVUF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikKQEAgLTM2NDIsNyArMzQ2MSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkaXNfdGFwX2NhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzX3RhcF9jYXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfUFdVUF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikKQEAgLTM2NTMsNyArMzQ3Miw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkaXNjX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2NfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19DQVApIHsKQEAgLTM2NjUsNyArMzQ4NCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkaXNjX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2NfZmxhZ19zdGF0dXNfY2xlYXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAl1aW50MzJfdCBzdGF0dXNfcmVnID0gMDsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSB7CkBAIC0zNjc5LDcgKzM0OTgsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19jaGFuZ2Vfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2NfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19DQVApIHsKQEAgLTM2OTAsNyArMzUwOSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkaXNjX29mZl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzY19vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKIAl1MzIgY3RybF9leHQgPSAwOwpAQCAtMzc4Niw3ICszNjA1LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRlZmF1bHRfcHdyb25fZGlzY19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGVmYXVsdF9wd3Jvbl9kaXNjX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19QV1VQX0NUTF9DQVApIHsKIAkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gMHg4KQpAQCAtMzc5Nyw3ICszNjE2LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc19kaXNjX2NhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzX2Rpc2NfY2FwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTX0RJU0NfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkKQEAgLTM4MDgsNTUgKzM2MjcsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19wb3J0X3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSBCUF9OT1RfQ0FQOwotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbTsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpIHsKLQkJCXJldHVybiAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgU1RBVFVTX1RBUF9SRUdfQUREUikpICYKLQkJCQkgIFRYX0RJU0FfTUFTSykgPT0gVFhfRElTQV9NQVNLKSA/IDEgOiAwKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsIFNUQVRVU19UQVBfUkVHX0FERFIpKSAmCi0JCQkJICBUWF9ESVNCX01BU0spID09IFRYX0RJU0JfTUFTSykgPyAxIDogMCk7Ci0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGRlZmF1bHRfcHdyb25fZGlzY19wb3J0X3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSBCUF9OT1RfQ0FQOwotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbTsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpCi0JCQlyZXR1cm4gcmV0OwotCQkvKiAgcmV0dXJuKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsU1RBVFVTX1RBUF9SRUdfQUREUikpICYgVFhfRElTQV9NQVNLKT09VFhfRElTQV9NQVNLKT8xOjApOyAqLwotCQllbHNlCi0JCQlyZXR1cm4gcmV0OwotCQkvKiAgIHJldHVybigoKChyZWFkX3JlZyhwYnBjdGxfZGV2LFNUQVRVU19UQVBfUkVHX0FERFIpKSAmIFRYX0RJU0FfTUFTSyk9PVRYX0RJU0FfTUFTSyk/MTowKTsgKi8KLQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgd2R0X2V4cF9tb2RlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB3ZHRfZXhwX21vZGVfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyIDw9IFBYRzJCUElfVkVSKQpAQCAtMzg3OSw3ICszNjUwLDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IHRwbDJfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdHBsMl9mbGFnX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHNfZXggJiBUUEwyX0NBUF9FWCkgewpAQCAtMzg5MCwyMiArMzY2MSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCB0cGxfaHdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0Jc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKLQotCXBicGN0bF9kZXZfYiA9IGdldF9zdGF0dXNfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAoIXBicGN0bF9kZXZfYikKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAoVFBMX0lGX1NFUklFUyhwYnBjdGxfZGV2LT5zdWJkZXZpY2UpKQotCQlyZXR1cm4gKCgoQlBDVExfUkVBRF9SRUcocGJwY3RsX2RldiwgQ1RSTCkpICYKLQkJCSBCUENUTElfQ1RSTF9TV0RQSU4wKSAhPSAwID8gMSA6IDApOwotCXJldHVybiBCUF9OT1RfQ0FQOwotfQotCi0KLWludCBicF93YWl0X2F0X3B3dXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX3dhaXRfYXRfcHd1cF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKIAkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gMHg4KQpAQCAtMzkxNiw3ICszNjcyLDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJwX2h3X3Jlc2V0X3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF9od19yZXNldF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzkzMCw3ICszNjg2LDcgQEAKIH0KIAogCi1pbnQgc3RkX25pY19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgc3RkX25pY19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgc3RhdHVzX3ZhbCA9IDA7CiAKQEAgLTM5NzgsNyArMzczNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqU1dfSU5JVCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ5cGFzc19jYXBzX2luaXQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyB2b2lkIGJ5cGFzc19jYXBzX2luaXQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAl1X2ludDMyX3QgY3RybF9leHQgPSAwOwogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfbSA9IE5VTEw7CkBAIC00MTk2LDIzICszOTUyLDcgQEAKIAl9CiB9CiAKLWludCBieXBhc3Nfb2ZmX2luaXQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gY21uZF9vbihwYnBjdGxfZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlpZiAoSU5URUxfSUZfU0VSSUVTKHBicGN0bF9kZXYtPnN1YmRldmljZSkpCi0JCXJldHVybiBkaXNfYnlwYXNzX2NhcChwYnBjdGxfZGV2KTsKLQl3ZHRfb2ZmKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfQ0FQKQotCQlieXBhc3Nfb2ZmKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX0NBUCkKLQkJdGFwX29mZihwYnBjdGxfZGV2KTsKLQljbW5kX29mZihwYnBjdGxfZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByZW1vdmVfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyB2b2lkIHJlbW92ZV9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogI2lmZGVmIEJQX1NFTEZfVEVTVAogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfc2wgPSBOVUxMOwpAQCAtNDI0MSw3ICszOTgxLDcgQEAKIAogfQogCi1pbnQgaW5pdF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBpbml0X2J5cGFzc193ZF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7CiAJCWluaXRfdGltZXIoJnBicGN0bF9kZXYtPmJwX3RpbWVyKTsKQEAgLTQyODgsNyArNDAyOCw3IEBACiB9CiAjZW5kaWYKIAotaW50IHNldF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgcGFyYW0pCitzdGF0aWMgaW50IHNldF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgcGFyYW0pCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5yZXNldF90aW1lICE9IHBhcmFtKSB7CkBAIC00MzA3LDcgKzQwNDcsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2J5cGFzc193ZF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkKIAkJcmV0dXJuIHBicGN0bF9kZXYtPnJlc2V0X3RpbWU7CkBAIC00Mzc4LDcgKzQxMTgsNyBAQAogCXJldHVybiAoKChwYnBjdGxfZGV2LT5mdW5jID09IDApIHx8IChwYnBjdGxfZGV2LT5mdW5jID09IDIpKSA/IDEgOiAwKTsKIH0KIAotaW50IHNldF9ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGJ5cGFzc19tb2RlKQorc3RhdGljIGludCBzZXRfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBieXBhc3NfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNDM5NiwxMiArNDEzNiwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlyZXR1cm4gYnlwYXNzX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IGdldF9ieXBhc3NfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9ieXBhc3NfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NDA5LDcgKzQxNDksNyBAQAogCXJldHVybiBieXBhc3NfY2hhbmdlX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF9kaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNfcGFyYW0pCitzdGF0aWMgaW50IHNldF9kaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNfcGFyYW0pCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDQyOCw3ICs0MTY4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2Rpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ0MzYsNyArNDE3Niw3IEBACiAJcmV0dXJuIGRpc19ieXBhc3NfY2FwX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF9ieXBhc3NfcHdvZmZfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGJ5cGFzc19tb2RlKQorc3RhdGljIGludCBzZXRfYnlwYXNzX3B3b2ZmX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBieXBhc3NfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NDU1LDcgKzQxOTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfYnlwYXNzX3B3b2ZmX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9ieXBhc3NfcHdvZmZfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ0NjMsNyArNDIwMyw3IEBACiAJcmV0dXJuIGRlZmF1bHRfcHdyb2ZmX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF9ieXBhc3NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgYnlwYXNzX21vZGUpCitzdGF0aWMgaW50IHNldF9ieXBhc3NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgYnlwYXNzX21vZGUpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDQ4Miw3ICs0MjIyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2J5cGFzc19wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9ieXBhc3NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDQ5MCw3ICs0MjMwLDcgQEAKIAlyZXR1cm4gZGVmYXVsdF9wd3Jvbl9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfYnlwYXNzX3dkX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0aW1lb3V0KQorc3RhdGljIGludCBzZXRfYnlwYXNzX3dkX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0aW1lb3V0KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ1MTIsNyArNDI1Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9ieXBhc3Nfd2RfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50ICp0aW1lb3V0KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3dkX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZW91dCkKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ1MjAsNyArNDI2MCw3IEBACiAJcmV0dXJuIHdkdF9wcm9ncmFtbWVkKHBicGN0bF9kZXYsIHRpbWVvdXQpOwogfQogCi1pbnQgZ2V0X3dkX2V4cGlyZV90aW1lX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZV9sZWZ0KQorc3RhdGljIGludCBnZXRfd2RfZXhwaXJlX3RpbWVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50ICp0aW1lX2xlZnQpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NTI4LDcgKzQyNjgsNyBAQAogCXJldHVybiB3ZHRfdGltZXIocGJwY3RsX2RldiwgdGltZV9sZWZ0KTsKIH0KIAotaW50IHJlc2V0X2J5cGFzc193ZF90aW1lcl9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCByZXNldF9ieXBhc3Nfd2RfdGltZXJfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ1MzYsNyArNDI3Niw3IEBACiAJcmV0dXJuIHdkdF90aW1lcl9yZWxvYWQocGJwY3RsX2Rldik7CiB9CiAKLWludCBnZXRfd2Rfc2V0X2NhcHNfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3dkX3NldF9jYXBzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IGJwX3N0YXR1cyA9IDA7CiAKQEAgLTQ1NjAsNyArNDMwMCw3IEBACiAJcmV0dXJuIGJwX3N0YXR1czsKIH0KIAotaW50IHNldF9zdGRfbmljX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBuaWNfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X3N0ZF9uaWNfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IG5pY19tb2RlKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ1ODAsNyArNDMyMCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9zdGRfbmljX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9zdGRfbmljX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NTg4LDcgKzQzMjgsNyBAQAogCXJldHVybiBzdGRfbmljX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF90YXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRhcF9tb2RlKQorc3RhdGljIGludCBzZXRfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ2MDQsNyArNDM0NCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF90YXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ2MTIsNyArNDM1Miw3IEBACiAJcmV0dXJuIHRhcF9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfdGFwX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRhcF9tb2RlKQorc3RhdGljIGludCBzZXRfdGFwX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRhcF9tb2RlKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ2MzAsNyArNDM3MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF90YXBfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdGFwX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NjQyLDcgKzQzODIsNyBAQAogCXJldHVybiAoKHJldCA9PSAwKSA/IDEgOiAwKTsKIH0KIAotaW50IGdldF90YXBfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF90YXBfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjUwLDcgKzQzOTAsNyBAQAogCXJldHVybiB0YXBfY2hhbmdlX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF9kaXNfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNfcGFyYW0pCitzdGF0aWMgaW50IHNldF9kaXNfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNfcGFyYW0pCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDY2Nyw3ICs0NDA3LDcgQEAKIAkJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfZGlzX3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfZGlzX3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDY3NSw3ICs0NDE1LDcgQEAKIAlyZXR1cm4gZGlzX3RhcF9jYXBfc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ2OTIsNyArNDQzMiw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3MDMsNyArNDQ0Myw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNldF9kaXNjX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2Rpc2NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzY19tb2RlKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3MjEsNyArNDQ2MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9kaXNjX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc2NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3MzEsNyArNDQ3MSw3IEBACiAJcmV0dXJuIChyZXQgPT0gMCA/IDEgOiAocmV0IDwgMCA/IEJQX05PVF9DQVAgOiAwKSk7CiB9CiAKLWludCBnZXRfZGlzY19jaGFuZ2VfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc2NfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDc0MSw3ICs0NDgxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2V0X2Rpc19kaXNjX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNfcGFyYW0pCitzdGF0aWMgaW50IHNldF9kaXNfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3NTksNyArNDQ5OSw3IEBACiAJCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2Rpc19kaXNjX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3NzAsNTUgKzQ1MTAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBzZXRfZGlzY19wb3J0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCi17Ci0JaW50IHJldCA9IEJQX05PVF9DQVA7Ci0JaWYgKCFwYnBjdGxfZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIWRpc2NfbW9kZSkKLQkJcmV0ID0gZGlzY19wb3J0X29mZihwYnBjdGxfZGV2KTsKLQllbHNlCi0JCXJldCA9IGRpc2NfcG9ydF9vbihwYnBjdGxfZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBnZXRfZGlzY19wb3J0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaWYgKCFwYnBjdGxfZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gZGlzY19wb3J0X3N0YXR1cyhwYnBjdGxfZGV2KTsKLX0KLQotaW50IHNldF9kaXNjX3BvcnRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzY19tb2RlKQotewotCWludCByZXQgPSBCUF9OT1RfQ0FQOwotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCFkaXNjX21vZGUpCi0JCXJldCA9IG5vcm1hbF9wb3J0X3N0YXRlX3B3cm9uKHBicGN0bF9kZXYpOwotCWVsc2UKLQkJcmV0ID0gZGlzY19wb3J0X3N0YXRlX3B3cm9uKHBicGN0bF9kZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGdldF9kaXNjX3BvcnRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JcmV0ID0gZGVmYXVsdF9wd3Jvbl9kaXNjX3BvcnRfc3RhdHVzKHBicGN0bF9kZXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiAoKHJldCA9PSAwKSA/IDEgOiAwKTsKLX0KLQotaW50IGdldF93ZF9leHBfbW9kZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfd2RfZXhwX21vZGVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ4MjYsNyArNDUxOCw3IEBACiAJcmV0dXJuIHdkdF9leHBfbW9kZV9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfd2RfZXhwX21vZGVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHBhcmFtKQorc3RhdGljIGludCBzZXRfd2RfZXhwX21vZGVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHBhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDgzNCwxOSArNDUyNiw3IEBACiAJcmV0dXJuIHdkdF9leHBfbW9kZShwYnBjdGxfZGV2LCBwYXJhbSk7CiB9CiAKLWludCByZXNldF9jb250X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JaWYgKCFwYnBjdGxfZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQlyZXQgPSBjbW5kX29uKHBicGN0bF9kZXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiByZXNldF9jb250KHBicGN0bF9kZXYpOwotfQotCi1pbnQgc2V0X3R4X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0eF9zdGF0ZSkKK3N0YXRpYyBpbnQgc2V0X3R4X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0eF9zdGF0ZSkKIHsKIAogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC00ODY3LDcgKzQ1NDcsNyBAQAogCXJldHVybiBzZXRfdHgocGJwY3RsX2RldiwgdHhfc3RhdGUpOwogfQogCi1pbnQgc2V0X2JwX2ZvcmNlX2xpbmtfZm4oaW50IGRldl9udW0sIGludCB0eF9zdGF0ZSkKK3N0YXRpYyBpbnQgc2V0X2JwX2ZvcmNlX2xpbmtfZm4oaW50IGRldl9udW0sIGludCB0eF9zdGF0ZSkKIHsKIAlzdGF0aWMgc3RydWN0IGJwY3RsX2RldiAqYnBjdGxfZGV2X2N1cnI7CiAKQEAgLTQ4NzksNyArNDU1OSw3IEBACiAJcmV0dXJuIHNldF9icF9mb3JjZV9saW5rKGJwY3RsX2Rldl9jdXJyLCB0eF9zdGF0ZSk7CiB9CiAKLWludCBzZXRfd2RfYXV0b3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBwYXJhbSkKK3N0YXRpYyBpbnQgc2V0X3dkX2F1dG9yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgcGFyYW0pCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00ODg3LDcgKzQ1NjcsNyBAQAogCXJldHVybiBzZXRfYnlwYXNzX3dkX2F1dG8ocGJwY3RsX2RldiwgcGFyYW0pOwogfQogCi1pbnQgZ2V0X3dkX2F1dG9yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfd2RfYXV0b3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00OTE0LDcgKzQ1OTQsNyBAQAogCiAjZW5kaWYKIAotaW50IGdldF9ieXBhc3NfY2Fwc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX2NhcHNfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ5MjMsNyArNDYwMyw4IEBACiAKIH0KIAotaW50IGdldF9ieXBhc3Nfc2xhdmVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldiwgc3RydWN0IGJwY3RsX2RldiAqKnBicGN0bF9kZXZfb3V0KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3NsYXZlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsCisJCQkgICAgICAgc3RydWN0IGJwY3RsX2RldiAqKnBicGN0bF9kZXZfb3V0KQogewogCWludCBpZHhfZGV2ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00OTU1LDcgKzQ2MzYsNyBAQAogCQlyZXR1cm4gMDsKIH0KIAotaW50IGlzX2J5cGFzcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBpc19ieXBhc3Moc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ5NjYsNyArNDY0Nyw3IEBACiAJCXJldHVybiAwOwogfQogCi1pbnQgZ2V0X3R4X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDk4Niw3ICs0NjY3LDcgQEAKIAlyZXR1cm4gdHhfc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgZ2V0X2JwX2ZvcmNlX2xpbmtfZm4oaW50IGRldl9udW0pCitzdGF0aWMgaW50IGdldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtKQogewogCXN0YXRpYyBzdHJ1Y3QgYnBjdGxfZGV2ICpicGN0bF9kZXZfY3VycjsKIApAQCAtNTA0OSw3ICs0NzMwLDcgQEAKIAltb2RfdGltZXIoJnBicGN0bF9kZXYtPmJwX3RwbF90aW1lciwgamlmZmllcyArIEJQX0xJTktfTU9OX0RFTEFZICogSFopOwogfQogCi12b2lkIHJlbW92ZV9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyB2b2lkIHJlbW92ZV9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwogCWlmICghcGJwY3RsX2RldikKQEAgLTUwNjcsNyArNDc0OCw3IEBACiAJcmV0dXJuOwogfQogCi1pbnQgaW5pdF9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgaW5pdF9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTUwODAsNyArNDc2MSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBzZXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHVuc2lnbmVkIGludCBwYXJhbSkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc190cGxfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgcGFyYW0pCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC01MDk4LDE3ICs0Nzc5LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpZiAoIXBicGN0bF9kZXYpCi0JCXJldHVybiAtMTsKLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRQTF9DQVApCi0JCXJldHVybiBwYnBjdGxfZGV2LT5icF90cGxfZmxhZzsKLQotCXJldHVybiBCUF9OT1RfQ0FQOwotfQotCi1pbnQgc2V0X3RwbF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdHBsX21vZGUpCitzdGF0aWMgaW50IHNldF90cGxfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRwbF9tb2RlKQogewogCiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKQEAgLTUxMzgsNyArNDgwOSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfdHBsX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF90cGxfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC01MTUyLDcgKzQ4MjMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBzZXRfYnBfd2FpdF9hdF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2JwX3dhaXRfYXRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC01MTcyLDcgKzQ4NDMsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2JwX3dhaXRfYXRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnBfd2FpdF9hdF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNTE4NSw3ICs0ODU2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2V0X2JwX2h3X3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2JwX2h3X3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTUyMDUsNyArNDg3Niw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfYnBfaHdfcmVzZXRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2JwX2h3X3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNTIyMCw3ICs0ODkxLDcgQEAKIH0KIAogCi1pbnQgZ2V0X2J5cGFzc19pbmZvX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGNoYXIgKmRldl9uYW1lLAorc3RhdGljIGludCBnZXRfYnlwYXNzX2luZm9fZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgY2hhciAqZGV2X25hbWUsCiAJCSAgICAgICBjaGFyICphZGRfcGFyYW0pCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNTIzMiw3ICs0OTAzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGdldF9kZXZfaWR4X2JzZihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpCitzdGF0aWMgaW50IGdldF9kZXZfaWR4X2JzZihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpCiB7CiAJaW50IGlkeF9kZXYgPSAwOwogCWZvciAoaWR4X2RldiA9IDA7CkBAIC03MDIyLDEyICs2NjkzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2V0X3dkX2V4cF9tb2RlX3NkKTsKIAotaW50IHJlc2V0X2NvbnRfc2QoaW50IGlmaW5kZXgpCi17Ci0JcmV0dXJuIHJlc2V0X2NvbnRfZm4oZ2V0X2Rldl9pZHhfcChpZmluZGV4KSk7Ci0KLX0KLQogaW50IHNldF90eF9zZChpbnQgaWZpbmRleCwgaW50IHR4X3N0YXRlKQogewogCXJldHVybiBzZXRfdHhfZm4oZ2V0X2Rldl9pZHhfcChpZmluZGV4KSwgdHhfc3RhdGUpOwpAQCAtNzExOCw3ICs2NzgzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYnBfcHJvY2ZzX2RpcjsKIAotaW50IGJwX3Byb2NfY3JlYXRlKHZvaWQpCitzdGF0aWMgaW50IGJwX3Byb2NfY3JlYXRlKHZvaWQpCiB7CiAJYnBfcHJvY2ZzX2RpciA9IHByb2NfbWtkaXIoQlBfUFJPQ19ESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKIAlpZiAoYnBfcHJvY2ZzX2RpciA9PSAoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopMCkgewpAQCAtNzc0Niw3ICs3NDExLDcgQEAKIH0KIFJXX0ZPUFMod2RfYXV0b3Jlc2V0KQogCi1pbnQgYnlwYXNzX3Byb2NfY3JlYXRlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKQorc3RhdGljIGludCBieXBhc3NfcHJvY19jcmVhdGVfZGV2X3NkKHN0cnVjdCBicGN0bF9kZXYgKnBicF9kZXZpY2VfYmxvY2spCiB7CiAJc3RydWN0IGJ5cGFzc19wZnNfc2QgKmN1cnJlbnRfcGZzID0gJihwYnBfZGV2aWNlX2Jsb2NrLT5ieXBhc3NfcGZzX3NldCk7CiAJc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY2ZzX2RpcjsKQEAgLTc4MTYsNyArNzQ4MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jaykKK3N0YXRpYyBpbnQgYnlwYXNzX3Byb2NfcmVtb3ZlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKQogewogCiAJc3RydWN0IGJ5cGFzc19wZnNfc2QgKmN1cnJlbnRfcGZzID0gJnBicF9kZXZpY2VfYmxvY2stPmJ5cGFzc19wZnNfc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9ieXBhc3NsaWIvYnBfaW9jdGwuaAppbmRleCAyZDFlZjUzLi5iZjQ3Zjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9ieXBhc3NsaWIvYnBfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9ieXBhc3NsaWIvYnBfaW9jdGwuaApAQCAtNTEsOSArNTEsOSBAQAogI2RlZmluZSBXRFRfU1RFUF9USU1FICAgICAgICAgICAgICAweDEwCS8qIEJJVF80ICovCiAKICNkZWZpbmUgV0RfTUlOX1RJTUVfR0VUKGRlc2MpICAgKGRlc2MgJiAweGYpCi0jZGVmaW5lIFdEX1NURVBfQ09VTlRfR0VUKGRlc2MpIChkZXNjPj41KSAmIDB4ZgorI2RlZmluZSBXRF9TVEVQX0NPVU5UX0dFVChkZXNjKSAoKGRlc2M+PjUpICYgMHhmKQogCi10eXBlZGVmIGVudW0geworZW51bSB7CiAJSVNfQllQQVNTID0gMSwKIAlHRVRfQllQQVNTX1NMQVZFLAogCUdFVF9CWVBBU1NfQ0FQUywKQEAgLTEwMyw3ICsxMDMsNyBAQAogCVNFVF9CUF9IV19SRVNFVCwKIH0gQ01ORF9UWVBFOwogCi10eXBlZGVmIGVudW0geworZW51bSB7CiAJSUZfU0NBTl9TRCwKIAlHRVRfREVWX05VTV9TRCwKIAlJU19CWVBBU1NfU0QsCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogfSBDTU5EX1RZUEVfU0Q7CiAKLSNkZWZpbmUgU0lPQ0dJRkJZUEFTUyBTSU9DREVWUFJJVkFURSsxMAorI2RlZmluZSBTSU9DR0lGQllQQVNTIChTSU9DREVWUFJJVkFURSsxMCkKIAogc3RydWN0IGJwX2luZm8gewogCWNoYXIgcHJvZF9uYW1lWzE0XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2xpYmJwX3NkLmgKaW5kZXggM2I0ZjgzNi4uY2FjNGIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2xpYmJwX3NkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2xpYmJwX3NkLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXgKICAqCiAgKiBPdXRwdXQ6Ci0gKiAgMSAtICBpZiBkZXZpY2UgaXMgYnlwYXNzIGNvbnRyb2xsaW5nIGRldmljZSwgCisgKiAgMSAtICBpZiBkZXZpY2UgaXMgYnlwYXNzIGNvbnRyb2xsaW5nIGRldmljZSwKICAqICAwIC0gIGlmIGRldmljZSBpcyBieXBhc3Mgc2xhdmUgZGV2aWNlCiAgKiAtMSAtICBkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzCiAgKiovCkBAIC0zMCw3ICszMCw3IEBACiAgKgogICogT3V0cHV0OgogICogIG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBzbGF2ZSBkZXZpY2UKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9ieXBhc3Nfc2xhdmVfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMzksNTUgKzM5LDcyIEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4CiAgKgogICogT3V0cHV0OgotICogZmxhZ3Mgd29yZCBvbiBzdWNjZXNzO2ZsYWcgd29yZCBpcyBhIDMyLWJpdCBtYXNrIHdvcmQgd2l0aCBlYWNoIGJpdCBkZWZpbmVzIGRpZmZlcmVudCAKLSAqIGNhcGFiaWxpdHkgYXMgZGVzY3JpYmVkIGJlbGxvdy4KKyAqIGZsYWdzIHdvcmQgb24gc3VjY2VzcztmbGFnIHdvcmQgaXMgYSAzMi1iaXQgbWFzayB3b3JkIHdpdGggZWFjaCBiaXQgZGVmaW5lcworICogZGlmZmVyZW50IGNhcGFiaWxpdHkgYXMgZGVzY3JpYmVkIGJlbGxvdy4KICAqIFZhbHVlIG9mIDEgZm9yIHN1cHBvcnRpbmcgdGhpcyBmZWF0dXJlLiAwIGZvciBub3Qgc3VwcG9ydGluZyB0aGlzIGZlYXR1cmUuCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGlmIHRoZSBkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBub3QgYSBCeXBhc3MgZGV2aWNlKQotICogQml0CWZlYXR1cmUJICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uCi0gKiAKLSAqIDAJQlBfQ0FQCSAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIEJ5cGFzcyBjYXBhYmxlIGluIGdlbmVyYWwKLSAqIAotICogMQlCUF9TVEFUVVNfQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9mIHRoZSBjdXJyZW50IEJ5cGFzcyBtb2RlCi0gKiAKLSAqIDIJQlBfU1RBVFVTX0NIQU5HRV9DQVAJVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9uIGEgY2hhbmdlIHRvIGJ5cGFzcyBtb2RlIGZyb20gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IHRpbWUgdGhlIG1vZGUgd2FzIGRlZmluZWQKLSAqIAotICogMwlTV19DVExfQ0FQCSAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgU29mdHdhcmUgY29udHJvbGxlZCBjYXBhYmxlIGZvciBieXBhc3Mvbm9uIGJ5cGFzcyBtb2Rlcy4KLSAqIAotICogNAlCUF9ESVNfQ0FQCSAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgY2FwYWJsZSBvZiBkaXNhYmxpbmcgdGhlIEJ5cGFzcyBtb2RlIGF0IGFsbCB0aW1lcy4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSB3aWxsIHJldGFpbiBpdHMgbW9kZSBldmVuIGR1cmluZyBwb3dlciBsb3NzIGFuZCBhbHNvIGFmdGVyIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlciByZWNvdmVyeS4gVGhpcyB3aWxsIG92ZXJjb21lIG9uIGFueSBieXBhc3Mgb3BlcmF0aW9uIGR1ZSB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hkb2cgdGltZW91dCBvciBzZXQgYnlwYXNzIGNvbW1hbmQuCi0gKiAKLSAqIDUJQlBfRElTX1NUQVRVU19DQVAJICAgIFRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudCBESVNfQlBfQ0FQCi0gKiAKLSAqIDYJU1REX05JQ19DQVAJICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBjYXBhYmxlIHRvIGJlIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBhcyBzdGFuZGFyZCwgbm9uIEJ5cGFzcywgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQyBpbnRlcmZhY2UgKGhhdmUgZGlyZWN0IGNvbm5lY3Rpb24gdG8gaW50ZXJmYWNlcyBhdCBhbGwgcG93ZXIgbW9kZXMpCi0gKiAKLSAqIDcJQlBfUFdPRkZfTk9fQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gYmUgaW4gQnlwYXNzIG1vZGUgYXQgcG93ZXIgb2ZmIHN0YXRlCi0gKiAKLSAqIDgJQlBfUFdPRkZfT0ZGX0NBUAkgICAgVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCB0aGUgQnlwYXNzIG1vZGUgYXQgcG93ZXIgb2ZmIHN0YXRlIHdpdGhvdXQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGluZyBhbGwgdGhlIG90aGVyIHN0YXRlcyBvZiBvcGVyYXRpb24KLSAqIAotICogOQlCUF9QV09GRl9DVExfQ0FQCSAgICBUaGUgYmVoYXZpb3Igb2YgdGhlIEJ5cGFzcyBtb2RlIGF0IFBvd2VyLW9mZiBzdGF0ZSBjYW4gYmUgY29udHJvbGxlZCBieSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdHdhcmUgd2l0aG91dCBlZmZlY3RpbmcgYW55IG90aGVyIHN0YXRlCi0gKiAKLSAqMTAgICAgQlBfUFdVUF9PTl9DQVAJICAgICAgICBUaGUgaW50ZXJmYWNlIGNhbiBiZSBpbiBCeXBhc3MgbW9kZSB3aGVuIHBvd2VyIGlzIHR1cm5lZCBvbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVudGlsIHRoZSBzeXN0ZW0gdGFrZSBjb250cm9sIG9mIHRoZSBieXBhc3MgZnVuY3Rpb25hbGl0eSkKLSAqIAotICoxMQlCUF9QV1VQX09GRl9DQVAJICAgICAgICBUaGUgaW50ZXJmYWNlIGNhbiBkaXNjb25uZWN0IGZyb20gQnlwYXNzIG1vZGUgd2hlbiBwb3dlciBpcyB0dXJuZWQgb24gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnRpbCB0aGUgc3lzdGVtIHRha2UgY29udHJvbCBvZiB0aGUgYnlwYXNzIGZ1bmN0aW9uYWxpdHkpCi0gKiAKLSAqMTIJQlBfUFdVUF9DVExfQ0FQCSAgICAgICAgVGhlIGJlaGF2aW9yIG9mIHRoZSBCeXBhc3MgbW9kZSBhdCBQb3dlci11cCBjYW4gYmUgY29udHJvbGxlZCBieSBzb2Z0d2FyZQotICogCi0gKjEzCVdEX0NUTF9DQVAJICAgICAgICAgICAgVGhlIGludGVyZmFjZSBoYXMgd2F0Y2hkb2cgY2FwYWJpbGl0aWVzIHRvIHR1cm4gdG8gQnlwYXNzIG1vZGUgd2hlbiBub3QgcmVzZXQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZWZpbmVkIHBlcmlvZCBvZiB0aW1lLgotICogCi0gKjE0CVdEX1NUQVRVU19DQVAJICAgICAgICBUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgb24gdGhlIHdhdGNoZG9nIHN0YXR1cyAoQWN0aXZlL2luYWN0aXZlKQotICogCi0gKjE1CVdEX1RJTUVPVVRfQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IHRoZSB0aW1lIGxlZnQgdGlsbCB3YXRjaGRvZyB0cmlnZ2VycyB0byBCeXBhc3MgbW9kZS4KLSAqIAotICoxNi0zMSBSRVNFUlZFRAkKKyAqIC0xIC0gb24gZmFpbHVyZSAoaWYgdGhlIGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIG5vdCBhCisgKiAgQnlwYXNzIGRldmljZSkKKyAqIEJpdAlmZWF0dXJlCQkJZGVzY3JpcHRpb24KKyAqCisgKiAwCUJQX0NBUAkJCVRoZSBpbnRlcmZhY2UgaXMgQnlwYXNzIGNhcGFibGUgaW4gZ2VuZXJhbAorICoKKyAqIDEJQlBfU1RBVFVTX0NBUAkJVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9mIHRoZSBjdXJyZW50IEJ5cGFzcworICoJCQkJbW9kZQorICoKKyAqIDIJQlBfU1RBVFVTX0NIQU5HRV9DQVAJVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9uIGEgY2hhbmdlIHRvIGJ5cGFzcworICoJCQkJbW9kZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIG1vZGUgd2FzIGRlZmluZWQKKyAqCisgKiAzCVNXX0NUTF9DQVAJCVRoZSBpbnRlcmZhY2UgaXMgU29mdHdhcmUgY29udHJvbGxlZCBjYXBhYmxlIGZvcgorICoJCQkJYnlwYXNzL25vbiBieXBhc3MgbW9kZXMuCisgKgorICogNAlCUF9ESVNfQ0FQCQlUaGUgaW50ZXJmYWNlIGlzIGNhcGFibGUgb2YgZGlzYWJsaW5nIHRoZSBCeXBhc3MKKyAqCQkJCW1vZGUgYXQgYWxsIHRpbWVzLiAgVGhpcyBtb2RlIHdpbGwgcmV0YWluIGl0cworICoJCQkJbW9kZSBldmVuIGR1cmluZyBwb3dlciBsb3NzIGFuZCBhbHNvIGFmdGVyIHBvd2VyCisgKgkJCQlyZWNvdmVyeS4gVGhpcyB3aWxsIG92ZXJjb21lIG9uIGFueSBieXBhc3MKKyAqCQkJCW9wZXJhdGlvbiBkdWUgdG8gd2F0Y2hkb2cgdGltZW91dCBvciBzZXQgYnlwYXNzCisgKgkJCQljb21tYW5kLgorICoKKyAqIDUJQlBfRElTX1NUQVRVU19DQVAJVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9mIHRoZSBjdXJyZW50CisgKgkJCQlESVNfQlBfQ0FQCisgKgorICogNglTVERfTklDX0NBUAkJVGhlIGludGVyZmFjZSBpcyBjYXBhYmxlIHRvIGJlIGNvbmZpZ3VyZWQgdG8KKyAqCQkJCW9wZXJhdGUgYXMgc3RhbmRhcmQsIG5vbiBCeXBhc3MsIE5JQyBpbnRlcmZhY2UKKyAqCQkJCShoYXZlIGRpcmVjdCBjb25uZWN0aW9uIHRvIGludGVyZmFjZXMgYXQgYWxsCisgKgkJCQlwb3dlciBtb2RlcykKKyAqCisgKiA3CUJQX1BXT0ZGX05PX0NBUAkJVGhlIGludGVyZmFjZSBjYW4gYmUgaW4gQnlwYXNzIG1vZGUgYXQgcG93ZXIgb2ZmCisgKgkJCQlzdGF0ZQorICoKKyAqIDgJQlBfUFdPRkZfT0ZGX0NBUAlUaGUgaW50ZXJmYWNlIGNhbiBkaXNjb25uZWN0IHRoZSBCeXBhc3MgbW9kZSBhdAorICoJCQkJcG93ZXIgb2ZmIHN0YXRlIHdpdGhvdXQgZWZmZWN0aW5nIGFsbCB0aGUgb3RoZXIKKyAqCQkJCXN0YXRlcyBvZiBvcGVyYXRpb24KKyAqCisgKiA5CUJQX1BXT0ZGX0NUTF9DQVAJVGhlIGJlaGF2aW9yIG9mIHRoZSBCeXBhc3MgbW9kZSBhdCBQb3dlci1vZmYKKyAqCQkJCXN0YXRlIGNhbiBiZSBjb250cm9sbGVkIGJ5IHNvZnR3YXJlIHdpdGhvdXQKKyAqCQkJCWVmZmVjdGluZyBhbnkgb3RoZXIgc3RhdGUKKyAqCisgKjEwICBCUF9QV1VQX09OX0NBUAkJVGhlIGludGVyZmFjZSBjYW4gYmUgaW4gQnlwYXNzIG1vZGUgd2hlbiBwb3dlcgorICoJCQkJaXMgdHVybmVkIG9uICh1bnRpbCB0aGUgc3lzdGVtIHRha2UgY29udHJvbCBvZgorICoJCQkJdGhlIGJ5cGFzcyBmdW5jdGlvbmFsaXR5KQorICoKKyAqMTEJQlBfUFdVUF9PRkZfQ0FQCQlUaGUgaW50ZXJmYWNlIGNhbiBkaXNjb25uZWN0IGZyb20gQnlwYXNzIG1vZGUKKyAqCQkJCXdoZW4gcG93ZXIgaXMgdHVybmVkIG9uICh1bnRpbCB0aGUgc3lzdGVtIHRha2UKKyAqCQkJCWNvbnRyb2wgb2YgdGhlIGJ5cGFzcyBmdW5jdGlvbmFsaXR5KQorICoKKyAqMTIJQlBfUFdVUF9DVExfQ0FQCQlUaGUgYmVoYXZpb3Igb2YgdGhlIEJ5cGFzcyBtb2RlIGF0IFBvd2VyLXVwIGNhbgorICoJCQkJYmUgY29udHJvbGxlZCBieSBzb2Z0d2FyZQorICoKKyAqMTMJV0RfQ1RMX0NBUAkJVGhlIGludGVyZmFjZSBoYXMgd2F0Y2hkb2cgY2FwYWJpbGl0aWVzIHRvIHR1cm4KKyAqCQkJCXRvIEJ5cGFzcyBtb2RlIHdoZW4gbm90IHJlc2V0IGZvciBkZWZpbmVkIHBlcmlvZAorICoJCQkJb2YgdGltZS4KKyAqCisgKjE0CVdEX1NUQVRVU19DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvbiB0aGUgd2F0Y2hkb2cgc3RhdHVzCisgKgkJCQkoQWN0aXZlL2luYWN0aXZlKQorICoKKyAqMTUJV0RfVElNRU9VVF9DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCB0aGUgdGltZSBsZWZ0IHRpbGwKKyAqCQkJCXdhdGNoZG9nIHRyaWdnZXJzIHRvIEJ5cGFzcyBtb2RlLgorICoKKyAqMTYtMzEgUkVTRVJWRUQKICAqCiAgKiAqKi8KIGludCBnZXRfYnlwYXNzX2NhcHNfc2QoaW50IGlmX2luZGV4KTsKQEAgLTk3LDM0ICsxMTQsMzUgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXgKICAqCiAgKiBPdXRwdXQ6Ci0gKiAKLSAqIFNldCBvZiBudW1iZXJzIGRlZmluaW5nIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMgb2YgdGhlIHdhdGNoZG9nIGNhcGFibGUgCisgKgorICogU2V0IG9mIG51bWJlcnMgZGVmaW5pbmcgdGhlIHZhcmlvdXMgcGFyYW1ldGVycyBvZiB0aGUgd2F0Y2hkb2cgY2FwYWJsZQogICogdG8gYmUgc2V0IHRvIGFzIGRlc2NyaWJlZCBiZWxsb3cuCiAgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKLSAqIAorICoKICAqIEJpdAlmZWF0dXJlCSAgICAgICAgZGVzY3JpcHRpb24KLSAqIAorICoKICAqIDAtMwlXRF9NSU5fVElNRQkgICAgVGhlIGludGVyZmFjZSBXRCBtaW5pbWFsIHRpbWUgcGVyaW9kICBpbiAxMDBtUyB1bml0cwotICogCi0gKiA0CVdEX1NURVBfVElNRQlUaGUgc3RlcHMgb2YgdGhlIFdEIHRpbWVyIGluIAorICoKKyAqIDQJV0RfU1RFUF9USU1FCVRoZSBzdGVwcyBvZiB0aGUgV0QgdGltZXIgaW4KICAqICAgICAgICAgICAgICAgICAgICAgIDAgLSBmb3IgbGluZWFyIHN0ZXBzIChXRF9NSU5fVElNRSAqIFgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAxIC0gZm9yIG11bHRpcGx5IGJ5IDIgZnJvbSBwcmV2aW91cyBzdGVwIChXRF9NSU5fVElNRSAqIDJeWCkKLSAqIAotICogNS04CVdEX1NURVBfQ09VTlQJTnVtYmVyIG9mIHN0ZXBzIHRoZSBXRCB0aW1lciBzdXBwb3J0cyBpbiAyXlggCisgKiAgICAgICAgICAgICAgICAgICAgICAxIC0gZm9yIG11bHRpcGx5IGJ5IDIgZnJvbSBwcmV2aW91cyBzdGVwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKFdEX01JTl9USU1FICogMl5YKQorICoKKyAqIDUtOAlXRF9TVEVQX0NPVU5UCU51bWJlciBvZiBzdGVwcyB0aGUgV0QgdGltZXIgc3VwcG9ydHMgaW4gMl5YCiAgKiAgICAgICAgICAgICAgICAgICAgICAoWCBiaXQgYXZhaWxhYmxlIGZvciBkZWZpbmluZyB0aGUgdmFsdWUpCi0gKiAKLSAqIAotICogCisgKgorICoKKyAqCiAgKiovCiBpbnQgZ2V0X3dkX3NldF9jYXBzX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X2J5cGFzcyAtIHNldCBCeXBhc3Mgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQGJ5cGFzc19tb2RlOiAgYnlwYXNzIG1vZGUgKDE9b24sIDA9b2ZmKSAKKyAqIEBieXBhc3NfbW9kZTogIGJ5cGFzcyBtb2RlICgxPW9uLCAwPW9mZikKICAqIE91dHB1dDoKICAqICAwIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc19zZChpbnQgaWZfaW5kZXgsIGludCBieXBhc3NfbW9kZSk7CiAKQEAgLTEzMyw3ICsxNTEsNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc19zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0xNDIsNyArMTYwLDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9ieXBhc3NfY2hhbmdlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTE1Miw4ICsxNzAsOCBAQAogICogQGRpc19ieXBhc3M6IGRpc2FibGUgYnlwYXNzKDE9ZGlzLCAwPWVuKQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfZGlzX2J5cGFzc19zZChpbnQgaWZfaW5kZXgsIGludCBkaXNfYnlwYXNzKTsKIApAQCAtMTYyLDggKzE4MCw4IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSBvbiBzdWNjZXNzIChub3JtYWwgQnlwYXNzIG1vZGUvIERpc2FibGUgYnlwYXNzKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2Rpc19ieXBhc3Nfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMTcyLDkgKzE5MCw5IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIEBieXBhc3NfbW9kZTogYnlwYXNzIG1vZGUgc2V0dGluZyBhdCBwb3dlciBvZmYgc3RhdGUgKDE9QlAgZW4sIDA9QlAgRGlzKQogICogT3V0cHV0OgotICogIDAgLSBvbiBzdWNjZXNzIAotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogIDAgLSBvbiBzdWNjZXNzCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfYnlwYXNzX3B3b2ZmX3NkKGludCBpZl9pbmRleCwgaW50IGJ5cGFzc19tb2RlKTsKIApAQCAtMTgzLDggKzIwMSw4IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSBvbiBzdWNjZXNzIChEaXNhYmxlIGJ5cGFzcyBhdCBwb3dlciBvZmYgc3RhdGUgLyBub3JtYWwgQnlwYXNzIG1vZGUpCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX3B3b2ZmX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTE5Myw5ICsyMTEsOSBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBAYnlwYXNzX21vZGU6IGJ5cGFzcyBtb2RlIHNldHRpbmcgYXQgcG93ZXIgdXAgc3RhdGUgKDE9QlAgZW4sIDA9QlAgRGlzKQogICogT3V0cHV0OgotICogIDAgLSBvbiBzdWNjZXNzIAotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogIDAgLSBvbiBzdWNjZXNzCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfYnlwYXNzX3B3dXBfc2QoaW50IGlmX2luZGV4LCBpbnQgYnlwYXNzX21vZGUpOwogCkBAIC0yMDQsNTkgKzIyMiw2MCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBieXBhc3MgYXQgcG93ZXIgdXAgc3RhdGUgLyBub3JtYWwgQnlwYXNzIG1vZGUpCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX3B3dXBfc2QoaW50IGlmX2luZGV4KTsKIAogLyoqCiAgKiBzZXRfYnlwYXNzX3dkIC0gU2V0IHdhdGNoZG9nIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBtc190aW1lb3V0OiByZXF1ZXN0ZWQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCAwIGZvciBkaXNhYmxpbmcgdGhlIHdhdGNoZG9nIHRpbWVyCi0gKiBAbXNfdGltZW91dF9zZXQob3V0cHV0KTogcmVxdWVzdGVkIHRpbWVvdXQgKGluIG1zIHVuaXRzKSwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgYWRhcHRlciBzdXBwb3J0cyBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSB3YXRjaGRvZworICogQG1zX3RpbWVvdXQ6IHJlcXVlc3RlZCB0aW1lb3V0IChpbiBtcyB1bml0cyksIDAgZm9yIGRpc2FibGluZyB0aGUgd2F0Y2hkb2cKKyAqICAgICAgICAgICAgICB0aW1lcgorICogQG1zX3RpbWVvdXRfc2V0KG91dHB1dCk6IHJlcXVlc3RlZCB0aW1lb3V0IChpbiBtcyB1bml0cyksIHRoYXQgdGhlIGFkYXB0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSB3YXRjaGRvZwogICogT3V0cHV0OgotICogMCAgLSBvbiBzdWNjZXNzIAotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogMCAgLSBvbiBzdWNjZXNzCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfYnlwYXNzX3dkX3NkKGludCBpZl9pbmRleCwgaW50IG1zX3RpbWVvdXQsIGludCAqbXNfdGltZW91dF9zZXQpOwogCiAvKioKICAqIGdldF9ieXBhc3Nfd2QgLSBHZXQgd2F0Y2hkb2cgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQG1zX3RpbWVvdXQgKG91dHB1dCk6IFdEVCB0aW1lb3V0IChpbiBtcyB1bml0cyksIAorICogQG1zX3RpbWVvdXQgKG91dHB1dCk6IFdEVCB0aW1lb3V0IChpbiBtcyB1bml0cyksCiAgKiAgICAgICAgICAgICAgICAgICAgICAgLTEgZm9yIHVua25vd24gd2R0IHN0YXR1cwogICogICAgICAgICAgICAgICAgICAgICAgICAwIGlmIFdEVCBpcyBkaXNhYmxlZAogICogT3V0cHV0OgogICogMCAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX3dkX3NkKGludCBpZl9pbmRleCwgaW50ICptc190aW1lb3V0X3NldCk7CiAKIC8qKgogICogZ2V0X3dkX2V4cGlyZV90aW1lIC0gR2V0IHdhdGNoZG9nIGV4cGlyZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAbXNfdGltZV9sZWZ0IChvdXRwdXQpOiB0aW1lIGxlZnQgdGlsbCB3YXRjaGRvZyB0aW1lIGV4cGlyZSwgCisgKiBAbXNfdGltZV9sZWZ0IChvdXRwdXQpOiB0aW1lIGxlZnQgdGlsbCB3YXRjaGRvZyB0aW1lIGV4cGlyZSwKICAqICAgICAgICAgICAgICAgICAgICAgICAtMSBpZiBXRFQgaGFzIGV4cGlyZWQKICAqICAgICAgICAgICAgICAgICAgICAgICAwICBpZiBXRFQgaXMgZGlzYWJsZWQKICAqIE91dHB1dDoKICAqIDAgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQgc3RhdHVzKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgIEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0IHN0YXR1cykKICAqKi8KIGludCBnZXRfd2RfZXhwaXJlX3RpbWVfc2QoaW50IGlmX2luZGV4LCBpbnQgKm1zX3RpbWVfbGVmdCk7CiAKIC8qKgogICogcmVzZXRfYnlwYXNzX3dkX3RpbWVyIC0gUmVzZXQgd2F0Y2hkb2cgdGltZXIKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogCisgKgogICogT3V0cHV0OgogICogMSAgLSBvbiBzdWNjZXNzCiAgKiAwIC0gd2F0Y2hkb2cgaXMgbm90IGNvbmZpZ3VyZWQKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0IHN0YXR1cykgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdCBzdGF0dXMpCiAgKiovCiBpbnQgcmVzZXRfYnlwYXNzX3dkX3RpbWVyX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTI2NCw1MyArMjgzLDU0IEBACiAgKiBzZXRfc3RkX25pYyAtIFN0YW5kYXJkIE5JQyBtb2RlIG9mIG9wZXJhdGlvbgogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBAbmljX21vZGU6IDAvMSAoRGVmYXVsdCBCeXBhc3MgbW9kZSAvIFN0YW5kYXJkIE5JQyBtb2RlKQotICogCisgKgogICogT3V0cHV0OgogICogMCAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfc3RkX25pY19zZChpbnQgaWZfaW5kZXgsIGludCBuaWNfbW9kZSk7CiAKIC8qKgogICogZ2V0X3N0ZF9uaWMgLSBHZXQgU3RhbmRhcmQgTklDIG1vZGUgc2V0dGluZwogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiAKKyAqCiAgKiBPdXRwdXQ6CiAgKiAwLzEgKERlZmF1bHQgQnlwYXNzIG1vZGUgLyBTdGFuZGFyZCBOSUMgbW9kZSkgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3N0ZF9uaWNfc2QoaW50IGlmX2luZGV4KTsKIAogLyoqCi0gKiBzZXRfdHggLSBzZXQgdHJhbnNtaXR0ZXIgZW5hYmxlL2Rpc2FibGUgCisgKiBzZXRfdHggLSBzZXQgdHJhbnNtaXR0ZXIgZW5hYmxlL2Rpc2FibGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogQHR4X3N0YXRlOiAwLzEgKFRyYW5zbWl0IERpc2FibGUgLyBUcmFuc21pdCBFbmFibGUpCi0gKiAKKyAqCiAgKiBPdXRwdXQ6CiAgKiAwICAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gKQogICoqLwogaW50IHNldF90eF9zZChpbnQgaWZfaW5kZXgsIGludCB0eF9zdGF0ZSk7CiAKIC8qKgogICogZ2V0X3N0ZF9uaWMgLSBnZXQgdHJhbnNtaXR0ZXIgc3RhdGUgKGRpc2FibGUgLyBlbmFibGUpCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIAorICoKICAqIE91dHB1dDoKICAqIDAvMSAocmFuc21pdCBEaXNhYmxlIC8gVHJhbnNtaXQgRW5hYmxlKSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcykgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3MpCiAgKiovCiBpbnQgZ2V0X3R4X3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X3RhcCAtIHNldCBUQVAgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQHRhcF9tb2RlOiAxIHRhcCBtb2RlICwgMCBub3JtYWwgbmljIG1vZGUgCisgKiBAdGFwX21vZGU6IDEgdGFwIG1vZGUgLCAwIG5vcm1hbCBuaWMgbW9kZQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfdGFwX3NkKGludCBpZl9pbmRleCwgaW50IHRhcF9tb2RlKTsKIApAQCAtMzE5LDcgKzMzOSw3IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSAob2ZmL29uKSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfdGFwX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTMyOCw3ICszNDgsNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3RhcF9jaGFuZ2Vfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMzM4LDggKzM1OCw4IEBACiAgKiBAZGlzX3RhcDogZGlzYWJsZSB0YXAoMT1kaXMsIDA9ZW4pCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgIFRBUCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF9kaXNfdGFwX3NkKGludCBpZl9pbmRleCwgaW50IGRpc190YXApOwogCkBAIC0zNDgsOCArMzY4LDggQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKG5vcm1hbCBUQVAgbW9kZS8gRGlzYWJsZSBUQVApCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfZGlzX3RhcF9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0zNTgsOSArMzc4LDkgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogQGJ5cGFzc19tb2RlOiB0YXAgbW9kZSBzZXR0aW5nIGF0IHBvd2VyIHVwIHN0YXRlICgxPVRBUCBlbiwgMD1UQVAgRGlzKQogICogT3V0cHV0OgotICogIDAgLSBvbiBzdWNjZXNzIAotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBUQVAgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogIDAgLSBvbiBzdWNjZXNzCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfdGFwX3B3dXBfc2QoaW50IGlmX2luZGV4LCBpbnQgdGFwX21vZGUpOwogCkBAIC0zNjksMTggKzM4OSwxOCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBUQVAgYXQgcG93ZXIgdXAgc3RhdGUgLyBub3JtYWwgVEFQIG1vZGUpCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfdGFwX3B3dXBfc2QoaW50IGlmX2luZGV4KTsKIAogLyoqCiAgKiBzZXRfYnBfZGlzYyAtIHNldCBEaXNjb25uZWN0IHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEB0YXBfbW9kZTogMSBkaXNjIG1vZGUgLCAwIG5vbi1kaXNjIG1vZGUgCisgKiBAdGFwX21vZGU6IDEgZGlzYyBtb2RlICwgMCBub24tZGlzYyBtb2RlCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2JwX2Rpc2Nfc2QoaW50IGlmX2luZGV4LCBpbnQgZGlzY19tb2RlKTsKIApAQCAtMzg5LDcgKzQwOSw3IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSAob2ZmL29uKSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9icF9kaXNjX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTM5OCw3ICs0MTgsNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnBfZGlzY19jaGFuZ2Vfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtNDA4LDggKzQyOCw4IEBACiAgKiBAZGlzX3RhcDogZGlzYWJsZSB0YXAoMT1kaXMsIDA9ZW4pCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF9icF9kaXNfZGlzY19zZChpbnQgaWZfaW5kZXgsIGludCBkaXNfZGlzYyk7CiAKQEAgLTQxOCw4ICs0MzgsOCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAobm9ybWFsIERpc2Nvbm5lY3QgbW9kZS8gRGlzYWJsZSBEaXNjb25uZWN0KQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnBfZGlzX2Rpc2Nfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtNDI4LDkgKzQ0OCw5IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIEBkaXNjX21vZGU6IHRhcCBtb2RlIHNldHRpbmcgYXQgcG93ZXIgdXAgc3RhdGUgKDE9RGlzYyBlbiwgMD1EaXNjIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAgMCAtIG9uIHN1Y2Nlc3MKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfYnBfZGlzY19wd3VwX3NkKGludCBpZl9pbmRleCwgaW50IGRpc2NfbW9kZSk7CiAKQEAgLTQzOCwxOSArNDU4LDIwIEBACiAgKiBnZXRfYnBfZGlzY19wd3VwIC0gR2V0IERpc2Nvbm5lY3QgbW9kZSBzdGF0ZSBhdCBwb3dlci11cCBzdGF0ZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6Ci0gKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBEaXNjb25uZWN0IGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIERpc2Nvbm5lY3QgbW9kZSkKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwLzEgLSBvbiBzdWNjZXNzIChEaXNhYmxlIERpc2Nvbm5lY3QgYXQgcG93ZXIgdXAgc3RhdGUgLyBub3JtYWwgRGlzY29ubmVjdAorICogICAgICAgICAgICAgICAgICAgIG1vZGUpCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnBfZGlzY19wd3VwX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X3dkX2V4cF9tb2RlIC0gU2V0IGFkYXB0ZXIgc3RhdGUgd2hlbiBXRFQgZXhwaXJlZC4KICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQGJ5cGFzc19tb2RlOiAgYWRhcHRlciBtb2RlICgxPXRhcCBtb2RlLCAwPWJ5cGFzcyBtb2RlKSAKKyAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkKICAqIE91dHB1dDoKICAqICAwIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3dkX2V4cF9tb2RlX3NkKGludCBpZl9pbmRleCwgaW50IGJ5cGFzc19tb2RlKTsKIApAQCAtNDU5LDM5ICs0ODAsNDEgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChieXBhc3MvdGFwKSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfd2RfZXhwX21vZGVfc2QoaW50IGlmX2luZGV4KTsKIAogLyoqCiAgKiBzZXRfd2RfYXV0b3Jlc2V0IC0gcmVzZXQgV0RUIHBlcmlvZGljYWxseS4KICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQGJ5cGFzc19tb2RlOiAgYWRhcHRlciBtb2RlICgxPXRhcCBtb2RlLCAwPWJ5cGFzcyBtb2RlKSAKKyAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkKICAqIE91dHB1dDoKICAqIDEgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQgc3RhdHVzKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0CisgKiAgICAgICAgICAgICAgICAgIHN0YXR1cykKICAqKi8KIGludCBzZXRfd2RfYXV0b3Jlc2V0X3NkKGludCBpZl9pbmRleCwgaW50IHRpbWUpOwogCiAvKioKICAqIHNldF93ZF9hdXRvcmVzZXQgLSByZXNldCBXRFQgcGVyaW9kaWNhbGx5LgogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAYnlwYXNzX21vZGU6ICBhZGFwdGVyIG1vZGUgKDE9dGFwIG1vZGUsIDA9YnlwYXNzIG1vZGUpIAorICogQGJ5cGFzc19tb2RlOiAgYWRhcHRlciBtb2RlICgxPXRhcCBtb2RlLCAwPWJ5cGFzcyBtb2RlKQogICogT3V0cHV0OgogICogMSAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdCBzdGF0dXMpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQKKyAqICAgICAgICAgICAgICAgICAgc3RhdHVzKQogICoqLwogaW50IGdldF93ZF9hdXRvcmVzZXRfc2QoaW50IGlmX2luZGV4KTsKIAogLyoqCiAgKiBzZXRfdHBsIC0gc2V0IFRQTCBzdGF0ZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAdHBsX21vZGU6IDEgdHBsIG1vZGUgLCAwIG5vcm1hbCBuaWMgbW9kZSAKKyAqIEB0cGxfbW9kZTogMSB0cGwgbW9kZSAsIDAgbm9ybWFsIG5pYyBtb2RlCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRQTCkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUUEwpCiAgKiovCiBpbnQgc2V0X3RwbF9zZChpbnQgaWZfaW5kZXgsIGludCB0cGxfbW9kZSk7CiAKQEAgLTUwMCw3ICs1MjMsNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVFBMIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVFBMIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3RwbF9zZChpbnQgaWZfaW5kZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9SRUFETUUKaW5kZXggNTMwNTJjNC4uNGZhNTBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1JFQURNRQpAQCAtNSw0MyArNSwzIEBACiAJS2FsYWhhcmkgY2FyZHMgKGR1YWwgYW5kIHF1YWQgcG9ydCBQQ0ktZSBHaWdhYml0KSBjb3BwZXIgYW5kIGZpYmVyCiAKIFRoZSBkcml2ZXIgd2FzIGFjdHVhbGx5IHRlc3RlZCBvbiBPYXNpcyBhbmQgS2FsYWhhcmkgY2FyZHMuCi0KLVRPRE86Ci0JLSBtb3ZlIGZpcm13YXJlIGxvYWRpbmcgdG8gcmVxdWVzdF9maXJtd2FyZSgpCi0JLSByZW1vdmUgZGlyZWN0IG1lbW9yeSBhY2Nlc3Mgb2Ygc3RydWN0dXJlcwotCS0gYW55IHJlbWFpbmluZyBzcGFyc2UgYW5kIGNoZWNrcGF0Y2gucGwgd2FybmluZ3MKLQotCS0gdXNlIG5ldF9kZXZpY2Vfb3BzCi0JLSB1c2UgZGV2LT5zdGF0cyByYXRoZXIgdGhhbiBhZGFwdGVyLT5zdGF0cwotCS0gZG9uJ3QgY2FzdCBuZXRkZXZfcHJpdiBpdCBpcyBhbHJlYWR5IHZvaWQKLQktIEdFVCBSSUQgT0YgTUFDUk9TCi0JLSB3b3JrIG9uIGFsbCBhcmNoaXRlY3R1cmVzCi0JICAgLSB3aXRob3V0IENPTkZJR19YODZfNjQgY29uZnVzaW9uCi0JICAgLSBkbyA2NCBiaXQgY29ycmVjdGx5Ci0JICAgLSBkb24ndCBkZXBlbmQgb24gb3JkZXIgb2YgdW5pb24KLQktIGdldCByaWQgb2YgQVNTRVJUKCksIHVzZSBCVUcoKSBpbnN0ZWFkIGJ1dCBvbmx5IHdoZXJlIG5lY2Vzc2FyeQotCSAgbG9va3MgbGlrZSBtb3N0IGFyZW4ndCByZWFsbHkgdXNlZnVsCi0JLSBubyBuZXcgU0lPQ0RFVlBSSVZBVEUgaW9jdGwgYWxsb3dlZAotCS0gZG9uJ3QgdXNlIG1vZHVsZV9wYXJhbSBmb3IgY29uZmlndXJpbmcgaW50ZXJydXB0IG1pdGlnYXRpb24KLQkgIHVzZSBldGh0b29sIGluc3RlYWQKLQktIHJlb3JkZXIgY29kZSB0byBlbG1pbmF0ZSB1c2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMKLQktIGRvbid0IGtlZXAgcHJpdmF0ZSBsaW5rZWQgbGlzdCBvZiBkcml2ZXJzLgotCS0gcmVtb3ZlIGFsbCB0aGUgZ3JhdGl1dG91cyBkZWJ1ZyBpbmZyYXN0cnVjdHVyZQotCS0gdXNlIFBDSV9ERVZJQ0UoKQotCS0gZG8gZXRodG9vbCBjb3JyZWN0bHkgdXNpbmcgZXRodG9vbF9vcHMKLQktIE5BUEk/Ci0JLSB3YXN0ZWQgb3ZlcmhlYWQgb2YgZXh0cmEgc3RhdHMKLQktIHN0YXRlIHZhcmlhYmxlcyBmb3IgdGhpbmdzIHRoYXQgYXJlCi0JICBlYXNpbHkgYXZhaWxhYmxlIGFuZCBzaG91bGRuJ3QgYmUga2VwdCBpbiBjYXJkIHN0cnVjdHVyZSwgY2FyZG51bSwgLi4uCi0JICBzbG90bnVtYmVyLCBldmVudHMsIC4uLgotCS0gZ2V0IHJpZCBvZiBzbGljX3NwaW5sb2NrIHdyYXBwZXIKLQktIHZvbGF0aWxlID09IGJhZCBkZXNpZ24gPT4gYmFkIGNvZGUKLQktIGxvY2tpbmcgdG9vIGZpbmUgZ3JhaW5lZCwgbm90IGRlc2lnbmVkIGp1c3QgdGhyb3cgbW9yZSBsb2NrcwotCSAgYXQgcHJvYmxlbQotCi0KLVBsZWFzZSBzZW5kIHBhdGNoZXMgdG86Ci0gICAgICAgIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+Ci1hbmQgQ2M6IExpb3IgRG90YW4gPGxpb2RvdEBnbWFpbC5jb20+IGFuZCBDaHJpc3RvcGhlciBIYXJyZXIKLTxjaGFycmVyQGFsYWNyaXRlY2guY29tPiBhcyB3ZWxsIGFzIHRoZXkgYXJlIGFsc28gYWJsZSB0byB0ZXN0IG91dCBhbnkKLWNoYW5nZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZmMTAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvVE9ETwpAQCAtMCwwICsxLDM4IEBACitUT0RPOgorCS0gbW92ZSBmaXJtd2FyZSBsb2FkaW5nIHRvIHJlcXVlc3RfZmlybXdhcmUoKQorCS0gcmVtb3ZlIGRpcmVjdCBtZW1vcnkgYWNjZXNzIG9mIHN0cnVjdHVyZXMKKwktIGFueSByZW1haW5pbmcgc3BhcnNlIGFuZCBjaGVja3BhdGNoLnBsIHdhcm5pbmdzCisKKwktIHVzZSBuZXRfZGV2aWNlX29wcworCS0gdXNlIGRldi0+c3RhdHMgcmF0aGVyIHRoYW4gYWRhcHRlci0+c3RhdHMKKwktIGRvbid0IGNhc3QgbmV0ZGV2X3ByaXYgaXQgaXMgYWxyZWFkeSB2b2lkCisJLSBHRVQgUklEIE9GIE1BQ1JPUworCS0gd29yayBvbiBhbGwgYXJjaGl0ZWN0dXJlcworCSAgIC0gd2l0aG91dCBDT05GSUdfWDg2XzY0IGNvbmZ1c2lvbgorCSAgIC0gZG8gNjQgYml0IGNvcnJlY3RseQorCSAgIC0gZG9uJ3QgZGVwZW5kIG9uIG9yZGVyIG9mIHVuaW9uCisJLSBnZXQgcmlkIG9mIEFTU0VSVCgpLCB1c2UgQlVHKCkgaW5zdGVhZCBidXQgb25seSB3aGVyZSBuZWNlc3NhcnkKKwkgIGxvb2tzIGxpa2UgbW9zdCBhcmVuJ3QgcmVhbGx5IHVzZWZ1bAorCS0gbm8gbmV3IFNJT0NERVZQUklWQVRFIGlvY3RsIGFsbG93ZWQKKwktIGRvbid0IHVzZSBtb2R1bGVfcGFyYW0gZm9yIGNvbmZpZ3VyaW5nIGludGVycnVwdCBtaXRpZ2F0aW9uCisJICB1c2UgZXRodG9vbCBpbnN0ZWFkCisJLSByZW9yZGVyIGNvZGUgdG8gZWxtaW5hdGUgdXNlIG9mIGZvcndhcmQgZGVjbGFyYXRpb25zCisJLSBkb24ndCBrZWVwIHByaXZhdGUgbGlua2VkIGxpc3Qgb2YgZHJpdmVycy4KKwktIHJlbW92ZSBhbGwgdGhlIGdyYXRpdXRvdXMgZGVidWcgaW5mcmFzdHJ1Y3R1cmUKKwktIHVzZSBQQ0lfREVWSUNFKCkKKwktIGRvIGV0aHRvb2wgY29ycmVjdGx5IHVzaW5nIGV0aHRvb2xfb3BzCisJLSBOQVBJPworCS0gd2FzdGVkIG92ZXJoZWFkIG9mIGV4dHJhIHN0YXRzCisJLSBzdGF0ZSB2YXJpYWJsZXMgZm9yIHRoaW5ncyB0aGF0IGFyZQorCSAgZWFzaWx5IGF2YWlsYWJsZSBhbmQgc2hvdWxkbid0IGJlIGtlcHQgaW4gY2FyZCBzdHJ1Y3R1cmUsIGNhcmRudW0sIC4uLgorCSAgc2xvdG51bWJlciwgZXZlbnRzLCAuLi4KKwktIGdldCByaWQgb2Ygc2xpY19zcGlubG9jayB3cmFwcGVyCisJLSB2b2xhdGlsZSA9PSBiYWQgZGVzaWduID0+IGJhZCBjb2RlCisJLSBsb2NraW5nIHRvbyBmaW5lIGdyYWluZWQsIG5vdCBkZXNpZ25lZCBqdXN0IHRocm93IG1vcmUgbG9ja3MKKwkgIGF0IHByb2JsZW0KKworUGxlYXNlIHNlbmQgcGF0Y2hlcyB0bzoKKyAgICAgICAgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KK2FuZCBDYzogTGlvciBEb3RhbiA8bGlvZG90QGdtYWlsLmNvbT4gYW5kIENocmlzdG9waGVyIEhhcnJlcgorPGNoYXJyZXJAYWxhY3JpdGVjaC5jb20+IGFzIHdlbGwgYXMgdGhleSBhcmUgYWxzbyBhYmxlIHRvIHRlc3Qgb3V0IGFueQorY2hhbmdlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAppbmRleCA0Yzc4MjJiLi43MDI5MDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCkBAIC00NjQsOSArNDY0LDEyIEBACiAJLyoKIAkqICBTTElDIEhhbmRsZXMKIAkqLwotCXN0cnVjdCBzbGljX2hhbmRsZSBzbGljX2hhbmRsZXNbU0xJQ19DTURRX01BWENNRFMrMV07IC8qIE9iamVjdCBoYW5kbGVzKi8KLQlzdHJ1Y3Qgc2xpY19oYW5kbGUgKnBmcmVlX3NsaWNfaGFuZGxlczsgICAgICAgICAgLyogRnJlZSBvYmplY3QgaGFuZGxlcyovCi0Jc3RydWN0IHNsaWNfc3BpbmxvY2sgICAgIGhhbmRsZV9sb2NrOyAgICAgICAgICAgLyogT2JqZWN0IGhhbmRsZSBsaXN0IGxvY2sqLworCS8qIE9iamVjdCBoYW5kbGVzKi8KKwlzdHJ1Y3Qgc2xpY19oYW5kbGUgc2xpY19oYW5kbGVzW1NMSUNfQ01EUV9NQVhDTURTKzFdOworCS8qIEZyZWUgb2JqZWN0IGhhbmRsZXMqLworCXN0cnVjdCBzbGljX2hhbmRsZSAqcGZyZWVfc2xpY19oYW5kbGVzOworCS8qIE9iamVjdCBoYW5kbGUgbGlzdCBsb2NrKi8KKwlzdHJ1Y3Qgc2xpY19zcGlubG9jayAgICAgaGFuZGxlX2xvY2s7CiAJdXNob3J0ICAgICAgICAgICAgICBzbGljX2hhbmRsZV9peDsKIAogCXUzMiAgICAgICAgICAgICB4bWl0cV9mdWxsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCmluZGV4IDE0MjZjYTQuLmUyN2I4OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKQEAgLTEwMCwxMSArMTAwLDExIEBACiAjaW5jbHVkZSAic2xpYy5oIgogCiBzdGF0aWMgdWludCBzbGljX2ZpcnN0X2luaXQgPSAxOwotc3RhdGljIGNoYXIgKnNsaWNfYmFubmVyID0gIkFsYWNyaXRlY2ggU0xJQyBUZWNobm9sb2d5KHRtKSBTZXJ2ZXIgIlwKK3N0YXRpYyBjaGFyICpzbGljX2Jhbm5lciA9ICJBbGFjcml0ZWNoIFNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICIKIAkJImFuZCBTdG9yYWdlIEFjY2VsZXJhdG9yIChOb24tQWNjZWxlcmF0ZWQpIjsKIAogc3RhdGljIGNoYXIgKnNsaWNfcHJvY192ZXJzaW9uID0gIjIuMC4zNTEgIDIwMDYvMDcvMTQgMTI6MjY6MDAiOwotc3RhdGljIGNoYXIgKnNsaWNfcHJvZHVjdF9uYW1lID0gIlNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICJcCitzdGF0aWMgY2hhciAqc2xpY19wcm9kdWN0X25hbWUgPSAiU0xJQyBUZWNobm9sb2d5KHRtKSBTZXJ2ZXIgIgogCQkiYW5kIFN0b3JhZ2UgQWNjZWxlcmF0b3IgKE5vbi1BY2NlbGVyYXRlZCkiOwogc3RhdGljIGNoYXIgKnNsaWNfdmVuZG9yID0gIkFsYWNyaXRlY2gsIEluYy4iOwogCkBAIC0xNDQsMjkgKzE0NCw2IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbGljX3BjaV90YmwpOwogCi0jZGVmaW5lIFNMSUNfR0VUX1NMSUNfSEFORExFKF9hZGFwdGVyLCBfcHNsaWNfaGFuZGxlKSAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9hZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLCAgICAgICAgICAgICAgICAgIFwKLQkJCV9hZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7ICAgICAgICAgICAgICAgICAgIFwKLQlfcHNsaWNfaGFuZGxlICA9ICBfYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzOyAgICAgICAgICAgICAgICAgXAotCWlmIChfcHNsaWNfaGFuZGxlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCV9hZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXMgPSBfcHNsaWNfaGFuZGxlLT5uZXh0OyAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX2FkYXB0ZXItPmhhbmRsZV9sb2NrLmxvY2ssICAgICAgICAgICAgIFwKLQkJCV9hZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7ICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBTTElDX0ZSRUVfU0xJQ19IQU5ETEUoX2FkYXB0ZXIsIF9wc2xpY19oYW5kbGUpICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9wc2xpY19oYW5kbGUtPnR5cGUgPSBTTElDX0hBTkRMRV9GUkVFOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9hZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLCAgICAgICAgICAgICAgICAgIFwKLQkJCV9hZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7ICAgICAgICAgICAgICAgICAgIFwKLQlfcHNsaWNfaGFuZGxlLT5uZXh0ID0gX2FkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlczsgICAgICAgICAgICAgXAotCV9hZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXMgPSBfcHNsaWNfaGFuZGxlOyAgICAgICAgICAgICAgICAgICBcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX2FkYXB0ZXItPmhhbmRsZV9sb2NrLmxvY2ssICAgICAgICAgICAgIFwKLQkJCV9hZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7ICAgICAgICAgICAgICAgICAgIFwKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHNsaWNfcmVnMzJfd3JpdGUodm9pZCBfX2lvbWVtICpyZWcsIHUzMiB2YWx1ZSwgYm9vbCBmbHVzaCkKIHsKIAl3cml0ZWwodmFsdWUsIHJlZyk7CkBAIC0xNDQyLDcgKzE0MTksMTMgQEAKIAl3aGlsZSAoKGNtZGNudCA8IFNMSUNfQ01EUV9DTURTSU5QQUdFKSAmJgogCSAgICAgICAoYWRhcHRlci0+c2xpY19oYW5kbGVfaXggPCAyNTYpKSB7CiAJCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgU0xJQ19IQU5ETEUgZm9yIHRoaXMgY29tbWFuZCAqLwotCQlTTElDX0dFVF9TTElDX0hBTkRMRShhZGFwdGVyLCBwc2xpY19oYW5kbGUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywKKwkJCQlhZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7CisJCXBzbGljX2hhbmRsZSAgPSAgYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzOworCQlpZiAocHNsaWNfaGFuZGxlKQorCQkJYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzID0gcHNsaWNfaGFuZGxlLT5uZXh0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLAorCQkJCWFkYXB0ZXItPmhhbmRsZV9sb2NrLmZsYWdzKTsKIAkJcHNsaWNfaGFuZGxlLT50eXBlID0gU0xJQ19IQU5ETEVfQ01EOwogCQlwc2xpY19oYW5kbGUtPmFkZHJlc3MgPSAodm9pZCAqKSBjbWQ7CiAJCXBzbGljX2hhbmRsZS0+b2Zmc2V0ID0gKHVzaG9ydCkgYWRhcHRlci0+c2xpY19oYW5kbGVfaXgrKzsKQEAgLTE4MzAsNyArMTgxMyw3IEBACiAjZW5kaWYKIAogCXNlcV9wcmludGYoc2VxLCAiZHJpdmVyX3ZlcnNpb24gICAgICAgICAgIDogJXNcbiIsIHNsaWNfcHJvY192ZXJzaW9uKTsKLQlzZXFfcHV0cyhzZXEsICJNaWNyb2NvZGUgdmVyc2lvbnM6ICAgICAgICAgICBcbiIpOworCXNlcV9wdXRzKHNlcSwgIk1pY3JvY29kZSB2ZXJzaW9uczpcbiIpOwogCXNlcV9wcmludGYoc2VxLCAiICAgIEdpZ2FiaXQgKGdiKSAgICAgICAgIDogJXMgJXNcbiIsCiAJCSAgICBNT0pBVkVfVUNPREVfVkVSU19TVFJJTkcsIE1PSkFWRV9VQ09ERV9WRVJTX0RBVEUpOwogCXNlcV9wcmludGYoc2VxLCAiICAgIEdpZ2FiaXQgUmVjZWl2ZXIgICAgIDogJXMgJXNcbiIsCkBAIC0xOTE3LDE2ICsxOTAwLDE0IEBACiAKIAkJCWlmIChjb25maWctPk9FTUZydUZvcm1hdCA9PSBWRU5ET1I0X0ZSVV9GT1JNQVQpIHsKIAkJCQlzZXFfcHJpbnRmKHNlcSwKLQkJCQkJICAgICJTZXJpYWwgICAjICAgICAgICAgICAgICAgOiAiCi0JCQkJCSAgICAiJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCQkgICAgIlNlcmlhbCAgICMgICAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlY1xuIiwKIAkJCQkJICAgIGZydVs4XSwgZnJ1WzldLCBmcnVbMTBdLAogCQkJCQkgICAgZnJ1WzExXSwgZnJ1WzEyXSwgZnJ1WzEzXSwKIAkJCQkJICAgIGZydVsxNl0sIGZydVsxN10sIGZydVsxOF0sCiAJCQkJCSAgICBmcnVbMTldLCBmcnVbMjBdLCBmcnVbMjFdKTsKIAkJCX0gZWxzZSB7CiAJCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJCSAgICAiU2VyaWFsICAgIyAgICAgICAgICAgICAgIDogIgotCQkJCQkgICAgIiVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNcbiIsCisJCQkJCSAgICAiU2VyaWFsICAgIyAgICAgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlY1xuIiwKIAkJCQkJICAgIGZydVs4XSwgZnJ1WzldLCBmcnVbMTBdLAogCQkJCQkgICAgZnJ1WzExXSwgZnJ1WzEyXSwgZnJ1WzEzXSwKIAkJCQkJICAgIGZydVsxNF0sIGZydVsxNV0sIGZydVsxNl0sCkBAIC0xOTc0LDggKzE5NTUsNyBAQAogCQl7CiAJCQlzZXFfcHV0cyhzZXEsICJGUlUgSW5mb3JtYXRpb246XG4iKTsKIAkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICAiICAgIFBhcnQgICAgICMgICAgICAgICAgIDogIgotCQkJCSAgICAiJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkgICAgIiAgICBQYXJ0ICAgICAjICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJICAgIG9lbWZydVswXSwgb2VtZnJ1WzFdLCBvZW1mcnVbMl0sCiAJCQkJICAgIG9lbWZydVszXSwgb2VtZnJ1WzRdLCBvZW1mcnVbNV0sCiAJCQkJICAgIG9lbWZydVs2XSwgb2VtZnJ1WzddKTsKQEAgLTIwMDIsMjAgKzE5ODIsMTcgQEAKIAkJewogCQkJc2VxX3B1dHMoc2VxLCAiRlJVIEluZm9ybWF0aW9uOlxuIik7CiAJCQlzZXFfcHJpbnRmKHNlcSwKLQkJCQkgICAgIiAgICBGUlUgTnVtYmVyICAgICAgICAgICA6ICIKLQkJCQkgICAgIiVjJWMlYyVjJWMlYyVjJWNcbiIsCisJCQkJICAgICIgICAgRlJVIE51bWJlciAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjXG4iLAogCQkJCSAgICBvZW1mcnVbMF0sIG9lbWZydVsxXSwgb2VtZnJ1WzJdLAogCQkJCSAgICBvZW1mcnVbM10sIG9lbWZydVs0XSwgb2VtZnJ1WzVdLAogCQkJCSAgICBvZW1mcnVbNl0sIG9lbWZydVs3XSk7CiAJCQlzZXFfc3ByaW50ZihzZXEsCi0JCQkJICAgICIgICAgUGFydCBOdW1iZXIgICAgICAgICAgOiAiCi0JCQkJICAgICIlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCSAgICAiICAgIFBhcnQgTnVtYmVyICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlY1xuIiwKIAkJCQkgICAgb2VtZnJ1WzhdLCBvZW1mcnVbOV0sIG9lbWZydVsxMF0sCiAJCQkJICAgIG9lbWZydVsxMV0sIG9lbWZydVsxMl0sIG9lbWZydVsxM10sCiAJCQkJICAgIG9lbWZydVsxNF0sIG9lbWZydVsxNV0pOwogCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJICAgICIgICAgRUMgTGV2ZWwgICAgICAgICAgICAgOiAiCi0JCQkJICAgICIlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCSAgICAiICAgIEVDIExldmVsICAgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlY1xuIiwKIAkJCQkgICAgb2VtZnJ1WzE2XSwgb2VtZnJ1WzE3XSwgb2VtZnJ1WzE4XSwKIAkJCQkgICAgb2VtZnJ1WzE5XSwgb2VtZnJ1WzIwXSwgb2VtZnJ1WzIxXSwKIAkJCQkgICAgb2VtZnJ1WzIyXSwgb2VtZnJ1WzIzXSk7CkBAIC0yNDEyLDggKzIzODksNyBAQAogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIFhNSVRfRkFJTF9MSU5LX1NUQVRFOgogCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCi0JCQkJInJlamVjdCB4bWl0IHNrYlslcDogJXhdIGxpbmtzdGF0ZVslc10gIgotCQkJCSJhZGFwdGVyWyVzOiVkXSBjYXJkWyVzOiVkXVxuIiwKKwkJCQkicmVqZWN0IHhtaXQgc2tiWyVwOiAleF0gbGlua3N0YXRlWyVzXSBhZGFwdGVyWyVzOiVkXSBjYXJkWyVzOiVkXVxuIiwKIAkJCQlza2IsIHNrYi0+cGt0X3R5cGUsCiAJCQkJU0xJQ19MSU5LU1RBVEUoYWRhcHRlci0+bGlua3N0YXRlKSwKIAkJCQlTTElDX0FEQVBURVJfU1RBVEUoYWRhcHRlci0+c3RhdGUpLApAQCAtMjQyOCw4ICsyNDA0LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFhNSVRfRkFJTF9IT1NUQ01EX0ZBSUw6CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkieG1pdF9zdGFydCBza2JbJXBdIHR5cGVbJXhdIE5vIGhvc3QgY29tbWFuZHMgIgotCQkJCSJhdmFpbGFibGVcbiIsIHNrYiwgc2tiLT5wa3RfdHlwZSk7CisJCQkJInhtaXRfc3RhcnQgc2tiWyVwXSB0eXBlWyV4XSBObyBob3N0IGNvbW1hbmRzIGF2YWlsYWJsZVxuIiwgc2tiLCBza2ItPnBrdF90eXBlKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjY0Miw4ICsyNjE3LDcgQEAKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGlzciAmIElTUl9YRFJPUCkgewogCQkJCWRldl9lcnIoJmRldi0+ZGV2LAotCQkJCQkJImlzciAmIElTUl9FUlIgWyV4XSAiCi0JCQkJCQkiSVNSX1hEUk9QIFxuIiwgaXNyKTsKKwkJCQkJCSJpc3IgJiBJU1JfRVJSIFsleF0gSVNSX1hEUk9QXG4iLCBpc3IpOwogCQkJfSBlbHNlIHsKIAkJCQlkZXZfZXJyKCZkZXYtPmRldiwKIAkJCQkJCSJpc3IgJiBJU1JfRVJSIFsleF1cbiIsCkBAIC0yOTcwLDcgKzI5NDQsNyBAQAogewogCWlmIChjYXJkLT5sb2FkdGltZXJzZXQpIHsKIAkJY2FyZC0+bG9hZHRpbWVyc2V0ID0gMDsKLQkJZGVsX3RpbWVyKCZjYXJkLT5sb2FkdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmY2FyZC0+bG9hZHRpbWVyKTsKIAl9CiAKIAlzbGljX2RlYnVnX2NhcmRfZGVzdHJveShjYXJkKTsKQEAgLTMyNjksOCArMzI0Myw3IEBACiAKIAkJaWYgKCFwZWVwcm9tKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKLQkJCQkiZWVwcm9tIHJlYWQgZmFpbGVkIHRvIGdldCBtZW1vcnkgIgotCQkJCSJidXMgJWQgc2xvdCAlZFxuIiwgYWRhcHRlci0+YnVzbnVtYmVyLAorCQkJCSJlZXByb20gcmVhZCBmYWlsZWQgdG8gZ2V0IG1lbW9yeSBidXMgJWQgc2xvdCAlZFxuIiwgYWRhcHRlci0+YnVzbnVtYmVyLAogCQkJCWFkYXB0ZXItPnNsb3RudW1iZXIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZSB7CkBAIC0zNzAzLDcgKzM2NzYsNyBAQAogCWVyciA9IHNsaWNfY2FyZF9sb2NhdGUoYWRhcHRlcik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImNhbm5vdCBsb2NhdGUgY2FyZFxuIik7Ci0JCWdvdG8gZXJyX291dF9mcmVlX21taW9fcmVnaW9uOworCQlnb3RvIGVycl9vdXRfdW5tYXA7CiAJfQogCiAJY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CkBAIC0zNzQzLDggKzM3MTYsNiBAQAogCiBlcnJfb3V0X3VubWFwOgogCWlvdW5tYXAobWVtbWFwcGVkX2lvYWRkcik7Ci1lcnJfb3V0X2ZyZWVfbW1pb19yZWdpb246Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKIGVycl9vdXRfZnJlZV9uZXRkZXY6CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIGVycl9vdXRfZXhpdF9zbGljX3Byb2JlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTIyYWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWNvbmZpZyBGQl9TTTdYWAotCXRyaXN0YXRlICJTaWxpY29uIE1vdGlvbiBTTTdYWCBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkIgJiYgUENJCi0Jc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAotCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKLQlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCWhlbHAKLQkgIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBTaWxpY29uIE1vdGlvbiBTTTcxMCwgU003MTIsIFNNNzIxCi0JICBhbmQgU003MjIgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiBUaGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBzbTd4eGZiLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTQotCSAgaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY0NzFjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9iai0kKENPTkZJR19GQl9TTTdYWCkgKz0gc203eHhmYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjZWFkNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1UT0RPOgotLSBEdWFsIGhlYWQgc3VwcG9ydAotLSAyRCBhY2NlbGVyYXRpb24gc3VwcG9ydAotLSB1c2Uga2VybmVsIGNvZGluZyBzdHlsZQotLSByZWZpbmUgdGhlIGNvZGUgYW5kIHJlbW92ZSB1bnVzZWQgY29kZQotLSBtb3ZlIGl0IHRvIGRyaXZlcnMvdmlkZW8vc203eHhmYi5jCi0KLVBsZWFzZSBzZW5kIGFueSBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAotVGVkZHkgV2FuZyA8dGVkZHkud2FuZ0BzaWxpY29ubW90aW9uLmNvbS5jbj4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5OTg2MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzc5ICswLDAgQEAKLS8qCi0gKiBTaWxpY29uIE1vdGlvbiBTTTcxMiBmcmFtZSBidWZmZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KLSAqIEF1dGhvcnM6CUdlIFdhbmcsIGdld2FuZ0BzaWxpY29ubW90aW9uLmNvbQotICoJCUJveW9kIGJveW9kLnlhbmdAc2lsaWNvbm1vdGlvbi5jb20uY24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgTGVtb3RlLCBJbmMuCi0gKiBBdXRob3I6IFd1IFpoYW5namluLCB3dXpoYW5namluQGdtYWlsLmNvbQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNkZWZpbmUgTlJfUEFMRVRURSAgICAgICAgMjU2Ci0KLSNkZWZpbmUgRkJfQUNDRUxfU01JX0xZTlggODgKLQotI2RlZmluZSBTQ1JFRU5fWF9SRVMgICAgICAxMDI0Ci0jZGVmaW5lIFNDUkVFTl9ZX1JFUyAgICAgIDYwMAotI2RlZmluZSBTQ1JFRU5fQlBQICAgICAgICAxNgotCi0vKkFzc3VtZSBTTTcxMiBncmFwaGljcyBjaGlwIGhhcyA0TUIgVlJBTSAqLwotI2RlZmluZSBTTTcxMl9WSURFT01FTU9SWVNJWkUJICAweDAwNDAwMDAwCi0vKkFzc3VtZSBTTTcyMiBncmFwaGljcyBjaGlwIGhhcyA4TUIgVlJBTSAqLwotI2RlZmluZSBTTTcyMl9WSURFT01FTU9SWVNJWkUJICAweDAwODAwMDAwCi0KLSNkZWZpbmUgZGFjX3JlZwkoMHgzYzgpCi0jZGVmaW5lIGRhY192YWwJKDB4M2M5KQotCi1leHRlcm4gdm9pZCBfX2lvbWVtICpzbXRjX1JlZ0Jhc2VBZGRyZXNzOwotI2RlZmluZSBzbXRjX21taW93YihkYXQsIHJlZykJd3JpdGViKGRhdCwgc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKLSNkZWZpbmUgc210Y19tbWlvd3coZGF0LCByZWcpCXdyaXRldyhkYXQsIHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCi0jZGVmaW5lIHNtdGNfbW1pb3dsKGRhdCwgcmVnKQl3cml0ZWwoZGF0LCBzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQotCi0jZGVmaW5lIHNtdGNfbW1pb3JiKHJlZykJcmVhZGIoc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKLSNkZWZpbmUgc210Y19tbWlvcncocmVnKQlyZWFkdyhzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQotI2RlZmluZSBzbXRjX21taW9ybChyZWcpCXJlYWRsKHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCi0KLSNkZWZpbmUgU0laRV9TUjAwX1NSMDQgICAgICAoMHgwNCAtIDB4MDAgKyAxKQotI2RlZmluZSBTSVpFX1NSMTBfU1IyNCAgICAgICgweDI0IC0gMHgxMCArIDEpCi0jZGVmaW5lIFNJWkVfU1IzMF9TUjc1ICAgICAgKDB4NzUgLSAweDMwICsgMSkKLSNkZWZpbmUgU0laRV9TUjgwX1NSOTMgICAgICAoMHg5MyAtIDB4ODAgKyAxKQotI2RlZmluZSBTSVpFX1NSQTBfU1JBRiAgICAgICgweEFGIC0gMHhBMCArIDEpCi0jZGVmaW5lIFNJWkVfR1IwMF9HUjA4ICAgICAgKDB4MDggLSAweDAwICsgMSkKLSNkZWZpbmUgU0laRV9BUjAwX0FSMTQgICAgICAoMHgxNCAtIDB4MDAgKyAxKQotI2RlZmluZSBTSVpFX0NSMDBfQ1IxOCAgICAgICgweDE4IC0gMHgwMCArIDEpCi0jZGVmaW5lIFNJWkVfQ1IzMF9DUjREICAgICAgKDB4NEQgLSAweDMwICsgMSkKLSNkZWZpbmUgU0laRV9DUjkwX0NSQTcgICAgICAoMHhBNyAtIDB4OTAgKyAxKQotI2RlZmluZSBTSVpFX1ZQUgkJKDB4NkMgKyAxKQotI2RlZmluZSBTSVpFX0RQUgkJKDB4NDQgKyAxKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc210Y19jcnRjdyhpbnQgcmVnLCBpbnQgdmFsKQotewotCXNtdGNfbW1pb3diKHJlZywgMHgzZDQpOwotCXNtdGNfbW1pb3diKHZhbCwgMHgzZDUpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbXRjX2NydGNyKGludCByZWcpCi17Ci0Jc210Y19tbWlvd2IocmVnLCAweDNkNCk7Ci0JcmV0dXJuIHNtdGNfbW1pb3JiKDB4M2Q1KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNtdGNfZ3JwaHcoaW50IHJlZywgaW50IHZhbCkKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2NlKTsKLQlzbXRjX21taW93Yih2YWwsIDB4M2NmKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19ncnBocihpbnQgcmVnKQotewotCXNtdGNfbW1pb3diKHJlZywgMHgzY2UpOwotCXJldHVybiBzbXRjX21taW9yYigweDNjZik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX2F0dHJ3KGludCByZWcsIGludCB2YWwpCi17Ci0Jc210Y19tbWlvcmIoMHgzZGEpOwotCXNtdGNfbW1pb3diKHJlZywgMHgzYzApOwotCXNtdGNfbW1pb3JiKDB4M2MxKTsKLQlzbXRjX21taW93Yih2YWwsIDB4M2MwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNtdGNfc2VxdyhpbnQgcmVnLCBpbnQgdmFsKQotewotCXNtdGNfbW1pb3diKHJlZywgMHgzYzQpOwotCXNtdGNfbW1pb3diKHZhbCwgMHgzYzUpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbXRjX3NlcXIoaW50IHJlZykKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2M0KTsKLQlyZXR1cm4gc210Y19tbWlvcmIoMHgzYzUpOwotfQotCi0vKiBUaGUgbmV4dCBzdHJ1Y3R1cmUgaG9sZHMgYWxsIGluZm9ybWF0aW9uIHJlbGV2YW50IGZvciBhIHNwZWNpZmljIHZpZGVvIG1vZGUuCi0gKi8KLQotc3RydWN0IE1vZGVJbml0IHsKLQlpbnQgbW1TaXplWDsKLQlpbnQgbW1TaXplWTsKLQlpbnQgYnBwOwotCWludCBoejsKLQl1bnNpZ25lZCBjaGFyIEluaXRfTUlTQzsKLQl1bnNpZ25lZCBjaGFyIEluaXRfU1IwMF9TUjA0W1NJWkVfU1IwMF9TUjA0XTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfU1IxMF9TUjI0W1NJWkVfU1IxMF9TUjI0XTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfU1IzMF9TUjc1W1NJWkVfU1IzMF9TUjc1XTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfU1I4MF9TUjkzW1NJWkVfU1I4MF9TUjkzXTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfU1JBMF9TUkFGW1NJWkVfU1JBMF9TUkFGXTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfR1IwMF9HUjA4W1NJWkVfR1IwMF9HUjA4XTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfQVIwMF9BUjE0W1NJWkVfQVIwMF9BUjE0XTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfQ1IwMF9DUjE4W1NJWkVfQ1IwMF9DUjE4XTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfQ1IzMF9DUjREW1NJWkVfQ1IzMF9DUjREXTsKLQl1bnNpZ25lZCBjaGFyIEluaXRfQ1I5MF9DUkE3W1NJWkVfQ1I5MF9DUkE3XTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQkgU003MTIgTW9kZSB0YWJsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IE1vZGVJbml0IFZHQU1vZGVbXSA9IHsKLQl7Ci0JIC8qICBtb2RlIzA6IDY0MCB4IDQ4MCAgMTZCcHAgIDYwSHogKi8KLQkgNjQwLCA0ODAsIDE2LCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEUzLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMCwgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUYsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzIsIDB4MDMsIDB4QTAsIDB4MDksIDB4QzAsIDB4MzIsIDB4MzIsIDB4MzIsCi0JICAweDMyLCAweDMyLCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzIsIDB4MzIsIDB4MzIsCi0JICAweDA0LCAweDI0LCAweDYzLCAweDRGLCAweDUyLCAweDBCLCAweERGLCAweEVBLAotCSAgMHgwNCwgMHg1MCwgMHgxOSwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgzMiwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA3LCAweDgyLCAweDA3LCAweDA0LAotCSAgMHgwMCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgzMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzIsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDMyLCAweDMyLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEZGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDVGLCAweDRGLCAweDRGLCAweDAwLCAweDUzLCAweDFGLCAweDBCLCAweDNFLAotCSAgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4RUEsIDB4MEMsIDB4REYsIDB4NTAsIDB4NDAsIDB4REYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RkQsCi0JICAweDVGLCAweDRGLCAweDAwLCAweDU0LCAweDAwLCAweDBCLCAweERGLCAweDAwLAotCSAgMHhFQSwgMHgwQywgMHgyRSwgMHgwMCwgMHg0RiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4REQsIDB4NUUsIDB4RUEsIDB4ODcsIDB4NDQsIDB4OEYsIDB4NTUsCi0JICAweDBBLCAweDhGLCAweDU1LCAweDBBLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgxMSwgMHgxMCwgMHgwQiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwMCwKLQkgIH0sCi0JIH0sCi0JewotCSAvKiAgbW9kZSMxOiA2NDAgeCA0ODAgIDI0QnBwICA2MEh6ICovCi0JIDY0MCwgNDgwLCAyNCwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFMywKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDAsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEZGLCAweEJFLCAweEVGLCAweEZGLCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDMyLCAweDAzLCAweEEwLCAweDA5LCAweEMwLCAweDMyLCAweDMyLCAweDMyLAotCSAgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDMyLCAweDMyLCAweDMyLAotCSAgMHgwNCwgMHgyNCwgMHg2MywgMHg0RiwgMHg1MiwgMHgwQiwgMHhERiwgMHhFQSwKLQkgIDB4MDQsIDB4NTAsIDB4MTksIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MzIsCi0JICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgwNywgMHg4MiwgMHgwNywgMHgwNCwKLQkgIDB4MDAsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MzAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweDZGLCAweDdGLCAweDdGLCAweEZGLCAweDMyLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGRiwgMHgzMiwgMHgzMiwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRiwgMHhGRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHg1RiwgMHg0RiwgMHg0RiwgMHgwMCwgMHg1MywgMHgxRiwgMHgwQiwgMHgzRSwKLQkgIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEVBLCAweDBDLCAweERGLCAweDUwLCAweDQwLCAweERGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4MDMsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEU3LCAweEZGLCAweEZELAotCSAgMHg1RiwgMHg0RiwgMHgwMCwgMHg1NCwgMHgwMCwgMHgwQiwgMHhERiwgMHgwMCwKLQkgIDB4RUEsIDB4MEMsIDB4MkUsIDB4MDAsIDB4NEYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU2LCAweERELCAweDVFLCAweEVBLCAweDg3LCAweDQ0LCAweDhGLCAweDU1LAotCSAgMHgwQSwgMHg4RiwgMHg1NSwgMHgwQSwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MTEsIDB4MTAsIDB4MEIsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MDAsCi0JICB9LAotCSB9LAotCXsKLQkgLyogIG1vZGUjMDogNjQwIHggNDgwICAzMkJwcCAgNjBIeiAqLwotCSA2NDAsIDQ4MCwgMzIsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RTMsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRiwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzMiwgMHgwMywgMHhBMCwgMHgwOSwgMHhDMCwgMHgzMiwgMHgzMiwgMHgzMiwKLQkgIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgzMiwgMHgzMiwKLQkgIDB4MDQsIDB4MjQsIDB4NjMsIDB4NEYsIDB4NTIsIDB4MEIsIDB4REYsIDB4RUEsCi0JICAweDA0LCAweDUwLCAweDE5LCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDMyLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDcsIDB4ODIsIDB4MDcsIDB4MDQsCi0JICAweDAwLCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDMwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgzMiwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RkYsIDB4MzIsIDB4MzIsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4RkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4NUYsIDB4NEYsIDB4NEYsIDB4MDAsIDB4NTMsIDB4MUYsIDB4MEIsIDB4M0UsCi0JICAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhFQSwgMHgwQywgMHhERiwgMHg1MCwgMHg0MCwgMHhERiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhGRiwgMHhGRCwKLQkgIDB4NUYsIDB4NEYsIDB4MDAsIDB4NTQsIDB4MDAsIDB4MEIsIDB4REYsIDB4MDAsCi0JICAweEVBLCAweDBDLCAweDJFLCAweDAwLCAweDRGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHhERCwgMHg1RSwgMHhFQSwgMHg4NywgMHg0NCwgMHg4RiwgMHg1NSwKLQkgIDB4MEEsIDB4OEYsIDB4NTUsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDExLCAweDEwLCAweDBCLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDAwLAotCSAgfSwKLQkgfSwKLQotCXsJCQkvKiAgbW9kZSMyOiA4MDAgeCA2MDAgIDE2QnBwICA2MEh6ICovCi0JIDgwMCwgNjAwLCAxNiwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHgyQiwKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDMsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEZGLCAweEJFLCAweEVFLCAweEZGLCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDM0LCAweDAzLCAweDIwLCAweDA5LCAweEMwLCAweDI0LCAweDI0LCAweDI0LAotCSAgMHgyNCwgMHgyNCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MzgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDI0LCAweDI0LCAweDI0LAotCSAgMHgwNCwgMHg0OCwgMHg4MywgMHg2MywgMHg2OCwgMHg3MiwgMHg1NywgMHg1OCwKLQkgIDB4MDQsIDB4NTUsIDB4NTksIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MjQsCi0JICAweDAxLCAweDgwLCAweDdBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgxQywgMHg4NSwgMHgzNSwgMHgxMywKLQkgIDB4MDIsIDB4NDUsIDB4MzAsIDB4MzUsIDB4NDAsIDB4MjAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDZGLCAweDdGLCAweDdGLCAweEZGLCAweDI0LAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyNCwgMHgyNCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRiwgMHhCRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHg3RiwgMHg2MywgMHg2MywgMHgwMCwgMHg2OCwgMHgxOCwgMHg3MiwgMHhGMCwKLQkgIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDU4LCAweDBDLCAweDU3LCAweDY0LCAweDQwLCAweDU3LCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MDMsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEU3LCAweEJGLCAweEZELAotCSAgMHg3RiwgMHg2MywgMHgwMCwgMHg2OSwgMHgxOCwgMHg3MiwgMHg1NywgMHgwMCwKLQkgIDB4NTgsIDB4MEMsIDB4RTAsIDB4MjAsIDB4NjMsIDB4NTcsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU2LCAweDRCLCAweDVFLCAweDU1LCAweDg2LCAweDlELCAweDhFLCAweEFBLAotCSAgMHhEQiwgMHgyQSwgMHhERiwgMHgzMywgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MjAsIDB4MUYsIDB4MUEsIDB4MTksIDB4MEYsIDB4MEYsIDB4MEYsIDB4MDAsCi0JICB9LAotCSB9LAotCXsJCQkvKiAgbW9kZSMzOiA4MDAgeCA2MDAgIDI0QnBwICA2MEh6ICovCi0JIDgwMCwgNjAwLCAyNCwgNjAsCi0JIDB4MkIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzNiwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgzNiwgMHgzNiwgMHgzNiwKLQkgIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgzNiwgMHgzNiwgMHgzNiwKLQkgIDB4MDQsIDB4NDgsIDB4ODMsIDB4NjMsIDB4NjgsIDB4NzIsIDB4NTcsIDB4NTgsCi0JICAweDA0LCAweDU1LCAweDU5LCAweDM2LCAweDM2LCAweDAwLCAweDAwLCAweDM2LAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MUMsIDB4ODUsIDB4MzUsIDB4MTMsCi0JICAweDAyLCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgzNiwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RkYsIDB4MzYsIDB4MzYsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4N0YsIDB4NjMsIDB4NjMsIDB4MDAsIDB4NjgsIDB4MTgsIDB4NzIsIDB4RjAsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHg1NywgMHg2NCwgMHg0MCwgMHg1NywgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMzLCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhCRiwgMHhGRCwKLQkgIDB4N0YsIDB4NjMsIDB4MDAsIDB4NjksIDB4MTgsIDB4NzIsIDB4NTcsIDB4MDAsCi0JICAweDU4LCAweDBDLCAweEUwLCAweDIwLCAweDYzLCAweDU3LAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHg0QiwgMHg1RSwgMHg1NSwgMHg4NiwgMHg5RCwgMHg4RSwgMHhBQSwKLQkgIDB4REIsIDB4MkEsIDB4REYsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDIwLCAweDFGLCAweDFBLCAweDE5LCAweDBGLCAweDBGLCAweDBGLCAweDAwLAotCSAgfSwKLQkgfSwKLQl7CQkJLyogIG1vZGUjNzogODAwIHggNjAwICAzMkJwcCAgNjBIeiAqLwotCSA4MDAsIDYwMCwgMzIsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4MkIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzNCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgyNCwgMHgyNCwgMHgyNCwKLQkgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDM4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgyNCwKLQkgIDB4MDQsIDB4NDgsIDB4ODMsIDB4NjMsIDB4NjgsIDB4NzIsIDB4NTcsIDB4NTgsCi0JICAweDA0LCAweDU1LCAweDU5LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDI0LAotCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MUMsIDB4ODUsIDB4MzUsIDB4MTMsCi0JICAweDAyLCAweDQ1LCAweDMwLCAweDM1LCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgyNCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MjQsIDB4MjQsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4N0YsIDB4NjMsIDB4NjMsIDB4MDAsIDB4NjgsIDB4MTgsIDB4NzIsIDB4RjAsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHg1NywgMHg2NCwgMHg0MCwgMHg1NywgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMzLCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhCRiwgMHhGRCwKLQkgIDB4N0YsIDB4NjMsIDB4MDAsIDB4NjksIDB4MTgsIDB4NzIsIDB4NTcsIDB4MDAsCi0JICAweDU4LCAweDBDLCAweEUwLCAweDIwLCAweDYzLCAweDU3LAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHg0QiwgMHg1RSwgMHg1NSwgMHg4NiwgMHg5RCwgMHg4RSwgMHhBQSwKLQkgIDB4REIsIDB4MkEsIDB4REYsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDIwLCAweDFGLCAweDFBLCAweDE5LCAweDBGLCAweDBGLCAweDBGLCAweDAwLAotCSAgfSwKLQkgfSwKLQkvKiBXZSB1c2UgMTAyNHg3NjggdGFibGUgdG8gbGlnaHQgMTAyNHg2MDAgcGFuZWwgZm9yIGxlbW90ZSAqLwotCXsJCQkvKiAgbW9kZSM0OiAxMDI0IHggNjAwICAxNkJwcCAgNjBIeiAgKi8KLQkgMTAyNCwgNjAwLCAxNiwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFQiwKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDAsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEM4LCAweDQwLCAweDE0LCAweDYwLCAweDAwLCAweDBBLCAweDE3LCAweDIwLAotCSAgMHg1MSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDAsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDIyLCAweDAzLCAweDI0LCAweDA5LCAweEMwLCAweDIyLCAweDIyLCAweDIyLAotCSAgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDIyLCAweDIyLCAweDIyLAotCSAgMHgwNiwgMHg2OCwgMHhBNywgMHg3RiwgMHg4MywgMHgyNCwgMHhGRiwgMHgwMywKLQkgIDB4MDAsIDB4NjAsIDB4NTksIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MjIsCi0JICAweDAxLCAweDgwLCAweDdBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHgxNiwgMHgwMiwgMHgwRCwgMHg4MiwgMHgwOSwgMHgwMiwKLQkgIDB4MDQsIDB4NDUsIDB4M0YsIDB4MzAsIDB4NDAsIDB4MjAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNBLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzQSwgMHgzQSwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZCLCAweDlGLCAweDAxLCAweDAwLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg5NywgMHhFRiwgMHhCRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHhBMywgMHg3RiwgMHg3RiwgMHgwMCwgMHg4NSwgMHgxNiwgMHgyNCwgMHhGNSwKLQkgIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDAzLCAweDA5LCAweEZGLCAweDgwLCAweDQwLCAweEZGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEZGLCAweEJGLCAweEZGLAotCSAgMHhBMywgMHg3RiwgMHgwMCwgMHg4MiwgMHgwYiwgMHg2ZiwgMHg1NywgMHgwMCwKLQkgIDB4NWMsIDB4MGYsIDB4RTAsIDB4ZTAsIDB4N0YsIDB4NTcsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU1LCAweEQ5LCAweDVELCAweEUxLCAweDg2LCAweDFCLCAweDhFLCAweDI2LAotCSAgMHhEQSwgMHg4RCwgMHhERSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MTUsIDB4MDMsCi0JICB9LAotCSB9LAotCXsJCQkvKiAgbW9kZSM1OiAxMDI0IHggNzY4ICAyNEJwcCAgNjBIeiAqLwotCSAxMDI0LCA3NjgsIDI0LCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEVCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCi0JICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAotCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDNCLCAweDBELCAweDA5LCAweDAyLAotCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCi0JICAweEEzLCAweDdGLCAweDAwLCAweDg2LCAweDE1LCAweDI0LCAweEZGLCAweDAwLAotCSAgMHgwMSwgMHgwNywgMHhFNSwgMHgyMCwgMHg3RiwgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCi0JICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKLQkgIH0sCi0JIH0sCi0JewkJCS8qICBtb2RlIzQ6IDEwMjQgeCA3NjggIDMyQnBwICA2MEh6ICovCi0JIDEwMjQsIDc2OCwgMzIsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RUIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGMywgMHhCNiwgMHhDMCwgMHhERCwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMyLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzOCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgzQSwgMHgzQSwgMHgzQSwKLQkgIDB4M0EsIDB4M0EsIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCi0JICAweDAwLCAweDYwLCAweDU5LCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4M0IsIDB4MEQsIDB4MDksIDB4MDIsCi0JICAweDA0LCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKLQkgIDB4QTMsIDB4N0YsIDB4MDAsIDB4ODYsIDB4MTUsIDB4MjQsIDB4RkYsIDB4MDAsCi0JICAweDAxLCAweDA3LCAweEU1LCAweDIwLCAweDdGLCAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKLQkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAotCSAgfSwKLQkgfSwKLQl7CQkJLyogIG1vZGUjNjogMzIwIHggMjQwICAxNkJwcCAgNjBIeiAqLwotCSAzMjAsIDI0MCwgMTYsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RUIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGMywgMHhCNiwgMHhDMCwgMHhERCwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMyLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzOCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgzQSwgMHgzQSwgMHgzQSwKLQkgIDB4M0EsIDB4M0EsIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCi0JICAweDAwLCAweDYwLCAweDU5LCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDgsIDB4NDMsIDB4MDgsIDB4NDMsCi0JICAweDA0LCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgzMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKLQkgIDB4MkUsIDB4MjcsIDB4MDAsIDB4MmIsIDB4MGMsIDB4MEYsIDB4RUYsIDB4MDAsCi0JICAweEZlLCAweDBmLCAweDAxLCAweEMwLCAweDI3LCAweEVGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKLQkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAotCSAgfSwKLQkgfSwKLQotCXsJCQkvKiAgbW9kZSM4OiAzMjAgeCAyNDAgIDMyQnBwICA2MEh6ICovCi0JIDMyMCwgMjQwLCAzMiwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFQiwKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDMsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEYzLCAweEI2LCAweEMwLCAweERELCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzIsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDM4LCAweDAzLCAweDIwLCAweDA5LCAweEMwLCAweDNBLCAweDNBLCAweDNBLAotCSAgMHgzQSwgMHgzQSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwNiwgMHg2OCwgMHhBNywgMHg3RiwgMHg4MywgMHgyNCwgMHhGRiwgMHgwMywKLQkgIDB4MDAsIDB4NjAsIDB4NTksIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgwOCwgMHg0MywgMHgwOCwgMHg0MywKLQkgIDB4MDQsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MjAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNBLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzQSwgMHgzQSwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZCLCAweDlGLCAweDAxLCAweDAwLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg5NywgMHhFRiwgMHhCRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHhBMywgMHg3RiwgMHg3RiwgMHgwMCwgMHg4NSwgMHgxNiwgMHgyNCwgMHhGNSwKLQkgIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDAzLCAweDA5LCAweEZGLCAweDgwLCAweDQwLCAweEZGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDMwLCAweDQwLCAweDAwLCAweEZGLCAweEJGLCAweEZGLAotCSAgMHgyRSwgMHgyNywgMHgwMCwgMHgyYiwgMHgwYywgMHgwRiwgMHhFRiwgMHgwMCwKLQkgIDB4RmUsIDB4MGYsIDB4MDEsIDB4QzAsIDB4MjcsIDB4RUYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU1LCAweEQ5LCAweDVELCAweEUxLCAweDg2LCAweDFCLCAweDhFLCAweDI2LAotCSAgMHhEQSwgMHg4RCwgMHhERSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MTUsIDB4MDMsCi0JICB9LAotCSB9LAotfTsKLQotI2RlZmluZSBudW1WR0FNb2RlcwkJQVJSQVlfU0laRShWR0FNb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHhmYi5jIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHhmYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTc2ZDk4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjggKzAsMCBAQAotLyoKLSAqIFNpbGljb24gTW90aW9uIFNNN1hYIGZyYW1lIGJ1ZmZlciBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2lsaWNvbiBNb3Rpb24gVGVjaG5vbG9neSBDb3JwLgotICogQXV0aG9yczogIEdlIFdhbmcsIGdld2FuZ0BzaWxpY29ubW90aW9uLmNvbQotICoJICAgICBCb3lvZCBib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgotICogQXV0aG9yOiAgIFd1IFpoYW5namluLCB3dXpoYW5namluQGdtYWlsLmNvbQotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBJZ2FsaWEsIFMuTC4KLSAqIEF1dGhvcjogICBKYXZpZXIgTS4gTWVsbGlkIDxqbXVuaG96QGlnYWxpYS5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogRnJhbWVidWZmZXIgZHJpdmVyIGZvciBTaWxpY29uIE1vdGlvbiBTTTcxMCwgU003MTIsIFNNNzIxIGFuZCBTTTcyMiBjaGlwcwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE0KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJzbTd4eC5oIgotCi0vKgotKiBQcml2YXRlIHN0cnVjdHVyZQotKi8KLXN0cnVjdCBzbXRjZmJfaW5mbyB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IGZiX2luZm8gZmI7Ci0JdTE2IGNoaXBfaWQ7Ci0JdTggIGNoaXBfcmV2X2lkOwotCi0Jdm9pZCBfX2lvbWVtICpsZmI7CS8qIGxpbmVhciBmcmFtZSBidWZmZXIgKi8KLQl2b2lkIF9faW9tZW0gKmRwX3JlZ3M7CS8qIGRyYXdpbmcgcHJvY2Vzc29yIGNvbnRyb2wgcmVncyAqLwotCXZvaWQgX19pb21lbSAqdnBfcmVnczsJLyogdmlkZW8gcHJvY2Vzc29yIGNvbnRyb2wgcmVncyAqLwotCXZvaWQgX19pb21lbSAqY3BfcmVnczsJLyogY2FwdHVyZSBwcm9jZXNzb3IgY29udHJvbCByZWdzICovCi0Jdm9pZCBfX2lvbWVtICptbWlvOwkvKiBtZW1vcnkgbWFwIElPIHBvcnQgKi8KLQotCXVfaW50IHdpZHRoOwotCXVfaW50IGhlaWdodDsKLQl1X2ludCBoejsKLQotCXUzMiBjb2xyZWdbMTddOwotfTsKLQotdm9pZCBfX2lvbWVtICpzbXRjX1JlZ0Jhc2VBZGRyZXNzOwkvKiBNZW1vcnkgTWFwIElPIHN0YXJ0aW5nIGFkZHJlc3MgKi8KLQotc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBzbXRjZmJfdmFyID0gewotCS54cmVzICAgICAgICAgICA9IDEwMjQsCi0JLnlyZXMgICAgICAgICAgID0gNjAwLAotCS54cmVzX3ZpcnR1YWwgICA9IDEwMjQsCi0JLnlyZXNfdmlydHVhbCAgID0gNjAwLAotCS5iaXRzX3Blcl9waXhlbCA9IDE2LAotCS5yZWQgICAgICAgICAgICA9IHsxNiwgOCwgMH0sCi0JLmdyZWVuICAgICAgICAgID0gezgsIDgsIDB9LAotCS5ibHVlICAgICAgICAgICA9IHswLCA4LCAwfSwKLQkuYWN0aXZhdGUgICAgICAgPSBGQl9BQ1RJVkFURV9OT1csCi0JLmhlaWdodCAgICAgICAgID0gLTEsCi0JLndpZHRoICAgICAgICAgID0gLTEsCi0JLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKLQkubm9uc3RkICAgICAgICAgPSAwLAotCS5hY2NlbF9mbGFncyAgICA9IEZCX0FDQ0VMRl9URVhULAotfTsKLQotc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBzbXRjZmJfZml4ID0gewotCS5pZCAgICAgICAgICAgICA9ICJzbVhYWGZiIiwKLQkudHlwZSAgICAgICAgICAgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCi0JLnZpc3VhbCAgICAgICAgID0gRkJfVklTVUFMX1RSVUVDT0xPUiwKLQkubGluZV9sZW5ndGggICAgPSA4MDAgKiAzLAotCS5hY2NlbCAgICAgICAgICA9IEZCX0FDQ0VMX1NNSV9MWU5YLAotCS50eXBlX2F1eCAgICAgICA9IDAsCi0JLnhwYW5zdGVwICAgICAgID0gMCwKLQkueXBhbnN0ZXAgICAgICAgPSAwLAotCS55d3JhcHN0ZXAgICAgICA9IDAsCi19OwotCi1zdHJ1Y3QgdmVzYV9tb2RlIHsKLQljaGFyIGluZGV4WzZdOwotCXUxNiAgbGZiX3dpZHRoOwotCXUxNiAgbGZiX2hlaWdodDsKLQl1MTYgIGxmYl9kZXB0aDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdmVzYV9tb2RlIHZlc2FfbW9kZV90YWJsZVtdID0gewotCXsiMHgzMDEiLCA2NDAsICA0ODAsICA4fSwKLQl7IjB4MzAzIiwgODAwLCAgNjAwLCAgOH0sCi0JeyIweDMwNSIsIDEwMjQsIDc2OCwgIDh9LAotCXsiMHgzMDciLCAxMjgwLCAxMDI0LCA4fSwKLQotCXsiMHgzMTEiLCA2NDAsICA0ODAsICAxNn0sCi0JeyIweDMxNCIsIDgwMCwgIDYwMCwgIDE2fSwKLQl7IjB4MzE3IiwgMTAyNCwgNzY4LCAgMTZ9LAotCXsiMHgzMUEiLCAxMjgwLCAxMDI0LCAxNn0sCi0KLQl7IjB4MzEyIiwgNjQwLCAgNDgwLCAgMjR9LAotCXsiMHgzMTUiLCA4MDAsICA2MDAsICAyNH0sCi0JeyIweDMxOCIsIDEwMjQsIDc2OCwgIDI0fSwKLQl7IjB4MzFCIiwgMTI4MCwgMTAyNCwgMjR9LAotfTsKLQotc3RydWN0IHNjcmVlbl9pbmZvIHNtdGNfc2NyX2luZm87Ci0KLS8qIHByb2Nlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGdldCB2Z2EgcGFyYW1ldGVyICovCi1zdGF0aWMgaW50IF9faW5pdCBzbTd4eF92Z2Ffc2V0dXAoY2hhciAqb3B0aW9ucykKLXsKLQlpbnQgaTsKLQotCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc210Y19zY3JfaW5mby5sZmJfd2lkdGggPSAwOwotCXNtdGNfc2NyX2luZm8ubGZiX2hlaWdodCA9IDA7Ci0Jc210Y19zY3JfaW5mby5sZmJfZGVwdGggPSAwOwotCi0JcHJfZGVidWcoInNtN3h4X3ZnYV9zZXR1cCA9ICVzXG4iLCBvcHRpb25zKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZlc2FfbW9kZV90YWJsZSk7IGkrKykgewotCQlpZiAoc3Ryc3RyKG9wdGlvbnMsIHZlc2FfbW9kZV90YWJsZVtpXS5pbmRleCkpIHsKLQkJCXNtdGNfc2NyX2luZm8ubGZiX3dpZHRoICA9IHZlc2FfbW9kZV90YWJsZVtpXS5sZmJfd2lkdGg7Ci0JCQlzbXRjX3Njcl9pbmZvLmxmYl9oZWlnaHQgPQotCQkJCQkJdmVzYV9tb2RlX3RhYmxlW2ldLmxmYl9oZWlnaHQ7Ci0JCQlzbXRjX3Njcl9pbmZvLmxmYl9kZXB0aCAgPSB2ZXNhX21vZGVfdGFibGVbaV0ubGZiX2RlcHRoOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci1fX3NldHVwKCJ2Z2E9Iiwgc203eHhfdmdhX3NldHVwKTsKLQotc3RhdGljIHZvaWQgc203MTJfc2V0cGFsZXR0ZShpbnQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCi0JCQkgICAgIHVuc2lnbmVkIGJsdWUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCS8qIHNldCBiaXQgNTo0ID0gMDEgKHdyaXRlIExDRCBSQU0gb25seSkgKi8KLQlzbXRjX3NlcXcoMHg2NiwgKHNtdGNfc2VxcigweDY2KSAmIDB4QzMpIHwgMHgxMCk7Ci0KLQlzbXRjX21taW93YihyZWdubywgZGFjX3JlZyk7Ci0Jc210Y19tbWlvd2IocmVkID4+IDEwLCBkYWNfdmFsKTsKLQlzbXRjX21taW93YihncmVlbiA+PiAxMCwgZGFjX3ZhbCk7Ci0Jc210Y19tbWlvd2IoYmx1ZSA+PiAxMCwgZGFjX3ZhbCk7Ci19Ci0KLS8qIGNoYW5fdG9fZmllbGQKLSAqCi0gKiBjb252ZXJ0IGEgY29sb3VyIHZhbHVlIGludG8gYSBmaWVsZCBwb3NpdGlvbgotICoKLSAqIGZyb20gcHhhZmIuYwotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNoYW5fdG9fZmllbGQodW5zaWduZWQgaW50IGNoYW4sCi0JCQkJCSBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQotewotCWNoYW4gJj0gMHhmZmZmOwotCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKLQlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OwotfQotCi1zdGF0aWMgaW50IHNtdGNfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCS8qIGNsZWFyIERQTVMgc2V0dGluZyAqLwotCXN3aXRjaCAoYmxhbmtfbW9kZSkgewotCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKLQkJLyogU2NyZWVuIE9uOiBIU3luYzogT24sIFZTeW5jIDogT24gKi8KLQkJc210Y19zZXF3KDB4MDEsIChzbXRjX3NlcXIoMHgwMSkgJiAofjB4MjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDE2KTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSAmIDB4NzcpKTsKLQkJc210Y19zZXF3KDB4MjIsIChzbXRjX3NlcXIoMHgyMikgJiAofjB4MzApKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoc210Y19zZXFyKDB4MjMpICYgKH4weGMwKSkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSB8IDB4MDEpKTsKLQkJc210Y19zZXF3KDB4MzEsIChzbXRjX3NlcXIoMHgzMSkgfCAweDAzKSk7Ci0JCWJyZWFrOwotCWNhc2UgRkJfQkxBTktfTk9STUFMOgotCQkvKiBTY3JlZW4gT2ZmOiBIU3luYzogT24sIFZTeW5jIDogT24gICBTb2Z0IGJsYW5rICovCi0JCXNtdGNfc2VxdygweDAxLCAoc210Y19zZXFyKDB4MDEpICYgKH4weDIwKSkpOwotCQlzbXRjX3NlcXcoMHg2YSwgMHgxNik7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJc210Y19zZXF3KDB4MjIsIChzbXRjX3NlcXIoMHgyMikgJiAofjB4MzApKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoc210Y19zZXFyKDB4MjMpICYgKH4weGMwKSkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSB8IDB4MDEpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCWJyZWFrOwotCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKLQkJLyogU2NyZWVuIE9uOiBIU3luYzogT24sIFZTeW5jIDogT2ZmICovCi0JCXNtdGNfc2VxdygweDAxLCAoc210Y19zZXFyKDB4MDEpIHwgMHgyMCkpOwotCQlzbXRjX3NlcXcoMHgyMCwgKHNtdGNfc2VxcigweDIwKSAmICh+MHhCMCkpKTsKLQkJc210Y19zZXF3KDB4NmEsIDB4MGMpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDIxLCAoc210Y19zZXFyKDB4MjEpIHwgMHg4OCkpOwotCQlzbXRjX3NlcXcoMHgyMiwgKChzbXRjX3NlcXIoMHgyMikgJiAofjB4MzApKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjMsICgoc210Y19zZXFyKDB4MjMpICYgKH4weGMwKSkgfCAweDIwKSk7Ci0JCXNtdGNfc2VxdygweDI0LCAoc210Y19zZXFyKDB4MjQpICYgKH4weDAxKSkpOwotCQlzbXRjX3NlcXcoMHgzMSwgKChzbXRjX3NlcXIoMHgzMSkgJiAofjB4MDcpKSB8IDB4MDApKTsKLQkJc210Y19zZXF3KDB4MzQsIChzbXRjX3NlcXIoMHgzNCkgfCAweDgwKSk7Ci0JCWJyZWFrOwotCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKLQkJLyogU2NyZWVuIE9uOiBIU3luYzogT2ZmLCBWU3luYyA6IE9uICovCi0JCXNtdGNfc2VxdygweDAxLCAoc210Y19zZXFyKDB4MDEpIHwgMHgyMCkpOwotCQlzbXRjX3NlcXcoMHgyMCwgKHNtdGNfc2VxcigweDIwKSAmICh+MHhCMCkpKTsKLQkJc210Y19zZXF3KDB4NmEsIDB4MGMpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDIxLCAoc210Y19zZXFyKDB4MjEpIHwgMHg4OCkpOwotCQlzbXRjX3NlcXcoMHgyMiwgKChzbXRjX3NlcXIoMHgyMikgJiAofjB4MzApKSB8IDB4MTApKTsKLQkJc210Y19zZXF3KDB4MjMsICgoc210Y19zZXFyKDB4MjMpICYgKH4weGMwKSkgfCAweEQ4KSk7Ci0JCXNtdGNfc2VxdygweDI0LCAoc210Y19zZXFyKDB4MjQpICYgKH4weDAxKSkpOwotCQlzbXRjX3NlcXcoMHgzMSwgKChzbXRjX3NlcXIoMHgzMSkgJiAofjB4MDcpKSB8IDB4MDApKTsKLQkJc210Y19zZXF3KDB4MzQsIChzbXRjX3NlcXIoMHgzNCkgfCAweDgwKSk7Ci0JCWJyZWFrOwotCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgotCQkvKiBTY3JlZW4gT246IEhTeW5jOiBPZmYsIFZTeW5jIDogT2ZmICovCi0JCXNtdGNfc2VxdygweDAxLCAoc210Y19zZXFyKDB4MDEpIHwgMHgyMCkpOwotCQlzbXRjX3NlcXcoMHgyMCwgKHNtdGNfc2VxcigweDIwKSAmICh+MHhCMCkpKTsKLQkJc210Y19zZXF3KDB4NmEsIDB4MGMpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDIxLCAoc210Y19zZXFyKDB4MjEpIHwgMHg4OCkpOwotCQlzbXRjX3NlcXcoMHgyMiwgKChzbXRjX3NlcXIoMHgyMikgJiAofjB4MzApKSB8IDB4MzApKTsKLQkJc210Y19zZXF3KDB4MjMsICgoc210Y19zZXFyKDB4MjMpICYgKH4weGMwKSkgfCAweEQ4KSk7Ci0JCXNtdGNfc2VxdygweDI0LCAoc210Y19zZXFyKDB4MjQpICYgKH4weDAxKSkpOwotCQlzbXRjX3NlcXcoMHgzMSwgKChzbXRjX3NlcXIoMHgzMSkgJiAofjB4MDcpKSB8IDB4MDApKTsKLQkJc210Y19zZXF3KDB4MzQsIChzbXRjX3NlcXIoMHgzNCkgfCAweDgwKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtdGNfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAotCQkJICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFucywgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7Ci0JdTMyIHZhbDsKLQotCXNmYiA9IGluZm8tPnBhcjsKLQotCWlmIChyZWdubyA+IDI1NSkKLQkJcmV0dXJuIDE7Ci0KLQlzd2l0Y2ggKHNmYi0+ZmIuZml4LnZpc3VhbCkgewotCWNhc2UgRkJfVklTVUFMX0RJUkVDVENPTE9SOgotCWNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKLQkJLyoKLQkJICogMTYvMzIgYml0IHRydWUtY29sb3VyLCB1c2UgcHNldWRvLXBhbGV0dGUgZm9yIDE2IGJhc2UgY29sb3IKLQkJICovCi0JCWlmIChyZWdubyA8IDE2KSB7Ci0JCQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMTYpIHsKLQkJCQl1MzIgKnBhbCA9IHNmYi0+ZmIucHNldWRvX3BhbGV0dGU7Ci0JCQkJdmFsID0gY2hhbl90b19maWVsZChyZWQsICZzZmItPmZiLnZhci5yZWQpOwotCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGdyZWVuLCAmc2ZiLT5mYi52YXIuZ3JlZW4pOwotCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGJsdWUsICZzZmItPmZiLnZhci5ibHVlKTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJCQlwYWxbcmVnbm9dID0KLQkJCQkgICAgKChyZWQgJiAweGY4MDApID4+IDgpIHwKLQkJCQkgICAgKChncmVlbiAmIDB4ZTAwMCkgPj4gMTMpIHwKLQkJCQkgICAgKChncmVlbiAmIDB4MWMwMCkgPDwgMykgfAotCQkJCSAgICAoKGJsdWUgJiAweGY4MDApID4+IDMpOwotI2Vsc2UKLQkJCQlwYWxbcmVnbm9dID0gdmFsOwotI2VuZGlmCi0JCQl9IGVsc2UgewotCQkJCXUzMiAqcGFsID0gc2ZiLT5mYi5wc2V1ZG9fcGFsZXR0ZTsKLQkJCQl2YWwgPSBjaGFuX3RvX2ZpZWxkKHJlZCwgJnNmYi0+ZmIudmFyLnJlZCk7Ci0JCQkJdmFsIHw9IGNoYW5fdG9fZmllbGQoZ3JlZW4sICZzZmItPmZiLnZhci5ncmVlbik7Ci0JCQkJdmFsIHw9IGNoYW5fdG9fZmllbGQoYmx1ZSwgJnNmYi0+ZmIudmFyLmJsdWUpOwotI2lmZGVmIF9fQklHX0VORElBTgotCQkJCXZhbCA9Ci0JCQkJICAgICh2YWwgJiAweGZmMDBmZjAwID4+IDgpIHwKLQkJCQkgICAgKHZhbCAmIDB4MDBmZjAwZmYgPDwgOCk7Ci0jZW5kaWYKLQkJCQlwYWxbcmVnbm9dID0gdmFsOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6Ci0JCS8qIGNvbG9yIGRlcHRoIDggYml0ICovCi0JCXNtNzEyX3NldHBhbGV0dGUocmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsIGluZm8pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAxOwkvKiB1bmtub3duIHR5cGUgKi8KLQl9Ci0KLQlyZXR1cm4gMDsKLQotfQotCi0jaWZkZWYgX19CSUdfRU5ESUFOCi1zdGF0aWMgc3NpemVfdCBzbXRjZmJfcmVhZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90Ci0JCQkJY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKLQotCXUzMiAqYnVmZmVyLCAqZHN0OwotCXUzMiBfX2lvbWVtICpzcmM7Ci0JaW50IGMsIGksIGNudCA9IDAsIGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotCi0JaWYgKCFpbmZvIHx8ICFpbmZvLT5zY3JlZW5fYmFzZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCi0JCXJldHVybiAtRVBFUk07Ci0KLQl0b3RhbF9zaXplID0gaW5mby0+c2NyZWVuX3NpemU7Ci0KLQlpZiAodG90YWxfc2l6ZSA9PSAwKQotCQl0b3RhbF9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwotCi0JaWYgKHAgPj0gdG90YWxfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY291bnQgPj0gdG90YWxfc2l6ZSkKLQkJY291bnQgPSB0b3RhbF9zaXplOwotCi0JaWYgKGNvdW50ICsgcCA+IHRvdGFsX3NpemUpCi0JCWNvdW50ID0gdG90YWxfc2l6ZSAtIHA7Ci0KLQlidWZmZXIgPSBrbWFsbG9jKChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3JjID0gKHUzMiBfX2lvbWVtICopIChpbmZvLT5zY3JlZW5fYmFzZSArIHApOwotCi0JaWYgKGluZm8tPmZib3BzLT5mYl9zeW5jKQotCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyhpbmZvKTsKLQotCXdoaWxlIChjb3VudCkgewotCQljID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OwotCQlkc3QgPSBidWZmZXI7Ci0JCWZvciAoaSA9IGMgPj4gMjsgaS0tOykgewotCQkJKmRzdCA9IGZiX3JlYWRsKHNyYysrKTsKLQkJCSpkc3QgPQotCQkJICAgICgqZHN0ICYgMHhmZjAwZmYwMCA+PiA4KSB8Ci0JCQkgICAgKCpkc3QgJiAweDAwZmYwMGZmIDw8IDgpOwotCQkJZHN0Kys7Ci0JCX0KLQkJaWYgKGMgJiAzKSB7Ci0JCQl1OCAqZHN0OCA9ICh1OCAqKSBkc3Q7Ci0JCQl1OCBfX2lvbWVtICpzcmM4ID0gKHU4IF9faW9tZW0gKikgc3JjOwotCi0JCQlmb3IgKGkgPSBjICYgMzsgaS0tOykgewotCQkJCWlmIChpICYgMSkgewotCQkJCQkqZHN0OCsrID0gZmJfcmVhZGIoKytzcmM4KTsKLQkJCQl9IGVsc2UgewotCQkJCQkqZHN0OCsrID0gZmJfcmVhZGIoLS1zcmM4KTsKLQkJCQkJc3JjOCArPSAyOwotCQkJCX0KLQkJCX0KLQkJCXNyYyA9ICh1MzIgX19pb21lbSAqKSBzcmM4OwotCQl9Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciwgYykpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkqcHBvcyArPSBjOwotCQlidWYgKz0gYzsKLQkJY250ICs9IGM7Ci0JCWNvdW50IC09IGM7Ci0JfQotCi0Ja2ZyZWUoYnVmZmVyKTsKLQotCXJldHVybiAoZXJyKSA/IGVyciA6IGNudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLXNtdGNmYl93cml0ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCSAgICAgbG9mZl90ICpwcG9zKQotewotCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOwotCi0JdTMyICpidWZmZXIsICpzcmM7Ci0JdTMyIF9faW9tZW0gKmRzdDsKLQlpbnQgYywgaSwgY250ID0gMCwgZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7Ci0KLQlpZiAoIWluZm8gfHwgIWluZm8tPnNjcmVlbl9iYXNlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKLQkJcmV0dXJuIC1FUEVSTTsKLQotCXRvdGFsX3NpemUgPSBpbmZvLT5zY3JlZW5fc2l6ZTsKLQotCWlmICh0b3RhbF9zaXplID09IDApCi0JCXRvdGFsX3NpemUgPSBpbmZvLT5maXguc21lbV9sZW47Ci0KLQlpZiAocCA+IHRvdGFsX3NpemUpCi0JCXJldHVybiAtRUZCSUc7Ci0KLQlpZiAoY291bnQgPiB0b3RhbF9zaXplKSB7Ci0JCWVyciA9IC1FRkJJRzsKLQkJY291bnQgPSB0b3RhbF9zaXplOwotCX0KLQotCWlmIChjb3VudCArIHAgPiB0b3RhbF9zaXplKSB7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gLUVOT1NQQzsKLQotCQljb3VudCA9IHRvdGFsX3NpemUgLSBwOwotCX0KLQotCWJ1ZmZlciA9IGttYWxsb2MoKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkc3QgPSAodTMyIF9faW9tZW0gKikgKGluZm8tPnNjcmVlbl9iYXNlICsgcCk7Ci0KLQlpZiAoaW5mby0+ZmJvcHMtPmZiX3N5bmMpCi0JCWluZm8tPmZib3BzLT5mYl9zeW5jKGluZm8pOwotCi0Jd2hpbGUgKGNvdW50KSB7Ci0JCWMgPSAoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQ7Ci0JCXNyYyA9IGJ1ZmZlcjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoc3JjLCBidWYsIGMpKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmb3IgKGkgPSBjID4+IDI7IGktLTspIHsKLQkJCWZiX3dyaXRlbCgoKnNyYyAmIDB4ZmYwMGZmMDAgPj4gOCkgfAotCQkJCSAgKCpzcmMgJiAweDAwZmYwMGZmIDw8IDgpLCBkc3QrKyk7Ci0JCQlzcmMrKzsKLQkJfQotCQlpZiAoYyAmIDMpIHsKLQkJCXU4ICpzcmM4ID0gKHU4ICopIHNyYzsKLQkJCXU4IF9faW9tZW0gKmRzdDggPSAodTggX19pb21lbSAqKSBkc3Q7Ci0KLQkJCWZvciAoaSA9IGMgJiAzOyBpLS07KSB7Ci0JCQkJaWYgKGkgJiAxKSB7Ci0JCQkJCWZiX3dyaXRlYigqc3JjOCsrLCArK2RzdDgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZiX3dyaXRlYigqc3JjOCsrLCAtLWRzdDgpOwotCQkJCQlkc3Q4ICs9IDI7Ci0JCQkJfQotCQkJfQotCQkJZHN0ID0gKHUzMiBfX2lvbWVtICopIGRzdDg7Ci0JCX0KLQotCQkqcHBvcyArPSBjOwotCQlidWYgKz0gYzsKLQkJY250ICs9IGM7Ci0JCWNvdW50IC09IGM7Ci0JfQotCi0Ja2ZyZWUoYnVmZmVyKTsKLQotCXJldHVybiAoY250KSA/IGNudCA6IGVycjsKLX0KLSNlbmRpZgkvKiAhIF9fQklHX0VORElBTiAqLwotCi1zdGF0aWMgdm9pZCBzbTd4eF9zZXRfdGltaW5nKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCWludCBpID0gMCwgaiA9IDA7Ci0JdTMyIG1fblNjcmVlblN0cmlkZTsKLQotCWRldl9kYmcoJnNmYi0+cGRldi0+ZGV2LAotCQkic2ZiLT53aWR0aD0lZCBzZmItPmhlaWdodD0lZCAiCi0JCSJzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbD0lZCBzZmItPmh6PSVkXG4iLAotCQlzZmItPndpZHRoLCBzZmItPmhlaWdodCwgc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwsIHNmYi0+aHopOwotCi0JZm9yIChqID0gMDsgaiA8IG51bVZHQU1vZGVzOyBqKyspIHsKLQkJaWYgKFZHQU1vZGVbal0ubW1TaXplWCA9PSBzZmItPndpZHRoICYmCi0JCSAgICBWR0FNb2RlW2pdLm1tU2l6ZVkgPT0gc2ZiLT5oZWlnaHQgJiYKLQkJICAgIFZHQU1vZGVbal0uYnBwID09IHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsICYmCi0JCSAgICBWR0FNb2RlW2pdLmh6ID09IHNmYi0+aHopIHsKLQotCQkJZGV2X2RiZygmc2ZiLT5wZGV2LT5kZXYsCi0JCQkJIlZHQU1vZGVbal0ubW1TaXplWD0lZCBWR0FNb2RlW2pdLm1tU2l6ZVk9JWQgIgotCQkJCSJWR0FNb2RlW2pdLmJwcD0lZCBWR0FNb2RlW2pdLmh6PSVkXG4iLAotCQkJCVZHQU1vZGVbal0ubW1TaXplWCwgVkdBTW9kZVtqXS5tbVNpemVZLAotCQkJCVZHQU1vZGVbal0uYnBwLCBWR0FNb2RlW2pdLmh6KTsKLQotCQkJZGV2X2RiZygmc2ZiLT5wZGV2LT5kZXYsICJWR0FNb2RlIGluZGV4PSVkXG4iLCBqKTsKLQotCQkJc210Y19tbWlvd2IoMHgwLCAweDNjNik7Ci0KLQkJCXNtdGNfc2VxdygwLCAweDEpOwotCi0JCQlzbXRjX21taW93YihWR0FNb2RlW2pdLkluaXRfTUlTQywgMHgzYzIpOwotCi0JCQkvKiBpbml0IFNFUSByZWdpc3RlciBTUjAwIC0gU1IwNCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfU1IwMF9TUjA0OyBpKyspCi0JCQkJc210Y19zZXF3KGksIFZHQU1vZGVbal0uSW5pdF9TUjAwX1NSMDRbaV0pOwotCi0JCQkvKiBpbml0IFNFUSByZWdpc3RlciBTUjEwIC0gU1IyNCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfU1IxMF9TUjI0OyBpKyspCi0JCQkJc210Y19zZXF3KGkgKyAweDEwLAotCQkJCQkgIFZHQU1vZGVbal0uSW5pdF9TUjEwX1NSMjRbaV0pOwotCi0JCQkvKiBpbml0IFNFUSByZWdpc3RlciBTUjMwIC0gU1I3NSAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfU1IzMF9TUjc1OyBpKyspCi0JCQkJaWYgKChpICsgMHgzMCkgIT0gMHg2MiAmJgotCQkJCSAgICAoaSArIDB4MzApICE9IDB4NmEgJiYKLQkJCQkgICAgKGkgKyAweDMwKSAhPSAweDZiKQotCQkJCQlzbXRjX3NlcXcoaSArIDB4MzAsCi0JCQkJCQlWR0FNb2RlW2pdLkluaXRfU1IzMF9TUjc1W2ldKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1I4MCAtIFNSOTMgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSODBfU1I5MzsgaSsrKQotCQkJCXNtdGNfc2VxdyhpICsgMHg4MCwKLQkJCQkJICBWR0FNb2RlW2pdLkluaXRfU1I4MF9TUjkzW2ldKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1JBMCAtIFNSQUYgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSQTBfU1JBRjsgaSsrKQotCQkJCXNtdGNfc2VxdyhpICsgMHhhMCwKLQkJCQkJICBWR0FNb2RlW2pdLkluaXRfU1JBMF9TUkFGW2ldKTsKLQotCQkJLyogaW5pdCBHcmFwaGljIHJlZ2lzdGVyIEdSMDAgLSBHUjA4ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9HUjAwX0dSMDg7IGkrKykKLQkJCQlzbXRjX2dycGh3KGksIFZHQU1vZGVbal0uSW5pdF9HUjAwX0dSMDhbaV0pOwotCi0JCQkvKiBpbml0IEF0dHJpYnV0ZSByZWdpc3RlciBBUjAwIC0gQVIxNCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfQVIwMF9BUjE0OyBpKyspCi0JCQkJc210Y19hdHRydyhpLCBWR0FNb2RlW2pdLkluaXRfQVIwMF9BUjE0W2ldKTsKLQotCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSMDAgLSBDUjE4ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjAwX0NSMTg7IGkrKykKLQkJCQlzbXRjX2NydGN3KGksIFZHQU1vZGVbal0uSW5pdF9DUjAwX0NSMThbaV0pOwotCi0JCQkvKiBpbml0IENSVEMgcmVnaXN0ZXIgQ1IzMCAtIENSNEQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0NSMzBfQ1I0RDsgaSsrKQotCQkJCXNtdGNfY3J0Y3coaSArIDB4MzAsCi0JCQkJCSAgIFZHQU1vZGVbal0uSW5pdF9DUjMwX0NSNERbaV0pOwotCi0JCQkvKiBpbml0IENSVEMgcmVnaXN0ZXIgQ1I5MCAtIENSQTcgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0NSOTBfQ1JBNzsgaSsrKQotCQkJCXNtdGNfY3J0Y3coaSArIDB4OTAsCi0JCQkJCSAgIFZHQU1vZGVbal0uSW5pdF9DUjkwX0NSQTdbaV0pOwotCQl9Ci0JfQotCXNtdGNfbW1pb3diKDB4NjcsIDB4M2MyKTsKLQotCS8qIHNldCBWUFIgcmVnaXN0ZXJzICovCi0Jd3JpdGVsKDB4MCwgc2ZiLT52cF9yZWdzICsgMHgwQyk7Ci0Jd3JpdGVsKDB4MCwgc2ZiLT52cF9yZWdzICsgMHg0MCk7Ci0KLQkvKiBzZXQgZGF0YSB3aWR0aCAqLwotCW1fblNjcmVlblN0cmlkZSA9Ci0JCShzZmItPndpZHRoICogc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpIC8gNjQ7Ci0Jc3dpdGNoIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgODoKLQkJd3JpdGVsKDB4MCwgc2ZiLT52cF9yZWdzICsgMHgwKTsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJd3JpdGVsKDB4MDAwMjAwMDAsIHNmYi0+dnBfcmVncyArIDB4MCk7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXdyaXRlbCgweDAwMDQwMDAwLCBzZmItPnZwX3JlZ3MgKyAweDApOwotCQlicmVhazsKLQljYXNlIDMyOgotCQl3cml0ZWwoMHgwMDAzMDAwMCwgc2ZiLT52cF9yZWdzICsgMHgwKTsKLQkJYnJlYWs7Ci0JfQotCXdyaXRlbCgodTMyKSAoKChtX25TY3JlZW5TdHJpZGUgKyAyKSA8PCAxNikgfCBtX25TY3JlZW5TdHJpZGUpLAotCSAgICAgICBzZmItPnZwX3JlZ3MgKyAweDEwKTsKLQotfQotCi1zdGF0aWMgdm9pZCBzbXRjX3NldF90aW1pbmcoc3RydWN0IHNtdGNmYl9pbmZvICpzZmIpCi17Ci0Jc3dpdGNoIChzZmItPmNoaXBfaWQpIHsKLQljYXNlIDB4NzEwOgotCWNhc2UgMHg3MTI6Ci0JY2FzZSAweDcyMDoKLQkJc203eHhfc2V0X3RpbWluZyhzZmIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNtdGNmYl9zZXRtb2RlKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCXN3aXRjaCAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpIHsKLQljYXNlIDMyOgotCQlzZmItPmZiLmZpeC52aXN1YWwgICAgICAgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOwotCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCAgPSBzZmItPmZiLnZhci54cmVzICogNDsKLQkJc2ZiLT5mYi52YXIucmVkLmxlbmd0aCAgID0gODsKLQkJc2ZiLT5mYi52YXIuZ3JlZW4ubGVuZ3RoID0gODsKLQkJc2ZiLT5mYi52YXIuYmx1ZS5sZW5ndGggID0gODsKLQkJc2ZiLT5mYi52YXIucmVkLm9mZnNldCAgID0gMTY7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLm9mZnNldCA9IDg7Ci0JCXNmYi0+ZmIudmFyLmJsdWUub2Zmc2V0ICA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXNmYi0+ZmIuZml4LnZpc3VhbCAgICAgICA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JCXNmYi0+ZmIuZml4LmxpbmVfbGVuZ3RoICA9IHNmYi0+ZmIudmFyLnhyZXMgKiAzOwotCQlzZmItPmZiLnZhci5yZWQubGVuZ3RoICAgPSA4OwotCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSA4OwotCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCAgPSA4OwotCQlzZmItPmZiLnZhci5yZWQub2Zmc2V0ICAgPSAxNjsKLQkJc2ZiLT5mYi52YXIuZ3JlZW4ub2Zmc2V0ID0gODsKLQkJc2ZiLT5mYi52YXIuYmx1ZS5vZmZzZXQgID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQlzZmItPmZiLmZpeC52aXN1YWwgICAgICAgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7Ci0JCXNmYi0+ZmIuZml4LmxpbmVfbGVuZ3RoICA9IHNmYi0+ZmIudmFyLnhyZXM7Ci0JCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggICA9IDM7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLmxlbmd0aCA9IDM7Ci0JCXNmYi0+ZmIudmFyLmJsdWUubGVuZ3RoICA9IDI7Ci0JCXNmYi0+ZmIudmFyLnJlZC5vZmZzZXQgICA9IDU7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLm9mZnNldCA9IDI7Ci0JCXNmYi0+ZmIudmFyLmJsdWUub2Zmc2V0ICA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMTY6Ci0JZGVmYXVsdDoKLQkJc2ZiLT5mYi5maXgudmlzdWFsICAgICAgID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKLQkJc2ZiLT5mYi5maXgubGluZV9sZW5ndGggID0gc2ZiLT5mYi52YXIueHJlcyAqIDI7Ci0JCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggICA9IDU7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLmxlbmd0aCA9IDY7Ci0JCXNmYi0+ZmIudmFyLmJsdWUubGVuZ3RoICA9IDU7Ci0JCXNmYi0+ZmIudmFyLnJlZC5vZmZzZXQgICA9IDExOwotCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSA1OwotCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCAgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlzZmItPndpZHRoICA9IHNmYi0+ZmIudmFyLnhyZXM7Ci0Jc2ZiLT5oZWlnaHQgPSBzZmItPmZiLnZhci55cmVzOwotCXNmYi0+aHogPSA2MDsKLQlzbXRjX3NldF90aW1pbmcoc2ZiKTsKLX0KLQotc3RhdGljIGludCBzbXRjX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0JLyogc2FuaXR5IGNoZWNrcyAqLwotCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKLQkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7Ci0KLQlpZiAodmFyLT55cmVzX3ZpcnR1YWwgPCB2YXItPnlyZXMpCi0JCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOwotCi0JLyogc2V0IHZhbGlkIGRlZmF1bHQgYnBwICovCi0JaWYgKCh2YXItPmJpdHNfcGVyX3BpeGVsICE9IDgpICAmJiAodmFyLT5iaXRzX3Blcl9waXhlbCAhPSAxNikgJiYKLQkgICAgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMjQpICYmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IDMyKSkKLQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDE2OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc210Y19zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXNtdGNmYl9zZXRtb2RlKGluZm8tPnBhcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBmYl9vcHMgc210Y2ZiX29wcyA9IHsKLQkub3duZXIgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmZiX2NoZWNrX3ZhciA9IHNtdGNfY2hlY2tfdmFyLAotCS5mYl9zZXRfcGFyICAgPSBzbXRjX3NldF9wYXIsCi0JLmZiX3NldGNvbHJlZyA9IHNtdGNfc2V0Y29scmVnLAotCS5mYl9ibGFuayAgICAgPSBzbXRjX2JsYW5rLAotCS5mYl9maWxscmVjdCAgPSBjZmJfZmlsbHJlY3QsCi0JLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCi0JLmZiX2NvcHlhcmVhICA9IGNmYl9jb3B5YXJlYSwKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkuZmJfcmVhZCAgICAgID0gc210Y2ZiX3JlYWQsCi0JLmZiX3dyaXRlICAgICA9IHNtdGNmYl93cml0ZSwKLSNlbmRpZgotfTsKLQotLyoKLSAqIGFsbG9jIHN0cnVjdCBzbXRjZmJfaW5mbyBhbmQgYXNzaWduIGRlZmF1bHQgdmFsdWVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNtdGNfYWxsb2NfZmJfaW5mbyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQotCXNmYiA9IGt6YWxsb2Moc2l6ZW9mKCpzZmIpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghc2ZiKQotCQlyZXR1cm4gTlVMTDsKLQotCXNmYi0+cGRldiA9IHBkZXY7Ci0KLQlzZmItPmZiLmZsYWdzICAgICAgICAgID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKLQlzZmItPmZiLmZib3BzICAgICAgICAgID0gJnNtdGNmYl9vcHM7Ci0Jc2ZiLT5mYi5maXggICAgICAgICAgICA9IHNtdGNmYl9maXg7Ci0Jc2ZiLT5mYi52YXIgICAgICAgICAgICA9IHNtdGNmYl92YXI7Ci0Jc2ZiLT5mYi5wc2V1ZG9fcGFsZXR0ZSA9IHNmYi0+Y29scmVnOwotCXNmYi0+ZmIucGFyICAgICAgICAgICAgPSBzZmI7Ci0KLQlyZXR1cm4gc2ZiOwotfQotCi0vKgotICogZnJlZSBzdHJ1Y3Qgc210Y2ZiX2luZm8KLSAqLwotc3RhdGljIHZvaWQgc210Y19mcmVlX2ZiX2luZm8oc3RydWN0IHNtdGNmYl9pbmZvICpzZmIpCi17Ci0Ja2ZyZWUoc2ZiKTsKLX0KLQotLyoKLSAqIFVubWFwIGluIHRoZSBtZW1vcnkgbWFwcGVkIElPIHJlZ2lzdGVycwotICovCi0KLXN0YXRpYyB2b2lkIHNtdGNfdW5tYXBfbW1pbyhzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKLXsKLQlpZiAoc2ZiICYmIHNtdGNfUmVnQmFzZUFkZHJlc3MpCi0JCXNtdGNfUmVnQmFzZUFkZHJlc3MgPSBOVUxMOwotfQotCi0vKgotICogTWFwIGluIHRoZSBzY3JlZW4gbWVtb3J5Ci0gKi8KLQotc3RhdGljIGludCBzbXRjX21hcF9zbWVtKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiLAotCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdV9sb25nIHNtZW1fbGVuKQotewotCi0Jc2ZiLT5mYi5maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKLQotI2lmZGVmIF9fQklHX0VORElBTgotCWlmIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9PSAzMikKLQkJc2ZiLT5mYi5maXguc21lbV9zdGFydCArPSAweDgwMDAwMDsKLSNlbmRpZgotCi0Jc2ZiLT5mYi5maXguc21lbV9sZW4gPSBzbWVtX2xlbjsKLQotCXNmYi0+ZmIuc2NyZWVuX2Jhc2UgPSBzZmItPmxmYjsKLQotCWlmICghc2ZiLT5mYi5zY3JlZW5fYmFzZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IHVuYWJsZSB0byBtYXAgc2NyZWVuIG1lbW9yeVxuIiwgc2ZiLT5mYi5maXguaWQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFVubWFwIGluIHRoZSBzY3JlZW4gbWVtb3J5Ci0gKgotICovCi1zdGF0aWMgdm9pZCBzbXRjX3VubWFwX3NtZW0oc3RydWN0IHNtdGNmYl9pbmZvICpzZmIpCi17Ci0JaWYgKHNmYiAmJiBzZmItPmZiLnNjcmVlbl9iYXNlKSB7Ci0JCWlvdW5tYXAoc2ZiLT5mYi5zY3JlZW5fYmFzZSk7Ci0JCXNmYi0+ZmIuc2NyZWVuX2Jhc2UgPSBOVUxMOwotCX0KLX0KLQotLyoKLSAqIFdlIG5lZWQgdG8gd2FrZSB1cCB0aGUgZGV2aWNlIGFuZCBtYWtlIHN1cmUgaXRzIGluIGxpbmVhciBtZW1vcnkgbW9kZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNtN3h4X2luaXRfaHcodm9pZCkKLXsKLQlvdXRiX3AoMHgxOCwgMHgzYzQpOwotCW91dGJfcCgweDExLCAweDNjNSk7Ci19Ci0KLXN0YXRpYyBpbnQgc210Y2ZiX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOwotCXVfbG9uZyBzbWVtX3NpemUgPSAweDAwODAwMDAwOwkvKiBkZWZhdWx0IDhNQiAqLwotCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2U7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiU2lsaWNvbiBNb3Rpb24gZGlzcGxheSBkcml2ZXIuIik7Ci0KLQllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsJLyogZW5hYmxlIFNNVEMgY2hpcCAqLwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlzcHJpbnRmKHNtdGNmYl9maXguaWQsICJzbSVYZmIiLCBlbnQtPmRldmljZSk7Ci0KLQlzZmIgPSBzbXRjX2FsbG9jX2ZiX2luZm8ocGRldik7Ci0KLQlpZiAoIXNmYikgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZF9mcmVlOwotCX0KLQotCXNmYi0+Y2hpcF9pZCA9IGVudC0+ZGV2aWNlOwotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIHNmYik7Ci0KLQlzbTd4eF9pbml0X2h3KCk7Ci0KLQkvKiBnZXQgbW9kZSBwYXJhbWV0ZXIgZnJvbSBzbXRjX3Njcl9pbmZvICovCi0JaWYgKHNtdGNfc2NyX2luZm8ubGZiX3dpZHRoICE9IDApIHsKLQkJc2ZiLT5mYi52YXIueHJlcyA9IHNtdGNfc2NyX2luZm8ubGZiX3dpZHRoOwotCQlzZmItPmZiLnZhci55cmVzID0gc210Y19zY3JfaW5mby5sZmJfaGVpZ2h0OwotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IHNtdGNfc2NyX2luZm8ubGZiX2RlcHRoOwotCX0gZWxzZSB7Ci0JCS8qIGRlZmF1bHQgcmVzb2x1dGlvbiAxMDI0eDYwMCAxNmJpdCBtb2RlICovCi0JCXNmYi0+ZmIudmFyLnhyZXMgPSBTQ1JFRU5fWF9SRVM7Ci0JCXNmYi0+ZmIudmFyLnlyZXMgPSBTQ1JFRU5fWV9SRVM7Ci0JCXNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID0gU0NSRUVOX0JQUDsKLQl9Ci0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMjQpCi0JCXNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID0gKHNtdGNfc2NyX2luZm8ubGZiX2RlcHRoID0gMzIpOwotI2VuZGlmCi0JLyogTWFwIGFkZHJlc3MgYW5kIG1lbW9yeSBkZXRlY3Rpb24gKi8KLQltbWlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmc2ZiLT5jaGlwX3Jldl9pZCk7Ci0KLQlzd2l0Y2ggKHNmYi0+Y2hpcF9pZCkgewotCWNhc2UgMHg3MTA6Ci0JY2FzZSAweDcxMjoKLQkJc2ZiLT5mYi5maXgubW1pb19zdGFydCA9IG1taW9fYmFzZSArIDB4MDA0MDAwMDA7Ci0JCXNmYi0+ZmIuZml4Lm1taW9fbGVuID0gMHgwMDQwMDAwMDsKLQkJc21lbV9zaXplID0gU003MTJfVklERU9NRU1PUllTSVpFOwotI2lmZGVmIF9fQklHX0VORElBTgotCQlzZmItPmxmYiA9IGlvcmVtYXAobW1pb19iYXNlLCAweDAwYzAwMDAwKTsKLSNlbHNlCi0JCXNmYi0+bGZiID0gaW9yZW1hcChtbWlvX2Jhc2UsIDB4MDA4MDAwMDApOwotI2VuZGlmCi0JCXNmYi0+bW1pbyA9IChzbXRjX1JlZ0Jhc2VBZGRyZXNzID0KLQkJICAgIHNmYi0+bGZiICsgMHgwMDcwMDAwMCk7Ci0JCXNmYi0+ZHBfcmVncyA9IHNmYi0+bGZiICsgMHgwMDQwODAwMDsKLQkJc2ZiLT52cF9yZWdzID0gc2ZiLT5sZmIgKyAweDAwNDBjMDAwOwotI2lmZGVmIF9fQklHX0VORElBTgotCQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpIHsKLQkJCXNmYi0+bGZiICs9IDB4ODAwMDAwOwotCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgInNmYi0+bGZiPSVwIiwgc2ZiLT5sZmIpOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCFzbXRjX1JlZ0Jhc2VBZGRyZXNzKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiB1bmFibGUgdG8gbWFwIG1lbW9yeSBtYXBwZWQgSU8hIiwKLQkJCQlzZmItPmZiLmZpeC5pZCk7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBmYWlsZWRfZmI7Ci0JCX0KLQotCQkvKiBzZXQgTUNMSyA9IDE0LjMxODE4ICogKDB4MTYgLyAweDIpICovCi0JCXNtdGNfc2VxdygweDZhLCAweDE2KTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHg2MiwgMHgzZSk7Ci0JCS8qIGVuYWJsZSBQQ0kgYnVyc3QgKi8KLQkJc210Y19zZXF3KDB4MTcsIDB4MjApOwotCQkvKiBlbmFibGUgd29yZCBzd2FwICovCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCWlmIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9PSAzMikKLQkJCXNtdGNfc2VxdygweDE3LCAweDMwKTsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIDB4NzIwOgotCQlzZmItPmZiLmZpeC5tbWlvX3N0YXJ0ID0gbW1pb19iYXNlOwotCQlzZmItPmZiLmZpeC5tbWlvX2xlbiA9IDB4MDAyMDAwMDA7Ci0JCXNtZW1fc2l6ZSA9IFNNNzIyX1ZJREVPTUVNT1JZU0laRTsKLQkJc2ZiLT5kcF9yZWdzID0gaW9yZW1hcChtbWlvX2Jhc2UsIDB4MDBhMDAwMDApOwotCQlzZmItPmxmYiA9IHNmYi0+ZHBfcmVncyArIDB4MDAyMDAwMDA7Ci0JCXNmYi0+bW1pbyA9IChzbXRjX1JlZ0Jhc2VBZGRyZXNzID0KLQkJICAgIHNmYi0+ZHBfcmVncyArIDB4MDAwYzAwMDApOwotCQlzZmItPnZwX3JlZ3MgPSBzZmItPmRwX3JlZ3MgKyAweDgwMDsKLQotCQlzbXRjX3NlcXcoMHg2MiwgMHhmZik7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBkKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiTm8gdmFsaWQgU2lsaWNvbiBNb3Rpb24gZGlzcGxheSBjaGlwIHdhcyBkZXRlY3RlZCEiKTsKLQotCQlnb3RvIGZhaWxlZF9mYjsKLQl9Ci0KLQkvKiBjYW4gc3VwcG9ydCAzMiBicHAgKi8KLQlpZiAoMTUgPT0gc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpCi0JCXNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID0gMTY7Ci0KLQlzZmItPmZiLnZhci54cmVzX3ZpcnR1YWwgPSBzZmItPmZiLnZhci54cmVzOwotCXNmYi0+ZmIudmFyLnlyZXNfdmlydHVhbCA9IHNmYi0+ZmIudmFyLnlyZXM7Ci0JZXJyID0gc210Y19tYXBfc21lbShzZmIsIHBkZXYsIHNtZW1fc2l6ZSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsZWQ7Ci0KLQlzbXRjZmJfc2V0bW9kZShzZmIpOwotCi0JZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoJnNmYi0+ZmIpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGZhaWxlZDsKLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsCi0JCSAiU2lsaWNvbiBNb3Rpb24gU00lWCBSZXYlWCBwcmltYXJ5IGRpc3BsYXkgbW9kZSAlZHglZC0lZCBJbml0IENvbXBsZXRlLiIsCi0JCSBzZmItPmNoaXBfaWQsIHNmYi0+Y2hpcF9yZXZfaWQsIHNmYi0+ZmIudmFyLnhyZXMsCi0JCSBzZmItPmZiLnZhci55cmVzLCBzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCk7Ci0KLQlyZXR1cm4gMDsKLQotZmFpbGVkOgotCWRldl9lcnIoJnBkZXYtPmRldiwgIlNpbGljb24gTW90aW9uLCBJbmMuIHByaW1hcnkgZGlzcGxheSBpbml0IGZhaWwuIik7Ci0KLQlzbXRjX3VubWFwX3NtZW0oc2ZiKTsKLQlzbXRjX3VubWFwX21taW8oc2ZiKTsKLWZhaWxlZF9mYjoKLQlzbXRjX2ZyZWVfZmJfaW5mbyhzZmIpOwotCi1mYWlsZWRfZnJlZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogMHg3MTAgKEx5bnhFTSkKLSAqIDB4NzEyIChMeW54RU0rKQotICogMHg3MjAgKEx5bngzRE0sIEx5bngzRE0rKQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc210Y2ZiX3BjaV90YWJsZVtdID0gewotCXsgUENJX0RFVklDRSgweDEyNmYsIDB4NzEwKSwgfSwKLQl7IFBDSV9ERVZJQ0UoMHgxMjZmLCAweDcxMiksIH0sCi0JeyBQQ0lfREVWSUNFKDB4MTI2ZiwgMHg3MjApLCB9LAotCXswLH0KLX07Ci0KLXN0YXRpYyB2b2lkIHNtdGNmYl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOwotCi0Jc2ZiID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXNtdGNfdW5tYXBfc21lbShzZmIpOwotCXNtdGNfdW5tYXBfbW1pbyhzZmIpOwotCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoJnNmYi0+ZmIpOwotCXNtdGNfZnJlZV9mYl9pbmZvKHNmYik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc210Y2ZiX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQotCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIHNldCB0aGUgaHcgaW4gc2xlZXAgbW9kZSB1c2UgZXh0ZXJuYWwgY2xvY2sgYW5kIHNlbGYgbWVtb3J5IHJlZnJlc2gKLQkgKiBzbyB0aGF0IHdlIGNhbiB0dXJuIG9mZiBpbnRlcm5hbCBQTExzIGxhdGVyIG9uCi0JICovCi0Jc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgfCAweGMwKSk7Ci0Jc210Y19zZXF3KDB4NjksIChzbXRjX3NlcXIoMHg2OSkgJiAweGY3KSk7Ci0KLQljb25zb2xlX2xvY2soKTsKLQlmYl9zZXRfc3VzcGVuZCgmc2ZiLT5mYiwgMSk7Ci0JY29uc29sZV91bmxvY2soKTsKLQotCS8qIGFkZGl0aW9uYWxseSB0dXJuIG9mZiBhbGwgZnVuY3Rpb24gYmxvY2tzIGluY2x1ZGluZyBpbnRlcm5hbCBQTExzICovCi0Jc210Y19zZXF3KDB4MjEsIDB4ZmYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc210Y2ZiX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOwotCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOwotCi0Jc2ZiID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyogcmVpbml0IGhhcmR3YXJlICovCi0Jc203eHhfaW5pdF9odygpOwotCXN3aXRjaCAoc2ZiLT5jaGlwX2lkKSB7Ci0JY2FzZSAweDcxMDoKLQljYXNlIDB4NzEyOgotCQkvKiBzZXQgTUNMSyA9IDE0LjMxODE4ICogICgweDE2IC8gMHgyKSAqLwotCQlzbXRjX3NlcXcoMHg2YSwgMHgxNik7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJc210Y19zZXF3KDB4NjIsIDB4M2UpOwotCQkvKiBlbmFibGUgUENJIGJ1cnN0ICovCi0JCXNtdGNfc2VxdygweDE3LCAweDIwKTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDMyKQotCQkJc210Y19zZXF3KDB4MTcsIDB4MzApOwotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgMHg3MjA6Ci0JCXNtdGNfc2VxdygweDYyLCAweGZmKTsKLQkJc210Y19zZXF3KDB4NmEsIDB4MGQpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCWJyZWFrOwotCX0KLQotCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHhjMCkpOwotCXNtdGNfc2VxdygweDMzLCAoKHNtdGNfc2VxcigweDMzKSB8IDB4MDgpICYgMHhmYikpOwotCi0Jc210Y2ZiX3NldG1vZGUoc2ZiKTsKLQotCWNvbnNvbGVfbG9jaygpOwotCWZiX3NldF9zdXNwZW5kKCZzZmItPmZiLCAwKTsKLQljb25zb2xlX3VubG9jaygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzbTd4eF9wbV9vcHMsIHNtdGNmYl9wY2lfc3VzcGVuZCwgc210Y2ZiX3BjaV9yZXN1bWUpOwotI2RlZmluZSBTTTdYWF9QTV9PUFMgKCZzbTd4eF9wbV9vcHMpCi0KLSNlbHNlICAvKiAhQ09ORklHX1BNICovCi0KLSNkZWZpbmUgU003WFhfUE1fT1BTIE5VTEwKLQotI2VuZGlmIC8qICFDT05GSUdfUE0gKi8KLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNtdGNmYl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAic210Y2ZiIiwKLQkuaWRfdGFibGUgPSBzbXRjZmJfcGNpX3RhYmxlLAotCS5wcm9iZSA9IHNtdGNmYl9wY2lfcHJvYmUsCi0JLnJlbW92ZSA9IHNtdGNmYl9wY2lfcmVtb3ZlLAotCS5kcml2ZXIucG0gID0gU003WFhfUE1fT1BTLAotfTsKLQotbW9kdWxlX3BjaV9kcml2ZXIoc210Y2ZiX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIlNpbGljb25tb3Rpb24gIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgU01JIEdyYXBoaWMgQ2FyZHMiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NlcmlhbGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5jCmluZGV4IDRlMThmYjQuLmM2MmQ3NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NlcmlhbGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc2VyaWFsaW8uYwpAQCAtNDAsNyArNDAsNyBAQAogCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7CiAJaWYgKHN5bnRoX3JlcXVlc3RfcmVnaW9uKHNlci0+cG9ydCwgOCkpIHsKIAkJLyogdHJ5IHRvIHRha2UgaXQgYmFjay4gKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydHMgbm90IGF2YWlsYWJsZSwgdHJ5aW5nIHRvIHN0ZWFsIHRoZW1cbiIpOworCQlwcl9pbmZvKCJQb3J0cyBub3QgYXZhaWxhYmxlLCB0cnlpbmcgdG8gc3RlYWwgdGhlbVxuIik7CiAJCV9fcmVsZWFzZV9yZWdpb24oJmlvcG9ydF9yZXNvdXJjZSwgc2VyLT5wb3J0LCA4KTsKIAkJZXJyID0gc3ludGhfcmVxdWVzdF9yZWdpb24oc2VyLT5wb3J0LCA4KTsKIAkJaWYgKGVycikgewpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCQkgInNlcmlhbCIsICh2b2lkICopIHN5bnRoX3JlYWRidWZfaGFuZGxlcik7CiAKIAlpZiAocnYpCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlcXVlc3QgU3BlYWt1cCBzZXJpYWwgSSBSIFFcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byByZXF1ZXN0IFNwZWFrdXAgc2VyaWFsIEkgUiBRXG4iKTsKIAkvKiBTZXQgTUNSICovCiAJb3V0YihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyLAogCQkJc3BlYWt1cF9pbmZvLnBvcnRfdHRzICsgVUFSVF9NQ1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMKaW5kZXggMTVmZGVjMy4uNzU2ZDAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3Rsay5jCkBAIC0yNzAsMTAgKzI3MCwxMiBAQAogCQkJaWYgKGppZmZpZXMgPj0gamlmZl9tYXgpIHsKIAkJCQlpZiAoIWluX2VzY2FwZSkKIAkJCQkJc3BrX3NlcmlhbF9vdXQoUFJPQ1NQRUVDSCk7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssCisJCQkJCQlmbGFncyk7CiAJCQkJamlmZnlfZGVsdGFfdmFsID0gamlmZnlfZGVsdGEtPnUubi52YWx1ZTsKIAkJCQlkZWxheV90aW1lX3ZhbCA9IGRlbGF5X3RpbWUtPnUubi52YWx1ZTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssCisJCQkJCQlmbGFncyk7CiAJCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzCiAJCQkJCQkgKGRlbGF5X3RpbWVfdmFsKSk7CiAJCQkJamlmZl9tYXggPSBqaWZmaWVzICsgamlmZnlfZGVsdGFfdmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvS2NvbmZpZwppbmRleCAxYjZkNTgxLi5iNWU3NGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvS2NvbmZpZwpAQCAtMTcsNyArMTcsNyBAQAogCiBjb25maWcgVElEU1BCUklER0VfRFZGUwogCWJvb2wgIkVuYWJsZSBCcmlkZ2UgRHluYW1pYyBWb2x0YWdlIGFuZCBGcmVxdWVuY3kgU2NhbGluZyAoRFZGUykiCi0JZGVwZW5kcyBvbiBUSURTUEJSSURHRSAmJiBPTUFQX1BNX1NSRiAmJiBDUFVfRlJFUQorCWRlcGVuZHMgb24gVElEU1BCUklER0UgJiYgQ1BVX0ZSRVEKIAloZWxwCiAJICBEVkZTIGFsbG93cyBEU1AgQnJpZGdlIHRvIGluaXRpYXRlIHRoZSBvcGVyYXRpbmcgcG9pbnQgY2hhbmdlIHRvCiAJICBzY2FsZSB0aGUgY2hpcCB2b2x0YWdlIGFuZCBmcmVxdWVuY3kgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9pb19zbS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYwppbmRleCBlMzIyZmI3Li5jMjgyOWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9pb19zbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL2lvX3NtLmMKQEAgLTIxMjcsNyArMjEyNyw3IEBACiAJdTMyIG1vZHVsZV9zaXplOwogCXUzMiBtb2R1bGVfc3RydWN0X3NpemUgPSAwOwogCXUzMiBzZWN0X25keDsKLQljaGFyICpzZWN0X3N0ciA7CisJY2hhciAqc2VjdF9zdHI7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlzdGF0dXMgPSBkZXZfZ2V0X2ludGZfZnhucyhkZXZfb2JqZWN0LCAmaW50Zl9meG5zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYwppbmRleCBiNzcwYjIyLi44OTQ1YjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jCkBAIC0yODAsOSArMjgwLDggQEAKIAkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX0NNX0NMS1NUQ1RSTCk7CiAKIAkJLyogV2FpdCB1bnRpbCB0aGUgc3RhdGUgaGFzIG1vdmVkIHRvIE9OICovCi0JCXdoaWxlICgoKnBkYXRhLT5kc3BfcHJtX3JlYWQpKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9QTV9QV1NUU1QpICYKLQkJCQkJCU9NQVBfSU5UUkFOU0lUSU9OX01BU0spCi0JCQk7CisJCXdoaWxlICgqcGRhdGEtPmRzcF9wcm1fcmVhZChPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSYKKwkJCQkJT01BUF9JTlRSQU5TSVRJT05fTUFTSyk7CiAJCS8qIERpc2FibGUgQXV0b21hdGljIHRyYW5zaXRpb24gKi8KIAkJKCpwZGF0YS0+ZHNwX2NtX3dyaXRlKShPTUFQMzRYWF9DTEtTVENUUkxfRElTQUJMRV9BVVRPLAogCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfQ01fQ0xLU1RDVFJMKTsKQEAgLTQxOSw3ICs0MTgsOCBAQAogCQkvKiBBc3NlcnQgUlNUMSBpLmUgb25seSB0aGUgUlNUIG9ubHkgZm9yIERTUCBtZWdhY2VsbCAqLwogCQlpZiAoIXN0YXR1cykgewogCQkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUDM0MzBfUlNUMV9JVkEyX01BU0ssCi0JCQkJCU9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwKKwkJCQkJT01BUDM0MzBfUlNUMV9JVkEyX01BU0ssCisJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELAogCQkJCQlPTUFQMl9STV9SU1RDVFJMKTsKIAogCQkJLyogTWFzayBhZGRyZXNzIHdpdGggMUsgZm9yIGNvbXBhdGliaWxpdHkgKi8KQEAgLTQzMiw3ICs0MzIsOCBAQAogCQkvKiBSZXNldCBhbmQgVW5yZXNldCB0aGUgUlNUMiwgc28gdGhhdCBCT09UQUREUiBpcyBjb3BpZWQgdG8KIAkJICogSVZBMiBTWVNDIHJlZ2lzdGVyICovCiAJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLAotCQkJT01BUDM0MzBfUlNUMl9JVkEyX01BU0ssIE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKKwkJCU9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwKKwkJCU9NQVAyX1JNX1JTVENUUkwpOwogCQl1ZGVsYXkoMTAwKTsKIAkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUDM0MzBfUlNUMl9JVkEyX01BU0ssIDAsCiAJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKQEAgLTQ0Niw3ICs0NDcsOCBAQAogCQkvKiBPbmx5IG1ha2UgVExCIGVudHJ5IGlmIGJvdGggYWRkcmVzc2VzIGFyZSBub24temVybyAqLwogCQlmb3IgKGVudHJ5X25keCA9IDA7IGVudHJ5X25keCA8IEJSRElPQ1RMX05VTU9GTU1VVExCOwogCQkgICAgIGVudHJ5X25keCsrKSB7Ci0JCQlzdHJ1Y3QgYnJpZGdlX2lvY3RsX2V4dHByb2MgKmUgPSAmZGV2X2NvbnRleHQtPmF0bGJfZW50cnlbZW50cnlfbmR4XTsKKwkJCXN0cnVjdCBicmlkZ2VfaW9jdGxfZXh0cHJvYyAqZSA9CisJCQkJJmRldl9jb250ZXh0LT5hdGxiX2VudHJ5W2VudHJ5X25keF07CiAJCQlzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190IG1hcF9hdHRycyA9IHsKIAkJCQkuZW5kaWFuaXNtID0gZS0+ZW5kaWFuaXNtLAogCQkJCS5lbGVtZW50X3NpemUgPSBlLT5lbGVtX3NpemUsCkBAIC02NDEsOCArNjQzLDggQEAKIAkvKiBhcyBwZXIgVFJNLCBpdCBpcyBhZHZpc2VkIHRvIGZpcnN0IGRyaXZlIHRoZSBJVkEyIHRvICdTdGFuZGJ5JyBtb2RlLAogCSAqIGJlZm9yZSB0dXJuaW5nIG9mZiB0aGUgY2xvY2tzLi4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgbm8KIAkgKiBwZW5kaW5nIEwzIG9yIG90aGVyIHRyYW5zYWN0b25zIGZyb20gSVZBMiAqLwotCWRzcF9wd3Jfc3RhdGUgPSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQpKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9QTV9QV1NUU1QpICYKLQkJCQkJT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKKwlkc3BfcHdyX3N0YXRlID0gKCpwZGF0YS0+ZHNwX3BybV9yZWFkKQorCQkoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1BNX1BXU1RTVCkgJiBPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOwogCWlmIChkc3BfcHdyX3N0YXRlICE9IFBXUkRNX1BPV0VSX09GRikgewogCQkoKnBkYXRhLT5kc3BfcHJtX3Jtd19iaXRzKShPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSywgMCwKIAkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1JNX1JTVENUUkwpOwpAQCAtNjgyLDggKzY4NCw5IEBACiAJCWRldl9jb250ZXh0LT5tYm94ID0gTlVMTDsKIAl9CiAJLyogUmVzZXQgSVZBMiBjbG9ja3MqLwotCSgqcGRhdGEtPmRzcF9wcm1fd3JpdGUpKE9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLIHwgT01BUDM0MzBfUlNUMl9JVkEyX01BU0sgfAotCQkJT01BUDM0MzBfUlNUM19JVkEyX01BU0ssIE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKKwkoKnBkYXRhLT5kc3BfcHJtX3dyaXRlKShPTUFQMzQzMF9SU1QxX0lWQTJfTUFTSyB8CisJCQlPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSyB8IE9NQVAzNDMwX1JTVDNfSVZBMl9NQVNLLAorCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1JNX1JTVENUUkwpOwogCiAJZHNwX2Nsb2NrX2Rpc2FibGVfYWxsKGRldl9jb250ZXh0LT5kc3BfcGVyX2Nsa3MpOwogCWRzcF9jbGtfZGlzYWJsZShEU1BfQ0xLX0lWQTIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMF9wd3IuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzBfcHdyLmMKaW5kZXggMTg2MmFmZC4uNjU3MTA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMF9wd3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwX3B3ci5jCkBAIC05OSw3ICs5OSw4IEBACiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CiAJCXB3cl9zdGF0ZSA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkoT01BUDM0MzBfSVZBMl9NT0QsCi0JCQkJCU9NQVAyX1BNX1BXU1RTVCkgJiBPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOworCQkJCQkJICAgT01BUDJfUE1fUFdTVFNUKSAmCisJCQkJCQkgICBPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOwogCX0KIAlpZiAodGltZW91dCA9PSAwKSB7CiAJCXByX2VycigiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBEU1Agb2ZmIG1vZGVcbiIsIF9fZnVuY19fKTsKQEAgLTIwOSw3ICsyMTAsOCBAQAogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQogCQlwd3Jfc3RhdGUgPSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQpKE9NQVAzNDMwX0lWQTJfTU9ELAotCQkJCQlPTUFQMl9QTV9QV1NUU1QpICYgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKKwkJCQkJCSAgIE9NQVAyX1BNX1BXU1RTVCkgJgorCQkJCQkJICAgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKIAl9CiAKIAlpZiAoIXRpbWVvdXQpIHsKQEAgLTM1NSw3ICszNTcsNyBAQAogCSAgICAoZGV2X2NvbnRleHQtPmJyZF9zdGF0ZSA9PSBCUkRfRFNQX0hJQkVSTkFUSU9OKSkgewogCQlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgSVZBIGluIHNsZWVwLiBObyBtZXNzYWdlIHRvIERTUFxuIik7CiAJCXJldHVybiAwOwotCX0gZWxzZSBpZiAoKGRldl9jb250ZXh0LT5icmRfc3RhdGUgPT0gQlJEX1JVTk5JTkcpKSB7CisJfSBlbHNlIGlmIChkZXZfY29udGV4dC0+YnJkX3N0YXRlID09IEJSRF9SVU5OSU5HKSB7CiAJCS8qIFNlbmQgYSBwcmVub3RpZmljYXRpb24gdG8gRFNQICovCiAJCWRldl9kYmcoYnJpZGdlLCAiT1BQOiAlcyBzZW50IG5vdGlmaWNhdGlvbiB0byBEU1BcbiIsIF9fZnVuY19fKTsKIAkJc21faW50ZXJydXB0X2RzcChkZXZfY29udGV4dCwgTUJYX1BNX1NFVFBPSU5UX1BSRU5PVElGWSk7CkBAIC0zOTYsMTMgKzM5OCwxNCBAQAogCQlpb19zaF9tc2V0dGluZyhoaW9fbWdyLCBTSE1fQ1VSUk9QUCwgJmxldmVsKTsKIAkJZGV2X2RiZyhicmlkZ2UsICJPUFA6ICVzIElWQSBpbiBzbGVlcC4gV3JvdGUgdG8gc2htXG4iLAogCQkJX19mdW5jX18pOwotCX0gZWxzZSBpZiAoKGRldl9jb250ZXh0LT5icmRfc3RhdGUgPT0gQlJEX1JVTk5JTkcpKSB7CisJfSBlbHNlIGlmIChkZXZfY29udGV4dC0+YnJkX3N0YXRlID09IEJSRF9SVU5OSU5HKSB7CiAJCS8qIFVwZGF0ZSB0aGUgT1BQIHZhbHVlIGluIHNoYXJlZCBtZW1vcnkgKi8KIAkJaW9fc2hfbXNldHRpbmcoaGlvX21nciwgU0hNX0NVUlJPUFAsICZsZXZlbCk7CiAJCS8qIFNlbmQgYSBwb3N0IG5vdGlmaWNhdGlvbiB0byBEU1AgKi8KIAkJc21faW50ZXJydXB0X2RzcChkZXZfY29udGV4dCwgTUJYX1BNX1NFVFBPSU5UX1BPU1ROT1RJRlkpOwotCQlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgd3JvdGUgdG8gc2htLiBTZW50IHBvc3Qgbm90aWZpY2F0aW9uICIKLQkJCSJ0byBEU1BcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZyhicmlkZ2UsCisJCQkiT1BQOiAlcyB3cm90ZSB0byBzaG0uIFNlbnQgcG9zdCBub3RpZmljYXRpb24gdG8gRFNQXG4iLAorCQkJIF9fZnVuY19fKTsKIAl9IGVsc2UgewogCQlzdGF0dXMgPSAtRVBFUk07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvdHJhbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wLmMKaW5kZXggNDA0YWYxOC4uNWYwNDMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvdHJhbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC90cmFtcC5jCkBAIC01MDMsNyArNTAzLDcgQEAKICAqCSAgVFJBTVBPTElORVMgQVJFIFRSRUFURUQgQVMgMk5EIFBBU1MgZXZlbiB0aG91Z2ggdGhpcyBpcyByZWFsbHkKICAqCSAgdGhlIGZpcnN0IChhbmQgb25seSkgcmVsb2NhdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZW0uCiAgKi8KLXN0YXRpYyBpbnQgcHJpdl9wa3RfcmVsbyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdGd0X2F1X3QgKiBkYXRhLAorc3RhdGljIGludCBwcml2X3BrdF9yZWxvKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLCB0Z3RfYXVfdCAqZGF0YSwKIAkJCSBzdHJ1Y3QgcmVsb2NfcmVjb3JkX3QgKnJwW10sIHUzMiByZWxvX2NvdW50KQogewogCWludCByZXRfdmFsID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2RiZGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jCmluZGV4IDE5MGNhM2YuLjJhZTQ4YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2RiZGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZGJkY2QuYwpAQCAtMTAxLDE0ICsxMDEsMTQgQEAKIAkgKiBpZiB0aGUgY29udmVydGVkIHZhbHVlIGRvZXNuJ3QgZml0IGluIHUzMi4gU28sIGNvbnZlcnQgdGhlCiAJICogbGFzdCBzaXggYnl0ZXMgdG8gdTY0IGFuZCBtZW1jcHkgd2hhdCBpcyBuZWVkZWQKIAkgKi8KLQlpZihzc2NhbmYoc3pfdXVpZCwgIiU4eCVjJTRoeCVjJTRoeCVjJTJoaHglMmhoeCVjJWxseCIsCisJaWYgKHNzY2FuZihzel91dWlkLCAiJTh4JWMlNGh4JWMlNGh4JWMlMmhoeCUyaGh4JWMlbGx4IiwKIAkgICAgICAgJnV1aWRfdG1wLmRhdGExLCAmYywgJnV1aWRfdG1wLmRhdGEyLCAmYywKIAkgICAgICAgJnV1aWRfdG1wLmRhdGEzLCAmYywgJnV1aWRfdG1wLmRhdGE0LAogCSAgICAgICAmdXVpZF90bXAuZGF0YTUsICZjLCAmdCkgIT0gMTApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdCA9IGNwdV90b19iZTY0KHQpOwotCW1lbWNweSgmdXVpZF90bXAuZGF0YTZbMF0sICgoY2hhciopJnQpICsgMiwgNik7CisJbWVtY3B5KCZ1dWlkX3RtcC5kYXRhNlswXSwgKChjaGFyICopJnQpICsgMiwgNik7CiAJKnV1aWRfb2JqID0gdXVpZF90bXA7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZHJ2LmMKaW5kZXggYmUyNjkxNy4uNzU3YWUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZHJ2LmMKQEAgLTczOCw3ICs3MzgsNyBAQAogICogICAgIEFsbG9jYXRlIHBoeXNpY2FsbHkgY29udGlndW91cywgdW5jYWNoZWQgbWVtb3J5IGZyb20gZXh0ZXJuYWwgbWVtb3J5IHBvb2wKICAqLwogCi1zdGF0aWMgdm9pZCAqbWVtX2V4dF9waHlzX21lbV9hbGxvYyh1MzIgYnl0ZXMsIHUzMiBhbGlnbiwgdTMyICogcGh5c19hZGRyKQorc3RhdGljIHZvaWQgKm1lbV9leHRfcGh5c19tZW1fYWxsb2ModTMyIGJ5dGVzLCB1MzIgYWxpZ24sIHUzMiAqcGh5c19hZGRyKQogewogCXUzMiBuZXdfYWxsb2NfcHRyOwogCXUzMiBvZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL21nci5jCmluZGV4IGIzMmJhMGEuLjkzZTYyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL21nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL21nci5jCkBAIC0yNjYsMTUgKzI2NiwxNSBAQAogCQkJICogdGhpcyBpcyBhIGNsdW1zeSBvdmVyd3JpdGUgKi8KIAkJCXByb2Nlc3Nvcl9pbmZvLT5wcm9jZXNzb3JfdHlwZSA9IERTUFRZUEU2NDsKIAkJfSBlbHNlIHsKLQkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEZhaWxlZCB0byBnZXQgRENEIHByb2Nlc3NvciBpbmZvICIKLQkJCQkiJXhcbiIsIF9fZnVuY19fLCBzdGF0dXMyKTsKKwkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEZhaWxlZCB0byBnZXQgRENEIHByb2Nlc3NvciBpbmZvICV4XG4iLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzMik7CiAJCQlzdGF0dXMgPSAtRVBFUk07CiAJCX0KIAl9CiAJKnB1X251bV9wcm9jcyA9IHByb2NfaW5kZXg7CiAJaWYgKHByb2NfZGV0ZWN0ID09IGZhbHNlKSB7Ci0JCWRldl9kYmcoYnJpZGdlLCAiJXM6IEZhaWxlZCB0byBnZXQgcHJvYyBpbmZvIGZyb20gRENELCBzbyB1c2UgIgotCQkJIkNGRyByZWdpc3RyeVxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IHByb2MgaW5mbyBmcm9tIERDRCwgc28gdXNlIENGRyByZWdpc3RyeVxuIiwKKwkJCQlfX2Z1bmNfXyk7CiAJCXByb2Nlc3Nvcl9pbmZvLT5wcm9jZXNzb3JfdHlwZSA9IERTUFRZUEU2NDsKIAl9CiBmdW5jX2VuZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYwppbmRleCBjYTM4MDUwLi41YWM1MDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCkBAIC02MjMsNyArNjIzLDcgQEAKICAqICA9PT09PT09PSBubGRyX2dldF9meG5fYWRkciA9PT09PT09PQogICovCiBpbnQgbmxkcl9nZXRfZnhuX2FkZHIoc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiwKLQkJCSAgICAgY2hhciAqc3RyX2Z4biwgdTMyICogYWRkcikKKwkJCSAgICAgY2hhciAqc3RyX2Z4biwgdTMyICphZGRyKQogewogCXN0cnVjdCBkYmxsX3N5bV92YWwgKmRibGxfc3ltOwogCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmo7CkBAIC0xNzUxLDkgKzE3NTEsOCBAQAogCX0KIAlpZiAocmVmX2NvdW50ICYmICgqcmVmX2NvdW50ID4gMCkpIHsKIAkJKnJlZl9jb3VudCAtPSAxOwotCQlpZiAob3RoZXJfcmVmKSB7CisJCWlmIChvdGhlcl9yZWYpCiAJCQkqb3RoZXJfcmVmIC09IDE7Ci0JCX0KIAl9CiAKIAlpZiAocmVmX2NvdW50ICYmICpyZWZfY291bnQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbm9kZS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbm9kZS5jCmluZGV4IDg3ZGZhOTIuLjlkMzA0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ub2RlLmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkJICAgIHN0cnVjdCBub2RlX3N0cm1kZWYgKnBzdHJtX2RlZiwKIAkJCSAgICBzdHJ1Y3QgZHNwX3N0cm1hdHRyICpwYXR0cnMpOwogc3RhdGljIHZvaWQgZnJlZV9zdHJlYW0oc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IsIHN0cnVjdCBzdHJlYW1fY2hubCBzdHJlYW0pOwotc3RhdGljIGludCBnZXRfZnhuX2FkZHJlc3Moc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyICogZnhuX2FkZHIsCitzdGF0aWMgaW50IGdldF9meG5fYWRkcmVzcyhzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgKmZ4bl9hZGRyLAogCQkJCSAgdTMyIHBoYXNlKTsKIHN0YXRpYyBpbnQgZ2V0X25vZGVfcHJvcHMoc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21nciwKIAkJCQkgc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKQEAgLTQwNiw3ICs0MDYsNyBAQAogCiAJLyogY2hlY2sgZm9yIHBhZ2UgYWxpZ25lZCBIZWFwIHNpemUgKi8KIAlpZiAoKChhdHRyX2luLT5oZWFwX3NpemUpICYgKFBHX1NJWkU0SyAtIDEpKSkgewotCQlwcl9lcnIoIiVzOiBub2RlIGhlYXAgc2l6ZSBub3QgYWxpZ25lZCB0byA0Sywgc2l6ZSA9IDB4JXggXG4iLAorCQlwcl9lcnIoIiVzOiBub2RlIGhlYXAgc2l6ZSBub3QgYWxpZ25lZCB0byA0Sywgc2l6ZSA9IDB4JXhcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgYXR0cl9pbi0+aGVhcF9zaXplKTsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAl9IGVsc2UgewpAQCAtNzAzLDkgKzcwMyw5IEBACiAJCXBhdHRyID0gJm5vZGVfZGZsdGJ1ZmF0dHJzOwkvKiBzZXQgZGVmYXVsdHMgKi8KIAogCXN0YXR1cyA9IHByb2NfZ2V0X3Byb2Nlc3Nvcl9pZChwbm9kZS0+cHJvY2Vzc29yLCAmcHJvY19pZCk7Ci0JaWYgKHByb2NfaWQgIT0gRFNQX1VOSVQpIHsKKwlpZiAocHJvY19pZCAhPSBEU1BfVU5JVCkKIAkJZ290byBmdW5jX2VuZDsKLQl9CisKIAkvKiAgSWYgc2VnbWVudCBJRCBpbmNsdWRlcyBNRU1fU0VUVklSVFVBTFNFR0lEIHRoZW4gcGJ1ZmZlciBpcyBhCiAJICogIHZpcnQgIGFkZHJlc3MsIHNvIHNldCB0aGlzIGluZm8gaW4gdGhpcyBub2RlJ3MgdHJhbnNsYXRvcgogCSAqICBvYmplY3QgZm9yICBmdXR1cmUgcmVmLiBJZiBNRU1fR0VUVklSVFVBTFNFR0lEIHRoZW4gcmV0cmlldmUKQEAgLTg4NiwxMSArODg2LDEwIEBACiAJaWYgKHBhdHRycyAmJiBwYXR0cnMtPnN0cm1fbW9kZSAhPSBTVFJNTU9ERV9QUk9DQ09QWSkKIAkJcmV0dXJuIC1FUEVSTTsJLyogaWxsZWdhbCBzdHJlYW0gbW9kZSAqLwogCi0JaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9HUFApIHsKKwlpZiAobm9kZTFfdHlwZSAhPSBOT0RFX0dQUCkKIAkJaG5vZGVfbWdyID0gbm9kZTEtPm5vZGVfbWdyOwotCX0gZWxzZSB7CisJZWxzZQogCQlobm9kZV9tZ3IgPSBub2RlMi0+bm9kZV9tZ3I7Ci0JfQogCiAJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLwogCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CkBAIC0xNTc2LDcgKzE1NzUsNyBAQAogICogIFB1cnBvc2U6CiAgKiAgICAgIEZyZWVzIHRoZSBtZXNzYWdlIGJ1ZmZlci4KICAqLwotaW50IG5vZGVfZnJlZV9tc2dfYnVmKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHU4ICogcGJ1ZmZlciwKK2ludCBub2RlX2ZyZWVfbXNnX2J1ZihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1OCAqcGJ1ZmZlciwKIAkJCSAgICAgc3RydWN0IGRzcF9idWZmZXJhdHRyICpwYXR0cikKIHsKIAlzdHJ1Y3Qgbm9kZV9vYmplY3QgKnBub2RlID0gKHN0cnVjdCBub2RlX29iamVjdCAqKWhub2RlOwpAQCAtMjMyMiw3ICsyMzIxLDggQEAKIAkJCWlmICghaGRlaF9tZ3IpCiAJCQkJZ290byBmdW5jX2NvbnQ7CiAKLQkJCWJyaWRnZV9kZWhfbm90aWZ5KGhkZWhfbWdyLCBEU1BfU1lTRVJST1IsIERTUF9FWENFUFRJT05BQk9SVCk7CisJCQlicmlkZ2VfZGVoX25vdGlmeShoZGVoX21nciwgRFNQX1NZU0VSUk9SLAorCQkJCQkgIERTUF9FWENFUFRJT05BQk9SVCk7CiAJCX0KIAl9CiBmdW5jX2NvbnQ6CkBAIC0yNjQwLDcgKzI2NDAsNyBAQAogICogIFB1cnBvc2U6CiAgKiAgICAgIFJldHJpZXZlcyB0aGUgYWRkcmVzcyBmb3IgY3JlYXRlLCBleGVjdXRlIG9yIGRlbGV0ZSBwaGFzZSBmb3IgYSBub2RlLgogICovCi1zdGF0aWMgaW50IGdldF9meG5fYWRkcmVzcyhzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgKiBmeG5fYWRkciwKK3N0YXRpYyBpbnQgZ2V0X2Z4bl9hZGRyZXNzKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHUzMiAqZnhuX2FkZHIsCiAJCQkJICB1MzIgcGhhc2UpCiB7CiAJY2hhciAqcHN0cl9meG5fbmFtZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0RvY3VtZW50YXRpb24vb3ZlcnZpZXcudHh0IGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA3OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dApAQCAtMCwwICsxLDE3NCBAQAorCitPdmVydmlldworCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZHJpdmVyIHNldCBmb3IgVW5pc3lzIFNlY3VyZSBQYXJ0aXRpb25pbmcgKHMtUGFywq4pLgorCitzLVBhciBpcyBmaXJtd2FyZSB0aGF0IHByb3ZpZGVzIGhhcmR3YXJlIHBhcnRpdGlvbmluZyBjYXBhYmlsaXRpZXMgZm9yCitzcGxpdHRpbmcgbGFyZ2Utc2NhbGUgSW50ZWwgeDg2IHNlcnZlcnMgaW50byBtdWx0aXBsZSBpc29sYXRlZAorcGFydGl0aW9ucy4gcy1QYXIgcHJvdmlkZXMgYSBzZXQgb2YgcGFyYS12aXJ0dWFsaXplZCBkZXZpY2UgZHJpdmVycyB0bworYWxsb3cgZ3Vlc3QgcGFydGl0aW9ucyBvbiB0aGUgc2FtZSBzZXJ2ZXIgdG8gc2hhcmUgZGV2aWNlcyB0aGF0IHdvdWxkCitub3JtYWxseSBiZSB1bnNoYXJhYmxlOyBzcGVjaWZpY2FsbHksIFBDSSBuZXR3b3JrIGludGVyZmFjZXMgYW5kIGhvc3QKK2J1cyBhZGFwdGVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBhY2Nlc3MgdmlhIFNSLUlPVi4gVGhlIHNoYXJlZAorZGV2aWNlIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IGEgc21hbGwsIHNpbmdsZS1wdXJwb3NlIHNlcnZpY2UKK3BhcnRpdGlvbiwgd2hpY2ggY29tbXVuaWNhdGVzIHdpdGggZWFjaCBndWVzdCBwYXJ0aXRpb24gc2hhcmluZyB0aGF0CitkZXZpY2UgdGhyb3VnaCBhbiBhcmVhIG9mIHNoYXJlZCBtZW1vcnkgY2FsbGVkIGEgY2hhbm5lbC4gQWRkaXRpb25hbAorZHJpdmVycyBwcm92aWRlIHN1cHBvcnQgaW50ZXJmYWNlcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHMtUGFyCitzZXJ2aWNlcywgbG9nZ2luZyBhbmQgZGlhZ25vc3RpY3MsIGFuZCBhY2Nlc3NpbmcgdGhlIExpbnV4IGNvbnNvbGUKK2Zyb20gdGhlIHMtUGFyIHVzZXIgaW50ZXJmYWNlLgorCitUaGUgZHJpdmVyIHN0YWNrIGNvbnNpc3RzIG9mIGEgc2V0IG9mIHN1cHBvcnQgbW9kdWxlcywgYSBzZXQgb2YgYnVzCittb2R1bGVzLCBhbmQgYSBzZXQgb2YgZGV2aWNlIGRyaXZlciBtb2R1bGVzLiBUaGUgc3VwcG9ydCBtb2R1bGVzCitoYW5kbGUgYSBudW1iZXIgb2YgY29tbW9uIGZ1bmN0aW9ucyBhY3Jvc3MgZWFjaCBvZiB0aGUgb3RoZXIKK2RyaXZlcnMuIFRoZSBidXMgbW9kdWxlcyBwcm92aWRlIG9yZ2FuaXphdGlvbiBmb3IgdGhlIGRldmljZSBkcml2ZXIKK21vZHVsZXMsIHdoaWNoIHByb3ZpZGUgdGhlIHNoYXJlZCBkZXZpY2UgZnVuY3Rpb25hbGl0eS4KKworVGhlc2UgZHJpdmVycyBhcmUgZm9yIHRoZSBVbmlzeXMgdmlydHVhbCBQQ0kgaGFyZHdhcmUgbW9kZWwgd2hlcmUgdGhlCitoeXBlcnZpc29yIG5lZWQgbm90IGludGVydmVuZSAob3RoZXIgdGhhbiBub3JtYWwgaW50ZXJydXB0IGhhbmRsaW5nKQoraW4gdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBjbGllbnQgZHJpdmVycyBhbmQgdGhlIHZpcnR1YWwgYWRhcHRlcgorZmlybXdhcmUgaW4gdGhlIGFkYXB0ZXIgc2VydmljZSBwYXJ0aXRpb24uCisKK0RyaXZlciBEZXNjcmlwdGlvbnMKKworRGV2aWNlIE1vZHVsZXMKKworVGhlIG1vZHVsZXMgaW4gdGhpcyBzZWN0aW9uIGhhbmRsZSBzaGFyZWQgZGV2aWNlcyBhbmQgdGhlIHZpcnR1YWwKK2J1c2VzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlbS4gVGhlc2UgbW9kdWxlcyB1c2UgZnVuY3Rpb25zIGluIGFuZAorZGVwZW5kIG9uIHRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGUgc3VwcG9ydCBtb2R1bGVzIHNlY3Rpb24uCisKK3Zpc29yY2hpcHNldAorCitUaGUgdmlzb3JjaGlwc2V0IG1vZHVsZSByZWNlaXZlcyBkZXZpY2UgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uCitldmVudHMgZnJvbSB0aGUgQ29tbWFuZCBzZXJ2aWNlIHBhcnRpdGlvbiBvZiBzLVBhciwgYXMgd2VsbCBhcworY29udHJvbGxpbmcgcmVnaXN0cmF0aW9uIG9mIHNoYXJlZCBkZXZpY2UgZHJpdmVycyB3aXRoIHRoZSBzLVBhcgorZHJpdmVyIGNvcmUuIFRoZSBldmVudHMgcmVjZWl2ZWQgYXJlIHVzZWQgdG8gcG9wdWxhdGUgb3RoZXIgcy1QYXIKK21vZHVsZXMgd2l0aCB0aGVpciBhc3NpZ25lZCBzaGFyZWQgZGV2aWNlcy4gVmlzb3JjaGlwc2V0IGlzIHJlcXVpcmVkCitmb3Igc2hhcmVkIGRldmljZSBkcml2ZXJzIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBWaXNvcmNoaXBzZXQgYWxzbworc3RvcmVzIGluZm9ybWF0aW9uIGZvciBoYW5kbGluZyBkdW1wIGRpc2sgZGV2aWNlIGNyZWF0aW9uIGR1cmluZwora2R1bXAuCisKK0luIG9wZXJhdGlvbiwgdGhlIHZpc29yY2hpcHNldCBtb2R1bGUgcHJvY2Vzc2VzIGRldmljZSBjcmVhdGlvbiBhbmQKK2Rlc3RydWN0aW9uIG1lc3NhZ2VzIHNlbnQgYnkgcy1QYXIncyBDb21tYW5kIHNlcnZpY2UgcGFydGl0aW9uIHRocm91Z2gKK2EgY2hhbm5lbC4gVGhlc2UgbWVzc2FnZXMgcmVzdWx0IGluIGNyZWF0aW9uIChvciBkZXN0cnVjdGlvbikgb2YgZWFjaAordmlydHVhbCBidXMgYW5kIHZpcnR1YWwgZGV2aWNlLiBFYWNoIGJ1cyBhbmQgZGV2aWNlIGlzIGFsc28gYXNzb2NpYXRlZAord2l0aCBhIGNvbW11bmljYXRpb24gY2hhbm5lbCwgd2hpY2ggaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIG9uZSBvcgorbW9yZSBJTyBzZXJ2aWNlIHBhcnRpdGlvbnMgdG8gcGVyZm9ybSBkZXZpY2UgSU8gb24gYmVoYWxmIG9mIHRoZQorZ3Vlc3QuCisKK3ZpcnRoYmEKKworVGhlIHZpcnRoYmEgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byBhIHNoYXJlZCBTQ1NJIGhvc3QgYnVzIGFkYXB0ZXIKK2FuZCBvbmUgb3IgbW9yZSBkaXNrIGRldmljZXMsIGJ5IHByb3h5aW5nIFNDU0kgY29tbWFuZHMgYmV0d2VlbiB0aGUKK2d1ZXN0IGFuZCB0aGUgc2VydmljZSBwYXJ0aXRpb24gdGhhdCBvd25zIHRoZSBzaGFyZWQgU0NTSSBhZGFwdGVyLAordXNpbmcgYSBjaGFubmVsIGJldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgc2VydmljZSBwYXJ0aXRpb24uIFRoZSBkaXNrcwordGhhdCBhcHBlYXIgb24gdGhlIHNoYXJlZCBidXMgYXJlIGRlZmluZWQgYnkgdGhlIHMtUGFyIGNvbmZpZ3VyYXRpb24KK2FuZCBlbmZvcmNlZCBieSB0aGUgc2VydmljZSBwYXJ0aXRpb24sIHdoaWxlIHRoZSBndWVzdCBkcml2ZXIgaGFuZGxlcworc2VuZGluZyBjb21tYW5kcyBhbmQgaGFuZGxpbmcgcmVzcG9uc2VzLiBFYWNoIGRpc2sgaXMgc2hhcmVkIGFzIGEKK3dob2xlIHRvIGEgZ3Vlc3QuIFNoYXJpbmcgdGhlIGJ1cyBhZGFwdGVyIGluIHRoaXMgd2F5IHByb3ZpZGVzCityZXNpbGllbmN5OyBzaG91bGQgdGhlIGRldmljZSBlbmNvdW50ZXIgYW4gZXJyb3IsIG9ubHkgdGhlIHNlcnZpY2UKK3BhcnRpdGlvbiBpcyByZWJvb3RlZCwgYW5kIHRoZSBkZXZpY2UgaXMgcmVpbml0aWFsaXplZC4gVGhpcyBhbGxvd3MKK2d1ZXN0cyB0byBjb250aW51ZSBydW5uaW5nIGFuZCB0byByZWNvdmVyIGZyb20gdGhlIGVycm9yLgorCit2aXJ0bmljCisKK1RoZSB2aXJ0bmljIG1vZHVsZSBwcm92aWRlcyBhIHBhcmF2aXJ0dWFsaXplZCBuZXR3b3JrIGludGVyZmFjZSB0byBhCitndWVzdCBieSBwcm94eWluZyBidWZmZXIgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgZ3Vlc3QgYW5kIHRoZSBzZXJ2aWNlCitwYXJ0aXRpb24gdGhhdCBvd25zIHRoZSBzaGFyZWQgbmV0d29yayBpbnRlcmZhY2UsIHVzaW5nIGEgY2hhbm5lbAorYmV0d2VlbiB0aGUgZ3Vlc3QgYW5kIHRoZSBzZXJ2aWNlIHBhcnRpdGlvbi4gVGhlIGNvbm5lY3Rpdml0eSBvZiB0aGlzCitpbnRlcmZhY2Ugd2l0aCB0aGUgc2hhcmVkIGludGVyZmFjZSBhbmQgcG9zc2libHkgb3RoZXIgZ3Vlc3QKK3BhcnRpdGlvbnMgaXMgZGVmaW5lZCBieSB0aGUgcy1QYXIgY29uZmlndXJhdGlvbiBhbmQgZW5mb3JjZWQgYnkgdGhlCitzZXJ2aWNlIHBhcnRpdGlvbjsgdGhlIGd1ZXN0IGRyaXZlciBoYW5kbGVzIGNvbW11bmljYXRpb24gYW5kIGxpbmsKK3N0YXR1cy4KKwordmlzb3JzZXJpYWwKKworVGhlIHZpc29yc2VyaWFsIG1vZHVsZSBhbGxvd3MgdGhlIGNvbnNvbGUgb2YgdGhlIGxpbnV4IGd1ZXN0IHRvIGJlCithY2Nlc3NlZCB2aWEgdGhlIHMtUGFyIGNvbnNvbGUgc2VyaWFsIGNoYW5uZWwuIEl0IGNyZWF0ZXMgZGV2aWNlcyBpbgorL2Rldi92aXNvcnNlcmlhbGNsaWVudFggd2hpY2ggYmVoYXZlIGxpa2UgYSBzZXJpYWwgdGVybWluYWwgYW5kIGFyZQorY29ubmVjdGVkIHRvIHRoZSBkaWFnbm9zdGljcyBzeXN0ZW0gaW4gcy1QYXIuIEJ5IGFzc2lnbmluZyBhIGdldHR5IHRvCit0aGUgdGVybWluYWwgaW4gdGhlIGd1ZXN0LCBhIHVzZXIgY291bGQgbG9nIGludG8gYW5kIGFjY2VzcyB0aGUgZ3Vlc3QKK2Zyb20gdGhlIHMtUGFyIGRpYWdub3N0aWNzIFNXSVRDSCBSVU4gdGVybWluYWwuCisKK3Zpc29yYnVzCisKK1RoZSB2aXNvcmJ1cyBtb2R1bGUgaGFuZGxlcyB0aGUgYnVzIGZ1bmN0aW9ucyBmb3IgbW9zdCBmdW5jdGlvbmFsCitkcml2ZXJzIGV4Y2VwdCB2aXNvcnNlcmlhbCwgdmlzb3JkaWFnLCB2aXJ0aGJhLCBhbmQgdmlydG5pYy4gSXQKK21haW50YWlucyB0aGUgc3lzZnMgc3VidHJlZSAvc3lzL2RldmljZXMvdmlzb3JidXMqLy4gSXQgaXMgcmVzcG9uc2libGUKK2ZvciBkZXZpY2UgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIHRoZSBkZXZpY2VzIG9uIGl0cyBidXMuCisKK3Zpc29yY2xpZW50YnVzCisKK1RoZSB2aXNvcmNsaWVudGJ1cyBtb2R1bGUgZm9yd2FyZHMgdGhlIGJ1cyBmdW5jdGlvbnMgZm9yIHZpcnRoYmEsIGFuZAordmlydG5pYyB0byB0aGUgdmlydHBjaSBkcml2ZXIuCisKK3ZpcnRwY2kKKworVGhlIHZpcnRwY2kgbW9kdWxlIGhhbmRsZXMgdGhlIGJ1cyBmdW5jdGlvbnMgZm9yIHZpcnRoYmEsIGFuZCB2aXJ0bmljLgorCitzLVBhciBJbnRlZ3JhdGlvbiBNb2R1bGVzCisKK1RoZSBtb2R1bGVzIGluIHRoaXMgc2VjdGlvbiBwcm92aWRlIGludGVncmF0aW9uIHdpdGggcy1QYXIgZ3Vlc3QKK3BhcnRpdGlvbiBzZXJ2aWNlcyBsaWtlIGRpYWdub3N0aWNzIGFuZCByZW1vdGUgZGVza3RvcC4gVGhlc2UgbW9kdWxlcworZGVwZW5kIG9uIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhlIHN1cHBvcnQgbW9kdWxlcworc2VjdGlvbi4KKwordmlzb3J2aWRlb2NsaWVudAorCitUaGUgdmlzb3J2aWRlb2NsaWVudCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgdmlkZW8gc3VwcG9ydAorZm9yIHRoZSBVbmlzeXMgcy1QYXIgUGFydGl0aW9uIERlc2t0b3AgYXBwbGljYXRpb24uIFRoZSBndWVzdCBPUyBtdXN0CithbHNvIGhhdmUgdGhlIFVFRkkgR09QIHByb3RvY29sIGVuYWJsZWQgZm9yIHRoZSBwYXJ0aXRpb24gZGVza3RvcCB0bworZnVuY3Rpb24uICB2aXNvcmNvbmluY2xpZW50IFRoZSB2aXNvcmNvbmluY2xpZW50IG1vZHVsZSBwcm92aWRlcwora2V5Ym9hcmQgYW5kIG1vdXNlIHN1cHBvcnQgZm9yIHRoZSBVbmlzeXMgcy1QYXIgUGFydGl0aW9uIERlc2t0b3AKK2FwcGxpY2F0aW9uLgorCitzcGFyc3RvcAorCitUaGUgc3BhcnN0b3AgbW9kdWxlIGhhbmRsZXMgcmVxdWVzdHMgZnJvbSB0aGUgVW5pc3lzIHMtUGFyIHBsYXRmb3JtIHRvCitzaHV0ZG93biB0aGUgbGludXggZ3Vlc3QuIEl0IGFsbG93cyBhIHByb2dyYW0gb24gdGhlIGd1ZXN0IHRvIHBlcmZvcm0KK2NsZWFuLXVwIGZ1bmN0aW9ucyBvbiB0aGUgZ3Vlc3QgYmVmb3JlIHRoZSBndWVzdCBpcyBzaHV0IGRvd24gb3IKK3JlYm9vdGVkIHVzaW5nIEFDUEkuCisKK3Zpc29yZGlhZworCitUaGlzIGRyaXZlciBwcm92aWRlcyB0aGUgYWJpbGl0eSBmb3IgdGhlIGd1ZXN0IHRvIHdyaXRlIGluZm9ybWF0aW9uCitpbnRvIHRoZSBzLVBhciBkaWFnbm9zdGljcyBzdWJzeXN0ZW0uIEl0IGNyZWF0ZXMgYSBzZXQgb2YgZGV2aWNlcworbmFtZWQgL2Rldi92aXNvcmRpYWcuWCB3aGljaCBjYW4gYmUgd3JpdHRlbiB0byBieSB0aGUgZ3Vlc3QgdG8gYWRkCit0ZXh0IHRvIHRoZSBzLVBhciBzeXN0ZW0gbG9nLgorCitTdXBwb3J0IE1vZHVsZXMKKworVGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiBwcm92aWRlIGZ1bmN0aW9ucyBhbmQKK2Fic3RyYWN0aW9ucyB0byBzdXBwb3J0IHRoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMKK3NlY3Rpb25zLCB0byBhdm9pZCBoYXZpbmcgZHVwbGljYXRlZCBmdW5jdGlvbmFsaXR5LgorCit2aXNvcm5vb3AKKworVGhlIHZpc29ybm9vcCBtb2R1bGUgaXMgYSBwbGFjZWhvbGRlciB0aGF0IHJlc3BvbmRzIHRvIGRldmljZQorY3JlYXRlL2Rlc3Ryb3kgbWVzc2FnZXMgdGhhdCBhcmUgY3VycmVudGx5IG5vdCBpbiB1c2UgYnkgbGludXggZ3Vlc3RzLgorCit2aXNvcnVpc2xpYgorCitUaGUgdmlzb3J1aXNsaWIgbW9kdWxlIGlzIGEgc3VwcG9ydCBsaWJyYXJ5LCB1c2VkIHRvIGhhbmRsZSByZXF1ZXN0cworZnJvbSB2aXJ0cGNpLgorCit2aXNvcmNoYW5uZWxzdHViCisKK1RoZSB2aXNvcmNoYW5uZWxzdHViIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IHJvdXRpbmVzIGZvciBzdG9yaW5nIGFuZAorcmV0cmlldmluZyBkYXRhIGZyb20gYSBjaGFubmVsLgorCit2aXNvcmNoYW5uZWwKKworVGhlIHZpc29yY2hhbm5lbCBtb2R1bGUgaXMgYSBzdXBwb3J0IGxpYnJhcnkgdGhhdCBhYnN0cmFjdHMgcmVhZGluZworYW5kIHdyaXRpbmcgYSBjaGFubmVsIGluIG1lbW9yeS4KKwordmlzb3J1dGlsCisKK1RoZSB2aXNvcnV0aWwgbW9kdWxlIGlzIGEgc3VwcG9ydCBsaWJyYXJ5IHJlcXVpcmVkIGJ5IGFsbCBvdGhlciBzLVBhcgorZHJpdmVyIG1vZHVsZXMuIEFtb25nIGl0cyBmZWF0dXJlcyBpdCBhYnN0cmFjdHMgcmVhZGluZywgd3JpdGluZywgYW5kCittYW5pcHVsYXRpbmcgYSBibG9jayBvZiBtZW1vcnkuCisKK01pbmltdW0gUmVxdWlyZWQgRHJpdmVyIFNldAorCitUaGUgZHJpdmVycyByZXF1aXJlZCB0byBib290IGEgTGludXggZ3Vlc3QgYXJlIHZpc29yY2hpcHNldCwgdmlzb3JidXMsCit2aXNvcnZpZGVvY2xpZW50LCB2aXNvcmNvbmluY2xpZW50LCB2aXNvcnVpc2xpYiwgdmlzb3JjaGFubmVsc3R1YiwKK3Zpc29yY2hhbm5lbCwgYW5kIHZpc29ydXRpbC4gVGhlIG90aGVyIGRyaXZlcnMgYXJlIHJlcXVpcmVkIGJ5IHRoZQorcHJvZHVjdCBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgbWFya2V0ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0RvY3VtZW50YXRpb24vcHJvYy1lbnRyaWVzLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvRG9jdW1lbnRhdGlvbi9wcm9jLWVudHJpZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmY5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0RvY3VtZW50YXRpb24vcHJvYy1lbnRyaWVzLnR4dApAQCAtMCwwICsxLDkzIEBACisgcy1QYXIgUHJvYyBFbnRyaWVzCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgcHJvYyBlbnRyaWVzIGNyZWF0ZWQgYnkgdGhlIFVuaXN5cyBzLVBhciBtb2R1bGVzLgorCitTdXBwb3J0IE1vZHVsZSBFbnRyaWVzCitUaGVzZSBlbnRyaWVzIGFyZSBwcm92aWRlZCBwcmltYXJpbHkgZm9yIGRlYnVnZ2luZy4KKworL3Byb2MvdWlzbGliL2luZm86IFRoaXMgZW50cnkgY29udGFpbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUKK3Vpc2xpYiBtb2R1bGUsIGluY2x1ZGluZyBidXMgaW5mb3JtYXRpb24gYW5kIG1lbW9yeSB1c2FnZS4KKworL3Byb2Mvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bTogVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGVidWdnaW5nCitlbnRyaWVzIGZvciB0aGUgY29udHJvbHZtIGNoYW5uZWwgdXNlZCBieSB2aXNvcmNoaXBzZXQuCisKKy9wcm9jL3Vpc2xpYi9wbGF0Zm9ybTogVGhpcyBlbnRyeSBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHBsYXRmb3JtCitudW1iZXIgdGhpcyBub2RlIGlzIGluIHRoZSBzeXN0ZW0uIEZvciBzb21lIGd1ZXN0cywgdGhpcyBtYXkgYmUKK2ludmFsaWQuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9jaGlwc2V0cmVhZHk6IFRoaXMgZW50cnkgaXMgd3JpdHRlbiB0byBieSBzY3JpcHRzCit0byBzaWduaWZ5IHRoYXQgYW55IHVzZXIgbGV2ZWwgYWN0aXZpdHkgaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZSB0aGUKK2d1ZXN0IGNhbiBiZSBjb25zaWRlcmVkIHJ1bm5pbmcgYW5kIGlzIHNob3duIGFzIHJ1bm5pbmcgaW4gdGhlIHMtUGFyCitVSS4KKworRGV2aWNlIEVudHJpZXMKK1RoZXNlIGVudHJpZXMgcHJvdmlkZSBzdGF0dXMgb2YgdGhlIGRldmljZXMgc2hhcmVkIGJ5IGEgc2VydmljZSBwYXJ0aXRpb24uCisKKy9wcm9jL3Vpc2xpYi92YnVzOiB0aGlzIGlzIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZW50cmllcyBmb3IgZWFjaAordmlydHVhbCBidXMuIEVhY2ggbnVtYmVyZWQgc3ViLWRpcmVjdG9yeSBjb250YWlucyBhbiBpbmZvIGVudHJ5LCB3aGljaAorZGVzY3JpYmVzIHRoZSBkZXZpY2VzIHRoYXQgYXBwZWFyIG9uIHRoYXQgYnVzLgorCisvcHJvYy91aXNsaWIvY3ljbGVzX2JlZm9yZV93YWl0OiBUaGlzIGVudHJ5IGlzIHVzZWQgdG8gdHVuZQorcGVyZm9ybWFuY2UsIGJ5IHNldHRpbmcgdGhlIG51bWJlciBvZiBjeWNsZXMgd2Ugd2FpdCBiZWZvcmUgZ29pbmcgaWRsZQord2hlbiBpbiBwb2xsaW5nIG1vZGUuIEEgbG9uZ2VyIHRpbWUgd2lsbCByZWR1Y2UgbWVzc2FnZSBsYXRlbmN5IGJ1dAorc3BlbmQgbW9yZSBwcm9jZXNzaW5nIHRpbWUgcG9sbGluZy4KKworL3Byb2MvdWlzbGliL3NtYXJ0X3dha2V1cDogVGhpcyBlbnRyeSBpcyB1c2VkIHRvIHR1bmUgcGVyZm9ybWFuY2UsIGJ5CitlbmFibGluZyBvciBkaXNhYmxpbmcgc21hcnQgd2FrZXVwLgorCisvcHJvYy92aXJ0aGJhL2luZm86IFRoaXMgZW50cnkgY29udGFpbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUKK3ZpcnRoYmEgbW9kdWxlLCBpbmNsdWRpbmcgaW50ZXJydXB0IGluZm9ybWF0aW9uIGFuZCBtZW1vcnkgdXNhZ2UuCisKKy9wcm9jL3ZpcnRoYmEvZW5hYmxlX2ludHM6IFRoaXMgZW50cnkgY29udHJvbHMgaW50ZXJydXB0IHVzZSBieSB0aGUKK3ZpcnRoYmEgbW9kdWxlLiBXcml0aW5nIGEgMCB0byB0aGlzIGVudHJ5IHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCisvcHJvYy92aXJ0bmljL2luZm86IFRoaXMgZW50cnkgY29udGFpbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUKK3ZpcnRuaWMgbW9kdWxlLCBpbmNsdWRpbmcgaW50ZXJydXB0IGluZm9ybWF0aW9uLCBzZW5kIGFuZCByZWNlaXZlCitjb3VudHMsIGFuZCBvdGhlciBkZXZpY2UgaW5mb3JtYXRpb24uCisKKy9wcm9jL3ZpcnRuaWMvZXRoWDogVGhpcyBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIGVudHJpZXMgZm9yIGVhY2gKK3ZpcnR1YWwgTklDLiBFYWNoIG5hbWVkIHN1YmRpcmVjdG9yeSBjb250YWlucyB0d28gZW50cmllcywKK2NsaWVudHN0cmluZyBhbmQgem9uZS4KKworL3Byb2MvdmlydHBjaS9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit2aXJ0cGNpIG1vZHVsZSwgaW5jbHVkaW5nIHZpcnR1YWwgUENJIGJ1cyBpbmZvcm1hdGlvbiBhbmQgZGV2aWNlCitsb2NhdGlvbnMuCisKKy9wcm9jL3ZpcnRuaWMvZW5hYmxlX2ludHM6IFRoaXMgZW50cnkgY29udHJvbHMgaW50ZXJydXB0IHVzZSBieSB0aGUKK3ZpcnRuaWMgbW9kdWxlLiBXcml0aW5nIGEgMCB0byB0aGlzIGVudHJ5IHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCitWaXNvcmNvbmluY2xpZW50LCB2aXNvcmRpYWcsIHZpc29ybm9vcCwgdmlzb3JzZXJpYWxjbGllbnQsIGFuZAordmlzb3J2aWRlb2NsaWVudCBFbnRyaWVzCisKK1RoZSBlbnRyaWVzIGluIHByb2MgZm9yIHRoZXNlIG1vZHVsZXMgYWxsIGZvbGxvdyB0aGUgc2FtZQorcGF0dGVybi4gRWFjaCBtb2R1bGUgaGFzIGl0cyBvd24gcHJvYyBkaXJlY3Rvcnkgd2l0aCB0aGUgc2FtZSBuYW1lLAorZS5nLiB2aXNvcmRpYWcgcHJlc2VudHMgYSAvcHJvYy92aXNvcmRpYWcgZGlyZWN0b3J5LiBJbnNpZGUgb2YgdGhlCittb2R1bGUncyBkaXJlY3RvcnkgYXJlIGEgZGV2aWNlIGRpcmVjdG9yeSwgd2hpY2ggY29udGFpbnMgb25lIG51bWJlcmVkCitkaXJlY3RvcnkgZm9yIGVhY2ggZGV2aWNlIHByb3ZpZGVkIGJ5IHRoYXQgbW9kdWxlLiBFYWNoIGRldmljZSBoYXMgYQorZGlhZyBlbnRyeSB0aGF0IHByZXNlbnRzIHRoZSBkZXZpY2UgbnVtYmVyIGFuZCB2aXNvcmJ1cyBuYW1lIGZvciB0aGF0CitkZXZpY2UuIFRoZSBtb2R1bGUgZGlyZWN0b3J5IGFsc28gaGFzIGEgZHJpdmVyL2RpYWcgZW50cnksIHdoaWNoCityZXBvcnRzIHRoZSBjb3JyZXNwb25kaW5nIHMtUGFyIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkcml2ZXIuCisKK0F1dG9tYXRlZCBJbnN0YWxsYXRpb24gRW50cmllcworCitUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgcy1QYXIgcGxhdGZvcm0KK2FuZCB0aGUgTGludXgtYmFzZWQgaW5zdGFsbGF0aW9uIGFuZCByZWNvdmVyeSB0b29sLiBUaGVzZSB2YWx1ZXMgYXJlCityZWFkL3dyaXRlLCBob3dldmVyLCB0aGUgZ3Vlc3QgY2FuIG9ubHkgcmVzZXQgdGhlbSB0byAwLCBvciByZXBvcnQgYW4KK2Vycm9yIHN0YXR1cyB0aHJvdWdoIHRoZSBpbnN0YWxsZXIgZW50cnkuIFRoZSB2YWx1ZXMgYXJlIG9ubHkgc2V0IHZpYQorcy1QYXIncyBmaXJtd2FyZSBpbnRlcmZhY2UsIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsbHkgYm9vdGluZyBpbnRvCit0aGUgdG9vbC4KKworL3Byb2Mvdmlzb3JjaGlwc2V0L2Jvb3R0b3Rvb2w6IFRoaXMgZW50cnkgaW5zdHJ1Y3RzIHMtUGFyIHRoYXQgdGhlCituZXh0IHJlYm9vdCB3aWxsIGxhdW5jaCB0aGUgaW5zdGFsbGF0aW9uIGFuZCByZWNvdmVyeSB0b29sLiBJZiBzZXQgdG8KKzAsIHRoZSBuZXh0IGJvb3Qgd2lsbCBoYXBwZW4gYWNjb3JkaW5nIHRvIHRoZSBVRUZJIGJvb3QgbWFuYWdlcgorc2V0dGluZ3MuCisKKy9wcm9jL3Zpc29yY2hpcHNldC90b29sYWN0aW9uOiBUaGlzIGVudHJ5IGluZGljYXRlcyB0aGUgaW5zdGFsbGF0aW9uCithbmQgcmVjb3ZlcnkgdG9vbCBtb2RlIHJlcXVlc3RlZCBmb3IgdGhlIG5leHQgYm9vdC4KKworL3Byb2Mvdmlzb3JjaGlwc2V0L2luc3RhbGxlcjogdGhpcyBlbnRyeSBpcyB1c2VkIGJ5IHRoZSBpbnN0YWxsYXRpb24KK2FuZCByZWNvdmVyeSB0b29sIHRvIHBhc3Mgc3RhdHVzIGFuZCByZXN1bHQgaW5mb3JtYXRpb24gYmFjayB0byB0aGUKK3MtUGFyIGZpcm13YXJlLgorCisvcHJvYy92aXNvcmNoaXBzZXQvcGFydGl0aW9uOiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZ3Vlc3QKK3BhcnRpdGlvbiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIGVhY2ggdmlydHVhbCBidXMsIGZvciB1c2UgZHVyaW5nCitpbnN0YWxsYXRpb24gYW5kIGF0IHJ1bnRpbWUgZm9yIHMtUGFyIHNlcnZpY2UgcGFydGl0aW9ucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA4MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9LY29uZmlnCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgVW5pc3lzIFNQQVIgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyMKK21lbnVjb25maWcgVU5JU1lTU1BBUgorCWJvb2wgIlVuaXN5cyBTUEFSIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2XzY0CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIHRoZSBVbmlzeXMgU1BBUiBkcml2ZXJzCisKK2lmIFVOSVNZU1NQQVIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvS2NvbmZpZyIKKworZW5kaWYgIyBVTklTWVNTUEFSCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL01BSU5UQUlORVJTIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9NQUlOVEFJTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNlZjBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9NQUlOVEFJTkVSUwpAQCAtMCwwICsxLDYgQEAKK1VuaXN5cyBzLVBhciBkcml2ZXJzCitNOglCZW4gUm9tZXIgPHNwYXJtYWludGFpbmVyQHVuaXN5cy5jb20+CitTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL3MtUGFyL292ZXJ2aWV3LnR4dAorRjoJRG9jdW1lbnRhdGlvbi9zLVBhci9wcm9jLWVudHJpZXMudHh0CitGOglkcml2ZXJzL3N0YWdpbmcvdW5pc3lzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4OGQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIFNQQVIgZHJpdmVycworIworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUlVUSUwpCQkrPSB2aXNvcnV0aWwvCitvYmotJChDT05GSUdfVU5JU1lTX1ZJU09SQ0hBTk5FTCkJKz0gdmlzb3JjaGFubmVsLworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNISVBTRVQpCSs9IHZpc29yY2hpcHNldC8KK29iai0kKENPTkZJR19VTklTWVNfQ0hBTk5FTFNUVUIpCSs9IGNoYW5uZWxzLworb2JqLSQoQ09ORklHX1VOSVNZU19VSVNMSUIpCQkrPSB1aXNsaWIvCitvYmotJChDT05GSUdfVU5JU1lTX1ZJUlRQQ0kpCQkrPSB2aXJ0cGNpLworb2JqLSQoQ09ORklHX1VOSVNZU19WSVJUSEJBKQkJKz0gdmlydGhiYS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzRhYzYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9UT0RPCkBAIC0wLDAgKzEsMjEgQEAKK1RPRE86CisJLWNoZWNrcGF0Y2ggd2FybmluZ3MKKwktbW92ZSAvcHJvYyBlbnRyaWVzIHRvIC9zeXMKKwktcHJvcGVyIG1ham9yIG51bWJlcihzKQorCS1hZGQgb3RoZXIgZHJpdmVycyBuZWVkZWQgZm9yIGZ1bGwgZnVuY3Rpb25hbGl0eToKKwkJLXZpc29yY2xpZW50YnVzCisJCS12aXNvcmJ1cworCQktdmlzb3JkaWFnCisJCS12aXJ0bmljCisJCS12aXNvcm5vb3AKKwkJLXZpc29yc2VyaWFsCisJCS12aXNvcnZpZGVvY2xpZW50CisJCS12aXNvcmNvbmluY2xpZW50CisJCS1zcGFyc3RvcAorCS1tb3ZlIGluZGl2aWR1YWwgZHJpdmVycyBpbnRvIHByb3BlciBkcml2ZXIgc3Vic3lzdGVtcworCQkKKworUGF0Y2hlcyB0bzoKKwlHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgorCUtlbiBDb3ggPGprY0ByZWRoYXQuY29tPgorCVVuaXN5cyBzLVBhciBtYWludGFpbmVyIG1haWxpbmcgbGlzdCA8c3Bhcm1haW50YWluZXJAdW5pc3lzLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2EyMzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIGNoYW5uZWxzIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFVOSVNZU19DSEFOTkVMU1RVQgorCXRyaXN0YXRlICJVbmlzeXMgY2hhbm5lbHN0dWIgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUgorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgY2hhbm5lbHMgZHJpdmVyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjBiMGFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjCisjIE1ha2VmaWxlIGZvciBVbmlzeXMgY2hhbm5lbHN0dWIKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19DSEFOTkVMU1RVQikJKz0gdmlzb3JjaGFubmVsc3R1Yi5vCisKK3Zpc29yY2hhbm5lbHN0dWIteSA6PSBjaGFubmVsLm8gY2hhbnN0dWIubworCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0NTI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbm5lbC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIGZvciBtb2R1bGVfaW5pdCBhbmQgbW9kdWxlX2V4aXQgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBmb3IgbWVtY3B5ICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSW1wbGVtZW50YXRpb24gb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGZvciBTdXBlcnZpc29yIGNoYW5uZWxzICovCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorCisvKgorICogUm91dGluZSBEZXNjcmlwdGlvbjoKKyAqIFRyaWVzIHRvIGluc2VydCB0aGUgcHJlYnVpbHQgc2lnbmFsIHBvaW50ZWQgdG8gYnkgcFNpZ25hbCBpbnRvIHRoZSBudGgKKyAqIFF1ZXVlIG9mIHRoZSBDaGFubmVsIHBvaW50ZWQgdG8gYnkgcENoYW5uZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisgKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyAqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB0aGUgc2lnbmFsCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAtIHBDaGFubmVsLCBRdWV1ZSBhbmQgcFNpZ25hbCBhcmUgdmFsaWQuCisgKiAtIElmIGluc2VydGlvbiBmYWlscyBkdWUgdG8gYSBmdWxsIHF1ZXVlLCB0aGUgY2FsbGVyIHdpbGwgZGV0ZXJtaW5lIHRoZQorICogcmV0cnkgcG9saWN5IChlLmcuIHdhaXQgJiB0cnkgYWdhaW4sIHJlcG9ydCBhbiBlcnJvciwgZXRjLikuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogMSBpZiB0aGUgaW5zZXJ0aW9uIHN1Y2NlZWRzLCAwIGlmIHRoZSBxdWV1ZSB3YXMgZnVsbC4KKyAqLwordW5zaWduZWQgY2hhcgordmlzb3Jfc2lnbmFsX2luc2VydChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbm5lbCwgVTMyIFF1ZXVlLCB2b2lkICpwU2lnbmFsKQoreworCXZvaWQgX19pb21lbSAqcHNpZ25hbDsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbCwgbm9mOworCisJU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICpwcWhkciA9CisJICAgIChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikKKwkJKChjaGFyIF9faW9tZW0gKikgcENoYW5uZWwgKyByZWFkcSgmcENoYW5uZWwtPm9DaGFubmVsU3BhY2UpKQorCQkrIFF1ZXVlOworCisJLyogY2FwdHVyZSBjdXJyZW50IGhlYWQgYW5kIHRhaWwgKi8KKwloZWFkID0gcmVhZGwoJnBxaGRyLT5IZWFkKTsKKwl0YWlsID0gcmVhZGwoJnBxaGRyLT5UYWlsKTsKKworCS8qIHF1ZXVlIGlzIGZ1bGwgaWYgKGhlYWQgKyAxKSAlIG4gZXF1YWxzIHRhaWwgKi8KKwlpZiAoKChoZWFkICsgMSkgJSByZWFkbCgmcHFoZHItPk1heFNpZ25hbFNsb3RzKSkgPT0gdGFpbCkgeworCQlub2YgPSByZWFkcSgmcHFoZHItPk51bU92ZXJmbG93cykgKyAxOworCQl3cml0ZXEobm9mLCAmcHFoZHItPk51bU92ZXJmbG93cyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGluY3JlbWVudCB0aGUgaGVhZCBpbmRleCAqLworCWhlYWQgPSAoaGVhZCArIDEpICUgcmVhZGwoJnBxaGRyLT5NYXhTaWduYWxTbG90cyk7CisKKwkvKiBjb3B5IHNpZ25hbCB0byB0aGUgaGVhZCBsb2NhdGlvbiBmcm9tIHRoZSBhcmVhIHBvaW50ZWQgdG8KKwkgKiBieSBwU2lnbmFsCisJICovCisJcHNpZ25hbCA9IChjaGFyIF9faW9tZW0gKilwcWhkciArIHJlYWRxKCZwcWhkci0+b1NpZ25hbEJhc2UpICsKKwkJKGhlYWQgKiByZWFkbCgmcHFoZHItPlNpZ25hbFNpemUpKTsKKwlNRU1DUFlfVE9JTyhwc2lnbmFsLCBwU2lnbmFsLCByZWFkbCgmcHFoZHItPlNpZ25hbFNpemUpKTsKKworCVZvbGF0aWxlQmFycmllcigpOworCXdyaXRlbChoZWFkLCAmcHFoZHItPkhlYWQpOworCisJd3JpdGVxKHJlYWRxKCZwcWhkci0+TnVtU2lnbmFsc1NlbnQpICsgMSwgJnBxaGRyLT5OdW1TaWduYWxzU2VudCk7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9zaWduYWxfaW5zZXJ0KTsKKworLyoKKyAqIFJvdXRpbmUgRGVzY3JpcHRpb246CisgKiBSZW1vdmVzIG9uZSBzaWduYWwgZnJvbSBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQorICogdGltZSBvZiB0aGUgY2FsbCBhbmQgY29waWVzIGl0IGludG8gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5CisgKiBwU2lnbmFsLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyAqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorICogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKyAqIC0gcFNpZ25hbCBwb2ludHMgdG8gYSBtZW1vcnkgYXJlYSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBxdWV1ZSdzIFNpZ25hbFNpemUKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAxIGlmIHRoZSByZW1vdmFsIHN1Y2NlZWRzLCAwIGlmIHRoZSBxdWV1ZSB3YXMgZW1wdHkuCisgKi8KK3Vuc2lnbmVkIGNoYXIKK3Zpc29yX3NpZ25hbF9yZW1vdmUoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwgdm9pZCAqcFNpZ25hbCkKK3sKKwl2b2lkIF9faW9tZW0gKnBzb3VyY2U7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWw7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICpwcWhkciA9CisJICAgIChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikgKChjaGFyIF9faW9tZW0gKikgcENoYW5uZWwgKworCQkJCSAgICByZWFkcSgmcENoYW5uZWwtPm9DaGFubmVsU3BhY2UpKSArIFF1ZXVlOworCisJLyogY2FwdHVyZSBjdXJyZW50IGhlYWQgYW5kIHRhaWwgKi8KKwloZWFkID0gcmVhZGwoJnBxaGRyLT5IZWFkKTsKKwl0YWlsID0gcmVhZGwoJnBxaGRyLT5UYWlsKTsKKworCS8qIHF1ZXVlIGlzIGVtcHR5IGlmIHRoZSBoZWFkIGluZGV4IGVxdWFscyB0aGUgdGFpbCBpbmRleCAqLworCWlmIChoZWFkID09IHRhaWwpIHsKKwkJd3JpdGVxKHJlYWRxKCZwcWhkci0+TnVtRW1wdHlDbnQpICsgMSwgJnBxaGRyLT5OdW1FbXB0eUNudCk7CisJCXJldHVybiAwOworCX0KKworCS8qIGFkdmFuY2UgcGFzdCB0aGUgJ2VtcHR5JyBmcm9udCBzbG90ICovCisJdGFpbCA9ICh0YWlsICsgMSkgJSByZWFkbCgmcHFoZHItPk1heFNpZ25hbFNsb3RzKTsKKworCS8qIGNvcHkgc2lnbmFsIGZyb20gdGFpbCBsb2NhdGlvbiB0byB0aGUgYXJlYSBwb2ludGVkIHRvIGJ5IHBTaWduYWwgKi8KKwlwc291cmNlID0gKGNoYXIgX19pb21lbSAqKSBwcWhkciArIHJlYWRxKCZwcWhkci0+b1NpZ25hbEJhc2UpICsKKwkJKHRhaWwgKiByZWFkbCgmcHFoZHItPlNpZ25hbFNpemUpKTsKKwlNRU1DUFlfRlJPTUlPKHBTaWduYWwsIHBzb3VyY2UsIHJlYWRsKCZwcWhkci0+U2lnbmFsU2l6ZSkpOworCisJVm9sYXRpbGVCYXJyaWVyKCk7CisJd3JpdGVsKHRhaWwsICZwcWhkci0+VGFpbCk7CisKKwl3cml0ZXEocmVhZHEoJnBxaGRyLT5OdW1TaWduYWxzUmVjZWl2ZWQpICsgMSwKKwkgICAgICAgJnBxaGRyLT5OdW1TaWduYWxzUmVjZWl2ZWQpOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3Jfc2lnbmFsX3JlbW92ZSk7CisKKy8qCisgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBhbGwgc2lnbmFscyBwcmVzZW50IGluIENoYW5uZWwgcENoYW5uZWwncyBudGggUXVldWUgYXQgdGhlCisgKiB0aW1lIG9mIHRoZSBjYWxsIGFuZCBjb3BpZXMgdGhlbSBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQorICogcFNpZ25hbC4gIFJldHVybnMgdGhlICMgb2Ygc2lnbmFscyBjb3BpZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSByb3V0aW5lLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyAqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorICogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKyAqIC0gcFNpZ25hbCBwb2ludHMgdG8gYSBtZW1vcnkgYXJlYSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBRdWV1ZSdzIE1heFNpZ25hbHMKKyAqICMgb2Ygc2lnbmFscywgZWFjaCBvZiB3aGljaCBpcyBRdWV1ZSdzIFNpZ25hbFNpemUuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogIyBvZiBzaWduYWxzIGNvcGllZC4KKyAqLwordW5zaWduZWQgaW50CitTaWduYWxSZW1vdmVBbGwocENIQU5ORUxfSEVBREVSIHBDaGFubmVsLCBVMzIgUXVldWUsIHZvaWQgKnBTaWduYWwpCit7CisJdm9pZCAqcHNvdXJjZTsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbCwgc2lnbmFsQ291bnQgPSAwOworCXBTSUdOQUxfUVVFVUVfSEVBREVSIHBxaGRyID0KKwkgICAgKHBTSUdOQUxfUVVFVUVfSEVBREVSKSAoKGNoYXIgKikgcENoYW5uZWwgKworCQkJCSAgICBwQ2hhbm5lbC0+b0NoYW5uZWxTcGFjZSkgKyBRdWV1ZTsKKworCS8qIGNhcHR1cmUgY3VycmVudCBoZWFkIGFuZCB0YWlsICovCisJaGVhZCA9IHBxaGRyLT5IZWFkOworCXRhaWwgPSBwcWhkci0+VGFpbDsKKworCS8qIHF1ZXVlIGlzIGVtcHR5IGlmIHRoZSBoZWFkIGluZGV4IGVxdWFscyB0aGUgdGFpbCBpbmRleCAqLworCWlmIChoZWFkID09IHRhaWwpCisJCXJldHVybiAwOworCisJd2hpbGUgKGhlYWQgIT0gdGFpbCkgeworCQkvKiBhZHZhbmNlIHBhc3QgdGhlICdlbXB0eScgZnJvbnQgc2xvdCAqLworCQl0YWlsID0gKHRhaWwgKyAxKSAlIHBxaGRyLT5NYXhTaWduYWxTbG90czsKKworCQkvKiBjb3B5IHNpZ25hbCBmcm9tIHRhaWwgbG9jYXRpb24gdG8gdGhlIGFyZWEgcG9pbnRlZAorCQkgKiB0byBieSBwU2lnbmFsCisJCSAqLworCQlwc291cmNlID0KKwkJICAgIChjaGFyICopIHBxaGRyICsgcHFoZHItPm9TaWduYWxCYXNlICsKKwkJICAgICh0YWlsICogcHFoZHItPlNpZ25hbFNpemUpOworCQlNRU1DUFkoKGNoYXIgKikgcFNpZ25hbCArIChwcWhkci0+U2lnbmFsU2l6ZSAqIHNpZ25hbENvdW50KSwKKwkJICAgICAgIHBzb3VyY2UsIHBxaGRyLT5TaWduYWxTaXplKTsKKworCQlWb2xhdGlsZUJhcnJpZXIoKTsKKwkJcHFoZHItPlRhaWwgPSB0YWlsOworCisJCXNpZ25hbENvdW50Kys7CisJCXBxaGRyLT5OdW1TaWduYWxzUmVjZWl2ZWQrKzsKKwl9CisKKwlyZXR1cm4gc2lnbmFsQ291bnQ7Cit9CisKKy8qCisgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzaWduYWwgcXVldWUgaXMgZW1wdHkuCisgKgorICogUGFyYW1ldGVyczoKKyAqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorICogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCisgKgorICogUmV0dXJuIHZhbHVlOgorICogMSBpZiB0aGUgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LCAwIG90aGVyd2lzZS4KKyAqLwordW5zaWduZWQgY2hhcgordmlzb3Jfc2lnbmFscXVldWVfZW1wdHkoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSkKK3sKKwlTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKnBxaGRyID0KKwkgICAgKFNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqKSAoKGNoYXIgX19pb21lbSAqKSBwQ2hhbm5lbCArCisJCQkJICAgIHJlYWRxKCZwQ2hhbm5lbC0+b0NoYW5uZWxTcGFjZSkpICsgUXVldWU7CisJcmV0dXJuIHJlYWRsKCZwcWhkci0+SGVhZCkgPT0gcmVhZGwoJnBxaGRyLT5UYWlsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NpZ25hbHF1ZXVlX2VtcHR5KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9jaGFuc3R1Yi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9jaGFuc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDRmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5zdHViLmMKQEAgLTAsMCArMSw3MCBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIGZvciBtb2R1bGVfaW5pdCBhbmQgbW9kdWxlX2V4aXQgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBmb3IgbWVtY3B5ICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJjaGFuc3R1Yi5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworc3RhdGljIF9faW5pdCBpbnQKK2NoYW5uZWxfbW9kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkCitjaGFubmVsX21vZF9leGl0KHZvaWQpCit7Cit9CisKK3Vuc2lnbmVkIGNoYXIKK1NpZ25hbEluc2VydF93aXRoTG9jayhDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbm5lbCwgVTMyIFF1ZXVlLAorCQkgICAgICB2b2lkICpwU2lnbmFsLCBzcGlubG9ja190ICpsb2NrKQoreworCXVuc2lnbmVkIGNoYXIgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCXJlc3VsdCA9IHZpc29yX3NpZ25hbF9pbnNlcnQocENoYW5uZWwsIFF1ZXVlLCBwU2lnbmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit1bnNpZ25lZCBjaGFyCitTaWduYWxSZW1vdmVfd2l0aExvY2soQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJICAgICAgdm9pZCAqcFNpZ25hbCwgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdDsKKwlzcGluX2xvY2sobG9jayk7CisJcmVzdWx0ID0gdmlzb3Jfc2lnbmFsX3JlbW92ZShwQ2hhbm5lbCwgUXVldWUsIHBTaWduYWwpOworCXNwaW5fdW5sb2NrKGxvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZV9pbml0KGNoYW5uZWxfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoY2hhbm5lbF9tb2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkJyeWFuIEdsYXVkZWwiKTsKK01PRFVMRV9BTElBUygidWlzY2hhbiIpOworCS8qIHRoaXMgaXMgZXh0cmFjdGVkIGR1cmluZyBkZXBtb2QgYW5kIGtlcHQgaW4gbW9kdWxlcy5kZXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcyN2RlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9jaGFuc3R1Yi5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0NIQU5TVFVCX0hfXworI2RlZmluZSBfX0NIQU5TVFVCX0hfXwordW5zaWduZWQgY2hhciBTaWduYWxJbnNlcnRfd2l0aExvY2soQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJCQkgICAgIHZvaWQgKnBTaWduYWwsIHNwaW5sb2NrX3QgKmxvY2spOwordW5zaWduZWQgY2hhciBTaWduYWxSZW1vdmVfd2l0aExvY2soQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJCQkgICAgIHZvaWQgKnBTaWduYWwsIHNwaW5sb2NrX3QgKmxvY2spOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTIwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbC5oCkBAIC0wLDAgKzEsNjYxIEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DSEFOTkVMX0hfXworI2RlZmluZSBfX0NIQU5ORUxfSF9fCisKKy8qCisqIFdoZW5ldmVyIHRoaXMgZmlsZSBpcyBjaGFuZ2VkIGEgY29ycmVzcG9uZGluZyBjaGFuZ2UgbXVzdCBiZSBtYWRlIGluCisqIHRoZSBDb25zb2xlL1NlcnZpY2VQYXJ0L3Zpc29yZGlhZ19lYXJseS9zdXBlcnZpc29yX2NoYW5uZWwuaCBmaWxlCisqIHdoaWNoIGlzIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGNvbXBpbGVzLiBUaGVzZSB0d28gZmlsZXMgbXVzdCBiZQorKiBpbiBzeW5jLgorKi8KKworLyogZGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gcHJldmVudCBpbmNsdWRlIG5lc3RpbmcgaW4ga2VybmVsIGhlYWRlcgorICogZmlsZXMgb2Ygc2ltaWxhciBhYnJldmlhdGVkIGNvbnRlbnQKKyAqLworI2RlZmluZSBfX1NVUEVSVklTT1JfQ0hBTk5FTF9IX18KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisKKyNkZWZpbmUgU0lHTkFUVVJFXzE2KEEsIEIpICgoQSkgfCAoQjw8OCkpCisjZGVmaW5lIFNJR05BVFVSRV8zMihBLCBCLCBDLCBEKSBcCisJKFNJR05BVFVSRV8xNihBLCBCKSB8IChTSUdOQVRVUkVfMTYoQywgRCkgPDwgMTYpKQorI2RlZmluZSBTSUdOQVRVUkVfNjQoQSwgQiwgQywgRCwgRSwgRiwgRywgSCkgXAorCShTSUdOQVRVUkVfMzIoQSwgQiwgQywgRCkgfCAoKFU2NCkoU0lHTkFUVVJFXzMyKEUsIEYsIEcsIEgpKSA8PCAzMikpCisKKyNpZm5kZWYgbGVuZ3Rob2YKKyNkZWZpbmUgbGVuZ3Rob2YoVFlQRSwgTUVNQkVSKSAoc2l6ZW9mKCgoVFlQRSAqKTApLT5NRU1CRVIpKQorI2VuZGlmCisjaWZuZGVmIENPVkVSUQorI2RlZmluZSBDT1ZFUlEodiwgZCkgICgoKHYpKyhkKS0xKSAvIChkKSkKKyNlbmRpZgorI2lmbmRlZiBDT1ZFUgorI2RlZmluZSBDT1ZFUih2LCBkKSAgICgoZCkqQ09WRVJRKHYsIGQpKQorI2VuZGlmCisKKyNpZm5kZWYgR1VJRDAKKyNkZWZpbmUgR1VJRDAgezAsIDAsIDAsIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSB9CisjZW5kaWYKKworLyogIFRoZSBDIGxhbmd1YWdlIGlzIGluY29uc2lzdGVudCB3aXRoIHJlc3BlY3QgdG8gd2hlcmUgaXQgYWxsb3dzIGxpdGVyYWwKKyAqICBjb25zdGFudHMsIGVzcGVjaWFsbHkgbGl0ZXJhbCBjb25zdGFudCBzdHJ1Y3RzLiAgTGl0ZXJhbCBjb25zdGFudCBzdHJ1Y3RzCisgKiAgYXJlIGFsbG93ZWQgZm9yIGluaXRpYWxpemF0aW9uIG9ubHksIHdoZXJlYXMgb3RoZXIgdHlwZXMgb2YgbGl0ZXJhbAorICogIGNvbnN0YW50cyBhcmUgYWxsb3dlZCBhbnl3aGVyZS4gIFdlIGdldCBhcm91bmQgdGhpcyBpbmNvbnNpc3RlbmN5IGJ5CisgKiAgZGVjbGFyaW5nIGEgInN0YXRpYyBjb25zdCIgdmFyaWFibGUgZm9yIGVhY2ggR1VJRC4gIFRoaXMgdmFyaWFibGUgY2FuIGJlCisgKiAgdXNlZCBpbiBleHByZXNzaW9ucyB3aGVyZSB0aGUgbGl0ZXJhbCBjb25zdGFudCB3b3VsZCBub3QgYmUgYWxsb3dlZC4KKyAqLworc3RhdGljIGNvbnN0IEdVSUQgR3VpZDAgPSBHVUlEMDsKKworI2RlZmluZSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSAgU0lHTkFUVVJFXzMyKCdFJywgJ0MnLCAnTicsICdMJykKKwordHlwZWRlZiBlbnVtIHsKKwlDSEFOTkVMU1JWX1VOSU5JVElBTElaRUQgPSAwLAkvKiBjaGFubmVsIGlzIGluIGFuIHVuZGVmaW5lZCBzdGF0ZSAqLworCUNIQU5ORUxTUlZfUkVBRFkgPSAxCS8qIGNoYW5uZWwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgc2VydmVyICovCit9IENIQU5ORUxfU0VSVkVSU1RBVEU7CisKK3R5cGVkZWYgZW51bSB7CisJQ0hBTk5FTENMSV9ERVRBQ0hFRCA9IDAsCisJQ0hBTk5FTENMSV9ESVNBQkxFRCA9IDEsCS8qIGNsaWVudCBjYW4gc2VlIGNoYW5uZWwgYnV0IGlzIE5PVAorCQkJCQkgKiBhbGxvd2VkIHRvIHVzZSBpdCB1bmxlc3MgZ2l2ZW4gVEJECisJCQkJCSAqIGV4cGxpY2l0IHJlcXVlc3QgKHNob3VsZCBhY3R1YWxseSBiZQorCQkJCQkgKiA8IERFVEFDSEVEKSAqLworCUNIQU5ORUxDTElfQVRUQUNISU5HID0gMiwJLyogbGVnYWN5IEVGSSBjbGllbnQgcmVxdWVzdAorCQkJCQkgKiBmb3IgRUZJIHNlcnZlciB0byBhdHRhY2ggKi8KKwlDSEFOTkVMQ0xJX0FUVEFDSEVEID0gMywJLyogaWRsZSwgYnV0IGNsaWVudCBtYXkgd2FudAorCQkJCQkgKiB0byB1c2UgY2hhbm5lbCBhbnkgdGltZSAqLworCUNIQU5ORUxDTElfQlVTWSA9IDQsCS8qIGNsaWVudCBlaXRoZXIgd2FudHMgdG8gdXNlIG9yIGlzCisJCQkJICogdXNpbmcgY2hhbm5lbCAqLworCUNIQU5ORUxDTElfT1dORUQgPSA1CS8qICJubyB3b3JyaWVzIiBzdGF0ZSAtIGNsaWVudCBjYW4KKwkJCQkgKiBhY2Nlc3MgY2hhbm5lbCBhbnl0aW1lICovCit9IENIQU5ORUxfQ0xJRU5UU1RBVEU7CitzdGF0aWMgaW5saW5lIGNvbnN0IFU4ICoKK1VMVFJBX0NIQU5ORUxDTElfU1RSSU5HKFUzMiB2KQoreworCXN3aXRjaCAodikgeworCWNhc2UgQ0hBTk5FTENMSV9ERVRBQ0hFRDoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkRFVEFDSEVEIik7CisJY2FzZSBDSEFOTkVMQ0xJX0RJU0FCTEVEOgorCQlyZXR1cm4gKGNvbnN0IFU4ICopICgiRElTQUJMRUQiKTsKKwljYXNlIENIQU5ORUxDTElfQVRUQUNISU5HOgorCQlyZXR1cm4gKGNvbnN0IFU4ICopICgiQVRUQUNISU5HIik7CisJY2FzZSBDSEFOTkVMQ0xJX0FUVEFDSEVEOgorCQlyZXR1cm4gKGNvbnN0IFU4ICopICgiQVRUQUNIRUQiKTsKKwljYXNlIENIQU5ORUxDTElfQlVTWToKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkJVU1kiKTsKKwljYXNlIENIQU5ORUxDTElfT1dORUQ6CisJCXJldHVybiAoY29uc3QgVTggKikgKCJPV05FRCIpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKGNvbnN0IFU4ICopICgiPyIpOworfQorCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxTUlZfSVNfUkVBRFkoeCkgICAgICgoeCkgPT0gQ0hBTk5FTFNSVl9SRUFEWSkKKyNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9TRVJWRVJfUkVBRFkocENoYW5uZWwpIFwKKwkoVUxUUkFfQ0hBTk5FTFNSVl9JU19SRUFEWShyZWFkbCgmKHBDaGFubmVsKS0+U3J2U3RhdGUpKSkKKworI2RlZmluZSBVTFRSQV9WQUxJRF9DSEFOTkVMQ0xJX1RSQU5TSVRJT04obywgbikJCQkJXAorCSgoKCgobykgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hJTkcpICYmICgobikgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfREVUQUNIRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfREVUQUNIRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hJTkcpICYmICgobikgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfREVUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQlVTWSkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSkgfHwJXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0JVU1kpKSB8fAlcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfT1dORUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfT1dORUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSElORykgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9CVVNZKSAmJiAoKG4pID09IENIQU5ORUxDTElfT1dORUQpKSB8fCAoMCkpIFwKKwkgPyAoMSkgOiAoMCkpCisKKyNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9DTElFTlRfQ0hLX1RSQU5TSVRJT04ob2xkLCBuZXcsIGNoYW5JZCwgbG9nQ3R4LAlcCisJCQkJCSAgICBmaWxlLCBsaW5lKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICghVUxUUkFfVkFMSURfQ0hBTk5FTENMSV9UUkFOU0lUSU9OKG9sZCwgbmV3KSkJXAorCQkJVWx0cmFMb2dFdmVudChsb2dDdHgsCQkJCVwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRFUlIsIFwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwgXAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywJCVwKKwkJCQkgICAgICBfX2Z1bmNfXywgX19MSU5FX18sCQlcCisJCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhICglcykgJXMoJWQpLS0+JXMoJWQpIEAlczolZFxuIiwgXAorCQkJCSAgICAgIGNoYW5JZCwgIkNsaVN0YXRlPHg+IiwJCVwKKwkJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhvbGQpLAlcCisJCQkJICAgICAgb2xkLAkJCQlcCisJCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcobmV3KSwJXAorCQkJCSAgICAgIG5ldywJCQkJXAorCQkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKilmaWxlLCA0KSwgXAorCQkJCSAgICAgIGxpbmUpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVTFRSQV9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKHBDaGFuLCBjaGFuSWQsCQkJXAorCQkJCQluZXdzdGF0ZSwgbG9nQ3R4KQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJVUxUUkFfQ0hBTk5FTF9DTElFTlRfQ0hLX1RSQU5TSVRJT04oCQkJXAorCQkJcmVhZGwoJigoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgXAorCQkJCSAocENoYW4pKS0+Q2xpU3RhdGVPUykpLAkJXAorCQkJbmV3c3RhdGUsCQkJCQlcCisJCQljaGFuSWQsIGxvZ0N0eCwgX19GSUxFX18sIF9fTElORV9fKTsJCVwKKwkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLCBcCisJCQlDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwgXAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLAkJCVwKKwkJCSAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywJCQlcCisJCQkgICAgICAiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gKCVzKSAlcyglZCktLT4lcyglZCkgQCVzOiVkXG4iLCBcCisJCQkgICAgICBjaGFuSWQsICJDbGlTdGF0ZU9TIiwJCQlcCisJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyggXAorCQkJCSAgICAgIHJlYWRsKCYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgXAorCQkJCQkgICAgICAocENoYW4pKS0+Q2xpU3RhdGVPUykpLAlcCisJCQkgICAgICByZWFkbCgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKKwkJCQkgICAgICAocENoYW4pKS0+Q2xpU3RhdGVPUyksCQlcCisJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhuZXdzdGF0ZSksCVwKKwkJCSAgICAgIG5ld3N0YXRlLAkJCQkJXAorCQkJICAgICAgUGF0aE5hbWVfTGFzdF9OX05vZGVzKF9fRklMRV9fLCA0KSwgX19MSU5FX18pOyBcCisJCXdyaXRlbChuZXdzdGF0ZSwgJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSBcCisJCQkJICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpOwkJXAorCQlNRU1PUllCQVJSSUVSOwkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfQ0xJRU5UX0FDUVVJUkVfT1MocENoYW4sIGNoYW5JZCwgbG9nQ3R4KQlcCisJVUxUUkFfY2hhbm5lbF9jbGllbnRfYWNxdWlyZV9vcyhwQ2hhbiwgY2hhbklkLCBsb2dDdHgsCQlcCisJCQkJCShjaGFyICopX19GSUxFX18sIF9fTElORV9fLAlcCisJCQkJCShjaGFyICopX19mdW5jX18pCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MocENoYW4sIGNoYW5JZCwgbG9nQ3R4KQlcCisJVUxUUkFfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyhwQ2hhbiwgY2hhbklkLCBsb2dDdHgsCVwKKwkJKGNoYXIgKilfX0ZJTEVfXywgX19MSU5FX18sIChjaGFyICopX19mdW5jX18pCisKKy8qIFZhbHVlcyBmb3IgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTC5DbGlFcnJvckJvb3Q6ICovCisvKiB0aHJvdHRsaW5nIGludmFsaWQgYm9vdCBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8gY2xpZW50CisgKiBkaXNhYmxlZCAqLworI2RlZmluZSBVTFRSQV9DTElFUlJPUkJPT1RfVEhST1RUTEVNU0dfRElTQUJMRUQgICAgMHgwMQorCisvKiB0aHJvdHRsaW5nIGludmFsaWQgYm9vdCBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8gY2xpZW50CisgKiBub3QgYXR0YWNoZWQgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEIDB4MDIKKworLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGJ1c3kgY2hhbm5lbCAqLworI2RlZmluZSBVTFRSQV9DTElFUlJPUkJPT1RfVEhST1RUTEVNU0dfQlVTWSAgICAgICAgMHgwNAorCisvKiBWYWx1ZXMgZm9yIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wuQ2xpRXJyb3JPUzogKi8KKy8qIHRocm90dGxpbmcgaW52YWxpZCBndWVzdCBPUyBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8KKyAqIGNsaWVudCBkaXNhYmxlZCAqLworI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVEICAgICAgMHgwMQorCisvKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCisgKiBjbGllbnQgbm90IGF0dGFjaGVkICovCisjZGVmaW5lIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfTk9UQVRUQUNIRUQgICAweDAyCisKKy8qIHRocm90dGxpbmcgaW52YWxpZCBndWVzdCBPUyBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8KKyAqIGJ1c3kgY2hhbm5lbCAqLworI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0JVU1kgICAgICAgICAgMHgwNAorCisvKiBWYWx1ZXMgZm9yIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wuRmVhdHVyZXM6IFRoaXMgZGVmaW5lIGV4aXN0cyBzbworKiB0aGF0IHdpbmRvd3MgZ3Vlc3QgY2FuIGxvb2sgYXQgdGhlIEZlYXR1cmVGbGFncyBpbiB0aGUgaW8gY2hhbm5lbCwKKyogYW5kIGNvbmZpZ3VyZSB0aGUgd2luZG93cyBkcml2ZXIgdG8gdXNlIGludGVycnVwdHMgb3Igbm90IGJhc2VkIG9uCisqIHRoaXMgc2V0dGluZy4gIFRoaXMgZmxhZyBpcyBzZXQgaW4gdWlzbGliIGFmdGVyIHRoZQorKiBVTFRSQV9WSEJBX2luaXRfY2hhbm5lbCBpcyBjYWxsZWQuICBBbGwgZmVhdHVyZSBiaXRzIGZvciBhbGwKKyogY2hhbm5lbHMgc2hvdWxkIGJlIGRlZmluZWQgaGVyZS4gIFRoZSBpbyBjaGFubmVsIGZlYXR1cmUgYml0cyBhcmUKKyogZGVmaW5lZCByaWdodCBoZXJlICovCisjZGVmaW5lIFVMVFJBX0lPX0RSSVZFUl9FTkFCTEVTX0lOVFMgKDB4MVVMTCA8PCAxKQorI2RlZmluZSBVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcgKDB4MVVMTCA8PCAzKQorI2RlZmluZSBVTFRSQV9JT19JT1ZNX0lTX09LX1dJVEhfRFJJVkVSX0RJU0FCTElOR19JTlRTICgweDFVTEwgPDwgNCkKKyNkZWZpbmUgVUxUUkFfSU9fRFJJVkVSX0RJU0FCTEVTX0lOVFMgKDB4MVVMTCA8PCA1KQorI2RlZmluZSBVTFRSQV9JT19EUklWRVJfU1VQUE9SVFNfRU5IQU5DRURfUkNWQlVGX0NIRUNLSU5HICgweDFVTEwgPDwgNikKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCQkvKiBib3RoIEdDQyBhbmQgVkMgbm93IGFsbG93IHRoaXMgcHJhZ21hICovCisvKiBDb21tb24gQ2hhbm5lbCBIZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMX0hFQURFUiB7CisJVTY0IFNpZ25hdHVyZTsJCS8qIFNpZ25hdHVyZSAqLworCVUzMiBMZWdhY3lTdGF0ZTsJLyogREVQUkVDQVRFRCAtIGJlaW5nIHJlcGxhY2VkIGJ5ICovCisJLyogLyAgICAgICAgICAgICAgU3J2U3RhdGUsIENsaVN0YXRlQm9vdCwgYW5kIENsaVN0YXRlT1MgYmVsb3cgKi8KKwlVMzIgSGVhZGVyU2l6ZTsJCS8qIHNpemVvZihDSEFOTkVMX0hFQURFUikgKi8KKwlVNjQgU2l6ZTsJCS8qIFRvdGFsIHNpemUgb2YgdGhpcyBjaGFubmVsIGluIGJ5dGVzICovCisJVTY0IEZlYXR1cmVzOwkJLyogRmxhZ3MgdG8gbW9kaWZ5IGJlaGF2aW9yICovCisJR1VJRCBUeXBlOwkJLyogQ2hhbm5lbCB0eXBlOiBkYXRhLCBidXMsIGNvbnRyb2wsIGV0Yy4gKi8KKwlVNjQgUGFydGl0aW9uSGFuZGxlOwkvKiBJRCBvZiBndWVzdCBwYXJ0aXRpb24gKi8KKwlVNjQgSGFuZGxlOwkJLyogRGV2aWNlIG51bWJlciBvZiB0aGlzIGNoYW5uZWwgaW4gY2xpZW50ICovCisJVTY0IG9DaGFubmVsU3BhY2U7CS8qIE9mZnNldCBpbiBieXRlcyB0byBjaGFubmVsIHNwZWNpZmljIGFyZWEgKi8KKwlVMzIgVmVyc2lvbklkOwkJLyogQ0hBTk5FTF9IRUFERVIgVmVyc2lvbiBJRCAqLworCVUzMiBQYXJ0aXRpb25JbmRleDsJLyogSW5kZXggb2YgZ3Vlc3QgcGFydGl0aW9uICovCisJR1VJRCBab25lR3VpZDsJCS8qIEd1aWQgb2YgQ2hhbm5lbCdzIHpvbmUgKi8KKwlVMzIgb0NsaWVudFN0cmluZzsJLyogb2Zmc2V0IGZyb20gY2hhbm5lbCBoZWFkZXIgdG8KKwkJCQkgKiBudWwtdGVybWluYXRlZCBDbGllbnRTdHJpbmcgKDAgaWYKKwkJCQkgKiBDbGllbnRTdHJpbmcgbm90IHByZXNlbnQpICovCisJVTMyIENsaVN0YXRlQm9vdDsJLyogQ0hBTk5FTF9DTElFTlRTVEFURSBvZiBwcmUtYm9vdAorCQkJCSAqIEVGSSBjbGllbnQgb2YgdGhpcyBjaGFubmVsICovCisJVTMyIENtZFN0YXRlQ2xpOwkvKiBDSEFOTkVMX0NPTU1BTkRTVEFURSAob3ZlcmxvYWRlZCBpbgorCQkJCSAqIFdpbmRvd3MgZHJpdmVycywgc2VlIFNlcnZlclN0YXRlVXAsCisJCQkJICogU2VydmVyU3RhdGVEb3duLCBldGMpICovCisJVTMyIENsaVN0YXRlT1M7CQkvKiBDSEFOTkVMX0NMSUVOVFNUQVRFIG9mIEd1ZXN0IE9TCisJCQkJICogY2xpZW50IG9mIHRoaXMgY2hhbm5lbCAqLworCVUzMiBDaGFubmVsQ2hhcmFjdGVyaXN0aWNzOwkvKiBDSEFOTkVMX0NIQVJBQ1RFUklTVElDXzx4eHg+ICovCisJVTMyIENtZFN0YXRlU3J2OwkvKiBDSEFOTkVMX0NPTU1BTkRTVEFURSAob3ZlcmxvYWRlZCBpbgorCQkJCSAqIFdpbmRvd3MgZHJpdmVycywgc2VlIFNlcnZlclN0YXRlVXAsCisJCQkJICogU2VydmVyU3RhdGVEb3duLCBldGMpICovCisJVTMyIFNydlN0YXRlOwkJLyogQ0hBTk5FTF9TRVJWRVJTVEFURSAqLworCVU4IENsaUVycm9yQm9vdDsJLyogYml0cyB0byBpbmRpY2F0ZSBlcnIgc3RhdGVzIGZvcgorCQkJCSAqIGJvb3QgY2xpZW50cywgc28gZXJyIG1lc3NhZ2VzIGNhbgorCQkJCSAqIGJlIHRocm90dGxlZCAqLworCVU4IENsaUVycm9yT1M7CQkvKiBiaXRzIHRvIGluZGljYXRlIGVyciBzdGF0ZXMgZm9yIE9TCisJCQkJICogY2xpZW50cywgc28gZXJyIG1lc3NhZ2VzIGNhbiBiZQorCQkJCSAqIHRocm90dGxlZCAqLworCVU4IEZpbGxlclsxXTsJCS8qIFBhZCBvdXQgdG8gMTI4IGJ5dGUgY2FjaGVsaW5lICovCisJLyogUGxlYXNlIGFkZCBhbGwgbmV3IHNpbmdsZS1ieXRlIHZhbHVlcyBiZWxvdyBoZXJlICovCisJVTggUmVjb3ZlckNoYW5uZWw7Cit9IENIQU5ORUxfSEVBREVSLCAqcENIQU5ORUxfSEVBREVSLCBVTFRSQV9DSEFOTkVMX1BST1RPQ09MOworCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfRU5BQkxFX0lOVFMgKDB4MVVMTCA8PCAwKQorCisvKiBTdWJoZWFkZXIgZm9yIHRoZSBTaWduYWwgVHlwZSB2YXJpYXRpb24gb2YgdGhlIENvbW1vbiBDaGFubmVsICovCit0eXBlZGVmIHN0cnVjdCBfU0lHTkFMX1FVRVVFX0hFQURFUiB7CisJLyogMXN0IGNhY2hlIGxpbmUgKi8KKwlVMzIgVmVyc2lvbklkOwkJLyogU0lHTkFMX1FVRVVFX0hFQURFUiBWZXJzaW9uIElEICovCisJVTMyIFR5cGU7CQkvKiBRdWV1ZSB0eXBlOiBzdG9yYWdlLCBuZXR3b3JrICovCisJVTY0IFNpemU7CQkvKiBUb3RhbCBzaXplIG9mIHRoaXMgcXVldWUgaW4gYnl0ZXMgKi8KKwlVNjQgb1NpZ25hbEJhc2U7CS8qIE9mZnNldCB0byBzaWduYWwgcXVldWUgYXJlYSAqLworCVU2NCBGZWF0dXJlRmxhZ3M7CS8qIEZsYWdzIHRvIG1vZGlmeSBiZWhhdmlvciAqLworCVU2NCBOdW1TaWduYWxzU2VudDsJLyogVG90YWwgIyBvZiBzaWduYWxzIHBsYWNlZCBpbiB0aGlzIHF1ZXVlICovCisJVTY0IE51bU92ZXJmbG93czsJLyogVG90YWwgIyBvZiBpbnNlcnRzIGZhaWxlZCBkdWUgdG8KKwkJCQkgKiBmdWxsIHF1ZXVlICovCisJVTMyIFNpZ25hbFNpemU7CQkvKiBUb3RhbCBzaXplIG9mIGEgc2lnbmFsIGZvciB0aGlzIHF1ZXVlICovCisJVTMyIE1heFNpZ25hbFNsb3RzOwkvKiBNYXggIyBvZiBzbG90cyBpbiBxdWV1ZSwgMSBzbG90IGlzCisJCQkJICogYWx3YXlzIGVtcHR5ICovCisJVTMyIE1heFNpZ25hbHM7CQkvKiBNYXggIyBvZiBzaWduYWxzIGluIHF1ZXVlCisJCQkJICogKE1heFNpZ25hbFNsb3RzLTEpICovCisJVTMyIEhlYWQ7CQkvKiBRdWV1ZSBoZWFkIHNpZ25hbCAjICovCisJLyogMm5kIGNhY2hlIGxpbmUgKi8KKwlVNjQgTnVtU2lnbmFsc1JlY2VpdmVkOwkvKiBUb3RhbCAjIG9mIHNpZ25hbHMgcmVtb3ZlZCBmcm9tIHRoaXMgcXVldWUgKi8KKwlVMzIgVGFpbDsJCS8qIFF1ZXVlIHRhaWwgc2lnbmFsICMgKG9uIHNlcGFyYXRlCisJCQkJICogY2FjaGUgbGluZSkgKi8KKwlVMzIgUmVzZXJ2ZWQxOwkJLyogUmVzZXJ2ZWQgZmllbGQgKi8KKwlVNjQgUmVzZXJ2ZWQyOwkJLyogUmVzcnZlZCBmaWVsZCAqLworCVU2NCBDbGllbnRRdWV1ZTsKKwlVNjQgTnVtSW50ZXJydXB0c1JlY2VpdmVkOwkvKiBUb3RhbCAjIG9mIEludGVycnVwdHMgcmVjZWl2ZWQuICBUaGlzCisJCQkJCSAqIGlzIGluY3JlbWVudGVkIGJ5IHRoZSBJU1IgaW4gdGhlCisJCQkJCSAqIGd1ZXN0IHdpbmRvd3MgZHJpdmVyICovCisJVTY0IE51bUVtcHR5Q250OwkvKiBOdW1iZXIgb2YgdGltZXMgdGhhdCB2aXNvcl9zaWduYWxfcmVtb3ZlCisJCQkJICogaXMgY2FsbGVkIGFuZCByZXR1cm5lZCBFbXB0eQorCQkJCSAqIFN0YXR1cy4gKi8KKwlVMzIgRXJyb3JGbGFnczsJCS8qIEVycm9yIGJpdHMgc2V0IGR1cmluZyBTaWduYWxSZWluaXQKKwkJCQkgKiB0byBkZW5vdGUgdHJvdWJsZSB3aXRoIGNsaWVudCdzCisJCQkJICogZmllbGRzICovCisJVTggRmlsbGVyWzEyXTsJCS8qIFBhZCBvdXQgdG8gNjQgYnl0ZSBjYWNoZWxpbmUgKi8KK30gU0lHTkFMX1FVRVVFX0hFQURFUiwgKnBTSUdOQUxfUVVFVUVfSEVBREVSOworCisjcHJhZ21hIHBhY2socG9wKQorCisjZGVmaW5lIFNpZ25hbEluaXQoY2hhbiwgUUhEUkZMRCwgUURBVEFGTEQsIFFEQVRBVFlQRSwgdmVyLCB0eXApCVwKKwlkbyB7CQkJCQkJCQlcCisJCU1FTVNFVCgmY2hhbi0+UUhEUkZMRCwgMCwgc2l6ZW9mKGNoYW4tPlFIRFJGTEQpKTsJXAorCQljaGFuLT5RSERSRkxELlZlcnNpb25JZCA9IHZlcjsJCQkJXAorCQljaGFuLT5RSERSRkxELlR5cGUgPSB0eXA7CQkJCVwKKwkJY2hhbi0+UUhEUkZMRC5TaXplID0gc2l6ZW9mKGNoYW4tPlFEQVRBRkxEKTsJCVwKKwkJY2hhbi0+UUhEUkZMRC5TaWduYWxTaXplID0gc2l6ZW9mKFFEQVRBVFlQRSk7CQlcCisJCWNoYW4tPlFIRFJGTEQub1NpZ25hbEJhc2UgPSAoVUlOVE4pKGNoYW4tPlFEQVRBRkxEKS0JXAorCQkJKFVJTlROKSgmY2hhbi0+UUhEUkZMRCk7CQkJXAorCQljaGFuLT5RSERSRkxELk1heFNpZ25hbFNsb3RzID0JCQkJXAorCQkJc2l6ZW9mKGNoYW4tPlFEQVRBRkxEKS9zaXplb2YoUURBVEFUWVBFKTsJXAorCQljaGFuLT5RSERSRkxELk1heFNpZ25hbHMgPSBjaGFuLT5RSERSRkxELk1heFNpZ25hbFNsb3RzLTE7IFwKKwl9IHdoaWxlICgwKQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIHVzZWZ1bCBmb3IgdmFsaWRhdGluZyBhbnkgdHlwZSBvZiBjaGFubmVsIHdoZW4gaXQgaXMKKyAqIHJlY2VpdmVkIGJ5IHRoZSBjbGllbnQgdGhhdCB3aWxsIGJlIGFjY2Vzc2luZyB0aGUgY2hhbm5lbC4KKyAqIE5vdGUgdGhhdCA8bG9nQ3R4PiBpcyBvbmx5IG5lZWRlZCBmb3IgY2FsbGVycyBpbiB0aGUgRUZJIGVudmlyb25tZW50LCBhbmQKKyAqIGlzIHVzZWQgdG8gcGFzcyB0aGUgRUZJX0RJQUdfQ0FQVFVSRV9QUk9UT0NPTCBuZWVkZWQgdG8gbG9nIG1lc3NhZ2VzLgorICovCitzdGF0aWMgaW5saW5lIGludAorVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQodm9pZCBfX2lvbWVtICpwQ2hhbm5lbCwKKwkJCSAgIEdVSUQgZXhwZWN0ZWRUeXBlR3VpZCwKKwkJCSAgIGNoYXIgKmNoYW5uZWxOYW1lLAorCQkJICAgVTY0IGV4cGVjdGVkTWluQnl0ZXMsCisJCQkgICBVMzIgZXhwZWN0ZWRWZXJzaW9uSWQsCisJCQkgICBVNjQgZXhwZWN0ZWRTaWduYXR1cmUsCisJCQkgICBjaGFyICpmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsIHZvaWQgKmxvZ0N0eCkKK3sKKwlpZiAoTUVNQ01QKCZleHBlY3RlZFR5cGVHdWlkLCAmR3VpZDAsIHNpemVvZihHVUlEKSkgIT0gMCkKKwkJLyogY2FsbGVyIHdhbnRzIHVzIHRvIHZlcmlmeSB0eXBlIEdVSUQgKi8KKwkJaWYgKE1FTUNNUF9JTygmKCgoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSAocENoYW5uZWwpKS0+VHlwZSksCisJCQkgICAmZXhwZWN0ZWRUeXBlR3VpZCwgc2l6ZW9mKEdVSUQpKSAhPSAwKSB7CisJCQlDSEFOTkVMX0dVSURfTUlTTUFUQ0goZXhwZWN0ZWRUeXBlR3VpZCwgY2hhbm5lbE5hbWUsCisJCQkJCSAgICAgICJ0eXBlIiwgZXhwZWN0ZWRUeXBlR3VpZCwKKwkJCQkJICAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgICAocENoYW5uZWwpKS0+VHlwZSwgZmlsZU5hbWUsCisJCQkJCSAgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChleHBlY3RlZE1pbkJ5dGVzID4gMCkJLyogY2FsbGVyIHdhbnRzIHVzIHRvIHZlcmlmeQorCQkJCQkgKiBjaGFubmVsIHNpemUgKi8KKwkJaWYgKHJlYWRxKCYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikKKwkJCSAgIChwQ2hhbm5lbCkpLT5TaXplKSA8IGV4cGVjdGVkTWluQnl0ZXMpIHsKKwkJCUNIQU5ORUxfVTY0X01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAorCQkJCQkgICAgICJzaXplIiwgZXhwZWN0ZWRNaW5CeXRlcywKKwkJCQkJICAgICAoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikKKwkJCQkJICAgICAgKHBDaGFubmVsKSktPlNpemUsIGZpbGVOYW1lLAorCQkJCQkgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChleHBlY3RlZFZlcnNpb25JZCA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKKwkJCQkJICogY2hhbm5lbCB2ZXJzaW9uICovCisJCWlmIChyZWFkbCgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIChwQ2hhbm5lbCkpLT5WZXJzaW9uSWQpCisJCSAgICAhPSBleHBlY3RlZFZlcnNpb25JZCkgeworCQkJQ0hBTk5FTF9VMzJfTUlTTUFUQ0goZXhwZWN0ZWRUeXBlR3VpZCwgY2hhbm5lbE5hbWUsCisJCQkJCSAgICAgInZlcnNpb24iLCBleHBlY3RlZFZlcnNpb25JZCwKKwkJCQkJICAgICAoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikKKwkJCQkJICAgICAgKHBDaGFubmVsKSktPlZlcnNpb25JZCwgZmlsZU5hbWUsCisJCQkJCSAgICAgbGluZU51bWJlciwgbG9nQ3R4KTsKKwkJCXJldHVybiAwOworCQl9CisJaWYgKGV4cGVjdGVkU2lnbmF0dXJlID4gMCkJLyogY2FsbGVyIHdhbnRzIHVzIHRvIHZlcmlmeQorCQkJCQkgKiBjaGFubmVsIHNpZ25hdHVyZSAqLworCQlpZiAocmVhZHEoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSAocENoYW5uZWwpKS0+U2lnbmF0dXJlKQorCQkgICAgIT0gZXhwZWN0ZWRTaWduYXR1cmUpIHsKKwkJCUNIQU5ORUxfVTY0X01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAorCQkJCQkgICAgICJzaWduYXR1cmUiLCBleHBlY3RlZFNpZ25hdHVyZSwKKwkJCQkJICAgICAoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikKKwkJCQkJICAgICAgKHBDaGFubmVsKSktPlNpZ25hdHVyZSwgZmlsZU5hbWUsCisJCQkJCSAgICAgbGluZU51bWJlciwgbG9nQ3R4KTsKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7Cit9CisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gdXNlZnVsIGZvciB2YWxpZGF0aW5nIGFueSB0eXBlIG9mIGNoYW5uZWwgd2hlbiBpdCBpcyBhYm91dAorICogdG8gYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIHNlcnZlciBvZiB0aGUgY2hhbm5lbC4KKyAqIE5vdGUgdGhhdCA8bG9nQ3R4PiBpcyBvbmx5IG5lZWRlZCBmb3IgY2FsbGVycyBpbiB0aGUgRUZJIGVudmlyb25tZW50LCBhbmQKKyAqIGlzIHVzZWQgdG8gcGFzcyB0aGUgRUZJX0RJQUdfQ0FQVFVSRV9QUk9UT0NPTCBuZWVkZWQgdG8gbG9nIG1lc3NhZ2VzLgorICovCitzdGF0aWMgaW5saW5lIGludAorVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoR1VJRCB0eXBlR3VpZCwKKwkJCSAgIGNoYXIgKmNoYW5uZWxOYW1lLAorCQkJICAgVTY0IGV4cGVjdGVkTWluQnl0ZXMsCisJCQkgICBVNjQgYWN0dWFsQnl0ZXMsCisJCQkgICBjaGFyICpmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsIHZvaWQgKmxvZ0N0eCkKK3sKKwlpZiAoZXhwZWN0ZWRNaW5CeXRlcyA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKKwkJCQkJICogY2hhbm5lbCBzaXplICovCisJCWlmIChhY3R1YWxCeXRlcyA8IGV4cGVjdGVkTWluQnl0ZXMpIHsKKwkJCUNIQU5ORUxfVTY0X01JU01BVENIKHR5cGVHdWlkLCBjaGFubmVsTmFtZSwgInNpemUiLAorCQkJCQkgICAgIGV4cGVjdGVkTWluQnl0ZXMsIGFjdHVhbEJ5dGVzLAorCQkJCQkgICAgIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBsb2dDdHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKK30KKworLyogR2l2ZW4gYSBmaWxlIHBhdGhuYW1lIDxzPiAod2l0aCAnLycgb3IgJ1wnIHNlcGFyYXRpbmcgZGlyZWN0b3J5IG5vZGVzKSwKKyAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBub2RlIHdpdGhpbiB0aGF0IHBhdGhuYW1lIHN1Y2gKKyAqIHRoYXQgdGhlIG51bWJlciBvZiBub2RlcyBmcm9tIHRoYXQgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgaXMKKyAqIE5PVCBtb3JlIHRoYW4gPG4+LiAgTm90ZSB0aGF0IGlmIHRoZSBwYXRobmFtZSBoYXMgbGVzcyB0aGFuIDxuPiBub2RlcworICogaW4gaXQsIHRoZSByZXR1cm4gcG9pbnRlciB3aWxsIGJlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KKyAqLworc3RhdGljIGlubGluZSBVOCAqCitQYXRoTmFtZV9MYXN0X05fTm9kZXMoVTggKnMsIHVuc2lnbmVkIGludCBuKQoreworCVU4ICpwID0gczsKKwl1bnNpZ25lZCBpbnQgbm9kZV9jb3VudCA9IDA7CisJd2hpbGUgKCpwICE9ICdcMCcpIHsKKwkJaWYgKCgqcCA9PSAnLycpIHx8ICgqcCA9PSAnXFwnKSkKKwkJCW5vZGVfY291bnQrKzsKKwkJcCsrOworCX0KKwlpZiAobm9kZV9jb3VudCA8PSBuKQorCQlyZXR1cm4gczsKKwl3aGlsZSAobiA+IDApIHsKKwkJcC0tOworCQlpZiAocCA9PSBzKQorCQkJYnJlYWs7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4sIHVubGVzcyBzb21lb25lCisJCQkJICogaXMgY2hhbmdpbmcgdGhlIHN0cmluZyB3aGlsZSB3ZSBhcmUKKwkJCQkgKiBsb29raW5nIGF0IGl0ISEgKi8KKwkJaWYgKCgqcCA9PSAnLycpIHx8ICgqcCA9PSAnXFwnKSkKKwkJCW4tLTsKKwl9CisJcmV0dXJuIHAgKyAxOworfQorCitzdGF0aWMgaW5saW5lIGludAorVUxUUkFfY2hhbm5lbF9jbGllbnRfYWNxdWlyZV9vcyh2b2lkIF9faW9tZW0gKnBDaGFubmVsLCBVOCAqY2hhbklkLAorCQkJCXZvaWQgKmxvZ0N0eCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKmZ1bmMpCit7CisJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW4gPSBwQ2hhbm5lbDsKKworCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpID09IENIQU5ORUxDTElfRElTQUJMRUQpIHsKKwkJaWYgKChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpCisJCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVEKSA9PSAwKSB7CisJCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCisJCQl3cml0ZWIocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSB8CisJCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCwKKwkJCSAgICAgICAmcENoYW4tPkNsaUVycm9yT1MpOworCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCisKKwkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEVSUiwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgRElTQUJMRUQgQCVzOiVkXG4iLAorCQkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKAorCQkJCQkgICAgICAoVTggKikgZmlsZSwgNCksIGxpbmUpOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoKHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykgIT0gQ0hBTk5FTENMSV9PV05FRCkKKwkgICAgJiYgKHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVCb290KSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSkgeworCQkvKiBPdXIgY29tcGV0aXRvciBpcyBESVNBQkxFRCwgc28gd2UgY2FuIHRyYW5zaXRpb24gdG8gT1dORUQgKi8KKwkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkgICAgICAiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gKCVzKSAlcyglZCktLT4lcyglZCkgQCVzOiVkXG4iLAorCQkJICAgICAgY2hhbklkLCAiQ2xpU3RhdGVPUyIsCisJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORygKKwkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpKSwKKwkJCSAgICAgIHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUyksCisJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhDSEFOTkVMQ0xJX09XTkVEKSwKKwkJCSAgICAgIENIQU5ORUxDTElfT1dORUQsCisJCQkgICAgICBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsIDQpLCBsaW5lKTsKKwkJd3JpdGVsKENIQU5ORUxDTElfT1dORUQsICZwQ2hhbi0+Q2xpU3RhdGVPUyk7CisJCU1FTU9SWUJBUlJJRVI7CisJfQorCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpID09IENIQU5ORUxDTElfT1dORUQpIHsKKwkJaWYgKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgIT0gMCkgeworCQkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOworCQkJICogY29tZSBvdXQgb2YgaXQgKi8KKwkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKKwkJCQkgICAgICAiJXMgQ2hhbm5lbCBPUyBjbGllbnQgYWNxdWlyZSBub3cgc3VjY2Vzc2Z1bCBAJXM6JWRcbiIsCisJCQkJICAgICAgY2hhbklkLCBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsCisJCQkJCQkJCSAgICA0KSwgbGluZSk7CisJCQl3cml0ZWIoMCwgJnBDaGFuLT5DbGlFcnJvck9TKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBXZSBoYXZlIHRvIGRvIGl0IHRoZSAiaGFyZCB3YXkiLiAgV2UgdHJhbnNpdGlvbiB0byBCVVNZLAorCSogYW5kIGNhbiB1c2UgdGhlIGNoYW5uZWwgaWZmIG91ciBjb21wZXRpdG9yIGhhcyBub3QgYWxzbworCSogdHJhbnNpdGlvbmVkIHRvIEJVU1kuICovCisJaWYgKHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykgIT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgeworCQlpZiAoKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykKKwkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfTk9UQVRUQUNIRUQpID09IDApIHsKKwkJCS8qIHdlIGFyZSBOT1QgdGhyb3R0bGluZyB0aGlzIG1lc3NhZ2UgKi8KKwkJCXdyaXRlYihyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpIHwKKwkJCSAgICAgICBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVELAorCQkJICAgICAgICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CisJCQkvKiB0aHJvdHRsZSB1bnRpbCBhY3F1aXJlIHN1Y2Nlc3NmdWwgKi8KKwkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEVSUiwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgTk9UIEFUVEFDSEVEIChzdGF0ZT0lcyglZCkpIEAlczolZFxuIiwKKwkJCQkgICAgICBjaGFuSWQsCisJCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCisJCQkJCSAgICAgIHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykpLAorCQkJCSAgICAgIHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUyksCisJCQkJICAgICAgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwKKwkJCQkgICAgICBsaW5lKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJd3JpdGVsKENIQU5ORUxDTElfQlVTWSwgJnBDaGFuLT5DbGlTdGF0ZU9TKTsKKwlNRU1PUllCQVJSSUVSOworCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlQm9vdCkgPT0gQ0hBTk5FTENMSV9CVVNZKSB7CisJCWlmICgocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKQorCQkgICAgICYgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZKSA9PSAwKSB7CisJCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCisJCQl3cml0ZWIocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSB8CisJCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZLAorCQkJICAgICAgICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CisJCQkvKiB0aHJvdHRsZSB1bnRpbCBhY3F1aXJlIHN1Y2Nlc3NmdWwgKi8KKwkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEJVU1ksCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBmYWlsZWQgLSBob3N0IE9TIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgYm9vdCBCVVNZIEAlczolZFxuIiwKKwkJCQkgICAgICBjaGFuSWQsIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwKKwkJCQkJCQkJICAgIDQpLCBsaW5lKTsKKwkJfQorCQkvKiByZXNldCBidXN5ICovCisJCXdyaXRlbChDSEFOTkVMQ0xJX0FUVEFDSEVELCAmcENoYW4tPkNsaVN0YXRlT1MpOworCQlNRU1PUllCQVJSSUVSOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgIT0gMCkgeworCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7IGNvbWUgb3V0IG9mIGl0ICovCisJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LCBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJICAgICAgIiVzIENoYW5uZWwgT1MgY2xpZW50IGFjcXVpcmUgbm93IHN1Y2Nlc3NmdWwgQCVzOiVkXG4iLAorCQkJICAgICAgY2hhbklkLCBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsIDQpLAorCQkJICAgICAgbGluZSk7CisJCXdyaXRlYigwLCAmcENoYW4tPkNsaUVycm9yT1MpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitVTFRSQV9jaGFubmVsX2NsaWVudF9yZWxlYXNlX29zKHZvaWQgX19pb21lbSAqcENoYW5uZWwsIFU4ICpjaGFuSWQsCisJCQkJdm9pZCAqbG9nQ3R4LCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqZnVuYykKK3sKKwlDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbiA9IHBDaGFubmVsOworCWlmIChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpICE9IDApIHsKKwkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOyBjb21lIG91dCBvZiBpdCAqLworCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lUT0ssCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKKwkJCSAgICAgICIlcyBDaGFubmVsIE9TIGNsaWVudCBlcnJvciBzdGF0ZSBjbGVhcmVkIEAlczolZFxuIiwKKwkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwKKwkJCSAgICAgIGxpbmUpOworCQl3cml0ZWIoMCwgJnBDaGFuLT5DbGlFcnJvck9TKTsKKwl9CisJaWYgKHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUykgPT0gQ0hBTk5FTENMSV9PV05FRCkKKwkJcmV0dXJuOworCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpICE9IENIQU5ORUxDTElfQlVTWSkgeworCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lURVJSLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkgICAgICAiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gSU5WQUxJRCEgLSByZWxlYXNlIGZhaWxlZCBiZWNhdXNlIE9TIGNsaWVudCBOT1QgQlVTWSAoc3RhdGU9JXMoJWQpKSBAJXM6JWRcbiIsCisJCQkgICAgICBjaGFuSWQsCisJCQkgICAgICBVTFRSQV9DSEFOTkVMQ0xJX1NUUklORygKKwkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpKSwKKwkJCSAgICAgIHJlYWRsKCZwQ2hhbi0+Q2xpU3RhdGVPUyksCisJCQkgICAgICBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsIDQpLCBsaW5lKTsKKwkJLyogcmV0dXJuOyAqLworCX0KKwl3cml0ZWwoQ0hBTk5FTENMSV9BVFRBQ0hFRCwgJnBDaGFuLT5DbGlTdGF0ZU9TKTsgLyogcmVsZWFzZSBidXN5ICovCit9CisKKy8qCisqIFJvdXRpbmUgRGVzY3JpcHRpb246CisqIFRyaWVzIHRvIGluc2VydCB0aGUgcHJlYnVpbHQgc2lnbmFsIHBvaW50ZWQgdG8gYnkgcFNpZ25hbCBpbnRvIHRoZSBudGgKKyogUXVldWUgb2YgdGhlIENoYW5uZWwgcG9pbnRlZCB0byBieSBwQ2hhbm5lbAorKgorKiBQYXJhbWV0ZXJzOgorKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCisqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB0aGUgc2lnbmFsCisqCisqIEFzc3VtcHRpb25zOgorKiAtIHBDaGFubmVsLCBRdWV1ZSBhbmQgcFNpZ25hbCBhcmUgdmFsaWQuCisqIC0gSWYgaW5zZXJ0aW9uIGZhaWxzIGR1ZSB0byBhIGZ1bGwgcXVldWUsIHRoZSBjYWxsZXIgd2lsbCBkZXRlcm1pbmUgdGhlCisqIHJldHJ5IHBvbGljeSAoZS5nLiB3YWl0ICYgdHJ5IGFnYWluLCByZXBvcnQgYW4gZXJyb3IsIGV0Yy4pLgorKgorKiBSZXR1cm4gdmFsdWU6IDEgaWYgdGhlIGluc2VydGlvbiBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzCisqIGZ1bGwuCisqLworCit1bnNpZ25lZCBjaGFyIHZpc29yX3NpZ25hbF9pbnNlcnQoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJCQkgIHZvaWQgKnBTaWduYWwpOworCisvKgorKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorKiBSZW1vdmVzIG9uZSBzaWduYWwgZnJvbSBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQorKiB0aW1lIG9mIHRoZSBjYWxsIGFuZCBjb3BpZXMgaXQgaW50byB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkKKyogcFNpZ25hbC4KKyoKKyogUGFyYW1ldGVyczoKKyogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHNpZ25hbHMgYXJlIHRvIGJlIGNvcGllZAorKgorKiBBc3N1bXB0aW9uczoKKyogLSBwQ2hhbm5lbCBhbmQgUXVldWUgYXJlIHZhbGlkLgorKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgcXVldWUncyBTaWduYWxTaXplCisqCisqIFJldHVybiB2YWx1ZTogMSBpZiB0aGUgcmVtb3ZhbCBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzCisqIGVtcHR5LgorKi8KKwordW5zaWduZWQgY2hhciB2aXNvcl9zaWduYWxfcmVtb3ZlKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICB2b2lkICpwU2lnbmFsKTsKKworLyoKKyogUm91dGluZSBEZXNjcmlwdGlvbjoKKyogUmVtb3ZlcyBhbGwgc2lnbmFscyBwcmVzZW50IGluIENoYW5uZWwgcENoYW5uZWwncyBudGggUXVldWUgYXQgdGhlCisqIHRpbWUgb2YgdGhlIGNhbGwgYW5kIGNvcGllcyB0aGVtIGludG8gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5CisqIHBTaWduYWwuICBSZXR1cm5zIHRoZSAjIG9mIHNpZ25hbHMgY29waWVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm91dGluZS4KKyoKKyogUGFyYW1ldGVyczoKKyogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHNpZ25hbHMgYXJlIHRvIGJlIGNvcGllZAorKgorKiBBc3N1bXB0aW9uczoKKyogLSBwQ2hhbm5lbCBhbmQgUXVldWUgYXJlIHZhbGlkLgorKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgUXVldWUncyBNYXhTaWduYWxzCisqICMgb2Ygc2lnbmFscywgZWFjaCBvZiB3aGljaCBpcyBRdWV1ZSdzIFNpZ25hbFNpemUuCisqCisqIFJldHVybiB2YWx1ZToKKyogIyBvZiBzaWduYWxzIGNvcGllZC4KKyovCit1bnNpZ25lZCBpbnQgU2lnbmFsUmVtb3ZlQWxsKHBDSEFOTkVMX0hFQURFUiBwQ2hhbm5lbCwgVTMyIFF1ZXVlLAorCQkJICAgICB2b2lkICpwU2lnbmFsKTsKKworLyoKKyogUm91dGluZSBEZXNjcmlwdGlvbjoKKyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzaWduYWwgcXVldWUgaXMgZW1wdHkuCisqCisqIFBhcmFtZXRlcnM6CisqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyoKKyogUmV0dXJuIHZhbHVlOgorKiAxIGlmIHRoZSBzaWduYWwgcXVldWUgaXMgZW1wdHksIDAgb3RoZXJ3aXNlLgorKi8KK3Vuc2lnbmVkIGNoYXIgdmlzb3Jfc2lnbmFscXVldWVfZW1wdHkoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsCisJCQkJICAgICAgVTMyIFF1ZXVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbF9ndWlkLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbF9ndWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwZGMyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jaGFubmVsX2d1aWQuaApAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBDSEFOTkVMIEd1aWRzCisgKi8KKworLyogVXNlZCBpbiBJT0NoYW5uZWwKKyAqIHs0MTQ4MTVlZC1jNThjLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9CisgKi8KKyNkZWZpbmUgVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsgMHg0MTQ4MTVlZCwgMHhjNThjLCAweDExZGEsIFwKKwkJeyAweDk1LCAweGE5LCAweDAsIDB4ZTAsIDB4ODEsIDB4NjEsIDB4MTYsIDB4NWYgfSB9CitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfR1VJRDsKKworLyogVXNlZCBpbiBJT0NoYW5uZWwKKyAqIHs4Y2Q1OTk0ZC1jNThlLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9CisgKi8KKyNkZWZpbmUgVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsgMHg4Y2Q1OTk0ZCwgMHhjNThlLCAweDExZGEsIFwKKwkJeyAweDk1LCAweGE5LCAweDAsIDB4ZTAsIDB4ODEsIDB4NjEsIDB4MTYsIDB4NWYgfSB9CitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfR1VJRDsKKworLyogVXNlZCBpbiBJT0NoYW5uZWwKKyAqIHs3MjEyMDAwOC00QUFCLTExREMtODUzMC00NDQ1NTM1NDQyMDB9CisgKi8KKyNkZWZpbmUgVUxUUkFfU0lPVk1fR1VJRCBcCisJeyAweDcyMTIwMDA4LCAweDRBQUIsIDB4MTFEQywJCQkJCVwKKwkJeyAweDg1LCAweDMwLCAweDQ0LCAweDQ1LCAweDUzLCAweDU0LCAweDQyLCAweDAwIH0gfQorc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFTSU9WTUd1aWQgPSBVTFRSQV9TSU9WTV9HVUlEOworCisKKy8qIFVzZWQgaW4gdmlzb3Jub29wL3Zpc29ybm9vcF9tYWluLmMKKyAqIHs1YjUyYzVhYy1lNWY1LTRkNDItOGRmZi00MjllYWVjZDIyMWZ9CisgKi8KKyNkZWZpbmUgVUxUUkFfQ09OVFJPTERJUkVDVE9SX0NIQU5ORUxfUFJPVE9DT0xfR1VJRCAgXAorCXsgMHg1YjUyYzVhYywgMHhlNWY1LCAweDRkNDIsIFwKKwkJeyAweDhkLCAweGZmLCAweDQyLCAweDllLCAweGFlLCAweGNkLCAweDIyLCAweDFmIH0gfQorCitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYUNvbnRyb2xEaXJlY3RvckNoYW5uZWxQcm90b2NvbEd1aWQgPQorCVVMVFJBX0NPTlRST0xESVJFQ1RPUl9DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIFVzZWQgaW4gdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF9tYWluLmMKKyAqIHtCNEU3OTYyNS1BRURFLTRFQUEtOUUxMS1EM0VERENENDUwNEN9CisgKi8KKyNkZWZpbmUgVUxUUkFfRElBR19QT09MX0NIQU5ORUxfUFJPVE9DT0xfR1VJRAkJCQlcCisJezB4YjRlNzk2MjUsIDB4YWVkZSwgMHg0ZWFhLAkJCQkJXAorCQl7IDB4OWUsIDB4MTEsIDB4ZDMsIDB4ZWQsIDB4ZGMsIDB4ZDQsIDB4NTAsIDB4NGMgfSB9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NvbnRyb2xmcmFtZXdvcmsuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sZnJhbWV3b3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNjQzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sZnJhbWV3b3JrLmgKQEAgLTAsMCArMSw3NyBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoKKyAqIE1vZHVsZSBOYW1lOgorICogIGNvbnRyb2xmcmFtZXdvcmsuaAorICoKKyAqIEFic3RyYWN0OiBUaGlzIGZpbGUgZGVmaW5lcyBjb21tb24gc3RydWN0dXJlcyBpbiB0aGUgdW5tYW5hZ2VkCisgKgkgICAgIFVsdHJhdmlzb3IgKG1vc3RseSBFRkkpIHNwYWNlLgorICoKKyAqLworCisjaWZuZGVmIF9DT05UUk9MX0ZSQU1FV09SS19IXworI2RlZmluZSBfQ09OVFJPTF9GUkFNRVdPUktfSF8KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorCisjZGVmaW5lIFVMVFJBX01FTU9SWV9DT1VOVF9LaSAxMDI0CisKKy8qIFNjYWxlIG9yZGVyIDAgaXMgb25lIDMyLWJpdCAoNC1ieXRlKSB3b3JkIChpbiA2NCBvciAxMjgtYml0CisgKiBhcmNoaXRlY3R1cmUgcG90ZW50aWFsbHkgNjQgb3IgMTI4LWJpdCB3b3JkKSAqLworI2RlZmluZSBVTFRSQV9NRU1PUllfUEFHRV9XT1JEIDQKKworLyogRGVmaW5lIEtpIHNjYWxlIHBhZ2UgdG8gYmUgdHJhZGl0aW9uYWwgNEtCIHBhZ2UgKi8KKyNkZWZpbmUgVUxUUkFfTUVNT1JZX1BBR0VfS2kgKFVMVFJBX01FTU9SWV9QQUdFX1dPUkQgKiBVTFRSQV9NRU1PUllfQ09VTlRfS2kpCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfU0VHTUVOVF9TVEFURSAgeworCVUxNiBFbmFibGVkOjE7CQkvKiBCaXQgMDogTWF5IGVudGVyIG90aGVyIHN0YXRlcyAqLworCVUxNiBBY3RpdmU6MTsJCS8qIEJpdCAxOiBBc3NpZ25lZCB0byBhY3RpdmUgcGFydGl0aW9uICovCisJVTE2IEFsaXZlOjE7CQkvKiBCaXQgMjogQ29uZmlndXJlIG1lc3NhZ2Ugc2VudCB0bworCQkJCSAqIHNlcnZpY2Uvc2VydmVyICovCisJVTE2IFJldm9rZWQ6MTsJCS8qIEJpdCAzOiBzaW1pbGFyIHRvIHBhcnRpdGlvbiBzdGF0ZQorCQkJCSAqIFNodXR0aW5nRG93biAqLworCVUxNiBBbGxvY2F0ZWQ6MTsJLyogQml0IDQ6IG1lbW9yeSAoZGV2aWNlL3BvcnQgbnVtYmVyKQorCQkJCSAqIGhhcyBiZWVuIHNlbGVjdGVkIGJ5IENvbW1hbmQgKi8KKwlVMTYgS25vd246MTsJCS8qIEJpdCA1OiBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIHRoZQorCQkJCSAqIHNlcnZpY2UvZ3Vlc3QgcGFydGl0aW9uICovCisJVTE2IFJlYWR5OjE7CQkvKiBCaXQgNjogc2VydmljZS9HdWVzdCBwYXJ0aXRpb24gaGFzCisJCQkJICogcmVzcG9uZGVkIHRvIGludHJvZHVjdGlvbiAqLworCVUxNiBPcGVyYXRpbmc6MTsJLyogQml0IDc6IHJlc291cmNlIGlzIGNvbmZpZ3VyZWQgYW5kCisJCQkJICogb3BlcmF0aW5nICovCisJLyogTm90ZTogZG9uJ3QgdXNlIGhpZ2ggYml0IHVubGVzcyB3ZSBuZWVkIHRvIHN3aXRjaCB0byB1c2hvcnQKKwkgKiB3aGljaCBpcyBub24tY29tcGxpYW50ICovCit9IFVMVFJBX1NFR01FTlRfU1RBVEU7CitzdGF0aWMgY29uc3QgVUxUUkFfU0VHTUVOVF9TVEFURSBTZWdtZW50U3RhdGVSdW5uaW5nID0geworCTEsIDEsIDEsIDAsIDEsIDEsIDEsIDEKK307CitzdGF0aWMgY29uc3QgVUxUUkFfU0VHTUVOVF9TVEFURSBTZWdtZW50U3RhdGVQYXVzZWQgPSB7CisJMSwgMSwgMSwgMCwgMSwgMSwgMSwgMAorfTsKK3N0YXRpYyBjb25zdCBVTFRSQV9TRUdNRU5UX1NUQVRFIFNlZ21lbnRTdGF0ZVN0YW5kYnkgPSB7CisJMSwgMSwgMCwgMCwgMSwgMSwgMSwgMAorfTsKK3R5cGVkZWYgdW5pb24geworCVU2NCBGdWxsOworCXN0cnVjdCB7CisJCVU4IE1ham9yOwkvKiB3aWxsIGJlIDEgZm9yIHRoZSBmaXJzdCByZWxlYXNlIGFuZAorCQkJCSAqIGluY3JlbWVudCB0aGVyZWFmdGVyICAqLworCQlVOCBNaW5vcjsKKwkJVTE2IE1haW50ZW5hbmNlOworCQlVMzIgUmV2aXNpb247CS8qIFN1YnZlcnNpb24gcmV2aXNpb24gKi8KKwl9IFBhcnQ7Cit9IFVMVFJBX0NPTVBPTkVOVF9WRVJTSU9OOworCisjZW5kaWYJCQkJLyogX0NPTlRST0xfRlJBTUVXT1JLX0hfIG5vdCBkZWZpbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY29udHJvbHZtY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NvbnRyb2x2bWNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2YxYzRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NvbnRyb2x2bWNoYW5uZWwuaApAQCAtMCwwICsxLDYxOSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ09OVFJPTFZNQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19DT05UUk9MVk1DSEFOTkVMX0hfXworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAiY29udHJvbGZyYW1ld29yay5oIgorZW51bSB7IElOVkFMSURfR1VFU1RfRklSTVdBUkUsIFNBTVBMRV9HVUVTVF9GSVJNV0FSRSwKKwkgICAgVElBTk8zMl9HVUVTVF9GSVJNV0FSRSwgVElBTk82NF9HVUVTVF9GSVJNV0FSRQorfTsKKworLyogezJCM0MyRDEwLTdFRjUtNGFkOC1COTY2LTM0NDhCNzM4NkIzRH0gKi8KKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfR1VJRAlcCisJezB4MmIzYzJkMTAsIDB4N2VmNSwgMHg0YWQ4LCBcCisJCXsweGI5LCAweDY2LCAweDM0LCAweDQ4LCAweGI3LCAweDM4LCAweDZiLCAweDNkfSB9CisKK3N0YXRpYyBjb25zdCBHVUlEIFVsdHJhQ29udHJvbHZtQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfR1VJRDsKKworI2RlZmluZSBVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgXAorCVVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisjZGVmaW5lIENPTlRST0xWTV9NRVNTQUdFX01BWCAgICAgNjQKKworLyogTXVzdCBpbmNyZW1lbnQgdGhpcyB3aGVuZXZlciB5b3UgaW5zZXJ0IG9yIGRlbGV0ZSBmaWVsZHMgd2l0aGluCisqIHRoaXMgY2hhbm5lbCBzdHJ1Y3QuICBBbHNvIGluY3JlbWVudCB3aGVuZXZlciB5b3UgY2hhbmdlIHRoZSBtZWFuaW5nCisqIG9mIGZpZWxkcyB3aXRoaW4gdGhpcyBjaGFubmVsIHN0cnVjdCBzbyBhcyB0byBicmVhayBwcmUtZXhpc3RpbmcKKyogc29mdHdhcmUuICBOb3RlIHRoYXQgeW91IGNhbiB1c3VhbGx5IGFkZCBmaWVsZHMgdG8gdGhlIEVORCBvZiB0aGUKKyogY2hhbm5lbCBzdHJ1Y3Qgd2l0aE9VVCBuZWVkaW5nIHRvIGluY3JlbWVudCB0aGlzLiAqLworI2RlZmluZSBVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQgIDEKKworI2RlZmluZSBVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkgICAgICAgICAgIFwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsIFwKKwkJVWx0cmFDb250cm9sdm1DaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCSJjb250cm9sdm0iLCBcCisJCXNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCksIFwKKwkJVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklELCBcCisJCVVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQlfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX09LX1NFUlZFUihhY3R1YWxCeXRlcywgbG9nQ3R4KSAgICAgICAgXAorCShVTFRSQV9jaGVja19jaGFubmVsX3NlcnZlcihVbHRyYUNvbnRyb2x2bUNoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgImNvbnRyb2x2bSIsCQkJXAorCQkJCSAgICBzaXplb2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCQkJICAgIGFjdHVhbEJ5dGVzLCBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisKKyNkZWZpbmUgTVlfREVWSUNFX0lOREVYIDAKKyNkZWZpbmUgTUFYX01BQ0RBVEFfTEVOIDggLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBNQUMgYWRkcmVzcyBpbiBjb25maWcgcGFja2V0ICovCisjZGVmaW5lIE1BWF9TRVJJQUxfTlVNCTMyCisKKyNkZWZpbmUgRElTS19aRVJPX1BVTl9OVU1CRVIJMSAgLyogVGFyZ2V0IElEIG9uIHRoZSBTQ1NJIGJ1cyBmb3IgTFVOIDAgKi8KKyNkZWZpbmUgRElTS19aRVJPX0xVTl9OVU1CRVIJMyAgLyogTG9naWNhbCBVbml0IE51bWJlciAqLworCisvKiBEZWZpbmVzIGZvciB2YXJpb3VzIGNoYW5uZWwgcXVldWVzLi4uICovCisjZGVmaW5lIENPTlRST0xWTV9RVUVVRV9SRVFVRVNUCQkwCisjZGVmaW5lIENPTlRST0xWTV9RVUVVRV9SRVNQT05TRQkxCisjZGVmaW5lCUNPTlRST0xWTV9RVUVVRV9FVkVOVAkJMgorI2RlZmluZSBDT05UUk9MVk1fUVVFVUVfQUNLCQkzCisKKy8qIE1heCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGR1cmluZyBJT1ZNIGNyZWF0aW9uIHRvIGJlIHJldXNlZAorICogYWZ0ZXIgY3Jhc2ggKi8KKyNkZWZpbmUgQ09OVFJPTFZNX0NSQVNITVNHX01BWAkJMgorCisvKiogSWRzIGZvciBjb21tYW5kcyB0aGF0IG1heSBhcHBlYXIgaW4gZWl0aGVyIHF1ZXVlIG9mIGEgQ29udHJvbFZtIGNoYW5uZWwuCisgKgorICogIENvbW1hbmRzIHRoYXQgYXJlIGluaXRpYXRlZCBieSB0aGUgY29tbWFuZCBwYXJ0aXRpb24gKENQKSwgYnkgYW4gSU8gb3IKKyAqICBjb25zb2xlIHNlcnZpY2UgcGFydGl0aW9uIChTUCksIG9yIGJ5IGEgZ3Vlc3QgcGFydGl0aW9uIChHUClhcmU6CisgKiAgLSBpc3N1ZWQgb24gdGhlIFJlcXVlc3RRdWV1ZSBxdWV1ZSAocSAjMCkgaW4gdGhlIENvbnRyb2xWbSBjaGFubmVsCisgKiAgLSByZXNwb25kZWQgdG8gb24gdGhlIFJlc3BvbnNlUXVldWUgcXVldWUgKHEgIzEpIGluIHRoZSBDb250cm9sVm0gY2hhbm5lbAorICoKKyAqICBFdmVudHMgdGhhdCBhcmUgaW5pdGlhdGVkIGJ5IGFuIElPIG9yIGNvbnNvbGUgc2VydmljZSBwYXJ0aXRpb24gKFNQKSBvcgorICogIGJ5IGEgZ3Vlc3QgcGFydGl0aW9uIChHUCkgYXJlOgorICogIC0gaXNzdWVkIG9uIHRoZSBFdmVudFF1ZXVlIHF1ZXVlIChxICMyKSBpbiB0aGUgQ29udHJvbFZtIGNoYW5uZWwKKyAqICAtIHJlc3BvbmRlZCB0byBvbiB0aGUgRXZlbnRBY2tRdWV1ZSBxdWV1ZSAocSAjMykgaW4gdGhlIENvbnRyb2xWbSBjaGFubmVsCisgKi8KK3R5cGVkZWYgZW51bSAgeworCUNPTlRST0xWTV9JTlZBTElEID0gMCwKKwkvKiBTV0lUQ0ggY29tbWFuZHMgcmVxdWlyZWQgUGFyYW1ldGVyOiBTd2l0Y2hOdW1iZXIgICovCisJLyogQlVTIGNvbW1hbmRzIHJlcXVpcmVkIFBhcmFtZXRlcjogQnVzTnVtYmVyICAqLworCUNPTlRST0xWTV9CVVNfQ1JFQVRFID0gMHgxMDEsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQlVTX0RFU1RST1kgPSAweDEwMiwJLyogQ1AgLS0+IFNQLCBHUCAqLworCUNPTlRST0xWTV9CVVNfQ09ORklHVVJFID0gMHgxMDQsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9CVVNfQ0hBTkdFU1RBVEUgPSAweDEwNSwJLyogQ1AgLS0+IFNQLCBHUCAqLworCUNPTlRST0xWTV9CVVNfQ0hBTkdFU1RBVEVfRVZFTlQgPSAweDEwNiwgLyogU1AsIEdQIC0tPiBDUCAqLworLyogREVWSUNFIGNvbW1hbmRzIHJlcXVpcmVkIFBhcmFtZXRlcjogQnVzTnVtYmVyLCBEZXZpY2VOdW1iZXIgICovCisKKwlDT05UUk9MVk1fREVWSUNFX0NSRUFURSA9IDB4MjAxLAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZID0gMHgyMDIsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fREVWSUNFX0NPTkZJR1VSRSA9IDB4MjAzLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFID0gMHgyMDQsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFX0VWRU5UID0gMHgyMDUsIC8qIFNQLCBHUCAtLT4gQ1AgKi8KKwlDT05UUk9MVk1fREVWSUNFX1JFQ09ORklHVVJFID0gMHgyMDYsCS8qIENQIC0tPiBCb290ICovCisvKiBESVNLIGNvbW1hbmRzIHJlcXVpcmVkIFBhcmFtZXRlcjogQnVzTnVtYmVyLCBEZXZpY2VOdW1iZXIgICovCisJQ09OVFJPTFZNX0RJU0tfQ1JFQVRFID0gMHgyMjEsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9ESVNLX0RFU1RST1kgPSAweDIyMiwJLyogQ1AgLS0+IFNQICovCisJQ09OVFJPTFZNX0RJU0tfQ09ORklHVVJFID0gMHgyMjMsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9ESVNLX0NIQU5HRVNUQVRFID0gMHgyMjQsCS8qIENQIC0tPiBTUCAqLworLyogQ0hJUFNFVCBjb21tYW5kcyAqLworCUNPTlRST0xWTV9DSElQU0VUX0lOSVQgPSAweDMwMSwJLyogQ1AgLS0+IFNQLCBHUCAqLworCUNPTlRST0xWTV9DSElQU0VUX1NUT1AgPSAweDMwMiwJLyogQ1AgLS0+IFNQLCBHUCAqLworCUNPTlRST0xWTV9DSElQU0VUX1NIVVRET1dOID0gMHgzMDMsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9DSElQU0VUX1JFQURZID0gMHgzMDQsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9DSElQU0VUX1NFTEZURVNUID0gMHgzMDUsCS8qIENQIC0tPiBTUCAqLworCit9IENPTlRST0xWTV9JRDsKKworc3RydWN0IEludGVycnVwdEluZm8geworCSAvKio8IHNwZWNpZmllcyBpbnRlcnJ1cHQgaW5mby4gSXQgaXMgdXNlZCB0byBzZW5kIGludGVycnVwdHMKKwkgICogICBmb3IgdGhpcyBjaGFubmVsLiBUaGUgcGVlciBhdCB0aGUgZW5kIG9mIHRoaXMgY2hhbm5lbAorCSAgKiAgIHdobyBoYXMgcmVnaXN0ZXJlZCBhbiBpbnRlcnJ1cHQgKHVzaW5nIHJlY3YgZmllbGRzCisJICAqICAgYWJvdmUpIHdpbGwgcmVjZWl2ZSB0aGUgaW50ZXJydXB0LiBQYXNzZWQgYXMgYSBwYXJhbWV0ZXIKKwkgICogICB0byBJc3N1ZV9WTUNBTExfSU9fUVVFVUVfVFJBTlNJVElPTiwgd2hpY2ggZ2VuZXJhdGVzIHRoZQorCSAgKiAgIGludGVycnVwdC4gIEN1cnJlbnRseSB0aGlzIGlzIHVzZWQgYnkgSU9QYXJ0LVNQIHRvIHdha2UKKwkgICogICB1cCBHUCB3aGVuIERhdGEgQ2hhbm5lbCB0cmFuc2l0aW9ucyBmcm9tIGVtcHR5IHRvCisJICAqICAgbm9uLWVtcHR5LiovCisJVTY0IHNlbmRJbnRlcnJ1cHRIYW5kbGU7CisKKwkgLyoqPCBzcGVjaWZpZXMgaW50ZXJydXB0IGhhbmRsZS4gSXQgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUKKwkgICogICBjb3JyZXNwb25kaW5nIGludGVycnVwdCBwaW4gZnJvbSBNb25pdG9yOyBhbmQgdGhlCisJICAqICAgaW50ZXJydXB0IHBpbiBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKwkgICogICBpbnRycnVwdC4gIFVzZWQgYnkgSU9QYXJ0LUdQIG9ubHkuICovCisJVTY0IHJlY3ZJbnRlcnJ1cHRIYW5kbGU7CisKKwkgLyoqPCBzcGVjaWZpZXMgaW50ZXJydXB0IHZlY3Rvci4gSXQsIGludGVycnVwdCBwaW4sIGFuZCBzaGFyZWQgYXJlCisJICAqICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdC4gIFVzZWQgYnkKKwkgICogICBJT1BhcnQtR1Agb25seS4gKi8KKwlVMzIgcmVjdkludGVycnVwdFZlY3RvcjsKKworICAgIC8qKjwgc3BlY2lmaWVzIGlmIHRoZSByZWN2SW50ZXJydXB0IGlzIHNoYXJlZC4gIEl0LCBpbnRlcnJ1cHQgcGluCisgICAgICogICBhbmQgdmVjdG9yIGFyZSB1c2VkIHRvIGNvbm5lY3QgdG8gMCA9IG5vdCBzaGFyZWQ7IDEgPSBzaGFyZWQuCisgICAgICogICB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuICBVc2VkIGJ5IElPUGFydC1HUCBvbmx5LiAqLworCVU4IHJlY3ZJbnRlcnJ1cHRTaGFyZWQ7CisJVTggcmVzZXJ2ZWRbM107CS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCit9OworCitzdHJ1Y3QgUGNpSWQgeworCVUxNiBEb21haW47CisJVTggQnVzOworCVU4IFNsb3Q7CisJVTggRnVuYzsKKwlVOCBSZXNlcnZlZFszXTsJLyogTmF0dXJhbCBhbGlnbm1lbnQgcHVycG9zZXMgKi8KK307CisKK3N0cnVjdCBQY2lDb25maWdIZHIgeworCVUxNiBWZW5kb3JJZDsKKwlVMTYgU3ViU3lzVmVuZG9yOworCVUxNiBEZXZpY2VJZDsKKwlVMTYgU3ViU3lzRGV2aWNlOworCVUzMiBDbGFzc0NvZGU7CisJVTMyIFJlc2VydmVkOwkJLyogTmF0dXJhbCBhbGlnbm1lbnQgcHVycG9zZXMgKi8KK307CisKK3N0cnVjdCBTY3NpSWQgeworCVUzMiBCdXM7CisJVTMyIFRhcmdldDsKKwlVMzIgTHVuOworCVUzMiBIb3N0OyAvKiBDb21tYW5kIHNob3VsZCBpZ25vcmUgdGhpcyBmb3IgKgorCQkgICAqIERpc2tBcnJpdmFsL1JlbW92YWxFdmVudHMgKi8KK307CisKK3N0cnVjdCBXV0lEIHsKKwlVMzIgd3dpZDE7CisJVTMyIHd3aWQyOworfTsKKworc3RydWN0IHZpcnREaXNrSW5mbyAgeworCVUzMiBzd2l0Y2hObzsJCS8qIGRlZmluZWQgYnkgU1dJVENIX0NSRUFURSAqLworCVUzMiBleHRlcm5hbFBvcnRObzsJLyogMCBmb3IgU0FTIFJBSUQgcHJvdmlkZWQgKGV4dGVybmFsKQorCQkJCSAqIHZpcnR1YWwgZGlza3MsIDEgZm9yIHZpcnR1YWwgZGlzaworCQkJCSAqIGltYWdlcywgMiBmb3IgZ29sZCBkaXNrIGltYWdlcyAqLworCVUxNiBWaXJ0dWFsRGlza0luZGV4OwkvKiBJbmRleCBvZiBkaXNrIGRlc2NyaXB0b3IgaW4gdGhlCisJCQkJICogVmlydHVhbERpc2sgc2VnbWVudCBhc3NvY2lhdGVkIHdpdGgKKwkJCQkgKiBleHRlcm5hbFBvcnRObyAqLworCVUxNiBSZXNlcnZlZDE7CisJVTMyIFJlc2VydmVkMjsKK307CisKK3R5cGVkZWYgZW51bSB7CisJQ09OVFJPTFZNX0FDVElPTl9OT05FID0gMCwKKwlDT05UUk9MVk1fQUNUSU9OX1NFVF9SRVNUT1JFID0gMHgwNUU3LAorCUNPTlRST0xWTV9BQ1RJT05fQ0xFQVJfUkVTVE9SRSA9IDB4MEMxOCwKKwlDT05UUk9MVk1fQUNUSU9OX1JFU1RPUklORyA9IDB4MDhFNSwKKwlDT05UUk9MVk1fQUNUSU9OX1JFU1RPUkVfQlVTWSA9IDB4MDk5OSwKKwlDT05UUk9MVk1fQUNUSU9OX0NMRUFSX05WUkFNID0gMHhCMDEKK30gQ09OVFJPTFZNX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9VTFRSQV9UT09MX0FDVElPTlMgeworCSAgICAvKiBlbnVtZXJhdGlvbiB0aGF0IGRlZmluZXMgaW50ZW5kZWQgYWN0aW9uICAqLworCSAgICBVTFRSQV9UT09MX0FDVElPTl9OT05FID0gMCwJLyogbm9ybWFsIGJvb3Qgb2YgYm9vdCBkaXNrICovCisJVUxUUkFfVE9PTF9BQ1RJT05fSU5TVEFMTCA9IDEsCS8qIGluc3RhbGwgc291cmNlIGRpc2socykgdG8gYm9vdAorCQkJCQkgKiBkaXNrICovCisJVUxUUkFfVE9PTF9BQ1RJT05fQ0FQVFVSRSA9IDIsCS8qIGNhcHR1cmUgYm9vdCBkaXNrIHRvIHRhcmdldCBkaXNrKHMpCisJCQkJCSAqIGFzICdnb2xkIGltYWdlJyAqLworCVVMVFJBX1RPT0xfQUNUSU9OX1JFUEFJUiA9IDMsCS8qIHVzZSBzb3VyY2UgZGlzayhzKSB0byByZXBhaXIKKwkJCQkJICogaW5zdGFsbGF0aW9uIG9uIGJvb3QgZGlzayAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0NMRUFOID0gNCwJLyogJ3NjcnViJyB2aXJ0dWFsIGRpc2sgYmVmb3JlCisJCQkJCSAqIHJlbGVhc2luZyBiYWNrIHRvIHN0b3JhZ2UgcG9vbCAqLworCVVMVFJBX1RPT0xfQUNUSU9OX1VQR1JBREUgPSA1LAkvKiB1cGdyYWRlIHRvIHVzZSBjb250ZW50IG9mIGltYWdlcworCQkJCQkgKiByZWZlcmVuY2VkIGZyb20gbmV3ZXIgYmx1ZXByaW50ICovCisJVUxUUkFfVE9PTF9BQ1RJT05fRElBRyA9IDYsCS8qIHVzZSB0b29sIHRvIGludm9rZSBkaWFnbm9zdGljIHNjcmlwdAorCQkJCQkgKiBwcm92aWRlZCBieSBibHVlcHJpbnQgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9GQUlMRUQgPSA3LAkvKiB1c2VkIHdoZW4gdG9vbCBmYWlscyBpbnN0YWxsYXRpb24KKwkJCQkJICAgYW5kIGNhbm5vdCBjb250aW51ZSAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0NPVU5UID0gOAorfSBVTFRSQV9UT09MX0FDVElPTlM7CisKK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OICB7CisJVTY0IEJvb3RUb0Zpcm13YXJlVUk6MTsJLyogQml0IDA6IFN0b3AgaW4gdWVmaSB1aSAqLworCVU2NCBDbGVhck52cmFtOjE7CS8qIEJpdCAxOiBDbGVhciBOVlJBTSAqLworCVU2NCBDbGVhckNtb3M6MTsJLyogQml0IDI6IENsZWFyIENNT1MgKi8KKwlVNjQgQm9vdFRvVG9vbDoxOwkvKiBCaXQgMzogUnVuIGluc3RhbGwgdG9vbCAqLworCS8qIHJlbWFpbmluZyBiaXRzIGFyZSBhdmFpbGFibGUgKi8KK30gVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTjsKKwordHlwZWRlZiBlbnVtIHsKKwlVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUkVQTFkgPSAweDAwMDAwMDAxLAorCVVMVFJBX0NISVBTRVRfRkVBVFVSRV9QQVJBX0hPVFBMVUcgPSAweDAwMDAwMDAyLAorCVVMVFJBX0NISVBTRVRfRkVBVFVSRV9QQ0lWQlVTID0gMHgwMDAwMDAwNAorfSBVTFRSQV9DSElQU0VUX0ZFQVRVUkU7CisKKy8qKiBUaGlzIGlzIHRoZSBjb21tb24gc3RydWN0dXJlIHRoYXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeQorICogIENvbnRyb2xWbSBtZXNzYWdlIChib3RoIGNvbW1hbmRzIGFuZCByZXNwb25zZXMpIGluIGFueSBDb250cm9sVm0KKyAqICBxdWV1ZS4gIENvbW1hbmRzIGFyZSBlYXNpbHkgZGlzdGluZ3Vpc2hlZCBmcm9tIHJlc3BvbnNlcyBieQorICogIGxvb2tpbmcgYXQgdGhlIGZsYWdzLnJlc3BvbnNlIGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICB7CisJVTMyIElkOwkJLyogU2VlIENPTlRST0xWTV9JRC4gKi8KKwkvKiBGb3IgcmVxdWVzdHMsIGluZGljYXRlcyB0aGUgbWVzc2FnZSB0eXBlLiAqLworCS8qIEZvciByZXNwb25zZXMsIGluZGljYXRlcyB0aGUgdHlwZSBvZiBtZXNzYWdlIHdlIGFyZSByZXNwb25kaW5nIHRvLiAqLworCisJVTMyIE1lc3NhZ2VTaXplOwkvKiBJbmNsdWRlcyBzaXplIG9mIHRoaXMgc3RydWN0ICsgc2l6ZQorCQkJCSAqIG9mIG1lc3NhZ2UgKi8KKwlVMzIgU2VnbWVudEluZGV4OwkvKiBJbmRleCBvZiBzZWdtZW50IGNvbnRhaW5pbmcgVm0KKwkJCQkgKiBtZXNzYWdlL2luZm9ybWF0aW9uICovCisJVTMyIENvbXBsZXRpb25TdGF0dXM7CS8qIEVycm9yIHN0YXR1cyBjb2RlIG9yIHJlc3VsdCBvZgorCQkJCSAqIG1lc3NhZ2UgY29tcGxldGlvbiAqLworCXN0cnVjdCAgeworCQlVMzIgZmFpbGVkOjE7CQkgICAvKio8ID0xIGluIGEgcmVzcG9uc2UgdG8gKiBzaWduaWZ5CisJCQkJCSAgICAqIGZhaWx1cmUgKi8KKwkJVTMyIHJlc3BvbnNlRXhwZWN0ZWQ6MTsgICAvKio8ID0xIGluIGFsbCBtZXNzYWdlcyB0aGF0IGV4cGVjdCBhCisJCQkJCSAgICogcmVzcG9uc2UgKENvbnRyb2wgaWdub3JlcyB0aGlzCisJCQkJCSAgICogYml0KSAqLworCQlVMzIgc2VydmVyOjE7CQkgICAvKio8ID0xIGluIGFsbCBidXMgJiBkZXZpY2UtcmVsYXRlZAorCQkJCQkgICAgKiBtZXNzYWdlcyB3aGVyZSB0aGUgbWVzc2FnZQorCQkJCQkgICAgKiByZWNlaXZlciBpcyB0byBhY3QgYXMgdGhlIGJ1cyBvcgorCQkJCQkgICAgKiBkZXZpY2Ugc2VydmVyICovCisJCVUzMiB0ZXN0TWVzc2FnZToxOwkgICAvKio8ID0xIGZvciB0ZXN0aW5nIHVzZSBvbmx5CisJCQkJCSAgICAqIChDb250cm9sIGFuZCBDb21tYW5kIGlnbm9yZSB0aGlzCisJCQkJCSAgICAqIGJpdCkgKi8KKwkJVTMyIHBhcnRpYWxDb21wbGV0aW9uOjE7ICAvKio8ID0xIGlmIHRoZXJlIGFyZSBmb3J0aGNvbWluZworCQkJCQkgICAqIHJlc3BvbnNlcy9hY2tzIGFzc29jaWF0ZWQKKwkJCQkJICAgKiB3aXRoIHRoaXMgbWVzc2FnZSAqLworCQlVMzIgcHJlc2VydmU6MTsJICAgICAgIC8qKjwgPTEgdGhpcyBpcyB0byBsZXQgdXMga25vdyB0bworCQkJCQkqIHByZXNlcnZlIGNoYW5uZWwgY29udGVudHMKKwkJCQkJKiAoZm9yIHJ1bm5pbmcgZ3Vlc3RzKSovCisJCVUzMiB3cml0ZXJJbkRpYWc6MTsJLyoqPCA9MSB0aGUgRGlhZ1dyaXRlciBpcyBhY3RpdmUgaW4gdGhlCisJCQkJCSAqIERpYWdub3N0aWMgUGFydGl0aW9uKi8KKworCQkgICAgLyogcmVtYWluaW5nIGJpdHMgaW4gdGhpcyAzMi1iaXQgd29yZCBhcmUgYXZhaWxhYmxlICovCisJfSBGbGFnczsKKwlVMzIgUmVzZXJ2ZWQ7CQkvKiBOYXR1cmFsIGFsaWdubWVudCAqLworCVU2NCBNZXNzYWdlSGFuZGxlOwkvKiBJZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIG1lc3NhZ2UgaW5zdGFuY2UsCisJCQkJICogYW5kIGlzIHVzZWQgdG8gbWF0Y2ggcGFydGljdWxhciAqLworCS8qIHJlcXVlc3QgaW5zdGFuY2VzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UgaW5zdGFuY2UuICovCisJVTY0IFBheWxvYWRWbU9mZnNldDsJLyogT2Zmc2V0IG9mIHBheWxvYWQgYXJlYSBmcm9tIHN0YXJ0IG9mIHRoaXMKKwkJCQkgKiBpbnN0YW5jZSBvZiBDb250cm9sVm0gc2VnbWVudCAqLworCVUzMiBQYXlsb2FkTWF4Qnl0ZXM7CS8qIE1heGltdW0gYnl0ZXMgYWxsb2NhdGVkIGluIHBheWxvYWQKKwkJCQkgKiBhcmVhIG9mIENvbnRyb2xWbSBzZWdtZW50ICovCisJVTMyIFBheWxvYWRCeXRlczsJLyogQWN0dWFsIG51bWJlciBvZiBieXRlcyBvZiBwYXlsb2FkCisJCQkJICogYXJlYSB0byBjb3B5IGJldHdlZW4gSU8vQ29tbWFuZDsgKi8KKwkvKiBpZiBub24temVybywgdGhlcmUgaXMgYSBwYXlsb2FkIHRvIGNvcHkuICovCit9IENPTlRST0xWTV9NRVNTQUdFX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9QQUNLRVRfREVWSUNFX0NSRUFURSAgeworCVUzMiBidXNObzsJICAgLyoqPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cgcmVjZWl2ZXIncworCQkJICAgICogcGVyc3BlY3RpdmUgKi8KKworCSAgICAvKiBDb250cm9sIHVzZXMgaGVhZGVyIFNlZ21lbnRJbmRleCBmaWVsZCB0byBhY2Nlc3MgYnVzIG51bWJlci4uLiAqLworCVUzMiBkZXZObzsJICAgLyoqPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlIG51bWJlciAqLworCVU2NCBjaGFubmVsQWRkcjsgIC8qKjwgR3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY2hhbm5lbCwgd2hpY2gKKwkJCSogICBjYW4gYmUgZGVyZWZlcmVuY2VkIGJ5IHRoZSByZWNlaXZlcgorCQkJKiAgIG9mIHRoaXMgQ29udHJvbFZtIGNvbW1hbmQgKi8KKwlVNjQgY2hhbm5lbEJ5dGVzOyAvKio8IHNwZWNpZmllcyBzaXplIG9mIHRoZSBjaGFubmVsIGluIGJ5dGVzICovCisJR1VJRCBkYXRhVHlwZUd1aWQ7LyoqPCBzcGVjaWZpZXMgZm9ybWF0IG9mIGRhdGEgaW4gY2hhbm5lbCAqLworCUdVSUQgZGV2SW5zdEd1aWQ7IC8qKjwgaW5zdGFuY2UgZ3VpZCBmb3IgdGhlIGRldmljZSAqLworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7IC8qKjwgc3BlY2lmaWVzIGludGVycnVwdCBpbmZvcm1hdGlvbiAqLworfSBDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DUkVBVEU7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NSRUFURSAqLworCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ09ORklHVVJFICB7CisJVTMyIGJ1c05vOwkgICAgICAvKio8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlIG1zZworCQkJICAgICAgICogcmVjZWl2ZXIncyBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJVTMyIGRldk5vOwkgICAgICAvKio8IGJ1cy1yZWxhdGl2ZSAoMC4ubi0xKSBkZXZpY2UgbnVtYmVyICovCit9IENPTlRST0xWTV9QQUNLRVRfREVWSUNFX0NPTkZJR1VSRTsJLyogZm9yIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFICovCisKK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MVk1fTUVTU0FHRV9ERVZJQ0VfQ1JFQVRFICB7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIEhlYWRlcjsKKwlDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DUkVBVEUgUGFja2V0OworfSBDT05UUk9MVk1fTUVTU0FHRV9ERVZJQ0VfQ1JFQVRFOwkvKiB0b3RhbCAxMjggYnl0ZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9NRVNTQUdFX0RFVklDRV9DT05GSUdVUkUgIHsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgSGVhZGVyOworCUNPTlRST0xWTV9QQUNLRVRfREVWSUNFX0NPTkZJR1VSRSBQYWNrZXQ7Cit9IENPTlRST0xWTV9NRVNTQUdFX0RFVklDRV9DT05GSUdVUkU7CS8qIHRvdGFsIDU2IGJ5dGVzICovCisKKy8qIFRoaXMgaXMgdGhlIGZvcm1hdCBmb3IgYSBtZXNzYWdlIGluIGFueSBDb250cm9sVm0gcXVldWUuICovCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX01FU1NBR0VfUEFDS0VUICB7CisJdW5pb24gIHsKKworCQkvKiBCRUdJTiBSZXF1ZXN0IG1lc3NhZ2VzICovCisJCXN0cnVjdCAgeworCQkJVTMyIGJ1c05vOwkgICAgICAvKjwgYnVzICMgKDAuLm4tMSkgZnJvbSB0aGUgbXNnCisJCQkJCSAgICAgICAqIHJlY2VpdmVyJ3MgcGVyc3BlY3RpdmUgKi8KKworCSAgICAvKiBDb250cm9sIHVzZXMgaGVhZGVyIFNlZ21lbnRJbmRleCBmaWVsZCB0byBhY2Nlc3MgYnVzIG51bWJlci4uLiAqLworCQkJVTMyIGRldmljZUNvdW50OyAgICAgIC8qPCBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2YKKwkJCQkJICAgICAgICogZGV2aWNlcyBvbiB0aGlzIGJ1cyAqLworCQkJVTY0IGNoYW5uZWxBZGRyOyAgICAgLyo8IEd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisJCQkJCSAgICAgICogICBjaGFubmVsLCB3aGljaCBjYW4gYmUKKwkJCQkJICAgICAgKiAgIGRlcmVmZXJlbmNlZCBieSB0aGUgcmVjZWl2ZXIKKwkJCQkJICAgICAgKiAgIG9mIHRoaXMgQ29udHJvbFZtIGNvbW1hbmQgKi8KKwkJCVU2NCBjaGFubmVsQnl0ZXM7ICAgIC8qPCBzaXplIG9mIHRoZSBjaGFubmVsIGluIGJ5dGVzICovCisJCQlHVUlEIGJ1c0RhdGFUeXBlR3VpZDsvKjwgaW5kaWNhdGVzIGZvcm1hdCBvZiBkYXRhIGluIGJ1cworCQkJCQkgICAgICAqIGNoYW5uZWwgKi8KKwkJCUdVSUQgYnVzSW5zdEd1aWQ7ICAgIC8qPCBpbnN0YW5jZSBndWlkIGZvciB0aGUgYnVzICovCisJCX0gY3JlYXRlQnVzOwkvKiBmb3IgQ09OVFJPTFZNX0JVU19DUkVBVEUgKi8KKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CSAgICAgIC8qPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCQkJICAgICAgICogcmVjZWl2ZXIncyBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgcmVzZXJ2ZWQ7CS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCisJCX0gZGVzdHJveUJ1czsJLyogZm9yIENPTlRST0xWTV9CVVNfREVTVFJPWSAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsJCSAgICAvKjwgYnVzICMgKDAuLm4tMSkgZnJvbSB0aGUKKwkJCQkJCSAgICAgKiBtc2cgcmVjZWl2ZXIncworCQkJCQkJICAgICAqIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwkJCVUzMiByZXNlcnZlZDE7CQkgICAgLyogZm9yIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQkJVTY0IGd1ZXN0SGFuZGxlOwkgICAgLyogVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQKKwkJCQkJICogIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MgdG8gcmVhbAorCQkJCQkgKiAgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BLCBmb3IgZXguICovCisJCQlVNjQgcmVjdkJ1c0ludGVycnVwdEhhbmRsZTsvKjwgc3BlY2lmaWVzIGludGVycnVwdAorCQkJCQkgKiAgIGluZm8uIEl0IGlzIHVzZWQgYnkgU1AgdG8gcmVnaXN0ZXIKKwkJCQkJICogICB0byByZWNlaXZlIGludGVycnVwdHMgZnJvbSB0aGUgQ1AuCisJCQkJCSAqICAgVGhpcyBpbnRlcnJ1cHQgaXMgdXNlZCBmb3IgYnVzCisJCQkJCSAqICAgbGV2ZWwgbm90aWZpY2F0aW9ucy4gIFRoZQorCQkJCQkgKiAgIGNvcnJlc3BvbmRpbmcKKwkJCQkJICogICBzZW5kQnVzSW50ZXJydXB0SGFuZGxlIGlzIGtlcHQgaW4KKwkJCQkJICogICBDUC4gKi8KKwkJfSBjb25maWd1cmVCdXM7CS8qIGZvciBDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSAqLworCisJCS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NSRUFURSAqLworCQlDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DUkVBVEUgY3JlYXRlRGV2aWNlOworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsJICAgICAgLyo8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlIG1zZworCQkJCQkgICAgICAgKiByZWNlaXZlcidzIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwkJCVUzMiBkZXZObzsJICAgICAgLyo8IGJ1cy1yZWxhdGl2ZSAoMC4ubi0xKSBkZXZpY2UKKwkJCQkJICAgICAgICogbnVtYmVyICovCisJCX0gZGVzdHJveURldmljZTsJLyogZm9yIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSAqLworCisJCS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NPTkZJR1VSRSAqLworCQlDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DT05GSUdVUkUgY29uZmlndXJlRGV2aWNlOworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsJICAgICAgLyo8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlIG1zZworCQkJCQkgICAgICAgKiByZWNlaXZlcidzIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwkJCVUzMiBkZXZObzsJICAgICAgLyo8IGJ1cy1yZWxhdGl2ZSAoMC4ubi0xKSBkZXZpY2UKKwkJCQkJICAgICAgICogbnVtYmVyICovCisJCX0gcmVjb25maWd1cmVEZXZpY2U7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX1JFQ09ORklHVVJFICovCisJCXN0cnVjdCAgeworCQkJVTMyIGJ1c05vOworCQkJVUxUUkFfU0VHTUVOVF9TVEFURSBzdGF0ZTsKKwkJCVU4IHJlc2VydmVkWzJdOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQl9IGJ1c0NoYW5nZVN0YXRlOwkvKiBmb3IgQ09OVFJPTFZNX0JVU19DSEFOR0VTVEFURSAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsKKwkJCVUzMiBkZXZObzsKKwkJCVVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGU7CisJCQlzdHJ1Y3QgIHsKKwkJCQlVMzIgcGh5c2ljYWxEZXZpY2U6MTsJLyogPTEgaWYgbWVzc2FnZSBpcyBmb3IKKwkJCQkJCQkgKiBhIHBoeXNpY2FsIGRldmljZSAqLworCQkJLyogcmVtYWluaW5nIGJpdHMgaW4gdGhpcyAzMi1iaXQgd29yZCBhcmUgYXZhaWxhYmxlICovCisJCQl9IGZsYWdzOworCQkJVTggcmVzZXJ2ZWRbMl07CS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCisJCX0gZGV2aWNlQ2hhbmdlU3RhdGU7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFICovCisJCXN0cnVjdCAgeworCQkJVTMyIGJ1c05vOworCQkJVTMyIGRldk5vOworCQkJVUxUUkFfU0VHTUVOVF9TVEFURSBzdGF0ZTsKKwkJCVU4IHJlc2VydmVkWzZdOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQl9IGRldmljZUNoYW5nZVN0YXRlRXZlbnQ7IC8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFX0VWRU5UICovCisJCXN0cnVjdCAgeworCQkJVTMyIGJ1c0NvdW50OyAvKjwgaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mIGJ1c3NlcyAqLworCQkJVTMyIHN3aXRjaENvdW50OyAvKjwgaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mCisJCQkJCSAgKiAgIHN3aXRjaGVzIChhcHBsaWNhYmxlIGZvciBzZXJ2aWNlCisJCQkJCSAgKiAgIHBhcnRpdGlvbiBvbmx5KSAqLworCQkJVUxUUkFfQ0hJUFNFVF9GRUFUVVJFIGZlYXR1cmVzOworCQkJVTMyIHBsYXRmb3JtTnVtYmVyOwkvKiBQbGF0Zm9ybSBOdW1iZXIgKi8KKwkJfSBpbml0Q2hpcHNldDsJLyogZm9yIENPTlRST0xWTV9DSElQU0VUX0lOSVQgKi8KKwkJc3RydWN0ICB7CisJCQlVMzIgT3B0aW9uczsgLyo8IHJlc2VydmVkICovCisJCQlVMzIgVGVzdDsgICAgLyo8IGJpdCAwIHNldCB0byBydW4gZW1iZWRkZWQgc2VsZnRlc3QgKi8KKwkJfSBjaGlwc2V0U2VsZnRlc3Q7CS8qIGZvciBDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVCAqLworCisJCSAgICAvKiBFTkQgUmVxdWVzdCBtZXNzYWdlcyAqLworCisJCSAgICAvKiBCRUdJTiBSZXNwb25zZSBtZXNzYWdlcyAqLworCisJCSAgICAvKiBFTkQgUmVzcG9uc2UgbWVzc2FnZXMgKi8KKworCQkgICAgLyogQkVHSU4gRXZlbnQgbWVzc2FnZXMgKi8KKworCQkgICAgLyogRU5EIEV2ZW50IG1lc3NhZ2VzICovCisKKwkJICAgIC8qIEJFR0lOIEFjayBtZXNzYWdlcyAqLworCisJCSAgICAvKiBFTkQgQWNrIG1lc3NhZ2VzICovCisJCVU2NCBhZGRyOwkgICAgLyo8IGEgcGh5c2ljYWwgYWRkcmVzcyBvZiBzb21ldGhpbmcsIHRoYXQKKwkJCQkgICAgICogICBjYW4gYmUgZGVyZWZlcmVuY2VkIGJ5IHRoZSByZWNlaXZlciBvZgorCQkJCSAgICAgKiAgIHRoaXMgQ29udHJvbFZtIGNvbW1hbmQgKGRlcGVuZHMgb24KKwkJCQkgICAgICogICBjb21tYW5kIGlkKSAqLworCQlVNjQgaGFuZGxlOwkgICAgLyo8IGEgaGFuZGxlIG9mIHNvbWV0aGluZyAoZGVwZW5kcyBvbgorCQkJCSAgICAgKiBjb21tYW5kIGlkKSAqLworCX07Cit9IENPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVDsKKworLyogQWxsIG1lc3NhZ2VzIGluIGFueSBDb250cm9sVm0gcXVldWUgaGF2ZSB0aGlzIGxheW91dC4gKi8KK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MVk1fTUVTU0FHRSAgeworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBoZHI7CisJQ09OVFJPTFZNX01FU1NBR0VfUEFDS0VUIGNtZDsKK30gQ09OVFJPTFZNX01FU1NBR0U7CisKK3R5cGVkZWYgc3RydWN0IF9ERVZJQ0VfTUFQICB7CisJR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBEZXZpY2VDaGFubmVsQWRkcmVzczsKKwlVNjQgRGV2aWNlQ2hhbm5lbFNpemU7CisJVTMyIENBX0luZGV4OworCVUzMiBSZXNlcnZlZDsJCS8qIG5hdHVyYWwgYWxpZ25tZW50ICovCisJVTY0IFJlc2VydmVkMjsJCS8qIEFsaWduIHN0cnVjdHVyZSBvbiAzMi1ieXRlIGJvdW5kYXJ5ICovCit9IERFVklDRV9NQVA7CisKK3R5cGVkZWYgc3RydWN0IF9HVUVTVF9ERVZJQ0VTICB7CisJREVWSUNFX01BUCBWaWRlb0NoYW5uZWw7CisJREVWSUNFX01BUCBLZXlib2FyZENoYW5uZWw7CisJREVWSUNFX01BUCBOZXR3b3JrQ2hhbm5lbDsKKwlERVZJQ0VfTUFQIFN0b3JhZ2VDaGFubmVsOworCURFVklDRV9NQVAgQ29uc29sZUNoYW5uZWw7CisJVTMyIFBhcnRpdGlvbkluZGV4OworCVUzMiBQYWQ7Cit9IEdVRVNUX0RFVklDRVM7CisKK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCAgeworCSBDSEFOTkVMX0hFQURFUiBIZWFkZXI7CisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgZ3BDb250cm9sVm07CS8qIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YKKwkJCQkJCSAqIHRoaXMgY2hhbm5lbCAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwUGFydGl0aW9uVGFibGVzOyAvKiBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCisJCQkJCQkgICAgKiBwYXJ0aXRpb24gdGFibGVzICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgZ3BEaWFnR3Vlc3Q7CS8qIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YKKwkJCQkJCSAqIGRpYWdub3N0aWMgY2hhbm5lbCAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwQm9vdFJvbURpc2s7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiAocmVhZAorCQkJCQkJICogb25seSkgQm9vdCBST00gZGlzayAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwQm9vdFJhbURpc2s7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiB3cml0YWJsZQorCQkJCQkJICogQm9vdCBSQU0gZGlzayAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwQWNwaVRhYmxlOwkvKiBndWVzdCBwaHlzIGFkZHIgb2YgYWNwaQorCQkJCQkJICogdGFibGUgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncENvbnRyb2xDaGFubmVsOyAvKiBndWVzdCBwaHlzIGFkZHIgb2YgY29udHJvbAorCQkJCQkJICAgKiBjaGFubmVsICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgZ3BEaWFnUm9tRGlzazsJLyogZ3Vlc3QgcGh5cyBhZGRyIG9mIGRpYWdub3N0aWMKKwkJCQkJCSAqIFJPTSBkaXNrICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgZ3BOdnJhbTsJLyogZ3Vlc3QgcGh5cyBhZGRyIG9mIE5WUkFNCisJCQkJCQkgKiBjaGFubmVsICovCisJIFU2NCBSZXF1ZXN0UGF5bG9hZE9mZnNldDsJLyogT2Zmc2V0IHRvIHJlcXVlc3QgcGF5bG9hZCBhcmVhICovCisJIFU2NCBFdmVudFBheWxvYWRPZmZzZXQ7CS8qIE9mZnNldCB0byBldmVudCBwYXlsb2FkIGFyZWEgKi8KKwkgVTMyIFJlcXVlc3RQYXlsb2FkQnl0ZXM7CS8qIEJ5dGVzIGF2YWlsYWJsZSBpbiByZXF1ZXN0IHBheWxvYWQKKwkJCQkJICogYXJlYSAqLworCSBVMzIgRXZlbnRQYXlsb2FkQnl0ZXM7CS8qIEJ5dGVzIGF2YWlsYWJsZSBpbiBldmVudCBwYXlsb2FkIGFyZWEgKi8KKwkgVTMyIENvbnRyb2xDaGFubmVsQnl0ZXM7CisJIFUzMiBOdnJhbUNoYW5uZWxCeXRlczsJLyogQnl0ZXMgaW4gUGFydGl0aW9uTnZyYW0gc2VnbWVudCAqLworCSBVMzIgTWVzc2FnZUJ5dGVzOwkvKiBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpICovCisJIFUzMiBNZXNzYWdlQ291bnQ7CS8qIENPTlRST0xWTV9NRVNTQUdFX01BWCAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwU21iaW9zVGFibGU7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiBTTUJJT1MKKwkJCQkJCSAqIHRhYmxlcyAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwUGh5c2ljYWxTbWJpb3NUYWJsZTsJLyogZ3Vlc3QgcGh5cyBhZGRyIG9mCisJCQkJCQkJICogU01CSU9TIHRhYmxlICAqLworCSAvKiBVTFRSQV9NQVhfR1VFU1RTX1BFUl9TRVJWSUNFICovCisJIEdVRVNUX0RFVklDRVMgZ3BPYnNvbGV0ZUd1ZXN0RGV2aWNlc1sxNl07CisKKwkgLyogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiBFRkkgZmlybXdhcmUgaW1hZ2UgYmFzZSAgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RGaXJtd2FyZUltYWdlQmFzZTsKKworCSAvKiBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEVGSSBmaXJtd2FyZSBlbnRyeSBwb2ludCAgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RGaXJtd2FyZUVudHJ5UG9pbnQ7CisKKwkgLyogZ3Vlc3QgRUZJIGZpcm13YXJlIGltYWdlIHNpemUgICovCisJIFU2NCBWaXJ0dWFsR3Vlc3RGaXJtd2FyZUltYWdlU2l6ZTsKKworCSAvKiBHUEEgPSAxTUIgd2hlcmUgRUZJIGZpcm13YXJlIGltYWdlIGlzIGNvcGllZCB0byAgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RGaXJtd2FyZUJvb3RCYXNlOworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIFZpcnR1YWxHdWVzdEltYWdlQmFzZTsKKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RJbWFnZVNpemU7CisJIFU2NCBQcm90b3R5cGVDb250cm9sQ2hhbm5lbE9mZnNldDsKKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RQYXJ0aXRpb25IYW5kbGU7CisKKwkgVTE2IFJlc3RvcmVBY3Rpb247CS8qIFJlc3RvcmUgQWN0aW9uIGZpZWxkIHRvIHJlc3RvcmUgdGhlIGd1ZXN0CisJCQkJICogcGFydGl0aW9uICovCisJVTE2IER1bXBBY3Rpb247CQkvKiBGb3IgV2luZG93cyBndWVzdHMgaXQgc2hvd3MgaWYgdGhlIHZpc29yZGlzaworCQkJCSAqIGlzIHJ1bm5pbmcgaW4gZHVtcCBtb2RlICovCisJVTE2IE52cmFtRmFpbENvdW50OworCVUxNiBTYXZlZENyYXNoTXNnQ291bnQ7CS8qID0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCAqLworCVUzMiBTYXZlZENyYXNoTXNnT2Zmc2V0OwkvKiBPZmZzZXQgdG8gcmVxdWVzdCBwYXlsb2FkIGFyZWEgbmVlZGVkCisJCQkJCSAqIGZvciBjcmFzaCBkdW1wICovCisJVTMyIEluc3RhbGxhdGlvbkVycm9yOwkvKiBUeXBlIG9mIGVycm9yIGVuY291bnRlcmVkIGR1cmluZworCQkJCSAqIGluc3RhbGxhdGlvbiAqLworCVUzMiBJbnN0YWxsYXRpb25UZXh0SWQ7CS8qIElkIG9mIHN0cmluZyB0byBkaXNwbGF5ICovCisJVTE2IEluc3RhbGxhdGlvblJlbWFpbmluZ1N0ZXBzOwkvKiBOdW1iZXIgb2YgcmVtYWluaW5nIGluc3RhbGxhdGlvbgorCQkJCQkgKiBzdGVwcyAoZm9yIHByb2dyZXNzIGJhcnMpICovCisJVTggVG9vbEFjdGlvbjsJCS8qIFVMVFJBX1RPT0xfQUNUSU9OUyBJbnN0YWxsYXRpb24gQWN0aW9uCisJCQkJICogZmllbGQgKi8KKwlVOCBSZXNlcnZlZDsJCS8qIGFsaWdubWVudCAqLworCVVMVFJBX0VGSV9TUEFSX0lORElDQVRJT04gRWZpU3BhckluZGljYXRpb247CisJVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTiBFZmlTcGFySW5kaWNhdGlvblN1cHBvcnRlZDsKKwlVMzIgU1BSZXNlcnZlZDsKKwlVOCBSZXNlcnZlZDJbMjhdOwkvKiBGb3JjZSBzaWduYWxzIHRvIGJlZ2luIG9uIDEyOC1ieXRlIGNhY2hlCisJCQkJICogbGluZSAqLworCVNJR05BTF9RVUVVRV9IRUFERVIgUmVxdWVzdFF1ZXVlOwkvKiBTZXJ2aWNlIG9yIGd1ZXN0IHBhcnRpdGlvbgorCQkJCQkJICogdXNlcyB0aGlzIHF1ZXVlIHRvIHNlbmQKKwkJCQkJCSAqIHJlcXVlc3RzIHRvIENvbnRyb2wgKi8KKwlTSUdOQUxfUVVFVUVfSEVBREVSIFJlc3BvbnNlUXVldWU7CS8qIENvbnRyb2wgdXNlcyB0aGlzIHF1ZXVlIHRvCisJCQkJCQkgKiByZXNwb25kIHRvIHNlcnZpY2Ugb3IgZ3Vlc3QKKwkJCQkJCSAqIHBhcnRpdGlvbiByZXF1ZXN0cyAqLworCVNJR05BTF9RVUVVRV9IRUFERVIgRXZlbnRRdWV1ZTsJCS8qIENvbnRyb2wgdXNlcyB0aGlzIHF1ZXVlIHRvCisJCQkJCQkgKiBzZW5kIGV2ZW50cyB0byBzZXJ2aWNlIG9yCisJCQkJCQkgKiBndWVzdCBwYXJ0aXRpb24gKi8KKwlTSUdOQUxfUVVFVUVfSEVBREVSIEV2ZW50QWNrUXVldWU7CS8qIFNlcnZpY2Ugb3IgZ3Vlc3QgcGFydGl0aW9uCisJCQkJCQkgKiB1c2VzIHRoaXMgcXVldWUgdG8gYWNrCisJCQkJCQkgKiBDb250cm9sIGV2ZW50cyAqLworCisJIC8qIFJlcXVlc3QgZml4ZWQtc2l6ZSBtZXNzYWdlIHBvb2wgLSBkb2VzIG5vdCBpbmNsdWRlIHBheWxvYWQgKi8KKwkgQ09OVFJPTFZNX01FU1NBR0UgUmVxdWVzdE1zZ1tDT05UUk9MVk1fTUVTU0FHRV9NQVhdOworCisJIC8qIFJlc3BvbnNlIGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIFJlc3BvbnNlTXNnW0NPTlRST0xWTV9NRVNTQUdFX01BWF07CisKKwkgLyogRXZlbnQgZml4ZWQtc2l6ZSBtZXNzYWdlIHBvb2wgLSBkb2VzIG5vdCBpbmNsdWRlIHBheWxvYWQgKi8KKwkgQ09OVFJPTFZNX01FU1NBR0UgRXZlbnRNc2dbQ09OVFJPTFZNX01FU1NBR0VfTUFYXTsKKworCSAvKiBBY2sgZml4ZWQtc2l6ZSBtZXNzYWdlIHBvb2wgLSBkb2VzIG5vdCBpbmNsdWRlIHBheWxvYWQgKi8KKwkgQ09OVFJPTFZNX01FU1NBR0UgRXZlbnRBY2tNc2dbQ09OVFJPTFZNX01FU1NBR0VfTUFYXTsKKworCSAvKiBNZXNzYWdlIHN0b3JlZCBkdXJpbmcgSU9WTSBjcmVhdGlvbiB0byBiZSByZXVzZWQgYWZ0ZXIgY3Jhc2ggKi8KKwkgQ09OVFJPTFZNX01FU1NBR0UgU2F2ZWRDcmFzaE1zZ1tDT05UUk9MVk1fQ1JBU0hNU0dfTUFYXTsKK30gVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0w7CisKKy8qIE9mZnNldHMgZm9yIFZNIGNoYW5uZWwgYXR0cmlidXRlcy4uLiAqLworI2RlZmluZSBWTV9DSF9SRVFfUVVFVUVfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgUmVxdWVzdFF1ZXVlKQorI2RlZmluZSBWTV9DSF9SRVNQX1FVRVVFX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIFJlc3BvbnNlUXVldWUpCisjZGVmaW5lIFZNX0NIX0VWRU5UX1FVRVVFX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIEV2ZW50UXVldWUpCisjZGVmaW5lIFZNX0NIX0FDS19RVUVVRV9PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBFdmVudEFja1F1ZXVlKQorI2RlZmluZSBWTV9DSF9SRVFfTVNHX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIFJlcXVlc3RNc2cpCisjZGVmaW5lIFZNX0NIX1JFU1BfTVNHX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIFJlc3BvbnNlTXNnKQorI2RlZmluZSBWTV9DSF9FVkVOVF9NU0dfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgRXZlbnRNc2cpCisjZGVmaW5lIFZNX0NIX0FDS19NU0dfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgRXZlbnRBY2tNc2cpCisjZGVmaW5lIFZNX0NIX0NSQVNIX01TR19PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBTYXZlZENyYXNoTXNnKQorCisvKiBUaGUgZm9sbG93aW5nIGhlYWRlciB3aWxsIGJlIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBQYXlsb2FkVm1PZmZzZXQgZm9yCisgKiAgdmFyaW91cyBDb250cm9sVm0gY29tbWFuZHMuIFRoZSByZWNlaXZlciBvZiBhIENvbnRyb2xWbSBjb21tYW5kIHdpdGggYQorICogIFBheWxvYWRWbU9mZnNldCB3aWxsIGRlcmVmZXJlbmNlIHRoaXMgYWRkcmVzcyBhbmQgdGhlbiB1c2UgQ29ubmVjdGlvbk9mZnNldCwKKyAqICBJbml0aWF0b3JPZmZzZXQsIGFuZCBUYXJnZXRPZmZzZXQgdG8gZ2V0IHRoZSBsb2NhdGlvbiBvZiBVVEYtOCBmb3JtYXR0ZWQKKyAqICBzdHJpbmdzIHRoYXQgY2FuIGJlIHBhcnNlZCB0byBvYnRhaW4gY29tbWFuZC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlCisgKiAgb2YgVG90YWxMZW5ndGggc2hvdWxkIGVxdWFsIFBheWxvYWRCeXRlcy4gIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZ3MgYXQKKyAqICBQYXlsb2FkVm1PZmZzZXQgd2lsbCB0YWtlIGRpZmZlcmVudCBmb3JtcyBkZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UuICBTZWUgdGhlCisgKiAgZm9sbG93aW5nIFdpa2kgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKKyAqICBodHRwczovL3VzdHItbGludXgtMS5uYS51aXMudW5pc3lzLmNvbS9zcGFyL2luZGV4LnBocC9Db250cm9sVm1fUGFyYW1ldGVyc19BcmVhCisgKi8KK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgIHsKKwlVMzIgVG90YWxMZW5ndGg7CisJVTMyIEhlYWRlckxlbmd0aDsKKwlVMzIgQ29ubmVjdGlvbk9mZnNldDsKKwlVMzIgQ29ubmVjdGlvbkxlbmd0aDsKKwlVMzIgSW5pdGlhdG9yT2Zmc2V0OworCVUzMiBJbml0aWF0b3JMZW5ndGg7CisJVTMyIFRhcmdldE9mZnNldDsKKwlVMzIgVGFyZ2V0TGVuZ3RoOworCVUzMiBDbGllbnRPZmZzZXQ7CisJVTMyIENsaWVudExlbmd0aDsKKwlVMzIgTmFtZU9mZnNldDsKKwlVMzIgTmFtZUxlbmd0aDsKKwlHVUlEIElkOworCVUzMiBSZXZpc2lvbjsKKwlVMzIgUmVzZXJ2ZWQ7CQkvKiBOYXR1cmFsIGFsaWdubWVudCAqLworfSBVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVI7CisKKyNlbmRpZgkJCQkvKiBfX0NPTlRST0xWTUNIQU5ORUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvZGlhZ2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9kaWFnY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzUxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvZGlhZ2NoYW5uZWwuaApAQCAtMCwwICsxLDQyNyBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKisrCisgKgorICogTW9kdWxlIE5hbWU6CisgKgorICogZGlhZ2NoYW5uZWwuaAorICoKKyAqIEFic3RyYWN0OgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEaWFnQ2hhbm5lbCBwcm90b2NvbC4gIFRoaXMgcHJvdG9jb2wgaXMgdXNlZCB0byBhaWQgaW4KKyAqIHByZXNlcnZpbmcgZXZlbnQgZGF0YSBzZW50IGJ5IGV4dGVybmFsIGFwcGxpY2F0aW9ucy4gIFRoaXMgcHJvdG9jb2wgcHJvdmlkZXMKKyAqIGEgcmVnaW9uIGZvciBldmVudCBkYXRhIHRvIHJlc2lkZSBpbi4gIFRoaXMgZGF0YSB3aWxsIGV2ZW50dWFsbHkgYmUgc2VudCB0bworICogdGhlIEJvb3QgUGFydGl0aW9uIHdoZXJlIGl0IHdpbGwgYmUgY29tbWl0dGVkIHRvIG1lbW9yeSBhbmQvb3IgZGlzay4gIFRoaXMKKyAqIGZpbGUgY29udGFpbnMgcGxhdGZvcm0taW5kZXBlbmRlbnQgZGF0YSB0aGF0IGNhbiBiZSBidWlsdCB1c2luZyBhbnkKKyAqIFN1cGVydmlzb3IgYnVpbGQgZW52aXJvbm1lbnQgKFdpbmRvd3MsIExpbnV4LCBFRkkpLgorICoKKyovCisKKyNpZm5kZWYgX0RJQUdfQ0hBTk5FTF9IXworI2RlZmluZSBfRElBR19DSEFOTkVMX0hfCisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKworLyoge0VFQTdBNTczLURCODItNDQ3Yy04NzE2LUVGQkVBQUFFNDg1OH0gKi8KKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsweGVlYTdhNTczLCAweGRiODIsIDB4NDQ3YywgXAorCQl7MHg4NywgMHgxNiwgMHhlZiwgMHhiZSwgMHhhYSwgMHhhZSwgMHg0OCwgMHg1OH0gfQorCitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYURpYWdDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0xfR1VJRDsKKworLyoge0U4NTBGOTY4LTMyNjMtNDQ4NC04Q0E1LTJBMzVEMDg3QTVBOH0gKi8KKyNkZWZpbmUgVUxUUkFfRElBR19ST09UX0NIQU5ORUxfUFJPVE9DT0xfR1VJRCBcCisJezB4ZTg1MGY5NjgsIDB4MzI2MywgMHg0NDg0LCBcCisJCXsweDhjLCAweGE1LCAweDJhLCAweDM1LCAweGQwLCAweDg3LCAweGE1LCAweGE4fSB9CisKKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSAgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUKKworLyogTXVzdCBpbmNyZW1lbnQgdGhpcyB3aGVuZXZlciB5b3UgaW5zZXJ0IG9yIGRlbGV0ZSBmaWVsZHMgd2l0aGluIHRoaXMgY2hhbm5lbAorKiBzdHJ1Y3QuICBBbHNvIGluY3JlbWVudCB3aGVuZXZlciB5b3UgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGZpZWxkcyB3aXRoaW4gdGhpcworKiBjaGFubmVsIHN0cnVjdCBzbyBhcyB0byBicmVhayBwcmUtZXhpc3Rpbmcgc29mdHdhcmUuICBOb3RlIHRoYXQgeW91IGNhbgorKiB1c3VhbGx5IGFkZCBmaWVsZHMgdG8gdGhlIEVORCBvZiB0aGUgY2hhbm5lbCBzdHJ1Y3Qgd2l0aE9VVCBuZWVkaW5nIHRvCisqIGluY3JlbWVudCB0aGlzLiAqLworI2RlZmluZSBVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEIDIKKworI2RlZmluZSBVTFRSQV9ESUFHX0NIQU5ORUxfT0tfQ0xJRU5UKHBDaGFubmVsLCBsb2dDdHgpCQkJXAorCShVTFRSQV9jaGVja19jaGFubmVsX2NsaWVudChwQ2hhbm5lbCwJCQkJXAorCQkJCSAgICBVbHRyYURpYWdDaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJkaWFnIiwJCQkJXAorCQkJCSAgICBzaXplb2YoVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MKSwgXAorCQkJCSAgICBVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklELCBcCisJCQkJICAgIFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9ESUFHX0NIQU5ORUxfT0tfU0VSVkVSKGFjdHVhbEJ5dGVzLCBsb2dDdHgpCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhRGlhZ0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgImRpYWciLAkJCQlcCisJCQkJICAgIHNpemVvZihVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCQkJICAgIGFjdHVhbEJ5dGVzLCBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIE1BWF9NT0RVTEVfTkFNRV9TSVpFIDEyOAkvKiBNYXhpbXVtIGxlbmd0aCBvZiBtb2R1bGUgbmFtZS4uLiAqLworI2RlZmluZSBNQVhfQURESVRJT05BTF9JTkZPX1NJWkUgMjU2CS8qIE1heGltdW0gbGVuZ3RoIG9mIGFueSBhZGRpdGlvbmFsIGluZm8KKwkJCQkJICogYWNjb21wYW55aW5nIGV2ZW50Li4uICovCisjZGVmaW5lIE1BWF9TVUJTWVNURU1TIDY0CS8qIE1heGltdW0gbnVtYmVyIG9mIHN1YnN5c3RlbXMgYWxsb3dlZCBpbgorCQkJCSAqIERpYWdDaGFubmVsLi4uICovCisjZGVmaW5lIExPV19TVUJTWVNURU1TIDMyCS8qIEhhbGYgb2YgTUFYX1NVQlNZU1RFTVMgdG8gYWxsb3cgNjQtYml0CisJCQkJICogbWF0aCAqLworI2RlZmluZSBTVUJTWVNURU1fREVCVUcgMAkvKiBTdGFuZGFyZCBzdWJzeXN0ZW0gZm9yIGRlYnVnIGV2ZW50cyAqLworI2RlZmluZSBTVUJTWVNURU1fREVGQVVMVCAxCS8qIERlZmF1bHQgc3Vic3lzdGVtIGZvciBsZWdhY3kgY2FsbHMgdG8KKwkJCQkgKiBSZXBvcnRFdmVudCAqLworCisvKiBmZXcgdXNlZnVsIHN1YnN5c3RlbSBtYXNrIHZhbHVlcyAqLworI2RlZmluZSBTVUJTWVNURU1fTUFTS19ERUJVRwkweDAxCS8qIFN0YW5kYXJkIHN1YnN5c3RlbSBmb3IgZGVidWcKKwkJCQkJICogZXZlbnRzICovCisjZGVmaW5lIFNVQlNZU1RFTV9NQVNLX0RFRkFVTFQgIDB4MDIJLyogRGVmYXVsdCBzdWJzeXN0ZW0gZm9yIGxlZ2FjeSBjYWxscyB0bworCQkJCQkgKiBSZXBvcnRFdmVudHMgKi8KKworLyogRXZlbnQgcGFyYW1ldGVyICJTZXZlcml0eSIgaXMgb3ZlcmxvYWRlZCB3aXRoIENhdXNlIGluIGJ5dGUgMiBhbmQgU2V2ZXJpdHkgaW4KKyAqIGJ5dGUgMCwgYnl0ZXMgMSBhbmQgMyBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU0VWRVJJVFlfTUFTSyAweDBGRgkvKiBtYXNrIG91dCBhbGwgYnV0IHRoZSBTZXZlcml0eSBpbiBieXRlIDAgKi8KKyNkZWZpbmUgQ0FVU0VfTUFTSyAweDBGRjAwMDAJLyogbWFzayBvdXQgYWxsIGJ1dCB0aGUgY2F1c2UgaW4gYnl0ZSAyICovCisjZGVmaW5lIENBVVNFX1NISUZUX0FNVCAxNgkvKiBzaGlmdCAyIGJ5dGVzIHRvIHBsYWNlIGl0IGluIGJ5dGUgMiAqLworCisvKiBTdWJzeXN0ZW1TZXZlcml0eUZpbHRlciAqLworI2RlZmluZSBTRVZFUklUWV9GSUxURVJfTUFTSyAweDBGIC8qIG1hc2sgb3V0IHRoZSBDYXVzZSBoYWxmLCBTZXZlcml0eUZpbHRlciBpcworCQkJCSAgICogaW4gdGhlIGxvd2VyIG5pYmJsZSAqLworI2RlZmluZSBDQVVTRV9GSUxURVJfTUFTSyAweEYwCS8qIG1hc2sgb3V0IHRoZSBTZXZlcml0eSBoYWxmLCBDYXVzZUZpbHRlciBpcyBpbgorCQkJCSAqIHRoZSB1cHBlciBuaWJibGUgKi8KKyNkZWZpbmUgQ0FVU0VfRklMVEVSX1NISUZUX0FNVAk0IC8qIHNoaWZ0IGFtb3VudCB0byBwbGFjZSBpdCBpbiBsb3dlciBvciB1cHBlcgorCQkJCSAgICogbmliYmxlICovCisKKy8qIENvcGllZCBmcm9tIEVGSSdzIEVGSV9USU1FIHN0cnVjdCBpbiBlZmlkZWYuaC4gIEVGSSBoZWFkZXJzIGFyZSBub3QgYWxsb3dlZAorKiBpbiBzb21lIG9mIHRoZSBTdXBlcnZpc29yIGFyZWFzLCBzdWNoIGFzIE1vbml0b3IsIHNvIGl0IGhhcyBiZWVuICJwb3J0ZWQiIGhlcmUKKyogZm9yIHVzZSBpbiBkaWFnbm9zdGljIGV2ZW50IHRpbWVzdGFtcHMuLi4gKi8KK3R5cGVkZWYgc3RydWN0IF9ESUFHX0VGSV9USU1FICB7CisJVTE2IFllYXI7CQkvKiAxOTk4IC0gMjBYWCAqLworCVU4IE1vbnRoOwkJLyogMSAtIDEyICovCisJVTggRGF5OwkJCS8qIDEgLSAzMSAqLworCVU4IEhvdXI7CQkvKiAwIC0gMjMgKi8KKwlVOCBNaW51dGU7CQkvKiAwIC0gNTkgKi8KKwlVOCBTZWNvbmQ7CQkvKiAwIC0gNTkgKi8KKwlVOCBQYWQxOworCVUzMiBOYW5vc2Vjb25kOwkvKiAwIC0gOTk5LCA5OTksIDk5OSAqLworCVMxNiBUaW1lWm9uZTsJCS8qIC0xNDQwIHRvIDE0NDAgb3IgMjA0NyAqLworCVU4IERheWxpZ2h0OworCVU4IFBhZDI7Cit9IERJQUdfRUZJX1RJTUU7CisKK3R5cGVkZWYgZW51bSAgeworCSBVTFRSQV9DT01QT05FTlRfR1VFU1QgPSAwLAorCSBVTFRSQV9DT01QT05FTlRfTU9OSVRPUiA9IDB4MDEsCisJIFVMVFJBX0NPTVBPTkVOVF9DQ00gPSAweDAyLAkvKiBDb21tb24gQ29udHJvbCBtb2R1bGUgKi8KKwkgLyogUkVTRVJWRUQgMHgwMyAtIDB4NyAqLworCisJIC8qIFVsdHJhdmlzb3IgQ29tcG9uZW50cyAqLworCSBVTFRSQV9DT01QT05FTlRfQk9PVCA9IDB4MDgsCisJIFVMVFJBX0NPTVBPTkVOVF9JRExFID0gMHgwOSwKKwkgVUxUUkFfQ09NUE9ORU5UX0NPTlRST0wgPSAweDBBLAorCSBVTFRSQV9DT01QT05FTlRfTE9HR0VSID0gMHgwQiwKKwkgVUxUUkFfQ09NUE9ORU5UX0FDUEkgPSAwWDBDLAorCSAvKiBSRVNFUlZFRCAweDBEIC0gMHgwRiAqLworCisJIC8qIHNQQVIgQ29tcG9uZW50cyAqLworCSBVTFRSQV9DT01QT05FTlRfQ09NTUFORCA9IDB4MTAsCisJIFVMVFJBX0NPTVBPTkVOVF9JT0RSSVZFUiA9IDB4MTEsCisJIFVMVFJBX0NPTVBPTkVOVF9DT05TT0xFID0gMHgxMiwKKwkgVUxUUkFfQ09NUE9ORU5UX09QRVJBVElPTlMgPSAweDEzLAorCSBVTFRSQV9DT01QT05FTlRfTUFOQUdFTUVOVCA9IDB4MTQsCisJIFVMVFJBX0NPTVBPTkVOVF9ESUFHID0gMHgxNSwKKwkgVUxUUkFfQ09NUE9ORU5UX0hXRElBRyA9IDB4MTYsCisJIFVMVFJBX0NPTVBPTkVOVF9QU0VSVklDRVMgPSAweDE3LAorCSBVTFRSQV9DT01QT05FTlRfUERJQUcgPSAweDE4CisJIC8qIFJFU0VSVkVEIDB4MTggLSAweDFGICovCit9IFVMVFJBX0NPTVBPTkVOVF9UWVBFUzsKKworLyogU3RydWN0dXJlOiBESUFHX0NIQU5ORUxfRVZFTlQgUHVycG9zZTogQ29udGFpbnMgYXR0cmlidXRlcyB0aGF0IG1ha2UgdXAgYW4KKyAqIGV2ZW50IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIERJQUdfQ0hBTk5FTCBtZW1vcnkuICBBdHRyaWJ1dGVzOiBFdmVudElkOiBJZCBvZgorICogdGhlIGRpYWdub3N0aWMgZXZlbnQgdG8gd3JpdGUgdG8gbWVtb3J5LiAgU2V2ZXJpdHk6IFNldmVyaXR5IG9mIHRoZSBldmVudAorICogKEVycm9yLCBJbmZvLCBldGMpLiAgTW9kdWxlTmFtZTogTW9kdWxlL2ZpbGUgbmFtZSB3aGVyZSBldmVudCBvcmlnaW5hdGVkLgorICogTGluZU51bWJlcjogTGluZSBudW1iZXIgaW4gbW9kdWxlIG5hbWUgd2hlcmUgZXZlbnQgb3JpZ2luYXRlZC4gIFRpbWVzdGFtcDoKKyAqIERhdGUvdGltZSB3aGVuIGV2ZW50IHdhcyByZWNlaXZlZCBieSBSZXBvcnRFdmVudCwgYW5kIHdyaXR0ZW4gdG8gRGlhZ0NoYW5uZWwuCisgKiBSZXNlcnZlZDogUGFkZGluZyB0byBhbGlnbiBzdHJ1Y3R1cmUgb24gYSA2NC1ieXRlIGNhY2hlIGxpbmUgYm91bmRhcnkuCisgKiBBZGRpdGlvbmFsSW5mbzogQXJyYXkgb2YgY2hhcmFjdGVycyBmb3IgYWRkaXRpb25hbCBldmVudCBpbmZvIChtYXkgYmUKKyAqIGVtcHR5KS4gICovCit0eXBlZGVmIHN0cnVjdCBfRElBR19DSEFOTkVMX0VWRU5UICB7CisJVTMyIEV2ZW50SWQ7CisJVTMyIFNldmVyaXR5OworCVU4IE1vZHVsZU5hbWVbTUFYX01PRFVMRV9OQU1FX1NJWkVdOworCVUzMiBMaW5lTnVtYmVyOworCURJQUdfRUZJX1RJTUUgVGltZXN0YW1wOwkvKiBTaXplID0gMTYgYnl0ZXMgKi8KKwlVMzIgUGFydGl0aW9uTnVtYmVyOwkvKiBGaWxsZWQgaW4gYnkgRGlhZyBTd2l0Y2ggYXMgcG9vbCBibG9ja3MgYXJlCisJCQkJICogZmlsbGVkICovCisJVTE2IFZpcnR1YWxQcm9jZXNzb3JOdW1iZXI7CisJVTE2IExvZ2ljYWxQcm9jZXNzb3JOdW1iZXI7CisJVTggQ29tcG9uZW50VHlwZTsJLyogVUxUUkFfQ09NUE9ORU5UX1RZUEVTICovCisJVTggU3Vic3lzdGVtOworCVUxNiBSZXNlcnZlZDA7CQkvKiBwYWQgdG8gVTY0IGFsaWdubWVudCAqLworCVUzMiBCbG9ja051bWJlcjsJLyogZmlsbGVkIGluIGJ5IERpYWdTd2l0Y2ggYXMgcG9vbCBibG9ja3MgYXJlCisJCQkJICogZmlsbGVkICovCisJVTMyIEJsb2NrTnVtYmVySGlnaDsKKwlVMzIgRXZlbnROdW1iZXI7CS8qIGZpbGxlZCBpbiBieSBEaWFnU3dpdGNoIGFzIHBvb2wgYmxvY2tzIGFyZQorCQkJCSAqIGZpbGxlZCAqLworCVUzMiBFdmVudE51bWJlckhpZ2g7CisKKwkvKiBUaGUgQmxvY2tOdW1iZXIgYW5kIEV2ZW50TnVtYmVyIGZpZWxkcyBhcmUgc2V0IG9ubHkgYnkgRGlhZ1N3aXRjaAorCSAqIGFuZCByZWZlcmVuY2VkIG9ubHkgYnkgV2luRGlhZ0Rpc3BsYXkgZm9ybWF0dGluZyB0b29sIGFzCisJICogYWRkaXRpb25hbCBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgT3RoZXIgdG9vbHMgaW5jbHVkaW5nCisJICogV2luRGlhZ0Rpc3BsYXkgY3VycmVudGx5IGlnbm9yZSB0aGVzZSAnUmVzZXJ2ZWQnIGJ5dGVzLiAqLworCVU4IFJlc2VydmVkWzhdOworCVU4IEFkZGl0aW9uYWxJbmZvW01BWF9BRERJVElPTkFMX0lORk9fU0laRV07CisKKwkvKiBOT1RFOiBDaGFuZ2VzdG8gRElBR19DSEFOTkVMX0VWRU5UIGdlbmVyYWxseSBuZWVkIHRvIGJlIHJlZmxlY3RlZCBpbgorCSAqIGV4aXN0aW5nIGNvcGllcyAqCisJICogLSBmb3IgQXBwT1MgYXQKKwkgKiBHdWVzdExpbnV4L3Zpc29yZGlhZ19lYXJseS9zdXBlcnZpc29yX2RpYWdjaGFubmVsLmggKgorCSAqIC0gZm9yIFdpbkRpYWdEaXNwbGF5IGF0CisJICogRUZJL1VsdHJhL1Rvb2xzL1dpbkRpYWdEaXNwbGF5L1dpbkRpYWdEaXNwbGF5L2RpYWdzdHJ1Y3QuaCAqLworfSBESUFHX0NIQU5ORUxfRVZFTlQ7CisKKy8qIExldmVscyBvZiBzZXZlcml0eSBmb3IgZGlhZ25vc3RpYyBldmVudHMsIGluIG9yZGVyIGZyb20gbG93ZXN0IHNldmVyaXR5IHRvCisqIGhpZ2hlc3QgKGkuZS4gZmF0YWwgZXJyb3JzIGFyZSB0aGUgbW9zdCBzZXZlcmUsIGFuZCBzaG91bGQgYWx3YXlzIGJlIGxvZ2dlZCwKKyogYnV0IGluZm8gZXZlbnRzIHJhcmVseSBuZWVkIHRvIGJlIGxvZ2dlZCBleGNlcHQgZHVyaW5nIGRlYnVnZ2luZykuICBUaGUgdmFsdWVzCisqIERJQUdfU0VWRVJJVFlfRU5VTV9CRUdJTiBhbmQgRElBR19TRVZFUklUWV9FTlVNX0VORCBhcmUgbm90IHZhbGlkIHNldmVyaXR5CisqIHZhbHVlcy4gIFRoZXkgZXhpc3QgbWVyZWx5IHRvIGRpbGluZWF0ZSB0aGUgbGlzdCwgc28gdGhhdCBmdXR1cmUgYWRkaXRpb25zCisqIHdvbid0IHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgZHJpdmVyIChpLmUuIHdoZW4gY2hlY2tpbmcgZm9yIG91dC1vZi1yYW5nZQorKiBzZXZlcml0aWVzIGluIFNldFNldmVyaXR5KS4gIFRoZSB2YWx1ZXMgRElBR19TRVZFUklUWV9PVkVSUklERSBhbmQKKyogRElBR19TRVZFUklUWV9TSFVUT0ZGIGFyZSBub3QgdmFsaWQgc2V2ZXJpdHkgdmFsdWVzIGZvciBsb2dnaW5nIGV2ZW50cyBidXQKKyogdGhleSBhcmUgdmFsaWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhbW91bnQgb2YgZXZlbnQgZGF0YS4gIFRoaXMgZW51bSBpcyBhbHNvCisqIGRlZmluZWQgaW4gRG90TmV0XHNQYXJGcmFtZXdvcmtcQ29udHJvbEZyYW1ld29ya1xDb250cm9sRnJhbWV3b3JrLmNzLiAgSWYgYQorKiBjaGFuZ2UgaXMgbWFkZSB0byB0aGlzIGVudW0sIHRoZXkgc2hvdWxkIGFsc28gYmUgcmVmbGVjdGVkIGluIHRoYXQgZmlsZS4gICovCit0eXBlZGVmIGVudW0gIHsgRElBR19TRVZFUklUWV9FTlVNX0JFR0lOID0gMCwKKwkJRElBR19TRVZFUklUWV9PVkVSUklERSA9IERJQUdfU0VWRVJJVFlfRU5VTV9CRUdJTiwKKwkJRElBR19TRVZFUklUWV9WRVJCT1NFID0gRElBR19TRVZFUklUWV9PVkVSUklERSwJLyogMCAqLworCQlESUFHX1NFVkVSSVRZX0lORk8gPSBESUFHX1NFVkVSSVRZX1ZFUkJPU0UgKyAxLAkvKiAxICovCisJCURJQUdfU0VWRVJJVFlfV0FSTklORyA9IERJQUdfU0VWRVJJVFlfSU5GTyArIDEsCS8qIDIgKi8KKwkJRElBR19TRVZFUklUWV9FUlIgPSBESUFHX1NFVkVSSVRZX1dBUk5JTkcgKyAxLAkvKiAzICovCisJCURJQUdfU0VWRVJJVFlfUFJJTlQgPSBESUFHX1NFVkVSSVRZX0VSUiArIDEsCS8qIDQgKi8KKwkJRElBR19TRVZFUklUWV9TSFVUT0ZGID0gRElBR19TRVZFUklUWV9QUklOVCArIDEsIC8qIDUgKi8KKwkJRElBR19TRVZFUklUWV9FTlVNX0VORCA9IERJQUdfU0VWRVJJVFlfU0hVVE9GRiwJLyogNSAqLworCQlESUFHX1NFVkVSSVRZX05PTkZBVEFMX0VSUiA9IERJQUdfU0VWRVJJVFlfRVJSLAorCQlESUFHX1NFVkVSSVRZX0ZBVEFMX0VSUiA9IERJQUdfU0VWRVJJVFlfUFJJTlQKK30gRElBR19TRVZFUklUWTsKKworLyogRXZlbnQgQ2F1c2UgZW51bXMKKyoKKyogTGV2ZWxzIG9mIGNhdXNlIGZvciBkaWFnbm9zdGljIGV2ZW50cywgaW4gb3JkZXIgZnJvbSBsZWFzdCB0byBncmVhdGVzdCBjYXVzZQorKiBJbnRlcm5hbCBlcnJvcnMgYXJlIG1vc3QgdXJnZW50IHNpbmNlIGlkZWFsbHkgdGhleSBzaG91bGQgbmV2ZXIgZXhpc3QKKyogSW52YWxpZCByZXF1ZXN0cyBhcmUgcHJldmVudGFibGUgYnkgYXZvaWRpbmcgaW52YWxpZCBpbnB1dHMKKyogT3BlcmF0aW9ucyBlcnJvcnMgZGVwZW5kIG9uIGVudmlyb25tZW50YWwgZmFjdG9ycyB3aGljaCBtYXkgaW1wYWN0IHdoaWNoCisqIHJlcXVlc3RzIGFyZSBwb3NzaWJsZQorKiBNYW5pZmVzdCBwcm92aWRlcyBpbnRlcm1lZGlhdGUgdmFsdWUgdG8gY2FwdHVyZSBmaXJtd2FyZSBhbmQgY29uZmlndXJhdGlvbgorKiB2ZXJzaW9uIGluZm9ybWF0aW9uCisqIFRyYWNlIHByb3ZpZGVzIHN1cGxpbWVudGFsIGRlYnVnIGluZm9ybWF0aW9uIGluIHJlbGVhc2UgZmlybXdhcmUKKyogVW5rbm93biBMb2cgY2FwdHVyZXMgdW5jbGFzaWZpZWQgTG9nRXZlbnQgY2FsbHMuCisqIERlYnVnIGlzIHRoZSBsZWFzdCB1cmdlbnQgc2luY2UgaXQgcHJvdmlkZXMgc3VwbGltZW50YWwgZGVidWcgaW5mb3JtYXRpb24gb25seQorKiBpbiBkZWJ1ZyBmaXJtd2FyZQorKiBVbmtub3duIERlYnVnIGNhcHR1cmVzIHVuY2xhc3NpZmllZCBEZWJ1Z0V2ZW50IGNhbGxzLgorKiBUaGlzIGVudW0gaXMgYWxzbyBkZWZpbmVkIGluCisqIERvdE5ldFxzUGFyRnJhbWV3b3JrXENvbnRyb2xGcmFtZXdvcmtcQ29udHJvbEZyYW1ld29yay5jcy4KKyogSWYgYSBjaGFuZ2UgaXMgbWFkZSB0byB0aGlzIGVudW0sIHRoZXkgc2hvdWxkIGFsc28gYmUgcmVmbGVjdGVkIGluIHRoYXQKKyogZmlsZS4gICovCisKKworCisvKiBBIGNhdXNlIHZhbHVlICJESUFHX0NBVVNFX0ZJTEVfWEZFUiIgdG9nZXRoZXIgd2l0aCBhIHNldmVyaXR5IHZhbHVlIG9mCisqICJESUFHX1NFVkVSSVRZX1BSSU5UIiAoPTQpLCBpcyB1c2VkIGZvciB0cmFuc2ZlcnJpbmcgdGV4dCBvciBiaW5hcnkgZmlsZSB0bworKiB0aGUgRGlhZyBwYXJ0aXRpb24uIFRoaXMgY2F1c2Utc2V2ZXJpdHkgY29tYmluYXRpb24gd2lsbCBiZSB1c2VkIGJ5IExvZ2dlcgorKiBEaWFnU3dpdGNoIHRvIHNlZ3JlZ2F0ZSBldmVudHMgaW50byBibG9jayB0eXBlcy4gVGhlIGZpbGVzIGFyZSB0cmFuc2ZlcnJlZCBpbgorKiAyNTYgYnl0ZSBjaHVua3MgbWF4aW11bSwgaW4gdGhlIEFkZGl0aW9uYWxJbmZvIGZpZWxkIG9mIHRoZSBESUFHX0NIQU5ORUxfRVZFTlQKKyogc3RydWN0dXJlLiBJbiB0aGUgZmlsZSB0cmFuc2ZlciBtb2RlLCBzb21lIGV2ZW50IGZpZWxkcyB3aWxsIGhhdmUgZGlmZmVyZW50CisqIG1lYW5pbmc6IEV2ZW50SWQgc3BlY2lmaWVzIHRoZSBmaWxlIG9mZnNldCwgc2V2ZXJpdHkgc3BlY2lmaWVzIHRoZSBibG9jayB0eXBlLAorKiBNb2R1bGVOYW1lIHNwZWNpZmllcyB0aGUgZmlsZW5hbWUsIExpbmVOdW1iZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdmFsaWQKKyogZGF0YSBieXRlcyBpbiBhbiBldmVudCBhbmQgQWRkaXRpb25hbEluZm8gY29udGFpbnMgdXAgdG8gMjU2IGJ5dGVzIG9mIGRhdGEuICovCisKKy8qIFRoZSBEaWFnIERpYWdXcml0ZXIgYXBwZW5kcyBldmVudCBibG9ja3MgdG8gZXZlbnRzLnJhdyBhcyB0b2RheSwgYW5kIGZvciBkYXRhCisgKiBibG9ja3MgdXNlcyBESUFHX0NIQU5ORUxfRVZFTlQKKyAqIFBhcnRpdGlvbk51bWJlciB0byBleHRyYWN0IGFuZCBhcHBlbmQgJ0FkZGl0aW9uYWxJbmZvJyB0byBmaWxlbmFtZSAoc3BlY2lmaWVkCisgKiBieSBNb2R1bGVOYW1lKS4gKi8KKworLyogVGhlIERlbGwgUERpYWcgdXNlcyB0aGlzIG5ldyBtZWNoYW5pc20gdG8gc3Rhc2ggRFNFVCAuemlwIG9udG8gdGhlCisgKiAnZGlhZ25vc3RpYycgdmlydHVhbCBkaXNrLiAgKi8KK3R5cGVkZWYgZW51bSAgeworCURJQUdfQ0FVU0VfVU5LTk9XTiA9IDAsCisJRElBR19DQVVTRV9VTktOT1dOX0RFQlVHID0gRElBR19DQVVTRV9VTktOT1dOICsgMSwJLyogMSAqLworCURJQUdfQ0FVU0VfREVCVUcgPSBESUFHX0NBVVNFX1VOS05PV05fREVCVUcgKyAxLAkvKiAyICovCisJRElBR19DQVVTRV9VTktOT1dOX0xPRyA9IERJQUdfQ0FVU0VfREVCVUcgKyAxLAkvKiAzICovCisJRElBR19DQVVTRV9UUkFDRSA9IERJQUdfQ0FVU0VfVU5LTk9XTl9MT0cgKyAxLAkvKiA0ICovCisJRElBR19DQVVTRV9NQU5JRkVTVCA9IERJQUdfQ0FVU0VfVFJBQ0UgKyAxLAkvKiA1ICovCisJRElBR19DQVVTRV9PUEVSQVRJT05TX0VSUk9SID0gRElBR19DQVVTRV9NQU5JRkVTVCArIDEsCS8qIDYgKi8KKwlESUFHX0NBVVNFX0lOVkFMSURfUkVRVUVTVCA9IERJQUdfQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiArIDEsCS8qIDcgKi8KKwlESUFHX0NBVVNFX0lOVEVSTkFMX0VSUk9SID0gRElBR19DQVVTRV9JTlZBTElEX1JFUVVFU1QgKyAxLCAvKiA4ICovCisJRElBR19DQVVTRV9GSUxFX1hGRVIgPSBESUFHX0NBVVNFX0lOVEVSTkFMX0VSUk9SICsgMSwJLyogOSAqLworCURJQUdfQ0FVU0VfRU5VTV9FTkQgPSBESUFHX0NBVVNFX0ZJTEVfWEZFUgkvKiA5ICovCit9IERJQUdfQ0FVU0U7CisKKy8qIEV2ZW50IENhdXNlIGNhdGVnb3J5IGRlZmluZWQgaW50byB0aGUgYnl0ZSAyIG9mIFNldmVyaXR5ICovCisjZGVmaW5lIENBVVNFX0RFQlVHIChESUFHX0NBVVNFX0RFQlVHIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfVFJBQ0UgKERJQUdfQ0FVU0VfVFJBQ0UgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9NQU5JRkVTVCAoRElBR19DQVVTRV9NQU5JRkVTVCA8PCBDQVVTRV9TSElGVF9BTVQpCisjZGVmaW5lIENBVVNFX09QRVJBVElPTlNfRVJST1IgKERJQUdfQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiA8PCBDQVVTRV9TSElGVF9BTVQpCisjZGVmaW5lIENBVVNFX0lOVkFMSURfUkVRVUVTVCAoRElBR19DQVVTRV9JTlZBTElEX1JFUVVFU1QgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9FUlJPUiAoRElBR19DQVVTRV9JTlRFUk5BTF9FUlJPUiA8PCBDQVVTRV9TSElGVF9BTVQpCisjZGVmaW5lIENBVVNFX0ZJTEVfWEZFUiAoRElBR19DQVVTRV9GSUxFX1hGRVIgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9FTlVNX0VORCBDQVVTRV9GSUxFX1hGRVIKKworLyogQ29tYmluZSBDYXVzZSBhbmQgU2V2ZXJpdHkgY2F0ZWdvcmllcyBpbnRvIG9uZSAqLworI2RlZmluZSBDQVVTRV9ERUJVR19TRVZFUklUWV9WRVJCT1NFIFwKKwkoQ0FVU0VfREVCVUcgfCBESUFHX1NFVkVSSVRZX1ZFUkJPU0UpCisjZGVmaW5lIENBVVNFX1RSQUNFX1NFVkVSSVRZX1ZFUkJPU0UgXAorCShDQVVTRV9UUkFDRSB8IERJQUdfU0VWRVJJVFlfVkVSQk9TRSkKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1RfU0VWRVJJVFlfVkVSQk9TRVwKKwkoQ0FVU0VfTUFOSUZFU1QgfCBESUFHX1NFVkVSSVRZX1ZFUkJPU0UpCisjZGVmaW5lIENBVVNFX09QRVJBVElPTlNfU0VWRVJJVFlfVkVSQk9TRSBcCisJKENBVVNFX09QRVJBVElPTlNfRVJST1IgfCBESUFHX1NFVkVSSVRZX1ZFUkJPU0UpCisjZGVmaW5lIENBVVNFX0lOVkFMSURfU0VWRVJJVFlfVkVSQk9TRSBcCisJKENBVVNFX0lOVkFMSURfUkVRVUVTVCAgfCBESUFHX1NFVkVSSVRZX1ZFUkJPU0UpCisjZGVmaW5lIENBVVNFX0lOVEVSTkFMX1NFVkVSSVRZX1ZFUkJPU0UgXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiAgIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorCisjZGVmaW5lIENBVVNFX0RFQlVHX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9ERUJVRyB8IERJQUdfU0VWRVJJVFlfSU5GTykKKyNkZWZpbmUgQ0FVU0VfVFJBQ0VfU0VWRVJJVFlfSU5GTyBcCisJKENBVVNFX1RSQUNFIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9NQU5JRkVTVF9TRVZFUklUWV9JTkZPIFwKKwkoQ0FVU0VfTUFOSUZFU1QgfCBESUFHX1NFVkVSSVRZX0lORk8pCisjZGVmaW5lIENBVVNFX09QRVJBVElPTlNfU0VWRVJJVFlfSU5GTyBcCisJKENBVVNFX09QRVJBVElPTlNfRVJST1IgfCBESUFHX1NFVkVSSVRZX0lORk8pCisjZGVmaW5lIENBVVNFX0lOVkFMSURfU0VWRVJJVFlfSU5GTyBcCisJKENBVVNFX0lOVkFMSURfUkVRVUVTVCAgfCBESUFHX1NFVkVSSVRZX0lORk8pCisjZGVmaW5lIENBVVNFX0lOVEVSTkFMX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiB8IERJQUdfU0VWRVJJVFlfSU5GTykKKworI2RlZmluZSBDQVVTRV9ERUJVR19TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfREVCVUcgfCBESUFHX1NFVkVSSVRZX1dBUk5JTkcpCisjZGVmaW5lIENBVVNFX1RSQUNFX1NFVkVSSVRZX1dBUk4gXAorCShDQVVTRV9UUkFDRSB8IERJQUdfU0VWRVJJVFlfV0FSTklORykKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1RfU0VWRVJJVFlfV0FSTiBcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9XQVJOSU5HKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX1dBUk4gXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9XQVJOSU5HKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX1dBUk4gXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgfCBESUFHX1NFVkVSSVRZX1dBUk5JTkcpCisjZGVmaW5lIENBVVNFX0lOVEVSTkFMX1NFVkVSSVRZX1dBUk4gXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiB8IERJQUdfU0VWRVJJVFlfV0FSTklORykKKworI2RlZmluZSBDQVVTRV9ERUJVR19TRVZFUklUWV9FUlIgXAorCShDQVVTRV9ERUJVRyB8IERJQUdfU0VWRVJJVFlfRVJSKQorI2RlZmluZSBDQVVTRV9UUkFDRV9TRVZFUklUWV9FUlIgXAorCShDQVVTRV9UUkFDRSB8IERJQUdfU0VWRVJJVFlfRVJSKQorI2RlZmluZSBDQVVTRV9NQU5JRkVTVF9TRVZFUklUWV9FUlIgXAorCShDQVVTRV9NQU5JRkVTVCB8IERJQUdfU0VWRVJJVFlfRVJSKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX0VSUiBcCisJKENBVVNFX09QRVJBVElPTlNfRVJST1IgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfSU5WQUxJRF9TRVZFUklUWV9FUlIgXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgIHwgRElBR19TRVZFUklUWV9FUlIpCisjZGVmaW5lIENBVVNFX0lOVEVSTkFMX1NFVkVSSVRZX0VSUiBcCisJKENBVVNFX0lOVEVSTkFMX0VSUk9SICAgfCBESUFHX1NFVkVSSVRZX0VSUikKKworI2RlZmluZSBDQVVTRV9ERUJVR19TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX0RFQlVHIHwgRElBR19TRVZFUklUWV9QUklOVCkKKyNkZWZpbmUgQ0FVU0VfVFJBQ0VfU0VWRVJJVFlfUFJJTlQgXAorCShDQVVTRV9UUkFDRSB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisjZGVmaW5lIENBVVNFX01BTklGRVNUX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfTUFOSUZFU1QgfCBESUFHX1NFVkVSSVRZX1BSSU5UKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisjZGVmaW5lIENBVVNFX0lOVkFMSURfU0VWRVJJVFlfUFJJTlQgXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgfCBESUFHX1NFVkVSSVRZX1BSSU5UKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX0lOVEVSTkFMX0VSUk9SIHwgRElBR19TRVZFUklUWV9QUklOVCkKKyNkZWZpbmUgQ0FVU0VfRklMRV9YRkVSX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfRklMRV9YRkVSIHwgRElBR19TRVZFUklUWV9QUklOVCkKKworLyogU3RydWN0dXJlOiBESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSCisgKgorICogUHVycG9zZTogQ29udGFpbnMgYXR0cmlidXRlcyB0aGF0IG1ha2UgdXAgdGhlIGhlYWRlciBzcGVjaWZpYyB0byB0aGUKKyAqIERJQUdfQ0hBTk5FTCBhcmVhLgorICoKKyAqIEF0dHJpYnV0ZXM6CisgKgorICogRGlhZ0xvY2s6IERpYWcgQ2hhbm5lbCBzcGlubG9jay4KKyAqCisgKklzQ2hhbm5lbEluaXRpYWxpemVkOiAxIGlmZiBTaWduYWxJbml0IHdhcyBjYWxsZWQgZm9yIHRoaXMgY2hhbm5lbDsgb3RoZXJ3aXNlCisgKgkJCTAsIGFuZCBhc3N1bWUgdGhlIGNoYW5uZWwgaXMgbm90IHJlYWR5IGZvciB1c2UgeWV0LgorICoKKyAqIFJlc2VydmVkOiBQYWRkaW5nIHRvIGFsbGlnbiB0aGUgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlLgorICoKKyAqU3Vic3lzdGVtU2V2ZXJpdHlGaWx0ZXI6IExldmVsIG9mIHNldmVyaXR5IG9uIGEgc3Vic3lzdGVtIGJhc2lzIHRoYXQgY29udHJvbHMKKyAqCQkJd2hldGhlciBldmVudHMgYXJlIGxvZ2dlZC4gIEFueSBldmVudCdzIHNldmVyaXR5IGZvciBhCisgKgkJCXBhcnRpY3VsYXIgc3Vic3lzdGVtIGJlbG93IHRoaXMgbGV2ZWwgd2lsbCBiZSBkaXNjYXJkZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9ESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSICB7CisJdm9sYXRpbGUgVTMyIERpYWdMb2NrOworCVU4IElzQ2hhbm5lbEluaXRpYWxpemVkOworCVU4IFJlc2VydmVkWzNdOworCVU4IFN1YnN5c3RlbVNldmVyaXR5RmlsdGVyWzY0XTsKK30gRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUjsKKworLyogVGhlIERpYWdyYW0gZm9yIHRoZSBEaWFnbm9zdGljIENoYW5uZWw6ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogfCBDaGFubmVsIEhlYWRlciAgICAgICAgfAlEZWZpbmVkIGJ5IFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB8IFNpZ25hbCBRdWV1ZSBIZWFkZXIgICB8CURlZmluZWQgYnkgU0lHTkFMX1FVRVVFX0hFQURFUiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgRGlhZ0NoYW5uZWwgSGVhZGVyICAgIHwJRGVmaW5lZCBieSBESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogfCBDaGFubmVsIEV2ZW50IEluZm8gICAgfAlEZWZpbmVkIGJ5IChESUFHX0NIQU5ORUxfRVZFTlQgKiBNQVhfRVZFTlRTKSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgUmVzZXJ2ZWQgICAgICAgICAgICAgIHwJUmVzZXJ2ZWQgKHBhZCBvdXQgdG8gNE1CKSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogT2Zmc2V0cy9zaXplcyBmb3IgZGlhZ25vc3RpYyBjaGFubmVsIGF0dHJpYnV0ZXMuLi4gKi8KKyNkZWZpbmUgRElBR19DSF9RVUVVRV9IRUFERVJfT0ZGU0VUIChzaXplb2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCkpCisjZGVmaW5lIERJQUdfQ0hfUVVFVUVfSEVBREVSX1NJWkUgKHNpemVvZihTSUdOQUxfUVVFVUVfSEVBREVSKSkKKyNkZWZpbmUgRElBR19DSF9QUk9UT0NPTF9IRUFERVJfT0ZGU0VUIFwKKwkoRElBR19DSF9RVUVVRV9IRUFERVJfT0ZGU0VUICsgRElBR19DSF9RVUVVRV9IRUFERVJfU0laRSkKKyNkZWZpbmUgRElBR19DSF9QUk9UT0NPTF9IRUFERVJfU0laRSAoc2l6ZW9mKERJQUdfQ0hBTk5FTF9QUk9UT0NPTF9IRUFERVIpKQorI2RlZmluZSBESUFHX0NIX0VWRU5UX09GRlNFVCBcCisJKERJQUdfQ0hfUFJPVE9DT0xfSEVBREVSX09GRlNFVCArIERJQUdfQ0hfUFJPVE9DT0xfSEVBREVSX1NJWkUpCisjZGVmaW5lIERJQUdfQ0hfU0laRSAoNDA5NiAqIDEwMjQpCisKKy8qIEZvciBDb250cm9sIGFuZCBJZGxlIFBhcnRpdGlvbnMgd2l0aCBsYXJnZXIgKDggTUIpIGRpYWdub3N0aWMocm9vdCkKKyAqIGNoYW5uZWxzICovCisjZGVmaW5lIERJQUdfQ0hfTFJHX1NJWkUgKDIgKiBESUFHX0NIX1NJWkUpCS8qIDggTUIgKi8KKworLyoKKyAqIFN0cnVjdHVyZTogVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MCisgKgorICogUHVycG9zZTogQ29udGFpbnMgYXR0cmlidXRlcyB0aGF0IG1ha2UgdXAgdGhlIERJQUdfQ0hBTk5FTCBtZW1vcnkuCisgKgorICogQXR0cmlidXRlczoKKyAqCisgKiBDb21tb25DaGFubmVsSGVhZGVyOglIZWFkZXIgaW5mbyBjb21tb24gdG8gYWxsIGNoYW5uZWxzLgorICoKKyAqIFF1ZXVlSGVhZGVyOiBRdWV1ZSBoZWFkZXIgY29tbW9uIHRvIGFsbCBjaGFubmVscyAtIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvCisgKiBzdG9yZSBldmVudC4KKyAqCisgKiBEaWFnQ2hhbm5lbEhlYWRlcjogRGlhZ25vc3RpYyBjaGFubmVsIGhlYWRlciBpbmZvIChzZWUKKyAqIERJQUdfQ0hBTk5FTF9QUk9UT0NPTF9IRUFERVIgY29tbWVudHMpLgorICoKKyAqIEV2ZW50czogQXJlYSB3aGVyZSBkaWFnbm9zdGljIGV2ZW50cyAodXAgdG8gTUFYX0VWRU5UUykgYXJlIHdyaXR0ZW4uCisgKgorICpSZXNlcnZlZDogUmVzZXJ2ZWQgYXJlYSB0byBhbGxvdyBmb3IgY29ycmVjdCBjaGFubmVsIHNpemUgcGFkZGluZy4KKyovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MICB7CisJVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCBDb21tb25DaGFubmVsSGVhZGVyOworCVNJR05BTF9RVUVVRV9IRUFERVIgUXVldWVIZWFkZXI7CisJRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUiBEaWFnQ2hhbm5lbEhlYWRlcjsKKwlESUFHX0NIQU5ORUxfRVZFTlQgRXZlbnRzWyhESUFHX0NIX1NJWkUgLSBESUFHX0NIX0VWRU5UX09GRlNFVCkgLworCQkJCSAgIHNpemVvZihESUFHX0NIQU5ORUxfRVZFTlQpXTsKK30KK1VMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvaW9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvaW9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlMWQyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9pb2NoYW5uZWwuaApAQCAtMCwwICsxLDkzMyBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OICovCisvKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAqLworI2lmbmRlZiBfX0lPQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19JT0NIQU5ORUxfSF9fCisKKy8qCisqIEV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBJT1BhcnQtR3Vlc3RQYXJ0IGNvbW11bmljYXRpb24gaXMgZGVmaW5lIGluCisqIHRoaXMgZmlsZS4gIE5vdGU6IEV2ZXJ5dGhpbmcgaXMgT1MtaW5kZXBlbmRlbnQgYmVjYXVzZSB0aGlzIGZpbGUgaXMKKyogdXNlZCBieSBXaW5kb3dzLCBMaW51eCBhbmQgcG9zc2libGUgRUZJIGRyaXZlcnMuICAqLworCisKKy8qCisqIENvbW11bmljYXRpb24gZmxvdyBiZXR3ZWVuIHRoZSBJT1BhcnQgYW5kIEd1ZXN0UGFydCB1c2VzIHRoZSBjaGFubmVsIGhlYWRlcnMKKyogY2hhbm5lbCBzdGF0ZS4gIFRoZSBmb2xsb3dpbmcgc3RhdGVzIGFyZSBjdXJyZW50bHkgYmVpbmcgdXNlZDoKKyogICAgICAgVU5JTklUKEFsbCBaZXJvZXMpLCBDSEFOTkVMX0FUVEFDSElORywgQ0hBTk5FTF9BVFRBQ0hFRCwgQ0hBTk5FTF9PUEVORUQKKyoKKyogYWRkaXRpb25hbCBzdGF0ZXMgd2lsbCBiZSB1c2VkIGxhdGVyLiAgTm8gbG9ja2luZyBpcyBuZWVkZWQgdG8gc3dpdGNoIGJldHdlZW4KKyogc3RhdGVzIGR1ZSB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorKgorKiAgICAgIDEuICBJT1BhcnQgaXMgb25seSB0aGUgb25seSBwYXJ0aXRpb24gYWxsb3dlZCB0byBjaGFuZ2UgZnJvbSBVTklUCisqICAgICAgMi4gIElPUGFydCBpcyBvbmx5IHRoZSBvbmx5IHBhcnRpdGlvbiBhbGxvd2VkIHRvIGNoYW5nZSBmcm9tCisqCQlDSEFOTkVMX0FUVEFDSElORworKiAgICAgIDMuICBHdWVzdFBhcnQgaXMgb25seSB0aGUgb25seSBwYXJ0aXRpb24gYWxsb3dlZCB0byBjaGFuZ2UgZnJvbQorKgkJQ0hBTk5FTF9BVFRBQ0hFRAorKgorKiBUaGUgc3RhdGUgY2hhbmdlcyBhcmUgdGhlIGZvbGxvd2luZzogSU9QYXJ0IHNlZXMgdGhlIGNoYW5uZWwgaXMgaW4gVU5JTklULAorKiAgICAgICAgVU5JTklUIC0+IENIQU5ORUxfQVRUQUNISU5HIChwZXJmb3JtZWQgb25seSBieSBJT1BhcnQpCisqICAgICAgICBDSEFOTkVMX0FUVEFDSElORyAtPiBDSEFOTkVMX0FUVEFDSEVEIChwZXJmb3JtZWQgb25seSBieSBJT1BhcnQpCisqICAgICAgICBDSEFOTkVMX0FUVEFDSEVEIC0+IENIQU5ORUxfT1BFTkVEIChwZXJmb3JtZWQgb25seSBieSBHdWVzdFBhcnQpCisqLworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJ2bWNhbGxpbnRlcmZhY2UuaCIKKworI2RlZmluZSBfVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfSU5MSU5FXworI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJlY3Rpb24uaD4KKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisjaW5jbHVkZSAidmJ1c2NoYW5uZWwuaCIKKyN1bmRlZiBfVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfSU5MSU5FXworI2luY2x1ZGUgImNoYW5uZWwuaCIKKworLyoKKyAqIENIQU5ORUwgR3VpZHMKKyAqLworCisjaW5jbHVkZSAiY2hhbm5lbF9ndWlkLmgiCisKKyNkZWZpbmUgVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorI2RlZmluZSBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgXAorCVVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisKKy8qIE11c3QgaW5jcmVtZW50IHRoZXNlIHdoZW5ldmVyIHlvdSBpbnNlcnQgb3IgZGVsZXRlIGZpZWxkcyB3aXRoaW4gdGhpcyBjaGFubmVsCisqIHN0cnVjdC4gIEFsc28gaW5jcmVtZW50IHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgZmllbGRzIHdpdGhpbiB0aGlzCisqIGNoYW5uZWwgc3RydWN0IHNvIGFzIHRvIGJyZWFrIHByZS1leGlzdGluZyBzb2Z0d2FyZS4gIE5vdGUgdGhhdCB5b3UgY2FuCisqIHVzdWFsbHkgYWRkIGZpZWxkcyB0byB0aGUgRU5EIG9mIHRoZSBjaGFubmVsIHN0cnVjdCB3aXRoT1VUIG5lZWRpbmcgdG8KKyogaW5jcmVtZW50IHRoaXMuICovCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQgMgorI2RlZmluZSBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEIDIKKyNkZWZpbmUgVUxUUkFfVlNXSVRDSF9DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAxCisKKyNkZWZpbmUgVUxUUkFfVkhCQV9DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KQkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsIFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJCQkgICAgInZoYmEiLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLAlcCisJCQkJICAgIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsIFwKKwkJCQkgICAgVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9PS19TRVJWRVIoYWN0dWFsQnl0ZXMsIGxvZ0N0eCkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZCwJXAorCQkJCSAgICAidmhiYSIsIE1JTl9JT19DSEFOTkVMX1NJWkUsIGFjdHVhbEJ5dGVzLCBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKyNkZWZpbmUgVUxUUkFfVk5JQ19DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KQkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsIFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJCQkgICAgInZuaWMiLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLAlcCisJCQkJICAgIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsIFwKKwkJCQkgICAgVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9PS19TRVJWRVIoYWN0dWFsQnl0ZXMsIGxvZ0N0eCkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCwJXAorCQkJCSAgICAidm5pYyIsIE1JTl9JT19DSEFOTkVMX1NJWkUsIGFjdHVhbEJ5dGVzLCBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKyNkZWZpbmUgVUxUUkFfVlNXSVRDSF9DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KQkJXAorCShVTFRSQV9jaGVja19jaGFubmVsX2NsaWVudChwQ2hhbm5lbCwgVWx0cmFWc3dpdGNoQ2hhbm5lbFByb3RvY29sR3VpZCwgXAorCQkJCSAgICAidnN3aXRjaCIsIE1JTl9JT19DSEFOTkVMX1NJWkUsCVwKKwkJCQkgICAgVUxUUkFfVlNXSVRDSF9DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwgXAorCQkJCSAgICBVTFRSQV9WU1dJVENIX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFLCBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKyNkZWZpbmUgVUxUUkFfVlNXSVRDSF9DSEFOTkVMX09LX1NFUlZFUihhY3R1YWxCeXRlcywgbG9nQ3R4KSAgICAgICAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVnN3aXRjaENoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZzd2l0Y2giLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLAlcCisJCQkJICAgIGFjdHVhbEJ5dGVzLAkJICAgIFwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorLyoKKyogRXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gaGFuZGxlIFNDU0kgJiBOSUMgdHJhZmZpYyBiZXR3ZWVuIEd1ZXN0IFBhcnRpdGlvbiBhbmQKKyogSU8gUGFydGl0aW9uIGlzIGRlZmluZWQgYmVsb3cuICAqLworCisKKy8qCisqIERlZmluZXMgYW5kIGVudW1zLgorKi8KKworI2RlZmluZSBNSU5OVU0oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBNQVhOVU0oYSwgYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorCisvKiB0aGVzZSBkZWZpbmUgdGhlIHR3byBxdWV1ZXMgcGVyIGRhdGEgY2hhbm5lbCBiZXR3ZWVuIGlvcGFydCBhbmQKKyAqIGlvZ3Vlc3RwYXJ0cyAqLworI2RlZmluZSBJT0NIQU5fVE9fSU9QQVJUIDAgLyogdXNlZCBieSBpb2d1ZXN0cGFydCB0byAnaW5zZXJ0JyBzaWduYWxzIHRvCisJCQkgICAgKiBpb3BhcnQgKi8KKyNkZWZpbmUgSU9DSEFOX0ZST01fR1VFU1RQQVJUIDAgLyogdXNlZCBieSBpb3BhcnQgdG8gJ3JlbW92ZScgc2lnbmFscyBmcm9tCisJCQkJICogaW9ndWVzdHBhcnQgLSBzYW1lIHF1ZXVlIGFzIHByZXZpb3VzIHF1ZXVlICovCisKKyNkZWZpbmUgSU9DSEFOX1RPX0dVRVNUUEFSVCAxIC8qIHVzZWQgYnkgaW9wYXJ0IHRvICdpbnNlcnQnIHNpZ25hbHMgdG8KKwkJCSAgICAgICAqIGlvZ3Vlc3RwYXJ0ICovCisjZGVmaW5lIElPQ0hBTl9GUk9NX0lPUEFSVCAxIC8qIHVzZWQgYnkgaW9ndWVzdHBhcnQgdG8gJ3JlbW92ZScgc2lnbmFscyBmcm9tCisJCQkgICAgICAqIGlvcGFydCAtIHNhbWUgcXVldWUgYXMgcHJldmlvdXMgcXVldWUgKi8KKworLyogdGhlc2UgZGVmaW5lIHRoZSB0d28gcXVldWVzIHBlciBjb250cm9sIGNoYW5uZWwgYmV0d2VlbiBjb250cm9scGFydCBhbmQgIml0cyIKKyAqIGd1ZXN0cywgd2hpY2ggaW5jbHVkZXMgdGhlIGlvcGFydCAgKi8KKyNkZWZpbmUgQ1RSTENIQU5fVE9fQ1RSTEdVRVNUUEFSVCAwIC8qIHVzZWQgYnkgY3RybGd1ZXN0cGFydCB0byAnaW5zZXJ0JyBzaWduYWxzCisJCQkJICAgICAqIHRvIGN0cmxwYXJ0ICovCisjZGVmaW5lIENUTFJDSEFOX0ZST01fQ1RSTFBBUlQgMCAvKiB1c2VkIGJ5IGN0cmxwYXJ0IHRvICdyZW1vdmUnIHNpZ25hbHMgZnJvbQorCQkJCSAgKiBjdHJscXVlc3RwYXJ0IC0gc2FtZSBxdWV1ZSBhcyBwcmV2aW91cworCQkJCSAgKiBxdWV1ZSAqLworCisjZGVmaW5lIENUUkxDSEFOX1RPX0NUUkxQQVJUIDEgLyogdXNlZCBieSBjdHJscGFydCB0byAnaW5zZXJ0JyBzaWduYWxzIHRvCisJCQkJKiBjdHJsZ3Vlc3RwYXJ0ICovCisjZGVmaW5lIENUUkxDSEFOX0ZST01fQ1RSTEdVRVNUUEFSVCAxIC8qIHVzZWQgYnkgY3RyZ3Vlc3RwYXJ0IHRvICdyZW1vdmUnCisJCQkJICAgICAgICogc2lnbmFscyBmcm9tIGN0cmxwYXJ0IC0gc2FtZSBxdWV1ZSBhcworCQkJCSAgICAgICAqIHByZXZpb3VzIHF1ZXVlICovCisKKy8qIHRoZXNlIGRlZmluZSB0aGUgRXZlbnQgJiBBY2sgcXVldWVzIHBlciBjb250cm9sIGNoYW5uZWwgRXZlbnRzIGFyZSBnZW5lcmF0ZWQKKyogYnkgQ1RSTEdVRVNUUEFSVCBhbmQgc2VudCB0byBDVFJMUEFSVDsgQWNrcyBhcmUgZ2VuZXJhdGVkIGJ5IENUUkxQQVJUIGFuZCBzZW50CisqIHRvIENUUkxHVUVTVFBBUlQuICovCisjZGVmaW5lIENUUkxDSEFOX0VWRU5UX1RPX0NUUkxQQVJUIDIgLyogdXNlZCBieSBjdHJsZ3Vlc3RwYXJ0IHRvICdpbnNlcnQnIEV2ZW50cworCQkJCSAgICAgICogdG8gY3RybHBhcnQgKi8KKyNkZWZpbmUgQ1RSTENIQU5fRVZFTlRfRlJPTV9DVFJMR1VFU1RQQVJUIDIgLyogdXNlZCBieSBjdHJscGFydCB0byAncmVtb3ZlJworCQkJCQkgICAgICogRXZlbnRzIGZyb20gY3RybGd1ZXN0cGFydCAqLworCisjZGVmaW5lIENUUkxDSEFOX0FDS19UT19DVFJMR1VFU1RQQVJUIDMJLyogdXNlZCBieSBjdHJscGFydCB0byAnaW5zZXJ0JyBBY2tzIHRvCisJCQkJCSAqIGN0cmxndWVzdHBhcnQgKi8KKyNkZWZpbmUgQ1RSTENIQU5fQUNLX0ZST01fQ1RSTFBBUlQgMyAvKiB1c2VkIGJ5IGN0cmxndWVzdHBhcnQgdG8gJ3JlbW92ZScgRXZlbnRzCisJCQkJICAgICAgKiBmcm9tIGN0cmxwYXJ0ICovCisKKy8qIHNpemUgb2YgY2RiIC0gaS5lLiwgc2NzaSBjbW5kICovCisjZGVmaW5lIE1BWF9DTU5EX1NJWkUgMTYKKworI2RlZmluZSBNQVhfU0VOU0VfU0laRSA2NAorCisjZGVmaW5lIE1BWF9QSFlTX0lORk8gNjQKKworLyogQmVjYXVzZSBHdWVzdFRvR3Vlc3RDb3B5IGlzIGxpbWl0ZWQgdG8gNEtpQiBzZWdtZW50cywgYW5kIHdlIGhhdmUgbGltaXRlZCB0aGUKKyogRW11bGV4IERyaXZlciB0byAyNTYgc2NhdHRlciBsaXN0IHNlZ21lbnRzIHZpYSB0aGUgbHBmY19zZ19zZWdfY250IHBhcmFtZXRlcgorKiB0byAyNTYsIHRoZSBtYXhpbXVtIEkvTyBzaXplIGlzIGxpbWl0ZWQgdG8gMjU2ICogNCBLaUIgPSAxIE1CICovCisjZGVmaW5lIE1BWF9JT19TSVpFICAgKDEwMjQqMTAyNCkJLyogMSBNQiAqLworCisvKiBOT1RFIDE6IGxwZmMgZGVmaW5lcyBpdHMgc3VwcG9ydCBmb3Igc2VnbWVudHMgaW4KKyogI2RlZmluZSBMUEZDX1NHX1NFR19DTlQgNjQKKyoKKyogTk9URSAyOiBJbiBMaW51eCwgZnJhZ3MgYXJyYXkgaW4gc2tiIGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQgdG8gYmUKKyogTUFYX1NLQl9GUkFHUyBzaXplLCB3aGljaCBpcyAxOCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gTUFYX1BIWVNfSU5GTyBmb3IKKyogbm93LiAgKi8KKworI2lmbmRlZiBNQVhfU0VSSUFMX05VTQorI2RlZmluZSBNQVhfU0VSSUFMX05VTQkJMzIKKyNlbmRpZgkJCQkvKiBNQVhfU0VSSUFMX05VTSAqLworCisjZGVmaW5lIE1BWF9TQ1NJX0JVU0VTCQkxCisjZGVmaW5lIE1BWF9TQ1NJX1RBUkdFVFMJOAorI2RlZmluZSBNQVhfU0NTSV9MVU5TCQkxNgorI2RlZmluZSBNQVhfU0NTSV9GUk9NX0hPU1QJMHhGRkZGRkZGRgkvKiBJbmRpY2F0b3IgdG8gdXNlIFBoeXNpY2FsIEhCQQorCQkJCQkJICogU0NTSSBIb3N0IHZhbHVlICovCisKKy8qIHZhcmlvdXMgdHlwZXMgb2YgbmV0d29yayBwYWNrZXRzIHRoYXQgY2FuIGJlIHNlbnQgaW4gY21kcnNwICovCit0eXBlZGVmIGVudW0geyBORVRfUkNWX1BPU1QgPSAwLAkvKiBzdWJtaXQgYnVmZmVyIHRvIGhvbGQgcmVjZWl2aW5nCisJCQkJCSAqIGluY29taW5nIHBhY2tldCAqLworCS8qIHZpcnRuaWMgLT4gdWlzbmljICovCisJTkVUX1JDViwJCS8qIGluY29taW5nIHBhY2tldCByZWNlaXZlZCAqLworCS8qIHVpc25pYyAtPiB2aXJ0cGNpICovCisJTkVUX1hNSVQsCQkvKiBmb3Igb3V0Z29pbmcgbmV0IHBhY2tldHMgICAgICAqLworCS8qIHZpcnRuaWMgLT4gdWlzbmljICovCisJTkVUX1hNSVRfRE9ORSwJCS8qIG91dGdvaW5nIHBhY2tldCB4bWl0dGVkICovCisJLyogdWlzbmljIC0+IHZpcnRwY2kgKi8KKwlORVRfUkNWX0VOQkRJUywJCS8qIGVuYWJsZS9kaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKi8KKwkvKiB2aXJ0bmljIC0+IHVpc25pYyAqLworCU5FVF9SQ1ZfRU5CRElTX0FDSywJLyogYWNrbm93bGVkZ2UgZW5hYmxlL2Rpc2FibGUgcGFja2V0CisJCQkJICogcmVjZXB0aW9uICovCisJLyogdWlzbmljIC0+IHZpcnRuaWMgKi8KKwlORVRfUkNWX1BST01JU0MsCS8qIGVuYWJsZS9kaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkvKiB2aXJ0bmljIC0+IHVpc25pYyAqLworCU5FVF9DT05ORUNUX1NUQVRVUywJLyogaW5kaWNhdGUgdGhlIGxvc3Mgb3IgcmVzdG9yYXRpb24gb2YgYSBuZXR3b3JrCisJCQkJICogY29ubmVjdGlvbiAqLworCS8qIHVpc25pYyAtPiB2aXJ0bmljICovCisJTkVUX01BQ0FERFIsCQkvKiBpbmRpY2F0ZXMgdGhlIGNsaWVudCBoYXMgcmVxdWVzdGVkIHRvIHVwZGF0ZQorCQkJCSAqIGl0cyBNQUMgYWRkciAqLworCU5FVF9NQUNBRERSX0FDSywJLyogTWFjIGFkZHJlcyAgKi8KKworfSBORVRfVFlQRVM7CisKKyNkZWZpbmUJCUVUSF9IRUFERVJfU0laRSAxNAkvKiBzaXplIG9mIGV0aGVybmV0IGhlYWRlciAqLworCisjZGVmaW5lCQlFVEhfTUlOX0RBVEFfU0laRSA0NgkvKiBtaW5pbXVtIGV0aCBkYXRhIHNpemUgKi8KKyNkZWZpbmUJCUVUSF9NSU5fUEFDS0VUX1NJWkUgKEVUSF9IRUFERVJfU0laRSArIEVUSF9NSU5fREFUQV9TSVpFKQorCisjZGVmaW5lICAgICBFVEhfREVGX0RBVEFfU0laRSAxNTAwCS8qIGRlZmF1bHQgZGF0YSBzaXplICovCisjZGVmaW5lICAgICBFVEhfREVGX1BBQ0tFVF9TSVpFIChFVEhfSEVBREVSX1NJWkUgKyBFVEhfREVGX0RBVEFfU0laRSkKKworI2RlZmluZQkJRVRIX01BWF9NVFUgMTYzODQJLyogbWF4aW11bSBkYXRhIHNpemUgKi8KKworI2lmbmRlZiBNQVhfTUFDQUREUl9MRU4KKyNkZWZpbmUgTUFYX01BQ0FERFJfTEVOIDYJLyogbnVtYmVyIG9mIGJ5dGVzIGluIE1BQyBhZGRyZXNzICovCisjZW5kaWYJCQkJLyogTUFYX01BQ0FERFJfTEVOICovCisKKyNkZWZpbmUgRVRIX0lTX0xPQ0FMTFlfQURNSU5JU1RFUkVEKEFkZHJlc3MpIFwKKwkoKChVOCAqKSAoQWRkcmVzcykpWzBdICYgKChVOCkgMHgwMikpCisjZGVmaW5lIE5JQ19WRU5ET1JfSUQgMHgwMDA4MDAwQgorCisvKiB2YXJpb3VzIHR5cGVzIG9mIHNjc2kgdGFzayBtZ210IGNvbW1hbmRzICAqLwordHlwZWRlZiBlbnVtIHsgVEFTS19NR01UX0FCT1JUX1RBU0sgPQorCSAgICAxLCBUQVNLX01HTVRfQlVTX1JFU0VULCBUQVNLX01HTVRfTFVOX1JFU0VULAorCSAgICBUQVNLX01HTVRfVEFSR0VUX1JFU0VULAorfSBUQVNLX01HTVRfVFlQRVM7CisKKy8qIHZhcmlvdXMgdHlwZXMgb2YgdmRpc2sgbWdtdCBjb21tYW5kcyAgKi8KK3R5cGVkZWYgZW51bSB7IFZESVNLX01HTVRfQUNRVUlSRSA9IDEsIFZESVNLX01HTVRfUkVMRUFTRSwKK30gVkRJU0tfTUdNVF9UWVBFUzsKKworLyogdGhpcyBpcyB1c2VkIGluIHRoZSB2ZGVzdCBmaWVsZCAgKi8KKyNkZWZpbmUgVkRFU1RfQUxMIDB4RkZGRgorCisjZGVmaW5lIE1JTl9OVU1TSUdOQUxTIDY0CisjZGVmaW5lIE1BWF9OVU1TSUdOQUxTIDQwOTYKKworLyogTUFYX05FVF9SQ1ZfQlVGIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJjdiBidWZmZXJzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgZWFjaAorKiBndWVzdCdzIHZpcnRuaWMgYW5kIHBvc3RlZCB0byB1aXNuaWMuICBVaXNuaWMsIGZvciBlYWNoIGNoYW5uZWwsIGtlZXBzIHRoZSByY3YKKyogYnVmZmVycyBwb3N0ZWQgYW5kIHVzZXMgdGhlbSB0byByZWNlaXZlIGRhdGEgb24gYmVoYWxmIG9mIHRoZSBndWVzdCdzIHZpcnRuaWMuCisqIE5PVEU6IHRoZSBudW1fcmN2X2J1ZnMgaXMgY29uZmlndXJhYmxlIGZvciBlYWNoIFZOSUMuIFNvIHRoZSBmb2xsb3dpbmcgaXMKKyogc2ltcGx5IGFuIHVwcGVybGltaXQgb24gd2hhdCBlYWNoIFZOSUMgY2FuIHByb3ZpZGUuICBTZXR0aW5nIGl0IHRvIGhhbGYgb2YgdGhlCisqIE5VTVNJR05BTFMgdG8gcHJldmVudCBxdWV1ZSBmdWxsIGRlYWRsb2NrcyAqLworI2RlZmluZSBNQVhfTkVUX1JDVl9CVUZTIChNSU5fTlVNU0lHTkFMUyAvIDIpCisKKy8qCisgKiBzdHJ1Y3RzIHdpdGggcHJhZ21hIHBhY2sgICovCisKKworLyogLy8vLy8vLy8vLy8vLyBCRUdJTiBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8vLy8vLy8vLy8vLyBPTkxZIFNUUlVDVCBUWVBFIFNIT1VMRCBCRSBCRUxPVyAqLworCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKworc3RydWN0IGd1ZXN0X3BoeXNfaW5mbyB7CisJVTY0IGFkZHJlc3M7CisJVTY0IGxlbmd0aDsKK307CisKKyNkZWZpbmUgR1BJX0VOVFJJRVNfUEVSX1BBR0UgKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZ3Vlc3RfcGh5c19pbmZvKSkKKworc3RydWN0IHVpc3Njc2lfZGVzdCB7CisJVTMyIGNoYW5uZWw7CQkvKiBjaGFubmVsID09IGJ1cyBudW1iZXIgKi8KKwlVMzIgaWQ7CQkJLyogaWQgPT0gdGFyZ2V0IG51bWJlciAqLworCVUzMiBsdW47CQkvKiBsdW4gPT0gbG9naWNhbCB1bml0IG51bWJlciAqLworfTsKKworc3RydWN0IHZoYmFfd3dubiB7CisJVTMyIHd3bm4xOworCVUzMiB3d25uMjsKK307CisKKy8qIFdBUk5JTkc6IFZhbHVlcyBzdGlyZWQgaW4gdGhpcyBzdHJ1Y3R1cmUgbXVzdCBjb250YWluIG1heGltdW0gY291bnRzIChub3QKKyAqIG1heGltdW0gdmFsdWVzKS4gKi8KK3N0cnVjdCB2aGJhX2NvbmZpZ19tYXggewkvKiAyMCBieXRlcyAqLworCVUzMiBtYXhfY2hhbm5lbDsJLyogbWF4aW11bSBjaGFubmVsIGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoaXMKKwkJCQkgKiBidXMgKi8KKwlVMzIgbWF4X2lkOwkJLyogbWF4aW11bSBTQ1NJIElEIGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoaXMKKwkJCQkgKiBidXMgKi8KKwlVMzIgbWF4X2x1bjsJCS8qIG1heGltdW0gU0NTSSBMVU4gZm9yIGRldmljZXMgYXR0YWNoZWQgdG8gdGhpcworCQkJCSAqIGJ1cyAqLworCVUzMiBjbWRfcGVyX2x1bjsJLyogbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgY29tbWFuZHMgcGVyCisJCQkJICogbHVuIHRoYXQgYXJlIGFsbG93ZWQgYXQgb25lIHRpbWUgKi8KKwlVMzIgbWF4X2lvX3NpemU7CS8qIG1heGltdW0gaW8gc2l6ZSBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGlzCisJCQkJICogYnVzICovCisJLyogbWF4IGlvIHNpemUgaXMgb2Z0ZW4gZGV0ZXJtaW5lZCBieSB0aGUgcmVzb3VyY2Ugb2YgdGhlIGhiYS4gZS5nICovCisJLyogbWF4IHNjYXR0ZXIgZ2F0aGVyIGxpc3QgbGVuZ3RoICogcGFnZSBzaXplIC8gc2VjdG9yIHNpemUgKi8KK307CisKK3N0cnVjdCB1aXNjbWRyc3Bfc2NzaSB7CisJdm9pZCAqc2NzaWNtZDsJCS8qIHRoZSBoYW5kbGUgdG8gdGhlIGNtZCB0aGF0IHdhcyByZWNlaXZlZCAtCisJCQkJICogc2VuZCBpdCBiYWNrIGFzIGlzIGluIHRoZSByc3AgcGFja2V0LiAgKi8KKwlVOCBjbW5kW01BWF9DTU5EX1NJWkVdOwkvKiB0aGUgY2RiIGZvciB0aGUgY29tbWFuZCAqLworCVUzMiBidWZmbGVuOwkJLyogbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgb3V0IG9yIGluICovCisJVTE2IGd1ZXN0X3BoeXNfZW50cmllczsJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gc2NhdHRlci1nYXRoZXIgKHNnKQorCQkJCSAqIGxpc3QgKi8KKwlzdHJ1Y3QgZ3Vlc3RfcGh5c19pbmZvIGdwaV9saXN0W01BWF9QSFlTX0lORk9dOwkvKiBwaHlzaWNhbCBhZGRyZXNzCisJCQkJCQkJICogaW5mb3JtYXRpb24gZm9yIGVhY2gKKwkJCQkJCQkgKiBmcmFnbWVudCAqLworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uICBkYXRhX2RpcjsgLyogZGlyZWN0aW9uIG9mIHRoZSBkYXRhLCBpZiBhbnkgKi8KKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OwkvKiBpZGVudGlmaWVzIHRoZSB2aXJ0dWFsIGhiYSwgaWQsCisJCQkJCSAqIGNoYW5uZWwsIGx1biB0byB3aGljaCBjbWQgd2FzIHNlbnQgKi8KKworCSAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbmVlZGVkIHRvIHF1ZXVlIHRoZSByc3AgYmFjayB0byBjbWQKKwkgICAgICogb3JpZ2luYXRvciAqLworCWludCBsaW51eHN0YXQ7CQkvKiB0aGUgb3JpZ2luYWwgTGludXggc3RhdHVzIC0gZm9yIHVzZSBieSBsaW51eAorCQkJCSAqIHZkaXNrIGNvZGUgKi8KKwlVOCBzY3Npc3RhdDsJCS8qIHRoZSBzY3NpIHN0YXR1cyAqLworCVU4IGFkZGxzdGF0OwkJLyogbm9uLXNjc2kgc3RhdHVzIC0gY292ZXJzIGNhc2VzIGxpa2UgdGltZW91dAorCQkJCSAqIG5lZWRlZCBieSB3aW5kb3dzIGd1ZXN0cyAqLworI2RlZmluZSBBRERMX1JFU0VUCQkxCisjZGVmaW5lIEFERExfVElNRU9VVAkJMgorI2RlZmluZSBBRERMX0lOVEVSTkFMX0VSUk9SCTMKKyNkZWZpbmUgQURETF9TRUxfVElNRU9VVAk0CisjZGVmaW5lIEFERExfQ01EX1RJTUVPVVQJNQorI2RlZmluZSBBRERMX0JBRF9UQVJHRVQJCTYKKyNkZWZpbmUgQURETF9SRVRSWQkJNworCisJLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQgb2YgY29tbWFuZCAqLworCSBVOCBzZW5zZWJ1ZltNQVhfU0VOU0VfU0laRV07CS8qIHNlbnNlIGluZm8gaW4gY2FzZSBjbWQgZmFpbGVkOyAqLworCS8qIGl0IGhvbGRzIHRoZSBzZW5zZV9kYXRhIHN0cnVjdDsgKi8KKwkvKiBzZWUgdGhhdCBzdHJ1Y3QgZm9yIGRldGFpbHMuICovCisJdm9pZCAqdmRpc2s7IC8qIGNvbnRhaW5zIHBvaW50ZXIgdG8gdGhlIHZkaXNrIHNvIHRoYXQgd2UgY2FuIGNsZWFuIHVwCisJCSAgICAgICogd2hlbiB0aGUgSU8gY29tcGxldGVzLiAqLworCWludCBub19kaXNrX3Jlc3VsdDsJLyogdXNlZCB0byByZXR1cm4gbm8gZGlzayBpbnF1aXJ5IHJlc3VsdCAqLworCS8qIHdoZW4gbm9fZGlza19yZXN1bHQgaXMgc2V0IHRvIDEsICAqLworCS8qIHNjc2kuc2NzaXN0YXQgaXMgU0FNX1NUQVRfR09PRCAqLworCS8qIHNjc2kuYWRkbHN0YXQgaXMgMCAqLworCS8qIHNjc2kubGludXhzdGF0IGlzIFNBTV9TVEFUX0dPT0QgKi8KKwkvKiBUaGF0IGlzLCB0aGVyZSBpcyBOTyBlcnJvci4gKi8KK307CisKKy8qCisqIERlZmluZXMgdG8gc3VwcG9ydCBzZW5kaW5nIGNvcnJlY3QgaW5xdWlyeSByZXN1bHQgd2hlbiBubyBkaXNrIGlzCisqIGNvbmZpZ3VyZWQuICAqLworCisvKiBGcm9tIFNDU0kgU1BDMiAtCisgKgorICogSWYgdGhlIHRhcmdldCBpcyBub3QgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGEgZGV2aWNlIG9uIHRoaXMgbG9naWNhbCB1bml0LCB0aGUKKyAqIGRldmljZSBzZXJ2ZXIgc2hhbGwgc2V0IHRoaXMgZmllbGQgdG8gN0ZoIChQRVJJUEhFUkFMIFFVQUxJRklFUiBzZXQgdG8gMDExYgorICogYW5kIFBFUklQSEVSQUwgREVWSUNFIFRZUEUgc2V0IHRvIDFGaCkuCisgKgorICpUaGUgZGV2aWNlIHNlcnZlciBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGRldmljZQorICp0eXBlIG9uIHRoaXMgbG9naWNhbCB1bml0LiBIb3dldmVyLCB0aGUgcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkKKyAqY29ubmVjdGVkIHRvIHRoaXMgbG9naWNhbCB1bml0LgorICovCisKKyNkZWZpbmUgREVWX05PVF9QUkVTRU5UIDB4N2YJLyogb2xkIG5hbWUgLSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIERFVl9OT1RfQ0FQQUJMRSAweDdmCS8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyIG9mIDB4MyAgKi8KKyAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMHgxZiAqLworICAgIC8qIHNwZWNpZmllcyBubyBkZXZpY2UgYnV0IHRhcmdldCBwcmVzZW50ICovCisKKyNkZWZpbmUgREVWX0RJU0tfQ0FQQUJMRV9OT1RfUFJFU0VOVCAweDIwIC8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyIG9mIDB4MSAqLworICAgIC8qIHBlcmlwaGVyYWwgdHlwZSBvZiAwIC0gZGlzayAqLworICAgIC8qIHNwZWNpZmllcyBkZXZpY2UgY2FwYWJsZSwgYnV0IG5vdCBwcmVzZW50ICovCisKKyNkZWZpbmUgREVWX1BST0NfQ0FQQUJMRV9OT1RfUFJFU0VOVCAweDIzIC8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyIG9mIDB4MSAqLworICAgIC8qIHBlcmlwaGVyYWwgdHlwZSBvZiAzIC0gcHJvY2Vzc29yICovCisgICAgLyogc3BlY2lmaWVzIGRldmljZSBjYXBhYmxlLCBidXQgbm90IHByZXNlbnQgKi8KKworI2RlZmluZSBERVZfSElTVVBQT1JUIDB4MTA7CS8qIEhpU3VwID0gMTsgc2hvd3Mgc3VwcG9ydCBmb3IgcmVwb3J0IGx1bnMgKi8KKyAgICAvKiBtdXN0IGJlIHJldHVybmVkIGZvciBsdW4gMC4gKi8KKworLyogTk9URTogTGludXggY29kZSBhc3N1bWVzIGlucXVpcnkgY29udGFpbnMgMzYgYnl0ZXMuIFdpdGhvdXQgY2hlY2tpbmcgbGVuZ3RoCisqIGluIGJ1Zls0XSBzb21lIGxpbnV4IGNvZGUgYWNjZXNzZXMgYnl0ZXMgYmV5b25kIDUgdG8gcmV0cmlldmUgdmVuZG9yLCBwcm9kdWN0CisqICYgcmV2aXNpb24uICBZaWtlcyEgU28gbGV0IHVzIGFsd2F5cyBzZW5kIGJhY2sgMzYgYnl0ZXMsIHRoZSBtaW5pbXVtIGZvcgorKiBpbnF1aXJ5IHJlc3VsdC4gKi8KKyNkZWZpbmUgTk9fRElTS19JTlFVSVJZX1JFU1VMVF9MRU4gMzYKKworI2RlZmluZSBNSU5fSU5RVUlSWV9SRVNVTFRfTEVOIDUgLyogd2UgbmVlZCBhdCBsZWFzdCA1IGJ5dGVzIG1pbmltdW0gZm9yIGlucXVpcnkKKwkJCQkgICogcmVzdWx0ICovCisKKy8qIFNDU0kgZGV2aWNlIHZlcnNpb24gZm9yIG5vIGRpc2sgaW5xdWlyeSByZXN1bHQgKi8KKyNkZWZpbmUgU0NTSV9TUEMyX1ZFUiA0CQkvKiBpbmRpY2F0ZXMgU0NTSSBTUEMyIChTUEMzIGlzIDUpICovCisKKy8qIFdpbmRvd3MgYW5kIExpbnV4IHdhbnQgZGlmZmVyZW50IHRoaW5ncyBmb3IgYSBub24tZXhpc3RlbnQgbHVuLiBTbywgd2UnbGwgbGV0CisgKiBjYWxsZXIgcGFzcyBpbiB0aGUgcGVyaXBoZXJhbCBxdWFsaWZpZXIgYW5kIHR5cGUuCisgKiBOT1RFOls0XSBTQ1NJIHJldHVybnMgKG4tNCk7IHNvIHdlIHJldHVybiBsZW5ndGgtMS00IG9yIGxlbmd0aC01LiAqLworCisjZGVmaW5lIFNFVF9OT19ESVNLX0lOUVVJUllfUkVTVUxUKGJ1ZiwgbGVuLCBsdW4sIGx1bjBub3RwcmVzZW50LCBub3RwcmVzZW50KSBcCisJZG8gewkJCQkJCQkJXAorCQlNRU1TRVQoYnVmLCAwLAkJCQkJCVwKKwkJICAgICAgIE1JTk5VTShsZW4sCQkJCQlcCisJCQkgICAgICAodW5zaWduZWQgaW50KSBOT19ESVNLX0lOUVVJUllfUkVTVUxUX0xFTikpOyBcCisJCWJ1ZlsyXSA9IChVOCkgU0NTSV9TUEMyX1ZFUjsJCQkJXAorCQlpZiAobHVuID09IDApIHsJCQkJCQlcCisJCQlidWZbMF0gPSAoVTgpIGx1bjBub3RwcmVzZW50OwkJCVwKKwkJCWJ1ZlszXSA9IChVOCkgREVWX0hJU1VQUE9SVDsJCQlcCisJCX0gZWxzZQkJCQkJCQlcCisJCQlidWZbMF0gPSAoVTgpIG5vdHByZXNlbnQ7CQkJXAorCQlidWZbNF0gPSAoVTgpICgJCQkJCQlcCisJCQlNSU5OVU0obGVuLAkJCQkJXAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpIE5PX0RJU0tfSU5RVUlSWV9SRVNVTFRfTEVOKSAtIDUpOwlcCisJCWlmIChsZW4gPj0gTk9fRElTS19JTlFVSVJZX1JFU1VMVF9MRU4pIHsJCVwKKwkJCWJ1Zls4XSA9ICdEJzsJCQkJCVwKKwkJCWJ1Zls5XSA9ICdFJzsJCQkJCVwKKwkJCWJ1ZlsxMF0gPSAnTCc7CQkJCQlcCisJCQlidWZbMTFdID0gJ0wnOwkJCQkJXAorCQkJYnVmWzE2XSA9ICdQJzsJCQkJCVwKKwkJCWJ1ZlsxN10gPSAnUyc7CQkJCQlcCisJCQlidWZbMThdID0gJ0UnOwkJCQkJXAorCQkJYnVmWzE5XSA9ICdVJzsJCQkJCVwKKwkJCWJ1ZlsyMF0gPSAnRCc7CQkJCQlcCisJCQlidWZbMjFdID0gJ08nOwkJCQkJXAorCQkJYnVmWzIyXSA9ICcgJzsJCQkJCVwKKwkJCWJ1ZlsyM10gPSAnRCc7CQkJCQlcCisJCQlidWZbMjRdID0gJ0UnOwkJCQkJXAorCQkJYnVmWzI1XSA9ICdWJzsJCQkJCVwKKwkJCWJ1ZlsyNl0gPSAnSSc7CQkJCQlcCisJCQlidWZbMjddID0gJ0MnOwkJCQkJXAorCQkJYnVmWzI4XSA9ICdFJzsJCQkJCVwKKwkJCWJ1ZlszMF0gPSAnICc7CQkJCQlcCisJCQlidWZbMzFdID0gJy4nOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisKKy8qCisqIFN0cnVjdCAmIERlZmluZXMgdG8gc3VwcG9ydCBzZW5zZSBpbmZvcm1hdGlvbi4KKyovCisKKworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3QgaXMgcmV0dXJuZWQgaW4gc2Vuc2VidWYgZmllbGQgaW4gdWlzY21kcnNwX3Njc2kuICBJdCBpcworKiBpbml0aWFsaXplZCBpbiBleGFjdGx5IHRoZSBtYW5uZXIgdGhhdCBpcyByZWNvbW1lbmRlZCBpbiBXaW5kb3dzIChoZW5jZSB0aGUKKyogb2RkIHZhbHVlcykuCisqIFdoZW4gc2V0LCB0aGVzZSBmaWVsZHMgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorKiBFcnJvckNvZGUgPSAweDcwCQlpbmRpY2F0ZXMgY3VycmVudCBlcnJvcgorKiBWYWxpZCA9IDEJCQlpbmRpY2F0ZXMgc2Vuc2UgaW5mbyBpcyB2YWxpZAorKiBTZW5zZUtleQkJCWNvbnRhaW5zIHNlbnNlIGtleSBhcyBkZWZpbmVkIGJ5IFNDU0kgc3BlY3MuCisqIEFkZGl0aW9uYWxTZW5zZUNvZGUJCWNvbnRhaW5zIHNlbnNlIGtleSBhcyBkZWZpbmVkIGJ5IFNDU0kgc3BlY3MuCisqIEFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIJY29udGFpbnMgcXVhbGlmaWVyIHRvIHNlbnNlIGNvZGUgYXMgZGVmaW5lZCBieQorKgkJCQlzY3NpIGRvY3MuCisqIEFkZGl0aW9uYWxTZW5zZUxlbmd0aAkJY29udGFpbnMgd2lsbCBiZSBzaXplb2Yoc2Vuc2VfZGF0YSktOD0xMC4KKyovCitzdHJ1Y3Qgc2Vuc2VfZGF0YSB7CisJVTggRXJyb3JDb2RlOjc7CisJVTggVmFsaWQ6MTsKKwlVOCBTZWdtZW50TnVtYmVyOworCVU4IFNlbnNlS2V5OjQ7CisJVTggUmVzZXJ2ZWQ6MTsKKwlVOCBJbmNvcnJlY3RMZW5ndGg6MTsKKwlVOCBFbmRPZk1lZGlhOjE7CisJVTggRmlsZU1hcms6MTsKKwlVOCBJbmZvcm1hdGlvbls0XTsKKwlVOCBBZGRpdGlvbmFsU2Vuc2VMZW5ndGg7CisJVTggQ29tbWFuZFNwZWNpZmljSW5mb3JtYXRpb25bNF07CisJVTggQWRkaXRpb25hbFNlbnNlQ29kZTsKKwlVOCBBZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyOworCVU4IEZpZWxkUmVwbGFjZWFibGVVbml0Q29kZTsKKwlVOCBTZW5zZUtleVNwZWNpZmljWzNdOworfTsKKworLyogc29tZSBTQ1NJIEFEU0VOU0UgY29kZXMgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0xVTl9OT1RfUkVBRFkKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX0xVTl9OT1RfUkVBRFkgMHgwNAorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfSUxMRUdBTF9DT01NQU5ECisjZGVmaW5lIFNDU0lfQURTRU5TRV9JTExFR0FMX0NPTU1BTkQgMHgyMAorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfSUxMRUdBTF9CTE9DSworI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfSUxMRUdBTF9CTE9DSworI2RlZmluZSBTQ1NJX0FEU0VOU0VfSUxMRUdBTF9CTE9DSyAgMHgyMQorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfSU5WQUxJRF9DREIKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX0lOVkFMSURfQ0RCICAgIDB4MjQKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lOVkFMSURfTFVOCisjZGVmaW5lIFNDU0lfQURTRU5TRV9JTlZBTElEX0xVTiAgICAweDI1CisjZW5kaWYJLyogICovCisjaWZuZGVmIFNDU0lfQURXUklURV9QUk9URUNUCisjZGVmaW5lIFNDU0lfQURXUklURV9QUk9URUNUICAgICAgICAweDI3CisjZW5kaWYJLyogICovCisjaWZuZGVmIFNDU0lfQURTRU5TRV9NRURJVU1fQ0hBTkdFRAorI2RlZmluZSBTQ1NJX0FEU0VOU0VfTUVESVVNX0NIQU5HRUQgMHgyOAorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfQlVTX1JFU0VUCisjZGVmaW5lIFNDU0lfQURTRU5TRV9CVVNfUkVTRVQgICAgICAweDI5CisjZW5kaWYJLyogICovCisjaWZuZGVmIFNDU0lfQURTRU5TRV9OT19NRURJQV9JTl9ERVZJQ0UKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX05PX01FRElBX0lOX0RFVklDRSAweDNhCisjZW5kaWYJLyogICovCisKK3N0cnVjdCBuZXRfcGt0X3htdCB7CisJaW50IGxlbjsJLyogZnVsbCBsZW5ndGggb2YgZGF0YSBpbiB0aGUgcGFja2V0ICovCisJaW50IG51bV9mcmFnczsJLyogbnVtYmVyIG9mIGZyYWdtZW50cyBpbiBmcmFncyBjb250YWluaW5nIGRhdGEgKi8KKwlzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW01BWF9QSFlTX0lORk9dOwkvKiBwaHlzaWNhbCBwYWdlIGluZm9ybWF0aW9uIGZvcgorCQkJCQkJICogZWFjaCBmcmFnbWVudCAqLworCWNoYXIgZXRoaGRyW0VUSF9IRUFERVJfU0laRV07CS8qIHRoZSBldGhlcm5ldCBoZWFkZXIgICovCisJc3RydWN0IHsKKworCQkgICAgLyogdGhlc2UgYXJlIG5lZWRlZCBmb3IgY3N1bSBhdCB1aXNuaWMgZW5kICovCisJCVU4IHZhbGlkOwkvKiAxID0gcmVzdCBvZiB0aGlzIHN0cnVjdCBpcyB2YWxpZCAtIGVsc2UKKwkJCQkgKiBpZ25vcmUgKi8KKwkJVTggaHJhd29mZnY7CS8qIDEgPSBod3JhZm9mZiBpcyB2YWxpZCAqLworCQlVOCBuaHJhd29mZnY7CS8qIDEgPSBuaHdyYWZvZmYgaXMgdmFsaWQgKi8KKwkJVTE2IHByb3RvY29sOwkvKiBzcGVjaWZpZXMgcGFja2V0IHByb3RvY29sICovCisJCVUzMiBjc3VtOwkvKiB2YWx1ZSB1c2VkIHRvIHNldCBza2ItPmNzdW0gYXQgSU9QYXJ0ICovCisJCVUzMiBocmF3b2ZmOwkvKiB2YWx1ZSB1c2VkIHRvIHNldCBza2ItPmgucmF3IGF0IElPUGFydCAqLworCQkvKiBocmF3b2ZmIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIFRSQU5TUE9SVCBMQVlFUiBIRUFERVIgKi8KKwkJVTMyIG5ocmF3b2ZmOwkvKiB2YWx1ZSB1c2VkIHRvIHNldCBza2ItPm5oLnJhdyBhdCBJT1BhcnQgKi8KKwkJLyogbmhyYXdvZmYgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgTkVUV09SSyBMQVlFUiBIRUFERVIgKi8KKwl9IGxpbmNzdW07CisKKwkgICAgLyogKioqKiBOT1RFICoqKioKKwkgICAgICogVGhlIGZ1bGwgcGFja2V0IGlzIGRlc2NyaWJlZCBpbiBmcmFncyBidXQgdGhlIGV0aGVybmV0IGhlYWRlciBpcworCSAgICAgKiBzZXBhcmF0ZWx5IGtlcHQgaW4gZXRoaGRyIHNvIHRoYXQgdWlzbmljIGRvZXNuJ3QgaGF2ZSAiTUFQIiB0aGUKKwkgICAgICogZ3Vlc3QgbWVtb3J5IHRvIGdldCB0byB0aGUgaGVhZGVyLiB1aXNuaWMgbmVlZHMgZXRoaGRyIHRvCisJICAgICAqIGRldGVybWluZSBob3cgdG8gcm91dGUgdGhlIHBhY2tldC4KKwkgICAgICovCit9OworCitzdHJ1Y3QgbmV0X3BrdF94bXRkb25lIHsKKwlVMzIgeG10X2RvbmVfcmVzdWx0OwkvKiByZXN1bHQgb2YgTkVUX1hNSVQgKi8KKyNkZWZpbmUgWE1JVF9TVUNDRVNTIDAKKyNkZWZpbmUgWE1JVF9GQUlMRUQgMQorfTsKKworLyogUkNWUE9TVF9CVUZfU0laZSBtdXN0IGJlIGF0IG1vc3QgcGFnZV9zaXplKDQwOTYpIC0gY2FjaGVfbGluZV9zaXplICg2NCkgVGhlCisqIHJlYXNvbiBpcyBiZWNhdXNlIGRldl9za2JfYWxsb2Mgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSBSQ1ZfUE9TVCBza2JzIGluCisqIHZpcnRuaWMgcmVxdWlyZXMgdGhhdCB0aGVyZSBpcyAib3ZlcmhlYWQiIGluIHRoZSBidWZmZXIsIGFuZCBwYWRzIDE2IGJ5dGVzLiAgSQorKiBwcmVmZXIgdG8gdXNlIDEgZnVsbCBjYWNoZSBsaW5lIHNpemUgZm9yICJvdmVyaGVhZCIgc28gdGhhdCB0cmFuc2ZlcnMgYXJlCisqIGJldHRlci4gIElPVk0gcmVxdWlyZXMgdGhhdCBhIGJ1ZmZlciBiZSByZXByZXNlbnRlZCBieSAxIHBoeXNfaW5mbyBzdHJ1Y3R1cmUKKyogd2hpY2ggY2FuIG9ubHkgY292ZXIgcGFnZV9zaXplLiAqLworI2RlZmluZSBSQ1ZQT1NUX0JVRl9TSVpFIDQwMzIKKyNkZWZpbmUgTUFYX05FVF9SQ1ZfQ0hBSU4gXAorCSgoRVRIX01BWF9NVFUrRVRIX0hFQURFUl9TSVpFICsgUkNWUE9TVF9CVUZfU0laRS0xKSAvIFJDVlBPU1RfQlVGX1NJWkUpCisKK3N0cnVjdCBuZXRfcGt0X3JjdnBvc3QgeworCSAgICAvKiByY3YgYnVmIHNpemUgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaW5jbHVkZSBldGhlcm5ldCBkYXRhIGxlbiArCisJICAgICogZXRoZXJuZXQgaGVhZGVyIGxlbiAtIHdlIGFyZSBjaG9vc2luZyAySyBiZWNhdXNlIGl0IGlzIGd1YXJhbnRlZWQKKwkgICAgKiB0byBiZSBkZXNjcmliYWJsZSAqLworCSAgICBzdHJ1Y3QgcGh5c19pbmZvIGZyYWc7CS8qIHBoeXNpY2FsIHBhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZQorCQkJCQkgKiBzaW5nbGUgZnJhZ21lbnQgMksgcmN2IGJ1ZiAqLworCSAgICBVNjQgVW5pcXVlTnVtOwkJLyogVGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0CisJCQkJCSAqIHJlY2VpdmUgcG9zdHMgYXJlIHJldHVybmVkIHRvICAqLworCSAgICAvKiB0aGUgQWRhcHRlciB3aGljaCBzZW50IHRoZW0gb3JpZ29uYWxseS4gKi8KK307CisKK3N0cnVjdCBuZXRfcGt0X3JjdiB7CisKKwkvKiB0aGUgbnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycyB0aGF0IGNhbiBiZSBjaGFpbmVkICAqLworCS8qIGlzIGJhc2VkIG9uIG1heCBtdHUgYW5kIHNpemUgb2YgZWFjaCByY3YgYnVmICovCisJVTMyIHJjdl9kb25lX2xlbjsJLyogbGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEgKi8KKwlVOCBudW1yY3ZidWZzOwkJLyogbnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycyB0aGF0IGNvbnRhaW4gdGhlICovCisJLyogaW5jb21pbmcgZGF0YTsgZ3Vlc3QgZW5kIE1VU1QgY2hhaW4gdGhlc2UgdG9nZXRoZXIuICovCisJdm9pZCAqcmN2YnVmW01BWF9ORVRfUkNWX0NIQUlOXTsJLyogdGhlIGxpc3Qgb2YgcmVjZWl2ZSBidWZmZXJzCisJCQkJCQkgKiB0aGF0IG11c3QgYmUgY2hhaW5lZDsgKi8KKwkvKiBlYWNoIGVudHJ5IGlzIGEgcmVjZWl2ZSBidWZmZXIgcHJvdmlkZWQgYnkgTkVUX1JDVl9QT1NULiAqLworCS8qIE5PVEU6IGZpcnN0IHJjdmJ1ZiBpbiB0aGUgY2hhaW4gd2lsbCBhbHNvIGJlIHByb3ZpZGVkIGluIG5ldC5idWYuICovCisJVTY0IFVuaXF1ZU51bTsKKwlVMzIgUmN2c0Ryb3BwZWREZWx0YTsKK307CisKK3N0cnVjdCBuZXRfcGt0X2VuYmRpcyB7CisJdm9pZCAqY29udGV4dDsKKwlVMTYgZW5hYmxlOwkJLyogMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUgKi8KK307CisKK3N0cnVjdCBuZXRfcGt0X21hY2FkZHIgeworCXZvaWQgKmNvbnRleHQ7CisJVTggbWFjYWRkcltNQVhfTUFDQUREUl9MRU5dOwkvKiA2IGJ5dGVzICovCit9OworCisvKiBjbWQgcnNwIHBhY2tldCB1c2VkIGZvciBWTklDIG5ldHdvcmsgdHJhZmZpYyAgKi8KK3N0cnVjdCB1aXNjbWRyc3BfbmV0IHsKKwlORVRfVFlQRVMgdHlwZTsKKwl2b2lkICpidWY7CisJdW5pb24geworCQlzdHJ1Y3QgbmV0X3BrdF94bXQgeG10OwkvKiB1c2VkIGZvciBORVRfWE1JVCAqLworCQlzdHJ1Y3QgbmV0X3BrdF94bXRkb25lIHhtdGRvbmU7CS8qIHVzZWQgZm9yIE5FVF9YTUlUX0RPTkUgKi8KKwkJc3RydWN0IG5ldF9wa3RfcmN2cG9zdCByY3Zwb3N0OwkvKiB1c2VkIGZvciBORVRfUkNWX1BPU1QgKi8KKwkJc3RydWN0IG5ldF9wa3RfcmN2IHJjdjsJLyogdXNlZCBmb3IgTkVUX1JDViAqLworCQlzdHJ1Y3QgbmV0X3BrdF9lbmJkaXMgZW5iZGlzOwkvKiB1c2VkIGZvciBORVRfUkNWX0VOQkRJUywgKi8KKwkJLyogTkVUX1JDVl9FTkJESVNfQUNLLCAgKi8KKwkJLyogTkVUX1JDVl9QUk9NU0lDLCAqLworCQkvKiBhbmQgTkVUX0NPTk5FQ1RfU1RBVFVTICovCisJCXN0cnVjdCBuZXRfcGt0X21hY2FkZHIgbWFjYWRkcjsKKwl9OworfTsKKworc3RydWN0IHVpc2NtZHJzcF9zY3NpdGFza21nbXQgeworCVRBU0tfTUdNVF9UWVBFUyB0YXNrdHlwZTsKKworCSAgICAvKiB0aGUgdHlwZSBvZiB0YXNrICovCisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsKKworCSAgICAvKiB0aGUgdmRpc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBtZ210IGlzIGdlbmVyYXRlZCAqLworCXZvaWQgKnNjc2ljbWQ7CisKKwkgICAgLyogVGhpcyBpcyBzb21lIGhhbmRsZSB0aGF0IHRoZSBndWVzdCBoYXMgc2F2ZWQgb2ZmIGZvciBpdHMgb3duIHVzZS4KKwkgICAgKiBJdHMgdmFsdWUgaXMgcHJlc2VydmVkIGJ5IGlvcGFydCAmIHJldHVybmVkIGFzIGlzIGluIHRoZSB0YXNrIG1nbXQKKwkgICAgKiByc3AuICovCisJdm9pZCAqbm90aWZ5OworCisJICAgIC8qIEZvciBsaW51eCBndWVzdHMsIHRoaXMgaXMgYSBwb2ludGVyIHRvIHdhaXRfcXVldWVfaGVhZCB0aGF0IGEKKwkgICAgKiB0aHJlYWQgaXMgd2FpdGluZyBvbiB0byBzZWUgaWYgdGhlIHRhc2ttZ210IGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKwkgICAgKiBGb3Igd2luZG93cyBndWVzdHMsIHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgbG9jYXRpb24gdGhhdCBhIHdhaXRpbmcKKwkgICAgKiB0aHJlYWQgaXMgdGVzdGluZyB0byBzZWUgaWYgdGhlIHRhc2ttZ210IGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKwkgICAgKiBXaGVuIHRoZSByc3AgaXMgcmVjZWl2ZWQgYnkgZ3Vlc3QsIHRoZSB0aHJlYWQgcmVjZWl2aW5nIHRoZQorCSAgICAqIHJlc3BvbnNlIHVzZXMgdGhpcyB0byBub3RpZnkgdGhlIHRoZSB0aHJlYWQgd2FpdGluZyBmb3IgdGFza21nbXQKKwkgICAgKiBjb21tYW5kIGNvbXBsZXRpb24uICBJdHMgdmFsdWUgaXMgcHJlc2VydmVkIGJ5IGlvcGFydCAmIHJldHVybmVkCisJICAgICogYXMgaXMgaW4gdGhlIHRhc2sgbWdtdCByc3AuICovCisJdm9pZCAqbm90aWZ5cmVzdWx0OworCisJICAgIC8qIHRoaXMgaXMgYSBoYW5kbGUgdG8gbG9jYXRpb24gaW4gZ3Vlc3Qgd2hlcmUgdGhlIHJlc3VsdCBvZiB0aGUKKwkgICAgKiB0YXNrbWdtdCBjb21tYW5kIChyZXN1bHQgZmllbGQpIGlzIHRvIHNhdmVkIG9mZiB3aGVuIHRoZSByZXNwb25zZQorCSAgICAqIGlzIGhhbmRsZWQuICBJdHMgdmFsdWUgaXMgcHJlc2VydmVkIGJ5IGlvcGFydCAmIHJldHVybmVkIGFzIGlzIGluCisJICAgICogdGhlIHRhc2sgbWdtdCByc3AuICovCisJY2hhciByZXN1bHQ7CisKKwkgICAgLyogcmVzdWx0IG9mIHRhc2ttZ210IGNvbW1hbmQgLSBzZXQgYnkgSU9QYXJ0IC0gdmFsdWVzIGFyZTogKi8KKyNkZWZpbmUgVEFTS19NR01UX0ZBSUxFRCAgMAorI2RlZmluZSBUQVNLX01HTVRfU1VDQ0VTUyAxCit9OworCisvKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgYnkgdWlzc2QgdG8gc2VuZCBkaXNrIGFkZC9yZW1vdmUgbm90aWZpY2F0aW9ucyB0bworICogR3Vlc3QgKi8KKy8qIE5vdGUgdGhhdCB0aGUgdkhiYSBwb2ludGVyIGlzIG5vdCB1c2VkIGJ5IHRoZSBDbGllbnQvR3Vlc3Qgc2lkZS4gKi8KK3N0cnVjdCB1aXNjbWRyc3BfZGlza25vdGlmeSB7CisJVTggYWRkOwkJLyogMC1yZW1vdmUsIDEtYWRkICovCisJdm9pZCAqdkhiYTsJCS8qIFBvaW50ZXIgdG8gdmhiYV9pbmZvIGZvciBjaGFubmVsIGluZm8gdG8KKwkJCQkgKiByb3V0ZSBtc2cgKi8KKwlVMzIgY2hhbm5lbCwgaWQsIGx1bjsJLyogU0NTSSBQYXRoIG9mIERpc2sgdG8gYWRkZWQgb3IgcmVtb3ZlZCAqLworfTsKKworLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGJ5IHZpcnRoYmEvdlNDU0kgdG8gc2VuZCB0aGUgQWNxdWlyZS9SZWxlYXNlIGNvbW1hbmRzCisqIHRvIHRoZSBJT1ZNLiAgKi8KK3N0cnVjdCB1aXNjbWRyc3BfdmRpc2ttZ210IHsKKwlWRElTS19NR01UX1RZUEVTIHZkaXNrdHlwZTsKKworCSAgICAvKiB0aGUgdHlwZSBvZiB0YXNrICovCisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsKKworCSAgICAvKiB0aGUgdmRpc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBtZ210IGlzIGdlbmVyYXRlZCAqLworCXZvaWQgKnNjc2ljbWQ7CisKKwkgICAgLyogVGhpcyBpcyBzb21lIGhhbmRsZSB0aGF0IHRoZSBndWVzdCBoYXMgc2F2ZWQgb2ZmIGZvciBpdHMgb3duIHVzZS4KKwkgICAgKiBJdHMgdmFsdWUgaXMgcHJlc2VydmVkIGJ5IGlvcGFydCAmIHJldHVybmVkIGFzIGlzIGluIHRoZSB0YXNrIG1nbXQKKwkgICAgKiByc3AuICovCisJdm9pZCAqbm90aWZ5OworCisJICAgIC8qIEZvciBsaW51eCBndWVzdHMsIHRoaXMgaXMgYSBwb2ludGVyIHRvIHdhaXRfcXVldWVfaGVhZCB0aGF0IGEKKwkgICAgKiB0aHJlYWQgaXMgd2FpdGluZyBvbiB0byBzZWUgaWYgdGhlIHRhc2ttZ210IGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKwkgICAgKiBGb3Igd2luZG93cyBndWVzdHMsIHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgbG9jYXRpb24gdGhhdCBhIHdhaXRpbmcKKwkgICAgKiB0aHJlYWQgaXMgdGVzdGluZyB0byBzZWUgaWYgdGhlIHRhc2ttZ210IGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKwkgICAgKiBXaGVuIHRoZSByc3AgaXMgcmVjZWl2ZWQgYnkgZ3Vlc3QsIHRoZSB0aHJlYWQgcmVjZWl2aW5nIHRoZQorCSAgICAqIHJlc3BvbnNlIHVzZXMgdGhpcyB0byBub3RpZnkgdGhlIHRoZSB0aHJlYWQgd2FpdGluZyBmb3IgdGFza21nbXQKKwkgICAgKiBjb21tYW5kIGNvbXBsZXRpb24uICBJdHMgdmFsdWUgaXMgcHJlc2VydmVkIGJ5IGlvcGFydCAmIHJldHVybmVkCisJICAgICogYXMgaXMgaW4gdGhlIHRhc2sgbWdtdCByc3AuICovCisJdm9pZCAqbm90aWZ5cmVzdWx0OworCisJICAgIC8qIHRoaXMgaXMgYSBoYW5kbGUgdG8gbG9jYXRpb24gaW4gZ3Vlc3Qgd2hlcmUgdGhlIHJlc3VsdCBvZiB0aGUKKwkgICAgKiB0YXNrbWdtdCBjb21tYW5kIChyZXN1bHQgZmllbGQpIGlzIHRvIHNhdmVkIG9mZiB3aGVuIHRoZSByZXNwb25zZQorCSAgICAqIGlzIGhhbmRsZWQuICBJdHMgdmFsdWUgaXMgcHJlc2VydmVkIGJ5IGlvcGFydCAmIHJldHVybmVkIGFzIGlzIGluCisJICAgICogdGhlIHRhc2sgbWdtdCByc3AuICovCisJY2hhciByZXN1bHQ7CisKKwkgICAgLyogcmVzdWx0IG9mIHRhc2ttZ210IGNvbW1hbmQgLSBzZXQgYnkgSU9QYXJ0IC0gdmFsdWVzIGFyZTogKi8KKyNkZWZpbmUgVkRJU0tfTUdNVF9GQUlMRUQgIDAKKyNkZWZpbmUgVkRJU0tfTUdNVF9TVUNDRVNTIDEKK307CisKKy8qIGtlZXBpbmcgY21kICYgcnNwIGluZm8gaW4gb25lIHN0cnVjdHVyZSBmb3Igbm93IGNtZCByc3AgcGFja2V0IGZvciBzY3NpICovCitzdHJ1Y3QgdWlzY21kcnNwIHsKKwljaGFyIGNtZHR5cGU7CisKKwkgICAgLyogZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgc3RydWN0ICovCisjZGVmaW5lIENNRF9TQ1NJX1RZUEUJCTEKKyNkZWZpbmUgQ01EX05FVF9UWVBFCQkyCisjZGVmaW5lIENNRF9TQ1NJVEFTS01HTVRfVFlQRQkzCisjZGVmaW5lIENNRF9OT1RJRllHVUVTVF9UWVBFCTQKKyNkZWZpbmUgQ01EX1ZESVNLTUdNVF9UWVBFCTUKKwl1bmlvbiB7CisJCXN0cnVjdCB1aXNjbWRyc3Bfc2NzaSBzY3NpOworCQlzdHJ1Y3QgdWlzY21kcnNwX25ldCBuZXQ7CisJCXN0cnVjdCB1aXNjbWRyc3Bfc2NzaXRhc2ttZ210IHNjc2l0YXNrbWdtdDsKKwkJc3RydWN0IHVpc2NtZHJzcF9kaXNrbm90aWZ5IGRpc2tub3RpZnk7CisJCXN0cnVjdCB1aXNjbWRyc3BfdmRpc2ttZ210IHZkaXNrbWdtdDsKKwl9OworCXZvaWQgKnByaXZhdGVfZGF0YTsJLyogdXNlZCB0byBzZW5kIHRoZSByZXNwb25zZSB3aGVuIHRoZSBjbWQgaXMKKwkJCQkgKiBkb25lIChzY3NpICYgc2NzaXR0YXNrbWdtdCkuICAqLworCXN0cnVjdCB1aXNjbWRyc3AgKm5leHQ7CS8qIEdlbmVyYWwgUHVycG9zZSBRdWV1ZSBMaW5rICovCisJc3RydWN0IHVpc2NtZHJzcCAqYWN0aXZlUV9uZXh0OwkvKiBVc2VkIHRvIHRyYWNrIGFjdGl2ZSBjb21tYW5kcyAqLworCXN0cnVjdCB1aXNjbWRyc3AgKmFjdGl2ZVFfcHJldjsJLyogVXNlZCB0byB0cmFjayBhY3RpdmUgY29tbWFuZHMgICovCit9OworCisvKiBUaGlzIGlzIGp1c3QgdGhlIGhlYWRlciBvZiB0aGUgSU8gY2hhbm5lbC4gIEl0IGlzIGFzc3VtZWQgdGhhdCBkaXJlY3RseSBhZnRlcgorKiB0aGlzIGhlYWRlciB0aGVyZSBpcyBhIGxhcmdlIHJlZ2lvbiBvZiBtZW1vcnkgd2hpY2ggY29udGFpbnMgdGhlIGNvbW1hbmQgYW5kCisqIHJlc3BvbnNlIHF1ZXVlcyBhcyBzcGVjaWZpZWQgaW4gY21kUSBhbmQgcnNwUSBTSUdOQUxfUVVFVUVfSEVBREVSUy4gKi8KK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIHsKKwlDSEFOTkVMX0hFQURFUiBDaGFubmVsSGVhZGVyOworCVNJR05BTF9RVUVVRV9IRUFERVIgY21kUTsKKwlTSUdOQUxfUVVFVUVfSEVBREVSIHJzcFE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHZoYmFfd3dubiB3d25uOwkvKiA4IGJ5dGVzICovCisJCQlzdHJ1Y3QgdmhiYV9jb25maWdfbWF4IG1heDsJLyogMjAgYnl0ZXMgKi8KKwkJfSB2aGJhOwkJLyogMjggKi8KKwkJc3RydWN0IHsKKwkJCVU4IG1hY2FkZHJbTUFYX01BQ0FERFJfTEVOXTsJLyogNiBieXRlcyAqLworCQkJVTMyIG51bV9yY3ZfYnVmczsJLyogNCAqLworCQkJVTMyIG10dTsJLyogNCAqLworCQkJR1VJRCB6b25lR3VpZDsJLyogMTYgKi8KKwkJfSB2bmljOwkJLyogdG90YWwgICAgIDMwICovCisJfTsKKworI2RlZmluZSBNQVhfQ0xJRU5UU1RSSU5HX0xFTiAxMDI0CisJIFU4IGNsaWVudFN0cmluZ1tNQVhfQ0xJRU5UU1RSSU5HX0xFTl07CS8qIE5VTEwgdGVybWluYXRlZCAtIHNvIGhvbGRzCisJCQkJCQkgKiBtYXggLSAxIGJ5dGVzICovCit9IFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0w7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKy8qIGRlZmluZSBvZmZzZXRzIHRvIG1lbWJlcnMgb2Ygc3RydWN0IHVpc2NtZHJzcCAqLworI2RlZmluZSBPRkZTRVRfQ01EVFlQRSBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBjbWR0eXBlKQorI2RlZmluZSBPRkZTRVRfU0NTSSBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBzY3NpKQorI2RlZmluZSBPRkZTRVRfTkVUIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3AsIG5ldCkKKyNkZWZpbmUgT0ZGU0VUX1NDU0lUQVNLTUdNVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBzY3NpdGFza21nbXQpCisjZGVmaW5lIE9GRlNFVF9ORVhUIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3AsIG5leHQpCisKKy8qIGRlZmluZSBvZmZzZXRzIHRvIG1lbWJlcnMgb2Ygc3RydWN0IHVpc2NtZHJzcF9uZXQgKi8KKyNkZWZpbmUgT0ZGU0VUX1RZUEUgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHR5cGUpCisjZGVmaW5lIE9GRlNFVF9CVUYgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIGJ1ZikKKyNkZWZpbmUgT0ZGU0VUX1hNVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgeG10KQorI2RlZmluZSBPRkZTRVRfWE1UX0RPTkVfUkVTVUxUIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3BfbmV0LCB4bXRkb25lKQorI2RlZmluZSBPRkZTRVRfUkNWUE9TVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgcmN2cG9zdCkKKyNkZWZpbmUgT0ZGU0VUX1JDVl9ET05FX0xFTiBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgcmN2KQorI2RlZmluZSBPRkZTRVRfRU5CRElTIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3BfbmV0LCBlbmJkaXMpCisKKy8qIGRlZmluZSBvZmZzZXRzIHRvIG1lbWJlcnMgb2Ygc3RydWN0IG5ldF9wa3RfcmN2cG9zdCAqLworI2RlZmluZSBPRkZTRVRfVE9UQUxMRU4gT0ZGU0VUT0Yoc3RydWN0IG5ldF9wa3RfcmN2cG9zdCwgdG90YWxsZW4pCisjZGVmaW5lCU9GRlNFVF9GUkFHIE9GRlNFVE9GKHN0cnVjdCBuZXRfcGt0X3JjdnBvc3QsIGZyYWcpCisKKy8qCisqIElOTElORSBmdW5jdGlvbnMgZm9yIGluaXRpYWxpemluZyBhbmQgYWNjZXNzaW5nIEkvTyBkYXRhIGNoYW5uZWxzCisqLworCisKKyNkZWZpbmUgTlVNU0lHTkFMUyh4LCBxKSAoKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MICopKHgpKS0+cS5NYXhTaWduYWxTbG90cykKKyNkZWZpbmUgU0laRU9GX1BST1RPQ09MIChDT1ZFUihzaXplb2YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCksIDY0KSkKKyNkZWZpbmUgU0laRU9GX0NNRFJTUCAoQ09WRVIoc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3ApLCA2NCkpCisKKyNkZWZpbmUgSU9fQ0hBTk5FTF9TSVpFKHgpIENPVkVSKFNJWkVPRl9QUk9UT0NPTCArIFwKKwkJCQkgKE5VTVNJR05BTFMoeCwgY21kUSkgKyBcCisJCQkJICBOVU1TSUdOQUxTKHgsIHJzcFEpKSAqIFNJWkVPRl9DTURSU1AsIDQwOTYpCisjZGVmaW5lIE1JTl9JT19DSEFOTkVMX1NJWkUgQ09WRVIoU0laRU9GX1BST1RPQ09MICsgXAorCQkJCSAgMiAqIE1JTl9OVU1TSUdOQUxTICogU0laRU9GX0NNRFJTUCwgNDA5NikKKyNpZmRlZiBfX0dOVUNfXworLyogVGhlc2UgZGVmaW5lcyBzaG91bGQgb25seSBldmVyIGJlIHVzZWQgaW4gc2VydmljZSBwYXJ0aXRvbnMgKi8KKy8qIGJlY2F1c2UgdGhleSByZWx5IG9uIHRoZSBzaXplIG9mIHVpc2NtZHJzcCAqLworI2RlZmluZSBRU0xPVFNGUk9NQllURVMoYnl0ZXMpICgoKGJ5dGVzLVNJWkVPRl9QUk9UT0NPTCkvMikvU0laRU9GX0NNRFJTUCkKKyNkZWZpbmUgUVNJWkVGUk9NQllURVMoYnl0ZXMpIChRU0xPVFNGUk9NQllURVMoYnl0ZXMpKlNJWkVPRl9DTURSU1ApCisjZGVmaW5lIFNpZ25hbFFJbml0KHgpCQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQl4LT5jbWRRLlNpemUgPSBRU0laRUZST01CWVRFUyh4LT5DaGFubmVsSGVhZGVyLlNpemUpOwlcCisJCXgtPmNtZFEub1NpZ25hbEJhc2UgPSBTSVpFT0ZfUFJPVE9DT0wgLQkJCVwKKwkJCU9GRlNFVE9GKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wsIGNtZFEpOwlcCisJCXgtPmNtZFEuU2lnbmFsU2l6ZSA9IFNJWkVPRl9DTURSU1A7CQkJXAorCQl4LT5jbWRRLk1heFNpZ25hbFNsb3RzID0JCQkJXAorCQkJUVNMT1RTRlJPTUJZVEVTKHgtPkNoYW5uZWxIZWFkZXIuU2l6ZSk7CQlcCisJCXgtPmNtZFEuTWF4U2lnbmFscyA9IHgtPmNtZFEuTWF4U2lnbmFsU2xvdHMgLSAxOwlcCisJCXgtPnJzcFEuU2l6ZSA9IFFTSVpFRlJPTUJZVEVTKHgtPkNoYW5uZWxIZWFkZXIuU2l6ZSk7CVwKKwkJeC0+cnNwUS5vU2lnbmFsQmFzZSA9CQkJCQlcCisJCQkoU0laRU9GX1BST1RPQ09MICsgeC0+Y21kUS5TaXplKSAtCQlcCisJCQlPRkZTRVRPRihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCByc3BRKTsJXAorCQl4LT5yc3BRLlNpZ25hbFNpemUgPSBTSVpFT0ZfQ01EUlNQOwkJCVwKKwkJeC0+cnNwUS5NYXhTaWduYWxTbG90cyA9CQkJCVwKKwkJCVFTTE9UU0ZST01CWVRFUyh4LT5DaGFubmVsSGVhZGVyLlNpemUpOwkJXAorCQl4LT5yc3BRLk1heFNpZ25hbHMgPSB4LT5yc3BRLk1heFNpZ25hbFNsb3RzIC0gMTsJXAorCQl4LT5DaGFubmVsSGVhZGVyLm9DaGFubmVsU3BhY2UgPQkJCVwKKwkJCU9GRlNFVE9GKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wsIGNtZFEpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTklUX0NMSUVOVFNUUklORyhjaGFuLCB0eXBlLCBjbGllbnRTdHIsIGNsaWVudFN0ckxlbikJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGNsaWVudFN0cikgewkJCQkJXAorCQkJY2hhbi0+Q2hhbm5lbEhlYWRlci5vQ2xpZW50U3RyaW5nID0JCVwKKwkJCQlPRkZTRVRPRih0eXBlLCBjbGllbnRTdHJpbmcpOwkJXAorCQkJTUVNQ1BZKGNoYW4tPmNsaWVudFN0cmluZywgY2xpZW50U3RyLAkJXAorCQkJICAgICAgIE1JTk5VTShjbGllbnRTdHJMZW4sCQkJXAorCQkJCSAgICAgIChVMzIpIChNQVhfQ0xJRU5UU1RSSU5HX0xFTiAtIDEpKSk7IFwKKwkJCWNoYW4tPmNsaWVudFN0cmluZ1tNSU5OVU0oY2xpZW50U3RyTGVuLAkJXAorCQkJCQkJICAoVTMyKSAoTUFYX0NMSUVOVFNUUklOR19MRU4gXAorCQkJCQkJCSAtIDEpKV0JCVwKKwkJCQk9ICdcMCc7CQkJCQlcCisJCX0JCQkJCQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCWlmIChjbGllbnRTdHJMZW4gPiAwKQkJCQlcCisJCQkJcmV0dXJuIDA7CQkJCVwKKwl9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgVUxUUkFfSU9fQ0hBTk5FTF9TRVJWRVJfUkVBRFkoeCwgY2hhbklkLCBsb2dDdHgpIFwKKwlVTFRSQV9DSEFOTkVMX1NFUlZFUl9UUkFOU0lUSU9OKHgsIGNoYW5JZCwgU3J2U3RhdGUsIENIQU5ORUxTUlZfUkVBRFksIFwKKwkJCQkJbG9nQ3R4KTsKKworI2RlZmluZSBVTFRSQV9JT19DSEFOTkVMX1NFUlZFUl9OT1RSRUFEWSh4LCBjaGFuSWQsIGxvZ0N0eCkJXAorCVVMVFJBX0NIQU5ORUxfU0VSVkVSX1RSQU5TSVRJT04oeCwgY2hhbklkLCBTcnZTdGF0ZSwgXAorCQkJCQlDSEFOTkVMU1JWX1VOSU5JVElBTElaRUQsIGxvZ0N0eCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IFVMVFJBX1ZIQkFfaW5pdF9jaGFubmVsKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgKngsCisJCQkJCSAgICAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sCisJCQkJCSAgICAgIHN0cnVjdCB2aGJhX2NvbmZpZ19tYXggKm1heCwKKwkJCQkJICAgICAgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLAorCQkJCQkgICAgICBVMzIgY2xpZW50U3RyTGVuLCBVNjQgYnl0ZXMpICB7CisJTUVNU0VUKHgsIDAsIHNpemVvZihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MKSk7CisJeC0+Q2hhbm5lbEhlYWRlci5WZXJzaW9uSWQgPSBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEOworCXgtPkNoYW5uZWxIZWFkZXIuU2lnbmF0dXJlID0gVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRTsKKwl4LT5DaGFubmVsSGVhZGVyLlNydlN0YXRlID0gQ0hBTk5FTFNSVl9VTklOSVRJQUxJWkVEOworCXgtPkNoYW5uZWxIZWFkZXIuSGVhZGVyU2l6ZSA9IHNpemVvZih4LT5DaGFubmVsSGVhZGVyKTsKKwl4LT5DaGFubmVsSGVhZGVyLlNpemUgPSBDT1ZFUihieXRlcywgNDA5Nik7CisJeC0+Q2hhbm5lbEhlYWRlci5UeXBlID0gVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZDsKKwl4LT5DaGFubmVsSGVhZGVyLlpvbmVHdWlkID0gR3VpZDA7CisJeC0+dmhiYS53d25uID0gKnd3bm47CisJeC0+dmhiYS5tYXggPSAqbWF4OworCUlOSVRfQ0xJRU5UU1RSSU5HKHgsIFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wsIGNsaWVudFN0ciwKKwkJCSAgY2xpZW50U3RyTGVuKTsKKwlTaWduYWxRSW5pdCh4KTsKKwlpZiAoKHgtPmNtZFEuTWF4U2lnbmFsU2xvdHMgPiBNQVhfTlVNU0lHTkFMUykgfHwKKwkgICAgICh4LT5yc3BRLk1heFNpZ25hbFNsb3RzID4gTUFYX05VTVNJR05BTFMpKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoKHgtPmNtZFEuTWF4U2lnbmFsU2xvdHMgPCBNSU5fTlVNU0lHTkFMUykgfHwKKwkgICAgICh4LT5yc3BRLk1heFNpZ25hbFNsb3RzIDwgTUlOX05VTVNJR05BTFMpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFVMVFJBX1ZIQkFfc2V0X21heChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MICp4LAorCQkJCSAgICAgIHN0cnVjdCB2aGJhX2NvbmZpZ19tYXggKm1heCkgIHsKKwl4LT52aGJhLm1heCA9ICptYXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFVMVFJBX1ZOSUNfaW5pdF9jaGFubmVsKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgKngsCisJCQkJCQkgdW5zaWduZWQgY2hhciAqbWFjYWRkciwKKwkJCQkJCSBVMzIgbnVtX3Jjdl9idWZzLCBVMzIgbXR1LAorCQkJCQkJIEdVSUQgem9uZUd1aWQsCisJCQkJCQkgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLAorCQkJCQkJIFUzMiBjbGllbnRTdHJMZW4sCisJCQkJCQkgVTY0IGJ5dGVzKSAgeworCU1FTVNFVCh4LCAwLCBzaXplb2YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCkpOworCXgtPkNoYW5uZWxIZWFkZXIuVmVyc2lvbklkID0gVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRDsKKwl4LT5DaGFubmVsSGVhZGVyLlNpZ25hdHVyZSA9IFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkU7CisJeC0+Q2hhbm5lbEhlYWRlci5TcnZTdGF0ZSA9IENIQU5ORUxTUlZfVU5JTklUSUFMSVpFRDsKKwl4LT5DaGFubmVsSGVhZGVyLkhlYWRlclNpemUgPSBzaXplb2YoeC0+Q2hhbm5lbEhlYWRlcik7CisJeC0+Q2hhbm5lbEhlYWRlci5TaXplID0gQ09WRVIoYnl0ZXMsIDQwOTYpOworCXgtPkNoYW5uZWxIZWFkZXIuVHlwZSA9IFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQ7CisJeC0+Q2hhbm5lbEhlYWRlci5ab25lR3VpZCA9IEd1aWQwOworCU1FTUNQWSh4LT52bmljLm1hY2FkZHIsIG1hY2FkZHIsIE1BWF9NQUNBRERSX0xFTik7CisJeC0+dm5pYy5udW1fcmN2X2J1ZnMgPSBudW1fcmN2X2J1ZnM7CisJeC0+dm5pYy5tdHUgPSBtdHU7CisJeC0+dm5pYy56b25lR3VpZCA9IHpvbmVHdWlkOworCUlOSVRfQ0xJRU5UU1RSSU5HKHgsIFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wsIGNsaWVudFN0ciwKKwkJCSAgIGNsaWVudFN0ckxlbik7CisJU2lnbmFsUUluaXQoeCk7CisJaWYgKCh4LT5jbWRRLk1heFNpZ25hbFNsb3RzID4gTUFYX05VTVNJR05BTFMpIHx8CisJICAgICAoeC0+cnNwUS5NYXhTaWduYWxTbG90cyA+IE1BWF9OVU1TSUdOQUxTKSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCh4LT5jbWRRLk1heFNpZ25hbFNsb3RzIDwgTUlOX05VTVNJR05BTFMpIHx8CisJICAgICAoeC0+cnNwUS5NYXhTaWduYWxTbG90cyA8IE1JTl9OVU1TSUdOQUxTKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgkvKiBfX0dOVUNfXyAqLworCisvKgorKiBJTkxJTkUgZnVuY3Rpb24gZm9yIGV4cGFuZGluZyBhIGd1ZXN0J3MgcGZuLW9mZi1zaXplIGludG8gbXVsdGlwbGUgNEsgcGFnZQorKiBwZm4tb2ZmLXNpemUgZW50aXJlcy4KKyovCisKKworLyogd2UgZGVhbCB3aXRoIDRLIHBhZ2Ugc2l6ZXMgd2hlbiB3ZSBpdCBjb21lcyB0byBwYXNzaW5nIHBhZ2UgaW5mb3JtYXRpb24KKyAqIGJldHdlZW4gKi8KKy8qIEd1ZXN0IGFuZCBJT1BhcnRpdGlvbi4gKi8KKyNkZWZpbmUgUElfUEFHRV9TSVpFICAweDEwMDAKKyNkZWZpbmUgUElfUEFHRV9NQVNLICAweDBGRkYKKyNkZWZpbmUgUElfUEFHRV9TSElGVCAxMgorCisvKiByZXR1cm5zIG5leHQgbm9uLXplcm8gaW5kZXggb24gc3VjY2VzcyBvciB6ZXJvIG9uIGZhaWx1cmUgKGkuZS4gb3V0IG9mCisgKiByb29tKQorICovCitzdGF0aWMgSU5MSU5FICBVMTYKK2FkZF9waHlzaW5mb19lbnRyaWVzKFUzMiBpbnBfcGZuLAkvKiBpbnB1dCAtIHNwZWNpZmllcyB0aGUgcGZuIHRvIGJlIHVzZWQKKwkJCQkJICogdG8gYWRkIGVudHJpZXMgKi8KKwkJICAgICBVMTYgaW5wX29mZiwJLyogaW5wdXQgLSBzcGVjaWZpZXMgdGhlIG9mZiB0byBiZSB1c2VkCisJCQkJCSAqIHRvIGFkZCBlbnRyaWVzICovCisJCSAgICAgVTMyIGlucF9sZW4sCS8qIGlucHV0IC0gc3BlY2lmaWVzIHRoZSBsZW4gdG8gYmUgdXNlZAorCQkJCQkgKiB0byBhZGQgZW50cmllcyAqLworCQkgICAgIFUxNiBpbmRleCwJCS8qIGlucHV0IC0gaW5kZXggaW4gYXJyYXkgYXQgd2hpY2ggbmV3CisJCQkJCSAqIGVudHJpZXMgYXJlIGFkZGVkICovCisJCSAgICAgVTE2IG1heF9waV9hcnJfZW50cmllcywJLyogaW5wdXQgLSBzcGVjaWZpZXMgdGhlIG1heGltdW0KKwkJCQkJCSAqIGVudHJpZXMgcGlfYXJyIGNhbiBob2xkICovCisJCSAgICAgc3RydWN0IHBoeXNfaW5mbyBwaV9hcnJbXSkgLyogaW5wdXQgJiBvdXRwdXQgLSBhcnJheSB0bworCQkJCQkJICAqIHdoaWNoIGVudHJpZXMgYXJlIGFkZGVkICovCit7CisJVTMyIGxlbjsKKwlVMTYgaSwgZmlyc3RsZW47CisKKwlmaXJzdGxlbiA9IFBJX1BBR0VfU0laRSAtIGlucF9vZmY7CisJaWYgKGlucF9sZW4gPD0gZmlyc3RsZW4pIHsKKworCQkvKiB0aGUgaW5wdXQgZW50cnkgc3BhbnMgb25seSBvbmUgcGFnZSAtIGFkZCBhcyBpcyAqLworCQlpZiAoaW5kZXggPj0gbWF4X3BpX2Fycl9lbnRyaWVzKQorCQkJcmV0dXJuIDA7CisJCXBpX2FycltpbmRleF0ucGlfcGZuID0gaW5wX3BmbjsKKwkJcGlfYXJyW2luZGV4XS5waV9vZmYgPSAoVTE2KSBpbnBfb2ZmOworCQlwaV9hcnJbaW5kZXhdLnBpX2xlbiA9IChVMTYpIGlucF9sZW47CisJCSAgICByZXR1cm4gaW5kZXggKyAxOworCX0KKworCSAgICAvKiB0aGlzIGVudHJ5IHNwYW5zIG11bHRpcGxlIHBhZ2VzICovCisJICAgIGZvciAobGVuID0gaW5wX2xlbiwgaSA9IDA7IGxlbjsKKwkJIGxlbiAtPSBwaV9hcnJbaW5kZXggKyBpXS5waV9sZW4sIGkrKykgeworCQlpZiAoaW5kZXggKyBpID49IG1heF9waV9hcnJfZW50cmllcykKKwkJCXJldHVybiAwOworCQlwaV9hcnJbaW5kZXggKyBpXS5waV9wZm4gPSBpbnBfcGZuICsgaTsKKwkJaWYgKGkgPT0gMCkgeworCQkJcGlfYXJyW2luZGV4XS5waV9vZmYgPSBpbnBfb2ZmOworCQkJcGlfYXJyW2luZGV4XS5waV9sZW4gPSBmaXJzdGxlbjsKKwkJfQorCisJCWVsc2UgeworCQkJcGlfYXJyW2luZGV4ICsgaV0ucGlfb2ZmID0gMDsKKwkJCXBpX2FycltpbmRleCArIGldLnBpX2xlbiA9CisJCQkgICAgKFUxNikgTUlOTlVNKGxlbiwgKFUzMikgUElfUEFHRV9TSVpFKTsKKwkJfQorCisJfQorCXJldHVybiBpbmRleCArIGk7Cit9CisKKyNlbmRpZgkJCQkvKiBfX0lPQ0hBTk5FTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy92YnVzY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL3ZidXNjaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkYmJjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy92YnVzY2hhbm5lbC5oCkBAIC0wLDAgKzEsMTM1IEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WQlVTQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19WQlVTQ0hBTk5FTF9IX18KKworLyogIFRoZSB2YnVzIGNoYW5uZWwgaXMgdGhlIGNoYW5uZWwgYXJlYSBwcm92aWRlZCB2aWEgdGhlIEJVU19DUkVBVEUgY29udHJvbHZtCisgKiAgbWVzc2FnZSBmb3IgZWFjaCB2aXJ0dWFsIGJ1cy4gIFRoaXMgY2hhbm5lbCBhcmVhIGlzIHByb3ZpZGVkIHRvIGJvdGggc2VydmVyCisgKiAgYW5kIGNsaWVudCBlbmRzIG9mIHRoZSBidXMuICBUaGUgY2hhbm5lbCBoZWFkZXIgYXJlYSBpcyBpbml0aWFsaXplZCBieQorICogIHRoZSBzZXJ2ZXIsIGFuZCB0aGUgcmVtYWluaW5nIGluZm9ybWF0aW9uIGlzIGZpbGxlZCBpbiBieSB0aGUgY2xpZW50LgorICogIFdlIGN1cnJlbnRseSB1c2UgdGhpcyBmb3IgdGhlIGNsaWVudCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQKKyAqICB0aGUgY2xpZW50IGRldmljZXMgYW5kIGNsaWVudCBkcml2ZXJzIGZvciB0aGUgc2VydmVyIGVuZCB0byBzZWUuCisgKi8KKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgInZidXNkZXZpY2VpbmZvLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorCisvKiB7MTkzYjMzMWItYzU4Zi0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLworI2RlZmluZSBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfR1VJRCBcCisJezB4MTkzYjMzMWIsIDB4YzU4ZiwgMHgxMWRhLCBcCisJCXsweDk1LCAweGE5LCAweDAsIDB4ZTAsIDB4ODEsIDB4NjEsIDB4MTYsIDB4NWZ9IH0KK3N0YXRpYyBjb25zdCBHVUlEIFVsdHJhVmJ1c0NoYW5uZWxQcm90b2NvbEd1aWQgPQorCVVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEOworCisjZGVmaW5lIFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUKKworLyogTXVzdCBpbmNyZW1lbnQgdGhpcyB3aGVuZXZlciB5b3UgaW5zZXJ0IG9yIGRlbGV0ZSBmaWVsZHMgd2l0aGluIHRoaXMgY2hhbm5lbAorKiBzdHJ1Y3QuICBBbHNvIGluY3JlbWVudCB3aGVuZXZlciB5b3UgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGZpZWxkcyB3aXRoaW4gdGhpcworKiBjaGFubmVsIHN0cnVjdCBzbyBhcyB0byBicmVhayBwcmUtZXhpc3Rpbmcgc29mdHdhcmUuICBOb3RlIHRoYXQgeW91IGNhbgorKiB1c3VhbGx5IGFkZCBmaWVsZHMgdG8gdGhlIEVORCBvZiB0aGUgY2hhbm5lbCBzdHJ1Y3Qgd2l0aE9VVCBuZWVkaW5nIHRvCisqIGluY3JlbWVudCB0aGlzLiAqLworI2RlZmluZSBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEIDEKKworI2RlZmluZSBVTFRSQV9WQlVTX0NIQU5ORUxfT0tfQ0xJRU5UKHBDaGFubmVsLCBsb2dDdHgpICAgICAgIFwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsCQkJCVwKKwkJCQkgICAgVWx0cmFWYnVzQ2hhbm5lbFByb3RvY29sR3VpZCwJXAorCQkJCSAgICAidmJ1cyIsCQkJCVwKKwkJCQkgICAgc2l6ZW9mKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCksIFwKKwkJCQkgICAgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwgXAorCQkJCSAgICBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFLCBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKworI2RlZmluZSBVTFRSQV9WQlVTX0NIQU5ORUxfT0tfU0VSVkVSKGFjdHVhbEJ5dGVzLCBsb2dDdHgpICAgIFwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoVWx0cmFWYnVzQ2hhbm5lbFByb3RvY29sR3VpZCwJXAorCQkJCSAgICAidmJ1cyIsCQkJCVwKKwkJCQkgICAgc2l6ZW9mKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCksIFwKKwkJCQkgICAgYWN0dWFsQnl0ZXMsCQkJXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCQkvKiBib3RoIEdDQyBhbmQgVkMgbm93IGFsbG93IHRoaXMgcHJhZ21hICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfVkJVU19IRUFERVJJTkZPIHsKKwlVMzIgc3RydWN0Qnl0ZXM7CS8qIHNpemUgb2YgdGhpcyBzdHJ1Y3QgaW4gYnl0ZXMgKi8KKwlVMzIgZGV2aWNlSW5mb1N0cnVjdEJ5dGVzOwkvKiBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSAqLworCVUzMiBkZXZJbmZvQ291bnQ7CS8qIG51bSBvZiBpdGVtcyBpbiBEZXZJbmZvIG1lbWJlciAqLworCS8qICh0aGlzIGlzIHRoZSBhbGxvY2F0ZWQgc2l6ZSkgKi8KKwlVMzIgY2hwSW5mb0J5dGVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoaXMgc3RydWN0ICovCisJLyogdG8gdGhlIHRoZSBDaHBJbmZvIHN0cnVjdCAoYmVsb3cpICovCisJVTMyIGJ1c0luZm9CeXRlT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGlzIHN0cnVjdCAqLworCS8qIHRvIHRoZSB0aGUgQnVzSW5mbyBzdHJ1Y3QgKGJlbG93KSAqLworCVUzMiBkZXZJbmZvQnl0ZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgdGhpcyBzdHJ1Y3QgKi8KKwkvKiB0byB0aGUgdGhlIERldkluZm8gYXJyYXkgKGJlbG93KSAqLworCVU4IHJlc2VydmVkWzEwNF07Cit9IFVMVFJBX1ZCVVNfSEVBREVSSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCB7CisJVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCBDaGFubmVsSGVhZGVyOwkvKiBpbml0aWFsaXplZCBieSBzZXJ2ZXIgKi8KKwlVTFRSQV9WQlVTX0hFQURFUklORk8gSGRySW5mbzsJLyogaW5pdGlhbGl6ZWQgYnkgc2VydmVyICovCisJLyogdGhlIHJlbWFpbmRlciBvZiB0aGlzIGNoYW5uZWwgaXMgZmlsbGVkIGluIGJ5IHRoZSBjbGllbnQgKi8KKwlVTFRSQV9WQlVTX0RFVklDRUlORk8gQ2hwSW5mbzsJLyogZGVzY3JpYmVzIGNsaWVudCBjaGlwc2V0IGRldmljZSBhbmQKKwkJCQkJICogZHJpdmVyICovCisJVUxUUkFfVkJVU19ERVZJQ0VJTkZPIEJ1c0luZm87CS8qIGRlc2NyaWJlcyBjbGllbnQgYnVzIGRldmljZSBhbmQKKwkJCQkJICogZHJpdmVyICovCisJVUxUUkFfVkJVU19ERVZJQ0VJTkZPIERldkluZm9bMF07CS8qIGRlc2NyaWJlcyBjbGllbnQgZGV2aWNlIGFuZAorCQkJCQkJICogZHJpdmVyIGZvciAqLworCS8qIGVhY2ggZGV2aWNlIG9uIHRoZSBidXMgKi8KK30gVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MOworCisjZGVmaW5lIFZCVVNfQ0hfU0laRV9FWEFDVChNQVhERVZJQ0VTKSBcCisJKHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpICsgKChNQVhERVZJQ0VTKSAqIFwKKwkJCQkJCXNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pKSkKKyNkZWZpbmUgVkJVU19DSF9TSVpFKE1BWERFVklDRVMpIENPVkVSKFZCVVNfQ0hfU0laRV9FWEFDVChNQVhERVZJQ0VTKSwgNDA5NikKKworc3RhdGljIElOTElORSB2b2lkCitVTFRSQV9WQlVTX2luaXRfY2hhbm5lbChVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqeCwKKwkJCWludCBieXRlc0FsbG9jYXRlZCkKK3sKKwkvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBtZW1vcnkgYXQgPHg+IGRvZXMgTk9UIG5lY2Vzc2FyaWx5IGhhdmUgc3BhY2UKKwkqIGZvciBEZXZJbmZvIHN0cnVjdHMgYWxsb2NhdGVkIGF0IHRoZSBlbmQsIHdoaWNoIGlzIHdoeSB3ZSBkbyBOT1QgdXNlCisJKiA8Ynl0ZXNBbGxvY2F0ZWQ+IHRvIGNsZWFyLiAqLworCW1lbXNldF9pbyh4LCAwLCBzaXplb2YoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MKSk7CisJaWYgKGJ5dGVzQWxsb2NhdGVkIDwgKGludCkgc2l6ZW9mKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCkpCisJCXJldHVybjsKKwl3cml0ZWwoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwKKwkgICAgICAgJngtPkNoYW5uZWxIZWFkZXIuVmVyc2lvbklkKTsKKwl3cml0ZXEoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwKKwkgICAgICAgJngtPkNoYW5uZWxIZWFkZXIuU2lnbmF0dXJlKTsKKwl3cml0ZWwoQ0hBTk5FTFNSVl9SRUFEWSwgJngtPkNoYW5uZWxIZWFkZXIuU3J2U3RhdGUpOworCXdyaXRlbChzaXplb2YoeC0+Q2hhbm5lbEhlYWRlciksICZ4LT5DaGFubmVsSGVhZGVyLkhlYWRlclNpemUpOworCXdyaXRlcShieXRlc0FsbG9jYXRlZCwgJngtPkNoYW5uZWxIZWFkZXIuU2l6ZSk7CisJbWVtY3B5X3RvaW8oJngtPkNoYW5uZWxIZWFkZXIuVHlwZSwgJlVsdHJhVmJ1c0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCSAgICBzaXplb2YoeC0+Q2hhbm5lbEhlYWRlci5UeXBlKSk7CisJbWVtY3B5X3RvaW8oJngtPkNoYW5uZWxIZWFkZXIuWm9uZUd1aWQsICZHdWlkMCwKKwkJICAgIHNpemVvZih4LT5DaGFubmVsSGVhZGVyLlpvbmVHdWlkKSk7CisJd3JpdGVsKHNpemVvZihVTFRSQV9WQlVTX0hFQURFUklORk8pLCAmeC0+SGRySW5mby5zdHJ1Y3RCeXRlcyk7CisJd3JpdGVsKHNpemVvZihVTFRSQV9WQlVTX0hFQURFUklORk8pLCAmeC0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldCk7CisJd3JpdGVsKHJlYWRsKCZ4LT5IZHJJbmZvLmNocEluZm9CeXRlT2Zmc2V0KSArCisJICAgICAgIHNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pLAorCSAgICAgICAmeC0+SGRySW5mby5idXNJbmZvQnl0ZU9mZnNldCk7CisJd3JpdGVsKHJlYWRsKCZ4LT5IZHJJbmZvLmJ1c0luZm9CeXRlT2Zmc2V0KQorCSAgICAgICArIHNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pLAorCSAgICAgICAmeC0+SGRySW5mby5kZXZJbmZvQnl0ZU9mZnNldCk7CisJd3JpdGVsKHNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pLAorCSAgICAgICAmeC0+SGRySW5mby5kZXZpY2VJbmZvU3RydWN0Qnl0ZXMpOworCWJ5dGVzQWxsb2NhdGVkIC09IChzaXplb2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCkKKwkJCSAgICsgcmVhZGwoJngtPkhkckluZm8uZGV2SW5mb0J5dGVPZmZzZXQpKTsKKwl3cml0ZWwoYnl0ZXNBbGxvY2F0ZWQgLyByZWFkbCgmeC0+SGRySW5mby5kZXZpY2VJbmZvU3RydWN0Qnl0ZXMpLAorCSAgICAgICAmeC0+SGRySW5mby5kZXZJbmZvQ291bnQpOworfQorCisjcHJhZ21hIHBhY2socG9wKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzBkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGNvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogIERlZmluZXMgZm9yIGFsbCB2YWxpZCB2YWx1ZXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaGVhZGVyCisgKiAgY29tcGxldGlvblN0YXR1cyBmaWVsZC4gIFNlZSBjb250cm9sdm1jaGFubmVsLmggZm9yIGRlc2NyaXB0aW9uIG9mCisgKiAgdGhlIGhlYWRlcjogX0NPTlRST0xWTV9NRVNTQUdFX0hFQURFUi4KKyAqLworCisjaWZuZGVmIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18KKyNkZWZpbmUgX19DT05UUk9MVk1DT01QTEVUSU9OU1RBVFVTX0hfXworCisvKiBHZW5lcmFsIEVycm9ycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVswLTk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9VTktOT1dOICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfSU5WQUxJRF9GT1JfQ0xJRU5UICAgICAgNQorCisvKiBDT05UUk9MVk1fSU5JVF9DSElQU0VULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMDAtMTk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DTElFTlRfU1dJVENIQ09VTlRfTk9OWkVSTyAgICAgICAgIDEwMAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9FWFBFQ1RFRF9DSElQU0VUX0lOSVQgICAgICAgICAgICAgIDEwMQorCisvKiBNYXhpbXVtIExpbWl0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsyMDAtMjk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfQlVTRVMJCTIwMQkvKiBCVVNfQ1JFQVRFICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9ERVZJQ0VTICAgICAgICAyMDIJLyogREVWSUNFX0NSRUFURSAqLworLyogUGF5bG9hZCBhbmQgUGFyYW1ldGVyIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNDAwLTQ5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElECTQwMAkvKiBTV0lUQ0hfQVRUQUNIRVhUUE9SVCwKKwkJCQkJCQkgKiBERVZJQ0VfQ09ORklHVVJFICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0lOSVRJQVRPUl9QQVJBTUVURVJfSU5WQUxJRCA0MDEJLyogTXVsdGlwbGUgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVEFSR0VUX1BBUkFNRVRFUl9JTlZBTElEIDQwMiAvKiBERVZJQ0VfQ09ORklHVVJFICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NMSUVOVF9QQVJBTUVURVJfSU5WQUxJRCA0MDMgLyogREVWSUNFX0NPTkZJR1VSRSAqLworLyogU3BlY2lmaWVkW1BhY2tldCBTdHJ1Y3R1cmVdIFZhbHVlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs1MDAtNTk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRAk1MDAJLyogU1dJVENIX0FUVEFDSElOVFBPUlQsCisJCQkJCQkJICogQlVTX0NPTkZJR1VSRSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9DT05GSUcKKwkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRAk1MDEgLyogU1dJVENIX0FUVEFDSElOVFBPUlQgKi8KKwkJCQkJCSAgICAvKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJICAgICAqIERFVklDRV9DT05GSUdVUkUsCisJCQkJCQkgICAgICogREVWSUNFX0RFU1RST1kgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9JTlZBTElECTUwMiAvKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJICAgICAqIERFVklDRV9DT05GSUdVUkUgKi8KKy8qIFBhcnRpdGlvbiBEcml2ZXIgQ2FsbGJhY2sgSW50ZXJmYWNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs2MDAtNjk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFIDYwNAkvKiBCVVNfQ1JFQVRFLAorCQkJCQkJCSAqIEJVU19ERVNUUk9ZLAorCQkJCQkJCSAqIERFVklDRV9DUkVBVEUsCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kgKi8KKy8qIFVuYWJsZSB0byBpbnZva2UgVklSVFBDSSBjYWxsYmFjayAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDUgLyogQlVTX0NSRUFURSwKKwkJCQkJCQkJKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkJKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCQkqIERFVklDRV9ERVNUUk9ZICovCisvKiBWSVJUUENJIENhbGxiYWNrIHJldHVybmVkIGVycm9yICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0dFTkVSSUNfRFJJVkVSX0NBTExCQUNLX0VSUk9SIDYwNiAvKiBTV0lUQ0hfQVRUQUNIRVhUUE9SVCwKKwkJCQkJCQkJKiBTV0lUQ0hfREVUQUNIRVhUUE9SVAorCQkJCQkJCQkqIERFVklDRV9DT05GSUdVUkUgKi8KKworLyogZ2VuZXJpYyBkZXZpY2UgY2FsbGJhY2sgcmV0dXJuZWQgZXJyb3IgKi8KKy8qIEJ1cyBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzcwMC03OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19ERVZJQ0VfQVRUQUNIRUQgNzAwCS8qIEJVU19ERVNUUk9ZICovCisvKiBDaGFubmVsIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs4MDAtODk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTiA4MDAJLyogR0VUX0NIQU5ORUxJTkZPLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfU0laRV9UT09fU01BTEwgODAxCS8qIERFVklDRV9DUkVBVEUgKi8KKy8qIENoaXBzZXQgU2h1dGRvd24gUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMDAwLTEwOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU0hVVERPV05fRkFJTEVEICAgICAgICAgICAgMTAwMAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0FMUkVBRFlfQUNUSVZFICAgIDEwMDEKKworLyogQ2hpcHNldCBTdG9wIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzExMDAtMTE5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9CVVMgICAgICAgICAgICAxMTAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfU1dJVENIICAgICAgICAgMTEwMQorCisvKiBEZXZpY2UgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTQwMC0xNDk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfVURFVl9USU1FT1VUICAgICAgICAgICAgICAgIDE0MDAKKworI2VuZGlmIC8qIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18gbm90IGRlZmluZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9kaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjI5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oCkBAIC0wLDAgKzEsMzEwIEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmaWxlIGlzIHRvIGJlIHVzZWQgT05MWSBmb3IgZGVmaW5pbmcgZGlhZ25vc3RpYworICogc3Vic3lzdGVtIHZhbHVlcyBmb3IgdGhlIGFwcG9zIChzUEFSIExpbnV4IHNlcnZpY2UgcGFydGl0aW9ucykgY29tcG9uZW50LgorICovCisjaWZuZGVmIF9fQVBQT1NfU1VCU1lTVEVNU19IX18KKyNkZWZpbmUgX19BUFBPU19TVUJTWVNURU1TX0hfXworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitzdWJzeXNfdW5rbm93bl90b19zKGludCBzdWJzeXMsIGNoYXIgKnMsIGludCBuKQoreworCXNucHJpbnRmKHMsIG4sICJTVUJTWVMtJS0yLjJkIiwgc3Vic3lzKTsKKwlzW24gLSAxXSA9ICdcMCc7CisJcmV0dXJuIHM7Cit9CisKKyNkZWZpbmUgU1VCU1lTX1RPX01BU0soc3Vic3lzKSAgICAgICgxVUxMIDw8IChzdWJzeXMpKQorCisvKiBUaGUgZmlyc3QgU1VCU1lTX0FQUE9TX01BWCBzdWJzeXN0ZW1zIGFyZSB0aGUgc2FtZSBmb3IgZWFjaCBBcHBPUyB0eXBlCisgKiAoSU9WTSwgU01TLCBldGMuKSBUaGUgcmVzdCBoYXZlIHVuaXF1ZSB2YWx1ZXMgZm9yIGVhY2ggQXBwT1MgdHlwZS4KKyAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfTUFYIDE2CisKKyNkZWZpbmUJU1VCU1lTX0FQUE9TX0RFRkFVTFQgICAgICAgICAxCS8qIG9yICJvdGhlciIgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX0NISVBTRVQgICAgICAgICAyCS8qIGNvbnRyb2x2bSBhbmQgb3RoZXIgKi8KKwkJCQkJLyogbG93LWxldmVsIHNQQVIgYWN0aXZpdHkgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX0JVUyAgICAgICAgICAgICAzCS8qIHNQQVIgYnVzICovCisvKiBEQUsgI2RlZmluZSBTVUJTWVNfQVBQT1NfRElBRyAgICAgICAgICAgIDQgIC8vIGRpYWdub3N0aWNzIGFuZCBkdW1wICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19DSEFOTkVMQUNDRVNTICAgNQkvKiBnZW5lcmljIGNoYW5uZWwgYWNjZXNzICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19OSUNDTElFTlQgICAgICAgNgkvKiB2aXJ0dWFsIE5JQyBjbGllbnQgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX0hCQUNMSUVOVCAgICAgICA3CS8qIHZpcnR1YWwgSEJBIGNsaWVudCAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfQ09OU09MRVNFUklBTCAgIDgJLyogc1BBUiB2aXJ0dWFsIHNlcmlhbCBjb25zb2xlICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19VSVNMSUIgICAgICAgICAgOQkvKiAgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX1ZSVENVUEREICAgICAgIDEwCS8qICAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfV0FUQ0hET0cgICAgICAgMTEJLyogd2F0Y2hkb2cgdGltZXIgYW5kIGhlYWx0aGNoZWNrICovCisjZGVmaW5lIFNVQlNZU19BUFBPU18xMyAgICAgICAgICAgICAxMwkvKiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TXzE0ICAgICAgICAgICAgIDE0CS8qIGF2YWlsYWJsZSAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfMTUgICAgICAgICAgICAgMTUJLyogYXZhaWxhYmxlICovCisjZGVmaW5lIFNVQlNZU19BUFBPU18xNiAgICAgICAgICAgICAxNgkvKiBhdmFpbGFibGUgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqCitzdWJzeXNfZ2VuZXJpY190b19zKGludCBzdWJzeXMsIGNoYXIgKnMsIGludCBuKQoreworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTVUJTWVNfQVBQT1NfREVGQVVMVDoKKwkJc3RybmNweShzLCAiQVBQT1NfREVGQVVMVCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19DSElQU0VUOgorCQlzdHJuY3B5KHMsICJBUFBPU19DSElQU0VUIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX0JVUzoKKwkJc3RybmNweShzLCAiQVBQT1NfQlVTIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX0NIQU5ORUxBQ0NFU1M6CisJCXN0cm5jcHkocywgIkFQUE9TX0NIQU5ORUxBQ0NFU1MiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfTklDQ0xJRU5UOgorCQlzdHJuY3B5KHMsICJBUFBPU19OSUNDTElFTlQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfSEJBQ0xJRU5UOgorCQlzdHJuY3B5KHMsICJBUFBPU19IQkFDTElFTlQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfQ09OU09MRVNFUklBTDoKKwkJc3RybmNweShzLCAiQVBQT1NfQ09OU09MRVNFUklBTCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19VSVNMSUI6CisJCXN0cm5jcHkocywgIkFQUE9TX1VJU0xJQiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19WUlRDVVBERDoKKwkJc3RybmNweShzLCAiQVBQT1NfVlJUQ1VQREQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfV0FUQ0hET0c6CisJCXN0cm5jcHkocywgIkFQUE9TX1dBVENIRE9HIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TXzEzOgorCQlzdHJuY3B5KHMsICJBUFBPU18xMyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU18xNDoKKwkJc3RybmNweShzLCAiQVBQT1NfMTQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfMTU6CisJCXN0cm5jcHkocywgIkFQUE9TXzE1Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TXzE2OgorCQlzdHJuY3B5KHMsICJBUFBPU18xNiIsIG4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdWJzeXNfdW5rbm93bl90b19zKHN1YnN5cywgcywgbik7CisJCWJyZWFrOworCX0KKwlzW24gLSAxXSA9ICdcMCc7CisJcmV0dXJuIHM7Cit9CisKKy8qIENPTlNPTEUgKi8KKworI2RlZmluZSBTVUJTWVNfQ09OU09MRV9WSURFTyAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxKQkvKiAxNyAqLworI2RlZmluZSBTVUJTWVNfQ09OU09MRV9LQkRNT1UgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyKQkvKiAxOCAqLworI2RlZmluZSBTVUJTWVNfQ09OU09MRV8wNCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8wNSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA1KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8wNiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA2KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8wNyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA3KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8wOCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA4KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8wOSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA5KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xMCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxMCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTEgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTEpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzEyICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDEyKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xMyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxMykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTQgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTQpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzE1ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDE1KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xNiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxNikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTcgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTcpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzE4ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDE4KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xOSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxOSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjAgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjApCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzIxICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDIxKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yMiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyMikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjMgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjMpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzI0ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDI0KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yNSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyNSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjYpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzI3ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDI3KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yOCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyOCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjkgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjkpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzMwICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDMwKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zMSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzMSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzIgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzIpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzMzICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDMzKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zNCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzNCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzUgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzUpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzM2ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDM2KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zNyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzNykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzggICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzgpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzM5ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDM5KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80MCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0MCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDEgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDEpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzQyICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDQyKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80MyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0MykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDQgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDQpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzQ1ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDQ1KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80NiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0NikKKworc3RhdGljIGlubGluZSBjaGFyICoKK3N1YnN5c19jb25zb2xlX3RvX3MoaW50IHN1YnN5cywgY2hhciAqcywgaW50IG4pCit7CisJc3dpdGNoIChzdWJzeXMpIHsKKwljYXNlIFNVQlNZU19DT05TT0xFX1ZJREVPOgorCQlzdHJuY3B5KHMsICJDT05TT0xFX1ZJREVPIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfS0JETU9VOgorCQlzdHJuY3B5KHMsICJDT05TT0xFX0tCRE1PVSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzA0OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzA0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMDU6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMDUiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8wNjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8wNiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzA3OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzA3Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMDg6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMDgiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8wOToKKwkJc3RybmNweShzLCAiQ09OU09MRV8wOSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzEwOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzEwIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTE6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTEiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xMjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xMiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzEzOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzEzIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTQ6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xNToKKwkJc3RybmNweShzLCAiQ09OU09MRV8xNSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzE2OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzE2Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTc6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTciLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xODoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xOCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzE5OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzE5Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjA6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjAiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yMToKKwkJc3RybmNweShzLCAiQ09OU09MRV8yMSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzIyOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzIyIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjM6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjMiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yNDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8yNCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzI1OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzI1Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjY6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjYiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yNzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8yNyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzI4OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzI4Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjk6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjkiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zMDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zMCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzMxOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzMxIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzI6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zMzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zMyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzM0OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzM0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzU6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzUiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zNjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zNiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzM3OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzM3Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzg6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzgiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zOToKKwkJc3RybmNweShzLCAiQ09OU09MRV8zOSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQwOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQwIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfNDE6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfNDEiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80MjoKKwkJc3RybmNweShzLCAiQ09OU09MRV80MiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQzOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQzIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfNDQ6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfNDQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80NToKKwkJc3RybmNweShzLCAiQ09OU09MRV80NSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQ2OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQ2Iiwgbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN1YnN5c191bmtub3duX3RvX3Moc3Vic3lzLCBzLCBuKTsKKwkJYnJlYWs7CisJfQorCXNbbiAtIDFdID0gJ1wwJzsKKwlyZXR1cm4gczsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvaW92bWNhbGxfZ251Yy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2lvdm1jYWxsX2dudWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA0ZTlhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9pb3ZtY2FsbF9nbnVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogTGludXggR0NDIFZlcnNpb24gKDMyLWJpdCBhbmQgNjQtYml0KSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX3VuaXN5c192bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIHR1cGxlLCB1bnNpZ25lZCBsb25nIHJlZ19lYngsCisJCSAgICAgdW5zaWduZWQgbG9uZyByZWdfZWN4KQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKworCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7CisJY3B1aWQoMHgwMDAwMDAwMSwgJmNwdWlkX2VheCwgJmNwdWlkX2VieCwgJmNwdWlkX2VjeCwgJmNwdWlkX2VkeCk7CisJaWYgKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApIHsKKwkgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHgwMGYsIDB4MDAxLCAweDBjMSIgOiAiPWEiKHJlc3VsdCkgOgorCQkJCSAgICJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpCisJCQkJICAgICAgKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSAtMTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX3VuaXN5c19leHRlbmRlZF92bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIGxvbmcgdHVwbGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VieCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWN4LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lZHgpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCisJdW5zaWduZWQgaW50IGNwdWlkX2VheCwgY3B1aWRfZWJ4LCBjcHVpZF9lY3gsIGNwdWlkX2VkeDsKKwljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKKwlpZiAoY3B1aWRfZWN4ICYgMHg4MDAwMDAwMCkgeworCSAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6CisJCQkJICAgImEiKHR1cGxlKSwgImIiKHJlZ19lYngpLCAiYyIocmVnX2VjeCksCisJCQkJICAgImQiKHJlZ19lZHgpKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSAtMTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKKwl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmJ1c2RldmljZWluZm8uaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92YnVzZGV2aWNlaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzA4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmJ1c2RldmljZWluZm8uaApAQCAtMCwwICsxLDIwOSBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1ZCVVNERVZJQ0VJTkZPX0hfXworI2RlZmluZSBfX1ZCVVNERVZJQ0VJTkZPX0hfXworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCQkvKiBib3RoIEdDQyBhbmQgVkMgbm93IGFsbG93IHRoaXMgcHJhZ21hICovCisKKy8qIEFuIGFycmF5IG9mIHRoaXMgc3RydWN0IGlzIHByZXNlbnQgaW4gdGhlIGNoYW5uZWwgYXJlYSBmb3IgZWFjaCB2YnVzLgorICogKFNlZSB2YnVzY2hhbm5lbC5oLikKKyAqIEl0IGlzIGZpbGxlZCBpbiBieSB0aGUgY2xpZW50IHNpZGUgdG8gcHJvdmlkZSBpbmZvIGFib3V0IHRoZSBkZXZpY2UKKyAqIGFuZCBkcml2ZXIgZnJvbSB0aGUgY2xpZW50J3MgcGVyc3BlY3RpdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9WQlVTX0RFVklDRUlORk8geworCVU4IGRldlR5cGVbMTZdOwkJLyogc2hvcnQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UgdHlwZSAqLworCVU4IGRydk5hbWVbMTZdOwkJLyogZHJpdmVyIC5zeXMgZmlsZSBuYW1lICovCisJVTggaW5mb1N0cmluZ3NbOTZdOwkvKiBzZXF1ZW5jZSBvZiB0YWItZGVsaW1pdGVkIGlkIHN0cmluZ3M6ICovCisJLyogPERSSVZFUl9SRVY+IDxEUklWRVJfVkVSVEFHPiA8RFJJVkVSX0NPTVBJTEVUSU1FPiAqLworCVU4IHJlc2VydmVkWzEyOF07CS8qIHBhZCBzaXplIHRvIDI1NiBieXRlcyAqLworfSBVTFRSQV9WQlVTX0RFVklDRUlORk87CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKy8qIFJlYWRzIGNoYXJzIGZyb20gdGhlIGJ1ZmZlciBhdCA8c3JjPiBmb3IgPHNyY21heD4gYnl0ZXMsIGFuZCB3cml0ZXMgdG8KKyAqIHRoZSBidWZmZXIgYXQgPHA+LCB3aGljaCBpcyA8cmVtYWluPiBieXRlcyBsb25nLCBlbnN1cmluZyBuZXZlciB0bworICogb3ZlcmZsb3cgdGhlIGJ1ZmZlciBhdCA8cD4sIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgKiAtIHByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBhdCA8c3JjPiB0byB0aGUKKyAqICAgYnVmZmVyIGF0IDxwPgorICogLSBpbnRlcnZlbmluZyBzdHJlYWtzIG9mIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyIGF0IDxzcmM+CisgKiAgIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSBidWZmZXIgYXQgPHA+CisgKiBOb3RlIHRoYXQgd2UgcGF5IG5vIGF0dGVudGlvbiB0byAnXDAnLXRlcm1pbmF0aW9uLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgorICoKKyAqIFBhc3MgPHA+ID09IE5VTEwgYW5kIDxyZW1haW4+ID09IDAgZm9yIHRoaXMgc3BlY2lhbCBiZWhhdmlvci4gIEluIHRoaXMKKyAqIGNhc2UsIHdlIHNpbXBseSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IFdPVUxEIEhBVkUgYmVlbiB3cml0dGVuCisgKiB0byBhIGJ1ZmZlciBhdCA8cD4sIGhhZCBpdCBiZWVuIGluZmluaXRlbHkgYmlnLgorICovCitzdGF0aWMgaW5saW5lIGludAorVkJVU0NIQU5ORUxfc2FuaXRpemVfYnVmZmVyKGNoYXIgKnAsIGludCByZW1haW4sIGNoYXIgX19pb21lbSAqc3JjLCBpbnQgc3JjbWF4KQoreworCWludCBjaGFycyA9IDA7CisJaW50IG5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCXdoaWxlIChzcmNtYXggPiAwKSB7CisJCWlmICgocmVhZGIoc3JjKSA+PSAnICcpICYmIChyZWFkYihzcmMpIDwgMHg3ZikpIHsKKwkJCWlmIChub25wcmludGFibGVfc3RyZWFrKSB7CisJCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQkJKnAgPSAnICc7CisJCQkJCXArKzsKKwkJCQkJcmVtYWluLS07CisJCQkJCWNoYXJzKys7CisJCQkJfSBlbHNlIGlmIChwID09IE5VTEwpCisJCQkJCWNoYXJzKys7CisJCQkJbm9ucHJpbnRhYmxlX3N0cmVhayA9IDA7CisJCQl9CisJCQlpZiAocmVtYWluID4gMCkgeworCQkJCSpwID0gcmVhZGIoc3JjKTsKKwkJCQlwKys7CisJCQkJcmVtYWluLS07CisJCQkJY2hhcnMrKzsKKwkJCX0gZWxzZSBpZiAocCA9PSBOVUxMKQorCQkJCWNoYXJzKys7CisJCX0gZWxzZQorCQkJbm9ucHJpbnRhYmxlX3N0cmVhayA9IDE7CisJCXNyYysrOworCQlzcmNtYXgtLTsKKwl9CisJcmV0dXJuIGNoYXJzOworfQorCisjZGVmaW5lIFZCVVNDSEFOTkVMX0FEREFDSEFSKGNoLCBwLCByZW1haW4sIGNoYXJzKSBcCisJZG8gewkJCQkJICAgXAorCQlpZiAocmVtYWluIDw9IDApCQkgICBcCisJCQlicmVhazsJCQkgICBcCisJCSpwID0gY2g7CQkJICAgXAorCQlwKys7ICBjaGFycysrOyAgcmVtYWluLS07CSAgIFwKKwl9IHdoaWxlICgwKQorCisvKiBDb252ZXJ0cyB0aGUgbm9uLW5lZ2F0aXZlIHZhbHVlIGF0IDxudW0+IHRvIGFuIGFzY2lpIGRlY2ltYWwgc3RyaW5nCisgKiBhdCA8cD4sIHdyaXRpbmcgYXQgbW9zdCA8cmVtYWluPiBieXRlcy4gIE5vdGUgdGhlcmUgaXMgTk8gJ1wwJyB0ZXJtaW5hdGlvbgorICogd3JpdHRlbiB0byA8cD4uCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjcmVhdGUgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHdlIG5lZWQgdG8gZG8gdGhpcyBvcGVyYXRpb24gaW4KKyAqIGFuIGVudmlyb25tZW50LWluZGVwZW5kZW50IHdheSAoc2luY2Ugd2UgYXJlIGluIGEgY29tbW9uIGhlYWRlciBmaWxlKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1ZCVVNDSEFOTkVMX2l0b2EoY2hhciAqcCwgaW50IHJlbWFpbiwgaW50IG51bSkKK3sKKwlpbnQgZGlnaXRzID0gMDsKKwljaGFyIHNbMzJdOworCWludCBpOworCisJaWYgKG51bSA9PSAwKSB7CisJCS8qICcwJyBpcyBhIHNwZWNpYWwgY2FzZSAqLworCQlpZiAocmVtYWluIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJKnAgPSAnMCc7CisJCXJldHVybiAxOworCX0KKwkvKiBmb3JtIGEgYmFja3dhcmRzIGRlY2ltYWwgYXNjaWkgc3RyaW5nIGluIDxzPiAqLworCXdoaWxlIChudW0gPiAwKSB7CisJCWlmIChkaWdpdHMgPj0gKGludCkgc2l6ZW9mKHMpKQorCQkJcmV0dXJuIDA7CisJCXNbZGlnaXRzKytdID0gKG51bSAlIDEwKSArICcwJzsKKwkJbnVtID0gbnVtIC8gMTA7CisJfQorCWlmIChyZW1haW4gPCBkaWdpdHMpIHsKKwkJLyogbm90IGVub3VnaCByb29tIGxlZnQgYXQgPHA+IHRvIGhvbGQgbnVtYmVyLCBzbyBmaWxsIHdpdGgKKwkJICogJz8nICovCisJCWZvciAoaSA9IDA7IGkgPCByZW1haW47IGkrKywgcCsrKQorCQkJKnAgPSAnPyc7CisJCXJldHVybiByZW1haW47CisJfQorCS8qIHBsdWcgaW4gdGhlIGRlY2ltYWwgYXNjaWkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyLCBieSAqLworCS8qIHJldmVyc2luZyB0aGUgc3RyaW5nIHdlIGp1c3QgYnVpbHQgaW4gPHM+ICovCisJaSA9IGRpZ2l0czsKKwl3aGlsZSAoaSA+IDApIHsKKwkJaS0tOworCQkqcCA9IHNbaV07CisJCXArKzsKKwl9CisJcmV0dXJuIGRpZ2l0czsKK30KKworLyogUmVhZHMgPGRldkluZm8+LCBhbmQgY29udmVydHMgaXRzIGNvbnRlbnRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZyBhdCA8cD4sCisgKiB3cml0aW5nIGF0IG1vc3QgPHJlbWFpbj4gYnl0ZXMuICBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KKyAqIHdyaXR0ZW4gdG8gPHA+LgorICoKKyAqIFBhc3MgPGRldml4PiA+PSAwIGlmIHlvdSB3YW50IGEgZGV2aWNlIGluZGV4IHByZXNlbnRlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byA8cD4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitWQlVTQ0hBTk5FTF9kZXZJbmZvVG9TdHJpbmdCdWZmZXIoVUxUUkFfVkJVU19ERVZJQ0VJTkZPIF9faW9tZW0gKmRldkluZm8sCisJCQkJICBjaGFyICpwLCBpbnQgcmVtYWluLCBpbnQgZGV2aXgpCit7CisJY2hhciBfX2lvbWVtICpwc3JjOworCWludCBuc3JjLCB4LCBpLCBwYWQ7CisJaW50IGNoYXJzID0gMDsKKworCXBzcmMgPSAmKGRldkluZm8tPmRldlR5cGVbMF0pOworCW5zcmMgPSBzaXplb2YoZGV2SW5mby0+ZGV2VHlwZSk7CisJaWYgKFZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihOVUxMLCAwLCBwc3JjLCBuc3JjKSA8PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGVtaXQgZGV2aWNlIGluZGV4ICovCisJaWYgKGRldml4ID49IDApIHsKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJ1snLCBwLCByZW1haW4sIGNoYXJzKTsKKwkJeCA9IFZCVVNDSEFOTkVMX2l0b2EocCwgcmVtYWluLCBkZXZpeCk7CisJCXAgKz0geDsKKwkJcmVtYWluIC09IHg7CisJCWNoYXJzICs9IHg7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCddJywgcCwgcmVtYWluLCBjaGFycyk7CisJfSBlbHNlIHsKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwl9CisKKwkvKiBlbWl0IGRldmljZSB0eXBlICovCisJeCA9IFZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOworCXAgKz0geDsKKwlyZW1haW4gLT0geDsKKwljaGFycyArPSB4OworCXBhZCA9IDE1IC0geDsJCS8qIHBhZCBkZXZpY2UgdHlwZSB0byBiZSBleGFjdGx5IDE1IGNoYXJzICovCisJZm9yIChpID0gMDsgaSA8IHBhZDsgaSsrKQorCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisKKwkvKiBlbWl0IGRyaXZlciBuYW1lICovCisJcHNyYyA9ICYoZGV2SW5mby0+ZHJ2TmFtZVswXSk7CisJbnNyYyA9IHNpemVvZihkZXZJbmZvLT5kcnZOYW1lKTsKKwl4ID0gVkJVU0NIQU5ORUxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7CisJcCArPSB4OworCXJlbWFpbiAtPSB4OworCWNoYXJzICs9IHg7CisJcGFkID0gMTUgLSB4OwkJLyogcGFkIGRyaXZlciBuYW1lIHRvIGJlIGV4YWN0bHkgMTUgY2hhcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKworCS8qIGVtaXQgc3RyaW5ncyAqLworCXBzcmMgPSAmKGRldkluZm8tPmluZm9TdHJpbmdzWzBdKTsKKwluc3JjID0gc2l6ZW9mKGRldkluZm8tPmluZm9TdHJpbmdzKTsKKwl4ID0gVkJVU0NIQU5ORUxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7CisJcCArPSB4OworCXJlbWFpbiAtPSB4OworCWNoYXJzICs9IHg7CisJVkJVU0NIQU5ORUxfQUREQUNIQVIoJ1xuJywgcCwgcmVtYWluLCBjaGFycyk7CisKKwlyZXR1cm4gY2hhcnM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiMGViYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92ZXJzaW9uLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogdmVyc2lvbi5oICovCisKKy8qICBDb21tb24gdmVyc2lvbi9yZWxlYXNlIGluZm8gbmVlZGVkIGJ5IGFsbCBjb21wb25lbnRzIGdvZXMgaGVyZS4KKyAqICAoVGhpcyBmaWxlIG11c3QgY29tcGlsZSBjbGVhbmx5IGluIGFsbCBlbnZpcm9ubWVudHMuKQorICogIFVsdGltYXRlbHksIHRoaXMgd2lsbCBiZSBjb21iaW5lZCB3aXRoIGRlZmluZXMgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IGFzCisgKiAgcGFydCBvZiB0aGUgc3lzZ2VuLCBhbmQgc29tZSBvZiB0aGUgZGVmaW5lcyBiZWxvdyBtYXkgaW4gZmFjdCBlbmQgdXAKKyAqICBiZWluZyByZXBsYWNlZCB3aXRoIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBvbmVzLgorICovCisjaWZuZGVmIF9fVkVSU0lPTl9IX18KKyNkZWZpbmUgX19WRVJTSU9OX0hfXworCisjZGVmaW5lIFNQQVJWRVIxICIxIgorI2RlZmluZSBTUEFSVkVSMiAiMCIKKyNkZWZpbmUgU1BBUlZFUjMgIjAiCisjZGVmaW5lIFNQQVJWRVI0ICIwIgorCisjZGVmaW5lICBWRVJTSU9OICAgICAgICBTUEFSVkVSMSAiLiIgU1BBUlZFUjIgIi4iIFNQQVJWRVIzICIuIiBTUEFSVkVSNAorI2RlZmluZSAgVkVSU0lPTkRBVEUgICAgX19EQVRFX18KKworLyogSGVyZSBhcmUgdmFyaW91cyB2ZXJzaW9uIGZvcm1zIG5lZWRlZCBpbiBXaW5kb3dzIGVudmlyb25tZW50cy4KKyAqLworI2RlZmluZSBWSVNPUl9QUk9EVUNUVkVSU0lPTiAgICAgIFNQQVJWRVJDT01NQQorI2RlZmluZSBWSVNPUl9QUk9EVUNUVkVSU0lPTl9TVFIgIFNQQVJWRVIxICIuIiBTUEFSVkVSMiAiLiIgU1BBUlZFUjMgIi4iIFwKKwlTUEFSVkVSNAorI2RlZmluZSBWSVNPUl9PQkpFQ1RWRVJTSU9OX1NUUiAgIFNQQVJWRVIxICIsIiBTUEFSVkVSMiAiLCIgU1BBUlZFUjMgIiwiIFwKKwlTUEFSVkVSNAorCisjZGVmaW5lICBDT1BZUklHSFQgICAgICAiVW5pc3lzIENvcnBvcmF0aW9uIgorI2RlZmluZSAgQ09QWVJJR0hUREFURSAgIjIwMTAgLSAyMDEzIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92bWNhbGxpbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92bWNhbGxpbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM0MDQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZtY2FsbGludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTY3IEBACisvKiBDb3B5cmlnaHQgwqkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fSU9NT05JTlRGX0hfXworI2RlZmluZSBfX0lPTU9OSU5URl9IX18KKworLyoKKyogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBzdHJ1Y3R1cmVzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBWTUNBTExzIGZvciBJTworKiBWaXJ0dWFsaXphdGlvbi4gIFRoZSBWTUNBTExzIGFyZSBwcm92aWRlZCBieSBNb25pdG9yIGFuZCB1c2VkIGJ5IElPIGNvZGUKKyogcnVubmluZyBvbiBJTyBQYXJ0aXRpb25zLgorKi8KKworI2lmZGVmIF9fR05VQ19fCisjaW5jbHVkZSAiaW92bWNhbGxfZ251Yy5oIgorI2VuZGlmCS8qICAqLworI2luY2x1ZGUgImRpYWdjaGFubmVsLmgiCisKKyNpZmRlZiBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIKKyN1bmRlZiBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIKKyNlbmRpZgkvKiAgKi8KKworLyogZGVmaW5lIHN1YnN5c3RlbSBudW1iZXIgZm9yIEFwcE9TLCB1c2VkIGluIHVpc2xpYiBkcml2ZXIgICovCisjZGVmaW5lIE1EU19BUFBPUyAweDQwMDAwMDAwMDAwMDAwMDBMCS8qIHN1YnN5c3RlbSA9IDYyIC0gQXBwT1MgKi8KK3R5cGVkZWYgZW51bSB7CQkvKiBWTUNBTEwgaWRlbnRpZmljYXRpb24gdHVwbGVzICAqLworCSAgICAvKiBOb3RlOiB3aGVuIGEgbmV3IFZNQ0FMTCBpcyBhZGRlZDoKKwkgICAgICogLSB0aGUgMXN0IDIgaGV4IGRpZ2l0cyBjb3JyZXNwb25kIHRvIG9uZSBvZiB0aGUKKwkgICAgICogICBWTUNBTExfTU9OSVRPUl9JTlRFUkZBQ0UgdHlwZXMgYW5kCisJICAgICAqIC0gdGhlIG5leHQgMiBoZXggZGlnaXRzIGFyZSB0aGUgbnRoIHJlbGF0aXZlIGluc3RhbmNlIG9mIHdpdGhpbiBhCisJICAgICAqICAgdHlwZQorCSAgICAgKiBFLkcuIGZvciBWTUNBTExfVklSVFBBUlRfUkVDWUNMRV9QQVJULAorCSAgICAgKiAtIHRoZSAweDAyIGlkZW50aWZpZXMgaXQgYXMgYSBWTUNBTExfVklSVFBBUlQgdHlwZSBhbmQKKwkgICAgICogLSB0aGUgMHgwMSBpZGVudGlmaWVzIGl0IGFzIHRoZSAxc3QgaW5zdGFuY2Ugb2YgYSBWTUNBTExfVklSVFBBUlQKKwkgICAgICogICB0eXBlIG9mIFZNQ0FMTAorCSAgICAgKi8KKworCVZNQ0FMTF9JT19DT05UUk9MVk1fQUREUiA9IDB4MDUwMSwJLyogdXNlZCBieSBhbGwgR3Vlc3RzLCBub3QganVzdAorCQkJCQkJICogSU8gKi8KKwlWTUNBTExfSU9fRElBR19BRERSID0gMHgwNTA4LAorCVZNQ0FMTF9JT19WSVNPUlNFUklBTF9BRERSID0gMHgwNTA5LAorCVZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUID0gMHgwNzA4LCAvKiBBbGxvdyBjYWxsZXIgdG8KKwkJCQkJCQkgICogcXVlcnkgdmlydHVhbCB0aW1lCisJCQkJCQkJICAqIG9mZnNldCAqLworCVZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0ggPSAweDA3MDksCisJVk1DQUxMX1BPU1RfQ09ERV9MT0dFVkVOVCA9IDB4MDcwQiwJLyogTE9HRVZFTlQgUG9zdCBDb2RlIChSRFgpIHdpdGgKKwkJCQkJCSAqIHNwZWNpZmllZCBzdWJzeXN0ZW0gbWFzayAoUkNYCisJCQkJCQkgKiAtIG1vbml0b3Jfc3Vic3lzdGVtcy5oKSBhbmQKKwkJCQkJCSAqIHNldmVyaXR5IChSRFgpICovCisJVk1DQUxMX0dFTkVSSUNfU1VSUkVOREVSX1FVQU5UVU1fRk9SRVZFUiA9IDB4MDgwMiwgLyogWWllbGQgdGhlCisJCQkJCQkJICAgICogcmVtYWluZGVyICYgYWxsCisJCQkJCQkJICAgICogZnV0dXJlIHF1YW50dW1zIG9mCisJCQkJCQkJICAgICogdGhlIGNhbGxlciAqLworCVZNQ0FMTF9NRUFTVVJFTUVOVF9ET19OT1RISU5HID0gMHgwOTAxLAorCVZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRSA9IDB4MGEwMgkvKiBBbGxvdworCQkJCQkJICogVUxUUkFfU0VSVklDRV9DQVBBQklMSVRZX1RJTUUKKwkJCQkJCSAqIGNhcGFibGUgZ3Vlc3QgdG8gbWFrZQorCQkJCQkJICogVk1DQUxMICovCit9IFZNQ0FMTF9NT05JVE9SX0lOVEVSRkFDRV9NRVRIT0RfVFVQTEU7CisKKyNkZWZpbmUgVk1DQUxMX1NVQ0NFU1MgMAorI2RlZmluZSBWTUNBTExfU1VDQ0VTU0ZVTChyZXN1bHQpCShyZXN1bHQgPT0gMCkKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIHVuaXN5c192bWNhbGwodHVwbGUsIHJlZ19lYngsIHJlZ19lY3gpIFwKKwlfX3VuaXN5c192bWNhbGxfZ251Yyh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCkKKyNkZWZpbmUgdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbCh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeCkgXAorCV9fdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbF9nbnVjKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4LCByZWdfZWR4KQorI2RlZmluZSBJU1NVRV9JT19WTUNBTEwoSW50ZXJmYWNlTWV0aG9kLCBwYXJhbSwgcmVzdWx0KSBcCisJKHJlc3VsdCA9IHVuaXN5c192bWNhbGwoSW50ZXJmYWNlTWV0aG9kLCAocGFyYW0pICYgMHhGRkZGRkZGRiwJXAorCQkJCShwYXJhbSkgPj4gMzIpKQorI2RlZmluZSBJU1NVRV9JT19FWFRFTkRFRF9WTUNBTEwoSW50ZXJmYWNlTWV0aG9kLCBwYXJhbTEsIHBhcmFtMiwJXAorCQkJCSBwYXJhbTMsIHJlc3VsdCkJCQlcCisJKHJlc3VsdCA9IHVuaXN5c19leHRlbmRlZF92bWNhbGwoSW50ZXJmYWNlTWV0aG9kLCBwYXJhbTEsCVwKKwkJCQkJIHBhcmFtMiwgcGFyYW0zKSkKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgdXNlcyBWTUNBTExfUE9TVF9DT0RFX0xPR0VWRU5UIGludGVyZmFjZSBidXQgaXMgY3VycmVudGx5CisgICAgICogbm90IHVzZWQgbXVjaCAqLworI2RlZmluZSBJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdGNvZGUsIHNldmVyaXR5KQkJXAorZG8gewkJCQkJCQkJCVwKKwlVMzIgX3RlbXByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsJCQkJXAorCUlTU1VFX0lPX0VYVEVOREVEX1ZNQ0FMTChWTUNBTExfUE9TVF9DT0RFX0xPR0VWRU5ULCBzZXZlcml0eSwJXAorCQkJCSBNRFNfQVBQT1MsIHBvc3Rjb2RlLCBfdGVtcHJlc3VsdCk7CVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworLyogU3RydWN0dXJlcyBmb3IgSU8gVk1DQUxMcyAqLworCisvKiAvLy8vLy8vLy8vLy8vIEJFR0lOIFBSQUdNQSBQQUNLIFBVU0ggMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLy8vLy8vLy8vLy8vIE9OTFkgU1RSVUNUIFRZUEUgU0hPVUxEIEJFIEJFTE9XICovCisjcHJhZ21hIHBhY2socHVzaCwgMSkKK3N0cnVjdCBwaHlzX2luZm8geworCVU2NCBwaV9wZm47CisJVTE2IHBpX29mZjsKKwlVMTYgcGlfbGVuOworfTsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qIC8vLy8vLy8vLy8vLy8gRU5EIFBSQUdNQSBQQUNLIFBVU0ggMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KK3R5cGVkZWYgc3RydWN0IHBoeXNfaW5mbyBJT19EQVRBX1NUUlVDVFVSRTsKKworLyogLy8vLy8vLy8vLy8vLyBCRUdJTiBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8vLy8vLy8vLy8vLyBPTkxZIFNUUlVDVCBUWVBFIFNIT1VMRCBCRSBCRUxPVyAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisvKiBQYXJhbWV0ZXJzIHRvIFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUiBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IF9WTUNBTExfSU9fQ09OVFJPTFZNX0FERFJfUEFSQU1TIHsKKwkgICAgLyogVGhlIEd1ZXN0LXJlbGF0aXZlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIENvbnRyb2xWbSBjaGFubmVsLgorCSAgICAqIFRoaXMgVk1DYWxsIGZpbGxzIHRoaXMgaW4gd2l0aCB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzcy4gKi8KKwlVNjQgQ2hhbm5lbEFkZHJlc3M7CS8qIGNvbnRlbnRzIHByb3ZpZGVkIGJ5IHRoaXMgVk1DQUxMIChPVVQpICovCisJICAgIC8qIHRoZSBzaXplIG9mIHRoZSBDb250cm9sVm0gY2hhbm5lbCBpbiBieXRlcyBUaGlzIFZNQ2FsbCBmaWxscyB0aGlzCisJICAgICogaW4gd2l0aCB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzcy4gKi8KKwlVMzIgQ2hhbm5lbEJ5dGVzOwkvKiBjb250ZW50cyBwcm92aWRlZCBieSB0aGlzIFZNQ0FMTCAoT1VUKSAqLworCVU4IFVudXNlZFs0XTsJCS8qIFVudXNlZCBCeXRlcyBpbiB0aGUgNjQtQml0IEFsaWduZWQgU3RydWN0ICovCit9IFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUl9QQVJBTVM7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorLyogUGFyYW1ldGVycyB0byBWTUNBTExfSU9fRElBR19BRERSIGludGVyZmFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgX1ZNQ0FMTF9JT19ESUFHX0FERFJfUEFSQU1TIHsKKwkgICAgLyogVGhlIEd1ZXN0LXJlbGF0aXZlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGRpYWdub3N0aWMgY2hhbm5lbC4KKwkgICAgKiBUaGlzIFZNQ2FsbCBmaWxscyB0aGlzIGluIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MuICovCisJVTY0IENoYW5uZWxBZGRyZXNzOwkvKiBjb250ZW50cyBwcm92aWRlZCBieSB0aGlzIFZNQ0FMTCAoT1VUKSAqLworfSBWTUNBTExfSU9fRElBR19BRERSX1BBUkFNUzsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qIC8vLy8vLy8vLy8vLy8gRU5EIFBSQUdNQSBQQUNLIFBVU0ggMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworLyogLy8vLy8vLy8vLy8vLyBCRUdJTiBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8vLy8vLy8vLy8vLyBPTkxZIFNUUlVDVCBUWVBFIFNIT1VMRCBCRSBCRUxPVyAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisvKiBQYXJhbWV0ZXJzIHRvIFZNQ0FMTF9JT19WSVNPUlNFUklBTF9BRERSIGludGVyZmFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgX1ZNQ0FMTF9JT19WSVNPUlNFUklBTF9BRERSX1BBUkFNUyB7CisJICAgIC8qIFRoZSBHdWVzdC1yZWxhdGl2ZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZXJpYWwgY29uc29sZQorCSAgICAqIGNoYW5uZWwuICBUaGlzIFZNQ2FsbCBmaWxscyB0aGlzIGluIHdpdGggdGhlIGFwcHJvcHJpYXRlCisJICAgICogYWRkcmVzcy4gKi8KKwlVNjQgQ2hhbm5lbEFkZHJlc3M7CS8qIGNvbnRlbnRzIHByb3ZpZGVkIGJ5IHRoaXMgVk1DQUxMIChPVVQpICovCit9IFZNQ0FMTF9JT19WSVNPUlNFUklBTF9BRERSX1BBUkFNUzsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qIC8vLy8vLy8vLy8vLy8gRU5EIFBSQUdNQSBQQUNLIFBVU0ggMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworLyogUGFyYW1ldGVycyB0byBWTUNBTExfQ0hBTk5FTF9NSVNNQVRDSCBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IF9WTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUyB7CisJVTggQ2hhbm5lbE5hbWVbMzJdOwkvKiBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGdpdmluZyBuYW1lIG9mIGNoYW5uZWwKKwkJCQkgKiAoSU4pICovCisJVTggSXRlbU5hbWVbMzJdOwkvKiBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGdpdmluZyBuYW1lIG9mCisJCQkJICogbWlzbWF0Y2hlZCBpdGVtIChJTikgKi8KKwlVMzIgU291cmNlTGluZU51bWJlcjsJLyogbGluZSMgd2hlcmUgaW52b2tlZC4gKElOKSAqLworCVU4IFNvdXJjZUZpbGVOYW1lWzM2XTsJLyogc291cmNlIGNvZGUgd2hlcmUgaW52b2tlZCAtIE51bGwgdGVybWluYXRlZAorCQkJCSAqIHN0cmluZyAoSU4pICovCit9IFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0hfUEFSQU1TOworCisjZW5kaWYgLyogX19JT01PTklOVEZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY29tbW9udHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jb21tb250eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTJhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY29tbW9udHlwZXMuaApAQCAtMCwwICsxLDE3MCBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ09NTU9OVFlQRVNfSF8KKyNkZWZpbmUgX0NPTU1PTlRZUEVTX0hfCisKKy8qIGRlZmluZSB0aGUgZm9sbG93aW5nIHRvIHByZXZlbnQgaW5jbHVkZSBuZXN0aW5nIGluIGtlcm5lbCBoZWFkZXIgZmlsZXMgb2YKKyAqIHNpbWlsYXIgYWJyZXZpYXRlZCBjb250ZW50ICovCisjZGVmaW5lIF9TVVBFUlZJU09SX0NPTU1PTlRZUEVTX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2RlZmluZSBVOCAgdWludDhfdAorI2RlZmluZSBVMTYgdWludDE2X3QKKyNkZWZpbmUgVTMyIHVpbnQzMl90CisjZGVmaW5lIFU2NCB1aW50NjRfdAorI2RlZmluZSBTOCAgaW50OF90CisjZGVmaW5lIFMxNiBpbnQxNl90CisjZGVmaW5lIFMzMiBpbnQzMl90CisjZGVmaW5lIFM2NCBpbnQ2NF90CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisjZGVmaW5lIFVJTlROIFUzMgorI2Vsc2UKKyNkZWZpbmUgVUlOVE4gVTY0CisjZW5kaWYKKworI2Vsc2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIF9fV09SRFNJWkUgPT0gMzIKKyNkZWZpbmUgVUlOVE4gVTMyCisjZWxpZiBfX1dPUkRTSVpFID09IDY0CisjZGVmaW5lIFVJTlROIFU2NAorI2Vsc2UKKyNlcnJvciBVbnN1cHBvcnRlZCBfX1dPUkRTSVpFCisjZW5kaWYKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVMzIgZGF0YTE7CisJVTE2IGRhdGEyOworCVUxNiBkYXRhMzsKKwlVOCBkYXRhNFs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBHVUlEOworCisjaWZuZGVmIEdVSUQwCisjZGVmaW5lIEdVSUQwIHswLCAwLCAwLCB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0gfQorI2VuZGlmCit0eXBlZGVmIFU2NCBHVUVTVF9QSFlTSUNBTF9BRERSRVNTOworCisjZGVmaW5lIE1FTVNFVChwdHIsIHZhbCwgbGVuKSBtZW1zZXQocHRyLCB2YWwsIGxlbikKKyNkZWZpbmUgTUVNQ01QKG0xLCBtMiwgbGVuKSBtZW1jbXAobTEsIG0yLCBsZW4pCisjZGVmaW5lIE1FTUNNUF9JTyhtMSwgbTIsIGxlbikgbWVtY21wKCh2b2lkIF9fZm9yY2UgKiltMSwgbTIsIGxlbikKKyNkZWZpbmUgU1RSTEVOKHMpICgoVUlOVE4pc3RybGVuKChjb25zdCBjaGFyICopcykpCisjZGVmaW5lIFNUUkNQWShkLCBzKSAoc3RyY3B5KChjaGFyICopZCwgKGNvbnN0IGNoYXIgKilzKSkKKworI2RlZmluZSBJTkxJTkUgaW5saW5lCisjZGVmaW5lIE9GRlNFVE9GIG9mZnNldG9mCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIE1FTU9SWUJBUlJJRVIgbWIoKQorI2RlZmluZSBNRU1DUFkoZGVzdCwgc3JjLCBsZW4pIG1lbWNweShkZXN0LCBzcmMsIGxlbikKKyNkZWZpbmUgTUVNQ1BZX1RPSU8oZGVzdCwgc3JjLCBsZW4pIG1lbWNweV90b2lvKGRlc3QsIHNyYywgbGVuKQorI2RlZmluZSBNRU1DUFlfRlJPTUlPKGRlc3QsIHNyYywgbGVuKSBtZW1jcHlfZnJvbWlvKGRlc3QsIHNyYywgbGVuKQorCisjZGVmaW5lIENIQU5ORUxfR1VJRF9NSVNNQVRDSChjaFR5cGUsIGNoTmFtZSwgZmllbGQsIGV4cGVjdGVkLCBhY3R1YWwsIGZpbCwgXAorCQkJICAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdLCBzMls1MF0sIHMzWzUwXTsJCQkJXAorCQlwcl9lcnIoIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9JXMgYWN0dWFsPSVzIEAlczolZFxuIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgR1VJRF9mb3JtYXQyKCZleHBlY3RlZCwgczIpLCBHVUlEX2Zvcm1hdDIoJmFjdHVhbCwgczMpLCBcCisJCSAgICAgICBmaWwsIGxpbik7CQkJCQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ0hBTk5FTF9VMzJfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdOwkJCQkJCVwKKwkJcHJfZXJyKCJDaGFubmVsIG1pc21hdGNoIG9uIGNoYW5uZWw9JXMoJXMpIGZpZWxkPSVzIGV4cGVjdGVkPTB4JS04LjhseCBhY3R1YWw9MHglLTguOGx4IEAlczolZFxuIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpZXhwZWN0ZWQsICh1bnNpZ25lZCBsb25nKWFjdHVhbCwJXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hBTk5FTF9VNjRfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdOwkJCQkJCVwKKwkJcHJfZXJyKCJDaGFubmVsIG1pc21hdGNoIG9uIGNoYW5uZWw9JXMoJXMpIGZpZWxkPSVzIGV4cGVjdGVkPTB4JS04LjhMeCBhY3R1YWw9MHglLTguOEx4IEAlczolZFxuIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylleHBlY3RlZCwJCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFjdHVhbCwJCQlcCisJCSAgICAgICBmaWwsIGxpbik7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgRXZlbnRJZCwgU2V2ZXJpdHksIFN1YnN5c3RlbU1hc2ssIHBGdW5jdGlvbk5hbWUsIFwKKwkJICAgICAgTGluZU51bWJlciwgU3RyLCBhcmdzLi4uKQkJCQlcCisJcHJfaW5mbyhTdHIsICMjIGFyZ3MpCisKKyNlbHNlCisjZGVmaW5lIE1FTUNQWShkZXN0LCBzcmMsIGxlbikgbWVtY3B5KGRlc3QsIHNyYywgbGVuKQorCisjZGVmaW5lIE1FTU9SWUJBUlJJRVIgbWIoKQorCisjZGVmaW5lIENIQU5ORUxfR1VJRF9NSVNNQVRDSChjaFR5cGUsIGNoTmFtZSwgZmllbGQsIGV4cGVjdGVkLCBhY3R1YWwsIGZpbCwgXAorCQkJICAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdLCBzMls1MF0sIHMzWzUwXTsJCQkJXAorCQlzeXNsb2coTE9HX1VTRVIgfCBMT0dfRVJSLAkJCQlcCisJCSAgICAgICAiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0lcyBhY3R1YWw9JXMgQCVzOiVkIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgR1VJRF9mb3JtYXQyKCZleHBlY3RlZCwgczIpLCBHVUlEX2Zvcm1hdDIoJmFjdHVhbCwgczMpLCBcCisJCSAgICAgICBmaWwsIGxpbik7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOTkVMX1UzMl9NSVNNQVRDSChjaFR5cGUsIGNoTmFtZSwgZmllbGQsIGV4cGVjdGVkLCBhY3R1YWwsIGZpbCwgXAorCQkJICAgICBsaW4sIGxvZ0N0eCkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2hhciBzMVs1MF07CQkJCQkJXAorCQlzeXNsb2coTE9HX1VTRVIgfCBMT0dfRVJSLAkJCQlcCisJCSAgICAgICAiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0weCUtOC44bHggYWN0dWFsPTB4JS04LjhseCBAJXM6JWQiLCBcCisJCSAgICAgICBjaE5hbWUsIEdVSURfZm9ybWF0MigmY2hUeXBlLCBzMSksIGZpZWxkLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylleHBlY3RlZCwgKHVuc2lnbmVkIGxvbmcpYWN0dWFsLAlcCisJCSAgICAgICBmaWwsIGxpbik7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOTkVMX1U2NF9NSVNNQVRDSChjaFR5cGUsIGNoTmFtZSwgZmllbGQsIGV4cGVjdGVkLCBhY3R1YWwsIGZpbCwgXAorCQkJICAgICBsaW4sIGxvZ0N0eCkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2hhciBzMVs1MF07CQkJCQkJXAorCQlzeXNsb2coTE9HX1VTRVIgfCBMT0dfRVJSLAkJCQlcCisJCSAgICAgICAiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0weCUtOC44THggYWN0dWFsPTB4JS04LjhMeCBAJXM6JWQiLCBcCisJCSAgICAgICBjaE5hbWUsIEdVSURfZm9ybWF0MigmY2hUeXBlLCBzMSksIGZpZWxkLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWV4cGVjdGVkLAkJCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWN0dWFsLAkJCVwKKwkJICAgICAgIGZpbCwgbGluKTsJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVsdHJhTG9nRXZlbnQobG9nQ3R4LCBFdmVudElkLCBTZXZlcml0eSwgU3Vic3lzdGVtTWFzaywgcEZ1bmN0aW9uTmFtZSwgXAorCQkgICAgICBMaW5lTnVtYmVyLCBTdHIsIGFyZ3MuLi4pCQkJCVwKKwlzeXNsb2coTE9HX1VTRVIgfCBMT0dfSU5GTywgU3RyLCAjIyBhcmdzKQorI2VuZGlmCisKKyNkZWZpbmUgVm9sYXRpbGVCYXJyaWVyKCkgTUVNT1JZQkFSUklFUgorCisjZW5kaWYKKyNpbmNsdWRlICJndWlkdXRpbHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2RlODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1ZXN0bGludXhkZWJ1Zy5oCkBAIC0wLDAgKzEsMTgyIEBACisvKiBDb3B5cmlnaHQgwqkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fR1VFU1RMSU5VWERFQlVHX0hfXworI2RlZmluZSBfX0dVRVNUTElOVVhERUJVR19IX18KKworLyoKKyogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnRpbmcgaW50ZXJmYWNlIGZvciAidm1jYWxsaW50ZXJmYWNlLmgiLCBwYXJ0aWN1YXJseQorKiByZWdhcmRpbmcgYWRkaW5nIGFkZGl0aW9uYWwgc3RydWN0dXJlIGFuZCBmdW5jdGlvbmFsaXR5IHRvIGxpbnV4CisqIElTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWSAqLworCisKKy8qKioqKioqIElORk8gT04gSVNTVUVfUE9TVENPREVfTElOVVgoKSBCRUxPVyAqKioqKioqLworI2luY2x1ZGUgInZtY2FsbGludGVyZmFjZS5oIgordHlwZWRlZiBlbnVtIHsJCS8qIFBPU1RDT0RFIGRyaXZlciBpZGVudGlmaWVyIHR1cGxlcyAqLworCS8qIHZpc29yY2hpcHNldCBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9DSElQU0VUX1BDID0gMHhBMCwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9jID0gMHhBMSwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9jbTIgPSAweEEyLAorCVZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2RpcmVjdF9jID0gMHhBMywKKwlWSVNPUl9DSElQU0VUX1BDX2ZpbGVfYyA9IDB4QTQsCisJVklTT1JfQ0hJUFNFVF9QQ19wYXJzZXJfYyA9IDB4QTUsCisJVklTT1JfQ0hJUFNFVF9QQ190ZXN0aW5nX2MgPSAweEE2LAorCVZJU09SX0NISVBTRVRfUENfdmlzb3JjaGlwc2V0X21haW5fYyA9IDB4QTcsCisJVklTT1JfQ0hJUFNFVF9QQ192aXNvcnN3aXRjaGJ1c19jID0gMHhBOCwKKwkvKiB2aXNvcmJ1cyBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9CVVNfUEMgPSAweEIwLAorCVZJU09SX0JVU19QQ19idXNpbnN0X2F0dHJfYyA9IDB4QjEsCisJVklTT1JfQlVTX1BDX2NoYW5uZWxfYXR0cl9jID0gMHhCMiwKKwlWSVNPUl9CVVNfUENfZGV2bWFqb3JtaW5vcl9hdHRyX2MgPSAweEIzLAorCVZJU09SX0JVU19QQ192aXNvcmJ1c19tYWluX2MgPSAweEI0LAorCS8qIHZpc29yY2xpZW50YnVzIGRyaXZlciBmaWxlcyAqLworCVZJU09SX0NMSUVOVF9CVVNfUEMgPSAweEMwLAorCVZJU09SX0NMSUVOVF9CVVNfUENfdmlzb3JjbGllbnRidXNfbWFpbl9jID0gMHhDMSwKKwkvKiB2aXJ0IGhiYSBkcml2ZXIgZmlsZXMgKi8KKwlWSVJUX0hCQV9QQyA9IDB4QzIsCisJVklSVF9IQkFfUENfdmlydGhiYV9jID0gMHhDMywKKwkvKiB2aXJ0cGNpIGRyaXZlciBmaWxlcyAqLworCVZJUlRfUENJX1BDID0gMHhDNCwKKwlWSVJUX1BDSV9QQ192aXJ0cGNpX2MgPSAweEM1LAorCS8qIHZpcnRuaWMgZHJpdmVyIGZpbGVzICovCisJVklSVF9OSUNfUEMgPSAweEM2LAorCVZJUlRfTklDX1BfdmlydG5pY19jID0gMHhDNywKKwkvKiB1aXNsaWIgZHJpdmVyIGZpbGVzICovCisJVUlTTElCX1BDID0gMHhEMCwKKwlVSVNMSUJfUENfdWlzbGliX2MgPSAweEQxLAorCVVJU0xJQl9QQ191aXNxdWV1ZV9jID0gMHhEMiwKKwlVSVNMSUJfUENfdWlzdGhyZWFkX2MgPSAweEQzLAorCVVJU0xJQl9QQ191aXN1dGlsc19jID0gMHhENCwKK30gRFJJVkVSX1BDOworCit0eXBlZGVmIGVudW0gewkJCS8qIFBPU1RDT0RFIGV2ZW50IGlkZW50aWZpZXIgdHVwbGVzICovCisJQVRUQUNIX1BPUlRfRU5UUllfUEMgPSAweDAwMSwKKwlBVFRBQ0hfUE9SVF9GQUlMVVJFX1BDID0gMHgwMDIsCisJQVRUQUNIX1BPUlRfU1VDQ0VTU19QQyA9IDB4MDAzLAorCUJVU19GQUlMVVJFX1BDID0gMHgwMDQsCisJQlVTX0NSRUFURV9FTlRSWV9QQyA9IDB4MDA1LAorCUJVU19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MDA2LAorCUJVU19DUkVBVEVfRVhJVF9QQyA9IDB4MDA3LAorCUJVU19DT05GSUdVUkVfRU5UUllfUEMgPSAweDAwOCwKKwlCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMgPSAweDAwOSwKKwlCVVNfQ09ORklHVVJFX0VYSVRfUEMgPSAweDAwQSwKKwlDSElQU0VUX0lOSVRfRU5UUllfUEMgPSAweDAwQiwKKwlDSElQU0VUX0lOSVRfU1VDQ0VTU19QQyA9IDB4MDBDLAorCUNISVBTRVRfSU5JVF9GQUlMVVJFX1BDID0gMHgwMEQsCisJQ0hJUFNFVF9JTklUX0VYSVRfUEMgPSAweDAwRSwKKwlDUkVBVEVfV09SS1FVRVVFX1BDID0gMHgwMEYsCisJQ1JFQVRFX1dPUktRVUVVRV9GQUlMRURfUEMgPSAweDBBMCwKKwlDT05UUk9MVk1fSU5JVF9GQUlMVVJFX1BDID0gMHgwQTEsCisJREVWSUNFX0NSRUFURV9FTlRSWV9QQyA9IDB4MEEyLAorCURFVklDRV9DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEEzLAorCURFVklDRV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEE0LAorCURFVklDRV9DUkVBVEVfRVhJVF9QQyA9IDB4MEE1LAorCURFVklDRV9BRERfUEMgPSAweDBBNiwKKwlERVZJQ0VfUkVHSVNURVJfRkFJTFVSRV9QQyA9IDB4MEE3LAorCURFVklDRV9DSEFOR0VTVEFURV9FTlRSWV9QQyA9IDB4MEE4LAorCURFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDID0gMHgwQTksCisJREVWSUNFX0NIQU5HRVNUQVRFX0VYSVRfUEMgPSAweDBBQSwKKwlEUklWRVJfRU5UUllfUEMgPSAweDBBQiwKKwlEUklWRVJfRVhJVF9QQyA9IDB4MEFDLAorCU1BTExPQ19GQUlMVVJFX1BDID0gMHgwQUQsCisJUVVFVUVfREVMQVlFRF9XT1JLX1BDID0gMHgwQUUsCisJVUlTTElCX1RIUkVBRF9GQUlMVVJFX1BDID0gMHgwQjcsCisJVkJVU19DSEFOTkVMX0VOVFJZX1BDID0gMHgwQjgsCisJVkJVU19DSEFOTkVMX0ZBSUxVUkVfUEMgPSAweDBCOSwKKwlWQlVTX0NIQU5ORUxfRVhJVF9QQyA9IDB4MEJBLAorCVZIQkFfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQkIsCisJVkhCQV9DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEJDLAorCVZIQkFfQ1JFQVRFX0VYSVRfUEMgPSAweDBCRCwKKwlWSEJBX0NSRUFURV9TVUNDRVNTX1BDID0gMHgwQkUsCisJVkhCQV9DT01NQU5EX0hBTkRMRVJfUEMgPSAweDBCRiwKKwlWSEJBX1BST0JFX0VOVFJZX1BDID0gMHgwQzAsCisJVkhCQV9QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzEsCisJVkhCQV9QUk9CRV9FWElUX1BDID0gMHgwQzIsCisJVk5JQ19DUkVBVEVfRU5UUllfUEMgPSAweDBDMywKKwlWTklDX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQzQsCisJVk5JQ19DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEM1LAorCVZOSUNfUFJPQkVfRU5UUllfUEMgPSAweDBDNiwKKwlWTklDX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDNywKKwlWTklDX1BST0JFX0VYSVRfUEMgPSAweDBDOCwKKwlWUENJX0NSRUFURV9FTlRSWV9QQyA9IDB4MEM5LAorCVZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBDQSwKKwlWUENJX0NSRUFURV9FWElUX1BDID0gMHgwQ0IsCisJVlBDSV9QUk9CRV9FTlRSWV9QQyA9IDB4MENDLAorCVZQQ0lfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MENELAorCVZQQ0lfUFJPQkVfRVhJVF9QQyA9IDB4MENFLAorCUNSQVNIX0RFVl9FTlRSWV9QQyA9IDB4MENGLAorCUNSQVNIX0RFVl9FWElUX1BDID0gMHgwRDAsCisJQ1JBU0hfREVWX0hBRERSX05VTEwgPSAweDBEMSwKKwlDUkFTSF9ERVZfQ09OVFJPTFZNX05VTEwgPSAweDBEMiwKKwlDUkFTSF9ERVZfUkRfQlVTX0ZBSVVMUkVfUEMgPSAweDBEMywKKwlDUkFTSF9ERVZfUkRfREVWX0ZBSVVMUkVfUEMgPSAweDBENCwKKwlDUkFTSF9ERVZfQlVTX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ1LAorCUNSQVNIX0RFVl9ERVZfTlVMTF9GQUlMVVJFX1BDID0gMHgwRDYsCisJQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQyA9IDB4MEQ3LAorCUNSQVNIX0RFVl9DT1VOVF9GQUlMVVJFX1BDID0gMHgwRDgsCisJU0FWRV9NU0dfQlVTX0ZBSUxVUkVfUEMgPSAweDBEOSwKKwlTQVZFX01TR19ERVZfRkFJTFVSRV9QQyA9IDB4MERBLAorCUNBTExIT01FX0lOSVRfRkFJTFVSRV9QQyA9IDB4MERCCit9IEVWRU5UX1BDOworCisjaWZkZWYgX19HTlVDX18KKworI2RlZmluZSBQT1NUQ09ERV9TRVZFUklUWV9FUlIgRElBR19TRVZFUklUWV9FUlIKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfV0FSTklORyBESUFHX1NFVkVSSVRZX1dBUk5JTkcKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfSU5GTyBESUFHX1NFVkVSSVRZX1BSSU5UCS8qIFRPRE8tPiBJbmZvIGN1cnJlbnRseQorCQkJCQkJCSAqIGRvZXNudCBzaG93LCBzbyB3ZQorCQkJCQkJCSAqIHNldCBpbmZvPXdhcm5pbmcgKi8KKy8qIGV4YW1wbGUgY2FsbCBvZiBQT1NUQ09ERV9MSU5VWF8yKFZJU09SX0NISVBTRVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisgKiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgdGhlIHJlc3VsdGluZyBwb3N0Y29kZSBpcyBpbiBoZXgsIHNvIGlmIHlvdSBhcmUKKyAqIHNlYXJjaGluZyBmb3IgdGhlIF9fTElORV9fIG51bWJlciwgY29udmVydCBpdCBmaXJzdCB0byBkZWNpbWFsLiAgVGhlIGxpbmUKKyAqIG51bWJlciBjb21iaW5lZCB3aXRoIGRyaXZlciBhbmQgdHlwZSBvZiBjYWxsLCB3aWxsIGFsbG93IHlvdSB0byB0cmFjayBkb3duCisgKiBleGFjdGx5IHdoYXQgbGluZSBhbiBlcnJvciBvY2N1cmVkIG9uLCBvciB3aGVyZSB0aGUgbGFzdCBkcml2ZXIKKyAqIGVudGVyZWQvZXhpdGVkIGZyb20uCisgKi8KKworLyogQkFTRSBGVU5DVElPTlMgKi8KKyNkZWZpbmUgUE9TVENPREVfTElOVVhfQShEUklWRVJfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJXAorZG8gewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgcG9zdF9jb2RlX3RlbXA7CQkJCVwKKwlwb3N0X2NvZGVfdGVtcCA9ICgoKFU2NClEUklWRVJfUEMpIDw8IDU2KSB8ICgoKFU2NClFVkVOVF9QQykgPDwgNDQpIHwgXAorCQkoKCgoVTY0KV9fTElORV9fKSAmIDB4RkZGKSA8PCAzMikgfAkJCVwKKwkJKCgoVTY0KXBjMzJiaXQpICYgMHhGRkZGRkZGRik7CQkJCVwKKwlJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdF9jb2RlX3RlbXAsIHNldmVyaXR5KTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF9CKERSSVZFUl9QQywgRVZFTlRfUEMsIHBjMTZiaXQxLCBwYzE2Yml0Miwgc2V2ZXJpdHkpIFwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHBvc3RfY29kZV90ZW1wOwkJCQlcCisJcG9zdF9jb2RlX3RlbXAgPSAoKChVNjQpRFJJVkVSX1BDKSA8PCA1NikgfCAoKChVNjQpRVZFTlRfUEMpIDw8IDQ0KSB8IFwKKwkJKCgoKFU2NClfX0xJTkVfXykgJiAweEZGRikgPDwgMzIpIHwJCQlcCisJCSgoKChVNjQpcGMxNmJpdDEpICYgMHhGRkZGKSA8PCAxNikgfAkJCVwKKwkJKCgoVTY0KXBjMTZiaXQyKSAmIDB4RkZGRik7CQkJCVwKKwlJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdF9jb2RlX3RlbXAsIHNldmVyaXR5KTsJXAorfSB3aGlsZSAoMCkKKworLyogTU9TVCBDT01NT04gKi8KKyNkZWZpbmUgUE9TVENPREVfTElOVVhfMihFVkVOVF9QQywgc2V2ZXJpdHkpCQkJCVwKKwlQT1NUQ09ERV9MSU5VWF9BKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIDB4MDAwMCwgc2V2ZXJpdHkpOworCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzMoRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQkJCVwKKwlQT1NUQ09ERV9MSU5VWF9BKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KTsKKworCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzQoRVZFTlRfUEMsIHBjMTZiaXQxLCBwYzE2Yml0Miwgc2V2ZXJpdHkpCVwKKwlQT1NUQ09ERV9MSU5VWF9CKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIHBjMTZiaXQxLAkJXAorCQkJIHBjMTZiaXQyLCBzZXZlcml0eSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3VpZHV0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3VpZHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjYWY5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWlkdXRpbHMuaApAQCAtMCwwICsxLDIwMyBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogZ3VpZHV0aWxzLmgKKyAqCisgKiBUaGVzZSBhcmUgR1VJRCBtYW5pcHVsYXRpb24gaW5saW5lcyB0aGF0IGNhbiBiZSB1c2VkIGZyb20gZWl0aGVyCisgKiBrZXJuZWwtbW9kZSBvciB1c2VyLW1vZGUuCisgKgorICovCisjaWZuZGVmIF9fR1VJRFVUSUxTX0hfXworI2RlZmluZSBfX0dVSURVVElMU19IX18KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2RlZmluZSBHVUlEX1NUUlRPVUwga3N0cnRvdWwKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIEdVSURfU1RSVE9VTCBzdHJ0b3VsCisjZW5kaWYKKworc3RhdGljIGlubGluZSBjaGFyICoKK0dVSURfZm9ybWF0MShjb25zdCBHVUlEICpndWlkLCBjaGFyICpzKQoreworCXNwcmludGYocywgInslLTguOGx4LSUtNC40eC0lLTQuNHgtJS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4fSIsCisJCSh1bG9uZykgZ3VpZC0+ZGF0YTEsCisJCWd1aWQtPmRhdGEyLAorCQlndWlkLT5kYXRhMywKKwkJZ3VpZC0+ZGF0YTRbMF0sCisJCWd1aWQtPmRhdGE0WzFdLAorCQlndWlkLT5kYXRhNFsyXSwKKwkJZ3VpZC0+ZGF0YTRbM10sCisJCWd1aWQtPmRhdGE0WzRdLCBndWlkLT5kYXRhNFs1XSwgZ3VpZC0+ZGF0YTRbNl0sIGd1aWQtPmRhdGE0WzddKTsKKwlyZXR1cm4gczsKK30KKworLyoqIEZvcm1hdCBhIEdVSUQgaW4gTWljcm9zb2Z0J3MgJ3doYXQgaW4gdGhlIHdvcmxkIHdlcmUgdGhleSB0aGlua2luZycKKyAqICBmb3JtYXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqCitHVUlEX2Zvcm1hdDIoY29uc3QgR1VJRCAqZ3VpZCwgY2hhciAqcykKK3sKKwlzcHJpbnRmKHMsICJ7JS04LjhseC0lLTQuNHgtJS00LjR4LSUtMi4yeCUtMi4yeC0lLTIuMnglLTIuMnglLTIuMnglLTIuMnglLTIuMnglLTIuMnh9IiwKKwkJKHVsb25nKSBndWlkLT5kYXRhMSwKKwkJZ3VpZC0+ZGF0YTIsCisJCWd1aWQtPmRhdGEzLAorCQlndWlkLT5kYXRhNFswXSwKKwkJZ3VpZC0+ZGF0YTRbMV0sCisJCWd1aWQtPmRhdGE0WzJdLAorCQlndWlkLT5kYXRhNFszXSwKKwkJZ3VpZC0+ZGF0YTRbNF0sIGd1aWQtPmRhdGE0WzVdLCBndWlkLT5kYXRhNFs2XSwgZ3VpZC0+ZGF0YTRbN10pOworCXJldHVybiBzOworfQorCisvKioKKyAqIExpa2UgR1VJRF9mb3JtYXQyIGJ1dCB3aXRob3V0IHRoZSBjdXJseSBicmFjZXMgYW5kIHRoZQorICogaGV4IGRpZ2l0cyBpbiB1cHBlciBjYXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqCitHVUlEX2Zvcm1hdDMoY29uc3QgR1VJRCAqZ3VpZCwgY2hhciAqcykKK3sKKwlzcHJpbnRmKHMsICIlLTguOGxYLSUtNC40WC0lLTQuNFgtJS0yLjJYJS0yLjJYLSUtMi4yWCUtMi4yWCUtMi4yWCUtMi4yWCUtMi4yWCUtMi4yWCIsCisJCSh1bG9uZykgZ3VpZC0+ZGF0YTEsCisJCWd1aWQtPmRhdGEyLAorCQlndWlkLT5kYXRhMywKKwkJZ3VpZC0+ZGF0YTRbMF0sCisJCWd1aWQtPmRhdGE0WzFdLAorCQlndWlkLT5kYXRhNFsyXSwKKwkJZ3VpZC0+ZGF0YTRbM10sCisJCWd1aWQtPmRhdGE0WzRdLCBndWlkLT5kYXRhNFs1XSwgZ3VpZC0+ZGF0YTRbNl0sIGd1aWQtPmRhdGE0WzddKTsKKwlyZXR1cm4gczsKK30KKworLyoqIFBhcnNlIGEgZ3VpZCBzdHJpbmcgaW4gYW55IG9mIHRoZXNlIGZvcm1zOgorICogICAgICB7MTExMTExMTEtMjIyMi0zMzMzLTQ0NTUtNjY3Nzg4OTlhYWJifQorICogICAgICB7MTExMTExMTEtMjIyMi0zMzMzLTQ0NTU2Njc3ODg5OWFhYmJ9CisgKiAgICAgIDExMTExMTExLTIyMjItMzMzMy00NDU1LTY2Nzc4ODk5YWFiYgorICogICAgICAxMTExMTExMS0yMjIyLTMzMzMtNDQ1NTY2Nzc4ODk5YWFiYgorICovCitzdGF0aWMgaW5saW5lIEdVSUQKK0dVSURfc2NhbihVOCAqcCkKK3sKKwlHVUlEIGd1aWQgPSBHVUlEMDsKKwlVOCB4WzMzXTsKKwlpbnQgY291bnQgPSAwOworCWludCBjLCBpID0gMDsKKwlVOCBjZGF0YTFbOV07CisJVTggY2RhdGEyWzVdOworCVU4IGNkYXRhM1s1XTsKKwlVOCBjZGF0YTRbM107CisJaW50IGRhc2hjb3VudCA9IDA7CisJaW50IGJyYWNlID0gMDsKKwl1bnNpZ25lZCBsb25nIHVsZGF0YTsKKworCWlmICghcCkKKwkJcmV0dXJuIGd1aWQ7CisJaWYgKCpwID09ICd7JykgeworCQlwKys7CisJCWJyYWNlID0gMTsKKwl9CisJd2hpbGUgKGNvdW50IDwgMzIpIHsKKwkJaWYgKCpwID09ICd9JykKKwkJCXJldHVybiBndWlkOworCQlpZiAoKnAgPT0gJ1wwJykKKwkJCXJldHVybiBndWlkOworCQljID0gdG91cHBlcigqcCk7CisJCXArKzsKKwkJaWYgKGMgPT0gJy0nKSB7CisJCQlzd2l0Y2ggKGRhc2hjb3VudCkgeworCQkJY2FzZSAwOgorCQkJCWlmIChpICE9IDgpCisJCQkJCXJldHVybiBndWlkOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWlmIChpICE9IDQpCisJCQkJCXJldHVybiBndWlkOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWlmIChpICE9IDQpCisJCQkJCXJldHVybiBndWlkOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlmIChpICE9IDQpCisJCQkJCXJldHVybiBndWlkOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZ3VpZDsKKwkJCX0KKwkJCWRhc2hjb3VudCsrOworCQkJaSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnRicpKQorCQkJaSsrOworCQllbHNlCisJCQlyZXR1cm4gZ3VpZDsKKwkJeFtjb3VudCsrXSA9IGM7CisJfQorCXhbY291bnRdID0gJ1wwJzsKKwlpZiAoYnJhY2UpIHsKKwkJaWYgKCpwID09ICd9JykKKwkJCXArKzsKKwkJZWxzZQorCQkJcmV0dXJuIGd1aWQ7CisJfQorCWlmIChkYXNoY291bnQgPT0gMyB8fCBkYXNoY291bnQgPT0gNCkKKwkJOworCWVsc2UKKwkJcmV0dXJuIGd1aWQ7CisJbWVtc2V0KGNkYXRhMSwgMCwgc2l6ZW9mKGNkYXRhMSkpOworCW1lbXNldChjZGF0YTIsIDAsIHNpemVvZihjZGF0YTIpKTsKKwltZW1zZXQoY2RhdGEzLCAwLCBzaXplb2YoY2RhdGEzKSk7CisJbWVtc2V0KGNkYXRhNCwgMCwgc2l6ZW9mKGNkYXRhNCkpOworCW1lbWNweShjZGF0YTEsIHggKyAwLCA4KTsKKwltZW1jcHkoY2RhdGEyLCB4ICsgOCwgNCk7CisJbWVtY3B5KGNkYXRhMywgeCArIDEyLCA0KTsKKworCWlmIChHVUlEX1NUUlRPVUwoKGNoYXIgKikgY2RhdGExLCAxNiwgJnVsZGF0YSkgPT0gMCkKKwkJZ3VpZC5kYXRhMSA9IChVMzIpdWxkYXRhOworCWlmIChHVUlEX1NUUlRPVUwoKGNoYXIgKikgY2RhdGEyLCAxNiwgJnVsZGF0YSkgPT0gMCkKKwkJZ3VpZC5kYXRhMiA9IChVMTYpdWxkYXRhOworCWlmIChHVUlEX1NUUlRPVUwoKGNoYXIgKikgY2RhdGEzLCAxNiwgJnVsZGF0YSkgPT0gMCkKKwkJZ3VpZC5kYXRhMyA9IChVMTYpdWxkYXRhOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQltZW1jcHkoY2RhdGE0LCB4ICsgMTYgKyAoaSAqIDIpLCAyKTsKKwkJaWYgKEdVSURfU1RSVE9VTCgoY2hhciAqKSBjZGF0YTQsIDE2LCAmdWxkYXRhKSA9PSAwKQorCQkJZ3VpZC5kYXRhNFtpXSA9IChVOCkgdWxkYXRhOworCX0KKworCXJldHVybiBndWlkOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorR1VJRF9zYW5pdGl6ZShjaGFyICppbnB1dEd1aWRTdHIsIGNoYXIgKm91dHB1dEd1aWRTdHIpCit7CisJR1VJRCBnOworCUdVSUQgZ3VpZDAgPSBHVUlEMDsKKwkqb3V0cHV0R3VpZFN0ciA9ICdcMCc7CisJZyA9IEdVSURfc2NhbigoVTggKikgaW5wdXRHdWlkU3RyKTsKKwlpZiAobWVtY21wKCZnLCAmZ3VpZDAsIHNpemVvZihHVUlEKSkgPT0gMCkKKwkJcmV0dXJuIG91dHB1dEd1aWRTdHI7CS8qIGJhZCBHVUlEIGZvcm1hdCAqLworCXJldHVybiBHVUlEX2Zvcm1hdDEoJmcsIG91dHB1dEd1aWRTdHIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wZXJpb2RpY193b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzE5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIHBlcmlvZGljX3dvcmsuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1BFUklPRElDX1dPUktfSF9fCisjZGVmaW5lIF9fUEVSSU9ESUNfV09SS19IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKworCisvKiBQRVJJT0RJQ19XT1JLIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdG8gdXNlcnMuCisgKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBQRVJJT0RJQ19XT1JLX1RhZyBQRVJJT0RJQ19XT1JLOworCitQRVJJT0RJQ19XT1JLICp2aXNvcl9wZXJpb2RpY193b3JrX2NyZWF0ZSh1bG9uZyBqaWZmeV9pbnRlcnZhbCwKKwkJCQkJICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlLAorCQkJCQkgIHZvaWQgKCp3b3JrZnVuYykodm9pZCAqKSwKKwkJCQkJICB2b2lkICp3b3JrZnVuY2FyZywKKwkJCQkJICBjb25zdCBjaGFyICpkZXZuYW0pOwordm9pZCAgICAgICAgICAgIHZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveShQRVJJT0RJQ19XT1JLICpwZXJpb2RpY193b3JrKTsKK0JPT0wgICAgICAgICAgICB2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QoUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayk7CitCT09MICAgICAgICAgICAgdmlzb3JfcGVyaW9kaWNfd29ya19zdGFydChQRVJJT0RJQ19XT1JLICpwZXJpb2RpY193b3JrKTsKK0JPT0wgICAgICAgICAgICB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcHJvY29iamVjdHRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODFkMTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKQEAgLTAsMCArMSw0OCBAQAorLyogcHJvY29iamVjdHRyZWUuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoqIEBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlcyBuZWNlc3NhcnkgZm9yIGNyZWF0aW5nIGEgdHJlZSBvZiB0eXBlcywKKyAqICBvYmplY3RzLCBhbmQgcHJvcGVydGllcyBpbiAvcHJvYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1BST0NPQkpFQ1RUUkVFX0hfXworI2RlZmluZSBfX1BST0NPQkpFQ1RUUkVFX0hfXworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKy8qIFRoZXNlIGFyZSBvcGFxdWUgc3RydWN0dXJlcyB0byB1c2Vycy4KKyAqIEZpZWxkcyBhcmUgZGVjbGFyZWQgb25seSBpbiB0aGUgaW1wbGVtZW50YXRpb24gLmMgZmlsZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1ZUFJPQ09CSkVDVF9UYWcgTVlQUk9DT0JKRUNUOwordHlwZWRlZiBzdHJ1Y3QgTVlQUk9DVFlQRV9UYWcgICBNWVBST0NUWVBFOworCitNWVBST0NPQkpFQ1QgKnZpc29yX3Byb2NfQ3JlYXRlT2JqZWN0KE1ZUFJPQ1RZUEUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgdm9pZCAqY29udGV4dCk7Cit2b2lkICAgICAgICAgIHZpc29yX3Byb2NfRGVzdHJveU9iamVjdChNWVBST0NPQkpFQ1QgKm9iaik7CitNWVBST0NUWVBFICAgKnZpc29yX3Byb2NfQ3JlYXRlVHlwZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NSb290RGlyLAorCQkJCSAgICBjb25zdCBjaGFyICoqbmFtZSwKKwkJCQkgICAgY29uc3QgY2hhciAqKnByb3BlcnR5TmFtZXMsCisJCQkJICAgIHZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKKwkJCQkJCQkgIHZvaWQgKiwgaW50KSk7Cit2b2lkICAgICAgICAgIHZpc29yX3Byb2NfRGVzdHJveVR5cGUoTVlQUk9DVFlQRSAqdHlwZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3NwYXJzdG9wLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvc3BhcnN0b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjAzYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3NwYXJzdG9wLmgKQEAgLTAsMCArMSwzMCBAQAorLyogc3BhcnN0b3AuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NQQVJTVE9QX0hfXworI2RlZmluZSBfX1NQQVJTVE9QX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKwordHlwZWRlZiB2b2lkICgqU1BBUlNUT1BfQ09NUExFVEVfRlVOQykgKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpOworCitpbnQgc3Bfc3RvcCh2b2lkICpjb250ZXh0LCBTUEFSU1RPUF9DT01QTEVURV9GVU5DIGdldF9jb21wbGV0ZV9mdW5jKTsKK3ZvaWQgdGVzdF9yZW1vdmVfc3RvcF9kZXZpY2Uodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdGltc2ttb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ1YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qIHRpbXNrbW9kLmgKKyAqCisgKiBDb3B5cmlnaHQg77+9IDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1RJTVNLTU9EX0hfXworI2RlZmluZSBfX1RJTVNLTU9EX0hfXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKy8qICNkZWZpbmUgRVhQT1JUX1NZTVRBQiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisvKiAjZGVmaW5lIERFQlVHICovCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCAgICBpbnQKKyNlbmRpZgorI2RlZmluZSBGQUxTRSAgIDAKKyNkZWZpbmUgVFJVRSAgICAxCisjaWYgIWRlZmluZWQgU1VDQ0VTUworI2RlZmluZSBTVUNDRVNTIDAKKyNlbmRpZgorI2RlZmluZSBGQUlMVVJFICgtMSkKKyNkZWZpbmUgRFJJVkVSTkFNRU1BWCA1MAorI2RlZmluZSBNSU4oYSwgYikgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUFYKGEsIGIpICAgICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIFNUUlVDVFNFUVVBTCh4LCB5KSAobWVtY21wKCZ4LCAmeSwgc2l6ZW9mKHgpKSA9PSAwKQorI2lmbmRlZiBIT1NUQUREUkVTUworI2RlZmluZSBIT1NUQUREUkVTUyB1bnNpZ25lZCBsb25nIGxvbmcKKyNlbmRpZgorCit0eXBlZGVmIGxvbmcgVk1NSU87ICAvKio8IFZpcnR1YWwgTU1JTyBhZGRyZXNzIChyZXR1cm5lZCBmcm9tIGlvcmVtYXApLCB3aGljaAorICAgICogICBpcyBhIHZpcnR1YWwgYWRkcmVzcyBwb2ludGVyIHRvIGEgbWVtb3J5LW1hcHBlZCByZWdpb24uCisgICAgKiAgIFRoZXNlIGFyZSBkZWNsYXJlZCBhcyAibG9uZyIgaW5zdGVhZCBvZiB1MzIqIHRvIGZvcmNlIHlvdSB0bworICAgICogICB1c2UgcmVhZGIoKS93cml0ZWIoKS9tZW1jcHlfZnJvbWlvKCkvZXRjIHRvIGFjY2VzcyB0aGVtLgorICAgICogICAoT24geDg2IHdlIGNvdWxkIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdHJlYXRpbmcgdGhlbSBhcworICAgICogICBwb2ludGVycy4pCisgICAgKi8KK3R5cGVkZWYgbG9uZyBWTU1JTzg7IC8qKjwgI1ZNTUlPIHBvaW50aW5nIHRvICA4LWJpdCBkYXRhICovCit0eXBlZGVmIGxvbmcgVk1NSU8xNjsvKio8ICNWTU1JTyBwb2ludGluZyB0byAxNi1iaXQgZGF0YSAqLwordHlwZWRlZiBsb25nIFZNTUlPMzI7LyoqPCAjVk1NSU8gcG9pbnRpbmcgdG8gMzItYml0IGRhdGEgKi8KKworI2RlZmluZSBMT0NLU0VNKHNlbSkgICAgICAgICAgICAgICAgICAgZG93bl9pbnRlcnJ1cHRpYmxlKHNlbSkKKyNkZWZpbmUgTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoc2VtKSAgIGRvd24oc2VtKQorI2RlZmluZSBVTkxPQ0tTRU0oc2VtKSAgICAgICAgICAgICAgICAgdXAoc2VtKQorCisvKiogbG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3IgcmVhZGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gbG9jaworICovCisjZGVmaW5lIExPQ0tSRUFEU0VNKHNlbSkgICAgICAgICAgICAgICBkb3duX3JlYWQoc2VtKQorCisvKiogdW5sb2NrIHJlYWQvd3JpdGUgc2VtYXBob3JlIGZvciByZWFkaW5nLgorICAgIE5vdGUgdGhhdCBhbGwgcmVhZC93cml0ZSBzZW1hcGhvcmVzIGFyZSBvZiB0aGUgInVuaW50ZXJydXB0aWJsZSIgdmFyaWV0eS4KKyAgICBAcGFyYW0gc2VtIChyd19zZW1hcGhvcmUgKikgcG9pbnRzIHRvIHNlbWFwaG9yZSB0byB1bmxvY2sKKyAqLworI2RlZmluZSBVTkxPQ0tSRUFEU0VNKHNlbSkgICAgICAgICAgICAgdXBfcmVhZChzZW0pCisKKy8qKiBsb2NrIHJlYWQvd3JpdGUgc2VtYXBob3JlIGZvciB3cml0aW5nLgorICAgIE5vdGUgdGhhdCBhbGwgcmVhZC93cml0ZSBzZW1hcGhvcmVzIGFyZSBvZiB0aGUgInVuaW50ZXJydXB0aWJsZSIgdmFyaWV0eS4KKyAgICBAcGFyYW0gc2VtIChyd19zZW1hcGhvcmUgKikgcG9pbnRzIHRvIHNlbWFwaG9yZSB0byBsb2NrCisgKi8KKyNkZWZpbmUgTE9DS1dSSVRFU0VNKHNlbSkgICAgICAgICAgICAgIGRvd25fd3JpdGUoc2VtKQorCisvKiogdW5sb2NrIHJlYWQvd3JpdGUgc2VtYXBob3JlIGZvciB3cml0aW5nLgorICAgIE5vdGUgdGhhdCBhbGwgcmVhZC93cml0ZSBzZW1hcGhvcmVzIGFyZSBvZiB0aGUgInVuaW50ZXJydXB0aWJsZSIgdmFyaWV0eS4KKyAgICBAcGFyYW0gc2VtIChyd19zZW1hcGhvcmUgKikgcG9pbnRzIHRvIHNlbWFwaG9yZSB0byB1bmxvY2sKKyAqLworI2RlZmluZSBVTkxPQ0tXUklURVNFTShzZW0pICAgICAgICAgICAgdXBfd3JpdGUoc2VtKQorCisjaWZkZWYgRU5BQkxFX1JFVFVSTl9UUkFDRQorI2RlZmluZSBSRVRUUkFDRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkgICAgICAgXAorCQlpZiAoMSkgewkJCQkgICAgICAgXAorCQkJSU5GT0RSVigiUkVUIDB4JWx4IGluICVzIiwJICAgICAgIFwKKwkJCQkodWxvbmcpKHgpLCBfX2Z1bmNfXyk7ICAgICBcCisJCX0JCQkJCSAgIFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUkVUVFJBQ0UoeCkKKyNlbmRpZgorCisvKiogVHJ5IHRvIGV2YXVsYXRlIHRoZSBwcm92aWRlZCBleHByZXNzaW9uLCBhbmQgZG8gYSBSRVRJTlQoeCkgaWZmCisgKiAgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIDwgMC4KKyAqICBAcGFyYW0geCB0aGUgZXhwcmVzc2lvbiB0byB0cnkKKyAqLworI2RlZmluZSBBU1NFUlQoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgaWYgKCEoY29uZCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlIVUhEUlYoIkFTU0VSVCBmYWlsZWQgLSAlcyIsCSAgICAgICBcCisJCQkgICAgICAgX19zdHJpbmdpZnkoY29uZCkpOwkgICAgICAgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgc2l6ZW9mbWVtYmVyKFRZUEUsIE1FTUJFUikgKHNpemVvZigoKFRZUEUgKikwKS0+TUVNQkVSKSkKKy8qKiAiQ292ZXJlZCBxdW90aWVudCIgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ09WUSh2LCBkKSAgKCgodikgKyAoZCkgLSAxKSAvIChkKSkKKyNkZWZpbmUgU1dBUFBPSU5URVJTKHAxLCBwMikJCQkJXAorCWRvIHsJCQkJCQlcCisJCXZvaWQgKlNXQVBQT0lOVEVSU19URU1QID0gKHZvaWQgKilwMTsJXAorCQkodm9pZCAqKShwMSkgPSAodm9pZCAqKShwMik7ICAgICAgICAgICAgXAorCQkodm9pZCAqKShwMikgPSBTV0FQUE9JTlRFUlNfVEVNUDsJXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogIEBhZGR0b2dyb3VwIGRyaXZlcmxvZ2dpbmcKKyAqICBAeworICovCisKKyNkZWZpbmUgUFJJTlRLRFJWKGZtdCwgYXJncy4uLikgTE9HSU5GKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgVEJERFJWKGZtdCwgYXJncy4uLikgICAgTE9HRVJSKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgSFVIRFJWKGZtdCwgYXJncy4uLikgICAgTE9HRVJSKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgRVJSRFJWKGZtdCwgYXJncy4uLikgICAgTE9HRVJSKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgV0FSTkRSVihmbXQsIGFyZ3MuLi4pICAgTE9HV1JOKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgU0VDVVJFRFJWKGZtdCwgYXJncy4uLikgTE9HV1JOKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgSU5GT0RSVihmbXQsIGFyZ3MuLi4pICAgTE9HSU5GKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgREVCVUdEUlYoZm10LCBhcmdzLi4uKSAgREJHSU5GKGZtdCwgIyMgYXJncykKKworI2RlZmluZSBQUklOVEtERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgTE9HSU5GREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgVEJEREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgIExPR0VSUkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEhVSERFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICBMT0dFUlJERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBFUlJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgRVJSREVWWChkZXZubywgZm10LCBhcmdzLi4uKQkgIExPR0VSUkRFVlgoZGV2bm8sIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgV0FSTkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgIExPR1dSTkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNFQ1VSRURFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICBMT0dXUk5ERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBJTkZPREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgTE9HSU5GREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgSU5GT0RFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgICAgIExPR0lORkRFVlgoZGV2bm8sIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgREVCVUdERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgIERCR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisKKworLyogQH0gKi8KKworLyoqIFZlcmlmaWVzIHRoZSBjb25zaXN0ZW5jeSBvZiB5b3VyIFBSSVZBVEVERVZJQ0VEQVRBIHN0cnVjdHVyZSB1c2luZworICogIGNvbnZlbnRpb25hbCAic2lnbmF0dXJlIiBmaWVsZHM6CisgKiAgPHA+CisgKiAgLSBzaWcxIHNob3VsZCBjb250YWluIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqICAtIHNpZzIgc2hvdWxkIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cnVjdHVyZQorICovCisjZGVmaW5lIERETE9PS1NWQUxJRChkZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgoZGQgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCVwKKwkJICgoZGQpLT5zaWcxID09IHNpemVvZihQUklWQVRFREVWSUNFREFUQSkpICYmCVwKKwkJICgoZGQpLT5zaWcyID09IGRkKSkKKworLyoqIFZlcmlmaWVzIHRoZSBjb25zaXN0ZW5jeSBvZiB5b3VyIFBSSVZBVEVGSUxFREFUQSBzdHJ1Y3R1cmUgdXNpbmcKKyAqICBjb252ZW50aW9uYWwgInNpZ25hdHVyZSIgZmllbGRzOgorICogIDxwPgorICogIC0gc2lnMSBzaG91bGQgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCisgKiAgLSBzaWcyIHNob3VsZCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSBGRExPT0tTVkFMSUQoZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKGZkICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgICAgIFwKKwkgKChmZCktPnNpZzEgPT0gc2l6ZW9mKFBSSVZBVEVGSUxFREFUQSkpICYmICAgIFwKKwkgKChmZCktPnNpZzIgPT0gZmQpKQorCisvKiogTG9ja3MgZGQtPmxvY2tEZXYgaWYgeW91IGhhdm4ndCBhbHJlYWR5IGxvY2tlZCBpdCAqLworI2RlZmluZSBMT0NLREVWKGRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoIWxvY2tlZERldikgewkJCQkgICAgICAgXAorCQkJc3Bpbl9sb2NrKCZkZC0+bG9ja0Rldik7CQkgICAgICAgXAorCQkJbG9ja2VkRGV2ID0gVFJVRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBVbmxvY2tzIGRkLT5sb2NrRGV2IGlmIHlvdSBwcmV2aW91c2x5IGxvY2tlZCBpdCAqLworI2RlZmluZSBVTkxPQ0tERVYoZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAobG9ja2VkRGV2KSB7CQkJCSAgICAgICBcCisJCQlzcGluX3VubG9jaygmZGQtPmxvY2tEZXYpOwkJICAgICAgIFwKKwkJCWxvY2tlZERldiA9IEZBTFNFOwkJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIExvY2tzIGRkLT5sb2NrRGV2SVNSIGlmIHlvdSBoYXZuJ3QgYWxyZWFkeSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgTE9DS0RFVklTUihkZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKCFsb2NrZWREZXZJU1IpIHsJCQkJICAgICAgIFwKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZC0+bG9ja0RldklTUiwgZmxhZ3MpOyAgICAgXAorCQkJbG9ja2VkRGV2SVNSID0gVFJVRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBVbmxvY2tzIGRkLT5sb2NrRGV2SVNSIGlmIHlvdSBwcmV2aW91c2x5IGxvY2tlZCBpdCAqLworI2RlZmluZSBVTkxPQ0tERVZJU1IoZGQpCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJaWYgKGxvY2tlZERldklTUikgewkJCQkJXAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGQtPmxvY2tEZXZJU1IsIGZsYWdzKTsgXAorCQkJbG9ja2VkRGV2SVNSID0gRkFMU0U7CQkJCVwKKwkJfQkJCQkJCQlcCisJfQorCisvKiogTG9ja3MgTG9ja0dsb2JhbElTUiBpZiB5b3UgaGF2bid0IGFscmVhZHkgbG9ja2VkIGl0ICovCisjZGVmaW5lIExPQ0tHTE9CQUxJU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICghbG9ja2VkR2xvYmFsSVNSKSB7CQkJCSAgICAgICBcCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmTG9ja0dsb2JhbElTUiwgZmxhZ3MpOyAgICAgIFwKKwkJCWxvY2tlZEdsb2JhbElTUiA9IFRSVUU7CQkJICAgICAgIFwKKwkJfQkJCQkJCSAgICAgICBcCisJfQorCisvKiogVW5sb2NrcyBMb2NrR2xvYmFsSVNSIGlmIHlvdSBwcmV2aW91c2x5IGxvY2tlZCBpdCAqLworI2RlZmluZSBVTkxPQ0tHTE9CQUxJU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAobG9ja2VkR2xvYmFsSVNSKSB7CQkJCSAgICAgICBcCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZMb2NrR2xvYmFsSVNSLCBmbGFncyk7IFwKKwkJCWxvY2tlZEdsb2JhbElTUiA9IEZBTFNFOwkJICAgICAgIFwKKwkJfQkJCQkJCSAgICAgICBcCisJfQorCisvKiogTG9ja3MgTG9ja0dsb2JhbCBpZiB5b3UgaGF2bid0IGFscmVhZHkgbG9ja2VkIGl0ICovCisjZGVmaW5lIExPQ0tHTE9CQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICghbG9ja2VkR2xvYmFsKSB7CQkJCSAgICAgICBcCisJCQlzcGluX2xvY2soJkxvY2tHbG9iYWwpOwkJCSAgICAgICBcCisJCQlsb2NrZWRHbG9iYWwgPSBUUlVFOwkJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIFVubG9ja3MgTG9ja0dsb2JhbCBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLR0xPQkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKGxvY2tlZEdsb2JhbCkgewkJCQkgICAgICAgXAorCQkJc3Bpbl91bmxvY2soJkxvY2tHbG9iYWwpOwkJICAgICAgIFwKKwkJCWxvY2tlZEdsb2JhbCA9IEZBTFNFOwkJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIFVzZSB0aGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZnVuY3Rpb25zIHdoZXJlIHlvdSBpbnRlbmQgdG8KKyAqICB1c2UgI0xPQ0tERVYvI1VOTE9DS0RFViwgI0xPQ0tERVZJU1IvI1VOTE9DS0RFVklTUiwKKyAqICAjTE9DS0dMT0JBTC8jVU5MT0NLR0xPQkFMLCAjTE9DS0dMT0JBTElTUi8jVU5MT0NLR0xPQkFMSVNSLgorICoKKyAqICBOb3RlIHRoYXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaXMgaG93IHlvdSB0ZWxsIEdOVSBDIHRvIHN1cHByZXNzCisgKiAgYW55IHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgdGhlIHZhcmlhYmxlIGJlaW5nIHVudXNlZC4KKyAqLworI2RlZmluZSBMT0NLUFJFQU1CTEUJCQkJCQkJXAorCXVsb25nIGZsYWdzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gMDsJCQlcCisJQk9PTCBsb2NrZWREZXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSBGQUxTRTsJCQlcCisJQk9PTCBsb2NrZWREZXZJU1IgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSBGQUxTRTsJCVwKKwlCT09MIGxvY2tlZEdsb2JhbCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IEZBTFNFOwkJXAorCUJPT0wgbG9ja2VkR2xvYmFsSVNSIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gRkFMU0UKKworCisKKy8qKiBTbGVlcCBmb3IgYW4gaW5kaWNhdGVkIG51bWJlciBvZiBzZWNvbmRzIChmb3IgdXNlIGluIGtlcm5lbCBtb2RlKS4KKyAqICBAcGFyYW0geCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAuCisgKi8KKyNkZWZpbmUgU0xFRVAoeCkJCQkJCSAgICAgXAorCWRvIHsgY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CSAgICAgXAorCQlzY2hlZHVsZV90aW1lb3V0KCh4KSpIWik7CQkgICAgIFwKKwl9IHdoaWxlICgwKQorCisvKiogU2xlZXAgZm9yIGFuIGluZGljYXRlZCBudW1iZXIgb2YgamlmZmllcyAoZm9yIHVzZSBpbiBrZXJuZWwgbW9kZSkuCisgKiAgQHBhcmFtIHggdGhlIG51bWJlciBvZiBqaWZmaWVzIHRvIHNsZWVwLgorICovCisjZGVmaW5lIFNMRUVQSklGRklFUyh4KQkJCQkJCSAgICBcCisJZG8geyBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsJCSAgICBcCisJCXNjaGVkdWxlX3RpbWVvdXQoeCk7CQkJCSAgICBcCisJfSB3aGlsZSAoMCkKKworI2lmbmRlZiBtYXgKKyNkZWZpbmUgbWF4KGEsIGIpICgoKGEpID4gKGIpKSA/IChhKTooYikpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2RldiAqY2Rldl9hbGxvY19pbml0KHN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXN0cnVjdCBjZGV2ICpjZGV2ID0gTlVMTDsKKwljZGV2ID0gY2Rldl9hbGxvYygpOworCWlmICghY2RldikKKwkJcmV0dXJuIE5VTEw7CisJY2Rldi0+b3BzID0gZm9wczsKKwljZGV2LT5vd25lciA9IG93bmVyOworCisJLyogTm90ZSB0aGF0IHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBjZGV2IHdpbGwgYmUgZGVhbGxvY2F0ZWQKKwkgKiB3aGVuIHRoZSB1c2FnZSBjb3VudCBkcm9wcyB0byAwLCBiZWNhdXNlIGl0IGlzIGNvbnRyb2xsZWQKKwkgKiBieSBhIGtvYmplY3Qgb2YgdHlwZSBrdHlwZV9jZGV2X2R5bmFtaWMuICAoVGhpcworCSAqIGRlYWxsb2NhdGlvbiBjb3VsZCB2ZXJ5IHdlbGwgaGFwcGVuIG91dHNpZGUgb2Ygb3VyIGtlcm5lbAorCSAqIG1vZHVsZSwgbGlrZSB2aWEgdGhlIGNkZXZfcHV0IGluIF9fZnB1dCgpIGZvciBleGFtcGxlLikKKwkgKi8KKwlyZXR1cm4gY2RldjsKK30KKworI2luY2x1ZGUgInRpbXNrbW9kdXRpbHMuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdGltc2ttb2R1dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDgxZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kdXRpbHMuaApAQCAtMCwwICsxLDc1IEBACisvKiB0aW1za21vZHV0aWxzLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19USU1TS01PRFVUSUxTX0hfXworI2RlZmluZSBfX1RJTVNLTU9EVVRJTFNfSF9fCisKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCit2b2lkICprbWFsbG9jX2tlcm5lbChzaXplX3Qgc2l6KTsKK3ZvaWQgIG15cHJpbnRrKGNvbnN0IGNoYXIgKm15RHJ2TmFtZSwgY29uc3QgY2hhciAqZGV2bmFtZSwKKwkJY29uc3QgY2hhciAqdGVtcGxhdGUsIC4uLik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKi0tLSAgR0VORVJBTCBNRVNTQUdFUSBTVFVGRiAgLS0tKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBNZXNzYWdlUUVudHJ5OworCisvKiogdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhbiBhcmJpdHJhcnkgZGF0YSBpdGVtIHRoYXQgeW91IHdhbnQKKyAqICB0byBwbGFjZSBvbiBhICNNRVNTQUdFUS4gIERlY2xhcmUgYW5kIGluaXRpYWxpemUgYXMgZm9sbG93czoKKyAqCisgKiAgVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3BhcXVlOyB0aGUgY2xpZW50IHVzaW5nIGl0IHNob3VsZAorICogIG5ldmVyIGFjY2VzcyB0aGUgZmllbGRzIGRpcmVjdGx5LgorICogIFJlZmVyIHRvIHRoZXNlIGZ1bmN0aW9ucyBmb3IgbW9yZSBpbmZvOgorICoKKyAqICBAaW5ncm91cCBtZXNzYWdlcQorICovCit0eXBlZGVmIHN0cnVjdCBNZXNzYWdlUUVudHJ5IHsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBNZXNzYWdlUUVudHJ5ICpxTmV4dDsKKwlzdHJ1Y3QgTWVzc2FnZVFFbnRyeSAqcVByZXY7Cit9IE1FU1NBR0VRRU5UUlk7CisKKy8qKiB0aGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgRklGTyBxdWV1ZSBvZiAjTUVTU0FHRVFFTlRSWTxiPjwvYj5zLgorICogIERlY2xhcmUgYW5kIGluaXRpYWxpemUgYXMgZm9sbG93czoKKyAqICBAY29kZQorICogICAgICBNRVNTQUdFUSBteVF1ZXVlOworICogIEBlbmRjb2RlCisgKiAgVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3BhcXVlOyB0aGUgY2xpZW50IHVzaW5nIGl0IHNob3VsZAorICogIG5ldmVyIGFjY2VzcyB0aGUgZmllbGRzIGRpcmVjdGx5LgorICogIFJlZmVyIHRvIHRoZXNlIGZ1bmN0aW9ucyBmb3IgbW9yZSBpbmZvOgorICoKKyAqICBAaW5ncm91cCBtZXNzYWdlcQorICovCit0eXBlZGVmIHN0cnVjdCBNZXNzYWdlUSB7CisJTUVTU0FHRVFFTlRSWSAqcUhlYWQ7CisJTUVTU0FHRVFFTlRSWSAqcVRhaWw7CisJc3RydWN0IHNlbWFwaG9yZSBuUUVudHJpZXM7CisJc3BpbmxvY2tfdCAgICAgICBxdWV1ZUxvY2s7Cit9IE1FU1NBR0VROworCitjaGFyICpjeWNsZXNUb1NlY29uZHModTY0IGN5Y2xlcywgdTY0IGN5Y2xlc1BlclNlY29uZCwKKwkJICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSk7CitjaGFyICpjeWNsZXNUb0l0ZXJhdGlvblNlY29uZHModTY0IGN5Y2xlcywgdTY0IGN5Y2xlc1BlclNlY29uZCwKKwkJCSAgICAgICB1NjQgaXRlcmF0aW9ucywgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSk7CitjaGFyICpjeWNsZXNUb1NvbWV0aGluZ3NQZXJTZWNvbmQodTY0IGN5Y2xlcywgdTY0IGN5Y2xlc1BlclNlY29uZCwKKwkJCQkgIHU2NCBzb21ldGhpbmdzLCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKTsKK3N0cnVjdCBzZXFfZmlsZSAqdmlzb3Jfc2VxX2ZpbGVfbmV3X2J1ZmZlcih2b2lkICpidWYsIHNpemVfdCBidWZfc2l6ZSk7Cit2b2lkIHZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKHN0cnVjdCBzZXFfZmlsZSAqbSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFiMzkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmgKQEAgLTAsMCArMSw0NDAgQEAKKy8qIHVpc3F1ZXVlLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBVbmlzeXMgSU8gVmlydHVhbGl6YXRpb24gaGVhZGVyIE5PVEU6IFRoaXMgZmlsZSBjb250YWlucyBvbmx5IExpbnV4CisgKiBzcGVjaWZpYyBzdHJ1Y3RzLiAgQWxsIE9TLWluZGVwZW5kZW50IHN0cnVjdHMgYXJlIGluIGlvY2hhbm5lbC5oLnh4CisgKi8KKworI2lmbmRlZiBfX1VJU1FVRVVFX0hfXworI2RlZmluZSBfX1VJU1FVRVVFX0hfXworCisjaW5jbHVkZSAibGludXgvdmVyc2lvbi5oIgorI2luY2x1ZGUgImlvY2hhbm5lbC5oIgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImNvbnRyb2x2bWNoYW5uZWwuaCIKKyNpbmNsdWRlICJjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmgiCisKK3N0cnVjdCB1aXNxdWV1ZV9pbmZvIHsKKworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKmNoYW47CisJLyogY2hhbm5lbCBjb250YWluaW5nIHF1ZXVlcyBpbiB3aGljaCBzY3NpIGNvbW1hbmRzICYKKwkgKiByZXNwb25zZXMgYXJlIHF1ZXVlZAorCSAqLworCVU2NCBwYWNrZXRzX3NlbnQ7CisJVTY0IHBhY2tldHNfcmVjZWl2ZWQ7CisJVTY0IGludGVycnVwdHNfc2VudDsKKwlVNjQgaW50ZXJydXB0c19yZWNlaXZlZDsKKwlVNjQgbWF4X25vdF9lbXB0eV9jbnQ7CisJVTY0IHRvdGFsX3dha2V1cF9jbnQ7CisJVTY0IG5vbl9lbXB0eV93YWtldXBfY250OworCisJc3RydWN0IHsKKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBSZXNlcnZlZDE7CS8qICAqLworCQlTSUdOQUxfUVVFVUVfSEVBREVSIFJlc2VydmVkMjsJLyogICovCisJfSBzYWZlX3Vpc19xdWV1ZTsKKwl1bnNpZ25lZCBpbnQgKCpzZW5kX2ludF9pZl9uZWVkZWQpKHN0cnVjdCB1aXNxdWV1ZV9pbmZvICppbmZvLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgd2hpY2hjcXVldWUsCisJCQkJCSAgIHVuc2lnbmVkIGNoYXIgaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCQkgICBVNjQgaW50ZXJydXB0SGFuZGxlLAorCQkJCQkgICB1bnNpZ25lZCBjaGFyIGlvX3Rlcm1pbmF0aW9uKTsKK307CisKKy8qIHVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCBxdWV1ZXMgYSBjb21tbWFuZCBvciByZXNwb25zZQorICogdG8gdGhlIHNwZWNpZmllZCBxdWV1ZSwgYXQgdGhlIHRhaWwgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwgYnV0CisgKiBva3Rvd2FpdCA9PSAwLCB0aGVuIGl0IHJldHVybiAwIGluZGljYXRpbmcgZmFpbHVyZS4gIG90aGVyd2lzZSBpdAorICogd2FpdCBmb3IgdGhlIHF1ZXVlIHRvIGJlY29tZSBub24tZnVsbC4gSWYgY29tbWFuZCBpcyBxdWV1ZWQsIHJldHVybgorICogMSBmb3Igc3VjY2Vzcy4KKyAqLworI2RlZmluZSBET05UX0lTU1VFX0lOVEVSUlVQVCAwCisjZGVmaW5lIElTU1VFX0lOVEVSUlVQVAkJIDEKKworI2RlZmluZSBET05UX1dBSVQJCQkgMAorI2RlZmluZSBPS19UT19XQUlUCQkJIDEKKyNkZWZpbmUgVUlTTElCX0xPQ0tfUFJFRklYIFwKKwkJIi5zZWN0aW9uIC5zbXBfbG9ja3MsXCJhXCJcbiIgICBcCisJCV9BU01fQUxJR04gIlxuIiAgICAgICAgICAgICAgICAgXAorCQlfQVNNX1BUUiAiNjYxZlxuIiAvKiBhZGRyZXNzICovIFwKKwkJIi5wcmV2aW91c1xuIiAgICAgICAgICAgICAgICAgICBcCisJCSI2NjE6XG5cdGxvY2s7ICIKKwordW5zaWduZWQgbG9uZyBsb25nIHVpc3F1ZXVlX0ludGVybG9ja2VkT3IodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcgU2V0KTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyB1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZCh1bnNpZ25lZCBsb25nIGxvbmcgX19pb21lbSAqVGFyZ2V0LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGxvbmcgU2V0KTsKKwordW5zaWduZWQgaW50IHVpc3F1ZXVlX3NlbmRfaW50X2lmX25lZWRlZChzdHJ1Y3QgdWlzcXVldWVfaW5mbyAqcHF1ZXVlaW5mbywKKwkJCQkJIHVuc2lnbmVkIGludCB3aGljaHF1ZXVlLAorCQkJCQkgdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQkJCSBVNjQgaW50ZXJydXB0SGFuZGxlLAorCQkJCQkgdW5zaWduZWQgY2hhciBpb190ZXJtaW5hdGlvbik7CisKK2ludCB1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywKKwkJCQkJIHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwKKwkJCQkJIHVuc2lnbmVkIGludCBxdWV1ZSwKKwkJCQkJIHZvaWQgKmluc2VydGxvY2ssCisJCQkJCSB1bnNpZ25lZCBjaGFyIGlzc3VlSW50ZXJydXB0SWZFbXB0eSwKKwkJCQkJIFU2NCBpbnRlcnJ1cHRIYW5kbGUsCisJCQkJCSBjaGFyIG9rdG93YWl0LAorCQkJCQkgVTggKmNoYW5uZWxJZCk7CisKKy8qIHVpc3F1ZXVlX2dldF9jbWRyc3AgZ2V0cyB0aGUgY21kcnNwIGVudHJ5IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQorICogYW5kIGNvcGllcyBpdCB0byB0aGUgYXJlYSBwb2ludGVkIGJ5IGNtZHJzcCBwYXJhbS4KKyAqIHJldHVybnMgMCBpZiBxdWV1ZSBpcyBlbXB0eSwgMSBvdGhlcndpc2UKKyAqLworaW50CisKK3Vpc3F1ZXVlX2dldF9jbWRyc3Aoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywgdm9pZCAqY21kcnNwLAorCQkgICAgdW5zaWduZWQgaW50IHF1ZXVlKTsKKworI2RlZmluZSBNQVhfTkFNRV9TSVpFX1VJU1FVRVVFIDY0CisKK3N0cnVjdCBleHRwb3J0X2luZm8geworCVU4IHZhbGlkOjE7CisJLyogaWYgMSwgaW5kaWNhdGVzIHRoaXMgZXh0cG9ydCBzbG90IGlzIG9jY3VwaWVkCisJICogaWYgMCwgaW5kaWNhdGVzIHRoYXQgZXh0cG9ydCBzbG90IGlzIHVub2NjdXBpZWQgKi8KKworCVUzMiBudW1fZGV2c191c2luZzsKKwkvKiBXaGVuIGV4dHBvcnQgaXMgYWRkZWQsIHRoaXMgaXMgc2V0IHRvIDAuICBGb3IgZXhwb3J0cworCSogbG9jYXRlZCBpbiBORVRXT1JLIHN3aXRjaGVzOgorCSogRWFjaCB0aW1lIGEgVk5JQywgaS5lLiwgaW50cG9ydCwgaXMgYWRkZWQgdG8gdGhlIHN3aXRjaCB0aGlzCisJKiBpcyB1c2VkIHRvIGFzc2lnbiBhIHByZWZfcG5pYyBmb3IgdGhlIFZOSUMgYW5kIHdoZW4gYXNzaWduZWQKKwkqIHRvIGEgVk5JQyB0aGlzIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQuIFdoZW4gYSBWTklDIGlzCisJKiBkZWxldGVkLCB0aGUgZXh0cG9ydCBjb3JyZXNwb25kaW5nIHRvIHRoZSBWTklDJ3MgcHJlZl9wbmljCisJKiBpcyBsb2NhdGVkIGFuZCBpdHMgbnVtX2RldnNfdXNpbmcgaXMgZGVjcmVtZW50ZWQuIEZvciBWTklDcywKKwkqIG51bV9kZXZzX3VzaW5nIGlzIGJhc2ljYWxseSB1c2VkIHRvIGxvYWQtYmFsYW5jZSB0cmFuc21pdAorCSogdHJhZmZpYyBmcm9tIFZOSUNzLgorCSovCisKKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOworCXN0cnVjdCBQY2lJZCBwY2lfaWQ7CisJY2hhciBuYW1lW01BWF9OQU1FX1NJWkVfVUlTUVVFVUVdOworCXVuaW9uIHsKKwkJc3RydWN0IHZoYmFfd3dubiB3d25uOworCQl1bnNpZ25lZCBjaGFyIG1hY2FkZHJbTUFYX01BQ0FERFJfTEVOXTsKKwl9OworfTsKKworc3RydWN0IGRldmljZV9pbmZvIHsKKwl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CisJVTY0IGNoYW5uZWxBZGRyOworCVU2NCBjaGFubmVsQnl0ZXM7CisJR1VJRCBjaGFubmVsVHlwZUd1aWQ7CisJR1VJRCBkZXZJbnN0R3VpZDsKKwlzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOworCXN0cnVjdCBzd2l0Y2hfaW5mbyAqc3d0Y2g7CisJY2hhciBkZXZpZFszMF07CQkvKiAidmJ1czxidXNubz46ZGV2PGRldm5vPiIgKi8KKwlVMTYgcG9sbGluZzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGludGVycnVwdF9jYWxsYmFja19sb2NrOworCVUzMiBidXNObzsKKwlVMzIgZGV2Tm87CisJaW50ICgqaW50ZXJydXB0KSh2b2lkICopOworCXZvaWQgKmludGVycnVwdF9jb250ZXh0OworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHM7CisJdW5zaWduZWQgbG9uZyBsb25nIG1vdmVkX3RvX3RhaWxfY250OworCXVuc2lnbmVkIGxvbmcgbG9uZyBmaXJzdF9idXN5X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9vbl9saXN0X2NudDsKK307CisKK3R5cGVkZWYgZW51bSB7CisJUkVDT1ZFUllfTEFOID0gMSwKKwlJQl9MQU4gPSAyCit9IFNXSVRDSF9UWVBFOworCitzdHJ1Y3QgYnVzX2luZm8geworCVUzMiBidXNObywgZGV2aWNlQ291bnQ7CisJc3RydWN0IGRldmljZV9pbmZvICoqZGV2aWNlOworCVU2NCBndWVzdEhhbmRsZSwgcmVjdkJ1c0ludGVycnVwdEhhbmRsZTsKKwlHVUlEIGJ1c0luc3RHdWlkOworCVVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICpwQnVzQ2hhbm5lbDsKKwlpbnQgYnVzQ2hhbm5lbEJ5dGVzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kaXI7CS8qIHByb2MvdWlzbGliL3ZidXMvPHg+ICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2luZm87CS8qIHByb2MvdWlzbGliL3ZidXMvPHg+L2luZm8gKi8KKwljaGFyIG5hbWVbMjVdOworCWNoYXIgcGFydGl0aW9uTmFtZVs5OV07CisJc3RydWN0IGJ1c19pbmZvICpuZXh0OworCVU4IGxvY2FsVm5pYzsJCS8qIDEgaWYgbG9jYWwgdm5pYyBjcmVhdGVkIGludGVybmFsbHkKKwkJCQkgKiBieSBJT1ZNOyAwIG90aGVyd2lzZS4uLiAqLworfTsKKworI2RlZmluZSBERURJQ0FURURfU1dJVENIKHBTd2l0Y2gpICgocFN3aXRjaC0+ZXh0UG9ydENvdW50ID09IDEpICYmCVwKKwkJCQkgICAocFN3aXRjaC0+aW50UG9ydENvdW50ID09IDEpKQorCitzdHJ1Y3Qgc25fbGlzdF9lbnRyeSB7CisJc3RydWN0IHVpc3Njc2lfZGVzdCBwZGVzdDsJLyogc2NzaSBidXMsIHRhcmdldCwgbHVuIGZvcgorCQkJCQkgKiBwaHlzIGRpc2sgKi8KKwlVOCBzZXJudW1bTUFYX1NFUklBTF9OVU1dOwkvKiBzZXJpYWwgbnVtIG9mIHBoeXNpY2FsCisJCQkJCSAqIGRpc2suLiBUaGUgbGVuZ3RoIGlzIGFsd2F5cworCQkJCQkgKiBNQVhfU0VSSUFMX05VTSwgcGFkZGVkIHdpdGgKKwkJCQkJICogc3BhY2VzICovCisJc3RydWN0IHNuX2xpc3RfZW50cnkgKm5leHQ7Cit9OworCitzdHJ1Y3QgbmV0d29ya1BvbGljeSB7CisJVTMyIHByb21pc2N1b3VzOjE7CisJVTMyIG1hY2Fzc2lnbjoxOworCVUzMiBwZWVyZm9yd2FyZGluZzoxOworCVUzMiBub25vdGlmeToxOworCVUzMiBzdGFuZGJ5OjE7CisJVTMyIGNhbGxob21lOjI7CisJY2hhciBpcF9hZGRyWzMwXTsKK307CisKKy8qCisgKiBJTyBtZXNzYWdlcyBzZW50IHRvIFVpc25pY0NvbnRyb2xDaGFuRnVuYyAmIFVpc3NkQ29udHJvbENoYW5GdW5jIGJ5CisgKiBjb2RlIHRoYXQgcHJvY2Vzc2VzIHRoZSBDb250cm9sVm0gY2hhbm5lbCBtZXNzYWdlcy4KKyAqLworCisKK3R5cGVkZWYgZW51bSB7CisJSU9QQVJUX0FERF9WTklDLAorCUlPUEFSVF9ERUxfVk5JQywKKwlJT1BBUlRfREVMX0FMTF9WTklDUywKKwlJT1BBUlRfQUREX1ZIQkEsCisJSU9QQVJUX0FERF9WRElTSywKKwlJT1BBUlRfREVMX1ZIQkEsCisJSU9QQVJUX0RFTF9WRElTSywKKwlJT1BBUlRfREVMX0FMTF9WRElTS1NfRk9SX1ZIQkEsCisJSU9QQVJUX0RFTF9BTExfVkhCQVMsCisJSU9QQVJUX0FUVEFDSF9QSEJBLAorCUlPUEFSVF9ERVRBQ0hfUEhCQSwJLyogMTAgKi8KKwlJT1BBUlRfQVRUQUNIX1BOSUMsCisJSU9QQVJUX0RFVEFDSF9QTklDLAorCUlPUEFSVF9ERVRBQ0hfVkhCQSwKKwlJT1BBUlRfREVUQUNIX1ZOSUMsCisJSU9QQVJUX1BBVVNFX1ZESVNLLAorCUlPUEFSVF9SRVNVTUVfVkRJU0ssCisJSU9QQVJUX0FERF9ERVZJQ0UsCS8qIGFkZCBnZW5lcmljIGRldmljZSAqLworCUlPUEFSVF9ERUxfREVWSUNFLAkvKiBkZWwgZ2VuZXJpYyBkZXZpY2UgKi8KK30gSU9QQVJUX01TR19UWVBFOworCitzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IHsKKwl2b2lkICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlVNjQgZ3Vlc3RIYW5kbGU7CS8qIHVzZWQgdG8gY29udmVydCBndWVzdCBwaHlzaWNhbAorCQkJCSAqIGFkZHJlc3MgdG8gcmVhbCBwaHlzaWNhbCBhZGRyZXNzCisJCQkJICogZm9yIERNQSwgZm9yIGV4LiAqLworCVU2NCByZWN2QnVzSW50ZXJydXB0SGFuZGxlOwkvKiB1c2VkIHRvIHJlZ2lzdGVyIHRvIHJlY2VpdmUKKwkJCQkJICogYnVzIGxldmVsIGludGVycnVwdHMuICovCisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsJLyogY29udGFpbnMgcmVjdiAmIHNlbmQKKwkJCQkJICogaW50ZXJydXB0IGluZm8gKi8KKwkvKiByZWN2SW50ZXJydXB0SGFuZGxlIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdG8gcmVjZWl2ZQorCSogaW50ZXJydXB0cyBvbiB0aGUgZGF0YSBjaGFubmVsLiBVc2VkIGJ5IEd1ZXN0TGludXgvV2luZG93cworCSogSU8gZHJpdmVycyB0byBjb25uZWN0IHRvIGludGVycnVwdC4gIHNlbmRJbnRlcnJ1cHRIYW5kbGUgaXMKKwkqIHVzZWQgYnkgSU9QYXJ0IGRyaXZlcnMgYXMgcGFyYW1ldGVyIHRvCisJKiBJc3N1ZV9WTUNBTExfSU9fUVVFVUVfVFJBTlNJVElPTiB0byBpbnRlcnJ1cHQgdGhyZWFkIGluCisJKiBndWVzdCBsaW51eC93aW5kb3dzIElPIGRyaXZlcnMgd2hlbiBkYXRhIGNoYW5uZWwgcXVldWUgZm9yCisJKiB2aGJhL3ZuaWMgZ29lcyBmcm9tIEVNUFRZIHRvIE5PTi1FTVBUWS4gKi8KKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOwkvKiBwb2ludGVyIHRvIHRoZSB2aXJ0dWFsCisJCQkJCSAqIHN3aXRjaCB0byB3aGljaCB0aGUgdm5pYyBpcworCQkJCQkgKiBjb25uZWN0ZWQgKi8KKworCVU4IHVzZUcyR0NvcHk7CQkvKiBVc2VkIHRvIGRldGVybWluZSBpZiBhIHZpcnR1YWwgSEJBCisJCQkJICogbmVlZHMgdG8gdXNlIEcyRyBjb3B5LiAqLworCVU4IEZpbGxlcls3XTsKKworCVUzMiBidXNObzsKKwlVMzIgZGV2Tm87CisJY2hhciAqcGFyYW1zOworCXVsb25nIHBhcmFtc19ieXRlczsKKworfTsKKworc3RydWN0IGFkZF92ZGlza19pb3BhcnQgeworCXZvaWQgKmNoYW5wdHI7CQkgICAgICAvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLworCWludCBpbXBsaWNpdDsKKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OyAgICAvKiBzY3NpIGJ1cywgdGFyZ2V0LCBsdW4gZm9yIHZpcnQgZGlzayAqLworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgcGRlc3Q7ICAgIC8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IgcGh5cyBkaXNrICovCisJVTggc2VybnVtW01BWF9TRVJJQUxfTlVNXTsgICAgLyogc2VyaWFsIG51bSBvZiBwaHlzaWNhbCBkaXNrICovCisJVTMyIHNlcmxlbjsJCSAgICAgIC8qIGxlbmd0aCBvZiBzZXJpYWwgbnVtICovCisJVTMyIGJ1c05vOworCVUzMiBkZXZObzsKK307CisKK3N0cnVjdCBkZWxfdmRpc2tfaW9wYXJ0IHsKKwl2b2lkICpjaGFucHRyOwkJICAgICAvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7ICAgLyogc2NzaSBidXMsIHRhcmdldCwgbHVuIGZvciB2aXJ0IGRpc2sgKi8KKwlVMzIgYnVzTm87CisJVTMyIGRldk5vOworfTsKKworc3RydWN0IGRlbF92aXJ0X2lvcGFydCB7CisJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlVMzIgYnVzTm87CisJVTMyIGRldk5vOworfTsKKworc3RydWN0IGRldF92aXJ0X2lvcGFydCB7CSAgICAgLyogZGV0YWNoIGludGVybmFsIHBvcnQgKi8KKwl2b2lkICpjaGFucHRyOwkJICAgICAvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLworCXN0cnVjdCBzd2l0Y2hfaW5mbyAqc3d0Y2g7Cit9OworCitzdHJ1Y3QgcGF1cmVzX3ZkaXNrX2lvcGFydCB7CisJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OyAgIC8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IgdmlydCBkaXNrICovCit9OworCitzdHJ1Y3QgYWRkX3N3aXRjaF9pb3BhcnQgewkgICAgIC8qIGFkZCBzd2l0Y2ggKi8KKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOworCWNoYXIgKnBhcmFtczsKKwl1bG9uZyBwYXJhbXNfYnl0ZXM7Cit9OworCitzdHJ1Y3QgZGVsX3N3aXRjaF9pb3BhcnQgewkgICAgIC8qIGRlc3Ryb3kgc3dpdGNoICovCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKK307CisKK3N0cnVjdCBpb19tc2dzIHsKKworCUlPUEFSVF9NU0dfVFlQRSBtc2d0eXBlOworCisJLyogYWRkaXRpb25hbCBwYXJhbXMgbmVlZGVkIGJ5IHNvbWUgbWVzc2FnZXMgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBhZGRfdmlydF9pb3BhcnQgYWRkX3ZoYmE7CisJCXN0cnVjdCBhZGRfdmlydF9pb3BhcnQgYWRkX3ZuaWM7CisJCXN0cnVjdCBhZGRfdmRpc2tfaW9wYXJ0IGFkZF92ZGlzazsKKwkJc3RydWN0IGRlbF92aXJ0X2lvcGFydCBkZWxfdmhiYTsKKwkJc3RydWN0IGRlbF92aXJ0X2lvcGFydCBkZWxfdm5pYzsKKwkJc3RydWN0IGRldF92aXJ0X2lvcGFydCBkZXRfdmhiYTsKKwkJc3RydWN0IGRldF92aXJ0X2lvcGFydCBkZXRfdm5pYzsKKwkJc3RydWN0IGRlbF92ZGlza19pb3BhcnQgZGVsX3ZkaXNrOworCQlzdHJ1Y3QgZGVsX3ZpcnRfaW9wYXJ0IGRlbF9hbGxfdmRpc2tzX2Zvcl92aGJhOworCQlzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IGFkZF9kZXZpY2U7CisJCXN0cnVjdCBkZWxfdmlydF9pb3BhcnQgZGVsX2RldmljZTsKKwkJc3RydWN0IGRldF92aXJ0X2lvcGFydCBkZXRfaW50cG9ydDsKKwkJc3RydWN0IGFkZF9zd2l0Y2hfaW9wYXJ0IGFkZF9zd2l0Y2g7CisJCXN0cnVjdCBkZWxfc3dpdGNoX2lvcGFydCBkZWxfc3dpdGNoOworCQlzdHJ1Y3QgZXh0cG9ydF9pbmZvICpleHRQb3J0OwkvKiBmb3IgYXR0YWNoIG9yIGRldGFjaAorCQkJCQkJICogcG5pYy9nZW5lcmljIGRlbGV0ZSBhbGwKKwkJCQkJCSAqIHZoYmFzL2FsbHZuaWNzIG5lZWQgbm8KKwkJCQkJCSAqIHBhcmFtZXRlcnMgKi8KKwkJc3RydWN0IHBhdXJlc192ZGlza19pb3BhcnQgcGF1cmVzX3ZkaXNrOworCX07Cit9OworCisvKgorKiBHdWVzdCBtZXNzYWdlcyBzZW50IHRvIFZpcnRDb250cm9sQ2hhbkZ1bmMgYnkgY29kZSB0aGF0IHByb2Nlc3NlcworKiB0aGUgQ29udHJvbFZtIGNoYW5uZWwgbWVzc2FnZXMuCisqLworCit0eXBlZGVmIGVudW0geworCUdVRVNUX0FERF9WQlVTLAorCUdVRVNUX0FERF9WSEJBLAorCUdVRVNUX0FERF9WTklDLAorCUdVRVNUX0RFTF9WQlVTLAorCUdVRVNUX0RFTF9WSEJBLAorCUdVRVNUX0RFTF9WTklDLAorCUdVRVNUX0RFTF9BTExfVkhCQVMsCisJR1VFU1RfREVMX0FMTF9WTklDUywKKwlHVUVTVF9ERUxfQUxMX1ZCVVNFUywJLyogZGVsZXRlcyBhbGwgdmhiYXMgJiB2bmljcyBvbiBhbGwKKwkJCQkgKiBidXNlcyBhbmQgZGVsZXRlcyBhbGwgYnVzZXMgKi8KKwlHVUVTVF9QQVVTRV9WSEJBLAorCUdVRVNUX1BBVVNFX1ZOSUMsCisJR1VFU1RfUkVTVU1FX1ZIQkEsCisJR1VFU1RfUkVTVU1FX1ZOSUMKK30gR1VFU1RQQVJUX01TR19UWVBFOworCitzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IHsKKwl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCBmb3IgYnVzIC0KKwkJCQkJICogTk9UIFlFVCBVU0VEICovCisJVTMyIGJ1c05vOwkJLyogYnVzIG51bWJlciB0byBiZSBjcmVhdGVkL2RlbGV0ZWQgKi8KKwlVMzIgZGV2aWNlQ291bnQ7CS8qIG1heCBudW0gb2YgZGV2aWNlcyBvbiBidXMgKi8KKwlHVUlEIGJ1c1R5cGVHdWlkOwkvKiBpbmRpY2F0ZXMgdHlwZSBvZiBidXMgKi8KKwlHVUlEIGJ1c0luc3RHdWlkOwkvKiBpbnN0YW5jZSBndWlkIGZvciBkZXZpY2UgKi8KK307CisKK3N0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgeworCVUzMiBidXNObzsJCS8qIGJ1cyBudW1iZXIgdG8gYmUgZGVsZXRlZCAqLworCS8qIG9uY2Ugd2Ugc3RhcnQgdXNpbmcgdGhlIGJ1cydzIGNoYW5uZWwsIGFkZCBjYW4gZHVtcCBidXNObworCSogaW50byB0aGUgY2hhbm5lbCBoZWFkZXIgYW5kIHRoZW4gZGVsZXRlIHdpbGwgbmVlZCBvbmx5IG9uZQorCSogcGFyYW1ldGVyLCBjaGFucHRyLiAqLworfTsKKworc3RydWN0IGFkZF92aXJ0X2d1ZXN0cGFydCB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlVMzIgYnVzTm87CQkvKiBidXMgbnVtYmVyIGZvciB0aGUgb3BlcmF0aW9uICovCisJVTMyIGRldmljZU5vOwkJLyogbnVtYmVyIG9mIGRldmljZSBvbiB0aGUgYnVzICovCisJR1VJRCBkZXZJbnN0R3VpZDsJLyogaW5zdGFuY2UgZ3VpZCBmb3IgZGV2aWNlICovCisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsJLyogcmVjdi9zZW5kIGludGVycnVwdCBpbmZvICovCisJLyogcmVjdkludGVycnVwdEhhbmRsZSBjb250YWlucyBpbmZvIG5lZWRlZCBpbiBvcmRlciB0bworCSAqIHJlZ2lzdGVyIHRvIHJlY2VpdmUgaW50ZXJydXB0cyBvbiB0aGUgZGF0YSBjaGFubmVsLgorCSAqIHNlbmRJbnRlcnJ1cHRIYW5kbGUgY29udGFpbnMgaGFuZGxlIHdoaWNoIGlzIHByb3ZpZGVkIHRvCisJICogbW9uaXRvciBWTUNBTEwgdGhhdCB3aWxsIGNhdXNlIGFuIGludGVycnVwdCB0byBiZSBnZW5lcmF0ZWQKKwkgKiBmb3IgdGhlIG90aGVyIGVuZC4KKwkgKi8KK307CisKK3N0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KK307CisKK3N0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgeworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCit9OworCitzdHJ1Y3QgZGVsX3ZpcnRfZ3Vlc3RwYXJ0IHsKKwl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLworfTsKKworc3RydWN0IGluaXRfY2hpcHNldF9ndWVzdHBhcnQgeworCVUzMiBidXNDb3VudDsJCS8qIGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZiBidXNzZXMgKi8KKwlVMzIgc3dpdGNoQ291bnQ7CS8qIGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZiBzd2l0Y2hlcyAqLworfTsKKworc3RydWN0IGd1ZXN0X21zZ3MgeworCisJR1VFU1RQQVJUX01TR19UWVBFIG1zZ3R5cGU7CisKKwkvKiBhZGRpdGlvbmFsIHBhcmFtcyBuZWVkZWQgYnkgbWVzc2FnZXMgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBhZGRfdmJ1c19ndWVzdHBhcnQgYWRkX3ZidXM7CisJCXN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgYWRkX3ZoYmE7CisJCXN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgYWRkX3ZuaWM7CisJCXN0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCBwYXVzZV92aGJhOworCQlzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgcGF1c2Vfdm5pYzsKKwkJc3RydWN0IHJlc3VtZV92aXJ0X2d1ZXN0cGFydCByZXN1bWVfdmhiYTsKKwkJc3RydWN0IHJlc3VtZV92aXJ0X2d1ZXN0cGFydCByZXN1bWVfdm5pYzsKKwkJc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCBkZWxfdmJ1czsKKwkJc3RydWN0IGRlbF92aXJ0X2d1ZXN0cGFydCBkZWxfdmhiYTsKKwkJc3RydWN0IGRlbF92aXJ0X2d1ZXN0cGFydCBkZWxfdm5pYzsKKwkJc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCBkZWxfYWxsX3ZoYmFzOworCQlzdHJ1Y3QgZGVsX3ZidXNfZ3Vlc3RwYXJ0IGRlbF9hbGxfdm5pY3M7CisJCS8qIGRlbF9hbGxfdmJ1c2VzIG5lZWRzIG5vIHBhcmFtZXRlcnMgKi8KKwl9OworCXN0cnVjdCBpbml0X2NoaXBzZXRfZ3Vlc3RwYXJ0IGluaXRfY2hpcHNldDsKKworfTsKKworI2lmbmRlZiBfX3hnCisjZGVmaW5lIF9feGcoeCkgKCh2b2xhdGlsZSBsb25nICopKHgpKQorI2VuZGlmCisKKy8qCisqICBCZWxvdyBjb2RlIGlzIGEgY29weSBvZiBMaW51eCBrZXJuZWwncyBjbXB4Y2hnIGZ1bmN0aW9uIGxvY2F0ZWQgYXQKKyogIHRoaXMgcGxhY2UKKyogIGh0dHA6Ly90Y3N4ZW9uOjgwODAvc291cmNlL3hyZWYvMDB0cnVuay1BcHBPUy1saW51eC9pbmNsdWRlL2FzbS14ODYvY21weGNoZ182NC5oIzg0CisqICBSZWFzb24gZm9yIGNyZWF0aW5nIG91ciBvd24gdmVyc2lvbiBvZiBjbXB4Y2hnIGFsb25nIHdpdGgKKyogIFVJU0xJQl9MT0NLX1BSRUZJWCBpcyB0byBtYWtlIHRoZSBvcGVyYXRpb24gYXRvbWljIGV2ZW4gZm9yIG5vbiBTTVAKKyogIGd1ZXN0cy4KKyovCisKKyNkZWZpbmUgdWlzbGliY21weGNoZzY0KHAsIG8sIG4sIHMpIGNtcHhjaGcocCwgbywgbikKKworI2VuZGlmCQkJCS8qIF9fVUlTUVVFVUVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxZmJhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN0aHJlYWQuaApAQCAtMCwwICsxLDQ2IEBACisvKiB1aXN0aHJlYWQuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVW5pc3lzIHRocmVhZCB1dGlsaXRpZXMgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19VSVNUSFJFQURfSF9fCisjZGVmaW5lIF9fVUlTVEhSRUFEX0hfXworCisKKyNpbmNsdWRlICJsaW51eC9jb21wbGV0aW9uLmgiCisKK3N0cnVjdCB1aXN0aHJlYWRfaW5mbyB7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBpZDsKKwlpbnQgc2hvdWxkX3N0b3A7CisJc3RydWN0IGNvbXBsZXRpb24gaGFzX3N0b3BwZWQ7Cit9OworCisKKy8qIHJldHVybnMgMCBmb3IgZmFpbHVyZSwgMSBmb3Igc3VjY2VzcyAqLworaW50IHVpc3RocmVhZF9zdGFydCgKKwlzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8sCisJaW50ICgqdGhyZWFkZm4pKHZvaWQgKiksCisJdm9pZCAqdGhyY29udGV4dCwKKwljaGFyICpuYW1lKTsKKwordm9pZCB1aXN0aHJlYWRfc3RvcChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8pOworCisjZW5kaWYgLyogX19VSVNUSFJFQURfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZGFiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdXRpbHMuaApAQCAtMCwwICsxLDM0OCBAQAorLyogdWlzdXRpbHMuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFVuaXN5cyBWaXJ0dWFsIEhCQSB1dGlsaXRpZXMgaGVhZGVyCisgKi8KKworI2lmbmRlZiBfX1VJU1VUSUxTX19IX18KKyNkZWZpbmUgX19VSVNVVElMU19fSF9fCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorCisjaW5jbHVkZSAidm1jYWxsaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgInVpc3RocmVhZC5oIgorI2luY2x1ZGUgInVpc3F1ZXVlLmgiCisjaW5jbHVkZSAiZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIgorI2luY2x1ZGUgInZidXNkZXZpY2VpbmZvLmgiCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKKy8qIFRoaXMgaXMgdGhlIE1BR0lDIG51bWJlciBzdHVmZmVkIGJ5IHZpcnRoYmEgaW4gaG9zdC0+dGhpc19pZC4gVXNlZCB0bworICogaWRlbnRpZnkgdmlydHVhbCBoYmFzLgorICovCisjZGVmaW5lIFVJU19NQUdJQ19WSEJBIDcwNworCisvKiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBhY3QgYXMgY2FsbGJhY2sgZnVuY3Rpb25zIGludG8KKyAqIHVpc25pY21vZCwgdWlzc2Rtb2QsIGFuZCB2aXJ0cGNpbW9kCisgKi8KK2V4dGVybiBpbnQgKCpVaXNuaWNDb250cm9sQ2hhbkZ1bmMpKHN0cnVjdCBpb19tc2dzICopOworZXh0ZXJuIGludCAoKlVpc3NkQ29udHJvbENoYW5GdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKK2V4dGVybiBpbnQgKCpWaXJ0Q29udHJvbENoYW5GdW5jKShzdHJ1Y3QgZ3Vlc3RfbXNncyAqKTsKKworLyogUmV0dXJuIHZhbHVlcyBvZiBhYm92ZSBjYWxsYmFjayBmdW5jdGlvbnM6ICovCisjZGVmaW5lIENDRl9FUlJPUiAgICAgICAgMAkvKiBjb21wbGV0ZWQgYW5kIGZhaWxlZCAqLworI2RlZmluZSBDQ0ZfT0sgICAgICAgICAgIDEJLyogY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworI2RlZmluZSBDQ0ZfUEVORElORyAgICAgIDIJLyogb3BlcmF0aW9uIHN0aWxsIHBlbmRpbmcgKi8KK2V4dGVybiBhdG9taWNfdCBVaXNVdGlsc19SZWdpc3RlcmVkX1NlcnZpY2VzOworCit0eXBlZGVmIHVuc2lnbmVkIGludCBNQUNBUlJBWVtNQVhfTUFDQUREUl9MRU5dOwordHlwZWRlZiBzdHJ1Y3QgUmVxSGFuZGxlckluZm9fc3RydWN0IHsKKwlHVUlEIHN3aXRjaFR5cGVHdWlkOworCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKKwl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzOworCWludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nIGNoYW5uZWxCeXRlcyk7CisJaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKKwkgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKTsKKwljaGFyIHN3aXRjaF90eXBlX25hbWVbOTldOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9saW5rOwkvKiBsaW5rcyBpbnRvIFJlcUhhbmRsZXJJbmZvX2xpc3QgKi8KK30gUmVxSGFuZGxlckluZm9fdDsKKworUmVxSGFuZGxlckluZm9fdCAqUmVxSGFuZGxlckFkZChHVUlEIHN3aXRjaFR5cGVHdWlkLAorCQkJCWNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCisJCQkJaW50ICgqY29udHJvbGZ1bmMpKHN0cnVjdCBpb19tc2dzICopLAorCQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCisJCQkJaW50ICgqU2VydmVyX0NoYW5uZWxfT2spKHVuc2lnbmVkIGxvbmcKKwkJCQkJCQkgY2hhbm5lbEJ5dGVzKSwKKwkJCQlpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9Jbml0KQorCQkJCSAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLAorCQkJCSAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSk7CitSZXFIYW5kbGVySW5mb190ICpSZXFIYW5kbGVyRmluZChHVUlEIHN3aXRjaFR5cGVHdWlkKTsKK2ludCBSZXFIYW5kbGVyRGVsKEdVSUQgc3dpdGNoVHlwZUd1aWQpOworCisjZGVmaW5lIHVpc2xpYl9pb3JlbWFwX2NhY2hlKGFkZHIsIHNpemUpIFwKKwlkYmdfaW9yZW1hcF9jYWNoZShhZGRyLCBzaXplLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICoKK2RiZ19pb3JlbWFwX2NhY2hlKFU2NCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworCXZvaWQgX19pb21lbSAqbmV3OworCW5ldyA9IGlvcmVtYXBfY2FjaGUoYWRkciwgc2l6ZSk7CisJcmV0dXJuIG5ldzsKK30KKworI2RlZmluZSB1aXNsaWJfaW9yZW1hcChhZGRyLCBzaXplKSBkYmdfaW9yZW1hcChhZGRyLCBzaXplLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitkYmdfaW9yZW1hcChVNjQgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwl2b2lkICpuZXc7CisJbmV3ID0gaW9yZW1hcChhZGRyLCBzaXplKTsKKwlyZXR1cm4gbmV3OworfQorCisjZGVmaW5lIHVpc2xpYl9pb3VubWFwKGFkZHIpIGRiZ19pb3VubWFwKGFkZHIsIF9fRklMRV9fLCBfX0xJTkVfXykKKworc3RhdGljIGlubGluZSB2b2lkCitkYmdfaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworCWlvdW5tYXAoYWRkcik7Cit9CisKKyNkZWZpbmUgUFJPQ19SRUFEX0JVRkZFUl9TSVpFIDEzMTA3MgkvKiBzaXplIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUgdG8KKwkJCQkJICogaG9sZCBhbGwgb2YgL3Byb2MvWFhYL2luZm8gKi8KK2ludCB1aXN1dGlsX2FkZF9wcm9jX2xpbmVfZXgoaW50ICp0b3RhbCwgY2hhciAqKmJ1ZmZlciwgaW50ICpidWZmZXJfcmVtYWluaW5nLAorCQkJICAgICBjaGFyICpmb3JtYXQsIC4uLik7CisKK2ludCB1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKGludCB0eXBlLCB2b2lkICpmcHRyLAorCQkJCSBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmNoaXBzZXRfRHJpdmVySW5mbyk7CitpbnQgdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leChHVUlEIHN3aXRjaFR5cGVHdWlkLAorCQkJCSAgICBjb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCQkJCSAgICBpbnQgKCpmcHRyKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBtaW5fY2hhbm5lbF9ieXRlcywKKwkJCQkgICAgaW50ICgqU2VydmVyX0NoYW5uZWxfT2spKHVuc2lnbmVkIGxvbmcKKwkJCQkJCQkgICAgIGNoYW5uZWxCeXRlcyksCisJCQkJICAgIGludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCisJCQkJICAgICh2b2lkICp4LCB1bnNpZ25lZCBjaGFyICpjbGllbnRTdHIsCisJCQkJICAgICBVMzIgY2xpZW50U3RyTGVuLCBVNjQgYnl0ZXMpLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmNoaXBzZXRfRHJpdmVySW5mbyk7CisKK2ludCB1aXNjdHJsX3VucmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCk7Cit1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0KHN0cnVjdCBwaHlzX2luZm8gKnNnKTsKK3ZvaWQgdXRpbF91bm1hcF92aXJ0KHN0cnVjdCBwaHlzX2luZm8gKnNnKTsKK3Vuc2lnbmVkIGNoYXIgKnV0aWxfbWFwX3ZpcnRfYXRvbWljKHN0cnVjdCBwaHlzX2luZm8gKnNnKTsKK3ZvaWQgdXRpbF91bm1hcF92aXJ0X2F0b21pYyh2b2lkICpidWYpOworaW50IHVpc2xpYl9zZXJ2ZXJfaW5qZWN0X2FkZF92bmljKFUzMiBzd2l0Y2hObywgVTMyIEJ1c05vLCBVMzIgbnVtSW50UG9ydHMsCisJCQkJICBVMzIgbnVtRXh0UG9ydHMsIE1BQ0FSUkFZIHBtYWNbXSwKKwkJCQkgIHBDSEFOTkVMX0hFQURFUiAqKmNoYW4pOwordm9pZCB1aXNsaWJfc2VydmVyX2luamVjdF9kZWxfdm5pYyhVMzIgc3dpdGNoTm8sIFUzMiBidXNObywgVTMyIG51bUludFBvcnRzLAorCQkJCSAgIFUzMiBudW1FeHRQb3J0cyk7CitpbnQgdWlzbGliX2NsaWVudF9pbmplY3RfYWRkX2J1cyhVMzIgYnVzTm8sIEdVSUQgaW5zdEd1aWQsCisJCQkJIFU2NCBjaGFubmVsQWRkciwgdWxvbmcgbkNoYW5uZWxCeXRlcyk7CitpbnQgIHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF9idXMoVTMyIGJ1c05vKTsKKworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF92aGJhKFUzMiBidXNObywgVTMyIGRldk5vLAorCQkJCSAgVTY0IHBoeXNfY2hhbl9hZGRyLCBVMzIgY2hhbl9ieXRlcywKKwkJCQkgIGludCBpc190ZXN0X2FkZHIsIEdVSUQgaW5zdEd1aWQsCisJCQkJICBzdHJ1Y3QgSW50ZXJydXB0SW5mbyAqaW50cik7CitpbnQgIHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObyk7CitpbnQgdWlzbGliX2NsaWVudF9pbmplY3RfZGVsX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF92bmljKFUzMiBidXNObywgVTMyIGRldk5vLAorCQkJCSAgVTY0IHBoeXNfY2hhbl9hZGRyLCBVMzIgY2hhbl9ieXRlcywKKwkJCQkgIGludCBpc190ZXN0X2FkZHIsIEdVSUQgaW5zdEd1aWQsCisJCQkJICBzdHJ1Y3QgSW50ZXJydXB0SW5mbyAqaW50cik7CitpbnQgdWlzbGliX2NsaWVudF9pbmplY3RfcGF1c2Vfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObyk7CitpbnQgdWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92bmljKFUzMiBidXNObywgVTMyIGRldk5vKTsKKyNpZmRlZiBTVE9SQUdFX0NIQU5ORUwKK1U2NCB1aXNsaWJfc3RvcmFnZV9jaGFubmVsKGludCBjbGllbnRfaWQpOworI2VuZGlmCitpbnQgdWlzbGliX2dldF9vd25lZF9wZGVzdChzdHJ1Y3QgdWlzc2NzaV9kZXN0ICpwZGVzdCk7CisKK2ludCB1aXNsaWJfc2VuZF9ldmVudChDT05UUk9MVk1fSUQgaWQsIENPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqZXZlbnQpOworCisvKiBzdHJ1Y3R1cmUgdXNlZCBieSB2aGJhICYgdm5pYyB0byBrZWVwIHRyYWNrIG9mIHF1ZXVlICYgdGhyZWFkIGluZm8gKi8KK3N0cnVjdCBjaGFuaW5mbyB7CisJc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbzsKKwkvKiB0aGlzIHNwZWNpZmllcyB0aGUgcXVldWUgc3RydWN0dXJlcyBmb3IgYSBjaGFubmVsICovCisJLyogQUxMT0NBVEVEIEJZIFRIRSBPVEhFUiBFTkQgLSBXRSBKVVNUIEdFVCBBIFBPSU5URVIgVE8gVEhFIE1FTU9SWSAqLworCXNwaW5sb2NrX3QgaW5zZXJ0bG9jazsKKwkvKiBjdXJyZW50bHkgdXNlZCBvbmx5IGluIHZpcnRuaWMgd2hlbiBzZW5kaW5nIGRhdGEgdG8gdWlzbmljICovCisJLyogdG8gc3luY2hyb25pemUgdGhlIGluc2VydHMgaW50byB0aGUgc2lnbmFsIHF1ZXVlICovCisJc3RydWN0IHVpc3RocmVhZF9pbmZvIHRocmVhZGluZm87CisJLyogdGhpcyBzcGVjaWZpZXMgdGhlIHRocmVhZCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIHRocmVhZCB0aGF0ICovCisJLyogaGFuZGxlcyB0aGlzIGNoYW5uZWwgKi8KK307CisKKy8qIHRoaXMgaXMgdGhlIHdhaXQgY29kZSBmb3IgYWxsIHRoZSB0aHJlYWRzIC0gaXQgaXMgdXNlZCB0byBnZXQKKyogc29tZXRoaW5nIGZyb20gYSBxdWV1ZSBjaG9pY2VzOiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUsCisqIF90aW1lb3V0LCBpbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKyovCisjZGVmaW5lIFVJU19USFJFQURfV0FJVF9NU0VDKHgpIHsgXAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKwlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoeCkpOyBcCit9CisjZGVmaW5lIFVJU19USFJFQURfV0FJVF9VU0VDKHgpIHsgXAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKwlzY2hlZHVsZV90aW1lb3V0KHVzZWNzX3RvX2ppZmZpZXMoeCkpOyBcCit9CisjZGVmaW5lIFVJU19USFJFQURfV0FJVCBVSVNfVEhSRUFEX1dBSVRfTVNFQyg1KQorI2RlZmluZSBVSVNfVEhSRUFEX1dBSVRfU0VDKHgpIHsgXAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKwlzY2hlZHVsZV90aW1lb3V0KCh4KSpIWik7IFwKK30KKworLyogVGhpcyBpcyBhIGhhY2sgdW50aWwgd2UgZml4IElPVk0gdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBoZWFkZXIKKyAqIGNvcnJlY3RseSBhdCBERVZJQ0VfQ1JFQVRFIHRpbWUsIElOU1RFQUQgT0Ygd2FpdGluZyB1bnRpbAorICogREVWSUNFX0NPTkZJR1VSRSB0aW1lLgorICovCisjZGVmaW5lIFdBSVRfRk9SX1ZBTElEX0dVSUQoZ3VpZCkgXAorCWRvIHsJCQkJCQkgICBcCisJCXdoaWxlIChNRU1DTVBfSU8oJmd1aWQsICZHdWlkMCwgc2l6ZW9mKEd1aWQwKSkgPT0gMCkgewlcCisJCQlMT0dFUlIoIldhaXRpbmcgZm9yIG5vbi0wIEdVSUQgKHdoeT8/PykuLi5cbiIpOyBcCisJCQlVSVNfVEhSRUFEX1dBSVRfU0VDKDUpOwkJCQlcCisJCX0JCQkJCQkJXAorCQlMT0dFUlIoIk9LLi4uIEdVSUQgaXMgbm9uLTAgbm93XG4iKTsJCQlcCisJfSB3aGlsZSAoMCkKKworLyogQ29weUZyYWdzSW5mb0Zyb21Ta2IgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYWRkZWQgdG8gZnJhZ3MgYXJyYXkKKyAqIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAqLwordW5zaWduZWQgaW50IHVpc3V0aWxfY29weV9mcmFnc2luZm9fZnJvbV9za2IodW5zaWduZWQgY2hhciAqY2FsbGluZ19jdHgsCisJCQkJCSAgICAgdm9pZCAqc2tiX2luLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4sCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGZyYWdzX21heCwKKwkJCQkJICAgICBzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorSXNzdWVfVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSKFU2NCAqQ29udHJvbEFkZHJlc3MsIFUzMiAqQ29udHJvbEJ5dGVzKQoreworCVZNQ0FMTF9JT19DT05UUk9MVk1fQUREUl9QQVJBTVMgcGFyYW1zOworCWludCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKKwlVNjQgcGh5c2FkZHI7CisKKwlwaHlzYWRkciA9IHZpcnRfdG9fcGh5cygmcGFyYW1zKTsKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSLCBwaHlzYWRkciwgcmVzdWx0KTsKKwlpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkgeworCQkqQ29udHJvbEFkZHJlc3MgPSBwYXJhbXMuQ2hhbm5lbEFkZHJlc3M7CisJCSpDb250cm9sQnl0ZXMgPSBwYXJhbXMuQ2hhbm5lbEJ5dGVzOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBJc3N1ZV9WTUNBTExfSU9fRElBR19BRERSKFU2NCAqRGlhZ0NoYW5uZWxBZGRyZXNzKQoreworCVZNQ0FMTF9JT19ESUFHX0FERFJfUEFSQU1TIHBhcmFtczsKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9JT19ESUFHX0FERFIsIHBoeXNhZGRyLCByZXN1bHQpOworCWlmIChWTUNBTExfU1VDQ0VTU0ZVTChyZXN1bHQpKQorCQkqRGlhZ0NoYW5uZWxBZGRyZXNzID0gcGFyYW1zLkNoYW5uZWxBZGRyZXNzOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitJc3N1ZV9WTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUihVNjQgKkRpYWdDaGFubmVsQWRkcmVzcykKK3sKKwlWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUl9QQVJBTVMgcGFyYW1zOworCWludCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKKwlVNjQgcGh5c2FkZHI7CisKKwlwaHlzYWRkciA9IHZpcnRfdG9fcGh5cygmcGFyYW1zKTsKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX0lPX1ZJU09SU0VSSUFMX0FERFIsIHBoeXNhZGRyLCByZXN1bHQpOworCWlmIChWTUNBTExfU1VDQ0VTU0ZVTChyZXN1bHQpKQorCQkqRGlhZ0NoYW5uZWxBZGRyZXNzID0gcGFyYW1zLkNoYW5uZWxBZGRyZXNzOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgUzY0IElzc3VlX1ZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUKHZvaWQpCit7CisJVTY0IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkciA9IDA7CisKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX1FVRVJZX0dVRVNUX1ZJUlRVQUxfVElNRV9PRkZTRVQsIHBoeXNhZGRyLAorCQkJcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIFM2NCBJc3N1ZV9WTUNBTExfTUVBU1VSRU1FTlRfRE9fTk9USElORyh2b2lkKQoreworCVU2NCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKKwlVNjQgcGh5c2FkZHIgPSAwOworCisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9NRUFTVVJFTUVOVF9ET19OT1RISU5HLCBwaHlzYWRkciwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgbG9nX2luZm9fdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfY3ljbGVzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YV9zdW1bNjRdOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YV9jbnRbNjRdOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfZGVsdGFbNjRdOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fZGVsdGFbNjRdOworfTsKKworc3RhdGljIGlubGluZSBpbnQgSXNzdWVfVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FKFU2NCBhZGp1c3RtZW50KQoreworCWludCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKKworCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUsIGFkanVzdG1lbnQsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK0lzc3VlX1ZNQ0FMTF9DSEFOTkVMX01JU01BVENIKGNvbnN0IGNoYXIgKkNoYW5uZWxOYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqSXRlbU5hbWUsCisJCQkgICAgICBVMzIgU291cmNlTGluZU51bWJlciwgY29uc3QgY2hhciAqcGF0aF9uX2ZuKQoreworCVZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0hfUEFSQU1TIHBhcmFtczsKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyOworCWNoYXIgKmxhc3Rfc2xhc2ggPSBOVUxMOworCisJc3RybmNweShwYXJhbXMuQ2hhbm5lbE5hbWUsIENoYW5uZWxOYW1lLAorCQlsZW5ndGhvZihWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUywgQ2hhbm5lbE5hbWUpKTsKKwlzdHJuY3B5KHBhcmFtcy5JdGVtTmFtZSwgSXRlbU5hbWUsCisJCWxlbmd0aG9mKFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0hfUEFSQU1TLCBJdGVtTmFtZSkpOworCXBhcmFtcy5Tb3VyY2VMaW5lTnVtYmVyID0gU291cmNlTGluZU51bWJlcjsKKworCWxhc3Rfc2xhc2ggPSBzdHJyY2hyKHBhdGhfbl9mbiwgJy8nKTsKKwlpZiAobGFzdF9zbGFzaCAhPSBOVUxMKSB7CisJCWxhc3Rfc2xhc2grKzsKKwkJc3RybmNweShwYXJhbXMuU291cmNlRmlsZU5hbWUsIGxhc3Rfc2xhc2gsCisJCQlsZW5ndGhvZihWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUywKKwkJCQkgU291cmNlRmlsZU5hbWUpKTsKKwl9IGVsc2UKKwkJc3RybmNweShwYXJhbXMuU291cmNlRmlsZU5hbWUsCisJCQkiQ2Fubm90IGRldGVybWluZSBzb3VyY2UgZmlsZW5hbWUiLAorCQkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsCisJCQkJIFNvdXJjZUZpbGVOYW1lKSk7CisKKwlwaHlzYWRkciA9IHZpcnRfdG9fcGh5cygmcGFyYW1zKTsKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSCwgcGh5c2FkZHIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgSXNzdWVfVk1DQUxMX0ZBVEFMX0JZRV9CWUUodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyID0gMDsKKworCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfR0VORVJJQ19TVVJSRU5ERVJfUVVBTlRVTV9GT1JFVkVSLCBwaHlzYWRkciwKKwkJCXJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBVSVNfREFFTU9OSVpFKG5hbSkKK3ZvaWQgKnVpc2xpYl9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY3VyX3Bvb2wsIGNoYXIgKmZuLCBpbnQgbG4pOworI2RlZmluZSBVSVNDQUNIRUFMTE9DKGN1cl9wb29sKSB1aXNsaWJfY2FjaGVfYWxsb2MoY3VyX3Bvb2wsIF9fRklMRV9fLCBfX0xJTkVfXykKK3ZvaWQgdWlzbGliX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKmN1cl9wb29sLCB2b2lkICpwLCBjaGFyICpmbiwgaW50IGxuKTsKKyNkZWZpbmUgVUlTQ0FDSEVGUkVFKGN1cl9wb29sLCBwKSBcCisJdWlzbGliX2NhY2hlX2ZyZWUoY3VyX3Bvb2wsIHAsIF9fRklMRV9fLCBfX0xJTkVfXykKKwordm9pZCB1aXNsaWJfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCQkgICAgICBpbnQgKCppbnRlcnJ1cHQpKHZvaWQgKiksCisJCQkJICAgICAgdm9pZCAqaW50ZXJydXB0X2NvbnRleHQpOwordm9pZCB1aXNsaWJfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOwordm9pZCB1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworCisjZW5kaWYgLyogX19VSVNVVElMU19fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdW5pa2xvZy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDdiODdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaApAQCAtMCwwICsxLDE5MyBAQAorLyogdW5pa2xvZy5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBUaGlzIG1vZHVsZSBjb250YWlucyBtYWNyb3MgdG8gYWlkIGRldmVsb3BlcnMgaW4gbG9nZ2luZyBtZXNzYWdlcy4KKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhZmZlY3RlZCBieSB0aGUgREVCVUcgY29tcGlsZXRpbWUgb3B0aW9uLgorICoKKyAqLworI2lmbmRlZiBfX1VOSUtMT0dfSF9fCisjZGVmaW5lIF9fVU5JS0xPR19IX18KKworCisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisKKy8qCisgKiAjIERCR0lORgorICoKKyAqIFxicmllZiBMb2cgZGVidWcgaW5mb3JtYXRpb25hbCBtZXNzYWdlIC0gbG9nIGEgTE9HX0lORk8gbWVzc2FnZSBvbmx5CisgKiAgICAgICAgaWYgREVCVUcgY29tcGlsZXRpbWUgb3B0aW9uIGVuYWJsZWQKKyAqCisgKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgorICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgorICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgorICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUKKyAqICAgICAgICAgICAgIGZvcm1hdCBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2cgYSBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbCwgYnV0IG9ubHkgaWYgREVCVUcgaXMgZW5hYmxlZC4gIElmCisgKiBERUJVRyBpcyBkaXNhYmxlZCwgdGhpcyBleHBhbmRzIHRvIGEgbm8tb3AuCisgKi8KKworLyoKKyAqICMgREJHVkVSCisgKgorICogXGJyaWVmIExvZyBkZWJ1ZyB2ZXJib3NlIG1lc3NhZ2UgLSBsb2cgYSBMT0dfREVCVUcgbWVzc2FnZSBvbmx5IGlmCisgKiAgICAgICAgREVCVUcgY29tcGlsZXRpbWUgb3B0aW9uIGVuYWJsZWQKKyAqCisgKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgorICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgorICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgorICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUKKyAqICAgICAgICAgICAgIGZvcm1hdCBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2cgYSBtZXNzYWdlIGF0IHRoZSBMT0dfREVCVUcgbGV2ZWwsIGJ1dCBvbmx5IGlmIERFQlVHIGlzIGVuYWJsZWQuICBJZgorICogREVCVUcgaXMgZGlzYWJsZWQsIHRoaXMgZXhwYW5kcyB0byBhIG5vLW9wLiAgTm90ZSBhbHNvIHRoYXQgTE9HX0RFQlVHCisgKiBtZXNzYWdlcyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCBydW50aW1lIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgREJHSU5GREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREJHVkVSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREJHSU5GKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREJHVkVSKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqICMgTE9HSU5GCisgKgorICogXGJyaWVmIExvZyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgLSBsb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0lORk8gbGV2ZWwKKyAqCisgKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgorICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgorICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgorICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUKKyAqICAgICAgICAgICAgIGZvcm1hdCBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2dzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhdCB0aGUgTE9HX0lORk8gbGV2ZWwuCisgKi8KKworI2RlZmluZSBMT0dJTkYoZm10LCBhcmdzLi4uKSBwcl9pbmZvKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HSU5GREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAorCXByX2luZm8oIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQorI2RlZmluZSBMT0dJTkZERVZYKGRldm5vLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcl9pbmZvKCJkZXYlZCAiIGZtdCwgZGV2bm8sICMjIGFyZ3MpCisjZGVmaW5lIExPR0lORk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAodm5pYyAhPSBOVUxMKSB7CQkJCQlcCisJCQlwcl9pbmZvKCIlcyAiIGZtdCwgdm5pYy0+bmFtZSwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlwcl9pbmZvKGZtdCwgIyMgYXJncyk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworLyoKKyAqICMgTE9HVkVSCisgKgorICogXGJyaWVmIExvZyB2ZXJib3NlIG1lc3NhZ2UgLSBsb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0RFQlVHIGxldmVsLAorICogICAgICAgIHdoaWNoIGNhbiBiZSBkaXNhYmxlZCBhdCBydW50aW1lCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAorICogXHBhcmFtIHN0cmluZy4KKyAqIFxyZXR1cm4gbm90aGluZworICoKKyAqIExvZ3MgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGF0IHRoZSBMT0dfREVCVUcgbGV2ZWwuICBOb3RlIGFsc28gdGhhdAorICogTE9HX0RFQlVHIG1lc3NhZ2VzIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGF0IHJ1bnRpbWUgYXMgd2VsbC4KKyAqLworI2RlZmluZSBMT0dWRVIoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR1ZFUkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcl9kZWJ1ZygiJXMgIiBmbXQsIGRldm5hbWUsICMjIGFyZ3MpCisjZGVmaW5lIExPR1ZFUk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAorCQkJcHJfZGVidWcoIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXByX2RlYnVnKGZtdCwgIyMgYXJncyk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworCisvKgorICogIyBMT0dFUlIKKyAqCisgKiBcYnJpZWYgTG9nIGVycm9yIG1lc3NhZ2UgLSBsb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0VSUiBsZXZlbCwKKyAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAorICogXHBhcmFtIHN0cmluZy4KKyAqIFxyZXR1cm4gbm90aGluZworICoKKyAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfRVJSIGxldmVsLiAgSXQgd2lsbCBhbHNvCisgKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCisgKiBvcmlnaW5hdGVkIGluIHRoZSBsb2cgbWVzc2FnZS4KKyAqLworI2RlZmluZSBMT0dFUlIoZm10LCBhcmdzLi4uKSBwcl9lcnIoZm10LCAjIyBhcmdzKQorI2RlZmluZSBMT0dFUlJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCisJcHJfZXJyKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKKyNkZWZpbmUgTE9HRVJSREVWWChkZXZubywgZm10LCBhcmdzLi4uKSBcCisJcHJfZXJyKCJkZXYlZCAiIGZtdCwgZGV2bm8sICMjIGFyZ3MpCisjZGVmaW5lIExPR0VSUk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAodm5pYyAhPSBOVUxMKSB7CQkJCQlcCisJCQlwcl9lcnIoIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXByX2VycihmbXQsICMjIGFyZ3MpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIExPR09SRFVNUEVSUihzZXFmaWxlLCBmbXQsIGFyZ3MuLi4pIGRvIHsJCVwKKwkJaWYgKHNlcWZpbGUpIHsJCQkJCVwKKwkJCXNlcV9wcmludGYoc2VxZmlsZSwgZm10LCAjIyBhcmdzKTsJXAorCQl9IGVsc2UgewkJCQkJXAorCQkJTE9HRVJSKGZtdCwgIyMgYXJncyk7CQkJXAorCQl9CQkJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiAjIExPR1dSTgorICoKKyAqIFxicmllZiBMb2cgd2FybmluZyBtZXNzYWdlIC0gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19XQVJOSU5HIGxldmVsLAorICogICAgICAgIGluY2x1ZGluZyBzb3VyY2UgbGluZSBudW1iZXIgaW5mb3JtYXRpb24KKyAqCisgKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgorICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgorICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgorICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgZm9ybWF0CisgKiBccGFyYW0gc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9ncyB0aGUgc3BlY2lmaWVkIGVycm9yIG1lc3NhZ2UgYXQgdGhlIExPR19XQVJOSU5HIGxldmVsLiAgSXQgd2lsbCBhbHNvCisgKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCisgKiBvcmlnaW5hdGVkIGluIHRoZSBsb2cgbWVzc2FnZS4KKyAqLworI2RlZmluZSBMT0dXUk4oZm10LCBhcmdzLi4uKSBwcl93YXJuKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HV1JOREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAorCXByX3dhcm4oIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQorI2RlZmluZSBMT0dXUk5OQU1FKHZuaWMsIGZtdCwgYXJncy4uLikgXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAorCQkJcHJfd2FybigiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJcHJfd2FybihmbXQsICMjIGFyZ3MpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX1VOSUtMT0dfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmJ1c2hlbHBlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2UzNWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKiB2YnVzaGVscGVyLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDExIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WQlVTSEVMUEVSX0hfXworI2RlZmluZSBfX1ZCVVNIRUxQRVJfSF9fCisKKyNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgorCisvKiBUQVJHRVRfSE9TVE5BTUUgc3BlY2lmaWVkIGFzIC1EVEFSR0VUX0hPU1ROQU1FPVwidGhlbmFtZVwiIG9uIHRoZQorICogY29tbWFuZCBsaW5lICovCisKKyNkZWZpbmUgVEFSR0VUX0hPU1ROQU1FICJsaW51eGd1ZXN0IgorCitzdGF0aWMgaW5saW5lIHZvaWQKK0J1c0RldmljZUluZm9fSW5pdChVTFRSQV9WQlVTX0RFVklDRUlORk8gKnBCdXNEZXZpY2VJbmZvLAorCQkgICBjb25zdCBjaGFyICpkZXZpY2VUeXBlLCBjb25zdCBjaGFyICpkcml2ZXJOYW1lLAorCQkgICBjb25zdCBjaGFyICp2ZXIsIGNvbnN0IGNoYXIgKnZlclRhZywKKwkJICAgY29uc3QgY2hhciAqYnVpbGREYXRlLCBjb25zdCBjaGFyICpidWlsZFRpbWUpCit7CisJbWVtc2V0KHBCdXNEZXZpY2VJbmZvLCAwLCBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSk7CisJc25wcmludGYocEJ1c0RldmljZUluZm8tPmRldlR5cGUsIHNpemVvZihwQnVzRGV2aWNlSW5mby0+ZGV2VHlwZSksCisJCSAiJXMiLCAoZGV2aWNlVHlwZSkgPyBkZXZpY2VUeXBlIDogInVua25vd25UeXBlIik7CisJc25wcmludGYocEJ1c0RldmljZUluZm8tPmRydk5hbWUsIHNpemVvZihwQnVzRGV2aWNlSW5mby0+ZHJ2TmFtZSksCisJCSAiJXMiLCAoZHJpdmVyTmFtZSkgPyBkcml2ZXJOYW1lIDogInVua25vd25Ecml2ZXIiKTsKKwlzbnByaW50ZihwQnVzRGV2aWNlSW5mby0+aW5mb1N0cmluZ3MsCisJCSBzaXplb2YocEJ1c0RldmljZUluZm8tPmluZm9TdHJpbmdzKSwgIiVzXHQlc1x0JXMgJXNcdCVzIiwKKwkJICh2ZXIpID8gdmVyIDogInVua25vd25WZXIiLAorCQkgKHZlclRhZykgPyB2ZXJUYWcgOiAidW5rbm93blZlclRhZyIsCisJCSAoYnVpbGREYXRlKSA/IGJ1aWxkRGF0ZSA6ICJub0J1aWxkRGF0ZSIsCisJCSAoYnVpbGRUaW1lKSA/IGJ1aWxkVGltZSA6ICJub2J1aWxkVGltZSIsIFRBUkdFVF9IT1NUTkFNRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4N2Q5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBVbmlzeXMgdWlzbGliIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFVOSVNZU19VSVNMSUIKKwl0cmlzdGF0ZSAiVW5pc3lzIHVpc2xpYiBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUkNISVBTRVQgJiYgVU5JU1lTX0NIQU5ORUxTVFVCCisJLS0taGVscC0tLQorCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB1aXNsaWIgZHJpdmVyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDRkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciBVbmlzeXMgdWlzbGliCisjCisKK29iai0kKENPTkZJR19VTklTWVNfVUlTTElCKQkrPSB2aXNvcnVpc2xpYi5vCisKK3Zpc29ydWlzbGliLXkgOj0gdWlzbGliLm8gdWlzcXVldWUubyAgdWlzdGhyZWFkLm8gIHVpc3V0aWxzLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldAorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9zcGFyc3RvcGRyaXZlcgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMKKworY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTljNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwpAQCAtMCwwICsxLDI0MjEgQEAKKy8qIHVpc2xpYi5jCisgKgorICogQ29weXJpZ2h0IO+/vSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIEBBTExfSU5TUEVDVEVEICovCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgkvKiBmb3IgY29weV9mcm9tX3VzZXIgKi8KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgkvKiBmb3IgdG91cHBlciAqLworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgInNwYXJzdG9wLmgiCisjaW5jbHVkZSAidmlzb3JjaGlwc2V0LmgiCisjaW5jbHVkZSAiY2hhbnN0dWIuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCisKKyNkZWZpbmUgU0VUX1BST0NfT1dORVIoeCwgeSkKKworI2RlZmluZSBVSVNMSUJfVEVTVF9QUk9DCisjZGVmaW5lIFBPTExKSUZGSUVTX05PUk1BTCAxCisvKiBDaG9vc2Ugd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8gd2FrZXVwIHRoZSByZXF1ZXN0LXBvbGxpbmcgdGhyZWFkCisgKiBhZnRlciBhbiBJTyB0ZXJtaW5hdGlvbjoKKyAqIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMKKyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc2xpYl9jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc2xpYi5jIgorCisvKiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBhY3QgYXMgY2FsbGJhY2sgZnVuY3Rpb25zIGludG8gdmlydHBjaW1vZCAqLworaW50ICgqVmlydENvbnRyb2xDaGFuRnVuYykoc3RydWN0IGd1ZXN0X21zZ3MgKik7CisKK3N0YXRpYyBpbnQgUHJvY1JlYWRCdWZmZXJWYWxpZDsKK3N0YXRpYyBjaGFyICpQcm9jUmVhZEJ1ZmZlcjsJLyogTm90ZSB0aGlzIE1VU1QgYmUgZ2xvYmFsLAorCQkJCQkgKiBiZWNhdXNlIHRoZSBjb250ZW50cyBtdXN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNoaXBzZXRfaW5pdGVkOworCisjZGVmaW5lIFdBSVRfT05fQ0FMTEJBQ0soaGFuZGxlKQlcCisJZG8gewkJCVwKKwkJaWYgKGhhbmRsZSkJCVwKKwkJCWJyZWFrOwkJXAorCQlVSVNfVEhSRUFEX1dBSVQ7CVwKKwl9IHdoaWxlICgxKQorCitzdGF0aWMgc3RydWN0IGJ1c19pbmZvICpCdXNMaXN0SGVhZDsKK3N0YXRpYyByd2xvY2tfdCBCdXNMaXN0TG9jazsKK3N0YXRpYyBpbnQgQnVzTGlzdENvdW50OwkvKiBudW1iZXIgb2YgYnVzZXMgaW4gdGhlIGxpc3QgKi8KK3N0YXRpYyBpbnQgTWF4QnVzQ291bnQ7CQkvKiBtYXhpbXVtIG51bWJlciBvZiBidXNlcyBleHBlY3RlZCAqLworc3RhdGljIFU2NCBQaHlzaWNhbERhdGFDaGFuOworc3RhdGljIGludCBQbGF0Zm9ybU51bWJlcjsKKworc3RhdGljIHN0cnVjdCB1aXN0aHJlYWRfaW5mbyBJbmNvbWluZ19UaHJlYWRJbmZvOworc3RhdGljIEJPT0wgSW5jb21pbmdfVGhyZWFkX1N0YXJ0ZWQgPSBGQUxTRTsKK3N0YXRpYyBMSVNUX0hFQUQoTGlzdF9Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRvdF9tb3ZlZF90b190YWlsX2NudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdG90X3dhaXRfY250Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3Rfd2FrZXVwX2NudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdG90X3NjaGVkdWxlX2NudDsKK3N0YXRpYyBpbnQgZW5fc21hcnRfd2FrZXVwID0gMTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKExvY2tfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOwkvKiB1bmxvY2tlZCAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKFdha2V1cF9Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CitzdGF0aWMgaW50IEdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp1aXNsaWJfcHJvY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp1aXNsaWJfcHJvY192YnVzX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZuaWNfcHJvY19lbnRyeTsJLyogVXNlZCB0byBiZSAiZGF0YWNoYW4iICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjdHJsY2hhbl9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcG1lbV9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW5mb19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc3dpdGNoX3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpleHRwb3J0X3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwbGF0Zm9ybW51bWJlcl9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYnVzX3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZXZfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmNoaXBzZXRfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmN5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVzZXRfY291bnRzX3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzbWFydF93YWtldXBfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpc2FibGVfcHJvY19lbnRyeTsKKworI2RlZmluZSBESVJfUFJPQ19FTlRSWSAidWlzbGliIgorI2RlZmluZSBESVJfVkJVU19QUk9DX0VOVFJZICJ2YnVzIgorI2RlZmluZSBWTklDX1BST0NfRU5UUllfRk4gInZuaWMiCS8qIFVzZWQgdG8gYmUgImRhdGFjaGFuIiAqLworI2RlZmluZSBDVFJMQ0hBTl9QUk9DX0VOVFJZX0ZOICJjdHJsY2hhbiIKKyNkZWZpbmUgUE1FTV9QUk9DX0VOVFJZX0ZOICJwaHlzX3RvX3ZpcnQiCisjZGVmaW5lIElORk9fUFJPQ19FTlRSWV9GTiAiaW5mbyIKKyNkZWZpbmUgU1dJVENIX1BST0NfRU5UUllfRk4gInN3aXRjaCIKKyNkZWZpbmUgU1dJVENIX0NPVU5UX1BST0NfRU5UUllfRk4gInN3aXRjaF9jb3VudCIKKyNkZWZpbmUgRVhUUE9SVF9QUk9DX0VOVFJZX0ZOICJleHRwb3J0IgorI2RlZmluZSBQTEFURk9STU5VTUJFUl9QUk9DX0VOVFJZX0ZOICJwbGF0Zm9ybSIKKyNkZWZpbmUgQlVTX1BST0NfRU5UUllfRk4gImJ1cyIKKyNkZWZpbmUgREVWX1BST0NfRU5UUllfRk4gImRldmljZSIKKyNkZWZpbmUgQ0hJUFNFVF9QUk9DX0VOVFJZX0ZOICJjaGlwc2V0IgorI2RlZmluZSBDWUNMRVNfQkVGT1JFX1dBSVRfUFJPQ19FTlRSWV9GTiAiY3ljbGVzX2JlZm9yZV93YWl0IgorI2RlZmluZSBSRVNFVF9DT1VOVFNfUFJPQ19FTlRSWV9GTiAicmVzZXRfY291bnRzIgorI2RlZmluZSBTTUFSVF9XQUtFVVBfUFJPQ19FTlRSWV9GTiAic21hcnRfd2FrZXVwIgorI2RlZmluZSBDQUxMSE9NRV9QUk9DX0VOVFJZX0ZOICJjYWxsaG9tZSIKKyNkZWZpbmUgQ0FMTEhPTUVfVEhST1RUTEVEX1BST0NfRU5UUllfRk4gImNhbGxob21lX3Rocm90dGxlZCIKKyNkZWZpbmUgRElTQUJMRV9QUk9DX0VOVFJZX0ZOICJzd2l0Y2hfc3RhdGUiCisjaWZkZWYgVUlTTElCX1RFU1RfUFJPQworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdGVzdF9wcm9jX2VudHJ5OworI2RlZmluZSBURVNUX1BST0NfRU5UUllfRk4gInRlc3QiCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzX2JlZm9yZV93YWl0LCB3YWl0X2N5Y2xlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHByb2NfaW5mb192YnVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQKK3Byb2NfaW5mb192YnVzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJLyogcHJvY19pbmZvX3ZidXNfc2hvdyB3aWxsIGdyYWIgdGhpcyBmcm9tIHNlcV9maWxlLnByaXZhdGU6ICovCisJc3RydWN0IGJ1c19pbmZvICpidXMgPSBQREVfREFUQShpbm9kZSk7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbHAsIHByb2NfaW5mb192YnVzX3Nob3csIGJ1cyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5mb192YnVzX2ZvcHMgPSB7CisJLm9wZW4gPSBwcm9jX2luZm9fdmJ1c19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHNzaXplX3QgdWlzbGliX3Byb2NfcmVhZF93cml0ZW9ubHkoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBzc2l6ZV90IHZuaWNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfdm5pY19mb3BzID0geworCS5yZWFkID0gdWlzbGliX3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gdm5pY19wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3QgY2hpcHNldF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NoaXBzZXRfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGNoaXBzZXRfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGluZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19pbmZvX2ZvcHMgPSB7CisJLnJlYWQgPSBpbmZvX3Byb2NfcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90IHBsYXRmb3JtbnVtYmVyX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19wbGF0Zm9ybW51bWJlcl9mb3BzID0geworCS5yZWFkID0gcGxhdGZvcm1udW1iZXJfcHJvY19yZWFkLAorfTsKKworc3RhdGljIHNzaXplX3QgY3ljbGVzX2JlZm9yZV93YWl0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2N5Y2xlc19iZWZvcmVfd2FpdF9mb3BzID0geworCS5yZWFkID0gdWlzbGliX3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gY3ljbGVzX2JlZm9yZV93YWl0X3Byb2Nfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCByZXNldF9jb3VudHNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19yZXNldF9jb3VudHNfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHJlc2V0X2NvdW50c19wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3Qgc21hcnRfd2FrZXVwX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc21hcnRfd2FrZXVwX2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBzbWFydF93YWtldXBfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHRlc3RfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdGVzdF9mb3BzID0geworCS5yZWFkID0gdWlzbGliX3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gdGVzdF9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3QgYnVzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19idXNfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGJ1c19wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3QgZGV2X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kZXZfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGRldl9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHZvaWQKK2luaXRfbXNnX2hlYWRlcihDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBVMzIgaWQsIHVpbnQgcnNwLCB1aW50IHN2cikKK3sKKwltZW1zZXQobXNnLCAwLCBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKTsKKwltc2ctPmhkci5JZCA9IGlkOworCW1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPSByc3A7CisJbXNnLT5oZHIuRmxhZ3Muc2VydmVyID0gc3ZyOworfQorCitzdGF0aWMgdm9pZAorY3JlYXRlX2J1c19wcm9jX2VudHJpZXMoc3RydWN0IGJ1c19pbmZvICpidXMpCit7CisJYnVzLT5wcm9jX2RpciA9IHByb2NfbWtkaXIoYnVzLT5uYW1lLCB1aXNsaWJfcHJvY192YnVzX2Rpcik7CisJaWYgKCFidXMtPnByb2NfZGlyKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYy91aXNsaWIvdmJ1cy8lcyBkaXJlY3RvcnkiLAorCQkgICAgICAgYnVzLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlidXMtPnByb2NfaW5mbyA9IHByb2NfY3JlYXRlX2RhdGEoImluZm8iLCAwLCBidXMtPnByb2NfZGlyLAorCQkJCQkgICZwcm9jX2luZm9fdmJ1c19mb3BzLCBidXMpOworCWlmICghYnVzLT5wcm9jX2luZm8pIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jL3Vpc2xpYi92YnVzLyVzL2luZm8iLCBidXMtPm5hbWUpOworCQlyZW1vdmVfcHJvY19lbnRyeShidXMtPm5hbWUsIHVpc2xpYl9wcm9jX3ZidXNfZGlyKTsKKwkJYnVzLT5wcm9jX2RpciA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJU0VUX1BST0NfT1dORVIoYnVzLT5wcm9jX2luZm8sIFRISVNfTU9EVUxFKTsKKworfQorCitzdGF0aWMgX19pb21lbSB2b2lkICoKK2luaXRfdmJ1c19jaGFubmVsKFU2NCBjaGFubmVsQWRkciwgVTMyIGNoYW5uZWxCeXRlcywgaW50IGlzU2VydmVyKQoreworCXZvaWQgKnJjID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKnBDaGFuID0gdWlzbGliX2lvcmVtYXBfY2FjaGUoY2hhbm5lbEFkZHIsIGNoYW5uZWxCeXRlcyk7CisJaWYgKCFwQ2hhbikgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIGVycm9yOiBpb3JlbWFwX2NhY2hlIG9mIGNoYW5uZWxBZGRyOiVMeCBmb3IgY2hhbm5lbEJ5dGVzOiVsbHUgZmFpbGVkIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBjaGFubmVsQWRkciwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBjaGFubmVsQnl0ZXMpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKGlzU2VydmVyKSB7CisJCW1lbXNldF9pbyhwQ2hhbiwgMCwgY2hhbm5lbEJ5dGVzKTsKKwkJaWYgKCFVTFRSQV9WQlVTX0NIQU5ORUxfT0tfU0VSVkVSKGNoYW5uZWxCeXRlcywgTlVMTCkpIHsKKwkJCUVSUkRSVigiJXMgY2hhbm5lbCBjYW5ub3QgYmUgdXNlZCIsIF9fZnVuY19fKTsKKwkJCXVpc2xpYl9pb3VubWFwKHBDaGFuKTsKKwkJCXJjID0gTlVMTDsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlVTFRSQV9WQlVTX2luaXRfY2hhbm5lbChwQ2hhbiwgY2hhbm5lbEJ5dGVzKTsKKwl9IGVsc2UgeworCQlpZiAoIVVMVFJBX1ZCVVNfQ0hBTk5FTF9PS19DTElFTlQocENoYW4sIE5VTEwpKSB7CisJCQlFUlJEUlYoIiVzIGNoYW5uZWwgY2Fubm90IGJlIHVzZWQiLCBfX2Z1bmNfXyk7CisJCQl1aXNsaWJfaW91bm1hcChwQ2hhbik7CisJCQlyYyA9IE5VTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwl9CisJcmMgPSBwQ2hhbjsKK0F3YXk6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitjcmVhdGVfYnVzKENPTlRST0xWTV9NRVNTQUdFICptc2csIGNoYXIgKmJ1ZikKK3sKKwlVMzIgYnVzTm8sIGRldmljZUNvdW50OworCXN0cnVjdCBidXNfaW5mbyAqdG1wLCAqYnVzOworCXNpemVfdCBzaXplOworCisJaWYgKE1heEJ1c0NvdW50ID09IEJ1c0xpc3RDb3VudCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIEZhaWxlZDogbWF4IGJ1c2VzOiVkIGFscmVhZHkgY3JlYXRlZFxuIiwKKwkJICAgICBNYXhCdXNDb3VudCk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBNYXhCdXNDb3VudCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9CVVNFUzsKKwl9CisKKwlidXNObyA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5idXNObzsKKwlkZXZpY2VDb3VudCA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5kZXZpY2VDb3VudDsKKworCVBPU1RDT0RFX0xJTlVYXzQoQlVTX0NSRUFURV9FTlRSWV9QQywgYnVzTm8sIGRldmljZUNvdW50LAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJc2l6ZSA9CisJICAgIHNpemVvZihzdHJ1Y3QgYnVzX2luZm8pICsKKwkgICAgKGRldmljZUNvdW50ICogc2l6ZW9mKHN0cnVjdCBkZXZpY2VfaW5mbyAqKSk7CisJYnVzID0ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1cykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIEZhaWxlZDoga21hbGxvYyBmb3IgYnVzIGZhaWxlZC5cbiIpOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKKwl9CisKKwkvKiBDdXJyZW50bHkgYnkgZGVmYXVsdCwgdGhlIGJ1cyBOdW1iZXIgaXMgdGhlIEd1ZXN0SGFuZGxlLgorCSAqIENvbmZpZ3VyZSBCdXMgbWVzc2FnZSBjYW4gb3ZlcnJpZGUgdGhpcy4KKwkgKi8KKwlpZiAobXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UpIHsKKwkJLyogVGhpcyBpbXBsaWVzIHdlJ3JlIHRoZSBJT1ZNIHNvIHNldCBndWVzdCBoYW5kbGUgdG8gMC4uLiAqLworCQlidXMtPmd1ZXN0SGFuZGxlID0gMDsKKwkJYnVzLT5idXNObyA9IGJ1c05vOworCQlidXMtPmxvY2FsVm5pYyA9IDE7CisJfSBlbHNlCisJCWJ1cy0+YnVzTm8gPSBidXMtPmd1ZXN0SGFuZGxlID0gYnVzTm87CisJc3ByaW50ZihidXMtPm5hbWUsICIlZCIsIChpbnQpIGJ1cy0+YnVzTm8pOworCWJ1cy0+ZGV2aWNlQ291bnQgPSBkZXZpY2VDb3VudDsKKwlidXMtPmRldmljZSA9CisJICAgIChzdHJ1Y3QgZGV2aWNlX2luZm8gKiopICgoY2hhciAqKSBidXMgKyBzaXplb2Yoc3RydWN0IGJ1c19pbmZvKSk7CisJYnVzLT5idXNJbnN0R3VpZCA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5idXNJbnN0R3VpZDsKKwlidXMtPmJ1c0NoYW5uZWxCeXRlcyA9IDA7CisJYnVzLT5wQnVzQ2hhbm5lbCA9IE5VTEw7CisKKwkvKiBhZGQgYnVzIHRvIG91ciBidXMgbGlzdCAtIGJ1dCBjaGVjayBmb3IgZHVwbGljYXRlcyBmaXJzdCAqLworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAodG1wID0gQnVzTGlzdEhlYWQ7IHRtcDsgdG1wID0gdG1wLT5uZXh0KSB7CisJCWlmICh0bXAtPmJ1c05vID09IGJ1cy0+YnVzTm8pCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwlpZiAodG1wKSB7CisJCS8qIGZvdW5kIGEgYnVzIGFscmVhZHkgaW4gdGhlIGxpc3Qgd2l0aCBzYW1lIGJ1c05vIC0KKwkJICogcmVqZWN0IGFkZAorCQkgKi8KKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGJ1cyAlZCBhbHJlYWR5IGV4aXN0cy5cbiIsCisJCSAgICAgICBidXMtPmJ1c05vKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1cy0+YnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCWtmcmVlKGJ1cyk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJfQorCWlmICgobXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxBZGRyICE9IDApCisJICAgICYmIChtc2ctPmNtZC5jcmVhdGVCdXMuY2hhbm5lbEJ5dGVzICE9IDApKSB7CisJCWJ1cy0+YnVzQ2hhbm5lbEJ5dGVzID0gbXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlczsKKwkJYnVzLT5wQnVzQ2hhbm5lbCA9CisJCSAgICBpbml0X3ZidXNfY2hhbm5lbChtc2ctPmNtZC5jcmVhdGVCdXMuY2hhbm5lbEFkZHIsCisJCQkJICAgICAgbXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcywKKwkJCQkgICAgICBtc2ctPmhkci5GbGFncy5zZXJ2ZXIpOworCX0KKwkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kIGd1ZXN0X21zZ3Mgc3RydWN0IHRvIGNhbGxiYWNrICovCisJaWYgKCFtc2ctPmhkci5GbGFncy5zZXJ2ZXIpIHsKKwkJc3RydWN0IGd1ZXN0X21zZ3MgY21kOworCQljbWQubXNndHlwZSA9IEdVRVNUX0FERF9WQlVTOworCQljbWQuYWRkX3ZidXMuYnVzTm8gPSBidXNObzsKKwkJY21kLmFkZF92YnVzLmNoYW5wdHIgPSBidXMtPnBCdXNDaGFubmVsOworCQljbWQuYWRkX3ZidXMuZGV2aWNlQ291bnQgPSBkZXZpY2VDb3VudDsKKwkJY21kLmFkZF92YnVzLmJ1c1R5cGVHdWlkID0gbXNnLT5jbWQuY3JlYXRlQnVzLmJ1c0RhdGFUeXBlR3VpZDsKKwkJY21kLmFkZF92YnVzLmJ1c0luc3RHdWlkID0gbXNnLT5jbWQuY3JlYXRlQnVzLmJ1c0luc3RHdWlkOworCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpIHsKKwkJCWtmcmVlKGJ1cyk7CisJCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXMtPmJ1c05vLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFOworCQl9CisJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJa2ZyZWUoYnVzKTsKKwkJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX0FERF9WQlVTIHJldHVybmVkIGVycm9yLiIpOworCQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1cy0+YnVzTm8sCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJcmV0dXJuCisJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1I7CisJCX0KKwl9CisJY3JlYXRlX2J1c19wcm9jX2VudHJpZXMoYnVzKTsKKworCS8qIGFkZCBidXMgYXQgdGhlIGhlYWQgb2Ygb3VyIGxpc3QgKi8KKwl3cml0ZV9sb2NrKCZCdXNMaXN0TG9jayk7CisJaWYgKCFCdXNMaXN0SGVhZCkKKwkJQnVzTGlzdEhlYWQgPSBidXM7CisJZWxzZSB7CisJCWJ1cy0+bmV4dCA9IEJ1c0xpc3RIZWFkOworCQlCdXNMaXN0SGVhZCA9IGJ1czsKKwl9CisJQnVzTGlzdENvdW50Kys7CisJd3JpdGVfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisKKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRVhJVF9QQywgYnVzLT5idXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorZGVzdHJveV9idXMoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCWludCBpOworCXN0cnVjdCBidXNfaW5mbyAqYnVzLCAqcHJldiA9IE5VTEw7CisJVTMyIGJ1c05vOworCisJYnVzTm8gPSBtc2ctPmNtZC5kZXN0cm95QnVzLmJ1c05vOworCisJLyogZmluZCBhbmQgZGVsZXRlIHRoZSBidXMgKi8KKwlyZWFkX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwlmb3IgKGJ1cyA9IEJ1c0xpc3RIZWFkOyBidXM7IHByZXYgPSBidXMsIGJ1cyA9IGJ1cy0+bmV4dCkgeworCQlpZiAoYnVzLT5idXNObyA9PSBidXNObykgeworCQkJLyogZm91bmQgdGhlIGJ1cyAtIGVuc3VyZSB0aGF0IGFsbCBkZXZpY2UKKwkJCSAqIHNsb3RzIGFyZSBOVUxMCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBidXMtPmRldmljZUNvdW50OyBpKyspIHsKKwkJCQlpZiAoYnVzLT5kZXZpY2VbaV0gIT0gTlVMTCkgeworCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlaSBhdHRhY2hlZCB0byBidXMgJWQuIiwKKwkJCQkJICAgICBpLCBidXNObyk7CisJCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfREVWSUNFX0FUVEFDSEVEOworCQkJCX0KKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCisJCQkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjaworCQkJICovCisJCQlpZiAoIW1zZy0+aGRyLkZsYWdzLnNlcnZlcikgeworCQkJCXN0cnVjdCBndWVzdF9tc2dzIGNtZDsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX0RFTF9WQlVTOworCQkJCWNtZC5kZWxfdmJ1cy5idXNObyA9IGJ1c05vOworCQkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFOworCQkJCX0KKwkJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMoJmNtZCkpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX0RFTF9WQlVTIHJldHVybmVkIGVycm9yLiIpOworCQkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1I7CisJCQkJfQorCQkJfQorCQkJLyogcmVtb3ZlIHRoZSBidXMgZnJvbSB0aGUgbGlzdCAqLworCQkJd3JpdGVfbG9jaygmQnVzTGlzdExvY2spOworCQkJaWYgKHByZXYpCS8qIG5vdCBhdCBoZWFkICovCisJCQkJcHJldi0+bmV4dCA9IGJ1cy0+bmV4dDsKKwkJCWVsc2UKKwkJCQlCdXNMaXN0SGVhZCA9IGJ1cy0+bmV4dDsKKwkJCUJ1c0xpc3RDb3VudC0tOworCQkJd3JpdGVfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYnVzKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogZmFpbGVkIHRvIGZpbmQgYnVzICVkLlxuIiwKKwkJICAgICAgIGJ1c05vKTsKKwkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwl9CisJaWYgKGJ1cy0+cHJvY19pbmZvKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJpbmZvIiwgYnVzLT5wcm9jX2Rpcik7CisJCWJ1cy0+cHJvY19pbmZvID0gTlVMTDsKKwl9CisJaWYgKGJ1cy0+cHJvY19kaXIpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYnVzLT5uYW1lLCB1aXNsaWJfcHJvY192YnVzX2Rpcik7CisJCWJ1cy0+cHJvY19kaXIgPSBOVUxMOworCX0KKwlpZiAoYnVzLT5wQnVzQ2hhbm5lbCkgeworCQl1aXNsaWJfaW91bm1hcChidXMtPnBCdXNDaGFubmVsKTsKKwkJYnVzLT5wQnVzQ2hhbm5lbCA9IE5VTEw7CisJfQorCisJa2ZyZWUoYnVzKTsKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorY3JlYXRlX2RldmljZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBjaGFyICpidWYpCit7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJVTMyIGJ1c05vLCBkZXZObzsKKwlpbnQgcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKwlVNjQgbWluU2l6ZSA9IE1JTl9JT19DSEFOTkVMX1NJWkU7CisJUmVxSGFuZGxlckluZm9fdCAqcFJlcUhhbmRsZXI7CisKKwlidXNObyA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5idXNObzsKKwlkZXZObyA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5kZXZObzsKKworCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9FTlRSWV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9pbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkZXYpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGttYWxsb2MgZm9yIGRldiBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOworCX0KKworCWRldi0+Y2hhbm5lbFR5cGVHdWlkID0gbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZDsKKwlkZXYtPmludHIgPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuaW50cjsKKwlkZXYtPmNoYW5uZWxBZGRyID0gbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxBZGRyOworCWRldi0+YnVzTm8gPSBidXNObzsKKwlkZXYtPmRldk5vID0gZGV2Tm87CisJc2VtYV9pbml0KCZkZXYtPmludGVycnVwdF9jYWxsYmFja19sb2NrLCAxKTsJLyogdW5sb2NrZWQgKi8KKwlzcHJpbnRmKGRldi0+ZGV2aWQsICJ2YnVzJXU6ZGV2JXUiLCAodW5zaWduZWQpIGJ1c05vLCAodW5zaWduZWQpIGRldk5vKTsKKwkvKiBtYXAgdGhlIGNoYW5uZWwgbWVtb3J5IGZvciB0aGUgZGV2aWNlLiAqLworCWlmIChtc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSkKKwkJZGV2LT5jaGFucHRyID0gKHZvaWQgX19pb21lbSAqKV9fdmEoZGV2LT5jaGFubmVsQWRkcik7CisJZWxzZSB7CisJCXBSZXFIYW5kbGVyID0gUmVxSGFuZGxlckZpbmQoZGV2LT5jaGFubmVsVHlwZUd1aWQpOworCQlpZiAocFJlcUhhbmRsZXIpCisJCQkvKiBnZW5lcmljIHNlcnZpY2UgaGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGlzCisJCQkgKiBjaGFubmVsCisJCQkgKi8KKwkJCW1pblNpemUgPSBwUmVxSGFuZGxlci0+bWluX2NoYW5uZWxfYnl0ZXM7CisJCWlmIChtaW5TaXplID4gbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcykgeworCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGNoYW5uZWwgc2l6ZSBpcyB0b28gc21hbGwsIGNoYW5uZWwgc2l6ZToweCVseCwgcmVxdWlyZWQgc2l6ZToweCVseCIsCisJCQkgICAgICh1bG9uZykgbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcywKKwkJCSAgICAgKHVsb25nKSBtaW5TaXplKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9TSVpFX1RPT19TTUFMTDsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlkZXYtPmNoYW5wdHIgPQorCQkgICAgdWlzbGliX2lvcmVtYXBfY2FjaGUoZGV2LT5jaGFubmVsQWRkciwKKwkJCQkJIG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMpOworCQlpZiAoIWRldi0+Y2hhbnB0cikgeworCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGlvcmVtYXBfY2FjaGUgb2YgY2hhbm5lbEFkZHI6JUx4IGZvciBjaGFubmVsQnl0ZXM6JWxsdSBmYWlsZWQiLAorCQkJICAgICBkZXYtPmNoYW5uZWxBZGRyLAorCQkJICAgICBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzKTsKKwkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEOworCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlnb3RvIEF3YXk7CisJCX0KKwl9CisJZGV2LT5kZXZJbnN0R3VpZCA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5kZXZJbnN0R3VpZDsKKwlkZXYtPmNoYW5uZWxCeXRlcyA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXM7CisKKwlyZWFkX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwlmb3IgKGJ1cyA9IEJ1c0xpc3RIZWFkOyBidXM7IGJ1cyA9IGJ1cy0+bmV4dCkgeworCQlpZiAoYnVzLT5idXNObyA9PSBidXNObykgeworCQkJLyogbWFrZSBzdXJlIHRoZSBkZXZpY2UgbnVtYmVyIGlzIHZhbGlkICovCisJCQlpZiAoZGV2Tm8gPj0gYnVzLT5kZXZpY2VDb3VudCkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBkZXZpY2UgKCVkKSA+PSBkZXZpY2VDb3VudCAoJWQpLiIsCisJCQkJICAgICBkZXZObywgYnVzLT5kZXZpY2VDb3VudCk7CisJCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0RFVklDRVM7CisJCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsCisJCQkJCQkgZGV2Tm8sIGJ1c05vLAorCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlnb3RvIEF3YXk7CisJCQl9CisJCQkvKiBtYWtlIHN1cmUgdGhpcyBkZXZpY2UgaXMgbm90IGFscmVhZHkgc2V0ICovCisJCQlpZiAoYnVzLT5kZXZpY2VbZGV2Tm9dKSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGRldmljZSAlZCBpcyBhbHJlYWR5IGV4aXN0cy4iLAorCQkJCSAgICAgZGV2Tm8pOworCQkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLAorCQkJCQkJIGRldk5vLCBidXNObywKKwkJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCWdvdG8gQXdheTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCisJCQkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjaworCQkJICovCisJCQlpZiAoIW1zZy0+aGRyLkZsYWdzLnNlcnZlcikgeworCQkJCXN0cnVjdCBndWVzdF9tc2dzIGNtZDsKKwkJCQlpZiAoIW1lbWNtcAorCQkJCSAgICAoJmRldi0+Y2hhbm5lbFR5cGVHdWlkLAorCQkJCSAgICAgJlVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJICAgICBzaXplb2YoR1VJRCkpKSB7CisJCQkJCVdBSVRfRk9SX1ZBTElEX0dVSUQoKChDSEFOTkVMX0hFQURFUgorCQkJCQkJCSAgICAgIF9faW9tZW0gKikgKGRldi0+CisJCQkJCQkJCSAgY2hhbnB0cikpLT4KKwkJCQkJCQkgICAgVHlwZSk7CisJCQkJCWlmICghVUxUUkFfVkhCQV9DSEFOTkVMX09LX0NMSUVOVAorCQkJCQkgICAgKGRldi0+Y2hhbnB0ciwgTlVMTCkpIHsKKwkJCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOltDTElFTlRdVkhCQSBkZXYgJWQgY2hhbiBpbnZhbGlkLiIsCisJCQkJCQkgICAgIGRldk5vKTsKKwkJCQkJCVBPU1RDT0RFX0xJTlVYXzQKKwkJCQkJCSAgICAoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLAorCQkJCQkJICAgICBkZXZObywgYnVzTm8sCisJCQkJCQkgICAgIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX0lOVkFMSUQ7CisJCQkJCQlnb3RvIEF3YXk7CisJCQkJCX0KKwkJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9BRERfVkhCQTsKKwkJCQkJY21kLmFkZF92aGJhLmNoYW5wdHIgPSBkZXYtPmNoYW5wdHI7CisJCQkJCWNtZC5hZGRfdmhiYS5idXNObyA9IGJ1c05vOworCQkJCQljbWQuYWRkX3ZoYmEuZGV2aWNlTm8gPSBkZXZObzsKKwkJCQkJY21kLmFkZF92aGJhLmRldkluc3RHdWlkID0KKwkJCQkJICAgIGRldi0+ZGV2SW5zdEd1aWQ7CisJCQkJCWNtZC5hZGRfdmhiYS5pbnRyID0gZGV2LT5pbnRyOworCQkJCX0gZWxzZQorCQkJCSAgICBpZiAoIW1lbWNtcAorCQkJCQkoJmRldi0+Y2hhbm5lbFR5cGVHdWlkLAorCQkJCQkgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJCSBzaXplb2YoR1VJRCkpKSB7CisJCQkJCVdBSVRfRk9SX1ZBTElEX0dVSUQoKChDSEFOTkVMX0hFQURFUgorCQkJCQkJCSAgICAgIF9faW9tZW0gKikgKGRldi0+CisJCQkJCQkJCSAgY2hhbnB0cikpLT4KKwkJCQkJCQkgICAgVHlwZSk7CisJCQkJCWlmICghVUxUUkFfVk5JQ19DSEFOTkVMX09LX0NMSUVOVAorCQkJCQkgICAgKGRldi0+Y2hhbnB0ciwgTlVMTCkpIHsKKwkJCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBWTklDW0NMSUVOVF0gZGV2ICVkIGNoYW4gaW52YWxpZC4iLAorCQkJCQkJICAgICBkZXZObyk7CisJCQkJCQlQT1NUQ09ERV9MSU5VWF80CisJCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKKwkJCQkJCSAgICAgZGV2Tm8sIGJ1c05vLAorCQkJCQkJICAgICBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9JTlZBTElEOworCQkJCQkJZ290byBBd2F5OworCQkJCQl9CisJCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfQUREX1ZOSUM7CisJCQkJCWNtZC5hZGRfdm5pYy5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJCQljbWQuYWRkX3ZuaWMuYnVzTm8gPSBidXNObzsKKwkJCQkJY21kLmFkZF92bmljLmRldmljZU5vID0gZGV2Tm87CisJCQkJCWNtZC5hZGRfdm5pYy5kZXZJbnN0R3VpZCA9CisJCQkJCSAgICBkZXYtPmRldkluc3RHdWlkOworCQkJCQljbWQuYWRkX3ZoYmEuaW50ciA9IGRldi0+aW50cjsKKwkJCQl9IGVsc2UgeworCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKKwkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sCisJCQkJCSAgICAgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOworCQkJCQlnb3RvIEF3YXk7CisJCQkJfQorCisJCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKSB7CisJCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOworCQkJCQlQT1NUQ09ERV9MSU5VWF80CisJCQkJCSAgICAoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywKKwkJCQkJICAgICBidXNObywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJCQkJZ290byBBd2F5OworCQkJCX0KKworCQkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBHVUVTVF9BRERfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOworCQkJCQlQT1NUQ09ERV9MSU5VWF80CisJCQkJCSAgICAoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywKKwkJCQkJICAgICBidXNObywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1I7CisJCQkJCWdvdG8gQXdheTsKKwkJCQl9CisJCQl9CisJCQlidXMtPmRldmljZVtkZXZOb10gPSBkZXY7CisJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfU1VDQ0VTU19QQywgZGV2Tm8sIGJ1c05vLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCisJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGZhaWxlZCB0byBmaW5kIGJ1cyAlZC4iLCBidXNObyk7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCitBd2F5OgorCWlmICghbXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UpIHsKKwkJdWlzbGliX2lvdW5tYXAoZGV2LT5jaGFucHRyKTsKKwkJZGV2LT5jaGFucHRyID0gTlVMTDsKKwl9CisKKwlrZnJlZShkZXYpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3BhdXNlX2RldmljZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnKQoreworCVUzMiBidXNObywgZGV2Tm87CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJc3RydWN0IGd1ZXN0X21zZ3MgY21kOworCisJYnVzTm8gPSBtc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObzsKKwlkZXZObyA9IG1zZy0+Y21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBkZXZpY2UoJWQpID49IGRldmljZUNvdW50KCVkKS4iLAorCQkJCSAgICAgZGV2Tm8sIGJ1cy0+ZGV2aWNlQ291bnQpOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQkJfQorCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGV4aXN0cyAqLworCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2Tm9dOworCQkJaWYgKCFkZXYpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBkZXZpY2UgJWQgZG9lcyBub3QgZXhpc3QuIiwKKwkJCQkgICAgIGRldk5vKTsKKwkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCQl9CisJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZAorCQkJICogZ3Vlc3RfbXNncyBzdHJ1Y3QgdG8gY2FsbGJhY2sKKwkJCSAqLworCQkJaWYgKCFtZW1jbXAKKwkJCSAgICAoJmRldi0+Y2hhbm5lbFR5cGVHdWlkLAorCQkJICAgICAmVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZCwgc2l6ZW9mKEdVSUQpKSkgeworCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfUEFVU0VfVkhCQTsKKwkJCQljbWQucGF1c2VfdmhiYS5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlCisJCQkgICAgaWYgKCFtZW1jbXAKKwkJCQkoJmRldi0+Y2hhbm5lbFR5cGVHdWlkLAorCQkJCSAmVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCwKKwkJCQkgc2l6ZW9mKEdVSUQpKSkgeworCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfUEFVU0VfVk5JQzsKKwkJCQljbWQucGF1c2Vfdm5pYy5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiB1bmtub3duIGNoYW5uZWxUeXBlR3VpZC5cbiIpOworCQkJCXJldHVybgorCQkJCSAgICBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTjsKKwkJCX0KKworCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJCX0KKworCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKCZjbWQpKSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogdmlydHBjaSBHVUVTVF9QQVVTRV9bVkhCQXx8Vk5JQ10gcmV0dXJuZWQgZXJyb3IuIik7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJ1cykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAorCQkgICAgIGJ1c05vKTsKKwkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCX0KKworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50CityZXN1bWVfZGV2aWNlKENPTlRST0xWTV9NRVNTQUdFICptc2cpCit7CisJVTMyIGJ1c05vLCBkZXZObzsKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1czsKKwlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKKwlzdHJ1Y3QgZ3Vlc3RfbXNncyBjbWQ7CisKKwlidXNObyA9IG1zZy0+Y21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vOworCWRldk5vID0gbXNnLT5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm87CisKKwlyZWFkX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwlmb3IgKGJ1cyA9IEJ1c0xpc3RIZWFkOyBidXM7IGJ1cyA9IGJ1cy0+bmV4dCkgeworCQlpZiAoYnVzLT5idXNObyA9PSBidXNObykgeworCQkJLyogbWFrZSBzdXJlIHRoZSBkZXZpY2UgbnVtYmVyIGlzIHZhbGlkICovCisJCQlpZiAoZGV2Tm8gPj0gYnVzLT5kZXZpY2VDb3VudCkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiBkZXZpY2UoJWQpID49IGRldmljZUNvdW50KCVkKS4iLAorCQkJCSAgICAgZGV2Tm8sIGJ1cy0+ZGV2aWNlQ291bnQpOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQkJfQorCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGV4aXN0cyAqLworCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2Tm9dOworCQkJaWYgKCFkZXYpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogZGV2aWNlICVkIGRvZXMgbm90IGV4aXN0LiIsCisJCQkJICAgICBkZXZObyk7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQkJfQorCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCS8qIHRoZSBtc2cgaXMgYm91bmQgZm9yIHZpcnRwY2k7IHNlbmQKKwkJCSAqIGd1ZXN0X21zZ3Mgc3RydWN0IHRvIGNhbGxiYWNrCisJCQkgKi8KKwkJCWlmICghbWVtY21wKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgICAgJlVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJICAgIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1JFU1VNRV9WSEJBOworCQkJCWNtZC5yZXN1bWVfdmhiYS5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlCisJCQkgICAgaWYgKCFtZW1jbXAoJmRldi0+Y2hhbm5lbFR5cGVHdWlkLAorCQkJCQkmVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCwKKwkJCQkJc2l6ZW9mKEdVSUQpKSkgeworCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfUkVTVU1FX1ZOSUM7CisJCQkJY21kLnJlc3VtZV92bmljLmNoYW5wdHIgPSBkZXYtPmNoYW5wdHI7CisJCQl9IGVsc2UgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiB1bmtub3duIGNoYW5uZWxUeXBlR3VpZC5cbiIpOworCQkJCXJldHVybgorCQkJCSAgICBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTjsKKwkJCX0KKworCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJCX0KKworCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKCZjbWQpKSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnJlc3VtZSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfUkVTVU1FX1tWSEJBfHxWTklDXSByZXR1cm5lZCBlcnJvci4iKTsKKwkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1I7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYnVzKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAorCQkgICAgIGJ1c05vKTsKKwkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCX0KKworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50CitkZXN0cm95X2RldmljZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBjaGFyICpidWYpCit7CisJVTMyIGJ1c05vLCBkZXZObzsKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1czsKKwlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKKwlzdHJ1Y3QgZ3Vlc3RfbXNncyBjbWQ7CisKKwlidXNObyA9IG1zZy0+Y21kLmRlc3Ryb3lEZXZpY2UuYnVzTm87CisJZGV2Tm8gPSBtc2ctPmNtZC5kZXN0cm95RGV2aWNlLmRldk5vOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJTE9HSU5GKCJkZXN0cm95X2RldmljZSBjYWxsZWQgZm9yIGJ1c05vPSV1LCBkZXZObz0ldSIsIGJ1c05vLCBkZXZObyk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVE9SWSBGYWlsZWQ6IGRldmljZSglZCkgPj0gZGV2aWNlQ291bnQoJWQpLiIsCisJCQkJICAgICBkZXZObywgYnVzLT5kZXZpY2VDb3VudCk7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQ7CisJCQl9CisJCQkvKiBtYWtlIHN1cmUgdGhpcyBkZXZpY2UgZXhpc3RzICovCisJCQlkZXYgPSBidXMtPmRldmljZVtkZXZOb107CisJCQlpZiAoIWRldikgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogZGV2aWNlICVkIGRvZXMgbm90IGV4aXN0LiIsCisJCQkJICAgICBkZXZObyk7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQkJfQorCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCS8qIHRoZSBtc2cgaXMgYm91bmQgZm9yIHZpcnRwY2k7IHNlbmQKKwkJCSAqIGd1ZXN0X21zZ3Mgc3RydWN0IHRvIGNhbGxiYWNrCisJCQkgKi8KKwkJCWlmICghbWVtY21wCisJCQkgICAgKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCSAgICAgJlVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX0RFTF9WSEJBOworCQkJCWNtZC5kZWxfdmhiYS5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlCisJCQkgICAgaWYgKCFtZW1jbXAKKwkJCQkoJmRldi0+Y2hhbm5lbFR5cGVHdWlkLAorCQkJCSAmVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCwKKwkJCQkgc2l6ZW9mKEdVSUQpKSkgeworCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfREVMX1ZOSUM7CisJCQkJY21kLmRlbF92bmljLmNoYW5wdHIgPSBkZXYtPmNoYW5wdHI7CisJCQl9IGVsc2UgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUT1JZIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJCX0KKworCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKCZjbWQpKSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX0RFTF9bVkhCQXx8Vk5JQ10gcmV0dXJuZWQgZXJyb3IuIik7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJfQorLyogeW91IG11c3QgZGlzYWJsZSBjaGFubmVsIGludGVycnVwdHMgQkVGT1JFIHlvdSB1bm1hcCB0aGUgY2hhbm5lbCwKKyAqIGJlY2F1c2UgaWYgeW91IHVubWFwIGZpcnN0LCB0aGVyZSBtYXkgc3RpbGwgYmUgc29tZSBhY3Rpdml0eSBnb2luZworICogb24gd2hpY2ggYWNjZXNzZXMgdGhlIGNoYW5uZWwgYW5kIHlvdSB3aWxsIGdldCBhICJ1bmFibGUgdG8gaGFuZGxlCisgKiBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiCisgKi8KKwkJCWlmIChkZXYtPnBvbGxpbmcpIHsKKwkJCQlMT0dJTkYoImNhbGxpbmcgdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzIik7CisJCQkJdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGJ1c05vLCBkZXZObyk7CisJCQl9CisJCQkvKiB1bm1hcCB0aGUgY2hhbm5lbCBtZW1vcnkgZm9yIHRoZSBkZXZpY2UuICovCisJCQlpZiAoIW1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlKSB7CisJCQkJTE9HSU5GKCJkZXN0cm95X2RldmljZSwgZG9pbmcgaW91bm1hcCIpOworCQkJCXVpc2xpYl9pb3VubWFwKGRldi0+Y2hhbnB0cik7CisJCQl9CisJCQlrZnJlZShkZXYpOworCQkJYnVzLT5kZXZpY2VbZGV2Tm9dID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFidXMpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAorCQkgICAgICAgYnVzTm8pOworCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7CisJfQorCisJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfY2hpcHNldChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBjaGFyICpidWYpCit7CisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJTWF4QnVzQ291bnQgPSBtc2ctPmNtZC5pbml0Q2hpcHNldC5idXNDb3VudDsKKwlQbGF0Zm9ybU51bWJlciA9IG1zZy0+Y21kLmluaXRDaGlwc2V0LnBsYXRmb3JtTnVtYmVyOworCVBoeXNpY2FsRGF0YUNoYW4gPSAwOworCisJLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBvdXIgZnVuY3Rpb25zIHJlZ2lzdGVyZWQKKwkqIGJlZm9yZSBwcm9jZXNzaW5nIG1lc3NhZ2VzLiAgSWYgd2UgYXJlIGEgdGVzdCB2ZWhpY2xlIHRoZQorCSogdGVzdE1lc3NhZ2UgZm9yIGluaXRfY2hpcHNldCB3aWxsIGJlIHNldC4gIFdlIGNhbiBpZ25vcmUgdGhlCisJKiB3YWl0cyBmb3IgdGhlIGNhbGxiYWNrcywgc2luY2UgdGhpcyB3aWxsIGJlIG1hbnVhbGx5IGVudGVyZWQKKwkqIGZyb20gYSB1c2VyLiAgSWYgbm8gdGVzdE1lc3NhZ2UgaXMgc2V0LCB3ZSB3aWxsIHdhaXQgZm9yIHRoZQorCSogZnVuY3Rpb25zLgorCSovCisJaWYgKCFtc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSkKKwkJV0FJVF9PTl9DQUxMQkFDSyhWaXJ0Q29udHJvbENoYW5GdW5jKTsKKworCWNoaXBzZXRfaW5pdGVkID0gMTsKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50CitzdG9wX2NoaXBzZXQoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCS8qIENoZWNrIHRoYXQgYWxsIGJ1c2VzIGFuZCBzd2l0Y2hlcyBoYXZlIGJlZW4gdG9ybiBkb3duIGFuZAorCSAqIGRlc3Ryb3llZC4KKwkgKi8KKwlpZiAoQnVzTGlzdEhlYWQpIHsKKwkJLyogQnVzZXMgc3RpbGwgZXhpc3QuICovCisJCUxPR0VSUigiQ09OVFJPTFZNX0NISVBTRVRfU1RPUDogQnVzTGlzdEhlYWQgaXMgbm90IE5VTEwiKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfQlVTOworCX0KKwlpZiAoQnVzTGlzdENvdW50KSB7CisJCS8qIEJ1c0xpc3RIZWFkIGlzIE5VTEwsIGJ1dCBCdXNMaXN0Q291bnQgIT0gMCAqLworCQlMT0dFUlIoIkNPTlRST0xWTV9DSElQU0VUX1NUT1A6IEJ1c0xpc3RDb3VudCAhPSAwIik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX0JVUzsKKwl9CisKKwkvKiBCdXNlcyBhcmUgc2h1dCBkb3duLiAqLworCXJldHVybiB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSgpOworfQorCitzdGF0aWMgaW50CitkZWxldGVfYnVzX2dsdWUoVTMyIGJ1c05vKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksIDAsIDApOworCW1zZy5jbWQuZGVzdHJveUJ1cy5idXNObyA9IGJ1c05vOworCWlmIChkZXN0cm95X2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiZGVzdHJveV9idXMgZmFpbGVkLiBidXNObz0weCV4XG4iLCBidXNObyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGVsZXRlX2RldmljZV9nbHVlKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIDAsIDApOworCW1zZy5jbWQuZGVzdHJveURldmljZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuZGVzdHJveURldmljZS5kZXZObyA9IGRldk5vOworCWlmIChkZXN0cm95X2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiZGVzdHJveV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsIGJ1c05vLAorCQkgICAgICAgZGV2Tm8pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfYWRkX2J1cyhVMzIgYnVzTm8sIEdVSUQgaW5zdEd1aWQsCisJCQkgICAgIFU2NCBjaGFubmVsQWRkciwgdWxvbmcgbkNoYW5uZWxCeXRlcykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlMT0dJTkYoImVudGVyIGJ1c05vPTB4JXhcbiIsIGJ1c05vKTsKKwkvKiBzdGVwIDA6IGluaXQgdGhlIGNoaXBzZXQgKi8KKwlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9FTlRSWV9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaWYgKCFjaGlwc2V0X2luaXRlZCkgeworCQkvKiBzdGVwOiBpbml0aWFsaXplIHRoZSBjaGlwc2V0ICovCisJCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQ0hJUFNFVF9JTklULCAwLCAwKTsKKwkJLyogdGhpcyBjaGFuZ2UgaXMgbmVlZGVkIHNvIHRoYXQgY29uc29sZSB3aWxsIGNvbWUgdXAKKwkJKiBPSyBldmVuIHdoZW4gdGhlIGJ1cyAwIGNyZWF0ZSBjb21lcyBpbiBsYXRlLiAgSWYgdGhlCisJCSogYnVzIDAgY3JlYXRlIGlzIHRoZSBmaXJzdCBjcmVhdGUsIHRoZW4gdGhlIGFkZF92bmljCisJCSogd2lsbCB3b3JrIGZpbmUsIGJ1dCBpZiB0aGUgYnVzIDAgY3JlYXRlIGFycml2ZXMKKwkJKiBhZnRlciBudW1iZXIgNCwgdGhlbiB0aGUgYWRkX3ZuaWMgd2lsbCBmYWlsLCBhbmQgdGhlCisJCSogdWx0cmFib290IHdpbGwgZmFpbC4KKwkJKi8KKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5idXNDb3VudCA9IDIzOworCQltc2cuY21kLmluaXRDaGlwc2V0LnN3aXRjaENvdW50ID0gMDsKKwkJaWYgKGluaXRfY2hpcHNldCgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCQlMT0dFUlIoImluaXRfY2hpcHNldCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCUxPR0lORigiY2hpcHNldCBpbml0aWFsaXplZFxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzMoQ0hJUFNFVF9JTklUX0VYSVRfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwl9CisKKwkvKiBzdGVwIDE6IGNyZWF0ZSBhIGJ1cyAqLworCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FTlRSWV9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX1dBUk5JTkcpOworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0NSRUFURSwgMCwgMCk7CisJbXNnLmNtZC5jcmVhdGVCdXMuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmNyZWF0ZUJ1cy5kZXZpY2VDb3VudCA9IDIzOwkvKiBkZXZObysxOyAqLworCW1zZy5jbWQuY3JlYXRlQnVzLmNoYW5uZWxBZGRyID0gY2hhbm5lbEFkZHI7CisJbXNnLmNtZC5jcmVhdGVCdXMuY2hhbm5lbEJ5dGVzID0gbkNoYW5uZWxCeXRlczsKKwlpZiAoY3JlYXRlX2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiY3JlYXRlX2J1cyBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm4gMDsKKwl9CisJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VYSVRfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfYWRkX2J1cyk7CisKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfYnVzKFUzMiBidXNObykKK3sKKwlyZXR1cm4gZGVsZXRlX2J1c19nbHVlKGJ1c05vKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF9idXMpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCWludCByYzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLCAwLCAwKTsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUgPSBTZWdtZW50U3RhdGVTdGFuZGJ5OworCXJjID0gcGF1c2VfZGV2aWNlKCZtc2cpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiVkhCQSBwYXVzZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCisJCSAgICAgICBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfcGF1c2VfdmhiYSk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCWludCByYzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLCAwLCAwKTsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUgPSBTZWdtZW50U3RhdGVSdW5uaW5nOworCXJjID0gcmVzdW1lX2RldmljZSgmbXNnKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZIQkEgcmVzdW1lX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKKwkJICAgICAgIGJ1c05vLCBkZXZObyk7CisJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIDA7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92aGJhKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCSAgICAgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCisJCQkgICAgICBpbnQgaXNfdGVzdF9hZGRyLCBHVUlEIGluc3RHdWlkLAorCQkJICAgICAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCisJTE9HSU5GKCIgZW50ZXIgYnVzTm89MHgleCBkZXZObz0weCV4XG4iLCBidXNObywgZGV2Tm8pOworCS8qIGNoaXBzZXQgaW5pdCdlZCB3aXRoIGJ1cyBidXMgaGFzIGJlZW4gcHJldmlvdXNseSBjcmVhdGVkIC0KKwkqIFZlcmlmeSBpdCBzdGlsbCBleGlzdHMgc3RlcCAyOiBjcmVhdGUgdGhlIFZIQkEgZGV2aWNlIG9uIHRoZQorCSogYnVzCisJKi8KKwlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX0VOVFJZX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIDAsIDApOworCWlmIChpc190ZXN0X2FkZHIpCisJCS8qIHNpZ25pZnkgdGhhdCB0aGUgcGh5c2ljYWwgY2hhbm5lbCBhZGRyZXNzIGRvZXMgTk9UCisJCSAqIG5lZWQgdG8gYmUgaW9yZW1hcCgpZWQKKwkJICovCisJCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAxOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmNyZWF0ZURldmljZS5kZXZJbnN0R3VpZCA9IGluc3RHdWlkOworCWlmIChpbnRyKQorCQltc2cuY21kLmNyZWF0ZURldmljZS5pbnRyID0gKmludHI7CisJZWxzZQorCQltZW1zZXQoJm1zZy5jbWQuY3JlYXRlRGV2aWNlLmludHIsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IEludGVycnVwdEluZm8pKTsKKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkciA9IHBoeXNfY2hhbl9hZGRyOworCWlmIChjaGFuX2J5dGVzIDwgTUlOX0lPX0NIQU5ORUxfU0laRSkgeworCQlMT0dFUlIoIndyb25nIGNoYW5uZWwgc2l6ZS5jaGFuX2J5dGVzID0gMHgleCBJT19DSEFOTkVMX1NJWkU9IDB4JXhcbiIsCisJCSAgICAgY2hhbl9ieXRlcywgKHVuc2lnbmVkIGludCkgTUlOX0lPX0NIQU5ORUxfU0laRSk7CisJCVBPU1RDT0RFX0xJTlVYXzQoVkhCQV9DUkVBVEVfRkFJTFVSRV9QQywgY2hhbl9ieXRlcywKKwkJCQkgTUlOX0lPX0NIQU5ORUxfU0laRSwgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcyA9IGNoYW5fYnl0ZXM7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGF0YVR5cGVHdWlkID0gVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZDsKKwlpZiAoY3JlYXRlX2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiVkhCQSBjcmVhdGVfZGV2aWNlIGZhaWxlZC5cbiIpOworCQlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCVBPU1RDT0RFX0xJTlVYXzQoVkhCQV9DUkVBVEVfU1VDQ0VTU19QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZoYmEpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCXJldHVybiBkZWxldGVfZGV2aWNlX2dsdWUoYnVzTm8sIGRldk5vKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92aGJhKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCSAgICAgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCisJCQkgICAgICBpbnQgaXNfdGVzdF9hZGRyLCBHVUlEIGluc3RHdWlkLAorCQkJICAgICAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCisJTE9HSU5GKCIgZW50ZXIgYnVzTm89MHgleCBkZXZObz0weCV4XG4iLCBidXNObywgZGV2Tm8pOworCS8qIGNoaXBzZXQgaW5pdCdlZCB3aXRoIGJ1cyBidXMgaGFzIGJlZW4gcHJldmlvdXNseSBjcmVhdGVkIC0KKwkqIFZlcmlmeSBpdCBzdGlsbCBleGlzdHMgc3RlcCAyOiBjcmVhdGUgdGhlIFZOSUMgZGV2aWNlIG9uIHRoZQorCSogYnVzCisJKi8KKwlQT1NUQ09ERV9MSU5VWF80KFZOSUNfQ1JFQVRFX0VOVFJZX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIDAsIDApOworCWlmIChpc190ZXN0X2FkZHIpCisJCS8qIHNpZ25pZnkgdGhhdCB0aGUgcGh5c2ljYWwgY2hhbm5lbCBhZGRyZXNzIGRvZXMgTk9UCisJCSAqIG5lZWQgdG8gYmUgaW9yZW1hcCgpZWQKKwkJICovCisJCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAxOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmNyZWF0ZURldmljZS5kZXZJbnN0R3VpZCA9IGluc3RHdWlkOworCWlmIChpbnRyKQorCQltc2cuY21kLmNyZWF0ZURldmljZS5pbnRyID0gKmludHI7CisJZWxzZQorCQltZW1zZXQoJm1zZy5jbWQuY3JlYXRlRGV2aWNlLmludHIsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IEludGVycnVwdEluZm8pKTsKKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkciA9IHBoeXNfY2hhbl9hZGRyOworCWlmIChjaGFuX2J5dGVzIDwgTUlOX0lPX0NIQU5ORUxfU0laRSkgeworCQlMT0dFUlIoIndyb25nIGNoYW5uZWwgc2l6ZS5jaGFuX2J5dGVzID0gMHgleCBJT19DSEFOTkVMX1NJWkU9IDB4JXhcbiIsCisJCSAgICAgY2hhbl9ieXRlcywgKHVuc2lnbmVkIGludCkgTUlOX0lPX0NIQU5ORUxfU0laRSk7CisJCVBPU1RDT0RFX0xJTlVYXzQoVk5JQ19DUkVBVEVfRkFJTFVSRV9QQywgY2hhbl9ieXRlcywKKwkJCQkgTUlOX0lPX0NIQU5ORUxfU0laRSwgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcyA9IGNoYW5fYnl0ZXM7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGF0YVR5cGVHdWlkID0gVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZDsKKwlpZiAoY3JlYXRlX2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiVk5JQyBjcmVhdGVfZGV2aWNlIGZhaWxlZC5cbiIpOworCQlQT1NUQ09ERV9MSU5VWF80KFZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9TVUNDRVNTX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdm5pYyk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfcGF1c2Vfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJaW50IHJjOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsIDAsIDApOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vID0gZGV2Tm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSA9IFNlZ21lbnRTdGF0ZVN0YW5kYnk7CisJcmMgPSBwYXVzZV9kZXZpY2UoJm1zZyk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJTE9HRVJSKCJWTklDIHBhdXNlX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKKwkJICAgICAgIGJ1c05vLCBkZXZObyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9wYXVzZV92bmljKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJaW50IHJjOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsIDAsIDApOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vID0gZGV2Tm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSA9IFNlZ21lbnRTdGF0ZVJ1bm5pbmc7CisJcmMgPSByZXN1bWVfZGV2aWNlKCZtc2cpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiVk5JQyByZXN1bWVfZGV2aWNlIGZhaWxlZC4gYnVzTm89MHgleCBkZXZObz0weCV4XG4iLAorCQkgICAgICAgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZuaWMpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92bmljKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCXJldHVybiBkZWxldGVfZGV2aWNlX2dsdWUoYnVzTm8sIGRldk5vKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92bmljKTsKKworc3RhdGljIGludAordWlzbGliX2NsaWVudF9hZGRfdm5pYyhVMzIgYnVzTm8pCit7CisJQk9PTCBidXNDcmVhdGVkID0gRkFMU0U7CisJaW50IGRldk5vID0gMDsJCS8qIERlZmF1bHQgdG8gMCwgc2luY2Ugb25seSBvbmUgZGV2aWNlCisJCQkJICogd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIGJ1cy4uLiAqLworCUdVSUQgZHVtbXlHdWlkID0gR1VJRDA7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAwLCAwKTsKKwltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmNyZWF0ZUJ1cy5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuY3JlYXRlQnVzLmRldmljZUNvdW50ID0gNDsKKwltc2cuY21kLmNyZWF0ZUJ1cy5jaGFubmVsQWRkciA9IDA7CisJbXNnLmNtZC5jcmVhdGVCdXMuY2hhbm5lbEJ5dGVzID0gMDsKKwlpZiAoY3JlYXRlX2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiY2xpZW50IGNyZWF0ZV9idXMgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKwlidXNDcmVhdGVkID0gVFJVRTsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NSRUFURSwgMCwgMCk7CisJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmNyZWF0ZURldmljZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRldkluc3RHdWlkID0gZHVtbXlHdWlkOworCW1lbXNldCgmbXNnLmNtZC5jcmVhdGVEZXZpY2UuaW50ciwgMCwgc2l6ZW9mKHN0cnVjdCBJbnRlcnJ1cHRJbmZvKSk7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBQaHlzaWNhbERhdGFDaGFuOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcyA9IE1JTl9JT19DSEFOTkVMX1NJWkU7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGF0YVR5cGVHdWlkID0gVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZDsKKwlpZiAoY3JlYXRlX2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiY2xpZW50IGNyZWF0ZV9kZXZpY2UgZmFpbGVkIik7CisJCWdvdG8gQXdheUNsZWFudXA7CisJfQorCisJcmV0dXJuIDE7CisKK0F3YXlDbGVhbnVwOgorCWlmIChidXNDcmVhdGVkKSB7CisJCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksIDAsIDApOworCQltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwkJbXNnLmNtZC5kZXN0cm95QnVzLmJ1c05vID0gYnVzTm87CisJCWlmIChkZXN0cm95X2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQorCQkJTE9HRVJSKCJjbGllbnQgZGVzdHJveV9idXMgZmFpbGVkLlxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CQkJCS8qIGVuZCB1aXNsaWJfY2xpZW50X2FkZF92bmljICovCitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2FkZF92bmljKTsKKworc3RhdGljIGludAordWlzbGliX2NsaWVudF9kZWxldGVfdm5pYyhVMzIgYnVzTm8pCit7CisJaW50IGRldk5vID0gMDsJCS8qIERlZmF1bHQgdG8gMCwgc2luY2Ugb25seSBvbmUgZGV2aWNlCisJCQkJICogd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIGJ1cy4uLiAqLworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIDAsIDApOworCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAxOworCW1zZy5jbWQuZGVzdHJveURldmljZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuZGVzdHJveURldmljZS5kZXZObyA9IGRldk5vOworCWlmIChkZXN0cm95X2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCS8qIERvbid0IGVycm9yIGV4aXQgLSB0cnkgdG8gc2VlIGlmIGJ1cyBjYW4gYmUgZGVzdHJveWVkLi4uICovCisJCUxPR0VSUigiY2xpZW50IGRlc3Ryb3lfZGV2aWNlIGZhaWxlZC5cbiIpOworCX0KKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksIDAsIDApOworCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAxOworCW1zZy5jbWQuZGVzdHJveUJ1cy5idXNObyA9IGJ1c05vOworCWlmIChkZXN0cm95X2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQorCQlMT0dFUlIoImNsaWVudCBkZXN0cm95X2J1cyBmYWlsZWQuXG4iKTsKKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9kZWxldGVfdm5pYyk7CisvKiBlbmQgY2xpZW50X2RlbGV0ZV92bmljICovCisKK3ZvaWQgKgordWlzbGliX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjdXJfcG9vbCwgY2hhciAqZm4sIGludCBsbikKK3sKKwkvKiBfX0dGUF9OT1JFVFJZIG1lYW5zICJvayB0byBmYWlsIiwgbWVhbmluZyBrbWFsbG9jKCkgY2FuCisJKiByZXR1cm4gTlVMTC4gIElmIHlvdSBkbyBOT1Qgc3BlY2lmeSBfX0dGUF9OT1JFVFJZLCBMaW51eAorCSogd2lsbCBnbyB0byBleHRyZW1lIG1lYXN1cmVzIHRvIGdldCBtZW1vcnkgZm9yIHlvdSAobGlrZSwKKwkqIGludm9rZSBvb20ga2lsbGVyKSwgd2hpY2ggd2lsbCBwcm9iYWJseSBjcmlwcGxlIHRoZSBzeXN0ZW0uCisJKi8KKwl2b2lkICpwID0ga21lbV9jYWNoZV9hbGxvYyhjdXJfcG9vbCwgR0ZQX0FUT01JQyB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChwID09IE5VTEwpIHsKKwkJTE9HRVJSKCJ1aXNsaWJfbWFsbG9jIGZhaWxlZCB0byBhbGxvYyB1aXNjbWRyc3AgQCVzOiVkIiwKKwkJICAgICAgIGZuLCBsbik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jYWNoZV9hbGxvYyk7CisKK3ZvaWQKK3Vpc2xpYl9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpjdXJfcG9vbCwgdm9pZCAqcCwgY2hhciAqZm4sIGludCBsbikKK3sKKwlpZiAocCA9PSBOVUxMKSB7CisJCUxPR0VSUigidWlzbGliX2ZyZWUgTlVMTCBwb2ludGVyIEAlczolZCIsIGZuLCBsbik7CisJCXJldHVybjsKKwl9CisJa21lbV9jYWNoZV9mcmVlKGN1cl9wb29sLCBwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jYWNoZV9mcmVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogcHJvYyBmaWxlc3lzdGVtIGNhbGxiYWNrIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3NpemVfdAordm5pY19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgYWN0aW9uID0gMHhmZmZmLCBidXNObyA9IDAsIGksIHJlc3VsdCA9IDA7CisJY2hhciBidWZbNF07CisJY2hhciBkaXJlY3Rpb247CisvKiBHVUlEIGd1aWQ7ICovCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImVjaG8gPiAvcHJvYy91aXNsaWIvdm5pYyBjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWkgPSBzc2NhbmYoYnVmLCAiJWQlYyIsICZhY3Rpb24sICZkaXJlY3Rpb24pOworCWlmIChpICE9IDIpIHsKKwkJTE9HRVJSKCJ1bmFibGUgdG8gcGFyc2Ugdm5pYyBwcm9jIHBhcmFtZXRlcnMuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKChkaXJlY3Rpb24gIT0gJy0nKSAmJiAoZGlyZWN0aW9uICE9ICcrJykpIHsKKwkJTE9HRVJSKCJ1bmFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gYWRkIG9yIGRlbGV0ZSB2bmljXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogaWYgKGkgPCAxKSwgaS5lLiwgaWYgd2UgZGlkbid0IGV2ZW4gcmVhZCB0aGUgYWN0aW9uIGZpZWxkLAorCSogdGhlbiBhY3Rpb24gd2lsbCBkZWZhdWx0IHRvIDB4ZmZmZiBhbmQgdGhlIGNvZGUgYmVsb3cgd2lsbAorCSogZmFsbCB0aHJvdWdoIHRoZSBzd2l0Y2ggYW5kIHByaW50IHVzYWdlLgorCSovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIDA6CisJCS8qIGNhbGwgY2xpZW50IG1ldGhvZC4uLiAqLworCQlidXNObyA9IDA7CS8qIEFsbCBjbGllbnQgZHJpdmVycyB1c2UgYnVzIHZhbHVlIG9mIDAuLi4gKi8KKwkJaWYgKGRpcmVjdGlvbiA9PSAnKycpCisJCQlyZXN1bHQgPSB1aXNsaWJfY2xpZW50X2FkZF92bmljKGJ1c05vKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gdWlzbGliX2NsaWVudF9kZWxldGVfdm5pYyhidXNObyk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dFUlIoImVjaG8gMCVjID4gL3Byb2MvdWlzbGliL3ZuaWMgZmFpbGVkIChjbGllbnQgZW5kKSIsCisJCQkgICAgIGRpcmVjdGlvbik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gY291bnQ7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlMT0dFUlIoIlVTQUdFOiBlY2hvIDxhY3Rpb24+PGRpcmVjdGlvbiAodXAvZG93bik+ID4gL3Byb2MvdWlzbGliL3ZuaWMiKTsKKwlMT0dFUlIoIiAiKTsKKwlMT0dFUlIoIkNsaWVudCBTeW50YXgiKTsKKwlMT0dFUlIoIi0tLS0tLS0tLS0tLS0iKTsKKwlMT0dFUlIoIjArICAgID09PiBhZGQgdm5pYyIpOworCUxPR0VSUigiMC0gICAgPT0+IGRlbGV0ZSB2bmljIik7CisJTE9HRVJSKCIgIik7CisJcmV0dXJuIGNvdW50OworfQkJCQkvKiBlbmQgdm5pY19wcm9jX3dyaXRlICovCisKK3N0YXRpYyBzc2l6ZV90CitjaGlwc2V0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBpLCBhY3Rpb24gPSAweGZmZmY7CisJY2hhciBidWZbNF07CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyICoqKipGQUlMRUQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGNoaXBzZXRfaW5pdGVkKSB7CisJCUxPR0lORigiQ2hpcHNldCBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWkgPSBzc2NhbmYoYnVmLCAiJXgiLCAmYWN0aW9uKTsKKworCS8qIGlmIChpIDwgMSksIGkuZS4sIGlmIHdlIGRpZG4ndCBldmVuIHJlYWQgdGhlIGFjdGlvbiBmaWVsZCwKKwkqIHRoZW4gYWN0aW9uIHdpbGwgZGVmYXVsdCB0byAweGZmZmYgYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwKKwkqIGZhbGwgdGhyb3VnaCB0aGUgc3dpdGNoIGFuZCBwcmludCB1c2FnZS4KKwkqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAxOgorCQkvKiBHVUVTVCAqLworCQkvKiBzdGVwOiBpbml0aWFsaXplIHRoZSBjaGlwc2V0ICovCisJCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQ0hJUFNFVF9JTklULCAwLCAwKTsKKwkJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDA7CisJCW1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQgPSAyMzsKKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCA9IDIzOworCisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwljYXNlIDI6CisJCS8qIEJPVEggKi8KKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9DSElQU0VUX0lOSVQsIDAsIDApOworCQltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5idXNDb3VudCA9IDIzOworCQltc2cuY21kLmluaXRDaGlwc2V0LnN3aXRjaENvdW50ID0gMjM7CisKKwkJaWYgKGluaXRfY2hpcHNldCgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCQlMT0dFUlIoImluaXRfY2hpcHNldCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTE9HRVJSKCJ1c2FnZTogMSA9PT4gaW5pdF9jaGlwc2V0IGNsaWVudFxuIik7CisJTE9HRVJSKCJ1c2FnZTogMiA9PT4gaW5pdF9jaGlwc2V0IHRlc3RcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorCisjZGVmaW5lIFBMSU5FKC4uLikgdWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KCZ0b3QsIGJ1ZmYsIFwKKwkJCQkJICAgICAgIGJ1ZmZfbGVuLCBfX1ZBX0FSR1NfXykKKworc3RhdGljIGludAoraW5mb19wcm9jX3JlYWRfaGVscGVyKGNoYXIgKipidWZmLCBpbnQgKmJ1ZmZfbGVuKQoreworCWludCBpLCB0b3QgPSAwOworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCisJaWYgKFBMSU5FKCJcbkJ1c2VzOlxuIikgPCAwKQorCQlnb3RvIGVycl9kb25lOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKworCQlpZiAoUExJTkUoIiAgICBidXM9MHglcCwgYnVzTm89JWQsIGRldmljZUNvdW50PSVkXG4iLAorCQkJICBidXMsIGJ1cy0+YnVzTm8sIGJ1cy0+ZGV2aWNlQ291bnQpIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmVfdW5sb2NrOworCisKKwkJaWYgKFBMSU5FKCIgICAgICAgIERldmljZXM6XG4iKSA8IDApCisJCQlnb3RvIGVycl9kb25lX3VubG9jazsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnVzLT5kZXZpY2VDb3VudDsgaSsrKSB7CisJCQlpZiAoYnVzLT5kZXZpY2VbaV0pIHsKKwkJCQlpZiAoUExJTkUoIiAgICAgICAgICAgIGJ1c05vICVkLCBkZXZpY2VbJWldOiAweCVwLCBjaGFucHRyPTB4JXAsIHN3dGNoPTB4JXBcbiIsCisJCQkJCSAgYnVzLT5idXNObywgaSwgYnVzLT5kZXZpY2VbaV0sCisJCQkJCSAgYnVzLT5kZXZpY2VbaV0tPmNoYW5wdHIsCisJCQkJCSAgYnVzLT5kZXZpY2VbaV0tPnN3dGNoKSA8IDApCisJCQkJCWdvdG8gZXJyX2RvbmVfdW5sb2NrOworCisJCQkJaWYgKFBMSU5FKCIgICAgICAgICAgICBmaXJzdF9idXN5X2NudD0lbGx1LCBtb3ZlZF90b190YWlsX2NudD0lbGx1LCBsYXN0X29uX2xpc3RfY250PSVsbHVcbiIsCisJCQkJCSAgYnVzLT5kZXZpY2VbaV0tPmZpcnN0X2J1c3lfY250LAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5tb3ZlZF90b190YWlsX2NudCwKKwkJCQkJICBidXMtPmRldmljZVtpXS0+bGFzdF9vbl9saXN0X2NudCkgPCAwKQorCQkJCQlnb3RvIGVycl9kb25lX3VubG9jazsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCisJaWYgKFBMSU5FKCJVaXNVdGlsc19SZWdpc3RlcmVkX1NlcnZpY2VzOiAlZFxuIiwKKwkJICBhdG9taWNfcmVhZCgmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcykpIDwgMCkKKwkJZ290byBlcnJfZG9uZTsKKwlpZiAoUExJTkUoImN5Y2xlc19iZWZvcmVfd2FpdCAlbGx1IHdhaXRfY3ljbGVzOiVsbHVcbiIsCisJCSAgY3ljbGVzX2JlZm9yZV93YWl0LCB3YWl0X2N5Y2xlcykgPCAwKQorCQkJZ290byBlcnJfZG9uZTsKKwlpZiAoUExJTkUoInRvdF93YWtldXBfY250ICVsbHU6dG90X3dhaXRfY250ICVsbHU6dG90X3NjaGVkdWxlX2NudCAlbGx1XG4iLAorCQkgIHRvdF93YWtldXBfY250LCB0b3Rfd2FpdF9jbnQsIHRvdF9zY2hlZHVsZV9jbnQpIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJlbl9zbWFydF93YWtldXAgJWRcbiIsIGVuX3NtYXJ0X3dha2V1cCkgPCAwKQorCQkJZ290byBlcnJfZG9uZTsKKwlpZiAoUExJTkUoInRvdF9tb3ZlZF90b190YWlsX2NudCAlbGx1XG4iLCB0b3RfbW92ZWRfdG9fdGFpbF9jbnQpIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmU7CisKKwlyZXR1cm4gdG90OworCitlcnJfZG9uZV91bmxvY2s6CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKK2Vycl9kb25lOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHNzaXplX3QKK2luZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwljaGFyICp0ZW1wOworCWludCB0b3RhbEJ5dGVzID0gMDsKKwlpbnQgcmVtYWluaW5nX2J5dGVzID0gUFJPQ19SRUFEX0JVRkZFUl9TSVpFOworCisvKiAqc3RhcnQgPSBidWY7ICovCisJaWYgKFByb2NSZWFkQnVmZmVyID09IE5VTEwpIHsKKwkJREJHSU5GKCJQcm9jUmVhZEJ1ZmZlciA9PSBOVUxMOyBhbGxvY2F0aW5nIGJ1ZmZlci5cbi4iKTsKKwkJUHJvY1JlYWRCdWZmZXIgPSB2bWFsbG9jKFBST0NfUkVBRF9CVUZGRVJfU0laRSk7CisKKwkJaWYgKFByb2NSZWFkQnVmZmVyID09IE5VTEwpIHsKKwkJCUxPR0VSUigiZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciB0byBwcm92aWRlIHByb2MgZGF0YS5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwl0ZW1wID0gUHJvY1JlYWRCdWZmZXI7CisKKwlpZiAoKCpvZmZzZXQgPT0gMCkgfHwgKCFQcm9jUmVhZEJ1ZmZlclZhbGlkKSkgeworCQlEQkdJTkYoImNhbGxpbmcgaW5mb19wcm9jX3JlYWRfaGVscGVyLlxuIik7CisJCS8qIGlmIHRoZSByZWFkIGZhaWxzLCB0aGVuIC0xIHdpbGwgYmUgcmV0dXJuZWQgKi8KKwkJdG90YWxCeXRlcyA9IGluZm9fcHJvY19yZWFkX2hlbHBlcigmdGVtcCwgJnJlbWFpbmluZ19ieXRlcyk7CisJCVByb2NSZWFkQnVmZmVyVmFsaWQgPSAxOworCX0gZWxzZQorCQl0b3RhbEJ5dGVzID0gc3RybGVuKFByb2NSZWFkQnVmZmVyKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGxlbiwgb2Zmc2V0LAorCQkJCSAgICAgICBQcm9jUmVhZEJ1ZmZlciwgdG90YWxCeXRlcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitwbGF0Zm9ybW51bWJlcl9wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuZ3RoID0gc3ByaW50Zih2YnVmLCAiJWRcbiIsIFBsYXRmb3JtTnVtYmVyKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB2YnVmLCBsZW5ndGgpKSB7CisJCWtmcmVlKHZidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZSh2YnVmKTsKKwkqb2Zmc2V0ICs9IGxlbmd0aDsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisjaWZkZWYgVUlTTElCX1RFU1RfUFJPQworCisvKiBwcm9jL3Vpc2xpYi92YnVzLzx4Pi9pbmZvICovCitzdGF0aWMgaW50Citwcm9jX2luZm9fdmJ1c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1cyA9IG0tPnByaXZhdGU7CisJaW50IGksIGRldkluZm9Db3VudCwgeDsKKwljaGFyIGJ1Zls5OTldOworCisJaWYgKGJ1cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlzZXFfcHJpbnRmKG0sICJDbGllbnQgZGV2aWNlIC8gY2xpZW50IGRyaXZlciBpbmZvIGZvciAlcyBwYXJ0aXRpb24gKHZidXMgIyVkKTpcbiIsCisJCSAgIGJ1cy0+cGFydGl0aW9uTmFtZSwgYnVzLT5idXNObyk7CisJaWYgKChidXMtPmJ1c0NoYW5uZWxCeXRlcyA9PSAwKSB8fCAoYnVzLT5wQnVzQ2hhbm5lbCA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisJZGV2SW5mb0NvdW50ID0KKwkgICAgKGJ1cy0+YnVzQ2hhbm5lbEJ5dGVzIC0KKwkgICAgIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpKSAvCisJICAgIHNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pOworCXggPSBWQlVTQ0hBTk5FTF9kZXZJbmZvVG9TdHJpbmdCdWZmZXIoJmJ1cy0+cEJ1c0NoYW5uZWwtPkNocEluZm8sIGJ1ZiwKKwkJCQkJICAgICAgc2l6ZW9mKGJ1ZikgLSAxLCAtMSk7CisJYnVmW3hdID0gJ1wwJzsKKwlzZXFfcHJpbnRmKG0sICIlcyIsIGJ1Zik7CisJeCA9IFZCVVNDSEFOTkVMX2RldkluZm9Ub1N0cmluZ0J1ZmZlcigmYnVzLT5wQnVzQ2hhbm5lbC0+QnVzSW5mbywKKwkJCQkJICAgICAgYnVmLCBzaXplb2YoYnVmKSAtIDEsIC0xKTsKKwlidWZbeF0gPSAnXDAnOworCXNlcV9wcmludGYobSwgIiVzIiwgYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2SW5mb0NvdW50OyBpKyspIHsKKwkJeCA9IFZCVVNDSEFOTkVMX2RldkluZm9Ub1N0cmluZ0J1ZmZlcigmYnVzLT5wQnVzQ2hhbm5lbC0+CisJCQkJCQkgICAgICBEZXZJbmZvW2ldLCBidWYsCisJCQkJCQkgICAgICBzaXplb2YoYnVmKSAtIDEsIGkpOworCQlpZiAoeCA+IDApIHsKKwkJCWJ1Zlt4XSA9ICdcMCc7CisJCQlzZXFfcHJpbnRmKG0sICIlcyIsIGJ1Zik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitidXNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHNlcnZlcl9mbGFnID0gMDsKKwlpbnQgaSwgYWN0aW9uID0gMHhmZmZmLCByZXN1bHQ7CisJY2hhciBidWZbMTZdOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlVMzIgYnVzTm8sIGRldmljZUNvdW50OworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImVjaG8gPiAvcHJvYy91aXNsaWIvYnVzOiBjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4LSVkLSVkIiwgJmFjdGlvbiwgJmJ1c05vLCAmZGV2aWNlQ291bnQpOworCisJLyogaWYgKGkgPCAxKSwgaS5lLiwgaWYgd2UgZGlkbid0IGV2ZW4gcmVhZCB0aGUgYWN0aW9uIGZpZWxkLAorCSogdGhlbiBhY3Rpb24gd2lsbCBkZWZhdWx0IHRvIDB4ZmZmZiBhbmQgdGhlIGNvZGUgYmVsb3cgd2lsbAorCSogZmFsbCB0aHJvdWdoIHRoZSBzd2l0Y2ggYW5kIHByaW50IHVzYWdlLgorCSovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIDA6CisJCS8qIGRlc3Ryb3kgYSBidXMgKi8KKwkJaWYgKGkgIT0gMikKKwkJCWJyZWFrOworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCBzZXJ2ZXJfZmxhZyk7CisJCW1zZy5jbWQuZGVzdHJveUJ1cy5idXNObyA9IGJ1c05vOworCisJCXJlc3VsdCA9IGRlc3Ryb3lfYnVzKCZtc2csIE5VTEwpOworCisJCWlmIChyZXN1bHQgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJlY2hvIDAtJWQgPiAvcHJvYy91aXNsaWIvYnVzIHtDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkfSBSZXN1bHQoJWQpIiwKKwkJCSAgICAgYnVzTm8sIHJlc3VsdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gY291bnQ7CisJY2FzZSAxOgorCQkvKiBjcmVhdGUgYSBidXMgKi8KKwkJaWYgKGkgIT0gMykKKwkJCWJyZWFrOworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19DUkVBVEUsIDAsIHNlcnZlcl9mbGFnKTsKKwkJbXNnLmNtZC5jcmVhdGVCdXMuYnVzTm8gPSBidXNObzsKKwkJbXNnLmNtZC5jcmVhdGVCdXMuZGV2aWNlQ291bnQgPSBkZXZpY2VDb3VudDsKKworCQlyZXN1bHQgPSBjcmVhdGVfYnVzKCZtc2csIE5VTEwpOworCisJCWlmIChyZXN1bHQgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJlY2hvIDEtJWQtJWQgPiAvcHJvYy91aXNsaWIvYnVzIHtDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJICAgICBidXNObywgZGV2aWNlQ291bnQsIHJlc3VsdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldHVybiBjb3VudDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlMT0dFUlIoIlVTQUdFOiBlY2hvIDxhY3Rpb24+LTxidXNObz4uLi4gPiAvcHJvYy91aXNsaWIvYnVzIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJEZXN0cnVjdCBTeW50YXggICAgIENvbnRyb2xWTSBNZXNzYWdlIElkIik7CisJTE9HRVJSKCItLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCUxPR0VSUigiMC08YnVzTm8+ICAgICAgID09PiBDT05UUk9MVk1fQlVTX0RFU1RST1kiKTsKKwlMT0dFUlIoIiAiKTsKKwlMT0dFUlIoIkNvbnN0cnVjdCBTeW50YXggICAgICAgICAgICBDb250cm9sVk0gTWVzc2FnZSBJZCIpOworCUxPR0VSUigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCUxPR0VSUigiMS08YnVzTm8+LTxkZXZpY2VDb3VudD4gPT0+IENPTlRST0xWTV9CVVNfQ1JFQVRFIik7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIHNzaXplX3QKK3Vpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2Rldl9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgc2VydmVyX2ZsYWcgPSAwOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlVMzIgYnVzTm8sIGRldk5vOworCWNoYXIgYnVmWzMyXTsKKwl1bnNpZ25lZCBpbnQgY2hhbnB0cjsKKwlpbnQgdHlwZSwgaSwgYWN0aW9uID0gMHhmZmZmLCByZXN1bHQ7CisKKwlpZiAoY291bnQgPj0gQVJSQVlfU0laRShidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiZWNobyA+IC9wcm9jL3Vpc2xpYi9kZXZpY2U6IGNvcHlfZnJvbV91c2VyICoqKipGQUlMRUQuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWkgPSBzc2NhbmYoYnVmLCAiJXgtJWQtJWQtJXgtJWQiLAorCQkgICAmYWN0aW9uLCAmYnVzTm8sICZkZXZObywgJmNoYW5wdHIsICZ0eXBlKTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQlpZiAoaSAhPSAzKQorCQkJYnJlYWs7CisKKwkJLyogZGVzdHJveSBhIGRldmljZSAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAwLCBzZXJ2ZXJfZmxhZyk7CisJCW1zZy5jbWQuZGVzdHJveURldmljZS5idXNObyA9IGJ1c05vOworCQltc2cuY21kLmRlc3Ryb3lEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKworCQlyZXN1bHQgPSBkZXN0cm95X2RldmljZSgmbXNnLCBOVUxMKTsKKworCQlpZiAocmVzdWx0ICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiZWNobyAwLSVkLSVkID4gL3Byb2MvdWlzbGliL2RldmljZSB7Q09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZH0gUmVzdWx0KCVkKSIsCisJCQkgICAgIGJ1c05vLCBkZXZObywgcmVzdWx0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIGNvdW50OworCisJY2FzZSAxOgorCQlpZiAoaSAhPSA1KQorCQkJYnJlYWs7CisKKwkJLyogY3JlYXRlIGEgZGV2aWNlICovCisJCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NSRUFURSwgMCwgc2VydmVyX2ZsYWcpOworCQltc2cuY21kLmNyZWF0ZURldmljZS5idXNObyA9IGJ1c05vOworCQltc2cuY21kLmNyZWF0ZURldmljZS5kZXZObyA9IGRldk5vOworCQltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkciA9IF9fcGEoY2hhbnB0cik7CisJCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcyA9IE1JTl9JT19DSEFOTkVMX1NJWkU7CisKKwkJaWYgKHR5cGUgPT0gMCkKKwkJCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9CisJCQkgICAgVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZDsKKwkJZWxzZSBpZiAodHlwZSA9PSAxKQorCQkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGF0YVR5cGVHdWlkID0KKwkJCSAgICBVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkOworCQllbHNlIHsKKwkJCUxPR0VSUigiZWNobyAxLSVkLSVkLSV4LTx0eXBlPiA+IC9wcm9jL3Vpc2xpYi9kZXZjZSBmYWlsZWQ6IGludmFsaWQgZGV2aWNlIHR5cGUgJWQuIiwKKwkJCSAgICAgYnVzTm8sIGRldk5vLCBjaGFucHRyLCB0eXBlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmVzdWx0ID0gY3JlYXRlX2RldmljZSgmbXNnLCBOVUxMKTsKKworCQlpZiAocmVzdWx0ICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCWlmICh0eXBlID09IDApCisJCQkJTE9HRVJSKCJlY2hvIDEtJWQtJWQtJXgtMCA+IC9wcm9jL3Vpc2xpYi9kZXZpY2Uge0NPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFW3ZIQkFdIEZhaWxlZH0gUmVzdWx0KCVkKSIsCisJCQkJICAgICBidXNObywgZGV2Tm8sIGNoYW5wdHIsIHJlc3VsdCk7CisJCQllbHNlCisJCQkJTE9HRVJSKCJlY2hvIDEtJWQtJWQtJXgtMSA+IC9wcm9jL3Vpc2xpYi9kZXZpY2Uge0NPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFW3ZOSUNdIEZhaWxlZH0gUmVzdWx0KCVkKSIsCisJCQkJICAgICBidXNObywgZGV2Tm8sIGNoYW5wdHIsIHJlc3VsdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTE9HRVJSKCJVU0FHRTogZWNobyA8YWN0aW9uPi08YnVzTm8+LTxkZXZObz4uLi4gPiAvcHJvYy91aXNsaWIvZGV2aWNlIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJEZXN0cnVjdCBTeW50YXggICAgICAgQ29udHJvbFZNIE1lc3NhZ2UgSWQiKTsKKwlMT0dFUlIoIi0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlMT0dFUlIoIjAtPGJ1c05vPi08ZGV2Tm8+ID09PiBDT05UUk9MVk1fREVWSUNFX0RFU1RST1kiKTsKKwlMT0dFUlIoIiAiKTsKKwlMT0dFUlIoIkNvbnN0cnVjdCBTeW50YXggICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xWTSBNZXNzYWdlIElkIik7CisJTE9HRVJSCisJICAgICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIik7CisJTE9HRVJSCisJICAgICgiMS08YnVzTm8+LTxkZXZObz4tPGNoYW5wdHI+LTx0eXBlPiA9PT4gQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUiKTsKKwlMT0dFUlIoIiAgICAgIDx0eXBlID0gMD46IHZIQkEiKTsKKwlMT0dFUlIoIiAgICAgIDx0eXBlID0gMT46IHZOSUMiKTsKKwlMT0dFUlIoIiAiKTsKKworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgc3NpemVfdAorY3ljbGVzX2JlZm9yZV93YWl0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlsxNl07CisKKyNkZWZpbmUgQ1lDTEVTX0JFRk9SRV9XQUlUX1VTRV9FUlJPUiAgeyBcCisJTE9HRVJSKCJJbmNvcnJlY3QgQ2FsbCBIb21lIElucHV0LlxuIik7IFwKKwlwcl9pbmZvKCJQbGVhc2UgcGFzcyBDYWxsIEhvbWUgRXZlbnQgUGFyYW1ldGVycyBpbiB0aGUgZm9ybTpcbiIpOyBcCisJcHJfaW5mbygiRXZlbnRJRCBDYXRlZ29yeSBUeXBlW3BhcmFtZXRlcjFdW3BhcmFtZXRlcjJdW3BhcmFtZXRlcjNdW3BhcmFtZXRlcjRdW3BhcmFtZXRlcjVdW3BhcmFtZXRlcjZdXG4iKTsgXAorCXJldHVybiAtRUZBVUxUOyBcCit9CisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJQ1lDTEVTX0JFRk9SRV9XQUlUX1VTRV9FUlJPUjsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlidWZbY291bnQgLSAxXSA9ICdcMCc7CS8qIFJlcGxhY2UgdGhlIExGIGF0IHRoZSBlbmQgb2YgdGhlCisJCQkJICogaW5wdXQgd2l0aCBhIE5VTEwgKi8KKwkvKiBQdWxsIG91dCB0aGUgY3ljbGVzX2JlZm9yZV93YWl0IG11c3QgYmUgZGVjaW1hbCBpbnRlZ2VyICovCisJaWYgKHNzY2FuZihidWYsICIlbGxkIiwgJmN5Y2xlc19iZWZvcmVfd2FpdCkgIT0gMSkKKwkJQ1lDTEVTX0JFRk9SRV9XQUlUX1VTRV9FUlJPUjsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Jlc2V0X2NvdW50c19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMTZdOworCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdmFsdWU7CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJaW50IGk7CisKKyNkZWZpbmUgUkVTRVRfQ09VTlRTX1VTRV9FUlJPUiAgeyBcCisJTE9HRVJSKCJJbmNvcnJlY3QgcmVzZXRfY291bnRzIElucHV0LlxuIik7IFwKKwlwcl9pbmZvKCJQbGVhc2UgcGFzcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgY291bnRlcnM6XG4iKTsgXAorCXByX2luZm8oImUuZy4gZWNobyAwID4gcmVzZXRfY291bnRzXG4iKTsgXAorCXJldHVybiAtRUZBVUxUOyBcCisJfQorCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJUkVTRVRfQ09VTlRTX1VTRV9FUlJPUjsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlidWZbY291bnQgLSAxXSA9ICdcMCc7CS8qIFJlcGxhY2UgdGhlIExGIGF0IHRoZSBlbmQgb2YgdGhlCisJCQkJICogaW5wdXQgd2l0aCBhIE5VTEwgKi8KKwkvKiBQdWxsIG91dCB0aGUgcmVzZXRfY291bnRzIG11c3QgYmUgZGVjaW1hbCBpbnRlZ2VyICovCisJaWYgKHNzY2FuZihidWYsICIlbGx1IiwgJm5ld192YWx1ZSkgIT0gMSkKKwkJUkVTRVRfQ09VTlRTX1VTRV9FUlJPUjsKKwlyZWFkX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwlmb3IgKGJ1cyA9IEJ1c0xpc3RIZWFkOyBidXM7IGJ1cyA9IGJ1cy0+bmV4dCkgeworCisJCWZvciAoaSA9IDA7IGkgPCBidXMtPmRldmljZUNvdW50OyBpKyspIHsKKwkJCWlmIChidXMtPmRldmljZVtpXSkgeworCQkJCWJ1cy0+ZGV2aWNlW2ldLT5maXJzdF9idXN5X2NudCA9IG5ld192YWx1ZTsKKwkJCQlidXMtPmRldmljZVtpXS0+bW92ZWRfdG9fdGFpbF9jbnQgPSBuZXdfdmFsdWU7CisJCQkJYnVzLT5kZXZpY2VbaV0tPmxhc3Rfb25fbGlzdF9jbnQgPSBuZXdfdmFsdWU7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwl0b3RfbW92ZWRfdG9fdGFpbF9jbnQgPSBuZXdfdmFsdWU7CisJdG90X3dhaXRfY250ID0gbmV3X3ZhbHVlOworCXRvdF93YWtldXBfY250ID0gbmV3X3ZhbHVlOworCXRvdF9zY2hlZHVsZV9jbnQgPSBuZXdfdmFsdWU7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc21hcnRfd2FrZXVwX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlsxNl07CisJaW50IG5ld192YWx1ZTsKKworI2RlZmluZSBTTUFSVF9XQUtFVVBfVVNFX0VSUk9SICB7IFwKKwlMT0dFUlIoIkluY29ycmVjdCBzbWFydF93YWtldXAgSW5wdXQgMCBkaXNhYmxlcyBzbWFydF93YWtldXAsIGFuZCAxIGVuYWJsZXMgc21hcnRfd2FrZXVwLlxuIik7IFwKKwlwcl9pbmZvKCJlY2hvIDAgPiBzbWFydF93YWtldXBcbiIpOyBcCisJcHJfaW5mbygiZWNobyAxID4gc21hcnRfd2FrZXVwXG4iKTsgXAorCXJldHVybiAtRUZBVUxUOyBcCisJfQorCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJU01BUlRfV0FLRVVQX1VTRV9FUlJPUjsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlidWZbY291bnQgLSAxXSA9ICdcMCc7CS8qIFJlcGxhY2UgdGhlIExGIGF0IHRoZSBlbmQgb2YgdGhlCisJCQkJICogaW5wdXQgd2l0aCBhIE5VTEwgKi8KKwkvKiBQdWxsIG91dCB0aGUgc21hcnRfd2FrZXVwIG11c3QgYmUgZGVjaW1hbCBpbnRlZ2VyICovCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpCisJCVNNQVJUX1dBS0VVUF9VU0VfRVJST1I7CisJZW5fc21hcnRfd2FrZXVwID0gbmV3X3ZhbHVlOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Rlc3RfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGksIGFjdGlvbiA9IDB4ZmZmZjsKKwljaGFyIGJ1ZlsxNl07CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCVM2NCB2cnRjX29mZnNldDsKKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWkgPSBzc2NhbmYoYnVmLCAiJXgiLCAmYWN0aW9uKTsKKworCS8qIGlmIChpIDwgMSksIGkuZS4sIGlmIHdlIGRpZG4ndCBldmVuIHJlYWQgdGhlIGFjdGlvbiBmaWVsZCwKKwkqIHRoZW4gYWN0aW9uIHdpbGwgZGVmYXVsdCB0byAweGZmZmYgYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwKKwkqIGZhbGwgdGhyb3VnaCB0aGUgc3dpdGNoIGFuZCBwcmludCB1c2FnZS4gKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgNjoKKwkJbXNnLmhkci5JZCA9IENPTlRST0xWTV9DSElQU0VUX1NUT1A7CisJCW1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9IDE7CisJCXN0b3BfY2hpcHNldCgmbXNnLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl2cnRjX29mZnNldCA9IDA7CisJCUxPR0VSUigiYWJvdXQgdG8gaXNzdWUgUVVFUlkgdnJ0Y19vZmZzZXQ9JUxYIiwgdnJ0Y19vZmZzZXQpOworCQl2cnRjX29mZnNldCA9IElzc3VlX1ZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUKCk7CisJCUxPR0VSUigicmVzdWx0IGlzIHZydGNfb2Zmc2V0PSVMWCIsIHZydGNfb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2cnRjX29mZnNldCA9IDYwOworCQlMT0dFUlIoImFib3V0IHRvIGluY3JlYXNlIHBoeXNpY2FsIHRpbWUgYnkgMHglTFggc2Vjb25kcyIsCisJCSAgICAgICB2cnRjX29mZnNldCk7CisJCXZydGNfb2Zmc2V0ID0gSXNzdWVfVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FKHZydGNfb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQl2cnRjX29mZnNldCA9IC02MDsKKwkJTE9HRVJSKCJhYm91dCB0byBkZWNyZWFzZSBwaHlzaWNhbCB0aW1lIGJ5IDB4JUxYIHNlY29uZHMiLAorCQkgICAgICAgdnJ0Y19vZmZzZXQpOworCQl2cnRjX29mZnNldCA9IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRSh2cnRjX29mZnNldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR0VSUigidXNhZ2U6IDYgZm9yIENISVBTRVRfU1RPUFxuIik7CisJCUxPR0VSUigiICAgICAgIDcgZm9yIFZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUKClcbiIpOworCQlMT0dFUlIoIiAgICAgICA4IGZvciBWTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUoNjApXG4iKTsKKwkJTE9HRVJSKCIgICAgICAgOSBmb3IgVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FKC02MClcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjb3VudDsKK30KKworI2VuZGlmCQkJCS8qIFVJU0xJQl9URVNUX1BST0MgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2luZm8gKgorZmluZF9kZXYoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXYgPSBOVUxMOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIiVzIGJhZCBidXNObywgZGV2Tm89JWQsJWQiLAorCQkJCSAgICAgICBfX2Z1bmNfXywKKwkJCQkgICAgICAgKGludCkgKGJ1c05vKSwgKGludCkgKGRldk5vKSk7CisJCQkJZ290byBBd2F5OworCQkJfQorCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2Tm9dOworCQkJaWYgKCFkZXYpCisJCQkJTE9HRVJSKCIlcyBiYWQgYnVzTm8sIGRldk5vPSVkLCVkIiwKKwkJCQkgICAgICAgX19mdW5jX18sCisJCQkJICAgICAgIChpbnQpIChidXNObyksIChpbnQpIChkZXZObykpOworCQkJZ290byBBd2F5OworCQl9CisJfQorQXdheToKKwlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCXJldHVybiBkZXY7Cit9CisKKy8qICBUaGlzIHRocmVhZCBjYWxscyB0aGUgImludGVycnVwdCIgZnVuY3Rpb24gZm9yIGVhY2ggZGV2aWNlIHRoYXQgaGFzCisgKiAgZW5hYmxlZCBzdWNoIHVzaW5nIHVpc2xpYl9lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKCkuICBUaGUgImludGVycnVwdCIKKyAqICBmdW5jdGlvbiB0eXBpY2FsbHkgcmVhZHMgYW5kIHByb2Nlc3NlcyB0aGUgZGV2aWNlcydzIGNoYW5uZWwgaW5wdXQKKyAqICBxdWV1ZS4gIFRoaXMgdGhyZWFkIHJlcGVhdGVkbHkgZG9lcyB0aGlzLCB1bnRpbCB0aGUgdGhyZWFkIGlzIHRvbGQgdG8gc3RvcAorICogICh2aWEgdWlzdGhyZWFkX3N0b3AoKSkuICBTbGVlcGluZyBydWxlczoKKyAqICAtIElmIHdlIGhhdmUgY2FsbGVkIHRoZSAiaW50ZXJydXB0IiBmdW5jdGlvbiBmb3IgYWxsIGRldmljZXMsIGFuZCBhbGwgb2YKKyAqICAgIHRoZW0gaGF2ZSByZXBvcnRlZCAibm90aGluZyBwcm9jZXNzZWQiIChyZXR1cm5lZCAwKSwgdGhlbiB3ZSB3aWxsIGdvIHRvCisgKiAgICBzbGVlcCBmb3IgYSBtYXhpbXVtIG9mIFBPTExKSUZGSUVTX05PUk1BTCBqaWZmaWVzLgorICogIC0gSWYgYW55b25lIGNhbGxzIHVpc2xpYl9mb3JjZV9jaGFubmVsX2ludGVycnVwdCgpLCB0aGUgYWJvdmUgamlmZnkKKyAqICAgIHNsZWVwIHdpbGwgYmUgaW50ZXJydXB0ZWQsIGFuZCB3ZSB3aWxsIHJlc3VtZSBjYWxsaW5nIHRoZSAiaW50ZXJydXB0IgorICogICAgZnVuY3Rpb24gZm9yIGFsbCBkZXZpY2VzLgorICogIC0gVGhlIGxpc3Qgb2YgZGV2aWNlcyBpcyBkeW5hbWljYWxseSByZS1vcmRlcmVkIGluIG9yZGVyIHRvCisgKiAgICBhdHRlbXB0IHRvIHByZXNlcnZlIGZhaXJuZXNzLiAgV2hlbmV2ZXIgd2Ugc3BpbiB0aHJ1IHRoZSBsaXN0IG9mCisgKiAgICBkZXZpY2VzIGFuZCBjYWxsIHRoZSBkZXYtPmludGVycnVwdCgpIGZ1bmN0aW9uLCBpZiB3ZSBmaW5kCisgKiAgICBkZXZpY2VzIHdoaWNoIHJlcG9ydCB0aGF0IHRoZXJlIGlzIHN0aWxsIG1vcmUgd29yayB0byBkbywgdGhlCisgKiAgICB0aGUgZmlyc3Qgc3VjaCBkZXZpY2Ugd2UgZmluZCBpcyBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBkZXZpY2UKKyAqICAgIGxpc3QuICBUaGlzIGVuc3VyZXMgdGhhdCBleHRyZW1lbHkgYnVzeSBkZXZpY2VzIGRvbid0IHN0YXJ2ZSBvdXQKKyAqICAgIGxlc3MtYnVzeSBvbmVzLgorICoKKyAqLworc3RhdGljIGludAorUHJvY2Vzc19JbmNvbWluZyh2b2lkICp2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJfY3ljbGVzLCBvbGRfY3ljbGVzLCBpZGxlX2N5Y2xlcywgZGVsdGFfY3ljbGVzOworCXN0cnVjdCBsaXN0X2hlYWQgKm5ld190YWlsID0gTlVMTDsKKwlpbnQgaTsKKwlVSVNfREFFTU9OSVpFKCJkZXZfaW5jb21pbmciKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlvbGRfY3ljbGVzID0gZ2V0X2N5Y2xlcygpOworCQl3YWl0X2V2ZW50X3RpbWVvdXQoV2FrZXVwX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzLAorCQkJCSAgIDAsIFBPTExKSUZGSUVTX05PUk1BTCk7CisJCWN1cl9jeWNsZXMgPSBnZXRfY3ljbGVzKCk7CisJCWlmICh3YWl0X2N5Y2xlcyA9PSAwKSB7CisJCQl3YWl0X2N5Y2xlcyA9IChjdXJfY3ljbGVzIC0gb2xkX2N5Y2xlcyk7CisJCX0gZWxzZSB7CisJCQlpZiAod2FpdF9jeWNsZXMgPCAoY3VyX2N5Y2xlcyAtIG9sZF9jeWNsZXMpKQorCQkJCXdhaXRfY3ljbGVzID0gKGN1cl9jeWNsZXMgLSBvbGRfY3ljbGVzKTsKKwkJfQorCX0KKwlMT0dJTkYoIndhaXRfY3ljbGVzPSVsbHUiLCB3YWl0X2N5Y2xlcyk7CisJY3ljbGVzX2JlZm9yZV93YWl0ID0gd2FpdF9jeWNsZXM7CisJaWRsZV9jeWNsZXMgPSAwOworCUdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsZWx0LCAqdG1wOworCQlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldiA9IE5VTEw7CisKKwkJLyogcG9sbCBlYWNoIGNoYW5uZWwgZm9yIGlucHV0ICovCisJCUxPQ0tTRU1fVU5JTlRFUlJVUFRJQkxFKCZMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwkJbmV3X3RhaWwgPSBOVUxMOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGVsdCwgdG1wLCAmTGlzdF9Qb2xsaW5nX0RldmljZV9DaGFubmVscykgeworCQkJaW50IHJjID0gMDsKKwkJCWRldiA9IGxpc3RfZW50cnkobGVsdCwgc3RydWN0IGRldmljZV9pbmZvLAorCQkJCQkgbGlzdF9wb2xsaW5nX2RldmljZV9jaGFubmVscyk7CisJCQlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmZGV2LT5pbnRlcnJ1cHRfY2FsbGJhY2tfbG9jayk7CisJCQlpZiAoZGV2LT5pbnRlcnJ1cHQpCisJCQkJcmMgPSBkZXYtPmludGVycnVwdChkZXYtPmludGVycnVwdF9jb250ZXh0KTsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJCVVOTE9DS1NFTSgmZGV2LT5pbnRlcnJ1cHRfY2FsbGJhY2tfbG9jayk7CisJCQlpZiAocmMpIHsKKwkJCQkvKiBkZXYtPmludGVycnVwdCByZXR1cm5lZCwgYnV0IHRoZXJlCisJCQkJKiBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8uCisJCQkJKiBSZXNjaGVkdWxlIHdvcmsgdG8gb2NjdXIgYXMgc29vbiBhcworCQkJCSogcG9zc2libGUuICovCisJCQkJaWRsZV9jeWNsZXMgPSAwOworCQkJCWlmIChuZXdfdGFpbCA9PSBOVUxMKSB7CisJCQkJCWRldi0+Zmlyc3RfYnVzeV9jbnQrKzsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChsaXN0X2lzX2xhc3QKKwkJCQkJICAgICAobGVsdCwKKwkJCQkJICAgICAgJkxpc3RfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpKSkgeworCQkJCQkJbmV3X3RhaWwgPSBsZWx0OworCQkJCQkJZGV2LT5tb3ZlZF90b190YWlsX2NudCsrOworCQkJCQl9IGVsc2UKKwkJCQkJCWRldi0+bGFzdF9vbl9saXN0X2NudCsrOworCQkJCX0KKworCQkJfQorCQkJaWYgKEluY29taW5nX1RocmVhZEluZm8uc2hvdWxkX3N0b3ApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKG5ld190YWlsICE9IE5VTEwpIHsKKwkJCXRvdF9tb3ZlZF90b190YWlsX2NudCsrOworCQkJbGlzdF9tb3ZlX3RhaWwobmV3X3RhaWwsICZMaXN0X1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwkJfQorCQlVTkxPQ0tTRU0oJkxvY2tfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworCQljdXJfY3ljbGVzID0gZ2V0X2N5Y2xlcygpOworCQlkZWx0YV9jeWNsZXMgPSBjdXJfY3ljbGVzIC0gb2xkX2N5Y2xlczsKKwkJb2xkX2N5Y2xlcyA9IGN1cl9jeWNsZXM7CisKKwkJLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBzY2FubmVkIHRocnUgYWxsIG9mIHRoZQorCQkqIGNoYW5uZWxzLCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKwkJKiAtIHRoZXJlIGlzIG5vIGlucHV0IHdhaXRpbmcgb24gYW55IG9mIHRoZSBjaGFubmVscworCQkqIC0gd2UgaGF2ZSByZWNlaXZlZCBhIHNpZ25hbCB0byBzdG9wIHRoaXMgdGhyZWFkCisJCSovCisJCWlmIChJbmNvbWluZ19UaHJlYWRJbmZvLnNob3VsZF9zdG9wKQorCQkJYnJlYWs7CisJCWlmIChlbl9zbWFydF93YWtldXAgPT0gMHhGRikgeworCQkJTE9HSU5GKCJlbl9zbWFydF93YWtldXAgc2V0IHRvIDB4ZmYsIHRvIGZvcmNlIGV4aXRpbmcgcHJvY2Vzc19pbmNvbWluZyIpOworCQkJYnJlYWs7CisJCX0KKwkJLyogd2FpdCBmb3IgUE9MTEpJRkZJRVNfTk9STUFMIGppZmZpZXMsIG9yIHVudGlsCisJCSogc29tZW9uZSB3YWtlcyB1cCBXYWtldXBfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMsCisJCSogd2hpY2hldmVyIGNvbWVzIGZpcnN0IG9ubHkgZG8gYSB3YWl0IHdoZW4gd2UgaGF2ZQorCQkqIGJlZW4gaWRsZSBmb3IgY3ljbGVzX2JlZm9yZV93YWl0IGN5Y2xlcy4KKwkJKi8KKwkJaWYgKGlkbGVfY3ljbGVzID4gY3ljbGVzX2JlZm9yZV93YWl0KSB7CisJCQlHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscyA9IDA7CisJCQl0b3Rfd2FpdF9jbnQrKzsKKwkJCXdhaXRfZXZlbnRfdGltZW91dChXYWtldXBfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMsCisJCQkJCSAgIEdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzLAorCQkJCQkgICBQT0xMSklGRklFU19OT1JNQUwpOworCQkJR29fUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMgPSAxOworCQl9IGVsc2UgeworCQkJdG90X3NjaGVkdWxlX2NudCsrOworCQkJc2NoZWR1bGUoKTsKKwkJCWlkbGVfY3ljbGVzID0gaWRsZV9jeWNsZXMgKyBkZWx0YV9jeWNsZXM7CisJCX0KKwl9CisJREJHSU5GKCJleGl0aW5nLlxuIik7CisJY29tcGxldGVfYW5kX2V4aXQoJkluY29taW5nX1RocmVhZEluZm8uaGFzX3N0b3BwZWQsIDApOworfQorCitzdGF0aWMgQk9PTAorSW5pdGlhbGl6ZV9pbmNvbWluZ190aHJlYWQodm9pZCkKK3sKKwlpZiAoSW5jb21pbmdfVGhyZWFkX1N0YXJ0ZWQpCisJCXJldHVybiBUUlVFOworCWlmICghdWlzdGhyZWFkX3N0YXJ0KCZJbmNvbWluZ19UaHJlYWRJbmZvLAorCQkJICAgICAmUHJvY2Vzc19JbmNvbWluZywgTlVMTCwgImRldl9pbmNvbWluZyIpKSB7CisJCUxPR0VSUigidWlzdGhyZWFkX3N0YXJ0IEluaXRpYWxpemVfaW5jb21pbmdfdGhyZWFkICoqKipGQUlMRUQiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlJbmNvbWluZ19UaHJlYWRfU3RhcnRlZCA9IFRSVUU7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qICBBZGQgYSBuZXcgZGV2aWNlL2NoYW5uZWwgdG8gdGhlIGxpc3QgYmVpbmcgcHJvY2Vzc2VkIGJ5CisgKiAgUHJvY2Vzc19JbmNvbWluZygpLgorICogIDxpbnRlcnJ1cHQ+IC0gaW5kaWNhdGVzIHRoZSBmdW5jdGlvbiB0byBjYWxsIHBlcmlvZGljYWxseS4KKyAqICA8aW50ZXJydXB0X2NvbnRleHQ+IC0gaW5kaWNhdGVzIHRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIDxpbnRlcnJ1cHQ+CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICovCit2b2lkCit1aXNsaWJfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCQkgaW50ICgqaW50ZXJydXB0KSh2b2lkICopLAorCQkJCSB2b2lkICppbnRlcnJ1cHRfY29udGV4dCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKKwlkZXYgPSBmaW5kX2RldihidXNObywgZGV2Tm8pOworCWlmICghZGV2KSB7CisJCUxPR0VSUigiJXMgYnVzTm89JWQsIGRldk5vPSVkIiwgX19mdW5jX18sIChpbnQpIChidXNObyksCisJCSAgICAgICAoaW50KSAoZGV2Tm8pKTsKKwkJcmV0dXJuOworCX0KKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJSW5pdGlhbGl6ZV9pbmNvbWluZ190aHJlYWQoKTsKKwlkZXYtPmludGVycnVwdCA9IGludGVycnVwdDsKKwlkZXYtPmludGVycnVwdF9jb250ZXh0ID0gaW50ZXJydXB0X2NvbnRleHQ7CisJZGV2LT5wb2xsaW5nID0gVFJVRTsKKwlsaXN0X2FkZF90YWlsKCYoZGV2LT5saXN0X3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzKSwKKwkJICAgICAgJkxpc3RfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworCVVOTE9DS1NFTSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyk7CisKKy8qICBSZW1vdmUgYSBkZXZpY2UvY2hhbm5lbCBmcm9tIHRoZSBsaXN0IGJlaW5nIHByb2Nlc3NlZCBieQorICogIFByb2Nlc3NfSW5jb21pbmcoKS4KKyAqLwordm9pZAordWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2OworCWRldiA9IGZpbmRfZGV2KGJ1c05vLCBkZXZObyk7CisJaWYgKCFkZXYpIHsKKwkJTE9HRVJSKCIlcyBidXNObz0lZCwgZGV2Tm89JWQiLCBfX2Z1bmNfXywgKGludCkgKGJ1c05vKSwKKwkJICAgICAgIChpbnQpIChkZXZObykpOworCQlyZXR1cm47CisJfQorCUxPQ0tTRU1fVU5JTlRFUlJVUFRJQkxFKCZMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwlsaXN0X2RlbCgmZGV2LT5saXN0X3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzKTsKKwlkZXYtPnBvbGxpbmcgPSBGQUxTRTsKKwlkZXYtPmludGVycnVwdCA9IE5VTEw7CisJVU5MT0NLU0VNKCZMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyk7CisKK3N0YXRpYyB2b2lkCitkb193YWtldXBfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKK3sKKwlpZiAoIUdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKSB7CisJCUdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzID0gMTsKKwkJd2FrZV91cCgmV2FrZXVwX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwl9Cit9CisKK3N0YXRpYyBERUNMQVJFX1dPUksoV29ya193YWtldXBfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMsCisJCSAgICBkb193YWtldXBfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOworCisvKiAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4geW91IHdhbnQgdG8gc2VuZCBhIGhpbnQgdG8gUHJvY2Vzc19JbmNvbWluZygpIHRoYXQKKyAqICB5b3VyIGRldmljZSBtaWdodCBoYXZlIG1vcmUgcmVxdWVzdHMuCisgKi8KK3ZvaWQKK3Vpc2xpYl9mb3JjZV9jaGFubmVsX2ludGVycnVwdChVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlpZiAoZW5fc21hcnRfd2FrZXVwID09IDApCisJCXJldHVybjsKKwlpZiAoR29fUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpCisJCXJldHVybjsKKwkvKiBUaGUgcG9pbnQgb2YgdXNpbmcgc2NoZWR1bGVfd29yaygpIGluc3RlYWQgb2YganVzdCBkb2luZworCSAqIHRoZSB3b3JrIGlubGluZSBpcyB0byBmb3JjZSBhIHNsaWdodCBkZWxheSBiZWZvcmUgd2FraW5nIHVwCisJICogdGhlIFByb2Nlc3NfSW5jb21pbmcoKSB0aHJlYWQuCisJICovCisJdG90X3dha2V1cF9jbnQrKzsKKwlzY2hlZHVsZV93b3JrKCZXb3JrX3dha2V1cF9wb2xsaW5nX2RldmljZV9jaGFubmVscyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgSW5pdCAmIEV4aXQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0Cit1aXNsaWJfbW9kX2luaXQodm9pZCkKK3sKKworCUxPR0lORigiTU9OSVRPUkFQSVMiKTsKKworCUxPR0lORigic2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3ApOiVsdSBieXRlc1xuIiwKKwkgICAgICAgKHVsb25nKSBzaXplb2Yoc3RydWN0IHVpc2NtZHJzcCkpOworCUxPR0lORigic2l6ZW9mKHN0cnVjdCBwaHlzX2luZm8pOiVsdVxuIiwKKwkgICAgICAgKHVsb25nKSBzaXplb2Yoc3RydWN0IHBoeXNfaW5mbykpOworCUxPR0lORigic2l6ZW9mKHVpc2NtZHJzcF9zY3NpKTolbHVcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3Bfc2NzaSkpOworCUxPR0lORigic2l6ZW9mKHVpc2NtZHJzcF9uZXQpOiVsdVxuIiwKKwkgICAgICAgKHVsb25nKSBzaXplb2Yoc3RydWN0IHVpc2NtZHJzcF9uZXQpKTsKKwlMT0dJTkYoInNpemVvZihDT05UUk9MVk1fTUVTU0FHRSk6JWx1IGJ5dGVzXG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCUxPR0lORigic2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MKTolbHUgYnl0ZXNcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MKSk7CisJTE9HSU5GKCJzaXplb2YoQ0hBTk5FTF9IRUFERVIpOiVsdSBieXRlc1xuIiwKKwkgICAgICAgKHVsb25nKSBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlMT0dJTkYoInNpemVvZihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MKTolbHUgYnl0ZXNcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wpKTsKKwlMT0dJTkYoIlNJWkVPRl9DTURSU1A6JWx1IGJ5dGVzXG4iLCBTSVpFT0ZfQ01EUlNQKTsKKwlMT0dJTkYoIlNJWkVPRl9QUk9UT0NPTDolbHUgYnl0ZXNcbiIsIFNJWkVPRl9QUk9UT0NPTCk7CisKKwkvKiBpbml0aWFsaXplIGdsb2JhbCBwb2ludGVycyB0byBOVUxMICovCisJQnVzTGlzdEhlYWQgPSBOVUxMOworCUJ1c0xpc3RDb3VudCA9IE1heEJ1c0NvdW50ID0gMDsKKwlyd2xvY2tfaW5pdCgmQnVzTGlzdExvY2spOworCVZpcnRDb250cm9sQ2hhbkZ1bmMgPSBOVUxMOworCisJLyogSXNzdWUgVk1DQUxMX0dFVF9DT05UUk9MVk1fQUREUiB0byBnZXQgQ3RybENoYW5QaHlzQWRkciBhbmQKKwkgKiB0aGVuIG1hcCB0aGlzIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSB2aXJ0dWFsIGFkZHJlc3MuICovCisJUE9TVENPREVfTElOVVhfMihEUklWRVJfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJLyogY3JlYXRlIHRoZSBwcm9jIGVudHJpZXMgZm9yIHRoZSBjaGFubmVscyAqLworCXVpc2xpYl9wcm9jX2RpciA9IHByb2NfbWtkaXIoRElSX1BST0NfRU5UUlksIE5VTEwpOworCS8qIChlLmcuLCBmb3IgL3Byb2MvdWlzbGliL3ZidXMvPHg+L2luZm8pICovCisJdWlzbGliX3Byb2NfdmJ1c19kaXIgPSBwcm9jX21rZGlyKERJUl9WQlVTX1BST0NfRU5UUlksIHVpc2xpYl9wcm9jX2Rpcik7CisKKwl2bmljX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShWTklDX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCQkgICAgICAmcHJvY192bmljX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHZuaWNfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSwgY3JlYXRlIHRoZSBwcm9jIGVudHJpZXMgZm9yCisJICogZW5xdWV1aW5nIENvbnRyb2wgQ2hhbm5lbCBtZXNzYWdlcyAqLworCWNoaXBzZXRfcHJvY19lbnRyeSA9CisJICAgIHByb2NfY3JlYXRlKENISVBTRVRfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJJnByb2NfY2hpcHNldF9mb3BzKTsKKwlTRVRfUFJPQ19PV05FUihjaGlwc2V0X3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCWluZm9fcHJvY19lbnRyeSA9IHByb2NfY3JlYXRlKElORk9fUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJCSAgICAgICZwcm9jX2luZm9fZm9wcyk7CisJU0VUX1BST0NfT1dORVIoaW5mb19wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwlwbGF0Zm9ybW51bWJlcl9wcm9jX2VudHJ5ID0KKwkgICAgcHJvY19jcmVhdGUoUExBVEZPUk1OVU1CRVJfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJJnByb2NfcGxhdGZvcm1udW1iZXJfZm9wcyk7CisJU0VUX1BST0NfT1dORVIocGxhdGZvcm1udW1iZXJpbmZvX3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCWN5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX2VudHJ5ID0KKwkgICAgcHJvY19jcmVhdGUoQ1lDTEVTX0JFRk9SRV9XQUlUX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX2N5Y2xlc19iZWZvcmVfd2FpdF9mb3BzKTsKKwlTRVRfUFJPQ19PV05FUihjeWNsZXNfYmVmb3JlX3dhaXRfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJcmVzZXRfY291bnRzX3Byb2NfZW50cnkgPQorCSAgICBwcm9jX2NyZWF0ZShSRVNFVF9DT1VOVFNfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJJnByb2NfcmVzZXRfY291bnRzX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHJlc2V0X2NvdW50c19wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwlzbWFydF93YWtldXBfcHJvY19lbnRyeSA9CisJICAgIHByb2NfY3JlYXRlKFNNQVJUX1dBS0VVUF9QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkmcHJvY19zbWFydF93YWtldXBfZm9wcyk7CisJU0VUX1BST0NfT1dORVIoc21hcnRfd2FrZXVwX3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworI2lmZGVmIFVJU0xJQl9URVNUX1BST0MKKwl0ZXN0X3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShURVNUX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCQkgICAgICAmcHJvY190ZXN0X2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHRlc3RfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJYnVzX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShCVVNfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJCSAgICAgJnByb2NfYnVzX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKGJ1c19wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwlkZXZfcHJvY19lbnRyeSA9IHByb2NfY3JlYXRlKERFVl9QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkJICAgICAmcHJvY19kZXZfZm9wcyk7CisJU0VUX1BST0NfT1dORVIoZGV2X3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKyNlbmRpZgkJCQkvKiBVSVNMSUJfVEVTVF9QUk9DICovCisJUE9TVENPREVfTElOVVhfMyhEUklWRVJfRVhJVF9QQywgMCwgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordWlzbGliX21vZF9leGl0KHZvaWQpCit7CisJaWYgKGRpc2FibGVfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRElTQUJMRV9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChjeWNsZXNfYmVmb3JlX3dhaXRfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoQ1lDTEVTX0JFRk9SRV9XQUlUX1BST0NfRU5UUllfRk4sCisJCQkJICB1aXNsaWJfcHJvY19kaXIpOworCWlmIChyZXNldF9jb3VudHNfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUkVTRVRfQ09VTlRTX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHNtYXJ0X3dha2V1cF9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShTTUFSVF9XQUtFVVBfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoY3RybGNoYW5fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoQ1RSTENIQU5fUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAocG1lbV9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShQTUVNX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKGluZm9fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSU5GT19QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChzd2l0Y2hfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoU1dJVENIX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKGV4dHBvcnRfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRVhUUE9SVF9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChwbGF0Zm9ybW51bWJlcl9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShQTEFURk9STU5VTUJFUl9QUk9DX0VOVFJZX0ZOLAorCQkJCSAgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoYnVzX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEJVU19QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChkZXZfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoREVWX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHZuaWNfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoVk5JQ19QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChjaGlwc2V0X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KENISVBTRVRfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAodWlzbGliX3Byb2NfdmJ1c19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJUl9WQlVTX1BST0NfRU5UUlksIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHVpc2xpYl9wcm9jX2RpcikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRElSX1BST0NfRU5UUlksIE5VTEwpOworCisJaWYgKFByb2NSZWFkQnVmZmVyKSB7CisJCXZmcmVlKFByb2NSZWFkQnVmZmVyKTsKKwkJUHJvY1JlYWRCdWZmZXIgPSBOVUxMOworCX0KKworCURCR0lORigiZ29vZGJ5ZS5cbiIpOworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQodWlzbGliX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHVpc2xpYl9tb2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlVzaGEgU3Jpbml2YXNhbiIpOworTU9EVUxFX0FMSUFTKCJ1aXNsaWIiKTsKKyAgLyogdGhpcyBpcyBleHRyYWN0ZWQgZHVyaW5nIGRlcG1vZCBhbmQga2VwdCBpbiBtb2R1bGVzLmRlcCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzcXVldWUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1OThmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3F1ZXVlLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIHVpc3F1ZXVlLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIEBBTExfSU5TUEVDVEVEICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorCisjaW5jbHVkZSAiY2hhbnN0dWIuaCIKKworLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgorICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc3F1ZXVlX2MKKyNkZWZpbmUgX19NWUZJTEVfXyAidWlzcXVldWUuYyIKKworI2RlZmluZSBDSEVDS19DQUNIRV9BTElHTiAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZwordWlzcXVldWVfSW50ZXJsb2NrZWRPcih1bnNpZ25lZCBsb25nIGxvbmcgX19pb21lbSAqVGFyZ2V0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIFNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgajsKKworCWogPSByZWFkcShUYXJnZXQpOworCWRvIHsKKwkJaSA9IGo7CisJCWogPSB1aXNsaWJjbXB4Y2hnNjQoKF9fZm9yY2UgdW5zaWduZWQgbG9uZyBsb25nICopVGFyZ2V0LAorCQkJCSAgICBpLCBpIHwgU2V0LCBzaXplb2YoKihUYXJnZXQpKSk7CisKKwl9IHdoaWxlIChpICE9IGopOworCisJcmV0dXJuIGo7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKTsKKwordW5zaWduZWQgbG9uZyBsb25nCit1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZCh1bnNpZ25lZCBsb25nIGxvbmcgX19pb21lbSAqVGFyZ2V0LAorCQkJdW5zaWduZWQgbG9uZyBsb25nIFNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgajsKKworCWogPSByZWFkcShUYXJnZXQpOworCWRvIHsKKwkJaSA9IGo7CisJCWogPSB1aXNsaWJjbXB4Y2hnNjQoKF9fZm9yY2UgdW5zaWduZWQgbG9uZyBsb25nICopVGFyZ2V0LAorCQkJCSAgICBpLCBpICYgU2V0LCBzaXplb2YoKihUYXJnZXQpKSk7CisKKwl9IHdoaWxlIChpICE9IGopOworCisJcmV0dXJuIGo7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZCk7CisKK3N0YXRpYyBVOAorZG9fbG9ja2VkX2NsaWVudF9pbnNlcnQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywKKwkJCXVuc2lnbmVkIGludCB3aGljaHF1ZXVlLAorCQkJdm9pZCAqcFNpZ25hbCwKKwkJCXNwaW5sb2NrX3QgKmxvY2ssCisJCQl1bnNpZ25lZCBjaGFyIGlzc3VlSW50ZXJydXB0SWZFbXB0eSwKKwkJCVU2NCBpbnRlcnJ1cHRIYW5kbGUsIFU4ICpjaGFubmVsSWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHF1ZXVlV2FzRW1wdHk7CisJdW5zaWduZWQgaW50IGxvY2tlZCA9IDA7CisJdW5zaWduZWQgaW50IGFjcXVpcmVkID0gMDsKKwlVOCByYyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CisJbG9ja2VkID0gMTsKKworCWlmICghVUxUUkFfQ0hBTk5FTF9DTElFTlRfQUNRVUlSRV9PUyhxdWV1ZWluZm8tPmNoYW4sIGNoYW5uZWxJZCwgTlVMTCkpCisJCWdvdG8gQXdheTsKKworCWFjcXVpcmVkID0gMTsKKworCXF1ZXVlV2FzRW1wdHkgPSB2aXNvcl9zaWduYWxxdWV1ZV9lbXB0eShxdWV1ZWluZm8tPmNoYW4sIHdoaWNocXVldWUpOworCWlmICghdmlzb3Jfc2lnbmFsX2luc2VydChxdWV1ZWluZm8tPmNoYW4sIHdoaWNocXVldWUsIHBTaWduYWwpKQorCQlnb3RvIEF3YXk7CisJVUxUUkFfQ0hBTk5FTF9DTElFTlRfUkVMRUFTRV9PUyhxdWV1ZWluZm8tPmNoYW4sIGNoYW5uZWxJZCwgTlVMTCk7CisJYWNxdWlyZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCWxvY2tlZCA9IDA7CisKKwlxdWV1ZWluZm8tPnBhY2tldHNfc2VudCsrOworCisJcmMgPSAxOworQXdheToKKwlpZiAoYWNxdWlyZWQpIHsKKwkJVUxUUkFfQ0hBTk5FTF9DTElFTlRfUkVMRUFTRV9PUyhxdWV1ZWluZm8tPmNoYW4sIGNoYW5uZWxJZCwKKwkJCQkJCU5VTEwpOworCQlhY3F1aXJlZCA9IDA7CisJfQorCWlmIChsb2NrZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKSBsb2NrLCBmbGFncyk7CisJCWxvY2tlZCA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQKK3Vpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudChzdHJ1Y3QgdWlzcXVldWVfaW5mbyAqcXVldWVpbmZvLAorCQkJCSAgICAgc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHdoaWNocXVldWUsCisJCQkJICAgICB2b2lkICppbnNlcnRsb2NrLAorCQkJCSAgICAgdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQkJICAgICBVNjQgaW50ZXJydXB0SGFuZGxlLAorCQkJCSAgICAgY2hhciBva3Rvd2FpdCwgVTggKmNoYW5uZWxJZCkKK3sKKwl3aGlsZSAoIWRvX2xvY2tlZF9jbGllbnRfaW5zZXJ0KHF1ZXVlaW5mbywgd2hpY2hxdWV1ZSwgY21kcnNwLAorCQkJCQkoc3BpbmxvY2tfdCAqKSBpbnNlcnRsb2NrLAorCQkJCQlpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQkJCWludGVycnVwdEhhbmRsZSwgY2hhbm5lbElkKSkgeworCQlpZiAob2t0b3dhaXQgIT0gT0tfVE9fV0FJVCkgeworCQkJTE9HRVJSKCIqKioqRkFJTEVEIHZpc29yX3NpZ25hbF9pbnNlcnQgZmFpbGVkOyBjYW5ub3Qgd2FpdDsgaW5zZXJ0IGFib3J0ZWRcbiIpOworCQkJcmV0dXJuIDA7CS8qIGZhaWxlZCB0byBxdWV1ZSAqLworCQl9CisJCS8qIHRyeSBhZ2FpbiAqLworCQlMT0dFUlIoIioqKipGQUlMRUQgdmlzb3Jfc2lnbmFsX2luc2VydCBmYWlsZWQ7IHdhaXRpbmcgdG8gdHJ5IGFnYWluXG4iKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEwKSk7CisJfQorCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KTsKKworLyogdWlzcXVldWVfZ2V0X2NtZHJzcCBnZXRzIHRoZSBjbWRyc3AgZW50cnkgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlCisgKiByZXR1cm5zIE5VTEwgaWYgcXVldWUgaXMgZW1wdHkgKi8KK2ludAordWlzcXVldWVfZ2V0X2NtZHJzcChzdHJ1Y3QgdWlzcXVldWVfaW5mbyAqcXVldWVpbmZvLAorCQkgICAgdm9pZCAqY21kcnNwLCB1bnNpZ25lZCBpbnQgd2hpY2hxdWV1ZSkKK3sKKwlpZiAoIXZpc29yX3NpZ25hbF9yZW1vdmUocXVldWVpbmZvLT5jaGFuLCB3aGljaHF1ZXVlLCBjbWRyc3ApKQorCQlyZXR1cm4gMDsKKworCXF1ZXVlaW5mby0+cGFja2V0c19yZWNlaXZlZCsrOworCisJcmV0dXJuIDE7CQkvKiBTdWNjZXNzICovCit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNxdWV1ZV9nZXRfY21kcnNwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3RocmVhZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyYjA2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3RocmVhZC5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIHVpc3RocmVhZC5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBAQUxMX0lOU1BFQ1RFRCAqLworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJ1aXN0aHJlYWQuaCIKKworI2RlZmluZSBLSUxMKGEsIGIsIGMpIGtpbGxfcGlkKGZpbmRfdnBpZChhKSwgYiwgYykKKworLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgorICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcworICovCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBVSVNMSUJfUENfdWlzdGhyZWFkX2MKKyNkZWZpbmUgX19NWUZJTEVfXyAidWlzdGhyZWFkLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogcmV0dXJucyAwIGZvciBmYWlsdXJlLCAxIGZvciBzdWNjZXNzICovCitpbnQKK3Vpc3RocmVhZF9zdGFydChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8sCisJCWludCAoKnRocmVhZGZuKSh2b2lkICopLCB2b2lkICp0aHJjb250ZXh0LCBjaGFyICpuYW1lKQoreworCXRocmluZm8tPnNob3VsZF9zdG9wID0gMDsKKwkvKiB1c2VkIHRvIHN0b3AgdGhlIHRocmVhZCAqLworCWluaXRfY29tcGxldGlvbigmdGhyaW5mby0+aGFzX3N0b3BwZWQpOworCXRocmluZm8tPnRhc2sgPSBrdGhyZWFkX2NyZWF0ZSh0aHJlYWRmbiwgdGhyY29udGV4dCwgbmFtZSwgTlVMTCk7CisJaWYgKElTX0VSUih0aHJpbmZvLT50YXNrKSkgeworCQl0aHJpbmZvLT5pZCA9IDA7CisJCXJldHVybiAwOwkvKiBmYWlsdXJlICovCisJfQorCXRocmluZm8tPmlkID0gdGhyaW5mby0+dGFzay0+cGlkOworCXdha2VfdXBfcHJvY2Vzcyh0aHJpbmZvLT50YXNrKTsKKwlMT0dJTkYoInN0YXJ0ZWQgdGhyZWFkIHBpZDolZFxuIiwgdGhyaW5mby0+aWQpOworCXJldHVybiAxOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXN0aHJlYWRfc3RhcnQpOworCit2b2lkCit1aXN0aHJlYWRfc3RvcChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8pCit7CisJaW50IHJldDsKKwlpbnQgc3RvcHBlZCA9IDA7CisJaWYgKHRocmluZm8tPmlkID09IDApCisJCXJldHVybjsJCS8qIHRocmVhZCBub3QgcnVubmluZyAqLworCisJTE9HSU5GKCJ1aXN0aHJlYWRfc3RvcCBzdG9wcGluZyBpZDolZFxuIiwgdGhyaW5mby0+aWQpOworCXRocmluZm8tPnNob3VsZF9zdG9wID0gMTsKKwlyZXQgPSBLSUxMKHRocmluZm8tPmlkLCBTSUdIVVAsIDEpOworCWlmIChyZXQpIHsKKwkJTE9HRVJSKCJ1bmFibGUgdG8gc2lnbmFsIHRocmVhZCAlZFxuIiwgcmV0KTsKKwl9IGVsc2UgeworCQkvKiBnaXZlIHVwIGlmIHRoZSB0aHJlYWQgaGFzIE5PVCBkaWVkIGluIDEgbWludXRlICovCisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnRocmluZm8tPmhhc19zdG9wcGVkLCA2MCAqIEhaKSkKKwkJCXN0b3BwZWQgPSAxOworCQllbHNlCisJCQlMT0dFUlIoInRpbWVkIG91dCB0cnlpbmcgdG8gc2lnbmFsIHRocmVhZFxuIik7CisJfQorCWlmIChzdG9wcGVkKSB7CisJCUxPR0lORigidWlzdGhyZWFkX3N0b3Agc3RvcHBlZCBpZDolZFxuIiwgdGhyaW5mby0+aWQpOworCQl0aHJpbmZvLT5pZCA9IDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzdGhyZWFkX3N0b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3OGY3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3V0aWxzLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qIHVpc3V0aWxzLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8Y29tbW9udHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAidmJ1c2hlbHBlci5oIgorI2luY2x1ZGUgImd1aWR1dGlscy5oIgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2lmZGVmIENPTkZJR19ISUdITUVNCisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2VuZGlmCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMKKyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc3V0aWxzX2MKKyNkZWZpbmUgX19NWUZJTEVfXyAidWlzdXRpbHMuYyIKKworLyogZXhwb3J0cyAqLworYXRvbWljX3QgVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyA9IEFUT01JQ19JTklUKDApOworCQkJCQkvKiBudW0gcmVnaXN0cmF0aW9ucyB2aWEKKwkJCQkJICogdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcigpIG9yCisJCQkJCSAqIHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFV0aWxpdHkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50Cit1aXN1dGlsX2FkZF9wcm9jX2xpbmVfZXgoaW50ICp0b3RhbCwgY2hhciAqKmJ1ZmZlciwgaW50ICpidWZmZXJfcmVtYWluaW5nLAorCQkgICAgICBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGxlbjsKKworCURCR0lORigiYnVmZmVyID0gMHglcCA6ICpidWZmZXIgPSAweCVwLlxuIiwgYnVmZmVyLCAqYnVmZmVyKTsKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWxlbiA9IHZzbnByaW50ZigqYnVmZmVyLCAqYnVmZmVyX3JlbWFpbmluZywgZm9ybWF0LCBhcmdzKTsKKwlpZiAobGVuID49ICpidWZmZXJfcmVtYWluaW5nKSB7CisJCSpidWZmZXIgKz0gKmJ1ZmZlcl9yZW1haW5pbmc7CisJCSp0b3RhbCArPSAqYnVmZmVyX3JlbWFpbmluZzsKKwkJKmJ1ZmZlcl9yZW1haW5pbmcgPSAwOworCQlMT0dFUlIoImJ5dGVzIHJlbWFpbmluZyBpcyB0b28gc21hbGwhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqYnVmZmVyX3JlbWFpbmluZyAtPSBsZW47CisJKmJ1ZmZlciArPSBsZW47CisJKnRvdGFsICs9IGxlbjsKKwlyZXR1cm4gbGVuOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KTsKKworaW50Cit1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKGludCB0eXBlLCB2b2lkICpmcHRyLAorCQkJICAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmNoaXBzZXRfRHJpdmVySW5mbykKK3sKKwlMT0dJTkYoInR5cGUgPSAlZCwgZnB0ciA9IDB4JXAuXG4iLCB0eXBlLCBmcHRyKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMjoKKwkJaWYgKGZwdHIpIHsKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykKKwkJCQlhdG9taWNfaW5jKCZVaXNVdGlsc19SZWdpc3RlcmVkX1NlcnZpY2VzKTsKKwkJCVZpcnRDb250cm9sQ2hhbkZ1bmMgPSBmcHRyOworCQl9IGVsc2UgeworCQkJaWYgKFZpcnRDb250cm9sQ2hhbkZ1bmMpCisJCQkJYXRvbWljX2RlYygmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyk7CisJCQlWaXJ0Q29udHJvbENoYW5GdW5jID0gTlVMTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUxPR0VSUigiaW52YWxpZCB0eXBlICVkLlxuIiwgdHlwZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoY2hpcHNldF9Ecml2ZXJJbmZvKQorCQlCdXNEZXZpY2VJbmZvX0luaXQoY2hpcHNldF9Ecml2ZXJJbmZvLAorCQkJCSAgICJjaGlwc2V0IiwgInVpc2xpYiIsCisJCQkJICAgVkVSU0lPTiwgTlVMTCwgX19EQVRFX18sIF9fVElNRV9fKTsKKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcik7CisKK2ludAordWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leChHVUlEIHN3aXRjaFR5cGVHdWlkLAorCQkJCWNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCisJCQkJaW50ICgqY29udHJvbGZ1bmMpKHN0cnVjdCBpb19tc2dzICopLAorCQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCisJCQkJaW50ICgqU2VydmVyX0NoYW5uZWxfT2spKHVuc2lnbmVkIGxvbmcKKwkJCQkJCQkgIGNoYW5uZWxCeXRlcyksCisJCQkJaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKKwkJCQkgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkgIFUzMiBjbGllbnRTdHJMZW4sIFU2NCBieXRlcyksCisJCQkJVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pCit7CisJY2hhciBzWzk5XTsKKwlSZXFIYW5kbGVySW5mb190ICpwUmVxSGFuZGxlckluZm87CisJaW50IHJjID0gMDsJCS8qIGFzc3VtZSBmYWlsdXJlICovCisJTE9HSU5GKCJ0eXBlPSVzLCBjb250cm9sZnVuYz0weCVwLlxuIiwKKwkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcyksIGNvbnRyb2xmdW5jKTsKKwlpZiAoIWNvbnRyb2xmdW5jKSB7CisJCUxPR0VSUigiJXM6IGNvbnRyb2xmdW5jIG11c3QgYmUgc3VwcGxpZWRcbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKCFTZXJ2ZXJfQ2hhbm5lbF9PaykgeworCQlMT0dFUlIoIiVzOiBTZXJ2ZXJfQ2hhbm5lbF9PayBtdXN0IGJlIHN1cHBsaWVkXG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCWlmICghU2VydmVyX0NoYW5uZWxfSW5pdCkgeworCQlMT0dFUlIoIiVzOiBTZXJ2ZXJfQ2hhbm5lbF9Jbml0IG11c3QgYmUgc3VwcGxpZWRcbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisJCWdvdG8gQXdheTsKKwl9CisJcFJlcUhhbmRsZXJJbmZvID0gUmVxSGFuZGxlckFkZChzd2l0Y2hUeXBlR3VpZCwKKwkJCQkJc3dpdGNoX3R5cGVfbmFtZSwKKwkJCQkJY29udHJvbGZ1bmMsCisJCQkJCW1pbl9jaGFubmVsX2J5dGVzLAorCQkJCQlTZXJ2ZXJfQ2hhbm5lbF9PaywgU2VydmVyX0NoYW5uZWxfSW5pdCk7CisJaWYgKCFwUmVxSGFuZGxlckluZm8pIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gYWRkICVzIHRvIHNlcnZlciBsaXN0XG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCisJYXRvbWljX2luYygmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyk7CisJcmMgPSAxOwkJCS8qIHN1Y2Nlc3MgKi8KK0F3YXk6CisJaWYgKHJjKSB7CisJCWlmIChjaGlwc2V0X0RyaXZlckluZm8pCisJCQlCdXNEZXZpY2VJbmZvX0luaXQoY2hpcHNldF9Ecml2ZXJJbmZvLAorCQkJCQkgICAiY2hpcHNldCIsICJ1aXNsaWIiLAorCQkJCQkgICBWRVJTSU9OLCBOVUxMLAorCQkJCQkgICBfX0RBVEVfXywgX19USU1FX18pOworCX0gZWxzZQorCQlMT0dFUlIoImZhaWxlZCB0byByZWdpc3RlciB0eXBlICVzLlxuIiwKKwkJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgpOworCitpbnQKK3Vpc2N0cmxfdW5yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leChHVUlEIHN3aXRjaFR5cGVHdWlkKQoreworCWNoYXIgc1s5OV07CisJaW50IHJjID0gMDsJCS8qIGFzc3VtZSBmYWlsdXJlICovCisJTE9HSU5GKCJ0eXBlPSVzLlxuIiwgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCWlmIChSZXFIYW5kbGVyRGVsKHN3aXRjaFR5cGVHdWlkKSA8IDApIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gcmVtb3ZlICVzIGZyb20gc2VydmVyIGxpc3RcbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisJCWdvdG8gQXdheTsKKwl9CisJYXRvbWljX2RlYygmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyk7CisJcmMgPSAxOwkJCS8qIHN1Y2Nlc3MgKi8KK0F3YXk6CisJaWYgKCFyYykKKwkJTE9HRVJSKCJmYWlsZWQgdG8gdW5yZWdpc3RlciB0eXBlICVzLlxuIiwKKwkJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNjdHJsX3VucmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgpOworCisvKgorICogdW5zaWduZWQgaW50IHVpc3V0aWxfY29weV9mcmFnc2luZm9fZnJvbV9za2IodW5zaWduZWQgY2hhciAqY2FsbGluZ19jdHgsCisgKgkJCQkJICAgICB2b2lkICpza2JfaW4sCisgKgkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuLAorICoJCQkJCSAgICAgdW5zaWduZWQgaW50IGZyYWdzX21heCwKKyAqCQkJCQkgICAgIHN0cnVjdCBwaHlzX2luZm8gZnJhZ3NbXSkKKyAqCisgKgljYWxsaW5nX2N0eCAtIGlucHV0IC0gICBhIHN0cmluZyB0aGF0IGlzIGRpc3BsYXllZCB0byBzaG93CisgKgkJCQl3aG8gY2FsbGVkICogdGhpcyBmdW5jCisgKgl2b2lkICpza2JfaW4gLSAgc2tiIHdob3NlIGZyYWcgaW5mbyB3ZSdyZSBjb3B5aW5nIHR5cGUgaXMgaGlkZGVuIHNvIHdlCisgKgkJCWRvbid0IG5lZWQgdG8gaW5jbHVkZSBza2JidWZmIGluIHVpc3V0aWxzLmggd2hpY2ggaXMKKyAqCQkJaW5jbHVkZWQgaW4gbm9uLW5ldHdvcmtpbmcgY29kZS4KKyAqCXVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4gLSBpbnB1dCAtIGxlbmd0aCBvZiBmaXJzdCBmcmFnbWVudCBpbiBza2IKKyAqCXVuc2lnbmVkIGludCBmcmFnc19tYXggLSBpbnB1dCAtIG1heCBsZW4gb2YgZnJhZ3MgYXJyYXkKKyAqCXN0cnVjdCBwaHlzX2luZm8gZnJhZ3NbXSAtIG91dHB1dCAtIGZyYWdzIGFycmF5IGZpbGxlZCBpbiBvbiBvdXRwdXQKKyAqCQkJCQkgICAgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBudW1iZXIgb2YKKyAqCQkJCQkgICAgZW50cmllcyBmaWxsZWQgaW4gZnJhZ3MKKyAqLwordW5zaWduZWQgaW50Cit1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LCB2b2lkICpza2JfaW4sCisJCQkJdW5zaWduZWQgaW50IGZpcnN0ZnJhZ2xlbiwKKwkJCQl1bnNpZ25lZCBpbnQgZnJhZ3NfbWF4LAorCQkJCXN0cnVjdCBwaHlzX2luZm8gZnJhZ3NbXSkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwLCBpaSwgc2l6ZSwgb2Zmc2V0ID0gMCwgbnVtZnJhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9pbjsKKworCW51bWZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCXdoaWxlIChmaXJzdGZyYWdsZW4pIHsKKwkJaWYgKGNvdW50ID09IGZyYWdzX21heCkgeworCQkJTE9HRVJSKCIlcyBmcmFncyBhcnJheSB0b28gc21hbGw6IG1heDolZCBjb3VudDolZFxuIiwKKwkJCSAgICAgICBjYWxsaW5nX2N0eCwgZnJhZ3NfbWF4LCBjb3VudCk7CisJCQlyZXR1cm4gLTE7CS8qIGZhaWx1cmUgKi8KKwkJfQorCQlmcmFnc1tjb3VudF0ucGlfcGZuID0KKwkJICAgIHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZShza2ItPmRhdGEgKyBvZmZzZXQpKTsKKwkJZnJhZ3NbY291bnRdLnBpX29mZiA9CisJCSAgICAodW5zaWduZWQgbG9uZykgKHNrYi0+ZGF0YSArIG9mZnNldCkgJiBQSV9QQUdFX01BU0s7CisJCXNpemUgPQorCQkgICAgbWluKGZpcnN0ZnJhZ2xlbiwKKwkJCSh1bnNpZ25lZCBpbnQpIChQSV9QQUdFX1NJWkUgLSBmcmFnc1tjb3VudF0ucGlfb2ZmKSk7CisJCS8qIGNhbiB0YWtlIHNtYWxsZXN0IG9mIGZpcnN0ZnJhZ2xlbih3aGF0J3MgbGVmdCkgT1IKKwkJKiBieXRlcyBsZWZ0IGluIHRoZSBwYWdlCisJCSovCisJCWZyYWdzW2NvdW50XS5waV9sZW4gPSBzaXplOworCQlmaXJzdGZyYWdsZW4gLT0gc2l6ZTsKKwkJb2Zmc2V0ICs9IHNpemU7CisJCWNvdW50Kys7CisJfQorCWlmIChudW1mcmFncykgeworCQlpZiAoKGNvdW50ICsgbnVtZnJhZ3MpID4gZnJhZ3NfbWF4KSB7CisJCQlMT0dFUlIoIioqKiogRkFJTEVEICVzIGZyYWdzIGFycmF5IHRvbyBzbWFsbDogbWF4OiVkIGNvdW50K25yX2ZyYWdzOiVkXG4iLAorCQkJICAgICBjYWxsaW5nX2N0eCwgZnJhZ3NfbWF4LCBjb3VudCArIG51bWZyYWdzKTsKKwkJCXJldHVybiAtMTsJLyogZmFpbHVyZSAqLworCQl9CisKKwkJZm9yIChpaSA9IDA7IGlpIDwgbnVtZnJhZ3M7IGlpKyspIHsKKwkJCWNvdW50ID0gYWRkX3BoeXNpbmZvX2VudHJpZXMocGFnZV90b19wZm4oc2tiX2ZyYWdfcGFnZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpaV0pKSwJLyogcGZuICovCisJCQkJCQkgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgorCQkJCQkJICAgICBwYWdlX29mZnNldCwKKwkJCQkJCSAgICAgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpaV0uCisJCQkJCQkgICAgIHNpemUsIGNvdW50LCBmcmFnc19tYXgsCisJCQkJCQkgICAgIGZyYWdzKTsKKwkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBhZGQgcGh5c2luZm8gZW50cmllc1xuIik7CisJCQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCisJCQl9CisJCX0KKwl9CisJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CisJCXN0cnVjdCBza19idWZmICpza2Jpbmxpc3Q7CisJCWludCBjOworCQlmb3IgKHNrYmlubGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OyBza2Jpbmxpc3Q7CisJCSAgICAgc2tiaW5saXN0ID0gc2tiaW5saXN0LT5uZXh0KSB7CisKKwkJCWMgPSB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKCJyZWN1cnNpdmUiLAorCQkJCQkJCSAgICBza2Jpbmxpc3QsCisJCQkJCQkJICAgIHNrYmlubGlzdC0+bGVuIC0KKwkJCQkJCQkgICAgc2tiaW5saXN0LT5kYXRhX2xlbiwKKwkJCQkJCQkgICAgZnJhZ3NfbWF4IC0gY291bnQsCisJCQkJCQkJICAgICZmcmFnc1tjb3VudF0pOworCQkJaWYgKGMgPT0gLTEpIHsKKwkJCQlMT0dFUlIoIioqKiogRkFJTEVEIHJlY3Vyc2l2ZSBjYWxsIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY291bnQgKz0gYzsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKTsKKworc3RhdGljIExJU1RfSEVBRChSZXFIYW5kbGVySW5mb19saXN0KTsJLyogbGlzdCBvZiBSZXFIYW5kbGVySW5mb190ICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKFJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisKK1JlcUhhbmRsZXJJbmZvX3QgKgorUmVxSGFuZGxlckFkZChHVUlEIHN3aXRjaFR5cGVHdWlkLAorCSAgICAgIGNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCisJICAgICAgaW50ICgqY29udHJvbGZ1bmMpKHN0cnVjdCBpb19tc2dzICopLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCisJICAgICAgaW50ICgqU2VydmVyX0NoYW5uZWxfT2spKHVuc2lnbmVkIGxvbmcgY2hhbm5lbEJ5dGVzKSwKKwkgICAgICBpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9Jbml0KQorCSAgICAgICAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLCBVMzIgY2xpZW50U3RyTGVuLCBVNjQgYnl0ZXMpKQoreworCVJlcUhhbmRsZXJJbmZvX3QgKnJjID0gTlVMTDsKKworCXJjID0ga3phbGxvYyhzaXplb2YoKnJjKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFyYykKKwkJcmV0dXJuIE5VTEw7CisJcmMtPnN3aXRjaFR5cGVHdWlkID0gc3dpdGNoVHlwZUd1aWQ7CisJcmMtPmNvbnRyb2xmdW5jID0gY29udHJvbGZ1bmM7CisJcmMtPm1pbl9jaGFubmVsX2J5dGVzID0gbWluX2NoYW5uZWxfYnl0ZXM7CisJcmMtPlNlcnZlcl9DaGFubmVsX09rID0gU2VydmVyX0NoYW5uZWxfT2s7CisJcmMtPlNlcnZlcl9DaGFubmVsX0luaXQgPSBTZXJ2ZXJfQ2hhbm5lbF9Jbml0OworCWlmIChzd2l0Y2hfdHlwZV9uYW1lKQorCQlzdHJuY3B5KHJjLT5zd2l0Y2hfdHlwZV9uYW1lLCBzd2l0Y2hfdHlwZV9uYW1lLAorCQkJc2l6ZW9mKHJjLT5zd2l0Y2hfdHlwZV9uYW1lKSAtIDEpOworCXNwaW5fbG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCYocmMtPmxpc3RfbGluayksICZSZXFIYW5kbGVySW5mb19saXN0KTsKKwlzcGluX3VubG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKworCXJldHVybiByYzsKK30KKworUmVxSGFuZGxlckluZm9fdCAqCitSZXFIYW5kbGVyRmluZChHVUlEIHN3aXRjaFR5cGVHdWlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxlbHQsICp0bXA7CisJUmVxSGFuZGxlckluZm9fdCAqZW50cnkgPSBOVUxMOworCXNwaW5fbG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGVsdCwgdG1wLCAmUmVxSGFuZGxlckluZm9fbGlzdCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkobGVsdCwgUmVxSGFuZGxlckluZm9fdCwgbGlzdF9saW5rKTsKKwkJaWYgKG1lbWNtcAorCQkgICAgKCZlbnRyeS0+c3dpdGNoVHlwZUd1aWQsICZzd2l0Y2hUeXBlR3VpZCwKKwkJICAgICBzaXplb2YoR1VJRCkpID09IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCXJldHVybiBOVUxMOworfQorCitpbnQKK1JlcUhhbmRsZXJEZWwoR1VJRCBzd2l0Y2hUeXBlR3VpZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZWx0LCAqdG1wOworCVJlcUhhbmRsZXJJbmZvX3QgKmVudHJ5ID0gTlVMTDsKKwlpbnQgcmMgPSAtMTsKKwlzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxlbHQsIHRtcCwgJlJlcUhhbmRsZXJJbmZvX2xpc3QpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGxlbHQsIFJlcUhhbmRsZXJJbmZvX3QsIGxpc3RfbGluayk7CisJCWlmIChtZW1jbXAKKwkJICAgICgmZW50cnktPnN3aXRjaFR5cGVHdWlkLCAmc3dpdGNoVHlwZUd1aWQsCisJCSAgICAgc2l6ZW9mKEdVSUQpKSA9PSAwKSB7CisJCQlsaXN0X2RlbChsZWx0KTsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJCXJjKys7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ3OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBVbmlzeXMgdmlydGhiYSBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVklSVEhCQQorCXRyaXN0YXRlICJVbmlzeXMgdmlydGhiYSBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUkNISVBTRVQgJiYgVU5JU1lTX0NIQU5ORUxTVFVCICYmIFVOSVNZU19VSVNMSUIgJiYgVU5JU1lTX1ZJUlRQQ0kgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlydGhiYSBkcml2ZXIuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJiMWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyB2aXJ0aGJhCisjCisKK29iai0kKENPTkZJR19VTklTWVNfVklSVEhCQSkJKz0gdmlydGhiYS5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdGltc2ttb2QKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0CitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzCisKK2NjZmxhZ3MteSArPSAtRENPTkZJR19TUEFSX0dVRVNUIC1ER1VFU1REUklWRVJCVUlMRCAtRE5PQVVUT1ZFUlNJT04KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3YjExZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmMKQEAgLTAsMCArMSwxODIzIEBACisvKiB2aXJ0aGJhLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgRVhQT1JUX1NZTVRBQgorCisvKiBpZiB5b3Ugd2FudCB0byB0dXJuIG9uIHNvbWUgZGVidWdnaW5nIG9mIHdyaXRlIGRldmljZSBkYXRhIG9yIHJlYWQKKyAqIGRldmljZSBkYXRhLCBkZWZpbmUgdGhlc2UgdHdvIHVuZGVmcy4gIFlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8KKyAqIGN1c3RvbWl6ZSB0aGUgY29kZSB3aGljaCBpcyBoZXJlIHNpbmNlIGl0IHdhcyB3cml0dGVuIGFzc3VtaW5nCisgKiByZWFkaW5nIGFuZCB3cml0aW5nIGEgc3BlY2lmaWMgZGF0YSBmaWxlIGRmLjY0TS50eHQgd2hpY2ggaXMgYQorICogNjRNZWdhYnl0ZSBmaWxlIGNyZWF0ZWQgYnkgQXJ0IE5pbHNvbiB1c2luZyBhIHNjcml0cCBJIHdyb3RlIGNhbGxlZAorICogY3JfdGVzdF9kYXRhLnBsLiAgVGhlIGRhdGEgZmlsZSBjb25zaXN0cyBvZiAyNTYgYnl0ZSBsaW5lcyBvZiB0ZXh0CisgKiB3aGljaCBzdGFydCB3aXRoIGFuIDggZGlnaXQgc2VxdWVuY2UgbnVtYmVyLCBhIGNvbG9uLCBhbmQgdGhlbgorICogbGV0dGVycyBhZnRlciB0aGF0ICovCisKKyN1bmRlZiBEQkdJTkYKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2lmZGVmIENPTkZJR19NT0RWRVJTSU9OUworI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAiZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAidWlzcXVldWUuaCIKKyNpbmNsdWRlICJ1aXN0aHJlYWQuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAidmlydGhiYS5oIgorI2luY2x1ZGUgInZpcnRwY2kuaCIKKyNpbmNsdWRlICJ2aXNvcmNoaXBzZXQuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCisvKiB0aGlzIGlzIHNob3J0ZXIgdGhhbiB1c2luZyBfX0ZJTEVfXyAoZnVsbCBwYXRoIG5hbWUpIGluCisgKiBkZWJ1Zy9pbmZvL2Vycm9yIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJUlRfSEJBX1BDX3ZpcnRoYmFfYworI2RlZmluZSBfX01ZRklMRV9fICJ2aXJ0aGJhLmMiCisKKy8qIE5PVEU6ICBMMV9DQUNIRV9CWVRFUyA+PTEyOCAqLworI2RlZmluZSBERVZJQ0VfQVRUUklCVVRFIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdmlydGhiYV9wcm9iZShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKKwkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgdmlydGhiYV9yZW1vdmUoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpOworc3RhdGljIGludCB2aXJ0aGJhX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCk7CitzdGF0aWMgaW50IHZpcnRoYmFfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCk7CitzdGF0aWMgaW50IHZpcnRoYmFfZGV2aWNlX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCk7CitzdGF0aWMgaW50IHZpcnRoYmFfaG9zdF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGNvbnN0IGNoYXIgKnZpcnRoYmFfZ2V0X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwKTsKK3N0YXRpYyBpbnQgdmlydGhiYV9pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CitzdGF0aWMgaW50IHZpcnRoYmFfcXVldWVfY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCwKKwkJCQkgICAgIHZvaWQgKCp2aXJ0aGJhX2NtbmRfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CisKKyNpZmRlZiBERUZfU0NTSV9RQ01ECitERUZfU0NTSV9RQ01EKHZpcnRoYmFfcXVldWVfY29tbWFuZCkKKyNlbHNlCisjZGVmaW5lIHZpcnRoYmFfcXVldWVfY29tbWFuZCB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmRfbGNrCisjZW5kaWYKKworCitzdGF0aWMgaW50IHZpcnRoYmFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KTsKK3N0YXRpYyBpbnQgdmlydGhiYV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KTsKK3N0YXRpYyB2b2lkIHZpcnRoYmFfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpOworc3RhdGljIGludCBwcm9jZXNzX2luY29taW5nX3JzcHModm9pZCAqKTsKK3N0YXRpYyBpbnQgdmlydGhiYV9zZXJ2ZXJ1cChzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYpOworc3RhdGljIGludCB2aXJ0aGJhX3NlcnZlcmRvd24oc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2LCB1MzIgc3RhdGUpOworc3RhdGljIHZvaWQgZG9EaXNrQWRkUmVtb3ZlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB2aXJ0aGJhX3NlcnZlcmRvd25fY29tcGxldGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworc3RhdGljIHNzaXplX3QgaW5mb19wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7CitzdGF0aWMgc3NpemVfdCBycXd1X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgZW5hYmxlX2ludHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBlbmFibGVfaW50c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHbG9iYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcnNsdHFfd2FpdF91c2VjcyA9IDQwMDA7CS8qIERlZmF1bHQgNG1zICovCitzdGF0aWMgdW5zaWduZWQgaW50IE1heEJ1ZmZMZW47CisKKy8qIE1vZHVsZSBvcHRpb25zICovCitzdGF0aWMgY2hhciAqdmlydGhiYV9vcHRpb25zID0gIk5PTkUiOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmlydGhiYV9pZF90YWJsZVtdID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVU5JU1lTLCBQQ0lfREVWSUNFX0lEX1ZJUlRIQkEpfSwKKwl7MH0sCit9OworCisvKiBleHBvcnQgdmlydGhiYV9pZF90YWJsZSAqLworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZpcnRoYmFfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWU7CisKK3N0YXRpYyBzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgdmlydGhiYV9kcml2ZXIgPSB7CisJLm5hbWUgPSAidWlzdmlydGhiYSIsCisJLnZlcnNpb24gPSBWRVJTSU9OLAorCS52ZXJ0YWcgPSBOVUxMLAorCS5idWlsZF9kYXRlID0gX19EQVRFX18sCisJLmJ1aWxkX3RpbWUgPSBfX1RJTUVfXywKKwkuaWRfdGFibGUgPSB2aXJ0aGJhX2lkX3RhYmxlLAorCS5wcm9iZSA9IHZpcnRoYmFfcHJvYmUsCisJLnJlbW92ZSA9IHZpcnRoYmFfcmVtb3ZlLAorCS5yZXN1bWUgPSB2aXJ0aGJhX3NlcnZlcnVwLAorCS5zdXNwZW5kID0gdmlydGhiYV9zZXJ2ZXJkb3duCit9OworCisvKiBUaGUgU2VuZCBhbmQgUmVjaXZlIEJ1ZmZlcnMgb2YgdGhlIElPIFF1ZXVlIG1heSBib3RoIGJlIGZ1bGwgKi8KKyNkZWZpbmUgTUFYX1BFTkRJTkdfUkVRVUVTVFMgKE1JTl9OVU1TSUdOQUxTKjIpCisjZGVmaW5lIElOVEVSUlVQVF9WRUNUT1JfTUFTSyAweDNGCisKK3N0cnVjdCBzY3NpcGVuZGluZyB7CisJY2hhciBjbWR0eXBlOwkJLyogVHlwZSBvZiBwb2ludGVyIHRoYXQgaXMgYmVpbmcgc3RvcmVkICovCisJdm9pZCAqc2VudDsJCS8qIFRoZSBEYXRhIGJlaW5nIHRyYWNrZWQgKi8KKwkvKiBzdHJ1Y3Qgc2NzaV9jbW5kICp0eXBlIGZvciB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmQgKi8KKwkvKiBzdHJ1Y3QgdWlzY21kcnNwICp0eXBlIGZvciBtYW5hZ2VtZW50IGNvbW1hbmRzICovCit9OworCisjZGVmaW5lIFZJUlRIQkFfRVJST1JfQ09VTlQgMzAKKyNkZWZpbmUgSU9TX0VSUk9SX1RIUkVTSE9MRCAxMDAwCitzdHJ1Y3QgdmlydGRpc2tfaW5mbyB7CisJVTMyIHZhbGlkOworCVUzMiBjaGFubmVsLCBpZCwgbHVuOwkvKiBEaXNrIFBhdGggKi8KKwlhdG9taWNfdCBpb3NfdGhyZXNob2xkOworCWF0b21pY190IGVycm9yX2NvdW50OworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICpuZXh0OworfTsKKy8qIEVhY2ggU2NzaV9Ib3N0IGhhcyBhIGhvc3RfZGF0YSBhcmVhIHRoYXQgY29udGFpbnMgdGhpcyBzdHJ1Y3QuICovCitzdHJ1Y3QgdmlydGhiYV9pbmZvIHsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdDsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZfaW5mb19saXN0OworCXN0cnVjdCBjaGFuaW5mbyBjaGluZm87CisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsJLyogdXNlIHJlY3ZJbnRlcnJ1cHQgaW5mbyB0byByZWNlaXZlCisJCQkJCSAgIGludGVycnVwdHMgd2hlbiBJT3MgY29tcGxldGUgKi8KKwlpbnQgaW50ZXJydXB0X3ZlY3RvcjsKKwlzdHJ1Y3Qgc2NzaXBlbmRpbmcgcGVuZGluZ1tNQVhfUEVORElOR19SRVFVRVNUU107IC8qIFRyYWNrcyB0aGUgcmVxdWVzdHMKKwkJCQkJCQkgICAgIHRoYXQgaGF2ZSBiZWVuICovCisJLyogZm9yd2FyZGVkIHRvIHRoZSBJT1ZNIGFuZCBoYXZlbid0IHJldHVybmVkIHlldCAqLworCXVuc2lnbmVkIGludCBuZXh0aW5zZXJ0OwkvKiBTdGFydCBzZWFyY2ggZm9yIG5leHQgcGVuZGluZworCQkJCQkgICBmcmVlIHNsb3QgaGVyZSAqLworCXNwaW5sb2NrX3QgcHJpdmxvY2s7CisJYm9vbCBzZXJ2ZXJkb3duOworCWJvb2wgc2VydmVyY2hhbmdpbmdzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWNxdWlyZV9mYWlsZWRfY250OworCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlcnJ1cHRzX3JjdmQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGludGVycnVwdHNfbm90bWU7CisJdW5zaWduZWQgbG9uZyBsb25nIGludGVycnVwdHNfZGlzYWJsZWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHNlcnZlcmRvd25fY29tcGxldGlvbjsKKwlVNjQgX19pb21lbSAqZmxhZ3NfYWRkcjsKKwlhdG9taWNfdCBpbnRlcnJ1cHRfcmN2ZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByc3BfcXVldWU7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gaGVhZDsKK307CisKKy8qIFdvcmsgRGF0YSBmb3IgREFSV29ya1EgKi8KK3N0cnVjdCBkaXNrYWRkcmVtb3ZlIHsKKwlVOCBhZGQ7CQkJLyogMC1yZW1vdmUsIDEtYWRkICovCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7IC8qIFNjc2kgSG9zdCBmb3IgdGhpcyB2aXJ0aGJhIGluc3RhbmNlICovCisJVTMyIGNoYW5uZWwsIGlkLCBsdW47CS8qIERpc2sgUGF0aCAqLworCXN0cnVjdCBkaXNrYWRkcmVtb3ZlICpuZXh0OworfTsKKworI2RlZmluZSB2aXJ0cGNpX2Rldl90b192aXJ0aGJhX3ZpcnRoYmFfZ2V0X2luZm8oZCkgXAorCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdmlydGhiYV9pbmZvLCB2aXJ0cGNpZGV2KQorCitzdGF0aWMgREVWSUNFX0FUVFJJQlVURSAqdmlydGhiYV9zaG9zdF9hdHRyc1tdOworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgdmlydGhiYV9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAiVW5pc3lzIFZpcnR1YWwgSEJBIiwKKwkucHJvY19uYW1lID0gInVpc3ZpcnRoYmEiLAorCS5pbmZvID0gdmlydGhiYV9nZXRfaW5mbywKKwkuaW9jdGwgPSB2aXJ0aGJhX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQgPSB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSB2aXJ0aGJhX2Fib3J0X2hhbmRsZXIsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gdmlydGhiYV9kZXZpY2VfcmVzZXRfaGFuZGxlciwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSB2aXJ0aGJhX2J1c19yZXNldF9oYW5kbGVyLAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPSB2aXJ0aGJhX2hvc3RfcmVzZXRfaGFuZGxlciwKKwkuc2hvc3RfYXR0cnMgPSB2aXJ0aGJhX3Nob3N0X2F0dHJzLAorCisjZGVmaW5lIFZJUlRIQkFfTUFYX0NNTkRTIDEyOAorCS5jYW5fcXVldWUgPSBWSVJUSEJBX01BWF9DTU5EUywKKwkuc2dfdGFibGVzaXplID0gNjQsCS8qIGxhcmdlc3QgbnVtYmVyIG9mIGFkZHJlc3MvbGVuZ3RoIHBhaXJzICovCisJLnRoaXNfaWQgPSAtMSwKKwkuc2xhdmVfYWxsb2MgPSB2aXJ0aGJhX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUgPSB2aXJ0aGJhX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveSA9IHZpcnRoYmFfc2xhdmVfZGVzdHJveSwKKwkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKK3N0cnVjdCB2aXJ0aGJhX2RldmljZXNfb3BlbiB7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm87Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2luZm9fZm9wcyA9IHsKKwkucmVhZCA9IGluZm9fcHJvY19yZWFkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ycXd1X2ZvcHMgPSB7CisJLndyaXRlID0gcnF3dV9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19lbmFibGVfaW50c19mb3BzID0geworCS5yZWFkID0gZW5hYmxlX2ludHNfcmVhZCwKKwkud3JpdGUgPSBlbmFibGVfaW50c193cml0ZSwKK307CisKKworI2RlZmluZSBWSVJUSEJBU09QRU5NQVggMQorLyogYXJyYXkgb2Ygb3BlbiBkZXZpY2VzIG1haW50YWluZWQgYnkgb3BlbigpIGFuZCBjbG9zZSgpOyAqLworc3RhdGljIHN0cnVjdCB2aXJ0aGJhX2RldmljZXNfb3BlbiBWaXJ0SGJhc09wZW5bVklSVEhCQVNPUEVOTUFYXTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZpcnRoYmFfcHJvY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppbmZvX3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpycXdhaXR1c19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW5hYmxlX2ludHNfcHJvY19lbnRyeTsKKyNkZWZpbmUgSU5GT19QUk9DX0VOVFJZX0ZOICJpbmZvIgorI2RlZmluZSBFTkFCTEVfSU5UU19FTlRSWV9GTiAiZW5hYmxlX2ludHMiCisjZGVmaW5lIFJRV1VfUFJPQ19FTlRSWV9GTiAicnF3YWl0X3VzZWNzIgorI2RlZmluZSBESVJfUFJPQ19FTlRSWSAidmlydGhiYSIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTG9jYWwgRnVuY3Rpb25zCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FkZF9zY3NpcGVuZGluZ19lbnRyeShzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aGJhaW5mbywgY2hhciBjbWR0eXBlLCB2b2lkICpuZXcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW5zZXJ0X2xvY2F0aW9uOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCWluc2VydF9sb2NhdGlvbiA9IHZoYmFpbmZvLT5uZXh0aW5zZXJ0OworCXdoaWxlICh2aGJhaW5mby0+cGVuZGluZ1tpbnNlcnRfbG9jYXRpb25dLnNlbnQgIT0gTlVMTCkgeworCQlpbnNlcnRfbG9jYXRpb24gPSAoaW5zZXJ0X2xvY2F0aW9uICsgMSkgJSBNQVhfUEVORElOR19SRVFVRVNUUzsKKwkJaWYgKGluc2VydF9sb2NhdGlvbiA9PSAoaW50KSB2aGJhaW5mby0+bmV4dGluc2VydCkgeworCQkJTE9HRVJSKCJRdWV1ZSBzaG91bGQgYmUgZnVsbC4gaW5zZXJ0X2xvY2F0aW9uPDwlZD4+ICBVbmFibGUgdG8gZmluZCBvcGVuIHNsb3QgZm9yIHBlbmRpbmcgY29tbWFuZHMuXG4iLAorCQkJICAgICBpbnNlcnRfbG9jYXRpb24pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhiYWluZm8tPnByaXZsb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl2aGJhaW5mby0+cGVuZGluZ1tpbnNlcnRfbG9jYXRpb25dLmNtZHR5cGUgPSBjbWR0eXBlOworCXZoYmFpbmZvLT5wZW5kaW5nW2luc2VydF9sb2NhdGlvbl0uc2VudCA9IG5ldzsKKwl2aGJhaW5mby0+bmV4dGluc2VydCA9IChpbnNlcnRfbG9jYXRpb24gKyAxKSAlIE1BWF9QRU5ESU5HX1JFUVVFU1RTOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGluc2VydF9sb2NhdGlvbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorYWRkX3Njc2lwZW5kaW5nX2VudHJ5X3dpdGhfd2FpdChzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aGJhaW5mbywgY2hhciBjbWR0eXBlLAorCQkJCXZvaWQgKm5ldykKK3sKKwlpbnQgaW5zZXJ0X2xvY2F0aW9uID0gYWRkX3Njc2lwZW5kaW5nX2VudHJ5KHZoYmFpbmZvLCBjbWR0eXBlLCBuZXcpOworCisJd2hpbGUgKGluc2VydF9sb2NhdGlvbiA9PSAtMSkgeworCQlMT0dFUlIoIkZhaWxlZCB0byBmaW5kIGVtcHR5IHF1ZXVlIHNsb3QuICBXYWl0aW5nIHRvIHRyeSBhZ2FpblxuIik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygxMCkpOworCQlpbnNlcnRfbG9jYXRpb24gPSBhZGRfc2NzaXBlbmRpbmdfZW50cnkodmhiYWluZm8sIGNtZHR5cGUsIG5ldyk7CisJfQorCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIGluc2VydF9sb2NhdGlvbjsKK30KKworc3RhdGljIHZvaWQgKgorZGVsX3Njc2lwZW5kaW5nX2VudHJ5KHN0cnVjdCB2aXJ0aGJhX2luZm8gKnZoYmFpbmZvLCB1aW50cHRyX3QgZGVsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqc2VudCA9IE5VTEw7CisKKwlpZiAoZGVsID49IE1BWF9QRU5ESU5HX1JFUVVFU1RTKSB7CisJCUxPR0VSUigiSW52YWxpZCBxdWV1ZSBwb3NpdGlvbiA8PCVsdT4+IGdpdmVuIHRvIGRlbGV0ZS4gTUFYX1BFTkRJTkdfUkVRVUVTVFMgPDwlZD4+XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBkZWwsIE1BWF9QRU5ESU5HX1JFUVVFU1RTKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmhiYWluZm8tPnByaXZsb2NrLCBmbGFncyk7CisKKwkJaWYgKHZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uc2VudCA9PSBOVUxMKQorCQkJTE9HRVJSKCJEZWxldGluZyBhbHJlYWR5IGNsZWFyZWQgcXVldWUgZW50cnkgYXQgPDwlbHU+Pi5cbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBkZWwpOworCisJCXNlbnQgPSB2aGJhaW5mby0+cGVuZGluZ1tkZWxdLnNlbnQ7CisKKwkJdmhiYWluZm8tPnBlbmRpbmdbZGVsXS5jbWR0eXBlID0gMDsKKwkJdmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50ID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhiYWluZm8tPnByaXZsb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHNlbnQ7Cit9CisKKy8qIERBUldvcmtRIChEaXNrIEFkZC9SZW1vdmUpICovCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IERBUldvcmtROworc3RhdGljIHN0cnVjdCBkaXNrYWRkcmVtb3ZlICpEQVJXb3JrUUhlYWQ7CitzdGF0aWMgc3BpbmxvY2tfdCBEQVJXb3JrUUxvY2s7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgREFSV29ya1FTY2hlZDsKKyNkZWZpbmUgUVVFVUVfRElTS0FERFJFTU9WRShkYXIpIHsgXAorCXNwaW5fbG9ja19pcnFzYXZlKCZEQVJXb3JrUUxvY2ssIGZsYWdzKTsgXAorCWlmICghREFSV29ya1FIZWFkKSB7IFwKKwkJREFSV29ya1FIZWFkID0gZGFyOyBcCisJCWRhci0+bmV4dCA9IE5VTEw7IFwKKwl9IFwKKwllbHNlIHsgXAorCQlkYXItPm5leHQgPSBEQVJXb3JrUUhlYWQ7IFwKKwkJREFSV29ya1FIZWFkID0gZGFyOyBcCisJfSBcCisJaWYgKCFEQVJXb3JrUVNjaGVkKSB7IFwKKwkJc2NoZWR1bGVfd29yaygmREFSV29ya1EpOyBcCisJCURBUldvcmtRU2NoZWQgPSAxOyBcCisJfSBcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmREFSV29ya1FMb2NrLCBmbGFncyk7IFwKK30KKworc3RhdGljIGlubGluZSB2b2lkCitTZW5kRGlza0FkZFJlbW92ZShzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqZGFyKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlpbnQgZXJyb3I7CisKKwlzZGV2ID0gc2NzaV9kZXZpY2VfbG9va3VwKGRhci0+c2hvc3QsIGRhci0+Y2hhbm5lbCwgZGFyLT5pZCwgZGFyLT5sdW4pOworCWlmIChzZGV2KSB7CisJCWlmICghKGRhci0+YWRkKSkKKwkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwl9IGVsc2UgaWYgKGRhci0+YWRkKSB7CisJCWVycm9yID0KKwkJICAgIHNjc2lfYWRkX2RldmljZShkYXItPnNob3N0LCBkYXItPmNoYW5uZWwsIGRhci0+aWQsCisJCQkJICAgIGRhci0+bHVuKTsKKwkJaWYgKGVycm9yKQorCQkJTE9HRVJSKCJGYWlsZWQgc2NzaV9hZGRfZGV2aWNlOiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKKwkJCSAgICAgZGFyLT5zaG9zdC0+aG9zdF9ubywgZGFyLT5jaGFubmVsLCBkYXItPmlkLAorCQkJICAgICBkYXItPmx1bik7CisJfSBlbHNlCisJCUxPR0VSUigiRmFpbGVkIHNjc2lfZGV2aWNlX2xvb2t1cDpbY2hhbj0lZDppZD0lZDpsdW49JWRdXG4iLAorCQkgICAgICAgZGFyLT5jaGFubmVsLCBkYXItPmlkLCBkYXItPmx1bik7CisJa2ZyZWUoZGFyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogREFSV29ya1EgSGFuZGxlciBUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2RvRGlza0FkZFJlbW92ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRpc2thZGRyZW1vdmUgKmRhcjsKKwlzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqdG1waGVhZDsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZEQVJXb3JrUUxvY2ssIGZsYWdzKTsKKwl0bXBoZWFkID0gREFSV29ya1FIZWFkOworCURBUldvcmtRSGVhZCA9IE5VTEw7CisJREFSV29ya1FTY2hlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmREFSV29ya1FMb2NrLCBmbGFncyk7CisJd2hpbGUgKHRtcGhlYWQpIHsKKwkJZGFyID0gdG1waGVhZDsKKwkJdG1waGVhZCA9IGRhci0+bmV4dDsKKwkJU2VuZERpc2tBZGRSZW1vdmUoZGFyKTsKKwkJaSsrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUm91dGluZSB0byBhZGQgZW50cnkgdG8gREFSV29ya1EgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZGlza19ub3RpZnkoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCkKK3sKKwlzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqZGFyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza2FkZHJlbW92ZSksIEdGUF9BVE9NSUMpOworCWlmIChkYXIpIHsKKwkJZGFyLT5hZGQgPSBjbWRyc3AtPmRpc2tub3RpZnkuYWRkOworCQlkYXItPnNob3N0ID0gc2hvc3Q7CisJCWRhci0+Y2hhbm5lbCA9IGNtZHJzcC0+ZGlza25vdGlmeS5jaGFubmVsOworCQlkYXItPmlkID0gY21kcnNwLT5kaXNrbm90aWZ5LmlkOworCQlkYXItPmx1biA9IGNtZHJzcC0+ZGlza25vdGlmeS5sdW47CisJCVFVRVVFX0RJU0tBRERSRU1PVkUoZGFyKTsKKwl9IGVsc2UgeworCQlMT0dFUlIoImttYWxsb2MgZmFpbGVkIGZvciBkYXIuIGhvc3Rfbm89JWRbY2hhbj0lZDppZD0lZDpsdW49JWRdXG4iLAorCQkgICAgIHNob3N0LT5ob3N0X25vLCBjbWRyc3AtPmRpc2tub3RpZnkuY2hhbm5lbCwKKwkJICAgICBjbWRyc3AtPmRpc2tub3RpZnkuaWQsIGNtZHJzcC0+ZGlza25vdGlmeS5sdW4pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUHJvYmUgUmVtb3ZlIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90Cit2aXJ0aGJhX0lTUihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBkZXZfaWQ7CisJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWxIZWFkZXI7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICpwcWhkcjsKKwlVNjQgbWFzazsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmMxOworCisJaWYgKHZpcnRoYmFpbmZvID09IE5VTEwpCisJCXJldHVybiBJUlFfTk9ORTsKKwl2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19yY3ZkKys7CisJcENoYW5uZWxIZWFkZXIgPSB2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbjsKKwlpZiAoKChyZWFkcSgmcENoYW5uZWxIZWFkZXItPkZlYXR1cmVzKQorCSAgICAgICYgVUxUUkFfSU9fSU9WTV9JU19PS19XSVRIX0RSSVZFUl9ESVNBQkxJTkdfSU5UUykgIT0gMCkKKwkgICAgJiYgKChyZWFkcSgmcENoYW5uZWxIZWFkZXItPkZlYXR1cmVzKSAmCisJCSBVTFRSQV9JT19EUklWRVJfRElTQUJMRVNfSU5UUykgIT0KKwkJMCkpIHsKKwkJdmlydGhiYWluZm8tPmludGVycnVwdHNfZGlzYWJsZWQrKzsKKwkJbWFzayA9IH5VTFRSQV9DSEFOTkVMX0VOQUJMRV9JTlRTOworCQlyYzEgPSB1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZCh2aXJ0aGJhaW5mby0+ZmxhZ3NfYWRkciwgbWFzayk7CisJfQorCWlmICh2aXNvcl9zaWduYWxxdWV1ZV9lbXB0eShwQ2hhbm5lbEhlYWRlciwgSU9DSEFOX0ZST01fSU9QQVJUKSkgeworCQl2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19ub3RtZSsrOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCXBxaGRyID0gKFNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqKQorCQkoKGNoYXIgX19pb21lbSAqKSBwQ2hhbm5lbEhlYWRlciArCisJCSByZWFkcSgmcENoYW5uZWxIZWFkZXItPm9DaGFubmVsU3BhY2UpKSArIElPQ0hBTl9GUk9NX0lPUEFSVDsKKwl3cml0ZXEocmVhZHEoJnBxaGRyLT5OdW1JbnRlcnJ1cHRzUmVjZWl2ZWQpICsgMSwKKwkgICAgICAgJnBxaGRyLT5OdW1JbnRlcnJ1cHRzUmVjZWl2ZWQpOworCWF0b21pY19zZXQoJnZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfcmN2ZCwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2aXJ0aGJhaW5mby0+cnNwX3F1ZXVlKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK3ZpcnRoYmFfcHJvYmUoc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0OworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworCWludCByc3A7CisJaW50IGk7CisJaXJxX2hhbmRsZXJfdCBoYW5kbGVyID0gdmlydGhiYV9JU1I7CisJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWxIZWFkZXI7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICpwcWhkcjsKKwlVNjQgbWFzazsKKworCUxPR1ZFUigiZW50ZXJpbmcgdmlydGhiYV9wcm9iZS4uLlxuIik7CisJTE9HVkVSKCJ2aXJ0cGNpZGV2IGJ1c05vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNObywKKwkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlTm8pOworCisJTE9HSU5GKCJlbnRlcmluZyB2aXJ0aGJhX3Byb2JlLi4uXG4iKTsKKwlMT0dJTkYoInZpcnRwY2lkZXYgYnVzTm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c05vLAorCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2VObyk7CisJUE9TVENPREVfTElOVVhfMihWSEJBX1BST0JFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwkvKiBjYWxsIHNjc2lfaG9zdF9hbGxvYyB0byByZWdpc3RlciBhIHNjc2kgaG9zdCBhZGFwdGVyCisJICogaW5zdGFuY2UgLSB0aGlzIHZpcnRoYmEgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQgaXMgYW4KKwkgKiBpbnN0YW5jZSBvZiBhIHNjc2kgaG9zdCBhZGFwdGVyLiBUaGlzIHNjc2lfaG9zdF9hbGxvYworCSAqIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBTY3NpX0hvc3Qgc3RydWN0ICYgcGVyZm9ybXMgYmFzaWMKKwkgKiBpbml0aWFsaXphdG9pbi4gIFRoZSBob3N0IGlzIG5vdCBwdWJsaXNoZWQgdG8gdGhlIHNjc2kKKwkgKiBtaWRsYXllciB1bnRpbCBzY3NpX2FkZF9ob3N0IGlzIGNhbGxlZC4KKwkgKi8KKwlEQkdJTkYoImNhbGxpbmcgc2NzaV9ob3N0X2FsbG9jLlxuIik7CisKKwkvKiBhcmcgMiBwYXNzZWQgaW4gbGVuZ3RoIG9mIGV4dHJhIHNwYWNlIHdlIHdhbnQgYWxsb2NhdGVkCisJICogd2l0aCBzY3NpX2hvc3Qgc3RydWN0IGZvciBvdXIgb3duIHVzZSBzY3NpX2hvc3RfYWxsb2MKKwkgKiBhc3NpZ24gaG9zdF9ubworCSAqLworCXNjc2lob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZ2aXJ0aGJhX2RyaXZlcl90ZW1wbGF0ZSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHZpcnRoYmFfaW5mbykpOworCWlmIChzY3NpaG9zdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCURCR0lORigic2NzaWhvc3Q6IDB4JXAsIHNjc2lob3N0LT50aGlzX2lkOiAlZCwgaG9zdF9ubzogJWQuXG4iLAorCSAgICAgICBzY3NpaG9zdCwgc2NzaWhvc3QtPnRoaXNfaWQsIHNjc2lob3N0LT5ob3N0X25vKTsKKworCXNjc2lob3N0LT50aGlzX2lkID0gVUlTX01BR0lDX1ZIQkE7CisJLyogbGludXggdHJlYXRzIG1heC1jaGFubmVsIGRpZmZlcmVudGx5IHRoYW4gbWF4LWlkICYgbWF4LWx1bi4KKwkgKiBJbiB0aGUgbGF0dGVyIGNhc2VzLCB0aG9zZSB0d28gdmFsdWVzIHJlc3VsdCBpbiAwIHRvIG1heC0xCisJICogKGluY2x1c2l2ZSkgYmVpbmcgc2Nhbm5lZC4gQnV0IGluIHRoZSBjYXNlIG9mIGNoYW5uZWxzLCB0aGUKKwkgKiBzY2FuIGlzIDAgdG8gbWF4IChpbmNsdXNpdmUpOyBzbyB3ZSB3aWxsIHN1YnRyYWN0IG9uZSBmcm9tCisJICogdGhlIG1heC1jaGFubmVsIHZhbHVlLgorCSAqLworCUxPR0lORigidmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2NoYW5uZWw9JXUsIG1heF9pZD0ldSwgbWF4X2x1bj0ldSwgY21kX3Blcl9sdW49JXUsIG1heF9pb19zaXplPSV1XG4iLAorCSAgICAgKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbCAtIDEsCisJICAgICAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pZCwKKwkgICAgICh1bnNpZ25lZCkgdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2x1biwKKwkgICAgICh1bnNpZ25lZCkgdmlydHBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4sCisJICAgICAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pb19zaXplKTsKKwlzY3NpaG9zdC0+bWF4X2NoYW5uZWwgPSAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9jaGFubmVsOworCXNjc2lob3N0LT5tYXhfaWQgPSAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pZDsKKwlzY3NpaG9zdC0+bWF4X2x1biA9ICh1bnNpZ25lZCkgdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2x1bjsKKwlzY3NpaG9zdC0+Y21kX3Blcl9sdW4gPSAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4LmNtZF9wZXJfbHVuOworCXNjc2lob3N0LT5tYXhfc2VjdG9ycyA9CisJICAgICh1bnNpZ25lZCBzaG9ydCkgKHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pb19zaXplID4+IDkpOworCXNjc2lob3N0LT5zZ190YWJsZXNpemUgPQorCSAgICAodW5zaWduZWQgc2hvcnQpICh2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaW9fc2l6ZSAvIFBBR0VfU0laRSk7CisJaWYgKHNjc2lob3N0LT5zZ190YWJsZXNpemUgPiBNQVhfUEhZU19JTkZPKQorCQlzY3NpaG9zdC0+c2dfdGFibGVzaXplID0gTUFYX1BIWVNfSU5GTzsKKwlMT0dJTkYoInNjc2lob3N0LT5tYXhfY2hhbm5lbD0ldSwgbWF4X2lkPSV1LCBtYXhfbHVuPSV1LCBjbWRfcGVyX2x1bj0ldSwgbWF4X3NlY3RvcnM9JWh1LCBzZ190YWJsZXNpemU9JWh1XG4iLAorCSAgICAgc2NzaWhvc3QtPm1heF9jaGFubmVsLCBzY3NpaG9zdC0+bWF4X2lkLCBzY3NpaG9zdC0+bWF4X2x1biwKKwkgICAgIHNjc2lob3N0LT5jbWRfcGVyX2x1biwgc2NzaWhvc3QtPm1heF9zZWN0b3JzLAorCSAgICAgc2NzaWhvc3QtPnNnX3RhYmxlc2l6ZSk7CisJTE9HSU5GKCJzY3NpaG9zdC0+Y2FuX3F1ZXVlPSV1LCBzY3NpaG9zdC0+Y21kX3Blcl9sdW49JXUsIG1heF9zZWN0b3JzPSVodSwgc2dfdGFibGVzaXplPSVodVxuIiwKKwkgICAgIHNjc2lob3N0LT5jYW5fcXVldWUsIHNjc2lob3N0LT5jbWRfcGVyX2x1biwgc2NzaWhvc3QtPm1heF9zZWN0b3JzLAorCSAgICAgc2NzaWhvc3QtPnNnX3RhYmxlc2l6ZSk7CisKKwlEQkdJTkYoImNhbGxpbmcgc2NzaV9hZGRfaG9zdFxuIik7CisKKwkvKiB0aGlzIGNyZWF0ZXMgImhvc3QlZCIgaW4gc3lzZnMuICBJZiAybmQgYXJndW1lbnQgaXMgTlVMTCwKKwkgKiB0aGVuIHRoaXMgZ2VuZXJpYyAvc3lzL2RldmljZXMvcGxhdGZvcm0vaG9zdD8gIGRldmljZSBpcworCSAqIGNyZWF0ZWQgYW5kIC9zeXMvc2NzaV9ob3N0L2hvc3Q/IC0+CisJICogL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2hvc3Q/ICBJZiAybmQgYXJndW1lbnQgaXMgbm90IE5VTEwsCisJICogdGhlbiB0aGlzIGdlbmVyaWMgL3N5cy9kZXZpY2VzLzxwYXRoPi9ob3N0PyBpcyBjcmVhdGVkIGFuZAorCSAqIGhvc3Q/IHBvaW50cyB0byB0aGF0IGRldmljZSBpbnN0ZWFkLgorCSAqLworCWVycm9yID0gc2NzaV9hZGRfaG9zdChzY3NpaG9zdCwgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJTE9HRVJSKCJzY3NpX2FkZF9ob3N0ICoqKipGQUlMRUQgMHgleCAgVEJEIC0gUkVDT1ZFUlxuIiwgZXJyb3IpOworCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJLyogZGVjciByZWZjb3VudCBvbiBzY3NpaG9zdCB3aGljaCB3YXMgaW5jcmVtZW50ZWQgYnkKKwkJICogc2NzaV9hZGRfaG9zdCBzbyB0aGUgc2NzaV9ob3N0IGdldHMgZGVsZXRlZAorCQkgKi8KKwkJc2NzaV9ob3N0X3B1dChzY3NpaG9zdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWhvc3QtPmhvc3RkYXRhOworCW1lbXNldCh2aXJ0aGJhaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCB2aXJ0aGJhX2luZm8pKTsKKwlmb3IgKGkgPSAwOyBpIDwgVklSVEhCQVNPUEVOTUFYOyBpKyspIHsKKwkJaWYgKFZpcnRIYmFzT3BlbltpXS52aXJ0aGJhaW5mbyA9PSBOVUxMKSB7CisJCQlWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm8gPSB2aXJ0aGJhaW5mbzsKKwkJCWJyZWFrOworCQl9CisJfQorCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yID0gLTE7CisJdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8gPSAmdmlydHBjaWRldi0+cXVldWVpbmZvOworCXZpcnRoYmFpbmZvLT52aXJ0cGNpZGV2ID0gdmlydHBjaWRldjsKKwlzcGluX2xvY2tfaW5pdCgmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrKTsKKworCURCR0lORigiZ2VuZXJpY19kZXY6IDB4JXAsIHF1ZXVlaW5mbzogMHglcC5cbiIsCisJICAgICAgICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldiwgJnZpcnRwY2lkZXYtPnF1ZXVlaW5mbyk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2aXJ0aGJhaW5mby0+cnNwX3F1ZXVlKTsKKwlzcGluX2xvY2tfaW5pdCgmdmlydGhiYWluZm8tPnByaXZsb2NrKTsKKwltZW1zZXQoJnZpcnRoYmFpbmZvLT5wZW5kaW5nLCAwLCBzaXplb2YodmlydGhiYWluZm8tPnBlbmRpbmcpKTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyZG93biA9IGZhbHNlOworCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gZmFsc2U7CisKKwl2aXJ0aGJhaW5mby0+aW50ciA9IHZpcnRwY2lkZXYtPmludHI7CisJLyogc2F2ZSBvZiBob3N0IHdpdGhpbiB2aXJ0aGJhX2luZm8gKi8KKwl2aXJ0aGJhaW5mby0+c2NzaWhvc3QgPSBzY3NpaG9zdDsKKworCS8qIHNhdmUgb2YgaG9zdCB3aXRoaW4gdmlydHBjaV9kZXYgKi8KKwl2aXJ0cGNpZGV2LT5zY3NpLnNjc2lob3N0ID0gc2NzaWhvc3Q7CisKKwkvKiBTZXR1cCB3b3JrcXVldWUgZm9yIHNlcnZlcmRvd24gbWVzc2FnZXMgKi8KKwlJTklUX1dPUksoJnZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duX2NvbXBsZXRpb24sCisJCSAgdmlydGhiYV9zZXJ2ZXJkb3duX2NvbXBsZXRlKTsKKworCXdyaXRlcShyZWFkcSgmdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW4tPkZlYXR1cmVzKSB8CisJICAgICAgIFVMVFJBX0lPX0NIQU5ORUxfSVNfUE9MTElORywKKwkgICAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5GZWF0dXJlcyk7CisJLyogc3RhcnQgdGhyZWFkIHRoYXQgd2lsbCByZWNlaXZlIHNjc2ljbW5kIHJlc3BvbnNlcyAqLworCURCR0lORigic3RhcnRpbmcgcnNwIHRocmVhZCAtLSBxdWV1ZWluZm86IDB4JXAsIHRocmVhZGluZm86IDB4JXAuXG4iLAorCSAgICAgICB2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mbywgJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbyk7CisKKwlwQ2hhbm5lbEhlYWRlciA9IHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuOworCXBxaGRyID0gKFNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqKQorCQkoKGNoYXIgX19pb21lbSAqKXBDaGFubmVsSGVhZGVyICsKKwkJIHJlYWRxKCZwQ2hhbm5lbEhlYWRlci0+b0NoYW5uZWxTcGFjZSkpICsgSU9DSEFOX0ZST01fSU9QQVJUOworCXZpcnRoYmFpbmZvLT5mbGFnc19hZGRyID0gJnBxaGRyLT5GZWF0dXJlRmxhZ3M7CisKKwlpZiAoIXVpc3RocmVhZF9zdGFydCgmdmlydGhiYWluZm8tPmNoaW5mby50aHJlYWRpbmZvLAorCQkJICAgICBwcm9jZXNzX2luY29taW5nX3JzcHMsCisJCQkgICAgIHZpcnRoYmFpbmZvLCAidmhiYV9pbmNvbWluZyIpKSB7CisJCUxPR0VSUigidWlzdGhyZWFkX3N0YXJ0IHJzcCAqKioqRkFJTEVEXG4iKTsKKwkJLyogZGVjciByZWZjb3VudCBvbiBzY3NpaG9zdCB3aGljaCB3YXMgaW5jcmVtZW50ZWQgYnkKKwkJICogc2NzaV9hZGRfaG9zdCBzbyB0aGUgc2NzaV9ob3N0IGdldHMgZGVsZXRlZAorCQkgKi8KKwkJUE9TVENPREVfTElOVVhfMihWSEJBX1BST0JFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXNjc2lfaG9zdF9wdXQoc2NzaWhvc3QpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJTE9HSU5GKCJzZW5kSW50ZXJydXB0SGFuZGxlPTB4JTE2bGxYIiwKKwkgICAgICAgdmlydGhiYWluZm8tPmludHIuc2VuZEludGVycnVwdEhhbmRsZSk7CisJTE9HSU5GKCJyZWN2SW50ZXJydXB0SGFuZGxlPTB4JTE2bGxYIiwKKwkgICAgICAgdmlydGhiYWluZm8tPmludHIucmVjdkludGVycnVwdEhhbmRsZSk7CisJTE9HSU5GKCJyZWN2SW50ZXJydXB0VmVjdG9yPTB4JThYIiwKKwkgICAgICAgdmlydGhiYWluZm8tPmludHIucmVjdkludGVycnVwdFZlY3Rvcik7CisJTE9HSU5GKCJyZWN2SW50ZXJydXB0U2hhcmVkPTB4JTJYIiwKKwkgICAgICAgdmlydGhiYWluZm8tPmludHIucmVjdkludGVycnVwdFNoYXJlZCk7CisJTE9HSU5GKCJzY3NpaG9zdC5ob3N0dC0+bmFtZT0lcyIsIHNjc2lob3N0LT5ob3N0dC0+bmFtZSk7CisJdmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IgPQorCSAgICB2aXJ0aGJhaW5mby0+aW50ci5yZWN2SW50ZXJydXB0SGFuZGxlICYgSU5URVJSVVBUX1ZFQ1RPUl9NQVNLOworCXJzcCA9IHJlcXVlc3RfaXJxKHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yLCBoYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCSAgc2NzaWhvc3QtPmhvc3R0LT5uYW1lLCB2aXJ0aGJhaW5mbyk7CisJaWYgKHJzcCAhPSAwKSB7CisJCUxPR0VSUigicmVxdWVzdF9pcnEoJWQpIHVpc2xpYl92aXJ0aGJhX0lTUiByZXF1ZXN0IGZhaWxlZCB3aXRoIHJzcD0lZFxuIiwKKwkJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yLCByc3ApOworCQl2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciA9IC0xOworCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwl9IGVsc2UgeworCQlVNjQgX19pb21lbSAqRmVhdHVyZXNfYWRkciA9CisJCSAgICAmdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW4tPkZlYXR1cmVzOworCQlMT0dFUlIoInJlcXVlc3RfaXJxKCVkKSB1aXNsaWJfdmlydGhiYV9JU1IgcmVxdWVzdCBzdWNjZWVkZWRcbiIsCisJCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3Rvcik7CisJCW1hc2sgPSB+KFVMVFJBX0lPX0NIQU5ORUxfSVNfUE9MTElORyB8CisJCQkgVUxUUkFfSU9fRFJJVkVSX0RJU0FCTEVTX0lOVFMpOworCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJbWFzayA9IFVMVFJBX0lPX0RSSVZFUl9FTkFCTEVTX0lOVFM7CisJCXVpc3F1ZXVlX0ludGVybG9ja2VkT3IoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCXJzbHRxX3dhaXRfdXNlY3MgPSA0MDAwMDAwOworCX0KKworCURCR0lORigiY2FsbGluZyBzY3NpX3NjYW5faG9zdC5cbiIpOworCXNjc2lfc2Nhbl9ob3N0KHNjc2lob3N0KTsKKwlEQkdJTkYoInJldHVybiBmcm9tIHNjc2lfc2Nhbl9ob3N0LlxuIik7CisKKwlMT0dJTkYoInZpcnRoYmEgYWRkZWQgc2NzaWhvc3Q6MHglcFxuIiwgc2NzaWhvc3QpOworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3ZpcnRoYmFfcmVtb3ZlKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldikKK3sKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9CisJICAgIChzdHJ1Y3QgU2NzaV9Ib3N0ICopIHZpcnRwY2lkZXYtPnNjc2kuc2NzaWhvc3Q7CisKKwlMT0dJTkYoInZpcnRwY2lkZXYgYnVzTm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c05vLAorCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2VObyk7CisJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJaWYgKHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yICE9IC0xKQorCQlmcmVlX2lycSh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgdmlydGhiYWluZm8pOworCUxPR0lORigiUmVtb3ZpbmcgdmlydHBjaWRldjogMHglcCwgdmlydGhiYWluZm86IDB4JXBcbiIsIHZpcnRwY2lkZXYsCisJICAgICAgIHZpcnRoYmFpbmZvKTsKKworCURCR0lORigicmVtb3Zpbmcgc2NzaWhvc3Q6IDB4JXAsIHNjc2lob3N0LT50aGlzX2lkOiAlZFxuIiwgc2NzaWhvc3QsCisJICAgICAgIHNjc2lob3N0LT50aGlzX2lkKTsKKwlzY3NpX3JlbW92ZV9ob3N0KHNjc2lob3N0KTsKKworCURCR0lORigic3RvcHBpbmcgdGhyZWFkLlxuIik7CisJdWlzdGhyZWFkX3N0b3AoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbyk7CisKKwlEQkdJTkYoImNhbGxpbmcgc2NzaV9ob3N0X3B1dFxuIik7CisKKwkvKiBkZWNyIHJlZmNvdW50IG9uIHNjc2lob3N0IHdoaWNoIHdhcyBpbmNyZW1lbnRlZCBieQorCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKKwkgKi8KKwlzY3NpX2hvc3RfcHV0KHNjc2lob3N0KTsKKwlMT0dJTkYoInZpcnRoYmEgcmVtb3ZlZCBzY3NpX2hvc3QuXG4iKTsKK30KKworc3RhdGljIGludAorZm9yd2FyZF92ZGlza21nbXRfY29tbWFuZChWRElTS19NR01UX1RZUEVTIHZkaXNrY21kdHlwZSwKKwkJCSAgc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QsCisJCQkgIHN0cnVjdCB1aXNzY3NpX2Rlc3QgKnZkZXN0KQoreworCXN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcDsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbyA9CisJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwlpbnQgbm90aWZ5cmVzdWx0ID0gMHhmZmZmOworCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmeWV2ZW50OworCisJTE9HSU5GKCJ2RGlza01nbXQ6JWQgJWQ6JWQ6JWRcbiIsIHZkaXNrY21kdHlwZSwKKwkgICAgICAgdmRlc3QtPmNoYW5uZWwsIHZkZXN0LT5pZCwgdmRlc3QtPmx1bik7CisKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKKwkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwljbWRyc3AgPSBremFsbG9jKFNJWkVPRl9DTURSU1AsIEdGUF9BVE9NSUMpOworCWlmIChjbWRyc3AgPT0gTlVMTCkgeworCQlMT0dFUlIoImttYWxsb2Mgb2YgY21kcnNwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gRkFJTEVEOwkvKiByZWplY3QgKi8KKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZub3RpZnlldmVudCk7CisKKwkvKiBpc3N1ZSBWRElTS19NR01UX0NNRAorCSAqIHNldCB0eXBlIHRvIGNvbW1hbmQgLSBhcyBvcHBvc2VkIHRvIHRhc2sgbWdtdAorCSAqLworCWNtZHJzcC0+Y21kdHlwZSA9IENNRF9WRElTS01HTVRfVFlQRTsKKwkvKiBzcGVjaWZ5IHRoZSBldmVudCB0aGF0IGhhcyB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGlzIGNtZCBpcworCSAqIGNvbXBsZXRlCisJICovCisJY21kcnNwLT52ZGlza21nbXQubm90aWZ5ID0gKHZvaWQgKikgJm5vdGlmeWV2ZW50OworCWNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeXJlc3VsdCA9ICh2b2lkICopICZub3RpZnlyZXN1bHQ7CisKKwkvKiBzYXZlIGRlc3RpbmF0aW9uICovCisJY21kcnNwLT52ZGlza21nbXQudmRpc2t0eXBlID0gdmRpc2tjbWR0eXBlOworCWNtZHJzcC0+dmRpc2ttZ210LnZkZXN0LmNoYW5uZWwgPSB2ZGVzdC0+Y2hhbm5lbDsKKwljbWRyc3AtPnZkaXNrbWdtdC52ZGVzdC5pZCA9IHZkZXN0LT5pZDsKKwljbWRyc3AtPnZkaXNrbWdtdC52ZGVzdC5sdW4gPSB2ZGVzdC0+bHVuOworCWNtZHJzcC0+dmRpc2ttZ210LnNjc2ljbWQgPQorCSAgICAodm9pZCAqKSAodWludHB0cl90KQorCQlhZGRfc2NzaXBlbmRpbmdfZW50cnlfd2l0aF93YWl0KHZpcnRoYmFpbmZvLCBDTURfVkRJU0tNR01UX1RZUEUsCisJCQkJCQkodm9pZCAqKSBjbWRyc3ApOworCisJdWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLAorCQkJCQkgICAgIGNtZHJzcCwgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkJICAgICAmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLAorCQkJCQkgICAgIERPTlRfSVNTVUVfSU5URVJSVVBULCAoVTY0KSBOVUxMLAorCQkJCQkgICAgIE9LX1RPX1dBSVQsICJ2aGJhIik7CisJTE9HSU5GKCJWZGlza01nbXQgd2FpdGluZyBvbiBldmVudCBub3RpZnlldmVudD0weCVwXG4iLAorCSAgICAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCXdhaXRfZXZlbnQobm90aWZ5ZXZlbnQsIG5vdGlmeXJlc3VsdCAhPSAweGZmZmYpOworCUxPR0lORigiVmRpc2tNZ210IGNvbXBsZXRlOyByZXN1bHQ6JWRcbiIsIGNtZHJzcC0+dmRpc2ttZ210LnJlc3VsdCk7CisJa2ZyZWUoY21kcnNwKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2NzaSBIb3N0IHN1cHBvcnQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citmb3J3YXJkX3Rhc2ttZ210X2NvbW1hbmQoVEFTS19NR01UX1RZUEVTIHRhc2t0eXBlLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpCit7CisJc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwOworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvID0KKwkgICAgKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWRldi0+aG9zdC0+aG9zdGRhdGE7CisJaW50IG5vdGlmeXJlc3VsdCA9IDB4ZmZmZjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBub3RpZnlldmVudDsKKworCUxPR0lORigiVGFza01nbXQ6JWQgJWQ6JWQ6JWRcbiIsIHRhc2t0eXBlLAorCSAgICAgICBzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5pZCwgc2NzaWRldi0+bHVuKTsKKworCWlmICh2aXJ0aGJhaW5mby0+c2VydmVyZG93biB8fCB2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSkgeworCQlEQkdJTkYoIlNlcnZlciBpcyBkb3duL2NoYW5naW5nIHN0YXRlLiBSZXR1cm5pbmcgRmFpbHVyZS5cbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWNtZHJzcCA9IGt6YWxsb2MoU0laRU9GX0NNRFJTUCwgR0ZQX0FUT01JQyk7CisJaWYgKGNtZHJzcCA9PSBOVUxMKSB7CisJCUxPR0VSUigia21hbGxvYyBvZiBjbWRyc3AgZmFpbGVkLlxuIik7CisJCXJldHVybiBGQUlMRUQ7CS8qIHJlamVjdCAqLworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5vdGlmeWV2ZW50KTsKKworCS8qIGlzc3VlIFRBU0tfTUdNVF9BQk9SVF9UQVNLICovCisJLyogc2V0IHR5cGUgdG8gY29tbWFuZCAtIGFzIG9wcG9zZWQgdG8gdGFzayBtZ210ICovCisJY21kcnNwLT5jbWR0eXBlID0gQ01EX1NDU0lUQVNLTUdNVF9UWVBFOworCS8qIHNwZWNpZnkgdGhlIGV2ZW50IHRoYXQgaGFzIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoaXMgKi8KKwkvKiBjbWQgaXMgY29tcGxldGUgKi8KKwljbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkgPSAodm9pZCAqKSAmbm90aWZ5ZXZlbnQ7CisJY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5cmVzdWx0ID0gKHZvaWQgKikgJm5vdGlmeXJlc3VsdDsKKworCS8qIHNhdmUgZGVzdGluYXRpb24gKi8KKwljbWRyc3AtPnNjc2l0YXNrbWdtdC50YXNrdHlwZSA9IHRhc2t0eXBlOworCWNtZHJzcC0+c2NzaXRhc2ttZ210LnZkZXN0LmNoYW5uZWwgPSBzY3NpZGV2LT5jaGFubmVsOworCWNtZHJzcC0+c2NzaXRhc2ttZ210LnZkZXN0LmlkID0gc2NzaWRldi0+aWQ7CisJY21kcnNwLT5zY3NpdGFza21nbXQudmRlc3QubHVuID0gc2NzaWRldi0+bHVuOworCWNtZHJzcC0+c2NzaXRhc2ttZ210LnNjc2ljbWQgPQorCSAgICAodm9pZCAqKSAodWludHB0cl90KQorCQlhZGRfc2NzaXBlbmRpbmdfZW50cnlfd2l0aF93YWl0KHZpcnRoYmFpbmZvLAorCQkJCQkJQ01EX1NDU0lUQVNLTUdNVF9UWVBFLAorCQkJCQkJKHZvaWQgKikgY21kcnNwKTsKKworCXVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCh2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mbywKKwkJCQkJICAgICBjbWRyc3AsIElPQ0hBTl9UT19JT1BBUlQsCisJCQkJCSAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywKKwkJCQkJICAgICBET05UX0lTU1VFX0lOVEVSUlVQVCwgKFU2NCkgTlVMTCwKKwkJCQkJICAgICBPS19UT19XQUlULCAidmhiYSIpOworCUxPR0lORigiVGFza01nbXQgd2FpdGluZyBvbiBldmVudCBub3RpZnlldmVudD0weCVwXG4iLAorCSAgICAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCXdhaXRfZXZlbnQobm90aWZ5ZXZlbnQsIG5vdGlmeXJlc3VsdCAhPSAweGZmZmYpOworCUxPR0lORigiVGFza01nbXQgY29tcGxldGU7IHJlc3VsdDolZFxuIiwgY21kcnNwLT5zY3NpdGFza21nbXQucmVzdWx0KTsKKwlrZnJlZShjbWRyc3ApOworCXJldHVybiBTVUNDRVNTOworfQorCisvKiBUaGUgYWJvcnQgaGFuZGxlciByZXR1cm5zIFNVQ0NFU1MgaWYgaXQgaGFzIHN1Y2NlZWRlZCB0byBtYWtlIExMREQKKyAqIGFuZCBhbGwgcmVsYXRlZCBoYXJkd2FyZSBmb3JnZXQgYWJvdXQgdGhlIHNjbWQuCisgKi8KK3N0YXRpYyBpbnQKK3ZpcnRoYmFfYWJvcnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCS8qIGlzc3VlIFRBU0tfTUdNVF9BQk9SVF9UQVNLICovCisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2OworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICp2ZGlzazsKKworCXNjc2lkZXYgPSBzY3NpY21kLT5kZXZpY2U7CisJZm9yICh2ZGlzayA9ICYoKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWRldi0+aG9zdC0+aG9zdGRhdGEpLT5oZWFkOworCSAgICAgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKKwkJaWYgKChzY3NpZGV2LT5jaGFubmVsID09IHZkaXNrLT5jaGFubmVsKQorCQkgICAgJiYgKHNjc2lkZXYtPmlkID09IHZkaXNrLT5pZCkKKwkJICAgICYmIChzY3NpZGV2LT5sdW4gPT0gdmRpc2stPmx1bikpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmdmRpc2stPmVycm9yX2NvdW50KSA8CisJCQkgICAgVklSVEhCQV9FUlJPUl9DT1VOVCkgeworCQkJCWF0b21pY19pbmMoJnZkaXNrLT5lcnJvcl9jb3VudCk7CisJCQkJUE9TVENPREVfTElOVVhfMihWSEJBX0NPTU1BTkRfSEFORExFUl9QQywKKwkJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwkJCX0gZWxzZQorCQkJCWF0b21pY19zZXQoJnZkaXNrLT5pb3NfdGhyZXNob2xkLAorCQkJCQkgICBJT1NfRVJST1JfVEhSRVNIT0xEKTsKKwkJfQorCX0KKwlyZXR1cm4gZm9yd2FyZF90YXNrbWdtdF9jb21tYW5kKFRBU0tfTUdNVF9BQk9SVF9UQVNLLCBzY3NpY21kLT5kZXZpY2UpOworfQorCitzdGF0aWMgaW50Cit2aXJ0aGJhX2J1c19yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpCit7CisJLyogaXNzdWUgVEFTS19NR01UX1RBUkdFVF9SRVNFVCBmb3IgZWFjaCB0YXJnZXQgb24gdGhlIGJ1cyAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldjsKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisKKwlzY3NpZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWZvciAodmRpc2sgPSAmKChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkgICAgIHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCA9PSB2ZGlzay0+Y2hhbm5lbCkKKwkJICAgICYmIChzY3NpZGV2LT5pZCA9PSB2ZGlzay0+aWQpCisJCSAgICAmJiAoc2NzaWRldi0+bHVuID09IHZkaXNrLT5sdW4pKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPAorCQkJICAgIFZJUlRIQkFfRVJST1JfQ09VTlQpIHsKKwkJCQlhdG9taWNfaW5jKCZ2ZGlzay0+ZXJyb3JfY291bnQpOworCQkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DT01NQU5EX0hBTkRMRVJfUEMsCisJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCQl9IGVsc2UKKwkJCQlhdG9taWNfc2V0KCZ2ZGlzay0+aW9zX3RocmVzaG9sZCwKKwkJCQkJICAgSU9TX0VSUk9SX1RIUkVTSE9MRCk7CisJCX0KKwl9CisJcmV0dXJuIGZvcndhcmRfdGFza21nbXRfY29tbWFuZChUQVNLX01HTVRfQlVTX1JFU0VULCBzY3NpY21kLT5kZXZpY2UpOworfQorCitzdGF0aWMgaW50Cit2aXJ0aGJhX2RldmljZV9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpCit7CisJLyogaXNzdWUgVEFTS19NR01UX0xVTl9SRVNFVCAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldjsKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisKKwlzY3NpZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWZvciAodmRpc2sgPSAmKChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkgICAgIHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCA9PSB2ZGlzay0+Y2hhbm5lbCkKKwkJICAgICYmIChzY3NpZGV2LT5pZCA9PSB2ZGlzay0+aWQpCisJCSAgICAmJiAoc2NzaWRldi0+bHVuID09IHZkaXNrLT5sdW4pKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPAorCQkJICAgIFZJUlRIQkFfRVJST1JfQ09VTlQpIHsKKwkJCQlhdG9taWNfaW5jKCZ2ZGlzay0+ZXJyb3JfY291bnQpOworCQkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DT01NQU5EX0hBTkRMRVJfUEMsCisJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCQl9IGVsc2UKKwkJCQlhdG9taWNfc2V0KCZ2ZGlzay0+aW9zX3RocmVzaG9sZCwKKwkJCQkJICAgSU9TX0VSUk9SX1RIUkVTSE9MRCk7CisJCX0KKwl9CisJcmV0dXJuIGZvcndhcmRfdGFza21nbXRfY29tbWFuZChUQVNLX01HTVRfTFVOX1JFU0VULCBzY3NpY21kLT5kZXZpY2UpOworfQorCitzdGF0aWMgaW50Cit2aXJ0aGJhX2hvc3RfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCS8qIGlzc3VlIFRBU0tfTUdNVF9UQVJHRVRfUkVTRVQgZm9yIGVhY2ggdGFyZ2V0IG9uIGVhY2ggYnVzIGZvciBob3N0ICovCisJTE9HRVJSKCJ2aXJ0aGJhX2hvc3RfcmVzZXRfaGFuZGxlciBOb3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGNoYXIgdmlydGhiYV9nZXRfaW5mb19zdHJbMjU2XTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgordmlydGhiYV9nZXRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHApCit7CisJLyogUmV0dXJuIHZlcnNpb24gc3RyaW5nICovCisJc3ByaW50Zih2aXJ0aGJhX2dldF9pbmZvX3N0ciwgInZpcnRoYmEsIHZlcnNpb24gJXNcbiIsIFZJUlRIQkFfVkVSU0lPTik7CisJcmV0dXJuIHZpcnRoYmFfZ2V0X2luZm9fc3RyOworfQorCitzdGF0aWMgaW50Cit2aXJ0aGJhX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCURCR0lORigiSW4gdmlydGhiYV9pb2N0bDogaW9jdGw6IGNtZD0weCV4XG4iLCBjbWQpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBUaGlzIHJldHVybnMgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZIGlmIHRoZSBzaWduYWwgcXVldWUgdG8gSU9wYXJ0CisgKiBpcyBmdWxsLgorICovCitzdGF0aWMgaW50Cit2aXJ0aGJhX3F1ZXVlX2NvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQsCisJCQkgIHZvaWQgKCp2aXJ0aGJhX2NtbmRfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYgPSBzY3NpY21kLT5kZXZpY2U7CisJaW50IGluc2VydF9sb2NhdGlvbjsKKwl1bnNpZ25lZCBjaGFyIG9wOworCXVuc2lnbmVkIGNoYXIgKmNkYiA9IHNjc2ljbWQtPmNtbmQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QgPSBzY3NpZGV2LT5ob3N0OworCXN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbyA9CisJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9IE5VTEw7CisJaW50IHNnX2ZhaWxlZCA9IDA7CisKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKKwkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWS5cbiIpOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOworCX0KKworCWNtZHJzcCA9IGt6YWxsb2MoU0laRU9GX0NNRFJTUCwgR0ZQX0FUT01JQyk7CisJaWYgKGNtZHJzcCA9PSBOVUxMKSB7CisJCUxPR0VSUigia21hbGxvYyBvZiBjbWRyc3AgZmFpbGVkLlxuIik7CisJCXJldHVybiAxOwkvKiByZWplY3QgdGhlIGNvbW1hbmQgKi8KKwl9CisKKwkvKiBub3cgc2F2aW5nIGV2ZXJ5dGhpbmcgd2UgbmVlZCBmcm9tIHNjc2lfY21kIGludG8gY21kcnNwCisJICogYmVmb3JlIHdlIHF1ZXVlIGNtZHJzcCBzZXQgdHlwZSB0byBjb21tYW5kIC0gYXMgb3Bwb3NlZCB0bworCSAqIHRhc2sgbWdtdAorCSAqLworCWNtZHJzcC0+Y21kdHlwZSA9IENNRF9TQ1NJX1RZUEU7CisJLyogc2F2ZSB0aGUgcGVuZGluZyBpbnNlcnRpb24gbG9jYXRpb24uICBEZWxldGlvbiBmcm9tIHBlbmRpbmcKKwkgKiB3aWxsIHJldHVybiB0aGUgc2NzaWNtZCBwb2ludGVyIGZvciBjb21wbGV0aW9uCisJICovCisJaW5zZXJ0X2xvY2F0aW9uID0KKwkgICAgYWRkX3Njc2lwZW5kaW5nX2VudHJ5KHZpcnRoYmFpbmZvLCBDTURfU0NTSV9UWVBFLCAodm9pZCAqKSBzY3NpY21kKTsKKwlpZiAoaW5zZXJ0X2xvY2F0aW9uICE9IC0xKSB7CisJCWNtZHJzcC0+c2NzaS5zY3NpY21kID0gKHZvaWQgKikgKHVpbnRwdHJfdCkgaW5zZXJ0X2xvY2F0aW9uOworCX0gZWxzZSB7CisJCUxPR0VSUigiUXVldWUgaXMgZnVsbC4gUmV0dXJuaW5nIGJ1c3kuXG4iKTsKKwkJa2ZyZWUoY21kcnNwKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKKwl9CisJLyogc2F2ZSBkb25lIGZ1bmN0aW9uIHRoYXQgd2UgaGF2ZSBjYWxsIHdoZW4gY21kIGlzIGNvbXBsZXRlICovCisJc2NzaWNtZC0+c2NzaV9kb25lID0gdmlydGhiYV9jbW5kX2RvbmU7CisJLyogc2F2ZSBkZXN0aW5hdGlvbiAqLworCWNtZHJzcC0+c2NzaS52ZGVzdC5jaGFubmVsID0gc2NzaWRldi0+Y2hhbm5lbDsKKwljbWRyc3AtPnNjc2kudmRlc3QuaWQgPSBzY3NpZGV2LT5pZDsKKwljbWRyc3AtPnNjc2kudmRlc3QubHVuID0gc2NzaWRldi0+bHVuOworCS8qIHNhdmUgZGF0YWRpciAqLworCWNtZHJzcC0+c2NzaS5kYXRhX2RpciA9IHNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCW1lbWNweShjbWRyc3AtPnNjc2kuY21uZCwgY2RiLCBNQVhfQ01ORF9TSVpFKTsKKworCWNtZHJzcC0+c2NzaS5idWZmbGVuID0gc2NzaV9idWZmbGVuKHNjc2ljbWQpOworCisJLyoga2VlcCB0cmFjayBvZiB0aGUgbWF4IGJ1ZmZlciBsZW5ndGggc28gZmFyLiAqLworCWlmIChjbWRyc3AtPnNjc2kuYnVmZmxlbiA+IE1heEJ1ZmZMZW4pCisJCU1heEJ1ZmZMZW4gPSBjbWRyc3AtPnNjc2kuYnVmZmxlbjsKKworCWlmIChzY3NpX3NnX2NvdW50KHNjc2ljbWQpID4gTUFYX1BIWVNfSU5GTykgeworCQlMT0dFUlIoInNjc2ljbWQgdXNlX3NnOiVkIGdyZWF0ZXIgdGhhbiBNQVg6JWRcbiIsCisJCSAgICAgICBzY3NpX3NnX2NvdW50KHNjc2ljbWQpLCBNQVhfUEhZU19JTkZPKTsKKwkJZGVsX3Njc2lwZW5kaW5nX2VudHJ5KHZpcnRoYmFpbmZvLCAodWludHB0cl90KSBpbnNlcnRfbG9jYXRpb24pOworCQlrZnJlZShjbWRyc3ApOworCQlyZXR1cm4gMTsJLyogcmVqZWN0IHRoZSBjb21tYW5kICovCisJfQorCisJLyogVGhpcyBpcyB3aGF0IHdlIFVTRUQgdG8gZG8gd2hlbiB3ZSBhc3N1bWVkIHdlIHdlcmUgcnVubmluZyAqLworCS8qIHVpc3NkICYgdmlydGhiYSBvbiB0aGUgc2FtZSBMaW51eCBzeXN0ZW0uICovCisJLyogY21kcnNwLT5zY3NpLmJ1ZmZlciA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOyAqLworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBkb2VzIE5PVCBtYWtlIHRoYXQgYXNzdW1wdGlvbi4gKi8KKwkvKiBjb252ZXJ0IGJ1ZmZlciB0byBwaHlzIGluZm9ybWF0aW9uICovCisJaWYgKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0gMCkgeworCQlpZiAoc2NzaV9idWZmbGVuKHNjc2ljbWQpID4gMCkgeworCQkJTE9HRVJSKCIqKioqIEZBSUxFRCBObyBzY2F0dGVyIGxpc3QgZm9yIGJ1ZmZsZW4gPiAwXG4iKTsKKwkJCUJVR19PTihzY3NpX3NnX2NvdW50KHNjc2ljbWQpID09IDApOworCQl9CisJCURCR0lORigiTm8gc2c7IGJ1ZmZlcjoweCVwIGJ1ZmZsZW46JWRcbiIsCisJCSAgICAgICBzY3NpX3NnbGlzdChzY3NpY21kKSwgc2NzaV9idWZmbGVuKHNjc2ljbWQpKTsKKwl9IGVsc2UgeworCQkvKiBidWZmZXIgaXMgc2NhdHRlcmxpc3QgLSBjb3B5IGl0IG91dCAqLworCQlzZ2wgPSBzY3NpX3NnbGlzdChzY3NpY21kKTsKKworCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzY3NpX3NnX2NvdW50KHNjc2ljbWQpLCBpKSB7CisKKwkJCWNtZHJzcC0+c2NzaS5ncGlfbGlzdFtpXS5hZGRyZXNzID0gc2dfcGh5cyhzZyk7CisJCQljbWRyc3AtPnNjc2kuZ3BpX2xpc3RbaV0ubGVuZ3RoID0gc2ctPmxlbmd0aDsKKwkJCWlmICgoaSAhPSAwKSAmJiAoc2ctPm9mZnNldCAhPSAwKSkKKwkJCQlMT0dJTkYoIk9mZnNldCBvbiBhIHNnX2VudHJ5IG90aGVyIHRoYW4gemVybyA9PDwlZD4+LlxuIiwKKwkJCQkgICAgIHNnLT5vZmZzZXQpOworCQl9CisKKwkJaWYgKHNnX2ZhaWxlZCkgeworCQkJTE9HRVJSKCJTdGFydCBzZ19saXN0IGR1bXAgKGVudHJpZXMgJWQsIGJ1ZmZsZW4gJWQpLi4uXG4iLAorCQkJICAgICBzY3NpX3NnX2NvdW50KHNjc2ljbWQpLCBjbWRyc3AtPnNjc2kuYnVmZmxlbik7CisJCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzY3NpX3NnX2NvdW50KHNjc2ljbWQpLCBpKSB7CisJCQkJTE9HRVJSKCIgICBFbnRyeSglZCk6IHBhZ2UtPlsweCVwXSwgcGh5cy0+WzB4JUx4XSwgb2ZmKCVkKSwgbGVuKCVkKVxuIiwKKwkJCQkgICAgIGksIHNnX3BhZ2Uoc2cpLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2dfcGh5cyhzZyksCisJCQkJICAgICBzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoKTsKKwkJCX0KKwkJCUxPR0VSUigiRG9uZSBzZ19saXN0IGR1bXAuXG4iKTsKKwkJCS8qIEJVRygpOyAqKioqKiBGb3Igbm93LCBsZXQgaXQgZmFpbCBpbiB1aXNzZAorCQkJICogaWYgaXQgaXMgYSBwcm9ibGVtLCBhcyBpdCBtaWdodCBqdXN0CisJCQkgKiB3b3JrCisJCQkgKi8KKwkJfQorCisJCWNtZHJzcC0+c2NzaS5ndWVzdF9waHlzX2VudHJpZXMgPSBzY3NpX3NnX2NvdW50KHNjc2ljbWQpOworCX0KKworCW9wID0gY2RiWzBdOworCWkgPSB1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQodmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8sCisJCQkJCQkgY21kcnNwLCBJT0NIQU5fVE9fSU9QQVJULAorCQkJCQkJICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLgorCQkJCQkJIGluc2VydGxvY2ssCisJCQkJCQkgRE9OVF9JU1NVRV9JTlRFUlJVUFQsCisJCQkJCQkgKFU2NCkgTlVMTCwgRE9OVF9XQUlULCAidmhiYSIpOworCWlmIChpID09IDApIHsKKwkJLyogcXVldWUgbXVzdCBiZSBmdWxsIC0gYW5kIHdlIHNhaWQgZG9uJ3Qgd2FpdCAtIHJldHVybiBidXN5ICovCisJCUxPR0VSUigidWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2sgKioqKkZBSUxFRFxuIik7CisJCWtmcmVlKGNtZHJzcCk7CisJCWRlbF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgKHVpbnRwdHJfdCkgaW5zZXJ0X2xvY2F0aW9uKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKKwl9CisKKwkvKiB3ZSdyZSBkb25lIHdpdGggY21kcnNwIHNwYWNlIC0gZGF0YSBmcm9tIGl0IGhhcyBiZWVuIGNvcGllZAorCSAqIGludG8gY2hhbm5lbCAtIGZyZWUgaXQgbm93LgorCSAqLworCWtmcmVlKGNtZHJzcCk7CisJcmV0dXJuIDA7CQkvKiBub24temVybyBpbXBsaWVzIGhvc3QvZGV2aWNlIGlzIGJ1c3kgKi8KK30KKworc3RhdGljIGludAordmlydGhiYV9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpCit7CisJLyogdGhpcyBjYWxsZWQgYnkgdGhlIG1pZGxheWVyIGJlZm9yZSBzY2FuIGZvciBuZXcgZGV2aWNlcyAtCisJICogTExEIGNhbiBhbGxvYyBhbnkgc3RydWMgJiBkbyBpbml0IGlmIG5lZWRlZC4KKwkgKi8KKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnRtcHZkaXNrOworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKikgc2NzaWRldi0+aG9zdDsKKworCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWhvc3QtPmhvc3RkYXRhOworCWlmICghdmlydGhiYWluZm8pIHsKKwkJTE9HRVJSKCJDb3VsZCBub3QgZmluZCB2aXJ0aGJhX2luZm8gZm9yIHNjc2lob3N0XG4iKTsKKwkJcmV0dXJuIDA7CS8qIGV2ZW4gdGhvdWdoIHdlIGVycm9yZWQsIHRyZWF0IGFzIHN1Y2Nlc3MgKi8KKwl9CisJZm9yICh2ZGlzayA9ICZ2aXJ0aGJhaW5mby0+aGVhZDsgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKKwkJaWYgKHZkaXNrLT5uZXh0LT52YWxpZCAmJgorCQkgICAgKHZkaXNrLT5uZXh0LT5jaGFubmVsID09IHNjc2lkZXYtPmNoYW5uZWwpICYmCisJCSAgICAodmRpc2stPm5leHQtPmlkID09IHNjc2lkZXYtPmlkKSAmJgorCQkgICAgKHZkaXNrLT5uZXh0LT5sdW4gPT0gc2NzaWRldi0+bHVuKSkKKwkJCXJldHVybiAwOworCX0KKwl0bXB2ZGlzayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXJ0ZGlza19pbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0bXB2ZGlzaykgewkvKiBlcnJvciBhbGxvY2F0aW5nICovCisJCUxPR0VSUigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGlza1xuIik7CisJCXJldHVybiAwOworCX0KKworCXRtcHZkaXNrLT5jaGFubmVsID0gc2NzaWRldi0+Y2hhbm5lbDsKKwl0bXB2ZGlzay0+aWQgPSBzY3NpZGV2LT5pZDsKKwl0bXB2ZGlzay0+bHVuID0gc2NzaWRldi0+bHVuOworCXRtcHZkaXNrLT52YWxpZCA9IDE7CisJdmRpc2stPm5leHQgPSB0bXB2ZGlzazsKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KK30KKworc3RhdGljIGludAordmlydGhiYV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KQoreworCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgdm9pZAordmlydGhiYV9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldikKK3sKKwkvKiBtaWRsZXZlbCBjYWxscyB0aGlzIGFmdGVyIGRldmljZSBoYXMgYmVlbiBxdWllc2NlZCBhbmQKKwkgKiBiZWZvcmUgaXQgaXMgdG8gYmUgZGVsZXRlZC4KKwkgKi8KKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2ssICpkZWx2ZGlzazsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopIHNjc2lkZXYtPmhvc3Q7CisKKwl2aXJ0aGJhaW5mbyA9IChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwlpZiAoIXZpcnRoYmFpbmZvKQorCQlMT0dFUlIoIkNvdWxkIG5vdCBmaW5kIHZpcnRoYmFfaW5mbyBmb3Igc2NzaWhvc3RcbiIpOworCWZvciAodmRpc2sgPSAmdmlydGhiYWluZm8tPmhlYWQ7IHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICh2ZGlzay0+bmV4dC0+dmFsaWQgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+Y2hhbm5lbCA9PSBzY3NpZGV2LT5jaGFubmVsKSAmJgorCQkgICAgKHZkaXNrLT5uZXh0LT5pZCA9PSBzY3NpZGV2LT5pZCkgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+bHVuID09IHNjc2lkZXYtPmx1bikpIHsKKwkJCWRlbHZkaXNrID0gdmRpc2stPm5leHQ7CisJCQl2ZGlzay0+bmV4dCA9IHZkaXNrLT5uZXh0LT5uZXh0OworCQkJa2ZyZWUoZGVsdmRpc2spOworCQkJcmV0dXJuOworCQl9CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2NzaSBDbW5kIHN1cHBvcnQgdGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZG9fc2NzaV9saW51eHN0YXQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICp2ZGlzazsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXY7CisJc3RydWN0IHNlbnNlX2RhdGEgKnNkOworCisJc2NzaWRldiA9IHNjc2ljbWQtPmRldmljZTsKKwltZW1jcHkoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyLCBjbWRyc3AtPnNjc2kuc2Vuc2VidWYsIE1BWF9TRU5TRV9TSVpFKTsKKwlzZCA9IChzdHJ1Y3Qgc2Vuc2VfZGF0YSAqKSBzY3NpY21kLT5zZW5zZV9idWZmZXI7CisKKwkvKiBEbyBub3QgbG9nIGVycm9ycyBmb3IgZGlzay1ub3QtcHJlc2VudCBpbnF1aXJpZXMgKi8KKwlpZiAoKGNtZHJzcC0+c2NzaS5jbW5kWzBdID09IElOUVVJUlkpICYmCisJICAgIChob3N0X2J5dGUoY21kcnNwLT5zY3NpLmxpbnV4c3RhdCkgPT0gRElEX05PX0NPTk5FQ1QpICYmCisJICAgIChjbWRyc3AtPnNjc2kuYWRkbHN0YXQgPT0gQURETF9TRUxfVElNRU9VVCkpCisJCXJldHVybjsKKworCS8qIE9rYXkgc2VlIHdoYXQgb3VyIGVycm9yX2NvdW50IGlzIGhlcmUuLi4uICovCisJZm9yICh2ZGlzayA9ICYoKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWRldi0+aG9zdC0+aG9zdGRhdGEpLT5oZWFkOworCSAgICAgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKKwkJaWYgKChzY3NpZGV2LT5jaGFubmVsICE9IHZkaXNrLT5jaGFubmVsKQorCQkgICAgfHwgKHNjc2lkZXYtPmlkICE9IHZkaXNrLT5pZCkKKwkJICAgIHx8IChzY3NpZGV2LT5sdW4gIT0gdmRpc2stPmx1bikpCisJCQljb250aW51ZTsKKworCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPCBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7CisJCQlhdG9taWNfaW5jKCZ2ZGlzay0+ZXJyb3JfY291bnQpOworCQkJTE9HRVJSKCJTQ1NJQ01EICoqKipGQUlMRUQgc2NzaWNtZDoweCVwIG9wOjB4JXggPCVkOiVkOiVkOiVkPiAweCV4LTB4JXgtMHgleC0weCV4LTB4JXguXG4iLAorCQkJICAgICAgIHNjc2ljbWQsIGNtZHJzcC0+c2NzaS5jbW5kWzBdLAorCQkJICAgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAorCQkJICAgICAgIHNjc2lkZXYtPmNoYW5uZWwsIHNjc2lkZXYtPmx1biwKKwkJCSAgICAgICBjbWRyc3AtPnNjc2kubGludXhzdGF0LCBzZC0+VmFsaWQsIHNkLT5TZW5zZUtleSwKKwkJCSAgICAgICBzZC0+QWRkaXRpb25hbFNlbnNlQ29kZSwKKwkJCSAgICAgICBzZC0+QWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllcik7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPT0KKwkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7CisJCQkJTE9HRVJSKCJUaHJvdGxpbmcgU0NTSUNNRCBlcnJvcnMgZGlzayA8JWQ6JWQ6JWQ6JWQ+XG4iLAorCQkJCSAgICAgc2NzaWRldi0+aG9zdC0+aG9zdF9ubywgc2NzaWRldi0+aWQsCisJCQkJICAgICBzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5sdW4pOworCQkJfQorCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsIElPU19FUlJPUl9USFJFU0hPTEQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorZG9fc2NzaV9ub2xpbnV4c3RhdChzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2OworCXVuc2lnbmVkIGNoYXIgYnVmWzM2XTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKnRoaXNwYWdlOworCWNoYXIgKnRoaXNwYWdlX29yaWc7CisJaW50IGJ1ZmluZCA9IDA7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCisJc2NzaWRldiA9IHNjc2ljbWQtPmRldmljZTsKKwlpZiAoKGNtZHJzcC0+c2NzaS5jbW5kWzBdID09IElOUVVJUlkpCisJICAgICYmIChjbWRyc3AtPnNjc2kuYnVmZmxlbiA+PSBNSU5fSU5RVUlSWV9SRVNVTFRfTEVOKSkgeworCQlpZiAoY21kcnNwLT5zY3NpLm5vX2Rpc2tfcmVzdWx0ID09IDApCisJCQlyZXR1cm47CisKKwkJLyogTGludXggc2NzaSBjb2RlIGlzIHdlaXJkOyBpdCB3YW50cworCQkgKiBhIGRldmljZSBhdCBMdW4gMCB0byBpc3N1ZSByZXBvcnQKKwkJICogbHVucywgYnV0IHdlIGRvbid0IHdhbnQgYSBkaXNrCisJCSAqIHRoZXJlIHNvIHdlJ2xsIHByZXNlbnQgYSBwcm9jZXNzb3IKKwkJICogdGhlcmUuICovCisJCVNFVF9OT19ESVNLX0lOUVVJUllfUkVTVUxUKGJ1ZiwgY21kcnNwLT5zY3NpLmJ1ZmZsZW4sCisJCQkJCSAgIHNjc2lkZXYtPmx1biwKKwkJCQkJICAgREVWX0RJU0tfQ0FQQUJMRV9OT1RfUFJFU0VOVCwKKwkJCQkJICAgREVWX05PVF9DQVBBQkxFKTsKKworCQlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKSB7CisJCQlpZiAoc2NzaV9idWZmbGVuKHNjc2ljbWQpID4gMCkgeworCQkJCUxPR0VSUigiKioqKiBGQUlMRUQgTm8gc2NhdHRlciBsaXN0IGZvciBidWZmbGVuID4gMFxuIik7CisJCQkJQlVHX09OKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0KKwkJCQkgICAgICAgMCk7CisJCQl9CisJCQltZW1jcHkoc2NzaV9zZ2xpc3Qoc2NzaWNtZCksIGJ1ZiwKKwkJCSAgICAgICBjbWRyc3AtPnNjc2kuYnVmZmxlbik7CisJCQlyZXR1cm47CisJCX0KKworCQlzZyA9IHNjc2lfc2dsaXN0KHNjc2ljbWQpOworCQlmb3IgKGkgPSAwOyBpIDwgc2NzaV9zZ19jb3VudChzY3NpY21kKTsgaSsrKSB7CisJCQlEQkdWRVIoImNvcHlpbmcgT1VUIE9GIGJ1ZiBpbnRvIDB4JXAgJWRcbiIsCisJCQkgICAgIHNnX3BhZ2Uoc2cgKyBpKSwgc2dbaV0ubGVuZ3RoKTsKKwkJCXRoaXNwYWdlX29yaWcgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnICsgaSkpOworCQkJdGhpc3BhZ2UgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpdGhpc3BhZ2Vfb3JpZyB8CisJCQkJCSAgICAgc2dbaV0ub2Zmc2V0KTsKKwkJCW1lbWNweSh0aGlzcGFnZSwgYnVmICsgYnVmaW5kLCBzZ1tpXS5sZW5ndGgpOworCQkJa3VubWFwX2F0b21pYyh0aGlzcGFnZV9vcmlnKTsKKwkJCWJ1ZmluZCArPSBzZ1tpXS5sZW5ndGg7CisJCX0KKwl9IGVsc2UgeworCisJCXZkaXNrID0gJigoc3RydWN0IHZpcnRoYmFfaW5mbyAqKXNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkJZm9yICggOyB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQkJaWYgKChzY3NpZGV2LT5jaGFubmVsICE9IHZkaXNrLT5jaGFubmVsKQorCQkJICAgIHx8IChzY3NpZGV2LT5pZCAhPSB2ZGlzay0+aWQpCisJCQkgICAgfHwgKHNjc2lkZXYtPmx1biAhPSB2ZGlzay0+bHVuKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+aW9zX3RocmVzaG9sZCkgPiAwKSB7CisJCQkJYXRvbWljX2RlYygmdmRpc2stPmlvc190aHJlc2hvbGQpOworCQkJCWlmIChhdG9taWNfcmVhZCgmdmRpc2stPmlvc190aHJlc2hvbGQpID09IDApIHsKKwkJCQkJTE9HRVJSKCJSZXNldHRpbmcgZXJyb3IgY291bnQgZm9yIGRpc2tcbiIpOworCQkJCQlhdG9taWNfc2V0KCZ2ZGlzay0+ZXJyb3JfY291bnQsIDApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2NvbXBsZXRlX3Njc2lfY29tbWFuZChzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpCit7CisJREJHSU5GKCJjbWRyc3A6IDB4JXAsIHNjc2lzdGF0OjB4JXguXG4iLCBjbWRyc3AsIGNtZHJzcC0+c2NzaS5zY3Npc3RhdCk7CisKKwkvKiB0YWtlIHdoYXQgd2UgbmVlZCBvdXQgb2YgY21kcnNwIGFuZCBjb21wbGV0ZSB0aGUgc2NzaWNtZCAqLworCXNjc2ljbWQtPnJlc3VsdCA9IGNtZHJzcC0+c2NzaS5saW51eHN0YXQ7CisJaWYgKGNtZHJzcC0+c2NzaS5saW51eHN0YXQpCisJCWRvX3Njc2lfbGludXhzdGF0KGNtZHJzcCwgc2NzaWNtZCk7CisJZWxzZQorCQlkb19zY3NpX25vbGludXhzdGF0KGNtZHJzcCwgc2NzaWNtZCk7CisKKwlpZiAoc2NzaWNtZC0+c2NzaV9kb25lKSB7CisJCURCR1ZFUigiU2NzaV9ET05FXG4iKTsKKwkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitjb21wbGV0ZV92ZGlza21nbXRfY29tbWFuZChzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3ApCit7CisJLyogY29weSB0aGUgcmVzdWx0IG9mIHRoZSB0YXNrbWdtdCBhbmQgKi8KKwkvKiB3YWtlIHVwIHRoZSBlcnJvciBoYW5kbGVyIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhpcyAqLworCSooaW50ICopIGNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeXJlc3VsdCA9IGNtZHJzcC0+dmRpc2ttZ210LnJlc3VsdDsKKwl3YWtlX3VwX2FsbCgod2FpdF9xdWV1ZV9oZWFkX3QgKikgY21kcnNwLT52ZGlza21nbXQubm90aWZ5KTsKKwlMT0dJTkYoInNldCBub3RpZnkgcmVzdWx0IHRvICVkXG4iLCBjbWRyc3AtPnZkaXNrbWdtdC5yZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NvbXBsZXRlX3Rhc2ttZ210X2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwKQoreworCS8qIGNvcHkgdGhlIHJlc3VsdCBvZiB0aGUgdGFza21nbXQgYW5kICovCisJLyogd2FrZSB1cCB0aGUgZXJyb3IgaGFuZGxlciB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoaXMgKi8KKwkqKGludCAqKSBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnlyZXN1bHQgPQorCSAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5yZXN1bHQ7CisJd2FrZV91cF9hbGwoKHdhaXRfcXVldWVfaGVhZF90ICopIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CisJTE9HSU5GKCJzZXQgbm90aWZ5IHJlc3VsdCB0byAlZFxuIiwgY21kcnNwLT5zY3NpdGFza21nbXQucmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQKK2RyYWluX3F1ZXVlKHN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvLCBzdHJ1Y3QgY2hhbmluZm8gKmRjLAorCQlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcXJzbHQgPSAwOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB2aXJ0aGJhaW5mby0+c2NzaWhvc3Q7CisKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLCBmbGFncyk7CisJCWlmICghVUxUUkFfQ0hBTk5FTF9DTElFTlRfQUNRVUlSRV9PUyhkYy0+cXVldWVpbmZvLT5jaGFuLAorCQkJCQkJICAgICAidmhiYSIsIE5VTEwpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLmluc2VydGxvY2ssCisJCQkJCSAgICAgICBmbGFncyk7CisJCQl2aXJ0aGJhaW5mby0+YWNxdWlyZV9mYWlsZWRfY250Kys7CisJCQlicmVhazsKKwkJfQorCQlxcnNsdCA9IHVpc3F1ZXVlX2dldF9jbWRyc3AoZGMtPnF1ZXVlaW5mbywgY21kcnNwLAorCQkJCQkgICAgSU9DSEFOX0ZST01fSU9QQVJUKTsKKwkJVUxUUkFfQ0hBTk5FTF9DTElFTlRfUkVMRUFTRV9PUyhkYy0+cXVldWVpbmZvLT5jaGFuLAorCQkJCQkJInZoYmEiLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLCBmbGFncyk7CisJCWlmIChxcnNsdCA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChjbWRyc3AtPmNtZHR5cGUgPT0gQ01EX1NDU0lfVFlQRSkgeworCQkJLyogc2NzaWNtZCBsb2NhdGlvbiBpcyByZXR1cm5lZCBieSB0aGUKKwkJCSAqIGRlbGV0aW9uCisJCQkgKi8KKwkJCXNjc2ljbWQgPSBkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sCisJCQkJCSh1aW50cHRyX3QpIGNtZHJzcC0+c2NzaS5zY3NpY21kKTsKKwkJCWlmICghc2NzaWNtZCkKKwkJCQlicmVhazsKKwkJCS8qIGNvbXBsZXRlIHRoZSBvcmlnIGNtZCAqLworCQkJY29tcGxldGVfc2NzaV9jb21tYW5kKGNtZHJzcCwgc2NzaWNtZCk7CisJCX0gZWxzZSBpZiAoY21kcnNwLT5jbWR0eXBlID09IENNRF9TQ1NJVEFTS01HTVRfVFlQRSkgeworCQkJaWYgKCFkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sCisJCQkJICAgKHVpbnRwdHJfdCkgY21kcnNwLT5zY3NpdGFza21nbXQuc2NzaWNtZCkpCisJCQkJYnJlYWs7CisJCQljb21wbGV0ZV90YXNrbWdtdF9jb21tYW5kKGNtZHJzcCk7CisJCX0gZWxzZSBpZiAoY21kcnNwLT5jbWR0eXBlID09IENNRF9OT1RJRllHVUVTVF9UWVBFKSB7CisJCQkvKiBUaGUgdkhiYSBwb2ludGVyIGhhcyBubyBtZWFuaW5nIGluCisJCQkgKiBhIENsaWVudC9HdWVzdCBQYXJ0aXRpb24uIExldCdzIGJlCisJCQkgKiBzYWZlIGFuZCBzZXQgaXQgdG8gTlVMTCBub3cuICBEbworCQkJICogbm90IHVzZSBpdCBoZXJlISAqLworCQkJY21kcnNwLT5kaXNrbm90aWZ5LnZIYmEgPSBOVUxMOworCQkJcHJvY2Vzc19kaXNrX25vdGlmeShzaG9zdCwgY21kcnNwKTsKKwkJfSBlbHNlIGlmIChjbWRyc3AtPmNtZHR5cGUgPT0gQ01EX1ZESVNLTUdNVF9UWVBFKSB7CisJCQlpZiAoIWRlbF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywKKwkJCQkgICAodWludHB0cl90KSBjbWRyc3AtPnZkaXNrbWdtdC5zY3NpY21kKSkKKwkJCQlicmVhazsKKwkJCWNvbXBsZXRlX3ZkaXNrbWdtdF9jb21tYW5kKGNtZHJzcCk7CisJCX0gZWxzZQorCQkJTE9HRVJSKCJJbnZhbGlkIGNtZHR5cGUgJWRcbiIsIGNtZHJzcC0+Y21kdHlwZSk7CisJCS8qIGNtZHJzcCBpcyBub3cgYXZhaWxhYmxlIGZvciByZXVzZSAqLworCX0KK30KKworCisvKiBtYWluIGZ1bmN0aW9uIGZvciB0aGUgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIHNjc2kgY29tbWFuZHMgdG8gYXJyaXZlCisgKiBpbiBhIHNwZWNpZmllZCBxdWV1ZQorICovCitzdGF0aWMgaW50Citwcm9jZXNzX2luY29taW5nX3JzcHModm9pZCAqdikKK3sKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbyA9IHY7CisJc3RydWN0IGNoYW5pbmZvICpkYyA9ICZ2aXJ0aGJhaW5mby0+Y2hpbmZvOworCXN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCA9IE5VTEw7CisJY29uc3QgaW50IFNaID0gc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3ApOworCVU2NCBtYXNrOworCXVuc2lnbmVkIGxvbmcgbG9uZyByYzE7CisKKwlVSVNfREFFTU9OSVpFKCJ2aGJhX2luY29taW5nIik7CisJLyogYWxsb2Mgb25jZSBhbmQgcmV1c2UgKi8KKwljbWRyc3AgPSBrbWFsbG9jKFNaLCBHRlBfQVRPTUlDKTsKKwlpZiAoY21kcnNwID09IE5VTEwpIHsKKwkJTE9HRVJSKCJwcm9jZXNzX2luY29taW5nX3JzcHMgKioqKkZBSUxFRCB0byBtYWxsb2MgLSB0aHJlYWQgZXhpdGluZ1xuIik7CisJCWNvbXBsZXRlX2FuZF9leGl0KCZkYy0+dGhyZWFkaW5mby5oYXNfc3RvcHBlZCwgMCk7CisJCXJldHVybiAwOworCX0KKwltYXNrID0gVUxUUkFfQ0hBTk5FTF9FTkFCTEVfSU5UUzsKKwl3aGlsZSAoMSkgeworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh2aXJ0aGJhaW5mby0+cnNwX3F1ZXVlLAorCQkJIChhdG9taWNfcmVhZCgmdmlydGhiYWluZm8tPmludGVycnVwdF9yY3ZkKSA9PSAxKSwKKwkJCQkJIHVzZWNzX3RvX2ppZmZpZXMocnNsdHFfd2FpdF91c2VjcykpOworCQlhdG9taWNfc2V0KCZ2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3JjdmQsIDApOworCQkvKiBkcmFpbiBxdWV1ZSAqLworCQlkcmFpbl9xdWV1ZSh2aXJ0aGJhaW5mbywgZGMsIGNtZHJzcCk7CisJCXJjMSA9IHVpc3F1ZXVlX0ludGVybG9ja2VkT3IodmlydGhiYWluZm8tPmZsYWdzX2FkZHIsIG1hc2spOworCQlpZiAoZGMtPnRocmVhZGluZm8uc2hvdWxkX3N0b3ApCisJCQlicmVhazsKKwl9CisKKwlrZnJlZShjbWRyc3ApOworCisJREJHSU5GKCJleGl0aW5nIHByb2Nlc3NpbmcgaW5jb21pbmcgcnNwcy5cbiIpOworCWNvbXBsZXRlX2FuZF9leGl0KCZkYy0+dGhyZWFkaW5mby5oYXNfc3RvcHBlZCwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2MgZmlsZXN5c3RlbSBmdW5jdGlvbnMJCQkJCQkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QKK2luZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwlVNjQgcGh5c19mbGFnc19hZGRyOworCWludCBpOworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworCWNoYXIgKnZidWY7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zID4gMCB8fCAhbGVuKQorCQlyZXR1cm4gMDsKKworCXZidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBWSVJUSEJBU09QRU5NQVg7IGkrKykgeworCQlpZiAoVmlydEhiYXNPcGVuW2ldLnZpcnRoYmFpbmZvID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQl2aXJ0aGJhaW5mbyA9IFZpcnRIYmFzT3BlbltpXS52aXJ0aGJhaW5mbzsKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIkNIQU5TT0NLIGlzIG5vdCBkZWZpbmVkLlxuIik7CisKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIk1heEJ1ZmZMZW46JWRcbiIsIE1heEJ1ZmZMZW4pOworCisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJcbnZpcnRoYmEgcmVzdWx0IHF1ZXVlIHBvbGwgd2FpdDolZCB1c2Vjcy5cbiIsCisJCQkJICByc2x0cV93YWl0X3VzZWNzKTsKKworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLAorCQkJCSAgIlxuTW9kdWxlIGJ1aWxkOiBEYXRlOiVzIFRpbWU6JXNcbiIsCisJCQkJICBfX0RBVEVfXywgX19USU1FX18pOworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG5pbnRlcnJ1cHRzX3JjdmQgPSAlbGx1LCBpbnRlcnJ1cHRzX2Rpc2FibGVkID0gJWxsdVxuIiwKKwkJCQkgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRzX3JjdmQsCisJCQkJICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19kaXNhYmxlZCk7CisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJcbmludGVycnVwdHNfbm90bWUgPSAlbGx1LFxuIiwKKwkJCQkgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRzX25vdG1lKTsKKwkJcGh5c19mbGFnc19hZGRyID0gdmlydF90b19waHlzKChfX2ZvcmNlICB2b2lkICopCisJCQkJCSAgICAgICB2aXJ0aGJhaW5mby0+ZmxhZ3NfYWRkcik7CisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJmbGFnc19hZGRyID0gJXAsIHBoeXNfZmxhZ3NfYWRkcj0weCUwMTZsbHgsIEZlYXR1cmVGbGFncz0lbGx1XG4iLAorCQkJICB2aXJ0aGJhaW5mby0+ZmxhZ3NfYWRkciwgcGh5c19mbGFnc19hZGRyLAorCQkJCSAgKF9fbGU2NClyZWFkcSh2aXJ0aGJhaW5mby0+ZmxhZ3NfYWRkcikpOworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiYWNxdWlyZV9mYWlsZWRfY250OiVsbHVcbiIsCisJCQkJICB2aXJ0aGJhaW5mby0+YWNxdWlyZV9mYWlsZWRfY250KTsKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuIik7CisJfQorCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB2YnVmLCBsZW5ndGgpKSB7CisJCWtmcmVlKHZidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZSh2YnVmKTsKKwkqb2Zmc2V0ICs9IGxlbmd0aDsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgc3NpemVfdAorZW5hYmxlX2ludHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2VuYWJsZV9pbnRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzRdOworCWludCBpLCBuZXdfdmFsdWU7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm87CisJVTY0IF9faW9tZW0gKkZlYXR1cmVzX2FkZHI7CisJVTY0IG1hc2s7CisKKwlpZiAoY291bnQgPj0gQVJSQVlfU0laRShidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1Zltjb3VudF0gPSAnXDAnOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgZmFpbGVkLiBidWY8PCUuKnM+PiBjb3VudDw8JWx1Pj5cbiIsCisJCSAgICAgICAoaW50KSBjb3VudCwgYnVmLCBjb3VudCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWkgPSBzc2NhbmYoYnVmLCAiJWQiLCAmbmV3X3ZhbHVlKTsKKworCWlmIChpIDwgMSkgeworCQlMT0dFUlIoIkZhaWxlZCB0byBzY2FuIHZhbHVlIGZvciBlbmFibGVfaW50cywgYnVmPDwlLipzPj4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIHNldCBhbGwgY291bnRzIHRvIG5ld192YWx1ZSB1c3VhbGx5IDAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVklSVEhCQVNPUEVOTUFYOyBpKyspIHsKKwkJaWYgKFZpcnRIYmFzT3BlbltpXS52aXJ0aGJhaW5mbyAhPSBOVUxMKSB7CisJCQl2aXJ0aGJhaW5mbyA9IFZpcnRIYmFzT3BlbltpXS52aXJ0aGJhaW5mbzsKKwkJCUZlYXR1cmVzX2FkZHIgPQorCQkJCSZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+RmVhdHVyZXM7CisJCQlpZiAobmV3X3ZhbHVlID09IDEpIHsKKwkJCQltYXNrID0gfihVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcgfAorCQkJCQkgVUxUUkFfSU9fRFJJVkVSX0RJU0FCTEVTX0lOVFMpOworCQkJCXVpc3F1ZXVlX0ludGVybG9ja2VkQW5kKEZlYXR1cmVzX2FkZHIsIG1hc2spOworCQkJCW1hc2sgPSBVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTOworCQkJCXVpc3F1ZXVlX0ludGVybG9ja2VkT3IoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCQkJcnNsdHFfd2FpdF91c2VjcyA9IDQwMDAwMDA7CisJCQl9IGVsc2UgeworCQkJCW1hc2sgPSB+KFVMVFJBX0lPX0RSSVZFUl9FTkFCTEVTX0lOVFMgfAorCQkJCQkgVUxUUkFfSU9fRFJJVkVSX0RJU0FCTEVTX0lOVFMpOworCQkJCXVpc3F1ZXVlX0ludGVybG9ja2VkQW5kKEZlYXR1cmVzX2FkZHIsIG1hc2spOworCQkJCW1hc2sgPSBVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkc7CisJCQkJdWlzcXVldWVfSW50ZXJsb2NrZWRPcihGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJCQlyc2x0cV93YWl0X3VzZWNzID0gNDAwMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitycXd1X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzE2XTsKKwlpbnQgaSwgdXNlY3M7CisKKwlpZiAoY291bnQgPj0gQVJSQVlfU0laRShidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgZmFpbGVkLiBidWY8PCUuKnM+PiBjb3VudDw8JWx1Pj5cbiIsCisJCSAgICAgICAoaW50KSBjb3VudCwgYnVmLCBjb3VudCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWkgPSBzc2NhbmYoYnVmLCAiJWQiLCAmdXNlY3MpOworCisJaWYgKGkgPCAxKSB7CisJCUxPR0VSUigiRmFpbGVkIHRvIHNjYW4gdmFsdWUgZm9yIHJxd2FpdF91c2VjcyBidWY8PCUuKnM+PiIsCisJCSAgICAgICAoaW50KSBjb3VudCwgYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogc2V0IGdsb2JhbCB3YWl0IHRpbWUgKi8KKwlyc2x0cV93YWl0X3VzZWNzID0gdXNlY3M7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBBcyBwZXIgVmlydHBjaUZ1bmMgcmV0dXJucyAxIGZvciBzdWNjZXNzIGFuZCAwIGZvciBmYWlsdXJlICovCitzdGF0aWMgaW50Cit2aXJ0aGJhX3NlcnZlcnVwKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldikKK3sKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbyA9CisJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopICgoc3RydWN0IFNjc2lfSG9zdCAqKSB2aXJ0cGNpZGV2LT5zY3NpLgorCQkJCSAgICAgc2NzaWhvc3QpLT5ob3N0ZGF0YTsKKworCURCR0lORigidmlydHBjaWRldiBidXNObzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzTm8sCisJICAgICAgIHZpcnRwY2lkZXYtPmRldmljZU5vKTsKKworCWlmICghdmlydGhiYWluZm8tPnNlcnZlcmRvd24pIHsKKwkJREJHSU5GKCJTZXJ2ZXIgdXAgbWVzc2FnZSByZWNpZXZlZCB3aGlsZSBzZXJ2ZXIgaXMgYWxyZWFkeSB1cC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCUxPR0VSUigiU2VydmVyIGFscmVhZHkgcHJvY2Vzc2luZyBjaGFuZ2Ugc3RhdGUgbWVzc2FnZVxuIik7CisJCXJldHVybiAwOworCX0KKworCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gdHJ1ZTsKKwkvKiBNdXN0IHRyYW5zaXRpb24gY2hhbm5lbCB0byBBVFRBQ0hFRCBzdGF0ZSBCRUZPUkUgd2UKKwkgKiBjYW4gc3RhcnQgdXNpbmcgdGhlIGRldmljZSBhZ2FpbgorCSAqLworCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04odmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW4sCisJCQkJCWRldl9uYW1lKCZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldiksCisJCQkJCUNIQU5ORUxDTElfQVRUQUNIRUQsIE5VTEwpOworCisJLyogU3RhcnQgUHJvY2Vzc2luZyB0aGUgSU9WTSBSZXNwb25zZSBRdWV1ZSBBZ2FpbiAqLworCWlmICghdWlzdGhyZWFkX3N0YXJ0KCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8sCisJCQkgICAgIHByb2Nlc3NfaW5jb21pbmdfcnNwcywKKwkJCSAgICAgdmlydGhiYWluZm8sICJ2aGJhX2luY29taW5nIikpIHsKKwkJTE9HRVJSKCJ1aXN0aHJlYWRfc3RhcnQgcnNwICoqKipGQUlMRURcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJdmlydGhiYWluZm8tPnNlcnZlcmRvd24gPSBmYWxzZTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IGZhbHNlOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit2aXJ0aGJhX3NlcnZlcmRvd25fY29tcGxldGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldjsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaXBlbmRpbmcgKnBlbmRpbmdkZWwgPSBOVUxMOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQgPSBOVUxMOworCXN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdmlydGhiYWluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZpcnRoYmFfaW5mbywKKwkJCQkgICBzZXJ2ZXJkb3duX2NvbXBsZXRpb24pOworCisJLyogU3RvcCBVc2luZyB0aGUgSU9WTSBSZXNwb25zZSBRdWV1ZSAocXVldWUgc2hvdWxkIGJlIGRyYWluZWQKKwkgKiBieSB0aGUgZW5kKQorCSAqLworCXVpc3RocmVhZF9zdG9wKCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8pOworCisJLyogRmFpbCBDb21tYW5kcyB0aGF0IHdlcmVuJ3QgY29tcGxldGVkICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnRoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUEVORElOR19SRVFVRVNUUzsgaSsrKSB7CisJCXBlbmRpbmdkZWwgPSAmKHZpcnRoYmFpbmZvLT5wZW5kaW5nW2ldKTsKKwkJc3dpdGNoIChwZW5kaW5nZGVsLT5jbWR0eXBlKSB7CisJCWNhc2UgQ01EX1NDU0lfVFlQRToKKwkJCXNjc2ljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBwZW5kaW5nZGVsLT5zZW50OworCQkJc2NzaWNtZC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCQlpZiAoc2NzaWNtZC0+c2NzaV9kb25lKQorCQkJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9TQ1NJVEFTS01HTVRfVFlQRToKKwkJCWNtZHJzcCA9IChzdHJ1Y3QgdWlzY21kcnNwICopIHBlbmRpbmdkZWwtPnNlbnQ7CisJCQlEQkdJTkYoImNtZHJzcD0weCV4LCBub3RpZnk9MHgleFxuIiwgY21kcnNwLAorCQkJICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CisJCQkqKGludCAqKSBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnlyZXN1bHQgPQorCQkJICAgIFRBU0tfTUdNVF9GQUlMRUQ7CisJCQl3YWtlX3VwX2FsbCgod2FpdF9xdWV1ZV9oZWFkX3QgKikKKwkJCQkgICAgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5KTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9WRElTS01HTVRfVFlQRToKKwkJCWNtZHJzcCA9IChzdHJ1Y3QgdWlzY21kcnNwICopIHBlbmRpbmdkZWwtPnNlbnQ7CisJCQkqKGludCAqKSBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnlyZXN1bHQgPQorCQkJICAgIFZESVNLX01HTVRfRkFJTEVEOworCQkJd2FrZV91cF9hbGwoKHdhaXRfcXVldWVfaGVhZF90ICopCisJCQkJICAgIGNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChwZW5kaW5nZGVsLT5zZW50ICE9IE5VTEwpCisJCQkJTE9HRVJSKCJVbmtub3duIGNvbW1hbmQgdHlwZTogMHgleC4gIE9ubHkgZnJlZWluZyBsaXN0IHN0cnVjdHVyZS5cbiIsCisJCQkJICAgICBwZW5kaW5nZGVsLT5jbWR0eXBlKTsKKwkJfQorCQlwZW5kaW5nZGVsLT5jbWR0eXBlID0gMDsKKwkJcGVuZGluZ2RlbC0+c2VudCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpcnRoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCisJdmlydHBjaWRldiA9IHZpcnRoYmFpbmZvLT52aXJ0cGNpZGV2OworCisJREJHSU5GKCJ2aXJ0cGNpZGV2IGJ1c05vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNObywKKwkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlTm8pOworCXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duID0gdHJ1ZTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IGZhbHNlOworCS8qIFJldHVybiB0aGUgU2VydmVyRG93biByZXNwb25zZSB0byBDb21tYW5kICovCisJdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSh2aXJ0cGNpZGV2LT5idXNObywKKwkJCQkJICAgdmlydHBjaWRldi0+ZGV2aWNlTm8sIDApOworfQorCisvKiBBcyBwZXIgVmlydHBjaUZ1bmMgcmV0dXJucyAxIGZvciBzdWNjZXNzIGFuZCAwIGZvciBmYWlsdXJlICovCitzdGF0aWMgaW50Cit2aXJ0aGJhX3NlcnZlcmRvd24oc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSAoKHN0cnVjdCBTY3NpX0hvc3QgKikgdmlydHBjaWRldi0+c2NzaS4KKwkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CisKKwlEQkdJTkYoInZpcnRoYmFfc2VydmVyZG93biIpOworCURCR0lORigidmlydHBjaWRldiBidXNObzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzTm8sCisJICAgICAgIHZpcnRwY2lkZXYtPmRldmljZU5vKTsKKworCWlmICghdmlydGhiYWluZm8tPnNlcnZlcmRvd24gJiYgIXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gdHJ1ZTsKKwkJcXVldWVfd29yayh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlLAorCQkJICAgJnZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duX2NvbXBsZXRpb24pOworCX0gZWxzZSBpZiAodmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKKwkJTE9HRVJSKCJTZXJ2ZXIgYWxyZWFkeSBwcm9jZXNzaW5nIGNoYW5nZSBzdGF0ZSBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCUxPR0VSUigiU2VydmVyIGFscmVhZHkgZG93biwgYnV0IGFub3RoZXIgc2VydmVyIGRvd24gbWVzc2FnZSByZWNlaXZlZC4iKTsKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgSW5pdCAmIEV4aXQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0Cit2aXJ0aGJhX3BhcnNlX2xpbmUoY2hhciAqc3RyKQoreworCURCR0lORigiSW4gdmlydGhiYV9wYXJzZV9saW5lICVzXG4iLCBzdHIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK3ZpcnRoYmFfcGFyc2Vfb3B0aW9ucyhjaGFyICpsaW5lKQoreworCWNoYXIgKm5leHQgPSBsaW5lOworCisJUE9TVENPREVfTElOVVhfMihWSEJBX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKGxpbmUgPT0gTlVMTCB8fCAhKmxpbmUpCisJCXJldHVybjsKKwl3aGlsZSAoKGxpbmUgPSBuZXh0KSAhPSBOVUxMKSB7CisJCW5leHQgPSBzdHJjaHIobGluZSwgJyAnKTsKKwkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCSpuZXh0KysgPSAwOworCQlpZiAoIXZpcnRoYmFfcGFyc2VfbGluZShsaW5lKSkKKwkJCURCR0lORigiVW5rbm93biBvcHRpb24gJyVzJ1xuIiwgbGluZSk7CisJfQorCisJUE9TVENPREVfTElOVVhfMihWSEJBX0NSRUFURV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3ZpcnRoYmFfbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJaW50IGk7CisKKwlMT0dJTkYoIkVudGVyaW5nIHZpcnRoYmFfbW9kX2luaXQuLi5cbiIpOworCisJUE9TVENPREVfTElOVVhfMihWSEJBX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJdmlydGhiYV9wYXJzZV9vcHRpb25zKHZpcnRoYmFfb3B0aW9ucyk7CisKKwllcnJvciA9IHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2aXJ0aGJhX2RyaXZlcik7CisJaWYgKGVycm9yIDwgMCkgeworCQlMT0dFUlIoInJlZ2lzdGVyICoqKipGQUlMRUQgMHgleFxuIiwgZXJyb3IpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsIGVycm9yLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCX0gZWxzZSB7CisJCS8qIGNyZWF0ZSB0aGUgcHJvYyBkaXJlY3RvcmllcyAqLworCQl2aXJ0aGJhX3Byb2NfZGlyID0gcHJvY19ta2RpcihESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisJCWluZm9fcHJvY19lbnRyeSA9IHByb2NfY3JlYXRlKElORk9fUFJPQ19FTlRSWV9GTiwgMCwKKwkJCQkJICAgICAgdmlydGhiYV9wcm9jX2RpciwKKwkJCQkJICAgICAgJnByb2NfaW5mb19mb3BzKTsKKwkJcnF3YWl0dXNfcHJvY19lbnRyeSA9IHByb2NfY3JlYXRlKFJRV1VfUFJPQ19FTlRSWV9GTiwgMCwKKwkJCQkJCSAgdmlydGhiYV9wcm9jX2RpciwKKwkJCQkJCSAgJnByb2NfcnF3dV9mb3BzKTsKKwkJZW5hYmxlX2ludHNfcHJvY19lbnRyeSA9IHByb2NfY3JlYXRlKEVOQUJMRV9JTlRTX0VOVFJZX0ZOLCAwLAorCQkJCQkJICAgICB2aXJ0aGJhX3Byb2NfZGlyLAorCQkJCQkJICAgICAmcHJvY19lbmFibGVfaW50c19mb3BzKTsKKworCQkvKiBJbml0aWFsaXplIERBUldvcmtRICovCisJCUlOSVRfV09SSygmREFSV29ya1EsIGRvRGlza0FkZFJlbW92ZSk7CisJCXNwaW5fbG9ja19pbml0KCZEQVJXb3JrUUxvY2spOworCisJCS8qIGNsZWFyIG91dCBhcnJheSAqLworCQlmb3IgKGkgPSAwOyBpIDwgVklSVEhCQVNPUEVOTUFYOyBpKyspCisJCQlWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm8gPSBOVUxMOworCQkvKiBJbml0aWFsaXplIHRoZSBzZXJ2ZXJkb3duIHdvcmtxdWV1ZSAqLworCQl2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlID0KKwkJICAgIGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ2aXJ0aGJhX3NlcnZlcmRvd24iKTsKKwkJaWYgKHZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUgPT0gTlVMTCkgeworCQkJTE9HRVJSKCIqKioqIEZBSUxFRCB2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlIGNyZWF0aW9uXG4iKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQllcnJvciA9IC0xOworCQl9CisJfQorCisJUE9TVENPREVfTElOVVhfMihWSEJBX0NSRUFURV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlMT0dJTkYoIkxlYXZpbmcgdmlydGhiYV9tb2RfaW5pdFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3NpemVfdAordmlydGhiYV9hY3F1aXJlX2x1bihzdHJ1Y3QgZGV2aWNlICpjZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlpbnQgaTsKKworCWkgPSBzc2NhbmYoYnVmLCAiJWQtJWQtJWQiLCAmdmRlc3QuY2hhbm5lbCwgJnZkZXN0LmlkLCAmdmRlc3QubHVuKTsKKwlpZiAoaSAhPSAzKQorCQlyZXR1cm4gaTsKKworCXJldHVybiBmb3J3YXJkX3ZkaXNrbWdtdF9jb21tYW5kKFZESVNLX01HTVRfQUNRVUlSRSwgc2hvc3QsICZ2ZGVzdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit2aXJ0aGJhX3JlbGVhc2VfbHVuKHN0cnVjdCBkZXZpY2UgKmNkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCWludCBpOworCisJaSA9IHNzY2FuZihidWYsICIlZC0lZC0lZCIsICZ2ZGVzdC5jaGFubmVsLCAmdmRlc3QuaWQsICZ2ZGVzdC5sdW4pOworCWlmIChpICE9IDMpCisJCXJldHVybiBpOworCisJcmV0dXJuIGZvcndhcmRfdmRpc2ttZ210X2NvbW1hbmQoVkRJU0tfTUdNVF9SRUxFQVNFLCBzaG9zdCwgJnZkZXN0KTsKK30KKworI2RlZmluZSBDTEFTU19ERVZJQ0VfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgXAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGNsYXNzX2RldmljZV9hdHRyXyMjX25hbWUgPSAgIFwKKwkJX19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkKKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGFjcXVpcmVfbHVuLCBTX0lXVVNSLCBOVUxMLCB2aXJ0aGJhX2FjcXVpcmVfbHVuKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihyZWxlYXNlX2x1biwgU19JV1VTUiwgTlVMTCwgdmlydGhiYV9yZWxlYXNlX2x1bik7CisKK3N0YXRpYyBERVZJQ0VfQVRUUklCVVRFICp2aXJ0aGJhX3Nob3N0X2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX2FjcXVpcmVfbHVuLAorCSZjbGFzc19kZXZpY2VfYXR0cl9yZWxlYXNlX2x1biwKKwlOVUxMCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQKK3ZpcnRoYmFfbW9kX2V4aXQodm9pZCkKK3sKKwlMT0dJTkYoImVudGVyaW5nIHZpcnRoYmFfbW9kX2V4aXQuLi5cbiIpOworCisJdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGhiYV9kcml2ZXIpOworCS8qIHVucmVnaXN0ZXIgaXMgZ29pbmcgdG8gY2FsbCB2aXJ0aGJhX3JlbW92ZSAqLworCS8qIGRlc3Ryb3kgc2VydmVyZG93biBjb21wbGV0aW9uIHdvcmtxdWV1ZSAqLworCWlmICh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlKSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUpOworCQl2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlID0gTlVMTDsKKwl9CisKKwlpZiAoaW5mb19wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShJTkZPX1BST0NfRU5UUllfRk4sIHZpcnRoYmFfcHJvY19kaXIpOworCisJaWYgKHJxd2FpdHVzX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFJRV1VfUFJPQ19FTlRSWV9GTiwgTlVMTCk7CisKKwlpZiAoZW5hYmxlX2ludHNfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRU5BQkxFX0lOVFNfRU5UUllfRk4sIE5VTEwpOworCisJaWYgKHZpcnRoYmFfcHJvY19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKworCUxPR0lORigiTGVhdmluZyB2aXJ0aGJhX21vZF9leGl0XG4iKTsKKworfQorCisvKiBzcGVjaWZ5IGZ1bmN0aW9uIHRvIGJlIHJ1biBhdCBtb2R1bGUgaW5zZXJ0aW9uIHRpbWUgKi8KK21vZHVsZV9pbml0KHZpcnRoYmFfbW9kX2luaXQpOworCisvKiBzcGVjaWZ5IGZ1bmN0aW9uIHRvIGJlIHJ1biB3aGVuIG1vZHVsZSBpcyByZW1vdmVkICovCittb2R1bGVfZXhpdCh2aXJ0aGJhX21vZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVXNoYSBTcmluaXZhc2FuIik7CitNT0RVTEVfQUxJQVMoInVpc3ZpcnRoYmEiKTsKKwkvKiB0aGlzIGlzIGV4dHJhY3RlZCBkdXJpbmcgZGVwbW9kIGFuZCBrZXB0IGluIG1vZHVsZXMuZGVwICovCisvKiBtb2R1bGUgcGFyYW1ldGVyICovCittb2R1bGVfcGFyYW0odmlydGhiYV9vcHRpb25zLCBjaGFycCwgU19JUlVHTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI3OTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuaApAQCAtMCwwICsxLDMxIEBACisvKiB2aXJ0aGJhLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBVbmlzeXMgVmlydHVhbCBIQkEgZHJpdmVyIGhlYWRlcgorICovCisKKworCisjaWZuZGVmIF9fVklSVEhCQV9IX18KKyNkZWZpbmUgX19WSVJUSEJBX0hfXworCisKKyNkZWZpbmUgVklSVEhCQV9WRVJTSU9OICIwMS4wMCIKKworCisjZW5kaWYgLyogX19WSVJUSEJBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTllZmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBVbmlzeXMgdmlydHBjaSBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVklSVFBDSQorCXRyaXN0YXRlICJVbmlzeXMgdmlydHBjaSBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19VSVNMSUIKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpcnRwY2kgZHJpdmVyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzOTlhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjCisjIE1ha2VmaWxlIGZvciBVbmlzeXMgdmlydHBjaQorIworCitvYmotJChDT05GSUdfVU5JU1lTX1ZJUlRQQ0kpCSs9IHZpcnRwY2kubworCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS92aXJ0cGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzQ2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5jCkBAIC0wLDAgKzEsMTc3MSBAQAorLyogdmlydHBjaS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2lmZGVmIENPTkZJR19NT0RWRVJTSU9OUworI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisjaW5jbHVkZSAidmJ1c2NoYW5uZWwuaCIKKyNpbmNsdWRlICJ2YnVzaGVscGVyLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJndWVzdGxpbnV4ZGVidWcuaCIKKworc3RydWN0IGRyaXZlcl9wcml2YXRlIHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCBrbGlzdCBrbGlzdF9kZXZpY2VzOworCXN0cnVjdCBrbGlzdF9ub2RlIGtub2RlX2J1czsKKwlzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKm1rb2JqOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7Cit9OworI2RlZmluZSB0b19kcml2ZXIob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUsIGtvYmopCisKKy8qIGJ1c19pZCB3ZW50IGF3YXkgaW4gMi42LjMwIC0gdGhlIHNpemUgd2FzIDIwIGJ5dGVzLCBzbyB3ZSdsbCBkZWZpbmUKKyAqIGl0IG91cnNlbHZlcywgYW5kIGEgbWFjcm8gdG8gbWFrZSBnZXR0aW5nIHRoZSBmaWVsZCBhIGJpdCBzaW1wbGVyLgorICovCisjaWZuZGVmIEJVU19JRF9TSVpFCisjZGVmaW5lIEJVU19JRF9TSVpFIDIwCisjZW5kaWYKKworI2RlZmluZSBCVVNfSUQoeCkgZGV2X25hbWUoeCkKKworI2luY2x1ZGUgInZpcnRwY2kuaCIKKworLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgorICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcworICovCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVJUX1BDSV9QQ192aXJ0cGNpX2MKKyNkZWZpbmUgX19NWUZJTEVfXyAidmlydHBjaS5jIgorCisjZGVmaW5lIFZJUlRQQ0lfVkVSU0lPTiAiMDEuMDAiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBkZWxldGVfdmJ1c19kZXZpY2Uoc3RydWN0IGRldmljZSAqdmJ1cywgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IG1hdGNoX2J1c2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCB2aXJ0cGNpX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB2aXJ0cGNpX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX2FkZChzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsIGludCBkZXZ0eXBlLAorCQkJICAgICAgc3RydWN0IGFkZF92aXJ0X2d1ZXN0cGFydCAqYWRkcGFyYW1zLAorCQkJICAgICAgc3RydWN0IHNjc2lfYWRhcF9pbmZvICpzY3NpLAorCQkJICAgICAgc3RydWN0IG5ldF9hZGFwX2luZm8gKm5ldCk7CitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX2RlbChzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsIGludCBkZXZ0eXBlLAorCQkJICAgICAgc3RydWN0IHZoYmFfd3dubiAqd3dubiwgdW5zaWduZWQgY2hhciBtYWNhZGRyW10pOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9zZXJ2ZXJkb3duKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywgaW50IGRldnR5cGUsCisJCQkJICAgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCSAgICAgdW5zaWduZWQgY2hhciBtYWNhZGRyW10pOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9zZXJ2ZXJ1cChzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsIGludCBkZXZ0eXBlLAorCQkJCSAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sCisJCQkJICAgdW5zaWduZWQgY2hhciBtYWNhZGRyW10pOworc3RhdGljIHNzaXplX3QgdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3QgdmlydHBjaV9kcml2ZXJfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgaW50IHZpcnRwY2lfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydik7CitzdGF0aWMgaW50IHZpcnRwY2lfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBzc2l6ZV90IHZpcnRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY192aXJ0X2ZvcHMgPSB7CisJLndyaXRlID0gdmlydF9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19pbmZvX2ZvcHMgPSB7CisJLnJlYWQgPSBpbmZvX3Byb2NfcmVhZCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdsb2JhbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbWV0aG9kcyBpbiBidXNfdHlwZSBzdHJ1Y3QgYWxsb3cgdGhlIGJ1cyBjb2RlIHRvIHNlcnZlIGFzIGFuCisgKiBpbnRlcm1lZGlhcnkgYmV0d2VlbiB0aGUgZGV2aWNlIGNvcmUgYW5kIGluZGl2aWR1YWwgZGV2aWNlIGNvcmUgYW5kCisgKiBpbmRpdmlkdWFsIGRyaXZlcnMKKyAqLworc3RhdGljIHN0cnVjdCBidXNfdHlwZSB2aXJ0cGNpX2J1c190eXBlID0geworCS5uYW1lID0gInVpc3ZpcnRwY2kiLAorCS5tYXRjaCA9IHZpcnRwY2lfYnVzX21hdGNoLAorCS51ZXZlbnQgPSB2aXJ0cGNpX3VldmVudCwKKwkuc3VzcGVuZCA9IHZpcnRwY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZSA9IHZpcnRwY2lfZGV2aWNlX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIHZpcnRwY2lfcm9vdGJ1c19kZXZpY2UgPSB7CisJLmluaXRfbmFtZSA9ICJ2YnVzcm9vdCIsCS8qIHJvb3QgYnVzICovCisJLnJlbGVhc2UgPSB2aXJ0cGNpX2J1c19yZWxlYXNlCit9OworCisvKiBmaWxsZWQgaW4gd2l0aCBpbmZvIGFib3V0IHBhcmVudCBjaGlwc2V0IGRyaXZlciB3aGVuIHdlIHJlZ2lzdGVyIHdpdGggaXQgKi8KK3N0YXRpYyBVTFRSQV9WQlVTX0RFVklDRUlORk8gQ2hpcHNldF9Ecml2ZXJJbmZvOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyB2aXJ0cGNpX2RyaXZlcl9zeXNmc19vcHMgPSB7CisJLnNob3cgPSB2aXJ0cGNpX2RyaXZlcl9hdHRyX3Nob3csCisJLnN0b3JlID0gdmlydHBjaV9kcml2ZXJfYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHZpcnRwY2lfZHJpdmVyX2tvYmpfdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJnZpcnRwY2lfZHJpdmVyX3N5c2ZzX29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlydHBjaV9kZXYgKlZwY2lkZXZMaXN0SGVhZDsKK3N0YXRpYyBERUZJTkVfUldMT0NLKFZwY2lkZXZMaXN0TG9jayk7CisKKy8qIGZpbGxlZCBpbiB3aXRoIGluZm8gYWJvdXQgdGhpcyBkcml2ZXIsIHdydCBpdCBzZXJ2aWNpbmcgY2xpZW50IGJ1c3NlcyAqLworc3RhdGljIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyBCdXNfRHJpdmVySW5mbzsKKworLyogdmlydHBjaV9wcm9jX2Rpcl9lbnRyeSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvYyBlbnRyeSBkaXJlY3RvcnkKKyAqIGZvciB2aXJ0cGNpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZpcnRwY2lfcHJvY19kaXI7CisvKiB2aXJ0X3Byb2NfZW50cnkgaXMgdXNlZCB0byB0ZWxsIHZpcnRwY2kgdG8gYWRkL2RlbGV0ZSB2aGJhcy92bmljcy92YnVzZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZpcnRfcHJvY19lbnRyeTsKKy8qIGluZm9fcHJvY19lbnRyeSBpcyB1c2VkIHRvIHRlbGwgdmlydHBjaSB0byBkaXNwbGF5IGN1cnJlbnQgaW5mbworICoga2VwdCBpbiB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmluZm9fcHJvY19lbnRyeTsKKyNkZWZpbmUgVklSVF9QUk9DX0VOVFJZX0ZOICJ2aXJ0IgorI2RlZmluZSBJTkZPX1BST0NfRU5UUllfRk4gImluZm8iCisjZGVmaW5lIERJUl9QUk9DX0VOVFJZICJ2aXJ0cGNpIgorCitzdHJ1Y3QgdmlydHBjaV9idXNkZXYgeworCXN0cnVjdCBkZXZpY2UgdmlydHBjaV9idXNfZGV2aWNlOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lCitpbnQgV0FJVF9GT1JfSU9fQ0hBTk5FTChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gICpjaGFucHRyKQoreworCWludCBjb3VudCA9IDEyMDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisKKwkJaWYgKFVMVFJBX0NIQU5ORUxfU0VSVkVSX1JFQURZKCZjaGFucHRyLT5DaGFubmVsSGVhZGVyKSkKKwkJCXJldHVybiAxOworCQlVSVNfVEhSRUFEX1dBSVRfU0VDKDEpOworCQljb3VudC0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MLkNocEluZm8uICovCitzdGF0aWMgaW50IHdyaXRlX3ZidXNfY2hwSW5mbyhVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgKmNoYW4sCisJCQkgICAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmluZm8pCit7CisJaW50IG9mZjsKKwlpZiAoIWNoYW4pIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvZmYgPSBzaXplb2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCkgKyBjaGFuLT5IZHJJbmZvLmNocEluZm9CeXRlT2Zmc2V0OworCWlmIChjaGFuLT5IZHJJbmZvLmNocEluZm9CeXRlT2Zmc2V0ID09IDApIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHVzZWQsIGJlY2F1c2UgY2hwSW5mb0J5dGVPZmZzZXQgPT0gMCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweSgoKFU4ICopIChjaGFuKSkgKyBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOworCXJldHVybiAwOworfQorCisvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZSBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wuQnVzSW5mby4gKi8KK3N0YXRpYyBpbnQgd3JpdGVfdmJ1c19idXNJbmZvKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCAqY2hhbiwKKwkJCSAgICAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqaW5mbykKK3sKKwlpbnQgb2ZmOworCWlmICghY2hhbikgeworCQlMT0dFUlIoInZidXMgY2hhbm5lbCBub3QgcHJlc2VudCIpOworCQlyZXR1cm4gLTE7CisJfQorCW9mZiA9IHNpemVvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MKSArIGNoYW4tPkhkckluZm8uYnVzSW5mb0J5dGVPZmZzZXQ7CisJaWYgKGNoYW4tPkhkckluZm8uYnVzSW5mb0J5dGVPZmZzZXQgPT0gMCkgeworCQlMT0dFUlIoInZidXMgY2hhbm5lbCBub3QgdXNlZCwgYmVjYXVzZSBidXNJbmZvQnl0ZU9mZnNldCA9PSAwIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KCgoVTggKikgKGNoYW4pKSArIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlCisgKiBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wuRGV2SW5mb1s8ZGV2aXg+XS4KKyAqLworc3RhdGljIGludAord3JpdGVfdmJ1c19kZXZJbmZvKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCAqY2hhbiwKKwkJICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICppbmZvLCBpbnQgZGV2aXgpCit7CisJaW50IG9mZjsKKwlpZiAoIWNoYW4pIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvZmYgPQorCSAgICAoc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpICsKKwkgICAgIGNoYW4tPkhkckluZm8uZGV2SW5mb0J5dGVPZmZzZXQpICsKKwkgICAgKGNoYW4tPkhkckluZm8uZGV2aWNlSW5mb1N0cnVjdEJ5dGVzICogZGV2aXgpOworCWlmIChjaGFuLT5IZHJJbmZvLmRldkluZm9CeXRlT2Zmc2V0ID09IDApIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHVzZWQsIGJlY2F1c2UgZGV2SW5mb0J5dGVPZmZzZXQgPT0gMCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweSgoKFU4ICopIChjaGFuKSkgKyBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOworCXJldHVybiAwOworfQorCisvKiBhZGRzIGEgdmJ1cworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCBhZGRfdmJ1cyhzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0ICphZGRwYXJhbXMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCXZidXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlpZiAoIXZidXMpCisJCXJldHVybiAwOworCisJZGV2X3NldF9uYW1lKHZidXMsICJ2YnVzJWQiLCBhZGRwYXJhbXMtPmJ1c05vKTsKKwl2YnVzLT5yZWxlYXNlID0gdmlydHBjaV9idXNfcmVsZWFzZTsKKwl2YnVzLT5wYXJlbnQgPSAmdmlydHBjaV9yb290YnVzX2RldmljZTsJLyogcm9vdCBidXMgaXMgcGFyZW50ICovCisJdmJ1cy0+YnVzID0gJnZpcnRwY2lfYnVzX3R5cGU7CS8qIGJ1cyB0eXBlICovCisJdmJ1cy0+cGxhdGZvcm1fZGF0YSA9IChfX2ZvcmNlIHZvaWQgKilhZGRwYXJhbXMtPmNoYW5wdHI7CisKKwkvKiByZWdpc3RlciBhIHZpcnQgYnVzIGRldmljZSAtCisJICogdGhpcyBidXMgc2hvd3MgdXAgdW5kZXIgL3N5cy9kZXZpY2VzIHdpdGggLm5hbWUgdmFsdWUKKwkgKiAidmlydHBjaSVkIiBhbnkgZGV2aWNlcyBhZGRlZCB0byB0aGlzIGJ1cyB0aGVuIHNob3cgdXAgdW5kZXIKKwkgKiAvc3lzL2RldmljZXMvdmlydHBjaTAKKwkgKi8KKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIodmJ1cyk7CisJaWYgKHJldCkgeworCQlMT0dFUlIoImRldmljZV9yZWdpc3RlciBGQUlMRUQ6JWRcbiIsIHJldCk7CisJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCXdyaXRlX3ZidXNfY2hwSW5mbyh2YnVzLT5wbGF0Zm9ybV9kYXRhIC8qIGNoYW5wdHIgKi8gLAorCQkJICAgJkNoaXBzZXRfRHJpdmVySW5mbyk7CisJd3JpdGVfdmJ1c19idXNJbmZvKHZidXMtPnBsYXRmb3JtX2RhdGEgLyogY2hhbnB0ciAqLyAsICZCdXNfRHJpdmVySW5mbyk7CisJTE9HSU5GKCJBZGRlZCB2YnVzICVkOyBkZXZpY2UgJXMgY3JlYXRlZCBzdWNjZXNzZnVsbHlcbiIsCisJICAgICAgIGFkZHBhcmFtcy0+YnVzTm8sIEJVU19JRCh2YnVzKSk7CisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm4gMTsKK30KKworLyogZm9yIENIQU5TT0NLIHd3d25uL21heCBhcmUgQVVUTy1HRU5FUkFURUQ7IGZvciBub3JtYWwgY2hhbm5lbHMsCisgKiB3d25uL21heCBhcmUgaW4gdGhlIGNoYW5uZWwgaGVhZGVyLgorICovCisjZGVmaW5lIEdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKGNoYW5wdHIpIHsJCQlcCisJbWVtY3B5X2Zyb21pbygmc2NzaS53d25uLAkJCQkJXAorCQkgICAgICAmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJCVwKKwkJCWNoYW5wdHIpLT52aGJhLnd3bm4sCQkJCVwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCB2aGJhX3d3bm4pKTsJCQlcCisJbWVtY3B5X2Zyb21pbygmc2NzaS5tYXgsCQkJCQlcCisJCSAgICAgICYoKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKQkJXAorCQkJY2hhbnB0ciktPnZoYmEubWF4LAkJCQlcCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgdmhiYV9jb25maWdfbWF4KSk7CQkJXAorCX0KKworLyogZmluZCBidXMgZGV2aWNlIHdpdGggdGhlIGJ1c2lkIHRoYXQgbWF0Y2hlcyAtIG1hdGNoX2J1c2lkIG1hdGNoZXMgYnVzX2lkICovCisjZGVmaW5lIEdFVF9CVVNfREVWKGJ1c25vKSB7IFwKKwlzcHJpbnRmKGJ1c2lkLCAidmJ1cyVkIiwgYnVzbm8pOyBcCisJdmJ1cyA9IGJ1c19maW5kX2RldmljZSgmdmlydHBjaV9idXNfdHlwZSwgTlVMTCwgXAorCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsJXAorCWlmICghdmJ1cykgeyBcCisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZmluZCB2YnVzICVzXG4iLCBidXNpZCk7IFwKKwkJcmV0dXJuIDA7IFwKKwl9IFwKK30KKworLyogYWRkcyBhIHZoYmEKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQgYWRkX3ZoYmEoc3RydWN0IGFkZF92aXJ0X2d1ZXN0cGFydCAqYWRkcGFyYW1zKQoreworCWludCBpOworCXN0cnVjdCBzY3NpX2FkYXBfaW5mbyBzY3NpOworCXN0cnVjdCBkZXZpY2UgKnZidXM7CisJdW5zaWduZWQgY2hhciBidXNpZFtCVVNfSURfU0laRV07CisKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlpZiAoIVdBSVRfRk9SX0lPX0NIQU5ORUwKKwkgICAgKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikgYWRkcGFyYW1zLT5jaGFucHRyKSkgeworCQlMT0dFUlIoIlRpbWVkIG91dC4gIENoYW5uZWwgbm90IHJlYWR5XG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihhZGRwYXJhbXMtPmNoYW5wdHIpOworCisJR0VUX0JVU19ERVYoYWRkcGFyYW1zLT5idXNObyk7CisKKwlMT0dJTkYoIkFkZGluZyB2aGJhIHd3bm46JXg6JXggY29uZmlnOiVkLSVkLSVkLSVkIGNoYW5wdHI6JXBcbiIsCisJICAgICAgIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yLAorCSAgICAgICBzY3NpLm1heC5tYXhfY2hhbm5lbCwgc2NzaS5tYXgubWF4X2lkLCBzY3NpLm1heC5tYXhfbHVuLAorCSAgICAgICBzY3NpLm1heC5jbWRfcGVyX2x1biwgYWRkcGFyYW1zLT5jaGFucHRyKTsKKwlpID0gdmlydHBjaV9kZXZpY2VfYWRkKHZidXMsIFZJUlRIQkFfVFlQRSwgYWRkcGFyYW1zLCAmc2NzaSwgTlVMTCk7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCJBZGRlZCB2aGJhIHd3bm46JXg6JXggY2hhbnB0cjolcFxuIiwgc2NzaS53d25uLnd3bm4xLAorCQkgICAgICAgc2NzaS53d25uLnd3bm4yLCBhZGRwYXJhbXMtPmNoYW5wdHIpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIGksCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCX0KKwlyZXR1cm4gaTsKKworfQorCisvKiBmb3IgQ0hBTlNPQ0sgbWFjYWRkciBpcyBBVVRPLUdFTkVSQVRFRDsgZm9yIG5vcm1hbCBjaGFubmVscywKKyAqIG1hY2FkZHIgaXMgaW4gdGhlIGNoYW5uZWwgaGVhZGVyLgorICovCisjZGVmaW5lIEdFVF9ORVRBREFQSU5GT19GUk9NX0NIQU5QVFIoY2hhbnB0cikgewkJCQlcCisJCW1lbWNweV9mcm9taW8obmV0Lm1hY19hZGRyLAkJCQlcCisJCSAgICAgICAoKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKQkJXAorCQkJY2hhbnB0ciktPnZuaWMubWFjYWRkciwJCQkJXAorCQkgICAgICAgTUFYX01BQ0FERFJfTEVOKTsJCQkJXAorCQluZXQubnVtX3Jjdl9idWZzID0JCQkJCVwKKwkJCXJlYWRsKCYoKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKQlcCisJCQkJY2hhbnB0ciktPnZuaWMubnVtX3Jjdl9idWZzKTsJCVwKKwkJbmV0Lm10dSA9IHJlYWRsKCYoKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKSBcCisJCQkJICBjaGFucHRyKS0+dm5pYy5tdHUpOwkJCVwKKwkJbWVtY3B5X2Zyb21pbygmbmV0LnpvbmVHdWlkLCBcCisJCQkgICAgICAmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJXAorCQkJCWNoYW5wdHIpLT52bmljLnpvbmVHdWlkLAkJXAorCQkJICAgICAgc2l6ZW9mKEdVSUQpKTsJCQkJXAorfQorCisvKiBhZGRzIGEgdm5pYworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludAorYWRkX3ZuaWMoc3RydWN0IGFkZF92aXJ0X2d1ZXN0cGFydCAqYWRkcGFyYW1zKQoreworCWludCBpOworCXN0cnVjdCBuZXRfYWRhcF9pbmZvIG5ldDsKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCXVuc2lnbmVkIGNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKCFXQUlUX0ZPUl9JT19DSEFOTkVMCisJICAgICgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopIGFkZHBhcmFtcy0+Y2hhbnB0cikpIHsKKwkJTE9HRVJSKCJUaW1lZCBvdXQsIGNoYW5uZWwgbm90IHJlYWR5XG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKGFkZHBhcmFtcy0+Y2hhbnB0cik7CisKKwlHRVRfQlVTX0RFVihhZGRwYXJhbXMtPmJ1c05vKTsKKworCUxPR0lORigiQWRkaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCByY3ZidWZzOiVkIG10dTolZCBjaGFucHRyOiVweyUtOC44bHgtJS00LjR4LSUtNC40eC0lLTIuMnglLTIuMnglLTIuMnglLTIuMnglLTIuMnglLTIuMnglLTIuMnglLTIuMnh9XG4iLAorCSAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwgbmV0Lm1hY19hZGRyWzNdLAorCSAgICAgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0sIG5ldC5udW1fcmN2X2J1ZnMsIG5ldC5tdHUsCisJICAgICBhZGRwYXJhbXMtPmNoYW5wdHIsICh1bG9uZykgbmV0LnpvbmVHdWlkLmRhdGExLCBuZXQuem9uZUd1aWQuZGF0YTIsCisJICAgICBuZXQuem9uZUd1aWQuZGF0YTMsIG5ldC56b25lR3VpZC5kYXRhNFswXSwgbmV0LnpvbmVHdWlkLmRhdGE0WzFdLAorCSAgICAgbmV0LnpvbmVHdWlkLmRhdGE0WzJdLCBuZXQuem9uZUd1aWQuZGF0YTRbM10sCisJICAgICBuZXQuem9uZUd1aWQuZGF0YTRbNF0sIG5ldC56b25lR3VpZC5kYXRhNFs1XSwKKwkgICAgIG5ldC56b25lR3VpZC5kYXRhNFs2XSwgbmV0LnpvbmVHdWlkLmRhdGE0WzddKTsKKwlpID0gdmlydHBjaV9kZXZpY2VfYWRkKHZidXMsIFZJUlROSUNfVFlQRSwgYWRkcGFyYW1zLCBOVUxMLCAmbmV0KTsKKwlpZiAoaSkgeworCQlMT0dJTkYoIkFkZGVkIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCisJCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKKwkJUE9TVENPREVfTElOVVhfMyhWUENJX0NSRUFURV9FWElUX1BDLCBpLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBkZWxldGUgdmJ1cworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludAorZGVsZXRlX3ZidXMoc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCAqZGVscGFyYW1zKQoreworCXN0cnVjdCBkZXZpY2UgKnZidXM7CisJdW5zaWduZWQgY2hhciBidXNpZFtCVVNfSURfU0laRV07CisKKwlHRVRfQlVTX0RFVihkZWxwYXJhbXMtPmJ1c05vKTsKKwkvKiBlbnN1cmUgdGhhdCBidXMgaGFzIG5vIGRldmljZXM/IC0tIFRCRCAqLworCUxPR0lORigiRGVsZXRpbmcgJXNcbiIsIEJVU19JRCh2YnVzKSk7CisJaWYgKGRlbGV0ZV92YnVzX2RldmljZSh2YnVzLCBOVUxMKSkKKwkJcmV0dXJuIDA7CS8qIGZhaWx1cmUgKi8KKwlMT0dJTkYoIkRlbGV0ZWQgdmJ1cyAlZFxuIiwgZGVscGFyYW1zLT5idXNObyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlbGV0ZV92YnVzX2RldmljZShzdHJ1Y3QgZGV2aWNlICp2YnVzLCB2b2lkICpkYXRhKQoreworCWludCBjaGVja2ZvcnJvb3QgPSAoZGF0YSAhPSBOVUxMKTsKKwlzdHJ1Y3QgZGV2aWNlICpwRGV2ID0gJnZpcnRwY2lfcm9vdGJ1c19kZXZpY2U7CisKKwlpZiAoKGNoZWNrZm9ycm9vdCkgJiYgbWF0Y2hfYnVzaWQodmJ1cywgKHZvaWQgKikgQlVTX0lEKHBEZXYpKSkgeworCQkvKiBza2lwIGl0IC0gZG9uJ3QgZGVsZXRlIHJvb3QgYnVzICovCisJCUxPR0lORigic2tpcHBpbmcgcm9vdCBidXNcbiIpOworCQlyZXR1cm4gMDsJLyogcHJldGVuZCBubyBlcnJvciAqLworCX0KKwlMT0dJTkYoIkNhbGxpbmcgdW5yZWdpc3RlciBmb3IgJXNcbiIsIEJVU19JRCh2YnVzKSk7CisJZGV2aWNlX3VucmVnaXN0ZXIodmJ1cyk7CisJa2ZyZWUodmJ1cyk7CisJTE9HSU5GKCJWQnVzIHVucmVnaXN0ZXIgYW5kIGZyZWVkXG4iKTsKKwlyZXR1cm4gMDsJCS8qIG5vIGVycm9yICovCit9CisKKy8qIHBhdXNlIHZoYmEKKyogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyovCitzdGF0aWMgaW50IHBhdXNlX3ZoYmEoc3RydWN0IHBhdXNlX3ZpcnRfZ3Vlc3RwYXJ0ICpwYXVzZXBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKworCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKHBhdXNlcGFyYW1zLT5jaGFucHRyKTsKKworCUxPR0lORigiUGF1c2luZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKKwlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLyAsIFZJUlRIQkFfVFlQRSwKKwkJCQkgICAgICAmc2NzaS53d25uLCBOVUxMKTsKKwlpZiAoaSkKKwkJTE9HSU5GKCJQYXVzZWQgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsCisJCSAgICAgICBzY3NpLnd3bm4ud3dubjIpOworCXJldHVybiBpOworfQorCisvKiBwYXVzZSB2bmljCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IHBhdXNlX3ZuaWMoc3RydWN0IHBhdXNlX3ZpcnRfZ3Vlc3RwYXJ0ICpwYXVzZXBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7CisKKwlHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKHBhdXNlcGFyYW1zLT5jaGFucHRyKTsKKworCUxPR0lORigiUGF1c2luZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCisJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCWkgPSB2aXJ0cGNpX2RldmljZV9zZXJ2ZXJkb3duKE5VTEwgLypubyBwYXJlbnQgYnVzICovICwgVklSVE5JQ19UWVBFLAorCQkJCSAgICAgIE5VTEwsIG5ldC5tYWNfYWRkcik7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCIgUGF1c2VkIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCisJCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qIHJlc3VtZSB2aGJhCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IHJlc3VtZV92aGJhKHN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgKnJlc3VtZXBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKworCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKHJlc3VtZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlJlc3VtaW5nIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIpOworCWkgPSB2aXJ0cGNpX2RldmljZV9zZXJ2ZXJ1cChOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLyAsIFZJUlRIQkFfVFlQRSwKKwkJCQkgICAgJnNjc2kud3dubiwgTlVMTCk7CisJaWYgKGkpCisJCUxPR0lORigiUmVzdW1lZCB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwKKwkJICAgICAgIHNjc2kud3dubi53d25uMik7CisJcmV0dXJuIGk7Cit9CisKKy8qIHJlc3VtZSB2bmljCisqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisqLworc3RhdGljIGludAorcmVzdW1lX3ZuaWMoc3RydWN0IHJlc3VtZV92aXJ0X2d1ZXN0cGFydCAqcmVzdW1lcGFyYW1zKQoreworCWludCBpOworCXN0cnVjdCBuZXRfYWRhcF9pbmZvIG5ldDsKKworCUdFVF9ORVRBREFQSU5GT19GUk9NX0NIQU5QVFIocmVzdW1lcGFyYW1zLT5jaGFucHRyKTsKKworCUxPR0lORigiUmVzdW1pbmcgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKKwlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUTklDX1RZUEUsCisJCQkJICAgIE5VTEwsIG5ldC5tYWNfYWRkcik7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCIgUmVzdW1lZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJfQorCXJldHVybiBpOworfQorCisvKiBkZWxldGUgdmhiYQorKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorKi8KK3N0YXRpYyBpbnQgZGVsZXRlX3ZoYmEoc3RydWN0IGRlbF92aXJ0X2d1ZXN0cGFydCAqZGVscGFyYW1zKQoreworCWludCBpOworCXN0cnVjdCBzY3NpX2FkYXBfaW5mbyBzY3NpOworCisJR0VUX1NDU0lBREFQSU5GT19GUk9NX0NIQU5QVFIoZGVscGFyYW1zLT5jaGFucHRyKTsKKworCUxPR0lORigiRGVsZXRpbmcgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsIHNjc2kud3dubi53d25uMik7CisJaSA9IHZpcnRwY2lfZGV2aWNlX2RlbChOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLyAsIFZJUlRIQkFfVFlQRSwKKwkJCSAgICAgICAmc2NzaS53d25uLCBOVUxMKTsKKwlpZiAoaSkgeworCQlMT0dJTkYoIkRlbGV0ZWQgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsCisJCSAgICAgICBzY3NpLnd3bm4ud3dubjIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGRlbGV0ZXMgYSB2bmljCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IGRlbGV0ZV92bmljKHN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7CisKKwlHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKGRlbHBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIkRlbGV0aW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJaSA9IHZpcnRwY2lfZGV2aWNlX2RlbChOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLyAsIFZJUlROSUNfVFlQRSwgTlVMTCwKKwkJCSAgICAgICBuZXQubWFjX2FkZHIpOworCWlmIChpKSB7CisJCUxPR0lORigiRGVsZXRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJfQorCXJldHVybiBpOworfQorCisjZGVmaW5lIERFTEVURV9PTkVfVlBDSURFVih2cGNpZGV2KSB7IFwKKwlMT0dJTkYoImNhbGxpbmcgZGV2aWNlX3VucmVnaXN0ZXI6JXBcbiIsICZ2cGNpZGV2LT5nZW5lcmljX2Rldik7IFwKKwlkZXZpY2VfdW5yZWdpc3RlcigmdnBjaWRldi0+Z2VuZXJpY19kZXYpOyBcCisJTE9HSU5GKCJEZWxldGVkICVwXG4iLCB2cGNpZGV2KTsgXAorCWtmcmVlKHZwY2lkZXYpOyBcCit9CisKKy8qIGRlbGV0ZXMgYWxsIHZoYmFzIGFuZCB2bmljcworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX2FsbCh2b2lkKQoreworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXYsICpuZXh0dnBjaWRldjsKKworCS8qIGRlbGV0ZSB0aGUgZW50aXJlIHZoYmEvdm5pYyBsaXN0IGluIG9uZSBzaG90ICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKwl0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkOworCVZwY2lkZXZMaXN0SGVhZCA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJLyogZGVsZXRlIG9uZSB2aGJhL3ZuaWMgYXQgYSB0aW1lICovCisJd2hpbGUgKHRtcHZwY2lkZXYpIHsKKwkJbmV4dHZwY2lkZXYgPSB0bXB2cGNpZGV2LT5uZXh0OworCQkvKiBkZWxldGUgdGhlIHZoYmEvdm5pYyBhdCB0bXB2cGNpZGV2ICovCisJCURFTEVURV9PTkVfVlBDSURFVih0bXB2cGNpZGV2KTsKKwkJdG1wdnBjaWRldiA9IG5leHR2cGNpZGV2OworCQljb3VudCsrOworCX0KKwlMT0dJTkYoIkRlbGV0ZWQgJWQgdmhiYXMvdm5pY3MuXG4iLCBjb3VudCk7CisKKwkvKiBub3cgZGVsZXRlIGVhY2ggdmJ1cyAqLworCWlmIChidXNfZm9yX2VhY2hfZGV2CisJICAgICgmdmlydHBjaV9idXNfdHlwZSwgTlVMTCwgKHZvaWQgKikgMSwgZGVsZXRlX3ZidXNfZGV2aWNlKSkKKwkJTE9HRVJSKCJkZWxldGUgb2YgYWxsIHZidXMgZmFpbGVkXG4iKTsKK30KKworLyogZGVsZXRlcyBhbGwgdm5pY3Mgb3IgdmhiYXMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQgZGVsZXRlX2FsbF92aXJ0KFZJUlRQQ0lfREVWX1RZUEUgZGV2dHlwZSwgc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCAqZGVscGFyYW1zKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCXN0cnVjdCBkZXZpY2UgKnZidXM7CisKKwlHRVRfQlVTX0RFVihkZWxwYXJhbXMtPmJ1c05vKTsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBkZWxldGUgYWxsIGRldmljZXM7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKKwkJICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJCXJldHVybiAwOworCX0KKworCUxPR0lORigiRGVsZXRpbmcgYWxsICVzIGluIHZidXMgJXNcbiIsCisJICAgICAgIGRldnR5cGUgPT0gVklSVEhCQV9UWVBFID8gInZoYmFzIiA6ICJ2bmljcyIsIGJ1c2lkKTsKKwkvKiBkZWxldGUgYWxsIHZoYmFzL3ZuaWNzICovCisJaSA9IHZpcnRwY2lfZGV2aWNlX2RlbCh2YnVzLCBkZXZ0eXBlLCBOVUxMLCBOVUxMKTsKKwlpZiAoaSA+IDApCisJCUxPR0lORigiRGVsZXRlZCAlZCAlc1xuIiwgaSwKKwkJICAgICAgIGRldnR5cGUgPT0gVklSVEhCQV9UWVBFID8gInZoYmFzIiA6ICJ2bmljcyIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZpcnRwY2lfY3RybGNoYW5fZnVuYyhzdHJ1Y3QgZ3Vlc3RfbXNncyAqbXNnKQoreworCXN3aXRjaCAobXNnLT5tc2d0eXBlKSB7CisJY2FzZSBHVUVTVF9BRERfVkJVUzoKKwkJcmV0dXJuIGFkZF92YnVzKCZtc2ctPmFkZF92YnVzKTsKKwljYXNlIEdVRVNUX0FERF9WSEJBOgorCQlyZXR1cm4gYWRkX3ZoYmEoJm1zZy0+YWRkX3ZoYmEpOworCWNhc2UgR1VFU1RfQUREX1ZOSUM6CisJCXJldHVybiBhZGRfdm5pYygmbXNnLT5hZGRfdm5pYyk7CisJY2FzZSBHVUVTVF9ERUxfVkJVUzoKKwkJcmV0dXJuIGRlbGV0ZV92YnVzKCZtc2ctPmRlbF92YnVzKTsKKwljYXNlIEdVRVNUX0RFTF9WSEJBOgorCQlyZXR1cm4gZGVsZXRlX3ZoYmEoJm1zZy0+ZGVsX3ZoYmEpOworCWNhc2UgR1VFU1RfREVMX1ZOSUM6CisJCXJldHVybiBkZWxldGVfdm5pYygmbXNnLT5kZWxfdmhiYSk7CisJY2FzZSBHVUVTVF9ERUxfQUxMX1ZIQkFTOgorCQlyZXR1cm4gZGVsZXRlX2FsbF92aXJ0KFZJUlRIQkFfVFlQRSwgJm1zZy0+ZGVsX2FsbF92aGJhcyk7CisJY2FzZSBHVUVTVF9ERUxfQUxMX1ZOSUNTOgorCQlyZXR1cm4gZGVsZXRlX2FsbF92aXJ0KFZJUlROSUNfVFlQRSwgJm1zZy0+ZGVsX2FsbF92bmljcyk7CisJY2FzZSBHVUVTVF9ERUxfQUxMX1ZCVVNFUzoKKwkJZGVsZXRlX2FsbCgpOworCQlyZXR1cm4gMTsKKwljYXNlIEdVRVNUX1BBVVNFX1ZIQkE6CisJCXJldHVybiBwYXVzZV92aGJhKCZtc2ctPnBhdXNlX3ZoYmEpOworCWNhc2UgR1VFU1RfUEFVU0VfVk5JQzoKKwkJcmV0dXJuIHBhdXNlX3ZuaWMoJm1zZy0+cGF1c2Vfdm5pYyk7CisJY2FzZSBHVUVTVF9SRVNVTUVfVkhCQToKKwkJcmV0dXJuIHJlc3VtZV92aGJhKCZtc2ctPnJlc3VtZV92aGJhKTsKKwljYXNlIEdVRVNUX1JFU1VNRV9WTklDOgorCQlyZXR1cm4gcmVzdW1lX3ZuaWMoJm1zZy0+cmVzdW1lX3ZuaWMpOworCWRlZmF1bHQ6CisJCUxPR0VSUigiaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQuXG4iLCBtc2ctPm1zZ3R5cGUpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIHNhbWUgYXMgZHJpdmVyX2hlbHBlciBpbiBidXMuYyBsaW51eCAqLworc3RhdGljIGludCBtYXRjaF9idXNpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRhdGE7CisKKwlpZiAoc3RyY21wKG5hbWUsIEJVU19JRChkZXYpKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEJ1cyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKgordmlydHBjaV9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcywKKwkJICAgICBjb25zdCBzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldikKK3sKKwl3aGlsZSAoaWRzLT52ZW5kb3IgfHwgaWRzLT5zdWJ2ZW5kb3IgfHwgaWRzLT5jbGFzc19tYXNrKSB7CisJCURCR0lORigiaWRzLT52ZW5kb3I6JXggZGV2LT52ZW5kb3I6JXggaWRzLT5kZXZpY2U6JXggZGV2LT5kZXZpY2U6JXhcbiIsCisJCSAgICAgaWRzLT52ZW5kb3IsIGRldi0+dmVuZG9yLCBpZHMtPmRldmljZSwgZGV2LT5kZXZpY2UpOworCisJCWlmICgoaWRzLT52ZW5kb3IgPT0gZGV2LT52ZW5kb3IpCisJCSAgICAmJiAoaWRzLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpKQorCQkJcmV0dXJuIGlkczsKKworCQlpZHMrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIE5PVEU6ICEhISEhISAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIG5ldyBkZXZpY2UgaXMgYWRkZWQKKyogZm9yIHRoaXMgYnVzLiAgT3IsIGl0IGlzIGNhbGxlZCBmb3IgZXhpc3RpbmcgZGV2aWNlcyB3aGVuIGEgbmV3CisqIGRyaXZlciBpcyBhZGRlZCBmb3IgdGhpcyBidXMuICBJdCByZXR1cm5zIG5vbnplcm8gaWYgYSBnaXZlbiBkZXZpY2UKKyogY2FuIGJlIGhhbmRsZWQgYnkgdGhlIGdpdmVuIGRyaXZlci4KKyovCitzdGF0aWMgaW50IHZpcnRwY2lfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYgPSBkZXZpY2VfdG9fdmlydHBjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKnZpcnRwY2lkcnYgPSBkcml2ZXJfdG9fdmlydHBjaV9kcml2ZXIoZHJ2KTsKKwlpbnQgbWF0Y2ggPSAwOworCisJREJHSU5GKCJJbiB2aXJ0cGNpX2J1c19tYXRjaCBkZXYtPmJ1c19pZDolcyBkcnYtPm5hbWU6JXNcbiIsCisJICAgICAgIGRldi0+YnVzX2lkLCBkcnYtPm5hbWUpOworCisJLyogY2hlY2sgaWRzIGxpc3QgZm9yIGEgbWF0Y2ggKi8KKwlpZiAodmlydHBjaV9tYXRjaF9kZXZpY2UodmlydHBjaWRydi0+aWRfdGFibGUsIHZpcnRwY2lkZXYpKQorCQltYXRjaCA9IDE7CisKKwlEQkdJTkYoInJldHVybmluZyBtYXRjaDolZFxuIiwgbWF0Y2gpOworCXJldHVybiBtYXRjaDsJCS8qIDAgLSBubyBtYXRjaDsgMSAtIHllcyBpdCBtYXRjaGVzICovCit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJREJHSU5GKCJJbiB2aXJ0cGNpX2hvdHBsdWdcbiIpOworCS8qIGFkZCB2YXJpYWJsZXMgdG8gdGhlIGVudmlyb25tZW50IHByaW9yIHRvIHRoZSBnZW5lcmF0aW9uIG9mCisJICogaG90cGx1ZyBldmVudHMgdG8gdXNlciBzcGFjZQorCSAqLworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJWSVJUUENJX1ZFUlNJT049JXMiLCBWSVJUUENJX1ZFUlNJT04pKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCURCR0lORigiSW4gdmlydHBjaV9kZXZpY2Vfc3VzcGVuZCAtTllJICoqKipcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJREJHSU5GKCJJbiB2aXJ0cGNpX2RldmljZV9yZXN1bWUgLU5ZSSAqKioqXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogRm9yIGEgY2hpbGQgZGV2aWNlIGp1c3QgY3JlYXRlZCBvbiBhIGNsaWVudCBidXMsIGZpbGwgaW4KKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgdGhhdCBpcyBjb250cm9sbGluZyB0aGlzIGRldmljZSBpbnRvCisgKiB0aGUgdGhlIGFwcHJvcHJpYXRlIHNsb3Qgd2l0aGluIHRoZSB2YnVzIGNoYW5uZWwgb2YgdGhlIGJ1cworICogaW5zdGFuY2UuCisgKi8KK3N0YXRpYyB2b2lkIGZpeF92YnVzX2RldkluZm8oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGV2Tm8sIGludCBkZXZUeXBlLAorCQkJICAgICBzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKnZpcnRwY2lkcnYpCit7CisJc3RydWN0IGRldmljZSAqdmJ1czsKKwl2b2lkICpwQ2hhbjsKKwlVTFRSQV9WQlVTX0RFVklDRUlORk8gZGV2SW5mbzsKKwljb25zdCBjaGFyICpzdHlwZTsKKworCWlmICghZGV2KSB7CisJCUxPR0VSUigiJXMgZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaWYgKCF2aXJ0cGNpZHJ2KSB7CisJCUxPR0VSUigiJXMgZHJpdmVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJdmJ1cyA9IGRldi0+cGFyZW50OworCWlmICghdmJ1cykgeworCQlMT0dFUlIoIiVzIGRldiBoYXMgbm8gcGFyZW50IGJ1cyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlwQ2hhbiA9IHZidXMtPnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwQ2hhbikgeworCQlMT0dFUlIoIiVzIGRldiBidXMgaGFzIG5vIGNoYW5uZWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChkZXZUeXBlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJUlRIQkE6CisJCXN0eXBlID0gInZIQkEiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVklSVE5JQzoKKwkJc3R5cGUgPSAidk5JQyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0eXBlID0gInVua25vd24iOworCQlicmVhazsKKwl9CisJQnVzRGV2aWNlSW5mb19Jbml0KCZkZXZJbmZvLCBzdHlwZSwKKwkJCSAgIHZpcnRwY2lkcnYtPm5hbWUsCisJCQkgICB2aXJ0cGNpZHJ2LT52ZXJzaW9uLAorCQkJICAgdmlydHBjaWRydi0+dmVydGFnLAorCQkJICAgdmlydHBjaWRydi0+YnVpbGRfZGF0ZSwgdmlydHBjaWRydi0+YnVpbGRfdGltZSk7CisJd3JpdGVfdmJ1c19kZXZJbmZvKHBDaGFuLCAmZGV2SW5mbywgZGV2Tm8pOworCisJLyogUmUtd3JpdGUgYnVzK2NoaXBzZXQgaW5mbywgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMKKwkqIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gYnkgb3VyIGdvb2QgY291bnRlcnBhcnQsIHZpc29yYnVzLgorCSovCisJd3JpdGVfdmJ1c19jaHBJbmZvKHBDaGFuLCAmQ2hpcHNldF9Ecml2ZXJJbmZvKTsKKwl3cml0ZV92YnVzX2J1c0luZm8ocENoYW4sICZCdXNfRHJpdmVySW5mbyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHF1ZXJ5IHRoZSBleGlzdGVuY2Ugb2YgYSBzcGVjaWZpYyBkZXZpY2UKKyogYW5kIHdoZXRoZXIgdGhpcyBkcml2ZXIgY2FuIHdvcmsgd2l0aCBpdC4gIEl0IHNob3VsZCByZXR1cm4gLUVOT0RFVgorKiBpbiBjYXNlIG9mIGZhaWx1cmUuCisqLworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2ID0gZGV2aWNlX3RvX3ZpcnRwY2lfZGV2KGRldik7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0KKwkgICAgZHJpdmVyX3RvX3ZpcnRwY2lfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CisJaW50IGVycm9yID0gMDsKKworCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcHJvYmUgZGV2OiVwIHZpcnRwY2lkZXY6JXAgdmlydHBjaWRydjolcFxuIiwKKwkgICAgICAgZGV2LCB2aXJ0cGNpZGV2LCB2aXJ0cGNpZHJ2KTsJLyogVkVSQk9TRS9ERUJVRyA/ICovCisJUE9TVENPREVfTElOVVhfMihWUENJX1BST0JFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwkvKiBzdGF0aWMgbWF0Y2ggYW5kIHN0YXRpYyBwcm9iZSB2cyBkeW5hbWljIG1hdGNoICYgZHluYW1pYworCSAqIHByb2JlIC0gZG8gd2UgY2FyZT8uCisJICovCisJaWYgKCF2aXJ0cGNpZHJ2LT5pZF90YWJsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZCA9IHZpcnRwY2lfbWF0Y2hfZGV2aWNlKHZpcnRwY2lkcnYtPmlkX3RhYmxlLCB2aXJ0cGNpZGV2KTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGluY3JlbWVudCByZWZlcmVuY2UgY291bnQgKi8KKwlnZXRfZGV2aWNlKGRldik7CisKKwkvKiBpZiB2aXJ0cGNpZGV2IGlzIG5vdCBhbHJlYWR5IGNsYWltZWQgJiBwcm9iZSBmdW5jdGlvbiBpcworCSAqIHZhbGlkLCBwcm9iZSBpdAorCSAqLworCWlmICghdmlydHBjaWRldi0+bXlkcml2ZXIgJiYgdmlydHBjaWRydi0+cHJvYmUpIHsKKwkJLyogY2FsbCB0aGUgcHJvYmUgZnVuY3Rpb24gLSB2aXJ0aGJhIG9yIHZpcnRuaWMgcHJvYmUKKwkJICogaXMgd2hhdCBpdCBzaG91bGQgYmUKKwkJICovCisJCWVycm9yID0gdmlydHBjaWRydi0+cHJvYmUodmlydHBjaWRldiwgaWQpOworCQlpZiAoIWVycm9yKSB7CisJCQlmaXhfdmJ1c19kZXZJbmZvKGRldiwgdmlydHBjaWRldi0+ZGV2aWNlTm8sCisJCQkJCSB2aXJ0cGNpZGV2LT5kZXZpY2UsIHZpcnRwY2lkcnYpOworCQkJdmlydHBjaWRldi0+bXlkcml2ZXIgPSB2aXJ0cGNpZHJ2OworCQkJUE9TVENPREVfTElOVVhfMihWUENJX1BST0JFX0VYSVRfUEMsCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwkJfSBlbHNlCisJCQlwdXRfZGV2aWNlKGRldik7CisJfQorCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9QUk9CRV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCXJldHVybiBlcnJvcjsJCS8qIC1FTk9ERVYgZm9yIHByb2JlIGZhaWx1cmUgKi8KK30KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2XykKK3sKKwkvKiBkZXZfIHBhc3NlZCBpbiBpcyB0aGUgSEJBIGRldmljZSB3aGljaCB3ZSBjYWxsZWQKKwkqIGdlbmVyaWNfZGV2IGluIG91ciB2aXJ0cGNpZGV2IHN0cnVjdAorCSovCisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2ID0gZGV2aWNlX3RvX3ZpcnRwY2lfZGV2KGRldl8pOworCXN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqdmlydHBjaWRydiA9IHZpcnRwY2lkZXYtPm15ZHJpdmVyOworCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcmVtb3ZlIGJ1c19pZDolcyBkZXZfOiVwIHZpcnRwY2lkZXY6JXAgZGV2LT5kcml2ZXI6JXAgZHJpdmVybmFtZTolc1xuIiwKKwkgICAgICAgQlVTX0lEKGRldl8pLCBkZXZfLCB2aXJ0cGNpZGV2LCBkZXZfLT5kcml2ZXIsCisJICAgICAgIGRldl8tPmRyaXZlci0+bmFtZSk7CS8qIFZFUkJPU0UvREVCVUcgKi8KKwlpZiAodmlydHBjaWRydikgeworCQkvKiBURU1QOiBhc3N1bWluZyB3ZSBoYXZlIG9ubHkgb25lIHN1Y2ggZHJpdmVyIGZvciBub3cgKi8KKwkJaWYgKHZpcnRwY2lkcnYtPnJlbW92ZSkKKwkJCXZpcnRwY2lkcnYtPnJlbW92ZSh2aXJ0cGNpZGV2KTsKKwkJdmlydHBjaWRldi0+bXlkcml2ZXIgPSBOVUxMOworCX0KKworCURCR0lORigiY2FsbGluZyBwdXRkZXZpY2VcbiIpOworCXB1dF9kZXZpY2UoZGV2Xyk7CisKKwlEQkdJTkYoIkxlYXZpbmdcbiIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCdXMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHZpcnRwY2lfYnVzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZQorCSAqIGRldmljZSBpcyByZW1vdmVkCisJICovCisJREJHSU5GKCJJbiB2aXJ0cGNpX2J1c19yZWxlYXNlXG4iKTsKKwkvKiB3aGF0IGVsc2UgaXMgc3VwcG9zZWQgdG8gaGFwcGVuIGhlcmU/ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEFkYXB0ZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9hZGQoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCSAgICAgIHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBzY3NpX2FkYXBfaW5mbyAqc2NzaSwgLyogTlVMTCBmb3IgVk5JQyBhZGQgKi8KKwkJCSAgICAgIHN0cnVjdCBuZXRfYWRhcF9pbmZvICpuZXQJLyogTlVMTCBmb3IgVkhCQSBhZGQgKi8pCit7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXYgPSBOVUxMLCAqcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICpwSW9DaGFuID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpwRGV2OworCisJTE9HSU5GKCJ2aXJ0cGNpX2RldmljZV9hZGQgcGFyZW50YnVzOiVwIGNoYW5wdHI6JXBcbiIsIHBhcmVudGJ1cywKKwkgICAgICAgYWRkcGFyYW1zLT5jaGFucHRyKTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkgeworCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGFkZCBkZXZpY2U7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKKwkJICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2dHlwZSwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYWRkIGEgVmlydHVhbCBEZXZpY2UgKi8KKwl2aXJ0cGNpZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZpcnRwY2lfZGV2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHZpcnRwY2lkZXYgPT0gTlVMTCkgeworCQlMT0dFUlIoImNhbid0IGFkZCBkZXZpY2UgLSBtYWxsb2MgRkFMTEVEXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihNQUxMT0NfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogaW5pdGlhbGl6ZSBzdHVmZiB1bmlxdWUgdG8gdmlydHBjaV9kZXYgc3RydWN0ICovCisJdmlydHBjaWRldi0+ZGV2dHlwZSA9IGRldnR5cGU7CisJaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCXZpcnRwY2lkZXYtPmRldmljZSA9IFBDSV9ERVZJQ0VfSURfVklSVEhCQTsKKwkJdmlydHBjaWRldi0+c2NzaSA9ICpzY3NpOworCX0gZWxzZSB7CisJCXZpcnRwY2lkZXYtPmRldmljZSA9IFBDSV9ERVZJQ0VfSURfVklSVE5JQzsKKwkJdmlydHBjaWRldi0+bmV0ID0gKm5ldDsKKwl9CisJdmlydHBjaWRldi0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9VTklTWVM7CisJdmlydHBjaWRldi0+YnVzTm8gPSBhZGRwYXJhbXMtPmJ1c05vOworCXZpcnRwY2lkZXYtPmRldmljZU5vID0gYWRkcGFyYW1zLT5kZXZpY2VObzsKKworCXZpcnRwY2lkZXYtPnF1ZXVlaW5mby5jaGFuID0gYWRkcGFyYW1zLT5jaGFucHRyOworCXZpcnRwY2lkZXYtPnF1ZXVlaW5mby5zZW5kX2ludF9pZl9uZWVkZWQgPSBOVUxMOworCisJLyogU2V0IHVwIHNhZmUgcXVldWUuLi4gKi8KKwlwSW9DaGFuID0gKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKQorCQl2aXJ0cGNpZGV2LT5xdWV1ZWluZm8uY2hhbjsKKworCXZpcnRwY2lkZXYtPmludHIgPSBhZGRwYXJhbXMtPmludHI7CisKKwkvKiBpbml0aWFsaXplIHN0dWZmIGluIHRoZSBkZXZpY2UgcG9ydGlvbiBvZiB0aGUgc3RydWN0ICovCisJdmlydHBjaWRldi0+Z2VuZXJpY19kZXYuYnVzID0gJnZpcnRwY2lfYnVzX3R5cGU7CisJdmlydHBjaWRldi0+Z2VuZXJpY19kZXYucGFyZW50ID0gcGFyZW50YnVzOworCXZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LnJlbGVhc2UgPSB2aXJ0cGNpX2RldmljZV9yZWxlYXNlOworCisJZGV2X3NldF9uYW1lKCZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldiwgIiV4OiV4IiwKKwkJICAgICBhZGRwYXJhbXMtPmJ1c05vLCBhZGRwYXJhbXMtPmRldmljZU5vKTsKKworCS8qIGFkZCB0aGUgdmhiYS92bmljIHRvIHZpcnRwY2kgZGV2aWNlIGxpc3QgLSBidXQgY2hlY2sgZm9yCisJICogZHVwbGljYXRlIHd3bm4vbWFjYWRkciBmaXJzdAorCSAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkOyB0bXB2cGNpZGV2OworCSAgICAgdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQpIHsKKwkJaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlpZiAoKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMSA9PSBzY3NpLT53d25uLnd3bm4xKSAmJgorCQkJICAgICh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjIgPT0gc2NzaS0+d3dubi53d25uMikpIHsKKwkJCQkvKiBkdXBsaWNhdGUgLSBhbHJlYWR5IGhhdmUgdnBjaWRldgorCQkJCSAgIHdpdGggdGhpcyB3d25uICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkgICAgaWYgKG1lbWNtcAorCQkJKHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkciwgbmV0LT5tYWNfYWRkciwKKwkJCSBNQVhfTUFDQUREUl9MRU4pID09IDApIHsKKwkJCS8qIGR1cGxpY2F0ZSAtIGFscmVhZHkgaGF2ZSB2bmljIHdpdGggdGhpcyB3d25uICovCisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAodG1wdnBjaWRldikgeworCQkvKiBmb3VuZCBhIHZoYmEvdm5pYyBhbHJlYWR5IGluIHRoZSBsaXN0IHdpdGggc2FtZQorCQkgKiB3d25uIG9yIG1hY2FkZHIgLSByZWplY3QgYWRkCisJCSAqLworCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJCWtmcmVlKHZpcnRwY2lkZXYpOworCQlMT0dFUlIoIioqKiogRkFJTEVEIHZoYmEvdm5pYyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdFxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYWRkIGl0IGF0IHRoZSBoZWFkICovCisJaWYgKCFWcGNpZGV2TGlzdEhlYWQpCisJCVZwY2lkZXZMaXN0SGVhZCA9IHZpcnRwY2lkZXY7CisJZWxzZSB7CisJCS8qIGluc2VydCB2aXJ0cGNpZGV2IGF0IHRoZSBoZWFkIG9mIG91ciBsaW5rZWQgbGlzdCBvZgorCQkgKiB2cGNpZGV2cworCQkgKi8KKwkJdmlydHBjaWRldi0+bmV4dCA9IFZwY2lkZXZMaXN0SGVhZDsKKwkJVnBjaWRldkxpc3RIZWFkID0gdmlydHBjaWRldjsKKwl9CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwkvKiBNdXN0IHRyYW5zaXRpb24gY2hhbm5lbCB0byBBVFRBQ0hFRCBzdGF0ZSBCRUZPUkUKKwkgKiByZWdpc3RlcmluZyB0aGUgZGV2aWNlLCBiZWNhdXNlIHBvbGxpbmcgb2YgdGhlIGNoYW5uZWwKKwkgKiBxdWV1ZXMgY2FuIGJlZ2luIGF0IGFueSB0aW1lIGFmdGVyIGRldmljZV9yZWdpc3RlcigpLgorCSAqLworCXBEZXYgPSAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXY7CisJVUxUUkFfQ0hBTk5FTF9DTElFTlRfVFJBTlNJVElPTihhZGRwYXJhbXMtPmNoYW5wdHIsCisJCQkJCUJVU19JRChwRGV2KSwKKwkJCQkJQ0hBTk5FTENMSV9BVFRBQ0hFRCwgTlVMTCk7CisKKwkvKiBkb24ndCByZWdpc3RlciB1bnRpbCBkZXZpY2UgaGFzIGJlZW4gYWRkZWQgdG8KKwkqIGxpc3QuIE90aGVyd2lzZSwgYSBkZXZpY2VfdW5yZWdpc3RlciBmcm9tIHRoaXMgZnVuY3Rpb24gY2FuCisJKiBjYXVzZSBhICJzY2hlZHVsaW5nIHdoaWxlIGF0b21pYyIuCisJKi8KKwlEQkdJTkYoInJlZ2lzdGVyaW5nIGRldmljZTolcCB3aXRoIGJ1c19pZDolc1xuIiwKKwkgICAgICAgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LCB2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldi5idXNfaWQpOworCXJldCA9IGRldmljZV9yZWdpc3RlcigmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYpOworCS8qIE5PVEU6IFRISVMgSVMgQ0FMTElORyBIT1RQTFVHIHZpcnRwY2lfaG90cGx1ZyEhIQorCSAqIFRoaXMgY2FsbCB0byBkZXZpY2VfcmVnaXN0ZXIgcmVzdWx0cyBpbiB2aXJ0cGNpX2J1c19tYXRjaAorCSAqIGJlaW5nIGNhbGxlZCAhISEhISAgQW5kLCBpZiBtYXRjaCByZXR1cm5zIHN1Y2Nlc3MsIHRoZW4KKwkgKiB2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldi5kcml2ZXIgaXMgc2V0dXAgdG8gY29yZV9kcml2ZXIsCisJICogaS5lLiwgdmlydHBjaSBhbmQgdGhlIHByb2JlIGZ1bmN0aW9uCisJICogdmlydHBjaWRldi0+Z2VuZXJpY19kZXYuZHJpdmVyLT5wcm9iZSBpcyBjYWxsZWQgd2hpY2gKKwkgKiByZXN1bHRzIGluIHZpcnRwY2lfZGV2aWNlX3Byb2JlIGJlaW5nIGNhbGxlZC4gQW5kIGlmCisJICogdmlydHBjaV9kZXZpY2VfcHJvYmUgaXMgc3VjY2Vzc2Z1bAorCSAqLworCWlmIChyZXQpIHsKKwkJTE9HRVJSKCJkZXZpY2VfcmVnaXN0ZXIgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXBEZXYgPSAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXY7CisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04oYWRkcGFyYW1zLT5jaGFucHRyLAorCQkJCQkJQlVTX0lEKHBEZXYpLAorCQkJCQkJQ0hBTk5FTENMSV9ERVRBQ0hFRCwgTlVMTCk7CisJCS8qIHJlbW92ZSB2aXJ0cGNpZGV2LCB0aGUgb25lIHdlIGp1c3QgYWRkZWQsIGZyb20gdGhlIGxpc3QgKi8KKwkJd3JpdGVfbG9ja19pcnFzYXZlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKwkJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkLCBwcmV2ID0gTlVMTDsKKwkJICAgICB0bXB2cGNpZGV2OworCQkgICAgIHByZXYgPSB0bXB2cGNpZGV2LCB0bXB2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dCkgeworCQkJaWYgKHRtcHZwY2lkZXYgPT0gdmlydHBjaWRldikgeworCQkJCWlmIChwcmV2KQorCQkJCQlwcmV2LT5uZXh0ID0gdG1wdnBjaWRldi0+bmV4dDsKKwkJCQllbHNlCisJCQkJCVZwY2lkZXZMaXN0SGVhZCA9IHRtcHZwY2lkZXYtPm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCQlrZnJlZSh2aXJ0cGNpZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJTE9HSU5GKCJBZGRlZCAlczolZDolZCAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXY6JXBcbiIsCisJICAgICAgIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgPyAidmlydGhiYSIgOiAidmlydG5pYyIsCisJICAgICAgIGFkZHBhcmFtcy0+YnVzTm8sIGFkZHBhcmFtcy0+ZGV2aWNlTm8sICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldik7CisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9zZXJ2ZXJkb3duKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywKKwkJCQkgICAgIGludCBkZXZ0eXBlLAorCQkJCSAgICAgc3RydWN0IHZoYmFfd3dubiAqd3dubiwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKQoreworCWludCBwYXVzZXRoaXNvbmUgPSAwOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXYsICpwcmV2dnBjaWRldjsKKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKnZwY2lkcml2ZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkgeworCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIHBhdXNlIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAorCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBmaW5kIHRoZSB2aGJhIG9yIHZuaWMgaW4gdmlydHBjaSBkZXZpY2UgbGlzdCAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlmb3IgKHRtcHZwY2lkZXYgPSBWcGNpZGV2TGlzdEhlYWQsIHByZXZ2cGNpZGV2ID0gTlVMTDsKKwkgICAgICh0bXB2cGNpZGV2ICYmICFmb3VuZCk7CisJICAgICBwcmV2dnBjaWRldiA9IHRtcHZwY2lkZXYsIHRtcHZwY2lkZXYgPSB0bXB2cGNpZGV2LT5uZXh0KSB7CisJCWlmICh0bXB2cGNpZGV2LT5kZXZ0eXBlICE9IGRldnR5cGUpCisJCQljb250aW51ZTsKKworCQlpZiAoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpIHsKKwkJCXBhdXNldGhpc29uZSA9CisJCQkgICAgKCh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEgPT0gd3dubi0+d3dubjEpICYmCisJCQkgICAgICh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjIgPT0gd3dubi0+d3dubjIpKTsKKwkJCS8qIGRldnR5cGUgaXMgdmhiYSwgd2UncmUgcGF1c2luZyB2aGJhIHdob3NlCisJCQkqIHd3bm4gbWF0Y2hlcyB0aGUgY3VycmVudCBkZXZpY2UncyB3d25uCisJCQkqLworCQl9IGVsc2UgewkvKiBWSVJUTklDX1RZUEUgKi8KKwkJCXBhdXNldGhpc29uZSA9CisJCQkgICAgbWVtY21wKHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkciwgbWFjYWRkciwKKwkJCQkgICBNQVhfTUFDQUREUl9MRU4pID09IDA7CisJCQkvKiBkZXZ0eXBlIGlzIHZuaWMsIHdlJ3JlIHBhdXNpbmcgdm5pYyB3aG9zZQorCQkJKiBtYWNhZGRyIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgbWFjYWRkciAqLworCQl9CisKKwkJaWYgKCFwYXVzZXRoaXNvbmUpCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IHRydWU7CisJCXZwY2lkcml2ZXIgPSB0bXB2cGNpZGV2LT5teWRyaXZlcjsKKwkJcmMgPSB2cGNpZHJpdmVyLT5zdXNwZW5kKHRtcHZwY2lkZXYsIDApOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlpZiAoIWZvdW5kKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZmluZCB2aGJhL3ZuaWMgaW4gdGhlIGxpc3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLAorCQkJCSAgIGludCBkZXZ0eXBlLAorCQkJCSAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sCisJCQkJICAgdW5zaWduZWQgY2hhciBtYWNhZGRyW10pCit7CisJaW50IHJlc3VtZXRoaXNvbmUgPSAwOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXYsICpwcmV2dnBjaWRldjsKKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKnZwY2lkcml2ZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkgeworCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIHJlc3VtZSBkZXZpY2U7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKKwkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmluZCB0aGUgdmhiYSBvciB2bmljIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QgKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkLCBwcmV2dnBjaWRldiA9IE5VTEw7CisJICAgICAodG1wdnBjaWRldiAmJiAhZm91bmQpOworCSAgICAgcHJldnZwY2lkZXYgPSB0bXB2cGNpZGV2LCB0bXB2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dCkgeworCQlpZiAodG1wdnBjaWRldi0+ZGV2dHlwZSAhPSBkZXZ0eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlyZXN1bWV0aGlzb25lID0KKwkJCSAgICAoKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMSA9PSB3d25uLT53d25uMSkgJiYKKwkJCSAgICAgKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMiA9PSB3d25uLT53d25uMikpOworCQkJLyogZGV2dHlwZSBpcyB2aGJhLCB3ZSdyZSByZXN1bWluZyB2aGJhIHdob3NlCisJCQkqIHd3bm4gbWF0Y2hlcyB0aGUgY3VycmVudCBkZXZpY2UncyB3d25uICovCisJCX0gZWxzZSB7CS8qIFZJUlROSUNfVFlQRSAqLworCQkJcmVzdW1ldGhpc29uZSA9CisJCQkgICAgbWVtY21wKHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkciwgbWFjYWRkciwKKwkJCQkgICBNQVhfTUFDQUREUl9MRU4pID09IDA7CisJCQkvKiBkZXZ0eXBlIGlzIHZuaWMsIHdlJ3JlIHJlc3VtaW5nIHZuaWMgd2hvc2UKKwkJCSogbWFjYWRkciBtYXRjaGVzIHRoZSBjdXJyZW50IGRldmljZSdzIG1hY2FkZHIgKi8KKwkJfQorCisJCWlmICghcmVzdW1ldGhpc29uZSkKKwkJCWNvbnRpbnVlOworCisJCWZvdW5kID0gdHJ1ZTsKKwkJdnBjaWRyaXZlciA9IHRtcHZwY2lkZXYtPm15ZHJpdmVyOworCQkvKiBUaGlzIHNob3VsZCBiZSBkb25lIGF0IEJVUyByZXN1bWUgdGltZSwgYnV0IGFuCisJCSogZXhpc3RpbmcgcHJvYmxlbSBwcmV2ZW50cyB1cyBmcm9tIGV2ZXIgZ2V0dGluZyBhIGJ1cworCQkqIHJlc3VtZS4uLiAgVGhpcyBoYWNrIHdvdWxkIGZhaWwgdG8gd29yayBzaG91bGQgd2UKKwkJKiBldmVyIGhhdmUgYSBidXMgdGhhdCBjb250YWlucyBOTyBkZXZpY2VzLCBzaW5jZSB3ZQorCQkqIHdvdWxkIG5ldmVyIGV2ZW4gZ2V0IGhlcmUgaW4gdGhhdCBjYXNlLgorCQkqLworCQlmaXhfdmJ1c19kZXZJbmZvKCZ0bXB2cGNpZGV2LT5nZW5lcmljX2RldiwgdG1wdnBjaWRldi0+ZGV2aWNlTm8sCisJCQkJIHRtcHZwY2lkZXYtPmRldmljZSwgdnBjaWRyaXZlcik7CisJCXJjID0gdnBjaWRyaXZlci0+cmVzdW1lKHRtcHZwY2lkZXYpOworCX0KKworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKworCWlmICghZm91bmQpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9kZWwoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLAorCQkJICAgICAgaW50IGRldnR5cGUsIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sCisJCQkgICAgICB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbXSkKK3sKKwlpbnQgY291bnQgPSAwLCBhbGwgPSAwLCBkZWx0aGlzb25lOworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdG1wdnBjaWRldiwgKnByZXZ2cGNpZGV2LCAqZGVsbGlzdCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2RlZmluZSBERUxfQ09OVElOVUUgeyBcCisJcHJldnZwY2lkZXYgPSB0bXB2cGNpZGV2O1wKKwl0bXB2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dDtcCisJY29udGludWU7IFwKK30KKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBkZWxldGUgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJCXJldHVybiAwOworCX0KKworCS8qIHNlZSBpZiB3ZSBhcmUgdG8gZGVsZXRlIGFsbCAtIE5PVEU6IGFsbCBpbXBsaWVzIHdlIGhhdmUgYQorCSAqIHZhbGlkIHBhcmVudGJ1cworCSAqLworCWFsbCA9ICgoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpICYmICh3d25uID09IE5VTEwpKSB8fAorCSAgICAoKGRldnR5cGUgPT0gVklSVE5JQ19UWVBFKSAmJiAobWFjYWRkciA9PSBOVUxMKSk7CisKKwkvKiBmaW5kIGFsbCB0aGUgdmhiYSBvciB2bmljIG9yIGJvdGggaW4gdmlydHBjaSBkZXZpY2UgbGlzdAorCSoga2VlcCBsaXN0IG9mIG9uZXMgd2UgYXJlIGRlbGV0aW5nIHNvIHdlIGNhbiBjYWxsCisJKiBkZXZpY2VfdW5yZWdpc3RlciBhZnRlciB3ZSByZWxlYXNlIHRoZSBsb2NrOyBvdGhlcndpc2Ugd2UKKwkqIGVuY291bnRlciAic2NoZWR1bGUgd2hpbGUgYXRvbWljIgorCSovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKwlmb3IgKHRtcHZwY2lkZXYgPSBWcGNpZGV2TGlzdEhlYWQsIHByZXZ2cGNpZGV2ID0gTlVMTDsgdG1wdnBjaWRldjspIHsKKwkJaWYgKHRtcHZwY2lkZXYtPmRldnR5cGUgIT0gZGV2dHlwZSkKKwkJCURFTF9DT05USU5VRTsKKworCQlpZiAoYWxsKSB7CisJCQlkZWx0aGlzb25lID0KKwkJCSAgICAodG1wdnBjaWRldi0+Z2VuZXJpY19kZXYucGFyZW50ID09IHBhcmVudGJ1cyk7CisJCQkvKiB3ZSdyZSBkZWxldGluZyBhbGwgdmhiYXMgb3Igdm5pY3Mgb24gdGhlCisJCQkgKiBzcGVjaWZpZWQgcGFyZW50IGJ1cworCQkJICovCisJCX0gZWxzZSBpZiAoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpIHsKKwkJCWRlbHRoaXNvbmUgPQorCQkJICAgICgodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4xID09IHd3bm4tPnd3bm4xKSAmJgorCQkJICAgICAodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4yID09IHd3bm4tPnd3bm4yKSk7CisJCQkvKiBkZXZ0eXBlIGlzIHZoYmEsIHdlJ3JlIGRlbGV0aW5nIHZoYmEgd2hvc2UKKwkJCSAqIHd3bm4gbWF0Y2hlcyB0aGUgY3VycmVudCBkZXZpY2UncyB3d25uCisJCQkgKi8KKwkJfSBlbHNlIHsJLyogVklSVE5JQ19UWVBFICovCisJCQlkZWx0aGlzb25lID0KKwkJCSAgICBtZW1jbXAodG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyLCBtYWNhZGRyLAorCQkJCSAgIE1BWF9NQUNBRERSX0xFTikgPT0gMDsKKwkJCS8qIGRldnR5cGUgaXMgdm5pYywgd2UncmUgZGVsZXRpbmcgdm5pYyB3aG9zZQorCQkJKiBtYWNhZGRyIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgbWFjYWRkcgorCQkJKi8KKwkJfQorCisJCWlmICghZGVsdGhpc29uZSkKKwkJCURFTF9DT05USU5VRTsKKworCQkvKiB0YWtlIHZoYmEvdm5pYyBvdXQgb2YgdGhlIGxpc3QgKi8KKwkJaWYgKHByZXZ2cGNpZGV2KQorCQkJLyogbm90IGF0IGhlYWQgKi8KKwkJCXByZXZ2cGNpZGV2LT5uZXh0ID0gdG1wdnBjaWRldi0+bmV4dDsKKwkJZWxzZQorCQkJVnBjaWRldkxpc3RIZWFkID0gdG1wdnBjaWRldi0+bmV4dDsKKworCQkvKiBhZGQgaXQgdG8gb3VyIGRlbGV0ZWxpc3QgKi8KKwkJdG1wdnBjaWRldi0+bmV4dCA9IGRlbGxpc3Q7CisJCWRlbGxpc3QgPSB0bXB2cGNpZGV2OworCisJCWNvdW50Kys7CisJCWlmICghYWxsKQorCQkJYnJlYWs7CS8qIGRvbmUgKi8KKwkJLyogZ29pbmcgdG8gdG9wIG9mIGxvb3AgYWdhaW4gLSBzZXQgdG1wdnBjaWRldiB0byBuZXh0CisJCSAqIG9uZSB3ZSdyZSB0byBwcm9jZXNzCisJCSAqLworCQlpZiAocHJldnZwY2lkZXYpCisJCQl0bXB2cGNpZGV2ID0gcHJldnZwY2lkZXYtPm5leHQ7CisJCWVsc2UKKwkJCXRtcHZwY2lkZXYgPSBWcGNpZGV2TGlzdEhlYWQ7CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKworCWlmICghYWxsICYmIChjb3VudCA9PSAwKSkgeworCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmhiYS92bmljIGluIHRoZSBsaXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogbm93IGRlbGV0ZSBlYWNoIG9uZSBmcm9tIGRlbGV0ZSBsaXN0ICovCisJd2hpbGUgKGRlbGxpc3QpIHsKKwkJLyogc2F2ZSBuZXh0ICovCisJCXRtcHZwY2lkZXYgPSBkZWxsaXN0LT5uZXh0OworCQkvKiBkZWxldGUgdGhlIHZoYmEvdm5pYyBhdCBkZWxsaXN0ICovCisJCURFTEVURV9PTkVfVlBDSURFVihkZWxsaXN0KTsKKwkJLyogZG8gbmV4dCAqLworCQlkZWxsaXN0ID0gdG1wdnBjaWRldjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpcnRwY2lfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2XykKK3sKKwkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKKwkgKiBkZXZpY2UgaXMgcmVtb3ZlZAorCSAqLworCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcmVsZWFzZTolcCAtIE5PVCBZRVQgSU1QTEVNRU5URURcbiIsIGRldl8pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEcml2ZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUga29ial90b19kZXZpY2VfZHJpdmVyKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9kcml2ZXIsIGtvYmopCisjZGVmaW5lIGF0dHJpYnV0ZV90b19kcml2ZXJfYXR0cmlidXRlKG9iaikgXAorCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCB2aXJ0cGNpX2RyaXZlcl9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqZGF0dHIgPSBhdHRyaWJ1dGVfdG9fZHJpdmVyX2F0dHJpYnV0ZShhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUgKmRwcml2YXRlID0gdG9fZHJpdmVyKGtvYmopOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CisJaWYgKGRwcml2YXRlICE9IE5VTEwpCisJCWRyaXZlciA9IGRwcml2YXRlLT5kcml2ZXI7CisJZWxzZQorCQlkcml2ZXIgPSBOVUxMOworCisJREJHSU5GKCJJbiB2aXJ0cGNpX2RyaXZlcl9hdHRyX3Nob3cgZHJpdmVyLT5uYW1lOiVzXG4iLCBkcml2ZXItPm5hbWUpOworCWlmIChkcml2ZXIpIHsKKwkJaWYgKGRhdHRyLT5zaG93KQorCQkJcmV0ID0gZGF0dHItPnNob3coZHJpdmVyLCBidWYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB2aXJ0cGNpX2RyaXZlcl9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICpkYXR0ciA9IGF0dHJpYnV0ZV90b19kcml2ZXJfYXR0cmlidXRlKGF0dHIpOworCXNzaXplX3QgcmV0ID0gMDsKKworCXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSAqZHByaXZhdGUgPSB0b19kcml2ZXIoa29iaik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcjsKKwlpZiAoZHByaXZhdGUgIT0gTlVMTCkKKwkJZHJpdmVyID0gZHByaXZhdGUtPmRyaXZlcjsKKwllbHNlCisJCWRyaXZlciA9IE5VTEw7CisKKwlEQkdJTkYoIkluIHZpcnRwY2lfZHJpdmVyX2F0dHJfc3RvcmUgZHJpdmVyLT5uYW1lOiVzXG4iLCBkcml2ZXItPm5hbWUpOworCisJaWYgKGRyaXZlcikgeworCQlpZiAoZGF0dHItPnN0b3JlKQorCQkJcmV0ID0gZGF0dHItPnN0b3JlKGRyaXZlciwgYnVmLCBjb3VudCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHJlZ2lzdGVyIGEgbmV3IHZpcnRwY2kgZHJpdmVyICovCitpbnQgdmlydHBjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpcnRwY2lfZHJpdmVyICpkcnYpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlEQkdJTkYoIkluIHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyXG4iKTsKKworCWlmIChkcnYtPmlkX3RhYmxlID09IE5VTEwpIHsKKwkJTE9HRVJSKCJpZF90YWJsZSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGluaXRpYWxpemUgY29yZSBkcml2ZXIgZmllbGRzIG5lZWRlZCB0byBjYWxsIGRyaXZlcl9yZWdpc3RlciAqLworCWRydi0+Y29yZV9kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsJLyogbmFtZSBvZiBkcml2ZXIgaW4gc3lzZnMgKi8KKwlkcnYtPmNvcmVfZHJpdmVyLmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOwkvKiB0eXBlIG9mIGJ1cyB0aGlzCisJCQkJCQkJICogZHJpdmVyIHdvcmtzIHdpdGggKi8KKwlkcnYtPmNvcmVfZHJpdmVyLnByb2JlID0gdmlydHBjaV9kZXZpY2VfcHJvYmU7CS8qIGNhbGxlZCB0byBxdWVyeSB0aGUKKwkJCQkJCQkgKiBleGlzdGVuY2Ugb2YgYQorCQkJCQkJCSAqIHNwZWNpZmljIGRldmljZSBhbmQKKwkJCQkJCQkgKiB3aGV0aGVyIHRoaXMgZHJpdmVyCisJCQkJCQkJICpjYW4gd29yayB3aXRoIGl0ICovCisJZHJ2LT5jb3JlX2RyaXZlci5yZW1vdmUgPSB2aXJ0cGNpX2RldmljZV9yZW1vdmU7IC8qIGNhbGxlZCB3aGVuIHRoZQorCQkJCQkJCSAgKiBkZXZpY2UgaXMgcmVtb3ZlZAorCQkJCQkJCSAgKiBmcm9tIHRoZSBzeXN0ZW0gKi8KKwkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KKwlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZV9kcml2ZXIpOworCS8qIGNhbGxzIGJ1c19hZGRfZHJpdmVyIHdoaWNoIGNhbGxzIGRyaXZlcl9hdHRhY2ggYW5kCisJICogbW9kdWxlX2FkZF9kcml2ZXIKKwkgKi8KKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OwkvKiBmYWlsZWQgKi8KKworCWRydi0+Y29yZV9kcml2ZXIucC0+a29iai5rdHlwZSA9ICZ2aXJ0cGNpX2RyaXZlcl9rb2JqX3R5cGU7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyKTsKKwordm9pZCB2aXJ0cGNpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqZHJ2KQoreworCURCR0lORigiSW4gdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlciBkcnY6JXBcbiIsIGRydik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZV9kcml2ZXIpOworCS8qIGRyaXZlcl91bnJlZ2lzdGVyIGNhbGxzIGJ1c19yZW1vdmVfZHJpdmVyCisJICogYnVzX3JlbW92ZV9kcml2ZXIgY2FsbHMgZGV2aWNlX2RldGFjaAorCSAqIGRldmljZV9kZXRhY2ggY2FsbHMgZGV2aWNlX3JlbGVhc2VfZHJpdmVyIGZvciBlYWNoIG9mIHRoZQorCSAqIGRyaXZlcidzIGRldmljZXMKKwkgKiBkZXZpY2VfcmVsZWFzZSBkcml2ZXIgY2FsbHMgZHJ2LT5yZW1vdmUgd2hpY2ggaXMKKwkgKiB2aXJ0cGNpX2RldmljZV9yZW1vdmUKKwkgKiB2aXJ0cGNpX2RldmljZV9yZW1vdmUgY2FsbHMgdmlydGhiYV9yZW1vdmUKKwkgKi8KKwlEQkdJTkYoIkxlYXZpbmdcbiIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2MgZmlsZXN5c3RlbSBmdW5jdGlvbnMJCQkJCQkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBwcmludF92YnVzX2luZm8geworCWludCAqbGVuZ3RoOworCWNoYXIgKmJ1ZjsKK307CisKK3N0YXRpYyBpbnQgcHJpbnRfdmJ1cyhzdHJ1Y3QgZGV2aWNlICp2YnVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcmludF92YnVzX2luZm8gKnAgPSAoc3RydWN0IHByaW50X3ZidXNfaW5mbyAqKSBkYXRhOworCWludCBsID0gKihwLT5sZW5ndGgpOworCisJKihwLT5sZW5ndGgpID0gbCArIHNwcmludGYocC0+YnVmICsgbCwgImJ1c19pZDolc1xuIiwgZGV2X25hbWUodmJ1cykpOworCXJldHVybiAwOwkJLyogbm8gZXJyb3IgKi8KK30KKworc3RhdGljIHNzaXplX3QgaW5mb19wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcHJpbnRfdmJ1c19pbmZvIHByaW50cGFyYW07CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIkNIQU5TT0NLIGlzIG5vdCBkZWZpbmVkLlxuIik7CisKKwlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG4gVmlydHVhbCBQQ0kgQnVzIGRldmljZXNcbiIpOworCXByaW50cGFyYW0ubGVuZ3RoID0gJmxlbmd0aDsKKwlwcmludHBhcmFtLmJ1ZiA9IHZidWY7CisJaWYgKGJ1c19mb3JfZWFjaF9kZXYoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsCisJCQkgICAgICh2b2lkICopICZwcmludHBhcmFtLCBwcmludF92YnVzKSkKKwkJTE9HRVJSKCJkZWxldGUgb2YgYWxsIHZidXMgZmFpbGVkXG4iKTsKKworCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJcbiBWaXJ0dWFsIFBDSSBkZXZpY2VzXG4iKTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJdG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZDsKKwl3aGlsZSAodG1wdnBjaWRldikgeworCQlpZiAodG1wdnBjaWRldi0+ZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpIHsKKwkJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJbJWQ6JWRdIFZIYmE6JTA4eDolMDh4IG1heC1jb25maWc6JWQtJWQtJWQtJWQiLAorCQkJCSAgICB0bXB2cGNpZGV2LT5idXNObywgdG1wdnBjaWRldi0+ZGV2aWNlTm8sCisJCQkJICAgIHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMSwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4yLAorCQkJCSAgICB0bXB2cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbCwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXgubWF4X2lkLAorCQkJCSAgICB0bXB2cGNpZGV2LT5zY3NpLm1heC5tYXhfbHVuLAorCQkJCSAgICB0bXB2cGNpZGV2LT5zY3NpLm1heC5jbWRfcGVyX2x1bik7CisJCX0gZWxzZSB7CisJCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiWyVkOiVkXSBWTmljOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IG51bV9yY3ZfYnVmczolZCBtdHU6JWQiLAorCQkJCSAgICB0bXB2cGNpZGV2LT5idXNObywgdG1wdnBjaWRldi0+ZGV2aWNlTm8sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkclswXSwKKwkJCQkgICAgdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzFdLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbMl0sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkclszXSwKKwkJCQkgICAgdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzRdLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbNV0sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5udW1fcmN2X2J1ZnMsCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tdHUpOworCQl9CisJCWxlbmd0aCArPQorCQkgICAgc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiIGNoYW5wdHI6JXBcbiIsCisJCQkgICAgdG1wdnBjaWRldi0+cXVldWVpbmZvLmNoYW4pOworCQl0bXB2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dDsKKwl9CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlsZW5ndGggKz0KKwkgICAgc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG5Nb2R1bGUgYnVpbGQ6IERhdGU6JXMgVGltZTolc1xuIiwgX19EQVRFX18sCisJCSAgICBfX1RJTUVfXyk7CisKKwlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG4iKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHNzaXplX3QgdmlydF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzE2XTsKKwlpbnQgdHlwZSwgaSwgYWN0aW9uID0gMHhmZmZmOworCXVuc2lnbmVkIGludCBidXNubywgZGV2aWNlbm87CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOworCXN0cnVjdCBhZGRfdmJ1c19ndWVzdHBhcnQgYnVzYWRkcGFyYW1zOworCXN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgYWRkcGFyYW1zOworCXN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgYnVzZGVscGFyYW1zOworCXN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgZGVscGFyYW1zOworCUdVSUQgZHVtbXlHdWlkID0gR1VJRDA7CisjaWZkZWYgU1RPUkFHRV9DSEFOTkVMCisJVTY0IHN0b3JhZ2VjaGFubmVsOworI2VuZGlmCisKKyNkZWZpbmUgUFJJTlRfVVNBR0VfUkVUVVJOIHtcCisJTE9HRVJSKCJ1c2FnZTogMC0wLTxjaGFucHRyPgkJCQkJPT0+IGRlbGV0ZSB2aGJhXG4iKTsgXAorCUxPR0VSUigidXNhZ2U6IDAtMS08Y2hhbnB0cj4tPGJ1c05vPi08ZGV2aWNlTm8+CT09PiBhZGQgdmhiYVxuIik7IFwKKwlMT0dFUlIoInVzYWdlOiAwLWYtPGJ1c05vPgkJCQkJCT09PiBkZWxldGUgYWxsIHZoYmFzXG4iKTsgXAorCUxPR0VSUigiXG4iKTsgXAorCUxPR0VSUigidXNhZ2U6IDEtMC08Y2hhbnB0cj4JCQkJCT09PiBkZWxldGUgdm5pY1xuIik7IFwKKwlMT0dFUlIoInVzYWdlOiAxLTEtPGNoYW5wdHI+LTxidXNObz4tPGRldmljZU5vPgk9PT4gYWRkIHZuaWNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogMS1mLTxidXNObz4JCQkJCQk9PT4gZGVsZXRlIGFsbCB2bmljc1xuIik7IFwKKwlMT0dFUlIoIlxuIik7IFwKKwlMT0dFUlIoInVzYWdlOiA2LTAtPGJ1c05vPgkJCQkJCT09PiBkZWxldGUgdmJ1c1xuIik7IFwKKwlMT0dFUlIoInVzYWdlOiA2LTEtPGJ1c05vPgkJCQkJCT09PiBhZGQgdmJ1c1xuIik7IFwKKwlMT0dFUlIoInVzYWdlOiA2LWYJCQkJCQkJCT09PiBkZWxldGUgYWxsIHZidXNlc1xuIik7IFwKKwlMT0dFUlIoInVzYWdlOiA5OC08YnVzTm8+LTxkZXZpY2VObz4JCQk9PT4gSU5KRUNUIENsaWVudCBkZWxldGUgdm5pY1xuIik7IFwKKwlMT0dFUlIoInVzYWdlOiA5OS08Y2hhbnB0cj4tPGJ1c05vPi08ZGV2aWNlTm8+CT09PiBJTkpFQ1QgQ2xpZW50IGFkZCB2bmljXG4iKTsgXAorCXJldHVybiAtRUlOVkFMOyBcCit9CisKKwlpZiAoY291bnQgPj0gQVJSQVlfU0laRShidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXgiLCAmdHlwZSwgJmFjdGlvbik7CisJaWYgKGkgPCAyKQorCQlQUklOVF9VU0FHRV9SRVRVUk47CisKKwlpZiAodHlwZSA9PSAweDk4KSB7CisJCS8qIGNsaWVudCBpbmplY3QgZGVsZXRlIHZuaWMgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0lZC0lZCIsICZ0eXBlLCAmYnVzbm8sICZkZXZpY2Vubyk7CisJCWlmIChpICE9IDMpCisJCQlQUklOVF9VU0FHRV9SRVRVUk47CisJCXVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92bmljKGJ1c25vLCBkZXZpY2Vubyk7CisJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCX0gZWxzZSBpZiAodHlwZSA9PSAweDk5KSB7CisJCS8qIGNsaWVudCBpbmplY3QgYWRkIHZuaWMgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0lcC0lZC0lZCIsICZ0eXBlLCAmY2hhbnB0ciwgJmJ1c25vLAorCQkJICAgJmRldmljZW5vKTsKKwkJaWYgKGkgIT0gNCkKKwkJCVBSSU5UX1VTQUdFX1JFVFVSTjsKKwkJaWYgKCF1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdm5pYyhidXNubywgZGV2aWNlbm8sCisJCQkJCQkgICBfX3BhKGNoYW5wdHIpLAorCQkJCQkJICAgTUlOX0lPX0NIQU5ORUxfU0laRSwKKwkJCQkJCSAgIDEsIC8qIHRlc3QgbXNnICovCisJCQkJCQkgICBkdW1teUd1aWQsIC8qIGluc3QgZ3VpZCAqLworCQkJCQkJICAgTlVMTCkpIHsgLyppbnRlcnJ1cHQgaW5mbyAqLworCQkJTE9HRVJSKCJGQUlMRUQgdG8gaW5qZWN0IGFkZCB2bmljXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCX0KKworCWlmICgodHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmICh0eXBlICE9IFZJUlROSUNfVFlQRSkKKwkgICAgJiYgKHR5cGUgIT0gVklSVEJVU19UWVBFKSkKKwkJUFJJTlRfVVNBR0VfUkVUVVJOOworCisJaWYgKHR5cGUgPT0gVklSVEJVU19UWVBFKSB7CisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXgtJWQiLCAmdHlwZSwgJmFjdGlvbiwgJmJ1c25vKTsKKwkJc3dpdGNoIChhY3Rpb24pIHsKKwkJY2FzZSAwOgorCQkJLyogZGVsZXRlIHZidXMgKi8KKwkJCWlmIChpICE9IDMpCisJCQkJYnJlYWs7CisJCQlidXNkZWxwYXJhbXMuYnVzTm8gPSBidXNubzsKKwkJCWlmIChkZWxldGVfdmJ1cygmYnVzZGVscGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJCXJldHVybiAtRUZBVUxUOworCisJCWNhc2UgMToKKwkJCS8qIGFkZCB2YnVzICovCisJCQlpZiAoaSAhPSAzKQorCQkJCWJyZWFrOworCQkJYnVzYWRkcGFyYW1zLmNoYW5wdHIgPSBOVUxMOwkvKiBOT1QgWUVUIFVTRUQgKi8KKwkJCWJ1c2FkZHBhcmFtcy5idXNObyA9IGJ1c25vOworCQkJaWYgKGFkZF92YnVzKCZidXNhZGRwYXJhbXMpKQorCQkJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY2FzZSAweGY6CisJCQkvKiBkZWxldGUgYWxsIHZidXNlcyBhbmQgYWxsIHZoYmFzL3ZuaWNzIG9uIHRoZSBidXNlcyAqLworCQkJaWYgKGkgIT0gMikKKwkJCQlicmVhazsKKwkJCWRlbGV0ZV9hbGwoKTsKKwkJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJUFJJTlRfVVNBR0VfUkVUVVJOOworCX0KKworCS8qIGlmICh0eXBlID09IFZJUlROSUNfVFlQRSkgb3IgICAgICAgICBpZiAodHlwZSA9PSBWSVJUSEJBX1RZUEUpICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIDA6CisJCS8qIGRlbGV0ZSB2aGJhL3ZuaWMgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0leC0lcCIsICZ0eXBlLCAmYWN0aW9uLCAmY2hhbnB0cik7CisJCWlmIChpICE9IDMpCisJCQlicmVhazsKKwkJZGVscGFyYW1zLmNoYW5wdHIgPSBjaGFucHRyOworCQlpZiAodHlwZSA9PSBWSVJUSEJBX1RZUEUpIHsKKwkJCWlmIChkZWxldGVfdmhiYSgmZGVscGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChkZWxldGVfdm5pYygmZGVscGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJfQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNhc2UgMToKKwkJLyogYWRkIHZoYmEvdm5pYyAqLworCQlpID0gc3NjYW5mKGJ1ZiwgIiV4LSV4LSVwLSVkLSVkIiwgJnR5cGUsICZhY3Rpb24sICZjaGFucHRyLAorCQkJICAgJmJ1c25vLCAmZGV2aWNlbm8pOworCQlpZiAoaSAhPSA1KQorCQkJYnJlYWs7CisJCWFkZHBhcmFtcy5jaGFucHRyID0gY2hhbnB0cjsKKwkJYWRkcGFyYW1zLmJ1c05vID0gYnVzbm87CisJCWFkZHBhcmFtcy5kZXZpY2VObyA9IGRldmljZW5vOworCQlpZiAodHlwZSA9PSBWSVJUSEJBX1RZUEUpIHsKKwkJCWlmIChhZGRfdmhiYSgmYWRkcGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChhZGRfdm5pYygmYWRkcGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJfQorCQlyZXR1cm4gLUVGQVVMVDsKKworI2lmZGVmIFNUT1JBR0VfQ0hBTk5FTAorCWNhc2UgMjoKKwkJLyogYWRkIHZoYmEgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0leC0lZC0lZCIsICZ0eXBlLCAmYWN0aW9uLCAmYnVzbm8sCisJCQkgICAmZGV2aWNlbm8pOworCQlpZiAoaSAhPSA0KQorCQkJYnJlYWs7CisJCXN0b3JhZ2VjaGFubmVsID0gdWlzbGliX3N0b3JhZ2VfY2hhbm5lbCgwKTsJLyogR2V0IG15IHN0b3JhZ2UgY2hhbm5lbCAqLworCQkvKiBpb3JlbWFwX2NhY2hlIGl0IG5vdyAqLworCQlhZGRwYXJhbXMuY2hhbnB0ciA9CisJCSAgICAodm9pZCAqKSBpb3JlbWFwX2NhY2hlKHN0b3JhZ2VjaGFubmVsLCBJT19DSEFOTkVMX1NJWkUpOworCQlpZiAoYWRkcGFyYW1zLmNoYW5wdHIgPT0gTlVMTCkgeworCQkJTE9HRVJSKCJGYWlsdXJlIHRvIGdldCByZW1hcCBzdG9yYWdlIGNoYW5uZWwuXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWFkZHBhcmFtcy5idXNObyA9IGJ1c25vOworCQlhZGRwYXJhbXMuZGV2aWNlTm8gPSBkZXZpY2VubzsKKwkJaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlpZiAoYWRkX3ZoYmEoJmFkZHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisjZW5kaWYKKwljYXNlIDB4ZjoKKwkJLyogZGVsZXRlIGFsbCB2aGJhcy92bmljcyAqLworCQlpID0gc3NjYW5mKGJ1ZiwgIiV4LSV4LSVkIiwgJnR5cGUsICZhY3Rpb24sICZidXNubyk7CisJCWlmIChpICE9IDMpCisJCQlicmVhazsKKwkJYnVzZGVscGFyYW1zLmJ1c05vID0gYnVzbm87CisJCWRlbGV0ZV9hbGxfdmlydCh0eXBlLCAmYnVzZGVscGFyYW1zKTsKKwkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCVBSSU5UX1VTQUdFX1JFVFVSTjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIEluaXQgJiBFeGl0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCB2aXJ0cGNpX21vZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCisJTE9HSU5GKCJNb2R1bGUgYnVpbGQ6IERhdGU6JXMgVGltZTolcy4uLlxuIiwgX19EQVRFX18sIF9fVElNRV9fKTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJcmV0ID0gYnVzX3JlZ2lzdGVyKCZ2aXJ0cGNpX2J1c190eXBlKTsKKwkvKiBjcmVhdGVzIC9zeXMvYnVzL3Vpc3ZpcnRwY2kgd2hpY2ggY29udGFpbnMgZGV2aWNlcyAmCisJICogZHJpdmVycyBkaXJlY3RvcnkKKwkgKi8KKwlpZiAocmV0KSB7CisJCUxPR0VSUigiYnVzX3JlZ2lzdGVyICoqKipGQUlMRUQ6JWRcbiIsIHJldCk7CisJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgcmV0LAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm4gcmV0OworCX0KKwlEQkdJTkYoImJ1c19yZWdpc3RlciBzdWNjZXNzZnVsXG4iKTsKKwlCdXNEZXZpY2VJbmZvX0luaXQoJkJ1c19Ecml2ZXJJbmZvLAorCQkJICAgImNsaWVudGJ1cyIsICJ2aXJ0cGNpIiwKKwkJCSAgIFZFUlNJT04sIE5VTEwsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwkvKiBjcmVhdGUgYSByb290IGJ1cyB1c2VkIHRvIHBhcmVudCBhbGwgdGhlIHZpcnRwY2kgYnVzZXMuICovCisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKKwlpZiAocmV0KSB7CisJCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIEZBSUxFRDolZFxuIiwgcmV0KTsKKwkJYnVzX3VucmVnaXN0ZXIoJnZpcnRwY2lfYnVzX3R5cGUpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJREJHSU5GKCJkZXZpY2VfcmVnaXN0ZXIgc3VjY2Vzc2Z1bCByZXQ6JXhcbiIsIHJldCk7CisKKwlpZiAoIXVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIoMiwgKHZvaWQgKikgJnZpcnRwY2lfY3RybGNoYW5fZnVuYywKKwkJCQkJICAmQ2hpcHNldF9Ecml2ZXJJbmZvKSkgeworCQlMT0dFUlIoInVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIgKioqKkZBSUxFRC5cbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKKwkJYnVzX3VucmVnaXN0ZXIoJnZpcnRwY2lfYnVzX3R5cGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJTE9HSU5GKCJzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCB2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMgKDB4JXApIGFzIGNhbGxiYWNrLlxuIiwKKwkgICAgICh2b2lkICopICZ2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMpOworCS8qIGNyZWF0ZSB0aGUgcHJvYyBkaXJlY3RvcmllcyAqLworCXZpcnRwY2lfcHJvY19kaXIgPSBwcm9jX21rZGlyKERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKwl2aXJ0X3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShWSVJUX1BST0NfRU5UUllfRk4sIDAsIHZpcnRwY2lfcHJvY19kaXIsCisJCQkJICAgICAgJnByb2NfdmlydF9mb3BzKTsKKwlpbmZvX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShJTkZPX1BST0NfRU5UUllfRk4sIDAsIHZpcnRwY2lfcHJvY19kaXIsCisJCQkJICAgICAgJnByb2NfaW5mb19mb3BzKTsKKwlMT0dJTkYoIkxlYXZpbmdcbiIpOworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2aXJ0cGNpX21vZF9leGl0KHZvaWQpCit7CisJTE9HSU5GKCJ2aXJ0cGNpX21vZF9leGl0Li4uXG4iKTsKKworCS8qIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJaWYgKCF1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKDIsIE5VTEwsIE5VTEwpKQorCQlMT0dFUlIoInVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIgKioqKkZBSUxFRC5cbiIpOworCisJZGV2aWNlX3VucmVnaXN0ZXIoJnZpcnRwY2lfcm9vdGJ1c19kZXZpY2UpOworCWJ1c191bnJlZ2lzdGVyKCZ2aXJ0cGNpX2J1c190eXBlKTsKKworCWlmICh2aXJ0X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFZJUlRfUFJPQ19FTlRSWV9GTiwgdmlydHBjaV9wcm9jX2Rpcik7CisKKwlpZiAoaW5mb19wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShJTkZPX1BST0NfRU5UUllfRk4sIHZpcnRwY2lfcHJvY19kaXIpOworCisJaWYgKHZpcnRwY2lfcHJvY19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKworCUxPR0lORigiTGVhdmluZ1xuIik7CisKK30KKworbW9kdWxlX2luaXQodmlydHBjaV9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdCh2aXJ0cGNpX21vZF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlVzaGEgU3Jpbml2YXNhbiIpOworTU9EVUxFX0FMSUFTKCJ1aXN2aXJ0cGNpIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS92aXJ0cGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmQwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKiB2aXJ0cGNpLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBVbmlzeXMgVmlydHVhbCBQQ0kgZHJpdmVyIGhlYWRlcgorICovCisKKyNpZm5kZWYgX19WSVJUUENJX0hfXworI2RlZmluZSBfX1ZJUlRQQ0lfSF9fCisKKyNpbmNsdWRlICJ1aXNxdWV1ZS5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJUlRIQkEgMHhBQTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklSVE5JQyAweEFCMDAKKworc3RydWN0IHNjc2lfYWRhcF9pbmZvIHsKKwl2b2lkICpzY3NpaG9zdDsJCS8qIHNjc2kgaG9zdCBpZiB0aGlzIGRldmljZSBpcyBhIHNjc2kgaGJhICovCisJc3RydWN0IHZoYmFfd3dubiB3d25uOwkvKiB0aGUgd29ybGQgd2lkZSBub2RlIG5hbWUgb2YgdmhiYSAqLworCXN0cnVjdCB2aGJhX2NvbmZpZ19tYXggbWF4OwkvKiB2YXJpb3VzIG1heCBzcGVjaWZpY2F0aW9ucyB1c2VkCisJCQkJCSAqIHRvIGNvbmZpZyB2aGJhICovCit9OworCitzdHJ1Y3QgbmV0X2FkYXBfaW5mbyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogbmV0d29yayBkZXZpY2UgaWYgdGhpcworCQkJCQkgKiBkZXZpY2UgaXMgYSBOSUMgKi8KKwl1OCBtYWNfYWRkcltNQVhfTUFDQUREUl9MRU5dOworCWludCBudW1fcmN2X2J1ZnM7CisJdW5zaWduZWQgbXR1OworCUdVSUQgem9uZUd1aWQ7Cit9OworCit0eXBlZGVmIGVudW0geworCVZJUlRIQkFfVFlQRSA9IDAsCisJVklSVE5JQ19UWVBFID0gMSwKKwlWSVJUQlVTX1RZUEUgPSA2LAorfSBWSVJUUENJX0RFVl9UWVBFOworCitzdHJ1Y3QgdmlydHBjaV9kZXYgeworCVZJUlRQQ0lfREVWX1RZUEUgZGV2dHlwZTsJLyogaW5kaWNhdGVzIHR5cGUgb2YgdGhlCisJCQkJCSAqIHZpcnR1YWwgcGNpIGRldmljZSAqLworCXN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqbXlkcml2ZXI7CS8qIHdoaWNoIGRyaXZlciBoYXMgYWxsb2NhdGVkCisJCQkJCQkgKiB0aGlzIGRldmljZSAqLworCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsJLyogdmVuZG9yIGlkIGZvciBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7CS8qIGRldmljZSBpZCBmb3IgZGV2aWNlICovCisJVTMyIGJ1c05vOwkJLyogbnVtYmVyIG9mIGJ1cyBvbiB3aGljaCBkZXZpY2UgZXhpc3RzICovCisJVTMyIGRldmljZU5vOwkJLyogZGV2aWNlJ3MgbnVtYmVyIG9uIHRoZSBidXMgKi8KKwlzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOwkvKiBpbnRlcnJ1cHQgaW5mbyAqLworCXN0cnVjdCBkZXZpY2UgZ2VuZXJpY19kZXY7CS8qIGdlbmVyaWMgZGV2aWNlICovCisJdW5pb24geworCQlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKwkJc3RydWN0IG5ldF9hZGFwX2luZm8gbmV0OworCX07CisKKwlzdHJ1Y3QgdWlzcXVldWVfaW5mbyBxdWV1ZWluZm87CS8qIGhvbGRzIHB0ciB0byBjaGFubmVsIHdoZXJlIGNtZHMgJgorCQkJCQkgKiByc3BzIGFyZSBxdWV1ZWQgJiByZXRyaWV2ZWQgKi8KKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKm5leHQ7CS8qIHBvaW50cyB0byBuZXh0IHZpcnRwY2kgZGV2aWNlICovCit9OworCitzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwljb25zdCBjaGFyICpuYW1lOwkvKiB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyIGluIHN5c2ZzICovCisJY29uc3QgY2hhciAqdmVyc2lvbjsKKwljb25zdCBjaGFyICp2ZXJ0YWc7CisJY29uc3QgY2hhciAqYnVpbGRfZGF0ZTsKKwljb25zdCBjaGFyICpidWlsZF90aW1lOworCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZF90YWJsZTsJLyogbXVzdCBiZSBub24tTlVMTCBmb3IgcHJvYmUKKwkJCQkJCSAqIHRvIGJlIGNhbGxlZCAqLworCWludCAoKnByb2JlKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsgLyogZGV2aWNlIGluc2VydGVkICovCisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpOyAvKiBEZXZpY2UgcmVtb3ZlZCAoTlVMTCBpZgorCQkJCQkJICAgICogbm90IGEgaG90LXBsdWcgY2FwYWJsZQorCQkJCQkJICAgICogZHJpdmVyKSAqLworCWludCAoKnN1c3BlbmQpKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2LAorCQkJdTMyIHN0YXRlKTsJCSAgIC8qIERldmljZSBzdXNwZW5kZWQgKi8KKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2KTsJLyogRGV2aWNlIHdva2VuIHVwICovCisJaW50ICgqZW5hYmxlX3dha2UpKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2LAorCQkJICAgIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSk7CS8qIEVuYWJsZSB3YWtlIGV2ZW50ICovCisJc3RydWN0IGRldmljZV9kcml2ZXIgY29yZV9kcml2ZXI7CS8qIFZJUlRQQ0kgY29yZSBmaWxscyB0aGlzIGluICovCit9OworCisjZGVmaW5lCWRyaXZlcl90b192aXJ0cGNpX2RyaXZlcihpbl9kcnYpIFwKKwljb250YWluZXJfb2YoaW5fZHJ2LCBzdHJ1Y3QgdmlydHBjaV9kcml2ZXIsIGNvcmVfZHJpdmVyKQorI2RlZmluZSBkZXZpY2VfdG9fdmlydHBjaV9kZXYoaW5fZGV2KSBcCisJY29udGFpbmVyX29mKGluX2Rldiwgc3RydWN0IHZpcnRwY2lfZGV2LCBnZW5lcmljX2RldikKKworaW50IHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqKTsKK3ZvaWQgdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKik7CisKKyNlbmRpZiAvKiBfX1ZJUlRQQ0lfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWMzYjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACisjCisjIFVuaXN5cyB2aXNvcmNoYW5uZWwgY29uZmlndXJhdGlvbgorIworCitjb25maWcgVU5JU1lTX1ZJU09SQ0hBTk5FTAorCXRyaXN0YXRlICJVbmlzeXMgdmlzb3JjaGFubmVsIGRyaXZlciIKKwlkZXBlbmRzIG9uIFVOSVNZU1NQQVIgJiYgVU5JU1lTX1ZJU09SVVRJTAorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlzb3JjaGFubmVsIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA2MGJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHZpc29yY2hhbm5lbAorIworCitvYmotJChDT05GSUdfVU5JU1lTX1ZJU09SQ0hBTk5FTCkJKz0gdmlzb3JjaGFubmVsLm8KKwordmlzb3JjaGFubmVsLXkgOj0gdmlzb3JjaGFubmVsX21haW4ubyB2aXNvcmNoYW5uZWxfZnVuY3MubworCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbAorY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4ZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL2dsb2JhbHMuaApAQCAtMCwwICsxLDI5IEBACisvKiBnbG9iYWxzLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WSVNPUkNIQU5ORUxfR0xPQkFMU19IX18KKyNkZWZpbmUgX19WSVNPUkNIQU5ORUxfR0xPQkFMU19IX18KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgIm1lbXJlZ2lvbi5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hhbm5lbCIKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiB2aXNvcmNoYW5uZWwuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1ZJU09SQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19WSVNPUkNIQU5ORUxfSF9fCisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgIm1lbXJlZ2lvbi5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpZm5kZWYgSE9TVEFERFJFU1MKKyNkZWZpbmUgSE9TVEFERFJFU1MgVTY0CisjZW5kaWYKKyNpZm5kZWYgQk9PTAorI2RlZmluZSBCT09MIGludAorI2VuZGlmCisKKy8qIFZJU09SQ0hBTk5FTCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVklTT1JDSEFOTkVMX1RhZyBWSVNPUkNIQU5ORUw7CisKKy8qIE5vdGUgdGhhdCBmb3Igdmlzb3JjaGFubmVsX2NyZWF0ZSgpIGFuZCB2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWQoKSwKKyAqIDxjaGFubmVsQnl0ZXM+IGFuZCA8Z3VpZD4gYXJndW1lbnRzIG1heSBiZSAwIGlmIHdlIGFyZSBhIGNoYW5uZWwgQ0xJRU5ULgorICogSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmVhZCBmcm9tIHRoZSBjaGFubmVsIGhlYWRlci4KKyAqLworVklTT1JDSEFOTkVMICp2aXNvcmNoYW5uZWxfY3JlYXRlKEhPU1RBRERSRVNTIHBoeXNhZGRyLAorCQkJCSAgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpOworVklTT1JDSEFOTkVMICp2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWQodWxvbmcgY2hhbm5lbEJ5dGVzLAorCQkJCQkgICAgIFZJU09SQ0hBTk5FTCAqcGFyZW50LCB1bG9uZyBvZmYsCisJCQkJCSAgICAgR1VJRCBndWlkKTsKK1ZJU09SQ0hBTk5FTCAqdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2soSE9TVEFERFJFU1MgcGh5c2FkZHIsCisJCQkJCSAgICB1bG9uZyBjaGFubmVsQnl0ZXMsIEdVSUQgZ3VpZCk7CitWSVNPUkNIQU5ORUwgKnZpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZF93aXRoX2xvY2sodWxvbmcgY2hhbm5lbEJ5dGVzLAorCQkJCQkJICAgICAgIFZJU09SQ0hBTk5FTCAqcGFyZW50LAorCQkJCQkJICAgICAgIHVsb25nIG9mZiwgR1VJRCBndWlkKTsKK3ZvaWQgdmlzb3JjaGFubmVsX2Rlc3Ryb3koVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK2ludCB2aXNvcmNoYW5uZWxfcmVhZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcyk7CitpbnQgdmlzb3JjaGFubmVsX3dyaXRlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICAgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcyk7CitpbnQgdmlzb3JjaGFubmVsX2NsZWFyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICAgICAgVTggY2gsIHVsb25nIG5ieXRlcyk7CitCT09MIHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsIHZvaWQgKm1zZyk7CitCT09MIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsIHZvaWQgKm1zZyk7CitpbnQgdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlKTsKK2ludCB2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlKTsKKworSE9TVEFERFJFU1Mgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOwordWxvbmcgdmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK2NoYXIgKnZpc29yY2hhbm5lbF9pZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGNoYXIgKnMpOworY2hhciAqdmlzb3JjaGFubmVsX3pvbmVpZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGNoYXIgKnMpOworVTY0IHZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCk7CitHVUlEIHZpc29yY2hhbm5lbF9nZXRfR1VJRChWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOworTUVNUkVHSU9OICp2aXNvcmNoYW5uZWxfZ2V0X21lbXJlZ2lvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOworY2hhciAqdmlzb3JjaGFubmVsX0dVSURfaWQoR1VJRCAqZ3VpZCwgY2hhciAqcyk7Cit2b2lkIHZpc29yY2hhbm5lbF9kZWJ1ZyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGludCBuUXVldWVzLAorCQkJc3RydWN0IHNlcV9maWxlICpzZXEsIFUzMiBvZmYpOwordm9pZCB2aXNvcmNoYW5uZWxfZHVtcF9zZWN0aW9uKFZJU09SQ0hBTk5FTCAqY2hhbiwgY2hhciAqcywKKwkJCSAgICAgICBpbnQgb2ZmLCBpbnQgbGVuLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7Cit2b2lkICp2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOworCisjZGVmaW5lCVZJU09SQ0hBTk5FTF9DSEFOR0VfU0VSVkVSX1NUQVRFKGNoYW4sIGNoYW5JZCwgbmV3c3RhdGUpCVwKKwlkbyB7CQkJCQkJCQlcCisJCVU4ICpwID0gKFU4ICopdmlzb3JjaGFubmVsX2dldF9oZWFkZXIoY2hhbik7CQlcCisJCWlmIChwKSB7CQkJCQkJXAorCQkJVUxUUkFfQ0hBTk5FTF9TRVJWRVJfVFJBTlNJVElPTihwLCBjaGFuSWQsIFNydlN0YXRlLCBcCisJCQkJCQkJbmV3c3RhdGUsIGxvZ0N0eCk7IFwKKwkJCXZpc29yY2hhbm5lbF93cml0ZQkJCQlcCisJCQkJKGNoYW4sCQkJCQlcCisJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIFNydlN0YXRlKSwgXAorCQkJCSBwICsJCQkJCVwKKwkJCQkgb2Zmc2V0b2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCwgU3J2U3RhdGUpLCBcCisJCQkJIHNpemVvZihVMzIpKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lCVZJU09SQ0hBTk5FTF9DSEFOR0VfQ0xJRU5UX1NUQVRFKGNoYW4sIGNoYW5JZCwgbmV3c3RhdGUpCVwKKwlkbyB7CQkJCQkJCQlcCisJCVU4ICpwID0gKFU4ICopdmlzb3JjaGFubmVsX2dldF9oZWFkZXIoY2hhbik7CQlcCisJCWlmIChwKSB7CQkJCQkJXAorCQkJVUxUUkFfQ0hBTk5FTF9DTElFTlRfVFJBTlNJVElPTihwLCBjaGFuSWQsCVwKKwkJCQkJCQluZXdzdGF0ZSwgbG9nQ3R4KTsgXAorCQkJdmlzb3JjaGFubmVsX3dyaXRlCQkJCVwKKwkJCQkoY2hhbiwJCQkJCVwKKwkJCQkgb2Zmc2V0b2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCwgQ2xpU3RhdGVPUyksIFwKKwkJCQkgcCArCQkJCQlcCisJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIENsaVN0YXRlT1MpLCBcCisJCQkJIHNpemVvZihVMzIpKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9mdW5jcy5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsX2Z1bmNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzNjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9mdW5jcy5jCkBAIC0wLDAgKzEsNjc0IEBACisvKiB2aXNvcmNoYW5uZWxfZnVuY3MuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoKKyAqICBUaGlzIHByb3ZpZGVzIFN1cGVydmlzb3IgY2hhbm5lbCBjb21tdW5pY2F0aW9uIHByaW1pdGl2ZXMsIHdoaWNoIGFyZQorICogIGluZGVwZW5kZW50IG9mIHRoZSBtZWNoYW5pc20gdXNlZCB0byBhY2Nlc3MgdGhlIGNoYW5uZWwgZGF0YS4gIEFsbCBjaGFubmVsCisgKiAgZGF0YSBpcyBhY2Nlc3NlZCB1c2luZyB0aGUgbWVtcmVnaW9uIGFic3RyYWN0aW9uLiAgKG1lbXJlZ2lvbiBoYXMgYm90aAorICogIGEgQ00yIGltcGxlbWVudGF0aW9uIGFuZCBhIGRpcmVjdCBtZW1vcnkgaW1wbGVtZW50YXRpb24uKQorICovCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAidmlzb3JjaGFubmVsLmgiCisjaW5jbHVkZSAiZ3VpZHV0aWxzLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJ2aXNvcmNoYW5uZWwiCisKK3N0cnVjdCBWSVNPUkNIQU5ORUxfVGFnIHsKKwlNRU1SRUdJT04gKm1lbXJlZ2lvbjsJLyogZnJvbSB2aXNvcl9tZW1yZWdpb25fY3JlYXRlKCkgKi8KKwlDSEFOTkVMX0hFQURFUiBjaGFuX2hkcjsKKwlHVUlEIGd1aWQ7CisJdWxvbmcgc2l6ZTsKKwlCT09MIG5lZWRzX2xvY2s7CisJc3BpbmxvY2tfdCBpbnNlcnRfbG9jazsKKwlzcGlubG9ja190IHJlbW92ZV9sb2NrOworCisJc3RydWN0IHsKKwkJU0lHTkFMX1FVRVVFX0hFQURFUiByZXFfcXVldWU7CisJCVNJR05BTF9RVUVVRV9IRUFERVIgcnNwX3F1ZXVlOworCQlTSUdOQUxfUVVFVUVfSEVBREVSIGV2ZW50X3F1ZXVlOworCQlTSUdOQUxfUVVFVUVfSEVBREVSIGFja19xdWV1ZTsKKwl9IHNhZmVfdWlzX3F1ZXVlOworfTsKKworLyogQ3JlYXRlcyB0aGUgVklTT1JDSEFOTkVMIGFic3RyYWN0aW9uIGZvciBhIGRhdGEgYXJlYSBpbiBtZW1vcnksIGJ1dCBkb2VzCisgKiBOT1QgbW9kaWZ5IHRoaXMgZGF0YSBhcmVhLgorICovCitzdGF0aWMgVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhIT1NUQUREUkVTUyBwaHlzYWRkciwgdWxvbmcgY2hhbm5lbEJ5dGVzLAorCQkJIFZJU09SQ0hBTk5FTCAqcGFyZW50LCB1bG9uZyBvZmYsIEdVSUQgZ3VpZCwKKwkJCSBCT09MIG5lZWRzX2xvY2spCit7CisJVklTT1JDSEFOTkVMICpwID0gTlVMTDsKKwl2b2lkICpyYyA9IE5VTEw7CisKKwlwID0ga21hbGxvYyhzaXplb2YoVklTT1JDSEFOTkVMKSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCUVSUkRSVigiYWxsb2NhdGlvbiBmYWlsZWQ6IChzdGF0dXM9MClcbiIpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJcC0+bWVtcmVnaW9uID0gTlVMTDsKKwlwLT5uZWVkc19sb2NrID0gbmVlZHNfbG9jazsKKwlzcGluX2xvY2tfaW5pdCgmcC0+aW5zZXJ0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwLT5yZW1vdmVfbG9jayk7CisKKwkvKiBwcmVwYXJlIGNoYW5faGRyIChhYnN0cmFjdGlvbiB0byByZWFkL3dyaXRlIGNoYW5uZWwgbWVtb3J5KSAqLworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcC0+bWVtcmVnaW9uID0KKwkJICAgIHZpc29yX21lbXJlZ2lvbl9jcmVhdGUocGh5c2FkZHIsIHNpemVvZihDSEFOTkVMX0hFQURFUikpOworCWVsc2UKKwkJcC0+bWVtcmVnaW9uID0KKwkJICAgIHZpc29yX21lbXJlZ2lvbl9jcmVhdGVfb3ZlcmxhcHBlZChwYXJlbnQtPm1lbXJlZ2lvbiwKKwkJCQkJCSAgICAgIG9mZiwKKwkJCQkJCSAgICAgIHNpemVvZihDSEFOTkVMX0hFQURFUikpOworCWlmIChwLT5tZW1yZWdpb24gPT0gTlVMTCkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9jcmVhdGUgZmFpbGVkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAodmlzb3JfbWVtcmVnaW9uX3JlYWQocC0+bWVtcmVnaW9uLCAwLCAmcC0+Y2hhbl9oZHIsCisJCQkJIHNpemVvZihDSEFOTkVMX0hFQURFUikpIDwgMCkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoY2hhbm5lbEJ5dGVzID09IDApCisJCS8qIHdlIGhhZCBiZXR0ZXIgYmUgYSBDTElFTlQgb2YgdGhpcyBjaGFubmVsICovCisJCWNoYW5uZWxCeXRlcyA9ICh1bG9uZykgcC0+Y2hhbl9oZHIuU2l6ZTsKKwlpZiAoU1RSVUNUU0VRVUFMKGd1aWQsIEd1aWQwKSkKKwkJLyogd2UgaGFkIGJldHRlciBiZSBhIENMSUVOVCBvZiB0aGlzIGNoYW5uZWwgKi8KKwkJZ3VpZCA9IHAtPmNoYW5faGRyLlR5cGU7CisJaWYgKHZpc29yX21lbXJlZ2lvbl9yZXNpemUocC0+bWVtcmVnaW9uLCBjaGFubmVsQnl0ZXMpIDwgMCkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZXNpemUgZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCXAtPnNpemUgPSBjaGFubmVsQnl0ZXM7CisJcC0+Z3VpZCA9IGd1aWQ7CisKKwlyYyA9IHA7CitBd2F5OgorCisJaWYgKHJjID09IE5VTEwpIHsKKwkJaWYgKHAgIT0gTlVMTCkgeworCQkJdmlzb3JjaGFubmVsX2Rlc3Ryb3kocCk7CisJCQlwID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK1ZJU09SQ0hBTk5FTCAqCit2aXNvcmNoYW5uZWxfY3JlYXRlKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBjaGFubmVsQnl0ZXMsIEdVSUQgZ3VpZCkKK3sKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsQnl0ZXMsIE5VTEwsIDAsIGd1aWQsCisJCQkJCUZBTFNFKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGUpOworCitWSVNPUkNIQU5ORUwgKgordmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2soSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCSAgICAgIEdVSUQgZ3VpZCkKK3sKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsQnl0ZXMsIE5VTEwsIDAsIGd1aWQsCisJCQkJCVRSVUUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2spOworCitWSVNPUkNIQU5ORUwgKgordmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCSAgICAgICBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLCBHVUlEIGd1aWQpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cygwLCBjaGFubmVsQnl0ZXMsIHBhcmVudCwgb2ZmLCBndWlkLAorCQkJCQlGQUxTRSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWQpOworCitWSVNPUkNIQU5ORUwgKgordmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkX3dpdGhfbG9jayh1bG9uZyBjaGFubmVsQnl0ZXMsCisJCQkJCSBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLAorCQkJCQkgR1VJRCBndWlkKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMoMCwgY2hhbm5lbEJ5dGVzLCBwYXJlbnQsIG9mZiwgZ3VpZCwKKwkJCQkJVFJVRSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWRfd2l0aF9sb2NrKTsKKwordm9pZAordmlzb3JjaGFubmVsX2Rlc3Ryb3koVklTT1JDSEFOTkVMICpjaGFubmVsKQoreworCWlmIChjaGFubmVsID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoY2hhbm5lbC0+bWVtcmVnaW9uICE9IE5VTEwpIHsKKwkJdmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3koY2hhbm5lbC0+bWVtcmVnaW9uKTsKKwkJY2hhbm5lbC0+bWVtcmVnaW9uID0gTlVMTDsKKwl9CisJa2ZyZWUoY2hhbm5lbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZGVzdHJveSk7CisKK0hPU1RBRERSRVNTCit2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gdmlzb3JfbWVtcmVnaW9uX2dldF9waHlzYWRkcihjaGFubmVsLT5tZW1yZWdpb24pOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9waHlzYWRkcik7CisKK3Vsb25nCit2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPnNpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyk7CisKK2NoYXIgKgordmlzb3JjaGFubmVsX0dVSURfaWQoR1VJRCAqZ3VpZCwgY2hhciAqcykKK3sKKwlyZXR1cm4gR1VJRF9mb3JtYXQxKGd1aWQsIHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX0dVSURfaWQpOworCitjaGFyICoKK3Zpc29yY2hhbm5lbF9pZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGNoYXIgKnMpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9HVUlEX2lkKCZjaGFubmVsLT5ndWlkLCBzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9pZCk7CisKK2NoYXIgKgordmlzb3JjaGFubmVsX3pvbmVpZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGNoYXIgKnMpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9HVUlEX2lkKCZjaGFubmVsLT5jaGFuX2hkci5ab25lR3VpZCwgcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfem9uZWlkKTsKKworSE9TVEFERFJFU1MKK3Zpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+Y2hhbl9oZHIuUGFydGl0aW9uSGFuZGxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9jbGllbnRwYXJ0aXRpb24pOworCitHVUlECit2aXNvcmNoYW5uZWxfZ2V0X0dVSUQoVklTT1JDSEFOTkVMICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5ndWlkOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9HVUlEKTsKKworTUVNUkVHSU9OICoKK3Zpc29yY2hhbm5lbF9nZXRfbWVtcmVnaW9uKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+bWVtcmVnaW9uOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9tZW1yZWdpb24pOworCitpbnQKK3Zpc29yY2hhbm5lbF9yZWFkKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpCit7CisJaW50IHJjID0gdmlzb3JfbWVtcmVnaW9uX3JlYWQoY2hhbm5lbC0+bWVtcmVnaW9uLCBvZmZzZXQsCisJCQkJICAgICAgbG9jYWwsIG5ieXRlcyk7CisJaWYgKChyYyA+PSAwKSAmJiAob2Zmc2V0ID09IDApICYmIChuYnl0ZXMgPj0gc2l6ZW9mKENIQU5ORUxfSEVBREVSKSkpCisJCW1lbWNweSgmY2hhbm5lbC0+Y2hhbl9oZHIsIGxvY2FsLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfcmVhZCk7CisKK2ludAordmlzb3JjaGFubmVsX3dyaXRlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKQoreworCWlmIChvZmZzZXQgPT0gMCAmJiBuYnl0ZXMgPj0gc2l6ZW9mKENIQU5ORUxfSEVBREVSKSkKKwkJbWVtY3B5KCZjaGFubmVsLT5jaGFuX2hkciwgbG9jYWwsIHNpemVvZihDSEFOTkVMX0hFQURFUikpOworCXJldHVybiB2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLCBvZmZzZXQsIGxvY2FsLCBuYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3dyaXRlKTsKKworaW50Cit2aXNvcmNoYW5uZWxfY2xlYXIoVklTT1JDSEFOTkVMICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsIFU4IGNoLCB1bG9uZyBuYnl0ZXMpCit7CisJaW50IHJjID0gLTE7CisJaW50IGJ1ZnNpemUgPSA2NTUzNjsKKwlpbnQgd3JpdHRlbiA9IDA7CisJVTggKmJ1ZiA9IHZtYWxsb2MoYnVmc2l6ZSk7CisKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24iLCBfX2Z1bmNfXyk7CisJCWdvdG8gQXdheTsKKwl9CisJbWVtc2V0KGJ1ZiwgY2gsIGJ1ZnNpemUpOworCXdoaWxlIChuYnl0ZXMgPiAwKSB7CisJCXVsb25nIHRoaXNieXRlcyA9IGJ1ZnNpemU7CisJCWludCB4ID0gLTE7CisJCWlmIChuYnl0ZXMgPCB0aGlzYnl0ZXMpCisJCQl0aGlzYnl0ZXMgPSBuYnl0ZXM7CisJCXggPSB2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLCBvZmZzZXQgKyB3cml0dGVuLAorCQkJCQkgIGJ1ZiwgdGhpc2J5dGVzKTsKKwkJaWYgKHggPCAwKSB7CisJCQlyYyA9IHg7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJd3JpdHRlbiArPSB0aGlzYnl0ZXM7CisJCW5ieXRlcyAtPSB0aGlzYnl0ZXM7CisJfQorCXJjID0gMDsKKworQXdheToKKwlpZiAoYnVmICE9IE5VTEwpIHsKKwkJdmZyZWUoYnVmKTsKKwkJYnVmID0gTlVMTDsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NsZWFyKTsKKwordm9pZCAqCit2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuICh2b2lkICopICYoY2hhbm5lbC0+Y2hhbl9oZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9oZWFkZXIpOworCisvKiogUmV0dXJuIG9mZnNldCBvZiBhIHNwZWNpZmljIFNJR05BTF9RVUVVRV9IRUFERVIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqICBjaGFubmVsIGhlYWRlcgorICovCisjZGVmaW5lIFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpIFwKKwkoKGNoYW5faGRyKS0+b0NoYW5uZWxTcGFjZSArICgocSkgKiBzaXplb2YoU0lHTkFMX1FVRVVFX0hFQURFUikpKQorCisvKiogUmV0dXJuIG9mZnNldCBvZiBhIHNwZWNpZmljIHF1ZXVlIGVudHJ5IChkYXRhKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYQorICogIGNoYW5uZWwgaGVhZGVyCisgKi8KKyNkZWZpbmUgU0lHX0RBVEFfT0ZGU0VUKGNoYW5faGRyLCBxLCBzaWdfaGRyLCBzbG90KSBcCisJKFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpICsgKHNpZ19oZHIpLT5vU2lnbmFsQmFzZSArIFwKKwkgICAgKChzbG90KSAqIChzaWdfaGRyKS0+U2lnbmFsU2l6ZSkpCisKKy8qKiBXcml0ZSB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gYSBTSUdOQUxfUVVFVUVfSEVBREVSIGJhY2sKKyAqICBpbnRvIGhvc3QgbWVtb3J5CisgKi8KKyNkZWZpbmUgU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCBzaWdfaGRyLCBGSUVMRCkJCQlcCisJKHZpc29yX21lbXJlZ2lvbl93cml0ZShjaGFubmVsLT5tZW1yZWdpb24sCQkJXAorCQkJICAgICAgIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSkrIFwKKwkJCSAgICAgICBvZmZzZXRvZihTSUdOQUxfUVVFVUVfSEVBREVSLCBGSUVMRCksCVwKKwkJCSAgICAgICAmKChzaWdfaGRyKS0+RklFTEQpLAkJCVwKKwkJCSAgICAgICBzaXplb2YoKHNpZ19oZHIpLT5GSUVMRCkpID49IDApCisKK3N0YXRpYyBCT09MCitzaWdfcmVhZF9oZWFkZXIoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsCisJCVNJR05BTF9RVUVVRV9IRUFERVIgKnNpZ19oZHIpCit7CisJQk9PTCByYyA9IEZBTFNFOworCisJaWYgKGNoYW5uZWwtPmNoYW5faGRyLm9DaGFubmVsU3BhY2UgPCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKSB7CisJCUVSUkRSVigib0NoYW5uZWxTcGFjZSB0b28gc21hbGw6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCWdvdG8gQXdheTsKKwl9CisKKwkvKiBSZWFkIHRoZSBhcHByb3ByaWF0ZSBTSUdOQUxfUVVFVUVfSEVBREVSIGludG8gbG9jYWwgbWVtb3J5LiAqLworCisJaWYgKHZpc29yX21lbXJlZ2lvbl9yZWFkKGNoYW5uZWwtPm1lbXJlZ2lvbiwKKwkJCQkgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSwKKwkJCQkgc2lnX2hkciwgc2l6ZW9mKFNJR05BTF9RVUVVRV9IRUFERVIpKSA8IDApIHsKKwkJRVJSRFJWKCJxdWV1ZT0lZCBTSUdfUVVFVUVfT0ZGU0VUPSVkIiwKKwkJICAgICAgIHF1ZXVlLCAoaW50KVNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSkpOworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIG9mIHNpZ25hbCBxdWV1ZSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCWdvdG8gQXdheTsKKwl9CisJcmMgPSBUUlVFOworQXdheToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBCT09MCitzaWdfZG9fZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKKwkgICAgU0lHTkFMX1FVRVVFX0hFQURFUiAqc2lnX2hkciwgVTMyIHNsb3QsIHZvaWQgKmRhdGEsIEJPT0wgaXNfd3JpdGUpCit7CisJQk9PTCByYyA9IEZBTFNFOworCWludCBzaWduYWxfZGF0YV9vZmZzZXQgPSBTSUdfREFUQV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSwKKwkJCQkJCSBzaWdfaGRyLCBzbG90KTsKKwlpZiAoaXNfd3JpdGUpIHsKKwkJaWYgKHZpc29yX21lbXJlZ2lvbl93cml0ZShjaGFubmVsLT5tZW1yZWdpb24sCisJCQkJCSAgc2lnbmFsX2RhdGFfb2Zmc2V0LAorCQkJCQkgIGRhdGEsIHNpZ19oZHItPlNpZ25hbFNpemUpIDwgMCkgeworCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2Ygc2lnbmFsIGRhdGEgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQkJZ290byBBd2F5OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHZpc29yX21lbXJlZ2lvbl9yZWFkKGNoYW5uZWwtPm1lbXJlZ2lvbiwgc2lnbmFsX2RhdGFfb2Zmc2V0LAorCQkJCQkgZGF0YSwgc2lnX2hkci0+U2lnbmFsU2l6ZSkgPCAwKSB7CisJCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIG9mIHNpZ25hbCBkYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0KKwlyYyA9IFRSVUU7CitBd2F5OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBCT09MCitzaWdfcmVhZF9kYXRhKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLAorCSAgICAgIFNJR05BTF9RVUVVRV9IRUFERVIgKnNpZ19oZHIsIFUzMiBzbG90LCB2b2lkICpkYXRhKQoreworCXJldHVybiBzaWdfZG9fZGF0YShjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgc2xvdCwgZGF0YSwgRkFMU0UpOworfQorCitzdGF0aWMgaW5saW5lIEJPT0wKK3NpZ193cml0ZV9kYXRhKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLAorCSAgICAgICBTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyLCBVMzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gc2lnX2RvX2RhdGEoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIHNsb3QsIGRhdGEsIFRSVUUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK3NhZmVfc2lnX3F1ZXVlX3ZhbGlkYXRlKHBTSUdOQUxfUVVFVUVfSEVBREVSIHBzYWZlX3NxaCwKKwkJCXBTSUdOQUxfUVVFVUVfSEVBREVSIHB1bnNhZmVfc3FoLAorCQkJVTMyICpwaGVhZCwgVTMyICpwdGFpbCkKK3sKKwlpZiAoKCpwaGVhZCA+PSBwc2FmZV9zcWgtPk1heFNpZ25hbFNsb3RzKQorCSAgICB8fCAoKnB0YWlsID49IHBzYWZlX3NxaC0+TWF4U2lnbmFsU2xvdHMpKSB7CisJCS8qIENob29zZSAwIG9yIG1heCwgbWF5YmUgYmFzZWQgb24gY3VycmVudCB0YWlsIHZhbHVlICovCisJCSpwaGVhZCA9IDA7CisJCSpwdGFpbCA9IDA7CisKKwkJLyogU3luYyB3aXRoIGNsaWVudCBhcyBuZWNlc3NhcnkgKi8KKwkJcHVuc2FmZV9zcWgtPkhlYWQgPSAqcGhlYWQ7CisJCXB1bnNhZmVfc3FoLT5UYWlsID0gKnB0YWlsOworCisJCUVSUkRSVigic2FmZV9zaWdfcXVldWVfdmFsaWRhdGU6IGhlYWQgPSAweCV4LCB0YWlsID0gMHgleCwgTWF4U2xvdHMgPSAweCV4IiwKKwkJICAgICAqcGhlYWQsICpwdGFpbCwgcHNhZmVfc3FoLT5NYXhTaWduYWxTbG90cyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30JCQkJLyogZW5kIHNhZmVfc2lnX3F1ZXVlX3ZhbGlkYXRlICovCisKK0JPT0wKK3Zpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsIHZvaWQgKm1zZykKK3sKKwlCT09MIHJjID0gRkFMU0U7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBzaWdfaGRyOworCisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fbG9jaygmY2hhbm5lbC0+cmVtb3ZlX2xvY2spOworCisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkgeworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChzaWdfaGRyLkhlYWQgPT0gc2lnX2hkci5UYWlsKSB7CisJCXJjID0gRkFMU0U7CS8qIG5vIHNpZ25hbHMgdG8gcmVtb3ZlICovCisJCWdvdG8gQXdheTsKKwl9CisJc2lnX2hkci5UYWlsID0gKHNpZ19oZHIuVGFpbCArIDEpICUgc2lnX2hkci5NYXhTaWduYWxTbG90czsKKwlpZiAoIXNpZ19yZWFkX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLlRhaWwsIG1zZykpIHsKKwkJRVJSRFJWKCJzaWdfcmVhZF9kYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlzaWdfaGRyLk51bVNpZ25hbHNSZWNlaXZlZCsrOworCisJLyogRm9yIGVhY2ggZGF0YSBmaWVsZCBpbiBTSUdOQUxfUVVFVUVfSEVBREVSIHRoYXQgd2FzIG1vZGlmaWVkLAorCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KKwkgKi8KKwlNRU1PUllCQVJSSUVSOworCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgVGFpbCkpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgVGFpbCBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLAorCQkgICAgICAgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgTnVtU2lnbmFsc1JlY2VpdmVkKSkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBOdW1TaWduYWxzUmVjZWl2ZWQgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5yZW1vdmVfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKTsKKworQk9PTAordmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKwlTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CisKKwlpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKKwkJc3Bpbl9sb2NrKCZjaGFubmVsLT5pbnNlcnRfbG9jayk7CisKKwlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKSB7CisJCXJjID0gRkFMU0U7CisJCWdvdG8gQXdheTsKKwl9CisKKwlzaWdfaGRyLkhlYWQgPSAoKHNpZ19oZHIuSGVhZCArIDEpICUgc2lnX2hkci5NYXhTaWduYWxTbG90cyk7CisJaWYgKHNpZ19oZHIuSGVhZCA9PSBzaWdfaGRyLlRhaWwpIHsKKwkJc2lnX2hkci5OdW1PdmVyZmxvd3MrKzsKKwkJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBOdW1PdmVyZmxvd3MpKSB7CisJCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBOdW1PdmVyZmxvd3MgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQkJZ290byBBd2F5OworCQl9CisJCXJjID0gRkFMU0U7CisJCWdvdG8gQXdheTsKKwl9CisKKwlpZiAoIXNpZ193cml0ZV9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5IZWFkLCBtc2cpKSB7CisJCUVSUkRSVigic2lnX3dyaXRlX2RhdGEgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCXNpZ19oZHIuTnVtU2lnbmFsc1NlbnQrKzsKKworCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKKwkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCisJICovCisJTUVNT1JZQkFSUklFUjsKKwlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIEhlYWQpKSB7CisJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIEhlYWQgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIE51bVNpZ25hbHNTZW50KSkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBOdW1TaWduYWxzU2VudCBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCWdvdG8gQXdheTsKKwl9CisJcmMgPSBUUlVFOworQXdheToKKwlpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKKwkJc3Bpbl91bmxvY2soJmNoYW5uZWwtPmluc2VydF9sb2NrKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQpOworCisKK2ludAordmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlKQoreworCVNJR05BTF9RVUVVRV9IRUFERVIgc2lnX2hkcjsKKwlVMzIgc2xvdHNfYXZhaWwsIHNsb3RzX3VzZWQ7CisJVTMyIGhlYWQsIHRhaWw7CisKKwlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQorCQlyZXR1cm4gMDsKKwloZWFkID0gc2lnX2hkci5IZWFkOworCXRhaWwgPSBzaWdfaGRyLlRhaWw7CisJaWYgKGhlYWQgPCB0YWlsKQorCQloZWFkID0gaGVhZCArIHNpZ19oZHIuTWF4U2lnbmFsU2xvdHM7CisJc2xvdHNfdXNlZCA9IChoZWFkIC0gdGFpbCk7CisJc2xvdHNfYXZhaWwgPSBzaWdfaGRyLk1heFNpZ25hbHMgLSBzbG90c191c2VkOworCXJldHVybiAoaW50KSBzbG90c19hdmFpbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbCk7CisKK2ludAordmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX21heF9zbG90cyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSkKK3sKKwlTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChpbnQpIHNpZ19oZHIuTWF4U2lnbmFsczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMpOworCitzdGF0aWMgdm9pZAorc2lncXVldWVfZGVidWcoU0lHTkFMX1FVRVVFX0hFQURFUiAqcSwgaW50IHdoaWNoLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzZXFfcHJpbnRmKHNlcSwgIlNpZ25hbCBRdWV1ZSAjJWRcbiIsIHdoaWNoKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFZlcnNpb25JZCAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5WZXJzaW9uSWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgVHlwZSAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPlR5cGUpOworCXNlcV9wcmludGYoc2VxLCAiICAgb1NpZ25hbEJhc2UgICAgICAgID0gJWxsdVxuIiwKKwkJICAgKGxvbmcgbG9uZykgcS0+b1NpZ25hbEJhc2UpOworCXNlcV9wcmludGYoc2VxLCAiICAgU2lnbmFsU2l6ZSAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPlNpZ25hbFNpemUpOworCXNlcV9wcmludGYoc2VxLCAiICAgTWF4U2lnbmFsU2xvdHMgICAgID0gJWx1XG4iLAorCQkgICAodWxvbmcpIHEtPk1heFNpZ25hbFNsb3RzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIE1heFNpZ25hbHMgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5NYXhTaWduYWxzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIEZlYXR1cmVGbGFncyAgICAgICA9ICUtMTYuMTZMeFxuIiwKKwkJICAgKGxvbmcgbG9uZykgcS0+RmVhdHVyZUZsYWdzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIE51bVNpZ25hbHNTZW50ICAgICA9ICVsbHVcbiIsCisJCSAgIChsb25nIGxvbmcpIHEtPk51bVNpZ25hbHNTZW50KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIE51bVNpZ25hbHNSZWNlaXZlZCA9ICVsbHVcbiIsCisJCSAgIChsb25nIGxvbmcpIHEtPk51bVNpZ25hbHNSZWNlaXZlZCk7CisJc2VxX3ByaW50ZihzZXEsICIgICBOdW1PdmVyZmxvd3MgICAgICAgPSAlbGx1XG4iLAorCQkgICAobG9uZyBsb25nKSBxLT5OdW1PdmVyZmxvd3MpOworCXNlcV9wcmludGYoc2VxLCAiICAgSGVhZCAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPkhlYWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgVGFpbCAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPlRhaWwpOworfQorCit2b2lkCit2aXNvcmNoYW5uZWxfZGVidWcoVklTT1JDSEFOTkVMICpjaGFubmVsLCBpbnQgblF1ZXVlcywKKwkJICAgc3RydWN0IHNlcV9maWxlICpzZXEsIFUzMiBvZmYpCit7CisJSE9TVEFERFJFU1MgYWRkciA9IDA7CisJdWxvbmcgbmJ5dGVzID0gMCwgbmJ5dGVzX3JlZ2lvbiA9IDA7CisJTUVNUkVHSU9OICptZW1yZWdpb24gPSBOVUxMOworCUNIQU5ORUxfSEVBREVSIGhkcjsKKwlDSEFOTkVMX0hFQURFUiAqcGhkciA9ICZoZHI7CisJY2hhciBzWzk5XTsKKwlpbnQgaSA9IDA7CisJaW50IGVycmNvZGUgPSAwOworCisJaWYgKGNoYW5uZWwgPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIG5vIGNoYW5uZWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJbWVtcmVnaW9uID0gY2hhbm5lbC0+bWVtcmVnaW9uOworCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIG5vIG1lbXJlZ2lvbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlhZGRyID0gdmlzb3JfbWVtcmVnaW9uX2dldF9waHlzYWRkcihtZW1yZWdpb24pOworCW5ieXRlc19yZWdpb24gPSB2aXNvcl9tZW1yZWdpb25fZ2V0X25ieXRlcyhtZW1yZWdpb24pOworCWVycmNvZGUgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLCBvZmYsCisJCQkJICAgIHBoZHIsIHNpemVvZihDSEFOTkVMX0hFQURFUikpOworCWlmIChlcnJjb2RlIDwgMCkgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJSZWFkIG9mIGNoYW5uZWwgaGVhZGVyIGZhaWxlZCB3aXRoIGVycmNvZGU9JWQpXG4iLAorCQkJICAgZXJyY29kZSk7CisJCWlmIChvZmYgPT0gMCkgeworCQkJcGhkciA9ICZjaGFubmVsLT5jaGFuX2hkcjsKKwkJCXNlcV9wdXRzKHNlcSwgIihmb2xsb3dpbmcgZGF0YSBtYXkgYmUgc3RhbGUpXG4iKTsKKwkJfSBlbHNlCisJCQlyZXR1cm47CisJfQorCW5ieXRlcyA9ICh1bG9uZykgKHBoZHItPlNpemUpOworCXNlcV9wcmludGYoc2VxLCAiLS0tIEJlZ2luIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGZvciAweCVseCBieXRlcyAocmVnaW9uPTB4JWx4IGJ5dGVzKSAtLS1cbiIsCisJCSAgIGFkZHIgKyBvZmYsIG5ieXRlcywgbmJ5dGVzX3JlZ2lvbik7CisJc2VxX3ByaW50ZihzZXEsICJUeXBlICAgICAgICAgICAgPSAlc1xuIiwgR1VJRF9mb3JtYXQyKCZwaGRyLT5UeXBlLCBzKSk7CisJc2VxX3ByaW50ZihzZXEsICJab25lR3VpZCAgICAgICAgPSAlc1xuIiwKKwkJICAgR1VJRF9mb3JtYXQyKCZwaGRyLT5ab25lR3VpZCwgcykpOworCXNlcV9wcmludGYoc2VxLCAiU2lnbmF0dXJlICAgICAgID0gMHglLTE2LjE2THhcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPlNpZ25hdHVyZSk7CisJc2VxX3ByaW50ZihzZXEsICJMZWdhY3lTdGF0ZSAgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+TGVnYWN5U3RhdGUpOworCXNlcV9wcmludGYoc2VxLCAiU3J2U3RhdGUgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHBoZHItPlNydlN0YXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkNsaVN0YXRlQm9vdCAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5DbGlTdGF0ZUJvb3QpOworCXNlcV9wcmludGYoc2VxLCAiQ2xpU3RhdGVPUyAgICAgID0gJWx1XG4iLCAodWxvbmcpIHBoZHItPkNsaVN0YXRlT1MpOworCXNlcV9wcmludGYoc2VxLCAiSGVhZGVyU2l6ZSAgICAgID0gJWx1XG4iLCAodWxvbmcpIHBoZHItPkhlYWRlclNpemUpOworCXNlcV9wcmludGYoc2VxLCAiU2l6ZSAgICAgICAgICAgID0gJWxsdVxuIiwgKGxvbmcgbG9uZykgcGhkci0+U2l6ZSk7CisJc2VxX3ByaW50ZihzZXEsICJGZWF0dXJlcyAgICAgICAgPSAweCUtMTYuMTZsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPkZlYXR1cmVzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlBhcnRpdGlvbkhhbmRsZSA9IDB4JS0xNi4xNmxseFxuIiwKKwkJICAgKGxvbmcgbG9uZykgcGhkci0+UGFydGl0aW9uSGFuZGxlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhhbmRsZSAgICAgICAgICA9IDB4JS0xNi4xNmxseFxuIiwKKwkJICAgKGxvbmcgbG9uZykgcGhkci0+SGFuZGxlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlZlcnNpb25JZCAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5WZXJzaW9uSWQpOworCXNlcV9wcmludGYoc2VxLCAib0NoYW5uZWxTcGFjZSAgID0gJWxsdVxuIiwKKwkJICAgKGxvbmcgbG9uZykgcGhkci0+b0NoYW5uZWxTcGFjZSk7CisJaWYgKChwaGRyLT5vQ2hhbm5lbFNwYWNlID09IDApIHx8IChlcnJjb2RlIDwgMCkpCisJCTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCBuUXVldWVzOyBpKyspIHsKKwkJCVNJR05BTF9RVUVVRV9IRUFERVIgcTsKKwkJCWVycmNvZGUgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLAorCQkJCQkJICAgIG9mZiArIHBoZHItPm9DaGFubmVsU3BhY2UgKworCQkJCQkJICAgIChpICogc2l6ZW9mKHEpKSwKKwkJCQkJCSAgICAmcSwgc2l6ZW9mKHEpKTsKKwkJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJCXNlcV9wcmludGYoc2VxLAorCQkJCQkgICAiZmFpbGVkIHRvIHJlYWQgc2lnbmFsIHF1ZXVlICMlZCBmcm9tIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGVycmNvZGU9JWRcbiIsCisJCQkJCSAgIGksIGFkZHIsIGVycmNvZGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2lncXVldWVfZGVidWcoJnEsIGksIHNlcSk7CisJCX0KKwlzZXFfcHJpbnRmKHNlcSwgIi0tLSBFbmQgICBjaGFubmVsIEAweCUtMTYuMTZMeCBmb3IgMHglbHggYnl0ZXMgLS0tXG4iLAorCQkgICBhZGRyICsgb2ZmLCBuYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2RlYnVnKTsKKwordm9pZAordmlzb3JjaGFubmVsX2R1bXBfc2VjdGlvbihWSVNPUkNIQU5ORUwgKmNoYW4sIGNoYXIgKnMsCisJCQkgIGludCBvZmYsIGludCBsZW4sIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCWNoYXIgKmJ1ZiwgKnRidWYsICpmbXRidWY7CisJaW50IGZtdGJ1ZnNpemUgPSAwOworCWludCBpOworCWludCBlcnJjb2RlID0gMDsKKworCWZtdGJ1ZnNpemUgPSAxMDAgKiBDT1ZRKGxlbiwgMTYpOworCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWZtdGJ1ZiA9IGttYWxsb2MoZm10YnVmc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAoYnVmID09IE5VTEwgfHwgZm10YnVmID09IE5VTEwpCisJCWdvdG8gQXdheTsKKworCWVycmNvZGUgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFuLCBvZmYsIGJ1ZiwgbGVuKTsKKwlpZiAoZXJyY29kZSA8IDApIHsKKwkJRVJSRFJWKCIlcyBmYWlsZWQgdG8gcmVhZCAlcyBmcm9tIGNoYW5uZWwgZXJyY29kZT0lZCIsCisJCSAgICAgICBzLCBfX2Z1bmNfXywgZXJyY29kZSk7CisJCWdvdG8gQXdheTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICJjaGFubmVsICVzOlxuIiwgcyk7CisJdGJ1ZiA9IGJ1ZjsKKwl3aGlsZSAobGVuID4gMCkgeworCQlpID0gKGxlbiA8IDE2KSA/IGxlbiA6IDE2OworCQloZXhfZHVtcF90b19idWZmZXIodGJ1ZiwgaSwgMTYsIDEsIGZtdGJ1ZiwgZm10YnVmc2l6ZSwgVFJVRSk7CisJCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsIGZtdGJ1Zik7CisJCXRidWYgKz0gMTY7CisJCWxlbiAtPSAxNjsKKwl9CisKK0F3YXk6CisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJCWtmcmVlKGJ1Zik7CisJCWJ1ZiA9IE5VTEw7CisJfQorCWlmIChmbXRidWYgIT0gTlVMTCkgeworCQlrZnJlZShmbXRidWYpOworCQlmbXRidWYgPSBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kdW1wX3NlY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyZWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMKQEAgLTAsMCArMSw0OSBAQAorLyogdmlzb3JjaGFubmVsX21haW4uYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoKKyAqICBUaGlzIGlzIGEgbW9kdWxlICJ3cmFwcGVyIiBhcm91bmQgdmlzb3JjaGFubmVsX2Z1bmNzLgorICovCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgImd1aWR1dGlscy5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAidmlzb3JjaGFubmVsIgorCitzdGF0aWMgaW50IF9faW5pdAordmlzb3JjaGFubmVsX2luaXQodm9pZCkKK3sKKwlJTkZPRFJWKCJkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWQiLCBWRVJTSU9OKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3Zpc29yY2hhbm5lbF9leGl0KHZvaWQpCit7CisJSU5GT0RSVigiZHJpdmVyIHVubG9hZGVkIik7Cit9CisKK21vZHVsZV9pbml0KHZpc29yY2hhbm5lbF9pbml0KTsKK21vZHVsZV9leGl0KHZpc29yY2hhbm5lbF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVW5pc3lzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVydmlzb3IgY2hhbm5lbCBkcml2ZXIgZm9yIHNlcnZpY2UgcGFydGl0aW9uOiB2ZXIgIgorCQkgICBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMmZiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBVbmlzeXMgdmlzb3JjaGlwc2V0IGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFVOSVNZU19WSVNPUkNISVBTRVQKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpc29yY2hpcHNldCBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUlVUSUwgJiYgVU5JU1lTX1ZJU09SQ0hBTk5FTAorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlzb3JjaGlwc2V0IGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU4NjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHZpc29yY2hpcHNldAorIworCitvYmotJChDT05GSUdfVU5JU1lTX1ZJU09SQ0hJUFNFVCkJKz0gdmlzb3JjaGlwc2V0Lm8KKwordmlzb3JjaGlwc2V0LXkgOj0gdmlzb3JjaGlwc2V0X21haW4ubyBjb250cm9sdm1fZGlyZWN0Lm8gZmlsZS5vIGZpbGV4ZmVyLm8gXAorCQkJcGFyc2VyLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbAorY2NmbGFncy15ICs9IC1JaW5jbHVkZS9nZW5lcmF0ZWQKK2NjZmxhZ3MteSArPSAtRENPTkZJR19TUEFSX0dVRVNUIC1ER1VFU1REUklWRVJCVUlMRCAtRE5PQVVUT1ZFUlNJT04KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9jb250cm9sdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNmYTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtLmgKQEAgLTAsMCArMSwyNyBAQAorLyogY29udHJvbHZtLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DT05UUk9MVk1fSF9fCisjZGVmaW5lIF9fQ09OVFJPTFZNX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKworaW50ICAgICAgICAgY29udHJvbHZtX2luaXQodm9pZCk7Cit2b2lkICAgICAgICBjb250cm9sdm1fZGVpbml0KHZvaWQpOworSE9TVEFERFJFU1MgY29udHJvbHZtX2dldF9jaGFubmVsX2FkZHJlc3Modm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtX2RpcmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtX2RpcmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTFlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9jb250cm9sdm1fZGlyZWN0LmMKQEAgLTAsMCArMSw2MiBAQAorLyogY29udHJvbHZtX2RpcmVjdC5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBUaGlzIGlzIGEgY29udHJvbHZtLXJlbGF0ZWQgY29kZSB0aGF0IGlzIGRlcGVuZGVudCB1cG9uIGZpcm13YXJlIHJ1bm5pbmcKKyAqIG9uIGEgdmlydHVhbCBwYXJ0aXRpb24uCisgKi8KKworI2luY2x1ZGUgImdsb2JhbHMuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgImNvbnRyb2x2bS5oIgorI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fZGlyZWN0X2MKKworCisvKiBXZSBjYW4gZmlsbCBpbiB0aGlzIGNvZGUgd2hlbiB3ZSBsZWFybiBob3cgdG8gbWFrZSB2bWNhbGxzLi4uICovCisKKworCitpbnQgY29udHJvbHZtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworCisKK3ZvaWQgY29udHJvbHZtX2RlaW5pdCh2b2lkKQoreworfQorCisKKworSE9TVEFERFJFU1MgY29udHJvbHZtX2dldF9jaGFubmVsX2FkZHJlc3Modm9pZCkKK3sKKwlzdGF0aWMgQk9PTCB3YXJuZWQgPSBGQUxTRTsKKwlVNjQgYWRkciA9IDA7CisKKwlVMzIgc2l6ZSA9IDA7CisKKwlpZiAoIVZNQ0FMTF9TVUNDRVNTRlVMKElzc3VlX1ZNQ0FMTF9JT19DT05UUk9MVk1fQUREUigmYWRkciwgJnNpemUpKSkgeworCQlpZiAoIXdhcm5lZCkgeworCQkJRVJSRFJWKCIlcyAtIHZtY2FsbCB0byBkZXRlcm1pbmUgY29udHJvbHZtIGNoYW5uZWwgYWRkciBmYWlsZWQiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXdhcm5lZCA9IFRSVUU7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCUlORk9EUlYoImNvbnRyb2x2bSBhZGRyPSVMeCIsIGFkZHIpOworCXJldHVybiBhZGRyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIGZpbGUuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgYSB1c2VybW9kZSBwcm9ncmFtIHRvCisgKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSB2aXNvcmNoaXBzZXQgZHJpdmVyIHVzaW5nIGEgZGV2aWNlL2ZpbGUgaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAidmlzb3JjaGFubmVsLmgiCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVNPUl9DSElQU0VUX1BDX2ZpbGVfYworCitzdGF0aWMgc3RydWN0IGNkZXYgQ2RldjsKK3N0YXRpYyBWSVNPUkNIQU5ORUwgKipQQ29udHJvbFZtX2NoYW5uZWw7CitzdGF0aWMgZGV2X3QgTWFqb3JEZXYgPSAtMTsgLyoqPCBpbmRpY2F0ZXMgbWFqb3IgbnVtIGZvciBkZXZpY2UgKi8KK3N0YXRpYyBCT09MIFJlZ2lzdGVyZWQgPSBGQUxTRTsKKworc3RhdGljIGludCB2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHZpc29yY2hpcHNldF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCitsb25nIHZpc29yY2hpcHNldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworI2Vsc2UKK2ludCB2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlzb3JjaGlwc2V0X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2aXNvcmNoaXBzZXRfb3BlbiwKKwkucmVhZCA9IE5VTEwsCisJLndyaXRlID0gTlVMTCwKKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCisJLnVubG9ja2VkX2lvY3RsID0gdmlzb3JjaGlwc2V0X2lvY3RsLAorI2Vsc2UKKwkuaW9jdGwgPSB2aXNvcmNoaXBzZXRfaW9jdGwsCisjZW5kaWYKKwkucmVsZWFzZSA9IHZpc29yY2hpcHNldF9yZWxlYXNlLAorCS5tbWFwID0gdmlzb3JjaGlwc2V0X21tYXAsCit9OworCitpbnQKK3Zpc29yY2hpcHNldF9maWxlX2luaXQoZGV2X3QgbWFqb3JEZXYsIFZJU09SQ0hBTk5FTCAqKnBDb250cm9sVm1fY2hhbm5lbCkKK3sKKwlpbnQgcmMgPSAtMTsKKworCVBDb250cm9sVm1fY2hhbm5lbCA9IHBDb250cm9sVm1fY2hhbm5lbDsKKwlNYWpvckRldiA9IG1ham9yRGV2OworCWNkZXZfaW5pdCgmQ2RldiwgJnZpc29yY2hpcHNldF9mb3BzKTsKKwlDZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJaWYgKE1BSk9SKE1ham9yRGV2KSA9PSAwKSB7CisJCS8qIGR5bmFtaWMgbWFqb3IgZGV2aWNlIG51bWJlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgKi8KKwkJaWYgKGFsbG9jX2NocmRldl9yZWdpb24oJk1ham9yRGV2LCAwLCAxLCBNWURSVk5BTUUpIDwgMCkgeworCQkJRVJSRFJWKCJVbmFibGUgdG8gYWxsb2NhdGUrcmVnaXN0ZXIgY2hhciBkZXZpY2UgJXMiLAorCQkJICAgICAgIE1ZRFJWTkFNRSk7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJUmVnaXN0ZXJlZCA9IFRSVUU7CisJCUlORk9EUlYoIk5ldyBtYWpvciBudW1iZXIgJWQgcmVnaXN0ZXJlZFxuIiwgTUFKT1IoTWFqb3JEZXYpKTsKKwl9IGVsc2UgeworCQkvKiBzdGF0aWMgbWFqb3IgZGV2aWNlIG51bWJlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgKi8KKwkJaWYgKHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTWFqb3JEZXYsIDEsIE1ZRFJWTkFNRSkgPCAwKSB7CisJCQlFUlJEUlYoIlVuYWJsZSB0byByZWdpc3RlciBjaGFyIGRldmljZSAlcyIsIE1ZRFJWTkFNRSk7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJUmVnaXN0ZXJlZCA9IFRSVUU7CisJCUlORk9EUlYoIlN0YXRpYyBtYWpvciBudW1iZXIgJWQgcmVnaXN0ZXJlZFxuIiwgTUFKT1IoTWFqb3JEZXYpKTsKKwl9CisJaWYgKGNkZXZfYWRkKCZDZGV2LCBNS0RFVihNQUpPUihNYWpvckRldiksIDApLCAxKSA8IDApIHsKKwkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIGNoYXIgZGV2aWNlOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCUlORk9EUlYoIlJlZ2lzdGVyZWQgY2hhciBkZXZpY2UgZm9yICVzIChtYWpvcj0lZCkiLAorCQlNWURSVk5BTUUsIE1BSk9SKE1ham9yRGV2KSk7CisJcmMgPSAwOworQXdheToKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQKK3Zpc29yY2hpcHNldF9maWxlX2NsZWFudXAodm9pZCkKK3sKKwlpZiAoQ2Rldi5vcHMgIT0gTlVMTCkKKwkJY2Rldl9kZWwoJkNkZXYpOworCUNkZXYub3BzID0gTlVMTDsKKwlpZiAoUmVnaXN0ZXJlZCkgeworCQlpZiAoTUFKT1IoTWFqb3JEZXYpID49IDApIHsKKwkJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNYWpvckRldiwgMSk7CisJCQlNYWpvckRldiA9IE1LREVWKDAsIDApOworCQl9CisJCVJlZ2lzdGVyZWQgPSBGQUxTRTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3Zpc29yY2hpcHNldF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIG1pbm9yX251bWJlciA9IGltaW5vcihpbm9kZSk7CisJaW50IHJjID0gLUVOT0RFVjsKKworCURFQlVHRFJWKCIlcyIsIF9fZnVuY19fKTsKKwlpZiAobWlub3JfbnVtYmVyICE9IDApCisJCWdvdG8gQXdheTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJjID0gMDsKK0F3YXk6CisJaWYgKHJjIDwgMCkKKwkJRVJSRFJWKCIlcyBtaW5vcj0lZCBmYWlsZWQiLCBfX2Z1bmNfXywgbWlub3JfbnVtYmVyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3Zpc29yY2hpcHNldF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCURFQlVHRFJWKCIlcyIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmlzb3JjaGlwc2V0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVsb25nIHBoeXNBZGRyID0gMDsKKwl1bG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBhZGRyID0gMDsKKworCS8qIHN2X2VuYWJsZV9kZnAoKTsgKi8KKwlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7CisJaWYgKG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKSkgeworCQlFUlJEUlYoIiVzIHZpcnR1YWwgYWRkcmVzcyBOT1QgcGFnZS1hbGlnbmVkISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsJLyogbmVlZCBhbGlnbmVkIG9mZnNldHMgKi8KKwl9CisJc3dpdGNoIChvZmZzZXQpIHsKKwljYXNlIFZJU09SQ0hJUFNFVF9NTUFQX0NPTlRST0xDSEFOT0ZGU0VUOgorCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOworCQlpZiAoKlBDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKSB7CisJCQlFUlJEUlYoIiVzIG5vIGNvbnRyb2x2bSBjaGFubmVsIHlldCIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJdmlzb3JjaGFubmVsX3JlYWQoKlBDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCQkgICBncENvbnRyb2xDaGFubmVsKSwgJmFkZHIsCisJCQkJICBzaXplb2YoYWRkcikpOworCQlpZiAoYWRkciA9PSAwKSB7CisJCQlFUlJEUlYoIiVzIGNvbnRyb2wgY2hhbm5lbCBhZGRyZXNzIGlzIDAiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXBoeXNBZGRyID0gKHVsb25nKSAoYWRkcik7CisJCURFQlVHRFJWKCJtYXBwaW5nIHBoeXNpY2FsIGFkZHJlc3MgPSAweCVseCIsIHBoeXNBZGRyKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgIHBoeXNBZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCQkgICAgLypwZ3Byb3Rfbm9uY2FjaGVkICovCisJCQkJICAgICh2bWEtPnZtX3BhZ2VfcHJvdCkpKSB7CisJCQlFUlJEUlYoIiVzIHJlbWFwX3Bmbl9yYW5nZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJREVCVUdEUlYoIiVzIHN1Y2Nlc3MhIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorbG9uZwordmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKyNlbHNlCitpbnQKK3Zpc29yY2hpcHNldF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZW5kaWYKK3sKKwlpbnQgcmMgPSBTVUNDRVNTOworCVM2NCBhZGp1c3RtZW50OworCVM2NCB2cnRjX29mZnNldDsKKwlEQkdJTkYoImVudGVyZWQgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQiLCBjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVDoKKwkJLyogZ2V0IHRoZSBwaHlzaWNhbCBydGMgb2Zmc2V0ICovCisJCXZydGNfb2Zmc2V0ID0gSXNzdWVfVk1DQUxMX1FVRVJZX0dVRVNUX1ZJUlRVQUxfVElNRV9PRkZTRVQoKTsKKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKCh2b2lkIF9fdXNlciAqKWFyZywgJnZydGNfb2Zmc2V0LCBzaXplb2YodnJ0Y19vZmZzZXQpKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBBd2F5OworCQl9CisJCURCR0lORigiaW5zZGUgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQsIHZydGNfb2Zmc2V0PSVsbGQiLAorCQkgICAgICAgY21kLCB2cnRjX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FOgorCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmYWRqdXN0bWVudCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYWRqdXN0bWVudCkpKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJREJHSU5GKCJpbnNkZSB2aXNvcmNoaXBzZXRfaW9jdGwsIGNtZD0lZCwgYWRqdXN0bWVudD0lbGxkIiwgY21kLAorCQkgICAgICAgYWRqdXN0bWVudCk7CisJCXJjID0gSXNzdWVfVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FKGFkanVzdG1lbnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dFUlIoInZpc29yY2hpcHNldF9pb2N0bCByZWNlaXZlZCBpbnZhbGlkIGNvbW1hbmQiKTsKKwkJcmMgPSAtRUZBVUxUOworCQlicmVhazsKKwl9CitBd2F5OgorCURCR0lORigiZXhpdGluZyAlZCEiLCByYyk7CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzI4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmgKQEAgLTAsMCArMSwyNiBAQAorLyogZmlsZS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRklMRV9IX18KKyNkZWZpbmUgX19GSUxFX0hfXworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorCitpbnQgdmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChkZXZfdCBtYWpvckRldiwgVklTT1JDSEFOTkVMICoqcENvbnRyb2xWbV9jaGFubmVsKTsKK3ZvaWQgdmlzb3JjaGlwc2V0X2ZpbGVfY2xlYW51cCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxleGZlci5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFjZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuYwpAQCAtMCwwICsxLDUwNiBAQAorLyogZmlsZXhmZXIuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTMgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogQ29kZSBoZXJlLWluIGlzIHRoZSAiZ2x1ZSIgdGhhdCBjb25uZWN0cyBjb250cm9sdm0gbWVzc2FnZXMgd2l0aCB0aGUKKyAqIHNwYXJmaWxleGZlciBkcml2ZXIsIHdoaWNoIGlzIHVzZWQgdG8gdHJhbnNmZXIgZmlsZSBjb250ZW50cyBhcyBwYXlsb2FkCisgKiBhY3Jvc3MgdGhlIGNvbnRyb2x2bSBjaGFubmVsLgorICovCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAiY29udHJvbHZtLmgiCisjaW5jbHVkZSAidmlzb3JjaGlwc2V0LmgiCisjaW5jbHVkZSAiZmlsZXhmZXIuaCIKKworI2lmZGVmIEVOQUJMRV9TUEFSRklMRVhGRVIgLyogc3BhcmZpbGV4ZmVyIGtlcm5lbCBtb2R1bGUgZW5hYmxlZCBpbiBidWlsZCAqLworI2luY2x1ZGUgInNwYXJmaWxleGZlci5oIgorCisvKiBEcml2ZXItZ2xvYmFsIG1lbW9yeSAqLworc3RhdGljIExJU1RfSEVBRChSZXF1ZXN0X2xpc3QpOwkvKiBsaXN0IG9mIHN0cnVjdCBhbnlfcmVxdWVzdCAqLCB2aWEKKwkJCQkgKiByZXFfbGlzdCBtZW1iICovCisKKy8qIGxvY2sgZm9yIGFib3ZlIHBvb2wgZm9yIGFsbG9jYXRpb24gb2YgYW55X3JlcXVlc3Qgc3RydWN0cywgYW5kIHBvb2wKKyogbmFtZTsgbm90ZSB0aGF0IGttZW1fY2FjaGVfY3JlYXRlIHJlcXVpcmVzIHRoYXQgd2Uga2VlcCB0aGUgc3RvcmFnZQorKiBmb3IgdGhlIHBvb2wgbmFtZSBmb3IgdGhlIGxpZmUgb2YgdGhlIHBvb2wKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhSZXF1ZXN0X2xpc3RfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqUmVxdWVzdF9tZW1vcnlfcG9vbDsKK3N0YXRpYyBjb25zdCBjaGFyIFJlcXVlc3RfbWVtb3J5X3Bvb2xfbmFtZVtdID0gImZpbGV4ZmVyX3JlcXVlc3RfcG9vbCI7CitzaXplX3QgQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzID0gMDsJLyogcGFzc2VkIHRvIGZpbGV4ZmVyX2NvbnN0cnVjdG9yKCkgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHNpbmdsZSBjb250cm9sdm0gR0VURklMRSBjb252ZXJzYXRpb24sIHdoaWNoCisgKiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb250cm9sdm0gcmVxdWVzdCBtZXNzYWdlIGFuZCAxIG9yIG1vcmUgY29udHJvbHZtCisgKiByZXNwb25zZSBtZXNzYWdlcy4KKyAqLworc3RydWN0IGdldGZpbGVfcmVxdWVzdCB7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIGNvbnRyb2x2bV9oZWFkZXI7CisJYXRvbWljX3QgYnVmZmVyc19pbl91c2U7CisJR0VUX0NPTlRJR1VPVVNfQ09OVFJPTFZNX1BBWUxPQURfRlVOQyBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZDsKKwlDT05UUk9MVk1fUkVTUE9ORF9XSVRIX1BBWUxPQURfRlVOQyBjb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQ7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgc2luZ2xlIGNvbnRyb2x2bSBQVVRGSUxFIGNvbnZlcnNhdGlvbiwgd2hpY2gKKyAqIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNvbnRyb2x2bSByZXF1ZXN0IHdpdGggYSBmaWxlbmFtZSwgYW5kIGFkZGl0aW9uYWwKKyAqIGNvbnRyb2x2bSBtZXNzYWdlcyB3aXRoIGZpbGUgZGF0YS4KKyAqLworc3RydWN0IHB1dGZpbGVfcmVxdWVzdCB7CisJR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGE7CisJQ09OVFJPTFZNX1JFU1BPTkRfRlVOQyBjb250cm9sdm1fZW5kX3B1dEZpbGU7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgc2luZ2xlIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uLCB3aGljaCBjYW4gZWl0aGVyCisgKiBiZSBhIEdFVEZJTEUgb3IgUFVURklMRS4KKyAqLworc3RydWN0IGFueV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcV9saXN0OworCXVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyOworCXVsb25nMiBkYXRhX3NlcXVlbmNlX251bWJlcjsKKwlUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYzsKKwlCT09MIGlzX2dldDsKKwl1bmlvbiB7CisJCXN0cnVjdCBnZXRmaWxlX3JlcXVlc3QgZ2V0OworCQlzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0IHB1dDsKKwl9OworCS8qIFNpemUgb2YgY2FsbGVyX2NvbnRleHRfZGF0YSB3aWxsIGJlCisJICogPENhbGxlcl9yZXFfY29udGV4dF9ieXRlcz4gYnl0ZXMuICBJIGFsaWduZWQgdGhpcyBiZWNhdXNlIEkKKwkgKiBhbSBwYXJhbm9pZCBhYm91dCB3aGF0IGhhcHBlbnMgd2hlbiBhbiBhcmJpdHJhcnkgZGF0YQorCSAqIHN0cnVjdHVyZSB3aXRoIHVua25vd24gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBnZXRzIGNvcGllZAorCSAqIGhlcmUuICBJIHdhbnQgY2FsbGVyX2NvbnRleHRfZGF0YSB0byBiZSBhbGlnbmVkIHRvIHRoZQorCSAqIGNvYXJzZXN0IHBvc3NpYmxlIGFsaWdubWVudCBib3VuZGFyeSB0aGF0IGNvdWxkIGJlIHJlcXVpcmVkCisJICogZm9yIGFueSB1c2VyIGRhdGEgc3RydWN0dXJlLgorCSAqLworCXU4IGNhbGxlcl9jb250ZXh0X2RhdGFbMV0gX19hbGlnbmVkKHNpemVvZih1bG9uZzIpOworfTsKKworLyoKKyAqIExpbmtzIHRoZSBhbnlfcmVxdWVzdCBpbnRvIHRoZSBnbG9iYWwgbGlzdCBvZiBhbGxvY2F0ZWQgcmVxdWVzdHMKKyAqICg8UmVxdWVzdF9saXN0PikuCisgKi8KK3N0YXRpYyB2b2lkCit1bml0X3RyYWNraW5nX2NyZWF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfbGlzdF9saW5rKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoZGV2X2xpc3RfbGluaywgJlJlcXVlc3RfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUmVxdWVzdF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyogVW5saW5rcyBhIGFueV9yZXF1ZXN0IGZyb20gdGhlIGdsb2JhbCBsaXN0ICg8UmVxdWVzdF9saXN0PikuCisgKi8KK3N0YXRpYyB2b2lkCit1bml0X3RyYWNraW5nX2Rlc3Ryb3koc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3RfbGluaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKGRldl9saXN0X2xpbmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW5kIHJldHVybiBhIG5ldyBhbnlfcmVxdWVzdCBzdHJ1Y3QsIGFuZAorICogbGluayBpdCB0byB0aGUgZ2xvYmFsIGxpc3Qgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYW55X3JlcXVlc3QgKgorYWxsb2NfcmVxdWVzdChjaGFyICpmbiwgaW50IGxuKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKQorCSAgICAodmlzb3JjaGlwc2V0X2NhY2hlX2FsbG9jKFJlcXVlc3RfbWVtb3J5X3Bvb2wsCisJCQkJICAgICAgRkFMU0UsCisJCQkJICAgICAgZm4sIGxuKSk7CisJaWYgKCFyZXEpCisJCXJldHVybiBOVUxMOworCW1lbXNldChyZXEsIDAsIHNpemVvZihzdHJ1Y3QgYW55X3JlcXVlc3QpICsgQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzKTsKKwl1bml0X3RyYWNraW5nX2NyZWF0ZSgmcmVxLT5yZXFfbGlzdCk7CisJcmV0dXJuIHJlcTsKK30KKworLyogQm9vay1lbmQgZm9yIGFsbG9jX3JlcXVlc3QoKS4KKyAqLworc3RhdGljIHZvaWQKK2ZyZWVfcmVxdWVzdChzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSwgY2hhciAqZm4sIGludCBsbikKK3sKKwl1bml0X3RyYWNraW5nX2Rlc3Ryb3koJnJlcS0+cmVxX2xpc3QpOworCXZpc29yY2hpcHNldF9jYWNoZV9mcmVlKFJlcXVlc3RfbWVtb3J5X3Bvb2wsIHJlcSwgZm4sIGxuKTsKK30KKworLyogQ29uc3RydWN0b3IgZm9yIGZpbGV4ZmVyLm8uCisgKi8KK2ludAorZmlsZXhmZXJfY29uc3RydWN0b3Ioc2l6ZV90IHJlcV9jb250ZXh0X2J5dGVzKQoreworCWludCByYyA9IC0xOworCisJQ2FsbGVyX3JlcV9jb250ZXh0X2J5dGVzID0gcmVxX2NvbnRleHRfYnl0ZXM7CisJUmVxdWVzdF9tZW1vcnlfcG9vbCA9CisJICAgIGttZW1fY2FjaGVfY3JlYXRlKFJlcXVlc3RfbWVtb3J5X3Bvb2xfbmFtZSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYW55X3JlcXVlc3QpICsKKwkJCSAgICAgIENhbGxlcl9yZXFfY29udGV4dF9ieXRlcywKKwkJCSAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFSZXF1ZXN0X21lbW9yeV9wb29sKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGFsbG9jIFJlcXVlc3RfbWVtb3J5X3Bvb2wiKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gMDsKK0F3YXk6CisJaWYgKHJjIDwgMCkgeworCQlpZiAoUmVxdWVzdF9tZW1vcnlfcG9vbCkgeworCQkJa21lbV9jYWNoZV9kZXN0cm95KFJlcXVlc3RfbWVtb3J5X3Bvb2wpOworCQkJUmVxdWVzdF9tZW1vcnlfcG9vbCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBEZXN0cnVjdG9yIGZvciBmaWxleGZlci5vLgorICovCit2b2lkCitmaWxleGZlcl9kZXN0cnVjdG9yKHZvaWQpCit7CisJaWYgKFJlcXVlc3RfbWVtb3J5X3Bvb2wpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KFJlcXVlc3RfbWVtb3J5X3Bvb2wpOworCQlSZXF1ZXN0X21lbW9yeV9wb29sID0gTlVMTDsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBvYnRhaW4gYW4gYXZhaWxhYmxlIGNodW5rIGZyb20gdGhlIGNvbnRyb2x2bSBwYXlsb2FkIGFyZWEsCisgKiBzdG9yZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgY2h1bmsgaW4gPGFjdHVhbF9zaXplPiwgYW5kIHJldHVybiBhIHBvaW50ZXIKKyAqIHRvIHRoZSBjaHVuay4gIFRoZSBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIHNwYXJmaWxleGZlciBkcml2ZXIsIHdoaWNoIGNhbGxzCisgKiBpdCB3aGVuZXZlciBwYXlsb2FkIHNwYWNlIGlzIHJlcXVpcmVkIHRvIGNvcHkgZmlsZSBkYXRhIGludG8uCisgKi8KK3N0YXRpYyB2b2lkICoKK2dldF9lbXB0eV9idWNrZXRfZm9yX2dldGZpbGVfZGF0YSh2b2lkICpjb250ZXh0LAorCQkJCSAgdWxvbmcgbWluX3NpemUsIHVsb25nIG1heF9zaXplLAorCQkJCSAgdWxvbmcgKmFjdHVhbF9zaXplKQoreworCXZvaWQgKmJ1Y2tldDsKKwlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikgY29udGV4dDsKKworCWlmICghcmVxLT5pc19nZXQpIHsKKwkJTE9HRVJSKCIlcyAtIHVuZXhwZWN0ZWQgY2FsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWJ1Y2tldCA9ICgqcmVxLT5nZXQuZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQpCisJICAgIChtaW5fc2l6ZSwgbWF4X3NpemUsIGFjdHVhbF9zaXplKTsKKwlpZiAoYnVja2V0ICE9IE5VTEwpIHsKKwkJYXRvbWljX2luYygmcmVxLT5nZXQuYnVmZmVyc19pbl91c2UpOworCQlEQkdJTkYoIiVzIC0gc2VudCAlbHUtYnl0ZSBidWZmZXIiLCBfX2Z1bmNfXywgKmFjdHVhbF9zaXplKTsKKwl9CisJcmV0dXJuIGJ1Y2tldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYSBjb250cm9sdm0gcmVzcG9uc2Ugd2l0aCBkYXRhIGluIHRoZSBwYXlsb2FkCisgKiAod2hvc2Ugc3BhY2Ugd2FzIG9idGFpbmVkIHdpdGggZ2V0X2VtcHR5X2J1Y2tldF9mb3JfZ2V0ZmlsZV9kYXRhKS4gIFRoZQorICogZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLCB3aGljaCBjYWxscyBpdCB3aGVuZXZlciBpdAorICogd2FudHMgdG8gc2VuZCBmaWxlIGRhdGEgYmFjayBhY3Jvc3MgdGhlIGNvbnRyb2x2bSBjaGFubmVsLgorICovCitzdGF0aWMgaW50CitzZW5kX2Z1bGxfZ2V0ZmlsZV9kYXRhX2J1Y2tldCh2b2lkICpjb250ZXh0LCB2b2lkICpidWNrZXQsCisJCQkgICAgICB1bG9uZyBidWNrZXRfYWN0dWFsX3NpemUsIHVsb25nIGJ1Y2tldF91c2VkX3NpemUpCit7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisKKwlpZiAoIXJlcS0+aXNfZ2V0KSB7CisJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlEQkdJTkYoInNlbmRpbmcgYnVmZmVyIGZvciAlbHUvJWx1IiwKKwkgICAgICAgYnVja2V0X3VzZWRfc2l6ZSwgYnVja2V0X2FjdHVhbF9zaXplKTsKKwlpZiAoISgqcmVxLT5nZXQuY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkKQorCSAgICAoJnJlcS0+Z2V0LmNvbnRyb2x2bV9oZWFkZXIsCisJICAgICByZXEtPmZpbGVfcmVxdWVzdF9udW1iZXIsCisJICAgICByZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyKyssCisJICAgICAwLCBidWNrZXQsIGJ1Y2tldF9hY3R1YWxfc2l6ZSwgYnVja2V0X3VzZWRfc2l6ZSwgVFJVRSkpCisJCWF0b21pY19kZWMoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYSBjb250cm9sdm0gcmVzcG9uc2UgaW5kaWNhdGluZyB0aGUgZW5kIG9mIGEKKyAqIEdFVEZJTEUgdHJhbnNmZXIuICBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZAorc2VuZF9lbmRfb2ZfZ2V0ZmlsZV9kYXRhKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisJaWYgKCFyZXEtPmlzX2dldCkgeworCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCUxPR0lORigic3RhdHVzPSVkIiwgc3RhdHVzKTsKKwkoKnJlcS0+Z2V0LmNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCkKKwkgICAgKCZyZXEtPmdldC5jb250cm9sdm1faGVhZGVyLAorCSAgICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLAorCSAgICAgcmVxLT5kYXRhX3NlcXVlbmNlX251bWJlcisrLCBzdGF0dXMsIE5VTEwsIDAsIDAsIEZBTFNFKTsKKwlmcmVlX3JlcXVlc3QocmVxLCBfX0ZJTEVfXywgX19MSU5FX18pOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHN1cHBsaWVzIGRhdGEgZm9yIGEgUFVURklMRSB0cmFuc2Zlci4KKyAqIFRoZSBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIHNwYXJmaWxleGZlciBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9wdXRmaWxlX2RhdGEodm9pZCAqY29udGV4dCwgdm9pZCAqcGJ1Ziwgc2l6ZV90IGJ1ZnNpemUsCisJCSBCT09MIGJ1Zl9pc191c2Vyc3BhY2UsIHNpemVfdCAqYnl0ZXNfdHJhbnNmZXJyZWQpCit7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisJaWYgKHJlcS0+aXNfZ2V0KSB7CisJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuICgqcmVxLT5wdXQuZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSkgKCZyZXEtPmNhbGxlcl9jb250ZXh0X2RhdGFbMF0sCisJCQkJCQkgICBwYnVmLCBidWZzaXplLAorCQkJCQkJICAgYnVmX2lzX3VzZXJzcGFjZSwKKwkJCQkJCSAgIGJ5dGVzX3RyYW5zZmVycmVkKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIFBVVEZJTEUgdHJhbnNmZXIuCisgKiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZAorZW5kX3B1dGZpbGUodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikgY29udGV4dDsKKwlpZiAocmVxLT5pc19nZXQpIHsKKwkJTE9HRVJSKCIlcyAtIHVuZXhwZWN0ZWQgY2FsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwkoKnJlcS0+cHV0LmNvbnRyb2x2bV9lbmRfcHV0RmlsZSkgKCZyZXEtPmNhbGxlcl9jb250ZXh0X2RhdGFbMF0sCisJCQkJCSAgIHN0YXR1cyk7CisJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworLyogUmVmZXIgdG8gZmlsZXhmZXIuaCBmb3IgZGVzY3JpcHRpb24uICovCitCT09MCitmaWxleGZlcl9nZXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdWxvbmcyIGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIEdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMKKwkJIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkLAorCQkgQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMKKwkJIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCwKKwkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKQoreworCUJPT0wgdXNlX2NvdW50X3VwID0gRkFMU0U7CisJQk9PTCBmYWlsZWQgPSBUUlVFOworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gYWxsb2NfcmVxdWVzdChfX0ZJTEVfXywgX19MSU5FX18pOworCisJaWYgKCFyZXEpIHsKKwkJTE9HRVJSKCJhbGxvY2F0aW9uIG9mIGFueV9yZXF1ZXN0IGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCS8qIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoaXMgbW9kdWxlJ3MgdXNlIGNvdW50IGJlY2F1c2Ugd2UncmUgaGFuZGluZworCSAqIG9mZiBwb2ludGVycyB0byBmdW5jdGlvbnMgd2l0aGluIHRoaXMgbW9kdWxlIHRvIGJlIHVzZWQgYnkKKwkgKiBhbm90aGVyIG1vZHVsZS4KKwkgKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXVzZV9jb3VudF91cCA9IFRSVUU7CisJcmVxLT5pc19nZXQgPSBUUlVFOworCXJlcS0+ZmlsZV9yZXF1ZXN0X251bWJlciA9IGZpbGVfcmVxdWVzdF9udW1iZXI7CisJcmVxLT5kYXRhX3NlcXVlbmNlX251bWJlciA9IDA7CisJcmVxLT5kdW1wX2Z1bmMgPSBkdW1wX2Z1bmM7CisJcmVxLT5nZXQuY29udHJvbHZtX2hlYWRlciA9ICptc2dIZHI7CisJYXRvbWljX3NldCgmcmVxLT5nZXQuYnVmZmVyc19pbl91c2UsIDApOworCXJlcS0+Z2V0LmdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkID0KKwkgICAgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQ7CisJcmVxLT5nZXQuY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkID0KKwkgICAgY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkOworCWlmIChzcGFyZmlsZXhmZXJfbG9jYWwycmVtb3RlKHJlcSwJLyogY29udGV4dCwgcGFzc2VkIHRvCisJCQkJCQkgKiBjYWxsYmFjayBmdW5jcyAqLworCQkJCSAgICAgIGZpbGVfbmFtZSwKKwkJCQkgICAgICBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkJCSAgICAgIHVwbGlua19pbmRleCwKKwkJCQkgICAgICBkaXNrX2luZGV4LAorCQkJCSAgICAgIGdldF9lbXB0eV9idWNrZXRfZm9yX2dldGZpbGVfZGF0YSwKKwkJCQkgICAgICBzZW5kX2Z1bGxfZ2V0ZmlsZV9kYXRhX2J1Y2tldCwKKwkJCQkgICAgICBzZW5kX2VuZF9vZl9nZXRmaWxlX2RhdGEpIDwgMCkgeworCQlMT0dFUlIoInNwYXJmaWxleGZlcl9sb2NhbDJyZW1vdGUgZmFpbGVkIik7CisJCWdvdG8gQXdheTsKKwl9CisJZmFpbGVkID0gRkFMU0U7CitBd2F5OgorCWlmIChmYWlsZWQpIHsKKwkJaWYgKHVzZV9jb3VudF91cCkgeworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQl1c2VfY291bnRfdXAgPSBGQUxTRTsKKwkJfQorCQlpZiAocmVxKSB7CisJCQlmcmVlX3JlcXVlc3QocmVxLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJcmVxID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFRSVUU7CisJCS8qIHN1Y2Nlc3M7IHNlbmQgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIGZvciByZXNwb25zZXMgKi8KKwl9Cit9CisKKy8qIFJlZmVyIHRvIGZpbGV4ZmVyLmggZm9yIGRlc2NyaXB0aW9uLiAqLwordm9pZCAqCitmaWxleGZlcl9wdXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdWxvbmcyIGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIFRSQU5TTUlURklMRV9JTklUX0NPTlRFWFRfRlVOQyBpbml0X2NvbnRleHQsCisJCSBHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSwKKwkJIENPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlLAorCQkgVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmMpCit7CisJQk9PTCB1c2VfY291bnRfdXAgPSBGQUxTRTsKKwlCT09MIGZhaWxlZCA9IFRSVUU7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSBhbGxvY19yZXF1ZXN0KF9fRklMRV9fLCBfX0xJTkVfXyk7CisJdm9pZCAqY2FsbGVyX2N0eCA9IE5VTEw7CisKKwlpZiAoIXJlcSkgeworCQlMT0dFUlIoImFsbG9jYXRpb24gb2YgYW55X3JlcXVlc3QgZmFpbGVkIik7CisJCWdvdG8gQXdheTsKKwl9CisJY2FsbGVyX2N0eCA9ICh2b2lkICopICgmKHJlcS0+Y2FsbGVyX2NvbnRleHRfZGF0YVswXSkpOworCS8qIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoaXMgbW9kdWxlJ3MgdXNlIGNvdW50IGJlY2F1c2Ugd2UncmUgaGFuZGluZworCSAqIG9mZiBwb2ludGVycyB0byBmdW5jdGlvbnMgd2l0aGluIHRoaXMgbW9kdWxlIHRvIGJlIHVzZWQgYnkKKwkgKiBhbm90aGVyIG1vZHVsZS4KKwkgKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXVzZV9jb3VudF91cCA9IFRSVUU7CisJcmVxLT5pc19nZXQgPSBGQUxTRTsKKwlyZXEtPmZpbGVfcmVxdWVzdF9udW1iZXIgPSBmaWxlX3JlcXVlc3RfbnVtYmVyOworCXJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIgPSAwOworCXJlcS0+ZHVtcF9mdW5jID0gZHVtcF9mdW5jOworCXJlcS0+cHV0LmdldF9jb250cm9sdm1fZmlsZWRhdGEgPSBnZXRfY29udHJvbHZtX2ZpbGVkYXRhOworCXJlcS0+cHV0LmNvbnRyb2x2bV9lbmRfcHV0RmlsZSA9IGNvbnRyb2x2bV9lbmRfcHV0RmlsZTsKKwkoKmluaXRfY29udGV4dCkgKGNhbGxlcl9jdHgsIG1zZ0hkciwgZmlsZV9yZXF1ZXN0X251bWJlcik7CisJaWYgKHNwYXJmaWxleGZlcl9yZW1vdGUybG9jYWwocmVxLAkvKiBjb250ZXh0LCBwYXNzZWQgdG8KKwkJCQkJCSAqIGNhbGxiYWNrIGZ1bmNzICovCisJCQkJICAgICAgZmlsZV9uYW1lLAorCQkJCSAgICAgIGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCQkJICAgICAgdXBsaW5rX2luZGV4LAorCQkJCSAgICAgIGRpc2tfaW5kZXgsCisJCQkJICAgICAgZ2V0X3B1dGZpbGVfZGF0YSwgZW5kX3B1dGZpbGUpIDwgMCkgeworCQlMT0dFUlIoInNwYXJmaWxleGZlcl9yZW1vdGUybG9jYWwgZmFpbGVkIik7CisJCWdvdG8gQXdheTsKKwl9CisJZmFpbGVkID0gRkFMU0U7CitBd2F5OgorCWlmIChmYWlsZWQpIHsKKwkJaWYgKHVzZV9jb3VudF91cCkgeworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQl1c2VfY291bnRfdXAgPSBGQUxTRTsKKwkJfQorCQlpZiAocmVxKSB7CisJCQlmcmVlX3JlcXVlc3QocmVxLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJcmVxID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gY2FsbGVyX2N0eDsKKwkJLyogc3VjY2VzczsgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIGZvciByZXNwb25zZXMgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2dldF9yZXF1ZXN0KHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IGdldGZpbGVfcmVxdWVzdCAqZ2V0cmVxKQoreworCXNlcV9wcmludGYoZiwgIiAgYnVmZmVyc19pbl91c2U9JWRcbiIsCisJCSAgIGF0b21pY19yZWFkKCZnZXRyZXEtPmJ1ZmZlcnNfaW5fdXNlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3B1dF9yZXF1ZXN0KHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IHB1dGZpbGVfcmVxdWVzdCAqcHV0cmVxKQoreworfQorCitzdGF0aWMgdm9pZAorZHVtcF9yZXF1ZXN0KHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEpCit7CisJc2VxX3ByaW50ZihmLCAiKiAlcyBpZD0lbGx1IHNlcT0lbGx1XG4iLAorCQkgICAoKHJlcS0+aXNfZ2V0KSA/ICJHZXQiIDogIlB1dCIpLAorCQkgICByZXEtPmZpbGVfcmVxdWVzdF9udW1iZXIsIHJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIpOworCWlmIChyZXEtPmlzX2dldCkKKwkJZHVtcF9nZXRfcmVxdWVzdChmLCAmcmVxLT5nZXQpOworCWVsc2UKKwkJZHVtcF9wdXRfcmVxdWVzdChmLCAmcmVxLT5wdXQpOworCWlmIChyZXEtPmR1bXBfZnVuYykKKwkJKCpyZXEtPmR1bXBfZnVuYykgKGYsICYocmVxLT5jYWxsZXJfY29udGV4dF9kYXRhWzBdKSwgIiAgIik7Cit9CisKK3ZvaWQKK2ZpbGV4ZmVyX2R1bXAoc3RydWN0IHNlcV9maWxlICpmKQoreworCXVsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJc2VxX3B1dHMoZiwgIk91dHN0YW5kaW5nIFRSQU5TTUlUX0ZJTEUgcmVxdWVzdHM6XG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmUmVxdWVzdF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmUmVxdWVzdF9saXN0KSB7CisJCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxOworCQlyZXEgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYW55X3JlcXVlc3QsIHJlcV9saXN0KTsKKwkJZHVtcF9yZXF1ZXN0KGYsIHJlcSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKyNlbHNlCQkJCS8qIGlmZGVmIEVOQUJMRV9TUEFSRklMRVhGRVIgKi8KK2ludAorZmlsZXhmZXJfY29uc3RydWN0b3Ioc2l6ZV90IHJlcV9jb250ZXh0X2J5dGVzKQoreworCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLworfQorCit2b2lkCitmaWxleGZlcl9kZXN0cnVjdG9yKHZvaWQpCit7Cit9CisKK0JPT0wKK2ZpbGV4ZmVyX2dldEZpbGUoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCisJCSB1NjQgZmlsZV9yZXF1ZXN0X251bWJlciwKKwkJIHVpbnQgdXBsaW5rX2luZGV4LAorCQkgdWludCBkaXNrX2luZGV4LAorCQkgY2hhciAqZmlsZV9uYW1lLAorCQkgR0VUX0NPTlRJR1VPVVNfQ09OVFJPTFZNX1BBWUxPQURfRlVOQworCQkgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQsCisJCSBDT05UUk9MVk1fUkVTUE9ORF9XSVRIX1BBWUxPQURfRlVOQworCQkgY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkLAorCQkgVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmMpCit7CisJLyogc2luY2Ugbm8gc3BhcmZpbGV4ZmVyIG1vZHVsZSBleGlzdHMgdG8gY2FsbCwgd2UganVzdCBmYWlsICovCisJcmV0dXJuIEZBTFNFOworfQorCit2b2lkICoKK2ZpbGV4ZmVyX3B1dEZpbGUoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCisJCSB1NjQgZmlsZV9yZXF1ZXN0X251bWJlciwKKwkJIHVpbnQgdXBsaW5rX2luZGV4LAorCQkgdWludCBkaXNrX2luZGV4LAorCQkgY2hhciAqZmlsZV9uYW1lLAorCQkgVFJBTlNNSVRGSUxFX0lOSVRfQ09OVEVYVF9GVU5DIGluaXRfY29udGV4dCwKKwkJIEdFVF9DT05UUk9MVk1fRklMRURBVEFfRlVOQyBnZXRfY29udHJvbHZtX2ZpbGVkYXRhLAorCQkgQ09OVFJPTFZNX1JFU1BPTkRfRlVOQyBjb250cm9sdm1fZW5kX3B1dEZpbGUsCisJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYykKK3sKKwkvKiBzaW5jZSBubyBzcGFyZmlsZXhmZXIgbW9kdWxlIGV4aXN0cyB0byBjYWxsLCB3ZSBqdXN0IGZhaWwgKi8KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZAorZmlsZXhmZXJfZHVtcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYpCit7Cit9CisKKyNlbmRpZgkJCQkvKiBpZmRlZiBFTkFCTEVfU1BBUkZJTEVYRkVSICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxleGZlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJmY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuaApAQCAtMCwwICsxLDE0NyBAQAorLyogZmlsZXhmZXIuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTMgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdGhhdCBmaWxleGZlci5jIHByb3ZpZGVzIHRvIG90aGVyCisgKiBjb2RlIGluIHRoZSB2aXNvcmNoaXBzZXQgZHJpdmVyLgorICovCisKKyNpZm5kZWYgX19GSUxFWEZFUl9IX18KKyNkZWZpbmUgX19GSUxFWEZFUl9IX18KKworI2luY2x1ZGUgImdsb2JhbHMuaCIKKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKwordHlwZWRlZiB2b2lkICooKkdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMpICh1bG9uZyBtaW5fc2l6ZSwKKwkJCQkJCQl1bG9uZyBtYXhfc2l6ZSwKKwkJCQkJCQl1bG9uZyAqYWN0dWFsX3NpemUpOworCit0eXBlZGVmIEJPT0wKKygqQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMpIChDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJCQkJdTY0IGZpbGVSZXF1ZXN0TnVtYmVyLAorCQkJCQl1NjQgZGF0YVNlcXVlbmNlTnVtYmVyLAorCQkJCQlpbnQgcmVzcG9uc2UsCisJCQkJCXZvaWQgKmJ1Y2tldCwgdWxvbmcgcGF5bG9hZENodW5rU2l6ZSwKKwkJCQkJdWxvbmcgcGF5bG9hZFVzZWRCeXRlcywgQk9PTCBwYXJ0aWFsKTsKKwordHlwZWRlZiB2b2lkCisoKlRSQU5TTUlURklMRV9JTklUX0NPTlRFWFRfRlVOQykodm9pZCAqY3R4LAorCQkJCSAgY29uc3QgQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICpoZHIsCisJCQkJICB1NjQgZmlsZV9yZXF1ZXN0X251bWJlcik7Cit0eXBlZGVmIHZvaWQgKCpUUkFOU01JVEZJTEVfRFVNUF9GVU5DKSAoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpjdHgsCisJCQkJCWNvbnN0IGNoYXIgKnBmeCk7Cit0eXBlZGVmIGludCAoKkdFVF9DT05UUk9MVk1fRklMRURBVEFfRlVOQykgKHZvaWQgKmN0eCwKKwkJCQkJICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsCisJCQkJCSAgICBCT09MIGJ1Zl9pc191c2Vyc3BhY2UsCisJCQkJCSAgICBzaXplX3QgKmJ5dGVzX3RyYW5zZmVycmVkKTsKK3R5cGVkZWYgdm9pZCAoKkNPTlRST0xWTV9SRVNQT05EX0ZVTkMpICh2b2lkICpjdHgsIGludCByZXNwb25zZSk7CisKKy8qIENhbGwgb25jZSB0byBpbml0aWFsaXplIGZpbGV4ZmVyLm8uCisgKiByZXFfY29udGV4dF9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgdGhlIGNhbGxlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggZmlsZQorICogdHJhbnNmZXIgY29udmVyc2F0aW9uLiAgVGhlIDxjdHhfaW5pdF92YWx1ZT4gcGFzc2VkIHRvIGZpbGV4ZmVyX3B1dEZpbGUoKSBpcworICogYXNzdW1lZCB0byBiZSB0aGlzIG1hbnkgYnl0ZXMgaW4gc2l6ZS4gIENvZGUgd2l0aGluIGZpbGV4ZmVyLm8gd2lsbCBjb3B5IHRoaXMKKyAqIGludG8gYSBkeW5hbWljYWxseS1hbGxvY2F0ZWQgYXJlYSwgYW5kIHBhc3MgYmFjayBhIHBvaW50ZXIgdG8gdGhhdCBhcmVhIGluCisgKiBjYWxsYmFjayBmdW5jdGlvbnMuCisgKi8KK2ludCBmaWxleGZlcl9jb25zdHJ1Y3RvcihzaXplX3QgcmVxX2NvbnRleHRfYnl0ZXMpOworCisvKiBDYWxsIG9uY2UgdG8gY2xlYW4gdXAgZmlsZXhmZXIubyAqLwordm9pZCBmaWxleGZlcl9kZXN0cnVjdG9yKHZvaWQpOworCisvKiBDYWxsIHRoaXMgdG8gZHVtcCBkaWFnbm9zdGljIGluZm8gYWJvdXQgYWxsIG91dHN0YW5kaW5nIGdldEZpbGVzL3B1dEZpbGVzICovCit2b2lkIGZpbGV4ZmVyX2R1bXAoc3RydWN0IHNlcV9maWxlICpmKTsKKworLyogQ2FsbCB0byB0cmFuc2ZlciBhIGZpbGUgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSAoaS5lLiwgZnJvbSB0aGUgZW52aXJvbm1lbnQKKyAqIHdoZXJlIHRoaXMgZHJpdmVyIGlzIHJ1bm5pbmcpIGFjcm9zcyB0aGUgY29udHJvbHZtIGNoYW5uZWwgdG8gYSByZW1vdGUKKyAqIGVudmlyb25tZW50LiAgMSBvciBtb3JlIGNvbnRyb2x2bSByZXNwb25zZXMgd2lsbCBiZSBzZW50IGFzIGEgcmVzdWx0LCBlYWNoCisgKiBvZiB3aGljaCB3aG9zZSBwYXlsb2FkIGNvbnRhaW5zIGZpbGUgZGF0YS4gIE9ubHkgdGhlIGxhc3QgY29udHJvbHZtIG1lc3NhZ2UKKyAqIHdpbGwgaGF2ZSBGbGFncy5wYXJ0aWFsQ29tcGxldGlvbj09MC4KKyAqCisgKiAgIG1zZ0hkciAgICAgIHRoZSBjb250cm9sdm0gbWVzc2FnZSBoZWFkZXIgb2YgdGhlIEdFVEZJTEUgcmVxdWVzdCB3aGljaAorICogICAgICAgICAgICAgICB3ZSBqdXN0IHJlY2VpdmVkCisgKiAgIGZpbGVfcmVxdWVzdF9udW1iZXIgIHRoaXMgaXMgYWxsIGRhdGEgZnJvbSB0aGUgR0VURklMRSByZXF1ZXN0IHRoYXQKKyAqICAgdXBsaW5rX2luZGV4ICAgICAgICAgZGVmaW5lIHdoaWNoIGZpbGUgaXMgdG8gYmUgdHJhbnNmZXJyZWQKKyAqICAgZGlza19pbmRleAorICogICBmaWxlX25hbWUKKyAqICAgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQgIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzcGFjZSBpcyBuZWVkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwYXlsb2FkIGFyZWEKKyAqICAgY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkICAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gc2VuZCBlYWNoIGNvbnRyb2x2bQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgY29udGFpbmluZyBmaWxlIGRhdGEgYXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOyByZXR1cm5zIEZBTFNFIG9ubHkgaWYgdGhlCisgKgkJCQkgICAgICAgcGF5bG9hZCBidWZmZXIgd2FzIGZyZWVkIGlubGluZQorICogICBkdW1wX2Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gZHVtcCBjb250ZXh0IGRhdGEgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIGZvcm1hdAorICoKKyAqICBSZXR1cm5zIFRSVUUgaWZmIHRoZSBmaWxlIHRyYW5zZmVyIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCwKKyAqICBvciBGQUxTRSB0byBpbmRpY2F0ZSBmYWlsdXJlLgorICovCitCT09MCitmaWxleGZlcl9nZXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIEdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMKKwkJIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkLAorCQkgQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMKKwkJIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCwKKwkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKTsKKworLyogQ2FsbCB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSBsb2NhbCBmaWxlc3lzdGVtIChpLmUuLCBpbiB0aGUgZW52aXJvbm1lbnQKKyAqIHdoZXJlIHRoaXMgZHJpdmVyIGlzIHJ1bm5pbmcpIGZyb20gZGF0YSByZWNlaXZlZCBhcyBwYXlsb2FkIGluCisgKiBjb250cm9sdm0gY2hhbm5lbCBtZXNzYWdlcyBmcm9tIGEgcmVtb3RlIGVudmlyb25tZW50LiAgMSBvciBtb3JlIGNvbnRyb2x2bQorICogbWVzc2FnZXMgd2lsbCBiZSByZWNlaXZlZCBmb3IgdGhpcyB0cmFuc2ZlciwgYW5kIG9ubHkgdGhlIGxhc3Qgd2lsbCBoYXZlCisgKiBGbGFncy5wYXJ0aWFsQ29tcGxldGlvbj09MC4KKyAqCisgKiAgIG1zZ0hkciAgICAgIHRoZSBjb250cm9sdm0gbWVzc2FnZSBoZWFkZXIgb2YgdGhlIFBVVEZJTEUgcmVxdWVzdCB3aGljaAorICogICAgICAgICAgICAgICB3ZSBqdXN0IHJlY2VpdmVkCisgKiAgIGZpbGVfcmVxdWVzdF9udW1iZXIgIHRoaXMgaXMgYWxsIGRhdGEgZnJvbSB0aGUgUFVURklMRSByZXF1ZXN0IHRoYXQKKyAqICAgdXBsaW5rX2luZGV4ICAgICAgICAgZGVmaW5lIHdoaWNoIGZpbGUgaXMgdG8gYmUgY3JlYXRlZCBpbiB0aGUgbG9jYWwKKyAqICAgZGlza19pbmRleCAgICAgICAgICAgZmlsZXN5c3RlbQorICogICBmaWxlX25hbWUKKyAqICAgaW5pdF9jb250ZXh0ICAgICAgICAgZnVuY3Rpb24gdG8gY2FsbCB0byBpbml0aWFsaXplIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICA8cmVxX2NvbnRleHRfYnl0ZXM+LXNpemVkIHN0b3JhZ2UgYXJlYSByZXR1cm5lZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmM7IG5vdGUgdGhhdCBpdCB3b3VsZCBOT1QgYmUgc3VmZmljaWVudCB0bworICogICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyB0aGUgY2FsbGVyIHRvIGluaXRpYWxpemUgdGhpcyB1cG9uIHJldHVybiwgYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRoZSBvdGhlciB1c2VyLXN1cHBsaWVkIGNhbGxiYWNrcyBtaWdodCBoYXZlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBjYWxsZWQgYnkgdGhlbgorICogICBnZXRfY29udHJvbHZtX2ZpbGVkYXRhICAgZnVuY3Rpb24gdG8gY2FsbCB0byBvYnRhaW4gbW9yZSBkYXRhIGZvciB0aGUgZmlsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgd3JpdHRlbjsgcmVmZXIgdG8gZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB2aXNvcmNoaXBzZXRfbWFpbi5jIGZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBwYXJhbWV0ZXJzCisgKiAgIGNvbnRyb2x2bV9lbmRfcHV0RmlsZSAgICBmdW5jdGlvbiB0byBjYWxsIHRvIGluZGljYXRlIHRoYXQgY3JlYXRpb24gb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBmaWxlIGhhcyBjb21wbGV0ZWQ7ICBzZXQgPHJlc3BvbnNlPiB0byBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSB0byBpbmRpY2F0ZSBhbiBlcnJvcgorICogICBkdW1wX2Z1bmMgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gZHVtcCBjb250ZXh0IGRhdGEgaW4gaHVtYW4tcmVhZGFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdAorICoKKyAqICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGR5bmFtaWNhbGx5LWFsbG9jYXRlZCBzdG9yYWdlIGFyZWEgb2Ygc2l6ZQorICogIDxyZXFfY29udGV4dF9ieXRlcz4gd2hpY2ggdGhlIGNhbGxlciBjYW4gdXNlLCBvciBOVUxMIGZvciBlcnJvci4gIFRoZQorICogIGNhbGxlciBzaG91bGQgTkVWRVIgZnJlZSB0aGUgcmV0dXJuZWQgcG9pbnRlciwgYnV0IHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZQorICogIGl0IGFzIHRoZSA8Y3R4PiBhcmd1bWVudCB3aGVuIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgorICovCit2b2lkICpmaWxleGZlcl9wdXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgICAgICAgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSAgICAgICB1aW50IHVwbGlua19pbmRleCwKKwkJICAgICAgIHVpbnQgZGlza19pbmRleCwKKwkJICAgICAgIGNoYXIgKmZpbGVfbmFtZSwKKwkJICAgICAgIFRSQU5TTUlURklMRV9JTklUX0NPTlRFWFRfRlVOQyBpbml0X2NvbnRleHQsCisJCSAgICAgICBHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSwKKwkJICAgICAgIENPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlLAorCQkgICAgICAgVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2dsb2JhbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2dsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGU2ZDRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZ2xvYmFscy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIGdsb2JhbHMuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworCisjaWZuZGVmIF9fVklTT1JDSElQU0VUX0dMT0JBTFNfSF9fCisjZGVmaW5lIF9fVklTT1JDSElQU0VUX0dMT0JBTFNfSF9fCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAiZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAidmlzb3JjaGlwc2V0LmgiCisjaW5jbHVkZSAidmlzb3JjaGlwc2V0X3Vtb2RlLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAidmlzb3JjaGlwc2V0IgorCisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCisKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X3Rlc3R2bmljOworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfdGVzdHZuaWNjbGllbnQ7CitleHRlcm4gaW50IHZpc29yY2hpcHNldF90ZXN0bXNnOworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfbWFqb3I7CitleHRlcm4gaW50IHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0OworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdDsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X3Rlc3R0ZWFyZG93bjsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2Rpc2FibGVfY29udHJvbHZtOworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfY3Jhc2hfa2VybmVsOworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDhkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyogcGFyc2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjZGVmaW5lIE1ZRFJWTkFNRSAidmlzb3JjaGlwc2V0X3BhcnNlciIKKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJU09SX0NISVBTRVRfUENfcGFyc2VyX2MKKworLyogV2Ugd2lsbCByZWZ1c2UgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMgbWFueSBieXRlcyB0byBjb3B5IGRhdGEgZnJvbQorICogaW5jb21pbmcgcGF5bG9hZHMuICBUaGlzIHNlcnZlcyBhcyBhIHRocm90dGxpbmcgbWVjaGFuaXNtLgorICovCisjZGVmaW5lIE1BWF9DT05UUk9MVk1fUEFZTE9BRF9CWVRFUyAoMTAyNCoxMjgpCitzdGF0aWMgdWxvbmcgQ29udHJvbHZtX1BheWxvYWRfQnl0ZXNfQnVmZmVyZWQ7CisKK3N0cnVjdCBQQVJTRVJfQ09OVEVYVF9UYWcgeworCXVsb25nIGFsbG9jYnl0ZXM7CisJdWxvbmcgcGFyYW1fYnl0ZXM7CisJdTggKmN1cnI7CisJdWxvbmcgYnl0ZXNfcmVtYWluaW5nOworCUJPT0wgYnl0ZV9zdHJlYW07CisJY2hhciBkYXRhWzBdOworfTsKKworc3RhdGljIFBBUlNFUl9DT05URVhUICoKK3BhcnNlcl9pbml0X2d1dHMoVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLAorCQkgQk9PTCBoYXNTdGFuZGFyZFBheWxvYWRIZWFkZXIsIEJPT0wgKnRyeUFnYWluKQoreworCWludCBhbGxvY2J5dGVzID0gc2l6ZW9mKFBBUlNFUl9DT05URVhUKSArIGJ5dGVzOworCVBBUlNFUl9DT05URVhUICpyYyA9IE5VTEw7CisJUEFSU0VSX0NPTlRFWFQgKmN0eCA9IE5VTEw7CisJTUVNUkVHSU9OICpyZ24gPSBOVUxMOworCVVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqcGhkciA9IE5VTEw7CisKKwlpZiAodHJ5QWdhaW4pCisJCSp0cnlBZ2FpbiA9IEZBTFNFOworCWlmICghaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyKQorCQkvKiBhbGxvYyBhbmQgMCBleHRyYSBieXRlIHRvIGVuc3VyZSBwYXlsb2FkIGlzCisJCSAqICdcMCctdGVybWluYXRlZAorCQkgKi8KKwkJYWxsb2NieXRlcysrOworCWlmICgoQ29udHJvbHZtX1BheWxvYWRfQnl0ZXNfQnVmZmVyZWQgKyBieXRlcykKKwkgICAgPiBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMpIHsKKwkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gcHJldmVudGVkIGFsbG9jYXRpb24gb2YgJWQgYnl0ZXMgdG8gcHJldmVudCBleGNlZWRpbmcgdGhyb3R0bGluZyBtYXggKCVkKSIsCisJCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fLCBhbGxvY2J5dGVzLAorCQkgICAgICAgTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKTsKKwkJaWYgKHRyeUFnYWluKQorCQkJKnRyeUFnYWluID0gVFJVRTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCWN0eCA9IGt6YWxsb2MoYWxsb2NieXRlcywgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gZmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0ZJTEVfXywgX19MSU5FX18sIGFsbG9jYnl0ZXMpOworCQlpZiAodHJ5QWdhaW4pCisJCQkqdHJ5QWdhaW4gPSBUUlVFOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisKKwljdHgtPmFsbG9jYnl0ZXMgPSBhbGxvY2J5dGVzOworCWN0eC0+cGFyYW1fYnl0ZXMgPSBieXRlczsKKwljdHgtPmN1cnIgPSBOVUxMOworCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gMDsKKwljdHgtPmJ5dGVfc3RyZWFtID0gRkFMU0U7CisJaWYgKGlzTG9jYWwpIHsKKwkJdm9pZCAqcDsKKwkJaWYgKGFkZHIgPiB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkgLSAxKSkgeworCQkJRVJSRFJWKCIlcyAtIGJhZCBsb2NhbCBhZGRyZXNzICgweCUtMTYuMTZMeCBmb3IgJWx1KSIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkciwgKHVsb25nKSBieXRlcyk7CisJCQlyYyA9IE5VTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJcCA9IF9fdmEoKHVsb25nKSAoYWRkcikpOworCQltZW1jcHkoY3R4LT5kYXRhLCBwLCBieXRlcyk7CisJfSBlbHNlIHsKKwkJcmduID0gdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZShhZGRyLCBieXRlcyk7CisJCWlmICghcmduKSB7CisJCQlyYyA9IE5VTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJaWYgKHZpc29yX21lbXJlZ2lvbl9yZWFkKHJnbiwgMCwgY3R4LT5kYXRhLCBieXRlcykgPCAwKSB7CisJCQlyYyA9IE5VTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwl9CisJaWYgKCFoYXNTdGFuZGFyZFBheWxvYWRIZWFkZXIpIHsKKwkJY3R4LT5ieXRlX3N0cmVhbSA9IFRSVUU7CisJCXJjID0gY3R4OworCQlnb3RvIEF3YXk7CisJfQorCXBoZHIgPSAoVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSICopIChjdHgtPmRhdGEpOworCWlmIChwaGRyLT5Ub3RhbExlbmd0aCAhPSBieXRlcykgeworCQlFUlJEUlYoIiVzIC0gYmFkIHRvdGFsIGxlbmd0aCAlbHUgKHNob3VsZCBiZSAlbHUpIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgKHVsb25nKSAocGhkci0+VG90YWxMZW5ndGgpLCAodWxvbmcpIChieXRlcykpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHBoZHItPlRvdGFsTGVuZ3RoIDwgcGhkci0+SGVhZGVyTGVuZ3RoKSB7CisJCUVSUkRSVigiJXMgLSB0b3RhbCBsZW5ndGggPCBoZWFkZXIgbGVuZ3RoICglbHUgPCAlbHUpIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgKHVsb25nKSAocGhkci0+VG90YWxMZW5ndGgpLAorCQkgICAgICAgKHVsb25nKSAocGhkci0+SGVhZGVyTGVuZ3RoKSk7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocGhkci0+SGVhZGVyTGVuZ3RoIDwgc2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUikpIHsKKwkJRVJSRFJWKCIlcyAtIGhlYWRlciBpcyB0b28gc21hbGwgKCVsdSA8ICVsdSkiLAorCQkgICAgICAgX19mdW5jX18sCisJCSAgICAgICAodWxvbmcpIChwaGRyLT5IZWFkZXJMZW5ndGgpLAorCQkgICAgICAgKHVsb25nKSAoc2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUikpKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCisJcmMgPSBjdHg7CitBd2F5OgorCWlmIChyZ24pIHsKKwkJdmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3kocmduKTsKKwkJcmduID0gTlVMTDsKKwl9CisJaWYgKHJjKQorCQlDb250cm9sdm1fUGF5bG9hZF9CeXRlc19CdWZmZXJlZCArPSBjdHgtPnBhcmFtX2J5dGVzOworCWVsc2UgeworCQlpZiAoY3R4KSB7CisJCQlwYXJzZXJfZG9uZShjdHgpOworCQkJY3R4ID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK1BBUlNFUl9DT05URVhUICoKK3BhcnNlcl9pbml0KFU2NCBhZGRyLCBVMzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwgQk9PTCAqdHJ5QWdhaW4pCit7CisJcmV0dXJuIHBhcnNlcl9pbml0X2d1dHMoYWRkciwgYnl0ZXMsIGlzTG9jYWwsIFRSVUUsIHRyeUFnYWluKTsKK30KKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgcGFyc2VyX2luaXQoKSBpZiB0aGUgcGF5bG9hZCBhcmVhIGNvbnNpc3RzIG9mIGp1c3QKKyAqIGEgc2VxdWVuY2Ugb2YgYnl0ZXMsIHJhdGhlciB0aGFuIGEgVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSCisgKiBzdHJ1Y3R1cmVzLiAgQWZ0ZXJ3YXJkcywgeW91IGNhbiBjYWxsIHBhcnNlcl9zaW1wbGVTdHJpbmdfZ2V0KCkgb3IKKyAqIHBhcnNlcl9ieXRlU3RyZWFtX2dldCgpIHRvIG9idGFpbiB0aGUgZGF0YS4KKyAqLworUEFSU0VSX0NPTlRFWFQgKgorcGFyc2VyX2luaXRfYnl0ZVN0cmVhbShVNjQgYWRkciwgVTMyIGJ5dGVzLCBCT09MIGlzTG9jYWwsIEJPT0wgKnRyeUFnYWluKQoreworCXJldHVybiBwYXJzZXJfaW5pdF9ndXRzKGFkZHIsIGJ5dGVzLCBpc0xvY2FsLCBGQUxTRSwgdHJ5QWdhaW4pOworfQorCisvKiBPYnRhaW4gJ1wwJy10ZXJtaW5hdGVkIGNvcHkgb2Ygc3RyaW5nIGluIHBheWxvYWQgYXJlYS4KKyAqLworY2hhciAqCitwYXJzZXJfc2ltcGxlU3RyaW5nX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KQoreworCWlmICghY3R4LT5ieXRlX3N0cmVhbSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGN0eC0+ZGF0YTsJLyogbm90ZSB0aGlzIElTICdcMCctdGVybWluYXRlZCwgYmVjYXVzZSBvZgorCQkJCSAqIHRoZSBudW0gb2YgYnl0ZXMgd2UgYWxsb2MrY2xlYXIgaW4KKwkJCQkgKiBwYXJzZXJfaW5pdF9ieXRlU3RyZWFtKCkgKi8KK30KKworLyogT2J0YWluIGEgY29weSBvZiB0aGUgYnVmZmVyIGluIHRoZSBwYXlsb2FkIGFyZWEuCisgKi8KK3ZvaWQgKgorcGFyc2VyX2J5dGVTdHJlYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIHVsb25nICpuYnl0ZXMpCit7CisJaWYgKCFjdHgtPmJ5dGVfc3RyZWFtKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobmJ5dGVzKQorCQkqbmJ5dGVzID0gY3R4LT5wYXJhbV9ieXRlczsKKwlyZXR1cm4gKHZvaWQgKikgY3R4LT5kYXRhOworfQorCitHVUlECitwYXJzZXJfaWRfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCit7CisJVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSICpwaGRyID0gTlVMTDsKKworCWlmIChjdHggPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzICglczolZCkgLSBubyBjb250ZXh0IiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gR3VpZDA7CisJfQorCXBoZHIgPSAoVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSICopIChjdHgtPmRhdGEpOworCXJldHVybiBwaGRyLT5JZDsKK30KKwordm9pZAorcGFyc2VyX3BhcmFtX3N0YXJ0KFBBUlNFUl9DT05URVhUICpjdHgsIFBBUlNFUl9XSElDSF9TVFJJTkcgd2hpY2hfc3RyaW5nKQoreworCVVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqcGhkciA9IE5VTEw7CisKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCisJCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwkJZ290byBBd2F5OworCX0KKwlwaGRyID0gKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqKSAoY3R4LT5kYXRhKTsKKwlzd2l0Y2ggKHdoaWNoX3N0cmluZykgeworCWNhc2UgUEFSU0VSU1RSSU5HX0lOSVRJQVRPUjoKKwkJY3R4LT5jdXJyID0gY3R4LT5kYXRhICsgcGhkci0+SW5pdGlhdG9yT2Zmc2V0OworCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPkluaXRpYXRvckxlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBQQVJTRVJTVFJJTkdfVEFSR0VUOgorCQljdHgtPmN1cnIgPSBjdHgtPmRhdGEgKyBwaGRyLT5UYXJnZXRPZmZzZXQ7CisJCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gcGhkci0+VGFyZ2V0TGVuZ3RoOworCQlicmVhazsKKwljYXNlIFBBUlNFUlNUUklOR19DT05ORUNUSU9OOgorCQljdHgtPmN1cnIgPSBjdHgtPmRhdGEgKyBwaGRyLT5Db25uZWN0aW9uT2Zmc2V0OworCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPkNvbm5lY3Rpb25MZW5ndGg7CisJCWJyZWFrOworCWNhc2UgUEFSU0VSU1RSSU5HX05BTUU6CisJCWN0eC0+Y3VyciA9IGN0eC0+ZGF0YSArIHBoZHItPk5hbWVPZmZzZXQ7CisJCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gcGhkci0+TmFtZUxlbmd0aDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRVJSRFJWKCIlcyAtIGJhZCB3aGljaF9zdHJpbmcgJWQiLCBfX2Z1bmNfXywgd2hpY2hfc3RyaW5nKTsKKwkJYnJlYWs7CisJfQorCitBd2F5OgorCXJldHVybjsKK30KKwordm9pZAorcGFyc2VyX2RvbmUoUEFSU0VSX0NPTlRFWFQgKmN0eCkKK3sKKwlpZiAoIWN0eCkKKwkJcmV0dXJuOworCUNvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkIC09IGN0eC0+cGFyYW1fYnl0ZXM7CisJa2ZyZWUoY3R4KTsKK30KKworLyoqIFJldHVybiBsZW5ndGggb2Ygc3RyaW5nIG5vdCBjb3VudGluZyB0cmFpbGluZyBzcGFjZXMuICovCitzdGF0aWMgaW50CitzdHJpbmdfbGVuZ3RoX25vX3RyYWlsKGNoYXIgKnMsIGludCBsZW4pCit7CisJaW50IGkgPSBsZW4gLSAxOworCXdoaWxlIChpID49IDApIHsKKwkJaWYgKCFpc3NwYWNlKHNbaV0pKQorCQkJcmV0dXJuIGkgKyAxOworCQlpLS07CisJfQorCXJldHVybiAwOworfQorCisvKiogR3JhYiB0aGUgbmV4dCBuYW1lIGFuZCB2YWx1ZSBvdXQgb2YgdGhlIHBhcmFtZXRlciBidWZmZXIuCisgKiAgVGhlIGVudGlyZSBwYXJhbWV0ZXIgYnVmZmVyIGxvb2tzIGxpa2UgdGhpczoKKyAqICAgICAgPG5hbWU+PTx2YWx1ZT5cMAorICogICAgICA8bmFtZT49PHZhbHVlPlwwCisgKiAgICAgIC4uLgorICogICAgICBcMAorICogIElmIHN1Y2Nlc3NmdWwsIHRoZSBuZXh0IDxuYW1lPiB2YWx1ZSBpcyByZXR1cm5lZCB3aXRoaW4gdGhlIHN1cHBsaWVkCisgKiAgPG5hbT4gYnVmZmVyICh0aGUgdmFsdWUgaXMgYWx3YXlzIHVwcGVyLWNhc2VkKSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgPHZhbHVlPiBpcyByZXR1cm5lZCB3aXRoaW4gYSBrbWFsbG9jKCllZCBidWZmZXIsIHdob3NlIHBvaW50ZXIgaXMKKyAqICBwcm92aWRlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24uCisgKiAgKFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGlzIHN0cmxlbig8dmFsdWU+KSsxLikKKyAqCisgKiAgTlVMTCBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSBmYWlsdXJlLCB3aGljaCBjYW4gb2NjdXIgZm9yIHNldmVyYWwgcmVhc29uczoKKyAqICAtIGFsbCA8bmFtZT49PHZhbHVlPiBwYWlycyBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQKKyAqICAtIGJhZCBwYXJhbWV0ZXIKKyAqICAtIHBhcmFtZXRlciBidWZmZXIgZW5kcyBwcmVtYXR1cmVseSAoY291bGRuJ3QgZmluZCBhbiAnPScgb3IgJ1wwJyB3aXRoaW4KKyAqICAgIHRoZSBjb25maW5lcyBvZiB0aGUgcGFyYW1ldGVyIGJ1ZmZlcikKKyAqICAtIHRoZSA8bmFtPiBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSA8bmFtZT4gb2YgdGhlIG5leHQKKyAqICAgIHBhcmFtZXRlcgorICovCit2b2lkICoKK3BhcnNlcl9wYXJhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgY2hhciAqbmFtLCBpbnQgbmFtZXNpemUpCit7CisJdTggKnBzY2FuLCAqcG5hbSA9IG5hbTsKKwl1bG9uZyBuc2NhbjsKKwlpbnQgdmFsdWVfbGVuZ3RoID0gLTEsIG9yaWdfdmFsdWVfbGVuZ3RoID0gLTE7CisJdm9pZCAqdmFsdWUgPSBOVUxMOworCWludCBpOworCWludCBjbG9zaW5nX3F1b3RlID0gMDsKKworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKwlwc2NhbiA9IGN0eC0+Y3VycjsKKwluc2NhbiA9IGN0eC0+Ynl0ZXNfcmVtYWluaW5nOworCWlmIChuc2NhbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnBzY2FuID09ICdcMCcpCisJCS8qICBUaGlzIGlzIHRoZSBub3JtYWwgcmV0dXJuIHBvaW50IGFmdGVyIHlvdSBoYXZlIHByb2Nlc3NlZAorCQkgKiAgYWxsIG9mIHRoZSA8bmFtZT49PHZhbHVlPiBwYWlycyBpbiBhIHN5bnRhY3RpY2FsbHktdmFsaWQKKwkJICogIHBhcmFtZXRlciBidWZmZXIuCisJCSAqLworCQlyZXR1cm4gTlVMTDsKKworCS8qIHNraXAgd2hpdGVzcGFjZSAqLworCXdoaWxlIChpc3NwYWNlKCpwc2NhbikpIHsKKwkJcHNjYW4rKzsKKwkJbnNjYW4tLTsKKwkJaWYgKG5zY2FuID09IDApCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAoKnBzY2FuICE9ICc6JykgeworCQlpZiAobmFtZXNpemUgPD0gMCkgeworCQkJRVJSRFJWKCIlcyAtIG5hbWUgdG9vIGJpZyIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSpwbmFtID0gdG91cHBlcigqcHNjYW4pOworCQlwbmFtKys7CisJCW5hbWVzaXplLS07CisJCXBzY2FuKys7CisJCW5zY2FuLS07CisJCWlmIChuc2NhbiA9PSAwKSB7CisJCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgcGFyc2luZyBuYW1lIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlpZiAobmFtZXNpemUgPD0gMCkgeworCQlFUlJEUlYoIiVzIC0gbmFtZSB0b28gYmlnIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJKnBuYW0gPSAnXDAnOworCW5hbVtzdHJpbmdfbGVuZ3RoX25vX3RyYWlsKG5hbSwgc3RybGVuKG5hbSkpXSA9ICdcMCc7CisKKwkvKiBwb2ludCB0byBjaGFyIGltbWVkaWF0ZWx5IGFmdGVyICI6IiBpbiAiPG5hbWU+Ojx2YWx1ZT4iICovCisJcHNjYW4rKzsKKwluc2Nhbi0tOworCS8qIHNraXAgd2hpdGVzcGFjZSAqLworCXdoaWxlIChpc3NwYWNlKCpwc2NhbikpIHsKKwkJcHNjYW4rKzsKKwkJbnNjYW4tLTsKKwkJaWYgKG5zY2FuID09IDApIHsKKwkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBsb29raW5nIGZvciB2YWx1ZSIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5zY2FuID09IDApIHsKKwkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGxvb2tpbmcgZm9yIHZhbHVlIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgqcHNjYW4gPT0gJ1wnJyB8fCAqcHNjYW4gPT0gJyInKSB7CisJCWNsb3NpbmdfcXVvdGUgPSAqcHNjYW47CisJCXBzY2FuKys7CisJCW5zY2FuLS07CisJCWlmIChuc2NhbiA9PSAwKSB7CisJCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYWZ0ZXIgJWMiLAorCQkJICAgICAgIF9fZnVuY19fLCBjbG9zaW5nX3F1b3RlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJLyogbG9vayBmb3IgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLCB0ZXJtaW5hdG9yIGNoYXJhY3Rlciwgb3IKKwkgKiBlbmQgb2YgZGF0YQorCSAqLworCWZvciAoaSA9IDAsIHZhbHVlX2xlbmd0aCA9IC0xOyBpIDwgbnNjYW47IGkrKykgeworCQlpZiAoY2xvc2luZ19xdW90ZSkgeworCQkJaWYgKHBzY2FuW2ldID09ICdcMCcpIHsKKwkJCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgcGFyc2luZyBxdW90ZWQgdmFsdWUiLCBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAocHNjYW5baV0gPT0gY2xvc2luZ19xdW90ZSkgeworCQkJCXZhbHVlX2xlbmd0aCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkgICAgaWYgKHBzY2FuW2ldID09ICcsJyB8fCBwc2NhbltpXSA9PSAnOycKKwkJCXx8IHBzY2FuW2ldID09ICdcMCcpIHsKKwkJCXZhbHVlX2xlbmd0aCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAodmFsdWVfbGVuZ3RoIDwgMCkgeworCQlpZiAoY2xvc2luZ19xdW90ZSkgeworCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgcXVvdGVkIHZhbHVlIiwgX19mdW5jX18pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdmFsdWVfbGVuZ3RoID0gbnNjYW47CisJfQorCW9yaWdfdmFsdWVfbGVuZ3RoID0gdmFsdWVfbGVuZ3RoOworCWlmIChjbG9zaW5nX3F1b3RlID09IDApCisJCXZhbHVlX2xlbmd0aCA9IHN0cmluZ19sZW5ndGhfbm9fdHJhaWwocHNjYW4sIG9yaWdfdmFsdWVfbGVuZ3RoKTsKKwl2YWx1ZSA9IGttYWxsb2ModmFsdWVfbGVuZ3RoICsgMSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAodmFsdWUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KHZhbHVlLCBwc2NhbiwgdmFsdWVfbGVuZ3RoKTsKKwkoKHU4ICopICh2YWx1ZSkpW3ZhbHVlX2xlbmd0aF0gPSAnXDAnOworCisJcHNjYW4gKz0gb3JpZ192YWx1ZV9sZW5ndGg7CisJbnNjYW4gLT0gb3JpZ192YWx1ZV9sZW5ndGg7CisKKwkvKiBza2lwIHBhc3Qgc2VwYXJhdG9yIG9yIGNsb3NpbmcgcXVvdGUgKi8KKwlpZiAobnNjYW4gPiAwKSB7CisJCWlmICgqcHNjYW4gIT0gJ1wwJykgeworCQkJcHNjYW4rKzsKKwkJCW5zY2FuLS07CisJCX0KKwl9CisKKwlpZiAoY2xvc2luZ19xdW90ZSAmJiAobnNjYW4gPiAwKSkgeworCQkvKiB3ZSBzdGlsbCBuZWVkIHRvIHNraXAgYXJvdW5kIHRoZSByZWFsIHNlcGFyYXRvciBpZiBwcmVzZW50ICovCisJCS8qIGZpcnN0LCBza2lwIHdoaXRlc3BhY2UgKi8KKwkJd2hpbGUgKGlzc3BhY2UoKnBzY2FuKSkgeworCQkJcHNjYW4rKzsKKwkJCW5zY2FuLS07CisJCQlpZiAobnNjYW4gPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAobnNjYW4gPiAwKSB7CisJCQlpZiAoKnBzY2FuID09ICcsJyB8fCAqcHNjYW4gPT0gJzsnKSB7CisJCQkJcHNjYW4rKzsKKwkJCQluc2Nhbi0tOworCQkJfSBlbHNlIGlmICgqcHNjYW4gIT0gJ1wwJykgeworCQkJCUVSUkRSVigiJXMgLSBtaXNzaW5nIHNlcGFyYXRvciBhZnRlciBxdW90ZWQgc3RyaW5nIiwgX19mdW5jX18pOworCQkJCWtmcmVlKHZhbHVlKTsKKwkJCQl2YWx1ZSA9IE5VTEw7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisJY3R4LT5jdXJyID0gcHNjYW47CisJY3R4LT5ieXRlc19yZW1haW5pbmcgPSBuc2NhbjsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgKgorcGFyc2VyX3N0cmluZ19nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCkKK3sKKwl1OCAqcHNjYW47CisJdWxvbmcgbnNjYW47CisJaW50IHZhbHVlX2xlbmd0aCA9IC0xOworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlpbnQgaTsKKworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKwlwc2NhbiA9IGN0eC0+Y3VycjsKKwluc2NhbiA9IGN0eC0+Ynl0ZXNfcmVtYWluaW5nOworCWlmIChuc2NhbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIXBzY2FuKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwLCB2YWx1ZV9sZW5ndGggPSAtMTsgaSA8IG5zY2FuOyBpKyspCisJCWlmIChwc2NhbltpXSA9PSAnXDAnKSB7CisJCQl2YWx1ZV9sZW5ndGggPSBpOworCQkJYnJlYWs7CisJCX0KKwlpZiAodmFsdWVfbGVuZ3RoIDwgMCkJLyogJ1wwJyB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBsZW5ndGggKi8KKwkJdmFsdWVfbGVuZ3RoID0gbnNjYW47CisJdmFsdWUgPSBrbWFsbG9jKHZhbHVlX2xlbmd0aCArIDEsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKHZhbHVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmICh2YWx1ZV9sZW5ndGggPiAwKQorCQltZW1jcHkodmFsdWUsIHBzY2FuLCB2YWx1ZV9sZW5ndGgpOworCSgodTggKikgKHZhbHVlKSlbdmFsdWVfbGVuZ3RoXSA9ICdcMCc7CisJcmV0dXJuIHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNjNTBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmgKQEAgLTAsMCArMSw0NSBAQAorLyogcGFyc2VyLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19QQVJTRVJfSF9fCisjZGVmaW5lIF9fUEFSU0VSX0hfXworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorCit0eXBlZGVmIGVudW0geworCVBBUlNFUlNUUklOR19JTklUSUFUT1IsCisJUEFSU0VSU1RSSU5HX1RBUkdFVCwKKwlQQVJTRVJTVFJJTkdfQ09OTkVDVElPTiwKKwlQQVJTRVJTVFJJTkdfTkFNRSwKK30gUEFSU0VSX1dISUNIX1NUUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFSU0VSX0NPTlRFWFRfVGFnIFBBUlNFUl9DT05URVhUOworCitQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2luaXQoVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLCBCT09MICp0cnlBZ2Fpbik7CitQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2luaXRfYnl0ZVN0cmVhbShVNjQgYWRkciwgVTMyIGJ5dGVzLCBCT09MIGlzTG9jYWwsCisJCQkJICAgICAgIEJPT0wgKnRyeUFnYWluKTsKK3ZvaWQgcGFyc2VyX3BhcmFtX3N0YXJ0KFBBUlNFUl9DT05URVhUICpjdHgsIFBBUlNFUl9XSElDSF9TVFJJTkcgd2hpY2hfc3RyaW5nKTsKK3ZvaWQgKnBhcnNlcl9wYXJhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgY2hhciAqbmFtLCBpbnQgbmFtZXNpemUpOwordm9pZCAqcGFyc2VyX3N0cmluZ19nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCk7CitHVUlEIHBhcnNlcl9pZF9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCk7CitjaGFyICpwYXJzZXJfc2ltcGxlU3RyaW5nX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KTsKK3ZvaWQgKnBhcnNlcl9ieXRlU3RyZWFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCB1bG9uZyAqbmJ5dGVzKTsKK3ZvaWQgcGFyc2VyX2RvbmUoUEFSU0VSX0NPTlRFWFQgKmN0eCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdGVzdGluZy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdGVzdGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGY1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC90ZXN0aW5nLmgKQEAgLTAsMCArMSw0MSBAQAorLyogdGVzdGluZy5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVklTT1JDSElQU0VUX1RFU1RJTkdfSF9fCisjZGVmaW5lIF9fVklTT1JDSElQU0VUX1RFU1RJTkdfSF9fCisKKyNkZWZpbmUgVklTT1JDSElQU0VUX1RFU1RfUFJPQworI2luY2x1ZGUgImdsb2JhbHMuaCIKKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisKK3ZvaWQgdGVzdF9wcm9kdWNlX3Rlc3RfbWVzc2FnZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBpbnQgaXNMb2NhbFRlc3RBZGRyKTsKK0JPT0wgdGVzdF9jb25zdW1lX3Rlc3RfbWVzc2FnZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV92bmljX2NsaWVudF9hZGQodm9pZCAqcCk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfdm5pY19jbGllbnRfYWRkX3BoeXMoSE9TVEFERFJFU1MgYWRkcik7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfcHJlYW1ibGVfbWVzc2FnZXModm9pZCk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfZGV2aWNlX2F0dGFjaCh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldmljZV9hZGQodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBHVUlEIGRhdGFUeXBlR3VpZCwKKwkJCQkgdm9pZCAqcENoYW5uZWwpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2FkZF9idXModWxvbmcgYnVzTm8sIHVsb25nIG1heERldmljZXMsCisJCQkgICAgICBHVUlEIGlkLCB1OCAqbmFtZSwgQk9PTCBpc1NlcnZlcik7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfZGV2aWNlX2Rlc3Ryb3kodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9idXNfZGVzdHJveSh1bG9uZyBidXNObyk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfZGV0YWNoX2V4dGVybmFsUG9ydCh1bG9uZyBzd2l0Y2hObywgdWxvbmcgZXh0ZXJuYWxQb3J0Tm8pOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldGFjaF9pbnRlcm5hbFBvcnQodWxvbmcgc3dpdGNoTm8sIHVsb25nIGludGVybmFsUG9ydE5vKTsKK3ZvaWQgdGVzdF9jbGVhbnVwKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiZjIwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCkBAIC0wLDAgKzEsMzA3IEBACisvKiB2aXNvcmNoaXBzZXQuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9IX18KKyNkZWZpbmUgX19WSVNPUkNISVBTRVRfSF9fCisKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAicHJvY29iamVjdHRyZWUuaCIKKyNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgorI2luY2x1ZGUgInZidXNoZWxwZXIuaCIKKworLyoqIERlc2NyaWJlcyB0aGUgc3RhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Ygd2hpY2ggY29udHJvbHZtIG1lc3NhZ2VzIGhhdmUKKyAqICBiZWVuIHJlY2VpdmVkIGZvciBhIGJ1cyBvciBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlVMzIgY3JlYXRlZDoxOworCVUzMiBhdHRhY2hlZDoxOworCVUzMiBjb25maWd1cmVkOjE7CisJVTMyIHJ1bm5pbmc6MTsKKwkvKiBBZGQgbmV3IGZpZWxkcyBhYm92ZS4gKi8KKwkvKiBSZW1haW5pbmcgYml0cyBpbiB0aGlzIDMyLWJpdCB3b3JkIGFyZSB1bnVzZWQuICovCit9IFZJU09SQ0hJUFNFVF9TVEFURTsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiogYWRkcmVzcyBpcyBndWVzdCBwaHlzaWNhbCwgYnV0IG91dHNpZGUgb2YgdGhlIHBoeXNpY2FsIG1lbW9yeQorCSAqICByZWdpb24gdGhhdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBydW5uaW5nIE9TICh0aGlzIGlzIHRoZSBub3JtYWwKKwkgKiAgYWRkcmVzcyB0eXBlIGZvciBTdXBlcnZpc29yIGNoYW5uZWxzKQorCSAqLworCUFERFJUWVBFX2xvY2FsUGh5c2ljYWwsCisKKwkvKiogYWRkcmVzcyBpcyBndWVzdCBwaHlzaWNhbCwgYW5kIHdpdGhJTiB0aGUgY29uZmluZXMgb2YgdGhlCisJICogIHBoeXNpY2FsIG1lbW9yeSBjb250cm9sbGVkIGJ5IHRoZSBydW5uaW5nIE9TLgorCSAqLworCUFERFJUWVBFX2xvY2FsVGVzdCwKK30gVklTT1JDSElQU0VUX0FERFJFU1NUWVBFOworCit0eXBlZGVmIGVudW0geworCUNSQVNIX2RldiwKKwlDUkFTSF9idXMsCit9IENSQVNIX09CSl9UWVBFOworCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgY2hhbm5lbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRSBhZGRyVHlwZTsKKwlIT1NUQUREUkVTUyBjaGFubmVsQWRkcjsKKwlzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOworCVU2NCBuQ2hhbm5lbEJ5dGVzOworCUdVSUQgY2hhbm5lbFR5cGVHdWlkOworCUdVSUQgY2hhbm5lbEluc3RHdWlkOworCit9IFZJU09SQ0hJUFNFVF9DSEFOTkVMX0lORk87CisKKy8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBkZXZpY2UuCisgKiAgQW55IHZpc29yY2hpcHNldCBjbGllbnQgY2FuIHF1ZXJ5IHRoZXNlIGF0dHJpYnV0ZXMgdXNpbmcKKyAqICB2aXNvcmNoaXBzZXRfZ2V0X2NsaWVudF9kZXZpY2VfaW5mbygpIG9yCisgKiAgdmlzb3JjaGlwc2V0X2dldF9zZXJ2ZXJfZGV2aWNlX2luZm8oKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJVTMyIGJ1c05vOworCVUzMiBkZXZObzsKKwlHVUlEIGRldkluc3RHdWlkOworCVZJU09SQ0hJUFNFVF9TVEFURSBzdGF0ZTsKKwlWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPIGNoYW5JbmZvOworCVUzMiBSZXNlcnZlZDE7CQkvKiBDT05UUk9MVk1fSUQgKi8KKwlVNjQgUmVzZXJ2ZWQyOworCVUzMiBzd2l0Y2hObzsJCS8qIHdoZW4gZGV2U3RhdGUuYXR0YWNoZWQ9PTEgKi8KKwlVMzIgaW50ZXJuYWxQb3J0Tm87CS8qIHdoZW4gZGV2U3RhdGUuYXR0YWNoZWQ9PTEgKi8KKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgcGVuZGluZ01zZ0hkcjsJLyogQ09OVFJPTFZNX01FU1NBR0UgKi8KKwkvKiogRm9yIHByaXZhdGUgdXNlIGJ5IHRoZSBidXMgZHJpdmVyICovCisJdm9pZCAqYnVzX2RyaXZlcl9jb250ZXh0OworCit9IFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTzsKKworc3RhdGljIGlubGluZSBWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKgorZmluZGRldmljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CisJCWlmIChwLT5idXNObyA9PSBidXNObyAmJiBwLT5kZXZObyA9PSBkZXZObykKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlbGJ1c2RldmljZXMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgVTMyIGJ1c05vKQoreworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgbGlzdCwgZW50cnkpIHsKKwkJaWYgKHAtPmJ1c05vID09IGJ1c05vKSB7CisJCQlsaXN0X2RlbCgmcC0+ZW50cnkpOworCQkJa2ZyZWUocCk7CisJCX0KKwl9Cit9CisKKy8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBidXMuCisgKiAgKEZvciBhIHNlcnZpY2UgcGFydGl0aW9uIGFjdGluZyBhcyB0aGUgc2VydmVyIGZvciBidXNlcy9kZXZpY2VzLCB0aGVyZQorICogIGlzIGEgMS10by0xIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJ1c3NlcyBhbmQgZ3Vlc3QgcGFydGl0aW9ucy4pCisgKiAgQW55IHZpc29yY2hpcHNldCBjbGllbnQgY2FuIHF1ZXJ5IHRoZXNlIGF0dHJpYnV0ZXMgdXNpbmcKKyAqICB2aXNvcmNoaXBzZXRfZ2V0X2NsaWVudF9idXNfaW5mbygpIG9yIHZpc29yY2hpcHNldF9nZXRfYnVzX2luZm8oKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJVTMyIGJ1c05vOworCVZJU09SQ0hJUFNFVF9TVEFURSBzdGF0ZTsKKwlWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPIGNoYW5JbmZvOworCUdVSUQgcGFydGl0aW9uR3VpZDsKKwlVNjQgcGFydGl0aW9uSGFuZGxlOworCVU4ICpuYW1lOwkJLyogVVRGOCAqLworCVU4ICpkZXNjcmlwdGlvbjsJLyogVVRGOCAqLworCVU2NCBSZXNlcnZlZDE7CisJVTMyIFJlc2VydmVkMjsKKwlNWVBST0NPQkpFQ1QgKnByb2NPYmplY3Q7CisJc3RydWN0IHsKKwkJVTMyIHNlcnZlcjoxOworCQkvKiBBZGQgbmV3IGZpZWxkcyBhYm92ZS4gKi8KKwkJLyogUmVtYWluaW5nIGJpdHMgaW4gdGhpcyAzMi1iaXQgd29yZCBhcmUgdW51c2VkLiAqLworCX0gZmxhZ3M7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CS8qIENPTlRST0xWTSBNc2dIZHIgKi8KKwkvKiogRm9yIHByaXZhdGUgdXNlIGJ5IHRoZSBidXMgZHJpdmVyICovCisJdm9pZCAqYnVzX2RyaXZlcl9jb250ZXh0OworCVU2NCBkZXZObzsKKworfSBWSVNPUkNISVBTRVRfQlVTX0lORk87CisKK3N0YXRpYyBpbmxpbmUgVklTT1JDSElQU0VUX0JVU19JTkZPICoKK2ZpbmRidXMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgVTMyIGJ1c05vKQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgbGlzdCwgZW50cnkpIHsKKwkJaWYgKHAtPmJ1c05vID09IGJ1c05vKQorCQkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3Igc3dpdGNoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIHN3aXRjaE5vOworCVZJU09SQ0hJUFNFVF9TVEFURSBzdGF0ZTsKKwlHVUlEIHN3aXRjaFR5cGVHdWlkOworCVU4ICphdXRoU2VydmljZTE7CisJVTggKmF1dGhTZXJ2aWNlMjsKKwlVOCAqYXV0aFNlcnZpY2UzOworCVU4ICpzZWN1cml0eUNvbnRleHQ7CisJVTY0IFJlc2VydmVkOworCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlCT09MIGRldl9leGlzdHM7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CisKK30gVklTT1JDSElQU0VUX1NXSVRDSF9JTkZPOworCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgZXh0ZXJuYWwgcG9ydCwgd2hpY2ggaXMgY29ubmVjdGVkCisgKiAgdG8gYSBzcGVjaWZpYyBzd2l0Y2guCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlVMzIgc3dpdGNoTm87CisJVTMyIGV4dGVybmFsUG9ydE5vOworCVZJU09SQ0hJUFNFVF9TVEFURSBzdGF0ZTsKKwlHVUlEIG5ldHdvcmtab25lR3VpZDsKKwlpbnQgcGRQb3J0OworCVU4ICppcDsKKwlVOCAqaXBOZXRtYXNrOworCVU4ICppcEJyb2FkY2FzdDsKKwlVOCAqaXBOZXR3b3JrOworCVU4ICppcEdhdGV3YXk7CisJVTggKmlwRE5TOworCVU2NCBSZXNlcnZlZDE7CisJVTMyIFJlc2VydmVkMjsJCS8qIENPTlRST0xWTV9JRCAqLworCXN0cnVjdCBkZXZpY2UgZGV2OworCUJPT0wgZGV2X2V4aXN0czsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgcGVuZGluZ01zZ0hkcjsKKworfSBWSVNPUkNISVBTRVRfRVhURVJOQUxQT1JUX0lORk87CisKKy8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBpbnRlcm5hbCBwb3J0LCB3aGljaCBpcyBob3cgYQorICogIGRldmljZSBjb25uZWN0cyB0byBhIHBhcnRpY3VsYXIgc3dpdGNoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIHN3aXRjaE5vOworCVUzMiBpbnRlcm5hbFBvcnRObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJVTMyIGJ1c05vOwkJLyogdmFsaWQgb25seSB3aGVuIHN0YXRlLmF0dGFjaGVkID09IDEgKi8KKwlVMzIgZGV2Tm87CQkvKiB2YWxpZCBvbmx5IHdoZW4gc3RhdGUuYXR0YWNoZWQgPT0gMSAqLworCVU2NCBSZXNlcnZlZDE7CisJVTMyIFJlc2VydmVkMjsJCS8qIENPTlRST0xWTV9JRCAqLworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOworCU1ZUFJPQ09CSkVDVCAqcHJvY09iamVjdDsKKworfSBWSVNPUkNISVBTRVRfSU5URVJOQUxQT1JUX0lORk87CisKKy8qICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdmlzb3JjaGlwc2V0IHdoZW4gY2VydGFpbgorICogIGV2ZW50cyBoYXBwZW4uICAoVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBvdXRzaWRlIG9mCisgKiAgdmlzb3JjaGlwc2V0LikKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKCpidXNfY3JlYXRlKSh1bG9uZyBidXNObyk7CisJdm9pZCAoKmJ1c19kZXN0cm95KSh1bG9uZyBidXNObyk7CisJdm9pZCAoKmRldmljZV9jcmVhdGUpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObyk7CisJdm9pZCAoKmRldmljZV9kZXN0cm95KSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCXZvaWQgKCpkZXZpY2VfcGF1c2UpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObyk7CisJdm9pZCAoKmRldmljZV9yZXN1bWUpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObyk7CisJaW50ICgqZ2V0X2NoYW5uZWxfaW5mbykoR1VJRCB0eXBlR3VpZCwgdWxvbmcgKm1pblNpemUsCisJCQkJIHVsb25nICptYXhTaXplKTsKK30gVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlM7CisKKy8qICBUaGVzZSBmdW5jdGlvbnMgbGl2ZSBpbnNpZGUgdmlzb3JjaGlwc2V0LCBhbmQgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUKKyAqICByZXNwb25zZXMgdG8gc3BlY2lmaWMgZXZlbnRzIChieSBjb2RlIG91dHNpZGUgb2Ygdmlzb3JjaGlwc2V0KS4KKyAqICBGb3Igbm93LCB0aGUgdmFsdWUgZm9yIGVhY2ggcmVzcG9uc2UgaXMgc2ltcGx5IGVpdGhlcjoKKyAqICAgICAgIDAgPSBpdCB3b3JrZWQKKyAqICAgICAgLTEgPSBpdCBmYWlsZWQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKCpidXNfY3JlYXRlKSh1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKTsKKwl2b2lkICgqYnVzX2Rlc3Ryb3kpKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKCpkZXZpY2VfY3JlYXRlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7CisJdm9pZCAoKmRldmljZV9kZXN0cm95KSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7CisJdm9pZCAoKmRldmljZV9wYXVzZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKCpkZXZpY2VfcmVzdW1lKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7Cit9IFZJU09SQ0hJUFNFVF9CVVNERVZfUkVTUE9OREVSUzsKKworLyoqIFJlZ2lzdGVyIGZ1bmN0aW9ucyAoaW4gdGhlIGJ1cyBkcml2ZXIpIHRvIGdldCBjYWxsZWQgYnkgdmlzb3JjaGlwc2V0CisgKiAgd2hlbmV2ZXIgYSBidXMgb3IgZGV2aWNlIGFwcGVhcnMgZm9yIHdoaWNoIHRoaXMgc2VydmljZSBwYXJ0aXRpb24gaXMKKyAqICB0byBiZSB0aGUgc2VydmVyIGZvci4gIHZpc29yY2hpcHNldCB3aWxsIGZpbGwgaW4gPHJlc3BvbmRlcnM+LCB0bworICogIGluZGljYXRlIGZ1bmN0aW9ucyB0aGUgYnVzIGRyaXZlciBzaG91bGQgY2FsbCB0byBpbmRpY2F0ZSBtZXNzYWdlCisgKiAgcmVzcG9uc2VzLgorICovCit2b2lkCit2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X2NsaWVudChWSVNPUkNISVBTRVRfQlVTREVWX05PVElGSUVSUyAqbm90aWZpZXJzLAorCQkJCSAgICBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMgKnJlc3BvbmRlcnMsCisJCQkJICAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqZHJpdmVySW5mbyk7CisKKy8qKiBSZWdpc3RlciBmdW5jdGlvbnMgKGluIHRoZSBidXMgZHJpdmVyKSB0byBnZXQgY2FsbGVkIGJ5IHZpc29yY2hpcHNldAorICogIHdoZW5ldmVyIGEgYnVzIG9yIGRldmljZSBhcHBlYXJzIGZvciB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzCisgKiAgdG8gYmUgdGhlIGNsaWVudCBmb3IuICB2aXNvcmNoaXBzZXQgd2lsbCBmaWxsIGluIDxyZXNwb25kZXJzPiwgdG8KKyAqICBpbmRpY2F0ZSBmdW5jdGlvbnMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGNhbGwgdG8gaW5kaWNhdGUgbWVzc2FnZQorICogIHJlc3BvbnNlcy4KKyAqLwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9zZXJ2ZXIoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pOworCit0eXBlZGVmIHZvaWQgKCpTUEFSUkVQT1JURVZFTlRfQ09NUExFVEVfRlVOQykgKENPTlRST0xWTV9NRVNTQUdFICptc2csCisJCQkJCSAgICAgICBpbnQgc3RhdHVzKTsKKwordm9pZCB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKKworQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKHVsb25nIGJ1c05vLCBWSVNPUkNISVBTRVRfQlVTX0lORk8gKmJ1c0luZm8pOworQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X2RldmljZV9pbmZvKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywKKwkJCQkgIFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqZGV2SW5mbyk7CitCT09MIHZpc29yY2hpcHNldF9nZXRfc3dpdGNoX2luZm8odWxvbmcgc3dpdGNoTm8sCisJCQkJICBWSVNPUkNISVBTRVRfU1dJVENIX0lORk8gKnN3aXRjaEluZm8pOworQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X2V4dGVybmFscG9ydF9pbmZvKHVsb25nIHN3aXRjaE5vLCB1bG9uZyBleHRlcm5hbFBvcnRObywKKwkJCQkJVklTT1JDSElQU0VUX0VYVEVSTkFMUE9SVF9JTkZPCisJCQkJCSpleHRlcm5hbFBvcnRJbmZvKTsKK0JPT0wgdmlzb3JjaGlwc2V0X3NldF9idXNfY29udGV4dCh1bG9uZyBidXNObywgdm9pZCAqY29udGV4dCk7CitCT09MIHZpc29yY2hpcHNldF9zZXRfZGV2aWNlX2NvbnRleHQodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCB2b2lkICpjb250ZXh0KTsKK2ludCB2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSh2b2lkKTsKK2ludCB2aXNvcmNoaXBzZXRfY2hpcHNldF9zZWxmdGVzdCh2b2lkKTsKK2ludCB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKTsKK3ZvaWQgdmlzb3JjaGlwc2V0X2NvbnRyb2x2bV9yZXNwb25kX3JlcG9ydEV2ZW50KENPTlRST0xWTV9NRVNTQUdFICptc2csCisJCQkJCQl2b2lkICpwYXlsb2FkKTsKK3ZvaWQgdmlzb3JjaGlwc2V0X3NhdmVfbWVzc2FnZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBDUkFTSF9PQkpfVFlQRSB0eXBlKTsKK3ZvaWQgKnZpc29yY2hpcHNldF9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcG9vbCwKKwkJCSAgICAgICBCT09MIG9rX3RvX2Jsb2NrLCBjaGFyICpmbiwgaW50IGxuKTsKK3ZvaWQgdmlzb3JjaGlwc2V0X2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsIHZvaWQgKnAsCisJCQkgICAgIGNoYXIgKmZuLCBpbnQgbG4pOworCisjaWYgZGVmaW5lZChUUkFOU01JVEZJTEVfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCisjZGVmaW5lIERCR19HRVRGSUxFX1BBWUxPQUQobXNnLCBjb250cm9sdm1faGVhZGVyKSAgICAgIFwKKwlMT0dJTkYobXNnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICh1bG9uZyljb250cm9sdm1faGVhZGVyLlBheWxvYWRWbU9mZnNldCwgXAorCSAgICAgICAodWxvbmcpY29udHJvbHZtX2hlYWRlci5QYXlsb2FkTWF4Qnl0ZXMpCisjZGVmaW5lIERCR19HRVRGSUxFKGZtdCwgLi4uKSAgTE9HSU5GKGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgREJHX1BVVEZJTEUoZm10LCAuLi4pICBMT0dJTkYoZm10LCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgREJHX0dFVEZJTEVfUEFZTE9BRChtc2csIGNvbnRyb2x2bV9oZWFkZXIpCisjZGVmaW5lIERCR19HRVRGSUxFKGZtdCwgLi4uKQorI2RlZmluZSBEQkdfUFVURklMRShmbXQsIC4uLikKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTJjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfbWFpbi5jCkBAIC0wLDAgKzEsMjk0NSBAQAorLyogdmlzb3JjaGlwc2V0X21haW4uYworICoKKyAqIENvcHlyaWdodCDvv70gMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgImNvbnRyb2x2bS5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgInByb2NvYmplY3R0cmVlLmgiCisjaW5jbHVkZSAidmlzb3JjaGFubmVsLmgiCisjaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgorI2luY2x1ZGUgInRlc3RpbmcuaCIKKyNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAiZ3VpZHV0aWxzLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIgorI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgorI2luY2x1ZGUgImZpbGV4ZmVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQ0hJUFNFVF9QQ192aXNvcmNoaXBzZXRfbWFpbl9jCisjZGVmaW5lIFRFU1RfVk5JQ19QSFlTSVRGICJldGgwIgkvKiBwaHlzaWNhbCBuZXR3b3JrIGl0ZiBmb3IKKwkJCQkJICogdm5pYyBsb29wYmFjayB0ZXN0ICovCisjZGVmaW5lIFRFU1RfVk5JQ19TV0lUQ0hOTyAxCisjZGVmaW5lIFRFU1RfVk5JQ19CVVNOTyA5CisKKyNkZWZpbmUgTUFYX05BTUVfU0laRSAxMjgKKyNkZWZpbmUgTUFYX0lQX1NJWkUgICA1MAorI2RlZmluZSBNQVhPVVRTVEFORElOR0NIQU5ORUxDT01NQU5EIDI1NgorI2RlZmluZSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1QgICAxCisjZGVmaW5lIFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVyAxMDAKKworLyogV2hlbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgaXMgaWRsZSBmb3IgYXQgbGVhc3QgTUlOX0lETEVfU0VDT05EUywKKyogd2Ugc3dpdGNoIHRvIHNsb3cgcG9sbGluZyBtb2RlLiAgQXMgc29vbiBhcyB3ZSBnZXQgYSBjb250cm9sdm0KKyogbWVzc2FnZSwgd2Ugc3dpdGNoIGJhY2sgdG8gZmFzdCBwb2xsaW5nIG1vZGUuCisqLworI2RlZmluZSBNSU5fSURMRV9TRUNPTkRTIDEwCitzdGF0aWMgdWxvbmcgUG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUOworc3RhdGljIHVsb25nIE1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllczsJLyogd2hlbiB3ZSBnb3Qgb3VyIGxhc3QKKwkJCQkJCSAqIGNvbnRyb2x2bSBtZXNzYWdlICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorTk9OVUxMU1RSKGNoYXIgKnMpCit7CisJaWYgKHMpCisJCXJldHVybiBzOworCWVsc2UKKwkJcmV0dXJuICIiOworfQorCitzdGF0aWMgaW50IHNlcnZlcnJlZ2lzdGVyZWQ7CitzdGF0aWMgaW50IGNsaWVudHJlZ2lzdGVyZWQ7CisKKyNkZWZpbmUgTUFYX0NISVBTRVRfRVZFTlRTIDIKK3N0YXRpYyBVOCBjaGlwc2V0X2V2ZW50c1tNQVhfQ0hJUFNFVF9FVkVOVFNdID0geyAwLCAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgZGVsYXllZF93b3JrIFBlcmlvZGljX2NvbnRyb2x2bV93b3JrOworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlOworc3RhdGljIERFRklORV9TRU1BUEhPUkUoTm90aWZpZXJMb2NrKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUNPTlRST0xWTV9NRVNTQUdFIG1lc3NhZ2U7CisJdW5zaWduZWQgaW50IGNyYzsKK30gTUVTU0FHRV9FTlZFTE9QRTsKKworc3RhdGljIENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBnX0RpYWdNc2dIZHI7CitzdGF0aWMgQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIGdfQ2hpcFNldE1zZ0hkcjsKK3N0YXRpYyBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgZ19EZWxEdW1wTXNnSGRyOworc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFEaWFnUG9vbENoYW5uZWxQcm90b2NvbEd1aWQgPQorCVVMVFJBX0RJQUdfUE9PTF9DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisvKiAweGZmZmZmZiBpcyBhbiBpbnZhbGlkIEJ1cy9EZXZpY2UgbnVtYmVyICovCitzdGF0aWMgdWxvbmcgZ19kaWFncG9vbEJ1c05vID0gMHhmZmZmZmY7CitzdGF0aWMgdWxvbmcgZ19kaWFncG9vbERldk5vID0gMHhmZmZmZmY7CitzdGF0aWMgQ09OVFJPTFZNX01FU1NBR0VfUEFDS0VUIGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQ7CisKKy8qIE9ubHkgVk5JQyBhbmQgVkhCQSBjaGFubmVscyBhcmUgc2VudCB0byB2aXNvcmNsaWVudGJ1cyAoYWthCisgKiAidmlzb3JoYWNrYnVzIikKKyAqLworI2RlZmluZSBGT1JfVklTT1JIQUNLQlVTKGNoYW5uZWxfdHlwZV9ndWlkKSBcCisJKChtZW1jbXAoJmNoYW5uZWxfdHlwZV9ndWlkLCAmVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCwgXAorCQkgc2l6ZW9mKEdVSUQpKSA9PSAwKSB8fAkJCQkgICAgXAorCSAobWVtY21wKCZjaGFubmVsX3R5cGVfZ3VpZCwgJlVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJIHNpemVvZihHVUlEKSkgPT0gMCkpCisjZGVmaW5lIEZPUl9WSVNPUkJVUyhjaGFubmVsX3R5cGVfZ3VpZCkgKCEoRk9SX1ZJU09SSEFDS0JVUyhjaGFubmVsX3R5cGVfZ3VpZCkpKQorCisjZGVmaW5lIGlzX2RpYWdwb29sX2NoYW5uZWwoY2hhbm5lbF90eXBlX2d1aWQpIFwKKwkgKG1lbWNtcCgmY2hhbm5lbF90eXBlX2d1aWQsIFwKKwkJICZVbHRyYURpYWdQb29sQ2hhbm5lbFByb3RvY29sR3VpZCwgc2l6ZW9mKEdVSUQpKSA9PSAwKQorCit0eXBlZGVmIGVudW0geworCVBBUlRQUk9QX2ludmFsaWQsCisJUEFSVFBST1BfbmFtZSwKKwlQQVJUUFJPUF9kZXNjcmlwdGlvbiwKKwlQQVJUUFJPUF9oYW5kbGUsCisJUEFSVFBST1BfYnVzTnVtYmVyLAorCS8qIGFkZCBuZXcgcHJvcGVydGllcyBhYm92ZSwgYnV0IGRvbid0IGZvcmdldCB0byBjaGFuZ2UKKwkgKiBJbml0UGFydGl0aW9uUHJvcGVydGllcygpIGFuZCBzaG93X3BhcnRpdGlvbl9wcm9wZXJ0eSgpIGFsc28uLi4KKwkgKi8KKwlQQVJUUFJPUF9sYXN0Cit9IFBBUlRJVElPTl9wcm9wZXJ0eTsKK3N0YXRpYyBjb25zdCBjaGFyICpQYXJ0aXRpb25UeXBlTmFtZXNbXSA9IHsgInBhcnRpdGlvbiIsIE5VTEwgfTsKKworc3RhdGljIGNoYXIgKlBhcnRpdGlvblByb3BlcnR5TmFtZXNbUEFSVFBST1BfbGFzdCArIDFdOworc3RhdGljIHZvaWQKK0luaXRQYXJ0aXRpb25Qcm9wZXJ0aWVzKHZvaWQpCit7CisJY2hhciAqKnAgPSBQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzOworCXBbUEFSVFBST1BfaW52YWxpZF0gPSAiIjsKKwlwW1BBUlRQUk9QX25hbWVdID0gIm5hbWUiOworCXBbUEFSVFBST1BfZGVzY3JpcHRpb25dID0gImRlc2NyaXB0aW9uIjsKKwlwW1BBUlRQUk9QX2hhbmRsZV0gPSAiaGFuZGxlIjsKKwlwW1BBUlRQUk9QX2J1c051bWJlcl0gPSAiYnVzTnVtYmVyIjsKKwlwW1BBUlRQUk9QX2xhc3RdID0gTlVMTDsKK30KKwordHlwZWRlZiBlbnVtIHsKKwlDVExWTVBST1BfaW52YWxpZCwKKwlDVExWTVBST1BfcGh5c0FkZHIsCisJQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQWRkciwKKwlDVExWTVBST1BfY29udHJvbENoYW5uZWxCeXRlcywKKwlDVExWTVBST1Bfc3BhckJvb3RQYXJ0LAorCUNUTFZNUFJPUF9zcGFyU3RvcmFnZVBhcnQsCisJQ1RMVk1QUk9QX2xpdmVkdW1wTGVuZ3RoLAorCUNUTFZNUFJPUF9saXZlZHVtcENyYzMyLAorCS8qIGFkZCBuZXcgcHJvcGVydGllcyBhYm92ZSwgYnV0IGRvbid0IGZvcmdldCB0byBjaGFuZ2UKKwkgKiBJbml0Q29udHJvbFZtUHJvcGVydGllcygpIHNob3dfY29udHJvbHZtX3Byb3BlcnR5KCkgYWxzby4uLgorCSAqLworCUNUTFZNUFJPUF9sYXN0Cit9IENPTlRST0xWTV9wcm9wZXJ0eTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkNvbnRyb2xWbVR5cGVOYW1lc1tdID0geyAiY29udHJvbHZtIiwgTlVMTCB9OworCitzdGF0aWMgY2hhciAqQ29udHJvbFZtUHJvcGVydHlOYW1lc1tDVExWTVBST1BfbGFzdCArIDFdOworc3RhdGljIHZvaWQKK0luaXRDb250cm9sVm1Qcm9wZXJ0aWVzKHZvaWQpCit7CisJY2hhciAqKnAgPSBDb250cm9sVm1Qcm9wZXJ0eU5hbWVzOworCXBbQ1RMVk1QUk9QX2ludmFsaWRdID0gIiI7CisJcFtDVExWTVBST1BfcGh5c0FkZHJdID0gInBoeXNBZGRyIjsKKwlwW0NUTFZNUFJPUF9jb250cm9sQ2hhbm5lbEFkZHJdID0gImNvbnRyb2xDaGFubmVsQWRkciI7CisJcFtDVExWTVBST1BfY29udHJvbENoYW5uZWxCeXRlc10gPSAiY29udHJvbENoYW5uZWxCeXRlcyI7CisJcFtDVExWTVBST1Bfc3BhckJvb3RQYXJ0XSA9ICJzcGFyX2Jvb3RfcGFydCI7CisJcFtDVExWTVBST1Bfc3BhclN0b3JhZ2VQYXJ0XSA9ICJzcGFyX3N0b3JhZ2VfcGFydCI7CisJcFtDVExWTVBST1BfbGl2ZWR1bXBMZW5ndGhdID0gImxpdmVkdW1wTGVuZ3RoIjsKKwlwW0NUTFZNUFJPUF9saXZlZHVtcENyYzMyXSA9ICJsaXZlZHVtcENyYzMyIjsKKwlwW0NUTFZNUFJPUF9sYXN0XSA9IE5VTEw7Cit9CisKK3N0YXRpYyBNWVBST0NPQkpFQ1QgKkNvbnRyb2xWbU9iamVjdDsKK3N0YXRpYyBNWVBST0NUWVBFICpQYXJ0aXRpb25UeXBlOworc3RhdGljIE1ZUFJPQ1RZUEUgKkNvbnRyb2xWbVR5cGU7CisKKyNkZWZpbmUgVklTT1JDSElQU0VUX0RJQUdfUFJPQ19FTlRSWV9GTiAiZGlhZ2R1bXAiCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaWFnX3Byb2NfZGlyOworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9DSElQU0VUX1BST0NfRU5UUllfRk4gImNoaXBzZXRyZWFkeSIKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmNoaXBzZXRfcHJvY19kaXI7CisKKyNkZWZpbmUgVklTT1JDSElQU0VUX1BBUkFIT1RQTFVHX1BST0NfRU5UUllfRk4gInBhcmFob3RwbHVnIgorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyYWhvdHBsdWdfcHJvY19kaXI7CisKK3N0YXRpYyBMSVNUX0hFQUQoQnVzSW5mb0xpc3QpOworc3RhdGljIExJU1RfSEVBRChEZXZJbmZvTGlzdCk7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEaXI7CitzdGF0aWMgVklTT1JDSEFOTkVMICpDb250cm9sVm1fY2hhbm5lbDsKKworc3RhdGljIHNzaXplX3Qgdmlzb3JjaGlwc2V0X3Byb2NfcmVhZF93cml0ZW9ubHkoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQljaGFyIF9fdXNlciAqYnVmLAorCQkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIHNzaXplX3QgcHJvY19yZWFkX2luc3RhbGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7CitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2luc3RhbGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY19yZWFkX3Rvb2xhY3Rpb24oc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfdG9vbGFjdGlvbihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBwcm9jX3JlYWRfYm9vdFRvVG9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZV9ib290VG9Ub29sKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5zdGFsbGVyX2ZvcHMgPSB7CisJLnJlYWQgPSBwcm9jX3JlYWRfaW5zdGFsbGVyLAorCS53cml0ZSA9IHByb2Nfd3JpdGVfaW5zdGFsbGVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190b29sYWN0aW9uX2ZvcHMgPSB7CisJLnJlYWQgPSBwcm9jX3JlYWRfdG9vbGFjdGlvbiwKKwkud3JpdGUgPSBwcm9jX3dyaXRlX3Rvb2xhY3Rpb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Jvb3RUb1Rvb2xfZm9wcyA9IHsKKwkucmVhZCA9IHByb2NfcmVhZF9ib290VG9Ub29sLAorCS53cml0ZSA9IHByb2Nfd3JpdGVfYm9vdFRvVG9vbCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVOCBfX2lvbWVtICpwdHI7CS8qIHBvaW50ZXIgdG8gYmFzZSBhZGRyZXNzIG9mIHBheWxvYWQgcG9vbCAqLworCVU2NCBvZmZzZXQ7CQkvKiBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgY29udHJvbHZtCisJCQkJICogY2hhbm5lbCB0byBiZWdpbm5pbmcgb2YgcGF5bG9hZCAqIHBvb2wgKi8KKwlVMzIgYnl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gcGF5bG9hZCBwb29sICovCit9IENPTlRST0xWTV9QQVlMT0FEX0lORk87CisKKy8qIE1hbmFnZXMgdGhlIHJlcXVlc3QgcGF5bG9hZCBpbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgKi8KK3N0YXRpYyBDT05UUk9MVk1fUEFZTE9BRF9JTkZPIENvbnRyb2xWbV9wYXlsb2FkX2luZm87CisKK3N0YXRpYyBwQ0hBTk5FTF9IRUFERVIgVGVzdF9WbmljX2NoYW5uZWw7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgRHVtcGNhcHR1cmVfaGVhZGVyOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBHZXR0ZXh0ZHVtcF9oZWFkZXI7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIER1bXBjb21wbGV0ZV9oZWFkZXI7CisJQk9PTCBHZXR0ZXh0ZHVtcF9vdXRzdGFuZGluZzsKKwl1MzIgY3JjMzI7CisJdWxvbmcgbGVuZ3RoOworCWF0b21pY190IGJ1ZmZlcnNfaW5fdXNlOworCXVsb25nIGRlc3RpbmF0aW9uOworfSBMSVZFRFVNUF9JTkZPOworLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLworICogQ09OVFJPTFZNX0RVTVBfR0VUVEVYVERVTVAgLyBDT05UUk9MVk1fRFVNUF9DT01QTEVURSBjb252ZXJzYXRpb24uCisgKi8KK3N0YXRpYyBMSVZFRFVNUF9JTkZPIExpdmVEdW1wX2luZm87CisKKy8qIFRoZSBmb2xsb3dpbmcgZ2xvYmFscyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSB1bmFibGUgdG8KKyAqIG9mZmxvYWQgdGhlIHBheWxvYWQgZnJvbSBhIGNvbnRyb2x2bSBtZXNzYWdlIGR1ZSB0byBtZW1vcnkgcmVxdWlyZW1lbnRzLiAgSW4KKyAqIHRoaXMgc2NlbmFyaW8sIHdlIHNpbXBseSBzdGFzaCB0aGUgY29udHJvbHZtIG1lc3NhZ2UsIHRoZW4gYXR0ZW1wdCB0bworICogcHJvY2VzcyBpdCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKCkgcnVucy4KKyAqLworc3RhdGljIENPTlRST0xWTV9NRVNTQUdFIENvbnRyb2xWbV9QZW5kaW5nX01zZzsKK3N0YXRpYyBCT09MIENvbnRyb2xWbV9QZW5kaW5nX01zZ19WYWxpZCA9IEZBTFNFOworCisvKiBQb29sIG9mIHN0cnVjdCBwdXRmaWxlX2J1ZmZlcl9lbnRyeSwgZm9yIGtlZXBpbmcgdHJhY2sgb2YgcGVuZGluZyAoaW5jb21pbmcpCisgKiBUUkFOU01JVF9GSUxFIFB1dEZpbGUgcGF5bG9hZHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sOworc3RhdGljIGNvbnN0IGNoYXIgUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWVbXSA9CisJImNvbnRyb2x2bV9wdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wiOworCisvKiBUaGlzIGlkZW50aWZpZXMgYSBkYXRhIGJ1ZmZlciB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkIHZpYSBhIGNvbnRyb2x2bSBtZXNzYWdlcworICogaW4gYSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFIGNvbnZlcnNhdGlvbi4KKyAqLworc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CS8qIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QgKi8KKwlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsgLyogcG9pbnRzIHRvIGJ1ZmZlciBjb250YWluaW5nIGlucHV0IGRhdGEgKi8KK307CisKKy8qIExpc3Qgb2Ygc3RydWN0IHB1dGZpbGVfcmVxdWVzdCAqLCB2aWEgbmV4dF9wdXRmaWxlX3JlcXVlc3QgbWVtYmVyLgorICogRWFjaCBlbnRyeSBpbiB0aGlzIGxpc3QgaWRlbnRpZmllcyBhbiBvdXRzdGFuZGluZyBUUkFOU01JVF9GSUxFCisgKiBjb252ZXJzYXRpb24uCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoUHV0ZmlsZV9yZXF1ZXN0X2xpc3QpOworCisvKiBUaGlzIGRlc2NyaWJlcyBhIGJ1ZmZlciBhbmQgaXRzIGN1cnJlbnQgc3RhdGUgb2YgdHJhbnNmZXIgKGUuZy4sIGhvdyBtYW55CisgKiBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzdXBwbGllZCBhcyBwdXRmaWxlIGRhdGEsIGFuZCBob3cgbWFueSBieXRlcyBhcmUKKyAqIHJlbWFpbmluZykgZm9yIGEgcHV0ZmlsZV9yZXF1ZXN0LgorICovCitzdHJ1Y3QgcHV0ZmlsZV9hY3RpdmVfYnVmZmVyIHsKKwkvKiBhIHBheWxvYWQgZnJvbSBhIGNvbnRyb2x2bSBtZXNzYWdlLCBjb250YWluaW5nIGEgZmlsZSBkYXRhIGJ1ZmZlciAqLworCVBBUlNFUl9DT05URVhUICpwYXJzZXJfY3R4OworCS8qIHBvaW50cyB3aXRoaW4gZGF0YSBhcmVhIG9mIHBhcnNlcl9jdHggdG8gbmV4dCBieXRlIG9mIGRhdGEgKi8KKwl1OCAqcG5leHQ7CisJLyogIyBieXRlcyBsZWZ0IGZyb20gPHBuZXh0PiB0byB0aGUgZW5kIG9mIHRoaXMgZGF0YSBidWZmZXIgKi8KKwlzaXplX3QgYnl0ZXNfcmVtYWluaW5nOworfTsKKworI2RlZmluZSBQVVRGSUxFX1JFUVVFU1RfU0lHIDB4MDkwNjEwMTMwMjI4MTIxMQorLyogVGhpcyBpZGVudGlmaWVzIGEgc2luZ2xlIHJlbW90ZSAtLT4gbG9jYWwgQ09OVFJPTFZNX1RSQU5TTUlUX0ZJTEUKKyAqIGNvbnZlcnNhdGlvbi4gIFN0cnVjdHMgb2YgdGhpcyB0eXBlIGFyZSBkeW5hbWljYWxseSBsaW5rZWQgaW50bworICogPFB1dGZpbGVfcmVxdWVzdF9saXN0Pi4KKyAqLworc3RydWN0IHB1dGZpbGVfcmVxdWVzdCB7CisJdTY0IHNpZzsJCS8qIFBVVEZJTEVfUkVRVUVTVF9TSUcgKi8KKworCS8qIGhlYWRlciBmcm9tIG9yaWdpbmFsIFRyYW5zbWl0RmlsZSByZXF1ZXN0ICovCisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIGNvbnRyb2x2bV9oZWFkZXI7CisJdTY0IGZpbGVfcmVxdWVzdF9udW1iZXI7CS8qIGZyb20gb3JpZ2luYWwgVHJhbnNtaXRGaWxlIHJlcXVlc3QgKi8KKworCS8qIGxpbmsgdG8gbmV4dCBzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXh0X3B1dGZpbGVfcmVxdWVzdDsKKworCS8qIG1vc3QtcmVjZW50IHNlcXVlbmNlIG51bWJlciBzdXBwbGllZCB2aWEgYSBjb250cm9sdm0gbWVzc2FnZSAqLworCXU2NCBkYXRhX3NlcXVlbmNlX251bWJlcjsKKworCS8qIGhlYWQgb2YgcHV0ZmlsZV9idWZmZXJfZW50cnkgbGlzdCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBkYXRhIHRvIGJlCisJICogc3VwcGxpZWQgYXMgcHV0ZmlsZSBkYXRhOworCSAqIC0gdGhpcyBsaXN0IGlzIGFkZGVkIHRvIHdoZW4gY29udHJvbHZtIG1lc3NhZ2VzIGNvbWUgaW4gdGhhdCBzdXBwbHkKKwkgKiBmaWxlIGRhdGEKKwkgKiAtIHRoaXMgbGlzdCBpcyByZW1vdmVkIGZyb20gdmlhIHRoZSBob3RwbHVnIHByb2dyYW0gdGhhdCBpcyBhY3R1YWxseQorCSAqIGNvbnN1bWluZyB0aGVzZSBidWZmZXJzIHRvIHdyaXRlIGFzIGZpbGUgZGF0YSAqLworCXN0cnVjdCBsaXN0X2hlYWQgaW5wdXRfYnVmZmVyX2xpc3Q7CisJc3BpbmxvY2tfdCByZXFfbGlzdF9sb2NrOwkvKiBsb2NrIGZvciBpbnB1dF9idWZmZXJfbGlzdCAqLworCisJLyogd2FpdGVycyBmb3IgaW5wdXRfYnVmZmVyX2xpc3QgdG8gZ28gbm9uLWVtcHR5ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgaW5wdXRfYnVmZmVyX3dxOworCisJLyogZGF0YSBub3QgeWV0IHJlYWQgd2l0aGluIGN1cnJlbnQgcHV0ZmlsZV9idWZmZXJfZW50cnkgKi8KKwlzdHJ1Y3QgcHV0ZmlsZV9hY3RpdmVfYnVmZmVyIGFjdGl2ZV9idWY7CisKKwkvKiA8MCA9IGZhaWxlZCwgMCA9IGluLXByb2dyZXNzLCA+MCA9IHN1Y2Nlc3NmdWw7ICovCisJLyogbm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBzZXQgd2l0aCByZXFfbGlzdF9sb2NrLCBhbmQgaWYgeW91IHNldCA8MCwgKi8KKwkvKiBpdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGFsc28gZnJlZSB1cCBhbGwgb2YgdGhlIG90aGVyIG9iamVjdHMgKi8KKwkvKiBpbiB0aGlzIHN0cnVjdCAobGlrZSBpbnB1dF9idWZmZXJfbGlzdCwgYWN0aXZlX2J1Zi5wYXJzZXJfY3R4KSAqLworCS8qIGJlZm9yZSByZWxlYXNpbmcgdGhlIGxvY2sgKi8KKwlpbnQgY29tcGxldGlvbl9zdGF0dXM7Cit9OworCitzdGF0aWMgYXRvbWljX3QgVmlzb3JjaGlwc2V0X2NhY2hlX2J1ZmZlcnNfaW5fdXNlID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IGlkOworCXVuc2lnbmVkIGxvbmcgZXhwaXJhdGlvbjsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKFBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKFBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KK3N0YXRpYyB2b2lkIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKTsKKworLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLworICogQ09OVFJPTFZNX1JFUE9SVEVWRU5ULgorICovCitzdGF0aWMgVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnM7CitzdGF0aWMgVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgQnVzRGV2X0NsaWVudF9Ob3RpZmllcnM7CisKK3N0YXRpYyB2b2lkIGJ1c19jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBidXNfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGRldmljZV9jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgZGV2aWNlX3Jlc3VtZV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7CisKK3N0YXRpYyBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMgQnVzRGV2X1Jlc3BvbmRlcnMgPSB7CisJLmJ1c19jcmVhdGUgPSBidXNfY3JlYXRlX3Jlc3BvbnNlLAorCS5idXNfZGVzdHJveSA9IGJ1c19kZXN0cm95X3Jlc3BvbnNlLAorCS5kZXZpY2VfY3JlYXRlID0gZGV2aWNlX2NyZWF0ZV9yZXNwb25zZSwKKwkuZGV2aWNlX2Rlc3Ryb3kgPSBkZXZpY2VfZGVzdHJveV9yZXNwb25zZSwKKwkuZGV2aWNlX3BhdXNlID0gdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSwKKwkuZGV2aWNlX3Jlc3VtZSA9IGRldmljZV9yZXN1bWVfcmVzcG9uc2UsCit9OworCisvKiBpbmZvIGZvciAvZGV2L3Zpc29yY2hpcHNldCAqLworc3RhdGljIGRldl90IE1ham9yRGV2ID0gLTE7IC8qKjwgaW5kaWNhdGVzIG1ham9yIG51bSBmb3IgZGV2aWNlICovCisKKy8qIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aXNvcmNoaXBzZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIFZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UgPSB7CisJLm5hbWUgPSAidmlzb3JjaGlwc2V0IiwKKwkuaWQgPSAtMSwKK307CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkJCQkgICBpbnQgcmVzcG9uc2UsCisJCQkJCSAgIFVMVFJBX0NISVBTRVRfRkVBVFVSRSBmZWF0dXJlcyk7CitzdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqCisJCQkJCQkgIG1zZ0hkciwgaW50IHJlc3BvbnNlLAorCQkJCQkJICBVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlKTsKKworc3RhdGljIHZvaWQKK3Nob3dfcGFydGl0aW9uX3Byb3BlcnR5KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqY3R4LCBpbnQgcHJvcGVydHkpCit7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICppbmZvID0gKFZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqKSAoY3R4KTsKKworCXN3aXRjaCAocHJvcGVydHkpIHsKKwljYXNlIFBBUlRQUk9QX25hbWU6CisJCXNlcV9wcmludGYoZiwgIiVzXG4iLCBOT05VTExTVFIoaW5mby0+bmFtZSkpOworCQlicmVhazsKKwljYXNlIFBBUlRQUk9QX2Rlc2NyaXB0aW9uOgorCQlzZXFfcHJpbnRmKGYsICIlc1xuIiwgTk9OVUxMU1RSKGluZm8tPmRlc2NyaXB0aW9uKSk7CisJCWJyZWFrOworCWNhc2UgUEFSVFBST1BfaGFuZGxlOgorCQlzZXFfcHJpbnRmKGYsICIweCUtMTYuMTZMeFxuIiwgaW5mby0+cGFydGl0aW9uSGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJUUFJPUF9idXNOdW1iZXI6CisJCXNlcV9wcmludGYoZiwgIiVkXG4iLCBpbmZvLT5idXNObyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoZiwgIiglZD8/KVxuIiwgcHJvcGVydHkpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X2NvbnRyb2x2bV9wcm9wZXJ0eShzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKmN0eCwgaW50IHByb3BlcnR5KQoreworCS8qIE5vdGU6IGN0eCBpcyBub3QgbmVlZGVkIHNpbmNlIHdlIG9ubHkgaGF2ZSAxIGNvbnRyb2x2bSBjaGFubmVsICovCisJc3dpdGNoIChwcm9wZXJ0eSkgeworCWNhc2UgQ1RMVk1QUk9QX3BoeXNBZGRyOgorCQlpZiAoQ29udHJvbFZtX2NoYW5uZWwgPT0gTlVMTCkKKwkJCXNlcV9wdXRzKGYsICIweDBcbiIpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKGYsICIweCUtMTYuMTZMeFxuIiwKKwkJCQkgICB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyCisJCQkJICAgKENvbnRyb2xWbV9jaGFubmVsKSk7CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQWRkcjoKKwkJaWYgKENvbnRyb2xWbV9jaGFubmVsID09IE5VTEwpCisJCQlzZXFfcHV0cyhmLCAiMHgwXG4iKTsKKwkJZWxzZSB7CisJCQlHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGFkZHIgPSAwOworCQkJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJCSAgb2Zmc2V0b2YKKwkJCQkJICAoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJCSAgIGdwQ29udHJvbENoYW5uZWwpLCAmYWRkciwKKwkJCQkJICBzaXplb2YoYWRkcikpOworCQkJc2VxX3ByaW50ZihmLCAiMHglLTE2LjE2THhcbiIsICh1NjQpIChhZGRyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDVExWTVBST1BfY29udHJvbENoYW5uZWxCeXRlczoKKwkJaWYgKENvbnRyb2xWbV9jaGFubmVsID09IE5VTEwpCisJCQlzZXFfcHV0cyhmLCAiMHgwXG4iKTsKKwkJZWxzZSB7CisJCQlVMzIgYnl0ZXMgPSAwOworCQkJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJCSAgb2Zmc2V0b2YKKwkJCQkJICAoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJCSAgIENvbnRyb2xDaGFubmVsQnl0ZXMpLCAmYnl0ZXMsCisJCQkJCSAgc2l6ZW9mKGJ5dGVzKSk7CisJCQlzZXFfcHJpbnRmKGYsICIlbHVcbiIsICh1bG9uZykgKGJ5dGVzKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDVExWTVBST1Bfc3BhckJvb3RQYXJ0OgorCQlzZXFfcHV0cyhmLCAiMDowOjA6MC8xXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBDVExWTVBST1Bfc3BhclN0b3JhZ2VQYXJ0OgorCQlzZXFfcHV0cyhmLCAiMDowOjA6MC8yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBDVExWTVBST1BfbGl2ZWR1bXBMZW5ndGg6CisJCXNlcV9wcmludGYoZiwgIiVsdVxuIiwgTGl2ZUR1bXBfaW5mby5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIENUTFZNUFJPUF9saXZlZHVtcENyYzMyOgorCQlzZXFfcHJpbnRmKGYsICIlbHVcbiIsICh1bG9uZykgTGl2ZUR1bXBfaW5mby5jcmMzMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoZiwgIiglZD8/KVxuIiwgcHJvcGVydHkpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jX0luaXQodm9pZCkKK3sKKwlpZiAoUHJvY0RpciA9PSBOVUxMKSB7CisJCVByb2NEaXIgPSBwcm9jX21rZGlyKE1ZRFJWTkFNRSwgTlVMTCk7CisJCWlmIChQcm9jRGlyID09IE5VTEwpIHsKKwkJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYyBkaXJlY3RvcnkgJXMiLAorCQkJICAgICAgIE1ZRFJWTkFNRSk7CisJCQlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3Byb2NfRGVJbml0KHZvaWQpCit7CisJaWYgKFByb2NEaXIgIT0gTlVMTCkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoTVlEUlZOQU1FLCBOVUxMKTsKKwlQcm9jRGlyID0gTlVMTDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCit0ZXN0VW5pY29kZSh2b2lkKQoreworCXdjaGFyX3QgdW5pY29kZVN0cmluZ1tdID0geyAnYScsICdiJywgJ2MnLCAwIH07CisJY2hhciBzW3NpemVvZih1bmljb2RlU3RyaW5nKSAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFXTsKKwl3Y2hhcl90IHVuaWNvZGUyWzk5XTsKKworCS8qIE5PVEU6IEVpdGhlciBkdWUgdG8gYSBidWcsIG9yIGZlYXR1cmUgSSBkb24ndCB1bmRlcnN0YW5kLCB0aGUKKwkgKiAgICAgICBrZXJuZWwgdXRmOF9tYnN0b3djcygpIGFuZCB1dGZfd2NzdG9tYnMoKSBkbyBOT1QgY29weSB0aGUKKwkgKiAgICAgICB0cmFpbGVkIE5VTCBieXRlISEgICBSRUFMTFkhISEhISAgICBBcnJycmdnZ2doaGhoaAorCSAqLworCisJTE9HSU5GKCJzaXplb2Yod2NoYXJfdCkgPSAlZCIsIHNpemVvZih3Y2hhcl90KSk7CisJTE9HSU5GKCJ1dGY4X3djc3RvbWJzPSVkIiwKKwkgICAgICAgY2hycyA9IHV0Zjhfd2NzdG9tYnMocywgdW5pY29kZVN0cmluZywgc2l6ZW9mKHMpKSk7CisJaWYgKGNocnMgPj0gMCkKKwkJc1tjaHJzXSA9ICdcMCc7CS8qIEdSUlJSUlJSUiAqLworCUxPR0lORigicz0nJXMnIiwgcyk7CisJTE9HSU5GKCJ1dGY4X21ic3Rvd2NzPSVkIiwgY2hycyA9IHV0ZjhfbWJzdG93Y3ModW5pY29kZTIsIHMsIDEwMCkpOworCWlmIChjaHJzID49IDApCisJCXVuaWNvZGUyW2NocnNdID0gMDsJLyogR1JSUlJSUlJSICovCisJaWYgKG1lbWNtcCh1bmljb2RlU3RyaW5nLCB1bmljb2RlMiwgc2l6ZW9mKHVuaWNvZGVTdHJpbmcpKSA9PSAwKQorCQlMT0dJTkYoInN0cmluZ3MgbWF0Y2guLi4gZ29vZCIpOworCWVsc2UKKwkJTE9HSU5GKCJzdHJpbmdzIGRpZCBub3QgbWF0Y2ghISIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitidXNJbmZvX2NsZWFyKHZvaWQgKnYpCit7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwID0gKFZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqKSAodik7CisKKwlpZiAocC0+cHJvY09iamVjdCkgeworCQl2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QocC0+cHJvY09iamVjdCk7CisJCXAtPnByb2NPYmplY3QgPSBOVUxMOworCX0KKwlrZnJlZShwLT5uYW1lKTsKKwlwLT5uYW1lID0gTlVMTDsKKworCWtmcmVlKHAtPmRlc2NyaXB0aW9uKTsKKwlwLT5kZXNjcmlwdGlvbiA9IE5VTEw7CisKKwlwLT5zdGF0ZS5jcmVhdGVkID0gMDsKKwltZW1zZXQocCwgMCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9CVVNfSU5GTykpOworfQorCitzdGF0aWMgdm9pZAorZGV2SW5mb19jbGVhcih2b2lkICp2KQoreworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcCA9IChWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKikgKHYpOworCXAtPnN0YXRlLmNyZWF0ZWQgPSAwOworCW1lbXNldChwLCAwLCBzaXplb2YoVklTT1JDSElQU0VUX0RFVklDRV9JTkZPKSk7Cit9CisKK3N0YXRpYyBVOAorY2hlY2tfY2hpcHNldF9ldmVudHModm9pZCkKK3sKKwlpbnQgaTsKKwlVOCBzZW5kX21zZyA9IDE7CisJLyogQ2hlY2sgZXZlbnRzIHRvIGRldGVybWluZSBpZiByZXNwb25zZSBzaG91bGQgYmUgc2VudCAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hJUFNFVF9FVkVOVFM7IGkrKykKKwkJc2VuZF9tc2cgJj0gY2hpcHNldF9ldmVudHNbaV07CisJcmV0dXJuIHNlbmRfbXNnOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfY2hpcHNldF9ldmVudHModm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBDbGVhciBjaGlwc2V0X2V2ZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hJUFNFVF9FVkVOVFM7IGkrKykKKwkJY2hpcHNldF9ldmVudHNbaV0gPSAwOworfQorCit2b2lkCit2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X3NlcnZlcihWSVNPUkNISVBTRVRfQlVTREVWX05PVElGSUVSUyAqbm90aWZpZXJzLAorCQkJCSAgICBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMgKnJlc3BvbmRlcnMsCisJCQkJICAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqZHJpdmVySW5mbykKK3sKKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTm90aWZpZXJMb2NrKTsKKwlpZiAobm90aWZpZXJzID09IE5VTEwpIHsKKwkJbWVtc2V0KCZCdXNEZXZfU2VydmVyX05vdGlmaWVycywgMCwKKwkJICAgICAgIHNpemVvZihCdXNEZXZfU2VydmVyX05vdGlmaWVycykpOworCQlzZXJ2ZXJyZWdpc3RlcmVkID0gMDsJLyogY2xlYXIgZmxhZyAqLworCX0gZWxzZSB7CisJCUJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzID0gKm5vdGlmaWVyczsKKwkJc2VydmVycmVnaXN0ZXJlZCA9IDE7CS8qIHNldCBmbGFnICovCisJfQorCWlmIChyZXNwb25kZXJzKQorCQkqcmVzcG9uZGVycyA9IEJ1c0Rldl9SZXNwb25kZXJzOworCWlmIChkcml2ZXJJbmZvKQorCQlCdXNEZXZpY2VJbmZvX0luaXQoZHJpdmVySW5mbywgImNoaXBzZXQiLCAidmlzb3JjaGlwc2V0IiwKKwkJCQkgICBWRVJTSU9OLCBOVUxMLCBfX0RBVEVfXywgX19USU1FX18pOworCisJVU5MT0NLU0VNKCZOb3RpZmllckxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9zZXJ2ZXIpOworCit2b2lkCit2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X2NsaWVudChWSVNPUkNISVBTRVRfQlVTREVWX05PVElGSUVSUyAqbm90aWZpZXJzLAorCQkJCSAgICBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMgKnJlc3BvbmRlcnMsCisJCQkJICAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqZHJpdmVySW5mbykKK3sKKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTm90aWZpZXJMb2NrKTsKKwlpZiAobm90aWZpZXJzID09IE5VTEwpIHsKKwkJbWVtc2V0KCZCdXNEZXZfQ2xpZW50X05vdGlmaWVycywgMCwKKwkJICAgICAgIHNpemVvZihCdXNEZXZfQ2xpZW50X05vdGlmaWVycykpOworCQljbGllbnRyZWdpc3RlcmVkID0gMDsJLyogY2xlYXIgZmxhZyAqLworCX0gZWxzZSB7CisJCUJ1c0Rldl9DbGllbnRfTm90aWZpZXJzID0gKm5vdGlmaWVyczsKKwkJY2xpZW50cmVnaXN0ZXJlZCA9IDE7CS8qIHNldCBmbGFnICovCisJfQorCWlmIChyZXNwb25kZXJzKQorCQkqcmVzcG9uZGVycyA9IEJ1c0Rldl9SZXNwb25kZXJzOworCWlmIChkcml2ZXJJbmZvKQorCQlCdXNEZXZpY2VJbmZvX0luaXQoZHJpdmVySW5mbywgImNoaXBzZXQoYm9sdHMpIiwgInZpc29yY2hpcHNldCIsCisJCQkJICAgVkVSU0lPTiwgTlVMTCwgX19EQVRFX18sIF9fVElNRV9fKTsKKwlVTkxPQ0tTRU0oJk5vdGlmaWVyTG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X2NsaWVudCk7CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2NvbnRyb2x2bV9zdHJ1Y3R1cmVzKHZvaWQpCit7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpiaTsKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKmRpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiaSwgJkJ1c0luZm9MaXN0LCBlbnRyeSkgeworCQlidXNJbmZvX2NsZWFyKGJpKTsKKwkJbGlzdF9kZWwoJmJpLT5lbnRyeSk7CisJCWtmcmVlKGJpKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRpLCAmRGV2SW5mb0xpc3QsIGVudHJ5KSB7CisJCWRldkluZm9fY2xlYXIoZGkpOworCQlsaXN0X2RlbCgmZGktPmVudHJ5KTsKKwkJa2ZyZWUoZGkpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NoaXBzZXRfaW5pdChDT05UUk9MVk1fTUVTU0FHRSAqaW5tc2cpCit7CisJc3RhdGljIGludCBjaGlwc2V0X2luaXRlZDsKKwlVTFRSQV9DSElQU0VUX0ZFQVRVUkUgZmVhdHVyZXMgPSAwOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKGNoaXBzZXRfaW5pdGVkKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0NISVBTRVRfSU5JVCBGYWlsZWQ6IEFscmVhZHkgRG9uZS4iKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQlnb3RvIEF3YXk7CisJfQorCWNoaXBzZXRfaW5pdGVkID0gMTsKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCS8qIFNldCBmZWF0dXJlcyB0byBpbmRpY2F0ZSB3ZSBzdXBwb3J0IHBhcmFob3RwbHVnIChpZiBDb21tYW5kCisJICogYWxzbyBzdXBwb3J0cyBpdCkuICovCisJZmVhdHVyZXMgPQorCSAgICBpbm1zZy0+Y21kLmluaXRDaGlwc2V0LgorCSAgICBmZWF0dXJlcyAmIFVMVFJBX0NISVBTRVRfRkVBVFVSRV9QQVJBX0hPVFBMVUc7CisKKwkvKiBTZXQgdGhlICJyZXBseSIgYml0IHNvIENvbW1hbmQga25vd3MgdGhpcyBpcyBhCisJICogZmVhdHVyZXMtYXdhcmUgZHJpdmVyLiAqLworCWZlYXR1cmVzIHw9IFVMVFJBX0NISVBTRVRfRkVBVFVSRV9SRVBMWTsKKworQXdheToKKwlpZiAocmMgPCAwKQorCQljbGVhbnVwX2NvbnRyb2x2bV9zdHJ1Y3R1cmVzKCk7CisJaWYgKGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KCZpbm1zZy0+aGRyLCByYywgZmVhdHVyZXMpOworfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX2luaXRfcmVzcG9uc2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywKKwkJCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCit7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSk7CisJbWVtY3B5KCZtc2ctPmhkciwgbXNnSGRyLCBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSKSk7CisJbXNnLT5oZHIuUGF5bG9hZEJ5dGVzID0gMDsKKwltc2ctPmhkci5QYXlsb2FkVm1PZmZzZXQgPSAwOworCW1zZy0+aGRyLlBheWxvYWRNYXhCeXRlcyA9IDA7CisJaWYgKHJlc3BvbnNlIDwgMCkgeworCQltc2ctPmhkci5GbGFncy5mYWlsZWQgPSAxOworCQltc2ctPmhkci5Db21wbGV0aW9uU3RhdHVzID0gKFUzMikgKC1yZXNwb25zZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3Jlc3BvbmQoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsIGludCByZXNwb25zZSkKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBvdXRtc2c7CisJaWYgKCFDb250cm9sVm1fY2hhbm5lbCkKKwkJcmV0dXJuOworCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ0hkciwgcmVzcG9uc2UpOworCS8qIEZvciBEaWFnUG9vbCBjaGFubmVsIERFVklDRV9DSEFOR0VTVEFURSwgd2UgbmVlZCB0byBzZW5kCisJKiBiYWNrIHRoZSBkZXZpY2VDaGFuZ2VTdGF0ZSBzdHJ1Y3R1cmUgaW4gdGhlIHBhY2tldC4gKi8KKwlpZiAobXNnSGRyLT5JZCA9PSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFCisJICAgICYmIGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8gPT0KKwkgICAgZ19kaWFncG9vbEJ1c05vCisJICAgICYmIGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPT0KKwkgICAgZ19kaWFncG9vbERldk5vKQorCQlvdXRtc2cuY21kID0gZ19EZXZpY2VDaGFuZ2VTdGF0ZVBhY2tldDsKKwlpZiAob3V0bXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9PSAxKSB7CisJCUxPR0lORigiJXMgY29udHJvbHZtX21zZz0weCV4IHJlc3BvbnNlPSVkIGZvciB0ZXN0IG1lc3NhZ2UiLAorCQkgICAgICAgX19mdW5jX18sIG91dG1zZy5oZHIuSWQsIHJlc3BvbnNlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgeworCQlMT0dFUlIoInNpZ25hbGluc2VydCBmYWlsZWQhIik7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjb250cm9sdm1fcmVzcG9uZF9jaGlwc2V0X2luaXQoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsIGludCByZXNwb25zZSwKKwkJCSAgICAgICBVTFRSQV9DSElQU0VUX0ZFQVRVUkUgZmVhdHVyZXMpCit7CisJQ09OVFJPTFZNX01FU1NBR0Ugb3V0bXNnOworCWlmICghQ29udHJvbFZtX2NoYW5uZWwpCisJCXJldHVybjsKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dIZHIsIHJlc3BvbnNlKTsKKwlvdXRtc2cuY21kLmluaXRDaGlwc2V0LmZlYXR1cmVzID0gZmVhdHVyZXM7CisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKKwkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJCQkgICAgICBpbnQgcmVzcG9uc2UsIFVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGUpCit7CisJQ09OVFJPTFZNX01FU1NBR0Ugb3V0bXNnOworCWlmICghQ29udHJvbFZtX2NoYW5uZWwpCisJCXJldHVybjsKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dIZHIsIHJlc3BvbnNlKTsKKwlvdXRtc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlID0gc3RhdGU7CisJb3V0bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5mbGFncy5waHlzaWNhbERldmljZSA9IDE7CisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKKwkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOworCQlyZXR1cm47CisJfQorfQorCit2b2lkCit2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKENPTlRST0xWTV9NRVNTQUdFICptc2csIENSQVNIX09CSl9UWVBFIHR5cGUpCit7CisJVTMyIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldDsKKwlVMTYgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQ7CisKKwkvKiBnZXQgc2F2ZWQgbWVzc2FnZSBjb3VudCAqLworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgICAgICBTYXZlZENyYXNoTXNnQ291bnQpLAorCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50LCBzaXplb2YoVTE2KSkgPCAwKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGdldCBTYXZlZCBNZXNzYWdlIENvdW50Iik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCAhPSBDT05UUk9MVk1fQ1JBU0hNU0dfTUFYKSB7CisJCUxPR0VSUigiU2F2ZWQgTWVzc2FnZSBDb3VudCBpbmNvcnJlY3QgJWQiLAorCQkgICAgICAgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQpOworCQlQT1NUQ09ERV9MSU5VWF8zKENSQVNIX0RFVl9DT1VOVF9GQUlMVVJFX1BDLAorCQkJCSBsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCBzYXZlZCBjcmFzaCBtZXNzYWdlIG9mZnNldCAqLworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgICAgICBTYXZlZENyYXNoTXNnT2Zmc2V0KSwKKwkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQsIHNpemVvZihVMzIpKSA8IDApIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gZ2V0IFNhdmVkIE1lc3NhZ2UgT2Zmc2V0Iik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0eXBlID09IENSQVNIX2J1cykgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQsCisJCQkJICAgICAgIG1zZywgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSkgPCAwKSB7CisJCQlMT0dFUlIoIlNBVkVfTVNHX0JVU19GQUlMVVJFOiBGYWlsZWQgdG8gd3JpdGUgQ3Jhc2hDcmVhdGVCdXNNc2chIik7CisJCQlQT1NUQ09ERV9MSU5VWF8yKFNBVkVfTVNHX0JVU19GQUlMVVJFX1BDLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCArCisJCQkJICAgICAgIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSksIG1zZywKKwkJCQkgICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSkgPCAwKSB7CisJCQlMT0dFUlIoIlNBVkVfTVNHX0RFVl9GQUlMVVJFOiBGYWlsZWQgdG8gd3JpdGUgQ3Jhc2hDcmVhdGVEZXZNc2chIik7CisJCQlQT1NUQ09ERV9MSU5VWF8yKFNBVkVfTVNHX0RFVl9GQUlMVVJFX1BDLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9zYXZlX21lc3NhZ2UpOworCitzdGF0aWMgdm9pZAorYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fSUQgY21kSWQsIHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCit7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwID0gTlVMTDsKKwlCT09MIG5lZWRfY2xlYXIgPSBGQUxTRTsKKworCXAgPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcCkgeworCQlMT0dFUlIoImludGVybmFsIGVycm9yIGJ1c05vPSVsdSIsIGJ1c05vKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocmVzcG9uc2UgPCAwKSB7CisJCWlmICgoY21kSWQgPT0gQ09OVFJPTFZNX0JVU19DUkVBVEUpICYmCisJCSAgICAocmVzcG9uc2UgIT0gKC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkUpKSkKKwkJCS8qIHVuZG8gdGhlIHJvdyB3ZSBqdXN0IGNyZWF0ZWQuLi4gKi8KKwkJCWRlbGJ1c2RldmljZXMoJkRldkluZm9MaXN0LCBidXNObyk7CisJfSBlbHNlIHsKKwkJaWYgKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKQorCQkJcC0+c3RhdGUuY3JlYXRlZCA9IDE7CisJCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fQlVTX0RFU1RST1kpCisJCQluZWVkX2NsZWFyID0gVFJVRTsKKwl9CisKKwlpZiAocC0+cGVuZGluZ01zZ0hkci5JZCA9PSBDT05UUk9MVk1fSU5WQUxJRCkgeworCQlMT0dFUlIoImJ1c19yZXNwb25kZXIgbm8gcGVuZGluZyBtc2ciKTsKKwkJcmV0dXJuOwkJLyogbm8gY29udHJvbHZtIHJlc3BvbnNlIG5lZWRlZCAqLworCX0KKwlpZiAocC0+cGVuZGluZ01zZ0hkci5JZCAhPSAoVTMyKSBjbWRJZCkgeworCQlMT0dFUlIoImV4cGVjdGVkPSVkLCBmb3VuZD0lZCIsIGNtZElkLCBwLT5wZW5kaW5nTXNnSGRyLklkKTsKKwkJcmV0dXJuOworCX0KKwljb250cm9sdm1fcmVzcG9uZCgmcC0+cGVuZGluZ01zZ0hkciwgcmVzcG9uc2UpOworCXAtPnBlbmRpbmdNc2dIZHIuSWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKKwlpZiAobmVlZF9jbGVhcikgeworCQlidXNJbmZvX2NsZWFyKHApOworCQlkZWxidXNkZXZpY2VzKCZEZXZJbmZvTGlzdCwgYnVzTm8pOworCX0KK30KKworc3RhdGljIHZvaWQKK2RldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0lEIGNtZElkLAorCQkJICAgICB1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSwKKwkJCSAgICAgVUxUUkFfU0VHTUVOVF9TVEFURSByZXNwb25zZVN0YXRlKQoreworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcCA9IE5VTEw7CisJQ09OVFJPTFZNX01FU1NBR0Ugb3V0bXNnOworCisJaWYgKCFDb250cm9sVm1fY2hhbm5lbCkKKwkJcmV0dXJuOworCisJcCA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcCkgeworCQlMT0dFUlIoImludGVybmFsIGVycm9yOyBidXNObz0lbHUsIGRldk5vPSVsdSIsIGJ1c05vLCBkZXZObyk7CisJCXJldHVybjsKKwl9CisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJTE9HRVJSKCJkZXZpY2VfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KKwl9CisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgIT0gY21kSWQpIHsKKwkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ01zZ0hkci5JZCk7CisJCXJldHVybjsKKwl9CisKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCAmcC0+cGVuZGluZ01zZ0hkciwgcmVzcG9uc2UpOworCisJb3V0bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyA9IGJ1c05vOworCW91dG1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPSBkZXZObzsKKwlvdXRtc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlID0gcmVzcG9uc2VTdGF0ZTsKKworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKKwkJcmV0dXJuOworCX0KKworCXAtPnBlbmRpbmdNc2dIZHIuSWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKK30KKworc3RhdGljIHZvaWQKK2RldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0lEIGNtZElkLCB1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSkKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnAgPSBOVUxMOworCUJPT0wgbmVlZF9jbGVhciA9IEZBTFNFOworCisJcCA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcCkgeworCQlMT0dFUlIoImludGVybmFsIGVycm9yOyBidXNObz0lbHUsIGRldk5vPSVsdSIsIGJ1c05vLCBkZXZObyk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3BvbnNlID49IDApIHsKKwkJaWYgKGNtZElkID09IENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFKQorCQkJcC0+c3RhdGUuY3JlYXRlZCA9IDE7CisJCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1kpCisJCQluZWVkX2NsZWFyID0gVFJVRTsKKwl9CisKKwlpZiAocC0+cGVuZGluZ01zZ0hkci5JZCA9PSBDT05UUk9MVk1fSU5WQUxJRCkgeworCQlMT0dFUlIoImRldmljZV9yZXNwb25kZXIgbm8gcGVuZGluZyBtc2ciKTsKKwkJcmV0dXJuOwkJLyogbm8gY29udHJvbHZtIHJlc3BvbnNlIG5lZWRlZCAqLworCX0KKwlpZiAocC0+cGVuZGluZ01zZ0hkci5JZCAhPSAoVTMyKSBjbWRJZCkgeworCQlMT0dFUlIoImV4cGVjdGVkPSVkLCBmb3VuZD0lZCIsIGNtZElkLCBwLT5wZW5kaW5nTXNnSGRyLklkKTsKKwkJcmV0dXJuOworCX0KKwljb250cm9sdm1fcmVzcG9uZCgmcC0+cGVuZGluZ01zZ0hkciwgcmVzcG9uc2UpOworCXAtPnBlbmRpbmdNc2dIZHIuSWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKKwlpZiAobmVlZF9jbGVhcikKKwkJZGV2SW5mb19jbGVhcihwKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19lcGlsb2coVTMyIGJ1c05vLAorCSAgIFUzMiBjbWQsIENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCSAgIGludCByZXNwb25zZSwgQk9PTCBuZWVkUmVzcG9uc2UpCit7CisJQk9PTCBub3RpZmllZCA9IEZBTFNFOworCisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7CisKKwlpZiAoIXBCdXNJbmZvKSB7CisJCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQiLCBidXNObyk7CisJCXJldHVybjsKKwl9CisJaWYgKG5lZWRSZXNwb25zZSkgeworCQltZW1jcHkoJnBCdXNJbmZvLT5wZW5kaW5nTXNnSGRyLCBtc2dIZHIsCisJCSAgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSKSk7CisJfSBlbHNlCisJCXBCdXNJbmZvLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisKKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTm90aWZpZXJMb2NrKTsKKwlpZiAocmVzcG9uc2UgPT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENPTlRST0xWTV9CVVNfQ1JFQVRFOgorCQkJLyogV2UgY2FuJ3QgdGVsbCBmcm9tIHRoZSBidXNfY3JlYXRlCisJCQkqIGluZm9ybWF0aW9uIHdoaWNoIG9mIG91ciAyIGJ1cyBmbGF2b3JzIHRoZQorCQkJKiBkZXZpY2VzIG9uIHRoaXMgYnVzIHdpbGwgdWx0aW1hdGVseSBlbmQgdXAuCisJCQkqIEZPUlRVTkFURUxZLCBpdCB0dXJucyBvdXQgaXQgaXMgaGFybWxlc3MgdG8KKwkJCSogc2VuZCB0aGUgYnVzX2NyZWF0ZSB0byBib3RoIG9mIHRoZW0uICBXZSBjYW4KKwkJCSogbmFycm93IHRoaW5ncyBkb3duIGEgbGl0dGxlIGJpdCwgdGhvdWdoLAorCQkJKiBiZWNhdXNlIHdlIGtub3c6IC0gQnVzRGV2X1NlcnZlciBjYW4gaGFuZGxlCisJCQkqIGVpdGhlciBzZXJ2ZXIgb3IgY2xpZW50IGRldmljZXMKKwkJCSogLSBCdXNEZXZfQ2xpZW50IGNhbiBoYW5kbGUgT05MWSBjbGllbnQKKwkJCSogZGV2aWNlcyAqLworCQkJaWYgKEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzLmJ1c19jcmVhdGUpIHsKKwkJCQkoKkJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNObyk7CisJCQkJbm90aWZpZWQgPSBUUlVFOworCQkJfQorCQkJaWYgKCghcEJ1c0luZm8tPmZsYWdzLnNlcnZlcikgLypjbGllbnQgKi8gJiYKKwkJCSAgICBCdXNEZXZfQ2xpZW50X05vdGlmaWVycy5idXNfY3JlYXRlKSB7CisJCQkJKCpCdXNEZXZfQ2xpZW50X05vdGlmaWVycy5idXNfY3JlYXRlKSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKKwkJCWlmIChCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfZGVzdHJveSkgeworCQkJCSgqQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIChidXNObyk7CisJCQkJbm90aWZpZWQgPSBUUlVFOworCQkJfQorCQkJaWYgKCghcEJ1c0luZm8tPmZsYWdzLnNlcnZlcikgLypjbGllbnQgKi8gJiYKKwkJCSAgICBCdXNEZXZfQ2xpZW50X05vdGlmaWVycy5idXNfZGVzdHJveSkgeworCQkJCSgqQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIChidXNObyk7CisJCQkJbm90aWZpZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG5vdGlmaWVkKQorCQkvKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24ganVzdCBjYWxsZWQgYWJvdmUgaXMgcmVzcG9uc2libGUKKwkJICogZm9yIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIFZJU09SQ0hJUFNFVF9CVVNERVZfUkVTUE9OREVSUworCQkgKiBmdW5jdGlvbiwgd2hpY2ggd2lsbCBjYWxsIGJ1c19yZXNwb25kZXIoKQorCQkgKi8KKwkJOworCWVsc2UKKwkJYnVzX3Jlc3BvbmRlcihjbWQsIGJ1c05vLCByZXNwb25zZSk7CisJVU5MT0NLU0VNKCZOb3RpZmllckxvY2spOworfQorCitzdGF0aWMgdm9pZAorZGV2aWNlX2VwaWxvZyhVMzIgYnVzTm8sIFUzMiBkZXZObywgVUxUUkFfU0VHTUVOVF9TVEFURSBzdGF0ZSwgVTMyIGNtZCwKKwkgICAgICBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwgaW50IHJlc3BvbnNlLAorCSAgICAgIEJPT0wgbmVlZFJlc3BvbnNlLCBCT09MIGZvcl92aXNvcmJ1cykKK3sKKwlWSVNPUkNISVBTRVRfQlVTREVWX05PVElGSUVSUyAqbm90aWZpZXJzID0gTlVMTDsKKwlCT09MIG5vdGlmaWVkID0gRkFMU0U7CisKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnBEZXZJbmZvID0KKwkJZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c05vLCBkZXZObyk7CisJY2hhciAqZW52cFtdID0geworCQkiU1BBUlNQX0RJQUdQT09MX1BBVVNFRF9TVEFURSA9IDEiLAorCQlOVUxMCisJfTsKKworCWlmICghcERldkluZm8pIHsKKwkJTE9HRVJSKCJIVUg/IGJhZCBidXNObz0lZCwgZGV2Tm89JWQiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm47CisJfQorCWlmIChmb3Jfdmlzb3JidXMpCisJCW5vdGlmaWVycyA9ICZCdXNEZXZfU2VydmVyX05vdGlmaWVyczsKKwllbHNlCisJCW5vdGlmaWVycyA9ICZCdXNEZXZfQ2xpZW50X05vdGlmaWVyczsKKwlpZiAobmVlZFJlc3BvbnNlKSB7CisJCW1lbWNweSgmcERldkluZm8tPnBlbmRpbmdNc2dIZHIsIG1zZ0hkciwKKwkJICAgICAgIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKwl9IGVsc2UKKwkJcERldkluZm8tPnBlbmRpbmdNc2dIZHIuSWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKKworCUxPQ0tTRU1fVU5JTlRFUlJVUFRJQkxFKCZOb3RpZmllckxvY2spOworCWlmIChyZXNwb25zZSA+PSAwKSB7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEU6CisJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfY3JlYXRlKSB7CisJCQkJKCpub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIChidXNObywgZGV2Tm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6CisJCQkvKiBTZXJ2ZXJSZWFkeSAvIFNlcnZlclJ1bm5pbmcgLyBTZWdtZW50U3RhdGVSdW5uaW5nICovCisJCQlpZiAoc3RhdGUuQWxpdmUgPT0gU2VnbWVudFN0YXRlUnVubmluZy5BbGl2ZSAmJgorCQkJICAgIHN0YXRlLk9wZXJhdGluZyA9PSBTZWdtZW50U3RhdGVSdW5uaW5nLk9wZXJhdGluZykgeworCQkJCWlmIChub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIHsKKwkJCQkJKCpub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIChidXNObywKKwkJCQkJCQkJICAgICBkZXZObyk7CisJCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCQkvKiBTZXJ2ZXJOb3RSZWFkeSAvIFNlcnZlckxvc3QgLyBTZWdtZW50U3RhdGVTdGFuZGJ5ICovCisJCQllbHNlIGlmIChzdGF0ZS5BbGl2ZSA9PSBTZWdtZW50U3RhdGVTdGFuZGJ5LkFsaXZlICYmCisJCQkJIHN0YXRlLk9wZXJhdGluZyA9PQorCQkJCSBTZWdtZW50U3RhdGVTdGFuZGJ5Lk9wZXJhdGluZykgeworCQkJCS8qIHRlY2huaWNhbGx5IHRoaXMgaXMgc3RhbmRieSBjYXNlCisJCQkJICogd2hlcmUgc2VydmVyIGlzIGxvc3QKKwkJCQkgKi8KKwkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIHsKKwkJCQkJKCpub3RpZmllcnMtPmRldmljZV9wYXVzZSkgKGJ1c05vLAorCQkJCQkJCQkgICAgZGV2Tm8pOworCQkJCQlub3RpZmllZCA9IFRSVUU7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGF0ZS5BbGl2ZSA9PSBTZWdtZW50U3RhdGVQYXVzZWQuQWxpdmUgJiYKKwkJCQkgICBzdGF0ZS5PcGVyYXRpbmcgPT0KKwkJCQkgICBTZWdtZW50U3RhdGVQYXVzZWQuT3BlcmF0aW5nKSB7CisJCQkJLyogdGhpcyBpcyBsaXRlIHBhdXNlIHdoZXJlIGNoYW5uZWwgaXMKKwkJCQkgKiBzdGlsbCB2YWxpZCBqdXN0ICdwYXVzZScgb2YgaXQKKwkJCQkgKi8KKwkJCQlpZiAoYnVzTm8gPT0gZ19kaWFncG9vbEJ1c05vCisJCQkJICAgICYmIGRldk5vID09IGdfZGlhZ3Bvb2xEZXZObykgeworCQkJCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURShEaWFncG9vbENoYW5uZWwgYnVzTm89JWQgZGV2Tm89JWQgaXMgcGF1c2luZy4uLikiLAorCQkJCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCQkJCS8qIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZQorCQkJCQkgKiBkaWFnX3NodXRkb3duLnNoIHNjcmlwdCBpbgorCQkJCQkgKiB0aGUgdmlzb3JjaGlwc2V0IGhvdHBsdWcgKi8KKwkJCQkJa29iamVjdF91ZXZlbnRfZW52CisJCQkJCSAgICAoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LgorCQkJCQkgICAgIGtvYmosIEtPQkpfT05MSU5FLCBlbnZwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6CisJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfZGVzdHJveSkgeworCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfZGVzdHJveSkgKGJ1c05vLCBkZXZObyk7CisJCQkJbm90aWZpZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG5vdGlmaWVkKQorCQkvKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24ganVzdCBjYWxsZWQgYWJvdmUgaXMgcmVzcG9uc2libGUKKwkJICogZm9yIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIFZJU09SQ0hJUFNFVF9CVVNERVZfUkVTUE9OREVSUworCQkgKiBmdW5jdGlvbiwgd2hpY2ggd2lsbCBjYWxsIGRldmljZV9yZXNwb25kZXIoKQorCQkgKi8KKwkJOworCWVsc2UKKwkJZGV2aWNlX3Jlc3BvbmRlcihjbWQsIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworCVVOTE9DS1NFTSgmTm90aWZpZXJMb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jcmVhdGUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmNyZWF0ZUJ1cy5idXNObzsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcEJ1c0luZm8gPSBOVUxMOworCisKKwlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7CisJaWYgKHBCdXNJbmZvICYmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAxKSkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIEZhaWxlZDogYnVzICVsdSBhbHJlYWR5IGV4aXN0cyIsCisJCSAgICAgICBidXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQlnb3RvIEF3YXk7CisJfQorCXBCdXNJbmZvID0ga3phbGxvYyhzaXplb2YoVklTT1JDSElQU0VUX0JVU19JTkZPKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBCdXNJbmZvID09IE5VTEwpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGJ1cyAlbHUga3phbGxvYyBmYWlsZWQiLAorCQkgICAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnBCdXNJbmZvLT5lbnRyeSk7CisJcEJ1c0luZm8tPmJ1c05vID0gYnVzTm87CisJcEJ1c0luZm8tPmRldk5vID0gY21kLT5jcmVhdGVCdXMuZGV2aWNlQ291bnQ7CisKKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWlmIChpbm1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlID09IDEpCisJCXBCdXNJbmZvLT5jaGFuSW5mby5hZGRyVHlwZSA9IEFERFJUWVBFX2xvY2FsVGVzdDsKKwllbHNlCisJCXBCdXNJbmZvLT5jaGFuSW5mby5hZGRyVHlwZSA9IEFERFJUWVBFX2xvY2FsUGh5c2ljYWw7CisKKwlwQnVzSW5mby0+ZmxhZ3Muc2VydmVyID0gaW5tc2ctPmhkci5GbGFncy5zZXJ2ZXI7CisJcEJ1c0luZm8tPmNoYW5JbmZvLmNoYW5uZWxBZGRyID0gY21kLT5jcmVhdGVCdXMuY2hhbm5lbEFkZHI7CisJcEJ1c0luZm8tPmNoYW5JbmZvLm5DaGFubmVsQnl0ZXMgPSBjbWQtPmNyZWF0ZUJ1cy5jaGFubmVsQnl0ZXM7CisJcEJ1c0luZm8tPmNoYW5JbmZvLmNoYW5uZWxUeXBlR3VpZCA9IGNtZC0+Y3JlYXRlQnVzLmJ1c0RhdGFUeXBlR3VpZDsKKwlwQnVzSW5mby0+Y2hhbkluZm8uY2hhbm5lbEluc3RHdWlkID0gY21kLT5jcmVhdGVCdXMuYnVzSW5zdEd1aWQ7CisKKwlsaXN0X2FkZCgmcEJ1c0luZm8tPmVudHJ5LCAmQnVzSW5mb0xpc3QpOworCisJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VYSVRfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworQXdheToKKwlidXNfZXBpbG9nKGJ1c05vLCBDT05UUk9MVk1fQlVTX0NSRUFURSwgJmlubXNnLT5oZHIsCisJCSAgIHJjLCBpbm1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPT0gMSk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZGVzdHJveShDT05UUk9MVk1fTUVTU0FHRSAqaW5tc2cpCit7CisJQ09OVFJPTFZNX01FU1NBR0VfUEFDS0VUICpjbWQgPSAmaW5tc2ctPmNtZDsKKwl1bG9uZyBidXNObyA9IGNtZC0+ZGVzdHJveUJ1cy5idXNObzsKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnBCdXNJbmZvOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7CisJaWYgKCFwQnVzSW5mbykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IGJ1cyAlbHUgaW52YWxpZCIsIGJ1c05vKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHBCdXNJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBidXMgJWx1IGFscmVhZHkgZGVzdHJveWVkIiwKKwkJICAgICBidXNObyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJZ290byBBd2F5OworCX0KKworQXdheToKKwlidXNfZXBpbG9nKGJ1c05vLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksICZpbm1zZy0+aGRyLAorCQkgICByYywgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2NvbmZpZ3VyZShDT05UUk9MVk1fTUVTU0FHRSAqaW5tc2csIFBBUlNFUl9DT05URVhUICpwYXJzZXJfY3R4KQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmNvbmZpZ3VyZUJ1cy5idXNObzsKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnBCdXNJbmZvID0gTlVMTDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCWNoYXIgc1s5OV07CisKKwlidXNObyA9IGNtZC0+Y29uZmlndXJlQnVzLmJ1c05vOworCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FTlRSWV9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcEJ1c0luZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSBGYWlsZWQ6IGJ1cyAlbHUgaW52YWxpZCIsCisJCSAgICAgICBidXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHBCdXNJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSBGYWlsZWQ6IEludmFsaWQgYnVzICVsdSAtIG5vdCBjcmVhdGVkIHlldCIsCisJCSAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCS8qIFRCRCAtIGFkZCB0aGlzIGNoZWNrIHRvIG90aGVyIGNvbW1hbmRzIGFsc28uLi4gKi8KKwlpZiAocEJ1c0luZm8tPnBlbmRpbmdNc2dIZHIuSWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSBGYWlsZWQ6IGJ1cyAlbHUgTXNnSWQ9JXUgb3V0c3RhbmRpbmciLAorCQkgICAgIGJ1c05vLCAodWludCkgcEJ1c0luZm8tPnBlbmRpbmdNc2dIZHIuSWQpOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfSU5WQUxJRF9GT1JfQ0xJRU5UOworCQlnb3RvIEF3YXk7CisJfQorCisJcEJ1c0luZm8tPnBhcnRpdGlvbkhhbmRsZSA9IGNtZC0+Y29uZmlndXJlQnVzLmd1ZXN0SGFuZGxlOworCXBCdXNJbmZvLT5wYXJ0aXRpb25HdWlkID0gcGFyc2VyX2lkX2dldChwYXJzZXJfY3R4KTsKKwlwYXJzZXJfcGFyYW1fc3RhcnQocGFyc2VyX2N0eCwgUEFSU0VSU1RSSU5HX05BTUUpOworCXBCdXNJbmZvLT5uYW1lID0gcGFyc2VyX3N0cmluZ19nZXQocGFyc2VyX2N0eCk7CisKKwl2aXNvcmNoYW5uZWxfR1VJRF9pZCgmcEJ1c0luZm8tPnBhcnRpdGlvbkd1aWQsIHMpOworCXBCdXNJbmZvLT5wcm9jT2JqZWN0ID0KKwkgICAgdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoUGFydGl0aW9uVHlwZSwgcywgKHZvaWQgKikgKHBCdXNJbmZvKSk7CisJaWYgKHBCdXNJbmZvLT5wcm9jT2JqZWN0ID09IE5VTEwpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSBGYWlsZWQ6IGJ1c05vPSVsdSBmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGVudHJ5IiwKKwkJICAgICBidXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7CisJCWdvdG8gQXdheTsKKwl9CisJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0VYSVRfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKK0F3YXk6CisJYnVzX2VwaWxvZyhidXNObywgQ09OVFJPTFZNX0JVU19DT05GSUdVUkUsICZpbm1zZy0+aGRyLAorCQkgICByYywgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEpOworfQorCitzdGF0aWMgdm9pZAorbXlfZGV2aWNlX2NyZWF0ZShDT05UUk9MVk1fTUVTU0FHRSAqaW5tc2cpCit7CisJQ09OVFJPTFZNX01FU1NBR0VfUEFDS0VUICpjbWQgPSAmaW5tc2ctPmNtZDsKKwl1bG9uZyBidXNObyA9IGNtZC0+Y3JlYXRlRGV2aWNlLmJ1c05vOworCXVsb25nIGRldk5vID0gY21kLT5jcmVhdGVEZXZpY2UuZGV2Tm87CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwRGV2SW5mbyA9IE5VTEw7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwQnVzSW5mbyA9IE5VTEw7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKworCXBEZXZJbmZvID0gZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c05vLCBkZXZObyk7CisJaWYgKHBEZXZJbmZvICYmIChwRGV2SW5mby0+c3RhdGUuY3JlYXRlZCA9PSAxKSkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgYWxyZWFkeSBleGlzdHMiLAorCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJZ290byBBd2F5OworCX0KKwlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7CisJaWYgKCFwQnVzSW5mbykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogSW52YWxpZCBidXMgJWx1IC0gb3V0IG9mIHJhbmdlIiwKKwkJICAgICBidXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAorCQkgICAgIGJ1c05vKTsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7CisJCWdvdG8gQXdheTsKKwl9CisJcERldkluZm8gPSBremFsbG9jKHNpemVvZihWSVNPUkNISVBTRVRfREVWSUNFX0lORk8pLCBHRlBfS0VSTkVMKTsKKwlpZiAocERldkluZm8gPT0gTlVMTCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUga21hbG9jIGZhaWxlZCIsCisJCSAgICAgYnVzTm8sIGRldk5vKTsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7CisJCWdvdG8gQXdheTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcERldkluZm8tPmVudHJ5KTsKKwlwRGV2SW5mby0+YnVzTm8gPSBidXNObzsKKwlwRGV2SW5mby0+ZGV2Tm8gPSBkZXZObzsKKwlwRGV2SW5mby0+ZGV2SW5zdEd1aWQgPSBjbWQtPmNyZWF0ZURldmljZS5kZXZJbnN0R3VpZDsKKwlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWlmIChpbm1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlID09IDEpCisJCXBEZXZJbmZvLT5jaGFuSW5mby5hZGRyVHlwZSA9IEFERFJUWVBFX2xvY2FsVGVzdDsKKwllbHNlCisJCXBEZXZJbmZvLT5jaGFuSW5mby5hZGRyVHlwZSA9IEFERFJUWVBFX2xvY2FsUGh5c2ljYWw7CisJcERldkluZm8tPmNoYW5JbmZvLmNoYW5uZWxBZGRyID0gY21kLT5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHI7CisJcERldkluZm8tPmNoYW5JbmZvLm5DaGFubmVsQnl0ZXMgPSBjbWQtPmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXM7CisJcERldkluZm8tPmNoYW5JbmZvLmNoYW5uZWxUeXBlR3VpZCA9IGNtZC0+Y3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZDsKKwlwRGV2SW5mby0+Y2hhbkluZm8uaW50ciA9IGNtZC0+Y3JlYXRlRGV2aWNlLmludHI7CisJbGlzdF9hZGQoJnBEZXZJbmZvLT5lbnRyeSwgJkRldkluZm9MaXN0KTsKKwlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRVhJVF9QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworQXdheToKKwkvKiBnZXQgdGhlIGJ1cyBhbmQgZGV2Tm8gZm9yIERpYWdQb29sIGNoYW5uZWwgKi8KKwlpZiAoaXNfZGlhZ3Bvb2xfY2hhbm5lbChwRGV2SW5mby0+Y2hhbkluZm8uY2hhbm5lbFR5cGVHdWlkKSkgeworCQlnX2RpYWdwb29sQnVzTm8gPSBidXNObzsKKwkJZ19kaWFncG9vbERldk5vID0gZGV2Tm87CisJCUxPR0lORigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgZm9yIERpYWdQb29sIGNoYW5uZWw6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IiwKKwkJICAgICBnX2RpYWdwb29sQnVzTm8sIGdfZGlhZ3Bvb2xEZXZObyk7CisJfQorCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBTZWdtZW50U3RhdGVSdW5uaW5nLAorCQkgICAgICBDT05UUk9MVk1fREVWSUNFX0NSRUFURSwgJmlubXNnLT5oZHIsIHJjLAorCQkgICAgICBpbm1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPT0gMSwKKwkJICAgICAgRk9SX1ZJU09SQlVTKHBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQpKTsKK30KKworc3RhdGljIHZvaWQKK215X2RldmljZV9jaGFuZ2VzdGF0ZShDT05UUk9MVk1fTUVTU0FHRSAqaW5tc2cpCit7CisJQ09OVFJPTFZNX01FU1NBR0VfUEFDS0VUICpjbWQgPSAmaW5tc2ctPmNtZDsKKwl1bG9uZyBidXNObyA9IGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm87CisJdWxvbmcgZGV2Tm8gPSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vOworCVVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGUgPSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLnN0YXRlOworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcERldkluZm8gPSBOVUxMOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcERldkluZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgaW52YWxpZCAoZG9lc24ndCBleGlzdCkiLAorCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NIQU5HRVNUQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQ7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHBEZXZJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgaW52YWxpZCAobm90IGNyZWF0ZWQpIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCX0KK0F3YXk6CisJaWYgKChyYyA+PSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSAmJiBwRGV2SW5mbykKKwkJZGV2aWNlX2VwaWxvZyhidXNObywgZGV2Tm8sIHN0YXRlLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLAorCQkJICAgICAgJmlubXNnLT5oZHIsIHJjLAorCQkJICAgICAgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEsCisJCQkgICAgICBGT1JfVklTT1JCVVMocERldkluZm8tPmNoYW5JbmZvLmNoYW5uZWxUeXBlR3VpZCkpOworfQorCitzdGF0aWMgdm9pZAorbXlfZGV2aWNlX2Rlc3Ryb3koQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmRlc3Ryb3lEZXZpY2UuYnVzTm87CisJdWxvbmcgZGV2Tm8gPSBjbWQtPmRlc3Ryb3lEZXZpY2UuZGV2Tm87CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwRGV2SW5mbyA9IE5VTEw7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKworCXBEZXZJbmZvID0gZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c05vLCBkZXZObyk7CisJaWYgKCFwRGV2SW5mbykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQiLAorCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwRGV2SW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgYWxyZWFkeSBkZXN0cm95ZWQiLAorCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwl9CisKK0F3YXk6CisJaWYgKChyYyA+PSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSAmJiBwRGV2SW5mbykKKwkJZGV2aWNlX2VwaWxvZyhidXNObywgZGV2Tm8sIFNlZ21lbnRTdGF0ZVJ1bm5pbmcsCisJCQkgICAgICBDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksICZpbm1zZy0+aGRyLCByYywKKwkJCSAgICAgIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxLAorCQkJICAgICAgRk9SX1ZJU09SQlVTKHBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQpKTsKK30KKworLyogV2hlbiBwcm92aWRlZCB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sdm0gY2hhbm5lbAorICogKHBoeXNfYWRkciksIHRoZSBvZmZzZXQgdG8gdGhlIHBheWxvYWQgYXJlYSB3ZSBuZWVkIHRvIG1hbmFnZQorICogKG9mZnNldCksIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIHBheWxvYWQgYXJlYSAoYnl0ZXMpLCBmaWxscyBpbiB0aGUKKyAqIENPTlRST0xWTV9QQVlMT0FEX0lORk8gc3RydWN0LiAgUmV0dXJucyBUUlVFIGZvciBzdWNjZXNzIG9yIEZBTFNFCisgKiBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAoraW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKEhPU1RBRERSRVNTIHBoeXNfYWRkciwgVTY0IG9mZnNldCwgVTMyIGJ5dGVzLAorCQkJCSAgQ09OVFJPTFZNX1BBWUxPQURfSU5GTyAqaW5mbykKK3sKKwlVOCBfX2lvbWVtICpwYXlsb2FkID0gTlVMTDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlMT0dFUlIoIkhVSCA/IENPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkIDogUHJvZ3JhbW1lciBjaGVjayBhdCAlczolZCIsCisJCSAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoQ09OVFJPTFZNX1BBWUxPQURfSU5GTykpOworCWlmICgob2Zmc2V0ID09IDApIHx8IChieXRlcyA9PSAwKSkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkOiBSZXF1ZXN0UGF5bG9hZE9mZnNldD0lbGx1IFJlcXVlc3RQYXlsb2FkQnl0ZXM9JWxsdSEiLAorCQkgICAgICh1NjQpIG9mZnNldCwgKHU2NCkgYnl0ZXMpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9QQVlMT0FEX0lOVkFMSUQ7CisJCWdvdG8gQXdheTsKKwl9CisJcGF5bG9hZCA9IGlvcmVtYXBfY2FjaGUocGh5c19hZGRyICsgb2Zmc2V0LCBieXRlcyk7CisJaWYgKHBheWxvYWQgPT0gTlVMTCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkOiBpb3JlbWFwX2NhY2hlICVsbHUgZm9yICVsbHUgYnl0ZXMgZmFpbGVkIiwKKwkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfSU9SRU1BUF9GQUlMRUQ7CisJCWdvdG8gQXdheTsKKwl9CisKKwlpbmZvLT5vZmZzZXQgPSBvZmZzZXQ7CisJaW5mby0+Ynl0ZXMgPSBieXRlczsKKwlpbmZvLT5wdHIgPSBwYXlsb2FkOworCUxPR0lORigib2Zmc2V0PSVsbHUsIGJ5dGVzPSVsdSwgcHRyPSVwIiwKKwkgICAgICAgKHU2NCkgKGluZm8tPm9mZnNldCksICh1bG9uZykgKGluZm8tPmJ5dGVzKSwgaW5mby0+cHRyKTsKKworQXdheToKKwlpZiAocmMgPCAwKSB7CisJCWlmIChwYXlsb2FkICE9IE5VTEwpIHsKKwkJCWlvdW5tYXAocGF5bG9hZCk7CisJCQlwYXlsb2FkID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oQ09OVFJPTFZNX1BBWUxPQURfSU5GTyAqaW5mbykKK3sKKwlpZiAoaW5mby0+cHRyICE9IE5VTEwpIHsKKwkJaW91bm1hcChpbmZvLT5wdHIpOworCQlpbmZvLT5wdHIgPSBOVUxMOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKENPTlRST0xWTV9QQVlMT0FEX0lORk8pKTsKK30KKworc3RhdGljIHZvaWQKK2luaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWQodm9pZCkKK3sKKwlIT1NUQUREUkVTUyBwaHlzX2FkZHIgPSB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKENvbnRyb2xWbV9jaGFubmVsKTsKKwlVNjQgcGF5bG9hZE9mZnNldCA9IDA7CisJVTMyIHBheWxvYWRCeXRlcyA9IDA7CisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFJlcXVlc3RQYXlsb2FkT2Zmc2V0KSwKKwkJCSAgICAgICZwYXlsb2FkT2Zmc2V0LCBzaXplb2YocGF5bG9hZE9mZnNldCkpIDwgMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkIHRvIHJlYWQgY29udHJvbHZtIGNoYW5uZWwhIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgUmVxdWVzdFBheWxvYWRCeXRlcyksCisJCQkgICAgICAmcGF5bG9hZEJ5dGVzLCBzaXplb2YocGF5bG9hZEJ5dGVzKSkgPCAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX1BBWUxPQURfSU5JVCBGYWlsZWQgdG8gcmVhZCBjb250cm9sdm0gY2hhbm5lbCEiKTsKKwkJUE9TVENPREVfTElOVVhfMihDT05UUk9MVk1fSU5JVF9GQUlMVVJFX1BDLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCWluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbyhwaHlzX2FkZHIsCisJCQkJCSAgcGF5bG9hZE9mZnNldCwgcGF5bG9hZEJ5dGVzLAorCQkJCQkgICZDb250cm9sVm1fcGF5bG9hZF9pbmZvKTsKK30KKworLyogIFNlbmQgQUNUSU9OPW9ubGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICogIFJldHVybnMgQ09OVFJPTFZNX1JFU1BfeHh4IGNvZGUuCisgKi8KK2ludAordmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCkKK3sKKwlrb2JqZWN0X3VldmVudCgmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9PTkxJTkUpOworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkpOworCitpbnQKK3Zpc29yY2hpcHNldF9jaGlwc2V0X3NlbGZ0ZXN0KHZvaWQpCit7CisJY2hhciBlbnZfc2VsZnRlc3RbMjBdOworCWNoYXIgKmVudnBbXSA9IHsgZW52X3NlbGZ0ZXN0LCBOVUxMIH07CisJc3ByaW50ZihlbnZfc2VsZnRlc3QsICJTUEFSU1BfU0VMRlRFU1Q9JWQiLCAxKTsKKwlrb2JqZWN0X3VldmVudF9lbnYoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfQ0hBTkdFLAorCQkJICAgZW52cCk7CisJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfY2hpcHNldF9zZWxmdGVzdCk7CisKKy8qICBTZW5kIEFDVElPTj1vZmZsaW5lIGZvciBERVZQQVRIPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aXNvcmNoaXBzZXQuCisgKiAgUmV0dXJucyBDT05UUk9MVk1fUkVTUF94eHggY29kZS4KKyAqLworaW50Cit2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKQoreworCWtvYmplY3RfdWV2ZW50KCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkpOworCitzdGF0aWMgdm9pZAorY2hpcHNldF9yZWFkeShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkcikKK3sKKwlpbnQgcmMgPSB2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSgpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQorCQlyYyA9IC1yYzsKKwlpZiAobXNnSGRyLT5GbGFncy5yZXNwb25zZUV4cGVjdGVkICYmICF2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSkKKwkJY29udHJvbHZtX3Jlc3BvbmQobXNnSGRyLCByYyk7CisJaWYgKG1zZ0hkci0+RmxhZ3MucmVzcG9uc2VFeHBlY3RlZCAmJiB2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSkgeworCQkvKiBTZW5kIENISVBTRVRfUkVBRFkgcmVzcG9uc2Ugd2hlbiBhbGwgbW9kdWxlcyBoYXZlIGJlZW4gbG9hZGVkCisJCSAqIGFuZCBkaXNrcyBtb3VudGVkIGZvciB0aGUgcGFydGl0aW9uCisJCSAqLworCQlnX0NoaXBTZXRNc2dIZHIgPSAqbXNnSGRyOworCQlMT0dJTkYoIkhvbGRpbmcgQ0hJUFNFVF9SRUFEWSByZXNwb25zZSIpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NoaXBzZXRfc2VsZnRlc3QoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIpCit7CisJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfc2VsZnRlc3QoKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJcmMgPSAtcmM7CisJaWYgKG1zZ0hkci0+RmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJY29udHJvbHZtX3Jlc3BvbmQobXNnSGRyLCByYyk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X25vdHJlYWR5KENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyKQoreworCWludCByYyA9IHZpc29yY2hpcHNldF9jaGlwc2V0X25vdHJlYWR5KCk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpCisJCXJjID0gLXJjOworCWlmIChtc2dIZHItPkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQpCisJCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworfQorCisvKiBUaGlzIGlzIHlvdXIgIm9uZS1zdG9wIiBzaG9wIGZvciBncmFiYmluZyB0aGUgbmV4dCBtZXNzYWdlIGZyb20gdGhlCisgKiBDT05UUk9MVk1fUVVFVUVfRVZFTlQgcXVldWUgaW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsLgorICovCitzdGF0aWMgQk9PTAorcmVhZF9jb250cm9sdm1fZXZlbnQoQ09OVFJPTFZNX01FU1NBR0UgKm1zZykKK3sKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfRVZFTlQsIG1zZykpIHsKKwkJLyogZ290IGEgbWVzc2FnZSAqLworCQlpZiAobXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPT0gMSkgeworCQkJTE9HRVJSKCJpZ25vcmluZyBiYWQgQ09OVFJPTFZNX1FVRVVFX0VWRU5UIG1zZyB3aXRoIGNvbnRyb2x2bV9tc2dfaWQ9MHgleCBiZWNhdXNlIEZsYWdzLnRlc3RNZXNzYWdlIGlzIG5vbnNlbnNpY2FsICg9MSkiLCBtc2ctPmhkci5JZCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0gZWxzZQorCQkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFRoZSBnZW5lcmFsIHBhcmFob3RwbHVnIGZsb3cgd29ya3MgYXMgZm9sbG93cy4gIFRoZSB2aXNvcmNoaXBzZXQKKyAqIGRyaXZlciByZWNlaXZlcyBhIERFVklDRV9DSEFOR0VTVEFURSBtZXNzYWdlIGZyb20gQ29tbWFuZAorICogc3BlY2lmeWluZyBhIHBoeXNpY2FsIGRldmljZSB0byBlbmFibGUgb3IgZGlzYWJsZS4gIFRoZSBDT05UUk9MVk0KKyAqIG1lc3NhZ2UgaGFuZGxlciBjYWxscyBwYXJhaG90cGx1Z19wcm9jZXNzX21lc3NhZ2UsIHdoaWNoIHRoZW4gYWRkcworICogdGhlIG1lc3NhZ2UgdG8gYSBnbG9iYWwgbGlzdCBhbmQga2lja3Mgb2ZmIGEgdWRldiBldmVudCB3aGljaAorICogY2F1c2VzIGEgdXNlciBsZXZlbCBzY3JpcHQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWNpZmllZAorICogZGV2aWNlLiAgVGhlIHVkZXYgc2NyaXB0IHRoZW4gd3JpdGVzIHRvCisgKiAvcHJvYy92aXNvcmNoaXBzZXQvcGFyYWhvdHBsdWcsIHdoaWNoIGNhdXNlcyBwYXJhaG90cGx1Z19wcm9jX3dyaXRlCisgKiB0byBnZXQgY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgYXBwcm9wcmlhdGUgQ09OVFJPTFZNIG1lc3NhZ2UgaXMKKyAqIHJldHJpZXZlZCBmcm9tIHRoZSBsaXN0IGFuZCByZXNwb25kZWQgdG8uCisgKi8KKworI2RlZmluZSBQQVJBSE9UUExVR19USU1FT1VUX01TIDIwMDAKKworLyoKKyAqIEdlbmVyYXRlIHVuaXF1ZSBpbnQgdG8gbWF0Y2ggYW4gb3V0c3RhbmRpbmcgQ09OVFJPTFZNIG1lc3NhZ2Ugd2l0aCBhCisgKiB1ZGV2IHNjcmlwdCAvcHJvYyByZXNwb25zZQorICovCitzdGF0aWMgaW50CitwYXJhaG90cGx1Z19uZXh0X2lkKHZvaWQpCit7CisJc3RhdGljIGF0b21pY190IGlkID0gQVRPTUlDX0lOSVQoMCk7CisJcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZpZCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBqaWZmaWVzKSB3aGVuIGEgQ09OVFJPTFZNIG1lc3NhZ2Ugb24gdGhlIGxpc3QKKyAqIHNob3VsZCBleHBpcmUgLS0gUEFSQUhPVFBMVUdfVElNRU9VVF9NUyBpbiB0aGUgZnV0dXJlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitwYXJhaG90cGx1Z19uZXh0X2V4cGlyYXRpb24odm9pZCkKK3sKKwlyZXR1cm4gamlmZmllcyArIFBBUkFIT1RQTFVHX1RJTUVPVVRfTVMgKiBIWiAvIDEwMDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0LCB3aGljaCBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBhCisgKiBDT05UUk9MVk1fTUVTU0FHRSB0aGF0IHdlIGNhbiBzdGljayBvbiBhIGxpc3QKKyAqLworc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKK3BhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKENPTlRST0xWTV9NRVNTQUdFICptc2cpCit7CisJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9CisJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0KSwKKwkJICAgIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKHJlcSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+aWQgPSBwYXJhaG90cGx1Z19uZXh0X2lkKCk7CisJcmVxLT5leHBpcmF0aW9uID0gcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCk7CisJcmVxLT5tc2cgPSAqbXNnOworCisJcmV0dXJuIHJlcTsKK30KKworLyoKKyAqIEZyZWUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEpCit7CisJa2ZyZWUocmVxKTsKK30KKworLyoKKyAqIENhdXNlIHVldmVudCB0byBydW4gdGhlIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGRvIHRoZSBkaXNhYmxlL2VuYWJsZQorICogc3BlY2lmaWVkIGluICh0aGUgQ09OVFJPTFZNIG1lc3NhZ2UgaW4pIHRoZSBzcGVjaWZpZWQKKyAqIHBhcmFob3RwbHVnX3JlcXVlc3QKKyAqLworc3RhdGljIHZvaWQKK3BhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJnJlcS0+bXNnLmNtZDsKKwljaGFyIGVudl9jbWRbNDBdLCBlbnZfaWRbNDBdLCBlbnZfc3RhdGVbNDBdLCBlbnZfYnVzWzQwXSwgZW52X2Rldls0MF0sCisJICAgIGVudl9mdW5jWzQwXTsKKwljaGFyICplbnZwW10gPSB7CisJCWVudl9jbWQsIGVudl9pZCwgZW52X3N0YXRlLCBlbnZfYnVzLCBlbnZfZGV2LCBlbnZfZnVuYywgTlVMTAorCX07CisKKwlzcHJpbnRmKGVudl9jbWQsICJTUEFSX1BBUkFIT1RQTFVHPTEiKTsKKwlzcHJpbnRmKGVudl9pZCwgIlNQQVJfUEFSQUhPVFBMVUdfSUQ9JWQiLCByZXEtPmlkKTsKKwlzcHJpbnRmKGVudl9zdGF0ZSwgIlNQQVJfUEFSQUhPVFBMVUdfU1RBVEU9JWQiLAorCQljbWQtPmRldmljZUNoYW5nZVN0YXRlLnN0YXRlLkFjdGl2ZSk7CisJc3ByaW50ZihlbnZfYnVzLCAiU1BBUl9QQVJBSE9UUExVR19CVVM9JWQiLAorCQljbWQtPmRldmljZUNoYW5nZVN0YXRlLmJ1c05vKTsKKwlzcHJpbnRmKGVudl9kZXYsICJTUEFSX1BBUkFIT1RQTFVHX0RFVklDRT0lZCIsCisJCWNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPj4gMyk7CisJc3ByaW50ZihlbnZfZnVuYywgIlNQQVJfUEFSQUhPVFBMVUdfRlVOQ1RJT049JWQiLAorCQljbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vICYgMHg3KTsKKworCUxPR0lORigicGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmOiBzdGF0ZT0lZCwgYmRmPSVkLyVkLyVkLCBpZD0ldVxuIiwKKwkgICAgICAgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZS5BY3RpdmUsCisJICAgICAgIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8sIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPj4gMywKKwkgICAgICAgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyAmIDcsIHJlcS0+aWQpOworCisJa29iamVjdF91ZXZlbnRfZW52KCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX0NIQU5HRSwKKwkJCSAgIGVudnApOworfQorCisvKgorICogUmVtb3ZlIGFueSByZXF1ZXN0IGZyb20gdGhlIGxpc3QgdGhhdCdzIGJlZW4gb24gdGhlcmUgdG9vIGxvbmcgYW5kCisgKiByZXNwb25kIHdpdGggYW4gZXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3Qodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IE5VTEw7CisKKwlzcGluX2xvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgeworCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KKwkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlcS0+ZXhwaXJhdGlvbikpIHsKKwkJCWxpc3RfZGVsKHBvcyk7CisJCQlpZiAocmVxLT5tc2cuaGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQpCisJCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKKwkJCQkJJnJlcS0+bXNnLmhkciwKKwkJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKKwkJCQkJcmVxLT5tc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlKTsKKwkJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHRoZSAvcHJvYyBoYW5kbGVyLCB3aGljaCBtZWFucyB0aGUgdXNlciBzY3JpcHQgaGFzCisgKiBmaW5pc2hlZCB0aGUgZW5hYmxlL2Rpc2FibGUuICBGaW5kIHRoZSBtYXRjaGluZyBpZGVudGlmaWVyLCBhbmQKKyAqIHJlc3BvbmQgdG8gdGhlIENPTlRST0xWTSBtZXNzYWdlIHdpdGggc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcGFyYWhvdHBsdWdfcmVxdWVzdF9jb21wbGV0ZShpbnQgaWQsIFUxNiBhY3RpdmUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkvKiBMb29rIGZvciBhIHJlcXVlc3QgbWF0Y2hpbmcgImlkIi4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpIHsKKwkJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9CisJCSAgICBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QsIGxpc3QpOworCQlpZiAocmVxLT5pZCA9PSBpZCkgeworCQkJLyogRm91bmQgYSBtYXRjaC4gIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGFuZAorCQkJICogcmVzcG9uZC4KKwkJCSAqLworCQkJbGlzdF9kZWwocG9zKTsKKwkJCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCQlyZXEtPm1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUuQWN0aXZlID0gYWN0aXZlOworCQkJaWYgKHJlcS0+bXNnLmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQkJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoCisJCQkJCSZyZXEtPm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCisJCQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSk7CisJCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgUENJIGRldmljZSBieSBraWNraW5nIG9mZiBhIHVkZXYgc2NyaXB0CisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19wcm9jZXNzX21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZShpbm1zZyk7CisKKwlpZiAocmVxID09IE5VTEwpIHsKKwkJTE9HRVJSKCJwYXJhaG90cGx1Z19wcm9jZXNzX21lc3NhZ2U6IGNvdWxkbid0IGFsbG9jYXRlIHJlcXVlc3QiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbm1zZy0+Y21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlLkFjdGl2ZSkgeworCQkvKiBGb3IgZW5hYmxlIG1lc3NhZ2VzLCBqdXN0IHJlc3BvbmQgd2l0aCBzdWNjZXNzCisJCSogcmlnaHQgYXdheS4gIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgdGhlcmUgYXJlCisJCSogaXNzdWVzIHdpdGggdGhlIGVhcmx5IGVuYWJsZSBtZXNzYWdlcyB3ZSBnZXQgKHdpdGgKKwkJKiBlaXRoZXIgdGhlIHVkZXYgc2NyaXB0IG5vdCBkZXRlY3RpbmcgdGhhdCB0aGUgZGV2aWNlCisJCSogaXMgdXAsIG9yIG5vdCBnZXR0aW5nIGNhbGxlZCBhdCBhbGwpLiAgRm9ydHVuYXRlbHkKKwkJKiB0aGUgbWVzc2FnZXMgdGhhdCBnZXQgbG9zdCBkb24ndCBtYXR0ZXIgYW55d2F5LCBhcworCQkqIGRldmljZXMgYXJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBhdAorCQkqIGluaXRpYWxpemF0aW9uLgorCQkqLworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKKwkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgmaW5tc2ctPmhkciwKKwkJCQkJCSAgICAgIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCisJCQkJCQkgICAgICBpbm1zZy0+Y21kLgorCQkJCQkJICAgICAgZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUpOworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwl9IGVsc2UgeworCQkvKiBGb3IgZGlzYWJsZSBtZXNzYWdlcywgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZQorCQkqIHJlcXVlc3QgbGlzdCBiZWZvcmUga2lja2luZyBvZmYgdGhlIHVkZXYgc2NyaXB0LiAgSXQKKwkJKiB3b24ndCBnZXQgcmVzcG9uZGVkIHRvIHVudGlsIHRoZSBzY3JpcHQgaGFzCisJCSogaW5kaWNhdGVkIGl0J3MgZG9uZS4KKwkJKi8KKwkJc3Bpbl9sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJihyZXEtPmxpc3QpLCAmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KTsKKwkJc3Bpbl91bmxvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKKwl9Cit9CisKKy8qCisgKiBHZXRzIGNhbGxlZCB3aGVuIHRoZSB1ZGV2IHNjcmlwdCB3cml0ZXMgdG8KKyAqIC9wcm9jL3Zpc29yY2hpcHNldC9wYXJhaG90cGx1Zy4gIEV4cGVjdHMgaW5wdXQgaW4gdGhlIGZvcm0gb2YgIjxpZD4KKyAqIDxhY3RpdmU+IiB3aGVyZSA8aWQ+IGlzIHRoZSBpZGVudGlmaWVyIHBhc3NlZCB0byB0aGUgc2NyaXB0IHRoYXQKKyAqIG1hdGNoZXMgYSByZXF1ZXN0IG9uIHRoZSByZXF1ZXN0IGxpc3QsIGFuZCA8YWN0aXZlPiBpcyAwIG9yIDEKKyAqIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGV2aWNlIGlzIG5vdyBlbmFibGVkIG9yIG5vdC4KKyAqLworc3RhdGljIHNzaXplX3QKK3BhcmFob3RwbHVnX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1Zls2NF07CisJdWludCBpZDsKKwl1c2hvcnQgYWN0aXZlOworCisJaWYgKGNvdW50ID4gc2l6ZW9mKGJ1ZikgLSAxKSB7CisJCUxPR0VSUigicGFyYWhvdHBsdWdfcHJvY193cml0ZTogY291bnQgKCVkKSBleGNlZWRzIHNpemUgb2YgYnVmZmVyICglZCkiLAorCQkgICAgIChpbnQpIGNvdW50LCAoaW50KSBzaXplb2YoYnVmKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoInBhcmFob3RwbHVnX3Byb2Nfd3JpdGU6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50XSA9ICdcMCc7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1ICVodSIsICZpZCwgJmFjdGl2ZSkgIT0gMikgeworCQlpZCA9IDA7CisJCWFjdGl2ZSA9IDA7CisJfQorCisJaWYgKGFjdGl2ZSAhPSAxICYmIGFjdGl2ZSAhPSAwKSB7CisJCUxPR0VSUigicGFyYWhvdHBsdWdfcHJvY193cml0ZTogaW52YWxpZCBhY3RpdmUgZmllbGQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYWhvdHBsdWdfcmVxdWVzdF9jb21wbGV0ZSgoaW50KSBpZCwgKFUxNikgYWN0aXZlKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGFyYWhvdHBsdWdfcHJvY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gdmlzb3JjaGlwc2V0X3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gcGFyYWhvdHBsdWdfcHJvY193cml0ZSwKK307CisKKy8qIFByb2Nlc3MgYSBjb250cm9sdm0gbWVzc2FnZS4KKyAqIFJldHVybiByZXN1bHQ6CisgKiAgICBGQUxTRSAtIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gRkFMU0Ugb25seSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUKKyAqICAgICAgICAgICAgY29udHJvbHZtIG1lc3NhZ2Ugd2FzIE5PVCBwcm9jZXNzZWQsIGJ1dCBwcm9jZXNzaW5nIG11c3QgYmUKKyAqICAgICAgICAgICAgcmV0cmllZCBiZWZvcmUgcmVhZGluZyB0aGUgbmV4dCBjb250cm9sdm0gbWVzc2FnZTsgYQorICogICAgICAgICAgICBzY2VuYXJpbyB3aGVyZSB0aGlzIGNhbiBvY2N1ciBpcyB3aGVuIHdlIG5lZWQgdG8gdGhyb3R0bGUKKyAqICAgICAgICAgICAgdGhlIGFsbG9jYXRpb24gb2YgbWVtb3J5IGluIHdoaWNoIHRvIGNvcHkgb3V0IGNvbnRyb2x2bQorICogICAgICAgICAgICBwYXlsb2FkIGRhdGEKKyAqICAgIFRSVUUgIC0gcHJvY2Vzc2luZyBvZiB0aGUgY29udHJvbHZtIG1lc3NhZ2UgY29tcGxldGVkLAorICogICAgICAgICAgICBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MCitoYW5kbGVfY29tbWFuZChDT05UUk9MVk1fTUVTU0FHRSBpbm1zZywgSE9TVEFERFJFU1MgY2hhbm5lbF9hZGRyKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLmNtZDsKKwlVNjQgcGFyYW1ldGVyc0FkZHIgPSAwOworCVUzMiBwYXJhbWV0ZXJzQnl0ZXMgPSAwOworCVBBUlNFUl9DT05URVhUICpwYXJzZXJfY3R4ID0gTlVMTDsKKwlCT09MIGlzTG9jYWxBZGRyID0gRkFMU0U7CisJQ09OVFJPTFZNX01FU1NBR0UgYWNrbXNnOworCisJLyogY3JlYXRlIHBhcnNpbmcgY29udGV4dCBpZiBuZWNlc3NhcnkgKi8KKwlpc0xvY2FsQWRkciA9IChpbm1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPT0gMSk7CisJaWYgKGNoYW5uZWxfYWRkciA9PSAwKSB7CisJCUxPR0VSUigiSFVIPyBjaGFubmVsX2FkZHIgaXMgMCEiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXBhcmFtZXRlcnNBZGRyID0gY2hhbm5lbF9hZGRyICsgaW5tc2cuaGRyLlBheWxvYWRWbU9mZnNldDsKKwlwYXJhbWV0ZXJzQnl0ZXMgPSBpbm1zZy5oZHIuUGF5bG9hZEJ5dGVzOworCisJLyogUGFyYW1ldGVyIGFuZCBjaGFubmVsIGFkZHJlc3NlcyB3aXRoaW4gdGVzdCBtZXNzYWdlcyBhY3R1YWxseSBsaWUKKwkgKiB3aXRoaW4gb3VyIE9TLWNvbnRyb2xsZWQgbWVtb3J5LiAgV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKKwkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KKwkgKi8KKwlpZiAocGFyYW1ldGVyc0FkZHIgIT0gMCAmJiBwYXJhbWV0ZXJzQnl0ZXMgIT0gMCkgeworCQlCT09MIHJldHJ5ID0gRkFMU0U7CisJCXBhcnNlcl9jdHggPQorCQkgICAgcGFyc2VyX2luaXRfYnl0ZVN0cmVhbShwYXJhbWV0ZXJzQWRkciwgcGFyYW1ldGVyc0J5dGVzLAorCQkJCQkgICBpc0xvY2FsQWRkciwgJnJldHJ5KTsKKwkJaWYgKCFwYXJzZXJfY3R4KSB7CisJCQlpZiAocmV0cnkpIHsKKwkJCQlMT0dXUk4oInRocm90dGxpbmcgdG8gY29weSBwYXlsb2FkIik7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJTE9HV1JOKCJwYXJzaW5nIGZhaWxlZCIpOworCQkJTE9HV1JOKCJpbm1zZy5oZHIuSWQ9MHglbHgiLCAodWxvbmcpIGlubXNnLmhkci5JZCk7CisJCQlMT0dXUk4oInBhcmFtZXRlcnNBZGRyPTB4JWxseCIsICh1NjQpIHBhcmFtZXRlcnNBZGRyKTsKKwkJCUxPR1dSTigicGFyYW1ldGVyc0J5dGVzPSVsdSIsICh1bG9uZykgcGFyYW1ldGVyc0J5dGVzKTsKKwkJCUxPR1dSTigiaXNMb2NhbEFkZHI9JWQiLCBpc0xvY2FsQWRkcik7CisJCX0KKwl9CisKKwlpZiAoIWlzTG9jYWxBZGRyKSB7CisJCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZhY2ttc2csICZpbm1zZy5oZHIsCisJCQkJCUNPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOworCQlpZiAoKENvbnRyb2xWbV9jaGFubmVsKQorCQkgICAgJiYKKwkJICAgICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydAorCQkgICAgIChDb250cm9sVm1fY2hhbm5lbCwgQ09OVFJPTFZNX1FVRVVFX0FDSywgJmFja21zZykpKQorCQkJTE9HV1JOKCJmYWlsZWQgdG8gc2VuZCBBQ0sgZmFpbGVkIik7CisJfQorCXN3aXRjaCAoaW5tc2cuaGRyLklkKSB7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9JTklUOgorCQlMT0dJTkYoIkNISVBTRVRfSU5JVCgjYnVzc2VzPSVsdSwjc3dpdGNoZXM9JWx1KSIsCisJCSAgICAgICAodWxvbmcpIGlubXNnLmNtZC5pbml0Q2hpcHNldC5idXNDb3VudCwKKwkJICAgICAgICh1bG9uZykgaW5tc2cuY21kLmluaXRDaGlwc2V0LnN3aXRjaENvdW50KTsKKwkJY2hpcHNldF9pbml0KCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19DUkVBVEU6CisJCUxPR0lORigiQlVTX0NSRUFURSglbHUsI2RldnM9JWx1KSIsCisJCSAgICAgICAodWxvbmcpIGNtZC0+Y3JlYXRlQnVzLmJ1c05vLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNyZWF0ZUJ1cy5kZXZpY2VDb3VudCk7CisJCWJ1c19jcmVhdGUoJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6CisJCUxPR0lORigiQlVTX0RFU1RST1koJWx1KSIsICh1bG9uZykgY21kLT5kZXN0cm95QnVzLmJ1c05vKTsKKwkJYnVzX2Rlc3Ryb3koJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0NPTkZJR1VSRToKKwkJTE9HSU5GKCJCVVNfQ09ORklHVVJFKCVsdSkiLCAodWxvbmcpIGNtZC0+Y29uZmlndXJlQnVzLmJ1c05vKTsKKwkJYnVzX2NvbmZpZ3VyZSgmaW5tc2csIHBhcnNlcl9jdHgpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgorCQlMT0dJTkYoIkRFVklDRV9DUkVBVEUoJWx1LCVsdSkiLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNyZWF0ZURldmljZS5idXNObywKKwkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVEZXZpY2UuZGV2Tm8pOworCQlteV9kZXZpY2VfY3JlYXRlKCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKKwkJaWYgKGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuZmxhZ3MucGh5c2ljYWxEZXZpY2UpIHsKKwkJCUxPR0lORigiREVWSUNFX0NIQU5HRVNUQVRFIGZvciBwaHlzaWNhbCBkZXZpY2UgKCVsdSwlbHUsIGFjdGl2ZT0lbHUpIiwKKwkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmJ1c05vLAorCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8sCisJCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZS5BY3RpdmUpOworCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7CisJCX0gZWxzZSB7CisJCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgdmlydHVhbCBkZXZpY2UgKCVsdSwlbHUsIHN0YXRlLkFsaXZlPTB4JWx4KSIsCisJCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObywKKwkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vLAorCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUuQWxpdmUpOworCQkJLyogc2F2ZSB0aGUgaGRyIGFuZCBjbWQgc3RydWN0dXJlcyBmb3IgbGF0ZXIgdXNlICovCisJCQkvKiB3aGVuIHNlbmRpbmcgYmFjayB0aGUgcmVzcG9uc2UgdG8gQ29tbWFuZCAqLworCQkJbXlfZGV2aWNlX2NoYW5nZXN0YXRlKCZpbm1zZyk7CisJCQlnX0RpYWdNc2dIZHIgPSBpbm1zZy5oZHI7CisJCQlnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0ID0gaW5tc2cuY21kOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6CisJCUxPR0lORigiREVWSUNFX0RFU1RST1koJWx1LCVsdSkiLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmRlc3Ryb3lEZXZpY2UuYnVzTm8sCisJCSAgICAgICAodWxvbmcpIGNtZC0+ZGVzdHJveURldmljZS5kZXZObyk7CisJCW15X2RldmljZV9kZXN0cm95KCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkU6CisJCUxPR0lORigiREVWSUNFX0NPTkZJR1VSRSglbHUsJWx1KSIsCisJCSAgICAgICAodWxvbmcpIGNtZC0+Y29uZmlndXJlRGV2aWNlLmJ1c05vLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZURldmljZS5kZXZObyk7CisJCS8qIG5vIG9wIGZvciBub3csIGp1c3Qgc2VuZCBhIHJlc3BvbmQgdGhhdCB3ZSBwYXNzZWQgKi8KKwkJaWYgKGlubXNnLmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQkJY29udHJvbHZtX3Jlc3BvbmQoJmlubXNnLmhkciwgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfUkVBRFk6CisJCUxPR0lORigiQ0hJUFNFVF9SRUFEWSIpOworCQljaGlwc2V0X3JlYWR5KCZpbm1zZy5oZHIpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9DSElQU0VUX1NFTEZURVNUOgorCQlMT0dJTkYoIkNISVBTRVRfU0VMRlRFU1QiKTsKKwkJY2hpcHNldF9zZWxmdGVzdCgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOgorCQlMT0dJTkYoIkNISVBTRVRfU1RPUCIpOworCQljaGlwc2V0X25vdHJlYWR5KCZpbm1zZy5oZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dFUlIoInVucmVjb2duaXplZCBjb250cm9sdm0gY21kPSVkIiwgKGludCkgaW5tc2cuaGRyLklkKTsKKwkJaWYgKGlubXNnLmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQkJY29udHJvbHZtX3Jlc3BvbmQoJmlubXNnLmhkciwKKwkJCQkJICAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9VTktOT1dOKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBhcnNlcl9jdHggIT0gTlVMTCkgeworCQlwYXJzZXJfZG9uZShwYXJzZXJfY3R4KTsKKwkJcGFyc2VyX2N0eCA9IE5VTEw7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3BlcmlvZGljX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCVZJU09SQ0hJUFNFVF9DSEFOTkVMX0lORk8gY2hhbkluZm87CisJQ09OVFJPTFZNX01FU1NBR0UgaW5tc2c7CisJY2hhciBzWzk5XTsKKwlCT09MIGdvdEFDb21tYW5kID0gRkFMU0U7CisJQk9PTCBoYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBGQUxTRTsKKwlzdGF0aWMgVTY0IFBvbGxfQ291bnQ7CisKKwkvKiBtYWtlIHN1cmUgdmlzb3JidXMgc2VydmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGNvbnRyb2x2bSBjYWxsYmFja3MgKi8KKwlpZiAodmlzb3JjaGlwc2V0X3NlcnZlcnJlZ3dhaXQgJiYgIXNlcnZlcnJlZ2lzdGVyZWQpCisJCWdvdG8gQXdheTsKKwkvKiBtYWtlIHN1cmUgdmlzb3JjbGllbnRidXMgc2VydmVyIGlzIHJlZ3NpdGVyZWQgZm9yIGNvbnRyb2x2bQorCSAqIGNhbGxiYWNrcworCSAqLworCWlmICh2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCAmJiAhY2xpZW50cmVnaXN0ZXJlZCkKKwkJZ290byBBd2F5OworCisJbWVtc2V0KCZjaGFuSW5mbywgMCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9DSEFOTkVMX0lORk8pKTsKKwlpZiAoIUNvbnRyb2xWbV9jaGFubmVsKSB7CisJCUhPU1RBRERSRVNTIGFkZHIgPSBjb250cm9sdm1fZ2V0X2NoYW5uZWxfYWRkcmVzcygpOworCQlpZiAoYWRkciAhPSAwKSB7CisJCQlDb250cm9sVm1fY2hhbm5lbCA9CisJCQkgICAgdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2sKKwkJCSAgICAoYWRkciwKKwkJCSAgICAgc2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MKSwKKwkJCSAgICAgVWx0cmFDb250cm9sdm1DaGFubmVsUHJvdG9jb2xHdWlkKTsKKwkJCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKQorCQkJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBjb250cm9sdm0gY2hhbm5lbCIpOworCQkJZWxzZSBpZiAoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfT0tfQ0xJRU5UCisJCQkJICh2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihDb250cm9sVm1fY2hhbm5lbCksCisJCQkJICBOVUxMKSkgeworCQkJCUxPR0lORigiQ2hhbm5lbCAlcyAoQ29udHJvbFZtKSBkaXNjb3ZlcmVkIiwKKwkJCQkgICAgICAgdmlzb3JjaGFubmVsX2lkKENvbnRyb2xWbV9jaGFubmVsLCBzKSk7CisJCQkJaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZCgpOworCQkJfSBlbHNlIHsKKwkJCQlMT0dFUlIoImNvbnRyb2x2bSBjaGFubmVsIGlzIGludmFsaWQiKTsKKwkJCQl2aXNvcmNoYW5uZWxfZGVzdHJveShDb250cm9sVm1fY2hhbm5lbCk7CisJCQkJQ29udHJvbFZtX2NoYW5uZWwgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJUG9sbF9Db3VudCsrOworCWlmICgoQ29udHJvbFZtX2NoYW5uZWwgIT0gTlVMTCkgfHwgKFBvbGxfQ291bnQgPj0gMjUwKSkKKwkJOwkvKiBrZWVwIGdvaW5nICovCisJZWxzZQorCQlnb3RvIEF3YXk7CisKKwkvKiBDaGVjayBldmVudHMgdG8gZGV0ZXJtaW5lIGlmIHJlc3BvbnNlIHRvIENISVBTRVRfUkVBRFkKKwkgKiBzaG91bGQgYmUgc2VudAorCSAqLworCWlmICh2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeQorCSAgICAmJiAoZ19DaGlwU2V0TXNnSGRyLklkICE9IENPTlRST0xWTV9JTlZBTElEKSkgeworCQlpZiAoY2hlY2tfY2hpcHNldF9ldmVudHMoKSA9PSAxKSB7CisJCQlMT0dJTkYoIlNlbmRpbmcgQ0hJUFNFVF9SRUFEWSByZXNwb25zZSIpOworCQkJY29udHJvbHZtX3Jlc3BvbmQoJmdfQ2hpcFNldE1zZ0hkciwgMCk7CisJCQljbGVhcl9jaGlwc2V0X2V2ZW50cygpOworCQkJbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsCisJCQkgICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCQl9CisJfQorCisJaWYgKENvbnRyb2xWbV9jaGFubmVsKSB7CisJCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCQkJIENPTlRST0xWTV9RVUVVRV9SRVNQT05TRSwKKwkJCQkJCSAmaW5tc2cpKSB7CisJCQlpZiAoaW5tc2cuaGRyLlBheWxvYWRNYXhCeXRlcyAhPSAwKSB7CisJCQkJTE9HRVJSKCJQYXlsb2FkIG9mIHNpemUgJWx1IHJldHVybmVkIEAlbHUgd2l0aCB1bmV4cGVjdGVkIG1lc3NhZ2UgaWQgJWQuIiwKKwkJCQkgICAgICh1bG9uZykgaW5tc2cuaGRyLlBheWxvYWRNYXhCeXRlcywKKwkJCQkgICAgICh1bG9uZykgaW5tc2cuaGRyLlBheWxvYWRWbU9mZnNldCwKKwkJCQkgICAgIGlubXNnLmhkci5JZCk7CisJCQl9CisJCX0KKwkJaWYgKCFnb3RBQ29tbWFuZCkgeworCQkJaWYgKENvbnRyb2xWbV9QZW5kaW5nX01zZ19WYWxpZCkgeworCQkJCS8qIHdlIHRocm90dGxlZCBwcm9jZXNzaW5nIG9mIGEgcHJpb3IKKwkJCQkqIG1zZywgc28gdHJ5IHRvIHByb2Nlc3MgaXQgYWdhaW4KKwkJCQkqIHJhdGhlciB0aGFuIHJlYWRpbmcgYSBuZXcgb25lCisJCQkJKi8KKwkJCQlpbm1zZyA9IENvbnRyb2xWbV9QZW5kaW5nX01zZzsKKwkJCQlDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBGQUxTRTsKKwkJCQlnb3RBQ29tbWFuZCA9IFRSVUU7CisJCQl9IGVsc2UKKwkJCQlnb3RBQ29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCX0KKwl9CisKKwloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBGQUxTRTsKKwl3aGlsZSAoZ290QUNvbW1hbmQgJiYgKCFoYW5kbGVfY29tbWFuZF9mYWlsZWQpKSB7CisJCU1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7CisJCWlmIChDb250cm9sVm1fY2hhbm5lbCkgeworCQkJaWYgKGhhbmRsZV9jb21tYW5kKGlubXNnLAorCQkJCQkgICB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyCisJCQkJCSAgIChDb250cm9sVm1fY2hhbm5lbCkpKQorCQkJCWdvdEFDb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJCWVsc2UgeworCQkJCS8qIHRoaXMgaXMgYSBzY2VuYXJpbyB3aGVyZSB0aHJvdHRsaW5nCisJCQkJKiBpcyByZXF1aXJlZCwgYnV0IHByb2JhYmx5IE5PVCBhbgorCQkJCSogZXJyb3IuLi47IHdlIHN0YXNoIHRoZSBjdXJyZW50CisJCQkJKiBjb250cm9sdm0gbXNnIHNvIHdlIHdpbGwgYXR0ZW1wdCB0bworCQkJCSogcmVwcm9jZXNzIGl0IG9uIG91ciBuZXh0IGxvb3AKKwkJCQkqLworCQkJCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IFRSVUU7CisJCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnID0gaW5tc2c7CisJCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnX1ZhbGlkID0gVFJVRTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaGFuZGxlX2NvbW1hbmQoaW5tc2csIDApOworCQkJZ290QUNvbW1hbmQgPSBGQUxTRTsKKwkJfQorCX0KKworCS8qIHBhcmFob3RwbHVnX3dvcmtlciAqLworCXBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCgpOworCitBd2F5OgorCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJICAgICAgIE1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyArIChIWiAqIE1JTl9JRExFX1NFQ09ORFMpKSkgeworCQkvKiBpdCdzIGJlZW4gbG9uZ2VyIHRoYW4gTUlOX0lETEVfU0VDT05EUyBzaW5jZSB3ZQorCQkqIHByb2Nlc3NlZCBvdXIgbGFzdCBjb250cm9sdm0gbWVzc2FnZTsgc2xvdyBkb3duIHRoZQorCQkqIHBvbGxpbmcKKwkJKi8KKwkJaWYgKFBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1cpIHsKKwkJCUxPR0lORigic3dpdGNoZWQgdG8gc2xvdyBjb250cm9sdm0gcG9sbGluZyIpOworCQkJUG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKFBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1QpIHsKKwkJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKKwkJCUxPR0lORigic3dpdGNoZWQgdG8gZmFzdCBjb250cm9sdm0gcG9sbGluZyIpOworCQl9CisJfQorCisJcXVldWVfZGVsYXllZF93b3JrKFBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUsCisJCQkgICAmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssIFBvbGxfamlmZmllcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9jcmFzaF9kZXZpY2VzX3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCisJQ09OVFJPTFZNX01FU1NBR0UgbG9jYWxDcmFzaENyZWF0ZUJ1c01zZzsKKwlDT05UUk9MVk1fTUVTU0FHRSBsb2NhbENyYXNoQ3JlYXRlRGV2TXNnOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlIT1NUQUREUkVTUyBob3N0X2FkZHI7CisJVTMyIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldDsKKwlVMTYgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQ7CisKKwkvKiBtYWtlIHN1cmUgdmlzb3JidXMgc2VydmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGNvbnRyb2x2bSBjYWxsYmFja3MgKi8KKwlpZiAodmlzb3JjaGlwc2V0X3NlcnZlcnJlZ3dhaXQgJiYgIXNlcnZlcnJlZ2lzdGVyZWQpCisJCWdvdG8gQXdheTsKKworCS8qIG1ha2Ugc3VyZSB2aXNvcmNsaWVudGJ1cyBzZXJ2ZXIgaXMgcmVnc2l0ZXJlZCBmb3IgY29udHJvbHZtCisJICogY2FsbGJhY2tzCisJICovCisJaWYgKHZpc29yY2hpcHNldF9jbGllbnRyZWd3YWl0ICYmICFjbGllbnRyZWdpc3RlcmVkKQorCQlnb3RvIEF3YXk7CisKKwlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwkvKiBzZW5kIGluaXQgY2hpcHNldCBtc2cgKi8KKwltc2cuaGRyLklkID0gQ09OVFJPTFZNX0NISVBTRVRfSU5JVDsKKwltc2cuY21kLmluaXRDaGlwc2V0LmJ1c0NvdW50ID0gMjM7CisJbXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCA9IDA7CisKKwljaGlwc2V0X2luaXQoJm1zZyk7CisKKwlob3N0X2FkZHIgPSBjb250cm9sdm1fZ2V0X2NoYW5uZWxfYWRkcmVzcygpOworCWlmICghaG9zdF9hZGRyKSB7CisJCUxPR0VSUigiSHVoPyAgSG9zdCBhZGRyZXNzIGlzIE5VTEwiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfSEFERFJfTlVMTCwgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCUNvbnRyb2xWbV9jaGFubmVsID0KKwkgICAgdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2sKKwkgICAgKGhvc3RfYWRkciwKKwkgICAgIHNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCksCisJICAgICBVbHRyYUNvbnRyb2x2bUNoYW5uZWxQcm90b2NvbEd1aWQpOworCisJaWYgKENvbnRyb2xWbV9jaGFubmVsID09IE5VTEwpIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2x2bSBjaGFubmVsIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IHNhdmVkIG1lc3NhZ2UgY291bnQgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgU2F2ZWRDcmFzaE1zZ0NvdW50KSwKKwkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKFUxNikpIDwgMCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgeworCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKKwkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKKwkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgc2F2ZWQgY3Jhc2ggbWVzc2FnZSBvZmZzZXQgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgU2F2ZWRDcmFzaE1zZ09mZnNldCksCisJCQkgICAgICAmbG9jYWxTYXZlZENyYXNoTXNnT2Zmc2V0LCBzaXplb2YoVTMyKSkgPCAwKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGdldCBTYXZlZCBNZXNzYWdlIE9mZnNldCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZWFkIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBidXMgb2Zmc2V0ICovCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgbG9jYWxTYXZlZENyYXNoTXNnT2Zmc2V0LAorCQkJICAgICAgJmxvY2FsQ3Jhc2hDcmVhdGVCdXNNc2csCisJCQkgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKSA8IDApIHsKKwkJTE9HRVJSKCJDUkFTSF9ERVZfUkRfQlVTX0ZBSVVMUkU6IEZhaWxlZCB0byByZWFkIENyYXNoQ3JlYXRlQnVzTXNnISIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9SRF9CVVNfRkFJVUxSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlYWQgY3JlYXRlIGRldmljZSBtZXNzYWdlIGZvciBzdG9yYWdlIGRldmljZSAqLworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCArCisJCQkgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpLAorCQkJICAgICAgJmxvY2FsQ3Jhc2hDcmVhdGVEZXZNc2csCisJCQkgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKSA8IDApIHsKKwkJTE9HRVJSKCJDUkFTSF9ERVZfUkRfREVWX0ZBSVVMUkU6IEZhaWxlZCB0byByZWFkIENyYXNoQ3JlYXRlRGV2TXNnISIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9SRF9ERVZfRkFJVUxSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJldXNlIElPVk0gY3JlYXRlIGJ1cyBtZXNzYWdlICovCisJaWYgKGxvY2FsQ3Jhc2hDcmVhdGVCdXNNc2cuY21kLmNyZWF0ZUJ1cy5jaGFubmVsQWRkciAhPSAwKQorCQlidXNfY3JlYXRlKCZsb2NhbENyYXNoQ3JlYXRlQnVzTXNnKTsKKwllbHNlIHsKKwkJTE9HRVJSKCJDcmFzaENyZWF0ZUJ1c01zZyBpcyBudWxsLCBubyBkdW1wIHdpbGwgYmUgdGFrZW4iKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQlVTX05VTExfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJldXNlIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KKwlpZiAobG9jYWxDcmFzaENyZWF0ZURldk1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxBZGRyICE9IDApCisJCW15X2RldmljZV9jcmVhdGUoJmxvY2FsQ3Jhc2hDcmVhdGVEZXZNc2cpOworCWVsc2UgeworCQlMT0dFUlIoIkNyYXNoQ3JlYXRlRGV2TXNnIGlzIG51bGwsIG5vIGR1bXAgd2lsbCBiZSB0YWtlbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9ERVZfTlVMTF9GQUlMVVJFX1BDLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCUxPR0lORigiQnVzIGFuZCBkZXZpY2UgcmVhZHkgZm9yIGR1bXBpbmciKTsKKwlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm47CisKK0F3YXk6CisKKwlQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKKwkJCSAgICZQZXJpb2RpY19jb250cm9sdm1fd29yaywgUG9sbF9qaWZmaWVzKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSkKK3sKKwlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfQ1JFQVRFLCBidXNObywgcmVzcG9uc2UpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSkKK3sKKwlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzTm8sIHJlc3BvbnNlKTsKK30KKworc3RhdGljIHZvaWQKK2RldmljZV9jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisJZGV2aWNlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0NSRUFURSwgYnVzTm8sIGRldk5vLCByZXNwb25zZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSkKK3sKKwlkZXZpY2VfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgYnVzTm8sIGRldk5vLCByZXNwb25zZSk7Cit9CisKK3ZvaWQKK3Zpc29yY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisKKwlkZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsCisJCQkJICAgICBidXNObywgZGV2Tm8sIHJlc3BvbnNlLAorCQkJCSAgICAgU2VnbWVudFN0YXRlU3RhbmRieSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKTsKKworc3RhdGljIHZvaWQKK2RldmljZV9yZXN1bWVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisJZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCByZXNwb25zZSwKKwkJCQkgICAgIFNlZ21lbnRTdGF0ZVJ1bm5pbmcpOworfQorCitCT09MCit2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKHVsb25nIGJ1c05vLCBWSVNPUkNISVBTRVRfQlVTX0lORk8gKmJ1c0luZm8pCit7CisJdm9pZCAqcCA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7CisJaWYgKCFwKSB7CisJCUxPR0VSUigiKCVsdSkgZmFpbGVkIiwgYnVzTm8pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCW1lbWNweShidXNJbmZvLCBwLCBzaXplb2YoVklTT1JDSElQU0VUX0JVU19JTkZPKSk7CisJcmV0dXJuIFRSVUU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKTsKKworQk9PTAordmlzb3JjaGlwc2V0X3NldF9idXNfY29udGV4dCh1bG9uZyBidXNObywgdm9pZCAqY29udGV4dCkKK3sKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnAgPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcCkgeworCQlMT0dFUlIoIiglbHUpIGZhaWxlZCIsIGJ1c05vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlwLT5idXNfZHJpdmVyX2NvbnRleHQgPSBjb250ZXh0OworCXJldHVybiBUUlVFOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X3NldF9idXNfY29udGV4dCk7CisKK0JPT0wKK3Zpc29yY2hpcHNldF9nZXRfZGV2aWNlX2luZm8odWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLAorCQkJICAgICBWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKmRldkluZm8pCit7CisJdm9pZCAqcCA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcCkgeworCQlMT0dFUlIoIiglbHUsJWx1KSBmYWlsZWQiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCW1lbWNweShkZXZJbmZvLCBwLCBzaXplb2YoVklTT1JDSElQU0VUX0RFVklDRV9JTkZPKSk7CisJcmV0dXJuIFRSVUU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfZ2V0X2RldmljZV9pbmZvKTsKKworQk9PTAordmlzb3JjaGlwc2V0X3NldF9kZXZpY2VfY29udGV4dCh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIHZvaWQgKmNvbnRleHQpCit7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwID0gZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c05vLCBkZXZObyk7CisJaWYgKCFwKSB7CisJCUxPR0VSUigiKCVsdSwlbHUpIGZhaWxlZCIsIGJ1c05vLCBkZXZObyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcC0+YnVzX2RyaXZlcl9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gVFJVRTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9zZXRfZGV2aWNlX2NvbnRleHQpOworCisvKiBHZW5lcmljIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZyb20gYSBrbWVtX2NhY2hlIHBvb2wuCisgKi8KK3ZvaWQgKgordmlzb3JjaGlwc2V0X2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpwb29sLCBCT09MIG9rX3RvX2Jsb2NrLAorCQkJIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJZ2ZwX3QgZ2ZwOworCXZvaWQgKnA7CisKKwlpZiAob2tfdG9fYmxvY2spCisJCWdmcCA9IEdGUF9LRVJORUw7CisJZWxzZQorCQlnZnAgPSBHRlBfQVRPTUlDOworCS8qIF9fR0ZQX05PUkVUUlkgbWVhbnMgIm9rIHRvIGZhaWwiLCBtZWFuaW5nCisJICoga21lbV9jYWNoZV9hbGxvYygpIGNhbiByZXR1cm4gTlVMTCwgaW1wbHlpbmcgdGhlIGNhbGxlciBDQU4KKwkgKiBjb3BlIHdpdGggZmFpbHVyZS4gIElmIHlvdSBkbyBOT1Qgc3BlY2lmeSBfX0dGUF9OT1JFVFJZLAorCSAqIExpbnV4IHdpbGwgZ28gdG8gZXh0cmVtZSBtZWFzdXJlcyB0byBnZXQgbWVtb3J5IGZvciB5b3UKKwkgKiAobGlrZSwgaW52b2tlIG9vbSBraWxsZXIpLCB3aGljaCB3aWxsIHByb2JhYmx5IGNyaXBwbGUgdGhlCisJICogc3lzdGVtLgorCSAqLworCWdmcCB8PSBfX0dGUF9OT1JFVFJZOworCXAgPSBrbWVtX2NhY2hlX2FsbG9jKHBvb2wsIGdmcCk7CisJaWYgKCFwKSB7CisJCUxPR0VSUigia21lbV9jYWNoZV9hbGxvYyBmYWlsZWQgZWFybHkgQCVzOiVkXG4iLCBmbiwgbG4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYXRvbWljX2luYygmVmlzb3JjaGlwc2V0X2NhY2hlX2J1ZmZlcnNfaW5fdXNlKTsKKwlyZXR1cm4gcDsKK30KKworLyogR2VuZXJpYyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBmcmVlaW5nIG1lbW9yeSBmcm9tIGEga21lbV9jYWNoZSBwb29sLgorICovCit2b2lkCit2aXNvcmNoaXBzZXRfY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqcG9vbCwgdm9pZCAqcCwgY2hhciAqZm4sIGludCBsbikKK3sKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJOVUxMIHBvaW50ZXIgQCVzOiVkXG4iLCBmbiwgbG4pOworCQlyZXR1cm47CisJfQorCWF0b21pY19kZWMoJlZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CisJa21lbV9jYWNoZV9mcmVlKHBvb2wsIHApOworfQorCisjZGVmaW5lIGdldHRva2VuKGJ1ZnApIHN0cnNlcChidWZwLCAiIC1cdFxuIikKKworc3RhdGljIHNzaXplX3QKK2NoaXBzZXRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbNTEyXTsKKwljaGFyICp0b2tlbiwgKnA7CisKKwlpZiAoY291bnQgPiBzaXplb2YoYnVmKSAtIDEpIHsKKwkJTE9HRVJSKCJjaGlwc2V0X3Byb2Nfd3JpdGU6IGNvdW50ICglZCkgZXhjZWVkcyBzaXplIG9mIGJ1ZmZlciAoJWQpIiwKKwkJICAgICAoaW50KSBjb3VudCwgKGludCkgc2l6ZW9mKGJ1ZmZlcikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJjaGlwc2V0X3Byb2Nfd3JpdGU6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50XSA9ICdcMCc7CisKKwlwID0gYnVmOworCXRva2VuID0gZ2V0dG9rZW4oJnApOworCisJaWYgKHN0cmNtcCh0b2tlbiwgIkNBTExIT01FRElTS19NT1VOVEVEIikgPT0gMCkgeworCQl0b2tlbiA9IGdldHRva2VuKCZwKTsKKwkJLyogVGhlIENhbGwgSG9tZSBEaXNrIGhhcyBiZWVuIG1vdW50ZWQgKi8KKwkJaWYgKHN0cmNtcCh0b2tlbiwgIjAiKSA9PSAwKQorCQkJY2hpcHNldF9ldmVudHNbMF0gPSAxOworCX0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTU9EVUxFU19MT0FERUQiKSA9PSAwKSB7CisJCXRva2VuID0gZ2V0dG9rZW4oJnApOworCQkvKiBBbGwgbW9kdWxlcyBmb3IgdGhlIHBhcnRpdGlvbiBoYXZlIGJlZW4gbG9hZGVkICovCisJCWlmIChzdHJjbXAodG9rZW4sICIwIikgPT0gMCkKKwkJCWNoaXBzZXRfZXZlbnRzWzFdID0gMTsKKwl9IGVsc2UgaWYgKHRva2VuID09IE5VTEwpIHsKKwkJLyogTm8gZXZlbnQgc3BlY2lmaWVkICovCisJCUxPR0VSUigiTm8gZXZlbnQgd2FzIHNwZWNpZmllZCB0byBzZW5kIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCS8qIFVuc3VwcG9ydGVkIGV2ZW50IHNwZWNpZmllZCAqLworCQlMT0dFUlIoIiVzIGlzIGFuIGludmFsaWQgZXZlbnQgZm9yIHNlbmRpbmcgQ0hJUFNFVF9SRUFEWSByZXNwb25zZSIsCQkgICAgIHRva2VuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Zpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkcyB0aGUgSW5zdGFsbGF0aW9uRXJyb3IsIEluc3RhbGxhdGlvblRleHRJZCwKKyAqIEluc3RhbGxhdGlvblJlbWFpbmluZ1N0ZXBzIGZpZWxkcyBvZiBDb250cm9sVk1DaGFubmVsLgorICovCitzdGF0aWMgc3NpemVfdAorcHJvY19yZWFkX2luc3RhbGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCVUxNiByZW1haW5pbmdTdGVwczsKKwlVMzIgZXJyb3IsIHRleHRJZDsKKwljaGFyICp2YnVmOworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA+IDAgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwl2YnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghdmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgSW5zdGFsbGF0aW9uUmVtYWluaW5nU3RlcHMpLCAmcmVtYWluaW5nU3RlcHMsCisJCQkgIHNpemVvZihVMTYpKTsKKwl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgSW5zdGFsbGF0aW9uRXJyb3IpLCAmZXJyb3IsIHNpemVvZihVMzIpKTsKKwl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgSW5zdGFsbGF0aW9uVGV4dElkKSwgJnRleHRJZCwgc2l6ZW9mKFUzMikpOworCisJbGVuZ3RoID0gc3ByaW50Zih2YnVmLCAiJXUgJXUgJXVcbiIsIHJlbWFpbmluZ1N0ZXBzLCBlcnJvciwgdGV4dElkKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoqCisgKiBXcml0ZXMgdG8gdGhlIEluc3RhbGxhdGlvbkVycm9yLCBJbnN0YWxsYXRpb25UZXh0SWQsCisgKiBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwcyBmaWVsZHMgb2YKKyAqIENvbnRyb2xWTUNoYW5uZWwuCisgKiBJbnB1dDogUmVtYWluaW5nU3RlcHMgRXJyb3IgVGV4dElkCisgKiBMaW1pdCAzMiBjaGFyYWN0ZXJzIGlucHV0CisgKi8KKyNkZWZpbmUgVUlOVDE2X01BWAkJKDY1NTM1VSkKKyNkZWZpbmUgVUlOVDMyX01BWAkJKDQyOTQ5NjcyOTVVKQorc3RhdGljIHNzaXplX3QKK3Byb2Nfd3JpdGVfaW5zdGFsbGVyKHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzMyXTsKKwlVMTYgcmVtYWluaW5nU3RlcHM7CisJVTMyIGVycm9yLCB0ZXh0SWQ7CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gYnVmZmVyIG92ZXJmbG93ICovCisJaWYgKGNvdW50ID4gKHNpemVvZihidWYpIC0gMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJV0FSTigxLCAiRXJyb3IgY29weWluZyBmcm9tIHVzZXIgc3BhY2VcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVodSAlaSAlaSIsICZyZW1haW5pbmdTdGVwcywgJmVycm9yLCAmdGV4dElkKSAhPSAzKSB7CisJCXJlbWFpbmluZ1N0ZXBzID0gVUlOVDE2X01BWDsKKwkJZXJyb3IgPSBVSU5UMzJfTUFYOworCQl0ZXh0SWQgPSBVSU5UMzJfTUFYOworCX0KKworCWlmIChyZW1haW5pbmdTdGVwcyAhPSBVSU5UMTZfTUFYKSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUKKwkJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCSAgICAgIEluc3RhbGxhdGlvblJlbWFpbmluZ1N0ZXBzKSwgJnJlbWFpbmluZ1N0ZXBzLAorCQkgICAgIHNpemVvZihVMTYpKSA8IDApCisJCQlXQVJOKDEsICJJbnN0YWxsYXRpb24gU3RhdHVzIFdyaXRlIEZhaWxlZCAtIFdyaXRlIGZ1bmN0aW9uIGVycm9yIC0gUmVtYWluaW5nU3RlcHMgPSAlZFxuIiwKKwkJCSAgICAgcmVtYWluaW5nU3RlcHMpOworCX0KKworCWlmIChlcnJvciAhPSBVSU5UMzJfTUFYKSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUKKwkJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCSAgICAgIEluc3RhbGxhdGlvbkVycm9yKSwgJmVycm9yLCBzaXplb2YoVTMyKSkgPCAwKQorCQkJV0FSTigxLCAiSW5zdGFsbGF0aW9uIFN0YXR1cyBXcml0ZSBGYWlsZWQgLSBXcml0ZSBmdW5jdGlvbiBlcnJvciAtIEVycm9yID0gJWRcbiIsCisJCQkgICAgIGVycm9yKTsKKwl9CisKKwlpZiAodGV4dElkICE9IFVJTlQzMl9NQVgpIHsKKwkJaWYgKHZpc29yY2hhbm5lbF93cml0ZQorCQkgICAgKENvbnRyb2xWbV9jaGFubmVsLAorCQkgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJICAgICAgSW5zdGFsbGF0aW9uVGV4dElkKSwgJnRleHRJZCwgc2l6ZW9mKFUzMikpIDwgMCkKKwkJCVdBUk4oMSwgIkluc3RhbGxhdGlvbiBTdGF0dXMgV3JpdGUgRmFpbGVkIC0gV3JpdGUgZnVuY3Rpb24gZXJyb3IgLSBUZXh0SWQgPSAlZFxuIiwKKwkJCSAgICAgdGV4dElkKTsKKwl9CisKKwkvKiBTbyB0aGlzIGZ1bmN0aW9uIGlzbid0IGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgbXVzdCByZXR1cm4KKwkgKiBzaXplIG9mIGJ1ZmZlcgorCSAqLworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBSZWFkcyB0aGUgVG9vbEFjdGlvbiBmaWVsZCBvZiBDb250cm9sVk1DaGFubmVsLgorICovCitzdGF0aWMgc3NpemVfdAorcHJvY19yZWFkX3Rvb2xhY3Rpb24oc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCSAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJVTggdG9vbEFjdGlvbjsKKwljaGFyICp2YnVmOworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA+IDAgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwl2YnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghdmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgVG9vbEFjdGlvbiksICZ0b29sQWN0aW9uLCBzaXplb2YoVTgpKTsKKworCWxlbmd0aCA9IHNwcmludGYodmJ1ZiwgIiV1XG4iLCB0b29sQWN0aW9uKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoqCisgKiBXcml0ZXMgdG8gdGhlIFRvb2xBY3Rpb24gZmllbGQgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqIElucHV0OiBUb29sQWN0aW9uCisgKiBMaW1pdCAzIGNoYXJhY3RlcnMgaW5wdXQKKyAqLworI2RlZmluZSBVSU5UOF9NQVggKDI1NVUpCitzdGF0aWMgc3NpemVfdAorcHJvY193cml0ZV90b29sYWN0aW9uKHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlszXTsKKwlVOCB0b29sQWN0aW9uOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGJ1ZmZlciBvdmVyZmxvdyAqLworCWlmIChjb3VudCA+IChzaXplb2YoYnVmKSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCVdBUk4oMSwgIkVycm9yIGNvcHlpbmcgZnJvbSB1c2VyIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlaGhkIiwgJnRvb2xBY3Rpb24pICE9IDEpCisJCXRvb2xBY3Rpb24gPSBVSU5UOF9NQVg7CisKKwlpZiAodG9vbEFjdGlvbiAhPSBVSU5UOF9NQVgpIHsKKwkJaWYgKHZpc29yY2hhbm5lbF93cml0ZQorCQkgICAgKENvbnRyb2xWbV9jaGFubmVsLAorCQkgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBUb29sQWN0aW9uKSwKKwkJICAgICAmdG9vbEFjdGlvbiwgc2l6ZW9mKFU4KSkgPCAwKQorCQkJV0FSTigxLCAiSW5zdGFsbGF0aW9uIFRvb2xBY3Rpb24gV3JpdGUgRmFpbGVkIC0gVG9vbEFjdGlvbiA9ICVkXG4iLAorCQkJICAgICB0b29sQWN0aW9uKTsKKwl9CisKKwkvKiBTbyB0aGlzIGZ1bmN0aW9uIGlzbid0IGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgbXVzdCByZXR1cm4KKwkgKiBzaXplIG9mIGJ1ZmZlcgorCSAqLworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBSZWFkcyB0aGUgRWZpU3BhckluZGljYXRpb24uQm9vdFRvVG9vbCBmaWVsZCBvZiBDb250cm9sVk1DaGFubmVsLgorICovCitzdGF0aWMgc3NpemVfdAorcHJvY19yZWFkX2Jvb3RUb1Rvb2woc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCSAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTiBlZmlTcGFySW5kaWNhdGlvbjsKKwljaGFyICp2YnVmOworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA+IDAgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwl2YnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghdmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgRWZpU3BhckluZGljYXRpb24pLCAmZWZpU3BhckluZGljYXRpb24sCisJCQkgIHNpemVvZihVTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OKSk7CisKKwlsZW5ndGggPSBzcHJpbnRmKHZidWYsICIlZFxuIiwgKGludCkgZWZpU3BhckluZGljYXRpb24uQm9vdFRvVG9vbCk7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKgorICogV3JpdGVzIHRvIHRoZSBFZmlTcGFySW5kaWNhdGlvbi5Cb290VG9Ub29sIGZpZWxkIG9mIENvbnRyb2xWTUNoYW5uZWwuCisgKiBJbnB1dDogMSBvciAwICgxIGJlaW5nIG9uLCAwIGJlaW5nIG9mZikKKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2Nfd3JpdGVfYm9vdFRvVG9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbM107CisJaW50IGlucHV0VmFsOworCVVMVFJBX0VGSV9TUEFSX0lORElDQVRJT04gZWZpU3BhckluZGljYXRpb247CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gYnVmZmVyIG92ZXJmbG93ICovCisJaWYgKGNvdW50ID4gKHNpemVvZihidWYpIC0gMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJV0FSTigxLCAiRXJyb3IgY29weWluZyBmcm9tIHVzZXIgc3BhY2VcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVpIiwgJmlucHV0VmFsKSAhPSAxKQorCQlpbnB1dFZhbCA9IDA7CisKKwllZmlTcGFySW5kaWNhdGlvbi5Cb290VG9Ub29sID0gKGlucHV0VmFsID09IDEgPyAxIDogMCk7CisKKwlpZiAodmlzb3JjaGFubmVsX3dyaXRlCisJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBFZmlTcGFySW5kaWNhdGlvbiksCisJICAgICAmZWZpU3BhckluZGljYXRpb24sIHNpemVvZihVTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OKSkgPCAwKQorCQlwcmludGsKKwkJICAgICgiSW5zdGFsbGF0aW9uIEJvb3RUb1Rvb2wgV3JpdGUgRmFpbGVkIC0gQm9vdFRvVG9vbCA9ICVkXG4iLAorCQkgICAgIChpbnQpIGVmaVNwYXJJbmRpY2F0aW9uLkJvb3RUb1Rvb2wpOworCisJLyogU28gdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG11c3QgcmV0dXJuCisJICogc2l6ZSBvZiBidWZmZXIKKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNoaXBzZXRfcHJvY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gdmlzb3JjaGlwc2V0X3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gY2hpcHNldF9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3Zpc29yY2hpcHNldF9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMCwgeCA9IDA7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICppbnN0YWxsZXJfZmlsZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnRvb2xhY3Rpb25fZmlsZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJvb3RUb1Rvb2xfZmlsZTsKKworCUxPR0lORigiY2hpcHNldCBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWQiLCBWRVJTSU9OKTsKKwkvKiBwcm9jZXNzIG1vZHVsZSBvcHRpb25zICovCisJUE9TVENPREVfTElOVVhfMihEUklWRVJfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJTE9HSU5GKCJvcHRpb24gLSB0ZXN0dm5pYz0lZCIsIHZpc29yY2hpcHNldF90ZXN0dm5pYyk7CisJTE9HSU5GKCJvcHRpb24gLSB0ZXN0dm5pY2NsaWVudD0lZCIsIHZpc29yY2hpcHNldF90ZXN0dm5pY2NsaWVudCk7CisJTE9HSU5GKCJvcHRpb24gLSB0ZXN0bXNnPSVkIiwgdmlzb3JjaGlwc2V0X3Rlc3Rtc2cpOworCUxPR0lORigib3B0aW9uIC0gdGVzdHRlYXJkb3duPSVkIiwgdmlzb3JjaGlwc2V0X3Rlc3R0ZWFyZG93bik7CisJTE9HSU5GKCJvcHRpb24gLSBtYWpvcj0lZCIsIHZpc29yY2hpcHNldF9tYWpvcik7CisJTE9HSU5GKCJvcHRpb24gLSBzZXJ2ZXJyZWd3YWl0PSVkIiwgdmlzb3JjaGlwc2V0X3NlcnZlcnJlZ3dhaXQpOworCUxPR0lORigib3B0aW9uIC0gY2xpZW50cmVnd2FpdD0lZCIsIHZpc29yY2hpcHNldF9jbGllbnRyZWd3YWl0KTsKKwlMT0dJTkYoIm9wdGlvbiAtIGhvbGRjaGlwc2V0cmVhZHk9JWQiLCB2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSk7CisKKwltZW1zZXQoJkJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzLCAwLCBzaXplb2YoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMpKTsKKwltZW1zZXQoJkJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLCAwLCBzaXplb2YoQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMpKTsKKwltZW1zZXQoJkNvbnRyb2xWbV9wYXlsb2FkX2luZm8sIDAsIHNpemVvZihDb250cm9sVm1fcGF5bG9hZF9pbmZvKSk7CisJbWVtc2V0KCZMaXZlRHVtcF9pbmZvLCAwLCBzaXplb2YoTGl2ZUR1bXBfaW5mbykpOworCWF0b21pY19zZXQoJkxpdmVEdW1wX2luZm8uYnVmZmVyc19pbl91c2UsIDApOworCisJaWYgKHZpc29yY2hpcHNldF90ZXN0dm5pYykgeworCQlFUlJEUlYoInRlc3R2bmljIG9wdGlvbiBubyBsb25nZXIgc3VwcG9ydGVkOiAoc3RhdHVzID0gJWQpXG4iLAorCQkgICAgICAgeCk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMsIHgsIERJQUdfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSB4OworCQlnb3RvIEF3YXk7CisJfQorCisJY29udHJvbHZtX2luaXQoKTsKKwlNYWpvckRldiA9IE1LREVWKHZpc29yY2hpcHNldF9tYWpvciwgMCk7CisJcmMgPSB2aXNvcmNoaXBzZXRfZmlsZV9pbml0KE1ham9yRGV2LCAmQ29udHJvbFZtX2NoYW5uZWwpOworCWlmIChyYyA8IDApIHsKKwkJRVJSRFJWKCJ2aXNvcmNoaXBzZXRfZmlsZV9pbml0KE1ham9yRGV2LCAmQ29udHJvbFZtX2NoYW5uZWwpOiBlcnJvciAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCBESUFHX1NFVkVSSVRZX0VSUik7CisJCWdvdG8gQXdheTsKKwl9CisKKwlwcm9jX0luaXQoKTsKKwltZW1zZXQoUGFydGl0aW9uUHJvcGVydHlOYW1lcywgMCwgc2l6ZW9mKFBhcnRpdGlvblByb3BlcnR5TmFtZXMpKTsKKwltZW1zZXQoQ29udHJvbFZtUHJvcGVydHlOYW1lcywgMCwgc2l6ZW9mKENvbnRyb2xWbVByb3BlcnR5TmFtZXMpKTsKKwlJbml0UGFydGl0aW9uUHJvcGVydGllcygpOworCUluaXRDb250cm9sVm1Qcm9wZXJ0aWVzKCk7CisKKwlQYXJ0aXRpb25UeXBlID0gdmlzb3JfcHJvY19DcmVhdGVUeXBlKFByb2NEaXIsIFBhcnRpdGlvblR5cGVOYW1lcywKKwkJCQkJICAgICAgKGNvbnN0IGNoYXIgKiopCisJCQkJCSAgICAgIFBhcnRpdGlvblByb3BlcnR5TmFtZXMsCisJCQkJCSAgICAgICZzaG93X3BhcnRpdGlvbl9wcm9wZXJ0eSk7CisJQ29udHJvbFZtVHlwZSA9CisJICAgIHZpc29yX3Byb2NfQ3JlYXRlVHlwZShQcm9jRGlyLCBDb250cm9sVm1UeXBlTmFtZXMsCisJCQkJICAoY29uc3QgY2hhciAqKikgQ29udHJvbFZtUHJvcGVydHlOYW1lcywKKwkJCQkgICZzaG93X2NvbnRyb2x2bV9wcm9wZXJ0eSk7CisKKwlDb250cm9sVm1PYmplY3QgPSB2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdChDb250cm9sVm1UeXBlLCBOVUxMLCBOVUxMKTsKKworCS8qIFNldHVwIEluc3RhbGxhdGlvbiBmaWVsZHMgKi8KKwlpbnN0YWxsZXJfZmlsZSA9IHByb2NfY3JlYXRlKCJpbnN0YWxsZXIiLCAwNjQ0LCBQcm9jRGlyLAorCQkJCSAgICAgJnByb2NfaW5zdGFsbGVyX2ZvcHMpOworCS8qIFNldHVwIHRoZSBUb29sQWN0aW9uIGZpZWxkICovCisJdG9vbGFjdGlvbl9maWxlID0gcHJvY19jcmVhdGUoInRvb2xhY3Rpb24iLCAwNjQ0LCBQcm9jRGlyLAorCQkJCSAgICAgICZwcm9jX3Rvb2xhY3Rpb25fZm9wcyk7CisJLyogU2V0dXAgdGhlIEJvb3RUb1Rvb2wgZmllbGQgKi8KKwlib290VG9Ub29sX2ZpbGUgPSBwcm9jX2NyZWF0ZSgiYm9vdHRvdG9vbCIsIDA2NDQsIFByb2NEaXIsCisJCQkJICAgICAgJnByb2NfYm9vdFRvVG9vbF9mb3BzKTsKKworCW1lbXNldCgmZ19EaWFnTXNnSGRyLCAwLCBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSKSk7CisKKwljaGlwc2V0X3Byb2NfZGlyID0gcHJvY19jcmVhdGUoVklTT1JDSElQU0VUX0NISVBTRVRfUFJPQ19FTlRSWV9GTiwKKwkJCQkgICAgICAgMDY0NCwgUHJvY0RpciwgJmNoaXBzZXRfcHJvY19mb3BzKTsKKwltZW1zZXQoJmdfQ2hpcFNldE1zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJcGFyYWhvdHBsdWdfcHJvY19kaXIgPQorCSAgICBwcm9jX2NyZWF0ZShWSVNPUkNISVBTRVRfUEFSQUhPVFBMVUdfUFJPQ19FTlRSWV9GTiwgMDIwMCwKKwkJCVByb2NEaXIsICZwYXJhaG90cGx1Z19wcm9jX2ZvcHMpOworCW1lbXNldCgmZ19EZWxEdW1wTXNnSGRyLCAwLCBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSKSk7CisKKwlpZiAoZmlsZXhmZXJfY29uc3RydWN0b3Ioc2l6ZW9mKHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QpKSA8IDApIHsKKwkJRVJSRFJWKCJmaWxleGZlcl9jb25zdHJ1Y3RvciBmYWlsZWQ6IChzdGF0dXM9LTEpXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOworCQlyYyA9IC0xOworCQlnb3RvIEF3YXk7CisJfQorCVB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCA9CisJICAgIGttZW1fY2FjaGVfY3JlYXRlKFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbF9uYW1lLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBwdXRmaWxlX2J1ZmZlcl9lbnRyeSksCisJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sKSB7CisJCUVSUkRSVigiZmFpbGVkIHRvIGFsbG9jIFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbDogKHN0YXR1cz0tMSlcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCBESUFHX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLTE7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSkgeworCQlMT0dJTkYoInZpc29yY2hpcHNldF9pbml0OmNvbnRyb2x2bSBkaXNhYmxlZCIpOworCX0gZWxzZSB7CisJCS8qIGlmIGJvb3RpbmcgaW4gYSBjcmFzaCBrZXJuZWwgKi8KKwkJaWYgKHZpc29yY2hpcHNldF9jcmFzaF9rZXJuZWwpCisJCQlJTklUX0RFTEFZRURfV09SSygmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssCisJCQkJCSAgc2V0dXBfY3Jhc2hfZGV2aWNlc193b3JrX3F1ZXVlKTsKKwkJZWxzZQorCQkJSU5JVF9ERUxBWUVEX1dPUksoJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLAorCQkJCQkgIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKTsKKwkJUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSA9CisJCSAgICBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlzb3JjaGlwc2V0X2NvbnRyb2x2bSIpOworCisJCWlmIChQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID09IE5VTEwpIHsKKwkJCUVSUkRSVigiY2Fubm90IGNyZWF0ZSBjb250cm9sdm0gd29ya3F1ZXVlOiAoc3RhdHVzPSVkKVxuIiwKKwkJCSAgICAgICAtRU5PTUVNKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzIoQ1JFQVRFX1dPUktRVUVVRV9GQUlMRURfUEMsCisJCQkJCSBESUFHX1NFVkVSSVRZX0VSUik7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJTW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzID0gamlmZmllczsKKwkJUG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUOworCQlyYyA9IHF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAorCQkJCQkmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssIFBvbGxfamlmZmllcyk7CisJCWlmIChyYyA8IDApIHsKKwkJCUVSUkRSVigicXVldWVfZGVsYXllZF93b3JrKFBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUsICZQZXJpb2RpY19jb250cm9sdm1fd29yaywgUG9sbF9qaWZmaWVzKTogZXJyb3IgKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzIoUVVFVUVfREVMQVlFRF9XT1JLX1BDLAorCQkJCQkgRElBR19TRVZFUklUWV9FUlIpOworCQkJZ290byBBd2F5OworCQl9CisKKwl9CisKKwlWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5kZXZ0ID0gTWFqb3JEZXY7CisJaWYgKHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZSkgPCAwKSB7CisJCUVSUkRSVigicGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHZpc29yY2hpcHNldCkgZmFpbGVkOiAoc3RhdHVzPS0xKVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoREVWSUNFX1JFR0lTVEVSX0ZBSUxVUkVfUEMsIERJQUdfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtMTsKKwkJZ290byBBd2F5OworCX0KKwlMT0dJTkYoInZpc29yY2hpcHNldCBkZXZpY2UgY3JlYXRlZCIpOworCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJjID0gMDsKK0F3YXk6CisJaWYgKHJjKSB7CisJCUxPR0VSUigidmlzb3JjaGlwc2V0X2luaXQgZmFpbGVkIik7CisJCVBPU1RDT0RFX0xJTlVYXzMoQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMsIHJjLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCit2aXNvcmNoaXBzZXRfZXhpdCh2b2lkKQoreworCWNoYXIgc1s5OV07CisJUE9TVENPREVfTElOVVhfMihEUklWRVJfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpZiAodmlzb3JjaGlwc2V0X2Rpc2FibGVfY29udHJvbHZtKSB7CisJCTsKKwl9IGVsc2UgeworCQljYW5jZWxfZGVsYXllZF93b3JrKCZQZXJpb2RpY19jb250cm9sdm1fd29yayk7CisJCWZsdXNoX3dvcmtxdWV1ZShQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7CisJCVBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPSBOVUxMOworCQlkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oJkNvbnRyb2xWbV9wYXlsb2FkX2luZm8pOworCX0KKwlUZXN0X1ZuaWNfY2hhbm5lbCA9IE5VTEw7CisJaWYgKFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sKTsKKwkJUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0gTlVMTDsKKwl9CisJZmlsZXhmZXJfZGVzdHJ1Y3RvcigpOworCWlmIChDb250cm9sVm1PYmplY3QpIHsKKwkJdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KENvbnRyb2xWbU9iamVjdCk7CisJCUNvbnRyb2xWbU9iamVjdCA9IE5VTEw7CisJfQorCWNsZWFudXBfY29udHJvbHZtX3N0cnVjdHVyZXMoKTsKKworCWlmIChDb250cm9sVm1UeXBlKSB7CisJCXZpc29yX3Byb2NfRGVzdHJveVR5cGUoQ29udHJvbFZtVHlwZSk7CisJCUNvbnRyb2xWbVR5cGUgPSBOVUxMOworCX0KKwlpZiAoUGFydGl0aW9uVHlwZSkgeworCQl2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKFBhcnRpdGlvblR5cGUpOworCQlQYXJ0aXRpb25UeXBlID0gTlVMTDsKKwl9CisJaWYgKGRpYWdfcHJvY19kaXIpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoVklTT1JDSElQU0VUX0RJQUdfUFJPQ19FTlRSWV9GTiwgUHJvY0Rpcik7CisJCWRpYWdfcHJvY19kaXIgPSBOVUxMOworCX0KKwltZW1zZXQoJmdfRGlhZ01zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJaWYgKGNoaXBzZXRfcHJvY19kaXIpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoVklTT1JDSElQU0VUX0NISVBTRVRfUFJPQ19FTlRSWV9GTiwgUHJvY0Rpcik7CisJCWNoaXBzZXRfcHJvY19kaXIgPSBOVUxMOworCX0KKwltZW1zZXQoJmdfQ2hpcFNldE1zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJaWYgKHBhcmFob3RwbHVnX3Byb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFZJU09SQ0hJUFNFVF9QQVJBSE9UUExVR19QUk9DX0VOVFJZX0ZOLAorCQkJCSAgUHJvY0Rpcik7CisJCXBhcmFob3RwbHVnX3Byb2NfZGlyID0gTlVMTDsKKwl9CisKKwltZW1zZXQoJmdfRGVsRHVtcE1zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJcHJvY19EZUluaXQoKTsKKwlpZiAoQ29udHJvbFZtX2NoYW5uZWwgIT0gTlVMTCkgeworCQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY29ubmVjdGVkIiwKKwkJICAgICAgIHZpc29yY2hhbm5lbF9pZChDb250cm9sVm1fY2hhbm5lbCwgcykpOworCQl2aXNvcmNoYW5uZWxfZGVzdHJveShDb250cm9sVm1fY2hhbm5lbCk7CisJCUNvbnRyb2xWbV9jaGFubmVsID0gTlVMTDsKKwl9CisJY29udHJvbHZtX2RlaW5pdCgpOworCXZpc29yY2hpcHNldF9maWxlX2NsZWFudXAoKTsKKwlQT1NUQ09ERV9MSU5VWF8yKERSSVZFUl9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlMT0dJTkYoImNoaXBzZXQgZHJpdmVyIHVubG9hZGVkIik7Cit9CisKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0dm5pYywgdmlzb3JjaGlwc2V0X3Rlc3R2bmljLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfdGVzdHZuaWMsICIxIHRvIHRlc3Qgdm5pYywgdXNpbmcgZHVtbXkgVk5JQyBjb25uZWN0ZWQgdmlhIGEgbG9vcGJhY2sgdG8gYSBwaHlzaWNhbCBldGhlcm5ldCIpOworaW50IHZpc29yY2hpcHNldF90ZXN0dm5pYyA9IDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0dm5pY2NsaWVudCwgdmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfdGVzdHZuaWNjbGllbnQsICIxIHRvIHRlc3Qgdm5pYywgdXNpbmcgcmVhbCBWTklDIGNoYW5uZWwgYXR0YWNoZWQgdG8gYSBzZXBhcmF0ZSBJT1ZNIGd1ZXN0Iik7CitpbnQgdmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50ID0gMDsKKworbW9kdWxlX3BhcmFtX25hbWVkKHRlc3Rtc2csIHZpc29yY2hpcHNldF90ZXN0bXNnLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfdGVzdG1zZywKKwkJICIxIHRvIG1hbnVmYWN0dXJlIHRoZSBjaGlwc2V0LCBidXMsIGFuZCBzd2l0Y2ggbWVzc2FnZXMiKTsKK2ludCB2aXNvcmNoaXBzZXRfdGVzdG1zZyA9IDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZChtYWpvciwgdmlzb3JjaGlwc2V0X21ham9yLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfbWFqb3IsICJtYWpvciBkZXZpY2UgbnVtYmVyIHRvIHVzZSBmb3IgdGhlIGRldmljZSBub2RlIik7CitpbnQgdmlzb3JjaGlwc2V0X21ham9yID0gMDsKKworbW9kdWxlX3BhcmFtX25hbWVkKHNlcnZlcnJlZ3dhaXQsIHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfc2VydmVycmVxd2FpdCwKKwkJICIxIHRvIGhhdmUgdGhlIG1vZHVsZSB3YWl0IGZvciB0aGUgdmlzb3IgYnVzIHRvIHJlZ2lzdGVyIik7CitpbnQgdmlzb3JjaGlwc2V0X3NlcnZlcnJlZ3dhaXQgPSAwOwkvKiBkZWZhdWx0IGlzIG9mZiAqLworbW9kdWxlX3BhcmFtX25hbWVkKGNsaWVudHJlZ3dhaXQsIHZpc29yY2hpcHNldF9jbGllbnRyZWd3YWl0LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCwgIjEgdG8gaGF2ZSB0aGUgbW9kdWxlIHdhaXQgZm9yIHRoZSB2aXNvcmNsaWVudGJ1cyB0byByZWdpc3RlciIpOworaW50IHZpc29yY2hpcHNldF9jbGllbnRyZWd3YWl0ID0gMTsJLyogZGVmYXVsdCBpcyBvbiAqLworbW9kdWxlX3BhcmFtX25hbWVkKHRlc3R0ZWFyZG93biwgdmlzb3JjaGlwc2V0X3Rlc3R0ZWFyZG93biwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3R0ZWFyZG93biwKKwkJICIxIHRvIHRlc3QgdGVhcmRvd24gb2YgdGhlIGNoaXBzZXQsIGJ1cywgYW5kIHN3aXRjaCIpOworaW50IHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24gPSAwOwkvKiBkZWZhdWx0IGlzIG9mZiAqLworbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGVfY29udHJvbHZtLCB2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0sIGludCwKKwkJICAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSwKKwkJICIxIHRvIGRpc2FibGUgcG9sbGluZyBvZiBjb250cm9sVm0gY2hhbm5lbCIpOworaW50IHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSA9IDA7CS8qIGRlZmF1bHQgaXMgb2ZmICovCittb2R1bGVfcGFyYW1fbmFtZWQoY3Jhc2hfa2VybmVsLCB2aXNvcmNoaXBzZXRfY3Jhc2hfa2VybmVsLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfY3Jhc2hfa2VybmVsLAorCQkgIjEgbWVhbnMgd2UgYXJlIHJ1bm5pbmcgaW4gY3Jhc2gga2VybmVsIik7CitpbnQgdmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCA9IDA7IC8qIGRlZmF1bHQgaXMgcnVubmluZyBpbiBub24tY3Jhc2gga2VybmVsICovCittb2R1bGVfcGFyYW1fbmFtZWQoaG9sZGNoaXBzZXRyZWFkeSwgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHksCisJCSAgIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5LAorCQkgIjEgdG8gaG9sZCByZXNwb25zZSB0byBDSElQU0VUX1JFQURZIik7CitpbnQgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkgPSAwOyAvKiBkZWZhdWx0IGlzIHRvIHNlbmQgQ0hJUFNFVF9SRUFEWQorCQkJCSAgICAgICogcmVzcG9uc2UgaW1tZWRpYXRlbHkgKi8KK21vZHVsZV9pbml0KHZpc29yY2hpcHNldF9pbml0KTsKK21vZHVsZV9leGl0KHZpc29yY2hpcHNldF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVW5pc3lzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVydmlzb3IgY2hpcHNldCBkcml2ZXIgZm9yIHNlcnZpY2UgcGFydGl0aW9uOiB2ZXIgIgorCQkgICBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X3Vtb2RlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfdW1vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTllODQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X3Vtb2RlLmgKQEAgLTAsMCArMSwzNyBAQAorLyogdmlzb3JjaGlwc2V0X3Vtb2RlLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBkZXNjcmliZXMgc3RydWN0dXJlcyBuZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUKKyAqICB2aXNvcmNoaXBzZXQgZHJpdmVyIGFuZCBhIHVzZXItbW9kZSBjb21wb25lbnQgdGhhdCBvcGVucyB0aGUgZGV2aWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fVklTT1JDSElQU0VUX1VNT0RFX0gKKyNkZWZpbmUgX19WSVNPUkNISVBTRVRfVU1PREVfSAorCisKKworLyoqIFRoZSB1c2VyLW1vZGUgcHJvZ3JhbSBjYW4gYWNjZXNzIHRoZSBjb250cm9sIGNoYW5uZWwgYnVmZmVyIGRpcmVjdGx5CisgKiAgdmlhIHRoaXMgbWVtb3J5IG1hcC4KKyAqLworI2RlZmluZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVCAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVklTT1JDSElQU0VUX01NQVBfQ09OVFJPTENIQU5TSVpFICAgICAgKDB4MDA0MDAwMDApICAvKiA0TUIgKi8KKworI2VuZGlmIC8qIF9fVklTT1JDSElQU0VUX1VNT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjYxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHRpbXNrbW9kIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFVOSVNZU19WSVNPUlVUSUwKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpc29ydXRpbCBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSCisJLS0taGVscC0tLQorCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXNvcnV0aWwgZHJpdmVyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDYzODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjCisjIE1ha2VmaWxlIGZvciBVbmlzeXMgdGltc2ttb2QKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUlVUSUwpCSs9IHZpc29ydXRpbC5vCisKK3Zpc29ydXRpbC15IDo9IGNoYXJxdWV1ZS5vICBlYXN5cHJvYy5vICBwZXJpb2RpY193b3JrLm8gIHByb2NvYmplY3R0cmVlLm8gIFwKKwkJbWVtcmVnaW9uX2RpcmVjdC5vIHZpc29ya21vZHV0aWxzLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2NoYXJxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWVkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogY2hhcnF1ZXVlLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgU2ltcGxlIGNoYXJhY3RlciBxdWV1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXgga2VybmVsIG1vZGUuCisgKi8KKworI2luY2x1ZGUgImNoYXJxdWV1ZS5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAiY2hhcnF1ZXVlIgorCisjZGVmaW5lIElTX0VNUFRZKGNoYXJxdWV1ZSkgKGNoYXJxdWV1ZS0+aGVhZCA9PSBjaGFycXVldWUtPnRhaWwpCisKKworCitzdHJ1Y3QgQ0hBUlFVRVVFX1RhZyB7CisJaW50IGFsbG9jX3NpemU7CisJaW50IG5zbG90czsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IGhlYWQsIHRhaWw7CisJdW5zaWduZWQgY2hhciBidWZbMF07Cit9OworCisKKworQ0hBUlFVRVVFICp2aXNvcl9jaGFycXVldWVfY3JlYXRlKHVsb25nIG5zbG90cykKK3sKKwlpbnQgYWxsb2Nfc2l6ZSA9IHNpemVvZihDSEFSUVVFVUUpICsgbnNsb3RzICsgMTsKKwlDSEFSUVVFVUUgKmNxID0ga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmIChjcSA9PSBOVUxMKSB7CisJCUVSUkRSVigidmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSBhbGxvY2F0aW9uIGZhaWxlZCAoYWxsb2Nfc2l6ZT0lZCkiLAorCQkgICAgICAgYWxsb2Nfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwljcS0+YWxsb2Nfc2l6ZSA9IGFsbG9jX3NpemU7CisJY3EtPm5zbG90cyA9IG5zbG90czsKKwljcS0+aGVhZCA9IGNxLT50YWlsID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmY3EtPmxvY2spOworCXJldHVybiBjcTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2NoYXJxdWV1ZV9jcmVhdGUpOworCisKKwordm9pZCB2aXNvcl9jaGFycXVldWVfZW5xdWV1ZShDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciBjKQoreworCWludCBhbGxvY19zbG90cyA9IGNoYXJxdWV1ZS0+bnNsb3RzKzE7ICAvKiAxIHNsb3QgaXMgYWx3YXlzIGVtcHR5ICovCisKKwlzcGluX2xvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJY2hhcnF1ZXVlLT5oZWFkID0gKGNoYXJxdWV1ZS0+aGVhZCsxKSAlIGFsbG9jX3Nsb3RzOworCWlmIChjaGFycXVldWUtPmhlYWQgPT0gY2hhcnF1ZXVlLT50YWlsKQorCQkvKiBvdmVyZmxvdzsgb3ZlcndyaXRlIHRoZSBvbGRlc3QgZW50cnkgKi8KKwkJY2hhcnF1ZXVlLT50YWlsID0gKGNoYXJxdWV1ZS0+dGFpbCsxKSAlIGFsbG9jX3Nsb3RzOworCWNoYXJxdWV1ZS0+YnVmW2NoYXJxdWV1ZS0+aGVhZF0gPSBjOworCXNwaW5fdW5sb2NrKCZjaGFycXVldWUtPmxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfY2hhcnF1ZXVlX2VucXVldWUpOworCisKKworQk9PTCB2aXNvcl9jaGFycXVldWVfaXNfZW1wdHkoQ0hBUlFVRVVFICpjaGFycXVldWUpCit7CisJQk9PTCBiOworCXNwaW5fbG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKKwliID0gSVNfRU1QVFkoY2hhcnF1ZXVlKTsKKwlzcGluX3VubG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gYjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2NoYXJxdWV1ZV9pc19lbXB0eSk7CisKKworCitzdGF0aWMgaW50IGNoYXJxdWV1ZV9kZXF1ZXVlXzEoQ0hBUlFVRVVFICpjaGFycXVldWUpCit7CisJaW50IGFsbG9jX3Nsb3RzID0gY2hhcnF1ZXVlLT5uc2xvdHMgKyAxOyAgLyogMSBzbG90IGlzIGFsd2F5cyBlbXB0eSAqLworCisJaWYgKElTX0VNUFRZKGNoYXJxdWV1ZSkpCisJCXJldHVybiAtMTsKKwljaGFycXVldWUtPnRhaWwgPSAoY2hhcnF1ZXVlLT50YWlsKzEpICUgYWxsb2Nfc2xvdHM7CisJcmV0dXJuIGNoYXJxdWV1ZS0+YnVmW2NoYXJxdWV1ZS0+dGFpbF07Cit9CisKKworCitpbnQgY2hhcnF1ZXVlX2RlcXVldWUoQ0hBUlFVRVVFICpjaGFycXVldWUpCit7CisJaW50IHJjOworCisJc3Bpbl9sb2NrKCZjaGFycXVldWUtPmxvY2spOworCXJjID0gY2hhcnF1ZXVlX2RlcXVldWVfMShjaGFycXVldWUpOworCXNwaW5fdW5sb2NrKCZjaGFycXVldWUtPmxvY2spOworCXJldHVybiByYzsKK30KKworCisKK2ludCB2aXNvcl9jaGFycXVldWVfZGVxdWV1ZV9uKENIQVJRVUVVRSAqY2hhcnF1ZXVlLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuKQoreworCWludCByYywgY291bnRlciA9IDAsIGM7CisKKwlzcGluX2xvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJZm9yICg7OykgeworCQlpZiAobiA8PSAwKQorCQkJYnJlYWs7ICAvKiBubyBtb3JlIGJ1ZmZlciBzcGFjZSAqLworCQljID0gY2hhcnF1ZXVlX2RlcXVldWVfMShjaGFycXVldWUpOworCQlpZiAoYyA8IDApCisJCQlicmVhazsgIC8qIG5vIG1vcmUgaW5wdXQgKi8KKwkJKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyKShjKTsKKwkJYnVmKys7CisJCW4tLTsKKwkJY291bnRlcisrOworCX0KKwlyYyA9IGNvdW50ZXI7CisJc3Bpbl91bmxvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfY2hhcnF1ZXVlX2RlcXVldWVfbik7CisKKworCit2b2lkIHZpc29yX2NoYXJxdWV1ZV9kZXN0cm95KENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCWlmIChjaGFycXVldWUgPT0gTlVMTCkKKwkJcmV0dXJuOworCWtmcmVlKGNoYXJxdWV1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9jaGFycXVldWVfZGVzdHJveSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2NoYXJxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmFlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuaApAQCAtMCwwICsxLDM3IEBACisvKiBjaGFycXVldWUuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0NIQVJRVUVVRV9IX18KKyNkZWZpbmUgX19DSEFSUVVFVUVfSF9fCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKworLyogQ0hBUlFVRVVFIGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdG8gdXNlcnMuCisgKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBDSEFSUVVFVUVfVGFnIENIQVJRVUVVRTsKKworQ0hBUlFVRVVFICp2aXNvcl9jaGFycXVldWVfY3JlYXRlKHVsb25nIG5zbG90cyk7Cit2b2lkIHZpc29yX2NoYXJxdWV1ZV9lbnF1ZXVlKENIQVJRVUVVRSAqY2hhcnF1ZXVlLCB1bnNpZ25lZCBjaGFyIGMpOworaW50IGNoYXJxdWV1ZV9kZXF1ZXVlKENIQVJRVUVVRSAqY2hhcnF1ZXVlKTsKK2ludCB2aXNvcl9jaGFycXVldWVfZGVxdWV1ZV9uKENIQVJRVUVVRSAqY2hhcnF1ZXVlLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuKTsKK0JPT0wgdmlzb3JfY2hhcnF1ZXVlX2lzX2VtcHR5KENIQVJRVUVVRSAqY2hhcnF1ZXVlKTsKK3ZvaWQgdmlzb3JfY2hhcnF1ZXVlX2Rlc3Ryb3koQ0hBUlFVRVVFICpjaGFycXVldWUpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvZWFzeXByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiNmI4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMKQEAgLTAsMCArMSwzNzEgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgSGFuZGxlIHByb2Nmcy1zcGVjaWZpYyB0YXNrcy4KKyAqICBOb3RlIHRoYXQgdGhpcyBmaWxlIGRvZXMgbm90IGtub3cgYWJvdXQgYW55IG1vZHVsZS1zcGVjaWZpYyB0aGluZ3MsIG5vcgorICogIGRvZXMgaXQga25vdyBhbnl0aGluZyBhYm91dCB3aGF0IGluZm9ybWF0aW9uIHRvIHJldmVhbCBhcyBwYXJ0IG9mIHRoZSBwcm9jCisgKiAgZW50cmllcy4gIFRoZSAyIGZ1bmN0aW9ucyB0aGF0IHRha2UgY2FyZSBvZiBkaXNwbGF5aW5nIGRldmljZSBhbmQKKyAqICBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRvCisgKiAgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcigpLgorICoKKyAqICAgICAgdm9pZCBzaG93X2RldmljZV9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpwKTsKKyAqICAgICAgdm9pZCBzaG93X2RyaXZlcl9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKKyAqCisgKiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gc2hvd19kZXZpY2VfaW5mbyBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhlCisgKiAgZGV2aWNlLXNwZWNpZmljIGluZm8gdG8gc2hvdy4gIEl0IGlzIHRoZSBjb250ZXh0IHRoYXQgd2FzIG9yaWdpbmFsbHkKKyAqICBwYXNzZWQgdG8gdmlzb3JfZWFzeXByb2NfSW5pdERldmljZSgpLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAiZWFzeXByb2MuaCIKKworI2RlZmluZSBNWURSVk5BTUUgImVhc3lwcm9jIgorCisKKworLyoKKyAqICAgL3Byb2MvPFByb2NJZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jRGlyCisgKiAgIC9wcm9jLzxQcm9jSWQ+L2RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgUHJvY0RyaXZlckRpcgorICogICAvcHJvYy88UHJvY0lkPi9kcml2ZXIvZGlhZyAgICAgICAgICAgICAgICAgIFByb2NEcml2ZXJEaWFnRmlsZQorICogICAvcHJvYy88UHJvY0lkPi9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgIFByb2NEZXZpY2VEaXIKKyAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlLzAgICAgICAgICAgICAgICAgICAgICBwcm9jRGV2aWNleERpcgorICogICAvcHJvYy88UHJvY0lkPi9kZXZpY2UvMC9kaWFnICAgICAgICAgICAgICAgIHByb2NEZXZpY2V4RGlhZ0ZpbGUKKyAqLworCisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RyaXZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKKwljcmVhdGVQcm9jRGlyKGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IHByb2NfbWtkaXJfbW9kZShuYW1lLCBTX0lGRElSLCBwYXJlbnQpOworCWlmIChwID09IE5VTEwpCisJCUVSUkRSVigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYyBkaXJlY3RvcnkgJXMiLCBuYW1lKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBzZXFfc2hvd19kcml2ZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitzdGF0aWMgaW50IHByb2Nfb3Blbl9kcml2ZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93X2RyaXZlciwgUERFX0RBVEEoaW5vZGUpKTsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZm9wc19kcml2ZXIgPSB7CisJLm9wZW4gPSBwcm9jX29wZW5fZHJpdmVyLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gcHJvY193cml0ZV9kcml2ZXIsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2Uoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitzdGF0aWMgaW50IHNlcV9zaG93X2RldmljZV9wcm9wZXJ0eShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK3N0YXRpYyBpbnQgcHJvY19vcGVuX2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2VxX3Nob3dfZGV2aWNlLCBQREVfREFUQShpbm9kZSkpOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzX2RldmljZSA9IHsKKwkub3BlbiA9IHByb2Nfb3Blbl9kZXZpY2UsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBwcm9jX3dyaXRlX2RldmljZSwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9Oworc3RhdGljIGludCBwcm9jX29wZW5fZGV2aWNlX3Byb3BlcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHksIFBERV9EQVRBKGlub2RlKSk7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHNfZGV2aWNlX3Byb3BlcnR5ID0geworCS5vcGVuID0gcHJvY19vcGVuX2RldmljZV9wcm9wZXJ0eSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKworCit2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXIoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJICAgICAgIGNoYXIgKnByb2NJZCwKKwkJCSAgICAgICB2b2lkICgqc2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICopLAorCQkJICAgICAgIHZvaWQgKCpzaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKKwkJCQkJCQl2b2lkICopKQoreworCW1lbXNldChwZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvKSk7CisJcGRyaXZlci0+UHJvY0lkID0gcHJvY0lkOworCWlmIChwZHJpdmVyLT5Qcm9jSWQgPT0gTlVMTCkKKwkJRVJSRFJWKCJQcm9jSWQgY2Fubm90IGJlIE5VTEwgKHRyb3VibGUgYWhlYWQpISIpOworCXBkcml2ZXItPlNob3dfZHJpdmVyX2luZm8gPSBzaG93X2RyaXZlcl9pbmZvOworCXBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8gPSBzaG93X2RldmljZV9pbmZvOworCWlmIChwZHJpdmVyLT5Qcm9jRGlyID09IE5VTEwpCisJCXBkcml2ZXItPlByb2NEaXIgPSBjcmVhdGVQcm9jRGlyKHBkcml2ZXItPlByb2NJZCwgTlVMTCk7CisJaWYgKChwZHJpdmVyLT5Qcm9jRGlyICE9IE5VTEwpICYmIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyID09IE5VTEwpKQorCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyID0gY3JlYXRlUHJvY0RpcigiZHJpdmVyIiwKKwkJCQkJCSAgICAgICBwZHJpdmVyLT5Qcm9jRGlyKTsKKwlpZiAoKHBkcml2ZXItPlByb2NEaXIgIT0gTlVMTCkgJiYgKHBkcml2ZXItPlByb2NEZXZpY2VEaXIgPT0gTlVMTCkpCisJCXBkcml2ZXItPlByb2NEZXZpY2VEaXIgPSBjcmVhdGVQcm9jRGlyKCJkZXZpY2UiLAorCQkJCQkJICAgICAgIHBkcml2ZXItPlByb2NEaXIpOworCWlmICgocGRyaXZlci0+UHJvY0RyaXZlckRpciAhPSBOVUxMKSAmJgorCSAgICAocGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlID09IE5VTEwpKSB7CisJCXBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9CisJCQlwcm9jX2NyZWF0ZV9kYXRhKCJkaWFnIiwgMCwKKwkJCQkJIHBkcml2ZXItPlByb2NEcml2ZXJEaXIsCisJCQkJCSAmcHJvY19mb3BzX2RyaXZlciwgcGRyaXZlcik7CisJCWlmIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPT0gTlVMTCkKKwkJCUVSUkRSVigiZmFpbGVkIHRvIHJlZ2lzdGVyIC9wcm9jLyVzL2RyaXZlci9kaWFnIGVudHJ5IiwKKwkJCSAgICAgICBwZHJpdmVyLT5Qcm9jSWQpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXIpOworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyRXgoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJCSBjaGFyICpwcm9jSWQsCisJCQkJIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCisJCQkJIHZvaWQgKCpzaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKKwkJCQkJCQkgIHZvaWQgKiksCisJCQkJIHZvaWQgKCp3cml0ZV9kcml2ZXJfaW5mbykoY2hhciAqYnVmLAorCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKKwkJCQkJCQkgICBsb2ZmX3QgKnBwb3MpLAorCQkJCSB2b2lkICgqd3JpdGVfZGV2aWNlX2luZm8pKGNoYXIgKmJ1ZiwKKwkJCQkJCQkgICBzaXplX3QgY291bnQsCisJCQkJCQkJICAgbG9mZl90ICpwcG9zLAorCQkJCQkJCSAgIHZvaWQgKnApKQoreworCXZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXIocGRyaXZlciwgcHJvY0lkLAorCQkJCSAgc2hvd19kcml2ZXJfaW5mbywgc2hvd19kZXZpY2VfaW5mbyk7CisJcGRyaXZlci0+V3JpdGVfZHJpdmVyX2luZm8gPSB3cml0ZV9kcml2ZXJfaW5mbzsKKwlwZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbyA9IHdyaXRlX2RldmljZV9pbmZvOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfSW5pdERyaXZlckV4KTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcikKK3sKKwlpZiAocGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlICE9IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRpYWciLCBwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyKTsKKwkJcGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlID0gTlVMTDsKKwl9CisJaWYgKHBkcml2ZXItPlByb2NEcml2ZXJEaXIgIT0gTlVMTCkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyIiwgcGRyaXZlci0+UHJvY0Rpcik7CisJCXBkcml2ZXItPlByb2NEcml2ZXJEaXIgPSBOVUxMOworCX0KKwlpZiAocGRyaXZlci0+UHJvY0RldmljZURpciAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkZXZpY2UiLCBwZHJpdmVyLT5Qcm9jRGlyKTsKKwkJcGRyaXZlci0+UHJvY0RldmljZURpciA9IE5VTEw7CisJfQorCWlmIChwZHJpdmVyLT5Qcm9jRGlyICE9IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocGRyaXZlci0+UHJvY0lkLCBOVUxMKTsKKwkJcGRyaXZlci0+UHJvY0RpciA9IE5VTEw7CisJfQorCXBkcml2ZXItPlByb2NJZCA9IE5VTEw7CisJcGRyaXZlci0+U2hvd19kcml2ZXJfaW5mbyA9IE5VTEw7CisJcGRyaXZlci0+U2hvd19kZXZpY2VfaW5mbyA9IE5VTEw7CisJcGRyaXZlci0+V3JpdGVfZHJpdmVyX2luZm8gPSBOVUxMOworCXBkcml2ZXItPldyaXRlX2RldmljZV9pbmZvID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0RlSW5pdERyaXZlcik7CisKKworCit2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJICAgICAgIHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwgaW50IGRldm5vLAorCQkJICAgICAgIHZvaWQgKmRldmRhdGEpCit7CisJaWYgKChwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyICE9IE5VTEwpICYmIChwLT5wcm9jRGV2aWNleERpciA9PSBOVUxMKSkgeworCQljaGFyIHNbMjldOworCQlzcHJpbnRmKHMsICIlZCIsIGRldm5vKTsKKwkJcC0+cHJvY0RldmljZXhEaXIgPSBjcmVhdGVQcm9jRGlyKHMsIHBkcml2ZXItPlByb2NEZXZpY2VEaXIpOworCQlwLT5kZXZubyA9IGRldm5vOworCX0KKwlwLT5kZXZkYXRhID0gZGV2ZGF0YTsKKwlwLT5wZHJpdmVyID0gcGRyaXZlcjsKKwlwLT5kZXZubyA9IGRldm5vOworCWlmICgocC0+cHJvY0RldmljZXhEaXIgIT0gTlVMTCkgJiYgKHAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgPT0gTlVMTCkpIHsKKwkJcC0+cHJvY0RldmljZXhEaWFnRmlsZSA9CisJCQlwcm9jX2NyZWF0ZV9kYXRhKCJkaWFnIiwgMCwgcC0+cHJvY0RldmljZXhEaXIsCisJCQkJCSAmcHJvY19mb3BzX2RldmljZSwgcCk7CisJCWlmIChwLT5wcm9jRGV2aWNleERpYWdGaWxlID09IE5VTEwpCisJCQlFUlJERVZYKGRldm5vLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIC9wcm9jLyVzL2RldmljZS8lZC9kaWFnIGVudHJ5IiwKKwkJCQlwZHJpdmVyLT5Qcm9jSWQsIGRldm5vCisJCQkgICAgICAgKTsKKwl9CisJbWVtc2V0KCYocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9bMF0pLCAwLAorCSAgICAgICBzaXplb2YocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0luaXREZXZpY2UpOworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19DcmVhdGVEZXZpY2VQcm9wZXJ0eShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsCisJCQkJCSB2b2lkICgqc2hvd19wcm9wZXJ0eV9pbmZvKQorCQkJCQkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopLAorCQkJCQkgY2hhciAqcHJvcGVydHlfbmFtZSkKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnB4ID0gTlVMTDsKKworCWlmIChwLT5wcm9jRGV2aWNleERpciA9PSBOVUxMKSB7CisJCUVSUkRSVigic3RhdGUgZXJyb3IiKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwLT5kZXZpY2VfcHJvcGVydHlfaW5mbyk7IGkrKykgeworCQlpZiAocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0ucHJvY0VudHJ5ID09IE5VTEwpIHsKKwkJCXB4ID0gJihwLT5kZXZpY2VfcHJvcGVydHlfaW5mb1tpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIXB4KSB7CisJCUVSUkRFVlgocC0+ZGV2bm8sICJ0b28gbWFueSBkZXZpY2UgcHJvcGVydGllcyIpOworCQlyZXR1cm47CisJfQorCXB4LT5kZXZkYXRhID0gcC0+ZGV2ZGF0YTsKKwlweC0+cGRyaXZlciA9IHAtPnBkcml2ZXI7CisJcHgtPnByb2NFbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEocHJvcGVydHlfbmFtZSwgMCwgcC0+cHJvY0RldmljZXhEaXIsCisJCQkJCSAmcHJvY19mb3BzX2RldmljZV9wcm9wZXJ0eSwgcHgpOworCWlmIChzdHJsZW4ocHJvcGVydHlfbmFtZSkrMSA+IHNpemVvZihweC0+cHJvcGVydHlfbmFtZSkpIHsKKwkJRVJSREVWWChwLT5kZXZubywgImRldmljZSBwcm9wZXJ0eSBuYW1lICVzIHRvbyBsb25nIiwKKwkJCXByb3BlcnR5X25hbWUpOworCQlyZXR1cm47CisJfQorCXN0cmNweShweC0+cHJvcGVydHlfbmFtZSwgcHJvcGVydHlfbmFtZSk7CisJaWYgKHB4LT5wcm9jRW50cnkgPT0gTlVMTCkgeworCQlFUlJERVZYKHAtPmRldm5vLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIC9wcm9jLyVzL2RldmljZS8lZC8lcyBlbnRyeSIsCisJCQlwLT5wZHJpdmVyLT5Qcm9jSWQsIHAtPmRldm5vLCBwcm9wZXJ0eV9uYW1lCisJCSAgICAgICApOworCQlyZXR1cm47CisJfQorCXB4LT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvID0gc2hvd19wcm9wZXJ0eV9pbmZvOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkpOworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJCSBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubykKK3sKKwlzaXplX3QgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwLT5kZXZpY2VfcHJvcGVydHlfaW5mbyk7IGkrKykgeworCQlpZiAocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0ucHJvY0VudHJ5ICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfcHJvcGVydHlfaW5mbyAqcHggPQorCQkJCSYocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0pOworCQkJcmVtb3ZlX3Byb2NfZW50cnkocHgtPnByb3BlcnR5X25hbWUsIHAtPnByb2NEZXZpY2V4RGlyKTsKKwkJCXB4LT5wcm9jRW50cnkgPSBOVUxMOworCQl9CisJfQorCWlmIChwLT5wcm9jRGV2aWNleERpYWdGaWxlICE9IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRpYWciLCBwLT5wcm9jRGV2aWNleERpcik7CisJCXAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgPSBOVUxMOworCX0KKwlpZiAocC0+cHJvY0RldmljZXhEaXIgIT0gTlVMTCkgeworCQljaGFyIHNbMjldOworCQlzcHJpbnRmKHMsICIlZCIsIGRldm5vKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocywgcGRyaXZlci0+UHJvY0RldmljZURpcik7CisJCXAtPnByb2NEZXZpY2V4RGlyID0gTlVMTDsKKwl9CisJcC0+ZGV2ZGF0YSA9IE5VTEw7CisJcC0+cGRyaXZlciA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19EZUluaXREZXZpY2UpOworCisKKworc3RhdGljIGludCBzZXFfc2hvd19kcml2ZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnAgPQorCQkoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICopKHNlcS0+cHJpdmF0ZSk7CisJaWYgKCFwKQorCQlyZXR1cm4gMDsKKwkoKihwLT5TaG93X2RyaXZlcl9pbmZvKSkoc2VxKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZGV2aWNlKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwID0KKwkJKHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqKShzZXEtPnByaXZhdGUpOworCWlmICgoIXApIHx8ICghKHAtPnBkcml2ZXIpKSkKKwkJcmV0dXJuIDA7CisJKCoocC0+cGRyaXZlci0+U2hvd19kZXZpY2VfaW5mbykpKHNlcSwgcC0+ZGV2ZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHNlcV9zaG93X2RldmljZV9wcm9wZXJ0eShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfcHJvcGVydHlfaW5mbyAqcCA9CisJCShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoKCFwKSB8fCAoIShwLT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKSkpCisJCXJldHVybiAwOworCSgqKHAtPnNob3dfZGV2aWNlX3Byb3BlcnR5X2luZm8pKShzZXEsIHAtPmRldmRhdGEpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZV9kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnAgPSBOVUxMOworCWNoYXIgbG9jYWxfYnVmWzI1Nl07CisJaWYgKHNlcSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlwID0gKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOworCWlmICgoIXApIHx8ICghKHAtPldyaXRlX2RyaXZlcl9pbmZvKSkpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+PSBzaXplb2YobG9jYWxfYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKGxvY2FsX2J1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWxvY2FsX2J1Zltjb3VudF0gPSAnXDAnOyAgLyogYmUgZnJpZW5kbHkgKi8KKwkoKihwLT5Xcml0ZV9kcml2ZXJfaW5mbykpKGxvY2FsX2J1ZiwgY291bnQsIHBwb3MpOworCXJldHVybiBjb3VudDsKK30KKworCisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwID0gTlVMTDsKKwljaGFyIGxvY2FsX2J1ZlsyNTZdOworCWlmIChzZXEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcCA9IChzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoKCFwKSB8fCAoIShwLT5wZHJpdmVyKSkgfHwgKCEocC0+cGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8pKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID49IHNpemVvZihsb2NhbF9idWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoY29weV9mcm9tX3VzZXIobG9jYWxfYnVmLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbG9jYWxfYnVmW2NvdW50XSA9ICdcMCc7ICAvKiBiZSBmcmllbmRseSAqLworCSgqKHAtPnBkcml2ZXItPldyaXRlX2RldmljZV9pbmZvKSkobG9jYWxfYnVmLCBjb3VudCwgcHBvcywgcC0+ZGV2ZGF0YSk7CisJcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvZWFzeXByb2MuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlZjFmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmgKQEAgLTAsMCArMSw5MiBAQAorLyogZWFzeXByb2MuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoqIEBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlcyBuZWNlc3NhcnkgZm9yIGEgc2ltcGxlIC9wcm9jIGZpbGUKKyAqICBpbXBsZW1lbnRhdGlvbiBmb3IgYSBkcml2ZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19FQVNZUFJPQ19IX18KKyNkZWZpbmUgX19FQVNZUFJPQ19IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKworc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvIHsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEaXI7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRHJpdmVyRGlyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqUHJvY0RyaXZlckRpYWdGaWxlOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqUHJvY0RldmljZURpcjsKKwljaGFyICpQcm9jSWQ7CisJdm9pZCAoKlNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpwKTsKKwl2b2lkICgqU2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICpzZXEpOworCXZvaWQgKCpXcml0ZV9kZXZpY2VfaW5mbykoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJICBsb2ZmX3QgKnBwb3MsIHZvaWQgKnApOworCXZvaWQgKCpXcml0ZV9kcml2ZXJfaW5mbykoY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Cit9OworCisvKiBwcm9wZXJ0eSBpcyBhIGZpbGUgdW5kZXIgL3Byb2MvPHg+L2RldmljZS88eD4vPHByb3BlcnR5X25hbWU+ICovCitzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8geworCWNoYXIgcHJvcGVydHlfbmFtZVsyNV07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRW50cnk7CisJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyOworCXZvaWQgKmRldmRhdGE7CisJdm9pZCAoKnNob3dfZGV2aWNlX3Byb3BlcnR5X2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpwKTsKK307CisKK3N0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyB7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRGV2aWNleERpcjsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEZXZpY2V4RGlhZ0ZpbGU7CisJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyOworCXZvaWQgKmRldmRhdGE7CisJaW50IGRldm5vOworCS8qICBhbGxvdyBmb3IgYSBudW1iZXIgb2YgY3VzdG9tIHByb3BlcnRpZXMgZm9yIGVhY2ggZGV2aWNlOiAqLworCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfcHJvcGVydHlfaW5mbyBkZXZpY2VfcHJvcGVydHlfaW5mb1sxMF07Cit9OworCit2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJICAgICAgIHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwgaW50IGRldm5vLAorCQkJICAgICAgIHZvaWQgKmRldmRhdGEpOwordm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJCSBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubyk7Cit2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXIoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAorCQkJICAgICAgIGNoYXIgKnByb2NJZCwKKwkJCSAgICAgICB2b2lkICgqc2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICopLAorCQkJICAgICAgIHZvaWQgKCpzaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKKwkJCQkJCQl2b2lkICopKTsKK3ZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlckV4KHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgY2hhciAqcHJvY0lkLAorCQkJCSB2b2lkICgqc2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICopLAorCQkJCSB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJICB2b2lkICopLAorCQkJCSB2b2lkICgqV3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1ZiwKKwkJCQkJCQkgICBzaXplX3QgY291bnQsCisJCQkJCQkJICAgbG9mZl90ICpwcG9zKSwKKwkJCQkgdm9pZCAoKldyaXRlX2RldmljZV9pbmZvKShjaGFyICpidWYsCisJCQkJCQkJICAgc2l6ZV90IGNvdW50LAorCQkJCQkJCSAgIGxvZmZfdCAqcHBvcywKKwkJCQkJCQkgICB2b2lkICpwKSk7Cit2b2lkIHZpc29yX2Vhc3lwcm9jX0RlSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIpOwordm9pZCB2aXNvcl9lYXN5cHJvY19DcmVhdGVEZXZpY2VQcm9wZXJ0eShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsCisJCQkJCSB2b2lkICgqc2hvd19wcm9wZXJ0eV9pbmZvKQorCQkJCQkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopLAorCQkJCQkgY2hhciAqcHJvcGVydHlfbmFtZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9tZW1yZWdpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjEyMmRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLyogbWVtcmVnaW9uLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NRU1SRUdJT05fSF9fCisjZGVmaW5lIF9fTUVNUkVHSU9OX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKworLyogTUVNUkVHSU9OIGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdG8gdXNlcnMuCisgKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBNRU1SRUdJT05fVGFnIE1FTVJFR0lPTjsKKworTUVNUkVHSU9OICp2aXNvcl9tZW1yZWdpb25fY3JlYXRlKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBuYnl0ZXMpOworTUVNUkVHSU9OICp2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQoTUVNUkVHSU9OICpwYXJlbnQsCisJCQkJCSAgICAgdWxvbmcgb2Zmc2V0LCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yX21lbXJlZ2lvbl9yZXNpemUoTUVNUkVHSU9OICptZW1yZWdpb24sIHVsb25nIG5ld3NpemUpOworaW50IHZpc29yX21lbXJlZ2lvbl9yZWFkKE1FTVJFR0lPTiAqbWVtcmVnaW9uLAorCQkgICB1bG9uZyBvZmZzZXQsIHZvaWQgKmRlc3QsIHVsb25nIG5ieXRlcyk7CitpbnQgdmlzb3JfbWVtcmVnaW9uX3dyaXRlKE1FTVJFR0lPTiAqbWVtcmVnaW9uLAorCQkJICB1bG9uZyBvZmZzZXQsIHZvaWQgKnNyYywgdWxvbmcgbmJ5dGVzKTsKK3ZvaWQgdmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3koTUVNUkVHSU9OICptZW1yZWdpb24pOworSE9TVEFERFJFU1Mgdmlzb3JfbWVtcmVnaW9uX2dldF9waHlzYWRkcihNRU1SRUdJT04gKm1lbXJlZ2lvbik7Cit1bG9uZyB2aXNvcl9tZW1yZWdpb25fZ2V0X25ieXRlcyhNRU1SRUdJT04gKm1lbXJlZ2lvbik7Cit2b2lkIG1lbXJlZ2lvbl9kdW1wKE1FTVJFR0lPTiAqbWVtcmVnaW9uLCBjaGFyICpzLAorCQkgICAgdWxvbmcgb2ZmLCB1bG9uZyBsZW4sIHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKK3ZvaWQgKnZpc29yX21lbXJlZ2lvbl9nZXRfcG9pbnRlcihNRU1SRUdJT04gKm1lbXJlZ2lvbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uX2RpcmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uX2RpcmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTA2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9tZW1yZWdpb25fZGlyZWN0LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIG1lbXJlZ2lvbl9kaXJlY3QuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyoKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIG1lbW9yeSByZWdpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVhZC93cml0ZQorICogIGNoYW5uZWwgbWVtb3J5IChpbiBtYWluIG1lbW9yeSBvZiB0aGUgaG9zdCBzeXN0ZW0pIGZyb20gY29kZSBydW5uaW5nIGluCisgKiAgYSB2aXJ0dWFsIHBhcnRpdGlvbi4KKyAqLworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgIm1lbXJlZ2lvbi5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAibWVtcmVnaW9uIgorCitzdHJ1Y3QgTUVNUkVHSU9OX1RhZyB7CisJSE9TVEFERFJFU1MgcGh5c2FkZHI7CisJdWxvbmcgbmJ5dGVzOworCXZvaWQgKm1hcHBlZDsKKwlCT09MIHJlcXVlc3RlZDsKKwlCT09MIG92ZXJsYXBwZWQ7Cit9OworCitzdGF0aWMgQk9PTCBtYXBpdChNRU1SRUdJT04gKm1lbXJlZ2lvbik7CitzdGF0aWMgdm9pZCB1bm1hcGl0KE1FTVJFR0lPTiAqbWVtcmVnaW9uKTsKKworTUVNUkVHSU9OICoKK3Zpc29yX21lbXJlZ2lvbl9jcmVhdGUoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIG5ieXRlcykKK3sKKwlNRU1SRUdJT04gKnJjID0gTlVMTDsKKwlNRU1SRUdJT04gKm1lbXJlZ2lvbiA9IGt6YWxsb2Moc2l6ZW9mKE1FTVJFR0lPTiksCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAobWVtcmVnaW9uID09IE5VTEwpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fY3JlYXRlIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1yZWdpb24tPnBoeXNhZGRyID0gcGh5c2FkZHI7CisJbWVtcmVnaW9uLT5uYnl0ZXMgPSBuYnl0ZXM7CisJbWVtcmVnaW9uLT5vdmVybGFwcGVkID0gRkFMU0U7CisJaWYgKCFtYXBpdChtZW1yZWdpb24pKSB7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwlyYyA9IG1lbXJlZ2lvbjsKK0F3YXk6CisJaWYgKHJjID09IE5VTEwpIHsKKwkJaWYgKG1lbXJlZ2lvbiAhPSBOVUxMKSB7CisJCQl2aXNvcl9tZW1yZWdpb25fZGVzdHJveShtZW1yZWdpb24pOworCQkJbWVtcmVnaW9uID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fY3JlYXRlKTsKKworTUVNUkVHSU9OICoKK3Zpc29yX21lbXJlZ2lvbl9jcmVhdGVfb3ZlcmxhcHBlZChNRU1SRUdJT04gKnBhcmVudCwgdWxvbmcgb2Zmc2V0LCB1bG9uZyBuYnl0ZXMpCit7CisJTUVNUkVHSU9OICptZW1yZWdpb24gPSBOVUxMOworCisJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgcGFyZW50IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAocGFyZW50LT5tYXBwZWQgPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIHBhcmVudCBpcyBub3QgbWFwcGVkISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgob2Zmc2V0ID49IHBhcmVudC0+bmJ5dGVzKSB8fAorCSAgICAoKG9mZnNldCArIG5ieXRlcykgPj0gcGFyZW50LT5uYnl0ZXMpKSB7CisJCUVSUkRSVigiJXMgcmFuZ2UgKCVsdSwlbHUpIG91dCBvZiBwYXJlbnQgcmFuZ2UiLAorCQkgICAgICAgX19mdW5jX18sIG9mZnNldCwgbmJ5dGVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXJlZ2lvbiA9IGt6YWxsb2Moc2l6ZW9mKE1FTVJFR0lPTiksIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKG1lbXJlZ2lvbiA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXJlZ2lvbi0+cGh5c2FkZHIgPSBwYXJlbnQtPnBoeXNhZGRyICsgb2Zmc2V0OworCW1lbXJlZ2lvbi0+bmJ5dGVzID0gbmJ5dGVzOworCW1lbXJlZ2lvbi0+bWFwcGVkID0gKCh1OCAqKSAocGFyZW50LT5tYXBwZWQpKSArIG9mZnNldDsKKwltZW1yZWdpb24tPnJlcXVlc3RlZCA9IEZBTFNFOworCW1lbXJlZ2lvbi0+b3ZlcmxhcHBlZCA9IFRSVUU7CisJcmV0dXJuIG1lbXJlZ2lvbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX21lbXJlZ2lvbl9jcmVhdGVfb3ZlcmxhcHBlZCk7CisKKworc3RhdGljIEJPT0wKK21hcGl0KE1FTVJFR0lPTiAqbWVtcmVnaW9uKQoreworCXVsb25nIHBoeXNhZGRyID0gKHVsb25nKSAobWVtcmVnaW9uLT5waHlzYWRkcik7CisJdWxvbmcgbmJ5dGVzID0gbWVtcmVnaW9uLT5uYnl0ZXM7CisKKwltZW1yZWdpb24tPnJlcXVlc3RlZCA9IEZBTFNFOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNhZGRyLCBuYnl0ZXMsIE1ZRFJWTkFNRSkpCisJCUVSUkRSVigiY2Fubm90IHJlc2VydmUgY2hhbm5lbCBtZW1vcnkgQDB4JWx4IGZvciAweCVseC0tIG5vIGJpZyBkZWFsIiwgcGh5c2FkZHIsIG5ieXRlcyk7CisJZWxzZQorCQltZW1yZWdpb24tPnJlcXVlc3RlZCA9IFRSVUU7CisJbWVtcmVnaW9uLT5tYXBwZWQgPSBpb3JlbWFwX2NhY2hlKHBoeXNhZGRyLCBuYnl0ZXMpOworCWlmIChtZW1yZWdpb24tPm1hcHBlZCA9PSBOVUxMKSB7CisJCUVSUkRSVigiY2Fubm90IGlvcmVtYXBfY2FjaGUgY2hhbm5lbCBtZW1vcnkgQDB4JWx4IGZvciAweCVseCIsCisJCSAgICAgICBwaHlzYWRkciwgbmJ5dGVzKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3VubWFwaXQoTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJaWYgKG1lbXJlZ2lvbi0+bWFwcGVkICE9IE5VTEwpIHsKKwkJaW91bm1hcChtZW1yZWdpb24tPm1hcHBlZCk7CisJCW1lbXJlZ2lvbi0+bWFwcGVkID0gTlVMTDsKKwl9CisJaWYgKG1lbXJlZ2lvbi0+cmVxdWVzdGVkKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbigodWxvbmcpIChtZW1yZWdpb24tPnBoeXNhZGRyKSwKKwkJCQkgICBtZW1yZWdpb24tPm5ieXRlcyk7CisJCW1lbXJlZ2lvbi0+cmVxdWVzdGVkID0gRkFMU0U7CisJfQorfQorCitIT1NUQUREUkVTUwordmlzb3JfbWVtcmVnaW9uX2dldF9waHlzYWRkcihNRU1SRUdJT04gKm1lbXJlZ2lvbikKK3sKKwlyZXR1cm4gbWVtcmVnaW9uLT5waHlzYWRkcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIpOworCit1bG9uZwordmlzb3JfbWVtcmVnaW9uX2dldF9uYnl0ZXMoTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJcmV0dXJuIG1lbXJlZ2lvbi0+bmJ5dGVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2dldF9uYnl0ZXMpOworCit2b2lkICoKK3Zpc29yX21lbXJlZ2lvbl9nZXRfcG9pbnRlcihNRU1SRUdJT04gKm1lbXJlZ2lvbikKK3sKKwlyZXR1cm4gbWVtcmVnaW9uLT5tYXBwZWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fZ2V0X3BvaW50ZXIpOworCitpbnQKK3Zpc29yX21lbXJlZ2lvbl9yZXNpemUoTUVNUkVHSU9OICptZW1yZWdpb24sIHVsb25nIG5ld3NpemUpCit7CisJaWYgKG5ld3NpemUgPT0gbWVtcmVnaW9uLT5uYnl0ZXMpCisJCXJldHVybiAwOworCWlmIChtZW1yZWdpb24tPm92ZXJsYXBwZWQpCisJCS8qIG5vIGVycm9yIGNoZWNrIGhlcmUgLSB3ZSBubyBsb25nZXIga25vdyB0aGUKKwkJICogcGFyZW50J3MgcmFuZ2UhCisJCSAqLworCQltZW1yZWdpb24tPm5ieXRlcyA9IG5ld3NpemU7CisJZWxzZSB7CisJCXVubWFwaXQobWVtcmVnaW9uKTsKKwkJbWVtcmVnaW9uLT5uYnl0ZXMgPSBuZXdzaXplOworCQlpZiAoIW1hcGl0KG1lbXJlZ2lvbikpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX3Jlc2l6ZSk7CisKKworc3RhdGljIGludAorbWVtcmVnaW9uX3JlYWR3cml0ZShCT09MIGlzX3dyaXRlLAorCQkgICAgTUVNUkVHSU9OICptZW1yZWdpb24sIHVsb25nIG9mZnNldCwKKwkJICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpCit7CisJaWYgKG9mZnNldCArIG5ieXRlcyA+IG1lbXJlZ2lvbi0+bmJ5dGVzKSB7CisJCUVSUkRSVigibWVtcmVnaW9uX3JlYWR3cml0ZSBvZmZzZXQgb3V0IG9mIHJhbmdlISEiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChpc193cml0ZSkKKwkJbWVtY3B5X3RvaW8obWVtcmVnaW9uLT5tYXBwZWQgKyBvZmZzZXQsIGxvY2FsLCBuYnl0ZXMpOworCWVsc2UKKwkJbWVtY3B5X2Zyb21pbyhsb2NhbCwgbWVtcmVnaW9uLT5tYXBwZWQgKyBvZmZzZXQsIG5ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit2aXNvcl9tZW1yZWdpb25fcmVhZChNRU1SRUdJT04gKm1lbXJlZ2lvbiwgdWxvbmcgb2Zmc2V0LCB2b2lkICpkZXN0LAorCQkgICAgIHVsb25nIG5ieXRlcykKK3sKKwlyZXR1cm4gbWVtcmVnaW9uX3JlYWR3cml0ZShGQUxTRSwgbWVtcmVnaW9uLCBvZmZzZXQsIGRlc3QsIG5ieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fcmVhZCk7CisKK2ludAordmlzb3JfbWVtcmVnaW9uX3dyaXRlKE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBvZmZzZXQsIHZvaWQgKnNyYywKKwkJICAgICAgdWxvbmcgbmJ5dGVzKQoreworCXJldHVybiBtZW1yZWdpb25fcmVhZHdyaXRlKFRSVUUsIG1lbXJlZ2lvbiwgb2Zmc2V0LCBzcmMsIG5ieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fd3JpdGUpOworCit2b2lkCit2aXNvcl9tZW1yZWdpb25fZGVzdHJveShNRU1SRUdJT04gKm1lbXJlZ2lvbikKK3sKKwlpZiAobWVtcmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoIW1lbXJlZ2lvbi0+b3ZlcmxhcHBlZCkKKwkJdW5tYXBpdChtZW1yZWdpb24pOworCWtmcmVlKG1lbXJlZ2lvbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fZGVzdHJveSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3BlcmlvZGljX3dvcmsuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3BlcmlvZGljX3dvcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjcwYTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcGVyaW9kaWNfd29yay5jCkBAIC0wLDAgKzEsMjM2IEBACisvKiBwZXJpb2RpY193b3JrLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgSGVscGVyIGZ1bmN0aW9ucyB0byBzY2hlZHVsZSBwZXJpb2RpYyB3b3JrIGluIExpbnV4IGtlcm5lbCBtb2RlLgorICovCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJwZXJpb2RpY193b3JrLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJwZXJpb2RpY193b3JrIgorCisKKworc3RydWN0IFBFUklPRElDX1dPUktfVGFnIHsKKwlyd2xvY2tfdCBsb2NrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwl2b2lkICgqd29ya2Z1bmMpKHZvaWQgKik7CisJdm9pZCAqd29ya2Z1bmNhcmc7CisJQk9PTCBpc19zY2hlZHVsZWQ7CisJQk9PTCB3YW50X3RvX3N0b3A7CisJdWxvbmcgamlmZnlfaW50ZXJ2YWw7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwljb25zdCBjaGFyICpkZXZuYW07Cit9OworCisKKworc3RhdGljIHZvaWQgcGVyaW9kaWNfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlQRVJJT0RJQ19XT1JLICpwZXJpb2RpY193b3JrID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBQRVJJT0RJQ19XT1JLX1RhZywgd29yay53b3JrKTsKKwkoKnBlcmlvZGljX3dvcmstPndvcmtmdW5jKShwZXJpb2RpY193b3JrLT53b3JrZnVuY2FyZyk7Cit9CisKKworCitQRVJJT0RJQ19XT1JLICp2aXNvcl9wZXJpb2RpY193b3JrX2NyZWF0ZSh1bG9uZyBqaWZmeV9pbnRlcnZhbCwKKwkJCQkJICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlLAorCQkJCQkgIHZvaWQgKCp3b3JrZnVuYykodm9pZCAqKSwKKwkJCQkJICB2b2lkICp3b3JrZnVuY2FyZywKKwkJCQkJICBjb25zdCBjaGFyICpkZXZuYW0pCit7CisJUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayA9IGt6YWxsb2Moc2l6ZW9mKFBFUklPRElDX1dPUkspLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChwZXJpb2RpY193b3JrID09IE5VTEwpIHsKKwkJRVJSRFJWKCJwZXJpb2RpY193b3JrIGFsbG9jYXRpb24gZmFpbGVkICIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcndsb2NrX2luaXQoJnBlcmlvZGljX3dvcmstPmxvY2spOworCXBlcmlvZGljX3dvcmstPmppZmZ5X2ludGVydmFsID0gamlmZnlfaW50ZXJ2YWw7CisJcGVyaW9kaWNfd29yay0+d29ya3F1ZXVlID0gd29ya3F1ZXVlOworCXBlcmlvZGljX3dvcmstPndvcmtmdW5jID0gd29ya2Z1bmM7CisJcGVyaW9kaWNfd29yay0+d29ya2Z1bmNhcmcgPSB3b3JrZnVuY2FyZzsKKwlwZXJpb2RpY193b3JrLT5kZXZuYW0gPSBkZXZuYW07CisJcmV0dXJuIHBlcmlvZGljX3dvcms7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX2NyZWF0ZSk7CisKKworCit2b2lkIHZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveShQRVJJT0RJQ19XT1JLICpwZXJpb2RpY193b3JrKQoreworCWlmIChwZXJpb2RpY193b3JrID09IE5VTEwpCisJCXJldHVybjsKKwlrZnJlZShwZXJpb2RpY193b3JrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveSk7CisKKworCisvKiogQ2FsbCB0aGlzIGZyb20geW91ciBwZXJpb2RpYyB3b3JrIHdvcmtlciBmdW5jdGlvbiB0byBzY2hlZHVsZSB0aGUgbmV4dAorICogIGNhbGwuCisgKiAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIEZBTFNFLCB0aGVyZSB3YXMgYSBmYWlsdXJlIGFuZCB0aGUKKyAqICBwZXJpb2RpYyB3b3JrIGlzIG5vIGxvbmdlciBzY2hlZHVsZWQKKyAqLworQk9PTCB2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QoUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yaykKK3sKKwlCT09MIHJjID0gRkFMU0U7CisJd3JpdGVfbG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJaWYgKHBlcmlvZGljX3dvcmstPndhbnRfdG9fc3RvcCkgeworCQlwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQgPSBGQUxTRTsKKwkJcGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wID0gRkFMU0U7CisJCXJjID0gVFJVRTsgIC8qIHllcywgVFJVRTsgc2VlIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpICovCisJCWdvdG8gQXdheTsKKwl9IGVsc2UgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhwZXJpb2RpY193b3JrLT53b3JrcXVldWUsCisJCQkJICAgICAgJnBlcmlvZGljX3dvcmstPndvcmssCisJCQkJICAgICAgcGVyaW9kaWNfd29yay0+amlmZnlfaW50ZXJ2YWwpIDwgMCkgeworCQlFUlJERVYocGVyaW9kaWNfd29yay0+ZGV2bmFtLCAicXVldWVfZGVsYXllZF93b3JrIGZhaWxlZCEiKTsKKwkJcGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CisJCXJjID0gRkFMU0U7CisJCWdvdG8gQXdheTsKKwl9CisJcmMgPSBUUlVFOworQXdheToKKwl3cml0ZV91bmxvY2soJnBlcmlvZGljX3dvcmstPmxvY2spOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZCk7CisKKworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWZmIG5ldyBwZXJpb2RpYyB3b3JrIHdhcyBhY3R1YWxseSBzdGFydGVkLgorICogIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBGQUxTRSwgdGhlbiBubyB3b3JrIHdhcyBzdGFydGVkCisgKiAgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHN0YXJ0ZWQsIG9yIGJlY2F1c2Ugb2YgYSBmYWlsdXJlKS4KKyAqLworQk9PTCB2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspCit7CisJQk9PTCByYyA9IEZBTFNFOworCisJd3JpdGVfbG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJaWYgKHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCkgeworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3ApIHsKKwkJRVJSREVWKHBlcmlvZGljX3dvcmstPmRldm5hbSwKKwkJICAgICAgICJkZXZfc3RhcnRfcGVyaW9kaWNfd29yayBmYWlsZWQhIik7CisJCXJjID0gRkFMU0U7CisJCWdvdG8gQXdheTsKKwl9CisJSU5JVF9ERUxBWUVEX1dPUksoJnBlcmlvZGljX3dvcmstPndvcmssICZwZXJpb2RpY193b3JrX2Z1bmMpOworCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsocGVyaW9kaWNfd29yay0+d29ya3F1ZXVlLAorCQkJICAgICAgICZwZXJpb2RpY193b3JrLT53b3JrLAorCQkJICAgICAgIHBlcmlvZGljX3dvcmstPmppZmZ5X2ludGVydmFsKSA8IDApIHsKKwkJRVJSREVWKHBlcmlvZGljX3dvcmstPmRldm5hbSwKKwkJICAgICAgICIlcyBxdWV1ZV9kZWxheWVkX3dvcmsgZmFpbGVkISIsIF9fZnVuY19fKTsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBBd2F5OworCX0KKwlwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQgPSBUUlVFOworCXJjID0gVFJVRTsKK0F3YXk6CisJd3JpdGVfdW5sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlyZXR1cm4gcmM7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQpOworCisKKworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWZmIHlvdXIgY2FsbCBhY3R1YWxseSBzdG9wcGVkIHRoZSBwZXJpb2RpYworICogIHdvcmsuCisgKgorICogIC0tIFBBWSBBVFRFTlRJT04uLi4gdGhpcyBpcyBpbXBvcnRhbnQgLS0KKyAqCisgKiAgTk8gTk8gIzEKKyAqCisgKiAgICAgRG8gTk9UIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIHNvbWUgZnVuY3Rpb24gdGhhdCBpcyBydW5uaW5nIG9uIHRoZQorICogICAgIHNhbWUgd29ya3F1ZXVlIGFzIHRoZSB3b3JrIHlvdSBhcmUgdHJ5aW5nIHRvIHN0b3AgbWlnaHQgYmUgcnVubmluZworICogICAgIG9uISAgSWYgeW91IHZpb2xhdGUgdGhpcyBydWxlLCB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoKSBNSUdIVCB3b3JrLAorICogICAgIGJ1dCBpdCBhbHNvIE1JR0hUIGdldCBodW5nIHVwIGluIGFuIGluZmluaXRlIGxvb3Agc2F5aW5nCisgKiAgICAgIndhaXRpbmcgZm9yIGRlbGF5ZWQgd29yay4uLiIuICBUaGlzIHdpbGwgaGFwcGVuIGlmIHRoZSBkZWxheWVkIHdvcmsKKyAqICAgICB5b3UgYXJlIHRyeWluZyB0byBjYW5jZWwgaGFzIGJlZW4gcHV0IGluIHRoZSB3b3JrcXVldWUgbGlzdCwgYnV0IGNhbid0CisgKiAgICAgcnVuIHlldCBiZWNhdXNlIHdlIGFyZSBydW5uaW5nIHRoYXQgc2FtZSB3b3JrcXVldWUgdGhyZWFkIHJpZ2h0IG5vdy4KKyAqCisgKiAgICAgQm90dG9tIGxpbmU6IElmIHlvdSBuZWVkIHRvIGNhbGwgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKCkgZnJvbSBhCisgKiAgICAgd29ya2l0ZW0sIGJlIHN1cmUgdGhlIHdvcmtpdGVtIGlzIG9uIGEgRElGRkVSRU5UIHdvcmtxdWV1ZSB0aGFuIHRoZQorICogICAgIHdvcmtpdGVtIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gY2FuY2VsLgorICoKKyAqICAgICBJZiBJIGNvdWxkIGZpZ3VyZSBvdXQgc29tZSB3YXkgdG8gY2hlY2sgZm9yIHRoaXMgIm5vIG5vIiBjb25kaXRpb24gaW4KKyAqICAgICB0aGUgY29kZSwgSSB3b3VsZC4gIEl0IHdvdWxkIGhhdmUgc2F2ZWQgbWUgdGhlIHRyb3VibGUgb2Ygd3JpdGluZyB0aGlzCisgKiAgICAgbG9uZyBjb21tZW50LiAgQW5kIGFsc28sIGRvbid0IHRoaW5rIHRoaXMgaXMgc29tZSAidGhlb3JldGljYWwiIHJhY2UKKyAqICAgICBjb25kaXRpb24uICBJdCBpcyBSRUFMLCBhcyBJIGhhdmUgc3BlbnQgdGhlIGRheSBjaGFzaW5nIGl0LgorICoKKyAqICBOTyBOTyAjMgorICoKKyAqICAgICBUYWtlIGNsb3NlIG5vdGUgb2YgdGhlIGxvY2tzIHRoYXQgeW91IG93biB3aGVuIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKiAgICAgWW91IG11c3QgTk9UIG93biBhbnkgbG9ja3MgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBwZXJpb2RpYyB3b3JrCisgKiAgICAgZnVuY3Rpb24gdGhhdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLiAgSWYgeW91IERPLCBhIGRlYWRsb2NrIG1heSByZXN1bHQsCisgKiAgICAgYmVjYXVzZSBzdG9wcGluZyB0aGUgcGVyaW9kaWMgd29yayBvZnRlbiBpbnZvbHZlcyB3YWl0aW5nIGZvciB0aGUgbGFzdAorICogICAgIGl0ZXJhdGlvbiBvZiB0aGUgcGVyaW9kaWMgd29yayBmdW5jdGlvbiB0byBjb21wbGV0ZS4gIEFnYWluLCBpZiB5b3UgaGl0CisgKiAgICAgdGhpcyBkZWFkbG9jaywgeW91IHdpbGwgZ2V0IGh1bmcgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCBzYXlpbmcKKyAqICAgICAid2FpdGluZyBmb3IgZGVsYXllZCB3b3JrLi4uIi4KKyAqLworQk9PTCB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yaykKK3sKKwlCT09MIHN0b3BwZWRfc29tZXRoaW5nID0gRkFMU0U7CisKKwl3cml0ZV9sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlzdG9wcGVkX3NvbWV0aGluZyA9IHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCAmJgorCQkoIXBlcmlvZGljX3dvcmstPndhbnRfdG9fc3RvcCk7CisJd2hpbGUgKHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCkgeworCQlwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3AgPSBUUlVFOworCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmcGVyaW9kaWNfd29yay0+d29yaykpIHsKKwkJCS8qIFdlIGdldCBoZXJlIGlmIHRoZSBkZWxheWVkIHdvcmsgd2FzIHBlbmRpbmcgYXMKKwkJCSAqIGRlbGF5ZWQgd29yaywgYnV0IHdhcyBOT1QgcnVuLgorCQkJICovCisJCQlBU1NFUlQocGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkKTsKKwkJCXBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCA9IEZBTFNFOworCQl9IGVsc2UgeworCQkJLyogSWYgd2UgZ2V0IGhlcmUsIGVpdGhlciB0aGUgZGVsYXllZCB3b3JrOgorCQkJICogLSB3YXMgcnVuLCBPUiwKKwkJCSAqIC0gaXMgcnVubmluZyBSSUdIVCBOT1cgb24gYW5vdGhlciBwcm9jZXNzb3IsIE9SLAorCQkJICogLSB3YXNuJ3QgZXZlbiBzY2hlZHVsZWQgKHRoZXJlIGlzIGEgbWluaXNjdWxlCisJCQkgKiAgIHRpbWluZyB3aW5kb3cgd2hlcmUgdGhpcyBjb3VsZCBiZSB0aGUgY2FzZSkKKwkJCSAqIGZsdXNoX3dvcmtxdWV1ZSgpIHdvdWxkIG1ha2Ugc3VyZSBpdCBpcyBmaW5pc2hlZAorCQkJICogZXhlY3V0aW5nLCBidXQgdGhhdCBzdGlsbCBpc24ndCB2ZXJ5IHVzZWZ1bCwgd2hpY2gKKwkJCSAqIGV4cGxhaW5zIHRoZSBsb29wLi4uCisJCQkgKi8KKwkJfQorCQlpZiAocGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkKSB7CisJCQl3cml0ZV91bmxvY2soJnBlcmlvZGljX3dvcmstPmxvY2spOworCQkJV0FSTkRFVihwZXJpb2RpY193b3JrLT5kZXZuYW0sCisJCQkJIndhaXRpbmcgZm9yIGRlbGF5ZWQgd29yay4uLiIpOworCQkJLyogV2UgcmVseSBvbiB0aGUgZGVsYXllZCB3b3JrIGZ1bmN0aW9uIHJ1bm5pbmcgaGVyZSwKKwkJCSAqIGFuZCBldmVudHVhbGx5IGNhbGxpbmcKKwkJCSAqIHZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZCgpLAorCQkJICogd2hpY2ggd2lsbCBzZWUgdGhhdCB3YW50X3RvX3N0b3AgaXMgc2V0LCBhbmQKKwkJCSAqIHN1YnNlcXVlbnRseSBjbGVhciBpc19zY2hlZHVsZWQuCisJCQkgKi8KKwkJCVNMRUVQSklGRklFUygxMCk7CisJCQl3cml0ZV9sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwkJfSBlbHNlCisJCQlwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3AgPSBGQUxTRTsKKwl9CisJd3JpdGVfdW5sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlyZXR1cm4gc3RvcHBlZF9zb21ldGhpbmc7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcHJvY29iamVjdHRyZWUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Byb2NvYmplY3R0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhMTllMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Byb2NvYmplY3R0cmVlLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qIHByb2NvYmplY3R0cmVlLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJwcm9jb2JqZWN0dHJlZS5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAicHJvY29iamVjdHRyZWUiCisKKworCisvKiogVGhpcyBpcyBjb250ZXh0IGluZm8gdGhhdCB3ZSBzdGFzaCBpbiBlYWNoIC9wcm9jIGZpbGUgZW50cnksIHdoaWNoIHdlCisgKiAgbmVlZCBpbiBvcmRlciB0byBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHN1cHBsaWVzIHRoZSAvcHJvYyByZWFkCisgKiAgaW5mbyBmb3IgdGhhdCBmaWxlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICosIGludCk7CisJTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OworCWludCBwcm9wZXJ0eUluZGV4OworCit9IFBST0NESVJFTlRSWUNPTlRFWFQ7CisKKy8qKiBUaGlzIGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlcyBvZiBhIHRyZWUgcm9vdGVkIGF0CisgKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLgorICogIFByb3BlcnRpZXMgZm9yIGVhY2ggb2JqZWN0IG9mIHRoaXMgdHlwZSB3aWxsIGJlIGxvY2F0ZWQgdW5kZXIKKyAqICA8cHJvY0RpclJvb3Q+LzxuYW1lWzBdPi88bmFtZVsxXT4vLi4uLzxvYmplY3ROYW1lPi88cHJvcGVydHlOYW1lPi4KKyAqLworc3RydWN0IE1ZUFJPQ1RZUEVfVGFnIHsKKwljb25zdCBjaGFyICoqbmFtZTsgIC8qKjwgbm9kZSBuYW1lcyBmb3IgdGhpcyB0eXBlLCBlbmRpbmcgd2l0aCBOVUxMICovCisJaW50IG5OYW1lczsgICAgICAgICAvKio8IG51bSBvZiBub2RlIG5hbWVzIGluIDxuYW1lPiAqLworCisJLyoqIHJvb3QgZGlyIGZvciB0aGlzIHR5cGUgdHJlZSBpbiAvcHJvYyAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpclJvb3Q7CisKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipwcm9jRGlyczsgIC8qKjwgZm9yIGVhY2ggbm9kZSBpbiA8bmFtZT4gKi8KKworCS8qKiBib3R0b20gZGlyIHdoZXJlIG9iamVjdHMgd2lsbCBiZSByb290ZWQ7IGkuZS4sIHRoaXMgaXMKKwkgKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLi8sIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZQorCSAqICBsYXN0IGVudHJ5IGluIHRoZSA8cHJvY0RpcnM+IGFycmF5LiAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpcjsKKworCS8qKiBuYW1lIGZvciBlYWNoIHByb3BlcnR5IHRoYXQgb2JqZWN0cyBvZiB0aGlzIHR5cGUgY2FuIGhhdmUgKi8KKwljb25zdCBjaGFyICoqcHJvcGVydHlOYW1lczsKKworCWludCBuUHJvcGVydGllczsgICAgICAgLyoqPCBudW0gb2YgbmFtZXMgaW4gPHByb3BlcnR5TmFtZXM+ICovCisKKwkvKiogQ2FsbCB0aGlzLCBwYXNzaW5nIE1ZUFJPQ09CSkVDVC5jb250ZXh0IGFuZCB0aGUgcHJvcGVydHkgaW5kZXgKKwkgKiAgd2hlbmV2ZXIgc29tZW9uZSByZWFkcyB0aGUgcHJvYyBlbnRyeSAqLworCXZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqLCBpbnQpOworfTsKKworCisKK3N0cnVjdCBNWVBST0NPQkpFQ1RfVGFnIHsKKwlNWVBST0NUWVBFICp0eXBlOworCisJLyoqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRpciBub2RlIGluIC9wcm9jIHVuZGVyIHdoaWNoIHRoZQorCSAqICBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0IHdpbGwgYXBwZWFyIGFzIGZpbGVzLiAqLworCWNoYXIgKm5hbWU7CisKKwlpbnQgbmFtZXNpemU7ICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciBuYW1lICovCisJdm9pZCAqY29udGV4dDsgIC8qKjwgcGFzc2VkIHRvIE1ZUFJPQ1RZUEUuc2hvd19wcm9wZXJ0eSAqLworCisJLyoqIDx0eXBlLnByb2NEaXJSb290Pi88dHlwZS5uYW1lWzBdPi88dHlwZS5uYW1lWzFdPi8uLi4vPG5hbWU+ICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRGlyOworCisJLyoqIGEgcHJvYyBkaXIgZW50cnkgZm9yIGVhY2ggb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdDsKKwkgKiAgcHJvcGVydGllcyBhcmUgaWRlbnRpZmllZCBpbiBNWVBST0NUWVBFLnByb3BlcnR5TmFtZXMsIHNvIGVhY2ggb2YKKwkgKiAgdGhlIDxwcm9jRGlyUHJvcGVydGllcz4gZGVzY3JpYmVzIGEgc2luZ2xlIGZpbGUgbGlrZQorCSAqICA8dHlwZS5wcm9jRGlyUm9vdD4vPHR5cGUubmFtZVswXT4vPHR5cGUubmFtZVsxXT4vLi4uCisJICogICAgICAgICAgIC88bmFtZT4vPHByb3BlcnR5TmFtZT4KKwkgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipwcm9jRGlyUHJvcGVydGllczsKKworCS8qKiB0aGlzIGlzIGEgaG9sZGluZyBhcmVhIGZvciB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lZWRlZAorCSAqICB0byBydW4gdGhlIC9wcm9jIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJUFJPQ0RJUkVOVFJZQ09OVEVYVCAqcHJvY0RpclByb3BlcnR5Q29udGV4dHM7Cit9OworCisKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCitjcmVhdGVQcm9jRGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IHByb2NfbWtkaXJfbW9kZShuYW1lLCBTX0lGRElSLCBwYXJlbnQpOworCWlmIChwID09IE5VTEwpCisJCUVSUkRSVigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYyBkaXJlY3RvcnkgJXMiLCBuYW1lKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCitjcmVhdGVQcm9jRmlsZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCwKKwkgICAgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnAgPSBwcm9jX2NyZWF0ZV9kYXRhKG5hbWUsIDAsIHBhcmVudCwKKwkJCQkJCSAgICBmb3BzLCBkYXRhKTsKKwlpZiAocCA9PSBOVUxMKQorCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZmlsZSAlcyIsIG5hbWUpOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IHNlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworc3RhdGljIGludCBwcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93LCBQREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHMgPSB7CisJLm9wZW4gPSBwcm9jX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisKKworTVlQUk9DVFlQRSAqdmlzb3JfcHJvY19DcmVhdGVUeXBlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpclJvb3QsCisJCQkJICBjb25zdCBjaGFyICoqbmFtZSwKKwkJCQkgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eU5hbWVzLAorCQkJCSAgdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLAorCQkJCQkJCXZvaWQgKiwgaW50KSkKK3sKKwlpbnQgaSA9IDA7CisJTVlQUk9DVFlQRSAqcmMgPSBOVUxMLCAqdHlwZSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQgPSBOVUxMOworCisJaWYgKHByb2NEaXJSb290ID09IE5VTEwpIHsKKwkJRVJSRFJWKCJwcm9jRGlyUm9vdCBjYW5ub3QgYmUgTlVMTCFcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChuYW1lID09IE5VTEwgfHwgbmFtZVswXSA9PSBOVUxMKSB7CisJCUVSUkRSVigibmFtZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBub2RlIG5hbWUhXG4iKTsKKwkJZ290byBBd2F5OworCX0KKwl0eXBlID0ga3phbGxvYyhzaXplb2YoTVlQUk9DVFlQRSksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAodHlwZSA9PSBOVUxMKSB7CisJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJdHlwZS0+bmFtZSA9IG5hbWU7CisJdHlwZS0+cHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7CisJdHlwZS0+blByb3BlcnRpZXMgPSAwOworCXR5cGUtPm5OYW1lcyA9IDA7CisJdHlwZS0+c2hvd19wcm9wZXJ0eSA9IHNob3dfcHJvcGVydHk7CisJdHlwZS0+cHJvY0RpclJvb3QgPSBwcm9jRGlyUm9vdDsKKwlpZiAodHlwZS0+cHJvcGVydHlOYW1lcyAhPSBOVUxMKQorCQl3aGlsZSAodHlwZS0+cHJvcGVydHlOYW1lc1t0eXBlLT5uUHJvcGVydGllc10gIT0gTlVMTCkKKwkJCXR5cGUtPm5Qcm9wZXJ0aWVzKys7CisJd2hpbGUgKHR5cGUtPm5hbWVbdHlwZS0+bk5hbWVzXSAhPSBOVUxMKQorCQl0eXBlLT5uTmFtZXMrKzsKKwl0eXBlLT5wcm9jRGlycyA9IGt6YWxsb2MoKHR5cGUtPm5OYW1lcyArIDEpICoKKwkJCQkgc2l6ZW9mKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKSwKKwkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmICh0eXBlLT5wcm9jRGlycyA9PSBOVUxMKSB7CisJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJcGFyZW50ID0gcHJvY0RpclJvb3Q7CisJZm9yIChpID0gMDsgaSA8IHR5cGUtPm5OYW1lczsgaSsrKSB7CisJCXR5cGUtPnByb2NEaXJzW2ldID0gY3JlYXRlUHJvY0Rpcih0eXBlLT5uYW1lW2ldLCBwYXJlbnQpOworCQlpZiAodHlwZS0+cHJvY0RpcnNbaV0gPT0gTlVMTCkgeworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJCXBhcmVudCA9IHR5cGUtPnByb2NEaXJzW2ldOworCX0KKwl0eXBlLT5wcm9jRGlyID0gdHlwZS0+cHJvY0RpcnNbdHlwZS0+bk5hbWVzLTFdOworCXJjID0gdHlwZTsKK0F3YXk6CisJaWYgKHJjID09IE5VTEwpIHsKKwkJaWYgKHR5cGUgIT0gTlVMTCkgeworCQkJdmlzb3JfcHJvY19EZXN0cm95VHlwZSh0eXBlKTsKKwkJCXR5cGUgPSBOVUxMOworCQl9CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3Byb2NfQ3JlYXRlVHlwZSk7CisKKworCit2b2lkIHZpc29yX3Byb2NfRGVzdHJveVR5cGUoTVlQUk9DVFlQRSAqdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHR5cGUtPnByb2NEaXJzICE9IE5VTEwpIHsKKwkJaW50IGkgPSB0eXBlLT5uTmFtZXMtMTsKKwkJd2hpbGUgKGkgPj0gMCkgeworCQkJaWYgKHR5cGUtPnByb2NEaXJzW2ldICE9IE5VTEwpIHsKKwkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCA9IE5VTEw7CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJcGFyZW50ID0gdHlwZS0+cHJvY0RpclJvb3Q7CisJCQkJZWxzZQorCQkJCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyc1tpLTFdOworCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHR5cGUtPm5hbWVbaV0sIHBhcmVudCk7CisJCQl9CisJCQlpLS07CisJCX0KKwkJa2ZyZWUodHlwZS0+cHJvY0RpcnMpOworCQl0eXBlLT5wcm9jRGlycyA9IE5VTEw7CisJfQorCWtmcmVlKHR5cGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19EZXN0cm95VHlwZSk7CisKKworCitNWVBST0NPQkpFQ1QgKnZpc29yX3Byb2NfQ3JlYXRlT2JqZWN0KE1ZUFJPQ1RZUEUgKnR5cGUsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqY29udGV4dCkKK3sKKwlNWVBST0NPQkpFQ1QgKm9iaiA9IE5VTEwsICpyYyA9IE5VTEw7CisJaW50IGkgPSAwOworCisJaWYgKHR5cGUgPT0gTlVMTCkgeworCQlFUlJEUlYoInR5cGUgY2Fubm90IGJlIE5VTExcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKE1ZUFJPQ09CSkVDVCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAob2JqID09IE5VTEwpIHsKKwkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlvYmotPnR5cGUgPSB0eXBlOworCW9iai0+Y29udGV4dCA9IGNvbnRleHQ7CisJaWYgKG5hbWUgPT0gTlVMTCkgeworCQlvYmotPm5hbWUgPSBOVUxMOworCQlvYmotPnByb2NEaXIgPSB0eXBlLT5wcm9jRGlyOworCX0gZWxzZSB7CisJCW9iai0+bmFtZXNpemUgPSBzdHJsZW4obmFtZSkrMTsKKwkJb2JqLT5uYW1lID0ga21hbGxvYyhvYmotPm5hbWVzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJCWlmIChvYmotPm5hbWUgPT0gTlVMTCkgeworCQkJb2JqLT5uYW1lc2l6ZSA9IDA7CisJCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOworCQkJZ290byBBd2F5OworCQl9CisJCXN0cmNweShvYmotPm5hbWUsIG5hbWUpOworCQlvYmotPnByb2NEaXIgPSBjcmVhdGVQcm9jRGlyKG9iai0+bmFtZSwgdHlwZS0+cHJvY0Rpcik7CisJCWlmIChvYmotPnByb2NEaXIgPT0gTlVMTCkgeworCQkJZ290byBBd2F5OworCQl9CisJfQorCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMgPQorCQlremFsbG9jKCh0eXBlLT5uUHJvcGVydGllcyArIDEpICogc2l6ZW9mKFBST0NESVJFTlRSWUNPTlRFWFQpLAorCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID09IE5VTEwpIHsKKwkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0KKwkJa3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiksCisJCQlHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXMgPT0gTlVMTCkgeworCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCWZvciAoaSA9IDA7IGkgPCB0eXBlLT5uUHJvcGVydGllczsgaSsrKSB7CisJCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0ucHJvY09iamVjdCA9IG9iajsKKwkJb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0c1tpXS5wcm9wZXJ0eUluZGV4ID0gaTsKKwkJb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0c1tpXS5zaG93X3Byb3BlcnR5ID0KKwkJCXR5cGUtPnNob3dfcHJvcGVydHk7CisJCWlmICh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldWzBdICE9ICdcMCcpIHsKKwkJCS8qIG9ubHkgY3JlYXRlIHByb3BlcnRpZXMgdGhhdCBoYXZlIG5hbWVzICovCisJCQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzW2ldID0KKwkJCQljcmVhdGVQcm9jRmlsZSh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldLAorCQkJCQkgICAgICAgb2JqLT5wcm9jRGlyLCAmcHJvY19mb3BzLAorCQkJCQkgICAgICAgJm9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0pOworCQkJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gPT0gTlVMTCkgeworCQkJCXJjID0gTlVMTDsKKwkJCQlnb3RvIEF3YXk7CisJCQl9CisJCX0KKwl9CisJcmMgPSBvYmo7CitBd2F5OgorCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmIChvYmogIT0gTlVMTCkgeworCQkJdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KG9iaik7CisJCQlvYmogPSBOVUxMOworCQl9CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3Byb2NfQ3JlYXRlT2JqZWN0KTsKKworCisKK3ZvaWQgdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KE1ZUFJPQ09CSkVDVCAqb2JqKQoreworCU1ZUFJPQ1RZUEUgKnR5cGUgPSBOVUxMOworCWlmIChvYmogPT0gTlVMTCkKKwkJcmV0dXJuOworCXR5cGUgPSBvYmotPnR5cGU7CisJaWYgKHR5cGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzICE9IE5VTEwpIHsKKwkJaW50IGkgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgeworCQkJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gIT0gTlVMTCkgeworCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHR5cGUtPnByb3BlcnR5TmFtZXNbaV0sCisJCQkJCQkgIG9iai0+cHJvY0Rpcik7CisJCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJa2ZyZWUob2JqLT5wcm9jRGlyUHJvcGVydGllcyk7CisJCW9iai0+cHJvY0RpclByb3BlcnRpZXMgPSBOVUxMOworCX0KKwlpZiAob2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0cyAhPSBOVUxMKSB7CisJCWtmcmVlKG9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMpOworCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0gTlVMTDsKKwl9CisJaWYgKG9iai0+cHJvY0RpciAhPSBOVUxMKSB7CisJCWlmIChvYmotPm5hbWUgIT0gTlVMTCkKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KG9iai0+bmFtZSwgdHlwZS0+cHJvY0Rpcik7CisJCW9iai0+cHJvY0RpciA9IE5VTEw7CisJfQorCWlmIChvYmotPm5hbWUgIT0gTlVMTCkgeworCQlrZnJlZShvYmotPm5hbWUpOworCQlvYmotPm5hbWUgPSBOVUxMOworCX0KKwlrZnJlZShvYmopOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KTsKKworCisKK3N0YXRpYyBpbnQgc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlQUk9DRElSRU5UUllDT05URVhUICpjdHggPSAoUFJPQ0RJUkVOVFJZQ09OVEVYVCAqKShzZXEtPnByaXZhdGUpOworCWlmIChjdHggPT0gTlVMTCkgeworCQlFUlJEUlYoIkkgZG9uJ3QgaGF2ZSBhIGZyZWFraW4nIGNsdWUuLi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCSgqY3R4LT5zaG93X3Byb3BlcnR5KShzZXEsIGN0eC0+cHJvY09iamVjdC0+Y29udGV4dCwKKwkJCSAgICAgIGN0eC0+cHJvcGVydHlJbmRleCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC92aXNvcmttb2R1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2QxZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYwpAQCAtMCwwICsxLDcxIEBACisvKiB0aW1za21vZHV0aWxzLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKworI2RlZmluZSBNWURSVk5BTUUgInRpbXNrbW9kdXRpbHMiCisKKy8qKiBDYWxsZXJzIHRvIGludGVyZmFjZXMgdGhhdCBzZXQgX19HRlBfTk9SRVRSWSBmbGFnIGJlbG93CisgKiAgbXVzdCBjaGVjayBmb3IgYSBOVUxMIChlcnJvcikgcmVzdWx0IGFzIHdlIGFyZSB0ZWxsaW5nIHRoZQorICogIGtlcm5lbCBpbnRlcmZhY2UgdGhhdCBpdCBpcyBva2F5IHRvIGZhaWwuCisgKi8KKwordm9pZCAqa21hbGxvY19rZXJuZWwoc2l6ZV90IHNpeikKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXosIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKK30KKworLyogIFVzZSB0aGVzZSBoYW5keS1kYW5keSBzZXFfZmlsZV94eHggZnVuY3Rpb25zIGlmIHlvdSB3YW50IHRvIGNhbGwgc29tZQorICogIGZ1bmN0aW9ucyB0aGF0IHdyaXRlIHN0dWZmIGludG8gYSBzZXFfZmlsZSwgYnV0IHlvdSBhY3R1YWxseSBqdXN0IHdhbnQKKyAqICB0byBkdW1wIHRoYXQgb3V0cHV0IGludG8gYSBidWZmZXIuICBVc2UgdGhlbSBhcyBmb2xsb3dzOgorICogIC0gY2FsbCB2aXNvcl9zZXFfZmlsZV9uZXdfYnVmZmVyIHRvIGNyZWF0ZSB0aGUgc2VxX2ZpbGUgKHlvdSBzdXBwbHkgdGhlIGJ1ZikKKyAqICAtIGNhbGwgd2hhdGV2ZXIgZnVuY3Rpb25zIHlvdSB3YW50IHRoYXQgdGFrZSBhIHNlcV9maWxlIGFzIGFuIGFyZ3VtZW50CisgKiAgICAodGhlIGJ1ZiB5b3Ugc3VwcGxpZWQgd2lsbCBnZXQgdGhlIG91dHB1dCBkYXRhKQorICogIC0gY2FsbCB2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlciB0byBkaXNwb3NlIG9mIHlvdXIgc2VxX2ZpbGUKKyAqLworc3RydWN0IHNlcV9maWxlICp2aXNvcl9zZXFfZmlsZV9uZXdfYnVmZmVyKHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQoreworCXN0cnVjdCBzZXFfZmlsZSAqcmMgPSBOVUxMOworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGttYWxsb2Nfa2VybmVsKHNpemVvZihzdHJ1Y3Qgc2VxX2ZpbGUpKTsKKworCWlmIChtID09IE5VTEwpIHsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCW1lbXNldChtLCAwLCBzaXplb2Yoc3RydWN0IHNlcV9maWxlKSk7CisJbS0+YnVmID0gYnVmOworCW0tPnNpemUgPSBidWZfc2l6ZTsKKwlyYyA9IG07CitBd2F5OgorCWlmIChyYyA9PSBOVUxMKSB7CisJCXZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKG0pOworCQltID0gTlVMTDsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3Jfc2VxX2ZpbGVfbmV3X2J1ZmZlcik7CisKKworCit2b2lkIHZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlpZiAoIW0pCisJCXJldHVybjsKKwlrZnJlZShtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCmluZGV4IGE3M2U0MzcuLjI2NmUyYjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKQEAgLTg2LDYgKzg2LDcgQEAKIAljaGFyIHN0YXR1czsKIAlpbnQgaW50ZXJmX2NvdW50OwogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAljaGFyIHNodXRkb3duX2J1c2lkOwogfTsKIApAQCAtOTMsNyArOTQsNyBAQAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzdHViX3ByaXZfY2FjaGU7CiAKIC8qIHN0dWJfZGV2LmMgKi8KLWV4dGVybiBzdHJ1Y3QgdXNiX2RyaXZlciBzdHViX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIgc3R1Yl9kcml2ZXI7CiAKIC8qIHN0dWJfbWFpbi5jICovCiBzdHJ1Y3QgYnVzX2lkX3ByaXYgKmdldF9idXNpZF9wcml2KGNvbnN0IGNoYXIgKmJ1c2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKaW5kZXggNzZhMWZmMC4uNzczZDhjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKQEAgLTg3LDEzICs4NywxNiBAQAogCWludCBzb2NrZmQgPSAwOwogCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKIAlzc2l6ZV90IGVyciA9IC1FSU5WQUw7CisJaW50IHJ2OwogCiAJaWYgKCFzZGV2KSB7CiAJCWRldl9lcnIoZGV2LCAic2RldiBpcyBudWxsXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3NjYW5mKGJ1ZiwgIiVkIiwgJnNvY2tmZCk7CisJcnYgPSBzc2NhbmYoYnVmLCAiJWQiLCAmc29ja2ZkKTsKKwlpZiAocnYgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc29ja2ZkICE9IC0xKSB7CiAJCWRldl9pbmZvKGRldiwgInN0dWIgdXBcbiIpOwpAQCAtMjc5LDIxICsyODIsMTkgQEAKICAqCiAgKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEgbmV3IHN0dWJfZGV2aWNlIHN0cnVjdC4KICAqLwotc3RhdGljIHN0cnVjdCBzdHViX2RldmljZSAqc3R1Yl9kZXZpY2VfYWxsb2Moc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCi0JCQkJCSAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3N0YXRpYyBzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnN0dWJfZGV2aWNlX2FsbG9jKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldjsKLQlpbnQgYnVzbnVtID0gaW50ZXJmYWNlX3RvX2J1c251bShpbnRlcmZhY2UpOwotCWludCBkZXZudW0gPSBpbnRlcmZhY2VfdG9fZGV2bnVtKGludGVyZmFjZSk7CisJaW50IGJ1c251bSA9IHVkZXYtPmJ1cy0+YnVzbnVtOworCWludCBkZXZudW0gPSB1ZGV2LT5kZXZudW07CiAKLQlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgImFsbG9jYXRpbmcgc3R1YiBkZXZpY2UiKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJhbGxvY2F0aW5nIHN0dWIgZGV2aWNlIik7CiAKIAkvKiB5ZXMsIGl0J3MgYSBuZXcgZGV2aWNlICovCiAJc2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHViX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghc2RldikKIAkJcmV0dXJuIE5VTEw7CiAKLQlzZGV2LT5pbnRlcmZhY2UgPSB1c2JfZ2V0X2ludGYoaW50ZXJmYWNlKTsKIAlzZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CiAKIAkvKgpAQCAtMzIyLDcgKzMyMyw3IEBACiAKIAl1c2JpcF9zdGFydF9laCgmc2Rldi0+dWQpOwogCi0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJyZWdpc3RlciBuZXcgaW50ZXJmYWNlXG4iKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJyZWdpc3RlciBuZXcgZGV2aWNlXG4iKTsKIAogCXJldHVybiBzZGV2OwogfQpAQCAtMzMyLDMyICszMzMsMjEgQEAKIAlrZnJlZShzZGV2KTsKIH0KIAotLyoKLSAqIElmIGEgdXNiIGRldmljZSBoYXMgbXVsdGlwbGUgYWN0aXZlIGludGVyZmFjZXMsIHRoaXMgZHJpdmVyIGlzIGJvdW5kIHRvIGFsbAotICogdGhlIGFjdGl2ZSBpbnRlcmZhY2VzLiBIb3dldmVyLCB1c2JpcCBleHBvcnRzICphKiB1c2IgZGV2aWNlIChpLmUuLCBub3QgKmFuKgotICogYWN0aXZlIGludGVyZmFjZSkuIEN1cnJlbnRseSwgYSB1c2VybGFuZCBwcm9ncmFtIG11c3QgZW5zdXJlIHRoYXQgaXQKLSAqIGxvb2tzIGF0IHRoZSB1c2JpcCdzIHN5c2ZzIGVudHJpZXMgb2Ygb25seSB0aGUgZmlyc3QgYWN0aXZlIGludGVyZmFjZS4KLSAqCi0gKiBUT0RPOiB1c2UgInN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciIgdG8gYmluZCBhIHVzYiBkZXZpY2UuCi0gKiBIb3dldmVyLCBpdCBzZWVtcyBpdCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGluIG1haW5saW5lIGtlcm5lbCB5ZXQKLSAqICgyLjYuMTkuMikuCi0gKi8KLXN0YXRpYyBpbnQgc3R1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IHN0dWJfcHJvYmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CiAJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gTlVMTDsKLQljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoaW50ZXJmYWNlLT5kZXYucGFyZW50KTsKKwljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoJnVkZXYtPmRldik7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGJ1c19pZF9wcml2ICpidXNpZF9wcml2OworCWludCByYzsKIAotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiRW50ZXJcbiIpOworCWRldl9kYmcoJnVkZXYtPmRldiwgIkVudGVyXG4iKTsKIAogCS8qIGNoZWNrIHdlIHNob3VsZCBjbGFpbSBvciBub3QgYnkgYnVzaWRfdGFibGUgKi8KIAlidXNpZF9wcml2ID0gZ2V0X2J1c2lkX3ByaXYodWRldl9idXNpZCk7CiAJaWYgKCFidXNpZF9wcml2IHx8IChidXNpZF9wcml2LT5zdGF0dXMgPT0gU1RVQl9CVVNJRF9SRU1PVikgfHwKIAkgICAgKGJ1c2lkX3ByaXYtPnN0YXR1cyA9PSBTVFVCX0JVU0lEX09USEVSKSkgewotCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsCisJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCiAJCQkiJXMgaXMgbm90IGluIG1hdGNoX2J1c2lkIHRhYmxlLi4uIHNraXAhXG4iLAogCQkJdWRldl9idXNpZCk7CiAKQEAgLTM4Myw2MCArMzczLDQxIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChidXNpZF9wcml2LT5zdGF0dXMgPT0gU1RVQl9CVVNJRF9BTExPQykgewotCQlzZGV2ID0gYnVzaWRfcHJpdi0+c2RldjsKLQkJaWYgKCFzZGV2KQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50Kys7Ci0JCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKLQkJCSJ1c2JpcC1ob3N0OiByZWdpc3RlciBuZXcgaW50ZXJmYWNlIChidXMgJXUgZGV2ICV1IGlmbiAldSlcbiIsCi0JCQl1ZGV2LT5idXMtPmJ1c251bSwgdWRldi0+ZGV2bnVtLAotCQkJaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKLQotCQkvKiBzZXQgcHJpdmF0ZSBkYXRhIHRvIHVzYl9pbnRlcmZhY2UgKi8KLQkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHNkZXYpOwotCi0JCWVyciA9IHN0dWJfYWRkX2ZpbGVzKCZpbnRlcmZhY2UtPmRldik7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAic3R1Yl9hZGRfZmlsZXMgZm9yICVzXG4iLAotCQkJCXVkZXZfYnVzaWQpOwotCQkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwotCQkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50LS07Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0KLQkJdXNiX2dldF9pbnRmKGludGVyZmFjZSk7Ci0JCXJldHVybiAwOwotCX0KLQogCS8qIG9rLCB0aGlzIGlzIG15IGRldmljZSAqLwotCXNkZXYgPSBzdHViX2RldmljZV9hbGxvYyh1ZGV2LCBpbnRlcmZhY2UpOworCXNkZXYgPSBzdHViX2RldmljZV9hbGxvYyh1ZGV2KTsKIAlpZiAoIXNkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAotCQkidXNiaXAtaG9zdDogcmVnaXN0ZXIgbmV3IGRldmljZSAoYnVzICV1IGRldiAldSBpZm4gJXUpXG4iLAotCQl1ZGV2LT5idXMtPmJ1c251bSwgdWRldi0+ZGV2bnVtLAotCQlpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCisJCSJ1c2JpcC1ob3N0OiByZWdpc3RlciBuZXcgZGV2aWNlIChidXMgJXUgZGV2ICV1KVxuIiwKKwkJdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSk7CiAKLQlidXNpZF9wcml2LT5pbnRlcmZfY291bnQgPSAwOwogCWJ1c2lkX3ByaXYtPnNodXRkb3duX2J1c2lkID0gMDsKIAotCS8qIHNldCBwcml2YXRlIGRhdGEgdG8gdXNiX2ludGVyZmFjZSAqLwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzZGV2KTsKLQlidXNpZF9wcml2LT5pbnRlcmZfY291bnQrKzsKKwkvKiBzZXQgcHJpdmF0ZSBkYXRhIHRvIHVzYl9kZXZpY2UgKi8KKwlkZXZfc2V0X2RydmRhdGEoJnVkZXYtPmRldiwgc2Rldik7CiAJYnVzaWRfcHJpdi0+c2RldiA9IHNkZXY7CisJYnVzaWRfcHJpdi0+dWRldiA9IHVkZXY7CiAKLQllcnIgPSBzdHViX2FkZF9maWxlcygmaW50ZXJmYWNlLT5kZXYpOworCS8qCisJICogQ2xhaW0gdGhpcyBodWIgcG9ydC4KKwkgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHZhbHVlIHdlIHBhc3MgYXMgb3duZXIKKwkgKiAoc3RydWN0IGRldl9zdGF0ZSkgYXMgbG9uZyBhcyBpdCBpcyB1bmlxdWUuCisJICovCisJcmMgPSB1c2JfaHViX2NsYWltX3BvcnQodWRldi0+cGFyZW50LCB1ZGV2LT5wb3J0bnVtLAorCQkJKHN0cnVjdCB1c2JfZGV2X3N0YXRlICopIHVkZXYpOworCWlmIChyYykgeworCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1bmFibGUgdG8gY2xhaW0gcG9ydFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwllcnIgPSBzdHViX2FkZF9maWxlcygmdWRldi0+ZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAic3R1Yl9hZGRfZmlsZXMgZm9yICVzXG4iLCB1ZGV2X2J1c2lkKTsKLQkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwotCQl1c2JfcHV0X2ludGYoaW50ZXJmYWNlKTsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAic3R1Yl9hZGRfZmlsZXMgZm9yICVzXG4iLCB1ZGV2X2J1c2lkKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZ1ZGV2LT5kZXYsIE5VTEwpOwogCQl1c2JfcHV0X2Rldih1ZGV2KTsKIAkJa3RocmVhZF9zdG9wX3B1dChzZGV2LT51ZC5laCk7CiAKLQkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50ID0gMDsKIAkJYnVzaWRfcHJpdi0+c2RldiA9IE5VTEw7CiAJCXN0dWJfZGV2aWNlX2ZyZWUoc2Rldik7CiAJCXJldHVybiBlcnI7CkBAIC00NjEsMTMgKzQzMiwxNCBAQAogICogY2FsbGVkIGluIHVzYl9kaXNjb25uZWN0KCkgb3IgdXNiX2RlcmVnaXN0ZXIoKQogICogYnV0IG9ubHkgaWYgYWN0Y29uZmlnKGFjdGl2ZSBjb25maWd1cmF0aW9uKSBleGlzdHMKICAqLwotc3RhdGljIHZvaWQgc3R1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCitzdGF0aWMgdm9pZCBzdHViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2OwotCWNvbnN0IGNoYXIgKnVkZXZfYnVzaWQgPSBkZXZfbmFtZShpbnRlcmZhY2UtPmRldi5wYXJlbnQpOworCWNvbnN0IGNoYXIgKnVkZXZfYnVzaWQgPSBkZXZfbmFtZSgmdWRldi0+ZGV2KTsKIAlzdHJ1Y3QgYnVzX2lkX3ByaXYgKmJ1c2lkX3ByaXY7CisJaW50IHJjOwogCi0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJFbnRlclxuIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAiRW50ZXJcbiIpOwogCiAJYnVzaWRfcHJpdiA9IGdldF9idXNpZF9wcml2KHVkZXZfYnVzaWQpOwogCWlmICghYnVzaWRfcHJpdikgewpAQCAtNDc1LDQxICs0NDcsMzcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJc2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmdWRldi0+ZGV2KTsKIAogCS8qIGdldCBzdHViX2RldmljZSAqLwogCWlmICghc2RldikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgImNvdWxkIG5vdCBnZXQgZGV2aWNlIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgZGV2aWNlIik7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJZGV2X3NldF9kcnZkYXRhKCZ1ZGV2LT5kZXYsIE5VTEwpOwogCiAJLyoKIAkgKiBOT1RFOiByeC90eCB0aHJlYWRzIGFyZSBpbnZva2VkIGZvciBlYWNoIHVzYl9kZXZpY2UuCiAJICovCi0Jc3R1Yl9yZW1vdmVfZmlsZXMoJmludGVyZmFjZS0+ZGV2KTsKKwlzdHViX3JlbW92ZV9maWxlcygmdWRldi0+ZGV2KTsKKworCS8qIHJlbGVhc2UgcG9ydCAqLworCXJjID0gdXNiX2h1Yl9yZWxlYXNlX3BvcnQodWRldi0+cGFyZW50LCB1ZGV2LT5wb3J0bnVtLAorCQkJCSAgKHN0cnVjdCB1c2JfZGV2X3N0YXRlICopIHVkZXYpOworCWlmIChyYykgeworCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVsZWFzZSBwb3J0XG4iKTsKKwkJcmV0dXJuOworCX0KIAogCS8qIElmIHVzYiByZXNldCBpcyBjYWxsZWQgZnJvbSBldmVudCBoYW5kbGVyICovCi0JaWYgKGJ1c2lkX3ByaXYtPnNkZXYtPnVkLmVoID09IGN1cnJlbnQpIHsKLQkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50LS07CisJaWYgKGJ1c2lkX3ByaXYtPnNkZXYtPnVkLmVoID09IGN1cnJlbnQpCiAJCXJldHVybjsKLQl9Ci0KLQlpZiAoYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50ID4gMSkgewotCQlidXNpZF9wcml2LT5pbnRlcmZfY291bnQtLTsKLQkJc2h1dGRvd25fYnVzaWQoYnVzaWRfcHJpdik7Ci0JCXVzYl9wdXRfaW50ZihpbnRlcmZhY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50ID0gMDsKIAogCS8qIHNodXRkb3duIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gKi8KIAlzaHV0ZG93bl9idXNpZChidXNpZF9wcml2KTsKIAogCXVzYl9wdXRfZGV2KHNkZXYtPnVkZXYpOwotCXVzYl9wdXRfaW50ZihpbnRlcmZhY2UpOwogCiAJLyogZnJlZSBzZGV2ICovCiAJYnVzaWRfcHJpdi0+c2RldiA9IE5VTEw7CkBAIC01MjMsMjggKzQ5MSwzNCBAQAogCX0KIH0KIAotLyoKLSAqIFByZXNlbmNlIG9mIHByZV9yZXNldCBhbmQgcG9zdF9yZXNldCBwcmV2ZW50cyB0aGUgZHJpdmVyIGZyb20gYmVpbmcgdW5ib3VuZAotICogd2hlbiB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlc2V0Ci0gKi8KKyNpZmRlZiBDT05GSUdfUE0KIAotc3RhdGljIGludCBzdHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQorLyogVGhlc2UgZnVuY3Rpb25zIG5lZWQgdXNiX3BvcnRfc3VzcGVuZCBhbmQgdXNiX3BvcnRfcmVzdW1lLAorICogd2hpY2ggcmVzaWRlIGluIGRyaXZlcnMvdXNiL2NvcmUvdXNiLmguIFNraXAgZm9yIG5vdy4gKi8KKworc3RhdGljIGludCBzdHViX3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAicHJlX3Jlc2V0XG4iKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJzdHViX3N1c3BlbmRcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3R1Yl9wb3N0X3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCitzdGF0aWMgaW50IHN0dWJfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKLQlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInBvc3RfcmVzZXRcbiIpOworCWRldl9kYmcoJnVkZXYtPmRldiwgInN0dWJfcmVzdW1lXG4iKTsKKwogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgdXNiX2RyaXZlciBzdHViX2RyaXZlciA9IHsKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyIHN0dWJfZHJpdmVyID0gewogCS5uYW1lCQk9ICJ1c2JpcC1ob3N0IiwKIAkucHJvYmUJCT0gc3R1Yl9wcm9iZSwKIAkuZGlzY29ubmVjdAk9IHN0dWJfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUJPSBzdHViX3RhYmxlLAotCS5wcmVfcmVzZXQJPSBzdHViX3ByZV9yZXNldCwKLQkucG9zdF9yZXNldAk9IHN0dWJfcG9zdF9yZXNldCwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHN0dWJfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHN0dWJfcmVzdW1lLAorI2VuZGlmCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kCT0JMCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKaW5kZXggYmFmODU3Zi4uOWM1ODMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKICNpbmNsdWRlICJzdHViLmgiCkBAIC0xODcsNiArMTg4LDM0IEBACiBzdGF0aWMgRFJJVkVSX0FUVFIobWF0Y2hfYnVzaWQsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X21hdGNoX2J1c2lkLAogCQkgICBzdG9yZV9tYXRjaF9idXNpZCk7CiAKK3N0YXRpYyBzc2l6ZV90IHJlYmluZF9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0OworCWludCBsZW47CisJc3RydWN0IGJ1c19pZF9wcml2ICpiaWQ7CisKKwkvKiBidWYgbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYXQgQlVTSURfU0laRSAqLworCWxlbiA9IHN0cm5sZW4oYnVmLCBCVVNJRF9TSVpFKTsKKworCWlmICghKGxlbiA8IEJVU0lEX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJpZCA9IGdldF9idXNpZF9wcml2KGJ1Zik7CisJaWYgKCFiaWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gZGV2aWNlX2F0dGFjaCgmYmlkLT51ZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmJpZC0+dWRldi0+ZGV2LCAicmViaW5kIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgRFJJVkVSX0FUVFJfV08ocmViaW5kKTsKKwogc3RhdGljIHN0cnVjdCBzdHViX3ByaXYgKnN0dWJfcHJpdl9wb3BfZnJvbV9saXN0aGVhZChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0aGVhZCkKIHsKIAlzdHJ1Y3Qgc3R1Yl9wcml2ICpwcml2LCAqdG1wOwpAQCAtMjU0LDcgKzI4Myw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXJldCA9IHVzYl9yZWdpc3Rlcigmc3R1Yl9kcml2ZXIpOworCXJldCA9IHVzYl9yZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKCZzdHViX2RyaXZlciwgVEhJU19NT0RVTEUpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl91c2JfcmVnaXN0ZXI7CkBAIC0yNjcsMTEgKzI5NiwxOCBAQAogCQlnb3RvIGVycl9jcmVhdGVfZmlsZTsKIAl9CiAKKwlyZXQgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJnN0dWJfZHJpdmVyLmRydndyYXAuZHJpdmVyLAorCQkJCSAmZHJpdmVyX2F0dHJfcmViaW5kKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZHJpdmVyX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2NyZWF0ZV9maWxlOworCX0KKwogCXByX2luZm8oRFJJVkVSX0RFU0MgIiB2IiBVU0JJUF9WRVJTSU9OICJcbiIpOwogCXJldHVybiByZXQ7CiAKIGVycl9jcmVhdGVfZmlsZToKLQl1c2JfZGVyZWdpc3Rlcigmc3R1Yl9kcml2ZXIpOworCXVzYl9kZXJlZ2lzdGVyX2RldmljZV9kcml2ZXIoJnN0dWJfZHJpdmVyKTsKIGVycl91c2JfcmVnaXN0ZXI6CiAJa21lbV9jYWNoZV9kZXN0cm95KHN0dWJfcHJpdl9jYWNoZSk7CiAJcmV0dXJuIHJldDsKQEAgLTI4MiwxMSArMzE4LDE0IEBACiAJZHJpdmVyX3JlbW92ZV9maWxlKCZzdHViX2RyaXZlci5kcnZ3cmFwLmRyaXZlciwKIAkJCSAgICZkcml2ZXJfYXR0cl9tYXRjaF9idXNpZCk7CiAKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnN0dWJfZHJpdmVyLmRydndyYXAuZHJpdmVyLAorCQkJICAgJmRyaXZlcl9hdHRyX3JlYmluZCk7CisKIAkvKgogCSAqIGRlcmVnaXN0ZXIoKSBjYWxscyBzdHViX2Rpc2Nvbm5lY3QoKSBmb3IgYWxsIGRldmljZXMuIERldmljZQogCSAqIHNwZWNpZmljIGRhdGEgaXMgY2xlYXJlZCBpbiBzdHViX2Rpc2Nvbm5lY3QoKS4KIAkgKi8KLQl1c2JfZGVyZWdpc3Rlcigmc3R1Yl9kcml2ZXIpOworCXVzYl9kZXJlZ2lzdGVyX2RldmljZV9kcml2ZXIoJnN0dWJfZHJpdmVyKTsKIAogCWttZW1fY2FjaGVfZGVzdHJveShzdHViX3ByaXZfY2FjaGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKaW5kZXggNWQxZDRhMS4uZTBiNmQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCkBAIC0xNDIsMzEgKzE0MiwxOSBAQAogCiBzdGF0aWMgaW50IHR3ZWFrX3NldF9jb25maWd1cmF0aW9uX2NtZChzdHJ1Y3QgdXJiICp1cmIpCiB7CisJc3RydWN0IHN0dWJfcHJpdiAqcHJpdiA9IChzdHJ1Y3Qgc3R1Yl9wcml2ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYgPSBwcml2LT5zZGV2OwogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcTsKIAlfX3UxNiBjb25maWc7CisJaW50IGVycjsKIAogCXJlcSA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopIHVyYi0+c2V0dXBfcGFja2V0OwogCWNvbmZpZyA9IGxlMTZfdG9fY3B1KHJlcS0+d1ZhbHVlKTsKIAotCS8qCi0JICogSSBoYXZlIG5ldmVyIHNlZW4gYSBtdWx0aS1jb25maWcgZGV2aWNlLiBWZXJ5IHJhcmUuCi0JICogRm9yIG1vc3QgZGV2aWNlcywgdGhpcyB3aWxsIGJlIGNhbGxlZCB0byBjaG9vc2UgYSBkZWZhdWx0Ci0JICogY29uZmlndXJhdGlvbiBvbmx5IG9uY2UgaW4gYW4gaW5pdGlhbGl6YXRpb24gcGhhc2UuCi0JICoKLQkgKiBzZXRfY29uZmlndXJhdGlvbiBtYXkgY2hhbmdlIGEgZGV2aWNlIGNvbmZpZ3VyYXRpb24gYW5kIGl0cyBkZXZpY2UKLQkgKiBkcml2ZXJzIHdpbGwgYmUgdW5ib3VuZCBhbmQgYXNzaWduZWQgZm9yIGEgbmV3IGRldmljZSBjb25maWd1cmF0aW9uLgotCSAqIFRoaXMgbWVhbnMgdGhpcyB1c2JpcCBkcml2ZXIgd2lsbCBiZSBhbHNvIHVuYm91bmQgd2hlbiBjYWxsZWQsIHRoZW4KLQkgKiBldmVudHVhbGx5IHJlYXNzaWduZWQgdG8gdGhlIGRldmljZSBhcyBmYXIgYXMgZHJpdmVyIG1hdGNoaW5nCi0JICogY29uZGl0aW9uIGlzIGtlcHQuCi0JICoKLQkgKiBVbmZvcnR1bmF0ZWx5LCBhbiBleGlzdGluZyB1c2JpcCBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZAotCSAqIGR1ZSB0byB0aGlzIGRyaXZlciB1bmJpbmRpbmcuIFNvLCBza2lwIGhlcmUuCi0JICogQSB1c2VyIG1heSBuZWVkIHRvIHNldCBhIHNwZWNpYWwgY29uZmlndXJhdGlvbiB2YWx1ZSBiZWZvcmUKLQkgKiBleHBvcnRpbmcgdGhlIGRldmljZS4KLQkgKi8KLQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgInVzYl9zZXRfY29uZmlndXJhdGlvbiAlZCB0byAlcy4uLiBza2lwIVxuIiwKLQkJIGNvbmZpZywgZGV2X25hbWUoJnVyYi0+ZGV2LT5kZXYpKTsKLQorCWVyciA9IHVzYl9zZXRfY29uZmlndXJhdGlvbihzZGV2LT51ZGV2LCBjb25maWcpOworCWlmIChlcnIgJiYgZXJyICE9IC1FTk9ERVYpCisJCWRldl9lcnIoJnNkZXYtPnVkZXYtPmRldiwgImNhbid0IHNldCBjb25maWcgIyVkLCBlcnJvciAlZFxuIiwKKwkJCWNvbmZpZywgZXJyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTUwLDcgKzUzOCw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgdXNiaXBfaGVhZGVyIHBkdTsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYgPSBjb250YWluZXJfb2YodWQsIHN0cnVjdCBzdHViX2RldmljZSwgdWQpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzZGV2LT5pbnRlcmZhY2UtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2Rldi0+dWRldi0+ZGV2OwogCiAJdXNiaXBfZGJnX3N0dWJfcngoIkVudGVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKaW5kZXggY2Q1MzI2YS4uMTYyMjU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCkBAIC03NCwxMiArNzQsMTIgQEAKIAkJLyogT0sgKi8KIAkJYnJlYWs7CiAJY2FzZSAtRU5PRU5UOgotCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgInN0b3BwZWQgYnkgYSBjYWxsIHRvIHVzYl9raWxsX3VyYigpICIKLQkJCSAiYmVjYXVzZSBvZiBjbGVhbmluZyB1cCBhIHZpcnR1YWwgY29ubmVjdGlvblxuIik7CisJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LAorCQkJICJzdG9wcGVkIGJ5IGEgY2FsbCB0byB1c2Jfa2lsbF91cmIoKSBiZWNhdXNlIG9mIGNsZWFuaW5nIHVwIGEgdmlydHVhbCBjb25uZWN0aW9uXG4iKTsKIAkJcmV0dXJuOwogCWNhc2UgLUVDT05OUkVTRVQ6Ci0JCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAidW5saW5rZWQgYnkgYSBjYWxsIHRvICIKLQkJCSAidXNiX3VubGlua191cmIoKVxuIik7CisJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LAorCQkJICJ1bmxpbmtlZCBieSBhIGNhbGwgdG8gdXNiX3VubGlua191cmIoKVxuIik7CiAJCWJyZWFrOwogCWNhc2UgLUVQSVBFOgogCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgImVuZHBvaW50ICVkIGlzIHN0YWxsZWRcbiIsCkBAIC04OSw4ICs4OSw5IEBACiAJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAiZGV2aWNlIHJlbW92ZWQ/XG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJ1cmIgY29tcGxldGlvbiB3aXRoIG5vbi16ZXJvIHN0YXR1cyAiCi0JCQkgIiVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LAorCQkJICJ1cmIgY29tcGxldGlvbiB3aXRoIG5vbi16ZXJvIHN0YXR1cyAlZFxuIiwKKwkJCSB1cmItPnN0YXR1cyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjI4LDggKzIyOSw3IEBACiAKIAkJCWlmICh0eHNpemUgIT0gc2l6ZW9mKHBkdV9oZWFkZXIpICsgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCQkJZGV2X2Vycigmc2Rldi0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSJhY3R1YWwgbGVuZ3RoIG9mIHVyYiAlZCBkb2VzIG5vdCAiCi0JCQkJCSJtYXRjaCBpc28gcGFja2V0IHNpemVzICV6dVxuIiwKKwkJCQkJImFjdHVhbCBsZW5ndGggb2YgdXJiICVkIGRvZXMgbm90IG1hdGNoIGlzbyBwYWNrZXQgc2l6ZXMgJXp1XG4iLAogCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgsCiAJCQkJCXR4c2l6ZS1zaXplb2YocGR1X2hlYWRlcikpOwogCQkJCWtmcmVlKGlvdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdWFwaS91c2JpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VhcGkvdXNiaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVkYjMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VhcGkvdXNiaXAuaApAQCAtMCwwICsxLDI2IEBACisvKgorICoJdXNiaXAuaAorICoKKyAqCVVTQklQIHVhcGkgZGVmaW5lcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBldGMuCisqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX1VTQklQX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfVVNCSVBfSAorCisvKiB1c2JpcCBkZXZpY2Ugc3RhdHVzIC0gZXhwb3J0ZWQgaW4gdXNiaXAgZGV2aWNlIHN5c2ZzIHN0YXR1cyAqLworZW51bSB1c2JpcF9kZXZpY2Vfc3RhdHVzIHsKKwkvKiBzZGV2IGlzIGF2YWlsYWJsZS4gKi8KKwlTREVWX1NUX0FWQUlMQUJMRSA9IDB4MDEsCisJLyogc2RldiBpcyBub3cgdXNlZC4gKi8KKwlTREVWX1NUX1VTRUQsCisJLyogc2RldiBpcyB1bnVzYWJsZSBiZWNhdXNlIG9mIGEgZmF0YWwgZXJyb3IuICovCisJU0RFVl9TVF9FUlJPUiwKKworCS8qIHZkZXYgZG9lcyBub3QgY29ubmVjdCBhIHJlbW90ZSBkZXZpY2UuICovCisJVkRFVl9TVF9OVUxMLAorCS8qIHZkZXYgaXMgdXNlZCwgYnV0IHRoZSBVU0IgYWRkcmVzcyBpcyBub3QgYXNzaWduZWQgeWV0ICovCisJVkRFVl9TVF9OT1RBU1NJR05FRCwKKwlWREVWX1NUX1VTRUQsCisJVkRFVl9TVF9FUlJPUgorfTsKKyNlbmRpZiAvKiBfVUFQSV9MSU5VWF9VU0JJUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMKaW5kZXggOTY1NTJlMy4uMTg0ZmE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYwpAQCAtNTUsNyArNTUsOCBAQAogCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAogCQkJCSBzaXplX3QgY291bnQpCiB7Ci0Jc3NjYW5mKGJ1ZiwgIiVseCIsICZ1c2JpcF9kZWJ1Z19mbGFnKTsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVseCIsICZ1c2JpcF9kZWJ1Z19mbGFnKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gY291bnQ7CiB9CiBERVZJQ0VfQVRUUl9SVyh1c2JpcF9kZWJ1Zyk7CkBAIC05OSwyNiArMTAwLDggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdWRldi0+ZGV2OwogCWludCBpOwogCi0JZGV2X2RiZyhkZXYsICIgICAgICAgZGV2bnVtKCVkKSBkZXZwYXRoKCVzKSAiLAotCQl1ZGV2LT5kZXZudW0sIHVkZXYtPmRldnBhdGgpOwotCi0Jc3dpdGNoICh1ZGV2LT5zcGVlZCkgewotCWNhc2UgVVNCX1NQRUVEX0hJR0g6Ci0JCXByX2RlYnVnKCJTUERfSElHSCAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJcHJfZGVidWcoIlNQRF9GVUxMICIpOwotCQlicmVhazsKLQljYXNlIFVTQl9TUEVFRF9MT1c6Ci0JCXByX2RlYnVnKCJTUERfTE9XICIpOwotCQlicmVhazsKLQljYXNlIFVTQl9TUEVFRF9VTktOT1dOOgotCQlwcl9kZWJ1ZygiU1BEX1VOS05PV04gIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCJTUERfRVJST1IgIik7Ci0JCWJyZWFrOwotCX0KKwlkZXZfZGJnKGRldiwgIiAgICAgICBkZXZudW0oJWQpIGRldnBhdGgoJXMpIHVzYiBzcGVlZCglcykiLAorCQl1ZGV2LT5kZXZudW0sIHVkZXYtPmRldnBhdGgsIHVzYl9zcGVlZF9zdHJpbmcodWRldi0+c3BlZWQpKTsKIAogCXByX2RlYnVnKCJ0dCAlcCwgdHRwb3J0ICVkXG4iLCB1ZGV2LT50dCwgdWRldi0+dHRwb3J0KTsKIApAQCAtMTk1LDggKzE3OCw4IEBACiAJfQogCiAJcHJfZGVidWcoIiAgICAgICAiKTsKLQlwcl9kZWJ1ZygiYlJlcXVlc3RUeXBlKCUwMlgpIGJSZXF1ZXN0KCUwMlgpIHdWYWx1ZSglMDRYKSB3SW5kZXgoJTA0WCkgIgotCQkgIndMZW5ndGgoJTA0WCkgIiwgY21kLT5iUmVxdWVzdFR5cGUsIGNtZC0+YlJlcXVlc3QsCisJcHJfZGVidWcoImJSZXF1ZXN0VHlwZSglMDJYKSBiUmVxdWVzdCglMDJYKSB3VmFsdWUoJTA0WCkgd0luZGV4KCUwNFgpIHdMZW5ndGgoJTA0WCkgIiwKKwkJIGNtZC0+YlJlcXVlc3RUeXBlLCBjbWQtPmJSZXF1ZXN0LAogCQkgY21kLT53VmFsdWUsIGNtZC0+d0luZGV4LCBjbWQtPndMZW5ndGgpOwogCXByX2RlYnVnKCJcbiAgICAgICAiKTsKIApAQCAtMzA3LDggKzI5MCw3IEBACiAKIAlzd2l0Y2ggKHBkdS0+YmFzZS5jb21tYW5kKSB7CiAJY2FzZSBVU0JJUF9DTURfU1VCTUlUOgotCQlwcl9kZWJ1ZygiVVNCSVBfQ01EX1NVQk1JVDogIgotCQkJICJ4X2ZsYWdzICV1IHhfbGVuICV1IHNmICV1ICNwICVkIGl2ICVkXG4iLAorCQlwcl9kZWJ1ZygiVVNCSVBfQ01EX1NVQk1JVDogeF9mbGFncyAldSB4X2xlbiAldSBzZiAldSAjcCAlZCBpdiAlZFxuIiwKIAkJCSBwZHUtPnUuY21kX3N1Ym1pdC50cmFuc2Zlcl9mbGFncywKIAkJCSBwZHUtPnUuY21kX3N1Ym1pdC50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJIHBkdS0+dS5jbWRfc3VibWl0LnN0YXJ0X2ZyYW1lLApAQCAtNzA1LDggKzY4Nyw3IEBACiAKIAlpZiAodG90YWxfbGVuZ3RoICE9IHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAotCQkJInRvdGFsIGxlbmd0aCBvZiBpc28gcGFja2V0cyAlZCBub3QgZXF1YWwgdG8gYWN0dWFsICIKLQkJCSJsZW5ndGggb2YgYnVmZmVyICVkXG4iLAorCQkJInRvdGFsIGxlbmd0aCBvZiBpc28gcGFja2V0cyAlZCBub3QgZXF1YWwgdG8gYWN0dWFsIGxlbmd0aCBvZiBidWZmZXIgJWRcbiIsCiAJCQl0b3RhbF9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAkJaWYgKHVkLT5zaWRlID09IFVTQklQX1NUVUIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmgKaW5kZXggN2U2YzU0My4uNzMyZmI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uaApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgInVhcGkvdXNiaXAuaCIKIAogI2RlZmluZSBVU0JJUF9WRVJTSU9OICIxLjAuMCIKIApAQCAtMjM1LDIyICsyMzYsNiBAQAogCVVTQklQX1NUVUIsCiB9OwogCi1lbnVtIHVzYmlwX3N0YXR1cyB7Ci0JLyogc2RldiBpcyBhdmFpbGFibGUuICovCi0JU0RFVl9TVF9BVkFJTEFCTEUgPSAweDAxLAotCS8qIHNkZXYgaXMgbm93IHVzZWQuICovCi0JU0RFVl9TVF9VU0VELAotCS8qIHNkZXYgaXMgdW51c2FibGUgYmVjYXVzZSBvZiBhIGZhdGFsIGVycm9yLiAqLwotCVNERVZfU1RfRVJST1IsCi0KLQkvKiB2ZGV2IGRvZXMgbm90IGNvbm5lY3QgYSByZW1vdGUgZGV2aWNlLiAqLwotCVZERVZfU1RfTlVMTCwKLQkvKiB2ZGV2IGlzIHVzZWQsIGJ1dCB0aGUgVVNCIGFkZHJlc3MgaXMgbm90IGFzc2lnbmVkIHlldCAqLwotCVZERVZfU1RfTk9UQVNTSUdORUQsCi0JVkRFVl9TVF9VU0VELAotCVZERVZfU1RfRVJST1IKLX07Ci0KIC8qIGV2ZW50IGhhbmRsZXIgKi8KICNkZWZpbmUgVVNCSVBfRUhfU0hVVERPV04JKDEgPDwgMCkKICNkZWZpbmUgVVNCSVBfRUhfQllFCQkoMSA8PCAxKQpAQCAtMjcxLDcgKzI1Niw3IEBACiAvKiBhIGNvbW1vbiBzdHJ1Y3R1cmUgZm9yIHN0dWJfZGV2aWNlIGFuZCB2aGNpX2RldmljZSAqLwogc3RydWN0IHVzYmlwX2RldmljZSB7CiAJZW51bSB1c2JpcF9zaWRlIHNpZGU7Ci0JZW51bSB1c2JpcF9zdGF0dXMgc3RhdHVzOworCWVudW0gdXNiaXBfZGV2aWNlX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBsb2NrIGZvciBzdGF0dXMgKi8KIAlzcGlubG9ja190IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvUkVBRE1FCmluZGV4IDAwYTE2NTguLmY1MjhiYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvUkVBRE1FCkBAIC05LDggKzksOCBAQAogICAgIC0gVVNCL0lQIGRldmljZSBkcml2ZXJzCiAJRm91bmQgaW4gdGhlIHN0YWdpbmcgZGlyZWN0b3J5IG9mIHRoZSBMaW51eCBrZXJuZWwuCiAKLSAgICAtIHN5c2ZzdXRpbHMgPj0gMi4wLjAKLQlzeXNmc3V0aWxzIGxpYnJhcnkKKyAgICAtIGxpYnVkZXYgPj0gMi4wCisJbGlidWRldiBsaWJyYXJ5CiAKICAgICAtIGxpYndyYXAwLWRldgogCXRjcCB3cmFwcGVyIGxpYnJhcnkKQEAgLTE5LDYgKzE5LDEwIEBACiAKICAgICAtIGxpYnRvb2wsIGF1dG9tYWtlID49IDEuOSwgYXV0b2NvbmYgPj0gMi41LjAsIHBrZy1jb25maWcKIAorW09wdGlvbmFsXQorICAgIC0gaHdkYXRhCisgICAgICAgIENvbnRhaW5zIFVTQiBkZXZpY2UgaWRlbnRpZmljYXRpb24gZGF0YS4KKwogCiBbSW5zdGFsbF0KICAgICAwLiBHZW5lcmF0ZSBjb25maWd1cmF0aW9uIHNjcmlwdHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvY29uZmlndXJlLmFjCmluZGV4IDBlZTVkOTIuLjYwN2QwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvY29uZmlndXJlLmFjCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvY29uZmlndXJlLmFjCkBAIC0xLDcgKzEsNyBAQAogZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCiAKIEFDX1BSRVJFUSgyLjU5KQotQUNfSU5JVChbdXNiaXAtdXRpbHNdLCBbMS4xLjFdLCBbbGludXgtdXNiQHZnZXIua2VybmVsLm9yZ10pCitBQ19JTklUKFt1c2JpcC11dGlsc10sIFsyLjBdLCBbbGludXgtdXNiQHZnZXIua2VybmVsLm9yZ10pCiBBQ19ERUZJTkUoW1VTQklQX1ZFUlNJT05dLCBbMHgwMDAwMDExMV0sIFtiaW5hcnktY29kZWQgZGVjaW1hbCB2ZXJzaW9uIG51bWJlcl0pCiAKIENVUlJFTlQ9MApAQCAtNDQsMTEgKzQ0LDExIEBACiBBQ19DSEVDS19GVU5DUyhbbWVtc2V0IG1rZGlyIHJlZ2NvbXAgc29ja2V0IHN0cmNociBzdHJlcnJvciBzdHJzdHIgZG5sCiAJCXN0cnRvdWxdKQogCi1BQ19DSEVDS19IRUFERVIoW3N5c2ZzL2xpYnN5c2ZzLmhdLAotCQlbQUNfQ0hFQ0tfTElCKFtzeXNmc10sIFtzeXNmc19vcGVuX2RpcmVjdG9yeV9saXN0XSwKLQkJCSAgICAgIFtMSUJTPSIkTElCUyAtbHN5c2ZzIl0sCi0JCQkgICAgICBbQUNfTVNHX0VSUk9SKFtNaXNzaW5nIHN5c2ZzMiBsaWJyYXJ5IV0pXSldLAotCQlbQUNfTVNHX0VSUk9SKFtNaXNzaW5nIC91c3IvaW5jbHVkZS9zeXNmcy9saWJzeXNmcy5oXSldKQorQUNfQ0hFQ0tfSEVBREVSKFtsaWJ1ZGV2LmhdLAorCQlbQUNfQ0hFQ0tfTElCKFt1ZGV2XSwgW3VkZXZfbmV3XSwKKwkJCSAgICAgIFtMSUJTPSIkTElCUyAtbHVkZXYiXSwKKwkJCSAgICAgIFtBQ19NU0dfRVJST1IoW01pc3NpbmcgdWRldiBsaWJyYXJ5IV0pXSldLAorCQlbQUNfTVNHX0VSUk9SKFtNaXNzaW5nIC91c3IvaW5jbHVkZS9saWJ1ZGV2LmhdKV0pCiAKICMgQ2hlY2tzIGZvciBsaWJ3cmFwIGxpYnJhcnkuCiBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gdXNlIHRoZSBsaWJ3cmFwIChUQ1Agd3JhcHBlcnMpIGxpYnJhcnldKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0gYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9NYWtlZmlsZS5hbQppbmRleCA0OTIxMTg5Li43YzhmOGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9NYWtlZmlsZS5hbQorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9NYWtlZmlsZS5hbQpAQCAtNCw0ICs0LDUgQEAKIAogbGliX0xUTElCUkFSSUVTIDo9IGxpYnVzYmlwLmxhCiBsaWJ1c2JpcF9sYV9TT1VSQ0VTIDo9IG5hbWVzLmMgbmFtZXMuaCB1c2JpcF9ob3N0X2RyaXZlci5jIHVzYmlwX2hvc3RfZHJpdmVyLmggXAotCQkgICAgICAgdXNiaXBfY29tbW9uLmMgdXNiaXBfY29tbW9uLmggdmhjaV9kcml2ZXIuYyB2aGNpX2RyaXZlci5oCisJCSAgICAgICB1c2JpcF9jb21tb24uYyB1c2JpcF9jb21tb24uaCB2aGNpX2RyaXZlci5jIHZoY2lfZHJpdmVyLmggXAorCQkgICAgICAgc3lzZnNfdXRpbHMuYyBzeXNmc191dGlscy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9saXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYzkzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL2xpc3QuaApAQCAtMCwwICsxLDEzNiBAQAorI2lmbmRlZiBfTElTVF9ICisjZGVmaW5lIF9MSVNUX0gKKworLyogU3RyaXBwZWQgZG93biBpbXBsZW1lbnRhdGlvbiBvZiBsaW5rZWQgbGlzdCB0YWtlbgorICogZnJvbSB0aGUgTGludXggS2VybmVsLgorICovCisKKy8qCisgKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFNvbWUgb2YgdGhlIGludGVybmFsIGZ1bmN0aW9ucyAoIl9feHh4IikgYXJlIHVzZWZ1bCB3aGVuCisgKiBtYW5pcHVsYXRpbmcgd2hvbGUgbGlzdHMgcmF0aGVyIHRoYW4gc2luZ2xlIGVudHJpZXMsIGFzCisgKiBzb21ldGltZXMgd2UgYWxyZWFkeSBrbm93IHRoZSBuZXh0L3ByZXYgZW50cmllcyBhbmQgd2UgY2FuCisgKiBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBieSB1c2luZyB0aGVtIGRpcmVjdGx5IHJhdGhlciB0aGFuCisgKiB1c2luZyB0aGUgZ2VuZXJpYyBzaW5nbGUtZW50cnkgcm91dGluZXMuCisgKi8KKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExJU1RfSEVBRF9JTklUKG5hbWUpIHsgJihuYW1lKSwgJihuYW1lKSB9CisKKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSBMSVNUX0hFQURfSU5JVChuYW1lKQorCitzdGF0aWMgaW5saW5lIHZvaWQgSU5JVF9MSVNUX0hFQUQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlsaXN0LT5uZXh0ID0gbGlzdDsKKwlsaXN0LT5wcmV2ID0gbGlzdDsKK30KKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnByZXYsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0KQoreworCW5leHQtPnByZXYgPSBuZXc7CisJbmV3LT5uZXh0ID0gbmV4dDsKKwluZXctPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXc7Cit9CisKKy8qKgorICogbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxpc3QgaGVhZCB0byBhZGQgaXQgYWZ0ZXIKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyBnb29kIGZvciBpbXBsZW1lbnRpbmcgc3RhY2tzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxpc3QgZW50cnkgYnkgbWFraW5nIHRoZSBwcmV2L25leHQgZW50cmllcworICogcG9pbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwgc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5leHQ7Cit9CisKKyNkZWZpbmUgUE9JU09OX1BPSU5URVJfREVMVEEgMAorI2RlZmluZSBMSVNUX1BPSVNPTjEgICgodm9pZCAqKSAweDAwMTAwMTAwICsgUE9JU09OX1BPSU5URVJfREVMVEEpCisjZGVmaW5lIExJU1RfUE9JU09OMiAgKCh2b2lkICopIDB4MDAyMDAyMDAgKyBQT0lTT05fUE9JTlRFUl9ERUxUQSkKKworLyoqCisgKiBsaXN0X2RlbCAtIGRlbGV0ZXMgZW50cnkgZnJvbSBsaXN0LgorICogQGVudHJ5OiB0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGUgbGlzdC4KKyAqIE5vdGU6IGxpc3RfZW1wdHkoKSBvbiBlbnRyeSBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzLCB0aGUgZW50cnkgaXMKKyAqIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9kZWxfZW50cnkoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCWVudHJ5LT5uZXh0ID0gTElTVF9QT0lTT04xOworCWVudHJ5LT5wcmV2ID0gTElTVF9QT0lTT04yOworfQorCisvKioKKyAqIGxpc3RfZW50cnkgLSBnZXQgdGhlIHN0cnVjdCBmb3IgdGhpcyBlbnRyeQorICogQHB0cjoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHBvaW50ZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwljb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCisvKioKKyAqIGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9zYWZlIC0gaXRlcmF0ZSBvdmVyIGEgbGlzdCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIG4gPSBwb3MtPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKwkJcG9zID0gbiwgbiA9IHBvcy0+bmV4dCkKKworI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgoc2l6ZV90KSAmKChUWVBFICopMCktPk1FTUJFUikKKworLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqIEBwdHI6CXRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCisJY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOwlcCisJKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9zeXNmc191dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFjODhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJzeXNmc191dGlscy5oIgorI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgorCitpbnQgd3JpdGVfc3lzZnNfYXR0cmlidXRlKGNvbnN0IGNoYXIgKmF0dHJfcGF0aCwgY29uc3QgY2hhciAqbmV3X3ZhbHVlLAorCQkJICBzaXplX3QgbGVuKQoreworCWludCBmZDsKKwlpbnQgbGVuZ3RoOworCisJZmQgPSBvcGVuKGF0dHJfcGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZGJnKCJlcnJvciBvcGVuaW5nIGF0dHJpYnV0ZSAlcyIsIGF0dHJfcGF0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW5ndGggPSB3cml0ZShmZCwgbmV3X3ZhbHVlLCBsZW4pOworCWlmIChsZW5ndGggPCAwKSB7CisJCWRiZygiZXJyb3Igd3JpdGluZyB0byBhdHRyaWJ1dGUgJXMiLCBhdHRyX3BhdGgpOworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3N5c2ZzX3V0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9zeXNmc191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYWMxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9zeXNmc191dGlscy5oCkBAIC0wLDAgKzEsOCBAQAorCisjaWZuZGVmIF9fU1lTRlNfVVRJTFNfSAorI2RlZmluZSBfX1NZU0ZTX1VUSUxTX0gKKworaW50IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShjb25zdCBjaGFyICphdHRyX3BhdGgsIGNvbnN0IGNoYXIgKm5ld192YWx1ZSwKKwkJCSAgc2l6ZV90IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9jb21tb24uYwppbmRleCA2NmYwM2NjLi4yMzhiZjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9jb21tb24uYwpAQCAtMiw2ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IFRha2FoaXJvIEhpcm9mdWNoaQogICovCiAKKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAibmFtZXMuaCIKIApAQCAtMTIsNiArMTMsOCBAQAogaW50IHVzYmlwX3VzZV9zdGRlcnI7CiBpbnQgdXNiaXBfdXNlX2RlYnVnOwogCitleHRlcm4gc3RydWN0IHVkZXYgKnVkZXZfY29udGV4dDsKKwogc3RydWN0IHNwZWVkX3N0cmluZyB7CiAJaW50IG51bTsKIAljaGFyICpzcGVlZDsKQEAgLTIzLDYgKzI2LDggQEAKIAl7IFVTQl9TUEVFRF9MT1csICAiMS41IiwgIkxvdyBTcGVlZCgxLjVNYnBzKSIgIH0sCiAJeyBVU0JfU1BFRURfRlVMTCwgIjEyIiwgICJGdWxsIFNwZWVkKDEyTWJwcykiIH0sCiAJeyBVU0JfU1BFRURfSElHSCwgIjQ4MCIsICJIaWdoIFNwZWVkKDQ4ME1icHMpIiB9LAorCXsgVVNCX1NQRUVEX1dJUkVMRVNTLCAiNTMuMy00ODAiLCAiV2lyZWxlc3MifSwKKwl7IFVTQl9TUEVFRF9TVVBFUiwgIjUwMDAiLCAiU3VwZXIgU3BlZWQoNTAwME1icHMpIiB9LAogCXsgMCwgTlVMTCwgTlVMTCB9CiB9OwogCkBAIC0xMDksNzUgKzExNCw2MSBAQAogfQogCiAKLWludCByZWFkX2F0dHJfdmFsdWUoc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAoraW50IHJlYWRfYXR0cl92YWx1ZShzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCkKIHsKLQljaGFyIGF0dHJwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyOworCWNvbnN0IGNoYXIgKmF0dHI7CiAJaW50IG51bSA9IDA7CiAJaW50IHJldDsKIAotCXNucHJpbnRmKGF0dHJwYXRoLCBzaXplb2YoYXR0cnBhdGgpLCAiJXMvJXMiLCBkZXYtPnBhdGgsIG5hbWUpOwotCi0JYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGF0dHJwYXRoKTsKKwlhdHRyID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCBuYW1lKTsKIAlpZiAoIWF0dHIpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2F0dHJpYnV0ZSBmYWlsZWQ6ICVzIiwgYXR0cnBhdGgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX3JlYWRfYXR0cmlidXRlIGZhaWxlZCIpOworCQllcnIoInVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlIGZhaWxlZCIpOwogCQlnb3RvIGVycjsKIAl9CiAKLQlyZXQgPSBzc2NhbmYoYXR0ci0+dmFsdWUsIGZvcm1hdCwgJm51bSk7CisJLyogVGhlIGNsaWVudCBjaG9vc2VzIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgorCSAqIHdoZW4gYXR0YWNoaW5nIGl0IHNvIHJpZ2h0IGFmdGVyIGJlaW5nIGJvdW5kCisJICogdG8gdXNiaXAtaG9zdCBvbiB0aGUgc2VydmVyIHRoZSBkZXZpY2Ugd2lsbAorCSAqIGhhdmUgbm8gY29uZmlndXJhdGlvbi4KKwkgKiBUaGVyZWZvcmUsIGF0dHJpYnV0ZXMgc3VjaCBhcyBiQ29uZmlndXJhdGlvblZhbHVlCisJICogYW5kIGJOdW1JbnRlcmZhY2VzIHdpbGwgbm90IGV4aXN0IGFuZCBzc2NhbmYgd2lsbAorCSAqIGZhaWwuIENoZWNrIGZvciB0aGVzZSBjYXNlcyBhbmQgZG9uJ3QgdHJlYXQgdGhlbQorCSAqIGFzIGVycm9ycy4KKwkgKi8KKworCXJldCA9IHNzY2FuZihhdHRyLCBmb3JtYXQsICZudW0pOwogCWlmIChyZXQgPCAxKSB7Ci0JCWRiZygic3NjYW5mIGZhaWxlZCIpOwotCQlnb3RvIGVycjsKKwkJaWYgKHN0cmNtcChuYW1lLCAiYkNvbmZpZ3VyYXRpb25WYWx1ZSIpICYmCisJCQkJc3RyY21wKG5hbWUsICJiTnVtSW50ZXJmYWNlcyIpKSB7CisJCQllcnIoInNzY2FuZiBmYWlsZWQgZm9yIGF0dHJpYnV0ZSAlcyIsIG5hbWUpOworCQkJZ290byBlcnI7CisJCX0KIAl9CiAKIGVycjoKLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CiAKIAlyZXR1cm4gbnVtOwogfQogCiAKLWludCByZWFkX2F0dHJfc3BlZWQoc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2KQoraW50IHJlYWRfYXR0cl9zcGVlZChzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldikKIHsKLQljaGFyIGF0dHJwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyOwotCWNoYXIgc3BlZWRbMTAwXTsKLQlpbnQgcmV0OworCWNvbnN0IGNoYXIgKnNwZWVkOwogCi0Jc25wcmludGYoYXR0cnBhdGgsIHNpemVvZihhdHRycGF0aCksICIlcy8lcyIsIGRldi0+cGF0aCwgInNwZWVkIik7Ci0KLQlhdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUoYXR0cnBhdGgpOwotCWlmICghYXR0cikgewotCQlkYmcoInN5c2ZzX29wZW5fYXR0cmlidXRlIGZhaWxlZDogJXMiLCBhdHRycGF0aCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldCA9IHN5c2ZzX3JlYWRfYXR0cmlidXRlKGF0dHIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3lzZnNfcmVhZF9hdHRyaWJ1dGUgZmFpbGVkIik7CisJc3BlZWQgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZShkZXYsICJzcGVlZCIpOworCWlmICghc3BlZWQpIHsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gc3NjYW5mKGF0dHItPnZhbHVlLCAiJTk5c1xuIiwgc3BlZWQpOwotCWlmIChyZXQgPCAxKSB7Ci0JCWRiZygic3NjYW5mIGZhaWxlZCIpOwotCQlnb3RvIGVycjsKLQl9Ci1lcnI6Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOwotCiAJZm9yIChpbnQgaSA9IDA7IHNwZWVkX3N0cmluZ3NbaV0uc3BlZWQgIT0gTlVMTDsgaSsrKSB7CiAJCWlmICghc3RyY21wKHNwZWVkLCBzcGVlZF9zdHJpbmdzW2ldLnNwZWVkKSkKIAkJCXJldHVybiBzcGVlZF9zdHJpbmdzW2ldLm51bTsKIAl9CiAKK2VycjoKKwogCXJldHVybiBVU0JfU1BFRURfVU5LTk9XTjsKIH0KIApAQCAtMTg4LDkgKzE3OSwxMCBAQAogCX0gd2hpbGUgKDApCiAKIAotaW50IHJlYWRfdXNiX2RldmljZShzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqdWRldikKK2ludCByZWFkX3VzYl9kZXZpY2Uoc3RydWN0IHVkZXZfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqdWRldikKIHsKIAl1aW50MzJfdCBidXNudW0sIGRldm51bTsKKwljb25zdCBjaGFyICpwYXRoLCAqbmFtZTsKIAogCVJFQURfQVRUUih1ZGV2LCB1aW50OF90LCAgc2RldiwgYkRldmljZUNsYXNzLAkJIiUwMnhcbiIpOwogCVJFQURfQVRUUih1ZGV2LCB1aW50OF90LCAgc2RldiwgYkRldmljZVN1YkNsYXNzLAkiJTAyeFxuIik7CkBAIC0yMDcsMTAgKzE5OSwxMyBAQAogCVJFQURfQVRUUih1ZGV2LCB1aW50OF90LCAgc2RldiwgZGV2bnVtLAkJCSIlZFxuIik7CiAJdWRldi0+c3BlZWQgPSByZWFkX2F0dHJfc3BlZWQoc2Rldik7CiAKLQlzdHJuY3B5KHVkZXYtPnBhdGgsICBzZGV2LT5wYXRoLCAgU1lTRlNfUEFUSF9NQVgpOwotCXN0cm5jcHkodWRldi0+YnVzaWQsIHNkZXYtPm5hbWUsIFNZU0ZTX0JVU19JRF9TSVpFKTsKKwlwYXRoID0gdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgoc2Rldik7CisJbmFtZSA9IHVkZXZfZGV2aWNlX2dldF9zeXNuYW1lKHNkZXYpOwogCi0Jc3NjYW5mKHNkZXYtPm5hbWUsICIldS0ldSIsICZidXNudW0sICZkZXZudW0pOworCXN0cm5jcHkodWRldi0+cGF0aCwgIHBhdGgsICBTWVNGU19QQVRIX01BWCk7CisJc3RybmNweSh1ZGV2LT5idXNpZCwgbmFtZSwgU1lTRlNfQlVTX0lEX1NJWkUpOworCisJc3NjYW5mKG5hbWUsICIldS0ldSIsICZidXNudW0sICZkZXZudW0pOwogCXVkZXYtPmJ1c251bSA9IGJ1c251bTsKIAogCXJldHVybiAwOwpAQCAtMjIwLDEzICsyMTUsMTMgQEAKIAkJICAgICAgIHN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlICp1aW5mKQogewogCWNoYXIgYnVzaWRbU1lTRlNfQlVTX0lEX1NJWkVdOwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKnNpZjsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKnNpZjsKIAogCXNwcmludGYoYnVzaWQsICIlczolZC4lZCIsIHVkZXYtPmJ1c2lkLCB1ZGV2LT5iQ29uZmlndXJhdGlvblZhbHVlLCBpKTsKIAotCXNpZiA9IHN5c2ZzX29wZW5fZGV2aWNlKCJ1c2IiLCBidXNpZCk7CisJc2lmID0gdWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUodWRldl9jb250ZXh0LCAidXNiIiwgYnVzaWQpOwogCWlmICghc2lmKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UoXCJ1c2JcIiwgXCIlc1wiKSBmYWlsZWQiLCBidXNpZCk7CisJCWVycigidWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUgJXMgZmFpbGVkIiwgYnVzaWQpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMzQsOCArMjI5LDYgQEAKIAlSRUFEX0FUVFIodWluZiwgdWludDhfdCwgIHNpZiwgYkludGVyZmFjZVN1YkNsYXNzLAkiJTAyeFxuIik7CiAJUkVBRF9BVFRSKHVpbmYsIHVpbnQ4X3QsICBzaWYsIGJJbnRlcmZhY2VQcm90b2NvbCwJIiUwMnhcbiIpOwogCi0Jc3lzZnNfY2xvc2VfZGV2aWNlKHNpZik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9jb21tb24uaAppbmRleCA5MzhhZDFjLi4yM2JlODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9jb21tb24uaApAQCAtNSw3ICs1LDcgQEAKICNpZm5kZWYgX19VU0JJUF9DT01NT05fSAogI2RlZmluZSBfX1VTQklQX0NPTU1PTl9ICiAKLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgorI2luY2x1ZGUgPGxpYnVkZXYuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xNCw2ICsxNCw4IEBACiAKICNpbmNsdWRlIDxzeXNsb2cuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSAiLi4vLi4vdWFwaS91c2JpcC5oIgogCiAjaWZuZGVmIFVTQklEU19GSUxFCiAjZGVmaW5lIFVTQklEU19GSUxFICIvdXNyL3NoYXJlL2h3ZGF0YS91c2IuaWRzIgpAQCAtMjgsNiArMzAsMTUgQEAKICNkZWZpbmUgVVNCSVBfSE9TVF9EUlZfTkFNRQkidXNiaXAtaG9zdCIKICNkZWZpbmUgVVNCSVBfVkhDSV9EUlZfTkFNRQkidmhjaV9oY2QiCiAKKy8qIHN5c2ZzIGNvbnN0YW50cyAqLworI2RlZmluZSBTWVNGU19NTlRfUEFUSCAgICAgICAgICIvc3lzIgorI2RlZmluZSBTWVNGU19CVVNfTkFNRSAgICAgICAgICJidXMiCisjZGVmaW5lIFNZU0ZTX0JVU19UWVBFICAgICAgICAgInVzYiIKKyNkZWZpbmUgU1lTRlNfRFJJVkVSU19OQU1FICAgICAiZHJpdmVycyIKKworI2RlZmluZSBTWVNGU19QQVRIX01BWAkJMjU2CisjZGVmaW5lIFNZU0ZTX0JVU19JRF9TSVpFCTMyCisKIGV4dGVybiBpbnQgdXNiaXBfdXNlX3N5c2xvZzsKIGV4dGVybiBpbnQgdXNiaXBfdXNlX3N0ZGVycjsKIGV4dGVybiBpbnQgdXNiaXBfdXNlX2RlYnVnIDsKQEAgLTc2LDMwICs4Nyw2IEBACiAJCWFib3J0KCk7CQkJCVwKIAl9IHdoaWxlICgwKQogCi1lbnVtIHVzYl9kZXZpY2Vfc3BlZWQgewotCVVTQl9TUEVFRF9VTktOT1dOID0gMCwgICAgICAgICAgICAgICAgICAvKiBlbnVtZXJhdGluZyAqLwotCVVTQl9TUEVFRF9MT1csIFVTQl9TUEVFRF9GVUxMLCAgICAgICAgICAvKiB1c2IgMS4xICovCi0JVVNCX1NQRUVEX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzYiAyLjAgKi8KLQlVU0JfU1BFRURfVkFSSUFCTEUgICAgICAgICAgICAgICAgICAgICAgLyogd2lyZWxlc3MgKHVzYiAyLjUpICovCi19OwotCi0vKiBGSVhNRTogaG93IHRvIHN5bmMgd2l0aCBkcml2ZXJzL3VzYmlwX2NvbW1vbi5oID8gKi8KLWVudW0gdXNiaXBfZGV2aWNlX3N0YXR1cyB7Ci0JLyogc2RldiBpcyBhdmFpbGFibGUuICovCi0JU0RFVl9TVF9BVkFJTEFCTEUgPSAweDAxLAotCS8qIHNkZXYgaXMgbm93IHVzZWQuICovCi0JU0RFVl9TVF9VU0VELAotCS8qIHNkZXYgaXMgdW51c2FibGUgYmVjYXVzZSBvZiBhIGZhdGFsIGVycm9yLiAqLwotCVNERVZfU1RfRVJST1IsCi0KLQkvKiB2ZGV2IGRvZXMgbm90IGNvbm5lY3QgYSByZW1vdGUgZGV2aWNlLiAqLwotCVZERVZfU1RfTlVMTCwKLQkvKiB2ZGV2IGlzIHVzZWQsIGJ1dCB0aGUgVVNCIGFkZHJlc3MgaXMgbm90IGFzc2lnbmVkIHlldCAqLwotCVZERVZfU1RfTk9UQVNTSUdORUQsCi0JVkRFVl9TVF9VU0VELAotCVZERVZfU1RfRVJST1IKLX07Ci0KIHN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlIHsKIAl1aW50OF90IGJJbnRlcmZhY2VDbGFzczsKIAl1aW50OF90IGJJbnRlcmZhY2VTdWJDbGFzczsKQEAgLTEzMSw4ICsxMTgsOCBAQAogCiB2b2lkIGR1bXBfdXNiX2ludGVyZmFjZShzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSAqKTsKIHZvaWQgZHVtcF91c2JfZGV2aWNlKHN0cnVjdCB1c2JpcF91c2JfZGV2aWNlICopOwotaW50IHJlYWRfdXNiX2RldmljZShzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqdWRldik7Ci1pbnQgcmVhZF9hdHRyX3ZhbHVlKHN0cnVjdCBzeXNmc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKK2ludCByZWFkX3VzYl9kZXZpY2Uoc3RydWN0IHVkZXZfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqdWRldik7CitpbnQgcmVhZF9hdHRyX3ZhbHVlKHN0cnVjdCB1ZGV2X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgY29uc3QgY2hhciAqZm9ybWF0KTsKIGludCByZWFkX3VzYl9pbnRlcmZhY2Uoc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYsIGludCBpLAogCQkgICAgICAgc3RydWN0IHVzYmlwX3VzYl9pbnRlcmZhY2UgKnVpbmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmMKaW5kZXggNzFhNDQ5Yy4uYzViZjYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5jCkBAIC0xOCwxMDIgKzE4LDY1IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8bGlidWRldi5oPgorCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXNiaXBfaG9zdF9kcml2ZXIuaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAic3lzZnNfdXRpbHMuaCIKIAogI3VuZGVmICBQUk9HTkFNRQogI2RlZmluZSBQUk9HTkFNRSAibGlidXNiaXAiCiAKIHN0cnVjdCB1c2JpcF9ob3N0X2RyaXZlciAqaG9zdF9kcml2ZXI7CitzdHJ1Y3QgdWRldiAqdWRldl9jb250ZXh0OwogCi0jZGVmaW5lIFNZU0ZTX09QRU5fUkVUUklFUyAxMDAKLQotLyogb25seSB0aGUgZmlyc3QgaW50ZXJmYWNlIHZhbHVlIGlzIHRydWUhICovCiBzdGF0aWMgaW50MzJfdCByZWFkX2F0dHJfdXNiaXBfc3RhdHVzKHN0cnVjdCB1c2JpcF91c2JfZGV2aWNlICp1ZGV2KQogewotCWNoYXIgYXR0cnBhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmF0dHI7CisJY2hhciBzdGF0dXNfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwlpbnQgZmQ7CisJaW50IGxlbmd0aDsKKwljaGFyIHN0YXR1czsKIAlpbnQgdmFsdWUgPSAwOwotCWludCByYzsKLQlzdHJ1Y3Qgc3RhdCBzOwotCWludCByZXRyaWVzID0gU1lTRlNfT1BFTl9SRVRSSUVTOwogCi0JLyogVGhpcyBhY2Nlc3MgaXMgcmFjeSEKLQkgKgotCSAqIEp1c3QgYWZ0ZXIgZGV0YWNoLCBvdXIgZHJpdmVyIHJlbW92ZXMgdGhlIHN5c2ZzCi0JICogZmlsZXMgYW5kIHJlY3JlYXRlcyB0aGVtLgotCSAqCi0JICogV2UgbWF5IHRyeSBhbmQgZmFpbCB0byBvcGVuIHRoZSB1c2JpcF9zdGF0dXMgb2YKLQkgKiBhbiBleHBvcnRlZCBkZXZpY2UgaW4gdGhlIChzaG9ydCkgd2luZG93IHdoZXJlCi0JICogaXQgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgbm90IHlldCByZWNyZWF0ZWQuCi0JICoKLQkgKiBUaGlzIGlzIGEgYnVnIGluIHRoZSBpbnRlcmZhY2UuIE5vdGhpbmcgd2UgY2FuIGRvCi0JICogZXhjZXB0IHdvcmsgYXJvdW5kIGl0IGhlcmUgYnkgcG9sbGluZyBmb3IgdGhlIHN5c2ZzCi0JICogdXNiaXBfc3RhdHVzIHRvIHJlYXBwZWFyLgotCSAqLworCXNucHJpbnRmKHN0YXR1c19hdHRyX3BhdGgsIFNZU0ZTX1BBVEhfTUFYLCAiJXMvdXNiaXBfc3RhdHVzIiwKKwkJIHVkZXYtPnBhdGgpOwogCi0Jc25wcmludGYoYXR0cnBhdGgsIFNZU0ZTX1BBVEhfTUFYLCAiJXMvJXM6JWQuJWQvdXNiaXBfc3RhdHVzIiwKLQkJIHVkZXYtPnBhdGgsIHVkZXYtPmJ1c2lkLCB1ZGV2LT5iQ29uZmlndXJhdGlvblZhbHVlLCAwKTsKLQotCXdoaWxlIChyZXRyaWVzID4gMCkgewotCQlpZiAoc3RhdChhdHRycGF0aCwgJnMpID09IDApCi0JCQlicmVhazsKLQotCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7Ci0JCQlkYmcoInN0YXQgZmFpbGVkOiAlcyIsIGF0dHJwYXRoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXVzbGVlcCgxMDAwMCk7IC8qIDEwbXMgKi8KLQkJcmV0cmllcy0tOwotCX0KLQotCWlmIChyZXRyaWVzID09IDApCi0JCWRiZygidXNiaXBfc3RhdHVzIG5vdCByZWFkeSBhZnRlciAlZCByZXRyaWVzIiwKLQkJICAgIFNZU0ZTX09QRU5fUkVUUklFUyk7Ci0JZWxzZSBpZiAocmV0cmllcyA8IFNZU0ZTX09QRU5fUkVUUklFUykKLQkJZGJnKCJ3YXJuaW5nOiB1c2JpcF9zdGF0dXMgcmVhZHkgYWZ0ZXIgJWQgcmV0cmllcyIsCi0JCSAgICBTWVNGU19PUEVOX1JFVFJJRVMgLSByZXRyaWVzKTsKLQotCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShhdHRycGF0aCk7Ci0JaWYgKCFhdHRyKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9hdHRyaWJ1dGUgZmFpbGVkOiAlcyIsIGF0dHJwYXRoKTsKKwlpZiAoKGZkID0gb3BlbihzdGF0dXNfYXR0cl9wYXRoLCBPX1JET05MWSkpIDwgMCkgeworCQllcnIoImVycm9yIG9wZW5pbmcgYXR0cmlidXRlICVzIiwgc3RhdHVzX2F0dHJfcGF0aCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyYyA9IHN5c2ZzX3JlYWRfYXR0cmlidXRlKGF0dHIpOwotCWlmIChyYykgewotCQlkYmcoInN5c2ZzX3JlYWRfYXR0cmlidXRlIGZhaWxlZDogJXMiLCBhdHRycGF0aCk7Ci0JCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKwlsZW5ndGggPSByZWFkKGZkLCAmc3RhdHVzLCAxKTsKKwlpZiAobGVuZ3RoIDwgMCkgeworCQllcnIoImVycm9yIHJlYWRpbmcgYXR0cmlidXRlICVzIiwgc3RhdHVzX2F0dHJfcGF0aCk7CisJCWNsb3NlKGZkKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXZhbHVlID0gYXRvaShhdHRyLT52YWx1ZSk7Ci0KLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisJdmFsdWUgPSBhdG9pKCZzdGF0dXMpOwogCiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX25ldyhjaGFyICpzZGV2cGF0aCkKK3N0YXRpYworc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX25ldyhjb25zdCBjaGFyICpzZGV2cGF0aCkKIHsKIAlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2X29sZDsKIAlzaXplX3Qgc2l6ZTsKIAlpbnQgaTsKIAotCWVkZXYgPSBjYWxsb2MoMSwgc2l6ZW9mKCplZGV2KSk7Ci0JaWYgKCFlZGV2KSB7Ci0JCWRiZygiY2FsbG9jIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJZWRldiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSkpOwogCi0JZWRldi0+c3VkZXYgPSBzeXNmc19vcGVuX2RldmljZV9wYXRoKHNkZXZwYXRoKTsKKwllZGV2LT5zdWRldiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N5c3BhdGgodWRldl9jb250ZXh0LCBzZGV2cGF0aCk7CiAJaWYgKCFlZGV2LT5zdWRldikgewotCQlkYmcoInN5c2ZzX29wZW5fZGV2aWNlX3BhdGggZmFpbGVkOiAlcyIsIHNkZXZwYXRoKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9uZXdfZnJvbV9zeXNwYXRoOiAlcyIsIHNkZXZwYXRoKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0xMjQsMTEgKzg3LDEzIEBACiAJCWdvdG8gZXJyOwogCiAJLyogcmVhbGxvY2F0ZSBidWZmZXIgdG8gaW5jbHVkZSB1c2IgaW50ZXJmYWNlIGRhdGEgKi8KLQlzaXplID0gc2l6ZW9mKCplZGV2KSArIGVkZXYtPnVkZXYuYk51bUludGVyZmFjZXMgKgorCXNpemUgPSBzaXplb2Yoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSkgKyBlZGV2LT51ZGV2LmJOdW1JbnRlcmZhY2VzICoKIAkJc2l6ZW9mKHN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlKTsKIAorCWVkZXZfb2xkID0gZWRldjsKIAllZGV2ID0gcmVhbGxvYyhlZGV2LCBzaXplKTsKIAlpZiAoIWVkZXYpIHsKKwkJZWRldiA9IGVkZXZfb2xkOwogCQlkYmcoInJlYWxsb2MgZmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTEzOCwxNjAgKzEwMyw4OCBAQAogCiAJcmV0dXJuIGVkZXY7CiBlcnI6Ci0JaWYgKGVkZXYgJiYgZWRldi0+c3VkZXYpCi0JCXN5c2ZzX2Nsb3NlX2RldmljZShlZGV2LT5zdWRldik7CisJaWYgKGVkZXYtPnN1ZGV2KQorCQl1ZGV2X2RldmljZV91bnJlZihlZGV2LT5zdWRldik7CiAJaWYgKGVkZXYpCiAJCWZyZWUoZWRldik7CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBjaGVja19uZXcoc3RydWN0IGRsaXN0ICpkbGlzdCwgc3RydWN0IHN5c2ZzX2RldmljZSAqdGFyZ2V0KQotewotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmRldjsKLQotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoZGxpc3QsIGRldiwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQlpZiAoIXN0cm5jbXAoZGV2LT5idXNfaWQsIHRhcmdldC0+YnVzX2lkLCBTWVNGU19CVVNfSURfU0laRSkpCi0JCQkvKiBkZXZpY2UgZm91bmQgYW5kIGlzIG5vdCBuZXcgKi8KLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlX25vdGhpbmcodm9pZCAqdW51c2VkX2RhdGEpCi17Ci0JLyoKLQkgKiBOT1RFOiBEbyBub3QgZGVsZXRlIGFueXRoaW5nLCBidXQgdGhlIGNvbnRhaW5lciB3aWxsIGJlIGRlbGV0ZWQuCi0JICovCi0JKHZvaWQpIHVudXNlZF9kYXRhOwotfQotCiBzdGF0aWMgaW50IHJlZnJlc2hfZXhwb3J0ZWRfZGV2aWNlcyh2b2lkKQogewotCS8qIHN5c2ZzX2RldmljZSBvZiB1c2JfaW50ZXJmYWNlICovCi0Jc3RydWN0IHN5c2ZzX2RldmljZQkqc3VpbnRmOwotCXN0cnVjdCBkbGlzdAkJKnN1aW50Zl9saXN0OwotCS8qIHN5c2ZzX2RldmljZSBvZiB1c2JfZGV2aWNlICovCi0Jc3RydWN0IHN5c2ZzX2RldmljZQkqc3VkZXY7Ci0Jc3RydWN0IGRsaXN0CQkqc3VkZXZfbGlzdDsKIAlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2OworCXN0cnVjdCB1ZGV2X2VudW1lcmF0ZSAqZW51bWVyYXRlOworCXN0cnVjdCB1ZGV2X2xpc3RfZW50cnkgKmRldmljZXMsICpkZXZfbGlzdF9lbnRyeTsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICpwYXRoOwogCi0Jc3VkZXZfbGlzdCA9IGRsaXN0X25ld193aXRoX2RlbGV0ZShzaXplb2Yoc3RydWN0IHN5c2ZzX2RldmljZSksCi0JCQkJCSAgIGRlbGV0ZV9ub3RoaW5nKTsKKwllbnVtZXJhdGUgPSB1ZGV2X2VudW1lcmF0ZV9uZXcodWRldl9jb250ZXh0KTsKKwl1ZGV2X2VudW1lcmF0ZV9hZGRfbWF0Y2hfc3Vic3lzdGVtKGVudW1lcmF0ZSwgInVzYiIpOworCXVkZXZfZW51bWVyYXRlX3NjYW5fZGV2aWNlcyhlbnVtZXJhdGUpOwogCi0Jc3VpbnRmX2xpc3QgPSBzeXNmc19nZXRfZHJpdmVyX2RldmljZXMoaG9zdF9kcml2ZXItPnN5c2ZzX2RyaXZlcik7Ci0JaWYgKCFzdWludGZfbGlzdCkgewotCQkvKgotCQkgKiBOb3QgYW4gZXJyb3IgY29uZGl0aW9uLiBUaGVyZSBhcmUgc2ltcGx5IG5vIGRldmljZXMgYm91bmQgdG8KLQkJICogdGhlIGRyaXZlciB5ZXQuCi0JCSAqLwotCQlkYmcoImJpbmQgIiBVU0JJUF9IT1NUX0RSVl9OQU1FICIua28gdG8gYSB1c2IgZGV2aWNlIHRvIGJlICIKLQkJICAgICJleHBvcnRhYmxlISIpOwotCQlyZXR1cm4gMDsKLQl9CisJZGV2aWNlcyA9IHVkZXZfZW51bWVyYXRlX2dldF9saXN0X2VudHJ5KGVudW1lcmF0ZSk7CiAKLQkvKiBjb2xsZWN0IHVuaXF1ZSBVU0IgZGV2aWNlcyAobm90IGludGVyZmFjZXMpICovCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShzdWludGZfbGlzdCwgc3VpbnRmLCBzdHJ1Y3Qgc3lzZnNfZGV2aWNlKSB7Ci0JCS8qIGdldCB1c2IgZGV2aWNlIG9mIHRoaXMgdXNiIGludGVyZmFjZSAqLwotCQlzdWRldiA9IHN5c2ZzX2dldF9kZXZpY2VfcGFyZW50KHN1aW50Zik7Ci0JCWlmICghc3VkZXYpIHsKLQkJCWRiZygic3lzZnNfZ2V0X2RldmljZV9wYXJlbnQgZmFpbGVkOiAlcyIsIHN1aW50Zi0+bmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQorCXVkZXZfbGlzdF9lbnRyeV9mb3JlYWNoKGRldl9saXN0X2VudHJ5LCBkZXZpY2VzKSB7CisJCXBhdGggPSB1ZGV2X2xpc3RfZW50cnlfZ2V0X25hbWUoZGV2X2xpc3RfZW50cnkpOworCQlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zeXNwYXRoKHVkZXZfY29udGV4dCwgcGF0aCk7CiAKLQkJaWYgKGNoZWNrX25ldyhzdWRldl9saXN0LCBzdWRldikpIHsKLQkJCS8qIGluc2VydCBpdGVtIGF0IGhlYWQgb2YgbGlzdCAqLwotCQkJZGxpc3RfdW5zaGlmdChzdWRldl9saXN0LCBzdWRldik7CisJCS8qIENoZWNrIHdoZXRoZXIgZGV2aWNlIHVzZXMgdXNiaXAtaG9zdCBkcml2ZXIuICovCisJCWlmICghc3RyY21wKHVkZXZfZGV2aWNlX2dldF9kcml2ZXIoZGV2KSwKKwkJCSAgICBVU0JJUF9IT1NUX0RSVl9OQU1FKSkgeworCQkJZWRldiA9IHVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcocGF0aCk7CisJCQlpZiAoIWVkZXYpIHsKKwkJCQlkYmcoInVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcgZmFpbGVkIik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWxpc3RfYWRkKCZlZGV2LT5ub2RlLCAmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CisJCQlob3N0X2RyaXZlci0+bmRldnMrKzsKIAkJfQogCX0KIAotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoc3VkZXZfbGlzdCwgc3VkZXYsIHN0cnVjdCBzeXNmc19kZXZpY2UpIHsKLQkJZWRldiA9IHVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcoc3VkZXYtPnBhdGgpOwotCQlpZiAoIWVkZXYpIHsKLQkJCWRiZygidXNiaXBfZXhwb3J0ZWRfZGV2aWNlX25ldyBmYWlsZWQiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZGxpc3RfdW5zaGlmdChob3N0X2RyaXZlci0+ZWRldl9saXN0LCBlZGV2KTsKLQkJaG9zdF9kcml2ZXItPm5kZXZzKys7Ci0JfQotCi0JZGxpc3RfZGVzdHJveShzdWRldl9saXN0KTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2ZzX2RyaXZlciAqb3Blbl9zeXNmc19ob3N0X2RyaXZlcih2b2lkKQorc3RhdGljIHZvaWQgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2Rlc3Ryb3kodm9pZCkKIHsKLQljaGFyIGJ1c190eXBlW10gPSAidXNiIjsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOwotCWNoYXIgaG9zdF9kcnZfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqaG9zdF9kcnY7Ci0JaW50IHJjOworCXN0cnVjdCBsaXN0X2hlYWQgKmksICp0bXA7CisJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKIAotCXJjID0gc3lzZnNfZ2V0X21udF9wYXRoKHN5c2ZzX21udHBhdGgsIFNZU0ZTX1BBVEhfTUFYKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRiZygic3lzZnNfZ2V0X21udF9wYXRoIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoaSwgdG1wLCAmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCkgeworCQllZGV2ID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlLCBub2RlKTsKKwkJbGlzdF9kZWwoaSk7CisJCWZyZWUoZWRldik7CiAJfQotCi0Jc25wcmludGYoaG9zdF9kcnZfcGF0aCwgU1lTRlNfUEFUSF9NQVgsICIlcy8lcy8lcy8lcy8lcyIsCi0JCSBzeXNmc19tbnRwYXRoLCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwKLQkJIFVTQklQX0hPU1RfRFJWX05BTUUpOwotCi0JaG9zdF9kcnYgPSBzeXNmc19vcGVuX2RyaXZlcl9wYXRoKGhvc3RfZHJ2X3BhdGgpOwotCWlmICghaG9zdF9kcnYpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RyaXZlcl9wYXRoIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gaG9zdF9kcnY7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYmlwX2V4cG9ydGVkX2RldmljZV9kZWxldGUodm9pZCAqZGV2KQotewotCXN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKmVkZXYgPSBkZXY7Ci0Jc3lzZnNfY2xvc2VfZGV2aWNlKGVkZXYtPnN1ZGV2KTsKLQlmcmVlKGRldik7CiB9CiAKIGludCB1c2JpcF9ob3N0X2RyaXZlcl9vcGVuKHZvaWQpCiB7CiAJaW50IHJjOwogCi0JaG9zdF9kcml2ZXIgPSBjYWxsb2MoMSwgc2l6ZW9mKCpob3N0X2RyaXZlcikpOwotCWlmICghaG9zdF9kcml2ZXIpIHsKLQkJZGJnKCJjYWxsb2MgZmFpbGVkIik7CisJdWRldl9jb250ZXh0ID0gdWRldl9uZXcoKTsKKwlpZiAoIXVkZXZfY29udGV4dCkgeworCQllcnIoInVkZXZfbmV3IGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaG9zdF9kcml2ZXItPm5kZXZzID0gMDsKLQlob3N0X2RyaXZlci0+ZWRldl9saXN0ID0KLQkJZGxpc3RfbmV3X3dpdGhfZGVsZXRlKHNpemVvZihzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlKSwKLQkJCQkgICAgICB1c2JpcF9leHBvcnRlZF9kZXZpY2VfZGVsZXRlKTsKLQlpZiAoIWhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKLQkJZGJnKCJkbGlzdF9uZXdfd2l0aF9kZWxldGUgZmFpbGVkIik7Ci0JCWdvdG8gZXJyX2ZyZWVfaG9zdF9kcml2ZXI7Ci0JfQorCWhvc3RfZHJpdmVyID0gY2FsbG9jKDEsIHNpemVvZigqaG9zdF9kcml2ZXIpKTsKIAotCWhvc3RfZHJpdmVyLT5zeXNmc19kcml2ZXIgPSBvcGVuX3N5c2ZzX2hvc3RfZHJpdmVyKCk7Ci0JaWYgKCFob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyKQotCQlnb3RvIGVycl9kZXN0cm95X2VkZXZfbGlzdDsKKwlob3N0X2RyaXZlci0+bmRldnMgPSAwOworCUlOSVRfTElTVF9IRUFEKCZob3N0X2RyaXZlci0+ZWRldl9saXN0KTsKIAogCXJjID0gcmVmcmVzaF9leHBvcnRlZF9kZXZpY2VzKCk7CiAJaWYgKHJjIDwgMCkKLQkJZ290byBlcnJfY2xvc2Vfc3lzZnNfZHJpdmVyOworCQlnb3RvIGVycl9mcmVlX2hvc3RfZHJpdmVyOwogCiAJcmV0dXJuIDA7CiAKLWVycl9jbG9zZV9zeXNmc19kcml2ZXI6Ci0Jc3lzZnNfY2xvc2VfZHJpdmVyKGhvc3RfZHJpdmVyLT5zeXNmc19kcml2ZXIpOwotZXJyX2Rlc3Ryb3lfZWRldl9saXN0OgotCWRsaXN0X2Rlc3Ryb3koaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CiBlcnJfZnJlZV9ob3N0X2RyaXZlcjoKIAlmcmVlKGhvc3RfZHJpdmVyKTsKIAlob3N0X2RyaXZlciA9IE5VTEw7CiAKKwl1ZGV2X3VucmVmKHVkZXZfY29udGV4dCk7CisKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTMwMCwzMCArMTkzLDIyIEBACiAJaWYgKCFob3N0X2RyaXZlcikKIAkJcmV0dXJuOwogCi0JaWYgKGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3koaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7Ci0JaWYgKGhvc3RfZHJpdmVyLT5zeXNmc19kcml2ZXIpCi0JCXN5c2ZzX2Nsb3NlX2RyaXZlcihob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyKTsKKwl1c2JpcF9leHBvcnRlZF9kZXZpY2VfZGVzdHJveSgpOwogCiAJZnJlZShob3N0X2RyaXZlcik7CiAJaG9zdF9kcml2ZXIgPSBOVUxMOworCisJdWRldl91bnJlZih1ZGV2X2NvbnRleHQpOwogfQogCiBpbnQgdXNiaXBfaG9zdF9yZWZyZXNoX2RldmljZV9saXN0KHZvaWQpCiB7CiAJaW50IHJjOwogCi0JaWYgKGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3koaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CisJdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2Rlc3Ryb3koKTsKIAogCWhvc3RfZHJpdmVyLT5uZGV2cyA9IDA7Ci0JaG9zdF9kcml2ZXItPmVkZXZfbGlzdCA9Ci0JCWRsaXN0X25ld193aXRoX2RlbGV0ZShzaXplb2Yoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSksCi0JCQkJICAgICAgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2RlbGV0ZSk7Ci0JaWYgKCFob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7Ci0JCWRiZygiZGxpc3RfbmV3X3dpdGhfZGVsZXRlIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorCUlOSVRfTElTVF9IRUFEKCZob3N0X2RyaXZlci0+ZWRldl9saXN0KTsKIAogCXJjID0gcmVmcmVzaF9leHBvcnRlZF9kZXZpY2VzKCk7CiAJaWYgKHJjIDwgMCkKQEAgLTMzNSw4ICsyMjAsNyBAQAogaW50IHVzYmlwX2hvc3RfZXhwb3J0X2RldmljZShzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2LCBpbnQgc29ja2ZkKQogewogCWNoYXIgYXR0cl9uYW1lW10gPSAidXNiaXBfc29ja2ZkIjsKLQljaGFyIGF0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKKwljaGFyIHNvY2tmZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwogCWNoYXIgc29ja2ZkX2J1ZmZbMzBdOwogCWludCByZXQ7CiAKQEAgLTM1Niw0MSArMjQwLDMyIEBACiAJfQogCiAJLyogb25seSB0aGUgZmlyc3QgaW50ZXJmYWNlIGlzIHRydWUgKi8KLQlzbnByaW50ZihhdHRyX3BhdGgsIHNpemVvZihhdHRyX3BhdGgpLCAiJXMvJXM6JWQuJWQvJXMiLAotCQkgZWRldi0+dWRldi5wYXRoLCBlZGV2LT51ZGV2LmJ1c2lkLAotCQkgZWRldi0+dWRldi5iQ29uZmlndXJhdGlvblZhbHVlLCAwLCBhdHRyX25hbWUpOwotCi0JYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGF0dHJfcGF0aCk7Ci0JaWYgKCFhdHRyKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9hdHRyaWJ1dGUgZmFpbGVkOiAlcyIsIGF0dHJfcGF0aCk7Ci0JCXJldHVybiAtMTsKLQl9CisJc25wcmludGYoc29ja2ZkX2F0dHJfcGF0aCwgc2l6ZW9mKHNvY2tmZF9hdHRyX3BhdGgpLCAiJXMvJXMiLAorCQkgZWRldi0+dWRldi5wYXRoLCBhdHRyX25hbWUpOwogCiAJc25wcmludGYoc29ja2ZkX2J1ZmYsIHNpemVvZihzb2NrZmRfYnVmZiksICIlZFxuIiwgc29ja2ZkKTsKLQlkYmcoIndyaXRlOiAlcyIsIHNvY2tmZF9idWZmKTsKIAotCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyLCBzb2NrZmRfYnVmZiwgc3RybGVuKHNvY2tmZF9idWZmKSk7CisJcmV0ID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKHNvY2tmZF9hdHRyX3BhdGgsIHNvY2tmZF9idWZmLAorCQkJCSAgICBzdHJsZW4oc29ja2ZkX2J1ZmYpKTsKIAlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX3dyaXRlX2F0dHJpYnV0ZSBmYWlsZWQ6IHNvY2tmZCAlcyB0byAlcyIsCi0JCSAgICBzb2NrZmRfYnVmZiwgYXR0cl9wYXRoKTsKLQkJZ290byBlcnJfd3JpdGVfc29ja2ZkOworCQllcnIoIndyaXRlX3N5c2ZzX2F0dHJpYnV0ZSBmYWlsZWQ6IHNvY2tmZCAlcyB0byAlcyIsCisJCSAgICBzb2NrZmRfYnVmZiwgc29ja2ZkX2F0dHJfcGF0aCk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JZGJnKCJjb25uZWN0OiAlcyIsIGVkZXYtPnVkZXYuYnVzaWQpOwotCi1lcnJfd3JpdGVfc29ja2ZkOgotCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKwlpbmZvKCJjb25uZWN0OiAlcyIsIGVkZXYtPnVkZXYuYnVzaWQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqdXNiaXBfaG9zdF9nZXRfZGV2aWNlKGludCBudW0pCiB7CisJc3RydWN0IGxpc3RfaGVhZCAqaTsKIAlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2OwotCXN0cnVjdCBkbGlzdCAqZGxpc3QgPSBob3N0X2RyaXZlci0+ZWRldl9saXN0OwogCWludCBjbnQgPSAwOwogCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShkbGlzdCwgZWRldiwgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSkgeworCWxpc3RfZm9yX2VhY2goaSwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKKwkJZWRldiA9IGxpc3RfZW50cnkoaSwgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSwgbm9kZSk7CiAJCWlmIChudW0gPT0gY250KQogCQkJcmV0dXJuIGVkZXY7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5oCmluZGV4IDM0ZmQxNGMuLjJhMzFmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuaApAQCAtMjEsMTggKzIxLDE5IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKKyNpbmNsdWRlICJsaXN0LmgiCiAKIHN0cnVjdCB1c2JpcF9ob3N0X2RyaXZlciB7CiAJaW50IG5kZXZzOwotCXN0cnVjdCBzeXNmc19kcml2ZXIgKnN5c2ZzX2RyaXZlcjsKIAkvKiBsaXN0IG9mIGV4cG9ydGVkIGRldmljZSAqLwotCXN0cnVjdCBkbGlzdCAqZWRldl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZWRldl9saXN0OwogfTsKIAogc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSB7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqc3VkZXY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpzdWRldjsKIAlpbnQzMl90IHN0YXR1czsKIAlzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSB1ZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSB1aW5mW107CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuYwppbmRleCAyMDlkZjliLi44OTAxZmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmMKQEAgLTYsNDQgKzYsMjggQEAKICNpbmNsdWRlICJ2aGNpX2RyaXZlci5oIgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgorI2luY2x1ZGUgInN5c2ZzX3V0aWxzLmgiCiAKICN1bmRlZiAgUFJPR05BTUUKICNkZWZpbmUgUFJPR05BTUUgImxpYnVzYmlwIgogCiBzdHJ1Y3QgdXNiaXBfdmhjaV9kcml2ZXIgKnZoY2lfZHJpdmVyOworc3RydWN0IHVkZXYgKnVkZXZfY29udGV4dDsKIAogc3RhdGljIHN0cnVjdCB1c2JpcF9pbXBvcnRlZF9kZXZpY2UgKgogaW1wb3J0ZWRfZGV2aWNlX2luaXQoc3RydWN0IHVzYmlwX2ltcG9ydGVkX2RldmljZSAqaWRldiwgY2hhciAqYnVzaWQpCiB7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqc3VkZXY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpzdWRldjsKIAotCXN1ZGV2ID0gc3lzZnNfb3Blbl9kZXZpY2UoInVzYiIsIGJ1c2lkKTsKKwlzdWRldiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lKHVkZXZfY29udGV4dCwKKwkJCQkJCSAgICAgICAidXNiIiwgYnVzaWQpOwogCWlmICghc3VkZXYpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RldmljZSBmYWlsZWQ6ICVzIiwgYnVzaWQpOworCQlkYmcoInVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lIGZhaWxlZDogJXMiLCBidXNpZCk7CiAJCWdvdG8gZXJyOwogCX0KIAlyZWFkX3VzYl9kZXZpY2Uoc3VkZXYsICZpZGV2LT51ZGV2KTsKLQlzeXNmc19jbG9zZV9kZXZpY2Uoc3VkZXYpOwotCi0JLyogYWRkIGNsYXNzIGRldmljZXMgb2YgdGhpcyBpbXBvcnRlZCBkZXZpY2UgKi8KLQlzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlICpjZGV2OwotCWRsaXN0X2Zvcl9lYWNoX2RhdGEodmhjaV9kcml2ZXItPmNkZXZfbGlzdCwgY2RldiwKLQkJCSAgICBzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlKSB7Ci0JCWlmICghc3RybmNtcChjZGV2LT5kZXZfcGF0aCwgaWRldi0+dWRldi5wYXRoLAotCQkJICAgICBzdHJsZW4oaWRldi0+dWRldi5wYXRoKSkpIHsKLQkJCXN0cnVjdCB1c2JpcF9jbGFzc19kZXZpY2UgKm5ld19jZGV2OwotCQkJLyoKLQkJCSAqIGFsbG9jIGFuZCBjb3B5IGJlY2F1c2UgZGxpc3QgaXMgbGlua2VkCi0JCQkgKiBmcm9tIG9ubHkgb25lIGxpc3QKLQkJCSAqLwotCQkJbmV3X2NkZXYgPSBjYWxsb2MoMSwgc2l6ZW9mKCpuZXdfY2RldikpOwotCQkJaWYgKCFuZXdfY2RldikKLQkJCQlnb3RvIGVycjsKLQotCQkJbWVtY3B5KG5ld19jZGV2LCBjZGV2LCBzaXplb2YoKm5ld19jZGV2KSk7Ci0JCQlkbGlzdF91bnNoaWZ0KGlkZXYtPmNkZXZfbGlzdCwgKHZvaWQgKikgbmV3X2NkZXYpOwotCQl9Ci0JfQorCXVkZXZfZGV2aWNlX3VucmVmKHN1ZGV2KTsKIAogCXJldHVybiBpZGV2OwogCkBAIC01Myw3ICszNyw3IEBACiAKIAogCi1zdGF0aWMgaW50IHBhcnNlX3N0YXR1cyhjaGFyICp2YWx1ZSkKK3N0YXRpYyBpbnQgcGFyc2Vfc3RhdHVzKGNvbnN0IGNoYXIgKnZhbHVlKQogewogCWludCByZXQgPSAwOwogCWNoYXIgKmM7CkBAIC0xMDAsMTIgKzg0LDYgQEAKIAkJCWlkZXYtPmJ1c251bQk9IChkZXZpZCA+PiAxNik7CiAJCQlpZGV2LT5kZXZudW0JPSAoZGV2aWQgJiAweDAwMDBmZmZmKTsKIAotCQkJaWRldi0+Y2Rldl9saXN0ID0gZGxpc3RfbmV3KHNpemVvZihzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlKSk7Ci0JCQlpZiAoIWlkZXYtPmNkZXZfbGlzdCkgewotCQkJCWRiZygiZGxpc3RfbmV3IGZhaWxlZCIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQogCQkJaWYgKGlkZXYtPnN0YXR1cyAhPSBWREVWX1NUX05VTEwKIAkJCSAgICAmJiBpZGV2LT5zdGF0dXMgIT0gVkRFVl9TVF9OT1RBU1NJR05FRCkgewogCQkJCWlkZXYgPSBpbXBvcnRlZF9kZXZpY2VfaW5pdChpZGV2LCBsYnVzaWQpOwpAQCAtMTI5LDE1NiArMTA3LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBjaGVja191c2JpcF9kZXZpY2Uoc3RydWN0IHN5c2ZzX2NsYXNzX2RldmljZSAqY2RldikKLXsKLQkvKiAvc3lzL2NsYXNzL3ZpZGVvNGxpbnV4L3ZpZGVvMC9kZXZpY2UgKi8KLQljaGFyIGNsYXNzX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCS8qIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aGNpX2hjZC91c2I2LzYtMToxLjEgKi8KLQljaGFyIGRldl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlpbnQgcmV0OwotCXN0cnVjdCB1c2JpcF9jbGFzc19kZXZpY2UgKnVzYmlwX2NkZXY7Ci0KLQlzbnByaW50ZihjbGFzc19wYXRoLCBzaXplb2YoY2xhc3NfcGF0aCksICIlcy9kZXZpY2UiLCBjZGV2LT5wYXRoKTsKLQotCXJldCA9IHN5c2ZzX2dldF9saW5rKGNsYXNzX3BhdGgsIGRldl9wYXRoLCBzaXplb2YoZGV2X3BhdGgpKTsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKCFzdHJuY21wKGRldl9wYXRoLCB2aGNpX2RyaXZlci0+aGNfZGV2aWNlLT5wYXRoLAotCQkJICAgICBzdHJsZW4odmhjaV9kcml2ZXItPmhjX2RldmljZS0+cGF0aCkpKSB7Ci0JCQkvKiBmb3VuZCB1c2JpcCBkZXZpY2UgKi8KLQkJCXVzYmlwX2NkZXYgPSBjYWxsb2MoMSwgc2l6ZW9mKCp1c2JpcF9jZGV2KSk7Ci0JCQlpZiAoIXVzYmlwX2NkZXYpIHsKLQkJCQlkYmcoImNhbGxvYyBmYWlsZWQiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlkbGlzdF91bnNoaWZ0KHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QsIHVzYmlwX2NkZXYpOwotCQkJc3RybmNweSh1c2JpcF9jZGV2LT5jbGFzc19wYXRoLCBjbGFzc19wYXRoLAotCQkJCXNpemVvZih1c2JpcF9jZGV2LT5jbGFzc19wYXRoKSk7Ci0JCQlzdHJuY3B5KHVzYmlwX2NkZXYtPmRldl9wYXRoLCBkZXZfcGF0aCwKLQkJCQlzaXplb2YodXNiaXBfY2Rldi0+ZGV2X3BhdGgpKTsKLQkJCWRiZygiZm91bmQ6ICVzICVzIiwgY2xhc3NfcGF0aCwgZGV2X3BhdGgpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBzZWFyY2hfY2xhc3NfZm9yX3VzYmlwX2RldmljZShjaGFyICpjbmFtZSkKLXsKLQlzdHJ1Y3Qgc3lzZnNfY2xhc3MgKmNsYXNzOwotCXN0cnVjdCBkbGlzdCAqY2Rldl9saXN0OwotCXN0cnVjdCBzeXNmc19jbGFzc19kZXZpY2UgKmNkZXY7Ci0JaW50IHJldCA9IDA7Ci0KLQljbGFzcyA9IHN5c2ZzX29wZW5fY2xhc3MoY25hbWUpOwotCWlmICghY2xhc3MpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2NsYXNzIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGJnKCJjbGFzczogJXMiLCBjbGFzcy0+bmFtZSk7Ci0KLQljZGV2X2xpc3QgPSBzeXNmc19nZXRfY2xhc3NfZGV2aWNlcyhjbGFzcyk7Ci0JaWYgKCFjZGV2X2xpc3QpCi0JCS8qIG5vdGhpbmcgKi8KLQkJZ290byBvdXQ7Ci0KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGNkZXZfbGlzdCwgY2Rldiwgc3RydWN0IHN5c2ZzX2NsYXNzX2RldmljZSkgewotCQlkYmcoImNkZXY6ICVzIiwgY2Rldi0+bmFtZSk7Ci0JCXJldCA9IGNoZWNrX3VzYmlwX2RldmljZShjZGV2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQlzeXNmc19jbG9zZV9jbGFzcyhjbGFzcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgcmVmcmVzaF9jbGFzc19kZXZpY2VfbGlzdCh2b2lkKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGRsaXN0ICpjbmFtZV9saXN0OwotCWNoYXIgKmNuYW1lOwotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07Ci0JY2hhciBjbGFzc19wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQotCXJldCA9IHN5c2ZzX2dldF9tbnRfcGF0aChzeXNmc19tbnRwYXRoLCBTWVNGU19QQVRIX01BWCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc19nZXRfbW50X3BhdGggZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzbnByaW50ZihjbGFzc19wYXRoLCBzaXplb2YoY2xhc3NfcGF0aCksICIlcy8lcyIsIHN5c2ZzX21udHBhdGgsCi0JCSBTWVNGU19DTEFTU19OQU1FKTsKLQotCS8qIHNlYXJjaCB1bmRlciAvc3lzL2NsYXNzICovCi0JY25hbWVfbGlzdCA9IHN5c2ZzX29wZW5fZGlyZWN0b3J5X2xpc3QoY2xhc3NfcGF0aCk7Ci0JaWYgKCFjbmFtZV9saXN0KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kaXJlY3RvcnkgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGNuYW1lX2xpc3QsIGNuYW1lLCBjaGFyKSB7Ci0JCXJldCA9IHNlYXJjaF9jbGFzc19mb3JfdXNiaXBfZGV2aWNlKGNuYW1lKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXN5c2ZzX2Nsb3NlX2xpc3QoY25hbWVfbGlzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlzeXNmc19jbG9zZV9saXN0KGNuYW1lX2xpc3QpOwotCi0JLyogc2VhcmNoIHVuZGVyIC9zeXMvYmxvY2sgKi8KLQlyZXQgPSBzZWFyY2hfY2xhc3NfZm9yX3VzYmlwX2RldmljZShTWVNGU19CTE9DS19OQU1FKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQogc3RhdGljIGludCByZWZyZXNoX2ltcG9ydGVkX2RldmljZV9saXN0KHZvaWQpCiB7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cl9zdGF0dXM7CisJY29uc3QgY2hhciAqYXR0cl9zdGF0dXM7CiAKLQotCWF0dHJfc3RhdHVzID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsICJzdGF0dXMiKTsKKwlhdHRyX3N0YXR1cyA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsCisJCQkJCSAgICAgICAic3RhdHVzIik7CiAJaWYgKCFhdHRyX3N0YXR1cykgewotCQlkYmcoInN5c2ZzX2dldF9kZXZpY2VfYXR0cihcInN0YXR1c1wiKSBmYWlsZWQ6ICVzIiwKLQkJICAgIHZoY2lfZHJpdmVyLT5oY19kZXZpY2UtPm5hbWUpOworCQllcnIoInVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlIGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZGJnKCJuYW1lOiAlcyAgcGF0aDogJXMgIGxlbjogJWQgIG1ldGhvZDogJWQgIHZhbHVlOiAlcyIsCi0JICAgIGF0dHJfc3RhdHVzLT5uYW1lLCBhdHRyX3N0YXR1cy0+cGF0aCwgYXR0cl9zdGF0dXMtPmxlbiwKLQkgICAgYXR0cl9zdGF0dXMtPm1ldGhvZCwgYXR0cl9zdGF0dXMtPnZhbHVlKTsKLQotCXJldHVybiBwYXJzZV9zdGF0dXMoYXR0cl9zdGF0dXMtPnZhbHVlKTsKKwlyZXR1cm4gcGFyc2Vfc3RhdHVzKGF0dHJfc3RhdHVzKTsKIH0KIAogc3RhdGljIGludCBnZXRfbnBvcnRzKHZvaWQpCiB7CiAJY2hhciAqYzsKIAlpbnQgbnBvcnRzID0gMDsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyX3N0YXR1czsKKwljb25zdCBjaGFyICphdHRyX3N0YXR1czsKIAotCWF0dHJfc3RhdHVzID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsICJzdGF0dXMiKTsKKwlhdHRyX3N0YXR1cyA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsCisJCQkJCSAgICAgICAic3RhdHVzIik7CiAJaWYgKCFhdHRyX3N0YXR1cykgewotCQlkYmcoInN5c2ZzX2dldF9kZXZpY2VfYXR0cihcInN0YXR1c1wiKSBmYWlsZWQ6ICVzIiwKLQkJICAgIHZoY2lfZHJpdmVyLT5oY19kZXZpY2UtPm5hbWUpOworCQllcnIoInVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlIGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZGJnKCJuYW1lOiAlcyAgcGF0aDogJXMgIGxlbjogJWQgIG1ldGhvZDogJWQgIHZhbHVlOiAlcyIsCi0JICAgIGF0dHJfc3RhdHVzLT5uYW1lLCBhdHRyX3N0YXR1cy0+cGF0aCwgYXR0cl9zdGF0dXMtPmxlbiwKLQkgICAgYXR0cl9zdGF0dXMtPm1ldGhvZCwgYXR0cl9zdGF0dXMtPnZhbHVlKTsKLQogCS8qIHNraXAgYSBoZWFkZXIgbGluZSAqLwotCWMgPSBzdHJjaHIoYXR0cl9zdGF0dXMtPnZhbHVlLCAnXG4nKTsKKwljID0gc3RyY2hyKGF0dHJfc3RhdHVzLCAnXG4nKTsKIAlpZiAoIWMpCiAJCXJldHVybiAwOwogCWMrKzsKQEAgLTI5NSw3MSArMTUyLDY2IEBACiAJcmV0dXJuIG5wb3J0czsKIH0KIAotc3RhdGljIGludCBnZXRfaGNfYnVzaWQoY2hhciAqc3lzZnNfbW50cGF0aCwgY2hhciAqaGNfYnVzaWQpCisvKgorICogUmVhZCB0aGUgZ2l2ZW4gcG9ydCdzIHJlY29yZC4KKyAqCisgKiBUbyBhdm9pZCBidWZmZXIgb3ZlcmZsb3cgd2Ugd2lsbCByZWFkIHRoZSBlbnRpcmUgbGluZSBhbmQKKyAqIHZhbGlkYXRlIGVhY2ggcGFydCdzIHNpemUuIFRoZSBpbml0aWFsIGJ1ZmZlciBpcyBwYWRkZWQgYnkgNCB0bworICogYWNjb21tb2RhdGUgdGhlIDIgc3BhY2VzLCAxIG5ld2xpbmUgYW5kIGFuIGFkZGl0aW9uYWwgY2hhcmFjdGVyCisgKiB3aGljaCBpcyBuZWVkZWQgdG8gcHJvcGVybHkgdmFsaWRhdGUgdGhlIDNyZCBwYXJ0IHdpdGhvdXQgaXQgYmVpbmcKKyAqIHRydW5jYXRlZCB0byBhbiBhY2NlcHRhYmxlIGxlbmd0aC4KKyAqLworc3RhdGljIGludCByZWFkX3JlY29yZChpbnQgcmhwb3J0LCBjaGFyICpob3N0LCB1bnNpZ25lZCBsb25nIGhvc3RfbGVuLAorCQljaGFyICpwb3J0LCB1bnNpZ25lZCBsb25nIHBvcnRfbGVuLCBjaGFyICpidXNpZCkKIHsKLQlzdHJ1Y3Qgc3lzZnNfZHJpdmVyICpzZHJpdmVyOwotCWNoYXIgc2RyaXZlcl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmhjX2RldjsKLQlzdHJ1Y3QgZGxpc3QgKmhjX2RldnM7Ci0KLQlpbnQgZm91bmQgPSAwOwotCi0Jc25wcmludGYoc2RyaXZlcl9wYXRoLCBTWVNGU19QQVRIX01BWCwgIiVzLyVzLyVzLyVzLyVzIiwgc3lzZnNfbW50cGF0aCwKLQlTWVNGU19CVVNfTkFNRSwgVVNCSVBfVkhDSV9CVVNfVFlQRSwgU1lTRlNfRFJJVkVSU19OQU1FLAotCVVTQklQX1ZIQ0lfRFJWX05BTUUpOwotCi0Jc2RyaXZlciA9IHN5c2ZzX29wZW5fZHJpdmVyX3BhdGgoc2RyaXZlcl9wYXRoKTsKLQlpZiAoIXNkcml2ZXIpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RyaXZlcl9wYXRoIGZhaWxlZDogJXMiLCBzZHJpdmVyX3BhdGgpOwotCQlkYmcoIm1ha2Ugc3VyZSAiIFVTQklQX0NPUkVfTU9EX05BTUUgIi5rbyBhbmQgIgotCQkgICAgVVNCSVBfVkhDSV9EUlZfTkFNRSAiLmtvIGFyZSBsb2FkZWQhIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQloY19kZXZzID0gc3lzZnNfZ2V0X2RyaXZlcl9kZXZpY2VzKHNkcml2ZXIpOwotCWlmICghaGNfZGV2cykgewotCQlkYmcoInN5c2ZzX2dldF9kcml2ZXIgZmFpbGVkIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGFzc3VtZSBvbmx5IG9uZSB2aGNpX2hjZCAqLwotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoaGNfZGV2cywgaGNfZGV2LCBzdHJ1Y3Qgc3lzZnNfZGV2aWNlKSB7Ci0JCXN0cm5jcHkoaGNfYnVzaWQsIGhjX2Rldi0+YnVzX2lkLCBTWVNGU19CVVNfSURfU0laRSk7Ci0JCWZvdW5kID0gMTsKLQl9Ci0KLWVycjoKLQlzeXNmc19jbG9zZV9kcml2ZXIoc2RyaXZlcik7Ci0KLQlpZiAoZm91bmQpCi0JCXJldHVybiAwOwotCi0JZGJnKCIlcyBub3QgZm91bmQiLCBoY19idXNpZCk7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IHJlYWRfcmVjb3JkKGludCByaHBvcnQsIGNoYXIgKmhvc3QsIGNoYXIgKnBvcnQsIGNoYXIgKmJ1c2lkKQoteworCWludCBwYXJ0OwogCUZJTEUgKmZpbGU7CiAJY2hhciBwYXRoW1BBVEhfTUFYKzFdOworCWNoYXIgKmJ1ZmZlciwgKnN0YXJ0LCAqZW5kOworCWNoYXIgZGVsaW1bXSA9IHsnICcsICcgJywgJ1xuJ307CisJaW50IG1heF9sZW5bXSA9IHsoaW50KWhvc3RfbGVuLCAoaW50KXBvcnRfbGVuLCBTWVNGU19CVVNfSURfU0laRX07CisJc2l6ZV90IGJ1ZmZlcl9sZW4gPSBob3N0X2xlbiArIHBvcnRfbGVuICsgU1lTRlNfQlVTX0lEX1NJWkUgKyA0OworCisJYnVmZmVyID0gbWFsbG9jKGJ1ZmZlcl9sZW4pOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLTE7CiAKIAlzbnByaW50ZihwYXRoLCBQQVRIX01BWCwgVkhDSV9TVEFURV9QQVRIIi9wb3J0JWQiLCByaHBvcnQpOwogCiAJZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7CiAJaWYgKCFmaWxlKSB7CiAJCWVycigiZm9wZW4iKTsKKwkJZnJlZShidWZmZXIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKGZzY2FuZihmaWxlLCAiJXMgJXMgJXNcbiIsIGhvc3QsIHBvcnQsIGJ1c2lkKSAhPSAzKSB7Ci0JCWVycigiZnNjYW5mIik7CisJaWYgKGZnZXRzKGJ1ZmZlciwgYnVmZmVyX2xlbiwgZmlsZSkgPT0gTlVMTCkgeworCQllcnIoImZnZXRzIik7CisJCWZyZWUoYnVmZmVyKTsKIAkJZmNsb3NlKGZpbGUpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJZmNsb3NlKGZpbGUpOwogCisJLyogdmFsaWRhdGUgdGhlIGxlbmd0aCBvZiBlYWNoIG9mIHRoZSAzIHBhcnRzICovCisJc3RhcnQgPSBidWZmZXI7CisJZm9yIChwYXJ0ID0gMDsgcGFydCA8IDM7IHBhcnQrKykgeworCQllbmQgPSBzdHJjaHIoc3RhcnQsIGRlbGltW3BhcnRdKTsKKwkJaWYgKGVuZCA9PSBOVUxMIHx8IChlbmQgLSBzdGFydCkgPiBtYXhfbGVuW3BhcnRdKSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RhcnQgPSBlbmQgKyAxOworCX0KKworCWlmIChzc2NhbmYoYnVmZmVyLCAiJXMgJXMgJXNcbiIsIGhvc3QsIHBvcnQsIGJ1c2lkKSAhPSAzKSB7CisJCWVycigic3NjYW5mIik7CisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZyZWUoYnVmZmVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNjcsMzAgKzIxOSwyMSBAQAogCiBpbnQgdXNiaXBfdmhjaV9kcml2ZXJfb3Blbih2b2lkKQogewotCWludCByZXQ7Ci0JY2hhciBoY19idXNpZFtTWVNGU19CVVNfSURfU0laRV07Ci0KLQl2aGNpX2RyaXZlciA9IChzdHJ1Y3QgdXNiaXBfdmhjaV9kcml2ZXIgKikgY2FsbG9jKDEsIHNpemVvZigqdmhjaV9kcml2ZXIpKTsKLQlpZiAoIXZoY2lfZHJpdmVyKSB7Ci0JCWRiZygiY2FsbG9jIGZhaWxlZCIpOworCXVkZXZfY29udGV4dCA9IHVkZXZfbmV3KCk7CisJaWYgKCF1ZGV2X2NvbnRleHQpIHsKKwkJZXJyKCJ1ZGV2X25ldyBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldCA9IHN5c2ZzX2dldF9tbnRfcGF0aCh2aGNpX2RyaXZlci0+c3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3lzZnNfZ2V0X21udF9wYXRoIGZhaWxlZCIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBnZXRfaGNfYnVzaWQodmhjaV9kcml2ZXItPnN5c2ZzX21udHBhdGgsIGhjX2J1c2lkKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI7CisJdmhjaV9kcml2ZXIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c2JpcF92aGNpX2RyaXZlcikpOwogCiAJLyogd2lsbCBiZSBmcmVlZCBpbiB1c2JpcF9kcml2ZXJfY2xvc2UoKSAqLwotCXZoY2lfZHJpdmVyLT5oY19kZXZpY2UgPSBzeXNmc19vcGVuX2RldmljZShVU0JJUF9WSENJX0JVU19UWVBFLAotCQkJCQkJICAgaGNfYnVzaWQpOworCXZoY2lfZHJpdmVyLT5oY19kZXZpY2UgPQorCQl1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2X2NvbnRleHQsCisJCQkJCQkgICAgICAgVVNCSVBfVkhDSV9CVVNfVFlQRSwKKwkJCQkJCSAgICAgICBVU0JJUF9WSENJX0RSVl9OQU1FKTsKIAlpZiAoIXZoY2lfZHJpdmVyLT5oY19kZXZpY2UpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RldmljZSBmYWlsZWQiKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSBmYWlsZWQiKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0zOTgsMjkgKzI0MSwyMSBAQAogCiAJZGJnKCJhdmFpbGFibGUgcG9ydHM6ICVkIiwgdmhjaV9kcml2ZXItPm5wb3J0cyk7CiAKLQl2aGNpX2RyaXZlci0+Y2Rldl9saXN0ID0gZGxpc3RfbmV3KHNpemVvZihzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlKSk7Ci0JaWYgKCF2aGNpX2RyaXZlci0+Y2Rldl9saXN0KQotCQlnb3RvIGVycjsKLQotCWlmIChyZWZyZXNoX2NsYXNzX2RldmljZV9saXN0KCkpCi0JCWdvdG8gZXJyOwotCiAJaWYgKHJlZnJlc2hfaW1wb3J0ZWRfZGV2aWNlX2xpc3QoKSkKIAkJZ290byBlcnI7CiAKLQogCXJldHVybiAwOwogCi0KIGVycjoKLQlpZiAodmhjaV9kcml2ZXItPmNkZXZfbGlzdCkKLQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+Y2Rldl9saXN0KTsKLQlpZiAodmhjaV9kcml2ZXItPmhjX2RldmljZSkKLQkJc3lzZnNfY2xvc2VfZGV2aWNlKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpOworCXVkZXZfZGV2aWNlX3VucmVmKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpOworCiAJaWYgKHZoY2lfZHJpdmVyKQogCQlmcmVlKHZoY2lfZHJpdmVyKTsKIAogCXZoY2lfZHJpdmVyID0gTlVMTDsKKworCXVkZXZfdW5yZWYodWRldl9jb250ZXh0KTsKKwogCXJldHVybiAtMTsKIH0KIApAQCAtNDMwLDUzICsyNjUsMjQgQEAKIAlpZiAoIXZoY2lfZHJpdmVyKQogCQlyZXR1cm47CiAKLQlpZiAodmhjaV9kcml2ZXItPmNkZXZfbGlzdCkKLQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+Y2Rldl9saXN0KTsKKwl1ZGV2X2RldmljZV91bnJlZih2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKIAotCWZvciAoaW50IGkgPSAwOyBpIDwgdmhjaV9kcml2ZXItPm5wb3J0czsgaSsrKSB7Ci0JCWlmICh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpCi0JCQlkbGlzdF9kZXN0cm95KHZoY2lfZHJpdmVyLT5pZGV2W2ldLmNkZXZfbGlzdCk7Ci0JfQotCi0JaWYgKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpCi0JCXN5c2ZzX2Nsb3NlX2RldmljZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKIAlmcmVlKHZoY2lfZHJpdmVyKTsKIAogCXZoY2lfZHJpdmVyID0gTlVMTDsKKworCXVkZXZfdW5yZWYodWRldl9jb250ZXh0KTsKIH0KIAogCiBpbnQgdXNiaXBfdmhjaV9yZWZyZXNoX2RldmljZV9saXN0KHZvaWQpCiB7Ci0JaWYgKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmNkZXZfbGlzdCk7Ci0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdmhjaV9kcml2ZXItPm5wb3J0czsgaSsrKSB7Ci0JCWlmICh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpCi0JCQlkbGlzdF9kZXN0cm95KHZoY2lfZHJpdmVyLT5pZGV2W2ldLmNkZXZfbGlzdCk7Ci0JfQotCi0JdmhjaV9kcml2ZXItPmNkZXZfbGlzdCA9IGRsaXN0X25ldyhzaXplb2Yoc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkpOwotCWlmICghdmhjaV9kcml2ZXItPmNkZXZfbGlzdCkKLQkJZ290byBlcnI7Ci0KLQlpZiAocmVmcmVzaF9jbGFzc19kZXZpY2VfbGlzdCgpKQotCQlnb3RvIGVycjsKIAogCWlmIChyZWZyZXNoX2ltcG9ydGVkX2RldmljZV9saXN0KCkpCiAJCWdvdG8gZXJyOwogCiAJcmV0dXJuIDA7CiBlcnI6Ci0JaWYgKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmNkZXZfbGlzdCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHZoY2lfZHJpdmVyLT5ucG9ydHM7IGkrKykgewotCQlpZiAodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KQotCQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpOwotCX0KLQogCWRiZygiZmFpbGVkIHRvIHJlZnJlc2ggZGV2aWNlIGxpc3QiKTsKIAlyZXR1cm4gLTE7CiB9CkBAIC00OTQsMjQgKzMwMCwyNCBAQAogCiBpbnQgdXNiaXBfdmhjaV9hdHRhY2hfZGV2aWNlMih1aW50OF90IHBvcnQsIGludCBzb2NrZmQsIHVpbnQzMl90IGRldmlkLAogCQl1aW50MzJfdCBzcGVlZCkgewotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmF0dHJfYXR0YWNoOwogCWNoYXIgYnVmZlsyMDBdOyAvKiB3aGF0IHNpemUgc2hvdWxkIGJlID8gKi8KKwljaGFyIGF0dGFjaF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgYXR0cl9hdHRhY2hbXSA9ICJhdHRhY2giOworCWNvbnN0IGNoYXIgKnBhdGg7CiAJaW50IHJldDsKIAotCWF0dHJfYXR0YWNoID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsICJhdHRhY2giKTsKLQlpZiAoIWF0dHJfYXR0YWNoKSB7Ci0JCWRiZygic3lzZnNfZ2V0X2RldmljZV9hdHRyKFwiYXR0YWNoXCIpIGZhaWxlZDogJXMiLAotCQkgICAgdmhjaV9kcml2ZXItPmhjX2RldmljZS0+bmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksICIldSAldSAldSAldSIsCisJc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJXUgJWQgJXUgJXUiLAogCQkJcG9ydCwgc29ja2ZkLCBkZXZpZCwgc3BlZWQpOwogCWRiZygid3JpdGluZzogJXMiLCBidWZmKTsKIAotCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyX2F0dGFjaCwgYnVmZiwgc3RybGVuKGJ1ZmYpKTsKKwlwYXRoID0gdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CisJc25wcmludGYoYXR0YWNoX2F0dHJfcGF0aCwgc2l6ZW9mKGF0dGFjaF9hdHRyX3BhdGgpLCAiJXMvJXMiLAorCQkgcGF0aCwgYXR0cl9hdHRhY2gpOworCWRiZygiYXR0YWNoIGF0dHJpYnV0ZSBwYXRoOiAlcyIsIGF0dGFjaF9hdHRyX3BhdGgpOworCisJcmV0ID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKGF0dGFjaF9hdHRyX3BhdGgsIGJ1ZmYsIHN0cmxlbihidWZmKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc193cml0ZV9hdHRyaWJ1dGUgZmFpbGVkIik7CisJCWRiZygid3JpdGVfc3lzZnNfYXR0cmlidXRlIGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC01MzYsMjMgKzM0MiwyMyBAQAogCiBpbnQgdXNiaXBfdmhjaV9kZXRhY2hfZGV2aWNlKHVpbnQ4X3QgcG9ydCkKIHsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICAqYXR0cl9kZXRhY2g7CisJY2hhciBkZXRhY2hfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIGF0dHJfZGV0YWNoW10gPSAiZGV0YWNoIjsKIAljaGFyIGJ1ZmZbMjAwXTsgLyogd2hhdCBzaXplIHNob3VsZCBiZSA/ICovCisJY29uc3QgY2hhciAqcGF0aDsKIAlpbnQgcmV0OwogCi0JYXR0cl9kZXRhY2ggPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIodmhjaV9kcml2ZXItPmhjX2RldmljZSwgImRldGFjaCIpOwotCWlmICghYXR0cl9kZXRhY2gpIHsKLQkJZGJnKCJzeXNmc19nZXRfZGV2aWNlX2F0dHIoXCJkZXRhY2hcIikgZmFpbGVkOiAlcyIsCi0JCSAgICB2aGNpX2RyaXZlci0+aGNfZGV2aWNlLT5uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCXNucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiV1IiwgcG9ydCk7CiAJZGJnKCJ3cml0aW5nOiAlcyIsIGJ1ZmYpOwogCi0JcmV0ID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKGF0dHJfZGV0YWNoLCBidWZmLCBzdHJsZW4oYnVmZikpOworCXBhdGggPSB1ZGV2X2RldmljZV9nZXRfc3lzcGF0aCh2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKKwlzbnByaW50ZihkZXRhY2hfYXR0cl9wYXRoLCBzaXplb2YoZGV0YWNoX2F0dHJfcGF0aCksICIlcy8lcyIsCisJCSBwYXRoLCBhdHRyX2RldGFjaCk7CisJZGJnKCJkZXRhY2ggYXR0cmlidXRlIHBhdGg6ICVzIiwgZGV0YWNoX2F0dHJfcGF0aCk7CisKKwlyZXQgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUoZGV0YWNoX2F0dHJfcGF0aCwgYnVmZiwgc3RybGVuKGJ1ZmYpKTsKIAlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX3dyaXRlX2F0dHJpYnV0ZSBmYWlsZWQiKTsKKwkJZGJnKCJ3cml0ZV9zeXNmc19hdHRyaWJ1dGUgZmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTU3Myw3ICszNzksOCBAQAogCWlmIChpZGV2LT5zdGF0dXMgPT0gVkRFVl9TVF9OVUxMIHx8IGlkZXYtPnN0YXR1cyA9PSBWREVWX1NUX05PVEFTU0lHTkVEKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHJlYWRfcmVjb3JkKGlkZXYtPnBvcnQsIGhvc3QsIHNlcnYsIHJlbW90ZV9idXNpZCk7CisJcmV0ID0gcmVhZF9yZWNvcmQoaWRldi0+cG9ydCwgaG9zdCwgc2l6ZW9mKGhvc3QpLCBzZXJ2LCBzaXplb2Yoc2VydiksCisJCQkgIHJlbW90ZV9idXNpZCk7CiAJaWYgKHJldCkgewogCQllcnIoInJlYWRfcmVjb3JkIik7CiAJCXJlYWRfcmVjb3JkX2Vycm9yID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5oCmluZGV4IGUwNzFmODAuLmZhMjMxNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuaApAQCAtNSw3ICs1LDcgQEAKICNpZm5kZWYgX19WSENJX0RSSVZFUl9ICiAjZGVmaW5lIF9fVkhDSV9EUklWRVJfSAogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKQEAgLTEzLDExICsxMyw2IEBACiAjZGVmaW5lIFVTQklQX1ZIQ0lfQlVTX1RZUEUgInBsYXRmb3JtIgogI2RlZmluZSBNQVhOUE9SVCAxMjgKIAotc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSB7Ci0JY2hhciBjbGFzc19wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQljaGFyIGRldl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLX07Ci0KIHN0cnVjdCB1c2JpcF9pbXBvcnRlZF9kZXZpY2UgewogCXVpbnQ4X3QgcG9ydDsKIAl1aW50MzJfdCBzdGF0dXM7CkBAIC0yOCwxOCArMjMsMTMgQEAKIAl1aW50OF90IGRldm51bTsKIAogCS8qIHVzYmlwX2NsYXNzX2RldmljZSBsaXN0ICovCi0Jc3RydWN0IGRsaXN0ICpjZGV2X2xpc3Q7CiAJc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgdWRldjsKIH07CiAKIHN0cnVjdCB1c2JpcF92aGNpX2RyaXZlciB7Ci0JY2hhciBzeXNmc19tbnRwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKIAogCS8qIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aGNpX2hjZCAqLwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmhjX2RldmljZTsKLQotCS8qIHVzYmlwX2NsYXNzX2RldmljZSBsaXN0ICovCi0Jc3RydWN0IGRsaXN0ICpjZGV2X2xpc3Q7CisJc3RydWN0IHVkZXZfZGV2aWNlICpoY19kZXZpY2U7CiAKIAlpbnQgbnBvcnRzOwogCXN0cnVjdCB1c2JpcF9pbXBvcnRlZF9kZXZpY2UgaWRldltNQVhOUE9SVF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy9NYWtlZmlsZS5hbSBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL01ha2VmaWxlLmFtCmluZGV4IGI0ZjhjNGIwLi5lODFhNGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy9NYWtlZmlsZS5hbQorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy9NYWtlZmlsZS5hbQpAQCAtOCw1ICs4LDQgQEAKIAkJIHVzYmlwX2F0dGFjaC5jIHVzYmlwX2RldGFjaC5jIHVzYmlwX2xpc3QuYyBcCiAJCSB1c2JpcF9iaW5kLmMgdXNiaXBfdW5iaW5kLmMgdXNiaXBfcG9ydC5jCiAKLQogdXNiaXBkX1NPVVJDRVMgOj0gdXNiaXBfbmV0d29yay5oIHVzYmlwZC5jIHVzYmlwX25ldHdvcmsuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9hdHRhY2guYwppbmRleCAwODU4NDExLi43MTZhNzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9hdHRhY2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9hdHRhY2guYwpAQCAtMTcsNyArMTcsNiBAQAogICovCiAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2JpbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2JpbmQuYwppbmRleCA5ZWNhZjZlLi5mYTQ2MTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9iaW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYmluZC5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgorI2luY2x1ZGUgPGxpYnVkZXYuaD4KIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKICNpbmNsdWRlICJ1dGlscy5oIgogI2luY2x1ZGUgInVzYmlwLmgiCisjaW5jbHVkZSAic3lzZnNfdXRpbHMuaCIKIAogZW51bSB1bmJpbmRfc3RhdHVzIHsKIAlVTkJJTkRfU1RfT0ssCkBAIC00OCwxNjcgKzQ5LDkyIEBACiAvKiBjYWxsIGF0IHVuYm91bmQgc3RhdGUgKi8KIHN0YXRpYyBpbnQgYmluZF91c2JpcChjaGFyICpidXNpZCkKIHsKLQljaGFyIGJ1c190eXBlW10gPSAidXNiIjsKIAljaGFyIGF0dHJfbmFtZVtdID0gImJpbmQiOwotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07CiAJY2hhciBiaW5kX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0JY2hhciBpbnRmX2J1c2lkW1NZU0ZTX0JVU19JRF9TSVpFXTsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpidXNpZF9kZXY7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYmluZF9hdHRyOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJDb25mVmFsdWU7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYk51bUludGZzOwotCWludCBpLCBmYWlsZWQgPSAwOwotCWludCByYywgcmV0ID0gLTE7Ci0KLQlyYyA9IHN5c2ZzX2dldF9tbnRfcGF0aChzeXNmc19tbnRwYXRoLCBTWVNGU19QQVRIX01BWCk7Ci0JaWYgKHJjIDwgMCkgewotCQllcnIoInN5c2ZzIG11c3QgYmUgbW91bnRlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQorCWludCByYyA9IC0xOwogCiAJc25wcmludGYoYmluZF9hdHRyX3BhdGgsIHNpemVvZihiaW5kX2F0dHJfcGF0aCksICIlcy8lcy8lcy8lcy8lcy8lcyIsCi0JCSBzeXNmc19tbnRwYXRoLCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwKLQkJIFVTQklQX0hPU1RfRFJWX05BTUUsIGF0dHJfbmFtZSk7CisJCSBTWVNGU19NTlRfUEFUSCwgU1lTRlNfQlVTX05BTUUsIFNZU0ZTX0JVU19UWVBFLAorCQkgU1lTRlNfRFJJVkVSU19OQU1FLCBVU0JJUF9IT1NUX0RSVl9OQU1FLCBhdHRyX25hbWUpOwogCi0JYmluZF9hdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUoYmluZF9hdHRyX3BhdGgpOwotCWlmICghYmluZF9hdHRyKSB7Ci0JCWRiZygicHJvYmxlbSBnZXR0aW5nIGJpbmQgYXR0cmlidXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmMgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUoYmluZF9hdHRyX3BhdGgsIGJ1c2lkLCBzdHJsZW4oYnVzaWQpKTsKKwlpZiAocmMgPCAwKSB7CisJCWVycigiZXJyb3IgYmluZGluZyBkZXZpY2UgJXMgdG8gZHJpdmVyOiAlcyIsIGJ1c2lkLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWJ1c2lkX2RldiA9IHN5c2ZzX29wZW5fZGV2aWNlKGJ1c190eXBlLCBidXNpZCk7Ci0JaWYgKCFidXNpZF9kZXYpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RldmljZSAlcyBmYWlsZWQ6ICVzIiwgYnVzaWQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX2Nsb3NlX2JpbmRfYXR0cjsKLQl9Ci0KLQliQ29uZlZhbHVlID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGJ1c2lkX2RldiwgImJDb25maWd1cmF0aW9uVmFsdWUiKTsKLQliTnVtSW50ZnMgID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGJ1c2lkX2RldiwgImJOdW1JbnRlcmZhY2VzIik7Ci0KLQlpZiAoIWJDb25mVmFsdWUgfHwgIWJOdW1JbnRmcykgewotCQlkYmcoInByb2JsZW0gZ2V0dGluZyBkZXZpY2UgYXR0cmlidXRlczogJXMiLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBlcnJfY2xvc2VfYnVzaWRfZGV2OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBhdG9pKGJOdW1JbnRmcy0+dmFsdWUpOyBpKyspIHsKLQkJc25wcmludGYoaW50Zl9idXNpZCwgU1lTRlNfQlVTX0lEX1NJWkUsICIlczolLjFzLiVkIiwgYnVzaWQsCi0JCQkgYkNvbmZWYWx1ZS0+dmFsdWUsIGkpOwotCi0JCXJjID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKGJpbmRfYXR0ciwgaW50Zl9idXNpZCwKLQkJCQkJICAgU1lTRlNfQlVTX0lEX1NJWkUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkYmcoImJpbmQgZHJpdmVyIGF0ICVzIGZhaWxlZCIsIGludGZfYnVzaWQpOwotCQkJZmFpbGVkID0gMTsKLQkJfQotCX0KLQotCWlmICghZmFpbGVkKQotCQlyZXQgPSAwOwotCi1lcnJfY2xvc2VfYnVzaWRfZGV2OgotCXN5c2ZzX2Nsb3NlX2RldmljZShidXNpZF9kZXYpOwotZXJyX2Nsb3NlX2JpbmRfYXR0cjoKLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYmluZF9hdHRyKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIGJ1Z2d5IGRyaXZlciBtYXkgY2F1c2UgZGVhZCBsb2NrICovCiBzdGF0aWMgaW50IHVuYmluZF9vdGhlcihjaGFyICpidXNpZCkKIHsKLQljaGFyIGJ1c190eXBlW10gPSAidXNiIjsKLQljaGFyIGludGZfYnVzaWRbU1lTRlNfQlVTX0lEX1NJWkVdOwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmJ1c2lkX2RldjsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICppbnRmX2RldjsKLQlzdHJ1Y3Qgc3lzZnNfZHJpdmVyICppbnRmX2RydjsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICp1bmJpbmRfYXR0cjsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiQ29uZlZhbHVlOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJEZXZDbGFzczsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiTnVtSW50ZnM7Ci0JaW50IGksIHJjOwogCWVudW0gdW5iaW5kX3N0YXR1cyBzdGF0dXMgPSBVTkJJTkRfU1RfT0s7CiAKLQlidXNpZF9kZXYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgYnVzaWQpOwotCWlmICghYnVzaWRfZGV2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgJXMgZmFpbGVkOiAlcyIsIGJ1c2lkLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQorCWNoYXIgYXR0cl9uYW1lW10gPSAidW5iaW5kIjsKKwljaGFyIHVuYmluZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOworCWludCByYyA9IC0xOwogCi0JYkNvbmZWYWx1ZSA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiQ29uZmlndXJhdGlvblZhbHVlIik7Ci0JYkRldkNsYXNzICA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiRGV2aWNlQ2xhc3MiKTsKLQliTnVtSW50ZnMgID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGJ1c2lkX2RldiwgImJOdW1JbnRlcmZhY2VzIik7Ci0JaWYgKCFiQ29uZlZhbHVlIHx8ICFiRGV2Q2xhc3MgfHwgIWJOdW1JbnRmcykgewotCQlkYmcoInByb2JsZW0gZ2V0dGluZyBkZXZpY2UgYXR0cmlidXRlczogJXMiLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwlzdHJ1Y3QgdWRldiAqdWRldjsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICpkcml2ZXI7CisJY29uc3QgY2hhciAqYkRldkNsYXNzOworCisJLyogQ3JlYXRlIGxpYnVkZXYgY29udGV4dC4gKi8KKwl1ZGV2ID0gdWRldl9uZXcoKTsKKworCS8qIEdldCB0aGUgZGV2aWNlLiAqLworCWRldiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lKHVkZXYsICJ1c2IiLCBidXNpZCk7CisJaWYgKCFkZXYpIHsKKwkJZGJnKCJ1bmFibGUgdG8gZmluZCBkZXZpY2Ugd2l0aCBidXMgSUQgJXMiLCBidXNpZCk7CiAJCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKIAl9CiAKLQlpZiAoIXN0cm5jbXAoYkRldkNsYXNzLT52YWx1ZSwgIjA5IiwgYkRldkNsYXNzLT5sZW4pKSB7CisJLyogQ2hlY2sgd2hhdCBraW5kIG9mIGRldmljZSBpdCBpcy4gKi8KKwliRGV2Q2xhc3MgID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAiYkRldmljZUNsYXNzIik7CisJaWYgKCFiRGV2Q2xhc3MpIHsKKwkJZGJnKCJ1bmFibGUgdG8gZ2V0IGJEZXZDbGFzcyBkZXZpY2UgYXR0cmlidXRlIik7CisJCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKKwl9CisKKwlpZiAoIXN0cm5jbXAoYkRldkNsYXNzLCAiMDkiLCBzdHJsZW4oYkRldkNsYXNzKSkpIHsKIAkJZGJnKCJza2lwIHVuYmluZGluZyBvZiBodWIiKTsKIAkJZ290byBlcnJfY2xvc2VfYnVzaWRfZGV2OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBhdG9pKGJOdW1JbnRmcy0+dmFsdWUpOyBpKyspIHsKLQkJc25wcmludGYoaW50Zl9idXNpZCwgU1lTRlNfQlVTX0lEX1NJWkUsICIlczolLjFzLiVkIiwgYnVzaWQsCi0JCQkgYkNvbmZWYWx1ZS0+dmFsdWUsIGkpOwotCQlpbnRmX2RldiA9IHN5c2ZzX29wZW5fZGV2aWNlKGJ1c190eXBlLCBpbnRmX2J1c2lkKTsKLQkJaWYgKCFpbnRmX2RldikgewotCQkJZGJnKCJjb3VsZCBub3Qgb3BlbiBpbnRlcmZhY2UgZGV2aWNlOiAlcyIsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKLQkJfQorCS8qIEdldCB0aGUgZGV2aWNlIGRyaXZlci4gKi8KKwlkcml2ZXIgPSB1ZGV2X2RldmljZV9nZXRfZHJpdmVyKGRldik7CisJaWYgKCFkcml2ZXIpIHsKKwkJLyogTm8gZHJpdmVyIGJvdW5kIHRvIHRoaXMgZGV2aWNlLiAqLworCQlnb3RvIG91dDsKKwl9CiAKLQkJZGJnKCIlcyAtPiAlcyIsIGludGZfZGV2LT5uYW1lLCAgaW50Zl9kZXYtPmRyaXZlcl9uYW1lKTsKKwlpZiAoIXN0cm5jbXAoVVNCSVBfSE9TVF9EUlZfTkFNRSwgZHJpdmVyLAorCQkJCXN0cmxlbihVU0JJUF9IT1NUX0RSVl9OQU1FKSkpIHsKKwkJLyogQWxyZWFkeSBib3VuZCB0byB1c2JpcC1ob3N0LiAqLworCQlzdGF0dXMgPSBVTkJJTkRfU1RfVVNCSVBfSE9TVDsKKwkJZ290byBvdXQ7CisJfQogCi0JCWlmICghc3RybmNtcCgidW5rbm93biIsIGludGZfZGV2LT5kcml2ZXJfbmFtZSwgU1lTRlNfTkFNRV9MRU4pKQotCQkJLyogdW5ib3VuZCBpbnRlcmZhY2UgKi8KLQkJCWNvbnRpbnVlOworCS8qIFVuYmluZCBkZXZpY2UgZnJvbSBkcml2ZXIuICovCisJc25wcmludGYodW5iaW5kX2F0dHJfcGF0aCwgc2l6ZW9mKHVuYmluZF9hdHRyX3BhdGgpLCAiJXMvJXMvJXMvJXMvJXMvJXMiLAorCQkgU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLCBTWVNGU19CVVNfVFlQRSwKKwkJIFNZU0ZTX0RSSVZFUlNfTkFNRSwgZHJpdmVyLCBhdHRyX25hbWUpOwogCi0JCWlmICghc3RybmNtcChVU0JJUF9IT1NUX0RSVl9OQU1FLCBpbnRmX2Rldi0+ZHJpdmVyX25hbWUsCi0JCQkgICAgIFNZU0ZTX05BTUVfTEVOKSkgewotCQkJLyogYWxyZWFkeSBib3VuZCB0byB1c2JpcC1ob3N0ICovCi0JCQlzdGF0dXMgPSBVTkJJTkRfU1RfVVNCSVBfSE9TVDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogdW5iaW5kaW5nICovCi0JCWludGZfZHJ2ID0gc3lzZnNfb3Blbl9kcml2ZXIoYnVzX3R5cGUsIGludGZfZGV2LT5kcml2ZXJfbmFtZSk7Ci0JCWlmICghaW50Zl9kcnYpIHsKLQkJCWRiZygiY291bGQgbm90IG9wZW4gaW50ZXJmYWNlIGRyaXZlciBvbiAlczogJXMiLAotCQkJICAgIGludGZfZGV2LT5uYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQkJZ290byBlcnJfY2xvc2VfaW50Zl9kZXY7Ci0JCX0KLQotCQl1bmJpbmRfYXR0ciA9IHN5c2ZzX2dldF9kcml2ZXJfYXR0cihpbnRmX2RydiwgInVuYmluZCIpOwotCQlpZiAoIXVuYmluZF9hdHRyKSB7Ci0JCQlkYmcoInByb2JsZW0gZ2V0dGluZyBpbnRlcmZhY2UgZHJpdmVyIGF0dHJpYnV0ZTogJXMiLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGVycl9jbG9zZV9pbnRmX2RydjsKLQkJfQotCi0JCXJjID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKHVuYmluZF9hdHRyLCBpbnRmX2Rldi0+YnVzX2lkLAotCQkJCQkgICBTWVNGU19CVVNfSURfU0laRSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCS8qIE5PVEU6IHdoeSBrZWVwIHVuYmluZGluZyBvdGhlciBpbnRlcmZhY2VzPyAqLwotCQkJZGJnKCJ1bmJpbmQgZHJpdmVyIGF0ICVzIGZhaWxlZCIsIGludGZfZGV2LT5idXNfaWQpOwotCQkJc3RhdHVzID0gVU5CSU5EX1NUX0ZBSUxFRDsKLQkJfQotCi0JCXN5c2ZzX2Nsb3NlX2RyaXZlcihpbnRmX2Rydik7Ci0JCXN5c2ZzX2Nsb3NlX2RldmljZShpbnRmX2Rldik7CisJcmMgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUodW5iaW5kX2F0dHJfcGF0aCwgYnVzaWQsIHN0cmxlbihidXNpZCkpOworCWlmIChyYyA8IDApIHsKKwkJZXJyKCJlcnJvciB1bmJpbmRpbmcgZGV2aWNlICVzIGZyb20gZHJpdmVyIiwgYnVzaWQpOworCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7CiAJfQogCiAJZ290byBvdXQ7CiAKLWVycl9jbG9zZV9pbnRmX2RydjoKLQlzeXNmc19jbG9zZV9kcml2ZXIoaW50Zl9kcnYpOwotZXJyX2Nsb3NlX2ludGZfZGV2OgotCXN5c2ZzX2Nsb3NlX2RldmljZShpbnRmX2Rldik7CiBlcnJfY2xvc2VfYnVzaWRfZGV2OgogCXN0YXR1cyA9IFVOQklORF9TVF9GQUlMRUQ7CiBvdXQ6Ci0Jc3lzZnNfY2xvc2VfZGV2aWNlKGJ1c2lkX2Rldik7CisJdWRldl9kZXZpY2VfdW5yZWYoZGV2KTsKKwl1ZGV2X3VucmVmKHVkZXYpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIxNiw2ICsxNDIsMTcgQEAKIHN0YXRpYyBpbnQgYmluZF9kZXZpY2UoY2hhciAqYnVzaWQpCiB7CiAJaW50IHJjOworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2OworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHdpdGggdGhpcyBidXMgSUQgZXhpc3RzLiAqLworCXVkZXYgPSB1ZGV2X25ldygpOworCWRldiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lKHVkZXYsICJ1c2IiLCBidXNpZCk7CisJaWYgKCFkZXYpIHsKKwkJZXJyKCJkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGJ1cyBJRCBkb2VzIG5vdCBleGlzdCIpOworCQlyZXR1cm4gLTE7CisJfQorCXVkZXZfdW5yZWYodWRldik7CiAKIAlyYyA9IHVuYmluZF9vdGhlcihidXNpZCk7CiAJaWYgKHJjID09IFVOQklORF9TVF9GQUlMRUQpIHsKQEAgLTI0MCw3ICsxNzcsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpbnRmKCJiaW5kIGRldmljZSBvbiBidXNpZCAlczogY29tcGxldGVcbiIsIGJ1c2lkKTsKKwlpbmZvKCJiaW5kIGRldmljZSBvbiBidXNpZCAlczogY29tcGxldGUiLCBidXNpZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfZGV0YWNoLmMKaW5kZXggMTMzMDhkZi4uMDVjNmQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfZGV0YWNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfZGV0YWNoLmMKQEAgLTE2LDggKzE2LDYgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+Ci0KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbGlzdC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbGlzdC5jCmluZGV4IDIzN2UwOTkuLmQ1Y2UzNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2xpc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9saXN0LmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KQEAgLTU0LDcgKzU0LDcgQEAKIAlzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSB1ZGV2OwogCXN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlIHVpbnRmOwogCXVuc2lnbmVkIGludCBpOwotCWludCBqLCByYzsKKwlpbnQgcmMsIGo7CiAKIAlyYyA9IHVzYmlwX25ldF9zZW5kX29wX2NvbW1vbihzb2NrZmQsIE9QX1JFUV9ERVZMSVNULCAwKTsKIAlpZiAocmMgPCAwKSB7CkBAIC0xMDcsMTkgKzEwNywyMCBAQAogCQlmb3IgKGogPSAwOyBqIDwgdWRldi5iTnVtSW50ZXJmYWNlczsgaisrKSB7CiAJCQlyYyA9IHVzYmlwX25ldF9yZWN2KHNvY2tmZCwgJnVpbnRmLCBzaXplb2YodWludGYpKTsKIAkJCWlmIChyYyA8IDApIHsKLQkJCQlkYmcoInVzYmlwX25ldF9yZWN2IGZhaWxlZDogdXNiaXBfdXNiX2ludGZbJWRdIiwKLQkJCQkgICAgaik7CisJCQkJZXJyKCJ1c2JpcF9uZXRfcmVjdiBmYWlsZWQ6IHVzYmlwX3VzYl9pbnRmWyVkXSIsCisJCQkJCQlqKTsKIAogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJCXVzYmlwX25ldF9wYWNrX3VzYl9pbnRlcmZhY2UoMCwgJnVpbnRmKTsKIAogCQkJdXNiaXBfbmFtZXNfZ2V0X2NsYXNzKGNsYXNzX25hbWUsIHNpemVvZihjbGFzc19uYW1lKSwKLQkJCQkJICAgICAgdWludGYuYkludGVyZmFjZUNsYXNzLAotCQkJCQkgICAgICB1aW50Zi5iSW50ZXJmYWNlU3ViQ2xhc3MsCi0JCQkJCSAgICAgIHVpbnRmLmJJbnRlcmZhY2VQcm90b2NvbCk7CisJCQkJCXVpbnRmLmJJbnRlcmZhY2VDbGFzcywKKwkJCQkJdWludGYuYkludGVyZmFjZVN1YkNsYXNzLAorCQkJCQl1aW50Zi5iSW50ZXJmYWNlUHJvdG9jb2wpOwogCQkJcHJpbnRmKCIlMTFzOiAlMmQgLSAlc1xuIiwgIiIsIGosIGNsYXNzX25hbWUpOwogCQl9CisKIAkJcHJpbnRmKCJcbiIpOwogCX0KIApAQCAtMTUwLDggKzE1MSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2RldmljZShjaGFyICpidXNpZCwgY2hhciAqdmVuZG9yLCBjaGFyICpwcm9kdWN0LAotCQkJIGJvb2wgcGFyc2FibGUpCitzdGF0aWMgdm9pZCBwcmludF9kZXZpY2UoY29uc3QgY2hhciAqYnVzaWQsIGNvbnN0IGNoYXIgKnZlbmRvciwKKwkJCSBjb25zdCBjaGFyICpwcm9kdWN0LCBib29sIHBhcnNhYmxlKQogewogCWlmIChwYXJzYWJsZSkKIAkJcHJpbnRmKCJidXNpZD0lcyN1c2JpZD0lLjRzOiUuNHMjIiwgYnVzaWQsIHZlbmRvciwgcHJvZHVjdCk7CkBAIC0xNjUsMTA2ICsxNjYsNzMgQEAKIAkJcHJpbnRmKCIgICAlc1xuIiwgcHJvZHVjdF9uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfaW50ZXJmYWNlKGNoYXIgKmJ1c2lkLCBjaGFyICpkcml2ZXIsIGJvb2wgcGFyc2FibGUpCi17Ci0JaWYgKHBhcnNhYmxlKQotCQlwcmludGYoIiVzPSVzIyIsIGJ1c2lkLCBkcml2ZXIpOwotCWVsc2UKLQkJcHJpbnRmKCIlOXMlcyAtPiAlc1xuIiwgIiIsIGJ1c2lkLCBkcml2ZXIpOwotfQotCi1zdGF0aWMgaW50IGlzX2RldmljZSh2b2lkICp4KQotewotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmRldnBhdGg7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2ID0geDsKLQlpbnQgcmV0ID0gMDsKLQotCWRldnBhdGggPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiZGV2cGF0aCIpOwotCWlmIChkZXZwYXRoICYmICpkZXZwYXRoLT52YWx1ZSAhPSAnMCcpCi0JCXJldCA9IDE7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGRldmNtcCh2b2lkICphLCB2b2lkICpiKQotewotCXJldHVybiBzdHJjbXAoYSwgYik7Ci19Ci0KIHN0YXRpYyBpbnQgbGlzdF9kZXZpY2VzKGJvb2wgcGFyc2FibGUpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0JY2hhciBidXNpZFtTWVNGU19CVVNfSURfU0laRV07CisJc3RydWN0IHVkZXYgKnVkZXY7CisJc3RydWN0IHVkZXZfZW51bWVyYXRlICplbnVtZXJhdGU7CisJc3RydWN0IHVkZXZfbGlzdF9lbnRyeSAqZGV2aWNlcywgKmRldl9saXN0X2VudHJ5OworCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2OworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgY2hhciAqaWRWZW5kb3I7CisJY29uc3QgY2hhciAqaWRQcm9kdWN0OworCWNvbnN0IGNoYXIgKmJDb25mVmFsdWU7CisJY29uc3QgY2hhciAqYk51bUludGZzOworCWNvbnN0IGNoYXIgKmJ1c2lkOwogCWNoYXIgcHJvZHVjdF9uYW1lWzEyOF07Ci0Jc3RydWN0IHN5c2ZzX2J1cyAqdWJ1czsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqaW50ZjsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICppZFZlbmRvcjsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICppZFByb2R1Y3Q7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYkNvbmZWYWx1ZTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiTnVtSW50ZnM7Ci0Jc3RydWN0IGRsaXN0ICpkZXZsaXN0OwotCWludCBpOwogCWludCByZXQgPSAtMTsKIAotCXVidXMgPSBzeXNmc19vcGVuX2J1cyhidXNfdHlwZSk7Ci0JaWYgKCF1YnVzKSB7Ci0JCWVycigiY291bGQgbm90IG9wZW4gJXMgYnVzOiAlcyIsIGJ1c190eXBlLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQorCS8qIENyZWF0ZSBsaWJ1ZGV2IGNvbnRleHQuICovCisJdWRldiA9IHVkZXZfbmV3KCk7CiAKLQlkZXZsaXN0ID0gc3lzZnNfZ2V0X2J1c19kZXZpY2VzKHVidXMpOwotCWlmICghZGV2bGlzdCkgewotCQllcnIoImNvdWxkIG5vdCBnZXQgJXMgYnVzIGRldmljZXM6ICVzIiwgYnVzX3R5cGUsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQorCS8qIENyZWF0ZSBsaWJ1ZGV2IGRldmljZSBlbnVtZXJhdGlvbi4gKi8KKwllbnVtZXJhdGUgPSB1ZGV2X2VudW1lcmF0ZV9uZXcodWRldik7CiAKLQkvKiByZW1vdmUgaW50ZXJmYWNlcyBhbmQgcm9vdCBodWJzIGZyb20gZGV2aWNlIGxpc3QgKi8KLQlkbGlzdF9maWx0ZXJfc29ydChkZXZsaXN0LCBpc19kZXZpY2UsIGRldmNtcCk7CisJLyogVGFrZSBvbmx5IFVTQiBkZXZpY2VzIHRoYXQgYXJlIG5vdCBodWJzIGFuZCBkbyBub3QgaGF2ZQorCSAqIHRoZSBiSW50ZXJmYWNlTnVtYmVyIGF0dHJpYnV0ZSwgaS5lLiBhcmUgbm90IGludGVyZmFjZXMuCisJICovCisJdWRldl9lbnVtZXJhdGVfYWRkX21hdGNoX3N1YnN5c3RlbShlbnVtZXJhdGUsICJ1c2IiKTsKKwl1ZGV2X2VudW1lcmF0ZV9hZGRfbm9tYXRjaF9zeXNhdHRyKGVudW1lcmF0ZSwgImJEZXZpY2VDbGFzcyIsICIwOSIpOworCXVkZXZfZW51bWVyYXRlX2FkZF9ub21hdGNoX3N5c2F0dHIoZW51bWVyYXRlLCAiYkludGVyZmFjZU51bWJlciIsIE5VTEwpOworCXVkZXZfZW51bWVyYXRlX3NjYW5fZGV2aWNlcyhlbnVtZXJhdGUpOwogCi0JaWYgKCFwYXJzYWJsZSkgewotCQlwcmludGYoIkxvY2FsIFVTQiBkZXZpY2VzXG4iKTsKLQkJcHJpbnRmKCI9PT09PT09PT09PT09PT09PVxuIik7Ci0JfQotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoZGV2bGlzdCwgZGV2LCBzdHJ1Y3Qgc3lzZnNfZGV2aWNlKSB7Ci0JCWlkVmVuZG9yICAgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiaWRWZW5kb3IiKTsKLQkJaWRQcm9kdWN0ICA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihkZXYsICJpZFByb2R1Y3QiKTsKLQkJYkNvbmZWYWx1ZSA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihkZXYsICJiQ29uZmlndXJhdGlvblZhbHVlIik7Ci0JCWJOdW1JbnRmcyAgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiYk51bUludGVyZmFjZXMiKTsKKwlkZXZpY2VzID0gdWRldl9lbnVtZXJhdGVfZ2V0X2xpc3RfZW50cnkoZW51bWVyYXRlKTsKKworCS8qIFNob3cgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBkZXZpY2UuICovCisJdWRldl9saXN0X2VudHJ5X2ZvcmVhY2goZGV2X2xpc3RfZW50cnksIGRldmljZXMpIHsKKwkJcGF0aCA9IHVkZXZfbGlzdF9lbnRyeV9nZXRfbmFtZShkZXZfbGlzdF9lbnRyeSk7CisJCWRldiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N5c3BhdGgodWRldiwgcGF0aCk7CisKKwkJLyogR2V0IGRldmljZSBpbmZvcm1hdGlvbi4gKi8KKwkJaWRWZW5kb3IgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZShkZXYsICJpZFZlbmRvciIpOworCQlpZFByb2R1Y3QgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZShkZXYsICJpZFByb2R1Y3QiKTsKKwkJYkNvbmZWYWx1ZSA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgImJDb25maWd1cmF0aW9uVmFsdWUiKTsKKwkJYk51bUludGZzID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAiYk51bUludGVyZmFjZXMiKTsKKwkJYnVzaWQgPSB1ZGV2X2RldmljZV9nZXRfc3lzbmFtZShkZXYpOwogCQlpZiAoIWlkVmVuZG9yIHx8ICFpZFByb2R1Y3QgfHwgIWJDb25mVmFsdWUgfHwgIWJOdW1JbnRmcykgewogCQkJZXJyKCJwcm9ibGVtIGdldHRpbmcgZGV2aWNlIGF0dHJpYnV0ZXM6ICVzIiwKIAkJCSAgICBzdHJlcnJvcihlcnJubykpOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKLQkJLyogZ2V0IHByb2R1Y3QgbmFtZSAqLworCQkvKiBHZXQgcHJvZHVjdCBuYW1lLiAqLwogCQl1c2JpcF9uYW1lc19nZXRfcHJvZHVjdChwcm9kdWN0X25hbWUsIHNpemVvZihwcm9kdWN0X25hbWUpLAotCQkJCQlzdHJ0b2woaWRWZW5kb3ItPnZhbHVlLCBOVUxMLCAxNiksCi0JCQkJCXN0cnRvbChpZFByb2R1Y3QtPnZhbHVlLCBOVUxMLCAxNikpOwotCQlwcmludF9kZXZpY2UoZGV2LT5idXNfaWQsIGlkVmVuZG9yLT52YWx1ZSwgaWRQcm9kdWN0LT52YWx1ZSwKLQkJCSAgICAgcGFyc2FibGUpOworCQkJCQlzdHJ0b2woaWRWZW5kb3IsIE5VTEwsIDE2KSwKKwkJCQkJc3RydG9sKGlkUHJvZHVjdCwgTlVMTCwgMTYpKTsKKworCQkvKiBQcmludCBpbmZvcm1hdGlvbi4gKi8KKwkJcHJpbnRfZGV2aWNlKGJ1c2lkLCBpZFZlbmRvciwgaWRQcm9kdWN0LCBwYXJzYWJsZSk7CiAJCXByaW50X3Byb2R1Y3RfbmFtZShwcm9kdWN0X25hbWUsIHBhcnNhYmxlKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgYXRvaShiTnVtSW50ZnMtPnZhbHVlKTsgaSsrKSB7Ci0JCQlzbnByaW50ZihidXNpZCwgc2l6ZW9mKGJ1c2lkKSwgIiVzOiUuMXMuJWQiLAotCQkJCSBkZXYtPmJ1c19pZCwgYkNvbmZWYWx1ZS0+dmFsdWUsIGkpOwotCQkJaW50ZiA9IHN5c2ZzX29wZW5fZGV2aWNlKGJ1c190eXBlLCBidXNpZCk7Ci0JCQlpZiAoIWludGYpIHsKLQkJCQllcnIoImNvdWxkIG5vdCBvcGVuIGRldmljZSBpbnRlcmZhY2U6ICVzIiwKLQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQl9Ci0JCQlwcmludF9pbnRlcmZhY2UoYnVzaWQsIGludGYtPmRyaXZlcl9uYW1lLCBwYXJzYWJsZSk7Ci0JCQlzeXNmc19jbG9zZV9kZXZpY2UoaW50Zik7Ci0JCX0KIAkJcHJpbnRmKCJcbiIpOworCisJCXVkZXZfZGV2aWNlX3VucmVmKGRldik7CiAJfQogCiAJcmV0ID0gMDsKIAogZXJyX291dDoKLQlzeXNmc19jbG9zZV9idXModWJ1cyk7CisJdWRldl9lbnVtZXJhdGVfdW5yZWYoZW51bWVyYXRlKTsKKwl1ZGV2X3VucmVmKHVkZXYpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX25ldHdvcmsuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX25ldHdvcmsuaAppbmRleCBmMTlhZTE5Li5jMWU4NzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9uZXR3b3JrLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbmV0d29yay5oCkBAIC0xMCw3ICsxMCw2IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF91bmJpbmQuYwppbmRleCBkNWE5YWI2Li5hNGE0OTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF91bmJpbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF91bmJpbmQuYwpAQCAtMTYsNyArMTYsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJ1c2JpcC5oIgorI2luY2x1ZGUgInN5c2ZzX3V0aWxzLmgiCiAKIHN0YXRpYyBjb25zdCBjaGFyIHVzYmlwX3VuYmluZF91c2FnZV9zdHJpbmdbXSA9CiAJInVzYmlwIHVuYmluZCA8YXJncz5cbiIKQEAgLTQxLDExNSArNDIsNjkgQEAKIHN0YXRpYyBpbnQgdW5iaW5kX2RldmljZShjaGFyICpidXNpZCkKIHsKIAljaGFyIGJ1c190eXBlW10gPSAidXNiIjsKLQlzdHJ1Y3Qgc3lzZnNfZHJpdmVyICp1c2JpcF9ob3N0X2RydjsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGRsaXN0ICpkZXZsaXN0OwotCWludCB2ZXJpZmllZCA9IDA7CiAJaW50IHJjLCByZXQgPSAtMTsKIAotCWNoYXIgYXR0cl9uYW1lW10gPSAiYkNvbmZpZ3VyYXRpb25WYWx1ZSI7Ci0JY2hhciBzeXNmc19tbnRwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQljaGFyIGJ1c2lkX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYnVzaWRfYXR0cjsKLQljaGFyICp2YWwgPSBOVUxMOwotCWludCBsZW47CisJY2hhciB1bmJpbmRfYXR0cl9uYW1lW10gPSAidW5iaW5kIjsKKwljaGFyIHVuYmluZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgcmViaW5kX2F0dHJfbmFtZVtdID0gInJlYmluZCI7CisJY2hhciByZWJpbmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKIAotCS8qIHZlcmlmeSB0aGUgYnVzaWQgZGV2aWNlIGlzIHVzaW5nIHVzYmlwLWhvc3QgKi8KLQl1c2JpcF9ob3N0X2RydiA9IHN5c2ZzX29wZW5fZHJpdmVyKGJ1c190eXBlLCBVU0JJUF9IT1NUX0RSVl9OQU1FKTsKLQlpZiAoIXVzYmlwX2hvc3RfZHJ2KSB7Ci0JCWVycigiY291bGQgbm90IG9wZW4gJXMgZHJpdmVyOiAlcyIsIFVTQklQX0hPU1RfRFJWX05BTUUsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7CisJc3RydWN0IHVkZXYgKnVkZXY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7CisJY29uc3QgY2hhciAqZHJpdmVyOworCisJLyogQ3JlYXRlIGxpYnVkZXYgY29udGV4dC4gKi8KKwl1ZGV2ID0gdWRldl9uZXcoKTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB3aXRoIHRoaXMgYnVzIElEIGV4aXN0cy4gKi8KKwlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2LCAidXNiIiwgYnVzaWQpOworCWlmICghZGV2KSB7CisJCWVycigiZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBidXMgSUQgZG9lcyBub3QgZXhpc3QiKTsKKwkJZ290byBlcnJfY2xvc2VfdWRldjsKIAl9CiAKLQlkZXZsaXN0ID0gc3lzZnNfZ2V0X2RyaXZlcl9kZXZpY2VzKHVzYmlwX2hvc3RfZHJ2KTsKLQlpZiAoIWRldmxpc3QpIHsKLQkJZXJyKCIlcyBpcyBub3QgaW4gdXNlIGJ5IGFueSBkZXZpY2VzIiwgVVNCSVBfSE9TVF9EUlZfTkFNRSk7Ci0JCWdvdG8gZXJyX2Nsb3NlX3VzYmlwX2hvc3RfZHJ2OworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSBpcyB1c2luZyB1c2JpcC1ob3N0IGRyaXZlci4gKi8KKwlkcml2ZXIgPSB1ZGV2X2RldmljZV9nZXRfZHJpdmVyKGRldik7CisJaWYgKCFkcml2ZXIgfHwgc3RyY21wKGRyaXZlciwgInVzYmlwLWhvc3QiKSkgeworCQllcnIoImRldmljZSBpcyBub3QgYm91bmQgdG8gdXNiaXAtaG9zdCBkcml2ZXIiKTsKKwkJZ290byBlcnJfY2xvc2VfdWRldjsKIAl9CiAKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGRldmxpc3QsIGRldiwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQlpZiAoIXN0cm5jbXAoYnVzaWQsIGRldi0+bmFtZSwgc3RybGVuKGJ1c2lkKSkgJiYKLQkJICAgICFzdHJuY21wKGRldi0+ZHJpdmVyX25hbWUsIFVTQklQX0hPU1RfRFJWX05BTUUsCi0JCQkgICAgIHN0cmxlbihVU0JJUF9IT1NUX0RSVl9OQU1FKSkpIHsKLQkJCXZlcmlmaWVkID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorCS8qIFVuYmluZCBkZXZpY2UgZnJvbSBkcml2ZXIuICovCisJc25wcmludGYodW5iaW5kX2F0dHJfcGF0aCwgc2l6ZW9mKHVuYmluZF9hdHRyX3BhdGgpLCAiJXMvJXMvJXMvJXMvJXMvJXMiLAorCQkgU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLCBidXNfdHlwZSwgU1lTRlNfRFJJVkVSU19OQU1FLAorCQkgVVNCSVBfSE9TVF9EUlZfTkFNRSwgdW5iaW5kX2F0dHJfbmFtZSk7CiAKLQlpZiAoIXZlcmlmaWVkKSB7Ci0JCWVycigiZGV2aWNlIG9uIGJ1c2lkICVzIGlzIG5vdCB1c2luZyAlcyIsIGJ1c2lkLAotCQkgICAgVVNCSVBfSE9TVF9EUlZfTkFNRSk7Ci0JCWdvdG8gZXJyX2Nsb3NlX3VzYmlwX2hvc3RfZHJ2OwotCX0KLQotCS8qCi0JICogTk9URTogQSByZWFkIGFuZCB3cml0ZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRldmljZSBidXNpZAotCSAqIHJlZmVycyB0byBtdXN0IGJlIGRvbmUgdG8gc3RhcnQgcHJvYmluZy4gVGhhdCB3YXkgYSByZWJpbmQgb2YgdGhlCi0JICogZGVmYXVsdCBkcml2ZXIgZm9yIHRoZSBkZXZpY2Ugb2NjdXJzLgotCSAqCi0JICogVGhpcyBzZWVtcyB2ZXJ5IGhhY2tpc2ggYW5kIGFkZHMgYSBsb3Qgb2YgcG9pbnRsZXNzIGNvZGUuIEkgdGhpbmsgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBpbiB0aGUga2VybmVsIGJ5IHRoZSBkcml2ZXIgYWZ0ZXIgZGVsX21hdGNoX2J1c2lkIGlzCi0JICogZmluaXNoZWQhCi0JICovCi0KLQlyYyA9IHN5c2ZzX2dldF9tbnRfcGF0aChzeXNmc19tbnRwYXRoLCBTWVNGU19QQVRIX01BWCk7CisJcmMgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUodW5iaW5kX2F0dHJfcGF0aCwgYnVzaWQsIHN0cmxlbihidXNpZCkpOwogCWlmIChyYyA8IDApIHsKLQkJZXJyKCJzeXNmcyBtdXN0IGJlIG1vdW50ZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOworCQllcnIoImVycm9yIHVuYmluZGluZyBkZXZpY2UgJXMgZnJvbSBkcml2ZXIiLCBidXNpZCk7CisJCWdvdG8gZXJyX2Nsb3NlX3VkZXY7CiAJfQogCi0Jc25wcmludGYoYnVzaWRfYXR0cl9wYXRoLCBzaXplb2YoYnVzaWRfYXR0cl9wYXRoKSwgIiVzLyVzLyVzLyVzLyVzLyVzIiwKLQkJIHN5c2ZzX21udHBhdGgsIFNZU0ZTX0JVU19OQU1FLCBidXNfdHlwZSwgU1lTRlNfREVWSUNFU19OQU1FLAotCQkgYnVzaWQsIGF0dHJfbmFtZSk7Ci0KLQkvKiByZWFkIGEgZGV2aWNlIGF0dHJpYnV0ZSAqLwotCWJ1c2lkX2F0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShidXNpZF9hdHRyX3BhdGgpOwotCWlmICghYnVzaWRfYXR0cikgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzLyVzOiAlcyIsIGJ1c2lkLCBhdHRyX25hbWUsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHN5c2ZzX3JlYWRfYXR0cmlidXRlKGJ1c2lkX2F0dHIpIDwgMCkgewotCQllcnIoInByb2JsZW0gcmVhZGluZyBhdHRyaWJ1dGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCWxlbiA9IGJ1c2lkX2F0dHItPmxlbjsKLQl2YWwgPSBtYWxsb2MobGVuKTsKLQkqdmFsID0gKmJ1c2lkX2F0dHItPnZhbHVlOwotCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShidXNpZF9hdHRyKTsKLQotCS8qIG5vdGlmeSBkcml2ZXIgb2YgdW5iaW5kICovCisJLyogTm90aWZ5IGRyaXZlciBvZiB1bmJpbmQuICovCiAJcmMgPSBtb2RpZnlfbWF0Y2hfYnVzaWQoYnVzaWQsIDApOwogCWlmIChyYyA8IDApIHsKIAkJZXJyKCJ1bmFibGUgdG8gdW5iaW5kIGRldmljZSBvbiAlcyIsIGJ1c2lkKTsKLQkJZ290byBlcnJfb3V0OworCQlnb3RvIGVycl9jbG9zZV91ZGV2OwogCX0KIAotCS8qIHdyaXRlIHRoZSBkZXZpY2UgYXR0cmlidXRlICovCi0JYnVzaWRfYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGJ1c2lkX2F0dHJfcGF0aCk7Ci0JaWYgKCFidXNpZF9hdHRyKSB7Ci0JCWVycigiY291bGQgbm90IG9wZW4gJXMvJXM6ICVzIiwgYnVzaWQsIGF0dHJfbmFtZSwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9CisJLyogVHJpZ2dlciBuZXcgcHJvYmluZy4gKi8KKwlzbnByaW50ZihyZWJpbmRfYXR0cl9wYXRoLCBzaXplb2YodW5iaW5kX2F0dHJfcGF0aCksICIlcy8lcy8lcy8lcy8lcy8lcyIsCisJCQlTWVNGU19NTlRfUEFUSCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLCBTWVNGU19EUklWRVJTX05BTUUsCisJCQlVU0JJUF9IT1NUX0RSVl9OQU1FLCByZWJpbmRfYXR0cl9uYW1lKTsKIAotCXJjID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKGJ1c2lkX2F0dHIsIHZhbCwgbGVuKTsKKwlyYyA9IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShyZWJpbmRfYXR0cl9wYXRoLCBidXNpZCwgc3RybGVuKGJ1c2lkKSk7CiAJaWYgKHJjIDwgMCkgewotCQllcnIoInByb2JsZW0gd3JpdGluZyBhdHRyaWJ1dGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBlcnJfb3V0OworCQllcnIoImVycm9yIHJlYmluZGluZyIpOworCQlnb3RvIGVycl9jbG9zZV91ZGV2OwogCX0KLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYnVzaWRfYXR0cik7CiAKIAlyZXQgPSAwOwotCXByaW50ZigidW5iaW5kIGRldmljZSBvbiBidXNpZCAlczogY29tcGxldGVcbiIsIGJ1c2lkKTsKKwlpbmZvKCJ1bmJpbmQgZGV2aWNlIG9uIGJ1c2lkICVzOiBjb21wbGV0ZSIsIGJ1c2lkKTsKIAotZXJyX291dDoKLQlmcmVlKHZhbCk7Ci1lcnJfY2xvc2VfdXNiaXBfaG9zdF9kcnY6Ci0Jc3lzZnNfY2xvc2VfZHJpdmVyKHVzYmlwX2hvc3RfZHJ2KTsKK2Vycl9jbG9zZV91ZGV2OgorCXVkZXZfZGV2aWNlX3VucmVmKGRldik7CisJdWRldl91bnJlZih1ZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwZC5jCmluZGV4IDc5ODBmOGIuLjJjYWU0Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwZC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSAidXNiaXBfaG9zdF9kcml2ZXIuaCIKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKICNpbmNsdWRlICJ1c2JpcF9uZXR3b3JrLmgiCisjaW5jbHVkZSAibGlzdC5oIgogCiAjdW5kZWYgIFBST0dOQU1FCiAjZGVmaW5lIFBST0dOQU1FICJ1c2JpcGQiCkBAIC05Myw2ICs5NCw3IEBACiAJc3RydWN0IG9wX2NvbW1vbiByZXBseTsKIAlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2OwogCXN0cnVjdCB1c2JpcF91c2JfZGV2aWNlIHBkdV91ZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAJaW50IGZvdW5kID0gMDsKIAlpbnQgZXJyb3IgPSAwOwogCWludCByYzsKQEAgLTEwNyw4ICsxMDksOCBAQAogCX0KIAlQQUNLX09QX0lNUE9SVF9SRVFVRVNUKDAsICZyZXEpOwogCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShob3N0X2RyaXZlci0+ZWRldl9saXN0LCBlZGV2LAotCQkJICAgIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpIHsKKwlsaXN0X2Zvcl9lYWNoKGksICZob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7CisJCWVkZXYgPSBsaXN0X2VudHJ5KGksIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UsIG5vZGUpOwogCQlpZiAoIXN0cm5jbXAocmVxLmJ1c2lkLCBlZGV2LT51ZGV2LmJ1c2lkLCBTWVNGU19CVVNfSURfU0laRSkpIHsKIAkJCWluZm8oImZvdW5kIHJlcXVlc3RlZCBkZXZpY2U6ICVzIiwgcmVxLmJ1c2lkKTsKIAkJCWZvdW5kID0gMTsKQEAgLTE2MSwxMyArMTYzLDEyIEBACiAJc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgcGR1X3VkZXY7CiAJc3RydWN0IHVzYmlwX3VzYl9pbnRlcmZhY2UgcGR1X3VpbmY7CiAJc3RydWN0IG9wX2Rldmxpc3RfcmVwbHkgcmVwbHk7Ci0JaW50IGk7Ci0JaW50IHJjOworCXN0cnVjdCBsaXN0X2hlYWQgKmo7CisJaW50IHJjLCBpOwogCiAJcmVwbHkubmRldiA9IDA7CiAJLyogbnVtYmVyIG9mIGV4cG9ydGVkIGRldmljZXMgKi8KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QsIGVkZXYsCi0JCQkgICAgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSkgeworCWxpc3RfZm9yX2VhY2goaiwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKIAkJcmVwbHkubmRldiArPSAxOwogCX0KIAlpbmZvKCJleHBvcnRhYmxlIGRldmljZXM6ICVkIiwgcmVwbHkubmRldik7CkBAIC0xODUsOCArMTg2LDggQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoaG9zdF9kcml2ZXItPmVkZXZfbGlzdCwgZWRldiwKLQkJCSAgICBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlKSB7CisJbGlzdF9mb3JfZWFjaChqLCAmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCkgeworCQllZGV2ID0gbGlzdF9lbnRyeShqLCBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlLCBub2RlKTsKIAkJZHVtcF91c2JfZGV2aWNlKCZlZGV2LT51ZGV2KTsKIAkJbWVtY3B5KCZwZHVfdWRldiwgJmVkZXYtPnVkZXYsIHNpemVvZihwZHVfdWRldikpOwogCQl1c2JpcF9uZXRfcGFja191c2JfZGV2aWNlKDEsICZwZHVfdWRldik7CkBAIC0yMDMsOSArMjA0LDkgQEAKIAkJCXVzYmlwX25ldF9wYWNrX3VzYl9pbnRlcmZhY2UoMSwgJnBkdV91aW5mKTsKIAogCQkJcmMgPSB1c2JpcF9uZXRfc2VuZChjb25uZmQsICZwZHVfdWluZiwKLQkJCQkJICAgIHNpemVvZihwZHVfdWluZikpOworCQkJCQlzaXplb2YocGR1X3VpbmYpKTsKIAkJCWlmIChyYyA8IDApIHsKLQkJCQlkYmcoInVzYmlwX25ldF9zZW5kIGZhaWxlZDogcGR1X3VpbmYiKTsKKwkJCQllcnIoInVzYmlwX25ldF9zZW5kIGZhaWxlZDogcGR1X3VpbmYiKTsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3V0aWxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5jCmluZGV4IDJkNDk2NmUuLjJiM2Q2ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3V0aWxzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuYwpAQCAtMTYsNjEgKzE2LDM3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgotCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJzeXNmc191dGlscy5oIgogCiBpbnQgbW9kaWZ5X21hdGNoX2J1c2lkKGNoYXIgKmJ1c2lkLCBpbnQgYWRkKQogewotCWNoYXIgYnVzX3R5cGVbXSA9ICJ1c2IiOwogCWNoYXIgYXR0cl9uYW1lW10gPSAibWF0Y2hfYnVzaWQiOwotCWNoYXIgYnVmZltTWVNGU19CVVNfSURfU0laRSArIDRdOwotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07CisJY2hhciBjb21tYW5kW1NZU0ZTX0JVU19JRF9TSVpFICsgNF07CiAJY2hhciBtYXRjaF9idXNpZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKm1hdGNoX2J1c2lkX2F0dHI7Ci0JaW50IHJjLCByZXQgPSAwOwotCi0JaWYgKHN0cm5sZW4oYnVzaWQsIFNZU0ZTX0JVU19JRF9TSVpFKSA+IFNZU0ZTX0JVU19JRF9TSVpFIC0gMSkgewotCQlkYmcoImJ1c2lkIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyYyA9IHN5c2ZzX2dldF9tbnRfcGF0aChzeXNmc19tbnRwYXRoLCBTWVNGU19QQVRIX01BWCk7Ci0JaWYgKHJjIDwgMCkgewotCQllcnIoInN5c2ZzIG11c3QgYmUgbW91bnRlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQorCWludCByYzsKIAogCXNucHJpbnRmKG1hdGNoX2J1c2lkX2F0dHJfcGF0aCwgc2l6ZW9mKG1hdGNoX2J1c2lkX2F0dHJfcGF0aCksCi0JCSAiJXMvJXMvJXMvJXMvJXMvJXMiLCBzeXNmc19tbnRwYXRoLCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsCi0JCSBTWVNGU19EUklWRVJTX05BTUUsIFVTQklQX0hPU1RfRFJWX05BTUUsIGF0dHJfbmFtZSk7CisJCSAiJXMvJXMvJXMvJXMvJXMvJXMiLCBTWVNGU19NTlRfUEFUSCwgU1lTRlNfQlVTX05BTUUsCisJCSBTWVNGU19CVVNfVFlQRSwgU1lTRlNfRFJJVkVSU19OQU1FLCBVU0JJUF9IT1NUX0RSVl9OQU1FLAorCQkgYXR0cl9uYW1lKTsKIAotCW1hdGNoX2J1c2lkX2F0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShtYXRjaF9idXNpZF9hdHRyX3BhdGgpOwotCWlmICghbWF0Y2hfYnVzaWRfYXR0cikgewotCQlkYmcoInByb2JsZW0gZ2V0dGluZyBtYXRjaF9idXNpZCBhdHRyaWJ1dGU6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGFkZCkKKwkJc25wcmludGYoY29tbWFuZCwgU1lTRlNfQlVTX0lEX1NJWkUgKyA0LCAiYWRkICVzIiwgYnVzaWQpOworCWVsc2UKKwkJc25wcmludGYoY29tbWFuZCwgU1lTRlNfQlVTX0lEX1NJWkUgKyA0LCAiZGVsICVzIiwgYnVzaWQpOworCisJcmMgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUobWF0Y2hfYnVzaWRfYXR0cl9wYXRoLCBjb21tYW5kLAorCQkJCSAgIHNpemVvZihjb21tYW5kKSk7CisJaWYgKHJjIDwgMCkgeworCQlkYmcoImZhaWxlZCB0byB3cml0ZSBtYXRjaF9idXNpZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKGFkZCkKLQkJc25wcmludGYoYnVmZiwgU1lTRlNfQlVTX0lEX1NJWkUgKyA0LCAiYWRkICVzIiwgYnVzaWQpOwotCWVsc2UKLQkJc25wcmludGYoYnVmZiwgU1lTRlNfQlVTX0lEX1NJWkUgKyA0LCAiZGVsICVzIiwgYnVzaWQpOwotCi0JZGJnKCJ3cml0ZSBcIiVzXCIgdG8gJXMiLCBidWZmLCBtYXRjaF9idXNpZF9hdHRyLT5wYXRoKTsKLQotCXJjID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKG1hdGNoX2J1c2lkX2F0dHIsIGJ1ZmYsIHNpemVvZihidWZmKSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkYmcoImZhaWxlZCB0byB3cml0ZSBtYXRjaF9idXNpZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXQgPSAtMTsKLQl9Ci0KLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUobWF0Y2hfYnVzaWRfYXR0cik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwppbmRleCA3MjM5MWVmLi4xZTg0NTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwpAQCAtMjA1LDggKzIwNSw2IEBACiAJCX0KIAl9CiAKLQlwcl9pbmZvKCJjaGFuZ2VkICVkXG4iLCBjaGFuZ2VkKTsKLQogCWlmICgoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9TVVNQRU5ERUQpICYmIChjaGFuZ2VkID09IDEpKQogCQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwogCkBAIC0yNzMsMTQgKzI3MSwxNCBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKLQkJCXVzYmlwX2RiZ192aGNpX3JoKCIgQ2xlYXJQb3J0RmVhdHVyZTogIgotCQkJCQkgICJVU0JfUE9SVF9GRUFUX1BPV0VSXG4iKTsKKwkJCXVzYmlwX2RiZ192aGNpX3JoKAorCQkJCSIgQ2xlYXJQb3J0RmVhdHVyZTogVVNCX1BPUlRfRkVBVF9QT1dFUlxuIik7CiAJCQlkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0gPSAwOwogCQkJZHVtLT5yZXN1bWluZyA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6Ci0JCQl1c2JpcF9kYmdfdmhjaV9yaCgiIENsZWFyUG9ydEZlYXR1cmU6ICIKLQkJCQkJICAiVVNCX1BPUlRfRkVBVF9DX1JFU0VUXG4iKTsKKwkJCXVzYmlwX2RiZ192aGNpX3JoKAorCQkJCSIgQ2xlYXJQb3J0RmVhdHVyZTogVVNCX1BPUlRfRkVBVF9DX1JFU0VUXG4iKTsKIAkJCXN3aXRjaCAoZHVtLT52ZGV2W3JocG9ydF0uc3BlZWQpIHsKIAkJCWNhc2UgVVNCX1NQRUVEX0hJR0g6CiAJCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdIHw9CkBAIC0zMzksMTYgKzMzNywxNyBAQAogCiAJCQlpZiAoZHVtLT52ZGV2W3JocG9ydF0udWQuc3RhdHVzID09CiAJCQkgICAgVkRFVl9TVF9OT1RBU1NJR05FRCkgewotCQkJCXVzYmlwX2RiZ192aGNpX3JoKCIgZW5hYmxlIHJocG9ydCAlZCAiCi0JCQkJCQkgICIoc3RhdHVzICV1KVxuIiwKLQkJCQkJCSAgcmhwb3J0LAotCQkJCQkJICBkdW0tPnZkZXZbcmhwb3J0XS51ZC5zdGF0dXMpOworCQkJCXVzYmlwX2RiZ192aGNpX3JoKAorCQkJCQkiIGVuYWJsZSByaHBvcnQgJWQgKHN0YXR1cyAldSlcbiIsCisJCQkJCXJocG9ydCwKKwkJCQkJZHVtLT52ZGV2W3JocG9ydF0udWQuc3RhdHVzKTsKIAkJCQlkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0gfD0KIAkJCQkJVVNCX1BPUlRfU1RBVF9FTkFCTEU7CiAJCQl9CiAJCX0KIAkJKChfX2xlMTYgKikgYnVmKVswXSA9IGNwdV90b19sZTE2KGR1bS0+cG9ydF9zdGF0dXNbcmhwb3J0XSk7Ci0JCSgoX19sZTE2ICopIGJ1ZilbMV0gPSBjcHVfdG9fbGUxNihkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0gPj4gMTYpOworCQkoKF9fbGUxNiAqKSBidWYpWzFdID0KKwkJCWNwdV90b19sZTE2KGR1bS0+cG9ydF9zdGF0dXNbcmhwb3J0XSA+PiAxNik7CiAKIAkJdXNiaXBfZGJnX3ZoY2lfcmgoIiBHZXRQb3J0U3RhdHVzIGJ5ZSAleCAleFxuIiwgKCh1MTYgKilidWYpWzBdLAogCQkJCSAgKCh1MTYgKilidWYpWzFdKTsKQEAgLTM2MCwxMiArMzU5LDEyIEBACiAJY2FzZSBTZXRQb3J0RmVhdHVyZToKIAkJc3dpdGNoICh3VmFsdWUpIHsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6Ci0JCQl1c2JpcF9kYmdfdmhjaV9yaCgiIFNldFBvcnRGZWF0dXJlOiAiCi0JCQkJCSAgIlVTQl9QT1JUX0ZFQVRfU1VTUEVORFxuIik7CisJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkiIFNldFBvcnRGZWF0dXJlOiBVU0JfUE9SVF9GRUFUX1NVU1BFTkRcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKLQkJCXVzYmlwX2RiZ192aGNpX3JoKCIgU2V0UG9ydEZlYXR1cmU6ICIKLQkJCQkJICAiVVNCX1BPUlRfRkVBVF9SRVNFVFxuIik7CisJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkiIFNldFBvcnRGZWF0dXJlOiBVU0JfUE9SVF9GRUFUX1JFU0VUXG4iKTsKIAkJCS8qIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCBkaXNjb25uZWN0IGZpcnN0ICovCiAJCQlpZiAoZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpIHsKIAkJCQlkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0gJj0KQEAgLTUzNyw5ICs1MzYsOCBAQAogCiAJCWNhc2UgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUjoKIAkJCWlmIChjdHJscmVxLT53VmFsdWUgPT0gY3B1X3RvX2xlMTYoVVNCX0RUX0RFVklDRSA8PCA4KSkKLQkJCQl1c2JpcF9kYmdfdmhjaV9oYygiTm90IHlldD86ICIKLQkJCQkJCSAgIkdldF9EZXNjcmlwdG9yIHRvIGRldmljZSAwICIKLQkJCQkJCSAgIihnZXQgbWF4IHBpcGUgc2l6ZSlcbiIpOworCQkJCXVzYmlwX2RiZ192aGNpX2hjKAorCQkJCQkiTm90IHlldD86R2V0X0Rlc2NyaXB0b3IgdG8gZGV2aWNlIDAgKGdldCBtYXggcGlwZSBzaXplKVxuIik7CiAKIAkJCWlmICh2ZGV2LT51ZGV2KQogCQkJCXVzYl9wdXRfZGV2KHZkZXYtPnVkZXYpOwpAQCAtNTQ4LDggKzU0Niw5IEBACiAKIAkJZGVmYXVsdDoKIAkJCS8qIE5PVCBSRUFDSEVEICovCi0JCQlkZXZfZXJyKGRldiwgImludmFsaWQgcmVxdWVzdCB0byBkZXZudW0gMCBiUmVxdWVzdCAldSwgIgotCQkJCSJ3VmFsdWUgJXVcbiIsIGN0cmxyZXEtPmJSZXF1ZXN0LAorCQkJZGV2X2VycihkZXYsCisJCQkJImludmFsaWQgcmVxdWVzdCB0byBkZXZudW0gMCBiUmVxdWVzdCAldSwgd1ZhbHVlICV1XG4iLAorCQkJCWN0cmxyZXEtPmJSZXF1ZXN0LAogCQkJCWN0cmxyZXEtPndWYWx1ZSk7CiAJCQlyZXQgPSAgLUVJTlZBTDsKIAkJCWdvdG8gbm9fbmVlZF94bWl0OwpAQCAtMTA3MCw4ICsxMDY5LDkgQEAKIAlzcGluX3VubG9jaygmdGhlX2NvbnRyb2xsZXItPmxvY2spOwogCiAJaWYgKGNvbm5lY3RlZCA+IDApIHsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIldlIGhhdmUgJWQgYWN0aXZlIGNvbm5lY3Rpb24lcy4gRG8gbm90ICIKLQkJCSAic3VzcGVuZC5cbiIsIGNvbm5lY3RlZCwgKGNvbm5lY3RlZCA9PSAxID8gIiIgOiAicyIpKTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiV2UgaGF2ZSAlZCBhY3RpdmUgY29ubmVjdGlvbiVzLiBEbyBub3Qgc3VzcGVuZC5cbiIsCisJCQkgY29ubmVjdGVkLCAoY29ubmVjdGVkID09IDEgPyAiIiA6ICJzIikpOwogCQlyZXQgPSAgLUVCVVNZOwogCX0gZWxzZSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzdXNwZW5kIHZoY2lfaGNkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYwppbmRleCAwMTQxYmMzLi5lMDk4MDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKQEAgLTQ3LDggKzQ3LDggQEAKIAkgKiB1cCAvcHJvYy9uZXQve3RjcCx0Y3A2fS4gQWxzbywgYSB1c2VybGFuZCBwcm9ncmFtIG1heSByZW1lbWJlciBhCiAJICogcG9ydCBudW1iZXIgYW5kIGl0cyBwZWVyIElQIGFkZHJlc3MuCiAJICovCi0Jb3V0ICs9IHNwcmludGYob3V0LCAicHJ0IHN0YSBzcGQgYnVzIGRldiBzb2NrZXQgICAgICAgICAgICIKLQkJICAgICAgICJsb2NhbF9idXNpZFxuIik7CisJb3V0ICs9IHNwcmludGYob3V0LAorCQkgICAgICAgInBydCBzdGEgc3BkIGJ1cyBkZXYgc29ja2V0ICAgICAgICAgICBsb2NhbF9idXNpZFxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVkhDSV9OUE9SVFM7IGkrKykgewogCQlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYgPSBwb3J0X3RvX3ZkZXYoaSk7CkBAIC0xMTQsNyArMTE0LDggQEAKIAlpbnQgZXJyOwogCV9fdTMyIHJocG9ydCA9IDA7CiAKLQlzc2NhbmYoYnVmLCAiJXUiLCAmcmhwb3J0KTsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJnJocG9ydCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBjaGVjayByaHBvcnQgKi8KIAlpZiAocmhwb3J0ID49IFZIQ0lfTlBPUlRTKSB7CkBAIC0xODIsNyArMTgzLDggQEAKIAkgKiBAZGV2aWQ6IHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciBpbiBhIHJlbW90ZSBob3N0CiAJICogQHNwZWVkOiB1c2IgZGV2aWNlIHNwZWVkIGluIGEgcmVtb3RlIGhvc3QKIAkgKi8KLQlzc2NhbmYoYnVmLCAiJXUgJXUgJXUgJXUiLCAmcmhwb3J0LCAmc29ja2ZkLCAmZGV2aWQsICZzcGVlZCk7CisJaWYgKHNzY2FuZihidWYsICIldSAldSAldSAldSIsICZyaHBvcnQsICZzb2NrZmQsICZkZXZpZCwgJnNwZWVkKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXVzYmlwX2RiZ192aGNpX3N5c2ZzKCJyaHBvcnQoJXUpIHNvY2tmZCgldSkgZGV2aWQoJXUpIHNwZWVkKCV1KVxuIiwKIAkJCSAgICAgcmhwb3J0LCBzb2NrZmQsIGRldmlkLCBzcGVlZCk7CkBAIC0yMTUsOCArMjE3LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGV2X2luZm8oZGV2LCAicmhwb3J0KCV1KSBzb2NrZmQoJWQpIGRldmlkKCV1KSBzcGVlZCgldSlcbiIsCi0JCSByaHBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkKTsKKwlkZXZfaW5mbyhkZXYsCisJCSAicmhwb3J0KCV1KSBzb2NrZmQoJWQpIGRldmlkKCV1KSBzcGVlZCgldSkgc3BlZWRfc3RyKCVzKVxuIiwKKwkJIHJocG9ydCwgc29ja2ZkLCBkZXZpZCwgc3BlZWQsIHVzYl9zcGVlZF9zdHJpbmcoc3BlZWQpKTsKIAogCXZkZXYtPmRldmlkICAgICAgICAgPSBkZXZpZDsKIAl2ZGV2LT5zcGVlZCAgICAgICAgID0gc3BlZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmMKaW5kZXggNzk0OWQ1OC4uOWFhMmU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFtZ3IuYwpAQCAtOTEsMTIgKzkxLDE1IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkrIFdMQU5fQkVBQ09OX09GRl9UUyk7Ci0JcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfQkNOX0lOVCk7Ci0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fQkVBQ09OX09GRl9DQVBJTkZPKTsKKwlwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpCisJCQkJKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJIFdMQU5fQkVBQ09OX09GRl9UUyk7CisJcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJIFdMQU5fQkVBQ09OX09GRl9CQ05fSU5UKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTyk7CiAKIAlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQkVBQ09OX09GRl9TU0lEOwogCkBAIC0xMjQsMTYgKzEyNywyMCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJKyBXTEFOX0JFQUNPTl9PRkZfVFMpOwotCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQpOwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTyk7CisJcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKQorCQkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSBXTEFOX0JFQUNPTl9PRkZfVFMpOworCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX0JFQUNPTl9PRkZfQkNOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8pOwogCiAJLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KLQlwSXRlbSA9IChQV0xBTl9JRSkoKHVuc2lnbmVkIGNoYXIgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpKQotCQkJICAgKyBXTEFOX0JFQUNPTl9PRkZfU1NJRCk7CisJcEl0ZW0gPSAoUFdMQU5fSUUpKCh1bnNpZ25lZCBjaGFyICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpKSArCisJCQkgICAgV0xBTl9CRUFDT05fT0ZGX1NTSUQpOwogCXdoaWxlICgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSB7CiAJCXN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKSB7CiAJCWNhc2UgV0xBTl9FSURfU1NJRDoKQEAgLTE3MSw3ICsxNzgsOCBAQAogCQljYXNlIFdMQU5fRUlEX1JTTl9XUEE6CiAJCQlpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKIAkJCQlpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IHRydWUpCi0JCQkJCXBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworCQkJCQlwRnJhbWUtPnBSU05XUEEgPQorCQkJCQkJICAgICAgIChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTE4MSw3ICsxODksOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9DT1VOVFJZOiAgICAgIC8qIDcgKi8KQEAgLTE5MSw3ICsyMDAsOCBAQAogCiAJCWNhc2UgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQ6ICAgLyogMzIgKi8KIAkJCWlmIChwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPSAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07CisJCQkJcEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID0KKwkJCQkJCSAgICAgIChQV0xBTl9JRV9QV19DT05TVClwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfQ0hfU1dJVENIOiAgICAvKiAzNyAqLwpAQCAtMjEwLDcgKzIyMCw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiVW5yZWNvZ25pemVkIEVJRD0lZGQgaW4gYmVhY29uIGRlY29kZS5cbiIsIHBJdGVtLT5ieUVsZW1lbnRJRCk7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywKKwkJCQlLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGJlYWNvbiBkZWNvZGUuXG4iLAorCQkJCXBJdGVtLT5ieUVsZW1lbnRJRCk7CiAJCQlicmVhazsKIAogCQl9CkBAIC0yODIsOSArMjk0LDExIEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTik7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04gKyBzaXplb2YoKihwRnJhbWUtPnB3UmVhc29uKSk7CisJcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTiArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdSZWFzb24pKTsKIAogCXJldHVybjsKIH0KQEAgLTMwOCw4ICszMjIsOSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOworCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTik7CiAKIAlyZXR1cm47CiB9CkBAIC0zMzIsMTEgKzM0NywxNCBAQAogewogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQgKyBzaXplb2YoKihwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwpKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICAgIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQpOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCkpOwogCXJldHVybjsKIH0KIApAQCAtMzYwLDEwICszNzgsMTIgQEAKIAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICAgIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQpOwogCiAJLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KIAlwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC0zNzcsNyArMzk3LDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0KKwkJCQkJCSAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9SU046CkBAIC0zODcsMTYgKzQwOCwxOSBAQAogCQljYXNlIFdMQU5fRUlEX1JTTl9XUEE6CiAJCQlpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKIAkJCQlpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IHRydWUpCi0JCQkJCXBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworCQkJCQlwRnJhbWUtPnBSU05XUEEgPQorCQkJCQkJICAgICAgIChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGFzc29jcmVxIGRlY29kZS5cbiIsCisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywKKwkJCQlLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGFzc29jcmVxIGRlY29kZS5cbiIsCiAJCQkJcEl0ZW0tPmJ5RWxlbWVudElEKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00MjQsMTQgKzQ0OCwxNyBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKLQlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQpOwotCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX0FJRAotCQkrIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fQVNTT0NSRVNQX09GRl9TVEFUVVMpOworCXBGcmFtZS0+cHdBaWQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX0FJRCArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKIAogCXJldHVybjsKIH0KQEAgLTQ1NywxNiArNDg0LDIwIEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKLQlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fQVNTT0NSRVNQX09GRl9TVEFUVVMpOwotCXBGcmFtZS0+cHdBaWQgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX0FJRCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKKwlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSBXTEFOX0FTU09DUkVTUF9PRkZfQUlEKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCi0JcEZyYW1lLT5wU3VwcFJhdGVzICA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICArIFdMQU5fQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTKTsKKwlwRnJhbWUtPnBTdXBwUmF0ZXMgID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpCisJCQkgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgICBXTEFOX0FTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CiAKIAlwSXRlbSA9IChQV0xBTl9JRSkocEZyYW1lLT5wU3VwcFJhdGVzKTsKIAlwSXRlbSA9IChQV0xBTl9JRSkoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOwpAQCAtNDc0LDcgKzUwNSw5IEBACiAJaWYgKCgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSAmJgogCSAgICAocEl0ZW0tPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0VYVFNVUFBfUkFURVMpKSB7CiAJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwRnJhbWUtPnBFeHRTdXBwUmF0ZXM9WyVwXS5cbiIsIHBJdGVtKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQlLRVJOX0lORk8gInBGcmFtZS0+cEV4dFN1cHBSYXRlcz1bJXBdLlxuIiwKKwkJCXBJdGVtKTsKIAl9IGVsc2UgewogCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSBOVUxMOwogCX0KQEAgLTUwMCwxMyArNTMzLDE3IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQpOwotCXBGcmFtZS0+cEFkZHJDdXJyQVAgPSAoUElFRUVfQUREUikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUCArIHNpemVvZigqKHBGcmFtZS0+cEFkZHJDdXJyQVApKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKKwlwRnJhbWUtPnBBZGRyQ3VyckFQID0gKFBJRUVFX0FERFIpCisJCQkgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVApOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQICsKKwkJICAgICAgc2l6ZW9mKCoocEZyYW1lLT5wQWRkckN1cnJBUCkpOwogCiAJcmV0dXJuOwogfQpAQCAtNTMxLDEyICs1NjgsMTUgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NBUF9JTkZPKTsKLQlwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7Ci0JcEZyYW1lLT5wQWRkckN1cnJBUCA9IChQSUVFRV9BRERSKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVApOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQpOworCXBGcmFtZS0+cEFkZHJDdXJyQVAgPSAoUElFRUVfQUREUikKKwkJCSAgICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICAgIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUCk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwogCXBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTU1MCw3ICs1OTAsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9SU046CkBAIC01NjAsMTYgKzYwMSwxOSBAQAogCQljYXNlIFdMQU5fRUlEX1JTTl9XUEE6CiAJCQlpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKIAkJCQlpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IHRydWUpCi0JCQkJCXBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworCQkJCQlwRnJhbWUtPnBSU05XUEEgPQorCQkJCQkJICAgICAgIChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9CisJCQkJCQkgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIHJlYXNzb2NyZXEgZGVjb2RlLlxuIiwKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJCUtFUk5fSU5GTyAiVW5yZWNvZ25pemVkIEVJRD0lZGQgaW4gcmVhc3NvY3JlcSBkZWNvZGUuXG4iLAogCQkJCXBJdGVtLT5ieUVsZW1lbnRJRCk7CiAJCQlicmVhazsKIAkJfQpAQCAtNjMxLDE2ICs2NzUsMjAgQEAKIAogCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0KKwkJCQkJCSAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9CisJCQkJCQkgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiQmFkIEVJRD0lZGQgaW4gcHJvYmVyZXFcbiIsIHBJdGVtLT5ieUVsZW1lbnRJRCk7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywKKwkJCQlLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVxXG4iLAorCQkJCXBJdGVtLT5ieUVsZW1lbnRJRCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC02NjgsMTUgKzcxNiwxOCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJKyBXTEFOX1BST0JFUkVTUF9PRkZfVFMpOwotCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQpOwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkKKwkJCSAgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQlXTEFOX1BST0JFUkVTUF9PRkZfVFMpOworCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPKTsKIAogCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPICsKLQkJc2l6ZW9mKCoocEZyYW1lLT5wd0NhcEluZm8pKTsKKwkJICAgICAgc2l6ZW9mKCoocEZyYW1lLT5wd0NhcEluZm8pKTsKIAogCXJldHVybjsKIH0KQEAgLTcwMiwxMiArNzUzLDE1IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkrIFdMQU5fUFJPQkVSRVNQX09GRl9UUyk7Ci0JcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX0lOVCk7Ci0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKQorCQkJICAgICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCVdMQU5fUFJPQkVSRVNQX09GRl9UUyk7CisJcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICAgIFdMQU5fUFJPQkVSRVNQX09GRl9CQ05fSU5UKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8pOwogCiAJLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KIAlwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC03MjEsNyArNzc1LDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0KKwkJCQkJCSAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRkhfUEFSTVM6CiAJCQlicmVhazsKQEAgLTczNSw3ICs3OTAsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfSUJTU19QQVJNUzoKIAkJCWlmIChwRnJhbWUtPnBJQlNTUGFybXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBJQlNTUGFybXMgPSAoUFdMQU5fSUVfSUJTU19QQVJNUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBJQlNTUGFybXMgPQorCQkJCQkJICAgKFBXTEFOX0lFX0lCU1NfUEFSTVMpcEl0ZW07CiAJCQlicmVhazsKIAogCQljYXNlIFdMQU5fRUlEX1JTTjoKQEAgLTc0NSw3ICs4MDEsOCBAQAogCQljYXNlIFdMQU5fRUlEX1JTTl9XUEE6CiAJCQlpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKIAkJCQlpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IHRydWUpCi0JCQkJCXBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworCQkJCQlwRnJhbWUtPnBSU05XUEEgPQorCQkJCQkJICAgICAgIChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRVJQOgpAQCAtNzU0LDcgKzgxMSw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9CisJCQkJCQkgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CiAJCQlicmVhazsKIAogCQljYXNlIFdMQU5fRUlEX0NPVU5UUlk6ICAgICAgLyogNyAqLwpAQCAtNzY0LDcgKzgyMiw4IEBACiAKIAkJY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDogICAvKiAzMiAqLwogCQkJaWYgKHBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9IChQV0xBTl9JRV9QV19DT05TVClwSXRlbTsKKwkJCQlwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPQorCQkJCQkJICAgICAgKFBXTEFOX0lFX1BXX0NPTlNUKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9DSF9TV0lUQ0g6ICAgIC8qIDM3ICovCkBAIC03ODMsNyArODQyLDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJCYWQgRUlEPSVkZCBpbiBwcm9iZXJlc3BcbiIsIHBJdGVtLT5ieUVsZW1lbnRJRCk7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywKKwkJCQlLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVzcFxuIiwKKwkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtODExLDEzICs4NzIsMTcgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7Ci0JcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX1NFUSk7Ci0JcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVVUSEVOX09GRl9TVEFUVVMgKyBzaXplb2YoKihwRnJhbWUtPnB3U3RhdHVzKSk7CisJcEZyYW1lLT5wd0F1dGhBbGdvcml0aG0gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7CisJcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgIFdMQU5fQVVUSEVOX09GRl9BVVRIX1NFUSk7CisJcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTICsKKwkJICAgICAgc2l6ZW9mKCoocEZyYW1lLT5wd1N0YXR1cykpOwogCiAJcmV0dXJuOwogfQpAQCAtODQzLDEyICs5MDgsMTUgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7Ci0JcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX1NFUSk7Ci0JcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTKTsKKwlwRnJhbWUtPnB3QXV0aEFsZ29yaXRobSA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICAgV0xBTl9BVVRIRU5fT0ZGX0FVVEhfQUxHKTsKKwlwRnJhbWUtPnB3QXV0aFNlcXVlbmNlID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgV0xBTl9BVVRIRU5fT0ZGX0FVVEhfU0VRKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtODgwLDkgKzk0OCwxMSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOwotCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OICsgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOworCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fREVBVVRIRU5fT0ZGX1JFQVNPTik7CisJcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04gKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3UmVhc29uKSk7CiAKIAlyZXR1cm47CiB9CkBAIC05MDYsOCArOTc2LDkgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OKTsKKwlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOwogCiAJcmV0dXJuOwogfQpAQCAtOTMxLDE0ICsxMDAyLDE4IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfU1RBVFVTKTsKLQlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9SRUFTU09DUkVTUF9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgV0xBTl9SRUFTU09DUkVTUF9PRkZfQUlEKTsKIAotCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfQUlEICsgc2l6ZW9mKCoocEZyYW1lLT5wd0FpZCkpOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfQUlEICsKKwkJICAgICAgc2l6ZW9mKCoocEZyYW1lLT5wd0FpZCkpOwogCiAJcmV0dXJuOwogfQpAQCAtOTY0LDE2ICsxMDM5LDIwIEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfU1RBVFVTKTsKLQlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9SRUFTU09DUkVTUF9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgV0xBTl9SRUFTU09DUkVTUF9PRkZfQUlEKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCi0JcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTKTsKKwlwRnJhbWUtPnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykKKwkJCSAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgICBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTKTsKIAogCXBJdGVtID0gKFBXTEFOX0lFKShwRnJhbWUtPnBTdXBwUmF0ZXMpOwogCXBJdGVtID0gKFBXTEFOX0lFKSgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgKyAyICsgcEl0ZW0tPmxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Flc19jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Flc19jY21wLmMKaW5kZXggODJiMGJkMS4uNGNjZmUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYWVzX2NjbXAuYwpAQCAtNDYsOCArNDYsNyBAQAogICogU0JPWCBUYWJsZQogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNib3hfdGFibGVbMjU2XSA9Ci17CitzdGF0aWMgdW5zaWduZWQgY2hhciBzYm94X3RhYmxlWzI1Nl0gPSB7CiAJMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKIAkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLCAweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAogCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCkBAIC0xNTMsOSArMTUyLDggQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW91dFtpXSA9IHNib3hfdGFibGVbaW5baV1dOwotCX0KIH0KIAogc3RhdGljIHZvaWQgU2hpZnRSb3dzKHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQpCkBAIC0yMDUsOCArMjAzLDcgQEAKIAkJCVN1YkJ5dGVzKGNpcGhlcnRleHQsIFRtcGRhdGFBKTsKIAkJCVNoaWZ0Um93cyhUbXBkYXRhQSwgVG1wZGF0YUIpOwogCQkJeG9yXzEyOChUbXBkYXRhQiwgYWJ5Um91bmRLZXksIGNpcGhlcnRleHQpOwotCQl9IGVsc2UgLyogcm91bmQgMSB+IDkgKi8KLQkJeworCQl9IGVsc2UgLyogcm91bmQgMSB+IDkgKi97CiAJCQlTdWJCeXRlcyhjaXBoZXJ0ZXh0LCBUbXBkYXRhQSk7CiAJCQlTaGlmdFJvd3MoVG1wZGF0YUEsIFRtcGRhdGFCKTsKIAkJCU1peENvbHVtbnMoJlRtcGRhdGFCWzBdLCAmVG1wZGF0YUFbMF0pOwpAQCAtMzExLDEzICszMDgsMTEgQEAKIAogCS8qIENDTVAgKi8KIAlBRVN2MTI4KHBieVJ4S2V5LCBNSUNfSVYsIGFieU1JQyk7Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5VG1wW2trXSA9IE1JQ19IRFIxW2trXSBeIGFieU1JQ1tra107Ci0JfQogCUFFU3YxMjgocGJ5UnhLZXksIGFieVRtcCwgYWJ5TUlDKTsKLQlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykgeworCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKQogCQlhYnlUbXBba2tdID0gTUlDX0hEUjJba2tdIF4gYWJ5TUlDW2trXTsKLQl9CiAJQUVTdjEyOChwYnlSeEtleSwgYWJ5VG1wLCBhYnlNSUMpOwogCiAJd0NudCA9IDE7CkBAIC0zMzAsMTIgKzMyNSwxMCBAQAogCiAJCUFFU3YxMjgocGJ5UnhLZXksIGFieUNUUlBMRCwgYWJ5VG1wKTsKIAotCQlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykgeworCQlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJCWFieVBsYWluVGV4dFtra10gPSBhYnlUbXBba2tdIF4gcGJ5UGF5bG9hZFtra107Ci0JCX0KLQkJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwkJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspCiAJCQlhYnlUbXBba2tdID0gYWJ5TUlDW2trXSBeIGFieVBsYWluVGV4dFtra107Ci0JCX0KIAkJQUVTdjEyOChwYnlSeEtleSwgYWJ5VG1wLCBhYnlNSUMpOwogCiAJCW1lbWNweShwYnlQYXlsb2FkLCBhYnlQbGFpblRleHQsIDE2KTsKQEAgLTM0NSwyNyArMzM4LDIzIEBACiAKIAkvKiBsYXN0IHBheWxvYWQgKi8KIAltZW1jcHkoJihhYnlMYXN0Q2lwaGVyWzBdKSwgcGJ5UGF5bG9hZCwgamopOwotCWZvciAoaWkgPSBqajsgaWkgPCAxNjsgaWkrKykgeworCWZvciAoaWkgPSBqajsgaWkgPCAxNjsgaWkrKykKIAkJYWJ5TGFzdENpcGhlcltpaV0gPSAweDAwOwotCX0KIAogCWFieUNUUlBMRFsxNF0gPSAodW5zaWduZWQgY2hhcikod0NudCA+PiA4KTsKIAlhYnlDVFJQTERbMTVdID0gKHVuc2lnbmVkIGNoYXIpKHdDbnQgJiAweGZmKTsKIAogCUFFU3YxMjgocGJ5UnhLZXksIGFieUNUUlBMRCwgYWJ5VG1wKTsKLQlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykgeworCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKQogCQlhYnlQbGFpblRleHRba2tdID0gYWJ5VG1wW2trXSBeIGFieUxhc3RDaXBoZXJba2tdOwotCX0KIAltZW1jcHkocGJ5UGF5bG9hZCwgYWJ5UGxhaW5UZXh0LCBqaik7CiAJcGJ5UGF5bG9hZCArPSBqajsKIAogCS8qIGZvciBNSUMgY2FsY3VsYXRpb24gKi8KLQlmb3IgKGlpID0gamo7IGlpIDwgMTY7IGlpKyspIHsKKwlmb3IgKGlpID0gamo7IGlpIDwgMTY7IGlpKyspCiAJCWFieVBsYWluVGV4dFtpaV0gPSAweDAwOwotCX0KLQlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykgeworCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKQogCQlhYnlUbXBba2tdID0gYWJ5TUlDW2trXSBeIGFieVBsYWluVGV4dFtra107Ci0JfQogCUFFU3YxMjgocGJ5UnhLZXksIGFieVRtcCwgYWJ5TUlDKTsKIAogCS8qID0+YWJvdmUgaXMgdGhlIGNhbGN1bGF0ZSBNSUMgKi8KQEAgLTM3NSw5ICszNjQsOCBAQAogCWFieUNUUlBMRFsxNF0gPSAodW5zaWduZWQgY2hhcikod0NudCA+PiA4KTsKIAlhYnlDVFJQTERbMTVdID0gKHVuc2lnbmVkIGNoYXIpKHdDbnQgJiAweGZmKTsKIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlDVFJQTEQsIGFieVRtcCk7Ci0JZm9yIChrayA9IDA7IGtrIDwgODsga2srKykgeworCWZvciAoa2sgPSAwOyBrayA8IDg7IGtrKyspCiAJCWFieVRtcFtra10gPSBhYnlUbXBba2tdIF4gcGJ5UGF5bG9hZFtra107Ci0JfQogCS8qID0+YWJvdmUgaXMgdGhlIGRlYy1NSUMgZnJvbSBwYWNrZXQgKi8KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGVzYy5oCmluZGV4IDMyZDgwOGUuLmY4ZTQxNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGVzYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGVzYy5oCkBAIC0yNzYsOSArMjc2LDggQEAKIAl2b2xhdGlsZSBTUkRFUzEgbV9yZDFSRDE7CiAJdm9sYXRpbGUgdTMyICAgIGJ1ZmZfYWRkcjsKIAl2b2xhdGlsZSB1MzIgICAgbmV4dF9kZXNjOwotCXN0cnVjdCB0YWdTUnhEZXNjICAgKm5leHQ7Ly80IGJ5dGVzCi0Jdm9sYXRpbGUgUERFVklDRV9SRF9JTkZPICAgIHBSREluZm87Ly80IGJ5dGVzCi0Jdm9sYXRpbGUgdTMyICAgIFJlc2VydmVkWzJdOy8vOCBieXRlcworCXN0cnVjdCB0YWdTUnhEZXNjICpuZXh0IF9fYWxpZ25lZCg4KTsKKwl2b2xhdGlsZSBQREVWSUNFX1JEX0lORk8gcFJESW5mbyBfX2FsaWduZWQoOCk7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNSeERlc2MsICpQU1J4RGVzYzsKIHR5cGVkZWYgY29uc3QgU1J4RGVzYyAqUENTUnhEZXNjOwpAQCAtMzYxLDkgKzM2MCw4IEBACiAJdm9sYXRpbGUgICAgU1RERVMxICBtX3RkMVREMTsKIAl2b2xhdGlsZSAgICB1MzIgICAgYnVmZl9hZGRyOwogCXZvbGF0aWxlICAgIHUzMiAgICBuZXh0X2Rlc2M7Ci0Jc3RydWN0IHRhZ1NUeERlc2MgKm5leHQ7IC8vNCBieXRlcwotCXZvbGF0aWxlICAgIFBERVZJQ0VfVERfSU5GTyBwVERJbmZvOy8vNCBieXRlcwotCXZvbGF0aWxlICAgIHUzMiAgICBSZXNlcnZlZFsyXTsvLzggYnl0ZXMKKwlzdHJ1Y3QgdGFnU1R4RGVzYyAqbmV4dCBfX2FsaWduZWQoOCk7CisJdm9sYXRpbGUgICAgUERFVklDRV9URF9JTkZPIHBUREluZm8gX19hbGlnbmVkKDgpOwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVHhEZXNjLCAqUFNUeERlc2M7CiB0eXBlZGVmIGNvbnN0IFNUeERlc2MgKlBDU1R4RGVzYzsKQEAgLTM3NSw5ICszNzMsOCBAQAogCXZvbGF0aWxlICAgIHUzMiBuZXh0X2Rlc2M7IC8vIHBvaW50ZXIgdG8gbmV4dCBsb2dpY2FsIGRlc2NyaXB0b3IKIAl2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBtX3dGSUZPQ3RsOwogCXZvbGF0aWxlICAgIHVuc2lnbmVkIHNob3J0IG1fd1RpbWVTdGFtcDsKLQlzdHJ1Y3QgdGFnU1R4U3luY0Rlc2MgKm5leHQ7IC8vNCBieXRlcwotCXZvbGF0aWxlICAgIFBERVZJQ0VfVERfSU5GTyBwVERJbmZvOy8vNCBieXRlcwotCXZvbGF0aWxlICAgIHUzMiBtX2R3UmVzZXJ2ZWQyOworCXN0cnVjdCB0YWdTVHhTeW5jRGVzYyAqbmV4dCBfX2FsaWduZWQoOCk7CisJdm9sYXRpbGUgICAgUERFVklDRV9URF9JTkZPIHBUREluZm8gX19hbGlnbmVkKDgpOwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVHhTeW5jRGVzYywgKlBTVHhTeW5jRGVzYzsKIHR5cGVkZWYgY29uc3QgU1R4U3luY0Rlc2MgKlBDU1R4U3luY0Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYwppbmRleCAwYTI5YzkwLi43NzFiZjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKQEAgLTcyOSwyNyArNzI5LDI3IEBACiAJLy8gU29mdCBNSUMKIAlpZiAoKHBLZXkgIT0gTlVMTCkgJiYgKHBLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewogCQlpZiAoYklzV0VQKSB7Ci0JCQl1bnNpZ25lZCBsb25nICpwZHdNSUNfTDsKLQkJCXVuc2lnbmVkIGxvbmcgKnBkd01JQ19SOwotCQkJdW5zaWduZWQgbG9uZyBkd01JQ19Qcmlvcml0eTsKLQkJCXVuc2lnbmVkIGxvbmcgZHdNSUNLZXkwID0gMCwgZHdNSUNLZXkxID0gMDsKLQkJCXVuc2lnbmVkIGxvbmcgZHdMb2NhbE1JQ19MID0gMDsKLQkJCXVuc2lnbmVkIGxvbmcgZHdMb2NhbE1JQ19SID0gMDsKKwkJCV9fbGUzMiAqcGR3TUlDX0w7CisJCQlfX2xlMzIgKnBkd01JQ19SOworCQkJX19sZTMyIGR3TUlDX1ByaW9yaXR5OworCQkJX19sZTMyIGR3TUlDS2V5MCA9IDAsIGR3TUlDS2V5MSA9IDA7CisJCQl1MzIgZHdMb2NhbE1JQ19MID0gMDsKKwkJCXUzMiBkd0xvY2FsTUlDX1IgPSAwOwogCQkJdmlhd2dldF93cGFfaGVhZGVyICp3cGFoZHI7CiAKIAkJCWlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKLQkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyNF0pKTsKLQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyOF0pKTsKKwkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzI0XSkpOworCQkJCWR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodTMyICopKCZwS2V5LT5hYnlLZXlbMjhdKSk7CiAJCQl9IGVsc2UgewogCQkJCWlmIChwRGV2aWNlLT5wTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQU5PTkUpIHsKLQkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMTZdKSk7Ci0JCQkJCWR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOworCQkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzE2XSkpOworCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOwogCQkJCX0gZWxzZSBpZiAoKHBLZXktPmR3S2V5SW5kZXggJiBCSVQyOCkgPT0gMCkgewotCQkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsxNl0pKTsKLQkJCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjBdKSk7CisJCQkJCWR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCoodTMyICopKCZwS2V5LT5hYnlLZXlbMTZdKSk7CisJCQkJCWR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodTMyICopKCZwS2V5LT5hYnlLZXlbMjBdKSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjRdKSk7Ci0JCQkJCWR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzI4XSkpOworCQkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzI0XSkpOworCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzI4XSkpOwogCQkJCX0KIAkJCX0KIApAQCAtNzYzLDE0ICs3NjMsMTQgQEAKIAkJCU1JQ192R2V0TUlDKCZkd0xvY2FsTUlDX0wsICZkd0xvY2FsTUlDX1IpOwogCQkJTUlDX3ZVbkluaXQoKTsKIAotCQkJcGR3TUlDX0wgPSAodW5zaWduZWQgbG9uZyAqKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplKTsKLQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikoc2tiLT5kYXRhICsgNCArIEZyYW1lU2l6ZSArIDQpOworCQkJcGR3TUlDX0wgPSAoX19sZTMyICopKHNrYi0+ZGF0YSArIDQgKyBGcmFtZVNpemUpOworCQkJcGR3TUlDX1IgPSAoX19sZTMyICopKHNrYi0+ZGF0YSArIDQgKyBGcmFtZVNpemUgKyA0KTsKIAkJCS8vREJHX1BSTl9HUlAxMigoIlJ4TDogJWx4LCBSeFI6ICVseFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpKTsKIAkJCS8vREJHX1BSTl9HUlAxMigoIkxvY2FsTDogJWx4LCBMb2NhbFI6ICVseFxuIiwgZHdMb2NhbE1JQ19MLCBkd0xvY2FsTUlDX1IpKTsKIAkJCS8vREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZHdNSUNLZXkwPSAlbHgsZHdNSUNLZXkxPSAlbHggXG4iLCBkd01JQ0tleTAsIGR3TUlDS2V5MSk7CiAKLQkJCWlmICgoY3B1X3RvX2xlMzIoKnBkd01JQ19MKSAhPSBkd0xvY2FsTUlDX0wpIHx8Ci0JCQkgICAgKGNwdV90b19sZTMyKCpwZHdNSUNfUikgIT0gZHdMb2NhbE1JQ19SKSB8fAorCQkJaWYgKChsZTMyX3RvX2NwdSgqcGR3TUlDX0wpICE9IGR3TG9jYWxNSUNfTCkgfHwKKwkJCSAgICAobGUzMl90b19jcHUoKnBkd01JQ19SKSAhPSBkd0xvY2FsTUlDX1IpIHx8CiAJCQkgICAgcERldmljZS0+YlJ4TUlDRmFpbCkgewogCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk1JQyBjb21wYXJpc29uIGlzIGZhaWwhXG4iKTsKIAkJCQlwRGV2aWNlLT5iUnhNSUNGYWlsID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYwppbmRleCBlYWIzYjQxLi43OGI1ODA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCQkJCWlmICh1S2V5TGVuZ3RoID09IFdMQU5fV0VQMTA0X0tFWUxFTikKIAkJCQkJcEtleS0+YWJ5S2V5WzE1XSB8PSAweDgwOwogCQkJfQotCQkJTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW2ldLndLZXlDdGwsIGksIHVLZXlJZHgsIHBieUJTU0lELCAodW5zaWduZWQgbG9uZyAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKKwkJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsLCBpLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHUzMiAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKIAogCQkJaWYgKChkd0tleUluZGV4ICYgVVNFX0tFWVJTQykgPT0gMCkgewogCQkJCS8vIFJTQyBzZXQgYnkgTklDCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJCWlmICh1S2V5TGVuZ3RoID09IFdMQU5fV0VQMTA0X0tFWUxFTikKIAkJCQlwS2V5LT5hYnlLZXlbMTVdIHw9IDB4ODA7CiAJCX0KLQkJTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW2pdLndLZXlDdGwsIGosIHVLZXlJZHgsIHBieUJTU0lELCAodW5zaWduZWQgbG9uZyAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKKwkJTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW2pdLndLZXlDdGwsIGosIHVLZXlJZHgsIHBieUJTU0lELCAodTMyICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOwogCiAJCWlmICgoZHdLZXlJbmRleCAmIFVTRV9LRVlSU0MpID09IDApIHsKIAkJCS8vIFJTQyBzZXQgYnkgTklDCkBAIC02NzAsNyArNjcwLDcgQEAKIAkJaWYgKHVLZXlMZW5ndGggPT0gV0xBTl9XRVAxMDRfS0VZTEVOKQogCQkJcEtleS0+YWJ5S2V5WzE1XSB8PSAweDgwOwogCX0KLQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS53S2V5Q3RsLCBNQVhfS0VZX1RBQkxFLTEsIHVLZXlJZHgsIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5hYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0ud0tleUN0bCwgTUFYX0tFWV9UQUJMRS0xLCB1S2V5SWR4LCBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0uYWJ5QlNTSUQsICh1MzIgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CiAKIAlpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAJCS8vIFJTQyBzZXQgYnkgTklDCkBAIC03NjYsNyArNzY2LDcgQEAKIAkJCQlpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAJCQkJCXBLZXktPmFieUtleVsxNV0gfD0gMHg4MDsKIAkJCX0KLQkJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsLCBpLCB1S2V5SWR4LCBwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELCAodW5zaWduZWQgbG9uZyAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKKwkJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsLCBpLCB1S2V5SWR4LCBwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELCAodTMyICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOwogCiAJCQlpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAJCQkJLy8gUlNDIHNldCBieSBOSUMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jCmluZGV4IDIxYmQ4YTEuLjBlYzA3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYwpAQCAtMTQyOCwxMCArMTQyOCwxMCBAQAogICovCiAKIHZvaWQgTUFDdlNldEtleUVudHJ5KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIHNob3J0IHdLZXlDdGwsIHVuc2lnbmVkIGludCB1RW50cnlJZHgsCi0JCSAgICAgdW5zaWduZWQgaW50IHVLZXlJZHgsIHVuc2lnbmVkIGNoYXIgKnBieUFkZHIsIHVuc2lnbmVkIGxvbmcgKnBkd0tleSwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpCisJCSAgICAgdW5zaWduZWQgaW50IHVLZXlJZHgsIHVuc2lnbmVkIGNoYXIgKnBieUFkZHIsIHUzMiAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCkKIHsKIAl1bnNpZ25lZCBzaG9ydCB3T2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZHdEYXRhOworCXUzMiBkd0RhdGE7CiAJaW50ICAgICBpaTsKIAogCWlmIChieUxvY2FsSUQgPD0gMSkKQEAgLTE0NDUsNyArMTQ0NSw3IEBACiAJZHdEYXRhIHw9IHdLZXlDdGw7CiAJZHdEYXRhIDw8PSAxNjsKIAlkd0RhdGEgfD0gTUFLRVdPUkQoKihwYnlBZGRyKzQpLCAqKHBieUFkZHIrNSkpOwotCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjEuIHdPZmZzZXQ6ICVkLCBEYXRhOiAlbFgsIEtleUN0bDolWFxuIiwgd09mZnNldCwgZHdEYXRhLCB3S2V5Q3RsKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIxLiB3T2Zmc2V0OiAlZCwgRGF0YTogJVgsIEtleUN0bDolWFxuIiwgd09mZnNldCwgZHdEYXRhLCB3S2V5Q3RsKTsKIAogCVZOU3ZPdXRQb3J0Vyhkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGTkRFWCwgd09mZnNldCk7CiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZEQVRBLCBkd0RhdGEpOwpAQCAtMTQ2MCw3ICsxNDYwLDcgQEAKIAlkd0RhdGEgfD0gKihwYnlBZGRyKzEpOwogCWR3RGF0YSA8PD0gODsKIAlkd0RhdGEgfD0gKihwYnlBZGRyKzApOwotCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjIuIHdPZmZzZXQ6ICVkLCBEYXRhOiAlbFhcbiIsIHdPZmZzZXQsIGR3RGF0YSk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiMi4gd09mZnNldDogJWQsIERhdGE6ICVYXG4iLCB3T2Zmc2V0LCBkd0RhdGEpOwogCiAJVk5Tdk91dFBvcnRXKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZOREVYLCB3T2Zmc2V0KTsKIAlWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX01JU0NGRkRBVEEsIGR3RGF0YSk7CkBAIC0xNDcwLDcgKzE0NzAsNyBAQAogCXdPZmZzZXQgKz0gKHVLZXlJZHggKiA0KTsKIAlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CiAJCS8vIGFsd2F5cyBwdXNoIDEyOCBiaXRzCi0JCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjMuKCVkKSB3T2Zmc2V0OiAlZCwgRGF0YTogJWxYXG4iLCBpaSwgd09mZnNldCtpaSwgKnBkd0tleSk7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjMuKCVkKSB3T2Zmc2V0OiAlZCwgRGF0YTogJVhcbiIsIGlpLCB3T2Zmc2V0K2lpLCAqcGR3S2V5KTsKIAkJVk5Tdk91dFBvcnRXKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZOREVYLCB3T2Zmc2V0K2lpKTsKIAkJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZEQVRBLCAqcGR3S2V5KyspOwogCQlWTlN2T3V0UG9ydFcoZHdJb0Jhc2UgKyBNQUNfUkVHX01JU0NGRkNUTCwgTUlTQ0ZGQ1RMX1dSSVRFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5oCmluZGV4IDNmMTc3ZjcuLjQ2MTVkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuaApAQCAtMTAzOCw3ICsxMDM4LDcgQEAKIGJvb2wgTUFDYlBTV2FrZXVwKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOwogCiB2b2lkIE1BQ3ZTZXRLZXlFbnRyeSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3S2V5Q3RsLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4LAotCQkgICAgIHVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBjaGFyICpwYnlBZGRyLCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKTsKKwkJICAgICB1bnNpZ25lZCBpbnQgdUtleUlkeCwgdW5zaWduZWQgY2hhciAqcGJ5QWRkciwgdTMyICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKTsKIHZvaWQgTUFDdkRpc2FibGVLZXlFbnRyeSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4KTsKIHZvaWQgTUFDdlNldERlZmF1bHRLZXlFbnRyeSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgdUtleUxlbiwKIAkJCSAgICB1bnNpZ25lZCBpbnQgdUtleUlkeCwgdW5zaWduZWQgbG9uZyAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5jCmluZGV4IDdlYTVmN2YuLmFkZTRjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5jCkBAIC01MywxNCArNTMsMTQgQEAKICovCiBzdGF0aWMgdm9pZCBzX3ZDbGVhcih2b2lkKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBpbnRlcm5hbCBtZXNzYWdlLAogLy8gcmVzZXRzIHRoZSBvYmplY3QgdG8gdGhlIHN0YXRlIGp1c3QgYWZ0ZXIgY29uc3RydWN0aW9uLgotc3RhdGljIHZvaWQgc192U2V0S2V5KHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKTsKK3N0YXRpYyB2b2lkIHNfdlNldEtleSh1MzIgIGR3SzAsIHUzMiAgZHdLMSk7CiBzdGF0aWMgdm9pZCBzX3ZBcHBlbmRCeXRlKHVuc2lnbmVkIGNoYXIgYik7ICAgICAgICAgICAgLy8gQWRkIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGludGVybmFsIG1lc3NhZ2UKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIEwsIFI7ICAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlCitzdGF0aWMgdTMyIEwsIFI7CS8qIEN1cnJlbnQgc3RhdGUgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgSzAsIEsxOyAgICAgICAgIC8vIEtleQotc3RhdGljIHVuc2lnbmVkIGxvbmcgTTsgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKQorc3RhdGljIHUzMiBLMCwgSzE7CS8qIEtleSAqLworc3RhdGljIHUzMiBNOwkJLyogTWVzc2FnZSBhY2N1bXVsYXRvciAoc2luZ2xlIHdvcmQpICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG5CeXRlc0luTTsgICAgICAvLyAjIGJ5dGVzIGluIE0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTk4LDcgKzk4LDcgQEAKIAlNID0gMDsKIH0KIAotc3RhdGljIHZvaWQgc192U2V0S2V5KHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKQorc3RhdGljIHZvaWQgc192U2V0S2V5KHUzMiBkd0swLCB1MzIgZHdLMSkKIHsKIAkvLyBTZXQgdGhlIGtleQogCUswID0gZHdLMDsKQEAgLTEyOSw3ICsxMjksNyBAQAogCX0KIH0KIAotdm9pZCBNSUNfdkluaXQodW5zaWduZWQgbG9uZyBkd0swLCB1bnNpZ25lZCBsb25nIGR3SzEpCit2b2lkIE1JQ192SW5pdCh1MzIgZHdLMCwgdTMyIGR3SzEpCiB7CiAJLy8gU2V0IHRoZSBrZXkKIAlzX3ZTZXRLZXkoZHdLMCwgZHdLMSk7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAl9CiB9CiAKLXZvaWQgTUlDX3ZHZXRNSUModW5zaWduZWQgbG9uZyAqcGR3TCwgdW5zaWduZWQgbG9uZyAqcGR3UikKK3ZvaWQgTUlDX3ZHZXRNSUModTMyICpwZHdMLCB1MzIgKnBkd1IpCiB7CiAJLy8gQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcKIAlzX3ZBcHBlbmRCeXRlKDB4NWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuaAppbmRleCAzODdkMjA2Li5mNmMyYzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuaApAQCAtMzEsMTEgKzMxLDEzIEBACiAjaWZuZGVmIF9fTUlDSEFFTF9IX18KICNkZWZpbmUgX19NSUNIQUVMX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBUeXBlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBNSUNfdkluaXQodW5zaWduZWQgbG9uZyBkd0swLCB1bnNpZ25lZCBsb25nIGR3SzEpOwordm9pZCBNSUNfdkluaXQodTMyIGR3SzAsIHUzMiBkd0sxKTsKIAogdm9pZCBNSUNfdlVuSW5pdCh2b2lkKTsKIApAQCAtNDQsNyArNDYsNyBAQAogCiAvKiBHZXQgdGhlIE1JQyByZXN1bHQuIERlc3RpbmF0aW9uIHNob3VsZCBhY2NlcHQgOCBieXRlcyBvZiByZXN1bHQuICovCiAvKiBUaGlzIGFsc28gcmVzZXRzIHRoZSBtZXNzYWdlIHRvIGVtcHR5LiAqLwotdm9pZCBNSUNfdkdldE1JQyh1bnNpZ25lZCBsb25nICpwZHdMLCB1bnNpZ25lZCBsb25nICpwZHdSKTsKK3ZvaWQgTUlDX3ZHZXRNSUModTMyICpwZHdMLCB1MzIgKnBkd1IpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCmluZGV4IDZhZmZkNmUuLmMyNjUzZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCkBAIC0xMjU3LDExICsxMjU3LDExIEBACiAvLyAgICB1bnNpZ25lZCBjaGFyIGFieVRtcFs4XTsKIC8vICAgIHVuc2lnbmVkIGxvbmcgZHdDUkM7CiAJdW5zaWduZWQgaW50IGNiTUlDSERSID0gMDsKLQl1bnNpZ25lZCBsb25nIGR3TUlDS2V5MCwgZHdNSUNLZXkxOwotCXVuc2lnbmVkIGxvbmcgZHdNSUNfUHJpb3JpdHk7Ci0JdW5zaWduZWQgbG9uZyAqcGR3TUlDX0w7Ci0JdW5zaWduZWQgbG9uZyAqcGR3TUlDX1I7Ci0JdW5zaWduZWQgbG9uZyBkd1NhZmVNSUNfTCwgZHdTYWZlTUlDX1I7IC8vRml4ICJMYXN0IEZyYWcgU2l6ZSIgPCAiTUlDIGxlbmd0aCIuCisJdTMyIGR3TUlDS2V5MCwgZHdNSUNLZXkxOworCXUzMiBkd01JQ19Qcmlvcml0eTsKKwl1MzIgKnBkd01JQ19MOworCXUzMiAqcGR3TUlDX1I7CisJdTMyIGR3U2FmZU1JQ19MLCBkd1NhZmVNSUNfUjsgLyogRml4ICJMYXN0IEZyYWcgU2l6ZSIgPCAiTUlDIGxlbmd0aCIuICovCiAJYm9vbCBiTUlDMkZyYWcgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQgdU1JQ0ZyYWdMZW4gPSAwOwogCXVuc2lnbmVkIGludCB1TUFDZnJhZ051bSA9IDE7CkBAIC0xNDM0LDIxICsxNDM0LDIxIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAlpZiAoKGJOZWVkRW5jcnlwdCA9PSB0cnVlKSAmJiAocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewogCQlpZiAocERldmljZS0+cE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFOT05FKSB7Ci0JCQlkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7Ci0JCQlkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CisJCQlkd01JQ0tleTAgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMTZdKTsKKwkJCWR3TUlDS2V5MSA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOwogCQl9IGVsc2UgaWYgKChwVHJhbnNtaXRLZXktPmR3S2V5SW5kZXggJiBBVVRIRU5USUNBVE9SX0tFWSkgIT0gMCkgewotCQkJZHdNSUNLZXkwID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOwotCQkJZHdNSUNLZXkxID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOworCQkJZHdNSUNLZXkwID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisJCQlkd01JQ0tleTEgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKIAkJfSBlbHNlIHsKLQkJCWR3TUlDS2V5MCA9ICoodW5zaWduZWQgbG9uZyAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjRdKTsKLQkJCWR3TUlDS2V5MSA9ICoodW5zaWduZWQgbG9uZyAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjhdKTsKKwkJCWR3TUlDS2V5MCA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyNF0pOworCQkJZHdNSUNLZXkxID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI4XSk7CiAJCX0KIAkJLy8gRE8gU29mdHdhcmUgTWljaGFlbAogCQlNSUNfdkluaXQoZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCQlNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSYocHNFdGhIZWFkZXItPmFieURzdEFkZHJbMF0pLCAxMik7CiAJCWR3TUlDX1ByaW9yaXR5ID0gMDsKIAkJTUlDX3ZBcHBlbmQoKHVuc2lnbmVkIGNoYXIgKikmZHdNSUNfUHJpb3JpdHksIDQpOwotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUMgS0VZOiAlbFgsICVsWFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUMgS0VZOiAlWCwgJVhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAl9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE2MjQsMTAgKzE2MjQsMTAgQEAKIAkJCQkJaWYgKGJNSUMyRnJhZyA9PSBmYWxzZSkgewogCQkJCQkJaWYgKHVUbXBMZW4gIT0gMCkKIAkJCQkJCQlNSUNfdkFwcGVuZCgocGJ5QnVmZmVyICsgdUxlbmd0aCksIHVUbXBMZW4pOwotCQkJCQkJcGR3TUlDX0wgPSAodW5zaWduZWQgbG9uZyAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbik7Ci0JCQkJCQlwZHdNSUNfUiA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuICsgNCk7CisJCQkJCQlwZHdNSUNfTCA9ICh1MzIgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4pOworCQkJCQkJcGR3TUlDX1IgPSAodTMyICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuICsgNCk7CiAJCQkJCQlNSUNfdkdldE1JQyhwZHdNSUNfTCwgcGR3TUlDX1IpOwotCQkJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTGFzdCBNSUM6JWxYLCAlbFhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKKwkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkxhc3QgTUlDOiVYLCAlWFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaWYgKHVNSUNGcmFnTGVuID49IDQpIHsKIAkJCQkJCQltZW1jcHkoKHBieUJ1ZmZlciArIHVMZW5ndGgpLCAoKHVuc2lnbmVkIGNoYXIgKikmZHdTYWZlTUlDX1IgKyAodU1JQ0ZyYWdMZW4gLSA0KSksCkBAIC0xNzQ0LDggKzE3NDQsOCBAQAogCQkJCQkJdU1JQ0ZyYWdMZW4gPSBjYkZyYWdQYXlsb2FkU2l6ZSAtIHVUbXBMZW47CiAJCQkJCQlBU1NFUlQodU1JQ0ZyYWdMZW4gPCBjYk1JQ2xlbik7CiAKLQkJCQkJCXBkd01JQ19MID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4pOwotCQkJCQkJcGR3TUlDX1IgPSAodW5zaWduZWQgbG9uZyAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOworCQkJCQkJcGR3TUlDX0wgPSAodTMyICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKTsKKwkJCQkJCXBkd01JQ19SID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOwogCQkJCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKIAkJCQkJCWR3U2FmZU1JQ19MID0gKnBkd01JQ19MOwogCQkJCQkJZHdTYWZlTUlDX1IgPSAqcGR3TUlDX1I7CkBAIC0xNzU5LDcgKzE3NTksNyBAQAogCQkJCQkJICB9CiAJCQkJCQkgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlxuIik7CiAJCQkJCQkqLwotCQkJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiR2V0IE1JQzolbFgsICVsWFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOworCQkJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiR2V0IE1JQzolWCwgJVhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKIAkJCQkJfQogCQkJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNaWRkbGUgZnJhZyBsZW46ICVkXG4iLCB1VG1wTGVuKTsKIAkJCQkJLyoKQEAgLTE4NzMsOCArMTg3Myw4IEBACiAKIAkJCU1JQ192QXBwZW5kKChwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiksIGNiRnJhbWVCb2R5U2l6ZSk7CiAKLQkJCXBkd01JQ19MID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4gKyBjYkZyYW1lQm9keVNpemUpOwotCQkJcGR3TUlDX1IgPSAodW5zaWduZWQgbG9uZyAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiArIGNiRnJhbWVCb2R5U2l6ZSArIDQpOworCQkJcGR3TUlDX0wgPSAodTMyICopKHBieUJ1ZmZlciArIHVMZW5ndGggLSBjYjgwMl8xX0hfbGVuICsgY2JGcmFtZUJvZHlTaXplKTsKKwkJCXBkd01JQ19SID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiArIGNiRnJhbWVCb2R5U2l6ZSArIDQpOwogCiAJCQlNSUNfdkdldE1JQyhwZHdNSUNfTCwgcGR3TUlDX1IpOwogCQkJTUlDX3ZVbkluaXQoKTsKQEAgLTE4ODcsNyArMTg4Nyw3IEBACiAKIAkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInVMZW5ndGg6ICVkLCAlZFxuIiwgdUxlbmd0aCwgY2JGcmFtZUJvZHlTaXplKTsKIAkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImNiUmVxQ291bnQ6JWQsICVkLCAlZCwgJWRcbiIsIGNiUmVxQ291bnQsIGNiSGVhZGVyTGVuZ3RoLCB1UGFkZGluZywgY2JJVmxlbik7Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUM6JWx4LCAlbHhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk1JQzoleCwgJXhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKIC8qCiAgIGZvciAoaWkgPSAwOyBpaSA8IDg7IGlpKyspIHsKICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiJTAyeCAiLCAqKCgodW5zaWduZWQgY2hhciAqKShwZHdNSUNfTCkgKyBpaSkpKTsKQEAgLTI1OTIsMTAgKzI1OTIsMTAgQEAKIAl1bnNpZ25lZCBpbnQgdVBhZGRpbmcgPSAwOwogCXVuc2lnbmVkIGludCBjYk1JQ0hEUiA9IDA7CiAJdW5zaWduZWQgaW50IHVMZW5ndGggPSAwOwotCXVuc2lnbmVkIGxvbmcgZHdNSUNLZXkwLCBkd01JQ0tleTE7Ci0JdW5zaWduZWQgbG9uZyBkd01JQ19Qcmlvcml0eTsKLQl1bnNpZ25lZCBsb25nICpwZHdNSUNfTDsKLQl1bnNpZ25lZCBsb25nICpwZHdNSUNfUjsKKwl1MzIgZHdNSUNLZXkwLCBkd01JQ0tleTE7CisJdTMyIGR3TUlDX1ByaW9yaXR5OworCXUzMiAqcGR3TUlDX0w7CisJdTMyICpwZHdNSUNfUjsKIAl1bnNpZ25lZCBzaG9ydCB3VHhCdWZTaXplOwogCXVuc2lnbmVkIGludCBjYk1hY0hkTGVuOwogCVNFdGhlcm5ldEhlYWRlciBzRXRoSGVhZGVyOwpAQCAtMjg0MSwyMiArMjg0MSwyMiBAQAogCQl9CiAKIAkJaWYgKChwVHJhbnNtaXRLZXkgIT0gTlVMTCkgJiYgKHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX1RLSVApKSB7Ci0JCQlkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7Ci0JCQlkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CisJCQlkd01JQ0tleTAgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMTZdKTsKKwkJCWR3TUlDS2V5MSA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOwogCiAJCQkvLyBETyBTb2Z0d2FyZSBNaWNoYWVsCiAJCQlNSUNfdkluaXQoZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCQkJTUlDX3ZBcHBlbmQoKHVuc2lnbmVkIGNoYXIgKikmKHNFdGhIZWFkZXIuYWJ5RHN0QWRkclswXSksIDEyKTsKIAkJCWR3TUlDX1ByaW9yaXR5ID0gMDsKIAkJCU1JQ192QXBwZW5kKCh1bnNpZ25lZCBjaGFyICopJmR3TUlDX1ByaW9yaXR5LCA0KTsKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRNQTBfdHhfODAyMTpNSUMgS0VZOiAlbFgsICVsWFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRE1BMF90eF84MDIxOk1JQyBLRVk6ICVYLCAlWFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCiAJCQl1TGVuZ3RoID0gY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbjsKIAogCQkJTUlDX3ZBcHBlbmQoKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGgpLCBjYkZyYW1lQm9keVNpemUpOwogCi0JCQlwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUpOwotCQkJcGR3TUlDX1IgPSAodW5zaWduZWQgbG9uZyAqKShwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoICsgY2JGcmFtZUJvZHlTaXplICsgNCk7CisJCQlwZHdNSUNfTCA9ICh1MzIgKikocGJ5VHhCdWZmZXJBZGRyICsgdUxlbmd0aCArIGNiRnJhbWVCb2R5U2l6ZSk7CisJCQlwZHdNSUNfUiA9ICh1MzIgKikocGJ5VHhCdWZmZXJBZGRyICsgdUxlbmd0aCArIGNiRnJhbWVCb2R5U2l6ZSArIDQpOwogCiAJCQlNSUNfdkdldE1JQyhwZHdNSUNfTCwgcGR3TUlDX1IpOwogCQkJTUlDX3ZVbkluaXQoKTsKQEAgLTI4NjksNyArMjg2OSw3IEBACiAKIAkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInVMZW5ndGg6ICVkLCAlZFxuIiwgdUxlbmd0aCwgY2JGcmFtZUJvZHlTaXplKTsKIAkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImNiUmVxQ291bnQ6JWQsICVkLCAlZCwgJWRcbiIsIGNiUmVxQ291bnQsIGNiSGVhZGVyU2l6ZSwgdVBhZGRpbmcsIGNiSVZsZW4pOwotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDOiVseCwgJWx4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUM6JXgsICV4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CiAKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd21nci5jCmluZGV4IDUyMDBhMmEuLmI2NzNiYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd21nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd21nci5jCkBAIC05NjcsMTAgKzk2NywxMCBAQAogCQlzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAJCS8vIGRlY29kZSB0aGUgZnJhbWUKIAkJdk1nckRlY29kZUFzc29jUmVzcG9uc2UoJnNGcmFtZSk7Ci0JCWlmICgoc0ZyYW1lLnB3Q2FwSW5mbyA9PSAwKSB8fAotCQkgICAgKHNGcmFtZS5wd1N0YXR1cyA9PSAwKSB8fAotCQkgICAgKHNGcmFtZS5wd0FpZCA9PSAwKSB8fAotCQkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IDApKSB7CisJCWlmICgoc0ZyYW1lLnB3Q2FwSW5mbyA9PSBOVUxMKSB8fAorCQkgICAgKHNGcmFtZS5wd1N0YXR1cyA9PSBOVUxMKSB8fAorCQkgICAgKHNGcmFtZS5wd0FpZCA9PSBOVUxMKSB8fAorCQkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IE5VTEwpKSB7CiAJCQlEQkdfUE9SVDgwKDB4Q0MpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xODEyLDEwICsxODEyLDEwIEBACiAJLy8gZGVjb2RlIHRoZSBiZWFjb24gZnJhbWUKIAl2TWdyRGVjb2RlQmVhY29uKCZzRnJhbWUpOwogCi0JaWYgKChzRnJhbWUucHdCZWFjb25JbnRlcnZhbCA9PSAwKSB8fAotCSAgICAoc0ZyYW1lLnB3Q2FwSW5mbyA9PSAwKSB8fAotCSAgICAoc0ZyYW1lLnBTU0lEID09IDApIHx8Ci0JICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSAwKSkgeworCWlmICgoc0ZyYW1lLnB3QmVhY29uSW50ZXJ2YWwgPT0gTlVMTCkgfHwKKwkgICAgKHNGcmFtZS5wd0NhcEluZm8gPT0gTlVMTCkgfHwKKwkgICAgKHNGcmFtZS5wU1NJRCA9PSBOVUxMKSB8fAorCSAgICAoc0ZyYW1lLnBTdXBwUmF0ZXMgPT0gTlVMTCkpIHsKIAkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUnggYmVhY29uIGZyYW1lIGVycm9yXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIwNzIsNyArMjA3Miw3IEBACiAJCWlmIChiVFNGTGFyZ2VEaWZmKQogCQkJYlVwZGF0ZVRTRiA9IHRydWU7CiAKLQkJaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgJiYgKHNGcmFtZS5wVElNICE9IDApKSB7CisJCWlmIChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlICYmIChzRnJhbWUucFRJTSAhPSBOVUxMKSkgewogCQkJLy8gZGVhbCB3aXRoIERUSU0sIGFuYWx5c2lzIFRJTQogCQkJcE1nbXQtPmJNdWx0aWNhc3RUSU0gPSBXTEFOX01HTVRfSVNfTVVMVElDQVNUX1RJTShzRnJhbWUucFRJTS0+YnlCaXRNYXBDdGwpID8gdHJ1ZSA6IGZhbHNlOwogCQkJcE1nbXQtPmJ5RFRJTUNvdW50ID0gc0ZyYW1lLnBUSU0tPmJ5RFRJTUNvdW50OwpAQCAtNDEwNywxMSArNDEwNywxMSBAQAogCXNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKIAl2TWdyRGVjb2RlUHJvYmVSZXNwb25zZSgmc0ZyYW1lKTsKIAotCWlmICgoc0ZyYW1lLnBxd1RpbWVzdGFtcCA9PSAwKSB8fAotCSAgICAoc0ZyYW1lLnB3QmVhY29uSW50ZXJ2YWwgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wd0NhcEluZm8gPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wU1NJRCA9PSAwKSB8fAotCSAgICAoc0ZyYW1lLnBTdXBwUmF0ZXMgPT0gMCkpIHsKKwlpZiAoKHNGcmFtZS5wcXdUaW1lc3RhbXAgPT0gTlVMTCkgfHwKKwkgICAgKHNGcmFtZS5wd0JlYWNvbkludGVydmFsID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucHdDYXBJbmZvID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucFNTSUQgPT0gTlVMTCkgfHwKKwkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IE5VTEwpKSB7CiAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlByb2JlIHJlc3A6RmFpbCBhZGRyOlslcF0gXG4iLCBwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcik7CiAJCURCR19QT1JUODAoMHhDQyk7CiAJCXJldHVybjsKQEAgLTQxMjAsNyArNDEyMCw3IEBACiAJaWYgKHNGcmFtZS5wU1NJRC0+bGVuID09IDApCiAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlJ4IFByb2JlIHJlc3A6IFNTSUQgbGVuID0gMCBcbiIpOwogCi0JaWYgKHNGcmFtZS5wRFNQYXJtcyAhPSAwKSB7CisJaWYgKHNGcmFtZS5wRFNQYXJtcyAhPSBOVUxMKSB7CiAJCWlmIChieUN1cnJDaGFubmVsID4gQ0JfTUFYX0NIQU5ORUxfMjRHKSB7CiAJCQkvLyBjaGFubmVsIHJlbWFwcGluZyB0bwogCQkJYnlJRUNoYW5uZWwgPSBnZXRfY2hhbm5lbF9tYXBwaW5nKHBNZ210LT5wQWRhcHRlciwgc0ZyYW1lLnBEU1Bhcm1zLT5ieUN1cnJDaGFubmVsLCBQSFlfVFlQRV8xMUEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni84MDIxMWhkci5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni84MDIxMWhkci5oCmluZGV4IDAwMDMwNGYuLjFlNzc4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFoZHIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2LzgwMjExaGRyLmgKQEAgLTE1MSw3ICsxNTEsNyBAQAogI2lmZGVmIF9fQklHX0VORElBTgogCiAvKiBHRVQgJiBTRVQgRnJhbWUgQ29udHJvbCBiaXQgKi8KLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFJWRVIobikgICAgKCgoKHUxNikobikgPj4gOCkgJiAoQklUMCB8IEJJVDEpKQorI2RlZmluZSBXTEFOX0dFVF9GQ19QUlZFUihuKSAgICAoKCh1MTYpKG4pID4+IDgpICYgKEJJVDAgfCBCSVQxKSkKICNkZWZpbmUgV0xBTl9HRVRfRkNfRlRZUEUobikgICAgKCgoKHUxNikobikgPj4gOCkgJiAoQklUMiB8IEJJVDMpKSA+PiAyKQogI2RlZmluZSBXTEFOX0dFVF9GQ19GU1RZUEUobikgICAoKCgodTE2KShuKSA+PiA4KSBcCiAJCQkJICAmIChCSVQ0fEJJVDV8QklUNnxCSVQ3KSkgPj4gNCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYWVzX2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYWVzX2NjbXAuYwppbmRleCA2MWI5ZjdiLi5lMmJmYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Flc19jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9hZXNfY2NtcC5jCkBAIC0yNjksOSArMjY5LDkgQEAKIAkvKiBNSUNfSERSMSAqLwogCU1JQ19IRFIxWzBdID0gKHU4KSh3SExlbiA+PiA4KTsKIAlNSUNfSERSMVsxXSA9ICh1OCkod0hMZW4gJiAweGZmKTsKLQlieVRtcCA9ICh1OCkocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCAmIDB4ZmYpOworCWJ5VG1wID0gKHU4KShsZTE2X3RvX2NwdShwTUFDSGVhZGVyLT5mcmFtZV9jb250cm9sKSA+PiA4KTsKIAlNSUNfSERSMVsyXSA9IGJ5VG1wICYgMHg4ZjsKLQlieVRtcCA9ICh1OCkocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCA+PiA4KTsKKwlieVRtcCA9ICh1OCkobGUxNl90b19jcHUocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCkgJiAweGZmKTsKIAlieVRtcCAmPSAweDg3OwogCU1JQ19IRFIxWzNdID0gYnlUbXAgfCAweDQwOwogCW1lbWNweSgmKE1JQ19IRFIxWzRdKSwgcE1BQ0hlYWRlci0+YWRkcjEsIEVUSF9BTEVOKTsKQEAgLTI3OSw3ICsyNzksNyBAQAogCiAJLyogTUlDX0hEUjIgKi8KIAltZW1jcHkoJihNSUNfSERSMlswXSksIHBNQUNIZWFkZXItPmFkZHIzLCBFVEhfQUxFTik7Ci0JYnlUbXAgPSAodTgpKHBNQUNIZWFkZXItPnNlcV9jdHJsICYgMHhmZik7CisJYnlUbXAgPSAodTgpKGxlMTZfdG9fY3B1KHBNQUNIZWFkZXItPnNlcV9jdHJsKSA+PiA4KTsKIAlNSUNfSERSMls2XSA9IGJ5VG1wICYgMHgwZjsKIAlNSUNfSERSMls3XSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmgKaW5kZXggYzMwMTdhNy4uZjg0M2U1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmgKQEAgLTM5LDEzICszOSw2IEBACiAgICAgUEhZX1RZUEVfMTFBCiB9IENBUkRfUEhZX1RZUEUsICpQQ0FSRF9QSFlfVFlQRTsKIAotdHlwZWRlZiBlbnVtIF9DQVJEX09QX01PREUgewotICAgIE9QX01PREVfSU5GUkFTVFJVQ1RVUkUgPSAwLAotICAgIE9QX01PREVfQURIT0MsCi0gICAgT1BfTU9ERV9BUCwKLSAgICBPUF9NT0RFX1VOS05PV04KLX0gQ0FSRF9PUF9NT0RFLCAqUENBUkRfT1BfTU9ERTsKLQogI2RlZmluZSBDQl9NQVhfQ0hBTk5FTF8yNEcgIDE0CiAjZGVmaW5lIENCX01BWF9DSEFOTkVMXzVHICAgICAgIDQyIC8qIGFkZCBjaGFubmVsOSg1MDQ1TUh6KSwgNDE9PT40MiAqLwogI2RlZmluZSBDQl9NQVhfQ0hBTk5FTCAgICAgIChDQl9NQVhfQ0hBTk5FTF8yNEcrQ0JfTUFYX0NIQU5ORUxfNUcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAppbmRleCAxZjQyMjU3Li5lMmFiZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKQEAgLTE1OCwxMCArMTU4LDEwIEBACiAvKgogICogRW51bSBvZiBjb250ZXh0IHR5cGVzIGZvciBTZW5kUGFja2V0CiAgKi8KLXR5cGVkZWYgZW51bSBfQ09OVEVYVF9UWVBFIHsKLSAgICBDT05URVhUX0RBVEFfUEFDS0VUID0gMSwKLSAgICBDT05URVhUX01HTVRfUEFDS0VUCi19IENPTlRFWFRfVFlQRTsKK2VudW0geworCUNPTlRFWFRfREFUQV9QQUNLRVQgPSAxLAorCUNPTlRFWFRfTUdNVF9QQUNLRVQKK307CiAKIC8qIFJDQiAoUmVjZWl2ZSBDb250cm9sIEJsb2NrKSAqLwogc3RydWN0IHZudF9yY2IgewpAQCAtMTgwLDkgKzE4MCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnBQYWNrZXQ7CiAJc3RydWN0IHVyYiAqcFVyYjsKIAl1bnNpZ25lZCBpbnQgdUJ1ZkxlbjsKLQlDT05URVhUX1RZUEUgVHlwZTsKLQlzdHJ1Y3QgZXRoaGRyIHNFdGhIZWFkZXI7Ci0Jdm9pZCAqTmV4dDsKKwl1OCB0eXBlOwogCWJvb2wgYkJvb2xJblVzZTsKIAl1bnNpZ25lZCBjaGFyIERhdGFbTUFYX1RPVEFMX1NJWkVfV0lUSF9BTExfSEVBREVSU107CiB9OwpAQCAtMjA2LDI5ICsyMDQsMTAgQEAKIC8qCiAgKiBTdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiBVU0IgaW50ZXJydXB0IHBhY2tldHMKICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIHVEYXRhTGVuOwotICAgIHU4ICogICAgICAgICAgIHBEYXRhQnVmOwotICAvKiBzdHJ1Y3QgdXJiICpwVXJiOyAqLwotICAgIGJvb2wgICAgICAgICAgICBiSW5Vc2U7Ci19IElOVF9CVUZGRVIsICpQSU5UX0JVRkZFUjsKLQotLyogMDoxMUEgMToxMUIgMjoxMUcgKi8KLXR5cGVkZWYgZW51bSBfVklBX0JCX1RZUEUKLXsKLSAgICBCQl9UWVBFXzExQSA9IDAsCi0gICAgQkJfVFlQRV8xMUIsCi0gICAgQkJfVFlQRV8xMUcKLX0gVklBX0JCX1RZUEUsICpQVklBX0JCX1RZUEU7Ci0KLS8qIDA6MTFhLCAxOjExYiwgMjoxMWdiIChvbmx5IENDSyBpbiBCYXNpY1JhdGUpLCAzOjExZ2EoT0ZETSBpbiBCYXNpY1JhdGUpICovCi10eXBlZGVmIGVudW0gX1ZJQV9QS1RfVFlQRQotewotICAgIFBLX1RZUEVfMTFBID0gMCwKLSAgICBQS19UWVBFXzExQiwKLSAgICBQS19UWVBFXzExR0IsCi0gICAgUEtfVFlQRV8xMUdBCi19IFZJQV9QS1RfVFlQRSwgKlBWSUFfUEtUX1RZUEU7CitzdHJ1Y3Qgdm50X2ludGVycnVwdF9idWZmZXIgeworCXU4ICpkYXRhX2J1ZjsKKwlib29sIGluX3VzZTsKK307CiAKIC8qKysgTkRJUyByZWxhdGVkICovCiAKQEAgLTI5NywxNiArMjc2LDYgQEAKICAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFtNQVhfUE1LSURMSVNUXTsKIH0gU1BNS0lEQ2FuZGlkYXRlRXZlbnQsICpQU1BNS0lEQ2FuZGlkYXRlRXZlbnQ7CiAKLS8qKysgODAyLjExaCByZWxhdGVkICovCi0jZGVmaW5lIE1BWF9RVUlFVF9DT1VOVCAgICAgOAotCi10eXBlZGVmIHN0cnVjdCB0YWdTUXVpZXRDb250cm9sIHsKLSAgICBib29sICAgICAgICBiRW5hYmxlOwotICAgIHUzMiAgICAgICBkd1N0YXJ0VGltZTsKLSAgICB1OCAgICAgICAgYnlQZXJpb2Q7Ci0gICAgdTE2ICAgICAgICB3RHVyYXRpb247Ci19IFNRdWlldENvbnRyb2wsICpQU1F1aWV0Q29udHJvbDsKLQogLyogVGhlIHJlY2VpdmUgZHVwbGljYXRlIGRldGVjdGlvbiBjYWNoZSBlbnRyeSAqLwogdHlwZWRlZiBzdHJ1Y3QgdGFnU0NhY2hlRW50cnl7CiAgICAgdTE2ICAgICAgICB3Rm1TZXF1ZW5jZTsKQEAgLTM4Niw4ICszNTUsNiBAQAogCiAJT1BUSU9OUyBzT3B0czsKIAotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBDbWRXb3JrSXRlbTsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgRXZlbnRXb3JrSXRlbTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVhZF93b3JrX2l0ZW07CiAJc3RydWN0IHdvcmtfc3RydWN0IHJ4X21uZ193b3JrX2l0ZW07CiAKQEAgLTQzNywyOSArNDA0LDExIEBACiAJc3RydWN0IHZudF90eF9wa3RfaW5mbyBwa3RfaW5mb1sxNl07CiAKIAkvKiBWYXJpYWJsZXMgdG8gdHJhY2sgcmVzb3VyY2VzIGZvciB0aGUgSW50ZXJydXB0IEluIFBpcGUgKi8KLQlJTlRfQlVGRkVSIGludEJ1ZjsKLQlpbnQgZktpbGxFdmVudFBvbGxpbmdUaHJlYWQ7Ci0JaW50IGJFdmVudEF2YWlsYWJsZTsKKwlzdHJ1Y3Qgdm50X2ludGVycnVwdF9idWZmZXIgaW50X2J1ZjsKIAogCS8qIGRlZmF1bHQgY29uZmlnIGZyb20gZmlsZSBieSB1c2VyIHNldHRpbmcgKi8KIAlERUZBVUxUX0NPTkZJRyBjb25maWdfZmlsZTsKIAotCS8qIFN0YXRpc3RpYyBmb3IgVVNCICovCi0JdW5zaWduZWQgbG9uZyB1bEJ1bGtJblBvc3RlZDsKLQl1bnNpZ25lZCBsb25nIHVsQnVsa0luRXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtJbkNvbnRDUkNFcnJvcjsKLQl1bnNpZ25lZCBsb25nIHVsQnVsa0luQnl0ZXNSZWFkOwotCi0JdW5zaWduZWQgbG9uZyB1bEJ1bGtPdXRQb3N0ZWQ7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtPdXRFcnJvcjsKLQl1bnNpZ25lZCBsb25nIHVsQnVsa091dENvbnRDUkNFcnJvcjsKLQl1bnNpZ25lZCBsb25nIHVsQnVsa091dEJ5dGVzV3JpdGU7Ci0KLQl1bnNpZ25lZCBsb25nIHVsSW50SW5Qb3N0ZWQ7Ci0JdW5zaWduZWQgbG9uZyB1bEludEluRXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEludEluQ29udENSQ0Vycm9yOwotCXVuc2lnbmVkIGxvbmcgdWxJbnRJbkJ5dGVzUmVhZDsKLQogCS8qIFZlcnNpb24gY29udHJvbCAqLwogCXUxNiB3RmlybXdhcmVWZXJzaW9uOwogCXU4IGJ5TG9jYWxJRDsKQEAgLTQ4MCwxMSArNDI5LDYgQEAKIAlpbnQgYkV4aXN0U1dOZXRBZGRyOwogCiAJLyogTWFpbnRhaW4gc3RhdGlzdGljYWwgZGVidWcgaW5mby4gKi8KLQl1bnNpZ25lZCBsb25nIHBhY2tldHNSZWNlaXZlZDsKLQl1bnNpZ25lZCBsb25nIHBhY2tldHNSZWNlaXZlZERyb3BwZWQ7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzUmVjZWl2ZWRPdmVyZmxvdzsKLQl1bnNpZ25lZCBsb25nIHBhY2tldHNTZW50OwotCXVuc2lnbmVkIGxvbmcgcGFja2V0c1NlbnREcm9wcGVkOwogCXVuc2lnbmVkIGxvbmcgU2VuZENvbnRleHRzSW5Vc2U7CiAJdW5zaWduZWQgbG9uZyBSY3ZCdWZmZXJzSW5Vc2U7CiAKQEAgLTU0OSw4ICs0OTMsOCBAQAogCXU4ICBieUNXTWF4TWluOwogCiAJLyogUmF0ZSAqLwotCVZJQV9CQl9UWVBFIGJ5QkJUeXBlOyAvKiAwOiAxMUEsIDE6MTFCLCAyOjExRyAqLwotCVZJQV9QS1RfVFlQRSBieVBhY2tldFR5cGU7IC8qIDA6MTFhIDE6MTFiIDI6MTFnYiAzOjExZ2EgKi8KKwl1OCBieUJCVHlwZTsgLyogMDogMTFBLCAxOjExQiwgMjoxMUcgKi8KKwl1OCBieVBhY2tldFR5cGU7IC8qIDA6MTFhIDE6MTFiIDI6MTFnYiAzOjExZ2EgKi8KIAl1MTYgd0Jhc2ljUmF0ZTsKIAl1OCBieUFDS1JhdGU7CiAJdTggYnlUb3BPRkRNQmFzaWNSYXRlOwpAQCAtNTg4LDcgKzUzMiw5IEBACiAJdTE2IHdGcmFnbWVudGF0aW9uVGhyZXNob2xkOwogCXU4IGJ5U2hvcnRSZXRyeUxpbWl0OwogCXU4IGJ5TG9uZ1JldHJ5TGltaXQ7Ci0JQ0FSRF9PUF9NT0RFIGVPUE1vZGU7CisKKwllbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGU7CisKIAlpbnQgYkJTU0lERmlsdGVyOwogCXUxNiB3TWF4VHJhbnNtaXRNU0RVTGlmZXRpbWU7CiAJdTggYWJ5QlNTSURbRVRIX0FMRU5dOwpAQCAtODA3LDUgKzc1Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZk1QX0RJU0NPTk5FQ1RFRCB8IGZNUF9SRVNFVF9JTl9QUk9HUkVTUyB8IGZNUF9IQUxUX0lOX1BST0dSRVNTIHwgZk1QX0lOSVRfSU5fUFJPR1JFU1MgfCBmTVBfU1VSUFJJU0VfUkVNT1ZFRCkpID09IDApCiAKIGludCBkZXZpY2VfYWxsb2NfZnJhZ19idWYoc3RydWN0IHZudF9wcml2YXRlICosIFBTRGVGcmFnQ29udHJvbEJsb2NrIHBEZUYpOwordm9pZCB2bnRfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3Qgdm50X3ByaXZhdGUgKik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKaW5kZXggZWNhMDRjMC4uNGNjYWE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCkBAIC02MjcsNyArNjI3LDcgQEAKIAogICAgIC8vIE5vdyBpdCBvbmx5IHN1cHBvcnRzIDgwMi4xMWcgSW5mcmFzdHJ1Y3R1cmUgTW9kZSwgYW5kIHN1cHBvcnQgcmF0ZSBtdXN0IHVwIHRvIDU0IE1icHMKICAgICBpZiAocERldmljZS0+YkRpdmVyc2l0eUVuYWJsZSAmJiAoRnJhbWVTaXplPjUwKSAmJgotICAgICAgIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfSU5GUkFTVFJVQ1RVUkUpICYmCisJcERldmljZS0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCiAgICAgICAgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSkgewogICAgICAgICBCQnZBbnRlbm5hRGl2ZXJzaXR5KHBEZXZpY2UsIHNfYnlHZXRSYXRlSWR4KCpwYnlSeFJhdGUpLCAwKTsKICAgICB9CkBAIC0xMjI3LDE0ICsxMjI3LDEzIEBACiAgICAgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKCh1OCAqKShza2ItPmRhdGErY2JIZWFkZXJPZmZzZXQpKSkgewogICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJQU0VuYWJsZSkgewogCi0gICAgICAgICAgIHNrYmNweSA9IGRldl9hbGxvY19za2IoKGludClwRGV2aWNlLT5yeF9idWZfc3opOworCSAgICBza2JjcHkgPSBuZXRkZXZfYWxsb2Nfc2tiKHBEZXZpY2UtPmRldiwgcERldmljZS0+cnhfYnVmX3N6KTsKIAogICAgICAgICAvLyBpZiBhbnkgbm9kZSBpbiBQUyBtb2RlLCBidWZmZXIgcGFja2V0IHVudGlsIERUSU0uCiAgICAgICAgICAgIGlmIChza2JjcHkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfTk9USUNFLCBLRVJOX0lORk8gInJlbGF5IG11bHRpY2FzdCBubyBza2IgYXZhaWxhYmxlIFxuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICBza2JjcHktPmRldiA9IHBEZXZpY2UtPmRldjsKICAgICAgICAgICAgICAgIHNrYmNweS0+bGVuID0gRnJhbWVTaXplOwogICAgICAgICAgICAgICAgbWVtY3B5KHNrYmNweS0+ZGF0YSwgc2tiLT5kYXRhK2NiSGVhZGVyT2Zmc2V0LCBGcmFtZVNpemUpOwogICAgICAgICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdLnNUeFBTUXVldWUpLCBza2JjcHkpOwpAQCAtMTI5NSw2MyArMTI5NCw2NiBAQAogCiB2b2lkIFJYdldvcmtJdGVtKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UgPQorCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm50X3ByaXZhdGUsIHJlYWRfd29ya19pdGVtKTsKLQlpbnQgbnRTdGF0dXM7Ci0Jc3RydWN0IHZudF9yY2IgKnBSQ0IgPSBOVUxMOworCWludCBzdGF0dXM7CisJc3RydWN0IHZudF9yY2IgKnJjYiA9IE5VTEw7CiAKLQlpZiAocERldmljZS0+RmxhZ3MgJiBmTVBfRElTQ09OTkVDVEVEKQorCWlmIChwcml2LT5GbGFncyAmIGZNUF9ESVNDT05ORUNURUQpCiAJCXJldHVybjsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5SeCBQb2xsaW5nIFRocmVhZFxuIik7Ci0gICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPlJ4IFBvbGxpbmcgVGhyZWFkXG4iKTsKIAotICAgIHdoaWxlICgocERldmljZS0+RmxhZ3MgJiBmTVBfUE9TVF9SRUFEUykgJiYKLSAgICAgICAgICAgIE1QX0lTX1JFQURZKHBEZXZpY2UpICYmCi0gICAgICAgICAgICAocERldmljZS0+TnVtUmVjdkZyZWVMaXN0ICE9IDApICkgewotICAgICAgICBwUkNCID0gcERldmljZS0+Rmlyc3RSZWN2RnJlZUxpc3Q7Ci0gICAgICAgIHBEZXZpY2UtPk51bVJlY3ZGcmVlTGlzdC0tOwotICAgICAgICBEZXF1ZXVlUkNCKHBEZXZpY2UtPkZpcnN0UmVjdkZyZWVMaXN0LCBwRGV2aWNlLT5MYXN0UmVjdkZyZWVMaXN0KTsKLSAgICAgICAgbnRTdGF0dXMgPSBQSVBFbnNCdWxrSW5Vc2JSZWFkKHBEZXZpY2UsIHBSQ0IpOwotICAgIH0KLSAgICBwRGV2aWNlLT5iSXNSeFdvcmtJdGVtUXVldWVkID0gZmFsc2U7Ci0gICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAotfQorCXdoaWxlICgocHJpdi0+RmxhZ3MgJiBmTVBfUE9TVF9SRUFEUykgJiYgTVBfSVNfUkVBRFkocHJpdikgJiYKKwkJCShwcml2LT5OdW1SZWN2RnJlZUxpc3QgIT0gMCkpIHsKKwkJcmNiID0gcHJpdi0+Rmlyc3RSZWN2RnJlZUxpc3Q7CiAKLXZvaWQgUlh2RnJlZVJDQihzdHJ1Y3Qgdm50X3JjYiAqcFJDQiwgaW50IGJSZUFsbG9jU2tiKQotewotCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSA9IHBSQ0ItPnBEZXZpY2U7CisJCXByaXYtPk51bVJlY3ZGcmVlTGlzdC0tOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPlJYdkZyZWVSQ0JcbiIpOworCQlEZXF1ZXVlUkNCKHByaXYtPkZpcnN0UmVjdkZyZWVMaXN0LCBwcml2LT5MYXN0UmVjdkZyZWVMaXN0KTsKIAotCWlmIChiUmVBbGxvY1NrYiA9PSBmYWxzZSkgewotCQlrZnJlZV9za2IocFJDQi0+c2tiKTsKLQkJYlJlQWxsb2NTa2IgPSB0cnVlOworCQlzdGF0dXMgPSBQSVBFbnNCdWxrSW5Vc2JSZWFkKHByaXYsIHJjYik7CiAJfQogCi0gICAgaWYgKGJSZUFsbG9jU2tiID09IHRydWUpIHsKLSAgICAgICAgcFJDQi0+c2tiID0gZGV2X2FsbG9jX3NrYigoaW50KXBEZXZpY2UtPnJ4X2J1Zl9zeik7Ci0gICAgICAgIC8vIHRvZG8gZXJyb3IgaGFuZGxpbmcKLSAgICAgICAgaWYgKHBSQ0ItPnNrYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiIEZhaWxlZCB0byByZS1hbGxvYyByeCBza2JcbiIpOwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICBwUkNCLT5za2ItPmRldiA9IHBEZXZpY2UtPmRldjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLwotICAgIC8vIEluc2VydCB0aGUgUkNCIGJhY2sgaW4gdGhlIFJlY3YgZnJlZSBsaXN0Ci0gICAgLy8KLSAgICBFbnF1ZXVlUkNCKHBEZXZpY2UtPkZpcnN0UmVjdkZyZWVMaXN0LCBwRGV2aWNlLT5MYXN0UmVjdkZyZWVMaXN0LCBwUkNCKTsKLSAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QrKzsKKwlwcml2LT5iSXNSeFdvcmtJdGVtUXVldWVkID0gZmFsc2U7CiAKLSAgICBpZiAoKHBEZXZpY2UtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmIE1QX0lTX1JFQURZKHBEZXZpY2UpICYmCi0gICAgICAgIChwRGV2aWNlLT5iSXNSeFdvcmtJdGVtUXVldWVkID09IGZhbHNlKSApIHsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworfQogCi0gICAgICAgIHBEZXZpY2UtPmJJc1J4V29ya0l0ZW1RdWV1ZWQgPSB0cnVlOwotCXNjaGVkdWxlX3dvcmsoJnBEZXZpY2UtPnJlYWRfd29ya19pdGVtKTsKLSAgICB9Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyI8LS0tLVJYRnJlZVJDQiAlZCAlZFxuIixwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QsIHBEZXZpY2UtPk51bVJlY3ZNbmdMaXN0KTsKK3ZvaWQgUlh2RnJlZVJDQihzdHJ1Y3Qgdm50X3JjYiAqcmNiLCBpbnQgcmVfYWxsb2Nfc2tiKQoreworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IHJjYi0+cERldmljZTsKKworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5SWHZGcmVlUkNCXG4iKTsKKworCWlmIChyZV9hbGxvY19za2IgPT0gZmFsc2UpIHsKKwkJa2ZyZWVfc2tiKHJjYi0+c2tiKTsKKwkJcmVfYWxsb2Nfc2tiID0gdHJ1ZTsKKwl9CisKKwlpZiAocmVfYWxsb2Nfc2tiID09IHRydWUpIHsKKwkJcmNiLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHByaXYtPmRldiwgcHJpdi0+cnhfYnVmX3N6KTsKKwkJLyogVE9ETyBlcnJvciBoYW5kbGluZyAqLworCQlpZiAoIXJjYi0+c2tiKSB7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCisJCQkJIiBGYWlsZWQgdG8gcmUtYWxsb2Mgcnggc2tiXG4iKTsKKwkJfQorCX0KKworCS8qIEluc2VydCB0aGUgUkNCIGJhY2sgaW4gdGhlIFJlY3YgZnJlZSBsaXN0ICovCisJRW5xdWV1ZVJDQihwcml2LT5GaXJzdFJlY3ZGcmVlTGlzdCwgcHJpdi0+TGFzdFJlY3ZGcmVlTGlzdCwgcmNiKTsKKwlwcml2LT5OdW1SZWN2RnJlZUxpc3QrKzsKKworCWlmICgocHJpdi0+RmxhZ3MgJiBmTVBfUE9TVF9SRUFEUykgJiYgTVBfSVNfUkVBRFkocHJpdikgJiYKKwkJCShwcml2LT5iSXNSeFdvcmtJdGVtUXVldWVkID09IGZhbHNlKSkgeworCQlwcml2LT5iSXNSeFdvcmtJdGVtUXVldWVkID0gdHJ1ZTsKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVhZF93b3JrX2l0ZW0pOworCX0KKworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iPC0tLS1SWEZyZWVSQ0IgJWQgJWRcbiIsCisJCQlwcml2LT5OdW1SZWN2RnJlZUxpc3QsIHByaXYtPk51bVJlY3ZNbmdMaXN0KTsKIH0KIAogdm9pZCBSWHZNbmdXb3JrSXRlbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuYwppbmRleCBlMGU5Mzg2Li5jY2E1NmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmMKQEAgLTcwLDExOSArNzAsMTE3IEBACiAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPkludGVycnVwdCBQb2xsaW5nIFRocmVhZFxuIik7CiAKIAlzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQlpZiAocERldmljZS0+ZktpbGxFdmVudFBvbGxpbmdUaHJlYWQgIT0gdHJ1ZSkKLQkJbnRTdGF0dXMgPSBQSVBFbnNJbnRlcnJ1cHRSZWFkKHBEZXZpY2UpOworCisJbnRTdGF0dXMgPSBQSVBFbnNJbnRlcnJ1cHRSZWFkKHBEZXZpY2UpOworCiAJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKIH0KIAotdm9pZCBJTlRuc1Byb2Nlc3NEYXRhKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKK3ZvaWQgSU5UbnNQcm9jZXNzRGF0YShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCiB7Ci0JUFNJTlREYXRhIHBJTlREYXRhOwotCXN0cnVjdCB2bnRfbWFuYWdlciAqcE1nbXQgPSAmcERldmljZS0+dm50X21nbXQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9ICZwRGV2aWNlLT5zdGF0czsKKwlzdHJ1Y3Qgdm50X2ludGVycnVwdF9kYXRhICppbnRfZGF0YTsKKwlzdHJ1Y3Qgdm50X21hbmFnZXIgKm1nbXQgPSAmcHJpdi0+dm50X21nbXQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwogCiAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNJbnRlcnJ1cHRQcm9jZXNzRGF0YVxuIik7CiAKLQlwSU5URGF0YSA9IChQU0lOVERhdGEpIHBEZXZpY2UtPmludEJ1Zi5wRGF0YUJ1ZjsKLQlpZiAocElOVERhdGEtPmJ5VFNSMCAmIFRTUl9WQUxJRCkgewotCQlpZiAocElOVERhdGEtPmJ5VFNSMCAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKLQkJCXBEZXZpY2UtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKKwlpbnRfZGF0YSA9IChzdHJ1Y3Qgdm50X2ludGVycnVwdF9kYXRhICopcHJpdi0+aW50X2J1Zi5kYXRhX2J1ZjsKKworCWlmIChpbnRfZGF0YS0+dHNyMCAmIFRTUl9WQUxJRCkgeworCQlpZiAoaW50X2RhdGEtPnRzcjAgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCisJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CiAJCWVsc2UKLQkJCXBTdGF0cy0+dHhfcGFja2V0cysrOworCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAotCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwRGV2aWNlLAotCQkJCQlwSU5URGF0YS0+YnlUU1IwLAotCQkJCQlwSU5URGF0YS0+YnlQa3QwKTsKLQkJLypEQkdfUFJOX0dSUDAxKCgiVFNSMCAlMDJ4XG4iLCBwSU5URGF0YS0+YnlUU1IwKSk7Ki8KKwkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocHJpdiwKKwkJCQkJaW50X2RhdGEtPnRzcjAsCisJCQkJCWludF9kYXRhLT5wa3QwKTsKIAl9Ci0JaWYgKHBJTlREYXRhLT5ieVRTUjEgJiBUU1JfVkFMSUQpIHsKLQkJaWYgKHBJTlREYXRhLT5ieVRTUjEgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCi0JCQlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CisKKwlpZiAoaW50X2RhdGEtPnRzcjEgJiBUU1JfVkFMSUQpIHsKKwkJaWYgKGludF9kYXRhLT50c3IxICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQorCQkJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOwogCQllbHNlCi0JCQlwU3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAKIAotCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwRGV2aWNlLAotCQkJCQlwSU5URGF0YS0+YnlUU1IxLAotCQkJCQlwSU5URGF0YS0+YnlQa3QxKTsKLQkJLypEQkdfUFJOX0dSUDAxKCgiVFNSMSAlMDJ4XG4iLCBwSU5URGF0YS0+YnlUU1IxKSk7Ki8KKwkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocHJpdiwKKwkJCQkJaW50X2RhdGEtPnRzcjEsCisJCQkJCWludF9kYXRhLT5wa3QxKTsKIAl9Ci0JaWYgKHBJTlREYXRhLT5ieVRTUjIgJiBUU1JfVkFMSUQpIHsKLQkJaWYgKHBJTlREYXRhLT5ieVRTUjIgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCi0JCQlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CisKKwlpZiAoaW50X2RhdGEtPnRzcjIgJiBUU1JfVkFMSUQpIHsKKwkJaWYgKGludF9kYXRhLT50c3IyICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQorCQkJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOwogCQllbHNlCi0JCQlwU3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAKLQkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocERldmljZSwKLQkJCQkJcElOVERhdGEtPmJ5VFNSMiwKLQkJCQkJcElOVERhdGEtPmJ5UGt0Mik7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIlRTUjIgJTAyeFxuIiwgcElOVERhdGEtPmJ5VFNSMikpOyovCisJCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHByaXYsCisJCQkJCWludF9kYXRhLT50c3IyLAorCQkJCQlpbnRfZGF0YS0+cGt0Mik7CiAJfQotCWlmIChwSU5URGF0YS0+YnlUU1IzICYgVFNSX1ZBTElEKSB7Ci0JCWlmIChwSU5URGF0YS0+YnlUU1IzICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQotCQkJcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOworCisJaWYgKGludF9kYXRhLT50c3IzICYgVFNSX1ZBTElEKSB7CisJCWlmIChpbnRfZGF0YS0+dHNyMyAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKKwkJCXByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKIAkJZWxzZQotCQkJcFN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCi0JCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHBEZXZpY2UsCi0JCQkJCXBJTlREYXRhLT5ieVRTUjMsCi0JCQkJCXBJTlREYXRhLT5ieVBrdDMpOwotCQkvKkRCR19QUk5fR1JQMDEoKCJUU1IzICUwMnhcbiIsIHBJTlREYXRhLT5ieVRTUjMpKTsqLworCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwcml2LAorCQkJCQlpbnRfZGF0YS0+dHNyMywKKwkJCQkJaW50X2RhdGEtPnBrdDMpOwogCX0KLQlpZiAocElOVERhdGEtPmJ5SVNSMCAhPSAwKSB7Ci0JCWlmIChwSU5URGF0YS0+YnlJU1IwICYgSVNSX0JOVFgpIHsKLQkJCWlmIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQVApIHsKLQkJCQlpZiAocE1nbXQtPmJ5RFRJTUNvdW50ID4gMCkgewotCQkJCQlwTWdtdC0+YnlEVElNQ291bnQtLTsKLQkJCQkJcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUnhQU1BvbGwgPQorCisJaWYgKGludF9kYXRhLT5pc3IwICE9IDApIHsKKwkJaWYgKGludF9kYXRhLT5pc3IwICYgSVNSX0JOVFgpIHsKKwkJCWlmIChwcml2LT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJCQkJaWYgKG1nbXQtPmJ5RFRJTUNvdW50ID4gMCkgeworCQkJCQltZ210LT5ieURUSU1Db3VudC0tOworCQkJCQltZ210LT5zTm9kZURCVGFibGVbMF0uYlJ4UFNQb2xsID0KIAkJCQkJCWZhbHNlOwotCQkJCX0gZWxzZSBpZiAocE1nbXQtPmJ5RFRJTUNvdW50ID09IDApIHsKKwkJCQl9IGVsc2UgaWYgKG1nbXQtPmJ5RFRJTUNvdW50ID09IDApIHsKIAkJCQkJLyogY2hlY2sgaWYgbXVsdGljYXN0IHR4IGJ1ZmZlcmluZyAqLwotCQkJCQlwTWdtdC0+YnlEVElNQ291bnQgPQotCQkJCQkJcE1nbXQtPmJ5RFRJTVBlcmlvZC0xOwotCQkJCQlwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJSeFBTUG9sbCA9IHRydWU7Ci0JCQkJCWlmIChwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJQU0VuYWJsZSkKLQkJCQkJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwKKwkJCQkJbWdtdC0+YnlEVElNQ291bnQgPQorCQkJCQkJbWdtdC0+YnlEVElNUGVyaW9kLTE7CisJCQkJCW1nbXQtPnNOb2RlREJUYWJsZVswXS5iUnhQU1BvbGwgPSB0cnVlOworCQkJCQlpZiAobWdtdC0+c05vZGVEQlRhYmxlWzBdLmJQU0VuYWJsZSkKKwkJCQkJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcHJpdiwKIAkJCQkJCQkJIFdMQU5fQ01EX1JYX1BTUE9MTCwKIAkJCQkJCQkJIE5VTEwpOwogCQkJCX0KLQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisJCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwcml2LAogCQkJCQkJV0xBTl9DTURfQkVDT05fU0VORCwKIAkJCQkJCU5VTEwpOwotCQkJfSAvKiBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSAqLwotCQlwRGV2aWNlLT5iQmVhY29uU2VudCA9IHRydWU7CisJCQl9CisJCQlwcml2LT5iQmVhY29uU2VudCA9IHRydWU7CiAJCX0gZWxzZSB7Ci0JCQlwRGV2aWNlLT5iQmVhY29uU2VudCA9IGZhbHNlOworCQkJcHJpdi0+YkJlYWNvblNlbnQgPSBmYWxzZTsKIAkJfQotCQlpZiAocElOVERhdGEtPmJ5SVNSMCAmIElTUl9UQlRUKSB7Ci0JCQlpZiAocERldmljZS0+YkVuYWJsZVBTTW9kZSkKLQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisKKwkJaWYgKGludF9kYXRhLT5pc3IwICYgSVNSX1RCVFQpIHsKKwkJCWlmIChwcml2LT5iRW5hYmxlUFNNb2RlKQorCQkJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcHJpdiwKIAkJCQkJCVdMQU5fQ01EX1RCVFRfV0FLRVVQLAogCQkJCQkJTlVMTCk7Ci0JCQlpZiAocERldmljZS0+YkNoYW5uZWxTd2l0Y2gpIHsKLQkJCQlwRGV2aWNlLT5ieUNoYW5uZWxTd2l0Y2hDb3VudC0tOwotCQkJCWlmIChwRGV2aWNlLT5ieUNoYW5uZWxTd2l0Y2hDb3VudCA9PSAwKQotCQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisJCQlpZiAocHJpdi0+YkNoYW5uZWxTd2l0Y2gpIHsKKwkJCQlwcml2LT5ieUNoYW5uZWxTd2l0Y2hDb3VudC0tOworCQkJCWlmIChwcml2LT5ieUNoYW5uZWxTd2l0Y2hDb3VudCA9PSAwKQorCQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHByaXYsCiAJCQkJCQkJV0xBTl9DTURfMTFIX0NIU1csCiAJCQkJCQkJTlVMTCk7CiAJCQl9CiAJCX0KLQkJcERldmljZS0+cXdDdXJyVFNGID0gY3B1X3RvX2xlNjQocElOVERhdGEtPnF3VFNGKTsKLQkJLypEQkdfUFJOX0dSUDAxKCgiSVNSMCA9ICUwMnggLAotCQkgIExvVHNmID0gICUwOHgsCi0JCSAgSGlUc2YgPSAgJTA4eFxuIiwKLQkJICBwSU5URGF0YS0+YnlJU1IwLAotCQkgIHBJTlREYXRhLT5kd0xvVFNGLAotCQkgIHBJTlREYXRhLT5kd0hpVFNGKSk7ICovCisJCXByaXYtPnF3Q3VyclRTRiA9IGxlNjRfdG9fY3B1KGludF9kYXRhLT50c2YpOwogCX0KLQlpZiAocElOVERhdGEtPmJ5SVNSMSAhPSAwKQotCQlpZiAocElOVERhdGEtPmJ5SVNSMSAmIElTUl9HUElPMykKLQkJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwKKworCWlmIChpbnRfZGF0YS0+aXNyMSAhPSAwKQorCQlpZiAoaW50X2RhdGEtPmlzcjEgJiBJU1JfR1BJTzMpCisJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHByaXYsCiAJCQkJCVdMQU5fQ01EX1JBRElPLAogCQkJCQlOVUxMKTsKLQlwRGV2aWNlLT5pbnRCdWYudURhdGFMZW4gPSAwOwotCXBEZXZpY2UtPmludEJ1Zi5iSW5Vc2UgPSBmYWxzZTsKIAotCXBTdGF0cy0+dHhfZXJyb3JzID0gcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllczsKLQlwU3RhdHMtPnR4X2Ryb3BwZWQgPSBwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzOworCXByaXYtPmludF9idWYuaW5fdXNlID0gZmFsc2U7CisKKwlzdGF0cy0+dHhfZXJyb3JzID0gcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllczsKKwlzdGF0cy0+dHhfZHJvcHBlZCA9IHByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuaAppbmRleCA4ZTZlMjE3Li4wOGRiODY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmgKQEAgLTMyLDI5ICszMiwyOCBAQAogCiAjaW5jbHVkZSAiZGV2aWNlLmgiCiAKLXR5cGVkZWYgc3RydWN0IHRhZ1NJTlREYXRhIHsKLQl1OCBieVRTUjA7Ci0JdTggYnlQa3QwOwotCXUxNiB3VGltZTA7Ci0JdTggYnlUU1IxOwotCXU4IGJ5UGt0MTsKLQl1MTYgd1RpbWUxOwotCXU4IGJ5VFNSMjsKLQl1OCBieVBrdDI7Ci0JdTE2IHdUaW1lMjsKLQl1OCBieVRTUjM7Ci0JdTggYnlQa3QzOwotCXUxNiB3VGltZTM7Ci0JdTY0IHF3VFNGOwotCXU4IGJ5SVNSMDsKLQl1OCBieUlTUjE7Ci0JdTggYnlSVFNTdWNjZXNzOwotCXU4IGJ5UlRTRmFpbDsKLQl1OCBieUFDS0ZhaWw7Ci0JdTggYnlGQ1NFcnI7Ci0JdTggYWJ5U1dbMl07Ci19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKLVNJTlREYXRhLCAqUFNJTlREYXRhOworc3RydWN0IHZudF9pbnRlcnJ1cHRfZGF0YSB7CisJdTggdHNyMDsKKwl1OCBwa3QwOworCXUxNiB0aW1lMDsKKwl1OCB0c3IxOworCXU4IHBrdDE7CisJdTE2IHRpbWUxOworCXU4IHRzcjI7CisJdTggcGt0MjsKKwl1MTYgdGltZTI7CisJdTggdHNyMzsKKwl1OCBwa3QzOworCXUxNiB0aW1lMzsKKwlfX2xlNjQgdHNmOworCXU4IGlzcjA7CisJdTggaXNyMTsKKwl1OCBydHNfc3VjY2VzczsKKwl1OCBydHNfZmFpbDsKKwl1OCBhY2tfZmFpbDsKKwl1OCBmY3NfZXJyOworCXU4IHN3WzJdOworfSBfX3BhY2tlZDsKIAogdm9pZCBJTlR2V29ya0l0ZW0oc3RydWN0IHZudF9wcml2YXRlICopOwogdm9pZCBJTlRuc1Byb2Nlc3NEYXRhKHN0cnVjdCB2bnRfcHJpdmF0ZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwppbmRleCAzYTY4ZGZhLi5jZjRjMDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAid3BhY3RsLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogI2luY2x1ZGUgInJuZGlzLmgiCisjaW5jbHVkZSAiYmFzZWJhbmQuaCIKIAogc3RhdGljIGNvbnN0IGxvbmcgZnJlcXVlbmN5X2xpc3RbXSA9IHsKIAkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLCAyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0LApAQCAtNTcsNyArNTgsNyBAQAogCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSA9IG5ldGRldl9wcml2KGRldik7CiAJbG9uZyBsZEJtOwogCi0JcERldmljZS0+d3N0YXRzLnN0YXR1cyA9IHBEZXZpY2UtPmVPUE1vZGU7CisJcERldmljZS0+d3N0YXRzLnN0YXR1cyA9IHBEZXZpY2UtPm9wX21vZGU7CiAJUkZ2UlNTSVRvZEJtKHBEZXZpY2UsICh1OCkocERldmljZS0+dUN1cnJSU1NJKSwgJmxkQm0pOwogCXBEZXZpY2UtPndzdGF0cy5xdWFsLmxldmVsID0gbGRCbTsKIAlwRGV2aWNlLT53c3RhdHMucXVhbC5ub2lzZSA9IDA7CkBAIC03MjQsMTAgKzcyNSwxMCBAQAogCWlmICghd3JxLT5wb2ludGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogSVdfTUFYX0FQLCBHRlBfS0VSTkVMKTsKKwlzb2NrID0ga2NhbGxvYyhJV19NQVhfQVAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc29jayA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlxdWFsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX0FQLCBHRlBfS0VSTkVMKTsKKwlxdWFsID0ga2NhbGxvYyhJV19NQVhfQVAsIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSksIEdGUF9LRVJORUwpOwogCWlmIChxdWFsID09IE5VTEwpIHsKIAkJa2ZyZWUoc29jayk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTM5NCw3ICsxMzk1LDggQEAKIAlpZiAocE1nbXQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoKHdycS0+ZGlzYWJsZWQgPSAobW9kZSA9PSBXTUFDX1BPV0VSX0NBTSkpKQorCXdycS0+ZGlzYWJsZWQgPSAobW9kZSA9PSBXTUFDX1BPV0VSX0NBTSk7CisJaWYgKHdycS0+ZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCiAJaWYgKCh3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMKaW5kZXggNTQ0MTRlZDI3Li4zY2UxOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMKQEAgLTQ3LDI1ICs0NywxOSBAQAogICoKICAqIFBhcmFtZXRlcnM6CiAgKiAgSW46Ci0gKiAgICAgIHVCeXRlaWR4ICAgIC0gSW5kZXggb2YgTWFzawotICogICAgICBieURhdGEgICAgICAtIE1hc2sgVmFsdWUgdG8gd3JpdGUKKyAqCW1jX2ZpbHRlciAobWFjIGZpbHRlcikKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwgdTMyIHVCeXRlSWR4LCB1OCBieURhdGEpCit2b2lkIE1BQ3ZXcml0ZU11bHRpQWRkcihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU2NCBtY19maWx0ZXIpCiB7Ci0JdTggYnlEYXRhMTsKKwlfX2xlNjQgbGVfbWMgPSBjcHVfdG9fbGU2NChtY19maWx0ZXIpOwogCi0gICAgYnlEYXRhMSA9IGJ5RGF0YTsKLSAgICBDT05UUk9MbnNSZXF1ZXN0T3V0KHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1RZUEVfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAodTE2KSAoTUFDX1JFR19NQVIwICsgdUJ5dGVJZHgpLAotICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmYnlEYXRhMSk7CisJQ09OVFJPTG5zUmVxdWVzdE91dChwRGV2aWNlLCBNRVNTQUdFX1RZUEVfV1JJVEUsIE1BQ19SRUdfTUFSMCwKKwkJTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgc2l6ZW9mKGxlX21jKSwgKHU4ICopJmxlX21jKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oCmluZGV4IDBkYjFiZTUuLjQwNTNlNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuaApAQCAtNDAzLDcgKzQwMyw3IEBACiAjZGVmaW5lIE1BQ19SRVZJU0lPTl9BMCAgICAgMHgwMAogI2RlZmluZSBNQUNfUkVWSVNJT05fQTEgICAgIDB4MDEKIAotdm9pZCBNQUN2V3JpdGVNdWx0aUFkZHIoc3RydWN0IHZudF9wcml2YXRlICosIHUzMiwgdTgpOwordm9pZCBNQUN2V3JpdGVNdWx0aUFkZHIoc3RydWN0IHZudF9wcml2YXRlICosIHU2NCk7CiB2b2lkIE1BQ2JTaHV0ZG93bihzdHJ1Y3Qgdm50X3ByaXZhdGUgKik7CiB2b2lkIE1BQ3ZTZXRCQlR5cGUoc3RydWN0IHZudF9wcml2YXRlICosIHU4KTsKIHZvaWQgTUFDdkRpc2FibGVLZXlFbnRyeShzdHJ1Y3Qgdm50X3ByaXZhdGUgKiwgdTMyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwppbmRleCA1OGVkY2FlLi4zYzkzMjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCkBAIC0yNTYsNyArMjU2LDcgQEAKICAgICBwRGV2aWNlLT5ieVNob3J0UHJlYW1ibGUgPSBQUkVBTUJMRV9UWVBFX0RFRjsKICAgICBwRGV2aWNlLT5lUFNNb2RlID0gUFNfTU9ERV9ERUY7CiAgICAgcERldmljZS0+YjExaEVuYWJsZSA9IFg4MDIxMWhfTU9ERV9ERUY7Ci0gICAgcERldmljZS0+ZU9QTW9kZSA9IE9QX01PREVfREVGOworICAgIHBEZXZpY2UtPm9wX21vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKICAgICBwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPSBEQVRBX1JBVEVfREVGOwogICAgIGlmIChwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPCBSQVRFX0FVVE8pIHBEZXZpY2UtPmJGaXhSYXRlID0gdHJ1ZTsKICAgICBwRGV2aWNlLT5ieUJCVHlwZSA9IEJCUF9UWVBFX0RFRjsKQEAgLTQwOSw3ICs0MDksNyBAQAogCiAJCWlmIChwRGV2aWNlLT5hYnlDQ0tQd3JUYmxbaWldID09IDApCiAJCQlwRGV2aWNlLT5hYnlDQ0tQd3JUYmxbaWldID0gcERldmljZS0+YnlDQ0tQd3I7Ci0JCQlwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpXSA9CisJCXBEZXZpY2UtPmFieU9GRE1Qd3JUYmxbaWldID0KIAkJCQlwRGV2aWNlLT5hYnlFRVBST01baWkgKyBFRVBfT0ZTX09GRE1fUFdSX1RCTF07CiAJCWlmIChwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpXSA9PSAwKQogCQkJcERldmljZS0+YWJ5T0ZETVB3clRibFtpaV0gPSBwRGV2aWNlLT5ieU9GRE1Qd3JHOwpAQCAtNzQ5LDQ0ICs3NDksNDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGRldmljZV9mcmVlX3R4X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQorc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfdHhfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCiB7Ci0Jc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpwVHhDb250ZXh0OwotICAgIGludCBpaTsKLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiVEQ7IGlpKyspIHsKLQotICAgICAgICBwVHhDb250ZXh0ID0gcERldmljZS0+YXBURFtpaV07Ci0JLyogZGVhbGxvY2F0ZSBVUkJzICovCi0gICAgICAgIGlmIChwVHhDb250ZXh0LT5wVXJiKSB7Ci0gICAgICAgICAgICB1c2Jfa2lsbF91cmIocFR4Q29udGV4dC0+cFVyYik7Ci0gICAgICAgICAgICB1c2JfZnJlZV91cmIocFR4Q29udGV4dC0+cFVyYik7Ci0gICAgICAgIH0KLSAgICAgICAga2ZyZWUocFR4Q29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfcnhfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCi17Ci0Jc3RydWN0IHZudF9yY2IgKnBSQ0I7CisJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICp0eF9jb250ZXh0OwogCWludCBpaTsKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiUkQ7IGlpKyspIHsKKwlmb3IgKGlpID0gMDsgaWkgPCBwcml2LT5jYlREOyBpaSsrKSB7CisJCXR4X2NvbnRleHQgPSBwcml2LT5hcFREW2lpXTsKKwkJLyogZGVhbGxvY2F0ZSBVUkJzICovCisJCWlmICh0eF9jb250ZXh0LT5wVXJiKSB7CisJCQl1c2Jfa2lsbF91cmIodHhfY29udGV4dC0+cFVyYik7CisJCQl1c2JfZnJlZV91cmIodHhfY29udGV4dC0+cFVyYik7CisJCX0KIAotICAgICAgICBwUkNCID0gcERldmljZS0+YXBSQ0JbaWldOwotCS8qIGRlYWxsb2NhdGUgVVJCcyAqLwotICAgICAgICBpZiAocFJDQi0+cFVyYikgewotICAgICAgICAgICAgdXNiX2tpbGxfdXJiKHBSQ0ItPnBVcmIpOwotICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKHBSQ0ItPnBVcmIpOwotICAgICAgICB9Ci0JLyogZGVhbGxvY2F0ZSBza2IgKi8KLSAgICAgICAgaWYgKHBSQ0ItPnNrYikKLSAgICAgICAgICAgIGRldl9rZnJlZV9za2IocFJDQi0+c2tiKTsKLSAgICB9Ci0gICAga2ZyZWUocERldmljZS0+cFJDQk1lbSk7CisJCWtmcmVlKHR4X2NvbnRleHQpOworCX0KIAotICAgIHJldHVybjsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRldmljZV9mcmVlX3J4X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCB2bnRfcmNiICpyY2I7CisJaW50IGlpOworCisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JSRDsgaWkrKykgeworCQlyY2IgPSBwcml2LT5hcFJDQltpaV07CisKKwkJLyogZGVhbGxvY2F0ZSBVUkJzICovCisJCWlmIChyY2ItPnBVcmIpIHsKKwkJCXVzYl9raWxsX3VyYihyY2ItPnBVcmIpOworCQkJdXNiX2ZyZWVfdXJiKHJjYi0+cFVyYik7CisJCX0KKworCQkvKiBkZWFsbG9jYXRlIHNrYiAqLworCQlpZiAocmNiLT5za2IpCisJCQlkZXZfa2ZyZWVfc2tiKHJjYi0+c2tiKTsKKwl9CisKKwlrZnJlZShwcml2LT5wUkNCTWVtKTsKKworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgdXNiX2RldmljZV9yZXNldChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCkBAIC03OTgsOTUgKzgwMSwxMDkgQEAKIAlyZXR1cm4gOwogfQogCi1zdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV9pbnRfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCitzdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV9pbnRfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCiB7Ci0gICAga2ZyZWUocERldmljZS0+aW50QnVmLnBEYXRhQnVmKTsKLSAgICByZXR1cm47CisJa2ZyZWUocHJpdi0+aW50X2J1Zi5kYXRhX2J1Zik7CisKKwlyZXR1cm47CiB9CiAKLXN0YXRpYyBib29sIGRldmljZV9hbGxvY19idWZzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKK3N0YXRpYyBib29sIGRldmljZV9hbGxvY19idWZzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKIHsKLQlzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQgKnBUeENvbnRleHQ7Ci0Jc3RydWN0IHZudF9yY2IgKnBSQ0I7CisJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICp0eF9jb250ZXh0OworCXN0cnVjdCB2bnRfcmNiICpyY2I7CiAJaW50IGlpOwogCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgcERldmljZS0+Y2JURDsgaWkrKykgewotCi0JcFR4Q29udGV4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAocFR4Q29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIgIiVzIDogYWxsb2NhdGUgdHggdXNiIGNvbnRleHQgZmFpbGVkXG4iLCBwRGV2aWNlLT5kZXYtPm5hbWUpOwotICAgICAgICAgICAgZ290byBmcmVlX3R4OwotICAgICAgICB9Ci0gICAgICAgIHBEZXZpY2UtPmFwVERbaWldID0gcFR4Q29udGV4dDsKLQlwVHhDb250ZXh0LT5wRGV2aWNlID0gKHZvaWQgKikgcERldmljZTsKLQkvKiBhbGxvY2F0ZSBVUkJzICovCi0gICAgICAgIHBUeENvbnRleHQtPnBVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotICAgICAgICBpZiAocFR4Q29udGV4dC0+cFVyYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIgImFsbG9jIHR4IHVyYiBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBmcmVlX3R4OwotICAgICAgICB9Ci0gICAgICAgIHBUeENvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBSQ0IgbWVtICovCi0JcERldmljZS0+cFJDQk1lbSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3Qgdm50X3JjYikgKiBwRGV2aWNlLT5jYlJEKSwKKwlmb3IgKGlpID0gMDsgaWkgPCBwcml2LT5jYlREOyBpaSsrKSB7CisJCXR4X2NvbnRleHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQpLAogCQkJCQkJCQlHRlBfS0VSTkVMKTsKLSAgICBpZiAocERldmljZS0+cFJDQk1lbSA9PSBOVUxMKSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0VSUixLRVJOX0VSUiAiJXMgOiBhbGxvYyByeCB1c2IgY29udGV4dCBmYWlsZWRcbiIsIHBEZXZpY2UtPmRldi0+bmFtZSk7Ci0gICAgICAgIGdvdG8gZnJlZV90eDsKLSAgICB9CisJCWlmICh0eF9jb250ZXh0ID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCQkiJXMgOiBhbGxvY2F0ZSB0eCB1c2IgY29udGV4dCBmYWlsZWRcbiIsCisJCQkJCXByaXYtPmRldi0+bmFtZSk7CisJCQlnb3RvIGZyZWVfdHg7CisJCX0KIAotICAgIHBEZXZpY2UtPkZpcnN0UmVjdkZyZWVMaXN0ID0gTlVMTDsKLSAgICBwRGV2aWNlLT5MYXN0UmVjdkZyZWVMaXN0ID0gTlVMTDsKLSAgICBwRGV2aWNlLT5GaXJzdFJlY3ZNbmdMaXN0ID0gTlVMTDsKLSAgICBwRGV2aWNlLT5MYXN0UmVjdk1uZ0xpc3QgPSBOVUxMOwotICAgIHBEZXZpY2UtPk51bVJlY3ZGcmVlTGlzdCA9IDA7CisJCXByaXYtPmFwVERbaWldID0gdHhfY29udGV4dDsKKwkJdHhfY29udGV4dC0+cERldmljZSA9IHByaXY7CiAKLQlwUkNCID0gKHN0cnVjdCB2bnRfcmNiICopcERldmljZS0+cFJDQk1lbTsKKwkJLyogYWxsb2NhdGUgVVJCcyAqLworCQl0eF9jb250ZXh0LT5wVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHR4X2NvbnRleHQtPnBVcmIgPT0gTlVMTCkgeworCQkJREJHX1BSVChNU0dfTEVWRUxfRVJSLAorCQkJCUtFUk5fRVJSICJhbGxvYyB0eCB1cmIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZnJlZV90eDsKKwkJfQogCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgcERldmljZS0+Y2JSRDsgaWkrKykgewotCi0gICAgICAgIHBEZXZpY2UtPmFwUkNCW2lpXSA9IHBSQ0I7Ci0JcFJDQi0+cERldmljZSA9ICh2b2lkICopIHBEZXZpY2U7Ci0JLyogYWxsb2NhdGUgVVJCcyAqLwotICAgICAgICBwUkNCLT5wVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQotICAgICAgICBpZiAocFJDQi0+cFVyYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiIEZhaWxlZCB0byBhbGxvYyByeCB1cmJcbiIpOwotICAgICAgICAgICAgZ290byBmcmVlX3J4X3R4OwotICAgICAgICB9Ci0gICAgICAgIHBSQ0ItPnNrYiA9IGRldl9hbGxvY19za2IoKGludClwRGV2aWNlLT5yeF9idWZfc3opOwotICAgICAgICBpZiAocFJDQi0+c2tiID09IE5VTEwpIHsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0VSUixLRVJOX0VSUiIgRmFpbGVkIHRvIGFsbG9jIHJ4IHNrYlxuIik7Ci0gICAgICAgICAgICBnb3RvIGZyZWVfcnhfdHg7Ci0gICAgICAgIH0KLSAgICAgICAgcFJDQi0+c2tiLT5kZXYgPSBwRGV2aWNlLT5kZXY7Ci0gICAgICAgIHBSQ0ItPmJCb29sSW5Vc2UgPSBmYWxzZTsKLSAgICAgICAgRW5xdWV1ZVJDQihwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCwgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCwgcFJDQik7Ci0gICAgICAgIHBEZXZpY2UtPk51bVJlY3ZGcmVlTGlzdCsrOwotICAgICAgICBwUkNCKys7Ci0gICAgfQotCi0JcERldmljZS0+cEludGVycnVwdFVSQiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBEZXZpY2UtPnBJbnRlcnJ1cHRVUkIgPT0gTlVMTCkgewotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiRmFpbGVkIHRvIGFsbG9jIGludCB1cmJcbiIpOwotCSAgICBnb3RvIGZyZWVfcnhfdHg7CisJCXR4X2NvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKIAl9CiAKLSAgICBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYgPSBrbWFsbG9jKE1BWF9JTlRFUlJVUFRfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBEZXZpY2UtPmludEJ1Zi5wRGF0YUJ1ZiA9PSBOVUxMKSB7Ci0JICAgIERCR19QUlQoTVNHX0xFVkVMX0VSUixLRVJOX0VSUiJGYWlsZWQgdG8gYWxsb2MgaW50IGJ1ZlxuIik7Ci0JICAgIHVzYl9mcmVlX3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCKTsKLQkgICAgZ290byBmcmVlX3J4X3R4OworCS8qIGFsbG9jYXRlIFJDQiBtZW0gKi8KKwlwcml2LT5wUkNCTWVtID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCB2bnRfcmNiKSAqIHByaXYtPmNiUkQpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+cFJDQk1lbSA9PSBOVUxMKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCSIlcyA6IGFsbG9jIHJ4IHVzYiBjb250ZXh0IGZhaWxlZFxuIiwKKwkJCQlwcml2LT5kZXYtPm5hbWUpOworCQlnb3RvIGZyZWVfdHg7CiAJfQogCi0gICAgcmV0dXJuIHRydWU7CisJcHJpdi0+Rmlyc3RSZWN2RnJlZUxpc3QgPSBOVUxMOworCXByaXYtPkxhc3RSZWN2RnJlZUxpc3QgPSBOVUxMOworCXByaXYtPkZpcnN0UmVjdk1uZ0xpc3QgPSBOVUxMOworCXByaXYtPkxhc3RSZWN2TW5nTGlzdCA9IE5VTEw7CisJcHJpdi0+TnVtUmVjdkZyZWVMaXN0ID0gMDsKKworCXJjYiA9IChzdHJ1Y3Qgdm50X3JjYiAqKXByaXYtPnBSQ0JNZW07CisKKwlmb3IgKGlpID0gMDsgaWkgPCBwcml2LT5jYlJEOyBpaSsrKSB7CisJCXByaXYtPmFwUkNCW2lpXSA9IHJjYjsKKwkJcmNiLT5wRGV2aWNlID0gcHJpdjsKKworCQkvKiBhbGxvY2F0ZSBVUkJzICovCisJCXJjYi0+cFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJCWlmIChyY2ItPnBVcmIgPT0gTlVMTCkgeworCQkJREJHX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJCSIgRmFpbGVkIHRvIGFsbG9jIHJ4IHVyYlxuIik7CisJCQlnb3RvIGZyZWVfcnhfdHg7CisJCX0KKworCQlyY2ItPnNrYiA9IG5ldGRldl9hbGxvY19za2IocHJpdi0+ZGV2LCBwcml2LT5yeF9idWZfc3opOworCQlpZiAocmNiLT5za2IgPT0gTlVMTCkgeworCQkJREJHX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJCQkJIiBGYWlsZWQgdG8gYWxsb2Mgcnggc2tiXG4iKTsKKwkJCWdvdG8gZnJlZV9yeF90eDsKKwkJfQorCisJCXJjYi0+YkJvb2xJblVzZSA9IGZhbHNlOworCisJCUVucXVldWVSQ0IocHJpdi0+Rmlyc3RSZWN2RnJlZUxpc3QsCisJCQkJCQlwcml2LT5MYXN0UmVjdkZyZWVMaXN0LCByY2IpOworCisJCXByaXYtPk51bVJlY3ZGcmVlTGlzdCsrOworCQlyY2IrKzsKKwl9CisKKwlwcml2LT5wSW50ZXJydXB0VVJCID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdi0+cEludGVycnVwdFVSQiA9PSBOVUxMKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIiRmFpbGVkIHRvIGFsbG9jIGludCB1cmJcbiIpOworCQlnb3RvIGZyZWVfcnhfdHg7CisJfQorCisJcHJpdi0+aW50X2J1Zi5kYXRhX2J1ZiA9IGttYWxsb2MoTUFYX0lOVEVSUlVQVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+aW50X2J1Zi5kYXRhX2J1ZiA9PSBOVUxMKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIiRmFpbGVkIHRvIGFsbG9jIGludCBidWZcbiIpOworCQl1c2JfZnJlZV91cmIocHJpdi0+cEludGVycnVwdFVSQik7CisJCWdvdG8gZnJlZV9yeF90eDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKIAogZnJlZV9yeF90eDoKLSAgICBkZXZpY2VfZnJlZV9yeF9idWZzKHBEZXZpY2UpOworCWRldmljZV9mcmVlX3J4X2J1ZnMocHJpdik7CiAKIGZyZWVfdHg6Ci0gICAgZGV2aWNlX2ZyZWVfdHhfYnVmcyhwRGV2aWNlKTsKKwlkZXZpY2VfZnJlZV90eF9idWZzKHByaXYpOwogCiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtOTMxLDEzICs5NDgsMTEgQEAKIGludCBkZXZpY2VfYWxsb2NfZnJhZ19idWYoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAogCQlQU0RlRnJhZ0NvbnRyb2xCbG9jayBwRGVGKQogeworCXBEZUYtPnNrYiA9IG5ldGRldl9hbGxvY19za2IocERldmljZS0+ZGV2LCBwRGV2aWNlLT5yeF9idWZfc3opOworCWlmICghcERlRi0+c2tiKQorCQlyZXR1cm4gZmFsc2U7CiAKLSAgICBwRGVGLT5za2IgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcERldmljZS0+cnhfYnVmX3N6KTsKLSAgICBpZiAocERlRi0+c2tiID09IE5VTEwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBwRGVGLT5za2ItPmRldiA9IHBEZXZpY2UtPmRldjsKLQotICAgIHJldHVybiB0cnVlOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50ICBkZXZpY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtOTc0LDggKzk4OSw2IEBACiAJCWdvdG8gZnJlZV9hbGw7CiAJfQogCi0gICAgZGV2aWNlX3NldF9tdWx0aShwRGV2aWNlLT5kZXYpOwotCiAgICAgLyogaW5pdCBmb3Iga2V5IG1hbmFnZW1lbnQgKi8KICAgICBLZXl2SW5pdFRhYmxlKHBEZXZpY2UsJnBEZXZpY2UtPnNLZXkpOwogCW1lbWNweShwRGV2aWNlLT52bnRfbWdtdC5hYnlNQUNBZGRyLApAQCAtOTkyLDE2ICsxMDA1LDEyIEBACiAKICAgICB2TWdyT2JqZWN0SW5pdChwRGV2aWNlKTsKIAotICAgIHRhc2tsZXRfaW5pdCgmcERldmljZS0+RXZlbnRXb3JrSXRlbSwgKHZvaWQgKilJTlR2V29ya0l0ZW0sICh1bnNpZ25lZCBsb25nKXBEZXZpY2UpOwotCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwRGV2aWNlLT5zZWNvbmRfY2FsbGJhY2tfd29yaywgSFopOwogCi0JcERldmljZS0+aW50X2ludGVydmFsID0gMTAwOyAgLyogbWF4IDEwMCBtaWNyb2ZyYW1lcyAqLworCXBEZXZpY2UtPmludF9pbnRlcnZhbCA9IDE7ICAvKiBiSW50ZXJ2YWwgaXMgc2V0IHRvIDEgKi8KICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CiAKICAgICBwRGV2aWNlLT5iSXNSeFdvcmtJdGVtUXVldWVkID0gdHJ1ZTsKLSAgICBwRGV2aWNlLT5mS2lsbEV2ZW50UG9sbGluZ1RocmVhZCA9IGZhbHNlOwotICAgIHBEZXZpY2UtPmJFdmVudEF2YWlsYWJsZSA9IGZhbHNlOwogCiAgICBwRGV2aWNlLT5iV1BBREVWVXAgPSBmYWxzZTsKICAgICAgcERldmljZS0+YndleHRzdGVwMCA9IGZhbHNlOwpAQCAtMTA4NCw3ICsxMDkzLDYgQEAKICAgICBNUF9TRVRfRkxBRyhwRGV2aWNlLCBmTVBfRElTQ09OTkVDVEVEKTsKICAgICBNUF9DTEVBUl9GTEFHKHBEZXZpY2UsIGZNUF9QT1NUX1dSSVRFUyk7CiAgICAgTVBfQ0xFQVJfRkxBRyhwRGV2aWNlLCBmTVBfUE9TVF9SRUFEUyk7Ci0gICAgcERldmljZS0+ZktpbGxFdmVudFBvbGxpbmdUaHJlYWQgPSB0cnVlOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwRGV2aWNlLT5ydW5fY29tbWFuZF93b3JrKTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBEZXZpY2UtPnNlY29uZF9jYWxsYmFja193b3JrKTsKQEAgLTEwOTgsOCArMTEwNiw2IEBACiAJY2FuY2VsX3dvcmtfc3luYygmcERldmljZS0+cnhfbW5nX3dvcmtfaXRlbSk7CiAJY2FuY2VsX3dvcmtfc3luYygmcERldmljZS0+cmVhZF93b3JrX2l0ZW0pOwogCi0gICAgdGFza2xldF9raWxsKCZwRGV2aWNlLT5FdmVudFdvcmtJdGVtKTsKLQogICAgcERldmljZS0+YlJvYW1pbmcgPSBmYWxzZTsKICAgIHBEZXZpY2UtPmJJc1JvYW1pbmcgPSBmYWxzZTsKICAgIHBEZXZpY2UtPmJFbmFibGVSb2FtaW5nID0gZmFsc2U7CkBAIC0xMzUwLDY5ICsxMzU2LDczIEBACiAKIHN0YXRpYyB2b2lkIGRldmljZV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCB2bnRfbWFuYWdlciAqcE1nbXQgPSAmcERldmljZS0+dm50X21nbXQ7CisJc3RydWN0IHZudF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHByaXYtPmZsYWdzICYgREVWSUNFX0ZMQUdTX09QRU5FRCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJCWJTY2hlZHVsZUNvbW1hbmQocHJpdiwgV0xBTl9DTURfQ09ORklHVVJFX0ZJTFRFUiwgTlVMTCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCX0KK30KKwordm9pZCB2bnRfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKKwlzdHJ1Y3Qgdm50X21hbmFnZXIgKm1nbXQgPSAmcHJpdi0+dm50X21nbXQ7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQl1MzIgbWNfZmlsdGVyWzJdOwotCWludCBpaTsKLQl1OCBwYnlEYXRhWzhdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCXU4IGJ5VG1wTW9kZSA9IDA7CisJdTY0IG1jX2ZpbHRlciA9IDA7CisJdTggdG1wID0gMDsKIAlpbnQgcmM7CiAKLQlzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICByYyA9IENPTlRST0xuc1JlcXVlc3RJbihwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfVFlQRV9SRUFELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19SRUdfUkNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnlUbXBNb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBpZiAocmMgPT0gMCkgcERldmljZS0+YnlSeE1vZGUgPSBieVRtcE1vZGU7CisJcmMgPSBDT05UUk9MbnNSZXF1ZXN0SW4ocHJpdiwgTUVTU0FHRV9UWVBFX1JFQUQsCisJCU1BQ19SRUdfUkNSLCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAxLCAmdG1wKTsKKwlpZiAocmMgPT0gMCkKKwkJcHJpdi0+YnlSeE1vZGUgPSB0bXA7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwRGV2aWNlLT5ieVJ4TW9kZSBpbj0gJXhcbiIsIHBEZXZpY2UtPmJ5UnhNb2RlKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwcml2LT5ieVJ4TW9kZSBpbj0gJXhcbiIsCisJCQkJCQkJcHJpdi0+YnlSeE1vZGUpOwogCi0gICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeyAvKiBzZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOwotCS8qIHVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMgKi8KLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgfD0gKFJDUl9NVUxUSUNBU1R8UkNSX0JST0FEQ0FTVHxSQ1JfVU5JQ0FTVCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChuZXRkZXZfbWNfY291bnQoZGV2KSA+IHBEZXZpY2UtPm11bHRpY2FzdF9saW1pdCkgfHwKLQkgICAgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgewotICAgICAgICBDT05UUk9MbnNSZXF1ZXN0T3V0KHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9UWVBFX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19SRUdfTUFSMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5RGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOwotCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLSAgICAgICAgICAgIGludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKSA+PiAyNjsKLSAgICAgICAgICAgIG1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gY3B1X3RvX2xlMzIoMSA8PCAoYml0X25yICYgMzEpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7Ci0gICAgICAgICAgICAgTUFDdldyaXRlTXVsdGlBZGRyKHBEZXZpY2UsIGlpLCAqKCh1OCAqKSZtY19maWx0ZXJbMF0gKyBpaSkpOwotICAgICAgICAgICAgIE1BQ3ZXcml0ZU11bHRpQWRkcihwRGV2aWNlLCBpaSsgNCwgKigodTggKikmbWNfZmlsdGVyWzFdICsgaWkpKTsKLSAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5ieVJ4TW9kZSAmPSB+KFJDUl9VTklDQVNUKTsKLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgfD0gKFJDUl9NVUxUSUNBU1R8UkNSX0JST0FEQ0FTVCk7Ci0gICAgfQorCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsgLyogc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwkJREJHX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX05PVElDRQorCQkJIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQkvKiB1bmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzICovCisJCXByaXYtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1R8UkNSX1VOSUNBU1QpOworCX0gZWxzZSBpZiAoKG5ldGRldl9tY19jb3VudChkZXYpID4gcHJpdi0+bXVsdGljYXN0X2xpbWl0KSB8fAorCQkJKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCW1jX2ZpbHRlciA9IH4weDA7CisJCU1BQ3ZXcml0ZU11bHRpQWRkcihwcml2LCBtY19maWx0ZXIpOwogCi0gICAgaWYgKHBNZ210LT5lQ29uZmlnTW9kZSA9PSBXTUFDX0NPTkZJR19BUCkgewotCS8qCi0JICogSWYgQVAgbW9kZSwgZG9uJ3QgZW5hYmxlIFJDUl9VTklDQVNUIHNpbmNlIEhXIG9ubHkgY29tcGFyZXMKLQkgKiBhZGRyMSB3aXRoIGxvY2FsIE1BQwotCSAqLwotICAgICAgICBwRGV2aWNlLT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgJj0gfihSQ1JfVU5JQ0FTVCk7Ci0gICAgfQotICAgIENvbnRyb2x2V3JpdGVCeXRlKHBEZXZpY2UsIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIE1BQ19SRUdfUkNSLCBwRGV2aWNlLT5ieVJ4TW9kZSk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+YnlSeE1vZGUgb3V0PSAleFxuIiwgcERldmljZS0+YnlSeE1vZGUpOwotCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCXByaXYtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOworCX0gZWxzZSB7CisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKSA+PiAyNjsKIAorCQkJbWNfZmlsdGVyIHw9IDFVTEwgPDwgKGJpdF9uciAmIDB4M2YpOworCQl9CisKKwkJTUFDdldyaXRlTXVsdGlBZGRyKHByaXYsIG1jX2ZpbHRlcik7CisKKwkJcHJpdi0+YnlSeE1vZGUgJj0gfihSQ1JfVU5JQ0FTVCk7CisJCXByaXYtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOworCX0KKworCWlmIChtZ210LT5lQ29uZmlnTW9kZSA9PSBXTUFDX0NPTkZJR19BUCkgeworCQkvKgorCQkgKiBJZiBBUCBtb2RlLCBkb24ndCBlbmFibGUgUkNSX1VOSUNBU1Qgc2luY2UgSFcgb25seSBjb21wYXJlcworCQkgKiBhZGRyMSB3aXRoIGxvY2FsIE1BQworCQkgKi8KKwkJcHJpdi0+YnlSeE1vZGUgfD0gKFJDUl9NVUxUSUNBU1R8UkNSX0JST0FEQ0FTVCk7CisJCXByaXYtPmJ5UnhNb2RlICY9IH4oUkNSX1VOSUNBU1QpOworCX0KKworCUNvbnRyb2x2V3JpdGVCeXRlKHByaXYsIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsCisJCQkJCU1BQ19SRUdfUkNSLCBwcml2LT5ieVJ4TW9kZSk7CisKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkJInByaXYtPmJ5UnhNb2RlIG91dD0gJXhcbiIsIHByaXYtPmJ5UnhNb2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkZXZpY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKaW5kZXggZTdkNTQ4Ny4uNDNkYTU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYwpAQCAtNjcsMjIgKzY3LDIzIEBACiAJLyogc2V0IHBlcmlvZCBvZiBwb3dlciB1cCBiZWZvcmUgVEJUVCAqLwogCU1BQ3ZXcml0ZVdvcmQocERldmljZSwgTUFDX1JFR19QV0JULCBDX1BXQlQpOwogCi0JaWYgKHBEZXZpY2UtPmVPUE1vZGUgIT0gT1BfTU9ERV9BREhPQykgeworCWlmIChwRGV2aWNlLT5vcF9tb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCS8qIHNldCBBSUQgKi8KIAkJTUFDdldyaXRlV29yZChwRGV2aWNlLCBNQUNfUkVHX0FJREFUSU0sIHdBSUQpOwotCX0gZWxzZSB7Ci0JCS8qIHNldCBBVElNIFdpbmRvdyAqLwotCQkvKiBNQUN2V3JpdGVBVElNVyhwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBwTWdtdC0+d0N1cnJBVElNV2luZG93KTsgKi8KIAl9CiAKLQkvKiBXYXJyZW46MDYtMTgtMjAwNCx0aGUgc2VxdWVuY2UgbXVzdCBmb2xsb3cgUFNFTi0+QVVUT1NMRUVQLT5HTzJET1pFICovCisJLyogV2FycmVuOjA2LTE4LTIwMDQsdGhlIHNlcXVlbmNlIG11c3QgZm9sbG93CisJICogUFNFTi0+QVVUT1NMRUVQLT5HTzJET1pFCisJICovCiAJLyogZW5hYmxlIHBvd2VyIHNhdmluZyBodyBmdW5jdGlvbiAqLwogCU1BQ3ZSZWdCaXRzT24ocERldmljZSwgTUFDX1JFR19QU0NUTCwgUFNDVExfUFNFTik7CiAKIAkvKiBTZXQgQXV0b1NsZWVwICovCiAJTUFDdlJlZ0JpdHNPbihwRGV2aWNlLCBNQUNfUkVHX1BTQ0ZHLCBQU0NGR19BVVRPU0xFRVApOwogCi0JLyogV2FycmVuOk1VU1QgdHVybiBvbiB0aGlzIG9uY2UgYmVmb3JlIHR1cm4gb24gQVVUT1NMRUVQICxvciB0aGUgQVVUT1NMRUVQIGRvZXNuJ3Qgd29yayAqLworCS8qIFdhcnJlbjpNVVNUIHR1cm4gb24gdGhpcyBvbmNlIGJlZm9yZSB0dXJuIG9uIEFVVE9TTEVFUCAsb3IgdGhlCisJICogQVVUT1NMRUVQIGRvZXNuJ3Qgd29yaworCSAqLwogCU1BQ3ZSZWdCaXRzT24ocERldmljZSwgTUFDX1JFR19QU0NUTCwgUFNDVExfR08yRE9aRSk7CiAKIAlpZiAod0xpc3RlbkludGVydmFsID49IDIpIHsKQEAgLTEwNSw4ICsxMDYsMTAgQEAKIAogCXBEZXZpY2UtPmJFbmFibGVQU01vZGUgPSB0cnVlOwogCi0JLyogV2UgZG9uJ3Qgc2VuZCBudWxsIHBrdCBpbiBhZCBob2MgbW9kZSBzaW5jZSBiZWFjb24gd2lsbCBoYW5kbGUgdGhpcy4gKi8KLQlpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKQorCS8qIFdlIGRvbid0IHNlbmQgbnVsbCBwa3QgaW4gYWQgaG9jIG1vZGUKKwkgKiBzaW5jZSBiZWFjb24gd2lsbCBoYW5kbGUgdGhpcy4KKwkgKi8KKwlpZiAocERldmljZS0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQlQU2JTZW5kTnVsbFBhY2tldChwRGV2aWNlKTsKIAogCXBEZXZpY2UtPmJQV0JpdE9uID0gdHJ1ZTsKQEAgLTEzNyw3ICsxNDAsNyBAQAogCU1BQ3ZSZWdCaXRzT24ocERldmljZSwgTUFDX1JFR19QU0NUTCwgUFNDVExfQUxCQ04pOwogCXBEZXZpY2UtPmJFbmFibGVQU01vZGUgPSBmYWxzZTsKIAotCWlmIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfSU5GUkFTVFJVQ1RVUkUpCisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJUFNiU2VuZE51bGxQYWNrZXQocERldmljZSk7CiAKIAlwRGV2aWNlLT5iUFdCaXRPbiA9IGZhbHNlOwpAQCAtMjI2LDE1ICsyMjksMTkgQEAKIAkJCVdMQU5fU0VUX0ZDX1BXUk1HVCgwKQogCQkpKTsKIAotCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQgPSBwTWdtdC0+d0N1cnJBSUQgfCBCSVQxNCB8IEJJVDE1OwotCW1lbWNweShwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLmFieUFkZHIxLCBwTWdtdC0+YWJ5Q3VyckJTU0lELCBXTEFOX0FERFJfTEVOKTsKLQltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi5hYnlBZGRyMiwgcE1nbXQtPmFieU1BQ0FkZHIsIFdMQU5fQUREUl9MRU4pOworCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQgPQorCQlwTWdtdC0+d0N1cnJBSUQgfCBCSVQxNCB8IEJJVDE1OworCW1lbWNweShwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLmFieUFkZHIxLCBwTWdtdC0+YWJ5Q3VyckJTU0lELAorCQlXTEFOX0FERFJfTEVOKTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi5hYnlBZGRyMiwgcE1nbXQtPmFieU1BQ0FkZHIsCisJCVdMQU5fQUREUl9MRU4pOwogCXBUeFBhY2tldC0+Y2JNUERVTGVuID0gV0xBTl9IRFJfQUREUjJfTEVOOwogCXBUeFBhY2tldC0+Y2JQYXlsb2FkTGVuID0gMDsKIAogCS8qIGxvZyBmYWlsdXJlIGlmIHNlbmRpbmcgZmFpbGVkICovCiAJaWYgKGNzTWdtdF94bWl0KHBEZXZpY2UsIHBUeFBhY2tldCkgIT0gQ01EX1NUQVRVU19QRU5ESU5HKQotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTZW5kIFBTLVBvbGwgcGFja2V0IGZhaWxlZC4uXG4iKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQlLRVJOX0lORk8gIlNlbmQgUFMtUG9sbCBwYWNrZXQgZmFpbGVkLi5cbiIpOwogfQogCiAvKgpAQCAtMjc2LDE2ICsyODMsMjEgQEAKIAlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EzLndGcmFtZUN0bCA9IGNwdV90b19sZTE2KGZsYWdzKTsKIAogCWlmIChwTWdtdC0+ZUN1cnJNb2RlICE9IFdNQUNfTU9ERV9JQlNTX1NUQSkKLQkJcFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy53RnJhbWVDdGwgfD0gY3B1X3RvX2xlMTYoKHUxNilXTEFOX1NFVF9GQ19UT0RTKDEpKTsKKwkJcFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy53RnJhbWVDdGwgfD0KKwkJCWNwdV90b19sZTE2KCh1MTYpV0xBTl9TRVRfRkNfVE9EUygxKSk7CiAKLQltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9BRERSX0xFTik7Ci0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLCBXTEFOX0FERFJfTEVOKTsKLQltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMywgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOworCW1lbWNweShwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIxLCBwTWdtdC0+YWJ5Q3VyckJTU0lELAorCQlXTEFOX0FERFJfTEVOKTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMiwgcE1nbXQtPmFieU1BQ0FkZHIsCisJCVdMQU5fQUREUl9MRU4pOworCW1lbWNweShwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIzLCBwTWdtdC0+YWJ5Q3VyckJTU0lELAorCQlXTEFOX0JTU0lEX0xFTik7CiAJcFR4UGFja2V0LT5jYk1QRFVMZW4gPSBXTEFOX0hEUl9BRERSM19MRU47CiAJcFR4UGFja2V0LT5jYlBheWxvYWRMZW4gPSAwOwogCS8qIGxvZyBlcnJvciBpZiBzZW5kaW5nIGZhaWxlZCAqLwogCWlmIChjc01nbXRfeG1pdChwRGV2aWNlLCBwVHhQYWNrZXQpICE9IENNRF9TVEFUVVNfUEVORElORykgewotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTZW5kIE51bGwgUGFja2V0IGZhaWxlZCAhXG4iKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQlLRVJOX0lORk8gIlNlbmQgTnVsbCBQYWNrZXQgZmFpbGVkICFcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwppbmRleCA1MWZmZjg5Li4zODQwMzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwpAQCAtMTE4LDcgKzExOCw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNfdUdldFR4UnN2VGltZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU4IGJ5UGt0VHlwZSwKIAl1MzIgY2JGcmFtZUxlbmd0aCwgdTE2IHdSYXRlLCBpbnQgYk5lZWRBY2spOwogCi1zdGF0aWMgdTE2IHNfdUdldFJUU0NUU1JzdlRpbWUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAorc3RhdGljIF9fbGUxNiBzX3VHZXRSVFNDVFNSc3ZUaW1lKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAl1OCByc3ZfdHlwZSwgdTggcGt0X3R5cGUsIHUzMiBmcmFtZV9sZW5naHQsIHUxNiBjdXJyZW50X3JhdGUpOwogCiBzdGF0aWMgdTE2IHNfdkZpbGxDVFNIZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwgdTMyIHVETUFJZHgsCkBAIC0xMjksMTAgKzEyOSwxMCBAQAogCXVuaW9uIHZudF90eF9kYXRhX2hlYWQgKmhlYWQsIHUzMiBjYkZyYW1lTGVuZ3RoLCBpbnQgYk5lZWRBY2ssCiAJc3RydWN0IGV0aGhkciAqcHNFdGhIZWFkZXIsIHUxNiB3Q3VycmVudFJhdGUsIHU4IGJ5RkJPcHRpb24pOwogCi1zdGF0aWMgdTE2IHNfdUdldERhdGFEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCitzdGF0aWMgX19sZTE2IHNfdUdldERhdGFEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCiAJdTggYnlQa3RUeXBlLCBpbnQgYk5lZWRBY2spOwogCi1zdGF0aWMgdTE2IHNfdUdldFJUU0NUU0R1cmF0aW9uKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKK3N0YXRpYyBfX2xlMTYgc191R2V0UlRTQ1RTRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAogCXU4IGJ5RHVyVHlwZSwgdTMyIGNiRnJhbWVMZW5ndGgsIHU4IGJ5UGt0VHlwZSwgdTE2IHdSYXRlLAogCWludCBiTmVlZEFjaywgdTggYnlGQk9wdGlvbik7CiAKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHUxNiB2bnRfdGltZV9zdGFtcF9vZmYoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1MTYgcmF0ZSkKK3N0YXRpYyBfX2xlMTYgdm50X3RpbWVfc3RhbXBfb2ZmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTE2IHJhdGUpCiB7CiAJcmV0dXJuIGNwdV90b19sZTE2KHdUaW1lU3RhbXBPZmZbcHJpdi0+YnlQcmVhbWJsZVR5cGUgJSAyXQogCQkJCQkJCVtyYXRlICUgTUFYX1JBVEVdKTsKQEAgLTM1OSw3ICszNTksNyBAQAogCXJldHVybiBkYXRhX3RpbWU7CiB9CiAKLXN0YXRpYyB1MTYgdm50X3J4dHhfcnN2dGltZV9sZTE2KHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTggcGt0X3R5cGUsCitzdGF0aWMgX19sZTE2IHZudF9yeHR4X3JzdnRpbWVfbGUxNihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHBrdF90eXBlLAogCXUzMiBmcmFtZV9sZW5ndGgsIHUxNiByYXRlLCBpbnQgbmVlZF9hY2spCiB7CiAJcmV0dXJuIGNwdV90b19sZTE2KCh1MTYpc191R2V0VHhSc3ZUaW1lKHByaXYsIHBrdF90eXBlLApAQCAtMzY3LDcgKzM2Nyw3IEBACiB9CiAKIC8vYnlGcmVxVHlwZTogMD0+NUdIWiAxPT4yLjRHSFoKLXN0YXRpYyB1MTYgc191R2V0UlRTQ1RTUnN2VGltZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCitzdGF0aWMgX19sZTE2IHNfdUdldFJUU0NUU1JzdlRpbWUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAogCXU4IHJzdl90eXBlLCB1OCBwa3RfdHlwZSwgdTMyIGZyYW1lX2xlbmdodCwgdTE2IGN1cnJlbnRfcmF0ZSkKIHsKIAl1MzIgcnJ2X3RpbWUsIHJ0c190aW1lLCBjdHNfdGltZSwgYWNrX3RpbWUsIGRhdGFfdGltZTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiAJCXJydl90aW1lID0gY3RzX3RpbWUgKyBhY2tfdGltZSArIGRhdGFfdGltZSArIDIgKiBwcml2LT51U0lGUzsKIAotCQlyZXR1cm4gcnJ2X3RpbWU7CisJCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXJydl90aW1lKTsKIAl9CiAKIAlycnZfdGltZSA9IHJ0c190aW1lICsgY3RzX3RpbWUgKyBhY2tfdGltZSArIGRhdGFfdGltZSArIDMgKiBwcml2LT51U0lGUzsKQEAgLTQxMSw3ICs0MTEsNyBAQAogfQogCiAvL2J5RnJlcVR5cGUgMDogNUdIeiwgMToyLjRHaHoKLXN0YXRpYyB1MTYgc191R2V0RGF0YUR1cmF0aW9uKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKK3N0YXRpYyBfX2xlMTYgc191R2V0RGF0YUR1cmF0aW9uKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKIAkJCQkJdTggYnlQa3RUeXBlLCBpbnQgYk5lZWRBY2spCiB7CiAJdTMyIHVBY2tUaW1lID0gMDsKQEAgLTQzMCw3ICs0MzAsNyBAQAogfQogCiAvL2J5RnJlcVR5cGU6IDA9PjVHSFogMT0+Mi40R0haCi1zdGF0aWMgdTE2IHNfdUdldFJUU0NUU0R1cmF0aW9uKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwgdTggYnlEdXJUeXBlLAorc3RhdGljIF9fbGUxNiBzX3VHZXRSVFNDVFNEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU4IGJ5RHVyVHlwZSwKIAl1MzIgY2JGcmFtZUxlbmd0aCwgdTggYnlQa3RUeXBlLCB1MTYgd1JhdGUsIGludCBiTmVlZEFjaywKIAl1OCBieUZCT3B0aW9uKQogewpAQCAtNDgxLDE0ICs0ODEsMTQgQEAKIAkJCQkJCQlQS19UWVBFXzExQiwgJmJ1Zi0+Yik7CiAKIAkvKiBHZXQgRHVyYXRpb24gYW5kIFRpbWVTdGFtcCAqLwotCWJ1Zi0+d0R1cmF0aW9uX2EgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKLQlidWYtPndEdXJhdGlvbl9iID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIFBLX1RZUEVfMTFCLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9hID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9iID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIFBLX1RZUEVfMTFCLCBuZWVkX2Fjayk7CiAKLQlidWYtPndUaW1lU3RhbXBPZmZfYSA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKLQlidWYtPndUaW1lU3RhbXBPZmZfYiA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LAorCWJ1Zi0+dGltZV9zdGFtcF9vZmZfYSA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKKwlidWYtPnRpbWVfc3RhbXBfb2ZmX2IgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwKIAkJCQkJcHJpdi0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCi0JcmV0dXJuIGJ1Zi0+d0R1cmF0aW9uX2E7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJ1Zi0+ZHVyYXRpb25fYSk7CiB9CiAKIHN0YXRpYyB1MTYgdm50X3J4dHhfZGF0YWhlYWRfZ19mYihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHBrdF90eXBlLApAQCAtNTAyLDE3ICs1MDIsMTcgQEAKIAkJCQkJCVBLX1RZUEVfMTFCLCAmYnVmLT5iKTsKIAogCS8qIEdldCBEdXJhdGlvbiBhbmQgVGltZVN0YW1wICovCi0JYnVmLT53RHVyYXRpb25fYSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwotCWJ1Zi0+d0R1cmF0aW9uX2IgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgUEtfVFlQRV8xMUIsIG5lZWRfYWNrKTsKKwlidWYtPmR1cmF0aW9uX2EgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKKwlidWYtPmR1cmF0aW9uX2IgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgUEtfVFlQRV8xMUIsIG5lZWRfYWNrKTsKIAotCWJ1Zi0+d0R1cmF0aW9uX2FfZjAgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKLQlidWYtPndEdXJhdGlvbl9hX2YxID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9hX2YwID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9hX2YxID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CiAKLQlidWYtPndUaW1lU3RhbXBPZmZfYSA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKLQlidWYtPndUaW1lU3RhbXBPZmZfYiA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LAorCWJ1Zi0+dGltZV9zdGFtcF9vZmZfYSA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKKwlidWYtPnRpbWVfc3RhbXBfb2ZmX2IgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwKIAkJCQkJCXByaXYtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAotCXJldHVybiBidWYtPndEdXJhdGlvbl9hOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uX2EpOwogfQogCiBzdGF0aWMgdTE2IHZudF9yeHR4X2RhdGFoZWFkX2FfZmIoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1OCBwa3RfdHlwZSwKQEAgLTUyMiwxNCArNTIyLDE0IEBACiAJLyogR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGggKi8KIAlCQnZDYWxjdWxhdGVQYXJhbWV0ZXIocHJpdiwgZnJhbWVfbGVuLCByYXRlLCBwa3RfdHlwZSwgJmJ1Zi0+YSk7CiAJLyogR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXBPZmYgKi8KLQlidWYtPndEdXJhdGlvbiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb24gPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKIAotCWJ1Zi0+d0R1cmF0aW9uX2YwID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7Ci0JYnVmLT53RHVyYXRpb25fZjEgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKKwlidWYtPmR1cmF0aW9uX2YwID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9mMSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwogCi0JYnVmLT53VGltZVN0YW1wT2ZmID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsIHJhdGUpOworCWJ1Zi0+dGltZV9zdGFtcF9vZmYgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7CiAKLQlyZXR1cm4gYnVmLT53RHVyYXRpb247CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJ1Zi0+ZHVyYXRpb24pOwogfQogCiBzdGF0aWMgdTE2IHZudF9yeHR4X2RhdGFoZWFkX2FiKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTggcGt0X3R5cGUsCkBAIC01MzksMjYgKzUzOSwyNyBAQAogCS8qIEdldCBTaWduYWxGaWVsZCxTZXJ2aWNlRmllbGQsTGVuZ3RoICovCiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIGZyYW1lX2xlbiwgcmF0ZSwgcGt0X3R5cGUsICZidWYtPmFiKTsKIAkvKiBHZXQgRHVyYXRpb24gYW5kIFRpbWVTdGFtcE9mZiAqLwotCWJ1Zi0+d0R1cmF0aW9uID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwogCi0JYnVmLT53VGltZVN0YW1wT2ZmID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsIHJhdGUpOworCWJ1Zi0+dGltZV9zdGFtcF9vZmYgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7CiAKLQlyZXR1cm4gYnVmLT53RHVyYXRpb247CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJ1Zi0+ZHVyYXRpb24pOwogfQogCiBzdGF0aWMgaW50IHZudF9maWxsX2llZWU4MDIxMV9ydHMoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAogCXN0cnVjdCBpZWVlODAyMTFfcnRzICpydHMsIHN0cnVjdCBldGhoZHIgKmV0aF9oZHIsCi0JCXUxNiBkdXJhdGlvbikKKwkJX19sZTE2IGR1cmF0aW9uKQogewogCXJ0cy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKIAlydHMtPmZyYW1lX2NvbnRyb2wgPSBUWVBFX0NUTF9SVFM7CiAKLQlpZiAocHJpdi0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DIHx8IHByaXYtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkKKwlpZiAocHJpdi0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCQkJCXByaXYtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCW1lbWNweShydHMtPnJhLCBldGhfaGRyLT5oX2Rlc3QsIEVUSF9BTEVOKTsKIAllbHNlCiAJCW1lbWNweShydHMtPnJhLCBwcml2LT5hYnlCU1NJRCwgRVRIX0FMRU4pOwogCi0JaWYgKHByaXYtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkKKwlpZiAocHJpdi0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJbWVtY3B5KHJ0cy0+dGEsIHByaXYtPmFieUJTU0lELCBFVEhfQUxFTik7CiAJZWxzZQogCQltZW1jcHkocnRzLT50YSwgZXRoX2hkci0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKQEAgLTU3OCwxNCArNTc5LDE0IEBACiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIHJ0c19mcmFtZV9sZW4sCiAJCXByaXYtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgcGt0X3R5cGUsICZidWYtPmEpOwogCi0JYnVmLT53RHVyYXRpb25fYmIgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkIsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2JiID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JCLCBmcmFtZV9sZW4sCiAJCVBLX1RZUEVfMTFCLCBwcml2LT5ieVRvcENDS0Jhc2ljUmF0ZSwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53RHVyYXRpb25fYWEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUEsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2FhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCiAJCXBrdF90eXBlLCBjdXJyZW50X3JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d0R1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT53RHVyYXRpb25fYWEpOworCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT5kdXJhdGlvbl9hYSk7CiAKIAlyZXR1cm4gdm50X3J4dHhfZGF0YWhlYWRfZyhwcml2LCBwa3RfdHlwZSwgY3VycmVudF9yYXRlLAogCQkJJmJ1Zi0+ZGF0YV9oZWFkLCBmcmFtZV9sZW4sIG5lZWRfYWNrKTsKQEAgLTYwNCwyNCArNjA1LDI0IEBACiAJCXByaXYtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgcGt0X3R5cGUsICZidWYtPmEpOwogCiAKLQlidWYtPndEdXJhdGlvbl9iYiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQiwgZnJhbWVfbGVuLAorCWJ1Zi0+ZHVyYXRpb25fYmIgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkIsIGZyYW1lX2xlbiwKIAkJUEtfVFlQRV8xMUIsIHByaXYtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKLQlidWYtPndEdXJhdGlvbl9hYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAorCWJ1Zi0+ZHVyYXRpb25fYWEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUEsIGZyYW1lX2xlbiwKIAkJcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53RHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkEsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBLCBmcmFtZV9sZW4sCiAJCXBrdF90eXBlLCBjdXJyZW50X3JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwogCiAKLQlidWYtPndSVFNEdXJhdGlvbl9iYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQV9GMCwKKwlidWYtPnJ0c19kdXJhdGlvbl9iYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQV9GMCwKIAkJZnJhbWVfbGVuLCBwa3RfdHlwZSwgcHJpdi0+dHhfcmF0ZV9mYjAsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d1JUU0R1cmF0aW9uX2FhX2YwID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YwLAorCWJ1Zi0+cnRzX2R1cmF0aW9uX2FhX2YwID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YwLAogCQlmcmFtZV9sZW4sIHBrdF90eXBlLCBwcml2LT50eF9yYXRlX2ZiMCwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53UlRTRHVyYXRpb25fYmFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkFfRjEsCisJYnVmLT5ydHNfZHVyYXRpb25fYmFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkFfRjEsCiAJCWZyYW1lX2xlbiwgcGt0X3R5cGUsIHByaXYtPnR4X3JhdGVfZmIxLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKLQlidWYtPndSVFNEdXJhdGlvbl9hYV9mMSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMSwKKwlidWYtPnJ0c19kdXJhdGlvbl9hYV9mMSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMSwKIAkJZnJhbWVfbGVuLCBwa3RfdHlwZSwgcHJpdi0+dHhfcmF0ZV9mYjEsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwogCi0Jdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPndEdXJhdGlvbl9hYSk7CisJdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPmR1cmF0aW9uX2FhKTsKIAogCXJldHVybiB2bnRfcnh0eF9kYXRhaGVhZF9nX2ZiKHByaXYsIHBrdF90eXBlLCBjdXJyZW50X3JhdGUsCiAJCQkmYnVmLT5kYXRhX2hlYWQsIGZyYW1lX2xlbiwgbmVlZF9hY2spOwpAQCAtNjM3LDEwICs2MzgsMTAgQEAKIAlCQnZDYWxjdWxhdGVQYXJhbWV0ZXIocHJpdiwgcnRzX2ZyYW1lX2xlbiwKIAkJcHJpdi0+YnlUb3BPRkRNQmFzaWNSYXRlLCBwa3RfdHlwZSwgJmJ1Zi0+YWIpOwogCi0JYnVmLT53RHVyYXRpb24gPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUEsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCiAJCXBrdF90eXBlLCBjdXJyZW50X3JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwogCi0Jdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPndEdXJhdGlvbik7CisJdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPmR1cmF0aW9uKTsKIAogCXJldHVybiB2bnRfcnh0eF9kYXRhaGVhZF9hYihwcml2LCBwa3RfdHlwZSwgY3VycmVudF9yYXRlLAogCQkJJmJ1Zi0+ZGF0YV9oZWFkLCBmcmFtZV9sZW4sIG5lZWRfYWNrKTsKQEAgLTY1NiwxNiArNjU3LDE2IEBACiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIHJ0c19mcmFtZV9sZW4sCiAJCXByaXYtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgcGt0X3R5cGUsICZidWYtPmEpOwogCi0JYnVmLT53RHVyYXRpb24gPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUEsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCiAJCXBrdF90eXBlLCBjdXJyZW50X3JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwogCi0JYnVmLT53UlRTRHVyYXRpb25fZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUFfRjAsCisJYnVmLT5ydHNfZHVyYXRpb25fZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUFfRjAsCiAJCWZyYW1lX2xlbiwgcGt0X3R5cGUsIHByaXYtPnR4X3JhdGVfZmIwLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCWJ1Zi0+d1JUU0R1cmF0aW9uX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YxLAorCWJ1Zi0+cnRzX2R1cmF0aW9uX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YxLAogCQlmcmFtZV9sZW4sIHBrdF90eXBlLCBwcml2LT50eF9yYXRlX2ZiMSwgbmVlZF9hY2ssIGZiX29wdGlvbik7CiAKLQl2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHByaXYsICZidWYtPmRhdGEsIGV0aF9oZHIsIGJ1Zi0+d0R1cmF0aW9uKTsKKwl2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHByaXYsICZidWYtPmRhdGEsIGV0aF9oZHIsIGJ1Zi0+ZHVyYXRpb24pOwogCiAJcmV0dXJuIHZudF9yeHR4X2RhdGFoZWFkX2FfZmIocHJpdiwgcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwKIAkJCSZidWYtPmRhdGFfaGVhZCwgZnJhbWVfbGVuLCBuZWVkX2Fjayk7CkBAIC03MjcsMTkgKzcyOCwxOSBAQAogCQkvKiBHZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aCAqLwogCQlCQnZDYWxjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgdUNUU0ZyYW1lTGVuLAogCQkJcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIFBLX1RZUEVfMTFCLCAmcEJ1Zi0+Yik7Ci0JCXBCdWYtPndEdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIENUU0RVUl9CQSwKKwkJcEJ1Zi0+ZHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBDVFNEVVJfQkEsCiAJCQljYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAJCQl3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsKIAkJLyogR2V0IENUU0R1cmF0aW9uX2JhX2YwICovCi0JCXBCdWYtPndDVFNEdXJhdGlvbl9iYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsCisJCXBCdWYtPmN0c19kdXJhdGlvbl9iYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsCiAJCQlDVFNEVVJfQkFfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKIAkJCXBEZXZpY2UtPnR4X3JhdGVfZmIwLCBiTmVlZEFjaywgYnlGQk9wdGlvbik7CiAJCS8qIEdldCBDVFNEdXJhdGlvbl9iYV9mMSAqLwotCQlwQnVmLT53Q1RTRHVyYXRpb25fYmFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAorCQlwQnVmLT5jdHNfZHVyYXRpb25fYmFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAogCQkJQ1RTRFVSX0JBX0YxLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAJCQlwRGV2aWNlLT50eF9yYXRlX2ZiMSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pOwogCQkvKiBHZXQgQ1RTIEZyYW1lIGJvZHkgKi8KLQkJcEJ1Zi0+ZGF0YS5kdXJhdGlvbiA9IHBCdWYtPndEdXJhdGlvbl9iYTsKKwkJcEJ1Zi0+ZGF0YS5kdXJhdGlvbiA9IHBCdWYtPmR1cmF0aW9uX2JhOwogCQlwQnVmLT5kYXRhLmZyYW1lX2NvbnRyb2wgPSBUWVBFX0NUTF9DVFM7CiAJCW1lbWNweShwQnVmLT5kYXRhLnJhLCBwRGV2aWNlLT5hYnlDdXJyZW50TmV0QWRkciwgRVRIX0FMRU4pOwogCkBAIC03NTEsMTEgKzc1MiwxMSBAQAogCQlCQnZDYWxjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgdUNUU0ZyYW1lTGVuLAogCQkJcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIFBLX1RZUEVfMTFCLCAmcEJ1Zi0+Yik7CiAJCS8qIEdldCBDVFNEdXJhdGlvbl9iYSAqLwotCQlwQnVmLT53RHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAorCQlwQnVmLT5kdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsCiAJCQlDVFNEVVJfQkEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKIAkJCXdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pOwogCQkvKkdldCBDVFMgRnJhbWUgYm9keSovCi0JCXBCdWYtPmRhdGEuZHVyYXRpb24gPSBwQnVmLT53RHVyYXRpb25fYmE7CisJCXBCdWYtPmRhdGEuZHVyYXRpb24gPSBwQnVmLT5kdXJhdGlvbl9iYTsKIAkJcEJ1Zi0+ZGF0YS5mcmFtZV9jb250cm9sID0gVFlQRV9DVExfQ1RTOwogCQltZW1jcHkocEJ1Zi0+ZGF0YS5yYSwgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIsIEVUSF9BTEVOKTsKIApAQCAtODE1LDE2ICs4MTYsMTYgQEAKIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfcnRzICpwQnVmID0KIAkJCQkJJnR4X2J1ZmZlci0+dHhfaGVhZC50eF9ydHMucnRzOwogCi0JCQlwQnVmLT53UlRTVHhScnZUaW1lX2FhID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAyLAorCQkJcEJ1Zi0+cnRzX3Jydl90aW1lX2FhID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAyLAogCQkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpOwotCQkJcEJ1Zi0+d1JUU1R4UnJ2VGltZV9iYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMSwKKwkJCXBCdWYtPnJ0c19ycnZfdGltZV9iYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMSwKIAkJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKLQkJCXBCdWYtPndSVFNUeFJydlRpbWVfYmIgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDAsCisJCQlwQnVmLT5ydHNfcnJ2X3RpbWVfYmIgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDAsCiAJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZV9hID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCisJCQlwQnVmLT5ycnZfdGltZV9hID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7Ci0JCQlwQnVmLT53VHhScnZUaW1lX2IgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lX2IgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQkJUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLAogCQkJCQlwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgYk5lZWRBQ0spOwogCkBAIC04NDUsMTMgKzg0NiwxMyBAQAogCQkJc3RydWN0IHZudF9ycnZfdGltZV9jdHMgKnBCdWYgPSAmdHhfYnVmZmVyLT4KIAkJCQkJCQl0eF9oZWFkLnR4X2N0cy5jdHM7CiAKLQkJCXBCdWYtPndUeFJydlRpbWVfYSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWVfYSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwotCQkJcEJ1Zi0+d1R4UnJ2VGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCisJCQlwQnVmLT5ycnZfdGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLAogCQkJCQlwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgYk5lZWRBQ0spOwogCi0JCQlwQnVmLT53Q1RTVHhScnZUaW1lX2JhID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAzLAorCQkJcEJ1Zi0+Y3RzX3Jydl90aW1lX2JhID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAzLAogCQkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpOwogCiAJCQlpZiAobmVlZF9taWMpIHsKQEAgLTg3OSwxMCArODgwLDEwIEBACiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpwQnVmID0gJnR4X2J1ZmZlci0+CiAJCQkJCQkJdHhfaGVhZC50eF9hYi5hYjsKIAotCQkJcEJ1Zi0+d1JUU1R4UnJ2VGltZSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwKKwkJCXBCdWYtPnJ0c19ycnZfdGltZSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwKIAkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpOwogCi0JCQlwQnVmLT53VHhScnZUaW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCisJCQlwQnVmLT5ycnZfdGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCiAJCQkvKiBGaWxsIFJUUyAqLwpAQCAtODkzLDcgKzg5NCw3IEBACiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpwQnVmID0gJnR4X2J1ZmZlci0+CiAJCQkJCQkJdHhfaGVhZC50eF9hYi5hYjsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlQS19UWVBFXzExQSwgY2JGcmFtZVNpemUsCiAJCQkJCXdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCkBAIC05MTMsMTAgKzkxNCwxMCBAQAogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqcEJ1ZiA9ICZ0eF9idWZmZXItPgogCQkJCQkJCXR4X2hlYWQudHhfYWIuYWI7CiAKLQkJCXBCdWYtPndSVFNUeFJydlRpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDAsCisJCQlwQnVmLT5ydHNfcnJ2X3RpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDAsCiAJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwKIAkJCQkJCQkJYk5lZWRBQ0spOwogCkBAIC05MjgsNyArOTI5LDcgQEAKIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgKnBCdWYgPSAmdHhfYnVmZmVyLT4KIAkJCQkJCQl0eF9oZWFkLnR4X2FiLmFiOwogCi0JCQlwQnVmLT53VHhScnZUaW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCisJCQlwQnVmLT5ycnZfdGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCVBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwKIAkJCQkJd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CiAKQEAgLTk5MSw4ICs5OTIsOCBAQAogICAgIC8vU2V0IHBhY2tldCB0eXBlCiAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgfD0gKHUxNikoYnlQa3RUeXBlPDw4KTsKIAotCWlmICgocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DKSB8fAotCQkJKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkpIHsKKwlpZiAocERldmljZS0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCQkJcERldmljZS0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHNFdGhIZWFkZXItPmhfZGVzdCkpIHsKIAkJCWJOZWVkQUNLID0gZmFsc2U7CiAJCQlwVHhCdWZIZWFkLT53RklGT0N0bCA9CkBAIC0xMjkyLDcgKzEyOTMsNyBAQAogCiAJcE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCA9IFRZUEVfODAyXzExX0RBVEE7CiAKLSAgICBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSB7CisgICAgaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAltZW1jcHkoJihwTUFDSGVhZGVyLT5hZGRyMVswXSksCiAJICAgICAgICYocHNFdGhIZWFkZXItPmhfZGVzdFswXSksCiAJICAgICAgIEVUSF9BTEVOKTsKQEAgLTEzMDIsNyArMTMwMyw3IEBACiAJICAgICAgIEVUSF9BTEVOKTsKICAgICAgICAgcE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCB8PSBGQ19GUk9NRFM7CiAgICAgfSBlbHNlIHsKLQlpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DKSB7CisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJbWVtY3B5KCYocE1BQ0hlYWRlci0+YWRkcjFbMF0pLAogCQkgICAgICAgJihwc0V0aEhlYWRlci0+aF9kZXN0WzBdKSwKIAkJICAgICAgIEVUSF9BTEVOKTsKQEAgLTE1NDEsOCArMTU0Miw4IEBACiAgICAgICAgIHBieUlWSGVhZCA9ICh1OCAqKShwYnlUeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcpOwogICAgICAgICBwYnlQYXlsb2FkSGVhZCA9ICh1OCAqKShwYnlUeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcgKyBjYklWbGVuKTsKICAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfSU5GUkFTVFJVQ1RVUkUpICYmCi0gICAgICAgICAgICAgICAgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSkgeworCSAgICBpZiAocERldmljZS0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJCQkJCXBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgcGJ5QlNTSUQgPSBwRGV2aWNlLT5hYnlCU1NJRDsKICAgICAgICAgICAgICAgICAvLyBnZXQgcGFpcndpc2Uga2V5CiAgICAgICAgICAgICAgICAgaWYgKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgUEFJUldJU0VfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBmYWxzZSkgewpAQCAtMTU2MCw3ICsxNTYxLDcgQEAKICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QnJvYWRjYXN0QWRkcjsKICAgICAgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgR1JPVVBfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIHBUcmFuc21pdEtleSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJLRVkgaXMgTlVMTC4gT1AgTW9kZVslZF1cbiIsIHBEZXZpY2UtPmVPUE1vZGUpOworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIktFWSBpcyBOVUxMLiBPUCBNb2RlWyVkXVxuIiwgcERldmljZS0+b3BfbW9kZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iR2V0IEdUSy5cbiIpOwogICAgICAgICAgICAgfQpAQCAtMTU5MiwxNCArMTU5MywxNCBAQAogCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsKIAkJc3RydWN0IHZudF90eF9kYXRhaGVhZF9nICpkYXRhX2hlYWQgPSAmcFRYX0J1ZmZlci0+dHhfaGVhZC4KIAkJCQkJCXR4X2N0cy50eC5oZWFkLmN0c19nLmRhdGFfaGVhZDsKLQkJZGF0YV9oZWFkLT53RHVyYXRpb25fYSA9CisJCWRhdGFfaGVhZC0+ZHVyYXRpb25fYSA9CiAJCQljcHVfdG9fbGUxNihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi53RHVyYXRpb25JRCk7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uX2IgPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uX2IgPQogCQkJY3B1X3RvX2xlMTYocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYWIgKmRhdGFfaGVhZCA9ICZwVFhfQnVmZmVyLT50eF9oZWFkLgogCQkJCQl0eF9hYi50eC5oZWFkLmRhdGFfaGVhZF9hYjsKLQkJZGF0YV9oZWFkLT53RHVyYXRpb24gPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uID0KIAkJCWNwdV90b19sZTE2KHBQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEKTsKIAl9CiAgICAgfQpAQCAtMTYwOSw3ICsxNjEwLDcgQEAKICAgICBwVFhfQnVmZmVyLT5ieVR5cGUgPSAweDAwOwogCiAgICAgcENvbnRleHQtPnBQYWNrZXQgPSBOVUxMOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KWNiUmVxQ291bnQgKyA0OyAgLy9VU0IgaGVhZGVyCiAKICAgICBpZiAoV0xBTl9HRVRfRkNfVE9EUyhwTUFDSGVhZGVyLT5mcmFtZV9jb250cm9sKSA9PSAwKSB7CkBAIC0xNzAxLDcgKzE3MDIsNyBAQAogICAgIHBUWF9CdWZmZXItPmJ5VHlwZSA9IDB4MDE7CiAKICAgICBwQ29udGV4dC0+cFBhY2tldCA9IE5VTEw7Ci0gICAgcENvbnRleHQtPlR5cGUgPSBDT05URVhUX01HTVRfUEFDS0VUOworICAgIHBDb250ZXh0LT50eXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKICAgICBwQ29udGV4dC0+dUJ1ZkxlbiA9ICh1MTYpY2JSZXFDb3VudCArIDQ7ICAvL1VTQiBoZWFkZXIKIAogICAgIFBJUEVuc1NlbmRCdWxrT3V0KHBEZXZpY2UscENvbnRleHQpOwpAQCAtMjAzMiwxNCArMjAzMywxNCBAQAogCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsKIAkJc3RydWN0IHZudF90eF9kYXRhaGVhZF9nICpkYXRhX2hlYWQgPSAmcFRYX0J1ZmZlci0+dHhfaGVhZC4KIAkJCQkJCXR4X2N0cy50eC5oZWFkLmN0c19nLmRhdGFfaGVhZDsKLQkJZGF0YV9oZWFkLT53RHVyYXRpb25fYSA9CisJCWRhdGFfaGVhZC0+ZHVyYXRpb25fYSA9CiAJCQljcHVfdG9fbGUxNihwODAyMTFIZWFkZXItPnNBMi53RHVyYXRpb25JRCk7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uX2IgPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uX2IgPQogCQkJY3B1X3RvX2xlMTYocDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYWIgKmRhdGFfaGVhZCA9ICZwVFhfQnVmZmVyLT50eF9oZWFkLgogCQkJCQl0eF9hYi50eC5oZWFkLmRhdGFfaGVhZF9hYjsKLQkJZGF0YV9oZWFkLT53RHVyYXRpb24gPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uID0KIAkJCWNwdV90b19sZTE2KHA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEKTsKIAl9CiAgICAgfQpAQCAtMjA0OSw3ICsyMDUwLDcgQEAKICAgICBwVFhfQnVmZmVyLT5ieVR5cGUgPSAweDAwOwogCiAgICAgcENvbnRleHQtPnBQYWNrZXQgPSBza2I7Ci0gICAgcENvbnRleHQtPlR5cGUgPSBDT05URVhUX01HTVRfUEFDS0VUOworICAgIHBDb250ZXh0LT50eXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKICAgICBwQ29udGV4dC0+dUJ1ZkxlbiA9ICh1MTYpY2JSZXFDb3VudCArIDQ7ICAvL1VTQiBoZWFkZXIKIAogICAgIGlmIChXTEFOX0dFVF9GQ19UT0RTKHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wpID09IDApIHsKQEAgLTIzMDUsNyArMjMwNiw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQURIT0MpIHsKKwlpZiAocERldmljZS0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogICAgICAgICAgICAgLy8gQWRob2MgVHggcmF0ZSBkZWNpZGVkIGZyb20gbm9kZSBEQgogCSAgICBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocERldmljZS0+c1R4RXRoSGVhZGVyLmhfZGVzdCkpIHsKICAgICAgICAgICAgICAgICAvLyBNdWx0aWNhc3QgdXNlIGhpZ2hlc3QgZGF0YSByYXRlCkBAIC0yMzM2LDcgKzIzMzcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKSB7CisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewogICAgICAgICAgICAgLy8gSW5mcmEgU1RBIHJhdGUgZGVjaWRlZCBmcm9tIEFQIE5vZGUsIGluZGV4ID0gMAogICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gcE1nbXQtPnNOb2RlREJUYWJsZVswXS53VHhEYXRhUmF0ZTsKICAgICAgICAgfQpAQCAtMjQzOSwxMSArMjQ0MCwxMSBAQAogICAgIHBUWF9CdWZmZXItPndUeEJ5dGVDb3VudCA9ICh1MTYpQnl0ZXNUb1dyaXRlOwogCiAgICAgcENvbnRleHQtPnBQYWNrZXQgPSBza2I7Ci0gICAgcENvbnRleHQtPlR5cGUgPSBDT05URVhUX0RBVEFfUEFDS0VUOworICAgIHBDb250ZXh0LT50eXBlID0gQ09OVEVYVF9EQVRBX1BBQ0tFVDsKICAgICBwQ29udGV4dC0+dUJ1ZkxlbiA9ICh1MTYpQnl0ZXNUb1dyaXRlICsgNCA7IC8vVVNCIGhlYWRlcgogCiAgICAgc192U2F2ZVR4UGt0SW5mbyhwRGV2aWNlLCAodTgpKHBUWF9CdWZmZXItPmJ5UEtUTk8gJiAweDBGKSwKLQkJCSZwQ29udGV4dC0+c0V0aEhlYWRlci5oX2Rlc3RbMF0sCisJCQkmcERldmljZS0+c1R4RXRoSGVhZGVyLmhfZGVzdFswXSwKIAkJCSh1MTYpKEJ5dGVzVG9Xcml0ZS11SGVhZGVyTGVuKSwKIAkJCXBUWF9CdWZmZXItPmZpZm9faGVhZC53RklGT0N0bCk7CiAKQEAgLTI1OTMsMTEgKzI1OTQsMTEgQEAKICAgICBwVFhfQnVmZmVyLT53VHhCeXRlQ291bnQgPSAodTE2KUJ5dGVzVG9Xcml0ZTsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKLSAgICBwQ29udGV4dC0+VHlwZSA9IENPTlRFWFRfREFUQV9QQUNLRVQ7CisgICAgcENvbnRleHQtPnR5cGUgPSBDT05URVhUX0RBVEFfUEFDS0VUOwogICAgIHBDb250ZXh0LT51QnVmTGVuID0gKHUxNilCeXRlc1RvV3JpdGUgKyA0IDsgLy9VU0IgaGVhZGVyCiAKICAgICBzX3ZTYXZlVHhQa3RJbmZvKHBEZXZpY2UsICh1OCkocFRYX0J1ZmZlci0+YnlQS1ROTyAmIDB4MEYpLAotCQkmcENvbnRleHQtPnNFdGhIZWFkZXIuaF9kZXN0WzBdLAorCQkmcERldmljZS0+c1R4RXRoSGVhZGVyLmhfZGVzdFswXSwKIAkJKHUxNikoQnl0ZXNUb1dyaXRlIC0gdUhlYWRlckxlbiksCiAJCXBUWF9CdWZmZXItPmZpZm9faGVhZC53RklGT0N0bCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmgKaW5kZXggYjNlZTZkMC4uNmQ2NTM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmgKQEAgLTUzLDY4ICs1Myw2OCBAQAogCiAvKiBSc3ZUaW1lIGJ1ZmZlciBoZWFkZXIgKi8KIHN0cnVjdCB2bnRfcnJ2X3RpbWVfcnRzIHsKLQl1MTYgd1JUU1R4UnJ2VGltZV9iYTsKLQl1MTYgd1JUU1R4UnJ2VGltZV9hYTsKLQl1MTYgd1JUU1R4UnJ2VGltZV9iYjsKKwlfX2xlMTYgcnRzX3Jydl90aW1lX2JhOworCV9fbGUxNiBydHNfcnJ2X3RpbWVfYWE7CisJX19sZTE2IHJ0c19ycnZfdGltZV9iYjsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3VHhScnZUaW1lX2I7Ci0JdTE2IHdUeFJydlRpbWVfYTsKKwlfX2xlMTYgcnJ2X3RpbWVfYjsKKwlfX2xlMTYgcnJ2X3RpbWVfYTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfcnJ2X3RpbWVfY3RzIHsKLQl1MTYgd0NUU1R4UnJ2VGltZV9iYTsKKwlfX2xlMTYgY3RzX3Jydl90aW1lX2JhOwogCXUxNiB3UmVzZXJ2ZWQ7Ci0JdTE2IHdUeFJydlRpbWVfYjsKLQl1MTYgd1R4UnJ2VGltZV9hOworCV9fbGUxNiBycnZfdGltZV9iOworCV9fbGUxNiBycnZfdGltZV9hOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHZudF9ycnZfdGltZV9hYiB7Ci0JdTE2IHdSVFNUeFJydlRpbWU7Ci0JdTE2IHdUeFJydlRpbWU7CisJX19sZTE2IHJ0c19ycnZfdGltZTsKKwlfX2xlMTYgcnJ2X3RpbWU7CiB9IF9fcGFja2VkOwogCiAvKiBUWCBkYXRhIGhlYWRlciAqLwogc3RydWN0IHZudF90eF9kYXRhaGVhZF9nIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBiOwogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGE7Ci0JdTE2IHdEdXJhdGlvbl9iOwotCXUxNiB3RHVyYXRpb25fYTsKLQl1MTYgd1RpbWVTdGFtcE9mZl9iOwotCXUxNiB3VGltZVN0YW1wT2ZmX2E7CisJX19sZTE2IGR1cmF0aW9uX2I7CisJX19sZTE2IGR1cmF0aW9uX2E7CisJX19sZTE2IHRpbWVfc3RhbXBfb2ZmX2I7CisJX19sZTE2IHRpbWVfc3RhbXBfb2ZmX2E7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2dfZmIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGI7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uX2I7Ci0JdTE2IHdEdXJhdGlvbl9hOwotCXUxNiB3RHVyYXRpb25fYV9mMDsKLQl1MTYgd0R1cmF0aW9uX2FfZjE7Ci0JdTE2IHdUaW1lU3RhbXBPZmZfYjsKLQl1MTYgd1RpbWVTdGFtcE9mZl9hOworCV9fbGUxNiBkdXJhdGlvbl9iOworCV9fbGUxNiBkdXJhdGlvbl9hOworCV9fbGUxNiBkdXJhdGlvbl9hX2YwOworCV9fbGUxNiBkdXJhdGlvbl9hX2YxOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZl9iOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZl9hOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHZudF90eF9kYXRhaGVhZF9hYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYWI7Ci0JdTE2IHdEdXJhdGlvbjsKLQl1MTYgd1RpbWVTdGFtcE9mZjsKKwlfX2xlMTYgZHVyYXRpb247CisJX19sZTE2IHRpbWVfc3RhbXBfb2ZmOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHZudF90eF9kYXRhaGVhZF9hX2ZiIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb247Ci0JdTE2IHdUaW1lU3RhbXBPZmY7Ci0JdTE2IHdEdXJhdGlvbl9mMDsKLQl1MTYgd0R1cmF0aW9uX2YxOworCV9fbGUxNiBkdXJhdGlvbjsKKwlfX2xlMTYgdGltZV9zdGFtcF9vZmY7CisJX19sZTE2IGR1cmF0aW9uX2YwOworCV9fbGUxNiBkdXJhdGlvbl9mMTsKIH0gX19wYWNrZWQ7CiAKIC8qIFJUUyBidWZmZXIgaGVhZGVyICovCiBzdHJ1Y3Qgdm50X3J0c19nIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBiOwogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGE7Ci0JdTE2IHdEdXJhdGlvbl9iYTsKLQl1MTYgd0R1cmF0aW9uX2FhOwotCXUxNiB3RHVyYXRpb25fYmI7CisJX19sZTE2IGR1cmF0aW9uX2JhOworCV9fbGUxNiBkdXJhdGlvbl9hYTsKKwlfX2xlMTYgZHVyYXRpb25fYmI7CiAJdTE2IHdSZXNlcnZlZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBkYXRhOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyBkYXRhX2hlYWQ7CkBAIC0xMjMsMjEgKzEyMywyMSBAQAogc3RydWN0IHZudF9ydHNfZ19mYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYjsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb25fYmE7Ci0JdTE2IHdEdXJhdGlvbl9hYTsKLQl1MTYgd0R1cmF0aW9uX2JiOworCV9fbGUxNiBkdXJhdGlvbl9iYTsKKwlfX2xlMTYgZHVyYXRpb25fYWE7CisJX19sZTE2IGR1cmF0aW9uX2JiOwogCXUxNiB3UmVzZXJ2ZWQ7Ci0JdTE2IHdSVFNEdXJhdGlvbl9iYV9mMDsKLQl1MTYgd1JUU0R1cmF0aW9uX2FhX2YwOwotCXUxNiB3UlRTRHVyYXRpb25fYmFfZjE7Ci0JdTE2IHdSVFNEdXJhdGlvbl9hYV9mMTsKKwlfX2xlMTYgcnRzX2R1cmF0aW9uX2JhX2YwOworCV9fbGUxNiBydHNfZHVyYXRpb25fYWFfZjA7CisJX19sZTE2IHJ0c19kdXJhdGlvbl9iYV9mMTsKKwlfX2xlMTYgcnRzX2R1cmF0aW9uX2FhX2YxOwogCXN0cnVjdCBpZWVlODAyMTFfcnRzIGRhdGE7CiAJc3RydWN0IHZudF90eF9kYXRhaGVhZF9nX2ZiIGRhdGFfaGVhZDsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfcnRzX2FiIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhYjsKLQl1MTYgd0R1cmF0aW9uOworCV9fbGUxNiBkdXJhdGlvbjsKIAl1MTYgd1Jlc2VydmVkOwogCXN0cnVjdCBpZWVlODAyMTFfcnRzIGRhdGE7CiAJc3RydWN0IHZudF90eF9kYXRhaGVhZF9hYiBkYXRhX2hlYWQ7CkBAIC0xNDUsMTAgKzE0NSwxMCBAQAogCiBzdHJ1Y3Qgdm50X3J0c19hX2ZiIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb247CisJX19sZTE2IGR1cmF0aW9uOwogCXUxNiB3UmVzZXJ2ZWQ7Ci0JdTE2IHdSVFNEdXJhdGlvbl9mMDsKLQl1MTYgd1JUU0R1cmF0aW9uX2YxOworCV9fbGUxNiBydHNfZHVyYXRpb25fZjA7CisJX19sZTE2IHJ0c19kdXJhdGlvbl9mMTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBkYXRhOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYV9mYiBkYXRhX2hlYWQ7CiB9IF9fcGFja2VkOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAvKiBDVFMgYnVmZmVyIGhlYWRlciAqLwogc3RydWN0IHZudF9jdHMgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGI7Ci0JdTE2IHdEdXJhdGlvbl9iYTsKKwlfX2xlMTYgZHVyYXRpb25fYmE7CiAJdTE2IHdSZXNlcnZlZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2N0cyBkYXRhOwogCXUxNiByZXNlcnZlZDI7CkBAIC0xNjUsMTAgKzE2NSwxMCBAQAogCiBzdHJ1Y3Qgdm50X2N0c19mYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYjsKLQl1MTYgd0R1cmF0aW9uX2JhOworCV9fbGUxNiBkdXJhdGlvbl9iYTsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3Q1RTRHVyYXRpb25fYmFfZjA7Ci0JdTE2IHdDVFNEdXJhdGlvbl9iYV9mMTsKKwlfX2xlMTYgY3RzX2R1cmF0aW9uX2JhX2YwOworCV9fbGUxNiBjdHNfZHVyYXRpb25fYmFfZjE7CiAJc3RydWN0IGllZWU4MDIxMV9jdHMgZGF0YTsKIAl1MTYgcmVzZXJ2ZWQyOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZ19mYiBkYXRhX2hlYWQ7CkBAIC0yMzQsOCArMjM0LDggQEAKIAl1MTYgZmlmb19jdGw7CiAJdTE2IHRpbWVfc3RhbXA7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYWI7Ci0JdTE2IGR1cmF0aW9uOwotCXUxNiB0aW1lX3N0YW1wX29mZjsKKwlfX2xlMTYgZHVyYXRpb247CisJX19sZTE2IHRpbWVfc3RhbXBfb2ZmOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHZudF9iZWFjb25fYnVmZmVyIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKaW5kZXggMDFjZjA5OS4uYzU4MzhkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKQEAgLTEwNSw2ICsxMDUsOCBAQAogCiBpbnQgUElQRW5zQ29udHJvbE91dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU4IGJ5UmVxdWVzdCwgdTE2IHdWYWx1ZSwKIAkJdTE2IHdJbmRleCwgdTE2IHdMZW5ndGgsIHU4ICpwYnlCdWZmZXIpCisJCV9fcmVsZWFzZXMoJnBEZXZpY2UtPmxvY2spCisJCV9fYWNxdWlyZXMoJnBEZXZpY2UtPmxvY2spCiB7CiAJaW50IG50U3RhdHVzID0gMDsKIAlpbnQgaWk7CkBAIC0xNjcsNiArMTY5LDggQEAKIAogaW50IFBJUEVuc0NvbnRyb2xJbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU4IGJ5UmVxdWVzdCwgdTE2IHdWYWx1ZSwKIAl1MTYgd0luZGV4LCB1MTYgd0xlbmd0aCwgIHU4ICpwYnlCdWZmZXIpCisJX19yZWxlYXNlcygmcERldmljZS0+bG9jaykKKwlfX2FjcXVpcmVzKCZwRGV2aWNlLT5sb2NrKQogewogCWludCBudFN0YXR1cyA9IDA7CiAJaW50IGlpOwpAQCAtMjk1LDQwICsyOTksMzggQEAKICAqCiAgKi8KIAotaW50IFBJUEVuc0ludGVycnVwdFJlYWQoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQoraW50IFBJUEVuc0ludGVycnVwdFJlYWQoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCWludCBudFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCWludCBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zU3RhcnRJbnRlcnJ1cHRVc2JSZWFkKClcbiIpOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSItLS0tPnNfbnNTdGFydEludGVycnVwdFVzYlJlYWQoKVxuIik7CiAKLSAgICBpZihwRGV2aWNlLT5pbnRCdWYuYkluVXNlID09IHRydWUpewotICAgICAgICByZXR1cm4gKFNUQVRVU19GQUlMVVJFKTsKLSAgICB9Ci0gICAgcERldmljZS0+aW50QnVmLmJJblVzZSA9IHRydWU7Ci0vLyAgICBwRGV2aWNlLT5iRXZlbnRBdmFpbGFibGUgPSBmYWxzZTsKLSAgICBwRGV2aWNlLT51bEludEluUG9zdGVkKys7CisJaWYgKHByaXYtPmludF9idWYuaW5fdXNlID09IHRydWUpCisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKIAotICAgIC8vCi0gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBjcmVhdGVkIHRoZSB1cmIsIHdlIHdpbGwgc2VuZCBhCi0gICAgLy8gcmVxdWVzdCB0byB0aGUgVVNCIGRldmljZSBvYmplY3QuCi0gICAgLy8KLSAgICBwRGV2aWNlLT5wSW50ZXJydXB0VVJCLT5pbnRlcnZhbCA9IHBEZXZpY2UtPmludF9pbnRlcnZhbDsKKwlwcml2LT5pbnRfYnVmLmluX3VzZSA9IHRydWU7CiAKLXVzYl9maWxsX2J1bGtfdXJiKHBEZXZpY2UtPnBJbnRlcnJ1cHRVUkIsCi0JCXBEZXZpY2UtPnVzYiwKLQkJdXNiX3JjdmJ1bGtwaXBlKHBEZXZpY2UtPnVzYiwgMSksCi0JCSh2b2lkICopIHBEZXZpY2UtPmludEJ1Zi5wRGF0YUJ1ZiwKKwl1c2JfZmlsbF9pbnRfdXJiKHByaXYtPnBJbnRlcnJ1cHRVUkIsCisJCXByaXYtPnVzYiwKKwkJdXNiX3JjdmludHBpcGUocHJpdi0+dXNiLCAxKSwKKwkJcHJpdi0+aW50X2J1Zi5kYXRhX2J1ZiwKIAkJTUFYX0lOVEVSUlVQVF9TSVpFLAogCQlzX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWQsCi0JCXBEZXZpY2UpOworCQlwcml2LAorCQlwcml2LT5pbnRfaW50ZXJ2YWwpOwogCi0JbnRTdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLCBHRlBfQVRPTUlDKTsKLQlpZiAobnRTdGF0dXMgIT0gMCkgewotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlN1Ym1pdCBpbnQgVVJCIGZhaWxlZCAlZFxuIiwgbnRTdGF0dXMpOwotICAgIH0KKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5wSW50ZXJydXB0VVJCLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CisJCXByaXYtPmludF9idWYuaW5fdXNlID0gZmFsc2U7CisJfQogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyI8LS0tLXNfbnNTdGFydEludGVycnVwdFVzYlJlYWQgUmV0dXJuKCV4KVxuIixudFN0YXR1cyk7Ci0gICAgcmV0dXJuIG50U3RhdHVzOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJIjwtLS0tc19uc1N0YXJ0SW50ZXJydXB0VXNiUmVhZCBSZXR1cm4oJXgpXG4iLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKQEAgLTM0OCw2NyArMzUwLDQ4IEBACiAKIHN0YXRpYyB2b2lkIHNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlID0gKHN0cnVjdCB2bnRfcHJpdmF0ZSAqKXVyYi0+Y29udGV4dDsKLQlpbnQgbnRTdGF0dXM7CisJc3RydWN0IHZudF9wcml2YXRlICpwcml2ID0gdXJiLT5jb250ZXh0OworCWludCBzdGF0dXM7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkXG4iKTsKLSAgICAvLwotICAgIC8vIFRoZSBjb250ZXh0IGdpdmVuIHRvIElvU2V0Q29tcGxldGlvblJvdXRpbmUgaXMgdGhlIHJlY2VpdmUgYnVmZmVyIG9iamVjdAotICAgIC8vCisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJIi0tLS0+c19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkXG4iKTsKIAotICAgIC8vCi0gICAgLy8gV2UgaGF2ZSBhIG51bWJlciBvZiBjYXNlczoKLSAgICAvLyAgICAgIDEpIFRoZSBVU0IgcmVhZCB0aW1lZCBvdXQgYW5kIHdlIHJlY2VpdmVkIG5vIGRhdGEuCi0gICAgLy8gICAgICAyKSBUaGUgVVNCIHJlYWQgdGltZWQgb3V0IGFuZCB3ZSByZWNlaXZlZCBzb21lIGRhdGEuCi0gICAgLy8gICAgICAzKSBUaGUgVVNCIHJlYWQgd2FzIHN1Y2Nlc3NmdWwgYW5kIGZ1bGx5IGZpbGxlZCBvdXIgaXJwIGJ1ZmZlci4KLSAgICAvLyAgICAgIDQpIFRoZSBpcnAgd2FzIGNhbmNlbGxlZC4KLSAgICAvLyAgICAgIDUpIFNvbWUgb3RoZXIgZmFpbHVyZSBmcm9tIHRoZSBVU0IgZGV2aWNlIG9iamVjdC4KLSAgICAvLwotICAgIG50U3RhdHVzID0gdXJiLT5zdGF0dXM7CisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwljYXNlIC1FVElNRURPVVQ6CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcHJpdi0+aW50X2J1Zi5pbl91c2UgPSBmYWxzZTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8ic19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkIFN0YXR1cyAlZFxuIiwgbnRTdGF0dXMpOworCXN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0gICAgLy8gaWYgd2Ugd2VyZSBub3Qgc3VjY2Vzc2Z1bCwgd2UgbmVlZCB0byBmcmVlIHRoZSBpbnQgYnVmZmVyIGZvciBmdXR1cmUgdXNlIHJpZ2h0IGhlcmUKLSAgICAvLyBvdGhlcndpc2UgaW50ZXJydXB0IGRhdGEgaGFuZGxlciB3aWxsIGZyZWUgaW50IGJ1ZmZlciBhZnRlciBpdCBoYW5kbGUgaXQuCi0gICAgaWYgKCggbnRTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MgKSkgewotICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkVycm9yKys7Ci0gICAgICAgIHBEZXZpY2UtPmludEJ1Zi5iSW5Vc2UgPSBmYWxzZTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCSJzX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWQgU3RhdHVzICVkXG4iLCBzdGF0dXMpOwogCi0vLyAgICAgICAgaWYgKG50U3RhdHVzID09IFVTQkRfU1RBVFVTX0NSQykgewotLy8gICAgICAgICAgICBwRGV2aWNlLT51bEludEluQ29udENSQ0Vycm9yKys7Ci0vLyAgICAgICAgfQorCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcHJpdi0+aW50X2J1Zi5pbl91c2UgPSBmYWxzZTsKIAotLy8gICAgICAgIGlmIChudFN0YXR1cyA9PSBTVEFUVVNfTk9UX0NPTk5FQ1RFRCApCi0vLyAgICAgICAgewotICAgICAgICAgICAgcERldmljZS0+ZktpbGxFdmVudFBvbGxpbmdUaHJlYWQgPSB0cnVlOwotLy8gICAgICAgIH0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJJbnRVU0JJb0NvbXBsZXRlQ29udHJvbCBTVEFUVVMgPSAlZFxuIiwgbnRTdGF0dXMgKTsKLSAgICB9IGVsc2UgewotCSAgICBwRGV2aWNlLT51bEludEluQnl0ZXNSZWFkICs9ICh1bnNpZ25lZCBsb25nKSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0JICAgIHBEZXZpY2UtPnVsSW50SW5Db250Q1JDRXJyb3IgPSAwOwotCSAgICBwRGV2aWNlLT5iRXZlbnRBdmFpbGFibGUgPSB0cnVlOwotCSAgICBJTlRuc1Byb2Nlc3NEYXRhKHBEZXZpY2UpOwotICAgIH0KKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJIkludFVTQklvQ29tcGxldGVDb250cm9sIFNUQVRVUyA9ICVkXG4iLCBzdGF0dXMpOworCX0gZWxzZSB7CisJCUlOVG5zUHJvY2Vzc0RhdGEocHJpdik7CisJfQogCi0gICAgaWYgKHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkICE9IHRydWUpIHsKLSAgICAgICB1c2JfZmlsbF9idWxrX3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLAotCQkgICAgICBwRGV2aWNlLT51c2IsCi0JCSAgICAgIHVzYl9yY3ZidWxrcGlwZShwRGV2aWNlLT51c2IsIDEpLAotCQkgICAgICh2b2lkICopIHBEZXZpY2UtPmludEJ1Zi5wRGF0YUJ1ZiwKLQkJICAgICBNQVhfSU5URVJSVVBUX1NJWkUsCi0JCSAgICAgc19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkLAotCQkgICAgIHBEZXZpY2UpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnBJbnRlcnJ1cHRVUkIsIEdGUF9BVE9NSUMpOworCWlmIChzdGF0dXMpIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJIlN1Ym1pdCBpbnQgVVJCIGZhaWxlZCAlZFxuIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCQlwcml2LT5pbnRfYnVmLmluX3VzZSA9IHRydWU7CisJfQogCi0JbnRTdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLCBHRlBfQVRPTUlDKTsKLQlpZiAobnRTdGF0dXMgIT0gMCkgewotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlN1Ym1pdCBpbnQgVVJCIGZhaWxlZCAlZFxuIiwgbnRTdGF0dXMpOwotICAgICAgICAgICB9Ci0gICAgfQotICAgIC8vCi0gICAgLy8gV2UgcmV0dXJuIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQgc28gdGhhdCB0aGUgY29tcGxldGlvbgotICAgIC8vIHJvdXRpbmUgKElvZkNvbXBsZXRlUmVxdWVzdCkgd2lsbCBzdG9wIHdvcmtpbmcgb24gdGhlIGlycC4KLSAgICAvLwotICAgIHJldHVybiA7CisJcmV0dXJuOwogfQogCiAvKgpAQCAtNDI1LDQ1ICs0MDgsNDEgQEAKICAqCiAgKi8KIAotaW50IFBJUEVuc0J1bGtJblVzYlJlYWQoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCBzdHJ1Y3Qgdm50X3JjYiAqcFJDQikKK2ludCBQSVBFbnNCdWxrSW5Vc2JSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IHZudF9yY2IgKnJjYikKIHsKLQlpbnQgbnRTdGF0dXMgPSAwOwotCXN0cnVjdCB1cmIgKnBVcmI7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHVyYiAqdXJiOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNTdGFydEJ1bGtJblVzYlJlYWRcbiIpOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zU3RhcnRCdWxrSW5Vc2JSZWFkXG4iKTsKIAotICAgIGlmIChwRGV2aWNlLT5GbGFncyAmIGZNUF9ESVNDT05ORUNURUQpCi0gICAgICAgIHJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwlpZiAocHJpdi0+RmxhZ3MgJiBmTVBfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAKLSAgICBwRGV2aWNlLT51bEJ1bGtJblBvc3RlZCsrOworCXVyYiA9IHJjYi0+cFVyYjsKKwlpZiAocmNiLT5za2IgPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInJjYi0+c2tiIGlzIG51bGxcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KIAotCXBVcmIgPSBwUkNCLT5wVXJiOwotICAgIC8vCi0gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBjcmVhdGVkIHRoZSB1cmIsIHdlIHdpbGwgc2VuZCBhCi0gICAgLy8gcmVxdWVzdCB0byB0aGUgVVNCIGRldmljZSBvYmplY3QuCi0gICAgLy8KLSAgICBpZiAocFJDQi0+c2tiID09IE5VTEwpIHsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJwUkNCLT5za2IgaXMgbnVsbCBcbiIpOwotICAgICAgICByZXR1cm4gbnRTdGF0dXM7Ci0gICAgfQotCi0JdXNiX2ZpbGxfYnVsa191cmIocFVyYiwKLQkJcERldmljZS0+dXNiLAotCQl1c2JfcmN2YnVsa3BpcGUocERldmljZS0+dXNiLCAyKSwKLQkJKHZvaWQgKikgKHBSQ0ItPnNrYi0+ZGF0YSksCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLAorCQlwcml2LT51c2IsCisJCXVzYl9yY3ZidWxrcGlwZShwcml2LT51c2IsIDIpLAorCQkodm9pZCAqKSAocmNiLT5za2ItPmRhdGEpLAogCQlNQVhfVE9UQUxfU0laRV9XSVRIX0FMTF9IRUFERVJTLAogCQlzX25zQnVsa0luVXNiSW9Db21wbGV0ZVJlYWQsCi0JCXBSQ0IpOworCQlyY2IpOwogCi0JbnRTdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwVXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAobnRTdGF0dXMgIT0gMCkgewotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlN1Ym1pdCBSeCBVUkIgZmFpbGVkICVkXG4iLCBudFN0YXR1cyk7CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJCSJTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgc3RhdHVzKTsKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFIDsKIAl9Ci0gICAgcFJDQi0+UmVmID0gMTsKLSAgICBwUkNCLT5iQm9vbEluVXNlPSB0cnVlOwogCi0gICAgcmV0dXJuIG50U3RhdHVzOworCXJjYi0+UmVmID0gMTsKKwlyY2ItPmJCb29sSW5Vc2UgPSB0cnVlOworCisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKQEAgLTQ4Myw1MSArNDYyLDQ3IEBACiAKIHN0YXRpYyB2b2lkIHNfbnNCdWxrSW5Vc2JJb0NvbXBsZXRlUmVhZChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHZudF9yY2IgKnBSQ0IgPSAoc3RydWN0IHZudF9yY2IgKil1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlID0gcFJDQi0+cERldmljZTsKLQl1bnNpZ25lZCBsb25nICAgYnl0ZXNSZWFkOwotCWludCBiSW5kaWNhdGVSZWNlaXZlID0gZmFsc2U7Ci0JaW50IGJSZUFsbG9jU2tiID0gZmFsc2U7Ci0JaW50IHN0YXR1czsKKwlzdHJ1Y3Qgdm50X3JjYiAqcmNiID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IHJjYi0+cERldmljZTsKKwlpbnQgcmVfYWxsb2Nfc2tiID0gZmFsc2U7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0J1bGtJblVzYklvQ29tcGxldGVSZWFkXG4iKTsKLSAgICBzdGF0dXMgPSB1cmItPnN0YXR1czsKLSAgICBieXRlc1JlYWQgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNCdWxrSW5Vc2JJb0NvbXBsZXRlUmVhZFxuIik7CiAKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIHBEZXZpY2UtPnVsQnVsa0luRXJyb3IrKzsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJCVUxLIEluIGZhaWxlZCAlZFxuIiwgc3RhdHVzKTsKLS8vdG9kby4uLnh4eHh4eAotLy8gICAgICAgIGlmIChzdGF0dXMgPT0gVVNCRF9TVEFUVVNfQ1JDKSB7Ci0vLyAgICAgICAgICAgIHBEZXZpY2UtPnVsQnVsa0luQ29udENSQ0Vycm9yKys7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChzdGF0dXMgPT0gU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEICkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIE1QX1NFVF9GTEFHKHBEZXZpY2UsIGZNUF9ESVNDT05ORUNURUQpOwotLy8gICAgICAgIH0KLSAgICB9IGVsc2UgewotCWlmIChieXRlc1JlYWQpCi0JCWJJbmRpY2F0ZVJlY2VpdmUgPSB0cnVlOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkNvbnRDUkNFcnJvciA9IDA7Ci0gICAgICAgIHBEZXZpY2UtPnVsQnVsa0luQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsKLSAgICB9CisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQlyZXR1cm47CisJY2FzZSAtRVRJTUVET1VUOgorCWRlZmF1bHQ6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkiQlVMSyBJbiBmYWlsZWQgJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQogCi0gICAgaWYgKGJJbmRpY2F0ZVJlY2VpdmUpIHsKLSAgICAgICAgc3Bpbl9sb2NrKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgaWYgKFJYYkJ1bGtJblByb2Nlc3NEYXRhKHBEZXZpY2UsIHBSQ0IsIGJ5dGVzUmVhZCkgPT0gdHJ1ZSkKLSAgICAgICAgICAgIGJSZUFsbG9jU2tiID0gdHJ1ZTsKLSAgICAgICAgc3Bpbl91bmxvY2soJnBEZXZpY2UtPmxvY2spOwotICAgIH0KLSAgICBwUkNCLT5SZWYtLTsKLSAgICBpZiAocFJDQi0+UmVmID09IDApCi0gICAgewotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlJ4dkZyZWVOb3JtYWwgJWQgXG4iLHBEZXZpY2UtPk51bVJlY3ZGcmVlTGlzdCk7Ci0gICAgICAgIHNwaW5fbG9jaygmcERldmljZS0+bG9jayk7Ci0gICAgICAgIFJYdkZyZWVSQ0IocFJDQiwgYlJlQWxsb2NTa2IpOwotICAgICAgICBzcGluX3VubG9jaygmcERldmljZS0+bG9jayk7Ci0gICAgfQorCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKIAotICAgIHJldHVybjsKKwkJaWYgKFJYYkJ1bGtJblByb2Nlc3NEYXRhKHByaXYsIHJjYiwgdXJiLT5hY3R1YWxfbGVuZ3RoKSA9PSB0cnVlKQorCQkJcmVfYWxsb2Nfc2tiID0gdHJ1ZTsKKworCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJfQorCisJcmNiLT5SZWYtLTsKKwlpZiAocmNiLT5SZWYgPT0gMCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlJ4dkZyZWVOb3JtYWwgJWRcbiIsCisJCQkJCQkJcHJpdi0+TnVtUmVjdkZyZWVMaXN0KTsKKwkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCQlSWHZGcmVlUkNCKHJjYiwgcmVfYWxsb2Nfc2tiKTsKKworCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJfQorCisJcmV0dXJuOwogfQogCiAvKgpAQCAtNTQ0LDUzICs1MTksNDAgQEAKICAqCiAgKi8KIAotaW50IFBJUEVuc1NlbmRCdWxrT3V0KHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKLQkJCQlzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQgKnBDb250ZXh0KQoraW50IFBJUEVuc1NlbmRCdWxrT3V0KHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKKwkJCQlzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQgKmNvbnRleHQpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3QgdXJiICAgICAgICAgICpwVXJiOworCXN0cnVjdCB1cmIgKnVyYjsKIAotICAgIHBEZXZpY2UtPmJQV0JpdE9uID0gZmFsc2U7CisJcHJpdi0+YlBXQml0T24gPSBmYWxzZTsKIAotLyoKLSAgICBpZiAocERldmljZS0+cFBlbmRpbmdCdWxrT3V0Q29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIHBEZXZpY2UtPk51bUNvbnRleHRzUXVldWVkKys7Ci0gICAgICAgIEVucXVldWVDb250ZXh0KHBEZXZpY2UtPkZpcnN0VHhDb250ZXh0UXVldWUsIHBEZXZpY2UtPkxhc3RUeENvbnRleHRRdWV1ZSwgcENvbnRleHQpOwotICAgICAgICBzdGF0dXMgPSBTVEFUVVNfUEVORElORzsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTZW5kIHBlbmRpbmchXG4iKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0qLworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8ic19uc1NlbmRCdWxrT3V0XG4iKTsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8ic19uc1NlbmRCdWxrT3V0XG4iKTsKKwlpZiAoIShNUF9JU19SRUFEWShwcml2KSAmJiBwcml2LT5GbGFncyAmIGZNUF9QT1NUX1dSSVRFUykpIHsKKwkJY29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOworCQlyZXR1cm4gU1RBVFVTX1JFU09VUkNFUzsKKwl9CiAKLSAgICBpZiAoTVBfSVNfUkVBRFkocERldmljZSkgJiYgKHBEZXZpY2UtPkZsYWdzICYgZk1QX1BPU1RfV1JJVEVTKSkgeworCXVyYiA9IGNvbnRleHQtPnBVcmI7CiAKLSAgICAgICAgcFVyYiA9IHBDb250ZXh0LT5wVXJiOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRQb3N0ZWQrKzsKLS8vICAgICAgICBwRGV2aWNlLT5wUGVuZGluZ0J1bGtPdXRDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKAotICAgICAgICAJICAgIHBVcmIsCi0gICAgICAgIAkJcERldmljZS0+dXNiLAotCQkgICAgdXNiX3NuZGJ1bGtwaXBlKHBEZXZpY2UtPnVzYiwgMyksCi0JCSAgICAodm9pZCAqKSAmKHBDb250ZXh0LT5EYXRhWzBdKSwKLSAgICAgICAgCQlwQ29udGV4dC0+dUJ1ZkxlbiwKLSAgICAgICAgCQlzX25zQnVsa091dElvQ29tcGxldGVXcml0ZSwKLSAgICAgICAgCQlwQ29udGV4dCk7CisJdXNiX2ZpbGxfYnVsa191cmIodXJiLAorCQkJcHJpdi0+dXNiLAorCQkJdXNiX3NuZGJ1bGtwaXBlKHByaXYtPnVzYiwgMyksCisJCQljb250ZXh0LT5EYXRhLAorCQkJY29udGV4dC0+dUJ1ZkxlbiwKKwkJCXNfbnNCdWxrT3V0SW9Db21wbGV0ZVdyaXRlLAorCQkJY29udGV4dCk7CiAKLSAgICAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7Ci0gICAgCWlmIChzdGF0dXMgIT0gMCkKLSAgICAJewotICAgIAkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgc3RhdHVzKTsKLQkJcENvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKLSAgICAJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLSAgICAJfQotICAgICAgICByZXR1cm4gU1RBVFVTX1BFTkRJTkc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwQ29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOwotICAgICAgICByZXR1cm4gU1RBVFVTX1JFU09VUkNFUzsKLSAgICB9CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJCSJTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgc3RhdHVzKTsKKwkJY29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOworCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIFNUQVRVU19QRU5ESU5HOwogfQogCiAvKgpAQCAtNjIzLDY4ICs1ODUsNDkgQEAKIAogc3RhdGljIHZvaWQgc19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGUoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZTsKLQlpbnQgc3RhdHVzOwotCUNPTlRFWFRfVFlQRSBDb250ZXh0VHlwZTsKLQl1bnNpZ25lZCBsb25nIHVsQnVmTGVuOwotCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqcENvbnRleHQ7CisJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpjb250ZXh0ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IGNvbnRleHQtPnBEZXZpY2U7CisJdTggY29udGV4dF90eXBlID0gY29udGV4dC0+dHlwZTsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zQnVsa091dElvQ29tcGxldGVXcml0ZVxuIik7Ci0gICAgLy8KLSAgICAvLyBUaGUgY29udGV4dCBnaXZlbiB0byBJb1NldENvbXBsZXRpb25Sb3V0aW5lIGlzIGFuIFVTQl9DT05URVhUIHN0cnVjdAotICAgIC8vCi0JcENvbnRleHQgPSAoc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICopdXJiLT5jb250ZXh0OworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zQnVsa091dElvQ29tcGxldGVXcml0ZVxuIik7CiAKLSAgICBwRGV2aWNlID0gcENvbnRleHQtPnBEZXZpY2U7Ci0gICAgQ29udGV4dFR5cGUgPSBwQ29udGV4dC0+VHlwZTsKLSAgICB1bEJ1ZkxlbiA9IHBDb250ZXh0LT51QnVmTGVuOworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSJXcml0ZSAlZCBieXRlc1xuIiwgY29udGV4dC0+dUJ1Zkxlbik7CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJY29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOworCQlyZXR1cm47CisJY2FzZSAtRVRJTUVET1VUOgorCWRlZmF1bHQ6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkiQlVMSyBPdXQgZmFpbGVkICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWJyZWFrOworCX0KIAotICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQocERldmljZS0+ZGV2KSkKLQkgICAgcmV0dXJuOworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQocHJpdi0+ZGV2KSkKKwkJcmV0dXJuOwogCi0gICAvLwotICAgIC8vIFBlcmZvcm0gdmFyaW91cyBJUlAsIFVSQiwgYW5kIGJ1ZmZlciAnc2FuaXR5IGNoZWNrcycKLSAgICAvLworCWlmIChDT05URVhUX0RBVEFfUEFDS0VUID09IGNvbnRleHRfdHlwZSkgeworCQlpZiAoY29udGV4dC0+cFBhY2tldCAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShjb250ZXh0LT5wUGFja2V0KTsKKwkJCWNvbnRleHQtPnBQYWNrZXQgPSBOVUxMOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJCSJ0eCAgJWQgYnl0ZXNcbiIsIGNvbnRleHQtPnVCdWZMZW4pOworCQl9CiAKLSAgICBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwkJcHJpdi0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQogCi0gICAgaWYoc3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iV3JpdGUgJWQgYnl0ZXNcbiIsKGludCl1bEJ1Zkxlbik7Ci0gICAgICAgIHBEZXZpY2UtPnVsQnVsa091dEJ5dGVzV3JpdGUgKz0gdWxCdWZMZW47Ci0gICAgICAgIHBEZXZpY2UtPnVsQnVsa091dENvbnRDUkNFcnJvciA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJCVUxLIE91dCBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7Ci0gICAgICAgIHBEZXZpY2UtPnVsQnVsa091dEVycm9yKys7Ci0gICAgfQorCWlmIChwcml2LT5iTGlua1Bhc3MgPT0gdHJ1ZSkgeworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5kZXYpKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOworCX0KIAotLy8gICAgcERldmljZS0+dWxDaGVja0ZvckhhbmdDb3VudCA9IDA7Ci0vLyAgICBwRGV2aWNlLT5wUGVuZGluZ0J1bGtPdXRDb250ZXh0ID0gTlVMTDsKKwljb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7CiAKLSAgICBpZiAoIENPTlRFWFRfREFUQV9QQUNLRVQgPT0gQ29udGV4dFR5cGUgKSB7Ci0gICAgICAgIC8vIEluZGljYXRlIHRvIHRoZSBwcm90b2NvbCB0aGUgc3RhdHVzIG9mIHRoZSBzZW50IHBhY2tldCBhbmQgcmV0dXJuCi0gICAgICAgIC8vIG93bmVyc2hpcCBvZiB0aGUgcGFja2V0LgotCSAgICBpZiAocENvbnRleHQtPnBQYWNrZXQgIT0gTlVMTCkgewotCSAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEocENvbnRleHQtPnBQYWNrZXQpOwotCSAgICAgICAgcENvbnRleHQtPnBQYWNrZXQgPSBOVUxMOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ0eCAgJWQgYnl0ZXNcbiIsKGludCl1bEJ1Zkxlbik7Ci0JICAgIH0KLQotICAgICAgICBwRGV2aWNlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQotICAgICAgICBpZiAoc3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5wYWNrZXRzU2VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTZW5kIFVTQiBlcnJvciEgWyUwOHhoXVxuIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHBEZXZpY2UtPnBhY2tldHNTZW50RHJvcHBlZCsrOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgaWYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSB7Ci0gICAgICAgIGlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHBEZXZpY2UtPmRldikpCi0gICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHBEZXZpY2UtPmRldik7Ci0gICAgfQotICAgIHBDb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7Ci0KLSAgICByZXR1cm47CisJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYwppbmRleCA2Yjk1MjI5Li4zY2YzZjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYwpAQCAtMjkzLDE3ICsyOTMsMTEgQEAKIAljYXNlIFdMQU5fQ01EX1NDQU5fU1RBUlQ6CiAKIAkJcERldmljZS0+YnlSZUFzc29jQ291bnQgPSAwOwotCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKLQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKQorCQkJYnJlYWs7CiAKLQkJaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgewotCQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKQorCQkJYnJlYWs7CiAKIAkJcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieVNjYW5TU0lEOwogCkBAIC0zMTEsMTYgKzMwNSwxMiBAQAogCQkJcE1nbXQtPnVTY2FuQ2hhbm5lbCA9IHBEZXZpY2UtPmJ5TWluQ2hhbm5lbDsKIAkJaWYgKHBNZ210LT51U2NhbkNoYW5uZWwgPiBwRGV2aWNlLT5ieU1heENoYW5uZWwpIHsKIAkJCXBEZXZpY2UtPmVDb21tYW5kU3RhdGUgPSBXTEFOX0NNRF9TQ0FOX0VORDsKLQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQlyZXR1cm47CisJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWlmICghQ2hhbm5lbFZhbGlkKHBEZXZpY2UtPmJ5Wm9uZVR5cGUsIHBNZ210LT51U2NhbkNoYW5uZWwpKSB7CiAJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiSW52YWxpZCBjaGFubmVsIHBNZ210LT51U2NhbkNoYW5uZWwgPSAlZFxuIiwgcE1nbXQtPnVTY2FuQ2hhbm5lbCk7CiAJCQkJcE1nbXQtPnVTY2FuQ2hhbm5lbCsrOwotCQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJCXJldHVybjsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChwTWdtdC0+dVNjYW5DaGFubmVsID09IHBEZXZpY2UtPmJ5TWluQ2hhbm5lbCkgewogCQkJCS8vIHBNZ210LT5lU2NhblR5cGUgPSBXTUFDX1NDQU5fQUNUSVZFOyAgICAgICAgICAvL21pa2UgbWFyawpAQCAtNDIwLDE2ICs0MTAsMTMgQEAKIAkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwogCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKIAotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9ESVNBU1NPQ0lBVEVfU1RBUlQ6CiAJCXBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKIAkJaWYgKChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfU1RBKSAmJgogCQkgICAgKHBNZ210LT5lQ3VyclN0YXRlICE9IFdNQUNfU1RBVEVfQVNTT0MpKSB7Ci0JCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlwRGV2aWNlLT5id2V4dHN0ZXAwID0gZmFsc2U7CiAJCQlwRGV2aWNlLT5id2V4dHN0ZXAxID0gZmFsc2U7CkBAIC00NTgsMTcgKzQ0NSwxNCBAQAogCQluZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAJCWlmIChwRGV2aWNlLT5iTmVlZFJhZGlvT0ZGID09IHRydWUpCiAJCQlDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKKwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfU1NJRF9TVEFSVDoKIAogCQlwRGV2aWNlLT5ieVJlQXNzb2NDb3VudCA9IDA7Ci0JCWlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkgewotCQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpCisJCQlicmVhazsKIAogCQltZW1jcHkocE1nbXQtPmFieUFkSG9jU1NJRCwgcE1nbXQtPmFieURlc2lyZVNTSUQsCiAJCSAgICAgICAoKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieURlc2lyZVNTSUQpLT5sZW4gKyBXTEFOX0lFSERSX0xFTik7CkBAIC00ODksMTEgKzQ3Myw5IEBACiAJCWlmICgocE1nbXQtPmVDdXJyU3RhdGUgPT0gV01BQ19TVEFURV9BU1NPQykgfHwKIAkJICAgICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpICYmIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0pPSU5URUQpKSkgewogCQkJaWYgKHBJdGVtU1NJRC0+bGVuID09IHBJdGVtU1NJREN1cnItPmxlbikgewotCQkJCWlmIChtZW1jbXAocEl0ZW1TU0lELT5hYnlTU0lELCBwSXRlbVNTSURDdXJyLT5hYnlTU0lELCBwSXRlbVNTSUQtPmxlbikgPT0gMCkgewotCQkJCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQkJCXJldHVybjsKLQkJCQl9CisJCQkJaWYgKCFtZW1jbXAocEl0ZW1TU0lELT5hYnlTU0lELAorCQkJCQlwSXRlbVNTSURDdXJyLT5hYnlTU0lELCBwSXRlbVNTSUQtPmxlbikpCisJCQkJCWJyZWFrOwogCQkJfQogCQkJbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwogCQkJcERldmljZS0+YkxpbmtQYXNzID0gZmFsc2U7CkBAIC01ODIsNyArNTY0LDYgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9BVVRIRU5USUNBVEVfV0FJVDoKQEAgLTYxMiw3ICs1OTMsNiBAQAogCQl9CiAJCXBEZXZpY2UtPmJ5TGlua1dhaXRDb3VudCA9IDA7CiAKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9BU1NPQ0lBVEVfV0FJVDoKQEAgLTY0Nyw3ICs2MjcsNiBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfQVBfTU9ERV9TVEFSVDoKQEAgLTY4Myw3ICs2NjIsNiBAQAogCQkJQ29udHJvbHZNYXNrQnl0ZShwRGV2aWNlLCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCBNQUNfUkVHX1BBUEVERUxBWSwgTEVEU1RTX1NUUywgTEVEU1RTX0lOVEVSKTsKIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcERldmljZS0+c2Vjb25kX2NhbGxiYWNrX3dvcmssIEhaKTsKIAkJfQotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9UWF9QU1BBQ0tFVF9TVEFSVDoKQEAgLTczOCw4ICs3MTYsNiBAQAogCQkJCXBNZ210LT5zTm9kZURCVGFibGVbaWldLmJSeFBTUG9sbCA9IGZhbHNlOwogCQkJfQogCQl9Ci0KLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfUkFESU9fU1RBUlQ6CkBAIC03NjAsMTEgKzczNiw4IEBACiAJCQkJCTEsCiAJCQkJCSZieVRtcCk7CiAKLQkJCWlmIChudFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJCXJldHVybjsKLQkJCX0KKwkJCWlmIChudFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlicmVhazsKIAkJCWlmICgoYnlUbXAgJiBHUElPM19EQVRBKSA9PSAwKSB7CiAJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgV0xBTl9DTURfUkFESU9fU1RBUlRfT0ZGLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4iKTsKIAkJCQkvLyBPbGQgY29tbWFuZHMgYXJlIHVzZWxlc3MuCkBAIC04MzMsNyArODA2LDYgQEAKIAkJCX0KIAkJfQogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX0NIQU5HRV9CQlNFTlNJVElWSVRZX1NUQVJUOgpAQCAtODQzLDI0ICs4MTUsMjAgQEAKIAkJQkJ2U2V0VkdBR2Fpbk9mZnNldChwRGV2aWNlLCBwRGV2aWNlLT5ieUJCVkdBQ3VycmVudCk7CiAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQ2hhbmdlIHNlbnNpdGl2aXR5IHBEZXZpY2UtPmJ5QkJWR0FDdXJyZW50ID0gJXhcbiIsIHBEZXZpY2UtPmJ5QkJWR0FDdXJyZW50KTsKIAkJcERldmljZS0+YlN0b3BEYXRhUGt0ID0gZmFsc2U7Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1RCVFRfV0FLRVVQX1NUQVJUOgogCQlQU2JJc05leHRUQlRUV2FrZVVwKHBEZXZpY2UpOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9CRUNPTl9TRU5EX1NUQVJUOgogCQliTWdyUHJlcGFyZUJlYWNvblRvU2VuZChwRGV2aWNlLCBwTWdtdCk7Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1NFVFBPV0VSX1NUQVJUOgogCiAJCVJGYlNldFBvd2VyKHBEZXZpY2UsIHBEZXZpY2UtPndDdXJyZW50UmF0ZSwgcE1nbXQtPnVDdXJyQ2hhbm5lbCk7CiAKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfQ0hBTkdFX0FOVEVOTkFfU1RBUlQ6CkBAIC04NzgsMTIgKzg0NiwxMCBAQAogCQkJZWxzZQogCQkJCUJCdlNldEFudGVubmFNb2RlKHBEZXZpY2UsIEFOVF9SWEEpOwogCQl9Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1JFTU9WRV9BTExLRVlfU1RBUlQ6CiAJCUtleWJSZW1vdmVBbGxLZXkocERldmljZSwgJihwRGV2aWNlLT5zS2V5KSwgcERldmljZS0+YWJ5QlNTSUQpOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9NQUNfRElTUE9XRVJTQVZJTkdfU1RBUlQ6CkBAIC04OTgsNyArODY0LDYgQEAKIAkJCQkJTlVMTAogCQkJCQkpOwogCQl9Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EXzExSF9DSFNXX1NUQVJUOgpAQCAtOTA2LDE0ICs4NzEsMTcgQEAKIAkJcERldmljZS0+YkNoYW5uZWxTd2l0Y2ggPSBmYWxzZTsKIAkJcE1nbXQtPnVDdXJyQ2hhbm5lbCA9IHBEZXZpY2UtPmJ5TmV3Q2hhbm5lbDsKIAkJcERldmljZS0+YlN0b3BEYXRhUGt0ID0gZmFsc2U7Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKKwljYXNlIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVJfU1RBUlQ6CisJCXZudF9jb25maWd1cmVfZmlsdGVyKHBEZXZpY2UpOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCX0gLy9zd2l0Y2gKIAorCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKKwogCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAJcmV0dXJuOwogfQpAQCAtMTAwOSw2ICs5NzcsMTEgQEAKIAkJCXBEZXZpY2UtPmVDb21tYW5kU3RhdGUgPSBXTEFOX0NNRF8xMUhfQ0hTV19TVEFSVDsKIAkJCWJyZWFrOwogCisJCWNhc2UgV0xBTl9DTURfQ09ORklHVVJFX0ZJTFRFUjoKKwkJCXBEZXZpY2UtPmVDb21tYW5kU3RhdGUgPQorCQkJCQkJV0xBTl9DTURfQ09ORklHVVJFX0ZJTFRFUl9TVEFSVDsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuaAppbmRleCBjYWYyNjg0Li43MzY1NzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuaApAQCAtNTEsNyArNTEsOCBAQAogICAgIFdMQU5fQ01EX1JFTU9WRV9BTExLRVksCiAgICAgV0xBTl9DTURfTUFDX0RJU1BPV0VSU0FWSU5HLAogICAgIFdMQU5fQ01EXzExSF9DSFNXLAotICAgIFdMQU5fQ01EX1JVTl9BUAorICAgIFdMQU5fQ01EX1JVTl9BUCwKKyAgICBXTEFOX0NNRF9DT05GSUdVUkVfRklMVEVSCiB9IENNRF9DT0RFLCAqUENNRF9DT0RFOwogCiAjZGVmaW5lIENNRF9RX1NJWkUgICAgICAgICAgICAgIDMyCkBAIC05Niw2ICs5Nyw3IEBACiAgICAgV0xBTl9DTURfUkVNT1ZFX0FMTEtFWV9TVEFSVCwKICAgICBXTEFOX0NNRF9NQUNfRElTUE9XRVJTQVZJTkdfU1RBUlQsCiAgICAgV0xBTl9DTURfMTFIX0NIU1dfU1RBUlQsCisgICAgV0xBTl9DTURfQ09ORklHVVJFX0ZJTFRFUl9TVEFSVCwKICAgICBXTEFOX0NNRF9JRExFCiB9IENNRF9TVEFURSwgKlBDTURfU1RBVEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93bWdyLmMKaW5kZXggZDc0YjBlNy4uMGQ2OTcxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93bWdyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93bWdyLmMKQEAgLTIxNjQsMTIgKzIxNjQsMTIgQEAKICAgICAgICAgcE1nbXQtPndDdXJyQ2FwSW5mbyB8PSBXTEFOX1NFVF9DQVBfSU5GT19FU1MoMSk7CiAgICAgICAgIHBNZ210LT5ieURUSU1QZXJpb2QgPSBERUZBVUxUX0RUSU1fUEVSSU9EOwogICAgICAgICBwTWdtdC0+YnlEVElNQ291bnQgPSBwTWdtdC0+YnlEVElNUGVyaW9kIC0gMTsKLSAgICAgICAgcERldmljZS0+ZU9QTW9kZSA9IE9QX01PREVfQVA7CisJcERldmljZS0+b3BfbW9kZSA9IE5MODAyMTFfSUZUWVBFX0FQOwogICAgIH0KIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkgewogICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX0lCU1MoMSk7Ci0gICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0FESE9DOworCXBEZXZpY2UtPm9wX21vZGUgPSBOTDgwMjExX0lGVFlQRV9BREhPQzsKICAgICB9CiAKICAgICBpZiAocERldmljZS0+YkVuY3J5cHRpb25FbmFibGUpIHsKQEAgLTIzNTksNyArMjM1OSw3IEBACiAKICAgICAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9KT0lOVEVEOwogICAgICAgICAgICAgLy8gQWRvcHQgQlNTIHN0YXRlIGluIEFkYXB0ZXIgRGV2aWNlIE9iamVjdAotICAgICAgICAgICAgcERldmljZS0+ZU9QTW9kZSA9IE9QX01PREVfSU5GUkFTVFJVQ1RVUkU7CisJICAgIHBEZXZpY2UtPm9wX21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwogICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKIAogICAgICAgICAgICAgLy8gQWRkIGN1cnJlbnQgQlNTIHRvIENhbmRpZGF0ZSBsaXN0CkBAIC0yNTAwLDcgKzI1MDAsNyBAQAogICAgICAgICAgICAgcE1nbXQtPmVDdXJyTW9kZSA9IFdNQUNfTU9ERV9JQlNTX1NUQTsKICAgICAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9TVEFSVEVEOwogICAgICAgICAgICAgLy8gQWRvcHQgQlNTIHN0YXRlIGluIEFkYXB0ZXIgRGV2aWNlIE9iamVjdAotICAgICAgICAgICAgcERldmljZS0+ZU9QTW9kZSA9IE9QX01PREVfQURIT0M7CisJICAgIHBEZXZpY2UtPm9wX21vZGUgPSBOTDgwMjExX0lGVFlQRV9BREhPQzsKICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IHRydWU7CiAgICAgICAgICAgICBDb250cm9sdk1hc2tCeXRlKHBEZXZpY2UsTUVTU0FHRV9SRVFVRVNUX01BQ1JFRyxNQUNfUkVHX1BBUEVERUxBWSxMRURTVFNfU1RTLExFRFNUU19JTlRFUik7CiAgICAgICAgICAgICBtZW1jcHkocERldmljZS0+YWJ5QlNTSUQsIHBDdXJyLT5hYnlCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaAppbmRleCA4NGVmZmM0Li44Y2E4MGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaApAQCAtNTgsOSArNTgsMTMgQEAKICNkZWZpbmUgTE9DQUxfMTFCX0JBU0lDX1JBVEVfQklUTUFQCQkweDgyNgogI2RlZmluZSBMT0NBTF8xMUJfT1BFUkFUSU9OX1JBVEVfQklUTUFQCQkweDgyNgogI2RlZmluZSBMT0NBTF8xMUdfQkFTSUNfUkFURV9CSVRNQVAJCTB4ODI2CSAgIC8qIDEsIDIsIDUuNSwgMTEgKi8KLSNkZWZpbmUgTE9DQUxfMTFHX09QRVJBVElPTl9SQVRFX0JJVE1BUAkJMHgxMzBjMTI0MCAvKiA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0ICovCisjZGVmaW5lIExPQ0FMXzExR19PUEVSQVRJT05fUkFURV9CSVRNQVAJCTB4MTMwYzEyNDAgLyogNiwgOSwgMTIsIDE4LAorCQkJCQkJCQkgICAgKiAyNCwgMzYsIDQ4LCA1NAorCQkJCQkJCQkgICAgKi8KICNkZWZpbmUgTE9DQUxfMTFBX0JBU0lDX1JBVEVfQklUTUFQCQkweDAxMDAxMDQwIC8qIDYsIDEyLCAyNCAqLwotI2RlZmluZSBMT0NBTF8xMUFfT1BFUkFUSU9OX1JBVEVfQklUTUFQCQkweDEyMGMwMjAwIC8qIDksIDE4LCAzNiwgNDgsIDU0ICovCisjZGVmaW5lIExPQ0FMXzExQV9PUEVSQVRJT05fUkFURV9CSVRNQVAJCTB4MTIwYzAyMDAgLyogOSwgMTgsIDM2LAorCQkJCQkJCQkgICAgKiA0OCwgNTQKKwkJCQkJCQkJICAgICovCiAKIAogI2RlZmluZSBQV1JfQUNUSVZFCQkJCTAKQEAgLTE0MCw3ICsxNDQsOSBAQAogCS8qIFVuaXQgdGltZSBjb3VudCBmb3IgdGhlIGRlY2lzaW9uIHRvIGVudGVyIFBTIG1vZGUgKi8KIAl1MTYJQ2hlY2tDb3VudEZvclBTOwogCXU4CWJvSGFzVHhBY3Rpdml0eTsvKiB0eCBhY3Rpdml0eSBoYXMgb2NjdXJyZWQgKi8KLQl1OAlib01hY1BzVmFsaWQ7CS8qIFBvd2VyIHNhdmUgbW9kZSBvYnRhaW5lZCBmcm9tIEgvVyBpcyB2YWxpZCBvciBub3QgKi8KKwl1OAlib01hY1BzVmFsaWQ7CS8qIFBvd2VyIHNhdmUgbW9kZSBvYnRhaW5lZAorCQkJCSAqIGZyb20gSC9XIGlzIHZhbGlkIG9yIG5vdAorCQkJCSAqLwogCiAJLyogUmF0ZSAqLwogCXU4CVR4UmF0ZU1vZGU7IC8qCkBAIC0xNjIsMzUgKzE2OCw1NyBAQAogCiAJdTgJTnVtT2ZCUmF0ZTsKIAl1OAlOdW1PZlNSYXRlOwotCXU4CU51bU9mRHNzc1JhdGVJblNSYXRlOwkvKiBudW1iZXIgb2YgRFNTUyByYXRlcyBpbiBzdXBwb3J0ZWQgcmF0ZSBzZXQgKi8KKwl1OAlOdW1PZkRzc3NSYXRlSW5TUmF0ZTsJLyogbnVtYmVyIG9mIERTU1MgcmF0ZXMgaW4KKwkJCQkJICogc3VwcG9ydGVkIHJhdGUgc2V0CisJCQkJCSAqLwogCXU4CXJlc2VydmVkMTsKIAogCXUzMglkd0Jhc2ljUmF0ZUJpdG1hcDsJLyogYml0IG1hcCBvZiBiYXNpYyByYXRlcyAqLwogCi0JdTMyCWR3U3VwcG9ydFJhdGVCaXRtYXA7CS8qIGJpdCBtYXAgb2YgYWxsIHN1cHBvcnQgcmF0ZXMgaW5jbHVkaW5nIGJhc2ljIGFuZCBvcGVyYXRpb25hbCByYXRlcyAqLworCXUzMglkd1N1cHBvcnRSYXRlQml0bWFwOwkvKiBiaXQgbWFwIG9mIGFsbCBzdXBwb3J0IHJhdGVzCisJCQkJCSAqIGluY2x1ZGluZyBiYXNpYyBhbmQgb3BlcmF0aW9uYWwKKwkJCQkJICogcmF0ZXMKKwkJCQkJICovCiAKIAogCS8qIEZvciBTTUUvTUxNRSBoYW5kbGVyICovCiAKLQl1MTYJd09sZFNUQWluZGV4OwkJLyogdmFsaWQgd2hlbiBib0hhbmRvdmVyPVRSVUUsIHN0b3JlIG9sZCBjb25uZWN0ZWQgU1RBIGluZGV4ICovCi0JdTE2CXdDb25uZWN0ZWRTVEFpbmRleDsJLyogSW5kZXggb2YgcGVlcmx5IGNvbm5lY3RlZCBBUCBvciBJQlNTIGluIHRoZSBkZXNjcmlwdGlvbnNldC4gKi8KLQl1MTYJQXNzb2NpYXRpb25fSUQ7CQkvKiBUaGUgQXNzb2NpYXRpb24gSUQgaW4gdGhlIChSZSlBc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZS4gKi8KLQl1MTYJTGlzdGVuSW50ZXJ2YWw7CQkvKiBUaGUgbGlzdGVuIGludGVydmFsIHdoZW4gU01FIGludm9raW5nIE1MTUVfIChSZSlBc3NvY2lhdGVfUmVxdWVzdCgpLiAqLworCXUxNgl3T2xkU1RBaW5kZXg7CQkvKiB2YWxpZCB3aGVuIGJvSGFuZG92ZXI9VFJVRSwKKwkJCQkJICogc3RvcmUgb2xkIGNvbm5lY3RlZCBTVEEgaW5kZXgKKwkJCQkJICovCisJdTE2CXdDb25uZWN0ZWRTVEFpbmRleDsJLyogSW5kZXggb2YgcGVlcmx5IGNvbm5lY3RlZCBBUCBvcgorCQkJCQkgKiBJQlNTIGluIHRoZSBkZXNjcmlwdGlvbnNldC4KKwkJCQkJICovCisJdTE2CUFzc29jaWF0aW9uX0lEOwkJLyogVGhlIEFzc29jaWF0aW9uIElEIGluIHRoZQorCQkJCQkgKiAoUmUpQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUuCisJCQkJCSAqLworCXUxNglMaXN0ZW5JbnRlcnZhbDsJCS8qIFRoZSBsaXN0ZW4gaW50ZXJ2YWwgd2hlbiBTTUUgaW52b2tpbmcKKwkJCQkJICogTUxNRV8gKFJlKUFzc29jaWF0ZV9SZXF1ZXN0KCkuCisJCQkJCSAqLwogCiAJc3RydWN0CXJhZGlvX29mZiBSYWRpb09mZlN0YXR1czsKIAl1OAlSZXNlcnZlZDBbMl07Ci0JdTgJYm9Nc1JhZGlvT2ZmOwkJLyogTmRpcyBkZW1hbmRzIHRvIGJlIHRydWUgd2hlbiBzZXQgRGlzYXNzb2MuIE9JRCBhbmQgYmUgZmFsc2Ugd2hlbiBzZXQgU1NJRCBPSUQuICovCisJdTgJYm9Nc1JhZGlvT2ZmOwkJLyogTmRpcyBkZW1hbmRzIHRvIGJlIHRydWUgd2hlbiBzZXQKKwkJCQkJICogRGlzYXNzb2MuIE9JRCBhbmQgYmUgZmFsc2Ugd2hlbgorCQkJCQkgKiBzZXQgU1NJRCBPSUQuCisJCQkJCSAqLwogCXU4CWJBbnRlbm5hTm87CQkvKiB3aGljaCBhbnRlbm5hICovCi0JdTgJYkNvbm5lY3RGbGFnOwkJLyogdGhlIGNvbm5lY3Qgc3RhdHVzIGZsYWcgZm9yIHJvYW1pbmcgdGFzayAqLworCXU4CWJDb25uZWN0RmxhZzsJCS8qIHRoZSBjb25uZWN0IHN0YXR1cyBmbGFnIGZvcgorCQkJCQkgKiByb2FtaW5nIHRhc2sKKwkJCQkJICovCiAKIAl1OAlSb2FtU3RhdHVzOwogCXU4CXJlc2VydmVkN1szXTsKIAotCXN0cnVjdAljaGFuX2luZm8gQ3VycmVudENoYW47CS8qIEN1cnJlbnQgY2hhbm5lbCBuby4gYW5kIGNoYW5uZWwgYmFuZC4gSXQgbWF5IGJlIGNoYW5nZWQgYnkgc2Nhbm5pbmcuICovCisJc3RydWN0CWNoYW5faW5mbyBDdXJyZW50Q2hhbjsJLyogQ3VycmVudCBjaGFubmVsIG5vLiBhbmQgY2hhbm5lbCBiYW5kLgorCQkJCQkgKiBJdCBtYXkgYmUgY2hhbmdlZCBieSBzY2FubmluZy4KKwkJCQkJICovCiAJdTgJYm9IYW5kb3ZlcjsJCS8qIFJvYW1pbmcsIEhhbmRvdmVyIHRvIG90aGVyIEFQLiAqLwogCXU4CWJvQ0NBYnVzeTsKIAotCXUxNglDV01heDsJCQkvKiBJdCBtYXkgbm90IGJlIHRoZSByZWFsIHZhbHVlIHRoYXQgSC9XIHVzZWQgKi8KKwl1MTYJQ1dNYXg7CQkJLyogSXQgbWF5IG5vdCBiZSB0aGUgcmVhbCB2YWx1ZQorCQkJCQkgKiB0aGF0IEgvVyB1c2VkCisJCQkJCSAqLwogCXU4CUNXTWluOwkJCS8qIDI1NTogc2V0IGFjY29yZGluZyB0byA4MDIuMTEgc3BlYy4gKi8KIAl1OAlyZXNlcnZlZDI7CiAKQEAgLTIwMCw3ICsyMjgsOSBAQAogCXU4CWJQcmVhbWJsZU1vZGU7CQkvKiBBVVRPLCBzMzIgKi8KIAl1OAlib05vbkVSUHByZXNlbnQ7CiAKLQl1OAlib1Byb3RlY3RNZWNoYW5pc207CS8qIEgvVyB3aWxsIHRha2UgdGhlIG5lY2Vzc2FyeSBhY3Rpb24gYmFzZWQgb24gdGhpcyB2YXJpYWJsZSAqLworCXU4CWJvUHJvdGVjdE1lY2hhbmlzbTsJLyogSC9XIHdpbGwgdGFrZSB0aGUgbmVjZXNzYXJ5IGFjdGlvbgorCQkJCQkgKiBiYXNlZCBvbiB0aGlzIHZhcmlhYmxlCisJCQkJCSAqLwogCXU4CWJvU2hvcnRQcmVhbWJsZTsJLyogU2FtZSBoZXJlICovCiAJdTgJYm9TaG9ydFNsb3RUaW1lOwkvKiBTYW1lIGhlcmUgKi8KIAl1OAlyZXNlcnZlZF8zOwpAQCAtMjEzLDggKzI0MywxMiBAQAogCXUzMglId0Jzc2lkVmFsaWQ7CiAKIAkvKiBGb3Igc2NhbiBsaXN0ICovCi0JdTgJQnNzTGlzdENvdW50OwkJLyogVG90YWwgY291bnQgb2YgdmFsaWQgZGVzY3JpcHRvciBpbmRleGVzICovCi0JdTgJYm9SZWNlaXZlVW5jb3JyZWN0SW5mbzsJLyogaW1wb3J0YW50IHNldHRpbmdzIGluIGJlYWNvbi9wcm9iZSByZXNwLiBoYXZlIGJlZW4gY2hhbmdlZCAqLworCXU4CUJzc0xpc3RDb3VudDsJCS8qIFRvdGFsIGNvdW50IG9mIHZhbGlkCisJCQkJCSAqIGRlc2NyaXB0b3IgaW5kZXhlcworCQkJCQkgKi8KKwl1OAlib1JlY2VpdmVVbmNvcnJlY3RJbmZvOwkvKiBpbXBvcnRhbnQgc2V0dGluZ3MgaW4gYmVhY29uL3Byb2JlCisJCQkJCSAqIHJlc3AuIGhhdmUgYmVlbiBjaGFuZ2VkCisJCQkJCSAqLwogCXU4CU5vT2ZKb2luZXJJbklic3M7CiAJdTgJcmVzZXJ2ZWRfNDsKIApAQCAtMjI4LDcgKzI2Miw5IEBACiAJICovCiAJdTgJSm9pbmVySW5JYnNzWyhNQVhfQlNTX0RFU0NSSVBUX0VMRU1FTlQgKyAzKSAmIH4weDAzXTsKIAotCS8qIEdlbmVyYWwgU3RhdGlzdGljcywgY291bnQgYXQgUnhfaGFuZGxlciBvciBUeF9jYWxsYmFjayBpbnRlcnJ1cHQgaGFuZGxlciAqLworCS8qIEdlbmVyYWwgU3RhdGlzdGljcywgY291bnQgYXQgUnhfaGFuZGxlciBvcgorCSAqIFR4X2NhbGxiYWNrIGludGVycnVwdCBoYW5kbGVyCisJICovCiAJdTY0CUdTX1hNSVRfT0s7CQkvKiBHb29kIEZyYW1lcyBUcmFuc21pdHRlZCAqLwogCXU2NAlHU19SQ1ZfT0s7CQkvKiBHb29kIEZyYW1lcyBSZWNlaXZlZCAqLwogCXUzMglHU19SQ1ZfRVJST1I7CQkvKiBGcmFtZXMgcmVjZWl2ZWQgd2l0aCBjcmMgZXJyb3IgKi8KQEAgLTI0OCwxMCArMjg0LDE4IEBACiAJdTMyCV9kb3QxMVdFUFVuZGVjcnlwdGFibGVDb3VudDsKIAl1MzIJX2RvdDExRnJhbWVEdXBsaWNhdGVDb3VudDsKIAotCXN0cnVjdAljaGFuX2luZm8gSWJzc0NoYW5TZXR0aW5nOwkvKiAyQi4gU3RhcnQgSUJTUyBDaGFubmVsIHNldHRpbmcgYnkgcmVnaXN0cnkgb3IgV1dVLiAqLwotCXU4CXJlc2VydmVkXzVbMl07CQkvKiBJdCBtYXkgbm90IGJlIHVzZWQgYWZ0ZXIgY29uc2lkZXJpbmcgUkYgdHlwZSwgcmVnaW9uIGFuZCBtb2R1bGF0aW9uIHR5cGUuICovCisJc3RydWN0CWNoYW5faW5mbyBJYnNzQ2hhblNldHRpbmc7CS8qIDJCLiBTdGFydCBJQlNTIENoYW5uZWwKKwkJCQkJCSAqIHNldHRpbmcgYnkgcmVnaXN0cnkgb3IKKwkJCQkJCSAqIFdXVS4KKwkJCQkJCSAqLworCXU4CXJlc2VydmVkXzVbMl07CQkvKiBJdCBtYXkgbm90IGJlIHVzZWQgYWZ0ZXIKKwkJCQkJICogY29uc2lkZXJpbmcgUkYgdHlwZSwgcmVnaW9uCisJCQkJCSAqIGFuZCBtb2R1bGF0aW9uIHR5cGUuCisJCQkJCSAqLwogCi0JdTgJcmVzZXJ2ZWRfNlsyXTsJCS8qIHR3byB2YXJpYWJsZXMgYXJlIGZvciB3ZXAga2V5IGVycm9yIGRldGVjdGlvbiAqLworCXU4CXJlc2VydmVkXzZbMl07CQkvKiB0d28gdmFyaWFibGVzIGFyZSBmb3Igd2VwCisJCQkJCSAqIGtleSBlcnJvciBkZXRlY3Rpb24KKwkJCQkJICovCiAJdTMyCWJXZXBLZXlFcnJvcjsKIAl1MzIJYlRvU2VsZlBhY2tldFJlY2VpdmVkOwogCXUzMglXZXBLZXlEZXRlY3RUaW1lckNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCmluZGV4IGE1ZTI1NWIuLmJiYzVkZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKQEAgLTc2LDQxICs3NiwxMTEgQEAKIHsKIAlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJc3dpdGNoIChSZWdpc3Rlck5vKSB7Ci0JY2FzZSAweDNiMDogcmVnLT5VMUIwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDNiYzogcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg0MDA6IHJlZy0+RDAwX0RtYUNvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODAwOiByZWctPk0wMF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwNDogcmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODA4OiByZWctPk0wOF9NdWx0aWNhc3RBZGRyZXNzMiA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MjQ6IHJlZy0+TTI0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODI4OiByZWctPk0yOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyYzogcmVnLT5NMkNfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Mzg6IHJlZy0+TTM4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODQwOiByZWctPk00MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0NDogcmVnLT5NNDRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NDg6IHJlZy0+TTQ4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODRjOiByZWctPk00Q19NYWNTdGF0dXMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODYwOiByZWctPk02MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg2ODogcmVnLT5NNjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NzA6IHJlZy0+TTcwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODc0OiByZWctPk03NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3ODogcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODdDOiByZWctPk03Q19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4MDogcmVnLT5NODBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4ODQ6IHJlZy0+TTg0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODg4OiByZWctPk04OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg5ODogcmVnLT5NOThfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDBjOiByZWctPkJCMEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAyYzogcmVnLT5CQjJDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMzA6IHJlZy0+QkIzMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDNjOiByZWctPkJCM0MgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA0ODogcmVnLT5CQjQ4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNGM6IHJlZy0+QkI0QyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDUwOiByZWctPkJCNTAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1NDogcmVnLT5CQjU0ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTg6IHJlZy0+QkI1OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDVjOiByZWctPkJCNUMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA2MDogcmVnLT5CQjYwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDNiMDoKKwkJcmVnLT5VMUIwID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDNiYzoKKwkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg0MDA6CisJCXJlZy0+RDAwX0RtYUNvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODAwOgorCQlyZWctPk0wMF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgwNDoKKwkJcmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODA4OgorCQlyZWctPk0wOF9NdWx0aWNhc3RBZGRyZXNzMiA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4MjQ6CisJCXJlZy0+TTI0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODI4OgorCQlyZWctPk0yOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgyYzoKKwkJcmVnLT5NMkNfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4Mzg6CisJCXJlZy0+TTM4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODQwOgorCQlyZWctPk00MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg0NDoKKwkJcmVnLT5NNDRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4NDg6CisJCXJlZy0+TTQ4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODRjOgorCQlyZWctPk00Q19NYWNTdGF0dXMgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODYwOgorCQlyZWctPk02MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg2ODoKKwkJcmVnLT5NNjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4NzA6CisJCXJlZy0+TTcwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODc0OgorCQlyZWctPk03NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg3ODoKKwkJcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODdDOgorCQlyZWctPk03Q19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg4MDoKKwkJcmVnLT5NODBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4ODQ6CisJCXJlZy0+TTg0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODg4OgorCQlyZWctPk04OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg5ODoKKwkJcmVnLT5NOThfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDBjOgorCQlyZWctPkJCMEMgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTAyYzoKKwkJcmVnLT5CQjJDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwMzA6CisJCXJlZy0+QkIzMCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDNjOgorCQlyZWctPkJCM0MgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA0ODoKKwkJcmVnLT5CQjQ4ID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNGM6CisJCXJlZy0+QkI0QyA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDUwOgorCQlyZWctPkJCNTAgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA1NDoKKwkJcmVnLT5CQjU0ID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNTg6CisJCXJlZy0+QkI1OCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDVjOgorCQlyZWctPkJCNUMgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA2MDoKKwkJcmVnLT5CQjYwID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCmluZGV4IDhkNzFiYzIuLmYwMDZiMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCkBAIC0xNiw3ICsxNiw4IEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIndiMzVyeF9mLmgiCiAKLXN0YXRpYyB2b2lkIHBhY2tldF9jYW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSkKK3N0YXRpYyB2b2lkIHBhY2tldF9jYW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBjaGFyICpwUnhCdWZmZXJBZGRyZXNzLAorCWludCBQYWNrZXRTaXplKQogewogCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC02NCw3ICs2NSw4IEBACiAJfSBlbHNlIGlmIChEZWNyeXB0aW9uTWV0aG9kKSB7IC8qIEZvciBUS0lQIGFuZCBDQ01QICovCiAJCWZvciAoaSA9IDc7IGkgPiAxOyBpLS0pCiAJCQlwUnhCdWZmZXJBZGRyZXNzW2ldID0gcFJ4QnVmZmVyQWRkcmVzc1tpIC0gMl07Ci0JCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMjsgLyogVXBkYXRlIHRoZSBkZXNjcmlwdG9yLCBzaGlmdCA4IGJ5dGUgKi8KKwkJLyogVXBkYXRlIHRoZSBkZXNjcmlwdG9yLCBzaGlmdCA4IGJ5dGUgKi8KKwkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAyOwogCQlCdWZmZXJTaXplIC09IDg7IC8qIDggYnl0ZSBmb3IgSVYgKyBJQ1YgKi8KIAl9CiAJcFJ4RGVzLT5idWZmZXJfc2l6ZVswXSA9IEJ1ZmZlclNpemU7CkBAIC05NSw3ICs5Nyw5IEBACiAKIAkJLyogUGFyc2UgdGhlIGJ1bGtpbiBidWZmZXIgKi8KIAkJd2hpbGUgKEJ1ZmZlclNpemUgPj0gNCkgewotCQkJaWYgKChjcHVfdG9fbGUzMigqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpICYgMHgwZmZmZmZmZikgPT0gUlhfRU5EX1RBRykgLyogSXMgZW5kaW5nPyAqLworCQkJLyogSXMgZW5kaW5nPyAqLworCQkJaWYgKChjcHVfdG9fbGUzMigqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpICYgMHgwZmZmZmZmZikgPT0KKwkJCQlSWF9FTkRfVEFHKQogCQkJCWJyZWFrOwogCiAJCQkvKiBHZXQgdGhlIFIwMCBSMDEgZmlyc3QgKi8KQEAgLTEwOCw3ICsxMTIsOCBAQAogCiAJCQkvKiBCYXNpYyBjaGVjayBmb3IgUnggbGVuZ3RoLiBJcyBsZW5ndGggdmFsaWQ/ICovCiAJCQlpZiAoUGFja2V0U2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgewotCQkJCXByX2RlYnVnKCJTZXJpb3VzIEVSUk9SIDogUnggZGF0YSBzaXplIHRvbyBsb25nLCBzaXplID0lZFxuIiwgUGFja2V0U2l6ZSk7CisJCQkJcHJfZGVidWcoIlNlcmlvdXMgRVJST1IgOiBSeCBkYXRhIHNpemUgdG9vIGxvbmcsIHNpemUgPSVkXG4iLAorCQkJCQlQYWNrZXRTaXplKTsKIAkJCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CiAJCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKIAkJCQlicmVhazsKQEAgLTExOCw3ICsxMjMsOCBAQAogCQkJICogV2IzNVJ4X2luZGljYXRlKCkgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgc28gaXQgaXNuJ3QKIAkJCSAqIG5lY2Vzc2FyeSB0byBzZXQgIlJ4RGVzLkRlc2N0cmlwdG9yX0lEID0gUnhCdWZmZXJJRDsiCiAJCQkgKi8KLQkJCUJ1ZmZlclNpemUgLT0gODsgLyogc3VidHJhY3QgOCBieXRlIGZvciAzNSdzIFVTQiBoZWFkZXIgbGVuZ3RoICovCisJCQkvKiBzdWJ0cmFjdCA4IGJ5dGUgZm9yIDM1J3MgVVNCIGhlYWRlciBsZW5ndGggKi8KKwkJCUJ1ZmZlclNpemUgLT0gODsKIAkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gODsKIAogCQkJUnhEZXMuYnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzOwpAQCAtMjU1LDcgKzI2MSw3IEBACiAKIAlwV2IzNVJ4LT5wRFJ4ID0ga3phbGxvYyhNQVhfVVNCX1JYX0JVRkZFUiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwV2IzNVJ4LT5wRFJ4KSB7Ci0JCXByaW50aygidzM1dW5kOiBSeCBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZGV2X2luZm8oJmh3LT53aXBoeS0+ZGV2LCAidzM1dW5kOiBSeCBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7CkBAIC0yNzAsNyArMjc2LDcgQEAKIAlyZXR2ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAogCWlmIChyZXR2ICE9IDApIHsKLQkJcHJpbnRrKCJSeCBVUkIgc2VuZGluZyBlcnJvclxuIik7CisJCWRldl9pbmZvKCZody0+d2lwaHktPmRldiwgIlJ4IFVSQiBzZW5kaW5nIGVycm9yXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJcmV0dXJuOwpAQCAtMzA2LDcgKzMxMiw5IEBACiAJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwogCXBXYjM1UngtPnJ4X2hhbHQgPSAwOwogCi0JLyogSW5pdGlhbCB0aGUgUXVldWUuIFRoZSBsYXN0IGJ1ZmZlciBpcyByZXNlcnZlZCBmb3IgdXNlZCBpZiB0aGUgUnggcmVzb3VyY2UgaXMgdW5hdmFpbGFibGUuICovCisJLyogSW5pdGlhbCB0aGUgUXVldWUuIFRoZSBsYXN0IGJ1ZmZlciBpcyByZXNlcnZlZCBmb3IgdXNlZAorCSAqIGlmIHRoZSBSeCByZXNvdXJjZSBpcyB1bmF2YWlsYWJsZS4KKwkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOyBpKyspCiAJCXBXYjM1UngtPlJ4T3duZXJbaV0gPSAxOwogfQpAQCAtMzI4LDcgKzMzNiw4IEBACiAKIAkvKiBDYW5jZWxpbmcgdGhlIElycCBpZiBhbHJlYWR5IHNlbmRzIGl0IG91dC4gKi8KIAlpZiAocFdiMzVSeC0+RVAzdm1fc3RhdGUgPT0gVk1fUlVOTklORykgewotCQl1c2JfdW5saW5rX3VyYihwV2IzNVJ4LT5SeFVyYik7IC8qIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVSeF9kZXN0cm95IHRvIGZyZWUgdGhlbSAqLworCQkvKiBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0gKi8KKwkJdXNiX3VubGlua191cmIocFdiMzVSeC0+UnhVcmIpOwogCQlwcl9kZWJ1ZygiRVAzIFJ4IHN0b3BcbiIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmMKaW5kZXggMTNkMzYwZi4uNDg3NzQ2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQgKi8KLWNoYXIgc2lnbmF0dXJlWzE0XSA9ICJGVVBVN0QzN2RoZndjaSI7CitzdGF0aWMgY2hhciBzaWduYXR1cmVbMTRdID0gIkZVUFU3RDM3ZGhmd2NpIjsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoKQEAgLTEyMyw4ICsxMjMsOCBAQAogI2RlZmluZSBETF9TSVpFIDIwMDAKIAogLyogQ0ZHX0lERU5USVRZX1NUUkNUICAgCXByaV9pZGVudGl0eQk9IHsgTE9GKENGR19JREVOVElUWV9TVFJDVCksIENGR19QUklfSURFTlRJVFkgfTsgKi8KLUNGR19TVVBfUkFOR0VfU1RSQ1QgCW1maV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX01GSV9TVVBfUkFOR0UgfTsKLUNGR19TVVBfUkFOR0VfU1RSQ1QgCWNmaV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX0NGSV9TVVBfUkFOR0UgfTsKK3N0YXRpYyBDRkdfU1VQX1JBTkdFX1NUUkNUIAltZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19NRklfU1VQX1JBTkdFIH07CitzdGF0aWMgQ0ZHX1NVUF9SQU5HRV9TVFJDVCAJY2ZpX3N1cCAgICAgICAgCT0geyBMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCksIENGR19OSUNfQ0ZJX1NVUF9SQU5HRSB9OwogLyogTm90ZTogY291bGQgYmUgdXNlZCByYXRoZXIgdGhhbiB0aGUgYWJvdmUgZXhwbGFpbmVkIGFuZCBkZWZpbmVkIERMX1NJWkUgaWYgbmVlZCBhcmlzZXMKICAqIENGR19ETF9CVUZfU1RSQ1QgICAgCWRsX2J1ZiAgICAgICAgIAk9IHsgTE9GKENGR19ETF9CVUZfU1RSQ1QpLCBDRkdfRExfQlVGIH07CiAqLwpAQCAtMTM5LDcgKzEzOSw3IEBACiAgKiBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlIERIRiB1c2VkIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSBkcml2ZXIvdXRpbGl0eS4KICAqLwogCi1MVFZfSU5GT19TVFJVQ1QgbHR2X2luZm9bXSA9IHsKK3N0YXRpYyBMVFZfSU5GT19TVFJVQ1QgbHR2X2luZm9bXSA9IHsKIAl7IChMVFZQKSZtZmlfc3VwLAkJCUxPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSB9ICwKIAl7IChMVFZQKSZjZmlfc3VwLAkJCUxPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSB9ICwKIAl7IChMVFZQKSBOVUxMLCAJCQkJMCB9CkBAIC0xNjksNyArMTY5LDcgQEAKICogICBzdGF0aW9uIGZpcm13YXJlIGltYWdlIHRvIGJlIGRvd25sb2FkZWQgaXMgY29tcGF0aWJsZS4KICouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50CitzdGF0aWMgaW50CiBjaGVja19jb21wX2Z3KG1lbWltYWdlICpmdykKIHsKIENGR19SQU5HRTIwX1NUUkNUICAJCSpwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYwppbmRleCA0YWFjMjZkLi5mNDRkODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAjZW5kaWYgLy8gSENGX1RZUEVfV1BBCiAKICNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKLUNGR19JREVOVElUWV9TVFJDVCBCQVNFRCBjZmdfZHJ2X2lkZW50aXR5ID0geworc3RhdGljIENGR19JREVOVElUWV9TVFJDVCBCQVNFRCBjZmdfZHJ2X2lkZW50aXR5ID0gewogCXNpemVvZihjZmdfZHJ2X2lkZW50aXR5KS9zaXplb2YoaGNmXzE2KSAtIDEsICAgIC8vbGVuZ3RoIG9mIFJJRAogCUNGR19EUlZfSURFTlRJVFksICAgICAgICAgICAvLyAoMHgwODI2KQogCU1TRl9DT01QT05FTlRfSUQsCkBAIC0yNTksNyArMjU5LDcgQEAKIAlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgogfSA7CiAKLUNGR19SQU5HRVNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9zdXBfcmFuZ2UgPSB7CitzdGF0aWMgQ0ZHX1JBTkdFU19TVFJDVCBCQVNFRCBjZmdfZHJ2X3N1cF9yYW5nZSA9IHsKIAlzaXplb2YoY2ZnX2Rydl9zdXBfcmFuZ2UpL3NpemVvZihoY2ZfMTYpIC0gMSwgICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX1NVUF9SQU5HRSwgICAgICAgICAgLy8gKDB4MDgyNykKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAJfX0KIH0gOwogCi1zdHJ1Y3QgQ0ZHX1JBTkdFM19TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpID0geworc3RhdGljIHN0cnVjdCBDRkdfUkFOR0UzX1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkgPSB7CiAJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAogCUNGR19EUlZfQUNUX1JBTkdFU19QUkksICAgICAvLyAoMHgwODI4KQogCkBAIC0yODgsNyArMjg4LDcgQEAKIH0gOwogCiAKLXN0cnVjdCBDRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEgPSB7CitzdGF0aWMgc3RydWN0IENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSA9IHsKIAlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwgICAgIC8vICgweDA4MjkpCiAKQEAgLTMzMyw3ICszMzMsNyBAQAogfSA7CiAKIAotc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKK3N0YXRpYyBzdHJ1Y3QgQ0ZHX1JBTkdFNl9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpID0gewogCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJLCAgICAgLy8gKDB4MDgyQSkKIAlDT01QX1JPTEVfQUNULApAQCAtMzcwLDcgKzM3MCw3IEBACiB9IDsKIAogCi1DRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19hcGYgPSB7CitzdGF0aWMgQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0gewogCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGLCAgICAgLy8gKDB4MDgyQikKIApAQCAtMzA5OSw3ICszMDk5LDcgQEAKICNkZWZpbmUgTCAgICpwCiAjZGVmaW5lIFIgICAqKHArMSkKIAotdm9pZAorc3RhdGljIHZvaWQKIGNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBtICkKIHsKICNpZiBIQ0ZfQklHX0VORElBTgpAQCAtMzQxNSw3ICszNDE1LDcgQEAKICAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKK3N0YXRpYyBpbnQKIGNoZWNrX21pYyggSUZCUCBpZmJwICkKIHsKIAlpbnQgICAgIHJjID0gSENGX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMi5jCmluZGV4IDI1YWM3NmYuLjBiYThkZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMi5jCkBAIC00NDM1LDcgKzQ0MzUsNyBAQAogCQkwMDAwLAogCTB4MDAwRjM2OEUsCS8qIFN0YXJ0IGV4ZWN1dGlvbiBhZGRyZXNzICovCiAJfSwKLQl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAwMDAwLCAwMDAwLCAwMDAwMDAwMH0KKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAwMDAwLCAwMDAwLCBOVUxMfQogfTsKIAogc3RhdGljIGNvbnN0IENGR19SQU5HRTIwX1NUUkNUIGZ3X2ltYWdlX2luZm9jb21wYXRbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYwppbmRleCA2NTBkZWY4Li5mYzk4YjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jCkBAIC03NiwzOCArNzYsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLS8vICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotLy8jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KLS8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotLy8gI2luY2x1ZGUgPGFzbS9pby5oPgotLy8gLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKICNkZWZpbmUgQklOX0RMIDAKICNpZiBCSU5fREwKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jZW5kaWYgLy8gQklOX0RMCisjZW5kaWYgLyogQklOX0RMICovCiAKIAogI2luY2x1ZGUgPGRlYnVnLmg+CiAKICNpbmNsdWRlIDxoY2YuaD4KICNpbmNsdWRlIDxkaGYuaD4KLS8vaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZDo6IHdsX21haW4uYzoyMjI5OiBgSFJFR19FVl9SRE1BRCcgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIGluIHRoaXMgZnVuY3Rpb24pCisvKiBpbiBvcmRlciB0byBnZXQgYXJvdW5kOjogd2xfbWFpbi5jOjIyMjk6IGBIUkVHX0VWX1JETUFEJyB1bmRlY2xhcmVkIChmaXJzdCB1c2UgaW4gdGhpcyBmdW5jdGlvbikgKi8KICNpbmNsdWRlIDxoY2ZkZWYuaD4KIAogI2luY2x1ZGUgPHdsX2lmLmg+CkBAIC0xMzMsOCArMTE4LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIFZBTElEX1BBUkFNKEMpIFwKIAl7IFwKLQkJaWYgKCEoQykpIFwKLQkJeyBcCisJCWlmICghKEMpKSB7IFwKIAkJCXByaW50ayhLRVJOX0lORk8gIldpcmVsZXNzLCBwYXJhbWV0ZXIgZXJyb3I6IFwiJXNcIlxuIiwgI0MpOyBcCiAJCQlnb3RvIGZhaWxlZDsgXAogCQl9IFwKQEAgLTE0Miw3ICsxMjYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCWxvY2FsIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfaXNyX2hhbmRsZXIoIHVuc2lnbmVkIGxvbmcgcCApOwordm9pZCB3bF9pc3JfaGFuZGxlcih1bnNpZ25lZCBsb25nIHApOwogCiAjaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLwogc3RhdGljIGludCBzY3VsbF9yZWFkX3Byb2NtZW0oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKQEAgLTE2OCw3ICsxNTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG1vZHVsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgLSBzZXQgd2l0aCAnaW5zbW9kJwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBwX3UxNiAgICBpcnFfbWFzayAgICAgICAgICAgICAgICA9IDB4ZGViODsgLy8gSVJRMyw0LDUsNyw5LDEwLDExLDEyLDE0LDE1CitzdGF0aWMgcF91MTYgICAgaXJxX21hc2sgICAgICAgICAgICAgICAgPSAweGRlYjg7IC8qIElSUTMsNCw1LDcsOSwxMCwxMSwxMiwxNCwxNSAqLwogc3RhdGljIHBfczggICAgIGlycV9saXN0WzRdICAgICAgICAgICAgID0geyAtMSB9OwogCiAjaWYgMApAQCAtMTgzLDcgKzE2Nyw3IEBACiBzdGF0aWMgcF91MTYgICAgUEFSTV9CUlNDXzJHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0JSU0NfMkdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX0JSU0NfNUdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQlJTQ181R0haOwogc3RhdGljIHBfdTE2ICAgIFBBUk1fQ09FWElTVEVOQ0UgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9DT0VYSVNURU5DRTsKLXN0YXRpYyBwX3UxNiAgICBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAJPSBQQVJNX0RFRkFVTFRfQ09OTkVDVElPTl9DT05UUk9MOyAgLy87P3JlbmFtZSBhbmQgbW92ZQorc3RhdGljIHBfdTE2ICAgIFBBUk1fQ09OTkVDVElPTl9DT05UUk9MICAgCT0gUEFSTV9ERUZBVUxUX0NPTk5FQ1RJT05fQ09OVFJPTDsgIC8qIDs/cmVuYW1lIGFuZCBtb3ZlICovCiBzdGF0aWMgcF9jaGFyICAqUEFSTV9DUkVBVEVfSUJTUyAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0NSRUFURV9JQlNTX1NUUjsKIHN0YXRpYyBwX2NoYXIgICpQQVJNX0RFU0lSRURfU1NJRCAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1NJRDsKIHN0YXRpYyBwX2NoYXIgICpQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICAgICAgPSAiIjsKQEAgLTIyMCw3ICsyMDQsNyBAQAogc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDQgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwogc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDUgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwogc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDYgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwotI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAvKiBVU0VfV0RTICovCiBzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9TUlNDXzJHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NSU0NfMkdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1NSU0NfNUdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1JTQ181R0haOwpAQCAtMjM0LDcgKzIxOCw3IEBACiBzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNCAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU1ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOwogc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTYgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7Ci0jZW5kaWYgLy8gVVNFX1dEUworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIHN0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEUgICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOwogI2lmZGVmIFVTRV9XRFMKIHN0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTMVtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwpAQCAtMjQzLDcgKzIyNyw3IEBACiBzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzRbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKIHN0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNVtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwogc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M2W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7Ci0jZW5kaWYgLy8gVVNFX1dEUworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAogCiAjaWYgMApAQCAtMjk5LDM5ICsyODMsNDEgQEAKIE1PRFVMRV9QQVJNX0RFU0MoUEFSTV9CUlNDXzJHSFosICAgICAgICAgICAgICAgICJCYXNpYyBSYXRlIFNldCBDb250cm9sIDIuNCBHSHoiKTsKIE1PRFVMRV9QQVJNKFBBUk1fQlJTQ181R0haLCAgICAgICAgICAgICAiYiIpOwogTU9EVUxFX1BBUk1fREVTQyhQQVJNX0JSU0NfNUdIWiwgICAgICAgICAgICAgICAgIkJhc2ljIFJhdGUgU2V0IENvbnRyb2wgNS4wIEdIeiIpOwotI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCi0vLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKKyNpZiAxIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgKi8KKy8qIDs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQgKi8KIE1PRFVMRV9QQVJNKFBBUk1fUE1fRU5BQkxFRCwgICAgICAgICAgICAiaCIpOwogTU9EVUxFX1BBUk1fREVTQyhQQVJNX1BNX0VOQUJMRUQsICAgICAgICAgICAgICAgIlBvd2VyIE1hbmFnZW1lbnQgU3RhdGUgKDAgLSAyLCA4MDAxIC0gODAwMikgWzBdIik7CiBNT0RVTEVfUEFSTShQQVJNX1BPUlRfVFlQRSwgICAgICAgICAgICAgImIiKTsKIE1PRFVMRV9QQVJNX0RFU0MoUEFSTV9QT1JUX1RZUEUsICAgICAgICAgICAgICAgICJQb3J0IFR5cGUgKDEgLSAzKSBbMV0iKTsKLS8vOz9NT0RVTEVfUEFSTShQQVJNX0NSRUFURV9JQlNTLCAgICAgICAgICAgInMiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fQ1JFQVRFX0lCU1MsICAgICAgICAgICAgICAiQ3JlYXRlIElCU1MgKDxzdHJpbmc+IE4gb3IgWSkgW05dIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICJzIik7Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX01VTFRJQ0FTVF9SWCwgICAgICAgICAgICAgIk11bHRpY2FzdCBSZWNlaXZlIEVuYWJsZSAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKLS8vOz9NT0RVTEVfUEFSTShQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgImgiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTUFYX1NMRUVQLCAgICAgICAgICAgICAgICAiTWF4aW11bSBQb3dlciBNYW5hZ2VtZW50IFNsZWVwIER1cmF0aW9uICgwIC0gNjU1MzUpIFsxMDBdIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9ORVRXT1JLX0FERFIsICAgICAgICAgICI2YiIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9ORVRXT1JLX0FERFIsICAgICAgICAgICAgICJIYXJkd2FyZSBFdGhlcm5ldCBBZGRyZXNzIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgWzxmYWN0b3J5IHZhbHVlPl0iKTsKLS8vOz9NT0RVTEVfUEFSTShQQVJNX0FVVEhFTlRJQ0FUSU9OLCAgICAgICAgImIiKTsKLS8vCi0vL3RyYWNrZXIgMTI0NDgKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fQVVUSEVOVElDQVRJT04sICAgICAgICAgICAiQXV0aGVudGljYXRpb24gVHlwZSAoMC0yKSBbMF0gMD1PcGVuIDE9U2hhcmVkS2V5IDI9TEVBUCIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoYXV0aGVudGljYXRpb24sICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIFR5cGUgKDEtMikgWzFdIDE9T3BlbiAyPVNoYXJlZEtleSIpOwotLy90cmFja2VyIDEyNDQ4Ci0vLwotLy87P01PRFVMRV9QQVJNKFBBUk1fT1dOX0FUSU1fV0lORE9XLCAgICAgICAiYiIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fQVRJTV9XSU5ET1csICAgICAgICAgICJBVElNIFdpbmRvdyB0aW1lIGluIFRVIGZvciBJQlNTIGNyZWF0aW9uICgwLTEwMCkgWzBdIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICJiIik7Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAgICAgIlRpbWUgc3RhdGlvbiByZW1haW5zIGF3YWtlIGFmdGVyIE1BQyBmcmFtZSB0cmFuc2ZlciB3aGVuIFBNIGlzIG9uICgwLTY1NTM1KSBbMTAwXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAicyIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QUk9NSVNDVU9VU19NT0RFLCAgICAgICAgICJQcm9taXNjdW91cyBNb2RlIEVuYWJsZSAoPHN0cmluZz4gWSBvciBOICkgW05dIiApOwotLy87PworLyoKKyAqIDs/TU9EVUxFX1BBUk0oUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICJzIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0NSRUFURV9JQlNTLCAgICAgICAgICAgICAgIkNyZWF0ZSBJQlNTICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAicyIpOworICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICAgICJNdWx0aWNhc3QgUmVjZWl2ZSBFbmFibGUgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7CisgKjs/TU9EVUxFX1BBUk0oUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICJoIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgICAgIk1heGltdW0gUG93ZXIgTWFuYWdlbWVudCBTbGVlcCBEdXJhdGlvbiAoMCAtIDY1NTM1KSBbMTAwXSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAiNmIiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAgICAiSGFyZHdhcmUgRXRoZXJuZXQgQWRkcmVzcyAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFs8ZmFjdG9yeSB2YWx1ZT5dIik7CisgKjs/TU9EVUxFX1BBUk0oUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICJiIik7CisgKgorICp0cmFja2VyIDEyNDQ4CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0FVVEhFTlRJQ0FUSU9OLCAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIFR5cGUgKDAtMikgWzBdIDA9T3BlbiAxPVNoYXJlZEtleSAyPUxFQVAiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKGF1dGhlbnRpY2F0aW9uLCAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgxLTIpIFsxXSAxPU9wZW4gMj1TaGFyZWRLZXkiKTsKKyAqdHJhY2tlciAxMjQ0OAorICoKKyAqOz9NT0RVTEVfUEFSTShQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgImIiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0FUSU1fV0lORE9XLCAgICAgICAgICAiQVRJTSBXaW5kb3cgdGltZSBpbiBUVSBmb3IgSUJTUyBjcmVhdGlvbiAoMC0xMDApIFswXSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAiYiIpOworICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICAgICJUaW1lIHN0YXRpb24gcmVtYWlucyBhd2FrZSBhZnRlciBNQUMgZnJhbWUgdHJhbnNmZXIgd2hlbiBQTSBpcyBvbiAoMC02NTUzNSkgWzEwMF0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgInMiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAgICAiUHJvbWlzY3VvdXMgTW9kZSBFbmFibGUgKDxzdHJpbmc+IFkgb3IgTiApIFtOXSIgKTsKKyAqOz8KKyAqLwogTU9EVUxFX1BBUk0oUEFSTV9DT05ORUNUSU9OX0NPTlRST0wsICAgICJiIik7CiBNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQ09OTkVDVElPTl9DT05UUk9MLCAgICAgICAiQ29ubmVjdGlvbiBDb250cm9sICgwIC0gMykgWzJdIik7CiAjZW5kaWYgLyogSENGX1NUQSAqLwotI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKLQkJCQkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisjaWYgMSAvKiA7PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKwkJCQkJLyogOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludCAqLwogTU9EVUxFX1BBUk0oUEFSTV9PV05fRFRJTV9QRVJJT0QsICAgICAgICJiIik7CiBNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0RUSU1fUEVSSU9ELCAgICAgICAgICAiRFRJTSBQZXJpb2QgKDAgLSAyNTUpIFsxXSIpOwogTU9EVUxFX1BBUk0oUEFSTV9SRUpFQ1RfQU5ZLCAgICAgICAgICAgICJzIik7CkBAIC0zOTQsMTEgKzM4MCwxMiBAQAogI2lmIERCRwogCiBzdGF0aWMgcF91MzIgICAgcGNfZGVidWcgPSBEQkdfTFZMOwotLy9NT0RVTEVfUEFSTShwY19kZWJ1ZywgImkiKTsKLS8qc3RhdGljIDs/Y29uZmxpY3RzIHdpdGggbXkgdW5kZXJzdGFuZGluZyBvZiBDTCBwYXJhbWV0ZXJzIGFuZCBicmVha3Mgbm93IEkgbW92ZWQKKy8qCisgKiBNT0RVTEVfUEFSTShwY19kZWJ1ZywgImkiKTsKKyAqc3RhdGljIDs/Y29uZmxpY3RzIHdpdGggbXkgdW5kZXJzdGFuZGluZyBvZiBDTCBwYXJhbWV0ZXJzIGFuZCBicmVha3Mgbm93IEkgbW92ZWQKICAqIHRoZSBjb3JyZXNwb25kaWcgbG9naWMgdG8gd2xfcHJvZmlsZQotICovIHBfdTMyICAgIERlYnVnRmxhZyA9IH4wOyAvL3JlY29nbml6YWJsZSAidW5kZWZpbmVkIHZhbHVlIiByYXRoZXIgdGhlbiBEQkdfREVGQVVMVFM7Ci0vL01PRFVMRV9QQVJNKERlYnVnRmxhZywgImwiKTsKKyAqLyBwX3UzMiAgICBEZWJ1Z0ZsYWcgPSB+MDsgLyogcmVjb2duaXphYmxlICJ1bmRlZmluZWQgdmFsdWUiIHJhdGhlciB0aGVuIERCR19ERUZBVUxUUzsgKi8KKy8qIE1PRFVMRV9QQVJNKERlYnVnRmxhZywgImwiKTsgKi8KIAogc3RhdGljIHN0cnVjdCBkYmdfaW5mbyB3bF9pbmZvID0geyBLQlVJTERfTU9ETkFNRSwgMCwgMCB9Owogc3RydWN0IGRiZ19pbmZvICpEYmdJbmZvID0gJndsX2luZm87CkBAIC00MDcsOCArMzk0LDggQEAKICNpZmRlZiBVU0VfUlRTCiAKIHN0YXRpYyBwX2NoYXIgICp1c2VSVFMgPSAiTiI7Ci1NT0RVTEVfUEFSTSggdXNlUlRTLCAicyIgKTsKLU1PRFVMRV9QQVJNX0RFU0MoIHVzZVJUUywgIlVzZSBSVFMgdGVzdCBpbnRlcmZhY2UgKDxzdHJpbmc+IE4gb3IgWSkgW05dIiApOworTU9EVUxFX1BBUk0odXNlUlRTLCAicyIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VSVFMsICJVc2UgUlRTIHRlc3QgaW50ZXJmYWNlICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOwogCiAjZW5kaWYgIC8qIFVTRV9SVFMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MjcsNyArNDE0LDcgQEAKICNlbmRpZiAvKiBIQ0ZfU1RBICovCiAKIAotaW50IHdsX2luc2VydCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfaW5zZXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CkBAIC00MzYsMTAgKzQyMywxMCBAQAogCXN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKIAogCS8qIEluaXRpYWxpemUgdGhlIGFkYXB0ZXIgaGFyZHdhcmUuICovCi0JbWVtc2V0KCAmKCBscC0+aGNmQ3R4ICksIDAsIHNpemVvZiggSUZCX1NUUkNUICkpOworCW1lbXNldCgmKGxwLT5oY2ZDdHgpLCAwLCBzaXplb2YoSUZCX1NUUkNUKSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMuICovCi0Jc3Bpbl9sb2NrX2luaXQoICYoIGxwLT5zbG9jayApKTsKKwlzcGluX2xvY2tfaW5pdCgmKGxwLT5zbG9jaykpOwogCiAJLyogSW5pdGlhbGl6ZSBzdGF0ZXMgKi8KIAkvL2xwLT5sb2NrY291bnQgPSAwOyAvL1BFMUROTgpAQCAtNDQ4LDMxICs0MzUsMzEgQEAKIAogCWxwLT5kZXYgPSBkZXY7CiAKLQlEQkdfUEFSQU0oIERiZ0luZm8sICJpcnFfbWFzayIsICIweCUwNHgiLCBpcnFfbWFzayAmIDB4MEZGRkYgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sICJpcnFfbGlzdCIsICIweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMngiLAorCURCR19QQVJBTShEYmdJbmZvLCAiaXJxX21hc2siLCAiMHglMDR4IiwgaXJxX21hc2sgJiAweDBGRkZGKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImlycV9saXN0IiwgIjB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeCIsCiAJCQkgICBpcnFfbGlzdFswXSAmIDB4MEZGLCBpcnFfbGlzdFsxXSAmIDB4MEZGLAotCQkJICAgaXJxX2xpc3RbMl0gJiAweDBGRiwgaXJxX2xpc3RbM10gJiAweDBGRiApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCwgIlwiJXNcIiIsIFBBUk1fREVTSVJFRF9TU0lEICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX1NTSUQsICJcIiVzXCIiLCBQQVJNX09XTl9TU0lEICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX0NIQU5ORUwsICIlZCIsIFBBUk1fT1dOX0NIQU5ORUwpOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSwgIiVkIiwgUEFSTV9TWVNURU1fU0NBTEUgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFLCAiJWQiLCBQQVJNX1RYX1JBVEUgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgIlwiJXNcIiIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fTkFNRSwgIlwiJXNcIiIsIFBBUk1fT1dOX05BTUUgKTsKKwkJCSAgIGlycV9saXN0WzJdICYgMHgwRkYsIGlycV9saXN0WzNdICYgMHgwRkYpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfREVTSVJFRF9TU0lELCAiXCIlc1wiIiwgUEFSTV9ERVNJUkVEX1NTSUQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfT1dOX1NTSUQsICJcIiVzXCIiLCBQQVJNX09XTl9TU0lEKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCAiJWQiLCBQQVJNX09XTl9DSEFOTkVMKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSwgIiVkIiwgUEFSTV9TWVNURU1fU0NBTEUpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURSwgIiVkIiwgUEFSTV9UWF9SQVRFKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRCk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgIlwiJXNcIiIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfT1dOX05BTUUsICJcIiVzXCIiLCBQQVJNX09XTl9OQU1FKTsKIC8vOz8JCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OLCAiXCIlc1wiIiwgUEFSTV9FTkFCTEVfRU5DUllQVElPTiApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTEsICJcIiVzXCIiLCBQQVJNX0tFWTEgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkyLCAiXCIlc1wiIiwgUEFSTV9LRVkyICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZMywgIlwiJXNcIiIsIFBBUk1fS0VZMyApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTQsICJcIiVzXCIiLCBQQVJNX0tFWTQgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9LRVksICIlZCIsIFBBUk1fVFhfS0VZICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUsICIlZCIsIFBBUk1fTVVMVElDQVNUX1JBVEUgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSwgIlwiJXNcIiIsIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFLCAiJWQiLCBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0tFWTEsICJcIiVzXCIiLCBQQVJNX0tFWTEpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfS0VZMiwgIlwiJXNcIiIsIFBBUk1fS0VZMik7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9LRVkzLCAiXCIlc1wiIiwgUEFSTV9LRVkzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0tFWTQsICJcIiVzXCIiLCBQQVJNX0tFWTQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfS0VZLCAiJWQiLCBQQVJNX1RYX0tFWSk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSwgIiVkIiwgUEFSTV9NVUxUSUNBU1RfUkFURSk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSwgIlwiJXNcIiIsIFBBUk1fRE9XTkxPQURfRklSTVdBUkUpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgIiVkIiwgUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFKTsKIC8vOz8jaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQogCQkJCQkvLzs/c2hvdWxkIHdlIG1ha2UgdGhpcyBjb2RlIGNvbmRpdGlvbmFsIGRlcGVuZGluZyBvbiBpbiBTVEEgbW9kZQogLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE9SVF9UWVBFLCAiJWQiLCBQQVJNX1BPUlRfVFlQRSApOwotCQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9QTV9FTkFCTEVELCAiJTA0eCIsIFBBUk1fUE1fRU5BQkxFRCApOworCQlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1BNX0VOQUJMRUQsICIlMDR4IiwgUEFSTV9QTV9FTkFCTEVEKTsKIC8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCAiXCIlc1wiIiwgUEFSTV9DUkVBVEVfSUJTUyApOwogLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1JYLCAiXCIlc1wiIiwgUEFSTV9NVUxUSUNBU1RfUlggKTsKIC8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01BWF9TTEVFUCwgIiVkIiwgUEFSTV9NQVhfU0xFRVAgKTsKQEAgLTQ4OCwyNCArNDc1LDI0IEBACiAjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAogCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKIAkJLy87P0kgZ3Vlc3M6IG5vLCBzaW5jZSB0aGlzIGlzIERlYnVnIG1vZGUgb25seQotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCwgIiVkIiwgUEFSTV9PV05fRFRJTV9QRVJJT0QgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZLCAiXCIlc1wiIiwgUEFSTV9SRUpFQ1RfQU5ZICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRVhDTFVERV9VTkVOQ1JZUFRFRCwgIlwiJXNcIiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsICJcIiVzXCIiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVksICJcIiVzXCIiLCBQQVJNX0lOVFJBX0JTU19SRUxBWSApOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9ELCAiJWQiLCBQQVJNX09XTl9EVElNX1BFUklPRCk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZLCAiXCIlc1wiIiwgUEFSTV9SRUpFQ1RfQU5ZKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsICJcIiVzXCIiLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1BNX0JVRkZFUklORywgIlwiJXNcIiIsIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORyk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVksICJcIiVzXCIiLCBQQVJNX0lOVFJBX0JTU19SRUxBWSk7CiAjaWZkZWYgVVNFX1dEUwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQxICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDIgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMywgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMyApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ0ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDUgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENiApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUxLCAiJWQiLCBQQVJNX1RYX1JBVEUxICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTIsICIlZCIsIFBBUk1fVFhfUkFURTIgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMywgIiVkIiwgUEFSTV9UWF9SQVRFMyApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU0LCAiJWQiLCBQQVJNX1RYX1JBVEU0ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTUsICIlZCIsIFBBUk1fVFhfUkFURTUgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNiwgIiVkIiwgUEFSTV9UWF9SQVRFNiApOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDEpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDIpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDMpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDUpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDYpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTEsICIlZCIsIFBBUk1fVFhfUkFURTEpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTIsICIlZCIsIFBBUk1fVFhfUkFURTIpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTMsICIlZCIsIFBBUk1fVFhfUkFURTMpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTQsICIlZCIsIFBBUk1fVFhfUkFURTQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTUsICIlZCIsIFBBUk1fVFhfUkFURTUpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTYsICIlZCIsIFBBUk1fVFhfUkFURTYpOwogCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxLCAiXCIlcE1cIiIsCiAJCQlQQVJNX1dEU19BRERSRVNTMSk7CiAJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIsICJcIiVwTVwiIiwKQEAgLTUyMSwyOCArNTA4LDI4IEBACiAjZW5kaWYgLyogVVNFX1dEUyAqLwogI2VuZGlmIC8qIEhDRl9BUCAqLwogCi0JVkFMSURfUEFSQU0oICFQQVJNX0RFU0lSRURfU1NJRCB8fCAoIHN0cmxlbiggUEFSTV9ERVNJUkVEX1NTSUQgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKLQlWQUxJRF9QQVJBTSggIVBBUk1fT1dOX1NTSUQgfHwgKCBzdHJsZW4oIFBBUk1fT1dOX1NTSUQgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fT1dOX0NIQU5ORUwgPD0gUEFSTV9NQVhfT1dOX0NIQU5ORUwgKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX1NZU1RFTV9TQ0FMRSA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUgKSAmJiAoIFBBUk1fU1lTVEVNX1NDQUxFIDw9IFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURSA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCBQQVJNX1RYX1JBVEUgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOwotCVZBTElEX1BBUkFNKCAhUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTU1swXSApICE9IE5VTEwgKTsKLQlWQUxJRF9QQVJBTSggIVBBUk1fT1dOX05BTUUgfHwgKCBzdHJsZW4oIFBBUk1fTkFNRV9PV05fTkFNRSApIDw9IFBBUk1fTUFYX05BTUVfTEVOICkpOwotCVZBTElEX1BBUkFNKCggUEFSTV9FTkFCTEVfRU5DUllQVElPTiA8PSBQQVJNX01BWF9FTkFCTEVfRU5DUllQVElPTiApKTsKLQlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkxICkpOwotCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTIgKSk7Ci0JVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMyApKTsKLQlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVk0ICkpOwotCVZBTElEX1BBUkFNKCggUEFSTV9UWF9LRVkgPj0gUEFSTV9NSU5fVFhfS0VZICkgJiYgKCBQQVJNX1RYX0tFWSA8PSBQQVJNX01BWF9UWF9LRVkgKSk7CisJVkFMSURfUEFSQU0oIVBBUk1fREVTSVJFRF9TU0lEIHx8IChzdHJsZW4oUEFSTV9ERVNJUkVEX1NTSUQpIDw9IFBBUk1fTUFYX05BTUVfTEVOKSk7CisJVkFMSURfUEFSQU0oIVBBUk1fT1dOX1NTSUQgfHwgKHN0cmxlbihQQVJNX09XTl9TU0lEKSA8PSBQQVJNX01BWF9OQU1FX0xFTikpOworCVZBTElEX1BBUkFNKChQQVJNX09XTl9DSEFOTkVMIDw9IFBBUk1fTUFYX09XTl9DSEFOTkVMKSk7CisJVkFMSURfUEFSQU0oKFBBUk1fU1lTVEVNX1NDQUxFID49IFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSkgJiYgKFBBUk1fU1lTVEVNX1NDQUxFIDw9IFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSkpOworCVZBTElEX1BBUkFNKChQQVJNX1RYX1JBVEUgPj0gUEFSTV9NSU5fVFhfUkFURSkgJiYgKFBBUk1fVFhfUkFURSA8PSBQQVJNX01BWF9UWF9SQVRFKSk7CisJVkFMSURfUEFSQU0oKFBBUk1fUlRTX1RIUkVTSE9MRCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEKSk7CisJVkFMSURfUEFSQU0oIVBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgfHwgc3RyY2hyKCJObll5IiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTU1swXSkgIT0gTlVMTCk7CisJVkFMSURfUEFSQU0oIVBBUk1fT1dOX05BTUUgfHwgKHN0cmxlbihQQVJNX05BTUVfT1dOX05BTUUpIDw9IFBBUk1fTUFYX05BTUVfTEVOKSk7CisJVkFMSURfUEFSQU0oKFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04pKTsKKwlWQUxJRF9QQVJBTShpc192YWxpZF9rZXlfc3RyaW5nKFBBUk1fS0VZMSkpOworCVZBTElEX1BBUkFNKGlzX3ZhbGlkX2tleV9zdHJpbmcoUEFSTV9LRVkyKSk7CisJVkFMSURfUEFSQU0oaXNfdmFsaWRfa2V5X3N0cmluZyhQQVJNX0tFWTMpKTsKKwlWQUxJRF9QQVJBTShpc192YWxpZF9rZXlfc3RyaW5nKFBBUk1fS0VZNCkpOworCVZBTElEX1BBUkFNKChQQVJNX1RYX0tFWSA+PSBQQVJNX01JTl9UWF9LRVkpICYmIChQQVJNX1RYX0tFWSA8PSBQQVJNX01BWF9UWF9LRVkpKTsKIAotCVZBTElEX1BBUkFNKCggUEFSTV9NVUxUSUNBU1RfUkFURSA+PSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSApICYmCi0JCQkJCSggUEFSTV9NVUxUSUNBU1RfUkFURSA8PSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9NVUxUSUNBU1RfUkFURSA+PSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSkgJiYKKwkJCQkJKFBBUk1fTVVMVElDQVNUX1JBVEUgPD0gUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUpKTsKIAotCVZBTElEX1BBUkFNKCAhUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSB8fCAoIHN0cmxlbiggUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSApIDw9IDI1NSAvKjs/Ki8gKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgPCBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFICkpOworCVZBTElEX1BBUkFNKCFQQVJNX0RPV05MT0FEX0ZJUk1XQVJFIHx8IChzdHJsZW4oUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSkgPD0gMjU1IC8qOz8qLykpOworCVZBTElEX1BBUkFNKChQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgPCBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFKSk7CiAKLQlWQUxJRF9QQVJBTSggIVBBUk1fTE9BRF9CQUxBTkNJTkcgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oIVBBUk1fTE9BRF9CQUxBTkNJTkcgfHwgc3RyY2hyKCJObll5IiwgUEFSTV9MT0FEX0JBTEFOQ0lOR1swXSkgIT0gTlVMTCk7CiAJVkFMSURfUEFSQU0oICFQQVJNX01FRElVTV9ESVNUUklCVVRJT04gfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTlswXSApICE9IE5VTEwgKTsKIAlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUE9XX0xFVkVMIDw9IFBBUk1fTUFYX1RYX1BPV19MRVZFTCApKTsKIApAQCAtNjAxLDMzICs1ODgsMjUgQEAKIAlscC0+TXVsdGljYXN0UmF0ZVswXSAgICA9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV8yR0haOwogCWxwLT5NdWx0aWNhc3RSYXRlWzFdICAgID0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzVHSFo7CiAKLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTU1swXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICkKIAkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IDA7Ci0JfQotCWlmICggUEFSTV9ERVNJUkVEX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CisJaWYgKCBQQVJNX0RFU0lSRURfU1NJRCAmJiAoIHN0cmxlbiggUEFSTV9ERVNJUkVEX1NTSUQgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpCiAJCXN0cmNweSggbHAtPk5ldHdvcmtOYW1lLCBQQVJNX0RFU0lSRURfU1NJRCApOwotCX0KLQlpZiAoIFBBUk1fT1dOX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX1NTSUQgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKKwlpZiAoIFBBUk1fT1dOX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX1NTSUQgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpCiAJCXN0cmNweSggbHAtPk5ldHdvcmtOYW1lLCBQQVJNX09XTl9TU0lEICk7Ci0JfQotCWlmICggUEFSTV9PV05fTkFNRSAmJiAoIHN0cmxlbiggUEFSTV9PV05fTkFNRSApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkgeworCWlmICggUEFSTV9PV05fTkFNRSAmJiAoIHN0cmxlbiggUEFSTV9PV05fTkFNRSApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkKIAkJc3RyY3B5KCBscC0+U3RhdGlvbk5hbWUsIFBBUk1fT1dOX05BTUUgKTsKLQl9CiAJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OOwotCWlmICggUEFSTV9LRVkxICYmICggc3RybGVuKCBQQVJNX0tFWTEgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJaWYgKCBQQVJNX0tFWTEgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMSApIDw9IE1BWF9LRVlfTEVOICkpCiAJCXN0cmNweSggbHAtPktleTEsIFBBUk1fS0VZMSApOwotCX0KLQlpZiAoIFBBUk1fS0VZMiAmJiAoIHN0cmxlbiggUEFSTV9LRVkyICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCWlmICggUEFSTV9LRVkyICYmICggc3RybGVuKCBQQVJNX0tFWTIgKSA8PSBNQVhfS0VZX0xFTiApKQogCQlzdHJjcHkoIGxwLT5LZXkyLCBQQVJNX0tFWTIgKTsKLQl9Ci0JaWYgKCBQQVJNX0tFWTMgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMyApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwlpZiAoIFBBUk1fS0VZMyAmJiAoIHN0cmxlbiggUEFSTV9LRVkzICkgPD0gTUFYX0tFWV9MRU4gKSkKIAkJc3RyY3B5KCBscC0+S2V5MywgUEFSTV9LRVkzICk7Ci0JfQotCWlmICggUEFSTV9LRVk0ICYmICggc3RybGVuKCBQQVJNX0tFWTQgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJaWYgKCBQQVJNX0tFWTQgJiYgKCBzdHJsZW4oIFBBUk1fS0VZNCApIDw9IE1BWF9LRVlfTEVOICkpCiAJCXN0cmNweSggbHAtPktleTQsIFBBUk1fS0VZNCApOwotCX0KIAogCWxwLT5UcmFuc21pdEtleUlEID0gUEFSTV9UWF9LRVk7CiAKQEAgLTYzOSwxNyArNjE4LDE1IEBACiAJbHAtPkRvd25sb2FkRmlybXdhcmUgPSAxIDsgLy87P3RvIGJlIHVwZ3JhZGVkIFBBUk1fRE9XTkxPQURfRklSTVdBUkU7CiAJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEU7CiAKLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9MT0FEX0JBTEFOQ0lOR1swXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0gKSAhPSBOVUxMICkKIAkJbHAtPmxvYWRCYWxhbmNpbmcgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+bG9hZEJhbGFuY2luZyA9IDA7Ci0JfQogCi0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTlswXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTlswXSApICE9IE5VTEwgKQogCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IDA7Ci0JfQogCiAJbHAtPnR4UG93TGV2ZWwgPSBQQVJNX1RYX1BPV19MRVZFTDsKIApAQCAtNjY1LDI0ICs2NDIsMjAgQEAKIAlscC0+YXRpbVdpbmRvdyAgICAgICAgICA9IFBBUk1fT1dOX0FUSU1fV0lORE9XOwogCWxwLT5ob2xkb3ZlckR1cmF0aW9uICAgID0gUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTjsKIAlscC0+UE1FbmFibGVkICAgICAgICAgICA9IFBBUk1fUE1fRU5BQkxFRDsgIC8vOz8KLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9DUkVBVEVfSUJTU1swXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fQ1JFQVRFX0lCU1NbMF0gKSAhPSBOVUxMICkKIAkJbHAtPkNyZWF0ZUlCU1MgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+Q3JlYXRlSUJTUyA9IDA7Ci0JfQotCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX01VTFRJQ0FTVF9SWFswXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fTVVMVElDQVNUX1JYWzBdICkgIT0gTlVMTCApCiAJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gMDsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPk11bHRpY2FzdFJlY2VpdmUgPSAxOwotCX0KLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9QUk9NSVNDVU9VU19NT0RFWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9QUk9NSVNDVU9VU19NT0RFWzBdICkgIT0gTlVMTCApCiAJCWxwLT5wcm9taXNjdW91c01vZGUgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gMDsKLQl9Ci0JZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7Ci0JICAgbHAtPk1BQ0FkZHJlc3NbaV0gPSBQQVJNX05FVFdPUktfQUREUltpXTsKLQl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKQorCQlscC0+TUFDQWRkcmVzc1tpXSA9IFBBUk1fTkVUV09SS19BRERSW2ldOwogCiAJbHAtPmNvbm5lY3Rpb25Db250cm9sID0gUEFSTV9DT05ORUNUSU9OX0NPTlRST0w7CiAKQEAgLTY5MSwyNiArNjY0LDIyIEBACiAJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CiAJbHAtPkRUSU1QZXJpb2QgPSBQQVJNX09XTl9EVElNX1BFUklPRDsKIAotCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX1JFSkVDVF9BTllbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX1JFSkVDVF9BTllbMF0gKSAhPSBOVUxMICkKIAkJbHAtPlJlamVjdEFueSA9IDE7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT5SZWplY3RBbnkgPSAwOwotCX0KLQlpZiAoIHN0cmNociggIk5uIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIk5uIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEWzBdICkgIT0gTlVMTCApCiAJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSAwOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gMTsKLQl9Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklOR1swXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklOR1swXSApICE9IE5VTEwgKQogCQlscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgPSAwOwotCX0KLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0lOVFJBX0JTU19SRUxBWVswXSApICE9IE5VTEwgKQogCQlscC0+aW50cmFCU1NSZWxheSA9IDE7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT5pbnRyYUJTU1JlbGF5ID0gMDsKLQl9CiAKIAlscC0+b3duQmVhY29uSW50ZXJ2YWwgPSBQQVJNX09XTl9CRUFDT05fSU5URVJWQUw7CiAJbHAtPmNvZXhpc3RlbmNlICAgICAgID0gUEFSTV9DT0VYSVNURU5DRTsKQEAgLTc1MCwxMSArNzE5LDEwIEBACiAjZW5kaWYgIC8qIFVTRV9XRFMgKi8KICNlbmRpZiAgLyogSENGX0FQICovCiAjaWZkZWYgVVNFX1JUUwotCWlmICggc3RyY2hyKCAiWXkiLCB1c2VSVFNbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCB1c2VSVFNbMF0gKSAhPSBOVUxMICkKIAkJbHAtPnVzZVJUUyA9IDE7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT51c2VSVFMgPSAwOwotCX0KICNlbmRpZiAgLyogVVNFX1JUUyAqLwogCiAKQEAgLTE1NjAsNyArMTUyOCw4IEBACiAJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CiAKIAkvKiBPd24gTmFtZSAoU3RhdGlvbiBOaWNrbmFtZSkgKi8KLQlpZiAoKCBsZW4gPSAoIHN0cmxlbiggbHAtPlN0YXRpb25OYW1lICkgKyAxICkgJiB+MHgwMSApICE9IDAgKSB7CisJbGVuID0gKHN0cmxlbihscC0+U3RhdGlvbk5hbWUpICsgMSkgJiB+MHgwMTsKKwlpZiAobGVuICE9IDApIHsKIAkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9OQU1FICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKIAkJLy8gICAgICAgICAgIGxwLT5TdGF0aW9uTmFtZSApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCmluZGV4IDk2NWIxYzAuLjc3ZTRiZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCkBAIC02OCwzMSArNjgsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotLy8jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0vLyAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0vLyAvLyAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgotCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKICNpbmNsdWRlIDxkZWJ1Zy5oPgogCiAjaW5jbHVkZSA8aGNmLmg+CiAjaW5jbHVkZSA8ZGhmLmg+Ci0vLyAjaW5jbHVkZSA8aGNmZGVmLmg+CiAKICNpbmNsdWRlIDx3bF9pZi5oPgogI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CkBAIC0xMDQsMTYgKzg3LDE1IEBACiAKICNpZmRlZiBVU0VfUFJPRklMRQogI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KLSNlbmRpZiAgLyogVVNFX1BST0ZJTEUgKi8KKyNlbmRpZiAvKiBVU0VfUFJPRklMRSAqLwogCiAjaWZkZWYgQlVTX1BDTUNJQQogI2luY2x1ZGUgPHdsX2NzLmg+Ci0jZW5kaWYgIC8qIEJVU19QQ01DSUEgKi8KKyNlbmRpZiAvKiBCVVNfUENNQ0lBICovCiAKICNpZmRlZiBCVVNfUENJCiAjaW5jbHVkZSA8d2xfcGNpLmg+Ci0jZW5kaWYgIC8qIEJVU19QQ0kgKi8KLQorI2VuZGlmIC8qIEJVU19QQ0kgKi8KIAogI2lmIEhDRl9FTkNBUAogI2RlZmluZSBNVFVfTUFYIChIQ0ZfTUFYX01TRyAtIEVUSF9ITEVOIC0gOCkKQEAgLTEyMSwxNyArMTAzLDE1IEBACiAjZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4pCiAjZW5kaWYKIAotLy9zdGF0aWMgaW50IG10dSA9IE1UVV9NQVg7Ci0vL01PRFVMRV9QQVJNKG10dSwgImkiKTsKLS8vTU9EVUxFX1BBUk1fREVTQyhtdHUsICJNVFUiKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG1hY3JvcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQkxPQ0tfSU5QVVQoYnVmLCBsZW4pIFwKLSAgICBkZXNjLT5idWZfYWRkciA9IGJ1ZjsgXAotICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCi0gICAgc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCkKKwlkbyB7IFwKKwkJZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKKwkJZGVzYy0+QlVGX1NJWkUgPSBsZW47IFwKKwkJc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCk7IFwKKwl9IHdoaWxlICgwKQogCiAjZGVmaW5lIEJMT0NLX0lOUFVUX0RNQShidWYsIGxlbikgbWVtY3B5KCBidWYsIGRlc2NfbmV4dC0+YnVmX2FkZHIsIHBrdGxlbiApCiAKQEAgLTE1OCwyMCArMTM4LDEyIEBACiAgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfaW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotLy8gICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKLS8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKwlyZXR1cm4gMDsKK30JCQkJLyogd2xfaW5pdCAqLwogCi0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7Ci0KLSAgICAvKiBOb3RoaW5nIHRvIGRvLCBidXQgZ3JhYiB0aGUgc3BpbmxvY2sgYW55d2F5IGp1c3QgaW4gY2FzZSB3ZSBldmVyIG5lZWQKLSAgICAgICB0aGlzIHJvdXRpbmUgKi8KLS8vICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci0vLyAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0KLSAgICByZXR1cm4gMDsKLX0gLy8gd2xfaW5pdAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5MywxNyArMTY1LDIwIEBACiAgKiAgICAgIGVycm5vIG90aGVyd2lzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfY29uZmlnKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCApCitpbnQgd2xfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQogewotICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwotICAgIERCR19QQVJBTSggRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwICk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAibWFwIiwgIjB4JXAiLCBtYXApOwogCi0gICAgLyogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuIFNpbmNlIHRoaXMgbm90IG5lZWRlZCwKLSAgICAgICBpZ25vcmUgdGhlIHJlcXVlc3QuICovCi0gICAgREJHX1RSQUNFKERiZ0luZm8sICIlczogJXMgY2FsbGVkLlxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CisJLyoKKwkgKiBUaGUgb25seSB0aGluZyB3ZSBjYXJlIGFib3V0IGhlcmUgaXMgYSBwb3J0IGNoYW5nZS4KKwkgKiBTaW5jZSB0aGlzIG5vdCBuZWVkZWQsIGlnbm9yZSB0aGUgcmVxdWVzdC4gCisJICovCisJREJHX1RSQUNFKERiZ0luZm8sICIlczogJXMgY2FsbGVkLlxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKLSAgICByZXR1cm4gMDsKLX0gLy8gd2xfY29uZmlnCisJcmV0dXJuIDA7Cit9CQkJCS8qIHdsX2NvbmZpZyAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjI0LDQ4ICsxOTksNDcgQEAKICAqICAgICAgc3RhdGlzdGljcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogI2lmZGVmIFVTRV9XRFMKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICAgICpwU3RhdHM7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgY291bnQ7CisjZW5kaWYgLyogVVNFX1dEUyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0czsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAKLSAgICAvL0RCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCS8qREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7ICovCiAKLSAgICBwU3RhdHMgPSBOVUxMOworCXBTdGF0cyA9IE5VTEw7CiAKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotCXJldHVybiBOVUxMOwotICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYgLyogVVNFX1JUUyAqLwogCi0gICAgLyogUmV0dXJuIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlICovCisJLyogUmV0dXJuIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlICovCiAjaWZkZWYgVVNFX1dEUwogCi0gICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLQlpZiggZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgewotCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQlpZiAoZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KQorCQkJcFN0YXRzID0gJihscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzKTsKIAl9Ci0gICAgfQogCi0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKLSAgICAvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCi0gICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgewotICAgICAgICBwU3RhdHMgPSAmKCBscC0+c3RhdHMgKTsKLSAgICB9CisJLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLworCWlmIChwU3RhdHMgPT0gTlVMTCkKKwkJcFN0YXRzID0gJihscC0+c3RhdHMpOwogCi0gICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgcmV0dXJuIHBTdGF0czsKLX0gLy8gd2xfc3RhdHMKKwlyZXR1cm4gcFN0YXRzOworfQkJCQkvKiB3bF9zdGF0cyAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjg4LDc1ICsyNjIsNzcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgd2xfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzID0gSENGX1NVQ0NFU1M7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKwlpbnQgc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBvcGVuLCBpbiBSVFMgbW9kZVxuIiApOwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotCXJldHVybiAtRUlPOwotICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJREJHX1RSQUNFKERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2Ugb3BlbiwgaW4gUlRTIG1vZGVcbiIpOworCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCXJldHVybiAtRUlPOworCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKICNpZmRlZiBVU0VfUFJPRklMRQotICAgIHBhcnNlX2NvbmZpZyggZGV2ICk7CisJcGFyc2VfY29uZmlnKGRldik7CiAjZW5kaWYKIAotICAgIGlmKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQgKSB7Ci0JREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxpbmcgUG9ydCAwXG4iICk7Ci0Jc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOworCWlmIChscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJREJHX1RSQUNFKERiZ0luZm8sICJFbmFibGluZyBQb3J0IDBcbiIpOworCQlzdGF0dXMgPSB3bF9lbmFibGUobHApOwogCi0gICAgICAgIGlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7Ci0gICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGUgcG9ydCAwIGZhaWxlZDogMHgleFxuIiwgc3RhdHVzICk7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmIChzdGF0dXMgIT0gSENGX1NVQ0NFU1MpIHsKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsCisJCQkJICBzdGF0dXMpOworCQl9CisJfQogCi0gICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKLSAgICB3bF91bmxvY2sobHAsICZmbGFncyk7Ci0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICBpZiAoIHN0cmxlbiggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lICkgKSB7Ci0JREJHX1RSQUNFKCBEYmdJbmZvLCAiOz8/Pz8gS2x1ZGd5IHdheSB0byBmb3JjZSBhIGRvd25sb2FkXG4iICk7Ci0Jc3RhdHVzID0gd2xfZ28oIGxwICk7Ci0gICAgfSBlbHNlIHsKLQlzdGF0dXMgPSB3bF9hcHBseSggbHAgKTsKLSAgICB9CisJaWYgKHN0cmxlbihscC0+ZndfaW1hZ2VfZmlsZW5hbWUpKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiOz8/Pz8gS2x1ZGd5IHdheSB0byBmb3JjZSBhIGRvd25sb2FkXG4iKTsKKwkJc3RhdHVzID0gd2xfZ28obHApOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHdsX2FwcGx5KGxwKTsKKwl9CiAKLSAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcwotICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKIAotICAgIGlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7Ci0JLy8gVW5zdWNjZXNzZnVsLCB0cnkgcmVzZXQgb2YgdGhlIGNhcmQgdG8gcmVjb3ZlcgotCXN0YXR1cyA9IHdsX3Jlc2V0KCBkZXYgKTsKLSAgICB9CisJLyogVW5zdWNjZXNzZnVsLCB0cnkgcmVzZXQgb2YgdGhlIGNhcmQgdG8gcmVjb3ZlciAqLworCWlmIChzdGF0dXMgIT0gSENGX1NVQ0NFU1MpCisJCXN0YXR1cyA9IHdsX3Jlc2V0KGRldik7CiAKLSAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcwotICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKIAotICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7Ci0JbmV0aWZfY2Fycmllcl9vbiggZGV2ICk7Ci0JV0xfV0RTX05FVElGX0NBUlJJRVJfT04oIGxwICk7CisJaWYgKHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUykgeworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCVdMX1dEU19ORVRJRl9DQVJSSUVSX09OKGxwKTsKIAotCWxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9IQU5ETElOR19JTlQ7IC8vIFN0YXJ0IGhhbmRsaW5nIGludGVycnVwdHMKLSAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKKwkJLyogU3RhcnQgaGFuZGxpbmcgaW50ZXJydXB0cyAqLworCQlscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfSEFORExJTkdfSU5UOworCQl3bF9hY3RfaW50X29uKGxwKTsKIAotCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKLQlXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUoIGxwICk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2xfaGNmX2Vycm9yKCBkZXYsIHN0YXR1cyApOwkJLyogUmVwb3J0IHRoZSBlcnJvciAqLwotICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKCBkZXYgKTsJCS8qIFN0b3AgdGhlIGRldmljZSBhbmQgcXVldWUgKi8KLSAgICB9CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCVdMX1dEU19ORVRJRl9TVEFSVF9RVUVVRShscCk7CisJfSBlbHNlIHsKKwkJd2xfaGNmX2Vycm9yKGRldiwgc3RhdHVzKTsJLyogUmVwb3J0IHRoZSBlcnJvciAqLworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CS8qIFN0b3AgdGhlIGRldmljZSBhbmQgcXVldWUgKi8KKwl9CiAKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CiAKLSAgICByZXR1cm4gc3RhdHVzOwotfSAvLyB3bF9vcGVuCisJcmV0dXJuIHN0YXR1czsKK30JCQkJLyogd2xfb3BlbiAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzc3LDczICszNTMsNzAgQEAKICAqICAgICAgZXJybm8gb3RoZXJ3aXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgLyogTWFyayB0aGUgYWRhcHRlciBhcyBidXN5ICovCi0gICAgbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7Ci0gICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CisJLyogTWFyayB0aGUgYWRhcHRlciBhcyBidXN5ICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCVdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKGxwKTsKIAotICAgIG5ldGlmX2NhcnJpZXJfb2ZmKCBkZXYgKTsKLSAgICBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PRkYoIGxwICk7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlXTF9XRFNfTkVUSUZfQ0FSUklFUl9PRkYobHApOwogCi0gICAgLyogU2h1dGRvd24gdGhlIGFkYXB0ZXI6Ci0gICAgICAgICAgICBEaXNhYmxlIGFkYXB0ZXIgaW50ZXJydXB0cwotICAgICAgICAgICAgU3RvcCBUeC9SeAotICAgICAgICAgICAgVXBkYXRlIHN0YXRpc3RpY3MKLSAgICAgICAgICAgIFNldCBsb3cgcG93ZXIgbW9kZQotICAgICovCisJLyoKKwkgKiBTaHV0ZG93biB0aGUgYWRhcHRlcjoKKwkgKiBEaXNhYmxlIGFkYXB0ZXIgaW50ZXJydXB0cworCSAqIFN0b3AgVHgvUngKKwkgKiBVcGRhdGUgc3RhdGlzdGljcworCSAqIFNldCBsb3cgcG93ZXIgbW9kZQorCSAqLwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKLSAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsgLy8gU3RvcCBoYW5kbGluZyBpbnRlcnJ1cHRzCisJd2xfYWN0X2ludF9vZmYobHApOworCS8qIFN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cyAqLworCWxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9OT1RfSEFORExJTkdfSU5UOwogCiAjaWZkZWYgVVNFX1JUUwotICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0JREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIGNsb3NlLCBpbiBSVFMgbW9kZVxuIiApOwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotCXJldHVybiAtRUlPOwotICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJREJHX1RSQUNFKERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2UgY2xvc2UsIGluIFJUUyBtb2RlXG4iKTsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYgLyogVVNFX1JUUyAqLwogCi0gICAgLyogRGlzYWJsZSB0aGUgcG9ydHMgKi8KLSAgICB3bF9kaXNhYmxlKCBscCApOworCS8qIERpc2FibGUgdGhlIHBvcnRzICovCisJd2xfZGlzYWJsZShscCk7CiAKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CiAKLSAgICByZXR1cm4gMDsKLX0gLy8gd2xfY2xvc2UKKwlyZXR1cm4gMDsKK30JCQkJLyogd2xfY2xvc2UgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc3RhdGljIHZvaWQgd2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKLSAgICBzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLSAgICBzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OX1NUUiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKLS8vCXN0cmxjcHkoaW5mby5md192ZXJzaW9uLCBwcml2LT5md19uYW1lLAotLy8Jc2l6ZW9mKGluZm8uZndfdmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT05fU1RSLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCi0gICAgaWYgKGRldi0+ZGV2LnBhcmVudCkgewotICAgIAlkZXZfc2V0X25hbWUoZGV2LT5kZXYucGFyZW50LCAiJXMiLCBpbmZvLT5idXNfaW5mbyk7Ci0JLy9zdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmRldi5wYXJlbnQtPmJ1c19pZCwKLQkvLwlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKLSAgICB9IGVsc2UgewotCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pLAotCQkiUENNQ0lBIEZJWE1FIik7Ci0vLwkJICAgICJQQ01DSUEgMHglbHgiLCBwcml2LT5ody5pb2Jhc2UpOwotICAgIH0KLX0gLy8gd2xfZ2V0X2RydmluZm8KKwlpZiAoZGV2LT5kZXYucGFyZW50KSB7CisJCWRldl9zZXRfbmFtZShkZXYtPmRldi5wYXJlbnQsICIlcyIsIGluZm8tPmJ1c19pbmZvKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKKwkJCSAiUENNQ0lBIEZJWE1FIik7CisJfQorfQkJCQkvKiB3bF9nZXRfZHJ2aW5mbyAqLwogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHdsX2V0aHRvb2xfb3BzID0gewotICAgIC5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvLAotICAgIC5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9kcnZpbmZvID0gd2xfZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCXdsX2lvY3RsKCkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NjQsODEgKzQzNyw4NiBAQAogICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kICkKK2ludCB3bF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewotICAgIHN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKIAotICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgInJxIiwgIjB4JXAiLCBycSk7Ci0gICAgREJHX1BBUkFNKERiZ0luZm8sICJjbWQiLCAiMHglMDR4IiwgY21kKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJycSIsICIweCVwIiwgcnEpOworCURCR19QQVJBTShEYmdJbmZvLCAiY21kIiwgIjB4JTA0eCIsIGNtZCk7CiAKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKIAotICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOworCXdsX2FjdF9pbnRfb2ZmKGxwKTsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotCS8qIEhhbmRsZSBhbnkgUlRTIElPQ1RMIGhlcmUgKi8KLQlpZiggY21kID09IFdMX0lPQ1RMX1JUUyApIHsKLQkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEw6IFdMX0lPQ1RMX1JUU1xuIiApOwotCSAgICByZXQgPSB3dmxhbl9ydHMoIChzdHJ1Y3QgcnRzcmVxICopcnEsIGRldi0+YmFzZV9hZGRyICk7Ci0JfSBlbHNlIHsKLQkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEwgbm90IHN1cHBvcnRlZCBpbiBSVFMgbW9kZTogMHglWFxuIiwgY21kICk7Ci0JICAgIHJldCA9IC1FT1BOT1RTVVBQOworCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJLyogSGFuZGxlIGFueSBSVFMgSU9DVEwgaGVyZSAqLworCQlpZiAoY21kID09IFdMX0lPQ1RMX1JUUykgeworCQkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV0xfSU9DVExfUlRTXG4iKTsKKwkJCXJldCA9IHd2bGFuX3J0cygoc3RydWN0IHJ0c3JlcSAqKXJxLCBkZXYtPmJhc2VfYWRkcik7CisJCX0gZWxzZSB7CisJCQlEQkdfVFJBQ0UoRGJnSW5mbywKKwkJCQkgICJJT0NUTCBub3Qgc3VwcG9ydGVkIGluIFJUUyBtb2RlOiAweCVYXG4iLAorCQkJCSAgY21kKTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQl9CisKKwkJZ290byBvdXRfYWN0X2ludF9vbl91bmxvY2s7CiAJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotCWdvdG8gb3V0X2FjdF9pbnRfb25fdW5sb2NrOwotICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLwotCi0gICAgLyogT25seSBoYW5kbGUgVUlMIElPQ1RMIHJlcXVlc3RzIHdoZW4gdGhlIFVJTCBoYXMgdGhlIHN5c3RlbSBibG9ja2VkLiAqLwotICAgIGlmKCAhKCggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkgJiYgKCBjbWQgIT0gV1ZMQU4yX0lPQ1RMX1VJTCApKSkgeworCS8qIE9ubHkgaGFuZGxlIFVJTCBJT0NUTCByZXF1ZXN0cyB3aGVuIHRoZSBVSUwgaGFzIHRoZSBzeXN0ZW0gYmxvY2tlZC4gKi8KKwlpZiAoISgobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSAmJiAoY21kICE9IFdWTEFOMl9JT0NUTF9VSUwpKSkgewogI2lmZGVmIFVTRV9VSUwKLQlzdHJ1Y3QgdWlscmVxICAqdXJxID0gKHN0cnVjdCB1aWxyZXEgKilycTsKKwkJc3RydWN0IHVpbHJlcSAqdXJxID0gKHN0cnVjdCB1aWxyZXEgKilycTsKICNlbmRpZiAvKiBVU0VfVUlMICovCiAKLQlzd2l0Y2goIGNtZCApIHsKLQkJLy8gPT09PT09PT09PT09PT09PT09IFByaXZhdGUgSU9DVExzICh1cCB0byAxNikgPT09PT09PT09PT09PT09PT09CisJCXN3aXRjaCAoY21kKSB7CisJCQkvKiA9PT09PT09PT09PT09PT09PT0gUHJpdmF0ZSBJT0NUTHMgKHVwIHRvIDE2KSA9PT09PT09PT09PT09PT09PT0gKi8KICNpZmRlZiBVU0VfVUlMCi0JY2FzZSBXVkxBTjJfSU9DVExfVUlMOgotCSAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUxcbiIgKTsKLQkgICAgIHJldCA9IHd2bGFuX3VpbCggdXJxLCBscCApOwotCSAgICAgYnJlYWs7Ci0jZW5kaWYgIC8qIFVTRV9VSUwgKi8KKwkJY2FzZSBXVkxBTjJfSU9DVExfVUlMOgorCQkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTFxuIik7CisJCQlyZXQgPSB3dmxhbl91aWwodXJxLCBscCk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBVU0VfVUlMICovCiAKLQlkZWZhdWx0OgotCSAgICAgREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTCBDT0RFIE5PVCBTVVBQT1JURUQ6IDB4JVhcbiIsIGNtZCApOwotCSAgICAgcmV0ID0gLUVPUE5PVFNVUFA7Ci0JICAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEwgQ09ERSBOT1QgU1VQUE9SVEVEOiAweCVYXG4iLAorCQkJCSAgY21kKTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlEQkdfV0FSTklORyhEYmdJbmZvLAorCQkJICAgICJERVZJQ0UgSVMgQlVTWSwgQ0FOTk9UIFBST0NFU1MgUkVRVUVTVFxuIik7CisJCXJldCA9IC1FQlVTWTsKIAl9Ci0gICAgfSBlbHNlIHsKLQlEQkdfV0FSTklORyggRGJnSW5mbywgIkRFVklDRSBJUyBCVVNZLCBDQU5OT1QgUFJPQ0VTUyBSRVFVRVNUXG4iICk7Ci0JcmV0ID0gLUVCVVNZOwotICAgIH0KIAogI2lmZGVmIFVTRV9SVFMKIG91dF9hY3RfaW50X29uX3VubG9jazoKLSNlbmRpZiAgLyogVVNFX1JUUyAqLwotICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisjZW5kaWYgLyogVVNFX1JUUyAqLworCXdsX2FjdF9pbnRfb24obHApOwogCi0gICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgcmV0dXJuIHJldDsKLX0gLy8gd2xfaW9jdGwKKwlyZXR1cm4gcmV0OworfQkJCQkvKiB3bF9pb2N0bCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLXZvaWQgd2xfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgd2xfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKIAotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKLSAgICB3bF9pc3IoZGV2LT5pcnEsIGRldiwgJnJlZ3MpOwotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CisJd2xfaXNyKGRldi0+aXJxLCBkZXYsICZyZWdzKTsKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CiB9CiAjZW5kaWYKIApAQCAtNTU5LDUzICs1MzcsNTQgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit2b2lkIHdsX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICNpZmRlZiBVU0VfV0RTCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgY291bnQ7Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9IE5VTEw7CisJaW50IGNvdW50OworI2VuZGlmIC8qIFVTRV9XRFMgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcFN0YXRzID0gTlVMTDsKIAotICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXM6IFRyYW5zbWl0IHRpbWVvdXQuXG4iLCBkZXYtPm5hbWUgKTsKKwlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXM6IFRyYW5zbWl0IHRpbWVvdXQuXG4iLCBkZXYtPm5hbWUpOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyB0eF90aW1lb3V0IGhhbmRsZXIsIGluIFJUUyBtb2RlXG4iICk7Ci0Jd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0JcmV0dXJuOwotICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJREJHX1RSQUNFKERiZ0luZm8sCisJCQkgICJTa2lwcGluZyB0eF90aW1lb3V0IGhhbmRsZXIsIGluIFJUUyBtb2RlXG4iKTsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXR1cm47CisJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggZGV2aWNlICh0aGUgInJvb3QiIGRldmljZSBvciBXRFMgcG9ydCkgdGhpcyB0aW1lb3V0Ci0gICAgICAgaXMgZm9yICovCisJLyogRmlndXJlIG91dCB3aGljaCBkZXZpY2UgKHRoZSAicm9vdCIgZGV2aWNlIG9yIFdEUyBwb3J0KSB0aGlzIHRpbWVvdXQKKwkgICBpcyBmb3IgKi8KICNpZmRlZiBVU0VfV0RTCiAKLSAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotCWlmKCBkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSB7Ci0JICAgIHBTdGF0cyA9ICYoIGxwLT53ZHNfcG9ydFtjb3VudF0uc3RhdHMgKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCWlmIChkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYpIHsKKwkJCXBTdGF0cyA9ICYobHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyk7CiAKLQkgICAgLyogQnJlYWsgdGhlIGxvb3Agc28gdGhhdCB3ZSBjYW4gdXNlIHRoZSBjb3VudGVyIHRvIGFjY2VzcyBXRFMKLQkgICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlICovCi0JICAgIGJyZWFrOworCQkJLyogQnJlYWsgdGhlIGxvb3Agc28gdGhhdCB3ZSBjYW4gdXNlIHRoZSBjb3VudGVyIHRvIGFjY2VzcyBXRFMKKwkJCSAgIGluZm9ybWF0aW9uIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCQkJYnJlYWs7CisJCX0KIAl9Ci0gICAgfQogCi0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKLSAgICAvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCi0gICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgewotCXBTdGF0cyA9ICYoIGxwLT5zdGF0cyApOwotICAgIH0KKwkvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCisJaWYgKHBTdGF0cyA9PSBOVUxMKQorCQlwU3RhdHMgPSAmKGxwLT5zdGF0cyk7CiAKLSAgICAvKiBBY2N1bXVsYXRlIHRoZSB0aW1lb3V0IGVycm9yICovCi0gICAgcFN0YXRzLT50eF9lcnJvcnMrKzsKKwkvKiBBY2N1bXVsYXRlIHRoZSB0aW1lb3V0IGVycm9yICovCisJcFN0YXRzLT50eF9lcnJvcnMrKzsKIAotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwotfSAvLyB3bF90eF90aW1lb3V0CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworfQkJCQkvKiB3bF90eF90aW1lb3V0ICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MjYsMTAzICs2MDUsMTA1IEBACiAgKiAgICAgIDEgb24gZXJyb3IKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3NlbmQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCitpbnQgd2xfc2VuZChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBERVNDX1NUUkNUICAgICAgICAgICpkZXNjOwotICAgIFdWTEFOX0xGUkFNRSAgICAgICAgKnR4RiA9IE5VTEw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAgICAqZWxlbWVudDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGxlbjsKKwlpbnQgc3RhdHVzOworCURFU0NfU1RSQ1QgKmRlc2M7CisJV1ZMQU5fTEZSQU1FICp0eEYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJaW50IGxlbjsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBpZiggbHAgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGxwID09IE5VTEwpIHsKKwkJREJHX0VSUk9SKERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChscC0+ZGV2ID09IE5VTEwpIHsKKwkJREJHX0VSUk9SKERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgRklEczsgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLCBkb24ndCB0YWtlIGFueQotICAgICAgIGZyYW1lcyBvZmYgdGhlIHR4USAqLwotICAgIGlmKCBscC0+aGNmQ3R4LklGQl9Sc2NJbmQgPT0gMCApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwkvKgorCSAqIENoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIEZJRHM7IGlmIG5vbmUgYXJlIGF2YWlsYWJsZSwKKwkgKiBkb24ndCB0YWtlIGFueSBmcmFtZXMgb2ZmIHRoZSB0eFEKKwkgKi8KKwlpZiAobHAtPmhjZkN0eC5JRkJfUnNjSW5kID09IDApCisJCXJldHVybiBGQUxTRTsKIAotICAgIC8qIFJlY2xhaW0gdGhlIFR4USBFbGVtZW50cyBhbmQgcGxhY2UgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIHF1ZXVlICovCi0gICAgaWYoICFsaXN0X2VtcHR5KCAmKCBscC0+dHhRWzBdICkpKSB7Ci0gICAgICAgIGVsZW1lbnQgPSBscC0+dHhRWzBdLm5leHQ7CisJLyogUmVjbGFpbSB0aGUgVHhRIEVsZW1lbnRzIGFuZCBwbGFjZSB0aGVtIGJhY2sgb24gdGhlIGZyZWUgcXVldWUgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJihscC0+dHhRWzBdKSkpIHsKKwkJZWxlbWVudCA9IGxwLT50eFFbMF0ubmV4dDsKIAotICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICogKWxpc3RfZW50cnkoIGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSApOwotICAgICAgICBpZiggdHhGICE9IE5VTEwgKSB7Ci0gICAgICAgICAgICBscC0+dHhGLnNrYiAgPSB0eEYtPmZyYW1lLnNrYjsKLSAgICAgICAgICAgIGxwLT50eEYucG9ydCA9IHR4Ri0+ZnJhbWUucG9ydDsKKwkJdHhGID0gKFdWTEFOX0xGUkFNRSAqKSBsaXN0X2VudHJ5KGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSk7CisJCWlmICh0eEYgIT0gTlVMTCkgeworCQkJbHAtPnR4Ri5za2IgPSB0eEYtPmZyYW1lLnNrYjsKKwkJCWxwLT50eEYucG9ydCA9IHR4Ri0+ZnJhbWUucG9ydDsKIAotICAgICAgICAgICAgdHhGLT5mcmFtZS5za2IgID0gTlVMTDsKLSAgICAgICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IDA7CisJCQl0eEYtPmZyYW1lLnNrYiA9IE5VTEw7CisJCQl0eEYtPmZyYW1lLnBvcnQgPSAwOwogCi0gICAgICAgICAgICBsaXN0X2RlbCggJiggdHhGLT5ub2RlICkpOwotICAgICAgICAgICAgbGlzdF9hZGQoIGVsZW1lbnQsICYoIGxwLT50eEZyZWUgKSk7CisJCQlsaXN0X2RlbCgmKHR4Ri0+bm9kZSkpOworCQkJbGlzdF9hZGQoZWxlbWVudCwgJihscC0+dHhGcmVlKSk7CiAKLSAgICAgICAgICAgIGxwLT50eFFfY291bnQtLTsKKwkJCWxwLT50eFFfY291bnQtLTsKIAotICAgICAgICAgICAgaWYoIGxwLT50eFFfY291bnQgPCBUWF9RX0xPV19XQVRFUl9NQVJLICkgewotICAgICAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIktpY2tzdGFydGluZyBROiAlZFxuIiwgbHAtPnR4UV9jb3VudCApOwotICAgICAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+ZGV2ICk7Ci0gICAgICAgICAgICAgICAgICAgIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBscCApOwotICAgICAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkJCWlmIChscC0+dHhRX2NvdW50IDwgVFhfUV9MT1dfV0FURVJfTUFSSykgeworCQkJCWlmIChscC0+bmV0aWZfcXVldWVfb24gPT0gRkFMU0UpIHsKKwkJCQkJREJHX1RYKERiZ0luZm8sICJLaWNrc3RhcnRpbmcgUTogJWRcbiIsCisJCQkJCSAgICAgICBscC0+dHhRX2NvdW50KTsKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZShscC0+ZGV2KTsKKwkJCQkJV0xfV0RTX05FVElGX1dBS0VfUVVFVUUobHApOworCQkJCQlscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCX0KIAotICAgIGlmKCBscC0+dHhGLnNrYiA9PSBOVUxMICkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmIChscC0+dHhGLnNrYiA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgICAvKiBJZiB0aGUgZGV2aWNlIGhhcyByZXNvdXJjZXMgKEZJRHMpIGF2YWlsYWJsZSwgdGhlbiBUeCB0aGUgcGFja2V0ICovCi0gICAgLyogRm9ybWF0IHRoZSBUeFJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gdGhlIGFkYXB0ZXIgKi8KLSAgICBsZW4gPSBscC0+dHhGLnNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IGxwLT50eEYuc2tiLT5sZW47CisJLyogSWYgdGhlIGRldmljZSBoYXMgcmVzb3VyY2VzIChGSURzKSBhdmFpbGFibGUsIHRoZW4gVHggdGhlIHBhY2tldCAqLworCS8qIEZvcm1hdCB0aGUgVHhSZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBhZGFwdGVyICovCisJbGVuID0gbHAtPnR4Ri5za2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBscC0+dHhGLnNrYi0+bGVuOwogCi0gICAgZGVzYyAgICAgICAgICAgICAgICAgICAgPSAmKCBscC0+ZGVzY190eCApOwotICAgIGRlc2MtPmJ1Zl9hZGRyICAgICAgICAgID0gbHAtPnR4Ri5za2ItPmRhdGE7Ci0gICAgZGVzYy0+QlVGX0NOVCAgICAgICAgICAgPSBsZW47Ci0gICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgICAgPSBOVUxMOworCWRlc2MgPSAmKGxwLT5kZXNjX3R4KTsKKwlkZXNjLT5idWZfYWRkciA9IGxwLT50eEYuc2tiLT5kYXRhOworCWRlc2MtPkJVRl9DTlQgPSBsZW47CisJZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwogCi0gICAgc3RhdHVzID0gaGNmX3NlbmRfbXNnKCAmKCBscC0+aGNmQ3R4ICksIGRlc2MsIGxwLT50eEYucG9ydCApOworCXN0YXR1cyA9IGhjZl9zZW5kX21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCBscC0+dHhGLnBvcnQpOwogCi0gICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKLSAgICAgICAgbHAtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWlmIChzdGF0dXMgPT0gSENGX1NVQ0NFU1MpIHsKKwkJbHAtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCi0gICAgICAgIERCR19UWCggRGJnSW5mbywgIlRyYW5zbWl0Li4uXG4iICk7CisJCURCR19UWChEYmdJbmZvLCAiVHJhbnNtaXQuLi5cbiIpOwogCi0gICAgICAgIGlmKCBscC0+dHhGLnBvcnQgPT0gSENGX1BPUlRfMCApIHsKLSAgICAgICAgICAgIGxwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgICAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKLSAgICAgICAgfQotCisJCWlmIChscC0+dHhGLnBvcnQgPT0gSENGX1BPUlRfMCkgeworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhGLnNrYi0+bGVuOworCQl9CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X3BhY2tldHMrKzsKLSAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47Ci0gICAgICAgIH0KKwkJZWxzZSB7CisJCQlscC0+d2RzX3BvcnRbKChscC0+dHhGLnBvcnQgPj4gOCkgLQorCQkJCSAgICAgIDEpXS5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlscC0+d2RzX3BvcnRbKChscC0+dHhGLnBvcnQgPj4gOCkgLQorCQkJCSAgICAgIDEpXS5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhGLnNrYi0+bGVuOworCQl9CiAKLSNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAvKiBGcmVlIHRoZSBza2IgYW5kIHBlcmZvcm0gcXVldWUgY2xlYW51cCwgYXMgdGhlIGJ1ZmZlciB3YXMKLSAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLwotICAgICAgICBkZXZfa2ZyZWVfc2tiKCBscC0+dHhGLnNrYiApOworCQkvKiBGcmVlIHRoZSBza2IgYW5kIHBlcmZvcm0gcXVldWUgY2xlYW51cCwgYXMgdGhlIGJ1ZmZlciB3YXMKKwkJICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCWRldl9rZnJlZV9za2IobHAtPnR4Ri5za2IpOwogCi0gICAgICAgIGxwLT50eEYuc2tiID0gTlVMTDsKLSAgICAgICAgbHAtPnR4Ri5wb3J0ID0gMDsKLSAgICB9CisJCWxwLT50eEYuc2tiID0gTlVMTDsKKwkJbHAtPnR4Ri5wb3J0ID0gMDsKKwl9CiAKLSAgICByZXR1cm4gVFJVRTsKLX0gLy8gd2xfc2VuZAorCXJldHVybiBUUlVFOworfQkJCQkvKiB3bF9zZW5kICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NDQsNzUgKzcyNSw3NCBAQAogICogICAgICAxIG9uIGVycm9yCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnQgKQoraW50IHdsX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0KQogewotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICBXVkxBTl9MRlJBTUUgICAgICAgICAgICAqdHhGID0gTlVMTDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqZWxlbWVudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlXVkxBTl9MRlJBTUUgKnR4RiA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICAvKiBHcmFiIHRoZSBzcGlubG9jayAqLwotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwkvKiBHcmFiIHRoZSBzcGlubG9jayAqLworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICBpZiggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkgewotICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlVJTCBoYXMgZGV2aWNlIGJsb2NrZWRcbiIgKTsKLSAgICAgICAgLyogU3RhcnQgZHJvcHBpbmcgcGFja2V0cyBoZXJlPz8/ICovCi0Jd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQorCWlmIChscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpIHsKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywgIlVJTCBoYXMgZGV2aWNlIGJsb2NrZWRcbiIpOworCQkvKiBTdGFydCBkcm9wcGluZyBwYWNrZXRzIGhlcmU/Pz8gKi8KKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CiAjaWZkZWYgVVNFX1JUUwotICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0gICAgICAgIERCR19QUklOVCggIlJUUzogd2UncmUgZ2V0dGluZyBhIFR4Li4uXG4iICk7Ci0Jd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJREJHX1BSSU5UKCJSVFM6IHdlJ3JlIGdldHRpbmcgYSBUeC4uLlxuIik7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgIGlmKCAhbHAtPnVzZV9kbWEgKSB7Ci0gICAgICAgIC8qIEdldCBhbiBlbGVtZW50IGZyb20gdGhlIHF1ZXVlICovCi0gICAgICAgIGVsZW1lbnQgPSBscC0+dHhGcmVlLm5leHQ7Ci0gICAgICAgIHR4RiA9IChXVkxBTl9MRlJBTUUgKilsaXN0X2VudHJ5KCBlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUgKTsKLSAgICAgICAgaWYoIHR4RiA9PSBOVUxMICkgewotICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJvYmxlbSB3aXRoIGxpc3RfZW50cnlcbiIgKTsKLQkgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBGaWxsIG91dCB0aGUgZnJhbWUgKi8KLSAgICAgICAgdHhGLT5mcmFtZS5za2IgPSBza2I7Ci0gICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IHBvcnQ7Ci0gICAgICAgIC8qIE1vdmUgdGhlIGZyYW1lIHRvIHRoZSB0eFEgKi8KLSAgICAgICAgLyogTk9URTogSGVyZSdzIHdoZXJlIHdlIHdvdWxkIGRvIHByaW9yaXR5IHF1ZXVlaW5nICovCi0gICAgICAgIGxpc3RfbW92ZSgmKHR4Ri0+bm9kZSksICYobHAtPnR4UVswXSkpOworCWlmICghbHAtPnVzZV9kbWEpIHsKKwkJLyogR2V0IGFuIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUgKi8KKwkJZWxlbWVudCA9IGxwLT50eEZyZWUubmV4dDsKKwkJdHhGID0gKFdWTEFOX0xGUkFNRSAqKSBsaXN0X2VudHJ5KGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSk7CisJCWlmICh0eEYgPT0gTlVMTCkgeworCQkJREJHX0VSUk9SKERiZ0luZm8sICJQcm9ibGVtIHdpdGggbGlzdF9lbnRyeVxuIik7CisJCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBGaWxsIG91dCB0aGUgZnJhbWUgKi8KKwkJdHhGLT5mcmFtZS5za2IgPSBza2I7CisJCXR4Ri0+ZnJhbWUucG9ydCA9IHBvcnQ7CisJCS8qIE1vdmUgdGhlIGZyYW1lIHRvIHRoZSB0eFEgKi8KKwkJLyogTk9URTogSGVyZSdzIHdoZXJlIHdlIHdvdWxkIGRvIHByaW9yaXR5IHF1ZXVlaW5nICovCisJCWxpc3RfbW92ZSgmKHR4Ri0+bm9kZSksICYobHAtPnR4UVswXSkpOwogCi0gICAgICAgIGxwLT50eFFfY291bnQrKzsKLSAgICAgICAgaWYoIGxwLT50eFFfY291bnQgPj0gREVGQVVMVF9OVU1fVFhfRlJBTUVTICkgewotICAgICAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiUSBGdWxsOiAlZFxuIiwgbHAtPnR4UV9jb3VudCApOwotICAgICAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewotICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKLSAgICAgICAgICAgICAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKLSAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB3bF9hY3RfaW50X29mZiggbHAgKTsgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisJCWxwLT50eFFfY291bnQrKzsKKwkJaWYgKGxwLT50eFFfY291bnQgPj0gREVGQVVMVF9OVU1fVFhfRlJBTUVTKSB7CisJCQlEQkdfVFgoRGJnSW5mbywgIlEgRnVsbDogJWRcbiIsIGxwLT50eFFfY291bnQpOworCQkJaWYgKGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFKSB7CisJCQkJbmV0aWZfc3RvcF9xdWV1ZShscC0+ZGV2KTsKKwkJCQlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRShscCk7CisJCQkJbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisJCQl9CisJCX0KKwl9CisJd2xfYWN0X2ludF9vZmYobHApOwkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KIAotICAgIC8qIFNlbmQgdGhlIGRhdGEgdG8gdGhlIGhhcmR3YXJlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgKi8KKwkvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kICovCiAjaWZkZWYgRU5BQkxFX0RNQQotICAgIGlmKCBscC0+dXNlX2RtYSApIHsKLSAgICAgICAgd2xfc2VuZF9kbWEoIGxwLCBza2IsIHBvcnQgKTsKLSAgICB9Ci0gICAgZWxzZQorCWlmIChscC0+dXNlX2RtYSkgeworCQl3bF9zZW5kX2RtYShscCwgc2tiLCBwb3J0KTsKKwl9IGVsc2UKICNlbmRpZgotICAgIHsKLSAgICAgICAgd2xfc2VuZCggbHAgKTsKLSAgICB9Ci0gICAgLyogUmUtZW5hYmxlIEludGVycnVwdHMsIHJlbGVhc2UgdGhlIHNwaW5sb2NrIGFuZCByZXR1cm4gKi8KLSAgICB3bF9hY3RfaW50X29uKCBscCApOwotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgIHJldHVybiAwOwotfSAvLyB3bF90eAorCXsKKwkJd2xfc2VuZChscCk7CisJfQorCS8qIFJlLWVuYWJsZSBJbnRlcnJ1cHRzLCByZWxlYXNlIHRoZSBzcGlubG9jayBhbmQgcmV0dXJuICovCisJd2xfYWN0X2ludF9vbihscCk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXJldHVybiAwOworfQkJCQkvKiB3bF90eCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODM1LDY3ICs4MTUsNjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgd2xfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBwb3J0OwotICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICpza2I7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICBwa3RsZW47Ci0gICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgaGZzX3N0YXQ7Ci0gICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2M7CisJaW50IHBvcnQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IHN0YXR1czsKKwloY2ZfMTYgcGt0bGVuOworCWhjZl8xNiBoZnNfc3RhdDsKKwlERVNDX1NUUkNUICpkZXNjOwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CiAKLSAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCWlmICghKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkpIHsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLSAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOwotICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCQlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCQlEQkdfUFJJTlQoIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gICAgICAgIGhmc19zdGF0ID0gKGhjZl8xNikoKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVQgKyAxXSA8PCA4ICkpOworCQkvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCisJCWhmc19zdGF0ID0gKGhjZl8xNikgKChscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSkgfAorCQkJCSAgICAgKGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVQgKyAxXSA8PCA4KSk7CiAKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KLSAgICAgICAgaWYoKCBoZnNfc3RhdCAmIEhGU19TVEFUX0VSUiApICE9IEhDRl9TVUNDRVNTICkgewotICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgfQorCQkvKiBNYWtlIHN1cmUgdGhlIGZyYW1lIGlzbid0IGJhZCAqLworCQlpZiAoKGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSKSAhPSBIQ0ZfU1VDQ0VTUykgeworCQkJREJHX1dBUk5JTkcoRGJnSW5mbywKKwkJCQkgICAgIkhGU19TVEFUX0VSUk9SICgweCV4KSBpbiBSeCBQYWNrZXRcbiIsCisJCQkJICAgIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAKLSAgICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KLSAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OwotICAgICAgICBEQkdfUlgoIERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCApOworCQkvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLworCQlwb3J0ID0gKGhmc19zdGF0ID4+IDgpICYgMHgwMDA3OworCQlEQkdfUlgoRGJnSW5mbywgIlJ4IGZyYW1lIGZvciBwb3J0ICVkXG4iLCBwb3J0KTsKIAotICAgICAgICBwa3RsZW4gPSBscC0+aGNmQ3R4LklGQl9SeExlbjsKLSAgICAgICAgaWYgKHBrdGxlbiAhPSAwKSB7Ci0gICAgICAgICAgICBza2IgPSBBTExPQ19TS0IocGt0bGVuKTsKLSAgICAgICAgICAgIGlmIChza2IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbmV0ZGV2IGJhc2VkIG9uIHRoZSBwb3J0ICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgeworCQlwa3RsZW4gPSBscC0+aGNmQ3R4LklGQl9SeExlbjsKKwkJaWYgKHBrdGxlbiAhPSAwKSB7CisJCQlza2IgPSBBTExPQ19TS0IocGt0bGVuKTsKKwkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCS8qIFNldCB0aGUgbmV0ZGV2IGJhc2VkIG9uIHRoZSBwb3J0ICovCisJCQkJc3dpdGNoIChwb3J0KSB7CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGxwLT53ZHNfcG9ydFtwb3J0LTFdLmRldjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKwkJCQljYXNlIDE6CisJCQkJY2FzZSAyOgorCQkJCWNhc2UgMzoKKwkJCQljYXNlIDQ6CisJCQkJY2FzZSA1OgorCQkJCWNhc2UgNjoKKwkJCQkJc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydCAtIDFdLmRldjsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisJCQkJY2FzZSAwOgorCQkJCWRlZmF1bHQ6CisJCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCQlicmVhazsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICBkZXNjID0gJiggbHAtPmRlc2NfcnggKTsKKwkJCQlkZXNjID0gJihscC0+ZGVzY19yeCk7CiAKLSAgICAgICAgICAgICAgICBkZXNjLT5uZXh0X2Rlc2NfYWRkciA9IE5VTEw7CisJCQkJZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwogCiAvKgogI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXApAQCAtOTA0LDY3ICs4ODUsNzMgQEAKICAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQogKi8KIAotICAgICAgICAgICAgICAgIEdFVF9QQUNLRVQoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOworCQkJCUdFVF9QQUNLRVQoc2tiLT5kZXYsIHNrYiwgcGt0bGVuKTsKIAotICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ldGlmX3J4KCBza2IgKTsKKwkJCQlpZiAoc3RhdHVzID09IEhDRl9TVUNDRVNTKSB7CisJCQkJCW5ldGlmX3J4KHNrYik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWlmIChwb3J0ID09IDApIHsKKwkJCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworCQkJCQl9CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfV0RTICovCisJCQkJCWVsc2UgeworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfcGFja2V0cysrOworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfYnl0ZXMgKz0gcGt0bGVuOworCQkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAKICNpZmRlZiBXSVJFTEVTU19FWFQKICNpZmRlZiBXSVJFTEVTU19TUFkKLSAgICAgICAgICAgICAgICAgICAgaWYoIGxwLT5zcHlkYXRhLnNweV9udW1iZXIgPiAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3JjYWRkciA9IHNrYi0+bWFjLnJhdyArIE1BQ19BRERSX1NJWkU7CisJCQkJCWlmIChscC0+c3B5ZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQkJCQkJY2hhciAqc3JjYWRkciA9CisJCQkJCQkgICAgc2tiLT5tYWMucmF3ICsKKwkJCQkJCSAgICBNQUNfQUREUl9TSVpFOwogCi0gICAgICAgICAgICAgICAgICAgICAgICB3bF9zcHlfZ2F0aGVyKCBkZXYsIHNyY2FkZHIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkJd2xfc3B5X2dhdGhlcihkZXYsIHNyY2FkZHIpOworCQkJCQl9CiAjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCiAjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUnggcmVxdWVzdCB0byBjYXJkIEZBSUxFRFxuIiApOworCQkJCX0gZWxzZSB7CisJCQkJCURCR19FUlJPUihEYmdJbmZvLAorCQkJCQkJICAiUnggcmVxdWVzdCB0byBjYXJkIEZBSUxFRFxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJaWYgKHBvcnQgPT0gMCkKKwkJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfV0RTICovCisJCQkJCWVsc2UgeworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfZHJvcHBlZCsrOworCQkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOworCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlEQkdfRVJST1IoRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIpOwogCi0gICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICB9CisJCQkJaWYgKHBvcnQgPT0gMCkKKwkJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICNpZmRlZiBVU0VfV0RTCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCQkJCWVsc2UgeworCQkJCQlscC0+d2RzX3BvcnRbcG9ydCAtCisJCQkJCQkgICAgIDFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLworCQkJfQorCQl9CisJfQogCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX3J4CisJcmV0dXJuIDA7Cit9CQkJCS8qIHdsX3J4ICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05ODYsMTQyICs5NzMsMTU5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIE5FV19NVUxUSUNBU1QKIAotdm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQordm9pZCB3bF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQotLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisjaWYgMQkJCQkvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBICovCisJLyoKKwkgKiBzaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlID8KKwkgKiBzZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlcgorCSAqIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisJICovCiAKLSAgICBpbnQgICAgICAgICAgICAgICAgIHg7Ci0gICAgc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOworCWludCB4OworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CiAKLSAgICBpZiggIXdsX2FkYXB0ZXJfaXNfb3BlbiggZGV2ICkpCi0gICAgICAgIHJldHVybjsKKwlpZiAoIXdsX2FkYXB0ZXJfaXNfb3BlbihkZXYpKQorCQlyZXR1cm47CiAKICNpZiBEQkcKLSAgICBpZiggREJHX0ZMQUdTKCBEYmdJbmZvICkgJiBEQkdfUEFSQU1fT04gKSB7Ci0gICAgICAgIERCR19QUklOVCgiICBmbGFnczogJXMlcyVzXG4iLAotICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSA/ICJQcm9taXNjdW91cyAiIDogIiIsCi0gICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUICkgPyAiTXVsdGljYXN0ICIgOiAiIiwKLSAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApID8gIkFsbC1NdWx0aWNhc3QiIDogIiIgKTsKKwlpZiAoREJHX0ZMQUdTKERiZ0luZm8pICYgREJHX1BBUkFNX09OKSB7CisJCURCR19QUklOVCgiICBmbGFnczogJXMlcyVzXG4iLAorCQkJICAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/ICJQcm9taXNjdW91cyAiIDogIiIsCisJCQkgIChkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCkgPyAiTXVsdGljYXN0ICIgOiAiIiwKKwkJCSAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpID8gIkFsbC1NdWx0aWNhc3QiIDogIiIpOwogCi0gICAgICAgIERCR19QUklOVCggIiAgbWNfY291bnQ6ICVkXG4iLCBuZXRkZXZfbWNfY291bnQoZGV2KSk7CisJCURCR19QUklOVCgiICBtY19jb3VudDogJWRcbiIsIG5ldGRldl9tY19jb3VudChkZXYpKTsKIAotCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCi0JREJHX1BSSU5UKCIgICAgJXBNICglZClcbiIsIGhhLT5hZGRyLCBkZXYtPmFkZHJfbGVuKTsKLSAgICB9CisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCisJCSAgICBEQkdfUFJJTlQoIiAgICAlcE0gKCVkKVxuIiwgaGEtPmFkZHIsIGRldi0+YWRkcl9sZW4pOworCX0KICNlbmRpZiAvKiBEQkcgKi8KIAotICAgIGlmKCEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CisJaWYgKCEobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSkgewogCiAjaWZkZWYgVVNFX1JUUwotICAgICAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgbXVsdGljYXN0LCBpbiBSVFMgbW9kZVxuIiApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwkJaWYgKGxwLT51c2VSVFMgPT0gMSkgeworCQkJREJHX1RSQUNFKERiZ0luZm8sICJTa2lwcGluZyBtdWx0aWNhc3QsIGluIFJUUyBtb2RlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgICAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOworCQl3bF9sb2NrKGxwLCAmZmxhZ3MpOworCQl3bF9hY3RfaW50X29mZihscCk7CiAKLQkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgewotICAgICAgICAgICAgaWYoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApIHsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDEgKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJFbmFibGluZyBQcm9taXNjdW91cyBtb2RlIChJRkZfUFJPTUlTQylcbiIgKTsKLSAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChuZXRkZXZfbWNfY291bnQoZGV2KSA+IEhDRl9NQVhfTVVMVElDQVNUKSB8fAotICAgICAgICAgICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSkgewotICAgICAgICAgICAgICAgIC8qIFNodXR0aW5nIG9mZiB0aGlzIGZpbHRlciB3aWxsIGVuYWJsZSBhbGwgbXVsdGljYXN0IGZyYW1lcyB0bwotICAgICAgICAgICAgICAgICAgIGJlIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwgc28KLSAgICAgICAgICAgICAgICAgICBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJFbmFibGluZyBhbGwgbXVsdGljYXN0IG1vZGUgKElGRl9BTExNVUxUSSlcbiIgKTsKLSAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKLSAgICAgICAgICAgICAgICB3bF9hcHBseSggbHAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFuZXRkZXZfbWNfZW1wdHkoZGV2KSkgewotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gKCBuZXRkZXZfbWNfY291bnQoZGV2KSAqIDMgKSArIDE7Ci0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKKwkJaWYgKENOVl9JTlRfVE9fTElUVExFKGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCkgPT0KKwkJICAgIENPTVBfSURfRldfU1RBKSB7CisJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCQkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJCQlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoMSk7CisJCQkJREJHX1BSSU5UCisJCQkJICAgICgiRW5hYmxpbmcgUHJvbWlzY3VvdXMgbW9kZSAoSUZGX1BST01JU0MpXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOworCQkJfSBlbHNlIGlmICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBIQ0ZfTUFYX01VTFRJQ0FTVCkKKwkJCQkgICB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJCQkvKiBTaHV0dGluZyBvZmYgdGhpcyBmaWx0ZXIgd2lsbCBlbmFibGUgYWxsIG11bHRpY2FzdCBmcmFtZXMgdG8KKwkJCQkgICBiZSBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsIHNvCisJCQkJICAgYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCisJCQkJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCQkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoMCk7CisJCQkJREJHX1BSSU5UCisJCQkJICAgICgiRW5hYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOworCQkJCXdsX2FwcGx5KGxwKTsKKwkJCX0gZWxzZSBpZiAoIW5ldGRldl9tY19lbXB0eShkZXYpKSB7CisJCQkJLyogU2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCQkJbHAtPmx0dlJlY29yZC5sZW4gPQorCQkJCSAgICAobmV0ZGV2X21jX2NvdW50KGRldikgKiAzKSArIDE7CisJCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKIAotCQl4ID0gMDsKLQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCYobHAtPmx0dlJlY29yZC51LnU4W3grKyAqIEVUSF9BTEVOXSksCi0JCQkgICBoYS0+YWRkciwgRVRIX0FMRU4pOwotICAgICAgICAgICAgICAgIERCR19QUklOVCggIlNldHRpbmcgbXVsdGljYXN0IGxpc3RcbiIgKTsKLSAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCi0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST01JU0NVT1VTX01PREU7Ci0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOwotICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBQcm9taXNjdW91cyBtb2RlXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJCQkJeCA9IDA7CisJCQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKKwkJCQkgICAgbWVtY3B5KCYKKwkJCQkJICAgKGxwLT5sdHZSZWNvcmQudS51OFt4KysgKiBFVEhfQUxFTl0pLAorCQkJCQkgICBoYS0+YWRkciwgRVRIX0FMRU4pOworCQkJCURCR19QUklOVCgiU2V0dGluZyBtdWx0aWNhc3QgbGlzdFxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCQkJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCQkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKDApOworCQkJCURCR19QUklOVCgiRGlzYWJsaW5nIFByb21pc2N1b3VzIG1vZGVcbiIpOworCQkJCWhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLAorCQkJCQkgICAgIChMVFZQKSAmIChscC0+bHR2UmVjb3JkKSk7CiAKLSAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIG11bHRpY2FzdCBtb2RlICovCi0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAyOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIE11bHRpY2FzdCBtb2RlXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJCQkJLyogRGlzYWJsZSBtdWx0aWNhc3QgbW9kZSAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOworCQkJCURCR19QUklOVCgiRGlzYWJsaW5nIE11bHRpY2FzdCBtb2RlXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOwogCi0gICAgICAgICAgICAgICAgLyogVHVybmluZyBvbiB0aGlzIGZpbHRlciB3aWxsIHByZXZlbnQgYWxsIG11bHRpY2FzdCBmcmFtZXMgZnJvbQotICAgICAgICAgICAgICAgICAgIGJlaW5nIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwKLSAgICAgICAgICAgICAgICAgICBzbyBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDEgKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLSAgICB9CisJCQkJLyoKKwkJCQkgKiBUdXJuaW5nIG9uIHRoaXMgZmlsdGVyIHdpbGwgcHJldmVudCBhbGwgbXVsdGljYXN0IGZyYW1lcyBmcm9tCisJCQkJICogYmVpbmcgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELAorCQkJCSAqIHNvIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZAorCQkJCSAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKDEpOworCQkJCURCR19QUklOVAorCQkJCSAgICAoIkRpc2FibGluZyBhbGwgbXVsdGljYXN0IG1vZGUgKElGRl9BTExNVUxUSSlcbiIpOworCQkJCWhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLAorCQkJCQkgICAgIChMVFZQKSAmIChscC0+bHR2UmVjb3JkKSk7CisJCQkJd2xfYXBwbHkobHApOworCQkJfQorCQl9CisJCXdsX2FjdF9pbnRfb24obHApOworCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJfQogI2VuZGlmIC8qIEhDRl9TVEEgKi8KLX0gLy8gd2xfbXVsdGljYXN0Cit9CQkJCS8qIHdsX211bHRpY2FzdCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAjZWxzZSAvKiBORVdfTVVMVElDQVNUICovCiAKLXZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2FkZHJzLCB2b2lkICphZGRycyApCit2b2lkIHdsX211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2FkZHJzLCB2b2lkICphZGRycykKIHsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJudW1fYWRkcnMiLCAiJWQiLCBudW1fYWRkcnMgKTsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJhZGRycyIsICIweCVwIiwgYWRkcnMgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJudW1fYWRkcnMiLCAiJWQiLCBudW1fYWRkcnMpOworCURCR19QQVJBTShEYmdJbmZvLCAiYWRkcnMiLCAiMHglcCIsIGFkZHJzKTsKIAogI2Vycm9yIE9ic29sZXRlIHNldCBtdWx0aWNhc3QgaW50ZXJmYWNlIQotfSAvLyB3bF9tdWx0aWNhc3QKK30JCQkJLyogd2xfbXVsdGljYXN0ICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKICNlbmRpZiAvKiBORVdfTVVMVElDQVNUICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgd2xfbmV0ZGV2X29wcyA9Ci17Ci0gICAgLm5kb19zdGFydF94bWl0ICAgICAgICAgPSAmd2xfdHhfcG9ydDAsCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHdsX25ldGRldl9vcHMgPSB7CisJLm5kb19zdGFydF94bWl0ID0gJndsX3R4X3BvcnQwLAogCi0gICAgLm5kb19zZXRfY29uZmlnICAgICAgICAgPSAmd2xfY29uZmlnLAotICAgIC5uZG9fZ2V0X3N0YXRzICAgICAgICAgID0gJndsX3N0YXRzLAotICAgIC5uZG9fc2V0X3J4X21vZGUgICAgICAgID0gJndsX211bHRpY2FzdCwKKwkubmRvX3NldF9jb25maWcgPSAmd2xfY29uZmlnLAorCS5uZG9fZ2V0X3N0YXRzID0gJndsX3N0YXRzLAorCS5uZG9fc2V0X3J4X21vZGUgPSAmd2xfbXVsdGljYXN0LAogCi0gICAgLm5kb19pbml0ICAgICAgICAgICAgICAgPSAmd2xfaW5zZXJ0LAotICAgIC5uZG9fb3BlbiAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfb3BlbiwKLSAgICAubmRvX3N0b3AgICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX2Nsb3NlLAotICAgIC5uZG9fZG9faW9jdGwgICAgICAgICAgID0gJndsX2lvY3RsLAorCS5uZG9faW5pdCA9ICZ3bF9pbnNlcnQsCisJLm5kb19vcGVuID0gJndsX2FkYXB0ZXJfb3BlbiwKKwkubmRvX3N0b3AgPSAmd2xfYWRhcHRlcl9jbG9zZSwKKwkubmRvX2RvX2lvY3RsID0gJndsX2lvY3RsLAogCi0gICAgLm5kb190eF90aW1lb3V0ICAgICAgICAgPSAmd2xfdHhfdGltZW91dCwKKwkubmRvX3R4X3RpbWVvdXQgPSAmd2xfdHhfdGltZW91dCwKIAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0gICAgLm5kb19wb2xsX2NvbnRyb2xsZXIgICAgPSB3bF9wb2xsLAorCS5uZG9fcG9sbF9jb250cm9sbGVyID0gd2xfcG9sbCwKICNlbmRpZgogfTsKIApAQCAtMTE0NCw0OCArMTE0OCw1MSBAQAogICogICAgICBkZXZpY2UuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuZXRfZGV2aWNlICogd2xfZGV2aWNlX2FsbG9jKCB2b2lkICkKK3N0cnVjdCBuZXRfZGV2aWNlICp3bF9kZXZpY2VfYWxsb2Modm9pZCkKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBOVUxMOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSBOVUxMOwogCi0gICAgLyogQWxsb2MgYSBuZXRfZGV2aWNlIHN0cnVjdCAqLwotICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgd2xfcHJpdmF0ZSkpOwotICAgIGlmICghZGV2KQotICAgICAgICByZXR1cm4gTlVMTDsKKwkvKiBBbGxvYyBhIG5ldF9kZXZpY2Ugc3RydWN0ICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB3bF9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgJ25leHQnIHBvaW50ZXIgaW4gdGhlIHN0cnVjdC4gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgUENJLAotICAgICAgIGJ1dCBkbyBpdCBoZXJlIGp1c3QgaW4gY2FzZSBpdCdzIHVzZWQgZm9yIG90aGVyIGJ1c2VzIGluIHRoZSBmdXR1cmUgKi8KLSAgICBscCA9IHdsX3ByaXYoZGV2KTsKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlICduZXh0JyBwb2ludGVyIGluIHRoZSBzdHJ1Y3QuCisJICogQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgUENJLAorCSAqIGJ1dCBkbyBpdCBoZXJlIGp1c3QgaW4gY2FzZSBpdCdzIHVzZWQKKwkgKiBmb3Igb3RoZXIgYnVzZXMgaW4gdGhlIGZ1dHVyZQorCSAqLworCWxwID0gd2xfcHJpdihkZXYpOwogCisJLyogQ2hlY2sgTVRVICovCisJaWYgKGRldi0+bXR1ID4gTVRVX01BWCkgeworCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXM6IE1UVSBzZXQgdG9vIGhpZ2gsIGxpbWl0aW5nIHRvICVkLlxuIiwKKwkJCSAgICBkZXYtPm5hbWUsIE1UVV9NQVgpOworCQlkZXYtPm10dSA9IE1UVV9NQVg7CisJfQogCi0gICAgLyogQ2hlY2sgTVRVICovCi0gICAgaWYoIGRldi0+bXR1ID4gTVRVX01BWCApCi0gICAgewotCSAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBNVFUgc2V0IHRvbyBoaWdoLCBsaW1pdGluZyB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIE1UVV9NQVggKTsKLSAgICAJZGV2LT5tdHUgPSBNVFVfTUFYOwotICAgIH0KKwkvKiBTZXR1cCB0aGUgZnVuY3Rpb24gdGFibGUgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCiAKLSAgICAvKiBTZXR1cCB0aGUgZnVuY3Rpb24gdGFibGUgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmd2xfaXdfaGFuZGxlcl9kZWY7CisJbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworCWRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKIAotICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsX2l3X2hhbmRsZXJfZGVmOwotICAgIGxwLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmxwLT5zcHlfZGF0YTsKLSAgICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CisJZGV2LT5uZXRkZXZfb3BzID0gJndsX25ldGRldl9vcHM7CiAKLSAgICBkZXYtPm5ldGRldl9vcHMgPSAmd2xfbmV0ZGV2X29wczsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAotICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJndsX2V0aHRvb2xfb3BzOwogCi0gICAgZGV2LT5ldGh0b29sX29wcwkgICAgPSAmd2xfZXRodG9vbF9vcHM7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCi0gICAgbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisJLyogQWxsb2NhdGUgdmlydHVhbCBkZXZpY2VzIGZvciBXRFMgc3VwcG9ydCBpZiBuZWVkZWQgKi8KKwlXTF9XRFNfREVWSUNFX0FMTE9DKGxwKTsKIAotICAgIC8qIEFsbG9jYXRlIHZpcnR1YWwgZGV2aWNlcyBmb3IgV0RTIHN1cHBvcnQgaWYgbmVlZGVkICovCi0gICAgV0xfV0RTX0RFVklDRV9BTExPQyggbHAgKTsKKwlyZXR1cm4gZGV2OworfQkJCQkvKiB3bF9kZXZpY2VfYWxsb2MgKi8KIAotICAgIHJldHVybiBkZXY7Ci19IC8vIHdsX2RldmljZV9hbGxvYwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyMDYsMTUgKzEyMTMsMTQgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQordm9pZCB3bF9kZXZpY2VfZGVhbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotLy8gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisJLyogRGVhbGxvYyB0aGUgV0RTIHBvcnRzICovCisJV0xfV0RTX0RFVklDRV9ERUFMTE9DKGxwKTsKIAotICAgIC8qIERlYWxsb2MgdGhlIFdEUyBwb3J0cyAqLwotICAgIFdMX1dEU19ERVZJQ0VfREVBTExPQyggbHAgKTsKKwlmcmVlX25ldGRldihkZXYpOworfQkJCQkvKiB3bF9kZXZpY2VfZGVhbGxvYyAqLwogCi0gICAgZnJlZV9uZXRkZXYoIGRldiApOwotfSAvLyB3bF9kZXZpY2VfZGVhbGxvYwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyMzUsMTUgKzEyNDEsMTYgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0MCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDBcbiIgKTsKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgMFxuIik7CiAKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF8wKTsKICNpZmRlZiBFTkFCTEVfRE1BCi0gICAgcmV0dXJuIHdsX3R4X2RtYSggc2tiLCBkZXYsIEhDRl9QT1JUXzAgKTsKKwlyZXR1cm4gd2xfdHhfZG1hKHNrYiwgZGV2LCBIQ0ZfUE9SVF8wKTsKICNlbmRpZgotfSAvLyB3bF90eF9wb3J0MAorfQkJCQkvKiB3bF90eF9wb3J0MGkgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogI2lmZGVmIFVTRV9XRFMKQEAgLTEyNjYsMTEgKzEyNzMsMTIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0MSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDFcbiIgKTsKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8xICk7Ci19IC8vIHdsX3R4X3BvcnQxCisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDFcbiIpOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfMSk7Cit9CQkJCS8qIHdsX3R4X3BvcnQxICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjkxLDExICsxMjk5LDEyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDIoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAyXG4iICk7Ci0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMiApOwotfSAvLyB3bF90eF9wb3J0MgorCURCR19UWChEYmdJbmZvLCAiVHggb24gUG9ydCAyXG4iKTsKKwlyZXR1cm4gd2xfdHgoc2tiLCBkZXYsIEhDRl9QT1JUXzIpOworfQkJCQkvKiB3bF90eF9wb3J0MiAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTMxNiwxMSArMTMyNSwxMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3R4X3BvcnQzKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF90eF9wb3J0MyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgM1xuIiApOwotICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzMgKTsKLX0gLy8gd2xfdHhfcG9ydDMKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgM1xuIik7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF8zKTsKK30JCQkJLyogd2xfdHhfcG9ydDMgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzNDEsMTEgKzEzNTEsMTIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0NCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDRcbiIgKTsKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF80ICk7Ci19IC8vIHdsX3R4X3BvcnQ0CisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDRcbiIpOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfNCk7Cit9CQkJCS8qIHdsX3R4X3BvcnQ0ICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzY2LDExICsxMzc3LDEyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDUoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQ1KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA1XG4iICk7Ci0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNSApOwotfSAvLyB3bF90eF9wb3J0NQorCURCR19UWChEYmdJbmZvLCAiVHggb24gUG9ydCA1XG4iKTsKKwlyZXR1cm4gd2xfdHgoc2tiLCBkZXYsIEhDRl9QT1JUXzUpOworfQkJCQkvKiB3bF90eF9wb3J0NSAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTM5MSwxMSArMTQwMywxMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3R4X3BvcnQ2KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF90eF9wb3J0NihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNlxuIiApOwotICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzYgKTsKLX0gLy8gd2xfdHhfcG9ydDYKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgNlxuIik7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF82KTsKK30JCQkJLyogd2xfdHhfcG9ydDYgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0MTcsNTAgKzE0MzAsNTIgQEAKICAqICAgICAgc3RydWN0cyBpbiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3bF93ZHNfZGV2aWNlX2FsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQordm9pZCB3bF93ZHNfZGV2aWNlX2FsbG9jKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogCi0gICAgLyogV0RTIHN1cHBvcnQgcmVxdWlyZXMgYWRkaXRpb25hbCBuZXRfZGV2aWNlIHN0cnVjdHMgdG8gYmUgYWxsb2NhdGVkLAotICAgICAgIHNvIHRoYXQgdXNlciBzcGFjZSBhcHBzIGNhbiB1c2UgdGhlc2UgdmlydHVhbCBkZXZpY2VzIHRvIHNwZWNpZnkgdGhlCi0gICAgICAgcG9ydCBvbiB3aGljaCB0byBUeC9SeCAqLwotICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0gICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfd2RzID0gTlVMTDsKKwkvKiBXRFMgc3VwcG9ydCByZXF1aXJlcyBhZGRpdGlvbmFsIG5ldF9kZXZpY2Ugc3RydWN0cyB0byBiZSBhbGxvY2F0ZWQsCisJICAgc28gdGhhdCB1c2VyIHNwYWNlIGFwcHMgY2FuIHVzZSB0aGVzZSB2aXJ0dWFsIGRldmljZXMgdG8gc3BlY2lmeSB0aGUKKwkgICBwb3J0IG9uIHdoaWNoIHRvIFR4L1J4ICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CiAKLQlkZXZfd2RzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl93ZHMpCi0JCXJldHVybjsKKwkJZGV2X3dkcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGV2X3dkcykKKwkJCXJldHVybjsKIAotICAgICAgICBldGhlcl9zZXR1cCggZGV2X3dkcyApOworCQlldGhlcl9zZXR1cChkZXZfd2RzKTsKIAotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IGRldl93ZHM7CisJCWxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gZGV2X3dkczsKIAotICAgICAgICAvKiBSZS11c2Ugd2xfaW5pdCBmb3IgYWxsIHRoZSBkZXZpY2VzLCBhcyBpdCBjdXJyZW50bHkgZG9lcyBub3RoaW5nLCBidXQKLSAgICAgICAgICAgaXMgcmVxdWlyZWQuIFJlLXVzZSB0aGUgc3RhdHMvdHhfdGltZW91dCBoYW5kbGVyIGZvciBhbGwgYXMgd2VsbDsgdGhlCi0gICAgICAgICAgIFdEUyBwb3J0IHdoaWNoIGlzIHJlcXVlc3RpbmcgdGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICB0aGUgbmV0X2RldmljZSBwb2ludGVyLiBTZXQgdGhlIHByaXZhdGUgbWVtYmVyIG9mIGFsbCBkZXZpY2VzIHRvIHBvaW50Ci0gICAgICAgICAgIHRvIHRoZSBzYW1lIG5ldF9kZXZpY2Ugc3RydWN0OyB0aGF0IHdheSwgYWxsIGluZm9ybWF0aW9uIGdldHMKLSAgICAgICAgICAgZnVubmVsbGVkIHRocm91Z2ggdGhlIG9uZSAicmVhbCIgbmV0X2RldmljZS4gTmFtZSB0aGUgV0RTIHBvcnRzCi0gICAgICAgICAgICJ3ZHM8bj4iICovCi0gICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5pbml0ICAgICAgICAgICA9ICZ3bF9pbml0OwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+Z2V0X3N0YXRzICAgICAgPSAmd2xfc3RhdHM7Ci0gICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT50eF90aW1lb3V0ICAgICA9ICZ3bF90eF90aW1lb3V0OwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+cHJpdiAgICAgICAgICAgPSBscDsKKwkJLyogUmUtdXNlIHdsX2luaXQgZm9yIGFsbCB0aGUgZGV2aWNlcywgYXMgaXQgY3VycmVudGx5IGRvZXMgbm90aGluZywgYnV0CisJCSAqIGlzIHJlcXVpcmVkLiBSZS11c2UgdGhlIHN0YXRzL3R4X3RpbWVvdXQgaGFuZGxlciBmb3IgYWxsIGFzIHdlbGw7IHRoZQorCQkgKiBXRFMgcG9ydCB3aGljaCBpcyByZXF1ZXN0aW5nIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGRldGVybWluZWQgYnkKKwkJICogdGhlIG5ldF9kZXZpY2UgcG9pbnRlci4gU2V0IHRoZSBwcml2YXRlIG1lbWJlciBvZiBhbGwgZGV2aWNlcyB0byBwb2ludAorCQkgKiB0byB0aGUgc2FtZSBuZXRfZGV2aWNlIHN0cnVjdDsgdGhhdCB3YXksIGFsbCBpbmZvcm1hdGlvbiBnZXRzCisJCSAqIGZ1bm5lbGxlZCB0aHJvdWdoIHRoZSBvbmUgInJlYWwiIG5ldF9kZXZpY2UuIE5hbWUgdGhlIFdEUyBwb3J0cworCQkgKiAid2RzPG4+IgorCQkgKiAqLworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldi0+aW5pdCA9ICZ3bF9pbml0OworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldi0+Z2V0X3N0YXRzID0gJndsX3N0YXRzOworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldi0+dHhfdGltZW91dCA9ICZ3bF90eF90aW1lb3V0OworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldi0+cHJpdiA9IGxwOwogCi0gICAgICAgIHNwcmludGYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5uYW1lLCAid2RzJWQiLCBjb3VudCApOwotICAgIH0KKwkJc3ByaW50ZihscC0+d2RzX3BvcnRbY291bnRdLmRldi0+bmFtZSwgIndkcyVkIiwgY291bnQpOworCX0KIAotICAgIC8qIFJlZ2lzdGVyIHRoZSBUeCBoYW5kbGVycyAqLwotICAgIGxwLT53ZHNfcG9ydFswXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MTsKLSAgICBscC0+d2RzX3BvcnRbMV0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDI7Ci0gICAgbHAtPndkc19wb3J0WzJdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQzOwotICAgIGxwLT53ZHNfcG9ydFszXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NDsKLSAgICBscC0+d2RzX3BvcnRbNF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDU7Ci0gICAgbHAtPndkc19wb3J0WzVdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ2OworCS8qIFJlZ2lzdGVyIHRoZSBUeCBoYW5kbGVycyAqLworCWxwLT53ZHNfcG9ydFswXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MTsKKwlscC0+d2RzX3BvcnRbMV0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDI7CisJbHAtPndkc19wb3J0WzJdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQzOworCWxwLT53ZHNfcG9ydFszXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NDsKKwlscC0+d2RzX3BvcnRbNF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDU7CisJbHAtPndkc19wb3J0WzVdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ2OwogCi0gICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7Ci19IC8vIHdsX3dkc19kZXZpY2VfYWxsb2MKKwlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRShscCk7Cit9CQkJCS8qIHdsX3dkc19kZXZpY2VfYWxsb2MgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0ODAsMjYgKzE0OTUsMjcgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQordm9pZCB3bF93ZHNfZGV2aWNlX2RlYWxsb2Moc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewotICAgIGludCBjb3VudDsKKwlpbnQgY291bnQ7CiAKLSAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CiAKLSAgICAgICAgZGV2X3dkcyA9IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2OworCQlkZXZfd2RzID0gbHAtPndkc19wb3J0W2NvdW50XS5kZXY7CiAKLSAgICAgICAgaWYoIGRldl93ZHMgIT0gTlVMTCApIHsKLSAgICAgICAgICAgIGlmKCBkZXZfd2RzLT5mbGFncyAmIElGRl9VUCApIHsKLSAgICAgICAgICAgICAgICBkZXZfY2xvc2UoIGRldl93ZHMgKTsKLSAgICAgICAgICAgICAgICBkZXZfd2RzLT5mbGFncyAmPSB+KCBJRkZfVVAgfCBJRkZfUlVOTklORyApOwotICAgICAgICAgICAgfQorCQlpZiAoZGV2X3dkcyAhPSBOVUxMKSB7CisJCQlpZiAoZGV2X3dkcy0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJCQlkZXZfY2xvc2UoZGV2X3dkcyk7CisJCQkJZGV2X3dkcy0+ZmxhZ3MgJj0gfihJRkZfVVAgfCBJRkZfUlVOTklORyk7CisJCQl9CiAKLSAgICAgICAgICAgIGZyZWVfbmV0ZGV2KGRldl93ZHMpOwotICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotfSAvLyB3bF93ZHNfZGV2aWNlX2RlYWxsb2MKKwkJCWZyZWVfbmV0ZGV2KGRldl93ZHMpOworCQkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBOVUxMOworCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfZGV2aWNlX2RlYWxsb2MgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1MjAsMjEgKzE1MzYsMjIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQordm9pZCB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewotICAgIGludCBjb3VudDsKKwlpbnQgY291bnQ7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgaWYoIGxwICE9IE5VTEwgKSB7Ci0gICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0gICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCi0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKLSAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlCisJaWYgKGxwICE9IE5VTEwpIHsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQkJaWYgKGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgorCQkJICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UpIHsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShscC0+d2RzX3BvcnRbY291bnRdLmRldik7CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisJCQl9CisJCX0KKwl9Cit9CQkJCS8qIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU1NSwyMSArMTU3MiwyMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewotICAgIGludCBjb3VudDsKKwlpbnQgY291bnQ7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgaWYoIGxwICE9IE5VTEwgKSB7Ci0gICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0gICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCi0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewotICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7Ci0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAvLyB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZQorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKwkJCSAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IFRSVUUpIHsKKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KTsKKwkJCQlscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisJCQl9CisJCX0KKwl9Cit9CQkJCS8qIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTkwLDIxICsxNjA4LDIyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQordm9pZCB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZShzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7Ci0gICAgaW50IGNvdW50OworCWludCBjb3VudDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBpZiggbHAgIT0gTlVMTCApIHsKLSAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLSAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKLSAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewotICAgICAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7Ci0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19IC8vIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlCisJaWYgKGxwICE9IE5VTEwpIHsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQkJaWYgKGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgorCQkJICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UpIHsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KTsKKwkJCQlscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KK30JCQkJLyogd2xfd2RzX25ldGlmX3dha2VfcXVldWUgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2MjUsMTkgKzE2NDQsMTkgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIGlmKCBscCAhPSBOVUxMICkgewotICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29uKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAvLyB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbgorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQpCisJCQkJbmV0aWZfY2Fycmllcl9vbihscC0+d2RzX3BvcnRbY291bnRdLmRldik7CisJCX0KKwl9Cit9CQkJCS8qIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjU4LDIxICsxNjc3LDIyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZiggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKIAlpbnQgY291bnQ7CiAKLQlpZihscCAhPSBOVUxMKSB7Ci0JCWZvcihjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgewotCQkJaWYobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkKQorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQpCiAJCQkJbmV0aWZfY2Fycmllcl9vZmYobHAtPndkc19wb3J0W2NvdW50XS5kZXYpOwogCQl9CiAJfQogCi19IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZgorfQkJCQkvKiB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgLyogVVNFX1dEUyAqLwogCiAjaWZkZWYgRU5BQkxFX0RNQQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2OTUsNzAgKzE3MTUsNzEgQEAKICAqICAgICAgMSBvbiBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfc2VuZF9kbWEoIHN0cnVjdCB3bF9wcml2YXRlICpscCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBvcnQgKQoraW50IHdsX3NlbmRfZG1hKHN0cnVjdCB3bF9wcml2YXRlICpscCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBvcnQpCiB7Ci0gICAgaW50ICAgICAgICAgbGVuOwotICAgIERFU0NfU1RSQ1QgKmRlc2MgPSBOVUxMOwotICAgIERFU0NfU1RSQ1QgKmRlc2NfbmV4dCA9IE5VTEw7CisJaW50IGxlbjsKKwlERVNDX1NUUkNUICpkZXNjID0gTlVMTDsKKwlERVNDX1NUUkNUICpkZXNjX25leHQgPSBOVUxMOwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIGlmKCBscCA9PSBOVUxMICkgewotICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAobHAgPT0gTlVMTCkgeworCQlEQkdfRVJST1IoRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICBpZiggbHAtPmRldiA9PSBOVUxMICkgewotICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAobHAtPmRldiA9PSBOVUxMKSB7CisJCURCR19FUlJPUihEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIAotICAgIC8qIEFHQUlOLCBBTEwgVEhFIFFVRVVFSU5HIERPTkUgSEVSRSBJTiBJL08gTU9ERSBJUyBOT1QgUEVSRk9STUVEICovCisJLyogQUdBSU4sIEFMTCBUSEUgUVVFVUVJTkcgRE9ORSBIRVJFIElOIEkvTyBNT0RFIElTIE5PVCBQRVJGT1JNRUQgKi8KIAotICAgIGlmKCBza2IgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX1dBUk5JTkcgKERiZ0luZm8sICJOb3RoaW5nIHRvIHNlbmQuXG4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywgIk5vdGhpbmcgdG8gc2VuZC5cbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgbGVuID0gc2tiLT5sZW47CisJbGVuID0gc2tiLT5sZW47CiAKLSAgICAvKiBHZXQgYSBmcmVlIGRlc2NyaXB0b3IgKi8KLSAgICBkZXNjID0gd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCBscCApOworCS8qIEdldCBhIGZyZWUgZGVzY3JpcHRvciAqLworCWRlc2MgPSB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQobHApOwogCi0gICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKLSAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewotICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPmRldiApOwotICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7Ci0gICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKKwlpZiAoZGVzYyA9PSBOVUxMKSB7CisJCWlmIChscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShscC0+ZGV2KTsKKwkJCVdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKGxwKTsKKwkJCWxwLT5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOwogCi0gICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CiAKLSAgICBTRVRfQlVGX0NOVCggZGVzYywgLypIQ0ZfRE1BX0ZEX0NOVCovSEZTX0FERFJfREVTVCApOwotICAgIFNFVF9CVUZfU0laRSggZGVzYywgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKKwlTRVRfQlVGX0NOVChkZXNjLCAvKkhDRl9ETUFfRkRfQ05UICovIEhGU19BRERSX0RFU1QpOworCVNFVF9CVUZfU0laRShkZXNjLCBIQ0ZfRE1BX1RYX0JVRjFfU0laRSk7CiAKLSAgICBkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKKwlkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKIAotICAgIGlmKCBkZXNjX25leHQtPmJ1Zl9hZGRyID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkRNQSBkZXNjcmlwdG9yIGJ1Zl9hZGRyIGlzIE5VTExcbiIgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAoZGVzY19uZXh0LT5idWZfYWRkciA9PSBOVUxMKSB7CisJCURCR19FUlJPUihEYmdJbmZvLCAiRE1BIGRlc2NyaXB0b3IgYnVmX2FkZHIgaXMgTlVMTFxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICAvKiBDb3B5IHRoZSBwYXlsb2FkIGludG8gdGhlIERNQSBwYWNrZXQgKi8KLSAgICBtZW1jcHkoIGRlc2NfbmV4dC0+YnVmX2FkZHIsIHNrYi0+ZGF0YSwgbGVuICk7CisJLyogQ29weSB0aGUgcGF5bG9hZCBpbnRvIHRoZSBETUEgcGFja2V0ICovCisJbWVtY3B5KGRlc2NfbmV4dC0+YnVmX2FkZHIsIHNrYi0+ZGF0YSwgbGVuKTsKIAotICAgIFNFVF9CVUZfQ05UKCBkZXNjX25leHQsIGxlbiApOwotICAgIFNFVF9CVUZfU0laRSggZGVzY19uZXh0LCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7CisJU0VUX0JVRl9DTlQoZGVzY19uZXh0LCBsZW4pOworCVNFVF9CVUZfU0laRShkZXNjX25leHQsIEhDRl9NQVhfUEFDS0VUX1NJWkUpOwogCi0gICAgaGNmX2RtYV90eF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYywgMCApOworCWhjZl9kbWFfdHhfcHV0KCYobHAtPmhjZkN0eCksIGRlc2MsIDApOwogCi0gICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCi0gICAgICAgICAgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKKwkvKiBGcmVlIHRoZSBza2IgYW5kIHBlcmZvcm0gcXVldWUgY2xlYW51cCwgYXMgdGhlIGJ1ZmZlciB3YXMKKwkgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLSAgICByZXR1cm4gVFJVRTsKLX0gLy8gd2xfc2VuZF9kbWEKKwlyZXR1cm4gVFJVRTsKK30JCQkJLyogd2xfc2VuZF9kbWEgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3NzksMTQ3ICsxODAwLDE1MiBAQAogICogICAgICAxIG9uIGVycm9yCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9yeF9kbWEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3J4X2RtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICBwb3J0OwotICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBwa3RsZW47Ci0gICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgIGhmc19zdGF0OwotICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICpza2I7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gTlVMTDsKLSAgICBERVNDX1NUUkNUICAgICAgICAgICAgICAqZGVzYywgKmRlc2NfbmV4dDsKLSAgICAvL0NGR19NQl9JTkZPX1JBTkdFMl9TVFJDVCB4OworCWludCBwb3J0OworCWhjZl8xNiBwa3RsZW47CisJaGNmXzE2IGhmc19zdGF0OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gTlVMTDsKKwlERVNDX1NUUkNUICpkZXNjLCAqZGVzY19uZXh0OwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CiAKLSAgICBpZigoKCBscCA9IGRldi0+cHJpdiApICE9IE5VTEwgKSAmJgotCSEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CisJbHAgPSBkZXYtPnByaXY7CisJaWYgKChscCAhPSBOVUxMKSAmJiAhKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkpIHsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLSAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOwotICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1JUUyAqLworCQlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCQlEQkdfUFJJTlQoIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgICAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKLSAgICAgICAgLy97Ci0gICAgICAgICAgICBkZXNjID0gaGNmX2RtYV9yeF9nZXQoICYoIGxwLT5oY2ZDdHggKSk7CisJCS8qCisJCSAqaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQorCQkgKnsKKwkJICovCisJCWRlc2MgPSBoY2ZfZG1hX3J4X2dldCgmKGxwLT5oY2ZDdHgpKTsKIAotICAgICAgICAgICAgaWYoIGRlc2MgIT0gTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ2hlY2sgYW5kIHNlZSBpZiB3ZSByY3ZkLiBhIFdNUCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgaWYoKCggKihoY2ZfOCAqKSZkZXNjLT5idWZfYWRkcltIRlNfU1RBVF0gKSAmCi0gICAgICAgICAgICAgICAgICAgICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKSkgPT0gSEZTX1NUQVRfV01QX01TRyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJHb3QgYSBXTVAgZnJhbWVcbiIgKTsKKwkJaWYgKGRlc2MgIT0gTlVMTCkgeworCQkJLyogQ2hlY2sgYW5kIHNlZSBpZiB3ZSByY3ZkLiBhIFdNUCBmcmFtZSAqLworCQkJLyoKKwkJCSAgIGlmKCgoICooaGNmXzggKikmZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVRdICkgJgorCQkJICAgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApKSA9PSBIRlNfU1RBVF9XTVBfTVNHICkKKwkJCSAgIHsKKwkJCSAgIERCR19UUkFDRSggRGJnSW5mbywgIkdvdCBhIFdNUCBmcmFtZVxuIiApOwogCi0gICAgICAgICAgICAgICAgICAgIHgubGVuID0gc2l6ZW9mKCBDRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgKSAvIHNpemVvZiggaGNmXzE2ICk7Ci0JCQkJICAgIHgudHlwID0gQ0ZHX01CX0lORk87Ci0JCQkJICAgIHguYmFzZV90eXAgPSBDRkdfV01QOwotCQkJCSAgICB4LmZyYWdfY250ID0gMjsKLQkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2xlbiAgPSBHRVRfQlVGX0NOVCggZGVzY3AgKSAvIHNpemVvZiggaGNmXzE2ICk7Ci0JCQkJICAgIHguZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5idWZfYWRkciA7Ci0JCQkJICAgIHguZnJhZ19idWZbMV0uZnJhZ19sZW4gID0gKCBHRVRfQlVGX0NOVCggZGVzY3AtPm5leHRfZGVzY19hZGRyICkgKyAxICkgLyBzaXplb2YoIGhjZl8xNiApOwotCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyIDsKKwkJCSAgIHgubGVuID0gc2l6ZW9mKCBDRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgKSAvIHNpemVvZiggaGNmXzE2ICk7CisJCQkgICB4LnR5cCA9IENGR19NQl9JTkZPOworCQkJICAgeC5iYXNlX3R5cCA9IENGR19XTVA7CisJCQkgICB4LmZyYWdfY250ID0gMjsKKwkJCSAgIHguZnJhZ19idWZbMF0uZnJhZ19sZW4gID0gR0VUX0JVRl9DTlQoIGRlc2NwICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJICAgeC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPmJ1Zl9hZGRyIDsKKwkJCSAgIHguZnJhZ19idWZbMV0uZnJhZ19sZW4gID0gKCBHRVRfQlVGX0NOVCggZGVzY3AtPm5leHRfZGVzY19hZGRyICkgKyAxICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJICAgeC5mcmFnX2J1ZlsxXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkciA7CiAKLSAgICAgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSZ4ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICovCisJCQkgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJnggKTsKKwkJCSAgIH0KKwkJCSAqLwogCi0gICAgICAgICAgICAgICAgZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CisJCQlkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKIAotICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzbid0IGVtcHR5ICovCi0gICAgICAgICAgICAgICAgaWYoIEdFVF9CVUZfQ05UKCBkZXNjICkgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJCdWZmZXIgaXMgZW1wdHkhXG4iICk7CisJCQkvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpc24ndCBlbXB0eSAqLworCQkJaWYgKEdFVF9CVUZfQ05UKGRlc2MpID09IDApIHsKKwkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiQnVmZmVyIGlzIGVtcHR5IVxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KLSAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgICAgICAgICB9CisJCQkJLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKwkJCQloY2ZfZG1hX3J4X3B1dCgmKGxwLT5oY2ZDdHgpLCBkZXNjKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAotICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIEhGU19TVEFUIHJlZ2lzdGVyIGZyb20gdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOworCQkJLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLworCQkJaGZzX3N0YXQgPSAoaGNmXzE2KSAoZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQgLyAyXSk7CiAKLSAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGZyYW1lIGlzbid0IGJhZCAqLwotICAgICAgICAgICAgICAgIGlmKCggaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIgKSAhPSBIQ0ZfU1VDQ0VTUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkhGU19TVEFUX0VSUk9SICgweCV4KSBpbiBSeCBQYWNrZXRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFULzJdICk7CisJCQkvKiBNYWtlIHN1cmUgdGhlIGZyYW1lIGlzbid0IGJhZCAqLworCQkJaWYgKChoZnNfc3RhdCAmIEhGU19TVEFUX0VSUikgIT0gSENGX1NVQ0NFU1MpIHsKKwkJCQlEQkdfV0FSTklORyhEYmdJbmZvLAorCQkJCQkgICAgIkhGU19TVEFUX0VSUk9SICgweCV4KSBpbiBSeCBQYWNrZXRcbiIsCisJCQkJCSAgICBkZXNjLT5idWZfYWRkcltIRlNfU1RBVCAvIDJdKTsKIAotICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLwotICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICAgICAgICAgIH0KKwkJCQkvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLworCQkJCWhjZl9kbWFfcnhfcHV0KCYobHAtPmhjZkN0eCksIGRlc2MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQogCi0gICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KLSAgICAgICAgICAgICAgICBwb3J0ID0gKCBoZnNfc3RhdCA+PiA4ICkgJiAweDAwMDc7Ci0gICAgICAgICAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKKwkJCS8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCisJCQlwb3J0ID0gKGhmc19zdGF0ID4+IDgpICYgMHgwMDA3OworCQkJREJHX1JYKERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CiAKLSAgICAgICAgICAgICAgICBwa3RsZW4gPSBHRVRfQlVGX0NOVChkZXNjX25leHQpOwotICAgICAgICAgICAgICAgIGlmIChwa3RsZW4gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBza2IgPSBBTExPQ19TS0IocGt0bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNrYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBvcnQgKSB7CisJCQlwa3RsZW4gPSBHRVRfQlVGX0NOVChkZXNjX25leHQpOworCQkJaWYgKHBrdGxlbiAhPSAwKSB7CisJCQkJc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7CisJCQkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQkJCXN3aXRjaCAocG9ydCkgewogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGxwLT53ZHNfcG9ydFtwb3J0LTFdLmRldjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZiAgLyogVVNFX1dEUyAqLworCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgMjoKKwkJCQkJY2FzZSAzOgorCQkJCQljYXNlIDQ6CisJCQkJCWNhc2UgNToKKwkJCQkJY2FzZSA2OgorCQkJCQkJc2tiLT5kZXYgPQorCQkJCQkJICAgIGxwLT53ZHNfcG9ydFtwb3J0IC0gMV0uZGV2OworCQkJCQkJYnJlYWs7CisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCQljYXNlIDA6CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9QQUNLRVRfRE1BKCBza2ItPmRldiwgc2tiLCBwa3RsZW4gKTsKKwkJCQkJR0VUX1BBQ0tFVF9ETUEoc2tiLT5kZXYsIHNrYiwgcGt0bGVuKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKKwkJCQkJLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKwkJCQkJaGNmX2RtYV9yeF9wdXQoJihscC0+aGNmQ3R4KSwgZGVzYyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3J4KCBza2IgKTsKKwkJCQkJbmV0aWZfcngoc2tiKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWlmIChwb3J0ID09IDApIHsKKwkJCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworCQkJCQl9CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKwkJCQkJZWxzZSB7CisJCQkJCQlscC0+d2RzX3BvcnRbcG9ydCAtCisJCQkJCQkJICAgICAxXS5zdGF0cy4KKwkJCQkJCSAgICByeF9wYWNrZXRzKys7CisJCQkJCQlscC0+d2RzX3BvcnRbcG9ydCAtCisJCQkJCQkJICAgICAxXS5zdGF0cy4KKwkJCQkJCSAgICByeF9ieXRlcyArPSBwa3RsZW47CisJCQkJCX0KKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlEQkdfRVJST1IoRGJnSW5mbywKKwkJCQkJCSAgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAocG9ydCA9PSAwKQorCQkJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICNpZmRlZiBVU0VfV0RTCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfV0RTICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8vfQotICAgIH0KKwkJCQkJZWxzZSB7CisJCQkJCQlscC0+d2RzX3BvcnRbcG9ydCAtCisJCQkJCQkJICAgICAxXS5zdGF0cy4KKwkJCQkJCSAgICByeF9kcm9wcGVkKys7CisJCQkJCX0KKyNlbmRpZiAvKiBVU0VfV0RTICovCisJCQkJfQorCQkJfQorCQl9CisJCS8qfSovCisJfQogCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX3J4X2RtYQorCXJldHVybiAwOworfQkJCQkvKiB3bF9yeF9kbWEgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNlbmRpZiAgLy8gRU5BQkxFX0RNQQorI2VuZGlmIC8qIEVOQUJMRV9ETUEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYwppbmRleCA0Y2E2ZTQyLi43NTAxOWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jCkBAIC0xNjEsNDMgKzE2MSw2IEBACiAKIAogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglwZXJjZW50KCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIERFU0NSSVBUSU9OOgotICoKLSAqICAgICAgUmV0dXJuIGEgdmFsdWUgYXMgYSBwZXJjZW50YWdlIG9mIG1pbiB0byBtYXguCi0gKgotICogIFBBUkFNRVRFUlM6Ci0gKgotICogICAgICB2YWx1ZSAgIC0gdGhlIHZhbHVlIGluIHF1ZXN0aW9uCi0gKiAgICAgIG1pbiAgICAgLSB0aGUgbWluaW11bSByYW5nZSB2YWx1ZQotICogICAgICBtYXggICAgIC0gdGhlIG1heGltdW0gcmFuZ2UgdmFsdWUKLSAqCi0gKiAgUkVUVVJOUzoKLSAqCi0gKiAgICAgIHRoZSBwZXJjZW50YWdlIHZhbHVlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBwZXJjZW50KCBpbnQgdmFsdWUsIGludCBtaW4sIGludCBtYXggKQotewotICAgIC8qIFRydW5jYXRlIHRoZSB2YWx1ZSB0byBiZSBiZXR3ZWVuIG1pbiBhbmQgbWF4LiAqLwotICAgIGlmKCB2YWx1ZSA8IG1pbiApCi0gICAgICAgIHZhbHVlID0gbWluOwotCi0gICAgaWYoIHZhbHVlID4gbWF4ICkKLSAgICAgICAgdmFsdWUgPSBtYXg7Ci0KLSAgICAvKiBSZXR1cm4gdGhlIHZhbHVlIGFzIGEgcGVyY2VudGFnZSBvZiBtaW4gdG8gbWF4LiAqLwotICAgIHJldHVybiAoKCggdmFsdWUgLSBtaW4gKSAqIDEwMCApIC8gKCBtYXggLSBtaW4gKSk7Ci19IC8vIHBlcmNlbnQKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglpc192YWxpZF9rZXlfc3RyaW5nKCkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMKaW5kZXggMTg3ZmMwNi4uNDllZWVhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYwpAQCAtMzM1NCw3ICszMzU0LDcgQEAKIAkgICB0aGUgY2FsbCB0byB3aXJlbGVzc19zZW5kX2V2ZW50KCkgbXVzdCBhbHNvIHBvaW50IHRvIHdoZXJlIHRoZSBFU1NJRAogCSAgIGxpdmVzICovCiAJd3JxdS5lc3NpZC5sZW5ndGggID0gc3RybGVuKCBscC0+TmV0d29ya05hbWUgKTsKLQl3cnF1LmVzc2lkLnBvaW50ZXIgPSAoY2FkZHJfdClscC0+TmV0d29ya05hbWU7CisJd3JxdS5lc3NpZC5wb2ludGVyID0gKHZvaWQgX191c2VyICopbHAtPk5ldHdvcmtOYW1lOwogCXdycXUuZXNzaWQuZmxhZ3MgICA9IDE7CiAKIAl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NTSVdFU1NJRCwgJndycXUsIGxwLT5OZXR3b3JrTmFtZSApOwpAQCAtMzQxOSw3ICszNDE5LDcgQEAKIAogCQkvKiBPbmx5IHByb3ZpZGUgdGhlIGtleSBpZiBwZXJtaXNzaW9ucyBhbGxvdyAqLwogCQlpZiggY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7Ci0JCQl3cnF1LmVuY29kaW5nLnBvaW50ZXIgPSAoY2FkZHJfdClscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXk7CisJCQl3cnF1LmVuY29kaW5nLnBvaW50ZXIgPSAodm9pZCBfX3VzZXIgKilscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXk7CiAJCQl3cnF1LmVuY29kaW5nLmxlbmd0aCAgPSBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW47CiAJCX0gZWxzZSB7CiAJCQl3cnF1LmVuY29kaW5nLmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKQEAgLTM3NzgsNyArMzc3OCw3IEBACiAjZW5kaWYKIH07CiAKLXN0cnVjdCBpd19wcml2X2FyZ3Mgd2xfcHJpdl9hcmdzW10gPSB7CitzdGF0aWMgc3RydWN0IGl3X3ByaXZfYXJncyB3bF9wcml2X2FyZ3NbXSA9IHsKICAgICAgICAge1NJT0NTSVdORVROQU1FLCAgICBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sIDAsICJzbmV0d29ya19uYW1lIiB9LAogICAgICAgICB7U0lPQ0dJV05FVE5BTUUsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgICAgImduZXR3b3JrX25hbWUiIH0sCiAgICAgICAgIHtTSU9DU0lXU1RBTkFNRSwgICAgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic3N0YXRpb25fbmFtZSIgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCmluZGV4IGE3ZDI0YzkuLmY3NmY5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYwpAQCAtNDAwLDYgKzQwMCw4IEBACiAJbnVtYnNzID0gbXNnMS5udW1ic3MuZGF0YTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1ic3M7IGkrKykgeworCQlpbnQgZnJlcTsKKwogCQltZW1zZXQoJm1zZzIsIDAsIHNpemVvZihtc2cyKSk7CiAJCW1zZzIubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHM7CiAJCW1zZzIuYnNzaW5kZXguZGF0YSA9IGk7CkBAIC00MTQsOSArNDE2LDEwIEBACiAJCWllX2J1ZlsxXSA9IG1zZzIuc3NpZC5kYXRhLmxlbjsKIAkJaWVfbGVuID0gaWVfYnVmWzFdICsgMjsKIAkJbWVtY3B5KCZpZV9idWZbMl0sICYobXNnMi5zc2lkLmRhdGEuZGF0YSksIG1zZzIuc3NpZC5kYXRhLmxlbik7CisJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobXNnMi5kc2NoYW5uZWwuZGF0YSwKKwkJCQkJCSAgICAgIElFRUU4MDIxMV9CQU5EXzJHSFopOwogCQlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LAotCQkJaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LAotCQkJICAgICAgaWVlZTgwMjExX2Rzc3NfY2hhbl90b19mcmVxKG1zZzIuZHNjaGFubmVsLmRhdGEpKSwKKwkJCWllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSksCiAJCQkoY29uc3QgdTggKikgJihtc2cyLmJzc2lkLmRhdGEuZGF0YSksCiAJCQltc2cyLnRpbWVzdGFtcC5kYXRhLCBtc2cyLmNhcGluZm8uZGF0YSwKIAkJCW1zZzIuYmVhY29ucGVyaW9kLmRhdGEsCkBAIC03NDYsNyArNzQ5LDcgQEAKIAogCiAvKiBGdW5jdGlvbnMgdG8gY3JlYXRlL2ZyZWUgd2lwaHkgaW50ZXJmYWNlICovCi1zdHJ1Y3Qgd2lwaHkgKndsYW5fY3JlYXRlX3dpcGh5KHN0cnVjdCBkZXZpY2UgKmRldiwgd2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIHN0cnVjdCB3aXBoeSAqd2xhbl9jcmVhdGVfd2lwaHkoc3RydWN0IGRldmljZSAqZGV2LCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeTsKIAlzdHJ1Y3QgcHJpc20yX3dpcGh5X3ByaXZhdGUgKnByaXY7CkBAIC03ODMsNyArNzg2LDcgQEAKIH0KIAogCi12b2lkIHdsYW5fZnJlZV93aXBoeShzdHJ1Y3Qgd2lwaHkgKndpcGh5KQorc3RhdGljIHZvaWQgd2xhbl9mcmVlX3dpcGh5KHN0cnVjdCB3aXBoeSAqd2lwaHkpCiB7CiAJd2lwaHlfdW5yZWdpc3Rlcih3aXBoeSk7CiAJd2lwaHlfZnJlZSh3aXBoeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKaW5kZXggMzMzYTJmNi4uMWYyYzc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaApAQCAtNTMxLDE0ICs1MzEsMTQgQEAKIAl1MTYgcmVzZXJ2ZWQyOwogCiAJLyotLSA4MDIuMTEgSGVhZGVyIEluZm9ybWF0aW9uICg4MDIuMTEgYnl0ZSBvcmRlcikgLS0qLwotCXUxNiBmcmFtZV9jb250cm9sOworCV9fbGUxNiBmcmFtZV9jb250cm9sOwogCXUxNiBkdXJhdGlvbl9pZDsKIAl1OCBhZGRyZXNzMVs2XTsKIAl1OCBhZGRyZXNzMls2XTsKIAl1OCBhZGRyZXNzM1s2XTsKIAl1MTYgc2VxdWVuY2VfY29udHJvbDsKIAl1OCBhZGRyZXNzNFs2XTsKLQl1MTYgZGF0YV9sZW47CQkvKiBoZmEzODR4IChsaXR0bGUgZW5kaWFuKSBmb3JtYXQgKi8KKwlfX2xlMTYgZGF0YV9sZW47CQkvKiBoZmEzODR4IChsaXR0bGUgZW5kaWFuKSBmb3JtYXQgKi8KIAogCS8qLS0gODAyLjMgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KIAl1OCBkZXN0X2FkZHJbNl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKaW5kZXggMjYxMDgyNC4uM2RkMDY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaApAQCAtOTEsNyArOTEsNyBAQAogKiAgICBmYWxsIGF0IHRoZSBlbmQgb2YgdGhlaXIgcmVzcGVjdGl2ZSBmcmFtZXMpLgogKiA1YSkgVGhlIGxlbmd0aCBmaWVsZCBpcyBzZXQgdG8gaW5jbHVkZSB0aGUgbGFzdCBvZiB0aGUgZml4ZWQgYW5kIGZpeGVkCiAqICAgICBsZW5ndGggZmllbGRzLiAgSXQgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZCBmb3Igb3B0aW9uYWwgb3IgdmFyaWFibGUKLSogCWxlbmd0aCBpbmZvcm1hdGlvbiBlbGVtZW50cy4KKyoJbGVuZ3RoIGluZm9ybWF0aW9uIGVsZW1lbnRzLgogKiA2KSBPcHRpb25hbCBhbmQgdmFyaWFibGUgbGVuZ3RoIGluZm9ybWF0aW9uIGVsZW1lbnRzIGFyZSBzcGVjaWFsIGNhc2VzCiAqICAgIGFuZCBtdXN0IGJlIGhhbmRsZWQgaW5kaXZpZHVhbGx5IGJ5IHRoZSBjbGllbnQgY29kZS4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxOSw4MiArMjE5LDgyIEBACiAvKi0tIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogcHJvdG90eXBlIHN0cnVjdHVyZSwgYWxsIElFcyBzdGFydCB3aXRoIHRoZXNlIG1lbWJlcnMgKi8KIAotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZSB7CitzdHJ1Y3Qgd2xhbl9pZSB7CiAJdTggZWlkOwogCXU4IGxlbjsKLX0gX19wYWNrZWQgd2xhbl9pZV90OworfSBfX3BhY2tlZDsKIAogLyotLSBTZXJ2aWNlIFNldCBJZGVudGl0eSAoU1NJRCkgIC0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfc3NpZCB7CitzdHJ1Y3Qgd2xhbl9pZV9zc2lkIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXU4IHNzaWRbMV07CQkvKiBtYXkgYmUgemVybywgcHRycyBtYXkgb3ZlcmxhcCAqLwotfSBfX3BhY2tlZCB3bGFuX2llX3NzaWRfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gU3VwcG9ydGVkIFJhdGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgeworc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1OCByYXRlc1sxXTsJCS8qIGhhZCBiZXR0ZXIgYmUgYXQgTEVBU1Qgb25lISAqLwotfSBfX3BhY2tlZCB3bGFuX2llX3N1cHBfcmF0ZXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gRkggUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX2ZoX3Bhcm1zIHsKK3N0cnVjdCB3bGFuX2llX2ZoX3Bhcm1zIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXUxNiBkd2VsbDsKIAl1OCBob3BzZXQ7CiAJdTggaG9wcGF0dGVybjsKIAl1OCBob3BpbmRleDsKLX0gX19wYWNrZWQgd2xhbl9pZV9maF9wYXJtc190OworfSBfX3BhY2tlZDsKIAogLyotLSBEUyBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfZHNfcGFybXMgeworc3RydWN0IHdsYW5faWVfZHNfcGFybXMgewogCXU4IGVpZDsKIAl1OCBsZW47CiAJdTggY3Vycl9jaDsKLX0gX19wYWNrZWQgd2xhbl9pZV9kc19wYXJtc190OworfSBfX3BhY2tlZDsKIAogLyotLSBDRiBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9jZl9wYXJtcyB7CitzdHJ1Y3Qgd2xhbl9pZV9jZl9wYXJtcyB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1OCBjZnBfY250OwogCXU4IGNmcF9wZXJpb2Q7CiAJdTE2IGNmcF9tYXhkdXI7CiAJdTE2IGNmcF9kdXJyZW1haW5pbmc7Ci19IF9fcGFja2VkIHdsYW5faWVfY2ZfcGFybXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gVElNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX3RpbSB7CitzdHJ1Y3Qgd2xhbl9pZV90aW0gewogCXU4IGVpZDsKIAl1OCBsZW47CiAJdTggZHRpbV9jbnQ7CiAJdTggZHRpbV9wZXJpb2Q7CiAJdTggYml0bWFwX2N0bDsKIAl1OCB2aXJ0X2JtWzFdOwotfSBfX3BhY2tlZCB3bGFuX2llX3RpbV90OworfSBfX3BhY2tlZDsKIAogLyotLSBJQlNTIFBhcmFtZXRlciBTZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfaWJzc19wYXJtcyB7CitzdHJ1Y3Qgd2xhbl9pZV9pYnNzX3Bhcm1zIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXUxNiBhdGltX3dpbjsKLX0gX19wYWNrZWQgd2xhbl9pZV9pYnNzX3Bhcm1zX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIENoYWxsZW5nZSBUZXh0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9jaGFsbGVuZ2Ugeworc3RydWN0IHdsYW5faWVfY2hhbGxlbmdlIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXU4IGNoYWxsZW5nZVsxXTsKLX0gX19wYWNrZWQgd2xhbl9pZV9jaGFsbGVuZ2VfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiAgRnJhbWUgVHlwZXMgICovCiAKIC8qIHByb3RvdHlwZSBzdHJ1Y3R1cmUsIGFsbCBtZ210IGZyYW1lIHR5cGVzIHdpbGwgc3RhcnQgd2l0aCB0aGVzZSBtZW1iZXJzICovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX21nbXQgeworc3RydWN0IHdsYW5fZnJfbWdtdCB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsJCS8qIERPRVMgTk9UIGluY2x1ZGUgQ1JDICEhISEgKi8KIAl1OCAqYnVmOwpAQCAtMzAzLDEwICszMDMsMTAgQEAKIAl2b2lkICpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi19IHdsYW5fZnJfbWdtdF90OworfTsKIAogLyotLSBCZWFjb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYmVhY29uIHsKK3N0cnVjdCB3bGFuX2ZyX2JlYWNvbiB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtMzE4LDE4ICszMTgsMTggQEAKIAl1MTYgKmJjbl9pbnQ7CiAJdTE2ICpjYXBfaW5mbzsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zc2lkX3QgKnNzaWQ7Ci0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7Ci0Jd2xhbl9pZV9maF9wYXJtc190ICpmaF9wYXJtczsKLQl3bGFuX2llX2RzX3Bhcm1zX3QgKmRzX3Bhcm1zOwotCXdsYW5faWVfY2ZfcGFybXNfdCAqY2ZfcGFybXM7Ci0Jd2xhbl9pZV9pYnNzX3Bhcm1zX3QgKmlic3NfcGFybXM7Ci0Jd2xhbl9pZV90aW1fdCAqdGltOworCXN0cnVjdCB3bGFuX2llX3NzaWQgKnNzaWQ7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyAqZmhfcGFybXM7CisJc3RydWN0IHdsYW5faWVfZHNfcGFybXMgKmRzX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX2NmX3Bhcm1zICpjZl9wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV9pYnNzX3Bhcm1zICppYnNzX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX3RpbSAqdGltOwogCi19IHdsYW5fZnJfYmVhY29uX3Q7Cit9OwogCiAvKi0tIElCU1MgQVRJTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9pYnNzYXRpbSB7CitzdHJ1Y3Qgd2xhbl9mcl9pYnNzYXRpbSB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtMzQyLDEwICszNDIsMTAgQEAKIAogCS8qIHRoaXMgZnJhbWUgdHlwZSBoYXMgYSBudWxsIGJvZHkgKi8KIAotfSB3bGFuX2ZyX2lic3NhdGltX3Q7Cit9OwogCiAvKi0tIERpc2Fzc29jaWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9kaXNhc3NvYyB7CitzdHJ1Y3Qgd2xhbl9mcl9kaXNhc3NvYyB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtMzU3LDEwICszNTcsMTAgQEAKIAogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAotfSB3bGFuX2ZyX2Rpc2Fzc29jX3Q7Cit9OwogCiAvKi0tIEFzc29jaWF0aW9uIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3JlcSB7CitzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3JlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtMzcxLDEzICszNzEsMTMgQEAKIAl1MTYgKmNhcF9pbmZvOwogCXUxNiAqbGlzdGVuX2ludDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zc2lkX3QgKnNzaWQ7Ci0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfc3NpZCAqc3NpZDsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOwogCi19IHdsYW5fZnJfYXNzb2NyZXFfdDsKK307CiAKIC8qLS0gQXNzb2NpYXRpb24gUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVzcCB7CitzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3Jlc3AgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM4OSwxMiArMzg5LDEyIEBACiAJdTE2ICpzdGF0dXM7CiAJdTE2ICphaWQ7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOworCXN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgKnN1cHBfcmF0ZXM7CiAKLX0gd2xhbl9mcl9hc3NvY3Jlc3BfdDsKK307CiAKIC8qLS0gUmVhc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEgeworc3RydWN0IHdsYW5fZnJfcmVhc3NvY3JlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDA2LDEzICs0MDYsMTMgQEAKIAl1MTYgKmxpc3Rlbl9pbnQ7CiAJdTggKmN1cnJfYXA7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOworCXN0cnVjdCB3bGFuX2llX3NzaWQgKnNzaWQ7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKIAotfSB3bGFuX2ZyX3JlYXNzb2NyZXFfdDsKK307CiAKIC8qLS0gUmVhc3NvY2lhdGlvbiBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwIHsKK3N0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwIHsKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7CkBAIC00MjQsMTIgKzQyNCwxMiBAQAogCXUxNiAqc3RhdHVzOwogCXUxNiAqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX3N1cHBfcmF0ZXNfdCAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOwogCi19IHdsYW5fZnJfcmVhc3NvY3Jlc3BfdDsKK307CiAKIC8qLS0gUHJvYmUgUmVxdWVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVxIHsKK3N0cnVjdCB3bGFuX2ZyX3Byb2JlcmVxIHsKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7CkBAIC00MzgsMTMgKzQzOCwxMyBAQAogCXZvaWQgKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX3NzaWRfdCAqc3NpZDsKLQl3bGFuX2llX3N1cHBfcmF0ZXNfdCAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9zc2lkICpzc2lkOworCXN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgKnN1cHBfcmF0ZXM7CiAKLX0gd2xhbl9mcl9wcm9iZXJlcV90OworfTsKIAogLyotLSBQcm9iZSBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwIHsKK3N0cnVjdCB3bGFuX2ZyX3Byb2JlcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDU2LDE2ICs0NTYsMTYgQEAKIAl1MTYgKmJjbl9pbnQ7CiAJdTE2ICpjYXBfaW5mbzsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zc2lkX3QgKnNzaWQ7Ci0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7Ci0Jd2xhbl9pZV9maF9wYXJtc190ICpmaF9wYXJtczsKLQl3bGFuX2llX2RzX3Bhcm1zX3QgKmRzX3Bhcm1zOwotCXdsYW5faWVfY2ZfcGFybXNfdCAqY2ZfcGFybXM7Ci0Jd2xhbl9pZV9pYnNzX3Bhcm1zX3QgKmlic3NfcGFybXM7Ci19IHdsYW5fZnJfcHJvYmVyZXNwX3Q7CisJc3RydWN0IHdsYW5faWVfc3NpZCAqc3NpZDsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOworCXN0cnVjdCB3bGFuX2llX2ZoX3Bhcm1zICpmaF9wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV9kc19wYXJtcyAqZHNfcGFybXM7CisJc3RydWN0IHdsYW5faWVfY2ZfcGFybXMgKmNmX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX2lic3NfcGFybXMgKmlic3NfcGFybXM7Cit9OwogCiAvKi0tIEF1dGhlbnRpY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hdXRoZW4geworc3RydWN0IHdsYW5fZnJfYXV0aGVuIHsKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7CkBAIC00NzcsMTIgKzQ3NywxMiBAQAogCXUxNiAqYXV0aF9zZXE7CiAJdTE2ICpzdGF0dXM7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfY2hhbGxlbmdlX3QgKmNoYWxsZW5nZTsKKwlzdHJ1Y3Qgd2xhbl9pZV9jaGFsbGVuZ2UgKmNoYWxsZW5nZTsKIAotfSB3bGFuX2ZyX2F1dGhlbl90OworfTsKIAogLyotLSBEZWF1dGhlbmljYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbiB7CitzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbiB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDk0LDI3ICs0OTQsMjcgQEAKIAogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAotfSB3bGFuX2ZyX2RlYXV0aGVuX3Q7Cit9OwogCi12b2lkIHdsYW5fbWdtdF9lbmNvZGVfYmVhY29uKHdsYW5fZnJfYmVhY29uX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX2JlYWNvbih3bGFuX2ZyX2JlYWNvbl90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9kaXNhc3NvYyh3bGFuX2ZyX2Rpc2Fzc29jX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX2Rpc2Fzc29jKHdsYW5fZnJfZGlzYXNzb2NfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfYXNzb2NyZXEod2xhbl9mcl9hc3NvY3JlcV90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9hc3NvY3JlcSh3bGFuX2ZyX2Fzc29jcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2Fzc29jcmVzcCh3bGFuX2ZyX2Fzc29jcmVzcF90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9hc3NvY3Jlc3Aod2xhbl9mcl9hc3NvY3Jlc3BfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfcmVhc3NvY3JlcSh3bGFuX2ZyX3JlYXNzb2NyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfcmVhc3NvY3JlcSh3bGFuX2ZyX3JlYXNzb2NyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfcmVhc3NvY3Jlc3Aod2xhbl9mcl9yZWFzc29jcmVzcF90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9yZWFzc29jcmVzcCh3bGFuX2ZyX3JlYXNzb2NyZXNwX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX3Byb2JlcmVxKHdsYW5fZnJfcHJvYmVyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfcHJvYmVyZXEod2xhbl9mcl9wcm9iZXJlcV90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9wcm9iZXJlc3Aod2xhbl9mcl9wcm9iZXJlc3BfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfcHJvYmVyZXNwKHdsYW5fZnJfcHJvYmVyZXNwX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2F1dGhlbih3bGFuX2ZyX2F1dGhlbl90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9hdXRoZW4od2xhbl9mcl9hdXRoZW5fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfZGVhdXRoZW4od2xhbl9mcl9kZWF1dGhlbl90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9kZWF1dGhlbih3bGFuX2ZyX2RlYXV0aGVuX3QgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX2JlYWNvbihzdHJ1Y3Qgd2xhbl9mcl9iZWFjb24gKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX2JlYWNvbihzdHJ1Y3Qgd2xhbl9mcl9iZWFjb24gKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX2Rpc2Fzc29jKHN0cnVjdCB3bGFuX2ZyX2Rpc2Fzc29jICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9kaXNhc3NvYyhzdHJ1Y3Qgd2xhbl9mcl9kaXNhc3NvYyAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfYXNzb2NyZXEoc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX2Fzc29jcmVxKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9hc3NvY3Jlc3Aoc3RydWN0IHdsYW5fZnJfYXNzb2NyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9hc3NvY3Jlc3Aoc3RydWN0IHdsYW5fZnJfYXNzb2NyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9yZWFzc29jcmVxKHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX3JlYXNzb2NyZXEoc3RydWN0IHdsYW5fZnJfcmVhc3NvY3JlcSAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfcmVhc3NvY3Jlc3Aoc3RydWN0IHdsYW5fZnJfcmVhc3NvY3Jlc3AgKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX3JlYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9wcm9iZXJlcShzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcSAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfcHJvYmVyZXEoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX3Byb2JlcmVzcChzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlc3AgKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVzcChzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlc3AgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX2F1dGhlbihzdHJ1Y3Qgd2xhbl9mcl9hdXRoZW4gKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX2F1dGhlbihzdHJ1Y3Qgd2xhbl9mcl9hdXRoZW4gKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX2RlYXV0aGVuKHN0cnVjdCB3bGFuX2ZyX2RlYXV0aGVuICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9kZWF1dGhlbihzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbiAqZik7CiAKICNlbmRpZiAvKiBfUDgwMjExTUdNVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCmluZGV4IDAwMzllMDguLmUzYWU4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCkBAIC0yNjIsNyArMjYyLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAluZXRkZXZpY2VfdCAqZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCXN0cnVjdCBwODAyMTFfaGRyX2EzICpoZHI7Ci0JdTE2IGZjOwogCiAJLyogTGV0J3MgZW1wdHkgb3VyIG91ciBxdWV1ZSAqLwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndsYW5kZXYtPm5zZF9yeHEpKSkgewpAQCAtMjg2LDggKzI4NSw3IEBACiAJCQkJY29udGludWU7CiAJCQl9IGVsc2UgewogCQkJCWhkciA9IChzdHJ1Y3QgcDgwMjExX2hkcl9hMyAqKSBza2ItPmRhdGE7Ci0JCQkJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZjKTsKLQkJCQlpZiAocDgwMjExX3J4X3R5cGVkcm9wKHdsYW5kZXYsIGZjKSkgeworCQkJCWlmIChwODAyMTFfcnhfdHlwZWRyb3Aod2xhbmRldiwgaGRyLT5mYykpIHsKIAkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCQljb250aW51ZTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYwppbmRleCAwZGZkMmE0Li4yYjBjMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogKgkwCS0gc3VjY2VzcwogKgl+MAktIGZhaWx1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMl9md3RyeShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgd2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCBwcmlzbTJfZnd0cnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwppbmRleCAyMTk5ZjVhLi5mOWNjZjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwpAQCAtNDU0LDkgKzQ1NCw4IEBACiAJCQkgKi8KIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zdGFydChodyk7CiAJCQlpZiAocmVzdWx0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQsIgotCQkJCSAgICAgICAicmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CisJCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCisJCQkJICAgICAgICJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQscmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CiAJCQkJcmVzdWx0ID0KIAkJCQkgUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CiAJCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7CkBAIC00OTksOSArNDk4LDggQEAKIAkJCSAqLwogCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3N0YXJ0KGh3KTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImhmYTM4NHhfZHJ2cl9zdGFydCgpIGZhaWxlZCwiCi0JCQkJICAgICAgICJyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKKwkJCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKKwkJCQkgICAgICAgImhmYTM4NHhfZHJ2cl9zdGFydCgpIGZhaWxlZCxyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKIAkJCQlyZXN1bHQgPQogCQkJCSAgUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CiAJCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7CkBAIC01MTAsOSArNTA4LDggQEAKIAogCQkJcmVzdWx0ID0gcHJpc20yc3RhX2dldGNhcmRpbmZvKHdsYW5kZXYpOwogCQkJaWYgKHJlc3VsdCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAicHJpc20yc3RhX2dldGNhcmRpbmZvKCkgZmFpbGVkLCIKLQkJCQkgICAgICAgInJlc3VsdD0lZFxuIiwgKGludClyZXN1bHQpOworCQkJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LAorCQkJCSAgICAgICAicHJpc20yc3RhX2dldGNhcmRpbmZvKCkgZmFpbGVkLHJlc3VsdD0lZFxuIiwgKGludClyZXN1bHQpOwogCQkJCXJlc3VsdCA9CiAJCQkJICBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKIAkJCQloZmEzODR4X2RydnJfc3RvcChodyk7CkBAIC01MjEsOSArNTE4LDggQEAKIAkJCX0KIAkJCXJlc3VsdCA9IHByaXNtMnN0YV9nbG9iYWxzZXR1cCh3bGFuZGV2KTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgInByaXNtMnN0YV9nbG9iYWxzZXR1cCgpIGZhaWxlZCwiCi0JCQkJICAgICAgICJyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKKwkJCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKKwkJCQkgICAgICAgInByaXNtMnN0YV9nbG9iYWxzZXR1cCgpIGZhaWxlZCxyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKIAkJCQlyZXN1bHQgPQogCQkJCSAgUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CiAJCQkJaGZhMzg0eF9kcnZyX3N0b3AoaHcpOwpAQCAtNjIzLDcgKzYxOSw3IEBACiAJCQkJCSZody0+aWRlbnRfbmljLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgTklDSURFTlRJVFlcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBOSUNJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNjMzLDcgKzYyOSw3IEBACiAJaHctPmlkZW50X25pYy5tYWpvciA9IGxlMTZfdG9fY3B1KGh3LT5pZGVudF9uaWMubWFqb3IpOwogCWh3LT5pZGVudF9uaWMubWlub3IgPSBsZTE2X3RvX2NwdShody0+aWRlbnRfbmljLm1pbm9yKTsKIAotCXByaW50ayhLRVJOX0lORk8gImlkZW50OiBuaWMgaC93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCisJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAiaWRlbnQ6IG5pYyBoL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkgICAgICAgaHctPmlkZW50X25pYy5pZCwgaHctPmlkZW50X25pYy5tYWpvciwKIAkgICAgICAgaHctPmlkZW50X25pYy5taW5vciwgaHctPmlkZW50X25pYy52YXJpYW50KTsKIApAQCAtNjQyLDcgKzYzOCw3IEBACiAJCQkJCSZody0+aWRlbnRfcHJpX2Z3LAogCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJSURFTlRJVFlcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNjUyLDcgKzY0OCw3IEBACiAJaHctPmlkZW50X3ByaV9mdy5tYWpvciA9IGxlMTZfdG9fY3B1KGh3LT5pZGVudF9wcmlfZncubWFqb3IpOwogCWh3LT5pZGVudF9wcmlfZncubWlub3IgPSBsZTE2X3RvX2NwdShody0+aWRlbnRfcHJpX2Z3Lm1pbm9yKTsKIAotCXByaW50ayhLRVJOX0lORk8gImlkZW50OiBwcmkgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCisJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAiaWRlbnQ6IHByaSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkgICAgICAgaHctPmlkZW50X3ByaV9mdy5pZCwgaHctPmlkZW50X3ByaV9mdy5tYWpvciwKIAkgICAgICAgaHctPmlkZW50X3ByaV9mdy5taW5vciwgaHctPmlkZW50X3ByaV9mdy52YXJpYW50KTsKIApAQCAtNjYxLDEyICs2NTcsMTIgQEAKIAkJCQkJJmh3LT5pZGVudF9zdGFfZncsCiAJCQkJCXNpemVvZihoZmEzODR4X2NvbXBpZGVudF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFJREVOVElUWVxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQUlERU5USVRZXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJaWYgKGh3LT5pZGVudF9uaWMuaWQgPCAweDgwMDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSCisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LAogCQkgICAgICAgIkZBVEFMOiBDYXJkIGlzIG5vdCBhbiBJbnRlcnNpbCBQcmlzbTIvMi41LzNcbiIpOwogCQlyZXN1bHQgPSAtMTsKIAkJZ290byBmYWlsZWQ7CkBAIC02ODMsMTYgKzY3OSwxNiBAQAogCWh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmPSB+KCh1MTYpIChCSVQoMTQpIHwgQklUKDE1KSkpOwogCiAJaWYgKGh3LT5pZGVudF9zdGFfZncuaWQgPT0gMHgxZikgewotCQlwcmludGsoS0VSTl9JTkZPCisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJpZGVudDogc3RhIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAogCQkgICAgICAgaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKIAkJICAgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCSAgICAgICAiaWRlbnQ6ICBhcCBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkJICAgICAgIGh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCiAJCSAgICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOwotCQlwcmludGsoS0VSTl9FUlIgIlVuc3VwcG9ydGVkIFRlcnRpYXJ5IEFQIGZpcm1lYXJlIGxvYWRlZCFcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIlVuc3VwcG9ydGVkIFRlcnRpYXJ5IEFQIGZpcm1lYXJlIGxvYWRlZCFcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTcwMSw3ICs2OTcsNyBAQAogCQkJCQkmaHctPmNhcF9zdXBfbWZpLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBNRklTVVBSQU5HRVxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIE1GSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03MTMsNyArNzA5LDcgQEAKIAlody0+Y2FwX3N1cF9tZmkuYm90dG9tID0gbGUxNl90b19jcHUoaHctPmNhcF9zdXBfbWZpLmJvdHRvbSk7CiAJaHctPmNhcF9zdXBfbWZpLnRvcCA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX21maS50b3ApOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkgICAgICAgIk1GSTpTVVA6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCSAgICAgICBody0+Y2FwX3N1cF9tZmkucm9sZSwgaHctPmNhcF9zdXBfbWZpLmlkLAogCSAgICAgICBody0+Y2FwX3N1cF9tZmkudmFyaWFudCwgaHctPmNhcF9zdXBfbWZpLmJvdHRvbSwKQEAgLTcyNCw3ICs3MjAsNyBAQAogCQkJCQkmaHctPmNhcF9zdXBfY2ZpLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBDRklTVVBSQU5HRVxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIENGSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03MzYsNyArNzMyLDcgQEAKIAlody0+Y2FwX3N1cF9jZmkuYm90dG9tID0gbGUxNl90b19jcHUoaHctPmNhcF9zdXBfY2ZpLmJvdHRvbSk7CiAJaHctPmNhcF9zdXBfY2ZpLnRvcCA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX2NmaS50b3ApOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkgICAgICAgIkNGSTpTVVA6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCSAgICAgICBody0+Y2FwX3N1cF9jZmkucm9sZSwgaHctPmNhcF9zdXBfY2ZpLmlkLAogCSAgICAgICBody0+Y2FwX3N1cF9jZmkudmFyaWFudCwgaHctPmNhcF9zdXBfY2ZpLmJvdHRvbSwKQEAgLTc0Nyw3ICs3NDMsNyBAQAogCQkJCQkmaHctPmNhcF9zdXBfcHJpLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklTVVBSQU5HRVxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03NTksNyArNzU1LDcgQEAKIAlody0+Y2FwX3N1cF9wcmkuYm90dG9tID0gbGUxNl90b19jcHUoaHctPmNhcF9zdXBfcHJpLmJvdHRvbSk7CiAJaHctPmNhcF9zdXBfcHJpLnRvcCA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX3ByaS50b3ApOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkgICAgICAgIlBSSTpTVVA6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCSAgICAgICBody0+Y2FwX3N1cF9wcmkucm9sZSwgaHctPmNhcF9zdXBfcHJpLmlkLAogCSAgICAgICBody0+Y2FwX3N1cF9wcmkudmFyaWFudCwgaHctPmNhcF9zdXBfcHJpLmJvdHRvbSwKQEAgLTc3MCw3ICs3NjYsNyBAQAogCQkJCQkmaHctPmNhcF9zdXBfc3RhLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFTVVBSQU5HRVxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03ODMsMTMgKzc3OSwxMyBAQAogCWh3LT5jYXBfc3VwX3N0YS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9zdGEudG9wKTsKIAogCWlmIChody0+Y2FwX3N1cF9zdGEuaWQgPT0gMHgwNCkgewotCQlwcmludGsoS0VSTl9JTkZPCisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJTVEE6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkJICAgICAgIGh3LT5jYXBfc3VwX3N0YS5yb2xlLCBody0+Y2FwX3N1cF9zdGEuaWQsCiAJCSAgICAgICBody0+Y2FwX3N1cF9zdGEudmFyaWFudCwgaHctPmNhcF9zdXBfc3RhLmJvdHRvbSwKIAkJICAgICAgIGh3LT5jYXBfc3VwX3N0YS50b3ApOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8KKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCQkgICAgICAgIkFQOlNVUDpyb2xlPTB4JTAyeDppZD0weCUwMng6dmFyPTB4JTAyeDpiL3Q9JWQvJWRcbiIsCiAJCSAgICAgICBody0+Y2FwX3N1cF9zdGEucm9sZSwgaHctPmNhcF9zdXBfc3RhLmlkLAogCQkgICAgICAgaHctPmNhcF9zdXBfc3RhLnZhcmlhbnQsIGh3LT5jYXBfc3VwX3N0YS5ib3R0b20sCkBAIC04MDEsNyArNzk3LDcgQEAKIAkJCQkJJmh3LT5jYXBfYWN0X3ByaV9jZmksCiAJCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSV9DRklBQ1RSQU5HRVNcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklfQ0ZJQUNUUkFOR0VTXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC04MTMsNyArODA5LDcgQEAKIAlody0+Y2FwX2FjdF9wcmlfY2ZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfYWN0X3ByaV9jZmkuYm90dG9tKTsKIAlody0+Y2FwX2FjdF9wcmlfY2ZpLnRvcCA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfYWN0X3ByaV9jZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJQUkktQ0ZJOkFDVDpyb2xlPTB4JTAyeDppZD0weCUwMng6dmFyPTB4JTAyeDpiL3Q9JWQvJWRcbiIsCiAJICAgICAgIGh3LT5jYXBfYWN0X3ByaV9jZmkucm9sZSwgaHctPmNhcF9hY3RfcHJpX2NmaS5pZCwKIAkgICAgICAgaHctPmNhcF9hY3RfcHJpX2NmaS52YXJpYW50LCBody0+Y2FwX2FjdF9wcmlfY2ZpLmJvdHRvbSwKQEAgLTgyNCw3ICs4MjAsNyBAQAogCQkJCQkmaHctPmNhcF9hY3Rfc3RhX2NmaSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX0NGSUFDVFJBTkdFU1xuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQV9DRklBQ1RSQU5HRVNcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTgzNiw3ICs4MzIsNyBAQAogCWh3LT5jYXBfYWN0X3N0YV9jZmkuYm90dG9tID0gbGUxNl90b19jcHUoaHctPmNhcF9hY3Rfc3RhX2NmaS5ib3R0b20pOwogCWh3LT5jYXBfYWN0X3N0YV9jZmkudG9wID0gbGUxNl90b19jcHUoaHctPmNhcF9hY3Rfc3RhX2NmaS50b3ApOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkgICAgICAgIlNUQS1DRkk6QUNUOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9hY3Rfc3RhX2NmaS5yb2xlLCBody0+Y2FwX2FjdF9zdGFfY2ZpLmlkLAogCSAgICAgICBody0+Y2FwX2FjdF9zdGFfY2ZpLnZhcmlhbnQsIGh3LT5jYXBfYWN0X3N0YV9jZmkuYm90dG9tLApAQCAtODQ3LDcgKzg0Myw3IEBACiAJCQkJCSZody0+Y2FwX2FjdF9zdGFfbWZpLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFfTUZJQUNUUkFOR0VTXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX01GSUFDVFJBTkdFU1xuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtODU5LDcgKzg1NSw3IEBACiAJaHctPmNhcF9hY3Rfc3RhX21maS5ib3R0b20gPSBsZTE2X3RvX2NwdShody0+Y2FwX2FjdF9zdGFfbWZpLmJvdHRvbSk7CiAJaHctPmNhcF9hY3Rfc3RhX21maS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX2FjdF9zdGFfbWZpLnRvcCk7CiAKLQlwcmludGsoS0VSTl9JTkZPCisJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCSAgICAgICAiU1RBLU1GSTpBQ1Q6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCSAgICAgICBody0+Y2FwX2FjdF9zdGFfbWZpLnJvbGUsIGh3LT5jYXBfYWN0X3N0YV9tZmkuaWQsCiAJICAgICAgIGh3LT5jYXBfYWN0X3N0YV9tZmkudmFyaWFudCwgaHctPmNhcF9hY3Rfc3RhX21maS5ib3R0b20sCkBAIC04NzEsOSArODY3LDkgQEAKIAlpZiAoIXJlc3VsdCkgewogCQl3bGFuX21rcHJpbnRzdHIoc251bSwgSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTiwKIAkJCQlwc3RyLCBzaXplb2YocHN0cikpOwotCQlwcmludGsoS0VSTl9JTkZPICJQcmlzbTIgY2FyZCBTTjogJXNcbiIsIHBzdHIpOworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJQcmlzbTIgY2FyZCBTTjogJXNcbiIsIHBzdHIpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIFByaXNtMiBDYXJkIFNOXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgUHJpc20yIENhcmQgU05cbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTg4MSw3ICs4NzcsNyBAQAogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIsCiAJCQkJCXdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgbWFjIGFkZHJlc3NcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBtYWMgYWRkcmVzc1xuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtOTA5LDcgKzkwNSw3IEBACiAKIAlnb3RvIGRvbmU7CiBmYWlsZWQ6Ci0JcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKKwluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCwgcmVzdWx0PSVkXG4iLCByZXN1bHQpOwogZG9uZToKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTA4NSw3ICsxMDgxLDcgQEAKIAkJCQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1QsCiAJCQkJCSZqb2lucmVxLCBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4pOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZXRjb25maWcoam9pbnJlcSkgZmFpbGVkLCByZXN1bHQ9JWRcbiIsCisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAic2V0Y29uZmlnKGpvaW5yZXEpIGZhaWxlZCwgcmVzdWx0PSVkXG4iLAogCQkgICAgICAgcmVzdWx0KTsKIAl9CiB9CkBAIC0xMjI2LDcgKzEyMjIsNyBAQAogCQkgKi8KIAkJbmV0aWZfY2Fycmllcl9vZmYod2xhbmRldi0+bmV0ZGV2KTsKIAotCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPU5PVENPTk5FQ1RFRCAodW5oYW5kbGVkKVxuIik7CisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImxpbmtzdGF0dXM9Tk9UQ09OTkVDVEVEICh1bmhhbmRsZWQpXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEhGQTM4NHhfTElOS19DT05ORUNURUQ6CkBAIC0xMjUzLDcgKzEyNDksNyBAQAogCQlpZiAod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikgewogCQkJdTE2IHBvcnRzdGF0dXM7CiAKLQkJCXByaW50ayhLRVJOX0lORk8gImxpbmtzdGF0dXM9Q09OTkVDVEVEXG4iKTsKKwkJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImxpbmtzdGF0dXM9Q09OTkVDVEVEXG4iKTsKIAogCQkJLyogRm9yIG5vbi11c2IgZGV2aWNlcywgd2UgY2FuIHVzZSB0aGUgc3luYyB2ZXJzaW9ucyAqLwogCQkJLyogQ29sbGVjdCB0aGUgQlNTSUQsIGFuZCBzZXQgc3RhdGUgdG8gYWxsb3cgdHggKi8KQEAgLTEzMTUsNyArMTMxMSw3IEBACiAJCSAqIEJsb2NrIFRyYW5zbWl0cywgSWdub3JlIHJlY2VpdmVzIG9mIGRhdGEgZnJhbWVzCiAJCSAqLwogCQlpZiAod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikKLQkJCXByaW50ayhLRVJOX0lORk8KKwkJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJCSAgICAgICAibGlua3N0YXR1cz1ESVNDT05ORUNURUQgKHVuaGFuZGxlZClcbiIpOwogCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX05PTkU7CiAKQEAgLTEzNDEsNyArMTMzNyw3IEBACiAJCSAqIEluZGljYXRlIFJlYXNzb2NpYXRpb24KIAkJICogRW5hYmxlIFRyYW5zbWl0cywgUmVjZWl2ZXMgYW5kIHBhc3MgdXAgZGF0YSBmcmFtZXMKIAkJICovCi0JCXByaW50ayhLRVJOX0lORk8gImxpbmtzdGF0dXM9QVBfQ0hBTkdFXG4iKTsKKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAibGlua3N0YXR1cz1BUF9DSEFOR0VcbiIpOwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsCiAJCQkJCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQsCkBAIC0xMzgzLDcgKzEzNzksNyBAQAogCQkgKiBSZXNwb25zZToKIAkJICogQmxvY2sgVHJhbnNtaXRzLCBJZ25vcmUgcmVjZWl2ZXMgb2YgZGF0YSBmcmFtZXMKIAkJICovCi0JCXByaW50ayhLRVJOX0lORk8gImxpbmtzdGF0dXM9QVBfT1VUT0ZSQU5HRSAodW5oYW5kbGVkKVxuIik7CisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImxpbmtzdGF0dXM9QVBfT1VUT0ZSQU5HRSAodW5oYW5kbGVkKVxuIik7CiAKIAkJbmV0aWZfY2Fycmllcl9vZmYod2xhbmRldi0+bmV0ZGV2KTsKIApAQCAtMTM5Niw3ICsxMzkyLDcgQEAKIAkJICogUmVzcG9uc2U6CiAJCSAqIEVuYWJsZSBUcmFuc21pdHMsIFJlY2VpdmVzIGFuZCBwYXNzIHVwIGRhdGEgZnJhbWVzCiAJCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUFQX0lOUkFOR0VcbiIpOworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPUFQX0lOUkFOR0VcbiIpOwogCiAJCWh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19DT05ORUNURUQ7CiAJCW5ldGlmX2NhcnJpZXJfb24od2xhbmRldi0+bmV0ZGV2KTsKQEAgLTE0MjAsMTAgKzE0MTYsMTAgQEAKIAkJCQkJICAgICAgIEhGQTM4NHhfUklEX0pPSU5SRVFVRVNULAogCQkJCQkgICAgICAgJmpvaW5yZXEsCiAJCQkJCSAgICAgICBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4pOwotCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCQkJICAgICAgICJsaW5rc3RhdHVzPUFTU09DRkFJTCAocmUtc3VibWl0dGluZyBqb2luKVxuIik7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUFTU09DRkFJTCAodW5oYW5kbGVkKVxuIik7CisJCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPUFTU09DRkFJTCAodW5oYW5kbGVkKVxuIik7CiAJCX0KIAogCQluZXRpZl9jYXJyaWVyX29mZih3bGFuZGV2LT5uZXRkZXYpOwpAQCAtMTcxMyw3ICsxNzA5LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWlmIChhZGRlZCkKIAkJCWh3LT5hdXRobGlzdC5jbnQtLTsKLQkJcHJpbnRrKEtFUk5fRVJSCisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LAogCQkgICAgICAgInNldGNvbmZpZyhhdXRoZW50aWNhdGVzdGF0aW9uKSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwKIAkJICAgICAgIHJlc3VsdCk7CiAJfQpAQCAtMTkyOCw3ICsxOTI0LDcgQEAKIAlodyA9IGt6YWxsb2Moc2l6ZW9mKGhmYTM4NHhfdCksIEdGUF9LRVJORUwpOwogCiAJaWYgKCF3bGFuZGV2IHx8ICFodykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOworCQlwcl9lcnIoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwogCQlrZnJlZSh3bGFuZGV2KTsKIAkJa2ZyZWUoaHcpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE5ODAsNyArMTk3Niw3IEBACiAJCQkJJmh3LT5xdWFsLCBIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFlfTEVOKTsKIAogCQlpZiAocmVzdWx0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGZldGNoaW5nIGNvbW1zcXVhbFxuIik7CisJCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgImVycm9yIGZldGNoaW5nIGNvbW1zcXVhbFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCBiM2ZmNjAzLi40NjY4MDQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKQEAgLTE3NTQsOCArMTc1NCw3IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSByZXF1ZXN0IG1lbW9yeSBzaXplICV4XG4iLAogCQkgICAgICAgeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSk7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJGYXRhbCBlcnJvcjogVW5hYmxlIHRvIHJlc2VydmUgZnJhbWUgYnVmZmVyIG1lbW9yeS4gIgotCQkJIklzIHRoZXJlIGFub3RoZXIgZnJhbWVidWZmZXIgZHJpdmVyIGFjdGl2ZT9cbiIpOworCQkJIkZhdGFsIGVycm9yOiBVbmFibGUgdG8gcmVzZXJ2ZSBmcmFtZSBidWZmZXIgbWVtb3J5LiBJcyB0aGVyZSBhbm90aGVyIGZyYW1lYnVmZmVyIGRyaXZlciBhY3RpdmU/XG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcl9kaXNhYmxlOwogCX0KQEAgLTIwODcsMjMgKzIwODYsMTkgQEAKIAogbW9kdWxlX3BhcmFtKG1vZGUsIGNoYXJwLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobW9kZSwKLQkiU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBpbiB0aGUgZm9ybWF0IFh4WXhEZXB0aCAiCi0JIihlZy4gMTAyNHg3Njh4MTYpLiIpOworCSJTZWxlY3RzIHRoZSBkZXNpcmVkIGRlZmF1bHQgZGlzcGxheSBtb2RlIGluIHRoZSBmb3JtYXQgWHhZeERlcHRoIChlZy4gMTAyNHg3Njh4MTYpLiIpOwogCiBtb2R1bGVfcGFyYW0oZm9yY2VjcnQydHlwZSwgY2hhcnAsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZWNydDJ0eXBlLAotCSJGb3JjZSB0aGUgc2Vjb25kIGRpc3BsYXkgb3V0cHV0IHR5cGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgTk9ORSwgIgotCSJMQ0QsIFRWLCBWR0EsIFNWSURFTyBvciBDT01QT1NJVEUuIik7CisJIkZvcmNlIHRoZSBzZWNvbmQgZGlzcGxheSBvdXRwdXQgdHlwZS4gUG9zc2libGUgdmFsdWVzIGFyZSBOT05FLCBMQ0QsIFRWLCBWR0EsIFNWSURFTyBvciBDT01QT1NJVEUuIik7CiAKIG1vZHVsZV9wYXJhbSh2ZXNhLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2ZXNhLAotCSJTZWxlY3RzIHRoZSBkZXNpcmVkIGRlZmF1bHQgZGlzcGxheSBtb2RlIGJ5IFZFU0EgbW9kZSBudW1iZXIgIgotCSIoZWcuIDB4MTE3KS4iKTsKKwkiU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBieSBWRVNBIG1vZGUgbnVtYmVyIChlZy4gMHgxMTcpLiIpOwogCiBtb2R1bGVfcGFyYW0oZmlsdGVyLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmaWx0ZXIsCi0JIlNlbGVjdHMgVFYgZmxpY2tlciBmaWx0ZXIgdHlwZSAob25seSBmb3Igc3lzdGVtcyB3aXRoIGEgU2lTMzAxIHZpZGVvIGJyaWRnZSkuICIKLQkiUG9zc2libGUgdmFsdWVzIDAtNy4gRGVmYXVsdDogW25vIGZpbHRlcl0pLiIpOworCSJTZWxlY3RzIFRWIGZsaWNrZXIgZmlsdGVyIHR5cGUgKG9ubHkgZm9yIHN5c3RlbXMgd2l0aCBhIFNpUzMwMSB2aWRlbyBicmlkZ2UpLiBQb3NzaWJsZSB2YWx1ZXMgMC03LiBEZWZhdWx0OiBbbm8gZmlsdGVyXSkuIik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHhnaWZiX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL0tjb25maWcKaW5kZXggNzVjMzhjOC4uYjUzYmRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL0tjb25maWcKQEAgLTUsNiArNSw3IEBACiBjb25maWcgWElMTFlCVVMKIAl0cmlzdGF0ZSAiWGlsbHlidXMgZ2VuZXJpYyBGUEdBIGludGVyZmFjZSIKIAlkZXBlbmRzIG9uIFBDSSB8fCAoT0ZfQUREUkVTUyAmJiBPRl9JUlEpCisJc2VsZWN0IENSQzMyCiAJaGVscAogCSAgWGlsbHlidXMgaXMgYSBnZW5lcmljIGludGVyZmFjZSBmb3IgcGVyaXBoZXJhbHMgZGVzaWduZWQgb24KIAkgIHByb2dyYW1tYWJsZSBsb2dpYyAoRlBHQSkuIFRoZSBkcml2ZXIgcHJvYmVzIHRoZSBoYXJkd2FyZSBmb3IKQEAgLTE2LDcgKzE3LDcgQEAKIAogY29uZmlnIFhJTExZQlVTX1BDSUUKIAl0cmlzdGF0ZSAiWGlsbHlidXMgb3ZlciBQQ0llIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0lfTVNJCiAJaGVscAogCSAgU2V0IHRvIE0gaWYgeW91IHdhbnQgWGlsbHlidXMgdG8gdXNlIFBDSSBFeHByZXNzIGZvciBjb21tdW5pY2F0aW5nCiAJICB3aXRoIHRoZSBGUEdBLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMKaW5kZXggMmViYWYxNi4uYjBhNjY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGlsbHlidXMveGlsbHlidXNfY29yZS5jCkBAIC0yMzE4LDggKzIzMTgsMTIgQEAKIAl9CiAKIAl4aWxseWJ1c193cSA9IGFsbG9jX3dvcmtxdWV1ZSh4aWxseW5hbWUsIDAsIDApOworCWlmICgheGlsbHlidXNfd3EpIHsKKwkJY2xhc3NfZGVzdHJveSh4aWxseWJ1c19jbGFzcyk7CisJCXJjID0gLUVOT01FTTsKKwl9CiAKLQlyZXR1cm4gMDsgLyogU3VjY2VzcyAqLworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHhpbGx5YnVzX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKaW5kZXggNTBiNDY4OC4uOTRmOWUzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CkBAIC03MCw2ICs3MSw5IEBACiAvKiBQaWNrcyB1cCBsYXRlIGtpY2tzIGFmdGVyIGxpc3Qgd2FsayBidXQgYmVmb3JlIHNjaGVkdWxlKCkgKi8KIHN0YXRpYyBpbnQgaHZjX2tpY2tlZDsKIAorLyogaHZjX2luaXQgaXMgdHJpZ2dlcmVkIGZyb20gaHZjX2FsbG9jLCBpLmUuIG9ubHkgd2hlbiBhY3R1YWxseSB1c2VkICovCitzdGF0aWMgYXRvbWljX3QgaHZjX25lZWRzX2luaXQgX19yZWFkX21vc3RseSA9IEFUT01JQ19JTklUKC0xKTsKKwogc3RhdGljIGludCBodmNfaW5pdCh2b2lkKTsKIAogI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQpAQCAtODUxLDcgKzg1NSw3IEBACiAJaW50IGk7CiAKIAkvKiBXZSB3YWl0IHVudGlsIGEgZHJpdmVyIGFjdHVhbGx5IGNvbWVzIGFsb25nICovCi0JaWYgKCFodmNfZHJpdmVyKSB7CisJaWYgKGF0b21pY19pbmNfbm90X3plcm8oJmh2Y19uZWVkc19pbml0KSkgewogCQlpbnQgZXJyID0gaHZjX2luaXQoKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9pcHdpcmVsZXNzL3R0eS5jIGIvZHJpdmVycy90dHkvaXB3aXJlbGVzcy90dHkuYwppbmRleCBlYmQ1YmZmLi4xN2VlM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9pcHdpcmVsZXNzL3R0eS5jCisrKyBiL2RyaXZlcnMvdHR5L2lwd2lyZWxlc3MvdHR5LmMKQEAgLTE3Niw5ICsxNzYsNiBAQAogCQkJCSI6ICVkIGNoYXJzIG5vdCBpbnNlcnRlZCB0byBmbGlwIGJ1ZmZlciFcbiIsCiAJCQkJbGVuZ3RoIC0gd29yayk7CiAKLQkvKgotCSAqIFRoaXMgbWF5IHNsZWVwIGlmIC0+bG93X2xhdGVuY3kgaXMgc2V0Ci0JICovCiAJaWYgKHdvcmspCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKCZ0dHktPnBvcnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvbl90dHkuYyBiL2RyaXZlcnMvdHR5L25fdHR5LmMKaW5kZXggZDE1NjI0Yy4uNDFmZThhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvbl90dHkuYworKysgYi9kcml2ZXJzL3R0eS9uX3R0eS5jCkBAIC0xOTAwLDEzICsxOTAwLDEwIEBACiAJc3RydWN0IG5fdHR5X2RhdGEgKmxkYXRhID0gdHR5LT5kaXNjX2RhdGE7CiAJaW50IGFtdCA9IHBvbGwgJiYgIVRJTUVfQ0hBUih0dHkpICYmIE1JTl9DSEFSKHR0eSkgPyBNSU5fQ0hBUih0dHkpIDogMTsKIAotCWlmIChsZGF0YS0+aWNhbm9uICYmICFMX0VYVFBST0ModHR5KSkgewotCQlpZiAobGRhdGEtPmNhbm9uX2hlYWQgIT0gbGRhdGEtPnJlYWRfdGFpbCkKLQkJCXJldHVybiAxOwotCX0gZWxzZSBpZiAocmVhZF9jbnQobGRhdGEpID49IGFtdCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKKwlpZiAobGRhdGEtPmljYW5vbiAmJiAhTF9FWFRQUk9DKHR0eSkpCisJCXJldHVybiBsZGF0YS0+Y2Fub25faGVhZCAhPSBsZGF0YS0+cmVhZF90YWlsOworCWVsc2UKKwkJcmV0dXJuIHJlYWRfY250KGxkYXRhKSA+PSBhbXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYwppbmRleCA2OTkzMmI3Li44MWY5MDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYwpAQCAtMTY5NCw2ICsxNjk0LDEwIEBACiAKIHN0YXRpYyB2b2lkIHNlcmlhbF91bmxpbmtfaXJxX2NoYWluKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCiB7CisJLyoKKwkgKiB5ZXMsIHNvbWUgYnJva2VuIGdjYyBlbWl0ICJ3YXJuaW5nOiAnaScgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCIKKwkgKiBidXQgbm8sIHdlIGFyZSBub3QgZ29pbmcgdG8gdGFrZSBhIHBhdGNoIHRoYXQgYXNzaWducyBOVUxMIGJlbG93LgorCSAqLwogCXN0cnVjdCBpcnFfaW5mbyAqaTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaDsKQEAgLTI4ODIsMTQgKzI4ODYsMTAgQEAKIAogCXRvdWNoX25taV93YXRjaGRvZygpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChwb3J0LT5zeXNycSkgewotCQkvKiBzZXJpYWw4MjUwX2hhbmRsZV9pcnEoKSBhbHJlYWR5IHRvb2sgdGhlIGxvY2sgKi8KLQkJbG9ja2VkID0gMDsKLQl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKLQkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZwb3J0LT5sb2NrKTsKLQl9IGVsc2UKLQkJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+c3lzcnEgfHwgb29wc19pbl9wcm9ncmVzcykKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwllbHNlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqCUZpcnN0IHNhdmUgdGhlIElFUiB0aGVuIGRpc2FibGUgdGhlIGludGVycnVwdHMKQEAgLTI5MjEsOCArMjkyMSw3IEBACiAJCXNlcmlhbDgyNTBfbW9kZW1fc3RhdHVzKHVwKTsKIAogCWlmIChsb2NrZWQpCi0JCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc2VyaWFsODI1MF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jCmluZGV4IDBmZjNlMzYuLmIxNGJjYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYwpAQCAtMTM2NiwyMyArMTM2Niw0NCBAQAogCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAl1bnNpZ25lZCBpbnQgYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0ZXJtaW9zKTsKLQl1bnNpZ25lZCBpbnQgbSA9IDY5MTI7Ci0JdW5zaWduZWQgaW50IG4gPSAxNTYyNTsKKwl1bnNpZ25lZCBpbnQgbSwgbjsKIAl1MzIgcmVnOwogCi0JLyogRm9yIGJhdWQgcmF0ZXMgMU0sIDJNLCAzTSBhbmQgNE0gdGhlIGRpdmlkZXJzIG11c3QgYmUgYWRqdXN0ZWQuICovCi0JaWYgKGJhdWQgPT0gMTAwMDAwMCB8fCBiYXVkID09IDIwMDAwMDAgfHwgYmF1ZCA9PSA0MDAwMDAwKSB7CisJLyoKKwkgKiBGb3IgYmF1ZCByYXRlcyAwLjVNLCAxTSwgMS41TSwgMk0sIDIuNU0sIDNNLCAzLjVNIGFuZCA0TSB0aGUKKwkgKiBkaXZpZGVycyBtdXN0IGJlIGFkanVzdGVkLgorCSAqCisJICogdWFydGNsayA9IChtIC8gbikgKiAxMDAgTUh6LCB3aGVyZSBtIDw9IG4KKwkgKi8KKwlzd2l0Y2ggKGJhdWQpIHsKKwljYXNlIDUwMDAwMDoKKwljYXNlIDEwMDAwMDA6CisJY2FzZSAyMDAwMDAwOgorCWNhc2UgNDAwMDAwMDoKIAkJbSA9IDY0OwogCQluID0gMTAwOwotCiAJCXAtPnVhcnRjbGsgPSA2NDAwMDAwMDsKLQl9IGVsc2UgaWYgKGJhdWQgPT0gMzAwMDAwMCkgeworCQlicmVhazsKKwljYXNlIDM1MDAwMDA6CisJCW0gPSA1NjsKKwkJbiA9IDEwMDsKKwkJcC0+dWFydGNsayA9IDU2MDAwMDAwOworCQlicmVhazsKKwljYXNlIDE1MDAwMDA6CisJY2FzZSAzMDAwMDAwOgogCQltID0gNDg7CiAJCW4gPSAxMDA7Ci0KIAkJcC0+dWFydGNsayA9IDQ4MDAwMDAwOwotCX0gZWxzZSB7Ci0JCXAtPnVhcnRjbGsgPSA0NDIzNjgwMDsKKwkJYnJlYWs7CisJY2FzZSAyNTAwMDAwOgorCQltID0gNDA7CisJCW4gPSAxMDA7CisJCXAtPnVhcnRjbGsgPSA0MDAwMDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbSA9IDIzMDQ7CisJCW4gPSAzMTI1OworCQlwLT51YXJ0Y2xrID0gNzM3MjgwMDA7CiAJfQogCiAJLyogUmVzZXQgdGhlIGNsb2NrICovCkBAIC0zNDQ5LDYgKzM0NzAsMTAgQEAKIAkJLmJhc2VfYmF1ZAk9IDkyMTYwMCwKIAkJLnJlZ19zaGlmdCAgICAgID0gMiwKIAl9LAorCS8qCisJICogSW50ZWwgQmF5VHJhaWwgSFNVQVJUIHJlZmVyZW5jZSBjbG9jayBpcyA0NC4yMzY4IE1IeiBhdCBwb3dlci1vbiwKKwkgKiBidXQgaXMgb3ZlcnJpZGRlbiBieSBieXRfc2V0X3Rlcm1pb3MuCisJICovCiAJW3Bibl9ieXRdID0gewogCQkuZmxhZ3MJCT0gRkxfQkFTRTAsCiAJCS5udW1fcG9ydHMJPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwppbmRleCBhMzgxNWVhLi4yNTc3ZDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJICBNQVgzMTAwIGNoaXAgc3VwcG9ydAogCiBjb25maWcgU0VSSUFMX01BWDMxMFgKLQlib29sICJNQVgzMTBYIHN1cHBvcnQiCisJdHJpc3RhdGUgIk1BWDMxMFggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAlzZWxlY3QgUkVHTUFQX1NQSSBpZiBTUElfTUFTVEVSCkBAIC03MDgsNyArNzA4LDcgQEAKIAogY29uZmlnIFNFUklBTF9TSF9TQ0kKIAl0cmlzdGF0ZSAiU3VwZXJIIFNDSShGKSBzZXJpYWwgcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSEFWRV9DTEsgJiYgKFNVUEVSSCB8fCBBUk0gfHwgQ09NUElMRV9URVNUKQorCWRlcGVuZHMgb24gU1VQRVJIIHx8IEFSQ0hfU0hNT0JJTEUgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAKIGNvbmZpZyBTRVJJQUxfU0hfU0NJX05SX1VBUlRTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCBkNTg3ODNkLi5kNGVkYTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKQEAgLTIxNTQsOSArMjE1NCwxOSBAQAogCWFtYmFfcG9ydHNbaV0gPSB1YXA7CiAKIAlhbWJhX3NldF9kcnZkYXRhKGRldiwgdWFwKTsKKworCWlmICghYW1iYV9yZWcuc3RhdGUpIHsKKwkJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIEFNQkEtUEwwMTEgZHJpdmVyXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmYW1iYV9yZWcsICZ1YXAtPnBvcnQpOwogCWlmIChyZXQpIHsKIAkJYW1iYV9wb3J0c1tpXSA9IE5VTEw7CisJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKIAkJcGwwMTFfZG1hX3JlbW92ZSh1YXApOwogCX0KICBvdXQ6CkBAIC0yMTc1LDYgKzIxODUsNyBAQAogCQkJYW1iYV9wb3J0c1tpXSA9IE5VTEw7CiAKIAlwbDAxMV9kbWFfcmVtb3ZlKHVhcCk7CisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmYW1iYV9yZWcpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjMwLDIyICsyMjQxLDE0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBsMDExX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwogCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogQU1CQSBQTDAxMSBVQVJUIGRyaXZlclxuIik7CiAKLQlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmYW1iYV9yZWcpOwotCWlmIChyZXQgPT0gMCkgewotCQlyZXQgPSBhbWJhX2RyaXZlcl9yZWdpc3RlcigmcGwwMTFfZHJpdmVyKTsKLQkJaWYgKHJldCkKLQkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDExX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwbDAxMV9leGl0KHZvaWQpCiB7CiAJYW1iYV9kcml2ZXJfdW5yZWdpc3RlcigmcGwwMTFfZHJpdmVyKTsKLQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggYTQ5ZjEwZC4uYjA2MDNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTE1LDkgKzExNSw2IEBACiAjZGVmaW5lIFVBUlRfUFVUX1RDUihwb3J0LHYpCV9fcmF3X3dyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9QRENfVENSKQogI2RlZmluZSBVQVJUX0dFVF9UQ1IocG9ydCkJX19yYXdfcmVhZGwoKHBvcnQpLT5tZW1iYXNlICsgQVRNRUxfUERDX1RDUikKIAotc3RhdGljIGludCAoKmF0bWVsX29wZW5faG9vaykoc3RydWN0IHVhcnRfcG9ydCAqKTsKLXN0YXRpYyB2b2lkICgqYXRtZWxfY2xvc2VfaG9vaykoc3RydWN0IHVhcnRfcG9ydCAqKTsKLQogc3RydWN0IGF0bWVsX2RtYV9idWZmZXIgewogCXVuc2lnbmVkIGNoYXIJKmJ1ZjsKIAlkbWFfYWRkcl90CWRtYV9hZGRyOwpAQCAtMTU1NSw3ICsxNTUyLDcgQEAKIAlyZXR2YWwgPSByZXF1ZXN0X2lycShwb3J0LT5pcnEsIGF0bWVsX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQl0dHkgPyB0dHktPm5hbWUgOiAiYXRtZWxfc2VyaWFsIiwgcG9ydCk7CiAJaWYgKHJldHZhbCkgewotCQlwcmludGsoImF0bWVsX3NlcmlhbDogYXRtZWxfc3RhcnR1cCAtIENhbid0IGdldCBpcnFcbiIpOworCQlkZXZfZXJyKHBvcnQtPmRldiwgImF0bWVsX3N0YXJ0dXAgLSBDYW4ndCBnZXQgaXJxXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTE1NzUsMTcgKzE1NzIsNiBAQAogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWF0bWVsX3NldF9vcHMocG9ydCk7CiAJfQotCS8qCi0JICogSWYgdGhlcmUgaXMgYSBzcGVjaWZpYyAib3BlbiIgZnVuY3Rpb24gKHRvIHJlZ2lzdGVyCi0JICogY29udHJvbCBsaW5lIGludGVycnVwdHMpCi0JICovCi0JaWYgKGF0bWVsX29wZW5faG9vaykgewotCQlyZXR2YWwgPSBhdG1lbF9vcGVuX2hvb2socG9ydCk7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JfQogCiAJLyogU2F2ZSBjdXJyZW50IENTUiBmb3IgY29tcGFyaXNvbiBpbiBhdG1lbF90YXNrbGV0X2Z1bmMoKSAqLwogCWF0bWVsX3BvcnQtPmlycV9zdGF0dXNfcHJldiA9IFVBUlRfR0VUX0NTUihwb3J0KTsKQEAgLTE2ODQsMTMgKzE2NzAsNiBAQAogCSAqIEZyZWUgdGhlIGludGVycnVwdAogCSAqLwogCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7Ci0KLQkvKgotCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgImNsb3NlIiBmdW5jdGlvbiAodG8gdW5yZWdpc3RlcgotCSAqIGNvbnRyb2wgbGluZSBpbnRlcnJ1cHRzKQotCSAqLwotCWlmIChhdG1lbF9jbG9zZV9ob29rKQotCQlhdG1lbF9jbG9zZV9ob29rKHBvcnQpOwogfQogCiAvKgpAQCAtMTczOCw3ICsxNzE3LDcgQEAKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0bWVsX3BvcnQtPmNsayk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRtZWxfc2VyaWFsOiB1bmtub3duIHBtICVkXG4iLCBzdGF0ZSk7CisJCWRldl9lcnIocG9ydC0+ZGV2LCAiYXRtZWxfc2VyaWFsOiB1bmtub3duIHBtICVkXG4iLCBzdGF0ZSk7CiAJfQogfQogCkBAIC0xODUzLDEzICsxODMyLDEwIEBACiAJbW9kZSAmPSB+QVRNRUxfVVNfVVNNT0RFOwogCiAJaWYgKGF0bWVsX3BvcnQtPnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpIHsKLQkJZGV2X2RiZyhwb3J0LT5kZXYsICJTZXR0aW5nIFVBUlQgdG8gUlM0ODVcbiIpOwogCQlpZiAoKGF0bWVsX3BvcnQtPnJzNDg1LmRlbGF5X3J0c19hZnRlcl9zZW5kKSA+IDApCiAJCQlVQVJUX1BVVF9UVEdSKHBvcnQsCiAJCQkJCWF0bWVsX3BvcnQtPnJzNDg1LmRlbGF5X3J0c19hZnRlcl9zZW5kKTsKIAkJbW9kZSB8PSBBVE1FTF9VU19VU01PREVfUlM0ODU7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZyhwb3J0LT5kZXYsICJTZXR0aW5nIFVBUlQgdG8gUlMyMzJcbiIpOwogCX0KIAogCS8qIHNldCB0aGUgcGFyaXR5LCBzdG9wIGJpdHMgYW5kIGRhdGEgc2l6ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCmluZGV4IDc4ZTgyYjAuLmE0NzQyMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9iY202M3h4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjZGVmaW5lIEJDTTYzWFhfTlJfVUFSVFMJMgogCkBAIC01ODgsNyArNTkwLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAotCXNpemUgPSBSU0VUX1VBUlRfU0laRTsKKwlzaXplID0gVUFSVF9SRUdfU0laRTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBzaXplLCAiYmNtNjN4eCIpKSB7CiAJCWRldl9lcnIocG9ydC0+ZGV2LCAiTWVtb3J5IHJlZ2lvbiBidXN5XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTYwOCw3ICs2MTAsNyBAQAogICovCiBzdGF0aWMgdm9pZCBiY21fdWFydF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgUlNFVF9VQVJUX1NJWkUpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBVQVJUX1JFR19TSVpFKTsKIAlpb3VubWFwKHBvcnQtPm1lbWJhc2UpOwogfQogCkBAIC04MDUsNiArODA3LDkgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKIAorCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJcGRldi0+aWQgPSBvZl9hbGlhc19nZXRfaWQocGRldi0+ZGV2Lm9mX25vZGUsICJ1YXJ0Iik7CisKIAlpZiAocGRldi0+aWQgPCAwIHx8IHBkZXYtPmlkID49IEJDTTYzWFhfTlJfVUFSVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC04NTYsNiArODYxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbTYzeHhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNjM0NS11YXJ0IiB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbTYzeHhfb2ZfbWF0Y2gpOworCiAvKgogICogcGxhdGZvcm0gZHJpdmVyIHN0dWZmCiAgKi8KQEAgLTg2NSw2ICs4NzYsNyBAQAogCS5kcml2ZXIJPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSAgPSAiYmNtNjN4eF91YXJ0IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYmNtNjN4eF9vZl9tYXRjaCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvY2xwczcxMXguYwppbmRleCBiMGVhY2I4Li41ZTZmZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvY2xwczcxMXguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvY2xwczcxMXguYwpAQCAtMzY4LDExICszNjgsMTYgQEAKIHN0YXRpYyB2b2lkIHVhcnRfY2xwczcxMXhfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKIHsKIAlzdHJ1Y3QgY2xwczcxMXhfcG9ydCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShwb3J0LT5kZXYpOwotCXUzMiBzeXNmbGcgPSAwOwogCi0JZG8geworCS8qIFdhaXQgZm9yIEZJRk8gaXMgbm90IGZ1bGwgKi8KKwl3aGlsZSAoMSkgeworCQl1MzIgc3lzZmxnID0gMDsKKwogCQlyZWdtYXBfcmVhZChzLT5zeXNjb24sIFNZU0ZMR19PRkZTRVQsICZzeXNmbGcpOwotCX0gd2hpbGUgKHN5c2ZsZyAmIFNZU0ZMR19VVFhGRik7CisJCWlmICghKHN5c2ZsZyAmIFNZU0ZMR19VVFhGRikpCisJCQlicmVhazsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQogCiAJd3JpdGV3KGNoLCBwb3J0LT5tZW1iYXNlICsgVUFSVERSX09GRlNFVCk7CiB9CkBAIC0zODIsMTQgKzM4NywxOCBAQAogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBjbHBzNzExeF91YXJ0LnN0YXRlW2NvLT5pbmRleF0udWFydF9wb3J0OwogCXN0cnVjdCBjbHBzNzExeF9wb3J0ICpzID0gZGV2X2dldF9kcnZkYXRhKHBvcnQtPmRldik7Ci0JdTMyIHN5c2ZsZyA9IDA7CiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUocG9ydCwgYywgbiwgdWFydF9jbHBzNzExeF9jb25zb2xlX3B1dGNoYXIpOwogCiAJLyogV2FpdCBmb3IgdHJhbnNtaXR0ZXIgdG8gYmVjb21lIGVtcHR5ICovCi0JZG8geworCXdoaWxlICgxKSB7CisJCXUzMiBzeXNmbGcgPSAwOworCiAJCXJlZ21hcF9yZWFkKHMtPnN5c2NvbiwgU1lTRkxHX09GRlNFVCwgJnN5c2ZsZyk7Ci0JfSB3aGlsZSAoc3lzZmxnICYgU1lTRkxHX1VCVVNZKTsKKwkJaWYgKCEoc3lzZmxnICYgU1lTRkxHX1VCVVNZKSkKKwkJCWJyZWFrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdWFydF9jbHBzNzExeF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9jcmlzdjEwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvY3Jpc3YxMC5jCmluZGV4IDY5MGJkZWEuLmQ1NjdhYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9jcmlzdjEwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2NyaXN2MTAuYwpAQCAtMjg2LDcgKzI4Niw2IEBACiAjZW5kaWYKIAogfSwgIC8qIHR0eVMwICovCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJeyAuYmF1ZCAgICAgICAgPSBERUZfQkFVRCwKIAkgIC5pb3BvcnQgICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKilSX1NFUklBTDFfQ1RSTCwKIAkgIC5pcnEgICAgICAgICA9IDFVIDw8IDE2LCAvKiB1c2VzIERNQSA4IGFuZCA5ICovCkBAIC00NDcsNyArNDQ2LDYgQEAKIAkgIC5kbWFfaW5fZW5hYmxlZCA9IDAKICNlbmRpZgogIH0gICAvKiB0dHlTMyAqLwotI2VuZGlmCiB9OwogCiAKQEAgLTEwMzUsNyArMTAzMyw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDBfZHRyKHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbywgaW50IHNldCkKIHsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAl1bnNpZ25lZCBjaGFyIG1hc2sgPSBlMTAwX21vZGVtX3BpbnNbaW5mby0+bGluZV0uZHRyX21hc2s7CiAKICNpZmRlZiBTRVJJQUxfREVCVUdfSU8KQEAgLTEwNjAsNyArMTA1Nyw2IEBACiAJICAgICAgIGluZm8tPmxpbmUsICplMTAwX21vZGVtX3BpbnNbaW5mby0+bGluZV0uZHRyX3NoYWRvdywKIAkgICAgICAgRTEwMF9EVFJfR0VUKGluZm8pKTsKICNlbmRpZgotI2VuZGlmCiB9CiAKIC8qIHNldCA9IDAgbWVhbnMgMy4zViBvbiB0aGUgcGluLCBiaXR2YWx1ZTogMD1hY3RpdmUsIDE9aW5hY3RpdmUKQEAgLTEwNjksNyArMTA2NSw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDBfcnRzKHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbywgaW50IHNldCkKIHsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpbmZvLT5yeF9jdHJsICY9IH5FMTAwX1JUU19NQVNLOwpAQCAtMTA3OSw3ICsxMDc0LDYgQEAKICNpZmRlZiBTRVJJQUxfREVCVUdfSU8KIAlwcmludGsoInNlciVpIHJ0cyAlaVxuIiwgaW5mby0+bGluZSwgc2V0KTsKICNlbmRpZgotI2VuZGlmCiB9CiAKIApAQCAtMTA4Nyw3ICsxMDgxLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZTEwMF9yaV9vdXQoc3RydWN0IGUxMDBfc2VyaWFsICppbmZvLCBpbnQgc2V0KQogewotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIFJJIGlzIGFjdGl2ZSBsb3cgKi8KIAl7CiAJCXVuc2lnbmVkIGNoYXIgbWFzayA9IGUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5yaV9tYXNrOwpAQCAtMTA5OSwxMiArMTA5MiwxMCBAQAogCQkqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLnJpX3BvcnQgPSAqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLnJpX3NoYWRvdzsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KLSNlbmRpZgogfQogc3RhdGljIGlubGluZSB2b2lkCiBlMTAwX2NkX291dChzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8sIGludCBzZXQpCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogQ0QgaXMgYWN0aXZlIGxvdyAqLwogCXsKIAkJdW5zaWduZWQgY2hhciBtYXNrID0gZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmNkX21hc2s7CkBAIC0xMTE2LDI3ICsxMTA3LDIyIEBACiAJCSplMTAwX21vZGVtX3BpbnNbaW5mby0+bGluZV0uY2RfcG9ydCA9ICplMTAwX21vZGVtX3BpbnNbaW5mby0+bGluZV0uY2Rfc2hhZG93OwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZTEwMF9kaXNhYmxlX3J4KHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbykKIHsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkvKiBkaXNhYmxlIHRoZSByZWNlaXZlciAqLwogCWluZm8tPmlvcG9ydFtSRUdfUkVDX0NUUkxdID0KIAkJKGluZm8tPnJ4X2N0cmwgJj0gfklPX01BU0soUl9TRVJJQUwwX1JFQ19DVFJMLCByZWNfZW5hYmxlKSk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBlMTAwX2VuYWJsZV9yeChzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8pCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogZW5hYmxlIHRoZSByZWNlaXZlciAqLwogCWluZm8tPmlvcG9ydFtSRUdfUkVDX0NUUkxdID0KIAkJKGluZm8tPnJ4X2N0cmwgfD0gSU9fTUFTSyhSX1NFUklBTDBfUkVDX0NUUkwsIHJlY19lbmFibGUpKTsKLSNlbmRpZgogfQogCiAvKiB0aGUgcnggRE1BIHVzZXMgYm90aCB0aGUgZG1hX2Rlc2NyIGFuZCB0aGUgZG1hX2VvcCBpbnRlcnJ1cHRzICovCkBAIC0xNTU0LDI0ICsxNTQwLDYgQEAKIAl1bnNpZ25lZCBpbnQgYywgc2VudGw7CiAJc3RydWN0IGV0cmF4X2RtYV9kZXNjciAqZGVzY3I7CiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIFRoaXMgd2lsbCBvdXRwdXQgdG9vIGxpdHRsZSBpZiB0YWlsIGlzIG5vdCAwIGFsd2F5cyBzaW5jZQotCSAqIHdlIGRvbid0IHJlbG9vcCB0byBzZW5kIHRoZSBvdGhlciBwYXJ0LiBBbnl3YXkgdGhpcyBTSE9VTEQgYmUgYQotCSAqIG5vLW9wIC0gdHJhbnNtaXRfY2hhcnNfZG1hIHdvdWxkIG5ldmVyIHJlYWxseSBiZSBjYWxsZWQgZHVyaW5nIHNpbQotCSAqIHNpbmNlIHJzX3dyaXRlIGRvZXMgbm90IHdyaXRlIGludG8gdGhlIHhtaXQgYnVmZmVyIHRoZW4uCi0JICovCi0JaWYgKGluZm8tPnhtaXQudGFpbCkKLQkJcHJpbnRrKCJFcnJvciBpbiBzZXJpYWwuYzp0cmFuc21pdF9jaGFycy1kbWEoKSwgdGFpbCE9MFxuIik7Ci0JaWYgKGluZm8tPnhtaXQuaGVhZCAhPSBpbmZvLT54bWl0LnRhaWwpIHsKLQkJU0lNQ09VVChpbmZvLT54bWl0LmJ1ZiArIGluZm8tPnhtaXQudGFpbCwKLQkJCUNJUkNfQ05UKGluZm8tPnhtaXQuaGVhZCwKLQkJCQkgaW5mby0+eG1pdC50YWlsLAotCQkJCSBTRVJJQUxfWE1JVF9TSVpFKSk7Ci0JCWluZm8tPnhtaXQuaGVhZCA9IGluZm8tPnhtaXQudGFpbDsgIC8qIG1vdmUgYmFjayBoZWFkICovCi0JCWluZm8tPnRyX3J1bm5pbmcgPSAwOwotCX0KLQlyZXR1cm47Ci0jZW5kaWYKIAkvKiBhY2tub3dsZWRnZSBib3RoIGRtYV9kZXNjciBhbmQgZG1hX2VvcCBpcnEgaW4gUl9ETUFfQ0h4X0NMUl9JTlRSICovCiAJKmluZm8tPm9jbHJpbnRyYWRyID0KIAkJSU9fU1RBVEUoUl9ETUFfQ0g2X0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKSB8CkBAIC0xODQyLDEzICsxODEwLDYgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgcnN0YXQ7CiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIE5vIHJlY2VpdmUgaW4gdGhlIHNpbXVsYXRvci4gIFdpbGwgcHJvYmFibHkgYmUgd2hlbiB0aGUgcmVzdCBvZgotCSAqIHRoZSBzZXJpYWwgaW50ZXJmYWNlIHdvcmtzLCBhbmQgdGhpcyBwaWVjZSB3aWxsIGp1c3QgYmUgcmVtb3ZlZC4KLQkgKi8KLQlyZXR1cm47Ci0jZW5kaWYKLQogCS8qIEFja25vd2xlZGdlIGJvdGggZG1hX2Rlc2NyIGFuZCBkbWFfZW9wIGlycSBpbiBSX0RNQV9DSHhfQ0xSX0lOVFIgKi8KIAkqaW5mby0+aWNscmludHJhZHIgPQogCQlJT19TVEFURShSX0RNQV9DSDZfQ0xSX0lOVFIsIGNscl9kZXNjciwgZG8pIHwKQEAgLTE5MzQsMTIgKzE4OTUsNiBAQAogc3RhdGljIHZvaWQKIHN0YXJ0X3JlY2VpdmUoc3RydWN0IGUxMDBfc2VyaWFsICppbmZvKQogewotI2lmZGVmIENPTkZJR19TVklOVE9fU0lNCi0JLyogTm8gcmVjZWl2ZSBpbiB0aGUgc2ltdWxhdG9yLiAgV2lsbCBwcm9iYWJseSBiZSB3aGVuIHRoZSByZXN0IG9mCi0JICogdGhlIHNlcmlhbCBpbnRlcmZhY2Ugd29ya3MsIGFuZCB0aGlzIHBpZWNlIHdpbGwganVzdCBiZSByZW1vdmVkLgotCSAqLwotCXJldHVybjsKLSNlbmRpZgogCWlmIChpbmZvLT51c2VzX2RtYV9pbikgewogCQkvKiByZXNldCB0aGUgaW5wdXQgZG1hIGNoYW5uZWwgdG8gYmUgc3VyZSBpdCB3b3JrcyAqLwogCkBAIC0xOTcyLDE3ICsxOTI3LDYgQEAKIAlpbnQgaTsKIAlpbnQgaGFuZGxlZCA9IDA7CiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIE5vIHJlY2VpdmUgaW4gdGhlIHNpbXVsYXRvci4gIFdpbGwgcHJvYmFibHkgYmUgd2hlbiB0aGUgcmVzdCBvZgotCSAqIHRoZSBzZXJpYWwgaW50ZXJmYWNlIHdvcmtzLCBhbmQgdGhpcyBwaWVjZSB3aWxsIGp1c3QgYmUgcmVtb3ZlZC4KLQkgKi8KLQl7Ci0JCWNvbnN0IGNoYXIgKnMgPSAiV2hhdD8gdHJfaW50ZXJydXB0IGluIHNpbXVsYXRvcj8/XG4iOwotCQlTSU1DT1VUKHMsc3RybGVuKHMpKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotI2VuZGlmCi0KIAkvKiBmaW5kIG91dCB0aGUgbGluZSB0aGF0IGNhdXNlZCB0aGlzIGlycSBhbmQgZ2V0IGl0IGZyb20gcnNfdGFibGUgKi8KIAogCWlyZWcgPSAqUl9JUlFfTUFTSzJfUkQ7ICAvKiBnZXQgdGhlIGFjdGl2ZSBpcnEgYml0cyBmb3IgdGhlIGRtYSBjaGFubmVscyAqLwpAQCAtMjAyMSwxNyArMTk2NSw2IEBACiAJaW50IGk7CiAJaW50IGhhbmRsZWQgPSAwOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBObyByZWNlaXZlIGluIHRoZSBzaW11bGF0b3IuICBXaWxsIHByb2JhYmx5IGJlIHdoZW4gdGhlIHJlc3Qgb2YKLQkgKiB0aGUgc2VyaWFsIGludGVyZmFjZSB3b3JrcywgYW5kIHRoaXMgcGllY2Ugd2lsbCBqdXN0IGJlIHJlbW92ZWQuCi0JICovCi0JewotCQljb25zdCBjaGFyICpzID0gIldoYXQ/IHJlY19pbnRlcnJ1cHQgaW4gc2ltdWxhdG9yPz9cbiI7Ci0JCVNJTUNPVVQocyxzdHJsZW4ocykpOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0jZW5kaWYKLQogCS8qIGZpbmQgb3V0IHRoZSBsaW5lIHRoYXQgY2F1c2VkIHRoaXMgaXJxIGFuZCBnZXQgaXQgZnJvbSByc190YWJsZSAqLwogCiAJaXJlZyA9ICpSX0lSUV9NQVNLMl9SRDsgIC8qIGdldCB0aGUgYWN0aXZlIGlycSBiaXRzIGZvciB0aGUgZG1hIGNoYW5uZWxzICovCkBAIC0yMTczLDEwICsyMTA2LDYgQEAKIAlzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm87CiAJaW50IGk7CiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCXJldHVybjsKLSNlbmRpZgotCiAJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKIAkJaW5mbyA9IHJzX3RhYmxlICsgaTsKIAkJaWYgKGluZm8tPnVzZXNfZG1hX2luKQpAQCAtMjcyOSwyNSArMjY1OCw2IEBACiAJcHJpbnRrKCJzdGFydGluZyB1cCB0dHlTJWQgKHhtaXRfYnVmIDB4JXApLi4uXG4iLCBpbmZvLT5saW5lLCBpbmZvLT54bWl0LmJ1Zik7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TVklOVE9fU0lNCi0JLyogQml0cyBhbmQgcGllY2VzIGNvbGxlY3RlZCBmcm9tIGJlbG93LiAgQmV0dGVyIHRvIGhhdmUgdGhlbQotCSAgIGluIG9uZSBpZmRlZjplZCBjbGF1c2UgdGhhbiB0byBtaXggaW4gYSBsb3Qgb2YgaWZkZWZzLAotCSAgIHJpZ2h0PyAqLwotCWlmIChpbmZvLT5wb3J0LnR0eSkKLQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnBvcnQudHR5LT5mbGFncyk7Ci0KLQlpbmZvLT54bWl0LmhlYWQgPSBpbmZvLT54bWl0LnRhaWwgPSAwOwotCWluZm8tPmZpcnN0X3JlY3ZfYnVmZmVyID0gaW5mby0+bGFzdF9yZWN2X2J1ZmZlciA9IE5VTEw7Ci0JaW5mby0+cmVjdl9jbnQgPSBpbmZvLT5tYXhfcmVjdl9jbnQgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IFNFUklBTF9SRUNWX0RFU0NSSVBUT1JTOyBpKyspCi0JCWluZm8tPnJlY19kZXNjcltpXS5idWYgPSBOVUxMOwotCi0JLyogTm8gcmVhbCBhY3Rpb24gaW4gdGhlIHNpbXVsYXRvciwgYnV0IG1heSBzZXQgaW5mbyBpbXBvcnRhbnQKLQkgICB0byBpb2N0bC4gKi8KLQljaGFuZ2Vfc3BlZWQoaW5mbyk7Ci0jZWxzZQotCiAJLyoKIAkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KIAkgKiAodGhleSB3aWxsIGJlIHJlZW5hYmxlZCBpbiBjaGFuZ2Vfc3BlZWQoKSkKQEAgLTI4MzcsOCArMjc0Nyw2IEBACiAJZTEwMF9ydHMoaW5mbywgMSk7CiAJZTEwMF9kdHIoaW5mbywgMSk7CiAKLSNlbmRpZiAvKiBDT05GSUdfU1ZJTlRPX1NJTSAqLwotCiAJaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTI4NTcsNyArMjc2NSw2IEBACiAJc3RydWN0IGV0cmF4X3JlY3ZfYnVmZmVyICpidWZmZXI7CiAJaW50IGk7CiAKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkvKiBzaHV0IGRvd24gdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciAqLwogCURGTE9XKERFQlVHX0xPRyhpbmZvLT5saW5lLCAic2h1dGRvd24gJWlcbiIsIGluZm8tPmxpbmUpKTsKIAllMTAwX2Rpc2FibGVfcngoaW5mbyk7CkBAIC0yODgyLDggKzI3ODksNiBAQAogCQlpbmZvLT50cl9ydW5uaW5nID0gMDsKIAl9CiAKLSNlbmRpZiAvKiBDT05GSUdfU1ZJTlRPX1NJTSAqLwotCiAJaWYgKCEoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKIAkJcmV0dXJuOwogCkBAIC0yOTk1LDE3ICsyOTAwLDEyIEBACiAJCQlJT19TVEFURShSX0FMVF9TRVJfQkFVRFJBVEUsIHNlcjBfdHIsIG5vcm1hbCk7CiAJCXJfYWx0X3Nlcl9iYXVkcmF0ZV9zaGFkb3cgJj0gfm1hc2s7CiAJCXJfYWx0X3Nlcl9iYXVkcmF0ZV9zaGFkb3cgfD0gKGFsdF9zb3VyY2UgPDwgKGluZm8tPmxpbmUqOCkpOwotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCQkqUl9BTFRfU0VSX0JBVURSQVRFID0gcl9hbHRfc2VyX2JhdWRyYXRlX3NoYWRvdzsKLSNlbmRpZiAvKiBDT05GSUdfU1ZJTlRPX1NJTSAqLwogCiAJCWluZm8tPmJhdWQgPSBjZmxhZ190b19iYXVkKGNmbGFnKTsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkJaW5mby0+aW9wb3J0W1JFR19CQVVEXSA9IGNmbGFnX3RvX2V0cmF4X2JhdWQoY2ZsYWcpOwotI2VuZGlmIC8qIENPTkZJR19TVklOVE9fU0lNICovCiAJfQogCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogc3RhcnQgd2l0aCBkZWZhdWx0IHNldHRpbmdzIGFuZCB0aGVuIGZpbGwgaW4gY2hhbmdlcyAqLwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkvKiA4IGJpdCwgbm8vZXZlbiBwYXJpdHkgKi8KQEAgLTMwNzMsNyArMjk3Myw2IEBACiAKIAkqKCh1bnNpZ25lZCBsb25nICopJmluZm8tPmlvcG9ydFtSRUdfWE9GRl0pID0geG9mZjsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0jZW5kaWYgLyogIUNPTkZJR19TVklOVE9fU0lNICovCiAKIAl1cGRhdGVfY2hhcl90aW1lKGluZm8pOwogCkBAIC0zMTIyLDExICszMDIxLDYgQEAKIAkJICAgICAgIGNvdW50LCBpbmZvLT5pb3BvcnRbUkVHX1NUQVRVU10pOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIFJlYWxseSBzaW1wbGUuICBUaGUgb3V0cHV0IGlzIGhlcmUgYW5kIG5vdy4gKi8KLQlTSU1DT1VUKGJ1ZiwgY291bnQpOwotCXJldHVybiBjb3VudDsKLSNlbmRpZgogCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwogCURGTE9XKERFQlVHX0xPRyhpbmZvLT5saW5lLCAid3JpdGUgY291bnQgJWkgIiwgY291bnQpKTsKIAlERkxPVyhERUJVR19MT0coaW5mby0+bGluZSwgImxkaXNjICVpXG4iLCB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKSk7CkBAIC0zNDYzLDcgKzMzNTcsNiBAQAogZ2V0X2xzcl9pbmZvKHN0cnVjdCBlMTAwX3NlcmlhbCAqIGluZm8sIHVuc2lnbmVkIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IFRJT0NTRVJfVEVNVDsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAl1bnNpZ25lZCBsb25nIGN1cnJfdGltZSA9IGppZmZpZXM7CiAJdW5zaWduZWQgbG9uZyBjdXJyX3RpbWVfdXNlYyA9IEdFVF9KSUZGSUVTX1VTRUMoKTsKIAl1bnNpZ25lZCBsb25nIGVsYXBzZWRfdXNlYyA9CkBAIC0zNDc0LDcgKzMzNjcsNiBAQAogCSAgICBlbGFwc2VkX3VzZWMgPCAyKmluZm8tPmNoYXJfdGltZV91c2VjKSB7CiAJCXJlc3VsdCA9IDA7CiAJfQotI2VuZGlmCiAKIAlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMzgwNCw3ICszNjk2LDYgQEAKIAllMTAwX2Rpc2FibGVfc2VyaWFsX2RhdGFfaXJxKGluZm8pOwogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAllMTAwX2Rpc2FibGVfcngoaW5mbyk7CiAJZTEwMF9kaXNhYmxlX3J4X2lycShpbmZvKTsKIApAQCAtMzgxNiw3ICszNzA3LDYgQEAKIAkJICovCiAJCXJzX3dhaXRfdW50aWxfc2VudCh0dHksIEhaKTsKIAl9Ci0jZW5kaWYKIAogCXNodXRkb3duKGluZm8pOwogCXJzX2ZsdXNoX2J1ZmZlcih0dHkpOwpAQCAtNDQ3OSw3ICs0MzY5LDYgQEAKIAlmYXN0X3RpbWVyX2luaXQoKTsKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAjaWZuZGVmIENPTkZJR19FVFJBWF9LR0RCCiAJLyogTm90IG5lZWRlZCBpbiBzaW11bGF0b3IuICBNYXkgb25seSBjb21wbGljYXRlIHN0dWZmLiAqLwogCS8qIGhvb2sgdGhlIGlycSdzIGZvciBETUEgY2hhbm5lbCA2IGFuZCA3LCBzZXJpYWwgb3V0cHV0IGFuZCBpbnB1dCwgYW5kIHNvbWUgbW9yZS4uLiAqLwpAQCAtNDQ4OSw3ICs0Mzc4LDYgQEAKIAkJcGFuaWMoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnE4IiwgX19mdW5jX18pOwogCiAjZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfU1ZJTlRPX1NJTSAqLwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvZWZtMzItdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2VmbTMyLXVhcnQuYwppbmRleCAwZWI1YjU2Li4wMjg1ODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvZWZtMzItdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lZm0zMi11YXJ0LmMKQEAgLTY3MSw3ICs2NzEsMTAgQEAKIAlpZiAoIW5wKQogCQlyZXR1cm4gMTsKIAotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibG9jYXRpb24iLCAmbG9jYXRpb24pOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZWZtMzIsbG9jYXRpb24iLCAmbG9jYXRpb24pOworCWlmIChyZXQpCisJCS8qIGZhbGwgYmFjayB0byBvbGQgYW5kICh3cm9uZ2x5KSBnZW5lcmljIHByb3BlcnR5ICJsb2NhdGlvbiIgKi8KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJsb2NhdGlvbiIsICZsb2NhdGlvbik7CiAJaWYgKCFyZXQpIHsKIAkJaWYgKGxvY2F0aW9uID4gNSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBsb2NhdGlvblxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYwppbmRleCA4OTc4ZGM5YS4uYzVlYjg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jCkBAIC0xMywxNCArMTMsMTkgQEAKICNkZWZpbmUgU1VQUE9SVF9TWVNSUQogI2VuZGlmCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kbWEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogCiAvKiBBbGwgcmVnaXN0ZXJzIGFyZSA4LWJpdCB3aWR0aCAqLwpAQCAtMTEyLDYgKzExNywxMCBAQAogI2RlZmluZSBVQVJUU0ZJRk9fVFhPRgkJMHgwMgogI2RlZmluZSBVQVJUU0ZJRk9fUlhVRgkJMHgwMQogCisjZGVmaW5lIERNQV9NQVhCVVJTVAkJMTYKKyNkZWZpbmUgRE1BX01BWEJVUlNUX01BU0sJKERNQV9NQVhCVVJTVCAtIDEpCisjZGVmaW5lIEZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRQk2NAorCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJmc2wtbHB1YXJ0IgogI2RlZmluZSBERVZfTkFNRQkidHR5TFAiCiAjZGVmaW5lIFVBUlRfTlIJCTYKQEAgLTEyMSw2ICsxMzAsMjQgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXVuc2lnbmVkIGludAkJdHhmaWZvX3NpemU7CiAJdW5zaWduZWQgaW50CQlyeGZpZm9fc2l6ZTsKKworCWJvb2wJCQlscHVhcnRfZG1hX3VzZTsKKwlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfdHhfY2hhbjsKKwlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfcnhfY2hhbjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgICpkbWFfdHhfZGVzYzsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgICpkbWFfcnhfZGVzYzsKKwlkbWFfYWRkcl90CQlkbWFfdHhfYnVmX2J1czsKKwlkbWFfYWRkcl90CQlkbWFfcnhfYnVmX2J1czsKKwlkbWFfY29va2llX3QJCWRtYV90eF9jb29raWU7CisJZG1hX2Nvb2tpZV90CQlkbWFfcnhfY29va2llOworCXVuc2lnbmVkIGNoYXIJCSpkbWFfdHhfYnVmX3ZpcnQ7CisJdW5zaWduZWQgY2hhcgkJKmRtYV9yeF9idWZfdmlydDsKKwl1bnNpZ25lZCBpbnQJCWRtYV90eF9ieXRlczsKKwl1bnNpZ25lZCBpbnQJCWRtYV9yeF9ieXRlczsKKwlpbnQJCQlkbWFfdHhfaW5fcHJvZ3Jlc3M7CisJaW50CQkJZG1hX3J4X2luX3Byb2dyZXNzOworCXVuc2lnbmVkIGludAkJZG1hX3J4X3RpbWVvdXQ7CisJc3RydWN0IHRpbWVyX2xpc3QJbHB1YXJ0X3RpbWVyOwogfTsKIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbHB1YXJ0X2R0X2lkc1tdID0gewpAQCAtMTMxLDYgKzE1OCwxMCBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGxwdWFydF9kdF9pZHMpOwogCisvKiBGb3J3YXJkIGRlY2xhcmUgdGhpcyBmb3IgdGhlIGRtYSBjYWxsYmFja3MqLworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9jb21wbGV0ZSh2b2lkICphcmcpOworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZSh2b2lkICphcmcpOworCiBzdGF0aWMgdm9pZCBscHVhcnRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIGNoYXIgdGVtcDsKQEAgLTE1Miw2ICsxODMsMjEwIEBACiB7CiB9CiAKK3N0YXRpYyB2b2lkIGxwdWFydF9jb3B5X3J4X3RvX3R0eShzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0LAorCQlzdHJ1Y3QgdHR5X3BvcnQgKnR0eSwgaW50IGNvdW50KQoreworCWludCBjb3BpZWQ7CisKKwlzcG9ydC0+cG9ydC5pY291bnQucnggKz0gY291bnQ7CisKKwlpZiAoIXR0eSkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIk5vIHR0eSBwb3J0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAorCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCWNvcGllZCA9IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LAorCQkJKCh1bnNpZ25lZCBjaGFyICopKHNwb3J0LT5kbWFfcnhfYnVmX3ZpcnQpKSwgY291bnQpOworCisJaWYgKGNvcGllZCAhPSBjb3VudCkgeworCQlXQVJOX09OKDEpOworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIlJ4RGF0YSBjb3B5IHRvIHR0eSBsYXllciBmYWlsZWRcbiIpOworCX0KKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAorCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfVE9fREVWSUNFKTsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X3Bpb190eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmCisJCXJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUVENGSUZPKSA8IHNwb3J0LT50eGZpZm9fc2l6ZSkgeworCQl3cml0ZWIoeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVERSKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LnR4Kys7CisJfQorCisJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQl1YXJ0X3dyaXRlX3dha2V1cCgmc3BvcnQtPnBvcnQpOworCisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKKwkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSB8IFVBUlRDUjVfVERNQVMsCisJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbHB1YXJ0X2RtYV90eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwlkbWFfYWRkcl90IHR4X2J1c19hZGRyOworCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3R4X2J1Zl9idXMsCisJCQkJVUFSVF9YTUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCXNwb3J0LT5kbWFfdHhfYnl0ZXMgPSBjb3VudCAmIH4oRE1BX01BWEJVUlNUX01BU0spOworCXR4X2J1c19hZGRyID0gc3BvcnQtPmRtYV90eF9idWZfYnVzICsgeG1pdC0+dGFpbDsKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoc3BvcnQtPmRtYV90eF9jaGFuLAorCQkJCQl0eF9idXNfYWRkciwgc3BvcnQtPmRtYV90eF9ieXRlcywKKwkJCQkJRE1BX01FTV9UT19ERVYsIERNQV9QUkVQX0lOVEVSUlVQVCk7CisKKwlpZiAoIXNwb3J0LT5kbWFfdHhfZGVzYykgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIk5vdCBhYmxlIHRvIGdldCBkZXNjIGZvciB0eFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNwb3J0LT5kbWFfdHhfZGVzYy0+Y2FsbGJhY2sgPSBscHVhcnRfZG1hX3R4X2NvbXBsZXRlOworCXNwb3J0LT5kbWFfdHhfZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzcG9ydDsKKwlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMTsKKwlzcG9ydC0+ZG1hX3R4X2Nvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoc3BvcnQtPmRtYV90eF9kZXNjKTsKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzcG9ydC0+ZG1hX3R4X2NoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9wcmVwYXJlX3R4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAgQ0lSQ19DTlRfVE9fRU5EKHhtaXQtPmhlYWQsCisJCQkJCXhtaXQtPnRhaWwsIFVBUlRfWE1JVF9TSVpFKTsKKworCWlmICghY291bnQpCisJCXJldHVybjsKKworCWlmIChjb3VudCA8IERNQV9NQVhCVVJTVCkKKwkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSAmIH5VQVJUQ1I1X1RETUFTLAorCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwllbHNlIHsKKwkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSB8IFVBUlRDUjVfVERNQVMsCisJCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCQlscHVhcnRfZG1hX3R4KHNwb3J0LCBjb3VudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3R4X2NvbXBsZXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gYXJnOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXN5bmNfdHhfYWNrKHNwb3J0LT5kbWFfdHhfZGVzYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgc3BvcnQtPmRtYV90eF9ieXRlcykgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMDsKKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKKworCWxwdWFydF9wcmVwYXJlX3R4KHNwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBscHVhcnRfZG1hX3J4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCit7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsCisJCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCXNwb3J0LT5kbWFfcnhfZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZShzcG9ydC0+ZG1hX3J4X2NoYW4sCisJCQlzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsIEZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwKKwkJCURNQV9ERVZfVE9fTUVNLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCisJaWYgKCFzcG9ydC0+ZG1hX3J4X2Rlc2MpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJOb3QgYWJsZSB0byBnZXQgZGVzYyBmb3IgcnhcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MtPmNhbGxiYWNrID0gbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZTsKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7CisJc3BvcnQtPmRtYV9yeF9pbl9wcm9ncmVzcyA9IDE7CisJc3BvcnQtPmRtYV9yeF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KHNwb3J0LT5kbWFfcnhfZGVzYyk7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3J4X2NvbXBsZXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gYXJnOworCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXN5bmNfdHhfYWNrKHNwb3J0LT5kbWFfcnhfZGVzYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJc3BvcnQtPmRtYV9yeF9pbl9wcm9ncmVzcyA9IDA7CisJbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHNwb3J0LCBwb3J0LCBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUpOworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOworCWxwdWFydF9kbWFfcngoc3BvcnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBscHVhcnRfdGltZXJfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKilkYXRhOworCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydDsKKwlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCWludCBjb3VudDsKKworCWRlbF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lcik7CisJZG1hZW5naW5lX3BhdXNlKHNwb3J0LT5kbWFfcnhfY2hhbik7CisJZG1hZW5naW5lX3R4X3N0YXR1cyhzcG9ydC0+ZG1hX3J4X2NoYW4sIHNwb3J0LT5kbWFfcnhfY29va2llLCAmc3RhdGUpOworCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfcnhfY2hhbik7CisJY291bnQgPSBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUgLSBzdGF0ZS5yZXNpZHVlOworCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOworCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCwgcG9ydCwgY291bnQpOworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOworCXRlbXAgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJd3JpdGViKHRlbXAgJiB+VUFSVENSNV9SRE1BUywgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbHB1YXJ0X3ByZXBhcmVfcngoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlpbml0X3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKKwlzcG9ydC0+bHB1YXJ0X3RpbWVyLmZ1bmN0aW9uID0gbHB1YXJ0X3RpbWVyX2Z1bmM7CisJc3BvcnQtPmxwdWFydF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc3BvcnQ7CisJc3BvcnQtPmxwdWFydF90aW1lci5leHBpcmVzID0gamlmZmllcyArIHNwb3J0LT5kbWFfcnhfdGltZW91dDsKKwlhZGRfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIpOworCisJbHB1YXJ0X2RtYV9yeChzcG9ydCk7CisJdGVtcCA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwl3cml0ZWIodGVtcCB8IFVBUlRDUjVfUkRNQVMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGxwdWFydF90cmFuc21pdF9idWZmZXIoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKIHsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CkBAIC0xNzIsMTQgKzQwNywyMSBAQAogCiBzdGF0aWMgdm9pZCBscHVhcnRfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CiAJdW5zaWduZWQgY2hhciB0ZW1wOwogCiAJdGVtcCA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1IyKTsKIAl3cml0ZWIodGVtcCB8IFVBUlRDUjJfVElFLCBwb3J0LT5tZW1iYXNlICsgVUFSVENSMik7CiAKLQlpZiAocmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9URFJFKQotCQlscHVhcnRfdHJhbnNtaXRfYnVmZmVyKHNwb3J0KTsKKwlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdXNlKSB7CisJCWlmICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmICFzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzKQorCQkJbHB1YXJ0X3ByZXBhcmVfdHgoc3BvcnQpOworCX0gZWxzZSB7CisJCWlmIChyZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVFNSMSkgJiBVQVJUU1IxX1REUkUpCisJCQlscHVhcnRfdHJhbnNtaXRfYnVmZmVyKHNwb3J0KTsKKwl9CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBscHVhcnRfdHhpbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtMjc5LDEyICs1MjEsMTkgQEAKIAogCXN0cyA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKTsKIAotCWlmIChzdHMgJiBVQVJUU1IxX1JEUkYpCi0JCWxwdWFydF9yeGludChpcnEsIGRldl9pZCk7Ci0KKwlpZiAoc3RzICYgVUFSVFNSMV9SRFJGKSB7CisJCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV91c2UpCisJCQlscHVhcnRfcHJlcGFyZV9yeChzcG9ydCk7CisJCWVsc2UKKwkJCWxwdWFydF9yeGludChpcnEsIGRldl9pZCk7CisJfQogCWlmIChzdHMgJiBVQVJUU1IxX1REUkUgJiYKLQkJIShyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgJiBVQVJUQ1I1X1RETUFTKSkKLQkJbHB1YXJ0X3R4aW50KGlycSwgZGV2X2lkKTsKKwkJIShyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgJiBVQVJUQ1I1X1RETUFTKSkgeworCQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdXNlKQorCQkJbHB1YXJ0X3Bpb190eChzcG9ydCk7CisJCWVsc2UKKwkJCWxwdWFydF90eGludChpcnEsIGRldl9pZCk7CisJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMzY2LDEzICs2MTUsMTU2IEBACiAJd3JpdGViKFVBUlRDRklGT19UWEZMVVNIIHwgVUFSVENGSUZPX1JYRkxVU0gsCiAJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENGSUZPKTsKIAotCXdyaXRlYigyLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRXRklGTyk7CisJd3JpdGViKDAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUVFdGSUZPKTsKIAl3cml0ZWIoMSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRSV0ZJRk8pOwogCiAJLyogUmVzdG9yZSBjcjIgKi8KIAl3cml0ZWIoY3IyX3NhdmVkLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMik7CiB9CiAKK3N0YXRpYyBpbnQgbHB1YXJ0X2RtYV90eF9yZXF1ZXN0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBkbWFfY2hhbiAqdHhfY2hhbjsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfdHhfc2NvbmZpZzsKKwlkbWFfYWRkcl90IGRtYV9idXM7CisJdW5zaWduZWQgY2hhciAqZG1hX2J1ZjsKKwlpbnQgcmV0OworCisJdHhfY2hhbiAgPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHNwb3J0LT5wb3J0LmRldiwgInR4Iik7CisKKwlpZiAoIXR4X2NoYW4pIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJEbWEgdHggY2hhbm5lbCByZXF1ZXN0IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkbWFfYnVzID0gZG1hX21hcF9zaW5nbGUodHhfY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkJc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQuYnVmLAorCQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKKworCWlmIChkbWFfbWFwcGluZ19lcnJvcih0eF9jaGFuLT5kZXZpY2UtPmRldiwgZG1hX2J1cykpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJkbWFfbWFwX3NpbmdsZSB0eCBmYWlsZWRcbiIpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHR4X2NoYW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbWFfYnVmID0gc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQuYnVmOworCWRtYV90eF9zY29uZmlnLmRzdF9hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKKwlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJZG1hX3R4X3Njb25maWcuZHN0X21heGJ1cnN0ID0gRE1BX01BWEJVUlNUOworCWRtYV90eF9zY29uZmlnLmRpcmVjdGlvbiA9IERNQV9NRU1fVE9fREVWOworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcodHhfY2hhbiwgJmRtYV90eF9zY29uZmlnKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LAorCQkJCSJEbWEgc2xhdmUgY29uZmlnIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwodHhfY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJc3BvcnQtPmRtYV90eF9jaGFuID0gdHhfY2hhbjsKKwlzcG9ydC0+ZG1hX3R4X2J1Zl92aXJ0ID0gZG1hX2J1ZjsKKwlzcG9ydC0+ZG1hX3R4X2J1Zl9idXMgPSBkbWFfYnVzOworCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHB1YXJ0X2RtYV9yeF9yZXF1ZXN0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBkbWFfY2hhbiAqcnhfY2hhbjsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfcnhfc2NvbmZpZzsKKwlkbWFfYWRkcl90IGRtYV9idXM7CisJdW5zaWduZWQgY2hhciAqZG1hX2J1ZjsKKwlpbnQgcmV0OworCisJcnhfY2hhbiAgPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHNwb3J0LT5wb3J0LmRldiwgInJ4Iik7CisKKwlpZiAoIXJ4X2NoYW4pIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJEbWEgcnggY2hhbm5lbCByZXF1ZXN0IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkbWFfYnVmID0gZGV2bV9remFsbG9jKHNwb3J0LT5wb3J0LmRldiwKKwkJCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCisJaWYgKCFkbWFfYnVmKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRG1hIHJ4IGFsbG9jIGZhaWxlZFxuIik7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocnhfY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRtYV9idXMgPSBkbWFfbWFwX3NpbmdsZShyeF9jaGFuLT5kZXZpY2UtPmRldiwgZG1hX2J1ZiwKKwkJCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IocnhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idXMpKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiZG1hX21hcF9zaW5nbGUgcnggZmFpbGVkXG4iKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChyeF9jaGFuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG1hX3J4X3Njb25maWcuc3JjX2FkZHIgPSBzcG9ydC0+cG9ydC5tYXBiYXNlICsgVUFSVERSOworCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKwlkbWFfcnhfc2NvbmZpZy5zcmNfbWF4YnVyc3QgPSAxOworCWRtYV9yeF9zY29uZmlnLmRpcmVjdGlvbiA9IERNQV9ERVZfVE9fTUVNOworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcocnhfY2hhbiwgJmRtYV9yeF9zY29uZmlnKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LAorCQkJCSJEbWEgc2xhdmUgY29uZmlnIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocnhfY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJc3BvcnQtPmRtYV9yeF9jaGFuID0gcnhfY2hhbjsKKwlzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0ID0gZG1hX2J1ZjsKKwlzcG9ydC0+ZG1hX3J4X2J1Zl9idXMgPSBkbWFfYnVzOworCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOworCisJc3BvcnQtPmRtYV9yeF90aW1lb3V0ID0gKHNwb3J0LT5wb3J0LnRpbWVvdXQgLSBIWiAvIDUwKSAqCisJCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFICogMyAvCisJCQkJc3BvcnQtPnJ4Zmlmb19zaXplIC8gMjsKKworCWlmIChzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgPCBtc2Vjc190b19qaWZmaWVzKDIwKSkKKwkJc3BvcnQtPmRtYV9yeF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9mcmVlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47CisKKwlkbWFfdW5tYXBfc2luZ2xlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV90eF9idWZfYnVzLAorCQkJVUFSVF9YTUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCWRtYV9jaGFuID0gc3BvcnQtPmRtYV90eF9jaGFuOworCXNwb3J0LT5kbWFfdHhfY2hhbiA9IE5VTEw7CisJc3BvcnQtPmRtYV90eF9idWZfYnVzID0gMDsKKwlzcG9ydC0+ZG1hX3R4X2J1Zl92aXJ0ID0gTlVMTDsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYV9jaGFuKTsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9mcmVlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47CisKKwlkbWFfdW5tYXBfc2luZ2xlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAorCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJZG1hX2NoYW4gPSBzcG9ydC0+ZG1hX3J4X2NoYW47CisJc3BvcnQtPmRtYV9yeF9jaGFuID0gTlVMTDsKKwlzcG9ydC0+ZG1hX3J4X2J1Zl9idXMgPSAwOworCXNwb3J0LT5kbWFfcnhfYnVmX3ZpcnQgPSBOVUxMOworCWRtYV9yZWxlYXNlX2NoYW5uZWwoZG1hX2NoYW4pOworfQorCiBzdGF0aWMgaW50IGxwdWFydF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwpAQCAtMzgwLDYgKzc3MiwxNSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciB0ZW1wOwogCisJLyp3aGV0aGVyIHVzZSBkbWEgc3VwcG9ydCBieSBkbWEgcmVxdWVzdCByZXN1bHRzKi8KKwlpZiAobHB1YXJ0X2RtYV90eF9yZXF1ZXN0KHBvcnQpIHx8IGxwdWFydF9kbWFfcnhfcmVxdWVzdChwb3J0KSkgeworCQlzcG9ydC0+bHB1YXJ0X2RtYV91c2UgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlzcG9ydC0+bHB1YXJ0X2RtYV91c2UgPSB0cnVlOworCQl0ZW1wID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRDUjUpOworCQl3cml0ZWIodGVtcCB8IFVBUlRDUjVfVERNQVMsIHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwl9CisKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKHBvcnQtPmRldiwgcG9ydC0+aXJxLCBscHVhcnRfaW50LCAwLAogCQkJCURSSVZFUl9OQU1FLCBzcG9ydCk7CiAJaWYgKHJldCkKQEAgLTQxNCw2ICs4MTUsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAlkZXZtX2ZyZWVfaXJxKHBvcnQtPmRldiwgcG9ydC0+aXJxLCBzcG9ydCk7CisKKwlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdXNlKSB7CisJCWxwdWFydF9kbWFfdHhfZnJlZShwb3J0KTsKKwkJbHB1YXJ0X2RtYV9yeF9mcmVlKHBvcnQpOworCX0KIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwppbmRleCBkNzk5MTQwLi4zYjZjMWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCkBAIC00OTYsOCArNDk2LDcgQEAKIAogCWRldl9kYmcoc3BvcnQtPnBvcnQuZGV2LCAid2UgZmluaXNoIHRoZSBUWCBETUEuXG4iKTsKIAotCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKLQkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKKwl1YXJ0X3dyaXRlX3dha2V1cCgmc3BvcnQtPnBvcnQpOwogCiAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnNwb3J0LT5kbWFfd2FpdCkpIHsKIAkJd2FrZV91cCgmc3BvcnQtPmRtYV93YWl0KTsKQEAgLTExMTcsMjUgKzExMTYsMjUgQEAKIAkgKi8KIAlpZiAoc3BvcnQtPnR4aXJxID4gMCkgewogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+cnhpcnEsIGlteF9yeGludCwgMCwKLQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOworCQkJCSAgICAgZGV2X25hbWUocG9ydC0+ZGV2KSwgc3BvcnQpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBlcnJvcl9vdXQxOwogCiAJCXJldHZhbCA9IHJlcXVlc3RfaXJxKHNwb3J0LT50eGlycSwgaW14X3R4aW50LCAwLAotCQkJCURSSVZFUl9OQU1FLCBzcG9ydCk7CisJCQkJICAgICBkZXZfbmFtZShwb3J0LT5kZXYpLCBzcG9ydCk7CiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGVycm9yX291dDI7CiAKIAkJLyogZG8gbm90IHVzZSBSVFMgSVJRIG9uIElyREEgKi8KIAkJaWYgKCFVU0VfSVJEQShzcG9ydCkpIHsKIAkJCXJldHZhbCA9IHJlcXVlc3RfaXJxKHNwb3J0LT5ydHNpcnEsIGlteF9ydHNpbnQsIDAsCi0JCQkJCURSSVZFUl9OQU1FLCBzcG9ydCk7CisJCQkJCSAgICAgZGV2X25hbWUocG9ydC0+ZGV2KSwgc3BvcnQpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlnb3RvIGVycm9yX291dDM7CiAJCX0KIAl9IGVsc2UgewogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+cG9ydC5pcnEsIGlteF9pbnQsIDAsCi0JCQkJRFJJVkVSX05BTUUsIHNwb3J0KTsKKwkJCQkgICAgIGRldl9uYW1lKHBvcnQtPmRldiksIHNwb3J0KTsKIAkJaWYgKHJldHZhbCkgewogCQkJZnJlZV9pcnEoc3BvcnQtPnBvcnQuaXJxLCBzcG9ydCk7CiAJCQlnb3RvIGVycm9yX291dDE7CkBAIC0xNDcwLDQ0ICsxNDY5LDEzIEBACiB9CiAKIC8qCi0gKiBSZWxlYXNlIHRoZSBtZW1vcnkgcmVnaW9uKHMpIGJlaW5nIHVzZWQgYnkgJ3BvcnQnLgotICovCi1zdGF0aWMgdm9pZCBpbXhfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShwb3J0LT5kZXYpOwotCXN0cnVjdCByZXNvdXJjZSAqbW1yZXM7Ci0KLQltbXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1tcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtbXJlcykpOwotfQotCi0vKgotICogUmVxdWVzdCB0aGUgbWVtb3J5IHJlZ2lvbihzKSBiZWluZyB1c2VkIGJ5ICdwb3J0Jy4KLSAqLwotc3RhdGljIGludCBpbXhfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShwb3J0LT5kZXYpOwotCXN0cnVjdCByZXNvdXJjZSAqbW1yZXM7Ci0Jdm9pZCAqcmV0OwotCi0JbW1yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghbW1yZXMpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0ID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1tcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtbXJlcyksICJpbXgtdWFydCIpOwotCi0JcmV0dXJuICByZXQgPyAwIDogLUVCVVNZOwotfQotCi0vKgogICogQ29uZmlndXJlL2F1dG9jb25maWd1cmUgdGhlIHBvcnQuCiAgKi8KIHN0YXRpYyB2b2lkIGlteF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OwogCi0JaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSAmJgotCSAgICBpbXhfcmVxdWVzdF9wb3J0KCZzcG9ydC0+cG9ydCkgPT0gMCkKKwlpZiAoZmxhZ3MgJiBVQVJUX0NPTkZJR19UWVBFKQogCQlzcG9ydC0+cG9ydC50eXBlID0gUE9SVF9JTVg7CiB9CiAKQEAgLTE2MTcsOCArMTU4NSw2IEBACiAJLmZsdXNoX2J1ZmZlcgk9IGlteF9mbHVzaF9idWZmZXIsCiAJLnNldF90ZXJtaW9zCT0gaW14X3NldF90ZXJtaW9zLAogCS50eXBlCQk9IGlteF90eXBlLAotCS5yZWxlYXNlX3BvcnQJPSBpbXhfcmVsZWFzZV9wb3J0LAotCS5yZXF1ZXN0X3BvcnQJPSBpbXhfcmVxdWVzdF9wb3J0LAogCS5jb25maWdfcG9ydAk9IGlteF9jb25maWdfcG9ydCwKIAkudmVyaWZ5X3BvcnQJPSBpbXhfdmVyaWZ5X3BvcnQsCiAjaWYgZGVmaW5lZChDT05GSUdfQ09OU09MRV9QT0xMKQpAQCAtMTkzNSw3ICsxOTAxLDYgQEAKIHN0YXRpYyBpbnQgc2VyaWFsX2lteF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBpbXhfcG9ydCAqc3BvcnQ7Ci0Jc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCByZXQgPSAwOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwpAQCAtMTk1MSwxMiArMTkxNiw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgUEFHRV9TSVpFKTsKLQlpZiAoIWJhc2UpCi0JCXJldHVybiAtRU5PTUVNOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKIAogCXNwb3J0LT5wb3J0LmRldiA9ICZwZGV2LT5kZXY7CiAJc3BvcnQtPnBvcnQubWFwYmFzZSA9IHJlcy0+c3RhcnQ7CkBAIC0xOTkyLDM4ICsxOTU0LDE2IEBACiAKIAlpbXhfcG9ydHNbc3BvcnQtPnBvcnQubGluZV0gPSBzcG9ydDsKIAotCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKLQkJcmV0ID0gcGRhdGEtPmluaXQocGRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOwotCWlmIChyZXQpCi0JCWdvdG8gZGVpbml0OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNwb3J0KTsKIAotCXJldHVybiAwOwotZGVpbml0OgotCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKLQkJcGRhdGEtPmV4aXQocGRldik7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdWFydF9hZGRfb25lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VyaWFsX2lteF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0KLQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmaW14X3JlZywgJnNwb3J0LT5wb3J0KTsKLQotCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKLQkJcGRhdGEtPmV4aXQocGRldik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdWFydF9yZW1vdmVfb25lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNlcmlhbF9pbXhfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMKaW5kZXggOGQ3MWU0MC4uMmE5OWQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBNYXhpbSAoRGFsbGFzKSBNQVgzMTA3LzgvOSwgTUFYMTQ4MzAgc2VyaWFsIGRyaXZlcgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBBbGV4YW5kZXIgU2hpeWFuIDxzaGNfd29ya0BtYWlsLnJ1PgorICogIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IEFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+CiAgKgogICogIEJhc2VkIG9uIG1heDMxMDAuYywgYnkgQ2hyaXN0aWFuIFBlbGxlZ3JpbiA8Y2hyaXBlbGxAZXZvbHdhcmUub3JnPgogICogIEJhc2VkIG9uIG1heDMxMTAuYywgYnkgRmVuZyBUYW5nIDxmZW5nLnRhbmdAaW50ZWwuY29tPgpAQCAtMTMsMTkgKzEzLDIxIEBACiAgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbWF4MzEweC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2RlZmluZSBNQVgzMTBYX05BTUUJCQkibWF4MzEweCIKICNkZWZpbmUgTUFYMzEwWF9NQUpPUgkJCTIwNApAQCAtMTYxLDEwICsxNjMsNiBAQAogLyogSVJEQSByZWdpc3RlciBiaXRzICovCiAjZGVmaW5lIE1BWDMxMFhfSVJEQV9JUkRBRU5fQklUCQkoMSA8PCAwKSAvKiBJUkRBIG1vZGUgZW5hYmxlICovCiAjZGVmaW5lIE1BWDMxMFhfSVJEQV9TSVJfQklUCQkoMSA8PCAxKSAvKiBTSVIgbW9kZSBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9JUkRBX1NIT1JUSVJfQklUCSgxIDw8IDIpIC8qIFNob3J0IFNJUiBtb2RlIGVuYWJsZSAqLwotI2RlZmluZSBNQVgzMTBYX0lSREFfTUlSX0JJVAkJKDEgPDwgMykgLyogTUlSIG1vZGUgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfSVJEQV9SWElOVl9CSVQJCSgxIDw8IDQpIC8qIFJYIGxvZ2ljIGludmVyc2lvbiBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9JUkRBX1RYSU5WX0JJVAkJKDEgPDwgNSkgLyogVFggbG9naWMgaW52ZXJzaW9uIGVuYWJsZSAqLwogCiAvKiBGbG93IGNvbnRyb2wgdHJpZ2dlciBsZXZlbCByZWdpc3RlciBtYXNrcyAqLwogI2RlZmluZSBNQVgzMTBYX0ZMT1dMVkxfSEFMVF9NQVNLCSgweDAwMGYpIC8qIEZsb3cgY29udHJvbCBoYWx0IGxldmVsICovCkBAIC0yMjAsMjYgKzIxOCw2IEBACiAJCQkJCQkgICogICAgICAgWE9GRjIKIAkJCQkJCSAgKi8KIAotLyogR1BJTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJpdHMgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQME9VVF9CSVQJKDEgPDwgMCkgLyogR1BJTyAwIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQMU9VVF9CSVQJKDEgPDwgMSkgLyogR1BJTyAxIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQMk9VVF9CSVQJKDEgPDwgMikgLyogR1BJTyAyIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQM09VVF9CSVQJKDEgPDwgMykgLyogR1BJTyAzIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQME9EX0JJVAkoMSA8PCA0KSAvKiBHUElPIDAgb3Blbi1kcmFpbiBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQMU9EX0JJVAkoMSA8PCA1KSAvKiBHUElPIDEgb3Blbi1kcmFpbiBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQMk9EX0JJVAkoMSA8PCA2KSAvKiBHUElPIDIgb3Blbi1kcmFpbiBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPQ0ZHX0dQM09EX0JJVAkoMSA8PCA3KSAvKiBHUElPIDMgb3Blbi1kcmFpbiBlbmFibGUgKi8KLQotLyogR1BJTyBEQVRBIHJlZ2lzdGVyIGJpdHMgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDBPVVRfQklUCSgxIDw8IDApIC8qIEdQSU8gMCBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDFPVVRfQklUCSgxIDw8IDEpIC8qIEdQSU8gMSBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDJPVVRfQklUCSgxIDw8IDIpIC8qIEdQSU8gMiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDNPVVRfQklUCSgxIDw8IDMpIC8qIEdQSU8gMyBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDBJTl9CSVQJKDEgPDwgNCkgLyogR1BJTyAwIGlucHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AxSU5fQklUCSgxIDw8IDUpIC8qIEdQSU8gMSBpbnB1dCB2YWx1ZSAqLwotI2RlZmluZSBNQVgzMTBYX0dQSU9EQVRBX0dQMklOX0JJVAkoMSA8PCA2KSAvKiBHUElPIDIgaW5wdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDNJTl9CSVQJKDEgPDwgNykgLyogR1BJTyAzIGlucHV0IHZhbHVlICovCi0KIC8qIFBMTCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG1hc2tzICovCiAjZGVmaW5lIE1BWDMxMFhfUExMQ0ZHX1BSRURJVl9NQVNLCSgweDNmKSAvKiBQTEwgcHJlZGl2aXNpb24gdmFsdWUgKi8KICNkZWZpbmUgTUFYMzEwWF9QTExDRkdfUExMRkFDVE9SX01BU0sJKDB4YzApIC8qIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgKi8KQEAgLTI4MywxNiArMjYxLDE1IEBACiBzdHJ1Y3QgbWF4MzEweF9vbmUgewogCXN0cnVjdCB1YXJ0X3BvcnQJcG9ydDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHhfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbWRfd29yazsKIH07CiAKIHN0cnVjdCBtYXgzMTB4X3BvcnQgewogCXN0cnVjdCB1YXJ0X2RyaXZlcgl1YXJ0OwogCXN0cnVjdCBtYXgzMTB4X2RldnR5cGUJKmRldnR5cGU7CiAJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKLQlzdHJ1Y3QgcmVnbWFwX2NvbmZpZwlyZWdjZmc7CiAJc3RydWN0IG11dGV4CQltdXRleDsKLQlzdHJ1Y3QgbWF4MzEweF9wZGF0YQkqcGRhdGE7Ci0JaW50CQkJZ3Bpb191c2VkOworCXN0cnVjdCBjbGsJCSpjbGs7CiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKIAlzdHJ1Y3QgZ3Bpb19jaGlwCWdwaW87CiAjZW5kaWYKQEAgLTUwNCwyNSArNDgxLDMzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBtYXgzMTB4X3NldF9iYXVkKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBiYXVkKQorc3RhdGljIGludCBtYXgzMTB4X3NldF9iYXVkKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBiYXVkKQogewotCXVuc2lnbmVkIGludCBtb2RlID0gMCwgZGl2ID0gcG9ydC0+dWFydGNsayAvIGJhdWQ7CisJdW5zaWduZWQgaW50IG1vZGUgPSAwLCBjbGsgPSBwb3J0LT51YXJ0Y2xrLCBkaXYgPSBjbGsgLyBiYXVkOwogCi0JaWYgKCEoZGl2IC8gMTYpKSB7CisJLyogQ2hlY2sgZm9yIG1pbmltYWwgdmFsdWUgZm9yIGRpdmlkZXIgKi8KKwlpZiAoZGl2IDwgMTYpCisJCWRpdiA9IDE2OworCisJaWYgKGNsayAlIGJhdWQgJiYgKGRpdiAvIDE2KSA8IDB4ODAwMCkgewogCQkvKiBNb2RlIHgyICovCiAJCW1vZGUgPSBNQVgzMTBYX0JSR0NGR18yWE1PREVfQklUOwotCQlkaXYgPSAocG9ydC0+dWFydGNsayAqIDIpIC8gYmF1ZDsKLQl9CisJCWNsayA9IHBvcnQtPnVhcnRjbGsgKiAyOworCQlkaXYgPSBjbGsgLyBiYXVkOwogCi0JaWYgKCEoZGl2IC8gMTYpKSB7Ci0JCS8qIE1vZGUgeDQgKi8KLQkJbW9kZSA9IE1BWDMxMFhfQlJHQ0ZHXzRYTU9ERV9CSVQ7Ci0JCWRpdiA9IChwb3J0LT51YXJ0Y2xrICogNCkgLyBiYXVkOworCQlpZiAoY2xrICUgYmF1ZCAmJiAoZGl2IC8gMTYpIDwgMHg4MDAwKSB7CisJCQkvKiBNb2RlIHg0ICovCisJCQltb2RlID0gTUFYMzEwWF9CUkdDRkdfNFhNT0RFX0JJVDsKKwkJCWNsayA9IHBvcnQtPnVhcnRjbGsgKiA0OworCQkJZGl2ID0gY2xrIC8gYmF1ZDsKKwkJfQogCX0KIAogCW1heDMxMHhfcG9ydF93cml0ZShwb3J0LCBNQVgzMTBYX0JSR0RJVk1TQl9SRUcsIChkaXYgLyAxNikgPj4gOCk7CiAJbWF4MzEweF9wb3J0X3dyaXRlKHBvcnQsIE1BWDMxMFhfQlJHRElWTFNCX1JFRywgZGl2IC8gMTYpOwogCW1heDMxMHhfcG9ydF93cml0ZShwb3J0LCBNQVgzMTBYX0JSR0NGR19SRUcsIChkaXYgJSAxNikgfCBtb2RlKTsKKworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVChjbGssIGRpdik7CiB9CiAKIHN0YXRpYyBpbnQgbWF4MzEweF91cGRhdGVfYmVzdF9lcnIodW5zaWduZWQgbG9uZyBmLCBsb25nICpiZXN0ZXJyKQpAQCAtNTM4LDE4ICs1MjMsMTkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBtYXgzMTB4X3NldF9yZWZfY2xrKHN0cnVjdCBtYXgzMTB4X3BvcnQgKnMpCitzdGF0aWMgaW50IG1heDMxMHhfc2V0X3JlZl9jbGsoc3RydWN0IG1heDMxMHhfcG9ydCAqcywgdW5zaWduZWQgbG9uZyBmcmVxLAorCQkJICAgICAgIGJvb2wgeHRhbCkKIHsKIAl1bnNpZ25lZCBpbnQgZGl2LCBjbGtzcmMsIHBsbGNmZyA9IDA7CiAJbG9uZyBiZXN0ZXJyID0gLTE7Ci0JdW5zaWduZWQgbG9uZyBmZGl2LCBmbXVsLCBiZXN0ZnJlcSA9IHMtPnBkYXRhLT5mcmVxdWVuY3k7CisJdW5zaWduZWQgbG9uZyBmZGl2LCBmbXVsLCBiZXN0ZnJlcSA9IGZyZXE7CiAKIAkvKiBGaXJzdCwgdXBkYXRlIGVycm9yIHdpdGhvdXQgUExMICovCi0JbWF4MzEweF91cGRhdGVfYmVzdF9lcnIocy0+cGRhdGEtPmZyZXF1ZW5jeSwgJmJlc3RlcnIpOworCW1heDMxMHhfdXBkYXRlX2Jlc3RfZXJyKGZyZXEsICZiZXN0ZXJyKTsKIAogCS8qIFRyeSBhbGwgcG9zc2libGUgUExMIGRpdmlkZXJzICovCiAJZm9yIChkaXYgPSAxOyAoZGl2IDw9IDYzKSAmJiBiZXN0ZXJyOyBkaXYrKykgewotCQlmZGl2ID0gRElWX1JPVU5EX0NMT1NFU1Qocy0+cGRhdGEtPmZyZXF1ZW5jeSwgZGl2KTsKKwkJZmRpdiA9IERJVl9ST1VORF9DTE9TRVNUKGZyZXEsIGRpdik7CiAKIAkJLyogVHJ5IG11bHRpcGxpZXIgNiAqLwogCQlmbXVsID0gZmRpdiAqIDY7CkBAIC01ODIsMTAgKzU2OCw3IEBACiAJfQogCiAJLyogQ29uZmlndXJlIGNsb2NrIHNvdXJjZSAqLwotCWlmIChzLT5wZGF0YS0+ZHJpdmVyX2ZsYWdzICYgTUFYMzEwWF9FWFRfQ0xLKQotCQljbGtzcmMgPSBNQVgzMTBYX0NMS1NSQ19FWFRDTEtfQklUOwotCWVsc2UKLQkJY2xrc3JjID0gTUFYMzEwWF9DTEtTUkNfQ1JZU1RfQklUOworCWNsa3NyYyA9IHh0YWwgPyBNQVgzMTBYX0NMS1NSQ19DUllTVF9CSVQgOiBNQVgzMTBYX0NMS1NSQ19FWFRDTEtfQklUOwogCiAJLyogQ29uZmlndXJlIFBMTCAqLwogCWlmIChwbGxjZmcpIHsKQEAgLTU5Nyw3ICs1ODAsNyBAQAogCXJlZ21hcF93cml0ZShzLT5yZWdtYXAsIE1BWDMxMFhfQ0xLU1JDX1JFRywgY2xrc3JjKTsKIAogCS8qIFdhaXQgZm9yIGNyeXN0YWwgKi8KLQlpZiAocGxsY2ZnICYmICEocy0+cGRhdGEtPmRyaXZlcl9mbGFncyAmIE1BWDMxMFhfRVhUX0NMSykpCisJaWYgKHBsbGNmZyAmJiB4dGFsKQogCQltc2xlZXAoMTApOwogCiAJcmV0dXJuIChpbnQpYmVzdGZyZXE7CkBAIC03ODIsMTEgKzc2NSwyMSBAQAogCXJldHVybiBUSU9DTV9EU1IgfCBUSU9DTV9DQVI7CiB9CiAKK3N0YXRpYyB2b2lkIG1heDMxMHhfbWRfcHJvYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCXN0cnVjdCBtYXgzMTB4X29uZSAqb25lID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgbWF4MzEweF9vbmUsIG1kX3dvcmspOworCisJbWF4MzEweF9wb3J0X3VwZGF0ZSgmb25lLT5wb3J0LCBNQVgzMTBYX01PREUyX1JFRywKKwkJCSAgICBNQVgzMTBYX01PREUyX0xPT1BCQUNLX0JJVCwKKwkJCSAgICAob25lLT5wb3J0Lm1jdHJsICYgVElPQ01fTE9PUCkgPworCQkJICAgIE1BWDMxMFhfTU9ERTJfTE9PUEJBQ0tfQklUIDogMCk7Cit9CisKIHN0YXRpYyB2b2lkIG1heDMxMHhfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKIHsKLQkvKiBEQ0QgYW5kIERTUiBhcmUgbm90IHdpcmVkIGFuZCBDVFMvUlRTIGlzIGhhZG5sZWQgYXV0b21hdGljYWxseQotCSAqIHNvIGRvIG5vdGhpbmcKLQkgKi8KKwlzdHJ1Y3QgbWF4MzEweF9vbmUgKm9uZSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbWF4MzEweF9vbmUsIHBvcnQpOworCisJc2NoZWR1bGVfd29yaygmb25lLT5tZF93b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgbWF4MzEweF9icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQpAQCAtODc1LDQwICs4NjgsNzYgQEAKIAkJCQkgIHBvcnQtPnVhcnRjbGsgLyA0KTsKIAogCS8qIFNldHVwIGJhdWRyYXRlIGdlbmVyYXRvciAqLwotCW1heDMxMHhfc2V0X2JhdWQocG9ydCwgYmF1ZCk7CisJYmF1ZCA9IG1heDMxMHhfc2V0X2JhdWQocG9ydCwgYmF1ZCk7CiAKIAkvKiBVcGRhdGUgdGltZW91dCBhY2NvcmRpbmcgdG8gbmV3IGJhdWQgcmF0ZSAqLwogCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CiB9CiAKK3N0YXRpYyBpbnQgbWF4MzEweF9pb2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworI2lmIGRlZmluZWQoVElPQ1NSUzQ4NSkgJiYgZGVmaW5lZChUSU9DR1JTNDg1KQorCXN0cnVjdCBzZXJpYWxfcnM0ODUgcnM0ODU7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DU1JTNDg1OgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJzNDg1LCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihyczQ4NSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChyczQ4NS5kZWxheV9ydHNfYmVmb3JlX3NlbmQgPiAweDBmIHx8CisJCSAgICByczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZCA+IDB4MGYpCisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJdmFsID0gKHJzNDg1LmRlbGF5X3J0c19iZWZvcmVfc2VuZCA8PCA0KSB8CisJCSAgICAgIHJzNDg1LmRlbGF5X3J0c19hZnRlcl9zZW5kOworCQltYXgzMTB4X3BvcnRfd3JpdGUocG9ydCwgTUFYMzEwWF9IRFBJWERFTEFZX1JFRywgdmFsKTsKKwkJaWYgKHJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpIHsKKwkJCW1heDMxMHhfcG9ydF91cGRhdGUocG9ydCwgTUFYMzEwWF9NT0RFMV9SRUcsCisJCQkJCSAgICBNQVgzMTBYX01PREUxX1RSTlNDVkNUUkxfQklULAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMV9UUk5TQ1ZDVFJMX0JJVCk7CisJCQltYXgzMTB4X3BvcnRfdXBkYXRlKHBvcnQsIE1BWDMxMFhfTU9ERTJfUkVHLAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMl9FQ0hPU1VQUl9CSVQsCisJCQkJCSAgICBNQVgzMTBYX01PREUyX0VDSE9TVVBSX0JJVCk7CisJCX0gZWxzZSB7CisJCQltYXgzMTB4X3BvcnRfdXBkYXRlKHBvcnQsIE1BWDMxMFhfTU9ERTFfUkVHLAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMV9UUk5TQ1ZDVFJMX0JJVCwgMCk7CisJCQltYXgzMTB4X3BvcnRfdXBkYXRlKHBvcnQsIE1BWDMxMFhfTU9ERTJfUkVHLAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMl9FQ0hPU1VQUl9CSVQsIDApOworCQl9CisJCXJldHVybiAwOworCWNhc2UgVElPQ0dSUzQ4NToKKwkJbWVtc2V0KCZyczQ4NSwgMCwgc2l6ZW9mKHJzNDg1KSk7CisJCXZhbCA9IG1heDMxMHhfcG9ydF9yZWFkKHBvcnQsIE1BWDMxMFhfTU9ERTFfUkVHKTsKKwkJcnM0ODUuZmxhZ3MgPSAodmFsICYgTUFYMzEwWF9NT0RFMV9UUk5TQ1ZDVFJMX0JJVCkgPworCQkJICAgICAgU0VSX1JTNDg1X0VOQUJMRUQgOiAwOworCQlyczQ4NS5mbGFncyB8PSBTRVJfUlM0ODVfUlRTX09OX1NFTkQ7CisJCXZhbCA9IG1heDMxMHhfcG9ydF9yZWFkKHBvcnQsIE1BWDMxMFhfSERQSVhERUxBWV9SRUcpOworCQlyczQ4NS5kZWxheV9ydHNfYmVmb3JlX3NlbmQgPSB2YWwgPj4gNDsKKwkJcnM0ODUuZGVsYXlfcnRzX2FmdGVyX3NlbmQgPSB2YWwgJiAweDBmOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJzNDg1LCBzaXplb2YocnM0ODUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisjZW5kaWYKKworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKIHN0YXRpYyBpbnQgbWF4MzEweF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JdW5zaWduZWQgaW50IHZhbCwgbGluZSA9IHBvcnQtPmxpbmU7CiAJc3RydWN0IG1heDMxMHhfcG9ydCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShwb3J0LT5kZXYpOworCXVuc2lnbmVkIGludCB2YWw7CiAKIAlzLT5kZXZ0eXBlLT5wb3dlcihwb3J0LCAxKTsKIAotCS8qIENvbmZpZ3VyZSBiYXVkIHJhdGUsIDk2MDAgYXMgZGVmYXVsdCAqLwotCW1heDMxMHhfc2V0X2JhdWQocG9ydCwgOTYwMCk7Ci0KLQkvKiBDb25maWd1cmUgTENSIHJlZ2lzdGVyLCA4TjEgbW9kZSBieSBkZWZhdWx0ICovCi0JbWF4MzEweF9wb3J0X3dyaXRlKHBvcnQsIE1BWDMxMFhfTENSX1JFRywgTUFYMzEwWF9MQ1JfV09SRF9MRU5fOCk7Ci0KIAkvKiBDb25maWd1cmUgTU9ERTEgcmVnaXN0ZXIgKi8KIAltYXgzMTB4X3BvcnRfdXBkYXRlKHBvcnQsIE1BWDMxMFhfTU9ERTFfUkVHLAotCQkJICAgIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQsCi0JCQkgICAgKHMtPnBkYXRhLT51YXJ0X2ZsYWdzW2xpbmVdICYgTUFYMzEwWF9BVVRPX0RJUl9DVFJMKQotCQkJICAgID8gTUFYMzEwWF9NT0RFMV9UUk5TQ1ZDVFJMX0JJVCA6IDApOworCQkJICAgIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQsIDApOwogCi0JLyogQ29uZmlndXJlIE1PREUyIHJlZ2lzdGVyICovCi0JdmFsID0gTUFYMzEwWF9NT0RFMl9SWEVNUFRJTlZfQklUOwotCWlmIChzLT5wZGF0YS0+dWFydF9mbGFnc1tsaW5lXSAmIE1BWDMxMFhfTE9PUEJBQ0spCi0JCXZhbCB8PSBNQVgzMTBYX01PREUyX0xPT1BCQUNLX0JJVDsKLQlpZiAocy0+cGRhdGEtPnVhcnRfZmxhZ3NbbGluZV0gJiBNQVgzMTBYX0VDSE9fU1VQUkVTUykKLQkJdmFsIHw9IE1BWDMxMFhfTU9ERTJfRUNIT1NVUFJfQklUOwotCi0JLyogUmVzZXQgRklGT3MgKi8KLQl2YWwgfD0gTUFYMzEwWF9NT0RFMl9GSUZPUlNUX0JJVDsKKwkvKiBDb25maWd1cmUgTU9ERTIgcmVnaXN0ZXIgJiBSZXNldCBGSUZPcyovCisJdmFsID0gTUFYMzEwWF9NT0RFMl9SWEVNUFRJTlZfQklUIHwgTUFYMzEwWF9NT0RFMl9GSUZPUlNUX0JJVDsKIAltYXgzMTB4X3BvcnRfd3JpdGUocG9ydCwgTUFYMzEwWF9NT0RFMl9SRUcsIHZhbCk7CiAJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUyX1JFRywKIAkJCSAgICBNQVgzMTBYX01PREUyX0ZJRk9SU1RfQklULCAwKTsKQEAgLTk4OSw2ICsxMDE4LDcgQEAKIAkucmVsZWFzZV9wb3J0CT0gbWF4MzEweF9udWxsX3ZvaWQsCiAJLmNvbmZpZ19wb3J0CT0gbWF4MzEweF9jb25maWdfcG9ydCwKIAkudmVyaWZ5X3BvcnQJPSBtYXgzMTB4X3ZlcmlmeV9wb3J0LAorCS5pb2N0bAkJPSBtYXgzMTB4X2lvY3RsLAogfTsKIAogc3RhdGljIGludCBfX21heWJlX3VudXNlZCBtYXgzMTB4X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTAxNyw2ICsxMDQ3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1heDMxMHhfcG1fb3BzLCBtYXgzMTB4X3N1c3BlbmQsIG1heDMxMHhfcmVzdW1lKTsKKwogI2lmZGVmIENPTkZJR19HUElPTElCCiBzdGF0aWMgaW50IG1heDMxMHhfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewpAQCAtMTA2MywyMyArMTA5NSwxNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgbWF4MzEweF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpc19zcGksCi0JCQkgc3RydWN0IG1heDMxMHhfZGV2dHlwZSAqZGV2dHlwZSwgaW50IGlycSkKK3N0YXRpYyBpbnQgbWF4MzEweF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKmRldnR5cGUsCisJCQkgc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgaXJxLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogeworCWludCBpLCByZXQsIGZtaW4sIGZtYXgsIGZyZXEsIHVhcnRjbGs7CisJc3RydWN0IGNsayAqY2xrX29zYywgKmNsa194dGFsOwogCXN0cnVjdCBtYXgzMTB4X3BvcnQgKnM7Ci0Jc3RydWN0IG1heDMxMHhfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwotCWludCBpLCByZXQsIHVhcnRjbGs7CisJYm9vbCB4dGFsID0gZmFsc2U7CiAKLQkvKiBDaGVjayBmb3IgSVJRICovCi0JaWYgKGlycSA8PSAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm8gSVJRIHNwZWNpZmllZFxuIik7Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOwogCiAJLyogQWxsb2MgcG9ydCBzdHJ1Y3R1cmUgKi8KIAlzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzKSArCkBAIC0xMDg5LDUyICsxMTE0LDQ0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIENoZWNrIGlucHV0IGZyZXF1ZW5jeSAqLwotCWlmICgocGRhdGEtPmRyaXZlcl9mbGFncyAmIE1BWDMxMFhfRVhUX0NMSykgJiYKLQkgICAoKHBkYXRhLT5mcmVxdWVuY3kgPCA1MDAwMDApIHx8IChwZGF0YS0+ZnJlcXVlbmN5ID4gMzUwMDAwMDApKSkKLQkJZ290byBlcnJfZnJlcTsKLQkvKiBDaGVjayBmcmVxdWVuY3kgZm9yIHF1YXJ0eiAqLwotCWlmICghKHBkYXRhLT5kcml2ZXJfZmxhZ3MgJiBNQVgzMTBYX0VYVF9DTEspICYmCi0JICAgKChwZGF0YS0+ZnJlcXVlbmN5IDwgMTAwMDAwMCkgfHwgKHBkYXRhLT5mcmVxdWVuY3kgPiA0MDAwMDAwKSkpCi0JCWdvdG8gZXJyX2ZyZXE7Ci0KLQlzLT5wZGF0YSA9IHBkYXRhOwotCXMtPmRldnR5cGUgPSBkZXZ0eXBlOwotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHMpOwotCi0JbXV0ZXhfaW5pdCgmcy0+bXV0ZXgpOwotCi0JLyogU2V0dXAgcmVnbWFwICovCi0Jcy0+cmVnY2ZnLnJlZ19iaXRzCQk9IDg7Ci0Jcy0+cmVnY2ZnLnZhbF9iaXRzCQk9IDg7Ci0Jcy0+cmVnY2ZnLnJlYWRfZmxhZ19tYXNrCT0gMHgwMDsKLQlzLT5yZWdjZmcud3JpdGVfZmxhZ19tYXNrCT0gMHg4MDsKLQlzLT5yZWdjZmcuY2FjaGVfdHlwZQkJPSBSRUdDQUNIRV9SQlRSRUU7Ci0Jcy0+cmVnY2ZnLndyaXRlYWJsZV9yZWcJCT0gbWF4MzEweF9yZWdfd3JpdGVhYmxlOwotCXMtPnJlZ2NmZy52b2xhdGlsZV9yZWcJCT0gbWF4MzEweF9yZWdfdm9sYXRpbGU7Ci0Jcy0+cmVnY2ZnLnByZWNpb3VzX3JlZwkJPSBtYXgzMTB4X3JlZ19wcmVjaW91czsKLQlzLT5yZWdjZmcubWF4X3JlZ2lzdGVyCQk9IGRldnR5cGUtPm5yICogMHgyMCAtIDE7Ci0KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfU1BJX01BU1RFUikgJiYgaXNfc3BpKSB7Ci0JCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0KLQkJcy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmcy0+cmVnY2ZnKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCWlmIChJU19FUlIocy0+cmVnbWFwKSkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHJlZ2lzdGVyIG1hcFxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHMtPnJlZ21hcCk7CisJY2xrX29zYyA9IGRldm1fY2xrX2dldChkZXYsICJvc2MiKTsKKwljbGtfeHRhbCA9IGRldm1fY2xrX2dldChkZXYsICJ4dGFsIik7CisJaWYgKCFJU19FUlIoY2xrX29zYykpIHsKKwkJcy0+Y2xrID0gY2xrX29zYzsKKwkJZm1pbiA9IDUwMDAwMDsKKwkJZm1heCA9IDM1MDAwMDAwOworCX0gZWxzZSBpZiAoIUlTX0VSUihjbGtfeHRhbCkpIHsKKwkJcy0+Y2xrID0gY2xrX3h0YWw7CisJCWZtaW4gPSAxMDAwMDAwOworCQlmbWF4ID0gNDAwMDAwMDsKKwkJeHRhbCA9IHRydWU7CisJfSBlbHNlIGlmIChQVFJfRVJSKGNsa19vc2MpID09IC1FUFJPQkVfREVGRVIgfHwKKwkJICAgUFRSX0VSUihjbGtfeHRhbCkgPT0gLUVQUk9CRV9ERUZFUikgeworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBnZXQgY2xvY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBCb2FyZCBzcGVjaWZpYyBjb25maWd1cmUgKi8KLQlpZiAocy0+cGRhdGEtPmluaXQpCi0JCXMtPnBkYXRhLT5pbml0KCk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHMtPmNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZyZXEgPSBjbGtfZ2V0X3JhdGUocy0+Y2xrKTsKKwkvKiBDaGVjayBmcmVxdWVuY3kgbGltaXRzICovCisJaWYgKGZyZXEgPCBmbWluIHx8IGZyZXEgPiBmbWF4KSB7CisJCXJldCA9IC1FUkFOR0U7CisJCWdvdG8gb3V0X2NsazsKKwl9CisKKwlzLT5yZWdtYXAgPSByZWdtYXA7CisJcy0+ZGV2dHlwZSA9IGRldnR5cGU7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgcyk7CiAKIAkvKiBDaGVjayBkZXZpY2UgdG8gZW5zdXJlIHdlIGFyZSB0YWxraW5nIHRvIHdoYXQgd2UgZXhwZWN0ICovCiAJcmV0ID0gZGV2dHlwZS0+ZGV0ZWN0KGRldik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfY2xrOwogCiAJZm9yIChpID0gMDsgaSA8IGRldnR5cGUtPm5yOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IG9mZnMgPSBpIDw8IDU7CkBAIC0xMTU2LDcgKzExNzMsNyBAQAogCQkJCSAgIE1BWDMxMFhfTU9ERTFfQVVUT1NMRUVQX0JJVCk7CiAJfQogCi0JdWFydGNsayA9IG1heDMxMHhfc2V0X3JlZl9jbGsocyk7CisJdWFydGNsayA9IG1heDMxMHhfc2V0X3JlZl9jbGsocywgZnJlcSwgeHRhbCk7CiAJZGV2X2RiZyhkZXYsICJSZWZlcmVuY2UgY2xvY2sgc2V0IHRvICVpIEh6XG4iLCB1YXJ0Y2xrKTsKIAogCS8qIFJlZ2lzdGVyIFVBUlQgZHJpdmVyICovCkBAIC0xMTY4LDkgKzExODUsMjggQEAKIAlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmcy0+dWFydCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgIlJlZ2lzdGVyaW5nIFVBUlQgZHJpdmVyIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2NsazsKIAl9CiAKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCS8qIFNldHVwIEdQSU8gY290cm9sbGVyICovCisJcy0+Z3Bpby5vd25lcgkJPSBUSElTX01PRFVMRTsKKwlzLT5ncGlvLmRldgkJPSBkZXY7CisJcy0+Z3Bpby5sYWJlbAkJPSBkZXZfbmFtZShkZXYpOworCXMtPmdwaW8uZGlyZWN0aW9uX2lucHV0CT0gbWF4MzEweF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlzLT5ncGlvLmdldAkJPSBtYXgzMTB4X2dwaW9fZ2V0OworCXMtPmdwaW8uZGlyZWN0aW9uX291dHB1dD0gbWF4MzEweF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJcy0+Z3Bpby5zZXQJCT0gbWF4MzEweF9ncGlvX3NldDsKKwlzLT5ncGlvLmJhc2UJCT0gLTE7CisJcy0+Z3Bpby5uZ3BpbwkJPSBkZXZ0eXBlLT5uciAqIDQ7CisJcy0+Z3Bpby5jYW5fc2xlZXAJPSAxOworCXJldCA9IGdwaW9jaGlwX2FkZCgmcy0+Z3Bpbyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdWFydDsKKyNlbmRpZgorCisJbXV0ZXhfaW5pdCgmcy0+bXV0ZXgpOworCiAJZm9yIChpID0gMDsgaSA8IGRldnR5cGUtPm5yOyBpKyspIHsKIAkJLyogSW5pdGlhbGl6ZSBwb3J0IGRhdGEgKi8KIAkJcy0+cFtpXS5wb3J0LmxpbmUJPSBpOwpAQCAtMTE3OCw4ICsxMjE0LDcgQEAKIAkJcy0+cFtpXS5wb3J0LmlycQk9IGlycTsKIAkJcy0+cFtpXS5wb3J0LnR5cGUJPSBQT1JUX01BWDMxMFg7CiAJCXMtPnBbaV0ucG9ydC5maWZvc2l6ZQk9IE1BWDMxMFhfRklGT19TSVpFOwotCQlzLT5wW2ldLnBvcnQuZmxhZ3MJPSBVUEZfU0tJUF9URVNUIHwgVVBGX0ZJWEVEX1RZUEUgfAotCQkJCQkgIFVQRl9MT1dfTEFURU5DWTsKKwkJcy0+cFtpXS5wb3J0LmZsYWdzCT0gVVBGX0ZJWEVEX1RZUEUgfCBVUEZfTE9XX0xBVEVOQ1k7CiAJCXMtPnBbaV0ucG9ydC5pb3R5cGUJPSBVUElPX1BPUlQ7CiAJCXMtPnBbaV0ucG9ydC5pb2Jhc2UJPSBpICogMHgyMDsKIAkJcy0+cFtpXS5wb3J0Lm1lbWJhc2UJPSAodm9pZCBfX2lvbWVtICopfjA7CkBAIC0xMTk1LDQ4ICsxMjMwLDM1IEBACiAJCQkJICAgIE1BWDMxMFhfTU9ERTFfSVJRU0VMX0JJVCk7CiAJCS8qIEluaXRpYWxpemUgcXVldWUgZm9yIHN0YXJ0IFRYICovCiAJCUlOSVRfV09SSygmcy0+cFtpXS50eF93b3JrLCBtYXgzMTB4X3dxX3Byb2MpOworCQkvKiBJbml0aWFsaXplIHF1ZXVlIGZvciBjaGFuZ2luZyBtb2RlICovCisJCUlOSVRfV09SSygmcy0+cFtpXS5tZF93b3JrLCBtYXgzMTB4X21kX3Byb2MpOwogCQkvKiBSZWdpc3RlciBwb3J0ICovCiAJCXVhcnRfYWRkX29uZV9wb3J0KCZzLT51YXJ0LCAmcy0+cFtpXS5wb3J0KTsKIAkJLyogR28gdG8gc3VzcGVuZCBtb2RlICovCiAJCWRldnR5cGUtPnBvd2VyKCZzLT5wW2ldLnBvcnQsIDApOwogCX0KIAotI2lmZGVmIENPTkZJR19HUElPTElCCi0JLyogU2V0dXAgR1BJTyBjb3Ryb2xsZXIgKi8KLQlpZiAocy0+cGRhdGEtPmdwaW9fYmFzZSkgewotCQlzLT5ncGlvLm93bmVyCQk9IFRISVNfTU9EVUxFOwotCQlzLT5ncGlvLmRldgkJPSBkZXY7Ci0JCXMtPmdwaW8ubGFiZWwJCT0gZGV2X25hbWUoZGV2KTsKLQkJcy0+Z3Bpby5kaXJlY3Rpb25faW5wdXQJPSBtYXgzMTB4X2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCQlzLT5ncGlvLmdldAkJPSBtYXgzMTB4X2dwaW9fZ2V0OwotCQlzLT5ncGlvLmRpcmVjdGlvbl9vdXRwdXQ9IG1heDMxMHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCQlzLT5ncGlvLnNldAkJPSBtYXgzMTB4X2dwaW9fc2V0OwotCQlzLT5ncGlvLmJhc2UJCT0gcy0+cGRhdGEtPmdwaW9fYmFzZTsKLQkJcy0+Z3Bpby5uZ3BpbwkJPSBkZXZ0eXBlLT5uciAqIDQ7Ci0JCXMtPmdwaW8uY2FuX3NsZWVwCT0gMTsKLQkJaWYgKCFncGlvY2hpcF9hZGQoJnMtPmdwaW8pKQotCQkJcy0+Z3Bpb191c2VkID0gMTsKLQl9IGVsc2UKLQkJZGV2X2luZm8oZGV2LCAiR1BJTyBzdXBwb3J0IG5vdCBlbmFibGVkXG4iKTsKLSNlbmRpZgotCiAJLyogU2V0dXAgaW50ZXJydXB0ICovCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGlycSwgTlVMTCwgbWF4MzEweF9pc3QsCi0JCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAotCQkJCQlkZXZfbmFtZShkZXYpLCBzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlZ3Vlc3QgSVJRICVpXG4iLCBpcnEpOworCQkJCQlJUlFGX09ORVNIT1QgfCBmbGFncywgZGV2X25hbWUoZGV2KSwgcyk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJZGV2X2VycihkZXYsICJVbmFibGUgdG8gcmVndWVzdCBJUlEgJWlcbiIsIGlycSk7CisKKwltdXRleF9kZXN0cm95KCZzLT5tdXRleCk7CisKICNpZmRlZiBDT05GSUdfR1BJT0xJQgotCQlpZiAocy0+Z3Bpb191c2VkKQotCQkJV0FSTl9PTihncGlvY2hpcF9yZW1vdmUoJnMtPmdwaW8pKTsKKwlXQVJOX09OKGdwaW9jaGlwX3JlbW92ZSgmcy0+Z3BpbykpOworCitvdXRfdWFydDoKICNlbmRpZgotCX0KKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzLT51YXJ0KTsKKworb3V0X2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocy0+Y2xrKTsKIAogCXJldHVybiByZXQ7Ci0KLWVycl9mcmVxOgotCWRldl9lcnIoZGV2LCAiRnJlcXVlbmN5IHBhcmFtZXRlciBpbmNvcnJlY3RcbiIpOwotCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IG1heDMxMHhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTEyNDQsMzAgKzEyNjYsNTEgQEAKIAlzdHJ1Y3QgbWF4MzEweF9wb3J0ICpzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGksIHJldCA9IDA7CiAKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmcy0+Z3Bpbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKyNlbmRpZgorCiAJZm9yIChpID0gMDsgaSA8IHMtPnVhcnQubnI7IGkrKykgewogCQljYW5jZWxfd29ya19zeW5jKCZzLT5wW2ldLnR4X3dvcmspOworCQljYW5jZWxfd29ya19zeW5jKCZzLT5wW2ldLm1kX3dvcmspOwogCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmcy0+dWFydCwgJnMtPnBbaV0ucG9ydCk7CiAJCXMtPmRldnR5cGUtPnBvd2VyKCZzLT5wW2ldLnBvcnQsIDApOwogCX0KIAorCW11dGV4X2Rlc3Ryb3koJnMtPm11dGV4KTsKIAl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzLT51YXJ0KTsKLQotI2lmZGVmIENPTkZJR19HUElPTElCCi0JaWYgKHMtPmdwaW9fdXNlZCkKLQkJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZzLT5ncGlvKTsKLSNlbmRpZgotCi0JaWYgKHMtPnBkYXRhLT5leGl0KQotCQlzLT5wZGF0YS0+ZXhpdCgpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzLT5jbGspOwogCiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgX19tYXliZV91bnVzZWQgbWF4MzEweF9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1heGltLG1heDMxMDciLAkuZGF0YSA9ICZtYXgzMTA3X2RldnR5cGUsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgzMTA4IiwJLmRhdGEgPSAmbWF4MzEwOF9kZXZ0eXBlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4MzEwOSIsCS5kYXRhID0gJm1heDMxMDlfZGV2dHlwZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1heGltLG1heDE0ODMwIiwJLmRhdGEgPSAmbWF4MTQ4MzBfZGV2dHlwZSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1heDMxMHhfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHJlZ2NmZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLndyaXRlX2ZsYWdfbWFzayA9IDB4ODAsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLndyaXRlYWJsZV9yZWcgPSBtYXgzMTB4X3JlZ193cml0ZWFibGUsCisJLnZvbGF0aWxlX3JlZyA9IG1heDMxMHhfcmVnX3ZvbGF0aWxlLAorCS5wcmVjaW91c19yZWcgPSBtYXgzMTB4X3JlZ19wcmVjaW91cywKK307CisKICNpZmRlZiBDT05GSUdfU1BJX01BU1RFUgogc3RhdGljIGludCBtYXgzMTB4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKmRldnR5cGUgPQotCQkoc3RydWN0IG1heDMxMHhfZGV2dHlwZSAqKXNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKmRldnR5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWludCByZXQ7CiAKIAkvKiBTZXR1cCBTUEkgYnVzICovCkBAIC0xMjc1LDEyICsxMzE4LDI1IEBACiAJc3BpLT5tb2RlCQk9IHNwaS0+bW9kZSA/IDogU1BJX01PREVfMDsKIAlzcGktPm1heF9zcGVlZF9oegk9IHNwaS0+bWF4X3NwZWVkX2h6ID8gOiAyNjAwMDAwMDsKIAlyZXQgPSBzcGlfc2V0dXAoc3BpKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiU1BJIHNldHVwIGZhaWxlZFxuIik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKworCWlmIChzcGktPmRldi5vZl9ub2RlKSB7CisJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KKwkJCW9mX21hdGNoX2RldmljZShtYXgzMTB4X2R0X2lkcywgJnNwaS0+ZGV2KTsKKworCQlkZXZ0eXBlID0gKHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKilvZl9pZC0+ZGF0YTsKKwl9IGVsc2UgeworCQljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCAqaWRfZW50cnkgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpOworCisJCWRldnR5cGUgPSAoc3RydWN0IG1heDMxMHhfZGV2dHlwZSAqKWlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKKwkJZmxhZ3MgPSBJUlFGX1RSSUdHRVJfRkFMTElORzsKIAl9CiAKLQlyZXR1cm4gbWF4MzEweF9wcm9iZSgmc3BpLT5kZXYsIDEsIGRldnR5cGUsIHNwaS0+aXJxKTsKKwlyZWdjZmcubWF4X3JlZ2lzdGVyID0gZGV2dHlwZS0+bnIgKiAweDIwIC0gMTsKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZyZWdjZmcpOworCisJcmV0dXJuIG1heDMxMHhfcHJvYmUoJnNwaS0+ZGV2LCBkZXZ0eXBlLCByZWdtYXAsIHNwaS0+aXJxLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgbWF4MzEweF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC0xMjg4LDggKzEzNDQsNiBAQAogCXJldHVybiBtYXgzMTB4X3JlbW92ZSgmc3BpLT5kZXYpOwogfQogCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWF4MzEweF9wbV9vcHMsIG1heDMxMHhfc3VzcGVuZCwgbWF4MzEweF9yZXN1bWUpOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgbWF4MzEweF9pZF90YWJsZVtdID0gewogCXsgIm1heDMxMDciLAkoa2VybmVsX3Vsb25nX3QpJm1heDMxMDdfZGV2dHlwZSwgfSwKIAl7ICJtYXgzMTA4IiwJKGtlcm5lbF91bG9uZ190KSZtYXgzMTA4X2RldnR5cGUsIH0sCkBAIC0xMzAxLDkgKzEzNTUsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1heDMxMHhfdWFydF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJPSBNQVgzMTBYX05BTUUsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkucG0JPSAmbWF4MzEweF9wbV9vcHMsCisJCS5uYW1lCQk9IE1BWDMxMFhfTkFNRSwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIobWF4MzEweF9kdF9pZHMpLAorCQkucG0JCT0gJm1heDMxMHhfcG1fb3BzLAogCX0sCiAJLnByb2JlCQk9IG1heDMxMHhfc3BpX3Byb2JlLAogCS5yZW1vdmUJCT0gbWF4MzEweF9zcGlfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMKaW5kZXggYjVkNzc5Yy4uMDUzYjk4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5jCkBAIC0zOSw2ICszOSwxMyBAQAogCiAjaW5jbHVkZSAibXNtX3NlcmlhbC5oIgogCitlbnVtIHsKKwlVQVJURE1fMVAxID0gMSwKKwlVQVJURE1fMVAyLAorCVVBUlRETV8xUDMsCisJVUFSVERNXzFQNCwKK307CisKIHN0cnVjdCBtc21fcG9ydCB7CiAJc3RydWN0IHVhcnRfcG9ydAl1YXJ0OwogCWNoYXIJCQluYW1lWzE2XTsKQEAgLTMwOSw2ICszMTYsOCBAQAogCiBzdGF0aWMgdm9pZCBtc21fcmVzZXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0ID0gVUFSVF9UT19NU00ocG9ydCk7CisKIAkvKiByZXNldCBldmVyeXRoaW5nICovCiAJbXNtX3dyaXRlKHBvcnQsIFVBUlRfQ1JfQ01EX1JFU0VUX1JYLCBVQVJUX0NSKTsKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfUkVTRVRfVFgsIFVBUlRfQ1IpOwpAQCAtMzE2LDYgKzMyNSwxMCBAQAogCW1zbV93cml0ZShwb3J0LCBVQVJUX0NSX0NNRF9SRVNFVF9CUkVBS19JTlQsIFVBUlRfQ1IpOwogCW1zbV93cml0ZShwb3J0LCBVQVJUX0NSX0NNRF9SRVNFVF9DVFMsIFVBUlRfQ1IpOwogCW1zbV93cml0ZShwb3J0LCBVQVJUX0NSX0NNRF9TRVRfUkZSLCBVQVJUX0NSKTsKKworCS8qIERpc2FibGUgRE0gbW9kZXMgKi8KKwlpZiAobXNtX3BvcnQtPmlzX3VhcnRkbSkKKwkJbXNtX3dyaXRlKHBvcnQsIDAsIFVBUlRETV9ETUVOKTsKIH0KIAogc3RhdGljIHZvaWQgbXNtX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCkBAIC03MTEsNiArNzI0LDExNyBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19DT05TT0xFX1BPTEwKK3N0YXRpYyBpbnQgbXNtX3BvbGxfaW5pdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBtc21fcG9ydCAqbXNtX3BvcnQgPSBVQVJUX1RPX01TTShwb3J0KTsKKworCS8qIEVuYWJsZSBzaW5nbGUgY2hhcmFjdGVyIG1vZGUgb24gUlggRklGTyAqLworCWlmIChtc21fcG9ydC0+aXNfdWFydGRtID49IFVBUlRETV8xUDQpCisJCW1zbV93cml0ZShwb3J0LCBVQVJURE1fRE1FTl9SWF9TQ19FTkFCTEUsIFVBUlRETV9ETUVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wb2xsX2dldF9jaGFyX3NpbmdsZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBtc21fcG9ydCAqbXNtX3BvcnQgPSBVQVJUX1RPX01TTShwb3J0KTsKKwl1bnNpZ25lZCBpbnQgcmZfcmVnID0gbXNtX3BvcnQtPmlzX3VhcnRkbSA/IFVBUlRETV9SRiA6IFVBUlRfUkY7CisKKwlpZiAoIShtc21fcmVhZChwb3J0LCBVQVJUX1NSKSAmIFVBUlRfU1JfUlhfUkVBRFkpKQorCQlyZXR1cm4gTk9fUE9MTF9DSEFSOworCWVsc2UKKwkJcmV0dXJuIG1zbV9yZWFkKHBvcnQsIHJmX3JlZykgJiAweGZmOworfQorCitzdGF0aWMgaW50IG1zbV9wb2xsX2dldF9jaGFyX2RtXzFwMyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWludCBjOworCXN0YXRpYyB1MzIgc2xvcDsKKwlzdGF0aWMgaW50IGNvdW50OworCXVuc2lnbmVkIGNoYXIgKnNwID0gKHVuc2lnbmVkIGNoYXIgKikmc2xvcDsKKworCS8qIENoZWNrIGlmIGEgcHJldmlvdXMgcmVhZCBoYWQgbW9yZSB0aGFuIG9uZSBjaGFyICovCisJaWYgKGNvdW50KSB7CisJCWMgPSBzcFtzaXplb2Yoc2xvcCkgLSBjb3VudF07CisJCWNvdW50LS07CisJLyogT3IgaWYgRklGTyBpcyBlbXB0eSAqLworCX0gZWxzZSBpZiAoIShtc21fcmVhZChwb3J0LCBVQVJUX1NSKSAmIFVBUlRfU1JfUlhfUkVBRFkpKSB7CisJCS8qCisJCSAqIElmIFJYIHBhY2tpbmcgYnVmZmVyIGhhcyBsZXNzIHRoYW4gYSB3b3JkLCBmb3JjZSBzdGFsZSB0bworCQkgKiBwdXNoIGNvbnRlbnRzIGludG8gUlggRklGTworCQkgKi8KKwkJY291bnQgPSBtc21fcmVhZChwb3J0LCBVQVJURE1fUlhGUyk7CisJCWNvdW50ID0gKGNvdW50ID4+IFVBUlRETV9SWEZTX0JVRl9TSElGVCkgJiBVQVJURE1fUlhGU19CVUZfTUFTSzsKKwkJaWYgKGNvdW50KSB7CisJCQltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfRk9SQ0VfU1RBTEUsIFVBUlRfQ1IpOworCQkJc2xvcCA9IG1zbV9yZWFkKHBvcnQsIFVBUlRETV9SRik7CisJCQljID0gc3BbMF07CisJCQljb3VudC0tOworCQl9IGVsc2UgeworCQkJYyA9IE5PX1BPTExfQ0hBUjsKKwkJfQorCS8qIEZJRk8gaGFzIGEgd29yZCAqLworCX0gZWxzZSB7CisJCXNsb3AgPSBtc21fcmVhZChwb3J0LCBVQVJURE1fUkYpOworCQljID0gc3BbMF07CisJCWNvdW50ID0gc2l6ZW9mKHNsb3ApIC0gMTsKKwl9CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGludCBtc21fcG9sbF9nZXRfY2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXUzMiBpbXI7CisJaW50IGM7CisJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWltciA9IG1zbV9yZWFkKHBvcnQsIFVBUlRfSU1SKTsKKwltc21fd3JpdGUocG9ydCwgMCwgVUFSVF9JTVIpOworCisJaWYgKG1zbV9wb3J0LT5pc191YXJ0ZG0gPT0gVUFSVERNXzFQMykKKwkJYyA9IG1zbV9wb2xsX2dldF9jaGFyX2RtXzFwMyhwb3J0KTsKKwllbHNlCisJCWMgPSBtc21fcG9sbF9nZXRfY2hhcl9zaW5nbGUocG9ydCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCW1zbV93cml0ZShwb3J0LCBpbXIsIFVBUlRfSU1SKTsKKworCXJldHVybiBjOworfQorCitzdGF0aWMgdm9pZCBtc21fcG9sbF9wdXRfY2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBjaGFyIGMpCit7CisJdTMyIGltcjsKKwlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0ID0gVUFSVF9UT19NU00ocG9ydCk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJaW1yID0gbXNtX3JlYWQocG9ydCwgVUFSVF9JTVIpOworCW1zbV93cml0ZShwb3J0LCAwLCBVQVJUX0lNUik7CisKKwlpZiAobXNtX3BvcnQtPmlzX3VhcnRkbSkKKwkJcmVzZXRfZG1fY291bnQocG9ydCwgMSk7CisKKwkvKiBXYWl0IHVudGlsIEZJRk8gaXMgZW1wdHkgKi8KKwl3aGlsZSAoIShtc21fcmVhZChwb3J0LCBVQVJUX1NSKSAmIFVBUlRfU1JfVFhfUkVBRFkpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIFdyaXRlIGEgY2hhcmFjdGVyICovCisJbXNtX3dyaXRlKHBvcnQsIGMsIG1zbV9wb3J0LT5pc191YXJ0ZG0gPyBVQVJURE1fVEYgOiBVQVJUX1RGKTsKKworCS8qIFdhaXQgdW50aWwgRklGTyBpcyBlbXB0eSAqLworCXdoaWxlICghKG1zbV9yZWFkKHBvcnQsIFVBUlRfU1IpICYgVUFSVF9TUl9UWF9SRUFEWSkpCisJCWNwdV9yZWxheCgpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwltc21fd3JpdGUocG9ydCwgaW1yLCBVQVJUX0lNUik7CisKKwlyZXR1cm47Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBtc21fdWFydF9wb3BzID0gewogCS50eF9lbXB0eSA9IG1zbV90eF9lbXB0eSwKIAkuc2V0X21jdHJsID0gbXNtX3NldF9tY3RybCwKQEAgLTcyOSw2ICs4NTMsMTEgQEAKIAkuY29uZmlnX3BvcnQgPSBtc21fY29uZmlnX3BvcnQsCiAJLnZlcmlmeV9wb3J0ID0gbXNtX3ZlcmlmeV9wb3J0LAogCS5wbSA9IG1zbV9wb3dlciwKKyNpZmRlZiBDT05GSUdfQ09OU09MRV9QT0xMCisJLnBvbGxfaW5pdCA9IG1zbV9wb2xsX2luaXQsCisJLnBvbGxfZ2V0X2NoYXIJPSBtc21fcG9sbF9nZXRfY2hhciwKKwkucG9sbF9wdXRfY2hhcgk9IG1zbV9wb2xsX3B1dF9jaGFyLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IG1zbV9wb3J0IG1zbV91YXJ0X3BvcnRzW10gPSB7CkBAIC05MDAsNyArMTAyOSwxMCBAQAogc3RhdGljIGF0b21pY190IG1zbV91YXJ0X25leHRfaWQgPSBBVE9NSUNfSU5JVCgwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3VhcnRkbV90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtIiB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjEiLCAuZGF0YSA9ICh2b2lkICopVUFSVERNXzFQMSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjIiLCAuZGF0YSA9ICh2b2lkICopVUFSVERNXzFQMiB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjMiLCAuZGF0YSA9ICh2b2lkICopVUFSVERNXzFQMyB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjQiLCAuZGF0YSA9ICh2b2lkICopVUFSVERNXzFQNCB9LAogCXsgfQogfTsKIApAQCAtOTA5LDYgKzEwNDEsNyBAQAogCXN0cnVjdCBtc21fcG9ydCAqbXNtX3BvcnQ7CiAJc3RydWN0IHJlc291cmNlICpyZXNvdXJjZTsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOwogCWludCBpcnE7CiAKIAlpZiAocGRldi0+aWQgPT0gLTEpCkBAIC05MjMsOCArMTA1Niw5IEBACiAJcG9ydC0+ZGV2ID0gJnBkZXYtPmRldjsKIAltc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOwogCi0JaWYgKG9mX21hdGNoX2RldmljZShtc21fdWFydGRtX3RhYmxlLCAmcGRldi0+ZGV2KSkKLQkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9IDE7CisJaWQgPSBvZl9tYXRjaF9kZXZpY2UobXNtX3VhcnRkbV90YWJsZSwgJnBkZXYtPmRldik7CisJaWYgKGlkKQorCQltc21fcG9ydC0+aXNfdWFydGRtID0gKHVuc2lnbmVkIGxvbmcpaWQtPmRhdGE7CiAJZWxzZQogCQltc21fcG9ydC0+aXNfdWFydGRtID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuaCBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmgKaW5kZXggNDY5ZmRhNS4uMWU5YjY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5oCkBAIC01OSw2ICs1OSw3IEBACiAjZGVmaW5lIFVBUlRfQ1JfQ01EX1JFU0VUX1JGUgkJKDE0IDw8IDQpCiAjZGVmaW5lIFVBUlRfQ1JfQ01EX1BST1RFQ1RJT05fRU4JKDE2IDw8IDQpCiAjZGVmaW5lIFVBUlRfQ1JfQ01EX1NUQUxFX0VWRU5UX0VOQUJMRQkoODAgPDwgNCkKKyNkZWZpbmUgVUFSVF9DUl9DTURfRk9SQ0VfU1RBTEUJCSg0IDw8IDgpCiAjZGVmaW5lIFVBUlRfQ1JfQ01EX1JFU0VUX1RYX1JFQURZCSgzIDw8IDgpCiAjZGVmaW5lIFVBUlRfQ1JfVFhfRElTQUJMRQkJKDEgPDwgMykKICNkZWZpbmUgVUFSVF9DUl9UWF9FTkFCTEUJCSgxIDw8IDIpCkBAIC0xMTMsNiArMTE0LDE0IEBACiAjZGVmaW5lIEdTQklfUFJPVE9DT0xfVUFSVAkweDQwCiAjZGVmaW5lIEdTQklfUFJPVE9DT0xfSURMRQkweDAKIAorI2RlZmluZSBVQVJURE1fUlhGUwkJMHg1MAorI2RlZmluZSBVQVJURE1fUlhGU19CVUZfU0hJRlQJMHg3CisjZGVmaW5lIFVBUlRETV9SWEZTX0JVRl9NQVNLCTB4NworCisjZGVmaW5lIFVBUlRETV9ETUVOCQkweDNDCisjZGVmaW5lIFVBUlRETV9ETUVOX1JYX1NDX0VOQUJMRSBCSVQoNSkKKyNkZWZpbmUgVUFSVERNX0RNRU5fVFhfU0NfRU5BQkxFIEJJVCg0KQorCiAjZGVmaW5lIFVBUlRETV9ETVJYCQkweDM0CiAjZGVmaW5lIFVBUlRETV9OQ0ZfVFgJCTB4NDAKICNkZWZpbmUgVUFSVERNX1JYX1RPVEFMX1NOQVAJMHgzOApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb21hcC1zZXJpYWwuYwppbmRleCA3N2YwMzUxLi5kZDhiMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvb21hcC1zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb21hcC1zZXJpYWwuYwpAQCAtMzQyLDcgKzM0MiwxNCBAQAogCiAJaWYgKCh1cC0+cnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVfRU5BQkxFRCkgJiYKIAkgICAgISh1cC0+cnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVfUlhfRFVSSU5HX1RYKSkgewotCQl1cC0+aWVyID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKKwkJLyoKKwkJICogRW1wdHkgdGhlIFJYIEZJRk8sIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhbnl0aGluZworCQkgKiByZWNlaXZlZCBkdXJpbmcgdGhlIGhhbGYtZHVwbGV4IHRyYW5zbWlzc2lvbi4KKwkJICovCisJCXNlcmlhbF9vdXQodXAsIFVBUlRfRkNSLCB1cC0+ZmNyIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUik7CisJCS8qIFJlLWVuYWJsZSBSWCBpbnRlcnJ1cHRzICovCisJCXVwLT5pZXIgfD0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKKwkJdXAtPnBvcnQucmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9EUjsKIAkJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogCX0KIApAQCAtMzU1LDcgKzM2Miw3IEBACiAJc3RydWN0IHVhcnRfb21hcF9wb3J0ICp1cCA9IHRvX3VhcnRfb21hcF9wb3J0KHBvcnQpOwogCiAJcG1fcnVudGltZV9nZXRfc3luYyh1cC0+ZGV2KTsKLQl1cC0+aWVyICY9IH5VQVJUX0lFUl9STFNJOworCXVwLT5pZXIgJj0gfihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJKTsKIAl1cC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrICY9IH5VQVJUX0xTUl9EUjsKIAlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgdXAtPmllcik7CiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSh1cC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMKaW5kZXggOGZhMTEzNC4uMDkzMWIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMKQEAgLTE3NjIsNyArMTc2Miw5IEBACiAJaW50IGZpZm9zaXplOwogCWludCBwb3J0X3R5cGU7CiAJc3RydWN0IHBjaF91YXJ0X2RyaXZlcl9kYXRhICpib2FyZDsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAljaGFyIG5hbWVbMzJdOwkvKiBmb3IgZGVidWdmcyBmaWxlIG5hbWUgKi8KKyNlbmRpZgogCiAJYm9hcmQgPSAmZHJ2X2RhdFtpZC0+ZHJpdmVyX2RhdGFdOwogCXBvcnRfdHlwZSA9IGJvYXJkLT5wb3J0X3R5cGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYwppbmRleCA5Y2Q3MDZkLi4yM2Y0NTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKQEAgLTEyODIsNiArMTI4MiwxNCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIHByb2JlX2VycjsKIAorCWlmICghczNjMjR4eF91YXJ0X2Rydi5zdGF0ZSkgeworCQlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmczNjMjR4eF91YXJ0X2Rydik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBTYW1zdW5nIFVBUlQgZHJpdmVyXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAlkYmcoIiVzOiBhZGRpbmcgcG9ydFxuIiwgX19mdW5jX18pOwogCXVhcnRfYWRkX29uZV9wb3J0KCZzM2MyNHh4X3VhcnRfZHJ2LCAmb3VycG9ydC0+cG9ydCk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJm91cnBvcnQtPnBvcnQpOwpAQCAtMTMyMSw2ICsxMzI5LDggQEAKIAkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnMzYzI0eHhfdWFydF9kcnYsIHBvcnQpOwogCX0KIAorCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4MjAsMzUgKzE4MzAsNyBAQAogCX0sCiB9OwogCi0vKiBtb2R1bGUgaW5pdGlhbGlzYXRpb24gY29kZSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X3NlcmlhbF9tb2Rpbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZzM2MyNHh4X3VhcnRfZHJ2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBTYW1zdW5nIFVBUlQgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNhbXN1bmdfc2VyaWFsX2RyaXZlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyXG4iKTsKLQkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmczNjMjR4eF91YXJ0X2Rydik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHMzYzI0eHhfc2VyaWFsX21vZGV4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2Ftc3VuZ19zZXJpYWxfZHJpdmVyKTsKLQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzM2MyNHh4X3VhcnRfZHJ2KTsKLX0KLQotbW9kdWxlX2luaXQoczNjMjR4eF9zZXJpYWxfbW9kaW5pdCk7Ci1tb2R1bGVfZXhpdChzM2MyNHh4X3NlcmlhbF9tb2RleGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2Ftc3VuZ19zZXJpYWxfZHJpdmVyKTsKIAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzYW1zdW5nLXVhcnQiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgU2VyaWFsIHBvcnQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IGVjZTIwNDkuLjJjZjU2NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0xMzE5LDkgKzEzMTksOSBAQAogCXVwb3J0ID0gc3RhdGUtPnVhcnRfcG9ydDsKIAlwb3J0ID0gJnN0YXRlLT5wb3J0OwogCi0JcHJfZGVidWcoInVhcnRfY2xvc2UoJWQpIGNhbGxlZFxuIiwgdXBvcnQtPmxpbmUpOworCXByX2RlYnVnKCJ1YXJ0X2Nsb3NlKCVkKSBjYWxsZWRcbiIsIHVwb3J0ID8gdXBvcnQtPmxpbmUgOiAtMSk7CiAKLQlpZiAodHR5X3BvcnRfY2xvc2Vfc3RhcnQocG9ydCwgdHR5LCBmaWxwKSA9PSAwKQorCWlmICghcG9ydC0+Y291bnQgfHwgdHR5X3BvcnRfY2xvc2Vfc3RhcnQocG9ydCwgdHR5LCBmaWxwKSA9PSAwKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtMTc2Miw3ICsxNzYyLDcgQEAKIH0KIAogLyoqCi0gKgl1YXJ0X3BhcnNlX29wdGlvbnMgLSBQYXJzZSBzZXJpYWwgcG9ydCBiYXVkL3Bhcml0eS9iaXRzL2Zsb3cgY29udHJvLgorICoJdWFydF9wYXJzZV9vcHRpb25zIC0gUGFyc2Ugc2VyaWFsIHBvcnQgYmF1ZC9wYXJpdHkvYml0cy9mbG93IGNvbnRyb2wuCiAgKglAb3B0aW9uczogcG9pbnRlciB0byBvcHRpb24gc3RyaW5nCiAgKglAYmF1ZDogcG9pbnRlciB0byBhbiAnaW50JyB2YXJpYWJsZSBmb3IgdGhlIGJhdWQgcmF0ZS4KICAqCUBwYXJpdHk6IHBvaW50ZXIgdG8gYW4gJ2ludCcgdmFyaWFibGUgZm9yIHRoZSBwYXJpdHkuCkBAIC0yNjA5LDcgKzI2MDksNyBAQAogCiAJLyoKIAkgKiBSZWdpc3RlciB0aGUgcG9ydCB3aGV0aGVyIGl0J3MgZGV0ZWN0ZWQgb3Igbm90LiAgVGhpcyBhbGxvd3MKLQkgKiBzZXRzZXJpYWwgdG8gYmUgdXNlZCB0byBhbHRlciB0aGlzIHBvcnRzIHBhcmFtZXRlcnMuCisJICogc2V0c2VyaWFsIHRvIGJlIHVzZWQgdG8gYWx0ZXIgdGhpcyBwb3J0J3MgcGFyYW1ldGVycy4KIAkgKi8KIAl0dHlfZGV2ID0gdHR5X3BvcnRfcmVnaXN0ZXJfZGV2aWNlX2F0dHIocG9ydCwgZHJ2LT50dHlfZHJpdmVyLAogCQkJdXBvcnQtPmxpbmUsIHVwb3J0LT5kZXYsIHBvcnQsIHR0eV9kZXZfYXR0cl9ncm91cHMpOwpAQCAtMjY0NSw2ICsyNjQ1LDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSBkcnYtPnN0YXRlICsgdXBvcnQtPmxpbmU7CiAJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnN0YXRlLT5wb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHJldCA9IDA7CiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwpAQCAtMjY3Myw4ICsyNjc0LDE3IEBACiAJICovCiAJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGRydi0+dHR5X2RyaXZlciwgdXBvcnQtPmxpbmUpOwogCi0JaWYgKHBvcnQtPnR0eSkKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KHBvcnQpOworCWlmICh0dHkpIHsKIAkJdHR5X3ZoYW5ndXAocG9ydC0+dHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcG9ydCBpcyB1c2VkIGFzIGEgY29uc29sZSwgdW5yZWdpc3RlciBpdAorCSAqLworCWlmICh1YXJ0X2NvbnNvbGUodXBvcnQpKQorCQl1bnJlZ2lzdGVyX2NvbnNvbGUodXBvcnQtPmNvbnMpOwogCiAJLyoKIAkgKiBGcmVlIHRoZSBwb3J0IElPIGFuZCBtZW1vcnkgcmVzb3VyY2VzLCBpZiBhbnkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKaW5kZXggN2UwYjYyNi4uODgyMzZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJCWNmZy0+cmVndHlwZSA9IFNDSXhfSFNDSUZfUkVHVFlQRTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBwcm9iZSByZWdpc3RlciBtYXAgZm9yIGdpdmVuIHBvcnRcbiIpOworCQlwcl9lcnIoIkNhbid0IHByb2JlIHJlZ2lzdGVyIG1hcCBmb3IgZ2l2ZW4gcG9ydFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzg4LDcgKzc4OCw3IEBACiAJCWlmICh0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0cG9ydCwgMCwgVFRZX09WRVJSVU4pKQogCQkJY29waWVkKys7CiAKLQkJZGV2X25vdGljZShwb3J0LT5kZXYsICJvdmVycnVuIGVycm9yIik7CisJCWRldl9ub3RpY2UocG9ydC0+ZGV2LCAib3ZlcnJ1biBlcnJvclxuIik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIFNDeFNSX0ZFUihwb3J0KSkgewpAQCAtODMwLDcgKzgzMCw3IEBACiAJCWlmICh0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0cG9ydCwgMCwgVFRZX1BBUklUWSkpCiAJCQljb3BpZWQrKzsKIAotCQlkZXZfbm90aWNlKHBvcnQtPmRldiwgInBhcml0eSBlcnJvciIpOworCQlkZXZfbm90aWNlKHBvcnQtPmRldiwgInBhcml0eSBlcnJvclxuIik7CiAJfQogCiAJaWYgKGNvcGllZCkKQEAgLTkxMSw3ICs5MTEsNyBAQAogCQkvKiBEaXNhYmxlIGZ1dHVyZSBSeCBpbnRlcnJ1cHRzICovCiAJCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKSB7CiAJCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQkJCXNjciB8PSAweDQwMDA7CisJCQlzY3IgfD0gU0NTQ1JfUkRSUUU7CiAJCX0gZWxzZSB7CiAJCQlzY3IgJj0gflNDU0NSX1JJRTsKIAkJfQpAQCAtMTE5OSw3ICsxMTk5LDkgQEAKIAkJICovCiAJCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgU0NGQ1IpOwogCQlpZiAocmVnLT5zaXplKQotCQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDRkNSLCBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ0ZDUikgfCAxKTsKKwkJCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ0ZDUiwKKwkJCQkJc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NGQ1IpIHwKKwkJCQkJU0NGQ1JfTE9PUCk7CiAJfQogfQogCkBAIC0xMjg5LDcgKzEyOTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNvdW50OwogCi0JZGV2X2RiZyhwb3J0LT5kZXYsICIlcyglZCkgYWN0aXZlICMlZFxuIiwgX19mdW5jX18sIHBvcnQtPmxpbmUsIHMtPmFjdGl2ZV9yeCk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlcyglZCkgYWN0aXZlICMlZFxuIiwKKwkJX19mdW5jX18sIHBvcnQtPmxpbmUsIHMtPmFjdGl2ZV9yeCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMzY1LDggKzEzNjgsOCBAQAogCQkJc2NpX3J4X2RtYV9yZWxlYXNlKHMsIHRydWUpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWRldl9kYmcocy0+cG9ydC5kZXYsICIlcygpOiBjb29raWUgJWQgdG8gIyVkXG4iLCBfX2Z1bmNfXywKLQkJCXMtPmNvb2tpZV9yeFtpXSwgaSk7CisJCWRldl9kYmcocy0+cG9ydC5kZXYsICIlcygpOiBjb29raWUgJWQgdG8gIyVkXG4iLAorCQkJX19mdW5jX18sIHMtPmNvb2tpZV9yeFtpXSwgaSk7CiAJfQogCiAJcy0+YWN0aXZlX3J4ID0gcy0+Y29va2llX3J4WzBdOwpAQCAtMTQyNSw4ICsxNDI4LDggQEAKIAogCXMtPmFjdGl2ZV9yeCA9IHMtPmNvb2tpZV9yeFshbmV3XTsKIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6IGNvb2tpZSAlZCAjJWQsIG5ldyBhY3RpdmUgIyVkXG4iLCBfX2Z1bmNfXywKLQkJcy0+Y29va2llX3J4W25ld10sIG5ldywgcy0+YWN0aXZlX3J4KTsKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBjb29raWUgJWQgIyVkLCBuZXcgYWN0aXZlICMlZFxuIiwKKwkJX19mdW5jX18sIHMtPmNvb2tpZV9yeFtuZXddLCBuZXcsIHMtPmFjdGl2ZV9yeCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdvcmtfZm5fdHgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTQ3OSw4ICsxNDgyLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6ICVwOiAlZC4uLiVkLCBjb29raWUgJWRcbiIsIF9fZnVuY19fLAotCQl4bWl0LT5idWYsIHhtaXQtPnRhaWwsIHhtaXQtPmhlYWQsIHMtPmNvb2tpZV90eCk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogJXA6ICVkLi4uJWQsIGNvb2tpZSAlZFxuIiwKKwkJX19mdW5jX18sIHhtaXQtPmJ1ZiwgeG1pdC0+dGFpbCwgeG1pdC0+aGVhZCwgcy0+Y29va2llX3R4KTsKIAogCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOwogfQpAQCAtMTQ5NSw5ICsxNDk4LDkgQEAKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikgewogCQl1MTYgbmV3LCBzY3IgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ1NDUik7CiAJCWlmIChzLT5jaGFuX3R4KQotCQkJbmV3ID0gc2NyIHwgMHg4MDAwOworCQkJbmV3ID0gc2NyIHwgU0NTQ1JfVERSUUU7CiAJCWVsc2UKLQkJCW5ldyA9IHNjciAmIH4weDgwMDA7CisJCQluZXcgPSBzY3IgJiB+U0NTQ1JfVERSUUU7CiAJCWlmIChuZXcgIT0gc2NyKQogCQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDU0NSLCBuZXcpOwogCX0KQEAgLTE1MjQsNyArMTUyNyw3IEBACiAJY3RybCA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFNDU0NSKTsKIAogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKQotCQljdHJsICY9IH4weDgwMDA7CisJCWN0cmwgJj0gflNDU0NSX1REUlFFOwogCiAJY3RybCAmPSB+U0NTQ1JfVElFOwogCkBAIC0xNTM4LDcgKzE1NDEsNyBAQAogCWN0cmwgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ1NDUikgfCBwb3J0X3J4X2lycV9tYXNrKHBvcnQpOwogCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpCi0JCWN0cmwgJj0gfjB4NDAwMDsKKwkJY3RybCAmPSB+U0NTQ1JfUkRSUUU7CiAKIAlzZXJpYWxfcG9ydF9vdXQocG9ydCwgU0NTQ1IsIGN0cmwpOwogfQpAQCAtMTU1MCw3ICsxNTUzLDcgQEAKIAljdHJsID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NTQ1IpOwogCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpCi0JCWN0cmwgJj0gfjB4NDAwMDsKKwkJY3RybCAmPSB+U0NTQ1JfUkRSUUU7CiAKIAljdHJsICY9IH5wb3J0X3J4X2lycV9tYXNrKHBvcnQpOwogCkBAIC0xNTk5LDggKzE2MDIsOCBAQAogewogCXN0cnVjdCBzaF9kbWFlX3NsYXZlICpwYXJhbSA9IHNsYXZlOwogCi0JZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgIiVzOiBzbGF2ZSBJRCAlZFxuIiwgX19mdW5jX18sCi0JCXBhcmFtLT5zaGRtYV9zbGF2ZS5zbGF2ZV9pZCk7CisJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgIiVzOiBzbGF2ZSBJRCAlZFxuIiwKKwkJX19mdW5jX18sIHBhcmFtLT5zaGRtYV9zbGF2ZS5zbGF2ZV9pZCk7CiAKIAljaGFuLT5wcml2YXRlID0gJnBhcmFtLT5zaGRtYV9zbGF2ZTsKIAlyZXR1cm4gdHJ1ZTsKQEAgLTE2MTMsNyArMTYxNiw3IEBACiAJdTE2IHNjciA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFNDU0NSKTsKIAogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKSB7Ci0JCXNjciAmPSB+MHg0MDAwOworCQlzY3IgJj0gflNDU0NSX1JEUlFFOwogCQllbmFibGVfaXJxKHMtPmlycXNbU0NJeF9SWElfSVJRXSk7CiAJfQogCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ1NDUiwgc2NyIHwgU0NTQ1JfUklFKTsKQEAgLTE2MjksOCArMTYzMiw3IEBACiAJZG1hX2NhcF9tYXNrX3QgbWFzazsKIAlpbnQgbmVudDsKIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6IHBvcnQgJWRcbiIsIF9fZnVuY19fLAotCQlwb3J0LT5saW5lKTsKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBwb3J0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydC0+bGluZSk7CiAKIAlpZiAocy0+Y2ZnLT5kbWFfc2xhdmVfdHggPD0gMCB8fCBzLT5jZmctPmRtYV9zbGF2ZV9yeCA8PSAwKQogCQlyZXR1cm47CkBAIC0xNjU4LDcgKzE2NjAsOCBAQAogCQlpZiAoIW5lbnQpCiAJCQlzY2lfdHhfZG1hX3JlbGVhc2UocywgZmFsc2UpOwogCQllbHNlCi0JCQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBtYXBwZWQgJWRAJXAgdG8gJXBhZFxuIiwgX19mdW5jX18sCisJCQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBtYXBwZWQgJWRAJXAgdG8gJXBhZFxuIiwKKwkJCQlfX2Z1bmNfXywKIAkJCQlzZ19kbWFfbGVuKCZzLT5zZ190eCksIHBvcnQtPnN0YXRlLT54bWl0LmJ1ZiwKIAkJCQkmc2dfZG1hX2FkZHJlc3MoJnMtPnNnX3R4KSk7CiAKQEAgLTE4NzAsMTMgKzE4NzMsMTMgQEAKIAlzbXJfdmFsID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NTTVIpICYgMzsKIAogCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSA9PSBDUzcpCi0JCXNtcl92YWwgfD0gMHg0MDsKKwkJc21yX3ZhbCB8PSBTQ1NNUl9DSFI7CiAJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpCi0JCXNtcl92YWwgfD0gMHgyMDsKKwkJc21yX3ZhbCB8PSBTQ1NNUl9QRTsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKLQkJc21yX3ZhbCB8PSAweDMwOworCQlzbXJfdmFsIHw9IFNDU01SX1BFIHwgU0NTTVJfT0REOwogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQlzbXJfdmFsIHw9IDB4MDg7CisJCXNtcl92YWwgfD0gU0NTTVJfU1RPUDsKIAogCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CiAKQEAgLTE4ODQsNyArMTg4Nyw3IEBACiAJCV9fZnVuY19fLCBzbXJfdmFsLCBja3MsIHQsIHMtPmNmZy0+c2NzY3IpOwogCiAJaWYgKHQgPj0gMCkgewotCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgU0NTTVIsIChzbXJfdmFsICYgfjMpIHwgY2tzKTsKKwkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDU01SLCAoc21yX3ZhbCAmIH5TQ1NNUl9DS1MpIHwgY2tzKTsKIAkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDQlJSLCB0KTsKIAkJcmVnID0gc2NpX2dldHJlZyhwb3J0LCBIU1NSUik7CiAJCWlmIChyZWctPnNpemUpCkBAIC0xOTMyLDggKzE5MzUsNyBAQAogCWlmIChzLT5jaGFuX3J4KSB7CiAJCXMtPnJ4X3RpbWVvdXQgPSAocG9ydC0+dGltZW91dCAtIEhaIC8gNTApICogcy0+YnVmX2xlbl9yeCAqIDMgLwogCQkJcG9ydC0+Zmlmb3NpemUgLyAyOwotCQlkZXZfZGJnKHBvcnQtPmRldiwKLQkJCSJETUEgUnggdC1vdXQgJXVtcywgdHR5IHQtb3V0ICV1IGppZmZpZXNcbiIsCisJCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIFJ4IHQtb3V0ICV1bXMsIHR0eSB0LW91dCAldSBqaWZmaWVzXG4iLAogCQkJcy0+cnhfdGltZW91dCAqIDEwMDAgLyBIWiwgcG9ydC0+dGltZW91dCk7CiAJCWlmIChzLT5yeF90aW1lb3V0IDwgbXNlY3NfdG9famlmZmllcygyMCkpCiAJCQlzLT5yeF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CkBAIC0xOTUyLDcgKzE5NTQsNyBAQAogCXN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQgPSB0b19zY2lfcG9ydChwb3J0KTsKIAogCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIDM6CisJY2FzZSBVQVJUX1BNX1NUQVRFX09GRjoKIAkJc2NpX3BvcnRfZGlzYWJsZShzY2lfcG9ydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMDE3LDcgKzIwMTksNyBAQAogCQkgKiBuZWVkIHRvIGRvIGFueSByZW1hcHBpbmcsIGp1c3QgY2FzdCB0aGUgY29va2llCiAJCSAqIGRpcmVjdGx5LgogCQkgKi8KLQkJcG9ydC0+bWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKilwb3J0LT5tYXBiYXNlOworCQlwb3J0LT5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSh1aW50cHRyX3QpcG9ydC0+bWFwYmFzZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIzODgsOCArMjM5MCw3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFICovCiAKLXN0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPQotCUtFUk5fSU5GTyAiU3VwZXJIIChIKVNDSShGKSBkcml2ZXIgaW5pdGlhbGl6ZWRcbiI7CitzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSBfX2luaXRjb25zdCA9ICJTdXBlckggKEgpU0NJKEYpIGRyaXZlciBpbml0aWFsaXplZCI7CiAKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2NpX3VhcnRfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKQEAgLTI0MjMsMjUgKzI0MjQsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3NjaV9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmIiwKLQkJLmRhdGEgPSAodm9pZCAqKSYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKKwkJLmRhdGEgPSAmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CiAJCQkudHlwZSA9IFBPUlRfU0NJRiwKIAkJCS5yZWd0eXBlID0gU0NJeF9TSDRfU0NJRl9SRUdUWVBFLAogCQl9LAogCX0sIHsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmYSIsCi0JCS5kYXRhID0gKHZvaWQgKikmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CisJCS5kYXRhID0gJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgewogCQkJLnR5cGUgPSBQT1JUX1NDSUZBLAogCQkJLnJlZ3R5cGUgPSBTQ0l4X1NDSUZBX1JFR1RZUEUsCiAJCX0sCiAJfSwgewogCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNjaWZiIiwKLQkJLmRhdGEgPSAodm9pZCAqKSYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKKwkJLmRhdGEgPSAmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CiAJCQkudHlwZSA9IFBPUlRfU0NJRkIsCiAJCQkucmVndHlwZSA9IFNDSXhfU0NJRkJfUkVHVFlQRSwKIAkJfSwKIAl9LCB7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsaHNjaWYiLAotCQkuZGF0YSA9ICh2b2lkICopJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgeworCQkuZGF0YSA9ICYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKIAkJCS50eXBlID0gUE9SVF9IU0NJRiwKIAkJCS5yZWd0eXBlID0gU0NJeF9IU0NJRl9SRUdUWVBFLAogCQl9LApAQCAtMjUwMSwxMSArMjUwMiw5IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAodW5saWtlbHkoaW5kZXggPj0gU0NJX05QT1JUUykpIHsKLQkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHBvcnQgIgotCQkJICAgIiVkIHdoZW4gb25seSAlZCBhcmUgYXZhaWxhYmxlLlxuIiwKKwkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHBvcnQgJWQgd2hlbiBvbmx5ICVkIGFyZSBhdmFpbGFibGVcbiIsCiAJCQkgICBpbmRleCsxLCBTQ0lfTlBPUlRTKTsKLQkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJDb25zaWRlciBidW1waW5nICIKLQkJCSAgICJDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUyFcbiIpOworCQlkZXZfbm90aWNlKCZkZXYtPmRldiwgIkNvbnNpZGVyIGJ1bXBpbmcgQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFMhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTYzLDYgKzI1NjIsNyBAQAogCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnNwLT5mcmVxX3RyYW5zaXRpb24sCiAJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZzcC0+cG9ydCk7CiAJCXNjaV9jbGVhbnVwX3NpbmdsZShzcCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMjYxNCw3ICsyNjE0LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcHJpbnRrKGJhbm5lcik7CisJcHJfaW5mbygiJXNcbiIsIGJhbm5lcik7CiAKIAlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2NpX3VhcnRfZHJpdmVyKTsKIAlpZiAobGlrZWx5KHJldCA9PSAwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5jCmluZGV4IGI3YmZlMjQuLjY4YjBmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2lyZnNvY191YXJ0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zaXJmc29jX2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApAQCAtMTczLDcgKzE3Miw3IEBACiAJc3RydWN0IHNpcmZzb2NfcmVnaXN0ZXIgKnVyZWcgPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3JlZzsKIAlzdHJ1Y3Qgc2lyZnNvY19pbnRfZW4gKnVpbnRfZW4gPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X2ludF9lbjsKIAotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkgeworCWlmIChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pIHsKIAkJaWYgKHNpcmZwb3J0LT50eF9kbWFfc3RhdGUgPT0gVFhfRE1BX1JVTk5JTkcpIHsKIAkJCWRtYWVuZ2luZV9wYXVzZShzaXJmcG9ydC0+dHhfZG1hX2NoYW4pOwogCQkJc2lyZnBvcnQtPnR4X2RtYV9zdGF0ZSA9IFRYX0RNQV9QQVVTRTsKQEAgLTI4OCw3ICsyODcsNyBAQAogCXN0cnVjdCBzaXJmc29jX3VhcnRfcG9ydCAqc2lyZnBvcnQgPSB0b19zaXJmcG9ydChwb3J0KTsKIAlzdHJ1Y3Qgc2lyZnNvY19yZWdpc3RlciAqdXJlZyA9ICZzaXJmcG9ydC0+dWFydF9yZWctPnVhcnRfcmVnOwogCXN0cnVjdCBzaXJmc29jX2ludF9lbiAqdWludF9lbiA9ICZzaXJmcG9ydC0+dWFydF9yZWctPnVhcnRfaW50X2VuOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKQogCQlzaXJmc29jX3VhcnRfdHhfd2l0aF9kbWEoc2lyZnBvcnQpOwogCWVsc2UgewogCQlzaXJmc29jX3VhcnRfcGlvX3R4X2NoYXJzKHNpcmZwb3J0LCAxKTsKQEAgLTMxMCw3ICszMDksNyBAQAogCXN0cnVjdCBzaXJmc29jX2ludF9lbiAqdWludF9lbiA9ICZzaXJmcG9ydC0+dWFydF9yZWctPnVhcnRfaW50X2VuOwogCiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIDApOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+cnhfZG1hX25vKSkgeworCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pIHsKIAkJaWYgKCFzaXJmcG9ydC0+aXNfbWFyY28pCiAJCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfaW50X2VuX3JlZywKIAkJCQlyZF9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfaW50X2VuX3JlZykgJgpAQCAtNjc1LDcgKzY3NCw3IEBACiAJCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UocG9ydCwgY3RzX3N0YXR1cyk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwogCX0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnJ4X2RtYV9ubykpIHsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7CiAJCWlmIChpbnRyX3N0YXR1cyAmIHVpbnRfc3QtPnNpcmZzb2NfcnhfdGltZW91dCkKIAkJCXNpcmZzb2NfdWFydF9oYW5kbGVfcnhfdG1vKHNpcmZwb3J0KTsKIAkJaWYgKGludHJfc3RhdHVzICYgdWludF9zdC0+c2lyZnNvY19yeF9kb25lKQpAQCAtNjg2LDcgKzY4NSw3IEBACiAJCQkJCVNJUkZTT0NfVUFSVF9JT19SWF9NQVhfQ05UKTsKIAl9CiAJaWYgKGludHJfc3RhdHVzICYgdWludF9zdC0+c2lyZnNvY190eGZpZm9fZW1wdHkpIHsKLQkJaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT50eF9kbWFfbm8pKQorCQlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKQogCQkJc2lyZnNvY191YXJ0X3R4X3dpdGhfZG1hKHNpcmZwb3J0KTsKIAkJZWxzZSB7CiAJCQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZChwb3J0KSkgewpAQCAtNzc4LDcgKzc3Nyw3IEBACiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIFNJUkZVQVJUX0ZJRk9fUkVTRVQpOwogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9maWZvX29wLCAwKTsKIAl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19vcCwgU0lSRlVBUlRfRklGT19TVEFSVCk7Ci0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT5yeF9kbWFfbm8pKQorCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pCiAJCXNpcmZzb2NfdWFydF9zdGFydF9uZXh0X3J4X2RtYShwb3J0KTsKIAllbHNlIHsKIAkJaWYgKCFzaXJmcG9ydC0+aXNfbWFyY28pCkBAIC0xMDE0LDExICsxMDEzLDExIEBACiAJCQkoc2FtcGxlX2Rpdl9yZWcgJiBTSVJGU09DX1VTUF9BU1lOQ19ESVYyX01BU0spIDw8CiAJCQlTSVJGU09DX1VTUF9BU1lOQ19ESVYyX09GRlNFVCk7CiAJfQotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKQogCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfdHhfZG1hX2lvX2N0cmwsIFNJUkZVQVJUX0RNQV9NT0RFKTsKIAllbHNlCiAJCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY190eF9kbWFfaW9fY3RybCwgU0lSRlVBUlRfSU9fTU9ERSk7Ci0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT5yeF9kbWFfbm8pKQorCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pCiAJCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9kbWFfaW9fY3RybCwgU0lSRlVBUlRfRE1BX01PREUpOwogCWVsc2UKIAkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2RtYV9pb19jdHJsLCBTSVJGVUFSVF9JT19NT0RFKTsKQEAgLTEwNDksOTMgKzEwNDgsNiBAQAogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZnBvcnQtPmNsayk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2lyZnNvY191YXJ0X2luaXRfdHhfZG1hKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCA9IHRvX3NpcmZwb3J0KHBvcnQpOwotCWRtYV9jYXBfbWFza190IGRtYV9tYXNrOwotCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHR4X3Nsdl9jZmcgPSB7Ci0JCS5kc3RfbWF4YnVyc3QgPSAyLAotCX07Ci0KLQlkbWFfY2FwX3plcm8oZG1hX21hc2spOwotCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgZG1hX21hc2spOwotCXNpcmZwb3J0LT50eF9kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX21hc2ssCi0JCShkbWFfZmlsdGVyX2ZuKXNpcmZzb2NfZG1hX2ZpbHRlcl9pZCwKLQkJKHZvaWQgKilzaXJmcG9ydC0+dHhfZG1hX25vKTsKLQlpZiAoIXNpcmZwb3J0LT50eF9kbWFfY2hhbikgewotCQlkZXZfZXJyKHBvcnQtPmRldiwgIlVhcnQgUmVxdWVzdCBEbWEgQ2hhbm5lbCBGYWlsICVkXG4iLAotCQkJCQlzaXJmcG9ydC0+dHhfZG1hX25vKTsKLQkJcmV0dXJuICAtRVBST0JFX0RFRkVSOwotCX0KLQlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNpcmZwb3J0LT50eF9kbWFfY2hhbiwgJnR4X3Nsdl9jZmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2lyZnNvY191YXJ0X2luaXRfcnhfZG1hKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCA9IHRvX3NpcmZwb3J0KHBvcnQpOwotCWRtYV9jYXBfbWFza190IGRtYV9tYXNrOwotCWludCByZXQ7Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgc2x2X2NmZyA9IHsKLQkJLnNyY19tYXhidXJzdCA9IDIsCi0JfTsKLQotCWRtYV9jYXBfemVybyhkbWFfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBkbWFfbWFzayk7Ci0Jc2lyZnBvcnQtPnJ4X2RtYV9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfbWFzaywKLQkJCQkJKGRtYV9maWx0ZXJfZm4pc2lyZnNvY19kbWFfZmlsdGVyX2lkLAotCQkJCQkodm9pZCAqKXNpcmZwb3J0LT5yeF9kbWFfbm8pOwotCWlmICghc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7Ci0JCWRldl9lcnIocG9ydC0+ZGV2LCAiVWFydCBSZXF1ZXN0IERtYSBDaGFubmVsIEZhaWwgJWRcbiIsCi0JCQkJc2lyZnBvcnQtPnJ4X2RtYV9ubyk7Ci0JCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCWdvdG8gcmVxdWVzdF9lcnI7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKSB7Ci0JCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYgPQotCQkJZG1hX2FsbG9jX2NvaGVyZW50KHBvcnQtPmRldiwgU0lSRlNPQ19SWF9ETUFfQlVGX1NJWkUsCi0JCQkmc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZikgewotCQkJZGV2X2Vycihwb3J0LT5kZXYsICJVYXJ0IGFsbG9jIGJ1ZmEgZmFpbGVkXG4iKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGFsbG9jX2NvaGVyZW50X2VycjsKLQkJfQotCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuaGVhZCA9Ci0JCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQudGFpbCA9IDA7Ci0JfQotCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuLCAmc2x2X2NmZyk7Ci0KLQlyZXR1cm4gMDsKLWFsbG9jX2NvaGVyZW50X2VycjoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlkbWFfZnJlZV9jb2hlcmVudChwb3J0LT5kZXYsIFNJUkZTT0NfUlhfRE1BX0JVRl9TSVpFLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbal0ueG1pdC5idWYsCi0JCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tqXS5kbWFfYWRkcik7Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOwotcmVxdWVzdF9lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc2lyZnNvY191YXJ0X3VuaW5pdF90eF9kbWEoc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCkKLXsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pOwotCWRtYV9yZWxlYXNlX2NoYW5uZWwoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKLX0KLQotc3RhdGljIHZvaWQgc2lyZnNvY191YXJ0X3VuaW5pdF9yeF9kbWEoc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnNpcmZwb3J0LT5wb3J0OwotCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNpcmZwb3J0LT5yeF9kbWFfY2hhbik7Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOwotCWZvciAoaSA9IDA7IGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKQotCQlkbWFfZnJlZV9jb2hlcmVudChwb3J0LT5kZXYsIFNJUkZTT0NfUlhfRE1BX0JVRl9TSVpFLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYsCi0JCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgc2lyZnNvY191YXJ0X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgc2lyZnNvY191YXJ0X3BvcnQgKnNpcmZwb3J0CT0gdG9fc2lyZnBvcnQocG9ydCk7CkBAIC0xMTc0LDE4ICsxMDg2LDEyIEBACiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIDApOwogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY190eF9maWZvX2N0cmwsIFNJUkZVQVJUX0ZJRk9fVEhEKHBvcnQpKTsKIAl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19jdHJsLCBTSVJGVUFSVF9GSUZPX1RIRChwb3J0KSk7Ci0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnJ4X2RtYV9ubykpIHsKLQkJcmV0ID0gc2lyZnNvY191YXJ0X2luaXRfcnhfZG1hKHBvcnQpOwotCQlpZiAocmV0KQotCQkJZ290byBpbml0X3J4X2VycjsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKQogCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19sZXZlbF9jaGssCi0JCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfU0MocG9ydC0+bGluZSwgMHg0KSB8Ci0JCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfTEMocG9ydC0+bGluZSwgMHhlKSB8Ci0JCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfSEMocG9ydC0+bGluZSwgMHgxYikpOwotCX0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnR4X2RtYV9ubykpIHsKLQkJc2lyZnNvY191YXJ0X2luaXRfdHhfZG1hKHBvcnQpOworCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfU0MocG9ydC0+bGluZSwgMHg0KSB8CisJCQlTSVJGVUFSVF9SWF9GSUZPX0NIS19MQyhwb3J0LT5saW5lLCAweGUpIHwKKwkJCVNJUkZVQVJUX1JYX0ZJRk9fQ0hLX0hDKHBvcnQtPmxpbmUsIDB4MWIpKTsKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKSB7CiAJCXNpcmZwb3J0LT50eF9kbWFfc3RhdGUgPSBUWF9ETUFfSURMRTsKIAkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3R4X2ZpZm9fbGV2ZWxfY2hrLAogCQkJCVNJUkZVQVJUX1RYX0ZJRk9fQ0hLX1NDKHBvcnQtPmxpbmUsIDB4MWIpIHwKQEAgLTEyMzIsMTIgKzExMzgsOCBAQAogCQlncGlvX3NldF92YWx1ZShzaXJmcG9ydC0+cnRzX2dwaW8sIDEpOwogCQlmcmVlX2lycShncGlvX3RvX2lycShzaXJmcG9ydC0+Y3RzX2dwaW8pLCBzaXJmcG9ydCk7CiAJfQotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+cnhfZG1hX25vKSkKLQkJc2lyZnNvY191YXJ0X3VuaW5pdF9yeF9kbWEoc2lyZnBvcnQpOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkgewotCQlzaXJmc29jX3VhcnRfdW5pbml0X3R4X2RtYShzaXJmcG9ydCk7CisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKIAkJc2lyZnBvcnQtPnR4X2RtYV9zdGF0ZSA9IFRYX0RNQV9JRExFOwotCX0KIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKnNpcmZzb2NfdWFydF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xMzEzLDggKzEyMTUsOCBAQAogCXBvcnQtPmNvbnMgPSBjbzsKIAogCS8qIGRlZmF1bHQgY29uc29sZSB0eC9yeCB0cmFuc2ZlciB1c2luZyBpbyBtb2RlICovCi0Jc2lyZnBvcnQtPnJ4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47Ci0Jc2lyZnBvcnQtPnR4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47CisJc2lyZnBvcnQtPnJ4X2RtYV9jaGFuID0gTlVMTDsKKwlzaXJmcG9ydC0+dHhfZG1hX2NoYW4gPSBOVUxMOwogCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKHBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOwogfQogCkBAIC0xMzgyLDYgKzEyODQsMTMgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQ7CisJaW50IGksIGo7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgc2x2X2NmZyA9IHsKKwkJLnNyY19tYXhidXJzdCA9IDIsCisJfTsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eF9zbHZfY2ZnID0geworCQkuZHN0X21heGJ1cnN0ID0gMiwKKwl9OwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNpcmZzb2NfdWFydF9pZHMsIHBkZXYtPmRldi5vZl9ub2RlKTsKQEAgLTE0MDIsMjcgKzEzMTEsMTAgQEAKIAogCXNpcmZwb3J0LT5od19mbG93X2N0cmwgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCiAJCSJzaXJmLHVhcnQtaGFzLXJ0c2N0cyIpOwotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYscHJpbWEyLXVhcnQiKSkgeworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYscHJpbWEyLXVhcnQiKSkKIAkJc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3R5cGUgPSBTSVJGX1JFQUxfVUFSVDsKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSJzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwiLAotCQkJCSZzaXJmcG9ydC0+cnhfZG1hX25vKSkKLQkJCXNpcmZwb3J0LT5yeF9kbWFfbm8gPSBVTlZBTElEX0RNQV9DSEFOOwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCIsCi0JCQkJJnNpcmZwb3J0LT50eF9kbWFfbm8pKQotCQkJc2lyZnBvcnQtPnR4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47Ci0JfQogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYscHJpbWEyLXVzcC11YXJ0IikpIHsKIAkJc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3R5cGUgPQlTSVJGX1VTUF9VQVJUOwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInNpcmYsdXNwLWRtYS1yeC1jaGFubmVsIiwKLQkJCQkmc2lyZnBvcnQtPnJ4X2RtYV9ubykpCi0JCQlzaXJmcG9ydC0+cnhfZG1hX25vID0gVU5WQUxJRF9ETUFfQ0hBTjsKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSJzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCIsCi0JCQkJJnNpcmZwb3J0LT50eF9kbWFfbm8pKQotCQkJc2lyZnBvcnQtPnR4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47CiAJCWlmICghc2lyZnBvcnQtPmh3X2Zsb3dfY3RybCkKIAkJCWdvdG8gdXNwX25vX2Zsb3dfY29udHJvbDsKIAkJaWYgKG9mX2ZpbmRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsICJjdHMtZ3Bpb3MiLCBOVUxMKSkKQEAgLTE1MTUsOCArMTQwNywzMiBAQAogCQlnb3RvIHBvcnRfZXJyOwogCX0KIAotCXJldHVybiAwOworCXNpcmZwb3J0LT5yeF9kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwocG9ydC0+ZGV2LCAicngiKTsKKwlmb3IgKGkgPSAwOyBzaXJmcG9ydC0+cnhfZG1hX2NoYW4gJiYgaSA8IFNJUkZTT0NfUlhfTE9PUF9CVUZfQ05UOyBpKyspIHsKKwkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZiA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQocG9ydC0+ZGV2LCBTSVJGU09DX1JYX0RNQV9CVUZfU0laRSwKKwkJCSZzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuYnVmKSB7CisJCQlkZXZfZXJyKHBvcnQtPmRldiwgIlVhcnQgYWxsb2MgYnVmYSBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gYWxsb2NfY29oZXJlbnRfZXJyOworCQl9CisJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5oZWFkID0KKwkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC50YWlsID0gMDsKKwl9CisJaWYgKHNpcmZwb3J0LT5yeF9kbWFfY2hhbikKKwkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzaXJmcG9ydC0+cnhfZG1hX2NoYW4sICZzbHZfY2ZnKTsKKwlzaXJmcG9ydC0+dHhfZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHBvcnQtPmRldiwgInR4Iik7CisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKKwkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzaXJmcG9ydC0+dHhfZG1hX2NoYW4sICZ0eF9zbHZfY2ZnKTsKIAorCXJldHVybiAwOworYWxsb2NfY29oZXJlbnRfZXJyOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCWRtYV9mcmVlX2NvaGVyZW50KHBvcnQtPmRldiwgU0lSRlNPQ19SWF9ETUFfQlVGX1NJWkUsCisJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tqXS54bWl0LmJ1ZiwKKwkJCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2pdLmRtYV9hZGRyKTsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKHNpcmZwb3J0LT5yeF9kbWFfY2hhbik7CiBwb3J0X2VycjoKIAljbGtfcHV0KHNpcmZwb3J0LT5jbGspOwogZXJyOgpAQCAtMTUyOSw2ICsxNDQ1LDE5IEBACiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzaXJmcG9ydC0+cG9ydDsKIAljbGtfcHV0KHNpcmZwb3J0LT5jbGspOwogCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzaXJmc29jX3VhcnRfZHJ2LCBwb3J0KTsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7CisJCWludCBpOworCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHNpcmZwb3J0LT5yeF9kbWFfY2hhbik7CisJCWZvciAoaSA9IDA7IGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQocG9ydC0+ZGV2LCBTSVJGU09DX1JYX0RNQV9CVUZfU0laRSwKKwkJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZiwKKwkJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkcik7CisJfQorCWlmIChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pIHsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5oIGIvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5oCmluZGV4IGI3ZDY3OWMuLjhhNmVkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2lyZnNvY191YXJ0LmgKQEAgLTM5Miw5ICszOTIsNiBAQAogLyogSW5kaWNhdGUgaG93IG1hbnkgYnVmZmVycyB1c2VkICovCiAjZGVmaW5lIFNJUkZTT0NfUlhfTE9PUF9CVUZfQ05UCQkyCiAKLS8qIEluZGljYXRlIGlmIERNQSBjaGFubmVsIHZhbGlkICovCi0jZGVmaW5lIElTX0RNQV9DSEFOX1ZBTElEKHgpCSgoeCkgIT0gLTEpCi0jZGVmaW5lIFVOVkFMSURfRE1BX0NIQU4JLTEKIC8qIEZvciBGYXN0IEJhdWQgUmF0ZSBDYWxjdWxhdGlvbiAqLwogc3RydWN0IHNpcmZzb2NfYmF1ZHJhdGVfdG9fcmVndiB7CiAJdW5zaWduZWQgaW50IGJhdWRfcmF0ZTsKQEAgLTQyMyw4ICs0MjAsNiBAQAogCS8qIGZvciBTaVJGbWFyY28sIHRoZXJlIGFyZSBTRVQvQ0xSIGZvciBVQVJUX0lOVF9FTiAqLwogCWJvb2wJCQkJaXNfbWFyY287CiAJc3RydWN0IHNpcmZzb2NfdWFydF9yZWdpc3RlcgkqdWFydF9yZWc7Ci0JaW50CQkJCXJ4X2RtYV9ubzsKLQlpbnQJCQkJdHhfZG1hX25vOwogCXN0cnVjdCBkbWFfY2hhbgkJCSpyeF9kbWFfY2hhbjsKIAlzdHJ1Y3QgZG1hX2NoYW4JCQkqdHhfZG1hX2NoYW47CiAJZG1hX2FkZHJfdAkJCXR4X2RtYV9hZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bmh2LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3VuaHYuYwppbmRleCBjZjg2ZTcyLi5kYzY5N2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3VuaHYuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3VuaHYuYwpAQCAtNDMzLDEzICs0MzMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBsb2NrZWQgPSAxOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChwb3J0LT5zeXNycSkgewotCQlsb2NrZWQgPSAwOwotCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgewotCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnBvcnQtPmxvY2spOwotCX0gZWxzZQotCQlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCWlmIChwb3J0LT5zeXNycSB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQgPSBzcGluX3RyeWxvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCXdoaWxlIChuID4gMCkgewogCQl1bnNpZ25lZCBsb25nIHJhID0gX19wYShjb25fd3JpdGVfcGFnZSk7CkBAIC00NzAsOCArNDY3LDcgQEAKIAl9CiAKIAlpZiAobG9ja2VkKQotCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdW5odl9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciBjKQpAQCAtNDkyLDcgKzQ4OCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIGxvY2tlZCA9IDE7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHBvcnQtPnN5c3JxIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCWlmIChwb3J0LT5zeXNycSkgewogCQlsb2NrZWQgPSAwOwogCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgewpAQCAtNTA3LDggKzUwNiw3IEBACiAJfQogCiAJaWYgKGxvY2tlZCkKLQkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgc3VuaHZfY29uc29sZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW5zYWIuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW5zYWIuYwppbmRleCAzODBmYjUzLi41ZmFhOGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnNhYi5jCkBAIC04NDQsMjAgKzg0NCwxNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGxvY2tlZCA9IDE7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHVwLT5wb3J0LnN5c3JxKSB7Ci0JCWxvY2tlZCA9IDA7Ci0JfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7Ci0JCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7Ci0JfSBlbHNlCi0JCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CisJaWYgKHVwLT5wb3J0LnN5c3JxIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJdWFydF9jb25zb2xlX3dyaXRlKCZ1cC0+cG9ydCwgcywgbiwgc3Vuc2FiX2NvbnNvbGVfcHV0Y2hhcik7CiAJc3Vuc2FiX3RlY193YWl0KHVwKTsKIAogCWlmIChsb2NrZWQpCi0JCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzdW5zYWJfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uLCBjaGFyICpvcHRpb25zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuc3UuYwppbmRleCBkYjc5Yjc2Li45YTBmMjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuc3UuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuc3UuYwpAQCAtMTI5NSwxMyArMTI5NSwxMCBAQAogCXVuc2lnbmVkIGludCBpZXI7CiAJaW50IGxvY2tlZCA9IDE7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHVwLT5wb3J0LnN5c3JxKSB7Ci0JCWxvY2tlZCA9IDA7Ci0JfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7Ci0JCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7Ci0JfSBlbHNlCi0JCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CisJaWYgKHVwLT5wb3J0LnN5c3JxIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKglGaXJzdCBzYXZlIHRoZSBVRVIgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzCkBAIC0xMzE5LDggKzEzMTYsNyBAQAogCXNlcmlhbF9vdXQodXAsIFVBUlRfSUVSLCBpZXIpOwogCiAJaWYgKGxvY2tlZCkKLQkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuemlsb2cuYwppbmRleCA0NWE4YzZhLi5hMmM0MGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuemlsb2cuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtMTE5NSwyMCArMTE5NSwxNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGxvY2tlZCA9IDE7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHVwLT5wb3J0LnN5c3JxKSB7Ci0JCWxvY2tlZCA9IDA7Ci0JfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7Ci0JCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7Ci0JfSBlbHNlCi0JCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CisJaWYgKHVwLT5wb3J0LnN5c3JxIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJdWFydF9jb25zb2xlX3dyaXRlKCZ1cC0+cG9ydCwgcywgY291bnQsIHN1bnppbG9nX3B1dGNoYXIpOwogCXVkZWxheSgyKTsKIAogCWlmIChsb2NrZWQpCi0JCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc3Vuemlsb2dfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uLCBjaGFyICpvcHRpb25zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc3luY2xpbmsuYyBiL2RyaXZlcnMvdHR5L3N5bmNsaW5rLmMKaW5kZXggNWFlMTRiNC4uZDQ4ZTA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL3R0eS9zeW5jbGluay5jCkBAIC03ODY2LDYgKzc4NjYsNyBAQAogCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CiAJCQkJCSAgICAgIEhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOwogCisJCW1lbXNldCgmbmV3X2xpbmUsIDAsIHNpemVvZihuZXdfbGluZSkpOwogCQlzd2l0Y2ggKGZsYWdzKXsKIAkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7IGJyZWFrOwogCQljYXNlIChIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0lOVDsgYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zeW5jbGlua21wLmMgYi9kcml2ZXJzL3R0eS9zeW5jbGlua21wLmMKaW5kZXggMTQ0MjAyZS4uNTNiYTg1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc3luY2xpbmttcC5jCisrKyBiL2RyaXZlcnMvdHR5L3N5bmNsaW5rbXAuYwpAQCAtMTc2Niw2ICsxNzY2LDcgQEAKIAkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAogCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsKIAorCQltZW1zZXQoJm5ld19saW5lLCAwLCBzaXplb2YobmV3X2xpbmUpKTsKIAkJc3dpdGNoIChmbGFncyl7CiAJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKIAkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jIGIvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jCmluZGV4IDc2NTEyNWQuLjhlYmQ5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9idWZmZXIuYworKysgYi9kcml2ZXJzL3R0eS90dHlfYnVmZmVyLmMKQEAgLTM1MSwxNCArMzUxLDExIEBACiAgKglUYWtlcyBhbnkgcGVuZGluZyBidWZmZXJzIGFuZCB0cmFuc2ZlcnMgdGhlaXIgb3duZXJzaGlwIHRvIHRoZQogICoJbGRpc2Mgc2lkZSBvZiB0aGUgcXVldWUuIEl0IHRoZW4gc2NoZWR1bGVzIHRob3NlIGNoYXJhY3RlcnMgZm9yCiAgKglwcm9jZXNzaW5nIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUuCi0gKglOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIGxvd19sYXRlbmN5IGZsYWcKLSAqCWlzIHVuc2V0LiBPdGhlcndpc2UgdGhlIHdvcmtxdWV1ZSB3b24ndCBiZSBmbHVzaGVkLgogICovCiAKIHZvaWQgdHR5X3NjaGVkdWxlX2ZsaXAoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB0dHlfYnVmaGVhZCAqYnVmID0gJnBvcnQtPmJ1ZjsKLQlXQVJOX09OKHBvcnQtPmxvd19sYXRlbmN5KTsKIAogCWJ1Zi0+dGFpbC0+Y29tbWl0ID0gYnVmLT50YWlsLT51c2VkOwogCXNjaGVkdWxlX3dvcmsoJmJ1Zi0+d29yayk7CkBAIC00ODIsMTcgKzQ3OSwxNSBAQAogICovCiB2b2lkIHR0eV9mbHVzaF90b19sZGlzYyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCWlmICghdHR5LT5wb3J0LT5sb3dfbGF0ZW5jeSkKLQkJZmx1c2hfd29yaygmdHR5LT5wb3J0LT5idWYud29yayk7CisJZmx1c2hfd29yaygmdHR5LT5wb3J0LT5idWYud29yayk7CiB9CiAKIC8qKgogICoJdHR5X2ZsaXBfYnVmZmVyX3B1c2gJLQl0ZXJtaW5hbAogICoJQHBvcnQ6IHR0eSBwb3J0IHRvIHB1c2gKICAqCi0gKglRdWV1ZSBhIHB1c2ggb2YgdGhlIHRlcm1pbmFsIGZsaXAgYnVmZmVycyB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGlzCi0gKglmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCBpZiBwb3J0LT5sb3dfbGF0ZW5jeSBpcwotICoJc2V0LgorICoJUXVldWUgYSBwdXNoIG9mIHRoZSB0ZXJtaW5hbCBmbGlwIGJ1ZmZlcnMgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4KKyAqCUNhbiBiZSBjYWxsZWQgZnJvbSBJUlEvYXRvbWljIGNvbnRleHQuCiAgKgogICoJSW4gdGhlIGV2ZW50IG9mIHRoZSBxdWV1ZSBiZWluZyBidXN5IGZvciBmbGlwcGluZyB0aGUgd29yayB3aWxsIGJlCiAgKgloZWxkIG9mZiBhbmQgcmV0cmllZCBsYXRlci4KQEAgLTUwMCwxNCArNDk1LDcgQEAKIAogdm9pZCB0dHlfZmxpcF9idWZmZXJfcHVzaChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHR0eV9idWZoZWFkICpidWYgPSAmcG9ydC0+YnVmOwotCi0JYnVmLT50YWlsLT5jb21taXQgPSBidWYtPnRhaWwtPnVzZWQ7Ci0KLQlpZiAocG9ydC0+bG93X2xhdGVuY3kpCi0JCWZsdXNoX3RvX2xkaXNjKCZidWYtPndvcmspOwotCWVsc2UKLQkJc2NoZWR1bGVfd29yaygmYnVmLT53b3JrKTsKKwl0dHlfc2NoZWR1bGVfZmxpcChwb3J0KTsKIH0KIEVYUE9SVF9TWU1CT0wodHR5X2ZsaXBfYnVmZmVyX3B1c2gpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS90dHlfaW8uYyBiL2RyaXZlcnMvdHR5L3R0eV9pby5jCmluZGV4IGM3NGEwMGEuLmQzNDQ4YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9pby5jCisrKyBiL2RyaXZlcnMvdHR5L3R0eV9pby5jCkBAIC0xMjcxLDEyICsxMjcxLDEzIEBACiAgKgogICoJTG9ja2luZzogTm9uZQogICovCi1zdGF0aWMgdm9pZCB0dHlfbGluZV9uYW1lKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpbmRleCwgY2hhciAqcCkKK3N0YXRpYyBzc2l6ZV90IHR0eV9saW5lX25hbWUoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGluZGV4LCBjaGFyICpwKQogewogCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9VTk5VTUJFUkVEX05PREUpCi0JCXN0cmNweShwLCBkcml2ZXItPm5hbWUpOworCQlyZXR1cm4gc3ByaW50ZihwLCAiJXMiLCBkcml2ZXItPm5hbWUpOwogCWVsc2UKLQkJc3ByaW50ZihwLCAiJXMlZCIsIGRyaXZlci0+bmFtZSwgaW5kZXggKyBkcml2ZXItPm5hbWVfYmFzZSk7CisJCXJldHVybiBzcHJpbnRmKHAsICIlcyVkIiwgZHJpdmVyLT5uYW1lLAorCQkJICAgICAgIGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2UpOwogfQogCiAvKioKQEAgLTM1NDUsOSArMzU0NiwxOSBAQAogCQlpZiAoaSA+PSBBUlJBWV9TSVpFKGNzKSkKIAkJCWJyZWFrOwogCX0KLQl3aGlsZSAoaS0tKQotCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJXMlZCVjIiwKLQkJCQkgY3NbaV0tPm5hbWUsIGNzW2ldLT5pbmRleCwgaSA/ICcgJzonXG4nKTsKKwl3aGlsZSAoaS0tKSB7CisJCWludCBpbmRleCA9IGNzW2ldLT5pbmRleDsKKwkJc3RydWN0IHR0eV9kcml2ZXIgKmRydiA9IGNzW2ldLT5kZXZpY2UoY3NbaV0sICZpbmRleCk7CisKKwkJLyogZG9uJ3QgcmVzb2x2ZSB0dHkwIGFzIHNvbWUgcHJvZ3JhbXMgZGVwZW5kIG9uIGl0ICovCisJCWlmIChkcnYgJiYgKGNzW2ldLT5pbmRleCA+IDAgfHwgZHJ2LT5tYWpvciAhPSBUVFlfTUFKT1IpKQorCQkJY291bnQgKz0gdHR5X2xpbmVfbmFtZShkcnYsIGluZGV4LCBidWYgKyBjb3VudCk7CisJCWVsc2UKKwkJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICIlcyVkIiwKKwkJCQkJIGNzW2ldLT5uYW1lLCBjc1tpXS0+aW5kZXgpOworCisJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICIlYyIsIGkgPyAnICc6J1xuJyk7CisJfQogCWNvbnNvbGVfdW5sb2NrKCk7CiAKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS90dHlfbGRzZW0uYyBiL2RyaXZlcnMvdHR5L3R0eV9sZHNlbS5jCmluZGV4IGQ4YTU1ZTguLjBmZmIwY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9sZHNlbS5jCisrKyBiL2RyaXZlcnMvdHR5L3R0eV9sZHNlbS5jCkBAIC0zOSwxNyArMzksMTAgQEAKIAkJCQlsb2NrX2FjcXVpcmUoJihsKS0+ZGVwX21hcCwgcywgdCwgciwgYywgbiwgaSkKICMgZGVmaW5lIF9fcmVsKGwsIG4sIGkpCQkJCVwKIAkJCQlsb2NrX3JlbGVhc2UoJihsKS0+ZGVwX21hcCwgbiwgaSkKLSMgaWZkZWYgQ09ORklHX1BST1ZFX0xPQ0tJTkcKLSMgIGRlZmluZSBsb2NrZGVwX2FjcXVpcmUobCwgcywgdCwgaSkJCV9fYWNxKGwsIHMsIHQsIDAsIDIsIE5VTEwsIGkpCi0jICBkZWZpbmUgbG9ja2RlcF9hY3F1aXJlX25lc3QobCwgcywgdCwgbiwgaSkJX19hY3EobCwgcywgdCwgMCwgMiwgbiwgaSkKLSMgIGRlZmluZSBsb2NrZGVwX2FjcXVpcmVfcmVhZChsLCBzLCB0LCBpKQlfX2FjcShsLCBzLCB0LCAxLCAyLCBOVUxMLCBpKQotIyAgZGVmaW5lIGxvY2tkZXBfcmVsZWFzZShsLCBuLCBpKQkJX19yZWwobCwgbiwgaSkKLSMgZWxzZQotIyAgZGVmaW5lIGxvY2tkZXBfYWNxdWlyZShsLCBzLCB0LCBpKQkJX19hY3EobCwgcywgdCwgMCwgMSwgTlVMTCwgaSkKLSMgIGRlZmluZSBsb2NrZGVwX2FjcXVpcmVfbmVzdChsLCBzLCB0LCBuLCBpKQlfX2FjcShsLCBzLCB0LCAwLCAxLCBuLCBpKQotIyAgZGVmaW5lIGxvY2tkZXBfYWNxdWlyZV9yZWFkKGwsIHMsIHQsIGkpCV9fYWNxKGwsIHMsIHQsIDEsIDEsIE5VTEwsIGkpCi0jICBkZWZpbmUgbG9ja2RlcF9yZWxlYXNlKGwsIG4sIGkpCQlfX3JlbChsLCBuLCBpKQotIyBlbmRpZgorI2RlZmluZSBsb2NrZGVwX2FjcXVpcmUobCwgcywgdCwgaSkJCV9fYWNxKGwsIHMsIHQsIDAsIDEsIE5VTEwsIGkpCisjZGVmaW5lIGxvY2tkZXBfYWNxdWlyZV9uZXN0KGwsIHMsIHQsIG4sIGkpCV9fYWNxKGwsIHMsIHQsIDAsIDEsIG4sIGkpCisjZGVmaW5lIGxvY2tkZXBfYWNxdWlyZV9yZWFkKGwsIHMsIHQsIGkpCV9fYWNxKGwsIHMsIHQsIDEsIDEsIE5VTEwsIGkpCisjZGVmaW5lIGxvY2tkZXBfcmVsZWFzZShsLCBuLCBpKQkJX19yZWwobCwgbiwgaSkKICNlbHNlCiAjIGRlZmluZSBsb2NrZGVwX2FjcXVpcmUobCwgcywgdCwgaSkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfYWNxdWlyZV9uZXN0KGwsIHMsIHQsIG4sIGkpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3Z0L3Z0LmMgYi9kcml2ZXJzL3R0eS92dC92dC5jCmluZGV4IDIzYjVkMzIuLjNhZDBiNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3Z0L3Z0LmMKKysrIGIvZHJpdmVycy90dHkvdnQvdnQuYwpAQCAtMTU5MCw5ICsxNTkwLDkgQEAKIAl2Yy0+dmNfbmVlZF93cmFwID0gMDsKIH0KIAotZW51bSB7IEVTbm9ybWFsLCBFU2VzYywgRVNzcXVhcmUsIEVTZ2V0cGFycywgRVNnb3RwYXJzLCBFU2Z1bmNrZXksCitlbnVtIHsgRVNub3JtYWwsIEVTZXNjLCBFU3NxdWFyZSwgRVNnZXRwYXJzLCBFU2Z1bmNrZXksCiAJRVNoYXNoLCBFU3NldEcwLCBFU3NldEcxLCBFU3BlcmNlbnQsIEVTaWdub3JlLCBFU25vbnN0ZCwKLQlFU3BhbGV0dGUgfTsKKwlFU3BhbGV0dGUsIEVTb3NjIH07CiAKIC8qIGNvbnNvbGVfbG9jayBpcyBoZWxkIChleGNlcHQgdmlhIHZjX2luaXQoKSkgKi8KIHN0YXRpYyB2b2lkIHJlc2V0X3Rlcm1pbmFsKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGRvX2NsZWFyKQpAQCAtMTY1MiwxMSArMTY1MiwxNSBAQAogCSAqICBDb250cm9sIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQgaW4gdGhlIF9taWRkbGVfCiAJICogIG9mIGFuIGVzY2FwZSBzZXF1ZW5jZS4KIAkgKi8KKwlpZiAodmMtPnZjX3N0YXRlID09IEVTb3NjICYmIGM+PTggJiYgYzw9MTMpIC8qIC4uLiBleGNlcHQgZm9yIE9TQyAqLworCQlyZXR1cm47CiAJc3dpdGNoIChjKSB7CiAJY2FzZSAwOgogCQlyZXR1cm47CiAJY2FzZSA3OgotCQlpZiAodmMtPnZjX2JlbGxfZHVyYXRpb24pCisJCWlmICh2Yy0+dmNfc3RhdGUgPT0gRVNvc2MpCisJCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJZWxzZSBpZiAodmMtPnZjX2JlbGxfZHVyYXRpb24pCiAJCQlrZF9ta3NvdW5kKHZjLT52Y19iZWxsX3BpdGNoLCB2Yy0+dmNfYmVsbF9kdXJhdGlvbik7CiAJCXJldHVybjsKIAljYXNlIDg6CkBAIC0xNzY3LDcgKzE3NzEsOSBAQAogCQl9IGVsc2UgaWYgKGM9PSdSJykgeyAgIC8qIHJlc2V0IHBhbGV0dGUgKi8KIAkJCXJlc2V0X3BhbGV0dGUodmMpOwogCQkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7Ci0JCX0gZWxzZQorCQl9IGVsc2UgaWYgKGM+PScwJyAmJiBjPD0nOScpCisJCQl2Yy0+dmNfc3RhdGUgPSBFU29zYzsKKwkJZWxzZQogCQkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CiAJCXJldHVybjsKIAljYXNlIEVTcGFsZXR0ZToKQEAgLTE4MDcsOSArMTgxMyw3IEBACiAJCQl2Yy0+dmNfcGFyW3ZjLT52Y19ucGFyXSAqPSAxMDsKIAkJCXZjLT52Y19wYXJbdmMtPnZjX25wYXJdICs9IGMgLSAnMCc7CiAJCQlyZXR1cm47Ci0JCX0gZWxzZQotCQkJdmMtPnZjX3N0YXRlID0gRVNnb3RwYXJzOwotCWNhc2UgRVNnb3RwYXJzOgorCQl9CiAJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOwogCQlzd2l0Y2goYykgewogCQljYXNlICdoJzoKQEAgLTIwMjMsNiArMjAyNyw4IEBACiAJCQl2Yy0+dmNfdHJhbnNsYXRlID0gc2V0X3RyYW5zbGF0ZSh2Yy0+dmNfRzFfY2hhcnNldCwgdmMpOwogCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKIAkJcmV0dXJuOworCWNhc2UgRVNvc2M6CisJCXJldHVybjsKIAlkZWZhdWx0OgogCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCAyZTZiODMyLi5lMGNhZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTIsMTAgKzIsNiBAQAogIyBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotIyBUaGVzZSBhcmUgdW51c2VkIG5vdywgcmVtb3ZlIHRoZW0gb25jZSB0aGV5IGFyZSBubyBsb25nZXIgc2VsZWN0ZWQKLWNvbmZpZyBVU0JfQVJDSF9IQVNfT0hDSQotCWJvb2wKLQogY29uZmlnIFVTQl9PSENJX0JJR19FTkRJQU5fREVTQwogCWJvb2wKIApAQCAtMTcsMTggKzEzLDEyIEBACiAJZGVmYXVsdCBuIGlmIFNUQjAzeHh4IHx8IFBQQ19NUEM1Mnh4CiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBVU0JfQVJDSF9IQVNfRUhDSQotCWJvb2wKLQogY29uZmlnIFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTwogCWJvb2wKIAogY29uZmlnIFVTQl9FSENJX0JJR19FTkRJQU5fREVTQwogCWJvb2wKIAotY29uZmlnIFVTQl9BUkNIX0hBU19YSENJCi0JYm9vbAotCiBtZW51Y29uZmlnIFVTQl9TVVBQT1JUCiAJYm9vbCAiVVNCIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvTWFrZWZpbGUKaW5kZXggNzM0NWQyMS4uNDgwYmQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKICMgR2x1ZS9CcmlkZ2UgbGF5ZXJzIGdvIGhlcmUKIAogb2JqLSQoQ09ORklHX1VTQl9DSElQSURFQSkJKz0gY2lfaGRyY19tc20ubworb2JqLSQoQ09ORklHX1VTQl9DSElQSURFQSkJKz0gY2lfaGRyY196ZXZpby5vCiAKICMgUENJIGRvZXNuJ3QgcHJvdmlkZSBzdHVicywgbmVlZCB0byBjaGVjawogaWZuZXEgKCQoQ09ORklHX1BDSSksKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvYml0cy5oIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvYml0cy5oCmluZGV4IGE4NTcxMzEuLjgzZDA2YzE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvYml0cy5oCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaApAQCAtNTAsMTIgKzUwLDE0IEBACiAjZGVmaW5lIFBPUlRTQ19QVEMgICAgICAgICAgICAoMHgwRlVMIDw8IDE2KQogI2RlZmluZSBQT1JUU0NfUEhDRChkKQkgICAgICAoKGQpID8gQklUKDIyKSA6IEJJVCgyMykpCiAvKiBQVFMgYW5kIFBUVyBmb3Igbm9uIGxwbSB2ZXJzaW9uIG9ubHkgKi8KKyNkZWZpbmUgUE9SVFNDX1BGU0MgICAgICAgICAgIEJJVCgyNCkKICNkZWZpbmUgUE9SVFNDX1BUUyhkKQkJCQkJCVwKIAkodTMyKSgoKChkKSAmIDB4MykgPDwgMzApIHwgKCgoZCkgJiAweDQpID8gQklUKDI1KSA6IDApKQogI2RlZmluZSBQT1JUU0NfUFRXICAgICAgICAgICAgQklUKDI4KQogI2RlZmluZSBQT1JUU0NfU1RTICAgICAgICAgICAgQklUKDI5KQogCiAvKiBERVZMQyAqLworI2RlZmluZSBERVZMQ19QRlNDICAgICAgICAgICAgQklUKDIzKQogI2RlZmluZSBERVZMQ19QU1BEICAgICAgICAgICAgKDB4MDNVTCA8PCAyNSkKICNkZWZpbmUgREVWTENfUFNQRF9IUyAgICAgICAgICgweDAyVUwgPDwgMjUpCiAjZGVmaW5lIERFVkxDX1BUVyAgICAgICAgICAgICBCSVQoMjcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaS5oIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2kuaAppbmRleCA4OGI4MGY3Li5lMjA2NDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaS5oCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpLmgKQEAgLTE5Niw4ICsxOTYsNiBAQAogCiAJc3RydWN0IGNpX2hkcmNfcGxhdGZvcm1fZGF0YQkqcGxhdGRhdGE7CiAJaW50CQkJCXZidXNfYWN0aXZlOwotCS8qIEZJWE1FOiBzb21lIGRheSwgd2UnbGwgbm90IHVzZSBnbG9iYWwgcGh5ICovCi0JYm9vbAkJCQlnbG9iYWxfcGh5OwogCXN0cnVjdCB1c2JfcGh5CQkJKnRyYW5zY2VpdmVyOwogCXN0cnVjdCB1c2JfaGNkCQkJKmhjZDsKIAlzdHJ1Y3QgZGVudHJ5CQkJKmRlYnVnZnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYwppbmRleCBjMDBmNzcyLi4yZTU4ZjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKQEAgLTk2LDcgKzk2LDcgQEAKIHsKIAlzdHJ1Y3QgY2lfaGRyY19pbXhfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgY2lfaGRyY19wbGF0Zm9ybV9kYXRhIHBkYXRhID0gewotCQkubmFtZQkJPSAiY2lfaGRyY19pbXgiLAorCQkubmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KSwKIAkJLmNhcG9mZnNldAk9IERFRl9DQVBPRkZTRVQsCiAJCS5mbGFncwkJPSBDSV9IRFJDX1JFUVVJUkVfVFJBTlNDRUlWRVIgfAogCQkJCSAgQ0lfSERSQ19ESVNBQkxFX1NUUkVBTUlORywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfemV2aW8uYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfemV2aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY2NDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY196ZXZpby5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKglDb3B5cmlnaHQgKEMpIDIwMTMgRGFuaWVsIFRhbmcgPHRhbmdyc0B0YW5ncnMuaWQuYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQmFzZWQgb2ZmIGRyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfbXNtLmMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvY2hpcGlkZWEuaD4KKworI2luY2x1ZGUgImNpLmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2lfaGRyY19wbGF0Zm9ybV9kYXRhIGNpX2hkcmNfemV2aW9fcGxhdGRhdGEgPSB7CisJLm5hbWUJCQk9ICJjaV9oZHJjX3pldmlvIiwKKwkuZmxhZ3MJCQk9IENJX0hEUkNfUkVHU19TSEFSRUQsCisJLmNhcG9mZnNldAkJPSBERUZfQ0FQT0ZGU0VULAorfTsKKworc3RhdGljIGludCBjaV9oZHJjX3pldmlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2lfcGRldjsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgImNpX2hkcmNfemV2aW9fcHJvYmVcbiIpOworCisJY2lfcGRldiA9IGNpX2hkcmNfYWRkX2RldmljZSgmcGRldi0+ZGV2LAorCQkJCXBkZXYtPnJlc291cmNlLCBwZGV2LT5udW1fcmVzb3VyY2VzLAorCQkJCSZjaV9oZHJjX3pldmlvX3BsYXRkYXRhKTsKKworCWlmIChJU19FUlIoY2lfcGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2lfaGRyY19hZGRfZGV2aWNlIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjaV9wZGV2KTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaV9wZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpX2hkcmNfemV2aW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2lfcGRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2lfaGRyY19yZW1vdmVfZGV2aWNlKGNpX3BkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNpX2hkcmNfemV2aW9fZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJsc2ksemV2aW8tdXNiIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNpX2hkcmNfemV2aW9fZHJpdmVyID0geworCS5wcm9iZSA9IGNpX2hkcmNfemV2aW9fcHJvYmUsCisJLnJlbW92ZSA9IGNpX2hkcmNfemV2aW9fcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInpldmlvX3VzYiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBjaV9oZHJjX3pldmlvX2R0X2lkcywKKwl9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY2lfaGRyY196ZXZpb19kdF9pZHMpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihjaV9oZHJjX3pldmlvX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NvcmUuYwppbmRleCAzM2YyMmJjLi5jYTY4MzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY29yZS5jCkBAIC02NCw2ICs2NCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaGlwaWRlYS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKQEAgLTI5OCw2ICsyOTksMTMgQEAKIAlpZiAoY2ktPnBsYXRkYXRhLT5mbGFncyAmIENJX0hEUkNfRElTQUJMRV9TVFJFQU1JTkcpCiAJCWh3X3dyaXRlKGNpLCBPUF9VU0JNT0RFLCBVU0JNT0RFX0NJX1NESVMsIFVTQk1PREVfQ0lfU0RJUyk7CiAKKwlpZiAoY2ktPnBsYXRkYXRhLT5mbGFncyAmIENJX0hEUkNfRk9SQ0VfRlVMTFNQRUVEKSB7CisJCWlmIChjaS0+aHdfYmFuay5scG0pCisJCQlod193cml0ZShjaSwgT1BfREVWTEMsIERFVkxDX1BGU0MsIERFVkxDX1BGU0MpOworCQllbHNlCisJCQlod193cml0ZShjaSwgT1BfUE9SVFNDLCBQT1JUU0NfUEZTQywgUE9SVFNDX1BGU0MpOworCX0KKwogCS8qIFVTQk1PREUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgc3RlcCBieSBzdGVwICovCiAJaHdfd3JpdGUoY2ksIE9QX1VTQk1PREUsIFVTQk1PREVfQ00sIFVTQk1PREVfQ01fSURMRSk7CiAJaHdfd3JpdGUoY2ksIE9QX1VTQk1PREUsIFVTQk1PREVfQ00sIG1vZGUpOwpAQCAtNDEyLDYgKzQyMCw5IEBACiAJCX0KIAl9CiAKKwlpZiAob2ZfdXNiX2dldF9tYXhpbXVtX3NwZWVkKGRldi0+b2Zfbm9kZSkgPT0gVVNCX1NQRUVEX0ZVTEwpCisJCXBsYXRkYXRhLT5mbGFncyB8PSBDSV9IRFJDX0ZPUkNFX0ZVTExTUEVFRDsKKwogCXJldHVybiAwOwogfQogCkBAIC00OTYsMzMgKzUwNyw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNpX3VzYl9waHlfaW5pdChzdHJ1Y3QgY2lfaGRyYyAqY2kpCi17Ci0JaWYgKGNpLT5wbGF0ZGF0YS0+cGh5KSB7Ci0JCWNpLT50cmFuc2NlaXZlciA9IGNpLT5wbGF0ZGF0YS0+cGh5OwotCQlyZXR1cm4gdXNiX3BoeV9pbml0KGNpLT50cmFuc2NlaXZlcik7Ci0JfSBlbHNlIHsKLQkJY2ktPmdsb2JhbF9waHkgPSB0cnVlOwotCQljaS0+dHJhbnNjZWl2ZXIgPSB1c2JfZ2V0X3BoeShVU0JfUEhZX1RZUEVfVVNCMik7Ci0JCWlmIChJU19FUlIoY2ktPnRyYW5zY2VpdmVyKSkKLQkJCWNpLT50cmFuc2NlaXZlciA9IE5VTEw7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV91c2JfcGh5X2Rlc3Ryb3koc3RydWN0IGNpX2hkcmMgKmNpKQotewotCWlmICghY2ktPnRyYW5zY2VpdmVyKQotCQlyZXR1cm47Ci0KLQlvdGdfc2V0X3BlcmlwaGVyYWwoY2ktPnRyYW5zY2VpdmVyLT5vdGcsIE5VTEwpOwotCWlmIChjaS0+Z2xvYmFsX3BoeSkKLQkJdXNiX3B1dF9waHkoY2ktPnRyYW5zY2VpdmVyKTsKLQllbHNlCi0JCXVzYl9waHlfc2h1dGRvd24oY2ktPnRyYW5zY2VpdmVyKTsKLX0KLQogc3RhdGljIGludCBjaV9oZHJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZQkqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTUzMiw3ICs1MTYsNyBAQAogCWludAkJcmV0OwogCWVudW0gdXNiX2RyX21vZGUgZHJfbW9kZTsKIAotCWlmICghZGV2LT5wbGF0Zm9ybV9kYXRhKSB7CisJaWYgKCFkZXZfZ2V0X3BsYXRkYXRhKGRldikpIHsKIAkJZGV2X2VycihkZXYsICJwbGF0Zm9ybSBkYXRhIG1pc3NpbmdcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC01NDksNyArNTMzLDcgQEAKIAl9CiAKIAljaS0+ZGV2ID0gZGV2OwotCWNpLT5wbGF0ZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwljaS0+cGxhdGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJY2ktPmlteDI4X3dyaXRlX2ZpeCA9ICEhKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJgogCQlDSV9IRFJDX0lNWDI4X1dSSVRFX0ZJWCk7CiAKQEAgLTU2MSw3ICs1NDUsMjYgQEAKIAogCWh3X3BoeW1vZGVfY29uZmlndXJlKGNpKTsKIAotCXJldCA9IGNpX3VzYl9waHlfaW5pdChjaSk7CisJaWYgKGNpLT5wbGF0ZGF0YS0+cGh5KQorCQljaS0+dHJhbnNjZWl2ZXIgPSBjaS0+cGxhdGRhdGEtPnBoeTsKKwllbHNlCisJCWNpLT50cmFuc2NlaXZlciA9IGRldm1fdXNiX2dldF9waHkoZGV2LCBVU0JfUEhZX1RZUEVfVVNCMik7CisKKwlpZiAoSVNfRVJSKGNpLT50cmFuc2NlaXZlcikpIHsKKwkJcmV0ID0gUFRSX0VSUihjaS0+dHJhbnNjZWl2ZXIpOworCQkvKgorCQkgKiBpZiAtRU5YSU8gaXMgcmV0dXJuZWQsIGl0IG1lYW5zIFBIWSBsYXllciB3YXNuJ3QKKwkJICogZW5hYmxlZCwgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmV0dXJuIC1FUFJPQkVfREVGRVIKKwkJICogaW4gdGhhdCBjYXNlLCBzaW5jZSBubyBQSFkgZHJpdmVyIHdpbGwgZXZlciBwcm9iZS4KKwkJICovCisJCWlmIChyZXQgPT0gLUVOWElPKQorCQkJcmV0dXJuIHJldDsKKworCQlkZXZfZXJyKGRldiwgIm5vIHVzYjIgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisKKwlyZXQgPSB1c2JfcGh5X2luaXQoY2ktPnRyYW5zY2VpdmVyKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGluaXQgcGh5OiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTU3Miw4ICs1NzUsOCBAQAogCWNpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChjaS0+aXJxIDwgMCkgewogCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgSVJRXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkZXN0cm95X3BoeTsKKwkJcmV0ID0gY2ktPmlycTsKKwkJZ290byBkZWluaXRfcGh5OwogCX0KIAogCWNpX2dldF9vdGdfY2FwYWJsZShjaSk7CkBAIC01OTAsMjMgKzU5MywxMiBAQAogCQlyZXQgPSBjaV9oZHJjX2dhZGdldF9pbml0KGNpKTsKIAkJaWYgKHJldCkKIAkJCWRldl9pbmZvKGRldiwgImRvZXNuJ3Qgc3VwcG9ydCBnYWRnZXRcbiIpOwotCQlpZiAoIXJldCAmJiBjaS0+dHJhbnNjZWl2ZXIpIHsKLQkJCXJldCA9IG90Z19zZXRfcGVyaXBoZXJhbChjaS0+dHJhbnNjZWl2ZXItPm90ZywKLQkJCQkJCQkmY2ktPmdhZGdldCk7Ci0JCQkvKgotCQkJICogSWYgd2UgaW1wbGVtZW50IGFsbCBVU0IgZnVuY3Rpb25zIHVzaW5nIGNoaXBpZGVhIGRyaXZlcnMsCi0JCQkgKiBpdCBkb2Vzbid0IG5lZWQgdG8gY2FsbCBhYm92ZSBBUEksIG1lYW53aGlsZSwgaWYgd2Ugb25seQotCQkJICogdXNlIGdhZGdldCBmdW5jdGlvbiwgY2FsbGluZyBhYm92ZSBBUEkgaXMgdXNlbGVzcy4KLQkJCSAqLwotCQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKQotCQkJCWdvdG8gZGVzdHJveV9waHk7Ci0JCX0KIAl9CiAKIAlpZiAoIWNpLT5yb2xlc1tDSV9ST0xFX0hPU1RdICYmICFjaS0+cm9sZXNbQ0lfUk9MRV9HQURHRVRdKSB7CiAJCWRldl9lcnIoZGV2LCAibm8gc3VwcG9ydGVkIHJvbGVzXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkZXN0cm95X3BoeTsKKwkJZ290byBkZWluaXRfcGh5OwogCX0KIAogCWlmIChjaS0+aXNfb3RnKSB7CkBAIC02NjMsOCArNjU1LDggQEAKIAlmcmVlX2lycShjaS0+aXJxLCBjaSk7CiBzdG9wOgogCWNpX3JvbGVfZGVzdHJveShjaSk7Ci1kZXN0cm95X3BoeToKLQljaV91c2JfcGh5X2Rlc3Ryb3koY2kpOworZGVpbml0X3BoeToKKwl1c2JfcGh5X3NodXRkb3duKGNpLT50cmFuc2NlaXZlcik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjc3LDcgKzY2OSw4IEBACiAJZnJlZV9pcnEoY2ktPmlycSwgY2kpOwogCWNpX3JvbGVfZGVzdHJveShjaSk7CiAJY2lfaGRyY19lbnRlcl9scG0oY2ksIHRydWUpOwotCWNpX3VzYl9waHlfZGVzdHJveShjaSk7CisJdXNiX3BoeV9zaHV0ZG93bihjaS0+dHJhbnNjZWl2ZXIpOworCWtmcmVlKGNpLT5od19iYW5rLnJlZ21hcCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMKaW5kZXggNGFiMmNiNi4uNzczOWM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMKQEAgLTE3OCwxOSArMTc4LDYgQEAKIH0KIAogLyoqCi0gKiBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXM6IHRlc3QgJiBjbGVhciBzZXR1cCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCi0gKiBAbjogZW5kcG9pbnQgbnVtYmVyCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNldHVwIHN0YXR1cwotICovCi1zdGF0aWMgaW50IGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX3N0YXR1cyhzdHJ1Y3QgY2lfaGRyYyAqY2ksIGludCBuKQotewotCW4gPSBlcF90b19iaXQoY2ksIG4pOwotCXJldHVybiBod190ZXN0X2FuZF9jbGVhcihjaSwgT1BfRU5EUFRTRVRVUFNUQVQsIEJJVChuKSk7Ci19Ci0KLS8qKgogICogaHdfZXBfcHJpbWU6IHByaW1lcyBlbmRwb2ludCAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICAqIEBudW06ICAgICBlbmRwb2ludCBudW1iZXIKICAqIEBkaXI6ICAgICBlbmRwb2ludCBkaXJlY3Rpb24KQEAgLTk2Miw2ICs5NDksMTU2IEBACiB9CiAKIC8qKgorICogaXNyX3NldHVwX3BhY2tldF9oYW5kbGVyOiBzZXR1cCBwYWNrZXQgaGFuZGxlcgorICogQGNpOiBVREMgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXR1cCBwYWNrZXQgCisgKi8KK3N0YXRpYyB2b2lkIGlzcl9zZXR1cF9wYWNrZXRfaGFuZGxlcihzdHJ1Y3QgY2lfaGRyYyAqY2kpCitfX3JlbGVhc2VzKGNpLT5sb2NrKQorX19hY3F1aXJlcyhjaS0+bG9jaykKK3sKKwlzdHJ1Y3QgY2lfaHdfZXAgKmh3ZXAgPSAmY2ktPmNpX2h3X2VwWzBdOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgcmVxOworCWludCB0eXBlLCBudW0sIGRpciwgZXJyID0gLUVJTlZBTDsKKwl1OCB0bW9kZSA9IDA7CisKKwkvKgorCSAqIEZsdXNoIGRhdGEgYW5kIGhhbmRzaGFrZSB0cmFuc2FjdGlvbnMgb2YgcHJldmlvdXMKKwkgKiBzZXR1cCBwYWNrZXQuCisJICovCisJX2VwX251a2UoY2ktPmVwMG91dCk7CisJX2VwX251a2UoY2ktPmVwMGluKTsKKworCS8qIHJlYWRfc2V0dXBfcGFja2V0ICovCisJZG8geworCQlod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQoY2kpOworCQltZW1jcHkoJnJlcSwgJmh3ZXAtPnFoLnB0ci0+c2V0dXAsIHNpemVvZihyZXEpKTsKKwl9IHdoaWxlICghaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQoY2kpKTsKKworCXR5cGUgPSByZXEuYlJlcXVlc3RUeXBlOworCisJY2ktPmVwMF9kaXIgPSAodHlwZSAmIFVTQl9ESVJfSU4pID8gVFggOiBSWDsKKworCXN3aXRjaCAocmVxLmJSZXF1ZXN0KSB7CisJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCWlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCQkJbGUxNl90b19jcHUocmVxLndWYWx1ZSkgPT0KKwkJCQlVU0JfRU5EUE9JTlRfSEFMVCkgeworCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCisJCQkJYnJlYWs7CisJCQludW0gID0gbGUxNl90b19jcHUocmVxLndJbmRleCk7CisJCQlkaXIgPSBudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCQkJaWYgKGRpcikgLyogVFggKi8KKwkJCQludW0gKz0gY2ktPmh3X2VwX21heCAvIDI7CisJCQlpZiAoIWNpLT5jaV9od19lcFtudW1dLndlZGdlKSB7CisJCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKKwkJCQllcnIgPSB1c2JfZXBfY2xlYXJfaGFsdCgKKwkJCQkJJmNpLT5jaV9od19lcFtudW1dLmVwKTsKKwkJCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpICYmCisJCQkJbGUxNl90b19jcHUocmVxLndWYWx1ZSkgPT0KKwkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApIHsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJY2ktPnJlbW90ZV93YWtldXAgPSAwOworCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7CisJCX0gZWxzZSB7CisJCQlnb3RvIGRlbGVnYXRlOworCQl9CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFKSAgICYmCisJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKKwkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0lOVEVSRkFDRSkpCisJCQlnb3RvIGRlbGVnYXRlOworCQlpZiAobGUxNl90b19jcHUocmVxLndMZW5ndGgpICE9IDIgfHwKKwkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICAhPSAwKQorCQkJYnJlYWs7CisJCWVyciA9IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKGNpLCAmcmVxKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0RFVklDRSkpCisJCQlnb3RvIGRlbGVnYXRlOworCQlpZiAobGUxNl90b19jcHUocmVxLndMZW5ndGgpICE9IDAgfHwKKwkJICAgIGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpICAhPSAwKQorCQkJYnJlYWs7CisJCWNpLT5hZGRyZXNzID0gKHU4KWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpOworCQljaS0+c2V0YWRkciA9IHRydWU7CisJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQlicmVhazsKKwljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCWlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCQkJbGUxNl90b19jcHUocmVxLndWYWx1ZSkgPT0KKwkJCQlVU0JfRU5EUE9JTlRfSEFMVCkgeworCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCisJCQkJYnJlYWs7CisJCQludW0gID0gbGUxNl90b19jcHUocmVxLndJbmRleCk7CisJCQlkaXIgPSBudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCQkJaWYgKGRpcikgLyogVFggKi8KKwkJCQludW0gKz0gY2ktPmh3X2VwX21heCAvIDI7CisKKwkJCXNwaW5fdW5sb2NrKCZjaS0+bG9jayk7CisJCQllcnIgPSB1c2JfZXBfc2V0X2hhbHQoJmNpLT5jaV9od19lcFtudW1dLmVwKTsKKwkJCXNwaW5fbG9jaygmY2ktPmxvY2spOworCQkJaWYgKCFlcnIpCisJCQkJaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7CisJCX0gZWxzZSBpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0RFVklDRSkpIHsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJc3dpdGNoIChsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSkgeworCQkJY2FzZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA6CisJCQkJY2ktPnJlbW90ZV93YWtldXAgPSAxOworCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfREVWSUNFX1RFU1RfTU9ERToKKwkJCQl0bW9kZSA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpID4+IDg7CisJCQkJc3dpdGNoICh0bW9kZSkgeworCQkJCWNhc2UgVEVTVF9KOgorCQkJCWNhc2UgVEVTVF9LOgorCQkJCWNhc2UgVEVTVF9TRTBfTkFLOgorCQkJCWNhc2UgVEVTVF9QQUNLRVQ6CisJCQkJY2FzZSBURVNUX0ZPUkNFX0VOOgorCQkJCQljaS0+dGVzdF9tb2RlID0gdG1vZGU7CisJCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoCisJCQkJCQkJY2kpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZGVsZWdhdGU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlnb3RvIGRlbGVnYXRlOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CitkZWxlZ2F0ZToKKwkJaWYgKHJlcS53TGVuZ3RoID09IDApICAgLyogbm8gZGF0YSBwaGFzZSAqLworCQkJY2ktPmVwMF9kaXIgPSBUWDsKKworCQlzcGluX3VubG9jaygmY2ktPmxvY2spOworCQllcnIgPSBjaS0+ZHJpdmVyLT5zZXR1cCgmY2ktPmdhZGdldCwgJnJlcSk7CisJCXNwaW5fbG9jaygmY2ktPmxvY2spOworCQlicmVhazsKKwl9CisKKwlpZiAoZXJyIDwgMCkgeworCQlzcGluX3VubG9jaygmY2ktPmxvY2spOworCQlpZiAodXNiX2VwX3NldF9oYWx0KCZod2VwLT5lcCkpCisJCQlkZXZfZXJyKGNpLT5kZXYsICJlcnJvcjogZXBfc2V0X2hhbHRcbiIpOworCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKKwl9Cit9CisKKy8qKgogICogaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXI6IHRyYW5zYWN0aW9uIGNvbXBsZXRlIGludGVycnVwdCBoYW5kbGVyCiAgKiBAY2k6IFVEQyBkZXNjcmlwdG9yCiAgKgpAQCAtOTcyLDEyICsxMTA5LDEwIEBACiBfX2FjcXVpcmVzKGNpLT5sb2NrKQogewogCXVuc2lnbmVkIGk7Ci0JdTggdG1vZGUgPSAwOworCWludCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2ktPmh3X2VwX21heDsgaSsrKSB7CiAJCXN0cnVjdCBjaV9od19lcCAqaHdlcCAgPSAmY2ktPmNpX2h3X2VwW2ldOwotCQlpbnQgdHlwZSwgbnVtLCBkaXIsIGVyciA9IC1FSU5WQUw7Ci0JCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgcmVxOwogCiAJCWlmIChod2VwLT5lcC5kZXNjID09IE5VTEwpCiAJCQljb250aW51ZTsgICAvKiBub3QgY29uZmlndXJlZCAqLwpAQCAtOTk3LDE0OCArMTEzMiwxMCBAQAogCQkJfQogCQl9CiAKLQkJaWYgKGh3ZXAtPnR5cGUgIT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCB8fAotCQkgICAgIWh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX3N0YXR1cyhjaSwgaSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoaSAhPSAwKSB7Ci0JCQlkZXZfd2FybihjaS0+ZGV2LCAiY3RybCB0cmFmZmljIGF0IGVuZHBvaW50ICVkXG4iLCBpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyoKLQkJICogRmx1c2ggZGF0YSBhbmQgaGFuZHNoYWtlIHRyYW5zYWN0aW9ucyBvZiBwcmV2aW91cwotCQkgKiBzZXR1cCBwYWNrZXQuCi0JCSAqLwotCQlfZXBfbnVrZShjaS0+ZXAwb3V0KTsKLQkJX2VwX251a2UoY2ktPmVwMGluKTsKLQotCQkvKiByZWFkX3NldHVwX3BhY2tldCAqLwotCQlkbyB7Ci0JCQlod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQoY2kpOwotCQkJbWVtY3B5KCZyZXEsICZod2VwLT5xaC5wdHItPnNldHVwLCBzaXplb2YocmVxKSk7Ci0JCX0gd2hpbGUgKCFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZChjaSkpOwotCi0JCXR5cGUgPSByZXEuYlJlcXVlc3RUeXBlOwotCi0JCWNpLT5lcDBfZGlyID0gKHR5cGUgJiBVU0JfRElSX0lOKSA/IFRYIDogUlg7Ci0KLQkJc3dpdGNoIChyZXEuYlJlcXVlc3QpIHsKLQkJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6Ci0JCQlpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgotCQkJCQlsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSA9PQotCQkJCQlVU0JfRU5EUE9JTlRfSEFMVCkgewotCQkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQotCQkJCQlicmVhazsKLQkJCQludW0gID0gbGUxNl90b19jcHUocmVxLndJbmRleCk7Ci0JCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOwotCQkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JCQkJaWYgKGRpcikgLyogVFggKi8KLQkJCQkJbnVtICs9IGNpLT5od19lcF9tYXgvMjsKLQkJCQlpZiAoIWNpLT5jaV9od19lcFtudW1dLndlZGdlKSB7Ci0JCQkJCXNwaW5fdW5sb2NrKCZjaS0+bG9jayk7Ci0JCQkJCWVyciA9IHVzYl9lcF9jbGVhcl9oYWx0KAotCQkJCQkJJmNpLT5jaV9od19lcFtudW1dLmVwKTsKLQkJCQkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7Ci0JCQkJCWlmIChlcnIpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpICYmCi0JCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09Ci0JCQkJCVVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkgewotCQkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQotCQkJCQlicmVhazsKLQkJCQljaS0+cmVtb3RlX3dha2V1cCA9IDA7Ci0JCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7Ci0JCQl9IGVsc2UgewotCQkJCWdvdG8gZGVsZWdhdGU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfUkVRX0dFVF9TVEFUVVM6Ci0JCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFKSAgICYmCi0JCQkgICAgdHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCi0JCQkgICAgdHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfSU5URVJGQUNFKSkKLQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAyIHx8Ci0JCQkgICAgbGUxNl90b19jcHUocmVxLndWYWx1ZSkgICE9IDApCi0JCQkJYnJlYWs7Ci0JCQllcnIgPSBpc3JfZ2V0X3N0YXR1c19yZXNwb25zZShjaSwgJnJlcSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfUkVRX1NFVF9BRERSRVNTOgotCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKQotCQkJCWdvdG8gZGVsZWdhdGU7Ci0JCQlpZiAobGUxNl90b19jcHUocmVxLndMZW5ndGgpICE9IDAgfHwKLQkJCSAgICBsZTE2X3RvX2NwdShyZXEud0luZGV4KSAgIT0gMCkKLQkJCQlicmVhazsKLQkJCWNpLT5hZGRyZXNzID0gKHU4KWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpOwotCQkJY2ktPnNldGFkZHIgPSB0cnVlOwotCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfUkVRX1NFVF9GRUFUVVJFOgotCQkJaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKLQkJCQkJbGUxNl90b19jcHUocmVxLndWYWx1ZSkgPT0KLQkJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKLQkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOwotCQkJCWRpciA9IG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKLQkJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJCWlmIChkaXIpIC8qIFRYICovCi0JCQkJCW51bSArPSBjaS0+aHdfZXBfbWF4LzI7Ci0KLQkJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwotCQkJCWVyciA9IHVzYl9lcF9zZXRfaGFsdCgmY2ktPmNpX2h3X2VwW251bV0uZXApOwotCQkJCXNwaW5fbG9jaygmY2ktPmxvY2spOwotCQkJCWlmICghZXJyKQotCQkJCQlpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0RFVklDRSkpIHsKLQkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJc3dpdGNoIChsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSkgewotCQkJCWNhc2UgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOgotCQkJCQljaS0+cmVtb3RlX3dha2V1cCA9IDE7Ci0JCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFVTQl9ERVZJQ0VfVEVTVF9NT0RFOgotCQkJCQl0bW9kZSA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpID4+IDg7Ci0JCQkJCXN3aXRjaCAodG1vZGUpIHsKLQkJCQkJY2FzZSBURVNUX0o6Ci0JCQkJCWNhc2UgVEVTVF9LOgotCQkJCQljYXNlIFRFU1RfU0UwX05BSzoKLQkJCQkJY2FzZSBURVNUX1BBQ0tFVDoKLQkJCQkJY2FzZSBURVNUX0ZPUkNFX0VOOgotCQkJCQkJY2ktPnRlc3RfbW9kZSA9IHRtb2RlOwotCQkJCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZSgKLQkJCQkJCQkJY2kpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCWdvdG8gZGVsZWdhdGU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci1kZWxlZ2F0ZToKLQkJCWlmIChyZXEud0xlbmd0aCA9PSAwKSAgIC8qIG5vIGRhdGEgcGhhc2UgKi8KLQkJCQljaS0+ZXAwX2RpciA9IFRYOwotCi0JCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwotCQkJZXJyID0gY2ktPmRyaXZlci0+c2V0dXAoJmNpLT5nYWRnZXQsICZyZXEpOwotCQkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlcnIgPCAwKSB7Ci0JCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwotCQkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmaHdlcC0+ZXApKQotCQkJCWRldl9lcnIoY2ktPmRldiwgImVycm9yOiBlcF9zZXRfaGFsdFxuIik7Ci0JCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKLQkJfQorCQkvKiBPbmx5IGhhbmRsZSBzZXR1cCBwYWNrZXQgYmVsb3cgKi8KKwkJaWYgKGkgPT0gMCAmJgorCQkJaHdfdGVzdF9hbmRfY2xlYXIoY2ksIE9QX0VORFBUU0VUVVBTVEFULCBCSVQoMCkpKQorCQkJaXNyX3NldHVwX3BhY2tldF9oYW5kbGVyKGNpKTsKIAl9CiB9CiAKQEAgLTExOTMsNiArMTE5MCwxMSBAQAogCiAJaHdlcC0+cWgucHRyLT50ZC5uZXh0IHw9IGNwdV90b19sZTMyKFREX1RFUk1JTkFURSk7ICAgLyogbmVlZGVkPyAqLwogCisJaWYgKGh3ZXAtPm51bSAhPSAwICYmIGh3ZXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkgeworCQlkZXZfZXJyKGh3ZXAtPmNpLT5kZXYsICJTZXQgY29udHJvbCB4ZmVyIGF0IG5vbi1lcDBcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKwogCS8qCiAJICogRW5hYmxlIGVuZHBvaW50cyBpbiB0aGUgSFcgb3RoZXIgdGhhbiBlcDAgYXMgZXAwCiAJICogaXMgYWx3YXlzIGVuYWJsZWQKQEAgLTE4MzcsMTIgKzE4MzksNiBAQAogCiAJZG1hX3Bvb2xfZGVzdHJveShjaS0+dGRfcG9vbCk7CiAJZG1hX3Bvb2xfZGVzdHJveShjaS0+cWhfcG9vbCk7Ci0KLQlpZiAoY2ktPnRyYW5zY2VpdmVyKSB7Ci0JCW90Z19zZXRfcGVyaXBoZXJhbChjaS0+dHJhbnNjZWl2ZXItPm90ZywgTlVMTCk7Ci0JCWlmIChjaS0+Z2xvYmFsX3BoeSkKLQkJCXVzYl9wdXRfcGh5KGNpLT50cmFuc2NlaXZlcik7Ci0JfQogfQogCiBzdGF0aWMgaW50IHVkY19pZF9zd2l0Y2hfZm9yX2RldmljZShzdHJ1Y3QgY2lfaGRyYyAqY2kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jIGIvZHJpdmVycy91c2IvY29yZS9jb25maWcuYwppbmRleCAwNjI5NjdjLi4xYWI0ZGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKQEAgLTEwLDcgKzEwLDYgQEAKIAogCiAjZGVmaW5lIFVTQl9NQVhBTFRTRVRUSU5HCQkxMjgJLyogSGFyZCBsaW1pdCAqLwotI2RlZmluZSBVU0JfTUFYRU5EUE9JTlRTCQkzMAkvKiBIYXJkIGxpbWl0ICovCiAKICNkZWZpbmUgVVNCX01BWENPTkZJRwkJCTgJLyogQXJiaXRyYXJ5IGxpbWl0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCA5MGUxOGY2Li4yNTc4NzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC02Miw3ICs2Miw3IEBACiAvKiBNdXR1YWwgZXhjbHVzaW9uIGZvciByZW1vdmFsLCBvcGVuLCBhbmQgcmVsZWFzZSAqLwogREVGSU5FX01VVEVYKHVzYmZzX211dGV4KTsKIAotc3RydWN0IGRldl9zdGF0ZSB7CitzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgICAgIC8qIHN0YXRlIGxpc3QgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCBmaWxlICpmaWxlOwpAQCAtODEsNyArODEsNyBAQAogCiBzdHJ1Y3QgYXN5bmMgewogCXN0cnVjdCBsaXN0X2hlYWQgYXN5bmNsaXN0OwotCXN0cnVjdCBkZXZfc3RhdGUgKnBzOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwczsKIAlzdHJ1Y3QgcGlkICpwaWQ7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQ7CiAJdW5zaWduZWQgaW50IHNpZ25yOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJYXRvbWljX3N1YihhbW91bnQsICZ1c2Jmc19tZW1vcnlfdXNhZ2UpOwogfQogCi1zdGF0aWMgaW50IGNvbm5lY3RlZChzdHJ1Y3QgZGV2X3N0YXRlICpwcykKK3N0YXRpYyBpbnQgY29ubmVjdGVkKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAlyZXR1cm4gKCFsaXN0X2VtcHR5KCZwcy0+bGlzdCkgJiYKIAkJCXBzLT5kZXYtPnN0YXRlICE9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCk7CkBAIC0xODQsNyArMTg0LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHVzYmRldl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLAogCQkJICAgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcHMtPmRldjsKIAlzc2l6ZV90IHJldCA9IDA7CiAJdW5zaWduZWQgbGVuOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAKIHN0YXRpYyB2b2lkIGFzeW5jX25ld3BlbmRpbmcoc3RydWN0IGFzeW5jICphcykKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGFzLT5wczsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcy0+bG9jaywgZmxhZ3MpOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAKIHN0YXRpYyB2b2lkIGFzeW5jX3JlbW92ZXBlbmRpbmcoc3RydWN0IGFzeW5jICphcykKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGFzLT5wczsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcy0+bG9jaywgZmxhZ3MpOwpAQCAtMzI1LDcgKzMyNSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHMtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBhc3luYyAqYXN5bmNfZ2V0Y29tcGxldGVkKHN0cnVjdCBkZXZfc3RhdGUgKnBzKQorc3RhdGljIHN0cnVjdCBhc3luYyAqYXN5bmNfZ2V0Y29tcGxldGVkKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBhc3luYyAqYXMgPSBOVUxMOwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJcmV0dXJuIGFzOwogfQogCi1zdGF0aWMgc3RydWN0IGFzeW5jICphc3luY19nZXRwZW5kaW5nKHN0cnVjdCBkZXZfc3RhdGUgKnBzLAorc3RhdGljIHN0cnVjdCBhc3luYyAqYXN5bmNfZ2V0cGVuZGluZyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCiAJCQkJCSAgICAgdm9pZCBfX3VzZXIgKnVzZXJ1cmIpCiB7CiAJc3RydWN0IGFzeW5jICphczsKQEAgLTQ0OCw3ICs0NDgsNyBAQAogI2RlZmluZSBBU19DT05USU5VQVRJT04JMQogI2RlZmluZSBBU19VTkxJTksJMgogCi1zdGF0aWMgdm9pZCBjYW5jZWxfYnVsa191cmJzKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBidWxrX2FkZHIpCitzdGF0aWMgdm9pZCBjYW5jZWxfYnVsa191cmJzKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdW5zaWduZWQgYnVsa19hZGRyKQogX19yZWxlYXNlcyhwcy0+bG9jaykKIF9fYWNxdWlyZXMocHMtPmxvY2spCiB7CkBAIC00ODksNyArNDg5LDcgQEAKIHN0YXRpYyB2b2lkIGFzeW5jX2NvbXBsZXRlZChzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGFzeW5jICphcyA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGFzLT5wczsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CiAJc3RydWN0IHNpZ2luZm8gc2luZm87CiAJc3RydWN0IHBpZCAqcGlkID0gTlVMTDsKIAl1MzIgc2VjaWQgPSAwOwpAQCAtNTI5LDcgKzUyOSw3IEBACiAJd2FrZV91cCgmcHMtPndhaXQpOwogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X2FzeW5jKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorc3RhdGljIHZvaWQgZGVzdHJveV9hc3luYyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IHVyYiAqdXJiOwogCXN0cnVjdCBhc3luYyAqYXM7CkBAIC01NTEsNyArNTUxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcy0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X2FzeW5jX29uX2ludGVyZmFjZShzdHJ1Y3QgZGV2X3N0YXRlICpwcywKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfYXN5bmNfb25faW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGlmbnVtKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxLCBoaXRsaXN0OwpAQCAtNTY2LDcgKzU2Niw3IEBACiAJZGVzdHJveV9hc3luYyhwcywgJmhpdGxpc3QpOwogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X2FsbF9hc3luYyhzdHJ1Y3QgZGV2X3N0YXRlICpwcykKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfYWxsX2FzeW5jKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAlkZXN0cm95X2FzeW5jKHBzLCAmcHMtPmFzeW5jX3BlbmRpbmcpOwogfQpAQCAtNTg1LDcgKzU4NSw3IEBACiAKIHN0YXRpYyB2b2lkIGRyaXZlcl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXVuc2lnbmVkIGludCBpZm51bSA9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAogCWlmICghcHMpCkBAIC02MjgsNyArNjI4LDcgQEAKIAkucmVzdW1lID0JZHJpdmVyX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgY2xhaW1pbnRmKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCitzdGF0aWMgaW50IGNsYWltaW50ZihzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHVuc2lnbmVkIGludCBpZm51bSkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcHMtPmRldjsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKQEAgLTY1MCw3ICs2NTAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcmVsZWFzZWludGYoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHVuc2lnbmVkIGludCBpZm51bSkKK3N0YXRpYyBpbnQgcmVsZWFzZWludGYoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKQEAgLTY3MCw3ICs2NzAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tpbnRmKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCitzdGF0aWMgaW50IGNoZWNraW50ZihzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHVuc2lnbmVkIGludCBpZm51bSkKIHsKIAlpZiAocHMtPmRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpCiAJCXJldHVybiAtRUhPU1RVTlJFQUNIOwpAQCAtNzEwLDcgKzcxMCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfY3RybHJlY2lwKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgcmVxdWVzdHR5cGUsCitzdGF0aWMgaW50IGNoZWNrX2N0cmxyZWNpcChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHVuc2lnbmVkIGludCByZXF1ZXN0dHlwZSwKIAkJCSAgIHVuc2lnbmVkIGludCByZXF1ZXN0LCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJaW50IHJldCA9IDA7CkBAIC03NjksNiArNzY5LDg4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXBfdG9faG9zdF9lbmRwb2ludChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkJCQkJICAgICB1bnNpZ25lZCBjaGFyIGVwKQoreworCWlmIChlcCAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKwkJcmV0dXJuIGRldi0+ZXBfaW5bZXAgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0tdOworCWVsc2UKKwkJcmV0dXJuIGRldi0+ZXBfb3V0W2VwICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLXTsKK30KKworc3RhdGljIGludCBwYXJzZV91c2JkZXZmc19zdHJlYW1zKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywKKwkJCQkgIHN0cnVjdCB1c2JkZXZmc19zdHJlYW1zIF9fdXNlciAqc3RyZWFtcywKKwkJCQkgIHVuc2lnbmVkIGludCAqbnVtX3N0cmVhbXNfcmV0LAorCQkJCSAgdW5zaWduZWQgaW50ICpudW1fZXBzX3JldCwKKwkJCQkgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKiplcHNfcmV0LAorCQkJCSAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKippbnRmX3JldCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbnVtX3N0cmVhbXMsIG51bV9lcHM7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICoqZXBzOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGVwOworCWludCBpZm51bSwgcmV0OworCisJaWYgKGdldF91c2VyKG51bV9zdHJlYW1zLCAmc3RyZWFtcy0+bnVtX3N0cmVhbXMpIHx8CisJICAgIGdldF91c2VyKG51bV9lcHMsICZzdHJlYW1zLT5udW1fZXBzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobnVtX2VwcyA8IDEgfHwgbnVtX2VwcyA+IFVTQl9NQVhFTkRQT0lOVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIFhIQ0kgY29udHJvbGxlciBhbGxvd3MgbWF4IDIgXiAxNiBzdHJlYW1zICovCisJaWYgKG51bV9zdHJlYW1zX3JldCAmJiAobnVtX3N0cmVhbXMgPCAyIHx8IG51bV9zdHJlYW1zID4gNjU1MzYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVwcyA9IGttYWxsb2MobnVtX2VwcyAqIHNpemVvZigqZXBzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcHMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lcHM7IGkrKykgeworCQlpZiAoZ2V0X3VzZXIoZXAsICZzdHJlYW1zLT5lcHNbaV0pKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcjsKKwkJfQorCQllcHNbaV0gPSBlcF90b19ob3N0X2VuZHBvaW50KHBzLT5kZXYsIGVwKTsKKwkJaWYgKCFlcHNbaV0pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogdXNiX2FsbG9jL2ZyZWVfc3RyZWFtcyBvcGVyYXRlIG9uIGFuIHVzYl9pbnRlcmZhY2UgKi8KKwkJaWZudW0gPSBmaW5kaW50ZmVwKHBzLT5kZXYsIGVwKTsKKwkJaWYgKGlmbnVtIDwgMCkgeworCQkJcmV0ID0gaWZudW07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKGkgPT0gMCkgeworCQkJcmV0ID0gY2hlY2tpbnRmKHBzLCBpZm51bSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJaW50ZiA9IHVzYl9pZm51bV90b19pZihwcy0+ZGV2LCBpZm51bSk7CisJCX0gZWxzZSB7CisJCQkvKiBWZXJpZnkgYWxsIGVwcyBiZWxvbmcgdG8gdGhlIHNhbWUgaW50ZXJmYWNlICovCisJCQlpZiAoaWZudW0gIT0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJfQorCisJaWYgKG51bV9zdHJlYW1zX3JldCkKKwkJKm51bV9zdHJlYW1zX3JldCA9IG51bV9zdHJlYW1zOworCSpudW1fZXBzX3JldCA9IG51bV9lcHM7CisJKmVwc19yZXQgPSBlcHM7CisJKmludGZfcmV0ID0gaW50ZjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlrZnJlZShlcHMpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbWF0Y2hfZGV2dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIGRldi0+ZGV2dCA9PSAoZGV2X3QpICh1bnNpZ25lZCBsb25nKSBkYXRhOwpAQCAtNzkxLDExICs4NzMsMTEgQEAKIHN0YXRpYyBpbnQgdXNiZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzOwogCWludCByZXQ7CiAKIAlyZXQgPSAtRU5PTUVNOwotCXBzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9zdGF0ZSksIEdGUF9LRVJORUwpOworCXBzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9kZXZfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBzKQogCQlnb3RvIG91dF9mcmVlX3BzOwogCkBAIC04NTIsNyArOTM0LDcgQEAKIAogc3RhdGljIGludCB1c2JkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJdW5zaWduZWQgaW50IGlmbnVtOwogCXN0cnVjdCBhc3luYyAqYXM7CkBAIC04ODMsNyArOTY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2NvbnRyb2woc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY29udHJvbChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciBjdHJsOwpAQCAtOTcwLDcgKzEwNTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19idWxrKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2J1bGsoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIgYnVsazsKQEAgLTEwNDMsNyArMTEyNSwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZXNldGVwKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIHZvaWQgY2hlY2tfcmVzZXRfb2ZfYWN0aXZlX2VwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQl1bnNpZ25lZCBpbnQgZXBudW0sIGNoYXIgKmlvY3RsX25hbWUpCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICoqZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CisKKwllcHMgPSAoZXBudW0gJiBVU0JfRElSX0lOKSA/IHVkZXYtPmVwX2luIDogdWRldi0+ZXBfb3V0OworCWVwID0gZXBzW2VwbnVtICYgMHgwZl07CisJaWYgKGVwICYmICFsaXN0X2VtcHR5KCZlcC0+dXJiX2xpc3QpKQorCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiUHJvY2VzcyAlZCAoJXMpIGNhbGxlZCBVU0JERVZGU18lcyBmb3IgYWN0aXZlIGVuZHBvaW50IDB4JTAyeFxuIiwKKwkJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgY3VycmVudC0+Y29tbSwKKwkJCQlpb2N0bF9uYW1lLCBlcG51bSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yZXNldGVwKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgZXA7CiAJaW50IHJldDsKQEAgLTEwNTYsMTEgKzExNTIsMTIgQEAKIAlyZXQgPSBjaGVja2ludGYocHMsIHJldCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwljaGVja19yZXNldF9vZl9hY3RpdmVfZXAocHMtPmRldiwgZXAsICJSRVNFVEVQIik7CiAJdXNiX3Jlc2V0X2VuZHBvaW50KHBzLT5kZXYsIGVwKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2NsZWFyaGFsdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19jbGVhcmhhbHQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXVuc2lnbmVkIGludCBlcDsKIAlpbnQgcGlwZTsKQEAgLTEwNzQsNiArMTE3MSw3IEBACiAJcmV0ID0gY2hlY2tpbnRmKHBzLCByZXQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJY2hlY2tfcmVzZXRfb2ZfYWN0aXZlX2VwKHBzLT5kZXYsIGVwLCAiQ0xFQVJfSEFMVCIpOwogCWlmIChlcCAmIFVTQl9ESVJfSU4pCiAJCXBpcGUgPSB1c2JfcmN2YnVsa3BpcGUocHMtPmRldiwgZXAgJiAweDdmKTsKIAllbHNlCkBAIC0xMDgyLDcgKzExODAsNyBAQAogCXJldHVybiB1c2JfY2xlYXJfaGFsdChwcy0+ZGV2LCBwaXBlKTsKIH0KIAotc3RhdGljIGludCBwcm9jX2dldGRyaXZlcihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19nZXRkcml2ZXIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19nZXRkcml2ZXIgZ2Q7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CkBAIC0xMTAxLDcgKzExOTksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19jb25uZWN0aW5mbyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19jb25uZWN0aW5mbyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX2Nvbm5lY3RpbmZvIGNpID0gewogCQkuZGV2bnVtID0gcHMtPmRldi0+ZGV2bnVtLApAQCAtMTExMywxMiArMTIxMSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVzZXRkZXZpY2Uoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgaW50IHByb2NfcmVzZXRkZXZpY2Uoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzKQogewogCXJldHVybiB1c2JfcmVzZXRfZGV2aWNlKHBzLT5kZXYpOwogfQogCi1zdGF0aWMgaW50IHByb2Nfc2V0aW50ZihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19zZXRpbnRmKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfc2V0aW50ZXJmYWNlIHNldGludGY7CiAJaW50IHJldDsKQEAgLTExMjcsMTEgKzEyMjUsMTQgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKChyZXQgPSBjaGVja2ludGYocHMsIHNldGludGYuaW50ZXJmYWNlKSkpCiAJCXJldHVybiByZXQ7CisKKwlkZXN0cm95X2FzeW5jX29uX2ludGVyZmFjZShwcywgc2V0aW50Zi5pbnRlcmZhY2UpOworCiAJcmV0dXJuIHVzYl9zZXRfaW50ZXJmYWNlKHBzLT5kZXYsIHNldGludGYuaW50ZXJmYWNlLAogCQkJc2V0aW50Zi5hbHRzZXR0aW5nKTsKIH0KIAotc3RhdGljIGludCBwcm9jX3NldGNvbmZpZyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19zZXRjb25maWcoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCWludCB1OwogCWludCBzdGF0dXMgPSAwOwpAQCAtMTE3OSw3ICsxMjgwLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IHByb2NfZG9fc3VibWl0dXJiKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgdXNiZGV2ZnNfdXJiICp1dXJiLAorc3RhdGljIGludCBwcm9jX2RvX3N1Ym1pdHVyYihzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHN0cnVjdCB1c2JkZXZmc191cmIgKnV1cmIsCiAJCQlzdHJ1Y3QgdXNiZGV2ZnNfaXNvX3BhY2tldF9kZXNjIF9fdXNlciAqaXNvX2ZyYW1lX2Rlc2MsCiAJCQl2b2lkIF9fdXNlciAqYXJnKQogewpAQCAtMTE4OSw2ICsxMjkwLDggQEAKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkciA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHUsIHRvdGxlbiwgaXNvZnJtbGVuOwogCWludCBpLCByZXQsIGlzX2luLCBudW1fc2dzID0gMCwgaWZudW0gPSAtMTsKKwlpbnQgbnVtYmVyX29mX3BhY2tldHMgPSAwOworCXVuc2lnbmVkIGludCBzdHJlYW1faWQgPSAwOwogCXZvaWQgKmJ1ZjsKIAogCWlmICh1dXJiLT5mbGFncyAmIH4oVVNCREVWRlNfVVJCX0lTT19BU0FQIHwKQEAgLTEyMDksMTUgKzEzMTIsMTAgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQotCWlmICgodXVyYi0+ZW5kcG9pbnQgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IDApIHsKLQkJaXNfaW4gPSAxOwotCQllcCA9IHBzLT5kZXYtPmVwX2luW3V1cmItPmVuZHBvaW50ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLXTsKLQl9IGVsc2UgewotCQlpc19pbiA9IDA7Ci0JCWVwID0gcHMtPmRldi0+ZXBfb3V0W3V1cmItPmVuZHBvaW50ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLXTsKLQl9CisJZXAgPSBlcF90b19ob3N0X2VuZHBvaW50KHBzLT5kZXYsIHV1cmItPmVuZHBvaW50KTsKIAlpZiAoIWVwKQogCQlyZXR1cm4gLUVOT0VOVDsKKwlpc19pbiA9ICh1dXJiLT5lbmRwb2ludCAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgIT0gMDsKIAogCXUgPSAwOwogCXN3aXRjaCh1dXJiLT50eXBlKSB7CkBAIC0xMjQyLDcgKzEzNDAsNiBAQAogCQkJCSAgICAgIGxlMTZfdG9fY3B1cCgmZHItPndJbmRleCkpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKLQkJdXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAwOwogCQl1dXJiLT5idWZmZXJfbGVuZ3RoID0gbGUxNl90b19jcHVwKCZkci0+d0xlbmd0aCk7CiAJCXV1cmItPmJ1ZmZlciArPSA4OwogCQlpZiAoKGRyLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSAmJiB1dXJiLT5idWZmZXJfbGVuZ3RoKSB7CkBAIC0xMjcyLDE3ICsxMzY5LDE3IEBACiAJCQl1dXJiLT50eXBlID0gVVNCREVWRlNfVVJCX1RZUEVfSU5URVJSVVBUOwogCQkJZ290byBpbnRlcnJ1cHRfdXJiOwogCQl9Ci0JCXV1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKIAkJbnVtX3NncyA9IERJVl9ST1VORF9VUCh1dXJiLT5idWZmZXJfbGVuZ3RoLCBVU0JfU0dfU0laRSk7CiAJCWlmIChudW1fc2dzID09IDEgfHwgbnVtX3NncyA+IHBzLT5kZXYtPmJ1cy0+c2dfdGFibGVzaXplKQogCQkJbnVtX3NncyA9IDA7CisJCWlmIChlcC0+c3RyZWFtcykKKwkJCXN0cmVhbV9pZCA9IHV1cmItPnN0cmVhbV9pZDsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1VSQl9UWVBFX0lOVEVSUlVQVDoKIAkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pbnQoJmVwLT5kZXNjKSkKIAkJCXJldHVybiAtRUlOVkFMOwogIGludGVycnVwdF91cmI6Ci0JCXV1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1VSQl9UWVBFX0lTTzoKQEAgLTEyOTIsMTUgKzEzODksMTYgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoJmVwLT5kZXNjKSkKIAkJCXJldHVybiAtRUlOVkFMOworCQludW1iZXJfb2ZfcGFja2V0cyA9IHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOwogCQlpc29mcm1sZW4gPSBzaXplb2Yoc3RydWN0IHVzYmRldmZzX2lzb19wYWNrZXRfZGVzYykgKgotCQkJCSAgIHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCQkJCSAgIG51bWJlcl9vZl9wYWNrZXRzOwogCQlpZiAoIShpc29wa3QgPSBrbWFsbG9jKGlzb2ZybWxlbiwgR0ZQX0tFUk5FTCkpKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWlmIChjb3B5X2Zyb21fdXNlcihpc29wa3QsIGlzb19mcmFtZV9kZXNjLCBpc29mcm1sZW4pKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byBlcnJvcjsKIAkJfQotCQlmb3IgKHRvdGxlbiA9IHUgPSAwOyB1IDwgdXVyYi0+bnVtYmVyX29mX3BhY2tldHM7IHUrKykgeworCQlmb3IgKHRvdGxlbiA9IHUgPSAwOyB1IDwgbnVtYmVyX29mX3BhY2tldHM7IHUrKykgewogCQkJLyoKIAkJCSAqIGFyYml0cmFyeSBsaW1pdCBuZWVkIGZvciBVU0IgMy4wCiAJCQkgKiBiTWF4QnVyc3QgKDB+MTUgYWxsb3dlZCwgMX4xNiBwYWNrZXRzKQpAQCAtMTMzMSw3ICsxNDI5LDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBlcnJvcjsKIAl9Ci0JYXMgPSBhbGxvY19hc3luYyh1dXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7CisJYXMgPSBhbGxvY19hc3luYyhudW1iZXJfb2ZfcGFja2V0cyk7CiAJaWYgKCFhcykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOwpAQCAtMTQyNSw3ICsxNTIzLDggQEAKIAlhcy0+dXJiLT5zZXR1cF9wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKWRyOwogCWRyID0gTlVMTDsKIAlhcy0+dXJiLT5zdGFydF9mcmFtZSA9IHV1cmItPnN0YXJ0X2ZyYW1lOwotCWFzLT51cmItPm51bWJlcl9vZl9wYWNrZXRzID0gdXVyYi0+bnVtYmVyX29mX3BhY2tldHM7CisJYXMtPnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBudW1iZXJfb2ZfcGFja2V0czsKKwlhcy0+dXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CiAJaWYgKHV1cmItPnR5cGUgPT0gVVNCREVWRlNfVVJCX1RZUEVfSVNPIHx8CiAJCQlwcy0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJYXMtPnVyYi0+aW50ZXJ2YWwgPSAxIDw8IG1pbigxNSwgZXAtPmRlc2MuYkludGVydmFsIC0gMSk7CkBAIC0xNDMzLDcgKzE1MzIsNyBAQAogCQlhcy0+dXJiLT5pbnRlcnZhbCA9IGVwLT5kZXNjLmJJbnRlcnZhbDsKIAlhcy0+dXJiLT5jb250ZXh0ID0gYXM7CiAJYXMtPnVyYi0+Y29tcGxldGUgPSBhc3luY19jb21wbGV0ZWQ7Ci0JZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKKwlmb3IgKHRvdGxlbiA9IHUgPSAwOyB1IDwgbnVtYmVyX29mX3BhY2tldHM7IHUrKykgewogCQlhcy0+dXJiLT5pc29fZnJhbWVfZGVzY1t1XS5vZmZzZXQgPSB0b3RsZW47CiAJCWFzLT51cmItPmlzb19mcmFtZV9kZXNjW3VdLmxlbmd0aCA9IGlzb3BrdFt1XS5sZW5ndGg7CiAJCXRvdGxlbiArPSBpc29wa3RbdV0ubGVuZ3RoOwpAQCAtMTUwOCw3ICsxNjA3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2Nfc3VibWl0dXJiKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3N1Ym1pdHVyYihzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX3VyYiB1dXJiOwogCkBAIC0xNTIwLDcgKzE2MTksNyBAQAogCQkJYXJnKTsKIH0KIAotc3RhdGljIGludCBwcm9jX3VubGlua3VyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY191bmxpbmt1cmIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1cmIgKnVyYjsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtMTU4MCw3ICsxNjc5LDcgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotc3RhdGljIHN0cnVjdCBhc3luYyAqcmVhcF9hcyhzdHJ1Y3QgZGV2X3N0YXRlICpwcykKK3N0YXRpYyBzdHJ1Y3QgYXN5bmMgKnJlYXBfYXMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzKQogewogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCBhc3luYyAqYXMgPSBOVUxMOwpAQCAtMTYwMyw3ICsxNzAyLDcgQEAKIAlyZXR1cm4gYXM7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWFwdXJiKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3JlYXB1cmIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBhc3luYyAqYXMgPSByZWFwX2FzKHBzKTsKIAlpZiAoYXMpIHsKQEAgLTE2MTYsNyArMTcxNSw3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWFwdXJibm9uYmxvY2soc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfcmVhcHVyYm5vbmJsb2NrKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBhc3luYyAqYXM7CkBAIC0xNjMxLDcgKzE3MzAsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGludCBwcm9jX2NvbnRyb2xfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLAorc3RhdGljIGludCBwcm9jX2NvbnRyb2xfY29tcGF0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywKIAkJCQlzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIgX191c2VyICpwMzIpCiB7CiAJc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciBfX3VzZXIgKnA7CkBAIC0xNjQ0LDcgKzE3NDMsNyBAQAogCXJldHVybiBwcm9jX2NvbnRyb2wocHMsIHApOwogfQogCi1zdGF0aWMgaW50IHByb2NfYnVsa19jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsCitzdGF0aWMgaW50IHByb2NfYnVsa19jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLAogCQkJc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlcjMyIF9fdXNlciAqcDMyKQogewogCXN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIgX191c2VyICpwOwpAQCAtMTY2MSw3ICsxNzYwLDcgQEAKIAogCXJldHVybiBwcm9jX2J1bGsocHMsIHApOwogfQotc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RzaWduYWxfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RzaWduYWxfY29tcGF0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbDMyIGRzOwogCkBAIC0xNjk5LDcgKzE3OTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nfc3VibWl0dXJiX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19zdWJtaXR1cmJfY29tcGF0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfdXJiIHV1cmI7CiAKQEAgLTE3NDUsNyArMTg0NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWFwdXJiX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19yZWFwdXJiX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IGFzeW5jICphcyA9IHJlYXBfYXMocHMpOwogCWlmIChhcykgewpAQCAtMTc1OCw3ICsxODU3LDcgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBwcm9jX3JlYXB1cmJub25ibG9ja19jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfcmVhcHVyYm5vbmJsb2NrX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtMTc3NSw3ICsxODc0LDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RzaWduYWwoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0c2lnbmFsIGRzOwogCkBAIC0xNzg2LDcgKzE4ODUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2NfY2xhaW1pbnRlcmZhY2Uoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY2xhaW1pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXVuc2lnbmVkIGludCBpZm51bTsKIApAQCAtMTc5NSw3ICsxODk0LDcgQEAKIAlyZXR1cm4gY2xhaW1pbnRmKHBzLCBpZm51bSk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWxlYXNlaW50ZXJmYWNlKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3JlbGVhc2VpbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXVuc2lnbmVkIGludCBpZm51bTsKIAlpbnQgcmV0OwpAQCAtMTgwOCw3ICsxOTA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2lvY3RsKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwgKmN0bCkKK3N0YXRpYyBpbnQgcHJvY19pb2N0bChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHN0cnVjdCB1c2JkZXZmc19pb2N0bCAqY3RsKQogewogCWludAkJCXNpemU7CiAJdm9pZAkJCSpidWYgPSBOVUxMOwpAQCAtMTg4NCw3ICsxOTgzLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHByb2NfaW9jdGxfZGVmYXVsdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19pb2N0bF9kZWZhdWx0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwJY3RybDsKIApAQCAtMTg5NCw3ICsxOTkzLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgcHJvY19pb2N0bF9jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIGNvbXBhdF91cHRyX3QgYXJnKQorc3RhdGljIGludCBwcm9jX2lvY3RsX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIGNvbXBhdF91cHRyX3QgYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19pb2N0bDMyIF9fdXNlciAqdWlvYzsKIAlzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwgY3RybDsKQEAgLTE5MTIsNyArMjAxMSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBwcm9jX2NsYWltX3BvcnQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY2xhaW1fcG9ydChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJdW5zaWduZWQgcG9ydG51bTsKIAlpbnQgcmM7CkBAIC0xOTI2LDcgKzIwMjUsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBwcm9jX3JlbGVhc2VfcG9ydChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19yZWxlYXNlX3BvcnQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXVuc2lnbmVkIHBvcnRudW07CiAKQEAgLTE5MzUsNyArMjAzNCw3IEBACiAJcmV0dXJuIHVzYl9odWJfcmVsZWFzZV9wb3J0KHBzLT5kZXYsIHBvcnRudW0sIHBzKTsKIH0KIAotc3RhdGljIGludCBwcm9jX2dldF9jYXBhYmlsaXRpZXMoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJX191MzIgY2FwczsKIApAQCAtMTk1MSw3ICsyMDUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RfY2xhaW0oc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfZGlzY29ubmVjdF9jbGFpbShzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RfY2xhaW0gZGM7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CkBAIC0xOTgzLDYgKzIwODIsNDUgQEAKIAlyZXR1cm4gY2xhaW1pbnRmKHBzLCBkYy5pbnRlcmZhY2UpOwogfQogCitzdGF0aWMgaW50IHByb2NfYWxsb2Nfc3RyZWFtcyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCit7CisJdW5zaWduZWQgbnVtX3N0cmVhbXMsIG51bV9lcHM7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICoqZXBzOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCWludCByOworCisJciA9IHBhcnNlX3VzYmRldmZzX3N0cmVhbXMocHMsIGFyZywgJm51bV9zdHJlYW1zLCAmbnVtX2VwcywKKwkJCQkgICAmZXBzLCAmaW50Zik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2UocHMsCisJCQkJICAgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisJciA9IHVzYl9hbGxvY19zdHJlYW1zKGludGYsIGVwcywgbnVtX2VwcywgbnVtX3N0cmVhbXMsIEdGUF9LRVJORUwpOworCWtmcmVlKGVwcyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19mcmVlX3N0cmVhbXMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXVuc2lnbmVkIG51bV9lcHM7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICoqZXBzOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCWludCByOworCisJciA9IHBhcnNlX3VzYmRldmZzX3N0cmVhbXMocHMsIGFyZywgTlVMTCwgJm51bV9lcHMsICZlcHMsICZpbnRmKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlkZXN0cm95X2FzeW5jX29uX2ludGVyZmFjZShwcywKKwkJCQkgICBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlcik7CisKKwlyID0gdXNiX2ZyZWVfc3RyZWFtcyhpbnRmLCBlcHMsIG51bV9lcHMsIEdGUF9LRVJORUwpOworCWtmcmVlKGVwcyk7CisJcmV0dXJuIHI7Cit9CisKIC8qCiAgKiBOT1RFOiAgQWxsIHJlcXVlc3RzIGhlcmUgdGhhdCBoYXZlIGludGVyZmFjZSBudW1iZXJzIGFzIHBhcmFtZXRlcnMKICAqIGFyZSBhc3N1bWluZyB0aGF0IHNvbWVob3cgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gcHJldmVudGVkIGZyb20KQEAgLTE5OTEsNyArMjEyOSw3IEBACiBzdGF0aWMgbG9uZyB1c2JkZXZfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJdm9pZCBfX3VzZXIgKnApCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCWludCByZXQgPSAtRU5PVFRZOwpAQCAtMjE1OSw2ICsyMjk3LDEyIEBACiAJY2FzZSBVU0JERVZGU19ESVNDT05ORUNUX0NMQUlNOgogCQlyZXQgPSBwcm9jX2Rpc2Nvbm5lY3RfY2xhaW0ocHMsIHApOwogCQlicmVhazsKKwljYXNlIFVTQkRFVkZTX0FMTE9DX1NUUkVBTVM6CisJCXJldCA9IHByb2NfYWxsb2Nfc3RyZWFtcyhwcywgcCk7CisJCWJyZWFrOworCWNhc2UgVVNCREVWRlNfRlJFRV9TVFJFQU1TOgorCQlyZXQgPSBwcm9jX2ZyZWVfc3RyZWFtcyhwcywgcCk7CisJCWJyZWFrOwogCX0KIAl1c2JfdW5sb2NrX2RldmljZShkZXYpOwogCWlmIChyZXQgPj0gMCkKQEAgLTIxOTIsNyArMjMzNiw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHVzYmRldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCiAJcG9sbF93YWl0KGZpbGUsICZwcy0+d2FpdCwgd2FpdCk7CkBAIC0yMjE4LDExICsyMzYyLDExIEBACiAKIHN0YXRpYyB2b2lkIHVzYmRldl9yZW1vdmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzOwogCXN0cnVjdCBzaWdpbmZvIHNpbmZvOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ1ZGV2LT5maWxlbGlzdCkpIHsKLQkJcHMgPSBsaXN0X2VudHJ5KHVkZXYtPmZpbGVsaXN0Lm5leHQsIHN0cnVjdCBkZXZfc3RhdGUsIGxpc3QpOworCQlwcyA9IGxpc3RfZW50cnkodWRldi0+ZmlsZWxpc3QubmV4dCwgc3RydWN0IHVzYl9kZXZfc3RhdGUsIGxpc3QpOwogCQlkZXN0cm95X2FsbF9hc3luYyhwcyk7CiAJCXdha2VfdXBfYWxsKCZwcy0+d2FpdCk7CiAJCWxpc3RfZGVsX2luaXQoJnBzLT5saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IGFiOTBhMDEuLjg4ODg4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMzEyLDkgKzMxMiw5IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZCA9IHVzYl9tYXRjaF9pZChpbnRmLCBkcml2ZXItPmlkX3RhYmxlKTsKKwlpZCA9IHVzYl9tYXRjaF9keW5hbWljX2lkKGludGYsIGRyaXZlcik7CiAJaWYgKCFpZCkKLQkJaWQgPSB1c2JfbWF0Y2hfZHluYW1pY19pZChpbnRmLCBkcml2ZXIpOworCQlpZCA9IHVzYl9tYXRjaF9pZChpbnRmLCBkcml2ZXItPmlkX3RhYmxlKTsKIAlpZiAoIWlkKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTQwMCw4ICs0MDAsOSBAQAogewogCXN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIgPSB0b191c2JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLCAqKmVwcyA9IE5VTEw7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0JaW50IGVycm9yLCByLCBscG1fZGlzYWJsZV9lcnJvcjsKKwlpbnQgaSwgaiwgZXJyb3IsIHIsIGxwbV9kaXNhYmxlX2Vycm9yOwogCiAJaW50Zi0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9VTkJJTkRJTkc7CiAKQEAgLTQyNSw2ICs0MjYsMjYgQEAKIAlkcml2ZXItPmRpc2Nvbm5lY3QoaW50Zik7CiAJdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoaW50Zik7CiAKKwkvKiBGcmVlIHN0cmVhbXMgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykgeworCQllcCA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV07CisJCWlmIChlcC0+c3RyZWFtcyA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChqID09IDApIHsKKwkJCWVwcyA9IGttYWxsb2MoVVNCX01BWEVORFBPSU5UUyAqIHNpemVvZih2b2lkICopLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFlcHMpIHsKKwkJCQlkZXZfd2FybihkZXYsICJvb20sIGxlYWtpbmcgc3RyZWFtc1xuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZXBzW2orK10gPSBlcDsKKwl9CisJaWYgKGopIHsKKwkJdXNiX2ZyZWVfc3RyZWFtcyhpbnRmLCBlcHMsIGosIEdGUF9LRVJORUwpOworCQlrZnJlZShlcHMpOworCX0KKwogCS8qIFJlc2V0IG90aGVyIGludGVyZmFjZSBzdGF0ZS4KIAkgKiBXZSBjYW5ub3QgZG8gYSBTZXQtSW50ZXJmYWNlIGlmIHRoZSBkZXZpY2UgaXMgc3VzcGVuZGVkIG9yCiAJICogaWYgaXQgaXMgcHJlcGFyZWQgZm9yIGEgc3lzdGVtIHNsZWVwIChzaW5jZSBpbnN0YWxsaW5nIGEgbmV3CkBAIC05OTAsOCArMTAxMSw3IEBACiAgKiBpdCBkb2Vzbid0IHN1cHBvcnQgcHJlX3Jlc2V0L3Bvc3RfcmVzZXQvcmVzZXRfcmVzdW1lIG9yCiAgKiBiZWNhdXNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBzdXNwZW5kL3Jlc3VtZS4KICAqCi0gKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAaW50ZidzIGRldmljZSdzIGxvY2ssIGJ1dCBub3QgaXRzIHBtX211dGV4Ci0gKiBhbmQgbm90IEBpbnRmLT5kZXYuc2VtLgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQGludGYncyBkZXZpY2UncyBsb2NrLCBidXQgbm90IEBpbnRmJ3MgbG9jay4KICAqLwogdm9pZCB1c2JfZm9yY2VkX3VuYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewpAQCAtMTAwNCwxNiArMTAyNCwzNyBAQAogCWludGYtPm5lZWRzX2JpbmRpbmcgPSAxOwogfQogCisvKgorICogVW5iaW5kIGRyaXZlcnMgZm9yIEB1ZGV2J3MgbWFya2VkIGludGVyZmFjZXMuICBUaGVzZSBpbnRlcmZhY2VzIGhhdmUKKyAqIHRoZSBuZWVkc19iaW5kaW5nIGZsYWcgc2V0LCBmb3IgZXhhbXBsZSBieSB1c2JfcmVzdW1lX2ludGVyZmFjZSgpLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEB1ZGV2J3MgZGV2aWNlIGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHVuYmluZF9tYXJrZWRfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSpjb25maWc7CisJaW50CQkJaTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZjsKKworCWNvbmZpZyA9IHVkZXYtPmFjdGNvbmZpZzsKKwlpZiAoY29uZmlnKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7ICsraSkgeworCQkJaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQkJaWYgKGludGYtPmRldi5kcml2ZXIgJiYgaW50Zi0+bmVlZHNfYmluZGluZykKKwkJCQl1c2JfZm9yY2VkX3VuYmluZF9pbnRmKGludGYpOworCQl9CisJfQorfQorCiAvKiBEZWxheWVkIGZvcmNlZCB1bmJpbmRpbmcgb2YgYSBVU0IgaW50ZXJmYWNlIGRyaXZlciBhbmQgc2NhbgogICogZm9yIHJlYmluZGluZy4KICAqCi0gKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAaW50ZidzIGRldmljZSdzIGxvY2ssIGJ1dCBub3QgaXRzIHBtX211dGV4Ci0gKiBhbmQgbm90IEBpbnRmLT5kZXYuc2VtLgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQGludGYncyBkZXZpY2UncyBsb2NrLCBidXQgbm90IEBpbnRmJ3MgbG9jay4KICAqCiAgKiBOb3RlOiBSZWJpbmRzIHdpbGwgYmUgc2tpcHBlZCBpZiBhIHN5c3RlbSBzbGVlcCB0cmFuc2l0aW9uIGlzIGluCiAgKiBwcm9ncmVzcyBhbmQgdGhlIFBNICJjb21wbGV0ZSIgY2FsbGJhY2sgaGFzbid0IG9jY3VycmVkIHlldC4KICAqLwotdm9pZCB1c2JfcmViaW5kX2ludGYoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgdm9pZCB1c2JfcmViaW5kX2ludGYoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJaW50IHJjOwogCkBAIC0xMDMwLDYgKzEwNzEsNDEgQEAKIAl9CiB9CiAKKy8qCisgKiBSZWJpbmQgZHJpdmVycyB0byBAdWRldidzIG1hcmtlZCBpbnRlcmZhY2VzLiAgVGhlc2UgaW50ZXJmYWNlcyBoYXZlCisgKiB0aGUgbmVlZHNfYmluZGluZyBmbGFnIHNldC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCitzdGF0aWMgdm9pZCByZWJpbmRfbWFya2VkX2ludGVyZmFjZXMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9ob3N0X2NvbmZpZwkqY29uZmlnOworCWludAkJCWk7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CisKKwljb25maWcgPSB1ZGV2LT5hY3Rjb25maWc7CisJaWYgKGNvbmZpZykgeworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyArK2kpIHsKKwkJCWludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKKwkJCWlmIChpbnRmLT5uZWVkc19iaW5kaW5nKQorCQkJCXVzYl9yZWJpbmRfaW50ZihpbnRmKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFVuYmluZCBhbGwgb2YgQHVkZXYncyBtYXJrZWQgaW50ZXJmYWNlcyBhbmQgdGhlbiByZWJpbmQgYWxsIG9mIHRoZW0uCisgKiBUaGlzIG9yZGVyaW5nIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgZHJpdmVycyBjbGFpbSBzZXZlcmFsIGludGVyZmFjZXMKKyAqIHdoZW4gdGhleSBhcmUgZmlyc3QgcHJvYmVkLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEB1ZGV2J3MgZGV2aWNlIGxvY2suCisgKi8KK3ZvaWQgdXNiX3VuYmluZF9hbmRfcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXVuYmluZF9tYXJrZWRfaW50ZXJmYWNlcyh1ZGV2KTsKKwlyZWJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7Cit9CisKICNpZmRlZiBDT05GSUdfUE0KIAogLyogVW5iaW5kIGRyaXZlcnMgZm9yIEB1ZGV2J3MgaW50ZXJmYWNlcyB0aGF0IGRvbid0IHN1cHBvcnQgc3VzcGVuZC9yZXN1bWUKQEAgLTEwNTksNDMgKzExMzUsNiBAQAogCX0KIH0KIAotLyogVW5iaW5kIGRyaXZlcnMgZm9yIEB1ZGV2J3MgaW50ZXJmYWNlcyB0aGF0IGZhaWxlZCB0byBzdXBwb3J0IHJlc2V0LXJlc3VtZS4KLSAqIFRoZXNlIGludGVyZmFjZXMgaGF2ZSB0aGUgbmVlZHNfYmluZGluZyBmbGFnIHNldCBieSB1c2JfcmVzdW1lX2ludGVyZmFjZSgpLgotICoKLSAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEB1ZGV2J3MgZGV2aWNlIGxvY2suCi0gKi8KLXN0YXRpYyB2b2lkIHVuYmluZF9ub19yZXNldF9yZXN1bWVfZHJpdmVyc19pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQotewotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcJKmNvbmZpZzsKLQlpbnQJCQlpOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwotCi0JY29uZmlnID0gdWRldi0+YWN0Y29uZmlnOwotCWlmIChjb25maWcpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgKytpKSB7Ci0JCQlpbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQlpZiAoaW50Zi0+ZGV2LmRyaXZlciAmJiBpbnRmLT5uZWVkc19iaW5kaW5nKQotCQkJCXVzYl9mb3JjZWRfdW5iaW5kX2ludGYoaW50Zik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3JlYmluZF9pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQotewotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcJKmNvbmZpZzsKLQlpbnQJCQlpOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwotCi0JY29uZmlnID0gdWRldi0+YWN0Y29uZmlnOwotCWlmIChjb25maWcpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgKytpKSB7Ci0JCQlpbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQlpZiAoaW50Zi0+bmVlZHNfYmluZGluZykKLQkJCQl1c2JfcmViaW5kX2ludGYoaW50Zik7Ci0JCX0KLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdXNiX3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlcgkqdWRyaXZlcjsKQEAgLTE0MjAsNyArMTQ1OSw3IEBACiAJICogd2hvc2UgbmVlZHNfYmluZGluZyBmbGFnIGlzIHNldAogCSAqLwogCWlmICh1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCi0JCWRvX3JlYmluZF9pbnRlcmZhY2VzKHVkZXYpOworCQlyZWJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NDIsNyArMTQ4MSw3IEBACiAJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwogCQlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKIAkJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKLQkJdW5iaW5kX25vX3Jlc2V0X3Jlc3VtZV9kcml2ZXJzX2ludGVyZmFjZXModWRldik7CisJCXVuYmluZF9tYXJrZWRfaW50ZXJmYWNlcyh1ZGV2KTsKIAl9CiAKIAkvKiBBdm9pZCBQTSBlcnJvciBtZXNzYWdlcyBmb3IgZGV2aWNlcyBkaXNjb25uZWN0ZWQgd2hpbGUgc3VzcGVuZGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCmluZGV4IGFjYmZlYjAuLjM1OGNhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCkBAIC0xNTUsNiArMTU1LDcgQEAKIAl9CiAJcmV0dXJuIGk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfY2hvb3NlX2NvbmZpZ3VyYXRpb24pOwogCiBzdGF0aWMgaW50IGdlbmVyaWNfcHJvYmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCAyNTE4YzMyLi45YzRlMjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTIwNDksNyArMjA0OSw3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwotCWludCBpOworCWludCBpLCByZXQ7CiAKIAlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CiAJaGNkID0gYnVzX3RvX2hjZChkZXYtPmJ1cyk7CkBAIC0yMDU4LDEzICsyMDU4LDI0IEBACiAJaWYgKGRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX1NVUEVSKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFN0cmVhbXMgb25seSBhcHBseSB0byBidWxrIGVuZHBvaW50cy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBudW1fZXBzOyBpKyspIHsKKwkJLyogU3RyZWFtcyBvbmx5IGFwcGx5IHRvIGJ1bGsgZW5kcG9pbnRzLiAqLwogCQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2J1bGsoJmVwc1tpXS0+ZGVzYykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogUmUtYWxsb2MgaXMgbm90IGFsbG93ZWQgKi8KKwkJaWYgKGVwc1tpXS0+c3RyZWFtcykKKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAotCXJldHVybiBoY2QtPmRyaXZlci0+YWxsb2Nfc3RyZWFtcyhoY2QsIGRldiwgZXBzLCBudW1fZXBzLAorCXJldCA9IGhjZC0+ZHJpdmVyLT5hbGxvY19zdHJlYW1zKGhjZCwgZGV2LCBlcHMsIG51bV9lcHMsCiAJCQludW1fc3RyZWFtcywgbWVtX2ZsYWdzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZXBzOyBpKyspCisJCWVwc1tpXS0+c3RyZWFtcyA9IHJldDsKKworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYWxsb2Nfc3RyZWFtcyk7CiAKQEAgLTIwNzgsOCArMjA4OSw3IEBACiAgKiBSZXZlcnRzIGEgZ3JvdXAgb2YgYnVsayBlbmRwb2ludHMgYmFjayB0byBub3QgdXNpbmcgc3RyZWFtIElEcy4KICAqIENhbiBmYWlsIGlmIHdlIGFyZSBnaXZlbiBiYWQgYXJndW1lbnRzLCBvciBIQ0QgaXMgYnJva2VuLgogICoKLSAqIFJldHVybjogT24gc3VjY2VzcywgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgc3RyZWFtcy4gT24gZmFpbHVyZSwgYSBuZWdhdGl2ZQotICogZXJyb3IgY29kZS4KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLiBPbiBmYWlsdXJlLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KIGludCB1c2JfZnJlZV9zdHJlYW1zKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCiAJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwcywgdW5zaWduZWQgaW50IG51bV9lcHMsCkBAIC0yMDg3LDE5ICsyMDk3LDI2IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwotCWludCBpOworCWludCBpLCByZXQ7CiAKIAlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CiAJaGNkID0gYnVzX3RvX2hjZChkZXYtPmJ1cyk7CiAJaWYgKGRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX1NVUEVSKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFN0cmVhbXMgb25seSBhcHBseSB0byBidWxrIGVuZHBvaW50cy4gKi8KKwkvKiBEb3VibGUtZnJlZSBpcyBub3QgYWxsb3dlZCAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fZXBzOyBpKyspCi0JCWlmICghZXBzW2ldIHx8ICF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKCZlcHNbaV0tPmRlc2MpKQorCQlpZiAoIWVwc1tpXSB8fCAhZXBzW2ldLT5zdHJlYW1zKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gaGNkLT5kcml2ZXItPmZyZWVfc3RyZWFtcyhoY2QsIGRldiwgZXBzLCBudW1fZXBzLCBtZW1fZmxhZ3MpOworCXJldCA9IGhjZC0+ZHJpdmVyLT5mcmVlX3N0cmVhbXMoaGNkLCBkZXYsIGVwcywgbnVtX2VwcywgbWVtX2ZsYWdzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZXBzOyBpKyspCisJCWVwc1tpXS0+c3RyZWFtcyA9IDA7CisKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2ZyZWVfc3RyZWFtcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDY0ZWEyMTkuLjA5MDQ2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMTQxLDE5ICsxNDEsMjcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyogQWxsIFVTQiAzLjAgbXVzdCBzdXBwb3J0IExQTSwgYnV0IHdlIG5lZWQgdGhlaXIgbWF4IGV4aXQgbGF0ZW5jeQotCSAqIGluZm9ybWF0aW9uIGZyb20gdGhlIFN1cGVyU3BlZWQgRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzIEJPUyBkZXNjcmlwdG9yLgorCS8qCisJICogQWNjb3JkaW5nIHRvIHRoZSBVU0IgMy4wIHNwZWMsIGFsbCBVU0IgMy4wIGRldmljZXMgbXVzdCBzdXBwb3J0IExQTS4KKwkgKiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSB0aGF0IGRvbid0LCBhbmQgdGhleSBzZXQgdGhlIFUxL1UyIGV4aXQKKwkgKiBsYXRlbmNpZXMgdG8gemVyby4KIAkgKi8KIAlpZiAoIXVkZXYtPmJvcy0+c3NfY2FwKSB7Ci0JCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJObyBMUE0gZXhpdCBsYXRlbmN5IGluZm8gZm91bmQuICAiCi0JCQkJIlBvd2VyIG1hbmFnZW1lbnQgd2lsbCBiZSBpbXBhY3RlZC5cbiIpOworCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiTm8gTFBNIGV4aXQgbGF0ZW5jeSBpbmZvIGZvdW5kLCBkaXNhYmxpbmcgTFBNLlxuIik7CiAJCXJldHVybiAwOwogCX0KLQlpZiAodWRldi0+cGFyZW50LT5scG1fY2FwYWJsZSkKLQkJcmV0dXJuIDE7CiAKLQlkZXZfd2FybigmdWRldi0+ZGV2LCAiUGFyZW50IGh1YiBtaXNzaW5nIExQTSBleGl0IGxhdGVuY3kgaW5mby4gICIKLQkJCSJQb3dlciBtYW5hZ2VtZW50IHdpbGwgYmUgaW1wYWN0ZWQuXG4iKTsKKwlpZiAodWRldi0+Ym9zLT5zc19jYXAtPmJVMWRldkV4aXRMYXQgPT0gMCAmJgorCQkJdWRldi0+Ym9zLT5zc19jYXAtPmJVMkRldkV4aXRMYXQgPT0gMCkgeworCQlpZiAodWRldi0+cGFyZW50KQorCQkJZGV2X2luZm8oJnVkZXYtPmRldiwgIkxQTSBleGl0IGxhdGVuY3kgaXMgemVyb2VkLCBkaXNhYmxpbmcgTFBNLlxuIik7CisJCWVsc2UKKwkJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsICJXZSBkb24ndCBrbm93IHRoZSBhbGdvcml0aG1zIGZvciBMUE0gZm9yIHRoaXMgaG9zdCwgZGlzYWJsaW5nIExQTS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXVkZXYtPnBhcmVudCB8fCB1ZGV2LT5wYXJlbnQtPmxwbV9jYXBhYmxlKQorCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk5LDcgKzUwNyw4IEBACiAJCWNoYW5nZWQrKzsKIAl9CiAJaWYgKGNoYW5nZWQpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaHViLT5sZWRzLCBMRURfQ1lDTEVfUEVSSU9EKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJJmh1Yi0+bGVkcywgTEVEX0NZQ0xFX1BFUklPRCk7CiB9CiAKIC8qIHVzZSBhIHNob3J0IHRpbWVvdXQgZm9yIGh1Yi9wb3J0IHN0YXR1cyBmZXRjaGVzICovCkBAIC0xMDQwLDggKzEwNDksOSBAQAogCQkgKi8KIAkJaWYgKHR5cGUgPT0gSFVCX0lOSVQpIHsKIAkJCWRlbGF5ID0gaHViX3Bvd2VyX29uKGh1YiwgZmFsc2UpOwotCQkJUFJFUEFSRV9ERUxBWUVEX1dPUksoJmh1Yi0+aW5pdF93b3JrLCBodWJfaW5pdF9mdW5jMik7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmh1Yi0+aW5pdF93b3JrLAorCQkJSU5JVF9ERUxBWUVEX1dPUksoJmh1Yi0+aW5pdF93b3JrLCBodWJfaW5pdF9mdW5jMik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJJmh1Yi0+aW5pdF93b3JrLAogCQkJCQltc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CiAKIAkJCS8qIFN1cHByZXNzIGF1dG9zdXNwZW5kIHVudGlsIGluaXQgaXMgZG9uZSAqLwpAQCAtMTE5NCw4ICsxMjA0LDkgQEAKIAogCQkvKiBEb24ndCBkbyBhIGxvbmcgc2xlZXAgaW5zaWRlIGEgd29ya3F1ZXVlIHJvdXRpbmUgKi8KIAkJaWYgKHR5cGUgPT0gSFVCX0lOSVQyKSB7Ci0JCQlQUkVQQVJFX0RFTEFZRURfV09SSygmaHViLT5pbml0X3dvcmssIGh1Yl9pbml0X2Z1bmMzKTsKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaHViLT5pbml0X3dvcmssCisJCQlJTklUX0RFTEFZRURfV09SSygmaHViLT5pbml0X3dvcmssIGh1Yl9pbml0X2Z1bmMzKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJCQkmaHViLT5pbml0X3dvcmssCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKIAkJCXJldHVybjsJCS8qIENvbnRpbnVlcyBhdCBpbml0MzogYmVsb3cgKi8KIAkJfSBlbHNlIHsKQEAgLTEyMDksNyArMTIyMCw4IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCWRldl9lcnIoaHViLT5pbnRmZGV2LCAiYWN0aXZhdGUgLS0+ICVkXG4iLCBzdGF0dXMpOwogCWlmIChodWItPmhhc19pbmRpY2F0b3JzICYmIGJsaW5rZW5saWdodHMpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaHViLT5sZWRzLCBMRURfQ1lDTEVfUEVSSU9EKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJJmh1Yi0+bGVkcywgTEVEX0NZQ0xFX1BFUklPRCk7CiAKIAkvKiBTY2FuIGFsbCBwb3J0cyB0aGF0IG5lZWQgYXR0ZW50aW9uICovCiAJa2lja19raHViZChodWIpOwpAQCAtMTc4OCw3ICsxODAwLDcgQEAKICAqIHRvIG9uZSBvZiB0aGVzZSAiY2xhaW1lZCIgcG9ydHMsIHRoZSBwcm9ncmFtIHdpbGwgIm93biIgdGhlIGRldmljZS4KICAqLwogc3RhdGljIGludCBmaW5kX3BvcnRfb3duZXIoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAotCQlzdHJ1Y3QgZGV2X3N0YXRlICoqKnBwb3duZXIpCisJCXN0cnVjdCB1c2JfZGV2X3N0YXRlICoqKnBwb3duZXIpCiB7CiAJc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9odWJfdG9fc3RydWN0X2h1YihoZGV2KTsKIApAQCAtMTgwNiwxMCArMTgxOCwxMCBAQAogCiAvKiBJbiB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucywgdGhlIGNhbGxlciBtdXN0IGhvbGQgaGRldidzIGxvY2sgKi8KIGludCB1c2JfaHViX2NsYWltX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAotCQkgICAgICAgc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpCisJCSAgICAgICBzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpCiB7CiAJaW50IHJjOwotCXN0cnVjdCBkZXZfc3RhdGUgKipwb3duZXI7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKipwb3duZXI7CiAKIAlyYyA9IGZpbmRfcG9ydF9vd25lcihoZGV2LCBwb3J0MSwgJnBvd25lcik7CiAJaWYgKHJjKQpAQCAtMTgxOSwxMiArMTgzMSwxMyBAQAogCSpwb3duZXIgPSBvd25lcjsKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaHViX2NsYWltX3BvcnQpOwogCiBpbnQgdXNiX2h1Yl9yZWxlYXNlX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAotCQkJIHN0cnVjdCBkZXZfc3RhdGUgKm93bmVyKQorCQkJIHN0cnVjdCB1c2JfZGV2X3N0YXRlICpvd25lcikKIHsKIAlpbnQgcmM7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqKnBvd25lcjsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKnBvd25lcjsKIAogCXJjID0gZmluZF9wb3J0X293bmVyKGhkZXYsIHBvcnQxLCAmcG93bmVyKTsKIAlpZiAocmMpCkBAIC0xODM0LDggKzE4NDcsOSBAQAogCSpwb3duZXIgPSBOVUxMOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9odWJfcmVsZWFzZV9wb3J0KTsKIAotdm9pZCB1c2JfaHViX3JlbGVhc2VfYWxsX3BvcnRzKHN0cnVjdCB1c2JfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgZGV2X3N0YXRlICpvd25lcikKK3ZvaWQgdXNiX2h1Yl9yZWxlYXNlX2FsbF9wb3J0cyhzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgc3RydWN0IHVzYl9kZXZfc3RhdGUgKm93bmVyKQogewogCXN0cnVjdCB1c2JfaHViICpodWIgPSB1c2JfaHViX3RvX3N0cnVjdF9odWIoaGRldik7CiAJaW50IG47CkBAIC0zMDkzLDkgKzMxMDcsMTkgQEAKIAkgKiBvcGVyYXRpb24gaXMgY2FycmllZCBvdXQgaGVyZSwgYWZ0ZXIgdGhlIHBvcnQgaGFzIGJlZW4KIAkgKiByZXN1bWVkLgogCSAqLwotCWlmICh1ZGV2LT5yZXNldF9yZXN1bWUpCisJaWYgKHVkZXYtPnJlc2V0X3Jlc3VtZSkgeworCQkvKgorCQkgKiBJZiB0aGUgZGV2aWNlIG1vcnBocyBvciBzd2l0Y2hlcyBtb2RlcyB3aGVuIGl0IGlzIHJlc2V0LAorCQkgKiB3ZSBkb24ndCB3YW50IHRvIHBlcmZvcm0gYSByZXNldC1yZXN1bWUuICBXZSdsbCBmYWlsIHRoZQorCQkgKiByZXN1bWUsIHdoaWNoIHdpbGwgY2F1c2UgYSBsb2dpY2FsIGRpc2Nvbm5lY3QsIGFuZCB0aGVuCisJCSAqIHRoZSBkZXZpY2Ugd2lsbCBiZSByZWRpc2NvdmVyZWQuCisJCSAqLwogIHJldHJ5X3Jlc2V0X3Jlc3VtZToKLQkJc3RhdHVzID0gdXNiX3Jlc2V0X2FuZF92ZXJpZnlfZGV2aWNlKHVkZXYpOworCQlpZiAodWRldi0+cXVpcmtzICYgVVNCX1FVSVJLX1JFU0VUKQorCQkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZWxzZQorCQkJc3RhdHVzID0gdXNiX3Jlc2V0X2FuZF92ZXJpZnlfZGV2aWNlKHVkZXYpOworCX0KIAogCS8qIDEwLjUuNC41IHNheXMgYmUgc3VyZSBkZXZpY2VzIGluIHRoZSB0cmVlIGFyZSBzdGlsbCB0aGVyZS4KIAkgKiBGb3Igbm93IGxldCdzIGFzc3VtZSB0aGUgZGV2aWNlIGRpZG4ndCBnbyBjcmF6eSBvbiByZXN1bWUsCkBAIC0zOTU4LDcgKzM5ODIsNyBAQAogCWNvbm5lY3RfdHlwZSA9IHVzYl9nZXRfaHViX3BvcnRfY29ubmVjdF90eXBlKHVkZXYtPnBhcmVudCwKIAkJCXVkZXYtPnBvcnRudW0pOwogCi0JaWYgKCh1ZGV2LT5ib3MtPmV4dF9jYXAtPmJtQXR0cmlidXRlcyAmIFVTQl9CRVNMX1NVUFBPUlQpIHx8CisJaWYgKCh1ZGV2LT5ib3MtPmV4dF9jYXAtPmJtQXR0cmlidXRlcyAmIGNwdV90b19sZTMyKFVTQl9CRVNMX1NVUFBPUlQpKSB8fAogCQkJY29ubmVjdF90eXBlID09IFVTQl9QT1JUX0NPTk5FQ1RfVFlQRV9IQVJEX1dJUkVEKSB7CiAJCXVkZXYtPnVzYjJfaHdfbHBtX2FsbG93ZWQgPSAxOwogCQl1c2Jfc2V0X3VzYjJfaGFyZHdhcmVfbHBtKHVkZXYsIDEpOwpAQCAtNDEwNyw4ICs0MTMxLDEyIEBACiAKIAkJCWRpZF9uZXdfc2NoZW1lID0gdHJ1ZTsKIAkJCXJldHZhbCA9IGh1Yl9lbmFibGVfZGV2aWNlKHVkZXYpOwotCQkJaWYgKHJldHZhbCA8IDApCisJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCQkJImh1YiBmYWlsZWQgdG8gZW5hYmxlIGRldmljZSwgZXJyb3IgJWRcbiIsCisJCQkJCXJldHZhbCk7CiAJCQkJZ290byBmYWlsOworCQkJfQogCiAjZGVmaW5lIEdFVF9ERVNDUklQVE9SX0JVRlNJWkUJNjQKIAkJCWJ1ZiA9IGttYWxsb2MoR0VUX0RFU0NSSVBUT1JfQlVGU0laRSwgR0ZQX05PSU8pOwpAQCAtNDMxMSw3ICs0MzM5LDggQEAKIAkJLyogaHViIExFRHMgYXJlIHByb2JhYmx5IGhhcmRlciB0byBtaXNzIHRoYW4gc3lzbG9nICovCiAJCWlmIChodWItPmhhc19pbmRpY2F0b3JzKSB7CiAJCQlodWItPmluZGljYXRvcltwb3J0MS0xXSA9IElORElDQVRPUl9HUkVFTl9CTElOSzsKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayAoJmh1Yi0+bGVkcywgMCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJJmh1Yi0+bGVkcywgMCk7CiAJCX0KIAl9CiAJa2ZyZWUocXVhbCk7CkBAIC00NTQwLDcgKzQ1NjksOSBAQAogCQkJCWlmIChodWItPmhhc19pbmRpY2F0b3JzKSB7CiAJCQkJCWh1Yi0+aW5kaWNhdG9yW3BvcnQxLTFdID0KIAkJCQkJCUlORElDQVRPUl9BTUJFUl9CTElOSzsKLQkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrICgmaHViLT5sZWRzLCAwKTsKKwkJCQkJcXVldWVfZGVsYXllZF93b3JrKAorCQkJCQkJc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJCSZodWItPmxlZHMsIDApOwogCQkJCX0KIAkJCQlzdGF0dXMgPSAtRU5PVENPTk47CS8qIERvbid0IHJldHJ5ICovCiAJCQkJZ290byBsb29wX2Rpc2FibGU7CkBAIC00NzM5LDYgKzQ3NzAsOCBAQAogCiAJCS8qIGRlYWwgd2l0aCBwb3J0IHN0YXR1cyBjaGFuZ2VzICovCiAJCWZvciAoaSA9IDE7IGkgPD0gaGRldi0+bWF4Y2hpbGQ7IGkrKykgeworCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBodWItPnBvcnRzW2kgLSAxXS0+Y2hpbGQ7CisKIAkJCWlmICh0ZXN0X2JpdChpLCBodWItPmJ1c3lfYml0cykpCiAJCQkJY29udGludWU7CiAJCQljb25uZWN0X2NoYW5nZSA9IHRlc3RfYml0KGksIGh1Yi0+Y2hhbmdlX2JpdHMpOwpAQCAtNDgzNyw4ICs0ODcwLDYgQEAKIAkJCSAqLwogCQkJaWYgKGh1Yl9wb3J0X3dhcm1fcmVzZXRfcmVxdWlyZWQoaHViLCBwb3J0c3RhdHVzKSkgewogCQkJCWludCBzdGF0dXM7Ci0JCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPQotCQkJCQlodWItPnBvcnRzW2kgLSAxXS0+Y2hpbGQ7CiAKIAkJCQlkZXZfZGJnKGh1Yl9kZXYsICJ3YXJtIHJlc2V0IHBvcnQgJWRcbiIsIGkpOwogCQkJCWlmICghdWRldiB8fApAQCAtNDg1NSw2ICs0ODg2LDI0IEBACiAJCQkJCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCQkJCQljb25uZWN0X2NoYW5nZSA9IDA7CiAJCQkJfQorCQkJLyoKKwkJCSAqIE9uIGRpc2Nvbm5lY3QgVVNCMyBwcm90b2NvbCBwb3J0cyB0cmFuc2l0IGZyb20gVTAgdG8KKwkJCSAqIFNTLkluYWN0aXZlIHRvIFJ4LkRldGVjdC4gSWYgdGhpcyBoYXBwZW5zIGEgd2FybS0KKwkJCSAqIHJlc2V0IGlzIG5vdCBuZWVkZWQsIGJ1dCBhIChyZSljb25uZWN0IG1heSBoYXBwZW4KKwkJCSAqIGJlZm9yZSBraHViZCBydW5zIGFuZCBzZWVzIHRoZSBkaXNjb25uZWN0LCBhbmQgdGhlCisJCQkgKiBkZXZpY2UgbWF5IGJlIGFuIHVua25vd24gc3RhdGUuCisJCQkgKgorCQkJICogSWYgdGhlIHBvcnQgd2VudCB0aHJvdWdoIFNTLkluYWN0aXZlIHdpdGhvdXQga2h1YmQKKwkJCSAqIHNlZWluZyBpdCB0aGUgQ19MSU5LX1NUQVRFIGNoYW5nZSBmbGFnIHdpbGwgYmUgc2V0LAorCQkJICogYW5kIHdlIHJlc2V0IHRoZSBkZXYgdG8gcHV0IGl0IGluIGEga25vd24gc3RhdGUuCisJCQkgKi8KKwkJCX0gZWxzZSBpZiAodWRldiAmJiBodWJfaXNfc3VwZXJzcGVlZChodWItPmhkZXYpICYmCisJCQkJICAgKHBvcnRjaGFuZ2UgJiBVU0JfUE9SVF9TVEFUX0NfTElOS19TVEFURSkgJiYKKwkJCQkgICAocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikpIHsKKwkJCQl1c2JfbG9ja19kZXZpY2UodWRldik7CisJCQkJdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKKwkJCQl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKKwkJCQljb25uZWN0X2NoYW5nZSA9IDA7CiAJCQl9CiAKIAkJCWlmIChjb25uZWN0X2NoYW5nZSkKQEAgLTUxMTIsNyArNTE2MSw3IEBACiAJc3RydWN0IHVzYl9oY2QJCQkqaGNkID0gYnVzX3RvX2hjZCh1ZGV2LT5idXMpOwogCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IJZGVzY3JpcHRvciA9IHVkZXYtPmRlc2NyaXB0b3I7CiAJc3RydWN0IHVzYl9ob3N0X2JvcwkJKmJvczsKLQlpbnQgCQkJCWksIHJldCA9IDA7CisJaW50CQkJCWksIGosIHJldCA9IDA7CiAJaW50CQkJCXBvcnQxID0gdWRldi0+cG9ydG51bTsKIAogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwKQEAgLTUyMzgsNiArNTI4Nyw5IEBACiAJCQkJcmV0KTsKIAkJCWdvdG8gcmVfZW51bWVyYXRlOwogCQl9CisJCS8qIFJlc2V0dGluZyBhbHNvIGZyZWVzIGFueSBhbGxvY2F0ZWQgc3RyZWFtcyAqLworCQlmb3IgKGogPSAwOyBqIDwgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaisrKQorCQkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2pdLnN0cmVhbXMgPSAwOwogCX0KIAogZG9uZToKQEAgLTUzNDAsMTAgKzUzOTIsMTEgQEAKIAkJCQllbHNlIGlmIChjaW50Zi0+Y29uZGl0aW9uID09CiAJCQkJCQlVU0JfSU5URVJGQUNFX0JPVU5EKQogCQkJCQlyZWJpbmQgPSAxOworCQkJCWlmIChyZWJpbmQpCisJCQkJCWNpbnRmLT5uZWVkc19iaW5kaW5nID0gMTsKIAkJCX0KLQkJCWlmIChyZXQgPT0gMCAmJiByZWJpbmQpCi0JCQkJdXNiX3JlYmluZF9pbnRmKGNpbnRmKTsKIAkJfQorCQl1c2JfdW5iaW5kX2FuZF9yZWJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CiAJfQogCiAJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmggYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCmluZGV4IGRmNjI5YTMuLjMzYmNiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuaApAQCAtODksNyArODksNyBAQAogc3RydWN0IHVzYl9wb3J0IHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqY2hpbGQ7CiAJc3RydWN0IGRldmljZSBkZXY7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcG9ydF9vd25lcjsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcG9ydF9vd25lcjsKIAllbnVtIHVzYl9wb3J0X2Nvbm5lY3RfdHlwZSBjb25uZWN0X3R5cGU7CiAJdTggcG9ydG51bTsKIAl1bnNpZ25lZCBwb3dlcl9pc19vbjoxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCBmODI5YTFhLi4zY2RjZDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMTI5Myw4ICsxMjkzLDcgQEAKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2U7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKGRldi0+YnVzKTsKLQlpbnQgcmV0OwotCWludCBtYW51YWwgPSAwOworCWludCBpLCByZXQsIG1hbnVhbCA9IDA7CiAJdW5zaWduZWQgaW50IGVwYWRkcjsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKIApAQCAtMTMyOSw2ICsxMzI4LDEwIEBACiAJCW11dGV4X3VubG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwkvKiBDaGFuZ2luZyBhbHQtc2V0dGluZyBhbHNvIGZyZWVzIGFueSBhbGxvY2F0ZWQgc3RyZWFtcyAqLworCWZvciAoaSA9IDA7IGkgPCBpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKQorCQlpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2ldLnN0cmVhbXMgPSAwOworCiAJcmV0ID0gdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLCBpZmFjZS0+Y3VyX2FsdHNldHRpbmcsIGFsdCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiTm90IGVub3VnaCBiYW5kd2lkdGggZm9yIGFsdHNldHRpbmcgJWRcbiIsCkBAIC0xOTIwLDYgKzE5MjMsNyBAQAogCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXRfY29uZmlndXJhdGlvbik7CiAKIHN0YXRpYyBMSVNUX0hFQUQoc2V0X2NvbmZpZ19saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2V0X2NvbmZpZ19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmggYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCmluZGV4IDgyMzg1NzcuLjc1YmY2NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuaApAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKIHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3I7Ci1zdHJ1Y3QgZGV2X3N0YXRlOworc3RydWN0IHVzYl9kZXZfc3RhdGU7CiAKIC8qIEZ1bmN0aW9ucyBsb2NhbCB0byBkcml2ZXJzL3VzYi9jb3JlLyAqLwogCkBAIC01NSwxNCArNTUsMTAgQEAKIGV4dGVybiBpbnQgdXNiX21hdGNoX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBleHRlcm4gdm9pZCB1c2JfZm9yY2VkX3VuYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLWV4dGVybiB2b2lkIHVzYl9yZWJpbmRfaW50ZihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitleHRlcm4gdm9pZCB1c2JfdW5iaW5kX2FuZF9yZWJpbmRfbWFya2VkX2ludGVyZmFjZXMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCi1leHRlcm4gaW50IHVzYl9odWJfY2xhaW1fcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydCwKLQkJc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpOwotZXh0ZXJuIGludCB1c2JfaHViX3JlbGVhc2VfcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydCwKLQkJc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpOwogZXh0ZXJuIHZvaWQgdXNiX2h1Yl9yZWxlYXNlX2FsbF9wb3J0cyhzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwKLQkJc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpOworCQlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpOwogZXh0ZXJuIGJvb2wgdXNiX2RldmljZV9pc19vd25lZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiAKIGV4dGVybiBpbnQgIHVzYl9odWJfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMgYi9kcml2ZXJzL3VzYi9kd2MyL2NvcmVfaW50ci5jCmluZGV4IDgyMDU3OTkuLmM5MzkxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9jb3JlX2ludHIuYwpAQCAtNzIsNiArNzIsMjYgQEAKIH0KIAogLyoqCisgKiBkd2MyX2hhbmRsZV91c2JfcG9ydF9pbnRyIC0gaGFuZGxlcyBPVEcgUFJUSU5UIGludGVycnVwdHMuCisgKiBXaGVuIHRoZSBQUlRJTlQgaW50ZXJydXB0IGZpcmVzLCB0aGVyZSBhcmUgY2VydGFpbiBzdGF0dXMgYml0cyBpbiB0aGUgSG9zdAorICogUG9ydCB0aGF0IG5lZWRzIHRvIGdldCBjbGVhcmVkLgorICoKKyAqIEBoc290ZzogUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHZvaWQgZHdjMl9oYW5kbGVfdXNiX3BvcnRfaW50cihzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCit7CisJdTMyIGhwcnQwID0gcmVhZGwoaHNvdGctPnJlZ3MgKyBIUFJUMCk7CisKKwlpZiAoaHBydDAgJiBIUFJUMF9FTkFDSEcpIHsKKwkJaHBydDAgJj0gfkhQUlQwX0VOQTsKKwkJd3JpdGVsKGhwcnQwLCBoc290Zy0+cmVncyArIEhQUlQwKTsKKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoR0lOVFNUU19QUlRJTlQsIGhzb3RnLT5yZWdzICsgR0lOVFNUUyk7Cit9CisKKy8qKgogICogZHdjMl9oYW5kbGVfbW9kZV9taXNtYXRjaF9pbnRyKCkgLSBMb2dzIGEgbW9kZSBtaXNtYXRjaCB3YXJuaW5nIG1lc3NhZ2UKICAqCiAgKiBAaHNvdGc6IFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyCkBAIC00NzksOSArNDk5LDggQEAKIAkJaWYgKGR3YzJfaXNfZGV2aWNlX21vZGUoaHNvdGcpKSB7CiAJCQlkZXZfZGJnKGhzb3RnLT5kZXYsCiAJCQkJIiAtLVBvcnQgaW50ZXJydXB0IHJlY2VpdmVkIGluIERldmljZSBtb2RlLS1cbiIpOwotCQkJZ2ludHN0cyA9IEdJTlRTVFNfUFJUSU5UOwotCQkJd3JpdGVsKGdpbnRzdHMsIGhzb3RnLT5yZWdzICsgR0lOVFNUUyk7Ci0JCQlyZXR2YWwgPSAxOworCQkJZHdjMl9oYW5kbGVfdXNiX3BvcnRfaW50cihoc290Zyk7CisJCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9oY2RfaW50ci5jIGIvZHJpdmVycy91c2IvZHdjMi9oY2RfaW50ci5jCmluZGV4IDAxMmYxN2UuLjQ3YjllYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkX2ludHIuYworKysgYi9kcml2ZXJzL3VzYi9kd2MyL2hjZF9pbnRyLmMKQEAgLTk3NSw4ICs5NzUsOCBAQAogCQkJCSAgc3RydWN0IGR3YzJfcXRkICpxdGQpCiB7CiAJc3RydWN0IGR3YzJfaGNkX3VyYiAqdXJiID0gcXRkLT51cmI7Ci0JaW50IHBpcGVfdHlwZSA9IGR3YzJfaGNkX2dldF9waXBlX3R5cGUoJnVyYi0+cGlwZV9pbmZvKTsKIAllbnVtIGR3YzJfaGFsdF9zdGF0dXMgaGFsdF9zdGF0dXMgPSBEV0MyX0hDX1hGRVJfQ09NUExFVEU7CisJaW50IHBpcGVfdHlwZTsKIAlpbnQgdXJiX3hmZXJfZG9uZTsKIAogCWlmIChkYmdfaGMoY2hhbikpCkBAIC05ODQsNiArOTg0LDExIEBACiAJCQkgIi0tSG9zdCBDaGFubmVsICVkIEludGVycnVwdDogVHJhbnNmZXIgQ29tcGxldGUtLVxuIiwKIAkJCSBjaG51bSk7CiAKKwlpZiAoIXVyYikKKwkJZ290byBoYW5kbGVfeGZlcmNvbXBfZG9uZTsKKworCXBpcGVfdHlwZSA9IGR3YzJfaGNkX2dldF9waXBlX3R5cGUoJnVyYi0+cGlwZV9pbmZvKTsKKwogCWlmIChoc290Zy0+Y29yZV9wYXJhbXMtPmRtYV9kZXNjX2VuYWJsZSA+IDApIHsKIAkJZHdjMl9oY2RfY29tcGxldGVfeGZlcl9kZG1hKGhzb3RnLCBjaGFuLCBjaG51bSwgaGFsdF9zdGF0dXMpOwogCQlpZiAocGlwZV90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCkBAIC0xMDA1LDkgKzEwMTAsNiBAQAogCQl9CiAJfQogCi0JaWYgKCF1cmIpCi0JCWdvdG8gaGFuZGxlX3hmZXJjb21wX2RvbmU7Ci0KIAkvKiBVcGRhdGUgdGhlIFFURCBhbmQgVVJCIHN0YXRlcyAqLwogCXN3aXRjaCAocGlwZV90eXBlKSB7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgpAQCAtMTEwNSw3ICsxMTA3LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZHdjMl9xdGQgKnF0ZCkKIHsKIAlzdHJ1Y3QgZHdjMl9oY2RfdXJiICp1cmIgPSBxdGQtPnVyYjsKLQlpbnQgcGlwZV90eXBlID0gZHdjMl9oY2RfZ2V0X3BpcGVfdHlwZSgmdXJiLT5waXBlX2luZm8pOworCWludCBwaXBlX3R5cGU7CiAKIAlkZXZfZGJnKGhzb3RnLT5kZXYsICItLUhvc3QgQ2hhbm5lbCAlZCBJbnRlcnJ1cHQ6IFNUQUxMIFJlY2VpdmVkLS1cbiIsCiAJCWNobnVtKTsKQEAgLTExMTksNiArMTEyMSw4IEBACiAJaWYgKCF1cmIpCiAJCWdvdG8gaGFuZGxlX3N0YWxsX2hhbHQ7CiAKKwlwaXBlX3R5cGUgPSBkd2MyX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbyk7CisKIAlpZiAocGlwZV90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCiAJCWR3YzJfaG9zdF9jb21wbGV0ZShoc290ZywgcXRkLCAtRVBJUEUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCmluZGV4IGE0OTIxN2EuLmQwMDE0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCkBAIC02MSw5ICs2MSwxMCBAQAogICogZHdjM19jb3JlX3NvZnRfcmVzZXQgLSBJc3N1ZXMgY29yZSBzb2Z0IHJlc2V0IGFuZCBQSFkgcmVzZXQKICAqIEBkd2M6IHBvaW50ZXIgdG8gb3VyIGNvbnRleHQgc3RydWN0dXJlCiAgKi8KLXN0YXRpYyB2b2lkIGR3YzNfY29yZV9zb2Z0X3Jlc2V0KHN0cnVjdCBkd2MzICpkd2MpCitzdGF0aWMgaW50IGR3YzNfY29yZV9zb2Z0X3Jlc2V0KHN0cnVjdCBkd2MzICpkd2MpCiB7CiAJdTMyCQlyZWc7CisJaW50CQlyZXQ7CiAKIAkvKiBCZWZvcmUgUmVzZXR0aW5nIFBIWSwgcHV0IENvcmUgaW4gUmVzZXQgKi8KIAlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19HQ1RMKTsKQEAgLTgyLDYgKzgzLDE1IEBACiAKIAl1c2JfcGh5X2luaXQoZHdjLT51c2IyX3BoeSk7CiAJdXNiX3BoeV9pbml0KGR3Yy0+dXNiM19waHkpOworCXJldCA9IHBoeV9pbml0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwaHlfaW5pdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKSB7CisJCXBoeV9leGl0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJCXJldHVybiByZXQ7CisJfQogCW1kZWxheSgxMDApOwogCiAJLyogQ2xlYXIgVVNCMyBQSFkgcmVzZXQgKi8KQEAgLTEwMCw2ICsxMTAsOCBAQAogCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0dDVEwpOwogCXJlZyAmPSB+RFdDM19HQ1RMX0NPUkVTT0ZUUkVTRVQ7CiAJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0dDVEwsIHJlZyk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yNDIsNiArMjU0LDkwIEBACiAJfQogfQogCitzdGF0aWMgaW50IGR3YzNfYWxsb2Nfc2NyYXRjaF9idWZmZXJzKHN0cnVjdCBkd2MzICpkd2MpCit7CisJaWYgKCFkd2MtPmhhc19oaWJlcm5hdGlvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWR3Yy0+bnJfc2NyYXRjaCkKKwkJcmV0dXJuIDA7CisKKwlkd2MtPnNjcmF0Y2hidWYgPSBrbWFsbG9jX2FycmF5KGR3Yy0+bnJfc2NyYXRjaCwKKwkJCURXQzNfU0NSQVRDSEJVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR3Yy0+c2NyYXRjaGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkd2MzX3NldHVwX3NjcmF0Y2hfYnVmZmVycyhzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWRtYV9hZGRyX3Qgc2NyYXRjaF9hZGRyOworCXUzMiBwYXJhbTsKKwlpbnQgcmV0OworCisJaWYgKCFkd2MtPmhhc19oaWJlcm5hdGlvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWR3Yy0+bnJfc2NyYXRjaCkKKwkJcmV0dXJuIDA7CisKKwkgLyogc2hvdWxkIG5ldmVyIGZhbGwgaGVyZSAqLworCWlmICghV0FSTl9PTihkd2MtPnNjcmF0Y2hidWYpKQorCQlyZXR1cm4gMDsKKworCXNjcmF0Y2hfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGR3Yy0+ZGV2LCBkd2MtPnNjcmF0Y2hidWYsCisJCQlkd2MtPm5yX3NjcmF0Y2ggKiBEV0MzX1NDUkFUQ0hCVUZfU0laRSwKKwkJCURNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZHdjLT5kZXYsIHNjcmF0Y2hfYWRkcikpIHsKKwkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBtYXAgc2NyYXRjaCBidWZmZXJcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycjA7CisJfQorCisJZHdjLT5zY3JhdGNoX2FkZHIgPSBzY3JhdGNoX2FkZHI7CisKKwlwYXJhbSA9IGxvd2VyXzMyX2JpdHMoc2NyYXRjaF9hZGRyKTsKKworCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKGR3YywKKwkJCURXQzNfREdDTURfU0VUX1NDUkFUQ0hQQURfQUREUl9MTywgcGFyYW0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKKwlwYXJhbSA9IHVwcGVyXzMyX2JpdHMoc2NyYXRjaF9hZGRyKTsKKworCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKGR3YywKKwkJCURXQzNfREdDTURfU0VUX1NDUkFUQ0hQQURfQUREUl9ISSwgcGFyYW0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKKwlyZXR1cm4gMDsKKworZXJyMToKKwlkbWFfdW5tYXBfc2luZ2xlKGR3Yy0+ZGV2LCBkd2MtPnNjcmF0Y2hfYWRkciwgZHdjLT5ucl9zY3JhdGNoICoKKwkJCURXQzNfU0NSQVRDSEJVRl9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisKK2VycjA6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHdjM19mcmVlX3NjcmF0Y2hfYnVmZmVycyhzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWlmICghZHdjLT5oYXNfaGliZXJuYXRpb24pCisJCXJldHVybjsKKworCWlmICghZHdjLT5ucl9zY3JhdGNoKQorCQlyZXR1cm47CisKKwkgLyogc2hvdWxkIG5ldmVyIGZhbGwgaGVyZSAqLworCWlmICghV0FSTl9PTihkd2MtPnNjcmF0Y2hidWYpKQorCQlyZXR1cm47CisKKwlkbWFfdW5tYXBfc2luZ2xlKGR3Yy0+ZGV2LCBkd2MtPnNjcmF0Y2hfYWRkciwgZHdjLT5ucl9zY3JhdGNoICoKKwkJCURXQzNfU0NSQVRDSEJVRl9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisJa2ZyZWUoZHdjLT5zY3JhdGNoYnVmKTsKK30KKwogc3RhdGljIHZvaWQgZHdjM19jb3JlX251bV9lcHMoc3RydWN0IGR3YzMgKmR3YykKIHsKIAlzdHJ1Y3QgZHdjM19od3BhcmFtcwkqcGFybXMgPSAmZHdjLT5od3BhcmFtczsKQEAgLTI3Nyw2ICszNzMsNyBAQAogc3RhdGljIGludCBkd2MzX2NvcmVfaW5pdChzdHJ1Y3QgZHdjMyAqZHdjKQogewogCXVuc2lnbmVkIGxvbmcJCXRpbWVvdXQ7CisJdTMyCQkJaHdwYXJhbXM0ID0gZHdjLT5od3BhcmFtcy5od3BhcmFtczQ7CiAJdTMyCQkJcmVnOwogCWludAkJCXJldDsKIApAQCAtMzA2LDcgKzQwMyw5IEBACiAJCWNwdV9yZWxheCgpOwogCX0gd2hpbGUgKHRydWUpOwogCi0JZHdjM19jb3JlX3NvZnRfcmVzZXQoZHdjKTsKKwlyZXQgPSBkd2MzX2NvcmVfc29mdF9yZXNldChkd2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMDsKIAogCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0dDVEwpOwogCXJlZyAmPSB+RFdDM19HQ1RMX1NDQUxFRE9XTl9NQVNLOwpAQCAtMzE0LDcgKzQxMywyOSBAQAogCiAJc3dpdGNoIChEV0MzX0dIV1BBUkFNUzFfRU5fUFdST1BUKGR3Yy0+aHdwYXJhbXMuaHdwYXJhbXMxKSkgewogCWNhc2UgRFdDM19HSFdQQVJBTVMxX0VOX1BXUk9QVF9DTEs6Ci0JCXJlZyAmPSB+RFdDM19HQ1RMX0RTQkxDTEtHVE5HOworCQkvKioKKwkJICogV09SS0FST1VORDogRFdDMyByZXZpc2lvbnMgYmV0d2VlbiAyLjEwYSBhbmQgMi41MGEgaGF2ZSBhbgorCQkgKiBpc3N1ZSB3aGljaCB3b3VsZCBjYXVzZSB4SENJIGNvbXBsaWFuY2UgdGVzdHMgdG8gZmFpbC4KKwkJICoKKwkJICogQmVjYXVzZSBvZiB0aGF0IHdlIGNhbm5vdCBlbmFibGUgY2xvY2sgZ2F0aW5nIG9uIHN1Y2gKKwkJICogY29uZmlndXJhdGlvbnMuCisJCSAqCisJCSAqIFJlZmVycyB0bzoKKwkJICoKKwkJICogU1RBUiM5MDAwNTg4Mzc1OiBDbG9jayBHYXRpbmcsIFNPRiBJc3N1ZXMgd2hlbiByZWZfY2xrLUJhc2VkCisJCSAqIFNPRi9JVFAgTW9kZSBVc2VkCisJCSAqLworCQlpZiAoKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9IT1NUIHx8CisJCQkJZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX09URykgJiYKKwkJCQkoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzIxMEEgJiYKKwkJCQlkd2MtPnJldmlzaW9uIDw9IERXQzNfUkVWSVNJT05fMjUwQSkpCisJCQlyZWcgfD0gRFdDM19HQ1RMX0RTQkxDTEtHVE5HIHwgRFdDM19HQ1RMX1NPRklUUFNZTkM7CisJCWVsc2UKKwkJCXJlZyAmPSB+RFdDM19HQ1RMX0RTQkxDTEtHVE5HOworCQlicmVhazsKKwljYXNlIERXQzNfR0hXUEFSQU1TMV9FTl9QV1JPUFRfSElCOgorCQkvKiBlbmFibGUgaGliZXJuYXRpb24gaGVyZSAqLworCQlkd2MtPm5yX3NjcmF0Y2ggPSBEV0MzX0dIV1BBUkFNUzRfSElCRVJfU0NSQVRDSEJVRlMoaHdwYXJhbXM0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2RiZyhkd2MtPmRldiwgIk5vIHBvd2VyIG9wdGltaXphdGlvbiBhdmFpbGFibGVcbiIpOwpAQCAtMzMzLDE2ICs0NTQsMzYgQEAKIAogCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19HQ1RMLCByZWcpOwogCisJcmV0ID0gZHdjM19hbGxvY19zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjE7CisKKwlyZXQgPSBkd2MzX3NldHVwX3NjcmF0Y2hfYnVmZmVycyhkd2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKwogCXJldHVybiAwOwogCitlcnIyOgorCWR3YzNfZnJlZV9zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKKworZXJyMToKKwl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiMl9waHkpOworCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IzX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCiBlcnIwOgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGR3YzNfY29yZV9leGl0KHN0cnVjdCBkd2MzICpkd2MpCiB7CisJZHdjM19mcmVlX3NjcmF0Y2hfYnVmZmVycyhkd2MpOwogCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IyX3BoeSk7CiAJdXNiX3BoeV9zaHV0ZG93bihkd2MtPnVzYjNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCXBoeV9leGl0KGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CiB9CiAKICNkZWZpbmUgRFdDM19BTElHTl9NQVNLCQkoMTYgLSAxKQpAQCAtNDExLDMyICs1NTIsNTIgQEAKIAogCWlmIChJU19FUlIoZHdjLT51c2IyX3BoeSkpIHsKIAkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjJfcGh5KTsKLQotCQkvKgotCQkgKiBpZiAtRU5YSU8gaXMgcmV0dXJuZWQsIGl0IG1lYW5zIFBIWSBsYXllciB3YXNuJ3QKLQkJICogZW5hYmxlZCwgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmV0dXJuIC1FUFJPQkVfREVGRVIKLQkJICogaW4gdGhhdCBjYXNlLCBzaW5jZSBubyBQSFkgZHJpdmVyIHdpbGwgZXZlciBwcm9iZS4KLQkJICovCi0JCWlmIChyZXQgPT0gLUVOWElPKQorCQlpZiAocmV0ID09IC1FTlhJTyB8fCByZXQgPT0gLUVOT0RFVikgeworCQkJZHdjLT51c2IyX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKIAkJCXJldHVybiByZXQ7Ci0KLQkJZGV2X2VycihkZXYsICJubyB1c2IyIHBoeSBjb25maWd1cmVkXG4iKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjIgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCWlmIChJU19FUlIoZHdjLT51c2IzX3BoeSkpIHsKIAkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjNfcGh5KTsKLQotCQkvKgotCQkgKiBpZiAtRU5YSU8gaXMgcmV0dXJuZWQsIGl0IG1lYW5zIFBIWSBsYXllciB3YXNuJ3QKLQkJICogZW5hYmxlZCwgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmV0dXJuIC1FUFJPQkVfREVGRVIKLQkJICogaW4gdGhhdCBjYXNlLCBzaW5jZSBubyBQSFkgZHJpdmVyIHdpbGwgZXZlciBwcm9iZS4KLQkJICovCi0JCWlmIChyZXQgPT0gLUVOWElPKQorCQlpZiAocmV0ID09IC1FTlhJTyB8fCByZXQgPT0gLUVOT0RFVikgeworCQkJZHdjLT51c2IzX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKIAkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjMgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KIAotCQlkZXZfZXJyKGRldiwgIm5vIHVzYjMgcGh5IGNvbmZpZ3VyZWRcbiIpOwotCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwlkd2MtPnVzYjJfZ2VuZXJpY19waHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAidXNiMi1waHkiKTsKKwlpZiAoSVNfRVJSKGR3Yy0+dXNiMl9nZW5lcmljX3BoeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCQlpZiAocmV0ID09IC1FTk9TWVMgfHwgcmV0ID09IC1FTk9ERVYpIHsKKwkJCWR3Yy0+dXNiMl9nZW5lcmljX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjIgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWR3Yy0+dXNiM19nZW5lcmljX3BoeSA9IGRldm1fcGh5X2dldChkZXYsICJ1c2IzLXBoeSIpOworCWlmIChJU19FUlIoZHdjLT51c2IzX2dlbmVyaWNfcGh5KSkgeworCQlyZXQgPSBQVFJfRVJSKGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CisJCWlmIChyZXQgPT0gLUVOT1NZUyB8fCByZXQgPT0gLUVOT0RFVikgeworCQkJZHdjLT51c2IzX2dlbmVyaWNfcGh5ID0gTlVMTDsKKwkJfSBlbHNlIGlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikgeworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZGV2LCAibm8gdXNiMyBwaHkgY29uZmlndXJlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJZHdjLT54aGNpX3Jlc291cmNlc1swXS5zdGFydCA9IHJlcy0+c3RhcnQ7CkBAIC00NzksNiArNjQwLDE0IEBACiAJCWdvdG8gZXJyMDsKIAl9CiAKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfSE9TVCkpCisJCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX0hPU1Q7CisJZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSkKKwkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKKworCWlmIChkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfVU5LTk9XTikKKwkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfT1RHOworCiAJcmV0ID0gZHdjM19jb3JlX2luaXQoZHdjKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgY29yZVxuIik7CkBAIC00ODcsMjEgKzY1NiwyMCBAQAogCiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjJfcGh5LCAwKTsKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiM19waHksIDApOworCXJldCA9IHBoeV9wb3dlcl9vbihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKKwlyZXQgPSBwaHlfcG93ZXJfb24oZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdXNiMnBoeV9wb3dlcjsKIAogCXJldCA9IGR3YzNfZXZlbnRfYnVmZmVyc19zZXR1cChkd2MpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBzZXR1cCBldmVudCBidWZmZXJzXG4iKTsKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl91c2IzcGh5X3Bvd2VyOwogCX0KIAotCWlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19IT1NUKSkKLQkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfSE9TVDsKLQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19HQURHRVQpKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOwotCi0JaWYgKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9VTktOT1dOKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9PVEc7Ci0KIAlzd2l0Y2ggKGR3Yy0+ZHJfbW9kZSkgewogCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKIAkJZHdjM19zZXRfbW9kZShkd2MsIERXQzNfR0NUTF9QUlRDQVBfREVWSUNFKTsKQEAgLTU2OCw2ICs3MzYsMTIgQEAKIGVycjI6CiAJZHdjM19ldmVudF9idWZmZXJzX2NsZWFudXAoZHdjKTsKIAorZXJyX3VzYjNwaHlfcG93ZXI6CisJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCitlcnJfdXNiMnBoeV9wb3dlcjoKKwlwaHlfcG93ZXJfb2ZmKGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisKIGVycjE6CiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjJfcGh5LCAxKTsKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiM19waHksIDEpOwpAQCAtNTg1LDYgKzc1OSw4IEBACiAKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiMl9waHksIDEpOwogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IzX3BoeSwgMSk7CisJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCXBoeV9wb3dlcl9vZmYoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKIAogCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwpAQCAtNjgyLDYgKzg1OCw4IEBACiAKIAl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiM19waHkpOwogCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IyX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTAsOSArODY4LDE3IEBACiB7CiAJc3RydWN0IGR3YzMJKmR3YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlyZXQ7CiAKIAl1c2JfcGh5X2luaXQoZHdjLT51c2IzX3BoeSk7CiAJdXNiX3BoeV9pbml0KGR3Yy0+dXNiMl9waHkpOworCXJldCA9IHBoeV9pbml0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwaHlfaW5pdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91c2IycGh5X2luaXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKQEAgLTcxNiw2ICs5MDIsMTEgQEAKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwogCiAJcmV0dXJuIDA7CisKK2Vycl91c2IycGh5X2luaXQ6CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkd2MzX2Rldl9wbV9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaCBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCmluZGV4IGY4YWY4ZDQuLjU3MzMyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCkBAIC0zMSwxMSArMzEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogCisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorCiAvKiBHbG9iYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIERXQzNfRVAwX0JPVU5DRV9TSVpFCTUxMgogI2RlZmluZSBEV0MzX0VORFBPSU5UU19OVU0JMzIKICNkZWZpbmUgRFdDM19YSENJX1JFU09VUkNFU19OVU0JMgogCisjZGVmaW5lIERXQzNfU0NSQVRDSEJVRl9TSVpFCTQwOTYJLyogZWFjaCBidWZmZXIgaXMgYXNzdW1lZCB0byBiZSA0S2lCICovCiAjZGVmaW5lIERXQzNfRVZFTlRfU0laRQkJNAkvKiBieXRlcyAqLwogI2RlZmluZSBEV0MzX0VWRU5UX01BWF9OVU0JNjQJLyogMiBldmVudHMvZW5kcG9pbnQgKi8KICNkZWZpbmUgRFdDM19FVkVOVF9CVUZGRVJTX1NJWkUJKERXQzNfRVZFTlRfU0laRSAqIERXQzNfRVZFTlRfTUFYX05VTSkKQEAgLTE1Nyw2ICsxNjAsNyBAQAogI2RlZmluZSBEV0MzX0dDVExfUFJUQ0FQX09URwkzCiAKICNkZWZpbmUgRFdDM19HQ1RMX0NPUkVTT0ZUUkVTRVQJCSgxIDw8IDExKQorI2RlZmluZSBEV0MzX0dDVExfU09GSVRQU1lOQwkJKDEgPDwgMTApCiAjZGVmaW5lIERXQzNfR0NUTF9TQ0FMRURPV04obikJCSgobikgPDwgNCkKICNkZWZpbmUgRFdDM19HQ1RMX1NDQUxFRE9XTl9NQVNLCURXQzNfR0NUTF9TQ0FMRURPV04oMykKICNkZWZpbmUgRFdDM19HQ1RMX0RJU1NDUkFNQkxFCQkoMSA8PCAzKQpAQCAtMzE4LDcgKzMyMiw3IEBACiAvKiBEZXZpY2UgRW5kcG9pbnQgQ29tbWFuZCBSZWdpc3RlciAqLwogI2RlZmluZSBEV0MzX0RFUENNRF9QQVJBTV9TSElGVAkJMTYKICNkZWZpbmUgRFdDM19ERVBDTURfUEFSQU0oeCkJCSgoeCkgPDwgRFdDM19ERVBDTURfUEFSQU1fU0hJRlQpCi0jZGVmaW5lIERXQzNfREVQQ01EX0dFVF9SU0NfSURYKHgpICAgICAoKCh4KSA+PiBEV0MzX0RFUENNRF9QQVJBTV9TSElGVCkgJiAweDdmKQorI2RlZmluZSBEV0MzX0RFUENNRF9HRVRfUlNDX0lEWCh4KQkoKCh4KSA+PiBEV0MzX0RFUENNRF9QQVJBTV9TSElGVCkgJiAweDdmKQogI2RlZmluZSBEV0MzX0RFUENNRF9TVEFUVVMoeCkJCSgoKHgpID4+IDE1KSAmIDEpCiAjZGVmaW5lIERXQzNfREVQQ01EX0hJUFJJX0ZPUkNFUk0JKDEgPDwgMTEpCiAjZGVmaW5lIERXQzNfREVQQ01EX0NNREFDVAkJKDEgPDwgMTApCkBAIC0zOTMsNiArMzk3LDcgQEAKICAqIEBidXN5X3Nsb3Q6IGZpcnN0IHNsb3Qgd2hpY2ggaXMgb3duZWQgYnkgSFcKICAqIEBkZXNjOiB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBwb2ludGVyCiAgKiBAZHdjOiBwb2ludGVyIHRvIERXQyBjb250cm9sbGVyCisgKiBAc2F2ZWRfc3RhdGU6IGVwIHN0YXRlIHNhdmVkIGR1cmluZyBoaWJlcm5hdGlvbgogICogQGZsYWdzOiBlbmRwb2ludCBmbGFncyAod2VkZ2VkLCBzdGFsbGVkLCAuLi4pCiAgKiBAY3VycmVudF90cmI6IGluZGV4IG9mIGN1cnJlbnQgdXNlZCB0cmIKICAqIEBudW1iZXI6IGVuZHBvaW50IG51bWJlciAoMSAtIDE1KQpAQCAtNDE1LDYgKzQyMCw3IEBACiAJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNvbXBfZGVzYzsKIAlzdHJ1Y3QgZHdjMwkJKmR3YzsKIAorCXUzMgkJCXNhdmVkX3N0YXRlOwogCXVuc2lnbmVkCQlmbGFnczsKICNkZWZpbmUgRFdDM19FUF9FTkFCTEVECQkoMSA8PCAwKQogI2RlZmluZSBEV0MzX0VQX1NUQUxMCQkoMSA8PCAxKQpAQCAtNTk4LDYgKzYwNCw3IEBACiAgKiBAZXAwX3RyYjogZG1hIGFkZHJlc3Mgb2YgZXAwX3RyYgogICogQGVwMF91c2JfcmVxOiBkdW1teSByZXEgdXNlZCB3aGlsZSBoYW5kbGluZyBTVEQgVVNCIHJlcXVlc3RzCiAgKiBAZXAwX2JvdW5jZV9hZGRyOiBkbWEgYWRkcmVzcyBvZiBlcDBfYm91bmNlCisgKiBAc2NyYXRjaF9hZGRyOiBkbWEgYWRkcmVzcyBvZiBzY3JhdGNoYnVmCiAgKiBAbG9jazogZm9yIHN5bmNocm9uaXppbmcKICAqIEBkZXY6IHBvaW50ZXIgdG8gb3VyIHN0cnVjdCBkZXZpY2UKICAqIEB4aGNpOiBwb2ludGVyIHRvIG91ciB4SENJIGNoaWxkCkBAIC02MDYsNiArNjEzLDcgQEAKICAqIEBnYWRnZXRfZHJpdmVyOiBwb2ludGVyIHRvIHRoZSBnYWRnZXQgZHJpdmVyCiAgKiBAcmVnczogYmFzZSBhZGRyZXNzIGZvciBvdXIgcmVnaXN0ZXJzCiAgKiBAcmVnc19zaXplOiBhZGRyZXNzIHNwYWNlIHNpemUKKyAqIEBucl9zY3JhdGNoOiBudW1iZXIgb2Ygc2NyYXRjaCBidWZmZXJzCiAgKiBAbnVtX2V2ZW50X2J1ZmZlcnM6IGNhbGN1bGF0ZWQgbnVtYmVyIG9mIGV2ZW50IGJ1ZmZlcnMKICAqIEB1MXUyOiBvbmx5IHVzZWQgb24gcmV2aXNpb25zIDwxLjgzYSBmb3Igd29ya2Fyb3VuZAogICogQG1heGltdW1fc3BlZWQ6IG1heGltdW0gc3BlZWQgcmVxdWVzdGVkIChtYWlubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMpCkBAIC02MTMsMTYgKzYyMSwxMCBAQAogICogQGRyX21vZGU6IHJlcXVlc3RlZCBtb2RlIG9mIG9wZXJhdGlvbgogICogQHVzYjJfcGh5OiBwb2ludGVyIHRvIFVTQjIgUEhZCiAgKiBAdXNiM19waHk6IHBvaW50ZXIgdG8gVVNCMyBQSFkKKyAqIEB1c2IyX2dlbmVyaWNfcGh5OiBwb2ludGVyIHRvIFVTQjIgUEhZCisgKiBAdXNiM19nZW5lcmljX3BoeTogcG9pbnRlciB0byBVU0IzIFBIWQogICogQGRjZmc6IHNhdmVkIGNvbnRlbnRzIG9mIERDRkcgcmVnaXN0ZXIKICAqIEBnY3RsOiBzYXZlZCBjb250ZW50cyBvZiBHQ1RMIHJlZ2lzdGVyCi0gKiBAaXNfc2VsZnBvd2VyZWQ6IHRydWUgd2hlbiB3ZSBhcmUgc2VsZnBvd2VyZWQKLSAqIEB0aHJlZV9zdGFnZV9zZXR1cDogc2V0IGlmIHdlIHBlcmZvcm0gYSB0aHJlZSBwaGFzZSBzZXR1cAotICogQGVwMF9ib3VuY2VkOiB0cnVlIHdoZW4gd2UgdXNlZCBib3VuY2UgYnVmZmVyCi0gKiBAZXAwX2V4cGVjdF9pbjogdHJ1ZSB3aGVuIHdlIGV4cGVjdCBhIERBVEEgSU4gdHJhbnNmZXIKLSAqIEBzdGFydF9jb25maWdfaXNzdWVkOiB0cnVlIHdoZW4gU3RhcnRDb25maWcgY29tbWFuZCBoYXMgYmVlbiBpc3N1ZWQKLSAqIEBzZXR1cF9wYWNrZXRfcGVuZGluZzogdHJ1ZSB3aGVuIHRoZXJlJ3MgYSBTZXR1cCBQYWNrZXQgaW4gRklGTy4gV29ya2Fyb3VuZAotICogQG5lZWRzX2ZpZm9fcmVzaXplOiBub3QgYWxsIHVzZXJzIG1pZ2h0IHdhbnQgZmlmbyByZXNpemluZywgZmxhZyBpdAotICogQHJlc2l6ZV9maWZvczogdGVsbHMgdXMgaXQncyBvayB0byByZWNvbmZpZ3VyZSBvdXIgVHhGSUZPIHNpemVzLgogICogQGlzb2NoX2RlbGF5OiB3VmFsdWUgZnJvbSBTZXQgSXNvY2hyb25vdXMgRGVsYXkgcmVxdWVzdDsKICAqIEB1MnNlbDogcGFyYW1ldGVyIGZyb20gU2V0IFNFTCByZXF1ZXN0LgogICogQHUycGVsOiBwYXJhbWV0ZXIgZnJvbSBTZXQgU0VMIHJlcXVlc3QuCkBAIC02MzcsMTUgKzYzOSwzMSBAQAogICogQG1lbTogcG9pbnRzIHRvIHN0YXJ0IG9mIG1lbW9yeSB3aGljaCBpcyB1c2VkIGZvciB0aGlzIHN0cnVjdC4KICAqIEBod3BhcmFtczogY29weSBvZiBod3BhcmFtcyByZWdpc3RlcnMKICAqIEByb290OiBkZWJ1Z2ZzIHJvb3QgZm9sZGVyIHBvaW50ZXIKKyAqIEByZWdzZXQ6IGRlYnVnZnMgcG9pbnRlciB0byByZWdkdW1wIGZpbGUKKyAqIEB0ZXN0X21vZGU6IHRydWUgd2hlbiB3ZSdyZSBlbnRlcmluZyBhIFVTQiB0ZXN0IG1vZGUKKyAqIEB0ZXN0X21vZGVfbnI6IHRlc3QgZmVhdHVyZSBzZWxlY3RvcgorICogQGRlbGF5ZWRfc3RhdHVzOiB0cnVlIHdoZW4gZ2FkZ2V0IGRyaXZlciBhc2tzIGZvciBkZWxheWVkIHN0YXR1cworICogQGVwMF9ib3VuY2VkOiB0cnVlIHdoZW4gd2UgdXNlZCBib3VuY2UgYnVmZmVyCisgKiBAZXAwX2V4cGVjdF9pbjogdHJ1ZSB3aGVuIHdlIGV4cGVjdCBhIERBVEEgSU4gdHJhbnNmZXIKKyAqIEBoYXNfaGliZXJuYXRpb246IHRydWUgd2hlbiBkd2MzIHdhcyBjb25maWd1cmVkIHdpdGggSGliZXJuYXRpb24KKyAqIEBpc19zZWxmcG93ZXJlZDogdHJ1ZSB3aGVuIHdlIGFyZSBzZWxmcG93ZXJlZAorICogQG5lZWRzX2ZpZm9fcmVzaXplOiBub3QgYWxsIHVzZXJzIG1pZ2h0IHdhbnQgZmlmbyByZXNpemluZywgZmxhZyBpdAorICogQHB1bGx1cHNfY29ubmVjdGVkOiB0cnVlIHdoZW4gUnVuL1N0b3AgYml0IGlzIHNldAorICogQHJlc2l6ZV9maWZvczogdGVsbHMgdXMgaXQncyBvayB0byByZWNvbmZpZ3VyZSBvdXIgVHhGSUZPIHNpemVzLgorICogQHNldHVwX3BhY2tldF9wZW5kaW5nOiB0cnVlIHdoZW4gdGhlcmUncyBhIFNldHVwIFBhY2tldCBpbiBGSUZPLiBXb3JrYXJvdW5kCisgKiBAc3RhcnRfY29uZmlnX2lzc3VlZDogdHJ1ZSB3aGVuIFN0YXJ0Q29uZmlnIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkCisgKiBAdGhyZWVfc3RhZ2Vfc2V0dXA6IHNldCBpZiB3ZSBwZXJmb3JtIGEgdGhyZWUgcGhhc2Ugc2V0dXAKICAqLwogc3RydWN0IGR3YzMgewogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJKmN0cmxfcmVxOwogCXN0cnVjdCBkd2MzX3RyYgkJKmVwMF90cmI7CiAJdm9pZAkJCSplcDBfYm91bmNlOworCXZvaWQJCQkqc2NyYXRjaGJ1ZjsKIAl1OAkJCSpzZXR1cF9idWY7CiAJZG1hX2FkZHJfdAkJY3RybF9yZXFfYWRkcjsKIAlkbWFfYWRkcl90CQllcDBfdHJiX2FkZHI7CiAJZG1hX2FkZHJfdAkJZXAwX2JvdW5jZV9hZGRyOworCWRtYV9hZGRyX3QJCXNjcmF0Y2hfYWRkcjsKIAlzdHJ1Y3QgZHdjM19yZXF1ZXN0CWVwMF91c2JfcmVxOwogCiAJLyogZGV2aWNlIGxvY2sgKi8KQEAgLTY2NSw2ICs2ODMsOSBAQAogCXN0cnVjdCB1c2JfcGh5CQkqdXNiMl9waHk7CiAJc3RydWN0IHVzYl9waHkJCSp1c2IzX3BoeTsKIAorCXN0cnVjdCBwaHkJCSp1c2IyX2dlbmVyaWNfcGh5OworCXN0cnVjdCBwaHkJCSp1c2IzX2dlbmVyaWNfcGh5OworCiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAlzaXplX3QJCQlyZWdzX3NpemU7CiAKQEAgLTY3NCw2ICs2OTUsNyBAQAogCXUzMgkJCWRjZmc7CiAJdTMyCQkJZ2N0bDsKIAorCXUzMgkJCW5yX3NjcmF0Y2g7CiAJdTMyCQkJbnVtX2V2ZW50X2J1ZmZlcnM7CiAJdTMyCQkJdTF1MjsKIAl1MzIJCQltYXhpbXVtX3NwZWVkOwpAQCAtNjk1LDE3ICs3MTcsOSBAQAogI2RlZmluZSBEV0MzX1JFVklTSU9OXzIzMEEJMHg1NTMzMjMwYQogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI0MEEJMHg1NTMzMjQwYQogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI1MEEJMHg1NTMzMjUwYQotCi0JdW5zaWduZWQJCWlzX3NlbGZwb3dlcmVkOjE7Ci0JdW5zaWduZWQJCXRocmVlX3N0YWdlX3NldHVwOjE7Ci0JdW5zaWduZWQJCWVwMF9ib3VuY2VkOjE7Ci0JdW5zaWduZWQJCWVwMF9leHBlY3RfaW46MTsKLQl1bnNpZ25lZAkJc3RhcnRfY29uZmlnX2lzc3VlZDoxOwotCXVuc2lnbmVkCQlzZXR1cF9wYWNrZXRfcGVuZGluZzoxOwotCXVuc2lnbmVkCQlkZWxheWVkX3N0YXR1czoxOwotCXVuc2lnbmVkCQluZWVkc19maWZvX3Jlc2l6ZToxOwotCXVuc2lnbmVkCQlyZXNpemVfZmlmb3M6MTsKLQl1bnNpZ25lZAkJcHVsbHVwc19jb25uZWN0ZWQ6MTsKKyNkZWZpbmUgRFdDM19SRVZJU0lPTl8yNjBBCTB4NTUzMzI2MGEKKyNkZWZpbmUgRFdDM19SRVZJU0lPTl8yNzBBCTB4NTUzMzI3MGEKKyNkZWZpbmUgRFdDM19SRVZJU0lPTl8yODBBCTB4NTUzMzI4MGEKIAogCWVudW0gZHdjM19lcDBfbmV4dAllcDBfbmV4dF9ldmVudDsKIAllbnVtIGR3YzNfZXAwX3N0YXRlCWVwMHN0YXRlOwpAQCAtNzMwLDYgKzc0NCwxOCBAQAogCiAJdTgJCQl0ZXN0X21vZGU7CiAJdTgJCQl0ZXN0X21vZGVfbnI7CisKKwl1bnNpZ25lZAkJZGVsYXllZF9zdGF0dXM6MTsKKwl1bnNpZ25lZAkJZXAwX2JvdW5jZWQ6MTsKKwl1bnNpZ25lZAkJZXAwX2V4cGVjdF9pbjoxOworCXVuc2lnbmVkCQloYXNfaGliZXJuYXRpb246MTsKKwl1bnNpZ25lZAkJaXNfc2VsZnBvd2VyZWQ6MTsKKwl1bnNpZ25lZAkJbmVlZHNfZmlmb19yZXNpemU6MTsKKwl1bnNpZ25lZAkJcHVsbHVwc19jb25uZWN0ZWQ6MTsKKwl1bnNpZ25lZAkJcmVzaXplX2ZpZm9zOjE7CisJdW5zaWduZWQJCXNldHVwX3BhY2tldF9wZW5kaW5nOjE7CisJdW5zaWduZWQJCXN0YXJ0X2NvbmZpZ19pc3N1ZWQ6MTsKKwl1bnNpZ25lZAkJdGhyZWVfc3RhZ2Vfc2V0dXA6MTsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MTUsMTUgKzg0MSwxNSBAQAogICoJMTIJLSBWbmRyRGV2VHN0UmN2ZWQKICAqIEByZXNlcnZlZDE1XzEyOiBSZXNlcnZlZCwgbm90IHVzZWQKICAqIEBldmVudF9pbmZvOiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV2ZW50Ci0gKiBAcmVzZXJ2ZWQzMV8yNDogUmVzZXJ2ZWQsIG5vdCB1c2VkCisgKiBAcmVzZXJ2ZWQzMV8yNTogUmVzZXJ2ZWQsIG5vdCB1c2VkCiAgKi8KIHN0cnVjdCBkd2MzX2V2ZW50X2RldnQgewogCXUzMglvbmVfYml0OjE7CiAJdTMyCWRldmljZV9ldmVudDo3OwogCXUzMgl0eXBlOjQ7CiAJdTMyCXJlc2VydmVkMTVfMTI6NDsKLQl1MzIJZXZlbnRfaW5mbzo4OwotCXUzMglyZXNlcnZlZDMxXzI0Ojg7CisJdTMyCWV2ZW50X2luZm86OTsKKwl1MzIJcmVzZXJ2ZWQzMV8yNTo3OwogfSBfX3BhY2tlZDsKIAogLyoqCkBAIC04NTYsNiArODgyLDE5IEBACiAJc3RydWN0IGR3YzNfZXZlbnRfZ2V2dAkJZ2V2dDsKIH07CiAKKy8qKgorICogc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgLSByZXByZXNlbnRhdGlvbiBvZiBlbmRwb2ludCBjb21tYW5kCisgKiBwYXJhbWV0ZXJzCisgKiBAcGFyYW0yOiB0aGlyZCBwYXJhbWV0ZXIKKyAqIEBwYXJhbTE6IHNlY29uZCBwYXJhbWV0ZXIKKyAqIEBwYXJhbTA6IGZpcnN0IHBhcmFtZXRlcgorICovCitzdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyB7CisJdTMyCXBhcmFtMjsKKwl1MzIJcGFyYW0xOworCXUzMglwYXJhbTA7Cit9OworCiAvKgogICogRFdDMyBGZWF0dXJlcyB0byBiZSB1c2VkIGFzIERyaXZlciBEYXRhCiAgKi8KQEAgLTg4MSwxMSArOTIwLDMxIEBACiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSB8fCBJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19EVUFMX1JPTEUpCiBpbnQgZHdjM19nYWRnZXRfaW5pdChzdHJ1Y3QgZHdjMyAqZHdjKTsKIHZvaWQgZHdjM19nYWRnZXRfZXhpdChzdHJ1Y3QgZHdjMyAqZHdjKTsKK2ludCBkd2MzX2dhZGdldF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIGludCBtb2RlKTsKK2ludCBkd2MzX2dhZGdldF9nZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjKTsKK2ludCBkd2MzX2dhZGdldF9zZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjLCBlbnVtIGR3YzNfbGlua19zdGF0ZSBzdGF0ZSk7CitpbnQgZHdjM19zZW5kX2dhZGdldF9lcF9jbWQoc3RydWN0IGR3YzMgKmR3YywgdW5zaWduZWQgZXAsCisJCXVuc2lnbmVkIGNtZCwgc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgKnBhcmFtcyk7CitpbnQgZHdjM19zZW5kX2dhZGdldF9nZW5lcmljX2NvbW1hbmQoc3RydWN0IGR3YzMgKmR3YywgaW50IGNtZCwgdTMyIHBhcmFtKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBkd2MzX2dhZGdldF9pbml0KHN0cnVjdCBkd2MzICpkd2MpCiB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZHdjM19nYWRnZXRfZXhpdChzdHJ1Y3QgZHdjMyAqZHdjKQogeyB9CitzdGF0aWMgaW5saW5lIGludCBkd2MzX2dhZGdldF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIGludCBtb2RlKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZHdjM19nYWRnZXRfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGR3YzMgKmR3YykKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGR3YzNfZ2FkZ2V0X3NldF9saW5rX3N0YXRlKHN0cnVjdCBkd2MzICpkd2MsCisJCWVudW0gZHdjM19saW5rX3N0YXRlIHN0YXRlKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChzdHJ1Y3QgZHdjMyAqZHdjLCB1bnNpZ25lZCBlcCwKKwkJdW5zaWduZWQgY21kLCBzdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyAqcGFyYW1zKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZHdjM19zZW5kX2dhZGdldF9nZW5lcmljX2NvbW1hbmQoc3RydWN0IGR3YzMgKmR3YywKKwkJaW50IGNtZCwgdTMyIHBhcmFtKQoreyByZXR1cm4gMDsgfQogI2VuZGlmCiAKIC8qIHBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYwppbmRleCBiMjY5ZGJkLi4xMTYwZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vbWFwLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+Ci0jaW5jbHVkZSA8bGludXgvZXh0Y29uL29mX2V4dGNvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgpAQCAtNDI0LDExICs0MjMsNiBAQAogCX0KIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycihkZXYsICJtaXNzaW5nIG1lbW9yeSBiYXNlIHJlc291cmNlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUihiYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CkBAIC01MjIsNyArNTE2LDcgQEAKIAlkd2MzX29tYXBfZW5hYmxlX2lycXMob21hcCk7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJleHRjb24iKSkgewotCQllZGV2ID0gb2ZfZXh0Y29uX2dldF9leHRjb25fZGV2KGRldiwgMCk7CisJCWVkZXYgPSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShkZXYsIDApOwogCQlpZiAoSVNfRVJSKGVkZXYpKSB7CiAJCQlkZXZfdmRiZyhkZXYsICJjb3VsZG4ndCBnZXQgZXh0Y29uIGRldmljZVxuIik7CiAJCQlyZXQgPSAtRVBST0JFX0RFRkVSOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKaW5kZXggMmRhMGE1YS4uYTc0MGVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCkBAIC02OCw2ICs2OCwyMiBAQAogfQogCiAvKioKKyAqIGR3YzNfZ2FkZ2V0X2dldF9saW5rX3N0YXRlIC0gR2V0cyBjdXJyZW50IHN0YXRlIG9mIFVTQiBMaW5rCisgKiBAZHdjOiBwb2ludGVyIHRvIG91ciBjb250ZXh0IHN0cnVjdHVyZQorICoKKyAqIENhbGxlciBzaG91bGQgdGFrZSBjYXJlIG9mIGxvY2tpbmcuIFRoaXMgZnVuY3Rpb24gd2lsbAorICogcmV0dXJuIHRoZSBsaW5rIHN0YXRlIG9uIHN1Y2Nlc3MgKD49IDApIG9yIC1FVElNRURPVVQuCisgKi8KK2ludCBkd2MzX2dhZGdldF9nZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjKQoreworCXUzMgkJcmVnOworCisJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfRFNUUyk7CisKKwlyZXR1cm4gRFdDM19EU1RTX1VTQkxOS1NUKHJlZyk7Cit9CisKKy8qKgogICogZHdjM19nYWRnZXRfc2V0X2xpbmtfc3RhdGUgLSBTZXRzIFVTQiBMaW5rIHRvIGEgcGFydGljdWxhciBTdGF0ZQogICogQGR3YzogcG9pbnRlciB0byBvdXIgY29udGV4dCBzdHJ1Y3R1cmUKICAqIEBzdGF0ZTogdGhlIHN0YXRlIHRvIHB1dCBsaW5rIGludG8KQEAgLTQxNyw3ICs0MzMsNyBAQAogc3RhdGljIGludCBkd2MzX2dhZGdldF9zZXRfZXBfY29uZmlnKHN0cnVjdCBkd2MzICpkd2MsIHN0cnVjdCBkd2MzX2VwICpkZXAsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYywKIAkJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNvbXBfZGVzYywKLQkJYm9vbCBpZ25vcmUpCisJCWJvb2wgaWdub3JlLCBib29sIHJlc3RvcmUpCiB7CiAJc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgcGFyYW1zOwogCkBAIC00MzYsNiArNDUyLDExIEBACiAJaWYgKGlnbm9yZSkKIAkJcGFyYW1zLnBhcmFtMCB8PSBEV0MzX0RFUENGR19JR05fU0VRX05VTTsKIAorCWlmIChyZXN0b3JlKSB7CisJCXBhcmFtcy5wYXJhbTAgfD0gRFdDM19ERVBDRkdfQUNUSU9OX1JFU1RPUkU7CisJCXBhcmFtcy5wYXJhbTIgfD0gZGVwLT5zYXZlZF9zdGF0ZTsKKwl9CisKIAlwYXJhbXMucGFyYW0xID0gRFdDM19ERVBDRkdfWEZFUl9DT01QTEVURV9FTgogCQl8IERXQzNfREVQQ0ZHX1hGRVJfTk9UX1JFQURZX0VOOwogCkBAIC00OTQsNyArNTE1LDcgQEAKIHN0YXRpYyBpbnQgX19kd2MzX2dhZGdldF9lcF9lbmFibGUoc3RydWN0IGR3YzNfZXAgKmRlcCwKIAkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjLAogCQljb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqY29tcF9kZXNjLAotCQlib29sIGlnbm9yZSkKKwkJYm9vbCBpZ25vcmUsIGJvb2wgcmVzdG9yZSkKIHsKIAlzdHJ1Y3QgZHdjMwkJKmR3YyA9IGRlcC0+ZHdjOwogCXUzMgkJCXJlZzsKQEAgLTUwOCw3ICs1MjksOCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkd2MzX2dhZGdldF9zZXRfZXBfY29uZmlnKGR3YywgZGVwLCBkZXNjLCBjb21wX2Rlc2MsIGlnbm9yZSk7CisJcmV0ID0gZHdjM19nYWRnZXRfc2V0X2VwX2NvbmZpZyhkd2MsIGRlcCwgZGVzYywgY29tcF9kZXNjLCBpZ25vcmUsCisJCQlyZXN0b3JlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC01NDgsMTMgKzU3MCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBlcG51bSk7CitzdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBlcG51bSwgYm9vbCBmb3JjZSk7CiBzdGF0aWMgdm9pZCBkd2MzX3JlbW92ZV9yZXF1ZXN0cyhzdHJ1Y3QgZHdjMyAqZHdjLCBzdHJ1Y3QgZHdjM19lcCAqZGVwKQogewogCXN0cnVjdCBkd2MzX3JlcXVlc3QJCSpyZXE7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmRlcC0+cmVxX3F1ZXVlZCkpIHsKLQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyKTsKKwkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKIAogCQkvKiAtIGdpdmViYWNrIGFsbCByZXF1ZXN0cyB0byBnYWRnZXQgZHJpdmVyICovCiAJCXdoaWxlICghbGlzdF9lbXB0eSgmZGVwLT5yZXFfcXVldWVkKSkgewpAQCAtNjU5LDcgKzY4MSw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgZGVzYywgZXAtPmNvbXBfZGVzYywgZmFsc2UpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgZGVzYywgZXAtPmNvbXBfZGVzYywgZmFsc2UsIGZhbHNlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd2MtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC03NzEsOSArNzkzLDYgQEAKIAkJCXRyYi0+Y3RybCA9IERXQzNfVFJCQ1RMX0lTT0NIUk9OT1VTX0ZJUlNUOwogCQllbHNlCiAJCQl0cmItPmN0cmwgPSBEV0MzX1RSQkNUTF9JU09DSFJPTk9VUzsKLQotCQlpZiAoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKQotCQkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfSU9DOwogCQlicmVhazsKIAogCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKQEAgLTc4OCw2ICs4MDcsOSBAQAogCQlCVUcoKTsKIAl9CiAKKwlpZiAoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKQorCQl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9JT0M7CisKIAlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpKSB7CiAJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0lTUF9JTUk7CiAJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0NTUDsKQEAgLTEwNzcsNyArMTA5OSw3IEBACiAJCSAqLwogCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpKSB7CiAJCQlpZiAobGlzdF9lbXB0eSgmZGVwLT5yZXFfcXVldWVkKSkgewotCQkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlcik7CisJCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKIAkJCQlkZXAtPmZsYWdzID0gRFdDM19FUF9FTkFCTEVEOwogCQkJfQogCQkJcmV0dXJuIDA7CkBAIC0xMTA3LDYgKzExMjksMjMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKgorCSAqIDQuIFN0cmVhbSBDYXBhYmxlIEJ1bGsgRW5kcG9pbnRzLiBXZSBuZWVkIHRvIHN0YXJ0IHRoZSB0cmFuc2ZlcgorCSAqIHJpZ2h0IGF3YXksIG90aGVyd2lzZSBob3N0IHdpbGwgbm90IGtub3cgd2UgaGF2ZSBzdHJlYW1zIHRvIGJlCisJICogaGFuZGxlZC4KKwkgKi8KKwlpZiAoZGVwLT5zdHJlYW1fY2FwYWJsZSkgeworCQlpbnQJcmV0OworCisJCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDAsIHRydWUpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpIHsKKwkJCXN0cnVjdCBkd2MzCSpkd2MgPSBkZXAtPmR3YzsKKworCQkJZGV2X2RiZyhkd2MtPmRldiwgIiVzOiBmYWlsZWQgdG8ga2ljayB0cmFuc2ZlcnNcbiIsCisJCQkJCWRlcC0+bmFtZSk7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE2Myw3ICsxMjAyLDcgQEAKIAkJfQogCQlpZiAociA9PSByZXEpIHsKIAkJCS8qIHdhaXQgdW50aWwgaXQgaXMgcHJvY2Vzc2VkICovCi0JCQlkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKGR3YywgZGVwLT5udW1iZXIpOworCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKIAkJCWdvdG8gb3V0MTsKIAkJfQogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAicmVxdWVzdCAlcCB3YXMgbm90IHF1ZXVlZCB0byAlc1xuIiwKQEAgLTExOTQsOCArMTIzMyw3IEBACiAJCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKGR3YywgZGVwLT5udW1iZXIsCiAJCQlEV0MzX0RFUENNRF9TRVRTVEFMTCwgJnBhcmFtcyk7CiAJCWlmIChyZXQpCi0JCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvICVzIFNUQUxMIG9uICVzXG4iLAotCQkJCQl2YWx1ZSA/ICJzZXQiIDogImNsZWFyIiwKKwkJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gc2V0IFNUQUxMIG9uICVzXG4iLAogCQkJCQlkZXAtPm5hbWUpOwogCQllbHNlCiAJCQlkZXAtPmZsYWdzIHw9IERXQzNfRVBfU1RBTEw7CkBAIC0xMjAzLDggKzEyNDEsNyBAQAogCQlyZXQgPSBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChkd2MsIGRlcC0+bnVtYmVyLAogCQkJRFdDM19ERVBDTURfQ0xFQVJTVEFMTCwgJnBhcmFtcyk7CiAJCWlmIChyZXQpCi0JCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvICVzIFNUQUxMIG9uICVzXG4iLAotCQkJCQl2YWx1ZSA/ICJzZXQiIDogImNsZWFyIiwKKwkJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gY2xlYXIgU1RBTEwgb24gJXNcbiIsCiAJCQkJCWRlcC0+bmFtZSk7CiAJCWVsc2UKIAkJCWRlcC0+ZmxhZ3MgJj0gfihEV0MzX0VQX1NUQUxMIHwgRFdDM19FUF9XRURHRSk7CkBAIC0xMzg3LDcgKzE0MjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKHN0cnVjdCBkd2MzICpkd2MsIGludCBpc19vbikKK3N0YXRpYyBpbnQgZHdjM19nYWRnZXRfcnVuX3N0b3Aoc3RydWN0IGR3YzMgKmR3YywgaW50IGlzX29uLCBpbnQgc3VzcGVuZCkKIHsKIAl1MzIJCQlyZWc7CiAJdTMyCQkJdGltZW91dCA9IDUwMDsKQEAgLTE0MDIsOSArMTQzOSwxNyBAQAogCQlpZiAoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzE5NEEpCiAJCQlyZWcgJj0gfkRXQzNfRENUTF9LRUVQX0NPTk5FQ1Q7CiAJCXJlZyB8PSBEV0MzX0RDVExfUlVOX1NUT1A7CisKKwkJaWYgKGR3Yy0+aGFzX2hpYmVybmF0aW9uKQorCQkJcmVnIHw9IERXQzNfRENUTF9LRUVQX0NPTk5FQ1Q7CisKIAkJZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCA9IHRydWU7CiAJfSBlbHNlIHsKIAkJcmVnICY9IH5EV0MzX0RDVExfUlVOX1NUT1A7CisKKwkJaWYgKGR3Yy0+aGFzX2hpYmVybmF0aW9uICYmICFzdXNwZW5kKQorCQkJcmVnICY9IH5EV0MzX0RDVExfS0VFUF9DT05ORUNUOworCiAJCWR3Yy0+cHVsbHVwc19jb25uZWN0ZWQgPSBmYWxzZTsKIAl9CiAKQEAgLTE0NDIsNyArMTQ4Nyw3IEBACiAJaXNfb24gPSAhIWlzX29uOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwotCXJldCA9IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgaXNfb24pOworCXJldCA9IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgaXNfb24sIGZhbHNlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd2MtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC0xNTQ5LDE0ICsxNTk0LDE2IEBACiAJZHdjM19nYWRnZXRfZXAwX2Rlc2Mud01heFBhY2tldFNpemUgPSBjcHVfdG9fbGUxNig1MTIpOwogCiAJZGVwID0gZHdjLT5lcHNbMF07Ci0JcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlKTsKKwlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgZmFsc2UsCisJCQlmYWxzZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAlc1xuIiwgZGVwLT5uYW1lKTsKIAkJZ290byBlcnIyOwogCX0KIAogCWRlcCA9IGR3Yy0+ZXBzWzFdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJXNcbiIsIGRlcC0+bmFtZSk7CiAJCWdvdG8gZXJyMzsKQEAgLTE4NDksMTUgKzE4OTYsMTIgQEAKIAkJCSAqLwogCQkJZGVwLT5mbGFncyA9IERXQzNfRVBfUEVORElOR19SRVFVRVNUOwogCQl9IGVsc2UgewotCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyKTsKKwkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7CiAJCQlkZXAtPmZsYWdzID0gRFdDM19FUF9FTkFCTEVEOwogCQl9CiAJCXJldHVybiAxOwogCX0KIAotCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfSU9DKSAmJgotCQkJKHRyYi0+Y3RybCAmIERXQzNfVFJCX0NUUkxfSU9DKSkKLQkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE5OTksNyArMjA0MywyNSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcihzdHJ1Y3QgZHdjMyAqZHdjLCB1MzIgZXBudW0pCitzdGF0aWMgdm9pZCBkd2MzX3N1c3BlbmRfZ2FkZ2V0KHN0cnVjdCBkd2MzICpkd2MpCit7CisJaWYgKGR3Yy0+Z2FkZ2V0X2RyaXZlciAmJiBkd2MtPmdhZGdldF9kcml2ZXItPnN1c3BlbmQpIHsKKwkJc3Bpbl91bmxvY2soJmR3Yy0+bG9jayk7CisJCWR3Yy0+Z2FkZ2V0X2RyaXZlci0+c3VzcGVuZCgmZHdjLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmR3Yy0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkd2MzX3Jlc3VtZV9nYWRnZXQoc3RydWN0IGR3YzMgKmR3YykKK3sKKwlpZiAoZHdjLT5nYWRnZXRfZHJpdmVyICYmIGR3Yy0+Z2FkZ2V0X2RyaXZlci0+cmVzdW1lKSB7CisJCXNwaW5fdW5sb2NrKCZkd2MtPmxvY2spOworCQlkd2MtPmdhZGdldF9kcml2ZXItPnJlc3VtZSgmZHdjLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmR3Yy0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBlcG51bSwgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgZHdjM19lcCAqZGVwOwogCXN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zIHBhcmFtczsKQEAgLTIwMzEsNyArMjA5Myw4IEBACiAJICovCiAKIAljbWQgPSBEV0MzX0RFUENNRF9FTkRUUkFOU0ZFUjsKLQljbWQgfD0gRFdDM19ERVBDTURfSElQUklfRk9SQ0VSTSB8IERXQzNfREVQQ01EX0NNRElPQzsKKwljbWQgfD0gZm9yY2UgPyBEV0MzX0RFUENNRF9ISVBSSV9GT1JDRVJNIDogMDsKKwljbWQgfD0gRFdDM19ERVBDTURfQ01ESU9DOwogCWNtZCB8PSBEV0MzX0RFUENNRF9QQVJBTShkZXAtPnJlc291cmNlX2luZGV4KTsKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCXJldCA9IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKGR3YywgZGVwLT5udW1iZXIsIGNtZCwgJnBhcmFtcyk7CkBAIC0yMjYwLDE3ICsyMzIzLDIzIEBACiAJCXJlZyB8PSBEV0MzX0RDVExfSElSRF9USFJFUygxMik7CiAKIAkJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0RDVEwsIHJlZyk7CisJfSBlbHNlIHsKKwkJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfRENUTCk7CisJCXJlZyAmPSB+RFdDM19EQ1RMX0hJUkRfVEhSRVNfTUFTSzsKKwkJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0RDVEwsIHJlZyk7CiAJfQogCiAJZGVwID0gZHdjLT5lcHNbMF07Ci0JcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIHRydWUpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCB0cnVlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJXNcbiIsIGRlcC0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKIAlkZXAgPSBkd2MtPmVwc1sxXTsKLQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgdHJ1ZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIHRydWUsCisJCQlmYWxzZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAlc1xuIiwgZGVwLT5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtMjM3OCw5ICsyNDQ3LDUwIEBACiAKIAlkd2MtPmxpbmtfc3RhdGUgPSBuZXh0OwogCisJc3dpdGNoIChuZXh0KSB7CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfVTE6CisJCWlmIChkd2MtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJCWR3YzNfc3VzcGVuZF9nYWRnZXQoZHdjKTsKKwkJYnJlYWs7CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfVTI6CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfVTM6CisJCWR3YzNfc3VzcGVuZF9nYWRnZXQoZHdjKTsKKwkJYnJlYWs7CisJY2FzZSBEV0MzX0xJTktfU1RBVEVfUkVTVU1FOgorCQlkd2MzX3Jlc3VtZV9nYWRnZXQoZHdjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisKIAlkZXZfdmRiZyhkd2MtPmRldiwgIiVzIGxpbmsgJWRcbiIsIF9fZnVuY19fLCBkd2MtPmxpbmtfc3RhdGUpOwogfQogCitzdGF0aWMgdm9pZCBkd2MzX2dhZGdldF9oaWJlcm5hdGlvbl9pbnRlcnJ1cHQoc3RydWN0IGR3YzMgKmR3YywKKwkJdW5zaWduZWQgaW50IGV2dGluZm8pCit7CisJdW5zaWduZWQgaW50IGlzX3NzID0gZXZ0aW5mbyAmIEJJVCg0KTsKKworCS8qKgorCSAqIFdPUktBUk9VTkQ6IERXQzMgcmV2aXNvbiAyLjIwYSB3aXRoIGhpYmVybmF0aW9uIHN1cHBvcnQKKwkgKiBoYXZlIGEga25vd24gaXNzdWUgd2hpY2ggY2FuIGNhdXNlIFVTQiBDViBURC45LjIzIHRvIGZhaWwKKwkgKiByYW5kb21seS4KKwkgKgorCSAqIEJlY2F1c2Ugb2YgdGhpcyBpc3N1ZSwgY29yZSBjb3VsZCBnZW5lcmF0ZSBib2d1cyBoaWJlcm5hdGlvbgorCSAqIGV2ZW50cyB3aGljaCBTVyBuZWVkcyB0byBpZ25vcmUuCisJICoKKwkgKiBSZWZlcnMgdG86CisJICoKKwkgKiBTVEFSIzkwMDA1NDY1NzY6IERldmljZSBNb2RlIEhpYmVybmF0aW9uOiBJc3N1ZSBpbiBVU0IgMi4wCisJICogRGV2aWNlIEZhbGxiYWNrIGZyb20gU3VwZXJTcGVlZAorCSAqLworCWlmIChpc19zcyBeIChkd2MtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikpCisJCXJldHVybjsKKworCS8qIGVudGVyIGhpYmVybmF0aW9uIGhlcmUgKi8KK30KKwogc3RhdGljIHZvaWQgZHdjM19nYWRnZXRfaW50ZXJydXB0KHN0cnVjdCBkd2MzICpkd2MsCiAJCWNvbnN0IHN0cnVjdCBkd2MzX2V2ZW50X2RldnQgKmV2ZW50KQogewpAQCAtMjM5Nyw2ICsyNTA3LDEzIEBACiAJY2FzZSBEV0MzX0RFVklDRV9FVkVOVF9XQUtFVVA6CiAJCWR3YzNfZ2FkZ2V0X3dha2V1cF9pbnRlcnJ1cHQoZHdjKTsKIAkJYnJlYWs7CisJY2FzZSBEV0MzX0RFVklDRV9FVkVOVF9ISUJFUl9SRVE6CisJCWlmIChkZXZfV0FSTl9PTkNFKGR3Yy0+ZGV2LCAhZHdjLT5oYXNfaGliZXJuYXRpb24sCisJCQkJCSJ1bmV4cGVjdGVkIGhpYmVybmF0aW9uIGV2ZW50XG4iKSkKKwkJCWJyZWFrOworCisJCWR3YzNfZ2FkZ2V0X2hpYmVybmF0aW9uX2ludGVycnVwdChkd2MsIGV2ZW50LT5ldmVudF9pbmZvKTsKKwkJYnJlYWs7CiAJY2FzZSBEV0MzX0RFVklDRV9FVkVOVF9MSU5LX1NUQVRVU19DSEFOR0U6CiAJCWR3YzNfZ2FkZ2V0X2xpbmtzdHNfY2hhbmdlX2ludGVycnVwdChkd2MsIGV2ZW50LT5ldmVudF9pbmZvKTsKIAkJYnJlYWs7CkBAIC0yNjYxLDggKzI3NzgsMTAgQEAKIAogaW50IGR3YzNfZ2FkZ2V0X3ByZXBhcmUoc3RydWN0IGR3YzMgKmR3YykKIHsKLQlpZiAoZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCkKKwlpZiAoZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCkgewogCQlkd2MzX2dhZGdldF9kaXNhYmxlX2lycShkd2MpOworCQlkd2MzX2dhZGdldF9ydW5fc3RvcChkd2MsIHRydWUsIHRydWUpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjY3MSw3ICsyNzkwLDcgQEAKIHsKIAlpZiAoZHdjLT5wdWxsdXBzX2Nvbm5lY3RlZCkgewogCQlkd2MzX2dhZGdldF9lbmFibGVfaXJxKGR3Yyk7Ci0JCWR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgdHJ1ZSk7CisJCWR3YzNfZ2FkZ2V0X3J1bl9zdG9wKGR3YywgdHJ1ZSwgZmFsc2UpOwogCX0KIH0KIApAQCAtMjY5NCwxMiArMjgxMywxNCBAQAogCWR3YzNfZ2FkZ2V0X2VwMF9kZXNjLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoNTEyKTsKIAogCWRlcCA9IGR3Yy0+ZXBzWzBdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyMDsKIAogCWRlcCA9IGR3Yy0+ZXBzWzFdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuaCBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmgKaW5kZXggZmViZTFhYS4uYTBlZTc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5oCkBAIC01NiwxMiArNTYsNiBAQAogLyogREVQWEZFUkNGRyBwYXJhbWV0ZXIgMCAqLwogI2RlZmluZSBEV0MzX0RFUFhGRVJDRkdfTlVNX1hGRVJfUkVTKG4pCSgobikgJiAweGZmZmYpCiAKLXN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zIHsKLQl1MzIJcGFyYW0yOwotCXUzMglwYXJhbTE7Ci0JdTMyCXBhcmFtMDsKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNkZWZpbmUgdG9fZHdjM19yZXF1ZXN0KHIpCShjb250YWluZXJfb2Yociwgc3RydWN0IGR3YzNfcmVxdWVzdCwgcmVxdWVzdCkpCkBAIC04NSw5ICs3OSw2IEBACiB2b2lkIGR3YzNfZ2FkZ2V0X2dpdmViYWNrKHN0cnVjdCBkd2MzX2VwICpkZXAsIHN0cnVjdCBkd2MzX3JlcXVlc3QgKnJlcSwKIAkJaW50IHN0YXR1cyk7CiAKLWludCBkd2MzX2dhZGdldF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIGludCBtb2RlKTsKLWludCBkd2MzX2dhZGdldF9zZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjLCBlbnVtIGR3YzNfbGlua19zdGF0ZSBzdGF0ZSk7Ci0KIHZvaWQgZHdjM19lcDBfaW50ZXJydXB0KHN0cnVjdCBkd2MzICpkd2MsCiAJCWNvbnN0IHN0cnVjdCBkd2MzX2V2ZW50X2RlcGV2dCAqZXZlbnQpOwogdm9pZCBkd2MzX2VwMF9vdXRfc3RhcnQoc3RydWN0IGR3YzMgKmR3Yyk7CkBAIC05NSw5ICs4Niw2IEBACiBpbnQgZHdjM19nYWRnZXRfZXAwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcXVlc3QsCiAJCWdmcF90IGdmcF9mbGFncyk7CiBpbnQgX19kd2MzX2dhZGdldF9lcF9zZXRfaGFsdChzdHJ1Y3QgZHdjM19lcCAqZGVwLCBpbnQgdmFsdWUpOwotaW50IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKHN0cnVjdCBkd2MzICpkd2MsIHVuc2lnbmVkIGVwLAotCQl1bnNpZ25lZCBjbWQsIHN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zICpwYXJhbXMpOwotaW50IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKHN0cnVjdCBkd2MzICpkd2MsIGludCBjbWQsIHUzMiBwYXJhbSk7CiAKIC8qKgogICogZHdjM19nYWRnZXRfZXBfZ2V0X3RyYW5zZmVyX2luZGV4IC0gR2V0cyB0cmFuc2ZlciBpbmRleCBmcm9tIEhXCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IDgxNTQxNjUuLjM1NTdjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC0yMjYsNyArMjI2LDcgQEAKIGNvbmZpZyBVU0JfT01BUAogCXRyaXN0YXRlICJPTUFQIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKLQlzZWxlY3QgSVNQMTMwMV9PTUFQIGlmIE1BQ0hfT01BUF9IMiB8fCBNQUNIX09NQVBfSDMgfHwgTUFDSF9PTUFQX0g0X09URworCXNlbGVjdCBJU1AxMzAxX09NQVAgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMwogCWhlbHAKIAkgICBNYW55IFRleGFzIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycyBoYXZlIGZsZXhpYmxlIGZ1bGwKIAkgICBzcGVlZCBVU0IgZGV2aWNlIGNvbnRyb2xsZXJzLCB3aXRoIHN1cHBvcnQgZm9yIHVwIHRvIDMwCkBAIC0zMDEsNyArMzAxLDYgQEAKIAkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAogY29uZmlnIFVTQl9TM0NfSFNPVEcKLQlkZXBlbmRzIG9uIEFSTQogCXRyaXN0YXRlICJEZXNpZ253YXJlL1MzQyBIUy9PdEcgVVNCIERldmljZSBjb250cm9sbGVyIgogCWhlbHAKIAkgIFRoZSBEZXNpZ253YXJlIFVTQjIuMCBoaWdoLXNwZWVkIGdhZGdldCBjb250cm9sbGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IGNlYThjMjAuLmY2MDVhZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC0xNzU4LDE1ICsxNzU4LDE1IEBACiAKIAkvKiBuZXdlciBjaGlwcyBoYXZlIG1vcmUgRklGTyBtZW1vcnkgdGhhbiBybTkyMDAgKi8KIAlpZiAoY3B1X2lzX2F0OTFzYW05MjYwKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzIwKCkpIHsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbMF0uZXAsIDY0KTsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbM10uZXAsIDY0KTsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbNF0uZXAsIDUxMik7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzVdLmVwLCA1MTIpOworCQl1ZGMtPmVwWzBdLm1heHBhY2tldCA9IDY0OworCQl1ZGMtPmVwWzNdLm1heHBhY2tldCA9IDY0OworCQl1ZGMtPmVwWzRdLm1heHBhY2tldCA9IDUxMjsKKwkJdWRjLT5lcFs1XS5tYXhwYWNrZXQgPSA1MTI7CiAJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkgewotCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmdWRjLT5lcFszXS5lcCwgNjQpOworCQl1ZGMtPmVwWzNdLm1heHBhY2tldCA9IDY0OwogCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYzKCkpIHsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbMF0uZXAsIDY0KTsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbM10uZXAsIDY0KTsKKwkJdWRjLT5lcFswXS5tYXhwYWNrZXQgPSA2NDsKKwkJdWRjLT5lcFszXS5tYXhwYWNrZXQgPSA2NDsKIAl9CiAKIAl1ZGMtPnVkcF9iYXNlYWRkciA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKaW5kZXggNTI3NzFkNC4uOWY2NTMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKQEAgLTE2NjEsNyArMTY2MSw3IEBACiAJaWYgKGRtYV9zdGF0dXMpIHsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMTsgaSA8IFVTQkFfTlJfRU5EUE9JTlRTOyBpKyspCisJCWZvciAoaSA9IDE7IGkgPCBVU0JBX05SX0RNQVM7IGkrKykKIAkJCWlmIChkbWFfc3RhdHVzICYgKDEgPDwgaSkpCiAJCQkJdXNiYV9kbWFfaXJxKHVkYywgJnVkYy0+dXNiYV9lcFtpXSk7CiAJfQpAQCAtMTY3MCw3ICsxNjcwLDcgQEAKIAlpZiAoZXBfc3RhdHVzKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBVU0JBX05SX0VORFBPSU5UUzsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgdWRjLT5udW1fZXA7IGkrKykKIAkJCWlmIChlcF9zdGF0dXMgJiAoMSA8PCBpKSkgewogCQkJCWlmIChlcF9pc19jb250cm9sKCZ1ZGMtPnVzYmFfZXBbaV0pKQogCQkJCQl1c2JhX2NvbnRyb2xfaXJxKHVkYywgJnVkYy0+dXNiYV9lcFtpXSk7CkBAIC0xODI3LDEyICsxODI3LDEyIEBACiAJdG9nZ2xlX2JpYXMoMCk7CiAJdXNiYV93cml0ZWwodWRjLCBDVFJMLCBVU0JBX0RJU0FCTEVfTUFTSyk7CiAKLQl1ZGMtPmRyaXZlciA9IE5VTEw7Ci0KIAljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5oY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5wY2xrKTsKIAotCURCRyhEQkdfR0FER0VULCAidW5yZWdpc3RlcmVkIGRyaXZlciBgJXMnXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKKwlEQkcoREJHX0dBREdFVCwgInVucmVnaXN0ZXJlZCBkcml2ZXIgYCVzJ1xuIiwgdWRjLT5kcml2ZXItPmRyaXZlci5uYW1lKTsKKworCXVkYy0+ZHJpdmVyID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtMTkxNCw2ICsxOTE0LDEyIEBACiAJCWkrKzsKIAl9CiAKKwlpZiAoaSA9PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9mX3Byb2JlOiBubyBlbmRwb2ludCBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKIAlyZXR1cm4gZXBzOwogZXJyOgogCXJldHVybiBFUlJfUFRSKHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5oCmluZGV4IDI5MjJkYjUuLmE3MDcwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5oCkBAIC0yMTAsNyArMjEwLDcgQEAKICNkZWZpbmUgVVNCQV9GSUZPX0JBU0UoeCkJKCh4KSA8PCAxNikKIAogLyogU3ludGggcGFyYW1ldGVycyAqLwotI2RlZmluZSBVU0JBX05SX0VORFBPSU5UUwk3CisjZGVmaW5lIFVTQkFfTlJfRE1BUwkJNwogCiAjZGVmaW5lIEVQMF9GSUZPX1NJWkUJCTY0CiAjZGVmaW5lIEVQMF9FUFRfU0laRQkJVVNCQV9FUFRfU0laRV82NApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCmluZGV4IGQ3NDJiZWQuLmZhYjkwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKQEAgLTExMzksNyArMTEzOSw3IEBACiAKIAl1YyA9IGNvcHlfZ2FkZ2V0X3N0cmluZ3Moc3AsIG5fZ3N0cmluZ3MsIG5fc3RyaW5ncyk7CiAJaWYgKElTX0VSUih1YykpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIodWMpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHVjKTsKIAogCW5fZ3MgPSBnZXRfY29udGFpbmVyc19ncyh1Yyk7CiAJcmV0ID0gdXNiX3N0cmluZ19pZHNfdGFiKGNkZXYsIG5fZ3NbMF0tPnN0cmluZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMKaW5kZXggMmI0MzM0My4uMmUxNjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jCkBAIC0yOCw2ICsyOCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZnVuY3Rpb25mcy5oPgogCisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKICNpbmNsdWRlICJ1X2ZzLmgiCiAjaW5jbHVkZSAiY29uZmlnZnMuaCIKIApAQCAtOTksNiArMTAzLDE0IEBACiB9CiAKIAorc3RhdGljIGlubGluZSBlbnVtIGZmc19zZXR1cF9zdGF0ZQorZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChzdHJ1Y3QgZmZzX2RhdGEgKmZmcykKK3sKKwlyZXR1cm4gKGVudW0gZmZzX3NldHVwX3N0YXRlKQorCQljbXB4Y2hnKCZmZnMtPnNldHVwX3N0YXRlLCBGRlNfU0VUVVBfQ0FOQ0VMTEVELCBGRlNfTk9fU0VUVVApOworfQorCisKIHN0YXRpYyB2b2lkIGZmc19mdW5jX2Vwc19kaXNhYmxlKHN0cnVjdCBmZnNfZnVuY3Rpb24gKmZ1bmMpOwogc3RhdGljIGludCBfX211c3RfY2hlY2sgZmZzX2Z1bmNfZXBzX2VuYWJsZShzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jKTsKIApAQCAtMTIyLDggKzEzNCw4IEBACiAJc3RydWN0IHVzYl9lcAkJCSplcDsJLyogUDogZmZzLT5lcHNfbG9jayAqLwogCXN0cnVjdCB1c2JfcmVxdWVzdAkJKnJlcTsJLyogUDogZXBmaWxlLT5tdXRleCAqLwogCi0JLyogWzBdOiBmdWxsIHNwZWVkLCBbMV06IGhpZ2ggc3BlZWQgKi8KLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmRlc2NzWzJdOworCS8qIFswXTogZnVsbCBzcGVlZCwgWzFdOiBoaWdoIHNwZWVkLCBbMl06IHN1cGVyIHNwZWVkICovCisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjc1szXTsKIAogCXU4CQkJCW51bTsKIApAQCAtMTQ4LDYgKzE2MCwyNSBAQAogCXVuc2lnbmVkIGNoYXIJCQlfcGFkOwogfTsKIAorLyogIGZmc19pb19kYXRhIHN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBmZnNfaW9fZGF0YSB7CisJYm9vbCBhaW87CisJYm9vbCByZWFkOworCisJc3RydWN0IGtpb2NiICpraW9jYjsKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdmVjOworCXVuc2lnbmVkIGxvbmcgbnJfc2VnczsKKwljaGFyIF9fdXNlciAqYnVmOworCXNpemVfdCBsZW47CisKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXN0cnVjdCB1c2JfZXAgKmVwOworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOworfTsKKwogc3RhdGljIGludCAgX19tdXN0X2NoZWNrIGZmc19lcGZpbGVzX2NyZWF0ZShzdHJ1Y3QgZmZzX2RhdGEgKmZmcyk7CiBzdGF0aWMgdm9pZCBmZnNfZXBmaWxlc19kZXN0cm95KHN0cnVjdCBmZnNfZXBmaWxlICplcGZpbGVzLCB1bnNpZ25lZCBjb3VudCk7CiAKQEAgLTE2MSw4ICsxOTIsMTAgQEAKIERFRklORV9NVVRFWChmZnNfbG9jayk7CiBFWFBPUlRfU1lNQk9MKGZmc19sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpmZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfYWxsb2NfZGV2KHZvaWQpOwogc3RhdGljIGludCBfZmZzX25hbWVfZGV2KHN0cnVjdCBmZnNfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgX2Zmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkICpmZnNfYWNxdWlyZV9kZXYoY29uc3QgY2hhciAqZGV2X25hbWUpOwogc3RhdGljIHZvaWQgZmZzX3JlbGVhc2VfZGV2KHN0cnVjdCBmZnNfZGF0YSAqZmZzX2RhdGEpOwogc3RhdGljIGludCBmZnNfcmVhZHkoc3RydWN0IGZmc19kYXRhICpmZnMpOwpAQCAtMjE4LDcgKzI1MSw3IEBACiAJfQogCiAJZmZzLT5zZXR1cF9zdGF0ZSA9IEZGU19OT19TRVRVUDsKLQlyZXR1cm4gZmZzLT5lcDByZXFfc3RhdHVzOworCXJldHVybiByZXEtPnN0YXR1cyA/IHJlcS0+c3RhdHVzIDogcmVxLT5hY3R1YWw7CiB9CiAKIHN0YXRpYyBpbnQgX19mZnNfZXAwX3N0YWxsKHN0cnVjdCBmZnNfZGF0YSAqZmZzKQpAQCAtMjQ0LDcgKzI3Nyw3IEBACiAJRU5URVIoKTsKIAogCS8qIEZhc3QgY2hlY2sgaWYgc2V0dXAgd2FzIGNhbmNlbGVkICovCi0JaWYgKEZGU19TRVRVUF9TVEFURShmZnMpID09IEZGU19TRVRVUF9DQU5DRUxFRCkKKwlpZiAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpID09IEZGU19TRVRVUF9DQU5DRUxMRUQpCiAJCXJldHVybiAtRUlEUk07CiAKIAkvKiBBY3F1aXJlIG11dGV4ICovCkBAIC0zMTAsOCArMzQzLDggQEAKIAkJICogcmF0aGVyIHRoZW4gX2lycXNhdmUKIAkJICovCiAJCXNwaW5fbG9ja19pcnEoJmZmcy0+ZXYud2FpdHEubG9jayk7Ci0JCXN3aXRjaCAoRkZTX1NFVFVQX1NUQVRFKGZmcykpIHsKLQkJY2FzZSBGRlNfU0VUVVBfQ0FOQ0VMRUQ6CisJCXN3aXRjaCAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpKSB7CisJCWNhc2UgRkZTX1NFVFVQX0NBTkNFTExFRDoKIAkJCXJldCA9IC1FSURSTTsKIAkJCWdvdG8gZG9uZV9zcGluOwogCkBAIC0zNDYsNyArMzc5LDcgQEAKIAkJLyoKIAkJICogV2UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RpbGwgaW4gRkZTX0FDVElWRSBzdGF0ZQogCQkgKiBidXQgdGhlIHN0YXRlIG9mIHNldHVwIGNvdWxkIGhhdmUgY2hhbmdlZCBmcm9tCi0JCSAqIEZGU19TRVRVUF9QRU5ESU5HIHRvIEZGU19TRVRVUF9DQU5DRUxFRCBzbyB3ZSBuZWVkCisJCSAqIEZGU19TRVRVUF9QRU5ESU5HIHRvIEZGU19TRVRVUF9DQU5DRUxMRUQgc28gd2UgbmVlZAogCQkgKiB0byBjaGVjayBmb3IgdGhhdC4gIElmIHRoYXQgaGFwcGVuZWQgd2UgY29waWVkIGRhdGEKIAkJICogZnJvbSB1c2VyIHNwYWNlIGluIHZhaW4gYnV0IGl0J3MgdW5saWtlbHkuCiAJCSAqCkBAIC0zNTUsNyArMzg4LDggQEAKIAkJICogdHJhbnNpdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGFuZCBpdCdzIHByb3RlY3RlZCBieQogCQkgKiBtdXRleC4KIAkJICovCi0JCWlmIChGRlNfU0VUVVBfU1RBVEUoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMRUQpIHsKKwkJaWYgKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSA9PQorCQkgICAgRkZTX1NFVFVQX0NBTkNFTExFRCkgewogCQkJcmV0ID0gLUVJRFJNOwogZG9uZV9zcGluOgogCQkJc3Bpbl91bmxvY2tfaXJxKCZmZnMtPmV2LndhaXRxLmxvY2spOwpAQCAtNDIxLDcgKzQ1NSw3IEBACiAJRU5URVIoKTsKIAogCS8qIEZhc3QgY2hlY2sgaWYgc2V0dXAgd2FzIGNhbmNlbGVkICovCi0JaWYgKEZGU19TRVRVUF9TVEFURShmZnMpID09IEZGU19TRVRVUF9DQU5DRUxFRCkKKwlpZiAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpID09IEZGU19TRVRVUF9DQU5DRUxMRUQpCiAJCXJldHVybiAtRUlEUk07CiAKIAkvKiBBY3F1aXJlIG11dGV4ICovCkBAIC00NDEsOCArNDc1LDggQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxKCZmZnMtPmV2LndhaXRxLmxvY2spOwogCi0Jc3dpdGNoIChGRlNfU0VUVVBfU1RBVEUoZmZzKSkgewotCWNhc2UgRkZTX1NFVFVQX0NBTkNFTEVEOgorCXN3aXRjaCAoZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZChmZnMpKSB7CisJY2FzZSBGRlNfU0VUVVBfQ0FOQ0VMTEVEOgogCQlyZXQgPSAtRUlEUk07CiAJCWJyZWFrOwogCkBAIC00ODksNyArNTIzLDggQEAKIAkJc3Bpbl9sb2NrX2lycSgmZmZzLT5ldi53YWl0cS5sb2NrKTsKIAogCQkvKiBTZWUgZmZzX2VwMF93cml0ZSgpICovCi0JCWlmIChGRlNfU0VUVVBfU1RBVEUoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMRUQpIHsKKwkJaWYgKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSA9PQorCQkgICAgRkZTX1NFVFVQX0NBTkNFTExFRCkgewogCQkJcmV0ID0gLUVJRFJNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU1OCw2ICs1OTMsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGZmc19lcDBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZmZzX2RhdGEgKmZmcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFBPTExXUk5PUk07CisJaW50IHJldDsKKworCXBvbGxfd2FpdChmaWxlLCAmZmZzLT5ldi53YWl0cSwgd2FpdCk7CisKKwlyZXQgPSBmZnNfbXV0ZXhfbG9jaygmZmZzLT5tdXRleCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJcmV0dXJuIG1hc2s7CisKKwlzd2l0Y2ggKGZmcy0+c3RhdGUpIHsKKwljYXNlIEZGU19SRUFEX0RFU0NSSVBUT1JTOgorCWNhc2UgRkZTX1JFQURfU1RSSU5HUzoKKwkJbWFzayB8PSBQT0xMT1VUOworCQlicmVhazsKKworCWNhc2UgRkZTX0FDVElWRToKKwkJc3dpdGNoIChmZnMtPnNldHVwX3N0YXRlKSB7CisJCWNhc2UgRkZTX05PX1NFVFVQOgorCQkJaWYgKGZmcy0+ZXYuY291bnQpCisJCQkJbWFzayB8PSBQT0xMSU47CisJCQlicmVhazsKKworCQljYXNlIEZGU19TRVRVUF9QRU5ESU5HOgorCQljYXNlIEZGU19TRVRVUF9DQU5DRUxMRUQ6CisJCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMT1VUKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBGRlNfQ0xPU0lORzoKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmZnMtPm11dGV4KTsKKworCXJldHVybiBtYXNrOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmZnNfZXAwX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlayA9CW5vX2xsc2VlaywKIApAQCAtNTY2LDYgKzY0MCw3IEBACiAJLnJlYWQgPQkJZmZzX2VwMF9yZWFkLAogCS5yZWxlYXNlID0JZmZzX2VwMF9yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bCA9CWZmc19lcDBfaW9jdGwsCisJLnBvbGwgPQkJZmZzX2VwMF9wb2xsLAogfTsKIAogCkBAIC01ODEsOCArNjU2LDUyIEBACiAJfQogfQogCi1zdGF0aWMgc3NpemVfdCBmZnNfZXBmaWxlX2lvKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBpbnQgcmVhZCkKK3N0YXRpYyB2b2lkIGZmc191c2VyX2NvcHlfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgKmlvX2RhdGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZmc19pb19kYXRhLAorCQkJCQkJICAgd29yayk7CisJaW50IHJldCA9IGlvX2RhdGEtPnJlcS0+c3RhdHVzID8gaW9fZGF0YS0+cmVxLT5zdGF0dXMgOgorCQkJCQkgaW9fZGF0YS0+cmVxLT5hY3R1YWw7CisKKwlpZiAoaW9fZGF0YS0+cmVhZCAmJiByZXQgPiAwKSB7CisJCWludCBpOworCQlzaXplX3QgcG9zID0gMDsKKwkJdXNlX21tKGlvX2RhdGEtPm1tKTsKKwkJZm9yIChpID0gMDsgaSA8IGlvX2RhdGEtPm5yX3NlZ3M7IGkrKykgeworCQkJaWYgKHVubGlrZWx5KGNvcHlfdG9fdXNlcihpb19kYXRhLT5pb3ZlY1tpXS5pb3ZfYmFzZSwKKwkJCQkJCSAmaW9fZGF0YS0+YnVmW3Bvc10sCisJCQkJCQkgaW9fZGF0YS0+aW92ZWNbaV0uaW92X2xlbikpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBvcyArPSBpb19kYXRhLT5pb3ZlY1tpXS5pb3ZfbGVuOworCQl9CisJCXVudXNlX21tKGlvX2RhdGEtPm1tKTsKKwl9CisKKwlhaW9fY29tcGxldGUoaW9fZGF0YS0+a2lvY2IsIHJldCwgcmV0KTsKKworCXVzYl9lcF9mcmVlX3JlcXVlc3QoaW9fZGF0YS0+ZXAsIGlvX2RhdGEtPnJlcSk7CisKKwlpb19kYXRhLT5raW9jYi0+cHJpdmF0ZSA9IE5VTEw7CisJaWYgKGlvX2RhdGEtPnJlYWQpCisJCWtmcmVlKGlvX2RhdGEtPmlvdmVjKTsKKwlrZnJlZShpb19kYXRhLT5idWYpOworCWtmcmVlKGlvX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBmZnNfZXBmaWxlX2FzeW5jX2lvX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKl9lcCwKKwkJCQkJIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBmZnNfaW9fZGF0YSAqaW9fZGF0YSA9IHJlcS0+Y29udGV4dDsKKworCUVOVEVSKCk7CisKKwlJTklUX1dPUksoJmlvX2RhdGEtPndvcmssIGZmc191c2VyX2NvcHlfd29ya2VyKTsKKwlzY2hlZHVsZV93b3JrKCZpb19kYXRhLT53b3JrKTsKK30KKworc3RhdGljIHNzaXplX3QgZmZzX2VwZmlsZV9pbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZmc19pb19kYXRhICppb19kYXRhKQogewogCXN0cnVjdCBmZnNfZXBmaWxlICplcGZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGZmc19lcCAqZXA7CkBAIC02MTIsNyArNzMxLDcgQEAKIAl9CiAKIAkvKiBEbyB3ZSBoYWx0PyAqLwotCWhhbHQgPSAhcmVhZCA9PSAhZXBmaWxlLT5pbjsKKwloYWx0ID0gKCFpb19kYXRhLT5yZWFkID09ICFlcGZpbGUtPmluKTsKIAlpZiAoaGFsdCAmJiBlcGZpbGUtPmlzb2MpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcjsKQEAgLTYzMCwxNSArNzQ5LDMyIEBACiAJCSAqIENvbnRyb2xsZXIgbWF5IHJlcXVpcmUgYnVmZmVyIHNpemUgdG8gYmUgYWxpZ25lZCB0bwogCQkgKiBtYXhwYWNrZXRzaXplIG9mIGFuIG91dCBlbmRwb2ludC4KIAkJICovCi0JCWRhdGFfbGVuID0gcmVhZCA/IHVzYl9lcF9hbGlnbl9tYXliZShnYWRnZXQsIGVwLT5lcCwgbGVuKSA6IGxlbjsKKwkJZGF0YV9sZW4gPSBpb19kYXRhLT5yZWFkID8KKwkJCSAgIHVzYl9lcF9hbGlnbl9tYXliZShnYWRnZXQsIGVwLT5lcCwgaW9fZGF0YS0+bGVuKSA6CisJCQkgICBpb19kYXRhLT5sZW47CiAKIAkJZGF0YSA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAodW5saWtlbHkoIWRhdGEpKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKCFyZWFkICYmIHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKGRhdGEsIGJ1ZiwgbGVuKSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVycm9yOworCQlpZiAoaW9fZGF0YS0+YWlvICYmICFpb19kYXRhLT5yZWFkKSB7CisJCQlpbnQgaTsKKwkJCXNpemVfdCBwb3MgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGlvX2RhdGEtPm5yX3NlZ3M7IGkrKykgeworCQkJCWlmICh1bmxpa2VseShjb3B5X2Zyb21fdXNlcigmZGF0YVtwb3NdLAorCQkJCQkgICAgIGlvX2RhdGEtPmlvdmVjW2ldLmlvdl9iYXNlLAorCQkJCQkgICAgIGlvX2RhdGEtPmlvdmVjW2ldLmlvdl9sZW4pKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCQlwb3MgKz0gaW9fZGF0YS0+aW92ZWNbaV0uaW92X2xlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghaW9fZGF0YS0+cmVhZCAmJgorCQkJICAgIHVubGlrZWx5KF9fY29weV9mcm9tX3VzZXIoZGF0YSwgaW9fZGF0YS0+YnVmLAorCQkJCQkJICAgICAgaW9fZGF0YS0+bGVuKSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTY2MSw0MCArNzk3LDc4IEBACiAJCXJldCA9IC1FQkFETVNHOwogCX0gZWxzZSB7CiAJCS8qIEZpcmUgdGhlIHJlcXVlc3QgKi8KLQkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7CisJCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOwogCi0JCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gZXAtPnJlcTsKLQkJcmVxLT5jb250ZXh0ICA9ICZkb25lOwotCQlyZXEtPmNvbXBsZXRlID0gZmZzX2VwZmlsZV9pb19jb21wbGV0ZTsKLQkJcmVxLT5idWYgICAgICA9IGRhdGE7Ci0JCXJlcS0+bGVuZ3RoICAgPSBkYXRhX2xlbjsKKwkJaWYgKGlvX2RhdGEtPmFpbykgeworCQkJcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAtPmVwLCBHRlBfS0VSTkVMKTsKKwkJCWlmICh1bmxpa2VseSghcmVxKSkKKwkJCQlnb3RvIGVycm9yX2xvY2s7CiAKLQkJcmV0ID0gdXNiX2VwX3F1ZXVlKGVwLT5lcCwgcmVxLCBHRlBfQVRPTUlDKTsKKwkJCXJlcS0+YnVmICAgICAgPSBkYXRhOworCQkJcmVxLT5sZW5ndGggICA9IGlvX2RhdGEtPmxlbjsKIAotCQlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CisJCQlpb19kYXRhLT5idWYgPSBkYXRhOworCQkJaW9fZGF0YS0+ZXAgPSBlcC0+ZXA7CisJCQlpb19kYXRhLT5yZXEgPSByZXE7CiAKLQkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7Ci0JCQkvKiBub3AgKi8KLQkJfSBlbHNlIGlmICh1bmxpa2VseSh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmRvbmUpKSkgewotCQkJcmV0ID0gLUVJTlRSOwotCQkJdXNiX2VwX2RlcXVldWUoZXAtPmVwLCByZXEpOworCQkJcmVxLT5jb250ZXh0ICA9IGlvX2RhdGE7CisJCQlyZXEtPmNvbXBsZXRlID0gZmZzX2VwZmlsZV9hc3luY19pb19jb21wbGV0ZTsKKworCQkJcmV0ID0gdXNiX2VwX3F1ZXVlKGVwLT5lcCwgcmVxLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcC0+ZXAsIHJlcSk7CisJCQkJZ290byBlcnJvcl9sb2NrOworCQkJfQorCQkJcmV0ID0gLUVJT0NCUVVFVUVEOworCisJCQlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CiAJCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogWFhYIFdlIG1heSBlbmQgdXAgc2lsZW50bHkgZHJvcGluZyBkYXRhIGhlcmUuCi0JCQkgKiBTaW5jZSBkYXRhX2xlbiAoaS5lLiByZXEtPmxlbmd0aCkgbWF5IGJlIGJpZ2dlcgotCQkJICogdGhhbiBsZW4gKGFmdGVyIGJlaW5nIHJvdW5kZWQgdXAgdG8gbWF4cGFja2V0c2l6ZSksCi0JCQkgKiB3ZSBtYXkgZW5kIHVwIHdpdGggbW9yZSBkYXRhIHRoZW4gdXNlciBzcGFjZSBoYXMKLQkJCSAqIHNwYWNlIGZvci4KLQkJCSAqLwotCQkJcmV0ID0gZXAtPnN0YXR1czsKLQkJCWlmIChyZWFkICYmIHJldCA+IDAgJiYKLQkJCSAgICB1bmxpa2VseShjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLAotCQkJCQkJICBtaW5fdChzaXplX3QsIHJldCwgbGVuKSkpKQotCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhkb25lKTsKKworCQkJcmVxID0gZXAtPnJlcTsKKwkJCXJlcS0+YnVmICAgICAgPSBkYXRhOworCQkJcmVxLT5sZW5ndGggICA9IGlvX2RhdGEtPmxlbjsKKworCQkJcmVxLT5jb250ZXh0ICA9ICZkb25lOworCQkJcmVxLT5jb21wbGV0ZSA9IGZmc19lcGZpbGVfaW9fY29tcGxldGU7CisKKwkJCXJldCA9IHVzYl9lcF9xdWV1ZShlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisKKwkJCXNwaW5fdW5sb2NrX2lycSgmZXBmaWxlLT5mZnMtPmVwc19sb2NrKTsKKworCQkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCQkJLyogbm9wICovCisJCQl9IGVsc2UgaWYgKHVubGlrZWx5KAorCQkJCSAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmZG9uZSkpKSB7CisJCQkJcmV0ID0gLUVJTlRSOworCQkJCXVzYl9lcF9kZXF1ZXVlKGVwLT5lcCwgcmVxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBYWFggV2UgbWF5IGVuZCB1cCBzaWxlbnRseSBkcm9waW5nIGRhdGEKKwkJCQkgKiBoZXJlLiAgU2luY2UgZGF0YV9sZW4gKGkuZS4gcmVxLT5sZW5ndGgpIG1heQorCQkJCSAqIGJlIGJpZ2dlciB0aGFuIGxlbiAoYWZ0ZXIgYmVpbmcgcm91bmRlZCB1cAorCQkJCSAqIHRvIG1heHBhY2tldHNpemUpLCB3ZSBtYXkgZW5kIHVwIHdpdGggbW9yZQorCQkJCSAqIGRhdGEgdGhlbiB1c2VyIHNwYWNlIGhhcyBzcGFjZSBmb3IuCisJCQkJICovCisJCQkJcmV0ID0gZXAtPnN0YXR1czsKKwkJCQlpZiAoaW9fZGF0YS0+cmVhZCAmJiByZXQgPiAwKSB7CisJCQkJCXJldCA9IG1pbl90KHNpemVfdCwgcmV0LCBpb19kYXRhLT5sZW4pOworCisJCQkJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIoaW9fZGF0YS0+YnVmLAorCQkJCQkJZGF0YSwgcmV0KSkpCisJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJCWtmcmVlKGRhdGEpOwogCQl9CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZlcGZpbGUtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworCitlcnJvcl9sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmZXBmaWxlLT5mZnMtPmVwc19sb2NrKTsKKwltdXRleF91bmxvY2soJmVwZmlsZS0+bXV0ZXgpOwogZXJyb3I6CiAJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIHJldDsKQEAgLTcwNCwxNyArODc4LDMxIEBACiBmZnNfZXBmaWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAogCQkgbG9mZl90ICpwdHIpCiB7CisJc3RydWN0IGZmc19pb19kYXRhIGlvX2RhdGE7CisKIAlFTlRFUigpOwogCi0JcmV0dXJuIGZmc19lcGZpbGVfaW8oZmlsZSwgKGNoYXIgX191c2VyICopYnVmLCBsZW4sIDApOworCWlvX2RhdGEuYWlvID0gZmFsc2U7CisJaW9fZGF0YS5yZWFkID0gZmFsc2U7CisJaW9fZGF0YS5idWYgPSAoY2hhciAqIF9fdXNlcilidWY7CisJaW9fZGF0YS5sZW4gPSBsZW47CisKKwlyZXR1cm4gZmZzX2VwZmlsZV9pbyhmaWxlLCAmaW9fZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CiBmZnNfZXBmaWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHRyKQogeworCXN0cnVjdCBmZnNfaW9fZGF0YSBpb19kYXRhOworCiAJRU5URVIoKTsKIAotCXJldHVybiBmZnNfZXBmaWxlX2lvKGZpbGUsIGJ1ZiwgbGVuLCAxKTsKKwlpb19kYXRhLmFpbyA9IGZhbHNlOworCWlvX2RhdGEucmVhZCA9IHRydWU7CisJaW9fZGF0YS5idWYgPSBidWY7CisJaW9fZGF0YS5sZW4gPSBsZW47CisKKwlyZXR1cm4gZmZzX2VwZmlsZV9pbyhmaWxlLCAmaW9fZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTczMyw2ICs5MjEsODkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmZnNfYWlvX2NhbmNlbChzdHJ1Y3Qga2lvY2IgKmtpb2NiKQoreworCXN0cnVjdCBmZnNfaW9fZGF0YSAqaW9fZGF0YSA9IGtpb2NiLT5wcml2YXRlOworCXN0cnVjdCBmZnNfZXBmaWxlICplcGZpbGUgPSBraW9jYi0+a2lfZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCB2YWx1ZTsKKworCUVOVEVSKCk7CisKKwlzcGluX2xvY2tfaXJxKCZlcGZpbGUtPmZmcy0+ZXBzX2xvY2spOworCisJaWYgKGxpa2VseShpb19kYXRhICYmIGlvX2RhdGEtPmVwICYmIGlvX2RhdGEtPnJlcSkpCisJCXZhbHVlID0gdXNiX2VwX2RlcXVldWUoaW9fZGF0YS0+ZXAsIGlvX2RhdGEtPnJlcSk7CisJZWxzZQorCQl2YWx1ZSA9IC1FSU5WQUw7CisKKwlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZmc19lcGZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqa2lvY2IsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ZWMsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IGxvZmYpCit7CisJc3RydWN0IGZmc19pb19kYXRhICppb19kYXRhOworCisJRU5URVIoKTsKKworCWlvX2RhdGEgPSBrbWFsbG9jKHNpemVvZigqaW9fZGF0YSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaW9fZGF0YSkpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9fZGF0YS0+YWlvID0gdHJ1ZTsKKwlpb19kYXRhLT5yZWFkID0gZmFsc2U7CisJaW9fZGF0YS0+a2lvY2IgPSBraW9jYjsKKwlpb19kYXRhLT5pb3ZlYyA9IGlvdmVjOworCWlvX2RhdGEtPm5yX3NlZ3MgPSBucl9zZWdzOworCWlvX2RhdGEtPmxlbiA9IGtpb2NiLT5raV9uYnl0ZXM7CisJaW9fZGF0YS0+bW0gPSBjdXJyZW50LT5tbTsKKworCWtpb2NiLT5wcml2YXRlID0gaW9fZGF0YTsKKworCWtpb2NiX3NldF9jYW5jZWxfZm4oa2lvY2IsIGZmc19haW9fY2FuY2VsKTsKKworCXJldHVybiBmZnNfZXBmaWxlX2lvKGtpb2NiLT5raV9maWxwLCBpb19kYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgZmZzX2VwZmlsZV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmtpb2NiLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ZWMsCisJCQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgbG9mZikKK3sKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgKmlvX2RhdGE7CisJc3RydWN0IGlvdmVjICppb3ZlY19jb3B5OworCisJRU5URVIoKTsKKworCWlvdmVjX2NvcHkgPSBrbWFsbG9jX2FycmF5KG5yX3NlZ3MsIHNpemVvZigqaW92ZWNfY29weSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaW92ZWNfY29weSkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGlvdmVjX2NvcHksIGlvdmVjLCBzaXplb2Yoc3RydWN0IGlvdmVjKSpucl9zZWdzKTsKKworCWlvX2RhdGEgPSBrbWFsbG9jKHNpemVvZigqaW9fZGF0YSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaW9fZGF0YSkpIHsKKwkJa2ZyZWUoaW92ZWNfY29weSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlvX2RhdGEtPmFpbyA9IHRydWU7CisJaW9fZGF0YS0+cmVhZCA9IHRydWU7CisJaW9fZGF0YS0+a2lvY2IgPSBraW9jYjsKKwlpb19kYXRhLT5pb3ZlYyA9IGlvdmVjX2NvcHk7CisJaW9fZGF0YS0+bnJfc2VncyA9IG5yX3NlZ3M7CisJaW9fZGF0YS0+bGVuID0ga2lvY2ItPmtpX25ieXRlczsKKwlpb19kYXRhLT5tbSA9IGN1cnJlbnQtPm1tOworCisJa2lvY2ItPnByaXZhdGUgPSBpb19kYXRhOworCisJa2lvY2Jfc2V0X2NhbmNlbF9mbihraW9jYiwgZmZzX2Fpb19jYW5jZWwpOworCisJcmV0dXJuIGZmc19lcGZpbGVfaW8oa2lvY2ItPmtpX2ZpbHAsIGlvX2RhdGEpOworfQorCiBzdGF0aWMgaW50CiBmZnNfZXBmaWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC03ODksNiArMTA2MCw4IEBACiAJLm9wZW4gPQkJZmZzX2VwZmlsZV9vcGVuLAogCS53cml0ZSA9CWZmc19lcGZpbGVfd3JpdGUsCiAJLnJlYWQgPQkJZmZzX2VwZmlsZV9yZWFkLAorCS5haW9fd3JpdGUgPQlmZnNfZXBmaWxlX2Fpb193cml0ZSwKKwkuYWlvX3JlYWQgPQlmZnNfZXBmaWxlX2Fpb19yZWFkLAogCS5yZWxlYXNlID0JZmZzX2VwZmlsZV9yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bCA9CWZmc19lcGZpbGVfaW9jdGwsCiB9OwpAQCAtMTE3Miw3ICsxNDQ1LDcgQEAKIAlpZiAoZmZzLT5lcGZpbGVzKQogCQlmZnNfZXBmaWxlc19kZXN0cm95KGZmcy0+ZXBmaWxlcywgZmZzLT5lcHNfY291bnQpOwogCi0Ja2ZyZWUoZmZzLT5yYXdfZGVzY3MpOworCWtmcmVlKGZmcy0+cmF3X2Rlc2NzX2RhdGEpOwogCWtmcmVlKGZmcy0+cmF3X3N0cmluZ3MpOwogCWtmcmVlKGZmcy0+c3RyaW5ndGFicyk7CiB9CkBAIC0xMTg0LDE0ICsxNDU3LDE1IEBACiAJZmZzX2RhdGFfY2xlYXIoZmZzKTsKIAogCWZmcy0+ZXBmaWxlcyA9IE5VTEw7CisJZmZzLT5yYXdfZGVzY3NfZGF0YSA9IE5VTEw7CiAJZmZzLT5yYXdfZGVzY3MgPSBOVUxMOwogCWZmcy0+cmF3X3N0cmluZ3MgPSBOVUxMOwogCWZmcy0+c3RyaW5ndGFicyA9IE5VTEw7CiAKIAlmZnMtPnJhd19kZXNjc19sZW5ndGggPSAwOwotCWZmcy0+cmF3X2ZzX2Rlc2NzX2xlbmd0aCA9IDA7CiAJZmZzLT5mc19kZXNjc19jb3VudCA9IDA7CiAJZmZzLT5oc19kZXNjc19jb3VudCA9IDA7CisJZmZzLT5zc19kZXNjc19jb3VudCA9IDA7CiAKIAlmZnMtPnN0cmluZ3NfY291bnQgPSAwOwogCWZmcy0+aW50ZXJmYWNlc19jb3VudCA9IDA7CkBAIC0xMzM0LDcgKzE2MDgsMjQgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZnVuYy0+ZmZzLT5lcHNfbG9jaywgZmxhZ3MpOwogCWRvIHsKIAkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkczsKLQkJZHMgPSBlcC0+ZGVzY3NbZXAtPmRlc2NzWzFdID8gMSA6IDBdOworCQlpbnQgZGVzY19pZHg7CisKKwkJaWYgKGZmcy0+Z2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCQlkZXNjX2lkeCA9IDI7CisJCWVsc2UgaWYgKGZmcy0+Z2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCWRlc2NfaWR4ID0gMTsKKwkJZWxzZQorCQkJZGVzY19pZHggPSAwOworCisJCS8qIGZhbGwtYmFjayB0byBsb3dlciBzcGVlZCBpZiBkZXNjIG1pc3NpbmcgZm9yIGN1cnJlbnQgc3BlZWQgKi8KKwkJZG8geworCQkJZHMgPSBlcC0+ZGVzY3NbZGVzY19pZHhdOworCQl9IHdoaWxlICghZHMgJiYgLS1kZXNjX2lkeCA+PSAwKTsKKworCQlpZiAoIWRzKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAogCQllcC0+ZXAtPmRyaXZlcl9kYXRhID0gZXA7CiAJCWVwLT5lcC0+ZGVzYyA9IGRzOwpAQCAtMTQ2OSw2ICsxNzYwLDEyIEBACiAJfQogCQlicmVhazsKIAorCWNhc2UgVVNCX0RUX1NTX0VORFBPSU5UX0NPTVA6CisJCXByX3ZkZWJ1ZygiRVAgU1MgY29tcGFuaW9uIGRlc2NyaXB0b3JcbiIpOworCQlpZiAobGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvcikpCisJCQlnb3RvIGludl9sZW5ndGg7CisJCWJyZWFrOworCiAJY2FzZSBVU0JfRFRfT1RIRVJfU1BFRURfQ09ORklHOgogCWNhc2UgVVNCX0RUX0lOVEVSRkFDRV9QT1dFUjoKIAljYXNlIFVTQl9EVF9ERUJVRzoKQEAgLTE1NzksNjAgKzE4NzYsNzYgQEAKIHN0YXRpYyBpbnQgX19mZnNfZGF0YV9nb3RfZGVzY3Moc3RydWN0IGZmc19kYXRhICpmZnMsCiAJCQkJY2hhciAqY29uc3QgX2RhdGEsIHNpemVfdCBsZW4pCiB7Ci0JdW5zaWduZWQgZnNfY291bnQsIGhzX2NvdW50OwotCWludCBmc19sZW4sIHJldCA9IC1FSU5WQUw7Ci0JY2hhciAqZGF0YSA9IF9kYXRhOworCWNoYXIgKmRhdGEgPSBfZGF0YSwgKnJhd19kZXNjczsKKwl1bnNpZ25lZCBjb3VudHNbM10sIGZsYWdzOworCWludCByZXQgPSAtRUlOVkFMLCBpOwogCiAJRU5URVIoKTsKIAotCWlmICh1bmxpa2VseShnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSkgIT0gRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQyB8fAotCQkgICAgIGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgNCkgIT0gbGVuKSkKKwlpZiAoZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEgKyA0KSAhPSBsZW4pCiAJCWdvdG8gZXJyb3I7Ci0JZnNfY291bnQgPSBnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSArICA4KTsKLQloc19jb3VudCA9IGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgMTIpOwogCi0JaWYgKCFmc19jb3VudCAmJiAhaHNfY291bnQpCi0JCWdvdG8gZWludmFsOwotCi0JZGF0YSArPSAxNjsKLQlsZW4gIC09IDE2OwotCi0JaWYgKGxpa2VseShmc19jb3VudCkpIHsKLQkJZnNfbGVuID0gZmZzX2RvX2Rlc2NzKGZzX2NvdW50LCBkYXRhLCBsZW4sCi0JCQkJICAgICAgX19mZnNfZGF0YV9kb19lbnRpdHksIGZmcyk7Ci0JCWlmICh1bmxpa2VseShmc19sZW4gPCAwKSkgewotCQkJcmV0ID0gZnNfbGVuOworCXN3aXRjaCAoZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEpKSB7CisJY2FzZSBGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDOgorCQlmbGFncyA9IEZVTkNUSU9ORlNfSEFTX0ZTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19IU19ERVNDOworCQlkYXRhICs9IDg7CisJCWxlbiAgLT0gODsKKwkJYnJlYWs7CisJY2FzZSBGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDX1YyOgorCQlmbGFncyA9IGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgOCk7CisJCWlmIChmbGFncyAmIH4oRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8CisJCQkgICAgICBGVU5DVElPTkZTX0hBU19IU19ERVNDIHwKKwkJCSAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MpKSB7CisJCQlyZXQgPSAtRU5PU1lTOwogCQkJZ290byBlcnJvcjsKIAkJfQotCi0JCWRhdGEgKz0gZnNfbGVuOwotCQlsZW4gIC09IGZzX2xlbjsKLQl9IGVsc2UgewotCQlmc19sZW4gPSAwOworCQlkYXRhICs9IDEyOworCQlsZW4gIC09IDEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChsaWtlbHkoaHNfY291bnQpKSB7Ci0JCXJldCA9IGZmc19kb19kZXNjcyhoc19jb3VudCwgZGF0YSwgbGVuLAotCQkJCSAgIF9fZmZzX2RhdGFfZG9fZW50aXR5LCBmZnMpOwotCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJLyogUmVhZCBmc19jb3VudCwgaHNfY291bnQgYW5kIHNzX2NvdW50IChpZiBwcmVzZW50KSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKwkJaWYgKCEoZmxhZ3MgJiAoMSA8PCBpKSkpIHsKKwkJCWNvdW50c1tpXSA9IDA7CisJCX0gZWxzZSBpZiAobGVuIDwgNCkgewogCQkJZ290byBlcnJvcjsKLQl9IGVsc2UgewotCQlyZXQgPSAwOworCQl9IGVsc2UgeworCQkJY291bnRzW2ldID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEpOworCQkJZGF0YSArPSA0OworCQkJbGVuICAtPSA0OworCQl9CiAJfQogCi0JaWYgKHVubGlrZWx5KGxlbiAhPSByZXQpKQotCQlnb3RvIGVpbnZhbDsKKwkvKiBSZWFkIGRlc2NyaXB0b3JzICovCisJcmF3X2Rlc2NzID0gZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCWlmICghY291bnRzW2ldKQorCQkJY29udGludWU7CisJCXJldCA9IGZmc19kb19kZXNjcyhjb3VudHNbaV0sIGRhdGEsIGxlbiwKKwkJCQkgICBfX2Zmc19kYXRhX2RvX2VudGl0eSwgZmZzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICs9IHJldDsKKwkJbGVuICAtPSByZXQ7CisJfQogCi0JZmZzLT5yYXdfZnNfZGVzY3NfbGVuZ3RoID0gZnNfbGVuOwotCWZmcy0+cmF3X2Rlc2NzX2xlbmd0aCAgICA9IGZzX2xlbiArIHJldDsKLQlmZnMtPnJhd19kZXNjcyAgICAgICAgICAgPSBfZGF0YTsKLQlmZnMtPmZzX2Rlc2NzX2NvdW50ICAgICAgPSBmc19jb3VudDsKLQlmZnMtPmhzX2Rlc2NzX2NvdW50ICAgICAgPSBoc19jb3VudDsKKwlpZiAocmF3X2Rlc2NzID09IGRhdGEgfHwgbGVuKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmZzLT5yYXdfZGVzY3NfZGF0YQk9IF9kYXRhOworCWZmcy0+cmF3X2Rlc2NzCQk9IHJhd19kZXNjczsKKwlmZnMtPnJhd19kZXNjc19sZW5ndGgJPSBkYXRhIC0gcmF3X2Rlc2NzOworCWZmcy0+ZnNfZGVzY3NfY291bnQJPSBjb3VudHNbMF07CisJZmZzLT5oc19kZXNjc19jb3VudAk9IGNvdW50c1sxXTsKKwlmZnMtPnNzX2Rlc2NzX2NvdW50CT0gY291bnRzWzJdOwogCiAJcmV0dXJuIDA7CiAKLWVpbnZhbDoKLQlyZXQgPSAtRUlOVkFMOwogZXJyb3I6CiAJa2ZyZWUoX2RhdGEpOwogCXJldHVybiByZXQ7CkBAIC0xNzg5LDcgKzIxMDIsNyBAQAogCSAqIHRoZSBzb3VyY2UgZG9lcyBub3RoaW5nLgogCSAqLwogCWlmIChmZnMtPnNldHVwX3N0YXRlID09IEZGU19TRVRVUF9QRU5ESU5HKQotCQlmZnMtPnNldHVwX3N0YXRlID0gRkZTX1NFVFVQX0NBTkNFTEVEOworCQlmZnMtPnNldHVwX3N0YXRlID0gRkZTX1NFVFVQX0NBTkNFTExFRDsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgRlVOQ1RJT05GU19SRVNVTUU6CkBAIC0xODUwLDIxICsyMTYzLDI4IEBACiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkcyA9ICh2b2lkICopZGVzYzsKIAlzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jID0gcHJpdjsKIAlzdHJ1Y3QgZmZzX2VwICpmZnNfZXA7Ci0KLQkvKgotCSAqIElmIGhzX2Rlc2NyaXB0b3JzIGlzIG5vdCBOVUxMIHRoZW4gd2UgYXJlIHJlYWRpbmcgaHMKLQkgKiBkZXNjcmlwdG9ycyBub3cKLQkgKi8KLQljb25zdCBpbnQgaXNIUyA9IGZ1bmMtPmZ1bmN0aW9uLmhzX2Rlc2NyaXB0b3JzICE9IE5VTEw7Ci0JdW5zaWduZWQgaWR4OworCXVuc2lnbmVkIGVwX2Rlc2NfaWQsIGlkeDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3BlZWRfbmFtZXNbXSA9IHsgImZ1bGwiLCAiaGlnaCIsICJzdXBlciIgfTsKIAogCWlmICh0eXBlICE9IEZGU19ERVNDUklQVE9SKQogCQlyZXR1cm4gMDsKIAotCWlmIChpc0hTKQorCS8qCisJICogSWYgc3NfZGVzY3JpcHRvcnMgaXMgbm90IE5VTEwsIHdlIGFyZSByZWFkaW5nIHN1cGVyIHNwZWVkCisJICogZGVzY3JpcHRvcnM7IGlmIGhzX2Rlc2NyaXB0b3JzIGlzIG5vdCBOVUxMLCB3ZSBhcmUgcmVhZGluZyBoaWdoCisJICogc3BlZWQgZGVzY3JpcHRvcnM7IG90aGVyd2lzZSwgd2UgYXJlIHJlYWRpbmcgZnVsbCBzcGVlZAorCSAqIGRlc2NyaXB0b3JzLgorCSAqLworCWlmIChmdW5jLT5mdW5jdGlvbi5zc19kZXNjcmlwdG9ycykgeworCQllcF9kZXNjX2lkID0gMjsKKwkJZnVuYy0+ZnVuY3Rpb24uc3NfZGVzY3JpcHRvcnNbKGxvbmcpdmFsdWVwXSA9IGRlc2M7CisJfSBlbHNlIGlmIChmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycykgeworCQllcF9kZXNjX2lkID0gMTsKIAkJZnVuYy0+ZnVuY3Rpb24uaHNfZGVzY3JpcHRvcnNbKGxvbmcpdmFsdWVwXSA9IGRlc2M7Ci0JZWxzZQorCX0gZWxzZSB7CisJCWVwX2Rlc2NfaWQgPSAwOwogCQlmdW5jLT5mdW5jdGlvbi5mc19kZXNjcmlwdG9yc1sobG9uZyl2YWx1ZXBdICAgID0gZGVzYzsKKwl9CiAKIAlpZiAoIWRlc2MgfHwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkKIAkJcmV0dXJuIDA7CkBAIC0xODcyLDEzICsyMTkyLDEzIEBACiAJaWR4ID0gKGRzLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKSAtIDE7CiAJZmZzX2VwID0gZnVuYy0+ZXBzICsgaWR4OwogCi0JaWYgKHVubGlrZWx5KGZmc19lcC0+ZGVzY3NbaXNIU10pKSB7Ci0JCXByX3ZkZWJ1ZygidHdvICVzc3BlZWQgZGVzY3JpcHRvcnMgZm9yIEVQICVkXG4iLAotCQkJICBpc0hTID8gImhpZ2giIDogImZ1bGwiLAorCWlmICh1bmxpa2VseShmZnNfZXAtPmRlc2NzW2VwX2Rlc2NfaWRdKSkgeworCQlwcl9lcnIoInR3byAlc3NwZWVkIGRlc2NyaXB0b3JzIGZvciBFUCAlZFxuIiwKKwkJCSAgc3BlZWRfbmFtZXNbZXBfZGVzY19pZF0sCiAJCQkgIGRzLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWZmc19lcC0+ZGVzY3NbaXNIU10gPSBkczsKKwlmZnNfZXAtPmRlc2NzW2VwX2Rlc2NfaWRdID0gZHM7CiAKIAlmZnNfZHVtcF9tZW0oIjogT3JpZ2luYWwgIGVwIGRlc2MiLCBkcywgZHMtPmJMZW5ndGgpOwogCWlmIChmZnNfZXAtPmVwKSB7CkBAIC0yMDIyLDggKzIzNDIsMTAgQEAKIAljb25zdCBpbnQgZnVsbCA9ICEhZnVuYy0+ZmZzLT5mc19kZXNjc19jb3VudDsKIAljb25zdCBpbnQgaGlnaCA9IGdhZGdldF9pc19kdWFsc3BlZWQoZnVuYy0+Z2FkZ2V0KSAmJgogCQlmdW5jLT5mZnMtPmhzX2Rlc2NzX2NvdW50OworCWNvbnN0IGludCBzdXBlciA9IGdhZGdldF9pc19zdXBlcnNwZWVkKGZ1bmMtPmdhZGdldCkgJiYKKwkJZnVuYy0+ZmZzLT5zc19kZXNjc19jb3VudDsKIAotCWludCByZXQ7CisJaW50IGZzX2xlbiwgaHNfbGVuLCByZXQ7CiAKIAkvKiBNYWtlIGl0IGEgc2luZ2xlIGNodW5rLCBsZXNzIG1hbmFnZW1lbnQgbGF0ZXIgb24gKi8KIAl2bGFfZ3JvdXAoZCk7CkBAIC0yMDMyLDE1ICsyMzU0LDE2IEBACiAJCWZ1bGwgPyBmZnMtPmZzX2Rlc2NzX2NvdW50ICsgMSA6IDApOwogCXZsYV9pdGVtX3dpdGhfc3ooZCwgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqLCBoc19kZXNjcywKIAkJaGlnaCA/IGZmcy0+aHNfZGVzY3NfY291bnQgKyAxIDogMCk7CisJdmxhX2l0ZW1fd2l0aF9zeihkLCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICosIHNzX2Rlc2NzLAorCQlzdXBlciA/IGZmcy0+c3NfZGVzY3NfY291bnQgKyAxIDogMCk7CiAJdmxhX2l0ZW1fd2l0aF9zeihkLCBzaG9ydCwgaW51bXMsIGZmcy0+aW50ZXJmYWNlc19jb3VudCk7Ci0JdmxhX2l0ZW1fd2l0aF9zeihkLCBjaGFyLCByYXdfZGVzY3MsCi0JCWhpZ2ggPyBmZnMtPnJhd19kZXNjc19sZW5ndGggOiBmZnMtPnJhd19mc19kZXNjc19sZW5ndGgpOworCXZsYV9pdGVtX3dpdGhfc3ooZCwgY2hhciwgcmF3X2Rlc2NzLCBmZnMtPnJhd19kZXNjc19sZW5ndGgpOwogCWNoYXIgKnZsYWJ1ZjsKIAogCUVOVEVSKCk7CiAKLQkvKiBPbmx5IGhpZ2ggc3BlZWQgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgZ2FkZ2V0PyAqLwotCWlmICh1bmxpa2VseSghKGZ1bGwgfCBoaWdoKSkpCisJLyogSGFzIGRlc2NyaXB0b3JzIG9ubHkgZm9yIHNwZWVkcyBnYWRnZXQgZG9lcyBub3Qgc3VwcG9ydCAqLworCWlmICh1bmxpa2VseSghKGZ1bGwgfCBoaWdoIHwgc3VwZXIpKSkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAogCS8qIEFsbG9jYXRlIGEgc2luZ2xlIGNodW5rLCBsZXNzIG1hbmFnZW1lbnQgbGF0ZXIgb24gKi8KQEAgLTIwNTAsOCArMjM3MywxMCBAQAogCiAJLyogWmVybyAqLwogCW1lbXNldCh2bGFfcHRyKHZsYWJ1ZiwgZCwgZXBzKSwgMCwgZF9lcHNfX3N6KTsKLQltZW1jcHkodmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksIGZmcy0+cmF3X2Rlc2NzICsgMTYsCi0JICAgICAgIGRfcmF3X2Rlc2NzX19zeik7CisJLyogQ29weSBkZXNjcmlwdG9ycyAgKi8KKwltZW1jcHkodmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksIGZmcy0+cmF3X2Rlc2NzLAorCSAgICAgICBmZnMtPnJhd19kZXNjc19sZW5ndGgpOworCiAJbWVtc2V0KHZsYV9wdHIodmxhYnVmLCBkLCBpbnVtcyksIDB4ZmYsIGRfaW51bXNfX3N6KTsKIAlmb3IgKHJldCA9IGZmcy0+ZXBzX2NvdW50OyByZXQ7IC0tcmV0KSB7CiAJCXN0cnVjdCBmZnNfZXAgKnB0cjsKQEAgLTIwNzMsMjIgKzIzOTgsMzggQEAKIAkgKi8KIAlpZiAobGlrZWx5KGZ1bGwpKSB7CiAJCWZ1bmMtPmZ1bmN0aW9uLmZzX2Rlc2NyaXB0b3JzID0gdmxhX3B0cih2bGFidWYsIGQsIGZzX2Rlc2NzKTsKLQkJcmV0ID0gZmZzX2RvX2Rlc2NzKGZmcy0+ZnNfZGVzY3NfY291bnQsCi0JCQkJICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksCi0JCQkJICAgZF9yYXdfZGVzY3NfX3N6LAotCQkJCSAgIF9fZmZzX2Z1bmNfYmluZF9kb19kZXNjcywgZnVuYyk7Ci0JCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJZnNfbGVuID0gZmZzX2RvX2Rlc2NzKGZmcy0+ZnNfZGVzY3NfY291bnQsCisJCQkJICAgICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksCisJCQkJICAgICAgZF9yYXdfZGVzY3NfX3N6LAorCQkJCSAgICAgIF9fZmZzX2Z1bmNfYmluZF9kb19kZXNjcywgZnVuYyk7CisJCWlmICh1bmxpa2VseShmc19sZW4gPCAwKSkgeworCQkJcmV0ID0gZnNfbGVuOwogCQkJZ290byBlcnJvcjsKKwkJfQogCX0gZWxzZSB7Ci0JCXJldCA9IDA7CisJCWZzX2xlbiA9IDA7CiAJfQogCiAJaWYgKGxpa2VseShoaWdoKSkgewogCQlmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycyA9IHZsYV9wdHIodmxhYnVmLCBkLCBoc19kZXNjcyk7Ci0JCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPmhzX2Rlc2NzX2NvdW50LAotCQkJCSAgIHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpICsgcmV0LAotCQkJCSAgIGRfcmF3X2Rlc2NzX19zeiAtIHJldCwKLQkJCQkgICBfX2Zmc19mdW5jX2JpbmRfZG9fZGVzY3MsIGZ1bmMpOworCQloc19sZW4gPSBmZnNfZG9fZGVzY3MoZmZzLT5oc19kZXNjc19jb3VudCwKKwkJCQkgICAgICB2bGFfcHRyKHZsYWJ1ZiwgZCwgcmF3X2Rlc2NzKSArIGZzX2xlbiwKKwkJCQkgICAgICBkX3Jhd19kZXNjc19fc3ogLSBmc19sZW4sCisJCQkJICAgICAgX19mZnNfZnVuY19iaW5kX2RvX2Rlc2NzLCBmdW5jKTsKKwkJaWYgKHVubGlrZWx5KGhzX2xlbiA8IDApKSB7CisJCQlyZXQgPSBoc19sZW47CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJaHNfbGVuID0gMDsKKwl9CisKKwlpZiAobGlrZWx5KHN1cGVyKSkgeworCQlmdW5jLT5mdW5jdGlvbi5zc19kZXNjcmlwdG9ycyA9IHZsYV9wdHIodmxhYnVmLCBkLCBzc19kZXNjcyk7CisJCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPnNzX2Rlc2NzX2NvdW50LAorCQkJCXZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpICsgZnNfbGVuICsgaHNfbGVuLAorCQkJCWRfcmF3X2Rlc2NzX19zeiAtIGZzX2xlbiAtIGhzX2xlbiwKKwkJCQlfX2Zmc19mdW5jX2JpbmRfZG9fZGVzY3MsIGZ1bmMpOwogCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCQlnb3RvIGVycm9yOwogCX0KQEAgLTIwOTksNyArMjQ0MCw4IEBACiAJICogbm93LgogCSAqLwogCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPmZzX2Rlc2NzX2NvdW50ICsKLQkJCSAgIChoaWdoID8gZmZzLT5oc19kZXNjc19jb3VudCA6IDApLAorCQkJICAgKGhpZ2ggPyBmZnMtPmhzX2Rlc2NzX2NvdW50IDogMCkgKworCQkJICAgKHN1cGVyID8gZmZzLT5zc19kZXNjc19jb3VudCA6IDApLAogCQkJICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcyksIGRfcmF3X2Rlc2NzX19zeiwKIAkJCSAgIF9fZmZzX2Z1bmNfYmluZF9kb19udW1zLCBmdW5jKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCkBAIC0yMjU4LDcgKzI2MDAsNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKGZmc19kZXZpY2VzKTsKIAotc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2ZpbmRfZGV2KGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZG9fZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZmZzX2RldiAqZGV2OwogCkBAIC0yMjc1LDcgKzI2MTcsNyBAQAogLyoKICAqIGZmc19sb2NrIG11c3QgYmUgdGFrZW4gYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqZmZzX2dldF9zaW5nbGVfZGV2KHZvaWQpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZ2V0X3NpbmdsZV9kZXYodm9pZCkKIHsKIAlzdHJ1Y3QgZmZzX2RldiAqZGV2OwogCkBAIC0yMjkxLDE1ICsyNjMzLDE1IEBACiAvKgogICogZmZzX2xvY2sgbXVzdCBiZSB0YWtlbiBieSB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KICAqLwotc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpmZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqX2Zmc19maW5kX2Rldihjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBmZnNfZGV2ICpkZXY7CiAKLQlkZXYgPSBmZnNfZ2V0X3NpbmdsZV9kZXYoKTsKKwlkZXYgPSBfZmZzX2dldF9zaW5nbGVfZGV2KCk7CiAJaWYgKGRldikKIAkJcmV0dXJuIGRldjsKIAotCXJldHVybiBfZmZzX2ZpbmRfZGV2KG5hbWUpOworCXJldHVybiBfZmZzX2RvX2ZpbmRfZGV2KG5hbWUpOwogfQogCiAvKiBDb25maWdmcyBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMzUsNyArMjY3Nyw3IEBACiAKIAlvcHRzID0gdG9fZl9mc19vcHRzKGYpOwogCWZmc19kZXZfbG9jaygpOwotCWZmc19mcmVlX2RldihvcHRzLT5kZXYpOworCV9mZnNfZnJlZV9kZXYob3B0cy0+ZGV2KTsKIAlmZnNfZGV2X3VubG9jaygpOwogCWtmcmVlKG9wdHMpOwogfQpAQCAtMjM5MCw3ICsyNzMyLDcgQEAKIAlvcHRzLT5mdW5jX2luc3Quc2V0X2luc3RfbmFtZSA9IGZmc19zZXRfaW5zdF9uYW1lOwogCW9wdHMtPmZ1bmNfaW5zdC5mcmVlX2Z1bmNfaW5zdCA9IGZmc19mcmVlX2luc3Q7CiAJZmZzX2Rldl9sb2NrKCk7Ci0JZGV2ID0gZmZzX2FsbG9jX2RldigpOworCWRldiA9IF9mZnNfYWxsb2NfZGV2KCk7CiAJZmZzX2Rldl91bmxvY2soKTsKIAlpZiAoSVNfRVJSKGRldikpIHsKIAkJa2ZyZWUob3B0cyk7CkBAIC0yNDQ2LDYgKzI3ODgsNyBAQAogCSAqLwogCWZ1bmMtPmZ1bmN0aW9uLmZzX2Rlc2NyaXB0b3JzID0gTlVMTDsKIAlmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycyA9IE5VTEw7CisJZnVuYy0+ZnVuY3Rpb24uc3NfZGVzY3JpcHRvcnMgPSBOVUxMOwogCWZ1bmMtPmludGVyZmFjZXNfbnVtcyA9IE5VTEw7CiAKIAlmZnNfZXZlbnRfYWRkKGZmcywgRlVOQ1RJT05GU19VTkJJTkQpOwpAQCAtMjQ3OCwxMiArMjgyMSwxMiBAQAogLyoKICAqIGZmc19sb2NrIG11c3QgYmUgdGFrZW4gYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCiAgKi8KLXN0cnVjdCBmZnNfZGV2ICpmZnNfYWxsb2NfZGV2KHZvaWQpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfYWxsb2NfZGV2KHZvaWQpCiB7CiAJc3RydWN0IGZmc19kZXYgKmRldjsKIAlpbnQgcmV0OwogCi0JaWYgKGZmc19nZXRfc2luZ2xlX2RldigpKQorCWlmIChfZmZzX2dldF9zaW5nbGVfZGV2KCkpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwpAQCAtMjUxMSwxMCArMjg1NCwxMCBAQAogewogCXN0cnVjdCBmZnNfZGV2ICpleGlzdGluZzsKIAotCWV4aXN0aW5nID0gX2Zmc19maW5kX2RldihuYW1lKTsKKwlleGlzdGluZyA9IF9mZnNfZG9fZmluZF9kZXYobmFtZSk7CiAJaWYgKGV4aXN0aW5nKQogCQlyZXR1cm4gLUVCVVNZOwotCQorCiAJZGV2LT5uYW1lID0gbmFtZTsKIAogCXJldHVybiAwOwpAQCAtMjU1NSw3ICsyODk4LDcgQEAKIC8qCiAgKiBmZnNfbG9jayBtdXN0IGJlIHRha2VuIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbgogICovCi12b2lkIGZmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX2Zmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KQogewogCWxpc3RfZGVsKCZkZXYtPmVudHJ5KTsKIAlpZiAoZGV2LT5uYW1lX2FsbG9jYXRlZCkKQEAgLTI1NzIsNyArMjkxNSw3IEBACiAJRU5URVIoKTsKIAlmZnNfZGV2X2xvY2soKTsKIAotCWZmc19kZXYgPSBmZnNfZmluZF9kZXYoZGV2X25hbWUpOworCWZmc19kZXYgPSBfZmZzX2ZpbmRfZGV2KGRldl9uYW1lKTsKIAlpZiAoIWZmc19kZXYpCiAJCWZmc19kZXYgPSBFUlJfUFRSKC1FTk9ERVYpOwogCWVsc2UgaWYgKGZmc19kZXYtPm1vdW50ZWQpCkBAIC0yNTk1LDExICsyOTM4LDEyIEBACiAJZmZzX2Rldl9sb2NrKCk7CiAKIAlmZnNfZGV2ID0gZmZzX2RhdGEtPnByaXZhdGVfZGF0YTsKLQlpZiAoZmZzX2RldikKKwlpZiAoZmZzX2RldikgewogCQlmZnNfZGV2LT5tb3VudGVkID0gZmFsc2U7Ci0JCi0JaWYgKGZmc19kZXYtPmZmc19yZWxlYXNlX2Rldl9jYWxsYmFjaykKLQkJZmZzX2Rldi0+ZmZzX3JlbGVhc2VfZGV2X2NhbGxiYWNrKGZmc19kZXYpOworCisJCWlmIChmZnNfZGV2LT5mZnNfcmVsZWFzZV9kZXZfY2FsbGJhY2spCisJCQlmZnNfZGV2LT5mZnNfcmVsZWFzZV9kZXZfY2FsbGJhY2soZmZzX2Rldik7CisJfQogCiAJZmZzX2Rldl91bmxvY2soKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX21pZGkuYwppbmRleCAzNmQ0YmIyLi44MDdiMzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9taWRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWlkaS5jCkBAIC02NjQsOSArNjY0LDEwIEBACiAJCS5kZXZfZnJlZSA9IGZfbWlkaV9zbmRfZnJlZSwKIAl9OwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKG1pZGktPmluZGV4LCBtaWRpLT5pZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJm1pZGktPmdhZGdldC0+ZGV2LCBtaWRpLT5pbmRleCwgbWlkaS0+aWQsCisJCQkgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCUVSUk9SKG1pZGksICJzbmRfY2FyZF9jcmVhdGUoKSBmYWlsZWRcbiIpOworCQlFUlJPUihtaWRpLCAic25kX2NhcmRfbmV3KCkgZmFpbGVkXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAltaWRpLT5jYXJkID0gY2FyZDsKQEAgLTcwMyw4ICs3MDQsNiBAQAogCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVCwgJmdtaWRpX2luX29wcyk7CiAJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZnbWlkaV9vdXRfb3BzKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJm1pZGktPmdhZGdldC0+ZGV2KTsKLQogCS8qIHJlZ2lzdGVyIGl0IC0gd2UncmUgcmVhZHkgdG8gZ28gKi8KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zdWJzZXQuYwppbmRleCBmMWE1OTE5Li5kZjRhMGRjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCX0KIAogCW5ldCA9IGdldGhlcl9jb25uZWN0KCZnZXRoLT5wb3J0KTsKLQlyZXR1cm4gSVNfRVJSKG5ldCkgPyBQVFJfRVJSKG5ldCkgOiAwOworCXJldHVybiBQVFJfUkVUKG5ldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldGhfZGlzYWJsZShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdWFjMi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdWFjMi5jCmluZGV4IDJmMjM1NjYuLmJjMjMwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3VhYzIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl91YWMyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCWludCBlcnI7CiAKIAkvKiBDaG9vc2UgYW55IHNsb3QsIHdpdGggbm8gaWQgKi8KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIE5VTEwsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwZGV2LT5kZXYsIC0xLCBOVUxMLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC00MjEsOCArNDIxLDYgQEAKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVUFDMl9HYWRnZXQiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiVUFDMl9HYWRnZXQgJWkiLCBwZGV2LT5pZCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwotCiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCiAJCXNuZF9kbWFfY29udGludW91c19kYXRhKEdGUF9LRVJORUwpLCAwLCBCVUZGX1NJWkVfTUFYKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dyX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dyX3VkYy5jCmluZGV4IDkxNGNiZDguLmY5ODRlZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ncl91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ3JfdWRjLmMKQEAgLTIyNSwxNCArMjI1LDggQEAKIAljb25zdCBjaGFyICpuYW1lID0gImdyX3VkY19zdGF0ZSI7CiAKIAlkZXYtPmRmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKGRldi0+ZGV2KSwgTlVMTCk7Ci0JaWYgKElTX0VSUihkZXYtPmRmc19yb290KSkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZGV2LT5kZnNfc3RhdGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA0NDQsIGRldi0+ZGZzX3Jvb3QsCi0JCQkJCSAgICAgZGV2LCAmZ3JfZGZzX2ZvcHMpOwotCWlmIChJU19FUlIoZGV2LT5kZnNfc3RhdGUpKQotCQlkZXZfZXJyKGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGUgJXNcbiIsIG5hbWUpOworCWRldi0+ZGZzX3N0YXRlID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNDQ0LCBkZXYtPmRmc19yb290LCBkZXYsCisJCQkJCSAgICAgJmdyX2Rmc19mb3BzKTsKIH0KIAogc3RhdGljIHZvaWQgZ3JfZGZzX2RlbGV0ZShzdHJ1Y3QgZ3JfdWRjICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IGI5NGMwNDkuLmI1YmU2ZjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtNDM5LDExICs0MzksOSBAQAogCS8qIEZJWE1FIHdyaXRlYmVoaW5kIGZvciBPX05PTkJMT0NLIGFuZCBwb2xsKCksIHFsZW4gPSAxICovCiAKIAl2YWx1ZSA9IC1FTk9NRU07Ci0Ja2J1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrYnVmKQotCQlnb3RvIGZyZWUxOwotCWlmIChjb3B5X2Zyb21fdXNlciAoa2J1ZiwgYnVmLCBsZW4pKSB7Ci0JCXZhbHVlID0gLUVGQVVMVDsKKwlrYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBsZW4pOworCWlmICgha2J1ZikgeworCQl2YWx1ZSA9IFBUUl9FUlIoa2J1Zik7CiAJCWdvdG8gZnJlZTE7CiAJfQogCkBAIC00NTIsNyArNDUwLDYgQEAKIAkJZGF0YS0+bmFtZSwgbGVuLCAoaW50KSB2YWx1ZSk7CiBmcmVlMToKIAltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwotCWtmcmVlIChrYnVmKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9scGMzMnh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xwYzMyeHhfdWRjLmMKaW5kZXggMDQ5ZWJhYi4uYTEzOTg5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xwYzMyeHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xwYzMyeHhfdWRjLmMKQEAgLTMyOTUsOSArMzI5NSw5IEBACiBwbGxfc2V0X2ZhaWw6CiAJY2xrX2Rpc2FibGUodWRjLT51c2JfcGxsX2Nsayk7CiBwbGxfZW5hYmxlX2ZhaWw6Ci0JY2xrX3B1dCh1ZGMtPnVzYl9zbHZfY2xrKTsKLXVzYl9vdGdfY2xrX2dldF9mYWlsOgogCWNsa19wdXQodWRjLT51c2Jfb3RnX2Nsayk7Cit1c2Jfb3RnX2Nsa19nZXRfZmFpbDoKKwljbGtfcHV0KHVkYy0+dXNiX3Nsdl9jbGspOwogdXNiX2Nsa19nZXRfZmFpbDoKIAljbGtfcHV0KHVkYy0+dXNiX3BsbF9jbGspOwogcGxsX2dldF9mYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKaW5kZXggNjliNzZlZi4uNjQ3NDA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCkBAIC00MjcsMTIgKzQyNywxNyBAQAogCQlyZXEtPmxlbmd0aCA9IFVTQl9CVUZTSVpFOwogCQlyZXEtPmNvbXBsZXRlID0gcnhfY29tcGxldGU7CiAKKwkJLyogaGVyZSwgd2UgdW5sb2NrLCBhbmQgb25seSB1bmxvY2ssIHRvIGF2b2lkIGRlYWRsb2NrLiAqLworCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKIAkJZXJyb3IgPSB1c2JfZXBfcXVldWUoZGV2LT5vdXRfZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgZXJyb3IpOwogCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CiAJCQlicmVhazsKLQkJfSBlbHNlIHsKKwkJfQorCQkvKiBpZiB0aGUgcmVxIGlzIGVtcHR5LCB0aGVuIGFkZCBpdCBpbnRvIGRldi0+cnhfcmVxc19hY3RpdmUuICovCisJCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnJlcS0+bGlzdCkpIHsKIAkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXNfYWN0aXZlKTsKIAkJfQogCX0KQEAgLTExMzMsNiArMTEzOCw3IEBACiAJCQkJICBOVUxMLCAiZ19wcmludGVyIik7CiAJaWYgKElTX0VSUihkZXYtPnBkZXYpKSB7CiAJCUVSUk9SKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlOiBnX3ByaW50ZXJcbiIpOworCQlzdGF0dXMgPSBQVFJfRVJSKGRldi0+cGRldik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYwppbmRleCAxMTcyZWFlLi4yYTljYjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc290Zy5jCkBAIC02MTcsNyArNjE3LDcgQEAKIAl0b193cml0ZSA9IERJVl9ST1VORF9VUCh0b193cml0ZSwgNCk7CiAJZGF0YSA9IGhzX3JlcS0+cmVxLmJ1ZiArIGJ1Zl9wb3M7CiAKLQl3cml0ZXNsKGhzb3RnLT5yZWdzICsgRVBGSUZPKGhzX2VwLT5pbmRleCksIGRhdGEsIHRvX3dyaXRlKTsKKwlpb3dyaXRlMzJfcmVwKGhzb3RnLT5yZWdzICsgRVBGSUZPKGhzX2VwLT5pbmRleCksIGRhdGEsIHRvX3dyaXRlKTsKIAogCXJldHVybiAodG9fd3JpdGUgPj0gY2FuX3dyaXRlKSA/IC1FTk9TUEMgOiAwOwogfQpAQCAtNzIwLDggKzcyMCw4IEBACiAJCXVyZXEtPmxlbmd0aCwgdXJlcS0+YWN0dWFsKTsKIAlpZiAoMCkKIAkJZGV2X2RiZyhoc290Zy0+ZGV2LAotCQkJIlJFUSBidWYgJXAgbGVuICVkIGRtYSAweCUwOHggbm9pPSVkIHpwPSVkIHNub2s9JWRcbiIsCi0JCQl1cmVxLT5idWYsIGxlbmd0aCwgdXJlcS0+ZG1hLAorCQkJIlJFUSBidWYgJXAgbGVuICVkIGRtYSAweCVwYWQgbm9pPSVkIHpwPSVkIHNub2s9JWRcbiIsCisJCQl1cmVxLT5idWYsIGxlbmd0aCwgJnVyZXEtPmRtYSwKIAkJCXVyZXEtPm5vX2ludGVycnVwdCwgdXJlcS0+emVybywgdXJlcS0+c2hvcnRfbm90X29rKTsKIAogCW1heHJlcSA9IGdldF9lcF9saW1pdChoc19lcCk7CkBAIC03ODksOCArNzg5LDggQEAKIAkJZG1hX3JlZyA9IGRpcl9pbiA/IERJRVBETUEoaW5kZXgpIDogRE9FUERNQShpbmRleCk7CiAJCXdyaXRlbCh1cmVxLT5kbWEsIGhzb3RnLT5yZWdzICsgZG1hX3JlZyk7CiAKLQkJZGV2X2RiZyhoc290Zy0+ZGV2LCAiJXM6IDB4JTA4eCA9PiAweCUwOHhcbiIsCi0JCQlfX2Z1bmNfXywgdXJlcS0+ZG1hLCBkbWFfcmVnKTsKKwkJZGV2X2RiZyhoc290Zy0+ZGV2LCAiJXM6IDB4JXBhZCA9PiAweCUwOHhcbiIsCisJCQlfX2Z1bmNfXywgJnVyZXEtPmRtYSwgZG1hX3JlZyk7CiAJfQogCiAJY3RybCB8PSBEeEVQQ1RMX0VQRW5hOwkvKiBlbnN1cmUgZXAgZW5hYmxlZCAqLwpAQCAtMTE4Niw2ICsxMTg2LDQxIEBACiBzdGF0aWMgdm9pZCBzM2NfaHNvdGdfZGlzY29ubmVjdChzdHJ1Y3QgczNjX2hzb3RnICpoc290Zyk7CiAKIC8qKgorICogczNjX2hzb3RnX3N0YWxsX2VwMCAtIHN0YWxsIGVwMAorICogQGhzb3RnOiBUaGUgZGV2aWNlIHN0YXRlCisgKgorICogU2V0IHN0YWxsIGZvciBlcDAgYXMgcmVzcG9uc2UgZm9yIHNldHVwIHJlcXVlc3QuCisgKi8KK3N0YXRpYyB2b2lkIHMzY19oc290Z19zdGFsbF9lcDAoc3RydWN0IHMzY19oc290ZyAqaHNvdGcpIHsKKwlzdHJ1Y3QgczNjX2hzb3RnX2VwICplcDAgPSAmaHNvdGctPmVwc1swXTsKKwl1MzIgcmVnOworCXUzMiBjdHJsOworCisJZGV2X2RiZyhoc290Zy0+ZGV2LCAiZXAwIHN0YWxsIChkaXI9JWQpXG4iLCBlcDAtPmRpcl9pbik7CisJcmVnID0gKGVwMC0+ZGlyX2luKSA/IERJRVBDVEwwIDogRE9FUENUTDA7CisKKwkvKgorCSAqIER4RVBDVExfU3RhbGwgd2lsbCBiZSBjbGVhcmVkIGJ5IEVQIG9uY2UgaXQgaGFzCisJICogdGFrZW4gZWZmZWN0LCBzbyBubyBuZWVkIHRvIGNsZWFyIGxhdGVyLgorCSAqLworCisJY3RybCA9IHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKTsKKwljdHJsIHw9IER4RVBDVExfU3RhbGw7CisJY3RybCB8PSBEeEVQQ1RMX0NOQUs7CisJd3JpdGVsKGN0cmwsIGhzb3RnLT5yZWdzICsgcmVnKTsKKworCWRldl9kYmcoaHNvdGctPmRldiwKKwkJIndyaXR0ZW4gRHhFUENUTD0weCUwOHggdG8gJTA4eCAoRHhFUENUTD0weCUwOHgpXG4iLAorCQljdHJsLCByZWcsIHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKSk7CisKKwkgLyoKKwkgICogY29tcGxldGUgd29uJ3QgYmUgY2FsbGVkLCBzbyB3ZSBlbnF1ZXVlCisJICAqIHNldHVwIHJlcXVlc3QgaGVyZQorCSAgKi8KKwkgczNjX2hzb3RnX2VucXVldWVfc2V0dXAoaHNvdGcpOworfQorCisvKioKICAqIHMzY19oc290Z19wcm9jZXNzX2NvbnRyb2wgLSBwcm9jZXNzIGEgY29udHJvbCByZXF1ZXN0CiAgKiBAaHNvdGc6IFRoZSBkZXZpY2Ugc3RhdGUKICAqIEBjdHJsOiBUaGUgY29udHJvbCByZXF1ZXN0IHJlY2VpdmVkCkBAIC0xMjYyLDM4ICsxMjk3LDggQEAKIAkgKiBzbyByZXNwb25kIHdpdGggYSBTVEFMTCBmb3IgdGhlIHN0YXR1cyBzdGFnZSB0byBpbmRpY2F0ZSBmYWlsdXJlLgogCSAqLwogCi0JaWYgKHJldCA8IDApIHsKLQkJdTMyIHJlZzsKLQkJdTMyIGN0cmw7Ci0KLQkJZGV2X2RiZyhoc290Zy0+ZGV2LCAiZXAwIHN0YWxsIChkaXI9JWQpXG4iLCBlcDAtPmRpcl9pbik7Ci0JCXJlZyA9IChlcDAtPmRpcl9pbikgPyBESUVQQ1RMMCA6IERPRVBDVEwwOwotCi0JCS8qCi0JCSAqIER4RVBDVExfU3RhbGwgd2lsbCBiZSBjbGVhcmVkIGJ5IEVQIG9uY2UgaXQgaGFzCi0JCSAqIHRha2VuIGVmZmVjdCwgc28gbm8gbmVlZCB0byBjbGVhciBsYXRlci4KLQkJICovCi0KLQkJY3RybCA9IHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKTsKLQkJY3RybCB8PSBEeEVQQ1RMX1N0YWxsOwotCQljdHJsIHw9IER4RVBDVExfQ05BSzsKLQkJd3JpdGVsKGN0cmwsIGhzb3RnLT5yZWdzICsgcmVnKTsKLQotCQlkZXZfZGJnKGhzb3RnLT5kZXYsCi0JCQkid3JpdHRlbiBEeEVQQ1RMPTB4JTA4eCB0byAlMDh4IChEeEVQQ1RMPTB4JTA4eClcbiIsCi0JCQljdHJsLCByZWcsIHJlYWRsKGhzb3RnLT5yZWdzICsgcmVnKSk7Ci0KLQkJLyoKLQkJICogZG9uJ3QgYmVsaWV2ZSB3ZSBuZWVkIHRvIGFueXRoaW5nIG1vcmUgdG8gZ2V0IHRoZSBFUAotCQkgKiB0byByZXBseSB3aXRoIGEgU1RBTEwgcGFja2V0Ci0JCSAqLwotCi0JCSAvKgotCQkgICogY29tcGxldGUgd29uJ3QgYmUgY2FsbGVkLCBzbyB3ZSBlbnF1ZXVlCi0JCSAgKiBzZXR1cCByZXF1ZXN0IGhlcmUKLQkJICAqLwotCQkgczNjX2hzb3RnX2VucXVldWVfc2V0dXAoaHNvdGcpOwotCX0KKwlpZiAocmV0IDwgMCkKKwkJczNjX2hzb3RnX3N0YWxsX2VwMChoc290Zyk7CiB9CiAKIC8qKgpAQCAtMTQ4OCw3ICsxNDkzLDcgQEAKIAkgKiBub3RlLCB3ZSBtaWdodCBvdmVyLXdyaXRlIHRoZSBidWZmZXIgZW5kIGJ5IDMgYnl0ZXMgZGVwZW5kaW5nIG9uCiAJICogYWxpZ25tZW50IG9mIHRoZSBkYXRhLgogCSAqLwotCXJlYWRzbChmaWZvLCBoc19yZXEtPnJlcS5idWYgKyByZWFkX3B0ciwgdG9fcmVhZCk7CisJaW9yZWFkMzJfcmVwKGZpZm8sIGhzX3JlcS0+cmVxLmJ1ZiArIHJlYWRfcHRyLCB0b19yZWFkKTsKIH0KIAogLyoqCkBAIC0yODMyLDYgKzI4MzcsMTUgQEAKIAogCWRldl9pbmZvKGhzLT5kZXYsICIlcyhlcCAlcCAlcywgJWQpXG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5uYW1lLCB2YWx1ZSk7CiAKKwlpZiAoaW5kZXggPT0gMCkgeworCQlpZiAodmFsdWUpCisJCQlzM2NfaHNvdGdfc3RhbGxfZXAwKGhzKTsKKwkJZWxzZQorCQkJZGV2X3dhcm4oaHMtPmRldiwKKwkJCQkgIiVzOiBjYW4ndCBjbGVhciBoYWx0IG9uIGVwMFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiB3cml0ZSBib3RoIElOIGFuZCBPVVQgY29udHJvbCByZWdpc3RlcnMgKi8KIAogCWVwcmVnID0gRElFUENUTChpbmRleCk7CkBAIC0zNzYwLDEwICszNzc0LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAxCi0jZGVmaW5lIHMzY19oc290Z19zdXNwZW5kIE5VTEwKLSNkZWZpbmUgczNjX2hzb3RnX3Jlc3VtZSBOVUxMCi0jZW5kaWYKK3N0YXRpYyBpbnQgczNjX2hzb3RnX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzM2NfaHNvdGcgKmhzb3RnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChoc290Zy0+ZHJpdmVyKQorCQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAic3VzcGVuZGluZyB1c2IgZ2FkZ2V0ICVzXG4iLAorCQkJIGhzb3RnLT5kcml2ZXItPmRyaXZlci5uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoc290Zy0+bG9jaywgZmxhZ3MpOworCXMzY19oc290Z19kaXNjb25uZWN0KGhzb3RnKTsKKwlzM2NfaHNvdGdfcGh5X2Rpc2FibGUoaHNvdGcpOworCWhzb3RnLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc290Zy0+bG9jaywgZmxhZ3MpOworCisJaWYgKGhzb3RnLT5kcml2ZXIpIHsKKwkJaW50IGVwOworCQlmb3IgKGVwID0gMDsgZXAgPCBoc290Zy0+bnVtX29mX2VwczsgZXArKykKKwkJCXMzY19oc290Z19lcF9kaXNhYmxlKCZoc290Zy0+ZXBzW2VwXS5lcCk7CisKKwkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGhzb3RnLT5zdXBwbGllcyksCisJCQkJCSAgICAgaHNvdGctPnN1cHBsaWVzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHMzY19oc290Z19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgczNjX2hzb3RnICpoc290ZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaHNvdGctPmRyaXZlcikgeworCQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAicmVzdW1pbmcgdXNiIGdhZGdldCAlc1xuIiwKKwkJCSBoc290Zy0+ZHJpdmVyLT5kcml2ZXIubmFtZSk7CisJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGhzb3RnLT5zdXBwbGllcyksCisJCQkJICAgICAgaHNvdGctPnN1cHBsaWVzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKKwloc290Zy0+bGFzdF9yc3QgPSBqaWZmaWVzOworCXMzY19oc290Z19waHlfZW5hYmxlKGhzb3RnKTsKKwlzM2NfaHNvdGdfY29yZV9pbml0KGhzb3RnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc290Zy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KIAogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgczNjX2hzb3RnX29mX2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jCmluZGV4IGVhNGJiZmUuLjEwYzZhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMKQEAgLTEzNDQsNyArMTM0NCw2IEBACiAKIAlyZXR1cm4gMDsKIGVycl9hZGRfdWRjOgotZXJyX2FkZF9kZXZpY2U6CiAJY2xrX2Rpc2FibGUoaHN1ZGMtPnVjbGspOwogZXJyX3JlczoKIAlpZiAoIUlTX0VSUl9PUl9OVUxMKGhzdWRjLT50cmFuc2NlaXZlcikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdGNtX3VzYl9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC90Y21fdXNiX2dhZGdldC5jCmluZGV4IDBmOGFhZDcuLjQ2MGMyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC90Y21fdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC90Y21fdXNiX2dhZGdldC5jCkBAIC0xNjEzLDcgKzE2MTMsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJdHBvcnQtPnRwb3J0X3d3cG4gPSB3d3BuOwotCXNucHJpbnRmKHRwb3J0LT50cG9ydF9uYW1lLCBzaXplb2YodHBvcnQtPnRwb3J0X25hbWUpLCB3bm5fbmFtZSk7CisJc25wcmludGYodHBvcnQtPnRwb3J0X25hbWUsIHNpemVvZih0cG9ydC0+dHBvcnRfbmFtZSksICIlcyIsIHdubl9uYW1lKTsKIAlyZXR1cm4gJnRwb3J0LT50cG9ydF93d247CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCmluZGV4IGI3ZDRmODIuLjUwZDA5YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwpAQCAtNDgsNiArNDgsOCBAQAogCiAjZGVmaW5lIFVFVEhfX1ZFUlNJT04JIjI5LU1heS0yMDA4IgogCisjZGVmaW5lIEdFVEhFUl9OQVBJX1dFSUdIVAkzMgorCiBzdHJ1Y3QgZXRoX2RldiB7CiAJLyogbG9jayBpcyBoZWxkIHdoaWxlIGFjY2Vzc2luZyBwb3J0X3VzYgogCSAqLwpAQCAtNzIsNiArNzQsNyBAQAogCQkJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJcnhfbmFwaTsKIAogCXVuc2lnbmVkIGxvbmcJCXRvZG87CiAjZGVmaW5lCVdPUktfUlhfTUVNT1JZCQkwCkBAIC0yNTMsMTggKzI1NiwxNiBAQAogCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgcmV0dmFsKTsKIAkJaWYgKHNrYikKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIHJ4X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiID0gcmVxLT5jb250ZXh0LCAqc2tiMjsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiID0gcmVxLT5jb250ZXh0OwogCXN0cnVjdCBldGhfZGV2CSpkZXYgPSBlcC0+ZHJpdmVyX2RhdGE7CiAJaW50CQlzdGF0dXMgPSByZXEtPnN0YXR1czsKKwlib29sCQlyeF9xdWV1ZSA9IDA7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCkBAIC0yODgsMzAgKzI4OSw4IEBACiAJCX0gZWxzZSB7CiAJCQlza2JfcXVldWVfdGFpbCgmZGV2LT5yeF9mcmFtZXMsIHNrYik7CiAJCX0KLQkJc2tiID0gTlVMTDsKLQotCQlza2IyID0gc2tiX2RlcXVldWUoJmRldi0+cnhfZnJhbWVzKTsKLQkJd2hpbGUgKHNrYjIpIHsKLQkJCWlmIChzdGF0dXMgPCAwCi0JCQkJCXx8IEVUSF9ITEVOID4gc2tiMi0+bGVuCi0JCQkJCXx8IHNrYjItPmxlbiA+IFZMQU5fRVRIX0ZSQU1FX0xFTikgewotCQkJCWRldi0+bmV0LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQlkZXYtPm5ldC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJCURCRyhkZXYsICJyeCBsZW5ndGggJWRcbiIsIHNrYjItPmxlbik7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiMik7Ci0JCQkJZ290byBuZXh0X2ZyYW1lOwotCQkJfQotCQkJc2tiMi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IyLCBkZXYtPm5ldCk7Ci0JCQlkZXYtPm5ldC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYjItPmxlbjsKLQotCQkJLyogbm8gYnVmZmVyIGNvcGllcyBuZWVkZWQsIHVubGVzcyBoYXJkd2FyZSBjYW4ndAotCQkJICogdXNlIHNrYiBidWZmZXJzLgotCQkJICovCi0JCQlzdGF0dXMgPSBuZXRpZl9yeChza2IyKTsKLW5leHRfZnJhbWU6Ci0JCQlza2IyID0gc2tiX2RlcXVldWUoJmRldi0+cnhfZnJhbWVzKTsKLQkJfQorCQlpZiAoIXN0YXR1cykKKwkJCXJ4X3F1ZXVlID0gMTsKIAkJYnJlYWs7CiAKIAkvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCkBAIC0zMzQsMjIgKzMxMywyMCBAQAogCQkvKiBGQUxMVEhST1VHSCAqLwogCiAJZGVmYXVsdDoKKwkJcnhfcXVldWUgPSAxOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlkZXYtPm5ldC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCURCRyhkZXYsICJyeCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChza2IpCi0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldi0+bmV0KSkgewogY2xlYW46CiAJCXNwaW5fbG9jaygmZGV2LT5yZXFfbG9jayk7CiAJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwogCQlzcGluX3VubG9jaygmZGV2LT5yZXFfbG9jayk7Ci0JCXJlcSA9IE5VTEw7Ci0JfQotCWlmIChyZXEpCi0JCXJ4X3N1Ym1pdChkZXYsIHJlcSwgR0ZQX0FUT01JQyk7CisKKwlpZiAocnhfcXVldWUgJiYgbGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmZGV2LT5yeF9uYXBpKSkpCisJCV9fbmFwaV9zY2hlZHVsZSgmZGV2LT5yeF9uYXBpKTsKIH0KIAogc3RhdGljIGludCBwcmVhbGxvYyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgbikKQEAgLTQxNCwxNiArMzkxLDI0IEBACiB7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJcnhfY291bnRzID0gMDsKIAogCS8qIGZpbGwgdW51c2VkIHJ4cSBzbG90cyB3aXRoIHNvbWUgc2tiICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxcykpIHsKKworCQlpZiAoKytyeF9jb3VudHMgPiBxbGVuKGRldi0+Z2FkZ2V0LCBkZXYtPnFtdWx0KSkKKwkJCWJyZWFrOworCiAJCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnJ4X3JlcXMubmV4dCwKIAkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJ4X3N1Ym1pdChkZXYsIHJlcSwgZ2ZwX2ZsYWdzKSA8IDApIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIAkJCWRlZmVyX2tldmVudChkZXYsIFdPUktfUlhfTUVNT1JZKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDMzLDYgKzQxOCw0MSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBnZXRoZXJfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IGV0aF9kZXYgICpkZXYgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGV0aF9kZXYsIHJ4X25hcGkpOworCXN0cnVjdCBza19idWZmCSpza2I7CisJdW5zaWduZWQgaW50CXdvcmtfZG9uZSA9IDA7CisJaW50CQlzdGF0dXMgPSAwOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmZGV2LT5yeF9mcmFtZXMpKSkgeworCQlpZiAoc3RhdHVzIDwgMAorCQkJCXx8IEVUSF9ITEVOID4gc2tiLT5sZW4KKwkJCQl8fCBza2ItPmxlbiA+IFZMQU5fRVRIX0ZSQU1FX0xFTikgeworCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCURCRyhkZXYsICJyeCBsZW5ndGggJWRcbiIsIHNrYi0+bGVuKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQljb250aW51ZTsKKwkJfQorCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYtPm5ldCk7CisJCWRldi0+bmV0LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+bmV0LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCQlzdGF0dXMgPSBuZXRpZl9yeF9uaShza2IpOworCX0KKworCWlmIChuZXRpZl9ydW5uaW5nKGRldi0+bmV0KSkgeworCQlyeF9maWxsKGRldiwgR0ZQX0tFUk5FTCk7CisJCXdvcmtfZG9uZSsrOworCX0KKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpCisJCW5hcGlfY29tcGxldGUoJmRldi0+cnhfbmFwaSk7CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCiBzdGF0aWMgdm9pZCBldGhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGV0aF9kZXYJKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXRoX2Rldiwgd29yayk7CkBAIC02MjUsNiArNjQ1LDcgQEAKIAkvKiBhbmQgb3BlbiB0aGUgdHggZmxvb2RnYXRlcyAqLwogCWF0b21pY19zZXQoJmRldi0+dHhfcWxlbiwgMCk7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldCk7CisJbmFwaV9lbmFibGUoJmRldi0+cnhfbmFwaSk7CiB9CiAKIHN0YXRpYyBpbnQgZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKQEAgLTY1MSw2ICs2NzIsNyBAQAogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKIAlWREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJbmFwaV9kaXNhYmxlKCZkZXYtPnJ4X25hcGkpOwogCW5ldGlmX3N0b3BfcXVldWUobmV0KTsKIAogCURCRyhkZXYsICJzdG9wIHN0YXRzOiByeC90eCAlbGQvJWxkLCBlcnJzICVsZC8lbGRcbiIsCkBAIC03NjgsNiArNzkwLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCW5ldGlmX25hcGlfYWRkKG5ldCwgJmRldi0+cnhfbmFwaSwgZ2V0aGVyX3BvbGwsIEdFVEhFUl9OQVBJX1dFSUdIVCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+cmVxX2xvY2spOwogCUlOSVRfV09SSygmZGV2LT53b3JrLCBldGhfd29yayk7CkBAIC04MzAsNiArODUzLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCW5ldGlmX25hcGlfYWRkKG5ldCwgJmRldi0+cnhfbmFwaSwgZ2V0aGVyX3BvbGwsIEdFVEhFUl9OQVBJX1dFSUdIVCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+cmVxX2xvY2spOwogCUlOSVRfV09SSygmZGV2LT53b3JrLCBldGhfd29yayk7CkBAIC0xMTEzLDYgKzExMzcsNyBAQAogewogCXN0cnVjdCBldGhfZGV2CQkqZGV2ID0gbGluay0+aW9wb3J0OwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOworCXN0cnVjdCBza19idWZmCQkqc2tiOwogCiAJV0FSTl9PTighZGV2KTsKIAlpZiAoIWRldikKQEAgLTExMzksNiArMTE2NCwxMiBAQAogCQlzcGluX2xvY2soJmRldi0+cmVxX2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmZGV2LT5yZXFfbG9jayk7CisKKwlzcGluX2xvY2soJmRldi0+cnhfZnJhbWVzLmxvY2spOworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmZGV2LT5yeF9mcmFtZXMpKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlzcGluX3VubG9jaygmZGV2LT5yeF9mcmFtZXMubG9jayk7CisKIAlsaW5rLT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCWxpbmstPmluX2VwLT5kZXNjID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZnMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2ZzLmgKaW5kZXggYmMyZDM3MS4uYmYwYmEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZnMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mcy5oCkBAIC02NSwxMCArNjUsOCBAQAogCW11dGV4X3VubG9jaygmZmZzX2xvY2spOwogfQogCi1zdHJ1Y3QgZmZzX2RldiAqZmZzX2FsbG9jX2Rldih2b2lkKTsKIGludCBmZnNfbmFtZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CiBpbnQgZmZzX3NpbmdsZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldik7Ci12b2lkIGZmc19mcmVlX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2KTsKIAogc3RydWN0IGZmc19lcGZpbGU7CiBzdHJ1Y3QgZmZzX2Z1bmN0aW9uOwpAQCAtMTI1LDcgKzEyMyw3IEBACiAJICogc2V0dXAuICBJZiB0aGlzIHN0YXRlIGlzIHNldCByZWFkL3dyaXRlIG9uIGVwMCByZXR1cm4KIAkgKiAtRUlEUk0uICBUaGlzIHN0YXRlIGlzIG9ubHkgc2V0IHdoZW4gYWRkaW5nIGV2ZW50LgogCSAqLwotCUZGU19TRVRVUF9DQU5DRUxFRAorCUZGU19TRVRVUF9DQU5DRUxMRUQKIH07CiAKIHN0cnVjdCBmZnNfZGF0YSB7CkBAIC0xNTYsNyArMTU0LDYgQEAKIAkgKi8KIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSplcDByZXE7CQkvKiBQOiBtdXRleCAqLwogCXN0cnVjdCBjb21wbGV0aW9uCQllcDByZXFfY29tcGxldGlvbjsJLyogUDogbXV0ZXggKi8KLQlpbnQJCQkJZXAwcmVxX3N0YXR1czsJCS8qIFA6IG11dGV4ICovCiAKIAkvKiByZWZlcmVuY2UgY291bnRlciAqLwogCWF0b21pY190CQkJcmVmOwpAQCAtMTY4LDE5ICsxNjUsMTggQEAKIAogCS8qCiAJICogUG9zc2libGUgdHJhbnNpdGlvbnM6Ci0JICogKyBGRlNfTk9fU0VUVVAgICAgICAgLT4gRkZTX1NFVFVQX1BFTkRJTkcgIC0tIFA6IGV2LndhaXRxLmxvY2sKKwkgKiArIEZGU19OT19TRVRVUCAgICAgICAgLT4gRkZTX1NFVFVQX1BFTkRJTkcgIC0tIFA6IGV2LndhaXRxLmxvY2sKIAkgKiAgICAgICAgICAgICAgIGhhcHBlbnMgb25seSBpbiBlcDAgcmVhZCB3aGljaCBpcyBQOiBtdXRleAotCSAqICsgRkZTX1NFVFVQX1BFTkRJTkcgIC0+IEZGU19OT19TRVRVUCAgICAgICAtLSBQOiBldi53YWl0cS5sb2NrCisJICogKyBGRlNfU0VUVVBfUEVORElORyAgIC0+IEZGU19OT19TRVRVUCAgICAgICAtLSBQOiBldi53YWl0cS5sb2NrCiAJICogICAgICAgICAgICAgICBoYXBwZW5zIG9ubHkgaW4gZXAwIGkvbyAgd2hpY2ggaXMgUDogbXV0ZXgKLQkgKiArIEZGU19TRVRVUF9QRU5ESU5HICAtPiBGRlNfU0VUVVBfQ0FOQ0VMRUQgLS0gUDogZXYud2FpdHEubG9jawotCSAqICsgRkZTX1NFVFVQX0NBTkNFTEVEIC0+IEZGU19OT19TRVRVUCAgICAgICAtLSBjbXB4Y2hnCisJICogKyBGRlNfU0VUVVBfUEVORElORyAgIC0+IEZGU19TRVRVUF9DQU5DRUxMRUQgLS0gUDogZXYud2FpdHEubG9jaworCSAqICsgRkZTX1NFVFVQX0NBTkNFTExFRCAtPiBGRlNfTk9fU0VUVVAgICAgICAgIC0tIGNtcHhjaGcKKwkgKgorCSAqIFRoaXMgZmllbGQgc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGFuZCBpbnN0ZWFkCisJICogZmZzX3NldHVwX3N0YXRlX2NsZWFyX2NhbmNlbGxlZCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4KIAkgKi8KIAllbnVtIGZmc19zZXR1cF9zdGF0ZQkJc2V0dXBfc3RhdGU7CiAKLSNkZWZpbmUgRkZTX1NFVFVQX1NUQVRFKGZmcykJCQkJCVwKLQkoKGVudW0gZmZzX3NldHVwX3N0YXRlKWNtcHhjaGcoJihmZnMpLT5zZXR1cF9zdGF0ZSwJXAotCQkJCSAgICAgICBGRlNfU0VUVVBfQ0FOQ0VMRUQsIEZGU19OT19TRVRVUCkpCi0KIAkvKiBFdmVudHMgJiBzdWNoLiAqLwogCXN0cnVjdCB7CiAJCXU4CQkJCXR5cGVzWzRdOwpAQCAtMjEwLDE2ICsyMDYsMTYgQEAKIAogCS8qIGZpbGxlZCBieSBfX2Zmc19kYXRhX2dvdF9kZXNjcygpICovCiAJLyoKLQkgKiBSZWFsIGRlc2NyaXB0b3JzIGFyZSAxNiBieXRlcyBhZnRlciByYXdfZGVzY3MgKHNvIHlvdSBuZWVkCi0JICogdG8gc2tpcCAxNiBieXRlcyAoaWUuIGZmcy0+cmF3X2Rlc2NzICsgMTYpIHRvIGdldCB0byB0aGUKLQkgKiBmaXJzdCBmdWxsIHNwZWVkIGRlc2NyaXB0b3IpLiAgcmF3X2Rlc2NzX2xlbmd0aCBhbmQKLQkgKiByYXdfZnNfZGVzY3NfbGVuZ3RoIGRvIG5vdCBoYXZlIHRob3NlIDE2IGJ5dGVzIGFkZGVkLgorCSAqIHJhd19kZXNjcyBpcyB3aGF0IHlvdSBrZnJlZSwgcmVhbF9kZXNjcyBwb2ludHMgaW5zaWRlIG9mIHJhd19kZXNjcywKKwkgKiB3aGVyZSBmdWxsIHNwZWVkLCBoaWdoIHNwZWVkIGFuZCBzdXBlciBzcGVlZCBkZXNjcmlwdG9ycyBzdGFydC4KKwkgKiByZWFsX2Rlc2NzX2xlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIGFsbCB0aG9zZSBkZXNjcmlwdG9ycy4KIAkgKi8KKwljb25zdCB2b2lkCQkJKnJhd19kZXNjc19kYXRhOwogCWNvbnN0IHZvaWQJCQkqcmF3X2Rlc2NzOwogCXVuc2lnbmVkCQkJcmF3X2Rlc2NzX2xlbmd0aDsKLQl1bnNpZ25lZAkJCXJhd19mc19kZXNjc19sZW5ndGg7CiAJdW5zaWduZWQJCQlmc19kZXNjc19jb3VudDsKIAl1bnNpZ25lZAkJCWhzX2Rlc2NzX2NvdW50OworCXVuc2lnbmVkCQkJc3NfZGVzY3NfY291bnQ7CiAKIAl1bnNpZ25lZCBzaG9ydAkJCXN0cmluZ3NfY291bnQ7CiAJdW5zaWduZWQgc2hvcnQJCQlpbnRlcmZhY2VzX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYwppbmRleCBiMzY5MjkyLi5hZDBhY2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYwpAQCAtNTQ5LDggKzU0OSw4IEBACiAJCXBvcnQtPnJlYWRfc3RhcnRlZC0tOwogCX0KIAotCS8qIFB1c2ggZnJvbSB0dHkgdG8gbGRpc2M7IHdpdGhvdXQgbG93X2xhdGVuY3kgc2V0IHRoaXMgaXMgaGFuZGxlZCBieQotCSAqIGEgd29ya3F1ZXVlLCBzbyB3ZSB3b24ndCBnZXQgY2FsbGJhY2tzIGFuZCBjYW4gaG9sZCBwb3J0X2xvY2sKKwkvKiBQdXNoIGZyb20gdHR5IHRvIGxkaXNjOyB0aGlzIGlzIGhhbmRsZWQgYnkgYSB3b3JrcXVldWUsCisJICogc28gd2Ugd29uJ3QgZ2V0IGNhbGxiYWNrcyBhbmQgY2FuIGhvbGQgcG9ydF9sb2NrCiAJICovCiAJaWYgKGRvX3B1c2gpCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKCZwb3J0LT5wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwppbmRleCBhOTcwN2RhLi5lMjJiODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC01ODQsNyArNTg0LDYgQEAKIGNvbmZpZyBVU0JfVTEzMl9IQ0QKIAl0cmlzdGF0ZSAiRWxhbiBVMTMyIEFkYXB0ZXIgSG9zdCBDb250cm9sbGVyIgogCWRlcGVuZHMgb24gVVNCX0ZURElfRUxBTgotCWRlZmF1bHQgTQogCWhlbHAKIAkgIFRoZSBVMTMyIGFkYXB0ZXIgaXMgYSBVU0IgdG8gQ2FyZEJ1cyBhZGFwdGVyIHNwZWNpZmljYWxseSBkZXNpZ25lZAogCSAgZm9yIFBDIGNhcmRzIHRoYXQgY29udGFpbiBhbiBPSENJIGhvc3QgY29udHJvbGxlci4gVHlwaWNhbCBQQyBjYXJkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYwppbmRleCAwMTUzNmNmLi5iM2EwZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwNyBTdGV2ZW4gQnJvd24gPHNicm93bkBjb3J0bGFuZC5jb20+CiAgKiBDb3B5cmlnaHQgMjAxMC0yMDEyIEhhdWtlIE1laHJ0ZW5zIDxoYXVrZUBoYXVrZS1tLmRlPgorICogQ29weXJpZ2h0IDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KICAqCiAgKiBEZXJpdmVkIGZyb20gdGhlIG9oY2ktc3NiIGRyaXZlcgogICogQ29weXJpZ2h0IDIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KQEAgLTE4LDYgKzE5LDcgQEAKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjUsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgpAQCAtMzMsNiArMzYsMTMgQEAKICNpbmNsdWRlICJlaGNpLmgiCiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkVIQ0kgZ2VuZXJpYyBwbGF0Zm9ybSBkcml2ZXIiCisjZGVmaW5lIEVIQ0lfTUFYX0NMS1MgMworI2RlZmluZSBoY2RfdG9fZWhjaV9wcml2KGgpICgoc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqKWhjZF90b19laGNpKGgpLT5wcml2KQorCitzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2IHsKKwlzdHJ1Y3QgY2xrICpjbGtzW0VIQ0lfTUFYX0NMS1NdOworCXN0cnVjdCBwaHkgKnBoeTsKK307CiAKIHN0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1lW10gPSAiZWhjaS1wbGF0Zm9ybSI7CiAKQEAgLTQ1LDggKzU1LDYgQEAKIAogCWhjZC0+aGFzX3R0ID0gcGRhdGEtPmhhc190dDsKIAllaGNpLT5oYXNfc3lub3BzeXNfaGNfYnVnID0gcGRhdGEtPmhhc19zeW5vcHN5c19oY19idWc7Ci0JZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gcGRhdGEtPmJpZ19lbmRpYW5fZGVzYzsKLQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSBwZGF0YS0+YmlnX2VuZGlhbl9tbWlvOwogCiAJaWYgKHBkYXRhLT5wcmVfc2V0dXApIHsKIAkJcmV0dmFsID0gcGRhdGEtPnByZV9zZXR1cChoY2QpOwpAQCAtNjQsMzggKzcyLDkxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZWhjaV9wbGF0Zm9ybV9wb3dlcl9vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGhjZF90b19laGNpX3ByaXYoaGNkKTsKKwlpbnQgY2xrLCByZXQ7CisKKwlmb3IgKGNsayA9IDA7IGNsayA8IEVIQ0lfTUFYX0NMS1MgJiYgcHJpdi0+Y2xrc1tjbGtdOyBjbGsrKykgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+Y2xrc1tjbGtdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKwl9CisKKwlpZiAocHJpdi0+cGh5KSB7CisJCXJldCA9IHBoeV9pbml0KHByaXYtPnBoeSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9kaXNhYmxlX2Nsa3M7CisKKwkJcmV0ID0gcGh5X3Bvd2VyX29uKHByaXYtPnBoeSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9leGl0X3BoeTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXRfcGh5OgorCXBoeV9leGl0KHByaXYtPnBoeSk7CitlcnJfZGlzYWJsZV9jbGtzOgorCXdoaWxlICgtLWNsayA+PSAwKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrc1tjbGtdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVoY2lfcGxhdGZvcm1fcG93ZXJfb2ZmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gaGNkX3RvX2VoY2lfcHJpdihoY2QpOworCWludCBjbGs7CisKKwlpZiAocHJpdi0+cGh5KSB7CisJCXBoeV9wb3dlcl9vZmYocHJpdi0+cGh5KTsKKwkJcGh5X2V4aXQocHJpdi0+cGh5KTsKKwl9CisKKwlmb3IgKGNsayA9IEVIQ0lfTUFYX0NMS1MgLSAxOyBjbGsgPj0gMDsgY2xrLS0pCisJCWlmIChwcml2LT5jbGtzW2Nsa10pCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrc1tjbGtdKTsKK30KKwogc3RhdGljIHN0cnVjdCBoY19kcml2ZXIgX19yZWFkX21vc3RseSBlaGNpX3BsYXRmb3JtX2hjX2RyaXZlcjsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlaGNpX2RyaXZlcl9vdmVycmlkZXMgcGxhdGZvcm1fb3ZlcnJpZGVzIF9faW5pdGNvbnN0ID0gewotCS5yZXNldCA9CWVoY2lfcGxhdGZvcm1fcmVzZXQsCisJLnJlc2V0ID0JCWVoY2lfcGxhdGZvcm1fcmVzZXQsCisJLmV4dHJhX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2KSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgZWhjaV9wbGF0Zm9ybV9kZWZhdWx0czsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgZWhjaV9wbGF0Zm9ybV9kZWZhdWx0cyA9IHsKKwkucG93ZXJfb24gPQkJZWhjaV9wbGF0Zm9ybV9wb3dlcl9vbiwKKwkucG93ZXJfc3VzcGVuZCA9CWVoY2lfcGxhdGZvcm1fcG93ZXJfb2ZmLAorCS5wb3dlcl9vZmYgPQkJZWhjaV9wbGF0Zm9ybV9wb3dlcl9vZmYsCit9OwogCiBzdGF0aWMgaW50IGVoY2lfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHJlc291cmNlICpyZXNfbWVtOwotCXN0cnVjdCB1c2JfZWhjaV9wZGF0YSAqcGRhdGE7Ci0JaW50IGlycTsKLQlpbnQgZXJyOworCXN0cnVjdCB1c2JfZWhjaV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZWhjaV9oY2QgKmVoY2k7CisJaW50IGVyciwgaXJxLCBjbGsgPSAwOwogCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCi0JICogdXNlIHJlYXNvbmFibGUgZGVmYXVsdHMgc28gcGxhdGZvcm1zIGRvbid0IGhhdmUgdG8gcHJvdmlkZSB0aGVzZS4KLQkgKiB3aXRoIERUIHByb2Jpbmcgb24gQVJNLCBub25lIG9mIHRoZXNlIGFyZSBzZXQuCisJICogVXNlIHJlYXNvbmFibGUgZGVmYXVsdHMgc28gcGxhdGZvcm1zIGRvbid0IGhhdmUgdG8gcHJvdmlkZSB0aGVzZQorCSAqIHdpdGggRFQgcHJvYmluZyBvbiBBUk0uCiAJICovCi0JaWYgKCFkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldikpCi0JCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0czsKKwlpZiAoIXBkYXRhKQorCQlwZGF0YSA9ICZlaGNpX3BsYXRmb3JtX2RlZmF1bHRzOwogCiAJZXJyID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmRldi0+ZGV2KTsKLQogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIGlycSBwcm92aWRlZCIpOwpAQCAtMTA3LDE3ICsxNjgsNzIgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV9wbGF0Zm9ybV9oY19kcml2ZXIsICZkZXYtPmRldiwKKwkJCSAgICAgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBoY2QpOworCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwlwcml2ID0gaGNkX3RvX2VoY2lfcHJpdihoY2QpOworCWVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCisJaWYgKHBkYXRhID09ICZlaGNpX3BsYXRmb3JtX2RlZmF1bHRzICYmIGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbi1yZWdzIikpCisJCQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSAxOworCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5kZXYub2Zfbm9kZSwgImJpZy1lbmRpYW4tZGVzYyIpKQorCQkJZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gMTsKKworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+ZGV2Lm9mX25vZGUsICJiaWctZW5kaWFuIikpCisJCQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSBlaGNpLT5iaWdfZW5kaWFuX2Rlc2MgPSAxOworCisJCXByaXYtPnBoeSA9IGRldm1fcGh5X2dldCgmZGV2LT5kZXYsICJ1c2IiKTsKKwkJaWYgKElTX0VSUihwcml2LT5waHkpKSB7CisJCQllcnIgPSBQVFJfRVJSKHByaXYtPnBoeSk7CisJCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIpCisJCQkJZ290byBlcnJfcHV0X2hjZDsKKwkJCXByaXYtPnBoeSA9IE5VTEw7CisJCX0KKworCQlmb3IgKGNsayA9IDA7IGNsayA8IEVIQ0lfTUFYX0NMS1M7IGNsaysrKSB7CisJCQlwcml2LT5jbGtzW2Nsa10gPSBvZl9jbGtfZ2V0KGRldi0+ZGV2Lm9mX25vZGUsIGNsayk7CisJCQlpZiAoSVNfRVJSKHByaXYtPmNsa3NbY2xrXSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHByaXYtPmNsa3NbY2xrXSk7CisJCQkJaWYgKGVyciA9PSAtRVBST0JFX0RFRkVSKQorCQkJCQlnb3RvIGVycl9wdXRfY2xrczsKKwkJCQlwcml2LT5jbGtzW2Nsa10gPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MpCisJCWVoY2ktPmJpZ19lbmRpYW5fZGVzYyA9IDE7CisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX21taW8pCisJCWVoY2ktPmJpZ19lbmRpYW5fbW1pbyA9IDE7CisKKyNpZm5kZWYgQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fTU1JTworCWlmIChlaGNpLT5iaWdfZW5kaWFuX21taW8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiRXJyb3I6IENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8gbm90IHNldFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9jbGtzOworCX0KKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfVVNCX0VIQ0lfQklHX0VORElBTl9ERVNDCisJaWYgKGVoY2ktPmJpZ19lbmRpYW5fZGVzYykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJFcnJvcjogQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fREVTQyBub3Qgc2V0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X2Nsa3M7CisJfQorI2VuZGlmCisKIAlpZiAocGRhdGEtPnBvd2VyX29uKSB7CiAJCWVyciA9IHBkYXRhLT5wb3dlcl9vbihkZXYpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJmVoY2lfcGxhdGZvcm1faGNfZHJpdmVyLCAmZGV2LT5kZXYsCi0JCQkgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOwotCWlmICghaGNkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3Bvd2VyOworCQkJZ290byBlcnJfcHV0X2Nsa3M7CiAJfQogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzX21lbS0+c3RhcnQ7CkBAIC0xMjYsMjIgKzI0MiwyOCBAQAogCWhjZC0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmZGV2LT5kZXYsIHJlc19tZW0pOwogCWlmIChJU19FUlIoaGNkLT5yZWdzKSkgewogCQllcnIgPSBQVFJfRVJSKGhjZC0+cmVncyk7Ci0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCX0KIAllcnIgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCiAJZGV2aWNlX3dha2V1cF9lbmFibGUoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKIAogCXJldHVybiBlcnI7CiAKLWVycl9wdXRfaGNkOgotCXVzYl9wdXRfaGNkKGhjZCk7CiBlcnJfcG93ZXI6CiAJaWYgKHBkYXRhLT5wb3dlcl9vZmYpCiAJCXBkYXRhLT5wb3dlcl9vZmYoZGV2KTsKK2Vycl9wdXRfY2xrczoKKwl3aGlsZSAoLS1jbGsgPj0gMCkKKwkJY2xrX3B1dChwcml2LT5jbGtzW2Nsa10pOworZXJyX3B1dF9oY2Q6CisJaWYgKHBkYXRhID09ICZlaGNpX3BsYXRmb3JtX2RlZmF1bHRzKQorCQlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKworCXVzYl9wdXRfaGNkKGhjZCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTUwLDEzICsyNzIsMTkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBlaGNpX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBoY2RfdG9fZWhjaV9wcml2KGhjZCk7CisJaW50IGNsazsKIAogCXVzYl9yZW1vdmVfaGNkKGhjZCk7Ci0JdXNiX3B1dF9oY2QoaGNkKTsKIAogCWlmIChwZGF0YS0+cG93ZXJfb2ZmKQogCQlwZGF0YS0+cG93ZXJfb2ZmKGRldik7CiAKKwlmb3IgKGNsayA9IDA7IGNsayA8IEVIQ0lfTUFYX0NMS1MgJiYgcHJpdi0+Y2xrc1tjbGtdOyBjbGsrKykKKwkJY2xrX3B1dChwcml2LT5jbGtzW2Nsa10pOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKwogCWlmIChwZGF0YSA9PSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0cykKIAkJZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IE5VTEw7CiAKQEAgLTIwNyw4ICszMzUsMTAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZ0ODUwMF9laGNpX2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAidmlhLHZ0ODUwMC1laGNpIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gIndtLHByaXptLWVoY2kiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZ2VuZXJpYy1laGNpIiwgfSwKIAl7fQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZ0ODUwMF9laGNpX2lkcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGVoY2lfcGxhdGZvcm1fdGFibGVbXSA9IHsKIAl7ICJlaGNpLXBsYXRmb3JtIiwgMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXRlZ3JhLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdGVncmEuYwppbmRleCBhZjI4Yjc0Li4yN2FjNmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdGVncmEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdGVncmEuYwpAQCAtMzgsMTAgKzM4LDYgQEAKIAogI2luY2x1ZGUgImVoY2kuaCIKIAotI2RlZmluZSBURUdSQV9VU0JfQkFTRQkJCTB4QzUwMDAwMDAKLSNkZWZpbmUgVEVHUkFfVVNCMl9CQVNFCQkJMHhDNTAwNDAwMAotI2RlZmluZSBURUdSQV9VU0IzX0JBU0UJCQkweEM1MDA4MDAwCi0KICNkZWZpbmUgUE9SVF9XQUtFX0JJVFMgKFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRSkKIAogI2RlZmluZSBURUdSQV9VU0JfRE1BX0FMSUdOIDMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2h3YS1oYy5jIGIvZHJpdmVycy91c2IvaG9zdC9od2EtaGMuYwppbmRleCBlMDc2Njk5Li5kMGQ4ZmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2h3YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaHdhLWhjLmMKQEAgLTI2MSw4ICsyNjEsNDQgQEAKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgbGlzdGVuIHRvIG5vdGlmaWNhdGlvbnM6ICVkXG4iLCByZXN1bHQpOwogCQlnb3RvIGVycm9yX3N0b3A7CiAJfQorCS8qCisJICogSWYgV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9ESVNBQkxFX1hGRVJfTk9USUZJQ0FUSU9OUyBpcyBzZXQsCisJICogIGRpc2FibGUgdHJhbnNmZXIgbm90aWZpY2F0aW9ucy4KKwkgKi8KKwlpZiAoaHdhaGMtPndhLnF1aXJrcyAmCisJCVdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMpIHsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqY3VyX2FsdHNldHRpbmcgPQorCQkJaHdhaGMtPndhLnVzYl9pZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGh3YWhjLT53YS51c2JfZGV2LAorCQkJCXVzYl9zbmRjdHJscGlwZShod2FoYy0+d2EudXNiX2RldiwgMCksCisJCQkJV0FfUkVRX0FMRVJFT05fRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMsCisJCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCQlVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCVdBX1JFUV9BTEVSRU9OX0ZFQVRVUkVfU0VULAorCQkJCWN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkJTlVMTCwgMCwKKwkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJCS8qCisJCSAqIElmIHdlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBjb250cm9sIG1lc3NhZ2UsIHN0YXJ0IERUSSBoZXJlCisJCSAqIGJlY2F1c2Ugbm8gdHJhbnNmZXIgbm90aWZpY2F0aW9ucyB3aWxsIGJlIHJlY2VpdmVkIHdoaWNoIGlzCisJCSAqIHdoZXJlIERUSSBpcyBub3JtYWxseSBzdGFydGVkLgorCQkgKi8KKwkJaWYgKHJlc3VsdCA9PSAwKQorCQkJcmVzdWx0ID0gd2FfZHRpX3N0YXJ0KCZod2FoYy0+d2EpOworCQllbHNlCisJCQlyZXN1bHQgPSAwOwkvKiBPSy4gIENvbnRpbnVlIG5vcm1hbGx5LiAqLworCisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzdGFydCBEVEk6ICVkXG4iLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9kdGlfc3RhcnQ7CisJCX0KKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogCitlcnJvcl9kdGlfc3RhcnQ6CisJd2FfbmVwX2Rpc2FybSgmaHdhaGMtPndhKTsKIGVycm9yX3N0b3A6CiAJX193YV9jbGVhcl9mZWF0dXJlKCZod2FoYy0+d2EsIFdBX0VOQUJMRSk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTgyNywxMCArODYzLDEyIEBACiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaHdhaGNfaWRfdGFibGVbXSA9IHsKIAkvKiBBbGVyZW9uIDUzMTAgKi8KIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MTNkYywgMHg1MzEwLCAweGUwLCAweDAyLCAweDAxKSwKLQkgIC5kcml2ZXJfaW5mbyA9IFdVU0JfUVVJUktfQUxFUkVPTl9IV0FfQ09OQ0FUX0lTT0MgfSwKKwkgIC5kcml2ZXJfaW5mbyA9IFdVU0JfUVVJUktfQUxFUkVPTl9IV0FfQ09OQ0FUX0lTT0MgfAorCQlXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TIH0sCiAJLyogQWxlcmVvbiA1NjExICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDEzZGMsIDB4NTYxMSwgMHhlMCwgMHgwMiwgMHgwMSksCi0JICAuZHJpdmVyX2luZm8gPSBXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DIH0sCisJICAuZHJpdmVyX2luZm8gPSBXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DIHwKKwkJV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9ESVNBQkxFX1hGRVJfTk9USUZJQ0FUSU9OUyB9LAogCS8qIEZJWE1FOiB1c2UgY2xhc3MgbGFiZWxzIGZvciB0aGlzICovCiAJeyBVU0JfSU5URVJGQUNFX0lORk8oMHhlMCwgMHgwMiwgMHgwMSksIH0sCiAJe30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGxhdGZvcm0uYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbGF0Zm9ybS5jCmluZGV4IDY4ZjY3NGMuLmI2MDAyYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbGF0Zm9ybS5jCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKiBDb3B5cmlnaHQgMjAxMS0yMDEyIEhhdWtlIE1laHJ0ZW5zIDxoYXVrZUBoYXVrZS1tLmRlPgorICogQ29weXJpZ2h0IDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KICAqCiAgKiBEZXJpdmVkIGZyb20gdGhlIE9DSEktU1NCIGRyaXZlcgogICogRGVyaXZlZCBmcm9tIHRoZSBPSENJLVBDSSBkcml2ZXIKQEAgLTE0LDExICsxNSwxNCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb2hjaV9wZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC0yNyw2ICszMSwxMyBAQAogI2luY2x1ZGUgIm9oY2kuaCIKIAogI2RlZmluZSBEUklWRVJfREVTQyAiT0hDSSBnZW5lcmljIHBsYXRmb3JtIGRyaXZlciIKKyNkZWZpbmUgT0hDSV9NQVhfQ0xLUyAzCisjZGVmaW5lIGhjZF90b19vaGNpX3ByaXYoaCkgKChzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2ICopaGNkX3RvX29oY2koaCktPnByaXYpCisKK3N0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgeworCXN0cnVjdCBjbGsgKmNsa3NbT0hDSV9NQVhfQ0xLU107CisJc3RydWN0IHBoeSAqcGh5OworfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJvaGNpLXBsYXRmb3JtIjsKIApAQCAtMzYsMTAgKzQ3LDYgQEAKIAlzdHJ1Y3QgdXNiX29oY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwogCi0JaWYgKHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MpCi0JCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfREVTQzsKLQlpZiAocGRhdGEtPmJpZ19lbmRpYW5fbW1pbykKLQkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPOwogCWlmIChwZGF0YS0+bm9fYmlnX2ZyYW1lX25vKQogCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0ZSQU1FX05POwogCWlmIChwZGF0YS0+bnVtX3BvcnRzKQpAQCAtNDgsMTEgKzU1LDY3IEBACiAJcmV0dXJuIG9oY2lfc2V0dXAoaGNkKTsKIH0KIAorc3RhdGljIGludCBvaGNpX3BsYXRmb3JtX3Bvd2VyX29uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gaGNkX3RvX29oY2lfcHJpdihoY2QpOworCWludCBjbGssIHJldDsKKworCWZvciAoY2xrID0gMDsgY2xrIDwgT0hDSV9NQVhfQ0xLUyAmJiBwcml2LT5jbGtzW2Nsa107IGNsaysrKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGtzW2Nsa10pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGlzYWJsZV9jbGtzOworCX0KKworCWlmIChwcml2LT5waHkpIHsKKwkJcmV0ID0gcGh5X2luaXQocHJpdi0+cGh5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKworCQlyZXQgPSBwaHlfcG93ZXJfb24ocHJpdi0+cGh5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2V4aXRfcGh5OworCX0KKworCXJldHVybiAwOworCitlcnJfZXhpdF9waHk6CisJcGh5X2V4aXQocHJpdi0+cGh5KTsKK2Vycl9kaXNhYmxlX2Nsa3M6CisJd2hpbGUgKC0tY2xrID49IDApCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGtzW2Nsa10pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2hjaV9wbGF0Zm9ybV9wb3dlcl9vZmYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBoY2RfdG9fb2hjaV9wcml2KGhjZCk7CisJaW50IGNsazsKKworCWlmIChwcml2LT5waHkpIHsKKwkJcGh5X3Bvd2VyX29mZihwcml2LT5waHkpOworCQlwaHlfZXhpdChwcml2LT5waHkpOworCX0KKworCWZvciAoY2xrID0gT0hDSV9NQVhfQ0xLUyAtIDE7IGNsayA+PSAwOyBjbGstLSkKKwkJaWYgKHByaXYtPmNsa3NbY2xrXSkKKwkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGtzW2Nsa10pOworfQorCiBzdGF0aWMgc3RydWN0IGhjX2RyaXZlciBfX3JlYWRfbW9zdGx5IG9oY2lfcGxhdGZvcm1faGNfZHJpdmVyOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9oY2lfZHJpdmVyX292ZXJyaWRlcyBwbGF0Zm9ybV9vdmVycmlkZXMgX19pbml0Y29uc3QgPSB7Ci0JLnByb2R1Y3RfZGVzYyA9CSJHZW5lcmljIFBsYXRmb3JtIE9IQ0kgY29udHJvbGxlciIsCi0JLnJlc2V0ID0Jb2hjaV9wbGF0Zm9ybV9yZXNldCwKKwkucHJvZHVjdF9kZXNjID0JCSJHZW5lcmljIFBsYXRmb3JtIE9IQ0kgY29udHJvbGxlciIsCisJLnJlc2V0ID0JCW9oY2lfcGxhdGZvcm1fcmVzZXQsCisJLmV4dHJhX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX29oY2lfcGRhdGEgb2hjaV9wbGF0Zm9ybV9kZWZhdWx0cyA9IHsKKwkucG93ZXJfb24gPQkJb2hjaV9wbGF0Zm9ybV9wb3dlcl9vbiwKKwkucG93ZXJfc3VzcGVuZCA9CW9oY2lfcGxhdGZvcm1fcG93ZXJfb2ZmLAorCS5wb3dlcl9vZmYgPQkJb2hjaV9wbGF0Zm9ybV9wb3dlcl9vZmYsCiB9OwogCiBzdGF0aWMgaW50IG9oY2lfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtNjAsMTcgKzEyMywyNCBAQAogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHJlc291cmNlICpyZXNfbWVtOwogCXN0cnVjdCB1c2Jfb2hjaV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7Ci0JaW50IGlycTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCWlmICghcGRhdGEpIHsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCXN0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgKnByaXY7CisJc3RydWN0IG9oY2lfaGNkICpvaGNpOworCWludCBlcnIsIGlycSwgY2xrID0gMDsKIAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKgorCSAqIFVzZSByZWFzb25hYmxlIGRlZmF1bHRzIHNvIHBsYXRmb3JtcyBkb24ndCBoYXZlIHRvIHByb3ZpZGUgdGhlc2UKKwkgKiB3aXRoIERUIHByb2Jpbmcgb24gQVJNLgorCSAqLworCWlmICghcGRhdGEpCisJCXBkYXRhID0gJm9oY2lfcGxhdGZvcm1fZGVmYXVsdHM7CisKKwllcnIgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KCZkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIGlycSBwcm92aWRlZCIpOwpAQCAtODMsMTcgKzE1Myw3MiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAorCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZvaGNpX3BsYXRmb3JtX2hjX2RyaXZlciwgJmRldi0+ZGV2LAorCQkJZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBoY2QpOworCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwlwcml2ID0gaGNkX3RvX29oY2lfcHJpdihoY2QpOworCW9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOworCisJaWYgKHBkYXRhID09ICZvaGNpX3BsYXRmb3JtX2RlZmF1bHRzICYmIGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbi1yZWdzIikpCisJCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0JFX01NSU87CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbi1kZXNjIikpCisJCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0JFX0RFU0M7CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbiIpKQorCQkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPIHwgT0hDSV9RVUlSS19CRV9ERVNDOworCisJCXByaXYtPnBoeSA9IGRldm1fcGh5X2dldCgmZGV2LT5kZXYsICJ1c2IiKTsKKwkJaWYgKElTX0VSUihwcml2LT5waHkpKSB7CisJCQllcnIgPSBQVFJfRVJSKHByaXYtPnBoeSk7CisJCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIpCisJCQkJZ290byBlcnJfcHV0X2hjZDsKKwkJCXByaXYtPnBoeSA9IE5VTEw7CisJCX0KKworCQlmb3IgKGNsayA9IDA7IGNsayA8IE9IQ0lfTUFYX0NMS1M7IGNsaysrKSB7CisJCQlwcml2LT5jbGtzW2Nsa10gPSBvZl9jbGtfZ2V0KGRldi0+ZGV2Lm9mX25vZGUsIGNsayk7CisJCQlpZiAoSVNfRVJSKHByaXYtPmNsa3NbY2xrXSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHByaXYtPmNsa3NbY2xrXSk7CisJCQkJaWYgKGVyciA9PSAtRVBST0JFX0RFRkVSKQorCQkJCQlnb3RvIGVycl9wdXRfY2xrczsKKwkJCQlwcml2LT5jbGtzW2Nsa10gPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MpCisJCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfREVTQzsKKwlpZiAocGRhdGEtPmJpZ19lbmRpYW5fbW1pbykKKwkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPOworCisjaWZuZGVmIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KKwlpZiAob2hjaS0+ZmxhZ3MgJiBPSENJX1FVSVJLX0JFX01NSU8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiRXJyb3I6IENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gbm90IHNldFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9jbGtzOworCX0KKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDCisJaWYgKG9oY2ktPmZsYWdzICYgT0hDSV9RVUlSS19CRV9ERVNDKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIkVycm9yOiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIG5vdCBzZXRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXRfY2xrczsKKwl9CisjZW5kaWYKKwogCWlmIChwZGF0YS0+cG93ZXJfb24pIHsKIAkJZXJyID0gcGRhdGEtPnBvd2VyX29uKGRldik7CiAJCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQloY2QgPSB1c2JfY3JlYXRlX2hjZCgmb2hjaV9wbGF0Zm9ybV9oY19kcml2ZXIsICZkZXYtPmRldiwKLQkJCWRldl9uYW1lKCZkZXYtPmRldikpOwotCWlmICghaGNkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3Bvd2VyOworCQkJZ290byBlcnJfcHV0X2Nsa3M7CiAJfQogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzX21lbS0+c3RhcnQ7CkBAIC0xMDIsMTEgKzIyNywxMSBAQAogCWhjZC0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmZGV2LT5kZXYsIHJlc19tZW0pOwogCWlmIChJU19FUlIoaGNkLT5yZWdzKSkgewogCQllcnIgPSBQVFJfRVJSKGhjZC0+cmVncyk7Ci0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCX0KIAllcnIgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3B1dF9oY2Q7CisJCWdvdG8gZXJyX3Bvd2VyOwogCiAJZGV2aWNlX3dha2V1cF9lbmFibGUoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCkBAIC0xMTQsMTEgKzIzOSwxNyBAQAogCiAJcmV0dXJuIGVycjsKIAotZXJyX3B1dF9oY2Q6Ci0JdXNiX3B1dF9oY2QoaGNkKTsKIGVycl9wb3dlcjoKIAlpZiAocGRhdGEtPnBvd2VyX29mZikKIAkJcGRhdGEtPnBvd2VyX29mZihkZXYpOworZXJyX3B1dF9jbGtzOgorCXdoaWxlICgtLWNsayA+PSAwKQorCQljbGtfcHV0KHByaXYtPmNsa3NbY2xrXSk7CitlcnJfcHV0X2hjZDoKKwlpZiAocGRhdGEgPT0gJm9oY2lfcGxhdGZvcm1fZGVmYXVsdHMpCisJCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBOVUxMOworCisJdXNiX3B1dF9oY2QoaGNkKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xMjcsMTMgKzI1OCwyMiBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB1c2Jfb2hjaV9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IG9oY2lfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGhjZF90b19vaGNpX3ByaXYoaGNkKTsKKwlpbnQgY2xrOwogCiAJdXNiX3JlbW92ZV9oY2QoaGNkKTsKLQl1c2JfcHV0X2hjZChoY2QpOwogCiAJaWYgKHBkYXRhLT5wb3dlcl9vZmYpCiAJCXBkYXRhLT5wb3dlcl9vZmYoZGV2KTsKIAorCWZvciAoY2xrID0gMDsgY2xrIDwgT0hDSV9NQVhfQ0xLUyAmJiBwcml2LT5jbGtzW2Nsa107IGNsaysrKQorCQljbGtfcHV0KHByaXYtPmNsa3NbY2xrXSk7CisKKwl1c2JfcHV0X2hjZChoY2QpOworCisJaWYgKHBkYXRhID09ICZvaGNpX3BsYXRmb3JtX2RlZmF1bHRzKQorCQlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODAsNiArMzIwLDEyIEBACiAjZGVmaW5lIG9oY2lfcGxhdGZvcm1fcmVzdW1lCU5VTEwKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2hjaV9wbGF0Zm9ybV9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImdlbmVyaWMtb2hjaSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2hjaV9wbGF0Zm9ybV9pZHMpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBvaGNpX3BsYXRmb3JtX3RhYmxlW10gPSB7CiAJeyAib2hjaS1wbGF0Zm9ybSIsIDAgfSwKIAl7IH0KQEAgLTIwMCw2ICszNDYsNyBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAib2hjaS1wbGF0Zm9ybSIsCiAJCS5wbQk9ICZvaGNpX3BsYXRmb3JtX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2hjaV9wbGF0Zm9ybV9pZHMsCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXBsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcGxhdGZvcm0uYwppbmRleCA0NGU2YzlkLi4wMTgzM2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcGxhdGZvcm0uYwpAQCAtMTQ4LDYgKzE0OCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBsYXRmb3JtX3VoY2lfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnZW5lcmljLXVoY2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicGxhdGZvcm0tdWhjaSIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKaW5kZXggOTk5MmZiZi4uMWFkNmJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwpAQCAtNzMyLDkgKzczMiwxMSBAQAogCQkvKiBTZXQgdGhlIFUxIGFuZCBVMiBleGl0IGxhdGVuY2llcy4gKi8KIAkJbWVtY3B5KGJ1ZiwgJnVzYl9ib3NfZGVzY3JpcHRvciwKIAkJCQlVU0JfRFRfQk9TX1NJWkUgKyBVU0JfRFRfVVNCX1NTX0NBUF9TSVpFKTsKLQkJdGVtcCA9IHJlYWRsKCZ4aGNpLT5jYXBfcmVncy0+aGNzX3BhcmFtczMpOwotCQlidWZbMTJdID0gSENTX1UxX0xBVEVOQ1kodGVtcCk7Ci0JCXB1dF91bmFsaWduZWRfbGUxNihIQ1NfVTJfTEFURU5DWSh0ZW1wKSwgJmJ1ZlsxM10pOworCQlpZiAoKHhoY2ktPnF1aXJrcyAmIFhIQ0lfTFBNX1NVUFBPUlQpKSB7CisJCQl0ZW1wID0gcmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY3NfcGFyYW1zMyk7CisJCQlidWZbMTJdID0gSENTX1UxX0xBVEVOQ1kodGVtcCk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMTYoSENTX1UyX0xBVEVOQ1kodGVtcCksICZidWZbMTNdKTsKKwkJfQogCiAJCS8qIEluZGljYXRlIHdoZXRoZXIgdGhlIGhvc3QgaGFzIExUTSBzdXBwb3J0LiAqLwogCQl0ZW1wID0gcmVhZGwoJnhoY2ktPmNhcF9yZWdzLT5oY2NfcGFyYW1zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwppbmRleCBiY2U0MzkxLi5jMDg5NjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCkBAIC0xNDksMTQgKzE0OSwxNDAgQEAKIAl9CiB9CiAKKy8qCisgKiBXZSBuZWVkIGEgcmFkaXggdHJlZSBmb3IgbWFwcGluZyBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgVFJCcyB0byB3aGljaCBzdHJlYW0KKyAqIElEIHRoZXkgYmVsb25nIHRvLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIGhvc3QgY29udHJvbGxlciB3b24ndCB0ZWxsCisgKiB1cyB3aGljaCBzdHJlYW0gcmluZyB0aGUgVFJCIGNhbWUgZnJvbS4gIFdlIGNvdWxkIHN0b3JlIHRoZSBzdHJlYW0gSUQgaW4gYW4KKyAqIGV2ZW50IGRhdGEgVFJCLCBidXQgdGhhdCBkb2Vzbid0IGhlbHAgdXMgZm9yIHRoZSBjYW5jZWxsYXRpb24gY2FzZSwgc2luY2UgdGhlCisgKiBlbmRwb2ludCBtYXkgc3RvcCBiZWZvcmUgaXQgcmVhY2hlcyB0aGF0IGV2ZW50IGRhdGEgVFJCLgorICoKKyAqIFRoZSByYWRpeCB0cmVlIG1hcHMgdGhlIHVwcGVyIHBvcnRpb24gb2YgdGhlIFRSQiBETUEgYWRkcmVzcyB0byBhIHJpbmcKKyAqIHNlZ21lbnQgdGhhdCBoYXMgdGhlIHNhbWUgdXBwZXIgcG9ydGlvbiBvZiBETUEgYWRkcmVzc2VzLiAgRm9yIGV4YW1wbGUsIHNheSBJCisgKiBoYXZlIHNlZ21lbnRzIG9mIHNpemUgMUtCLCB0aGF0IGFyZSBhbHdheXMgMUtCIGFsaWduZWQuICBBIHNlZ21lbnQgbWF5CisgKiBzdGFydCBhdCAweDEwYzkxMDAwIGFuZCBlbmQgYXQgMHgxMGM5MTNmMC4gIElmIEkgdXNlIHRoZSB1cHBlciAxMCBiaXRzLCB0aGUKKyAqIGtleSB0byB0aGUgc3RyZWFtIElEIGlzIDB4NDMyNDQuICBJIGNhbiB1c2UgdGhlIERNQSBhZGRyZXNzIG9mIHRoZSBUUkIgdG8KKyAqIHBhc3MgdGhlIHJhZGl4IHRyZWUgYSBrZXkgdG8gZ2V0IHRoZSByaWdodCBzdHJlYW0gSUQ6CisgKgorICoJMHgxMGM5MGZmZiA+PiAxMCA9IDB4NDMyNDMKKyAqCTB4MTBjOTEyYzAgPj4gMTAgPSAweDQzMjQ0CisgKgkweDEwYzkxNDAwID4+IDEwID0gMHg0MzI0NQorICoKKyAqIE9idmlvdXNseSwgb25seSB0aG9zZSBUUkJzIHdpdGggRE1BIGFkZHJlc3NlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIHNlZ21lbnQKKyAqIHdpbGwgbWFrZSB0aGUgcmFkaXggdHJlZSByZXR1cm4gdGhlIHN0cmVhbSBJRCBmb3IgdGhhdCByaW5nLgorICoKKyAqIENhdmVhdHMgZm9yIHRoZSByYWRpeCB0cmVlOgorICoKKyAqIFRoZSByYWRpeCB0cmVlIHVzZXMgYW4gdW5zaWduZWQgbG9uZyBhcyBhIGtleSBwYWlyLiAgT24gMzItYml0IHN5c3RlbXMsIGFuCisgKiB1bnNpZ25lZCBsb25nIHdpbGwgYmUgMzItYml0czsgb24gYSA2NC1iaXQgc3lzdGVtIGFuIHVuc2lnbmVkIGxvbmcgd2lsbCBiZQorICogNjQtYml0cy4gIFNpbmNlIHdlIG9ubHkgcmVxdWVzdCAzMi1iaXQgRE1BIGFkZHJlc3Nlcywgd2UgY2FuIHVzZSB0aGF0IGFzIHRoZQorICoga2V5IG9uIDMyLWJpdCBvciA2NC1iaXQgc3lzdGVtcyAoaXQgd291bGQgYWxzbyBiZSBmaW5lIGlmIHdlIGFza2VkIGZvciA2NC1iaXQKKyAqIFBDSSBETUEgYWRkcmVzc2VzIG9uIGEgNjQtYml0IHN5c3RlbSkuICBUaGVyZSBtaWdodCBiZSBhIHByb2JsZW0gb24gMzItYml0CisgKiBleHRlbmRlZCBzeXN0ZW1zICh3aGVyZSB0aGUgRE1BIGFkZHJlc3MgY2FuIGJlIGJpZ2dlciB0aGFuIDMyLWJpdHMpLAorICogaWYgd2UgYWxsb3cgdGhlIFBDSSBkbWEgbWFzayB0byBiZSBiaWdnZXIgdGhhbiAzMi1iaXRzLiAgU28gZG9uJ3QgZG8gdGhhdC4KKyAqLworc3RhdGljIGludCB4aGNpX2luc2VydF9zZWdtZW50X21hcHBpbmcoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqdHJiX2FkZHJlc3NfbWFwLAorCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpzZWcsCisJCWdmcF90IG1lbV9mbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGtleTsKKwlpbnQgcmV0OworCisJa2V5ID0gKHVuc2lnbmVkIGxvbmcpKHNlZy0+ZG1hID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKKwkvKiBTa2lwIGFueSBzZWdtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZC4gKi8KKwlpZiAocmFkaXhfdHJlZV9sb29rdXAodHJiX2FkZHJlc3NfbWFwLCBrZXkpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJhZGl4X3RyZWVfbWF5YmVfcHJlbG9hZChtZW1fZmxhZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQodHJiX2FkZHJlc3NfbWFwLAorCQkJa2V5LCByaW5nKTsKKwlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGhjaV9yZW1vdmVfc2VnbWVudF9tYXBwaW5nKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnRyYl9hZGRyZXNzX21hcCwKKwkJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnKQoreworCXVuc2lnbmVkIGxvbmcga2V5OworCisJa2V5ID0gKHVuc2lnbmVkIGxvbmcpKHNlZy0+ZG1hID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKKwlpZiAocmFkaXhfdHJlZV9sb29rdXAodHJiX2FkZHJlc3NfbWFwLCBrZXkpKQorCQlyYWRpeF90cmVlX2RlbGV0ZSh0cmJfYWRkcmVzc19tYXAsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgeGhjaV91cGRhdGVfc3RyZWFtX3NlZ21lbnRfbWFwcGluZygKKwkJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqdHJiX2FkZHJlc3NfbWFwLAorCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpmaXJzdF9zZWcsCisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKmxhc3Rfc2VnLAorCQlnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnOworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKmZhaWxlZF9zZWc7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OX09OQ0UodHJiX2FkZHJlc3NfbWFwID09IE5VTEwpKQorCQlyZXR1cm4gMDsKKworCXNlZyA9IGZpcnN0X3NlZzsKKwlkbyB7CisJCXJldCA9IHhoY2lfaW5zZXJ0X3NlZ21lbnRfbWFwcGluZyh0cmJfYWRkcmVzc19tYXAsCisJCQkJcmluZywgc2VnLCBtZW1fZmxhZ3MpOworCQlpZiAocmV0KQorCQkJZ290byByZW1vdmVfc3RyZWFtczsKKwkJaWYgKHNlZyA9PSBsYXN0X3NlZykKKwkJCXJldHVybiAwOworCQlzZWcgPSBzZWctPm5leHQ7CisJfSB3aGlsZSAoc2VnICE9IGZpcnN0X3NlZyk7CisKKwlyZXR1cm4gMDsKKworcmVtb3ZlX3N0cmVhbXM6CisJZmFpbGVkX3NlZyA9IHNlZzsKKwlzZWcgPSBmaXJzdF9zZWc7CisJZG8geworCQl4aGNpX3JlbW92ZV9zZWdtZW50X21hcHBpbmcodHJiX2FkZHJlc3NfbWFwLCBzZWcpOworCQlpZiAoc2VnID09IGZhaWxlZF9zZWcpCisJCQlyZXR1cm4gcmV0OworCQlzZWcgPSBzZWctPm5leHQ7CisJfSB3aGlsZSAoc2VnICE9IGZpcnN0X3NlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4aGNpX3JlbW92ZV9zdHJlYW1fbWFwcGluZyhzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZzsKKworCWlmIChXQVJOX09OX09OQ0UocmluZy0+dHJiX2FkZHJlc3NfbWFwID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlzZWcgPSByaW5nLT5maXJzdF9zZWc7CisJZG8geworCQl4aGNpX3JlbW92ZV9zZWdtZW50X21hcHBpbmcocmluZy0+dHJiX2FkZHJlc3NfbWFwLCBzZWcpOworCQlzZWcgPSBzZWctPm5leHQ7CisJfSB3aGlsZSAoc2VnICE9IHJpbmctPmZpcnN0X3NlZyk7Cit9CisKK3N0YXRpYyBpbnQgeGhjaV91cGRhdGVfc3RyZWFtX21hcHBpbmcoc3RydWN0IHhoY2lfcmluZyAqcmluZywgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXJldHVybiB4aGNpX3VwZGF0ZV9zdHJlYW1fc2VnbWVudF9tYXBwaW5nKHJpbmctPnRyYl9hZGRyZXNzX21hcCwgcmluZywKKwkJCXJpbmctPmZpcnN0X3NlZywgcmluZy0+bGFzdF9zZWcsIG1lbV9mbGFncyk7Cit9CisKIC8qIFhYWDogRG8gd2UgbmVlZCB0aGUgaGNkIHN0cnVjdHVyZSBpbiBhbGwgdGhlc2UgZnVuY3Rpb25zPyAqLwogdm9pZCB4aGNpX3JpbmdfZnJlZShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcpCiB7CiAJaWYgKCFyaW5nKQogCQlyZXR1cm47CiAKLQlpZiAocmluZy0+Zmlyc3Rfc2VnKQorCWlmIChyaW5nLT5maXJzdF9zZWcpIHsKKwkJaWYgKHJpbmctPnR5cGUgPT0gVFlQRV9TVFJFQU0pCisJCQl4aGNpX3JlbW92ZV9zdHJlYW1fbWFwcGluZyhyaW5nKTsKIAkJeGhjaV9mcmVlX3NlZ21lbnRzX2Zvcl9yaW5nKHhoY2ksIHJpbmctPmZpcnN0X3NlZyk7CisJfQogCiAJa2ZyZWUocmluZyk7CiB9CkBAIC0zNDksNiArNDc1LDIxIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAocmluZy0+dHlwZSA9PSBUWVBFX1NUUkVBTSkKKwkJcmV0ID0geGhjaV91cGRhdGVfc3RyZWFtX3NlZ21lbnRfbWFwcGluZyhyaW5nLT50cmJfYWRkcmVzc19tYXAsCisJCQkJCQlyaW5nLCBmaXJzdCwgbGFzdCwgZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJc3RydWN0IHhoY2lfc2VnbWVudCAqbmV4dDsKKwkJZG8geworCQkJbmV4dCA9IGZpcnN0LT5uZXh0OworCQkJeGhjaV9zZWdtZW50X2ZyZWUoeGhjaSwgZmlyc3QpOworCQkJaWYgKGZpcnN0ID09IGxhc3QpCisJCQkJYnJlYWs7CisJCQlmaXJzdCA9IG5leHQ7CisJCX0gd2hpbGUgKHRydWUpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXhoY2lfbGlua19yaW5ncyh4aGNpLCByaW5nLCBmaXJzdCwgbGFzdCwgbnVtX3NlZ3MpOwogCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX3JpbmdfZXhwYW5zaW9uLAogCQkJInJpbmcgZXhwYW5zaW9uIHN1Y2NlZWQsIG5vdyBoYXMgJWQgc2VnbWVudHMiLApAQCAtNDM0LDEyICs1NzUsMTIgQEAKIAkJc3RydWN0IHhoY2lfc3RyZWFtX2N0eCAqc3RyZWFtX2N0eCwgZG1hX2FkZHJfdCBkbWEpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0geGhjaV90b19oY2QoeGhjaSktPnNlbGYuY29udHJvbGxlcjsKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeGhjaV9zdHJlYW1fY3R4KSAqIG51bV9zdHJlYW1fY3R4czsKIAotCWlmIChudW1fc3RyZWFtX2N0eHMgPiBNRURJVU1fU1RSRUFNX0FSUkFZX1NJWkUpCi0JCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKLQkJCQlzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkqbnVtX3N0cmVhbV9jdHhzLAorCWlmIChzaXplID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQorCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsCiAJCQkJc3RyZWFtX2N0eCwgZG1hKTsKLQllbHNlIGlmIChudW1fc3RyZWFtX2N0eHMgPD0gU01BTExfU1RSRUFNX0FSUkFZX1NJWkUpCisJZWxzZSBpZiAoc2l6ZSA8PSBTTUFMTF9TVFJFQU1fQVJSQVlfU0laRSkKIAkJcmV0dXJuIGRtYV9wb29sX2ZyZWUoeGhjaS0+c21hbGxfc3RyZWFtc19wb29sLAogCQkJCXN0cmVhbV9jdHgsIGRtYSk7CiAJZWxzZQpAQCAtNDYyLDEyICs2MDMsMTIgQEAKIAkJZ2ZwX3QgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHhoY2lfdG9faGNkKHhoY2kpLT5zZWxmLmNvbnRyb2xsZXI7CisJc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkgKiBudW1fc3RyZWFtX2N0eHM7CiAKLQlpZiAobnVtX3N0cmVhbV9jdHhzID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQotCQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwKLQkJCQlzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkqbnVtX3N0cmVhbV9jdHhzLAorCWlmIChzaXplID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQorCQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwKIAkJCQlkbWEsIG1lbV9mbGFncyk7Ci0JZWxzZSBpZiAobnVtX3N0cmVhbV9jdHhzIDw9IFNNQUxMX1NUUkVBTV9BUlJBWV9TSVpFKQorCWVsc2UgaWYgKHNpemUgPD0gU01BTExfU1RSRUFNX0FSUkFZX1NJWkUpCiAJCXJldHVybiBkbWFfcG9vbF9hbGxvYyh4aGNpLT5zbWFsbF9zdHJlYW1zX3Bvb2wsCiAJCQkJbWVtX2ZsYWdzLCBkbWEpOwogCWVsc2UKQEAgLTUxMCwzNiArNjUxLDYgQEAKICAqIFRoZSBudW1iZXIgb2Ygc3RyZWFtIGNvbnRleHRzIGluIHRoZSBzdHJlYW0gY29udGV4dCBhcnJheSBtYXkgYmUgYmlnZ2VyIHRoYW4KICAqIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbnVtYmVyIG9mCiAgKiBzdHJlYW0gY29udGV4dCBhcnJheSBlbnRyaWVzIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKgotICogV2UgbmVlZCBhIHJhZGl4IHRyZWUgZm9yIG1hcHBpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIFRSQnMgdG8gd2hpY2ggc3RyZWFtCi0gKiBJRCB0aGV5IGJlbG9uZyB0by4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZSBob3N0IGNvbnRyb2xsZXIgd29uJ3QgdGVsbAotICogdXMgd2hpY2ggc3RyZWFtIHJpbmcgdGhlIFRSQiBjYW1lIGZyb20uICBXZSBjb3VsZCBzdG9yZSB0aGUgc3RyZWFtIElEIGluIGFuCi0gKiBldmVudCBkYXRhIFRSQiwgYnV0IHRoYXQgZG9lc24ndCBoZWxwIHVzIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhc2UsIHNpbmNlIHRoZQotICogZW5kcG9pbnQgbWF5IHN0b3AgYmVmb3JlIGl0IHJlYWNoZXMgdGhhdCBldmVudCBkYXRhIFRSQi4KLSAqCi0gKiBUaGUgcmFkaXggdHJlZSBtYXBzIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSBUUkIgRE1BIGFkZHJlc3MgdG8gYSByaW5nCi0gKiBzZWdtZW50IHRoYXQgaGFzIHRoZSBzYW1lIHVwcGVyIHBvcnRpb24gb2YgRE1BIGFkZHJlc3Nlcy4gIEZvciBleGFtcGxlLCBzYXkgSQotICogaGF2ZSBzZWdtZW50cyBvZiBzaXplIDFLQiwgdGhhdCBhcmUgYWx3YXlzIDY0LWJ5dGUgYWxpZ25lZC4gIEEgc2VnbWVudCBtYXkKLSAqIHN0YXJ0IGF0IDB4MTBjOTEwMDAgYW5kIGVuZCBhdCAweDEwYzkxM2YwLiAgSWYgSSB1c2UgdGhlIHVwcGVyIDEwIGJpdHMsIHRoZQotICoga2V5IHRvIHRoZSBzdHJlYW0gSUQgaXMgMHg0MzI0NC4gIEkgY2FuIHVzZSB0aGUgRE1BIGFkZHJlc3Mgb2YgdGhlIFRSQiB0bwotICogcGFzcyB0aGUgcmFkaXggdHJlZSBhIGtleSB0byBnZXQgdGhlIHJpZ2h0IHN0cmVhbSBJRDoKLSAqCi0gKiAJMHgxMGM5MGZmZiA+PiAxMCA9IDB4NDMyNDMKLSAqIAkweDEwYzkxMmMwID4+IDEwID0gMHg0MzI0NAotICogCTB4MTBjOTE0MDAgPj4gMTAgPSAweDQzMjQ1Ci0gKgotICogT2J2aW91c2x5LCBvbmx5IHRob3NlIFRSQnMgd2l0aCBETUEgYWRkcmVzc2VzIHRoYXQgYXJlIHdpdGhpbiB0aGUgc2VnbWVudAotICogd2lsbCBtYWtlIHRoZSByYWRpeCB0cmVlIHJldHVybiB0aGUgc3RyZWFtIElEIGZvciB0aGF0IHJpbmcuCi0gKgotICogQ2F2ZWF0cyBmb3IgdGhlIHJhZGl4IHRyZWU6Ci0gKgotICogVGhlIHJhZGl4IHRyZWUgdXNlcyBhbiB1bnNpZ25lZCBsb25nIGFzIGEga2V5IHBhaXIuICBPbiAzMi1iaXQgc3lzdGVtcywgYW4KLSAqIHVuc2lnbmVkIGxvbmcgd2lsbCBiZSAzMi1iaXRzOyBvbiBhIDY0LWJpdCBzeXN0ZW0gYW4gdW5zaWduZWQgbG9uZyB3aWxsIGJlCi0gKiA2NC1iaXRzLiAgU2luY2Ugd2Ugb25seSByZXF1ZXN0IDMyLWJpdCBETUEgYWRkcmVzc2VzLCB3ZSBjYW4gdXNlIHRoYXQgYXMgdGhlCi0gKiBrZXkgb24gMzItYml0IG9yIDY0LWJpdCBzeXN0ZW1zIChpdCB3b3VsZCBhbHNvIGJlIGZpbmUgaWYgd2UgYXNrZWQgZm9yIDY0LWJpdAotICogUENJIERNQSBhZGRyZXNzZXMgb24gYSA2NC1iaXQgc3lzdGVtKS4gIFRoZXJlIG1pZ2h0IGJlIGEgcHJvYmxlbSBvbiAzMi1iaXQKLSAqIGV4dGVuZGVkIHN5c3RlbXMgKHdoZXJlIHRoZSBETUEgYWRkcmVzcyBjYW4gYmUgYmlnZ2VyIHRoYW4gMzItYml0cyksCi0gKiBpZiB3ZSBhbGxvdyB0aGUgUENJIGRtYSBtYXNrIHRvIGJlIGJpZ2dlciB0aGFuIDMyLWJpdHMuICBTbyBkb24ndCBkbyB0aGF0LgogICovCiBzdHJ1Y3QgeGhjaV9zdHJlYW1faW5mbyAqeGhjaV9hbGxvY19zdHJlYW1faW5mbyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCiAJCXVuc2lnbmVkIGludCBudW1fc3RyZWFtX2N0eHMsCkBAIC01NDgsNyArNjU5LDYgQEAKIAlzdHJ1Y3QgeGhjaV9zdHJlYW1faW5mbyAqc3RyZWFtX2luZm87CiAJdTMyIGN1cl9zdHJlYW07CiAJc3RydWN0IHhoY2lfcmluZyAqY3VyX3Jpbmc7Ci0JdW5zaWduZWQgbG9uZyBrZXk7CiAJdTY0IGFkZHI7CiAJaW50IHJldDsKIApAQCAtNjAzLDYgKzcxMyw3IEBACiAJCWlmICghY3VyX3JpbmcpCiAJCQlnb3RvIGNsZWFudXBfcmluZ3M7CiAJCWN1cl9yaW5nLT5zdHJlYW1faWQgPSBjdXJfc3RyZWFtOworCQljdXJfcmluZy0+dHJiX2FkZHJlc3NfbWFwID0gJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXA7CiAJCS8qIFNldCBkZXEgcHRyLCBjeWNsZSBiaXQsIGFuZCBzdHJlYW0gY29udGV4dCB0eXBlICovCiAJCWFkZHIgPSBjdXJfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgfAogCQkJU0NUX0ZPUl9DVFgoU0NUX1BSSV9UUikgfApAQCAtNjEyLDEwICs3MjMsNyBAQAogCQl4aGNpX2RiZyh4aGNpLCAiU2V0dGluZyBzdHJlYW0gJWQgcmluZyBwdHIgdG8gMHglMDhsbHhcbiIsCiAJCQkJY3VyX3N0cmVhbSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkcik7CiAKLQkJa2V5ID0gKHVuc2lnbmVkIGxvbmcpCi0JCQkoY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKLQkJcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQoJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXAsCi0JCQkJa2V5LCBjdXJfcmluZyk7CisJCXJldCA9IHhoY2lfdXBkYXRlX3N0cmVhbV9tYXBwaW5nKGN1cl9yaW5nLCBtZW1fZmxhZ3MpOwogCQlpZiAocmV0KSB7CiAJCQl4aGNpX3JpbmdfZnJlZSh4aGNpLCBjdXJfcmluZyk7CiAJCQlzdHJlYW1faW5mby0+c3RyZWFtX3JpbmdzW2N1cl9zdHJlYW1dID0gTlVMTDsKQEAgLTYzNSw5ICs3NDMsNiBAQAogCWZvciAoY3VyX3N0cmVhbSA9IDE7IGN1cl9zdHJlYW0gPCBudW1fc3RyZWFtczsgY3VyX3N0cmVhbSsrKSB7CiAJCWN1cl9yaW5nID0gc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXTsKIAkJaWYgKGN1cl9yaW5nKSB7Ci0JCQlhZGRyID0gY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hOwotCQkJcmFkaXhfdHJlZV9kZWxldGUoJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXAsCi0JCQkJCWFkZHIgPj4gVFJCX1NFR01FTlRfU0hJRlQpOwogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgY3VyX3JpbmcpOwogCQkJc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXSA9IE5VTEw7CiAJCX0KQEAgLTY5OCw3ICs4MDMsNiBAQAogewogCWludCBjdXJfc3RyZWFtOwogCXN0cnVjdCB4aGNpX3JpbmcgKmN1cl9yaW5nOwotCWRtYV9hZGRyX3QgYWRkcjsKIAogCWlmICghc3RyZWFtX2luZm8pCiAJCXJldHVybjsKQEAgLTcwNyw5ICs4MTEsNiBAQAogCQkJY3VyX3N0cmVhbSsrKSB7CiAJCWN1cl9yaW5nID0gc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXTsKIAkJaWYgKGN1cl9yaW5nKSB7Ci0JCQlhZGRyID0gY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hOwotCQkJcmFkaXhfdHJlZV9kZWxldGUoJnN0cmVhbV9pbmZvLT50cmJfYWRkcmVzc19tYXAsCi0JCQkJCWFkZHIgPj4gVFJCX1NFR01FTlRfU0hJRlQpOwogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgY3VyX3JpbmcpOwogCQkJc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXSA9IE5VTEw7CiAJCX0KQEAgLTE3MTEsNyArMTgxMiw2IEBACiAKIAlpZiAoeGhjaS0+bHBtX2NvbW1hbmQpCiAJCXhoY2lfZnJlZV9jb21tYW5kKHhoY2ksIHhoY2ktPmxwbV9jb21tYW5kKTsKLQl4aGNpLT5jbWRfcmluZ19yZXNlcnZlZF90cmJzID0gMDsKIAlpZiAoeGhjaS0+Y21kX3JpbmcpCiAJCXhoY2lfcmluZ19mcmVlKHhoY2ksIHhoY2ktPmNtZF9yaW5nKTsKIAl4aGNpLT5jbWRfcmluZyA9IE5VTEw7CkBAIC0xNzc2LDYgKzE4NzYsNyBAQAogCX0KIAogbm9fYnc6CisJeGhjaS0+Y21kX3JpbmdfcmVzZXJ2ZWRfdHJicyA9IDA7CiAJeGhjaS0+bnVtX3VzYjJfcG9ydHMgPSAwOwogCXhoY2ktPm51bV91c2IzX3BvcnRzID0gMDsKIAl4aGNpLT5udW1fYWN0aXZlX2VwcyA9IDA7CkBAIC0yMjc0LDExICsyMzc1LDEyIEBACiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSByaW5nIHNlZ21lbnQgcG9vbC4gIFRoZSByaW5nIG11c3QgYmUgYSBjb250aWd1b3VzCiAJICogc3RydWN0dXJlIGNvbXByaXNlZCBvZiBUUkJzLiAgVGhlIFRSQnMgbXVzdCBiZSAxNiBieXRlIGFsaWduZWQsCi0JICogaG93ZXZlciwgdGhlIGNvbW1hbmQgcmluZyBzZWdtZW50IG5lZWRzIDY0LWJ5dGUgYWxpZ25lZCBzZWdtZW50cywKLQkgKiBzbyB3ZSBwaWNrIHRoZSBncmVhdGVyIGFsaWdubWVudCBuZWVkLgorCSAqIGhvd2V2ZXIsIHRoZSBjb21tYW5kIHJpbmcgc2VnbWVudCBuZWVkcyA2NC1ieXRlIGFsaWduZWQgc2VnbWVudHMKKwkgKiBhbmQgb3VyIHVzZSBvZiBkbWEgYWRkcmVzc2VzIGluIHRoZSB0cmJfYWRkcmVzc19tYXAgcmFkaXggdHJlZSBuZWVkcworCSAqIFRSQl9TRUdNRU5UX1NJWkUgYWxpZ25tZW50LCBzbyB3ZSBwaWNrIHRoZSBncmVhdGVyIGFsaWdubWVudCBuZWVkLgogCSAqLwogCXhoY2ktPnNlZ21lbnRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgieEhDSSByaW5nIHNlZ21lbnRzIiwgZGV2LAotCQkJVFJCX1NFR01FTlRfU0laRSwgNjQsIHhoY2ktPnBhZ2Vfc2l6ZSk7CisJCQlUUkJfU0VHTUVOVF9TSVpFLCBUUkJfU0VHTUVOVF9TSVpFLCB4aGNpLT5wYWdlX3NpemUpOwogCiAJLyogU2VlIFRhYmxlIDQ2IGFuZCBOb3RlIG9uIEZpZ3VyZSA1NSAqLwogCXhoY2ktPmRldmljZV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJ4SENJIGlucHV0L291dHB1dCBjb250ZXh0cyIsIGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwppbmRleCAwNGY5ODZkLi40NzM5MGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCkBAIC0xOTAsNiArMTkwLDEwIEBACiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAogCWRyaXZlciA9IChzdHJ1Y3QgaGNfZHJpdmVyICopaWQtPmRyaXZlcl9kYXRhOworCisJLyogUHJldmVudCBydW50aW1lIHN1c3BlbmRpbmcgYmV0d2VlbiBVU0ItMiBhbmQgVVNCLTMgaW5pdGlhbGl6YXRpb24gKi8KKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmZGV2LT5kZXYpOworCiAJLyogUmVnaXN0ZXIgdGhlIFVTQiAyLjAgcm9vdGh1Yi4KIAkgKiBGSVhNRTogVVNCIGNvcmUgbXVzdCBrbm93IHRvIHJlZ2lzdGVyIHRoZSBVU0IgMi4wIHJvb3RodWIgZmlyc3QuCiAJICogVGhpcyBpcyBzb3J0IG9mIHNpbGx5LCBiZWNhdXNlIHdlIGNvdWxkIGp1c3Qgc2V0IHRoZSBIQ0QgZHJpdmVyIGZsYWdzCkBAIC0xOTksNyArMjAzLDcgQEAKIAlyZXR2YWwgPSB1c2JfaGNkX3BjaV9wcm9iZShkZXYsIGlkKTsKIAogCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJCWdvdG8gcHV0X3J1bnRpbWVfcG07CiAKIAkvKiBVU0IgMi4wIHJvb3RodWIgaXMgc3RvcmVkIGluIHRoZSBQQ0kgZGV2aWNlIG5vdy4gKi8KIAloY2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKQEAgLTIyMiwxMSArMjI2LDExIEBACiAJCWdvdG8gcHV0X3VzYjNfaGNkOwogCS8qIFJvb3RodWIgYWxyZWFkeSBtYXJrZWQgYXMgVVNCIDMuMCBzcGVlZCAqLwogCi0JLyogV2Uga25vdyB0aGUgTFBNIHRpbWVvdXQgYWxnb3JpdGhtcyBmb3IgdGhpcyBob3N0LCBsZXQgdGhlIFVTQiBjb3JlCi0JICogZW5hYmxlIGFuZCBkaXNhYmxlIExQTSBmb3IgZGV2aWNlcyB1bmRlciB0aGUgVVNCIDMuMCByb290aHViLgotCSAqLwotCWlmICh4aGNpLT5xdWlya3MgJiBYSENJX0xQTV9TVVBQT1JUKQotCQloY2RfdG9fYnVzKHhoY2ktPnNoYXJlZF9oY2QpLT5yb290X2h1Yi0+bHBtX2NhcGFibGUgPSAxOworCWlmIChIQ0NfTUFYX1BTQSh4aGNpLT5oY2NfcGFyYW1zKSA+PSA0KQorCQl4aGNpLT5zaGFyZWRfaGNkLT5jYW5fZG9fc3RyZWFtcyA9IDE7CisKKwkvKiBVU0ItMiBhbmQgVVNCLTMgcm9vdGh1YnMgaW5pdGlhbGl6ZWQsIGFsbG93IHJ1bnRpbWUgcG0gc3VzcGVuZCAqLworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmZGV2LT5kZXYpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTIzNCw2ICsyMzgsOCBAQAogCXVzYl9wdXRfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOwogZGVhbGxvY191c2IyX2hjZDoKIAl1c2JfaGNkX3BjaV9yZW1vdmUoZGV2KTsKK3B1dF9ydW50aW1lX3BtOgorCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmZGV2LT5kZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCmluZGV4IDhhYmRhNWMuLjE1MTkwMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYwpAQCAtMTU4LDYgKzE1OCw5IEBACiAJICovCiAJKigoc3RydWN0IHhoY2lfaGNkICoqKSB4aGNpLT5zaGFyZWRfaGNkLT5oY2RfcHJpdikgPSB4aGNpOwogCisJaWYgKEhDQ19NQVhfUFNBKHhoY2ktPmhjY19wYXJhbXMpID49IDQpCisJCXhoY2ktPnNoYXJlZF9oY2QtPmNhbl9kb19zdHJlYW1zID0gMTsKKwogCXJldCA9IHVzYl9hZGRfaGNkKHhoY2ktPnNoYXJlZF9oY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChyZXQpCiAJCWdvdG8gcHV0X3VzYjNfaGNkOwpAQCAtMjI2LDYgKzIyOSw3IEBACiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVzYl94aGNpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnZW5lcmljLXhoY2kiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ4aGNpLXBsYXRmb3JtIiB9LAogCXsgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwppbmRleCAwZWQ2NGViLi41ZjkyNmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKQEAgLTU0Niw5ICs1NDYsOSBAQAogCQlzdHJ1Y3QgeGhjaV9kZXF1ZXVlX3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqZGV2ID0geGhjaS0+ZGV2c1tzbG90X2lkXTsKKwlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCA9ICZkZXYtPmVwc1tlcF9pbmRleF07CiAJc3RydWN0IHhoY2lfcmluZyAqZXBfcmluZzsKIAlzdHJ1Y3QgeGhjaV9nZW5lcmljX3RyYiAqdHJiOwotCXN0cnVjdCB4aGNpX2VwX2N0eCAqZXBfY3R4OwogCWRtYV9hZGRyX3QgYWRkcjsKIAogCWVwX3JpbmcgPSB4aGNpX3RyaWFkX3RvX3RyYW5zZmVyX3JpbmcoeGhjaSwgc2xvdF9pZCwKQEAgLTU3Myw4ICs1NzMsMTYgQEAKIAkvKiBEaWcgb3V0IHRoZSBjeWNsZSBzdGF0ZSBzYXZlZCBieSB0aGUgeEhDIGR1cmluZyB0aGUgc3RvcCBlcCBjbWQgKi8KIAl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAogCQkJIkZpbmRpbmcgZW5kcG9pbnQgY29udGV4dCIpOwotCWVwX2N0eCA9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCBkZXYtPm91dF9jdHgsIGVwX2luZGV4KTsKLQlzdGF0ZS0+bmV3X2N5Y2xlX3N0YXRlID0gMHgxICYgbGU2NF90b19jcHUoZXBfY3R4LT5kZXEpOworCS8qIDQuNi45IHRoZSBjc3MgZmxhZyBpcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0gY29udGV4dCBmb3Igc3RyZWFtcyAqLworCWlmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgeworCQlzdHJ1Y3QgeGhjaV9zdHJlYW1fY3R4ICpjdHggPQorCQkJJmVwLT5zdHJlYW1faW5mby0+c3RyZWFtX2N0eF9hcnJheVtzdHJlYW1faWRdOworCQlzdGF0ZS0+bmV3X2N5Y2xlX3N0YXRlID0gMHgxICYgbGU2NF90b19jcHUoY3R4LT5zdHJlYW1fcmluZyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHhoY2lfZXBfY3R4ICplcF9jdHgKKwkJCT0geGhjaV9nZXRfZXBfY3R4KHhoY2ksIGRldi0+b3V0X2N0eCwgZXBfaW5kZXgpOworCQlzdGF0ZS0+bmV3X2N5Y2xlX3N0YXRlID0gMHgxICYgbGU2NF90b19jcHUoZXBfY3R4LT5kZXEpOworCX0KIAogCXN0YXRlLT5uZXdfZGVxX3B0ciA9IGN1cl90ZC0+bGFzdF90cmI7CiAJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKQEAgLTg5Miw2ICs5MDAsNTcgQEAKIAkvKiBSZXR1cm4gdG8gdGhlIGV2ZW50IGhhbmRsZXIgd2l0aCB4aGNpLT5sb2NrIHJlLWFjcXVpcmVkICovCiB9CiAKK3N0YXRpYyB2b2lkIHhoY2lfa2lsbF9yaW5nX3VyYnMoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnRkX2xpc3QpKSB7CisJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPnRkX2xpc3QsCisJCQkJc3RydWN0IHhoY2lfdGQsIHRkX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZjdXJfdGQtPnRkX2xpc3QpOworCQlpZiAoIWxpc3RfZW1wdHkoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpKQorCQkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CisJCXhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycSh4aGNpLCBjdXJfdGQsIC1FU0hVVERPV04pOworCX0KK30KKworc3RhdGljIHZvaWQgeGhjaV9raWxsX2VuZHBvaW50X3VyYnMoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlpbnQgc2xvdF9pZCwgaW50IGVwX2luZGV4KQoreworCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7CisJc3RydWN0IHhoY2lfcmluZyAqcmluZzsKKworCWVwID0gJnhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CisJaWYgKChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgfHwKKwkJCShlcC0+ZXBfc3RhdGUgJiBFUF9HRVRUSU5HX05PX1NUUkVBTVMpKSB7CisJCWludCBzdHJlYW1faWQ7CisKKwkJZm9yIChzdHJlYW1faWQgPSAwOyBzdHJlYW1faWQgPCBlcC0+c3RyZWFtX2luZm8tPm51bV9zdHJlYW1zOworCQkJCXN0cmVhbV9pZCsrKSB7CisJCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAorCQkJCQkiS2lsbGluZyBVUkJzIGZvciBzbG90IElEICV1LCBlcCBpbmRleCAldSwgc3RyZWFtICV1IiwKKwkJCQkJc2xvdF9pZCwgZXBfaW5kZXgsIHN0cmVhbV9pZCArIDEpOworCQkJeGhjaV9raWxsX3JpbmdfdXJicyh4aGNpLAorCQkJCQllcC0+c3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tzdHJlYW1faWRdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJpbmcgPSBlcC0+cmluZzsKKwkJaWYgKCFyaW5nKQorCQkJcmV0dXJuOworCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAorCQkJCSJLaWxsaW5nIFVSQnMgZm9yIHNsb3QgSUQgJXUsIGVwIGluZGV4ICV1IiwKKwkJCQlzbG90X2lkLCBlcF9pbmRleCk7CisJCXhoY2lfa2lsbF9yaW5nX3VyYnMoeGhjaSwgcmluZyk7CisJfQorCXdoaWxlICghbGlzdF9lbXB0eSgmZXAtPmNhbmNlbGxlZF90ZF9saXN0KSkgeworCQljdXJfdGQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlcC0+Y2FuY2VsbGVkX3RkX2xpc3QsCisJCQkJc3RydWN0IHhoY2lfdGQsIGNhbmNlbGxlZF90ZF9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CisJCXhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycSh4aGNpLCBjdXJfdGQsIC1FU0hVVERPV04pOworCX0KK30KKwogLyogV2F0Y2hkb2cgdGltZXIgZnVuY3Rpb24gZm9yIHdoZW4gYSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgZmFpbHMgdG8gY29tcGxldGUuCiAgKiBJbiB0aGlzIGNhc2UsIHdlIGFzc3VtZSB0aGUgaG9zdCBjb250cm9sbGVyIGlzIGJyb2tlbiBvciBkeWluZyBvciBkZWFkLiAgVGhlCiAgKiBob3N0IG1heSBzdGlsbCBiZSBjb21wbGV0aW5nIHNvbWUgb3RoZXIgZXZlbnRzLCBzbyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8KQEAgLTkxNSw5ICs5NzQsNiBAQAogewogCXN0cnVjdCB4aGNpX2hjZCAqeGhjaTsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcDsKLQlzdHJ1Y3QgeGhjaV92aXJ0X2VwICp0ZW1wX2VwOwotCXN0cnVjdCB4aGNpX3JpbmcgKnJpbmc7Ci0Jc3RydWN0IHhoY2lfdGQgKmN1cl90ZDsKIAlpbnQgcmV0LCBpLCBqOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTk3NCwzNCArMTAzMCw4IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9IQ19TTE9UUzsgaSsrKSB7CiAJCWlmICgheGhjaS0+ZGV2c1tpXSkKIAkJCWNvbnRpbnVlOwotCQlmb3IgKGogPSAwOyBqIDwgMzE7IGorKykgewotCQkJdGVtcF9lcCA9ICZ4aGNpLT5kZXZzW2ldLT5lcHNbal07Ci0JCQlyaW5nID0gdGVtcF9lcC0+cmluZzsKLQkJCWlmICghcmluZykKLQkJCQljb250aW51ZTsKLQkJCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCi0JCQkJCSJLaWxsaW5nIFVSQnMgZm9yIHNsb3QgSUQgJXUsICIKLQkJCQkJImVwIGluZGV4ICV1IiwgaSwgaik7Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnRkX2xpc3QpKSB7Ci0JCQkJY3VyX3RkID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+dGRfbGlzdCwKLQkJCQkJCXN0cnVjdCB4aGNpX3RkLAotCQkJCQkJdGRfbGlzdCk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT50ZF9saXN0KTsKLQkJCQlpZiAoIWxpc3RfZW1wdHkoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpKQotCQkJCQlsaXN0X2RlbF9pbml0KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCQl4aGNpX2dpdmViYWNrX3VyYl9pbl9pcnEoeGhjaSwgY3VyX3RkLAotCQkJCQkJLUVTSFVURE9XTik7Ci0JCQl9Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRlbXBfZXAtPmNhbmNlbGxlZF90ZF9saXN0KSkgewotCQkJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoCi0JCQkJCQkmdGVtcF9lcC0+Y2FuY2VsbGVkX3RkX2xpc3QsCi0JCQkJCQlzdHJ1Y3QgeGhjaV90ZCwKLQkJCQkJCWNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCQlsaXN0X2RlbF9pbml0KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCQl4aGNpX2dpdmViYWNrX3VyYl9pbl9pcnEoeGhjaSwgY3VyX3RkLAotCQkJCQkJLUVTSFVURE9XTik7Ci0JCQl9Ci0JCX0KKwkJZm9yIChqID0gMDsgaiA8IDMxOyBqKyspCisJCQl4aGNpX2tpbGxfZW5kcG9pbnRfdXJicyh4aGNpLCBpLCBqKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwogCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCkBAIC0xMDczLDE3ICsxMTAzLDE4IEBACiAJdW5zaWduZWQgaW50IHN0cmVhbV9pZDsKIAlzdHJ1Y3QgeGhjaV9yaW5nICplcF9yaW5nOwogCXN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlICpkZXY7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7CiAJc3RydWN0IHhoY2lfZXBfY3R4ICplcF9jdHg7CiAJc3RydWN0IHhoY2lfc2xvdF9jdHggKnNsb3RfY3R4OwogCiAJZXBfaW5kZXggPSBUUkJfVE9fRVBfSU5ERVgobGUzMl90b19jcHUodHJiLT5nZW5lcmljLmZpZWxkWzNdKSk7CiAJc3RyZWFtX2lkID0gVFJCX1RPX1NUUkVBTV9JRChsZTMyX3RvX2NwdSh0cmItPmdlbmVyaWMuZmllbGRbMl0pKTsKIAlkZXYgPSB4aGNpLT5kZXZzW3Nsb3RfaWRdOworCWVwID0gJmRldi0+ZXBzW2VwX2luZGV4XTsKIAogCWVwX3JpbmcgPSB4aGNpX3N0cmVhbV9pZF90b19yaW5nKGRldiwgZXBfaW5kZXgsIHN0cmVhbV9pZCk7CiAJaWYgKCFlcF9yaW5nKSB7Ci0JCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgZGVxIHB0ciBjb21tYW5kIGZvciAiCi0JCQkJImZyZWVkIHN0cmVhbSBJRCAldVxuIiwKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBkZXEgcHRyIGNvbW1hbmQgZm9yIGZyZWVkIHN0cmVhbSBJRCAldVxuIiwKIAkJCQlzdHJlYW1faWQpOwogCQkvKiBYWFg6IEhhcm1sZXNzPz8/ICovCiAJCWRldi0+ZXBzW2VwX2luZGV4XS5lcF9zdGF0ZSAmPSB+U0VUX0RFUV9QRU5ESU5HOwpAQCAtMTA5OSwxMiArMTEzMCwxMCBAQAogCiAJCXN3aXRjaCAoY21kX2NvbXBfY29kZSkgewogCQljYXNlIENPTVBfVFJCX0VSUjoKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgaW52YWxpZCBiZWNhdXNlICIKLQkJCQkJIm9mIHN0cmVhbSBJRCBjb25maWd1cmF0aW9uXG4iKTsKKwkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgaW52YWxpZCBiZWNhdXNlIG9mIHN0cmVhbSBJRCBjb25maWd1cmF0aW9uXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTVBfQ1RYX1NUQVRFOgotCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCBmYWlsZWQgZHVlICIKLQkJCQkJInRvIGluY29ycmVjdCBzbG90IG9yIGVwIHN0YXRlLlxuIik7CisJCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIERlcSBQdHIgY21kIGZhaWxlZCBkdWUgdG8gaW5jb3JyZWN0IHNsb3Qgb3IgZXAgc3RhdGUuXG4iKTsKIAkJCWVwX3N0YXRlID0gbGUzMl90b19jcHUoZXBfY3R4LT5lcF9pbmZvKTsKIAkJCWVwX3N0YXRlICY9IEVQX1NUQVRFX01BU0s7CiAJCQlzbG90X3N0YXRlID0gbGUzMl90b19jcHUoc2xvdF9jdHgtPmRldl9zdGF0ZSk7CkBAIC0xMTE0LDEzICsxMTQzLDEyIEBACiAJCQkJCXNsb3Rfc3RhdGUsIGVwX3N0YXRlKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTVBfRUJBRFNMVDoKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgZmFpbGVkIGJlY2F1c2UgIgotCQkJCQkic2xvdCAldSB3YXMgbm90IGVuYWJsZWQuXG4iLCBzbG90X2lkKTsKKwkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgZmFpbGVkIGJlY2F1c2Ugc2xvdCAldSB3YXMgbm90IGVuYWJsZWQuXG4iLAorCQkJCQlzbG90X2lkKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCB3aXRoIHVua25vd24gIgotCQkJCQkiY29tcGxldGlvbiBjb2RlIG9mICV1LlxuIiwKLQkJCQkgIGNtZF9jb21wX2NvZGUpOworCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCB3aXRoIHVua25vd24gY29tcGxldGlvbiBjb2RlIG9mICV1LlxuIiwKKwkJCQkJY21kX2NvbXBfY29kZSk7CiAJCQlicmVhazsKIAkJfQogCQkvKiBPSyB3aGF0IGRvIHdlIGRvIG5vdz8gIFRoZSBlbmRwb2ludCBzdGF0ZSBpcyBob3NlZCwgYW5kIHdlCkBAIC0xMTMwLDIzICsxMTU4LDI4IEBACiAJCSAqIGNhbmNlbGxpbmcgVVJCcywgd2hpY2ggbWlnaHQgbm90IGJlIGFuIGVycm9yLi4uCiAJCSAqLwogCX0gZWxzZSB7CisJCXU2NCBkZXE7CisJCS8qIDQuNi4xMCBkZXEgcHRyIGlzIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBjdHggZm9yIHN0cmVhbXMgKi8KKwkJaWYgKGVwLT5lcF9zdGF0ZSAmIEVQX0hBU19TVFJFQU1TKSB7CisJCQlzdHJ1Y3QgeGhjaV9zdHJlYW1fY3R4ICpjdHggPQorCQkJCSZlcC0+c3RyZWFtX2luZm8tPnN0cmVhbV9jdHhfYXJyYXlbc3RyZWFtX2lkXTsKKwkJCWRlcSA9IGxlNjRfdG9fY3B1KGN0eC0+c3RyZWFtX3JpbmcpICYgU0NUWF9ERVFfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWRlcSA9IGxlNjRfdG9fY3B1KGVwX2N0eC0+ZGVxKSAmIH5FUF9DVFhfQ1lDTEVfTUFTSzsKKwkJfQogCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAotCQkJIlN1Y2Nlc3NmdWwgU2V0IFRSIERlcSBQdHIgY21kLCBkZXEgPSBAJTA4bGx4IiwKLQkJCSBsZTY0X3RvX2NwdShlcF9jdHgtPmRlcSkpOwotCQlpZiAoeGhjaV90cmJfdmlydF90b19kbWEoZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfc2VnLAotCQkJCQkgZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfcHRyKSA9PQotCQkgICAgKGxlNjRfdG9fY3B1KGVwX2N0eC0+ZGVxKSAmIH4oRVBfQ1RYX0NZQ0xFX01BU0spKSkgeworCQkJIlN1Y2Nlc3NmdWwgU2V0IFRSIERlcSBQdHIgY21kLCBkZXEgPSBAJTA4bGx4IiwgZGVxKTsKKwkJaWYgKHhoY2lfdHJiX3ZpcnRfdG9fZG1hKGVwLT5xdWV1ZWRfZGVxX3NlZywKKwkJCQkJIGVwLT5xdWV1ZWRfZGVxX3B0cikgPT0gZGVxKSB7CiAJCQkvKiBVcGRhdGUgdGhlIHJpbmcncyBkZXF1ZXVlIHNlZ21lbnQgYW5kIGRlcXVldWUgcG9pbnRlcgogCQkJICogdG8gcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uLgogCQkJICovCiAJCQl1cGRhdGVfcmluZ19mb3Jfc2V0X2RlcV9jb21wbGV0aW9uKHhoY2ksIGRldiwKIAkJCQllcF9yaW5nLCBlcF9pbmRleCk7CiAJCX0gZWxzZSB7Ci0JCQl4aGNpX3dhcm4oeGhjaSwgIk1pc21hdGNoIGJldHdlZW4gY29tcGxldGVkIFNldCBUUiBEZXEgIgotCQkJCQkiUHRyIGNvbW1hbmQgJiB4SENJIGludGVybmFsIHN0YXRlLlxuIik7CisJCQl4aGNpX3dhcm4oeGhjaSwgIk1pc21hdGNoIGJldHdlZW4gY29tcGxldGVkIFNldCBUUiBEZXEgUHRyIGNvbW1hbmQgJiB4SENJIGludGVybmFsIHN0YXRlLlxuIik7CiAJCQl4aGNpX3dhcm4oeGhjaSwgImVwIGRlcSBzZWcgPSAlcCwgZGVxIHB0ciA9ICVwXG4iLAotCQkJCQlkZXYtPmVwc1tlcF9pbmRleF0ucXVldWVkX2RlcV9zZWcsCi0JCQkJCWRldi0+ZXBzW2VwX2luZGV4XS5xdWV1ZWRfZGVxX3B0cik7CisJCQkJICBlcC0+cXVldWVkX2RlcV9zZWcsIGVwLT5xdWV1ZWRfZGVxX3B0cik7CiAJCX0KIAl9CiAKQEAgLTQwNzAsNiArNDEwMyw3IEBACiAJdTMyIHRyYl9zbG90X2lkID0gU0xPVF9JRF9GT1JfVFJCKHNsb3RfaWQpOwogCXUzMiB0cmJfZXBfaW5kZXggPSBFUF9JRF9GT1JfVFJCKGVwX2luZGV4KTsKIAl1MzIgdHJiX3N0cmVhbV9pZCA9IFNUUkVBTV9JRF9GT1JfVFJCKHN0cmVhbV9pZCk7CisJdTMyIHRyYl9zY3QgPSAwOwogCXUzMiB0eXBlID0gVFJCX1RZUEUoVFJCX1NFVF9ERVEpOwogCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKmVwOwogCkBAIC00MDg4LDcgKzQxMjIsOSBAQAogCX0KIAllcC0+cXVldWVkX2RlcV9zZWcgPSBkZXFfc2VnOwogCWVwLT5xdWV1ZWRfZGVxX3B0ciA9IGRlcV9wdHI7Ci0JcmV0dXJuIHF1ZXVlX2NvbW1hbmQoeGhjaSwgbG93ZXJfMzJfYml0cyhhZGRyKSB8IGN5Y2xlX3N0YXRlLAorCWlmIChzdHJlYW1faWQpCisJCXRyYl9zY3QgPSBTQ1RfRk9SX1RSQihTQ1RfUFJJX1RSKTsKKwlyZXR1cm4gcXVldWVfY29tbWFuZCh4aGNpLCBsb3dlcl8zMl9iaXRzKGFkZHIpIHwgdHJiX3NjdCB8IGN5Y2xlX3N0YXRlLAogCQkJdXBwZXJfMzJfYml0cyhhZGRyKSwgdHJiX3N0cmVhbV9pZCwKIAkJCXRyYl9zbG90X2lkIHwgdHJiX2VwX2luZGV4IHwgdHlwZSwgZmFsc2UpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCA5MjRhNmNjLi44ZmU0ZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtMzkwLDYgKzM5MCwxMCBAQAogCX0KIAogIGxlZ2FjeV9pcnE6CisJaWYgKCFzdHJsZW4oaGNkLT5pcnFfZGVzY3IpKQorCQlzbnByaW50ZihoY2QtPmlycV9kZXNjciwgc2l6ZW9mKGhjZC0+aXJxX2Rlc2NyKSwgIiVzOnVzYiVkIiwKKwkJCSBoY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24sIGhjZC0+c2VsZi5idXNudW0pOworCiAJLyogZmFsbCBiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHQqLwogCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgJnVzYl9oY2RfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCWhjZC0+aXJxX2Rlc2NyLCBoY2QpOwpAQCAtMjY3OCw2ICsyNjgyLDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgeGhjaV9jaGVja19id19kcm9wX2VwX3N0cmVhbXMoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCXN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlICp2ZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCA9ICZ2ZGV2LT5lcHNbaV07CisKKwlpZiAoZXAtPmVwX3N0YXRlICYgRVBfSEFTX1NUUkVBTVMpIHsKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBlbmRwb2ludCAweCUwMnggaGFzIHN0cmVhbXMgb24gc2V0X2ludGVyZmFjZSwgZnJlZWluZyBzdHJlYW1zLlxuIiwKKwkJCQl4aGNpX2dldF9lbmRwb2ludF9hZGRyZXNzKGkpKTsKKwkJeGhjaV9mcmVlX3N0cmVhbV9pbmZvKHhoY2ksIGVwLT5zdHJlYW1faW5mbyk7CisJCWVwLT5zdHJlYW1faW5mbyA9IE5VTEw7CisJCWVwLT5lcF9zdGF0ZSAmPSB+RVBfSEFTX1NUUkVBTVM7CisJfQorfQorCiAvKiBDYWxsZWQgYWZ0ZXIgb25lIG9yIG1vcmUgY2FsbHMgdG8geGhjaV9hZGRfZW5kcG9pbnQoKSBvcgogICogeGhjaV9kcm9wX2VuZHBvaW50KCkuICBJZiB0aGlzIGNhbGwgZmFpbHMsIHRoZSBVU0IgY29yZSBpcyBleHBlY3RlZAogICogdG8gY2FsbCB4aGNpX3Jlc2V0X2JhbmR3aWR0aCgpLgpAQCAtMjc0Miw4ICsyNzYwLDEwIEBACiAJLyogRnJlZSBhbnkgcmluZ3MgdGhhdCB3ZXJlIGRyb3BwZWQsIGJ1dCBub3QgY2hhbmdlZC4gKi8KIAlmb3IgKGkgPSAxOyBpIDwgMzE7ICsraSkgewogCQlpZiAoKGxlMzJfdG9fY3B1KGN0cmxfY3R4LT5kcm9wX2ZsYWdzKSAmICgxIDw8IChpICsgMSkpKSAmJgotCQkgICAgIShsZTMyX3RvX2NwdShjdHJsX2N0eC0+YWRkX2ZsYWdzKSAmICgxIDw8IChpICsgMSkpKSkKKwkJICAgICEobGUzMl90b19jcHUoY3RybF9jdHgtPmFkZF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkpIHsKIAkJCXhoY2lfZnJlZV9vcl9jYWNoZV9lbmRwb2ludF9yaW5nKHhoY2ksIHZpcnRfZGV2LCBpKTsKKwkJCXhoY2lfY2hlY2tfYndfZHJvcF9lcF9zdHJlYW1zKHhoY2ksIHZpcnRfZGV2LCBpKTsKKwkJfQogCX0KIAl4aGNpX3plcm9faW5fY3R4KHhoY2ksIHZpcnRfZGV2KTsKIAkvKgpAQCAtMjc1OSw2ICsyNzc5LDcgQEAKIAkJaWYgKHZpcnRfZGV2LT5lcHNbaV0ucmluZykgewogCQkJeGhjaV9mcmVlX29yX2NhY2hlX2VuZHBvaW50X3JpbmcoeGhjaSwgdmlydF9kZXYsIGkpOwogCQl9CisJCXhoY2lfY2hlY2tfYndfZHJvcF9lcF9zdHJlYW1zKHhoY2ksIHZpcnRfZGV2LCBpKTsKIAkJdmlydF9kZXYtPmVwc1tpXS5yaW5nID0gdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZzsKIAkJdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZyA9IE5VTEw7CiAJfQpAQCAtMjk1NCw3ICsyOTc1LDcgQEAKIAlyZXQgPSB4aGNpX2NoZWNrX2FyZ3MoeGhjaV90b19oY2QoeGhjaSksIHVkZXYsIGVwLCAxLCB0cnVlLCBfX2Z1bmNfXyk7CiAJaWYgKHJldCA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZXAtPnNzX2VwX2NvbXAuYm1BdHRyaWJ1dGVzID09IDApIHsKKwlpZiAodXNiX3NzX21heF9zdHJlYW1zKCZlcC0+c3NfZXBfY29tcCkgPT0gMCkgewogCQl4aGNpX3dhcm4oeGhjaSwgIldBUk46IFN1cGVyU3BlZWQgRW5kcG9pbnQgQ29tcGFuaW9uIgogCQkJCSIgZGVzY3JpcHRvciBmb3IgZXAgMHgleCBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbXNcbiIsCiAJCQkJZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CkBAIC0zMTIxLDYgKzMxNDIsMTIgQEAKIAl4aGNpX2RiZyh4aGNpLCAiRHJpdmVyIHdhbnRzICV1IHN0cmVhbSBJRHMgKGluY2x1ZGluZyBzdHJlYW0gMCkuXG4iLAogCQkJbnVtX3N0cmVhbXMpOwogCisJLyogTWF4UFNBU2l6ZSB2YWx1ZSAwICgyIHN0cmVhbXMpIG1lYW5zIHN0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoSENDX01BWF9QU0EoeGhjaS0+aGNjX3BhcmFtcykgPCA0KSB7CisJCXhoY2lfZGJnKHhoY2ksICJ4SENJIGNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBzdHJlYW1zLlxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKwogCWNvbmZpZ19jbWQgPSB4aGNpX2FsbG9jX2NvbW1hbmQoeGhjaSwgdHJ1ZSwgdHJ1ZSwgbWVtX2ZsYWdzKTsKIAlpZiAoIWNvbmZpZ19jbWQpIHsKIAkJeGhjaV9kYmcoeGhjaSwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB4SENJIGNvbW1hbmQgc3RydWN0dXJlLlxuIik7CkBAIC0zNTE5LDYgKzM1NDYsOCBAQAogCQlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCA9ICZ2aXJ0X2Rldi0+ZXBzW2ldOwogCiAJCWlmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgeworCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBlbmRwb2ludCAweCUwMnggaGFzIHN0cmVhbXMgb24gZGV2aWNlIHJlc2V0LCBmcmVlaW5nIHN0cmVhbXMuXG4iLAorCQkJCQl4aGNpX2dldF9lbmRwb2ludF9hZGRyZXNzKGkpKTsKIAkJCXhoY2lfZnJlZV9zdHJlYW1faW5mbyh4aGNpLCBlcC0+c3RyZWFtX2luZm8pOwogCQkJZXAtPnN0cmVhbV9pbmZvID0gTlVMTDsKIAkJCWVwLT5lcF9zdGF0ZSAmPSB+RVBfSEFTX1NUUkVBTVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCmluZGV4IDU4ZWQ5ZDAuLmQyODBlOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCkBAIC03MDMsNiArNzAzLDcgQEAKIAogLyogZGVxIGJpdG1hc2tzICovCiAjZGVmaW5lIEVQX0NUWF9DWUNMRV9NQVNLCQkoMSA8PCAwKQorI2RlZmluZSBTQ1RYX0RFUV9NQVNLCQkJKH4weGZMKQogCiAKIC8qKgpAQCAtMTExOCw5ICsxMTE5LDEwIEBACiAjZGVmaW5lIFRSQl9UT19TVVNQRU5EX1BPUlQocCkJCSgoKHApICYgKDEgPDwgMjMpKSA+PiAyMykKICNkZWZpbmUgTEFTVF9FUF9JTkRFWAkJCTMwCiAKLS8qIFNldCBUUiBEZXF1ZXVlIFBvaW50ZXIgY29tbWFuZCBUUkIgZmllbGRzICovCisvKiBTZXQgVFIgRGVxdWV1ZSBQb2ludGVyIGNvbW1hbmQgVFJCIGZpZWxkcywgNi40LjMuOSAqLwogI2RlZmluZSBUUkJfVE9fU1RSRUFNX0lEKHApCQkoKCgocCkgJiAoMHhmZmZmIDw8IDE2KSkgPj4gMTYpKQogI2RlZmluZSBTVFJFQU1fSURfRk9SX1RSQihwKQkJKCgoKHApKSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFNDVF9GT1JfVFJCKHApCQkJKCgocCkgPDwgMSkgJiAweDcpCiAKIAogLyogUG9ydCBTdGF0dXMgQ2hhbmdlIEV2ZW50IFRSQiBmaWVsZHMgKi8KQEAgLTEzNDEsNiArMTM0Myw3IEBACiAJdW5zaWduZWQgaW50CQludW1fdHJic19mcmVlX3RlbXA7CiAJZW51bSB4aGNpX3JpbmdfdHlwZQl0eXBlOwogCWJvb2wJCQlsYXN0X3RkX3dhc19zaG9ydDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290CSp0cmJfYWRkcmVzc19tYXA7CiB9OwogCiBzdHJ1Y3QgeGhjaV9lcnN0X2VudHJ5IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCBiYTVmNzBmLi4xYmNhMjc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwpAQCAtMTI4LDcgKzEyOCw2IEBACiAKIGNvbmZpZyBVU0JfRlRESV9FTEFOCiAJdHJpc3RhdGUgIkVsYW4gUENNQ0lBIENhcmRCdXMgQWRhcHRlciBVU0IgQ2xpZW50IgotCWRlZmF1bHQgTQogCWhlbHAKIAkgIEVMQU4ncyBVeHh4IHNlcmllcyBvZiBhZGFwdGVycyBhcmUgVVNCIHRvIFBDTUNJQSBDYXJkQnVzIGFkYXB0ZXJzLgogCSAgQ3VycmVudGx5IG9ubHkgdGhlIFUxMzIgYWRhcHRlciBpcyBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCmluZGV4IGRlOTg5MDYuLjA2YjVkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCkBAIC0yMTIzLDggKzIxMjMsOCBAQAogCXU4IHRtcDgsIHRtcDgyLCByYW10eXBlOwogCWludCBidyA9IDA7CiAJY2hhciAqcmFtdHlwZXRleHQxID0gTlVMTDsKLQljb25zdCBjaGFyICpyYW10eXBldGV4dDJbXSA9IHsJIlNEUiBTRFJBTSIsICJTRFIgU0dSQU0iLAotCQkJCQkiRERSIFNEUkFNIiwgIkREUiBTR1JBTSIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciByYW1fZGF0YXJhdGVbNF0gPSB7J1MnLCAnUycsICdEJywgJ0QnfTsKKwlzdGF0aWMgY29uc3QgY2hhciByYW1fZHluYW1pY3R5cGVbNF0gPSB7J0QnLCAnRycsICdEJywgJ0cnfTsKIAlzdGF0aWMgY29uc3QgaW50IGJ1c1NEUls0XSAgPSB7NjQsIDY0LCAxMjgsIDEyOH07CiAJc3RhdGljIGNvbnN0IGludCBidXNERFJbNF0gID0gezMyLCAzMiwgIDY0LCAgNjR9OwogCXN0YXRpYyBjb25zdCBpbnQgYnVzRERSQVs0XSA9IHs2NCszMiwgNjQrMzIgLCAoNjQrMzIpKjIsICg2NCszMikqMn07CkBAIC0yMTU2LDggKzIxNTYsMTAgQEAKIAkJYnJlYWs7CiAJfQogCi0JZGV2X2luZm8oJnNpc3VzYi0+c2lzdXNiX2Rldi0+ZGV2LCAiJWRNQiAlcyAlcywgYnVzIHdpZHRoICVkXG4iLCAoc2lzdXNiLT52cmFtc2l6ZSA+PiAyMCksIHJhbXR5cGV0ZXh0MSwKLQkJCXJhbXR5cGV0ZXh0MltyYW10eXBlXSwgYncpOworCisJZGV2X2luZm8oJnNpc3VzYi0+c2lzdXNiX2Rldi0+ZGV2LCAiJWRNQiAlcyAlY0RSIFMlY1JBTSwgYnVzIHdpZHRoICVkXG4iLAorCQkgc2lzdXNiLT52cmFtc2l6ZSA+PiAyMCwgcmFtdHlwZXRleHQxLAorCQkgcmFtX2RhdGFyYXRlW3JhbXR5cGVdLCByYW1fZHluYW1pY3R5cGVbcmFtdHlwZV0sIGJ3KTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGVkLmMKaW5kZXggNzhlYjRmZi4uYmRlZjBkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxlZC5jCkBAIC0yMiw4ICsyMiwyNyBAQAogZW51bSBsZWRfdHlwZSB7CiAJREVMQ09NX1ZJU1VBTF9TSUdOQUxfSU5ESUNBVE9SLAogCURSRUFNX0NIRUVLWV9XRUJNQUlMX05PVElGSUVSLAorCVJJU09fS0FHQUtVX0xFRAogfTsKIAorLyogdGhlIFdlYm1haWwgTEVEIG1hZGUgYnkgUklTTyBLQUdBS1UgQ09SUC4gZGVjb2RlcyBhIGNvbG9yIGluZGV4CisgICBpbnRlcm5hbGx5LCB3ZSB3YW50IHRvIGtlZXAgdGhlIHJlZCtncmVlbitibHVlIHN5c2ZzIGFwaSwgc28gd2UgZGVjb2RlCisgICBmcm9tIDEtYml0IFJHQiB0byB0aGUgcmlzbyBrYWdha3UgY29sb3IgaW5kZXggYWNjb3JkaW5nIHRvIHRoaXMgdGFibGUuLi4gKi8KKworc3RhdGljIHVuc2lnbmVkIGNvbnN0IGNoYXIgcmlzb19rYWdha3VfdGJsW10gPSB7CisvKiBSKzJHKzRCIC0+IHJpc28ga2FnYWt1IGNvbG9yIGluZGV4ICovCisJWzBdID0gMCwgLyogYmxhY2sgICAqLworCVsxXSA9IDIsIC8qIHJlZCAgICAgKi8KKwlbMl0gPSAxLCAvKiBncmVlbiAgICovCisJWzNdID0gNSwgLyogeWVsbG93ICAqLworCVs0XSA9IDMsIC8qIGJsdWUgICAgKi8KKwlbNV0gPSA2LCAvKiBtYWdlbnRhICovCisJWzZdID0gNCwgLyogY3lhbiAgICAqLworCVs3XSA9IDcgIC8qIHdoaXRlICAgKi8KK307CisKKyNkZWZpbmUgUklTT19LQUdBS1VfSVgocixnLGIpIHJpc29fa2FnYWt1X3RibFsoKHIpPzE6MCkrKChnKT8yOjApKygoYik/NDowKV0KKwogLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CiAJeyBVU0JfREVWSUNFKDB4MGZjNSwgMHgxMjIzKSwKQEAgLTMyLDYgKzUxLDggQEAKIAkJCS5kcml2ZXJfaW5mbyA9IERSRUFNX0NIRUVLWV9XRUJNQUlMX05PVElGSUVSIH0sCiAJeyBVU0JfREVWSUNFKDB4MWQzNCwgMHgwMDBhKSwKIAkJCS5kcml2ZXJfaW5mbyA9IERSRUFNX0NIRUVLWV9XRUJNQUlMX05PVElGSUVSIH0sCisJeyBVU0JfREVWSUNFKDB4MTI5NCwgMHgxMzIwKSwKKwkJCS5kcml2ZXJfaW5mbyA9IFJJU09fS0FHQUtVX0xFRCB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOwpAQCAtNDgsNiArNjksNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlpbnQgYWN0bGVuZ3RoOwogCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewpAQCAtMTA0LDYgKzEyNiwxOCBAQAogCQkJCQkyMDAwKTsKIAkJYnJlYWs7CiAKKwljYXNlIFJJU09fS0FHQUtVX0xFRDoKKwkJYnVmZmVyWzBdID0gUklTT19LQUdBS1VfSVgobGVkLT5yZWQsIGxlZC0+Z3JlZW4sIGxlZC0+Ymx1ZSk7CisJCWJ1ZmZlclsxXSA9IDA7CisJCWJ1ZmZlclsyXSA9IDA7CisJCWJ1ZmZlclszXSA9IDA7CisJCWJ1ZmZlcls0XSA9IDA7CisKKwkJcmV0dmFsID0gdXNiX2ludGVycnVwdF9tc2cobGVkLT51ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGxlZC0+dWRldiwgMiksCisJCQlidWZmZXIsIDUsICZhY3RsZW5ndGgsIDEwMDAgLyptcyB0aW1lb3V0Ki8pOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoJmxlZC0+dWRldi0+ZGV2LCAidW5rbm93biBkZXZpY2UgdHlwZSAlZFxuIiwgbGVkLT50eXBlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggNjg4ZGM4Yi4uOGI3ODk3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKQEAgLTQzLDYgKzQzLDcgQEAKIGNvbmZpZyBVU0JfTVVTQl9HQURHRVQKIAlib29sICJHYWRnZXQgb25seSBtb2RlIgogCWRlcGVuZHMgb24gVVNCX0dBREdFVD15IHx8IFVTQl9HQURHRVQ9VVNCX01VU0JfSERSQworCWRlcGVuZHMgb24gSEFTX0RNQQogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIHdoZW4geW91IHdhbnQgdG8gdXNlIE1VU0IgaW4gZ2FkZ2V0IG1vZGUgb25seSwKIAkgIHRoZXJlYnkgdGhlIGhvc3QgZmVhdHVyZSB3aWxsIGJlIHJlZ3Jlc3NlZC4KQEAgLTUwLDYgKzUxLDcgQEAKIGNvbmZpZyBVU0JfTVVTQl9EVUFMX1JPTEUKIAlib29sICJEdWFsIFJvbGUgbW9kZSIKIAlkZXBlbmRzIG9uICgoVVNCPXkgfHwgVVNCPVVTQl9NVVNCX0hEUkMpICYmIChVU0JfR0FER0VUPXkgfHwgVVNCX0dBREdFVD1VU0JfTVVTQl9IRFJDKSkKKwlkZXBlbmRzIG9uIEhBU19ETUEKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUgb2Ygd29ya2luZyBvZiBNVVNCIGNvbnRyb2xsZXIgd2hlcmUKIAkgIGJvdGggaG9zdCBhbmQgZ2FkZ2V0IGZlYXR1cmVzIGFyZSBlbmFibGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggMjM5YWQwYi4uMDc1NzY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC00MzgsNyArNDM4LDYgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtdXNiX3N0YWdlMF9pcnEoc3RydWN0IG11c2IgKm11c2IsIHU4IGludF91c2IsCiAJCQkJdTggZGV2Y3RsKQogewotCXN0cnVjdCB1c2Jfb3RnICpvdGcgPSBtdXNiLT54Y2Vpdi0+b3RnOwogCWlycXJldHVybl90IGhhbmRsZWQgPSBJUlFfTk9ORTsKIAogCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIjw9PSBEZXZDdGw9JTAyeCwgaW50X3VzYj0weCV4XG4iLCBkZXZjdGwsCkBAIC02NTYsNyArNjU1LDcgQEAKIAkJCQlicmVhazsKIAkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgogCQkJbXVzYl9nX3N1c3BlbmQobXVzYik7Ci0JCQltdXNiLT5pc19hY3RpdmUgPSBvdGctPmdhZGdldC0+Yl9obnBfZW5hYmxlOworCQkJbXVzYi0+aXNfYWN0aXZlID0gbXVzYi0+Zy5iX2hucF9lbmFibGU7CiAJCQlpZiAobXVzYi0+aXNfYWN0aXZlKSB7CiAJCQkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0JfV0FJVF9BQ09OOwogCQkJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIkhOUDogU2V0dGluZyB0aW1lciBmb3IgYl9hc2UwX2Jyc3RcbiIpOwpAQCAtNjcyLDcgKzY3MSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgogCQkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0FfU1VTUEVORDsKLQkJCW11c2ItPmlzX2FjdGl2ZSA9IG90Zy0+aG9zdC0+Yl9obnBfZW5hYmxlOworCQkJbXVzYi0+aXNfYWN0aXZlID0gbXVzYi0+aGNkLT5zZWxmLmJfaG5wX2VuYWJsZTsKIAkJCWJyZWFrOwogCQljYXNlIE9UR19TVEFURV9CX0hPU1Q6CiAJCQkvKiBUcmFuc2l0aW9uIHRvIEJfUEVSSVBIRVJBTCwgc2VlIDYuOC4yLjYgcCA0NCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NwcGk0MS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NwcGk0MS5jCmluZGV4IGY4ODkyOTYuLjdiOGJiZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jcHBpNDEuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY3BwaTQxLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAl1MzIgdHJhbnNmZXJyZWQ7CiAJdTMyIHBhY2tldF9zejsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHR4X2NoZWNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBkbWFfY29tcGxldGlvbjsKIH07CiAKICNkZWZpbmUgTVVTQl9ETUFfTlVNX0NIQU5ORUxTIDE1CkBAIC0xMTIsNiArMTEzLDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIGlzX2lzb2Moc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCBib29sIGluKQoreworCWlmIChpbiAmJiBod19lcC0+aW5fcWgpIHsKKwkJaWYgKGh3X2VwLT5pbl9xaC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIGlmIChod19lcC0+b3V0X3FoKSB7CisJCWlmIChod19lcC0+b3V0X3FoLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZCBjcHBpNDFfZG1hX2NhbGxiYWNrKHZvaWQgKnByaXZhdGVfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIGNwcGk0MV90cmFuc19kb25lKHN0cnVjdCBjcHBpNDFfZG1hX2NoYW5uZWwgKmNwcGk0MV9jaGFubmVsKQpAQCAtMTE5LDcgKzEzMiw4IEBACiAJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwOwogCXN0cnVjdCBtdXNiICptdXNiID0gaHdfZXAtPm11c2I7CiAKLQlpZiAoIWNwcGk0MV9jaGFubmVsLT5wcm9nX2xlbikgeworCWlmICghY3BwaTQxX2NoYW5uZWwtPnByb2dfbGVuIHx8CisJICAgIChjcHBpNDFfY2hhbm5lbC0+Y2hhbm5lbC5zdGF0dXMgPT0gTVVTQl9ETUFfU1RBVFVTX0ZSRUUpKSB7CiAKIAkJLyogZG9uZSwgY29tcGxldGUgKi8KIAkJY3BwaTQxX2NoYW5uZWwtPmNoYW5uZWwuYWN0dWFsX2xlbiA9CkBAIC0xNjUsNiArMTc5LDMyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBjcHBpX3RyYW5zX2RvbmVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsICpjcHBpNDFfY2hhbm5lbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsLCBkbWFfY29tcGxldGlvbik7CisJc3RydWN0IGNwcGk0MV9kbWFfY29udHJvbGxlciAqY29udHJvbGxlciA9IGNwcGk0MV9jaGFubmVsLT5jb250cm9sbGVyOworCXN0cnVjdCBtdXNiICptdXNiID0gY29udHJvbGxlci0+bXVzYjsKKwlzdHJ1Y3QgbXVzYl9od19lcCAqaHdfZXAgPSBjcHBpNDFfY2hhbm5lbC0+aHdfZXA7CisJYm9vbCBlbXB0eTsKKworCWlmICghY3BwaTQxX2NoYW5uZWwtPmlzX3R4ICYmIGlzX2lzb2MoaHdfZXAsIDEpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisJCWNwcGk0MV90cmFuc19kb25lKGNwcGk0MV9jaGFubmVsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCWVtcHR5ID0gbXVzYl9pc190eF9maWZvX2VtcHR5KGh3X2VwKTsKKwkJaWYgKGVtcHR5KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCQkJY3BwaTQxX3RyYW5zX2RvbmUoY3BwaTQxX2NoYW5uZWwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc2NoZWR1bGVfd29yaygmY3BwaTQxX2NoYW5uZWwtPmRtYV9jb21wbGV0aW9uKTsKKwkJfQorCX0KK30KKwogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGNwcGk0MV9yZWNoZWNrX3R4X3JlcShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJc3RydWN0IGNwcGk0MV9kbWFfY29udHJvbGxlciAqY29udHJvbGxlcjsKQEAgLTIyOCw2ICsyNjgsMTQgQEAKIAkJCXRyYW5zZmVycmVkIDwgY3BwaTQxX2NoYW5uZWwtPnBhY2tldF9zeikKIAkJY3BwaTQxX2NoYW5uZWwtPnByb2dfbGVuID0gMDsKIAorCWlmICghY3BwaTQxX2NoYW5uZWwtPmlzX3R4KSB7CisJCWlmIChpc19pc29jKGh3X2VwLCAxKSkKKwkJCXNjaGVkdWxlX3dvcmsoJmNwcGk0MV9jaGFubmVsLT5kbWFfY29tcGxldGlvbik7CisJCWVsc2UKKwkJCWNwcGk0MV90cmFuc19kb25lKGNwcGk0MV9jaGFubmVsKTsKKwkJZ290byBvdXQ7CisJfQorCiAJZW1wdHkgPSBtdXNiX2lzX3R4X2ZpZm9fZW1wdHkoaHdfZXApOwogCWlmIChlbXB0eSkgewogCQljcHBpNDFfdHJhbnNfZG9uZShjcHBpNDFfY2hhbm5lbCk7CkBAIC0yNjQsNiArMzEyLDEwIEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KKwkJaWYgKGlzX2lzb2MoaHdfZXAsIDApKSB7CisJCQlzY2hlZHVsZV93b3JrKCZjcHBpNDFfY2hhbm5lbC0+ZG1hX2NvbXBsZXRpb24pOworCQkJZ290byBvdXQ7CisJCX0KIAkJbGlzdF9hZGRfdGFpbCgmY3BwaTQxX2NoYW5uZWwtPnR4X2NoZWNrLAogCQkJCSZjb250cm9sbGVyLT5lYXJseV90eF9saXN0KTsKIAkJaWYgKCFocnRpbWVyX2FjdGl2ZSgmY29udHJvbGxlci0+ZWFybHlfdHgpKSB7CkBAIC00NDgsMTIgKzUwMCwyNSBAQAogCQkJCWRtYV9hZGRyX3QgZG1hX2FkZHIsIHUzMiBsZW4pCiB7CiAJaW50IHJldDsKKwlzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsICpjcHBpNDFfY2hhbm5lbCA9IGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlpbnQgaGJfbXVsdCA9IDA7CiAKIAlCVUdfT04oY2hhbm5lbC0+c3RhdHVzID09IE1VU0JfRE1BX1NUQVRVU19VTktOT1dOIHx8CiAJCWNoYW5uZWwtPnN0YXR1cyA9PSBNVVNCX0RNQV9TVEFUVVNfQlVTWSk7CiAKKwlpZiAoaXNfaG9zdF9hY3RpdmUoY3BwaTQxX2NoYW5uZWwtPmNvbnRyb2xsZXItPm11c2IpKSB7CisJCWlmIChjcHBpNDFfY2hhbm5lbC0+aXNfdHgpCisJCQloYl9tdWx0ID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwLT5vdXRfcWgtPmhiX211bHQ7CisJCWVsc2UKKwkJCWhiX211bHQgPSBjcHBpNDFfY2hhbm5lbC0+aHdfZXAtPmluX3FoLT5oYl9tdWx0OworCX0KKwogCWNoYW5uZWwtPnN0YXR1cyA9IE1VU0JfRE1BX1NUQVRVU19CVVNZOwogCWNoYW5uZWwtPmFjdHVhbF9sZW4gPSAwOworCisJaWYgKGhiX211bHQpCisJCXBhY2tldF9zeiA9IGhiX211bHQgKiAocGFja2V0X3N6ICYgMHg3RkYpOworCiAJcmV0ID0gY3BwaTQxX2NvbmZpZ3VyZV9jaGFubmVsKGNoYW5uZWwsIHBhY2tldF9zeiwgbW9kZSwgZG1hX2FkZHIsIGxlbik7CiAJaWYgKCFyZXQpCiAJCWNoYW5uZWwtPnN0YXR1cyA9IE1VU0JfRE1BX1NUQVRVU19GUkVFOwpAQCAtNjA3LDYgKzY3Miw4IEBACiAJCWNwcGk0MV9jaGFubmVsLT5wb3J0X251bSA9IHBvcnQ7CiAJCWNwcGk0MV9jaGFubmVsLT5pc190eCA9IGlzX3R4OwogCQlJTklUX0xJU1RfSEVBRCgmY3BwaTQxX2NoYW5uZWwtPnR4X2NoZWNrKTsKKwkJSU5JVF9XT1JLKCZjcHBpNDFfY2hhbm5lbC0+ZG1hX2NvbXBsZXRpb24sCisJCQkgIGNwcGlfdHJhbnNfZG9uZV93b3JrKTsKIAogCQltdXNiX2RtYSA9ICZjcHBpNDFfY2hhbm5lbC0+Y2hhbm5lbDsKIAkJbXVzYl9kbWEtPnByaXZhdGVfZGF0YSA9IGNwcGk0MV9jaGFubmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKaW5kZXggN2ExMDllYS4uMzM3MmRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL29mLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXVzYl9kc3BzX29mX21hdGNoW107CkBAIC0xMzYsNiArMTM4LDI2IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWVyOyAgICAvKiBsYXN0IHRpbWVyIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KIAogCXN0cnVjdCBkc3BzX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgZGVidWdmc19yZWdzZXQzMiByZWdzZXQ7CisJc3RydWN0IGRlbnRyeSAqZGJnZnNfcm9vdDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdmc19yZWczMiBkc3BzX211c2JfcmVnc1tdID0geworCXsgInJldmlzaW9uIiwJCTB4MDAgfSwKKwl7ICJjb250cm9sIiwJCTB4MTQgfSwKKwl7ICJzdGF0dXMiLAkJMHgxOCB9LAorCXsgImVvaSIsCQkweDI0IH0sCisJeyAiaW50cjBfc3RhdCIsCQkweDMwIH0sCisJeyAiaW50cjFfc3RhdCIsCQkweDM0IH0sCisJeyAiaW50cjBfc2V0IiwJCTB4MzggfSwKKwl7ICJpbnRyMV9zZXQiLAkJMHgzYyB9LAorCXsgInR4bW9kZSIsCQkweDcwIH0sCisJeyAicnhtb2RlIiwJCTB4NzQgfSwKKwl7ICJhdXRvcmVxIiwJCTB4ZDAgfSwKKwl7ICJzcnBmaXh0aW1lIiwJCTB4ZDQgfSwKKwl7ICJ0ZG93biIsCQkweGQ4IH0sCisJeyAicGh5X3V0bWkiLAkJMHhlMCB9LAorCXsgIm1vZGUiLAkJMHhlOCB9LAogfTsKIAogc3RhdGljIHZvaWQgZHNwc19tdXNiX3RyeV9pZGxlKHN0cnVjdCBtdXNiICptdXNiLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC0zNjgsNiArMzkwLDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBkc3BzX211c2JfZGJnX2luaXQoc3RydWN0IG11c2IgKm11c2IsIHN0cnVjdCBkc3BzX2dsdWUgKmdsdWUpCit7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpmaWxlOworCWNoYXIgYnVmWzEyOF07CisKKwlzcHJpbnRmKGJ1ZiwgIiVzLmRzcHMiLCBkZXZfbmFtZShtdXNiLT5jb250cm9sbGVyKSk7CisJcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihidWYsIE5VTEwpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2x1ZS0+ZGJnZnNfcm9vdCA9IHJvb3Q7CisKKwlnbHVlLT5yZWdzZXQucmVncyA9IGRzcHNfbXVzYl9yZWdzOworCWdsdWUtPnJlZ3NldC5ucmVncyA9IEFSUkFZX1NJWkUoZHNwc19tdXNiX3JlZ3MpOworCWdsdWUtPnJlZ3NldC5iYXNlID0gbXVzYi0+Y3RybF9iYXNlOworCisJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX3JlZ3NldDMyKCJyZWdkdW1wIiwgU19JUlVHTywgcm9vdCwgJmdsdWUtPnJlZ3NldCk7CisJaWYgKCFmaWxlKSB7CisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShyb290KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRzcHNfbXVzYl9pbml0KHN0cnVjdCBtdXNiICptdXNiKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7CkBAIC0zNzcsNiArNDIzLDcgQEAKIAl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1MzIgcmV2LCB2YWw7CisJaW50IHJldDsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBhcmVudCwgSU9SRVNPVVJDRV9NRU0sICJjb250cm9sIik7CiAJaWYgKCFyKQpAQCAtNDEwLDYgKzQ1NywxMCBAQAogCXZhbCAmPSB+KDEgPDwgd3JwLT5vdGdfZGlzYWJsZSk7CiAJZHNwc193cml0ZWwobXVzYi0+Y3RybF9iYXNlLCB3cnAtPnBoeV91dG1pLCB2YWwpOwogCisJcmV0ID0gZHNwc19tdXNiX2RiZ19pbml0KG11c2IsIGdsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjE2LDcgKzY2Nyw3IEBACiAJd3JwID0gbWF0Y2gtPmRhdGE7CiAKIAkvKiBhbGxvY2F0ZSBnbHVlICovCi0JZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CisJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdsdWUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGdsdWUgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02NDQsNyArNjk1LDYgQEAKIAlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKIGVycjI6CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWtmcmVlKGdsdWUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY1Nyw3ICs3MDcsOSBAQAogCS8qIGRpc2FibGUgdXNic3MgY2xvY2tzICovCiAJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWtmcmVlKGdsdWUpOworCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGdsdWUtPmRiZ2ZzX3Jvb3QpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IGFiYjM4YzMuLmViMDYyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtMTY5NCw3ICsxNjk0LDggQEAKIAkJCXwgTVVTQl9SWENTUl9SWFBLVFJEWSk7CiAJCW11c2Jfd3JpdGV3KGh3X2VwLT5yZWdzLCBNVVNCX1JYQ1NSLCB2YWwpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0lOVkVOVFJBX0RNQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1VYNTAwX0RNQSkKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfVVg1MDBfRE1BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUEk0MV9ETUEpCiAJCWlmICh1c2JfcGlwZWlzb2MocGlwZSkpIHsKIAkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpkOwogCkBAIC0xNzA3LDEwICsxNzA4LDMwIEBACiAJCQlpZiAoZC0+c3RhdHVzICE9IC1FSUxTRVEgJiYgZC0+c3RhdHVzICE9IC1FT1ZFUkZMT1cpCiAJCQkJZC0+c3RhdHVzID0gMDsKIAotCQkJaWYgKCsrcWgtPmlzb19pZHggPj0gdXJiLT5udW1iZXJfb2ZfcGFja2V0cykKKwkJCWlmICgrK3FoLT5pc29faWR4ID49IHVyYi0+bnVtYmVyX29mX3BhY2tldHMpIHsKIAkJCQlkb25lID0gdHJ1ZTsKLQkJCWVsc2UKKwkJCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUEk0MV9ETUEpCisJCQkJc3RydWN0IGRtYV9jb250cm9sbGVyICAgKmM7CisJCQkJZG1hX2FkZHJfdCAqYnVmOworCQkJCXUzMiBsZW5ndGgsIHJldDsKKworCQkJCWMgPSBtdXNiLT5kbWFfY29udHJvbGxlcjsKKwkJCQlidWYgPSAodm9pZCAqKQorCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW3FoLT5pc29faWR4XS5vZmZzZXQKKwkJCQkJKyAodTMyKXVyYi0+dHJhbnNmZXJfZG1hOworCisJCQkJbGVuZ3RoID0KKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1txaC0+aXNvX2lkeF0ubGVuZ3RoOworCisJCQkJdmFsIHw9IE1VU0JfUlhDU1JfRE1BRU5BQjsKKwkJCQltdXNiX3dyaXRldyhod19lcC0+cmVncywgTVVTQl9SWENTUiwgdmFsKTsKKworCQkJCXJldCA9IGMtPmNoYW5uZWxfcHJvZ3JhbShkbWEsIHFoLT5tYXhwYWNrZXQsCisJCQkJCQkwLCAodTMyKSBidWYsIGxlbmd0aCk7CisjZW5kaWYKIAkJCQlkb25lID0gZmFsc2U7CisJCQl9CiAKIAkJfSBlbHNlICB7CiAJCS8qIGRvbmUgaWYgdXJiIGJ1ZmZlciBpcyBmdWxsIG9yIHNob3J0IHBhY2tldCBpcyByZWNkICovCkBAIC0xNzUwLDcgKzE3NzEsOCBAQAogCQl9CiAKIAkJLyogd2UgYXJlIGV4cGVjdGluZyBJTiBwYWNrZXRzICovCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0lOVkVOVFJBX0RNQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1VYNTAwX0RNQSkKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfVVg1MDBfRE1BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUEk0MV9ETUEpCiAJCWlmIChkbWEpIHsKIAkJCXN0cnVjdCBkbWFfY29udHJvbGxlcgkqYzsKIAkJCXUxNgkJCXJ4X2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCmluZGV4IDhhYTU5YTIuLmQzNDFjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLW9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF9jb250cm9sX3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgIm11c2JfY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L0tjb25maWcgYi9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZwppbmRleCA3ZDE0NTFkLi40MTZlMGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZwpAQCAtNzUsMjcgKzc1LDYgQEAKIAkgIGJ1aWx0LWluIHdpdGggdXNiIGlwIG9yIHdoaWNoIGFyZSBhdXRvbm9tb3VzIGFuZCBkb2Vzbid0IHJlcXVpcmUgYW55CiAJICBwaHkgcHJvZ3JhbW1pbmcgc3VjaCBhcyBJU1AxeDA0IGV0Yy4KIAotY29uZmlnIE9NQVBfQ09OVFJPTF9VU0IKLQl0cmlzdGF0ZSAiT01BUCBDT05UUk9MIFVTQiBEcml2ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyB8fCBDT01QSUxFX1RFU1QKLQloZWxwCi0JICBFbmFibGUgdGhpcyB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIFVTQiBwYXJ0IHByZXNlbnQgaW4gdGhlIGNvbnRyb2wKLQkgIG1vZHVsZS4gVGhpcyBkcml2ZXIgaGFzIEFQSSB0byBwb3dlciBvbiB0aGUgVVNCMiBQSFkgYW5kIHRvIHdyaXRlIHRvCi0JICB0aGUgbWFpbGJveC4gVGhlIG1haWxib3ggaXMgcHJlc2VudCBvbmx5IGluIG9tYXA0IGFuZCB0aGUgcmVnaXN0ZXIgdG8KLQkgIHBvd2VyIG9uIHRoZSBVU0IyIFBIWSBpcyBwcmVzZW50IGluIE9NQVA0IGFuZCBPTUFQNS4gT01BUDUgaGFzIGFuCi0JICBhZGRpdGlvbmFsIHJlZ2lzdGVyIHRvIHBvd2VyIG9uIFVTQjMgUEhZLgotCi1jb25maWcgT01BUF9VU0IzCi0JdHJpc3RhdGUgIk9NQVAgVVNCMyBQSFkgRHJpdmVyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUCi0Jc2VsZWN0IE9NQVBfQ09OVFJPTF9VU0IKLQlzZWxlY3QgVVNCX1BIWQotCWhlbHAKLQkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFVTQjMgUEhZIHRoYXQgaXMgcGFydCBvZiBTT0MuIFRoaXMKLQkgIGRyaXZlciB0YWtlcyBjYXJlIG9mIGFsbCB0aGUgUEhZIGZ1bmN0aW9uYWxpdHkgYXBhcnQgZnJvbSBjb21wYXJhdG9yLgotCSAgVGhpcyBkcml2ZXIgaW50ZXJhY3RzIHdpdGggdGhlICJPTUFQIENvbnRyb2wgVVNCIERyaXZlciIgdG8gcG93ZXIKLQkgIG9uL29mZiB0aGUgUEhZLgotCiBjb25maWcgQU0zMzVYX0NPTlRST0xfVVNCCiAJdHJpc3RhdGUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L01ha2VmaWxlIGIvZHJpdmVycy91c2IvcGh5L01ha2VmaWxlCmluZGV4IGJlNThhZGEuLmY4ZmE3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9waHkvTWFrZWZpbGUKQEAgLTEzLDExICsxMyw5IEBACiBvYmotJChDT05GSUdfTVZfVTNEX1BIWSkJCSs9IHBoeS1tdi11M2QtdXNiLm8KIG9iai0kKENPTkZJR19OT1BfVVNCX1hDRUlWKQkJKz0gcGh5LWdlbmVyaWMubwogb2JqLSQoQ09ORklHX1RBSFZPX1VTQikJCQkrPSBwaHktdGFodm8ubwotb2JqLSQoQ09ORklHX09NQVBfQ09OVFJPTF9VU0IpCQkrPSBwaHktb21hcC1jb250cm9sLm8KIG9iai0kKENPTkZJR19BTTMzNVhfQ09OVFJPTF9VU0IpCSs9IHBoeS1hbTMzNXgtY29udHJvbC5vCiBvYmotJChDT05GSUdfQU0zMzVYX1BIWV9VU0IpCQkrPSBwaHktYW0zMzV4Lm8KIG9iai0kKENPTkZJR19PTUFQX09URykJCQkrPSBwaHktb21hcC1vdGcubwotb2JqLSQoQ09ORklHX09NQVBfVVNCMykJCQkrPSBwaHktb21hcC11c2IzLm8KIG9iai0kKENPTkZJR19TQU1TVU5HX1VTQlBIWSkJCSs9IHBoeS1zYW1zdW5nLXVzYi5vCiBvYmotJChDT05GSUdfU0FNU1VOR19VU0IyUEhZKQkJKz0gcGh5LXNhbXN1bmctdXNiMi5vCiBvYmotJChDT05GSUdfU0FNU1VOR19VU0IzUEhZKQkJKz0gcGh5LXNhbXN1bmctdXNiMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LWZzbS11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZnNtLXVzYi5jCmluZGV4IDdhYTMxNGUuLmM0N2U1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktZnNtLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZnNtLXVzYi5jCkBAIC0zMTcsMTAgKzMxNywxMiBAQAogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1dBSVRfVkZBTEwpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX0hPU1Q6Ci0JCWlmICgoIWZzbS0+YV9idXNfcmVxIHx8IGZzbS0+YV9zdXNwZW5kX3JlcV9pbmYpICYmCisJCWlmIChmc20tPmlkIHx8IGZzbS0+YV9idXNfZHJvcCkKKwkJCW90Z19zZXRfc3RhdGUoZnNtLCBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMKTsKKwkJZWxzZSBpZiAoKCFmc20tPmFfYnVzX3JlcSB8fCBmc20tPmFfc3VzcGVuZF9yZXFfaW5mKSAmJgogCQkJCWZzbS0+b3RnLT5ob3N0LT5iX2hucF9lbmFibGUpCiAJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfU1VTUEVORCk7Ci0JCWVsc2UgaWYgKGZzbS0+aWQgfHwgIWZzbS0+Yl9jb25uIHx8IGZzbS0+YV9idXNfZHJvcCkKKwkJZWxzZSBpZiAoIWZzbS0+Yl9jb25uKQogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1dBSVRfQkNPTik7CiAJCWVsc2UgaWYgKCFmc20tPmFfdmJ1c192bGQpCiAJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfVkJVU19FUlIpOwpAQCAtMzQ2LDggKzM0OCw3IEBACiAJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfVkJVU19FUlIpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX1dBSVRfVkZBTEw6Ci0JCWlmIChmc20tPmFfd2FpdF92ZmFsbF90bW91dCB8fCBmc20tPmlkIHx8IGZzbS0+YV9idXNfcmVxIHx8Ci0JCQkJKCFmc20tPmFfc2Vzc192bGQgJiYgIWZzbS0+Yl9jb25uKSkKKwkJaWYgKGZzbS0+YV93YWl0X3ZmYWxsX3Rtb3V0KQogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX0lETEUpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX1ZCVVNfRVJSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tdXNiLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYwppbmRleCBkMjA0Zjc0Li41YjM3YjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYwpAQCAtMTQyOCw3ICsxNDI4LDggQEAKIAltb3RnLT5waHkub3RnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9vdGcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1vdGctPnBoeS5vdGcpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG1zbV9vdGdcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX21vdGc7CiAJfQogCiAJbW90Zy0+cGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYwppbmRleCBiNDI4OTdiLi5jNDJiZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAxMiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTItMjAxMyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcmVrIFZhc3V0IDxtYXJleEBkZW54LmRlPgogICogb24gYmVoYWxmIG9mIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSAogICoKQEAgLTIwLDYgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJteHNfcGh5IgogCkBAIC0yOCwxOCArMzEsMTM0IEBACiAjZGVmaW5lIEhXX1VTQlBIWV9DVFJMX1NFVAkJCTB4MzQKICNkZWZpbmUgSFdfVVNCUEhZX0NUUkxfQ0xSCQkJMHgzOAogCisjZGVmaW5lIEhXX1VTQlBIWV9ERUJVR19TRVQJCQkweDU0CisjZGVmaW5lIEhXX1VTQlBIWV9ERUJVR19DTFIJCQkweDU4CisKKyNkZWZpbmUgSFdfVVNCUEhZX0lQCQkJCTB4OTAKKyNkZWZpbmUgSFdfVVNCUEhZX0lQX1NFVAkJCTB4OTQKKyNkZWZpbmUgSFdfVVNCUEhZX0lQX0NMUgkJCTB4OTgKKwogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9TRlRSU1QJCQlCSVQoMzEpCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0NMS0dBVEUJCQlCSVQoMzApCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOQVVUT1NFVF9VU0JDTEtTCUJJVCgyNikKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX1VTQkNMS0dBVEUJQklUKDI1KQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTlZCVVNDSEdfV0tVUAkJQklUKDIzKQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTklEQ0hHX1dLVVAJCUJJVCgyMikKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5EUERNQ0hHX1dLVVAJCUJJVCgyMSkKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX1BIWV9QV0QJQklUKDIwKQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTkFVVE9DTFJfQ0xLR0FURQlCSVQoMTkpCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOQVVUT19QV1JPTl9QTEwJCUJJVCgxOCkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5VVE1JTEVWRUwzCQlCSVQoMTUpCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMgkJQklUKDE0KQogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTkhPU1RESVNDT05ERVRFQ1QJQklUKDEpCiAKKyNkZWZpbmUgQk1fVVNCUEhZX0lQX0ZJWCAgICAgICAgICAgICAgICAgICAgICAgKEJJVCgxNykgfCBCSVQoMTgpKQorCisjZGVmaW5lIEJNX1VTQlBIWV9ERUJVR19DTEtHQVRFCQkJQklUKDMwKQorCisvKiBBbmF0b3AgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFOQURJR19BTkFfTUlTQzAJCQkweDE1MAorI2RlZmluZSBBTkFESUdfQU5BX01JU0MwX1NFVAkJCTB4MTU0CisjZGVmaW5lIEFOQURJR19BTkFfTUlTQzBfQ0xSCQkJMHgxNTgKKworI2RlZmluZSBBTkFESUdfVVNCMV9WQlVTX0RFVF9TVEFUCQkweDFjMAorI2RlZmluZSBBTkFESUdfVVNCMl9WQlVTX0RFVF9TVEFUCQkweDIyMAorCisjZGVmaW5lIEFOQURJR19VU0IxX0xPT1BCQUNLX1NFVAkJMHgxZTQKKyNkZWZpbmUgQU5BRElHX1VTQjFfTE9PUEJBQ0tfQ0xSCQkweDFlOAorI2RlZmluZSBBTkFESUdfVVNCMl9MT09QQkFDS19TRVQJCTB4MjQ0CisjZGVmaW5lIEFOQURJR19VU0IyX0xPT1BCQUNLX0NMUgkJMHgyNDgKKworI2RlZmluZSBCTV9BTkFESUdfQU5BX01JU0MwX1NUT1BfTU9ERV9DT05GSUcJQklUKDEyKQorI2RlZmluZSBCTV9BTkFESUdfQU5BX01JU0MwX1NUT1BfTU9ERV9DT05GSUdfU0wgQklUKDExKQorCisjZGVmaW5lIEJNX0FOQURJR19VU0IxX1ZCVVNfREVUX1NUQVRfVkJVU19WQUxJRAlCSVQoMykKKyNkZWZpbmUgQk1fQU5BRElHX1VTQjJfVkJVU19ERVRfU1RBVF9WQlVTX1ZBTElECUJJVCgzKQorCisjZGVmaW5lIEJNX0FOQURJR19VU0IxX0xPT1BCQUNLX1VUTUlfRElHX1RTVDEJQklUKDIpCisjZGVmaW5lIEJNX0FOQURJR19VU0IxX0xPT1BCQUNLX1RTVElfVFhfRU4JQklUKDUpCisjZGVmaW5lIEJNX0FOQURJR19VU0IyX0xPT1BCQUNLX1VUTUlfRElHX1RTVDEJQklUKDIpCisjZGVmaW5lIEJNX0FOQURJR19VU0IyX0xPT1BCQUNLX1RTVElfVFhfRU4JQklUKDUpCisKKyNkZWZpbmUgdG9fbXhzX3BoeShwKSBjb250YWluZXJfb2YoKHApLCBzdHJ1Y3QgbXhzX3BoeSwgcGh5KQorCisvKiBEbyBkaXNjb25uZWN0aW9uIGJldHdlZW4gUEhZIGFuZCBjb250cm9sbGVyIHdpdGhvdXQgdmJ1cyAqLworI2RlZmluZSBNWFNfUEhZX0RJU0NPTk5FQ1RfTElORV9XSVRIT1VUX1ZCVVMJQklUKDApCisKKy8qCisgKiBUaGUgUEhZIHdpbGwgYmUgaW4gbWVzc3kgaWYgdGhlcmUgaXMgYSB3YWtldXAgYWZ0ZXIgcHV0dGluZworICogYnVzIHRvIHN1c3BlbmQgKHNldCBwb3J0c2Muc3VzcGVuZE0pIGJ1dCBiZWZvcmUgc2V0dGluZyBQSFkgdG8gbG93CisgKiBwb3dlciBtb2RlIChzZXQgcG9ydHNjLnBoY2QpLgorICovCisjZGVmaW5lIE1YU19QSFlfQUJOT1JNQUxfSU5fU1VTUEVORAkJQklUKDEpCisKKy8qCisgKiBUaGUgU09GIHNlbmRzIHRvbyBmYXN0IGFmdGVyIHJlc3VtaW5nLCBpdCB3aWxsIGNhdXNlIGRpc2Nvbm5lY3Rpb24KKyAqIGJldHdlZW4gaG9zdCBhbmQgaGlnaCBzcGVlZCBkZXZpY2UuCisgKi8KKyNkZWZpbmUgTVhTX1BIWV9TRU5ESU5HX1NPRl9UT09fRkFTVAkJQklUKDIpCisKKy8qCisgKiBJQyBoYXMgYnVnIGZpeGVzIGxvZ2ljLCB0aGV5IGluY2x1ZGUKKyAqIE1YU19QSFlfQUJOT1JNQUxfSU5fU1VTUEVORCBhbmQgTVhTX1BIWV9TRU5ESU5HX1NPRl9UT09fRkFTVAorICogd2hpY2ggYXJlIGRlc2NyaWJlZCBhdCBhYm92ZSBmbGFncywgdGhlIFJUTCB3aWxsIGhhbmRsZSBpdAorICogYWNjb3JkaW5nIHRvIGRpZmZlcmVudCB2ZXJzaW9ucy4KKyAqLworI2RlZmluZSBNWFNfUEhZX05FRURfSVBfRklYCQkJQklUKDMpCisKK3N0cnVjdCBteHNfcGh5X2RhdGEgeworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhzX3BoeV9kYXRhIGlteDIzX3BoeV9kYXRhID0geworCS5mbGFncyA9IE1YU19QSFlfQUJOT1JNQUxfSU5fU1VTUEVORCB8IE1YU19QSFlfU0VORElOR19TT0ZfVE9PX0ZBU1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSBpbXg2cV9waHlfZGF0YSA9IHsKKwkuZmxhZ3MgPSBNWFNfUEhZX1NFTkRJTkdfU09GX1RPT19GQVNUIHwKKwkJTVhTX1BIWV9ESVNDT05ORUNUX0xJTkVfV0lUSE9VVF9WQlVTIHwKKwkJTVhTX1BIWV9ORUVEX0lQX0ZJWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhzX3BoeV9kYXRhIGlteDZzbF9waHlfZGF0YSA9IHsKKwkuZmxhZ3MgPSBNWFNfUEhZX0RJU0NPTk5FQ1RfTElORV9XSVRIT1VUX1ZCVVMgfAorCQlNWFNfUEhZX05FRURfSVBfRklYLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXhzX3BoeV9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2c2wtdXNicGh5IiwgLmRhdGEgPSAmaW14NnNsX3BoeV9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzYnBoeSIsIC5kYXRhID0gJmlteDZxX3BoeV9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDIzLXVzYnBoeSIsIC5kYXRhID0gJmlteDIzX3BoeV9kYXRhLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG14c19waHlfZHRfaWRzKTsKKwogc3RydWN0IG14c19waHkgewogCXN0cnVjdCB1c2JfcGh5IHBoeTsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfYW5hdG9wOworCWludCBwb3J0X2lkOwogfTsKIAotI2RlZmluZSB0b19teHNfcGh5KHApIGNvbnRhaW5lcl9vZigocCksIHN0cnVjdCBteHNfcGh5LCBwaHkpCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfaW14NnFfcGh5KHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQoreworCXJldHVybiBteHNfcGh5LT5kYXRhID09ICZpbXg2cV9waHlfZGF0YTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2lteDZzbF9waHkoc3RydWN0IG14c19waHkgKm14c19waHkpCit7CisJcmV0dXJuIG14c19waHktPmRhdGEgPT0gJmlteDZzbF9waHlfZGF0YTsKK30KKworLyoKKyAqIFBIWSBuZWVkcyBzb21lIDMySyBjeWNsZXMgdG8gc3dpdGNoIGZyb20gMzJLIGNsb2NrIHRvCisgKiBidXMgKHN1Y2ggYXMgQUhCL0FYSSwgZXRjKSBjbG9jay4KKyAqLworc3RhdGljIHZvaWQgbXhzX3BoeV9jbG9ja19zd2l0Y2hfZGVsYXkodm9pZCkKK3sKKwl1c2xlZXBfcmFuZ2UoMzAwLCA0MDApOworfQogCiBzdGF0aWMgaW50IG14c19waHlfaHdfaW5pdChzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSkKIHsKQEAgLTUzLDE5ICsxNzIsMTA1IEBACiAJLyogUG93ZXIgdXAgdGhlIFBIWSAqLwogCXdyaXRlbCgwLCBiYXNlICsgSFdfVVNCUEhZX1BXRCk7CiAKLQkvKiBlbmFibGUgRlMvTFMgZGV2aWNlICovCi0Jd3JpdGVsKEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMiB8Ci0JICAgICAgIEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMywKKwkvKgorCSAqIFVTQiBQSFkgQ3RybCBTZXR0aW5nCisJICogLSBBdXRvIGNsb2NrL3Bvd2VyIG9uCisJICogLSBFbmFibGUgZnVsbC9sb3cgc3BlZWQgc3VwcG9ydAorCSAqLworCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTkFVVE9TRVRfVVNCQ0xLUyB8CisJCUJNX1VTQlBIWV9DVFJMX0VOQVVUT0NMUl9VU0JDTEtHQVRFIHwKKwkJQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX1BIWV9QV0QgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTkFVVE9DTFJfQ0xLR0FURSB8CisJCUJNX1VTQlBIWV9DVFJMX0VOQVVUT19QV1JPTl9QTEwgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDIgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDMsCiAJICAgICAgIGJhc2UgKyBIV19VU0JQSFlfQ1RSTF9TRVQpOwogCisJaWYgKG14c19waHktPmRhdGEtPmZsYWdzICYgTVhTX1BIWV9ORUVEX0lQX0ZJWCkKKwkJd3JpdGVsKEJNX1VTQlBIWV9JUF9GSVgsIGJhc2UgKyBIV19VU0JQSFlfSVBfU0VUKTsKKwogCXJldHVybiAwOwogfQogCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmJ1cyBpcyB0aGVyZSAqLworc3RhdGljIGJvb2wgbXhzX3BoeV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG14c19waHkgKm14c19waHkpCit7CisJdW5zaWduZWQgaW50IHZidXNfdmFsdWU7CisKKwlpZiAobXhzX3BoeS0+cG9ydF9pZCA9PSAwKQorCQlyZWdtYXBfcmVhZChteHNfcGh5LT5yZWdtYXBfYW5hdG9wLAorCQkJQU5BRElHX1VTQjFfVkJVU19ERVRfU1RBVCwKKwkJCSZ2YnVzX3ZhbHVlKTsKKwllbHNlIGlmIChteHNfcGh5LT5wb3J0X2lkID09IDEpCisJCXJlZ21hcF9yZWFkKG14c19waHktPnJlZ21hcF9hbmF0b3AsCisJCQlBTkFESUdfVVNCMl9WQlVTX0RFVF9TVEFULAorCQkJJnZidXNfdmFsdWUpOworCisJaWYgKHZidXNfdmFsdWUgJiBCTV9BTkFESUdfVVNCMV9WQlVTX0RFVF9TVEFUX1ZCVVNfVkFMSUQpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBfX214c19waHlfZGlzY29ubmVjdF9saW5lKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5LCBib29sIGRpc2Nvbm5lY3QpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gbXhzX3BoeS0+cGh5LmlvX3ByaXY7CisJdTMyIHJlZzsKKworCWlmIChkaXNjb25uZWN0KQorCQl3cml0ZWxfcmVsYXhlZChCTV9VU0JQSFlfREVCVUdfQ0xLR0FURSwKKwkJCWJhc2UgKyBIV19VU0JQSFlfREVCVUdfQ0xSKTsKKworCWlmIChteHNfcGh5LT5wb3J0X2lkID09IDApIHsKKwkJcmVnID0gZGlzY29ubmVjdCA/IEFOQURJR19VU0IxX0xPT1BCQUNLX1NFVAorCQkJOiBBTkFESUdfVVNCMV9MT09QQkFDS19DTFI7CisJCXJlZ21hcF93cml0ZShteHNfcGh5LT5yZWdtYXBfYW5hdG9wLCByZWcsCisJCQlCTV9BTkFESUdfVVNCMV9MT09QQkFDS19VVE1JX0RJR19UU1QxIHwKKwkJCUJNX0FOQURJR19VU0IxX0xPT1BCQUNLX1RTVElfVFhfRU4pOworCX0gZWxzZSBpZiAobXhzX3BoeS0+cG9ydF9pZCA9PSAxKSB7CisJCXJlZyA9IGRpc2Nvbm5lY3QgPyBBTkFESUdfVVNCMl9MT09QQkFDS19TRVQKKwkJCTogQU5BRElHX1VTQjJfTE9PUEJBQ0tfQ0xSOworCQlyZWdtYXBfd3JpdGUobXhzX3BoeS0+cmVnbWFwX2FuYXRvcCwgcmVnLAorCQkJQk1fQU5BRElHX1VTQjJfTE9PUEJBQ0tfVVRNSV9ESUdfVFNUMSB8CisJCQlCTV9BTkFESUdfVVNCMl9MT09QQkFDS19UU1RJX1RYX0VOKTsKKwl9CisKKwlpZiAoIWRpc2Nvbm5lY3QpCisJCXdyaXRlbF9yZWxheGVkKEJNX1VTQlBIWV9ERUJVR19DTEtHQVRFLAorCQkJYmFzZSArIEhXX1VTQlBIWV9ERUJVR19TRVQpOworCisJLyogRGVsYXkgc29tZSB0aW1lLCBhbmQgbGV0IExpbmVzdGF0ZSBiZSBTRTAgZm9yIGNvbnRyb2xsZXIgKi8KKwlpZiAoZGlzY29ubmVjdCkKKwkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG14c19waHlfZGlzY29ubmVjdF9saW5lKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5LCBib29sIG9uKQoreworCWJvb2wgdmJ1c19pc19vbiA9IGZhbHNlOworCisJLyogSWYgdGhlIFNvQ3MgZG9uJ3QgbmVlZCB0byBkaXNjb25uZWN0IGxpbmUgd2l0aG91dCB2YnVzLCBxdWl0ICovCisJaWYgKCEobXhzX3BoeS0+ZGF0YS0+ZmxhZ3MgJiBNWFNfUEhZX0RJU0NPTk5FQ1RfTElORV9XSVRIT1VUX1ZCVVMpKQorCQlyZXR1cm47CisKKwkvKiBJZiB0aGUgU29DcyBkb24ndCBoYXZlIGFuYXRvcCwgcXVpdCAqLworCWlmICghbXhzX3BoeS0+cmVnbWFwX2FuYXRvcCkKKwkJcmV0dXJuOworCisJdmJ1c19pc19vbiA9IG14c19waHlfZ2V0X3ZidXNfc3RhdHVzKG14c19waHkpOworCisJaWYgKG9uICYmICF2YnVzX2lzX29uKQorCQlfX214c19waHlfZGlzY29ubmVjdF9saW5lKG14c19waHksIHRydWUpOworCWVsc2UKKwkJX19teHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShteHNfcGh5LCBmYWxzZSk7CisKK30KKwogc3RhdGljIGludCBteHNfcGh5X2luaXQoc3RydWN0IHVzYl9waHkgKnBoeSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5ID0gdG9fbXhzX3BoeShwaHkpOwogCisJbXhzX3BoeV9jbG9ja19zd2l0Y2hfZGVsYXkoKTsKIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXhzX3BoeS0+Y2xrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtOTQsNiArMjk5LDcgQEAKIAkJICAgICAgIHgtPmlvX3ByaXYgKyBIV19VU0JQSFlfQ1RSTF9TRVQpOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUobXhzX3BoeS0+Y2xrKTsKIAl9IGVsc2UgeworCQlteHNfcGh5X2Nsb2NrX3N3aXRjaF9kZWxheSgpOwogCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXhzX3BoeS0+Y2xrKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0xMDUsMTEgKzMxMSwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG14c19waHlfc2V0X3dha2V1cChzdHJ1Y3QgdXNiX3BoeSAqeCwgYm9vbCBlbmFibGVkKQoreworCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5ID0gdG9fbXhzX3BoeSh4KTsKKwl1MzIgdmFsdWUgPSBCTV9VU0JQSFlfQ1RSTF9FTlZCVVNDSEdfV0tVUCB8CisJCQlCTV9VU0JQSFlfQ1RSTF9FTkRQRE1DSEdfV0tVUCB8CisJCQkJQk1fVVNCUEhZX0NUUkxfRU5JRENIR19XS1VQOworCWlmIChlbmFibGVkKSB7CisJCW14c19waHlfZGlzY29ubmVjdF9saW5lKG14c19waHksIHRydWUpOworCQl3cml0ZWxfcmVsYXhlZCh2YWx1ZSwgeC0+aW9fcHJpdiArIEhXX1VTQlBIWV9DVFJMX1NFVCk7CisJfSBlbHNlIHsKKwkJd3JpdGVsX3JlbGF4ZWQodmFsdWUsIHgtPmlvX3ByaXYgKyBIV19VU0JQSFlfQ1RSTF9DTFIpOworCQlteHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShteHNfcGh5LCBmYWxzZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXhzX3BoeV9vbl9jb25uZWN0KHN0cnVjdCB1c2JfcGh5ICpwaHksCiAJCWVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKIHsKLQlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgc3BlZWQgZGV2aWNlIGhhcyBjb25uZWN0ZWRcbiIsCi0JCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiaGlnaCIgOiAibm9uLWhpZ2giKTsKKwlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgZGV2aWNlIGhhcyBjb25uZWN0ZWRcbiIsCisJCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiSFMiIDogIkZTL0xTIik7CiAKIAlpZiAoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTkhPU1RESVNDT05ERVRFQ1QsCkBAIC0xMjEsOCArMzQ0LDggQEAKIHN0YXRpYyBpbnQgbXhzX3BoeV9vbl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfcGh5ICpwaHksCiAJCWVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKIHsKLQlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgc3BlZWQgZGV2aWNlIGhhcyBkaXNjb25uZWN0ZWRcbiIsCi0JCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiaGlnaCIgOiAibm9uLWhpZ2giKTsKKwlkZXZfZGJnKHBoeS0+ZGV2LCAiJXMgZGV2aWNlIGhhcyBkaXNjb25uZWN0ZWRcbiIsCisJCShzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAiSFMiIDogIkZTL0xTIik7CiAKIAlpZiAoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTkhPU1RESVNDT05ERVRFQ1QsCkBAIC0xMzgsNiArMzYxLDkgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IG14c19waHkgKm14c19waHk7CiAJaW50IHJldDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCQlvZl9tYXRjaF9kZXZpY2UobXhzX3BoeV9kdF9pZHMsICZwZGV2LT5kZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwpAQCAtMTU3LDYgKzM4MywyMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKiBTb21lIFNvQ3MgZG9uJ3QgaGF2ZSBhbmF0b3AgcmVnaXN0ZXJzICovCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxhbmF0b3AiLCBOVUxMKSkgeworCQlteHNfcGh5LT5yZWdtYXBfYW5hdG9wID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZQorCQkJKG5wLCAiZnNsLGFuYXRvcCIpOworCQlpZiAoSVNfRVJSKG14c19waHktPnJlZ21hcF9hbmF0b3ApKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkJImZhaWxlZCB0byBmaW5kIHJlZ21hcCBmb3IgYW5hdG9wXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKG14c19waHktPnJlZ21hcF9hbmF0b3ApOworCQl9CisJfQorCisJcmV0ID0gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAidXNicGh5Iik7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYWxpYXMgaWQsIGVycm5vICVkXG4iLCByZXQpOworCW14c19waHktPnBvcnRfaWQgPSByZXQ7CisKIAlteHNfcGh5LT5waHkuaW9fcHJpdgkJPSBiYXNlOwogCW14c19waHktPnBoeS5kZXYJCT0gJnBkZXYtPmRldjsKIAlteHNfcGh5LT5waHkubGFiZWwJCT0gRFJJVkVSX05BTUU7CkBAIC0xNjYsMTEgKzQwOCwxNSBAQAogCW14c19waHktPnBoeS5ub3RpZnlfY29ubmVjdAk9IG14c19waHlfb25fY29ubmVjdDsKIAlteHNfcGh5LT5waHkubm90aWZ5X2Rpc2Nvbm5lY3QJPSBteHNfcGh5X29uX2Rpc2Nvbm5lY3Q7CiAJbXhzX3BoeS0+cGh5LnR5cGUJCT0gVVNCX1BIWV9UWVBFX1VTQjI7CisJbXhzX3BoeS0+cGh5LnNldF93YWtldXAJCT0gbXhzX3BoeV9zZXRfd2FrZXVwOwogCiAJbXhzX3BoeS0+Y2xrID0gY2xrOworCW14c19waHktPmRhdGEgPSBvZl9pZC0+ZGF0YTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG14c19waHkpOwogCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmcGRldi0+ZGV2LCB0cnVlKTsKKwogCXJldCA9IHVzYl9hZGRfcGh5X2RldigmbXhzX3BoeS0+cGh5KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMTg3LDExICs0MzMsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXhzX3BoeV9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMy11c2JwaHkiLCB9LAotCXsgLyogc2VudGluZWwgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG14c19waHlfZHRfaWRzKTsKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyB2b2lkIG14c19waHlfZW5hYmxlX2xkb19pbl9zdXNwZW5kKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5LCBib29sIG9uKQoreworCXVuc2lnbmVkIGludCByZWcgPSBvbiA/IEFOQURJR19BTkFfTUlTQzBfU0VUIDogQU5BRElHX0FOQV9NSVNDMF9DTFI7CisKKwkvKiBJZiB0aGUgU29DcyBkb24ndCBoYXZlIGFuYXRvcCwgcXVpdCAqLworCWlmICghbXhzX3BoeS0+cmVnbWFwX2FuYXRvcCkKKwkJcmV0dXJuOworCisJaWYgKGlzX2lteDZxX3BoeShteHNfcGh5KSkKKwkJcmVnbWFwX3dyaXRlKG14c19waHktPnJlZ21hcF9hbmF0b3AsIHJlZywKKwkJCUJNX0FOQURJR19BTkFfTUlTQzBfU1RPUF9NT0RFX0NPTkZJRyk7CisJZWxzZSBpZiAoaXNfaW14NnNsX3BoeShteHNfcGh5KSkKKwkJcmVnbWFwX3dyaXRlKG14c19waHktPnJlZ21hcF9hbmF0b3AsCisJCQlyZWcsIEJNX0FOQURJR19BTkFfTUlTQzBfU1RPUF9NT0RFX0NPTkZJR19TTCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzX3BoeV9zeXN0ZW1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG14c19waHkgKm14c19waHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlteHNfcGh5X2VuYWJsZV9sZG9faW5fc3VzcGVuZChteHNfcGh5LCB0cnVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c19waHlfc3lzdGVtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG14c19waHkgKm14c19waHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlteHNfcGh5X2VuYWJsZV9sZG9faW5fc3VzcGVuZChteHNfcGh5LCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG14c19waHlfcG0sIG14c19waHlfc3lzdGVtX3N1c3BlbmQsCisJCW14c19waHlfc3lzdGVtX3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14c19waHlfZHJpdmVyID0gewogCS5wcm9iZSA9IG14c19waHlfcHJvYmUsCkBAIC0yMDAsNiArNDgxLDcgQEAKIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG14c19waHlfZHRfaWRzLAorCQkucG0gPSAmbXhzX3BoeV9wbSwKIAkgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1jb250cm9sLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtY29udHJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI1MzE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1jb250cm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIG9tYXAtY29udHJvbC11c2IuYyAtIFRoZSBVU0IgcGFydCBvZiBjb250cm9sIG1vZHVsZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yOiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmg+Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIgLSBwb3dlciBvbi9vZmYgdGhlIHBoeSB1c2luZyBjb250cm9sIG1vZHVsZSByZWcKLSAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKLSAqIEBvbjogMCBvciAxLCBiYXNlZCBvbiBwb3dlcmluZyBvbiBvciBvZmYgdGhlIFBIWQotICovCi12b2lkIG9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCXN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiCSpjb250cm9sX3VzYjsKLQotCWlmIChJU19FUlIoZGV2KSB8fCAhZGV2KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljb250cm9sX3VzYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghY29udHJvbF91c2IpIHsKLQkJZGV2X2VycihkZXYsICIlczogaW52YWxpZCBjb250cm9sIHVzYiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjb250cm9sX3VzYi0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykKLQkJcmV0dXJuOwotCi0JdmFsID0gcmVhZGwoY29udHJvbF91c2ItPnBvd2VyKTsKLQotCXN3aXRjaCAoY29udHJvbF91c2ItPnR5cGUpIHsKLQljYXNlIE9NQVBfQ1RSTF9UWVBFX1VTQjI6Ci0JCWlmIChvbikKLQkJCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9QSFlfUEQ7Ci0JCWVsc2UKLQkJCXZhbCB8PSBPTUFQX0NUUkxfREVWX1BIWV9QRDsKLQkJYnJlYWs7Ci0KLQljYXNlIE9NQVBfQ1RSTF9UWVBFX1BJUEUzOgotCQlyYXRlID0gY2xrX2dldF9yYXRlKGNvbnRyb2xfdXNiLT5zeXNfY2xrKTsKLQkJcmF0ZSA9IHJhdGUvMTAwMDAwMDsKLQotCQlpZiAob24pIHsKLQkJCXZhbCAmPSB+KE9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19DTURfTUFTSyB8Ci0JCQkJCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19GUkVRX01BU0spOwotCQkJdmFsIHw9IE9NQVBfQ1RSTF9VU0IzX1BIWV9UWF9SWF9QT1dFUk9OIDw8Ci0JCQkJT01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0NNRF9TSElGVDsKLQkJCXZhbCB8PSByYXRlIDw8IE9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19GUkVRX1NISUZUOwotCQl9IGVsc2UgewotCQkJdmFsICY9IH5PTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX01BU0s7Ci0JCQl2YWwgfD0gT01BUF9DVFJMX1VTQjNfUEhZX1RYX1JYX1BPV0VST0ZGIDw8Ci0JCQkJT01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0NNRF9TSElGVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT01BUF9DVFJMX1RZUEVfRFJBN1VTQjI6Ci0JCWlmIChvbikKLQkJCXZhbCAmPSB+T01BUF9DVFJMX1VTQjJfUEhZX1BEOwotCQllbHNlCi0JCQl2YWwgfD0gT01BUF9DVFJMX1VTQjJfUEhZX1BEOwotCQlicmVhazsKLQotCWNhc2UgT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyOgotCQlpZiAob24pIHsKLQkJCXZhbCAmPSB+KEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BEIHwKLQkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOwotCQkJdmFsIHw9IChBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4gfAotCQkJCQlBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4pOwotCQl9IGVsc2UgewotCQkJdmFsICY9IH4oQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOIHwKLQkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOKTsKLQkJCXZhbCB8PSAoQU00MzdYX0NUUkxfVVNCMl9QSFlfUEQgfAotCQkJCQkgQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHR5cGUgJWQgbm90IHJlY29nbml6ZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBjb250cm9sX3VzYi0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCXdyaXRlbCh2YWwsIGNvbnRyb2xfdXNiLT5wb3dlcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcik7Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBncm91bmRlZAotICogQGN0cmxfdXNiOiBzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqCi0gKgotICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgdGhhdCBhIHVzYgotICogZGV2aWNlIGhhcyBiZWVuIGNvbm5lY3RlZC4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoc3RydWN0IG9tYXBfY29udHJvbF91c2IgKmN0cmxfdXNiKQotewotCXUzMiB2YWw7Ci0KLQl2YWwgPSByZWFkbChjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci0JdmFsICY9IH4oT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORCk7Ci0JdmFsIHw9IE9NQVBfQ1RSTF9ERVZfQVZBTElEIHwgT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQ7Ci0Jd3JpdGVsKHZhbCwgY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotfQotCi0vKioKLSAqIG9tYXBfY29udHJvbF91c2JfZGV2aWNlX21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBoaWdoCi0gKiBpbXBlZGFuY2UKLSAqIEBjdHJsX3VzYjogc3RydWN0IG9tYXBfY29udHJvbF91c2IgKgotICoKLSAqIFdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQgaXQgaGFzIGJlZW4KLSAqIGNvbm5lY3RlZCB0byBhIHVzYiBob3N0LgotICovCi1zdGF0aWMgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX2RldmljZV9tb2RlKHN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiICpjdHJsX3VzYikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gcmVhZGwoY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9TRVNTRU5EOwotCXZhbCB8PSBPTUFQX0NUUkxfREVWX0lERElHIHwgT01BUF9DVFJMX0RFVl9BVkFMSUQgfAotCQlPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRDsKLQl3cml0ZWwodmFsLCBjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci19Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZCAtIEVuYWJsZSBTRVNTSU9ORU5EIGFuZCBJRElHIHRvIGhpZ2gKLSAqIGltcGVkYW5jZQotICogQGN0cmxfdXNiOiBzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqCi0gKgotICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgaXQncyBub3cgaW4KLSAqIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqY3RybF91c2IpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IHJlYWRsKGN0cmxfdXNiLT5vdGdoc19jb250cm9sKTsKLQl2YWwgJj0gfihPTUFQX0NUUkxfREVWX0FWQUxJRCB8IE9NQVBfQ1RSTF9ERVZfVkJVU1ZBTElEKTsKLQl2YWwgfD0gT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORDsKLQl3cml0ZWwodmFsLCBjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci19Ci0KLS8qKgotICogb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZSAtIENhbGxzIHRvIGZ1bmN0aW9ucyB0byBzZXQgVVNCIGluIG9uZSBvZiBob3N0IG1vZGUKLSAqIG9yIGRldmljZSBtb2RlIG9yIHRvIGRlbm90ZSBkaXNjb25uZWN0ZWQgc3RhdGUKLSAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKLSAqIEBtb2RlOiBUaGUgbW9kZSB0byB3aGljaCB1c2Igc2hvdWxkIGJlIGNvbmZpZ3VyZWQKLSAqCi0gKiBUaGlzIGlzIGFuIEFQSSB0byB3cml0ZSB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQKLSAqIGEgdXNiIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQuCi0gKi8KLXZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSkKLXsKLQlzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYgkqY3RybF91c2I7Ci0KLQlpZiAoSVNfRVJSKGRldikgfHwgIWRldikKLQkJcmV0dXJuOwotCi0JY3RybF91c2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmICghY3RybF91c2IpIHsKLQkJZGV2X2VycihkZXYsICJJbnZhbGlkIGNvbnRyb2wgdXNiIGRldmljZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY3RybF91c2ItPnR5cGUgIT0gT01BUF9DVFJMX1RZUEVfT1RHSFMpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgVVNCX01PREVfSE9TVDoKLQkJb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoY3RybF91c2IpOwotCQlicmVhazsKLQljYXNlIFVTQl9NT0RFX0RFVklDRToKLQkJb21hcF9jb250cm9sX3VzYl9kZXZpY2VfbW9kZShjdHJsX3VzYik7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX01PREVfRElTQ09OTkVDVDoKLQkJb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChjdHJsX3VzYik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl92ZGJnKGRldiwgImludmFsaWQgb21hcCBjb250cm9sIHVzYiBtb2RlXG4iKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKTsKLQotI2lmZGVmIENPTkZJR19PRgotCi1zdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgb3RnaHNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX09UR0hTOwotc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIHVzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1VTQjI7Ci1zdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgcGlwZTNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1BJUEUzOwotc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIGRyYTd1c2IyX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMjsKLXN0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSBhbTQzN3VzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMjsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9jb250cm9sX3VzYl9pZF90YWJsZVtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktb3RnaHMiLAotCQkuZGF0YSA9ICZvdGdoc19kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS11c2IyIiwKLQkJLmRhdGEgPSAmdXNiMl9kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS1waXBlMyIsCi0JCS5kYXRhID0gJnBpcGUzX2RhdGEsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LWRyYTd1c2IyIiwKLQkJLmRhdGEgPSAmZHJhN3VzYjJfZGF0YSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktYW00Mzd1c2IyIiwKLQkJLmRhdGEgPSAmYW00Mzd1c2IyX2RhdGEsCi0JfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvbWFwX2NvbnRyb2xfdXNiX2lkX3RhYmxlKTsKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgb21hcF9jb250cm9sX3VzYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZQkqcmVzOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwotCXN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiICpjb250cm9sX3VzYjsKLQotCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihvbWFwX2NvbnRyb2xfdXNiX2lkX3RhYmxlKSwKLQkJCQkJCQkJJnBkZXYtPmRldik7Ci0JaWYgKCFvZl9pZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb250cm9sX3VzYiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNvbnRyb2xfdXNiKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb250cm9sX3VzYikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBjb250cm9sIHVzYlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNvbnRyb2xfdXNiLT5kZXYgPSAmcGRldi0+ZGV2OwotCWNvbnRyb2xfdXNiLT50eXBlID0gKihlbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSAqKW9mX2lkLT5kYXRhOwotCi0JaWYgKGNvbnRyb2xfdXNiLT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX09UR0hTKSB7Ci0JCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkib3RnaHNfY29udHJvbCIpOwotCQljb250cm9sX3VzYi0+b3RnaHNfY29udHJvbCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgKLQkJCSZwZGV2LT5kZXYsIHJlcyk7Ci0JCWlmIChJU19FUlIoY29udHJvbF91c2ItPm90Z2hzX2NvbnRyb2wpKQotCQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbF91c2ItPm90Z2hzX2NvbnRyb2wpOwotCX0gZWxzZSB7Ci0JCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJInBvd2VyIik7Ci0JCWNvbnRyb2xfdXNiLT5wb3dlciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCQlpZiAoSVNfRVJSKGNvbnRyb2xfdXNiLT5wb3dlcikpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGdldCBwb3dlciByZWdpc3RlclxuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihjb250cm9sX3VzYi0+cG93ZXIpOwotCQl9Ci0JfQotCi0JaWYgKGNvbnRyb2xfdXNiLT50eXBlID09IE9NQVBfQ1RSTF9UWVBFX1BJUEUzKSB7Ci0JCWNvbnRyb2xfdXNiLT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KGNvbnRyb2xfdXNiLT5kZXYsCi0JCQkic3lzX2Nsa2luIik7Ci0JCWlmIChJU19FUlIoY29udHJvbF91c2ItPnN5c19jbGspKSB7Ci0JCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IHN5c19jbGtpblxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoY29udHJvbF91c2ItPmRldiwgY29udHJvbF91c2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfY29udHJvbF91c2JfZHJpdmVyID0gewotCS5wcm9iZQkJPSBvbWFwX2NvbnRyb2xfdXNiX3Byb2JlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJvbWFwLWNvbnRyb2wtdXNiIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvbWFwX2NvbnRyb2xfdXNiX2lkX3RhYmxlKSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb21hcF9jb250cm9sX3VzYl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9jb250cm9sX3VzYl9kcml2ZXIpOwotfQotc3Vic3lzX2luaXRjYWxsKG9tYXBfY29udHJvbF91c2JfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX2NvbnRyb2xfdXNiX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9jb250cm9sX3VzYl9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQob21hcF9jb250cm9sX3VzYl9leGl0KTsKLQotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogb21hcF9jb250cm9sX3VzYiIpOwotTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jLiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIENvbnRyb2wgTW9kdWxlIFVTQiBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC11c2IzLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtdXNiMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZiYTI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC11c2IzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLyoKLSAqIG9tYXAtdXNiMyAtIFVTQiBQSFksIHRhbGtpbmcgdG8gZHdjMyBjb250cm9sbGVyIGluIE9NQVAuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL29tYXBfY29udHJvbF91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jZGVmaW5lCVBMTF9TVEFUVVMJCTB4MDAwMDAwMDQKLSNkZWZpbmUJUExMX0dPCQkJMHgwMDAwMDAwOAotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjEJMHgwMDAwMDAwQwotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjIJMHgwMDAwMDAxMAotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjMJMHgwMDAwMDAxNAotI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjQJMHgwMDAwMDAyMAotCi0jZGVmaW5lCVBMTF9SRUdNX01BU0sJCTB4MDAxRkZFMDAKLSNkZWZpbmUJUExMX1JFR01fU0hJRlQJCTB4OQotI2RlZmluZQlQTExfUkVHTV9GX01BU0sJCTB4MDAwM0ZGRkYKLSNkZWZpbmUJUExMX1JFR01fRl9TSElGVAkweDAKLSNkZWZpbmUJUExMX1JFR05fTUFTSwkJMHgwMDAwMDFGRQotI2RlZmluZQlQTExfUkVHTl9TSElGVAkJMHgxCi0jZGVmaW5lCVBMTF9TRUxGUkVRRENPX01BU0sJMHgwMDAwMDAwRQotI2RlZmluZQlQTExfU0VMRlJFUURDT19TSElGVAkweDEKLSNkZWZpbmUJUExMX1NEX01BU0sJCTB4MDAwM0ZDMDAKLSNkZWZpbmUJUExMX1NEX1NISUZUCQkweDkKLSNkZWZpbmUJU0VUX1BMTF9HTwkJMHgxCi0jZGVmaW5lCVBMTF9USUNPUFdETgkJMHgxMDAwMAotI2RlZmluZQlQTExfTE9DSwkJMHgyCi0jZGVmaW5lCVBMTF9JRExFCQkweDEKLQotLyoKLSAqIFRoaXMgaXMgYW4gRW1waXJpY2FsIHZhbHVlIHRoYXQgd29ya3MsIG5lZWQgdG8gY29uZmlybSB0aGUgYWN0dWFsCi0gKiB2YWx1ZSByZXF1aXJlZCBmb3IgdGhlIFVTQjNQSFlfUExMX0NPTkZJR1VSQVRJT04yLlBMTF9JRExFIHN0YXR1cwotICogdG8gYmUgY29ycmVjdGx5IHJlZmxlY3RlZCBpbiB0aGUgVVNCM1BIWV9QTExfU1RBVFVTIHJlZ2lzdGVyLgotICovCi0jIGRlZmluZSBQTExfSURMRV9USU1FICAxMDA7Ci0KLXN0cnVjdCB1c2JfZHBsbF9tYXAgewotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQlzdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zIHBhcmFtczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RwbGxfbWFwIGRwbGxfbWFwW10gPSB7Ci0JezEyMDAwMDAwLCB7MTI1MCwgNSwgNCwgMjAsIDB9IH0sCS8qIDEyIE1IeiAqLwotCXsxNjgwMDAwMCwgezMxMjUsIDIwLCA0LCAyMCwgMH0gfSwJLyogMTYuOCBNSHogKi8KLQl7MTkyMDAwMDAsIHsxMTcyLCA4LCA0LCAyMCwgNjU1Mzd9IH0sCS8qIDE5LjIgTUh6ICovCi0JezIwMDAwMDAwLCB7MTAwMCwgNywgNCwgMTAsIDB9IH0sCS8qIDIwIE1IeiAqLwotCXsyNjAwMDAwMCwgezEyNTAsIDEyLCA0LCAyMCwgMH0gfSwJLyogMjYgTUh6ICovCi0JezM4NDAwMDAwLCB7MzEyNSwgNDcsIDQsIDIwLCA5Mjg0M30gfSwJLyogMzguNCBNSHogKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zICpvbWFwX3VzYjNfZ2V0X2RwbGxfcGFyYW1zKHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRwbGxfbWFwKTsgaSsrKSB7Ci0JCWlmIChyYXRlID09IGRwbGxfbWFwW2ldLnJhdGUpCi0JCQlyZXR1cm4gJmRwbGxfbWFwW2ldLnBhcmFtczsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBvbWFwX3VzYjNfc3VzcGVuZChzdHJ1Y3QgdXNiX3BoeSAqeCwgaW50IHN1c3BlbmQpCi17Ci0Jc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfdG9fb21hcHVzYih4KTsKLQlpbnQJdmFsOwotCWludCB0aW1lb3V0ID0gUExMX0lETEVfVElNRTsKLQotCWlmIChzdXNwZW5kICYmICFwaHktPmlzX3N1c3BlbmRlZCkgewotCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7Ci0JCXZhbCB8PSBQTExfSURMRTsKLQkJb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOwotCi0JCWRvIHsKLQkJCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX1NUQVRVUyk7Ci0JCQlpZiAodmFsICYgUExMX1RJQ09QV0ROKQotCQkJCWJyZWFrOwotCQkJdWRlbGF5KDEpOwotCQl9IHdoaWxlICgtLXRpbWVvdXQpOwotCi0JCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwotCi0JCXBoeS0+aXNfc3VzcGVuZGVkCT0gMTsKLQl9IGVsc2UgaWYgKCFzdXNwZW5kICYmIHBoeS0+aXNfc3VzcGVuZGVkKSB7Ci0JCXBoeS0+aXNfc3VzcGVuZGVkCT0gMDsKLQotCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7Ci0JCXZhbCAmPSB+UExMX0lETEU7Ci0JCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKLQotCQlkbyB7Ci0JCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOwotCQkJaWYgKCEodmFsICYgUExMX1RJQ09QV0ROKSkKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfSB3aGlsZSAoLS10aW1lb3V0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcF91c2JfZHBsbF9yZWxvY2soc3RydWN0IG9tYXBfdXNiICpwaHkpCi17Ci0JdTMyCQl2YWw7Ci0JdW5zaWduZWQgbG9uZwl0aW1lb3V0OwotCi0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0dPLCBTRVRfUExMX0dPKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7Ci0JZG8gewotCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOwotCQlpZiAodmFsICYgUExMX0xPQ0spCi0JCQlicmVhazsKLQl9IHdoaWxlICghV0FSTl9PTih0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSk7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2JfZHBsbF9sb2NrKHN0cnVjdCBvbWFwX3VzYiAqcGh5KQotewotCXUzMgkJCXZhbDsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCXN0cnVjdCB1c2JfZHBsbF9wYXJhbXMgKmRwbGxfcGFyYW1zOwotCi0JcmF0ZSA9IGNsa19nZXRfcmF0ZShwaHktPnN5c19jbGspOwotCWRwbGxfcGFyYW1zID0gb21hcF91c2IzX2dldF9kcGxsX3BhcmFtcyhyYXRlKTsKLQlpZiAoIWRwbGxfcGFyYW1zKSB7Ci0JCWRldl9lcnIocGh5LT5kZXYsCi0JCQkgICJObyBEUExMIGNvbmZpZ3VyYXRpb24gZm9yICVsdSBIeiBTWVMgQ0xLXG4iLCByYXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEpOwotCXZhbCAmPSB+UExMX1JFR05fTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPm4gPDwgUExMX1JFR05fU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xLCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIpOwotCXZhbCAmPSB+UExMX1NFTEZSRVFEQ09fTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPmZyZXEgPDwgUExMX1NFTEZSRVFEQ09fU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEpOwotCXZhbCAmPSB+UExMX1JFR01fTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPm0gPDwgUExMX1JFR01fU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xLCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjQpOwotCXZhbCAmPSB+UExMX1JFR01fRl9NQVNLOwotCXZhbCB8PSBkcGxsX3BhcmFtcy0+bWYgPDwgUExMX1JFR01fRl9TSElGVDsKLQlvbWFwX3VzYl93cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjQsIHZhbCk7Ci0KLQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMyk7Ci0JdmFsICY9IH5QTExfU0RfTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPnNkIDw8IFBMTF9TRF9TSElGVDsKLQlvbWFwX3VzYl93cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjMsIHZhbCk7Ci0KLQlvbWFwX3VzYl9kcGxsX3JlbG9jayhwaHkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IzX2luaXQoc3RydWN0IHVzYl9waHkgKngpCi17Ci0Jc3RydWN0IG9tYXBfdXNiCSpwaHkgPSBwaHlfdG9fb21hcHVzYih4KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gb21hcF91c2JfZHBsbF9sb2NrKHBoeSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG9tYXBfdXNiICpwaHk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sX25vZGU7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29udHJvbF9wZGV2OwotCi0JaWYgKCFub2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBoeSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBoeSksIEdGUF9LRVJORUwpOwotCWlmICghcGh5KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvYyBtZW0gZm9yIE9NQVAgVVNCMyBQSFlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAicGxsX2N0cmwiKTsKLQlwaHktPnBsbF9jdHJsX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKHBoeS0+cGxsX2N0cmxfYmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKHBoeS0+cGxsX2N0cmxfYmFzZSk7Ci0KLQlwaHktPmRldgkJPSAmcGRldi0+ZGV2OwotCi0JcGh5LT5waHkuZGV2CQk9IHBoeS0+ZGV2OwotCXBoeS0+cGh5LmxhYmVsCQk9ICJvbWFwLXVzYjMiOwotCXBoeS0+cGh5LmluaXQJCT0gb21hcF91c2IzX2luaXQ7Ci0JcGh5LT5waHkuc2V0X3N1c3BlbmQJPSBvbWFwX3VzYjNfc3VzcGVuZDsKLQlwaHktPnBoeS50eXBlCQk9IFVTQl9QSFlfVFlQRV9VU0IzOwotCi0JcGh5LT5pc19zdXNwZW5kZWQJPSAxOwotCXBoeS0+d2t1cGNsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInVzYl9waHlfY21fY2xrMzJrIik7Ci0JaWYgKElTX0VSUihwaHktPndrdXBjbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgdXNiX3BoeV9jbV9jbGszMmtcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwaHktPndrdXBjbGspOwotCX0KLQljbGtfcHJlcGFyZShwaHktPndrdXBjbGspOwotCi0JcGh5LT5vcHRjbGsgPSBkZXZtX2Nsa19nZXQocGh5LT5kZXYsICJ1c2Jfb3RnX3NzX3JlZmNsazk2MG0iKTsKLQlpZiAoSVNfRVJSKHBoeS0+b3B0Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHVzYl9vdGdfc3NfcmVmY2xrOTYwbVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHBoeS0+b3B0Y2xrKTsKLQl9Ci0JY2xrX3ByZXBhcmUocGh5LT5vcHRjbGspOwotCi0JcGh5LT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KHBoeS0+ZGV2LCAic3lzX2Nsa2luIik7Ci0JaWYgKElTX0VSUihwaHktPnN5c19jbGspKSB7Ci0JCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgc3lzX2Nsa2luXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvbnRyb2xfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImN0cmwtbW9kdWxlIiwgMCk7Ci0JaWYgKCFjb250cm9sX25vZGUpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZSBwaGFuZGxlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNvbnRyb2xfcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoY29udHJvbF9ub2RlKTsKLQlpZiAoIWNvbnRyb2xfcGRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNvbnRyb2wgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGh5LT5jb250cm9sX2RldiA9ICZjb250cm9sX3BkZXYtPmRldjsKLQotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwotCXVzYl9hZGRfcGh5X2RldigmcGh5LT5waHkpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGh5KTsKLQotCXBtX3J1bnRpbWVfZW5hYmxlKHBoeS0+ZGV2KTsKLQlwbV9ydW50aW1lX2dldCgmcGRldi0+ZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXBfdXNiM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JY2xrX3VucHJlcGFyZShwaHktPndrdXBjbGspOwotCWNsa191bnByZXBhcmUocGh5LT5vcHRjbGspOwotCXVzYl9yZW1vdmVfcGh5KCZwaHktPnBoeSk7Ci0JaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZCgmcGRldi0+ZGV2KSkKLQkJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQotCi1zdGF0aWMgaW50IG9tYXBfdXNiM19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb21hcF91c2IJKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JY2xrX2Rpc2FibGUocGh5LT53a3VwY2xrKTsKLQljbGtfZGlzYWJsZShwaHktPm9wdGNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwX3VzYjNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXUzMiByZXQgPSAwOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb21hcF91c2IJKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcmV0ID0gY2xrX2VuYWJsZShwaHktPm9wdGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBvcHRjbGsgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlyZXQgPSBjbGtfZW5hYmxlKHBoeS0+d2t1cGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB3a3VwY2xrICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjI6Ci0JY2xrX2Rpc2FibGUocGh5LT5vcHRjbGspOwotCi1lcnIxOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBvbWFwX3VzYjNfcG1fb3BzID0gewotCVNFVF9SVU5USU1FX1BNX09QUyhvbWFwX3VzYjNfcnVudGltZV9zdXNwZW5kLCBvbWFwX3VzYjNfcnVudGltZV9yZXN1bWUsCi0JCU5VTEwpCi19OwotCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgICgmb21hcF91c2IzX3BtX29wcykKLSNlbHNlCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgIE5VTEwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvbWFwX3VzYjNfaWRfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMyIgfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9tYXBfdXNiM19pZF90YWJsZSk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF91c2IzX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gb21hcF91c2IzX3Byb2JlLAotCS5yZW1vdmUJCT0gb21hcF91c2IzX3JlbW92ZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAib21hcC11c2IzIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JCS5wbQk9IERFVl9QTV9PUFMsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvbWFwX3VzYjNfaWRfdGFibGUpLAotCX0sCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG9tYXBfdXNiM19kcml2ZXIpOwotCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOiBvbWFwX3VzYjMiKTsKLU1PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYy4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiT01BUCBVU0IzIHBoeSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktcmNhci1nZW4yLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMKaW5kZXggNTUxZTBhNi4uMzg4ZDg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMKQEAgLTE3NywxNSArMTc3LDE1IEBACiAJc3RydWN0IGNsayAqY2xrOwogCWludCByZXR2YWw7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJaWYgKCFwZGF0YSkgewogCQlkZXZfZXJyKGRldiwgIk5vIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInVzYmhzIik7CisJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInVzYmhzIik7CiAJaWYgKElTX0VSUihjbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCB0aGUgY2xvY2tcbiIpOworCQlkZXZfZXJyKGRldiwgIkNhbid0IGdldCB0aGUgY2xvY2tcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS10d2w2MDMwLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS10d2w2MDMwLXVzYi5jCmluZGV4IDIxNDE3MmIuLjA0Nzc4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktdHdsNjAzMC11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LXR3bDYwMzAtdXNiLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLW9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcGh5X2NvbXBhbmlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9vbWFwX3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktdWxwaS5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS11bHBpLmMKaW5kZXggMjE3MzM5ZC4uMTdlYTNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS11bHBpLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS11bHBpLmMKQEAgLTQ3LDYgKzQ3LDggQEAKIHN0YXRpYyBzdHJ1Y3QgdWxwaV9pbmZvIHVscGlfaWRzW10gPSB7CiAJVUxQSV9JTkZPKFVMUElfSUQoMHgwNGNjLCAweDE1MDQpLCAiTlhQIElTUDE1MDQiKSwKIAlVTFBJX0lORk8oVUxQSV9JRCgweDA0MjQsIDB4MDAwNiksICJTTVNDIFVTQjMzMXgiKSwKKwlVTFBJX0lORk8oVUxQSV9JRCgweDA0MjQsIDB4MDAwNyksICJTTVNDIFVTQjMzMjAiKSwKKwlVTFBJX0lORk8oVUxQSV9JRCgweDA0NTEsIDB4MTUwNyksICJUSSBUVVNCMTIxMCIpLAogfTsKIAogc3RhdGljIGludCB1bHBpX3NldF9vdGdfZmxhZ3Moc3RydWN0IHVzYl9waHkgKnBoeSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKaW5kZXggODIzNzFmNi4uMmQ3MmFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKQEAgLTMyMywxMSArMzIzLDExIEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsIF9fZnVuY19fKTsKIAlyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHIpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCIKLQkJCSIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gc3VibWl0IGludGVycnVwdCB1cmI6ICVkXG4iLAorCQkJX19mdW5jX18sIHIpOwogCQljaDM0MV9jbG9zZShwb3J0KTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCmluZGV4IDBhYzNiM2IuLjI5MTZkZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCi0JCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsCisJCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCS8qIFRocm93IGF3YXkgZGF0YS4gTm8gYmV0dGVyIGlkZWEgd2hhdCB0byBkbyB3aXRoIGl0LiAqLwogCQkJcHJpdi0+d3JmaWxsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKaW5kZXggYmNjYjEyMjMuLjAxYmY1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJCQkgKiB0aGUgZ2VuZXJpYyBmaXJtd2FyZSwgYnV0IGFyZSBub3QgdXNlZCB3aXRoCiAJCQkgKiBOTUVBIGFuZCBTaVJGIHByb3RvY29scyAqLwogCQkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJCSIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQgb2YgJWQgb24gRWFydGhtYXRlIEdQUyIsCisJCQkJIiVzIC0gZmFpbGVkIHNldHRpbmcgYmF1ZCByYXRlLCB1bnN1cHBvcnRlZCBzcGVlZCBvZiAlZCBvbiBFYXJ0aG1hdGUgR1BTXG4iLAogCQkJCV9fZnVuY19fLCBuZXdfcmF0ZSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTEyMjQsNyArMTIyNCw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OwotCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKQEAgLTEyMzksMjEgKzEyMzgsOSBAQAogCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQlyZXR1cm47Ci0JY2FzZSAtRVBJUEU6IC8qIG5vIGJyZWFrIG5lZWRlZDsgY2xlYXIgaGFsdCBhbmQgcmVzdWJtaXQgKi8KLQkJaWYgKCFwcml2LT5jb21tX2lzX29rKQotCQkJYnJlYWs7Ci0JCXVzYl9jbGVhcl9oYWx0KHBvcnQtPnNlcmlhbC0+ZGV2LCAweDAyKTsKLQkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwotCQlkZXZfZGJnKGRldiwgIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcG9ydC0+aW50ZXJydXB0X291dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuOwotCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7Ci0JCWJyZWFrOworCWNhc2UgLUVQSVBFOgorCQkvKiBDYW5ub3QgY2FsbCB1c2JfY2xlYXJfaGFsdCB3aGlsZSBpbl9pbnRlcnJ1cHQgKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5leHBlY3RlZCBub256ZXJvIHdyaXRlIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCiAJCQlfX2Z1bmNfXywgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IGI2M2NlMDIuLjFiZDE5MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtMzMyLDkgKzMzMiw5IEBACiAJICogc3R1ZmYgbGlrZSAzRyBtb2RlbXMsIHNvIHNob3J0Y2lyY3VpdCBpdCBpbiB0aGUgOTkuOTk5OTk5OSUgb2YKIAkgKiBjYXNlcyB3aGVyZSB0aGUgVVNCIHNlcmlhbCBpcyBub3QgYSBjb25zb2xlIGFueXdheS4KIAkgKi8KLQlpZiAoIXBvcnQtPnBvcnQuY29uc29sZSB8fCAhcG9ydC0+c3lzcnEpCisJaWYgKCFwb3J0LT5wb3J0LmNvbnNvbGUgfHwgIXBvcnQtPnN5c3JxKSB7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoJnBvcnQtPnBvcnQsIGNoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkrKywgY2grKykgewogCQkJaWYgKCF1c2Jfc2VyaWFsX2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsICpjaCkpCiAJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnBvcnQsICpjaCwgVFRZX05PUk1BTCk7CkBAIC0zNTksMjQgKzM1OSwzOCBAQAogCiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB1cmIgJWQsIGxlbiAlZFxuIiwgX19mdW5jX18sIGksCiAJCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCWlmICh1cmItPnN0YXR1cykgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FU0hVVERPV046CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHN0b3BwZWQ6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKKwljYXNlIC1FUElQRToKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSB1cmIgc3RvcHBlZDogJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlnb3RvIHJlc3VibWl0OwogCX0KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YSgmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAlwb3J0LT5zZXJpYWwtPnR5cGUtPnByb2Nlc3NfcmVhZF91cmIodXJiKTsKIAorcmVzdWJtaXQ6CiAJLyogVGhyb3R0bGUgdGhlIGRldmljZSBpZiByZXF1ZXN0ZWQgYnkgdHR5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlwb3J0LT50aHJvdHRsZWQgPSBwb3J0LT50aHJvdHRsZV9yZXE7CiAJaWYgKCFwb3J0LT50aHJvdHRsZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQl1c2Jfc2VyaWFsX2dlbmVyaWNfc3VibWl0X3JlYWRfdXJiKHBvcnQsIGksIEdGUF9BVE9NSUMpOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2VyaWFsX2dlbmVyaWNfcmVhZF9idWxrX2NhbGxiYWNrKTsKIApAQCAtMzg0LDI5ICszOTgsMzggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydC0+d3JpdGVfdXJicyk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0LT53cml0ZV91cmJzKTsgKytpKSB7CiAJCWlmIChwb3J0LT53cml0ZV91cmJzW2ldID09IHVyYikKIAkJCWJyZWFrOwotCisJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJcG9ydC0+dHhfYnl0ZXMgLT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCXNldF9iaXQoaSwgJnBvcnQtPndyaXRlX3VyYnNfZnJlZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHN0YXR1cykgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJa2ZpZm9fcmVzZXRfb3V0KCZwb3J0LT53cml0ZV9maWZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9zdGFydChwb3J0LCBHRlBfQVRPTUlDKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FU0hVVERPV046CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHN0b3BwZWQ6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwljYXNlIC1FUElQRToKKwkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIHVyYiBzdG9wcGVkOiAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIG5vbnplcm8gdXJiIHN0YXR1czogJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJZ290byByZXN1Ym1pdDsKIAl9CiAKK3Jlc3VibWl0OgorCXVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9zdGFydChwb3J0LCBHRlBfQVRPTUlDKTsKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9idWxrX2NhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZDAwZGFlMS4uNWFkNGEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTExNTEsNyArMTE1MSw3IEBACiAJCWdvdG8gZmFpbF9zdG9yZV92Y2NfbW9kZTsKIAl9CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBzZXR0aW5nIHZjY19tb2RlID0gJWxkIiwgX19mdW5jX18sIHYpOworCWRldl9kYmcoZGV2LCAiJXM6IHNldHRpbmcgdmNjX21vZGUgPSAlbGRcbiIsIF9fZnVuY19fLCB2KTsKIAogCWlmICgodiAhPSAzKSAmJiAodiAhPSA1KSkgewogCQlkZXZfZXJyKGRldiwgIiVzIC0gdmNjX21vZGUgJWxkIGlzIGludmFsaWRcbiIsIF9fZnVuY19fLCB2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCmluZGV4IDI2NWM2NzcuLmQzYWNhZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwpAQCAtMzk3LDE3ICszOTcsNiBAQAogCiAJbXNnID0gKHN0cnVjdCBrZXlzcGFuX3VzYTI2X3BvcnRTdGF0dXNNZXNzYWdlICopZGF0YTsKIAotI2lmIDAKLQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAotCQkiJXMgLSBwb3J0IHN0YXR1czogcG9ydCAlZCBjdHMgJWQgZGNkICVkIGRzciAlZCByaSAlZCB0b2ZmICVkIHR4b2ZmICVkIHJ4ZW4gJWQgY3IgJWQiLAotCQlfX2Z1bmNfXywgbXNnLT5wb3J0LCBtc2ctPmhza2lhX2N0cywgbXNnLT5ncGlhX2RjZCwgbXNnLT5kc3IsCi0JCW1zZy0+cmksIG1zZy0+X3R4T2ZmLCBtc2ctPl90eFhvZmYsIG1zZy0+cnhFbmFibGVkLAotCQltc2ctPmNvbnRyb2xSZXNwb25zZSk7Ci0jZW5kaWYKLQotCS8qIE5vdyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIGRhdGEgKi8KLQotCiAJLyogQ2hlY2sgcG9ydCBudW1iZXIgZnJvbSBtZXNzYWdlIGFuZCByZXRyaWV2ZSBwcml2YXRlIGRhdGEgKi8KIAlpZiAobXNnLT5wb3J0ID49IHNlcmlhbC0+bnVtX3BvcnRzKSB7CiAJCWRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWRcbiIsIF9fZnVuY19fLCBtc2ctPnBvcnQpOwpAQCAtNTIzLDkgKzUxMiw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKmRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlcyAlMTJwaCIsIF9fZnVuY19fLCBkYXRhKTsqLwotCi0JLyogTm93IGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZGF0YSAqLwogCW1zZyA9IChzdHJ1Y3Qga2V5c3Bhbl91c2EyOF9wb3J0U3RhdHVzTWVzc2FnZSAqKWRhdGE7CiAKIAkvKiBDaGVjayBwb3J0IG51bWJlciBmcm9tIG1lc3NhZ2UgYW5kIHJldHJpZXZlIHByaXZhdGUgZGF0YSAqLwpAQCAtNjA1LDkgKzU5MSw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKmRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlczogJTExcGgiLCBfX2Z1bmNfXywgZGF0YSk7Ki8KLQotCS8qIE5vdyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIGRhdGEgKi8KIAltc2cgPSAoc3RydWN0IGtleXNwYW5fdXNhNDlfcG9ydFN0YXR1c01lc3NhZ2UgKilkYXRhOwogCiAJLyogQ2hlY2sgcG9ydCBudW1iZXIgZnJvbSBtZXNzYWdlIGFuZCByZXRyaWV2ZSBwcml2YXRlIGRhdGEgKi8KQEAgLTE3OTMsMTIgKzE3NzYsNiBAQAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCiAJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZFxuIiwgX19mdW5jX18pOwotI2lmIDAKLQllbHNlIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgT0sgJWQgYnl0ZXNcbiIsIF9fZnVuY19fLAotCQkgICAgdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwotCX0KLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTc2LDEzICsxOTUzLDYgQEAKIAllcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGVyciAhPSAwKQogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIGVycik7Ci0jaWYgMAotCWVsc2UgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKCVkKSBPSyAlZCBieXRlcyAoZW5kICVkKVxuIiwgX19mdW5jX18sCi0JCQlvdXRjb250X3VyYiwgdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSk7Ci0JfQotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggZTk3MjQxMi4uNzQyZDgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJCSIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKIAkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBjODhjYzQ5Li5kNzQ0MGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWVsc2UgewogCQlzdGF0dXMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc3RhdHVzX2J1Zik7CiAKLQkJZGV2X2luZm8oJnBvcnQtPnNlcmlhbC0+ZGV2LT5kZXYsICJyZWFkIHN0YXR1cyAleCAleCIsCisJCWRldl9pbmZvKCZwb3J0LT5zZXJpYWwtPmRldi0+ZGV2LCAicmVhZCBzdGF0dXMgJXggJXhcbiIsCiAJCQkgc3RhdHVzX2J1ZlswXSwgc3RhdHVzX2J1ZlsxXSk7CiAKIAkJKmxpbmVfc3RhdGVfcCA9IGtsc2lfMTA1X3N0YXR1czJsaW5lc3RhdGUoc3RhdHVzKTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCQlwcml2LT5jZmcuYmF1ZHJhdGUgPSBrbDVrdXNiMTA1YV9zaW9fYjExNTIwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZyhkZXYsICJLTFNJIFVTQi0+U2VyaWFsIGNvbnZlcnRlcjogdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgcmVxdWVzdCwgdXNpbmcgZGVmYXVsdCBvZiA5NjAwIik7CisJCWRldl9kYmcoZGV2LCAidW5zdXBwb3J0ZWQgYmF1ZHJhdGUsIHVzaW5nIDk2MDBcbiIpOwogCQlwcml2LT5jZmcuYmF1ZHJhdGUgPSBrbDVrdXNiMTA1YV9zaW9fYjk2MDA7CiAJCWJhdWQgPSA5NjAwOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwppbmRleCA2MThjMWMxLi5mZWUyNDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC01NTcsNyArNTU3LDggQEAKIAkJCSk7CiAKIAkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJIiVzIC0gU2VuZCByZXNldF9hbGxfcXVldWVzIChGTFVTSCkgVVJCIHJldHVybnM6ICVpIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCQkiJXMgLSBTZW5kIHJlc2V0X2FsbF9xdWV1ZXMgKEZMVVNIKSBVUkIgcmV0dXJuczogJWlcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKIAkJcmV0dXJuIChyZXN1bHQgPCAwKSA/IC1FSU86IDA7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCmluZGV4IDRlYjI3NzIuLmRmZDcyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCQkJICAgICBpbmRleCwgTlVMTCwgMCwgTU9TX1dEUl9USU1FT1VUKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZGV2X2VycigmdXNiZGV2LT5kZXYsCi0JCQkibW9zNzcyMDogdXNiX2NvbnRyb2xfbXNnKCkgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisJCQkibW9zNzcyMDogdXNiX2NvbnRyb2xfbXNnKCkgZmFpbGVkOiAlZFxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJKmRhdGEgPSAqYnVmOwogCWVsc2UgaWYgKHN0YXR1cyA8IDApCiAJCWRldl9lcnIoJnVzYmRldi0+ZGV2LAotCQkJIm1vczc3MjA6IHVzYl9jb250cm9sX21zZygpIGZhaWxlZDogJWQiLCBzdGF0dXMpOworCQkJIm1vczc3MjA6IHVzYl9jb250cm9sX21zZygpIGZhaWxlZDogJWRcbiIsIHN0YXR1cyk7CiAJa2ZyZWUoYnVmKTsKIAogCXJldHVybiBzdGF0dXM7CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCSAgICAgICZtb3NfcGFycG9ydC0+ZGVmZXJyZWRfdXJicyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vc19wYXJwb3J0LT5saXN0bG9jaywgZmxhZ3MpOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZtb3NfcGFycG9ydC0+dXJiX3Rhc2tsZXQpOwotCQlkZXZfZGJnKCZ1c2JkZXYtPmRldiwgInRhc2tsZXQgc2NoZWR1bGVkIik7CisJCWRldl9kYmcoJnVzYmRldi0+ZGV2LCAidGFza2xldCBzY2hlZHVsZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQxOCw3ICs0MTgsNyBAQAogCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAlpZiAocmV0X3ZhbCkgewogCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwKLQkJCSIlczogc3VibWl0X3VyYigpIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgcmV0X3ZhbCk7CisJCQkiJXM6IHN1Ym1pdF91cmIoKSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmV0X3ZhbCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtb3NfcGFycG9ydC0+bGlzdGxvY2ssIGZsYWdzKTsKIAkJbGlzdF9kZWwoJnVyYnRyYWNrLT51cmJsaXN0X2VudHJ5KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9zX3BhcnBvcnQtPmxpc3Rsb2NrLCBmbGFncyk7CkBAIC02NTYsNyArNjU2LDcgQEAKIAlwYXJwb3J0X2VwaWxvZ3VlKHBwKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoJm1vc19wYXJwb3J0LT5zZXJpYWwtPmRldi0+ZGV2LAotCQkJIm1vczc3MjA6IHVzYl9idWxrX21zZygpIGZhaWxlZDogJWQiLCByZXR2YWwpOworCQkJIm1vczc3MjA6IHVzYl9idWxrX21zZygpIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gYWN0dWFsX2xlbjsKQEAgLTg3NSw3ICs4NzUsNyBAQAogCWlmICghKGlpciAmIDB4MDEpKSB7CS8qIHNlcmlhbCBwb3J0IGludGVycnVwdCBwZW5kaW5nICovCiAJCXN3aXRjaCAoaWlyICYgMHgwZikgewogCQljYXNlIFNFUklBTF9JSVJfUkxTOgotCQkJZGV2X2RiZyhkZXYsICJTZXJpYWwgUG9ydDogUmVjZWl2ZXIgc3RhdHVzIGVycm9yIG9yIGFkZHJlc3MgYml0IGRldGVjdGVkIGluIDktYml0IG1vZGVcblxuIik7CisJCQlkZXZfZGJnKGRldiwgIlNlcmlhbCBQb3J0OiBSZWNlaXZlciBzdGF0dXMgZXJyb3Igb3IgYWRkcmVzcyBiaXQgZGV0ZWN0ZWQgaW4gOS1iaXQgbW9kZVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBTRVJJQUxfSUlSX0NUSToKIAkJCWRldl9kYmcoZGV2LCAiU2VyaWFsIFBvcnQ6IFJlY2VpdmVyIHRpbWUgb3V0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IGU5ZDk2N2YuLjM5M2JlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtNTIyLDExICs1MjIsMTEgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiBUaGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAorCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93bjogJWRcbiIsCiAJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZFxuIiwKIAkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3F1YXRlY2gyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYwppbmRleCA3NzI1ZWQyLi41MDRmNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCQkJIGRldmljZV9wb3J0LCBkYXRhLCAyLCBRVDJfVVNCX1RJTUVPVVQpOwogCiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvcGVuIHBvcnQgZmFpbGVkICVpIiwgX19mdW5jX18sCisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3BlbiBwb3J0IGZhaWxlZCAlaVxuIiwgX19mdW5jX18sCiAJCQlzdGF0dXMpOwogCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCmluZGV4IDRlYzA0ZjcuLmVmMGRiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwpAQCAtMjIwLDkgKzIyMCw5IEBACiAJCQkgICAgICBHRVRfVUFSVF9TVEFUVVMsIEdFVF9VQVJUX1NUQVRVU19UWVBFLAogCQkJICAgICAgMCwgR0VUX1VBUlRfU1RBVFVTX01TUiwgYnVmLCAxLCAxMDApOwogCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1vZGVtIHN0YXR1czogJWQiLCByZXQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1vZGVtIHN0YXR1czogJWRcbiIsIHJldCk7CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIweGMwOjB4MjI6MDo2ICAlZCAtIDB4MDIleCIsIHJldCwgKmJ1Zik7CisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiMHhjMDoweDIyOjA6NiAgJWQgLSAweDAyJXhcbiIsIHJldCwgKmJ1Zik7CiAJKnN0YXR1cyA9ICpidWY7CiAJa2ZyZWUoYnVmKTsKIApAQCAtMzQyLDggKzM0Miw3IEBACiAJY2FzZSAxMDAwMDAwOgogCQkJYnVmWzBdID0gMHgwYjsJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAic3BjcDgyNSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgIgotCQkJImJhdWRyYXRlIHJlcXVlc3RlZCwgdXNpbmcgZGVmYXVsdCBvZiA5NjAwLlxuIik7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgInVuc3VwcG9ydGVkIGJhdWRyYXRlLCB1c2luZyA5NjAwXG4iKTsKIAl9CiAKIAkvKiBTZXQgRGF0YSBMZW5ndGggOiAwMDo1Yml0LCAwMTo2Yml0LCAxMDo3Yml0LCAxMTo4Yml0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMKaW5kZXggOWZhN2RkNC4uOGZjZWVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3N5bWJvbHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zeW1ib2xzZXJpYWwuYwpAQCAtNzQsOSArNzQsNyBAQAogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKCZwb3J0LT5wb3J0LCAmZGF0YVsxXSwgZGF0YV9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCgmcG9ydC0+cG9ydCk7CiAJfSBlbHNlIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJIkltcHJvcGVyIGFtb3VudCBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZSwgIgotCQkJIiVkIGJ5dGVzIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzaG9ydCBwYWNrZXRcbiIsIF9fZnVuY19fKTsKIAl9CiAKIGV4aXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCBlYzdjZWE1Li4zZGQzZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCWludCBzdGF0dXM7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwKLQkJIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkIiwKKwkJIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkXG4iLAogCQlfX2Z1bmNfXywgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCiAJCWRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMsCiAJCWRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUpOwpAQCAtODAzLDcgKzgwMyw3IEBACiAJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsCi0JCSIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkIiwKKwkJIiVzIC0gQmF1ZFJhdGU9JWQsIHdCYXVkUmF0ZT0lZCwgd0ZsYWdzPTB4JTA0WCwgYkRhdGFCaXRzPSVkLCBiUGFyaXR5PSVkLCBiU3RvcEJpdHM9JWQsIGNYb249JWQsIGNYb2ZmPSVkLCBiVWFydE1vZGU9JWRcbiIsCiAJCV9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSwgY29uZmlnLT53RmxhZ3MsCiAJCWNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLAogCQljb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IDdjOWRjMjguLjgxZmMwZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtODY4LDcgKzg2OCw3IEBACiAJbWF4X2VuZHBvaW50cyA9IG1heChtYXhfZW5kcG9pbnRzLCAoaW50KXNlcmlhbC0+bnVtX3BvcnRzKTsKIAlzZXJpYWwtPm51bV9wb3J0X3BvaW50ZXJzID0gbWF4X2VuZHBvaW50czsKIAotCWRldl9kYmcoZGRldiwgInNldHRpbmcgdXAgJWQgcG9ydCBzdHJ1Y3R1cmVzIGZvciB0aGlzIGRldmljZSIsIG1heF9lbmRwb2ludHMpOworCWRldl9kYmcoZGRldiwgInNldHRpbmcgdXAgJWQgcG9ydCBzdHJ1Y3R1cmUocylcbiIsIG1heF9lbmRwb2ludHMpOwogCWZvciAoaSA9IDA7IGkgPCBtYXhfZW5kcG9pbnRzOyArK2kpIHsKIAkJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwb3J0KQpAQCAtOTIzLDkgKzkyMyw4IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmIChrZmlmb19hbGxvYygmcG9ydC0+d3JpdGVfZmlmbywgUEFHRV9TSVpFLCBHRlBfS0VSTkVMKSkKIAkJCWdvdG8gcHJvYmVfZXJyb3I7Ci0JCWJ1ZmZlcl9zaXplID0gc2VyaWFsLT50eXBlLT5idWxrX291dF9zaXplOwotCQlpZiAoIWJ1ZmZlcl9zaXplKQotCQkJYnVmZmVyX3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChlbmRwb2ludCk7CisJCWJ1ZmZlcl9zaXplID0gbWF4X3QoaW50LCBzZXJpYWwtPnR5cGUtPmJ1bGtfb3V0X3NpemUsCisJCQkJCQl1c2JfZW5kcG9pbnRfbWF4cChlbmRwb2ludCkpOwogCQlwb3J0LT5idWxrX291dF9zaXplID0gYnVmZmVyX3NpemU7CiAJCXBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCkBAIC0xMDM0LDcgKzEwMzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fcG9ydHM7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCQlkZXZfc2V0X25hbWUoJnBvcnQtPmRldiwgInR0eVVTQiVkIiwgcG9ydC0+bWlub3IpOwotCQlkZXZfZGJnKGRkZXYsICJyZWdpc3RlcmluZyAlcyIsIGRldl9uYW1lKCZwb3J0LT5kZXYpKTsKKwkJZGV2X2RiZyhkZGV2LCAicmVnaXN0ZXJpbmcgJXNcbiIsIGRldl9uYW1lKCZwb3J0LT5kZXYpKTsKIAkJZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKCZwb3J0LT5kZXYpOwogCiAJCXJldHZhbCA9IGRldmljZV9hZGQoJnBvcnQtPmRldik7CkBAIC0xMTYxLDkgKzExNjAsOSBAQAogCXVzYl9zZXJpYWxfdW5wb2lzb25fcG9ydF91cmJzKHNlcmlhbCk7CiAKIAlzZXJpYWwtPnN1c3BlbmRpbmcgPSAwOwotCWlmIChzZXJpYWwtPnR5cGUtPnJlc2V0X3Jlc3VtZSkKKwlpZiAoc2VyaWFsLT50eXBlLT5yZXNldF9yZXN1bWUpIHsKIAkJcnYgPSBzZXJpYWwtPnR5cGUtPnJlc2V0X3Jlc3VtZShzZXJpYWwpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCXJ2ID0gLUVPUE5PVFNVUFA7CiAJCWludGYtPm5lZWRzX2JpbmRpbmcgPSAxOwogCX0KQEAgLTEzMzgsOSArMTMzNyw5IEBACiAJaWYgKHJldHZhbCkgewogCQlwcl9lcnIoInByb2JsZW0gJWQgd2hlbiByZWdpc3RlcmluZyBkcml2ZXIgJXNcbiIsIHJldHZhbCwgZHJpdmVyLT5kZXNjcmlwdGlvbik7CiAJCWxpc3RfZGVsKCZkcml2ZXItPmRyaXZlcl9saXN0KTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlwcl9pbmZvKCJVU0IgU2VyaWFsIHN1cHBvcnQgcmVnaXN0ZXJlZCBmb3IgJXNcbiIsIGRyaXZlci0+ZGVzY3JpcHRpb24pOwotCisJfQogCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCAxZGQwNjA0Li4xM2I1YmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogY29uZmlnIFVTQl9VQVMKIAl0cmlzdGF0ZSAiVVNCIEF0dGFjaGVkIFNDU0kiCi0JZGVwZW5kcyBvbiBTQ1NJICYmIEJST0tFTgorCWRlcGVuZHMgb24gU0NTSSAmJiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFRoZSBVU0IgQXR0YWNoZWQgU0NTSSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgc29tZSBVU0IKIAkgIHN0b3JhZ2UgZGV2aWNlcy4gIEl0IHBlcm1pdHMgaGlnaGVyIHBlcmZvcm1hbmNlIGJ5IHN1cHBvcnRpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLWRldGVjdC5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMtZGV0ZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLWRldGVjdC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisjaW5jbHVkZSAidXNiLmgiCisKK3N0YXRpYyBpbnQgdWFzX2lzX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAoaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX01BU1NfU1RPUkFHRSAmJgorCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfU0NfU0NTSSAmJgorCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfUFJfVUFTKTsKK30KKworc3RhdGljIGludCB1YXNfaXNudF9zdXBwb3J0ZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKKworCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJUaGUgZHJpdmVyIGZvciB0aGUgVVNCIGNvbnRyb2xsZXIgJXMgZG9lcyBub3QgIgorCQkJInN1cHBvcnQgc2NhdHRlci1nYXRoZXIgd2hpY2ggaXNcbiIsCisJCQloY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24pOworCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJyZXF1aXJlZCBieSB0aGUgVUFTIGRyaXZlci4gUGxlYXNlIHRyeSBhbiIKKwkJCSJhbHRlcm5hdGl2ZSBVU0IgY29udHJvbGxlciBpZiB5b3Ugd2lzaCB0byB1c2UgVUFTLlxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWFzX2ZpbmRfdWFzX2FsdF9zZXR0aW5nKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCBpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgc2dfc3VwcG9ydGVkID0gdWRldi0+YnVzLT5zZ190YWJsZXNpemUgIT0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5udW1fYWx0c2V0dGluZzsgaSsrKSB7CisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9ICZpbnRmLT5hbHRzZXR0aW5nW2ldOworCisJCWlmICh1YXNfaXNfaW50ZXJmYWNlKGFsdCkpIHsKKwkJCWlmICghc2dfc3VwcG9ydGVkKQorCQkJCXJldHVybiB1YXNfaXNudF9zdXBwb3J0ZWQodWRldik7CisJCQlyZXR1cm4gYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWFzX2ZpbmRfZW5kcG9pbnRzKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCwKKwkJCSAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXBzW10pCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCA9IGFsdC0+ZW5kcG9pbnQ7CisJdW5zaWduZWQgaSwgbl9lbmRwb2ludHMgPSBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsKKworCWZvciAoaSA9IDA7IGkgPCBuX2VuZHBvaW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgKmV4dHJhID0gZW5kcG9pbnRbaV0uZXh0cmE7CisJCWludCBsZW4gPSBlbmRwb2ludFtpXS5leHRyYWxlbjsKKwkJd2hpbGUgKGxlbiA+PSAzKSB7CisJCQlpZiAoZXh0cmFbMV0gPT0gVVNCX0RUX1BJUEVfVVNBR0UpIHsKKwkJCQl1bnNpZ25lZCBwaXBlX2lkID0gZXh0cmFbMl07CisJCQkJaWYgKHBpcGVfaWQgPiAwICYmIHBpcGVfaWQgPCA1KQorCQkJCQllcHNbcGlwZV9pZCAtIDFdID0gJmVuZHBvaW50W2ldOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuIC09IGV4dHJhWzBdOworCQkJZXh0cmEgKz0gZXh0cmFbMF07CisJCX0KKwl9CisKKwlpZiAoIWVwc1swXSB8fCAhZXBzWzFdIHx8ICFlcHNbMl0gfHwgIWVwc1szXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1YXNfdXNlX3Vhc19kcml2ZXIoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcHNbNF0gPSB7IH07CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IGlkLT5kcml2ZXJfaW5mbzsKKwlpbnQgciwgYWx0OworCisJdXNiX3N0b3JfYWRqdXN0X3F1aXJrcyh1ZGV2LCAmZmxhZ3MpOworCisJaWYgKGZsYWdzICYgVVNfRkxfSUdOT1JFX1VBUykKKwkJcmV0dXJuIDA7CisKKwlpZiAodWRldi0+c3BlZWQgPj0gVVNCX1NQRUVEX1NVUEVSICYmICFoY2QtPmNhbl9kb19zdHJlYW1zKQorCQlyZXR1cm4gMDsKKworCWFsdCA9IHVhc19maW5kX3Vhc19hbHRfc2V0dGluZyhpbnRmKTsKKwlpZiAoYWx0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gdWFzX2ZpbmRfZW5kcG9pbnRzKCZpbnRmLT5hbHRzZXR0aW5nW2FsdF0sIGVwcyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMKaW5kZXggZDk2NmI1OS4uYTdhYzk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Vhcy5jCkBAIC0yLDYgKzIsNyBAQAogICogVVNCIEF0dGFjaGVkIFNDU0kKICAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIKICAqCisgKiBDb3B5cmlnaHQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4gZm9yIFJlZCBIYXQsIEluYy4gMjAxMwogICogQ29weXJpZ2h0IE1hdHRoZXcgV2lsY294IGZvciBJbnRlbCBDb3JwLCAyMDEwCiAgKiBDb3B5cmlnaHQgU2FyYWggU2hhcnAgZm9yIEludGVsIENvcnAsIDIwMTAKICAqCkBAIC0xMywxNyArMTQsMjEgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl91c3VhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc3RvcmFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91YXMuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAorI2luY2x1ZGUgInVhcy1kZXRlY3QuaCIKKwogLyoKICAqIFRoZSByMDAtcjAxYyBzcGVjcyBkZWZpbmUgdGhpcyB2ZXJzaW9uIG9mIHRoZSBTRU5TRSBJVSBkYXRhIHN0cnVjdHVyZS4KICAqIEl0J3Mgc3RpbGwgaW4gdXNlIGJ5IHNldmVyYWwgZGlmZmVyZW50IGZpcm13YXJlIHJlbGVhc2VzLgpAQCAtNDUsMTIgKzUwLDE3IEBACiAJc3RydWN0IHVzYl9hbmNob3Igc2Vuc2VfdXJiczsKIAlzdHJ1Y3QgdXNiX2FuY2hvciBkYXRhX3VyYnM7CiAJaW50IHFkZXB0aCwgcmVzZXR0aW5nOwotCXN0cnVjdCByZXNwb25zZV91aSByZXNwb25zZTsKKwlzdHJ1Y3QgcmVzcG9uc2VfaXUgcmVzcG9uc2U7CiAJdW5zaWduZWQgY21kX3BpcGUsIHN0YXR1c19waXBlLCBkYXRhX2luX3BpcGUsIGRhdGFfb3V0X3BpcGU7CiAJdW5zaWduZWQgdXNlX3N0cmVhbXM6MTsKIAl1bnNpZ25lZCB1YXNfc2Vuc2Vfb2xkOjE7CisJdW5zaWduZWQgcnVubmluZ190YXNrOjE7CisJdW5zaWduZWQgc2h1dGRvd246MTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kOwogCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGluZmxpZ2h0X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkZWFkX2xpc3Q7CiB9OwogCiBlbnVtIHsKQEAgLTg1LDEwMyArOTUsMTE3IEBACiAJCQkJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywgZ2ZwX3QgZ2ZwKTsKIHN0YXRpYyB2b2lkIHVhc19kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgaW50IHVhc190cnlfY29tcGxldGUoc3RydWN0IHNjc2lfY21uZCAqY21uZCwgY29uc3QgY2hhciAqY2FsbGVyKTsKK3N0YXRpYyB2b2lkIHVhc19mcmVlX3N0cmVhbXMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCB1YXNfbG9nX2NtZF9zdGF0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCi1zdGF0aWMgREVDTEFSRV9XT1JLKHVhc193b3JrLCB1YXNfZG9fd29yayk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVhc193b3JrX2xvY2spOwotc3RhdGljIExJU1RfSEVBRCh1YXNfd29ya19saXN0KTsKLQorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBkZXZpbmZvLT5sb2NrIGhlbGQsIHdpbGwgdGVtcG9yYXJ5IHVubG9jayB0aGUgbG9jayAqLwogc3RhdGljIHZvaWQgdWFzX3VubGlua19kYXRhX3VyYnMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywKLQkJCQkgc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbykKKwkJCQkgc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbywKKwkJCQkgdW5zaWduZWQgbG9uZyAqbG9ja19mbGFncykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyoKIAkgKiBUaGUgVU5MSU5LX0RBVEFfVVJCUyBmbGFnIG1ha2VzIHN1cmUgdWFzX3RyeV9jb21wbGV0ZQogCSAqIChjYWxsZWQgYnkgdXJiIGNvbXBsZXRpb24pIGRvZXNuJ3QgcmVsZWFzZSBjbWRpbmZvCiAJICogdW5kZXJuZWF0aCB1cy4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCWNtZGluZm8tPnN0YXRlIHw9IFVOTElOS19EQVRBX1VSQlM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssICpsb2NrX2ZsYWdzKTsKIAogCWlmIChjbWRpbmZvLT5kYXRhX2luX3VyYikKIAkJdXNiX3VubGlua191cmIoY21kaW5mby0+ZGF0YV9pbl91cmIpOwogCWlmIChjbWRpbmZvLT5kYXRhX291dF91cmIpCiAJCXVzYl91bmxpbmtfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCAqbG9ja19mbGFncyk7CiAJY21kaW5mby0+c3RhdGUgJj0gflVOTElOS19EQVRBX1VSQlM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB1YXNfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdWFzX2Rldl9pbmZvLCB3b3JrKTsKIAlzdHJ1Y3QgdWFzX2NtZF9pbmZvICpjbWRpbmZvOwotCXN0cnVjdCB1YXNfY21kX2luZm8gKnRlbXA7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCXNwaW5fbG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZ1YXNfd29ya19saXN0LCAmbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmbGlzdCwgbGlzdCkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRpbmZvLCAmZGV2aW5mby0+aW5mbGlnaHRfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3Qgc2NzaV9wb2ludGVyICpzY3AgPSAodm9pZCAqKWNtZGluZm87Ci0JCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLAotCQkJCQkJCXN0cnVjdCBzY3NpX2NtbmQsIFNDcCk7Ci0JCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAodm9pZCAqKWNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWVyciA9IHVhc19zdWJtaXRfdXJicyhjbW5kLCBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhLCBHRlBfQVRPTUlDKTsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGNvbnRhaW5lcl9vZihzY3AsIHN0cnVjdCBzY3NpX2NtbmQsCisJCQkJCQkgICAgICBTQ3ApOworCisJCWlmICghKGNtZGluZm8tPnN0YXRlICYgSVNfSU5fV09SS19MSVNUKSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHVhc19zdWJtaXRfdXJicyhjbW5kLCBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhLCBHRlBfTk9JTyk7CiAJCWlmICghZXJyKQogCQkJY21kaW5mby0+c3RhdGUgJj0gfklTX0lOX1dPUktfTElTVDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZXJyKSB7Ci0JCQlsaXN0X2RlbCgmY21kaW5mby0+bGlzdCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZ1YXNfd29ya19saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmdWFzX3dvcmtfbG9jayk7Ci0JCQlzY2hlZHVsZV93b3JrKCZ1YXNfd29yayk7Ci0JCX0KKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmZGV2aW5mby0+d29yayk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgdWFzX2Fib3J0X3dvcmsoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKK3N0YXRpYyB2b2lkIHVhc19tYXJrX2NtZF9kZWFkKHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8sCisJCQkgICAgICBzdHJ1Y3QgdWFzX2NtZF9pbmZvICpjbWRpbmZvLAorCQkJICAgICAgaW50IHJlc3VsdCwgY29uc3QgY2hhciAqY2FsbGVyKQoreworCXN0cnVjdCBzY3NpX3BvaW50ZXIgKnNjcCA9ICh2b2lkICopY21kaW5mbzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gY29udGFpbmVyX29mKHNjcCwgc3RydWN0IHNjc2lfY21uZCwgU0NwKTsKKworCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIGNhbGxlcik7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOworCVdBUk5fT05fT05DRShjbWRpbmZvLT5zdGF0ZSAmIENPTU1BTkRfQUJPUlRFRCk7CisJY21kaW5mby0+c3RhdGUgfD0gQ09NTUFORF9BQk9SVEVEOworCWNtZGluZm8tPnN0YXRlICY9IH5JU19JTl9XT1JLX0xJU1Q7CisJY21uZC0+cmVzdWx0ID0gcmVzdWx0IDw8IDE2OworCWxpc3RfbW92ZV90YWlsKCZjbWRpbmZvLT5saXN0LCAmZGV2aW5mby0+ZGVhZF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgdWFzX2Fib3J0X2luZmxpZ2h0KHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8sIGludCByZXN1bHQsCisJCQkgICAgICAgY29uc3QgY2hhciAqY2FsbGVyKQogewogCXN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm87CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqdGVtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZ1YXNfd29ya19saXN0LCAmbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmZGV2aW5mby0+aW5mbGlnaHRfbGlzdCwgbGlzdCkKKwkJdWFzX21hcmtfY21kX2RlYWQoZGV2aW5mbywgY21kaW5mbywgcmVzdWx0LCBjYWxsZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdWFzX2FkZF93b3JrKHN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm8pCit7CisJc3RydWN0IHNjc2lfcG9pbnRlciAqc2NwID0gKHZvaWQgKiljbWRpbmZvOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBTQ3ApOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOworCWNtZGluZm8tPnN0YXRlIHw9IElTX0lOX1dPUktfTElTVDsKKwlzY2hlZHVsZV93b3JrKCZkZXZpbmZvLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgdWFzX3phcF9kZWFkKHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8pCit7CisJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbzsKKwlzdHJ1Y3QgdWFzX2NtZF9pbmZvICp0ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmZGV2aW5mby0+ZGVhZF9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBzY3NpX3BvaW50ZXIgKnNjcCA9ICh2b2lkICopY21kaW5mbzsKLQkJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGNvbnRhaW5lcl9vZihzY3AsCi0JCQkJCQkJc3RydWN0IHNjc2lfY21uZCwgU0NwKTsKLQkJc3RydWN0IHVhc19kZXZfaW5mbyAqZGkgPSAodm9pZCAqKWNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0KLQkJaWYgKGRpID09IGRldmluZm8pIHsKLQkJCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQUJPUlRFRDsKLQkJCWNtZGluZm8tPnN0YXRlICY9IH5JU19JTl9XT1JLX0xJU1Q7Ci0JCQlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7Ci0JCQkJLyogdWFzX3N0YXRfY21wbHQoKSB3aWxsIG5vdCBkbyB0aGF0Ci0JCQkJICogd2hlbiBhIGRldmljZSByZXNldCBpcyBpbgotCQkJCSAqIHByb2dyZXNzICovCi0JCQkJY21kaW5mby0+c3RhdGUgJj0gfkNPTU1BTkRfSU5GTElHSFQ7Ci0JCQl9Ci0JCQl1YXNfdHJ5X2NvbXBsZXRlKGNtbmQsIF9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCS8qIG5vdCBvdXIgdWFzIGRldmljZSwgcmVsaW5rIGludG8gbGlzdCAqLwotCQkJbGlzdF9kZWwoJmNtZGluZm8tPmxpc3QpOwotCQkJc3Bpbl9sb2NrX2lycSgmdWFzX3dvcmtfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZjbWRpbmZvLT5saXN0LCAmdWFzX3dvcmtfbGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCQl9CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLCBzdHJ1Y3Qgc2NzaV9jbW5kLAorCQkJCQkJICAgICAgU0NwKTsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlXQVJOX09OX09OQ0UoIShjbWRpbmZvLT5zdGF0ZSAmIENPTU1BTkRfQUJPUlRFRCkpOworCQkvKiBhbGwgdXJicyBhcmUga2lsbGVkLCBjbGVhciBpbmZsaWdodCBiaXRzICovCisJCWNtZGluZm8tPnN0YXRlICY9IH4oQ09NTUFORF9JTkZMSUdIVCB8CisJCQkJICAgIERBVEFfSU5fVVJCX0lORkxJR0hUIHwKKwkJCQkgICAgREFUQV9PVVRfVVJCX0lORkxJR0hUKTsKKwkJdWFzX3RyeV9jb21wbGV0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJfQorCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNTksMjAgKzI4MywxOSBAQAogCXN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm8gPSAodm9pZCAqKSZjbW5kLT5TQ3A7CiAJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9ICh2b2lkICopY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZkZXZpbmZvLT5sb2NrKSk7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOwogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIChDT01NQU5EX0lORkxJR0hUIHwKIAkJCSAgICAgIERBVEFfSU5fVVJCX0lORkxJR0hUIHwKIAkJCSAgICAgIERBVEFfT1VUX1VSQl9JTkZMSUdIVCB8CiAJCQkgICAgICBVTkxJTktfREFUQV9VUkJTKSkKIAkJcmV0dXJuIC1FQlVTWTsKLQlCVUdfT04oY21kaW5mby0+c3RhdGUgJiBDT01NQU5EX0NPTVBMRVRFRCk7CisJV0FSTl9PTl9PTkNFKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9DT01QTEVURUQpOwogCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQ09NUExFVEVEOwogCXVzYl9mcmVlX3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYik7CiAJdXNiX2ZyZWVfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7Ci0JaWYgKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9BQk9SVEVEKSB7CisJaWYgKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9BQk9SVEVEKQogCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsICJhYm9ydCBjb21wbGV0ZWRcbiIpOwotCQljbW5kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JfQorCWxpc3RfZGVsKCZjbWRpbmZvLT5saXN0KTsKIAljbW5kLT5zY3NpX2RvbmUoY21uZCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yODYsMTEgKzMwOSw3IEBACiAJY21kaW5mby0+c3RhdGUgfD0gZGlyZWN0aW9uIHwgU1VCTUlUX1NUQVRVU19VUkI7CiAJZXJyID0gdWFzX3N1Ym1pdF91cmJzKGNtbmQsIGNtbmQtPmRldmljZS0+aG9zdGRhdGEsIEdGUF9BVE9NSUMpOwogCWlmIChlcnIpIHsKLQkJc3Bpbl9sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmY21kaW5mby0+bGlzdCwgJnVhc193b3JrX2xpc3QpOwotCQljbWRpbmZvLT5zdGF0ZSB8PSBJU19JTl9XT1JLX0xJU1Q7Ci0JCXNwaW5fdW5sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJc2NoZWR1bGVfd29yaygmdWFzX3dvcmspOworCQl1YXNfYWRkX3dvcmsoY21kaW5mbyk7CiAJfQogfQogCkBAIC0yOTgsMTQgKzMxNywyMCBAQAogewogCXN0cnVjdCBpdSAqaXUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHZvaWQgKilzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQ7CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiB0YWc7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIlVSQiBCQUQgU1RBVFVTICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAic3RhdCB1cmI6IGtpbGxlZCwgc3RyZWFtICVkXG4iLAorCQkJCXVyYi0+c3RyZWFtX2lkKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJzdGF0IHVyYjogc3RhdHVzICVkXG4iLAorCQkJCXVyYi0+c3RhdHVzKTsKKwkJfQogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMyNCw2ICszNDksOSBAQAogCiAJaWYgKCFjbW5kKSB7CiAJCWlmIChpdS0+aXVfaWQgPT0gSVVfSURfUkVTUE9OU0UpIHsKKwkJCWlmICghZGV2aW5mby0+cnVubmluZ190YXNrKQorCQkJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LAorCQkJCSAgICAic3RhdCB1cmI6IHJlY3YgdW5leHBlY3RlZCByZXNwb25zZSBpdVxuIik7CiAJCQkvKiBzdG9yZSByZXN1bHRzIGZvciB1YXNfZWhfdGFza19tZ210KCkgKi8KIAkJCW1lbWNweSgmZGV2aW5mby0+cmVzcG9uc2UsIGl1LCBzaXplb2YoZGV2aW5mby0+cmVzcG9uc2UpKTsKIAkJfQpAQCAtMzQ2LDE3ICszNzQsMjUgQEAKIAkJCXVhc19zZW5zZSh1cmIsIGNtbmQpOwogCQlpZiAoY21uZC0+cmVzdWx0ICE9IDApIHsKIAkJCS8qIGNhbmNlbCBkYXRhIHRyYW5zZmVycyBvbiBlcnJvciAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCQkJdWFzX3VubGlua19kYXRhX3VyYnMoZGV2aW5mbywgY21kaW5mbyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQkJdWFzX3VubGlua19kYXRhX3VyYnMoZGV2aW5mbywgY21kaW5mbywgJmZsYWdzKTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+Q09NTUFORF9JTkZMSUdIVDsKIAkJdWFzX3RyeV9jb21wbGV0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVVfSURfUkVBRF9SRUFEWToKKwkJaWYgKCFjbWRpbmZvLT5kYXRhX2luX3VyYiB8fAorCQkJCShjbWRpbmZvLT5zdGF0ZSAmIERBVEFfSU5fVVJCX0lORkxJR0hUKSkgeworCQkJc2NtZF9wcmludGsoS0VSTl9FUlIsIGNtbmQsICJ1bmV4cGVjdGVkIHJlYWQgcmR5XG4iKTsKKwkJCWJyZWFrOworCQl9CiAJCXVhc194ZmVyX2RhdGEodXJiLCBjbW5kLCBTVUJNSVRfREFUQV9JTl9VUkIpOwogCQlicmVhazsKIAljYXNlIElVX0lEX1dSSVRFX1JFQURZOgorCQlpZiAoIWNtZGluZm8tPmRhdGFfb3V0X3VyYiB8fAorCQkJCShjbWRpbmZvLT5zdGF0ZSAmIERBVEFfT1VUX1VSQl9JTkZMSUdIVCkpIHsKKwkJCXNjbWRfcHJpbnRrKEtFUk5fRVJSLCBjbW5kLCAidW5leHBlY3RlZCB3cml0ZSByZHlcbiIpOworCQkJYnJlYWs7CisJCX0KIAkJdWFzX3hmZXJfZGF0YSh1cmIsIGNtbmQsIFNVQk1JVF9EQVRBX09VVF9VUkIpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzgzLDggKzQxOSwxNSBAQAogCQlzZGIgPSBzY3NpX291dChjbW5kKTsKIAkJY21kaW5mby0+c3RhdGUgJj0gfkRBVEFfT1VUX1VSQl9JTkZMSUdIVDsKIAl9Ci0JQlVHX09OKHNkYiA9PSBOVUxMKTsKLQlpZiAodXJiLT5zdGF0dXMpIHsKKwlpZiAoc2RiID09IE5VTEwpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCX0gZWxzZSBpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKSB7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CisJCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21uZCwKKwkJCQkiZGF0YSBjbXBsdCBlcnIgJWQgc3RyZWFtICVkXG4iLAorCQkJCXVyYi0+c3RhdHVzLCB1cmItPnN0cmVhbV9pZCk7CisJCX0KIAkJLyogZXJyb3I6IG5vIGRhdGEgdHJhbnNmZXJlZCAqLwogCQlzZGItPnJlc2lkID0gc2RiLT5sZW5ndGg7CiAJfSBlbHNlIHsKQEAgLTM5NCw2ICs0MzcsMTcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIHVhc19jbWRfY21wbHQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSB1cmItPmNvbnRleHQ7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21uZCwgImNtZCBjbXBsdCBlcnIgJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwl9CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXJiICp1YXNfYWxsb2NfZGF0YV91cmIoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywgZ2ZwX3QgZ2ZwLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBwaXBlLCB1MTYgc3RyZWFtX2lkLAogCQkJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCkBAIC00MDgsOCArNDYyLDcgQEAKIAkJZ290byBvdXQ7CiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1ZGV2LCBwaXBlLCBOVUxMLCBzZGItPmxlbmd0aCwKIAkJCSAgdWFzX2RhdGFfY21wbHQsIGNtbmQpOwotCWlmIChkZXZpbmZvLT51c2Vfc3RyZWFtcykKLQkJdXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisJdXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CiAJdXJiLT5udW1fc2dzID0gdWRldi0+YnVzLT5zZ190YWJsZXNpemUgPyBzZGItPnRhYmxlLm5lbnRzIDogMDsKIAl1cmItPnNnID0gc2RiLT50YWJsZS5zZ2w7CiAgb3V0OgpAQCAtNDQyLDcgKzQ5NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXJiICp1YXNfYWxsb2NfY21kX3VyYihzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvLCBnZnBfdCBnZnAsCi0JCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsIHUxNiBzdHJlYW1faWQpCisJCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXZpbmZvLT51ZGV2OwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtbmQtPmRldmljZTsKQEAgLTQ3Miw3ICs1MjUsNyBAQAogCW1lbWNweShpdS0+Y2RiLCBjbW5kLT5jbW5kLCBjbW5kLT5jbWRfbGVuKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdWRldiwgZGV2aW5mby0+Y21kX3BpcGUsIGl1LCBzaXplb2YoKml1KSArIGxlbiwKLQkJCQkJCQl1c2JfZnJlZV91cmIsIE5VTEwpOworCQkJCQkJCXVhc19jbWRfY21wbHQsIGNtbmQpOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogIG91dDoKIAlyZXR1cm4gdXJiOwpAQCAtNTEyLDEzICs1NjUsMTcgQEAKIAl9CiAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVkZXYsIGRldmluZm8tPmNtZF9waXBlLCBpdSwgc2l6ZW9mKCppdSksCi0JCQkgIHVzYl9mcmVlX3VyYiwgTlVMTCk7CisJCQkgIHVhc19jbWRfY21wbHQsIGNtbmQpOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogCi0JZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBnZnApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJmRldmluZm8tPmNtZF91cmJzKTsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIGdmcCk7CisJaWYgKGVycikgeworCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CisJCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIF9fZnVuY19fKTsKKwkJc2NtZF9wcmludGsoS0VSTl9FUlIsIGNtbmQsICJ0YXNrIHN1Ym1pc3Npb24gZXJyICVkXG4iLCBlcnIpOworCQlnb3RvIGVycjsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtNTMzLDM4ICs1OTAsNDMgQEAKICAqIGRhZnQgdG8gbWUuCiAgKi8KIAotc3RhdGljIGludCB1YXNfc3VibWl0X3NlbnNlX3VyYihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCQlnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBzdHJlYW0pCitzdGF0aWMgc3RydWN0IHVyYiAqdWFzX3N1Ym1pdF9zZW5zZV91cmIoc3RydWN0IHNjc2lfY21uZCAqY21uZCwKKwkJCQkJZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgc3RyZWFtKQogewotCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAodm9pZCAqKXNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IHVyYiAqdXJiOworCWludCBlcnI7CiAKIAl1cmIgPSB1YXNfYWxsb2Nfc2Vuc2VfdXJiKGRldmluZm8sIGdmcCwgc2hvc3QsIHN0cmVhbSk7CiAJaWYgKCF1cmIpCi0JCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKHVyYiwgZ2ZwKSkgewotCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKLQkJCSAgICAgInNlbnNlIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOwotCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKLQl9CisJCXJldHVybiBOVUxMOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJmRldmluZm8tPnNlbnNlX3VyYnMpOwotCXJldHVybiAwOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgZ2ZwKTsKKwlpZiAoZXJyKSB7CisJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKKwkJCSAgICAgInNlbnNlIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkIHN0cmVhbSAlZFxuIiwKKwkJCSAgICAgZXJyLCBzdHJlYW0pOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB1cmI7CiB9CiAKIHN0YXRpYyBpbnQgdWFzX3N1Ym1pdF91cmJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCiAJCQkgICBzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbyA9ICh2b2lkICopJmNtbmQtPlNDcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAJaW50IGVycjsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZkZXZpbmZvLT5sb2NrKSk7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOwogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9TVEFUVVNfVVJCKSB7Ci0JCWVyciA9IHVhc19zdWJtaXRfc2Vuc2VfdXJiKGNtbmQtPmRldmljZS0+aG9zdCwgZ2ZwLAotCQkJCQkgICBjbWRpbmZvLT5zdHJlYW0pOwotCQlpZiAoZXJyKSB7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCXVyYiA9IHVhc19zdWJtaXRfc2Vuc2VfdXJiKGNtbmQsIGdmcCwgY21kaW5mby0+c3RyZWFtKTsKKwkJaWYgKCF1cmIpCisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX1NUQVRVU19VUkI7CiAJfQogCkBAIC01NzgsMTQgKzY0MCwxOCBAQAogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9EQVRBX0lOX1VSQikgewotCQlpZiAodXNiX3N1Ym1pdF91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsIGdmcCkpIHsKKwkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYiwgZ2ZwKTsKKwkJaWYgKGVycikgeworCQkJdXNiX3VuYW5jaG9yX3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYik7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsCi0JCQkJCSJkYXRhIGluIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOworCQkJCSJkYXRhIGluIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkIHN0cmVhbSAlZFxuIiwKKwkJCQllcnIsIGNtZGluZm8tPmRhdGFfaW5fdXJiLT5zdHJlYW1faWQpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX0RBVEFfSU5fVVJCOwogCQljbWRpbmZvLT5zdGF0ZSB8PSBEQVRBX0lOX1VSQl9JTkZMSUdIVDsKLQkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIEFMTE9DX0RBVEFfT1VUX1VSQikgewpAQCAtNTk4LDMzICs2NjQsMzcgQEAKIAl9CiAKIAlpZiAoY21kaW5mby0+c3RhdGUgJiBTVUJNSVRfREFUQV9PVVRfVVJCKSB7Ci0JCWlmICh1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5kYXRhX291dF91cmIsIGdmcCkpIHsKKwkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9vdXRfdXJiLCAmZGV2aW5mby0+ZGF0YV91cmJzKTsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIoY21kaW5mby0+ZGF0YV9vdXRfdXJiLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQl1c2JfdW5hbmNob3JfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsCi0JCQkJCSJkYXRhIG91dCB1cmIgc3VibWlzc2lvbiBmYWlsdXJlXG4iKTsKKwkJCQkiZGF0YSBvdXQgdXJiIHN1Ym1pc3Npb24gZXJyb3IgJWQgc3RyZWFtICVkXG4iLAorCQkJCWVyciwgY21kaW5mby0+ZGF0YV9vdXRfdXJiLT5zdHJlYW1faWQpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX0RBVEFfT1VUX1VSQjsKIAkJY21kaW5mby0+c3RhdGUgfD0gREFUQV9PVVRfVVJCX0lORkxJR0hUOwotCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5kYXRhX291dF91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIEFMTE9DX0NNRF9VUkIpIHsKLQkJY21kaW5mby0+Y21kX3VyYiA9IHVhc19hbGxvY19jbWRfdXJiKGRldmluZm8sIGdmcCwgY21uZCwKLQkJCQkJCSAgICAgY21kaW5mby0+c3RyZWFtKTsKKwkJY21kaW5mby0+Y21kX3VyYiA9IHVhc19hbGxvY19jbWRfdXJiKGRldmluZm8sIGdmcCwgY21uZCk7CiAJCWlmICghY21kaW5mby0+Y21kX3VyYikKIAkJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJCWNtZGluZm8tPnN0YXRlICY9IH5BTExPQ19DTURfVVJCOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9DTURfVVJCKSB7Ci0JCXVzYl9nZXRfdXJiKGNtZGluZm8tPmNtZF91cmIpOwotCQlpZiAodXNiX3N1Ym1pdF91cmIoY21kaW5mby0+Y21kX3VyYiwgZ2ZwKSkgeworCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5jbWRfdXJiLCAmZGV2aW5mby0+Y21kX3VyYnMpOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5jbWRfdXJiLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQl1c2JfdW5hbmNob3JfdXJiKGNtZGluZm8tPmNtZF91cmIpOworCQkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOwogCQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbW5kLAotCQkJCQkiY21kIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOworCQkJCSAgICAiY21kIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkXG4iLCBlcnIpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQotCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5jbWRfdXJiLCAmZGV2aW5mby0+Y21kX3VyYnMpOwotCQl1c2JfcHV0X3VyYihjbWRpbmZvLT5jbWRfdXJiKTsKIAkJY21kaW5mby0+Y21kX3VyYiA9IE5VTEw7CiAJCWNtZGluZm8tPnN0YXRlICY9IH5TVUJNSVRfQ01EX1VSQjsKIAkJY21kaW5mby0+c3RhdGUgfD0gQ09NTUFORF9JTkZMSUdIVDsKQEAgLTY0NCwxOCArNzE0LDIyIEBACiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB1YXNfY21kX2luZm8pID4gc2l6ZW9mKHN0cnVjdCBzY3NpX3BvaW50ZXIpKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisKIAlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7CiAJCWNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAkJY21uZC0+c2NzaV9kb25lKGNtbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRldmluZm8tPmNtbmQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCX0KIAorCW1lbXNldChjbWRpbmZvLCAwLCBzaXplb2YoKmNtZGluZm8pKTsKKwogCWlmIChibGtfcnFfdGFnZ2VkKGNtbmQtPnJlcXVlc3QpKSB7CiAJCWNtZGluZm8tPnN0cmVhbSA9IGNtbmQtPnJlcXVlc3QtPnRhZyArIDI7CiAJfSBlbHNlIHsKQEAgLTY5MiwxMyArNzY2LDEwIEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCQl9Ci0JCXNwaW5fbG9jaygmdWFzX3dvcmtfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZ1YXNfd29ya19saXN0KTsKLQkJY21kaW5mby0+c3RhdGUgfD0gSVNfSU5fV09SS19MSVNUOwotCQlzcGluX3VubG9jaygmdWFzX3dvcmtfbG9jayk7Ci0JCXNjaGVkdWxlX3dvcmsoJnVhc193b3JrKTsKKwkJdWFzX2FkZF93b3JrKGNtZGluZm8pOwogCX0KIAorCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZkZXZpbmZvLT5pbmZsaWdodF9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MDksNDYgKzc4MCw3OCBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lLCB1OCBmdW5jdGlvbikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKLQlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHZvaWQgKilzaG9zdC0+aG9zdGRhdGFbMF07Ci0JdTE2IHRhZyA9IGRldmluZm8tPnFkZXB0aCAtIDE7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOworCXUxNiB0YWcgPSBkZXZpbmZvLT5xZGVwdGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXJiICpzZW5zZV91cmI7CisJaW50IHJlc3VsdCA9IFNVQ0NFU1M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCW1lbXNldCgmZGV2aW5mby0+cmVzcG9uc2UsIDAsIHNpemVvZihkZXZpbmZvLT5yZXNwb25zZSkpOwotCWlmICh1YXNfc3VibWl0X3NlbnNlX3VyYihzaG9zdCwgR0ZQX0FUT01JQywgdGFnKSkgeworCisJaWYgKGRldmluZm8tPnJlc2V0dGluZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGRldmluZm8tPnJ1bm5pbmdfdGFzaykgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKLQkJCSAgICAgIiVzOiAlczogc3VibWl0IHNlbnNlIHVyYiBmYWlsZWRcbiIsCisJCQkgICAgICIlczogJXM6IGVycm9yIGFscmVhZHkgcnVubmluZyBhIHRhc2tcbiIsCiAJCQkgICAgIF9fZnVuY19fLCBmbmFtZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9Ci0JaWYgKHVhc19zdWJtaXRfdGFza191cmIoY21uZCwgR0ZQX0FUT01JQywgZnVuY3Rpb24sIHRhZykpIHsKKworCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDE7CisJbWVtc2V0KCZkZXZpbmZvLT5yZXNwb25zZSwgMCwgc2l6ZW9mKGRldmluZm8tPnJlc3BvbnNlKSk7CisJc2Vuc2VfdXJiID0gdWFzX3N1Ym1pdF9zZW5zZV91cmIoY21uZCwgR0ZQX05PSU8sCisJCQkJCSBkZXZpbmZvLT51c2Vfc3RyZWFtcyA/IHRhZyA6IDApOworCWlmICghc2Vuc2VfdXJiKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAorCQkJICAgICAiJXM6ICVzOiBzdWJtaXQgc2Vuc2UgdXJiIGZhaWxlZFxuIiwKKwkJCSAgICAgX19mdW5jX18sIGZuYW1lKTsKKwkJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlpZiAodWFzX3N1Ym1pdF90YXNrX3VyYihjbW5kLCBHRlBfTk9JTywgZnVuY3Rpb24sIHRhZykpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsCiAJCQkgICAgICIlczogJXM6IHN1Ym1pdCB0YXNrIG1nbXQgdXJiIGZhaWxlZFxuIiwKIAkJCSAgICAgX19mdW5jX18sIGZuYW1lKTsKKwkJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQl1c2Jfa2lsbF91cmIoc2Vuc2VfdXJiKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHVzYl93YWl0X2FuY2hvcl9lbXB0eV90aW1lb3V0KCZkZXZpbmZvLT5zZW5zZV91cmJzLCAzMDAwKSA9PSAwKSB7CisJCS8qCisJCSAqIE5vdGUgd2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBjbGVhciBydW5uaW5nX3Rhc2sgaGVyZS4gSWYgd2UKKwkJICogYWxsb3cgbmV3IHRhc2tzIHRvIGJlIHN1Ym1pdHRlZCwgdGhlcmUgaXMgbm8gd2F5IHRvIGZpZ3VyZQorCQkgKiBvdXQgaWYgYSByZWNlaXZlZCByZXNwb25zZV9pdSBpcyBmb3IgdGhlIGZhaWxlZCB0YXNrIG9yIGZvcgorCQkgKiB0aGUgbmV3IG9uZS4gQSBidXMtcmVzZXQgd2lsbCBldmVudHVhbGx5IGNsZWFyIHJ1bm5pbmdfdGFzay4KKwkJICovCiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAogCQkJICAgICAiJXM6ICVzIHRpbWVkIG91dFxuIiwgX19mdW5jX18sIGZuYW1lKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDA7CiAJaWYgKGJlMTZfdG9fY3B1KGRldmluZm8tPnJlc3BvbnNlLnRhZykgIT0gdGFnKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAogCQkJICAgICAiJXM6ICVzIGZhaWxlZCAod3JvbmcgdGFnICVkLyVkKVxuIiwgX19mdW5jX18sCiAJCQkgICAgIGZuYW1lLCBiZTE2X3RvX2NwdShkZXZpbmZvLT5yZXNwb25zZS50YWcpLCB0YWcpOwotCQlyZXR1cm4gRkFJTEVEOwotCX0KLQlpZiAoZGV2aW5mby0+cmVzcG9uc2UucmVzcG9uc2VfY29kZSAhPSBSQ19UTUZfQ09NUExFVEUpIHsKKwkJcmVzdWx0ID0gRkFJTEVEOworCX0gZWxzZSBpZiAoZGV2aW5mby0+cmVzcG9uc2UucmVzcG9uc2VfY29kZSAhPSBSQ19UTUZfQ09NUExFVEUpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsCiAJCQkgICAgICIlczogJXMgZmFpbGVkIChyYyAweCV4KVxuIiwgX19mdW5jX18sCiAJCQkgICAgIGZuYW1lLCBkZXZpbmZvLT5yZXNwb25zZS5yZXNwb25zZV9jb2RlKTsKLQkJcmV0dXJuIEZBSUxFRDsKKwkJcmVzdWx0ID0gRkFJTEVEOwogCX0KLQlyZXR1cm4gU1VDQ0VTUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHVhc19laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCkBAIC03NTgsMjIgKzg2MSwxOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIF9fZnVuY19fKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQUJPUlRFRDsKLQlpZiAoY21kaW5mby0+c3RhdGUgJiBJU19JTl9XT1JLX0xJU1QpIHsKLQkJc3Bpbl9sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJbGlzdF9kZWwoJmNtZGluZm8tPmxpc3QpOwotCQljbWRpbmZvLT5zdGF0ZSAmPSB+SVNfSU5fV09SS19MSVNUOwotCQlzcGluX3VubG9jaygmdWFzX3dvcmtfbG9jayk7CisKKwlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKIAl9CisKKwl1YXNfbWFya19jbWRfZGVhZChkZXZpbmZvLCBjbWRpbmZvLCBESURfQUJPUlQsIF9fZnVuY19fKTsKIAlpZiAoY21kaW5mby0+c3RhdGUgJiBDT01NQU5EX0lORkxJR0hUKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIAkJcmV0ID0gdWFzX2VoX3Rhc2tfbWdtdChjbW5kLCAiQUJPUlQgVEFTSyIsIFRNRl9BQk9SVF9UQVNLKTsKIAl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXVhc191bmxpbmtfZGF0YV91cmJzKGRldmluZm8sIGNtZGluZm8pOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQl1YXNfdW5saW5rX2RhdGFfdXJicyhkZXZpbmZvLCBjbWRpbmZvLCAmZmxhZ3MpOwogCQl1YXNfdHJ5X2NvbXBsZXRlKGNtbmQsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCQlyZXQgPSBTVUNDRVNTOwpAQCAtNzk1LDE0ICs4OTUsMjUgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRldmluZm8tPnVkZXY7CiAJaW50IGVycjsKIAorCWVyciA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQodWRldiwgZGV2aW5mby0+aW50Zik7CisJaWYgKGVycikgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNkZXYtPmhvc3QsCisJCQkgICAgICIlcyBGQUlMRUQgdG8gZ2V0IGxvY2sgZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzZGV2LT5ob3N0LCAiJXMgc3RhcnRcbiIsIF9fZnVuY19fKTsKIAlkZXZpbmZvLT5yZXNldHRpbmcgPSAxOwotCXVhc19hYm9ydF93b3JrKGRldmluZm8pOworCXVhc19hYm9ydF9pbmZsaWdodChkZXZpbmZvLCBESURfUkVTRVQsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZkZXZpbmZvLT5jbWRfdXJicyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+c2Vuc2VfdXJicyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+ZGF0YV91cmJzKTsKKwl1YXNfemFwX2RlYWQoZGV2aW5mbyk7CiAJZXJyID0gdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKIAlkZXZpbmZvLT5yZXNldHRpbmcgPSAwOwogCisJdXNiX3VubG9ja19kZXZpY2UodWRldik7CisKIAlpZiAoZXJyKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNkZXYtPmhvc3QsICIlcyBGQUlMRURcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIEZBSUxFRDsKQEAgLTgxNCw3ICs5MjUsMjUgQEAKIAogc3RhdGljIGludCB1YXNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXNkZXYtPmhvc3RkYXRhID0gKHZvaWQgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzZGV2LT5ob3N0ZGF0YSA9ICh2b2lkICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBVU0IgaGFzIHVudXN1YWwgRE1BLWFsaWdubWVudCByZXF1aXJlbWVudHM6IEFsdGhvdWdoIHRoZQorCSAqIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZWFjaCBzY2F0dGVyLWdhdGhlciBlbGVtZW50IGRvZXNuJ3QgbWF0dGVyLAorCSAqIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IGV4Y2VwdCB0aGUgbGFzdCBtdXN0IGJlIGRpdmlzaWJsZQorCSAqIGJ5IHRoZSBCdWxrIG1heHBhY2tldCB2YWx1ZS4gIFRoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB0bworCSAqIGV4cHJlc3MgdGhpcyBieSBibG9jay1sYXllciBjb25zdHJhaW50cywgc28gd2UnbGwgY29wIG91dAorCSAqIGFuZCBzaW1wbHkgcmVxdWlyZSBhZGRyZXNzZXMgdG8gYmUgYWxpZ25lZCBhdCA1MTItYnl0ZQorCSAqIGJvdW5kYXJpZXMuICBUaGlzIGlzIG9rYXkgc2luY2UgbW9zdCBibG9jayBJL08gaW52b2x2ZXMKKwkgKiBoYXJkd2FyZSBzZWN0b3JzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMgaW4gbGVuZ3RoLAorCSAqIGFuZCBzaW5jZSBob3N0IGNvbnRyb2xsZXJzIHVwIHRocm91Z2ggVVNCIDIuMCBoYXZlIG1heHBhY2tldAorCSAqIHZhbHVlcyBubyBsYXJnZXIgdGhhbiA1MTIuCisJICoKKwkgKiBCdXQgaXQgZG9lc24ndCBzdWZmaWNlIGZvciBXaXJlbGVzcyBVU0IsIHdoZXJlIEJ1bGsgbWF4cGFja2V0CisJICogdmFsdWVzIGNhbiBiZSBhcyBsYXJnZSBhcyAyMDQ4LiAgVG8gbWFrZSB0aGF0IHdvcmsgcHJvcGVybHkKKwkgKiB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgYmxvY2sgbGF5ZXIuCisJICovCisJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsICg1MTIgLSAxKSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIyLDcgKzk1MSw3IEBACiB7CiAJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IHNkZXYtPmhvc3RkYXRhOwogCXNjc2lfc2V0X3RhZ190eXBlKHNkZXYsIE1TR19PUkRFUkVEX1RBRyk7Ci0Jc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgZGV2aW5mby0+cWRlcHRoIC0gMyk7CisJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgZGV2aW5mby0+cWRlcHRoIC0gMik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0Myw3ICs5NzIsMTQgQEAKIAkub3JkZXJlZF90YWcgPSAxLAogfTsKIAorI2RlZmluZSBVTlVTVUFMX0RFVihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbiwgYmNkRGV2aWNlTWF4LCBcCisJCSAgICB2ZW5kb3JOYW1lLCBwcm9kdWN0TmFtZSwgdXNlUHJvdG9jb2wsIHVzZVRyYW5zcG9ydCwgXAorCQkgICAgaW5pdEZ1bmN0aW9uLCBmbGFncykgXAoreyBVU0JfREVWSUNFX1ZFUihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbiwgYmNkRGV2aWNlTWF4KSwgXAorCS5kcml2ZXJfaW5mbyA9IChmbGFncykgfQorCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdWFzX3VzYl9pZHNbXSA9IHsKKyMJaW5jbHVkZSAidW51c3VhbF91YXMuaCIKIAl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLCBVU0JfU0NfU0NTSSwgVVNCX1BSX0JVTEspIH0sCiAJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwgVVNCX1NDX1NDU0ksIFVTQl9QUl9VQVMpIH0sCiAJLyogMHhhYSBpcyBhIHByb3RvdHlwZSBkZXZpY2UgSSBoYXBwZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gKi8KQEAgLTg1MiwxMDUgKzk4OCw1NSBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1YXNfdXNiX2lkcyk7CiAKLXN0YXRpYyBpbnQgdWFzX2lzX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmKQotewotCXJldHVybiAoaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX01BU1NfU1RPUkFHRSAmJgotCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfU0NfU0NTSSAmJgotCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfUFJfVUFTKTsKLX0KLQotc3RhdGljIGludCB1YXNfaXNudF9zdXBwb3J0ZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCi17Ci0Jc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKLQotCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJUaGUgZHJpdmVyIGZvciB0aGUgVVNCIGNvbnRyb2xsZXIgJXMgZG9lcyBub3QgIgotCQkJInN1cHBvcnQgc2NhdHRlci1nYXRoZXIgd2hpY2ggaXNcbiIsCi0JCQloY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24pOwotCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJyZXF1aXJlZCBieSB0aGUgVUFTIGRyaXZlci4gUGxlYXNlIHRyeSBhbiIKLQkJCSJhbHRlcm5hdGl2ZSBVU0IgY29udHJvbGxlciBpZiB5b3Ugd2lzaCB0byB1c2UgVUFTLlxuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19CisjdW5kZWYgVU5VU1VBTF9ERVYKIAogc3RhdGljIGludCB1YXNfc3dpdGNoX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWludCBpOwotCWludCBzZ19zdXBwb3J0ZWQgPSB1ZGV2LT5idXMtPnNnX3RhYmxlc2l6ZSAhPSAwOworCWludCBhbHQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW50Zi0+bnVtX2FsdHNldHRpbmc7IGkrKykgewotCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSAmaW50Zi0+YWx0c2V0dGluZ1tpXTsKKwlhbHQgPSB1YXNfZmluZF91YXNfYWx0X3NldHRpbmcoaW50Zik7CisJaWYgKGFsdCA8IDApCisJCXJldHVybiBhbHQ7CiAKLQkJaWYgKHVhc19pc19pbnRlcmZhY2UoYWx0KSkgewotCQkJaWYgKCFzZ19zdXBwb3J0ZWQpCi0JCQkJcmV0dXJuIHVhc19pc250X3N1cHBvcnRlZCh1ZGV2KTsKLQkJCXJldHVybiB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LAotCQkJCQkJYWx0LT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkJCQlhbHQtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcpOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsCisJCQlpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgYWx0KTsKIH0KIAotc3RhdGljIHZvaWQgdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKK3N0YXRpYyBpbnQgdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwc1s0XSA9IHsgfTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGRldmluZm8tPmludGY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXZpbmZvLT51ZGV2OwotCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQ7Ci0JdW5zaWduZWQgaSwgbl9lbmRwb2ludHMgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOworCWludCByOwogCiAJZGV2aW5mby0+dWFzX3NlbnNlX29sZCA9IDA7CiAJZGV2aW5mby0+Y21uZCA9IE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbl9lbmRwb2ludHM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyICpleHRyYSA9IGVuZHBvaW50W2ldLmV4dHJhOwotCQlpbnQgbGVuID0gZW5kcG9pbnRbaV0uZXh0cmFsZW47Ci0JCXdoaWxlIChsZW4gPiAxKSB7Ci0JCQlpZiAoZXh0cmFbMV0gPT0gVVNCX0RUX1BJUEVfVVNBR0UpIHsKLQkJCQl1bnNpZ25lZCBwaXBlX2lkID0gZXh0cmFbMl07Ci0JCQkJaWYgKHBpcGVfaWQgPiAwICYmIHBpcGVfaWQgPCA1KQotCQkJCQllcHNbcGlwZV9pZCAtIDFdID0gJmVuZHBvaW50W2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbGVuIC09IGV4dHJhWzBdOwotCQkJZXh0cmEgKz0gZXh0cmFbMF07Ci0JCX0KLQl9CisJciA9IHVhc19maW5kX2VuZHBvaW50cyhkZXZpbmZvLT5pbnRmLT5jdXJfYWx0c2V0dGluZywgZXBzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKLQkvKgotCSAqIEFzc3VtZSB0aGF0IGlmIHdlIGRpZG4ndCBmaW5kIGEgY29udHJvbCBwaXBlIGRlc2NyaXB0b3IsIHdlJ3JlCi0JICogdXNpbmcgYSBkZXZpY2Ugd2l0aCBvbGQgZmlybXdhcmUgdGhhdCBoYXBwZW5zIHRvIGJlIHNldCB1cCBsaWtlCi0JICogdGhpcy4KLQkgKi8KLQlpZiAoIWVwc1swXSkgewotCQlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAxKTsKLQkJZGV2aW5mby0+c3RhdHVzX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwgMSk7Ci0JCWRldmluZm8tPmRhdGFfaW5fcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LCAyKTsKLQkJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAyKTsKKwlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzBdLT5kZXNjKSk7CisJZGV2aW5mby0+c3RhdHVzX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwKKwkJCQkJICAgIHVzYl9lbmRwb2ludF9udW0oJmVwc1sxXS0+ZGVzYykpOworCWRldmluZm8tPmRhdGFfaW5fcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzJdLT5kZXNjKSk7CisJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzNdLT5kZXNjKSk7CiAKLQkJZXBzWzFdID0gdXNiX3BpcGVfZW5kcG9pbnQodWRldiwgZGV2aW5mby0+c3RhdHVzX3BpcGUpOwotCQllcHNbMl0gPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBkZXZpbmZvLT5kYXRhX2luX3BpcGUpOwotCQllcHNbM10gPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBkZXZpbmZvLT5kYXRhX291dF9waXBlKTsKLQl9IGVsc2UgewotCQlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzBdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQlkZXZpbmZvLT5zdGF0dXNfcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzFdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQlkZXZpbmZvLT5kYXRhX2luX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwKLQkJCQkJCWVwc1syXS0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKLQkJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzNdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCX0KLQotCWRldmluZm8tPnFkZXB0aCA9IHVzYl9hbGxvY19zdHJlYW1zKGRldmluZm8tPmludGYsIGVwcyArIDEsIDMsIDI1NiwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldmluZm8tPnFkZXB0aCA8IDApIHsKKwlpZiAodWRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX1NVUEVSKSB7CiAJCWRldmluZm8tPnFkZXB0aCA9IDI1NjsKIAkJZGV2aW5mby0+dXNlX3N0cmVhbXMgPSAwOwogCX0gZWxzZSB7CisJCWRldmluZm8tPnFkZXB0aCA9IHVzYl9hbGxvY19zdHJlYW1zKGRldmluZm8tPmludGYsIGVwcyArIDEsCisJCQkJCQkgICAgMywgMjU2LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRldmluZm8tPnFkZXB0aCA8IDApCisJCQlyZXR1cm4gZGV2aW5mby0+cWRlcHRoOwogCQlkZXZpbmZvLT51c2Vfc3RyZWFtcyA9IDE7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHVhc19mcmVlX3N0cmVhbXMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKQEAgLTk2NCwzMCArMTA1MCwyMyBAQAogCXVzYl9mcmVlX3N0cmVhbXMoZGV2aW5mby0+aW50ZiwgZXBzLCAzLCBHRlBfS0VSTkVMKTsKIH0KIAotLyoKLSAqIFhYWDogV2hhdCBJJ2QgbGlrZSB0byBkbyBoZXJlIGlzIHJlZ2lzdGVyIGEgU0NTSSBob3N0IGZvciBlYWNoIFVTQiBob3N0IGluCi0gKiB0aGUgc3lzdGVtLiAgRm9sbG93IHVzYi1zdG9yYWdlJ3MgZGVzaWduIG9mIHJlZ2lzdGVyaW5nIGEgU0NTSSBob3N0IGZvcgotICogZWFjaCBVU0IgZGV2aWNlIGZvciB0aGUgbW9tZW50LiAgQ2FuIGltcGxlbWVudCB0aGlzIGJ5IHdhbGtpbmcgdXAgdGhlCi0gKiBVU0IgaGllcmFyY2h5IHVudGlsIHdlIGZpbmQgYSBVU0IgaG9zdC4KLSAqLwogc3RhdGljIGludCB1YXNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWludCByZXN1bHQgPSAtRU5PTUVNOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gTlVMTDsKIAlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAorCWlmICghdWFzX3VzZV91YXNfZHJpdmVyKGludGYsIGlkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAodWFzX3N3aXRjaF9pbnRlcmZhY2UodWRldiwgaW50ZikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGV2aW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1YXNfZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldmluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVzdWx0ID0gLUVOT01FTTsKLQlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdWFzX2hvc3RfdGVtcGxhdGUsIHNpemVvZih2b2lkICopKTsKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdWFzX2hvc3RfdGVtcGxhdGUsCisJCQkJc2l6ZW9mKHN0cnVjdCB1YXNfZGV2X2luZm8pKTsKIAlpZiAoIXNob3N0KQotCQlnb3RvIGZyZWU7CisJCWdvdG8gc2V0X2FsdDA7CiAKIAlzaG9zdC0+bWF4X2NtZF9sZW4gPSAxNiArIDI1MjsKIAlzaG9zdC0+bWF4X2lkID0gMTsKQEAgLTk5NSwzMyArMTA3NCw0MCBAQAogCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CiAJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IHVkZXYtPmJ1cy0+c2dfdGFibGVzaXplOwogCisJZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOwogCWRldmluZm8tPmludGYgPSBpbnRmOwogCWRldmluZm8tPnVkZXYgPSB1ZGV2OwogCWRldmluZm8tPnJlc2V0dGluZyA9IDA7CisJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKKwlkZXZpbmZvLT5zaHV0ZG93biA9IDA7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXZpbmZvLT5jbWRfdXJicyk7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXZpbmZvLT5zZW5zZV91cmJzKTsKIAlpbml0X3VzYl9hbmNob3IoJmRldmluZm8tPmRhdGFfdXJicyk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldmluZm8tPmxvY2spOwotCXVhc19jb25maWd1cmVfZW5kcG9pbnRzKGRldmluZm8pOworCUlOSVRfV09SSygmZGV2aW5mby0+d29yaywgdWFzX2RvX3dvcmspOworCUlOSVRfTElTVF9IRUFEKCZkZXZpbmZvLT5pbmZsaWdodF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aW5mby0+ZGVhZF9saXN0KTsKIAotCXJlc3VsdCA9IHNjc2lfaW5pdF9zaGFyZWRfdGFnX21hcChzaG9zdCwgZGV2aW5mby0+cWRlcHRoIC0gMyk7CisJcmVzdWx0ID0gdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoZGV2aW5mbyk7CiAJaWYgKHJlc3VsdCkKLQkJZ290byBmcmVlOworCQlnb3RvIHNldF9hbHQwOworCisJcmVzdWx0ID0gc2NzaV9pbml0X3NoYXJlZF90YWdfbWFwKHNob3N0LCBkZXZpbmZvLT5xZGVwdGggLSAyKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZyZWVfc3RyZWFtczsKIAogCXJlc3VsdCA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZpbnRmLT5kZXYpOwogCWlmIChyZXN1bHQpCi0JCWdvdG8gZGVjb25maWdfZXBzOwotCi0Jc2hvc3QtPmhvc3RkYXRhWzBdID0gKHVuc2lnbmVkIGxvbmcpZGV2aW5mbzsKKwkJZ290byBmcmVlX3N0cmVhbXM7CiAKIAlzY3NpX3NjYW5faG9zdChzaG9zdCk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBzaG9zdCk7CiAJcmV0dXJuIHJlc3VsdDsKIAotZGVjb25maWdfZXBzOgorZnJlZV9zdHJlYW1zOgogCXVhc19mcmVlX3N0cmVhbXMoZGV2aW5mbyk7Ci0gZnJlZToKLQlrZnJlZShkZXZpbmZvKTsKK3NldF9hbHQwOgorCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAlpZiAoc2hvc3QpCiAJCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwogCXJldHVybiByZXN1bHQ7CkBAIC0xMDI5LDQ1ICsxMTE1LDE0NiBAQAogCiBzdGF0aWMgaW50IHVhc19wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0vKiBYWFg6IE5lZWQgdG8gcmV0dXJuIDEgaWYgaXQncyBub3Qgb3VyIGRldmljZSBpbiBlcnJvciBoYW5kbGluZyAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZpbmZvLT5zaHV0ZG93bikKKwkJcmV0dXJuIDA7CisKKwkvKiBCbG9jayBuZXcgcmVxdWVzdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9ibG9ja19yZXF1ZXN0cyhzaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciBhbnkgcGVuZGluZyByZXF1ZXN0cyB0byBjb21wbGV0ZSAqLworCWZsdXNoX3dvcmsoJmRldmluZm8tPndvcmspOworCWlmICh1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dCgmZGV2aW5mby0+c2Vuc2VfdXJicywgNTAwMCkgPT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LCAiJXM6IHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisKKwl1YXNfZnJlZV9zdHJlYW1zKGRldmluZm8pOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdWFzX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0vKiBYWFg6IE5lZWQgdG8gcmV0dXJuIDEgaWYgaXQncyBub3Qgb3VyIGRldmljZSBpbiBlcnJvciBoYW5kbGluZyAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZpbmZvLT5zaHV0ZG93bikKKwkJcmV0dXJuIDA7CisKKwlpZiAodWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoZGV2aW5mbykgIT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LAorCQkJICAgICAiJXM6IGFsbG9jIHN0cmVhbXMgZXJyb3IgYWZ0ZXIgcmVzZXQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzY3NpX3JlcG9ydF9idXNfcmVzZXQoc2hvc3QsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHNob3N0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVhc19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOworCisJLyogV2FpdCBmb3IgYW55IHBlbmRpbmcgcmVxdWVzdHMgdG8gY29tcGxldGUgKi8KKwlmbHVzaF93b3JrKCZkZXZpbmZvLT53b3JrKTsKKwlpZiAodXNiX3dhaXRfYW5jaG9yX2VtcHR5X3RpbWVvdXQoJmRldmluZm8tPnNlbnNlX3VyYnMsIDUwMDApID09IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwgIiVzOiB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1YXNfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVhc19yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAoc3RydWN0IHVhc19kZXZfaW5mbyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVhc19jb25maWd1cmVfZW5kcG9pbnRzKGRldmluZm8pICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwKKwkJCSAgICAgIiVzOiBhbGxvYyBzdHJlYW1zIGVycm9yIGFmdGVyIHJlc2V0IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHNob3N0LCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB1YXNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0Jc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9ICh2b2lkICopc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAoc3RydWN0IHVhc19kZXZfaW5mbyAqKXNob3N0LT5ob3N0ZGF0YTsKIAogCWRldmluZm8tPnJlc2V0dGluZyA9IDE7Ci0JdWFzX2Fib3J0X3dvcmsoZGV2aW5mbyk7CisJY2FuY2VsX3dvcmtfc3luYygmZGV2aW5mby0+d29yayk7CisJdWFzX2Fib3J0X2luZmxpZ2h0KGRldmluZm8sIERJRF9OT19DT05ORUNULCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+Y21kX3VyYnMpOwogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldmluZm8tPnNlbnNlX3VyYnMpOwogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldmluZm8tPmRhdGFfdXJicyk7CisJdWFzX3phcF9kZWFkKGRldmluZm8pOwogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCXVhc19mcmVlX3N0cmVhbXMoZGV2aW5mbyk7Ci0Ja2ZyZWUoZGV2aW5mbyk7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiB9CiAKIC8qCi0gKiBYWFg6IFNob3VsZCB0aGlzIHBsdWcgaW50byBsaWJ1c3VhbCBzbyB3ZSBjYW4gYXV0by11cGdyYWRlIGRldmljZXMgZnJvbQotICogQnVsay1Pbmx5IHRvIFVBUz8KKyAqIFB1dCB0aGUgZGV2aWNlIGJhY2sgaW4gdXNiLXN0b3JhZ2UgbW9kZSBvbiBzaHV0ZG93biwgYXMgc29tZSBCSU9TLWVzCisgKiBoYW5nIG9uIHJlYm9vdCB3aGVuIHRoZSBkZXZpY2UgaXMgc3RpbGwgaW4gdWFzIG1vZGUuIE5vdGUgdGhlIHJlc2V0IGlzCisgKiBuZWNlc3NhcnkgYXMgc29tZSBkZXZpY2VzIHdvbid0IHJldmVydCB0byB1c2Itc3RvcmFnZSBtb2RlIHdpdGhvdXQgaXQuCiAgKi8KK3N0YXRpYyB2b2lkIHVhc19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SRVNUQVJUKQorCQlyZXR1cm47CisKKwlkZXZpbmZvLT5zaHV0ZG93biA9IDE7CisJdWFzX2ZyZWVfc3RyZWFtcyhkZXZpbmZvKTsKKwl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CisJdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKK30KKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVhc19kcml2ZXIgPSB7CiAJLm5hbWUgPSAidWFzIiwKIAkucHJvYmUgPSB1YXNfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSB1YXNfZGlzY29ubmVjdCwKIAkucHJlX3Jlc2V0ID0gdWFzX3ByZV9yZXNldCwKIAkucG9zdF9yZXNldCA9IHVhc19wb3N0X3Jlc2V0LAorCS5zdXNwZW5kID0gdWFzX3N1c3BlbmQsCisJLnJlc3VtZSA9IHVhc19yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9IHVhc19yZXNldF9yZXN1bWUsCisJLmRydndyYXAuZHJpdmVyLnNodXRkb3duID0gdWFzX3NodXRkb3duLAogCS5pZF90YWJsZSA9IHVhc191c2JfaWRzLAogfTsKIAogbW9kdWxlX3VzYl9kcml2ZXIodWFzX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgV2lsY294IGFuZCBTYXJhaCBTaGFycCIpOworTU9EVUxFX0FVVEhPUigKKwkiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4sIE1hdHRoZXcgV2lsY294IGFuZCBTYXJhaCBTaGFycCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYWRiZWIyNS4uZjRhODIyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMjA4Niw2ICsyMDg2LDExIEBACiAJCSJEaWdpdGFsIE1QMyBBdWRpbyBQbGF5ZXIiLAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLCBVU19GTF9OT1RfTE9DS0FCTEUgKSwKIAorLyogVW51c3VhbCB1YXMgZGV2aWNlcyAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9VQVMpCisjaW5jbHVkZSAidW51c3VhbF91YXMuaCIKKyNlbmRpZgorCiAvKiBDb250cm9sL0J1bGsgdHJhbnNwb3J0IGZvciBhbGwgU3ViQ2xhc3MgdmFsdWVzICovCiBVU1VBTF9ERVYoVVNCX1NDX1JCQywgVVNCX1BSX0NCKSwKIFVTVUFMX0RFVihVU0JfU0NfODAyMCwgVVNCX1BSX0NCKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ0NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX3Vhcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIERyaXZlciBmb3IgVVNCIEF0dGFjaGVkIFNDU0kgZGV2aWNlcyAtIFVudXN1YWwgRGV2aWNlcyBGaWxlCisgKgorICogICAoYykgMjAxMyBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSBzYW1lIGZpbGUgZm9yIHRoZSB1c2Itc3RvcmFnZSBkcml2ZXIsIHdoaWNoIGlzOgorICogICAoYykgMjAwMC0yMDAyIE1hdHRoZXcgRGhhcm0gKG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0KQorICogICAoYykgMjAwMCBBZGFtIEouIFJpY2h0ZXIgKGFkYW1AeWdnZHJhc2lsLmNvbSksIFlnZ2RyYXNpbCBDb21wdXRpbmcsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogSU1QT1JUQU5UIE5PVEU6IFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmlsZSB3aGljaCBkZWZpbmVzCisgKiBhIFVOVVNVQUxfREVWIG1hY3JvIGJlZm9yZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuCisgKi8KKworLyoKKyAqIElmIHlvdSBlZGl0IHRoaXMgZmlsZSwgcGxlYXNlIHRyeSB0byBrZWVwIGl0IHNvcnRlZCBmaXJzdCBieSBWZW5kb3JJRCwKKyAqIHRoZW4gYnkgUHJvZHVjdElELgorICoKKyAqIElmIHlvdSB3YW50IHRvIGFkZCBhbiBlbnRyeSBmb3IgdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGluY2x1ZGUgdGhlCisgKiBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgKgktIGEgcGF0Y2ggdGhhdCBhZGRzIHRoZSBlbnRyeSBmb3IgeW91ciBkZXZpY2UsIGluY2x1ZGluZyB5b3VyCisgKgkgIGVtYWlsIGFkZHJlc3MgcmlnaHQgYWJvdmUgdGhlIGVudHJ5IChwbHVzIG1heWJlIGEgYnJpZWYKKyAqCSAgZXhwbGFuYXRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGVudHJ5KSwKKyAqCS0gbHN1c2IgLXYgb3V0cHV0IGZvciB0aGUgZGV2aWNlCisgKiBTZW5kIHlvdXIgc3VibWlzc2lvbiB0byBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICogYW5kIGRvbid0IGZvcmdldCB0byBDQzogdGhlIFVTQiBkZXZlbG9wbWVudCBsaXN0IDxsaW51eC11c2JAdmdlci5rZXJuZWwub3JnPgorICovCisKKy8qCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgZW50cnkgZm9yIHRoZSBVU19GTF9JR05PUkVfVUFTIGZsYWcuIE9uY2Ugd2UgaGF2ZSBhbgorICogYWN0dWFsIGVudHJ5IHVzaW5nIFVTX0ZMX0lHTk9SRV9VQVMgdGhpcyBlbnRyeSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqCisgKiBVTlVTVUFMX0RFViggIDB4YWJjZCwgMHgxMjM0LCAweDAxMDAsIDB4MDEwMCwKKyAqCQkiRXhhbXBsZSIsCisgKgkJIlN0b3JhZ2Ugd2l0aCBicm9rZW4gVUFTIiwKKyAqCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAorICoJCVVTX0ZMX0lHTk9SRV9VQVMpLAorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCAxYzBiODlmMi4uZjFjOTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC03Miw2ICs3MiwxMCBAQAogI2luY2x1ZGUgInNpZXJyYV9tcy5oIgogI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1VBUykKKyNpbmNsdWRlICJ1YXMtZGV0ZWN0LmgiCisjZW5kaWYKKwogLyogU29tZSBpbmZvcm1hdGlvbmFsIGRhdGEgKi8KIE1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgTWFzcyBTdG9yYWdlIGRyaXZlciBmb3IgTGludXgiKTsKQEAgLTQ1OSwxNCArNDYzLDE0IEBACiAjZGVmaW5lIFRPTE9XRVIoeCkgKCh4KSB8IDB4MjApCiAKIC8qIEFkanVzdCBkZXZpY2UgZmxhZ3MgYmFzZWQgb24gdGhlICJxdWlya3M9IiBtb2R1bGUgcGFyYW1ldGVyICovCi1zdGF0aWMgdm9pZCBhZGp1c3RfcXVpcmtzKHN0cnVjdCB1c19kYXRhICp1cykKK3ZvaWQgdXNiX3N0b3JfYWRqdXN0X3F1aXJrcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdW5zaWduZWQgbG9uZyAqZmZsYWdzKQogewogCWNoYXIgKnA7Ci0JdTE2IHZpZCA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JdTE2IHBpZCA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCXUxNiB2aWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl1MTYgcGlkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCXVuc2lnbmVkIGYgPSAwOwogCXVuc2lnbmVkIGludCBtYXNrID0gKFVTX0ZMX1NBTkVfU0VOU0UgfCBVU19GTF9CQURfU0VOU0UgfAotCQkJVVNfRkxfRklYX0NBUEFDSVRZIHwKKwkJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0lHTk9SRV9VQVMgfAogCQkJVVNfRkxfQ0FQQUNJVFlfSEVVUklTVElDUyB8IFVTX0ZMX0lHTk9SRV9ERVZJQ0UgfAogCQkJVVNfRkxfTk9UX0xPQ0tBQkxFIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgfAogCQkJVVNfRkxfQ0FQQUNJVFlfT0sgfCBVU19GTF9JR05PUkVfUkVTSURVRSB8CkBAIC01MzcsMTQgKzU0MSwxOCBAQAogCQljYXNlICdzJzoKIAkJCWYgfD0gVVNfRkxfU0lOR0xFX0xVTjsKIAkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWYgfD0gVVNfRkxfSUdOT1JFX1VBUzsKKwkJCWJyZWFrOwogCQljYXNlICd3JzoKIAkJCWYgfD0gVVNfRkxfTk9fV1BfREVURUNUOwogCQkJYnJlYWs7CiAJCS8qIElnbm9yZSB1bnJlY29nbml6ZWQgZmxhZyBjaGFyYWN0ZXJzICovCiAJCX0KIAl9Ci0JdXMtPmZmbGFncyA9ICh1cy0+ZmZsYWdzICYgfm1hc2spIHwgZjsKKwkqZmZsYWdzID0gKCpmZmxhZ3MgJiB+bWFzaykgfCBmOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX3N0b3JfYWRqdXN0X3F1aXJrcyk7CiAKIC8qIEdldCB0aGUgdW51c3VhbF9kZXZzIGVudHJpZXMgYW5kIHRoZSBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KIHN0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmZvKHN0cnVjdCB1c19kYXRhICp1cywgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLApAQCAtNTY0LDcgKzU3Miw3IEBACiAJCQlpZGVzYy0+YkludGVyZmFjZVByb3RvY29sIDoKIAkJCXVudXN1YWxfZGV2LT51c2VUcmFuc3BvcnQ7CiAJdXMtPmZmbGFncyA9IGlkLT5kcml2ZXJfaW5mbzsKLQlhZGp1c3RfcXVpcmtzKHVzKTsKKwl1c2Jfc3Rvcl9hZGp1c3RfcXVpcmtzKHVzLT5wdXNiX2RldiwgJnVzLT5mZmxhZ3MpOwogCiAJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9JR05PUkVfREVWSUNFKSB7CiAJCWRldl9pbmZvKHBkZXYsICJkZXZpY2UgaWdub3JlZFxuIik7CkBAIC0xMDM1LDYgKzEwNDMsMTIgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzaXplOwogCisJLyogSWYgdWFzIGlzIGVuYWJsZWQgYW5kIHRoaXMgZGV2aWNlIGNhbiBkbyB1YXMgdGhlbiBpZ25vcmUgaXQuICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1VBUykKKwlpZiAodWFzX3VzZV91YXNfZHJpdmVyKGludGYsIGlkKSkKKwkJcmV0dXJuIC1FTlhJTzsKKyNlbmRpZgorCiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIGlzbid0IHN0YW5kYXJkIChpcyBoYW5kbGVkIGJ5IGEgc3ViZHJpdmVyCiAJICogbW9kdWxlKSB0aGVuIGRvbid0IGFjY2VwdCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDc1ZjcwZjAuLjMwN2UzMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMjAxLDQgKzIwMSw3IEBACiBleHRlcm4gaW50IHVzYl9zdG9yX3Byb2JlMihzdHJ1Y3QgdXNfZGF0YSAqdXMpOwogZXh0ZXJuIHZvaWQgdXNiX3N0b3JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKK2V4dGVybiB2b2lkIHVzYl9zdG9yX2FkanVzdF9xdWlya3Moc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgbG9uZyAqZmZsYWdzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKaW5kZXggM2I5NTllOC4uMDY3NzEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gd3VzYmhjLT5kZXY7CiAJc3RydWN0IHd1c2JfZGV2ICp3dXNiX2RldjsKIAlzdHJ1Y3Qgd3VzYl9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGlkeCwgZGV2bnVtOworCXVuc2lnbmVkIGlkeDsKIAogCW11dGV4X2xvY2soJnd1c2JoYy0+bXV0ZXgpOwogCkBAIC0zMTIsOCArMzEyLDYgQEAKIAkJZ290byBlcnJvcl91bmxvY2s7CiAJfQogCi0JZGV2bnVtID0gaWR4ICsgMjsKLQogCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgbm8gY3J5cHRvIG9uIHRoYXQgInZpcnR1YWwgcG9ydCIgKi8KIAl3dXNiaGMtPnNldF9wdGsod3VzYmhjLCBpZHgsIDAsIE5VTEwsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuYwppbmRleCAzNjgzNjBmLi4yNTJjN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmMKQEAgLTc1LDggKzc1LDYgQEAKIAlpZiAod2EtPmR0aV91cmIpIHsKIAkJdXNiX2tpbGxfdXJiKHdhLT5kdGlfdXJiKTsKIAkJdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOwotCQl1c2Jfa2lsbF91cmIod2EtPmJ1Zl9pbl91cmIpOwotCQl1c2JfcHV0X3VyYih3YS0+YnVmX2luX3VyYik7CiAJfQogCWtmcmVlKHdhLT5kdGlfYnVmKTsKIAl3YV9uZXBfZGVzdHJveSh3YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5oIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuaAppbmRleCBhMmVmODRiLi5mMmE4ZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5oCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmgKQEAgLTEyNSw3ICsxMjUsOCBAQAogCiBlbnVtIHdhX2R0aV9zdGF0ZSB7CiAJV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HLAotCVdBX0RUSV9JU09DX1BBQ0tFVF9TVEFUVVNfUEVORElORworCVdBX0RUSV9JU09DX1BBQ0tFVF9TVEFUVVNfUEVORElORywKKwlXQV9EVElfQlVGX0lOX0RBVEFfUEVORElORwogfTsKIAogZW51bSB3YV9xdWlya3MgewpAQCAtMTM0LDggKzEzNSwyMCBAQAogCSAqIHJlcXVlc3RzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgbm90IHNlbnQgYXMgc2VwYXJhdGUgcGFja2V0cy4KIAkgKi8KIAlXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DCT0gMHgwMSwKKwkvKgorCSAqIFRoZSBBbGVyZW9uIEhXQSBjYW4gYmUgaW5zdHJ1Y3RlZCB0byBub3Qgc2VuZCB0cmFuc2ZlciBub3RpZmljYXRpb25zCisJICogYXMgYW4gb3B0aW1pemF0aW9uLgorCSAqLworCVdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMJPSAweDAyLAogfTsKIAorZW51bSB3YV92ZW5kb3Jfc3BlY2lmaWNfcmVxdWVzdHMgeworCVdBX1JFUV9BTEVSRU9OX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TID0gMHg0QywKKwlXQV9SRVFfQUxFUkVPTl9GRUFUVVJFX1NFVCA9IDB4MDEsCisJV0FfUkVRX0FMRVJFT05fRkVBVFVSRV9DTEVBUiA9IDB4MDAsCit9OworCisjZGVmaW5lIFdBX01BWF9CVUZfSU5fVVJCUwk0CiAvKioKICAqIEluc3RhbmNlIG9mIGEgSFdBIEhvc3QgQ29udHJvbGxlcgogICoKQEAgLTIwNiw3ICsyMTksOSBAQAogCXUzMiBkdGlfaXNvY194ZmVyX2luX3Byb2dyZXNzOwogCXU4ICBkdGlfaXNvY194ZmVyX3NlZzsKIAlzdHJ1Y3QgdXJiICpkdGlfdXJiOwkJLyogVVJCIGZvciByZWFkaW5nIHhmZXIgcmVzdWx0cyAqLwotCXN0cnVjdCB1cmIgKmJ1Zl9pbl91cmI7CQkvKiBVUkIgZm9yIHJlYWRpbmcgZGF0YSBpbiAqLworCQkJCQkvKiBVUkJzIGZvciByZWFkaW5nIGRhdGEgaW4gKi8KKwlzdHJ1Y3QgdXJiIGJ1Zl9pbl91cmJzW1dBX01BWF9CVUZfSU5fVVJCU107CisJaW50IGFjdGl2ZV9idWZfaW5fdXJiczsJCS8qIG51bWJlciBvZiBidWZfaW5fdXJicyBhY3RpdmUuICovCiAJc3RydWN0IGVkYyBkdGlfZWRjOwkJLyogRFRJIGVycm9yIGRlbnNpdHkgY291bnRlciAqLwogCXZvaWQgKmR0aV9idWY7CiAJc2l6ZV90IGR0aV9idWZfc2l6ZTsKQEAgLTIzNCw2ICsyNDksNyBAQAogZXh0ZXJuIGludCB3YV9jcmVhdGUoc3RydWN0IHdhaGMgKndhLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCiAJa2VybmVsX3Vsb25nX3QpOwogZXh0ZXJuIHZvaWQgX193YV9kZXN0cm95KHN0cnVjdCB3YWhjICp3YSk7CitleHRlcm4gaW50IHdhX2R0aV9zdGFydChzdHJ1Y3Qgd2FoYyAqd2EpOwogdm9pZCB3YV9yZXNldF9hbGwoc3RydWN0IHdhaGMgKndhKTsKIAogCkBAIC0yNzUsNiArMjkxLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdhX2luaXQoc3RydWN0IHdhaGMgKndhKQogeworCWludCBpbmRleDsKKwogCWVkY19pbml0KCZ3YS0+bmVwX2VkYyk7CiAJYXRvbWljX3NldCgmd2EtPm5vdGlmc19xdWV1ZWQsIDApOwogCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfVFJBTlNGRVJfUkVTVUxUX1BFTkRJTkc7CkBAIC0yODgsNiArMzA2LDEwIEBACiAJSU5JVF9XT1JLKCZ3YS0+eGZlcl9lcnJvcl93b3JrLCB3YV9wcm9jZXNzX2Vycm9yZWRfdHJhbnNmZXJzX3J1bik7CiAJd2EtPmR0b19pbl91c2UgPSAwOwogCWF0b21pY19zZXQoJndhLT54ZmVyX2lkX2NvdW50LCAxKTsKKwkvKiBpbml0IHRoZSBidWYgaW4gVVJCcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFdBX01BWF9CVUZfSU5fVVJCUzsgKytpbmRleCkKKwkJdXNiX2luaXRfdXJiKCYod2EtPmJ1Zl9pbl91cmJzW2luZGV4XSkpOworCXdhLT5hY3RpdmVfYnVmX2luX3VyYnMgPSAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jCmluZGV4IDZjYTgwYTQuLjZkNmRhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCQlicmVhazsKIAkJfQogCQlpdHIgKz0gaGRyLT5iTGVuZ3RoOwotCQlpdHJfc2l6ZSAtPSBoZHItPmJEZXNjcmlwdG9yVHlwZTsKKwkJaXRyX3NpemUgLT0gaGRyLT5iTGVuZ3RoOwogCX0KIG91dDoKIAlyZXR1cm4gZXBjZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCAzY2Q5NmU5Li5jOGUyYTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC0xNjcsNiArMTY3LDggQEAKIAogc3RhdGljIHZvaWQgX193YV9wb3B1bGF0ZV9kdG9fdXJiX2lzb2Moc3RydWN0IHdhX3hmZXIgKnhmZXIsCiAJc3RydWN0IHdhX3NlZyAqc2VnLCBpbnQgY3Vycl9pc29fZnJhbWUpOworc3RhdGljIHZvaWQgd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2VncyhzdHJ1Y3Qgd2FfeGZlciAqeGZlciwKKwkJaW50IHN0YXJ0aW5nX2luZGV4LCBlbnVtIHdhX3NlZ19zdGF0dXMgc3RhdHVzKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHdhX3hmZXJfaW5pdChzdHJ1Y3Qgd2FfeGZlciAqeGZlcikKIHsKQEAgLTM2NywxMyArMzY5LDEzIEBACiAJCQlicmVhazsKIAkJY2FzZSBXQV9TRUdfRVJST1I6CiAJCQl4ZmVyLT5yZXN1bHQgPSBzZWctPnJlc3VsdDsKLQkJCWRldl9kYmcoZGV2LCAieGZlciAlcCBJRCAlMDhYIyV1OiBFUlJPUiByZXN1bHQgJXp1KDB4JTA4elgpXG4iLAorCQkJZGV2X2RiZyhkZXYsICJ4ZmVyICVwIElEICUwOFgjJXU6IEVSUk9SIHJlc3VsdCAlemkoMHglMDh6WClcbiIsCiAJCQkJeGZlciwgd2FfeGZlcl9pZCh4ZmVyKSwgc2VnLT5pbmRleCwgc2VnLT5yZXN1bHQsCiAJCQkJc2VnLT5yZXN1bHQpOwogCQkJZ290byBvdXQ7CiAJCWNhc2UgV0FfU0VHX0FCT1JURUQ6CiAJCQl4ZmVyLT5yZXN1bHQgPSBzZWctPnJlc3VsdDsKLQkJCWRldl9kYmcoZGV2LCAieGZlciAlcCBJRCAlMDhYIyV1OiBBQk9SVEVEIHJlc3VsdCAlenUoMHglMDh6WClcbiIsCisJCQlkZXZfZGJnKGRldiwgInhmZXIgJXAgSUQgJTA4WCMldTogQUJPUlRFRCByZXN1bHQgJXppKDB4JTA4elgpXG4iLAogCQkJCXhmZXIsIHdhX3hmZXJfaWQoeGZlciksIHNlZy0+aW5kZXgsIHNlZy0+cmVzdWx0LAogCQkJCXNlZy0+cmVzdWx0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzkwLDYgKzM5MiwyNCBAQAogfQogCiAvKgorICogTWFyayB0aGUgZ2l2ZW4gc2VnbWVudCBhcyBkb25lLiAgUmV0dXJuIHRydWUgaWYgdGhpcyBjb21wbGV0ZXMgdGhlIHhmZXIuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3Igc2VncyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYW4gUlBJUEUuCisgKiBEZWxheWVkIHNlZ3MgYXJlIG5vdCBtYXJrZWQgYXMgc3VibWl0dGVkIHNvIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgbWFya2VkCisgKiBhcyBkb25lIHdoZW4gY2xlYW5pbmcgdXAuCisgKgorICogeGZlci0+bG9jayBoYXMgdG8gYmUgbG9ja2VkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZShzdHJ1Y3Qgd2FfeGZlciAqeGZlciwKKwlzdHJ1Y3Qgd2Ffc2VnICpzZWcsIGVudW0gd2Ffc2VnX3N0YXR1cyBzdGF0dXMpCit7CisJc2VnLT5zdGF0dXMgPSBzdGF0dXM7CisJeGZlci0+c2Vnc19kb25lKys7CisKKwkvKiBjaGVjayBmb3IgZG9uZS4gKi8KKwlyZXR1cm4gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7Cit9CisKKy8qCiAgKiBTZWFyY2ggZm9yIGEgdHJhbnNmZXIgbGlzdCBJRCBvbiB0aGUgSENEJ3MgVVJCIGxpc3QKICAqCiAgKiBGb3IgMzIgYml0IGFyY2hpdGVjdHVyZXMsIHdlIHVzZSB0aGUgcG9pbnRlciBpdHNlbGY7IGZvciA2NCBiaXRzLCBhCkBAIC00MTYsMTIgKzQzNiw1MSBAQAogCiBzdHJ1Y3Qgd2FfeGZlcl9hYm9ydF9idWZmZXIgewogCXN0cnVjdCB1cmIgdXJiOworCXN0cnVjdCB3YWhjICp3YTsKIAlzdHJ1Y3Qgd2FfeGZlcl9hYm9ydCBjbWQ7CiB9OwogCiBzdGF0aWMgdm9pZCBfX3dhX3hmZXJfYWJvcnRfY2Ioc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB3YV94ZmVyX2Fib3J0X2J1ZmZlciAqYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2FoYyAqd2EgPSBiLT53YTsKKworCS8qCisJICogSWYgdGhlIGFib3J0IHJlcXVlc3QgVVJCIGZhaWxlZCwgdGhlbiB0aGUgSFdBIGRpZCBub3QgZ2V0IHRoZSBhYm9ydAorCSAqIGNvbW1hbmQuICBGb3JjaWJseSBjbGVhbiB1cCB0aGUgeGZlciB3aXRob3V0IHdhaXRpbmcgZm9yIGEgVHJhbnNmZXIKKwkgKiBSZXN1bHQgZnJvbSB0aGUgSFdBLgorCSAqLworCWlmICh1cmItPnN0YXR1cyA8IDApIHsKKwkJc3RydWN0IHdhX3hmZXIgKnhmZXI7CisJCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ3YS0+dXNiX2lmYWNlLT5kZXY7CisKKwkJeGZlciA9IHdhX3hmZXJfZ2V0X2J5X2lkKHdhLCBsZTMyX3RvX2NwdShiLT5jbWQuZHdUcmFuc2ZlcklEKSk7CisJCWRldl9lcnIoZGV2LCAiJXM6IFRyYW5zZmVyIEFib3J0IHJlcXVlc3QgZmFpbGVkLiByZXN1bHQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJaWYgKHhmZXIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlpbnQgZG9uZTsKKwkJCXN0cnVjdCB3YV9ycGlwZSAqcnBpcGUgPSB4ZmVyLT5lcC0+aGNwcml2OworCisJCQlkZXZfZXJyKGRldiwgIiVzOiBjbGVhbmluZyB1cCB4ZmVyICVwIElEIDB4JTA4WC5cbiIsCisJCQkJX19mdW5jX18sIHhmZXIsIHdhX3hmZXJfaWQoeGZlcikpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKKwkJCS8qIG1hcmsgYWxsIHNlZ3MgYXMgYWJvcnRlZC4gKi8KKwkJCXdhX2NvbXBsZXRlX3JlbWFpbmluZ194ZmVyX3NlZ3MoeGZlciwgMCwKKwkJCQlXQV9TRUdfQUJPUlRFRCk7CisJCQlkb25lID0gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZG9uZSkKKwkJCQl3YV94ZmVyX2NvbXBsZXRpb24oeGZlcik7CisJCQl3YV94ZmVyX2RlbGF5ZWRfcnVuKHJwaXBlKTsKKwkJCXdhX3hmZXJfcHV0KHhmZXIpOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICIlczogeGZlciBJRCAweCUwOFggYWxyZWFkeSBnb25lLlxuIiwKKwkJCQkgX19mdW5jX18sIGxlMzJfdG9fY3B1KGItPmNtZC5kd1RyYW5zZmVySUQpKTsKKwkJfQorCX0KKworCXdhX3B1dCh3YSk7CS8qIHRha2VuIGluIF9fd2FfeGZlcl9hYm9ydCAqLwogCXVzYl9wdXRfdXJiKCZiLT51cmIpOwogfQogCkBAIC00NDksNiArNTA4LDcgQEAKIAliLT5jbWQuYlJlcXVlc3RUeXBlID0gV0FfWEZFUl9BQk9SVDsKIAliLT5jbWQud1JQaXBlID0gcnBpcGUtPmRlc2NyLndSUGlwZUluZGV4OwogCWItPmNtZC5kd1RyYW5zZmVySUQgPSB3YV94ZmVyX2lkX2xlMzIoeGZlcik7CisJYi0+d2EgPSB3YV9nZXQoeGZlci0+d2EpOwogCiAJdXNiX2luaXRfdXJiKCZiLT51cmIpOwogCXVzYl9maWxsX2J1bGtfdXJiKCZiLT51cmIsIHhmZXItPndhLT51c2JfZGV2LApAQCAtNDYyLDYgKzUyMiw3IEBACiAKIAogZXJyb3Jfc3VibWl0OgorCXdhX3B1dCh4ZmVyLT53YSk7CiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJZGV2X2VycihkZXYsICJ4ZmVyICVwOiBDYW4ndCBzdWJtaXQgYWJvcnQgcmVxdWVzdDogJWRcbiIsCiAJCQl4ZmVyLCByZXN1bHQpOwpAQCAtNzMzLDYgKzc5NCw4IEBACiAJCQkJc2VnLT5pc29jX2ZyYW1lX29mZnNldCArIHNlZy0+aXNvY19mcmFtZV9pbmRleCk7CiAKIAkJCS8qIHJlc3VibWl0IHRoZSBVUkIgd2l0aCB0aGUgbmV4dCBpc29jIGZyYW1lLiAqLworCQkJLyogdGFrZSBhIHJlZiBvbiByZXN1Ym1pdC4gKi8KKwkJCXdhX3hmZXJfZ2V0KHhmZXIpOwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoc2VnLT5kdG9fdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQkJZGV2X2VycihkZXYsICJ4ZmVyIDB4JTA4WCMldTogRFRPIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLApAQCAtNzYwLDkgKzgyMywxMyBAQAogCQlnb3RvIGVycm9yX2RlZmF1bHQ7CiAJfQogCisJLyogdGFrZW4gd2hlbiB0aGlzIFVSQiB3YXMgc3VibWl0dGVkLiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybjsKIAogZXJyb3JfZHRvX3N1Ym1pdDoKKwkvKiB0YWtlbiBvbiByZXN1Ym1pdCBhdHRlbXB0LiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogZXJyb3JfZGVmYXVsdDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCXJwaXBlID0geGZlci0+ZXAtPmhjcHJpdjsKQEAgLTc3MiwxMiArODM5LDEwIEBACiAJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJfQogCWlmIChzZWctPnN0YXR1cyAhPSBXQV9TRUdfRVJST1IpIHsKLQkJc2VnLT5zdGF0dXMgPSBXQV9TRUdfRVJST1I7CiAJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlfX3dhX3hmZXJfYWJvcnQoeGZlcik7CiAJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJZG9uZSA9IF9fd2FfeGZlcl9pc19kb25lKHhmZXIpOworCQlkb25lID0gX193YV94ZmVyX21hcmtfc2VnX2FzX2RvbmUoeGZlciwgc2VnLCBXQV9TRUdfRVJST1IpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGhvbGRpbmdfZHRvKSB7CkBAIC03ODgsNyArODUzLDggQEAKIAkJd2FfeGZlcl9jb21wbGV0aW9uKHhmZXIpOwogCWlmIChycGlwZV9yZWFkeSkKIAkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7Ci0KKwkvKiB0YWtlbiB3aGVuIHRoaXMgVVJCIHdhcyBzdWJtaXR0ZWQuICovCisJd2FfeGZlcl9wdXQoeGZlcik7CiB9CiAKIC8qCkBAIC04NDIsMTIgKzkwOCwxMSBAQAogCQl9CiAJCWlmIChzZWctPnN0YXR1cyAhPSBXQV9TRUdfRVJST1IpIHsKIAkJCXVzYl91bmxpbmtfdXJiKHNlZy0+ZHRvX3VyYik7Ci0JCQlzZWctPnN0YXR1cyA9IFdBX1NFR19FUlJPUjsKIAkJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCQl4ZmVyLT5zZWdzX2RvbmUrKzsKIAkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKIAkJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJCWRvbmUgPSBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZSh4ZmVyLCBzZWcsCisJCQkJCVdBX1NFR19FUlJPUik7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKQEAgLTg1NSw2ICs5MjAsOCBAQAogCQlpZiAocnBpcGVfcmVhZHkpCiAJCQl3YV94ZmVyX2RlbGF5ZWRfcnVuKHJwaXBlKTsKIAl9CisJLyogdGFrZW4gd2hlbiB0aGlzIFVSQiB3YXMgc3VibWl0dGVkLiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogfQogCiAvKgpAQCAtOTE5LDE4ICs5ODYsMTggQEAKIAkJfQogCQl1c2JfdW5saW5rX3VyYihzZWctPmlzb2NfcGFja19kZXNjX3VyYik7CiAJCXVzYl91bmxpbmtfdXJiKHNlZy0+ZHRvX3VyYik7Ci0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogCQlzZWctPnJlc3VsdCA9IHVyYi0+c3RhdHVzOwotCQl4ZmVyLT5zZWdzX2RvbmUrKzsKIAkJX193YV94ZmVyX2Fib3J0KHhmZXIpOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0VSUk9SKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKIAkJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAkJaWYgKHJwaXBlX3JlYWR5KQogCQkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7CiAJfQorCS8qIHRha2VuIHdoZW4gdGhpcyBVUkIgd2FzIHN1Ym1pdHRlZC4gKi8KKwl3YV94ZmVyX3B1dCh4ZmVyKTsKIH0KIAogLyoKQEAgLTk0MCw3ICsxMDA3LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqd2FfeGZlcl9jcmVhdGVfc3Vic2V0X3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqaW5fc2csCiAJY29uc3QgdW5zaWduZWQgaW50IGJ5dGVzX3RyYW5zZmVycmVkLAotCWNvbnN0IHVuc2lnbmVkIGludCBieXRlc190b190cmFuc2ZlciwgdW5zaWduZWQgaW50ICpvdXRfbnVtX3NncykKKwljb25zdCB1bnNpZ25lZCBpbnQgYnl0ZXNfdG9fdHJhbnNmZXIsIGludCAqb3V0X251bV9zZ3MpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpvdXRfc2c7CiAJdW5zaWduZWQgaW50IGJ5dGVzX3Byb2Nlc3NlZCA9IDAsIG9mZnNldF9pbnRvX2N1cnJlbnRfcGFnZV9kYXRhID0gMCwKQEAgLTEwOTQsMTQgKzExNjEsMTMgQEAKICAqLwogc3RhdGljIGludCBfX3dhX3hmZXJfc2V0dXBfc2VncyhzdHJ1Y3Qgd2FfeGZlciAqeGZlciwgc2l6ZV90IHhmZXJfaGRyX3NpemUpCiB7Ci0JaW50IHJlc3VsdCwgY250LCBpc29fZnJhbWVfb2Zmc2V0OworCWludCByZXN1bHQsIGNudCwgaXNvY19mcmFtZV9vZmZzZXQgPSAwOwogCXNpemVfdCBhbGxvY19zaXplID0gc2l6ZW9mKCp4ZmVyLT5zZWdbMF0pCiAJCS0gc2l6ZW9mKHhmZXItPnNlZ1swXS0+eGZlcl9oZHIpICsgeGZlcl9oZHJfc2l6ZTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHhmZXItPndhLT51c2JfZGV2OwogCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZHRvX2VwZCA9IHhmZXItPndhLT5kdG9fZXBkOwogCXN0cnVjdCB3YV9zZWcgKnNlZzsKIAlzaXplX3QgYnVmX2l0ciwgYnVmX3NpemUsIGJ1Zl9pdHJfc2l6ZTsKLQlpbnQgaXNvY19mcmFtZV9vZmZzZXQgPSAwOwogCiAJcmVzdWx0ID0gLUVOT01FTTsKIAl4ZmVyLT5zZWcgPSBrY2FsbG9jKHhmZXItPnNlZ3MsIHNpemVvZih4ZmVyLT5zZWdbMF0pLCBHRlBfQVRPTUlDKTsKQEAgLTExMDksNyArMTE3NSw2IEBACiAJCWdvdG8gZXJyb3Jfc2Vnc19remFsbG9jOwogCWJ1Zl9pdHIgPSAwOwogCWJ1Zl9zaXplID0geGZlci0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwotCWlzb19mcmFtZV9vZmZzZXQgPSAwOwogCWZvciAoY250ID0gMDsgY250IDwgeGZlci0+c2VnczsgY250KyspIHsKIAkJc2l6ZV90IGlzb19wa3RfZGVzY3Jfc2l6ZSA9IDA7CiAJCWludCBzZWdfaXNvY19mcmFtZV9jb3VudCA9IDAsIHNlZ19pc29jX3NpemUgPSAwOwpAQCAtMTMxOCwzMCArMTM4Myw0MSBAQAogCS8qIGRlZmF1bHQgdG8gZG9uZSB1bmxlc3Mgd2UgZW5jb3VudGVyIGEgbXVsdGktZnJhbWUgaXNvYyBzZWdtZW50LiAqLwogCSpkdG9fZG9uZSA9IDE7CiAKKwkvKgorCSAqIFRha2UgYSByZWYgZm9yIGVhY2ggc2VnbWVudCB1cmIgc28gdGhlIHhmZXIgY2Fubm90IGRpc2FwcGVhciB1bnRpbAorCSAqIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHJ1bi4KKwkgKi8KKwl3YV94ZmVyX2dldCh4ZmVyKTsKIAkvKiBzdWJtaXQgdGhlIHRyYW5zZmVyIHJlcXVlc3QuICovCisJc2VnLT5zdGF0dXMgPSBXQV9TRUdfU1VCTUlUVEVEOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCZzZWctPnRyX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJfZXJyKCIlczogeGZlciAlcCMldTogUkVRIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIHhmZXIsIHNlZy0+aW5kZXgsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3Jfc2VnX3N1Ym1pdDsKKwkJd2FfeGZlcl9wdXQoeGZlcik7CisJCWdvdG8gZXJyb3JfdHJfc3VibWl0OwogCX0KIAkvKiBzdWJtaXQgdGhlIGlzb2MgcGFja2V0IGRlc2NyaXB0b3IgaWYgcHJlc2VudC4gKi8KIAlpZiAoc2VnLT5pc29jX3BhY2tfZGVzY191cmIpIHsKKwkJd2FfeGZlcl9nZXQoeGZlcik7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHNlZy0+aXNvY19wYWNrX2Rlc2NfdXJiLCBHRlBfQVRPTUlDKTsKIAkJc2VnLT5pc29jX2ZyYW1lX2luZGV4ID0gMDsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCXByX2VycigiJXM6IHhmZXIgJXAjJXU6IElTTyBwYWNrZXQgZGVzY3JpcHRvciBzdWJtaXQgZmFpbGVkOiAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgeGZlciwgc2VnLT5pbmRleCwgcmVzdWx0KTsKKwkJCXdhX3hmZXJfcHV0KHhmZXIpOwogCQkJZ290byBlcnJvcl9pc29fcGFja19kZXNjX3N1Ym1pdDsKIAkJfQogCX0KIAkvKiBzdWJtaXQgdGhlIG91dCBkYXRhIGlmIHRoaXMgaXMgYW4gb3V0IHJlcXVlc3QuICovCiAJaWYgKHNlZy0+ZHRvX3VyYikgewogCQlzdHJ1Y3Qgd2FoYyAqd2EgPSB4ZmVyLT53YTsKKwkJd2FfeGZlcl9nZXQoeGZlcik7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHNlZy0+ZHRvX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQlwcl9lcnIoIiVzOiB4ZmVyICVwIyV1OiBEVE8gc3VibWl0IGZhaWxlZDogJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHhmZXIsIHNlZy0+aW5kZXgsIHJlc3VsdCk7CisJCQl3YV94ZmVyX3B1dCh4ZmVyKTsKIAkJCWdvdG8gZXJyb3JfZHRvX3N1Ym1pdDsKIAkJfQogCQkvKgpAQCAtMTM1Myw3ICsxNDI5LDYgQEAKIAkJCSYmIChzZWctPmlzb2NfZnJhbWVfY291bnQgPiAxKSkKIAkJCSpkdG9fZG9uZSA9IDA7CiAJfQotCXNlZy0+c3RhdHVzID0gV0FfU0VHX1NVQk1JVFRFRDsKIAlycGlwZV9hdmFpbF9kZWMocnBpcGUpOwogCXJldHVybiAwOwogCkBAIC0xMzYxLDcgKzE0MzYsNyBAQAogCXVzYl91bmxpbmtfdXJiKHNlZy0+aXNvY19wYWNrX2Rlc2NfdXJiKTsKIGVycm9yX2lzb19wYWNrX2Rlc2Nfc3VibWl0OgogCXVzYl91bmxpbmtfdXJiKCZzZWctPnRyX3VyYik7Ci1lcnJvcl9zZWdfc3VibWl0OgorZXJyb3JfdHJfc3VibWl0OgogCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogCXNlZy0+cmVzdWx0ID0gcmVzdWx0OwogCSpkdG9fZG9uZSA9IDE7CkBAIC0xMzkzLDYgKzE0NjgsMTIgQEAKIAkJCQkgbGlzdF9ub2RlKTsKIAkJbGlzdF9kZWwoJnNlZy0+bGlzdF9ub2RlKTsKIAkJeGZlciA9IHNlZy0+eGZlcjsKKwkJLyoKKwkJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB4ZmVyIGluIGNhc2UgdGhlIGNhbGxiYWNrcyBmb3IgdGhlCisJCSAqIFVSQnMgc3VibWl0dGVkIGJ5IF9fd2Ffc2VnX3N1Ym1pdCBhdHRlbXB0IHRvIGNvbXBsZXRlCisJCSAqIHRoZSB4ZmVyIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlcy4KKwkJICovCisJCXdhX3hmZXJfZ2V0KHhmZXIpOwogCQlyZXN1bHQgPSBfX3dhX3NlZ19zdWJtaXQocnBpcGUsIHhmZXIsIHNlZywgJmR0b19kb25lKTsKIAkJLyogcmVsZWFzZSB0aGUgZHRvIHJlc291cmNlIGlmIHRoaXMgUlBJUEUgaXMgZG9uZSB3aXRoIGl0LiAqLwogCQlpZiAoZHRvX2RvbmUpCkBAIC0xNDAxLDEzICsxNDgyLDIzIEBACiAJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAogCQkJYXRvbWljX3JlYWQoJnJwaXBlLT5zZWdzX2F2YWlsYWJsZSksIHJlc3VsdCk7CiAJCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQkJaW50IGRvbmU7CisKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKKwkJCS8qCisJCQkgKiBUaGlzIHNlZyB3YXMgbWFya2VkIGFzIHN1Ym1pdHRlZCB3aGVuIGl0IHdhcyBwdXQgb24KKwkJCSAqIHRoZSBSUElQRSBzZWdfbGlzdC4gIE1hcmsgaXQgZG9uZS4KKwkJCSAqLwogCQkJeGZlci0+c2Vnc19kb25lKys7CisJCQlkb25lID0gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZG9uZSkKKwkJCQl3YV94ZmVyX2NvbXBsZXRpb24oeGZlcik7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBpcGUtPnNlZ19sb2NrLCBmbGFncyk7CiAJCX0KKwkJd2FfeGZlcl9wdXQoeGZlcik7CiAJfQogCS8qCiAJICogTWFyayB0aGlzIFJQSVBFIGFzIHdhaXRpbmcgaWYgZHRvIHdhcyBub3QgYWNxdWlyZWQsIHRoZXJlIGFyZQpAQCAtMTU5MiwxMiArMTY4MywxOSBAQAogCQlkZXZfZXJyKCYodXJiLT5kZXYtPmRldiksICIlczogZXJyb3JfeGZlcl9zZXR1cFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3hmZXJfc2V0dXA7CiAJfQorCS8qCisJICogR2V0IGEgeGZlciByZWZlcmVuY2Ugc2luY2UgX193YV94ZmVyX3N1Ym1pdCBzdGFydHMgYXN5bmNocm9ub3VzCisJICogb3BlcmF0aW9ucyB0aGF0IG1heSB0cnkgdG8gY29tcGxldGUgdGhlIHhmZXIgYmVmb3JlIHRoaXMgZnVuY3Rpb24KKwkgKiBleGl0cy4KKwkgKi8KKwl3YV94ZmVyX2dldCh4ZmVyKTsKIAlyZXN1bHQgPSBfX3dhX3hmZXJfc3VibWl0KHhmZXIpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCWRldl9lcnIoJih1cmItPmRldi0+ZGV2KSwgIiVzOiBlcnJvcl94ZmVyX3N1Ym1pdFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3hmZXJfc3VibWl0OwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJd2FfeGZlcl9wdXQoeGZlcik7CiAJcmV0dXJuIDA7CiAKIAkvKgpAQCAtMTYyMyw2ICsxNzIxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRvbmUpCiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKKwl3YV94ZmVyX3B1dCh4ZmVyKTsKIAkvKiByZXR1cm4gc3VjY2VzcyBzaW5jZSB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgcnVuLiAqLwogCXJldHVybiAwOwogfQpAQCAtMTgzMiwyMCArMTkzMSwyMCBAQAogCS8qIGNoZWNrIGlmIGl0IGlzIHNhZmUgdG8gdW5saW5rLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZ3YS0+eGZlcl9saXN0X2xvY2ssIGZsYWdzKTsKIAlyZXN1bHQgPSB1c2JfaGNkX2NoZWNrX3VubGlua191cmIoJih3YS0+d3VzYi0+dXNiX2hjZCksIHVyYiwgc3RhdHVzKTsKKwlpZiAoKHJlc3VsdCA9PSAwKSAmJiB1cmItPmhjcHJpdikgeworCQkvKgorCQkgKiBHZXQgYSB4ZmVyIHJlZiB0byBwcmV2ZW50IGEgcmFjZSB3aXRoIHdhX3hmZXJfZ2l2ZWJhY2sKKwkJICogY2xlYW5pbmcgdXAgdGhlIHhmZXIgd2hpbGUgd2UgYXJlIHdvcmtpbmcgd2l0aCBpdC4KKwkJICovCisJCXdhX3hmZXJfZ2V0KHVyYi0+aGNwcml2KTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2EtPnhmZXJfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAogCXhmZXIgPSB1cmItPmhjcHJpdjsKLQlpZiAoeGZlciA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIE5vdGhpbmcgc2V0dXAgeWV0IGVucXVldWUgd2lsbCBzZWUgdXJiLT5zdGF0dXMgIT0KLQkJICogLUVJTlBST0dSRVNTIChieSBoY2QgbGF5ZXIpIGFuZCBiYWlsIG91dCB3aXRoCi0JCSAqIGVycm9yLCBubyBuZWVkIHRvIGRvIGNvbXBsZXRpb24KLQkJICovCi0JCUJVR19PTih1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHhmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAlwcl9kZWJ1ZygiJXM6IERFUVVFVUUgeGZlciBpZCAweCUwOFhcbiIsIF9fZnVuY19fLCB3YV94ZmVyX2lkKHhmZXIpKTsKIAlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CkBAIC0xODU2LDYgKzE5NTUsMTYgQEAKIAkJcmVzdWx0ID0gLUVOT0VOVDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwkvKgorCSAqIENoZWNrIGZvciBkb25lIHRvIGF2b2lkIHJhY2luZyB3aXRoIHdhX3hmZXJfZ2l2ZWJhY2sgYW5kIGNvbXBsZXRpbmcKKwkgKiB0d2ljZS4KKwkgKi8KKwlpZiAoX193YV94ZmVyX2lzX2RvbmUoeGZlcikpIHsKKwkJcHJfZGVidWcoIiVzOiB4ZmVyICVwIGlkIDB4JTA4WCBhbHJlYWR5IGRvbmUuXG4iLCBfX2Z1bmNfXywKKwkJCXhmZXIsIHdhX3hmZXJfaWQoeGZlcikpOworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCS8qIENoZWNrIHRoZSBkZWxheWVkIGxpc3QgLT4gaWYgdGhlcmUsIHJlbGVhc2UgYW5kIGNvbXBsZXRlICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndhLT54ZmVyX2xpc3RfbG9jaywgZmxhZ3MyKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnhmZXItPmxpc3Rfbm9kZSkgJiYgeGZlci0+c2VnID09IE5VTEwpCkBAIC0xODY1LDYgKzE5NzQsMTEgQEAKIAkJZ290byBvdXRfdW5sb2NrOwkvKiBzZXR1cCgpLCBlbnF1ZXVlX2IoKSBjb21wbGV0ZXMgKi8KIAkvKiBPaywgdGhlIHhmZXIgaXMgaW4gZmxpZ2h0IGFscmVhZHksIGl0J3MgYmVlbiBzZXR1cCBhbmQgc3VibWl0dGVkLiovCiAJeGZlcl9hYm9ydF9wZW5kaW5nID0gX193YV94ZmVyX2Fib3J0KHhmZXIpID49IDA7CisJLyoKKwkgKiBncmFiIHRoZSBycGlwZS0+c2VnX2xvY2sgaGVyZSB0byBwcmV2ZW50IHJhY2luZyB3aXRoCisJICogX193YV94ZmVyX2RlbGF5ZWRfcnVuLgorCSAqLworCXNwaW5fbG9jaygmcnBpcGUtPnNlZ19sb2NrKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHhmZXItPnNlZ3M7IGNudCsrKSB7CiAJCXNlZyA9IHhmZXItPnNlZ1tjbnRdOwogCQlwcl9kZWJ1ZygiJXM6IHhmZXIgaWQgMHglMDhYIyVkIHN0YXR1cyA9ICVkXG4iLApAQCAtMTg4NSwxNiArMTk5OSwyNCBAQAogCQkJICovCiAJCQlzZWctPnN0YXR1cyA9IFdBX1NFR19BQk9SVEVEOwogCQkJc2VnLT5yZXN1bHQgPSAtRU5PRU5UOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MyKTsKIAkJCWxpc3RfZGVsKCZzZWctPmxpc3Rfbm9kZSk7CiAJCQl4ZmVyLT5zZWdzX2RvbmUrKzsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MyKTsKIAkJCWJyZWFrOwogCQljYXNlIFdBX1NFR19ET05FOgogCQljYXNlIFdBX1NFR19FUlJPUjoKIAkJY2FzZSBXQV9TRUdfQUJPUlRFRDoKIAkJCWJyZWFrOwogCQkJLyoKKwkJCSAqIFRoZSBidWZfaW4gZGF0YSBmb3IgYSBzZWdtZW50IGluIHRoZQorCQkJICogV0FfU0VHX0RUSV9QRU5ESU5HIHN0YXRlIGlzIGFjdGl2ZWx5IGJlaW5nIHJlYWQuCisJCQkgKiBMZXQgd2FfYnVmX2luX2NiIGhhbmRsZSBpdCBzaW5jZSBpdCB3aWxsIGJlIGNhbGxlZAorCQkJICogYW5kIHdpbGwgaW5jcmVtZW50IHhmZXItPnNlZ3NfZG9uZS4gIENsZWFuaW5nIHVwCisJCQkgKiBoZXJlIGNvdWxkIGNhdXNlIHdhX2J1Zl9pbl9jYiB0byBhY2Nlc3MgdGhlIHhmZXIKKwkJCSAqIGFmdGVyIGl0IGhhcyBiZWVuIGNvbXBsZXRlZC9mcmVlZC4KKwkJCSAqLworCQljYXNlIFdBX1NFR19EVElfUEVORElORzoKKwkJCWJyZWFrOworCQkJLyoKIAkJCSAqIEluIHRoZSBzdGF0ZXMgYmVsb3csIHRoZSBIV0EgZGV2aWNlIGFscmVhZHkga25vd3MKIAkJCSAqIGFib3V0IHRoZSB0cmFuc2Zlci4gIElmIGFuIGFib3J0IHJlcXVlc3Qgd2FzIHNlbnQsCiAJCQkgKiBhbGxvdyB0aGUgSFdBIHRvIHByb2Nlc3MgaXQgYW5kIHdhaXQgZm9yIHRoZQpAQCAtMTkwMyw3ICsyMDI1LDYgQEAKIAkJCSAqLwogCQljYXNlIFdBX1NFR19TVUJNSVRURUQ6CiAJCWNhc2UgV0FfU0VHX1BFTkRJTkc6Ci0JCWNhc2UgV0FfU0VHX0RUSV9QRU5ESU5HOgogCQkJLyoKIAkJCSAqIENoZWNrIGlmIHRoZSBhYm9ydCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQuICBUaGlzIGNvdWxkCiAJCQkgKiBiZSBmYWxzZSBpZiB0aGUgSFdBIGhhcyBiZWVuIHJlbW92ZWQgYnV0IHdlIGhhdmVuJ3QKQEAgLTE5MTcsNiArMjAzOCw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlzcGluX3VubG9jaygmcnBpcGUtPnNlZ19sb2NrKTsKIAl4ZmVyLT5yZXN1bHQgPSB1cmItPnN0YXR1czsJLyogLUVOT0VOVCBvciAtRUNPTk5SRVNFVCAqLwogCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CkBAIC0xOTI0LDExICsyMDQ2LDEyIEBACiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAlpZiAocnBpcGVfcmVhZHkpCiAJCXdhX3hmZXJfZGVsYXllZF9ydW4ocnBpcGUpOworCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybiByZXN1bHQ7CiAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwotb3V0OgorCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybiByZXN1bHQ7CiAKIGRlcXVldWVfZGVsYXllZDoKQEAgLTE5MzcsNiArMjA2MCw3IEBACiAJeGZlci0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCXdhX3hmZXJfZ2l2ZWJhY2soeGZlcik7CisJd2FfeGZlcl9wdXQoeGZlcik7CiAJdXNiX3B1dF91cmIodXJiKTsJCS8qIHdlIGdvdCBhIHJlZiBpbiBlbnF1ZXVlKCkgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTE5OTYsMTUgKzIxMjAsMTcgQEAKICAqIG5vIG90aGVyIHNlZ21lbnQgdHJhbnNmZXIgcmVzdWx0cyB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGRldmljZS4KICAqIE1hcmsgdGhlIHJlbWFpbmluZyBzdWJtaXR0ZWQgb3IgcGVuZGluZyB4ZmVycyBhcyBjb21wbGV0ZWQgc28gdGhhdAogICogdGhlIHhmZXIgd2lsbCBjb21wbGV0ZSBjbGVhbmx5LgorICoKKyAqIHhmZXItPmxvY2sgbXVzdCBiZSBoZWxkCisgKgogICovCiBzdGF0aWMgdm9pZCB3YV9jb21wbGV0ZV9yZW1haW5pbmdfeGZlcl9zZWdzKHN0cnVjdCB3YV94ZmVyICp4ZmVyLAotCQlzdHJ1Y3Qgd2Ffc2VnICppbmNvbWluZ19zZWcsIGVudW0gd2Ffc2VnX3N0YXR1cyBzdGF0dXMpCisJCWludCBzdGFydGluZ19pbmRleCwgZW51bSB3YV9zZWdfc3RhdHVzIHN0YXR1cykKIHsKIAlpbnQgaW5kZXg7CiAJc3RydWN0IHdhX3JwaXBlICpycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CiAKLQlmb3IgKGluZGV4ID0gaW5jb21pbmdfc2VnLT5pbmRleCArIDE7IGluZGV4IDwgeGZlci0+c2Vnc19zdWJtaXR0ZWQ7Ci0JCWluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gc3RhcnRpbmdfaW5kZXg7IGluZGV4IDwgeGZlci0+c2Vnc19zdWJtaXR0ZWQ7IGluZGV4KyspIHsKIAkJc3RydWN0IHdhX3NlZyAqY3VycmVudF9zZWcgPSB4ZmVyLT5zZWdbaW5kZXhdOwogCiAJCUJVR19PTihjdXJyZW50X3NlZyA9PSBOVUxMKTsKQEAgLTIwMzMsNzMgKzIxNTksMTEwIEBACiAJfQogfQogCi0vKiBQb3B1bGF0ZSB0aGUgd2EtPmJ1Zl9pbl91cmIgYmFzZWQgb24gdGhlIGN1cnJlbnQgaXNvYyB0cmFuc2ZlciBzdGF0ZS4gKi8KLXN0YXRpYyB2b2lkIF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX3hmZXIgKnhmZXIsCi0Jc3RydWN0IHdhX3NlZyAqc2VnLCBpbnQgY3Vycl9pc29fZnJhbWUpCisvKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IGlzb2MgdHJhbnNmZXIgc3RhdGUuICovCitzdGF0aWMgaW50IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHN0cnVjdCB3YWhjICp3YSwKKwlzdHJ1Y3QgdXJiICpidWZfaW5fdXJiLCBzdHJ1Y3Qgd2FfeGZlciAqeGZlciwgc3RydWN0IHdhX3NlZyAqc2VnKQogewotCUJVR19PTih3YS0+YnVmX2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyk7CisJaW50IHVyYl9zdGFydF9mcmFtZSA9IHNlZy0+aXNvY19mcmFtZV9pbmRleCArIHNlZy0+aXNvY19mcmFtZV9vZmZzZXQ7CisJaW50IHNlZ19pbmRleCwgdG90YWxfbGVuID0gMCwgdXJiX2ZyYW1lX2luZGV4ID0gdXJiX3N0YXJ0X2ZyYW1lOworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9CisJCQkJCQl4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjOworCWNvbnN0IGludCBkdGlfcGFja2V0X3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cCh3YS0+ZHRpX2VwZCk7CisJaW50IG5leHRfZnJhbWVfY29udGlndW91czsKKwlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvX2ZyYW1lOworCisJQlVHX09OKGJ1Zl9pbl91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpOworCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBmcmFtZSBhY3R1YWxfbGVuZ3RoIGlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgbmV4dCBmcmFtZQorCSAqIGFuZCBhY3R1YWxfbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIERUSSBlbmRwb2ludCBtYXggcGFja2V0IHNpemUsCisJICogY29tYmluZSB0aGUgY3VycmVudCBmcmFtZSB3aXRoIHRoZSBuZXh0IGZyYW1lIGluIGEgc2luZ2xlIFVSQi4gIFRoaXMKKwkgKiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgVVJCcyB0aGF0IG11c3QgYmUgc3VibWl0dGVkIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlzZWdfaW5kZXggPSBzZWctPmlzb2NfZnJhbWVfaW5kZXg7CisJZG8geworCQluZXh0X2ZyYW1lX2NvbnRpZ3VvdXMgPSAwOworCisJCWlzb19mcmFtZSA9ICZpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdOworCQl0b3RhbF9sZW4gKz0gaXNvX2ZyYW1lLT5hY3R1YWxfbGVuZ3RoOworCQkrK3VyYl9mcmFtZV9pbmRleDsKKwkJKytzZWdfaW5kZXg7CisKKwkJaWYgKHNlZ19pbmRleCA8IHNlZy0+aXNvY19mcmFtZV9jb3VudCkgeworCQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKm5leHRfaXNvX2ZyYW1lOworCisJCQluZXh0X2lzb19mcmFtZSA9ICZpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdOworCisJCQlpZiAoKGlzb19mcmFtZS0+b2Zmc2V0ICsgaXNvX2ZyYW1lLT5hY3R1YWxfbGVuZ3RoKSA9PQorCQkJCW5leHRfaXNvX2ZyYW1lLT5vZmZzZXQpCisJCQkJbmV4dF9mcmFtZV9jb250aWd1b3VzID0gMTsKKwkJfQorCX0gd2hpbGUgKG5leHRfZnJhbWVfY29udGlndW91cworCQkJJiYgKChpc29fZnJhbWUtPmFjdHVhbF9sZW5ndGggJSBkdGlfcGFja2V0X3NpemUpID09IDApKTsKIAogCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAwIGJlZm9yZSBhIHJlc3VibWl0LiAqLwotCXdhLT5idWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7Ci0Jd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2RtYSA9IHhmZXItPnVyYi0+dHJhbnNmZXJfZG1hICsKLQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzY1tjdXJyX2lzb19mcmFtZV0ub2Zmc2V0OwotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0KLQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzY1tjdXJyX2lzb19mcmFtZV0ubGVuZ3RoOwotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQl3YS0+YnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQl3YS0+YnVmX2luX3VyYi0+c2cgPSBOVUxMOwotCXdhLT5idWZfaW5fdXJiLT5udW1fc2dzID0gMDsKLQl3YS0+YnVmX2luX3VyYi0+Y29udGV4dCA9IHNlZzsKKwlidWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7CisJYnVmX2luX3VyYi0+dHJhbnNmZXJfZG1hID0geGZlci0+dXJiLT50cmFuc2Zlcl9kbWEgKworCQlpc29fZnJhbWVfZGVzY1t1cmJfc3RhcnRfZnJhbWVdLm9mZnNldDsKKwlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdG90YWxfbGVuOworCWJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCWJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJYnVmX2luX3VyYi0+c2cgPSBOVUxMOworCWJ1Zl9pbl91cmItPm51bV9zZ3MgPSAwOworCWJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CisKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBmcmFtZXMgaW5jbHVkZWQgaW4gdGhpcyBVUkIuICovCisJcmV0dXJuIHNlZ19pbmRleCAtIHNlZy0+aXNvY19mcmFtZV9pbmRleDsKIH0KIAotLyogUG9wdWxhdGUgdGhlIHdhLT5idWZfaW5fdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXRlLiAqLwotc3RhdGljIGludCB3YV9wb3B1bGF0ZV9idWZfaW5fdXJiKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX3hmZXIgKnhmZXIsCisvKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXRlLiAqLworc3RhdGljIGludCB3YV9wb3B1bGF0ZV9idWZfaW5fdXJiKHN0cnVjdCB1cmIgKmJ1Zl9pbl91cmIsIHN0cnVjdCB3YV94ZmVyICp4ZmVyLAogCXVuc2lnbmVkIGludCBzZWdfaWR4LCB1bnNpZ25lZCBpbnQgYnl0ZXNfdHJhbnNmZXJyZWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHdhX3NlZyAqc2VnID0geGZlci0+c2VnW3NlZ19pZHhdOwogCi0JQlVHX09OKHdhLT5idWZfaW5fdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKTsKKwlCVUdfT04oYnVmX2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyk7CiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIDAgYmVmb3JlIGEgcmVzdWJtaXQuICovCi0Jd2EtPmJ1Zl9pbl91cmItPm51bV9tYXBwZWRfc2dzCT0gMDsKKwlidWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7CiAKIAlpZiAoeGZlci0+aXNfZG1hKSB7Ci0JCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9kbWEgPSB4ZmVyLT51cmItPnRyYW5zZmVyX2RtYQorCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9kbWEgPSB4ZmVyLT51cmItPnRyYW5zZmVyX2RtYQogCQkJKyAoc2VnX2lkeCAqIHhmZXItPnNlZ19zaXplKTsKLQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCQl3YS0+YnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQkJd2EtPmJ1Zl9pbl91cmItPnNnID0gTlVMTDsKLQkJd2EtPmJ1Zl9pbl91cmItPm51bV9zZ3MgPSAwOworCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJYnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJYnVmX2luX3VyYi0+c2cgPSBOVUxMOworCQlidWZfaW5fdXJiLT5udW1fc2dzID0gMDsKIAl9IGVsc2UgewogCQkvKiBkbyBidWZmZXIgb3IgU0cgcHJvY2Vzc2luZy4gKi8KLQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJYnVmX2luX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiAJCWlmICh4ZmVyLT51cmItPnRyYW5zZmVyX2J1ZmZlcikgewotCQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIgPQogCQkJCXhmZXItPnVyYi0+dHJhbnNmZXJfYnVmZmVyCiAJCQkJKyAoc2VnX2lkeCAqIHhmZXItPnNlZ19zaXplKTsKLQkJCXdhLT5idWZfaW5fdXJiLT5zZyA9IE5VTEw7Ci0JCQl3YS0+YnVmX2luX3VyYi0+bnVtX3NncyA9IDA7CisJCQlidWZfaW5fdXJiLT5zZyA9IE5VTEw7CisJCQlidWZfaW5fdXJiLT5udW1fc2dzID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qIGFsbG9jYXRlIGFuIFNHIGxpc3QgdG8gc3RvcmUgc2VnX3NpemUgYnl0ZXMKIAkJCQlhbmQgY29weSB0aGUgc3Vic2V0IG9mIHRoZSB4ZmVyLT51cmItPnNnCiAJCQkJdGhhdCBtYXRjaGVzIHRoZSBidWZmZXIgc3Vic2V0IHdlIGFyZQogCQkJCWFib3V0IHRvIHJlYWQuICovCi0JCQl3YS0+YnVmX2luX3VyYi0+c2cgPSB3YV94ZmVyX2NyZWF0ZV9zdWJzZXRfc2coCisJCQlidWZfaW5fdXJiLT5zZyA9IHdhX3hmZXJfY3JlYXRlX3N1YnNldF9zZygKIAkJCQl4ZmVyLT51cmItPnNnLAogCQkJCXNlZ19pZHggKiB4ZmVyLT5zZWdfc2l6ZSwKIAkJCQlieXRlc190cmFuc2ZlcnJlZCwKLQkJCQkmKHdhLT5idWZfaW5fdXJiLT5udW1fc2dzKSk7CisJCQkJJihidWZfaW5fdXJiLT5udW1fc2dzKSk7CiAKLQkJCWlmICghKHdhLT5idWZfaW5fdXJiLT5zZykpIHsKLQkJCQl3YS0+YnVmX2luX3VyYi0+bnVtX3Nncwk9IDA7CisJCQlpZiAoIShidWZfaW5fdXJiLT5zZykpIHsKKwkJCQlidWZfaW5fdXJiLT5udW1fc2dzCT0gMDsKIAkJCQlyZXN1bHQgPSAtRU5PTUVNOwogCQkJfQotCQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwogCQl9CiAJfQotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0Jd2EtPmJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CisJYnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJ5dGVzX3RyYW5zZmVycmVkOworCWJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjEyNCw2ICsyMjg3LDcgQEAKIAl1OCB1c2Jfc3RhdHVzOwogCXVuc2lnbmVkIHJwaXBlX3JlYWR5ID0gMDsKIAl1bnNpZ25lZCBieXRlc190cmFuc2ZlcnJlZCA9IGxlMzJfdG9fY3B1KHhmZXJfcmVzdWx0LT5kd1RyYW5zZmVyTGVuZ3RoKTsKKwlzdHJ1Y3QgdXJiICpidWZfaW5fdXJiID0gJih3YS0+YnVmX2luX3VyYnNbMF0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAlzZWdfaWR4ID0geGZlcl9yZXN1bHQtPmJUcmFuc2ZlclNlZ21lbnQgJiAweDdmOwpAQCAtMjE0Nyw3ICsyMzExLDcgQEAKIAl9CiAJaWYgKHVzYl9zdGF0dXMgJiAweDgwKSB7CiAJCXNlZy0+cmVzdWx0ID0gd2FfeGZlcl9zdGF0dXNfdG9fZXJybm8odXNiX3N0YXR1cyk7Ci0JCWRldl9lcnIoZGV2LCAiRFRJOiB4ZmVyICVwIzolMDhYOiV1IGZhaWxlZCAoMHglMDJ4KVxuIiwKKwkJZGV2X2VycihkZXYsICJEVEk6IHhmZXIgJXAgMHglMDhYOiMldSBmYWlsZWQgKDB4JTAyeClcbiIsCiAJCQl4ZmVyLCB4ZmVyLT5pZCwgc2VnLT5pbmRleCwgdXNiX3N0YXR1cyk7CiAJCXNlZy0+c3RhdHVzID0gKCh1c2Jfc3RhdHVzICYgMHg3RikgPT0gV0FfWEZFUl9TVEFUVVNfQUJPUlRFRCkgPwogCQkJV0FfU0VHX0FCT1JURUQgOiBXQV9TRUdfRVJST1I7CkBAIC0yMTYyLDcgKzIzMjYsOCBAQAogCSAqIHRyYW5zZmVycyB3aXRoIGRhdGEgb3IgYmVsb3cgZm9yIG5vIGRhdGEsIHRoZSB4ZmVyIHdpbGwgY29tcGxldGUuCiAJICovCiAJaWYgKHhmZXJfcmVzdWx0LT5iVHJhbnNmZXJTZWdtZW50ICYgMHg4MCkKLQkJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWcsIFdBX1NFR19ET05FKTsKKwkJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWctPmluZGV4ICsgMSwKKwkJCVdBX1NFR19ET05FKTsKIAlpZiAodXNiX3BpcGVpc29jKHhmZXItPnVyYi0+cGlwZSkKIAkJJiYgKGxlMzJfdG9fY3B1KHhmZXJfcmVzdWx0LT5kd051bU9mUGFja2V0cykgPiAwKSkgewogCQkvKiBzZXQgdXAgV0Egc3RhdGUgdG8gcmVhZCB0aGUgaXNvYyBwYWNrZXQgc3RhdHVzIG5leHQuICovCkBAIC0yMTczLDIwICsyMzM4LDIxIEBACiAJCQkmJiAoYnl0ZXNfdHJhbnNmZXJyZWQgPiAwKSkgewogCQkvKiBJTiBkYXRhIHBoYXNlOiByZWFkIHRvIGJ1ZmZlciAqLwogCQlzZWctPnN0YXR1cyA9IFdBX1NFR19EVElfUEVORElORzsKLQkJcmVzdWx0ID0gd2FfcG9wdWxhdGVfYnVmX2luX3VyYih3YSwgeGZlciwgc2VnX2lkeCwKKwkJcmVzdWx0ID0gd2FfcG9wdWxhdGVfYnVmX2luX3VyYihidWZfaW5fdXJiLCB4ZmVyLCBzZWdfaWR4LAogCQkJYnl0ZXNfdHJhbnNmZXJyZWQpOwogCQlpZiAocmVzdWx0IDwgMCkKIAkJCWdvdG8gZXJyb3JfYnVmX2luX3BvcHVsYXRlOwotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3YS0+YnVmX2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyZXN1bHQgPCAwKQorCQkrKyh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoYnVmX2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQktLSh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKIAkJCWdvdG8gZXJyb3Jfc3VibWl0X2J1Zl9pbjsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIE9VVCBkYXRhIHBoYXNlIG9yIG5vIGRhdGEsIGNvbXBsZXRlIGl0IC0tICovCi0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0RPTkU7CiAJCXNlZy0+cmVzdWx0ID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0RPTkUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRvbmUpCkBAIC0yMjA1LDE1ICsyMzcxLDE1IEBACiAJCWRldl9lcnIoZGV2LCAieGZlciAlcCMldTogY2FuJ3Qgc3VibWl0IERUSSBkYXRhIHBoYXNlOiAlZFxuIiwKIAkJCXhmZXIsIHNlZ19pZHgsIHJlc3VsdCk7CiAJc2VnLT5yZXN1bHQgPSByZXN1bHQ7Ci0Ja2ZyZWUod2EtPmJ1Zl9pbl91cmItPnNnKTsKLQl3YS0+YnVmX2luX3VyYi0+c2cgPSBOVUxMOworCWtmcmVlKGJ1Zl9pbl91cmItPnNnKTsKKwlidWZfaW5fdXJiLT5zZyA9IE5VTEw7CiBlcnJvcl9idWZfaW5fcG9wdWxhdGU6CiAJX193YV94ZmVyX2Fib3J0KHhmZXIpOwogCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogZXJyb3JfY29tcGxldGU6CiAJeGZlci0+c2Vnc19kb25lKys7CiAJcnBpcGVfcmVhZHkgPSBycGlwZV9hdmFpbF9pbmMocnBpcGUpOwotCXdhX2NvbXBsZXRlX3JlbWFpbmluZ194ZmVyX3NlZ3MoeGZlciwgc2VnLCBzZWctPnN0YXR1cyk7CisJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWctPmluZGV4ICsgMSwgc2VnLT5zdGF0dXMpOwogCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKIAkvKgogCSAqIHF1ZXVlIHdvcmsgaXRlbSB0byBjbGVhciBTVEFMTCBmb3IgY29udHJvbCBlbmRwb2ludHMuCkBAIC0yMzE1LDE2ICsyNDgxLDE2IEBACiAJZm9yIChzZWdfaW5kZXggPSAwOyBzZWdfaW5kZXggPCBzZWctPmlzb2NfZnJhbWVfY291bnQ7ICsrc2VnX2luZGV4KSB7CiAJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9CiAJCQl4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjOwotCQljb25zdCBpbnQgdXJiX2ZyYW1lX2luZGV4ID0KKwkJY29uc3QgaW50IHhmZXJfZnJhbWVfaW5kZXggPQogCQkJc2VnLT5pc29jX2ZyYW1lX29mZnNldCArIHNlZ19pbmRleDsKIAotCQlpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdLnN0YXR1cyA9CisJCWlzb19mcmFtZV9kZXNjW3hmZXJfZnJhbWVfaW5kZXhdLnN0YXR1cyA9CiAJCQl3YV94ZmVyX3N0YXR1c190b19lcnJubygKIAkJCWxlMTZfdG9fY3B1KHN0YXR1c19hcnJheVtzZWdfaW5kZXhdLlBhY2tldFN0YXR1cykpOwotCQlpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdLmFjdHVhbF9sZW5ndGggPQorCQlpc29fZnJhbWVfZGVzY1t4ZmVyX2ZyYW1lX2luZGV4XS5hY3R1YWxfbGVuZ3RoID0KIAkJCWxlMTZfdG9fY3B1KHN0YXR1c19hcnJheVtzZWdfaW5kZXhdLlBhY2tldExlbmd0aCk7CiAJCS8qIHRyYWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZC4gKi8KLQkJaWYgKGlzb19mcmFtZV9kZXNjW3VyYl9mcmFtZV9pbmRleF0uYWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJaWYgKGlzb19mcmFtZV9kZXNjW3hmZXJfZnJhbWVfaW5kZXhdLmFjdHVhbF9sZW5ndGggPiAwKSB7CiAJCQkvKiBzYXZlIHRoZSBzdGFydGluZyBmcmFtZSBpbmRleCBmb3IgYnVmX2luX3VyYi4gKi8KIAkJCWlmICghZGF0YV9mcmFtZV9jb3VudCkKIAkJCQlmaXJzdF9mcmFtZV9pbmRleCA9IHNlZ19pbmRleDsKQEAgLTIzMzMsMzAgKzI0OTksNjQgQEAKIAl9CiAKIAlpZiAoeGZlci0+aXNfaW5ib3VuZCAmJiBkYXRhX2ZyYW1lX2NvdW50KSB7Ci0JCWludCByZXN1bHQ7CisJCWludCByZXN1bHQsIHRvdGFsX2ZyYW1lc19yZWFkID0gMCwgdXJiX2luZGV4ID0gMDsKKwkJc3RydWN0IHVyYiAqYnVmX2luX3VyYjsKIAorCQkvKiBJTiBkYXRhIHBoYXNlOiByZWFkIHRvIGJ1ZmZlciAqLworCQlzZWctPnN0YXR1cyA9IFdBX1NFR19EVElfUEVORElORzsKKworCQkvKiBzdGFydCB3aXRoIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGRhdGEuICovCiAJCXNlZy0+aXNvY19mcmFtZV9pbmRleCA9IGZpcnN0X2ZyYW1lX2luZGV4OwotCQkvKiBzdWJtaXQgYSByZWFkIFVSQiBmb3IgdGhlIGZpcnN0IGZyYW1lIHdpdGggZGF0YS4gKi8KLQkJX193YV9wb3B1bGF0ZV9idWZfaW5fdXJiX2lzb2Mod2EsIHhmZXIsIHNlZywKLQkJCXNlZy0+aXNvY19mcmFtZV9pbmRleCArIHNlZy0+aXNvY19mcmFtZV9vZmZzZXQpOworCQkvKiBzdWJtaXQgdXAgdG8gV0FfTUFYX0JVRl9JTl9VUkJTIHJlYWQgVVJCcy4gKi8KKwkJZG8geworCQkJaW50IHVyYl9mcmFtZV9pbmRleCwgdXJiX2ZyYW1lX2NvdW50OworCQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlzb19mcmFtZV9kZXNjOwogCi0JCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5idWZfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWJ1Zl9pbl91cmIgPSAmKHdhLT5idWZfaW5fdXJic1t1cmJfaW5kZXhdKTsKKwkJCXVyYl9mcmFtZV9jb3VudCA9IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHdhLAorCQkJCWJ1Zl9pbl91cmIsIHhmZXIsIHNlZyk7CisJCQkvKiBhZHZhbmNlIGZyYW1lIGluZGV4IHRvIHN0YXJ0IG9mIG5leHQgcmVhZCBVUkIuICovCisJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKz0gdXJiX2ZyYW1lX2NvdW50OworCQkJdG90YWxfZnJhbWVzX3JlYWQgKz0gdXJiX2ZyYW1lX2NvdW50OworCisJCQkrKyh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKKwkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKGJ1Zl9pbl91cmIsIEdGUF9BVE9NSUMpOworCisJCQkvKiBza2lwIDAtYnl0ZSBmcmFtZXMuICovCisJCQl1cmJfZnJhbWVfaW5kZXggPQorCQkJCXNlZy0+aXNvY19mcmFtZV9vZmZzZXQgKyBzZWctPmlzb2NfZnJhbWVfaW5kZXg7CisJCQlpc29fZnJhbWVfZGVzYyA9CisJCQkJJih4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjW3VyYl9mcmFtZV9pbmRleF0pOworCQkJd2hpbGUgKChzZWctPmlzb2NfZnJhbWVfaW5kZXggPAorCQkJCQkJc2VnLT5pc29jX2ZyYW1lX2NvdW50KSAmJgorCQkJCSAoaXNvX2ZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggPT0gMCkpIHsKKwkJCQkrKyhzZWctPmlzb2NfZnJhbWVfaW5kZXgpOworCQkJCSsraXNvX2ZyYW1lX2Rlc2M7CisJCQl9CisJCQkrK3VyYl9pbmRleDsKKworCQl9IHdoaWxlICgocmVzdWx0ID09IDApICYmICh1cmJfaW5kZXggPCBXQV9NQVhfQlVGX0lOX1VSQlMpCisJCQkJJiYgKHNlZy0+aXNvY19mcmFtZV9pbmRleCA8CisJCQkJCQlzZWctPmlzb2NfZnJhbWVfY291bnQpKTsKKwogCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLS0od2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CiAJCQlkZXZfZXJyKGRldiwgIkRUSSBFcnJvcjogQ291bGQgbm90IHN1Ym1pdCBidWYgaW4gVVJCICglZCkiLAogCQkJCXJlc3VsdCk7CiAJCQl3YV9yZXNldF9hbGwod2EpOwotCQl9IGVsc2UgaWYgKGRhdGFfZnJhbWVfY291bnQgPiAxKQotCQkJLyogSWYgd2UgbmVlZCB0byByZWFkIG11bHRpcGxlIGZyYW1lcywgc2V0IERUSSBidXN5LiAqLworCQl9IGVsc2UgaWYgKGRhdGFfZnJhbWVfY291bnQgPiB0b3RhbF9mcmFtZXNfcmVhZCkKKwkJCS8qIElmIHdlIG5lZWQgdG8gcmVhZCBtb3JlIGZyYW1lcywgc2V0IERUSSBidXN5LiAqLwogCQkJZHRpX2J1c3kgPSAxOwogCX0gZWxzZSB7CiAJCS8qIE9VVCB0cmFuc2ZlciBvciBubyBtb3JlIElOIGRhdGEsIGNvbXBsZXRlIGl0IC0tICovCi0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0RPTkU7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0RPTkUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7Ci0Jd2EtPmR0aV9zdGF0ZSA9IFdBX0RUSV9UUkFOU0ZFUl9SRVNVTFRfUEVORElORzsKKwlpZiAoZHRpX2J1c3kpCisJCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfQlVGX0lOX0RBVEFfUEVORElORzsKKwllbHNlCisJCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfVFJBTlNGRVJfUkVTVUxUX1BFTkRJTkc7CiAJaWYgKGRvbmUpCiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAlpZiAocnBpcGVfcmVhZHkpCkBAIC0yMzg4LDggKzI1ODgsOSBAQAogCXN0cnVjdCB3YWhjICp3YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHdhX3JwaXBlICpycGlwZTsKLQl1bnNpZ25lZCBycGlwZV9yZWFkeSA9IDAsIHNlZ19pbmRleCwgaXNvY19kYXRhX2ZyYW1lX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBycGlwZV9yZWFkeSA9IDAsIGlzb2NfZGF0YV9mcmFtZV9jb3VudCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWJtaXRfZHRpID0gMCwgYWN0aXZlX2J1Zl9pbl91cmJzOwogCXU4IGRvbmUgPSAwOwogCiAJLyogZnJlZSB0aGUgc2cgaWYgaXQgd2FzIHVzZWQuICovCkBAIC0yMzk5LDE5ICsyNjAwLDIwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAl3YSA9IHhmZXItPndhOwogCWRldiA9ICZ3YS0+dXNiX2lmYWNlLT5kZXY7CisJLS0od2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CisJYWN0aXZlX2J1Zl9pbl91cmJzID0gd2EtPmFjdGl2ZV9idWZfaW5fdXJiczsKIAogCWlmICh1c2JfcGlwZWlzb2MoeGZlci0+dXJiLT5waXBlKSkgeworCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvX2ZyYW1lX2Rlc2MgPQorCQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJaW50CXNlZ19pbmRleDsKKwogCQkvKgotCQkgKiBGaW5kIHRoZSBuZXh0IGlzb2MgZnJhbWUgd2l0aCBkYXRhLiAgQmFpbCBvdXQgYWZ0ZXIKLQkJICogaXNvY19kYXRhX2ZyYW1lX2NvdW50ID4gMSBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsKLQkJICogdGhlIGVudGlyZSBmcmFtZSBhcnJheS4gIFdlIGp1c3QgbmVlZCB0byBrbm93IGlmCi0JCSAqIGlzb2NfZGF0YV9mcmFtZV9jb3VudCBpcyAwLCAxLCBvciA+MS4KKwkJICogRmluZCB0aGUgbmV4dCBpc29jIGZyYW1lIHdpdGggZGF0YSBhbmQgY291bnQgaG93IG1hbnkKKwkJICogZnJhbWVzIHdpdGggZGF0YSByZW1haW4uCiAJCSAqLwotCQlzZWdfaW5kZXggPSBzZWctPmlzb2NfZnJhbWVfaW5kZXggKyAxOwotCQl3aGlsZSAoKHNlZ19pbmRleCA8IHNlZy0+aXNvY19mcmFtZV9jb3VudCkKLQkJCSYmIChpc29jX2RhdGFfZnJhbWVfY291bnQgPD0gMSkpIHsKLQkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9Ci0JCQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJc2VnX2luZGV4ID0gc2VnLT5pc29jX2ZyYW1lX2luZGV4OworCQl3aGlsZSAoc2VnX2luZGV4IDwgc2VnLT5pc29jX2ZyYW1lX2NvdW50KSB7CiAJCQljb25zdCBpbnQgdXJiX2ZyYW1lX2luZGV4ID0KIAkJCQlzZWctPmlzb2NfZnJhbWVfb2Zmc2V0ICsgc2VnX2luZGV4OwogCkBAIC0yNDMyLDI0ICsyNjM0LDM5IEBACiAKIAkJc2VnLT5yZXN1bHQgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlpZiAoaXNvY19kYXRhX2ZyYW1lX2NvdW50ID4gMCkgewotCQkJaW50IHJlc3VsdDsKLQkJCS8qIHN1Ym1pdCBhIHJlYWQgVVJCIGZvciB0aGUgZmlyc3QgZnJhbWUgd2l0aCBkYXRhLiAqLwotCQkJX193YV9wb3B1bGF0ZV9idWZfaW5fdXJiX2lzb2Mod2EsIHhmZXIsIHNlZywKLQkJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKyBzZWctPmlzb2NfZnJhbWVfb2Zmc2V0KTsKLQkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5idWZfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWludCByZXN1bHQsIHVyYl9mcmFtZV9jb3VudDsKKworCQkJLyogc3VibWl0IGEgcmVhZCBVUkIgZm9yIHRoZSBuZXh0IGZyYW1lIHdpdGggZGF0YS4gKi8KKwkJCXVyYl9mcmFtZV9jb3VudCA9IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHdhLCB1cmIsCisJCQkJIHhmZXIsIHNlZyk7CisJCQkvKiBhZHZhbmNlIGluZGV4IHRvIHN0YXJ0IG9mIG5leHQgcmVhZCBVUkIuICovCisJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKz0gdXJiX2ZyYW1lX2NvdW50OworCQkJKysod2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CisJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQktLSh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKIAkJCQlkZXZfZXJyKGRldiwgIkRUSSBFcnJvcjogQ291bGQgbm90IHN1Ym1pdCBidWYgaW4gVVJCICglZCkiLAogCQkJCQlyZXN1bHQpOwogCQkJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJCQl9Ci0JCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgd2UgYXJlIGluIHRoaXMgY2FsbGJhY2sgYW5kCisJCQkgKiBpc29jX2RhdGFfZnJhbWVfY291bnQgPiAwLCBpdCBtZWFucyB0aGF0IHRoZSBkdGlfdXJiCisJCQkgKiBzdWJtaXNzaW9uIHdhcyBkZWxheWVkIGluIHdhX2R0aV9jYi4gIE9uY2UKKwkJCSAqIHdlIHN1Ym1pdCB0aGUgbGFzdCBidWZfaW5fdXJiLCB3ZSBjYW4gc3VibWl0IHRoZQorCQkJICogZGVsYXllZCBkdGlfdXJiLgorCQkJICovCisJCQkgIHJlc3VibWl0X2R0aSA9IChpc29jX2RhdGFfZnJhbWVfY291bnQgPT0KKwkJCQkJCQl1cmJfZnJhbWVfY291bnQpOworCQl9IGVsc2UgaWYgKGFjdGl2ZV9idWZfaW5fdXJicyA9PSAwKSB7CiAJCQlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7Ci0JCQlzZWctPnN0YXR1cyA9IFdBX1NFR19ET05FOwotCQkJZGV2X2RiZyhkZXYsICJ4ZmVyICVwIyV1OiBkYXRhIGluIGRvbmUgKCV6dSBieXRlcylcbiIsCi0JCQkJeGZlciwgc2VnLT5pbmRleCwgc2VnLT5yZXN1bHQpOwotCQkJeGZlci0+c2Vnc19kb25lKys7CisJCQlkZXZfZGJnKGRldiwKKwkJCQkieGZlciAlcCAweCUwOFgjJXU6IGRhdGEgaW4gZG9uZSAoJXp1IGJ5dGVzKVxuIiwKKwkJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAorCQkJCXNlZy0+cmVzdWx0KTsKIAkJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJCWRvbmUgPSBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZSh4ZmVyLCBzZWcsCisJCQkJCVdBX1NFR19ET05FKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJCWlmIChkb25lKQpAQCAtMjQ2MSwzNyArMjY3OCw0NCBAQAogCWNhc2UgLUVOT0VOVDoJCS8qIGFzIGl0IHdhcyBkb25lIGJ5IHRoZSB3aG8gdW5saW5rZWQgdXMgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoJCS8qIE90aGVyIGVycm9ycyAuLi4gKi8KKwkJLyoKKwkJICogRXJyb3Igb24gZGF0YSBidWYgcmVhZC4gIE9ubHkgcmVzdWJtaXQgRFRJIGlmIGl0IGhhc24ndAorCQkgKiBhbHJlYWR5IGJlZW4gZG9uZSBieSBwcmV2aW91c2x5IGhpdHRpbmcgdGhpcyBlcnJvciBvciBieSBhCisJCSAqIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJldmlvdXMgYnVmX2luX3VyYi4KKwkJICovCisJCXJlc3VibWl0X2R0aSA9IHdhLT5kdGlfc3RhdGUgIT0gV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlkZXZfZXJyKGRldiwgInhmZXIgJXAjJXU6IGRhdGEgaW4gZXJyb3IgJWRcbiIsCi0JCQkJeGZlciwgc2VnLT5pbmRleCwgdXJiLT5zdGF0dXMpOworCQkJZGV2X2VycihkZXYsICJ4ZmVyICVwIDB4JTA4WCMldTogZGF0YSBpbiBlcnJvciAlZFxuIiwKKwkJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAorCQkJCXVyYi0+c3RhdHVzKTsKIAkJaWYgKGVkY19pbmMoJndhLT5uZXBfZWRjLCBFRENfTUFYX0VSUk9SUywKIAkJCSAgICBFRENfRVJST1JfVElNRUZSQU1FKSl7CiAJCQlkZXZfZXJyKGRldiwgIkRUTzogVVJCIG1heCBhY2NlcHRhYmxlIGVycm9ycyAiCiAJCQkJImV4Y2VlZGVkLCByZXNldHRpbmcgZGV2aWNlXG4iKTsKIAkJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJCX0KLQkJc2VnLT5zdGF0dXMgPSBXQV9TRUdfRVJST1I7CiAJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKLQkJZG9uZSA9IF9fd2FfeGZlcl9pc19kb25lKHhmZXIpOworCQlpZiAoYWN0aXZlX2J1Zl9pbl91cmJzID09IDApCisJCQlkb25lID0gX193YV94ZmVyX21hcmtfc2VnX2FzX2RvbmUoeGZlciwgc2VnLAorCQkJCVdBX1NFR19FUlJPUik7CisJCWVsc2UKKwkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKIAkJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAkJaWYgKHJwaXBlX3JlYWR5KQogCQkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7CiAJfQotCS8qCi0JICogSWYgd2UgYXJlIGluIHRoaXMgY2FsbGJhY2sgYW5kIGlzb2NfZGF0YV9mcmFtZV9jb3VudCA+IDAsIGl0IG1lYW5zCi0JICogdGhhdCB0aGUgZHRpX3VyYiBzdWJtaXNzaW9uIHdhcyBkZWxheWVkIGluIHdhX2R0aV9jYi4gIE9uY2UKLQkgKiBpc29jX2RhdGFfZnJhbWVfY291bnQgZ2V0cyB0byAxLCB3ZSBjYW4gc3VibWl0IHRoZSBkZWZlcnJlZCBVUkIKLQkgKiBzaW5jZSB0aGUgbGFzdCBidWZfaW5fdXJiIHdhcyBqdXN0IHN1Ym1pdHRlZC4KLQkgKi8KLQlpZiAoaXNvY19kYXRhX2ZyYW1lX2NvdW50ID09IDEpIHsKLQkJaW50IHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5kdGlfdXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXN1Ym1pdF9kdGkpIHsKKwkJaW50IHJlc3VsdDsKKworCQl3YS0+ZHRpX3N0YXRlID0gV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HOworCisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5kdGlfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiRFRJIEVycm9yOiBDb3VsZCBub3Qgc3VibWl0IERUSSBVUkIgKCVkKVxuIiwKIAkJCQlyZXN1bHQpOwpAQCAtMjU2MSwxMSArMjc4NSwxNSBAQAogCQkJCQl4ZmVyX3Jlc3VsdC0+aGRyLmJOb3RpZnlUeXBlKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXVzYl9zdGF0dXMgPSB4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU3RhdHVzICYgMHgzZjsKLQkJCWlmICh1c2Jfc3RhdHVzID09IFdBX1hGRVJfU1RBVFVTX05PVF9GT1VORCkKLQkJCQkvKiB0YWtlbiBjYXJlIG9mIGFscmVhZHkgKi8KLQkJCQlicmVhazsKIAkJCXhmZXJfaWQgPSBsZTMyX3RvX2NwdSh4ZmVyX3Jlc3VsdC0+ZHdUcmFuc2ZlcklEKTsKKwkJCXVzYl9zdGF0dXMgPSB4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU3RhdHVzICYgMHgzZjsKKwkJCWlmICh1c2Jfc3RhdHVzID09IFdBX1hGRVJfU1RBVFVTX05PVF9GT1VORCkgeworCQkJCS8qIHRha2VuIGNhcmUgb2YgYWxyZWFkeSAqLworCQkJCWRldl9kYmcoZGV2LCAiJXM6IHhmZXIgMHglMDhYIyV1IG5vdCBmb3VuZC5cbiIsCisJCQkJCV9fZnVuY19fLCB4ZmVyX2lkLAorCQkJCQl4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU2VnbWVudCAmIDB4N2YpOworCQkJCWJyZWFrOworCQkJfQogCQkJeGZlciA9IHdhX3hmZXJfZ2V0X2J5X2lkKHdhLCB4ZmVyX2lkKTsKIAkJCWlmICh4ZmVyID09IE5VTEwpIHsKIAkJCQkvKiBGSVhNRTogdHJhbnNhY3Rpb24gbm90IGZvdW5kLiAqLwpAQCAtMjYxNCw2ICsyODQyLDU0IEBACiB9CiAKIC8qCisgKiBJbml0aWFsaXplIHRoZSBEVEkgVVJCIGZvciByZWFkaW5nIHRyYW5zZmVyIHJlc3VsdCBub3RpZmljYXRpb25zIGFuZCBhbHNvCisgKiB0aGUgYnVmZmVyLWluIFVSQiwgZm9yIHJlYWRpbmcgYnVmZmVycy4gVGhlbiB3ZSBqdXN0IHN1Ym1pdCB0aGUgRFRJIFVSQi4KKyAqLworaW50IHdhX2R0aV9zdGFydChzdHJ1Y3Qgd2FoYyAqd2EpCit7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkdGlfZXBkID0gd2EtPmR0aV9lcGQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJndhLT51c2JfaWZhY2UtPmRldjsKKwlpbnQgcmVzdWx0ID0gLUVOT01FTSwgaW5kZXg7CisKKwlpZiAod2EtPmR0aV91cmIgIT0gTlVMTCkJLyogRFRJIFVSQiBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkJZ290byBvdXQ7CisKKwl3YS0+ZHRpX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhLT5kdGlfdXJiID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBEVEkgVVJCXG4iKTsKKwkJZ290byBlcnJvcl9kdGlfdXJiX2FsbG9jOworCX0KKwl1c2JfZmlsbF9idWxrX3VyYigKKwkJd2EtPmR0aV91cmIsIHdhLT51c2JfZGV2LAorCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBkdGlfZXBkLT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJd2EtPmR0aV9idWYsIHdhLT5kdGlfYnVmX3NpemUsCisJCXdhX2R0aV9jYiwgd2EpOworCisJLyogaW5pdCB0aGUgYnVmIGluIFVSQnMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBXQV9NQVhfQlVGX0lOX1VSQlM7ICsraW5kZXgpIHsKKwkJdXNiX2ZpbGxfYnVsa191cmIoCisJCQkmKHdhLT5idWZfaW5fdXJic1tpbmRleF0pLCB3YS0+dXNiX2RldiwKKwkJCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwKKwkJCQkweDgwIHwgZHRpX2VwZC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQlOVUxMLCAwLCB3YV9idWZfaW5fY2IsIHdhKTsKKwl9CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIod2EtPmR0aV91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRFRJIEVycm9yOiBDb3VsZCBub3Qgc3VibWl0IERUSSBVUkIgKCVkKSByZXNldHRpbmdcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX2R0aV91cmJfc3VibWl0OworCX0KK291dDoKKwlyZXR1cm4gMDsKKworZXJyb3JfZHRpX3VyYl9zdWJtaXQ6CisJdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOworCXdhLT5kdGlfdXJiID0gTlVMTDsKK2Vycm9yX2R0aV91cmJfYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdhX2R0aV9zdGFydCk7CisvKgogICogVHJhbnNmZXIgY29tcGxldGUgbm90aWZpY2F0aW9uCiAgKgogICogQ2FsbGVkIGZyb20gdGhlIG5vdGlmLmMgY29kZS4gV2UgZ2V0IGEgbm90aWZpY2F0aW9uIG9uIEVQMiBzYXlpbmcKQEAgLTI2MjcsMTUgKzI5MDMsMTAgQEAKICAqIEZvbGxvdyB1cCBpbiB3YV9kdGlfY2IoKSwgYXMgdGhhdCdzIHdoZXJlIHRoZSB3aG9sZSBzdGF0ZQogICogbWFjaGluZSBzdGFydHMuCiAgKgotICogU28gaGVyZSB3ZSBqdXN0IGluaXRpYWxpemUgdGhlIERUSSBVUkIgZm9yIHJlYWRpbmcgdHJhbnNmZXIgcmVzdWx0Ci0gKiBub3RpZmljYXRpb25zIGFuZCBhbHNvIHRoZSBidWZmZXItaW4gVVJCLCBmb3IgcmVhZGluZyBidWZmZXJzLiBUaGVuCi0gKiB3ZSBqdXN0IHN1Ym1pdCB0aGUgRFRJIFVSQi4KLSAqCiAgKiBAd2Egc2hhbGwgYmUgcmVmZXJlbmNlZAogICovCiB2b2lkIHdhX2hhbmRsZV9ub3RpZl94ZmVyKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX25vdGlmX2hkciAqbm90aWZfaGRyKQogewotCWludCByZXN1bHQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJndhLT51c2JfaWZhY2UtPmRldjsKIAlzdHJ1Y3Qgd2Ffbm90aWZfeGZlciAqbm90aWZfeGZlcjsKIAljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmR0aV9lcGQgPSB3YS0+ZHRpX2VwZDsKQEAgLTI2NDksNDUgKzI5MjAsMTMgQEAKIAkJCW5vdGlmX3hmZXItPmJFbmRwb2ludCwgZHRpX2VwZC0+YkVuZHBvaW50QWRkcmVzcyk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWlmICh3YS0+ZHRpX3VyYiAhPSBOVUxMKQkvKiBEVEkgVVJCIGFscmVhZHkgc3RhcnRlZCAqLwotCQlnb3RvIG91dDsKIAotCXdhLT5kdGlfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAod2EtPmR0aV91cmIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIERUSSBVUkJcbiIpOwotCQlnb3RvIGVycm9yX2R0aV91cmJfYWxsb2M7Ci0JfQotCXVzYl9maWxsX2J1bGtfdXJiKAotCQl3YS0+ZHRpX3VyYiwgd2EtPnVzYl9kZXYsCi0JCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwgMHg4MCB8IG5vdGlmX3hmZXItPmJFbmRwb2ludCksCi0JCXdhLT5kdGlfYnVmLCB3YS0+ZHRpX2J1Zl9zaXplLAotCQl3YV9kdGlfY2IsIHdhKTsKKwkvKiBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBEVEkgZXAgcHJvY2Vzc2luZy4gKi8KKwlpZiAod2FfZHRpX3N0YXJ0KHdhKSA8IDApCisJCWdvdG8gZXJyb3I7CiAKLQl3YS0+YnVmX2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdhLT5idWZfaW5fdXJiID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBCVUYtSU4gVVJCXG4iKTsKLQkJZ290byBlcnJvcl9idWZfaW5fdXJiX2FsbG9jOwotCX0KLQl1c2JfZmlsbF9idWxrX3VyYigKLQkJd2EtPmJ1Zl9pbl91cmIsIHdhLT51c2JfZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBub3RpZl94ZmVyLT5iRW5kcG9pbnQpLAotCQlOVUxMLCAwLCB3YV9idWZfaW5fY2IsIHdhKTsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3YS0+ZHRpX3VyYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJEVEkgRXJyb3I6IENvdWxkIG5vdCBzdWJtaXQgRFRJIFVSQiAoJWQpIHJlc2V0dGluZ1xuIiwKLQkJCXJlc3VsdCk7Ci0JCWdvdG8gZXJyb3JfZHRpX3VyYl9zdWJtaXQ7Ci0JfQotb3V0OgogCXJldHVybjsKIAotZXJyb3JfZHRpX3VyYl9zdWJtaXQ6Ci0JdXNiX3B1dF91cmIod2EtPmJ1Zl9pbl91cmIpOwotCXdhLT5idWZfaW5fdXJiID0gTlVMTDsKLWVycm9yX2J1Zl9pbl91cmJfYWxsb2M6Ci0JdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOwotCXdhLT5kdGlfdXJiID0gTlVMTDsKLWVycm9yX2R0aV91cmJfYWxsb2M6CiBlcnJvcjoKIAl3YV9yZXNldF9hbGwod2EpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jCmluZGV4IDIxMDM1NzYuLjlkZDQ5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ludHJzLmMKQEAgLTQ4MiwxNSArNDgyLDE5IEBACiAJCWZvciAoaSA9IDA7IGkgPCBudmVjOyBpKyspCiAJCQl2ZGV2LT5tc2l4W2ldLmVudHJ5ID0gaTsKIAotCQlyZXQgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgdmRldi0+bXNpeCwgbnZlYyk7Ci0JCWlmIChyZXQpIHsKKwkJcmV0ID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIHZkZXYtPm1zaXgsIDEsIG52ZWMpOworCQlpZiAocmV0IDwgbnZlYykgeworCQkJaWYgKHJldCA+IDApCisJCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKIAkJCWtmcmVlKHZkZXYtPm1zaXgpOwogCQkJa2ZyZWUodmRldi0+Y3R4KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9IGVsc2UgewotCQlyZXQgPSBwY2lfZW5hYmxlX21zaV9ibG9jayhwZGV2LCBudmVjKTsKLQkJaWYgKHJldCkgeworCQlyZXQgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCBudmVjKTsKKwkJaWYgKHJldCA8IG52ZWMpIHsKKwkJCWlmIChyZXQgPiAwKQorCQkJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAkJCWtmcmVlKHZkZXYtPmN0eCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCBhMGZhNWRlLi5lMWUyMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTUwNSw5ICs1MDUsMTMgQEAKIAkJCXIgPSAtRU5PQlVGUzsKIAkJCWdvdG8gZXJyOwogCQl9Ci0JCWQgPSB2aG9zdF9nZXRfdnFfZGVzYyh2cS0+ZGV2LCB2cSwgdnEtPmlvdiArIHNlZywKKwkJciA9IHZob3N0X2dldF92cV9kZXNjKHZxLT5kZXYsIHZxLCB2cS0+aW92ICsgc2VnLAogCQkJCSAgICAgIEFSUkFZX1NJWkUodnEtPmlvdikgLSBzZWcsICZvdXQsCiAJCQkJICAgICAgJmluLCBsb2csIGxvZ19udW0pOworCQlpZiAodW5saWtlbHkociA8IDApKQorCQkJZ290byBlcnI7CisKKwkJZCA9IHI7CiAJCWlmIChkID09IHZxLT5udW0pIHsKIAkJCXIgPSAwOwogCQkJZ290byBlcnI7CkBAIC01MzIsNiArNTM2LDEyIEBACiAJKmlvdmNvdW50ID0gc2VnOwogCWlmICh1bmxpa2VseShsb2cpKQogCQkqbG9nX251bSA9IG5sb2dzOworCisJLyogRGV0ZWN0IG92ZXJydW4gKi8KKwlpZiAodW5saWtlbHkoZGF0YWxlbiA+IDApKSB7CisJCXIgPSBVSU9fTUFYSU9WICsgMTsKKwkJZ290byBlcnI7CisJfQogCXJldHVybiBoZWFkY291bnQ7CiBlcnI6CiAJdmhvc3RfZGlzY2FyZF92cV9kZXNjKHZxLCBoZWFkY291bnQpOwpAQCAtNTg3LDYgKzU5NywxNCBAQAogCQkvKiBPbiBlcnJvciwgc3RvcCBoYW5kbGluZyB1bnRpbCB0aGUgbmV4dCBraWNrLiAqLwogCQlpZiAodW5saWtlbHkoaGVhZGNvdW50IDwgMCkpCiAJCQlicmVhazsKKwkJLyogT24gb3ZlcnJ1biwgdHJ1bmNhdGUgYW5kIGRpc2NhcmQgKi8KKwkJaWYgKHVubGlrZWx5KGhlYWRjb3VudCA+IFVJT19NQVhJT1YpKSB7CisJCQltc2cubXNnX2lvdmxlbiA9IDE7CisJCQllcnIgPSBzb2NrLT5vcHMtPnJlY3Ztc2coTlVMTCwgc29jaywgJm1zZywKKwkJCQkJCSAxLCBNU0dfRE9OVFdBSVQgfCBNU0dfVFJVTkMpOworCQkJcHJfZGVidWcoIkRpc2NhcmRlZCByeCBwYWNrZXQ6IGxlbiAlemRcbiIsIHNvY2tfbGVuKTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCS8qIE9LLCBub3cgd2UgbmVlZCB0byBrbm93IGFib3V0IGFkZGVkIGRlc2NyaXB0b3JzLiAqLwogCQlpZiAoIWhlYWRjb3VudCkgewogCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSkpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggOTdhOGYzYS4uYjRiMjA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtNzk2LDE4ICs3OTYsOSBAQAogCSAgQXMgdGhpcyBjYXJkIHRlY2hub2xvZ3kgaXMgYXQgbGVhc3QgMjUgeWVhcnMgb2xkLAogCSAgbW9zdCBwZW9wbGUgd2lsbCBhbnN3ZXIgTiBoZXJlLgogCi1jb25maWcgRkJfU0dJVlcKLQl0cmlzdGF0ZSAiU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkIgJiYgWDg2X1ZJU1dTCi0Jc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAotCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKLQlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCWhlbHAKLQkgIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3VwcG9ydCBmb3IgZnJhbWVidWZmZXIgZ3JhcGhpY3MuCi0KIGNvbmZpZyBGQl9HQkUKIAlib29sICJTR0kgR3JhcGhpY3MgQmFja2VuZCBmcmFtZSBidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIChTR0lfSVAzMiB8fCBYODZfVklTV1MpCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBTR0lfSVAzMgogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IDA4ZDZhNGEuLjFiZTI2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQpAQCAtNzUsNyArNzUsNiBAQAogb2JqLSQoQ09ORklHX0ZCX1A5MTAwKSAgICAgICAgICAgICs9IHA5MTAwLm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfVENYKSAgICAgICAgICAgICAgKz0gdGN4Lm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfTEVPKSAgICAgICAgICAgICAgKz0gbGVvLm8gc2J1c2xpYi5vCi1vYmotJChDT05GSUdfRkJfU0dJVlcpICAgICAgICAgICAgKz0gc2dpdndmYi5vCiBvYmotJChDT05GSUdfRkJfQUNPUk4pICAgICAgICAgICAgKz0gYWNvcm5mYi5vCiBvYmotJChDT05GSUdfRkJfQVRBUkkpICAgICAgICAgICAgKz0gYXRhZmIubyBjMnBfaXBsYW4yLm8gYXRhZmJfbWZiLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YWZiX2lwbGFuMnAyLm8gYXRhZmJfaXBsYW4ycDQubyBhdGFmYl9pcGxhbjJwOC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKaW5kZXggNGM3Y2IzNi4uM2VjNjVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nYmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwpAQCAtNDUsMTAgKzQ1LDYgQEAKICNkZWZpbmUgR0JFX0JBU0UJMHgxNjAwMDAwMCAvKiBTR0kgTzIgKi8KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl9WSVNXUwotI2RlZmluZSBHQkVfQkFTRQkweGQwMDAwMDAwIC8qIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gKi8KLSNlbmRpZgotCiAvKiBtYWNybyBmb3IgZmFzdGVzdCB3cml0ZS10aG91Z2ggYWNjZXNzIHRvIHRoZSBmcmFtZWJ1ZmZlciAqLwogI2lmZGVmIENPTkZJR19NSVBTCiAjaWZkZWYgQ09ORklHX0NQVV9SMTAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaHlwZXJ2X2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2h5cGVydl9mYi5jCmluZGV4IDEzMDcwOGYuLmUyMzM5MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaHlwZXJ2X2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9oeXBlcnZfZmIuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCiAjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKQEAgLTIxMiw2ICsyMTMsNyBAQAogCiBzdHJ1Y3QgaHZmYl9wYXIgewogCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCByZXNvdXJjZSBtZW07CiAJYm9vbCBmYl9yZWFkeTsgLyogZmIgZGV2aWNlIGlzIHJlYWR5ICovCiAJc3RydWN0IGNvbXBsZXRpb24gd2FpdDsKIAl1MzIgc3ludGh2aWRfdmVyc2lvbjsKQEAgLTQ2MCwxMyArNDYyLDEzIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKHBhci0+c3ludGh2aWRfdmVyc2lvbiA9PSBTWU5USFZJRF9WRVJTSU9OX1dJTjcpIHsKKwlpZiAocGFyLT5zeW50aHZpZF92ZXJzaW9uID09IFNZTlRIVklEX1ZFUlNJT05fV0lONykKIAkJc2NyZWVuX2RlcHRoID0gU1lOVEhWSURfREVQVEhfV0lONzsKLQkJc2NyZWVuX2ZiX3NpemUgPSBTWU5USFZJRF9GQl9TSVpFX1dJTjc7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXNjcmVlbl9kZXB0aCA9IFNZTlRIVklEX0RFUFRIX1dJTjg7Ci0JCXNjcmVlbl9mYl9zaXplID0gU1lOVEhWSURfRkJfU0laRV9XSU44OwotCX0KKworCXNjcmVlbl9mYl9zaXplID0gaGRldi0+Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuCisJCQkJbW1pb19tZWdhYnl0ZXMgKiAxMDI0ICogMTAyNDsKIAogCXJldHVybiAwOwogCkBAIC02MjcsMjYgKzYyOSw0NiBAQAogLyogR2V0IGZyYW1lYnVmZmVyIG1lbW9yeSBmcm9tIEh5cGVyLVYgdmlkZW8gcGNpIHNwYWNlICovCiBzdGF0aWMgaW50IGh2ZmJfZ2V0bWVtKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXVsb25nIGZiX3BoeXM7CisJc3RydWN0IGh2ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKmZiX3ZpcnQ7CisJaW50IGdlbjJ2bSA9IGVmaV9lbmFibGVkKEVGSV9CT09UKTsKKwlpbnQgcmV0OwogCi0JcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfTUlDUk9TT0ZULAorCXBhci0+bWVtLm5hbWUgPSBLQlVJTERfTU9ETkFNRTsKKwlwYXItPm1lbS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCWlmIChnZW4ydm0pIHsKKwkJcmV0ID0gYWxsb2NhdGVfcmVzb3VyY2UoJmh5cGVydl9tbWlvLCAmcGFyLT5tZW0sCisJCQkJCXNjcmVlbl9mYl9zaXplLAorCQkJCQkwLCAtMSwKKwkJCQkJc2NyZWVuX2ZiX3NpemUsCisJCQkJCU5VTEwsIE5VTEwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGZyYW1lYnVmZmVyIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX01JQ1JPU09GVCwKIAkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSFlQRVJWX1ZJREVPLCBOVUxMKTsKLQlpZiAoIXBkZXYpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gZmluZCBQQ0kgSHlwZXItViB2aWRlb1xuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlpZiAoIXBkZXYpIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGZpbmQgUENJIEh5cGVyLVYgdmlkZW9cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkgfHwKKwkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBzY3JlZW5fZmJfc2l6ZSkKKwkJCWdvdG8gZXJyMTsKKworCQlwYXItPm1lbS5lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOworCQlwYXItPm1lbS5zdGFydCA9IHBhci0+bWVtLmVuZCAtIHNjcmVlbl9mYl9zaXplICsgMTsKKwkJcmV0ID0gcmVxdWVzdF9yZXNvdXJjZSgmcGRldi0+cmVzb3VyY2VbMF0sICZwYXItPm1lbSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJVbmFibGUgdG8gcmVxdWVzdCBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJZ290byBlcnIxOworCQl9CiAJfQogCi0JaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pIHx8Ci0JICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBzY3JlZW5fZmJfc2l6ZSkKLQkJZ290byBlcnIxOwotCi0JZmJfcGh5cyA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCkgLSBzY3JlZW5fZmJfc2l6ZSArIDE7Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZmJfcGh5cywgc2NyZWVuX2ZiX3NpemUsIEtCVUlMRF9NT0ROQU1FKSkKLQkJZ290byBlcnIxOwotCi0JZmJfdmlydCA9IGlvcmVtYXAoZmJfcGh5cywgc2NyZWVuX2ZiX3NpemUpOworCWZiX3ZpcnQgPSBpb3JlbWFwKHBhci0+bWVtLnN0YXJ0LCBzY3JlZW5fZmJfc2l6ZSk7CiAJaWYgKCFmYl92aXJ0KQogCQlnb3RvIGVycjI7CiAKQEAgLTY1NCwzMCArNjc2LDQ0IEBACiAJaWYgKCFpbmZvLT5hcGVydHVyZXMpCiAJCWdvdG8gZXJyMzsKIAotCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0JaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYl9waHlzOworCWlmIChnZW4ydm0pIHsKKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSA9IHNjcmVlbl9pbmZvLmxmYl9iYXNlOworCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gc2NyZWVuX2luZm8ubGZiX3NpemU7CisJCXJlbW92ZV9jb25mbGljdGluZ19mcmFtZWJ1ZmZlcnMoaW5mby0+YXBlcnR1cmVzLAorCQkJCQkJS0JVSUxEX01PRE5BTUUsIGZhbHNlKTsKKwl9IGVsc2UgeworCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwl9CisKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IHBhci0+bWVtLnN0YXJ0OwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IHNjcmVlbl9mYl9zaXplOwogCWluZm8tPnNjcmVlbl9iYXNlID0gZmJfdmlydDsKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNjcmVlbl9mYl9zaXplOwogCi0JcGNpX2Rldl9wdXQocGRldik7CisJaWYgKCFnZW4ydm0pCisJCXBjaV9kZXZfcHV0KHBkZXYpOworCiAJcmV0dXJuIDA7CiAKIGVycjM6CiAJaW91bm1hcChmYl92aXJ0KTsKIGVycjI6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGZiX3BoeXMsIHNjcmVlbl9mYl9zaXplKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZwYXItPm1lbSk7CiBlcnIxOgotCXBjaV9kZXZfcHV0KHBkZXYpOworCWlmICghZ2VuMnZtKQorCQlwY2lfZGV2X3B1dChwZGV2KTsKKwogCXJldHVybiAtRU5PTUVNOwogfQogCiAvKiBSZWxlYXNlIHRoZSBmcmFtZWJ1ZmZlciAqLwogc3RhdGljIHZvaWQgaHZmYl9wdXRtZW0oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IGh2ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIHNjcmVlbl9mYl9zaXplKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZwYXItPm1lbSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwppbmRleCAzOWFjNDllLi4wMDM3MTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwpAQCAtNTQsNyArNTQsNyBAQAogCiBjb25maWcgTE9HT19TR0lfQ0xVVDIyNAogCWJvb2wgIjIyNC1jb2xvciBTR0kgTGludXggbG9nbyIKLQlkZXBlbmRzIG9uIFNHSV9JUDIyIHx8IFNHSV9JUDI3IHx8IFNHSV9JUDMyIHx8IFg4Nl9WSVNXUworCWRlcGVuZHMgb24gU0dJX0lQMjIgfHwgU0dJX0lQMjcgfHwgU0dJX0lQMzIKIAlkZWZhdWx0IHkKIAogY29uZmlnIExPR09fU1VOX0NMVVQyMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jCmluZGV4IGI2NzBjYmQuLjk0MGNkMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ28uYwpAQCAtODEsNyArODEsNyBAQAogCQlsb2dvID0gJmxvZ29fcGFyaXNjX2NsdXQyMjQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTE9HT19TR0lfQ0xVVDIyNAotCQkvKiBTR0kgTGludXggbG9nbyBvbiBNSVBTL01JUFM2NCBhbmQgVklTV1MgKi8KKwkJLyogU0dJIExpbnV4IGxvZ28gb24gTUlQUy9NSVBTNjQgKi8KIAkJbG9nbyA9ICZsb2dvX3NnaV9jbHV0MjI0OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0xPR09fU1VOX0NMVVQyMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jIGIvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNzRkMDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODkgKzAsMCBAQAotLyoKLSAqICBsaW51eC9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyAtLSBTR0kgREJFIGZyYW1lIGJ1ZmZlciBkZXZpY2UKLSAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogICAgICBKZWZmcmV5IE5ld3F1aXN0LCBuZXdxdWlzdEBlbmdyLnNnaS5zb20KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbXRyci5oPgotI2luY2x1ZGUgPGFzbS92aXN3cy9zZ2l2dy5oPgotCi0jZGVmaW5lIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKLSNkZWZpbmUgREJFX1JFR19CQVNFIHBhci0+cmVncwotI2luY2x1ZGUgPHZpZGVvL3NnaXZ3Lmg+Ci0KLXN0cnVjdCBzZ2l2d19wYXIgewotCXN0cnVjdCBhc3JlZ3MgKnJlZ3M7Ci0JdTMyIGNtYXBfZmlmbzsKLQl1X2xvbmcgdGltaW5nX251bTsKLX07Ci0KLSNkZWZpbmUgRkxBVFBBTkVMX1NHSV8xNjAwU1cJNQotCi0vKgotICogIFJBTSB3ZSByZXNlcnZlIGZvciB0aGUgZnJhbWUgYnVmZmVyLiBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gc2NyZWVuCi0gKiAgc2l6ZQotICoKLSAqICBUaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGFzIGEgbW9kdWxlCi0gKi8KLQotc3RhdGljIGludCB5cGFuID0gMDsKLXN0YXRpYyBpbnQgeXdyYXAgPSAwOwotCi1zdGF0aWMgaW50IGZsYXRwYW5lbF9pZCA9IC0xOwotCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHNnaXZ3ZmJfZml4ID0gewotCS5pZAkJPSAiU0dJIFZpcyBXUyBGQiIsCi0JLnR5cGUJCT0gRkJfVFlQRV9QQUNLRURfUElYRUxTLAotICAgICAgICAudmlzdWFsCQk9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiwKLQkubW1pb19zdGFydAk9IERCRV9SRUdfUEhZUywKLQkubW1pb19sZW4JPSBEQkVfUkVHX1NJWkUsCi0gICAgICAgIC5hY2NlbAkJPSBGQl9BQ0NFTF9OT05FLAotCS5saW5lX2xlbmd0aAk9IDY0MCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc2dpdndmYl92YXIgPSB7Ci0JLyogNjQweDQ4MCwgOCBicHAgKi8KLQkueHJlcwkJPSA2NDAsCi0JLnlyZXMJCT0gNDgwLAotCS54cmVzX3ZpcnR1YWwJPSA2NDAsCi0JLnlyZXNfdmlydHVhbAk9IDQ4MCwKLQkuYml0c19wZXJfcGl4ZWwJPSA4LAotCS5yZWQJCT0geyAwLCA4LCAwIH0sCi0JLmdyZWVuCQk9IHsgMCwgOCwgMCB9LAotCS5ibHVlCQk9IHsgMCwgOCwgMCB9LAotCS5oZWlnaHQJCT0gLTEsCi0JLndpZHRoCQk9IC0xLAotCS5waXhjbG9jawk9IDIwMDAwLAotCS5sZWZ0X21hcmdpbgk9IDY0LAotCS5yaWdodF9tYXJnaW4JPSA2NCwKLQkudXBwZXJfbWFyZ2luCT0gMzIsCi0JLmxvd2VyX21hcmdpbgk9IDMyLAotCS5oc3luY19sZW4JPSA2NCwKLQkudnN5bmNfbGVuCT0gMiwKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAotfTsKLQotc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBzZ2l2d2ZiX3ZhcjE2MDBzdyA9IHsKLQkvKiAxNjAweDEwMjQsIDggYnBwICovCi0JLnhyZXMJCT0gMTYwMCwKLQkueXJlcwkJPSAxMDI0LAotCS54cmVzX3ZpcnR1YWwJPSAxNjAwLAotCS55cmVzX3ZpcnR1YWwJPSAxMDI0LAotCS5iaXRzX3Blcl9waXhlbAk9IDgsCi0JLnJlZAkJPSB7IDAsIDgsIDAgfSwKLQkuZ3JlZW4JCT0geyAwLCA4LCAwIH0sCi0JLmJsdWUJCT0geyAwLCA4LCAwIH0sCi0JLmhlaWdodAkJPSAtMSwKLQkud2lkdGgJCT0gLTEsCi0JLnBpeGNsb2NrCT0gOTM1MywKLQkubGVmdF9tYXJnaW4JPSAyMCwKLQkucmlnaHRfbWFyZ2luCT0gMzAsCi0JLnVwcGVyX21hcmdpbgk9IDM3LAotCS5sb3dlcl9tYXJnaW4JPSAzLAotCS5oc3luY19sZW4JPSAyMCwKLQkudnN5bmNfbGVuCT0gMywKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAotfTsKLQotLyoKLSAqICBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQKLSAqLwotaW50IHNnaXZ3ZmJfaW5pdCh2b2lkKTsKLQotc3RhdGljIGludCBzZ2l2d2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKLQkJCSAgICAgdV9pbnQgYmx1ZSwgdV9pbnQgdHJhbnNwLAotCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IHNnaXZ3ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLQotc3RhdGljIHN0cnVjdCBmYl9vcHMgc2dpdndmYl9vcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5mYl9jaGVja192YXIJPSBzZ2l2d2ZiX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3Bhcgk9IHNnaXZ3ZmJfc2V0X3BhciwKLQkuZmJfc2V0Y29scmVnCT0gc2dpdndmYl9zZXRjb2xyZWcsCi0JLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKLQkuZmJfbW1hcAk9IHNnaXZ3ZmJfbW1hcCwKLX07Ci0KLS8qCi0gKiAgSW50ZXJuYWwgcm91dGluZXMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnl0ZXNfcGVyX3BpeGVsKGludCBicHApCi17Ci0Jc3dpdGNoIChicHApIHsKLQkJY2FzZSA4OgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgMTY6Ci0JCQlyZXR1cm4gMjsKLQkJY2FzZSAzMjoKLQkJCXJldHVybiA0OwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAic2dpdndmYjogdW5zdXBwb3J0ZWQgYnBwICVkXG4iLCBicHApOwotCQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbGluZV9sZW5ndGgoaW50IHhyZXNfdmlydHVhbCwgaW50IGJwcCkKLXsKLQlyZXR1cm4gKHhyZXNfdmlydHVhbCAqIGJ5dGVzX3Blcl9waXhlbChicHApKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOglkYmVfVHVybk9mZkRtYQotICogUGFyYW1ldGVyczoJKE5vbmUpCi0gKiBEZXNjcmlwdGlvbjoJVGhpcyBzaG91bGQgdHVybiBvZmYgdGhlIG1vbml0b3IgYW5kIGRiZS4gIFRoaXMgaXMgdXNlZAotICogICAgICAgICAgICAgIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gdGhlIHNlcmlhbCBjb25zb2xlIGFuZCB0aGUgZ3JhcGhpY3MKLSAqICAgICAgICAgICAgICBjb25zb2xlLgotICovCi0KLXN0YXRpYyB2b2lkIGRiZV9UdXJuT2ZmRG1hKHN0cnVjdCBzZ2l2d19wYXIgKnBhcikKLXsKLQl1bnNpZ25lZCBpbnQgcmVhZFZhbDsKLQlpbnQgaTsKLQotCS8vIENoZWNrIHRvIHNlZSBpZiB0aGluZ3MgYXJlIGFscmVhZHkgdHVybmVkIG9mZjoKLQkvLyAxKSBDaGVjayB0byBzZWUgaWYgZGJlIGlzIG5vdCB1c2luZyB0aGUgaW50ZXJuYWwgZG90Y2xvY2suCi0JLy8gMikgQ2hlY2sgdG8gc2VlIGlmIHRoZSB4eSBjb3VudGVyIGluIGRiZSBpcyBhbHJlYWR5IG9mZi4KLQotCURCRV9HRVRSRUcoY3RybHN0YXQsIHJlYWRWYWwpOwotCWlmIChHRVRfREJFX0ZJRUxEKENUUkxTVEFULCBQQ0xLU0VMLCByZWFkVmFsKSA8IDIpCi0JCXJldHVybjsKLQotCURCRV9HRVRSRUcodnRfeHksIHJlYWRWYWwpOwotCWlmIChHRVRfREJFX0ZJRUxEKFZUX1hZLCBWVF9GUkVFWkUsIHJlYWRWYWwpID09IDEpCi0JCXJldHVybjsKLQotCS8vIE90aGVyd2lzZSwgdHVybiBvZmYgZGJlCi0KLQlEQkVfR0VUUkVHKG92cl9jb250cm9sLCByZWFkVmFsKTsKLQlTRVRfREJFX0ZJRUxEKE9WUl9DT05UUk9MLCBPVlJfRE1BX0VOQUJMRSwgcmVhZFZhbCwgMCk7Ci0JREJFX1NFVFJFRyhvdnJfY29udHJvbCwgcmVhZFZhbCk7Ci0JdWRlbGF5KDEwMDApOwotCURCRV9HRVRSRUcoZnJtX2NvbnRyb2wsIHJlYWRWYWwpOwotCVNFVF9EQkVfRklFTEQoRlJNX0NPTlRST0wsIEZSTV9ETUFfRU5BQkxFLCByZWFkVmFsLCAwKTsKLQlEQkVfU0VUUkVHKGZybV9jb250cm9sLCByZWFkVmFsKTsKLQl1ZGVsYXkoMTAwMCk7Ci0JREJFX0dFVFJFRyhkaWRfY29udHJvbCwgcmVhZFZhbCk7Ci0JU0VUX0RCRV9GSUVMRChESURfQ09OVFJPTCwgRElEX0RNQV9FTkFCTEUsIHJlYWRWYWwsIDApOwotCURCRV9TRVRSRUcoZGlkX2NvbnRyb2wsIHJlYWRWYWwpOwotCXVkZWxheSgxMDAwKTsKLQotCS8vIFhYWCBIQUNLOgotCS8vCi0JLy8gICAgVGhpcyB3YXMgbmVjZXNzYXJ5IGZvciBHQkUtLXdlIGhhZCB0byB3YWl0IHRocm91Z2ggdHdvCi0JLy8gICAgdmVydGljYWwgcmV0cmFjZSBwZXJpb2RzIGJlZm9yZSB0aGUgcGl4ZWwgRE1BIHdhcwotCS8vICAgIHR1cm5lZCBvZmYgZm9yIHN1cmUuICBJJ3ZlIGxlZnQgdGhpcyBpbiBmb3Igbm93LCBpbgotCS8vICAgIGNhc2UgZGJlIG5lZWRzIGl0LgotCi0JZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLQkJREJFX0dFVFJFRyhmcm1faW5od2N0cmwsIHJlYWRWYWwpOwotCQlpZiAoR0VUX0RCRV9GSUVMRChGUk1fSU5IV0NUUkwsIEZSTV9ETUFfRU5BQkxFLCByZWFkVmFsKSA9PQotCQkgICAgMCkKLQkJCXVkZWxheSgxMCk7Ci0JCWVsc2UgewotCQkJREJFX0dFVFJFRyhvdnJfaW5od2N0cmwsIHJlYWRWYWwpOwotCQkJaWYgKEdFVF9EQkVfRklFTEQKLQkJCSAgICAoT1ZSX0lOSFdDVFJMLCBPVlJfRE1BX0VOQUJMRSwgcmVhZFZhbCkgPT0gMCkKLQkJCQl1ZGVsYXkoMTApOwotCQkJZWxzZSB7Ci0JCQkJREJFX0dFVFJFRyhkaWRfaW5od2N0cmwsIHJlYWRWYWwpOwotCQkJCWlmIChHRVRfREJFX0ZJRUxECi0JCQkJICAgIChESURfSU5IV0NUUkwsIERJRF9ETUFfRU5BQkxFLAotCQkJCSAgICAgcmVhZFZhbCkgPT0gMCkKLQkJCQkJdWRlbGF5KDEwKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogIFNldCB0aGUgVXNlciBEZWZpbmVkIFBhcnQgb2YgdGhlIERpc3BsYXkuIEFnYWluIGlmIHBhciB1c2UgaXQgdG8gZ2V0Ci0gKiAgcmVhbCB2aWRlbyBtb2RlLgotICovCi1zdGF0aWMgaW50IHNnaXZ3ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCAKLQkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNnaXZ3X3BhciAqcGFyID0gKHN0cnVjdCBzZ2l2d19wYXIgKilpbmZvLT5wYXI7Ci0Jc3RydWN0IGRiZV90aW1pbmdfaW5mbyAqdGltaW5nOwotCXVfbG9uZyBsaW5lX2xlbmd0aDsKLQl1X2xvbmcgbWluX21vZGU7Ci0JaW50IHJlcV9kb3Q7Ci0JaW50IHRlc3RfbW9kZTsKLQotCS8qCi0JICogIEZCX1ZNT0RFX0NPTlVQREFURSBhbmQgRkJfVk1PREVfU01PT1RIX1hQQU4gYXJlIGVxdWFsIQotCSAqICBhcyBGQl9WTU9ERV9TTU9PVEhfWFBBTiBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseQotCSAqLwotCi0JaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9DT05VUERBVEUpIHsKLQkJdmFyLT52bW9kZSB8PSBGQl9WTU9ERV9ZV1JBUDsKLQkJdmFyLT54b2Zmc2V0ID0gaW5mby0+dmFyLnhvZmZzZXQ7Ci0JCXZhci0+eW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwotCX0KLQotCS8qIFhYWCBGSVhNRSAtIGZvcmNpbmcgdmFyJ3MgKi8KLQl2YXItPnhvZmZzZXQgPSAwOwotCXZhci0+eW9mZnNldCA9IDA7Ci0KLQkvKiBMaW1pdCBicHAgdG8gOCwgMTYsIGFuZCAzMiAqLwotCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDgpCi0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSA4OwotCWVsc2UgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gMTYpCi0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKLQllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDMyKQotCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMzI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZhci0+Z3JheXNjYWxlID0gMDsJLyogTm8gZ3JheXNjYWxlIGZvciBub3cgKi8KLQotCS8qIGRldGVybWluZSB2YWxpZCByZXNvbHV0aW9uIGFuZCB0aW1pbmcgKi8KLQlmb3IgKG1pbl9tb2RlID0gMDsgbWluX21vZGUgPCBBUlJBWV9TSVpFKGRiZVZUaW1pbmdzKTsgbWluX21vZGUrKykgewotCQlpZiAoZGJlVlRpbWluZ3NbbWluX21vZGVdLndpZHRoID49IHZhci0+eHJlcyAmJgotCQkgICAgZGJlVlRpbWluZ3NbbWluX21vZGVdLmhlaWdodCA+PSB2YXItPnlyZXMpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAobWluX21vZGUgPT0gQVJSQVlfU0laRShkYmVWVGltaW5ncykpCi0JCXJldHVybiAtRUlOVkFMOwkvKiBSZXNvbHV0aW9uIHRvIGhpZ2ggKi8KLQotCS8qIFhYWCBGSVhNRSAtIHNob3VsZCB0cnkgdG8gcGljayBiZXN0IHJlZnJlc2ggcmF0ZSAqLwotCS8qIGZvciBub3csIHBpY2sgY2xvc2VzdCBkb3QtY2xvY2sgd2l0aGluIDNNSHogKi8KLQlyZXFfZG90ID0gUElDT1MyS0haKHZhci0+cGl4Y2xvY2spOwotCXByaW50ayhLRVJOX0lORk8gInNnaXZ3ZmI6IHJlcXVlc3RlZCBwaXhjbG9jaz0lZCBwcyAoJWQgS0h6KVxuIiwKLQkgICAgICAgdmFyLT5waXhjbG9jaywgcmVxX2RvdCk7Ci0JdGVzdF9tb2RlID0gbWluX21vZGU7Ci0Jd2hpbGUgKGRiZVZUaW1pbmdzW21pbl9tb2RlXS53aWR0aCA9PSBkYmVWVGltaW5nc1t0ZXN0X21vZGVdLndpZHRoKSB7Ci0JCWlmIChkYmVWVGltaW5nc1t0ZXN0X21vZGVdLmNmcmVxICsgMzAwMCA+IHJlcV9kb3QpCi0JCQlicmVhazsKLQkJdGVzdF9tb2RlKys7Ci0JfQotCWlmIChkYmVWVGltaW5nc1ttaW5fbW9kZV0ud2lkdGggIT0gZGJlVlRpbWluZ3NbdGVzdF9tb2RlXS53aWR0aCkKLQkJdGVzdF9tb2RlLS07Ci0JbWluX21vZGUgPSB0ZXN0X21vZGU7Ci0JdGltaW5nID0gJmRiZVZUaW1pbmdzW21pbl9tb2RlXTsKLQlwcmludGsoS0VSTl9JTkZPICJzZ2l2d2ZiOiBncmFudGVkIGRvdC1jbG9jaz0lZCBLSHpcbiIsIHRpbWluZy0+Y2ZyZXEpOwotCi0JLyogQWRqdXN0IHZpcnR1YWwgcmVzb2x1dGlvbiwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsIHx8ICgheXdyYXAgJiYgIXlwYW4pKQotCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKLQlpZiAodmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwgfHwgKCF5d3JhcCAmJiAheXBhbikpCi0JCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOwotCi0JLyoKLQkgKiAgTWVtb3J5IGxpbWl0Ci0JICovCi0JbGluZV9sZW5ndGggPSBnZXRfbGluZV9sZW5ndGgodmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCWlmIChsaW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsID4gc2dpdndmYl9tZW1fc2l6ZSkKLQkJcmV0dXJuIC1FTk9NRU07CS8qIFZpcnR1YWwgcmVzb2x1dGlvbiB0byBoaWdoICovCi0KLQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBsaW5lX2xlbmd0aDsKLQotCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgODoKLQkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKLQkJdmFyLT5yZWQubGVuZ3RoID0gODsKLQkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOwotCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQl2YXItPmJsdWUubGVuZ3RoID0gODsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoJCS8qIFJHQkEgNTU1MSAqLwotCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKLQkJdmFyLT5yZWQubGVuZ3RoID0gNTsKLQkJdmFyLT5ncmVlbi5vZmZzZXQgPSA2OwotCQl2YXItPmdyZWVuLmxlbmd0aCA9IDU7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAxOwotCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoJCS8qIFJHQiA4ODg4ICovCi0JCXZhci0+cmVkLm9mZnNldCA9IDA7Ci0JCXZhci0+cmVkLmxlbmd0aCA9IDg7Ci0JCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKLQkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwotCQl2YXItPmJsdWUub2Zmc2V0ID0gMTY7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAyNDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKLQkJYnJlYWs7Ci0JfQotCXZhci0+cmVkLm1zYl9yaWdodCA9IDA7Ci0JdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOwotCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOwotCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7Ci0KLQkvKiBzZXQgdmlkZW8gdGltaW5nIGluZm9ybWF0aW9uICovCi0JdmFyLT5waXhjbG9jayA9IEtIWjJQSUNPUyh0aW1pbmctPmNmcmVxKTsKLQl2YXItPmxlZnRfbWFyZ2luID0gdGltaW5nLT5odG90YWwgLSB0aW1pbmctPmhzeW5jX2VuZDsKLQl2YXItPnJpZ2h0X21hcmdpbiA9IHRpbWluZy0+aHN5bmNfc3RhcnQgLSB0aW1pbmctPndpZHRoOwotCXZhci0+dXBwZXJfbWFyZ2luID0gdGltaW5nLT52dG90YWwgLSB0aW1pbmctPnZzeW5jX2VuZDsKLQl2YXItPmxvd2VyX21hcmdpbiA9IHRpbWluZy0+dnN5bmNfc3RhcnQgLSB0aW1pbmctPmhlaWdodDsKLQl2YXItPmhzeW5jX2xlbiA9IHRpbWluZy0+aHN5bmNfZW5kIC0gdGltaW5nLT5oc3luY19zdGFydDsKLQl2YXItPnZzeW5jX2xlbiA9IHRpbWluZy0+dnN5bmNfZW5kIC0gdGltaW5nLT52c3luY19zdGFydDsKLQotCS8qIE91Y2guIFRoaXMgYnJlYWtzIHRoZSBydWxlcyBidXQgdGltaW5nX251bSBpcyBvbmx5IGltcG9ydGFudCBpZiB5b3UKLQkqIGNoYW5nZSBhIHZpZGVvIG1vZGUgKi8KLQlwYXItPnRpbWluZ19udW0gPSBtaW5fbW9kZTsKLQotCXByaW50ayhLRVJOX0lORk8gInNnaXZ3ZmI6IG5ldyB2aWRlbyBtb2RlIHhyZXM9JWQgeXJlcz0lZCBicHA9JWRcbiIsCi0JCXZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKLQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICB2eHJlcz0lZCB2eXJlcz0lZFxuIiwgdmFyLT54cmVzX3ZpcnR1YWwsCi0JCXZhci0+eXJlc192aXJ0dWFsKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBTZXR1cCBmbGF0cGFuZWwgcmVsYXRlZCByZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIHNnaXZ3ZmJfc2V0dXBfZmxhdHBhbmVsKHN0cnVjdCBzZ2l2d19wYXIgKnBhciwgc3RydWN0IGRiZV90aW1pbmdfaW5mbyAqY3VycmVudFRpbWluZykKLXsKLQlpbnQgZnBfd2lkLCBmcF9oZ3QsIGZwX3ZicywgZnBfdmJlOwotCXUzMiBvdXRwdXRWYWwgPSAwOwotCi0JU0VUX0RCRV9GSUVMRChWVF9GTEFHUywgSERSVl9JTlZFUlQsIG91dHB1dFZhbCwgCi0JCShjdXJyZW50VGltaW5nLT5mbGFncyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSA/IDAgOiAxKTsKLQlTRVRfREJFX0ZJRUxEKFZUX0ZMQUdTLCBWRFJWX0lOVkVSVCwgb3V0cHV0VmFsLCAKLQkJKGN1cnJlbnRUaW1pbmctPmZsYWdzICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSA/IDAgOiAxKTsKLQlEQkVfU0VUUkVHKHZ0X2ZsYWdzLCBvdXRwdXRWYWwpOwotCi0JLyogVHVybiBvbiB0aGUgZmxhdCBwYW5lbCAqLwotCXN3aXRjaCAoZmxhdHBhbmVsX2lkKSB7Ci0JCWNhc2UgRkxBVFBBTkVMX1NHSV8xNjAwU1c6Ci0JCQlmcF93aWQgPSAxNjAwOwotCQkJZnBfaGd0ID0gMTAyNDsKLQkJCWZwX3ZicyA9IDA7Ci0JCQlmcF92YmUgPSAxNjAwOwotCQkJY3VycmVudFRpbWluZy0+cGxsX20gPSA0OwotCQkJY3VycmVudFRpbWluZy0+cGxsX24gPSAxOwotCQkJY3VycmVudFRpbWluZy0+cGxsX3AgPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0gICAgICAJCQlmcF93aWQgPSBmcF9oZ3QgPSBmcF92YnMgPSBmcF92YmUgPSAweGZmZjsKLSAgCX0KLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUF9ERSwgRlBfREVfT04sIG91dHB1dFZhbCwgZnBfdmJzKTsKLQlTRVRfREJFX0ZJRUxEKEZQX0RFLCBGUF9ERV9PRkYsIG91dHB1dFZhbCwgZnBfdmJlKTsKLQlEQkVfU0VUUkVHKGZwX2RlLCBvdXRwdXRWYWwpOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUF9IRFJWLCBGUF9IRFJWX09GRiwgb3V0cHV0VmFsLCBmcF93aWQpOwotCURCRV9TRVRSRUcoZnBfaGRydiwgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoRlBfVkRSViwgRlBfVkRSVl9PTiwgb3V0cHV0VmFsLCAxKTsKLQlTRVRfREJFX0ZJRUxEKEZQX1ZEUlYsIEZQX1ZEUlZfT0ZGLCBvdXRwdXRWYWwsIGZwX2hndCArIDEpOwotCURCRV9TRVRSRUcoZnBfdmRydiwgb3V0cHV0VmFsKTsKLX0KLQotLyoKLSAqICBTZXQgdGhlIGhhcmR3YXJlIGFjY29yZGluZyB0byAncGFyJy4KLSAqLwotc3RhdGljIGludCBzZ2l2d2ZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNnaXZ3X3BhciAqcGFyID0gaW5mby0+cGFyOwotCWludCBpLCBqLCBodG1wLCB0ZW1wOwotCXUzMiByZWFkVmFsLCBvdXRwdXRWYWw7Ci0JaW50IHdob2xlVGlsZXNYLCBtYXhQaXhlbHNQZXJUaWxlWDsKLQlpbnQgZnJtV3JpdGUxLCBmcm1Xcml0ZTIsIGZybVdyaXRlM2I7Ci0Jc3RydWN0IGRiZV90aW1pbmdfaW5mbyAqY3VycmVudFRpbWluZzsgLyogQ3VycmVudCBWaWRlbyBUaW1pbmcgKi8KLQlpbnQgeHBtYXgsIHlwbWF4OwkvLyBNb25pdG9yIHJlc29sdXRpb24KLQlpbnQgYnl0ZXNQZXJQaXhlbDsJLy8gQnl0ZXMgcGVyIHBpeGVsCi0KLQljdXJyZW50VGltaW5nID0gJmRiZVZUaW1pbmdzW3Bhci0+dGltaW5nX251bV07Ci0JYnl0ZXNQZXJQaXhlbCA9IGJ5dGVzX3Blcl9waXhlbChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwotCXhwbWF4ID0gY3VycmVudFRpbWluZy0+d2lkdGg7Ci0JeXBtYXggPSBjdXJyZW50VGltaW5nLT5oZWlnaHQ7Ci0KLQkvKiBkYmVfSW5pdEdyYXBoaWNzQmFzZSgpOyAqLwotCS8qIFR1cm4gb24gZG90Y2xvY2sgUExMICovCi0JREJFX1NFVFJFRyhjdHJsc3RhdCwgMHgyMDAwMDAwMCk7Ci0KLQlkYmVfVHVybk9mZkRtYShwYXIpOwotCi0JLyogZGJlX0NhbGN1bGF0ZVNjcmVlblBhcmFtcygpOyAqLwotCW1heFBpeGVsc1BlclRpbGVYID0gNTEyIC8gYnl0ZXNQZXJQaXhlbDsKLQl3aG9sZVRpbGVzWCA9IHhwbWF4IC8gbWF4UGl4ZWxzUGVyVGlsZVg7Ci0JaWYgKHdob2xlVGlsZXNYICogbWF4UGl4ZWxzUGVyVGlsZVggPCB4cG1heCkKLQkJd2hvbGVUaWxlc1grKzsKLQotCXByaW50ayhLRVJOX0RFQlVHICJzZ2l2d2ZiOiBwaXhQZXJUaWxlPSVkIHdob2xlVGlsZXNYPSVkXG4iLAotCSAgICAgICBtYXhQaXhlbHNQZXJUaWxlWCwgd2hvbGVUaWxlc1gpOwotCi0JLyogZGJlX0luaXRHYW1tYU1hcCgpOyAqLwotCXVkZWxheSgxMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJREJFX0lTRVRSRUcoZ21hcCwgaSwgKGkgPDwgMjQpIHwgKGkgPDwgMTYpIHwgKGkgPDwgOCkpOwotCX0KLQotCS8qIGRiZV9UdXJuT24oKTsgKi8KLQlEQkVfR0VUUkVHKHZ0X3h5LCByZWFkVmFsKTsKLQlpZiAoR0VUX0RCRV9GSUVMRChWVF9YWSwgVlRfRlJFRVpFLCByZWFkVmFsKSA9PSAxKSB7Ci0JCURCRV9TRVRSRUcodnRfeHksIDB4MDAwMDAwMDApOwotCQl1ZGVsYXkoMSk7Ci0JfSBlbHNlCi0JCWRiZV9UdXJuT2ZmRG1hKHBhcik7Ci0KLQkvKiBkYmVfSW5pdGRiZSgpOyAqLwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKLQkJCURCRV9HRVRSRUcoY21fZmlmbywgcmVhZFZhbCk7Ci0JCQlpZiAocmVhZFZhbCAhPSAweDAwMDAwMDAwKQotCQkJCWJyZWFrOwotCQkJZWxzZQotCQkJCXVkZWxheSgxMCk7Ci0JCX0KLQotCQkvLyBEQkVfSVNFVFJFRyhjbWFwLCBpLCAweDAwMDAwMDAwKTsKLQkJREJFX0lTRVRSRUcoY21hcCwgaSwgKGkgPDwgOCkgfCAoaSA8PCAxNikgfCAoaSA8PCAyNCkpOwotCX0KLQotCS8qIGRiZV9Jbml0RnJhbWVidWZmZXIoKTsgKi8KLQlmcm1Xcml0ZTEgPSAwOwotCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX1dJRFRIX1RJTEUsIGZybVdyaXRlMSwKLQkJICAgICAgd2hvbGVUaWxlc1gpOwotCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX1JIUywgZnJtV3JpdGUxLCAwKTsKLQotCXN3aXRjaCAoYnl0ZXNQZXJQaXhlbCkgewotCWNhc2UgMToKLQkJU0VUX0RCRV9GSUVMRChGUk1fU0laRV9USUxFLCBGUk1fREVQVEgsIGZybVdyaXRlMSwKLQkJCSAgICAgIERCRV9GUk1fREVQVEhfOCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJU0VUX0RCRV9GSUVMRChGUk1fU0laRV9USUxFLCBGUk1fREVQVEgsIGZybVdyaXRlMSwKLQkJCSAgICAgIERCRV9GUk1fREVQVEhfMTYpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX0RFUFRILCBmcm1Xcml0ZTEsCi0JCQkgICAgICBEQkVfRlJNX0RFUFRIXzMyKTsKLQkJYnJlYWs7Ci0JfQotCi0JZnJtV3JpdGUyID0gMDsKLQlTRVRfREJFX0ZJRUxEKEZSTV9TSVpFX1BJWEVMLCBGQl9IRUlHSFRfUElYLCBmcm1Xcml0ZTIsIHlwbWF4KTsKLQotCS8vIFRlbGwgZGJlIGFib3V0IHRoZSBmcmFtZWJ1ZmZlciBsb2NhdGlvbiBhbmQgdHlwZQotCS8vIFhYWCBXaGF0IGZvcm1hdCBpcyB0aGUgRlJNX1RJTEVfUFRSPz8gIDY0SyBhbGlnbmVkIGFkZHJlc3M/Ci0JZnJtV3JpdGUzYiA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUk1fQ09OVFJPTCwgRlJNX1RJTEVfUFRSLCBmcm1Xcml0ZTNiLAotCQkgICAgICBzZ2l2d2ZiX21lbV9waHlzID4+IDkpOwotCVNFVF9EQkVfRklFTEQoRlJNX0NPTlRST0wsIEZSTV9ETUFfRU5BQkxFLCBmcm1Xcml0ZTNiLCAxKTsKLQlTRVRfREJFX0ZJRUxEKEZSTV9DT05UUk9MLCBGUk1fTElORUFSLCBmcm1Xcml0ZTNiLCAxKTsKLQotCS8qIEluaXRpYWxpemUgRElEcyAqLwotCi0Jb3V0cHV0VmFsID0gMDsKLQlzd2l0Y2ggKGJ5dGVzUGVyUGl4ZWwpIHsKLQljYXNlIDE6Ci0JCVNFVF9EQkVfRklFTEQoV0lELCBUWVAsIG91dHB1dFZhbCwgREJFX0NNT0RFX0k4KTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlTRVRfREJFX0ZJRUxEKFdJRCwgVFlQLCBvdXRwdXRWYWwsIERCRV9DTU9ERV9SR0JBNSk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJU0VUX0RCRV9GSUVMRChXSUQsIFRZUCwgb3V0cHV0VmFsLCBEQkVfQ01PREVfUkdCOCk7Ci0JCWJyZWFrOwotCX0KLQlTRVRfREJFX0ZJRUxEKFdJRCwgQlVGLCBvdXRwdXRWYWwsIERCRV9CTU9ERV9CT1RIKTsKLQotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCURCRV9JU0VUUkVHKG1vZGVfcmVncywgaSwgb3V0cHV0VmFsKTsKLQl9Ci0KLQkvKiBkYmVfSW5pdFRpbWluZygpOyAqLwotCURCRV9TRVRSRUcodnRfaW50cjAxLCAweGZmZmZmZmZmKTsKLQlEQkVfU0VUUkVHKHZ0X2ludHIyMywgMHhmZmZmZmZmZik7Ci0KLQlEQkVfR0VUUkVHKGRvdGNsb2NrLCByZWFkVmFsKTsKLQlEQkVfU0VUUkVHKGRvdGNsb2NrLCByZWFkVmFsICYgMHhmZmZmKTsKLQotCURCRV9TRVRSRUcodnRfeHltYXgsIDB4MDAwMDAwMDApOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9WU1lOQywgVlRfVlNZTkNfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dnN5bmNfc3RhcnQpOwotCVNFVF9EQkVfRklFTEQoVlRfVlNZTkMsIFZUX1ZTWU5DX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52c3luY19lbmQpOwotCURCRV9TRVRSRUcodnRfdnN5bmMsIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX0hTWU5DLCBWVF9IU1lOQ19PTiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oc3luY19zdGFydCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9IU1lOQywgVlRfSFNZTkNfT0ZGLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPmhzeW5jX2VuZCk7Ci0JREJFX1NFVFJFRyh2dF9oc3luYywgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfVkJMQU5LLCBWVF9WQkxBTktfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZCTEFOSywgVlRfVkJMQU5LX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52YmxhbmtfZW5kKTsKLQlEQkVfU0VUUkVHKHZ0X3ZibGFuaywgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfSEJMQU5LLCBWVF9IQkxBTktfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX0hCTEFOSywgVlRfSEJMQU5LX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gMyk7Ci0JREJFX1NFVFJFRyh2dF9oYmxhbmssIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZDTUFQLCBWVF9WQ01BUF9PTiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52Ymxhbmtfc3RhcnQpOwotCVNFVF9EQkVfRklFTEQoVlRfVkNNQVAsIFZUX1ZDTUFQX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52YmxhbmtfZW5kKTsKLQlEQkVfU0VUUkVHKHZ0X3ZjbWFwLCBvdXRwdXRWYWwpOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9IQ01BUCwgVlRfSENNQVBfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX0hDTUFQLCBWVF9IQ01BUF9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCAtIDMpOwotCURCRV9TRVRSRUcodnRfaGNtYXAsIG91dHB1dFZhbCk7Ci0KLQlpZiAoZmxhdHBhbmVsX2lkICE9IC0xKQotCQlzZ2l2d2ZiX3NldHVwX2ZsYXRwYW5lbChwYXIsIGN1cnJlbnRUaW1pbmcpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQl0ZW1wID0gY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0IC0gY3VycmVudFRpbWluZy0+dmJsYW5rX2VuZCAtIDE7Ci0JaWYgKHRlbXAgPiAwKQotCQl0ZW1wID0gLXRlbXA7Ci0KLQlTRVRfREJFX0ZJRUxEKERJRF9TVEFSVF9YWSwgRElEX1NUQVJUWSwgb3V0cHV0VmFsLCAodTMyKSB0ZW1wKTsKLQlpZiAoY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCA+PSAyMCkKLQkJU0VUX0RCRV9GSUVMRChESURfU1RBUlRfWFksIERJRF9TVEFSVFgsIG91dHB1dFZhbCwKLQkJCSAgICAgIGN1cnJlbnRUaW1pbmctPmhibGFua19lbmQgLSAyMCk7Ci0JZWxzZQotCQlTRVRfREJFX0ZJRUxEKERJRF9TVEFSVF9YWSwgRElEX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkJICAgICAgY3VycmVudFRpbWluZy0+aHRvdGFsIC0gKDIwIC0KLQkJCQkJCSAgICAgICBjdXJyZW50VGltaW5nLT4KLQkJCQkJCSAgICAgICBoYmxhbmtfZW5kKSk7Ci0JREJFX1NFVFJFRyhkaWRfc3RhcnRfeHksIG91dHB1dFZhbCk7Ci0KLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoQ1JTX1NUQVJUX1hZLCBDUlNfU1RBUlRZLCBvdXRwdXRWYWwsCi0JCSAgICAgICh1MzIpICh0ZW1wICsgMSkpOwotCWlmIChjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kID49IERCRV9DUlNfTUFHSUMpCi0JCVNFVF9EQkVfRklFTEQoQ1JTX1NUQVJUX1hZLCBDUlNfU1RBUlRYLCBvdXRwdXRWYWwsCi0JCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gREJFX0NSU19NQUdJQyk7Ci0JZWxzZQotCQlTRVRfREJFX0ZJRUxEKENSU19TVEFSVF9YWSwgQ1JTX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkJICAgICAgY3VycmVudFRpbWluZy0+aHRvdGFsIC0gKERCRV9DUlNfTUFHSUMgLQotCQkJCQkJICAgICAgIGN1cnJlbnRUaW1pbmctPgotCQkJCQkJICAgICAgIGhibGFua19lbmQpKTsKLQlEQkVfU0VUUkVHKGNyc19zdGFydF94eSwgb3V0cHV0VmFsKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWQ19TVEFSVF9YWSwgVkNfU1RBUlRZLCBvdXRwdXRWYWwsICh1MzIpIHRlbXApOwotCVNFVF9EQkVfRklFTEQoVkNfU1RBUlRfWFksIFZDX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gNCk7Ci0JREJFX1NFVFJFRyh2Y19zdGFydF94eSwgb3V0cHV0VmFsKTsKLQotCURCRV9TRVRSRUcoZnJtX3NpemVfdGlsZSwgZnJtV3JpdGUxKTsKLQlEQkVfU0VUUkVHKGZybV9zaXplX3BpeGVsLCBmcm1Xcml0ZTIpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKERPVENMSywgTSwgb3V0cHV0VmFsLCBjdXJyZW50VGltaW5nLT5wbGxfbSAtIDEpOwotCVNFVF9EQkVfRklFTEQoRE9UQ0xLLCBOLCBvdXRwdXRWYWwsIGN1cnJlbnRUaW1pbmctPnBsbF9uIC0gMSk7Ci0JU0VUX0RCRV9GSUVMRChET1RDTEssIFAsIG91dHB1dFZhbCwgY3VycmVudFRpbWluZy0+cGxsX3ApOwotCVNFVF9EQkVfRklFTEQoRE9UQ0xLLCBSVU4sIG91dHB1dFZhbCwgMSk7Ci0JREJFX1NFVFJFRyhkb3RjbG9jaywgb3V0cHV0VmFsKTsKLQotCXVkZWxheSgxMSAqIDEwMDApOwotCi0JREJFX1NFVFJFRyh2dF92cGl4ZW4sIDB4ZmZmZmZmKTsKLQlEQkVfU0VUUkVHKHZ0X2hwaXhlbiwgMHhmZmZmZmYpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX1hZTUFYLCBWVF9NQVhYLCBvdXRwdXRWYWwsIGN1cnJlbnRUaW1pbmctPmh0b3RhbCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9YWU1BWCwgVlRfTUFYWSwgb3V0cHV0VmFsLCBjdXJyZW50VGltaW5nLT52dG90YWwpOwotCURCRV9TRVRSRUcodnRfeHltYXgsIG91dHB1dFZhbCk7Ci0KLQlvdXRwdXRWYWwgPSBmcm1Xcml0ZTE7Ci0JU0VUX0RCRV9GSUVMRChGUk1fU0laRV9USUxFLCBGUk1fRklGT19SRVNFVCwgb3V0cHV0VmFsLCAxKTsKLQlEQkVfU0VUUkVHKGZybV9zaXplX3RpbGUsIG91dHB1dFZhbCk7Ci0JREJFX1NFVFJFRyhmcm1fc2l6ZV90aWxlLCBmcm1Xcml0ZTEpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKE9WUl9XSURUSF9USUxFLCBPVlJfRklGT19SRVNFVCwgb3V0cHV0VmFsLCAxKTsKLQlEQkVfU0VUUkVHKG92cl93aWR0aF90aWxlLCBvdXRwdXRWYWwpOwotCURCRV9TRVRSRUcob3ZyX3dpZHRoX3RpbGUsIDApOwotCi0JREJFX1NFVFJFRyhmcm1fY29udHJvbCwgZnJtV3JpdGUzYik7Ci0JREJFX1NFVFJFRyhkaWRfY29udHJvbCwgMCk7Ci0KLQkvLyBXYWl0IGZvciBkYmUgdG8gdGFrZSBmcmFtZSBzZXR0aW5ncwotCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewotCQlEQkVfR0VUUkVHKGZybV9pbmh3Y3RybCwgcmVhZFZhbCk7Ci0JCWlmIChHRVRfREJFX0ZJRUxEKEZSTV9JTkhXQ1RSTCwgRlJNX0RNQV9FTkFCTEUsIHJlYWRWYWwpICE9Ci0JCSAgICAwKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJCXVkZWxheSgxKTsKLQl9Ci0KLQlpZiAoaSA9PSAxMDAwMDApCi0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJzZ2l2d2ZiOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGZyYW1lIERNQSBlbmFibGUuXG4iKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JaHRtcCA9IGN1cnJlbnRUaW1pbmctPmhibGFua19lbmQgLSAxOTsKLQlpZiAoaHRtcCA8IDApCi0JCWh0bXAgKz0gY3VycmVudFRpbWluZy0+aHRvdGFsOwkvKiBhbGxvdyBibGFuayB0byB3cmFwIGFyb3VuZCAqLwotCVNFVF9EQkVfRklFTEQoVlRfSFBJWEVOLCBWVF9IUElYRU5fT04sIG91dHB1dFZhbCwgaHRtcCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9IUElYRU4sIFZUX0hQSVhFTl9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgKChodG1wICsgY3VycmVudFRpbWluZy0+d2lkdGggLQotCQkJMikgJSBjdXJyZW50VGltaW5nLT5odG90YWwpKTsKLQlEQkVfU0VUUkVHKHZ0X2hwaXhlbiwgb3V0cHV0VmFsKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9WUElYRU4sIFZUX1ZQSVhFTl9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZQSVhFTiwgVlRfVlBJWEVOX09OLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPnZibGFua19lbmQpOwotCURCRV9TRVRSRUcodnRfdnBpeGVuLCBvdXRwdXRWYWwpOwotCi0JLy8gVHVybiBvZmYgbW91c2UgY3Vyc29yCi0JcGFyLT5yZWdzLT5jcnNfY3RsID0gMDsKLQotCS8vIFhYWCBXaGF0J3MgdGhpcyBzZWN0aW9uIGZvcj8/Ci0JREJFX0dFVFJFRyhjdHJsc3RhdCwgcmVhZFZhbCk7Ci0JcmVhZFZhbCAmPSAweDAyMDAwMDAwOwotCi0JaWYgKHJlYWRWYWwgIT0gMCkgewotCQlEQkVfU0VUUkVHKGN0cmxzdGF0LCAweDMwMDAwMDAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFyZSBhbHJlYWR5Ci0gKiAgcm91bmRlZCBkb3duIHRvIHRoZSBoYXJkd2FyZSdzIGNhcGFiaWxpdGllcyAoYWNjb3JkaW5nIHRvIHRoZQotICogIGVudHJpZXMgaW4gdGhlIHZhciBzdHJ1Y3R1cmUpLiBSZXR1cm4gIT0gMCBmb3IgaW52YWxpZCByZWduby4KLSAqLwotCi1zdGF0aWMgaW50IHNnaXZ3ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLAotCQkJICAgICB1X2ludCBibHVlLCB1X2ludCB0cmFuc3AsCi0JCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzZ2l2d19wYXIgKnBhciA9IChzdHJ1Y3Qgc2dpdndfcGFyICopIGluZm8tPnBhcjsKLQotCWlmIChyZWdubyA+IDI1NSkKLQkJcmV0dXJuIDE7Ci0JcmVkID4+PSA4OwotCWdyZWVuID4+PSA4OwotCWJsdWUgPj49IDg7Ci0KLQkvKiB3YWl0IGZvciB0aGUgY29sb3IgbWFwIEZJRk8gdG8gaGF2ZSBhIGZyZWUgZW50cnkgKi8KLQl3aGlsZSAocGFyLT5jbWFwX2ZpZm8gPT0gMCkKLQkJcGFyLT5jbWFwX2ZpZm8gPSBwYXItPnJlZ3MtPmNtX2ZpZm87Ci0KLQlwYXItPnJlZ3MtPmNtYXBbcmVnbm9dID0gKHJlZCA8PCAyNCkgfCAoZ3JlZW4gPDwgMTYpIHwgKGJsdWUgPDwgOCk7Ci0JcGFyLT5jbWFwX2ZpZm8tLTsJLyogYXNzdW1lIEZJRk8gaXMgZmlsbGluZyB1cCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNnaXZ3ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCByOwotCi0JcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgPQotCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8IF9QQUdFX1BDRDsKLQotCXIgPSB2bV9pb21hcF9tZW1vcnkodm1hLCBzZ2l2d2ZiX21lbV9waHlzLCBzZ2l2d2ZiX21lbV9zaXplKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJzZ2l2d2ZiOiBtbWFwIGZyYW1lYnVmZmVyIFAoJWx4KS0+ViglbHgpXG4iLAotCQlzZ2l2d2ZiX21lbV9waHlzICsgKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCksIHZtYS0+dm1fc3RhcnQpOwotCi0JcmV0dXJuIHI7Ci19Ci0KLWludCBfX2luaXQgc2dpdndmYl9zZXR1cChjaGFyICpvcHRpb25zKQotewotCWNoYXIgKnRoaXNfb3B0OwotCi0JaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm1vbml0b3I6IiwgOCkpIHsKLQkJCWlmICghc3RybmNtcCh0aGlzX29wdCArIDgsICJjcnQiLCAzKSkKLQkJCQlmbGF0cGFuZWxfaWQgPSAtMTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0ICsgOCwgIjE2MDBzdyIsIDYpKQotCQkJCWZsYXRwYW5lbF9pZCA9IEZMQVRQQU5FTF9TR0lfMTYwMFNXOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogIEluaXRpYWxpc2F0aW9uCi0gKi8KLXN0YXRpYyBpbnQgc2dpdndmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNnaXZ3X3BhciAqcGFyOwotCXN0cnVjdCBmYl9pbmZvICppbmZvOwotCWNoYXIgKm1vbml0b3I7Ci0KLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2l2d19wYXIpICsgc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKLQlpZiAoIWluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCXBhciA9IGluZm8tPnBhcjsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKERCRV9SRUdfUEhZUywgREJFX1JFR19TSVpFLCAic2dpdndmYiIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2dpdndmYjogY291bGRuJ3QgcmVzZXJ2ZSBtbWlvIHJlZ2lvblxuIik7Ci0JCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcGFyLT5yZWdzID0gKHN0cnVjdCBhc3JlZ3MgKikgaW9yZW1hcF9ub2NhY2hlKERCRV9SRUdfUEhZUywgREJFX1JFR19TSVpFKTsKLQlpZiAoIXBhci0+cmVncykgewotCQlwcmludGsoS0VSTl9FUlIgInNnaXZ3ZmI6IGNvdWxkbid0IGlvcmVtYXAgcmVnaXN0ZXJzXG4iKTsKLQkJZ290byBmYWlsX2lvcmVtYXBfcmVnczsKLQl9Ci0KLQltdHJyX2FkZChzZ2l2d2ZiX21lbV9waHlzLCBzZ2l2d2ZiX21lbV9zaXplLCBNVFJSX1RZUEVfV1JDT01CLCAxKTsKLQotCXNnaXZ3ZmJfZml4LnNtZW1fc3RhcnQgPSBzZ2l2d2ZiX21lbV9waHlzOwotCXNnaXZ3ZmJfZml4LnNtZW1fbGVuID0gc2dpdndmYl9tZW1fc2l6ZTsKLQlzZ2l2d2ZiX2ZpeC55d3JhcHN0ZXAgPSB5d3JhcDsKLQlzZ2l2d2ZiX2ZpeC55cGFuc3RlcCA9IHlwYW47Ci0KLQlpbmZvLT5maXggPSBzZ2l2d2ZiX2ZpeDsKLQotCXN3aXRjaCAoZmxhdHBhbmVsX2lkKSB7Ci0JCWNhc2UgRkxBVFBBTkVMX1NHSV8xNjAwU1c6Ci0JCQlpbmZvLT52YXIgPSBzZ2l2d2ZiX3ZhcjE2MDBzdzsKLQkJCW1vbml0b3IgPSAiU0dJIDE2MDBTVyBmbGF0cGFuZWwiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpbmZvLT52YXIgPSBzZ2l2d2ZiX3ZhcjsKLQkJCW1vbml0b3IgPSAiQ1JUIjsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJzZ2l2d2ZiOiAlcyBtb25pdG9yIHNlbGVjdGVkXG4iLCBtb25pdG9yKTsKLQotCWluZm8tPmZib3BzID0gJnNnaXZ3ZmJfb3BzOwotCWluZm8tPnBzZXVkb19wYWxldHRlID0gKHZvaWQgKikgKHBhciArIDEpOwotCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7Ci0KLQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSgodW5zaWduZWQgbG9uZykgc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSk7Ci0JaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNnaXZ3ZmI6IGNvdWxkbid0IGlvcmVtYXAgc2NyZWVuX2Jhc2VcbiIpOwotCQlnb3RvIGZhaWxfaW9yZW1hcF9mYm1lbTsKLQl9Ci0KLQlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApCi0JCWdvdG8gZmFpbF9jb2xvcl9tYXA7Ci0KLQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2dpdndmYjogY291bGRuJ3QgcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOwotCQlnb3RvIGZhaWxfcmVnaXN0ZXJfZnJhbWVidWZmZXI7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKLQotCWZiX2luZm8oaW5mbywgIlNHSSBEQkUgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWxkSyBvZiB2aWRlbyBtZW1vcnkgYXQgJSNseFxuIiwKLQkJc2dpdndmYl9tZW1fc2l6ZSA+PiAxMCwgc2dpdndmYl9tZW1fcGh5cyk7Ci0JcmV0dXJuIDA7Ci0KLWZhaWxfcmVnaXN0ZXJfZnJhbWVidWZmZXI6Ci0JZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLWZhaWxfY29sb3JfbWFwOgotCWlvdW5tYXAoKGNoYXIgKikgaW5mby0+c2NyZWVuX2Jhc2UpOwotZmFpbF9pb3JlbWFwX2ZibWVtOgotCWlvdW5tYXAocGFyLT5yZWdzKTsKLWZhaWxfaW9yZW1hcF9yZWdzOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihEQkVfUkVHX1BIWVMsIERCRV9SRUdfU0laRSk7Ci0JZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLQlyZXR1cm4gLUVOWElPOwotfQotCi1zdGF0aWMgaW50IHNnaXZ3ZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoaW5mbykgewotCQlzdHJ1Y3Qgc2dpdndfcGFyICpwYXIgPSBpbmZvLT5wYXI7Ci0KLQkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKLQkJZGJlX1R1cm5PZmZEbWEocGFyKTsKLQkJaW91bm1hcChwYXItPnJlZ3MpOwotCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKERCRV9SRUdfUEhZUywgREJFX1JFR19TSVpFKTsKLQkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLQkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNnaXZ3ZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IHNnaXZ3ZmJfcHJvYmUsCi0JLnJlbW92ZQk9IHNnaXZ3ZmJfcmVtb3ZlLAotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lCT0gInNnaXZ3ZmIiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2dpdndmYl9kZXZpY2U7Ci0KLWludCBfX2luaXQgc2dpdndmYl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotI2lmbmRlZiBNT0RVTEUKLQljaGFyICpvcHRpb24gPSBOVUxMOwotCi0JaWYgKGZiX2dldF9vcHRpb25zKCJzZ2l2d2ZiIiwgJm9wdGlvbikpCi0JCXJldHVybiAtRU5PREVWOwotCXNnaXZ3ZmJfc2V0dXAob3B0aW9uKTsKLSNlbmRpZgotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2dpdndmYl9kcml2ZXIpOwotCWlmICghcmV0KSB7Ci0JCXNnaXZ3ZmJfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzZ2l2d2ZiIiwgMCk7Ci0JCWlmIChzZ2l2d2ZiX2RldmljZSkgewotCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzZ2l2d2ZiX2RldmljZSk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLUVOT01FTTsKLQkJaWYgKHJldCkgewotCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNnaXZ3ZmJfZHJpdmVyKTsKLQkJCXBsYXRmb3JtX2RldmljZV9wdXQoc2dpdndmYl9kZXZpY2UpOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLW1vZHVsZV9pbml0KHNnaXZ3ZmJfaW5pdCk7Ci0KLSNpZmRlZiBNT0RVTEUKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNnaXZ3ZmJfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNnaXZ3ZmJfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2dpdndmYl9kcml2ZXIpOwotfQotCi1tb2R1bGVfZXhpdChzZ2l2d2ZiX2V4aXQpOwotCi0jZW5kaWYJCQkJLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3V2ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jCmluZGV4IDI1NmZiYTcuLjFmMzg0NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAl1dmZiX3Rhc2tzW3NlcV0gPSB0YXNrOwogCW11dGV4X3VubG9jaygmdXZmYl9sb2NrKTsKIAotCWVyciA9IGNuX25ldGxpbmtfc2VuZChtLCAwLCBHRlBfS0VSTkVMKTsKKwllcnIgPSBjbl9uZXRsaW5rX3NlbmQobSwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVyciA9PSAtRVNSQ0gpIHsKIAkJLyoKIAkJICogVHJ5IHRvIHN0YXJ0IHRoZSB1c2Vyc3BhY2UgaGVscGVyIGlmIHNlbmRpbmcKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQkJCQkiaGVscGVyIGlzIGluc3RhbGxlZCBhbmQgZXhlY3V0YWJsZVxuIik7CiAJCX0gZWxzZSB7CiAJCQl2ODZkX3N0YXJ0ZWQgPSAxOwotCQkJZXJyID0gY25fbmV0bGlua19zZW5kKG0sIDAsIGdmcF9hbnkoKSk7CisJCQllcnIgPSBjbl9uZXRsaW5rX3NlbmQobSwgMCwgMCwgZ2ZwX2FueSgpKTsKIAkJCWlmIChlcnIgPT0gLUVOT0JVRlMpCiAJCQkJZXJyID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKaW5kZXggMWI1ZDQ4Yy4uYmZiMmQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC04NjksMTQgKzg2OSwxMyBAQAogCiAJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKLQkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyBWTUUgYWRkcmVzcyBhbGlnbm1lbnQgcHJvYmxlbQotCSAqIGluIG9yZGVyIHRvIGFzc3VyZSB0aGUgbWF4aW1hbCBkYXRhIHdpZHRoIGN5Y2xlLgotCSAqIFdlIGNhbm5vdCB1c2UgbWVtY3B5X3h4eCBkaXJlY3RseSBoZXJlIGJlY2F1c2UgaXQKLQkgKiBtYXkgY3V0IGRhdGEgdHJhbnNmZXIgaW4gOC1iaXRzIGN5Y2xlcywgdGh1cyBtYWtpbmcKLQkgKiBEMTYgY3ljbGUgaW1wb3NzaWJsZS4KLQkgKiBGcm9tIHRoZSBvdGhlciBoYW5kLCB0aGUgYnJpZGdlIGl0c2VsZiBhc3N1cmVzIHRoYXQKLQkgKiBtYXhpbWFsIGNvbmZpZ3VyZWQgZGF0YSBjeWNsZSBpcyB1c2VkIGFuZCBzcGxpdHMgaXQKLQkgKiBhdXRvbWF0aWNhbGx5IGZvciBub24tYWxpZ25lZCBhZGRyZXNzZXMuCisJLyogVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgVk1FIGFkZHJlc3MgYWxpZ25tZW50LiBXZSBjYW5ub3QgdXNlCisJICogbWVtY3B5X3h4eCBoZXJlIGJlY2F1c2UgaXQgbWF5IGN1dCBkYXRhIHRyYW5zZmVycyBpbiB0byA4LWJpdAorCSAqIGN5Y2xlcyB3aGVuIEQxNiBvciBEMzIgY3ljbGVzIGFyZSByZXF1aXJlZCBvbiB0aGUgVk1FIGJ1cy4KKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGJyaWRnZSBpdHNlbGYgYXNzdXJlcyB0aGF0IHRoZSBtYXhpbXVtIGRhdGEKKwkgKiBjeWNsZSBjb25maWd1cmVkIGZvciB0aGUgdHJhbnNmZXIgaXMgdXNlZCBhbmQgc3BsaXRzIGl0CisJICogYXV0b21hdGljYWxseSBmb3Igbm9uLWFsaWduZWQgYWRkcmVzc2VzLCBzbyB3ZSBkb24ndCB3YW50IHRoZQorCSAqIG92ZXJoZWFkIG9mIG5lZWRsZXNzbHkgZm9yY2luZyBzbWFsbCB0cmFuc2ZlcnMgZm9yIHRoZSBlbnRpcmUgY3ljbGUuCiAJICovCiAJaWYgKCh1aW50cHRyX3QpYWRkciAmIDB4MSkgewogCQkqKHU4ICopYnVmID0gaW9yZWFkOChhZGRyKTsKQEAgLTg5Niw5ICs4OTUsOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV9mcm9taW8oYnVmICsgZG9uZSwgYWRkciArIGRvbmUsICh1bnNpZ25lZCBpbnQpY291bnQpOwotCQlkb25lICs9IGNvdW50MzI7CisJd2hpbGUgKGRvbmUgPCBjb3VudDMyKSB7CisJCSoodTMyICopKGJ1ZiArIGRvbmUpID0gaW9yZWFkMzIoYWRkciArIGRvbmUpOworCQlkb25lICs9IDQ7CiAJfQogCiAJaWYgKChjb3VudCAtIGRvbmUpICYgMHgyKSB7CkBAIC05MzAsNyArOTI5LDcgQEAKIAlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIEhlcmUgd2UgYXBwbHkgZm9yIHRoZSBzYW1lIHN0cmF0ZWd5IHdlIGRvIGluIG1hc3Rlcl9yZWFkCi0JICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gYXNzdXJlIEQxNiBjeWNsZSB3aGVuIHJlcXVpcmVkLgorCSAqIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFzc3VyZSB0aGUgY29ycmVjdCBjeWNsZXMuCiAJICovCiAJaWYgKCh1aW50cHRyX3QpYWRkciAmIDB4MSkgewogCQlpb3dyaXRlOCgqKHU4ICopYnVmLCBhZGRyKTsKQEAgLTk1MCw5ICs5NDksOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV90b2lvKGFkZHIgKyBkb25lLCBidWYgKyBkb25lLCBjb3VudDMyKTsKLQkJZG9uZSArPSBjb3VudDMyOworCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQlpb3dyaXRlMzIoKih1MzIgKikoYnVmICsgZG9uZSksIGFkZHIgKyBkb25lKTsKKwkJZG9uZSArPSA0OwogCX0KIAogCWlmICgoY291bnQgLSBkb25lKSAmIDB4MikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCA5OTExY2Q1Li4wNjk5MGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtMTI3Niw4ICsxMjc2LDggQEAKIAlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIFZNRSBhZGRyZXNzIGFsaWdubWVudC4gV2UgY2Fubm90IHVzZQotCSAqIG1lbWNweV94eHggZGlyZWN0bHkgaGVyZSBiZWNhdXNlIGl0IG1heSBjdXQgc21hbGwgZGF0YSB0cmFuc2ZlcnMgaW4KLQkgKiB0byA4LWJpdCBjeWNsZXMsIHRodXMgbWFraW5nIEQxNiBjeWNsZSBpbXBvc3NpYmxlLgorCSAqIG1lbWNweV94eHggaGVyZSBiZWNhdXNlIGl0IG1heSBjdXQgZGF0YSB0cmFuc2ZlcnMgaW4gdG8gOC1iaXQKKwkgKiBjeWNsZXMgd2hlbiBEMTYgb3IgRDMyIGN5Y2xlcyBhcmUgcmVxdWlyZWQgb24gdGhlIFZNRSBidXMuCiAJICogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBicmlkZ2UgaXRzZWxmIGFzc3VyZXMgdGhhdCB0aGUgbWF4aW11bSBkYXRhCiAJICogY3ljbGUgY29uZmlndXJlZCBmb3IgdGhlIHRyYW5zZmVyIGlzIHVzZWQgYW5kIHNwbGl0cyBpdAogCSAqIGF1dG9tYXRpY2FsbHkgZm9yIG5vbi1hbGlnbmVkIGFkZHJlc3Nlcywgc28gd2UgZG9uJ3Qgd2FudCB0aGUKQEAgLTEzMDEsOSArMTMwMSw5IEBACiAJfQogCiAJY291bnQzMiA9IChjb3VudCAtIGRvbmUpICYgfjB4MzsKLQlpZiAoY291bnQzMiA+IDApIHsKLQkJbWVtY3B5X2Zyb21pbyhidWYgKyBkb25lLCBhZGRyICsgZG9uZSwgY291bnQzMik7Ci0JCWRvbmUgKz0gY291bnQzMjsKKwl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJKih1MzIgKikoYnVmICsgZG9uZSkgPSBpb3JlYWQzMihhZGRyICsgZG9uZSk7CisJCWRvbmUgKz0gNDsKIAl9CiAKIAlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDIpIHsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiAJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBIZXJlIHdlIGFwcGx5IGZvciB0aGUgc2FtZSBzdHJhdGVneSB3ZSBkbyBpbiBtYXN0ZXJfcmVhZAotCSAqIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFzc3VyZSBEMTYgY3ljbGUgd2hlbiByZXF1aXJlZC4KKwkgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBhc3N1cmUgdGhlIGNvcnJlY3QgY3ljbGVzLgogCSAqLwogCWlmICgodWludHB0cl90KWFkZHIgJiAweDEpIHsKIAkJaW93cml0ZTgoKih1OCAqKWJ1ZiwgYWRkcik7CkBAIC0xMzgzLDkgKzEzODMsOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV90b2lvKGFkZHIgKyBkb25lLCBidWYgKyBkb25lLCBjb3VudDMyKTsKLQkJZG9uZSArPSBjb3VudDMyOworCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQlpb3dyaXRlMzIoKih1MzIgKikoYnVmICsgZG9uZSksIGFkZHIgKyBkb25lKTsKKwkJZG9uZSArPSA0OwogCX0KIAogCWlmICgoY291bnQgLSBkb25lKSAmIDB4MikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwppbmRleCBlZmM3ZjA3Li4xNzA4YjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwpAQCAtMzYsMTMgKzM2LDEyIEBACiAKIGNvbmZpZyBXMV9NQVNURVJfTVhDCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBNWEMgMS13aXJlIGJ1c21hc3RlciIKLQlkZXBlbmRzIG9uIFcxICYmIEFSQ0hfTVhDCisJZGVwZW5kcyBvbiBBUkNIX01YQyB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNWEMgMS13aXJlIGhvc3QKIAogY29uZmlnIFcxX01BU1RFUl9EUzFXTQogCXRyaXN0YXRlICJNYXhpbSBEUzFXTSAxLXdpcmUgYnVzbWFzdGVyIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgRFMxV00gMS13aXJlIGRyaXZlciwgc3VjaCBhcyB0aGF0CiAJICBpbiBIUCBpUEFRIGRldmljZXMgbGlrZSBoNXh4eCwgaDIyMDAsIGFuZCBBU0lDMy1iYXNlZCBsaWtlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMKaW5kZXggNGY3ZTFkNy4uNzQwNGFkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0OTAuYworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICoJZHNjb3JlLmMKKyAqCWRzMjQ5MC5jICBVU0IgdG8gb25lIHdpcmUgYnJpZGdlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9seWFrb3YgPHpickBpb3JlbWFwLm5ldD4KICAqCkBAIC0yOCw2ICsyOCwxMCBAQAogI2luY2x1ZGUgIi4uL3cxX2ludC5oIgogI2luY2x1ZGUgIi4uL3cxLmgiCiAKKy8qIFVTQiBTdGFuZGFyZCAqLworLyogVVNCIENvbnRyb2wgcmVxdWVzdCB2ZW5kb3IgdHlwZSAqLworI2RlZmluZSBWRU5ET1IJCQkJMHg0MAorCiAvKiBDT01NQU5EIFRZUEUgQ09ERVMgKi8KICNkZWZpbmUgQ09OVFJPTF9DTUQJCQkweDAwCiAjZGVmaW5lIENPTU1fQ01ECQkJMHgwMQpAQCAtMTA3LDYgKzExMSw4IEBACiAjZGVmaW5lIFNUX0hBTFQJCQkJMHgxMCAgLyogRFMyNDkwIGlzIGN1cnJlbnRseSBoYWx0ZWQgKi8KICNkZWZpbmUgU1RfSURMRQkJCQkweDIwICAvKiBEUzI0OTAgaXMgY3VycmVudGx5IGlkbGUgKi8KICNkZWZpbmUgU1RfRVBPRgkJCQkweDgwCisvKiBTdGF0dXMgdHJhbnNmZXIgc2l6ZSwgMTYgYnl0ZXMgc3RhdHVzLCAxNiBieXRlIHJlc3VsdCBmbGFncyAqLworI2RlZmluZSBTVF9TSVpFCQkJCTB4MjAKIAogLyogUmVzdWx0IFJlZ2lzdGVyIGZsYWdzICovCiAjZGVmaW5lIFJSX0RFVEVDVAkJCTB4QTUgLyogTmV3IGRldmljZSBkZXRlY3RlZCAqLwpAQCAtMTk4LDcgKzIwNCw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAotCQkJQ09OVFJPTF9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CisJCQlDT05UUk9MX0NNRCwgVkVORE9SLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29tbWFuZCBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwpAQCAtMjEzLDcgKzIxOSw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAotCQkJTU9ERV9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CisJCQlNT0RFX0NNRCwgVkVORE9SLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgbW9kZSBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwpAQCAtMjI4LDcgKzIzNCw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAotCQkJQ09NTV9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CisJCQlDT01NX0NNRCwgVkVORE9SLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLAogCQkJCXZhbHVlLCBpbmRleCwgZXJyKTsKQEAgLTI0Niw3ICsyNTIsOCBAQAogCW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOwogCiAJY291bnQgPSAwOwotCWVyciA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfU1RBVFVTXSksIGJ1Ziwgc2l6ZSwgJmNvdW50LCAxMDApOworCWVyciA9IHVzYl9pbnRlcnJ1cHRfbXNnKGRldi0+dWRldiwgdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAorCQlkZXYtPmVwW0VQX1NUQVRVU10pLCBidWYsIHNpemUsICZjb3VudCwgMTAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWFkIDEtd2lyZSBkYXRhIGZyb20gMHgleDogZXJyPSVkLlxuIiwgZGV2LT5lcFtFUF9TVEFUVVNdLCBlcnIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMzUzLDcgKzM2MCw3IEBACiAJZXJyID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9EQVRBX0lOXSksCiAJCQkJYnVmLCBzaXplLCAmY291bnQsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXU4IGJ1ZlsweDIwXTsKKwkJdTggYnVmW1NUX1NJWkVdOwogCQlpbnQgY291bnQ7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ2xlYXJpbmcgZXAweCV4LlxuIiwgZGV2LT5lcFtFUF9EQVRBX0lOXSk7CkBAIC0zOTgsNyArNDA1LDcgQEAKIHsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCWludCBjb3VudCA9IDAsIGVyciA9IDA7Ci0JdTggYnVmWzB4MjBdOworCXU4IGJ1ZltTVF9TSVpFXTsKIAogCWRvIHsKIAkJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ1RMX0hBTFRfRVhFX0lETEUsIDApOwpAQCAtNDUwLDEwICs0NTcsMTEgQEAKIAogc3RhdGljIGludCBkc193YWl0X3N0YXR1cyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQogewotCXU4IGJ1ZlsweDIwXTsKKwl1OCBidWZbU1RfU0laRV07CiAJaW50IGVyciwgY291bnQgPSAwOwogCiAJZG8geworCQlzdC0+c3RhdHVzID0gMDsKIAkJZXJyID0gZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgc3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogI2lmIDAKIAkJaWYgKGVyciA+PSAwKSB7CkBAIC00NjQsNyArNDcyLDcgQEAKIAkJCXByaW50aygiXG4iKTsKIAkJfQogI2VuZGlmCi0JfSB3aGlsZSAoIShidWZbMHgwOF0gJiBTVF9JRExFKSAmJiAhKGVyciA8IDApICYmICsrY291bnQgPCAxMDApOworCX0gd2hpbGUgKCEoc3QtPnN0YXR1cyAmIFNUX0lETEUpICYmICEoZXJyIDwgMCkgJiYgKytjb3VudCA8IDEwMCk7CiAKIAlpZiAoZXJyID49IDE2ICYmIHN0LT5zdGF0dXMgJiBTVF9FUE9GKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIlJlc2V0dGluZyBkZXZpY2UgYWZ0ZXIgU1RfRVBPRi5cbiIpOwpAQCAtNjkwLDM3ICs2OTgsMTA2IEBACiAJcmV0dXJuICEoZXJyID09IGxlbik7CiB9CiAKLSNpZiAwCi0KLXN0YXRpYyBpbnQgZHNfc2VhcmNoKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQsIHU2NCAqYnVmLCB1OCBpZF9udW1iZXIsIGludCBjb25kaXRpb25hbF9zZWFyY2gpCitzdGF0aWMgdm9pZCBkczk0OTByX3NlYXJjaCh2b2lkICpkYXRhLCBzdHJ1Y3QgdzFfbWFzdGVyICptYXN0ZXIsCisJdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNhbGxiYWNrKQogeworCS8qIFdoZW4gc3RhcnRpbmcgd2l0aCBhbiBleGlzdGluZyBpZCwgdGhlIGZpcnN0IGlkIHJldHVybmVkIHdpbGwKKwkgKiBiZSB0aGF0IGRldmljZSAoaWYgaXQgaXMgc3RpbGwgb24gdGhlIGJ1cyBtb3N0IGxpa2VseSkuCisJICoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIGRldmljZXMgZm91bmQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQorCSAqIHNlYXJjaF9saW1pdCwgdGhhdCBudW1iZXIgb2YgSURzIHdpbGwgYmUgcmV0dXJuZWQuICBJZiB0aGVyZSBhcmUKKwkgKiBtb3JlLCBzZWFyY2hfbGltaXQgSURzIHdpbGwgYmUgcmV0dXJuZWQgZm9sbG93ZWQgYnkgYSBub24temVybworCSAqIGRpc2NyZXBlbmN5IHZhbHVlLgorCSAqLworCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7CiAJaW50IGVycjsKIAl1MTYgdmFsdWUsIGluZGV4OwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CisJdTggc3RfYnVmW1NUX1NJWkVdOworCWludCBzZWFyY2hfbGltaXQ7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaTsKIAotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkvKiBEUzE4YjIwIHNwZWMsIDEzLjE2IG1zIHBlciBkZXZpY2UsIDc1IHBlciBzZWNvbmQsIHNsZWVwIGZvcgorCSAqIGRpc2NvdmVyaW5nIDggZGV2aWNlcyAoMSBidWxrIHRyYW5zZmVyIGFuZCAxLzIgRklGTyBzaXplKSBhdCBhIHRpbWUuCisJICovCisJY29uc3QgdW5zaWduZWQgbG9uZyBqdGltZSA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCo4Lzc1KTsKKwkvKiBGSUZPIDEyOCBieXRlcywgYnVsayBwYWNrZXQgc2l6ZSA2NCwgcmVhZCBhIG11bHRpcGxlIG9mIHRoZQorCSAqIHBhY2tldCBzaXplLgorCSAqLworCXU2NCBidWZbMio2NC84XTsKIAotCWVyciA9IGRzX3NlbmRfZGF0YShkc19kZXYsICh1bnNpZ25lZCBjaGFyICopJmluaXQsIDgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJbXV0ZXhfbG9jaygmbWFzdGVyLT5idXNfbXV0ZXgpOwogCi0JZHNfd2FpdF9zdGF0dXMoZHNfZGV2LCAmc3QpOworCS8qIGFkZHJlc3MgdG8gc3RhcnQgc2VhcmNoaW5nIGF0ICovCisJaWYgKGRzX3NlbmRfZGF0YShkZXYsICh1OCAqKSZtYXN0ZXItPnNlYXJjaF9pZCwgOCkgPCAwKQorCQlnb3RvIHNlYXJjaF9vdXQ7CisJbWFzdGVyLT5zZWFyY2hfaWQgPSAwOwogCi0JdmFsdWUgPSBDT01NX1NFQVJDSF9BQ0NFU1MgfCBDT01NX0lNIHwgQ09NTV9TTSB8IENPTU1fRiB8IENPTU1fUlRTOwotCWluZGV4ID0gKGNvbmRpdGlvbmFsX3NlYXJjaCA/IDB4RUMgOiAweEYwKSB8IChpZF9udW1iZXIgPDwgOCk7Ci0JZXJyID0gZHNfc2VuZF9jb250cm9sKGRzX2RldiwgdmFsdWUsIGluZGV4KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCXZhbHVlID0gQ09NTV9TRUFSQ0hfQUNDRVNTIHwgQ09NTV9JTSB8IENPTU1fUlNUIHwgQ09NTV9TTSB8IENPTU1fRiB8CisJCUNPTU1fUlRTOworCXNlYXJjaF9saW1pdCA9IG1hc3Rlci0+bWF4X3NsYXZlX2NvdW50OworCWlmIChzZWFyY2hfbGltaXQgPiAyNTUpCisJCXNlYXJjaF9saW1pdCA9IDA7CisJaW5kZXggPSBzZWFyY2hfdHlwZSB8IChzZWFyY2hfbGltaXQgPDwgOCk7CisJaWYgKGRzX3NlbmRfY29udHJvbChkZXYsIHZhbHVlLCBpbmRleCkgPCAwKQorCQlnb3RvIHNlYXJjaF9vdXQ7CiAKLQlkc193YWl0X3N0YXR1cyhkc19kZXYsICZzdCk7CisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0KGp0aW1lKTsKIAotCWVyciA9IGRzX3JlY3ZfZGF0YShkc19kZXYsICh1bnNpZ25lZCBjaGFyICopYnVmLCA4KmlkX251bWJlcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWlmIChkc19yZWN2X3N0YXR1c19ub2R1bXAoZGV2LCAmc3QsIHN0X2J1Ziwgc2l6ZW9mKHN0X2J1ZikpIDwKKwkJCXNpemVvZihzdCkpIHsKKwkJCWJyZWFrOworCQl9CiAKLQlyZXR1cm4gZXJyLzg7CisJCWlmIChzdC5kYXRhX2luX2J1ZmZlcl9zdGF0dXMpIHsKKwkJCS8qIEJ1bGsgaW4gY2FuIHJlY2VpdmUgcGFydGlhbCBpZHMsIGJ1dCB3aGVuIGl0IGRvZXMKKwkJCSAqIHRoZXkgZmFpbCBjcmMgYW5kIHdpbGwgYmUgZGlzY2FyZGVkIGFueXdheS4KKwkJCSAqIFRoYXQgaGFzIG9ubHkgYmVlbiBzZWVuIHdoZW4gc3RhdHVzIGluIGJ1ZmZlcgorCQkJICogaXMgMCBhbmQgYnVsayBpcyByZWFkIGFueXdheSwgc28gZG9uJ3QgcmVhZAorCQkJICogYnVsayB3aXRob3V0IGZpcnN0IGNoZWNraW5nIGlmIHN0YXR1cyBzYXlzIHRoZXJlCisJCQkgKiBpcyBkYXRhIHRvIHJlYWQuCisJCQkgKi8KKwkJCWVyciA9IGRzX3JlY3ZfZGF0YShkZXYsICh1OCAqKWJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQlmb3IgKGkgPSAwOyBpIDwgZXJyLzg7ICsraSkgeworCQkJCSsrZm91bmQ7CisJCQkJaWYgKGZvdW5kIDw9IHNlYXJjaF9saW1pdCkKKwkJCQkJY2FsbGJhY2sobWFzdGVyLCBidWZbaV0pOworCQkJCS8qIGNhbid0IGtub3cgaWYgdGhlcmUgd2lsbCBiZSBhIGRpc2NyZXBhbmN5CisJCQkJICogdmFsdWUgYWZ0ZXIgdW50aWwgdGhlIG5leHQgaWQgKi8KKwkJCQlpZiAoZm91bmQgPT0gc2VhcmNoX2xpbWl0KQorCQkJCQltYXN0ZXItPnNlYXJjaF9pZCA9IGJ1ZltpXTsKKwkJCX0KKwkJfQorCisJCWlmICh0ZXN0X2JpdChXMV9BQk9SVF9TRUFSQ0gsICZtYXN0ZXItPmZsYWdzKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCEoc3Quc3RhdHVzICYgKFNUX0lETEUgfCBTVF9IQUxUKSkpOworCisJLyogb25seSBjb250aW51ZSB0aGUgc2VhcmNoIGlmIHNvbWUgd2VyZW4ndCBmb3VuZCAqLworCWlmIChmb3VuZCA8PSBzZWFyY2hfbGltaXQpIHsKKwkJbWFzdGVyLT5zZWFyY2hfaWQgPSAwOworCX0gZWxzZSBpZiAoIXRlc3RfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmbWFzdGVyLT5mbGFncykpIHsKKwkJLyogT25seSBtYXhfc2xhdmVfY291bnQgd2lsbCBiZSBzY2FubmVkIGluIGEgc2VhcmNoLAorCQkgKiBidXQgaXQgd2lsbCBzdGFydCB3aGVyZSBpdCBsZWZ0IG9mZiBuZXh0IHNlYXJjaAorCQkgKiB1bnRpbCBhbGwgaWRzIGFyZSBpZGVudGlmaWVkIGFuZCB0aGVuIGl0IHdpbGwgc3RhcnQKKwkJICogb3Zlci4gIEEgY29udGludWVkIHNlYXJjaCB3aWxsIHJlcG9ydCB0aGUgcHJldmlvdXMKKwkJICogbGFzdCBpZCBhcyB0aGUgZmlyc3QgaWQgKHByb3ZpZGVkIGl0IGlzIHN0aWxsIG9uIHRoZQorCQkgKiBidXMpLgorCQkgKi8KKwkJZGV2X2luZm8oJmRldi0+dWRldi0+ZGV2LCAiJXM6IG1heF9zbGF2ZV9jb3VudCAlZCByZWFjaGVkLCAiCisJCQkid2lsbCBjb250aW51ZSBuZXh0IHNlYXJjaC5cbiIsIF9fZnVuY19fLAorCQkJbWFzdGVyLT5tYXhfc2xhdmVfY291bnQpOworCQlzZXRfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmbWFzdGVyLT5mbGFncyk7CisJfQorc2VhcmNoX291dDoKKwltdXRleF91bmxvY2soJm1hc3Rlci0+YnVzX211dGV4KTsKIH0KIAorI2lmIDAKIHN0YXRpYyBpbnQgZHNfbWF0Y2hfYWNjZXNzKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQpCiB7CiAJaW50IGVycjsKQEAgLTg5NCw2ICs5NzEsNyBAQAogCWRldi0+bWFzdGVyLndyaXRlX2Jsb2NrCT0gJmRzOTQ5MHJfd3JpdGVfYmxvY2s7CiAJZGV2LT5tYXN0ZXIucmVzZXRfYnVzCT0gJmRzOTQ5MHJfcmVzZXQ7CiAJZGV2LT5tYXN0ZXIuc2V0X3B1bGx1cAk9ICZkczk0OTByX3NldF9wdWxsdXA7CisJZGV2LT5tYXN0ZXIuc2VhcmNoCT0gJmRzOTQ5MHJfc2VhcmNoOwogCiAJcmV0dXJuIHcxX2FkZF9tYXN0ZXJfZGV2aWNlKCZkZXYtPm1hc3Rlcik7CiB9CkBAIC05MTAsMTUgKzk4OCwxMyBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgZHNfZGV2aWNlICpkZXY7Ci0JaW50IGksIGVycjsKKwlpbnQgaSwgZXJyLCBhbHQ7CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHNfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgRFM5NDkwUiBzdHJ1Y3R1cmUuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWRldi0+c3B1X3NsZWVwID0gMDsKLQlkZXYtPnNwdV9iaXQgPSAwOwogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCWlmICghZGV2LT51ZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC05MjgsMjAgKzEwMDQsMjUgQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKIAotCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDMpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0IGFsdGVybmF0aXZlIHNldHRpbmcgMyBmb3IgJWQgaW50ZXJmYWNlOiBlcnI9JWQuXG4iLAotCQkJCWludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBlcnIpOwotCQlnb3RvIGVycl9vdXRfY2xlYXI7Ci0JfQotCiAJZXJyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oZGV2LT51ZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlc2V0IGNvbmZpZ3VyYXRpb246IGVycj0lZC5cbiIsIGVycik7CisJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byByZXNldCBjb25maWd1cmF0aW9uOiBlcnI9JWQuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9vdXRfY2xlYXI7CiAJfQogCi0JaWZhY2VfZGVzYyA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOworCS8qIGFsdGVybmF0aXZlIDMsIDFtcyBpbnRlcnJ1cHQgKGdyZWF0bHkgc3BlZWRzIHNlYXJjaCksIDY0IGJ5dGUgYnVsayAqLworCWFsdCA9IDM7CisJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LAorCQlpbnRmLT5hbHRzZXR0aW5nW2FsdF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBhbHQpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IGFsdGVybmF0aXZlIHNldHRpbmcgJWQgIgorCQkJImZvciAlZCBpbnRlcmZhY2U6IGVycj0lZC5cbiIsIGFsdCwKKwkJCWludGYtPmFsdHNldHRpbmdbYWx0XS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIGVycik7CisJCWdvdG8gZXJyX291dF9jbGVhcjsKKwl9CisKKwlpZmFjZV9kZXNjID0gJmludGYtPmFsdHNldHRpbmdbYWx0XTsKIAlpZiAoaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IE5VTV9FUC0xKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIk51bSBlbmRwb2ludHM9JWQuIEl0IGlzIG5vdCBEUzk0OTBSLlxuIiwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKIAkJZXJyID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYwppbmRleCAxZTVkOTRjLi42N2IwNjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL214Y193MS5jCkBAIC0xMCwyNCArMTAsMTYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgIi4uL3cxLmgiCiAjaW5jbHVkZSAiLi4vdzFfaW50LmgiCi0jaW5jbHVkZSAiLi4vdzFfbG9nLmgiCiAKIC8qIEFjY29yZGluZyB0byB0aGUgbXgyNyBEYXRhc2hlZXQgdGhlIHJlc2V0IHByb2NlZHVyZSBzaG91bGQgdGFrZSB1cCB0byBhYm91dAogICogMTM1MHVzLiBXZSBzZXQgdGhlIHRpbWVvdXQgdG8gNTAwKjEwMHVzID0gNTBtcyBmb3Igc3VyZSAqLwpAQCAtMzYsMTMgKzI4LDEzIEBACiAvKgogICogTVhDIFcxIFJlZ2lzdGVyIG9mZnNldHMKICAqLwotI2RlZmluZSBNWENfVzFfQ09OVFJPTCAgICAgICAgICAweDAwCi0jZGVmaW5lIE1YQ19XMV9USU1FX0RJVklERVIgICAgIDB4MDIKLSNkZWZpbmUgTVhDX1cxX1JFU0VUICAgICAgICAgICAgMHgwNAotI2RlZmluZSBNWENfVzFfQ09NTUFORCAgICAgICAgICAweDA2Ci0jZGVmaW5lIE1YQ19XMV9UWFJYICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgTVhDX1cxX0lOVEVSUlVQVCAgICAgICAgMHgwQQotI2RlZmluZSBNWENfVzFfSU5URVJSVVBUX0VOICAgICAweDBDCisjZGVmaW5lIE1YQ19XMV9DT05UUk9MCQkweDAwCisjIGRlZmluZSBNWENfVzFfQ09OVFJPTF9SRFNUCUJJVCgzKQorIyBkZWZpbmUgTVhDX1cxX0NPTlRST0xfV1IoeCkJQklUKDUgLSAoeCkpCisjIGRlZmluZSBNWENfVzFfQ09OVFJPTF9QU1QJQklUKDYpCisjIGRlZmluZSBNWENfVzFfQ09OVFJPTF9SUFAJQklUKDcpCisjZGVmaW5lIE1YQ19XMV9USU1FX0RJVklERVIJMHgwMgorI2RlZmluZSBNWENfVzFfUkVTRVQJCTB4MDQKIAogc3RydWN0IG14Y193MV9kZXZpY2UgewogCXZvaWQgX19pb21lbSAqcmVnczsKQEAgLTYxLDEyICs1MywxMiBAQAogCXVuc2lnbmVkIGludCB0aW1lb3V0X2NudCA9IDA7CiAJc3RydWN0IG14Y193MV9kZXZpY2UgKmRldiA9IGRhdGE7CiAKLQlfX3Jhd193cml0ZWIoMHg4MCwgKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKSk7CisJd3JpdGViKE1YQ19XMV9DT05UUk9MX1JQUCwgKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKSk7CiAKIAl3aGlsZSAoMSkgewotCQlyZWdfdmFsID0gX19yYXdfcmVhZGIoZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0wpOworCQlyZWdfdmFsID0gcmVhZGIoZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0wpOwogCi0JCWlmICgoKHJlZ192YWwgPj4gNykgJiAweDEpID09IDAgfHwKKwkJaWYgKCEocmVnX3ZhbCAmIE1YQ19XMV9DT05UUk9MX1JQUCkgfHwKIAkJICAgIHRpbWVvdXRfY250ID4gTVhDX1cxX1JFU0VUX1RJTUVPVVQpCiAJCQlicmVhazsKIAkJZWxzZQpAQCAtNzQsNyArNjYsNyBAQAogCiAJCXVkZWxheSgxMDApOwogCX0KLQlyZXR1cm4gKHJlZ192YWwgPj4gNykgJiAweDE7CisJcmV0dXJuICEhKHJlZ192YWwgJiBNWENfVzFfQ09OVFJPTF9QU1QpOwogfQogCiAvKgpAQCAtOTAsMTYgKzgyLDE2IEBACiAJCQkJCSAqIGRhdGFzaGVldC4KIAkJCQkJICovCiAKLQlfX3Jhd193cml0ZWIoKDEgPDwgKDUgLSBiaXQpKSwgY3RybF9hZGRyKTsKKwl3cml0ZWIoTVhDX1cxX0NPTlRST0xfV1IoYml0KSwgY3RybF9hZGRyKTsKIAogCXdoaWxlICh0aW1lb3V0X2NudC0tKSB7Ci0JCWlmICghKChfX3Jhd19yZWFkYihjdHJsX2FkZHIpID4+ICg1IC0gYml0KSkgJiAweDEpKQorCQlpZiAoIShyZWFkYihjdHJsX2FkZHIpICYgTVhDX1cxX0NPTlRST0xfV1IoYml0KSkpCiAJCQlicmVhazsKIAogCQl1ZGVsYXkoMSk7CiAJfQogCi0JcmV0dXJuICgoX19yYXdfcmVhZGIoY3RybF9hZGRyKSkgPj4gMykgJiAweDE7CisJcmV0dXJuICEhKHJlYWRiKGN0cmxfYWRkcikgJiBNWENfVzFfQ09OVFJPTF9SRFNUKTsKIH0KIAogc3RhdGljIGludCBteGNfdzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTEzOSw3ICsxMzEsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlfX3Jhd193cml0ZWIoY2xrZGl2IC0gMSwgbWRldi0+cmVncyArIE1YQ19XMV9USU1FX0RJVklERVIpOworCXdyaXRlYihjbGtkaXYgLSAxLCBtZGV2LT5yZWdzICsgTVhDX1cxX1RJTUVfRElWSURFUik7CiAKIAltZGV2LT5idXNfbWFzdGVyLmRhdGEgPSBtZGV2OwogCW1kZXYtPmJ1c19tYXN0ZXIucmVzZXRfYnVzID0gbXhjX3cxX2RzMl9yZXNldF9idXM7CkBAIC0xNzcsNiArMTY5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14Y193MV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibXhjX3cxIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG14Y193MV9kdF9pZHMsCiAJfSwKIAkucHJvYmUgPSBteGNfdzFfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvdzEtZ3Bpby5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL3cxLWdwaW8uYwppbmRleCA5NzA5YjhiLi4xZDExMWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvdzEtZ3Bpby5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy93MS1ncGlvLmMKQEAgLTg5LDExICs4OSwyMiBAQAogCQlwZGF0YS0+aXNfb3Blbl9kcmFpbiA9IDE7CiAKIAlncGlvID0gb2ZfZ2V0X2dwaW8obnAsIDApOwotCWlmIChncGlvIDwgMCkKKwlpZiAoZ3BpbyA8IDApIHsKKwkJaWYgKGdwaW8gIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBwYXJzZSBncGlvIHByb3BlcnR5IGZvciBkYXRhIHBpbiAoJWQpXG4iLAorCQkJCQlncGlvKTsKKwogCQlyZXR1cm4gZ3BpbzsKKwl9CiAJcGRhdGEtPnBpbiA9IGdwaW87CiAKLQlwZGF0YS0+ZXh0X3B1bGx1cF9lbmFibGVfcGluID0gb2ZfZ2V0X2dwaW8obnAsIDEpOworCWdwaW8gPSBvZl9nZXRfZ3BpbyhucCwgMSk7CisJaWYgKGdwaW8gPT0gLUVQUk9CRV9ERUZFUikKKwkJcmV0dXJuIGdwaW87CisJLyogaWdub3JlIG90aGVyIGVycm9ycyBhcyB0aGUgcHVsbHVwIGdwaW8gaXMgb3B0aW9uYWwgKi8KKwlwZGF0YS0+ZXh0X3B1bGx1cF9lbmFibGVfcGluID0gZ3BpbzsKKwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAKIAlyZXR1cm4gMDsKQEAgLTEwNywxMCArMTE4LDggQEAKIAogCWlmIChvZl9oYXZlX3BvcHVsYXRlZF9kdCgpKSB7CiAJCWVyciA9IHcxX2dwaW9fcHJvYmVfZHQocGRldik7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgRFRcbiIpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7Ci0JCX0KIAl9CiAKIAlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnIGIvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwppbmRleCA1ZTZhM2M5Li4xY2RjZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKQEAgLTcyLDcgKzcyLDYgQEAKIAogY29uZmlnIFcxX1NMQVZFX0RTMjc2MAogCXRyaXN0YXRlICJEYWxsYXMgMjc2MCBiYXR0ZXJ5IG1vbml0b3IgY2hpcCAoSFAgaVBBUSAmIG90aGVycykiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3NjAgYmF0dGVyeSBtb25pdG9yCiAJICBjaGlwIHN1cHBvcnQuCkBAIC04NSw3ICs4NCw2IEBACiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI3ODAKIAl0cmlzdGF0ZSAiRGFsbGFzIDI3ODAgYmF0dGVyeSBtb25pdG9yIGNoaXAiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3ODAgYmF0dGVyeSBtb25pdG9yCiAJICBjaGlwIHN1cHBvcnQuCkBAIC05OCw3ICs5Niw2IEBACiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI3ODEKIAl0cmlzdGF0ZSAiRGFsbGFzIDI3ODEgYmF0dGVyeSBtb25pdG9yIGNoaXAiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3ODEgYmF0dGVyeSBtb25pdG9yCiAJICBjaGlwIHN1cHBvcnQuCkBAIC0xMTEsNyArMTA4LDYgQEAKIAogY29uZmlnIFcxX1NMQVZFX0RTMjhFMDQKIAl0cmlzdGF0ZSAiNDA5Ni1CaXQgQWRkcmVzc2FibGUgMS1XaXJlIEVFUFJPTSB3aXRoIFBJTyAoRFMyOEUwNC0xMDApIgotCWRlcGVuZHMgb24gVzEKIAlzZWxlY3QgQ1JDMTYKIAloZWxwCiAJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgaGF2ZSB0aGUgRFMyOEUwNC0xMDAKQEAgLTEyNCw3ICsxMjAsNiBAQAogCiBjb25maWcgVzFfU0xBVkVfQlEyNzAwMAogCXRyaXN0YXRlICJCUTI3MDAwIHNsYXZlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgaGRxCiAJICBicTI3MDAwIHNsYXZlIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwppbmRleCA4YjVmZjMzLi4xZjExYTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlICIuLi93MS5oIgpAQCAtNTgsNiArNTksMTkgQEAKIHN0YXRpYyBpbnQgdzFfc3Ryb25nX3B1bGx1cCA9IDE7CiBtb2R1bGVfcGFyYW1fbmFtZWQoc3Ryb25nX3B1bGx1cCwgdzFfc3Ryb25nX3B1bGx1cCwgaW50LCAwKTsKIAorc3RhdGljIGludCB3MV90aGVybV9hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlzbC0+ZmFtaWx5X2RhdGEgPSBremFsbG9jKDksIEdGUF9LRVJORUwpOworCWlmICghc2wtPmZhbWlseV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdzFfdGhlcm1fcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJa2ZyZWUoc2wtPmZhbWlseV9kYXRhKTsKKwlzbC0+ZmFtaWx5X2RhdGEgPSBOVUxMOworfQogCiBzdGF0aWMgc3NpemVfdCB3MV9zbGF2ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKQEAgLTcxLDYgKzg1LDggQEAKIEFUVFJJQlVURV9HUk9VUFModzFfdGhlcm0pOwogCiBzdGF0aWMgc3RydWN0IHcxX2ZhbWlseV9vcHMgdzFfdGhlcm1fZm9wcyA9IHsKKwkuYWRkX3NsYXZlCT0gdzFfdGhlcm1fYWRkX3NsYXZlLAorCS5yZW1vdmVfc2xhdmUJPSB3MV90aGVybV9yZW1vdmVfc2xhdmUsCiAJLmdyb3VwcwkJPSB3MV90aGVybV9ncm91cHMsCiB9OwogCkBAIC0yNTMsMTIgKzI2OSwxMyBAQAogCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIjogY3JjPSUwMnggJXNcbiIsCiAJCQkgICBjcmMsICh2ZXJkaWN0KSA/ICJZRVMiIDogIk5PIik7CiAJaWYgKHZlcmRpY3QpCi0JCW1lbWNweShzbC0+cm9tLCByb20sIHNpemVvZihzbC0+cm9tKSk7CisJCW1lbWNweShzbC0+ZmFtaWx5X2RhdGEsIHJvbSwgc2l6ZW9mKHJvbSkpOwogCWVsc2UKIAkJZGV2X3dhcm4oZGV2aWNlLCAiUmVhZCBmYWlsZWQgQ1JDIGNoZWNrXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpCi0JCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIiUwMnggIiwgc2wtPnJvbVtpXSk7CisJCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIiUwMnggIiwKKwkJCSAgICAgICgodTggKilzbC0+ZmFtaWx5X2RhdGEpW2ldKTsKIAogCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgInQ9JWRcbiIsCiAJCXcxX2NvbnZlcnRfdGVtcChyb20sIHNsLT5mYW1pbHktPmZpZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IDY2ZWZhOTYuLmI5NmY2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTQ2LDE4ICs0NiwyOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIDEtd2lyZSBEYWxsYXMgbmV0d29yayBwcm90b2NvbC4iKTsKIAogc3RhdGljIGludCB3MV90aW1lb3V0ID0gMTA7Ci1pbnQgdzFfbWF4X3NsYXZlX2NvdW50ID0gMTA7CitpbnQgdzFfbWF4X3NsYXZlX2NvdW50ID0gNjQ7CiBpbnQgdzFfbWF4X3NsYXZlX3R0bCA9IDEwOwogCiBtb2R1bGVfcGFyYW1fbmFtZWQodGltZW91dCwgdzFfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInRpbWUgaW4gc2Vjb25kcyBiZXR3ZWVuIGF1dG9tYXRpYyBzbGF2ZSBzZWFyY2hlcyIpOworLyogQSBzZWFyY2ggc3RvcHMgd2hlbiB3MV9tYXhfc2xhdmVfY291bnQgZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQgaW4gdGhhdAorICogc2VhcmNoLiAgVGhlIG5leHQgc2VhcmNoIHdpbGwgc3RhcnQgb3ZlciBhbmQgZGV0ZWN0IHRoZSBzYW1lIHNldCBvZiBkZXZpY2VzCisgKiBvbiBhIHN0YXRpYyAxLXdpcmUgYnVzLiAgTWVtb3J5IGlzIG5vdCBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBudW1iZXIsIGp1c3QKKyAqIG9uIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBrbm93biB0byB0aGUga2VybmVsLiAgSGF2aW5nIGEgaGlnaCBudW1iZXIgZG9lcyBub3QKKyAqIGNvbnN1bWUgYWRkaXRpb25hbCByZXNvdXJjZXMuICBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhlcmUgaXMgb25seSBvbmUKKyAqIGRldmljZSBvbiB0aGUgbmV0d29yayBhbmQgdzFfbWF4X3NsYXZlX2NvdW50IGlzIHNldCB0byAxLCB0aGUgZGV2aWNlIGlkIGNhbgorICogYmUgcmVhZCBkaXJlY3RseSBza2lwcGluZyB0aGUgbm9ybWFsIHNsb3dlciBzZWFyY2ggcHJvY2Vzcy4KKyAqLwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9zbGF2ZV9jb3VudCwgdzFfbWF4X3NsYXZlX2NvdW50LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2xhdmVfY291bnQsCisJIm1heGltdW0gbnVtYmVyIG9mIHNsYXZlcyBkZXRlY3RlZCBpbiBhIHNlYXJjaCIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHNsYXZlX3R0bCwgdzFfbWF4X3NsYXZlX3R0bCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2xhdmVfdHRsLAorCSJOdW1iZXIgb2Ygc2VhcmNoZXMgbm90IHNlZWluZyBhIHNsYXZlIGJlZm9yZSBpdCB3aWxsIGJlIHJlbW92ZWQiKTsKIAogREVGSU5FX01VVEVYKHcxX21sb2NrKTsKIExJU1RfSEVBRCh3MV9tYXN0ZXJzKTsKIAotc3RhdGljIGludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKLQogc3RhdGljIGludCB3MV9tYXN0ZXJfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewogCXJldHVybiAxOwpAQCAtODEsMTkgKzkyLDEwIEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGRldl90b193MV9zbGF2ZShkZXYpOwogCi0JZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lKTsKLQotCXdoaWxlIChhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpIHsKLQkJZGV2X2RiZyhkZXYsICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKLQkJCQlzbC0+bmFtZSwgYXRvbWljX3JlYWQoJnNsLT5yZWZjbnQpKTsKLQkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKQotCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKLQl9CisJZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzIFslcF1cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSwgc2wpOwogCiAJdzFfZmFtaWx5X3B1dChzbC0+ZmFtaWx5KTsKIAlzbC0+bWFzdGVyLT5zbGF2ZV9jb3VudC0tOwotCi0JY29tcGxldGUoJnNsLT5yZWxlYXNlZCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG5hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0yNDMsNyArMjQ1LDkgQEAKIAltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCW1kLT5zZWFyY2hfY291bnQgPSB0bXA7CiAJbXV0ZXhfdW5sb2NrKCZtZC0+bXV0ZXgpOwotCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKKwkvKiBPbmx5IHdha2UgaWYgaXQgaXMgZ29pbmcgdG8gYmUgc2VhcmNoaW5nLiAqLworCWlmICh0bXApCisJCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTI3Nyw3ICsyODEsNiBAQAogCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CiAJbWQtPmVuYWJsZV9wdWxsdXAgPSB0bXA7CiAJbXV0ZXhfdW5sb2NrKCZtZC0+bXV0ZXgpOwotCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTMxNCw2ICszMTcsMjQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc3RvcmVfbWF4X3NsYXZlX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHRtcDsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKKworCWlmIChrc3RydG9pbnQoYnVmLCAwLCAmdG1wKSA9PSAtRUlOVkFMIHx8IHRtcCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWQtPm11dGV4KTsKKwltZC0+bWF4X3NsYXZlX2NvdW50ID0gdG1wOworCS8qIGFsbG93IGVhY2ggdGltZSB0aGUgbWF4X3NsYXZlX2NvdW50IGlzIHVwZGF0ZWQgKi8KKwljbGVhcl9iaXQoVzFfV0FSTl9NQVhfQ09VTlQsICZtZC0+ZmxhZ3MpOworCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X21heF9zbGF2ZV9jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CkBAIC0zNTIsMjMgKzM3MywyMCBAQAogewogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCWludCBjID0gUEFHRV9TSVpFOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IE5VTEw7CiAKLQltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOworCW11dGV4X2xvY2soJm1kLT5saXN0X211dGV4KTsKIAotCWlmIChtZC0+c2xhdmVfY291bnQgPT0gMCkKLQkJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAibm90IGZvdW5kLlxuIik7Ci0JZWxzZSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47Ci0JCXN0cnVjdCB3MV9zbGF2ZSAqc2w7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudCwgbiwgJm1kLT5zbGlzdCkgeworCQlzbCA9IGxpc3RfZW50cnkoZW50LCBzdHJ1Y3QgdzFfc2xhdmUsIHcxX3NsYXZlX2VudHJ5KTsKIAotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50LCBuLCAmbWQtPnNsaXN0KSB7Ci0JCQlzbCA9IGxpc3RfZW50cnkoZW50LCBzdHJ1Y3QgdzFfc2xhdmUsIHcxX3NsYXZlX2VudHJ5KTsKLQotCQkJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAiJXNcbiIsIHNsLT5uYW1lKTsKLQkJfQorCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICIlc1xuIiwgc2wtPm5hbWUpOwogCX0KKwlpZiAoIXNsKQorCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICJub3QgZm91bmQuXG4iKTsKIAotCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5saXN0X211dGV4KTsKIAogCXJldHVybiBQQUdFX1NJWkUgLSBjOwogfQpAQCAtNDIyLDE5ICs0NDAsMjIgQEAKIH0KIAogLyogU2VhcmNoZXMgdGhlIHNsYXZlcyBpbiB0aGUgdzFfbWFzdGVyIGFuZCByZXR1cm5zIGEgcG9pbnRlciBvciBOVUxMLgotICogTm90ZTogbXVzdCBob2xkIHRoZSBtdXRleAorICogTm90ZTogbXVzdCBub3QgaG9sZCBsaXN0X211dGV4CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdzFfc2xhdmUgKncxX3NsYXZlX3NlYXJjaF9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LAorc3RydWN0IHcxX3NsYXZlICp3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwKIAlzdHJ1Y3QgdzFfcmVnX251bSAqcm4pCiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbDsKKwltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewogCQlpZiAoc2wtPnJlZ19udW0uZmFtaWx5ID09IHJuLT5mYW1pbHkgJiYKIAkJCQlzbC0+cmVnX251bS5pZCA9PSBybi0+aWQgJiYKIAkJCQlzbC0+cmVnX251bS5jcmMgPT0gcm4tPmNyYykgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCQkJcmV0dXJuIHNsOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNDkxLDcgKzUxMiwxMCBAQAogCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CiAJc2wgPSB3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKG1kLCAmcm4pOwogCWlmIChzbCkgewotCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCQlyZXN1bHQgPSB3MV9zbGF2ZV9kZXRhY2goc2wpOworCQkvKiByZWZjbnQgMCBtZWFucyBpdCB3YXMgZGV0YWNoZWQgaW4gdGhlIGNhbGwgKi8KKwkJaWYgKHJlc3VsdCA9PSAwKQorCQkJcmVzdWx0ID0gY291bnQ7CiAJfSBlbHNlIHsKIAkJZGV2X2luZm8oZGV2LCAiRGV2aWNlICUwMngtJTAxMmxseCBkb2Vzbid0IGV4aXN0c1xuIiwgcm4uZmFtaWx5LAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylybi5pZCk7CkBAIC01MTYsNyArNTQwLDcgQEAKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhuYW1lLCBTX0lSVUdPKTsKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhzbGF2ZXMsIFNfSVJVR08pOwogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JPKHNsYXZlX2NvdW50LCBTX0lSVUdPKTsKLXN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhtYXhfc2xhdmVfY291bnQsIFNfSVJVR08pOworc3RhdGljIFcxX01BU1RFUl9BVFRSX1JXKG1heF9zbGF2ZV9jb3VudCwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQKTsKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhhdHRlbXB0cywgU19JUlVHTyk7CiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8odGltZW91dCwgU19JUlVHTyk7CiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8ocG9pbnRlciwgU19JUlVHTyk7CkBAIC02ODYsMTIgKzcxMCwxNCBAQAogCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKCZzbC0+ZGV2LCBmYWxzZSk7CiAJa29iamVjdF91ZXZlbnQoJnNsLT5kZXYua29iaiwgS09CSl9BREQpOwogCisJbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmc2wtPncxX3NsYXZlX2VudHJ5LCAmc2wtPm1hc3Rlci0+c2xpc3QpOworCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKQoraW50IHcxX2F0dGFjaF9zbGF2ZV9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfcmVnX251bSAqcm4pCiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbDsKIAlzdHJ1Y3QgdzFfZmFtaWx5ICpmOwpAQCAtNzEzLDggKzczOSw4IEBACiAKIAltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogCW1lbWNweSgmc2wtPnJlZ19udW0sIHJuLCBzaXplb2Yoc2wtPnJlZ19udW0pKTsKLQlhdG9taWNfc2V0KCZzbC0+cmVmY250LCAwKTsKLQlpbml0X2NvbXBsZXRpb24oJnNsLT5yZWxlYXNlZCk7CisJYXRvbWljX3NldCgmc2wtPnJlZmNudCwgMSk7CisJYXRvbWljX2luYygmc2wtPm1hc3Rlci0+cmVmY250KTsKIAogCS8qIHNsYXZlIG1vZHVsZXMgbmVlZCB0byBiZSBsb2FkZWQgaW4gYSBjb250ZXh0IHdpdGggdW5sb2NrZWQgbXV0ZXggKi8KIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwpAQCAtNzU0LDIzICs3ODAsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3MV9zbGF2ZV9kZXRhY2goc3RydWN0IHcxX3NsYXZlICpzbCkKK2ludCB3MV91bnJlZl9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewotCXN0cnVjdCB3MV9uZXRsaW5rX21zZyBtc2c7CisJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gc2wtPm1hc3RlcjsKKwlpbnQgcmVmY250OworCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJcmVmY250ID0gYXRvbWljX3N1Yl9yZXR1cm4oMSwgJnNsLT5yZWZjbnQpOworCWlmIChyZWZjbnQgPT0gMCkgeworCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOwogCi0JZGV2X2RiZygmc2wtPmRldiwgIiVzOiBkZXRhY2hpbmcgJXMgWyVwXS5cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSwgc2wpOworCQlkZXZfZGJnKCZzbC0+ZGV2LCAiJXM6IGRldGFjaGluZyAlcyBbJXBdLlxuIiwgX19mdW5jX18sCisJCQlzbC0+bmFtZSwgc2wpOwogCi0JbGlzdF9kZWwoJnNsLT53MV9zbGF2ZV9lbnRyeSk7CisJCWxpc3RfZGVsKCZzbC0+dzFfc2xhdmVfZW50cnkpOwogCi0JbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKLQltZW1jcHkobXNnLmlkLmlkLCAmc2wtPnJlZ19udW0sIHNpemVvZihtc2cuaWQpKTsKLQltc2cudHlwZSA9IFcxX1NMQVZFX1JFTU9WRTsKLQl3MV9uZXRsaW5rX3NlbmQoc2wtPm1hc3RlciwgJm1zZyk7CisJCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJCW1lbWNweShtc2cuaWQuaWQsICZzbC0+cmVnX251bSwgc2l6ZW9mKG1zZy5pZCkpOworCQltc2cudHlwZSA9IFcxX1NMQVZFX1JFTU9WRTsKKwkJdzFfbmV0bGlua19zZW5kKHNsLT5tYXN0ZXIsICZtc2cpOwogCi0JZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOworCQlkZXZpY2VfdW5yZWdpc3Rlcigmc2wtPmRldik7CisJCSNpZmRlZiBERUJVRworCQltZW1zZXQoc2wsIDAsIHNpemVvZigqc2wpKTsKKwkJI2VuZGlmCisJCWtmcmVlKHNsKTsKKwl9CisJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOworCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKKwlyZXR1cm4gcmVmY250OworfQogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmc2wtPnJlbGVhc2VkKTsKLQlrZnJlZShzbCk7CitpbnQgdzFfc2xhdmVfZGV0YWNoKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJLyogT25seSBkZXRhY2ggYSBzbGF2ZSBvbmNlIGFzIGl0IGRlY3JlYXNlcyB0aGUgcmVmY250IGVhY2ggdGltZS4gKi8KKwlpbnQgZGVzdHJveV9ub3c7CisJbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CisJZGVzdHJveV9ub3cgPSAhdGVzdF9iaXQoVzFfU0xBVkVfREVUQUNILCAmc2wtPmZsYWdzKTsKKwlzZXRfYml0KFcxX1NMQVZFX0RFVEFDSCwgJnNsLT5mbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZzbC0+bWFzdGVyLT5saXN0X211dGV4KTsKKworCWlmIChkZXN0cm95X25vdykKKwkJZGVzdHJveV9ub3cgPSAhdzFfdW5yZWZfc2xhdmUoc2wpOworCXJldHVybiBkZXN0cm95X25vdyA/IDAgOiAtRUJVU1k7CiB9CiAKIHN0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKQpAQCAtNzk5LDcgKzg1MCw3IEBACiAKIAltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewogCQkJaWYgKHNsLT5yZWdfbnVtLmZhbWlseSA9PSBpZC0+ZmFtaWx5ICYmCiAJCQkJCXNsLT5yZWdfbnVtLmlkID09IGlkLT5pZCAmJgpAQCAtODEwLDcgKzg2MSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCiAJCWlmIChmb3VuZCkKIAkJCWJyZWFrOwpAQCAtODMwLDYgKzg4MSw3IEBACiAJCWRldl9kYmcoJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiBkZXZpY2UgJXMgIgogCQkJImZvciBmYW1pbHkgJTAyeC5cbiIsIGRldi0+bmFtZSwgZi0+ZmlkKTsKIAkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKIAkJCS8qIElmIGl0IGlzIGEgbmV3IGZhbWlseSwgc2xhdmVzIHdpdGggdGhlIGRlZmF1bHQKIAkJCSAqIGZhbWlseSBkcml2ZXIgYW5kIGFyZSB0aGF0IGZhbWlseSB3aWxsIGJlCkBAIC04NDEsMTQgKzg5MywxOSBAQAogCQkJCSghYXR0YWNoICYmIHNsLT5mYW1pbHktPmZpZCA9PSBmLT5maWQpKSB7CiAJCQkJc3RydWN0IHcxX3JlZ19udW0gcm47CiAKKwkJCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKLQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwotCi0JCQkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsICZybik7CisJCQkJLyogSWYgaXQgd2FzIGFscmVhZHkgaW4gdXNlIGxldCB0aGUgYXV0b21hdGljCisJCQkJICogc2NhbiBwaWNrIGl0IHVwIGFnYWluIGxhdGVyLgorCQkJCSAqLworCQkJCWlmICghdzFfc2xhdmVfZGV0YWNoKHNsKSkKKwkJCQkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsICZybik7CisJCQkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJCX0KIAkJfQogCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzICIKIAkJCSJoYXMgYmVlbiBmaW5pc2hlZC5cbiIsIGRldi0+bmFtZSk7CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CkBAIC04NzYsNyArOTMzLDEyIEBACiB9CiAKIC8qKgotICogUGVyZm9ybXMgYSBST00gU2VhcmNoICYgcmVnaXN0ZXJzIGFueSBkZXZpY2VzIGZvdW5kLgorICogdzFfc2VhcmNoKCkgLSBQZXJmb3JtcyBhIFJPTSBTZWFyY2ggJiByZWdpc3RlcnMgYW55IGRldmljZXMgZm91bmQuCisgKiBAZGV2OiBUaGUgbWFzdGVyIGRldmljZSB0byBzZWFyY2gKKyAqIEBzZWFyY2hfdHlwZTogVzFfU0VBUkNIIHRvIHNlYXJjaCBhbGwgZGV2aWNlcywgb3IgVzFfQUxBUk1fU0VBUkNICisgKiB0byByZXR1cm4gb25seSBkZXZpY2VzIGluIHRoZSBhbGFybWVkIHN0YXRlCisgKiBAY2I6IEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIGRldmljZSBpcyBmb3VuZAorICoKICAqIFRoZSAxLXdpcmUgc2VhcmNoIGlzIGEgc2ltcGxlIGJpbmFyeSB0cmVlIHNlYXJjaC4KICAqIEZvciBlYWNoIGJpdCBvZiB0aGUgYWRkcmVzcywgd2UgcmVhZCB0d28gYml0cyBhbmQgd3JpdGUgb25lIGJpdC4KICAqIFRoZSBiaXQgd3JpdHRlbiB3aWxsIHB1dCB0byBzbGVlcCBhbGwgZGV2aWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhhdCBiaXQuCkBAIC04ODYsOCArOTQ4LDYgQEAKICAqCiAgKiBTZWUgIkFwcGxpY2F0aW9uIG5vdGUgMTg3IDEtd2lyZSBzZWFyY2ggYWxnb3JpdGhtIiBhdCB3d3cubWF4aW0taWMuY29tCiAgKgotICogQGRldiAgICAgICAgVGhlIG1hc3RlciBkZXZpY2UgdG8gc2VhcmNoCi0gKiBAY2IgICAgICAgICBGdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZm91bmQKICAqLwogdm9pZCB3MV9zZWFyY2goc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpCiB7CkBAIC04OTgsNyArOTU4LDggQEAKIAl1OCAgdHJpcGxldF9yZXQgPSAwOwogCiAJc2VhcmNoX2JpdCA9IDA7Ci0Jcm4gPSBsYXN0X3JuID0gMDsKKwlybiA9IGRldi0+c2VhcmNoX2lkOworCWxhc3Rfcm4gPSAwOwogCWxhc3RfZGV2aWNlID0gMDsKIAlsYXN0X3plcm8gPSAtMTsKIApAQCAtOTQ1LDcgKzEwMDYsNyBAQAogCQkJZWxzZQogCQkJCXNlYXJjaF9iaXQgPSAoKGxhc3Rfcm4gPj4gaSkgJiAweDEpOwogCi0JCQkvKiogUmVhZCB0d28gYml0cyBhbmQgd3JpdGUgb25lIGJpdCAqLworCQkJLyogUmVhZCB0d28gYml0cyBhbmQgd3JpdGUgb25lIGJpdCAqLwogCQkJdHJpcGxldF9yZXQgPSB3MV90cmlwbGV0KGRldiwgc2VhcmNoX2JpdCk7CiAKIAkJCS8qIHF1aXQgaWYgbm8gZGV2aWNlIHJlc3BvbmRlZCAqLwpAQCAtOTYwLDggKzEwMjEsNyBAQAogCQkJdG1wNjQgPSAodHJpcGxldF9yZXQgPj4gMik7CiAJCQlybiB8PSAodG1wNjQgPDwgaSk7CiAKLQkJCS8qIGVuc3VyZSB3ZSdyZSBjYWxsZWQgZnJvbSBrdGhyZWFkIGFuZCBub3QgYnkgbmV0bGluayBjYWxsYmFjayAqLwotCQkJaWYgKCFkZXYtPnByaXYgJiYga3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQlpZiAodGVzdF9iaXQoVzFfQUJPUlRfU0VBUkNILCAmZGV2LT5mbGFncykpIHsKIAkJCQltdXRleF91bmxvY2soJmRldi0+YnVzX211dGV4KTsKIAkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIkFib3J0IHcxX3NlYXJjaFxuIik7CiAJCQkJcmV0dXJuOwpAQCAtOTcwLDExICsxMDMwLDMwIEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOwogCiAJCWlmICggKHRyaXBsZXRfcmV0ICYgMHgwMykgIT0gMHgwMyApIHsKLQkJCWlmICggKGRlc2NfYml0ID09IGxhc3RfemVybykgfHwgKGxhc3RfemVybyA8IDApKQorCQkJaWYgKChkZXNjX2JpdCA9PSBsYXN0X3plcm8pIHx8IChsYXN0X3plcm8gPCAwKSkgewogCQkJCWxhc3RfZGV2aWNlID0gMTsKKwkJCQlkZXYtPnNlYXJjaF9pZCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWRldi0+c2VhcmNoX2lkID0gcm47CisJCQl9CiAJCQlkZXNjX2JpdCA9IGxhc3RfemVybzsKIAkJCWNiKGRldiwgcm4pOwogCQl9CisKKwkJaWYgKCFsYXN0X2RldmljZSAmJiBzbGF2ZV9jb3VudCA9PSBkZXYtPm1heF9zbGF2ZV9jb3VudCAmJgorCQkJIXRlc3RfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmZGV2LT5mbGFncykpIHsKKwkJCS8qIE9ubHkgbWF4X3NsYXZlX2NvdW50IHdpbGwgYmUgc2Nhbm5lZCBpbiBhIHNlYXJjaCwKKwkJCSAqIGJ1dCBpdCB3aWxsIHN0YXJ0IHdoZXJlIGl0IGxlZnQgb2ZmIG5leHQgc2VhcmNoCisJCQkgKiB1bnRpbCBhbGwgaWRzIGFyZSBpZGVudGlmaWVkIGFuZCB0aGVuIGl0IHdpbGwgc3RhcnQKKwkJCSAqIG92ZXIuICBBIGNvbnRpbnVlZCBzZWFyY2ggd2lsbCByZXBvcnQgdGhlIHByZXZpb3VzCisJCQkgKiBsYXN0IGlkIGFzIHRoZSBmaXJzdCBpZCAocHJvdmlkZWQgaXQgaXMgc3RpbGwgb24gdGhlCisJCQkgKiBidXMpLgorCQkJICovCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICIlczogbWF4X3NsYXZlX2NvdW50ICVkIHJlYWNoZWQsICIKKwkJCQkid2lsbCBjb250aW51ZSBuZXh0IHNlYXJjaC5cbiIsIF9fZnVuY19fLAorCQkJCWRldi0+bWF4X3NsYXZlX2NvdW50KTsKKwkJCXNldF9iaXQoVzFfV0FSTl9NQVhfQ09VTlQsICZkZXYtPmZsYWdzKTsKKwkJfQogCX0KIH0KIApAQCAtOTgzLDE3ICsxMDYyLDI0IEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCwgKnNsbjsKIAorCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzbCwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KQogCQljbGVhcl9iaXQoVzFfU0xBVkVfQUNUSVZFLCAmc2wtPmZsYWdzKTsKKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAKIAl3MV9zZWFyY2hfZGV2aWNlcyhkZXYsIHNlYXJjaF90eXBlLCBjYik7CiAKKwltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKLQkJaWYgKCF0ZXN0X2JpdChXMV9TTEFWRV9BQ1RJVkUsICZzbC0+ZmxhZ3MpICYmICEtLXNsLT50dGwpCisJCWlmICghdGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAmc2wtPmZsYWdzKSAmJiAhLS1zbC0+dHRsKSB7CisJCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCQkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwkJfQogCQllbHNlIGlmICh0ZXN0X2JpdChXMV9TTEFWRV9BQ1RJVkUsICZzbC0+ZmxhZ3MpKQogCQkJc2wtPnR0bCA9IGRldi0+c2xhdmVfdHRsOwogCX0KKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAKIAlpZiAoZGV2LT5zZWFyY2hfY291bnQgPiAwKQogCQlkZXYtPnNlYXJjaF9jb3VudC0tOwpAQCAtMTAwNCw2ICsxMDkwLDMyIEBACiAJdzFfc2VhcmNoX3Byb2Nlc3NfY2IoZGV2LCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmQpOwogfQogCisvKioKKyAqIHcxX3Byb2Nlc3NfY2FsbGJhY2tzKCkgLSBleGVjdXRlIGVhY2ggZGV2LT5hc3luY19saXN0IGNhbGxiYWNrIGVudHJ5CisgKiBAZGV2OiB3MV9tYXN0ZXIgZGV2aWNlCisgKgorICogUmV0dXJuOiAxIGlmIHRoZXJlIHdlcmUgY29tbWFuZHMgdG8gZXhlY3V0ZWQgMCBvdGhlcndpc2UKKyAqLworaW50IHcxX3Byb2Nlc3NfY2FsbGJhY2tzKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdzFfYXN5bmNfY21kICphc3luY19jbWQsICphc3luY19uOworCisJLyogVGhlIGxpc3QgY2FuIGJlIGFkZGVkIHRvIGluIGFub3RoZXIgdGhyZWFkLCBsb29wIHVudGlsIGl0IGlzIGVtcHR5ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPmFzeW5jX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhc3luY19jbWQsIGFzeW5jX24sICZkZXYtPmFzeW5jX2xpc3QsCisJCQlhc3luY19lbnRyeSkgeworCQkJLyogZHJvcCB0aGUgbG9jaywgaWYgaXQgaXMgYSBzZWFyY2ggaXQgY2FuIHRha2UgYSBsb25nCisJCQkgKiB0aW1lICovCisJCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCQlhc3luY19jbWQtPmNiKGRldiwgYXN5bmNfY21kKTsKKwkJCXJldCA9IDE7CisJCQltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKIGludCB3MV9wcm9jZXNzKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gKHN0cnVjdCB3MV9tYXN0ZXIgKikgZGF0YTsKQEAgLTEwMTEsMjMgKzExMjMsNDYgQEAKIAkgKiB0aW1lIGNhbiBiZSBjYWxjdWxhdGVkIGluIGppZmZpZXMgb25jZS4KIAkgKi8KIAljb25zdCB1bnNpZ25lZCBsb25nIGp0aW1lID0gbXNlY3NfdG9famlmZmllcyh3MV90aW1lb3V0ICogMTAwMCk7CisJLyogcmVtYWluZGVyIGlmIGl0IHdva2UgdXAgZWFybHkgKi8KKwl1bnNpZ25lZCBsb25nIGpyZW1haW4gPSAwOwogCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJaWYgKGRldi0+c2VhcmNoX2NvdW50KSB7CisJZm9yICg7OykgeworCisJCWlmICghanJlbWFpbiAmJiBkZXYtPnNlYXJjaF9jb3VudCkgewogCQkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CiAJCQl3MV9zZWFyY2hfcHJvY2VzcyhkZXYsIFcxX1NFQVJDSCk7CiAJCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCQl9CiAKKwkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwkJLyogTm90ZSwgdzFfcHJvY2Vzc19jYWxsYmFjayBkcm9wcyB0aGUgbG9jayB3aGlsZSBwcm9jZXNzaW5nLAorCQkgKiBidXQgbG9ja3MgaXQgYWdhaW4gYmVmb3JlIHJldHVybmluZy4KKwkJICovCisJCWlmICghdzFfcHJvY2Vzc19jYWxsYmFja3MoZGV2KSAmJiBqcmVtYWluKSB7CisJCQkvKiBhIHdha2UgdXAgaXMgZWl0aGVyIHRvIHN0b3AgdGhlIHRocmVhZCwgcHJvY2VzcworCQkJICogY2FsbGJhY2tzLCBvciBzZWFyY2gsIGl0IGlzbid0IHByb2Nlc3MgY2FsbGJhY2tzLCBzbworCQkJICogc2NoZWR1bGUgYSBzZWFyY2guCisJCQkgKi8KKwkJCWpyZW1haW4gPSAxOworCQl9CisKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKKwkJLyogaG9sZCBsaXN0X211dGV4IHVudGlsIGFmdGVyIGludGVycnVwdGlibGUgdG8gcHJldmVudCBsb29zaW5nCisJCSAqIHRoZSB3YWtldXAgc2lnbmFsIHdoZW4gYXN5bmNfY21kIGlzIGFkZGVkLgorCQkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAogCQkvKiBPbmx5IHNsZWVwIHdoZW4gdGhlIHNlYXJjaCBpcyBhY3RpdmUuICovCi0JCWlmIChkZXYtPnNlYXJjaF9jb3VudCkKLQkJCXNjaGVkdWxlX3RpbWVvdXQoanRpbWUpOworCQlpZiAoZGV2LT5zZWFyY2hfY291bnQpIHsKKwkJCWlmICghanJlbWFpbikKKwkJCQlqcmVtYWluID0ganRpbWU7CisJCQlqcmVtYWluID0gc2NoZWR1bGVfdGltZW91dChqcmVtYWluKTsKKwkJfQogCQllbHNlCiAJCQlzY2hlZHVsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuaCBiL2RyaXZlcnMvdzEvdzEuaAppbmRleCBjYTgwODFhLi43MzRkYWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmgKKysrIGIvZHJpdmVycy93MS93MS5oCkBAIC0yMiw2ICsyMiwxMyBAQAogI2lmbmRlZiBfX1cxX0gKICNkZWZpbmUgX19XMV9ICiAKKy8qKgorICogc3RydWN0IHcxX3JlZ19udW0gLSBicm9rZW4gb3V0IHNsYXZlIGRldmljZSBpZAorICoKKyAqIEBmYW1pbHk6IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZGV2aWNlCisgKiBAaWQ6IGFsb25nIHdpdGggZmFtaWx5IGlzIHRoZSB1bmlxdWUgZGV2aWNlIGlkCisgKiBAY3JjOiBjaGVja3N1bSBvZiB0aGUgb3RoZXIgYnl0ZXMKKyAqLwogc3RydWN0IHcxX3JlZ19udW0KIHsKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKQEAgLTU4LDcgKzY1LDI0IEBACiAjZGVmaW5lIFcxX1JFU1VNRV9DTUQJCTB4QTUKIAogI2RlZmluZSBXMV9TTEFWRV9BQ1RJVkUJCTAKKyNkZWZpbmUgVzFfU0xBVkVfREVUQUNICQkxCiAKKy8qKgorICogc3RydWN0IHcxX3NsYXZlIC0gaG9sZHMgYSBzaW5nbGUgc2xhdmUgZGV2aWNlIG9uIHRoZSBidXMKKyAqCisgKiBAb3duZXI6IFBvaW50cyB0byB0aGUgb25lIHdpcmUgIndpcmUiIGtlcm5lbCBtb2R1bGUuCisgKiBAbmFtZTogRGV2aWNlIGlkIGlzIGFzY2lpLgorICogQHcxX3NsYXZlX2VudHJ5OiBkYXRhIGZvciB0aGUgbGlua2VkIGxpc3QKKyAqIEByZWdfbnVtOiB0aGUgc2xhdmUgaWQgaW4gYmluYXJ5CisgKiBAcmVmY250OiByZWZlcmVuY2UgY291bnQsIGRlbGV0ZSB3aGVuIDAKKyAqIEBmbGFnczogYml0IGZsYWdzIGZvciBXMV9TTEFWRV9BQ1RJVkUgVzFfU0xBVkVfREVUQUNICisgKiBAdHRsOiBkZWNyZW1lbnQgcGVyIHNlYXJjaCB0aGlzIHNsYXZlIGlzbid0IGZvdW5kLCBkZWF0Y2ggYXQgMAorICogQG1hc3RlcjogYnVzIHdoaWNoIHRoaXMgc2xhdmUgaXMgb24KKyAqIEBmYW1pbHk6IG1vZHVsZSBmb3IgZGV2aWNlIGZhbWlseSB0eXBlCisgKiBAZmFtaWx5X2RhdGE6IHBvaW50ZXIgZm9yIHVzZSBieSB0aGUgZmFtaWx5IG1vZHVsZQorICogQGRldjoga2VybmVsIGRldmljZSBpZGVudGlmaWVyCisgKgorICovCiBzdHJ1Y3QgdzFfc2xhdmUKIHsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CkBAIC02Niw3ICs5MCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZAl3MV9zbGF2ZV9lbnRyeTsKIAlzdHJ1Y3QgdzFfcmVnX251bQlyZWdfbnVtOwogCWF0b21pY190CQlyZWZjbnQ7Ci0JdTgJCQlyb21bOV07CiAJaW50CQkJdHRsOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCkBAIC03NCw5OSArOTcsMTQ2IEBACiAJc3RydWN0IHcxX2ZhbWlseQkqZmFtaWx5OwogCXZvaWQJCQkqZmFtaWx5X2RhdGE7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXN0cnVjdCBjb21wbGV0aW9uCXJlbGVhc2VkOwogfTsKIAogdHlwZWRlZiB2b2lkICgqdzFfc2xhdmVfZm91bmRfY2FsbGJhY2spKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTY0KTsKIAogCiAvKioKKyAqIHN0cnVjdCB3MV9idXNfbWFzdGVyIC0gb3BlcmF0aW9ucyBhdmFpbGFibGUgb24gYSBidXMgbWFzdGVyCisgKgorICogQGRhdGE6IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cKKyAqCisgKiBAcmVhZF9iaXQ6IFNhbXBsZSB0aGUgbGluZSBsZXZlbCBAcmV0dXJuIHRoZSBsZXZlbCByZWFkICgwIG9yIDEpCisgKgorICogQHdyaXRlX2JpdDogU2V0cyB0aGUgbGluZSBsZXZlbAorICoKKyAqIEB0b3VjaF9iaXQ6IHRoZSBsb3dlc3QtbGV2ZWwgZnVuY3Rpb24gZm9yIGRldmljZXMgdGhhdCByZWFsbHkgc3VwcG9ydCB0aGUKKyAqIDEtd2lyZSBwcm90b2NvbC4KKyAqIHRvdWNoX2JpdCgwKSA9IHdyaXRlLTAgY3ljbGUKKyAqIHRvdWNoX2JpdCgxKSA9IHdyaXRlLTEgLyByZWFkIGN5Y2xlCisgKiBAcmV0dXJuIHRoZSBiaXQgcmVhZCAoMCBvciAxKQorICoKKyAqIEByZWFkX2J5dGU6IFJlYWRzIGEgYnl0ZXMuIFNhbWUgYXMgOCB0b3VjaF9iaXQoMSkgY2FsbHMuCisgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQKKyAqCisgKiBAd3JpdGVfYnl0ZTogV3JpdGVzIGEgYnl0ZS4gU2FtZSBhcyA4IHRvdWNoX2JpdCh4KSBjYWxscy4KKyAqCisgKiBAcmVhZF9ibG9jazogU2FtZSBhcyBhIHNlcmllcyBvZiByZWFkX2J5dGUoKSBjYWxscworICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAqCisgKiBAd3JpdGVfYmxvY2s6IFNhbWUgYXMgYSBzZXJpZXMgb2Ygd3JpdGVfYnl0ZSgpIGNhbGxzCisgKgorICogQHRyaXBsZXQ6IENvbWJpbmVzIHR3byByZWFkcyBhbmQgYSBzbWFydCB3cml0ZSBmb3IgUk9NIHNlYXJjaGVzCisgKiBAcmV0dXJuIGJpdDA9SWQgYml0MT1jb21wX2lkIGJpdDI9ZGlyX3Rha2VuCisgKgorICogQHJlc2V0X2J1czogbG9uZyB3cml0ZS0wIHdpdGggYSByZWFkIGZvciB0aGUgcHJlc2VuY2UgcHVsc2UgZGV0ZWN0aW9uCisgKiBAcmV0dXJuIC0xPUVycm9yLCAwPURldmljZSBwcmVzZW50LCAxPU5vIGRldmljZSBwcmVzZW50CisgKgorICogQHNldF9wdWxsdXA6IFB1dCBvdXQgYSBzdHJvbmcgcHVsbC11cCBwdWxzZSBvZiB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uLgorICogQHJldHVybiAtMT1FcnJvciwgMD1jb21wbGV0ZWQKKyAqCisgKiBAc2VhcmNoOiBSZWFsbHkgbmljZSBoYXJkd2FyZSBjYW4gaGFuZGxlcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFJPTSBzZWFyY2gKKyAqIHcxX21hc3RlciogaXMgcGFzc2VkIHRvIHRoZSBzbGF2ZSBmb3VuZCBjYWxsYmFjay4KKyAqIHU4IGlzIHNlYXJjaF90eXBlLCBXMV9TRUFSQ0ggb3IgVzFfQUxBUk1fU0VBUkNICisgKgogICogTm90ZTogcmVhZF9iaXQgYW5kIHdyaXRlX2JpdCBhcmUgdmVyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFuZCBzaG91bGQgb25seQogICogYmUgdXNlZCB3aXRoIGhhcmR3YXJlIHRoYXQgZG9lc24ndCByZWFsbHkgc3VwcG9ydCAxLXdpcmUgb3BlcmF0aW9ucywKICAqIGxpa2UgYSBwYXJhbGxlbC9zZXJpYWwgcG9ydC4KICAqIEVpdGhlciBkZWZpbmUgcmVhZF9iaXQgYW5kIHdyaXRlX2JpdCBPUiBkZWZpbmUsIGF0IG1pbmltdW0sIHRvdWNoX2JpdCBhbmQKICAqIHJlc2V0X2J1cy4KKyAqCiAgKi8KIHN0cnVjdCB3MV9idXNfbWFzdGVyCiB7Ci0JLyoqIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgKi8KIAl2b2lkCQkqZGF0YTsKIAotCS8qKgotCSAqIFNhbXBsZSB0aGUgbGluZSBsZXZlbAotCSAqIEByZXR1cm4gdGhlIGxldmVsIHJlYWQgKDAgb3IgMSkKLQkgKi8KIAl1OAkJKCpyZWFkX2JpdCkodm9pZCAqKTsKIAotCS8qKiBTZXRzIHRoZSBsaW5lIGxldmVsICovCiAJdm9pZAkJKCp3cml0ZV9iaXQpKHZvaWQgKiwgdTgpOwogCi0JLyoqCi0JICogdG91Y2hfYml0IGlzIHRoZSBsb3dlc3QtbGV2ZWwgZnVuY3Rpb24gZm9yIGRldmljZXMgdGhhdCByZWFsbHkKLQkgKiBzdXBwb3J0IHRoZSAxLXdpcmUgcHJvdG9jb2wuCi0JICogdG91Y2hfYml0KDApID0gd3JpdGUtMCBjeWNsZQotCSAqIHRvdWNoX2JpdCgxKSA9IHdyaXRlLTEgLyByZWFkIGN5Y2xlCi0JICogQHJldHVybiB0aGUgYml0IHJlYWQgKDAgb3IgMSkKLQkgKi8KIAl1OAkJKCp0b3VjaF9iaXQpKHZvaWQgKiwgdTgpOwogCi0JLyoqCi0JICogUmVhZHMgYSBieXRlcy4gU2FtZSBhcyA4IHRvdWNoX2JpdCgxKSBjYWxscy4KLQkgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQKLQkgKi8KIAl1OAkJKCpyZWFkX2J5dGUpKHZvaWQgKik7CiAKLQkvKioKLQkgKiBXcml0ZXMgYSBieXRlLiBTYW1lIGFzIDggdG91Y2hfYml0KHgpIGNhbGxzLgotCSAqLwogCXZvaWQJCSgqd3JpdGVfYnl0ZSkodm9pZCAqLCB1OCk7CiAKLQkvKioKLQkgKiBTYW1lIGFzIGEgc2VyaWVzIG9mIHJlYWRfYnl0ZSgpIGNhbGxzCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLQkgKi8KIAl1OAkJKCpyZWFkX2Jsb2NrKSh2b2lkICosIHU4ICosIGludCk7CiAKLQkvKiogU2FtZSBhcyBhIHNlcmllcyBvZiB3cml0ZV9ieXRlKCkgY2FsbHMgKi8KIAl2b2lkCQkoKndyaXRlX2Jsb2NrKSh2b2lkICosIGNvbnN0IHU4ICosIGludCk7CiAKLQkvKioKLQkgKiBDb21iaW5lcyB0d28gcmVhZHMgYW5kIGEgc21hcnQgd3JpdGUgZm9yIFJPTSBzZWFyY2hlcwotCSAqIEByZXR1cm4gYml0MD1JZCBiaXQxPWNvbXBfaWQgYml0Mj1kaXJfdGFrZW4KLQkgKi8KIAl1OAkJKCp0cmlwbGV0KSh2b2lkICosIHU4KTsKIAotCS8qKgotCSAqIGxvbmcgd3JpdGUtMCB3aXRoIGEgcmVhZCBmb3IgdGhlIHByZXNlbmNlIHB1bHNlIGRldGVjdGlvbgotCSAqIEByZXR1cm4gLTE9RXJyb3IsIDA9RGV2aWNlIHByZXNlbnQsIDE9Tm8gZGV2aWNlIHByZXNlbnQKLQkgKi8KIAl1OAkJKCpyZXNldF9idXMpKHZvaWQgKik7CiAKLQkvKioKLQkgKiBQdXQgb3V0IGEgc3Ryb25nIHB1bGwtdXAgcHVsc2Ugb2YgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi4KLQkgKiBAcmV0dXJuIC0xPUVycm9yLCAwPWNvbXBsZXRlZAotCSAqLwogCXU4CQkoKnNldF9wdWxsdXApKHZvaWQgKiwgaW50KTsKIAotCS8qKiBSZWFsbHkgbmljZSBoYXJkd2FyZSBjYW4gaGFuZGxlcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFJPTSBzZWFyY2gKLQkgKiAgdzFfbWFzdGVyKiBpcyBwYXNzZWQgdG8gdGhlIHNsYXZlIGZvdW5kIGNhbGxiYWNrLgotCSAqLwogCXZvaWQJCSgqc2VhcmNoKSh2b2lkICosIHN0cnVjdCB3MV9tYXN0ZXIgKiwKIAkJdTgsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrKTsKIH07CiAKKy8qKgorICogZW51bSB3MV9tYXN0ZXJfZmxhZ3MgLSBiaXRmaWVsZHMgdXNlZCBpbiB3MV9tYXN0ZXIuZmxhZ3MKKyAqIEBXMV9BQk9SVF9TRUFSQ0g6IGFib3J0IHNlYXJjaGluZyBlYXJseSBvbiBzaHV0ZG93bgorICogQFcxX1dBUk5fTUFYX0NPVU5UOiBsaW1pdCB3YXJuaW5nIHdoZW4gdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZAorICovCitlbnVtIHcxX21hc3Rlcl9mbGFncyB7CisJVzFfQUJPUlRfU0VBUkNIID0gMCwKKwlXMV9XQVJOX01BWF9DT1VOVCA9IDEsCit9OworCisvKioKKyAqIHN0cnVjdCB3MV9tYXN0ZXIgLSBvbmUgcGVyIGJ1cyBtYXN0ZXIKKyAqIEB3MV9tYXN0ZXJfZW50cnk6CW1hc3RlciBsaW5rZWQgbGlzdAorICogQG93bmVyOgkJbW9kdWxlIG93bmVyCisgKiBAbmFtZToJCWR5bmFtaWNhbGx5IGFsbG9jYXRlIGJ1cyBuYW1lCisgKiBAbGlzdF9tdXRleDoJCXByb3RlY3Qgc2xpc3QgYW5kIGFzeW5jX2xpc3QKKyAqIEBzbGlzdDoJCWxpbmtlZCBsaXN0IG9mIHNsYXZlcworICogQGFzeW5jX2xpc3Q6CQlsaW5rZWQgbGlzdCBvZiBuZXRsaW5rIGNvbW1hbmRzIHRvIGV4ZWN1dGUKKyAqIEBtYXhfc2xhdmVfY291bnQ6CW1heGltdW0gbnVtYmVyIG9mIHNsYXZlcyB0byBzZWFyY2ggZm9yIGF0IGEgdGltZQorICogQHNsYXZlX2NvdW50OgljdXJyZW50IG51bWJlciBvZiBzbGF2ZXMga25vd24KKyAqIEBhdHRlbXB0czoJCW51bWJlciBvZiBzZWFyY2hlcyByYW4KKyAqIEBzbGF2ZV90dGw6CQludW1iZXIgb2Ygc2VhcmNoZXMgYmVmb3JlIGEgc2xhdmUgaXMgdGltZWQgb3V0CisgKiBAaW5pdGlhbGl6ZWQ6CXByZXZlbnQgaW5pdC9yZW1vdmFsIHJhY2UgY29uZGl0aW9ucworICogQGlkOgkJCXcxIGJ1cyBudW1iZXIKKyAqIEBzZWFyY2hfY291bnQ6CW51bWJlciBvZiBhdXRvbWF0aWMgc2VhcmNoZXMgdG8gcnVuLCAtMSB1bmxpbWl0ZWQKKyAqIEBzZWFyY2hfaWQ6CQlhbGxvd3MgY29udGludWluZyBhIHNlYXJjaAorICogQHJlZmNudDoJCXJlZmVyZW5jZSBjb3VudAorICogQHByaXY6CQlwcml2YXRlIGRhdGEgc3RvcmFnZQorICogQHByaXZfc2l6ZToJCXNpemUgYWxsb2NhdGVkCisgKiBAZW5hYmxlX3B1bGx1cDoJYWxsb3dzIGEgc3Ryb25nIHB1bGx1cAorICogQHB1bGx1cF9kdXJhdGlvbjoJdGltZSBmb3IgdGhlIG5leHQgc3Ryb25nIHB1bGx1cAorICogQGZsYWdzOgkJb25lIG9mIHcxX21hc3Rlcl9mbGFncworICogQHRocmVhZDoJCXRocmVhZCBmb3IgYnVzIHNlYXJjaCBhbmQgbmV0bGluayBjb21tYW5kcworICogQG11dGV4OgkJcHJvdGVjdCBtb3N0IG9mIHcxX21hc3RlcgorICogQGJ1c19tdXRleDoJCXByZXRlY3QgY29uY3VycmVudCBidXMgYWNjZXNzCisgKiBAZHJpdmVyOgkJc3lzZnMgZHJpdmVyCisgKiBAZGV2OgkJc3lzZnMgZGV2aWNlCisgKiBAYnVzX21hc3RlcjoJCWlvIG9wZXJhdGlvbnMgYXZhaWxhYmxlCisgKiBAc2VxOgkJc2VxdWVuY2UgbnVtYmVyIHVzZWQgZm9yIG5ldGxpbmsgYnJvYWRjYXN0cworICogQHBvcnRpZDoJCWRlc3RpbmF0aW9uIGZvciB0aGUgY3VycmVudCBuZXRsaW5rIGNvbW1hbmQKKyAqLwogc3RydWN0IHcxX21hc3RlcgogewogCXN0cnVjdCBsaXN0X2hlYWQJdzFfbWFzdGVyX2VudHJ5OwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAl1bnNpZ25lZCBjaGFyCQluYW1lW1cxX01BWE5BTUVMRU5dOworCS8qIGxpc3RfbXV0ZXggcHJvdGVjdHMganVzdCBzbGlzdCBhbmQgYXN5bmNfbGlzdCBzbyBzbGF2ZXMgY2FuIGJlCisJICogc2VhcmNoZWQgZm9yIGFuZCBhc3luYyBjb21tYW5kcyBhZGRlZCB3aGlsZSB0aGUgbWFzdGVyIGhhcworCSAqIHcxX21hc3Rlci5tdXRleCBsb2NrZWQgYW5kIGlzIG9wZXJhdGluZyBvbiB0aGUgYnVzLgorCSAqIGxvY2sgb3JkZXIgdzFfbWxvY2ssIHcxX21hc3Rlci5tdXRleCwgdzFfbWFzdGVyLmxpc3RfbXV0ZXgKKwkgKi8KKwlzdHJ1Y3QgbXV0ZXgJCWxpc3RfbXV0ZXg7CiAJc3RydWN0IGxpc3RfaGVhZAlzbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFzeW5jX2xpc3Q7CiAJaW50CQkJbWF4X3NsYXZlX2NvdW50LCBzbGF2ZV9jb3VudDsKIAl1bnNpZ25lZCBsb25nCQlhdHRlbXB0czsKIAlpbnQJCQlzbGF2ZV90dGw7CiAJaW50CQkJaW5pdGlhbGl6ZWQ7CiAJdTMyCQkJaWQ7CiAJaW50CQkJc2VhcmNoX2NvdW50OworCS8qIGlkIHRvIHN0YXJ0IHNlYXJjaGluZyBvbiwgdG8gY29udGludWUgYSBzZWFyY2ggb3IgMCB0byByZXN0YXJ0ICovCisJdTY0CQkJc2VhcmNoX2lkOwogCiAJYXRvbWljX3QJCXJlZmNudDsKIApAQCAtMTc4LDYgKzI0OCw4IEBACiAJLyoqIDVWIHN0cm9uZyBwdWxsdXAgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLCB6ZXJvIGRpc2FibGVkLiAqLwogCWludAkJCXB1bGx1cF9kdXJhdGlvbjsKIAorCWxvbmcJCQlmbGFnczsKKwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkOwogCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJc3RydWN0IG11dGV4CQlidXNfbXV0ZXg7CkBAIC0xODgsMTYgKzI2MCw0MSBAQAogCXN0cnVjdCB3MV9idXNfbWFzdGVyCSpidXNfbWFzdGVyOwogCiAJdTMyCQkJc2VxOworCS8qIHBvcnQgaWQgdG8gc2VuZCBuZXRsaW5rIHJlc3BvbnNlcyB0by4gIFRoZSB2YWx1ZSBpcyB0ZW1wb3JhcmlseQorCSAqIHN0b3JlZCBoZXJlIHdoaWxlIHByb2Nlc3NpbmcgYSBtZXNzYWdlLCBzZXQgYWZ0ZXIgbG9ja2luZyB0aGUKKwkgKiBtdXRleCwgemVybyBiZWZvcmUgdW5sb2NraW5nIHRoZSBtdXRleC4KKwkgKi8KKwl1MzIJCQlwb3J0aWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB3MV9hc3luY19jbWQgLSBleGVjdXRlIGNhbGxiYWNrIGZyb20gdGhlIHcxX3Byb2Nlc3Mga3RocmVhZAorICogQGFzeW5jX2VudHJ5OiBsaW5rIGVudHJ5CisgKiBAY2I6IGNhbGxiYWNrIGZ1bmN0aW9uLCBtdXN0IGxpc3RfZGVsIGFuZCBkZXN0cm95IHRoaXMgbGlzdCBiZWZvcmUKKyAqIHJldHVybmluZworICoKKyAqIFdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgdzFfbWFzdGVyIGFzeW5jX2xpc3QsIHcxX3Byb2Nlc3Mgd2lsbCBleGVjdXRlCisgKiB0aGUgY2FsbGJhY2suICBFbWJlZCB0aGlzIGludG8gdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSBjb21tYW5kIGRldGFpbHMuCisgKi8KK3N0cnVjdCB3MV9hc3luY19jbWQgeworCXN0cnVjdCBsaXN0X2hlYWQJYXN5bmNfZW50cnk7CisJdm9pZCAoKmNiKShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9hc3luY19jbWQgKmFzeW5jX2NtZCk7CiB9OwogCiBpbnQgdzFfY3JlYXRlX21hc3Rlcl9hdHRyaWJ1dGVzKHN0cnVjdCB3MV9tYXN0ZXIgKik7CiB2b2lkIHcxX2Rlc3Ryb3lfbWFzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IHcxX21hc3RlciAqbWFzdGVyKTsKIHZvaWQgdzFfc2VhcmNoKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKIHZvaWQgdzFfc2VhcmNoX2RldmljZXMoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOworLyogY2FsbCB3MV91bnJlZl9zbGF2ZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgY291bnRzIHcxX3NlYXJjaF9zbGF2ZSBhZGRlZCAqLwogc3RydWN0IHcxX3NsYXZlICp3MV9zZWFyY2hfc2xhdmUoc3RydWN0IHcxX3JlZ19udW0gKmlkKTsKKy8qIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBvbiBzbC0+bWFzdGVyIGFuZCBzbCwgYW5kIGNsZWFucyB1cCBpZiB6ZXJvCisgKiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgKi8KK2ludCB3MV91bnJlZl9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKIHZvaWQgdzFfc2xhdmVfZm91bmQoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1NjQgcm4pOwogdm9pZCB3MV9zZWFyY2hfcHJvY2Vzc19jYihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlLAogCXcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKK3N0cnVjdCB3MV9zbGF2ZSAqdzFfc2xhdmVfc2VhcmNoX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsCisJc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKIHN0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKTsKIAogLyogRGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IGRldmljZXMgaW4gdGhlIGdpdmVuIGZhbWlseS4gIFVzZWQgZm9yIGZpbmRpbmcKQEAgLTIwNiw3ICszMDMsOSBAQAogICogaGFzIGp1c3QgYmVlbiByZWdpc3RlcmVkLCB0byAwIHdoZW4gaXQgaGFzIGJlZW4gdW5yZWdpc3RlcmVkLgogICovCiB2b2lkIHcxX3JlY29ubmVjdF9zbGF2ZXMoc3RydWN0IHcxX2ZhbWlseSAqZiwgaW50IGF0dGFjaCk7Ci12b2lkIHcxX3NsYXZlX2RldGFjaChzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKK2ludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKKy8qIDAgc3VjY2Vzcywgb3RoZXJ3aXNlIEVCVVNZICovCitpbnQgdzFfc2xhdmVfZGV0YWNoKHN0cnVjdCB3MV9zbGF2ZSAqc2wpOwogCiB1OCB3MV90cmlwbGV0KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGJkaXIpOwogdm9pZCB3MV93cml0ZV84KHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTgpOwpAQCAtMjQyLDYgKzM0MSw3IEBACiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB3MV9tYXN0ZXJzOwogZXh0ZXJuIHN0cnVjdCBtdXRleCB3MV9tbG9jazsKIAorZXh0ZXJuIGludCB3MV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpOwogZXh0ZXJuIGludCB3MV9wcm9jZXNzKHZvaWQgKik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCBlOTMwOTc3OC4uM2JmZjZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuYworKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCkBAIC0zMSw2ICszMSwxMCBAQAogREVGSU5FX1NQSU5MT0NLKHcxX2Zsb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQodzFfZmFtaWxpZXMpOwogCisvKioKKyAqIHcxX3JlZ2lzdGVyX2ZhbWlseSgpIC0gcmVnaXN0ZXIgYSBkZXZpY2UgZmFtaWx5IGRyaXZlcgorICogQG5ld2Y6CWZhbWlseSB0byByZWdpc3RlcgorICovCiBpbnQgdzFfcmVnaXN0ZXJfZmFtaWx5KHN0cnVjdCB3MV9mYW1pbHkgKm5ld2YpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50LCAqbjsKQEAgLTU5LDYgKzYzLDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiB3MV91bnJlZ2lzdGVyX2ZhbWlseSgpIC0gdW5yZWdpc3RlciBhIGRldmljZSBmYW1pbHkgZHJpdmVyCisgKiBAZmVudDoJZmFtaWx5IHRvIHVucmVnaXN0ZXIKKyAqLwogdm9pZCB3MV91bnJlZ2lzdGVyX2ZhbWlseShzdHJ1Y3QgdzFfZmFtaWx5ICpmZW50KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oIGIvZHJpdmVycy93MS93MV9mYW1pbHkuaAppbmRleCA0YWQwZTgxLi4yNmNhMTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKQEAgLTQ4LDYgKzQ4LDEyIEBACiAKIHN0cnVjdCB3MV9zbGF2ZTsKIAorLyoqCisgKiBzdHJ1Y3QgdzFfZmFtaWx5X29wcyAtIG9wZXJhdGlvbnMgZm9yIGEgZmFtaWx5IHR5cGUKKyAqIEBhZGRfc2xhdmU6IGFkZF9zbGF2ZQorICogQHJlbW92ZV9zbGF2ZTogcmVtb3ZlX3NsYXZlCisgKiBAZ3JvdXBzOiBzeXNmcyBncm91cAorICovCiBzdHJ1Y3QgdzFfZmFtaWx5X29wcwogewogCWludCAgKCogYWRkX3NsYXZlKShzdHJ1Y3QgdzFfc2xhdmUgKik7CkBAIC01NSw2ICs2MSwxMyBAQAogCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHM7CiB9OwogCisvKioKKyAqIHN0cnVjdCB3MV9mYW1pbHkgLSByZWZlcmVuY2UgY291bnRlZCBmYW1pbHkgc3RydWN0dXJlLgorICogQGZhbWlseV9lbnRyeToJZmFtaWx5IGxpbmtlZCBsaXN0CisgKiBAZmlkOgkJOCBiaXQgZmFtaWx5IGlkZW50aWZpZXIKKyAqIEBmb3BzOgkJb3BlcmF0aW9ucyBmb3IgdGhpcyBmYW1pbHkKKyAqIEByZWZjbnQ6CQlyZWZlcmVuY2UgY291bnRlcgorICovCiBzdHJ1Y3QgdzFfZmFtaWx5CiB7CiAJc3RydWN0IGxpc3RfaGVhZAlmYW1pbHlfZW50cnk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCA1OTBiZDhhLi45YjA4NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTc1LDggKzc1LDEwIEBACiAJYXRvbWljX3NldCgmZGV2LT5yZWZjbnQsIDIpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+c2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmFzeW5jX2xpc3QpOwogCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOwogCW11dGV4X2luaXQoJmRldi0+YnVzX211dGV4KTsKKwltdXRleF9pbml0KCZkZXYtPmxpc3RfbXV0ZXgpOwogCiAJbWVtY3B5KCZkZXYtPmRldiwgZGV2aWNlLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJ3MV9idXNfbWFzdGVyJXUiLCBkZXYtPmlkKTsKQEAgLTEwMyw2ICsxMDUsMTAgQEAKIAlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOwogfQogCisvKioKKyAqIHcxX2FkZF9tYXN0ZXJfZGV2aWNlKCkgLSByZWdpc3RlcnMgYSBuZXcgbWFzdGVyIGRldmljZQorICogQG1hc3RlcjoJbWFzdGVyIGJ1cyBkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqLwogaW50IHcxX2FkZF9tYXN0ZXJfZGV2aWNlKHN0cnVjdCB3MV9idXNfbWFzdGVyICptYXN0ZXIpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2LCAqZW50cnk7CkBAIC0xNzIsNiArMTc4LDcgQEAKIAogI2lmIDAgLyogVGhyZWFkIGNsZWFudXAgY29kZSwgbm90IHJlcXVpcmVkIGN1cnJlbnRseS4gKi8KIGVycl9vdXRfa2lsbF90aHJlYWQ6CisJc2V0X2JpdChXMV9BQk9SVF9TRUFSQ0gsICZkZXYtPmZsYWdzKTsKIAlrdGhyZWFkX3N0b3AoZGV2LT50aHJlYWQpOwogI2VuZGlmCiBlcnJfb3V0X3JtX2F0dHI6CkBAIC0xODcsMTYgKzE5NCwyMiBAQAogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyBtc2c7CiAJc3RydWN0IHcxX3NsYXZlICpzbCwgKnNsbjsKIAotCWt0aHJlYWRfc3RvcChkZXYtPnRocmVhZCk7Ci0KIAltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJbGlzdF9kZWwoJmRldi0+dzFfbWFzdGVyX2VudHJ5KTsKIAltdXRleF91bmxvY2soJncxX21sb2NrKTsKIAorCXNldF9iaXQoVzFfQUJPUlRfU0VBUkNILCAmZGV2LT5mbGFncyk7CisJa3RocmVhZF9zdG9wKGRldi0+dGhyZWFkKTsKKwogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpCisJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwl9CiAJdzFfZGVzdHJveV9tYXN0ZXJfYXR0cmlidXRlcyhkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKIApAQCAtMjA2LDcgKzIxOSw5IEBACiAKIAkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKQogCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJdzFfcHJvY2Vzc19jYWxsYmFja3MoZGV2KTsKIAl9CisJdzFfcHJvY2Vzc19jYWxsYmFja3MoZGV2KTsKIAogCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CiAJbXNnLmlkLm1zdC5pZCA9IGRldi0+aWQ7CkBAIC0yMTYsNiArMjMxLDEwIEBACiAJdzFfZnJlZV9kZXYoZGV2KTsKIH0KIAorLyoqCisgKiB3MV9yZW1vdmVfbWFzdGVyX2RldmljZSgpIC0gdW5yZWdpc3RlciBhIG1hc3RlciBkZXZpY2UKKyAqIEBibToJbWFzdGVyIGJ1cyBkZXZpY2UgdG8gcmVtb3ZlCisgKi8KIHZvaWQgdzFfcmVtb3ZlX21hc3Rlcl9kZXZpY2Uoc3RydWN0IHcxX2J1c19tYXN0ZXIgKmJtKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgKmZvdW5kID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uYyBiL2RyaXZlcnMvdzEvdzFfaW8uYwppbmRleCBlMTBhY2MyLi4yODIwOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmMKKysrIGIvZHJpdmVycy93MS93MV9pby5jCkBAIC02Miw3ICs2Miw5IEBACiBzdGF0aWMgdTggdzFfcmVhZF9iaXQoc3RydWN0IHcxX21hc3RlciAqZGV2KTsKIAogLyoqCi0gKiBHZW5lcmF0ZXMgYSB3cml0ZS0wIG9yIHdyaXRlLTEgY3ljbGUgYW5kIHNhbXBsZXMgdGhlIGxldmVsLgorICogdzFfdG91Y2hfYml0KCkgLSBHZW5lcmF0ZXMgYSB3cml0ZS0wIG9yIHdyaXRlLTEgY3ljbGUgYW5kIHNhbXBsZXMgdGhlIGxldmVsLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBiaXQ6CTAgLSB3cml0ZSBhIDAsIDEgLSB3cml0ZSBhIDAgcmVhZCB0aGUgbGV2ZWwKICAqLwogc3RhdGljIHU4IHcxX3RvdWNoX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiaXQpCiB7CkBAIC03Nyw3ICs3OSwxMCBAQAogfQogCiAvKioKLSAqIEdlbmVyYXRlcyBhIHdyaXRlLTAgb3Igd3JpdGUtMSBjeWNsZS4KKyAqIHcxX3dyaXRlX2JpdCgpIC0gR2VuZXJhdGVzIGEgd3JpdGUtMCBvciB3cml0ZS0xIGN5Y2xlLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBiaXQ6CWJpdCB0byB3cml0ZQorICoKICAqIE9ubHkgY2FsbCBpZiBkZXYtPmJ1c19tYXN0ZXItPnRvdWNoX2JpdCBpcyBOVUxMCiAgKi8KIHN0YXRpYyB2b2lkIHcxX3dyaXRlX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiaXQpCkBAIC0xMDIsMTEgKzEwNywxMiBAQAogfQogCiAvKioKKyAqIHcxX3ByZV93cml0ZSgpIC0gcHJlLXdyaXRlIG9wZXJhdGlvbnMKKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKgogICogUHJlLXdyaXRlIG9wZXJhdGlvbiwgY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBzdHJvbmcgcHVsbHVwcy4KICAqIFByb2dyYW0gdGhlIGhhcmR3YXJlIGZvciBhIHN0cm9uZyBwdWxsdXAsIGlmIG9uZSBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kCiAgKiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKICAqLwogc3RhdGljIHZvaWQgdzFfcHJlX3dyaXRlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKIHsKQEAgLTExOCwxMSArMTI0LDEyIEBACiB9CiAKIC8qKgorICogdzFfcG9zdF93cml0ZSgpIC0gcG9zdC13cml0ZSBvcHRpb25zCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICoKICAqIFBvc3Qtd3JpdGUgb3BlcmF0aW9uLCBjdXJyZW50bHkgb25seSBzdXBwb3J0aW5nIHN0cm9uZyBwdWxsdXBzLgogICogSWYgYSBzdHJvbmcgcHVsbHVwIHdhcyByZXF1ZXN0ZWQsIGNsZWFyIGl0IGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cwogICogdGhlbSwgb3IgZXhlY3V0ZSB0aGUgZGVsYXkgb3RoZXJ3aXNlLCBpbiBlaXRoZXIgY2FzZSBjbGVhciB0aGUgcmVxdWVzdC4KLSAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQogICovCiBzdGF0aWMgdm9pZCB3MV9wb3N0X3dyaXRlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKIHsKQEAgLTEzNiwxMCArMTQzLDkgQEAKIH0KIAogLyoqCi0gKiBXcml0ZXMgOCBiaXRzLgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcGFyYW0gYnl0ZSAgICB0aGUgYnl0ZSB0byB3cml0ZQorICogdzFfd3JpdGVfOCgpIC0gV3JpdGVzIDggYml0cy4KKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAYnl0ZToJdGhlIGJ5dGUgdG8gd3JpdGUKICAqLwogdm9pZCB3MV93cml0ZV84KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggYnl0ZSkKIHsKQEAgLTE2MSw3ICsxNjcsOSBAQAogCiAKIC8qKgotICogR2VuZXJhdGVzIGEgd3JpdGUtMSBjeWNsZSBhbmQgc2FtcGxlcyB0aGUgbGV2ZWwuCisgKiB3MV9yZWFkX2JpdCgpIC0gR2VuZXJhdGVzIGEgd3JpdGUtMSBjeWNsZSBhbmQgc2FtcGxlcyB0aGUgbGV2ZWwuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICoKICAqIE9ubHkgY2FsbCBpZiBkZXYtPmJ1c19tYXN0ZXItPnRvdWNoX2JpdCBpcyBOVUxMCiAgKi8KIHN0YXRpYyB1OCB3MV9yZWFkX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCkBAIC0xODUsMTYgKzE5MywxNyBAQAogfQogCiAvKioKLSAqIERvZXMgYSB0cmlwbGV0IC0gdXNlZCBmb3Igc2VhcmNoaW5nIFJPTSBhZGRyZXNzZXMuCisgKiB3MV90cmlwbGV0KCkgLSAqIERvZXMgYSB0cmlwbGV0IC0gdXNlZCBmb3Igc2VhcmNoaW5nIFJPTSBhZGRyZXNzZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJkaXI6CXRoZSBiaXQgdG8gd3JpdGUgaWYgYm90aCBpZF9iaXQgYW5kIGNvbXBfYml0IGFyZSAwCisgKgogICogUmV0dXJuIGJpdHM6CiAgKiAgYml0IDAgPSBpZF9iaXQKICAqICBiaXQgMSA9IGNvbXBfYml0CiAgKiAgYml0IDIgPSBkaXJfdGFrZW4KICAqIElmIGJvdGggYml0cyAwICYgMSBhcmUgc2V0LCB0aGUgc2VhcmNoIHNob3VsZCBiZSByZXN0YXJ0ZWQuCiAgKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBiZGlyICAgIHRoZSBiaXQgdG8gd3JpdGUgaWYgYm90aCBpZF9iaXQgYW5kIGNvbXBfYml0IGFyZSAwCi0gKiBAcmV0dXJuICAgICAgICBiaXQgZmllbGRzIC0gc2VlIGFib3ZlCisgKiBSZXR1cm46ICAgICAgICBiaXQgZmllbGRzIC0gc2VlIGFib3ZlCiAgKi8KIHU4IHcxX3RyaXBsZXQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBpbnQgYmRpcikKIHsKQEAgLTIyNiwxMCArMjM1LDEwIEBACiB9CiAKIC8qKgotICogUmVhZHMgOCBiaXRzLgorICogdzFfcmVhZF84KCkgLSBSZWFkcyA4IGJpdHMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQogICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcmV0dXJuICAgICAgICB0aGUgYnl0ZSByZWFkCisgKiBSZXR1cm46ICAgICAgICB0aGUgYnl0ZSByZWFkCiAgKi8KIHU4IHcxX3JlYWRfOChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CkBAIC0yNDcsMTEgKzI1NiwxMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVhZF84KTsKIAogLyoqCi0gKiBXcml0ZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKLSAqIEBwYXJhbSBsZW4gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIHcxX3dyaXRlX2Jsb2NrKCkgLSBXcml0ZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ1ZjoJcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorICogQGxlbjoJdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICovCiB2b2lkIHcxX3dyaXRlX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTI2OSwxMSArMjc3LDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV93cml0ZV9ibG9jayk7CiAKIC8qKgotICogVG91Y2hlcyBhIHNlcmllcyBvZiBieXRlcy4KLSAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQotICogQHBhcmFtIGJ1ZiAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQotICogQHBhcmFtIGxlbiAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogdzFfdG91Y2hfYmxvY2soKSAtIFRvdWNoZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ1ZjoJcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorICogQGxlbjoJdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICovCiB2b2lkIHcxX3RvdWNoX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTI5NCwxMiArMzAxLDExIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV90b3VjaF9ibG9jayk7CiAKIC8qKgotICogUmVhZHMgYSBzZXJpZXMgb2YgYnl0ZXMuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBmaWxsCi0gKiBAcGFyYW0gbGVuICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAqIEByZXR1cm4gICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICogdzFfcmVhZF9ibG9jaygpIC0gUmVhZHMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ1ZjoJcG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZpbGwKKyAqIEBsZW46CXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogUmV0dXJuOgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKICAqLwogdTggdzFfcmVhZF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4ICpidWYsIGludCBsZW4pCiB7CkBAIC0zMTksMTAgKzMyNSw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV9yZWFkX2Jsb2NrKTsKIAogLyoqCi0gKiBJc3N1ZXMgYSByZXNldCBidXMgc2VxdWVuY2UuCi0gKgotICogQHBhcmFtICBkZXYgVGhlIGJ1cyBtYXN0ZXIgcG9pbnRlcgotICogQHJldHVybiAgICAgMD1EZXZpY2UgcHJlc2VudCwgMT1ObyBkZXZpY2UgcHJlc2VudCBvciBlcnJvcgorICogdzFfcmVzZXRfYnVzKCkgLSBJc3N1ZXMgYSByZXNldCBidXMgc2VxdWVuY2UuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogUmV0dXJuOgkwPURldmljZSBwcmVzZW50LCAxPU5vIGRldmljZSBwcmVzZW50IG9yIGVycm9yCiAgKi8KIGludCB3MV9yZXNldF9idXMoc3RydWN0IHcxX21hc3RlciAqZGV2KQogewpAQCAtMzgzLDEyICszODgsMTUgQEAKIH0KIAogLyoqCisgKiB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoKSAtIHJlc2V0IGFuZCBzZWxlY3QgYSBzbGF2ZQorICogQHNsOgkJdGhlIHNsYXZlIHRvIHNlbGVjdAorICoKICAqIFJlc2V0cyB0aGUgYnVzIGFuZCB0aGVuIHNlbGVjdHMgdGhlIHNsYXZlIGJ5IHNlbmRpbmcgZWl0aGVyIGEgc2tpcCByb20KLSAqIG9yIGEgcm9tIG1hdGNoLgorICogb3IgYSByb20gbWF0Y2guICBBIHNraXAgcm9tIGlzIGlzc3VlZCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UKKyAqIHJlZ2lzdGVyZWQgb24gdGhlIGJ1cy4KICAqIFRoZSB3MSBtYXN0ZXIgbG9jayBtdXN0IGJlIGhlbGQuCiAgKgotICogQHBhcmFtIHNsCXRoZSBzbGF2ZSB0byBzZWxlY3QKLSAqIEByZXR1cm4gCTA9c3VjY2VzcywgYW55dGhpbmcgZWxzZT1lcnJvcgorICogUmV0dXJuOgkwPXN1Y2Nlc3MsIGFueXRoaW5nIGVsc2U9ZXJyb3IKICAqLwogaW50IHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewpAQCAtNDA5LDYgKzQxNyw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV9yZXNldF9zZWxlY3Rfc2xhdmUpOwogCiAvKioKKyAqIHcxX3Jlc2V0X3Jlc3VtZV9jb21tYW5kKCkgLSByZXN1bWUgaW5zdGVhZCBvZiBhbm90aGVyIG1hdGNoIFJPTQorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqCiAgKiBXaGVuIHRoZSB3b3JrZmxvdyB3aXRoIGEgc2xhdmUgYW1vbmdzdCBtYW55IHJlcXVpcmVzIHNldmVyYWwKICAqIHN1Y2Nlc3NpdmUgY29tbWFuZHMgYSByZXNldCBiZXR3ZWVuIGVhY2gsIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhcgogICogdG8gZG9pbmcgYSByZXNldCB0aGVuIGEgbWF0Y2ggUk9NIGZvciB0aGUgbGFzdCBtYXRjaGVkIFJPTS4gVGhlCkBAIC00MjAsOCArNDMxLDYgQEAKICAqIGRvZXNuJ3Qgd29yayBvZiBjb3Vyc2UsIGJ1dCB0aGUgcmVzdW1lIGNvbW1hbmQgaXMgdGhlIG5leHQgYmVzdCB0aGluZy4KICAqCiAgKiBUaGUgdzEgbWFzdGVyIGxvY2sgbXVzdCBiZSBoZWxkLgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCiAgKi8KIGludCB3MV9yZXNldF9yZXN1bWVfY29tbWFuZChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CkBAIC00MzUsNiArNDQ0LDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV9yZXNldF9yZXN1bWVfY29tbWFuZCk7CiAKIC8qKgorICogdzFfbmV4dF9wdWxsdXAoKSAtIHJlZ2lzdGVyIGZvciBhIHN0cm9uZyBwdWxsdXAKKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAZGVsYXk6CXRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKgogICogUHV0IG91dCBhIHN0cm9uZyBwdWxsLXVwIG9mIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gYWZ0ZXIgdGhlIG5leHQgd3JpdGUKICAqIG9wZXJhdGlvbi4gIE5vdCBhbGwgaGFyZHdhcmUgc3VwcG9ydHMgc3Ryb25nIHB1bGx1cHMuICBIYXJkd2FyZSB0aGF0CiAgKiBkb2Vzbid0IHN1cHBvcnQgc3Ryb25nIHB1bGx1cHMgd2lsbCBzbGVlcCBmb3IgdGhlIGdpdmVuIHRpbWUgYWZ0ZXIgdGhlCkBAIC00NDIsOCArNDU1LDcgQEAKICAqIHRoZSBuZXh0IHdyaXRlLCBzcGVjaWZ5aW5nIHplcm8gd2lsbCBjbGVhciBhIHByZXZpb3VzIHJlcXVlc3QuCiAgKiBUaGUgdzEgbWFzdGVyIGxvY2sgbXVzdCBiZSBoZWxkLgogICoKLSAqIEBwYXJhbSBkZWxheQl0aW1lIGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybgkwPXN1Y2Nlc3MsIGFueXRoaW5nIGVsc2U9ZXJyb3IKKyAqIFJldHVybjoJMD1zdWNjZXNzLCBhbnl0aGluZyBlbHNlPWVycm9yCiAgKi8KIHZvaWQgdzFfbmV4dF9wdWxsdXAoc3RydWN0IHcxX21hc3RlciAqZGV2LCBpbnQgZGVsYXkpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCmluZGV4IDQwNzg4YzkuLjUyMzQ5NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCkBAIC00NSw3ICs0NSw3IEBACiAKIAltZW1jcHkodywgbXNnLCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSk7CiAKLQljbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG0sIGRldi0+cG9ydGlkLCAwLCBHRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIHZvaWQgdzFfc2VuZF9zbGF2ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU2NCBybikKQEAgLTU0LDUzICs1NCw5NSBAQAogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKIAlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7CiAJaW50IGF2YWlsOwotCi0JLyogdXBkYXRlIGtlcm5lbCBzbGF2ZSBsaXN0ICovCi0JdzFfc2xhdmVfZm91bmQoZGV2LCBybik7CisJdTY0ICpkYXRhOwogCiAJYXZhaWwgPSBkZXYtPnByaXZfc2l6ZSAtIGNtZC0+bGVuOwogCi0JaWYgKGF2YWlsID4gOCkgewotCQl1NjQgKmRhdGEgPSAodm9pZCAqKShjbWQgKyAxKSArIGNtZC0+bGVuOworCWlmIChhdmFpbCA8IDgpIHsKKwkJbXNnLT5hY2srKzsKKwkJY25fbmV0bGlua19zZW5kKG1zZywgZGV2LT5wb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCi0JCSpkYXRhID0gcm47Ci0JCWNtZC0+bGVuICs9IDg7Ci0JCWhkci0+bGVuICs9IDg7Ci0JCW1zZy0+bGVuICs9IDg7Ci0JCXJldHVybjsKKwkJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArCisJCQlzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwkJaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwkJY21kLT5sZW4gPSAwOwogCX0KIAotCW1zZy0+YWNrKys7Ci0JY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9ICh2b2lkICopKGNtZCArIDEpICsgY21kLT5sZW47CiAKLQltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0JaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQljbWQtPmxlbiA9IDA7CisJKmRhdGEgPSBybjsKKwljbWQtPmxlbiArPSA4OworCWhkci0+bGVuICs9IDg7CisJbXNnLT5sZW4gKz0gODsKIH0KIAotc3RhdGljIGludCB3MV9wcm9jZXNzX3NlYXJjaF9jb21tYW5kKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqbXNnLAotCQl1bnNpZ25lZCBpbnQgYXZhaWwpCitzdGF0aWMgdm9pZCB3MV9mb3VuZF9zZW5kX3NsYXZlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTY0IHJuKQogewotCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKLQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7Ci0JaW50IHNlYXJjaF90eXBlID0gKGNtZC0+Y21kID09IFcxX0NNRF9BTEFSTV9TRUFSQ0gpP1cxX0FMQVJNX1NFQVJDSDpXMV9TRUFSQ0g7CisJLyogdXBkYXRlIGtlcm5lbCBzbGF2ZSBsaXN0ICovCisJdzFfc2xhdmVfZm91bmQoZGV2LCBybik7CisKKwl3MV9zZW5kX3NsYXZlKGRldiwgcm4pOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc2xhdmUgbGlzdCwgb3Igc2VhcmNoICh3aXRoIG9yIHdpdGhvdXQgYWxhcm0pICovCitzdGF0aWMgaW50IHcxX2dldF9zbGF2ZXMoc3RydWN0IHcxX21hc3RlciAqZGV2LAorCQlzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmVxX2NtZCkKK3sKKwlzdHJ1Y3QgY25fbXNnICptc2c7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHI7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CisJc3RydWN0IHcxX3NsYXZlICpzbDsKKworCW1zZyA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2ctPmlkID0gcmVxX21zZy0+aWQ7CisJbXNnLT5zZXEgPSByZXFfbXNnLT5zZXE7CisJbXNnLT5hY2sgPSAwOworCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCQlzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKworCWhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKKworCWhkci0+dHlwZSA9IFcxX01BU1RFUl9DTUQ7CisJaGRyLT5pZCA9IHJlcV9oZHItPmlkOworCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisKKwljbWQtPmNtZCA9IHJlcV9jbWQtPmNtZDsKKwljbWQtPmxlbiA9IDA7CiAKIAlkZXYtPnByaXYgPSBtc2c7Ci0JZGV2LT5wcml2X3NpemUgPSBhdmFpbDsKKwlkZXYtPnByaXZfc2l6ZSA9IFBBR0VfU0laRSAtIG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpOwogCi0JdzFfc2VhcmNoX3Byb2Nlc3NfY2IoZGV2LCBzZWFyY2hfdHlwZSwgdzFfc2VuZF9zbGF2ZSk7CisJaWYgKHJlcV9jbWQtPmNtZCA9PSBXMV9DTURfTElTVF9TTEFWRVMpIHsKKwkJX191NjQgcm47CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgeworCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKKwkJCXcxX3NlbmRfc2xhdmUoZGV2LCBybik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCX0gZWxzZSB7CisJCXcxX3NlYXJjaF9wcm9jZXNzX2NiKGRldiwgY21kLT5jbWQgPT0gVzFfQ01EX0FMQVJNX1NFQVJDSCA/CisJCQlXMV9BTEFSTV9TRUFSQ0ggOiBXMV9TRUFSQ0gsIHcxX2ZvdW5kX3NlbmRfc2xhdmUpOworCX0KIAogCW1zZy0+YWNrID0gMDsKLQljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCBkZXYtPnBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAKIAlkZXYtPnByaXYgPSBOVUxMOwogCWRldi0+cHJpdl9zaXplID0gMDsKIAorCWtmcmVlKG1zZyk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3MV9zZW5kX3JlYWRfcmVwbHkoc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwKLQkJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kLCB1MzIgcG9ydGlkKQogewogCXZvaWQgKmRhdGE7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoOwpAQCAtMTMxLDcgKzE3Myw3IEBACiAKIAltZW1jcHkoYy0+ZGF0YSwgY21kLT5kYXRhLCBjLT5sZW4pOwogCi0JZXJyID0gY25fbmV0bGlua19zZW5kKGNtLCAwLCBHRlBfS0VSTkVMKTsKKwllcnIgPSBjbl9uZXRsaW5rX3NlbmQoY20sIHBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAKIAlrZnJlZShkYXRhKTsKIApAQCAtMTQ2LDExICsxODgsMTEgQEAKIAlzd2l0Y2ggKGNtZC0+Y21kKSB7CiAJY2FzZSBXMV9DTURfVE9VQ0g6CiAJCXcxX3RvdWNoX2Jsb2NrKGRldiwgY21kLT5kYXRhLCBjbWQtPmxlbik7Ci0JCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kKTsKKwkJdzFfc2VuZF9yZWFkX3JlcGx5KG1zZywgaGRyLCBjbWQsIGRldi0+cG9ydGlkKTsKIAkJYnJlYWs7CiAJY2FzZSBXMV9DTURfUkVBRDoKIAkJdzFfcmVhZF9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwotCQl3MV9zZW5kX3JlYWRfcmVwbHkobXNnLCBoZHIsIGNtZCk7CisJCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kLCBkZXYtPnBvcnRpZCk7CiAJCWJyZWFrOwogCWNhc2UgVzFfQ01EX1dSSVRFOgogCQl3MV93cml0ZV9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwpAQCAtMTYzLDM4ICsyMDUsNTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLAotCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmVxX2NtZCkKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX2FkZHJlbW92ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsCisJc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCWludCBlcnIgPSAwOworCXN0cnVjdCB3MV9yZWdfbnVtICppZDsKKworCWlmIChjbWQtPmxlbiAhPSA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkID0gKHN0cnVjdCB3MV9yZWdfbnVtICopY21kLT5kYXRhOworCisJc2wgPSB3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKGRldiwgaWQpOworCXN3aXRjaCAoY21kLT5jbWQpIHsKKwljYXNlIFcxX0NNRF9TTEFWRV9BREQ6CisJCWlmIChzbCkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCWVyciA9IHcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCBpZCk7CisJCWJyZWFrOworCWNhc2UgVzFfQ01EX1NMQVZFX1JFTU9WRToKKwkJaWYgKHNsKQorCQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJZWxzZQorCQkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwKKwlzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsCisJc3RydWN0IHcxX25ldGxpbmtfY21kICpyZXFfY21kKQogewogCWludCBlcnIgPSAtRUlOVkFMOwotCXN0cnVjdCBjbl9tc2cgKm1zZzsKLQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkcjsKLQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKIAotCW1zZyA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltc2ctPmlkID0gcmVxX21zZy0+aWQ7Ci0JbXNnLT5zZXEgPSByZXFfbXNnLT5zZXE7Ci0JbXNnLT5hY2sgPSAwOwotCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQotCWhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7Ci0JY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKLQotCWhkci0+dHlwZSA9IFcxX01BU1RFUl9DTUQ7Ci0JaGRyLT5pZCA9IHJlcV9oZHItPmlkOwotCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0KLQljbWQtPmNtZCA9IHJlcV9jbWQtPmNtZDsKLQljbWQtPmxlbiA9IDA7Ci0KLQlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJLyogZHJvcCBidXNfbXV0ZXggZm9yIHNlYXJjaCAoZG9lcyBpdCdzIG93biBsb2NraW5nKSwgYW5kIGFkZC9yZW1vdmUKKwkgKiB3aGljaCBkb2Vzbid0IHVzZSB0aGUgYnVzCisJICovCisJc3dpdGNoIChyZXFfY21kLT5jbWQpIHsKIAljYXNlIFcxX0NNRF9TRUFSQ0g6CiAJY2FzZSBXMV9DTURfQUxBUk1fU0VBUkNIOgotCQllcnIgPSB3MV9wcm9jZXNzX3NlYXJjaF9jb21tYW5kKGRldiwgbXNnLAotCQkJCVBBR0VfU0laRSAtIG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKTsKKwljYXNlIFcxX0NNRF9MSVNUX1NMQVZFUzoKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19tdXRleCk7CisJCWVyciA9IHcxX2dldF9zbGF2ZXMoZGV2LCByZXFfbXNnLCByZXFfaGRyLCByZXFfY21kKTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5idXNfbXV0ZXgpOwogCQlicmVhazsKIAljYXNlIFcxX0NNRF9SRUFEOgogCWNhc2UgVzFfQ01EX1dSSVRFOgpAQCAtMjA0LDEyICsyNjUsMjAgQEAKIAljYXNlIFcxX0NNRF9SRVNFVDoKIAkJZXJyID0gdzFfcmVzZXRfYnVzKGRldik7CiAJCWJyZWFrOworCWNhc2UgVzFfQ01EX1NMQVZFX0FERDoKKwljYXNlIFcxX0NNRF9TTEFWRV9SRU1PVkU6CisJCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOworCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX2FkZHJlbW92ZShkZXYsIHJlcV9tc2csIHJlcV9oZHIsCisJCQlyZXFfY21kKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5idXNfbXV0ZXgpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAKLQlrZnJlZShtc2cpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIyMyw3ICsyOTIsOCBAQAogCXJldHVybiB3MV9wcm9jZXNzX2NvbW1hbmRfaW8oc2wtPm1hc3RlciwgbXNnLCBoZHIsIGNtZCk7CiB9CiAKLXN0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX3Jvb3Qoc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1jbWQpCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KHN0cnVjdCBjbl9tc2cgKm1zZywKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1jbWQsIHUzMiBwb3J0aWQpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqbTsKIAlzdHJ1Y3QgY25fbXNnICpjbjsKQEAgLTI1Niw3ICszMjYsNyBAQAogCW11dGV4X2xvY2soJncxX21sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKIAkJaWYgKGNuLT5sZW4gKyBzaXplb2YoKmlkKSA+IFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgY25fbXNnKSkgewotCQkJY25fbmV0bGlua19zZW5kKGNuLCAwLCBHRlBfS0VSTkVMKTsKKwkJCWNuX25ldGxpbmtfc2VuZChjbiwgcG9ydGlkLCAwLCBHRlBfS0VSTkVMKTsKIAkJCWNuLT5hY2srKzsKIAkJCWNuLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKTsKIAkJCXctPmxlbiA9IDA7CkBAIC0yNjksNyArMzM5LDcgQEAKIAkJaWQrKzsKIAl9CiAJY24tPmFjayA9IDA7Ci0JY25fbmV0bGlua19zZW5kKGNuLCAwLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQoY24sIHBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CiAKIAlrZnJlZShjbik7CkBAIC0yNzcsNyArMzQ3LDcgQEAKIH0KIAogc3RhdGljIGludCB3MV9uZXRsaW5rX3NlbmRfZXJyb3Ioc3RydWN0IGNuX21zZyAqcmNtc2csIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqcm1zZywKLQkJc3RydWN0IHcxX25ldGxpbmtfY21kICpyY21kLCBpbnQgZXJyb3IpCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmNtZCwgaW50IHBvcnRpZCwgaW50IGVycm9yKQogewogCXN0cnVjdCBjbl9tc2cgKmNtc2c7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICptc2c7CkBAIC0zMDQsMzUgKzM3NCwxNDcgQEAKIAkJY21zZy0+bGVuICs9IHNpemVvZigqY21kKTsKIAl9CiAKLQllcnJvciA9IGNuX25ldGxpbmtfc2VuZChjbXNnLCAwLCBHRlBfS0VSTkVMKTsKKwllcnJvciA9IGNuX25ldGxpbmtfc2VuZChjbXNnLCBwb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCWtmcmVlKGNtc2cpOwogCiAJcmV0dXJuIGVycm9yOwogfQogCisvKiBCdW5kbGUgdG9nZXRoZXIgYSByZWZlcmVuY2UgY291bnQsIHRoZSBmdWxsIG1lc3NhZ2UsIGFuZCBicm9rZW4gb3V0CisgKiBjb21tYW5kcyB0byBiZSBleGVjdXRlZCBvbiBlYWNoIHcxIG1hc3RlciBrdGhyZWFkIGluIG9uZSBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqLworc3RydWN0IHcxX2NiX2Jsb2NrIHsKKwlhdG9taWNfdCByZWZjbnQ7CisJdTMyIHBvcnRpZDsgLyogU2VuZGluZyBwcm9jZXNzIHBvcnQgSUQgKi8KKwlzdHJ1Y3QgY25fbXNnIG1zZzsKKwkvKiBjbl9tc2cgZGF0YSAqLworCS8qIG9uZSBvciBtb3JlIHZhcmlhYmxlIGxlbmd0aCBzdHJ1Y3QgdzFfY2Jfbm9kZSAqLworfTsKK3N0cnVjdCB3MV9jYl9ub2RlIHsKKwlzdHJ1Y3QgdzFfYXN5bmNfY21kIGFzeW5jOworCS8qIHBvaW50ZXJzIHdpdGhpbiB3MV9jYl9ibG9jayBhbmQgbXNnIGRhdGEgKi8KKwlzdHJ1Y3QgdzFfY2JfYmxvY2sgKmJsb2NrOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbTsKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKK307CisKK3N0YXRpYyB2b2lkIHcxX3Byb2Nlc3NfY2Ioc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfYXN5bmNfY21kICphc3luY19jbWQpCit7CisJc3RydWN0IHcxX2NiX25vZGUgKm5vZGUgPSBjb250YWluZXJfb2YoYXN5bmNfY21kLCBzdHJ1Y3QgdzFfY2Jfbm9kZSwKKwkJYXN5bmMpOworCXUxNiBtbGVuID0gbm9kZS0+bS0+bGVuOworCXU4ICpjbWRfZGF0YSA9IG5vZGUtPm0tPmRhdGE7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IG5vZGUtPnNsOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kID0gTlVMTDsKKworCW11dGV4X2xvY2soJmRldi0+YnVzX211dGV4KTsKKwlkZXYtPnBvcnRpZCA9IG5vZGUtPmJsb2NrLT5wb3J0aWQ7CisJaWYgKHNsICYmIHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCWVyciA9IC1FTk9ERVY7CisKKwl3aGlsZSAobWxlbiAmJiAhZXJyKSB7CisJCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKiljbWRfZGF0YTsKKworCQlpZiAoY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSA+IG1sZW4pIHsKKwkJCWVyciA9IC1FMkJJRzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNsKQorCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHNsLCAmbm9kZS0+YmxvY2stPm1zZywKKwkJCQlub2RlLT5tLCBjbWQpOworCQllbHNlCisJCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKGRldiwgJm5vZGUtPmJsb2NrLT5tc2csCisJCQkJbm9kZS0+bSwgY21kKTsKKworCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IoJm5vZGUtPmJsb2NrLT5tc2csIG5vZGUtPm0sIGNtZCwKKwkJCW5vZGUtPmJsb2NrLT5wb3J0aWQsIGVycik7CisJCWVyciA9IDA7CisKKwkJY21kX2RhdGEgKz0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwkJbWxlbiAtPSBjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCX0KKworCWlmICghY21kIHx8IGVycikKKwkJdzFfbmV0bGlua19zZW5kX2Vycm9yKCZub2RlLT5ibG9jay0+bXNnLCBub2RlLT5tLCBjbWQsCisJCQlub2RlLT5ibG9jay0+cG9ydGlkLCBlcnIpOworCisJaWYgKHNsKQorCQl3MV91bnJlZl9zbGF2ZShzbCk7CisJZWxzZQorCQlhdG9taWNfZGVjKCZkZXYtPnJlZmNudCk7CisJZGV2LT5wb3J0aWQgPSAwOworCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOworCisJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwlsaXN0X2RlbCgmYXN5bmNfY21kLT5hc3luY19lbnRyeSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCisJaWYgKGF0b21pY19zdWJfcmV0dXJuKDEsICZub2RlLT5ibG9jay0+cmVmY250KSA9PSAwKQorCQlrZnJlZShub2RlLT5ibG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIHcxX2NuX2NhbGxiYWNrKHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpuc3ApCiB7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICptID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKLQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKIAlzdHJ1Y3QgdzFfc2xhdmUgKnNsOwogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwl1MTYgbXNnX2xlbjsKIAlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdzFfY2JfYmxvY2sgKmJsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgdzFfY2Jfbm9kZSAqbm9kZSA9IE5VTEw7CisJaW50IG5vZGVfY291bnQgPSAwOwogCi0Jd2hpbGUgKG1zZy0+bGVuICYmICFlcnIpIHsKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG1hc3RlciBvciBzbGF2ZSBjb21tYW5kcyB0aGVyZSBhcmUgdG8gYWxsb2NhdGUKKwkgKiBzcGFjZSBmb3Igb25lIGNiX25vZGUgZWFjaC4KKwkgKi8KKwltc2dfbGVuID0gbXNnLT5sZW47CisJd2hpbGUgKG1zZ19sZW4gJiYgIWVycikgeworCQlpZiAobS0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgPiBtc2dfbGVuKSB7CisJCQllcnIgPSAtRTJCSUc7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChtLT50eXBlID09IFcxX01BU1RFUl9DTUQgfHwgbS0+dHlwZSA9PSBXMV9TTEFWRV9DTUQpCisJCQkrK25vZGVfY291bnQ7CisKKwkJbXNnX2xlbiAtPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbjsKKwkJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoKCh1OCAqKW0pICsKKwkJCXNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuKTsKKwl9CisJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJaWYgKG5vZGVfY291bnQpIHsKKwkJLyogbXNnLT5sZW4gZG9lc24ndCBpbmNsdWRlIGl0c2VsZiAqLworCQlsb25nIHNpemUgPSBzaXplb2Yoc3RydWN0IHcxX2NiX2Jsb2NrKSArIG1zZy0+bGVuICsKKwkJCW5vZGVfY291bnQqc2l6ZW9mKHN0cnVjdCB3MV9jYl9ub2RlKTsKKwkJYmxvY2sgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWJsb2NrKSB7CisJCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBOVUxMLCBuc3AtPnBvcnRpZCwKKwkJCQktRU5PTUVNKTsKKwkJCXJldHVybjsKKwkJfQorCQlhdG9taWNfc2V0KCZibG9jay0+cmVmY250LCAxKTsKKwkJYmxvY2stPnBvcnRpZCA9IG5zcC0+cG9ydGlkOworCQltZW1jcHkoJmJsb2NrLT5tc2csIG1zZywgc2l6ZW9mKCptc2cpICsgbXNnLT5sZW4pOworCQlub2RlID0gKHN0cnVjdCB3MV9jYl9ub2RlICopKCh1OCAqKWJsb2NrLT5tc2cuZGF0YSArIG1zZy0+bGVuKTsKKwl9CisKKwltc2dfbGVuID0gbXNnLT5sZW47CisJd2hpbGUgKG1zZ19sZW4gJiYgIWVycikgewogCQlzdHJ1Y3QgdzFfcmVnX251bSBpZDsKIAkJdTE2IG1sZW4gPSBtLT5sZW47Ci0JCXU4ICpjbWRfZGF0YSA9IG0tPmRhdGE7CiAKIAkJZGV2ID0gTlVMTDsKIAkJc2wgPSBOVUxMOwotCQljbWQgPSBOVUxMOwogCiAJCW1lbWNweSgmaWQsIG0tPmlkLmlkLCBzaXplb2YoaWQpKTsKICNpZiAwCiAJCXByaW50aygiJXM6ICUwMnguJTAxMmxseC4lMDJ4OiB0eXBlPSUwMngsIGxlbj0ldS5cbiIsCiAJCQkJX19mdW5jX18sIGlkLmZhbWlseSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpZC5pZCwgaWQuY3JjLCBtLT50eXBlLCBtLT5sZW4pOwogI2VuZGlmCi0JCWlmIChtLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSA+IG1zZy0+bGVuKSB7CisJCWlmIChtLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSA+IG1zZ19sZW4pIHsKIAkJCWVyciA9IC1FMkJJRzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNDQsNyArNTI2LDcgQEAKIAkJCWlmIChzbCkKIAkJCQlkZXYgPSBzbC0+bWFzdGVyOwogCQl9IGVsc2UgewotCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3Jvb3QobXNnLCBtKTsKKwkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KG1zZywgbSwgbnNwLT5wb3J0aWQpOwogCQkJZ290byBvdXRfY29udDsKIAkJfQogCkBAIC0zNTcsNDEgKzUzOSwyNCBAQAogCQlpZiAoIW1sZW4pCiAJCQlnb3RvIG91dF9jb250OwogCi0JCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQlhdG9taWNfaW5jKCZibG9jay0+cmVmY250KTsKKwkJbm9kZS0+YXN5bmMuY2IgPSB3MV9wcm9jZXNzX2NiOworCQlub2RlLT5ibG9jayA9IGJsb2NrOworCQlub2RlLT5tID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKSgodTggKikmYmxvY2stPm1zZyArCisJCQkoc2l6ZV90KSgodTggKiltIC0gKHU4ICopbXNnKSk7CisJCW5vZGUtPnNsID0gc2w7CisJCW5vZGUtPmRldiA9IGRldjsKIAotCQlpZiAoc2wgJiYgdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgewotCQkJZXJyID0gLUVOT0RFVjsKLQkJCWdvdG8gb3V0X3VwOwotCQl9CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCWxpc3RfYWRkX3RhaWwoJm5vZGUtPmFzeW5jLmFzeW5jX2VudHJ5LCAmZGV2LT5hc3luY19saXN0KTsKKwkJd2FrZV91cF9wcm9jZXNzKGRldi0+dGhyZWFkKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQkrK25vZGU7CiAKLQkJd2hpbGUgKG1sZW4pIHsKLQkJCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKiljbWRfZGF0YTsKLQotCQkJaWYgKGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgPiBtbGVuKSB7Ci0JCQkJZXJyID0gLUUyQklHOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoc2wpCi0JCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHNsLCBtc2csIG0sIGNtZCk7Ci0JCQllbHNlCi0JCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihkZXYsIG1zZywgbSwgY21kKTsKLQotCQkJdzFfbmV0bGlua19zZW5kX2Vycm9yKG1zZywgbSwgY21kLCBlcnIpOwotCQkJZXJyID0gMDsKLQotCQkJY21kX2RhdGEgKz0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQkJCW1sZW4gLT0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQkJfQotb3V0X3VwOgotCQlhdG9taWNfZGVjKCZkZXYtPnJlZmNudCk7Ci0JCWlmIChzbCkKLQkJCWF0b21pY19kZWMoJnNsLT5yZWZjbnQpOwotCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogb3V0X2NvbnQ6Ci0JCWlmICghY21kIHx8IGVycikKLQkJCXcxX25ldGxpbmtfc2VuZF9lcnJvcihtc2csIG0sIGNtZCwgZXJyKTsKLQkJbXNnLT5sZW4gLT0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW47CisJCWlmIChlcnIpCisJCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBOVUxMLCBuc3AtPnBvcnRpZCwgZXJyKTsKKwkJbXNnX2xlbiAtPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbjsKIAkJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoKCh1OCAqKW0pICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW4pOwogCiAJCS8qCkBAIC00MDAsNiArNTY1LDggQEAKIAkJaWYgKGVyciA9PSAtRU5PREVWKQogCQkJZXJyID0gMDsKIAl9CisJaWYgKGJsb2NrICYmIGF0b21pY19zdWJfcmV0dXJuKDEsICZibG9jay0+cmVmY250KSA9PSAwKQorCQlrZnJlZShibG9jayk7CiB9CiAKIGludCB3MV9pbml0X25ldGxpbmsodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKaW5kZXggYjA5MjJkYy4uMWU5NTA0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKKysrIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKQEAgLTI3LDYgKzI3LDE4IEBACiAKICNpbmNsdWRlICJ3MS5oIgogCisvKioKKyAqIGVudW0gdzFfbmV0bGlua19tZXNzYWdlX3R5cGVzIC0gbWVzc2FnZSB0eXBlCisgKgorICogQFcxX1NMQVZFX0FERDogbm90aWZpY2F0aW9uIHRoYXQgYSBzbGF2ZSBkZXZpY2Ugd2FzIGFkZGVkCisgKiBAVzFfU0xBVkVfUkVNT1ZFOiBub3RpZmljYXRpb24gdGhhdCBhIHNsYXZlIGRldmljZSB3YXMgcmVtb3ZlZAorICogQFcxX01BU1RFUl9BREQ6IG5vdGlmaWNhdGlvbiB0aGF0IGEgbmV3IGJ1cyBtYXN0ZXIgd2FzIGFkZGVkCisgKiBAVzFfTUFTVEVSX1JFTU9WRTogbm90aWZpY2F0aW9uIHRoYXQgYSBidXMgbWFzdGVyd2FzIHJlbW92ZWQKKyAqIEBXMV9NQVNURVJfQ01EOiBpbml0aWF0ZSBvcGVyYXRpb25zIG9uIGEgc3BlY2lmaWMgbWFzdGVyCisgKiBAVzFfU0xBVkVfQ01EOiBzZW5kcyByZXNldCwgc2VsZWN0cyB0aGUgc2xhdmUsIHRoZW4gZG9lcyBhIHJlYWQvd3JpdGUvdG91Y2gKKyAqIG9wZXJhdGlvbgorICogQFcxX0xJU1RfTUFTVEVSUzogdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJ1cyBtYXN0ZXIgaWRlbnRpZmllcnMKKyAqLwogZW51bSB3MV9uZXRsaW5rX21lc3NhZ2VfdHlwZXMgewogCVcxX1NMQVZFX0FERCA9IDAsCiAJVzFfU0xBVkVfUkVNT1ZFLApAQCAtNTIsNiArNjQsMjIgQEAKIAlfX3U4CQkJCWRhdGFbMF07CiB9OwogCisvKioKKyAqIGVudW0gdzFfY29tbWFuZHMgLSBjb21tYW5kcyBhdmFpbGFibGUgZm9yIG1hc3RlciBvciBzbGF2ZSBvcGVyYXRpb25zCisgKiBAVzFfQ01EX1JFQUQ6IHJlYWQgbGVuIGJ5dGVzCisgKiBAVzFfQ01EX1dSSVRFOiB3cml0ZSBsZW4gYnl0ZXMKKyAqIEBXMV9DTURfU0VBUkNIOiBpbml0aWF0ZSBhIHN0YW5kYXJkIHNlYXJjaCwgcmV0dXJucyBvbmx5IHRoZSBzbGF2ZQorICogZGV2aWNlcyBmb3VuZCBkdXJpbmcgdGhhdCBzZWFyY2gKKyAqIEBXMV9DTURfQUxBUk1fU0VBUkNIOiBzZWFyY2ggZm9yIGRldmljZXMgdGhhdCBhcmUgY3VycmVudGx5IGFsYXJtaW5nCisgKiBAVzFfQ01EX1RPVUNIOiBUb3VjaGVzIGEgc2VyaWVzIG9mIGJ5dGVzLgorICogQFcxX0NNRF9SRVNFVDogc2VuZHMgYSBidXMgcmVzZXQgb24gdGhlIGdpdmVuIG1hc3RlcgorICogQFcxX0NNRF9TTEFWRV9BREQ6IGFkZHMgYSBzbGF2ZSB0byB0aGUgZ2l2ZW4gbWFzdGVyLAorICogOCBieXRlIHNsYXZlIGlkIGF0IGRhdGFbMF0KKyAqIEBXMV9DTURfU0xBVkVfUkVNT1ZFOiByZW1vdmVzIGEgc2xhdmUgdG8gdGhlIGdpdmVuIG1hc3RlciwKKyAqIDggYnl0ZSBzbGF2ZSBpZCBhdCBkYXRhWzBdCisgKiBAVzFfQ01EX0xJU1RfU0xBVkVTOiBsaXN0IG9mIHNsYXZlcyByZWdpc3RlcmVkIG9uIHRoaXMgbWFzdGVyCisgKiBAVzFfQ01EX01BWDogbnVtYmVyIG9mIGF2YWlsYWJsZSBjb21tYW5kcworICovCiBlbnVtIHcxX2NvbW1hbmRzIHsKIAlXMV9DTURfUkVBRCA9IDAsCiAJVzFfQ01EX1dSSVRFLApAQCAtNTksNyArODcsMTAgQEAKIAlXMV9DTURfQUxBUk1fU0VBUkNILAogCVcxX0NNRF9UT1VDSCwKIAlXMV9DTURfUkVTRVQsCi0JVzFfQ01EX01BWCwKKwlXMV9DTURfU0xBVkVfQURELAorCVcxX0NNRF9TTEFWRV9SRU1PVkUsCisJVzFfQ01EX0xJU1RfU0xBVkVTLAorCVcxX0NNRF9NQVgKIH07CiAKIHN0cnVjdCB3MV9uZXRsaW5rX2NtZApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDc5ZDI1ODkuLjBjNjA0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTExMSw2ICsxMTEsMTUgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyBpbiB0aGUgV004MzUwIEF1ZGlvUGx1cyBQTUlDLiAgV2hlbgogCSAgdGhlIHdhdGNoZG9nIHRyaWdnZXJzIHRoZSBzeXN0ZW0gd2lsbCBiZSByZXNldC4KIAorY29uZmlnIFhJTElOWF9XQVRDSERPRworCXRyaXN0YXRlICJYaWxpbnggV2F0Y2hkb2cgdGltZXIiCisJc2VsZWN0IFdBVENIRE9HX0NPUkUKKwloZWxwCisJICBXYXRjaGRvZyBkcml2ZXIgZm9yIHRoZSB4cHNfdGltZWJhc2Vfd2R0IGlwIGNvcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9mX3hpbGlueF93ZHQuCisKICMgQUxQSEEgQXJjaGl0ZWN0dXJlCiAKICMgQVJNIEFyY2hpdGVjdHVyZQpAQCAtMjkyLDcgKzMwMSw3IEBACiAKIGNvbmZpZyBPUklPTl9XQVRDSERPRwogCXRyaXN0YXRlICJPcmlvbiB3YXRjaGRvZyIKLQlkZXBlbmRzIG9uIEFSQ0hfT1JJT041WCB8fCBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRQorCWRlcGVuZHMgb24gQVJDSF9PUklPTjVYIHx8IEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9ET1ZFIHx8IE1BQ0hfRE9WRQogCXNlbGVjdCBXQVRDSERPR19DT1JFCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyB0aW1lcgpAQCAtNDIxLDYgKzQzMCwxNyBAQAogCSAgU3VwcG9ydCBmb3IgQ1NSIFNpUkZwcmltYUlJIGFuZCBTaVJGYXRsYXNWSSB3YXRjaGRvZy4gV2hlbgogCSAgdGhlIHdhdGNoZG9nIHRyaWdnZXJzIHRoZSBzeXN0ZW0gd2lsbCBiZSByZXNldC4KIAorY29uZmlnIFRFR1JBX1dBVENIRE9HCisJdHJpc3RhdGUgIlRlZ3JhIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gQVJDSF9URUdSQSB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgV0FUQ0hET0dfQ09SRQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIKKwkgIGVtYmVkZGVkIGluIE5WSURJQSBUZWdyYSBTb0NzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0ZWdyYV93ZHQuCisKICMgQVZSMzIgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBBVDMyQVA3MDBYX1dEVApAQCAtNTMzLDcgKzU1Myw3IEBACiAKIGNvbmZpZyBTQzUyMF9XRFQKIAl0cmlzdGF0ZSAiQU1EIEVsYW4gU0M1MjAgcHJvY2Vzc29yIFdhdGNoZG9nIgotCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBNRUxBTgogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGJ1aWx0IGluIHRvIHRoZQogCSAgQU1EICJFbGFuIiBTQzUyMCBtaWNyb2NvbXB1dGVyIGNvbW1vbmx5IHVzZWQgaW4gZW1iZWRkZWQgc3lzdGVtcy4KQEAgLTEwMjMsMTggKzEwNDMsNiBAQAogCiAjIE1pY3JvQmxhemUgQXJjaGl0ZWN0dXJlCiAKLWNvbmZpZyBYSUxJTlhfV0FUQ0hET0cKLQl0cmlzdGF0ZSAiWGlsaW54IFdhdGNoZG9nIHRpbWVyIgotCWRlcGVuZHMgb24gTUlDUk9CTEFaRQotCS0tLWhlbHAtLS0KLQkgIFdhdGNoZG9nIGRyaXZlciBmb3IgdGhlIHhwc190aW1lYmFzZV93ZHQgaXAgY29yZS4KLQotCSAgSU1QT1JUQU5UOiBUaGUgeHBzX3RpbWViYXNlX3dkdCBwYXJlbnQgbXVzdCBoYXZlIHRoZSBwcm9wZXJ0eQotCSAgImNsb2NrLWZyZXF1ZW5jeSIgYXQgZGV2aWNlIHRyZWUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9mX3hpbGlueF93ZHQuCi0KICMgTUlQUyBBcmNoaXRlY3R1cmUKIAogY29uZmlnIEFUSDc5X1dEVApAQCAtMTE2MCw3ICsxMTY4LDcgQEAKIAogY29uZmlnIEJDTV9LT05BX1dEVAogCXRyaXN0YXRlICJCQ00gS29uYSBXYXRjaGRvZyIKLQlkZXBlbmRzIG9uIEFSQ0hfQkNNCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9NT0JJTEUKIAlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyB0aW1lciBvbiB0aGUgZm9sbG93aW5nIEJyb2FkY29tIEJDTTI4MXh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQppbmRleCA5ODVhNjZjLi4xYjVmM2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTU4LDYgKzU4LDcgQEAKIG9iai0kKENPTkZJR19NT1hBUlRfV0RUKSArPSBtb3hhcnRfd2R0Lm8KIG9iai0kKENPTkZJR19TSVJGU09DX1dBVENIRE9HKSArPSBzaXJmc29jX3dkdC5vCiBvYmotJChDT05GSUdfQkNNX0tPTkFfV0RUKSArPSBiY21fa29uYV93ZHQubworb2JqLSQoQ09ORklHX1RFR1JBX1dBVENIRE9HKSArPSB0ZWdyYV93ZHQubwogCiAjIEFWUjMyIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHX0FUMzJBUDcwMFhfV0RUKSArPSBhdDMyYXA3MDB4X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jCmluZGV4IDVjZjE2MjEuLjU2MTQ0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jCkBAIC0yMzksNyArMjM5LDcgQEAKICAqCUluaXQgJiBleGl0IHJvdXRpbmVzCiAgKi8KIAotc3RhdGljIGludCBhY3FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgYWNxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwogCkBAIC0yOTEsNyArMjkxLDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWNxdWlyZXdkdF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGFjcV9wcm9iZSwKIAkucmVtb3ZlCQk9IGFjcV9yZW1vdmUsCiAJLnNodXRkb3duCT0gYWNxX3NodXRkb3duLAogCS5kcml2ZXIJCT0gewpAQCAtMzA2LDIwICszMDUsMTggQEAKIAogCXByX2luZm8oIldEVCBkcml2ZXIgZm9yIEFjcXVpcmUgc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZ1xuIik7CiAKLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFjcXVpcmV3ZHRfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJYWNxX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWX05BTUUsCiAJCQkJCQkJCS0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKGFjcV9wbGF0Zm9ybV9kZXZpY2UpKSB7Ci0JCWVyciA9IFBUUl9FUlIoYWNxX3BsYXRmb3JtX2RldmljZSk7Ci0JCWdvdG8gdW5yZWdfcGxhdGZvcm1fZHJpdmVyOwotCX0KKwlpZiAoSVNfRVJSKGFjcV9wbGF0Zm9ybV9kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihhY3FfcGxhdGZvcm1fZGV2aWNlKTsKKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYWNxdWlyZXdkdF9kcml2ZXIsIGFjcV9wcm9iZSk7CisJaWYgKGVycikKKwkJZ290byB1bnJlZ19wbGF0Zm9ybV9kZXZpY2U7CiAJcmV0dXJuIDA7CiAKLXVucmVnX3BsYXRmb3JtX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWNxdWlyZXdkdF9kcml2ZXIpOwordW5yZWdfcGxhdGZvcm1fZGV2aWNlOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFjcV9wbGF0Zm9ybV9kZXZpY2UpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2FkdmFudGVjaHdkdC5jCmluZGV4IGE4OTYxYWQuLjc3OTZkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hZHZhbnRlY2h3ZHQuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAgKglJbml0ICYgZXhpdCByb3V0aW5lcwogICovCiAKLXN0YXRpYyBpbnQgYWR2d2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGFkdndkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIApAQCAtMjk5LDcgKzI5OSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFkdndkdF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGFkdndkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IGFkdndkdF9yZW1vdmUsCiAJLnNodXRkb3duCT0gYWR2d2R0X3NodXRkb3duLAogCS5kcml2ZXIJCT0gewpAQCAtMzE0LDIxICszMTMsMTkgQEAKIAogCXByX2luZm8oIldEVCBkcml2ZXIgZm9yIEFkdmFudGVjaCBzaW5nbGUgYm9hcmQgY29tcHV0ZXIgaW5pdGlhbGlzaW5nXG4iKTsKIAotCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWR2d2R0X2RyaXZlcik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWFkdndkdF9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLAogCQkJCQkJCQktMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKSkgewotCQllcnIgPSBQVFJfRVJSKGFkdndkdF9wbGF0Zm9ybV9kZXZpY2UpOwotCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RyaXZlcjsKLQl9CisJaWYgKElTX0VSUihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWR2d2R0X3BsYXRmb3JtX2RldmljZSk7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmFkdndkdF9kcml2ZXIsIGFkdndkdF9wcm9iZSk7CisJaWYgKGVycikKKwkJZ290byB1bnJlZ19wbGF0Zm9ybV9kZXZpY2U7CiAKIAlyZXR1cm4gMDsKIAotdW5yZWdfcGxhdGZvcm1fZHJpdmVyOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhZHZ3ZHRfZHJpdmVyKTsKK3VucmVnX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FyN193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXI3X3dkdC5jCmluZGV4IDNhOTk2NTcuLmFlNmMyODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYXI3X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXI3X3dkdC5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYwppbmRleCBhZmU3ZDE3Li4yNWI1YzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hdDMyYXA3MDB4X3dkdC5jCkBAIC0zMjMsMTAgKzMyMyw4IEBACiAKIAl3ZHQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3ZHRfYXQzMmFwNzAweCksCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXdkdCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHdkdCBzdHJ1Y3R1cmVcbiIpOworCWlmICghd2R0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl3ZHQtPnJlZ3MgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOwogCWlmICghd2R0LT5yZWdzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hdGg3OV93ZHQuYwppbmRleCA5ZmExZjY5Li4zOTljM2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXRoNzlfd2R0LmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9iY20yODM1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9iY20yODM1X3dkdC5jCmluZGV4IGNhZmE5NzMuLjhkZjQ1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYmNtMjgzNV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTI4MzVfd2R0LmMKQEAgLTExNCwxMCArMTE0LDggQEAKIAlpbnQgZXJyOwogCiAJd2R0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBiY20yODM1X3dkdCksIEdGUF9LRVJORUwpOwotCWlmICghd2R0KSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igd2F0Y2hkb2cgZGV2aWNlIik7CisJaWYgKCF3ZHQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3ZHQpOwogCiAJc3Bpbl9sb2NrX2luaXQoJndkdC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMKaW5kZXggYjQwMjFhMmIuLmI2MWZjYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYmNtNDd4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9iY200N3h4X3dkdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2JjbTYzeHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTYzeHhfd2R0LmMKaW5kZXggNGViMTg4Yi4uNWE4ZTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9iY202M3h4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYmNtNjN4eF93ZHQuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CkBAIC00NSw3ICs0NCw2IEBACiBzdGF0aWMgc3RydWN0IHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Ci0JaW50IGRlZmF1bHRfdGlja3M7CiAJdW5zaWduZWQgbG9uZyBpbnVzZTsKIAlhdG9taWNfdCB0aWNrczsKIH0gYmNtNjN4eF93ZHRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9ib29rZV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKaW5kZXggZjFiOGQ1NS4uYThkYmNlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ib29rZV93ZHQuYwpAQCAtMTM4LDE0ICsxMzgsNiBAQAogCXZhbCAmPSB+V0RUUF9NQVNLOwogCXZhbCB8PSAoVENSX1dJRXxUQ1JfV1JDKFdSQ19DSElQKXxXRFRQKGJvb2tlX3dkdF9wZXJpb2QpKTsKIAotI2lmZGVmIENPTkZJR19QUENfQk9PSzNFXzY0Ci0JLyoKLQkgKiBDcml0IGludHMgYXJlIGN1cnJlbnRseSBicm9rZW4gb24gUFBDNjQgQm9vay1FLCBzbwotCSAqIGp1c3QgZGlzYWJsZSB0aGVtIGZvciBub3cuCi0JICovCi0JdmFsICY9IH5UQ1JfV0lFOwotI2VuZGlmCi0KIAltdHNwcihTUFJOX1RDUiwgdmFsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9jcHU1d2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2NwdTV3ZHQuYwppbmRleCBmN2FlNDllLi42ZDAzZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2NwdTV3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2NwdTV3ZHQuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2Nwd2QuYwppbmRleCAyMTMyMjVlLi5lNTVlZDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2Nwd2QuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2Nwd2QuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2RhOTA1Ml93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDUyX3dkdC5jCmluZGV4IGYwOWM1NGUuLjJlOTU4OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDUyX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDUyX3dkdC5jCkBAIC0xODUsNyArMTg1LDYgQEAKIAlkcml2ZXJfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRyaXZlcl9kYXRhKSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWRyaXZlcl9kYXRhKSB7Ci0JCWRldl9lcnIoZGE5MDUyLT5kZXYsICJVbmFibGUgdG8gYWxsb2FjYXRlIHdhdGNoZG9nIGRldmljZVxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDU1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9kYTkwNTVfd2R0LmMKaW5kZXggNTc1ZjM3YS4uNDk1MDg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9kYTkwNTVfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9kYTkwNTVfd2R0LmMKQEAgLTE1MSwxMCArMTUxLDggQEAKIAogCWRyaXZlcl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJpdmVyX2RhdGEpLAogCQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghZHJpdmVyX2RhdGEpIHsKLQkJZGV2X2VycihkYTkwNTUtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB3YXRjaGRvZyBkZXZpY2VcbiIpOworCWlmICghZHJpdmVyX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRyaXZlcl9kYXRhLT5kYTkwNTUgPSBkYTkwNTU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZGF2aW5jaV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGF2aW5jaV93ZHQuYwppbmRleCBiMWJhZTAzLi5kMDlhZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2RhdmluY2lfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9kYXZpbmNpX3dkdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9lcDkzeHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2VwOTN4eF93ZHQuYwppbmRleCBkMWQwN2YyLi41ZjU0ZTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2VwOTN4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2VwOTN4eF93ZHQuYwpAQCAtMTE4LDE2ICsxMTgsOSBAQAogCWludCBlcnI7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAotCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCW1taW9fYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghbW1pb19iYXNlKQotCQlyZXR1cm4gLUVOWElPOworCW1taW9fYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobW1pb19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobW1pb19iYXNlKTsKIAogCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gMzYwMCkgewogCQl0aW1lb3V0ID0gV0RUX1RJTUVPVVQ7CkBAIC0xNzIsOSArMTY1LDkgQEAKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihlcDkzeHhfd2R0X2RyaXZlcik7CiAKLU1PRFVMRV9BVVRIT1IoIlJheSBMZWh0aW5pZW1pIDxyYXlsQG1haWwuY29tPiwiCi0JCSJBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4sIgotCQkiSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSYXkgTGVodGluaWVtaSA8cmF5bEBtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0FVVEhPUigiSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkVQOTN4eCBXYXRjaGRvZyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oV0RUX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9nZW9kZXdkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9nZW9kZXdkdC5jCmluZGV4IDRhNmFlODQuLjRjNDNlM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvZ2VvZGV3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2dlb2Rld2R0LmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCS5mb3BzID0gJmdlb2Rld2R0X2ZvcHMsCiB9OwogCi1zdGF0aWMgaW50IGdlb2Rld2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGdlb2Rld2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwogCkBAIC0yNTUsNyArMjU1LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ2VvZGV3ZHRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBnZW9kZXdkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IGdlb2Rld2R0X3JlbW92ZSwKIAkuc2h1dGRvd24JPSBnZW9kZXdkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKQEAgLTI2OCwyMCArMjY3LDE4IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2VvZGV3ZHRfZHJpdmVyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwKIAkJCQkJCQkJLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlKSkgewotCQlyZXQgPSBQVFJfRVJSKGdlb2Rld2R0X3BsYXRmb3JtX2RldmljZSk7CisJaWYgKElTX0VSUihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZnZW9kZXdkdF9kcml2ZXIsIGdlb2Rld2R0X3Byb2JlKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycjsKLQl9CiAKIAlyZXR1cm4gMDsKIGVycjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ2VvZGV3ZHRfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwppbmRleCAyYjc1ZThiLi43NWQyMjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCkBAIC0xNyw3ICsxNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jIGIvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jCmluZGV4IDI1YTJiZmQuLmQ3YmVmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaTYzMDBlc2IuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2k2MzAwZXNiLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKaW5kZXggMDRmOGFmNi4uMGU2YzAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYwpAQCAtMzQ3LDE1ICszNDcsMTUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIGlUQ09fd2R0X29wcyA9IHsKIAkub3duZXIgPQkJVEhJU19NT0RVTEUsCiAJLnN0YXJ0ID0JCWlUQ09fd2R0X3N0YXJ0LAotCS5zdG9wID0gCQlpVENPX3dkdF9zdG9wLAotCS5waW5nID0gCQlpVENPX3dkdF9waW5nLAorCS5zdG9wID0JCQlpVENPX3dkdF9zdG9wLAorCS5waW5nID0JCQlpVENPX3dkdF9waW5nLAogCS5zZXRfdGltZW91dCA9CQlpVENPX3dkdF9zZXRfdGltZW91dCwKIAkuZ2V0X3RpbWVsZWZ0ID0JCWlUQ09fd2R0X2dldF90aW1lbGVmdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIGlUQ09fd2R0X3dhdGNoZG9nX2RldiA9IHsKIAkuaW5mbyA9CQkmaWRlbnQsCi0JLm9wcyA9IAkJJmlUQ09fd2R0X29wcywKKwkub3BzID0JCSZpVENPX3dkdF9vcHMsCiB9OwogCiAvKgpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJaVRDT193ZHRfd2F0Y2hkb2dfZGV2LmJvb3RzdGF0dXMgPSAwOwogCWlUQ09fd2R0X3dhdGNoZG9nX2Rldi50aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsKIAl3YXRjaGRvZ19zZXRfbm93YXlvdXQoJmlUQ09fd2R0X3dhdGNoZG9nX2Rldiwgbm93YXlvdXQpOwotCWlUQ09fd2R0X3dhdGNoZG9nX2Rldi5wYXJlbnQgPSBkZXYtPmRldi5wYXJlbnQ7CisJaVRDT193ZHRfd2F0Y2hkb2dfZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgd2F0Y2hkb2cgaXMgbm90IHJ1bm5pbmcgKi8KIAlpVENPX3dkdF9zdG9wKCZpVENPX3dkdF93YXRjaGRvZ19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pYjcwMHdkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pYjcwMHdkdC5jCmluZGV4IDdhZTM2NjkuLjQyNDdjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaWI3MDB3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2liNzAwd2R0LmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICoJSW5pdCAmIGV4aXQgcm91dGluZXMKICAqLwogCi1zdGF0aWMgaW50IGlid2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGlid2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzOwogCkBAIC0zMzYsNyArMzM2LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaWJ3ZHRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBpYndkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IGlid2R0X3JlbW92ZSwKIAkuc2h1dGRvd24JPSBpYndkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKQEAgLTM1MSwyMSArMzUwLDE5IEBACiAKIAlwcl9pbmZvKCJXRFQgZHJpdmVyIGZvciBJQjcwMCBzaW5nbGUgYm9hcmQgY29tcHV0ZXIgaW5pdGlhbGlzaW5nXG4iKTsKIAotCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaWJ3ZHRfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJaWJ3ZHRfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwKIAkJCQkJCQkJLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoaWJ3ZHRfcGxhdGZvcm1fZGV2aWNlKSkgewotCQllcnIgPSBQVFJfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSk7Ci0JCWdvdG8gdW5yZWdfcGxhdGZvcm1fZHJpdmVyOwotCX0KKwlpZiAoSVNfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSk7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmlid2R0X2RyaXZlciwgaWJ3ZHRfcHJvYmUpOworCWlmIChlcnIpCisJCWdvdG8gdW5yZWdfcGxhdGZvcm1fZGV2aWNlOwogCiAJcmV0dXJuIDA7CiAKLXVucmVnX3BsYXRmb3JtX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaWJ3ZHRfZHJpdmVyKTsKK3VucmVnX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpYndkdF9wbGF0Zm9ybV9kZXZpY2UpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaWJtYXNyLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jCmluZGV4IGRiMGEzNDQ2Li4zNjZiMDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaWJtYXNyLmMKQEAgLTM2MCw3ICszNjAsNyBAQAogCWludCB0eXBlOwogfTsKIAotc3RhdGljIHN0cnVjdCBpYm1hc3JfaWQgX19pbml0ZGF0YSBpYm1hc3JfaWRfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWJtYXNyX2lkIGlibWFzcl9pZF90YWJsZVtdIF9faW5pdGRhdGEgPSB7CiAJeyAiSUJNIEF1dG9tYXRpYyBTZXJ2ZXIgUmVzdGFydCAtIGVzZXJ2ZXIgeFNlcmllcyAyMjAiLCBBU01UWVBFX1RPUEFaIH0sCiAJeyAiSUJNIEF1dG9tYXRpYyBTZXJ2ZXIgUmVzdGFydCAtIE1hY2hpbmUgVHlwZSA4NjczIiwgQVNNVFlQRV9QRUFSTCB9LAogCXsgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQgLSBNYWNoaW5lIFR5cGUgODQ4MCIsIEFTTVRZUEVfSkFTUEVSIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2luZHlkb2cuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW5keWRvZy5jCmluZGV4IDFiNWMyNWEuLjVkMjBjZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaW5keWRvZy5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW5keWRvZy5jCkBAIC00MSwyNCArNDEsMTUgQEAKIAogc3RhdGljIHZvaWQgaW5keWRvZ19zdGFydCh2b2lkKQogewotCXUzMiBtY19jdHJsMDsKLQogCXNwaW5fbG9jaygmaW5keWRvZ19sb2NrKTsKLQltY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMDsKLQltY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMCB8IFNHSU1DX0NDVFJMMF9XRE9HOwotCXNnaW1jLT5jcHVjdHJsMCA9IG1jX2N0cmwwOworCXNnaW1jLT5jcHVjdHJsMCB8PSBTR0lNQ19DQ1RSTDBfV0RPRzsKIAlzcGluX3VubG9jaygmaW5keWRvZ19sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaW5keWRvZ19zdG9wKHZvaWQpCiB7Ci0JdTMyIG1jX2N0cmwwOwotCiAJc3Bpbl9sb2NrKCZpbmR5ZG9nX2xvY2spOwotCi0JbWNfY3RybDAgPSBzZ2ltYy0+Y3B1Y3RybDA7Ci0JbWNfY3RybDAgJj0gflNHSU1DX0NDVFJMMF9XRE9HOwotCXNnaW1jLT5jcHVjdHJsMCA9IG1jX2N0cmwwOworCXNnaW1jLT5jcHVjdHJsMCAmPSB+U0dJTUNfQ0NUUkwwX1dET0c7CiAJc3Bpbl91bmxvY2soJmluZHlkb2dfbG9jayk7CiAKIAlwcl9pbmZvKCJTdG9wcGVkIHdhdGNoZG9nIHRpbWVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jCmluZGV4IGUxM2U2NWUuLjBjYWFiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pbnRlbF9zY3Vfd2F0Y2hkb2cuYwpAQCAtMjExLDcgKzIxMSw2IEBACiAJaW50CQkJIGlwY19yZXQ7CiAJaW50CQkJIHJldHJ5X2NvdW50OwogCXUzMgkJCSBzb2Z0X3ZhbHVlOwotCXUzMgkJCSBod19wcmVfdmFsdWU7CiAJdTMyCQkJIGh3X3ZhbHVlOwogCiAJd2F0Y2hkb2dfZGV2aWNlLnRpbWVyX3NldCA9IHQ7CkBAIC0yNzMsOCArMjcyLDcgQEAKIAkJCXdhdGNoZG9nX2RldmljZS50aW1lcl9sb2FkX2NvdW50X2FkZHIpOwogCiAJCS8qIHJlYWQgY291bnQgdmFsdWUgYmVmb3JlIHN0YXJ0aW5nIHRpbWVyICovCi0JCWh3X3ByZV92YWx1ZSA9IGlvcmVhZDMyKHdhdGNoZG9nX2RldmljZS50aW1lcl9sb2FkX2NvdW50X2FkZHIpOwotCQlod19wcmVfdmFsdWUgPSBod19wcmVfdmFsdWUgJiAweEZGRkYwMDAwOworCQlpb3JlYWQzMih3YXRjaGRvZ19kZXZpY2UudGltZXJfbG9hZF9jb3VudF9hZGRyKTsKIAogCQkvKiBTdGFydCB0aGUgdGltZXIgKi8KIAkJaW93cml0ZTMyKDB4MDAwMDAwMDMsIHdhdGNoZG9nX2RldmljZS50aW1lcl9jb250cm9sX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jCmluZGV4IGUyYmJhNjguLjBiOTM3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2l0ODdfd2R0LmMKQEAgLTU0LDYgKzU0LDcgQEAKIAogLyogRGVmYXVsdHMgZm9yIE1vZHVsZSBQYXJhbWV0ZXIgKi8KICNkZWZpbmUgREVGQVVMVF9OT0dBTUVQT1JUCTAKKyNkZWZpbmUgREVGQVVMVF9OT0NJUgkJMAogI2RlZmluZSBERUZBVUxUX0VYQ0xVU0lWRQkxCiAjZGVmaW5lIERFRkFVTFRfVElNRU9VVAkJNjAKICNkZWZpbmUgREVGQVVMVF9URVNUTU9ERQkwCkBAIC0xMzYsMTEgKzEzNywxMyBAQAogI2RlZmluZSBXRFRTX0xPQ0tFRAkzCiAjZGVmaW5lIFdEVFNfVVNFX0dQCTQKICNkZWZpbmUgV0RUU19FWFBFQ1RFRAk1CisjZGVmaW5lIFdEVFNfVVNFX0NJUgk2CiAKIHN0YXRpYwl1bnNpZ25lZCBpbnQgYmFzZSwgZ3BhY3QsIGNpcmFjdCwgbWF4X3VuaXRzLCBjaGlwX3R5cGU7CiBzdGF0aWMJdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOwogCiBzdGF0aWMJaW50IG5vZ2FtZXBvcnQgPSBERUZBVUxUX05PR0FNRVBPUlQ7CitzdGF0aWMgaW50IG5vY2lyICAgICAgPSBERUZBVUxUX05PQ0lSOwogc3RhdGljCWludCBleGNsdXNpdmUgID0gREVGQVVMVF9FWENMVVNJVkU7CiBzdGF0aWMJaW50IHRpbWVvdXQgICAgPSBERUZBVUxUX1RJTUVPVVQ7CiBzdGF0aWMJaW50IHRlc3Rtb2RlICAgPSBERUZBVUxUX1RFU1RNT0RFOwpAQCAtMTQ5LDYgKzE1Miw5IEBACiBtb2R1bGVfcGFyYW0obm9nYW1lcG9ydCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9nYW1lcG9ydCwgIkZvcmJpZCB0aGUgYWN0aXZhdGlvbiBvZiBnYW1lIHBvcnQsIGRlZmF1bHQ9IgogCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9OT0dBTUVQT1JUKSk7Cittb2R1bGVfcGFyYW0obm9jaXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vY2lyLCAiRm9yYmlkIHRoZSB1c2Ugb2YgQ29uc3VtZXIgSVIgaW50ZXJydXB0cyB0byByZXNldCB0aW1lciwgZGVmYXVsdD0iCisJCV9fTU9EVUxFX1NUUklORyhERUZBVUxUX05PQ0lSKSk7CiBtb2R1bGVfcGFyYW0oZXhjbHVzaXZlLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhleGNsdXNpdmUsICJXYXRjaGRvZyBleGNsdXNpdmUgZGV2aWNlIG9wZW4sIGRlZmF1bHQ9IgogCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9FWENMVVNJVkUpKTsKQEAgLTI1OCw5ICsyNjQsMTcgQEAKIHsKIAlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkKIAkJaW5iKGJhc2UpOwotCWVsc2UKKwllbHNlIGlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkKIAkJLyogVGhlIHRpbWVyIHJlbG9hZHMgd2l0aCBhcm91bmQgNSBtc2VjIGRlbGF5ICovCiAJCW91dGIoMHg1NSwgQ0lSX0RSKGJhc2UpKTsKKwllbHNlIHsKKwkJaWYgKHN1cGVyaW9fZW50ZXIoKSkKKwkJCXJldHVybjsKKworCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKKwkJd2R0X3VwZGF0ZV90aW1lb3V0KCk7CisJCXN1cGVyaW9fZXhpdCgpOworCX0KIAlzZXRfYml0KFdEVFNfS0VFUEFMSVZFLCAmd2R0X3N0YXR1cyk7CiB9CiAKQEAgLTI3Myw3ICsyODcsNyBAQAogCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwogCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKQogCQlzdXBlcmlvX291dGIoV0RUX0dBTUVQT1JULCBXRFRDVFJMKTsKLQllbHNlCisJZWxzZSBpZiAodGVzdF9iaXQoV0RUU19VU0VfQ0lSLCAmd2R0X3N0YXR1cykpCiAJCXN1cGVyaW9fb3V0YihXRFRfQ0lSSU5ULCBXRFRDVFJMKTsKIAl3ZHRfdXBkYXRlX3RpbWVvdXQoKTsKIApAQCAtNjYwLDcgKzY3NCw3IEBACiAJfQogCiAJLyogSWYgd2UgaGF2ZW4ndCBHYW1lcG9ydCBzdXBwb3J0LCB0cnkgdG8gZ2V0IENJUiBzdXBwb3J0ICovCi0JaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7CisJaWYgKCFub2NpciAmJiAhdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKENJUl9CQVNFLCA4LCBXQVRDSERPR19OQU1FKSkgewogCQkJaWYgKGdwX3JyZXFfZmFpbCkKIAkJCQlwcl9lcnIoIkkvTyBBZGRyZXNzIDB4JTA0eCBhbmQgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLApAQCAtNjgyLDYgKzY5Niw3IEBACiAJCQlzdXBlcmlvX3NlbGVjdChHQU1FUE9SVCk7CiAJCQlzdXBlcmlvX291dGIoZ3BhY3QsIEFDVFJFRyk7CiAJCX0KKwkJc2V0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKTsKIAl9CiAKIAlpZiAodGltZW91dCA8IDEgfHwgdGltZW91dCA+IG1heF91bml0cyAqIDYwKSB7CkBAIC03MDcsNyArNzIyLDcgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIENJUiB0byB1c2UgaXQgYXMga2VlcGFsaXZlIHNvdXJjZSAqLwotCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkgewogCQlvdXRiKDB4MDAsIENJUl9SQ1IoYmFzZSkpOwogCQlvdXRiKDB4YzAsIENJUl9UQ1IxKGJhc2UpKTsKIAkJb3V0YigweDVjLCBDSVJfVENSMihiYXNlKSk7CkBAIC03MTcsOSArNzMyLDkgQEAKIAkJb3V0YigweDA5LCBDSVJfSUVSKGJhc2UpKTsKIAl9CiAKLQlwcl9pbmZvKCJDaGlwIElUJTA0eCByZXZpc2lvbiAlZCBpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkIHRlc3Rtb2RlPSVkIGV4Y2x1c2l2ZT0lZCBub2dhbWVwb3J0PSVkKVxuIiwKKwlwcl9pbmZvKCJDaGlwIElUJTA0eCByZXZpc2lvbiAlZCBpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkIHRlc3Rtb2RlPSVkIGV4Y2x1c2l2ZT0lZCBub2dhbWVwb3J0PSVkIG5vY2lyPSVkKVxuIiwKIAkJY2hpcF90eXBlLCBjaGlwX3JldiwgdGltZW91dCwKLQkJbm93YXlvdXQsIHRlc3Rtb2RlLCBleGNsdXNpdmUsIG5vZ2FtZXBvcnQpOworCQlub3dheW91dCwgdGVzdG1vZGUsIGV4Y2x1c2l2ZSwgbm9nYW1lcG9ydCwgbm9jaXIpOwogCiAJc3VwZXJpb19leGl0KCk7CiAJcmV0dXJuIDA7CkBAIC03MjcsOCArNzQyLDEwIEBACiBlcnJfb3V0X3JlYm9vdDoKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKIGVycl9vdXRfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGJhc2UsIHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykgPyAxIDogOCk7Ci0JaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7CisJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpCisJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDEpOworCWVsc2UgaWYgKHRlc3RfYml0KFdEVFNfVVNFX0NJUiwgJndkdF9zdGF0dXMpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDgpOwogCQlzdXBlcmlvX3NlbGVjdChDSVIpOwogCQlzdXBlcmlvX291dGIoY2lyYWN0LCBBQ1RSRUcpOwogCX0KQEAgLTc1NCw3ICs3NzEsNyBAQAogCQlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewogCQkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOwogCQkJc3VwZXJpb19vdXRiKGdwYWN0LCBBQ1RSRUcpOwotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKHRlc3RfYml0KFdEVFNfVVNFX0NJUiwgJndkdF9zdGF0dXMpKSB7CiAJCQlzdXBlcmlvX3NlbGVjdChDSVIpOwogCQkJc3VwZXJpb19vdXRiKGNpcmFjdCwgQUNUUkVHKTsKIAkJfQpAQCAtNzYzLDcgKzc4MCwxMSBAQAogCiAJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7Ci0JcmVsZWFzZV9yZWdpb24oYmFzZSwgdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSA/IDEgOiA4KTsKKworCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKQorCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAxKTsKKwllbHNlIGlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkKKwkJcmVsZWFzZV9yZWdpb24oYmFzZSwgOCk7CiB9CiAKIG1vZHVsZV9pbml0KGl0ODdfd2R0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9qejQ3NDBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2p6NDc0MF93ZHQuYwppbmRleCAzYWE1MGNmLi45MWU0NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2p6NDc0MF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2p6NDc0MF93ZHQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbWF4NjN4eF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbWF4NjN4eF93ZHQuYwppbmRleCBiZGIzZjRhLi4wZTljYzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL21heDYzeHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9tYXg2M3h4X3dkdC5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jCmluZGV4IGMxZjY1YjQuLjc4MzE5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjOHh4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL21wYzh4eHhfd2R0LmMKQEAgLTIzNyw2ICsyMzcsNyBAQAogCQkuY29tcGF0aWJsZSA9ICJmc2wsbXBjODIzLXdkdCIsCiAJCS5kYXRhID0gJihzdHJ1Y3QgbXBjOHh4eF93ZHRfdHlwZSkgewogCQkJLnByZXNjYWxlciA9IDB4ODAwLAorCQkJLmh3X2VuYWJsZWQgPSB0cnVlLAogCQl9LAogCX0sCiAJe30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYwppbmRleCBlZGIzMWZmLi5mZjI3YzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbnVjOTAwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9udWM5MDBfd2R0LmMKaW5kZXggYTBkODkzYi4uNzEzNTgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9udWM5MDBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9udWM5MDBfd2R0LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29mX3hpbGlueF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCmluZGV4IGZiNTcxMDMuLjU3Y2NhZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIFdhdGNoZG9nIERldmljZSBEcml2ZXIgZm9yIFhpbGlueCBheGkveHBzX3RpbWViYXNlX3dkdAogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxMyAtIDIwMTQgWGlsaW54LCBJbmMuCiAgKiAoQykgQ29weXJpZ2h0IDIwMTEgKEFsZWphbmRybyBDYWJyZXJhIDxhbGRheWFAZ21haWwuY29tPikKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC05LDE4ICsxMCwxMyBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtNDMsMTAyICszOSwxMDMgQEAKICNkZWZpbmUgWFdUX1RJTUVSX0ZBSUxFRCAgICAgICAgICAgIDB4RkZGRkZGRkYKIAogI2RlZmluZSBXQVRDSERPR19OQU1FICAgICAiWGlsaW54IFdhdGNoZG9nIgotI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCiAKIHN0cnVjdCB4d2R0X2RldmljZSB7Ci0Jc3RydWN0IHJlc291cmNlICByZXM7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwotCXUzMiBub3dheW91dDsKIAl1MzIgd2R0X2ludGVydmFsOwotCXUzMiBib290X3N0YXR1czsKKwlzcGlubG9ja190IHNwaW5sb2NrOworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgeGlsaW54X3dkdF93ZGQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IHh3ZHRfZGV2aWNlIHhkZXY7Ci0KLXN0YXRpYyAgdTMyIHRpbWVvdXQ7Ci1zdGF0aWMgIHUzMiBjb250cm9sX3N0YXR1c19yZWc7Ci1zdGF0aWMgIHU4ICBleHBlY3RfY2xvc2U7Ci1zdGF0aWMgIHU4ICBub190aW1lb3V0Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJpdmVyX29wZW47Ci0KLXN0YXRpYyAgREVGSU5FX1NQSU5MT0NLKHNwaW5sb2NrKTsKLQotc3RhdGljIHZvaWQgeHdkdF9zdGFydCh2b2lkKQorc3RhdGljIGludCB4aWxpbnhfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKKwl1MzIgY29udHJvbF9zdGF0dXNfcmVnOworCXN0cnVjdCB4d2R0X2RldmljZSAqeGRldiA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisKKwlzcGluX2xvY2soJnhkZXYtPnNwaW5sb2NrKTsKIAogCS8qIENsZWFuIHByZXZpb3VzIHN0YXR1cyBhbmQgZW5hYmxlIHRoZSB3YXRjaGRvZyB0aW1lciAqLwotCWNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCWNvbnRyb2xfc3RhdHVzX3JlZyB8PSAoWFdUX0NTUjBfV1JTX01BU0sgfCBYV1RfQ1NSMF9XRFNfTUFTSyk7CiAKIAlpb3dyaXRlMzIoKGNvbnRyb2xfc3RhdHVzX3JlZyB8IFhXVF9DU1IwX0VXRFQxX01BU0spLAotCQkJCXhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwkJICB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCi0JaW93cml0ZTMyKFhXVF9DU1JYX0VXRFQyX01BU0ssIHhkZXYuYmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKKwlpb3dyaXRlMzIoWFdUX0NTUlhfRVdEVDJfTUFTSywgeGRldi0+YmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKIAotCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisJc3Bpbl91bmxvY2soJnhkZXYtPnNwaW5sb2NrKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB4d2R0X3N0b3Aodm9pZCkKK3N0YXRpYyBpbnQgeGlsaW54X3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKKwl1MzIgY29udHJvbF9zdGF0dXNfcmVnOworCXN0cnVjdCB4d2R0X2RldmljZSAqeGRldiA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CiAKLQljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJc3Bpbl9sb2NrKCZ4ZGV2LT5zcGlubG9jayk7CisKKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCiAJaW93cml0ZTMyKChjb250cm9sX3N0YXR1c19yZWcgJiB+WFdUX0NTUjBfRVdEVDFfTUFTSyksCi0JCQkJeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCQkgIHhkZXYtPmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CiAKLQlpb3dyaXRlMzIoMCwgeGRldi5iYXNlICsgWFdUX1RXQ1NSMV9PRkZTRVQpOworCWlvd3JpdGUzMigwLCB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMV9PRkZTRVQpOwogCi0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOwogCXByX2luZm8oIlN0b3BwZWQhXG4iKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB4d2R0X2tlZXBhbGl2ZSh2b2lkKQorc3RhdGljIGludCB4aWxpbnhfd2R0X2tlZXBhbGl2ZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCiB7Ci0Jc3Bpbl9sb2NrKCZzcGlubG9jayk7CisJdTMyIGNvbnRyb2xfc3RhdHVzX3JlZzsKKwlzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOwogCi0JY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCXNwaW5fbG9jaygmeGRldi0+c3BpbmxvY2spOworCisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKIAljb250cm9sX3N0YXR1c19yZWcgfD0gKFhXVF9DU1IwX1dSU19NQVNLIHwgWFdUX0NTUjBfV0RTX01BU0spOwotCWlvd3JpdGUzMihjb250cm9sX3N0YXR1c19yZWcsIHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwlpb3dyaXRlMzIoY29udHJvbF9zdGF0dXNfcmVnLCB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCi0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHh3ZHRfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKLXsKLQlpbnQgbmV3X3N0YXR1czsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB4aWxpbnhfd2R0X2lkZW50ID0geworCS5vcHRpb25zID0gIFdESU9GX01BR0lDQ0xPU0UgfAorCQkgICAgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJLmlkZW50aXR5ID0JV0FUQ0hET0dfTkFNRSwKK307CiAKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHhpbGlueF93ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IHhpbGlueF93ZHRfc3RhcnQsCisJLnN0b3AgPSB4aWxpbnhfd2R0X3N0b3AsCisJLnBpbmcgPSB4aWxpbnhfd2R0X2tlZXBhbGl2ZSwKK307CiAKLQljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7Ci0JbmV3X3N0YXR1cyA9ICgoY29udHJvbF9zdGF0dXNfcmVnICYKLQkJCShYV1RfQ1NSMF9XUlNfTUFTSyB8IFhXVF9DU1IwX1dEU19NQVNLKSkgIT0gMCk7Ci0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKLQotCSpzdGF0dXMgPSAwOwotCWlmIChuZXdfc3RhdHVzICYgMSkKLQkJKnN0YXR1cyB8PSBXRElPRl9DQVJEUkVTRVQ7Ci19Ci0KLXN0YXRpYyB1MzIgeHdkdF9zZWxmdGVzdCh2b2lkKQorc3RhdGljIHUzMiB4d2R0X3NlbGZ0ZXN0KHN0cnVjdCB4d2R0X2RldmljZSAqeGRldikKIHsKIAlpbnQgaTsKIAl1MzIgdGltZXJfdmFsdWUxOwogCXUzMiB0aW1lcl92YWx1ZTI7CiAKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKKwlzcGluX2xvY2soJnhkZXYtPnNwaW5sb2NrKTsKIAotCXRpbWVyX3ZhbHVlMSA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKLQl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CisJdGltZXJfdmFsdWUxID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKKwl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOwogCiAJZm9yIChpID0gMDsKIAkJKChpIDw9IFhXVF9NQVhfU0VMRlRFU1RfTE9PUF9DT1VOVCkgJiYKIAkJCSh0aW1lcl92YWx1ZTIgPT0gdGltZXJfdmFsdWUxKSk7IGkrKykgewotCQl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CisJCXRpbWVyX3ZhbHVlMiA9IGlvcmVhZDMyKHhkZXYtPmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOwogCiAJaWYgKHRpbWVyX3ZhbHVlMiAhPSB0aW1lcl92YWx1ZTEpCiAJCXJldHVybiB+WFdUX1RJTUVSX0ZBSUxFRDsKQEAgLTE0NiwyMzggKzE0Myw4MyBAQAogCQlyZXR1cm4gWFdUX1RJTUVSX0ZBSUxFRDsKIH0KIAotc3RhdGljIGludCB4d2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogT25seSBvbmUgcHJvY2VzcyBjYW4gaGFuZGxlIHRoZSB3ZHQgYXQgYSB0aW1lICovCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRyaXZlcl9vcGVuKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtb2R1bGUgYXJlIGFsd2F5cyBsb2FkZWQuLi4qLwotCWlmICh4ZGV2Lm5vd2F5b3V0KQotCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCi0JeHdkdF9zdGFydCgpOwotCXByX2luZm8oIlN0YXJ0ZWQuLi5cbiIpOwotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IHh3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7Ci0JCXh3ZHRfc3RvcCgpOwotCX0gZWxzZSB7Ci0JCXByX2NyaXQoIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOwotCQl4d2R0X2tlZXBhbGl2ZSgpOwotCX0KLQotCWNsZWFyX2JpdCgwLCAmZHJpdmVyX29wZW4pOwotCWV4cGVjdF9jbG9zZSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgICAgIHh3ZHRfd3JpdGU6Ci0gKiAgICAgIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKLSAqICAgICAgQGJ1ZjogYnVmZmVyIHRvIHdyaXRlICh1bnVzZWQgYXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIgaGVyZQotICogICAgICBAY291bnQ6IGNvdW50IG9mIGJ5dGVzCi0gKiAgICAgIEBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAotICoKLSAqICAgICAgQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHNpZ25hbC4gQW55Ci0gKiAgICAgIHdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KLSAqLwotc3RhdGljIHNzaXplX3QgeHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAobGVuKSB7Ci0JCWlmICgheGRldi5ub3dheW91dCkgewotCQkJc2l6ZV90IGk7Ci0KLQkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLwotCQkJZXhwZWN0X2Nsb3NlID0gMDsKLQotCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgewotCQkJCWNoYXIgYzsKLQotCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYgKGMgPT0gJ1YnKQotCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKLQkJCX0KLQkJfQotCQl4d2R0X2tlZXBhbGl2ZSgpOwotCX0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7Ci0JLm9wdGlvbnMgPSAgV0RJT0ZfTUFHSUNDTE9TRSB8Ci0JCSAgICBXRElPRl9LRUVQQUxJVkVQSU5HLAotCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKLQkuaWRlbnRpdHkgPQlXQVRDSERPR19OQU1FLAotfTsKLQotLyoKLSAqICAgICAgeHdkdF9pb2N0bDoKLSAqICAgICAgQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKLSAqICAgICAgQGNtZDogd2F0Y2hkb2cgY29tbWFuZAotICogICAgICBAYXJnOiBhcmd1bWVudCBwb2ludGVyCi0gKgotICogICAgICBUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncwotICogICAgICBhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLgotICovCi1zdGF0aWMgbG9uZyB4d2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgc3RhdHVzOwotCi0JdW5pb24gewotCQlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKmlkZW50OwotCQlpbnQgX191c2VyICppOwotCX0gdWFyZzsKLQotCXVhcmcuaSA9IChpbnQgX191c2VyICopYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIodWFyZy5pZGVudCwgJmlkZW50LAotCQkJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOwotCi0JY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgotCQlyZXR1cm4gcHV0X3VzZXIoeGRldi5ib290X3N0YXR1cywgdWFyZy5pKTsKLQotCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCQl4d2R0X2dldF9zdGF0dXMoJnN0YXR1cyk7Ci0JCXJldHVybiBwdXRfdXNlcihzdGF0dXMsIHVhcmcuaSk7Ci0KLQljYXNlIFdESU9DX0tFRVBBTElWRToKLQkJeHdkdF9rZWVwYWxpdmUoKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCWlmIChub190aW1lb3V0KQotCQkJcmV0dXJuIC1FTk9UVFk7Ci0JCWVsc2UKLQkJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCB1YXJnLmkpOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9UVFk7Ci0JfQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4d2R0X2ZvcHMgPSB7Ci0JLm93bmVyICAgICAgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrICAgICA9IG5vX2xsc2VlaywKLQkud3JpdGUgICAgICA9IHh3ZHRfd3JpdGUsCi0JLm9wZW4gICAgICAgPSB4d2R0X29wZW4sCi0JLnJlbGVhc2UgICAgPSB4d2R0X3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0geHdkdF9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB4d2R0X21pc2NkZXYgPSB7Ci0JLm1pbm9yICAgICAgPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZSAgICAgICA9ICJ3YXRjaGRvZyIsCi0JLmZvcHMgICAgICAgPSAmeHdkdF9mb3BzLAotfTsKLQogc3RhdGljIGludCB4d2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJjOwotCXUzMiAqdG1wdHI7Ci0JdTMyICpwZnJlcTsKKwl1MzIgcGZyZXEgPSAwLCBlbmFibGVfb25jZSA9IDA7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHh3ZHRfZGV2aWNlICp4ZGV2OworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKnhpbGlueF93ZHRfd2RkOwogCi0Jbm9fdGltZW91dCA9IDA7CisJeGRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnhkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXhkZXYpCisJCXJldHVybiAtRU5PTUVNOwogCi0JcGZyZXEgPSAodTMyICopb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJeGlsaW54X3dkdF93ZGQgPSAmeGRldi0+eGlsaW54X3dkdF93ZGQ7CisJeGlsaW54X3dkdF93ZGQtPmluZm8gPSAmeGlsaW54X3dkdF9pZGVudDsKKwl4aWxpbnhfd2R0X3dkZC0+b3BzID0gJnhpbGlueF93ZHRfb3BzOworCXhpbGlueF93ZHRfd2RkLT5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCi0JaWYgKHBmcmVxID09IE5VTEwpIHsKLQkJcHJfd2FybigiVGhlIHdhdGNoZG9nIGNsb2NrIGZyZXF1ZW5jeSBjYW5ub3QgYmUgb2J0YWluZWQhXG4iKTsKLQkJbm9fdGltZW91dCA9IDE7Ci0JfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJeGRldi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoeGRldi0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHhkZXYtPmJhc2UpOwogCi0JcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHBkZXYtPmRldi5vZl9ub2RlLCAwLCAmeGRldi5yZXMpOwotCWlmIChyYykgewotCQlwcl93YXJuKCJpbnZhbGlkIGFkZHJlc3MhXG4iKTsKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJnBmcmVxKTsKKwlpZiAocmMpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlRoZSB3YXRjaGRvZyBjbG9jayBmcmVxdWVuY3kgY2Fubm90IGJlIG9idGFpbmVkXG4iKTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJ4bG54LHdkdC1pbnRlcnZhbCIsCisJCQkJICAmeGRldi0+d2R0X2ludGVydmFsKTsKKwlpZiAocmMpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlBhcmFtZXRlciBcInhsbngsd2R0LWludGVydmFsXCIgbm90IGZvdW5kXG4iKTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJ4bG54LHdkdC1lbmFibGUtb25jZSIsCisJCQkJICAmZW5hYmxlX29uY2UpOworCWlmIChyYykKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiUGFyYW1ldGVyIFwieGxueCx3ZHQtZW5hYmxlLW9uY2VcIiBub3QgZm91bmRcbiIpOworCisJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KHhpbGlueF93ZHRfd2RkLCBlbmFibGVfb25jZSk7CisKKwkvKgorCSAqIFR3aWNlIG9mIHRoZSAyXndkdF9pbnRlcnZhbCAvIGZyZXEgIGJlY2F1c2UgdGhlIGZpcnN0IHdkdCBvdmVyZmxvdyBpcworCSAqIGlnbm9yZWQgKGludGVycnVwdCksIHJlc2V0IGlzIG9ubHkgZ2VuZXJhdGVkIGF0IHNlY29uZCB3ZHQgb3ZlcmZsb3cKKwkgKi8KKwlpZiAocGZyZXEgJiYgeGRldi0+d2R0X2ludGVydmFsKQorCQl4aWxpbnhfd2R0X3dkZC0+dGltZW91dCA9IDIgKiAoKDEgPDwgeGRldi0+d2R0X2ludGVydmFsKSAvCisJCQkJCSAgcGZyZXEpOworCisJc3Bpbl9sb2NrX2luaXQoJnhkZXYtPnNwaW5sb2NrKTsKKwl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSh4aWxpbnhfd2R0X3dkZCwgeGRldik7CisKKwlyYyA9IHh3ZHRfc2VsZnRlc3QoeGRldik7CisJaWYgKHJjID09IFhXVF9USU1FUl9GQUlMRUQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiU2VsZlRlc3Qgcm91dGluZSBlcnJvclxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKLQl0bXB0ciA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSJ4bG54LHdkdC1pbnRlcnZhbCIsIE5VTEwpOwotCWlmICh0bXB0ciA9PSBOVUxMKSB7Ci0JCXByX3dhcm4oIlBhcmFtZXRlciBcInhsbngsd2R0LWludGVydmFsXCIgbm90IGZvdW5kIGluIGRldmljZSB0cmVlIVxuIik7Ci0JCW5vX3RpbWVvdXQgPSAxOwotCX0gZWxzZSB7Ci0JCXhkZXYud2R0X2ludGVydmFsID0gKnRtcHRyOwotCX0KLQotCXRtcHRyID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInhsbngsd2R0LWVuYWJsZS1vbmNlIiwgTlVMTCk7Ci0JaWYgKHRtcHRyID09IE5VTEwpIHsKLQkJcHJfd2FybigiUGFyYW1ldGVyIFwieGxueCx3ZHQtZW5hYmxlLW9uY2VcIiBub3QgZm91bmQgaW4gZGV2aWNlIHRyZWUhXG4iKTsKLQkJeGRldi5ub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwotCX0KLQotLyoKLSAqICBUd2ljZSBvZiB0aGUgMl53ZHRfaW50ZXJ2YWwgLyBmcmVxICBiZWNhdXNlIHRoZSBmaXJzdCB3ZHQgb3ZlcmZsb3cgaXMKLSAqICBpZ25vcmVkIChpbnRlcnJ1cHQpLCByZXNldCBpcyBvbmx5IGdlbmVyYXRlZCBhdCBzZWNvbmQgd2R0IG92ZXJmbG93Ci0gKi8KLQlpZiAoIW5vX3RpbWVvdXQpCi0JCXRpbWVvdXQgPSAyICogKCgxPDx4ZGV2LndkdF9pbnRlcnZhbCkgLyAqcGZyZXEpOwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oeGRldi5yZXMuc3RhcnQsCi0JCQl4ZGV2LnJlcy5lbmQgLSB4ZGV2LnJlcy5zdGFydCArIDEsIFdBVENIRE9HX05BTUUpKSB7Ci0JCXJjID0gLUVOWElPOwotCQlwcl9lcnIoIm1lbW9yeSByZXF1ZXN0IGZhaWx1cmUhXG4iKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXhkZXYuYmFzZSA9IGlvcmVtYXAoeGRldi5yZXMuc3RhcnQsIHhkZXYucmVzLmVuZCAtIHhkZXYucmVzLnN0YXJ0ICsgMSk7Ci0JaWYgKHhkZXYuYmFzZSA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcHJfZXJyKCJpb3JlbWFwIGZhaWx1cmUhXG4iKTsKLQkJZ290byByZWxlYXNlX21lbTsKLQl9Ci0KLQlyYyA9IHh3ZHRfc2VsZnRlc3QoKTsKLQlpZiAocmMgPT0gWFdUX1RJTUVSX0ZBSUxFRCkgewotCQlwcl9lcnIoIlNlbGZUZXN0IHJvdXRpbmUgZXJyb3IhXG4iKTsKLQkJZ290byB1bm1hcF9pbzsKLQl9Ci0KLQl4d2R0X2dldF9zdGF0dXMoJnhkZXYuYm9vdF9zdGF0dXMpOwotCi0JcmMgPSBtaXNjX3JlZ2lzdGVyKCZ4d2R0X21pc2NkZXYpOworCXJjID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKHhpbGlueF93ZHRfd2RkKTsKIAlpZiAocmMpIHsKLQkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKLQkJICAgICAgIHh3ZHRfbWlzY2Rldi5taW5vciwgcmMpOwotCQlnb3RvIHVubWFwX2lvOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgKGVycj0lZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOwogCX0KIAotCWlmIChub190aW1lb3V0KQotCQlwcl9pbmZvKCJkcml2ZXIgbG9hZGVkICh0aW1lb3V0PT8gc2VjLCBub3dheW91dD0lZClcbiIsCi0JCQl4ZGV2Lm5vd2F5b3V0KTsKLQllbHNlCi0JCXByX2luZm8oImRyaXZlciBsb2FkZWQgKHRpbWVvdXQ9JWQgc2VjLCBub3dheW91dD0lZClcbiIsCi0JCQl0aW1lb3V0LCB4ZGV2Lm5vd2F5b3V0KTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiWGlsaW54IFdhdGNoZG9nIFRpbWVyIGF0ICVwIHdpdGggdGltZW91dCAlZHNcbiIsCisJCSB4ZGV2LT5iYXNlLCB4aWxpbnhfd2R0X3dkZC0+dGltZW91dCk7CiAKLQlleHBlY3RfY2xvc2UgPSAwOwotCWNsZWFyX2JpdCgwLCAmZHJpdmVyX29wZW4pOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHhkZXYpOwogCiAJcmV0dXJuIDA7Ci0KLXVubWFwX2lvOgotCWlvdW5tYXAoeGRldi5iYXNlKTsKLXJlbGVhc2VfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeGRldi5yZXMpKTsKLWVycl9vdXQ6Ci0JcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHh3ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgeHdkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQltaXNjX2RlcmVnaXN0ZXIoJnh3ZHRfbWlzY2Rldik7Ci0JaW91bm1hcCh4ZGV2LmJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeGRldi5yZXMpKTsKKwlzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZ4ZGV2LT54aWxpbnhfd2R0X3dkZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuYwppbmRleCAwOWNmMDEzLi4zNjkxYjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9vbWFwX3dkdC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtNTgsNyArNTcsNiBAQAogCXZvaWQgX19pb21lbSAgICAqYmFzZTsgICAgICAgICAgLyogcGh5c2ljYWwgKi8KIAlzdHJ1Y3QgZGV2aWNlICAgKmRldjsKIAlib29sCQlvbWFwX3dkdF91c2VyczsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlpbnQJCXdkdF90cmdyX3BhdHRlcm47CiAJc3RydWN0IG11dGV4CWxvY2s7CQkvKiB0byBhdm9pZCByYWNlcyB3aXRoIFBNICovCiB9OwpAQCAtMjA3LDcgKzIwNSw3IEBACiB7CiAJc3RydWN0IG9tYXBfd2RfdGltZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKm9tYXBfd2R0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqbWVtOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXY7CiAJdTMyIHJzOwogCWludCByZXQ7CkBAIC0yMTYsMjkgKzIxNCwyMCBAQAogCWlmICghb21hcF93ZHQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogcmVzZXJ2ZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZ3MgKi8KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCW1lbSA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJICAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKTsKLQlpZiAoIW1lbSkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCXdkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp3ZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF3ZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXdkZXYtPm9tYXBfd2R0X3VzZXJzCT0gZmFsc2U7Ci0Jd2Rldi0+bWVtCQk9IG1lbTsKIAl3ZGV2LT5kZXYJCT0gJnBkZXYtPmRldjsKIAl3ZGV2LT53ZHRfdHJncl9wYXR0ZXJuCT0gMHgxMjM0OwogCW11dGV4X2luaXQoJndkZXYtPmxvY2spOwogCi0Jd2Rldi0+YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghd2Rldi0+YmFzZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJLyogcmVzZXJ2ZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZ3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXdkZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHdkZXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih3ZGV2LT5iYXNlKTsKIAogCW9tYXBfd2R0LT5pbmZvCSAgICAgID0gJm9tYXBfd2R0X2luZm87CiAJb21hcF93ZHQtPm9wcwkgICAgICA9ICZvbWFwX3dkdF9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29yaW9uX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9vcmlvbl93ZHQuYwppbmRleCBmNzcyMmE0Li40OTgxNjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29yaW9uX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb3Jpb25fd2R0LmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMKaW5kZXggNTIxMWQ1Ni4uOWYxNWRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYwpAQCAtNTEyLDkgKzUxMiw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjODc0MTNfbm90aWZpZXIpOwotCWlmIChyZXQgIT0gMCkgeworCWlmIChyZXQgIT0gMCkKIAkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByZXQpOwotCX0KIAogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnBjODc0MTNfbWlzY2Rldik7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC01NzUsOCArNTc0LDggQEAKIG1vZHVsZV9pbml0KHBjODc0MTNfaW5pdCk7CiBtb2R1bGVfZXhpdChwYzg3NDEzX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+LCAiCi0JCSJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4sIik7CitNT0RVTEVfQVVUSE9SKCJTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUEM4NzQxMyBXRFQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYwppbmRleCBlNTYyZTA0Li4xYTExYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9wY3dkX3VzYi5jCkBAIC02NDUsMTAgKzY0NSw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KIAl1c2JfcGN3ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVzYl9wY3dkID09IE5VTEwpIHsKLQkJcHJfZXJyKCJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAodXNiX3Bjd2QgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQl9CiAKIAl1c2JfcGN3ZF9kZXZpY2UgPSB1c2JfcGN3ZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jCmluZGV4IDViZWMyMGYuLjE1ZmIzMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcG54NDAwOF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3BueDQwMDhfd2R0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3JkYzMyMXhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3JkYzMyMXhfd2R0LmMKaW5kZXggMDgyZDA2Mi4uMjljZjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9yZGMzMjF4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmRjMzIxeF93ZHQuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yZXR1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9yZXR1X3dkdC5jCmluZGV4IGY1MzYxNWQuLmE3YTA2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcmV0dV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3JldHVfd2R0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYwppbmRleCAzZGQ4ZWQyLi5jZmVkMGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKaW5kZXggYWVjOTQ2ZC4uN2M2Y2NkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KQEAgLTUyNiw3ICs1MjUsMTEgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JY2xrX3ByZXBhcmVfZW5hYmxlKHdkdC0+Y2xvY2spOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh3ZHQtPmNsb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgY2xvY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXJldCA9IHMzYzI0MTB3ZHRfY3B1ZnJlcV9yZWdpc3Rlcih3ZHQpOwogCWlmIChyZXQgPCAwKSB7CkBAIC02MDgsNyArNjExLDYgQEAKIAogIGVycl9jbGs6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHdkdC0+Y2xvY2spOwotCXdkdC0+Y2xvY2sgPSBOVUxMOwogCiAgZXJyOgogCXJldHVybiByZXQ7CkBAIC02MjgsNyArNjMwLDYgQEAKIAlzM2MyNDEwd2R0X2NwdWZyZXFfZGVyZWdpc3Rlcih3ZHQpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHdkdC0+Y2xvY2spOwotCXdkdC0+Y2xvY2sgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zYzUyMF93ZHQuYwppbmRleCBmMzUzZTE4Li4xY2ZkM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKQEAgLTE1OCwxMiArMTU4LDExIEBACiAKIHN0YXRpYyB2b2lkIHdkdF9jb25maWcoaW50IHdyaXRldmFsKQogewotCV9fdTE2IGR1bW15OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBidXkgc29tZSB0aW1lIChwaW5nKSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHRfc3BpbmxvY2ssIGZsYWdzKTsKLQlkdW1teSA9IHJlYWR3KHdkdG1yY3RsKTsJLyogZW5zdXJlIHdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworCXJlYWR3KHdkdG1yY3RsKTsJLyogZW5zdXJlIHdyaXRlIHN5bmNocm9uaXphdGlvbiAqLwogCXdyaXRldygweEFBQUEsIHdkdG1yY3RsKTsKIAl3cml0ZXcoMHg1NTU1LCB3ZHRtcmN0bCk7CiAJLyogdW5sb2NrIFdEVCA9IG1ha2UgV0RUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgd3JpdGFibGUgb25lIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYwppbmRleCBhZjM1MjhmLi5kMDRkMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zaHdkdC5jCkBAIC0yOTMsOCArMjkzLDYgQEAKIAogc3RhdGljIGludCBzaF93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHNoX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KIAl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmc2hfd2R0X2Rldik7CiAKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NvZnRkb2cuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc29mdGRvZy5jCmluZGV4IGMwNGExYWEuLjBkYzVlMzIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zb2Z0ZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zb2Z0ZG9nLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAkJIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iCiAJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOwogCi1zdGF0aWMgaW50IHNvZnRfbm9ib290ID0gMDsKK3N0YXRpYyBpbnQgc29mdF9ub2Jvb3Q7CiBtb2R1bGVfcGFyYW0oc29mdF9ub2Jvb3QsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNvZnRfbm9ib290LAogCSJTb2Z0ZG9nIGFjdGlvbiwgc2V0IHRvIDEgdG8gaWdub3JlIHJlYm9vdHMsIDAgdG8gcmVib290IChkZWZhdWx0PTApIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYwppbmRleCAzZjc4NmNlLi40NzYyOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjA5LDI3ICsyMDgsMTUgQEAKIAlzdHJ1Y3Qgc3A4MDVfd2R0ICp3ZHQ7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZhZGV2LT5kZXYsIGFkZXYtPnJlcy5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKCZhZGV2LT5yZXMpLCAic3A4MDVfd2R0IikpIHsKLQkJZGV2X3dhcm4oJmFkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyOwotCX0KLQogCXdkdCA9IGRldm1fa3phbGxvYygmYWRldi0+ZGV2LCBzaXplb2YoKndkdCksIEdGUF9LRVJORUwpOwogCWlmICghd2R0KSB7Ci0JCWRldl93YXJuKCZhZGV2LT5kZXYsICJLemFsbG9jIGZhaWxlZFxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KIAotCXdkdC0+YmFzZSA9IGRldm1faW9yZW1hcCgmYWRldi0+ZGV2LCBhZGV2LT5yZXMuc3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKCZhZGV2LT5yZXMpKTsKLQlpZiAoIXdkdC0+YmFzZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlkZXZfd2FybigmYWRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsXG4iKTsKLQkJZ290byBlcnI7Ci0JfQorCXdkdC0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmYWRldi0+ZGV2LCAmYWRldi0+cmVzKTsKKwlpZiAoSVNfRVJSKHdkdC0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHdkdC0+YmFzZSk7CiAKIAl3ZHQtPmNsayA9IGRldm1fY2xrX2dldCgmYWRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHdkdC0+Y2xrKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF9ydGNfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3J0Y193ZHQuYwppbmRleCBiYjY0YWUzLi4zODA0ZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3J0Y193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3J0Y193ZHQuYwpAQCAtOSw3ICs5LDYgQEAKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zdW54aV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3VueGlfd2R0LmMKaW5kZXggNzYzMzJkOC4uY2QwMGE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zdW54aV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3N1bnhpX3dkdC5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VueGlfd2R0X2R0X2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXdkdCIgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtd2R0IiB9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bnhpX3dkdF9kdF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy90ZWdyYV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvdGVncmFfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwZTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvdGVncmFfd2R0LmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE5WSURJQSBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworLyogbWluaW11bSBhbmQgbWF4aW11bSB3YXRjaGRvZyB0cmlnZ2VyIHRpbWVvdXQsIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgTUlOX1dEVF9USU1FT1VUCQkJMQorI2RlZmluZSBNQVhfV0RUX1RJTUVPVVQJCQkyNTUKKworLyoKKyAqIEJhc2Ugb2YgdGhlIFdEVCByZWdpc3RlcnMsIGZyb20gdGhlIHRpbWVyIGJhc2UgYWRkcmVzcy4gIFRoZXJlIGFyZQorICogYWN0dWFsbHkgNSB3YXRjaGRvZ3MgdGhhdCBjYW4gYmUgY29uZmlndXJlZCAoYnkgcGFpcmluZyB3aXRoIGFuIGF2YWlsYWJsZQorICogdGltZXIpLCBhdCBiYXNlcyAweDEwMCArIChXRFQgSUQpICogMHgyMCwgd2hlcmUgV0RUIElEIGlzIDAgdGhyb3VnaCA0LgorICogVGhpcyBkcml2ZXIgb25seSBjb25maWd1cmVzIHRoZSBmaXJzdCB3YXRjaGRvZyAoV0RUIElEIDApLgorICovCisjZGVmaW5lIFdEVF9CQVNFCQkJMHgxMDAKKyNkZWZpbmUgV0RUX0lECQkJCTAKKworLyoKKyAqIFJlZ2lzdGVyIGJhc2Ugb2YgdGhlIHRpbWVyIHRoYXQncyBzZWxlY3RlZCBmb3IgcGFpcmluZyB3aXRoIHRoZSB3YXRjaGRvZy4KKyAqIFRoaXMgZHJpdmVyIGFyYml0cmFyaWx5IHVzZXMgdGltZXIgNSwgd2hpY2ggaXMgY3VycmVudGx5IHVudXNlZCBieQorICogb3RoZXIgZHJpdmVycyAoaW4gcGFydGljdWxhciwgdGhlIFRlZ3JhIGNsb2Nrc291cmNlIGRyaXZlcikuICBJZiB0aGlzCisgKiBuZWVkcyB0byBjaGFuZ2UsIHRha2UgY2FyZSB0aGF0IHRoZSBuZXcgdGltZXIgaXMgbm90IHVzZWQgYnkgdGhlCisgKiBjbG9ja3NvdXJjZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgV0RUX1RJTUVSX0JBU0UJCQkweDYwCisjZGVmaW5lIFdEVF9USU1FUl9JRAkJCTUKKworLyogV0RUIHJlZ2lzdGVycyAqLworI2RlZmluZSBXRFRfQ0ZHCQkJCTB4MAorI2RlZmluZSBXRFRfQ0ZHX1BFUklPRF9TSElGVAkJNAorI2RlZmluZSBXRFRfQ0ZHX1BFUklPRF9NQVNLCQkweGZmCisjZGVmaW5lIFdEVF9DRkdfSU5UX0VOCQkJKDEgPDwgMTIpCisjZGVmaW5lIFdEVF9DRkdfUE1DMkNBUl9SU1RfRU4JCSgxIDw8IDE1KQorI2RlZmluZSBXRFRfU1RTCQkJCTB4NAorI2RlZmluZSBXRFRfU1RTX0NPVU5UX1NISUZUCQk0CisjZGVmaW5lIFdEVF9TVFNfQ09VTlRfTUFTSwkJMHhmZgorI2RlZmluZSBXRFRfU1RTX0VYUF9TSElGVAkJMTIKKyNkZWZpbmUgV0RUX1NUU19FWFBfTUFTSwkJMHgzCisjZGVmaW5lIFdEVF9DTUQJCQkJMHg4CisjZGVmaW5lIFdEVF9DTURfU1RBUlRfQ09VTlRFUgkJKDEgPDwgMCkKKyNkZWZpbmUgV0RUX0NNRF9ESVNBQkxFX0NPVU5URVIJCSgxIDw8IDEpCisjZGVmaW5lIFdEVF9VTkxPQ0sJCQkoMHhjKQorI2RlZmluZSBXRFRfVU5MT0NLX1BBVFRFUk4JCSgweGM0NWEgPDwgMCkKKworLyogVGltZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTUVSX1BUVgkJCTB4MAorI2RlZmluZSBUSU1FUl9FTgkJCSgxIDw8IDMxKQorI2RlZmluZSBUSU1FUl9QRVJJT0RJQwkJCSgxIDw8IDMwKQorCitzdHJ1Y3QgdGVncmFfd2R0IHsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlCXdkZDsKKwl2b2lkIF9faW9tZW0JCSp3ZHRfcmVnczsKKwl2b2lkIF9faW9tZW0JCSp0bXJfcmVnczsKK307CisKKyNkZWZpbmUgV0RUX0hFQVJUQkVBVCAxMjAKK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0RUX0hFQVJUQkVBVDsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwKKwkiV2F0Y2hkb2cgaGVhcnRiZWF0cyBpbiBzZWNvbmRzLiAoZGVmYXVsdCA9ICIKKwlfX01PRFVMRV9TVFJJTkcoV0RUX0hFQVJUQkVBVCkgIikiKTsKKworc3RhdGljIGJvb2wgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LAorCSJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IgorCV9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKKworc3RhdGljIGludCB0ZWdyYV93ZHRfc3RhcnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXN0cnVjdCB0ZWdyYV93ZHQgKndkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisJdTMyIHZhbDsKKworCS8qCisJICogVGhpcyB0aGluZyBoYXMgYSBmaXhlZCAxTUh6IGNsb2NrLiAgTm9ybWFsbHksIHdlIHdvdWxkIHNldCB0aGUKKwkgKiBwZXJpb2QgdG8gMSBzZWNvbmQgYnkgd3JpdGluZyAxMDAwMDAwdWwsIGJ1dCB0aGUgd2F0Y2hkb2cgc3lzdGVtCisJICogcmVzZXQgYWN0dWFsbHkgb2NjdXJzIG9uIHRoZSA0dGggZXhwaXJhdGlvbiBvZiB0aGlzIGNvdW50ZXIsCisJICogc28gd2Ugc2V0IHRoZSBwZXJpb2QgdG8gMS80IG9mIHRoaXMgYW1vdW50LgorCSAqLworCXZhbCA9IDEwMDAwMDB1bCAvIDQ7CisJdmFsIHw9IChUSU1FUl9FTiB8IFRJTUVSX1BFUklPRElDKTsKKwl3cml0ZWwodmFsLCB3ZHQtPnRtcl9yZWdzICsgVElNRVJfUFRWKTsKKworCS8qCisJICogU2V0IG51bWJlciBvZiBwZXJpb2RzIGFuZCBzdGFydCBjb3VudGVyLgorCSAqCisJICogSW50ZXJydXB0IGhhbmRsZXIgaXMgbm90IHJlcXVpcmVkIGZvciB1c2VyIHNwYWNlCisJICogV0RUIGFjY2Vzc2VzLCBzaW5jZSB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIHBpbmcgdGhlCisJICogV0RUIHRvIHJlc2V0IHRoZSBjb3VudGVyIGJlZm9yZSBleHBpcmF0aW9uLCB0aHJvdWdoIGlvY3Rscy4KKwkgKi8KKwl2YWwgPSBXRFRfVElNRVJfSUQgfAorCSAgICAgICh3ZGQtPnRpbWVvdXQgPDwgV0RUX0NGR19QRVJJT0RfU0hJRlQpIHwKKwkgICAgICBXRFRfQ0ZHX1BNQzJDQVJfUlNUX0VOOworCXdyaXRlbCh2YWwsIHdkdC0+d2R0X3JlZ3MgKyBXRFRfQ0ZHKTsKKworCXdyaXRlbChXRFRfQ01EX1NUQVJUX0NPVU5URVIsIHdkdC0+d2R0X3JlZ3MgKyBXRFRfQ01EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCisJd3JpdGVsKFdEVF9VTkxPQ0tfUEFUVEVSTiwgd2R0LT53ZHRfcmVncyArIFdEVF9VTkxPQ0spOworCXdyaXRlbChXRFRfQ01EX0RJU0FCTEVfQ09VTlRFUiwgd2R0LT53ZHRfcmVncyArIFdEVF9DTUQpOworCXdyaXRlbCgwLCB3ZHQtPnRtcl9yZWdzICsgVElNRVJfUFRWKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCisJd3JpdGVsKFdEVF9DTURfU1RBUlRfQ09VTlRFUiwgd2R0LT53ZHRfcmVncyArIFdEVF9DTUQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfd2R0X3NldF90aW1lb3V0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCwKKwkJCQkgdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJd2RkLT50aW1lb3V0ID0gdGltZW91dDsKKworCWlmICh3YXRjaGRvZ19hY3RpdmUod2RkKSkKKwkJcmV0dXJuIHRlZ3JhX3dkdF9zdGFydCh3ZGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfd2R0X2dldF90aW1lbGVmdChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKwl1MzIgdmFsOworCWludCBjb3VudDsKKwlpbnQgZXhwOworCisJdmFsID0gcmVhZGwod2R0LT53ZHRfcmVncyArIFdEVF9TVFMpOworCisJLyogQ3VycmVudCBjb3VudGRvd24gKGZyb20gdGltZW91dCkgKi8KKwljb3VudCA9ICh2YWwgPj4gV0RUX1NUU19DT1VOVF9TSElGVCkgJiBXRFRfU1RTX0NPVU5UX01BU0s7CisKKwkvKiBOdW1iZXIgb2YgZXhwaXJhdGlvbnMgKHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgNHRoIGV4cGlyYXRpb24pICovCisJZXhwID0gKHZhbCA+PiBXRFRfU1RTX0VYUF9TSElGVCkgJiBXRFRfU1RTX0VYUF9NQVNLOworCisJLyoKKwkgKiBUaGUgZW50aXJlIHRoaW5nIGlzIGRpdmlkZWQgYnkgNCBiZWNhdXNlIHdlIGFyZSB0aWNraW5nIGRvd24gNCB0aW1lcworCSAqIGZhc3RlciBkdWUgdG8gbmVlZGluZyB0byB3YWl0IGZvciB0aGUgNHRoIGV4cGlyYXRpb24uCisJICovCisJcmV0dXJuICgoKDMgLSBleHApICogd2RkLT50aW1lb3V0KSArIGNvdW50KSAvIDQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB0ZWdyYV93ZHRfaW5mbyA9IHsKKwkub3B0aW9ucwk9IFdESU9GX1NFVFRJTUVPVVQgfAorCQkJICBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCSAgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuZmlybXdhcmVfdmVyc2lvbiA9IDAsCisJLmlkZW50aXR5CT0gIlRlZ3JhIFdhdGNoZG9nIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHRlZ3JhX3dkdF9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnN0YXJ0ID0gdGVncmFfd2R0X3N0YXJ0LAorCS5zdG9wID0gdGVncmFfd2R0X3N0b3AsCisJLnBpbmcgPSB0ZWdyYV93ZHRfcGluZywKKwkuc2V0X3RpbWVvdXQgPSB0ZWdyYV93ZHRfc2V0X3RpbWVvdXQsCisJLmdldF90aW1lbGVmdCA9IHRlZ3JhX3dkdF9nZXRfdGltZWxlZnQsCit9OworCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZDsKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCWludCByZXQ7CisKKwkvKiBUaGlzIGlzIHRoZSB0aW1lciBiYXNlLiAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIocmVncykpCisJCXJldHVybiBQVFJfRVJSKHJlZ3MpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBvdXIgd2F0Y2hkb2cgZHJpdmVyIGRhdGEsIHdoaWNoIGhhcyB0aGUKKwkgKiBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIG5lc3RlZCB3aXRoaW4gaXQuCisJICovCisJd2R0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqd2R0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZHQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSBzdHJ1Y3QgdGVncmFfd2R0LiAqLworCXdkdC0+d2R0X3JlZ3MgPSByZWdzICsgV0RUX0JBU0U7CisJd2R0LT50bXJfcmVncyA9IHJlZ3MgKyBXRFRfVElNRVJfQkFTRTsKKworCS8qIEluaXRpYWxpemUgc3RydWN0IHdhdGNoZG9nX2RldmljZS4gKi8KKwl3ZGQgPSAmd2R0LT53ZGQ7CisJd2RkLT50aW1lb3V0ID0gaGVhcnRiZWF0OworCXdkZC0+aW5mbyA9ICZ0ZWdyYV93ZHRfaW5mbzsKKwl3ZGQtPm9wcyA9ICZ0ZWdyYV93ZHRfb3BzOworCXdkZC0+bWluX3RpbWVvdXQgPSBNSU5fV0RUX1RJTUVPVVQ7CisJd2RkLT5tYXhfdGltZW91dCA9IE1BWF9XRFRfVElNRU9VVDsKKworCXdhdGNoZG9nX3NldF9kcnZkYXRhKHdkZCwgd2R0KTsKKworCXdhdGNoZG9nX3NldF9ub3dheW91dCh3ZGQsIG5vd2F5b3V0KTsKKworCXJldCA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSh3ZGQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byByZWdpc3RlciB3YXRjaGRvZyBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdkdCk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkgImluaXRpYWxpemVkIChoZWFydGJlYXQgPSAlZCBzZWMsIG5vd2F5b3V0ID0gJWQpXG4iLAorCQkgaGVhcnRiZWF0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl0ZWdyYV93ZHRfc3RvcCgmd2R0LT53ZGQpOworCisJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJndkdC0+d2RkKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZW1vdmVkIHdkdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB0ZWdyYV93ZHRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICh3YXRjaGRvZ19hY3RpdmUoJndkdC0+d2RkKSkKKwkJdGVncmFfd2R0X3N0b3AoJndkdC0+d2RkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAod2F0Y2hkb2dfYWN0aXZlKCZ3ZHQtPndkZCkpCisJCXRlZ3JhX3dkdF9zdGFydCgmd2R0LT53ZGQpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfd2R0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC10aW1lciIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhX3dkdF9vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0ZWdyYV93ZHRfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHRlZ3JhX3dkdF9ydW50aW1lX3N1c3BlbmQsCisJCQkJdGVncmFfd2R0X3J1bnRpbWVfcmVzdW1lKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfd2R0X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdGVncmFfd2R0X3Byb2JlLAorCS5yZW1vdmUJCT0gdGVncmFfd2R0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gInRlZ3JhLXdkdCIsCisJCS5wbQk9ICZ0ZWdyYV93ZHRfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV93ZHRfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRlZ3JhX3dkdF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJOVklESUEgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGVncmEgV2F0Y2hkb2cgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3RzNzJ4eF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvdHM3Mnh4X3dkdC5jCmluZGV4IDA5ZDQ4MzEuLmFmYTlkNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdHM3Mnh4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvdHM3Mnh4X3dkdC5jCkBAIC02MSw3ICs2MSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIH07CiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRzNzJ4eF93ZHRfcGRldjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0czcyeHhfd2R0X3BkZXY7CiAKIC8qCiAgKiBUUy03Mnh4IFdhdGNoZG9nIHN1cHBvcnRzIGZvbGxvd2luZyB0aW1lb3V0cyAodmFsdWUgd3JpdHRlbgpAQCAtMzk0LDEwICszOTQsOCBAQAogCWludCBlcnJvciA9IDA7CiAKIAl3ZHQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB0czcyeHhfd2R0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZHQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJaWYgKCF3ZHQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXIxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAl3ZHQtPmNvbnRyb2xfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHIxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jCmluZGV4IDY4YjQ1ZmMuLmU5ZWE4NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ODM2OTdoZl93ZHQuYwpAQCAtNDU1LDYgKzQ1NSw2IEBACiBtb2R1bGVfZXhpdCh3ZHRfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiwgIgotCQkiU2FtdWVsIFRhcmRpZXUgPHNhbUByZmMxMTQ5Lm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIk1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiIpOworTU9EVUxFX0FVVEhPUigiU2FtdWVsIFRhcmRpZXUgPHNhbUByZmMxMTQ5Lm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigidzgzNjk3aGYvaGcgV0RUIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZHQyODUuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMKaW5kZXggNzM1NWRkZDAuLmViYmIxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZHQyODUuYwpAQCAtMTM5LDkgKzEzOSw4IEBACiBzdGF0aWMgbG9uZyB3YXRjaGRvZ19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXVuc2lnbmVkIGludCBuZXdfbWFyZ2luOwogCWludCBfX3VzZXIgKmludF9hcmcgPSAoaW50IF9fdXNlciAqKWFyZzsKLQlpbnQgcmV0ID0gLUVOT1RUWTsKKwlpbnQgbmV3X21hcmdpbiwgcmV0ID0gLUVOT1RUWTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdF9wY2kuYwppbmRleCAzZGM1NzhlLi40OGIyYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dkdF9wY2kuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdF9wY2kuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYwppbmRleCBlMjQzYmQwLi4yZmExN2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYwpAQCAtMjA0LDcgKzIwNCw2IEBACiAJZHJpdmVyX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkcml2ZXJfZGF0YSksCiAJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcml2ZXJfZGF0YSkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9hY2F0ZSB3YXRjaGRvZyBkZXZpY2VcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKaW5kZXggMzdkMDZlYS4uNjFhNmFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwpAQCAtMzk5LDEyICszOTksMjYgQEAKIAkJCXN0YXRlID0gQlBfRUFHQUlOOwogCQkJYnJlYWs7CiAJCX0KLQotCQlwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKLQkJZnJhbWVfbGlzdFtpXSA9IHBmbl90b19tZm4ocGZuKTsKLQogCQlzY3J1Yl9wYWdlKHBhZ2UpOwogCisJCWZyYW1lX2xpc3RbaV0gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwl9CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IGJhbGxvb25lZCBoaWdobWVtIHBhZ2VzIGRvbid0IGhhdmUga21hcHMuCisJICoKKwkgKiBEbyB0aGlzIGJlZm9yZSBjaGFuZ2luZyB0aGUgcDJtIGFzIGttYXBfZmx1c2hfdW51c2VkKCkKKwkgKiByZWFkcyBQVEVzIHRvIG9idGFpbiBwYWdlcyAoYW5kIGhlbmNlIG5lZWRzIHRoZSBvcmlnaW5hbAorCSAqIHAybSBlbnRyeSkuCisJICovCisJa21hcF9mbHVzaF91bnVzZWQoKTsKKworCS8qIFVwZGF0ZSBkaXJlY3QgbWFwcGluZywgaW52YWxpZGF0ZSBQMk0sIGFuZCBhZGQgdG8gYmFsbG9vbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlwZm4gPSBmcmFtZV9saXN0W2ldOworCQlmcmFtZV9saXN0W2ldID0gcGZuX3RvX21mbihwZm4pOworCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwogI2lmZGVmIENPTkZJR19YRU5fSEFWRV9QVk1NVQogCQkvKgogCQkgKiBCYWxsb29uZWQgb3V0IGZyYW1lcyBhcmUgZWZmZWN0aXZlbHkgcmVwbGFjZWQgd2l0aApAQCAtNDI5LDExICs0NDMsOSBAQAogCQl9CiAjZW5kaWYKIAotCQliYWxsb29uX2FwcGVuZChwZm5fdG9fcGFnZShwZm4pKTsKKwkJYmFsbG9vbl9hcHBlbmQocGFnZSk7CiAJfQogCi0JLyogRW5zdXJlIHRoYXQgYmFsbG9vbmVkIGhpZ2htZW0gcGFnZXMgZG9uJ3QgaGF2ZSBrbWFwcy4gKi8KLQlrbWFwX2ZsdXNoX3VudXNlZCgpOwogCWZsdXNoX3RsYl9hbGwoKTsKIAogCXNldF94ZW5fZ3Vlc3RfaGFuZGxlKHJlc2VydmF0aW9uLmV4dGVudF9zdGFydCwgZnJhbWVfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzXzJsLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzXzJsLmMKaW5kZXggZDdmZjkxNy4uNWRiNDNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c18ybC5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfMmwuYwpAQCAtMTY2LDcgKzE2Niw2IEBACiAJaW50IHN0YXJ0X3dvcmRfaWR4LCBzdGFydF9iaXRfaWR4OwogCWludCB3b3JkX2lkeCwgYml0X2lkeDsKIAlpbnQgaTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJc3RydWN0IHNoYXJlZF9pbmZvICpzID0gSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIAlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1X2luZm8gPSBfX3RoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpOwogCkBAIC0xNzYsMTEgKzE3NSw4IEBACiAJCXVuc2lnbmVkIGludCBldnRjaG4gPSBldnRjaG5fZnJvbV9pcnEoaXJxKTsKIAkJd29yZF9pZHggPSBldnRjaG4gLyBCSVRTX1BFUl9MT05HOwogCQliaXRfaWR4ID0gZXZ0Y2huICUgQklUU19QRVJfTE9ORzsKLQkJaWYgKGFjdGl2ZV9ldnRjaG5zKGNwdSwgcywgd29yZF9pZHgpICYgKDFVTEwgPDwgYml0X2lkeCkpIHsKLQkJCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCQkJaWYgKGRlc2MpCi0JCQkJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2MoaXJxLCBkZXNjKTsKLQkJfQorCQlpZiAoYWN0aXZlX2V2dGNobnMoY3B1LCBzLCB3b3JkX2lkeCkgJiAoMVVMTCA8PCBiaXRfaWR4KSkKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCX0KIAogCS8qCkBAIC0yNDUsMTEgKzI0MSw4IEBACiAJCQlwb3J0ID0gKHdvcmRfaWR4ICogQklUU19QRVJfRVZUQ0hOX1dPUkQpICsgYml0X2lkeDsKIAkJCWlycSA9IGdldF9ldnRjaG5fdG9faXJxKHBvcnQpOwogCi0JCQlpZiAoaXJxICE9IC0xKSB7Ci0JCQkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JCQkJaWYgKGRlc2MpCi0JCQkJCWdlbmVyaWNfaGFuZGxlX2lycV9kZXNjKGlycSwgZGVzYyk7Ci0JCQl9CisJCQlpZiAoaXJxICE9IC0xKQorCQkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCiAJCQliaXRfaWR4ID0gKGJpdF9pZHggKyAxKSAlIEJJVFNfUEVSX0VWVENITl9XT1JEOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2Jhc2UuYyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCmluZGV4IGY0YTllMzMuLmMzNDU4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCkBAIC0zMzYsOSArMzM2LDggQEAKIAogCUJVR19PTihpcnEgPT0gLTEpOwogI2lmZGVmIENPTkZJR19TTVAKLQljcHVtYXNrX2NvcHkoaXJxX3RvX2Rlc2MoaXJxKS0+aXJxX2RhdGEuYWZmaW5pdHksIGNwdW1hc2tfb2YoY3B1KSk7CisJY3B1bWFza19jb3B5KGlycV9nZXRfaXJxX2RhdGEoaXJxKS0+YWZmaW5pdHksIGNwdW1hc2tfb2YoY3B1KSk7CiAjZW5kaWYKLQogCXhlbl9ldnRjaG5fcG9ydF9iaW5kX3RvX2NwdShpbmZvLCBjcHUpOwogCiAJaW5mby0+Y3B1ID0gY3B1OwpAQCAtMzczLDEwICszNzIsOCBAQAogewogCXN0cnVjdCBpcnFfaW5mbyAqaW5mbzsKICNpZmRlZiBDT05GSUdfU01QCi0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQogCS8qIEJ5IGRlZmF1bHQgYWxsIGV2ZW50IGNoYW5uZWxzIG5vdGlmeSBDUFUjMC4gKi8KLQljcHVtYXNrX2NvcHkoZGVzYy0+aXJxX2RhdGEuYWZmaW5pdHksIGNwdW1hc2tfb2YoMCkpOworCWNwdW1hc2tfY29weShpcnFfZ2V0X2lycV9kYXRhKGlycSktPmFmZmluaXR5LCBjcHVtYXNrX29mKDApKTsKICNlbmRpZgogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CkBAIC00OTAsMTMgKzQ4Nyw2IEBACiAJCWluZm8tPnUucGlycS5mbGFncyB8PSBQSVJRX05FRURTX0VPSTsKIH0KIAotc3RhdGljIGJvb2wgcHJvYmluZ19pcnEoaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCi0JcmV0dXJuIGRlc2MgJiYgZGVzYy0+YWN0aW9uID09IE5VTEw7Ci19Ci0KIHN0YXRpYyB2b2lkIGVvaV9waXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKIAlpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGRhdGEtPmlycSk7CkBAIC01MzgsOCArNTI4LDcgQEAKIAkJCQkJQklORF9QSVJRX19XSUxMX1NIQVJFIDogMDsKIAlyYyA9IEhZUEVSVklTT1JfZXZlbnRfY2hhbm5lbF9vcChFVlRDSE5PUF9iaW5kX3BpcnEsICZiaW5kX3BpcnEpOwogCWlmIChyYyAhPSAwKSB7Ci0JCWlmICghcHJvYmluZ19pcnEoaXJxKSkKLQkJCXByX2luZm8oIkZhaWxlZCB0byBvYnRhaW4gcGh5c2ljYWwgSVJRICVkXG4iLCBpcnEpOworCQlwcl93YXJuKCJGYWlsZWQgdG8gb2J0YWluIHBoeXNpY2FsIElSUSAlZFxuIiwgaXJxKTsKIAkJcmV0dXJuIDA7CiAJfQogCWV2dGNobiA9IGJpbmRfcGlycS5wb3J0OwpAQCAtNzcyLDE3ICs3NjEsMTIgQEAKIAogaW50IHhlbl9kZXN0cm95X2lycShpbnQgaXJxKQogewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgcGh5c2Rldl91bm1hcF9waXJxIHVubWFwX2lycTsKIAlzdHJ1Y3QgaXJxX2luZm8gKmluZm8gPSBpbmZvX2Zvcl9pcnEoaXJxKTsKIAlpbnQgcmMgPSAtRU5PRU5UOwogCiAJbXV0ZXhfbG9jaygmaXJxX21hcHBpbmdfdXBkYXRlX2xvY2spOwogCi0JZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JaWYgKCFkZXNjKQotCQlnb3RvIG91dDsKLQogCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSkgewogCQl1bm1hcF9pcnEucGlycSA9IGluZm8tPnUucGlycS5waXJxOwogCQl1bm1hcF9pcnEuZG9taWQgPSBpbmZvLT51LnBpcnEuZG9taWQ7CkBAIC0xMjUxLDYgKzEyMzUsNyBAQAogI2lmZGVmIENPTkZJR19YODYKIAlleGl0X2lkbGUoKTsKICNlbmRpZgorCWluY19pcnFfc3RhdChpcnFfaHZfY2FsbGJhY2tfY291bnQpOwogCiAJX194ZW5fZXZ0Y2huX2RvX3VwY2FsbCgpOwogCkBAIC0xMzM5LDcgKzEzMjQsNyBAQAogc3RhdGljIGludCBzZXRfYWZmaW5pdHlfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QsCiAJCQkgICAgYm9vbCBmb3JjZSkKIHsKLQl1bnNpZ25lZCB0Y3B1ID0gY3B1bWFza19maXJzdChkZXN0KTsKKwl1bnNpZ25lZCB0Y3B1ID0gY3B1bWFza19maXJzdF9hbmQoZGVzdCwgY3B1X29ubGluZV9tYXNrKTsKIAogCXJldHVybiByZWJpbmRfaXJxX3RvX2NwdShkYXRhLT5pcnEsIHRjcHUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19maWZvLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYwppbmRleCAxZGUyYTE5Li45NjEwOWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYwpAQCAtMjM1LDE0ICsyMzUsMTAgQEAKIHN0YXRpYyB2b2lkIGhhbmRsZV9pcnFfZm9yX3BvcnQodW5zaWduZWQgcG9ydCkKIHsKIAlpbnQgaXJxOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAogCWlycSA9IGdldF9ldnRjaG5fdG9faXJxKHBvcnQpOwotCWlmIChpcnEgIT0gLTEpIHsKLQkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JCWlmIChkZXNjKQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2MoaXJxLCBkZXNjKTsKLQl9CisJaWYgKGlycSAhPSAtMSkKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbnN1bWVfb25lX2V2ZW50KHVuc2lnbmVkIGNwdSwKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDczODVlNTQuLjMxMjM5M2YgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtOTYsNiArOTYsNyBAQAogbWVudSAiUHNldWRvIGZpbGVzeXN0ZW1zIgogCiBzb3VyY2UgImZzL3Byb2MvS2NvbmZpZyIKK3NvdXJjZSAiZnMva2VybmZzL0tjb25maWciCiBzb3VyY2UgImZzL3N5c2ZzL0tjb25maWciCiAKIGNvbmZpZyBUTVBGUwpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA0N2FjMDdiLi5mOWNiOTg3IDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtNTIsNyArNTIsOCBAQAogb2JqLXkJCQkJKz0gcXVvdGEvCiAKIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gcHJvYy8KLW9iai0kKENPTkZJR19TWVNGUykJCSs9IHN5c2ZzLyBrZXJuZnMvCitvYmotJChDT05GSUdfS0VSTkZTKQkJKz0ga2VybmZzLworb2JqLSQoQ09ORklHX1NZU0ZTKQkJKz0gc3lzZnMvCiBvYmotJChDT05GSUdfQ09ORklHRlNfRlMpCSs9IGNvbmZpZ2ZzLwogb2JqLXkJCQkJKz0gZGV2cHRzLwogCmRpZmYgLS1naXQgYS9mcy9hZnMvaW50ZXJuYWwuaCBiL2ZzL2Fmcy9pbnRlcm5hbC5oCmluZGV4IDY2MjFmODAuLmJlNzViNTAgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2Fmcy9pbnRlcm5hbC5oCkBAIC03NSw2ICs3NSw3IEBACiAJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLwogCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLworCXdvcmtfZnVuY190CQlhc3luY193b3JrZm47CiAJc3RydWN0IHdvcmtfc3RydWN0CWFzeW5jX3dvcms7CS8qIGFzeW5jaHJvbm91cyB3b3JrIHByb2Nlc3NvciAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwkJLyogYWN0dWFsIHdvcmsgcHJvY2Vzc29yICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwppbmRleCA4YWQ4YzJhLi5lZjk0M2RmIDEwMDY0NAotLS0gYS9mcy9hZnMvcnhycGMuYworKysgYi9mcy9hZnMvcnhycGMuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAKIAkJLyogd2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIGNhbGwgYmVjYXVzZSB0aGUgd29yayBpdGVtIG1heSBiZQogCQkgKiBxdWV1ZWQgKi8KLQkJUFJFUEFSRV9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwpOworCQljYWxsLT5hc3luY193b3JrZm4gPSBhZnNfZGVsZXRlX2FzeW5jX2NhbGw7CiAJCXF1ZXVlX3dvcmsoYWZzX2FzeW5jX2NhbGxzLCAmY2FsbC0+YXN5bmNfd29yayk7CiAJfQogCkBAIC02NjMsNiArNjYzLDEzIEBACiAJY2FsbC0+cmVwbHlfc2l6ZSArPSBsZW47CiB9CiAKK3N0YXRpYyB2b2lkIGFmc19hc3luY193b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCisJY2FsbC0+YXN5bmNfd29ya2ZuKHdvcmspOworfQorCiAvKgogICogYWNjZXB0IHRoZSBiYWNrbG9nIG9mIGluY29taW5nIGNhbGxzCiAgKi8KQEAgLTY4NSw3ICs2OTIsOCBAQAogCQkJCXJldHVybjsKIAkJCX0KIAotCQkJSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKTsKKwkJCWNhbGwtPmFzeW5jX3dvcmtmbiA9IGFmc19wcm9jZXNzX2FzeW5jX2NhbGw7CisJCQlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19hc3luY193b3JrZm4pOwogCQkJY2FsbC0+d2FpdF9tb2RlID0gJmFmc19hc3luY19pbmNvbWluZ19jYWxsOwogCQkJY2FsbC0+dHlwZSA9ICZhZnNfUlhDTXh4eHg7CiAJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7CmRpZmYgLS1naXQgYS9mcy9hbm9uX2lub2Rlcy5jIGIvZnMvYW5vbl9pbm9kZXMuYwppbmRleCAyNDA4NDczLi44MGVmMzhjIDEwMDY0NAotLS0gYS9mcy9hbm9uX2lub2Rlcy5jCisrKyBiL2ZzL2Fub25faW5vZGVzLmMKQEAgLTQxLDE5ICs0MSw4IEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYW5vbl9pbm9kZWZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqcm9vdDsKLQlyb290ID0gbW91bnRfcHNldWRvKGZzX3R5cGUsICJhbm9uX2lub2RlOiIsIE5VTEwsCisJcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAiYW5vbl9pbm9kZToiLCBOVUxMLAogCQkJJmFub25faW5vZGVmc19kZW50cnlfb3BlcmF0aW9ucywgQU5PTl9JTk9ERV9GU19NQUdJQyk7Ci0JaWYgKCFJU19FUlIocm9vdCkpIHsKLQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gcm9vdC0+ZF9zYjsKLQkJYW5vbl9pbm9kZV9pbm9kZSA9IGFsbG9jX2Fub25faW5vZGUocyk7Ci0JCWlmIChJU19FUlIoYW5vbl9pbm9kZV9pbm9kZSkpIHsKLQkJCWRwdXQocm9vdCk7Ci0JCQlkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcihzKTsKLQkJCXJvb3QgPSBFUlJfQ0FTVChhbm9uX2lub2RlX2lub2RlKTsKLQkJfQotCX0KLQlyZXR1cm4gcm9vdDsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGFub25faW5vZGVfZnNfdHlwZSA9IHsKQEAgLTE3NSwyMiArMTY0LDE1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFub25faW5vZGVfaW5pdCh2b2lkKQogewotCWludCBlcnJvcjsKLQotCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmYW5vbl9pbm9kZV9mc190eXBlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZXJyX2V4aXQ7CiAJYW5vbl9pbm9kZV9tbnQgPSBrZXJuX21vdW50KCZhbm9uX2lub2RlX2ZzX3R5cGUpOwotCWlmIChJU19FUlIoYW5vbl9pbm9kZV9tbnQpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihhbm9uX2lub2RlX21udCk7Ci0JCWdvdG8gZXJyX3VucmVnaXN0ZXJfZmlsZXN5c3RlbTsKLQl9Ci0JcmV0dXJuIDA7CisJaWYgKElTX0VSUihhbm9uX2lub2RlX21udCkpCisJCXBhbmljKCJhbm9uX2lub2RlX2luaXQoKSBrZXJuZWwgbW91bnQgZmFpbGVkICglbGQpXG4iLCBQVFJfRVJSKGFub25faW5vZGVfbW50KSk7CiAKLWVycl91bnJlZ2lzdGVyX2ZpbGVzeXN0ZW06Ci0JdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhbm9uX2lub2RlX2ZzX3R5cGUpOwotZXJyX2V4aXQ6Ci0JcGFuaWMoS0VSTl9FUlIgImFub25faW5vZGVfaW5pdCgpIGZhaWxlZCAoJWQpXG4iLCBlcnJvcik7CisJYW5vbl9pbm9kZV9pbm9kZSA9IGFsbG9jX2Fub25faW5vZGUoYW5vbl9pbm9kZV9tbnQtPm1udF9zYik7CisJaWYgKElTX0VSUihhbm9uX2lub2RlX2lub2RlKSkKKwkJcGFuaWMoImFub25faW5vZGVfaW5pdCgpIGlub2RlIGFsbG9jYXRpb24gZmFpbGVkICglbGQpXG4iLCBQVFJfRVJSKGFub25faW5vZGVfaW5vZGUpKTsKKworCXJldHVybiAwOwogfQogCiBmc19pbml0Y2FsbChhbm9uX2lub2RlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLWludGVncml0eS5jIGIvZnMvYmlvLWludGVncml0eS5jCmluZGV4IDRmNzBmMzguLjI5Njk2YjcgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby1pbnRlZ3JpdHkuYworKysgYi9mcy9iaW8taW50ZWdyaXR5LmMKQEAgLTMwMSwyNSArMzAxLDI1IEBACiBFWFBPUlRfU1lNQk9MKGJpb19pbnRlZ3JpdHlfZ2V0X3RhZyk7CiAKIC8qKgotICogYmlvX2ludGVncml0eV9nZW5lcmF0ZSAtIEdlbmVyYXRlIGludGVncml0eSBtZXRhZGF0YSBmb3IgYSBiaW8KLSAqIEBiaW86CWJpbyB0byBnZW5lcmF0ZSBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yCi0gKgotICogRGVzY3JpcHRpb246IEdlbmVyYXRlcyBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yIGEgYmlvIGJ5IGNhbGxpbmcgdGhlCi0gKiBibG9jayBkZXZpY2UncyBnZW5lcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLiAgVGhlIGJpbyBtdXN0IGhhdmUgYQotICogYmlwIGF0dGFjaGVkIHdpdGggZW5vdWdoIHJvb20gdG8gYWNjb21tb2RhdGUgdGhlIGdlbmVyYXRlZAotICogaW50ZWdyaXR5IG1ldGFkYXRhLgorICogYmlvX2ludGVncml0eV9nZW5lcmF0ZV92ZXJpZnkgLSBHZW5lcmF0ZS92ZXJpZnkgaW50ZWdyaXR5IG1ldGFkYXRhIGZvciBhIGJpbworICogQGJpbzoJYmlvIHRvIGdlbmVyYXRlL3ZlcmlmeSBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yCisgKiBAb3BlcmF0ZToJb3BlcmF0ZSBudW1iZXIsIDEgZm9yIGdlbmVyYXRlLCAwIGZvciB2ZXJpZnkKICAqLwotc3RhdGljIHZvaWQgYmlvX2ludGVncml0eV9nZW5lcmF0ZShzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW50IGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGVfdmVyaWZ5KHN0cnVjdCBiaW8gKmJpbywgaW50IG9wZXJhdGUpCiB7CiAJc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJpby0+YmlfYmRldik7CiAJc3RydWN0IGJsa19pbnRlZ3JpdHlfZXhjaGcgYml4OwogCXN0cnVjdCBiaW9fdmVjIGJ2OwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKLQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwotCXVuc2lnbmVkIGludCBzZWN0b3JzLCB0b3RhbDsKKwlzZWN0b3JfdCBzZWN0b3I7CisJdW5zaWduZWQgaW50IHNlY3RvcnMsIHJldCA9IDA7CiAJdm9pZCAqcHJvdF9idWYgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2J1ZjsKIAotCXRvdGFsID0gMDsKKwlpZiAob3BlcmF0ZSkKKwkJc2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKKwllbHNlCisJCXNlY3RvciA9IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfaXRlci5iaV9zZWN0b3I7CisKIAliaXguZGlza19uYW1lID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWU7CiAJYml4LnNlY3Rvcl9zaXplID0gYmktPnNlY3Rvcl9zaXplOwogCkBAIC0zMzAsMTYgKzMzMCwzNyBAQAogCQliaXgucHJvdF9idWYgPSBwcm90X2J1ZjsKIAkJYml4LnNlY3RvciA9IHNlY3RvcjsKIAotCQliaS0+Z2VuZXJhdGVfZm4oJmJpeCk7CisJCWlmIChvcGVyYXRlKSB7CisJCQliaS0+Z2VuZXJhdGVfZm4oJmJpeCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBiaS0+dmVyaWZ5X2ZuKCZiaXgpOworCQkJaWYgKHJldCkgeworCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KIAogCQlzZWN0b3JzID0gYnYuYnZfbGVuIC8gYmktPnNlY3Rvcl9zaXplOwogCQlzZWN0b3IgKz0gc2VjdG9yczsKIAkJcHJvdF9idWYgKz0gc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplOwotCQl0b3RhbCArPSBzZWN0b3JzICogYmktPnR1cGxlX3NpemU7Ci0JCUJVR19PTih0b3RhbCA+IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfaXRlci5iaV9zaXplKTsKIAogCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKIAl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiaW9faW50ZWdyaXR5X2dlbmVyYXRlIC0gR2VuZXJhdGUgaW50ZWdyaXR5IG1ldGFkYXRhIGZvciBhIGJpbworICogQGJpbzoJYmlvIHRvIGdlbmVyYXRlIGludGVncml0eSBtZXRhZGF0YSBmb3IKKyAqCisgKiBEZXNjcmlwdGlvbjogR2VuZXJhdGVzIGludGVncml0eSBtZXRhZGF0YSBmb3IgYSBiaW8gYnkgY2FsbGluZyB0aGUKKyAqIGJsb2NrIGRldmljZSdzIGdlbmVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uICBUaGUgYmlvIG11c3QgaGF2ZSBhCisgKiBiaXAgYXR0YWNoZWQgd2l0aCBlbm91Z2ggcm9vbSB0byBhY2NvbW1vZGF0ZSB0aGUgZ2VuZXJhdGVkCisgKiBpbnRlZ3JpdHkgbWV0YWRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGUoc3RydWN0IGJpbyAqYmlvKQoreworCWJpb19pbnRlZ3JpdHlfZ2VuZXJhdGVfdmVyaWZ5KGJpbywgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgYmxrX2ludGVncml0eV90dXBsZV9zaXplKHN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaSkKQEAgLTQ1NCw0MCArNDc1LDcgQEAKICAqLwogc3RhdGljIGludCBiaW9faW50ZWdyaXR5X3ZlcmlmeShzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJpby0+YmlfYmRldik7Ci0Jc3RydWN0IGJsa19pbnRlZ3JpdHlfZXhjaGcgYml4OwotCXN0cnVjdCBiaW9fdmVjICpidjsKLQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2l0ZXIuYmlfc2VjdG9yOwotCXVuc2lnbmVkIGludCBzZWN0b3JzLCByZXQgPSAwOwotCXZvaWQgKnByb3RfYnVmID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9idWY7Ci0JaW50IGk7Ci0KLQliaXguZGlza19uYW1lID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWU7Ci0JYml4LnNlY3Rvcl9zaXplID0gYmktPnNlY3Rvcl9zaXplOwotCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2LCBiaW8sIGkpIHsKLQkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhidi0+YnZfcGFnZSk7Ci0KLQkJYml4LmRhdGFfYnVmID0ga2FkZHIgKyBidi0+YnZfb2Zmc2V0OwotCQliaXguZGF0YV9zaXplID0gYnYtPmJ2X2xlbjsKLQkJYml4LnByb3RfYnVmID0gcHJvdF9idWY7Ci0JCWJpeC5zZWN0b3IgPSBzZWN0b3I7Ci0KLQkJcmV0ID0gYmktPnZlcmlmeV9mbigmYml4KTsKLQotCQlpZiAocmV0KSB7Ci0JCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlzZWN0b3JzID0gYnYtPmJ2X2xlbiAvIGJpLT5zZWN0b3Jfc2l6ZTsKLQkJc2VjdG9yICs9IHNlY3RvcnM7Ci0JCXByb3RfYnVmICs9IHNlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZTsKLQotCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBiaW9faW50ZWdyaXR5X2dlbmVyYXRlX3ZlcmlmeShiaW8sIDApOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2Jpby5jIGIvZnMvYmlvLmMKaW5kZXggODc1NGU3Yi4uYjJkZDQyZSAxMDA2NDQKLS0tIGEvZnMvYmlvLmMKKysrIGIvZnMvYmlvLmMKQEAgLTExNiw3ICsxMTYsNiBAQAogCWlmICghc2xhYikKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYmlvOiBjcmVhdGUgc2xhYiA8JXM+IGF0ICVkXG4iLCBic2xhYi0+bmFtZSwgZW50cnkpOwogCWJzbGFiLT5zbGFiID0gc2xhYjsKIAlic2xhYi0+c2xhYl9yZWYgPSAxOwogCWJzbGFiLT5zbGFiX3NpemUgPSBzejsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNmFmMjBkZS4uZjg2ZGY4NSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTcyLDggKzcyLDggQEAKICAqIE5vdCBhbGwgYXJjaGl0ZWN0dXJlcyBoYXZlIHN5c191dGltZSwgc28gaW1wbGVtZW50IHRoaXMgaW4gdGVybXMKICAqIG9mIHN5c191dGltZXMuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwKLQkJCQkgc3RydWN0IGNvbXBhdF91dGltYnVmIF9fdXNlciAqdCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIodXRpbWUsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF91dGltYnVmIF9fdXNlciAqLCB0KQogewogCXN0cnVjdCB0aW1lc3BlYyB0dlsyXTsKIApAQCAtODcsMTMgKzg3LDEzIEBACiAJcmV0dXJuIGRvX3V0aW1lcyhBVF9GRENXRCwgZmlsZW5hbWUsIHQgPyB0diA6IE5VTEwsIDApOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c191dGltZW5zYXQodW5zaWduZWQgaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdCwgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNCh1dGltZW5zYXQsIHVuc2lnbmVkIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdCwgaW50LCBmbGFncykKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHZbMl07CiAKIAlpZiAgKHQpIHsKLQkJaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnR2WzBdLCAmdFswXSkgfHwKLQkJICAgIGdldF9jb21wYXRfdGltZXNwZWMoJnR2WzFdLCAmdFsxXSkpCisJCWlmIChjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0dlswXSwgJnRbMF0pIHx8CisJCSAgICBjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0dlsxXSwgJnRbMV0pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKHR2WzBdLnR2X25zZWMgPT0gVVRJTUVfT01JVCAmJiB0dlsxXS50dl9uc2VjID09IFVUSU1FX09NSVQpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlyZXR1cm4gZG9fdXRpbWVzKGRmZCwgZmlsZW5hbWUsIHQgPyB0diA6IE5VTEwsIGZsYWdzKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnV0aW1lc2F0KHVuc2lnbmVkIGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZnV0aW1lc2F0LCB1bnNpZ25lZCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHZbMl07CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXJldHVybiBkb191dGltZXMoZGZkLCBmaWxlbmFtZSwgdCA/IHR2IDogTlVMTCwgMCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lcyhjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHV0aW1lcywgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdCkKIHsKIAlyZXR1cm4gY29tcGF0X3N5c19mdXRpbWVzYXQoQVRfRkRDV0QsIGZpbGVuYW1lLCB0KTsKIH0KQEAgLTE1OSw4ICsxNTksOCBAQAogCXJldHVybiBjb3B5X3RvX3VzZXIodWJ1ZiwgJnRtcCwgc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld3N0YXQoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKLQkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobmV3c3RhdCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yOwpAQCAtMTcxLDggKzE3MSw4IEBACiAJcmV0dXJuIGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3bHN0YXQoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKLQkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobmV3bHN0YXQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCBlcnJvcjsKQEAgLTE4NCw5ICsxODQsOSBAQAogfQogCiAjaWZuZGVmIF9fQVJDSF9XQU5UX1NUQVQ2NAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3ZnN0YXRhdCh1bnNpZ25lZCBpbnQgZGZkLAotCQljb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCi0JCXN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYsIGludCBmbGFnKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChuZXdmc3RhdGF0LCB1bnNpZ25lZCBpbnQsIGRmZCwKKwkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqLCBzdGF0YnVmLCBpbnQsIGZsYWcpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yOwpAQCAtMTk4LDggKzE5OCw4IEBACiB9CiAjZW5kaWYKIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3ZnN0YXQodW5zaWduZWQgaW50IGZkLAotCQlzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICogc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobmV3ZnN0YXQsIHVuc2lnbmVkIGludCwgZmQsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CkBAIC0yNDcsNyArMjQ3LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgc3RhdGZzIGNhbGxzIGFyZSBjb3BpZXMgb2YgY29kZSBmcm9tIGZzL3N0YXRmcy5jIGFuZAogICogc2hvdWxkIGJlIGNoZWNrZWQgYWdhaW5zdCB0aG9zZSBmcm9tIHRpbWUgdG8gdGltZQogICovCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zdGF0ZnMoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBzdHJ1Y3QgY29tcGF0X3N0YXRmcyBfX3VzZXIgKmJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoc3RhdGZzLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICosIGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXRmcyB0bXA7CiAJaW50IGVycm9yID0gdXNlcl9zdGF0ZnMocGF0aG5hbWUsICZ0bXApOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19mc3RhdGZzKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICpidWYpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKGZzdGF0ZnMsIHVuc2lnbmVkIGludCwgZmQsIHN0cnVjdCBjb21wYXRfc3RhdGZzIF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IGtzdGF0ZnMgdG1wOwogCWludCBlcnJvciA9IGZkX3N0YXRmcyhmZCwgJnRtcCk7CkBAIC0yOTgsNyArMjk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc3RhdGZzNjQoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBjb21wYXRfc2l6ZV90IHN6LCBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqYnVmKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzdGF0ZnM2NCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIGNvbXBhdF9zaXplX3QsIHN6LCBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IGtzdGF0ZnMgdG1wOwogCWludCBlcnJvcjsKQEAgLTMxMiw3ICszMTIsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnN0YXRmczY0KHVuc2lnbmVkIGludCBmZCwgY29tcGF0X3NpemVfdCBzeiwgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZnN0YXRmczY0LCB1bnNpZ25lZCBpbnQsIGZkLCBjb21wYXRfc2l6ZV90LCBzeiwgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCBfX3VzZXIgKiwgYnVmKQogewogCXN0cnVjdCBrc3RhdGZzIHRtcDsKIAlpbnQgZXJyb3I7CkBAIC0zMzEsNyArMzMxLDcgQEAKICAqIEdpdmVuIGhvdyBzaW1wbGUgdGhpcyBzeXNjYWxsIGlzIHRoYXQgYXBwb3JhY2ggaXMgbW9yZSBtYWludGFpbmFibGUKICAqIHRoYW4gdGhlIHZhcmlvdXMgY29udmVyc2lvbiBoYWNrcy4KICAqLwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdXN0YXQodW5zaWduZWQgZGV2LCBzdHJ1Y3QgY29tcGF0X3VzdGF0IF9fdXNlciAqdSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIodXN0YXQsIHVuc2lnbmVkLCBkZXYsIHN0cnVjdCBjb21wYXRfdXN0YXQgX191c2VyICosIHUpCiB7CiAJc3RydWN0IGNvbXBhdF91c3RhdCB0bXA7CiAJc3RydWN0IGtzdGF0ZnMgc2J1ZjsKQEAgLTM5OSw4ICszOTksOCBAQAogfQogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsNjQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZmNudGw2NCwgdW5zaWduZWQgaW50LCBmZCwgdW5zaWduZWQgaW50LCBjbWQsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgYXJnKQogewogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAJc3RydWN0IGZsb2NrIGY7CkBAIC00NjgsMTYgKzQ2OCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKGZjbnRsLCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBpbnQsIGNtZCwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBhcmcpCiB7CiAJaWYgKChjbWQgPT0gRl9HRVRMSzY0KSB8fCAoY21kID09IEZfU0VUTEs2NCkgfHwgKGNtZCA9PSBGX1NFVExLVzY0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGNvbXBhdF9zeXNfZmNudGw2NChmZCwgY21kLCBhcmcpOwogfQogCi1hc21saW5rYWdlIGxvbmcKLWNvbXBhdF9zeXNfaW9fc2V0dXAodW5zaWduZWQgbnJfcmVxcywgdTMyIF9fdXNlciAqY3R4MzJwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihpb19zZXR1cCwgdW5zaWduZWQsIG5yX3JlcXMsIHUzMiBfX3VzZXIgKiwgY3R4MzJwKQogewogCWxvbmcgcmV0OwogCWFpb19jb250ZXh0X3QgY3R4NjQ7CkBAIC00OTYsMzIgKzQ5NSwyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotY29tcGF0X3N5c19pb19nZXRldmVudHMoYWlvX2NvbnRleHRfdCBjdHhfaWQsCi0JCQkJIHVuc2lnbmVkIGxvbmcgbWluX25yLAotCQkJCSB1bnNpZ25lZCBsb25nIG5yLAotCQkJCSBzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICpldmVudHMsCi0JCQkJIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShpb19nZXRldmVudHMsIGNvbXBhdF9haW9fY29udGV4dF90LCBjdHhfaWQsCisJCSAgICAgICBjb21wYXRfbG9uZ190LCBtaW5fbnIsCisJCSAgICAgICBjb21wYXRfbG9uZ190LCBuciwKKwkJICAgICAgIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKiwgZXZlbnRzLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdGltZW91dCkKIHsKLQlsb25nIHJldDsKIAlzdHJ1Y3QgdGltZXNwZWMgdDsKIAlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1dCA9IE5VTEw7CiAKLQlyZXQgPSAtRUZBVUxUOwotCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZXZlbnRzLCAKLQkJCQluciAqIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKSkpCi0JCWdvdG8gb3V0OwogCWlmICh0aW1lb3V0KSB7Ci0JCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0LCB0aW1lb3V0KSkKLQkJCWdvdG8gb3V0OworCQlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdCwgdGltZW91dCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQl1dCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdXQpKTsKIAkJaWYgKGNvcHlfdG9fdXNlcih1dCwgJnQsIHNpemVvZih0KSkgKQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IAotCXJldCA9IHN5c19pb19nZXRldmVudHMoY3R4X2lkLCBtaW5fbnIsIG5yLCBldmVudHMsIHV0KTsKLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiBzeXNfaW9fZ2V0ZXZlbnRzKGN0eF9pZCwgbWluX25yLCBuciwgZXZlbnRzLCB1dCk7CiB9CiAKIC8qIEEgd3JpdGUgb3BlcmF0aW9uIGRvZXMgYSByZWFkIGZyb20gdXNlciBzcGFjZSBhbmQgdmljZSB2ZXJzYSAqLwpAQCAtNjE3LDggKzYwOCw4IEBACiAKICNkZWZpbmUgTUFYX0FJT19TVUJNSVRTIAkoUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgaW9jYiAqKSkKIAotYXNtbGlua2FnZSBsb25nCi1jb21wYXRfc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgaW50IG5yLCB1MzIgX191c2VyICppb2NiKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhpb19zdWJtaXQsIGNvbXBhdF9haW9fY29udGV4dF90LCBjdHhfaWQsCisJCSAgICAgICBpbnQsIG5yLCB1MzIgX191c2VyICosIGlvY2IpCiB7CiAJc3RydWN0IGlvY2IgX191c2VyICogX191c2VyICppb2NiNjQ7IAogCWxvbmcgcmV0OwpAQCAtNzcwLDEwICs3NjEsMTAgQEAKICNkZWZpbmUgTkNQRlNfTkFNRSAgICAgICJuY3BmcyIKICNkZWZpbmUgTkZTNF9OQU1FCSJuZnM0IgogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3VudChjb25zdCBjaGFyIF9fdXNlciAqIGRldl9uYW1lLAotCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIGRpcl9uYW1lLAotCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIHR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkJIGNvbnN0IHZvaWQgX191c2VyICogZGF0YSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUobW91bnQsIGNvbnN0IGNoYXIgX191c2VyICosIGRldl9uYW1lLAorCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiwgZGlyX25hbWUsCisJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqLCB0eXBlLCBjb21wYXRfdWxvbmdfdCwgZmxhZ3MsCisJCSAgICAgICBjb25zdCB2b2lkIF9fdXNlciAqLCBkYXRhKQogewogCWNoYXIgKmtlcm5lbF90eXBlOwogCXVuc2lnbmVkIGxvbmcgZGF0YV9wYWdlOwpAQCAtODY5LDggKzg2MCw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29sZF9yZWFkZGlyKHVuc2lnbmVkIGludCBmZCwKLQlzdHJ1Y3QgY29tcGF0X29sZF9saW51eF9kaXJlbnQgX191c2VyICpkaXJlbnQsIHVuc2lnbmVkIGludCBjb3VudCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMob2xkX3JlYWRkaXIsIHVuc2lnbmVkIGludCwgZmQsCisJCXN0cnVjdCBjb21wYXRfb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmQgZiA9IGZkZ2V0KGZkKTsKQEAgLTk0OCw4ICs5MzksOCBAQAogCXJldHVybiAtRUZBVUxUOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRkZW50cyh1bnNpZ25lZCBpbnQgZmQsCi0JCXN0cnVjdCBjb21wYXRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKGdldGRlbnRzLCB1bnNpZ25lZCBpbnQsIGZkLAorCQlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCXN0cnVjdCBmZCBmOwogCXN0cnVjdCBjb21wYXRfbGludXhfZGlyZW50IF9fdXNlciAqIGxhc3RkaXJlbnQ7CkBAIC05ODEsNyArOTcyLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZm5kZWYgX19BUkNIX09NSVRfQ09NUEFUX1NZU19HRVRERU5UUzY0CisjaWZkZWYgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19HRVRERU5UUzY0CiAKIHN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2s2NCB7CiAJc3RydWN0IGRpcl9jb250ZXh0IGN0eDsKQEAgLTEwMzMsOCArMTAyNCw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldGRlbnRzNjQodW5zaWduZWQgaW50IGZkLAotCQlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKGdldGRlbnRzNjQsIHVuc2lnbmVkIGludCwgZmQsCisJCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCXN0cnVjdCBmZCBmOwogCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiBsYXN0ZGlyZW50OwpAQCAtMTA2Niw3ICsxMDU3LDcgQEAKIAlmZHB1dChmKTsKIAlyZXR1cm4gZXJyb3I7CiB9Ci0jZW5kaWYgLyogISBfX0FSQ0hfT01JVF9DT01QQVRfU1lTX0dFVERFTlRTNjQgKi8KKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX0dFVERFTlRTNjQgKi8KIAogLyoKICAqIEV4YWN0bHkgbGlrZSBmcy9vcGVuLmM6c3lzX29wZW4oKSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBzZXQgdGhlCkBAIC0xMjg3LDkgKzEyNzgsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbGVjdChpbnQgbiwgY29tcGF0X3Vsb25nX3QgX191c2VyICppbnAsCi0JY29tcGF0X3Vsb25nX3QgX191c2VyICpvdXRwLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmV4cCwKLQlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0dnApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHNlbGVjdCwgaW50LCBuLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgaW5wLAorCWNvbXBhdF91bG9uZ190IF9fdXNlciAqLCBvdXRwLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgZXhwLAorCXN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdHZwKQogewogCXN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZSwgKnRvID0gTlVMTDsKIAlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgdHY7CkBAIC0xMzIwLDcgKzEzMTEsNyBAQAogCWNvbXBhdF91cHRyX3QgdHZwOwogfTsKIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfb2xkX3NlbGVjdChzdHJ1Y3QgY29tcGF0X3NlbF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShvbGRfc2VsZWN0LCBzdHJ1Y3QgY29tcGF0X3NlbF9hcmdfc3RydWN0IF9fdXNlciAqLCBhcmcpCiB7CiAJc3RydWN0IGNvbXBhdF9zZWxfYXJnX3N0cnVjdCBhOwogCkBAIC0xMzgxLDkgKzEzNzIsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3BzZWxlY3Q2KGludCBuLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmlucCwKLQljb21wYXRfdWxvbmdfdCBfX3VzZXIgKm91dHAsIGNvbXBhdF91bG9uZ190IF9fdXNlciAqZXhwLAotCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0c3AsIHZvaWQgX191c2VyICpzaWcpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHBzZWxlY3Q2LCBpbnQsIG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCBpbnAsCisJY29tcGF0X3Vsb25nX3QgX191c2VyICosIG91dHAsIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCBleHAsCisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdHNwLCB2b2lkIF9fdXNlciAqLCBzaWcpCiB7CiAJY29tcGF0X3NpemVfdCBzaWdzZXRzaXplID0gMDsKIAljb21wYXRfdXB0cl90IHVwID0gMDsKQEAgLTE0MDAsOSArMTM5MSw5IEBACiAJCQkJIHNpZ3NldHNpemUpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19wcG9sbChzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqdWZkcywKLQl1bnNpZ25lZCBpbnQgbmZkcywgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRzcCwKLQljb25zdCBjb21wYXRfc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLCBjb21wYXRfc2l6ZV90IHNpZ3NldHNpemUpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHBwb2xsLCBzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqLCB1ZmRzLAorCXVuc2lnbmVkIGludCwgIG5mZHMsIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRzcCwKKwljb25zdCBjb21wYXRfc2lnc2V0X3QgX191c2VyICosIHNpZ21hc2ssIGNvbXBhdF9zaXplX3QsIHNpZ3NldHNpemUpCiB7CiAJY29tcGF0X3NpZ3NldF90IHNzMzI7CiAJc2lnc2V0X3Qga3NpZ21hc2ssIHNpZ3NhdmVkOwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2JpbmZtdF9lbGYuYyBiL2ZzL2NvbXBhdF9iaW5mbXRfZWxmLmMKaW5kZXggYTgxMTQ3ZS4uNGQyNGQxNyAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2JpbmZtdF9lbGYuYworKysgYi9mcy9jb21wYXRfYmluZm10X2VsZi5jCkBAIC04OCw2ICs4OCwxMSBAQAogI2RlZmluZQlFTEZfSFdDQVAJCUNPTVBBVF9FTEZfSFdDQVAKICNlbmRpZgogCisjaWZkZWYJQ09NUEFUX0VMRl9IV0NBUDIKKyN1bmRlZglFTEZfSFdDQVAyCisjZGVmaW5lCUVMRl9IV0NBUDIJCUNPTVBBVF9FTEZfSFdDQVAyCisjZW5kaWYKKwogI2lmZGVmCUNPTVBBVF9BUkNIX0RMSU5GTwogI3VuZGVmCUFSQ0hfRExJTkZPCiAjZGVmaW5lCUFSQ0hfRExJTkZPCQlDT01QQVRfQVJDSF9ETElORk8KZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggMzg4MTYxMC4uZTgyMjg5MCAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTE1MzgsOSArMTUzOCwxMCBAQAogCXJldHVybiBpb2N0bF9wb2ludGVyW2ldID09IHhjbWQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoaW9jdGwsIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGludCwgY21kLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIGFyZzMyKQogeworCXVuc2lnbmVkIGxvbmcgYXJnID0gYXJnMzI7CiAJc3RydWN0IGZkIGYgPSBmZGdldChmZCk7CiAJaW50IGVycm9yID0gLUVCQURGOwogCWlmICghZi5maWxlKQpkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCAyNjVlMGNlLi5jYTAyYzEzIDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtMjgzMyw5ICsyODMzLDkgQEAKIAl1MzIgZGxlbiA9IEFDQ0VTU19PTkNFKG5hbWUtPmxlbik7CiAJY2hhciAqcDsKIAotCWlmICgqYnVmbGVuIDwgZGxlbiArIDEpCi0JCXJldHVybiAtRU5BTUVUT09MT05HOwogCSpidWZsZW4gLT0gZGxlbiArIDE7CisJaWYgKCpidWZsZW4gPCAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAlwID0gKmJ1ZmZlciAtPSBkbGVuICsgMTsKIAkqcCsrID0gJy8nOwogCXdoaWxlIChkbGVuLS0pIHsKZGlmZiAtLWdpdCBhL2ZzL2VmaXZhcmZzL2ZpbGUuYyBiL2ZzL2VmaXZhcmZzL2ZpbGUuYwppbmRleCA4ZGQ1MjRmLi5jZGIyOTcxIDEwMDY0NAotLS0gYS9mcy9lZml2YXJmcy9maWxlLmMKKysrIGIvZnMvZWZpdmFyZnMvZmlsZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAJdTMyIGF0dHJpYnV0ZXM7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAl1bnNpZ25lZCBsb25nIGRhdGFzaXplID0gY291bnQgLSBzaXplb2YoYXR0cmlidXRlcyk7Ci0Jc3NpemVfdCBieXRlcyA9IDA7CisJc3NpemVfdCBieXRlczsKIAlib29sIHNldCA9IGZhbHNlOwogCiAJaWYgKGNvdW50IDwgc2l6ZW9mKGF0dHJpYnV0ZXMpKQpAQCAtMzMsMTQgKzMzLDkgQEAKIAlpZiAoYXR0cmlidXRlcyAmIH4oRUZJX1ZBUklBQkxFX01BU0spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHVzZXJidWYgKyBzaXplb2YoYXR0cmlidXRlcyksIGRhdGFzaXplKSkgewotCQlieXRlcyA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwotCX0KKwlkYXRhID0gbWVtZHVwX3VzZXIodXNlcmJ1ZiArIHNpemVvZihhdHRyaWJ1dGVzKSwgZGF0YXNpemUpOworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOwogCiAJYnl0ZXMgPSBlZml2YXJfZW50cnlfc2V0X2dldF9zaXplKHZhciwgYXR0cmlidXRlcywgJmRhdGFzaXplLAogCQkJCQkgIGRhdGEsICZzZXQpOwpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDNkNzhmY2MuLjRmNTk0MDIgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTE2MTksOSArMTYxOSw5IEBACiAJcmV0dXJuIGRvX2V4ZWN2ZShnZXRuYW1lKGZpbGVuYW1lKSwgYXJndiwgZW52cCk7CiB9CiAjaWZkZWYgQ09ORklHX0NPTVBBVAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZXhlY3ZlKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsCi0JY29uc3QgY29tcGF0X3VwdHJfdCBfX3VzZXIgKiBhcmd2LAotCWNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICogZW52cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZXhlY3ZlLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwKKwljb25zdCBjb21wYXRfdXB0cl90IF9fdXNlciAqLCBhcmd2LAorCWNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICosIGVudnApCiB7CiAJcmV0dXJuIGNvbXBhdF9kb19leGVjdmUoZ2V0bmFtZShmaWxlbmFtZSksIGFyZ3YsIGVudnApOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDZlMzk4OTUuLjI0YmZkN2YgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgpAQCAtMzkyMSwxOCArMzkyMiwyMCBAQAogdm9pZCBleHQ0X3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXVuc2lnbmVkIGludCBmbGFncyA9IEVYVDRfSShpbm9kZSktPmlfZmxhZ3M7CisJdW5zaWduZWQgaW50IG5ld19mbCA9IDA7CiAKLQlpbm9kZS0+aV9mbGFncyAmPSB+KFNfU1lOQ3xTX0FQUEVORHxTX0lNTVVUQUJMRXxTX05PQVRJTUV8U19ESVJTWU5DKTsKIAlpZiAoZmxhZ3MgJiBFWFQ0X1NZTkNfRkwpCi0JCWlub2RlLT5pX2ZsYWdzIHw9IFNfU1lOQzsKKwkJbmV3X2ZsIHw9IFNfU1lOQzsKIAlpZiAoZmxhZ3MgJiBFWFQ0X0FQUEVORF9GTCkKLQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CisJCW5ld19mbCB8PSBTX0FQUEVORDsKIAlpZiAoZmxhZ3MgJiBFWFQ0X0lNTVVUQUJMRV9GTCkKLQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJCW5ld19mbCB8PSBTX0lNTVVUQUJMRTsKIAlpZiAoZmxhZ3MgJiBFWFQ0X05PQVRJTUVfRkwpCi0JCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwkJbmV3X2ZsIHw9IFNfTk9BVElNRTsKIAlpZiAoZmxhZ3MgJiBFWFQ0X0RJUlNZTkNfRkwpCi0JCWlub2RlLT5pX2ZsYWdzIHw9IFNfRElSU1lOQzsKKwkJbmV3X2ZsIHw9IFNfRElSU1lOQzsKKwlzZXRfbWFza19iaXRzKCZpbm9kZS0+aV9mbGFncywKKwkJICAgICAgU19TWU5DfFNfQVBQRU5EfFNfSU1NVVRBQkxFfFNfTk9BVElNRXxTX0RJUlNZTkMsIG5ld19mbCk7CiB9CiAKIC8qIFByb3BhZ2F0ZSBmbGFncyBmcm9tIGlfZmxhZ3MgdG8gRVhUNF9JKGlub2RlKS0+aV9mbGFncyAqLwpkaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jCmluZGV4IDYwYTQ1ZTkuLmI2MTI5M2IgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGUuYworKysgYi9mcy9maWxlLmMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCWVycm9yID0gZmQ7CiAjaWYgMQogCS8qIFNhbml0eSBjaGVjayAqLwotCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KGZkdC0+ZmRbZmRdKSAhPSBOVUxMKSB7CisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihmZHQtPmZkW2ZkXSkgIT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGxvY19mZDogc2xvdCAlZCBub3QgTlVMTCFcbiIsIGZkKTsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBOVUxMKTsKIAl9CkBAIC03MTMsMjcgKzcxMywxNiBAQAogCiB1bnNpZ25lZCBsb25nIF9fZmRnZXRfcG9zKHVuc2lnbmVkIGludCBmZCkKIHsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCXVuc2lnbmVkIGxvbmcgdjsKKwl1bnNpZ25lZCBsb25nIHYgPSBfX2ZkZ2V0KGZkKTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IChzdHJ1Y3QgZmlsZSAqKSh2ICYgfjMpOwogCi0JaWYgKGF0b21pY19yZWFkKCZmaWxlcy0+Y291bnQpID09IDEpIHsKLQkJZmlsZSA9IF9fZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7Ci0JCXYgPSAwOwotCX0gZWxzZSB7Ci0JCWZpbGUgPSBfX2ZnZXQoZmQsIDApOwotCQl2ID0gRkRQVVRfRlBVVDsKLQl9Ci0JaWYgKCFmaWxlKQotCQlyZXR1cm4gMDsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9BVE9NSUNfUE9TKSB7CisJaWYgKGZpbGUgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0FUT01JQ19QT1MpKSB7CiAJCWlmIChmaWxlX2NvdW50KGZpbGUpID4gMSkgewogCQkJdiB8PSBGRFBVVF9QT1NfVU5MT0NLOwogCQkJbXV0ZXhfbG9jaygmZmlsZS0+Zl9wb3NfbG9jayk7CiAJCX0KIAl9Ci0JcmV0dXJuIHYgfCAodW5zaWduZWQgbG9uZylmaWxlOworCXJldHVybiB2OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMva2VybmZzL0tjb25maWcgYi9mcy9rZXJuZnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdiNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMva2VybmZzL0tjb25maWcKQEAgLTAsMCArMSw3IEBACisjCisjIEtFUk5GUyBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgaXRzIHVzZXJzCisjCisKK2NvbmZpZyBLRVJORlMKKwlib29sCisJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmMKaW5kZXggYmQ2ZTE4Yi4uMGJkMDVhYiAxMDA2NDQKLS0tIGEvZnMva2VybmZzL2Rpci5jCisrKyBiL2ZzL2tlcm5mcy9kaXIuYwpAQCAtOCw2ICs4LDcgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgpAQCAtMTgsOSArMTksMTYxIEBACiAjaW5jbHVkZSAia2VybmZzLWludGVybmFsLmgiCiAKIERFRklORV9NVVRFWChrZXJuZnNfbXV0ZXgpOworc3RhdGljIERFRklORV9TUElOTE9DSyhrZXJuZnNfcmVuYW1lX2xvY2spOwkvKiBrbi0+cGFyZW50IGFuZCAtPm5hbWUgKi8KK3N0YXRpYyBjaGFyIGtlcm5mc19wcl9jb250X2J1ZltQQVRIX01BWF07CS8qIHByb3RlY3RlZCBieSByZW5hbWVfbG9jayAqLwogCiAjZGVmaW5lIHJiX3RvX2tuKFgpIHJiX2VudHJ5KChYKSwgc3RydWN0IGtlcm5mc19ub2RlLCByYikKIAorc3RhdGljIGJvb2wga2VybmZzX2FjdGl2ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmtlcm5mc19tdXRleCk7CisJcmV0dXJuIGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSA+PSAwOworfQorCitzdGF0aWMgYm9vbCBrZXJuZnNfbG9ja2RlcChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCisJcmV0dXJuIGtuLT5mbGFncyAmIEtFUk5GU19MT0NLREVQOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworc3RhdGljIGludCBrZXJuZnNfbmFtZV9sb2NrZWQoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXJldHVybiBzdHJsY3B5KGJ1Ziwga24tPnBhcmVudCA/IGtuLT5uYW1lIDogIi8iLCBidWZsZW4pOworfQorCitzdGF0aWMgY2hhciAqIF9fbXVzdF9jaGVjayBrZXJuZnNfcGF0aF9sb2NrZWQoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLAorCQkJCQkgICAgICBzaXplX3QgYnVmbGVuKQoreworCWNoYXIgKnAgPSBidWYgKyBidWZsZW47CisJaW50IGxlbjsKKworCSotLXAgPSAnXDAnOworCisJZG8geworCQlsZW4gPSBzdHJsZW4oa24tPm5hbWUpOworCQlpZiAocCAtIGJ1ZiA8IGxlbiArIDEpIHsKKwkJCWJ1ZlswXSA9ICdcMCc7CisJCQlwID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXAgLT0gbGVuOworCQltZW1jcHkocCwga24tPm5hbWUsIGxlbik7CisJCSotLXAgPSAnLyc7CisJCWtuID0ga24tPnBhcmVudDsKKwl9IHdoaWxlIChrbiAmJiBrbi0+cGFyZW50KTsKKworCXJldHVybiBwOworfQorCisvKioKKyAqIGtlcm5mc19uYW1lIC0gb2J0YWluIHRoZSBuYW1lIG9mIGEgZ2l2ZW4gbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICogQGJ1ZjogYnVmZmVyIHRvIGNvcHkgQGtuJ3MgbmFtZSBpbnRvCisgKiBAYnVmbGVuOiBzaXplIG9mIEBidWYKKyAqCisgKiBDb3BpZXMgdGhlIG5hbWUgb2YgQGtuIGludG8gQGJ1ZiBvZiBAYnVmbGVuIGJ5dGVzLiAgVGhlIGJlaGF2aW9yIGlzCisgKiBzaW1pbGFyIHRvIHN0cmxjcHkoKS4gIEl0IHJldHVybnMgdGhlIGxlbmd0aCBvZiBAa24ncyBuYW1lIGFuZCBpZiBAYnVmCisgKiBpc24ndCBsb25nIGVub3VnaCwgaXQncyBmaWxsZWQgdXB0byBAYnVmbGVuLTEgYW5kIG51bCB0ZXJtaW5hdGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCitpbnQga2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBrZXJuZnNfbmFtZV9sb2NrZWQoa24sIGJ1ZiwgYnVmbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGtlcm5mc19wYXRoIC0gYnVpbGQgZnVsbCBwYXRoIG9mIGEgZ2l2ZW4gbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICogQGJ1ZjogYnVmZmVyIHRvIGNvcHkgQGtuJ3MgbmFtZSBpbnRvCisgKiBAYnVmbGVuOiBzaXplIG9mIEBidWYKKyAqCisgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCBvZiBAa24gaW4gQGJ1ZiBvZiBAYnVmbGVuIGJ5dGVzLiAgVGhlCisgKiBwYXRoIGlzIGJ1aWx0IGZyb20gdGhlIGVuZCBvZiBAYnVmIHNvIHRoZSByZXR1cm5lZCBwb2ludGVyIHVzdWFsbHkKKyAqIGRvZXNuJ3QgbWF0Y2ggQGJ1Zi4gIElmIEBidWYgaXNuJ3QgbG9uZyBlbm91Z2gsIEBidWYgaXMgbnVsIHRlcm1pbmF0ZWQKKyAqIGFuZCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqLworY2hhciAqa2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlwID0ga2VybmZzX3BhdGhfbG9ja2VkKGtuLCBidWYsIGJ1Zmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICogcHJfY29udF9rZXJuZnNfbmFtZSAtIHByX2NvbnQgbmFtZSBvZiBhIGtlcm5mc19ub2RlCisgKiBAa246IGtlcm5mc19ub2RlIG9mIGludGVyZXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuCisgKi8KK3ZvaWQgcHJfY29udF9rZXJuZnNfbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisKKwlrZXJuZnNfbmFtZV9sb2NrZWQoa24sIGtlcm5mc19wcl9jb250X2J1Ziwgc2l6ZW9mKGtlcm5mc19wcl9jb250X2J1ZikpOworCXByX2NvbnQoIiVzIiwga2VybmZzX3ByX2NvbnRfYnVmKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtlcm5mc19yZW5hbWVfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHByX2NvbnRfa2VybmZzX3BhdGggLSBwcl9jb250IHBhdGggb2YgYSBrZXJuZnNfbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCit2b2lkIHByX2NvbnRfa2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgKnA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisKKwlwID0ga2VybmZzX3BhdGhfbG9ja2VkKGtuLCBrZXJuZnNfcHJfY29udF9idWYsCisJCQkgICAgICAgc2l6ZW9mKGtlcm5mc19wcl9jb250X2J1ZikpOworCWlmIChwKQorCQlwcl9jb250KCIlcyIsIHApOworCWVsc2UKKwkJcHJfY29udCgiPG5hbWUgdG9vIGxvbmc+Iik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBrZXJuZnNfZ2V0X3BhcmVudCAtIGRldGVybWluZSB0aGUgcGFyZW50IG5vZGUgYW5kIHBpbiBpdAorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICoKKyAqIERldGVybWluZXMgQGtuJ3MgcGFyZW50LCBwaW5zIGFuZCByZXR1cm5zIGl0LiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAqIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCitzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19nZXRfcGFyZW50KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlwYXJlbnQgPSBrbi0+cGFyZW50OworCWtlcm5mc19nZXQocGFyZW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKIC8qKgogICoJa2VybmZzX25hbWVfaGFzaAogICoJQG5hbWU6IE51bGwgdGVybWluYXRlZCBzdHJpbmcgdG8gaGFzaApAQCAtMzcsNyArMTkwLDcgQEAKIAloYXNoID0gKGVuZF9uYW1lX2hhc2goaGFzaCkgXiBoYXNoX3B0cigodm9pZCAqKW5zLCAzMSkpOwogCWhhc2ggJj0gMHg3ZmZmZmZmZlU7CiAJLyogUmVzZXJ2ZSBoYXNoIG51bWJlcnMgMCwgMSBhbmQgSU5UX01BWCBmb3IgbWFnaWMgZGlyZWN0b3J5IGVudHJpZXMgKi8KLQlpZiAoaGFzaCA8IDEpCisJaWYgKGhhc2ggPCAyKQogCQloYXNoICs9IDI7CiAJaWYgKGhhc2ggPj0gSU5UX01BWCkKIAkJaGFzaCA9IElOVF9NQVggLSAxOwpAQCAtMTA1LDE4ICsyNTgsMjQgQEAKICAqCWtlcm5mc191bmxpbmtfc2libGluZyAtIHVubGluayBrZXJuZnNfbm9kZSBmcm9tIHNpYmxpbmcgcmJ0cmVlCiAgKglAa246IGtlcm5mc19ub2RlIG9mIGludGVyZXN0CiAgKgotICoJVW5saW5rIEBrbiBmcm9tIGl0cyBzaWJsaW5nIHJidHJlZSB3aGljaCBzdGFydHMgZnJvbQotICoJa24tPnBhcmVudC0+ZGlyLmNoaWxkcmVuLgorICoJVHJ5IHRvIHVubGluayBAa24gZnJvbSBpdHMgc2libGluZyByYnRyZWUgd2hpY2ggc3RhcnRzIGZyb20KKyAqCWtuLT5wYXJlbnQtPmRpci5jaGlsZHJlbi4gIFJldHVybnMgJXRydWUgaWYgQGtuIHdhcyBhY3R1YWxseQorICoJcmVtb3ZlZCwgJWZhbHNlIGlmIEBrbiB3YXNuJ3Qgb24gdGhlIHJidHJlZS4KICAqCiAgKglMb2NraW5nOgogICoJbXV0ZXhfbG9jayhrZXJuZnNfbXV0ZXgpCiAgKi8KLXN0YXRpYyB2b2lkIGtlcm5mc191bmxpbmtfc2libGluZyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQorc3RhdGljIGJvb2wga2VybmZzX3VubGlua19zaWJsaW5nKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7CisJaWYgKFJCX0VNUFRZX05PREUoJmtuLT5yYikpCisJCXJldHVybiBmYWxzZTsKKwogCWlmIChrZXJuZnNfdHlwZShrbikgPT0gS0VSTkZTX0RJUikKIAkJa24tPnBhcmVudC0+ZGlyLnN1YmRpcnMtLTsKIAogCXJiX2VyYXNlKCZrbi0+cmIsICZrbi0+cGFyZW50LT5kaXIuY2hpbGRyZW4pOworCVJCX0NMRUFSX05PREUoJmtuLT5yYik7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qKgpAQCAtMTM3LDcgKzI5Niw3IEBACiAJaWYgKCFhdG9taWNfaW5jX3VubGVzc19uZWdhdGl2ZSgma24tPmFjdGl2ZSkpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGtuLT5mbGFncyAmIEtFUk5GU19MT0NLREVQKQorCWlmIChrZXJuZnNfbG9ja2RlcChrbikpCiAJCXJ3c2VtX2FjcXVpcmVfcmVhZCgma24tPmRlcF9tYXAsIDAsIDEsIF9SRVRfSVBfKTsKIAlyZXR1cm4ga247CiB9CkBAIC0xNTEsNTkgKzMxMCw1NyBAQAogICovCiB2b2lkIGtlcm5mc19wdXRfYWN0aXZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7CisJc3RydWN0IGtlcm5mc19yb290ICpyb290ID0ga2VybmZzX3Jvb3Qoa24pOwogCWludCB2OwogCiAJaWYgKHVubGlrZWx5KCFrbikpCiAJCXJldHVybjsKIAotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKQogCQlyd3NlbV9yZWxlYXNlKCZrbi0+ZGVwX21hcCwgMSwgX1JFVF9JUF8pOwogCXYgPSBhdG9taWNfZGVjX3JldHVybigma24tPmFjdGl2ZSk7CiAJaWYgKGxpa2VseSh2ICE9IEtOX0RFQUNUSVZBVEVEX0JJQVMpKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIGF0b21pY19kZWNfcmV0dXJuKCkgaXMgYSBtYigpLCB3ZSdsbCBhbHdheXMgc2VlIHRoZSB1cGRhdGVkCi0JICoga24tPnUuY29tcGxldGlvbi4KLQkgKi8KLQljb21wbGV0ZShrbi0+dS5jb21wbGV0aW9uKTsKKwl3YWtlX3VwX2FsbCgmcm9vdC0+ZGVhY3RpdmF0ZV93YWl0cSk7CiB9CiAKIC8qKgotICoJa2VybmZzX2RlYWN0aXZhdGUgLSBkZWFjdGl2YXRlIGtlcm5mc19ub2RlCi0gKglAa246IGtlcm5mc19ub2RlIHRvIGRlYWN0aXZhdGUKKyAqIGtlcm5mc19kcmFpbiAtIGRyYWluIGtlcm5mc19ub2RlCisgKiBAa246IGtlcm5mc19ub2RlIHRvIGRyYWluCiAgKgotICoJRGVueSBuZXcgYWN0aXZlIHJlZmVyZW5jZXMgYW5kIGRyYWluIGV4aXN0aW5nIG9uZXMuCisgKiBEcmFpbiBleGlzdGluZyB1c2FnZXMgYW5kIG51a2UgYWxsIGV4aXN0aW5nIG1tYXBzIG9mIEBrbi4gIE11dGlwbGUKKyAqIHJlbW92ZXJzIG1heSBpbnZva2UgdGhpcyBmdW5jdGlvbiBjb25jdXJyZW50bHkgb24gQGtuIGFuZCBhbGwgd2lsbAorICogcmV0dXJuIGFmdGVyIGRyYWluaW5nIGlzIGNvbXBsZXRlLgogICovCi1zdGF0aWMgdm9pZCBrZXJuZnNfZGVhY3RpdmF0ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQorc3RhdGljIHZvaWQga2VybmZzX2RyYWluKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCisJX19yZWxlYXNlcygma2VybmZzX211dGV4KSBfX2FjcXVpcmVzKCZrZXJuZnNfbXV0ZXgpCiB7Ci0JREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7Ci0JaW50IHY7CisJc3RydWN0IGtlcm5mc19yb290ICpyb290ID0ga2VybmZzX3Jvb3Qoa24pOwogCi0JQlVHX09OKCEoa24tPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZrZXJuZnNfbXV0ZXgpOworCVdBUk5fT05fT05DRShrZXJuZnNfYWN0aXZlKGtuKSk7CiAKLQlpZiAoIShrZXJuZnNfdHlwZShrbikgJiBLRVJORlNfQUNUSVZFX1JFRikpCi0JCXJldHVybjsKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CiAKLQlrbi0+dS5jb21wbGV0aW9uID0gKHZvaWQgKikmd2FpdDsKLQotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKSB7CiAJCXJ3c2VtX2FjcXVpcmUoJmtuLT5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7Ci0JLyogYXRvbWljX2FkZF9yZXR1cm4oKSBpcyBhIG1iKCksIHB1dF9hY3RpdmUoKSB3aWxsIGFsd2F5cyBzZWUKLQkgKiB0aGUgdXBkYXRlZCBrbi0+dS5jb21wbGV0aW9uLgotCSAqLwotCXYgPSBhdG9taWNfYWRkX3JldHVybihLTl9ERUFDVElWQVRFRF9CSUFTLCAma24tPmFjdGl2ZSk7Ci0KLQlpZiAodiAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKSB7Ci0JCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwkJaWYgKGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKQogCQkJbG9ja19jb250ZW5kZWQoJmtuLT5kZXBfbWFwLCBfUkVUX0lQXyk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCX0KIAotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkgeworCS8qIGJ1dCBldmVyeW9uZSBzaG91bGQgd2FpdCBmb3IgZHJhaW5pbmcgKi8KKwl3YWl0X2V2ZW50KHJvb3QtPmRlYWN0aXZhdGVfd2FpdHEsCisJCSAgIGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSA9PSBLTl9ERUFDVElWQVRFRF9CSUFTKTsKKworCWlmIChrZXJuZnNfbG9ja2RlcChrbikpIHsKIAkJbG9ja19hY3F1aXJlZCgma24tPmRlcF9tYXAsIF9SRVRfSVBfKTsKIAkJcndzZW1fcmVsZWFzZSgma24tPmRlcF9tYXAsIDEsIF9SRVRfSVBfKTsKIAl9CisKKwlrZXJuZnNfdW5tYXBfYmluX2ZpbGUoa24pOworCisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIH0KIAogLyoqCkBAIC0yMzQsMTMgKzM5MSwxNSBAQAogCQlyZXR1cm47CiAJcm9vdCA9IGtlcm5mc19yb290KGtuKTsKICByZXBlYXQ6Ci0JLyogTW92aW5nL3JlbmFtaW5nIGlzIGFsd2F5cyBkb25lIHdoaWxlIGhvbGRpbmcgcmVmZXJlbmNlLgorCS8qCisJICogTW92aW5nL3JlbmFtaW5nIGlzIGFsd2F5cyBkb25lIHdoaWxlIGhvbGRpbmcgcmVmZXJlbmNlLgogCSAqIGtuLT5wYXJlbnQgd29uJ3QgY2hhbmdlIGJlbmVhdGggdXMuCiAJICovCiAJcGFyZW50ID0ga24tPnBhcmVudDsKIAotCVdBUk4oIShrbi0+ZmxhZ3MgJiBLRVJORlNfUkVNT1ZFRCksICJrZXJuZnM6IGZyZWUgdXNpbmcgZW50cnk6ICVzLyVzXG4iLAotCSAgICAgcGFyZW50ID8gcGFyZW50LT5uYW1lIDogIiIsIGtuLT5uYW1lKTsKKwlXQVJOX09OQ0UoYXRvbWljX3JlYWQoJmtuLT5hY3RpdmUpICE9IEtOX0RFQUNUSVZBVEVEX0JJQVMsCisJCSAgImtlcm5mc19wdXQ6ICVzLyVzOiByZWxlYXNlZCB3aXRoIGluY29ycmVjdCBhY3RpdmVfcmVmICVkXG4iLAorCQkgIHBhcmVudCA/IHBhcmVudC0+bmFtZSA6ICIiLCBrbi0+bmFtZSwgYXRvbWljX3JlYWQoJmtuLT5hY3RpdmUpKTsKIAogCWlmIChrZXJuZnNfdHlwZShrbikgPT0gS0VSTkZTX0xJTkspCiAJCWtlcm5mc19wdXQoa24tPnN5bWxpbmsudGFyZ2V0X2tuKTsKQEAgLTI4Miw4ICs0NDEsOCBAQAogCWtuID0gZGVudHJ5LT5kX2ZzZGF0YTsKIAltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCi0JLyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpCisJLyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIGRlYWN0aXZhdGVkICovCisJaWYgKCFrZXJuZnNfYWN0aXZlKGtuKSkKIAkJZ290byBvdXRfYmFkOwogCiAJLyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIG1vdmVkPyAqLwpAQCAtMzI4LDYgKzQ4NywyNCBAQAogCS5kX3JlbGVhc2UJPSBrZXJuZnNfZG9wX3JlbGVhc2UsCiB9OwogCisvKioKKyAqIGtlcm5mc19ub2RlX2Zyb21fZGVudHJ5IC0gZGV0ZXJtaW5lIGtlcm5mc19ub2RlIGFzc29jaWF0ZWQgd2l0aCBhIGRlbnRyeQorICogQGRlbnRyeTogdGhlIGRlbnRyeSBpbiBxdWVzdGlvbgorICoKKyAqIFJldHVybiB0aGUga2VybmZzX25vZGUgYXNzb2NpYXRlZCB3aXRoIEBkZW50cnkuICBJZiBAZGVudHJ5IGlzIG5vdCBhCisgKiBrZXJuZnMgb25lLCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBXaGlsZSB0aGUgcmV0dXJuZWQga2VybmZzX25vZGUgd2lsbCBzdGF5IGFjY2Vzc2libGUgYXMgbG9uZyBhcyBAZGVudHJ5CisgKiBpcyBhY2Nlc3NpYmxlLCB0aGUgcmV0dXJuZWQgbm9kZSBjYW4gYmUgaW4gYW55IHN0YXRlIGFuZCB0aGUgY2FsbGVyIGlzCisgKiBmdWxseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hhdCdzIGFjY2Vzc2libGUuCisgKi8KK3N0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX25vZGVfZnJvbV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmIChkZW50cnktPmRfc2ItPnNfb3AgPT0gJmtlcm5mc19zb3BzKQorCQlyZXR1cm4gZGVudHJ5LT5kX2ZzZGF0YTsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqX19rZXJuZnNfbmV3X25vZGUoc3RydWN0IGtlcm5mc19yb290ICpyb290LAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKIAkJCQkJICAgICB1bnNpZ25lZCBmbGFncykKQEAgLTM1MiwxMSArNTI5LDEyIEBACiAJa24tPmlubyA9IHJldDsKIAogCWF0b21pY19zZXQoJmtuLT5jb3VudCwgMSk7Ci0JYXRvbWljX3NldCgma24tPmFjdGl2ZSwgMCk7CisJYXRvbWljX3NldCgma24tPmFjdGl2ZSwgS05fREVBQ1RJVkFURURfQklBUyk7CisJUkJfQ0xFQVJfTk9ERSgma24tPnJiKTsKIAogCWtuLT5uYW1lID0gbmFtZTsKIAlrbi0+bW9kZSA9IG1vZGU7Ci0Ja24tPmZsYWdzID0gZmxhZ3MgfCBLRVJORlNfUkVNT1ZFRDsKKwlrbi0+ZmxhZ3MgPSBmbGFnczsKIAogCXJldHVybiBrbjsKIApAQCAtMzgyLDY5ICs1NjAsNDQgQEAKIH0KIAogLyoqCi0gKglrZXJuZnNfYWRkcm1fc3RhcnQgLSBwcmVwYXJlIGZvciBrZXJuZnNfbm9kZSBhZGQvcmVtb3ZlCi0gKglAYWN4dDogcG9pbnRlciB0byBrZXJuZnNfYWRkcm1fY3h0IHRvIGJlIHVzZWQKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWRkIG9yIHJlbW92ZQotICoJa2VybmZzX25vZGUuICBUaGlzIGZ1bmN0aW9uIGFjcXVpcmVzIGtlcm5mc19tdXRleC4gIEBhY3h0IGlzIHVzZWQKLSAqCXRvIGtlZXAgYW5kIHBhc3MgY29udGV4dCB0byBvdGhlciBhZGRybSBmdW5jdGlvbnMuCi0gKgotICoJTE9DS0lORzoKLSAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4gIGtlcm5mc19tdXRleCBpcyBsb2NrZWQgb24KLSAqCXJldHVybi4KLSAqLwotdm9pZCBrZXJuZnNfYWRkcm1fc3RhcnQoc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQpCi0JX19hY3F1aXJlcyhrZXJuZnNfbXV0ZXgpCi17Ci0JbWVtc2V0KGFjeHQsIDAsIHNpemVvZigqYWN4dCkpOwotCi0JbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKLX0KLQotLyoqCiAgKglrZXJuZnNfYWRkX29uZSAtIGFkZCBrZXJuZnNfbm9kZSB0byBwYXJlbnQgd2l0aG91dCB3YXJuaW5nCi0gKglAYWN4dDogYWRkcm0gY29udGV4dCB0byB1c2UKICAqCUBrbjoga2VybmZzX25vZGUgdG8gYmUgYWRkZWQKICAqCiAgKglUaGUgY2FsbGVyIG11c3QgYWxyZWFkeSBoYXZlIGluaXRpYWxpemVkIEBrbi0+cGFyZW50LiAgVGhpcwogICoJZnVuY3Rpb24gaW5jcmVtZW50cyBubGluayBvZiB0aGUgcGFyZW50J3MgaW5vZGUgaWYgQGtuIGlzIGEKICAqCWRpcmVjdG9yeSBhbmQgbGluayBpbnRvIHRoZSBjaGlsZHJlbiBsaXN0IG9mIHRoZSBwYXJlbnQuCiAgKgotICoJVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJldHdlZW4gY2FsbHMgdG8KLSAqCWtlcm5mc19hZGRybV9zdGFydCgpIGFuZCBrZXJuZnNfYWRkcm1fZmluaXNoKCkgYW5kIHNob3VsZCBiZSBwYXNzZWQKLSAqCXRoZSBzYW1lIEBhY3h0IGFzIHBhc3NlZCB0byBrZXJuZnNfYWRkcm1fc3RhcnQoKS4KLSAqCi0gKglMT0NLSU5HOgotICoJRGV0ZXJtaW5lZCBieSBrZXJuZnNfYWRkcm1fc3RhcnQoKS4KLSAqCiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCAtRUVYSVNUIGlmIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUgYWxyZWFkeQogICoJZXhpc3RzLgogICovCi1pbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQsIHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCitpbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19ub2RlICprbikKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCA9IGtuLT5wYXJlbnQ7Ci0JYm9vbCBoYXNfbnMgPSBrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpOwogCXN0cnVjdCBrZXJuZnNfaWF0dHJzICpwc19pYXR0cjsKKwlib29sIGhhc19uczsKIAlpbnQgcmV0OwogCi0JaWYgKGhhc19ucyAhPSAoYm9vbClrbi0+bnMpIHsKLQkJV0FSTigxLCBLRVJOX1dBUk5JTkcgImtlcm5mczogbnMgJXMgaW4gJyVzJyBmb3IgJyVzJ1xuIiwKLQkJICAgICBoYXNfbnMgPyAicmVxdWlyZWQiIDogImludmFsaWQiLCBwYXJlbnQtPm5hbWUsIGtuLT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisKKwlyZXQgPSAtRUlOVkFMOworCWhhc19ucyA9IGtlcm5mc19uc19lbmFibGVkKHBhcmVudCk7CisJaWYgKFdBUk4oaGFzX25zICE9IChib29sKWtuLT5ucywgS0VSTl9XQVJOSU5HICJrZXJuZnM6IG5zICVzIGluICclcycgZm9yICclcydcbiIsCisJCSBoYXNfbnMgPyAicmVxdWlyZWQiIDogImludmFsaWQiLCBwYXJlbnQtPm5hbWUsIGtuLT5uYW1lKSkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJaWYgKGtlcm5mc190eXBlKHBhcmVudCkgIT0gS0VSTkZTX0RJUikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKIAotCWlmIChwYXJlbnQtPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpCi0JCXJldHVybiAtRU5PRU5UOworCXJldCA9IC1FTk9FTlQ7CisJaWYgKChwYXJlbnQtPmZsYWdzICYgS0VSTkZTX0FDVElWQVRFRCkgJiYgIWtlcm5mc19hY3RpdmUocGFyZW50KSkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJa24tPmhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtuLT5uYW1lLCBrbi0+bnMpOwogCiAJcmV0ID0ga2VybmZzX2xpbmtfc2libGluZyhrbik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJLyogVXBkYXRlIHRpbWVzdGFtcHMgb24gdGhlIHBhcmVudCAqLwogCXBzX2lhdHRyID0gcGFyZW50LT5pYXR0cjsKQEAgLTQ1Myw4MiArNjA2LDIyIEBACiAJCXBzX2lhdHRycy0+aWFfY3RpbWUgPSBwc19pYXR0cnMtPmlhX210aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KIAotCS8qIE1hcmsgdGhlIGVudHJ5IGFkZGVkIGludG8gZGlyZWN0b3J5IHRyZWUgKi8KLQlrbi0+ZmxhZ3MgJj0gfktFUk5GU19SRU1PVkVEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoJa2VybmZzX3JlbW92ZV9vbmUgLSByZW1vdmUga2VybmZzX25vZGUgZnJvbSBwYXJlbnQKLSAqCUBhY3h0OiBhZGRybSBjb250ZXh0IHRvIHVzZQotICoJQGtuOiBrZXJuZnNfbm9kZSB0byBiZSByZW1vdmVkCi0gKgotICoJTWFyayBAa24gcmVtb3ZlZCBhbmQgZHJvcCBubGluayBvZiBwYXJlbnQgaW5vZGUgaWYgQGtuIGlzIGEKLSAqCWRpcmVjdG9yeS4gIEBrbiBpcyB1bmxpbmtlZCBmcm9tIHRoZSBjaGlsZHJlbiBsaXN0LgotICoKLSAqCVRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZXR3ZWVuIGNhbGxzIHRvCi0gKglrZXJuZnNfYWRkcm1fc3RhcnQoKSBhbmQga2VybmZzX2FkZHJtX2ZpbmlzaCgpIGFuZCBzaG91bGQgYmUKLSAqCXBhc3NlZCB0aGUgc2FtZSBAYWN4dCBhcyBwYXNzZWQgdG8ga2VybmZzX2FkZHJtX3N0YXJ0KCkuCi0gKgotICoJTE9DS0lORzoKLSAqCURldGVybWluZWQgYnkga2VybmZzX2FkZHJtX3N0YXJ0KCkuCi0gKi8KLXN0YXRpYyB2b2lkIGtlcm5mc19yZW1vdmVfb25lKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LAotCQkJICAgICAgc3RydWN0IGtlcm5mc19ub2RlICprbikKLXsKLQlzdHJ1Y3Qga2VybmZzX2lhdHRycyAqcHNfaWF0dHI7Ci0KLQkvKgotCSAqIFJlbW92YWwgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBub2RlLiAgT25seSB0aGUKLQkgKiBmaXJzdCBpbnZvY2F0aW9uIGlzIGVmZmVjdGl2ZSBhbmQgcHV0cyB0aGUgYmFzZSByZWYuCi0JICovCi0JaWYgKGtuLT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKQotCQlyZXR1cm47Ci0KLQlpZiAoa24tPnBhcmVudCkgewotCQlrZXJuZnNfdW5saW5rX3NpYmxpbmcoa24pOwotCi0JCS8qIFVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KLQkJcHNfaWF0dHIgPSBrbi0+cGFyZW50LT5pYXR0cjsKLQkJaWYgKHBzX2lhdHRyKSB7Ci0JCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCX0KLQl9Ci0KLQlrbi0+ZmxhZ3MgfD0gS0VSTkZTX1JFTU9WRUQ7Ci0Ja24tPnUucmVtb3ZlZF9saXN0ID0gYWN4dC0+cmVtb3ZlZDsKLQlhY3h0LT5yZW1vdmVkID0ga247Ci19Ci0KLS8qKgotICoJa2VybmZzX2FkZHJtX2ZpbmlzaCAtIGZpbmlzaCB1cCBrZXJuZnNfbm9kZSBhZGQvcmVtb3ZlCi0gKglAYWN4dDogYWRkcm0gY29udGV4dCB0byBmaW5pc2ggdXAKLSAqCi0gKglGaW5pc2ggdXAga2VybmZzX25vZGUgYWRkL3JlbW92ZS4gIFJlc291cmNlcyBhY3F1aXJlZCBieQotICoJa2VybmZzX2FkZHJtX3N0YXJ0KCkgYXJlIHJlbGVhc2VkIGFuZCByZW1vdmVkIGtlcm5mc19ub2RlcyBhcmUKLSAqCWNsZWFuZWQgdXAuCi0gKgotICoJTE9DS0lORzoKLSAqCWtlcm5mc19tdXRleCBpcyByZWxlYXNlZC4KLSAqLwotdm9pZCBrZXJuZnNfYWRkcm1fZmluaXNoKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0KQotCV9fcmVsZWFzZXMoa2VybmZzX211dGV4KQotewotCS8qIHJlbGVhc2UgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IGtlcm5mc19hZGRybV9zdGFydCgpICovCiAJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCi0JLyoga2lsbCByZW1vdmVkIGtlcm5mc19ub2RlcyAqLwotCXdoaWxlIChhY3h0LT5yZW1vdmVkKSB7Ci0JCXN0cnVjdCBrZXJuZnNfbm9kZSAqa24gPSBhY3h0LT5yZW1vdmVkOworCS8qCisJICogQWN0aXZhdGUgdGhlIG5ldyBub2RlIHVubGVzcyBDUkVBVEVfREVBQ1RJVkFURUQgaXMgcmVxdWVzdGVkLgorCSAqIElmIG5vdCBhY3RpdmF0ZWQgaGVyZSwgdGhlIGtlcm5mcyB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvcgorCSAqIGFjdGl2YXRpbmcgdGhlIG5vZGUgd2l0aCBrZXJuZnNfYWN0aXZhdGUoKS4gIEEgbm9kZSB3aGljaCBoYXNuJ3QKKwkgKiBiZWVuIGFjdGl2YXRlZCBpcyBub3QgdmlzaWJsZSB0byB1c2VybGFuZCBhbmQgaXRzIHJlbW92YWwgd29uJ3QKKwkgKiB0cmlnZ2VyIGRlYWN0aXZhdGlvbi4KKwkgKi8KKwlpZiAoIShrZXJuZnNfcm9vdChrbiktPmZsYWdzICYgS0VSTkZTX1JPT1RfQ1JFQVRFX0RFQUNUSVZBVEVEKSkKKwkJa2VybmZzX2FjdGl2YXRlKGtuKTsKKwlyZXR1cm4gMDsKIAotCQlhY3h0LT5yZW1vdmVkID0ga24tPnUucmVtb3ZlZF9saXN0OwotCi0JCWtlcm5mc19kZWFjdGl2YXRlKGtuKTsKLQkJa2VybmZzX3VubWFwX2Jpbl9maWxlKGtuKTsKLQkJa2VybmZzX3B1dChrbik7Ci0JfQorb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC01OTksMTMgKzY5MiwxNSBAQAogCiAvKioKICAqIGtlcm5mc19jcmVhdGVfcm9vdCAtIGNyZWF0ZSBhIG5ldyBrZXJuZnMgaGllcmFyY2h5Ci0gKiBAa2RvcHM6IG9wdGlvbmFsIGRpcmVjdG9yeSBzeXNjYWxsIG9wZXJhdGlvbnMgZm9yIHRoZSBoaWVyYXJjaHkKKyAqIEBzY29wczogb3B0aW9uYWwgc3lzY2FsbCBvcGVyYXRpb25zIGZvciB0aGUgaGllcmFyY2h5CisgKiBAZmxhZ3M6IEtFUk5GU19ST09UXyogZmxhZ3MKICAqIEBwcml2OiBvcGFxdWUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBkaXJlY3RvcnkKICAqCiAgKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBuZXcgaGllcmFyY2h5IG9uIHN1Y2Nlc3MsIEVSUl9QVFIoKSB2YWx1ZSBvbgogICogZmFpbHVyZS4KICAqLwotc3RydWN0IGtlcm5mc19yb290ICprZXJuZnNfY3JlYXRlX3Jvb3Qoc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcywgdm9pZCAqcHJpdikKK3N0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGtlcm5mc19yb290ICpyb290OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa247CkBAIC02MjQsMTIgKzcxOSwxNiBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlrbi0+ZmxhZ3MgJj0gfktFUk5GU19SRU1PVkVEOwogCWtuLT5wcml2ID0gcHJpdjsKIAlrbi0+ZGlyLnJvb3QgPSByb290OwogCi0Jcm9vdC0+ZGlyX29wcyA9IGtkb3BzOworCXJvb3QtPnN5c2NhbGxfb3BzID0gc2NvcHM7CisJcm9vdC0+ZmxhZ3MgPSBmbGFnczsKIAlyb290LT5rbiA9IGtuOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJvb3QtPmRlYWN0aXZhdGVfd2FpdHEpOworCisJaWYgKCEocm9vdC0+ZmxhZ3MgJiBLRVJORlNfUk9PVF9DUkVBVEVfREVBQ1RJVkFURUQpKQorCQlrZXJuZnNfYWN0aXZhdGUoa24pOwogCiAJcmV0dXJuIHJvb3Q7CiB9CkBAIC02NjAsNyArNzU5LDYgQEAKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKIAkJCQkJIHZvaWQgKnByaXYsIGNvbnN0IHZvaWQgKm5zKQogewotCXN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0IGFjeHQ7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbjsKIAlpbnQgcmM7CiAKQEAgLTY3NCwxMCArNzcyLDcgQEAKIAlrbi0+cHJpdiA9IHByaXY7CiAKIAkvKiBsaW5rIGluICovCi0Ja2VybmZzX2FkZHJtX3N0YXJ0KCZhY3h0KTsKLQlyYyA9IGtlcm5mc19hZGRfb25lKCZhY3h0LCBrbik7Ci0Ja2VybmZzX2FkZHJtX2ZpbmlzaCgmYWN4dCk7Ci0KKwlyYyA9IGtlcm5mc19hZGRfb25lKGtuKTsKIAlpZiAoIXJjKQogCQlyZXR1cm4ga247CiAKQEAgLTcwMyw3ICs3OTgsNyBAQAogCWtuID0ga2VybmZzX2ZpbmRfbnMocGFyZW50LCBkZW50cnktPmRfbmFtZS5uYW1lLCBucyk7CiAKIAkvKiBubyBzdWNoIGVudHJ5ICovCi0JaWYgKCFrbikgeworCWlmICgha24gfHwgIWtlcm5mc19hY3RpdmUoa24pKSB7CiAJCXJldCA9IE5VTEw7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC03MjgsMjMgKzgyMywzNyBAQAogCQkJICAgIHVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCA9IGRpci0+aV9wcml2YXRlOwotCXN0cnVjdCBrZXJuZnNfZGlyX29wcyAqa2RvcHMgPSBrZXJuZnNfcm9vdChwYXJlbnQpLT5kaXJfb3BzOworCXN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzID0ga2VybmZzX3Jvb3QocGFyZW50KS0+c3lzY2FsbF9vcHM7CisJaW50IHJldDsKIAotCWlmICgha2RvcHMgfHwgIWtkb3BzLT5ta2RpcikKKwlpZiAoIXNjb3BzIHx8ICFzY29wcy0+bWtkaXIpCiAJCXJldHVybiAtRVBFUk07CiAKLQlyZXR1cm4ga2RvcHMtPm1rZGlyKHBhcmVudCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSk7CisJaWYgKCFrZXJuZnNfZ2V0X2FjdGl2ZShwYXJlbnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHNjb3BzLT5ta2RpcihwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUpOworCisJa2VybmZzX3B1dF9hY3RpdmUocGFyZW50KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGtlcm5mc19pb3Bfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuICA9IGRlbnRyeS0+ZF9mc2RhdGE7Ci0Jc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcyA9IGtlcm5mc19yb290KGtuKS0+ZGlyX29wczsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IGtlcm5mc19yb290KGtuKS0+c3lzY2FsbF9vcHM7CisJaW50IHJldDsKIAotCWlmICgha2RvcHMgfHwgIWtkb3BzLT5ybWRpcikKKwlpZiAoIXNjb3BzIHx8ICFzY29wcy0+cm1kaXIpCiAJCXJldHVybiAtRVBFUk07CiAKLQlyZXR1cm4ga2RvcHMtPnJtZGlyKGtuKTsKKwlpZiAoIWtlcm5mc19nZXRfYWN0aXZlKGtuKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzY29wcy0+cm1kaXIoa24pOworCisJa2VybmZzX3B1dF9hY3RpdmUoa24pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQga2VybmZzX2lvcF9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LApAQCAtNzUyLDEyICs4NjEsMjUgQEAKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuICA9IG9sZF9kZW50cnktPmRfZnNkYXRhOwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCA9IG5ld19kaXItPmlfcHJpdmF0ZTsKLQlzdHJ1Y3Qga2VybmZzX2Rpcl9vcHMgKmtkb3BzID0ga2VybmZzX3Jvb3Qoa24pLT5kaXJfb3BzOworCXN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzID0ga2VybmZzX3Jvb3Qoa24pLT5zeXNjYWxsX29wczsKKwlpbnQgcmV0OwogCi0JaWYgKCFrZG9wcyB8fCAha2RvcHMtPnJlbmFtZSkKKwlpZiAoIXNjb3BzIHx8ICFzY29wcy0+cmVuYW1lKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcmV0dXJuIGtkb3BzLT5yZW5hbWUoa24sIG5ld19wYXJlbnQsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpZiAoIWtlcm5mc19nZXRfYWN0aXZlKGtuKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWtlcm5mc19nZXRfYWN0aXZlKG5ld19wYXJlbnQpKSB7CisJCWtlcm5mc19wdXRfYWN0aXZlKGtuKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gc2NvcHMtPnJlbmFtZShrbiwgbmV3X3BhcmVudCwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJa2VybmZzX3B1dF9hY3RpdmUobmV3X3BhcmVudCk7CisJa2VybmZzX3B1dF9hY3RpdmUoa24pOworCXJldHVybiByZXQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGtlcm5mc19kaXJfaW9wcyA9IHsKQEAgLTgzMCwyMyArOTUyLDEwNCBAQAogCXJldHVybiBwb3MtPnBhcmVudDsKIH0KIAotc3RhdGljIHZvaWQgX19rZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LAotCQkJICAgIHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCisvKioKKyAqIGtlcm5mc19hY3RpdmF0ZSAtIGFjdGl2YXRlIGEgbm9kZSB3aGljaCBzdGFydGVkIGRlYWN0aXZhdGVkCisgKiBAa246IGtlcm5mc19ub2RlIHdob3NlIHN1YnRyZWUgaXMgdG8gYmUgYWN0aXZhdGVkCisgKgorICogSWYgdGhlIHJvb3QgaGFzIEtFUk5GU19ST09UX0NSRUFURV9ERUFDVElWQVRFRCBzZXQsIGEgbmV3bHkgY3JlYXRlZCBub2RlCisgKiBuZWVkcyB0byBiZSBleHBsaWNpdGx5IGFjdGl2YXRlZC4gIEEgbm9kZSB3aGljaCBoYXNuJ3QgYmVlbiBhY3RpdmF0ZWQKKyAqIGlzbid0IHZpc2libGUgdG8gdXNlcmxhbmQgYW5kIGRlYWN0aXZhdGlvbiBpcyBza2lwcGVkIGR1cmluZyBpdHMKKyAqIHJlbW92YWwuICBUaGlzIGlzIHVzZWZ1bCB0byBjb25zdHJ1Y3QgYXRvbWljIGluaXQgc2VxdWVuY2VzIHdoZXJlCisgKiBjcmVhdGlvbiBvZiBtdWx0aXBsZSBub2RlcyBzaG91bGQgZWl0aGVyIHN1Y2NlZWQgb3IgZmFpbCBhdG9taWNhbGx5LgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkCisgKiBhZnRlciBrZXJuZnNfcmVtb3ZlKigpIGlzIGludm9rZWQgb24gQGtuLgorICovCit2b2lkIGtlcm5mc19hY3RpdmF0ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogewotCXN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLCAqbmV4dDsKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBvczsKIAotCWlmICgha24pCisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKKworCXBvcyA9IE5VTEw7CisJd2hpbGUgKChwb3MgPSBrZXJuZnNfbmV4dF9kZXNjZW5kYW50X3Bvc3QocG9zLCBrbikpKSB7CisJCWlmICghcG9zIHx8IChwb3MtPmZsYWdzICYgS0VSTkZTX0FDVElWQVRFRCkpCisJCQljb250aW51ZTsKKworCQlXQVJOX09OX09OQ0UocG9zLT5wYXJlbnQgJiYgUkJfRU1QVFlfTk9ERSgmcG9zLT5yYikpOworCQlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJnBvcy0+YWN0aXZlKSAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKTsKKworCQlhdG9taWNfc3ViKEtOX0RFQUNUSVZBVEVEX0JJQVMsICZwb3MtPmFjdGl2ZSk7CisJCXBvcy0+ZmxhZ3MgfD0gS0VSTkZTX0FDVElWQVRFRDsKKwl9CisKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa2VybmZzX3JlbW92ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCXN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgma2VybmZzX211dGV4KTsKKworCS8qCisJICogU2hvcnQtY2lyY3VpdCBpZiBub24tcm9vdCBAa24gaGFzIGFscmVhZHkgZmluaXNoZWQgcmVtb3ZhbC4KKwkgKiBUaGlzIGlzIGZvciBrZXJuZnNfcmVtb3ZlX3NlbGYoKSB3aGljaCBwbGF5cyB3aXRoIGFjdGl2ZSByZWYKKwkgKiBhZnRlciByZW1vdmFsLgorCSAqLworCWlmICgha24gfHwgKGtuLT5wYXJlbnQgJiYgUkJfRU1QVFlfTk9ERSgma24tPnJiKSkpCiAJCXJldHVybjsKIAogCXByX2RlYnVnKCJrZXJuZnMgJXM6IHJlbW92aW5nXG4iLCBrbi0+bmFtZSk7CiAKLQluZXh0ID0gTlVMTDsKKwkvKiBwcmV2ZW50IGFueSBuZXcgdXNhZ2UgdW5kZXIgQGtuIGJ5IGRlYWN0aXZhdGluZyBhbGwgbm9kZXMgKi8KKwlwb3MgPSBOVUxMOworCXdoaWxlICgocG9zID0ga2VybmZzX25leHRfZGVzY2VuZGFudF9wb3N0KHBvcywga24pKSkKKwkJaWYgKGtlcm5mc19hY3RpdmUocG9zKSkKKwkJCWF0b21pY19hZGQoS05fREVBQ1RJVkFURURfQklBUywgJnBvcy0+YWN0aXZlKTsKKworCS8qIGRlYWN0aXZhdGUgYW5kIHVubGluayB0aGUgc3VidHJlZSBub2RlLWJ5LW5vZGUgKi8KIAlkbyB7Ci0JCXBvcyA9IG5leHQ7Ci0JCW5leHQgPSBrZXJuZnNfbmV4dF9kZXNjZW5kYW50X3Bvc3QocG9zLCBrbik7Ci0JCWlmIChwb3MpCi0JCQlrZXJuZnNfcmVtb3ZlX29uZShhY3h0LCBwb3MpOwotCX0gd2hpbGUgKG5leHQpOworCQlwb3MgPSBrZXJuZnNfbGVmdG1vc3RfZGVzY2VuZGFudChrbik7CisKKwkJLyoKKwkJICoga2VybmZzX2RyYWluKCkgZHJvcHMga2VybmZzX211dGV4IHRlbXBvcmFyaWx5IGFuZCBAcG9zJ3MKKwkJICogYmFzZSByZWYgY291bGQgaGF2ZSBiZWVuIHB1dCBieSBzb21lb25lIGVsc2UgYnkgdGhlIHRpbWUKKwkJICogdGhlIGZ1bmN0aW9uIHJldHVybnMuICBNYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBhd2F5CisJCSAqIHVuZGVybmVhdGggdXMuCisJCSAqLworCQlrZXJuZnNfZ2V0KHBvcyk7CisKKwkJLyoKKwkJICogRHJhaW4gaWZmIEBrbiB3YXMgYWN0aXZhdGVkLiAgVGhpcyBhdm9pZHMgZHJhaW5pbmcgYW5kCisJCSAqIGl0cyBsb2NrZGVwIGFubm90YXRpb25zIGZvciBub2RlcyB3aGljaCBoYXZlIG5ldmVyIGJlZW4KKwkJICogYWN0aXZhdGVkIGFuZCBhbGxvd3MgZW1iZWRkaW5nIGtlcm5mc19yZW1vdmUoKSBpbiBjcmVhdGUKKwkJICogZXJyb3IgcGF0aHMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBkcmFpbmluZy4KKwkJICovCisJCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfQUNUSVZBVEVEKQorCQkJa2VybmZzX2RyYWluKHBvcyk7CisJCWVsc2UKKwkJCVdBUk5fT05fT05DRShhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgIT0gS05fREVBQ1RJVkFURURfQklBUyk7CisKKwkJLyoKKwkJICoga2VybmZzX3VubGlua19zaWJsaW5nKCkgc3VjY2VlZHMgb25jZSBwZXIgbm9kZS4gIFVzZSBpdAorCQkgKiB0byBkZWNpZGUgd2hvJ3MgcmVzcG9uc2libGUgZm9yIGNsZWFudXBzLgorCQkgKi8KKwkJaWYgKCFwb3MtPnBhcmVudCB8fCBrZXJuZnNfdW5saW5rX3NpYmxpbmcocG9zKSkgeworCQkJc3RydWN0IGtlcm5mc19pYXR0cnMgKnBzX2lhdHRyID0KKwkJCQlwb3MtPnBhcmVudCA/IHBvcy0+cGFyZW50LT5pYXR0ciA6IE5VTEw7CisKKwkJCS8qIHVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KKwkJCWlmIChwc19pYXR0cikgeworCQkJCXBzX2lhdHRyLT5pYV9pYXR0ci5pYV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCQl9CisKKwkJCWtlcm5mc19wdXQocG9zKTsKKwkJfQorCisJCWtlcm5mc19wdXQocG9zKTsKKwl9IHdoaWxlIChwb3MgIT0ga24pOwogfQogCiAvKioKQEAgLTg1NywxMSArMTA2MCwxNDAgQEAKICAqLwogdm9pZCBrZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7Ci0Jc3RydWN0IGtlcm5mc19hZGRybV9jeHQgYWN4dDsKKwltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOworCV9fa2VybmZzX3JlbW92ZShrbik7CisJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworfQogCi0Ja2VybmZzX2FkZHJtX3N0YXJ0KCZhY3h0KTsKLQlfX2tlcm5mc19yZW1vdmUoJmFjeHQsIGtuKTsKLQlrZXJuZnNfYWRkcm1fZmluaXNoKCZhY3h0KTsKKy8qKgorICoga2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uIC0gYnJlYWsgb3V0IG9mIGFjdGl2ZSBwcm90ZWN0aW9uCisgKiBAa246IHRoZSBzZWxmIGtlcm5mc19ub2RlCisgKgorICogVGhlIGNhbGxlciBtdXN0IGJlIHJ1bm5pbmcgb2ZmIG9mIGEga2VybmZzIG9wZXJhdGlvbiB3aGljaCBpcyBpbnZva2VkCisgKiB3aXRoIGFuIGFjdGl2ZSByZWZlcmVuY2UgLSBlLmcuIG9uZSBvZiBrZXJuZnNfb3BzLiAgRWFjaCBpbnZvY2F0aW9uIG9mCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYWxzbyBiZSBtYXRjaGVkIHdpdGggYW4gaW52b2NhdGlvbiBvZgorICoga2VybmZzX3VuYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIHRoZSBhY3RpdmUgcmVmZXJlbmNlIG9mIEBrbiB0aGUgY2FsbGVyIGlzCisgKiBob2xkaW5nLiAgT25jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQGtuIG1heSBiZSByZW1vdmVkIGF0IGFueSBwb2ludAorICogYW5kIHRoZSBjYWxsZXIgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBvYmplY3RzIGl0CisgKiBkZXJlZmVyZW5jZXMgYXJlIGFjY2Vzc2libGUuCisgKi8KK3ZvaWQga2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJLyoKKwkgKiBUYWtlIG91dCBvdXJzZWxmIG91dCBvZiB0aGUgYWN0aXZlIHJlZiBkZXBlbmRlbmN5IGNoYWluLiAgSWYKKwkgKiB3ZSdyZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgcmVmLCBsb2NrZGVwIHdpbGwgY29tcGxhaW4uCisJICovCisJa2VybmZzX3B1dF9hY3RpdmUoa24pOworfQorCisvKioKKyAqIGtlcm5mc191bmJyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uIC0gdW5kbyBrZXJuZnNfYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKQorICogQGtuOiB0aGUgc2VsZiBrZXJuZnNfbm9kZQorICoKKyAqIElmIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpIHdhcyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQorICogaW52b2tlZCBiZWZvcmUgZmluaXNoaW5nIHRoZSBrZXJuZnMgb3BlcmF0aW9uLiAgTm90ZSB0aGF0IHdoaWxlIHRoaXMKKyAqIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBhY3RpdmUgcmVmZXJlbmNlLCBpdCBkb2Vzbid0IGFuZCBjYW4ndCBhY3R1YWxseQorICogcmVzdG9yZSB0aGUgYWN0aXZlIHByb3RlY3Rpb24gLSBAa24gbWF5IGFscmVhZHkgb3IgYmUgaW4gdGhlIHByb2Nlc3Mgb2YKKyAqIGJlaW5nIHJlbW92ZWQuICBPbmNlIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpIGlzIGludm9rZWQsIHRoYXQKKyAqIHByb3RlY3Rpb24gaXMgaXJyZXZlcnNpYmx5IGdvbmUgZm9yIHRoZSBrZXJuZnMgb3BlcmF0aW9uIGluc3RhbmNlLgorICoKKyAqIFdoaWxlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhdCBhbnkgcG9pbnQgYWZ0ZXIKKyAqIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpIGlzIGludm9rZWQsIGl0cyBtb3N0IHVzZWZ1bCBsb2NhdGlvbgorICogd291bGQgYmUgcmlnaHQgYmVmb3JlIHRoZSBlbmNsb3Npbmcga2VybmZzIG9wZXJhdGlvbiByZXR1cm5zLgorICovCit2b2lkIGtlcm5mc191bmJyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJLyoKKwkgKiBAa24tPmFjdGl2ZSBjb3VsZCBiZSBpbiBhbnkgc3RhdGU7IGhvd2V2ZXIsIHRoZSBpbmNyZW1lbnQgd2UgZG8KKwkgKiBoZXJlIHdpbGwgYmUgdW5kb25lIGFzIHNvb24gYXMgdGhlIGVuY2xvc2luZyBrZXJuZnMgb3BlcmF0aW9uCisJICogZmluaXNoZXMgYW5kIHRoaXMgdGVtcG9yYXJ5IGJ1bXAgY2FuJ3QgYnJlYWsgYW55dGhpbmcuICBJZiBAa24KKwkgKiBpcyBhbGl2ZSwgbm90aGluZyBjaGFuZ2VzLiAgSWYgQGtuIGlzIGJlaW5nIGRlYWN0aXZhdGVkLCB0aGUKKwkgKiBzb29uLXRvLWZvbGxvdyBwdXQgd2lsbCBlaXRoZXIgZmluaXNoIGRlYWN0aXZhdGlvbiBvciByZXN0b3JlCisJICogZGVhY3RpdmF0ZWQgc3RhdGUuICBJZiBAa24gaXMgYWxyZWFkeSByZW1vdmVkLCB0aGUgdGVtcG9yYXJ5CisJICogYnVtcCBpcyBndWFyYW50ZWVkIHRvIGJlIGdvbmUgYmVmb3JlIEBrbiBpcyByZWxlYXNlZC4KKwkgKi8KKwlhdG9taWNfaW5jKCZrbi0+YWN0aXZlKTsKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKQorCQlyd3NlbV9hY3F1aXJlKCZrbi0+ZGVwX21hcCwgMCwgMSwgX1JFVF9JUF8pOworfQorCisvKioKKyAqIGtlcm5mc19yZW1vdmVfc2VsZiAtIHJlbW92ZSBhIGtlcm5mc19ub2RlIGZyb20gaXRzIG93biBtZXRob2QKKyAqIEBrbjogdGhlIHNlbGYga2VybmZzX25vZGUgdG8gcmVtb3ZlCisgKgorICogVGhlIGNhbGxlciBtdXN0IGJlIHJ1bm5pbmcgb2ZmIG9mIGEga2VybmZzIG9wZXJhdGlvbiB3aGljaCBpcyBpbnZva2VkCisgKiB3aXRoIGFuIGFjdGl2ZSByZWZlcmVuY2UgLSBlLmcuIG9uZSBvZiBrZXJuZnNfb3BzLiAgVGhpcyBjYW4gYmUgdXNlZCB0bworICogaW1wbGVtZW50IGEgZmlsZSBvcGVyYXRpb24gd2hpY2ggZGVsZXRlcyBpdHNlbGYuCisgKgorICogRm9yIGV4YW1wbGUsIHRoZSAiZGVsZXRlIiBmaWxlIGZvciBhIHN5c2ZzIGRldmljZSBkaXJlY3RvcnkgY2FuIGJlCisgKiBpbXBsZW1lbnRlZCBieSBpbnZva2luZyBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBvbiB0aGUgImRlbGV0ZSIgZmlsZQorICogaXRzZWxmLiAgVGhpcyBmdW5jdGlvbiBicmVha3MgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kgb2YgdHJ5aW5nIHRvCisgKiBkZWFjdGl2YXRlIHNlbGYgd2hpbGUgaG9sZGluZyBhbiBhY3RpdmUgcmVmIGl0c2VsZi4gIEl0IGlzbid0IG5lY2Vzc2FyeQorICogdG8gbW9kaWZ5IHRoZSB1c3VhbCByZW1vdmFsIHBhdGggdG8gdXNlIGtlcm5mc19yZW1vdmVfc2VsZigpLiAgVGhlCisgKiAiZGVsZXRlIiBpbXBsZW1lbnRhdGlvbiBjYW4gc2ltcGx5IGludm9rZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBvbiBzZWxmCisgKiBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSB1c3VhbCByZW1vdmFsIHBhdGguICBrZXJuZnMgd2lsbCBpZ25vcmUgbGF0ZXIKKyAqIGtlcm5mc19yZW1vdmUoKSBvbiBzZWxmLgorICoKKyAqIGtlcm5mc19yZW1vdmVfc2VsZigpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5IG9uIHRoZQorICogc2FtZSBrZXJuZnNfbm9kZS4gIE9ubHkgdGhlIGZpcnN0IG9uZSBhY3R1YWxseSBwZXJmb3JtcyByZW1vdmFsIGFuZAorICogcmV0dXJucyAldHJ1ZS4gIEFsbCBvdGhlcnMgd2lsbCB3YWl0IHVudGlsIHRoZSBrZXJuZnMgb3BlcmF0aW9uIHdoaWNoCisgKiB3b24gc2VsZi1yZW1vdmFsIGZpbmlzaGVzIGFuZCByZXR1cm4gJWZhbHNlLiAgTm90ZSB0aGF0IHRoZSBsb3NlcnMgd2FpdAorICogZm9yIHRoZSBjb21wbGV0aW9uIG9mIG5vdCBvbmx5IHRoZSB3aW5uaW5nIGtlcm5mc19yZW1vdmVfc2VsZigpIGJ1dCBhbHNvCisgKiB0aGUgd2hvbGUga2VybmZzX29wcyB3aGljaCB3b24gdGhlIGFyYml0cmF0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZCB0bworICogZ3VhcmFudGVlLCBmb3IgZXhhbXBsZSwgYWxsIGNvbmN1cnJlbnQgd3JpdGVzIHRvIGEgImRlbGV0ZSIgZmlsZSB0bworICogZmluaXNoIG9ubHkgYWZ0ZXIgdGhlIHdob2xlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAqLworYm9vbCBrZXJuZnNfcmVtb3ZlX3NlbGYoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwlib29sIHJldDsKKworCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisJa2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKGtuKTsKKworCS8qCisJICogU1VJQ0lEQUwgaXMgdXNlZCB0byBhcmJpdHJhdGUgYW1vbmcgY29tcGV0aW5nIGludm9jYXRpb25zLiAgT25seQorCSAqIHRoZSBmaXJzdCBvbmUgd2lsbCBhY3R1YWxseSBwZXJmb3JtIHJlbW92YWwuICBXaGVuIHRoZSByZW1vdmFsCisJICogaXMgY29tcGxldGUsIFNVSUNJREVEIGlzIHNldCBhbmQgdGhlIGFjdGl2ZSByZWYgaXMgcmVzdG9yZWQKKwkgKiB3aGlsZSBob2xkaW5nIGtlcm5mc19tdXRleC4gIFRoZSBvbmVzIHdoaWNoIGxvc3QgYXJiaXRyYXRpb24KKwkgKiB3YWl0cyBmb3IgU1VJQ0RFRCAmJiBkcmFpbmVkIHdoaWNoIGNhbiBoYXBwZW4gb25seSBhZnRlciB0aGUKKwkgKiBlbmNsb3Npbmcga2VybmZzIG9wZXJhdGlvbiB3aGljaCBleGVjdXRlZCB0aGUgd2lubmluZyBpbnN0YW5jZQorCSAqIG9mIGtlcm5mc19yZW1vdmVfc2VsZigpIGZpbmlzaGVkLgorCSAqLworCWlmICghKGtuLT5mbGFncyAmIEtFUk5GU19TVUlDSURBTCkpIHsKKwkJa24tPmZsYWdzIHw9IEtFUk5GU19TVUlDSURBTDsKKwkJX19rZXJuZnNfcmVtb3ZlKGtuKTsKKwkJa24tPmZsYWdzIHw9IEtFUk5GU19TVUlDSURFRDsKKwkJcmV0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdHEgPSAma2VybmZzX3Jvb3Qoa24pLT5kZWFjdGl2YXRlX3dhaXRxOworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQl3aGlsZSAodHJ1ZSkgeworCQkJcHJlcGFyZV90b193YWl0KHdhaXRxLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCQlpZiAoKGtuLT5mbGFncyAmIEtFUk5GU19TVUlDSURFRCkgJiYKKwkJCSAgICBhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgPT0gS05fREVBQ1RJVkFURURfQklBUykKKwkJCQlicmVhazsKKworCQkJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworCQkJc2NoZWR1bGUoKTsKKwkJCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisJCX0KKwkJZmluaXNoX3dhaXQod2FpdHEsICZ3YWl0KTsKKwkJV0FSTl9PTl9PTkNFKCFSQl9FTVBUWV9OT0RFKCZrbi0+cmIpKTsKKwkJcmV0ID0gZmFsc2U7CisJfQorCisJLyoKKwkgKiBUaGlzIG11c3QgYmUgZG9uZSB3aGlsZSBob2xkaW5nIGtlcm5mc19tdXRleDsgb3RoZXJ3aXNlLCB3YWl0aW5nCisJICogZm9yIFNVSUNJREVEICYmIGRlYWN0aXZhdGVkIGNvdWxkIGZpbmlzaCBwcmVtYXR1cmVseS4KKwkgKi8KKwlrZXJuZnNfdW5icmVha19hY3RpdmVfcHJvdGVjdGlvbihrbik7CisKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC04NzYsNyArMTIwOCw2IEBACiBpbnQga2VybmZzX3JlbW92ZV9ieV9uYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICBjb25zdCB2b2lkICpucykKIHsKLQlzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCBhY3h0OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa247CiAKIAlpZiAoIXBhcmVudCkgewpAQCAtODg1LDEzICsxMjE2LDEzIEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7CisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIAogCWtuID0ga2VybmZzX2ZpbmRfbnMocGFyZW50LCBuYW1lLCBucyk7CiAJaWYgKGtuKQotCQlfX2tlcm5mc19yZW1vdmUoJmFjeHQsIGtuKTsKKwkJX19rZXJuZnNfcmVtb3ZlKGtuKTsKIAotCWtlcm5mc19hZGRybV9maW5pc2goJmFjeHQpOworCW11dGV4X3VubG9jaygma2VybmZzX211dGV4KTsKIAogCWlmIChrbikKIAkJcmV0dXJuIDA7CkBAIC05MDksMTIgKzEyNDAsMTggQEAKIGludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCwKIAkJICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSwgY29uc3Qgdm9pZCAqbmV3X25zKQogeworCXN0cnVjdCBrZXJuZnNfbm9kZSAqb2xkX3BhcmVudDsKKwljb25zdCBjaGFyICpvbGRfbmFtZSA9IE5VTEw7CiAJaW50IGVycm9yOwogCisJLyogY2FuJ3QgbW92ZSBvciByZW5hbWUgcm9vdCAqLworCWlmICgha24tPnBhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCiAJZXJyb3IgPSAtRU5PRU5UOwotCWlmICgoa24tPmZsYWdzIHwgbmV3X3BhcmVudC0+ZmxhZ3MpICYgS0VSTkZTX1JFTU9WRUQpCisJaWYgKCFrZXJuZnNfYWN0aXZlKGtuKSB8fCAha2VybmZzX2FjdGl2ZShuZXdfcGFyZW50KSkKIAkJZ290byBvdXQ7CiAKIAllcnJvciA9IDA7CkBAIC05MzIsMTMgKzEyNjksOCBAQAogCQluZXdfbmFtZSA9IGtzdHJkdXAobmV3X25hbWUsIEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld19uYW1lKQogCQkJZ290byBvdXQ7Ci0KLQkJaWYgKGtuLT5mbGFncyAmIEtFUk5GU19TVEFUSUNfTkFNRSkKLQkJCWtuLT5mbGFncyAmPSB+S0VSTkZTX1NUQVRJQ19OQU1FOwotCQllbHNlCi0JCQlrZnJlZShrbi0+bmFtZSk7Ci0KLQkJa24tPm5hbWUgPSBuZXdfbmFtZTsKKwl9IGVsc2UgeworCQluZXdfbmFtZSA9IE5VTEw7CiAJfQogCiAJLyoKQEAgLTk0NiwxMiArMTI3OCwyOSBAQAogCSAqLwogCWtlcm5mc191bmxpbmtfc2libGluZyhrbik7CiAJa2VybmZzX2dldChuZXdfcGFyZW50KTsKLQlrZXJuZnNfcHV0KGtuLT5wYXJlbnQpOwotCWtuLT5ucyA9IG5ld19uczsKLQlrbi0+aGFzaCA9IGtlcm5mc19uYW1lX2hhc2goa24tPm5hbWUsIGtuLT5ucyk7CisKKwkvKiByZW5hbWVfbG9jayBwcm90ZWN0cyAtPnBhcmVudCBhbmQgLT5uYW1lIGFjY2Vzc29ycyAqLworCXNwaW5fbG9ja19pcnEoJmtlcm5mc19yZW5hbWVfbG9jayk7CisKKwlvbGRfcGFyZW50ID0ga24tPnBhcmVudDsKIAlrbi0+cGFyZW50ID0gbmV3X3BhcmVudDsKKworCWtuLT5ucyA9IG5ld19uczsKKwlpZiAobmV3X25hbWUpIHsKKwkJaWYgKCEoa24tPmZsYWdzICYgS0VSTkZTX1NUQVRJQ19OQU1FKSkKKwkJCW9sZF9uYW1lID0ga24tPm5hbWU7CisJCWtuLT5mbGFncyAmPSB+S0VSTkZTX1NUQVRJQ19OQU1FOworCQlrbi0+bmFtZSA9IG5ld19uYW1lOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgma2VybmZzX3JlbmFtZV9sb2NrKTsKKworCWtuLT5oYXNoID0ga2VybmZzX25hbWVfaGFzaChrbi0+bmFtZSwga24tPm5zKTsKIAlrZXJuZnNfbGlua19zaWJsaW5nKGtuKTsKIAorCWtlcm5mc19wdXQob2xkX3BhcmVudCk7CisJa2ZyZWUob2xkX25hbWUpOworCiAJZXJyb3IgPSAwOwogIG91dDoKIAltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CkBAIC05NzQsNyArMTMyMyw3IEBACiAJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKIHsKIAlpZiAocG9zKSB7Ci0JCWludCB2YWxpZCA9ICEocG9zLT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKSAmJgorCQlpbnQgdmFsaWQgPSBrZXJuZnNfYWN0aXZlKHBvcykgJiYKIAkJCXBvcy0+cGFyZW50ID09IHBhcmVudCAmJiBoYXNoID09IHBvcy0+aGFzaDsKIAkJa2VybmZzX3B1dChwb3MpOwogCQlpZiAoIXZhbGlkKQpAQCAtOTkzLDggKzEzNDIsOCBAQAogCQkJCWJyZWFrOwogCQl9CiAJfQotCS8qIFNraXAgb3ZlciBlbnRyaWVzIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi8KLQl3aGlsZSAocG9zICYmIHBvcy0+bnMgIT0gbnMpIHsKKwkvKiBTa2lwIG92ZXIgZW50cmllcyB3aGljaCBhcmUgZHlpbmcvZGVhZCBvciBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovCisJd2hpbGUgKHBvcyAmJiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fCBwb3MtPm5zICE9IG5zKSkgewogCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoJnBvcy0+cmIpOwogCQlpZiAoIW5vZGUpCiAJCQlwb3MgPSBOVUxMOwpAQCAtMTAwOCwxNCArMTM1NywxNSBAQAogCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBpbm9fdCBpbm8sIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zKQogewogCXBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGlubywgcG9zKTsKLQlpZiAocG9zKQorCWlmIChwb3MpIHsKIAkJZG8gewogCQkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KCZwb3MtPnJiKTsKIAkJCWlmICghbm9kZSkKIAkJCQlwb3MgPSBOVUxMOwogCQkJZWxzZQogCQkJCXBvcyA9IHJiX3RvX2tuKG5vZGUpOwotCQl9IHdoaWxlIChwb3MgJiYgcG9zLT5ucyAhPSBucyk7CisJCX0gd2hpbGUgKHBvcyAmJiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fCBwb3MtPm5zICE9IG5zKSk7CisJfQogCXJldHVybiBwb3M7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9maWxlLmMgYi9mcy9rZXJuZnMvZmlsZS5jCmluZGV4IGRiZjM5N2IuLjgwMzQ3MDYgMTAwNjQ0Ci0tLSBhL2ZzL2tlcm5mcy9maWxlLmMKKysrIGIvZnMva2VybmZzL2ZpbGUuYwpAQCAtMjUyLDEwICsyNTIsMTggQEAKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YgPSBrZXJuZnNfb2YoZmlsZSk7Ci0Jc3NpemVfdCBsZW4gPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUpOwogCWNvbnN0IHN0cnVjdCBrZXJuZnNfb3BzICpvcHM7CisJc2l6ZV90IGxlbjsKIAljaGFyICpidWY7CiAKKwlpZiAob2YtPmF0b21pY193cml0ZV9sZW4pIHsKKwkJbGVuID0gY291bnQ7CisJCWlmIChsZW4gPiBvZi0+YXRvbWljX3dyaXRlX2xlbikKKwkJCXJldHVybiAtRTJCSUc7CisJfSBlbHNlIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFKTsKKwl9CisKIAlidWYgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY1Myw2ICs2NjEsMTIgQEAKIAlvZi0+ZmlsZSA9IGZpbGU7CiAKIAkvKgorCSAqIFdyaXRlIHBhdGggbmVlZHMgdG8gYXRvbWljX3dyaXRlX2xlbiBvdXRzaWRlIGFjdGl2ZSByZWZlcmVuY2UuCisJICogQ2FjaGUgaXQgaW4gb3Blbl9maWxlLiAgU2VlIGtlcm5mc19mb3Bfd3JpdGUoKSBmb3IgZGV0YWlscy4KKwkgKi8KKwlvZi0+YXRvbWljX3dyaXRlX2xlbiA9IG9wcy0+YXRvbWljX3dyaXRlX2xlbjsKKworCS8qCiAJICogQWx3YXlzIGluc3RhbnRpYXRlIHNlcV9maWxlIGV2ZW4gaWYgcmVhZCBhY2Nlc3MgZG9lc24ndCB1c2UKIAkgKiBzZXFfZmlsZSBvciBpcyBub3QgcmVxdWVzdGVkLiAgVGhpcyB1bmlmaWVzIHByaXZhdGUgZGF0YSBhY2Nlc3MKIAkgKiBhbmQgcmVhZGFibGUgcmVndWxhciBmaWxlcyBhcmUgdGhlIHZhc3QgbWFqb3JpdHkgYW55d2F5LgpAQCAtODIwLDcgKzgzNCw2IEBACiAJCQkJCSBib29sIG5hbWVfaXNfc3RhdGljLAogCQkJCQkgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7Ci0Jc3RydWN0IGtlcm5mc19hZGRybV9jeHQgYWN4dDsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuOwogCXVuc2lnbmVkIGZsYWdzOwogCWludCByYzsKQEAgLTg1NSwxMCArODY4LDcgQEAKIAlpZiAob3BzLT5tbWFwKQogCQlrbi0+ZmxhZ3MgfD0gS0VSTkZTX0hBU19NTUFQOwogCi0Ja2VybmZzX2FkZHJtX3N0YXJ0KCZhY3h0KTsKLQlyYyA9IGtlcm5mc19hZGRfb25lKCZhY3h0LCBrbik7Ci0Ja2VybmZzX2FkZHJtX2ZpbmlzaCgmYWN4dCk7Ci0KKwlyYyA9IGtlcm5mc19hZGRfb25lKGtuKTsKIAlpZiAocmMpIHsKIAkJa2VybmZzX3B1dChrbik7CiAJCXJldHVybiBFUlJfUFRSKHJjKTsKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaCBiL2ZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaAppbmRleCBlYjUzNmI3Li44YmUxM2IyIDEwMDY0NAotLS0gYS9mcy9rZXJuZnMva2VybmZzLWludGVybmFsLmgKKysrIGIvZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oCkBAIC0yNiw3ICsyNiw4IEBACiAJc3RydWN0IHNpbXBsZV94YXR0cnMJeGF0dHJzOwogfTsKIAotI2RlZmluZSBLTl9ERUFDVElWQVRFRF9CSUFTCQlJTlRfTUlOCisvKiArMSB0byBhdm9pZCB0cmlnZ2VyaW5nIG92ZXJmbG93IHdhcm5pbmcgd2hlbiBuZWdhdGluZyBpdCAqLworI2RlZmluZSBLTl9ERUFDVElWQVRFRF9CSUFTCQkoSU5UX01JTiArIDEpCiAKIC8qIEtFUk5GU19UWVBFX01BU0sgYW5kIHR5cGVzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgva2VybmZzLmggKi8KIApAQCAtNDUsMTMgKzQ2LDYgQEAKIH0KIAogLyoKLSAqIENvbnRleHQgc3RydWN0dXJlIHRvIGJlIHVzZWQgd2hpbGUgYWRkaW5nL3JlbW92aW5nIG5vZGVzLgotICovCi1zdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCB7Ci0Jc3RydWN0IGtlcm5mc19ub2RlCSpyZW1vdmVkOwotfTsKLQotLyoKICAqIG1vdW50LmMKICAqLwogc3RydWN0IGtlcm5mc19zdXBlcl9pbmZvIHsKQEAgLTcxLDYgKzY1LDcgQEAKIH07CiAjZGVmaW5lIGtlcm5mc19pbmZvKFNCKSAoKHN0cnVjdCBrZXJuZnNfc3VwZXJfaW5mbyAqKShTQi0+c19mc19pbmZvKSkKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGtlcm5mc19zb3BzOwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICprZXJuZnNfbm9kZV9jYWNoZTsKIAogLyoKQEAgLTEwMCw5ICs5NSw3IEBACiAKIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2dldF9hY3RpdmUoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiB2b2lkIGtlcm5mc19wdXRfYWN0aXZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwotdm9pZCBrZXJuZnNfYWRkcm1fc3RhcnQoc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQpOwotaW50IGtlcm5mc19hZGRfb25lKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKLXZvaWQga2VybmZzX2FkZHJtX2ZpbmlzaChzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCAqYWN4dCk7CitpbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19uZXdfbm9kZShzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwKIAkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLAogCQkJCSAgICB1bnNpZ25lZCBmbGFncyk7CmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvbW91bnQuYyBiL2ZzL2tlcm5mcy9tb3VudC5jCmluZGV4IDBmNDE1MmQuLjZhNWYwNGEgMTAwNjQ0Ci0tLSBhL2ZzL2tlcm5mcy9tb3VudC5jCisrKyBiL2ZzL2tlcm5mcy9tb3VudC5jCkBAIC0xOSwxMiArMTksNDkgQEAKIAogc3RydWN0IGttZW1fY2FjaGUgKmtlcm5mc19ub2RlX2NhY2hlOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMga2VybmZzX3NvcHMgPSB7CitzdGF0aWMgaW50IGtlcm5mc19zb3BfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCA9IGtlcm5mc19pbmZvKHNiKS0+cm9vdDsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IHJvb3QtPnN5c2NhbGxfb3BzOworCisJaWYgKHNjb3BzICYmIHNjb3BzLT5yZW1vdW50X2ZzKQorCQlyZXR1cm4gc2NvcHMtPnJlbW91bnRfZnMocm9vdCwgZmxhZ3MsIGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtlcm5mc19zb3Bfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QgPSBrZXJuZnNfcm9vdChkZW50cnktPmRfZnNkYXRhKTsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IHJvb3QtPnN5c2NhbGxfb3BzOworCisJaWYgKHNjb3BzICYmIHNjb3BzLT5zaG93X29wdGlvbnMpCisJCXJldHVybiBzY29wcy0+c2hvd19vcHRpb25zKHNmLCByb290KTsKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMga2VybmZzX3NvcHMgPSB7CiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAogCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCiAJLmV2aWN0X2lub2RlCT0ga2VybmZzX2V2aWN0X2lub2RlLAorCisJLnJlbW91bnRfZnMJPSBrZXJuZnNfc29wX3JlbW91bnRfZnMsCisJLnNob3dfb3B0aW9ucwk9IGtlcm5mc19zb3Bfc2hvd19vcHRpb25zLAogfTsKIAorLyoqCisgKiBrZXJuZnNfcm9vdF9mcm9tX3NiIC0gZGV0ZXJtaW5lIGtlcm5mc19yb290IGFzc29jaWF0ZWQgd2l0aCBhIHN1cGVyX2Jsb2NrCisgKiBAc2I6IHRoZSBzdXBlcl9ibG9jayBpbiBxdWVzdGlvbgorICoKKyAqIFJldHVybiB0aGUga2VybmZzX3Jvb3QgYXNzb2NpYXRlZCB3aXRoIEBzYi4gIElmIEBzYiBpcyBub3QgYSBrZXJuZnMgb25lLAorICogJU5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX3Jvb3RfZnJvbV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChzYi0+c19vcCA9PSAma2VybmZzX3NvcHMpCisJCXJldHVybiBrZXJuZnNfaW5mbyhzYiktPnJvb3Q7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbnQga2VybmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3Qga2VybmZzX3N1cGVyX2luZm8gKmluZm8gPSBrZXJuZnNfaW5mbyhzYik7CmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvc3ltbGluay5jIGIvZnMva2VybmZzL3N5bWxpbmsuYwppbmRleCA0ZDQ1NzA1Li44YTE5ODg5IDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvc3ltbGluay5jCisrKyBiL2ZzL2tlcm5mcy9zeW1saW5rLmMKQEAgLTI3LDcgKzI3LDYgQEAKIAkJCQkgICAgICAgc3RydWN0IGtlcm5mc19ub2RlICp0YXJnZXQpCiB7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbjsKLQlzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCBhY3h0OwogCWludCBlcnJvcjsKIAogCWtuID0ga2VybmZzX25ld19ub2RlKHBhcmVudCwgbmFtZSwgU19JRkxOS3xTX0lSV1hVR08sIEtFUk5GU19MSU5LKTsKQEAgLTM5LDEwICszOCw3IEBACiAJa24tPnN5bWxpbmsudGFyZ2V0X2tuID0gdGFyZ2V0OwogCWtlcm5mc19nZXQodGFyZ2V0KTsJLyogcmVmIG93bmVkIGJ5IHN5bWxpbmsgKi8KIAotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7Ci0JZXJyb3IgPSBrZXJuZnNfYWRkX29uZSgmYWN4dCwga24pOwotCWtlcm5mc19hZGRybV9maW5pc2goJmFjeHQpOwotCisJZXJyb3IgPSBrZXJuZnNfYWRkX29uZShrbik7CiAJaWYgKCFlcnJvcikKIAkJcmV0dXJuIGtuOwogCmRpZmYgLS1naXQgYS9mcy9tb3VudC5oIGIvZnMvbW91bnQuaAppbmRleCBhMTc0NThjLi5iMjllNDJmIDEwMDY0NAotLS0gYS9mcy9tb3VudC5oCisrKyBiL2ZzL21vdW50LmgKQEAgLTE5LDEzICsxOSwxMyBAQAogfTsKIAogc3RydWN0IG1vdW50cG9pbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgbV9oYXNoOworCXN0cnVjdCBobGlzdF9ub2RlIG1faGFzaDsKIAlzdHJ1Y3QgZGVudHJ5ICptX2RlbnRyeTsKIAlpbnQgbV9jb3VudDsKIH07CiAKIHN0cnVjdCBtb3VudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtbnRfaGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBtbnRfaGFzaDsKIAlzdHJ1Y3QgbW91bnQgKm1udF9wYXJlbnQ7CiAJc3RydWN0IGRlbnRyeSAqbW50X21vdW50cG9pbnQ7CiAJc3RydWN0IHZmc21vdW50IG1udDsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDJmNzMwZWYuLjRiNDkxYjQgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTEwOSw3ICsxMTA5LDcgQEAKIAkJCXJldHVybiBmYWxzZTsKIAogCQlpZiAoIWRfbW91bnRwb2ludChwYXRoLT5kZW50cnkpKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gdHJ1ZTsKIAogCQltb3VudGVkID0gX19sb29rdXBfbW50KHBhdGgtPm1udCwgcGF0aC0+ZGVudHJ5KTsKIAkJaWYgKCFtb3VudGVkKQpAQCAtMTEyNSwyMCArMTEyNSw3IEBACiAJCSAqLwogCQkqaW5vZGUgPSBwYXRoLT5kZW50cnktPmRfaW5vZGU7CiAJfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBmb2xsb3dfbW91bnRfcmN1KHN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCXdoaWxlIChkX21vdW50cG9pbnQobmQtPnBhdGguZGVudHJ5KSkgewotCQlzdHJ1Y3QgbW91bnQgKm1vdW50ZWQ7Ci0JCW1vdW50ZWQgPSBfX2xvb2t1cF9tbnQobmQtPnBhdGgubW50LCBuZC0+cGF0aC5kZW50cnkpOwotCQlpZiAoIW1vdW50ZWQpCi0JCQlicmVhazsKLQkJbmQtPnBhdGgubW50ID0gJm1vdW50ZWQtPm1udDsKLQkJbmQtPnBhdGguZGVudHJ5ID0gbW91bnRlZC0+bW50Lm1udF9yb290OwotCQluZC0+c2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmQtPnBhdGguZGVudHJ5LT5kX3NlcSk7Ci0JfQorCXJldHVybiByZWFkX3NlcXJldHJ5KCZtb3VudF9sb2NrLCBuZC0+bV9zZXEpOwogfQogCiBzdGF0aWMgaW50IGZvbGxvd19kb3Rkb3RfcmN1KHN0cnVjdCBuYW1laWRhdGEgKm5kKQpAQCAtMTE2Niw3ICsxMTUzLDE3IEBACiAJCQlicmVhazsKIAkJbmQtPnNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5kLT5wYXRoLmRlbnRyeS0+ZF9zZXEpOwogCX0KLQlmb2xsb3dfbW91bnRfcmN1KG5kKTsKKwl3aGlsZSAoZF9tb3VudHBvaW50KG5kLT5wYXRoLmRlbnRyeSkpIHsKKwkJc3RydWN0IG1vdW50ICptb3VudGVkOworCQltb3VudGVkID0gX19sb29rdXBfbW50KG5kLT5wYXRoLm1udCwgbmQtPnBhdGguZGVudHJ5KTsKKwkJaWYgKCFtb3VudGVkKQorCQkJYnJlYWs7CisJCW5kLT5wYXRoLm1udCA9ICZtb3VudGVkLT5tbnQ7CisJCW5kLT5wYXRoLmRlbnRyeSA9IG1vdW50ZWQtPm1udC5tbnRfcm9vdDsKKwkJbmQtPnNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5kLT5wYXRoLmRlbnRyeS0+ZF9zZXEpOworCQlpZiAoIXJlYWRfc2VxcmV0cnkoJm1vdW50X2xvY2ssIG5kLT5tX3NlcSkpCisJCQlnb3RvIGZhaWxlZDsKKwl9CiAJbmQtPmlub2RlID0gbmQtPnBhdGguZGVudHJ5LT5kX2lub2RlOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IDIyZTUzNjcuLjJmZmM1YTIgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0yMywxMSArMjMsMzQgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19ucy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgInBub2RlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBIQVNIX1NISUZUIGlsb2cyKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSkKLSNkZWZpbmUgSEFTSF9TSVpFICgxVUwgPDwgSEFTSF9TSElGVCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbV9oYXNoX21hc2sgX19yZWFkX21vc3RseTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbV9oYXNoX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgaW50IG1wX2hhc2hfbWFzayBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIGludCBtcF9oYXNoX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgbWhhc2hfZW50cmllczsKK3N0YXRpYyBpbnQgX19pbml0IHNldF9taGFzaF9lbnRyaWVzKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cikKKwkJcmV0dXJuIDA7CisJbWhhc2hfZW50cmllcyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJtaGFzaF9lbnRyaWVzPSIsIHNldF9taGFzaF9lbnRyaWVzKTsKKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBtcGhhc2hfZW50cmllczsKK3N0YXRpYyBpbnQgX19pbml0IHNldF9tcGhhc2hfZW50cmllcyhjaGFyICpzdHIpCit7CisJaWYgKCFzdHIpCisJCXJldHVybiAwOworCW1waGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm1waGFzaF9lbnRyaWVzPSIsIHNldF9tcGhhc2hfZW50cmllcyk7CiAKIHN0YXRpYyBpbnQgZXZlbnQ7CiBzdGF0aWMgREVGSU5FX0lEQShtbnRfaWRfaWRhKTsKQEAgLTM2LDggKzU5LDggQEAKIHN0YXRpYyBpbnQgbW50X2lkX3N0YXJ0ID0gMDsKIHN0YXRpYyBpbnQgbW50X2dyb3VwX3N0YXJ0ID0gMTsKIAotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50X2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Owotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cG9pbnRfaGFzaHRhYmxlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKm1vdW50X2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICptb3VudHBvaW50X2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptbnRfY2FjaGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKG5hbWVzcGFjZV9zZW0pOwogCkBAIC01NSwxMiArNzgsMTkgQEAKICAqLwogX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NFUUxPQ0sobW91bnRfbG9jayk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBobGlzdF9oZWFkICptX2hhc2goc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcCA9ICgodW5zaWduZWQgbG9uZyltbnQgLyBMMV9DQUNIRV9CWVRFUyk7CiAJdG1wICs9ICgodW5zaWduZWQgbG9uZylkZW50cnkgLyBMMV9DQUNIRV9CWVRFUyk7Ci0JdG1wID0gdG1wICsgKHRtcCA+PiBIQVNIX1NISUZUKTsKLQlyZXR1cm4gdG1wICYgKEhBU0hfU0laRSAtIDEpOworCXRtcCA9IHRtcCArICh0bXAgPj4gbV9oYXNoX3NoaWZ0KTsKKwlyZXR1cm4gJm1vdW50X2hhc2h0YWJsZVt0bXAgJiBtX2hhc2hfbWFza107Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhsaXN0X2hlYWQgKm1wX2hhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgdG1wID0gKCh1bnNpZ25lZCBsb25nKWRlbnRyeSAvIEwxX0NBQ0hFX0JZVEVTKTsKKwl0bXAgPSB0bXAgKyAodG1wID4+IG1wX2hhc2hfc2hpZnQpOworCXJldHVybiAmbW91bnRwb2ludF9oYXNodGFibGVbdG1wICYgbXBfaGFzaF9tYXNrXTsKIH0KIAogLyoKQEAgLTE4Nyw3ICsyMTcsNyBAQAogCQltbnQtPm1udF93cml0ZXJzID0gMDsKICNlbmRpZgogCi0JCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9oYXNoKTsKKwkJSU5JVF9ITElTVF9OT0RFKCZtbnQtPm1udF9oYXNoKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2NoaWxkKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X21vdW50cyk7CiAJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9saXN0KTsKQEAgLTU3NSwxMCArNjA1LDEwIEBACiAgKi8KIHN0cnVjdCBtb3VudCAqX19sb29rdXBfbW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IG1vdW50X2hhc2h0YWJsZSArIGhhc2gobW50LCBkZW50cnkpOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gbV9oYXNoKG1udCwgZGVudHJ5KTsKIAlzdHJ1Y3QgbW91bnQgKnA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBoZWFkLCBtbnRfaGFzaCkKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocCwgaGVhZCwgbW50X2hhc2gpCiAJCWlmICgmcC0+bW50X3BhcmVudC0+bW50ID09IG1udCAmJiBwLT5tbnRfbW91bnRwb2ludCA9PSBkZW50cnkpCiAJCQlyZXR1cm4gcDsKIAlyZXR1cm4gTlVMTDsKQEAgLTU5MCwxMyArNjIwLDE3IEBACiAgKi8KIHN0cnVjdCBtb3VudCAqX19sb29rdXBfbW50X2xhc3Qoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gbW91bnRfaGFzaHRhYmxlICsgaGFzaChtbnQsIGRlbnRyeSk7Ci0Jc3RydWN0IG1vdW50ICpwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHAsIGhlYWQsIG1udF9oYXNoKQotCQlpZiAoJnAtPm1udF9wYXJlbnQtPm1udCA9PSBtbnQgJiYgcC0+bW50X21vdW50cG9pbnQgPT0gZGVudHJ5KQotCQkJcmV0dXJuIHA7Ci0JcmV0dXJuIE5VTEw7CisJc3RydWN0IG1vdW50ICpwLCAqcmVzOworCXJlcyA9IHAgPSBfX2xvb2t1cF9tbnQobW50LCBkZW50cnkpOworCWlmICghcCkKKwkJZ290byBvdXQ7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocCwgbW50X2hhc2gpIHsKKwkJaWYgKCZwLT5tbnRfcGFyZW50LT5tbnQgIT0gbW50IHx8IHAtPm1udF9tb3VudHBvaW50ICE9IGRlbnRyeSkKKwkJCWJyZWFrOworCQlyZXMgPSBwOworCX0KK291dDoKKwlyZXR1cm4gcmVzOwogfQogCiAvKgpAQCAtNjMzLDExICs2NjcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBtb3VudHBvaW50ICpuZXdfbW91bnRwb2ludChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY2hhaW4gPSBtb3VudHBvaW50X2hhc2h0YWJsZSArIGhhc2goTlVMTCwgZGVudHJ5KTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW4gPSBtcF9oYXNoKGRlbnRyeSk7CiAJc3RydWN0IG1vdW50cG9pbnQgKm1wOwogCWludCByZXQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBjaGFpbiwgbV9oYXNoKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkobXAsIGNoYWluLCBtX2hhc2gpIHsKIAkJaWYgKG1wLT5tX2RlbnRyeSA9PSBkZW50cnkpIHsKIAkJCS8qIG1pZ2h0IGJlIHdvcnRoIGEgV0FSTl9PTigpICovCiAJCQlpZiAoZF91bmxpbmtlZChkZW50cnkpKQpAQCAtNjU5LDcgKzY5Myw3IEBACiAKIAltcC0+bV9kZW50cnkgPSBkZW50cnk7CiAJbXAtPm1fY291bnQgPSAxOwotCWxpc3RfYWRkKCZtcC0+bV9oYXNoLCBjaGFpbik7CisJaGxpc3RfYWRkX2hlYWQoJm1wLT5tX2hhc2gsIGNoYWluKTsKIAlyZXR1cm4gbXA7CiB9CiAKQEAgLTY3MCw3ICs3MDQsNyBAQAogCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfTU9VTlRFRDsKIAkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQkJbGlzdF9kZWwoJm1wLT5tX2hhc2gpOworCQlobGlzdF9kZWwoJm1wLT5tX2hhc2gpOwogCQlrZnJlZShtcCk7CiAJfQogfQpAQCAtNzEyLDcgKzc0Niw3IEBACiAJbW50LT5tbnRfcGFyZW50ID0gbW50OwogCW1udC0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udC5tbnRfcm9vdDsKIAlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9jaGlsZCk7Ci0JbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CisJaGxpc3RfZGVsX2luaXRfcmN1KCZtbnQtPm1udF9oYXNoKTsKIAlwdXRfbW91bnRwb2ludChtbnQtPm1udF9tcCk7CiAJbW50LT5tbnRfbXAgPSBOVUxMOwogfQpAQCAtNzM5LDE1ICs3NzMsMTQgQEAKIAkJCXN0cnVjdCBtb3VudHBvaW50ICptcCkKIHsKIAltbnRfc2V0X21vdW50cG9pbnQocGFyZW50LCBtcCwgbW50KTsKLQlsaXN0X2FkZF90YWlsKCZtbnQtPm1udF9oYXNoLCBtb3VudF9oYXNodGFibGUgKwotCQkJaGFzaCgmcGFyZW50LT5tbnQsIG1wLT5tX2RlbnRyeSkpOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmbW50LT5tbnRfaGFzaCwgbV9oYXNoKCZwYXJlbnQtPm1udCwgbXAtPm1fZGVudHJ5KSk7CiAJbGlzdF9hZGRfdGFpbCgmbW50LT5tbnRfY2hpbGQsICZwYXJlbnQtPm1udF9tb3VudHMpOwogfQogCiAvKgogICogdmZzbW91bnQgbG9jayBtdXN0IGJlIGhlbGQgZm9yIHdyaXRlCiAgKi8KLXN0YXRpYyB2b2lkIGNvbW1pdF90cmVlKHN0cnVjdCBtb3VudCAqbW50KQorc3RhdGljIHZvaWQgY29tbWl0X3RyZWUoc3RydWN0IG1vdW50ICptbnQsIHN0cnVjdCBtb3VudCAqc2hhZG93cykKIHsKIAlzdHJ1Y3QgbW91bnQgKnBhcmVudCA9IG1udC0+bW50X3BhcmVudDsKIAlzdHJ1Y3QgbW91bnQgKm07CkBAIC03NjIsOCArNzk1LDExIEBACiAKIAlsaXN0X3NwbGljZSgmaGVhZCwgbi0+bGlzdC5wcmV2KTsKIAotCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2hhc2gsIG1vdW50X2hhc2h0YWJsZSArCi0JCQkJaGFzaCgmcGFyZW50LT5tbnQsIG1udC0+bW50X21vdW50cG9pbnQpKTsKKwlpZiAoc2hhZG93cykKKwkJaGxpc3RfYWRkX2FmdGVyX3JjdSgmc2hhZG93cy0+bW50X2hhc2gsICZtbnQtPm1udF9oYXNoKTsKKwllbHNlCisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmbW50LT5tbnRfaGFzaCwKKwkJCQltX2hhc2goJnBhcmVudC0+bW50LCBtbnQtPm1udF9tb3VudHBvaW50KSk7CiAJbGlzdF9hZGRfdGFpbCgmbW50LT5tbnRfY2hpbGQsICZwYXJlbnQtPm1udF9tb3VudHMpOwogCXRvdWNoX21udF9uYW1lc3BhY2Uobik7CiB9CkBAIC0xMTUzLDI2ICsxMTg5LDI4IEBACiAKIEVYUE9SVF9TWU1CT0wobWF5X3Vtb3VudCk7CiAKLXN0YXRpYyBMSVNUX0hFQUQodW5tb3VudGVkKTsJLyogcHJvdGVjdGVkIGJ5IG5hbWVzcGFjZV9zZW0gKi8KK3N0YXRpYyBITElTVF9IRUFEKHVubW91bnRlZCk7CS8qIHByb3RlY3RlZCBieSBuYW1lc3BhY2Vfc2VtICovCiAKIHN0YXRpYyB2b2lkIG5hbWVzcGFjZV91bmxvY2sodm9pZCkKIHsKIAlzdHJ1Y3QgbW91bnQgKm1udDsKLQlMSVNUX0hFQUQoaGVhZCk7CisJc3RydWN0IGhsaXN0X2hlYWQgaGVhZCA9IHVubW91bnRlZDsKIAotCWlmIChsaWtlbHkobGlzdF9lbXB0eSgmdW5tb3VudGVkKSkpIHsKKwlpZiAobGlrZWx5KGhsaXN0X2VtcHR5KCZoZWFkKSkpIHsKIAkJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwogCQlyZXR1cm47CiAJfQogCi0JbGlzdF9zcGxpY2VfaW5pdCgmdW5tb3VudGVkLCAmaGVhZCk7CisJaGVhZC5maXJzdC0+cHByZXYgPSAmaGVhZC5maXJzdDsKKwlJTklUX0hMSVNUX0hFQUQoJnVubW91bnRlZCk7CisKIAl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmaGVhZCkpIHsKLQkJbW50ID0gbGlzdF9maXJzdF9lbnRyeSgmaGVhZCwgc3RydWN0IG1vdW50LCBtbnRfaGFzaCk7Ci0JCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2hhc2gpOworCXdoaWxlICghaGxpc3RfZW1wdHkoJmhlYWQpKSB7CisJCW1udCA9IGhsaXN0X2VudHJ5KGhlYWQuZmlyc3QsIHN0cnVjdCBtb3VudCwgbW50X2hhc2gpOworCQlobGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CiAJCWlmIChtbnQtPm1udF9leF9tb3VudHBvaW50Lm1udCkKIAkJCXBhdGhfcHV0KCZtbnQtPm1udF9leF9tb3VudHBvaW50KTsKIAkJbW50cHV0KCZtbnQtPm1udCk7CkBAIC0xMTkzLDE2ICsxMjMxLDE5IEBACiAgKi8KIHZvaWQgdW1vdW50X3RyZWUoc3RydWN0IG1vdW50ICptbnQsIGludCBob3cpCiB7Ci0JTElTVF9IRUFEKHRtcF9saXN0KTsKKwlITElTVF9IRUFEKHRtcF9saXN0KTsKIAlzdHJ1Y3QgbW91bnQgKnA7CisJc3RydWN0IG1vdW50ICpsYXN0ID0gTlVMTDsKIAotCWZvciAocCA9IG1udDsgcDsgcCA9IG5leHRfbW50KHAsIG1udCkpCi0JCWxpc3RfbW92ZSgmcC0+bW50X2hhc2gsICZ0bXBfbGlzdCk7CisJZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkgeworCQlobGlzdF9kZWxfaW5pdF9yY3UoJnAtPm1udF9oYXNoKTsKKwkJaGxpc3RfYWRkX2hlYWQoJnAtPm1udF9oYXNoLCAmdG1wX2xpc3QpOworCX0KIAogCWlmIChob3cpCiAJCXByb3BhZ2F0ZV91bW91bnQoJnRtcF9saXN0KTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnRtcF9saXN0LCBtbnRfaGFzaCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0bXBfbGlzdCwgbW50X2hhc2gpIHsKIAkJbGlzdF9kZWxfaW5pdCgmcC0+bW50X2V4cGlyZSk7CiAJCWxpc3RfZGVsX2luaXQoJnAtPm1udF9saXN0KTsKIAkJX190b3VjaF9tbnRfbmFtZXNwYWNlKHAtPm1udF9ucyk7CkBAIC0xMjIwLDggKzEyNjEsMTMgQEAKIAkJCXAtPm1udF9tcCA9IE5VTEw7CiAJCX0KIAkJY2hhbmdlX21udF9wcm9wYWdhdGlvbihwLCBNU19QUklWQVRFKTsKKwkJbGFzdCA9IHA7CiAJfQotCWxpc3Rfc3BsaWNlKCZ0bXBfbGlzdCwgJnVubW91bnRlZCk7CisJaWYgKGxhc3QpIHsKKwkJbGFzdC0+bW50X2hhc2gubmV4dCA9IHVubW91bnRlZC5maXJzdDsKKwkJdW5tb3VudGVkLmZpcnN0ID0gdG1wX2xpc3QuZmlyc3Q7CisJCXVubW91bnRlZC5maXJzdC0+cHByZXYgPSAmdW5tb3VudGVkLmZpcnN0OworCX0KIH0KIAogc3RhdGljIHZvaWQgc2hyaW5rX3N1Ym1vdW50cyhzdHJ1Y3QgbW91bnQgKm1udCk7CkBAIC0xNjA1LDI0ICsxNjUxLDIzIEBACiAJCQlzdHJ1Y3QgbW91bnRwb2ludCAqZGVzdF9tcCwKIAkJCXN0cnVjdCBwYXRoICpwYXJlbnRfcGF0aCkKIHsKLQlMSVNUX0hFQUQodHJlZV9saXN0KTsKKwlITElTVF9IRUFEKHRyZWVfbGlzdCk7CiAJc3RydWN0IG1vdW50ICpjaGlsZCwgKnA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJaW50IGVycjsKIAogCWlmIChJU19NTlRfU0hBUkVEKGRlc3RfbW50KSkgewogCQllcnIgPSBpbnZlbnRfZ3JvdXBfaWRzKHNvdXJjZV9tbnQsIHRydWUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7Ci0JfQotCWVyciA9IHByb3BhZ2F0ZV9tbnQoZGVzdF9tbnQsIGRlc3RfbXAsIHNvdXJjZV9tbnQsICZ0cmVlX2xpc3QpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2NsZWFudXBfaWRzOwotCi0JbG9ja19tb3VudF9oYXNoKCk7Ci0KLQlpZiAoSVNfTU5UX1NIQVJFRChkZXN0X21udCkpIHsKKwkJZXJyID0gcHJvcGFnYXRlX21udChkZXN0X21udCwgZGVzdF9tcCwgc291cmNlX21udCwgJnRyZWVfbGlzdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbGVhbnVwX2lkczsKKwkJbG9ja19tb3VudF9oYXNoKCk7CiAJCWZvciAocCA9IHNvdXJjZV9tbnQ7IHA7IHAgPSBuZXh0X21udChwLCBzb3VyY2VfbW50KSkKIAkJCXNldF9tbnRfc2hhcmVkKHApOworCX0gZWxzZSB7CisJCWxvY2tfbW91bnRfaGFzaCgpOwogCX0KIAlpZiAocGFyZW50X3BhdGgpIHsKIAkJZGV0YWNoX21udChzb3VyY2VfbW50LCBwYXJlbnRfcGF0aCk7CkBAIC0xNjMwLDIwICsxNjc1LDIyIEBACiAJCXRvdWNoX21udF9uYW1lc3BhY2Uoc291cmNlX21udC0+bW50X25zKTsKIAl9IGVsc2UgewogCQltbnRfc2V0X21vdW50cG9pbnQoZGVzdF9tbnQsIGRlc3RfbXAsIHNvdXJjZV9tbnQpOwotCQljb21taXRfdHJlZShzb3VyY2VfbW50KTsKKwkJY29tbWl0X3RyZWUoc291cmNlX21udCwgTlVMTCk7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkLCBwLCAmdHJlZV9saXN0LCBtbnRfaGFzaCkgewotCQlsaXN0X2RlbF9pbml0KCZjaGlsZC0+bW50X2hhc2gpOwotCQljb21taXRfdHJlZShjaGlsZCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGlsZCwgbiwgJnRyZWVfbGlzdCwgbW50X2hhc2gpIHsKKwkJc3RydWN0IG1vdW50ICpxOworCQlobGlzdF9kZWxfaW5pdCgmY2hpbGQtPm1udF9oYXNoKTsKKwkJcSA9IF9fbG9va3VwX21udF9sYXN0KCZjaGlsZC0+bW50X3BhcmVudC0+bW50LAorCQkJCSAgICAgIGNoaWxkLT5tbnRfbW91bnRwb2ludCk7CisJCWNvbW1pdF90cmVlKGNoaWxkLCBxKTsKIAl9CiAJdW5sb2NrX21vdW50X2hhc2goKTsKIAogCXJldHVybiAwOwogCiAgb3V0X2NsZWFudXBfaWRzOgotCWlmIChJU19NTlRfU0hBUkVEKGRlc3RfbW50KSkKLQkJY2xlYW51cF9ncm91cF9pZHMoc291cmNlX21udCwgTlVMTCk7CisJY2xlYW51cF9ncm91cF9pZHMoc291cmNlX21udCwgTlVMTCk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0yNzc3LDE4ICsyODI0LDI0IEBACiAJbW50X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoIm1udF9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgbW91bnQpLAogCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOIHwgU0xBQl9QQU5JQywgTlVMTCk7CiAKLQltb3VudF9oYXNodGFibGUgPSAoc3RydWN0IGxpc3RfaGVhZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKLQltb3VudHBvaW50X2hhc2h0YWJsZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworCW1vdW50X2hhc2h0YWJsZSA9IGFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJNb3VudC1jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwKKwkJCQltaGFzaF9lbnRyaWVzLCAxOSwKKwkJCQkwLAorCQkJCSZtX2hhc2hfc2hpZnQsICZtX2hhc2hfbWFzaywgMCwgMCk7CisJbW91bnRwb2ludF9oYXNodGFibGUgPSBhbGxvY19sYXJnZV9zeXN0ZW1faGFzaCgiTW91bnRwb2ludC1jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwKKwkJCQltcGhhc2hfZW50cmllcywgMTksCisJCQkJMCwKKwkJCQkmbXBfaGFzaF9zaGlmdCwgJm1wX2hhc2hfbWFzaywgMCwgMCk7CiAKIAlpZiAoIW1vdW50X2hhc2h0YWJsZSB8fCAhbW91bnRwb2ludF9oYXNodGFibGUpCiAJCXBhbmljKCJGYWlsZWQgdG8gYWxsb2NhdGUgbW91bnQgaGFzaCB0YWJsZVxuIik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJNb3VudC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6ICVsdVxuIiwgSEFTSF9TSVpFKTsKLQotCWZvciAodSA9IDA7IHUgPCBIQVNIX1NJWkU7IHUrKykKLQkJSU5JVF9MSVNUX0hFQUQoJm1vdW50X2hhc2h0YWJsZVt1XSk7Ci0JZm9yICh1ID0gMDsgdSA8IEhBU0hfU0laRTsgdSsrKQotCQlJTklUX0xJU1RfSEVBRCgmbW91bnRwb2ludF9oYXNodGFibGVbdV0pOworCWZvciAodSA9IDA7IHUgPD0gbV9oYXNoX21hc2s7IHUrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZtb3VudF9oYXNodGFibGVbdV0pOworCWZvciAodSA9IDA7IHUgPD0gbXBfaGFzaF9tYXNrOyB1KyspCisJCUlOSVRfSExJU1RfSEVBRCgmbW91bnRwb2ludF9oYXNodGFibGVbdV0pOwogCiAJa2VybmZzX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggMDE3ZDNjYjUuLjZkN2JlM2YgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtNDQ5LDYgKzQ0OSw3IEBACiAJZmhfbG9jayhmaHApOwogCWhvc3RfZXJyID0gbm90aWZ5X2NoYW5nZShkZW50cnksIGlhcCwgTlVMTCk7CiAJZmhfdW5sb2NrKGZocCk7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCiBvdXRfcHV0X3dyaXRlX2FjY2VzczoKIAlpZiAoc2l6ZV9jaGFuZ2UpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdGFja2dsdWUuYyBiL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jCmluZGV4IDEzMjRlNjYuLmNhNWNlMTQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jCisrKyBiL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jCkBAIC0zNDYsNyArMzQ2LDkgQEAKIAogCXN0cmxjcHkobmV3X2Nvbm4tPmNjX25hbWUsIGdyb3VwLCBHUk9VUF9OQU1FX01BWCArIDEpOwogCW5ld19jb25uLT5jY19uYW1lbGVuID0gZ3JvdXBsZW47Ci0Jc3RybGNweShuZXdfY29ubi0+Y2NfY2x1c3Rlcl9uYW1lLCBjbHVzdGVyX25hbWUsIENMVVNURVJfTkFNRV9NQVggKyAxKTsKKwlpZiAoY2x1c3Rlcl9uYW1lX2xlbikKKwkJc3RybGNweShuZXdfY29ubi0+Y2NfY2x1c3Rlcl9uYW1lLCBjbHVzdGVyX25hbWUsCisJCQlDTFVTVEVSX05BTUVfTUFYICsgMSk7CiAJbmV3X2Nvbm4tPmNjX2NsdXN0ZXJfbmFtZV9sZW4gPSBjbHVzdGVyX25hbWVfbGVuOwogCW5ld19jb25uLT5jY19yZWNvdmVyeV9oYW5kbGVyID0gcmVjb3ZlcnlfaGFuZGxlcjsKIAluZXdfY29ubi0+Y2NfcmVjb3ZlcnlfZGF0YSA9IHJlY292ZXJ5X2RhdGE7CmRpZmYgLS1naXQgYS9mcy9wbm9kZS5jIGIvZnMvcG5vZGUuYwppbmRleCBjNzIyMWJiLi44ODM5NmRmIDEwMDY0NAotLS0gYS9mcy9wbm9kZS5jCisrKyBiL2ZzL3Bub2RlLmMKQEAgLTIyMCwxNCArMjIwLDE0IEBACiAgKiBAdHJlZV9saXN0IDogbGlzdCBvZiBoZWFkcyBvZiB0cmVlcyB0byBiZSBhdHRhY2hlZC4KICAqLwogaW50IHByb3BhZ2F0ZV9tbnQoc3RydWN0IG1vdW50ICpkZXN0X21udCwgc3RydWN0IG1vdW50cG9pbnQgKmRlc3RfbXAsCi0JCSAgICBzdHJ1Y3QgbW91bnQgKnNvdXJjZV9tbnQsIHN0cnVjdCBsaXN0X2hlYWQgKnRyZWVfbGlzdCkKKwkJICAgIHN0cnVjdCBtb3VudCAqc291cmNlX21udCwgc3RydWN0IGhsaXN0X2hlYWQgKnRyZWVfbGlzdCkKIHsKIAlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5tbnRfbnMtPnVzZXJfbnM7CiAJc3RydWN0IG1vdW50ICptLCAqY2hpbGQ7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IG1vdW50ICpwcmV2X2Rlc3RfbW50ID0gZGVzdF9tbnQ7CiAJc3RydWN0IG1vdW50ICpwcmV2X3NyY19tbnQgID0gc291cmNlX21udDsKLQlMSVNUX0hFQUQodG1wX2xpc3QpOworCUhMSVNUX0hFQUQodG1wX2xpc3QpOwogCiAJZm9yIChtID0gcHJvcGFnYXRpb25fbmV4dChkZXN0X21udCwgZGVzdF9tbnQpOyBtOwogCQkJbSA9IHByb3BhZ2F0aW9uX25leHQobSwgZGVzdF9tbnQpKSB7CkBAIC0yNDYsMjcgKzI0NiwyOSBAQAogCQljaGlsZCA9IGNvcHlfdHJlZShzb3VyY2UsIHNvdXJjZS0+bW50Lm1udF9yb290LCB0eXBlKTsKIAkJaWYgKElTX0VSUihjaGlsZCkpIHsKIAkJCXJldCA9IFBUUl9FUlIoY2hpbGQpOwotCQkJbGlzdF9zcGxpY2UodHJlZV9saXN0LCB0bXBfbGlzdC5wcmV2KTsKKwkJCXRtcF9saXN0ID0gKnRyZWVfbGlzdDsKKwkJCXRtcF9saXN0LmZpcnN0LT5wcHJldiA9ICZ0bXBfbGlzdC5maXJzdDsKKwkJCUlOSVRfSExJU1RfSEVBRCh0cmVlX2xpc3QpOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQlpZiAoaXNfc3ViZGlyKGRlc3RfbXAtPm1fZGVudHJ5LCBtLT5tbnQubW50X3Jvb3QpKSB7CiAJCQltbnRfc2V0X21vdW50cG9pbnQobSwgZGVzdF9tcCwgY2hpbGQpOwotCQkJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPm1udF9oYXNoLCB0cmVlX2xpc3QpOworCQkJaGxpc3RfYWRkX2hlYWQoJmNoaWxkLT5tbnRfaGFzaCwgdHJlZV9saXN0KTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHBhcmVudCBtb3VudCB3YXMgYmluZCBtb3VudGVkCiAJCQkgKiBvbiBzb21lIHN1YmRpcmVjdG9yeSBvZiBhIHNoYXJlZC9zbGF2ZSBtb3VudC4KIAkJCSAqLwotCQkJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPm1udF9oYXNoLCAmdG1wX2xpc3QpOworCQkJaGxpc3RfYWRkX2hlYWQoJmNoaWxkLT5tbnRfaGFzaCwgJnRtcF9saXN0KTsKIAkJfQogCQlwcmV2X2Rlc3RfbW50ID0gbTsKIAkJcHJldl9zcmNfbW50ICA9IGNoaWxkOwogCX0KIG91dDoKIAlsb2NrX21vdW50X2hhc2goKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcF9saXN0KSkgewotCQljaGlsZCA9IGxpc3RfZmlyc3RfZW50cnkoJnRtcF9saXN0LCBzdHJ1Y3QgbW91bnQsIG1udF9oYXNoKTsKKwl3aGlsZSAoIWhsaXN0X2VtcHR5KCZ0bXBfbGlzdCkpIHsKKwkJY2hpbGQgPSBobGlzdF9lbnRyeSh0bXBfbGlzdC5maXJzdCwgc3RydWN0IG1vdW50LCBtbnRfaGFzaCk7CiAJCXVtb3VudF90cmVlKGNoaWxkLCAwKTsKIAl9CiAJdW5sb2NrX21vdW50X2hhc2goKTsKQEAgLTMzOCw4ICszNDAsMTAgQEAKIAkJICogdW1vdW50IHRoZSBjaGlsZCBvbmx5IGlmIHRoZSBjaGlsZCBoYXMgbm8KIAkJICogb3RoZXIgY2hpbGRyZW4KIAkJICovCi0JCWlmIChjaGlsZCAmJiBsaXN0X2VtcHR5KCZjaGlsZC0+bW50X21vdW50cykpCi0JCQlsaXN0X21vdmVfdGFpbCgmY2hpbGQtPm1udF9oYXNoLCAmbW50LT5tbnRfaGFzaCk7CisJCWlmIChjaGlsZCAmJiBsaXN0X2VtcHR5KCZjaGlsZC0+bW50X21vdW50cykpIHsKKwkJCWhsaXN0X2RlbF9pbml0X3JjdSgmY2hpbGQtPm1udF9oYXNoKTsKKwkJCWhsaXN0X2FkZF9iZWZvcmVfcmN1KCZjaGlsZC0+bW50X2hhc2gsICZtbnQtPm1udF9oYXNoKTsKKwkJfQogCX0KIH0KIApAQCAtMzUwLDExICszNTQsMTEgQEAKICAqCiAgKiB2ZnNtb3VudCBsb2NrIG11c3QgYmUgaGVsZCBmb3Igd3JpdGUKICAqLwotaW50IHByb3BhZ2F0ZV91bW91bnQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK2ludCBwcm9wYWdhdGVfdW1vdW50KHN0cnVjdCBobGlzdF9oZWFkICpsaXN0KQogewogCXN0cnVjdCBtb3VudCAqbW50OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtbnQsIGxpc3QsIG1udF9oYXNoKQorCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG1udCwgbGlzdCwgbW50X2hhc2gpCiAJCV9fcHJvcGFnYXRlX3Vtb3VudChtbnQpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvcG5vZGUuaCBiL2ZzL3Bub2RlLmgKaW5kZXggNTllN2VkYS4uZmMyOGEyNyAxMDA2NDQKLS0tIGEvZnMvcG5vZGUuaAorKysgYi9mcy9wbm9kZS5oCkBAIC0zNiw4ICszNiw4IEBACiAKIHZvaWQgY2hhbmdlX21udF9wcm9wYWdhdGlvbihzdHJ1Y3QgbW91bnQgKiwgaW50KTsKIGludCBwcm9wYWdhdGVfbW50KHN0cnVjdCBtb3VudCAqLCBzdHJ1Y3QgbW91bnRwb2ludCAqLCBzdHJ1Y3QgbW91bnQgKiwKLQkJc3RydWN0IGxpc3RfaGVhZCAqKTsKLWludCBwcm9wYWdhdGVfdW1vdW50KHN0cnVjdCBsaXN0X2hlYWQgKik7CisJCXN0cnVjdCBobGlzdF9oZWFkICopOworaW50IHByb3BhZ2F0ZV91bW91bnQoc3RydWN0IGhsaXN0X2hlYWQgKik7CiBpbnQgcHJvcGFnYXRlX21vdW50X2J1c3koc3RydWN0IG1vdW50ICosIGludCk7CiB2b2lkIG1udF9yZWxlYXNlX2dyb3VwX2lkKHN0cnVjdCBtb3VudCAqKTsKIGludCBnZXRfZG9taW5hdGluZ19pZChzdHJ1Y3QgbW91bnQgKm1udCwgY29uc3Qgc3RydWN0IHBhdGggKnJvb3QpOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9zdGF0LmMgYi9mcy9wcm9jL3N0YXQuYwppbmRleCA2ZjU5OWM2Li45ZDIzMWU5IDEwMDY0NAotLS0gYS9mcy9wcm9jL3N0YXQuYworKysgYi9mcy9wcm9jL3N0YXQuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycW5yLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHV0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogCiAjaWZuZGVmIGFyY2hfaXJxX3N0YXRfY3B1CmRpZmYgLS1naXQgYS9mcy9wcm9jL3VwdGltZS5jIGIvZnMvcHJvYy91cHRpbWUuYwppbmRleCA3MTQxYjhkLi4zM2RlNTY3IDEwMDY0NAotLS0gYS9mcy9wcm9jL3VwdGltZS5jCisrKyBiL2ZzL3Byb2MvdXB0aW1lLmMKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KIAogc3RhdGljIGludCB1cHRpbWVfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA1NGUxOWI5Li4zMWM2ZWZhIDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJdW5zaWduZWQgaW50LCB3aGVuY2UpCiB7CiAJaW50IHJldHZhbDsKLQlzdHJ1Y3QgZmQgZiA9IGZkZ2V0KGZkKTsKKwlzdHJ1Y3QgZmQgZiA9IGZkZ2V0X3BvcyhmZCk7CiAJbG9mZl90IG9mZnNldDsKIAogCWlmICghZi5maWxlKQpAQCAtMzI3LDcgKzMyNyw3IEBACiAJCQlyZXR2YWwgPSAwOwogCX0KIG91dF9wdXRmOgotCWZkcHV0KGYpOworCWZkcHV0X3BvcyhmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogI2VuZGlmCkBAIC05OTQsOSArOTk0LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1DT01QQVRfU1lTQ0FMTF9ERUZJTkU0KHByZWFkdjY0LCB1bnNpZ25lZCBsb25nLCBmZCwKLQkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKix2ZWMsCi0JCXVuc2lnbmVkIGxvbmcsIHZsZW4sIGxvZmZfdCwgcG9zKQorc3RhdGljIGxvbmcgX19jb21wYXRfc3lzX3ByZWFkdjY0KHVuc2lnbmVkIGxvbmcgZmQsCisJCQkJICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyB2bGVuLCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBmZCBmOwogCXNzaXplX3QgcmV0OwpAQCAtMTAxMywxMiArMTAxMywyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1BSRUFEVjY0CitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KHByZWFkdjY0LCB1bnNpZ25lZCBsb25nLCBmZCwKKwkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKix2ZWMsCisJCXVuc2lnbmVkIGxvbmcsIHZsZW4sIGxvZmZfdCwgcG9zKQoreworCXJldHVybiBfX2NvbXBhdF9zeXNfcHJlYWR2NjQoZmQsIHZlYywgdmxlbiwgcG9zKTsKK30KKyNlbmRpZgorCiBDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHByZWFkdiwgY29tcGF0X3Vsb25nX3QsIGZkLAogCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKIAkJY29tcGF0X3Vsb25nX3QsIHZsZW4sIHUzMiwgcG9zX2xvdywgdTMyLCBwb3NfaGlnaCkKIHsKIAlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcG9zX2hpZ2ggPDwgMzIpIHwgcG9zX2xvdzsKLQlyZXR1cm4gY29tcGF0X3N5c19wcmVhZHY2NChmZCwgdmVjLCB2bGVuLCBwb3MpOworCisJcmV0dXJuIF9fY29tcGF0X3N5c19wcmVhZHY2NChmZCwgdmVjLCB2bGVuLCBwb3MpOwogfQogCiBzdGF0aWMgc2l6ZV90IGNvbXBhdF93cml0ZXYoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xMDYxLDkgKzEwNzEsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLUNPTVBBVF9TWVNDQUxMX0RFRklORTQocHdyaXRldjY0LCB1bnNpZ25lZCBsb25nLCBmZCwKLQkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKix2ZWMsCi0JCXVuc2lnbmVkIGxvbmcsIHZsZW4sIGxvZmZfdCwgcG9zKQorc3RhdGljIGxvbmcgX19jb21wYXRfc3lzX3B3cml0ZXY2NCh1bnNpZ25lZCBsb25nIGZkLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsCisJCQkJICAgdW5zaWduZWQgbG9uZyB2bGVuLCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBmZCBmOwogCXNzaXplX3QgcmV0OwpAQCAtMTA4MCwxMiArMTA5MCwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1BXUklURVY2NAorQ09NUEFUX1NZU0NBTExfREVGSU5FNChwd3JpdGV2NjQsIHVuc2lnbmVkIGxvbmcsIGZkLAorCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKKwkJdW5zaWduZWQgbG9uZywgdmxlbiwgbG9mZl90LCBwb3MpCit7CisJcmV0dXJuIF9fY29tcGF0X3N5c19wd3JpdGV2NjQoZmQsIHZlYywgdmxlbiwgcG9zKTsKK30KKyNlbmRpZgorCiBDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHB3cml0ZXYsIGNvbXBhdF91bG9uZ190LCBmZCwKIAkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKix2ZWMsCiAJCWNvbXBhdF91bG9uZ190LCB2bGVuLCB1MzIsIHBvc19sb3csIHUzMiwgcG9zX2hpZ2gpCiB7CiAJbG9mZl90IHBvcyA9ICgobG9mZl90KXBvc19oaWdoIDw8IDMyKSB8IHBvc19sb3c7Ci0JcmV0dXJuIGNvbXBhdF9zeXNfcHdyaXRldjY0KGZkLCB2ZWMsIHZsZW4sIHBvcyk7CisKKwlyZXR1cm4gX19jb21wYXRfc3lzX3B3cml0ZXY2NChmZCwgdmVjLCB2bGVuLCBwb3MpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL0tjb25maWcgYi9mcy9zeXNmcy9LY29uZmlnCmluZGV4IDhjNDFmZWEuLmIyNzU2MDEgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL0tjb25maWcKKysrIGIvZnMvc3lzZnMvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBTWVNGUwogCWJvb2wgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQorCXNlbGVjdCBLRVJORlMKIAloZWxwCiAJVGhlIHN5c2ZzIGZpbGVzeXN0ZW0gaXMgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0gdGhhdCB0aGUga2VybmVsIHVzZXMgdG8KIAlleHBvcnQgaW50ZXJuYWwga2VybmVsIG9iamVjdHMsIHRoZWlyIGF0dHJpYnV0ZXMsIGFuZCB0aGVpcgpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZGlyLmMgYi9mcy9zeXNmcy9kaXIuYwppbmRleCBlZTBkNzYxLi4wYjQ1ZmY0IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtMTksMzkgKzE5LDE4IEBACiAKIERFRklORV9TUElOTE9DSyhzeXNmc19zeW1saW5rX3RhcmdldF9sb2NrKTsKIAotLyoqCi0gKglzeXNmc19wYXRobmFtZSAtIHJldHVybiBmdWxsIHBhdGggdG8gc3lzZnMgZGlyZW50Ci0gKglAa246IGtlcm5mc19ub2RlIHdob3NlIHBhdGggd2Ugd2FudAotICoJQHBhdGg6IGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIG9mIHNpemUgUEFUSF9NQVgKLSAqCi0gKglHaXZlcyB0aGUgbmFtZSAiLyIgdG8gdGhlIHN5c2ZzX3Jvb3QgZW50cnk7IGFueSBwYXRoIHJldHVybmVkCi0gKglpcyByZWxhdGl2ZSB0byB3aGVyZXZlciBzeXNmcyBpcyBtb3VudGVkLgotICovCi1zdGF0aWMgY2hhciAqc3lzZnNfcGF0aG5hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqcGF0aCkKLXsKLQlpZiAoa24tPnBhcmVudCkgewotCQlzeXNmc19wYXRobmFtZShrbi0+cGFyZW50LCBwYXRoKTsKLQkJc3RybGNhdChwYXRoLCAiLyIsIFBBVEhfTUFYKTsKLQl9Ci0Jc3RybGNhdChwYXRoLCBrbi0+bmFtZSwgUEFUSF9NQVgpOwotCXJldHVybiBwYXRoOwotfQotCiB2b2lkIHN5c2ZzX3dhcm5fZHVwKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQogewotCWNoYXIgKnBhdGg7CisJY2hhciAqYnVmLCAqcGF0aCA9IE5VTEw7CiAKLQlwYXRoID0ga3phbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBhdGgpIHsKLQkJc3lzZnNfcGF0aG5hbWUocGFyZW50LCBwYXRoKTsKLQkJc3RybGNhdChwYXRoLCAiLyIsIFBBVEhfTUFYKTsKLQkJc3RybGNhdChwYXRoLCBuYW1lLCBQQVRIX01BWCk7Ci0JfQorCWJ1ZiA9IGt6YWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOworCWlmIChidWYpCisJCXBhdGggPSBrZXJuZnNfcGF0aChwYXJlbnQsIGJ1ZiwgUEFUSF9NQVgpOwogCi0JV0FSTigxLCBLRVJOX1dBUk5JTkcgInN5c2ZzOiBjYW5ub3QgY3JlYXRlIGR1cGxpY2F0ZSBmaWxlbmFtZSAnJXMnXG4iLAotCSAgICAgcGF0aCA/IHBhdGggOiBuYW1lKTsKKwlXQVJOKDEsIEtFUk5fV0FSTklORyAic3lzZnM6IGNhbm5vdCBjcmVhdGUgZHVwbGljYXRlIGZpbGVuYW1lICclcy8lcydcbiIsCisJICAgICBwYXRoLCBuYW1lKTsKIAotCWtmcmVlKHBhdGgpOworCWtmcmVlKGJ1Zik7CiB9CiAKIC8qKgpAQCAtMTIyLDkgKzEwMSwxMyBAQAogaW50IHN5c2ZzX3JlbmFtZV9kaXJfbnMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lLAogCQkJY29uc3Qgdm9pZCAqbmV3X25zKQogewotCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga29iai0+c2QtPnBhcmVudDsKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudDsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIGtlcm5mc19yZW5hbWVfbnMoa29iai0+c2QsIHBhcmVudCwgbmV3X25hbWUsIG5ld19ucyk7CisJcGFyZW50ID0ga2VybmZzX2dldF9wYXJlbnQoa29iai0+c2QpOworCXJldCA9IGtlcm5mc19yZW5hbWVfbnMoa29iai0+c2QsIHBhcmVudCwgbmV3X25hbWUsIG5ld19ucyk7CisJa2VybmZzX3B1dChwYXJlbnQpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBzeXNmc19tb3ZlX2Rpcl9ucyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKm5ld19wYXJlbnRfa29iaiwKQEAgLTEzMyw3ICsxMTYsNiBAQAogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa24gPSBrb2JqLT5zZDsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQ7CiAKLQlCVUdfT04oIWtuLT5wYXJlbnQpOwogCW5ld19wYXJlbnQgPSBuZXdfcGFyZW50X2tvYmogJiYgbmV3X3BhcmVudF9rb2JqLT5zZCA/CiAJCW5ld19wYXJlbnRfa29iai0+c2QgOiBzeXNmc19yb290X2tuOwogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9maWxlLmMgYi9mcy9zeXNmcy9maWxlLmMKaW5kZXggODEwY2Y2ZS4uMWI4YjkxYiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZmlsZS5jCisrKyBiL2ZzL3N5c2ZzL2ZpbGUuYwpAQCAtMzcyLDYgKzM3MiwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2ZpbGVfbnMpOwogCisvKioKKyAqIHN5c2ZzX3JlbW92ZV9maWxlX3NlbGYgLSByZW1vdmUgYW4gb2JqZWN0IGF0dHJpYnV0ZSBmcm9tIGl0cyBvd24gbWV0aG9kCisgKiBAa29iajogb2JqZWN0IHdlJ3JlIGFjdGluZyBmb3IKKyAqIEBhdHRyOiBhdHRyaWJ1dGUgZGVzY3JpcHRvcgorICoKKyAqIFNlZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBmb3IgZGV0YWlscy4KKyAqLworYm9vbCBzeXNmc19yZW1vdmVfZmlsZV9zZWxmKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKQoreworCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga29iai0+c2Q7CisJc3RydWN0IGtlcm5mc19ub2RlICprbjsKKwlib29sIHJldDsKKworCWtuID0ga2VybmZzX2ZpbmRfYW5kX2dldChwYXJlbnQsIGF0dHItPm5hbWUpOworCWlmIChXQVJOX09OX09OQ0UoIWtuKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0ID0ga2VybmZzX3JlbW92ZV9zZWxmKGtuKTsKKworCWtlcm5mc19wdXQoa24pOworCXJldHVybiByZXQ7Cit9CisKIHZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICoqcHRyKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKaW5kZXggNmI1NzkzOC4uYWEwNDA2OCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZ3JvdXAuYworKysgYi9mcy9zeXNmcy9ncm91cC5jCkBAIC03MCw4ICs3MCwxMSBAQAogCWlmIChncnAtPmJpbl9hdHRycykgewogCQlmb3IgKGJpbl9hdHRyID0gZ3JwLT5iaW5fYXR0cnM7ICpiaW5fYXR0cjsgYmluX2F0dHIrKykgewogCQkJaWYgKHVwZGF0ZSkKLQkJCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoa29iaiwgKmJpbl9hdHRyKTsKLQkJCWVycm9yID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGtvYmosICpiaW5fYXR0cik7CisJCQkJa2VybmZzX3JlbW92ZV9ieV9uYW1lKHBhcmVudCwKKwkJCQkJCSgqYmluX2F0dHIpLT5hdHRyLm5hbWUpOworCQkJZXJyb3IgPSBzeXNmc19hZGRfZmlsZV9tb2RlX25zKHBhcmVudCwKKwkJCQkJJigqYmluX2F0dHIpLT5hdHRyLCB0cnVlLAorCQkJCQkoKmJpbl9hdHRyKS0+YXR0ci5tb2RlLCBOVUxMKTsKIAkJCWlmIChlcnJvcikKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvbW91bnQuYyBiL2ZzL3N5c2ZzL21vdW50LmMKaW5kZXggM2VhZjVjNi4uYTY2YWQ2MSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvbW91bnQuYworKysgYi9mcy9zeXNmcy9tb3VudC5jCkBAIC02Myw3ICs2Myw3IEBACiB7CiAJaW50IGVycjsKIAotCXN5c2ZzX3Jvb3QgPSBrZXJuZnNfY3JlYXRlX3Jvb3QoTlVMTCwgTlVMTCk7CisJc3lzZnNfcm9vdCA9IGtlcm5mc19jcmVhdGVfcm9vdChOVUxMLCAwLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHN5c2ZzX3Jvb3QpKQogCQlyZXR1cm4gUFRSX0VSUihzeXNmc19yb290KTsKIApkaWZmIC0tZ2l0IGEvZnMvdGltZXJmZC5jIGIvZnMvdGltZXJmZC5jCmluZGV4IDkyOTMxMjEuLjAwMTMxNDIgMTAwNjQ0Ci0tLSBhL2ZzL3RpbWVyZmQuYworKysgYi9mcy90aW1lcmZkLmMKQEAgLTMxNyw2ICszMTcsNyBAQAogCSAgICAoY2xvY2tpZCAhPSBDTE9DS19NT05PVE9OSUMgJiYKIAkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfUkVBTFRJTUUgJiYKIAkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfUkVBTFRJTUVfQUxBUk0gJiYKKwkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfQk9PVFRJTUUgJiYKIAkgICAgIGNsb2NraWQgIT0gQ0xPQ0tfQk9PVFRJTUVfQUxBUk0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfbnVtYS5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfbnVtYS5oCmluZGV4IDQ1MTgyM2MuLjk0YTM3Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX251bWEuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmgKQEAgLTEzLDcgKzEzLDYgQEAKIAogZXh0ZXJuIGludCBweG1fdG9fbm9kZShpbnQpOwogZXh0ZXJuIGludCBub2RlX3RvX3B4bShpbnQpOwotZXh0ZXJuIHZvaWQgX19hY3BpX21hcF9weG1fdG9fbm9kZShpbnQsIGludCk7CiBleHRlcm4gaW50IGFjcGlfbWFwX3B4bV90b19ub2RlKGludCk7CiBleHRlcm4gdW5zaWduZWQgY2hhciBhY3BpX3NyYXRfcmV2aXNpb247CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2NvbnN0X2h3ZWlnaHQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2NvbnN0X2h3ZWlnaHQuaAppbmRleCBmYTJhNTBiLi4wYTdlMDY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9jb25zdF9od2VpZ2h0LmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvY29uc3RfaHdlaWdodC5oCkBAIC01LDE0ICs1LDE1IEBACiAgKiBDb21waWxlIHRpbWUgdmVyc2lvbnMgb2YgX19hcmNoX2h3ZWlnaHROKCkKICAqLwogI2RlZmluZSBfX2NvbnN0X2h3ZWlnaHQ4KHcpCQlcCi0gICAgICAoCSghISgodykgJiAoMVVMTCA8PCAwKSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCAxKSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCAyKSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCAzKSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCA0KSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCA1KSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCA2KSkpICsJXAotCSghISgodykgJiAoMVVMTCA8PCA3KSkpCSkKKwkoKHVuc2lnbmVkIGludCkJCQlcCisJICgoISEoKHcpICYgKDFVTEwgPDwgMCkpKSArCVwKKwkgICghISgodykgJiAoMVVMTCA8PCAxKSkpICsJXAorCSAgKCEhKCh3KSAmICgxVUxMIDw8IDIpKSkgKwlcCisJICAoISEoKHcpICYgKDFVTEwgPDwgMykpKSArCVwKKwkgICghISgodykgJiAoMVVMTCA8PCA0KSkpICsJXAorCSAgKCEhKCh3KSAmICgxVUxMIDw8IDUpKSkgKwlcCisJICAoISEoKHcpICYgKDFVTEwgPDwgNikpKSArCVwKKwkgICghISgodykgJiAoMVVMTCA8PCA3KSkpKSkKIAogI2RlZmluZSBfX2NvbnN0X2h3ZWlnaHQxNih3KSAoX19jb25zdF9od2VpZ2h0OCh3KSAgKyBfX2NvbnN0X2h3ZWlnaHQ4KCh3KSAgPj4gOCApKQogI2RlZmluZSBfX2NvbnN0X2h3ZWlnaHQzMih3KSAoX19jb25zdF9od2VpZ2h0MTYodykgKyBfX2NvbnN0X2h3ZWlnaHQxNigodykgPj4gMTYpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX2ppZmZpZXMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvY3B1dGltZV9qaWZmaWVzLmgKaW5kZXggMjcyZWNiYS4uZDVjYjc4ZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvY3B1dGltZV9qaWZmaWVzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX2ppZmZpZXMuaApAQCAtMTUsOCArMTUsMTAgQEAKIAogCiAvKgotICogQ29udmVydCBuYW5vc2Vjb25kcyB0byBjcHV0aW1lCisgKiBDb252ZXJ0IG5hbm9zZWNvbmRzIDwtPiBjcHV0aW1lCiAgKi8KKyNkZWZpbmUgY3B1dGltZV90b19uc2VjcyhfX2N0KQkJXAorCWppZmZpZXNfdG9fbnNlY3MoY3B1dGltZV90b19qaWZmaWVzKF9fY3QpKQogI2RlZmluZSBuc2Vjc190b19jcHV0aW1lNjQoX19uc2VjKQlcCiAJamlmZmllczY0X3RvX2NwdXRpbWU2NChuc2Vjc190b19qaWZmaWVzNjQoX19uc2VjKSkKICNkZWZpbmUgbnNlY3NfdG9fY3B1dGltZShfX25zZWMpCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvY3B1dGltZV9uc2Vjcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmgKaW5kZXggMmM5ZTYyYy4uNGU4MTc2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmgKQEAgLTQ0LDcgKzQ0LDEwIEBACiAvKgogICogQ29udmVydCBjcHV0aW1lIDwtPiBuYW5vc2Vjb25kcwogICovCi0jZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWUoX19uc2VjcykJKChfX2ZvcmNlIHU2NCkoX19uc2VjcykpCisjZGVmaW5lIGNwdXRpbWVfdG9fbnNlY3MoX19jdCkJCVwKKwkoX19mb3JjZSB1NjQpKF9fY3QpCisjZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWUoX19uc2VjcykJXAorCShfX2ZvcmNlIGNwdXRpbWVfdCkoX19uc2VjcykKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tY3Nfc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWNzX3NwaW5sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjZDRmZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWNzX3NwaW5sb2NrLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0FTTV9NQ1NfU1BJTkxPQ0tfSAorI2RlZmluZSBfX0FTTV9NQ1NfU1BJTkxPQ0tfSAorCisvKgorICogQXJjaGl0ZWN0dXJlcyBjYW4gZGVmaW5lIHRoZWlyIG93bjoKKyAqCisgKiAgIGFyY2hfbWNzX3NwaW5fbG9ja19jb250ZW5kZWQobCkKKyAqICAgYXJjaF9tY3Nfc3Bpbl91bmxvY2tfY29udGVuZGVkKGwpCisgKgorICogU2VlIGtlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5jLgorICovCisKKyNlbmRpZiAvKiBfX0FTTV9NQ1NfU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCAzNGM3YmRjLi4xZWMwOGMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtMTkzLDYgKzE5MywxOSBAQAogfQogI2VuZGlmCiAKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFX1VOVVNFRAorLyoKKyAqIFNvbWUgYXJjaGl0ZWN0dXJlcyBwcm92aWRlIGZhY2lsaXRpZXMgdG8gdmlydHVhbGl6YXRpb24gZ3Vlc3RzCisgKiBzbyB0aGF0IHRoZXkgY2FuIGZsYWcgYWxsb2NhdGVkIHBhZ2VzIGFzIHVudXNlZC4gVGhpcyBhbGxvd3MgdGhlCisgKiBob3N0IHRvIHRyYW5zcGFyZW50bHkgcmVjbGFpbSB1bnVzZWQgcGFnZXMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICogd2hldGhlciB0aGUgcHRlJ3MgcGFnZSBpcyB1bnVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV91bnVzZWQocHRlX3QgcHRlKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNpZm5kZWYgX19IQVZFX0FSQ0hfUE1EX1NBTUUKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIHN0YXRpYyBpbmxpbmUgaW50IHBtZF9zYW1lKHBtZF90IHBtZF9hLCBwbWRfdCBwbWRfYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcndzZW0uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcndzZW0uaAppbmRleCBiYjFlMmNkLi5kNDhiZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3J3c2VtLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9yd3NlbS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1BPV0VSUENfUldTRU1fSAotI2RlZmluZSBfQVNNX1BPV0VSUENfUldTRU1fSAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfUldTRU1fSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfUldTRU1fSAogCiAjaWZuZGVmIF9MSU5VWF9SV1NFTV9ICiAjZXJyb3IgIlBsZWFzZSBkb24ndCBpbmNsdWRlIDxhc20vcndzZW0uaD4gZGlyZWN0bHksIHVzZSA8bGludXgvcndzZW0uaD4gaW5zdGVhZC4iCkBAIC04LDcgKzgsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKLSAqIFIvVyBzZW1hcGhvcmVzIGZvciBQUEMgdXNpbmcgdGhlIHN0dWZmIGluIGxpYi9yd3NlbS5jLgorICogUi9XIHNlbWFwaG9yZXMgb3JpZ2luYWxseSBmb3IgUFBDIHVzaW5nIHRoZSBzdHVmZiBpbiBsaWIvcndzZW0uYy4KICAqIEFkYXB0ZWQgbGFyZ2VseSBmcm9tIGluY2x1ZGUvYXNtLWkzODYvcndzZW0uaAogICogYnkgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+LgogICovCkBAIC0xNiw3ICsxNiw3IEBACiAvKgogICogdGhlIHNlbWFwaG9yZSBkZWZpbml0aW9uCiAgKi8KLSNpZmRlZiBDT05GSUdfUFBDNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICMgZGVmaW5lIFJXU0VNX0FDVElWRV9NQVNLCQkweGZmZmZmZmZmTAogI2Vsc2UKICMgZGVmaW5lIFJXU0VNX0FDVElWRV9NQVNLCQkweDAwMDBmZmZmTApAQCAtMTI5LDQgKzEyOSw0IEBACiB9CiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYJLyogX0FTTV9QT1dFUlBDX1JXU0VNX0ggKi8KKyNlbmRpZgkvKiBfQVNNX0dFTkVSSUNfUldTRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LW1pY2JpYXMuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC1taWNiaWFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjYjc3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC1taWNiaWFzLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9fRFRfVExWMzIwQUlDMzFYWF9NSUNCSUFTX0gKKyNkZWZpbmUgX19EVF9UTFYzMjBBSUMzMVhYX01JQ0JJQVNfSAorCisjZGVmaW5lIE1JQ0JJQVNfMl8wVgkJMQorI2RlZmluZSBNSUNCSUFTXzJfNVYJCTIKKyNkZWZpbmUgTUlDQklBU19BVkREVgkJMworCisjZW5kaWYgLyogX19EVF9UTFYzMjBBSUMzMVhYX01JQ0JJQVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9zcG1pL3NwbWkuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZTFlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmgKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fRFRfQklORElOR1NfU1BNSV9ICisjZGVmaW5lIF9fRFRfQklORElOR1NfU1BNSV9ICisKKyNkZWZpbmUgU1BNSV9VU0lECTAKKyNkZWZpbmUgU1BNSV9HU0lECTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDZhMTVkZGQuLjdhOGYyY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0yNjMsMTQgKzI2Myw5IEBACiBleHRlcm4gdm9pZCBhY3BpX29zaV9zZXR1cChjaGFyICpzdHIpOwogCiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQotaW50IGFjcGlfZ2V0X3B4bShhY3BpX2hhbmRsZSBoYW5kbGUpOwotaW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgKmhhbmRsZSk7CitpbnQgYWNwaV9nZXRfbm9kZShhY3BpX2hhbmRsZSBoYW5kbGUpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGFjcGlfZ2V0X3B4bShhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBhY3BpX2dldF9ub2RlKGFjcGlfaGFuZGxlICpoYW5kbGUpCitzdGF0aWMgaW5saW5lIGludCBhY3BpX2dldF9ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWhjaV9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9saW51eC9haGNpX3BsYXRmb3JtLmgKaW5kZXggNzNhMjUwMC4uMWYxNmQ1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9haGNpX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9saW51eC9haGNpX3BsYXRmb3JtLmgKQEAgLTE5LDE1ICsxOSwzNyBAQAogCiBzdHJ1Y3QgZGV2aWNlOwogc3RydWN0IGF0YV9wb3J0X2luZm87CitzdHJ1Y3QgYWhjaV9ob3N0X3ByaXY7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogCisvKgorICogTm90ZSBhaGNpX3BsYXRmb3JtX2RhdGEgaXMgZGVwcmVjYXRlZCwgaXQgaXMgb25seSBrZXB0IGFyb3VuZCBmb3IgdXNlCisgKiBieSB0aGUgb2xkIGRhODUwIGFuZCBzcGVhcjEzeHggYWhjaSBjb2RlLgorICogTmV3IGRyaXZlcnMgc2hvdWxkIGluc3RlYWQgZGVjbGFyZSB0aGVpciBvd24gcGxhdGZvcm1fZHJpdmVyIHN0cnVjdCwgYW5kCisgKiB1c2UgYWhjaV9wbGF0Zm9ybSogZnVuY3Rpb25zIGluIHRoZWlyIG93biBwcm9iZSwgc3VzcGVuZCBhbmQgcmVzdW1lIG1ldGhvZHMuCisgKi8KIHN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgewogCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICphZGRyKTsKIAl2b2lkICgqZXhpdCkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqYXRhX3BvcnRfaW5mbzsKLQl1bnNpZ25lZCBpbnQgZm9yY2VfcG9ydF9tYXA7Ci0JdW5zaWduZWQgaW50IG1hc2tfcG9ydF9tYXA7CiB9OwogCitpbnQgYWhjaV9wbGF0Zm9ybV9lbmFibGVfY2xrcyhzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KTsKK3ZvaWQgYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX2Nsa3Moc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdik7CitpbnQgYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYpOwordm9pZCBhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYpOworc3RydWN0IGFoY2lfaG9zdF9wcml2ICphaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMoCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CitpbnQgYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3Qoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwaV90ZW1wbGF0ZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgZm9yY2VfcG9ydF9tYXAsCisJCQkgICAgdW5zaWduZWQgaW50IG1hc2tfcG9ydF9tYXApOworCitpbnQgYWhjaV9wbGF0Zm9ybV9zdXNwZW5kX2hvc3Qoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBhaGNpX3BsYXRmb3JtX3Jlc3VtZV9ob3N0KHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgYWhjaV9wbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgYWhjaV9wbGF0Zm9ybV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKKwogI2VuZGlmIC8qIF9BSENJX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtZWwtc3NjLmggYi9pbmNsdWRlL2xpbnV4L2F0bWVsLXNzYy5oCmluZGV4IDY2YTBlNTMuLjU3MWExMmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtZWwtc3NjLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1lbC1zc2MuaApAQCAtMTgsNiArMTgsNyBAQAogCXN0cnVjdCBjbGsJCSpjbGs7CiAJaW50CQkJdXNlcjsKIAlpbnQJCQlpcnE7CisJYm9vbAkJCWNsa19mcm9tX3JrX3BpbjsKIH07CiAKIHN0cnVjdCBzc2NfZGV2aWNlICogX19tdXN0X2NoZWNrIHNzY19yZXF1ZXN0KHVuc2lnbmVkIGludCBzc2NfbnVtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0b3BzLmggYi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCmluZGV4IGFiYzljYTcuLmJlNWZkMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRvcHMuaApAQCAtMTk2LDYgKzE5NiwyMSBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaWZuZGVmIHNldF9tYXNrX2JpdHMKKyNkZWZpbmUgc2V0X21hc2tfYml0cyhwdHIsIF9tYXNrLCBfYml0cykJXAorKHsJCQkJCQkJCVwKKwljb25zdCB0eXBlb2YoKnB0cikgbWFzayA9IChfbWFzayksIGJpdHMgPSAoX2JpdHMpOwlcCisJdHlwZW9mKCpwdHIpIG9sZCwgbmV3OwkJCQkJXAorCQkJCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCW9sZCA9IEFDQ0VTU19PTkNFKCpwdHIpOwkJCVwKKwkJbmV3ID0gKG9sZCAmIH5tYXNrKSB8IGJpdHM7CQkJXAorCX0gd2hpbGUgKGNtcHhjaGcocHRyLCBvbGQsIG5ldykgIT0gb2xkKTsJCVwKKwkJCQkJCQkJXAorCW5ldzsJCQkJCQkJXAorfSkKKyNlbmRpZgorCiAjaWZuZGVmIGZpbmRfbGFzdF9iaXQKIC8qKgogICogZmluZF9sYXN0X2JpdCAtIGZpbmQgdGhlIGxhc3Qgc2V0IGJpdCBpbiBhIG1lbW9yeSByZWdpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvcG9sbC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9wb2xsLmgKaW5kZXggMzA4NzM0ZC4uNzdhZTc3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGstaW9wb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGstaW9wb2xsLmgKQEAgLTQzLDYgKzQzLDQgQEAKIGV4dGVybiB2b2lkIGJsa19pb3BvbGxfZW5hYmxlKHN0cnVjdCBibGtfaW9wb2xsICopOwogZXh0ZXJuIHZvaWQgYmxrX2lvcG9sbF9kaXNhYmxlKHN0cnVjdCBibGtfaW9wb2xsICopOwogCi1leHRlcm4gaW50IGJsa19pb3BvbGxfZW5hYmxlZDsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oIGIvaW5jbHVkZS9saW51eC9ibGstbXEuaAppbmRleCAyZmYyZThkLi4wMTIwNDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrLW1xLmgKQEAgLTEwOSw3ICsxMDksNyBAQAogCUJMS19NUV9GX1NIT1VMRF9TT1JUCT0gMSA8PCAxLAogCUJMS19NUV9GX1NIT1VMRF9JUEkJPSAxIDw8IDIsCiAKLQlCTEtfTVFfU19TVE9QUEVECT0gMSA8PCAwLAorCUJMS19NUV9TX1NUT1BQRUQJPSAwLAogCiAJQkxLX01RX01BWF9ERVBUSAk9IDIwNDgsCiB9OwpAQCAtMTE3LDcgKzExNyw4IEBACiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX21xX2luaXRfcXVldWUoc3RydWN0IGJsa19tcV9yZWcgKiwgdm9pZCAqKTsKIGludCBibGtfbXFfcmVnaXN0ZXJfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqKTsKIHZvaWQgYmxrX21xX3VucmVnaXN0ZXJfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqKTsKLXZvaWQgYmxrX21xX2luaXRfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdm9pZCAoKmluaXQpKHZvaWQgKmRhdGEsIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosIHN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksIHZvaWQgKmRhdGEpOworaW50IGJsa19tcV9pbml0X2NvbW1hbmRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCAoKmluaXQpKHZvaWQgKmRhdGEsIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosIHN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksIHZvaWQgKmRhdGEpOwordm9pZCBibGtfbXFfZnJlZV9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSwgc3RydWN0IGJsa19tcV9od19jdHggKiwgc3RydWN0IHJlcXVlc3QgKiwgdW5zaWduZWQgaW50KSwgdm9pZCAqZGF0YSk7CiAKIHZvaWQgYmxrX21xX2ZsdXNoX3BsdWdfbGlzdChzdHJ1Y3QgYmxrX3BsdWcgKnBsdWcsIGJvb2wgZnJvbV9zY2hlZHVsZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDRhZmE0ZjguLjFlMWZhM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtOTksNiArOTksNyBAQAogCXVuaW9uIHsKIAkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgY3NkOwogCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbXFfZmx1c2hfd29yazsKKwkJdW5zaWduZWQgbG9uZyBmaWZvX3RpbWU7CiAJfTsKIAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAppbmRleCA0OTNhYTAyLi4yZTRjYjY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaApAQCAtNjIsNiArNjIsMTEgQEAKICNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfRFlOSVJRCQkweDAwMDAyMAogI2RlZmluZSBDTE9DS19FVlRfRkVBVF9QRVJDUFUJCTB4MDAwMDQwCiAKKy8qCisgKiBDbG9ja2V2ZW50IGRldmljZSBpcyBiYXNlZCBvbiBhIGhydGltZXIgZm9yIGJyb2FkY2FzdAorICovCisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX0hSVElNRVIJCTB4MDAwMDgwCisKIC8qKgogICogc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAtIGNsb2NrIGV2ZW50IGRldmljZSBkZXNjcmlwdG9yCiAgKiBAZXZlbnRfaGFuZGxlcjoJQXNzaWduZWQgYnkgdGhlIGZyYW1ld29yayB0byBiZSBjYWxsZWQgYnkgdGhlIGxvdwpAQCAtODMsNiArODgsNyBAQAogICogQG5hbWU6CQlwdHIgdG8gY2xvY2sgZXZlbnQgbmFtZQogICogQHJhdGluZzoJCXZhcmlhYmxlIHRvIHJhdGUgY2xvY2sgZXZlbnQgZGV2aWNlcwogICogQGlycToJCUlSUSBudW1iZXIgKG9ubHkgZm9yIG5vbiBDUFUgbG9jYWwgZGV2aWNlcykKKyAqIEBib3VuZF9vbjoJCUJvdW5kIG9uIENQVQogICogQGNwdW1hc2s6CQljcHVtYXNrIHRvIGluZGljYXRlIGZvciB3aGljaCBDUFVzIHRoaXMgZGV2aWNlIHdvcmtzCiAgKiBAbGlzdDoJCWxpc3QgaGVhZCBmb3IgdGhlIG1hbmFnZW1lbnQgY29kZQogICogQG93bmVyOgkJbW9kdWxlIHJlZmVyZW5jZQpAQCAtMTEzLDYgKzExOSw3IEBACiAJY29uc3QgY2hhcgkJKm5hbWU7CiAJaW50CQkJcmF0aW5nOwogCWludAkJCWlycTsKKwlpbnQJCQlib3VuZF9vbjsKIAljb25zdCBzdHJ1Y3QgY3B1bWFzawkqY3B1bWFzazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwpAQCAtMTgwLDE1ICsxODcsMTcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpICYmIGRlZmluZWQoQ09ORklHX1RJQ0tfT05FU0hPVCkKK2V4dGVybiB2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCk7CiBleHRlcm4gaW50IHRpY2tfY2hlY2tfYnJvYWRjYXN0X2V4cGlyZWQodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZXhwaXJlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zZXR1cF9ocnRpbWVyX2Jyb2FkY2FzdCh2b2lkKSB7fTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKLWV4dGVybiB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykge30KK3N0YXRpYyBpbmxpbmUgaW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAogI2Vsc2UgLyogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQgKi8KQEAgLTE5Niw4ICsyMDUsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX3N1c3BlbmQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja2V2ZW50c19yZXN1bWUodm9pZCkge30KIAotc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKSB7fQorc3RhdGljIGlubGluZSBpbnQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfY2hlY2tfYnJvYWRjYXN0X2V4cGlyZWQodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCkge307CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaAppbmRleCAzZjQ0OGM2Li5lNjQ5NDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgkvKiBmb3IgYWlvX2NvbnRleHRfdCAqLworI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogCiAjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9zaWdpbmZvLmg+CkBAIC0yNyw2ICsyOCw5IEBACiAjZGVmaW5lIF9fU0NfREVMT1VTRSh0LHYpICgodCkodW5zaWduZWQgbG9uZykodikpCiAjZW5kaWYKIAorI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKG5hbWUpIFwKKwlhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c18jI25hbWUodm9pZCkKKwogI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKG5hbWUsIC4uLikgXAogICAgICAgICBDT01QQVRfU1lTQ0FMTF9ERUZJTkV4KDEsIF8jI25hbWUsIF9fVkFfQVJHU19fKQogI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKG5hbWUsIC4uLikgXApAQCAtNjgsNiArNzIsOCBAQAogdHlwZWRlZiBfX2NvbXBhdF91aWQzMl90CWNvbXBhdF91aWRfdDsKIHR5cGVkZWYgX19jb21wYXRfZ2lkMzJfdAljb21wYXRfZ2lkX3Q7CiAKK3R5cGVkZWYJY29tcGF0X3Vsb25nX3QJCWNvbXBhdF9haW9fY29udGV4dF90OworCiBzdHJ1Y3QgY29tcGF0X3NlbF9hcmdfc3RydWN0Owogc3RydWN0IHJ1c2FnZTsKIApAQCAtMTQxLDI2ICsxNDcsMjMgQEAKIH07CiAKIC8qCi0gKiBUaGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBzdHJpY3RseSBvbiBzdHJ1Y3QgY29tcGF0X3RpbWUqCi0gKi8KLWV4dGVybiBpbnQgZ2V0X2NvbXBhdF90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgKiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqKTsKLWV4dGVybiBpbnQgcHV0X2NvbXBhdF90aW1lc3BlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqKTsKLWV4dGVybiBpbnQgZ2V0X2NvbXBhdF90aW1ldmFsKHN0cnVjdCB0aW1ldmFsICosCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICopOwotZXh0ZXJuIGludCBwdXRfY29tcGF0X3RpbWV2YWwoY29uc3Qgc3RydWN0IHRpbWV2YWwgKiwKLQkJCSAgICAgIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKik7Ci0vKgogICogVGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gMzItIG9yIDY0LWJpdCBzcGVjcyBkZXBlbmRpbmcgb24KLSAqIENPTVBBVF9VU0VfNjRCSVRfVElNRSwgaGVuY2UgdGhlIHZvaWQgdXNlciBwb2ludGVyIGFyZ3VtZW50cyBhbmQgdGhlCi0gKiBuYW1pbmcgYXMgY29tcGF0X2dldC9wdXRfIHJhdGhlciB0aGFuIGdldC9wdXRfY29tcGF0Xy4KKyAqIENPTVBBVF9VU0VfNjRCSVRfVElNRSwgaGVuY2UgdGhlIHZvaWQgdXNlciBwb2ludGVyIGFyZ3VtZW50cy4KICAqLwogZXh0ZXJuIGludCBjb21wYXRfZ2V0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyAqLCBjb25zdCB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiBpbnQgY29tcGF0X3B1dF90aW1lc3BlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgdm9pZCBfX3VzZXIgKik7CiBleHRlcm4gaW50IGNvbXBhdF9nZXRfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqLCBjb25zdCB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiBpbnQgY29tcGF0X3B1dF90aW1ldmFsKGNvbnN0IHN0cnVjdCB0aW1ldmFsICosIHZvaWQgX191c2VyICopOwogCisvKgorICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGEgdGltZXNwZWMgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5zIGEgKnVzZXIKKyAqIHNwYWNlKiBwb2ludGVyLiAgSWYgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnksIGl0IHJldHVybnMgdGhlCisgKiBpbml0aWFsIHBvaW50ZXIuICBOVUxMIGlzIGEgbGVnaXRpbWF0ZSBhcmd1bWVudCBhbmQgd2lsbCBhbHdheXMKKyAqIG91dHB1dCBOVUxMLgorICovCitleHRlcm4gaW50IGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiosCisJCQkJICAgY29uc3Qgdm9pZCBfX3VzZXIgKik7CisKIHN0cnVjdCBjb21wYXRfaW92ZWMgewogCWNvbXBhdF91cHRyX3QJaW92X2Jhc2U7CiAJY29tcGF0X3NpemVfdAlpb3ZfbGVuOwpAQCAtMzE4LDcgKzMyMSw3IEBACiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tc2dzbmQoaW50IG1zcWlkLCBjb21wYXRfdXB0cl90IG1zZ3AsCiAJCWNvbXBhdF9zc2l6ZV90IG1zZ3N6LCBpbnQgbXNnZmxnKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21zZ3JjdihpbnQgbXNxaWQsIGNvbXBhdF91cHRyX3QgbXNncCwKLQkJY29tcGF0X3NzaXplX3QgbXNnc3osIGxvbmcgbXNndHlwLCBpbnQgbXNnZmxnKTsKKwkJY29tcGF0X3NzaXplX3QgbXNnc3osIGNvbXBhdF9sb25nX3QgbXNndHlwLCBpbnQgbXNnZmxnKTsKIGxvbmcgY29tcGF0X3N5c19tc2djdGwoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCB2b2lkIF9fdXNlciAqdXB0cik7CiBsb25nIGNvbXBhdF9zeXNfc2htY3RsKGludCBmaXJzdCwgaW50IHNlY29uZCwgdm9pZCBfX3VzZXIgKnVwdHIpOwogbG9uZyBjb21wYXRfc3lzX3NlbXRpbWVkb3AoaW50IHNlbWlkLCBzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqdHNlbXMsCkBAIC0zMzcsNiArMzQwLDE5IEBACiBhc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19wd3JpdGV2KGNvbXBhdF91bG9uZ190IGZkLAogCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdmVjLAogCQljb21wYXRfdWxvbmdfdCB2bGVuLCB1MzIgcG9zX2xvdywgdTMyIHBvc19oaWdoKTsKKworI2lmZGVmIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFJFQURWNjQKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3ByZWFkdjY0KHVuc2lnbmVkIGxvbmcgZmQsCisJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsCisJCXVuc2lnbmVkIGxvbmcgdmxlbiwgbG9mZl90IHBvcyk7CisjZW5kaWYKKworI2lmZGVmIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFdSSVRFVjY0Cithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19wd3JpdGV2NjQodW5zaWduZWQgbG9uZyBmZCwKKwkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywKKwkJdW5zaWduZWQgbG9uZyB2bGVuLCBsb2ZmX3QgcG9zKTsKKyNlbmRpZgorCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19sc2Vlayh1bnNpZ25lZCBpbnQsIGNvbXBhdF9vZmZfdCwgdW5zaWduZWQgaW50KTsKIAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZXhlY3ZlKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgY29uc3QgY29tcGF0X3VwdHJfdCBfX3VzZXIgKmFyZ3YsCkBAIC00NTEsNyArNDY3LDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3RpbWVyZmRfZ2V0dGltZShpbnQgdWZkLAogCQkJCSAgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKm90bXIpOwogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3ZlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBucl9wYWdlLAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbW92ZV9wYWdlcyhwaWRfdCBwaWQsIGNvbXBhdF91bG9uZ190IG5yX3BhZ2VzLAogCQkJCSAgICAgIF9fdTMyIF9fdXNlciAqcGFnZXMsCiAJCQkJICAgICAgY29uc3QgaW50IF9fdXNlciAqbm9kZXMsCiAJCQkJICAgICAgaW50IF9fdXNlciAqc3RhdHVzLApAQCAtNDgxLDIwICs0OTcsMjAgQEAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZzdGF0ZnM2NCh1bnNpZ25lZCBpbnQgZmQsIGNvbXBhdF9zaXplX3Qgc3osCiAJCQkJICAgICBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqYnVmKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsNjQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwkJCQkgICBjb21wYXRfdWxvbmdfdCBhcmcpOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZmNudGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSB1bnNpZ25lZCBsb25nIGFyZyk7CisJCQkJIGNvbXBhdF91bG9uZ190IGFyZyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19pb19zZXR1cCh1bnNpZ25lZCBucl9yZXFzLCB1MzIgX191c2VyICpjdHgzMnApOwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzKGFpb19jb250ZXh0X3QgY3R4X2lkLAotCQkJCQl1bnNpZ25lZCBsb25nIG1pbl9uciwKLQkJCQkJdW5zaWduZWQgbG9uZyBuciwKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvX2dldGV2ZW50cyhjb21wYXRfYWlvX2NvbnRleHRfdCBjdHhfaWQsCisJCQkJCWNvbXBhdF9sb25nX3QgbWluX25yLAorCQkJCQljb21wYXRfbG9uZ190IG5yLAogCQkJCQlzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICpldmVudHMsCiAJCQkJCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0KTsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgaW50IG5yLAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfaW9fc3VibWl0KGNvbXBhdF9haW9fY29udGV4dF90IGN0eF9pZCwgaW50IG5yLAogCQkJCSAgICAgdTMyIF9fdXNlciAqaW9jYik7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3VudChjb25zdCBjaGFyIF9fdXNlciAqZGV2X25hbWUsCiAJCQkJIGNvbnN0IGNoYXIgX191c2VyICpkaXJfbmFtZSwKLQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJIGNvbnN0IGNoYXIgX191c2VyICp0eXBlLCBjb21wYXRfdWxvbmdfdCBmbGFncywKIAkJCQkgY29uc3Qgdm9pZCBfX3VzZXIgKmRhdGEpOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfb2xkX3JlYWRkaXIodW5zaWduZWQgaW50IGZkLAogCQkJCSAgICAgICBzdHJ1Y3QgY29tcGF0X29sZF9saW51eF9kaXJlbnQgX191c2VyICosCkBAIC01MDIsOSArNTE4LDExIEBACiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRkZW50cyh1bnNpZ25lZCBpbnQgZmQsCiAJCQkJICAgIHN0cnVjdCBjb21wYXRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQpOworI2lmZGVmIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZ2V0ZGVudHM2NCh1bnNpZ25lZCBpbnQgZmQsCiAJCQkJICAgICAgc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50LAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCk7CisjZW5kaWYKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3Ztc3BsaWNlKGludCBmZCwgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKiwKIAkJCQkgICAgdW5zaWduZWQgaW50IG5yX3NlZ3MsIHVuc2lnbmVkIGludCBmbGFncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLApAQCAtNTQ5LDkgKzU2Nyw5IEBACiAJCQkJICAgIHVuc2lnbmVkIHZsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2bXNnKGludCBmZCwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2csCiAJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3YoaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdihpbnQgZmQsIHZvaWQgX191c2VyICpidWYsIGNvbXBhdF9zaXplX3QgbGVuLAogCQkJCXVuc2lnbmVkIGZsYWdzKTsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Zmcm9tKGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Zmcm9tKGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1ZiwgY29tcGF0X3NpemVfdCBsZW4sCiAJCQkgICAgdW5zaWduZWQgZmxhZ3MsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKmFkZHIsCiAJCQkgICAgaW50IF9fdXNlciAqYWRkcmxlbik7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2bW1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKm1tc2csCkBAIC02MTUsMTYgKzYzMywxNiBAQAogCQkJCXN0cnVjdCBjb21wYXRfc2lnaW5mbyBfX3VzZXIgKnVpbmZvKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3N5c2luZm8oc3RydWN0IGNvbXBhdF9zeXNpbmZvIF9fdXNlciAqaW5mbyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwkJCQkgY29tcGF0X3Vsb25nX3QgYXJnKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2Z1dGV4KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgb3AsIHUzMiB2YWwsCiAJCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp1dGltZSwgdTMyIF9fdXNlciAqdWFkZHIyLAogCQl1MzIgdmFsMyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfa2V4ZWNfbG9hZCh1bnNpZ25lZCBsb25nIGVudHJ5LAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VnbWVudHMsCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19rZXhlY19sb2FkKGNvbXBhdF91bG9uZ190IGVudHJ5LAorCQkJCSAgICAgIGNvbXBhdF91bG9uZ190IG5yX3NlZ21lbnRzLAogCQkJCSAgICAgIHN0cnVjdCBjb21wYXRfa2V4ZWNfc2VnbWVudCBfX3VzZXIgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJCQkgICAgICBjb21wYXRfdWxvbmdfdCBmbGFncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyKG1xZF90IG1xZGVzLAogCQkJY29uc3Qgc3RydWN0IGNvbXBhdF9tcV9hdHRyIF9fdXNlciAqdV9tcXN0YXQsCiAJCQlzdHJ1Y3QgY29tcGF0X21xX2F0dHIgX191c2VyICp1X29tcXN0YXQpOwpAQCAtNjM1LDExICs2NTMsMTEgQEAKIAkJCXN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKnVfYXR0cik7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tcV90aW1lZHNlbmQobXFkX3QgbXFkZXMsCiAJCQljb25zdCBjaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCQkJc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBtc2dfcHJpbywKKwkJCWNvbXBhdF9zaXplX3QgbXNnX2xlbiwgdW5zaWduZWQgaW50IG1zZ19wcmlvLAogCQkJY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnVfYWJzX3RpbWVvdXQpOwogYXNtbGlua2FnZSBzc2l6ZV90IGNvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlKG1xZF90IG1xZGVzLAogCQkJY2hhciBfX3VzZXIgKnVfbXNnX3B0ciwKLQkJCXNpemVfdCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgX191c2VyICp1X21zZ19wcmlvLAorCQkJY29tcGF0X3NpemVfdCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgX191c2VyICp1X21zZ19wcmlvLAogCQkJY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnVfYWJzX3RpbWVvdXQpOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc29ja2V0Y2FsbChpbnQgY2FsbCwgdTMyIF9fdXNlciAqYXJncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zeXNjdGwoc3RydWN0IGNvbXBhdF9zeXNjdGxfYXJncyBfX3VzZXIgKmFyZ3MpOwpAQCAtNjU0LDEyICs2NzIsMTIgQEAKIAogYXNtbGlua2FnZSBzc2l6ZV90IGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdihjb21wYXRfcGlkX3QgcGlkLAogCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqbHZlYywKLQkJdW5zaWduZWQgbG9uZyBsaW92Y250LCBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKLQkJdW5zaWduZWQgbG9uZyByaW92Y250LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJY29tcGF0X3Vsb25nX3QgbGlvdmNudCwgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnJ2ZWMsCisJCWNvbXBhdF91bG9uZ190IHJpb3ZjbnQsIGNvbXBhdF91bG9uZ190IGZsYWdzKTsKIGFzbWxpbmthZ2Ugc3NpemVfdCBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KGNvbXBhdF9waWRfdCBwaWQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAotCQl1bnNpZ25lZCBsb25nIGxpb3ZjbnQsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAotCQl1bnNpZ25lZCBsb25nIHJpb3ZjbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQljb21wYXRfdWxvbmdfdCBsaW92Y250LCBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJY29tcGF0X3Vsb25nX3QgcmlvdmNudCwgY29tcGF0X3Vsb25nX3QgZmxhZ3MpOwogCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kZmlsZShpbnQgb3V0X2ZkLCBpbnQgaW5fZmQsCiAJCQkJICAgIGNvbXBhdF9vZmZfdCBfX3VzZXIgKm9mZnNldCwgY29tcGF0X3NpemVfdCBjb3VudCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oIGIvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAppbmRleCBiMmI1YTQxLi5iZTljNDc0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC03MSw3ICs3MSw3IEBACiBpbnQgY25fYWRkX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqaWQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBjbl9tc2cgKiwgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICopKTsKIHZvaWQgY25fZGVsX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqKTsKLWludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqLCB1MzIsIGdmcF90KTsKK2ludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgZ3JvdXAsIGdmcF90IGdmcF9tYXNrKTsKIAogaW50IGNuX3F1ZXVlX2FkZF9jYWxsYmFjayhzdHJ1Y3QgY25fcXVldWVfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgIHN0cnVjdCBjYl9pZCAqaWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCAwM2UyMzVhZC4uMDNlOTYyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC00NiwxMyArNDYsNiBAQAogI2VuZGlmCiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX0FVVE9QUk9CRQotZXh0ZXJuIGludCBhcmNoX2NwdV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOwotZXh0ZXJuIHNzaXplX3QgYXJjaF9wcmludF9jcHVfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICAgY2hhciAqYnVmcHRyKTsKLSNlbmRpZgotCiAvKgogICogQ1BVIG5vdGlmaWVyIHByaW9yaXRpZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9saW51eC9jcHVmZWF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkNGViOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZmVhdHVyZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTGluYXJvIEx0ZC4gPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfQ1BVRkVBVFVSRV9ICisjZGVmaW5lIF9fTElOVVhfQ1BVRkVBVFVSRV9ICisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCisKKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorCisvKgorICogTWFjcm9zIGltcG9ydGVkIGZyb20gPGFzbS9jcHVmZWF0dXJlLmg+OgorICogLSBjcHVfZmVhdHVyZSh4KQkJb3JkaW5hbCB2YWx1ZSBvZiBmZWF0dXJlIGNhbGxlZCAneCcKKyAqIC0gY3B1X2hhdmVfZmVhdHVyZSh1MzIgbikJd2hldGhlciBmZWF0dXJlICNuIGlzIGF2YWlsYWJsZQorICogLSBNQVhfQ1BVX0ZFQVRVUkVTCQl1cHBlciBib3VuZCBmb3IgZmVhdHVyZSBvcmRpbmFsIHZhbHVlcworICogT3B0aW9uYWw6CisgKiAtIENQVV9GRUFUVVJFX1RZUEVGTVQJZm9ybWF0IHN0cmluZyBmcmFnbWVudCBmb3IgcHJpbnRpbmcgdGhlIGNwdSB0eXBlCisgKiAtIENQVV9GRUFUVVJFX1RZUEVWQUwJc2V0IG9mIHZhbHVlcyBtYXRjaGluZyB0aGUgZm9ybWF0IHN0cmluZyBhYm92ZQorICovCisKKyNpZm5kZWYgQ1BVX0ZFQVRVUkVfVFlQRUZNVAorI2RlZmluZSBDUFVfRkVBVFVSRV9UWVBFRk1UCSIlcyIKKyNlbmRpZgorCisjaWZuZGVmIENQVV9GRUFUVVJFX1RZUEVWQUwKKyNkZWZpbmUgQ1BVX0ZFQVRVUkVfVFlQRVZBTAlFTEZfUExBVEZPUk0KKyNlbmRpZgorCisvKgorICogVXNlIG1vZHVsZV9jcHVfZmVhdHVyZV9tYXRjaChmZWF0dXJlLCBtb2R1bGVfaW5pdF9mdW5jdGlvbikgdG8KKyAqIGRlY2xhcmUgdGhhdAorICogYSkgdGhlIG1vZHVsZSBzaGFsbCBiZSBwcm9iZWQgdXBvbiBkaXNjb3Zlcnkgb2YgQ1BVIGZlYXR1cmUgJ2ZlYXR1cmUnCisgKiAgICAodHlwaWNhbGx5IGF0IGJvb3QgdGltZSB1c2luZyB1ZGV2KQorICogYikgdGhlIG1vZHVsZSBtdXN0IG5vdCBiZSBsb2FkZWQgaWYgQ1BVIGZlYXR1cmUgJ2ZlYXR1cmUnIGlzIG5vdCBwcmVzZW50CisgKiAgICAobm90IGV2ZW4gYnkgbWFudWFsIGluc21vZCkuCisgKgorICogRm9yIGEgbGlzdCBvZiBsZWdhbCB2YWx1ZXMgZm9yICdmZWF0dXJlJywgcGxlYXNlIGNvbnN1bHQgdGhlIGZpbGUKKyAqICdhc20vY3B1ZmVhdHVyZS5oJyBvZiB5b3VyIGZhdm9yaXRlIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBtb2R1bGVfY3B1X2ZlYXR1cmVfbWF0Y2goeCwgX19pbml0KQkJCVwKK3N0YXRpYyBzdHJ1Y3QgY3B1X2ZlYXR1cmUgY29uc3QgY3B1X2ZlYXR1cmVfbWF0Y2hfICMjIHhbXSA9CVwKKwl7IHsgLmZlYXR1cmUgPSBjcHVfZmVhdHVyZSh4KSB9LCB7IH0gfTsJCQlcCitNT0RVTEVfREVWSUNFX1RBQkxFKGNwdSwgY3B1X2ZlYXR1cmVfbWF0Y2hfICMjIHgpOwkJXAorCQkJCQkJCQlcCitzdGF0aWMgaW50IGNwdV9mZWF0dXJlX21hdGNoXyAjIyB4ICMjIF9pbml0KHZvaWQpCQlcCit7CQkJCQkJCQlcCisJaWYgKCFjcHVfaGF2ZV9mZWF0dXJlKGNwdV9mZWF0dXJlKHgpKSkJCQlcCisJCXJldHVybiAtRU5PREVWOwkJCQkJXAorCXJldHVybiBfX2luaXQoKTsJCQkJCVwKK30JCQkJCQkJCVwKK21vZHVsZV9pbml0KGNwdV9mZWF0dXJlX21hdGNoXyAjIyB4ICMjIF9pbml0KQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHV0aW1lLmggYi9pbmNsdWRlL2xpbnV4L2NwdXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmViMmVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jcHV0aW1lLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfX0xJTlVYX0NQVVRJTUVfSAorI2RlZmluZSBfX0xJTlVYX0NQVVRJTUVfSAorCisjaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KKworI2lmbmRlZiBjcHV0aW1lX3RvX25zZWNzCisjIGRlZmluZSBjcHV0aW1lX3RvX25zZWNzKF9fY3QpCVwKKwkoY3B1dGltZV90b191c2VjcyhfX2N0KSAqIE5TRUNfUEVSX1VTRUMpCisjZW5kaWYKKworI2lmbmRlZiBuc2Vjc190b19jcHV0aW1lCisjIGRlZmluZSBuc2Vjc190b19jcHV0aW1lKF9fbnNlY3MpCVwKKwl1c2Vjc190b19jcHV0aW1lKChfX25zZWNzKSAvIE5TRUNfUEVSX1VTRUMpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCA5NTJiMDEwLi4yMzNiYmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTU2MCw2ICs1NjAsOCBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmVudHJ5KTsKIGV4dGVybiB2b2lkIGRldmljZV9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOworZXh0ZXJuIGJvb2wgZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJY29uc3Qgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpOwogZXh0ZXJuIHZvaWQgZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC02MjYsNiArNjI4LDcgQEAKIAlyZXR1cm4gZGV2bV9rbWFsbG9jX2FycmF5KGRldiwgbiwgc2l6ZSwgZmxhZ3MgfCBfX0dGUF9aRVJPKTsKIH0KIGV4dGVybiB2b2lkIGRldm1fa2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwKTsKK2V4dGVybiBjaGFyICpkZXZtX2tzdHJkdXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzLCBnZnBfdCBnZnApOwogCiB2b2lkIF9faW9tZW0gKmRldm1faW9yZW1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIHZvaWQgX19pb21lbSAqZGV2bV9yZXF1ZXN0X2FuZF9pb3JlbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHJiZC5oIGIvaW5jbHVkZS9saW51eC9kcmJkLmgKaW5kZXggZGU3ZDc0YS4uM2RiZTliZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kcmJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9kcmJkLmgKQEAgLTMyNywxMiArMzI3LDYgQEAKIAlTU19BRlRFUl9MQVNUX0VSUk9SID0gLTIyLCAgICAvKiBLZWVwIHRoaXMgYXQgYm90dG9tICovCiB9OwogCi0vKiBmcm9tIGRyYmRfc3RyaW5ncy5jICovCi1leHRlcm4gY29uc3QgY2hhciAqZHJiZF9jb25uX3N0cihlbnVtIGRyYmRfY29ubnMpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfcm9sZV9zdHIoZW51bSBkcmJkX3JvbGUpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfZGlza19zdHIoZW51bSBkcmJkX2Rpc2tfc3RhdGUpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfc2V0X3N0X2Vycl9zdHIoZW51bSBkcmJkX3N0YXRlX3J2KTsKLQogI2RlZmluZSBTSEFSRURfU0VDUkVUX01BWCA2NAogCiAjZGVmaW5lIE1ERl9DT05TSVNURU5UCQkoMSA8PCAwKQpAQCAtMzgyLDQgKzM3Niw2IEBACiAjZGVmaW5lIERSQkRfTURfSU5ERVhfRkxFWF9FWFQgLTIKICNkZWZpbmUgRFJCRF9NRF9JTkRFWF9GTEVYX0lOVCAtMwogCisjZGVmaW5lIERSQkRfQ1BVX01BU0tfU0laRSAzMgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHJiZF9nZW5sLmggYi9pbmNsdWRlL2xpbnV4L2RyYmRfZ2VubC5oCmluZGV4IGU4YzQ0NTcuLjQxOTNmNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHJiZF9nZW5sLmgKKysrIGIvaW5jbHVkZS9saW51eC9kcmJkX2dlbmwuaApAQCAtMTM1LDcgKzEzNSw3IEBACiApCiAKIEdFTkxfc3RydWN0KERSQkRfTkxBX1JFU09VUkNFX09QVFMsIDQsIHJlc19vcHRzLAotCV9fc3RyX2ZpZWxkX2RlZigxLAlEUkJEX0dFTkxBX0ZfTUFOREFUT1JZLAljcHVfbWFzaywgICAgICAgMzIpCisJX19zdHJfZmllbGRfZGVmKDEsCURSQkRfR0VOTEFfRl9NQU5EQVRPUlksCWNwdV9tYXNrLCAgICAgICBEUkJEX0NQVV9NQVNLX1NJWkUpCiAJX191MzJfZmllbGRfZGVmKDIsCURSQkRfR0VOTEFfRl9NQU5EQVRPUlksCW9uX25vX2RhdGEsIERSQkRfT05fTk9fREFUQV9ERUYpCiApCiAKQEAgLTI3Niw5ICsyNzYsOSBAQAogKQogCiAJLyogYWRkIERSQkQgbWlub3IgZGV2aWNlcyBhcyB2b2x1bWVzIHRvIHJlc291cmNlcyAqLwotR0VOTF9vcChEUkJEX0FETV9ORVdfTUlOT1IsIDUsIEdFTkxfZG9pdChkcmJkX2FkbV9hZGRfbWlub3IpLAorR0VOTF9vcChEUkJEX0FETV9ORVdfTUlOT1IsIDUsIEdFTkxfZG9pdChkcmJkX2FkbV9uZXdfbWlub3IpLAogCUdFTkxfdGxhX2V4cGVjdGVkKERSQkRfTkxBX0NGR19DT05URVhULCBEUkJEX0ZfUkVRVUlSRUQpKQotR0VOTF9vcChEUkJEX0FETV9ERUxfTUlOT1IsIDYsIEdFTkxfZG9pdChkcmJkX2FkbV9kZWxldGVfbWlub3IpLAorR0VOTF9vcChEUkJEX0FETV9ERUxfTUlOT1IsIDYsIEdFTkxfZG9pdChkcmJkX2FkbV9kZWxfbWlub3IpLAogCUdFTkxfdGxhX2V4cGVjdGVkKERSQkRfTkxBX0NGR19DT05URVhULCBEUkJEX0ZfUkVRVUlSRUQpKQogCiAJLyogYWRkIG9yIGRlbGV0ZSByZXNvdXJjZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZpLmggYi9pbmNsdWRlL2xpbnV4L2VmaS5oCmluZGV4IDBhODE5ZTcuLjZjMTAwZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZpLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZmkuaApAQCAtMTUzLDYgKzE1MywxMDIgQEAKIAl1OCBzZXRzX3RvX3plcm87CiB9IGVmaV90aW1lX2NhcF90OwogCit0eXBlZGVmIHN0cnVjdCB7CisJZWZpX3RhYmxlX2hkcl90IGhkcjsKKwl1MzIgcmFpc2VfdHBsOworCXUzMiByZXN0b3JlX3RwbDsKKwl1MzIgYWxsb2NhdGVfcGFnZXM7CisJdTMyIGZyZWVfcGFnZXM7CisJdTMyIGdldF9tZW1vcnlfbWFwOworCXUzMiBhbGxvY2F0ZV9wb29sOworCXUzMiBmcmVlX3Bvb2w7CisJdTMyIGNyZWF0ZV9ldmVudDsKKwl1MzIgc2V0X3RpbWVyOworCXUzMiB3YWl0X2Zvcl9ldmVudDsKKwl1MzIgc2lnbmFsX2V2ZW50OworCXUzMiBjbG9zZV9ldmVudDsKKwl1MzIgY2hlY2tfZXZlbnQ7CisJdTMyIGluc3RhbGxfcHJvdG9jb2xfaW50ZXJmYWNlOworCXUzMiByZWluc3RhbGxfcHJvdG9jb2xfaW50ZXJmYWNlOworCXUzMiB1bmluc3RhbGxfcHJvdG9jb2xfaW50ZXJmYWNlOworCXUzMiBoYW5kbGVfcHJvdG9jb2w7CisJdTMyIF9fcmVzZXJ2ZWQ7CisJdTMyIHJlZ2lzdGVyX3Byb3RvY29sX25vdGlmeTsKKwl1MzIgbG9jYXRlX2hhbmRsZTsKKwl1MzIgbG9jYXRlX2RldmljZV9wYXRoOworCXUzMiBpbnN0YWxsX2NvbmZpZ3VyYXRpb25fdGFibGU7CisJdTMyIGxvYWRfaW1hZ2U7CisJdTMyIHN0YXJ0X2ltYWdlOworCXUzMiBleGl0OworCXUzMiB1bmxvYWRfaW1hZ2U7CisJdTMyIGV4aXRfYm9vdF9zZXJ2aWNlczsKKwl1MzIgZ2V0X25leHRfbW9ub3RvbmljX2NvdW50OworCXUzMiBzdGFsbDsKKwl1MzIgc2V0X3dhdGNoZG9nX3RpbWVyOworCXUzMiBjb25uZWN0X2NvbnRyb2xsZXI7CisJdTMyIGRpc2Nvbm5lY3RfY29udHJvbGxlcjsKKwl1MzIgb3Blbl9wcm90b2NvbDsKKwl1MzIgY2xvc2VfcHJvdG9jb2w7CisJdTMyIG9wZW5fcHJvdG9jb2xfaW5mb3JtYXRpb247CisJdTMyIHByb3RvY29sc19wZXJfaGFuZGxlOworCXUzMiBsb2NhdGVfaGFuZGxlX2J1ZmZlcjsKKwl1MzIgbG9jYXRlX3Byb3RvY29sOworCXUzMiBpbnN0YWxsX211bHRpcGxlX3Byb3RvY29sX2ludGVyZmFjZXM7CisJdTMyIHVuaW5zdGFsbF9tdWx0aXBsZV9wcm90b2NvbF9pbnRlcmZhY2VzOworCXUzMiBjYWxjdWxhdGVfY3JjMzI7CisJdTMyIGNvcHlfbWVtOworCXUzMiBzZXRfbWVtOworCXUzMiBjcmVhdGVfZXZlbnRfZXg7Cit9IF9fcGFja2VkIGVmaV9ib290X3NlcnZpY2VzXzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwllZmlfdGFibGVfaGRyX3QgaGRyOworCXU2NCByYWlzZV90cGw7CisJdTY0IHJlc3RvcmVfdHBsOworCXU2NCBhbGxvY2F0ZV9wYWdlczsKKwl1NjQgZnJlZV9wYWdlczsKKwl1NjQgZ2V0X21lbW9yeV9tYXA7CisJdTY0IGFsbG9jYXRlX3Bvb2w7CisJdTY0IGZyZWVfcG9vbDsKKwl1NjQgY3JlYXRlX2V2ZW50OworCXU2NCBzZXRfdGltZXI7CisJdTY0IHdhaXRfZm9yX2V2ZW50OworCXU2NCBzaWduYWxfZXZlbnQ7CisJdTY0IGNsb3NlX2V2ZW50OworCXU2NCBjaGVja19ldmVudDsKKwl1NjQgaW5zdGFsbF9wcm90b2NvbF9pbnRlcmZhY2U7CisJdTY0IHJlaW5zdGFsbF9wcm90b2NvbF9pbnRlcmZhY2U7CisJdTY0IHVuaW5zdGFsbF9wcm90b2NvbF9pbnRlcmZhY2U7CisJdTY0IGhhbmRsZV9wcm90b2NvbDsKKwl1NjQgX19yZXNlcnZlZDsKKwl1NjQgcmVnaXN0ZXJfcHJvdG9jb2xfbm90aWZ5OworCXU2NCBsb2NhdGVfaGFuZGxlOworCXU2NCBsb2NhdGVfZGV2aWNlX3BhdGg7CisJdTY0IGluc3RhbGxfY29uZmlndXJhdGlvbl90YWJsZTsKKwl1NjQgbG9hZF9pbWFnZTsKKwl1NjQgc3RhcnRfaW1hZ2U7CisJdTY0IGV4aXQ7CisJdTY0IHVubG9hZF9pbWFnZTsKKwl1NjQgZXhpdF9ib290X3NlcnZpY2VzOworCXU2NCBnZXRfbmV4dF9tb25vdG9uaWNfY291bnQ7CisJdTY0IHN0YWxsOworCXU2NCBzZXRfd2F0Y2hkb2dfdGltZXI7CisJdTY0IGNvbm5lY3RfY29udHJvbGxlcjsKKwl1NjQgZGlzY29ubmVjdF9jb250cm9sbGVyOworCXU2NCBvcGVuX3Byb3RvY29sOworCXU2NCBjbG9zZV9wcm90b2NvbDsKKwl1NjQgb3Blbl9wcm90b2NvbF9pbmZvcm1hdGlvbjsKKwl1NjQgcHJvdG9jb2xzX3Blcl9oYW5kbGU7CisJdTY0IGxvY2F0ZV9oYW5kbGVfYnVmZmVyOworCXU2NCBsb2NhdGVfcHJvdG9jb2w7CisJdTY0IGluc3RhbGxfbXVsdGlwbGVfcHJvdG9jb2xfaW50ZXJmYWNlczsKKwl1NjQgdW5pbnN0YWxsX211bHRpcGxlX3Byb3RvY29sX2ludGVyZmFjZXM7CisJdTY0IGNhbGN1bGF0ZV9jcmMzMjsKKwl1NjQgY29weV9tZW07CisJdTY0IHNldF9tZW07CisJdTY0IGNyZWF0ZV9ldmVudF9leDsKK30gX19wYWNrZWQgZWZpX2Jvb3Rfc2VydmljZXNfNjRfdDsKKwogLyoKICAqIEVGSSBCb290IFNlcnZpY2VzIHRhYmxlCiAgKi8KQEAgLTIzMSw2ICszMjcsMTUgQEAKICAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbk1heGltdW0KIH0gRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVfT1BFUkFUSU9OOwogCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHJlYWQ7CisJdTMyIHdyaXRlOworfSBlZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc18zMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTY0IHJlYWQ7CisJdTY0IHdyaXRlOworfSBlZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc182NF90OwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdm9pZCAqcmVhZDsKQEAgLTIzOCw2ICszNDMsNDYgQEAKIH0gZWZpX3BjaV9pb19wcm90b2NvbF9hY2Nlc3NfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBwb2xsX21lbTsKKwl1MzIgcG9sbF9pbzsKKwllZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc18zMl90IG1lbTsKKwllZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc18zMl90IGlvOworCWVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzMyX3QgcGNpOworCXUzMiBjb3B5X21lbTsKKwl1MzIgbWFwOworCXUzMiB1bm1hcDsKKwl1MzIgYWxsb2NhdGVfYnVmZmVyOworCXUzMiBmcmVlX2J1ZmZlcjsKKwl1MzIgZmx1c2g7CisJdTMyIGdldF9sb2NhdGlvbjsKKwl1MzIgYXR0cmlidXRlczsKKwl1MzIgZ2V0X2Jhcl9hdHRyaWJ1dGVzOworCXUzMiBzZXRfYmFyX2F0dHJpYnV0ZXM7CisJdWludDY0X3Qgcm9tc2l6ZTsKKwl2b2lkICpyb21pbWFnZTsKK30gZWZpX3BjaV9pb19wcm90b2NvbF8zMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU2NCBwb2xsX21lbTsKKwl1NjQgcG9sbF9pbzsKKwllZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc182NF90IG1lbTsKKwllZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc182NF90IGlvOworCWVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzY0X3QgcGNpOworCXU2NCBjb3B5X21lbTsKKwl1NjQgbWFwOworCXU2NCB1bm1hcDsKKwl1NjQgYWxsb2NhdGVfYnVmZmVyOworCXU2NCBmcmVlX2J1ZmZlcjsKKwl1NjQgZmx1c2g7CisJdTY0IGdldF9sb2NhdGlvbjsKKwl1NjQgYXR0cmlidXRlczsKKwl1NjQgZ2V0X2Jhcl9hdHRyaWJ1dGVzOworCXU2NCBzZXRfYmFyX2F0dHJpYnV0ZXM7CisJdWludDY0X3Qgcm9tc2l6ZTsKKwl2b2lkICpyb21pbWFnZTsKK30gZWZpX3BjaV9pb19wcm90b2NvbF82NDsKKwordHlwZWRlZiBzdHJ1Y3QgewogCXZvaWQgKnBvbGxfbWVtOwogCXZvaWQgKnBvbGxfaW87CiAJZWZpX3BjaV9pb19wcm90b2NvbF9hY2Nlc3NfdCBtZW07CkBAIC0yOTIsNiArNDM3LDQyIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAllZmlfdGFibGVfaGRyX3QgaGRyOworCXUzMiBnZXRfdGltZTsKKwl1MzIgc2V0X3RpbWU7CisJdTMyIGdldF93YWtldXBfdGltZTsKKwl1MzIgc2V0X3dha2V1cF90aW1lOworCXUzMiBzZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKKwl1MzIgY29udmVydF9wb2ludGVyOworCXUzMiBnZXRfdmFyaWFibGU7CisJdTMyIGdldF9uZXh0X3ZhcmlhYmxlOworCXUzMiBzZXRfdmFyaWFibGU7CisJdTMyIGdldF9uZXh0X2hpZ2hfbW9ub19jb3VudDsKKwl1MzIgcmVzZXRfc3lzdGVtOworCXUzMiB1cGRhdGVfY2Fwc3VsZTsKKwl1MzIgcXVlcnlfY2Fwc3VsZV9jYXBzOworCXUzMiBxdWVyeV92YXJpYWJsZV9pbmZvOworfSBlZmlfcnVudGltZV9zZXJ2aWNlc18zMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJZWZpX3RhYmxlX2hkcl90IGhkcjsKKwl1NjQgZ2V0X3RpbWU7CisJdTY0IHNldF90aW1lOworCXU2NCBnZXRfd2FrZXVwX3RpbWU7CisJdTY0IHNldF93YWtldXBfdGltZTsKKwl1NjQgc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXA7CisJdTY0IGNvbnZlcnRfcG9pbnRlcjsKKwl1NjQgZ2V0X3ZhcmlhYmxlOworCXU2NCBnZXRfbmV4dF92YXJpYWJsZTsKKwl1NjQgc2V0X3ZhcmlhYmxlOworCXU2NCBnZXRfbmV4dF9oaWdoX21vbm9fY291bnQ7CisJdTY0IHJlc2V0X3N5c3RlbTsKKwl1NjQgdXBkYXRlX2NhcHN1bGU7CisJdTY0IHF1ZXJ5X2NhcHN1bGVfY2FwczsKKwl1NjQgcXVlcnlfdmFyaWFibGVfaW5mbzsKK30gZWZpX3J1bnRpbWVfc2VydmljZXNfNjRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWVmaV90YWJsZV9oZHJfdCBoZHI7CiAJdm9pZCAqZ2V0X3RpbWU7CiAJdm9pZCAqc2V0X3RpbWU7CiAJdm9pZCAqZ2V0X3dha2V1cF90aW1lOwpAQCAtNDg1LDYgKzY2NiwzOCBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdTMyIHJldmlzaW9uOworCXUzMiBwYXJlbnRfaGFuZGxlOworCXUzMiBzeXN0ZW1fdGFibGU7CisJdTMyIGRldmljZV9oYW5kbGU7CisJdTMyIGZpbGVfcGF0aDsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTMyIGxvYWRfb3B0aW9uc19zaXplOworCXUzMiBsb2FkX29wdGlvbnM7CisJdTMyIGltYWdlX2Jhc2U7CisJX19hbGlnbmVkX3U2NCBpbWFnZV9zaXplOworCXVuc2lnbmVkIGludCBpbWFnZV9jb2RlX3R5cGU7CisJdW5zaWduZWQgaW50IGltYWdlX2RhdGFfdHlwZTsKKwl1bnNpZ25lZCBsb25nIHVubG9hZDsKK30gZWZpX2xvYWRlZF9pbWFnZV8zMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHJldmlzaW9uOworCXU2NCBwYXJlbnRfaGFuZGxlOworCXU2NCBzeXN0ZW1fdGFibGU7CisJdTY0IGRldmljZV9oYW5kbGU7CisJdTY0IGZpbGVfcGF0aDsKKwl1NjQgcmVzZXJ2ZWQ7CisJdTMyIGxvYWRfb3B0aW9uc19zaXplOworCXU2NCBsb2FkX29wdGlvbnM7CisJdTY0IGltYWdlX2Jhc2U7CisJX19hbGlnbmVkX3U2NCBpbWFnZV9zaXplOworCXVuc2lnbmVkIGludCBpbWFnZV9jb2RlX3R5cGU7CisJdW5zaWduZWQgaW50IGltYWdlX2RhdGFfdHlwZTsKKwl1bnNpZ25lZCBsb25nIHVubG9hZDsKK30gZWZpX2xvYWRlZF9pbWFnZV82NF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHJldmlzaW9uOwogCXZvaWQgKnBhcmVudF9oYW5kbGU7CiAJZWZpX3N5c3RlbV90YWJsZV90ICpzeXN0ZW1fdGFibGU7CiAJdm9pZCAqZGV2aWNlX2hhbmRsZTsKQEAgLTUxMSw2ICs3MjQsMzQgQEAKIAllZmlfY2hhcjE2X3QgZmlsZW5hbWVbMV07CiB9IGVmaV9maWxlX2luZm9fdDsKIAordHlwZWRlZiBzdHJ1Y3QgeworCXU2NCByZXZpc2lvbjsKKwl1MzIgb3BlbjsKKwl1MzIgY2xvc2U7CisJdTMyIGRlbGV0ZTsKKwl1MzIgcmVhZDsKKwl1MzIgd3JpdGU7CisJdTMyIGdldF9wb3NpdGlvbjsKKwl1MzIgc2V0X3Bvc2l0aW9uOworCXUzMiBnZXRfaW5mbzsKKwl1MzIgc2V0X2luZm87CisJdTMyIGZsdXNoOworfSBlZmlfZmlsZV9oYW5kbGVfMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU2NCByZXZpc2lvbjsKKwl1NjQgb3BlbjsKKwl1NjQgY2xvc2U7CisJdTY0IGRlbGV0ZTsKKwl1NjQgcmVhZDsKKwl1NjQgd3JpdGU7CisJdTY0IGdldF9wb3NpdGlvbjsKKwl1NjQgc2V0X3Bvc2l0aW9uOworCXU2NCBnZXRfaW5mbzsKKwl1NjQgc2V0X2luZm87CisJdTY0IGZsdXNoOworfSBlZmlfZmlsZV9oYW5kbGVfNjRfdDsKKwogdHlwZWRlZiBzdHJ1Y3QgX2VmaV9maWxlX2hhbmRsZSB7CiAJdTY0IHJldmlzaW9uOwogCWVmaV9zdGF0dXNfdCAoKm9wZW4pKHN0cnVjdCBfZWZpX2ZpbGVfaGFuZGxlICosCkBAIC01NzMsNiArODE0LDcgQEAKIAllZmlfcmVzZXRfc3lzdGVtX3QgKnJlc2V0X3N5c3RlbTsKIAllZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXBfdCAqc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXA7CiAJc3RydWN0IGVmaV9tZW1vcnlfbWFwICptZW1tYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIH0gZWZpOwogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNjU5LDE4ICs5MDEsMTcgQEAKICNkZWZpbmUgRUZJX0FSQ0hfMQkJNgkvKiBGaXJzdCBhcmNoLXNwZWNpZmljIGJpdCAqLwogCiAjaWZkZWYgQ09ORklHX0VGSQotIyBpZmRlZiBDT05GSUdfWDg2Ci1leHRlcm4gaW50IGVmaV9lbmFibGVkKGludCBmYWNpbGl0eSk7Ci0jIGVsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGVmaV9lbmFibGVkKGludCBmYWNpbGl0eSkKKy8qCisgKiBUZXN0IHdoZXRoZXIgdGhlIGFib3ZlIEVGSV8qIGJpdHMgYXJlIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBlZmlfZW5hYmxlZChpbnQgZmVhdHVyZSkKIHsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gdGVzdF9iaXQoZmVhdHVyZSwgJmVmaS5mbGFncykgIT0gMDsKIH0KLSMgZW5kaWYKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBlZmlfZW5hYmxlZChpbnQgZmFjaWxpdHkpCitzdGF0aWMgaW5saW5lIGJvb2wgZWZpX2VuYWJsZWQoaW50IGZlYXR1cmUpCiB7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogI2VuZGlmCiAKQEAgLTgwOSw2ICsxMDUwLDE3IEBACiAJYm9vbCBkZWxldGluZzsKIH07CiAKK3N0cnVjdCBlZmlfc2ltcGxlX3RleHRfb3V0cHV0X3Byb3RvY29sXzMyIHsKKwl1MzIgcmVzZXQ7CisJdTMyIG91dHB1dF9zdHJpbmc7CisJdTMyIHRlc3Rfc3RyaW5nOworfTsKKworc3RydWN0IGVmaV9zaW1wbGVfdGV4dF9vdXRwdXRfcHJvdG9jb2xfNjQgeworCXU2NCByZXNldDsKKwl1NjQgb3V0cHV0X3N0cmluZzsKKwl1NjQgdGVzdF9zdHJpbmc7Cit9OwogCiBzdHJ1Y3QgZWZpX3NpbXBsZV90ZXh0X291dHB1dF9wcm90b2NvbCB7CiAJdm9pZCAqcmVzZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmggYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKaW5kZXggMzA2ZGQ4Yy4uZGY2M2JkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaApAQCAtMjAyLDE3ICsyMDIsOCBAQAogI2RlZmluZSBycV9lbmRfc2VjdG9yKHJxKQkoYmxrX3JxX3BvcyhycSkgKyBibGtfcnFfc2VjdG9ycyhycSkpCiAjZGVmaW5lIHJiX2VudHJ5X3JxKG5vZGUpCXJiX2VudHJ5KChub2RlKSwgc3RydWN0IHJlcXVlc3QsIHJiX25vZGUpCiAKLS8qCi0gKiBIYWNrIHRvIHJldXNlIHRoZSBjc2QubGlzdCBsaXN0X2hlYWQgYXMgdGhlIGZpZm8gdGltZSBob2xkZXIgd2hpbGUKLSAqIHRoZSByZXF1ZXN0IGlzIGluIHRoZSBpbyBzY2hlZHVsZXIuIFNhdmVzIGFuIHVuc2lnbmVkIGxvbmcgaW4gcnEuCi0gKi8KLSNkZWZpbmUgcnFfZmlmb190aW1lKHJxKQkoKHVuc2lnbmVkIGxvbmcpIChycSktPmNzZC5saXN0Lm5leHQpCi0jZGVmaW5lIHJxX3NldF9maWZvX3RpbWUocnEsZXhwKQkoKHJxKS0+Y3NkLmxpc3QubmV4dCA9ICh2b2lkICopIChleHApKQogI2RlZmluZSBycV9lbnRyeV9maWZvKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkKLSNkZWZpbmUgcnFfZmlmb19jbGVhcihycSkJZG8gewkJXAotCWxpc3RfZGVsX2luaXQoJihycSktPnF1ZXVlbGlzdCk7CVwKLQlJTklUX0xJU1RfSEVBRCgmKHJxKS0+Y3NkLmxpc3QpOwlcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgcnFfZmlmb19jbGVhcihycSkJbGlzdF9kZWxfaW5pdCgmKHJxKS0+cXVldWVsaXN0KQogCiAjZWxzZSAvKiBDT05GSUdfQkxPQ0sgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHRjb24uaCBiL2luY2x1ZGUvbGludXgvZXh0Y29uLmgKaW5kZXggMjFjNTlhZi4uZjQ4ODE0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHRjb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oCkBAIC0yNDAsNiArMjQwLDEyIEBACiAJCQkJICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIGludCBleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKIAkJCQkgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKKworLyoKKyAqIEZvbGxvd2luZyBBUEkgZ2V0IHRoZSBleHRjb24gZGV2aWNlIGZyb20gZGV2aWNldHJlZS4KKyAqIFRoaXMgZnVuY3Rpb24gdXNlIHBoYW5kbGUgb2YgZGV2aWNldHJlZSB0byBnZXQgZXh0Y29uIGRldmljZSBkaXJlY3RseS4KKyAqLworZXh0ZXJuIHN0cnVjdCBleHRjb25fZGV2ICpleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCk7CiAjZWxzZSAvKiBDT05GSUdfRVhUQ09OICovCiBzdGF0aWMgaW5saW5lIGludCBleHRjb25fZGV2X3JlZ2lzdGVyKHN0cnVjdCBleHRjb25fZGV2ICplZGV2KQogewpAQCAtMzI0LDUgKzMzMCwxMSBAQAogewogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHRjb25fZGV2ICpleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkJICAgIGludCBpbmRleCkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKK30KICNlbmRpZiAvKiBDT05GSUdfRVhUQ09OICovCiAjZW5kaWYgLyogX19MSU5VWF9FWFRDT05fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi9vZl9leHRjb24uaCBiL2luY2x1ZGUvbGludXgvZXh0Y29uL29mX2V4dGNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJmZWZmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvZXh0Y29uL29mX2V4dGNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIE9GIGhlbHBlcnMgZm9yIEV4dGVybmFsIGNvbm5lY3RvciAoZXh0Y29uKSBmcmFtZXdvcmsKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqIEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX0xJTlVYX09GX0VYVENPTl9ICi0jZGVmaW5lIF9fTElOVVhfT0ZfRVhUQ09OX0gKLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfT0ZfRVhUQ09OKQotZXh0ZXJuIHN0cnVjdCBleHRjb25fZGV2Ci0JKm9mX2V4dGNvbl9nZXRfZXh0Y29uX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0Y29uX2RldgotCSpvZl9leHRjb25fZ2V0X2V4dGNvbl9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX09GX0VYVENPTiAqLwotI2VuZGlmIC8qIF9fTElOVVhfT0ZfRVhUQ09OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZm1jLXNkYi5oIGIvaW5jbHVkZS9saW51eC9mbWMtc2RiLmgKaW5kZXggMTk3NDMxNy4uNTk5YmQ2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mbWMtc2RiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mbWMtc2RiLmgKQEAgLTE0LDYgKzE0LDggQEAKIAlzdHJ1Y3Qgc2RiX2JyaWRnZSBicmlkZ2U7CiAJc3RydWN0IHNkYl9pbnRlZ3JhdGlvbiBpbnRlZ3I7CiAJc3RydWN0IHNkYl9lbXB0eSBlbXB0eTsKKwlzdHJ1Y3Qgc2RiX3N5bnRoZXNpcyBzeW50aGVzaXM7CisJc3RydWN0IHNkYl9yZXBvX3VybCByZXBvX3VybDsKIH07CiAKIHN0cnVjdCBmbWNfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9pZmMuaCBiL2luY2x1ZGUvbGludXgvZnNsX2lmYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2lmYy5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L2ZzbF9pZmMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKaW5kZXggNGU0Y2MyOC4uNGNkYjNhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCkBAIC00OTUsMTAgKzQ5NSw2IEBACiAJRklMVEVSX1RSQUNFX0ZOLAogfTsKIAotI2RlZmluZSBFVkVOVF9TVE9SQUdFX1NJWkUgMTI4Ci1leHRlcm4gc3RydWN0IG11dGV4IGV2ZW50X3N0b3JhZ2VfbXV0ZXg7Ci1leHRlcm4gY2hhciBldmVudF9zdG9yYWdlW0VWRU5UX1NUT1JBR0VfU0laRV07Ci0KIGV4dGVybiBpbnQgdHJhY2VfZXZlbnRfcmF3X2luaXQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKTsKIGV4dGVybiBpbnQgdHJhY2VfZGVmaW5lX2ZpZWxkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgY29uc3QgY2hhciAqdHlwZSwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvZmZzZXQsIGludCBzaXplLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXRleC5oIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCmluZGV4IGIwZDk1Y2EuLjY0MzVmNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnV0ZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKQEAgLTU1LDcgKzU1LDExIEBACiAjaWZkZWYgQ09ORklHX0ZVVEVYCiBleHRlcm4gdm9pZCBleGl0X3JvYnVzdF9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycik7CiBleHRlcm4gdm9pZCBleGl0X3BpX3N0YXRlX2xpc3Qoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9GVVRFWF9DTVBYQ0hHCisjZGVmaW5lIGZ1dGV4X2NtcHhjaGdfZW5hYmxlZCAxCisjZWxzZQogZXh0ZXJuIGludCBmdXRleF9jbXB4Y2hnX2VuYWJsZWQ7CisjZW5kaWYKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZXhpdF9yb2J1c3RfbGlzdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IDEyZDVmOTcuLmNiYTQ0MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC05LDYgKzksNyBAQAogCiAKIGV4dGVybiB2b2lkIHN5bmNocm9uaXplX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK2V4dGVybiB2b2lkIHN5bmNocm9uaXplX2hhcmRpcnEodW5zaWduZWQgaW50IGlycSk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19USU5ZX1JDVSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWlkcy5oIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWlkcy5oCmluZGV4IGJlYWY5NjUuLjUzNzE2MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaWRzLmgKQEAgLTMzLDYgKzMzLDE2IEBACiAjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVAkJCQkweDIwMDRkMAogI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0xJR0hUX0lMTFVNCQkJCTB4MjAwNGQxCiAKKy8qIFBST1ggKDIwMDAxMSkgKi8KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAxMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfUFJFU0VOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwNGIwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfSFVNQU5fUFJFU0VOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA0YjEKKworLyogUHJlc3N1cmUgKDIwMDAzMSkgKi8KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAzMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQVRNT1NQSEVSSUNfUFJFU1NVUkUgICAgICAgICAgICAgIDB4MjAwNDMwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQVRNT1NQSEVSSUNfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgMHgyMDA0MzEKKwogLyogR3lybyAzRDogKDIwMDA3NikgKi8KICNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HWVJPXzNECQkJCTB4MjAwMDc2CiAjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9BTkdMX1ZFTE9DSVRZCQkJMHgyMDA0NTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggZDE5YTVjMi4uZTdhOGQzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTk2LDEyICs5NiwxMiBAQAogICogQGZ1bmN0aW9uOgl0aW1lciBleHBpcnkgY2FsbGJhY2sgZnVuY3Rpb24KICAqIEBiYXNlOglwb2ludGVyIHRvIHRoZSB0aW1lciBiYXNlIChwZXIgY3B1IGFuZCBwZXIgY2xvY2spCiAgKiBAc3RhdGU6CXN0YXRlIGluZm9ybWF0aW9uIChTZWUgYml0IHZhbHVlcyBhYm92ZSkKKyAqIEBzdGFydF9waWQ6IHRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHBpZCBvZiB0aGUgdGFzayB3aGljaAorICoJCXN0YXJ0ZWQgdGhlIHRpbWVyCiAgKiBAc3RhcnRfc2l0ZToJdGltZXIgc3RhdGlzdGljcyBmaWVsZCB0byBzdG9yZSB0aGUgc2l0ZSB3aGVyZSB0aGUgdGltZXIKICAqCQl3YXMgc3RhcnRlZAogICogQHN0YXJ0X2NvbW06IHRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIG5hbWUgb2YgdGhlIHByb2Nlc3Mgd2hpY2gKICAqCQlzdGFydGVkIHRoZSB0aW1lcgotICogQHN0YXJ0X3BpZDogdGltZXIgc3RhdGlzdGljcyBmaWVsZCB0byBzdG9yZSB0aGUgcGlkIG9mIHRoZSB0YXNrIHdoaWNoCi0gKgkJc3RhcnRlZCB0aGUgdGltZXIKICAqCiAgKiBUaGUgaHJ0aW1lciBzdHJ1Y3R1cmUgbXVzdCBiZSBpbml0aWFsaXplZCBieSBocnRpbWVyX2luaXQoKQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h5cGVydi5oIGIvaW5jbHVkZS9saW51eC9oeXBlcnYuaAppbmRleCAzNDQ4ODNkLi5hYjczNTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHlwZXJ2LmgKQEAgLTI1LDMyOCArMjUsMTEgQEAKICNpZm5kZWYgX0hZUEVSVl9ICiAjZGVmaW5lIF9IWVBFUlZfSAogCisjaW5jbHVkZSA8dWFwaS9saW51eC9oeXBlcnYuaD4KKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLS8qCi0gKiBGcmFtZXdvcmsgdmVyc2lvbiBmb3IgdXRpbCBzZXJ2aWNlcy4KLSAqLwotI2RlZmluZSBVVElMX0ZXX01JTk9SICAwCi0KLSNkZWZpbmUgVVRJTF9XUzJLOF9GV19NQUpPUiAgMQotI2RlZmluZSBVVElMX1dTMks4X0ZXX1ZFUlNJT04gICAgIChVVElMX1dTMks4X0ZXX01BSk9SIDw8IDE2IHwgVVRJTF9GV19NSU5PUikKLQotI2RlZmluZSBVVElMX0ZXX01BSk9SICAzCi0jZGVmaW5lIFVUSUxfRldfVkVSU0lPTiAgICAgKFVUSUxfRldfTUFKT1IgPDwgMTYgfCBVVElMX0ZXX01JTk9SKQotCi0KLS8qCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBob3N0IGNvbnRyb2xsZWQgc25hcHNob3Qgb2YgdGhlIGd1ZXN0LgotICovCi0KLSNkZWZpbmUgVlNTX09QX1JFR0lTVEVSIDEyOAotCi1lbnVtIGh2X3Zzc19vcCB7Ci0JVlNTX09QX0NSRUFURSA9IDAsCi0JVlNTX09QX0RFTEVURSwKLQlWU1NfT1BfSE9UX0JBQ0tVUCwKLQlWU1NfT1BfR0VUX0RNX0lORk8sCi0JVlNTX09QX0JVX0NPTVBMRVRFLAotCS8qCi0JICogRm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggSUMgdmVyc2lvbiA+PSA1LjAKLQkgKi8KLQlWU1NfT1BfRlJFRVpFLCAvKiBGcmVlemUgdGhlIGZpbGUgc3lzdGVtcyBpbiB0aGUgVk0gKi8KLQlWU1NfT1BfVEhBVywgLyogVW5mcmVlemUgdGhlIGZpbGUgc3lzdGVtcyAqLwotCVZTU19PUF9BVVRPX1JFQ09WRVIsCi0JVlNTX09QX0NPVU5UIC8qIE51bWJlciBvZiBvcGVyYXRpb25zLCBtdXN0IGJlIGxhc3QgKi8KLX07Ci0KLQotLyoKLSAqIEhlYWRlciBmb3IgYWxsIFZTUyBtZXNzYWdlcy4KLSAqLwotc3RydWN0IGh2X3Zzc19oZHIgewotCV9fdTggb3BlcmF0aW9uOwotCV9fdTggcmVzZXJ2ZWRbN107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLS8qCi0gKiBGbGFnIHZhbHVlcyBmb3IgdGhlIGh2X3Zzc19jaGVja19mZWF0dXJlLiBMaW51eCBzdXBwb3J0cyBvbmx5Ci0gKiBvbmUgdmFsdWUuCi0gKi8KLSNkZWZpbmUgVlNTX0hCVV9OT19BVVRPX1JFQ09WRVJZCTB4MDAwMDAwMDUKLQotc3RydWN0IGh2X3Zzc19jaGVja19mZWF0dXJlIHsKLQlfX3UzMiBmbGFnczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodl92c3NfY2hlY2tfZG1faW5mbyB7Ci0JX191MzIgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZfdnNzX21zZyB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaHZfdnNzX2hkciB2c3NfaGRyOwotCQlpbnQgZXJyb3I7Ci0JfTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBodl92c3NfY2hlY2tfZmVhdHVyZSB2c3NfY2Y7Ci0JCXN0cnVjdCBodl92c3NfY2hlY2tfZG1faW5mbyBkbV9pbmZvOwotCX07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSHlwZXJWIGtleSB2YWx1ZSBwYWlyIChLVlApIGZ1bmN0aW9uYWxpdHkgZm9yIExpbnV4LgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE5vdmVsbCwgSW5jLgotICogQXV0aG9yIDogSy4gWS4gU3Jpbml2YXNhbiA8a3NyaW5pdmFzYW5Abm92ZWxsLmNvbT4KLSAqCi0gKi8KLQotLyoKLSAqIE1heGltdW0gdmFsdWUgc2l6ZSAtIHVzZWQgZm9yIGJvdGgga2V5IG5hbWVzIGFuZCB2YWx1ZSBkYXRhLCBhbmQgaW5jbHVkZXMKLSAqIGFueSBhcHBsaWNhYmxlIE5VTEwgdGVybWluYXRvcnMuCi0gKgotICogTm90ZTogIFRoaXMgbGltaXQgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBidXQgZmFsbHMgZWFzaWx5IHdpdGhpbiB3aGF0IGlzCi0gKiBzdXBwb3J0ZWQgZm9yIGFsbCBuYXRpdmUgZ3Vlc3RzIChiYWNrIHRvIFdpbiAyMDAwKSBhbmQgd2hhdCBpcyByZWFzb25hYmxlCi0gKiBmb3IgdGhlIElDIEtWUCBleGNoYW5nZSBmdW5jdGlvbmFsaXR5LiAgTm90ZSB0aGF0IFdpbmRvd3MgTWUvOTgvOTUgYXJlCi0gKiBsaW1pdGVkIHRvIDI1NSBjaGFyYWN0ZXIga2V5IG5hbWVzLgotICoKLSAqIE1TRE4gcmVjb21tZW5kcyBub3Qgc3RvcmluZyBkYXRhIHZhbHVlcyBsYXJnZXIgdGhhbiAyMDQ4IGJ5dGVzIGluIHRoZQotICogcmVnaXN0cnkuCi0gKgotICogTm90ZTogIFRoaXMgdmFsdWUgaXMgdXNlZCBpbiBkZWZpbmluZyB0aGUgS1ZQIGV4Y2hhbmdlIG1lc3NhZ2UgLSB0aGlzIHZhbHVlCi0gKiBjYW5ub3QgYmUgbW9kaWZpZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSBhbmQgY29tcGF0aWJpbGl0eS4KLSAqLwotCi0vKgotICogYnl0ZXMsIGluY2x1ZGluZyBhbnkgbnVsbCB0ZXJtaW5hdG9ycwotICovCi0jZGVmaW5lIEhWX0tWUF9FWENIQU5HRV9NQVhfVkFMVUVfU0laRSAgICAgICAgICAoMjA0OCkKLQotCi0vKgotICogTWF4aW11bSBrZXkgc2l6ZSAtIHRoZSByZWdpc3RyeSBsaW1pdCBmb3IgdGhlIGxlbmd0aCBvZiBhbiBlbnRyeSBuYW1lCi0gKiBpcyAyNTYgY2hhcmFjdGVycywgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IKLSAqLwotCi0jZGVmaW5lIEhWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkUgICAgICAgICAgICAoNTEyKQotCi0vKgotICogSW4gTGludXgsIHdlIGltcGxlbWVudCB0aGUgS1ZQIGZ1bmN0aW9uYWxpdHkgaW4gdHdvIGNvbXBvbmVudHM6Ci0gKiAxKSBUaGUga2VybmVsIGNvbXBvbmVudCB3aGljaCBpcyBwYWNrYWdlZCBhcyBwYXJ0IG9mIHRoZSBodl91dGlscyBkcml2ZXIKLSAqIGlzIHJlc3BvbnNpYmxlIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGhvc3QgYW5kIHJlc3BvbnNpYmxlIGZvcgotICogaW1wbGVtZW50aW5nIHRoZSBob3N0L2d1ZXN0IHByb3RvY29sLiAyKSBBIHVzZXIgbGV2ZWwgZGFlbW9uIHRoYXQgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBkYXRhIGdhdGhlcmluZy4KLSAqCi0gKiBIb3N0L0d1ZXN0IFByb3RvY29sOiBUaGUgaG9zdCBpdGVyYXRlcyBvdmVyIGFuIGluZGV4IGFuZCBleHBlY3RzIHRoZSBndWVzdAotICogdG8gYXNzaWduIGEga2V5IG5hbWUgdG8gdGhlIGluZGV4IGFuZCBhbHNvIHJldHVybiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0bwotICogdGhlIGtleS4gVGhlIGhvc3Qgd2lsbCBoYXZlIGF0bW9zdCBvbmUgS1ZQIHRyYW5zYWN0aW9uIG91dHN0YW5kaW5nIGF0IGFueQotICogZ2l2ZW4gcG9pbnQgaW4gdGltZS4gVGhlIGhvc3Qgc2lkZSBpdGVyYXRpb24gc3RvcHMgd2hlbiB0aGUgZ3Vlc3QgcmV0dXJucwotICogYW4gZXJyb3IuIE1pY3Jvc29mdCBoYXMgc3BlY2lmaWVkIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBvZiBrZXkgbmFtZXMgdG8KLSAqIGhvc3Qgc3BlY2lmaWVkIGluZGV4OgotICoKLSAqCUluZGV4CQlLZXkgTmFtZQotICoJMAkJRnVsbHlRdWFsaWZpZWREb21haW5OYW1lCi0gKgkxCQlJbnRlZ3JhdGlvblNlcnZpY2VzVmVyc2lvbgotICoJMgkJTmV0d29ya0FkZHJlc3NJUHY0Ci0gKgkzCQlOZXR3b3JrQWRkcmVzc0lQdjYKLSAqCTQJCU9TQnVpbGROdW1iZXIKLSAqCTUJCU9TTmFtZQotICoJNgkJT1NNYWpvclZlcnNpb24KLSAqCTcJCU9TTWlub3JWZXJzaW9uCi0gKgk4CQlPU1ZlcnNpb24KLSAqCTkJCVByb2Nlc3NvckFyY2hpdGVjdHVyZQotICoKLSAqIFRoZSBXaW5kb3dzIGhvc3QgZXhwZWN0cyB0aGUgS2V5IE5hbWUgYW5kIEtleSBWYWx1ZSB0byBiZSBlbmNvZGVkIGluIHV0ZjE2LgotICoKLSAqIEd1ZXN0IEtlcm5lbC9LVlAgRGFlbW9uIFByb3RvY29sOiBBcyBub3RlZCBlYXJsaWVyLCB3ZSBpbXBsZW1lbnQgYWxsIG9mIHRoZQotICogZGF0YSBnYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSBpbiBhIHVzZXIgbW9kZSBkYWVtb24uIFRoZSB1c2VyIGxldmVsIGRhZW1vbgotICogaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgYmluZGluZyB0aGUga2V5IG5hbWUgdG8gdGhlIGluZGV4IGFzIHdlbGwuIFRoZQotICoga2VybmVsIGFuZCB1c2VyLWxldmVsIGRhZW1vbiBjb21tdW5pY2F0ZSB1c2luZyBhIGNvbm5lY3RvciBjaGFubmVsLgotICoKLSAqIFRoZSB1c2VyIG1vZGUgY29tcG9uZW50IGZpcnN0IHJlZ2lzdGVycyB3aXRoIHRoZQotICogdGhlIGtlcm5lbCBjb21wb25lbnQuIFN1YnNlcXVlbnRseSwgdGhlIGtlcm5lbCBjb21wb25lbnQgcmVxdWVzdHMsIGRhdGEKLSAqIGZvciB0aGUgc3BlY2lmaWVkIGtleXMuIEluIHJlc3BvbnNlIHRvIHRoaXMgbWVzc2FnZSB0aGUgdXNlciBtb2RlIGNvbXBvbmVudAotICogZmlsbHMgaW4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBrZXkuIFdlIG92ZXJsb2FkIHRoZQotICogc2VxdWVuY2UgZmllbGQgaW4gdGhlIGNuX21zZyBoZWFkZXIgdG8gZGVmaW5lIG91ciBLVlAgbWVzc2FnZSB0eXBlcy4KLSAqCi0gKgotICogVGhlIGtlcm5lbCBjb21wb25lbnQgc2ltcGx5IGFjdHMgYXMgYSBjb25kdWl0IGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlCi0gKiBXaW5kb3dzIGhvc3QgYW5kIHRoZSB1c2VyLWxldmVsIGRhZW1vbi4gVGhlIGtlcm5lbCBjb21wb25lbnQgcGFzc2VzIHVwIHRoZQotICogaW5kZXggcmVjZWl2ZWQgZnJvbSB0aGUgSG9zdCB0byB0aGUgdXNlci1sZXZlbCBkYWVtb24uIElmIHRoZSBpbmRleCBpcwotICogdmFsaWQgKHN1cHBvcnRlZCksIHRoZSBjb3JyZXNwb25kaW5nIGtleSBhcyB3ZWxsIGFzIGl0cwotICogdmFsdWUgKGJvdGggYXJlIHN0cmluZ3MpIGlzIHJldHVybmVkLiBJZiB0aGUgaW5kZXggaXMgaW52YWxpZAotICogKG5vdCBzdXBwb3J0ZWQpLCBhIE5VTEwga2V5IHN0cmluZyBpcyByZXR1cm5lZC4KLSAqLwotCi0KLS8qCi0gKiBSZWdpc3RyeSB2YWx1ZSB0eXBlcy4KLSAqLwotCi0jZGVmaW5lIFJFR19TWiAxCi0jZGVmaW5lIFJFR19VMzIgNAotI2RlZmluZSBSRUdfVTY0IDgKLQotLyoKLSAqIEFzIHdlIGxvb2sgYXQgZXhwYW5kaW5nIHRoZSBLVlAgZnVuY3Rpb25hbGl0eSB0byBpbmNsdWRlCi0gKiBJUCBpbmplY3Rpb24gZnVuY3Rpb25hbGl0eSwgd2UgbmVlZCB0byBtYWludGFpbiBiaW5hcnkKLSAqIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBkYWVtb25zLgotICoKLSAqIFRoZSBLVlAgb3Bjb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgaG9zdCBhbmQgaXQgd2FzIHVuZm9ydHVuYXRlCi0gKiB0aGF0IEkgY2hvc2UgdG8gdHJlYXQgdGhlIHJlZ2lzdHJhdGlvbiBvcGVyYXRpb24gYXMgcGFydCBvZiB0aGUKLSAqIEtWUCBvcGVyYXRpb25zIGRlZmluZWQgYnkgdGhlIGhvc3QuCi0gKiBIZXJlIGlzIHRoZSBsZXZlbCBvZiBjb21wYXRpYmlsaXR5Ci0gKiAoYmV0d2VlbiB0aGUgdXNlciBsZXZlbCBkYWVtb24gYW5kIHRoZSBrZXJuZWwgS1ZQIGRyaXZlcikgdGhhdCB3ZQotICogd2lsbCBpbXBsZW1lbnQ6Ci0gKgotICogQW4gb2xkZXIgZGFlbW9uIHdpbGwgYWx3YXlzIGJlIHN1cHBvcnRlZCBvbiBhIG5ld2VyIGRyaXZlci4KLSAqIEEgZ2l2ZW4gdXNlciBsZXZlbCBkYWVtb24gd2lsbCByZXF1aXJlIGEgbWluaW1hbCB2ZXJzaW9uIG9mIHRoZQotICoga2VybmVsIGRyaXZlci4KLSAqIElmIHdlIGNhbm5vdCBoYW5kbGUgdGhlIHZlcnNpb24gZGlmZmVyZW5jZXMsIHdlIHdpbGwgZmFpbCBncmFjZWZ1bGx5Ci0gKiAodGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgaGF2ZSBhIHVzZXIgbGV2ZWwgZGFlbW9uIHRoYXQgaXMgbW9yZQotICogYWR2YW5jZWQgdGhhbiB0aGUgS1ZQIGRyaXZlci4KLSAqCi0gKiBXZSB3aWxsIHVzZSB2YWx1ZXMgdXNlZCBpbiB0aGlzIGhhbmRzaGFrZSBmb3IgZGV0ZXJtaW5pbmcgaWYgd2UgaGF2ZQotICogd29ya2FibGUgdXNlciBsZXZlbCBkYWVtb24gYW5kIHRoZSBrZXJuZWwgZHJpdmVyLiBXZSBiZWdpbiBieSB0YWtpbmcgdGhlCi0gKiByZWdpc3RyYXRpb24gb3Bjb2RlIG91dCBvZiB0aGUgS1ZQIG9wY29kZSBuYW1lc3BhY2UuIFdlIHdpbGwgaG93ZXZlciwKLSAqIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZXhpc3RpbmcgdXNlci1sZXZlbCBkYWVtb24gY29kZS4KLSAqLwotCi0vKgotICogRGFlbW9uIGNvZGUgbm90IHN1cHBvcnRpbmcgSVAgaW5qZWN0aW9uIChsZWdhY3kgZGFlbW9uKS4KLSAqLwotCi0jZGVmaW5lIEtWUF9PUF9SRUdJU1RFUgk0Ci0KLS8qCi0gKiBEYWVtb24gY29kZSBzdXBwb3J0aW5nIElQIGluamVjdGlvbi4KLSAqIFRoZSBLVlAgb3Bjb2RlIGZpZWxkIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhlCi0gKiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb247IHNvIGRlZmluZSBhIG5hbWVzcGFjZSB0aGF0Ci0gKiB3aWxsIGJlIGRpc3RpbmN0IGZyb20gdGhlIGhvc3QgZGVmaW5lZCBLVlAgb3Bjb2RlLgotICovCi0KLSNkZWZpbmUgS1ZQX09QX1JFR0lTVEVSMSAxMDAKLQotZW51bSBodl9rdnBfZXhjaGdfb3AgewotCUtWUF9PUF9HRVQgPSAwLAotCUtWUF9PUF9TRVQsCi0JS1ZQX09QX0RFTEVURSwKLQlLVlBfT1BfRU5VTUVSQVRFLAotCUtWUF9PUF9HRVRfSVBfSU5GTywKLQlLVlBfT1BfU0VUX0lQX0lORk8sCi0JS1ZQX09QX0NPVU5UIC8qIE51bWJlciBvZiBvcGVyYXRpb25zLCBtdXN0IGJlIGxhc3QuICovCi19OwotCi1lbnVtIGh2X2t2cF9leGNoZ19wb29sIHsKLQlLVlBfUE9PTF9FWFRFUk5BTCA9IDAsCi0JS1ZQX1BPT0xfR1VFU1QsCi0JS1ZQX1BPT0xfQVVUTywKLQlLVlBfUE9PTF9BVVRPX0VYVEVSTkFMLAotCUtWUF9QT09MX0FVVE9fSU5URVJOQUwsCi0JS1ZQX1BPT0xfQ09VTlQgLyogTnVtYmVyIG9mIHBvb2xzLCBtdXN0IGJlIGxhc3QuICovCi19OwotCi0vKgotICogU29tZSBIeXBlci1WIHN0YXR1cyBjb2Rlcy4KLSAqLwotCi0jZGVmaW5lIEhWX1NfT0sJCQkJMHgwMDAwMDAwMAotI2RlZmluZSBIVl9FX0ZBSUwJCQkweDgwMDA0MDA1Ci0jZGVmaW5lIEhWX1NfQ09OVAkJCTB4ODAwNzAxMDMKLSNkZWZpbmUgSFZfRVJST1JfTk9UX1NVUFBPUlRFRAkJMHg4MDA3MDAzMgotI2RlZmluZSBIVl9FUlJPUl9NQUNISU5FX0xPQ0tFRAkJMHg4MDA3MDRGNwotI2RlZmluZSBIVl9FUlJPUl9ERVZJQ0VfTk9UX0NPTk5FQ1RFRAkweDgwMDcwNDhGCi0jZGVmaW5lIEhWX0lOVkFMSURBUkcJCQkweDgwMDcwMDU3Ci0jZGVmaW5lIEhWX0dVSURfTk9URk9VTkQJCTB4ODAwNDEwMDIKLQotI2RlZmluZSBBRERSX0ZBTUlMWV9OT05FCTB4MDAKLSNkZWZpbmUgQUREUl9GQU1JTFlfSVBWNAkweDAxCi0jZGVmaW5lIEFERFJfRkFNSUxZX0lQVjYJMHgwMgotCi0jZGVmaW5lIE1BWF9BREFQVEVSX0lEX1NJWkUJMTI4Ci0jZGVmaW5lIE1BWF9JUF9BRERSX1NJWkUJMTAyNAotI2RlZmluZSBNQVhfR0FURVdBWV9TSVpFCTUxMgotCi0KLXN0cnVjdCBodl9rdnBfaXBhZGRyX3ZhbHVlIHsKLQlfX3UxNglhZGFwdGVyX2lkW01BWF9BREFQVEVSX0lEX1NJWkVdOwotCV9fdTgJYWRkcl9mYW1pbHk7Ci0JX191OAlkaGNwX2VuYWJsZWQ7Ci0JX191MTYJaXBfYWRkcltNQVhfSVBfQUREUl9TSVpFXTsKLQlfX3UxNglzdWJfbmV0W01BWF9JUF9BRERSX1NJWkVdOwotCV9fdTE2CWdhdGVfd2F5W01BWF9HQVRFV0FZX1NJWkVdOwotCV9fdTE2CWRuc19hZGRyW01BWF9JUF9BRERSX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotCi1zdHJ1Y3QgaHZfa3ZwX2hkciB7Ci0JX191OCBvcGVyYXRpb247Ci0JX191OCBwb29sOwotCV9fdTE2IHBhZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIHsKLQlfX3UzMiB2YWx1ZV90eXBlOwotCV9fdTMyIGtleV9zaXplOwotCV9fdTMyIHZhbHVlX3NpemU7Ci0JX191OCBrZXlbSFZfS1ZQX0VYQ0hBTkdFX01BWF9LRVlfU0laRV07Ci0JdW5pb24gewotCQlfX3U4IHZhbHVlW0hWX0tWUF9FWENIQU5HRV9NQVhfVkFMVUVfU0laRV07Ci0JCV9fdTMyIHZhbHVlX3UzMjsKLQkJX191NjQgdmFsdWVfdTY0OwotCX07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZfa3ZwX21zZ19lbnVtZXJhdGUgewotCV9fdTMyIGluZGV4OwotCXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIGRhdGE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZfa3ZwX21zZ19nZXQgewotCXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIGRhdGE7Ci19OwotCi1zdHJ1Y3QgaHZfa3ZwX21zZ19zZXQgewotCXN0cnVjdCBodl9rdnBfZXhjaGdfbXNnX3ZhbHVlIGRhdGE7Ci19OwotCi1zdHJ1Y3QgaHZfa3ZwX21zZ19kZWxldGUgewotCV9fdTMyIGtleV9zaXplOwotCV9fdTgga2V5W0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOwotfTsKLQotc3RydWN0IGh2X2t2cF9yZWdpc3RlciB7Ci0JX191OCB2ZXJzaW9uW0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOwotfTsKLQotc3RydWN0IGh2X2t2cF9tc2cgewotCXVuaW9uIHsKLQkJc3RydWN0IGh2X2t2cF9oZHIJa3ZwX2hkcjsKLQkJaW50IGVycm9yOwotCX07Ci0JdW5pb24gewotCQlzdHJ1Y3QgaHZfa3ZwX21zZ19nZXQJCWt2cF9nZXQ7Ci0JCXN0cnVjdCBodl9rdnBfbXNnX3NldAkJa3ZwX3NldDsKLQkJc3RydWN0IGh2X2t2cF9tc2dfZGVsZXRlCWt2cF9kZWxldGU7Ci0JCXN0cnVjdCBodl9rdnBfbXNnX2VudW1lcmF0ZQlrdnBfZW51bV9kYXRhOwotCQlzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSAgICAgIGt2cF9pcF92YWw7Ci0JCXN0cnVjdCBodl9rdnBfcmVnaXN0ZXIJCWt2cF9yZWdpc3RlcjsKLQl9IGJvZHk7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZfa3ZwX2lwX21zZyB7Ci0JX191OCBvcGVyYXRpb247Ci0JX191OCBwb29sOwotCXN0cnVjdCBodl9rdnBfaXBhZGRyX3ZhbHVlICAgICAga3ZwX2lwX3ZhbDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpAQCAtMzU0LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KIAogCi0jZGVmaW5lIE1BWF9QQUdFX0JVRkZFUl9DT1VOVAkJCQkxOQorI2RlZmluZSBNQVhfUEFHRV9CVUZGRVJfQ09VTlQJCQkJMzIKICNkZWZpbmUgTUFYX01VTFRJUEFHRV9CVUZGRVJfQ09VTlQJCQkzMiAvKiAxMjhLICovCiAKICNwcmFnbWEgcGFjayhwdXNoLCAxKQpAQCAtMTA0Myw2ICs3MjYsMTAgQEAKIAkgKiBUaGlzIHdpbGwgYmUgTlVMTCBmb3IgdGhlIHByaW1hcnkgY2hhbm5lbC4KIAkgKi8KIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqcHJpbWFyeV9jaGFubmVsOworCS8qCisJICogU3VwcG9ydCBwZXItY2hhbm5lbCBzdGF0ZSBmb3IgdXNlIGJ5IHZtYnVzIGRyaXZlcnMuCisJICovCisJdm9pZCAqcGVyX2NoYW5uZWxfc3RhdGU7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NoYW5uZWxfcmVhZF9zdGF0ZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqYywgYm9vbCBzdGF0ZSkKQEAgLTEwNTAsNiArNzM3LDE2IEBACiAJYy0+YmF0Y2hlZF9yZWFkaW5nID0gc3RhdGU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGVyX2NoYW5uZWxfc3RhdGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMsIHZvaWQgKnMpCit7CisJYy0+cGVyX2NoYW5uZWxfc3RhdGUgPSBzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdldF9wZXJfY2hhbm5lbF9zdGF0ZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqYykKK3sKKwlyZXR1cm4gYy0+cGVyX2NoYW5uZWxfc3RhdGU7Cit9CisKIHZvaWQgdm1idXNfb25tZXNzYWdlKHZvaWQgKmNvbnRleHQpOwogCiBpbnQgdm1idXNfcmVxdWVzdF9vZmZlcnModm9pZCk7CkBAIC0xMTE4LDcgKzgxNSw3IEBACiBleHRlcm4gdm9pZCB2bWJ1c19jbG9zZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7CiAKIGV4dGVybiBpbnQgdm1idXNfc2VuZHBhY2tldChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCQkgIHZvaWQgKmJ1ZmZlciwKIAkJCQkgIHUzMiBidWZmZXJMZW4sCiAJCQkJICB1NjQgcmVxdWVzdGlkLAogCQkJCSAgZW51bSB2bWJ1c19wYWNrZXRfdHlwZSB0eXBlLApAQCAtMTM1Miw2ICsxMDQ5LDE3IEBACiAJCX0KIAogLyoKKyAqIEd1ZXN0IEZpbGUgQ29weSBTZXJ2aWNlCisgKiB7MzREMTRCRTMtREVFNC00MWM4LTlBRTctNkIxNzQ5NzdDMTkyfQorICovCisKKyNkZWZpbmUgSFZfRkNPUFlfR1VJRCBcCisJLmd1aWQgPSB7IFwKKwkJCTB4RTMsIDB4NEIsIDB4RDEsIDB4MzQsIDB4RTQsIDB4REUsIDB4QzgsIDB4NDEsIFwKKwkJCTB4OUEsIDB4RTcsIDB4NkIsIDB4MTcsIDB4NDksIDB4NzcsIDB4QzEsIDB4OTIgXAorCQl9CisKKy8qCiAgKiBDb21tb24gaGVhZGVyIGZvciBIeXBlci1WIElDcwogICovCiAKQEAgLTE0NTksMTEgKzExNjcsMTIgQEAKIHZvaWQgaHZfdnNzX2RlaW5pdCh2b2lkKTsKIHZvaWQgaHZfdnNzX29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKik7CiAKK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgaHlwZXJ2X21taW87CisKIC8qCiAgKiBOZWdvdGlhdGVkIHZlcnNpb24gd2l0aCB0aGUgSG9zdC4KICAqLwogCiBleHRlcm4gX191MzIgdm1idXNfcHJvdG9fdmVyc2lvbjsKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfSFlQRVJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRyLmggYi9pbmNsdWRlL2xpbnV4L2lkci5oCmluZGV4IDg3MWEyMTMuLjljOTVkMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZHIuaApAQCAtODUsNiArODUsNyBAQAogdm9pZCBpZHJfZnJlZShzdHJ1Y3QgaWRyICppZHAsIGludCBpZCk7CiB2b2lkIGlkcl9kZXN0cm95KHN0cnVjdCBpZHIgKmlkcCk7CiB2b2lkIGlkcl9pbml0KHN0cnVjdCBpZHIgKmlkcCk7Citib29sIGlkcl9pc19lbXB0eShzdHJ1Y3QgaWRyICppZHApOwogCiAvKioKICAqIGlkcl9wcmVsb2FkX2VuZCAtIGVuZCBwcmVsb2FkIHNlY3Rpb24gc3RhcnRlZCB3aXRoIGlkcl9wcmVsb2FkKCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL2lpby5oIGIvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKaW5kZXggNzVhOGEyMC4uNWYyZDAwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKQEAgLTI1NCwxMiArMjU0LDE2IEBACiAJCShjaGFuLT5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCAmIEJJVCh0eXBlKSk7CiB9CiAKLSNkZWZpbmUgSUlPX1NUKHNpLCByYiwgc2IsIHNoKQkJCQkJCVwKLQl7IC5zaWduID0gc2ksIC5yZWFsYml0cyA9IHJiLCAuc3RvcmFnZWJpdHMgPSBzYiwgLnNoaWZ0ID0gc2ggfQotCi0jZGVmaW5lIElJT19DSEFOX1NPRlRfVElNRVNUQU1QKF9zaSkJCQkJCVwKLQl7IC50eXBlID0gSUlPX1RJTUVTVEFNUCwgLmNoYW5uZWwgPSAtMSwJCQkJXAotCQkJLnNjYW5faW5kZXggPSBfc2ksIC5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCA2NCwgNjQsIDApIH0KKyNkZWZpbmUgSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoX3NpKSB7CQkJCQlcCisJLnR5cGUgPSBJSU9fVElNRVNUQU1QLAkJCQkJCVwKKwkuY2hhbm5lbCA9IC0xLAkJCQkJCQlcCisJLnNjYW5faW5kZXggPSBfc2ksCQkJCQkJXAorCS5zY2FuX3R5cGUgPSB7CQkJCQkJCVwKKwkJLnNpZ24gPSAncycsCQkJCQkJXAorCQkucmVhbGJpdHMgPSA2NCwJCQkJCVwKKwkJLnN0b3JhZ2ViaXRzID0gNjQsCQkJCQlcCisJCX0sCQkJCQkJCVwKK30KIAogLyoqCiAgKiBpaW9fZ2V0X3RpbWVfbnMoKSAtIHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGEgdGltZSBzdGFtcCBmb3IgZXZlbnRzIGV0YwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCBlMTY4ODgwLi5hM2JhMjcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtMTYzLDYgKzE2MywyMyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCisjaWZkZWYgQ09ORklHX0xUTworLyogV29yayBhcm91bmQgYSBMVE8gZ2NjIHByb2JsZW06IHdoZW4gdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHRvIGEgdmFyaWFibGUKKyAqIGluIGEgbW9kdWxlIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbS4gVGhpcyBjYXVzZXMKKyAqIHJlb3JkZXJpbmcgb2YgaW5pdGNhbGxzIHdoaWNoIHRoZSBrZXJuZWwgZG9lcyBub3QgbGlrZS4KKyAqIEFkZCBhIGR1bW15IHJlZmVyZW5jZSBmdW5jdGlvbiB0byBhdm9pZCB0aGlzLiBUaGUgZnVuY3Rpb24gaXMKKyAqIGRlbGV0ZWQgYnkgdGhlIGxpbmtlci4KKyAqLworI2RlZmluZSBMVE9fUkVGRVJFTkNFX0lOSVRDQUxMKHgpIFwKKwk7IC8qIHllcyB0aGlzIGlzIG5lZWRlZCAqLwkJCVwKKwlzdGF0aWMgX191c2VkIF9fZXhpdCB2b2lkICpyZWZlcmVuY2VfIyN4KHZvaWQpCVwKKwl7CQkJCQkJXAorCQlyZXR1cm4gJng7CQkJCVwKKwl9CisjZWxzZQorI2RlZmluZSBMVE9fUkVGRVJFTkNFX0lOSVRDQUxMKHgpCisjZW5kaWYKKwogLyogaW5pdGNhbGxzIGFyZSBub3cgZ3JvdXBlZCBieSBmdW5jdGlvbmFsaXR5IGludG8gc2VwYXJhdGUgCiAgKiBzdWJzZWN0aW9ucy4gT3JkZXJpbmcgaW5zaWRlIHRoZSBzdWJzZWN0aW9ucyBpcyBkZXRlcm1pbmVkCiAgKiBieSBsaW5rIG9yZGVyLiAKQEAgLTE3NSw3ICsxOTIsOCBAQAogCiAjZGVmaW5lIF9fZGVmaW5lX2luaXRjYWxsKGZuLCBpZCkgXAogCXN0YXRpYyBpbml0Y2FsbF90IF9faW5pdGNhbGxfIyNmbiMjaWQgX191c2VkIFwKLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmluaXRjYWxsIiAjaWQgIi5pbml0IikpKSA9IGZuCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5pbml0Y2FsbCIgI2lkICIuaW5pdCIpKSkgPSBmbjsgXAorCUxUT19SRUZFUkVOQ0VfSU5JVENBTEwoX19pbml0Y2FsbF8jI2ZuIyNpZCkKIAogLyoKICAqIEVhcmx5IGluaXRjYWxscyBydW4gYmVmb3JlIGluaXRpYWxpemluZyBTTVAuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAppbmRleCBhMjY3OGQzLi5jN2JmYWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKQEAgLTE4OCw2ICsxODgsNyBAQAogZXh0ZXJuIHZvaWQgZGlzYWJsZV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIGVuYWJsZV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKTsKK2V4dGVybiB2b2lkIGlycV93YWtlX3RocmVhZCh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCiAvKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhcmUgZm9yIHRoZSBjb3JlIGtlcm5lbCB1c2Ugb25seS4gKi8KIGV4dGVybiB2b2lkIHN1c3BlbmRfZGV2aWNlX2lycXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvLmggYi9pbmNsdWRlL2xpbnV4L2lvLmgKaW5kZXggZjRmNDJmYS4uOGExOGU3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pby5oCisrKyBiL2luY2x1ZGUvbGludXgvaW8uaApAQCAtMjQsNyArMjQsNyBAQAogCiBzdHJ1Y3QgZGV2aWNlOwogCi12b2lkIF9faW93cml0ZTMyX2NvcHkodm9pZCBfX2lvbWVtICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgc2l6ZV90IGNvdW50KTsKK19fdmlzaWJsZSB2b2lkIF9faW93cml0ZTMyX2NvcHkodm9pZCBfX2lvbWVtICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgc2l6ZV90IGNvdW50KTsKIHZvaWQgX19pb3dyaXRlNjRfY29weSh2b2lkIF9faW9tZW0gKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgY291bnQpOwogCiAjaWZkZWYgQ09ORklHX01NVQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaCBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKaW5kZXggODliN2MyNC4uNWUzYTkwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCkBAIC01MSw3ICs1MSw3IEBACiAKICNkZWZpbmUgSU9SRVNPVVJDRV9FWENMVVNJVkUJMHgwODAwMDAwMAkvKiBVc2VybGFuZCBtYXkgbm90IG1hcCB0aGlzIHJlc291cmNlICovCiAjZGVmaW5lIElPUkVTT1VSQ0VfRElTQUJMRUQJMHgxMDAwMDAwMAotI2RlZmluZSBJT1JFU09VUkNFX1VOU0VUCTB4MjAwMDAwMDAKKyNkZWZpbmUgSU9SRVNPVVJDRV9VTlNFVAkweDIwMDAwMDAwCS8qIE5vIGFkZHJlc3MgYXNzaWduZWQgeWV0ICovCiAjZGVmaW5lIElPUkVTT1VSQ0VfQVVUTwkJMHg0MDAwMDAwMAogI2RlZmluZSBJT1JFU09VUkNFX0JVU1kJCTB4ODAwMDAwMDAJLyogRHJpdmVyIGhhcyBtYXJrZWQgdGhpcyByZXNvdXJjZSBidXN5ICovCiAKQEAgLTE2OSw2ICsxNjksMTYgQEAKIHsKIAlyZXR1cm4gcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVFlQRV9CSVRTOwogfQorLyogVHJ1ZSBpZmYgcjEgY29tcGxldGVseSBjb250YWlucyByMiAqLworc3RhdGljIGlubGluZSBib29sIHJlc291cmNlX2NvbnRhaW5zKHN0cnVjdCByZXNvdXJjZSAqcjEsIHN0cnVjdCByZXNvdXJjZSAqcjIpCit7CisJaWYgKHJlc291cmNlX3R5cGUocjEpICE9IHJlc291cmNlX3R5cGUocjIpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHIxLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQgfHwgcjItPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiByMS0+c3RhcnQgPD0gcjItPnN0YXJ0ICYmIHIxLT5lbmQgPj0gcjItPmVuZDsKK30KKwogCiAvKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgd2l0aCBhbGxvY2F0aW9uICovCiAjZGVmaW5lIHJlcXVlc3RfcmVnaW9uKHN0YXJ0LG4sbmFtZSkJCV9fcmVxdWVzdF9yZWdpb24oJmlvcG9ydF9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSksIDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA3ZGMxMDAzLi5kMjc4ODM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTMwMyw2ICszMDMsMTAgQEAKICAqIEBpcnFfcG1fc2h1dGRvd246CWZ1bmN0aW9uIGNhbGxlZCBmcm9tIGNvcmUgY29kZSBvbiBzaHV0ZG93biBvbmNlIHBlciBjaGlwCiAgKiBAaXJxX2NhbGNfbWFzazoJT3B0aW9uYWwgZnVuY3Rpb24gdG8gc2V0IGlycV9kYXRhLm1hc2sgZm9yIHNwZWNpYWwgY2FzZXMKICAqIEBpcnFfcHJpbnRfY2hpcDoJb3B0aW9uYWwgdG8gcHJpbnQgc3BlY2lhbCBjaGlwIGluZm8gaW4gc2hvd19pbnRlcnJ1cHRzCisgKiBAaXJxX3JlcXVlc3RfcmVzb3VyY2VzOglvcHRpb25hbCB0byByZXF1ZXN0IHJlc291cmNlcyBiZWZvcmUgY2FsbGluZworICoJCQkJYW55IG90aGVyIGNhbGxiYWNrIHJlbGF0ZWQgdG8gdGhpcyBpcnEKKyAqIEBpcnFfcmVsZWFzZV9yZXNvdXJjZXM6CW9wdGlvbmFsIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGFjcXVpcmVkIHdpdGgKKyAqCQkJCWlycV9yZXF1ZXN0X3Jlc291cmNlcwogICogQGZsYWdzOgkJY2hpcCBzcGVjaWZpYyBmbGFncwogICovCiBzdHJ1Y3QgaXJxX2NoaXAgewpAQCAtMzM2LDYgKzM0MCw4IEBACiAJdm9pZAkJKCppcnFfY2FsY19tYXNrKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCiAJdm9pZAkJKCppcnFfcHJpbnRfY2hpcCkoc3RydWN0IGlycV9kYXRhICpkYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnApOworCWludAkJKCppcnFfcmVxdWVzdF9yZXNvdXJjZXMpKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CisJdm9pZAkJKCppcnFfcmVsZWFzZV9yZXNvdXJjZXMpKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CiAKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogfTsKQEAgLTM0OSw2ICszNTUsOCBAQAogICogSVJRQ0hJUF9PTk9GRkxJTkVfRU5BQkxFRDoJT25seSBjYWxsIGlycV9vbi9vZmZfbGluZSBjYWxsYmFja3MKICAqCQkJCXdoZW4gaXJxIGVuYWJsZWQKICAqIElSUUNISVBfU0tJUF9TRVRfV0FLRToJU2tpcCBjaGlwLmlycV9zZXRfd2FrZSgpLCBmb3IgdGhpcyBpcnEgY2hpcAorICogSVJRQ0hJUF9PTkVTSE9UX1NBRkU6CU9uZSBzaG90IGRvZXMgbm90IHJlcXVpcmUgbWFzay91bm1hc2sKKyAqIElSUUNISVBfRU9JX1RIUkVBREVEOglDaGlwIHJlcXVpcmVzIGVvaSgpIG9uIHVubWFzayBpbiB0aHJlYWRlZCBtb2RlCiAgKi8KIGVudW0gewogCUlSUUNISVBfU0VUX1RZUEVfTUFTS0VECQk9ICgxIDw8ICAwKSwKQEAgLTM1Nyw2ICszNjUsNyBAQAogCUlSUUNISVBfT05PRkZMSU5FX0VOQUJMRUQJPSAoMSA8PCAgMyksCiAJSVJRQ0hJUF9TS0lQX1NFVF9XQUtFCQk9ICgxIDw8ICA0KSwKIAlJUlFDSElQX09ORVNIT1RfU0FGRQkJPSAoMSA8PCAgNSksCisJSVJRQ0hJUF9FT0lfVEhSRUFERUQJCT0gKDEgPDwgIDYpLAogfTsKIAogLyogVGhpcyBpbmNsdWRlIHdpbGwgZ28gYXdheSBvbmNlIHdlIGlzb2xhdGVkIGlycV9kZXNjIHVzYWdlIHRvIGNvcmUgY29kZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFfd29yay5oIGIvaW5jbHVkZS9saW51eC9pcnFfd29yay5oCmluZGV4IDY2MDE3MDIuLjE5YWUwNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxX3dvcmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycV93b3JrLmgKQEAgLTMwLDcgKzMwLDkgQEAKIAl3b3JrLT5mdW5jID0gZnVuYzsKIH0KIAotdm9pZCBpcnFfd29ya19xdWV1ZShzdHJ1Y3QgaXJxX3dvcmsgKndvcmspOworI2RlZmluZSBERUZJTkVfSVJRX1dPUksobmFtZSwgX2YpIHN0cnVjdCBpcnFfd29yayBuYW1lID0geyAuZnVuYyA9IChfZiksIH0KKworYm9vbCBpcnFfd29ya19xdWV1ZShzdHJ1Y3QgaXJxX3dvcmsgKndvcmspOwogdm9pZCBpcnFfd29ya19ydW4odm9pZCk7CiB2b2lkIGlycV93b3JrX3N5bmMoc3RydWN0IGlycV93b3JrICp3b3JrKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggMTk2ZDFlYS4uMDhmYjAyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC00NTgsNyArNDU4LDcgQEAKIAogI2RlZmluZSBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUJMAogI2RlZmluZSBUQUlOVF9GT1JDRURfTU9EVUxFCQkxCi0jZGVmaW5lIFRBSU5UX1VOU0FGRV9TTVAJCTIKKyNkZWZpbmUgVEFJTlRfQ1BVX09VVF9PRl9TUEVDCQkyCiAjZGVmaW5lIFRBSU5UX0ZPUkNFRF9STU1PRAkJMwogI2RlZmluZSBUQUlOVF9NQUNISU5FX0NIRUNLCQk0CiAjZGVmaW5lIFRBSU5UX0JBRF9QQUdFCQkJNQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCmluZGV4IDUxYzcyYmUuLmVjYmM1MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92dGltZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KIAogLyoKICAqICdrZXJuZWxfc3RhdC5oJyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgbmVlZGVkIGZvciBkb2luZwpAQCAtNTEsMTQgKzUxLDggQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBucl9jb250ZXh0X3N3aXRjaGVzKHZvaWQpOwogCi0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiBleHRlcm4gdW5zaWduZWQgaW50IGtzdGF0X2lycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpOwotCi0jZGVmaW5lIGtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnFubywgREVTQykJCVwKLWRvIHsJCQkJCQkJXAotCV9fdGhpc19jcHVfaW5jKCooREVTQyktPmtzdGF0X2lycXMpOwkJXAotCV9fdGhpc19jcHVfaW5jKGtzdGF0LmlycXNfc3VtKTsJCQlcCi19IHdoaWxlICgwKQorZXh0ZXJuIHZvaWQga3N0YXRfaW5jcl9pcnFfdGhpc19jcHUodW5zaWduZWQgaW50IGlycSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrc3RhdF9pbmNyX3NvZnRpcnFzX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5mcy5oIGIvaW5jbHVkZS9saW51eC9rZXJuZnMuaAppbmRleCBkMjY3NjIzLi5iMDEyMmRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5mcy5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmZzLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogc3RydWN0IGZpbGU7CiBzdHJ1Y3QgZGVudHJ5OwpAQCAtMzUsMTYgKzM1LDIyIEBACiB9OwogCiAjZGVmaW5lIEtFUk5GU19UWVBFX01BU0sJMHgwMDBmCi0jZGVmaW5lIEtFUk5GU19BQ1RJVkVfUkVGCUtFUk5GU19GSUxFCiAjZGVmaW5lIEtFUk5GU19GTEFHX01BU0sJfktFUk5GU19UWVBFX01BU0sKIAogZW51bSBrZXJuZnNfbm9kZV9mbGFnIHsKLQlLRVJORlNfUkVNT1ZFRAkJPSAweDAwMTAsCisJS0VSTkZTX0FDVElWQVRFRAk9IDB4MDAxMCwKIAlLRVJORlNfTlMJCT0gMHgwMDIwLAogCUtFUk5GU19IQVNfU0VRX1NIT1cJPSAweDAwNDAsCiAJS0VSTkZTX0hBU19NTUFQCQk9IDB4MDA4MCwKIAlLRVJORlNfTE9DS0RFUAkJPSAweDAxMDAsCiAJS0VSTkZTX1NUQVRJQ19OQU1FCT0gMHgwMjAwLAorCUtFUk5GU19TVUlDSURBTAkJPSAweDA0MDAsCisJS0VSTkZTX1NVSUNJREVECQk9IDB4MDgwMCwKK307CisKKy8qIEBmbGFncyBmb3Iga2VybmZzX2NyZWF0ZV9yb290KCkgKi8KK2VudW0ga2VybmZzX3Jvb3RfZmxhZyB7CisJS0VSTkZTX1JPT1RfQ1JFQVRFX0RFQUNUSVZBVEVEID0gMHgwMDAxLAogfTsKIAogLyogdHlwZS1zcGVjaWZpYyBzdHJ1Y3R1cmVzIGZvciBrZXJuZnNfbm9kZSB1bmlvbiBtZW1iZXJzICovCkBAIC04NSwxNyArOTEsMTcgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwogCXN0cnVjdCBsb2NrZGVwX21hcAlkZXBfbWFwOwogI2VuZGlmCi0JLyogdGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBwdWJsaXNoZWQgKi8KKwkvKgorCSAqIFVzZSBrZXJuZnNfZ2V0X3BhcmVudCgpIGFuZCBrZXJuZnNfbmFtZS9wYXRoKCkgaW5zdGVhZCBvZgorCSAqIGFjY2Vzc2luZyB0aGUgZm9sbG93aW5nIHR3byBmaWVsZHMgZGlyZWN0bHkuICBJZiB0aGUgbm9kZSBpcworCSAqIG5ldmVyIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBhcmVudCwgaXQgaXMgc2FmZSB0byBhY2Nlc3MgdGhlCisJICogcGFyZW50IGRpcmVjdGx5LgorCSAqLwogCXN0cnVjdCBrZXJuZnNfbm9kZQkqcGFyZW50OwogCWNvbnN0IGNoYXIJCSpuYW1lOwogCiAJc3RydWN0IHJiX25vZGUJCXJiOwogCi0JdW5pb24gewotCQlzdHJ1Y3QgY29tcGxldGlvbgkqY29tcGxldGlvbjsKLQkJc3RydWN0IGtlcm5mc19ub2RlCSpyZW1vdmVkX2xpc3Q7Ci0JfSB1OwotCiAJY29uc3Qgdm9pZAkJKm5zOwkvKiBuYW1lc3BhY2UgdGFnICovCiAJdW5zaWduZWQgaW50CQloYXNoOwkvKiBucyArIG5hbWUgaGFzaCAqLwogCXVuaW9uIHsKQEAgLTExMywxMiArMTE5LDE2IEBACiB9OwogCiAvKgotICoga2VybmZzX2Rpcl9vcHMgbWF5IGJlIHNwZWNpZmllZCBvbiBrZXJuZnNfY3JlYXRlX3Jvb3QoKSB0byBzdXBwb3J0Ci0gKiBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN5c2NhbGxzLiAgVGhlc2Ugb3B0aW9uYWwgY2FsbGJhY2tzIGFyZSBpbnZva2VkCi0gKiBvbiB0aGUgbWF0Y2hpbmcgc3lzY2FsbHMgYW5kIGNhbiBwZXJmb3JtIGFueSBrZXJuZnMgb3BlcmF0aW9ucyB3aGljaAotICogZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBiZSB0aGUgZXhhY3Qgb3BlcmF0aW9uIHJlcXVlc3RlZC4KKyAqIGtlcm5mc19zeXNjYWxsX29wcyBtYXkgYmUgc3BlY2lmaWVkIG9uIGtlcm5mc19jcmVhdGVfcm9vdCgpIHRvIHN1cHBvcnQKKyAqIHN5c2NhbGxzLiAgVGhlc2Ugb3B0aW9uYWwgY2FsbGJhY2tzIGFyZSBpbnZva2VkIG9uIHRoZSBtYXRjaGluZyBzeXNjYWxscworICogYW5kIGNhbiBwZXJmb3JtIGFueSBrZXJuZnMgb3BlcmF0aW9ucyB3aGljaCBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHRvIGJlCisgKiB0aGUgZXhhY3Qgb3BlcmF0aW9uIHJlcXVlc3RlZC4gIEFuIGFjdGl2ZSByZWZlcmVuY2UgaXMgaGVsZCBmb3IgZWFjaAorICoga2VybmZzX25vZGUgcGFyYW1ldGVyLgogICovCi1zdHJ1Y3Qga2VybmZzX2Rpcl9vcHMgeworc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyB7CisJaW50ICgqcmVtb3VudF9mcykoc3RydWN0IGtlcm5mc19yb290ICpyb290LCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKTsKKwlpbnQgKCpzaG93X29wdGlvbnMpKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCk7CisKIAlpbnQgKCpta2Rpcikoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgdW1vZGVfdCBtb2RlKTsKIAlpbnQgKCpybWRpcikoc3RydWN0IGtlcm5mc19ub2RlICprbik7CkBAIC0xMjksMjIgKzEzOSwyNiBAQAogc3RydWN0IGtlcm5mc19yb290IHsKIAkvKiBwdWJsaXNoZWQgZmllbGRzICovCiAJc3RydWN0IGtlcm5mc19ub2RlCSprbjsKKwl1bnNpZ25lZCBpbnQJCWZsYWdzOwkvKiBLRVJORlNfUk9PVF8qIGZsYWdzICovCiAKIAkvKiBwcml2YXRlIGZpZWxkcywgZG8gbm90IHVzZSBvdXRzaWRlIGtlcm5mcyBwcm9wZXIgKi8KIAlzdHJ1Y3QgaWRhCQlpbm9faWRhOwotCXN0cnVjdCBrZXJuZnNfZGlyX29wcwkqZGlyX29wczsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzeXNjYWxsX29wczsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlkZWFjdGl2YXRlX3dhaXRxOwogfTsKIAogc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgewogCS8qIHB1Ymxpc2hlZCBmaWVsZHMgKi8KIAlzdHJ1Y3Qga2VybmZzX25vZGUJKmtuOwogCXN0cnVjdCBmaWxlCQkqZmlsZTsKKwl2b2lkCQkJKnByaXY7CiAKIAkvKiBwcml2YXRlIGZpZWxkcywgZG8gbm90IHVzZSBvdXRzaWRlIGtlcm5mcyBwcm9wZXIgKi8KIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCWludAkJCWV2ZW50OwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAorCXNpemVfdAkJCWF0b21pY193cml0ZV9sZW47CiAJYm9vbAkJCW1tYXBwZWQ7CiAJY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICp2bV9vcHM7CiB9OwpAQCAtMTcxLDkgKzE4NSwxMyBAQAogCQkJbG9mZl90IG9mZik7CiAKIAkvKgotCSAqIHdyaXRlKCkgaXMgYm91bmNlZCB0aHJvdWdoIGtlcm5lbCBidWZmZXIgYW5kIGEgd3JpdGUgbGFyZ2VyIHRoYW4KLQkgKiBQQUdFX1NJWkUgcmVzdWx0cyBpbiBwYXJ0aWFsIG9wZXJhdGlvbiBvZiBQQUdFX1NJWkUuCisJICogd3JpdGUoKSBpcyBib3VuY2VkIHRocm91Z2gga2VybmVsIGJ1ZmZlci4gIElmIGF0b21pY193cml0ZV9sZW4KKwkgKiBpcyBub3Qgc2V0LCBhIHdyaXRlIGxhcmdlciB0aGFuIFBBR0VfU0laRSByZXN1bHRzIGluIHBhcnRpYWwKKwkgKiBvcGVyYXRpb25zIG9mIFBBR0VfU0laRSBjaHVua3MuICBJZiBhdG9taWNfd3JpdGVfbGVuIGlzIHNldCwKKwkgKiB3cml0ZXMgdXB0byB0aGUgc3BlY2lmaWVkIHNpemUgYXJlIGV4ZWN1dGVkIGF0b21pY2FsbHkgYnV0CisJICogbGFyZ2VyIG9uZXMgYXJlIHJlamVjdGVkIHdpdGggLUUyQklHLgogCSAqLworCXNpemVfdCBhdG9taWNfd3JpdGVfbGVuOwogCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICpidWYsIHNpemVfdCBieXRlcywKIAkJCSBsb2ZmX3Qgb2ZmKTsKIApAQCAtMTg0LDcgKzIwMiw3IEBACiAjZW5kaWYKIH07CiAKLSNpZmRlZiBDT05GSUdfU1lTRlMKKyNpZmRlZiBDT05GSUdfS0VSTkZTCiAKIHN0YXRpYyBpbmxpbmUgZW51bSBrZXJuZnNfbm9kZV90eXBlIGtlcm5mc190eXBlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7CkBAIC0yMTcsMTMgKzIzNSwyMiBAQAogCXJldHVybiBrbi0+ZmxhZ3MgJiBLRVJORlNfTlM7CiB9CiAKK2ludCBrZXJuZnNfbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOworY2hhciAqIF9fbXVzdF9jaGVjayBrZXJuZnNfcGF0aChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGJ1Zmxlbik7Cit2b2lkIHByX2NvbnRfa2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbik7Cit2b2lkIHByX2NvbnRfa2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbik7CitzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19nZXRfcGFyZW50KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZmluZF9hbmRfZ2V0X25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LAogCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpucyk7CiB2b2lkIGtlcm5mc19nZXQoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiB2b2lkIGtlcm5mc19wdXQoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiAKLXN0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfZGlyX29wcyAqa2RvcHMsCi0JCQkJICAgICAgIHZvaWQgKnByaXYpOworc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfbm9kZV9mcm9tX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworc3RydWN0IGtlcm5mc19yb290ICprZXJuZnNfcm9vdF9mcm9tX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitzdHJ1Y3Qga2VybmZzX3Jvb3QgKmtlcm5mc19jcmVhdGVfcm9vdChzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpwcml2KTsKIHZvaWQga2VybmZzX2Rlc3Ryb3lfcm9vdChzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QpOwogCiBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19jcmVhdGVfZGlyX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LApAQCAtMjM5LDcgKzI2NiwxMSBAQAogc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfY3JlYXRlX2xpbmsoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgICAgIHN0cnVjdCBrZXJuZnNfbm9kZSAqdGFyZ2V0KTsKK3ZvaWQga2VybmZzX2FjdGl2YXRlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwogdm9pZCBrZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwordm9pZCBrZXJuZnNfYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oc3RydWN0IGtlcm5mc19ub2RlICprbik7Cit2b2lkIGtlcm5mc191bmJyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOworYm9vbCBrZXJuZnNfcmVtb3ZlX3NlbGYoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiBpbnQga2VybmZzX3JlbW92ZV9ieV9uYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICBjb25zdCB2b2lkICpucyk7CiBpbnQga2VybmZzX3JlbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQsCkBAIC0yNTUsNyArMjg2LDcgQEAKIAogdm9pZCBrZXJuZnNfaW5pdCh2b2lkKTsKIAotI2Vsc2UJLyogQ09ORklHX1NZU0ZTICovCisjZWxzZQkvKiBDT05GSUdfS0VSTkZTICovCiAKIHN0YXRpYyBpbmxpbmUgZW51bSBrZXJuZnNfbm9kZV90eXBlIGtlcm5mc190eXBlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7IHJldHVybiAwOyB9CS8qIHdoYXRldmVyICovCkBAIC0yNjUsNiArMjk2LDE5IEBACiBzdGF0aWMgaW5saW5lIGJvb2wga2VybmZzX25zX2VuYWJsZWQoc3RydWN0IGtlcm5mc19ub2RlICprbikKIHsgcmV0dXJuIGZhbHNlOyB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGtlcm5mc19uYW1lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sgcmV0dXJuIC1FTk9TWVM7IH0KKworc3RhdGljIGlubGluZSBjaGFyICogX19tdXN0X2NoZWNrIGtlcm5mc19wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1ZiwKKwkJCQkJICAgICAgc2l6ZV90IGJ1ZmxlbikKK3sgcmV0dXJuIE5VTEw7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHByX2NvbnRfa2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcHJfY29udF9rZXJuZnNfcGF0aChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKSB7IH0KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19nZXRfcGFyZW50KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7IHJldHVybiBOVUxMOyB9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGtlcm5mc19ub2RlICoKIGtlcm5mc19maW5kX2FuZF9nZXRfbnMoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgICBjb25zdCB2b2lkICpucykKQEAgLTI3Myw4ICszMTcsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZnNfZ2V0KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGtlcm5mc19wdXQoc3RydWN0IGtlcm5mc19ub2RlICprbikgeyB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfbm9kZV9mcm9tX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7IHJldHVybiBOVUxMOyB9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGtlcm5mc19yb290ICprZXJuZnNfcm9vdF9mcm9tX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7IHJldHVybiBOVUxMOyB9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGtlcm5mc19yb290ICoKLWtlcm5mc19jcmVhdGVfcm9vdChzdHJ1Y3Qga2VybmZzX2Rpcl9vcHMgKmtkb3BzLCB2b2lkICpwcml2KQora2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCSAgIHZvaWQgKnByaXYpCiB7IHJldHVybiBFUlJfUFRSKC1FTk9TWVMpOyB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZnNfZGVzdHJveV9yb290KHN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCkgeyB9CkBAIC0yOTYsOCArMzQ3LDEzIEBACiAJCSAgIHN0cnVjdCBrZXJuZnNfbm9kZSAqdGFyZ2V0KQogeyByZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsgfQogCitzdGF0aWMgaW5saW5lIHZvaWQga2VybmZzX2FjdGl2YXRlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pIHsgfQorCiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmZzX3JlbW92ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKSB7IH0KIAorc3RhdGljIGlubGluZSBib29sIGtlcm5mc19yZW1vdmVfc2VsZihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreyByZXR1cm4gZmFsc2U7IH0KKwogc3RhdGljIGlubGluZSBpbnQga2VybmZzX3JlbW92ZV9ieV9uYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sCiAJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKm5zKQogeyByZXR1cm4gLUVOT1NZUzsgfQpAQCAtMzI1LDcgKzM4MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZnNfaW5pdCh2b2lkKSB7IH0KIAotI2VuZGlmCS8qIENPTkZJR19TWVNGUyAqLworI2VuZGlmCS8qIENPTkZJR19LRVJORlMgKi8KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qga2VybmZzX25vZGUgKgoga2VybmZzX2ZpbmRfYW5kX2dldChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBjb25zdCBjaGFyICpuYW1lKQpAQCAtMzY3LDYgKzQyMywxMyBAQAogCXJldHVybiBrZXJuZnNfcmVtb3ZlX2J5X25hbWVfbnMocGFyZW50LCBuYW1lLCBOVUxMKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQga2VybmZzX3JlbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLAorCQkJCXN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCwKKwkJCQljb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlyZXR1cm4ga2VybmZzX3JlbmFtZV9ucyhrbiwgbmV3X3BhcmVudCwgbmV3X25hbWUsIE5VTEwpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKgoga2VybmZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCiAJICAgICBzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QsIGJvb2wgKm5ld19zYl9jcmVhdGVkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXhlYy5oIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCmluZGV4IDZkNDA2NmMuLmE3NTY0MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKQEAgLTEyNywxMiArMTI3LDYgQEAKIAkJCQkJc3RydWN0IGtleGVjX3NlZ21lbnQgX191c2VyICpzZWdtZW50cywKIAkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiBleHRlcm4gaW50IGtlcm5lbF9rZXhlYyh2b2lkKTsKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1leHRlcm4gYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfa2V4ZWNfbG9hZCh1bnNpZ25lZCBsb25nIGVudHJ5LAotCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VnbWVudHMsCi0JCQkJc3RydWN0IGNvbXBhdF9rZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Ci0jZW5kaWYKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqa2ltYWdlX2FsbG9jX2NvbnRyb2xfcGFnZXMoc3RydWN0IGtpbWFnZSAqaW1hZ2UsCiAJCQkJCQl1bnNpZ25lZCBpbnQgb3JkZXIpOwogZXh0ZXJuIHZvaWQgY3Jhc2hfa2V4ZWMoc3RydWN0IHB0X3JlZ3MgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCBiZWM2ZGJlLi4xZGUzNmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTg0OCw3ICs4NDgsNiBAQAogCXN0cnVjdCBjb21wbGV0aW9uCXBhcmtfcmVxX3BlbmRpbmc7CiAKIAlwbV9tZXNzYWdlX3QJCXBtX21lc2c7Ci0JaW50CQkJKnBtX3Jlc3VsdDsKIAllbnVtIGF0YV9scG1fcG9saWN5CXRhcmdldF9scG1fcG9saWN5OwogCiAJc3RydWN0IHRpbWVyX2xpc3QJZmFzdGRyYWluX3RpbWVyOwpAQCAtMTE0MCwxNiArMTEzOSwxNCBAQAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBhdGFfaG9zdF9zdXNwZW5kKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgcG1fbWVzc2FnZV90IG1lc2cpOwogZXh0ZXJuIHZvaWQgYXRhX2hvc3RfcmVzdW1lKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7Ci1leHRlcm4gaW50IGF0YV9zYXNfcG9ydF9hc3luY19zdXNwZW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCAqYXN5bmMpOwotZXh0ZXJuIGludCBhdGFfc2FzX3BvcnRfYXN5bmNfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCAqYXN5bmMpOworZXh0ZXJuIHZvaWQgYXRhX3Nhc19wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gdm9pZCBhdGFfc2FzX3BvcnRfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGF0YV9zYXNfcG9ydF9hc3luY19zdXNwZW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCAqYXN5bmMpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Nhc19wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IGF0YV9zYXNfcG9ydF9hc3luY19yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfc2FzX3BvcnRfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JcmV0dXJuIDA7CiB9CiAjZW5kaWYKIGV4dGVybiBpbnQgYXRhX3JhdGVsaW1pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlua2FnZS5oIGIvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKaW5kZXggYTZhNDJkZC4uMzRhNTEzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKQEAgLTEyLDkgKzEyLDkgQEAKICNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgQ1BQX0FTTUxJTktBR0UgZXh0ZXJuICJDIgorI2RlZmluZSBDUFBfQVNNTElOS0FHRSBleHRlcm4gIkMiIF9fdmlzaWJsZQogI2Vsc2UKLSNkZWZpbmUgQ1BQX0FTTUxJTktBR0UKKyNkZWZpbmUgQ1BQX0FTTUxJTktBR0UgX192aXNpYmxlCiAjZW5kaWYKIAogI2lmbmRlZiBhc21saW5rYWdlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaCBiL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oCmluZGV4IDkyYjFiZmMuLjAwODM4OGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaApAQCAtMjUyLDkgKzI1Miw5IEBACiAJdW5zaWduZWQgaW50IHRyeWxvY2s6MTsJCQkJCQkvKiAxNiBiaXRzICovCiAKIAl1bnNpZ25lZCBpbnQgcmVhZDoyOyAgICAgICAgLyogc2VlIGxvY2tfYWNxdWlyZSgpIGNvbW1lbnQgKi8KLQl1bnNpZ25lZCBpbnQgY2hlY2s6MjsgICAgICAgLyogc2VlIGxvY2tfYWNxdWlyZSgpIGNvbW1lbnQgKi8KKwl1bnNpZ25lZCBpbnQgY2hlY2s6MTsgICAgICAgLyogc2VlIGxvY2tfYWNxdWlyZSgpIGNvbW1lbnQgKi8KIAl1bnNpZ25lZCBpbnQgaGFyZGlycXNfb2ZmOjE7Ci0JdW5zaWduZWQgaW50IHJlZmVyZW5jZXM6MTE7CQkJCQkvKiAzMiBiaXRzICovCisJdW5zaWduZWQgaW50IHJlZmVyZW5jZXM6MTI7CQkJCQkvKiAzMiBiaXRzICovCiB9OwogCiAvKgpAQCAtMjY1LDcgKzI2NSw3IEBACiBleHRlcm4gdm9pZCBsb2NrZGVwX3Jlc2V0KHZvaWQpOwogZXh0ZXJuIHZvaWQgbG9ja2RlcF9yZXNldF9sb2NrKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jayk7CiBleHRlcm4gdm9pZCBsb2NrZGVwX2ZyZWVfa2V5X3JhbmdlKHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgbG9ja2RlcF9zeXNfZXhpdCh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgbG9ja2RlcF9zeXNfZXhpdCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgbG9ja2RlcF9vZmYodm9pZCk7CiBleHRlcm4gdm9pZCBsb2NrZGVwX29uKHZvaWQpOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJCQkJIChsb2NrKS0+ZGVwX21hcC5rZXksIHN1YikKIAogI2RlZmluZSBsb2NrZGVwX3NldF9ub3ZhbGlkYXRlX2NsYXNzKGxvY2spIFwKLQlsb2NrZGVwX3NldF9jbGFzcyhsb2NrLCAmX19sb2NrZGVwX25vX3ZhbGlkYXRlX18pCisJbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUobG9jaywgJl9fbG9ja2RlcF9ub192YWxpZGF0ZV9fLCAjbG9jaykKIC8qCiAgKiBDb21wYXJlIGxvY2tpbmcgY2xhc3NlcwogICovCkBAIC0zMjYsOSArMzI2LDggQEAKICAqCiAgKiBWYWx1ZXMgZm9yIGNoZWNrOgogICoKLSAqICAgMDogZGlzYWJsZWQKLSAqICAgMTogc2ltcGxlIGNoZWNrcyAoZnJlZWluZywgaGVsZC1hdC1leGl0LXRpbWUsIGV0Yy4pCi0gKiAgIDI6IGZ1bGwgdmFsaWRhdGlvbgorICogICAwOiBzaW1wbGUgY2hlY2tzIChmcmVlaW5nLCBoZWxkLWF0LWV4aXQtdGltZSwgZXRjLikKKyAqICAgMTogZnVsbCB2YWxpZGF0aW9uCiAgKi8KIGV4dGVybiB2b2lkIGxvY2tfYWNxdWlyZShzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGludCBzdWJjbGFzcywKIAkJCSBpbnQgdHJ5bG9jaywgaW50IHJlYWQsIGludCBjaGVjaywKQEAgLTQ3OSwxNSArNDc4LDkgQEAKICAqIG9uIHRoZSBwZXIgbG9jay1jbGFzcyBkZWJ1ZyBtb2RlOgogICovCiAKLSNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORwotICNkZWZpbmUgbG9ja19hY3F1aXJlX2V4Y2x1c2l2ZShsLCBzLCB0LCBuLCBpKQkJbG9ja19hY3F1aXJlKGwsIHMsIHQsIDAsIDIsIG4sIGkpCi0gI2RlZmluZSBsb2NrX2FjcXVpcmVfc2hhcmVkKGwsIHMsIHQsIG4sIGkpCQlsb2NrX2FjcXVpcmUobCwgcywgdCwgMSwgMiwgbiwgaSkKLSAjZGVmaW5lIGxvY2tfYWNxdWlyZV9zaGFyZWRfcmVjdXJzaXZlKGwsIHMsIHQsIG4sIGkpCWxvY2tfYWNxdWlyZShsLCBzLCB0LCAyLCAyLCBuLCBpKQotI2Vsc2UKLSAjZGVmaW5lIGxvY2tfYWNxdWlyZV9leGNsdXNpdmUobCwgcywgdCwgbiwgaSkJCWxvY2tfYWNxdWlyZShsLCBzLCB0LCAwLCAxLCBuLCBpKQotICNkZWZpbmUgbG9ja19hY3F1aXJlX3NoYXJlZChsLCBzLCB0LCBuLCBpKQkJbG9ja19hY3F1aXJlKGwsIHMsIHQsIDEsIDEsIG4sIGkpCi0gI2RlZmluZSBsb2NrX2FjcXVpcmVfc2hhcmVkX3JlY3Vyc2l2ZShsLCBzLCB0LCBuLCBpKQlsb2NrX2FjcXVpcmUobCwgcywgdCwgMiwgMSwgbiwgaSkKLSNlbmRpZgorI2RlZmluZSBsb2NrX2FjcXVpcmVfZXhjbHVzaXZlKGwsIHMsIHQsIG4sIGkpCQlsb2NrX2FjcXVpcmUobCwgcywgdCwgMCwgMSwgbiwgaSkKKyNkZWZpbmUgbG9ja19hY3F1aXJlX3NoYXJlZChsLCBzLCB0LCBuLCBpKQkJbG9ja19hY3F1aXJlKGwsIHMsIHQsIDEsIDEsIG4sIGkpCisjZGVmaW5lIGxvY2tfYWNxdWlyZV9zaGFyZWRfcmVjdXJzaXZlKGwsIHMsIHQsIG4sIGkpCWxvY2tfYWNxdWlyZShsLCBzLCB0LCAyLCAxLCBuLCBpKQogCiAjZGVmaW5lIHNwaW5fYWNxdWlyZShsLCBzLCB0LCBpKQkJbG9ja19hY3F1aXJlX2V4Y2x1c2l2ZShsLCBzLCB0LCBOVUxMLCBpKQogI2RlZmluZSBzcGluX2FjcXVpcmVfbmVzdChsLCBzLCB0LCBuLCBpKQlsb2NrX2FjcXVpcmVfZXhjbHVzaXZlKGwsIHMsIHQsIG4sIGkpCkBAIC01MTgsMTMgKzUxMSwxMyBAQAogIyBkZWZpbmUgbWlnaHRfbG9jayhsb2NrKSAJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCXR5cGVjaGVjayhzdHJ1Y3QgbG9ja2RlcF9tYXAgKiwgJihsb2NrKS0+ZGVwX21hcCk7CQlcCi0JbG9ja19hY3F1aXJlKCYobG9jayktPmRlcF9tYXAsIDAsIDAsIDAsIDIsIE5VTEwsIF9USElTX0lQXyk7CVwKKwlsb2NrX2FjcXVpcmUoJihsb2NrKS0+ZGVwX21hcCwgMCwgMCwgMCwgMSwgTlVMTCwgX1RISVNfSVBfKTsJXAogCWxvY2tfcmVsZWFzZSgmKGxvY2spLT5kZXBfbWFwLCAwLCBfVEhJU19JUF8pOwkJCVwKIH0gd2hpbGUgKDApCiAjIGRlZmluZSBtaWdodF9sb2NrX3JlYWQobG9jaykgCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAl0eXBlY2hlY2soc3RydWN0IGxvY2tkZXBfbWFwICosICYobG9jayktPmRlcF9tYXApOwkJXAotCWxvY2tfYWNxdWlyZSgmKGxvY2spLT5kZXBfbWFwLCAwLCAwLCAxLCAyLCBOVUxMLCBfVEhJU19JUF8pOwlcCisJbG9ja19hY3F1aXJlKCYobG9jayktPmRlcF9tYXAsIDAsIDAsIDEsIDEsIE5VTEwsIF9USElTX0lQXyk7CVwKIAlsb2NrX3JlbGVhc2UoJihsb2NrKS0+ZGVwX21hcCwgMCwgX1RISVNfSVBfKTsJCQlcCiB9IHdoaWxlICgwKQogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWNiLmggYi9pbmNsdWRlL2xpbnV4L21jYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjI4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21jYi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTUVOIENoYW1lbGVvbiBCdXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IE1FTiBNaWtyb2VsZWt0cm9uaWsgR21iSCAod3d3Lm1lbi5kZSkKKyAqIEF1dGhvcjogSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9MSU5VWF9NQ0JfSAorI2RlZmluZSBfTElOVVhfTUNCX0gKKworI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorCitzdHJ1Y3QgbWNiX2RyaXZlcjsKKworLyoqCisgKiBzdHJ1Y3QgbWNiX2J1cyAtIE1FTiBDaGFtZWxlb24gQnVzCisgKgorICogQGRldjogcG9pbnRlciB0byBjYXJyaWVyIGRldmljZQorICogQGNoaWxkcmVuOiB0aGUgY2hpbGQgYnVzc2VzCisgKiBAYnVzX25yOiBtY2IgYnVzIG51bWJlcgorICovCitzdHJ1Y3QgbWNiX2J1cyB7CisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlpbnQgYnVzX25yOworfTsKKyNkZWZpbmUgdG9fbWNiX2J1cyhiKSBjb250YWluZXJfb2YoKGIpLCBzdHJ1Y3QgbWNiX2J1cywgZGV2KQorCisvKioKKyAqIHN0cnVjdCBtY2JfZGV2aWNlIC0gTUVOIENoYW1lbGVvbiBCdXMgZGV2aWNlCisgKgorICogQGJ1c19saXN0OiBpbnRlcm5hbCBsaXN0IGhhbmRsaW5nIGZvciBidXMgY29kZQorICogQGRldjogZGV2aWNlIGluIGtlcm5lbCByZXByZXNlbnRhdGlvbgorICogQGJ1czogbWNiIGJ1cyB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgdG8KKyAqIEBzdWJvcmRpbmF0ZTogc3Vib3JkaW5hdGUgTUNCdXMgaW4gY2FzZSBvZiBicmlkZ2UKKyAqIEBpc19hZGRlZDogZmxhZyB0byBjaGVjayBpZiBkZXZpY2UgaXMgYWRkZWQgdG8gYnVzCisgKiBAZHJpdmVyOiBhc3NvY2lhdGVkIG1jYl9kcml2ZXIKKyAqIEBpZDogbWNiIGRldmljZSBpZAorICogQGluc3Q6IGluc3RhbmNlIGluIENoYW1lbGVvbiB0YWJsZQorICogQGdyb3VwOiBncm91cCBpbiBDaGFtZWxlb24gdGFibGUKKyAqIEB2YXI6IHZhcmlhbnQgaW4gQ2hhbWVsZW9uIHRhYmxlCisgKiBAYmFyOiBCQVIgaW4gQ2hhbWVsZW9uIHRhYmxlCisgKiBAcmV2OiByZXZpc2lvbiBpbiBDaGFtZWxlb24gdGFibGUKKyAqIEBpcnE6IElSUSByZXNvdXJjZQorICogQG1lbW9yeTogbWVtb3J5IHJlc291cmNlCisgKi8KK3N0cnVjdCBtY2JfZGV2aWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c19saXN0OworCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBtY2JfYnVzICpidXM7CisJc3RydWN0IG1jYl9idXMgKnN1Ym9yZGluYXRlOworCWJvb2wgaXNfYWRkZWQ7CisJc3RydWN0IG1jYl9kcml2ZXIgKmRyaXZlcjsKKwl1MTYgaWQ7CisJaW50IGluc3Q7CisJaW50IGdyb3VwOworCWludCB2YXI7CisJaW50IGJhcjsKKwlpbnQgcmV2OworCXN0cnVjdCByZXNvdXJjZSBpcnE7CisJc3RydWN0IHJlc291cmNlIG1lbTsKK307CisjZGVmaW5lIHRvX21jYl9kZXZpY2UoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG1jYl9kZXZpY2UsIGRldikKKworLyoqCisgKiBzdHJ1Y3QgbWNiX2RyaXZlciAtIE1FTiBDaGFtZWxlb24gQnVzIGRldmljZSBkcml2ZXIKKyAqCisgKiBAZHJpdmVyOiBkZXZpY2VfZHJpdmVyCisgKiBAaWRfdGFibGU6IG1jYiBpZCB0YWJsZQorICogQHByb2JlOiBwcm9iZSBjYWxsYmFjaworICogQHJlbW92ZTogcmVtb3ZlIGNhbGxiYWNrCisgKiBAc2h1dGRvd246IHNodXRkb3duIGNhbGxiYWNrCisgKi8KK3N0cnVjdCBtY2JfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkX3RhYmxlOworCWludCAoKnByb2JlKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiwgY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkKTsKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldik7Cit9OworI2RlZmluZSB0b19tY2JfZHJpdmVyKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBtY2JfZHJpdmVyLCBkcml2ZXIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWNiX2dldF9kcnZkYXRhKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNiX3NldF9kcnZkYXRhKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgZGF0YSk7Cit9CisKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIF9fbWNiX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWNiX2RyaXZlciAqZHJ2LAorCQkJCQlzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQkJY29uc3QgY2hhciAqbW9kX25hbWUpOworI2RlZmluZSBtY2JfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcikJCVwKKwlfX21jYl9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyLCBUSElTX01PRFVMRSwgS0JVSUxEX01PRE5BTUUpCitleHRlcm4gdm9pZCBtY2JfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1jYl9kcml2ZXIgKmRyaXZlcik7CisjZGVmaW5lIG1vZHVsZV9tY2JfZHJpdmVyKF9fbWNiX2RyaXZlcikJCVwKKwltb2R1bGVfZHJpdmVyKF9fbWNiX2RyaXZlciwgbWNiX3JlZ2lzdGVyX2RyaXZlciwgbWNiX3VucmVnaXN0ZXJfZHJpdmVyKTsKK2V4dGVybiB2b2lkIG1jYl9idXNfYWRkX2RldmljZXMoY29uc3Qgc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gaW50IG1jYl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG1jYl9idXMgKmJ1cywgc3RydWN0IG1jYl9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG1jYl9idXMgKm1jYl9hbGxvY19idXModm9pZCk7CitleHRlcm4gc3RydWN0IG1jYl9idXMgKm1jYl9idXNfZ2V0KHN0cnVjdCBtY2JfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgbWNiX2J1c19wdXQoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gc3RydWN0IG1jYl9kZXZpY2UgKm1jYl9hbGxvY19kZXYoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gdm9pZCBtY2JfZnJlZV9kZXYoc3RydWN0IG1jYl9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBtY2JfcmVsZWFzZV9idXMoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gc3RydWN0IHJlc291cmNlICptY2JfcmVxdWVzdF9tZW0oc3RydWN0IG1jYl9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBtY2JfcmVsZWFzZV9tZW0oc3RydWN0IHJlc291cmNlICptZW0pOworZXh0ZXJuIGludCBtY2JfZ2V0X2lycShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KTsKKworI2VuZGlmIC8qIF9MSU5VWF9NQ0JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FyaXpvbmEvcmVnaXN0ZXJzLmgKaW5kZXggZmRmM2FhMy4uM2RkYWE2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9yZWdpc3RlcnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL3JlZ2lzdGVycy5oCkBAIC0xNzAyLDkgKzE3MDIsOSBAQAogLyoKICAqIFIzNzMgKDB4MTc1KSAtIEZMTDEgQ29udHJvbCA1CiAgKi8KLSNkZWZpbmUgQVJJWk9OQV9GTEwxX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAweDA3MDAgIC8qIEZMTDFfRlJBVElPIC0gWzEwOjhdICovCi0jZGVmaW5lIEFSSVpPTkFfRkxMMV9GUkFUSU9fU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTEwxX0ZSQVRJTyAtIFsxMDo4XSAqLwotI2RlZmluZSBBUklaT05BX0ZMTDFfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9GUkFUSU8gLSBbMTA6OF0gKi8KKyNkZWZpbmUgQVJJWk9OQV9GTEwxX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIEZMTDFfRlJBVElPIC0gWzExOjhdICovCisjZGVmaW5lIEFSSVpPTkFfRkxMMV9GUkFUSU9fU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTEwxX0ZSQVRJTyAtIFsxMTo4XSAqLworI2RlZmluZSBBUklaT05BX0ZMTDFfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNCAgLyogRkxMMV9GUkFUSU8gLSBbMTE6OF0gKi8KICNkZWZpbmUgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMEUgIC8qIEZMTDFfT1VURElWIC0gWzM6MV0gKi8KICNkZWZpbmUgQVJJWk9OQV9GTEwxX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTDFfT1VURElWIC0gWzM6MV0gKi8KICNkZWZpbmUgQVJJWk9OQV9GTEwxX09VVERJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTDFfT1VURElWIC0gWzM6MV0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9jb3JlLmgKaW5kZXggNDFjOWJkZTQuLjE1N2UzMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oCkBAIC0xOCw3ICsxOCw5IEBACiAJUzVNODc1MVgsCiAJUzVNODc2M1gsCiAJUzVNODc2N1gsCisJUzJNUEEwMSwKIAlTMk1QUzExWCwKKwlTMk1QUzE0WCwKIH07CiAKIC8qKgpAQCAtNTAsNyArNTIsNyBAQAogCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqaXJxX2RhdGE7CiAKIAlpbnQgb25vOwotCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKIAlib29sIHdha2V1cDsKIAlib29sIHd0c3Jfc21wbDsKIH07CkBAIC05Miw3ICs5NCw3IEBACiAJaW50CQkJCWJ1Y2szX2RlZmF1bHRfaWR4OwogCWludAkJCQlidWNrNF9kZWZhdWx0X2lkeDsKIAotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja19yYW1wX2RlbGF5OworCWludAkJCQlidWNrX3JhbXBfZGVsYXk7CiAKIAlpbnQJCQkJYnVjazJfcmFtcF9kZWxheTsKIAlpbnQJCQkJYnVjazM0X3JhbXBfZGVsYXk7CkBAIC0xMDAsMTAgKzEwMiwxNSBAQAogCWludAkJCQlidWNrMTZfcmFtcF9kZWxheTsKIAlpbnQJCQkJYnVjazc4MTBfcmFtcF9kZWxheTsKIAlpbnQJCQkJYnVjazlfcmFtcF9kZWxheTsKKwlpbnQJCQkJYnVjazI0X3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2szX3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2s3X3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2s4OTEwX3JhbXBfZGVsYXk7CiAKLQlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2syX3JhbXBfZW5hYmxlOwotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVjazNfcmFtcF9lbmFibGU7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrNF9yYW1wX2VuYWJsZTsKKwlib29sCQkJCWJ1Y2sxX3JhbXBfZW5hYmxlOworCWJvb2wJCQkJYnVjazJfcmFtcF9lbmFibGU7CisJYm9vbAkJCQlidWNrM19yYW1wX2VuYWJsZTsKKwlib29sCQkJCWJ1Y2s0X3JhbXBfZW5hYmxlOwogCWJvb2wJCQkJYnVjazZfcmFtcF9lbmFibGU7CiAKIAlpbnQJCQkJYnVjazJfaW5pdDsKQEAgLTExOSw3ICsxMjYsOCBAQAogc3RydWN0IHNlY19yZWd1bGF0b3JfZGF0YSB7CiAJaW50CQkJCWlkOwogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCSppbml0ZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ19ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnJlZ19ub2RlOworCWludAkJCQlleHRfY29udHJvbF9ncGlvOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvaXJxLmggYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL2lycS5oCmluZGV4IGQ0M2I0ZjkuLjEyMjRmNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9pcnEuaApAQCAtMTMsNiArMTMsNTYgQEAKICNpZm5kZWYgX19MSU5VWF9NRkRfU0VDX0lSUV9ICiAjZGVmaW5lIF9fTElOVVhfTUZEX1NFQ19JUlFfSAogCitlbnVtIHMybXBhMDFfaXJxIHsKKwlTMk1QQTAxX0lSUV9QV1JPTkYsCisJUzJNUEEwMV9JUlFfUFdST05SLAorCVMyTVBBMDFfSVJRX0pJR09OQkYsCisJUzJNUEEwMV9JUlFfSklHT05CUiwKKwlTMk1QQTAxX0lSUV9BQ09LQkYsCisJUzJNUEEwMV9JUlFfQUNPS0JSLAorCVMyTVBBMDFfSVJRX1BXUk9OMVMsCisJUzJNUEEwMV9JUlFfTVJCLAorCisJUzJNUEEwMV9JUlFfUlRDNjBTLAorCVMyTVBBMDFfSVJRX1JUQ0ExLAorCVMyTVBBMDFfSVJRX1JUQ0EwLAorCVMyTVBBMDFfSVJRX1NNUEwsCisJUzJNUEEwMV9JUlFfUlRDMVMsCisJUzJNUEEwMV9JUlFfV1RTUiwKKworCVMyTVBBMDFfSVJRX0lOVDEyMEMsCisJUzJNUEEwMV9JUlFfSU5UMTQwQywKKwlTMk1QQTAxX0lSUV9MRE8zX1RTRCwKKwlTMk1QQTAxX0lSUV9CMTZfVFNELAorCVMyTVBBMDFfSVJRX0IyNF9UU0QsCisJUzJNUEEwMV9JUlFfQjM1X1RTRCwKKworCVMyTVBBMDFfSVJRX05SLAorfTsKKworI2RlZmluZSBTMk1QQTAxX0lSUV9QV1JPTkZfTUFTSwkJKDEgPDwgMCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUFdST05SX01BU0sJCSgxIDw8IDEpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0pJR09OQkZfTUFTSwkoMSA8PCAyKQorI2RlZmluZSBTMk1QQTAxX0lSUV9KSUdPTkJSX01BU0sJKDEgPDwgMykKKyNkZWZpbmUgUzJNUEEwMV9JUlFfQUNPS0JGX01BU0sJCSgxIDw8IDQpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0FDT0tCUl9NQVNLCQkoMSA8PCA1KQorI2RlZmluZSBTMk1QQTAxX0lSUV9QV1JPTjFTX01BU0sJKDEgPDwgNikKKyNkZWZpbmUgUzJNUEEwMV9JUlFfTVJCX01BU0sJCSgxIDw8IDcpCisKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUlRDNjBTX01BU0sJCSgxIDw8IDApCisjZGVmaW5lIFMyTVBBMDFfSVJRX1JUQ0ExX01BU0sJCSgxIDw8IDEpCisjZGVmaW5lIFMyTVBBMDFfSVJRX1JUQ0EwX01BU0sJCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBBMDFfSVJRX1NNUExfTUFTSwkJKDEgPDwgMykKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUlRDMVNfTUFTSwkJKDEgPDwgNCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfV1RTUl9NQVNLCQkoMSA8PCA1KQorCisjZGVmaW5lIFMyTVBBMDFfSVJRX0lOVDEyMENfTUFTSwkoMSA8PCAwKQorI2RlZmluZSBTMk1QQTAxX0lSUV9JTlQxNDBDX01BU0sJKDEgPDwgMSkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfTERPM19UU0RfTUFTSwkoMSA8PCAyKQorI2RlZmluZSBTMk1QQTAxX0lSUV9CMTZfVFNEX01BU0sJKDEgPDwgMykKKyNkZWZpbmUgUzJNUEEwMV9JUlFfQjI0X1RTRF9NQVNLCSgxIDw8IDQpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0IzNV9UU0RfTUFTSwkoMSA8PCA1KQorCiBlbnVtIHMybXBzMTFfaXJxIHsKIAlTMk1QUzExX0lSUV9QV1JPTkYsCiAJUzJNUFMxMV9JUlFfUFdST05SLApAQCAtMjQsOCArNzQsOCBAQAogCVMyTVBTMTFfSVJRX01SQiwKIAogCVMyTVBTMTFfSVJRX1JUQzYwUywKKwlTMk1QUzExX0lSUV9SVENBMCwKIAlTMk1QUzExX0lSUV9SVENBMSwKLQlTMk1QUzExX0lSUV9SVENBMiwKIAlTMk1QUzExX0lSUV9TTVBMLAogCVMyTVBTMTFfSVJRX1JUQzFTLAogCVMyTVBTMTFfSVJRX1dUU1IsCkBAIC00Nyw3ICs5Nyw3IEBACiAKICNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDNjBTX01BU0sJCSgxIDw8IDApCiAjZGVmaW5lIFMyTVBTMTFfSVJRX1JUQ0ExX01BU0sJCSgxIDw8IDEpCi0jZGVmaW5lIFMyTVBTMTFfSVJRX1JUQ0EyX01BU0sJCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBTMTFfSVJRX1JUQ0EwX01BU0sJCSgxIDw8IDIpCiAjZGVmaW5lIFMyTVBTMTFfSVJRX1NNUExfTUFTSwkJKDEgPDwgMykKICNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDMVNfTUFTSwkJKDEgPDwgNCkKICNkZWZpbmUgUzJNUFMxMV9JUlFfV1RTUl9NQVNLCQkoMSA8PCA1KQpAQCAtNTUsNiArMTA1LDMzIEBACiAjZGVmaW5lIFMyTVBTMTFfSVJRX0lOVDEyMENfTUFTSwkoMSA8PCAwKQogI2RlZmluZSBTMk1QUzExX0lSUV9JTlQxNDBDX01BU0sJKDEgPDwgMSkKIAorZW51bSBzMm1wczE0X2lycSB7CisJUzJNUFMxNF9JUlFfUFdST05GLAorCVMyTVBTMTRfSVJRX1BXUk9OUiwKKwlTMk1QUzE0X0lSUV9KSUdPTkJGLAorCVMyTVBTMTRfSVJRX0pJR09OQlIsCisJUzJNUFMxNF9JUlFfQUNPS0JGLAorCVMyTVBTMTRfSVJRX0FDT0tCUiwKKwlTMk1QUzE0X0lSUV9QV1JPTjFTLAorCVMyTVBTMTRfSVJRX01SQiwKKworCVMyTVBTMTRfSVJRX1JUQzYwUywKKwlTMk1QUzE0X0lSUV9SVENBMSwKKwlTMk1QUzE0X0lSUV9SVENBMCwKKwlTMk1QUzE0X0lSUV9TTVBMLAorCVMyTVBTMTRfSVJRX1JUQzFTLAorCVMyTVBTMTRfSVJRX1dUU1IsCisKKwlTMk1QUzE0X0lSUV9JTlQxMjBDLAorCVMyTVBTMTRfSVJRX0lOVDE0MEMsCisJUzJNUFMxNF9JUlFfVFNELAorCisJUzJNUFMxNF9JUlFfTlIsCit9OworCisvKiBNYXNrcyBmb3IgaW50ZXJydXB0cyBhcmUgdGhlIHNhbWUgYXMgaW4gczJtcHMxMSAqLworI2RlZmluZSBTMk1QUzE0X0lSUV9UU0RfTUFTSwkJKDEgPDwgMikKKwogZW51bSBzNW04NzY3X2lycSB7CiAJUzVNODc2N19JUlFfUFdSUiwKIAlTNU04NzY3X0lSUV9QV1JGLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9ydGMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvcnRjLmgKaW5kZXggOTRiN2NkNi4uM2UwMmI3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9ydGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3J0Yy5oCkBAIC0xLDEyICsxLDE3IEBACi0vKiAgcnRjLmgKKy8qIHJ0Yy5oCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKICAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tCiAgKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICovCiAKQEAgLTQzLDYgKzQ4LDM5IEBACiAJU0VDX1JUQ19TVEFUVVMsCiAJU0VDX1dUU1JfU01QTF9DTlRMLAogCVNFQ19SVENfVURSX0NPTiwKKworCVNFQ19SVENfUkVHX01BWCwKK307CisKK2VudW0gczJtcHNfcnRjX3JlZyB7CisJUzJNUFNfUlRDX0NUUkwsCisJUzJNUFNfV1RTUl9TTVBMX0NOVEwsCisJUzJNUFNfUlRDX1VEUl9DT04sCisJUzJNUFNfUlNWRCwKKwlTMk1QU19SVENfU0VDLAorCVMyTVBTX1JUQ19NSU4sCisJUzJNUFNfUlRDX0hPVVIsCisJUzJNUFNfUlRDX1dFRUtEQVksCisJUzJNUFNfUlRDX0RBVEUsCisJUzJNUFNfUlRDX01PTlRILAorCVMyTVBTX1JUQ19ZRUFSLAorCVMyTVBTX0FMQVJNMF9TRUMsCisJUzJNUFNfQUxBUk0wX01JTiwKKwlTMk1QU19BTEFSTTBfSE9VUiwKKwlTMk1QU19BTEFSTTBfV0VFS0RBWSwKKwlTMk1QU19BTEFSTTBfREFURSwKKwlTMk1QU19BTEFSTTBfTU9OVEgsCisJUzJNUFNfQUxBUk0wX1lFQVIsCisJUzJNUFNfQUxBUk0xX1NFQywKKwlTMk1QU19BTEFSTTFfTUlOLAorCVMyTVBTX0FMQVJNMV9IT1VSLAorCVMyTVBTX0FMQVJNMV9XRUVLREFZLAorCVMyTVBTX0FMQVJNMV9EQVRFLAorCVMyTVBTX0FMQVJNMV9NT05USCwKKwlTMk1QU19BTEFSTTFfWUVBUiwKKwlTMk1QU19PRkZTUkMsCisKKwlTMk1QU19SVENfUkVHX01BWCwKIH07CiAKICNkZWZpbmUgUlRDX0kyQ19BRERSCQkoMHgwQyA+PiAxKQpAQCAtNTQsNiArOTIsOSBAQAogI2RlZmluZSBBTEFSTTFfU1RBVFVTCQkoMSA8PCAyKQogI2RlZmluZSBVUERBVEVfQUQJCSgxIDw8IDApCiAKKyNkZWZpbmUgUzJNUFNfQUxBUk0wX1NUQVRVUwkoMSA8PCAyKQorI2RlZmluZSBTMk1QU19BTEFSTTFfU1RBVFVTCSgxIDw8IDEpCisKIC8qIFJUQyBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIEJDRF9FTl9TSElGVAkJMAogI2RlZmluZSBCQ0RfRU5fTUFTSwkJKDEgPDwgQkNEX0VOX1NISUZUKQpAQCAtNjIsNiArMTAzLDEwIEBACiAvKiBSVEMgVXBkYXRlIFJlZ2lzdGVyMSAqLwogI2RlZmluZSBSVENfVURSX1NISUZUCQkwCiAjZGVmaW5lIFJUQ19VRFJfTUFTSwkJKDEgPDwgUlRDX1VEUl9TSElGVCkKKyNkZWZpbmUgUzJNUFNfUlRDX1dVRFJfU0hJRlQJNAorI2RlZmluZSBTMk1QU19SVENfV1VEUl9NQVNLCSgxIDw8IFMyTVBTX1JUQ19XVURSX1NISUZUKQorI2RlZmluZSBTMk1QU19SVENfUlVEUl9TSElGVAkwCisjZGVmaW5lIFMyTVBTX1JUQ19SVURSX01BU0sJKDEgPDwgUzJNUFNfUlRDX1JVRFJfU0hJRlQpCiAjZGVmaW5lIFJUQ19UQ09OX1NISUZUCQkxCiAjZGVmaW5lIFJUQ19UQ09OX01BU0sJCSgxIDw8IFJUQ19UQ09OX1NISUZUKQogI2RlZmluZSBSVENfVElNRV9FTl9TSElGVAkzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBhMDEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcGEwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzYzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBhMDEuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1MyTVBBMDFfSAorI2RlZmluZSBfX0xJTlVYX01GRF9TMk1QQTAxX0gKKworLyogUzJNUEEwMSByZWdpc3RlcnMgKi8KK2VudW0gczJtcGEwMV9yZWcgeworCVMyTVBBMDFfUkVHX0lELAorCVMyTVBBMDFfUkVHX0lOVDEsCisJUzJNUEEwMV9SRUdfSU5UMiwKKwlTMk1QQTAxX1JFR19JTlQzLAorCVMyTVBBMDFfUkVHX0lOVDFNLAorCVMyTVBBMDFfUkVHX0lOVDJNLAorCVMyTVBBMDFfUkVHX0lOVDNNLAorCVMyTVBBMDFfUkVHX1NUMSwKKwlTMk1QQTAxX1JFR19TVDIsCisJUzJNUEEwMV9SRUdfUFdST05TUkMsCisJUzJNUEEwMV9SRUdfT0ZGU1JDLAorCVMyTVBBMDFfUkVHX1JUQ19CVUYsCisJUzJNUEEwMV9SRUdfQ1RSTDEsCisJUzJNUEEwMV9SRUdfRVRDX1RFU1QsCisJUzJNUEEwMV9SRUdfUlNWRDEsCisJUzJNUEEwMV9SRUdfQlVfQ0hHLAorCVMyTVBBMDFfUkVHX1JBTVAxLAorCVMyTVBBMDFfUkVHX1JBTVAyLAorCVMyTVBBMDFfUkVHX0xET19EU0NIMSwKKwlTMk1QQTAxX1JFR19MRE9fRFNDSDIsCisJUzJNUEEwMV9SRUdfTERPX0RTQ0gzLAorCVMyTVBBMDFfUkVHX0xET19EU0NINCwKKwlTMk1QQTAxX1JFR19PVFBfQURSTCwKKwlTMk1QQTAxX1JFR19PVFBfQURSSCwKKwlTMk1QQTAxX1JFR19PVFBfREFUQSwKKwlTMk1QQTAxX1JFR19NT04xU0VMLAorCVMyTVBBMDFfUkVHX01PTjJTRUwsCisJUzJNUEEwMV9SRUdfTEVFLAorCVMyTVBBMDFfUkVHX1JTVkQyLAorCVMyTVBBMDFfUkVHX1JTVkQzLAorCVMyTVBBMDFfUkVHX1JTVkQ0LAorCVMyTVBBMDFfUkVHX1JTVkQ1LAorCVMyTVBBMDFfUkVHX1JTVkQ2LAorCVMyTVBBMDFfUkVHX1RPUF9SU1ZELAorCVMyTVBBMDFfUkVHX0RWU19TRUwsCisJUzJNUEEwMV9SRUdfRFZTX1BUUiwKKwlTMk1QQTAxX1JFR19EVlNfREFUQSwKKwlTMk1QQTAxX1JFR19SU1ZEX05PLAorCVMyTVBBMDFfUkVHX1VWTE8sCisJUzJNUEEwMV9SRUdfTEVFX05PLAorCVMyTVBBMDFfUkVHX0IxQ1RSTDEsCisJUzJNUEEwMV9SRUdfQjFDVFJMMiwKKwlTMk1QQTAxX1JFR19CMkNUUkwxLAorCVMyTVBBMDFfUkVHX0IyQ1RSTDIsCisJUzJNUEEwMV9SRUdfQjNDVFJMMSwKKwlTMk1QQTAxX1JFR19CM0NUUkwyLAorCVMyTVBBMDFfUkVHX0I0Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjRDVFJMMiwKKwlTMk1QQTAxX1JFR19CNUNUUkwxLAorCVMyTVBBMDFfUkVHX0I1Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjVDVFJMMywKKwlTMk1QQTAxX1JFR19CNUNUUkw0LAorCVMyTVBBMDFfUkVHX0I1Q1RSTDUsCisJUzJNUEEwMV9SRUdfQjVDVFJMNiwKKwlTMk1QQTAxX1JFR19CNkNUUkwxLAorCVMyTVBBMDFfUkVHX0I2Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjdDVFJMMSwKKwlTMk1QQTAxX1JFR19CN0NUUkwyLAorCVMyTVBBMDFfUkVHX0I4Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjhDVFJMMiwKKwlTMk1QQTAxX1JFR19COUNUUkwxLAorCVMyTVBBMDFfUkVHX0I5Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjEwQ1RSTDEsCisJUzJNUEEwMV9SRUdfQjEwQ1RSTDIsCisJUzJNUEEwMV9SRUdfTDFDVFJMLAorCVMyTVBBMDFfUkVHX0wyQ1RSTCwKKwlTMk1QQTAxX1JFR19MM0NUUkwsCisJUzJNUEEwMV9SRUdfTDRDVFJMLAorCVMyTVBBMDFfUkVHX0w1Q1RSTCwKKwlTMk1QQTAxX1JFR19MNkNUUkwsCisJUzJNUEEwMV9SRUdfTDdDVFJMLAorCVMyTVBBMDFfUkVHX0w4Q1RSTCwKKwlTMk1QQTAxX1JFR19MOUNUUkwsCisJUzJNUEEwMV9SRUdfTDEwQ1RSTCwKKwlTMk1QQTAxX1JFR19MMTFDVFJMLAorCVMyTVBBMDFfUkVHX0wxMkNUUkwsCisJUzJNUEEwMV9SRUdfTDEzQ1RSTCwKKwlTMk1QQTAxX1JFR19MMTRDVFJMLAorCVMyTVBBMDFfUkVHX0wxNUNUUkwsCisJUzJNUEEwMV9SRUdfTDE2Q1RSTCwKKwlTMk1QQTAxX1JFR19MMTdDVFJMLAorCVMyTVBBMDFfUkVHX0wxOENUUkwsCisJUzJNUEEwMV9SRUdfTDE5Q1RSTCwKKwlTMk1QQTAxX1JFR19MMjBDVFJMLAorCVMyTVBBMDFfUkVHX0wyMUNUUkwsCisJUzJNUEEwMV9SRUdfTDIyQ1RSTCwKKwlTMk1QQTAxX1JFR19MMjNDVFJMLAorCVMyTVBBMDFfUkVHX0wyNENUUkwsCisJUzJNUEEwMV9SRUdfTDI1Q1RSTCwKKwlTMk1QQTAxX1JFR19MMjZDVFJMLAorCisJUzJNUEEwMV9SRUdfTERPX09WQ0IxLAorCVMyTVBBMDFfUkVHX0xET19PVkNCMiwKKwlTMk1QQTAxX1JFR19MRE9fT1ZDQjMsCisJUzJNUEEwMV9SRUdfTERPX09WQ0I0LAorCit9OworCisvKiBTMk1QQTAxIHJlZ3VsYXRvciBpZHMgKi8KK2VudW0gczJtcGEwMV9yZWd1bGF0b3JzIHsKKwlTMk1QQTAxX0xETzEsCisJUzJNUEEwMV9MRE8yLAorCVMyTVBBMDFfTERPMywKKwlTMk1QQTAxX0xETzQsCisJUzJNUEEwMV9MRE81LAorCVMyTVBBMDFfTERPNiwKKwlTMk1QQTAxX0xETzcsCisJUzJNUEEwMV9MRE84LAorCVMyTVBBMDFfTERPOSwKKwlTMk1QQTAxX0xETzEwLAorCVMyTVBBMDFfTERPMTEsCisJUzJNUEEwMV9MRE8xMiwKKwlTMk1QQTAxX0xETzEzLAorCVMyTVBBMDFfTERPMTQsCisJUzJNUEEwMV9MRE8xNSwKKwlTMk1QQTAxX0xETzE2LAorCVMyTVBBMDFfTERPMTcsCisJUzJNUEEwMV9MRE8xOCwKKwlTMk1QQTAxX0xETzE5LAorCVMyTVBBMDFfTERPMjAsCisJUzJNUEEwMV9MRE8yMSwKKwlTMk1QQTAxX0xETzIyLAorCVMyTVBBMDFfTERPMjMsCisJUzJNUEEwMV9MRE8yNCwKKwlTMk1QQTAxX0xETzI1LAorCVMyTVBBMDFfTERPMjYsCisKKwlTMk1QQTAxX0JVQ0sxLAorCVMyTVBBMDFfQlVDSzIsCisJUzJNUEEwMV9CVUNLMywKKwlTMk1QQTAxX0JVQ0s0LAorCVMyTVBBMDFfQlVDSzUsCisJUzJNUEEwMV9CVUNLNiwKKwlTMk1QQTAxX0JVQ0s3LAorCVMyTVBBMDFfQlVDSzgsCisJUzJNUEEwMV9CVUNLOSwKKwlTMk1QQTAxX0JVQ0sxMCwKKworCVMyTVBBMDFfUkVHVUxBVE9SX01BWCwKK307CisKKyNkZWZpbmUgUzJNUEEwMV9CVUNLX01JTjEJNjAwMDAwCisjZGVmaW5lIFMyTVBBMDFfQlVDS19NSU4yCTgwMDAwMAorI2RlZmluZSBTMk1QQTAxX0JVQ0tfTUlOMwkxMDAwMDAwCisjZGVmaW5lIFMyTVBBMDFfQlVDS19NSU40CTE1MDAwMDAKKyNkZWZpbmUgUzJNUEEwMV9MRE9fTUlOCQk4MDAwMDAKKworI2RlZmluZSBTMk1QQTAxX0JVQ0tfU1RFUDEJNjI1MAorI2RlZmluZSBTMk1QQTAxX0JVQ0tfU1RFUDIJMTI1MDAKKworI2RlZmluZSBTMk1QQTAxX0xET19TVEVQMQk1MDAwMAorI2RlZmluZSBTMk1QQTAxX0xET19TVEVQMgkyNTAwMAorCisjZGVmaW5lIFMyTVBBMDFfTERPX1ZTRUxfTUFTSwkweDNGCisjZGVmaW5lIFMyTVBBMDFfQlVDS19WU0VMX01BU0sJMHhGRgorI2RlZmluZSBTMk1QQTAxX0VOQUJMRV9NQVNLCSgweDAzIDw8IFMyTVBBMDFfRU5BQkxFX1NISUZUKQorI2RlZmluZSBTMk1QQTAxX0VOQUJMRV9TSElGVAkweDA2CisjZGVmaW5lIFMyTVBBMDFfTERPX05fVk9MVEFHRVMJKFMyTVBBMDFfTERPX1ZTRUxfTUFTSyArIDEpCisjZGVmaW5lIFMyTVBBMDFfQlVDS19OX1ZPTFRBR0VTIChTMk1QQTAxX0JVQ0tfVlNFTF9NQVNLICsgMSkKKworI2RlZmluZSBTMk1QQTAxX1JBTVBfREVMQVkJMTI1MDAJLyogdVYvdXMgKi8KKworI2RlZmluZSBTMk1QQTAxX0JVQ0sxNl9SQU1QX1NISUZUCTQKKyNkZWZpbmUgUzJNUEEwMV9CVUNLMjRfUkFNUF9TSElGVAk2CisjZGVmaW5lIFMyTVBBMDFfQlVDSzNfUkFNUF9TSElGVAk0CisjZGVmaW5lIFMyTVBBMDFfQlVDSzVfUkFNUF9TSElGVAk2CisjZGVmaW5lIFMyTVBBMDFfQlVDSzdfUkFNUF9TSElGVAkyCisjZGVmaW5lIFMyTVBBMDFfQlVDSzg5MTBfUkFNUF9TSElGVAkwCisKKyNkZWZpbmUgUzJNUEEwMV9CVUNLMV9SQU1QX0VOX1NISUZUCTMKKyNkZWZpbmUgUzJNUEEwMV9CVUNLMl9SQU1QX0VOX1NISUZUCTIKKyNkZWZpbmUgUzJNUEEwMV9CVUNLM19SQU1QX0VOX1NISUZUCTEKKyNkZWZpbmUgUzJNUEEwMV9CVUNLNF9SQU1QX0VOX1NISUZUCTAKKyNkZWZpbmUgUzJNUEEwMV9QTUlDX0VOX1NISUZUCTYKKworI2VuZGlmIC8qX19MSU5VWF9NRkRfUzJNUEEwMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcHMxNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDQ5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIHMybXBzMTQuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9TMk1QUzE0X0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfUzJNUFMxNF9ICisKKy8qIFMyTVBTMTQgcmVnaXN0ZXJzICovCitlbnVtIHMybXBzMTRfcmVnIHsKKwlTMk1QUzE0X1JFR19JRCwKKwlTMk1QUzE0X1JFR19JTlQxLAorCVMyTVBTMTRfUkVHX0lOVDIsCisJUzJNUFMxNF9SRUdfSU5UMywKKwlTMk1QUzE0X1JFR19JTlQxTSwKKwlTMk1QUzE0X1JFR19JTlQyTSwKKwlTMk1QUzE0X1JFR19JTlQzTSwKKwlTMk1QUzE0X1JFR19TVDEsCisJUzJNUFMxNF9SRUdfU1QyLAorCVMyTVBTMTRfUkVHX1BXUk9OU1JDLAorCVMyTVBTMTRfUkVHX09GRlNSQywKKwlTMk1QUzE0X1JFR19CVV9DSEcsCisJUzJNUFMxNF9SRUdfUlRDQ1RSTCwKKwlTMk1QUzE0X1JFR19DVFJMMSwKKwlTMk1QUzE0X1JFR19DVFJMMiwKKwlTMk1QUzE0X1JFR19SU1ZEMSwKKwlTMk1QUzE0X1JFR19SU1ZEMiwKKwlTMk1QUzE0X1JFR19SU1ZEMywKKwlTMk1QUzE0X1JFR19SU1ZENCwKKwlTMk1QUzE0X1JFR19SU1ZENSwKKwlTMk1QUzE0X1JFR19SU1ZENiwKKwlTMk1QUzE0X1JFR19DVFJMMywKKwlTMk1QUzE0X1JFR19SU1ZENywKKwlTMk1QUzE0X1JFR19SU1ZEOCwKKwlTMk1QUzE0X1JFR19XUlNUQkksCisJUzJNUFMxNF9SRUdfQjFDVFJMMSwKKwlTMk1QUzE0X1JFR19CMUNUUkwyLAorCVMyTVBTMTRfUkVHX0IyQ1RSTDEsCisJUzJNUFMxNF9SRUdfQjJDVFJMMiwKKwlTMk1QUzE0X1JFR19CM0NUUkwxLAorCVMyTVBTMTRfUkVHX0IzQ1RSTDIsCisJUzJNUFMxNF9SRUdfQjRDVFJMMSwKKwlTMk1QUzE0X1JFR19CNENUUkwyLAorCVMyTVBTMTRfUkVHX0I1Q1RSTDEsCisJUzJNUFMxNF9SRUdfQjVDVFJMMiwKKwlTMk1QUzE0X1JFR19MMUNUUkwsCisJUzJNUFMxNF9SRUdfTDJDVFJMLAorCVMyTVBTMTRfUkVHX0wzQ1RSTCwKKwlTMk1QUzE0X1JFR19MNENUUkwsCisJUzJNUFMxNF9SRUdfTDVDVFJMLAorCVMyTVBTMTRfUkVHX0w2Q1RSTCwKKwlTMk1QUzE0X1JFR19MN0NUUkwsCisJUzJNUFMxNF9SRUdfTDhDVFJMLAorCVMyTVBTMTRfUkVHX0w5Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTBDVFJMLAorCVMyTVBTMTRfUkVHX0wxMUNUUkwsCisJUzJNUFMxNF9SRUdfTDEyQ1RSTCwKKwlTMk1QUzE0X1JFR19MMTNDVFJMLAorCVMyTVBTMTRfUkVHX0wxNENUUkwsCisJUzJNUFMxNF9SRUdfTDE1Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTZDVFJMLAorCVMyTVBTMTRfUkVHX0wxN0NUUkwsCisJUzJNUFMxNF9SRUdfTDE4Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTlDVFJMLAorCVMyTVBTMTRfUkVHX0wyMENUUkwsCisJUzJNUFMxNF9SRUdfTDIxQ1RSTCwKKwlTMk1QUzE0X1JFR19MMjJDVFJMLAorCVMyTVBTMTRfUkVHX0wyM0NUUkwsCisJUzJNUFMxNF9SRUdfTDI0Q1RSTCwKKwlTMk1QUzE0X1JFR19MMjVDVFJMLAorCVMyTVBTMTRfUkVHX0xET0RTQ0gxLAorCVMyTVBTMTRfUkVHX0xET0RTQ0gyLAorCVMyTVBTMTRfUkVHX0xET0RTQ0gzLAorfTsKKworLyogUzJNUFMxNCByZWd1bGF0b3IgaWRzICovCitlbnVtIHMybXBzMTRfcmVndWxhdG9ycyB7CisJUzJNUFMxNF9MRE8xLAorCVMyTVBTMTRfTERPMiwKKwlTMk1QUzE0X0xETzMsCisJUzJNUFMxNF9MRE80LAorCVMyTVBTMTRfTERPNSwKKwlTMk1QUzE0X0xETzYsCisJUzJNUFMxNF9MRE83LAorCVMyTVBTMTRfTERPOCwKKwlTMk1QUzE0X0xETzksCisJUzJNUFMxNF9MRE8xMCwKKwlTMk1QUzE0X0xETzExLAorCVMyTVBTMTRfTERPMTIsCisJUzJNUFMxNF9MRE8xMywKKwlTMk1QUzE0X0xETzE0LAorCVMyTVBTMTRfTERPMTUsCisJUzJNUFMxNF9MRE8xNiwKKwlTMk1QUzE0X0xETzE3LAorCVMyTVBTMTRfTERPMTgsCisJUzJNUFMxNF9MRE8xOSwKKwlTMk1QUzE0X0xETzIwLAorCVMyTVBTMTRfTERPMjEsCisJUzJNUFMxNF9MRE8yMiwKKwlTMk1QUzE0X0xETzIzLAorCVMyTVBTMTRfTERPMjQsCisJUzJNUFMxNF9MRE8yNSwKKwlTMk1QUzE0X0JVQ0sxLAorCVMyTVBTMTRfQlVDSzIsCisJUzJNUFMxNF9CVUNLMywKKwlTMk1QUzE0X0JVQ0s0LAorCVMyTVBTMTRfQlVDSzUsCisKKwlTMk1QUzE0X1JFR1VMQVRPUl9NQVgsCit9OworCisvKiBSZWd1bGF0b3IgY29uc3RyYWludHMgZm9yIEJVQ0t4ICovCisjZGVmaW5lIFMyTVBTMTRfQlVDSzEyMzVfTUlOXzYwME1WCTYwMDAwMAorI2RlZmluZSBTMk1QUzE0X0JVQ0s0X01JTl8xNDAwTVYJMTQwMDAwMAorI2RlZmluZSBTMk1QUzE0X0JVQ0sxMjM1X1NURVBfNl8yNU1WCTYyNTAKKyNkZWZpbmUgUzJNUFMxNF9CVUNLNF9TVEVQXzEyXzVNVgkxMjUwMAorI2RlZmluZSBTMk1QUzE0X0JVQ0sxMjM1X1NUQVJUX1NFTAkweDIwCisjZGVmaW5lIFMyTVBTMTRfQlVDSzRfU1RBUlRfU0VMCQkweDQwCisvKgorICogRGVmYXVsdCByYW1wIGRlbGF5IGluIHV2L3VzLiBEYXRhc2hlZXQgc2F5cyB0aGF0IHJhbXAgZGVsYXkgY2FuIGJlCisgKiBjb250cm9sbGVkIGhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB3aGljaCByZWdpc3RlciBpcyB1c2VkIGZvciB0aGF0LgorICogTGV0J3MgYXNzdW1lIHRoYXQgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNldC4KKyAqLworI2RlZmluZSBTMk1QUzE0X0JVQ0tfUkFNUF9ERUxBWQkJMTI1MDAKKworLyogUmVndWxhdG9yIGNvbnN0cmFpbnRzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgTERPeCAqLworI2RlZmluZSBTMk1QUzE0X0xET19NSU5fODAwTVYJCTgwMDAwMAorI2RlZmluZSBTMk1QUzE0X0xET19NSU5fMTgwME1WCQkxODAwMDAwCisjZGVmaW5lIFMyTVBTMTRfTERPX1NURVBfMTJfNU1WCQkxMjUwMAorI2RlZmluZSBTMk1QUzE0X0xET19TVEVQXzI1TVYJCTI1MDAwCisKKyNkZWZpbmUgUzJNUFMxNF9MRE9fVlNFTF9NQVNLCQkweDNGCisjZGVmaW5lIFMyTVBTMTRfQlVDS19WU0VMX01BU0sJCTB4RkYKKyNkZWZpbmUgUzJNUFMxNF9FTkFCTEVfTUFTSwkJKDB4MDMgPDwgUzJNUFMxNF9FTkFCTEVfU0hJRlQpCisjZGVmaW5lIFMyTVBTMTRfRU5BQkxFX1NISUZUCQk2CisvKiBPbi9PZmYgY29udHJvbGxlZCBieSBQV1JFTiAqLworI2RlZmluZSBTMk1QUzE0X0VOQUJMRV9TVVNQRU5ECQkoMHgwMSA8PCBTMk1QUzE0X0VOQUJMRV9TSElGVCkKKyNkZWZpbmUgUzJNUFMxNF9MRE9fTl9WT0xUQUdFUwkJKFMyTVBTMTRfTERPX1ZTRUxfTUFTSyArIDEpCisjZGVmaW5lIFMyTVBTMTRfQlVDS19OX1ZPTFRBR0VTCQkoUzJNUFMxNF9CVUNLX1ZTRUxfTUFTSyArIDEpCisKKyNlbmRpZiAvKiAgX19MSU5VWF9NRkRfUzJNUFMxNF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3M1bTg3NjcuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oCmluZGV4IDJhYjBiMGYuLjI0M2I1OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oCkBAIC0xODMsMTAgKzE4MywxNyBAQAogCVM1TTg3NjdfUkVHX01BWCwKIH07CiAKKy8qIExET19FTi9CVUNLX0VOIGZpZWxkIGluIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTNU04NzY3X0VOQ1RSTF9TSElGVAkJNgogI2RlZmluZSBTNU04NzY3X0VOQ1RSTF9NQVNLCQkoMHgzIDw8IFM1TTg3NjdfRU5DVFJMX1NISUZUKQogCiAvKgorICogTERPX0VOL0JVQ0tfRU4gcmVnaXN0ZXIgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoaXMgQnVjayBvciBMRE8KKyAqIGJ5IEdQSU8gKFBXUkVOLCBCVUNLRU4pLgorICovCisjZGVmaW5lIFM1TTg3NjdfRU5DVFJMX1VTRV9HUElPCQkweDEKKworLyoKICAqIFZhbHVlcyBmb3IgQlVDS19SQU1QIGZpZWxkIGluIERWU19SQU1QIHJlZ2lzdGVyLCBtYXRjaGluZyByYXcgdmFsdWVzCiAgKiBpbiBtVi91cy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAppbmRleCAzNzM3ZjcyLi4yY2YxNTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaApAQCAtMTEsMjMgKzExLDIzIEBACiAgKi8KIAogI2RlZmluZSBQU01PVVNFX01JTk9SCQkxCi0jZGVmaW5lIE1TX0JVU01PVVNFX01JTk9SCTIKLSNkZWZpbmUgQVRJWExfQlVTTU9VU0VfTUlOT1IJMworI2RlZmluZSBNU19CVVNNT1VTRV9NSU5PUgkyCS8qIHVudXNlZCAqLworI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUgkzCS8qIHVudXNlZCAqLwogLyojZGVmaW5lIEFNSUdBTU9VU0VfTUlOT1IJNAlGSVhNRSBPQlNPTEVURSAqLwotI2RlZmluZSBBVEFSSU1PVVNFX01JTk9SCTUKLSNkZWZpbmUgU1VOX01PVVNFX01JTk9SCQk2Ci0jZGVmaW5lIEFQT0xMT19NT1VTRV9NSU5PUgk3Ci0jZGVmaW5lIFBDMTEwUEFEX01JTk9SCQk5CisjZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IJNQkvKiB1bnVzZWQgKi8KKyNkZWZpbmUgU1VOX01PVVNFX01JTk9SCQk2CS8qIHVudXNlZCAqLworI2RlZmluZSBBUE9MTE9fTU9VU0VfTUlOT1IJNwkvKiB1bnVzZWQgKi8KKyNkZWZpbmUgUEMxMTBQQURfTUlOT1IJCTkJLyogdW51c2VkICovCiAvKiNkZWZpbmUgQURCX01PVVNFX01JTk9SCTEwCUZJWE1FIE9CU09MRVRFICovCiAjZGVmaW5lIFdBVENIRE9HX01JTk9SCQkxMzAJLyogV2F0Y2hkb2cgdGltZXIgICAgICovCiAjZGVmaW5lIFRFTVBfTUlOT1IJCTEzMQkvKiBUZW1wZXJhdHVyZSBTZW5zb3IgKi8KICNkZWZpbmUgUlRDX01JTk9SCQkxMzUKICNkZWZpbmUgRUZJX1JUQ19NSU5PUgkJMTM2CS8qIEVGSSBUaW1lIHNlcnZpY2VzICovCiAjZGVmaW5lIFNVTl9PUEVOUFJPTV9NSU5PUgkxMzkKLSNkZWZpbmUgRE1BUElfTUlOT1IJCTE0MAkvKiBETUFQSSAqLworI2RlZmluZSBETUFQSV9NSU5PUgkJMTQwCS8qIHVudXNlZCAqLwogI2RlZmluZSBOVlJBTV9NSU5PUgkJMTQ0CiAjZGVmaW5lIFNHSV9NTVRJTUVSCQkxNTMKLSNkZWZpbmUgU1RPUkVfUVVFVUVfTUlOT1IJMTU1CisjZGVmaW5lIFNUT1JFX1FVRVVFX01JTk9SCTE1NQkvKiB1bnVzZWQgKi8KICNkZWZpbmUgSTJPX01JTk9SCQkxNjYKICNkZWZpbmUgTUlDUk9DT0RFX01JTk9SCQkxODQKICNkZWZpbmUgVkZJT19NSU5PUgkJMTk2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYzFiNzQxNC4uMmVlYzYxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTQ4Nyw5ICsxNDg3LDE1IEBACiAKICNpZiBVU0VfU1BMSVRfUE1EX1BUTE9DS1MKIAorc3RhdGljIHN0cnVjdCBwYWdlICpwbWRfdG9fcGFnZShwbWRfdCAqcG1kKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IH4oUFRSU19QRVJfUE1EICogc2l6ZW9mKHBtZF90KSAtIDEpOworCXJldHVybiB2aXJ0X3RvX3BhZ2UoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpIHBtZCAmIG1hc2spKTsKK30KKwogc3RhdGljIGlubGluZSBzcGlubG9ja190ICpwbWRfbG9ja3B0cihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCkKIHsKLQlyZXR1cm4gcHRsb2NrX3B0cih2aXJ0X3RvX3BhZ2UocG1kKSk7CisJcmV0dXJuIHB0bG9ja19wdHIocG1kX3RvX3BhZ2UocG1kKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBwZ3RhYmxlX3BtZF9wYWdlX2N0b3Ioc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0xNTA4LDcgKzE1MTQsNyBAQAogCXB0bG9ja19mcmVlKHBhZ2UpOwogfQogCi0jZGVmaW5lIHBtZF9odWdlX3B0ZShtbSwgcG1kKSAodmlydF90b19wYWdlKHBtZCktPnBtZF9odWdlX3B0ZSkKKyNkZWZpbmUgcG1kX2h1Z2VfcHRlKG1tLCBwbWQpIChwbWRfdG9fcGFnZShwbWQpLT5wbWRfaHVnZV9wdGUpCiAKICNlbHNlCiAKQEAgLTE3NTAsNiArMTc1Niw5IEBACiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAKIGV4dGVybiBpbnQgbWF5X2V4cGFuZF92bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBucGFnZXMpOworZXh0ZXJuIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX2luc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcyk7CiBleHRlcm4gaW50IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAppbmRleCA0NWU5MjE0Li45YTE2NWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKQEAgLTQzMiw2ICs0MzIsMTQgQEAKIAlrZXJuZWxfdWxvbmdfdCBkcml2ZXJfZGF0YTsJLyogRGF0YSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgKi8KIH07CiAKKyNkZWZpbmUgU1BNSV9OQU1FX1NJWkUJMzIKKyNkZWZpbmUgU1BNSV9NT0RVTEVfUFJFRklYICJzcG1pOiIKKworc3RydWN0IHNwbWlfZGV2aWNlX2lkIHsKKwljaGFyIG5hbWVbU1BNSV9OQU1FX1NJWkVdOworCWtlcm5lbF91bG9uZ190IGRyaXZlcl9kYXRhOwkvKiBEYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlciAqLworfTsKKwogLyogZG1pICovCiBlbnVtIGRtaV9maWVsZCB7CiAJRE1JX05PTkUsCkBAIC01NjQsNiArNTcyLDE1IEBACiAjZGVmaW5lIFg4Nl9NT0RFTF9BTlkgIDAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfQU5ZIDAJLyogU2FtZSBhcyBGUFUsIHlvdSBjYW4ndCB0ZXN0IGZvciB0aGF0ICovCiAKKy8qCisgKiBHZW5lcmljIHRhYmxlIHR5cGUgZm9yIG1hdGNoaW5nIENQVSBmZWF0dXJlcy4KKyAqIEBmZWF0dXJlOgl0aGUgYml0IG51bWJlciBvZiB0aGUgZmVhdHVyZSAoMCAtIDY1NTM1KQorICovCisKK3N0cnVjdCBjcHVfZmVhdHVyZSB7CisJX191MTYJZmVhdHVyZTsKK307CisKICNkZWZpbmUgSVBBQ0tfQU5ZX0ZPUk1BVCAweGZmCiAjZGVmaW5lIElQQUNLX0FOWV9JRCAofjApCiBzdHJ1Y3QgaXBhY2tfZGV2aWNlX2lkIHsKQEAgLTU5OSw0ICs2MTYsOSBAQAogCV9fdTE2IGFzbV9kaWQsIGFzbV92aWQ7CiB9OwogCitzdHJ1Y3QgbWNiX2RldmljZV9pZCB7CisJX191MTYgZGV2aWNlOworCWtlcm5lbF91bG9uZ190IGRyaXZlcl9kYXRhOworfTsKKwogI2VuZGlmIC8qIExJTlVYX01PRF9ERVZJQ0VUQUJMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L211dGV4LmggYi9pbmNsdWRlL2xpbnV4L211dGV4LmgKaW5kZXggZDMxODE5My4uMTE2OTJkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdXRleC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXV0ZXguaApAQCAtNDYsNiArNDYsNyBAQAogICogLSBkZXRlY3RzIG11bHRpLXRhc2sgY2lyY3VsYXIgZGVhZGxvY2tzIGFuZCBwcmludHMgb3V0IGFsbCBhZmZlY3RlZAogICogICBsb2NrcyBhbmQgdGFza3MgKGFuZCBvbmx5IHRob3NlIHRhc2tzKQogICovCitzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlOwogc3RydWN0IG11dGV4IHsKIAkvKiAxOiB1bmxvY2tlZCwgMDogbG9ja2VkLCBuZWdhdGl2ZTogbG9ja2VkLCBwb3NzaWJsZSB3YWl0ZXJzICovCiAJYXRvbWljX3QJCWNvdW50OwpAQCAtNTUsNyArNTYsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdAkqb3duZXI7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTVVURVhfU1BJTl9PTl9PV05FUgotCXZvaWQJCQkqc3Bpbl9tbG9jazsJLyogU3Bpbm5lciBNQ1MgbG9jayAqLworCXN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUJKm9zcTsJLyogU3Bpbm5lciBNQ1MgbG9jayAqLwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKIAljb25zdCBjaGFyIAkJKm5hbWU7CkBAIC0xNzksNCArMTgwLDQgQEAKICMgZGVmaW5lIGFyY2hfbXV0ZXhfY3B1X3JlbGF4KCkgY3B1X3JlbGF4KCkKICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX0xJTlVYX01VVEVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2X2ZlYXR1cmVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldl9mZWF0dXJlcy5oCmluZGV4IDEwMDVlYmYuLjVhMDlhNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2X2ZlYXR1cmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZfZmVhdHVyZXMuaApAQCAtMTYzLDQgKzE2MywxMSBAQAogLyogY2hhbmdlYWJsZSBmZWF0dXJlcyB3aXRoIG5vIHNwZWNpYWwgaGFyZHdhcmUgcmVxdWlyZW1lbnRzICovCiAjZGVmaW5lIE5FVElGX0ZfU09GVF9GRUFUVVJFUwkoTkVUSUZfRl9HU08gfCBORVRJRl9GX0dSTykKIAorI2RlZmluZSBORVRJRl9GX1ZMQU5fRkVBVFVSRVMJKE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUiB8IFwKKwkJCQkgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfCBcCisJCQkJIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgXAorCQkJCSBORVRJRl9GX0hXX1ZMQU5fU1RBR19GSUxURVIgfCBcCisJCQkJIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1JYIHwgXAorCQkJCSBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCkKKwogI2VuZGlmCS8qIF9MSU5VWF9ORVRERVZfRkVBVFVSRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggZThlZWViZC4uZGFhZmQ5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0zMDE0LDcgKzMwMTQsNyBAQAogewogCXJldHVybiBfX3NrYl9nc29fc2VnbWVudChza2IsIGZlYXR1cmVzLCB0cnVlKTsKIH0KLV9fYmUxNiBza2JfbmV0d29ya19wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK19fYmUxNiBza2JfbmV0d29ya19wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKmRlcHRoKTsKIAogc3RhdGljIGlubGluZSBib29sIGNhbl9jaGVja3N1bV9wcm90b2NvbChuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcywKIAkJCQkJIF9fYmUxNiBwcm90b2NvbCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnZtZS5oIGIvaW5jbHVkZS9saW51eC9udm1lLmgKaW5kZXggNjlhZTAzZi4uNmI5YWFmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9udm1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9udm1lLmgKQEAgLTg3LDYgKzg3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWVzcGFjZXM7CiAJc3RydWN0IGtyZWYga3JlZjsKIAlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2OworCXdvcmtfZnVuY190IHJlc2V0X3dvcmtmbjsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKIAljaGFyIG5hbWVbMTJdOwogCWNoYXIgc2VyaWFsWzIwXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2YuaCBiL2luY2x1ZGUvbGludXgvb2YuaAppbmRleCA0MzVjYjk5Li44M2QxYWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZi5oCkBAIC0xOTgsNiArMTk4LDggQEAKIGV4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSBpbnQgKmxlbnApOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBlbGVtX3NpemUpOwogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICAgICAgdTMyIGluZGV4LCB1MzIgKm91dF92YWx1ZSk7CkBAIC0zOTAsNiArMzkyLDEyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCBpbnQgZWxlbV9zaXplKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUzMiBpbmRleCwgdTMyICpvdXRfdmFsdWUpCiB7CkBAIC01MzYsNiArNTQ0LDc0IEBACiB9CiAKIC8qKgorICogb2ZfcHJvcGVydHlfY291bnRfdThfZWxlbXMgLSBDb3VudCB0aGUgbnVtYmVyIG9mIHU4IGVsZW1lbnRzIGluIGEgcHJvcGVydHkKKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1OCBlbGVtZW50cworICogaW4gaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHN1Y2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcworICogbm90IGV4aXN0IG9yIGl0cyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYSBtdWx0aXBsZSBvZiB1OCBhbmQgLUVOT0RBVEEgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X3U4X2VsZW1zKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJcmV0dXJuIG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUobnAsIHByb3BuYW1lLCBzaXplb2YodTgpKTsKK30KKworLyoqCisgKiBvZl9wcm9wZXJ0eV9jb3VudF91MTZfZWxlbXMgLSBDb3VudCB0aGUgbnVtYmVyIG9mIHUxNiBlbGVtZW50cyBpbiBhIHByb3BlcnR5CisgKgorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgdTE2IGVsZW1lbnRzCisgKiBpbiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgb24gc3VjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzCisgKiBub3QgZXhpc3Qgb3IgaXRzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBhIG11bHRpcGxlIG9mIHUxNiBhbmQgLUVOT0RBVEEgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X3UxNl9lbGVtcyhjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lKQoreworCXJldHVybiBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKG5wLCBwcm9wbmFtZSwgc2l6ZW9mKHUxNikpOworfQorCisvKioKKyAqIG9mX3Byb3BlcnR5X2NvdW50X3UzMl9lbGVtcyAtIENvdW50IHRoZSBudW1iZXIgb2YgdTMyIGVsZW1lbnRzIGluIGEgcHJvcGVydHkKKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1MzIgZWxlbWVudHMKKyAqIGluIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBvbiBzdWNlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMKKyAqIG5vdCBleGlzdCBvciBpdHMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGEgbXVsdGlwbGUgb2YgdTMyIGFuZCAtRU5PREFUQSBpZiB0aGUKKyAqIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJcmV0dXJuIG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUobnAsIHByb3BuYW1lLCBzaXplb2YodTMyKSk7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfY291bnRfdTY0X2VsZW1zIC0gQ291bnQgdGhlIG51bWJlciBvZiB1NjQgZWxlbWVudHMgaW4gYSBwcm9wZXJ0eQorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHU2NCBlbGVtZW50cworICogaW4gaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHN1Y2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcworICogbm90IGV4aXN0IG9yIGl0cyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYSBtdWx0aXBsZSBvZiB1NjQgYW5kIC1FTk9EQVRBIGlmIHRoZQorICogcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9jb3VudF91NjRfZWxlbXMoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlyZXR1cm4gb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZShucCwgcHJvcG5hbWUsIHNpemVvZih1NjQpKTsKK30KKworLyoqCiAgKiBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wgLSBGaW5kZnJvbSBhIHByb3BlcnR5CiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfZ3JhcGguaCBiL2luY2x1ZGUvbGludXgvb2ZfZ3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZlZjQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vZl9ncmFwaC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBPRiBncmFwaCBiaW5kaW5nIHBhcnNpbmcgaGVscGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZW5lc2FzIEVsZWN0cm9uaWNzIENvcnAuCisgKiBBdXRob3I6IEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19MSU5VWF9PRl9HUkFQSF9ICisjZGVmaW5lIF9fTElOVVhfT0ZfR1JBUEhfSAorCisvKioKKyAqIHN0cnVjdCBvZl9lbmRwb2ludCAtIHRoZSBPRiBncmFwaCBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQorICogQHBvcnQ6IGlkZW50aWZpZXIgKHZhbHVlIG9mIHJlZyBwcm9wZXJ0eSkgb2YgYSBwb3J0IHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0bworICogQGlkOiBpZGVudGlmaWVyICh2YWx1ZSBvZiByZWcgcHJvcGVydHkpIG9mIHRoaXMgZW5kcG9pbnQKKyAqIEBsb2NhbF9ub2RlOiBwb2ludGVyIHRvIGRldmljZV9ub2RlIG9mIHRoaXMgZW5kcG9pbnQKKyAqLworc3RydWN0IG9mX2VuZHBvaW50IHsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpsb2NhbF9ub2RlOworfTsKKworI2lmZGVmIENPTkZJR19PRgoraW50IG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQlzdHJ1Y3Qgb2ZfZW5kcG9pbnQgKmVuZHBvaW50KTsKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCisJCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpOworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KAorCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IG9mX2VuZHBvaW50ICplbmRwb2ludCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KAorCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwcmV2aW91cykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCisJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydCgKKwkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXJldHVybiBOVUxMOworfQorCisjZW5kaWYgLyogQ09ORklHX09GICovCisKKyNlbmRpZiAvKiBfX0xJTlVYX09GX0dSQVBIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDMzYWEyY2EuLmFhYjU3YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KQEAgLTE3MCw2ICsxNjksOCBAQAogCVBDSV9ERVZfRkxBR1NfTk9fRDMgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpIDIsCiAJLyogUHJvdmlkZSBpbmRpY2F0aW9uIGRldmljZSBpcyBhc3NpZ25lZCBieSBhIFZpcnR1YWwgTWFjaGluZSBNYW5hZ2VyICovCiAJUENJX0RFVl9GTEFHU19BU1NJR05FRCA9IChfX2ZvcmNlIHBjaV9kZXZfZmxhZ3NfdCkgNCwKKwkvKiBGbGFnIGZvciBxdWlyayB1c2UgdG8gc3RvcmUgaWYgcXVpcmstc3BlY2lmaWMgQUNTIGlzIGVuYWJsZWQgKi8KKwlQQ0lfREVWX0ZMQUdTX0FDU19FTkFCTEVEX1FVSVJLID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSA4LAogfTsKIAogZW51bSBwY2lfaXJxX3Jlcm91dGVfdmFyaWFudCB7CkBAIC00NjEsNyArNDYyLDYgQEAKIAl1bnNpZ25lZCBpbnQJCWlzX2FkZGVkOjE7CiB9OwogCi0jZGVmaW5lIHBjaV9idXNfYihuKQlsaXN0X2VudHJ5KG4sIHN0cnVjdCBwY2lfYnVzLCBub2RlKQogI2RlZmluZSB0b19wY2lfYnVzKG4pCWNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNpX2J1cywgZGV2KQogCiAvKgpAQCAtMTA2Niw3ICsxMDY2LDcgQEAKIGludCBfX211c3RfY2hlY2sgcGNpX2J1c19hbGxvY19yZXNvdXJjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJc3RydWN0IHJlc291cmNlICpyZXMsIHJlc291cmNlX3NpemVfdCBzaXplLAogCQkJcmVzb3VyY2Vfc2l6ZV90IGFsaWduLCByZXNvdXJjZV9zaXplX3QgbWluLAotCQkJdW5zaWduZWQgaW50IHR5cGVfbWFzaywKKwkJCXVuc2lnbmVkIGxvbmcgdHlwZV9tYXNrLAogCQkJcmVzb3VyY2Vfc2l6ZV90ICgqYWxpZ25mKSh2b2lkICosCiAJCQkJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqLAogCQkJCQkJICByZXNvdXJjZV9zaXplX3QsCkBAIC0xNTMwLDYgKzE1MzAsNyBAQAogdm9pZCBwY2lfZml4dXBfZGV2aWNlKGVudW0gcGNpX2ZpeHVwX3Bhc3MgcGFzcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kbWFfc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9kZXZfc3BlY2lmaWNfYWNzX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IGFjc19mbGFncyk7Cit2b2lkIHBjaV9kZXZfc3BlY2lmaWNfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2ZpeHVwX2RldmljZShlbnVtIHBjaV9maXh1cF9wYXNzIHBhc3MsCiAJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQpAQCAtMTU0Miw2ICsxNTQzLDcgQEAKIHsKIAlyZXR1cm4gLUVOT1RUWTsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZGV2X3NwZWNpZmljX2VuYWJsZV9hY3Moc3RydWN0IHBjaV9kZXYgKmRldikgeyB9CiAjZW5kaWYKIAogdm9pZCBfX2lvbWVtICpwY2ltX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heGxlbik7CkBAIC0xNTk3LDcgKzE1OTksNiBAQAogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiBpbnQgcGNpX2VuYWJsZV9zcmlvdihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnJfdmlydGZuKTsKIHZvaWQgcGNpX2Rpc2FibGVfc3Jpb3Yoc3RydWN0IHBjaV9kZXYgKmRldik7Ci1pcnFyZXR1cm5fdCBwY2lfc3Jpb3ZfbWlncmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9udW1fdmYoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX3Zmc19hc3NpZ25lZChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfc3Jpb3Zfc2V0X3RvdGFsdmZzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUxNiBudW12ZnMpOwpAQCAtMTYwNiw4ICsxNjA3LDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9lbmFibGVfc3Jpb3Yoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG5yX3ZpcnRmbikKIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZGlzYWJsZV9zcmlvdihzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyBpbmxpbmUgaXJxcmV0dXJuX3QgcGNpX3NyaW92X21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoteyByZXR1cm4gSVJRX05PTkU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9udW1fdmYoc3RydWN0IHBjaV9kZXYgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgcGNpX3Zmc19hc3NpZ25lZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCA5N2ZiZWNkLi5kNGRlMjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtNTI4LDYgKzUyOCw4IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GNQkweDE2MDUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX05CX0YzCTB4MTUzMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjQJMHgxNTM0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YzIDB4MTU4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GNCAweDE1ODQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ05CMTdIX0YzCTB4MTcwMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRQkJMHgyMDAwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFX0hPTUUJMHgyMDAxCkBAIC03MjYsNiArNzI4LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83MDE4CQkweDcwMTgKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hQCQkweDEwM2MKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9IUF8zUEFSCQkweDE1OTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9WSVNVQUxJWkVfRUcJMHgxMDA1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfVklTVUFMSVpFX0ZYNgkweDEwMDYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9WSVNVQUxJWkVfRlg0CTB4MTAwOApAQCAtMjUzMSw2ICsyNTM0LDkgQEAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMCQkweDgwODYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9FRVNTQwkweDAwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TTkJfSU1DCTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lWQl9JTUMJMHgwMTU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSFNXX0lNQwkweDBjMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QWEhEXzAJMHgwMzIwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUFhIRF8xCTB4MDMyMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BYSF8wCTB4MDMyOQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkvb21hcF9jb250cm9sX3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkvb21hcF9jb250cm9sX3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTA0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIG9tYXBfY29udHJvbF9waHkuaCAtIEhlYWRlciBmaWxlIGZvciB0aGUgUEhZIHBhcnQgb2YgY29udHJvbCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fT01BUF9DT05UUk9MX1BIWV9IX18KKyNkZWZpbmUgX19PTUFQX0NPTlRST0xfUEhZX0hfXworCitlbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSB7CisJT01BUF9DVFJMX1RZUEVfT1RHSFMgPSAxLAkvKiBNYWlsYm94IE9UR0hTX0NPTlRST0wgKi8KKwlPTUFQX0NUUkxfVFlQRV9VU0IyLAkvKiBVU0IyX1BIWSwgcG93ZXIgZG93biBpbiBDT05UUk9MX0RFVl9DT05GICovCisJT01BUF9DVFJMX1RZUEVfUElQRTMsCS8qIFBJUEUzIFBIWSwgRFBMTCAmIHNlcGVyYXRlIFJ4L1R4IHBvd2VyICovCisJT01BUF9DVFJMX1RZUEVfRFJBN1VTQjIsIC8qIFVTQjIgUEhZLCBwb3dlciBhbmQgcG93ZXJfYXV4IGUuZy4gRFJBNyAqLworCU9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMiwgLyogVVNCMiBQSFksIHBvd2VyIGUuZy4gQU00Mzd4ICovCit9OworCitzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJdTMyIF9faW9tZW0gKm90Z2hzX2NvbnRyb2w7CisJdTMyIF9faW9tZW0gKnBvd2VyOworCXUzMiBfX2lvbWVtICpwb3dlcl9hdXg7CisKKwlzdHJ1Y3QgY2xrICpzeXNfY2xrOworCisJZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgdHlwZTsKK307CisKK2VudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIHsKKwlVU0JfTU9ERV9VTkRFRklORUQgPSAwLAorCVVTQl9NT0RFX0hPU1QsCisJVVNCX01PREVfREVWSUNFLAorCVVTQl9NT0RFX0RJU0NPTk5FQ1QsCit9OworCisjZGVmaW5lCU9NQVBfQ1RSTF9ERVZfUEhZX1BECQlCSVQoMCkKKworI2RlZmluZQlPTUFQX0NUUkxfREVWX0FWQUxJRAkJQklUKDApCisjZGVmaW5lCU9NQVBfQ1RSTF9ERVZfQlZBTElECQlCSVQoMSkKKyNkZWZpbmUJT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQJCUJJVCgyKQorI2RlZmluZQlPTUFQX0NUUkxfREVWX1NFU1NFTkQJCUJJVCgzKQorI2RlZmluZQlPTUFQX0NUUkxfREVWX0lERElHCQlCSVQoNCkKKworI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfQ01EX01BU0sJCTB4MDAzRkMwMDAKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9TSElGVAkweEUKKworI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfRlJFUV9NQVNLCTB4RkZDMDAwMDAKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0ZSRVFfU0hJRlQJMHgxNgorCisjZGVmaW5lCU9NQVBfQ1RSTF9QSVBFM19QSFlfVFhfUlhfUE9XRVJPTgkweDMKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9UWF9SWF9QT1dFUk9GRgkweDAKKworI2RlZmluZSBPTUFQX0NUUkxfVVNCMl9QSFlfUEQJCUJJVCgyOCkKKworI2RlZmluZSBBTTQzN1hfQ1RSTF9VU0IyX1BIWV9QRAkJQklUKDApCisjZGVmaW5lIEFNNDM3WF9DVFJMX1VTQjJfT1RHX1BECQlCSVQoMSkKKyNkZWZpbmUgQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOCUJJVCgxOSkKKyNkZWZpbmUgQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOCUJJVCgyMCkKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX09NQVBfQ09OVFJPTF9QSFkpCit2b2lkIG9tYXBfY29udHJvbF9waHlfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pOwordm9pZCBvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBlbnVtIG9tYXBfY29udHJvbF91c2JfbW9kZSBtb2RlKTsKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSkKK3sKK30KKyNlbmRpZgorCisjZW5kaWYJLyogX19PTUFQX0NPTlRST0xfUEhZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkvb21hcF91c2IuaCBiL2luY2x1ZGUvbGludXgvcGh5L29tYXBfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyYzU0MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGh5L29tYXBfdXNiLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIG9tYXBfdXNiLmggLS0gb21hcCB1c2IyIHBoeSBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6IEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX0RSSVZFUlNfT01BUF9VU0IyX0gKKyNkZWZpbmUgX19EUklWRVJTX09NQVBfVVNCMl9ICisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKworc3RydWN0IHVzYl9kcGxsX3BhcmFtcyB7CisJdTE2CW07CisJdTgJbjsKKwl1OAlmcmVxOjM7CisJdTgJc2Q7CisJdTMyCW1mOworfTsKKworc3RydWN0IG9tYXBfdXNiIHsKKwlzdHJ1Y3QgdXNiX3BoeQkJcGh5OworCXN0cnVjdCBwaHlfY29tcGFuaW9uCSpjb21wYXJhdG9yOworCXZvaWQgX19pb21lbQkJKnBsbF9jdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqcGh5X2Jhc2U7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkqY29udHJvbF9kZXY7CisJc3RydWN0IGNsawkJKndrdXBjbGs7CisJc3RydWN0IGNsawkJKm9wdGNsazsKKwl1OAkJCWZsYWdzOworfTsKKworc3RydWN0IHVzYl9waHlfZGF0YSB7CisJY29uc3QgY2hhciAqbGFiZWw7CisJdTggZmxhZ3M7Cit9OworCisvKiBEcml2ZXIgRmxhZ3MgKi8KKyNkZWZpbmUgT01BUF9VU0IyX0hBU19TVEFSVF9TUlAgKDEgPDwgMCkKKyNkZWZpbmUgT01BUF9VU0IyX0hBU19TRVRfVkJVUyAoMSA8PCAxKQorI2RlZmluZSBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1QgKDEgPDwgMikKKworI2RlZmluZQlwaHlfdG9fb21hcHVzYih4KQljb250YWluZXJfb2YoKHgpLCBzdHJ1Y3Qgb21hcF91c2IsIHBoeSkKKworI2lmIGRlZmluZWQoQ09ORklHX09NQVBfVVNCMikgfHwgZGVmaW5lZChDT05GSUdfT01BUF9VU0IyX01PRFVMRSkKK2V4dGVybiBpbnQgb21hcF91c2IyX3NldF9jb21wYXJhdG9yKHN0cnVjdCBwaHlfY29tcGFuaW9uICpjb21wYXJhdG9yKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBvbWFwX3VzYjJfc2V0X2NvbXBhcmF0b3Ioc3RydWN0IHBoeV9jb21wYW5pb24gKmNvbXBhcmF0b3IpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB1MzIgb21hcF91c2JfcmVhZGwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF91c2Jfd3JpdGVsKHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0LAorCXUzMiBkYXRhKQoreworCV9fcmF3X3dyaXRlbChkYXRhLCBhZGRyICsgb2Zmc2V0KTsKK30KKworI2VuZGlmIC8qIF9fRFJJVkVSU19PTUFQX1VTQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCmluZGV4IDNmODM0NTkuLmUyZjVjYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCkBAIC0xNDksOCArMTQ5LDExIEBACiBzdHJ1Y3QgcGh5ICpwaHlfb3B0aW9uYWxfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqc3RyaW5nKTsKIHN0cnVjdCBwaHkgKmRldm1fcGh5X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnN0cmluZyk7CiBzdHJ1Y3QgcGh5ICpkZXZtX3BoeV9vcHRpb25hbF9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzdHJpbmcpOworc3RydWN0IHBoeSAqZGV2bV9vZl9waHlfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICBjb25zdCBjaGFyICpjb25faWQpOwogdm9pZCBwaHlfcHV0KHN0cnVjdCBwaHkgKnBoeSk7CiB2b2lkIGRldm1fcGh5X3B1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwaHkgKnBoeSk7CitzdHJ1Y3QgcGh5ICpvZl9waHlfZ2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKmNvbl9pZCk7CiBzdHJ1Y3QgcGh5ICpvZl9waHlfc2ltcGxlX3hsYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzKTsKIHN0cnVjdCBwaHkgKnBoeV9jcmVhdGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgcGh5X29wcyAqb3BzLApAQCAtMjUxLDYgKzI1NCwxMyBAQAogCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwaHkgKmRldm1fb2ZfcGh5X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICBjb25zdCBjaGFyICpjb25faWQpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwaHlfcHV0KHN0cnVjdCBwaHkgKnBoeSkKIHsKIH0KQEAgLTI1OSw2ICsyNjksMTEgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGh5ICpvZl9waHlfZ2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKmNvbl9pZCkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGh5ICpvZl9waHlfc2ltcGxlX3hsYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2FkYXUxOTc3LmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYWRhdTE5NzcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQxMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2FkYXUxOTc3LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfUExBVEZPUk1fREFUQV9BREFVMTk3N19IX18KKyNkZWZpbmUgX19MSU5VWF9QTEFURk9STV9EQVRBX0FEQVUxOTc3X0hfXworCisvKioKKyAqIGVudW0gYWRhdTE5NzdfbWljYmlhcyAtIEFEQVUxOTc3IE1JQ0JJQVMgcGluIHZvbHRhZ2Ugc2V0dGluZworICogQEFEQVUxOTc3X01JQ0JJQVNfNVYwOiBNSUNCSUFTIGlzIHNldCB0byA1LjAgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfNVY1OiBNSUNCSUFTIGlzIHNldCB0byA1LjUgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfNlYwOiBNSUNCSUFTIGlzIHNldCB0byA2LjAgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfNlY1OiBNSUNCSUFTIGlzIHNldCB0byA2LjUgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfN1YwOiBNSUNCSUFTIGlzIHNldCB0byA3LjAgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfN1Y1OiBNSUNCSUFTIGlzIHNldCB0byA3LjUgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfOFYwOiBNSUNCSUFTIGlzIHNldCB0byA4LjAgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfOFY1OiBNSUNCSUFTIGlzIHNldCB0byA4LjUgVgorICogQEFEQVUxOTc3X01JQ0JJQVNfOVYwOiBNSUNCSUFTIGlzIHNldCB0byA5LjAgVgorICovCitlbnVtIGFkYXUxOTc3X21pY2JpYXMgeworCUFEQVUxOTc3X01JQ0JJQVNfNVYwID0gMHgwLAorCUFEQVUxOTc3X01JQ0JJQVNfNVY1ID0gMHgxLAorCUFEQVUxOTc3X01JQ0JJQVNfNlYwID0gMHgyLAorCUFEQVUxOTc3X01JQ0JJQVNfNlY1ID0gMHgzLAorCUFEQVUxOTc3X01JQ0JJQVNfN1YwID0gMHg0LAorCUFEQVUxOTc3X01JQ0JJQVNfN1Y1ID0gMHg1LAorCUFEQVUxOTc3X01JQ0JJQVNfOFYwID0gMHg2LAorCUFEQVUxOTc3X01JQ0JJQVNfOFY1ID0gMHg3LAorCUFEQVUxOTc3X01JQ0JJQVNfOVYwID0gMHg4LAorfTsKKworLyoqCisgKiBzdHJ1Y3QgYWRhdTE5NzdfcGxhdGZvcm1fZGF0YSAtIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIEFEQVUxOTc3CisgKiBAbWljYmlhczogU3BlY2lmaWVzIHRoZSB2b2x0YWdlIGZvciB0aGUgTUlDQklBUyBwaW4KKyAqLworc3RydWN0IGFkYXUxOTc3X3BsYXRmb3JtX2RhdGEgeworCWVudW0gYWRhdTE5NzdfbWljYmlhcyBtaWNiaWFzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYy5oCmluZGV4IDllZmMwNGQuLjcwOWM2ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYy5oCkBAIC0xLDUgKzEsNCBAQAotLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hdWRpby5oCi0gKgorLyoKICAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQKICAqIEF1dGhvcjogSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYzI0eHhfc2ltdGVjLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MyNHh4X3NpbXRlYy5oCmluZGV4IDM3NmFmNTIuLmQyMjBlNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYzI0eHhfc2ltdGVjLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjMjR4eF9zaW10ZWMuaApAQCAtMSw1ICsxLDQgQEAKLS8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKLSAqCisvKgogICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCiAgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwogICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2J0LW5va2lhLWg0cC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2J0LW5va2lhLWg0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDE2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYnQtbm9raWEtaDRwLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworCisvKioKKyAqIHN0cnVjdCBoY2lfaDRwX3BsYXRmb3JtIGRhdGEgLSBoY2lfaDRwIFBsYXRmb3JtIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBoY2lfaDRwX3BsYXRmb3JtX2RhdGEgeworCWludCBjaGlwX3R5cGU7CisJaW50IGJ0X3N5c2NsazsKKwl1bnNpZ25lZCBpbnQgYnRfd2FrZXVwX2dwaW87CisJdW5zaWduZWQgaW50IGhvc3Rfd2FrZXVwX2dwaW87CisJdW5zaWduZWQgaW50IHJlc2V0X2dwaW87CisJaW50IHJlc2V0X2dwaW9fc2hhcmVkOworCXVuc2lnbmVkIGludCB1YXJ0X2lycTsKKwlwaHlzX2FkZHJfdCB1YXJ0X2Jhc2U7CisJY29uc3QgY2hhciAqdWFydF9pY2xrOworCWNvbnN0IGNoYXIgKnVhcnRfZmNsazsKKwl2b2lkICgqc2V0X3BtX2xpbWl0cykoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHNldCk7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RhdmluY2lfYXNwLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZGF2aW5jaV9hc3AuaAppbmRleCA1MjQ1OTkyLi44NWFkNjhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZGF2aW5jaV9hc3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZGF2aW5jaV9hc3AuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KIAotc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhIHsKK3N0cnVjdCBkYXZpbmNpX21jYXNwX3BkYXRhIHsKIAl1MzIgdHhfZG1hX29mZnNldDsKIAl1MzIgcnhfZG1hX29mZnNldDsKIAlpbnQgYXNwX2NoYW5fcTsJLyogZXZlbnQgcXVldWUgbnVtYmVyIGZvciBBU1AgY2hhbm5lbCAqLwpAQCAtODcsNiArODcsOCBAQAogCWludCB0eF9kbWFfY2hhbm5lbDsKIAlpbnQgcnhfZG1hX2NoYW5uZWw7CiB9OworLyogVE9ETzogRml4IGFyY2gvYXJtL21hY2gtZGF2aW5jaS8gdXNlcnMgYW5kIHJlbW92ZSB0aGlzIGRlZmluZSAqLworI2RlZmluZSBzbmRfcGxhdGZvcm1fZGF0YSBkYXZpbmNpX21jYXNwX3BkYXRhCiAKIGVudW0gewogCU1DQVNQX1ZFUlNJT05fMSA9IDAsCS8qIERNNjQ2eCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL21heDMxMHguaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9tYXgzMTB4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTFkY2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL21heDMxMHguaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgTWF4aW0gKERhbGxhcykgTUFYMzEwNy84LzksIE1BWDE0ODMwIHNlcmlhbCBkcml2ZXIKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEyIEFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+Ci0gKgotICogIEJhc2VkIG9uIG1heDMxMDAuYywgYnkgQ2hyaXN0aWFuIFBlbGxlZ3JpbiA8Y2hyaXBlbGxAZXZvbHdhcmUub3JnPgotICogIEJhc2VkIG9uIG1heDMxMTAuYywgYnkgRmVuZyBUYW5nIDxmZW5nLnRhbmdAaW50ZWwuY29tPgotICogIEJhc2VkIG9uIG1heDMxMDcuYywgYnkgQWF2YW1vYmlsZQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX01BWDMxMFhfSF8KLSNkZWZpbmUgX01BWDMxMFhfSF8KLQotLyoKLSAqIEV4YW1wbGUgYm9hcmQgaW5pdGlhbGl6YXRpb24gZGF0YToKLSAqCi0gKiBzdGF0aWMgc3RydWN0IG1heDMxMHhfcGRhdGEgbWF4MzEwN19wZGF0YSA9IHsKLSAqCS5kcml2ZXJfZmxhZ3MJPSBNQVgzMTBYX0VYVF9DTEssCi0gKgkudWFydF9mbGFnc1swXQk9IE1BWDMxMFhfRUNIT19TVVBSRVNTIHwgTUFYMzEwWF9BVVRPX0RJUl9DVFJMLAotICoJLmZyZXF1ZW5jeQk9IDM2ODY0MDAsCi0gKgkuZ3Bpb19iYXNlCT0gLTEsCi0gKiB9OwotICoKLSAqIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpX2RldmljZV9tYXgzMTA3W10gPSB7Ci0gKgl7Ci0gKgkJLm1vZGFsaWFzCT0gIm1heDMxMDciLAotICoJCS5pcnEJCT0gSVJRX0VJTlQzLAotICoJCS5idXNfbnVtCT0gMSwKLSAqCQkuY2hpcF9zZWxlY3QJPSAxLAotICoJCS5wbGF0Zm9ybV9kYXRhCT0gJm1heDMxMDdfcGRhdGEsCi0gKgl9LAotICogfTsKLSAqLwotCi0jZGVmaW5lIE1BWDMxMFhfTUFYX1VBUlRTCTQKLQotLyogTUFYMzEwWCBwbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZSAqLwotc3RydWN0IG1heDMxMHhfcGRhdGEgewotCS8qIEZsYWdzIGdsb2JhbCB0byBkcml2ZXIgKi8KLQljb25zdCB1OAkJZHJpdmVyX2ZsYWdzOwotI2RlZmluZSBNQVgzMTBYX0VYVF9DTEsJCSgweDAwMDAwMDAxKQkvKiBFeHRlcm5hbCBjbG9jayBlbmFibGUgKi8KLQkvKiBGbGFncyBnbG9iYWwgdG8gVUFSVCBwb3J0ICovCi0JY29uc3QgdTgJCXVhcnRfZmxhZ3NbTUFYMzEwWF9NQVhfVUFSVFNdOwotI2RlZmluZSBNQVgzMTBYX0xPT1BCQUNLCSgweDAwMDAwMDAxKQkvKiBMb29wYmFjayBtb2RlIGVuYWJsZSAqLwotI2RlZmluZSBNQVgzMTBYX0VDSE9fU1VQUkVTUwkoMHgwMDAwMDAwMikJLyogRW5hYmxlIGVjaG8gc3VwcmVzcyAqLwotI2RlZmluZSBNQVgzMTBYX0FVVE9fRElSX0NUUkwJKDB4MDAwMDAwMDQpCS8qIEVuYWJsZSBBdXRvIGRpcmVjdGlvbgotCQkJCQkJICogY29udHJvbCAoUlMtNDg1KQotCQkJCQkJICovCi0JLyogRnJlcXVlbmN5IChleHRyZW5hbCBjbG9jayBvciBjcnlzdGFsKSAqLwotCWNvbnN0IGludAkJZnJlcXVlbmN5OwotCS8qIEdQSU8gYmFzZSBudW1iZXIgKGNhbiBiZSBuZWdhdGl2ZSkgKi8KLQljb25zdCBpbnQJCWdwaW9fYmFzZTsKLQkvKiBDYWxsZWQgZHVyaW5nIHN0YXJ0dXAgKi8KLQl2b2lkICgqaW5pdCkodm9pZCk7Ci0JLyogQ2FsbGVkIGJlZm9yZSBmaW5pc2ggKi8KLQl2b2lkICgqZXhpdCkodm9pZCk7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zZXJpYWwtaW14LmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc2VyaWFsLWlteC5oCmluZGV4IDRhZGVjOWIuLjNjYzJlM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zZXJpYWwtaW14LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NlcmlhbC1pbXguaApAQCAtMjMsOCArMjMsNiBAQAogI2RlZmluZSBJTVhVQVJUX0lSREEgICAgICAgICgxPDwxKQogCiBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHsKLQlpbnQgKCppbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLQl2b2lkICgqZXhpdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCXZvaWQgKCppcmRhX2VuYWJsZSkoaW50IGVuYWJsZSk7CiAJdW5zaWduZWQgaW50IGlyZGFfaW52X3J4OjE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zcGktczNjNjR4eC5oCmluZGV4IDg0NDdmNjMuLmQzODg5YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zcGktczNjNjR4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zcGktczNjNjR4eC5oCkBAIC0xLDUgKzEsNCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NHh4LXNwaS5oCi0gKgorLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4KICAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KICAqCkBAIC04LDggKzcsOCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2lmbmRlZiBfX1MzQzY0WFhfUExBVF9TUElfSAotI2RlZmluZSBfX1MzQzY0WFhfUExBVF9TUElfSAorI2lmbmRlZiBfX1NQSV9TM0M2NFhYX0gKKyNkZWZpbmUgX19TUElfUzNDNjRYWF9ICiAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIApAQCAtNjgsNCArNjcsNCBAQAogZXh0ZXJuIHN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvIHMzYzY0eHhfc3BpMF9wZGF0YTsKIGV4dGVybiBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzM2M2NHh4X3NwaTFfcGRhdGE7CiBleHRlcm4gc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gczNjNjR4eF9zcGkyX3BkYXRhOwotI2VuZGlmIC8qIF9fUzNDNjRYWF9QTEFUX1NQSV9IICovCisjZW5kaWYgLypfX1NQSV9TM0M2NFhYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1bGlzdC5oIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKaW5kZXggZGJhZjk5MC4uODE4M2I0NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1bGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1bGlzdC5oCkBAIC0yNDcsOSArMjQ3LDEwIEBACiAgKiBwcmltaXRpdmVzIHN1Y2ggYXMgbGlzdF9hZGRfcmN1KCkgYXMgbG9uZyBhcyBpdCdzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgogICovCiAjZGVmaW5lIGxpc3RfZW50cnlfcmN1KHB0ciwgdHlwZSwgbWVtYmVyKSBcCi0JKHt0eXBlb2YgKCpwdHIpIF9fcmN1ICpfX3B0ciA9ICh0eXBlb2YgKCpwdHIpIF9fcmN1IF9fZm9yY2UgKilwdHI7IFwKLQkgY29udGFpbmVyX29mKCh0eXBlb2YocHRyKSlyY3VfZGVyZWZlcmVuY2VfcmF3KF9fcHRyKSwgdHlwZSwgbWVtYmVyKTsgXAotCX0pCisoeyBcCisJdHlwZW9mKCpwdHIpIF9fcmN1ICpfX3B0ciA9ICh0eXBlb2YoKnB0cikgX19yY3UgX19mb3JjZSAqKXB0cjsgXAorCWNvbnRhaW5lcl9vZigodHlwZW9mKHB0cikpcmN1X2RlcmVmZXJlbmNlX3JhdyhfX3B0ciksIHR5cGUsIG1lbWJlcik7IFwKK30pCiAKIC8qKgogICogV2hlcmUgYXJlIGxpc3RfZW1wdHlfcmN1KCkgYW5kIGxpc3RfZmlyc3RfZW50cnlfcmN1KCk/CkBAIC0yODUsMTEgKzI4NiwxMSBAQAogICogcHJpbWl0aXZlcyBzdWNoIGFzIGxpc3RfYWRkX3JjdSgpIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIGJ5IHJjdV9yZWFkX2xvY2soKS4KICAqLwogI2RlZmluZSBsaXN0X2ZpcnN0X29yX251bGxfcmN1KHB0ciwgdHlwZSwgbWVtYmVyKSBcCi0JKHtzdHJ1Y3QgbGlzdF9oZWFkICpfX3B0ciA9IChwdHIpOyBcCi0JICBzdHJ1Y3QgbGlzdF9oZWFkICpfX25leHQgPSBBQ0NFU1NfT05DRShfX3B0ci0+bmV4dCk7IFwKLQkgIGxpa2VseShfX3B0ciAhPSBfX25leHQpID8gXAotCQlsaXN0X2VudHJ5X3JjdShfX25leHQsIHR5cGUsIG1lbWJlcikgOiBOVUxMOyBcCi0JfSkKKyh7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfX3B0ciA9IChwdHIpOyBcCisJc3RydWN0IGxpc3RfaGVhZCAqX19uZXh0ID0gQUNDRVNTX09OQ0UoX19wdHItPm5leHQpOyBcCisJbGlrZWx5KF9fcHRyICE9IF9fbmV4dCkgPyBsaXN0X2VudHJ5X3JjdShfX25leHQsIHR5cGUsIG1lbWJlcikgOiBOVUxMOyBcCit9KQogCiAvKioKICAqIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1CS0JaXRlcmF0ZSBvdmVyIHJjdSBsaXN0IG9mIGdpdmVuIHR5cGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCA3MmJmM2EwLi4wMGE3ZmQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDAxCiAgKgpAQCAtNDQsNyArNDQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnb2JqZWN0cy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KIAorZXh0ZXJuIGludCByY3VfZXhwZWRpdGVkOyAvKiBmb3Igc3lzY3RsICovCiAjaWZkZWYgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QKIGV4dGVybiBpbnQgcmN1dG9ydHVyZV9ydW5uYWJsZTsgLyogZm9yIHN5c2N0bCAqLwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCAqLwpAQCAtMzE0LDcgKzMxNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByY3VfbG9ja19hY3F1aXJlKHN0cnVjdCBsb2NrZGVwX21hcCAqbWFwKQogewotCWxvY2tfYWNxdWlyZShtYXAsIDAsIDAsIDIsIDEsIE5VTEwsIF9USElTX0lQXyk7CisJbG9ja19hY3F1aXJlKG1hcCwgMCwgMCwgMiwgMCwgTlVMTCwgX1RISVNfSVBfKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJjdV9sb2NrX3JlbGVhc2Uoc3RydWN0IGxvY2tkZXBfbWFwICptYXApCkBAIC00NzksMTEgKzQ4MSw5IEBACiAJZG8gewkJCQkJCQkJXAogCQlyY3VfcHJlZW1wdF9zbGVlcF9jaGVjaygpOwkJCQlcCiAJCXJjdV9sb2NrZGVwX2Fzc2VydCghbG9ja19pc19oZWxkKCZyY3VfYmhfbG9ja19tYXApLAlcCi0JCQkJICAgIklsbGVnYWwgY29udGV4dCBzd2l0Y2ggaW4gUkNVLWJoIglcCi0JCQkJICAgIiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiIpOwlcCisJCQkJICAgIklsbGVnYWwgY29udGV4dCBzd2l0Y2ggaW4gUkNVLWJoIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIik7IFwKIAkJcmN1X2xvY2tkZXBfYXNzZXJ0KCFsb2NrX2lzX2hlbGQoJnJjdV9zY2hlZF9sb2NrX21hcCksCVwKLQkJCQkgICAiSWxsZWdhbCBjb250ZXh0IHN3aXRjaCBpbiBSQ1Utc2NoZWQiXAotCQkJCSAgICIgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24iKTsJXAorCQkJCSAgICJJbGxlZ2FsIGNvbnRleHQgc3dpdGNoIGluIFJDVS1zY2hlZCByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiIpOyBcCiAJfSB3aGlsZSAoMCkKIAogI2Vsc2UgLyogI2lmZGVmIENPTkZJR19QUk9WRV9SQ1UgKi8KQEAgLTUxMCw0MyArNTEwLDQwIEBACiAjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIF9fQ0hFQ0tFUl9fICovCiAKICNkZWZpbmUgX19yY3VfYWNjZXNzX3BvaW50ZXIocCwgc3BhY2UpIFwKLQkoeyBcCi0JCXR5cGVvZigqcCkgKl9fX19fX19fX3AxID0gKHR5cGVvZigqcCkqX19mb3JjZSApQUNDRVNTX09OQ0UocCk7IFwKLQkJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKLQkJKCh0eXBlb2YoKnApIF9fZm9yY2UgX19rZXJuZWwgKikoX19fX19fX19fcDEpKTsgXAotCX0pCisoeyBcCisJdHlwZW9mKCpwKSAqX19fX19fX19fcDEgPSAodHlwZW9mKCpwKSAqX19mb3JjZSlBQ0NFU1NfT05DRShwKTsgXAorCXJjdV9kZXJlZmVyZW5jZV9zcGFyc2UocCwgc3BhY2UpOyBcCisJKCh0eXBlb2YoKnApIF9fZm9yY2UgX19rZXJuZWwgKikoX19fX19fX19fcDEpKTsgXAorfSkKICNkZWZpbmUgX19yY3VfZGVyZWZlcmVuY2VfY2hlY2socCwgYywgc3BhY2UpIFwKLQkoeyBcCi0JCXR5cGVvZigqcCkgKl9fX19fX19fX3AxID0gKHR5cGVvZigqcCkqX19mb3JjZSApQUNDRVNTX09OQ0UocCk7IFwKLQkJcmN1X2xvY2tkZXBfYXNzZXJ0KGMsICJzdXNwaWNpb3VzIHJjdV9kZXJlZmVyZW5jZV9jaGVjaygpIiBcCi0JCQkJICAgICAgIiB1c2FnZSIpOyBcCi0JCXJjdV9kZXJlZmVyZW5jZV9zcGFyc2UocCwgc3BhY2UpOyBcCi0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyBcCi0JCSgodHlwZW9mKCpwKSBfX2ZvcmNlIF9fa2VybmVsICopKF9fX19fX19fX3AxKSk7IFwKLQl9KQorKHsgXAorCXR5cGVvZigqcCkgKl9fX19fX19fX3AxID0gKHR5cGVvZigqcCkgKl9fZm9yY2UpQUNDRVNTX09OQ0UocCk7IFwKKwlyY3VfbG9ja2RlcF9hc3NlcnQoYywgInN1c3BpY2lvdXMgcmN1X2RlcmVmZXJlbmNlX2NoZWNrKCkgdXNhZ2UiKTsgXAorCXJjdV9kZXJlZmVyZW5jZV9zcGFyc2UocCwgc3BhY2UpOyBcCisJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IC8qIERlcGVuZGVuY3kgb3JkZXIgdnMuIHAgYWJvdmUuICovIFwKKwkoKHR5cGVvZigqcCkgX19mb3JjZSBfX2tlcm5lbCAqKShfX19fX19fX19wMSkpOyBcCit9KQogI2RlZmluZSBfX3JjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocCwgYywgc3BhY2UpIFwKLQkoeyBcCi0JCXJjdV9sb2NrZGVwX2Fzc2VydChjLCAic3VzcGljaW91cyByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKCkiIFwKLQkJCQkgICAgICAiIHVzYWdlIik7IFwKLQkJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKLQkJKCh0eXBlb2YoKnApIF9fZm9yY2UgX19rZXJuZWwgKikocCkpOyBcCi0JfSkKKyh7IFwKKwlyY3VfbG9ja2RlcF9hc3NlcnQoYywgInN1c3BpY2lvdXMgcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgpIHVzYWdlIik7IFwKKwlyY3VfZGVyZWZlcmVuY2Vfc3BhcnNlKHAsIHNwYWNlKTsgXAorCSgodHlwZW9mKCpwKSBfX2ZvcmNlIF9fa2VybmVsICopKHApKTsgXAorfSkKIAogI2RlZmluZSBfX3JjdV9hY2Nlc3NfaW5kZXgocCwgc3BhY2UpIFwKLQkoeyBcCi0JCXR5cGVvZihwKSBfX19fX19fX19wMSA9IEFDQ0VTU19PTkNFKHApOyBcCi0JCXJjdV9kZXJlZmVyZW5jZV9zcGFyc2UocCwgc3BhY2UpOyBcCi0JCShfX19fX19fX19wMSk7IFwKLQl9KQorKHsgXAorCXR5cGVvZihwKSBfX19fX19fX19wMSA9IEFDQ0VTU19PTkNFKHApOyBcCisJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKKwkoX19fX19fX19fcDEpOyBcCit9KQogI2RlZmluZSBfX3JjdV9kZXJlZmVyZW5jZV9pbmRleF9jaGVjayhwLCBjKSBcCi0JKHsgXAotCQl0eXBlb2YocCkgX19fX19fX19fcDEgPSBBQ0NFU1NfT05DRShwKTsgXAotCQlyY3VfbG9ja2RlcF9hc3NlcnQoYywgXAotCQkJCSAgICJzdXNwaWNpb3VzIHJjdV9kZXJlZmVyZW5jZV9pbmRleF9jaGVjaygpIiBcCi0JCQkJICAgIiB1c2FnZSIpOyBcCi0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyBcCi0JCShfX19fX19fX19wMSk7IFwKLQl9KQorKHsgXAorCXR5cGVvZihwKSBfX19fX19fX19wMSA9IEFDQ0VTU19PTkNFKHApOyBcCisJcmN1X2xvY2tkZXBfYXNzZXJ0KGMsIFwKKwkJCSAgICJzdXNwaWNpb3VzIHJjdV9kZXJlZmVyZW5jZV9pbmRleF9jaGVjaygpIHVzYWdlIik7IFwKKwlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgLyogRGVwZW5kZW5jeSBvcmRlciB2cy4gcCBhYm92ZS4gKi8gXAorCShfX19fX19fX19wMSk7IFwKK30pCiAKIC8qKgogICogUkNVX0lOSVRJQUxJWkVSKCkgLSBzdGF0aWNhbGx5IGluaXRpYWxpemUgYW4gUkNVLXByb3RlY3RlZCBnbG9iYWwgdmFyaWFibGUKQEAgLTU4NSwxMiArNTgyLDcgQEAKICAqIHBsZWFzZSBiZSBjYXJlZnVsIHdoZW4gbWFraW5nIGNoYW5nZXMgdG8gcmN1X2Fzc2lnbl9wb2ludGVyKCkgYW5kIHRoZQogICogb3RoZXIgbWFjcm9zIHRoYXQgaXQgaW52b2tlcy4KICAqLwotI2RlZmluZSByY3VfYXNzaWduX3BvaW50ZXIocCwgdikgXAotCWRvIHsgXAotCQlzbXBfd21iKCk7IFwKLQkJQUNDRVNTX09OQ0UocCkgPSBSQ1VfSU5JVElBTElaRVIodik7IFwKLQl9IHdoaWxlICgwKQotCisjZGVmaW5lIHJjdV9hc3NpZ25fcG9pbnRlcihwLCB2KSBzbXBfc3RvcmVfcmVsZWFzZSgmcCwgUkNVX0lOSVRJQUxJWkVSKHYpKQogCiAvKioKICAqIHJjdV9hY2Nlc3NfcG9pbnRlcigpIC0gZmV0Y2ggUkNVIHBvaW50ZXIgd2l0aCBubyBkZXJlZmVyZW5jaW5nCkBAIC0xMDE1LDExICsxMDA3LDIxIEBACiAjZGVmaW5lIGtmcmVlX3JjdShwdHIsIHJjdV9oZWFkKQkJCQkJXAogCV9fa2ZyZWVfcmN1KCYoKHB0ciktPnJjdV9oZWFkKSwgb2Zmc2V0b2YodHlwZW9mKCoocHRyKSksIHJjdV9oZWFkKSkKIAotI2lmZGVmIENPTkZJR19SQ1VfTk9DQl9DUFUKKyNpZiBkZWZpbmVkKENPTkZJR19USU5ZX1JDVSkgfHwgZGVmaW5lZChDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCkKK3N0YXRpYyBpbmxpbmUgaW50IHJjdV9uZWVkc19jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyAqZGVsdGFfamlmZmllcykKK3sKKwkqZGVsdGFfamlmZmllcyA9IFVMT05HX01BWDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAjaWYgZGVmaW5lZChDT05GSUdfVElOWV9SQ1UpIHx8IGRlZmluZWQoQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwpICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMKQorc3RhdGljIGlubGluZSBib29sIHJjdV9pc19ub2NiX2NwdShpbnQgY3B1KSB7IHJldHVybiB0cnVlOyB9CisjZWxpZiBkZWZpbmVkKENPTkZJR19SQ1VfTk9DQl9DUFUpCiBib29sIHJjdV9pc19ub2NiX2NwdShpbnQgY3B1KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGJvb2wgcmN1X2lzX25vY2JfY3B1KGludCBjcHUpIHsgcmV0dXJuIGZhbHNlOyB9Ci0jZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfTk9DQl9DUFUgKi8KKyNlbmRpZgogCiAKIC8qIE9ubHkgZm9yIHVzZSBieSBhZGFwdGl2ZS10aWNrcyBjb2RlLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3V0aW55LmggYi9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaAppbmRleCA2ZjAxNzcxLi40MjVjNjU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaApAQCAtMTIsOCArMTIsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAogICoKQEAgLTI3LDYgKzI3LDE2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3N0YXRlX3N5bmNocm9uaXplX3JjdSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZF9zeW5jaHJvbml6ZV9yY3UodW5zaWduZWQgbG9uZyBvbGRzdGF0ZSkKK3sKKwltaWdodF9zbGVlcCgpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2JhcnJpZXJfYmgodm9pZCkKIHsKIAl3YWl0X3JjdV9ncChjYWxsX3JjdV9iaCk7CkBAIC02OCwxMiArNzgsNiBAQAogCWNhbGxfcmN1KGhlYWQsIGZ1bmMpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgKmRlbHRhX2ppZmZpZXMpCi17Ci0JKmRlbHRhX2ppZmZpZXMgPSBVTE9OR19NQVg7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCByY3Vfbm90ZV9jb250ZXh0X3N3aXRjaChpbnQgY3B1KQogewogCXJjdV9zY2hlZF9xcyhjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3V0cmVlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaAppbmRleCA3MjEzN2VlLi5hNTljYTA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaApAQCAtMTIsOCArMTIsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAogICoKQEAgLTMxLDcgKzMxLDkgQEAKICNkZWZpbmUgX19MSU5VWF9SQ1VUUkVFX0gKIAogdm9pZCByY3Vfbm90ZV9jb250ZXh0X3N3aXRjaChpbnQgY3B1KTsKKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgKmRlbHRhX2ppZmZpZXMpOworI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwgKi8KIHZvaWQgcmN1X2NwdV9zdGFsbF9yZXNldCh2b2lkKTsKIAogLyoKQEAgLTc0LDYgKzc2LDggQEAKIHZvaWQgcmN1X2JhcnJpZXIodm9pZCk7CiB2b2lkIHJjdV9iYXJyaWVyX2JoKHZvaWQpOwogdm9pZCByY3VfYmFycmllcl9zY2hlZCh2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgZ2V0X3N0YXRlX3N5bmNocm9uaXplX3JjdSh2b2lkKTsKK3ZvaWQgY29uZF9zeW5jaHJvbml6ZV9yY3UodW5zaWduZWQgbG9uZyBvbGRzdGF0ZSk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJjdXRvcnR1cmVfdGVzdHNlcTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJjdXRvcnR1cmVfdmVybnVtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWdtYXAuaCBiL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKaW5kZXggNDE0OWYxYS4uODU2OTFiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWdtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCkBAIC0xNjQsNiArMTY0LDkgQEAKICAqIEB1c2Vfc2luZ2xlX3J3OiBJZiBzZXQsIGNvbnZlcnRzIHRoZSBidWxrIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMgaW50bwogICoJCSAgICBhIHNlcmllcyBvZiBzaW5nbGUgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucy4gVGhpcyBpcyB1c2VmdWwKICAqCQkgICAgZm9yIGRldmljZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYnVsayByZWFkIGFuZCB3cml0ZS4KKyAqIEBjYW5fbXVsdGlfd3JpdGU6IElmIHNldCwgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUgbXVsdGkgd3JpdGUgbW9kZSBvZiBidWxrCisgKiAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zLCBpZiBjbGVhciBtdWx0aSB3cml0ZSByZXF1ZXN0cyB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICBzcGxpdCBpbnRvIGluZGl2aWR1YWwgd3JpdGUgb3BlcmF0aW9ucwogICoKICAqIEBjYWNoZV90eXBlOiBUaGUgYWN0dWFsIGNhY2hlIHR5cGUuCiAgKiBAcmVnX2RlZmF1bHRzX3JhdzogUG93ZXIgb24gcmVzZXQgdmFsdWVzIGZvciByZWdpc3RlcnMgKGZvciB1c2Ugd2l0aApAQCAtMjE1LDYgKzIxOCw3IEBACiAJdTggd3JpdGVfZmxhZ19tYXNrOwogCiAJYm9vbCB1c2Vfc2luZ2xlX3J3OworCWJvb2wgY2FuX211bHRpX3dyaXRlOwogCiAJZW51bSByZWdtYXBfZW5kaWFuIHJlZ19mb3JtYXRfZW5kaWFuOwogCWVudW0gcmVnbWFwX2VuZGlhbiB2YWxfZm9ybWF0X2VuZGlhbjsKQEAgLTMxNywxMiArMzIxLDE2IEBACiAJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2J1cyAqYnVzLAogCQkJICAgdm9pZCAqYnVzX2NvbnRleHQsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK2ludCByZWdtYXBfYXR0YWNoX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CiBzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9pMmMoc3RydWN0IGkyY19jbGllbnQgKmkyYywKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKIHN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwaShzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwotc3RydWN0IHJlZ21hcCAqcmVnbWFwX2luaXRfc3BtaShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK3N0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwbWlfYmFzZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOworc3RydWN0IHJlZ21hcCAqcmVnbWFwX2luaXRfc3BtaV9leHQoc3RydWN0IHNwbWlfZGV2aWNlICpkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwogc3RydWN0IHJlZ21hcCAqcmVnbWFwX2luaXRfbW1pb19jbGsoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjbGtfaWQsCiAJCQkJICAgIHZvaWQgX19pb21lbSAqcmVncywKIAkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CkBAIC0zMzUsOCArMzQzLDEwIEBACiAJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwogc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3RydWN0IHNwaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7Ci1zdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK3N0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BtaV9iYXNlKHN0cnVjdCBzcG1pX2RldmljZSAqZGV2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOworc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2V4dChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKmRldiwKKwkJCQkJIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwogc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNsa19pZCwKIAkJCQkJIHZvaWQgX19pb21lbSAqcmVncywKIAkJCQkJIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwpAQCAtMzg2LDggKzM5NiwxMSBAQAogCQkgICAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9sZW4pOwogaW50IHJlZ21hcF9idWxrX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywgY29uc3Qgdm9pZCAqdmFsLAogCQkJc2l6ZV90IHZhbF9jb3VudCk7Ci1pbnQgcmVnbWFwX211bHRpX3JlZ193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKK2ludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAogCQkJaW50IG51bV9yZWdzKTsKK2ludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlX2J5cGFzc2VkKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCSAgICBpbnQgbnVtX3JlZ3MpOwogaW50IHJlZ21hcF9yYXdfd3JpdGVfYXN5bmMoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbik7CiBpbnQgcmVnbWFwX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgKnZhbCk7CkBAIC00MjMsNiArNDM2LDggQEAKIAogaW50IHJlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKIAkJCSAgaW50IG51bV9yZWdzKTsKK2ludCByZWdtYXBfcGFyc2VfdmFsKHN0cnVjdCByZWdtYXAgKm1hcCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCXVuc2lnbmVkIGludCAqdmFsKTsKIAogc3RhdGljIGlubGluZSBib29sIHJlZ21hcF9yZWdfaW5fcmFuZ2UodW5zaWduZWQgaW50IHJlZywKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSAqcmFuZ2UpCkBAIC02OTUsNiArNzEwLDEzIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHJlZ21hcF9wYXJzZV92YWwoc3RydWN0IHJlZ21hcCAqbWFwLCBjb25zdCB2b2lkICpidWYsCisJCQkJdW5zaWduZWQgaW50ICp2YWwpCit7CisJV0FSTl9PTkNFKDEsICJyZWdtYXAgQVBJIGlzIGRpc2FibGVkIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJlZ21hcCAqZGV2X2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKaW5kZXggOTM3MGU2NS4uYmJlMDNhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKQEAgLTIyOCwxMCArMjI4LDE0IEBACiAgKiAgICAgICAgICAgICAgICBvdXRwdXQgd2hlbiB1c2luZyByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcAogICogQGVuYWJsZV9yZWc6IFJlZ2lzdGVyIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIGVuYWJsZS9kaXNhYmxlIG9wcwogICogQGVuYWJsZV9tYXNrOiBNYXNrIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIGVuYWJsZS9kaXNhYmxlIG9wcworICogQGVuYWJsZV92YWw6IEVuYWJsaW5nIHZhbHVlIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIGVuYWJsZS9kaXNhYmxlIG9wcworICogQGRpc2FibGVfdmFsOiBEaXNhYmxpbmcgdmFsdWUgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgZW5hYmxlL2Rpc2FibGUgb3BzCiAgKiBAZW5hYmxlX2lzX2ludmVydGVkOiBBIGZsYWcgdG8gaW5kaWNhdGUgc2V0IGVuYWJsZV9tYXNrIGJpdHMgdG8gZGlzYWJsZQogICogICAgICAgICAgICAgICAgICAgICAgd2hlbiB1c2luZyByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCBhbmQgZnJpZW5kcyBBUElzLgogICogQGJ5cGFzc19yZWc6IFJlZ2lzdGVyIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIHNldF9ieXBhc3MKICAqIEBieXBhc3NfbWFzazogTWFzayBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBzZXRfYnlwYXNzCisgKiBAYnlwYXNzX3ZhbF9vbjogRW5hYmxpbmcgdmFsdWUgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgc2V0X2J5cGFzcworICogQGJ5cGFzc192YWxfb2ZmOiBEaXNhYmxpbmcgdmFsdWUgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgc2V0X2J5cGFzcwogICoKICAqIEBlbmFibGVfdGltZTogVGltZSB0YWtlbiBmb3IgaW5pdGlhbCBlbmFibGUgb2YgcmVndWxhdG9yIChpbiB1UykuCiAgKi8KQEAgLTI2Myw5ICsyNjcsMTMgQEAKIAl1bnNpZ25lZCBpbnQgYXBwbHlfYml0OwogCXVuc2lnbmVkIGludCBlbmFibGVfcmVnOwogCXVuc2lnbmVkIGludCBlbmFibGVfbWFzazsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlX3ZhbDsKKwl1bnNpZ25lZCBpbnQgZGlzYWJsZV92YWw7CiAJYm9vbCBlbmFibGVfaXNfaW52ZXJ0ZWQ7CiAJdW5zaWduZWQgaW50IGJ5cGFzc19yZWc7CiAJdW5zaWduZWQgaW50IGJ5cGFzc19tYXNrOworCXVuc2lnbmVkIGludCBieXBhc3NfdmFsX29uOworCXVuc2lnbmVkIGludCBieXBhc3NfdmFsX29mZjsKIAogCXVuc2lnbmVkIGludCBlbmFibGVfdGltZTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9wZnV6ZTEwMC5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvcGZ1emUxMDAuaAppbmRleCA2NWQ1NTBiLi4zNjRmN2E3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9wZnV6ZTEwMC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL3BmdXplMTAwLmgKQEAgLTM1LDYgKzM1LDIwIEBACiAjZGVmaW5lIFBGVVpFMTAwX1ZHRU42CQkxNAogI2RlZmluZSBQRlVaRTEwMF9NQVhfUkVHVUxBVE9SCTE1CiAKKyNkZWZpbmUgUEZVWkUyMDBfU1cxQUIJCTAKKyNkZWZpbmUgUEZVWkUyMDBfU1cyCQkxCisjZGVmaW5lIFBGVVpFMjAwX1NXM0EJCTIKKyNkZWZpbmUgUEZVWkUyMDBfU1czQgkJMworI2RlZmluZSBQRlVaRTIwMF9TV0JTVAkJNAorI2RlZmluZSBQRlVaRTIwMF9WU05WUwkJNQorI2RlZmluZSBQRlVaRTIwMF9WUkVGRERSCTYKKyNkZWZpbmUgUEZVWkUyMDBfVkdFTjEJCTcKKyNkZWZpbmUgUEZVWkUyMDBfVkdFTjIJCTgKKyNkZWZpbmUgUEZVWkUyMDBfVkdFTjMJCTkKKyNkZWZpbmUgUEZVWkUyMDBfVkdFTjQJCTEwCisjZGVmaW5lIFBGVVpFMjAwX1ZHRU41CQkxMQorI2RlZmluZSBQRlVaRTIwMF9WR0VONgkJMTIKKwogc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGE7CiAKIHN0cnVjdCBwZnV6ZV9yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oCmluZGV4IDFkYTY5M2QuLmI2NmMyMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcm1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcm1hcC5oCkBAIC0yNTAsOCArMjUwLDcgQEAKIAlpbnQgKCpybWFwX29uZSkoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZyk7CiAJaW50ICgqZG9uZSkoc3RydWN0IHBhZ2UgKnBhZ2UpOwotCWludCAoKmZpbGVfbm9ubGluZWFyKShzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAotCQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisJaW50ICgqZmlsZV9ub25saW5lYXIpKHN0cnVjdCBwYWdlICosIHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHZvaWQgKmFyZyk7CiAJc3RydWN0IGFub25fdm1hICooKmFub25fbG9jaykoc3RydWN0IHBhZ2UgKnBhZ2UpOwogCWJvb2wgKCppbnZhbGlkX3ZtYSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZvaWQgKmFyZyk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IGE3ODFkZWMuLjdjYjA3ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTMsNiArMyw4IEBACiAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L3NjaGVkLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9wcmlvLmg+CisKIAogc3RydWN0IHNjaGVkX3BhcmFtIHsKIAlpbnQgc2NoZWRfcHJpb3JpdHk7CkBAIC0yNyw3ICsyOSw3IEBACiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgpAQCAtMjkyLDEwICsyOTQsMTQgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX05PX0haX0NPTU1PTikKIGV4dGVybiB2b2lkIG5vaHpfYmFsYW5jZV9lbnRlcl9pZGxlKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgc2V0X2NwdV9zZF9zdGF0ZV9pZGxlKHZvaWQpOwotZXh0ZXJuIGludCBnZXRfbm9oel90aW1lcl90YXJnZXQodm9pZCk7CitleHRlcm4gaW50IGdldF9ub2h6X3RpbWVyX3RhcmdldChpbnQgcGlubmVkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgbm9oel9iYWxhbmNlX2VudGVyX2lkbGUoaW50IGNwdSkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9zZF9zdGF0ZV9pZGxlKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KGludCBwaW5uZWQpCit7CisJcmV0dXJuIHNtcF9wcm9jZXNzb3JfaWQoKTsKK30KICNlbmRpZgogCiAvKgpAQCAtMTA3Nyw2ICsxMDgzLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKKwlpbnQJCQlkZXB0aDsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5CSpwYXJlbnQ7CiAJLyogcnEgb24gd2hpY2ggdGhpcyBlbnRpdHkgaXMgKHRvIGJlKSBxdWV1ZWQ6ICovCiAJc3RydWN0IGNmc19ycQkJKmNmc19ycTsKQEAgLTE0NjAsNiArMTQ2Nyw5IEBACiAJc3RydWN0IG11dGV4IHBlcmZfZXZlbnRfbXV0ZXg7CiAJc3RydWN0IGxpc3RfaGVhZCBwZXJmX2V2ZW50X2xpc3Q7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCXVuc2lnbmVkIGxvbmcgcHJlZW1wdF9kaXNhYmxlX2lwOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX05VTUEKIAlzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3k7CS8qIFByb3RlY3RlZCBieSBhbGxvY19sb2NrICovCiAJc2hvcnQgaWxfbmV4dDsKQEAgLTE0NzAsOSArMTQ4MCwxMCBAQAogCXVuc2lnbmVkIGludCBudW1hX3NjYW5fcGVyaW9kOwogCXVuc2lnbmVkIGludCBudW1hX3NjYW5fcGVyaW9kX21heDsKIAlpbnQgbnVtYV9wcmVmZXJyZWRfbmlkOwotCWludCBudW1hX21pZ3JhdGVfZGVmZXJyZWQ7CiAJdW5zaWduZWQgbG9uZyBudW1hX21pZ3JhdGVfcmV0cnk7CiAJdTY0IG5vZGVfc3RhbXA7CQkJLyogbWlncmF0aW9uIHN0YW1wICAqLworCXU2NCBsYXN0X3Rhc2tfbnVtYV9wbGFjZW1lbnQ7CisJdTY0IGxhc3Rfc3VtX2V4ZWNfcnVudGltZTsKIAlzdHJ1Y3QgY2FsbGJhY2tfaGVhZCBudW1hX3dvcms7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIG51bWFfZW50cnk7CkBAIC0xNDgzLDE1ICsxNDk0LDIyIEBACiAJICogU2NoZWR1bGluZyBwbGFjZW1lbnQgZGVjaXNpb25zIGFyZSBtYWRlIGJhc2VkIG9uIHRoZSB0aGVzZSBjb3VudHMuCiAJICogVGhlIHZhbHVlcyByZW1haW4gc3RhdGljIGZvciB0aGUgZHVyYXRpb24gb2YgYSBQVEUgc2NhbgogCSAqLwotCXVuc2lnbmVkIGxvbmcgKm51bWFfZmF1bHRzOworCXVuc2lnbmVkIGxvbmcgKm51bWFfZmF1bHRzX21lbW9yeTsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX251bWFfZmF1bHRzOwogCiAJLyoKIAkgKiBudW1hX2ZhdWx0c19idWZmZXIgcmVjb3JkcyBmYXVsdHMgcGVyIG5vZGUgZHVyaW5nIHRoZSBjdXJyZW50Ci0JICogc2NhbiB3aW5kb3cuIFdoZW4gdGhlIHNjYW4gY29tcGxldGVzLCB0aGUgY291bnRzIGluIG51bWFfZmF1bHRzCi0JICogZGVjYXkgYW5kIHRoZXNlIHZhbHVlcyBhcmUgY29waWVkLgorCSAqIHNjYW4gd2luZG93LiBXaGVuIHRoZSBzY2FuIGNvbXBsZXRlcywgdGhlIGNvdW50cyBpbgorCSAqIG51bWFfZmF1bHRzX21lbW9yeSBkZWNheSBhbmQgdGhlc2UgdmFsdWVzIGFyZSBjb3BpZWQuCiAJICovCi0JdW5zaWduZWQgbG9uZyAqbnVtYV9mYXVsdHNfYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgKm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnk7CisKKwkvKgorCSAqIFRyYWNrIHRoZSBub2RlcyB0aGUgcHJvY2VzcyB3YXMgcnVubmluZyBvbiB3aGVuIGEgTlVNQSBoaW50aW5nCisJICogZmF1bHQgd2FzIGluY3VycmVkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgKm51bWFfZmF1bHRzX2NwdTsKKwl1bnNpZ25lZCBsb25nICpudW1hX2ZhdWx0c19idWZmZXJfY3B1OwogCiAJLyoKIAkgKiBudW1hX2ZhdWx0c19sb2NhbGl0eSB0cmFja3MgaWYgZmF1bHRzIHJlY29yZGVkIGR1cmluZyB0aGUgbGFzdApAQCAtMTU5Niw4ICsxNjE0LDggQEAKIGV4dGVybiBwaWRfdCB0YXNrX251bWFfZ3JvdXBfaWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIGV4dGVybiB2b2lkIHNldF9udW1hYmFsYW5jaW5nX3N0YXRlKGJvb2wgZW5hYmxlZCk7CiBleHRlcm4gdm9pZCB0YXNrX251bWFfZnJlZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwotCi1leHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9udW1hX2JhbGFuY2luZ19taWdyYXRlX2RlZmVycmVkOworZXh0ZXJuIGJvb2wgc2hvdWxkX251bWFfbWlncmF0ZV9tZW1vcnkoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJaW50IHNyY19uaWQsIGludCBkc3RfY3B1KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza19udW1hX2ZhdWx0KGludCBsYXN0X25vZGUsIGludCBub2RlLCBpbnQgcGFnZXMsCiAJCQkJICAgaW50IGZsYWdzKQpAQCAtMTYxMyw2ICsxNjMxLDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza19udW1hX2ZyZWUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogfQorc3RhdGljIGlubGluZSBib29sIHNob3VsZF9udW1hX21pZ3JhdGVfbWVtb3J5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHNyY19uaWQsIGludCBkc3RfY3B1KQoreworCXJldHVybiB0cnVlOworfQogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza19waWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMjA4MCw3ICsyMTAzLDE2IEBACiBleHRlcm4gYm9vbCB5aWVsZF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGJvb2wgcHJlZW1wdCk7CiBleHRlcm4gdm9pZCBzZXRfdXNlcl9uaWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgbG9uZyBuaWNlKTsKIGV4dGVybiBpbnQgdGFza19wcmlvKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7Ci1leHRlcm4gaW50IHRhc2tfbmljZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworLyoqCisgKiB0YXNrX25pY2UgLSByZXR1cm4gdGhlIG5pY2UgdmFsdWUgb2YgYSBnaXZlbiB0YXNrLgorICogQHA6IHRoZSB0YXNrIGluIHF1ZXN0aW9uLgorICoKKyAqIFJldHVybjogVGhlIG5pY2UgdmFsdWUgWyAtMjAgLi4uIDAgLi4uIDE5IF0uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRhc2tfbmljZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIFBSSU9fVE9fTklDRSgocCktPnN0YXRpY19wcmlvKTsKK30KIGV4dGVybiBpbnQgY2FuX25pY2UoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBpbnQgbmljZSk7CiBleHRlcm4gaW50IHRhc2tfY3Vycihjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIGludCBpZGxlX2NwdShpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvcHJpby5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9wcmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzMjI1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvcHJpby5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX1NDSEVEX1BSSU9fSAorI2RlZmluZSBfU0NIRURfUFJJT19ICisKKyNkZWZpbmUgTUFYX05JQ0UJMTkKKyNkZWZpbmUgTUlOX05JQ0UJLTIwCisjZGVmaW5lIE5JQ0VfV0lEVEgJKE1BWF9OSUNFIC0gTUlOX05JQ0UgKyAxKQorCisvKgorICogUHJpb3JpdHkgb2YgYSBwcm9jZXNzIGdvZXMgZnJvbSAwLi5NQVhfUFJJTy0xLCB2YWxpZCBSVAorICogcHJpb3JpdHkgaXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTC9TQ0hFRF9CQVRDSAorICogdGFza3MgYXJlIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkKKyAqIHZhbHVlcyBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5LgorICoKKyAqIFRoZSBNQVhfVVNFUl9SVF9QUklPIHZhbHVlIGFsbG93cyB0aGUgYWN0dWFsIG1heGltdW0KKyAqIFJUIHByaW9yaXR5IHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIHZhbHVlIGV4cG9ydGVkIHRvCisgKiB1c2VyLXNwYWNlLiAgVGhpcyBhbGxvd3Mga2VybmVsIHRocmVhZHMgdG8gc2V0IHRoZWlyCisgKiBwcmlvcml0eSB0byBhIHZhbHVlIGhpZ2hlciB0aGFuIGFueSB1c2VyIHRhc2suIE5vdGU6CisgKiBNQVhfUlRfUFJJTyBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gTUFYX1VTRVJfUlRfUFJJTy4KKyAqLworCisjZGVmaW5lIE1BWF9VU0VSX1JUX1BSSU8JMTAwCisjZGVmaW5lIE1BWF9SVF9QUklPCQlNQVhfVVNFUl9SVF9QUklPCisKKyNkZWZpbmUgTUFYX1BSSU8JCShNQVhfUlRfUFJJTyArIE5JQ0VfV0lEVEgpCisjZGVmaW5lIERFRkFVTFRfUFJJTwkJKE1BWF9SVF9QUklPICsgTklDRV9XSURUSCAvIDIpCisKKy8qCisgKiBDb252ZXJ0IHVzZXItbmljZSB2YWx1ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0KKyAqIHRvIHN0YXRpYyBwcmlvcml0eSBbIE1BWF9SVF9QUklPLi5NQVhfUFJJTy0xIF0sCisgKiBhbmQgYmFjay4KKyAqLworI2RlZmluZSBOSUNFX1RPX1BSSU8obmljZSkJKChuaWNlKSArIERFRkFVTFRfUFJJTykKKyNkZWZpbmUgUFJJT19UT19OSUNFKHByaW8pCSgocHJpbykgLSBERUZBVUxUX1BSSU8pCisKKy8qCisgKiAnVXNlciBwcmlvcml0eScgaXMgdGhlIG5pY2UgdmFsdWUgY29udmVydGVkIHRvIHNvbWV0aGluZyB3ZQorICogY2FuIHdvcmsgd2l0aCBiZXR0ZXIgd2hlbiBzY2FsaW5nIHZhcmlvdXMgc2NoZWR1bGVyIHBhcmFtZXRlcnMsCisgKiBpdCdzIGEgWyAwIC4uLiAzOSBdIHJhbmdlLgorICovCisjZGVmaW5lIFVTRVJfUFJJTyhwKQkJKChwKS1NQVhfUlRfUFJJTykKKyNkZWZpbmUgVEFTS19VU0VSX1BSSU8ocCkJVVNFUl9QUklPKChwKS0+c3RhdGljX3ByaW8pCisjZGVmaW5lIE1BWF9VU0VSX1BSSU8JCShVU0VSX1BSSU8oTUFYX1BSSU8pKQorCisjZW5kaWYgLyogX1NDSEVEX1BSSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC9ydC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9ydC5oCmluZGV4IDM0ZTRlYmUuLjYzNDFmNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3J0LmgKQEAgLTEsMjQgKzEsNyBAQAogI2lmbmRlZiBfU0NIRURfUlRfSAogI2RlZmluZSBfU0NIRURfUlRfSAogCi0vKgotICogUHJpb3JpdHkgb2YgYSBwcm9jZXNzIGdvZXMgZnJvbSAwLi5NQVhfUFJJTy0xLCB2YWxpZCBSVAotICogcHJpb3JpdHkgaXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTC9TQ0hFRF9CQVRDSAotICogdGFza3MgYXJlIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkKLSAqIHZhbHVlcyBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5LgotICoKLSAqIFRoZSBNQVhfVVNFUl9SVF9QUklPIHZhbHVlIGFsbG93cyB0aGUgYWN0dWFsIG1heGltdW0KLSAqIFJUIHByaW9yaXR5IHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIHZhbHVlIGV4cG9ydGVkIHRvCi0gKiB1c2VyLXNwYWNlLiAgVGhpcyBhbGxvd3Mga2VybmVsIHRocmVhZHMgdG8gc2V0IHRoZWlyCi0gKiBwcmlvcml0eSB0byBhIHZhbHVlIGhpZ2hlciB0aGFuIGFueSB1c2VyIHRhc2suIE5vdGU6Ci0gKiBNQVhfUlRfUFJJTyBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gTUFYX1VTRVJfUlRfUFJJTy4KLSAqLwotCi0jZGVmaW5lIE1BWF9VU0VSX1JUX1BSSU8JMTAwCi0jZGVmaW5lIE1BWF9SVF9QUklPCQlNQVhfVVNFUl9SVF9QUklPCi0KLSNkZWZpbmUgTUFYX1BSSU8JCShNQVhfUlRfUFJJTyArIDQwKQotI2RlZmluZSBERUZBVUxUX1BSSU8JCShNQVhfUlRfUFJJTyArIDIwKQorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3ByaW8uaD4KIAogc3RhdGljIGlubGluZSBpbnQgcnRfcHJpbyhpbnQgcHJpbykKIHsKQEAgLTM1LDYgKzE4LDcgQEAKICNpZmRlZiBDT05GSUdfUlRfTVVURVhFUwogZXh0ZXJuIGludCBydF9tdXRleF9nZXRwcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gdm9pZCBydF9tdXRleF9zZXRwcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHByaW8pOworZXh0ZXJuIGludCBydF9tdXRleF9jaGVja19wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG5ld3ByaW8pOwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqcnRfbXV0ZXhfZ2V0X3RvcF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiBleHRlcm4gdm9pZCBydF9tdXRleF9hZGp1c3RfcGkoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIHN0YXRpYyBpbmxpbmUgYm9vbCB0c2tfaXNfcGlfYmxvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKQEAgLTQ2LDYgKzMwLDEyIEBACiB7CiAJcmV0dXJuIHAtPm5vcm1hbF9wcmlvOwogfQorCitzdGF0aWMgaW5saW5lIGludCBydF9tdXRleF9jaGVja19wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG5ld3ByaW8pCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpydF9tdXRleF9nZXRfdG9wX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDU2MjNhN2YuLjJmYzQyZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTEwNDAsNiArMTA0MCw3IEBACiAgKglBbGxvY2F0ZSBhIHNlY3VyaXR5IHN0cnVjdHVyZSB0byB0aGUgeHAtPnNlY3VyaXR5IGZpZWxkOyB0aGUgc2VjdXJpdHkKICAqCWZpZWxkIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgd2hlbiB0aGUgeGZybV9wb2xpY3kgaXMgYWxsb2NhdGVkLgogICoJUmV0dXJuIDAgaWYgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIChtZW1vcnkgdG8gYWxsb2NhdGUsIGxlZ2FsIGNvbnRleHQpCisgKglAZ2ZwIGlzIHRvIHNwZWNpZnkgdGhlIGNvbnRleHQgZm9yIHRoZSBhbGxvY2F0aW9uCiAgKiBAeGZybV9wb2xpY3lfY2xvbmVfc2VjdXJpdHk6CiAgKglAb2xkX2N0eCBjb250YWlucyBhbiBleGlzdGluZyB4ZnJtX3NlY19jdHguCiAgKglAbmV3X2N0eHAgY29udGFpbnMgYSBuZXcgeGZybV9zZWNfY3R4IGJlaW5nIGNsb25lZCBmcm9tIG9sZC4KQEAgLTE2ODMsNyArMTY4NCw3IEBACiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiAJaW50ICgqeGZybV9wb2xpY3lfYWxsb2Nfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwKLQkJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCk7CisJCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgsIGdmcF90IGdmcCk7CiAJaW50ICgqeGZybV9wb2xpY3lfY2xvbmVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9zZWNfY3R4ICpvbGRfY3R4LCBzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqbmV3X2N0eCk7CiAJdm9pZCAoKnhmcm1fcG9saWN5X2ZyZWVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHgpOwogCWludCAoKnhmcm1fcG9saWN5X2RlbGV0ZV9zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eCk7CkBAIC0yODU5LDcgKzI4NjAsOCBAQAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogCi1pbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCk7CitpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsCisJCQkgICAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LCBnZnBfdCBnZnApOwogaW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2Nsb25lKHN0cnVjdCB4ZnJtX3NlY19jdHggKm9sZF9jdHgsIHN0cnVjdCB4ZnJtX3NlY19jdHggKipuZXdfY3R4cCk7CiB2b2lkIHNlY3VyaXR5X3hmcm1fcG9saWN5X2ZyZWUoc3RydWN0IHhmcm1fc2VjX2N0eCAqY3R4KTsKIGludCBzZWN1cml0eV94ZnJtX3BvbGljeV9kZWxldGUoc3RydWN0IHhmcm1fc2VjX2N0eCAqY3R4KTsKQEAgLTI4NzcsNyArMjg3OSw5IEBACiAKICNlbHNlCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0gKi8KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAorCQkJCQkgICAgIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwKKwkJCQkJICAgICBnZnBfdCBnZnApCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9iY202M3h4LmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9iY202M3h4LmgKaW5kZXggNTcwZTk2NC4uYTgwYWExYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfYmNtNjN4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2JjbTYzeHguaApAQCAtMTE2LDQgKzExNiw2IEBACiAJCQkJCVVBUlRfRklGT19QQVJFUlJfTUFTSyB8CQlcCiAJCQkJCVVBUlRfRklGT19CUktERVRfTUFTSykKIAorI2RlZmluZSBVQVJUX1JFR19TSVpFCQkJMjQKKwogI2VuZGlmIC8qIF9MSU5VWF9TRVJJQUxfQkNNNjNYWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCmluZGV4IDIyYjM2NDAuLjZjNWUzYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCkBAIC0xMCw0NSArMTAsNTkgQEAKIAogI2RlZmluZSBTQ0l4X05PVF9TVVBQT1JURUQJKC0xKQogCi0jZGVmaW5lIFNDU0NSX1RJRQkoMSA8PCA3KQotI2RlZmluZSBTQ1NDUl9SSUUJKDEgPDwgNikKLSNkZWZpbmUgU0NTQ1JfVEUJKDEgPDwgNSkKLSNkZWZpbmUgU0NTQ1JfUkUJKDEgPDwgNCkKLSNkZWZpbmUgU0NTQ1JfUkVJRQkoMSA8PCAzKQkvKiBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBwYXJ0cyAqLwotI2RlZmluZSBTQ1NDUl9UT0lFCSgxIDw8IDIpCS8qIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHBhcnRzICovCi0jZGVmaW5lIFNDU0NSX0NLRTEJKDEgPDwgMSkKLSNkZWZpbmUgU0NTQ1JfQ0tFMAkoMSA8PCAwKQorLyogU0NTTVIgKFNlcmlhbCBNb2RlIFJlZ2lzdGVyKSAqLworI2RlZmluZSBTQ1NNUl9DSFIJKDEgPDwgNikJLyogNy1iaXQgQ2hhcmFjdGVyIExlbmd0aCAqLworI2RlZmluZSBTQ1NNUl9QRQkoMSA8PCA1KQkvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIFNDU01SX09ERAkoMSA8PCA0KQkvKiBPZGQgUGFyaXR5ICovCisjZGVmaW5lIFNDU01SX1NUT1AJKDEgPDwgMykJLyogU3RvcCBCaXQgTGVuZ3RoICovCisjZGVmaW5lIFNDU01SX0NLUwkweDAwMDMJCS8qIENsb2NrIFNlbGVjdCAqLwogCi0vKiBTQ3hTUiBTQ0kgKi8KLSNkZWZpbmUgU0NJX1REUkUgIDB4ODAKLSNkZWZpbmUgU0NJX1JEUkYgIDB4NDAKLSNkZWZpbmUgU0NJX09SRVIgIDB4MjAKLSNkZWZpbmUgU0NJX0ZFUiAgIDB4MTAKLSNkZWZpbmUgU0NJX1BFUiAgIDB4MDgKLSNkZWZpbmUgU0NJX1RFTkQgIDB4MDQKKy8qIFNlcmlhbCBDb250cm9sIFJlZ2lzdGVyIChAID0gbm90IHN1cHBvcnRlZCBieSBhbGwgcGFydHMpICovCisjZGVmaW5lIFNDU0NSX1RJRQkoMSA8PCA3KQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFNDU0NSX1JJRQkoMSA8PCA2KQkvKiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfVEUJKDEgPDwgNSkJLyogVHJhbnNtaXQgRW5hYmxlICovCisjZGVmaW5lIFNDU0NSX1JFCSgxIDw8IDQpCS8qIFJlY2VpdmUgRW5hYmxlICovCisjZGVmaW5lIFNDU0NSX1JFSUUJKDEgPDwgMykJLyogUmVjZWl2ZSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEAgKi8KKyNkZWZpbmUgU0NTQ1JfVE9JRQkoMSA8PCAyKQkvKiBUaW1lb3V0IEludGVycnVwdCBFbmFibGUgQCAqLworI2RlZmluZSBTQ1NDUl9DS0UxCSgxIDw8IDEpCS8qIENsb2NrIEVuYWJsZSAxICovCisjZGVmaW5lIFNDU0NSX0NLRTAJKDEgPDwgMCkJLyogQ2xvY2sgRW5hYmxlIDAgKi8KKy8qIFNDSUZBL1NDSUZCIG9ubHkgKi8KKyNkZWZpbmUgU0NTQ1JfVERSUUUJKDEgPDwgMTUpCS8qIFR4IERhdGEgVHJhbnNmZXIgUmVxdWVzdCBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfUkRSUUUJKDEgPDwgMTQpCS8qIFJ4IERhdGEgVHJhbnNmZXIgUmVxdWVzdCBFbmFibGUgKi8KKworLyogU0N4U1IgKFNlcmlhbCBTdGF0dXMgUmVnaXN0ZXIpIG9uIFNDSSAqLworI2RlZmluZSBTQ0lfVERSRSAgMHg4MAkJCS8qIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgKi8KKyNkZWZpbmUgU0NJX1JEUkYgIDB4NDAJCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgRnVsbCAqLworI2RlZmluZSBTQ0lfT1JFUiAgMHgyMAkJCS8qIE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgU0NJX0ZFUiAgIDB4MTAJCQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFNDSV9QRVIgICAweDA4CQkJLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIFNDSV9URU5EICAweDA0CQkJLyogVHJhbnNtaXQgRW5kICovCiAKICNkZWZpbmUgU0NJX0RFRkFVTFRfRVJST1JfTUFTSyAoU0NJX1BFUiB8IFNDSV9GRVIpCiAKLS8qIFNDeFNSIFNDSUYsIEhTQ0lGICovCi0jZGVmaW5lIFNDSUZfRVIgICAgMHgwMDgwCi0jZGVmaW5lIFNDSUZfVEVORCAgMHgwMDQwCi0jZGVmaW5lIFNDSUZfVERGRSAgMHgwMDIwCi0jZGVmaW5lIFNDSUZfQlJLICAgMHgwMDEwCi0jZGVmaW5lIFNDSUZfRkVSICAgMHgwMDA4Ci0jZGVmaW5lIFNDSUZfUEVSICAgMHgwMDA0Ci0jZGVmaW5lIFNDSUZfUkRGICAgMHgwMDAyCi0jZGVmaW5lIFNDSUZfRFIgICAgMHgwMDAxCisvKiBTQ3hTUiAoU2VyaWFsIFN0YXR1cyBSZWdpc3Rlcikgb24gU0NJRiwgSFNDSUYgKi8KKyNkZWZpbmUgU0NJRl9FUiAgICAweDAwODAJCS8qIFJlY2VpdmUgRXJyb3IgKi8KKyNkZWZpbmUgU0NJRl9URU5EICAweDAwNDAJCS8qIFRyYW5zbWlzc2lvbiBFbmQgKi8KKyNkZWZpbmUgU0NJRl9UREZFICAweDAwMjAJCS8qIFRyYW5zbWl0IEZJRk8gRGF0YSBFbXB0eSAqLworI2RlZmluZSBTQ0lGX0JSSyAgIDB4MDAxMAkJLyogQnJlYWsgRGV0ZWN0ICovCisjZGVmaW5lIFNDSUZfRkVSICAgMHgwMDA4CQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFNDSUZfUEVSICAgMHgwMDA0CQkvKiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgU0NJRl9SREYgICAweDAwMDIJCS8qIFJlY2VpdmUgRklGTyBEYXRhIEZ1bGwgKi8KKyNkZWZpbmUgU0NJRl9EUiAgICAweDAwMDEJCS8qIFJlY2VpdmUgRGF0YSBSZWFkeSAqLwogCiAjZGVmaW5lIFNDSUZfREVGQVVMVF9FUlJPUl9NQVNLIChTQ0lGX1BFUiB8IFNDSUZfRkVSIHwgU0NJRl9FUiB8IFNDSUZfQlJLKQogCi0vKiBTQ1NQVFIsIG9wdGlvbmFsICovCi0jZGVmaW5lIFNDU1BUUl9SVFNJTwkoMSA8PCA3KQotI2RlZmluZSBTQ1NQVFJfQ1RTSU8JKDEgPDwgNSkKLSNkZWZpbmUgU0NTUFRSX1NQQjJJTwkoMSA8PCAxKQotI2RlZmluZSBTQ1NQVFJfU1BCMkRUCSgxIDw8IDApCisvKiBTQ0ZDUiAoRklGTyBDb250cm9sIFJlZ2lzdGVyKSAqLworI2RlZmluZSBTQ0ZDUl9MT09QCSgxIDw8IDApCS8qIExvb3BiYWNrIFRlc3QgKi8KKworLyogU0NTUFRSIChTZXJpYWwgUG9ydCBSZWdpc3RlciksIG9wdGlvbmFsICovCisjZGVmaW5lIFNDU1BUUl9SVFNJTwkoMSA8PCA3KQkvKiBTZXJpYWwgUG9ydCBSVFMgUGluIElucHV0L091dHB1dCAqLworI2RlZmluZSBTQ1NQVFJfQ1RTSU8JKDEgPDwgNSkJLyogU2VyaWFsIFBvcnQgQ1RTIFBpbiBJbnB1dC9PdXRwdXQgKi8KKyNkZWZpbmUgU0NTUFRSX1NQQjJJTwkoMSA8PCAxKQkvKiBTZXJpYWwgUG9ydCBCcmVhayBJbnB1dC9PdXRwdXQgKi8KKyNkZWZpbmUgU0NTUFRSX1NQQjJEVAkoMSA8PCAwKQkvKiBTZXJpYWwgUG9ydCBCcmVhayBEYXRhICovCiAKIC8qIEhTU1JSIEhTQ0lGICovCi0jZGVmaW5lIEhTQ0lGX1NSRQkweDgwMDAKKyNkZWZpbmUgSFNDSUZfU1JFCTB4ODAwMAkJLyogU2FtcGxpbmcgUmF0ZSBSZWdpc3RlciBFbmFibGUgKi8KIAogZW51bSB7CiAJU0NJeF9QUk9CRV9SRUdUWVBFLApAQCAtNzMsMTAgKzg3LDE5IEBACiAgKiBOb3QgYWxsIHJlZ2lzdGVycyB3aWxsIGV4aXN0IG9uIGFsbCBwYXJ0cy4KICAqLwogZW51bSB7Ci0JU0NTTVIsIFNDQlJSLCBTQ1NDUiwgU0N4U1IsCi0JU0NGQ1IsIFNDRkRSLCBTQ3hURFIsIFNDeFJEUiwKLQlTQ0xTUiwgU0NURkRSLCBTQ1JGRFIsIFNDU1BUUiwKLQlIU1NSUiwKKwlTQ1NNUiwJCQkJLyogU2VyaWFsIE1vZGUgUmVnaXN0ZXIgKi8KKwlTQ0JSUiwJCQkJLyogQml0IFJhdGUgUmVnaXN0ZXIgKi8KKwlTQ1NDUiwJCQkJLyogU2VyaWFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTQ3hTUiwJCQkJLyogU2VyaWFsIFN0YXR1cyBSZWdpc3RlciAqLworCVNDRkNSLAkJCQkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTQ0ZEUiwJCQkJLyogRklGTyBEYXRhIENvdW50IFJlZ2lzdGVyICovCisJU0N4VERSLAkJCQkvKiBUcmFuc21pdCAoRklGTykgRGF0YSBSZWdpc3RlciAqLworCVNDeFJEUiwJCQkJLyogUmVjZWl2ZSAoRklGTykgRGF0YSBSZWdpc3RlciAqLworCVNDTFNSLAkJCQkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAqLworCVNDVEZEUiwJCQkJLyogVHJhbnNtaXQgRklGTyBEYXRhIENvdW50IFJlZ2lzdGVyICovCisJU0NSRkRSLAkJCQkvKiBSZWNlaXZlIEZJRk8gRGF0YSBDb3VudCBSZWdpc3RlciAqLworCVNDU1BUUiwJCQkJLyogU2VyaWFsIFBvcnQgUmVnaXN0ZXIgKi8KKwlIU1NSUiwJCQkJLyogU2FtcGxpbmcgUmF0ZSBSZWdpc3RlciAqLwogCiAJU0NJeF9OUl9SRUdTLAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IDVlMWU2ZjIuLjE1ZWRlNmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMjQ1MSw4ICsyNDUxLDggQEAKIAkJICAgIHVuc2lnbmVkIGludCBmbGFncyk7CiB2b2lkIHNrYl9jb3B5X2FuZF9jc3VtX2Rldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqdG8pOwogdW5zaWduZWQgaW50IHNrYl96ZXJvY29weV9oZWFkbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpmcm9tKTsKLXZvaWQgc2tiX3plcm9jb3B5KHN0cnVjdCBza19idWZmICp0bywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKmZyb20sCi0JCSAgaW50IGxlbiwgaW50IGhsZW4pOworaW50IHNrYl96ZXJvY29weShzdHJ1Y3Qgc2tfYnVmZiAqdG8sIHN0cnVjdCBza19idWZmICpmcm9tLAorCQkgaW50IGxlbiwgaW50IGhsZW4pOwogdm9pZCBza2Jfc3BsaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNrX2J1ZmYgKnNrYjEsIGNvbnN0IHUzMiBsZW4pOwogaW50IHNrYl9zaGlmdChzdHJ1Y3Qgc2tfYnVmZiAqdGd0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc2hpZnRsZW4pOwogdm9pZCBza2Jfc2NydWJfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgeG5ldCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NtcC5oIGIvaW5jbHVkZS9saW51eC9zbXAuaAppbmRleCA2YWUwMDRlLi42MzNmNWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc21wLmgKQEAgLTE3LDEwICsxNyw3IEBACiAKIHR5cGVkZWYgdm9pZCAoKnNtcF9jYWxsX2Z1bmNfdCkodm9pZCAqaW5mbyk7CiBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JCXN0cnVjdCBsbGlzdF9ub2RlIGxsaXN0OwotCX07CisJc3RydWN0IGxsaXN0X25vZGUgbGxpc3Q7CiAJc21wX2NhbGxfZnVuY190IGZ1bmM7CiAJdm9pZCAqaW5mbzsKIAl1MTYgZmxhZ3M7CkBAIC01Myw4ICs1MCw3IEBACiAJCXNtcF9jYWxsX2Z1bmNfdCBmdW5jLCB2b2lkICppbmZvLCBib29sIHdhaXQsCiAJCWdmcF90IGdmcF9mbGFncyk7CiAKLXZvaWQgX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdWlkLCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqZGF0YSwKLQkJCQlpbnQgd2FpdCk7CitpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGludCBjcHUsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCmluZGV4IDQyMDNjNjYuLjM2Yzg2ZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworc3RydWN0IGRtYV9jaGFuOwogCiAvKgogICogSU5URVJGQUNFUyBiZXR3ZWVuIFNQSSBtYXN0ZXItc2lkZSBkcml2ZXJzIGFuZCBTUEkgaW5mcmFzdHJ1Y3R1cmUuCkBAIC0yNjYsNiArMjY5LDcgQEAKICAqIEBhdXRvX3J1bnRpbWVfcG06IHRoZSBjb3JlIHNob3VsZCBlbnN1cmUgYSBydW50aW1lIFBNIHJlZmVyZW5jZSBpcyBoZWxkCiAgKiAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgaGFyZHdhcmUgaXMgcHJlcGFyZWQsIHVzaW5nIHRoZSBwYXJlbnQKICAqICAgICAgICAgICAgICAgICAgIGRldmljZSBmb3IgdGhlIHNwaWRldgorICogQG1heF9kbWFfbGVuOiBNYXhpbXVtIGxlbmd0aCBvZiBhIERNQSB0cmFuc2ZlciBmb3IgdGhlIGRldmljZS4KICAqIEBwcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlOiBhIG1lc3NhZ2Ugd2lsbCBzb29uIGFycml2ZSBmcm9tIHRoZSBxdWV1ZQogICoJc28gdGhlIHN1YnN5c3RlbSByZXF1ZXN0cyB0aGUgZHJpdmVyIHRvIHByZXBhcmUgdGhlIHRyYW5zZmVyIGhhcmR3YXJlCiAgKglieSBpc3N1aW5nIHRoaXMgY2FsbApAQCAtMzQ4LDYgKzM1Miw4IEBACiAjZGVmaW5lIFNQSV9NQVNURVJfSEFMRl9EVVBMRVgJQklUKDApCQkvKiBjYW4ndCBkbyBmdWxsIGR1cGxleCAqLwogI2RlZmluZSBTUElfTUFTVEVSX05PX1JYCUJJVCgxKQkJLyogY2FuJ3QgZG8gYnVmZmVyIHJlYWQgKi8KICNkZWZpbmUgU1BJX01BU1RFUl9OT19UWAlCSVQoMikJCS8qIGNhbid0IGRvIGJ1ZmZlciB3cml0ZSAqLworI2RlZmluZSBTUElfTUFTVEVSX01VU1RfUlggICAgICBCSVQoMykJCS8qIHJlcXVpcmVzIHJ4ICovCisjZGVmaW5lIFNQSV9NQVNURVJfTVVTVF9UWCAgICAgIEJJVCg0KQkJLyogcmVxdWlyZXMgdHggKi8KIAogCS8qIGxvY2sgYW5kIG11dGV4IGZvciBTUEkgYnVzIGxvY2tpbmcgKi8KIAlzcGlubG9ja190CQlidXNfbG9ja19zcGlubG9jazsKQEAgLTM5MCw2ICszOTYsMTcgQEAKIAl2b2lkCQkJKCpjbGVhbnVwKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKIAogCS8qCisJICogVXNlZCB0byBlbmFibGUgY29yZSBzdXBwb3J0IGZvciBETUEgaGFuZGxpbmcsIGlmIGNhbl9kbWEoKQorCSAqIGV4aXN0cyBhbmQgcmV0dXJucyB0cnVlIHRoZW4gdGhlIHRyYW5zZmVyIHdpbGwgYmUgbWFwcGVkCisJICogcHJpb3IgdG8gdHJhbnNmZXJfb25lKCkgYmVpbmcgY2FsbGVkLiAgVGhlIGRyaXZlciBzaG91bGQKKwkgKiBub3QgbW9kaWZ5IG9yIHN0b3JlIHhmZXIgYW5kIGRtYV90eCBhbmQgZG1hX3J4IG11c3QgYmUgc2V0CisJICogd2hpbGUgdGhlIGRldmljZSBpcyBwcmVwYXJlZC4KKwkgKi8KKwlib29sCQkJKCpjYW5fZG1hKShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCQkgICBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQkgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKTsKKworCS8qCiAJICogVGhlc2UgaG9va3MgYXJlIGZvciBkcml2ZXJzIHRoYXQgd2FudCB0byB1c2UgdGhlIGdlbmVyaWMKIAkgKiBtYXN0ZXIgdHJhbnNmZXIgcXVldWVpbmcgbWVjaGFuaXNtLiBJZiB0aGVzZSBhcmUgdXNlZCwgdGhlCiAJICogdHJhbnNmZXIoKSBmdW5jdGlvbiBhYm92ZSBtdXN0IE5PVCBiZSBzcGVjaWZpZWQgYnkgdGhlIGRyaXZlci4KQEAgLTQwNyw3ICs0MjQsOSBAQAogCWJvb2wJCQkJcnQ7CiAJYm9vbAkJCQlhdXRvX3J1bnRpbWVfcG07CiAJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbXNnX3ByZXBhcmVkOworCWJvb2wJCQkJY3VyX21zZ19tYXBwZWQ7CiAJc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICAgICB4ZmVyX2NvbXBsZXRpb247CisJc2l6ZV90CQkJCW1heF9kbWFfbGVuOwogCiAJaW50ICgqcHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CiAJaW50ICgqdHJhbnNmZXJfb25lX21lc3NhZ2UpKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCkBAIC00MjgsNiArNDQ3LDE0IEBACiAKIAkvKiBncGlvIGNoaXAgc2VsZWN0ICovCiAJaW50CQkJKmNzX2dwaW9zOworCisJLyogRE1BIGNoYW5uZWxzIGZvciB1c2Ugd2l0aCBjb3JlIGRtYWVuZ2luZSBoZWxwZXJzICovCisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3R4OworCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV9yeDsKKworCS8qIGR1bW15IGRhdGEgZm9yIGZ1bGwgZHVwbGV4IGRldmljZXMgKi8KKwl2b2lkCQkJKmR1bW15X3J4OworCXZvaWQJCQkqZHVtbXlfdHg7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKnNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKQEAgLTUxMiw2ICs1MzksOCBAQAogICoJKG9wdGlvbmFsbHkpIGNoYW5naW5nIHRoZSBjaGlwc2VsZWN0IHN0YXR1cywgdGhlbiBzdGFydGluZwogICoJdGhlIG5leHQgdHJhbnNmZXIgb3IgY29tcGxldGluZyB0aGlzIEBzcGlfbWVzc2FnZS4KICAqIEB0cmFuc2Zlcl9saXN0OiB0cmFuc2ZlcnMgYXJlIHNlcXVlbmNlZCB0aHJvdWdoIEBzcGlfbWVzc2FnZS50cmFuc2ZlcnMKKyAqIEB0eF9zZzogU2NhdHRlcmxpc3QgZm9yIHRyYW5zbWl0LCBjdXJyZW50bHkgbm90IGZvciBjbGllbnQgdXNlCisgKiBAcnhfc2c6IFNjYXR0ZXJsaXN0IGZvciByZWNlaXZlLCBjdXJyZW50bHkgbm90IGZvciBjbGllbnQgdXNlCiAgKgogICogU1BJIHRyYW5zZmVycyBhbHdheXMgd3JpdGUgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZXkgcmVhZC4KICAqIFByb3RvY29sIGRyaXZlcnMgc2hvdWxkIGFsd2F5cyBwcm92aWRlIEByeF9idWYgYW5kL29yIEB0eF9idWYuCkBAIC01NzksNiArNjA4LDggQEAKIAogCWRtYV9hZGRyX3QJdHhfZG1hOwogCWRtYV9hZGRyX3QJcnhfZG1hOworCXN0cnVjdCBzZ190YWJsZSB0eF9zZzsKKwlzdHJ1Y3Qgc2dfdGFibGUgcnhfc2c7CiAKIAl1bnNpZ25lZAljc19jaGFuZ2U6MTsKIAl1bnNpZ25lZAl0eF9uYml0czozOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKaW5kZXggZGFlYmFiYS4uODU1NzhkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCkBAIC00Miw2ICs0Miw2IEBACiAKIC8qIHN0YXJ0IG9yIHN0b3AgcXVldWUgcHJvY2Vzc2luZyAqLwogZXh0ZXJuIGludCBzcGlfYml0YmFuZ19zdGFydChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7Ci1leHRlcm4gaW50IHNwaV9iaXRiYW5nX3N0b3Aoc3RydWN0IHNwaV9iaXRiYW5nICpzcGkpOworZXh0ZXJuIHZvaWQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7CiAKICNlbmRpZgkvKiBfX1NQSV9CSVRCQU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BtaS5oIGIvaW5jbHVkZS9saW51eC9zcG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNWVhYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BtaS5oCkBAIC0wLDAgKzEsMTkxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfTElOVVhfU1BNSV9ICisjZGVmaW5lIF9MSU5VWF9TUE1JX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisKKy8qIE1heGltdW0gc2xhdmUgaWRlbnRpZmllciAqLworI2RlZmluZSBTUE1JX01BWF9TTEFWRV9JRAkJMTYKKworLyogU1BNSSBDb21tYW5kcyAqLworI2RlZmluZSBTUE1JX0NNRF9FWFRfV1JJVEUJCTB4MDAKKyNkZWZpbmUgU1BNSV9DTURfUkVTRVQJCQkweDEwCisjZGVmaW5lIFNQTUlfQ01EX1NMRUVQCQkJMHgxMQorI2RlZmluZSBTUE1JX0NNRF9TSFVURE9XTgkJMHgxMgorI2RlZmluZSBTUE1JX0NNRF9XQUtFVVAJCQkweDEzCisjZGVmaW5lIFNQTUlfQ01EX0FVVEhFTlRJQ0FURQkJMHgxNAorI2RlZmluZSBTUE1JX0NNRF9NU1RSX1JFQUQJCTB4MTUKKyNkZWZpbmUgU1BNSV9DTURfTVNUUl9XUklURQkJMHgxNgorI2RlZmluZSBTUE1JX0NNRF9UUkFOU0ZFUl9CVVNfT1dORVJTSElQCTB4MUEKKyNkZWZpbmUgU1BNSV9DTURfRERCX01BU1RFUl9SRUFECTB4MUIKKyNkZWZpbmUgU1BNSV9DTURfRERCX1NMQVZFX1JFQUQJCTB4MUMKKyNkZWZpbmUgU1BNSV9DTURfRVhUX1JFQUQJCTB4MjAKKyNkZWZpbmUgU1BNSV9DTURfRVhUX1dSSVRFTAkJMHgzMAorI2RlZmluZSBTUE1JX0NNRF9FWFRfUkVBREwJCTB4MzgKKyNkZWZpbmUgU1BNSV9DTURfV1JJVEUJCQkweDQwCisjZGVmaW5lIFNQTUlfQ01EX1JFQUQJCQkweDYwCisjZGVmaW5lIFNQTUlfQ01EX1pFUk9fV1JJVEUJCTB4ODAKKworLyoqCisgKiBzdHJ1Y3Qgc3BtaV9kZXZpY2UgLSBCYXNpYyByZXByZXNlbnRhdGlvbiBvZiBhbiBTUE1JIGRldmljZQorICogQGRldjoJRHJpdmVyIG1vZGVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UuCisgKiBAY3RybDoJU1BNSSBjb250cm9sbGVyIG1hbmFnaW5nIHRoZSBidXMgaG9zdGluZyB0aGlzIGRldmljZS4KKyAqIEB1c2lkOglUaGlzIGRldmljZXMnIFVuaXF1ZSBTbGF2ZSBJRGVudGlmaWVyLgorICovCitzdHJ1Y3Qgc3BtaV9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyCSpjdHJsOworCXU4CQkJdXNpZDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwbWlfZGV2aWNlICp0b19zcG1pX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkKQoreworCXJldHVybiBjb250YWluZXJfb2YoZCwgc3RydWN0IHNwbWlfZGV2aWNlLCBkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnNwbWlfZGV2aWNlX2dldF9kcnZkYXRhKGNvbnN0IHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZzZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BtaV9kZXZpY2Vfc2V0X2RydmRhdGEoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB2b2lkICpkYXRhKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+ZGV2LCBkYXRhKTsKK30KKworc3RydWN0IHNwbWlfZGV2aWNlICpzcG1pX2RldmljZV9hbGxvYyhzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNwbWlfZGV2aWNlX3B1dChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHNkZXYpCisJCXB1dF9kZXZpY2UoJnNkZXYtPmRldik7Cit9CisKK2ludCBzcG1pX2RldmljZV9hZGQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KTsKKwordm9pZCBzcG1pX2RldmljZV9yZW1vdmUoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KTsKKworLyoqCisgKiBzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyIC0gaW50ZXJmYWNlIHRvIHRoZSBTUE1JIG1hc3RlciBjb250cm9sbGVyCisgKiBAZGV2OglEcml2ZXIgbW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZS4KKyAqIEBucjoJCWJvYXJkLXNwZWNpZmljIG51bWJlciBpZGVudGlmaWVyIGZvciB0aGlzIGNvbnRyb2xsZXIvYnVzCisgKiBAY21kOglzZW5kcyBhIG5vbi1kYXRhIGNvbW1hbmQgc2VxdWVuY2Ugb24gdGhlIFNQTUkgYnVzLgorICogQHJlYWRfY21kOglzZW5kcyBhIHJlZ2lzdGVyIHJlYWQgY29tbWFuZCBzZXF1ZW5jZSBvbiB0aGUgU1BNSSBidXMuCisgKiBAd3JpdGVfY21kOglzZW5kcyBhIHJlZ2lzdGVyIHdyaXRlIGNvbW1hbmQgc2VxdWVuY2Ugb24gdGhlIFNQTUkgYnVzLgorICovCitzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgZGV2aWNlCQlkZXY7CisJdW5zaWduZWQgaW50CQlucjsKKwlpbnQJKCpjbWQpKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsIHU4IG9wY29kZSwgdTggc2lkKTsKKwlpbnQJKCpyZWFkX2NtZCkoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLAorCQkJICAgIHU4IHNpZCwgdTE2IGFkZHIsIHU4ICpidWYsIHNpemVfdCBsZW4pOworCWludAkoKndyaXRlX2NtZCkoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLAorCQkJICAgICB1OCBzaWQsIHUxNiBhZGRyLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwbWlfY29udHJvbGxlciAqdG9fc3BtaV9jb250cm9sbGVyKHN0cnVjdCBkZXZpY2UgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyLCBkZXYpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkICpzcG1pX2NvbnRyb2xsZXJfZ2V0X2RydmRhdGEoY29uc3Qgc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZjdHJsLT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BtaV9jb250cm9sbGVyX3NldF9kcnZkYXRhKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsCisJCQkJCSAgICAgICB2b2lkICpkYXRhKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmY3RybC0+ZGV2LCBkYXRhKTsKK30KKworc3RydWN0IHNwbWlfY29udHJvbGxlciAqc3BtaV9jb250cm9sbGVyX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCQkJICAgICAgc2l6ZV90IHNpemUpOworCisvKioKKyAqIHNwbWlfY29udHJvbGxlcl9wdXQoKSAtIGRlY3JlbWVudCBjb250cm9sbGVyIHJlZmNvdW50CisgKiBAY3RybAlTUE1JIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcG1pX2NvbnRyb2xsZXJfcHV0KHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpCit7CisJaWYgKGN0cmwpCisJCXB1dF9kZXZpY2UoJmN0cmwtPmRldik7Cit9CisKK2ludCBzcG1pX2NvbnRyb2xsZXJfYWRkKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpOwordm9pZCBzcG1pX2NvbnRyb2xsZXJfcmVtb3ZlKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpOworCisvKioKKyAqIHN0cnVjdCBzcG1pX2RyaXZlciAtIFNQTUkgc2xhdmUgZGV2aWNlIGRyaXZlcgorICogQGRyaXZlcjoJU1BNSSBkZXZpY2UgZHJpdmVycyBzaG91bGQgaW5pdGlhbGl6ZSBuYW1lIGFuZCBvd25lciBmaWVsZCBvZgorICoJCXRoaXMgc3RydWN0dXJlLgorICogQHByb2JlOgliaW5kcyB0aGlzIGRyaXZlciB0byBhIFNQTUkgZGV2aWNlLgorICogQHJlbW92ZToJdW5iaW5kcyB0aGlzIGRyaXZlciBmcm9tIHRoZSBTUE1JIGRldmljZS4KKyAqIEBzaHV0ZG93bjoJc3RhbmRhcmQgc2h1dGRvd24gY2FsbGJhY2sgdXNlZCBkdXJpbmcgcG93ZXJkb3duL2hhbHQuCisgKiBAc3VzcGVuZDoJc3RhbmRhcmQgc3VzcGVuZCBjYWxsYmFjayB1c2VkIGR1cmluZyBzeXN0ZW0gc3VzcGVuZC4KKyAqIEByZXN1bWU6CXN0YW5kYXJkIHJlc3VtZSBjYWxsYmFjayB1c2VkIGR1cmluZyBzeXN0ZW0gcmVzdW1lLgorICoKKyAqIElmIFBNIHJ1bnRpbWUgc3VwcG9ydCBpcyBkZXNpcmVkIGZvciBhIHNsYXZlLCBhIGRldmljZSBkcml2ZXIgY2FuIGNhbGwKKyAqIHBtX3J1bnRpbWVfcHV0KCkgZnJvbSB0aGVpciBwcm9iZSgpIHJvdXRpbmUgKGFuZCBhIGJhbGFuY2luZworICogcG1fcnVudGltZV9nZXQoKSBpbiByZW1vdmUoKSkuICBQTSBydW50aW1lIHN1cHBvcnQgZm9yIGEgc2xhdmUgaXMKKyAqIGltcGxlbWVudGVkIGJ5IGlzc3VpbmcgYSBTTEVFUCBjb21tYW5kIHRvIHRoZSBzbGF2ZSBvbiBydW50aW1lX3N1c3BlbmQoKSwKKyAqIHRyYW5zaXRpb25pbmcgdGhlIHNsYXZlIGludG8gdGhlIFNMRUVQIHN0YXRlLiAgT24gcnVudGltZV9yZXN1bWUoKSwgYSBXQUtFVVAKKyAqIGNvbW1hbmQgaXMgc2VudCB0byB0aGUgc2xhdmUgdG8gYnJpbmcgaXQgYmFjayB0byBBQ1RJVkUuCisgKi8KK3N0cnVjdCBzcG1pX2RyaXZlciB7CisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworCWludAkoKnByb2JlKShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCXZvaWQJKCpyZW1vdmUpKHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcG1pX2RyaXZlciAqdG9fc3BtaV9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc3BtaV9kcml2ZXIsIGRyaXZlcik7Cit9CisKK2ludCBzcG1pX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3Qgc3BtaV9kcml2ZXIgKnNkcnYpOworCisvKioKKyAqIHNwbWlfZHJpdmVyX3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYW4gU1BNSSBjbGllbnQgZHJpdmVyCisgKiBAc2RydjoJdGhlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcG1pX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBzcG1pX2RyaXZlciAqc2RydikKK3sKKwlpZiAoc2RydikKKwkJZHJpdmVyX3VucmVnaXN0ZXIoJnNkcnYtPmRyaXZlcik7Cit9CisKKyNkZWZpbmUgbW9kdWxlX3NwbWlfZHJpdmVyKF9fc3BtaV9kcml2ZXIpIFwKKwltb2R1bGVfZHJpdmVyKF9fc3BtaV9kcml2ZXIsIHNwbWlfZHJpdmVyX3JlZ2lzdGVyLCBcCisJCQlzcG1pX2RyaXZlcl91bnJlZ2lzdGVyKQorCitpbnQgc3BtaV9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggYWRkciwgdTggKmJ1Zik7CitpbnQgc3BtaV9leHRfcmVnaXN0ZXJfcmVhZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4ICpidWYsCisJCQkgICBzaXplX3QgbGVuKTsKK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkbChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHUxNiBhZGRyLCB1OCAqYnVmLAorCQkJICAgIHNpemVfdCBsZW4pOworaW50IHNwbWlfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCBkYXRhKTsKK2ludCBzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBkYXRhKTsKK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsCisJCQkgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQgc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGVsKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTE2IGFkZHIsCisJCQkgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOworaW50IHNwbWlfY29tbWFuZF9yZXNldChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworaW50IHNwbWlfY29tbWFuZF9zbGVlcChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworaW50IHNwbWlfY29tbWFuZF93YWtldXAoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KTsKK2ludCBzcG1pX2NvbW1hbmRfc2h1dGRvd24oc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NyY3UuaCBiL2luY2x1ZGUvbGludXgvc3JjdS5oCmluZGV4IDliMDU4ZWUuLmEyNzgzY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3JjdS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3JjdS5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNgogICogQ29weXJpZ2h0IChDKSBGdWppdHN1LCAyMDEyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKaW5kZXggYTc0N2E3Ny4uMWU2N2I3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaApAQCAtOTgsNiArOTgsOCBAQAogI2RlZmluZSBfX01BUChuLC4uLikgX19NQVAjI24oX19WQV9BUkdTX18pCiAKICNkZWZpbmUgX19TQ19ERUNMKHQsIGEpCXQgYQorI2RlZmluZSBfX1RZUEVfSVNfTCh0KQkoX19zYW1lX3R5cGUoKHQpMCwgMEwpKQorI2RlZmluZSBfX1RZUEVfSVNfVUwodCkJKF9fc2FtZV90eXBlKCh0KTAsIDBVTCkpCiAjZGVmaW5lIF9fVFlQRV9JU19MTCh0KSAoX19zYW1lX3R5cGUoKHQpMCwgMExMKSB8fCBfX3NhbWVfdHlwZSgodCkwLCAwVUxMKSkKICNkZWZpbmUgX19TQ19MT05HKHQsIGEpIF9fdHlwZW9mKF9fYnVpbHRpbl9jaG9vc2VfZXhwcihfX1RZUEVfSVNfTEwodCksIDBMTCwgMEwpKSBhCiAjZGVmaW5lIF9fU0NfQ0FTVCh0LCBhKQkodCkgYQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNmcy5oIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCmluZGV4IDMwYjJlYmUuLmUwYmYyMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKQEAgLTE5OCw2ICsxOTgsNyBAQAogCQkJCSAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgdW1vZGVfdCBtb2RlKTsKIHZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGVfbnMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkgIGNvbnN0IHZvaWQgKm5zKTsKK2Jvb2wgc3lzZnNfcmVtb3ZlX2ZpbGVfc2VsZihzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cik7CiB2b2lkIHN5c2ZzX3JlbW92ZV9maWxlcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHIpOwogCiBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKQEAgLTI0Niw2ICsyNDcsMTEgQEAKIAogaW50IF9fbXVzdF9jaGVjayBzeXNmc19pbml0KHZvaWQpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfZW5hYmxlX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJcmV0dXJuIGtlcm5mc19lbmFibGVfbnMoa24pOworfQorCiAjZWxzZSAvKiBDT05GSUdfU1lTRlMgKi8KIAogc3RhdGljIGlubGluZSBpbnQgc3lzZnNfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IGtvYmplY3QgKmtvYmosCkBAIC0zMDEsNiArMzA3LDEyIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeXNmc19yZW1vdmVfZmlsZV9zZWxmKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIpCit7CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHIpCiB7CkBAIC00MTgsNiArNDMwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19lbmFibGVfbnMoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKK30KKwogI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgc3lzZnNfY3JlYXRlX2ZpbGUoc3RydWN0IGtvYmplY3QgKmtvYmosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaCBiL2luY2x1ZGUvbGludXgvdG9ydHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTJiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvbW1vbiBmdW5jdGlvbnMgZm9yIGluLWtlcm5lbCB0b3J0dXJlIHRlc3RzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMTQKKyAqCisgKiBBdXRob3I6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorICovCisKKyNpZm5kZWYgX19MSU5VWF9UT1JUVVJFX0gKKyNkZWZpbmUgX19MSU5VWF9UT1JUVVJFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdvYmplY3RzLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworLyogRGVmaW5pdGlvbnMgZm9yIGEgbm9uLXN0cmluZyB0b3J0dXJlLXRlc3QgbW9kdWxlIHBhcmFtZXRlci4gKi8KKyNkZWZpbmUgdG9ydHVyZV9wYXJhbSh0eXBlLCBuYW1lLCBpbml0LCBtc2cpIFwKKwlzdGF0aWMgdHlwZSBuYW1lID0gaW5pdDsgXAorCW1vZHVsZV9wYXJhbShuYW1lLCB0eXBlLCAwNDQ0KTsgXAorCU1PRFVMRV9QQVJNX0RFU0MobmFtZSwgbXNnKTsKKworI2RlZmluZSBUT1JUVVJFX0ZMQUcgIi10b3J0dXJlOiIKKyNkZWZpbmUgVE9ST1VUX1NUUklORyhzKSBcCisJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcgcyAiXG4iLCB0b3J0dXJlX3R5cGUpCisjZGVmaW5lIFZFUkJPU0VfVE9ST1VUX1NUUklORyhzKSBcCisJZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcgIiAlc1xuIiwgdG9ydHVyZV90eXBlLCBzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKHMpIFwKKwlkbyB7IGlmICh2ZXJib3NlKSBwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyAiISEhICVzXG4iLCB0b3J0dXJlX3R5cGUsIHMpOyB9IHdoaWxlICgwKQorCisvKiBEZWZpbml0aW9ucyBmb3IgYSBub24tc3RyaW5nIHRvcnR1cmUtdGVzdCBtb2R1bGUgcGFyYW1ldGVyLiAqLworI2RlZmluZSB0b3J0dXJlX3Bhcm0odHlwZSwgbmFtZSwgaW5pdCwgbXNnKSBcCisJc3RhdGljIHR5cGUgbmFtZSA9IGluaXQ7IFwKKwltb2R1bGVfcGFyYW0obmFtZSwgdHlwZSwgMDQ0NCk7IFwKKwlNT0RVTEVfUEFSTV9ERVNDKG5hbWUsIG1zZyk7CisKKy8qIERlZmluaXRpb25zIGZvciBvbmxpbmUvb2ZmbGluZSBleGVyY2lzZXIuICovCitpbnQgdG9ydHVyZV9vbm9mZl9pbml0KGxvbmcgb29ob2xkb2ZmLCBsb25nIG9vaW50ZXJ2YWwpOworY2hhciAqdG9ydHVyZV9vbm9mZl9zdGF0cyhjaGFyICpwYWdlKTsKK2Jvb2wgdG9ydHVyZV9vbm9mZl9mYWlsdXJlcyh2b2lkKTsKKworLyogTG93LXJpZGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAqLworc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlIHsKKwl1bnNpZ25lZCBsb25nIHRyc19zdGF0ZTsKKwlsb25nIHRyc19jb3VudDsKK307CisjZGVmaW5lIERFRklORV9UT1JUVVJFX1JBTkRPTShuYW1lKSBzdHJ1Y3QgdG9ydHVyZV9yYW5kb21fc3RhdGUgbmFtZSA9IHsgMCwgMCB9Cit1bnNpZ25lZCBsb25nIHRvcnR1cmVfcmFuZG9tKHN0cnVjdCB0b3J0dXJlX3JhbmRvbV9zdGF0ZSAqdHJzcCk7CisKKy8qIFRhc2sgc2h1ZmZsZXIsIHdoaWNoIGNhdXNlcyBDUFVzIHRvIG9jY2FzaW9uYWxseSBnbyBpZGxlLiAqLwordm9pZCB0b3J0dXJlX3NodWZmbGVfdGFza19yZWdpc3RlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRwKTsKK2ludCB0b3J0dXJlX3NodWZmbGVfaW5pdChsb25nIHNodWZmaW50KTsKKworLyogVGVzdCBhdXRvLXNodXRkb3duIGhhbmRsaW5nLiAqLwordm9pZCB0b3J0dXJlX3NodXRkb3duX2Fic29yYihjb25zdCBjaGFyICp0aXRsZSk7CitpbnQgdG9ydHVyZV9zaHV0ZG93bl9pbml0KGludCBzc2Vjcywgdm9pZCAoKmNsZWFudXApKHZvaWQpKTsKKworLyogVGFzayBzdHV0dGVyaW5nLCB3aGljaCBmb3JjZXMgbG9hZC9uby1sb2FkIHRyYW5zaXRpb25zLiAqLwordm9pZCBzdHV0dGVyX3dhaXQoY29uc3QgY2hhciAqdGl0bGUpOworaW50IHRvcnR1cmVfc3R1dHRlcl9pbml0KGludCBzKTsKKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAuICovCit2b2lkIHRvcnR1cmVfaW5pdF9iZWdpbihjaGFyICp0dHlwZSwgYm9vbCB2LCBpbnQgKnJ1bm5hYmxlKTsKK3ZvaWQgdG9ydHVyZV9pbml0X2VuZCh2b2lkKTsKK2Jvb2wgdG9ydHVyZV9jbGVhbnVwKHZvaWQpOworYm9vbCB0b3J0dXJlX211c3Rfc3RvcCh2b2lkKTsKK2Jvb2wgdG9ydHVyZV9tdXN0X3N0b3BfaXJxKHZvaWQpOwordm9pZCB0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoY2hhciAqdGl0bGUpOworaW50IF90b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKGludCAoKmZuKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGNoYXIgKnMsIGNoYXIgKm0sCisJCQkgICAgIGNoYXIgKmYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnRwKTsKK3ZvaWQgX3RvcnR1cmVfc3RvcF9rdGhyZWFkKGNoYXIgKm0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnRwKTsKKworI2RlZmluZSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKG4sIGFyZywgdHApIFwKKwlfdG9ydHVyZV9jcmVhdGVfa3RocmVhZChuLCAoYXJnKSwgI24sICJDcmVhdGluZyAiICNuICIgdGFzayIsIFwKKwkJCQkiRmFpbGVkIHRvIGNyZWF0ZSAiICNuLCAmKHRwKSkKKyNkZWZpbmUgdG9ydHVyZV9zdG9wX2t0aHJlYWQobiwgdHApIFwKKwlfdG9ydHVyZV9zdG9wX2t0aHJlYWQoIlN0b3BwaW5nICIgI24gIiB0YXNrIiwgJih0cCkpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1RPUlRVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggOTBiNGZkYy4uYjkwYjVjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC0yMDgsNyArMjA4LDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdAlkZWx0YV9tc3Jfd2FpdDsJLyogTW9kZW0gc3RhdHVzIGNoYW5nZSAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogVFRZIGZsYWdzIEFTWV8qLwogCXVuc2lnbmVkIGNoYXIJCWNvbnNvbGU6MSwJLyogcG9ydCBpcyBhIGNvbnNvbGUgKi8KLQkJCQlsb3dfbGF0ZW5jeToxOwkvKiBkaXJlY3QgYnVmZmVyIGZsdXNoICovCisJCQkJbG93X2xhdGVuY3k6MTsJLyogb3B0aW9uYWw6IHR1bmUgZm9yIGxhdGVuY3kgKi8KIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogTG9ja2luZyAqLwogCXN0cnVjdCBtdXRleAkJYnVmX211dGV4OwkvKiBCdWZmZXIgYWxsb2MgbG9jayAqLwogCXVuc2lnbmVkIGNoYXIJCSp4bWl0X2J1ZjsJLyogT3B0aW9uYWwgYnVmZmVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oIGIvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAppbmRleCBiODM0N2MyMC4uYWRkMjZkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCkBAIC0xMjYsNyArMTI2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggN2Y2ZWI4NS4uNmI3ZWMzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC01Nyw2ICs1Nyw3IEBACiAgKiBAZXh0cmE6IGRlc2NyaXB0b3JzIGZvbGxvd2luZyB0aGlzIGVuZHBvaW50IGluIHRoZSBjb25maWd1cmF0aW9uCiAgKiBAZXh0cmFsZW46IGhvdyBtYW55IGJ5dGVzIG9mICJleHRyYSIgYXJlIHZhbGlkCiAgKiBAZW5hYmxlZDogVVJCcyBtYXkgYmUgc3VibWl0dGVkIHRvIHRoaXMgZW5kcG9pbnQKKyAqIEBzdHJlYW1zOiBudW1iZXIgb2YgVVNCLTMgc3RyZWFtcyBhbGxvY2F0ZWQgb24gdGhlIGVuZHBvaW50CiAgKgogICogVVNCIHJlcXVlc3RzIGFyZSBhbHdheXMgcXVldWVkIHRvIGEgZ2l2ZW4gZW5kcG9pbnQsIGlkZW50aWZpZWQgYnkgYQogICogZGVzY3JpcHRvciB3aXRoaW4gYW4gYWN0aXZlIGludGVyZmFjZSBpbiBhIGdpdmVuIFVTQiBjb25maWd1cmF0aW9uLgpAQCAtNzEsNiArNzIsNyBAQAogCXVuc2lnbmVkIGNoYXIgKmV4dHJhOyAgIC8qIEV4dHJhIGRlc2NyaXB0b3JzICovCiAJaW50IGV4dHJhbGVuOwogCWludCBlbmFibGVkOworCWludCBzdHJlYW1zOwogfTsKIAogLyogaG9zdC1zaWRlIHdyYXBwZXIgZm9yIG9uZSBpbnRlcmZhY2Ugc2V0dGluZydzIHBhcnNlZCBkZXNjcmlwdG9ycyAqLwpAQCAtMjAyLDYgKzIwNCw4IEBACiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2dldF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIHZvaWQgdXNiX3B1dF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAorLyogSGFyZCBsaW1pdCAqLworI2RlZmluZSBVU0JfTUFYRU5EUE9JTlRTCTMwCiAvKiB0aGlzIG1heGltdW0gaXMgYXJiaXRyYXJ5ICovCiAjZGVmaW5lIFVTQl9NQVhJTlRFUkZBQ0VTCTMyCiAjZGVmaW5lIFVTQl9NQVhJQURTCQkoVVNCX01BWElOVEVSRkFDRVMvMikKQEAgLTM2Niw2ICszNzAsOCBAQAogI2VuZGlmCiB9OwogCitzdHJ1Y3QgdXNiX2Rldl9zdGF0ZTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IHVzYl90dDsKQEAgLTc0OSw2ICs3NTUsMTEgQEAKIAkJdW5zaWduZWQgaW50IGlmYWNlX251bSwKIAkJdW5zaWduZWQgaW50IGFsdF9udW0pOwogCisvKiBwb3J0IGNsYWltaW5nIGZ1bmN0aW9ucyAqLworaW50IHVzYl9odWJfY2xhaW1fcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydDEsCisJCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpvd25lcik7CitpbnQgdXNiX2h1Yl9yZWxlYXNlX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQxLAorCQlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpOwogCiAvKioKICAqIHVzYl9tYWtlX3BhdGggLSByZXR1cm5zIHN0YWJsZSBkZXZpY2UgcGF0aCBpbiB0aGUgdXNiIHRyZWUKQEAgLTE2NjYsNiArMTY3NywxMCBAQAogLyogdGhpcyByZXF1ZXN0IGlzbid0IHJlYWxseSBzeW5jaHJvbm91cywgYnV0IGl0IGJlbG9uZ3Mgd2l0aCB0aGUgb3RoZXJzICovCiBleHRlcm4gaW50IHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBjb25maWcpOwogCisvKiBjaG9vc2UgYW5kIHNldCBjb25maWd1cmF0aW9uIGZvciBkZXZpY2UgKi8KK2V4dGVybiBpbnQgdXNiX2Nob29zZV9jb25maWd1cmF0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKK2V4dGVybiBpbnQgdXNiX3NldF9jb25maWd1cmF0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBjb25maWd1cmF0aW9uKTsKKwogLyoKICAqIHRpbWVvdXRzLCBpbiBtaWxsaXNlY29uZHMsIHVzZWQgZm9yIHNlbmRpbmcvcmVjZWl2aW5nIGNvbnRyb2wgbWVzc2FnZXMKICAqIHRoZXkgdHlwaWNhbGx5IGNvbXBsZXRlIHdpdGhpbiBhIGZldyBmcmFtZXMgKG1zZWMpIGFmdGVyIHRoZXkncmUgaXNzdWVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jZGNfbmNtLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jZGNfbmNtLmgKaW5kZXggYzNmYTgwNy4uMmMxNGQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY2RjX25jbS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NkY19uY20uaApAQCAtODgsNiArODgsNyBAQAogI2RlZmluZSBjZGNfbmNtX2RhdGFfaW50Zl9pc19tYmltKHgpICAoKHgpLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfQ0RDX01CSU1fUFJPVE9fTlRCKQogCiBzdHJ1Y3QgY2RjX25jbV9jdHggeworCXN0cnVjdCB1c2JfY2RjX25jbV9udGJfcGFyYW1ldGVycyBuY21fcGFybTsKIAlzdHJ1Y3QgaHJ0aW1lciB0eF90aW1lcjsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYmg7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NoaXBpZGVhLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jaGlwaWRlYS5oCmluZGV4IDcwOGJkMTEuLmJiZTc3OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NoaXBpZGVhLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvY2hpcGlkZWEuaApAQCAtMjUsNiArMjUsNyBAQAogCSAqLwogI2RlZmluZSBDSV9IRFJDX0RVQUxfUk9MRV9OT1RfT1RHCUJJVCg0KQogI2RlZmluZSBDSV9IRFJDX0lNWDI4X1dSSVRFX0ZJWAkJQklUKDUpCisjZGVmaW5lIENJX0hEUkNfRk9SQ0VfRlVMTFNQRUVECQlCSVQoNikKIAllbnVtIHVzYl9kcl9tb2RlCWRyX21vZGU7CiAjZGVmaW5lIENJX0hEUkNfQ09OVFJPTExFUl9SRVNFVF9FVkVOVAkJMAogI2RlZmluZSBDSV9IRFJDX0NPTlRST0xMRVJfU1RPUFBFRF9FVkVOVAkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9oY2QuaCBiL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oCmluZGV4IGVmZThkOGEuLjQ4NWNkNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oCkBAIC0xNDMsNiArMTQzLDcgQEAKIAl1bnNpZ25lZAkJYXV0aG9yaXplZF9kZWZhdWx0OjE7CiAJdW5zaWduZWQJCWhhc190dDoxOwkvKiBJbnRlZ3JhdGVkIFRUIGluIHJvb3QgaHViICovCiAJdW5zaWduZWQJCWFtZF9yZXN1bWVfYnVnOjE7IC8qIEFNRCByZW1vdGUgd2FrZXVwIHF1aXJrICovCisJdW5zaWduZWQJCWNhbl9kb19zdHJlYW1zOjE7IC8qIEhDIHN1cHBvcnRzIHN0cmVhbXMgKi8KIAogCXVuc2lnbmVkIGludAkJaXJxOwkJLyogaXJxIGFsbG9jYXRlZCAqLwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CQkvKiBkZXZpY2UgbWVtb3J5L2lvICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YWUzODMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivb21hcF9jb250cm9sX3VzYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIG9tYXBfY29udHJvbF91c2IuaCAtIEhlYWRlciBmaWxlIGZvciB0aGUgVVNCIHBhcnQgb2YgY29udHJvbCBtb2R1bGUuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fT01BUF9DT05UUk9MX1VTQl9IX18KLSNkZWZpbmUgX19PTUFQX0NPTlRST0xfVVNCX0hfXwotCi1lbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSB7Ci0JT01BUF9DVFJMX1RZUEVfT1RHSFMgPSAxLAkvKiBNYWlsYm94IE9UR0hTX0NPTlRST0wgKi8KLQlPTUFQX0NUUkxfVFlQRV9VU0IyLAkvKiBVU0IyX1BIWSwgcG93ZXIgZG93biBpbiBDT05UUk9MX0RFVl9DT05GICovCi0JT01BUF9DVFJMX1RZUEVfUElQRTMsCS8qIFBJUEUzIFBIWSwgRFBMTCAmIHNlcGVyYXRlIFJ4L1R4IHBvd2VyICovCi0JT01BUF9DVFJMX1RZUEVfRFJBN1VTQjIsIC8qIFVTQjIgUEhZLCBwb3dlciBhbmQgcG93ZXJfYXV4IGUuZy4gRFJBNyAqLwotCU9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMiwgLyogVVNCMiBQSFksIHBvd2VyIGUuZy4gQU00Mzd4ICovCi19OwotCi1zdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCi0JdTMyIF9faW9tZW0gKm90Z2hzX2NvbnRyb2w7Ci0JdTMyIF9faW9tZW0gKnBvd2VyOwotCXUzMiBfX2lvbWVtICpwb3dlcl9hdXg7Ci0KLQlzdHJ1Y3QgY2xrICpzeXNfY2xrOwotCi0JZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgdHlwZTsKLX07Ci0KLWVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIHsKLQlVU0JfTU9ERV9VTkRFRklORUQgPSAwLAotCVVTQl9NT0RFX0hPU1QsCi0JVVNCX01PREVfREVWSUNFLAotCVVTQl9NT0RFX0RJU0NPTk5FQ1QsCi19OwotCi0jZGVmaW5lCU9NQVBfQ1RSTF9ERVZfUEhZX1BECQlCSVQoMCkKLQotI2RlZmluZQlPTUFQX0NUUkxfREVWX0FWQUxJRAkJQklUKDApCi0jZGVmaW5lCU9NQVBfQ1RSTF9ERVZfQlZBTElECQlCSVQoMSkKLSNkZWZpbmUJT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQJCUJJVCgyKQotI2RlZmluZQlPTUFQX0NUUkxfREVWX1NFU1NFTkQJCUJJVCgzKQotI2RlZmluZQlPTUFQX0NUUkxfREVWX0lERElHCQlCSVQoNCkKLQotI2RlZmluZQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX01BU0sJMHgwMDNGQzAwMAotI2RlZmluZQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX1NISUZUCTB4RQotCi0jZGVmaW5lCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19GUkVRX01BU0sJMHhGRkMwMDAwMAotI2RlZmluZQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfRlJFUV9TSElGVAkweDE2Ci0KLSNkZWZpbmUJT01BUF9DVFJMX1VTQjNfUEhZX1RYX1JYX1BPV0VST04JMHgzCi0jZGVmaW5lCU9NQVBfQ1RSTF9VU0IzX1BIWV9UWF9SWF9QT1dFUk9GRgkweDAKLQotI2RlZmluZSBPTUFQX0NUUkxfVVNCMl9QSFlfUEQJCUJJVCgyOCkKLQotI2RlZmluZSBBTTQzN1hfQ1RSTF9VU0IyX1BIWV9QRAkJQklUKDApCi0jZGVmaW5lIEFNNDM3WF9DVFJMX1VTQjJfT1RHX1BECQlCSVQoMSkKLSNkZWZpbmUgQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOCUJJVCgxOSkKLSNkZWZpbmUgQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOCUJJVCgyMCkKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX09NQVBfQ09OVFJPTF9VU0IpCi1leHRlcm4gdm9pZCBvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbik7Ci1leHRlcm4gdm9pZCBvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQllbnVtIG9tYXBfY29udHJvbF91c2JfbW9kZSBtb2RlKTsKLSNlbHNlCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCWVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIG1vZGUpCi17Ci19Ci0jZW5kaWYKLQotI2VuZGlmCS8qIF9fT01BUF9DT05UUk9MX1VTQl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL29tYXBfdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9vbWFwX3VzYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWUyOTM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvdXNiL29tYXBfdXNiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogb21hcF91c2IuaCAtLSBvbWFwIHVzYjIgcGh5IGhlYWRlciBmaWxlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fRFJJVkVSU19PTUFQX1VTQjJfSAotI2RlZmluZSBfX0RSSVZFUlNfT01BUF9VU0IyX0gKLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgotCi1zdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zIHsKLQl1MTYJbTsKLQl1OAluOwotCXU4CWZyZXE6MzsKLQl1OAlzZDsKLQl1MzIJbWY7Ci19OwotCi1zdHJ1Y3Qgb21hcF91c2IgewotCXN0cnVjdCB1c2JfcGh5CQlwaHk7Ci0Jc3RydWN0IHBoeV9jb21wYW5pb24JKmNvbXBhcmF0b3I7Ci0Jdm9pZCBfX2lvbWVtCQkqcGxsX2N0cmxfYmFzZTsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sX2RldjsKLQlzdHJ1Y3QgY2xrCQkqd2t1cGNsazsKLQlzdHJ1Y3QgY2xrCQkqc3lzX2NsazsKLQlzdHJ1Y3QgY2xrCQkqb3B0Y2xrOwotCXU4CQkJaXNfc3VzcGVuZGVkOjE7Ci19OwotCi0jZGVmaW5lCXBoeV90b19vbWFwdXNiKHgpCWNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBvbWFwX3VzYiwgcGh5KQotCi0jaWYgZGVmaW5lZChDT05GSUdfT01BUF9VU0IyKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX1VTQjJfTU9EVUxFKQotZXh0ZXJuIGludCBvbWFwX3VzYjJfc2V0X2NvbXBhcmF0b3Ioc3RydWN0IHBoeV9jb21wYW5pb24gKmNvbXBhcmF0b3IpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfdXNiMl9zZXRfY29tcGFyYXRvcihzdHJ1Y3QgcGh5X2NvbXBhbmlvbiAqY29tcGFyYXRvcikKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHUzMiBvbWFwX3VzYl9yZWFkbCh2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGwoYWRkciArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3VzYl93cml0ZWwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsCi0JdTMyIGRhdGEpCi17Ci0JX19yYXdfd3JpdGVsKGRhdGEsIGFkZHIgKyBvZmZzZXQpOwotfQotCi0jZW5kaWYgLyogX19EUklWRVJTX09NQVBfVVNCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3BoeS5oIGIvaW5jbHVkZS9saW51eC91c2IvcGh5LmgKaW5kZXggNmMwYjFjNS4uMzUzMDUzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvcGh5LmgKQEAgLTExMSw2ICsxMTEsMTMgQEAKIAlpbnQJKCpzZXRfc3VzcGVuZCkoc3RydWN0IHVzYl9waHkgKngsCiAJCQkJaW50IHN1c3BlbmQpOwogCisJLyoKKwkgKiBTZXQgd2FrZXVwIGVuYWJsZSBmb3IgUEhZLCBpbiB0aGF0IGNhc2UsIHRoZSBQSFkgY2FuIGJlCisJICogd29rZW4gdXAgZnJvbSBzdXNwZW5kIHN0YXR1cyBkdWUgdG8gZXh0ZXJuYWwgZXZlbnRzLAorCSAqIGxpa2UgdmJ1cyBjaGFuZ2UsIGRwL2RtIGNoYW5nZSBhbmQgaWQuCisJICovCisJaW50CSgqc2V0X3dha2V1cCkoc3RydWN0IHVzYl9waHkgKngsIGJvb2wgZW5hYmxlZCk7CisKIAkvKiBub3RpZnkgcGh5IGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLwogCWludAkoKm5vdGlmeV9jb25uZWN0KShzdHJ1Y3QgdXNiX3BoeSAqeCwKIAkJCWVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCk7CkBAIC0yNjUsNiArMjcyLDE1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Cit1c2JfcGh5X3NldF93YWtldXAoc3RydWN0IHVzYl9waHkgKngsIGJvb2wgZW5hYmxlZCkKK3sKKwlpZiAoeCAmJiB4LT5zZXRfd2FrZXVwKQorCQlyZXR1cm4geC0+c2V0X3dha2V1cCh4LCBlbmFibGVkKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAogdXNiX3BoeV9ub3RpZnlfY29ubmVjdChzdHJ1Y3QgdXNiX3BoeSAqeCwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKQogewogCWlmICh4ICYmIHgtPm5vdGlmeV9jb25uZWN0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAppbmRleCA3MDRhMWFiLi45YmI1NDdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaApAQCAtMTkwLDcgKzE5MCw4IEBACiAgKiBAbnVtX3BvcnRzOiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBwb3J0cyB0aGlzIGRldmljZSB3aWxsIGhhdmUuCiAgKiBAYnVsa19pbl9zaXplOiBtaW5pbXVtIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmb3IgYnVsay1pbiBidWZmZXIKICAqCSgwID0gZW5kLXBvaW50IHNpemUpCi0gKiBAYnVsa19vdXRfc2l6ZTogYnl0ZXMgdG8gYWxsb2NhdGUgZm9yIGJ1bGstb3V0IGJ1ZmZlciAoMCA9IGVuZC1wb2ludCBzaXplKQorICogQGJ1bGtfb3V0X3NpemU6IG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZvciBidWxrLW91dCBidWZmZXIKKyAqCSgwID0gZW5kLXBvaW50IHNpemUpCiAgKiBAY2FsY19udW1fcG9ydHM6IHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaG93IG1hbnkgcG9ydHMgdGhpcwogICoJZGV2aWNlIGhhcyBkeW5hbWljYWxseS4gIEl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBwcm9iZSgpCiAgKgljYWxsYmFjayBpcyBjYWxsZWQsIGJ1dCBiZWZvcmUgYXR0YWNoKCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3Vhcy5oIGIvaW5jbHVkZS9saW51eC91c2IvdWFzLmgKaW5kZXggNTQ5OWFiNS4uM2ZjOGU4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvdWFzLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvdWFzLmgKQEAgLTksNyArOSw3IEBACiAJX191OCBpdV9pZDsKIAlfX3U4IHJzdmQxOwogCV9fYmUxNiB0YWc7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIGVudW0gewogCUlVX0lEX0NPTU1BTkQJCT0gMHgwMSwKQEAgLTUyLDcgKzUyLDcgQEAKIAlfX3U4IHJzdmQ3OwogCXN0cnVjdCBzY3NpX2x1biBsdW47CiAJX191OCBjZGJbMTZdOwkvKiBYWFg6IE92ZXJmbG93LWNoZWNraW5nIHRvb2xzIG1heSBtaXN1bmRlcnN0YW5kICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCB0YXNrX21nbXRfaXUgewogCV9fdTggaXVfaWQ7CkBAIC02Miw3ICs2Miw3IEBACiAJX191OCByc3ZkMjsKIAlfX2JlMTYgdGFza190YWc7CiAJc3RydWN0IHNjc2lfbHVuIGx1bjsKLX07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAogLyoKICAqIEFsc28gdXNlZCBmb3IgdGhlIFJlYWQgUmVhZHkgYW5kIFdyaXRlIFJlYWR5IElVcyBzaW5jZSB0aGV5IGhhdmUgdGhlCkBAIC03NywxNSArNzcsMTUgQEAKIAlfX3U4IHJzdmQ3WzddOwogCV9fYmUxNiBsZW47CiAJX191OCBzZW5zZVtTQ1NJX1NFTlNFX0JVRkZFUlNJWkVdOwotfTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwogCi1zdHJ1Y3QgcmVzcG9uc2VfdWkgeworc3RydWN0IHJlc3BvbnNlX2l1IHsKIAlfX3U4IGl1X2lkOwogCV9fdTggcnN2ZDE7CiAJX19iZTE2IHRhZzsKLQlfX2JlMTYgYWRkX3Jlc3BvbnNlX2luZm87CisJX191OCBhZGRfcmVzcG9uc2VfaW5mb1szXTsKIAlfX3U4IHJlc3BvbnNlX2NvZGU7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCB1c2JfcGlwZV91c2FnZV9kZXNjcmlwdG9yIHsKIAlfX3U4ICBiTGVuZ3RoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvdXNibmV0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaAppbmRleCBlMzAzZWVmLi4wNjYyZTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaApAQCAtMzAsNyArMzAsNyBAQAogCXN0cnVjdCBkcml2ZXJfaW5mbwkqZHJpdmVyX2luZm87CiAJY29uc3QgY2hhcgkJKmRyaXZlcl9uYW1lOwogCXZvaWQJCQkqZHJpdmVyX3ByaXY7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJKndhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKIAlzdHJ1Y3QgbXV0ZXgJCXBoeV9tdXRleDsKIAl1bnNpZ25lZCBjaGFyCQlzdXNwZW5kX2NvdW50OwogCXVuc2lnbmVkIGNoYXIJCXBrdF9jbnQsIHBrdF9lcnI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCA2MzAzNTY4Li4xYTY0YjI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTY3LDggKzY3LDEwIEBACiAJCS8qIEluaXRpYWwgUkVBRCgxMCkgKGFuZCBvdGhlcnMpIG11c3QgYmUgcmV0cmllZCAqLwlcCiAJVVNfRkxBRyhXUklURV9DQUNIRSwJMHgwMDIwMDAwMCkJCQlcCiAJCS8qIFdyaXRlIENhY2hlIHN0YXR1cyBpcyBub3QgYXZhaWxhYmxlICovCVwKLQlVU19GTEFHKE5FRURTX0NBUDE2LAkweDAwNDAwMDAwKQotCQkvKiBjYW5ub3QgaGFuZGxlIFJFQURfQ0FQQUNJVFlfMTAgKi8KKwlVU19GTEFHKE5FRURTX0NBUDE2LAkweDAwNDAwMDAwKQkJCVwKKwkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzEwICovCQlcCisJVVNfRkxBRyhJR05PUkVfVUFTLAkweDAwODAwMDAwKQkJCVwKKwkJLyogRGV2aWNlIGFkdmVydGlzZXMgVUFTIGJ1dCBpdCBpcyBicm9rZW4gKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCA3MDRmNGY2Li4xYjIyYzQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTE3NywyMCArMTc3LDEwIEBACiAjZGVmaW5lIERFQ0xBUkVfREVGRVJSQUJMRV9XT1JLKG4sIGYpCQkJCQlcCiAJc3RydWN0IGRlbGF5ZWRfd29yayBuID0gX19ERUxBWUVEX1dPUktfSU5JVElBTElaRVIobiwgZiwgVElNRVJfREVGRVJSQUJMRSkKIAotLyoKLSAqIGluaXRpYWxpemUgYSB3b3JrIGl0ZW0ncyBmdW5jdGlvbiBwb2ludGVyCi0gKi8KLSNkZWZpbmUgUFJFUEFSRV9XT1JLKF93b3JrLCBfZnVuYykJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCShfd29yayktPmZ1bmMgPSAoX2Z1bmMpOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQUkVQQVJFX0RFTEFZRURfV09SSyhfd29yaywgX2Z1bmMpCQkJCVwKLQlQUkVQQVJFX1dPUksoJihfd29yayktPndvcmssIChfZnVuYykpCi0KICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19XT1JLCiBleHRlcm4gdm9pZCBfX2luaXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIGludCBvbnN0YWNrKTsKIGV4dGVybiB2b2lkIGRlc3Ryb3lfd29ya19vbl9zdGFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuIHZvaWQgZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB3b3JrX3N0YXRpYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJcmV0dXJuICp3b3JrX2RhdGFfYml0cyh3b3JrKSAmIFdPUktfU1RSVUNUX1NUQVRJQzsKQEAgLTE5OCw2ICsxODgsNyBAQAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIGludCBvbnN0YWNrKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X3dvcmtfb25fc3RhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2RlbGF5ZWRfd29ya19vbl9zdGFjayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKSB7IH0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHdvcmtfc3RhdGljKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKQEAgLTIxNyw3ICsyMDgsNyBAQAogCQkoX3dvcmspLT5kYXRhID0gKGF0b21pY19sb25nX3QpIFdPUktfREFUQV9JTklUKCk7CVwKIAkJbG9ja2RlcF9pbml0X21hcCgmKF93b3JrKS0+bG9ja2RlcF9tYXAsICNfd29yaywgJl9fa2V5LCAwKTsgXAogCQlJTklUX0xJU1RfSEVBRCgmKF93b3JrKS0+ZW50cnkpOwkJCVwKLQkJUFJFUEFSRV9XT1JLKChfd29yayksIChfZnVuYykpOwkJCQlcCisJCShfd29yayktPmZ1bmMgPSAoX2Z1bmMpOwkJCQlcCiAJfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIF9fSU5JVF9XT1JLKF93b3JrLCBfZnVuYywgX29uc3RhY2spCQkJCVwKQEAgLTIyNSw3ICsyMTYsNyBAQAogCQlfX2luaXRfd29yaygoX3dvcmspLCBfb25zdGFjayk7CQkJCVwKIAkJKF93b3JrKS0+ZGF0YSA9IChhdG9taWNfbG9uZ190KSBXT1JLX0RBVEFfSU5JVCgpOwlcCiAJCUlOSVRfTElTVF9IRUFEKCYoX3dvcmspLT5lbnRyeSk7CQkJXAotCQlQUkVQQVJFX1dPUksoKF93b3JrKSwgKF9mdW5jKSk7CQkJCVwKKwkJKF93b3JrKS0+ZnVuYyA9IChfZnVuYyk7CQkJCVwKIAl9IHdoaWxlICgwKQogI2VuZGlmCiAKQEAgLTI5NSwxNyArMjg2LDExIEBACiAgKiBEb2N1bWVudGF0aW9uL3dvcmtxdWV1ZS50eHQuCiAgKi8KIGVudW0gewotCS8qCi0JICogQWxsIHdxcyBhcmUgbm93IG5vbi1yZWVudHJhbnQgbWFraW5nIHRoZSBmb2xsb3dpbmcgZmxhZwotCSAqIG1lYW5pbmdsZXNzLiAgV2lsbCBiZSByZW1vdmVkLgotCSAqLwotCVdRX05PTl9SRUVOVFJBTlQJPSAxIDw8IDAsIC8qIERFUFJFQ0FURUQgKi8KLQogCVdRX1VOQk9VTkQJCT0gMSA8PCAxLCAvKiBub3QgYm91bmQgdG8gYW55IGNwdSAqLwogCVdRX0ZSRUVaQUJMRQkJPSAxIDw8IDIsIC8qIGZyZWV6ZSBkdXJpbmcgc3VzcGVuZCAqLwogCVdRX01FTV9SRUNMQUlNCQk9IDEgPDwgMywgLyogbWF5IGJlIHVzZWQgZm9yIG1lbW9yeSByZWNsYWltICovCiAJV1FfSElHSFBSSQkJPSAxIDw8IDQsIC8qIGhpZ2ggcHJpb3JpdHkgKi8KLQlXUV9DUFVfSU5URU5TSVZFCT0gMSA8PCA1LCAvKiBjcHUgaW5zdGVuc2l2ZSB3b3JrcXVldWUgKi8KKwlXUV9DUFVfSU5URU5TSVZFCT0gMSA8PCA1LCAvKiBjcHUgaW50ZW5zaXZlIHdvcmtxdWV1ZSAqLwogCVdRX1NZU0ZTCQk9IDEgPDwgNiwgLyogdmlzaWJsZSBpbiBzeXNmcywgc2VlIHdxX3N5c2ZzX3JlZ2lzdGVyKCkgKi8KIAogCS8qCkBAIC02MDIsMjEgKzU4Nyw2IEBACiAJcmV0dXJuIHN5c3RlbV93cSAhPSBOVUxMOwogfQogCi0vKgotICogTGlrZSBhYm92ZSwgYnV0IHVzZXMgZGVsX3RpbWVyKCkgaW5zdGVhZCBvZiBkZWxfdGltZXJfc3luYygpLiBUaGlzIG1lYW5zLAotICogaWYgaXQgcmV0dXJucyAwIHRoZSB0aW1lciBmdW5jdGlvbiBtYXkgYmUgcnVubmluZyBhbmQgdGhlIHF1ZXVlaW5nIGlzIGluCi0gKiBwcm9ncmVzcy4KLSAqLwotc3RhdGljIGlubGluZSBib29sIF9fZGVwcmVjYXRlZCBfX2NhbmNlbF9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKLXsKLQlib29sIHJldDsKLQotCXJldCA9IGRlbF90aW1lcigmd29yay0+dGltZXIpOwotCWlmIChyZXQpCi0JCXdvcmtfY2xlYXJfcGVuZGluZygmd29yay0+d29yayk7Ci0JcmV0dXJuIHJldDsKLX0KLQogLyogdXNlZCB0byBiZSBkaWZmZXJlbnQgYnV0IG5vdyBpZGVudGljYWwgdG8gZmx1c2hfd29yaygpLCBkZXByZWNhdGVkICovCiBzdGF0aWMgaW5saW5lIGJvb2wgX19kZXByZWNhdGVkIGZsdXNoX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItb2YuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCmluZGV4IDU0MWNlYTQuLjcwZmE3YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgogCkBAIC01MCwxNyArNTEsMTMgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCAtIHRoZSBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQotICogQHBvcnQ6IGlkZW50aWZpZXIgKHZhbHVlIG9mIHJlZyBwcm9wZXJ0eSkgb2YgYSBwb3J0IHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0bwotICogQGlkOiBpZGVudGlmaWVyICh2YWx1ZSBvZiByZWcgcHJvcGVydHkpIG9mIHRoaXMgZW5kcG9pbnQKLSAqIEBsb2NhbF9ub2RlOiBwb2ludGVyIHRvIGRldmljZV9ub2RlIG9mIHRoaXMgZW5kcG9pbnQKKyAqIEBiYXNlOiBzdHJ1Y3Qgb2ZfZW5kcG9pbnQgY29udGFpbmluZyBwb3J0LCBpZCwgYW5kIGxvY2FsIG9mX25vZGUKICAqIEBidXNfdHlwZTogYnVzIHR5cGUKICAqIEBidXM6IGJ1cyBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCiAgKiBAaGVhZDogbGlzdCBoZWFkIGZvciB0aGlzIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCB7Ci0JdW5zaWduZWQgaW50IHBvcnQ7Ci0JdW5zaWduZWQgaW50IGlkOwotCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbG9jYWxfbm9kZTsKKwlzdHJ1Y3Qgb2ZfZW5kcG9pbnQgYmFzZTsKIAllbnVtIHY0bDJfbWJ1c190eXBlIGJ1c190eXBlOwogCXVuaW9uIHsKIAkJc3RydWN0IHY0bDJfb2ZfYnVzX3BhcmFsbGVsIHBhcmFsbGVsOwpAQCAtNzIsMTEgKzY5LDYgQEAKICNpZmRlZiBDT05GSUdfT0YKIGludCB2NGwyX29mX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCSAgIHN0cnVjdCB2NGwyX29mX2VuZHBvaW50ICplbmRwb2ludCk7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpOwotc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiAjZWxzZSAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGlubGluZSBpbnQgdjRsMl9vZl9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCkBAIC04NSwyNSArNzcsNiBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludCgKLQkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KAotCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogI2VuZGlmIC8qIF9WNEwyX09GX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmggYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCmluZGV4IDk2NTBhM2YuLmI0OTU2YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKKysrIGIvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaApAQCAtMzEsOCArMzEsMTAgQEAKICNkZWZpbmUgSUZfUFJFRklYX0FVVE9DT05GCTB4MDIKIAogZW51bSB7CisJSU5FVDZfSUZBRERSX1NUQVRFX1BSRURBRCwKIAlJTkVUNl9JRkFERFJfU1RBVEVfREFELAogCUlORVQ2X0lGQUREUl9TVEFURV9QT1NUREFELAorCUlORVQ2X0lGQUREUl9TVEFURV9FUlJEQUQsCiAJSU5FVDZfSUZBRERSX1NUQVRFX1VQLAogCUlORVQ2X0lGQUREUl9TVEFURV9ERUFELAogfTsKQEAgLTU4LDcgKzYwLDcgQEAKIAl1bnNpZ25lZCBsb25nCQljc3RhbXA7CS8qIGNyZWF0ZWQgdGltZXN0YW1wICovCiAJdW5zaWduZWQgbG9uZwkJdHN0YW1wOyAvKiB1cGRhdGVkIHRpbWVzdGFtcCAqLwogCi0Jc3RydWN0IHRpbWVyX2xpc3QJZGFkX3RpbWVyOworCXN0cnVjdCBkZWxheWVkX3dvcmsJZGFkX3dvcms7CiAKIAlzdHJ1Y3QgaW5ldDZfZGV2CSppZGV2OwogCXN0cnVjdCBydDZfaW5mbwkJKnJ0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCA4YzRkZDYzLi43NDNhY2NlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtNDgwLDIwICs0ODAsMjEgQEAKICNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogCi0vKiBTeW5jb29raWVzIHVzZSBhIG1vbm90b25pYyB0aW1lciB3aGljaCBpbmNyZW1lbnRzIGV2ZXJ5IDY0IHNlY29uZHMuCisvKiBTeW5jb29raWVzIHVzZSBhIG1vbm90b25pYyB0aW1lciB3aGljaCBpbmNyZW1lbnRzIGV2ZXJ5IDYwIHNlY29uZHMuCiAgKiBUaGlzIGNvdW50ZXIgaXMgdXNlZCBib3RoIGFzIGEgaGFzaCBpbnB1dCBhbmQgcGFydGlhbGx5IGVuY29kZWQgaW50bwogICogdGhlIGNvb2tpZSB2YWx1ZS4gIEEgY29va2llIGlzIG9ubHkgdmFsaWRhdGVkIGZ1cnRoZXIgaWYgdGhlIGRlbHRhCiAgKiBiZXR3ZWVuIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgYW5kIHRoZSBlbmNvZGVkIG9uZSBpcyBsZXNzIHRoYW4gdGhpcywKLSAqIGkuZS4gYSBzZW50IGNvb2tpZSBpcyB2YWxpZCBvbmx5IGF0IG1vc3QgZm9yIDEyOCBzZWNvbmRzIChvciBsZXNzIGlmCisgKiBpLmUuIGEgc2VudCBjb29raWUgaXMgdmFsaWQgb25seSBhdCBtb3N0IGZvciAyKjYwIHNlY29uZHMgKG9yIGxlc3MgaWYKICAqIHRoZSBjb3VudGVyIGFkdmFuY2VzIGltbWVkaWF0ZWx5IGFmdGVyIGEgY29va2llIGlzIGdlbmVyYXRlZCkuCiAgKi8KICNkZWZpbmUgTUFYX1NZTkNPT0tJRV9BR0UgMgogCiBzdGF0aWMgaW5saW5lIHUzMiB0Y3BfY29va2llX3RpbWUodm9pZCkKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgbm93OwotCWdldG5zdGltZW9mZGF5KCZub3cpOwotCXJldHVybiBub3cudHZfc2VjID4+IDY7IC8qIDY0IHNlY29uZHMgZ3JhbnVsYXJpdHkgKi8KKwl1NjQgdmFsID0gZ2V0X2ppZmZpZXNfNjQoKTsKKworCWRvX2Rpdih2YWwsIDYwICogSFopOworCXJldHVybiB2YWw7CiB9CiAKIHUzMiBfX2Nvb2tpZV92NF9pbml0X3NlcXVlbmNlKGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKaW5kZXggMzA5ZjUxMy4uNzIyMWEyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKQEAgLTMyNywxMiArMzI3LDE5IEBACiAJc3RydWN0IGlzY3NpX3RyYW5zcG9ydAkqdHQ7CiAJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKIAlzdHJ1Y3QgaXNjc2lfY29ubgkqbGVhZGNvbm47CS8qIGxlYWRpbmcgY29ubmVjdGlvbiAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBwcm90ZWN0cyBzZXNzaW9uIHN0YXRlLCAqCi0JCQkJCQkgKiBzZXF1ZW5jZSBudW1iZXJzLCAgICAgICAqCisJLyogQmV0d2VlbiB0aGUgZm9yd2FyZCBhbmQgdGhlIGJhY2t3YXJkIGxvY2tzIGV4aXN0cyBhIHN0cmljdCBsb2NraW5nCisJICogaGllcmFyY2h5LiBUaGUgbXV0dWFsIGV4Y2x1c2lvbiB6b25lIHByb3RlY3RlZCBieSB0aGUgZm9yd2FyZCBsb2NrCisJICogY2FuIGVuY2xvc2UgdGhlIG11dHVhbCBleGNsdXNpb24gem9uZSBwcm90ZWN0ZWQgYnkgdGhlIGJhY2t3YXJkIGxvY2sKKwkgKiBidXQgbm90IHZpY2UgdmVyc2EuCisJICovCisJc3BpbmxvY2tfdAkJZnJ3ZF9sb2NrOwkvKiBwcm90ZWN0cyBzZXNzaW9uIHN0YXRlLCAqCisJCQkJCQkgKiBjbWRzbiwgcXVldWVkX2NtZHNuICAgICAqCiAJCQkJCQkgKiBzZXNzaW9uIHJlc291cmNlczogICAgICAqCi0JCQkJCQkgKiAtIGNtZHBvb2wsCQkgICAqCi0JCQkJCQkgKiAtIG1nbXRwb29sLAkJICAgKgotCQkJCQkJICogLSByMnRwb29sCQkgICAqLworCQkJCQkJICogLSBjbWRwb29sIGtmaWZvX291dCAsICAgKgorCQkJCQkJICogLSBtZ210cG9vbCwJCSAgICovCisJc3BpbmxvY2tfdAkJYmFja19sb2NrOwkvKiBwcm90ZWN0cyBjbWRzbl9leHAgICAgICAqCisJCQkJCQkgKiBjbWRzbl9tYXgsICAgICAgICAgICAgICAqCisJCQkJCQkgKiBjbWRwb29sIGtmaWZvX2luICAgICAgICAqLwogCWludAkJCXN0YXRlOwkJLyogc2Vzc2lvbiBzdGF0ZSAgICAgICAgICAgKi8KIAlpbnQJCQlhZ2U7CQkvKiBjb3VudHMgc2Vzc2lvbiByZS1vcGVucyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmgKaW5kZXggMjE1NDY5YS4uMmE3YWE3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaV90Y3AuaApAQCAtODMsNiArODMsOCBAQAogCXN0cnVjdCBpc2NzaV9wb29sCXIydHBvb2w7CiAJc3RydWN0IGtmaWZvCQlyMnRxdWV1ZTsKIAl2b2lkCQkJKmRkX2RhdGE7CisJc3BpbmxvY2tfdAkJcG9vbDJxdWV1ZTsKKwlzcGlubG9ja190CQlxdWV1ZTJwb29sOwogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGlic2FzLmggYi9pbmNsdWRlL3Njc2kvbGlic2FzLmgKaW5kZXggZjg0M2RkOC4uZWY3ODcyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaApAQCAtMTcyLDcgKzE3Miw2IEBACiAgICAgICAgIGVudW0gICBhdGFfY29tbWFuZF9zZXQgY29tbWFuZF9zZXQ7CiAgICAgICAgIHN0cnVjdCBzbXBfcmVzcCAgICAgICAgcnBzX3Jlc3A7IC8qIHJlcG9ydF9waHlfc2F0YV9yZXNwICovCiAgICAgICAgIHU4ICAgICBwb3J0X25vOyAgICAgICAgLyogcG9ydCBudW1iZXIsIGlmIHRoaXMgaXMgYSBQTSAoUG9ydCkgKi8KLQlpbnQgICAgcG1fcmVzdWx0OwogCiAJc3RydWN0IGF0YV9wb3J0ICphcDsKIAlzdHJ1Y3QgYXRhX2hvc3QgYXRhX2hvc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggOTE1NThhMS4uZGQ3Yzk5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtMTQyLDggKzE0Miw3IEBACiBleHRlcm4gc3RydWN0IHNjc2lfY21uZCAqc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgZ2ZwX3QpOwogZXh0ZXJuIHN0cnVjdCBzY3NpX2NtbmQgKl9fc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIGdmcF90KTsKIGV4dGVybiB2b2lkIHNjc2lfcHV0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKLWV4dGVybiB2b2lkIF9fc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICopOworZXh0ZXJuIHZvaWQgX19zY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfZmluaXNoX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAogZXh0ZXJuIHZvaWQgKnNjc2lfa21hcF9hdG9taWNfc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHNnX2NvdW50LApAQCAtMTU2LDkgKzE1NSw2IEBACiBleHRlcm4gaW50IHNjc2lfZG1hX21hcChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogZXh0ZXJuIHZvaWQgc2NzaV9kbWFfdW5tYXAoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAotc3RydWN0IHNjc2lfY21uZCAqc2NzaV9hbGxvY2F0ZV9jb21tYW5kKGdmcF90IGdmcF9tYXNrKTsKLXZvaWQgc2NzaV9mcmVlX2NvbW1hbmQoZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2NzaV9zZ19jb3VudChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJcmV0dXJuIGNtZC0+c2RiLnRhYmxlLm5lbnRzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAppbmRleCBkNjVmYmVjLi40ZTg0NWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaApAQCAtMTEzLDYgKzExMywxMiBAQAogCWNvbnN0IGNoYXIgKiB2ZW5kb3I7CQkvKiBbYmFja19jb21wYXRdIHBvaW50IGludG8gJ2lucXVpcnknIC4uLiAqLwogCWNvbnN0IGNoYXIgKiBtb2RlbDsJCS8qIC4uLiBhZnRlciBzY2FuOyBwb2ludCB0byBzdGF0aWMgc3RyaW5nICovCiAJY29uc3QgY2hhciAqIHJldjsJCS8qIC4uLiAibnVsbG51bGxudWxsbnVsbCIgYmVmb3JlIHNjYW4gKi8KKworI2RlZmluZSBTQ1NJX1ZQRF9QR19MRU4gICAgICAgICAgICAgICAgMjU1CisJaW50IHZwZF9wZzgzX2xlbjsKKwl1bnNpZ25lZCBjaGFyICp2cGRfcGc4MzsKKwlpbnQgdnBkX3BnODBfbGVuOworCXVuc2lnbmVkIGNoYXIgKnZwZF9wZzgwOwogCXVuc2lnbmVkIGNoYXIgY3VycmVudF90YWc7CS8qIGN1cnJlbnQgdGFnICovCiAJc3RydWN0IHNjc2lfdGFyZ2V0ICAgICAgKnNkZXZfdGFyZ2V0OyAgIC8qIHVzZWQgb25seSBmb3Igc2luZ2xlX2x1biAqLwogCkBAIC0yMzUsMTIgKzI0MSwyNCBAQAogI2RlZmluZSBzZGV2X3ByaW50ayhwcmVmaXgsIHNkZXYsIGZtdCwgYS4uLikJXAogCWRldl9wcmludGsocHJlZml4LCAmKHNkZXYpLT5zZGV2X2dlbmRldiwgZm10LCAjI2EpCiAKKyNkZWZpbmUgc2Rldl9kYmcoc2RldiwgZm10LCBhLi4uKSBcCisJZGV2X2RiZygmKHNkZXYpLT5zZGV2X2dlbmRldiwgZm10LCAjI2EpCisKICNkZWZpbmUgc2NtZF9wcmludGsocHJlZml4LCBzY21kLCBmbXQsIGEuLi4pCQkJCVwKICAgICAgICAgKHNjbWQpLT5yZXF1ZXN0LT5ycV9kaXNrID8JCQkJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzY21kKS0+ZGV2aWNlLCAiWyVzXSAiIGZtdCwJCVwKIAkJICAgIChzY21kKS0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCAjI2EpIDoJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzY21kKS0+ZGV2aWNlLCBmbXQsICMjYSkKIAorI2RlZmluZSBzY21kX2RiZyhzY21kLCBmbXQsIGEuLi4pCQkJCQkgICBcCisJZG8gewkJCQkJCQkJICAgXAorCQlpZiAoKHNjbWQpLT5yZXF1ZXN0LT5ycV9kaXNrKQkJCQkgICBcCisJCQlzZGV2X2RiZygoc2NtZCktPmRldmljZSwgIlslc10gIiBmbXQsCQkgICBcCisJCQkJIChzY21kKS0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCAjI2EpO1wKKwkJZWxzZQkJCQkJCQkgICBcCisJCQlzZGV2X2RiZygoc2NtZCktPmRldmljZSwgZm10LCAjI2EpOwkJICAgXAorCX0gd2hpbGUgKDApCisKIGVudW0gc2NzaV90YXJnZXRfc3RhdGUgewogCVNUQVJHRVRfQ1JFQVRFRCA9IDEsCiAJU1RBUkdFVF9SVU5OSU5HLApAQCAtMjU3LDcgKzI3NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzaWJsaW5nczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldmljZXM7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXVuc2lnbmVkIGludAkJcmVhcF9yZWY7IC8qIHByb3RlY3RlZCBieSB0aGUgaG9zdCBsb2NrICovCisJc3RydWN0IGtyZWYJCXJlYXBfcmVmOyAvKiBsYXN0IHB1dCByZW5kZXJzIHRhcmdldCBpbnZpc2libGUgKi8KIAl1bnNpZ25lZCBpbnQJCWNoYW5uZWw7CiAJdW5zaWduZWQgaW50CQlpZDsgLyogdGFyZ2V0IGlkIC4uLiByZXBsYWNlCiAJCQkJICAgICAqIHNjc2lfZGV2aWNlLmlkIGV2ZW50dWFsbHkgKi8KQEAgLTI4NCw3ICszMDIsNiBAQAogI2RlZmluZSBTQ1NJX0RFRkFVTFRfVEFSR0VUX0JMT0NLRUQJMwogCiAJY2hhcgkJCXNjc2lfbGV2ZWw7Ci0Jc3RydWN0IGV4ZWN1dGVfd29yawlldzsKIAllbnVtIHNjc2lfdGFyZ2V0X3N0YXRlCXN0YXRlOwogCXZvaWQgCQkJKmhvc3RkYXRhOyAvKiBhdmFpbGFibGUgdG8gbG93LWxldmVsIGRyaXZlciAqLwogCXVuc2lnbmVkIGxvbmcJCXN0YXJnZXRfZGF0YVswXTsgLyogZm9yIHRoZSB0cmFuc3BvcnQgKi8KQEAgLTMwOSw2ICszMjYsNyBAQAogZXh0ZXJuIGludCBzY3NpX3JlZ2lzdGVyX2RldmljZV9oYW5kbGVyKHN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICpzY3NpX2RoKTsKIGV4dGVybiB2b2lkIHNjc2lfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gaW50IHNjc2lfdW5yZWdpc3Rlcl9kZXZpY2VfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqc2NzaV9kaCk7Cit2b2lkIHNjc2lfYXR0YWNoX3ZwZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogCiBleHRlcm4gaW50IHNjc2lfZGV2aWNlX2dldChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBzY3NpX2RldmljZV9wdXQoc3RydWN0IHNjc2lfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDUzMDc1ZTUuLjk0ODQ0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTE1LDYgKzE1LDcgQEAKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3Qgc2NzaV9jbW5kOwogc3RydWN0IHNjc2lfZGV2aWNlOworc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbDsKIHN0cnVjdCBzY3NpX3RhcmdldDsKIHN0cnVjdCBTY3NpX0hvc3Q7CiBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sOwpAQCAtNTI0LDYgKzUyNSwxMiBAQAogCSAqICAgc2NzaV9uZXRsaW5rLmgKIAkgKi8KIAl1NjQgdmVuZG9yX2lkOworCisJLyoKKwkgKiBBZGRpdGlvbmFsIHBlci1jb21tYW5kIGRhdGEgYWxsb2NhdGVkIGZvciB0aGUgZHJpdmVyLgorCSAqLworCXVuc2lnbmVkIGludCBjbWRfc2l6ZTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpjbWRfcG9vbDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCmluZGV4IGI3OTdlOGYuLjhjNzk5ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCkBAIC0xMzAsNiArMTMwLDcgQEAKICNkZWZpbmUgRkNfUE9SVFNQRUVEXzRHQklUCQk4CiAjZGVmaW5lIEZDX1BPUlRTUEVFRF84R0JJVAkJMHgxMAogI2RlZmluZSBGQ19QT1JUU1BFRURfMTZHQklUCQkweDIwCisjZGVmaW5lIEZDX1BPUlRTUEVFRF8zMkdCSVQJCTB4NDAKICNkZWZpbmUgRkNfUE9SVFNQRUVEX05PVF9ORUdPVElBVEVECSgxIDw8IDE1KSAvKiBTcGVlZCBub3QgZXN0YWJsaXNoZWQgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggMmExNGYxZi4uZDNmNWY4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTIyLDYgKzIyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiB3YWtlX3VwKCkgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgkJLyogc3RydWN0IG11dGV4ICovCiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4JCS8qIHN0cnVjdCByd19zZW1hcGhvcmUgKi8KQEAgLTQxLDM5ICs0MiwzMyBAQAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIHN0cnVjdCBwY2lfZGV2Owogc3RydWN0IG1vZHVsZTsKLXN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZTsKK3N0cnVjdCBjb21wbGV0aW9uOwogCiAvKiBkZXZpY2UgYWxsb2NhdGlvbiBzdHVmZiAqLwogCi0jZGVmaW5lIFNORFJWX0RFVl9UWVBFX1JBTkdFX1NJWkUJCTB4MTAwMAorLyogdHlwZSBvZiB0aGUgb2JqZWN0IHVzZWQgaW4gc25kX2RldmljZV8qKCkKKyAqIHRoaXMgYWxzbyBkZWZpbmVzIHRoZSBjYWxsaW5nIG9yZGVyCisgKi8KK2VudW0gc25kX2RldmljZV90eXBlIHsKKwlTTkRSVl9ERVZfTE9XTEVWRUwsCisJU05EUlZfREVWX0NPTlRST0wsCisJU05EUlZfREVWX0lORk8sCisJU05EUlZfREVWX0JVUywKKwlTTkRSVl9ERVZfQ09ERUMsCisJU05EUlZfREVWX1BDTSwKKwlTTkRSVl9ERVZfQ09NUFJFU1MsCisJU05EUlZfREVWX1JBV01JREksCisJU05EUlZfREVWX1RJTUVSLAorCVNORFJWX0RFVl9TRVFVRU5DRVIsCisJU05EUlZfREVWX0hXREVQLAorCVNORFJWX0RFVl9KQUNLLAorfTsKIAotdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2VfdHlwZV90OwotI2RlZmluZQlTTkRSVl9ERVZfVE9QTEVWRUwJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAwKQotI2RlZmluZQlTTkRSVl9ERVZfQ09OVFJPTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDEpCi0jZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTF9QUkUJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAyKQotI2RlZmluZQlTTkRSVl9ERVZfTE9XTEVWRUxfTk9STUFMICgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDAwKQotI2RlZmluZQlTTkRSVl9ERVZfUENNCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwMSkKLSNkZWZpbmUJU05EUlZfREVWX1JBV01JREkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDIpCi0jZGVmaW5lCVNORFJWX0RFVl9USU1FUgkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDMpCi0jZGVmaW5lCVNORFJWX0RFVl9TRVFVRU5DRVIJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDQpCi0jZGVmaW5lCVNORFJWX0RFVl9IV0RFUAkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDUpCi0jZGVmaW5lCVNORFJWX0RFVl9JTkZPCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwNikKLSNkZWZpbmUJU05EUlZfREVWX0JVUwkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDcpCi0jZGVmaW5lCVNORFJWX0RFVl9DT0RFQwkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDgpCi0jZGVmaW5lCVNORFJWX0RFVl9KQUNLICAgICAgICAgICgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDA5KQotI2RlZmluZQlTTkRSVl9ERVZfQ09NUFJFU1MJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMEEpCi0jZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MjAwMCkKLQotdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2Vfc3RhdGVfdDsKLSNkZWZpbmUJU05EUlZfREVWX0JVSUxECQkoKF9fZm9yY2Ugc25kX2RldmljZV9zdGF0ZV90KSAwKQotI2RlZmluZQlTTkRSVl9ERVZfUkVHSVNURVJFRAkoKF9fZm9yY2Ugc25kX2RldmljZV9zdGF0ZV90KSAxKQotI2RlZmluZQlTTkRSVl9ERVZfRElTQ09OTkVDVEVECSgoX19mb3JjZSBzbmRfZGV2aWNlX3N0YXRlX3QpIDIpCi0KLXR5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfZGV2aWNlX2NtZF90OwotI2RlZmluZQlTTkRSVl9ERVZfQ01EX1BSRQkoKF9fZm9yY2Ugc25kX2RldmljZV9jbWRfdCkgMCkKLSNkZWZpbmUJU05EUlZfREVWX0NNRF9OT1JNQUwJKChfX2ZvcmNlIHNuZF9kZXZpY2VfY21kX3QpIDEpCQotI2RlZmluZQlTTkRSVl9ERVZfQ01EX1BPU1QJKChfX2ZvcmNlIHNuZF9kZXZpY2VfY21kX3QpIDIpCitlbnVtIHNuZF9kZXZpY2Vfc3RhdGUgeworCVNORFJWX0RFVl9CVUlMRCwKKwlTTkRSVl9ERVZfUkVHSVNURVJFRCwKKwlTTkRSVl9ERVZfRElTQ09OTkVDVEVELAorfTsKIAogc3RydWN0IHNuZF9kZXZpY2U7CiAKQEAgLTg2LDggKzgxLDggQEAKIHN0cnVjdCBzbmRfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IG9mIHJlZ2lzdGVyZWQgZGV2aWNlcyAqLwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsJCS8qIGNhcmQgd2hpY2ggaG9sZHMgdGhpcyBkZXZpY2UgKi8KLQlzbmRfZGV2aWNlX3N0YXRlX3Qgc3RhdGU7CS8qIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KLQlzbmRfZGV2aWNlX3R5cGVfdCB0eXBlOwkJLyogZGV2aWNlIHR5cGUgKi8KKwllbnVtIHNuZF9kZXZpY2Vfc3RhdGUgc3RhdGU7CS8qIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KKwllbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlOwkvKiBkZXZpY2UgdHlwZSAqLwogCXZvaWQgKmRldmljZV9kYXRhOwkJLyogZGV2aWNlIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBzbmRfZGV2aWNlX29wcyAqb3BzOwkvKiBvcGVyYXRpb25zICovCiB9OwpAQCAtMTMxLDExICsxMjYsMTAgQEAKIAkJCQkJCQkJc3RhdGUgKi8KIAlzcGlubG9ja190IGZpbGVzX2xvY2s7CQkvKiBsb2NrIHRoZSBmaWxlcyBmb3IgdGhpcyBjYXJkICovCiAJaW50IHNodXRkb3duOwkJCS8qIHRoaXMgY2FyZCBpcyBnb2luZyBkb3duICovCi0JaW50IGZyZWVfb25fbGFzdF9jbG9zZTsJCS8qIGZyZWUgaW4gY29udGV4dCBvZiBmaWxlX3JlbGVhc2UgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl9zbGVlcDsKLQlhdG9taWNfdCByZWZjb3VudDsJCS8qIHJlZmNvdW50IGZvciBkaXNjb25uZWN0aW9uICovCisJc3RydWN0IGNvbXBsZXRpb24gKnJlbGVhc2VfY29tcGxldGlvbjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBkZXZpY2UgYXNzaWduZWQgdG8gdGhpcyBjYXJkICovCi0Jc3RydWN0IGRldmljZSAqY2FyZF9kZXY7CS8qIGNhcmRYIG9iamVjdCBmb3Igc3lzZnMgKi8KKwlzdHJ1Y3QgZGV2aWNlIGNhcmRfZGV2OwkJLyogY2FyZFggb2JqZWN0IGZvciBzeXNmcyAqLworCWJvb2wgcmVnaXN0ZXJlZDsJCS8qIGNhcmRfZGV2IGlzIHJlZ2lzdGVyZWQ/ICovCiAKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGU7CS8qIHBvd2VyIHN0YXRlICovCkBAIC0xNDksNiArMTQzLDggQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBkZXZfdG9fc25kX2NhcmQocCkJY29udGFpbmVyX29mKHAsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpCisKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfcG93ZXJfbG9jayhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CkBAIC0xOTcsNyArMTkzLDcgQEAKIC8qIHJldHVybiBhIGRldmljZSBwb2ludGVyIGxpbmtlZCB0byBlYWNoIHNvdW5kIGRldmljZSBhcyBhIHBhcmVudCAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzbmRfY2FyZF9nZXRfZGV2aWNlX2xpbmsoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXJldHVybiBjYXJkID8gY2FyZC0+Y2FyZF9kZXYgOiBOVUxMOworCXJldHVybiBjYXJkID8gJmNhcmQtPmNhcmRfZGV2IDogTlVMTDsKIH0KIAogLyogc291bmQuYyAqLwpAQCAtMjQ0LDEzICsyNDAsMTEgQEAKIAogaW50IHNuZF91bnJlZ2lzdGVyX2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIHZvaWQgKnNuZF9sb29rdXBfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKLWludCBzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CitzdHJ1Y3QgZGV2aWNlICpzbmRfZ2V0X2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIAogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAogaW50IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lKTsKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKIGludCBzbmRfdW5yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYpOwogdm9pZCAqc25kX2xvb2t1cF9vc3NfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKICNlbmRpZgpAQCAtMjg0LDkgKzI3OCwxNiBAQAogZXh0ZXJuIGludCAoKnNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBjbWQpOwogI2VuZGlmCiAKLWludCBzbmRfY2FyZF9jcmVhdGUoaW50IGlkeCwgY29uc3QgY2hhciAqaWQsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAotCQkgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZF9yZXQpOworaW50IHNuZF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCwKKwkJIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgaW50IGV4dHJhX3NpemUsCisJCSBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkX3JldCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZAorc25kX2NhcmRfY3JlYXRlKGludCBpZHgsIGNvbnN0IGNoYXIgKmlkLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAorCQlzdHJ1Y3Qgc25kX2NhcmQgKipyZXQpCit7CisJcmV0dXJuIHNuZF9jYXJkX25ldyhOVUxMLCBpZHgsIGlkLCBtb2R1bGUsIGV4dHJhX3NpemUsIHJldCk7Cit9CiAKIGludCBzbmRfY2FyZF9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CiBpbnQgc25kX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpOwpAQCAtMjk4LDIwICsyOTksMTkgQEAKIGludCBzbmRfY29tcG9uZW50X2FkZChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGNvbnN0IGNoYXIgKmNvbXBvbmVudCk7CiBpbnQgc25kX2NhcmRfZmlsZV9hZGQoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBpbnQgc25kX2NhcmRfZmlsZV9yZW1vdmUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci12b2lkIHNuZF9jYXJkX3VucmVmKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CisjZGVmaW5lIHNuZF9jYXJkX3VucmVmKGNhcmQpCXB1dF9kZXZpY2UoJihjYXJkKS0+Y2FyZF9kZXYpCiAKICNkZWZpbmUgc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpICgoY2FyZCktPmRldiA9IChkZXZwdHIpKQogCiAvKiBkZXZpY2UuYyAqLwogCi1pbnQgc25kX2RldmljZV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAoraW50IHNuZF9kZXZpY2VfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgZW51bSBzbmRfZGV2aWNlX3R5cGUgdHlwZSwKIAkJICAgdm9pZCAqZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqb3BzKTsKIGludCBzbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwogaW50IHNuZF9kZXZpY2VfcmVnaXN0ZXJfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7Ci1pbnQgc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKLWludCBzbmRfZGV2aWNlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSk7Ci1pbnQgc25kX2RldmljZV9mcmVlX2FsbChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHNuZF9kZXZpY2VfY21kX3QgY21kKTsKK3ZvaWQgc25kX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwordm9pZCBzbmRfZGV2aWNlX2ZyZWVfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CiAKIC8qIGlzYWRtYS5jICovCiAKQEAgLTQzMyw3ICs0MzMsNiBAQAogI2RlZmluZSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdwKSAoZ3ApLT5wb3J0X2RhdGEKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1BDSQogLyogUENJIHF1aXJrIGxpc3QgaGVscGVyICovCiBzdHJ1Y3Qgc25kX3BjaV9xdWlyayB7CiAJdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yOwkvKiBQQ0kgc3VidmVuZG9yIElEICovCkBAIC00NjksMTIgKzQ2OCwyNiBAQAogI2RlZmluZSBzbmRfcGNpX3F1aXJrX25hbWUocSkJIiIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgogc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpOwogCiBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqCiBzbmRfcGNpX3F1aXJrX2xvb2t1cF9pZCh1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAogCQkJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXBfaWQodTE2IHZlbmRvciwgdTE2IGRldmljZSwKKwkJCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpsaXN0KQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX1NPVU5EX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmggYi9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaAppbmRleCBkZmI0MmNhLi5jNDY5MDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaAorKysgYi9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaApAQCAtNDM2LDggKzQzNiw2IEBACiAjZGVmaW5lIENDQ0FfQ1VSUkFERFJfTUFTSwkweDAwZmZmZmZmCS8qIEN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbAkJKi8KICNkZWZpbmUgQ0NDQV9DVVJSQUREUgkJMHgxODAwMDAwOAogCi0vKiB1bmRlZmluZSBDQ1IgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCB0aGUgZGVmaW5pdGlvbiBmb3IgU0ggKi8KLSN1bmRlZiBDQ1IKICNkZWZpbmUgQ0NSCQkJMHgwOQkJLyogQ2FjaGUgY29udHJvbCByZWdpc3RlcgkJCQkqLwogI2RlZmluZSBDQ1JfQ0FDSEVJTlZBTElEU0laRQkweDA3MTkwMDA5CiAjZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFX01BU0sJMHhmZTAwMDAwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGNhY2hlIGZvciB0aGlzIGNoYW5uZWwgICAgCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2h3ZGVwLmggYi9pbmNsdWRlL3NvdW5kL2h3ZGVwLmgKaW5kZXggOGMwNWU0N2EuLmFlMDRhM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaHdkZXAuaAorKysgYi9pbmNsdWRlL3NvdW5kL2h3ZGVwLmgKQEAgLTYwLDcgKzYwLDYgQEAKIAlpbnQgaWZhY2U7CiAKICNpZmRlZiBDT05GSUdfU05EX09TU0VNVUwKLQljaGFyIG9zc19kZXZbMzJdOwogCWludCBvc3NfdHlwZTsKIAlpbnQgb3NzcmVnOwogI2VuZGlmCkBAIC02OSw2ICs2OCw4IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAl2b2lkICgqcHJpdmF0ZV9mcmVlKSAoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogCiAJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7CiAJaW50IHVzZWQ7CQkJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtLmggYi9pbmNsdWRlL3NvdW5kL3BjbS5oCmluZGV4IDQ4ODM0OTkuLmI0ZDY2OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY20uaApAQCAtMTE0MSw0ICsxMTQxLDEyIEBACiAJcmV0dXJuIDFVTEwgPDwgKF9fZm9yY2UgaW50KSBwY21fZm9ybWF0OwogfQogCisvKiBwcmludGsgaGVscGVycyAqLworI2RlZmluZSBwY21fZXJyKHBjbSwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2VycigocGNtKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgcGNtX3dhcm4ocGNtLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2FybigocGNtKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgcGNtX2RiZyhwY20sIGZtdCwgYXJncy4uLikgXAorCWRldl9kYmcoKHBjbSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisKICNlbmRpZiAvKiBfX1NPVU5EX1BDTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaCBiL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCmluZGV4IGFkZjA4ODUuLjMxMWRhZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCisrKyBiL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCkBAIC0xNTcsMTAgKzE1Nyw4IEBACiAKIC8qIGNhbGxiYWNrcyAqLwogCi12b2lkIHNuZF9yYXdtaWRpX3JlY2VpdmVfcmVzZXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfcmF3bWlkaV9yZWNlaXZlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGNvdW50KTsKLXZvaWQgc25kX3Jhd21pZGlfdHJhbnNtaXRfcmVzZXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogaW50IHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWsoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9yY2FyX3NuZC5oIGIvaW5jbHVkZS9zb3VuZC9yY2FyX3NuZC5oCmluZGV4IDZhZGQ2Y2MuLjM0YTNjMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcmNhcl9zbmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3JjYXJfc25kLmgKQEAgLTM0LDE3ICszNCwxNyBAQAogICogQiA6IFNTSSBkaXJlY3Rpb24KICAqLwogI2RlZmluZSBSU05EX1NTSV9DTEtfUElOX1NIQVJFCQkoMSA8PCAzMSkKLSNkZWZpbmUgUlNORF9TU0lfU1lOQwkJCSgxIDw8IDI5KSAvKiBTU0kzNF9zeW5jIGV0YyAqLwotCiAjZGVmaW5lIFJTTkRfU1NJX1BMQVkJCQkoMSA8PCAyNCkKIAorI2RlZmluZSBSU05EX1NTSShfZG1hX2lkLCBfcGlvX2lycSwgX2ZsYWdzKQkJXAoreyAuZG1hX2lkID0gX2RtYV9pZCwgLnBpb19pcnEgPSBfcGlvX2lycSwgLmZsYWdzID0gX2ZsYWdzIH0KICNkZWZpbmUgUlNORF9TU0lfU0VUKF9kYWlfaWQsIF9kbWFfaWQsIF9waW9faXJxLCBfZmxhZ3MpCVwKIHsgLmRhaV9pZCA9IF9kYWlfaWQsIC5kbWFfaWQgPSBfZG1hX2lkLCAucGlvX2lycSA9IF9waW9faXJxLCAuZmxhZ3MgPSBfZmxhZ3MgfQogI2RlZmluZSBSU05EX1NTSV9VTlVTRUQgXAogeyAuZGFpX2lkID0gLTEsIC5kbWFfaWQgPSAtMSwgLnBpb19pcnEgPSAtMSwgLmZsYWdzID0gMCB9CiAKIHN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvIHsKLQlpbnQgZGFpX2lkOworCWludCBkYWlfaWQ7CS8qIHdpbGwgYmUgcmVtb3ZlZCAqLwogCWludCBkbWFfaWQ7CiAJaW50IHBpb19pcnE7CiAJdTMyIGZsYWdzOwpAQCAtNTUsOSArNTUsMzEgQEAKICAqLwogI2RlZmluZSBSU05EX1NDVV9VU0VfSFBCSUYJCSgxIDw8IDMxKSAvKiBpdCBuZWVkcyBSU05EX1NTSV9ERVBFTkRFTlQgKi8KIAotc3RydWN0IHJzbmRfc2N1X3BsYXRmb3JtX2luZm8geworI2RlZmluZSBSU05EX1NSQyhyYXRlLCBfZG1hX2lkKQkJCQkJCVwKK3sgLmZsYWdzID0gUlNORF9TQ1VfVVNFX0hQQklGLCAuY29udmVydF9yYXRlID0gcmF0ZSwgLmRtYV9pZCA9IF9kbWFfaWQsIH0KKyNkZWZpbmUgUlNORF9TUkNfU0VUKHJhdGUsIF9kbWFfaWQpCQlcCisJeyAuZmxhZ3MgPSBSU05EX1NDVV9VU0VfSFBCSUYsIC5jb252ZXJ0X3JhdGUgPSByYXRlLCAuZG1hX2lkID0gX2RtYV9pZCwgfQorI2RlZmluZSBSU05EX1NSQ19VTlVTRUQJCQkJXAorCXsgLmZsYWdzID0gMCwgLmNvbnZlcnRfcmF0ZSA9IDAsIC5kbWFfaWQgPSAwLCB9CisKKyNkZWZpbmUgcnNuZF9zY3VfcGxhdGZvcm1faW5mbwlyc25kX3NyY19wbGF0Zm9ybV9pbmZvCisjZGVmaW5lIHNyY19pbmZvCQlzY3VfaW5mbworI2RlZmluZSBzcmNfaW5mb19ucgkJc2N1X2luZm9fbnIKKworc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gewogCXUzMiBmbGFnczsKIAl1MzIgY29udmVydF9yYXRlOyAvKiBzYW1wbGluZyByYXRlIGNvbnZlcnQgKi8KKwlpbnQgZG1hX2lkOyAvKiBmb3IgR2VuMiBTQ1UgKi8KK307CisKK3N0cnVjdCByc25kX2RhaV9wYXRoX2luZm8geworCXN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvICpzc2k7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKnNyYzsKK307CisKK3N0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvIHsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGF0aF9pbmZvIHBsYXliYWNrOworCXN0cnVjdCByc25kX2RhaV9wYXRoX2luZm8gY2FwdHVyZTsKIH07CiAKIC8qCkBAIC03NSw4ICs5NywxMCBAQAogCXUzMiBmbGFnczsKIAlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqc3NpX2luZm87CiAJaW50IHNzaV9pbmZvX25yOwotCXN0cnVjdCByc25kX3NjdV9wbGF0Zm9ybV9pbmZvICpzY3VfaW5mbzsKLQlpbnQgc2N1X2luZm9fbnI7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKnNyY19pbmZvOworCWludCBzcmNfaW5mb19ucjsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm87CisJaW50IGRhaV9pbmZvX25yOwogCWludCAoKnN0YXJ0KShpbnQgaWQpOwogCWludCAoKnN0b3ApKGludCBpZCk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oIGIvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oCmluZGV4IDZjNzQ1MjcuLjliMGFjNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2ltcGxlX2NhcmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkLmgKQEAgLTE4LDYgKzE4LDggQEAKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBmbXQ7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKKwlpbnQgc2xvdHM7CisJaW50IHNsb3Rfd2lkdGg7CiB9OwogCiBzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9pbmZvIHsKQEAgLTI5LDEwICszMSw2IEBACiAJdW5zaWduZWQgaW50IGRhaWZtdDsKIAlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpIGNwdV9kYWk7CiAJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSBjb2RlY19kYWk7Ci0KLQkvKiB1c2VkIGluIHNpbXBsZS1jYXJkLmMgKi8KLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbmRfbGluazsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9jYXJkOwogfTsKIAogI2VuZGlmIC8qIF9fU0lNUExFX0NBUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAppbmRleCA3MWYyN2M0Li5mYWQ3Njc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaApAQCAtMTQyLDYgKzE0Miw4IEBACiAJICogQ2FsbGVkIGJ5IHNvY19jYXJkIGRyaXZlcnMsIG5vcm1hbGx5IGluIHRoZWlyIGh3X3BhcmFtcy4KIAkgKi8KIAlpbnQgKCpzZXRfZm10KShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCk7CisJaW50ICgqeGxhdGVfdGRtX3Nsb3RfbWFzaykodW5zaWduZWQgaW50IHNsb3RzLAorCQl1bnNpZ25lZCBpbnQgKnR4X21hc2ssIHVuc2lnbmVkIGludCAqcnhfbWFzayk7CiAJaW50ICgqc2V0X3RkbV9zbG90KShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKIAkJdW5zaWduZWQgaW50IHR4X21hc2ssIHVuc2lnbmVkIGludCByeF9tYXNrLAogCQlpbnQgc2xvdHMsIGludCBzbG90X3dpZHRoKTsKQEAgLTI3MCw2ICsyNzIsNyBAQAogCS8qIHBhcmVudCBwbGF0Zm9ybS9jb2RlYyAqLwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKaW5kZXggNmU4OWVmNi4uZWY3OGY1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApAQCAtMTA4LDEzICsxMDgsOSBAQAogCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAogCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX3ZpcnRfbXV4LCAubmFtZSA9IHduYW1lLCBcCi0JU05EX1NPQ19EQVBNX0lOSVRfUkVHX1ZBTCh3cmVnLCB3c2hpZnQsIHdpbnZlcnQpLCBcCi0JLmtjb250cm9sX25ld3MgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMX0KKwlTTkRfU09DX0RBUE1fTVVYKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scykKICNkZWZpbmUgU05EX1NPQ19EQVBNX1ZBTFVFX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX3ZhbHVlX211eCwgLm5hbWUgPSB3bmFtZSwgXAotCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAotCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisJU05EX1NPQ19EQVBNX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpCiAKIC8qIFNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgYWJvdmUgbWFjcm9zLCBhc3N1bWluZyB3bmNvbnRyb2xzID0gQVJSQVlfU0laRSh3Y29udHJvbHMpICovCiAjZGVmaW5lIFNPQ19QR0FfQVJSQVkod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCxcCkBAIC0xNzIsMTAgKzE2OCw4IEBACiAJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWF9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXAogCXdldmVudCwgd2ZsYWdzKSBcCi17CS5pZCA9IHNuZF9zb2NfZGFwbV92aXJ0X211eCwgLm5hbWUgPSB3bmFtZSwgXAotCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAotCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDEsIFwKLQkuZXZlbnQgPSB3ZXZlbnQsIC5ldmVudF9mbGFncyA9IHdmbGFnc30KKwlTTkRfU09DX0RBUE1fTVVYX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCB3ZXZlbnQsIFwKKwkJd2ZsYWdzKQogCiAvKiBhZGRpdGlvbmFsIHNlcXVlbmNpbmcgY29udHJvbCB3aXRoaW4gYW4gZXZlbnQgdHlwZSAqLwogI2RlZmluZSBTTkRfU09DX0RBUE1fUEdBX1Mod25hbWUsIHdzdWJzZXEsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgXApAQCAtMzExLDEyICszMDUsOCBAQAogIAkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgXAogIAkucHV0ID0gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSwgXAogICAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQotI2RlZmluZSBTT0NfREFQTV9FTlVNX1ZJUlQoeG5hbWUsIHhlbnVtKQkJICAgIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAotCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X2VudW1fdmlydCwgXAotCS5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X2VudW1fdmlydCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKyNkZWZpbmUgU09DX0RBUE1fRU5VTV9WSVJUKHhuYW1lLCB4ZW51bSkgXAorCVNPQ19EQVBNX0VOVU0oeG5hbWUsIHhlbnVtKQogI2RlZmluZSBTT0NfREFQTV9FTlVNX0VYVCh4bmFtZSwgeGVudW0sIHhnZXQsIHhwdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXApAQCAtMzI0LDExICszMTQsNyBAQAogCS5wdXQgPSB4cHV0LCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfREFQTV9WQUxVRV9FTlVNKHhuYW1lLCB4ZW51bSkgXAotewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCi0JLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUsIFwKLQkucHV0ID0gc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKwlTT0NfREFQTV9FTlVNKHhuYW1lLCB4ZW51bSkKICNkZWZpbmUgU09DX0RBUE1fUElOX1NXSVRDSCh4bmFtZSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSAiIFN3aXRjaCIsIFwKIAkuaW5mbyA9IHNuZF9zb2NfZGFwbV9pbmZvX3Bpbl9zd2l0Y2gsIFwKQEAgLTM5MiwxNCArMzc4LDYgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci1pbnQgc25kX3NvY19kYXBtX2dldF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfZGFwbV9wdXRfZW51bV92aXJ0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX2RhcG1faW5mb19waW5fc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKQEAgLTQ2MSw2ICs0MzksNyBAQAogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJY29uc3QgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fc3luYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pOworaW50IHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSk7CiBpbnQgc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJCSAgY29uc3QgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCkBAIC00NzAsNyArNDQ5LDYgQEAKIHZvaWQgc25kX3NvY19kYXBtX2F1dG9fbmNfY29kZWNfcGlucyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogCiAvKiBNb3N0bHkgaW50ZXJuYWwgLSBzaG91bGQgbm90IG5vcm1hbGx5IGJlIHVzZWQgKi8KLXZvaWQgZGFwbV9tYXJrX2RpcnR5KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBjb25zdCBjaGFyICpyZWFzb24pOwogdm9pZCBkYXBtX21hcmtfaW9fZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKIAogLyogZGFwbSBwYXRoIHF1ZXJ5ICovCkBAIC00ODQsOCArNDYyLDYgQEAKIAlzbmRfc29jX2RhcG1faW5wdXQgPSAwLAkJLyogaW5wdXQgcGluICovCiAJc25kX3NvY19kYXBtX291dHB1dCwJCS8qIG91dHB1dCBwaW4gKi8KIAlzbmRfc29jX2RhcG1fbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KLQlzbmRfc29jX2RhcG1fdmlydF9tdXgsCQkJLyogdmlydHVhbCB2ZXJzaW9uIG9mIHNuZF9zb2NfZGFwbV9tdXggKi8KLQlzbmRfc29jX2RhcG1fdmFsdWVfbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KIAlzbmRfc29jX2RhcG1fbWl4ZXIsCQkJLyogbWl4ZXMgc2V2ZXJhbCBhbmFsb2cgc2lnbmFscyB0b2dldGhlciAqLwogCXNuZF9zb2NfZGFwbV9taXhlcl9uYW1lZF9jdGwsCQkvKiBtaXhlciB3aXRoIG5hbWVkIGNvbnRyb2xzICovCiAJc25kX3NvY19kYXBtX3BnYSwJCQkvKiBwcm9ncmFtbWFibGUgZ2Fpbi9hdHRlbnVhdGlvbiAodm9sdW1lKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggOWEwMDE0Ny4uMGI4MzE2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC00NSw2ICs0NSwxMSBAQAogCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAogCXsucmVnID0geGxyZWcsIC5ycmVnID0geHJyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAogCS5tYXggPSB4bWF4LCAucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQorI2RlZmluZSBTT0NfRE9VQkxFX1JfU19WQUxVRSh4bHJlZywgeHJyZWcsIHhzaGlmdCwgeG1pbiwgeG1heCwgeHNpZ25fYml0LCB4aW52ZXJ0KSBcCisJKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCisJey5yZWcgPSB4bHJlZywgLnJyZWcgPSB4cnJlZywgLnNoaWZ0ID0geHNoaWZ0LCAucnNoaWZ0ID0geHNoaWZ0LCBcCisJLm1heCA9IHhtYXgsIC5taW4gPSB4bWluLCAucGxhdGZvcm1fbWF4ID0geG1heCwgLnNpZ25fYml0ID0geHNpZ25fYml0LCBcCisJLmludmVydCA9IHhpbnZlcnR9KQogI2RlZmluZSBTT0NfRE9VQkxFX1JfUkFOR0VfVkFMVUUoeGxyZWcsIHhycmVnLCB4c2hpZnQsIHhtaW4sIHhtYXgsIHhpbnZlcnQpIFwKIAkoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKIAl7LnJlZyA9IHhscmVnLCAucnJlZyA9IHhycmVnLCAuc2hpZnQgPSB4c2hpZnQsIC5yc2hpZnQgPSB4c2hpZnQsIFwKQEAgLTE1Miw2ICsxNTcsMTUgQEAKIAkJey5yZWcgPSB4cmVnLCAucnJlZyA9IHhycmVnLCBcCiAJCS5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAogCQkubWF4ID0geG1heCwgLm1pbiA9IHhtaW59IH0KKyNkZWZpbmUgU09DX0RPVUJMRV9SX1NfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtaW4sIHhtYXgsIHhzaWduX2JpdCwgeGludmVydCwgdGx2X2FycmF5KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKKwkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAorCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKKwkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csIC5wdXQgPSBzbmRfc29jX3B1dF92b2xzdywgXAorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9SX1NfVkFMVUUocmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCBcCisJCQkJCSAgICB4bWluLCB4bWF4LCB4c2lnbl9iaXQsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHhyZWcsIHhtaW4sIHhtYXgsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCkBAIC0xNjIsMzAgKzE3NiwyOCBAQAogCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKIAkJey5yZWcgPSB4cmVnLCAubWluID0geG1pbiwgLm1heCA9IHhtYXgsIFwKIAkJIC5wbGF0Zm9ybV9tYXggPSB4bWF4fSB9Ci0jZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXgsIHh0ZXh0cykgXAorI2RlZmluZSBTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4aXRlbXMsIHh0ZXh0cykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIFwKLQkubWFzayA9IHhtYXggPyByb3VuZHVwX3Bvd19vZl90d28oeG1heCkgLSAxIDogMH0KLSNkZWZpbmUgU09DX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1heCwgeHRleHRzKSBcCi0JU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWF4LCB4dGV4dHMpCi0jZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFQoeG1heCwgeHRleHRzKSBcCi17CS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMgfQotI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCisJLml0ZW1zID0geGl0ZW1zLCAudGV4dHMgPSB4dGV4dHMsIFwKKwkubWFzayA9IHhpdGVtcyA/IHJvdW5kdXBfcG93X29mX3R3byh4aXRlbXMpIC0gMSA6IDB9CisjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhpdGVtcywgeHRleHRzKSBcCisJU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4aXRlbXMsIHh0ZXh0cykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX0VYVCh4aXRlbXMsIHh0ZXh0cykgXAorewkuaXRlbXMgPSB4aXRlbXMsIC50ZXh0cyA9IHh0ZXh0cyB9CisjZGVmaW5lIFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4aXRlbXMsIHh0ZXh0cywgeHZhbHVlcykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXNrID0geG1hc2ssIC5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIC52YWx1ZXMgPSB4dmFsdWVzfQotI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCi0JU09DX1ZBTFVFX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKQorCS5tYXNrID0geG1hc2ssIC5pdGVtcyA9IHhpdGVtcywgLnRleHRzID0geHRleHRzLCAudmFsdWVzID0geHZhbHVlc30KKyNkZWZpbmUgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhuaXRtZXMsIHh0ZXh0cywgeHZhbHVlcykgXAorCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHhuaXRtZXMsIHh0ZXh0cywgeHZhbHVlcykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX1ZJUlQoeGl0ZW1zLCB4dGV4dHMpIFwKKwlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCB4aXRlbXMsIHh0ZXh0cykKICNkZWZpbmUgU09DX0VOVU0oeG5hbWUsIHhlbnVtKSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAogCS5nZXQgPSBzbmRfc29jX2dldF9lbnVtX2RvdWJsZSwgLnB1dCA9IHNuZF9zb2NfcHV0X2VudW1fZG91YmxlLCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTSh4bmFtZSwgeGVudW0pIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsXAotCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCi0JLnB1dCA9IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlLCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorCVNPQ19FTlVNKHhuYW1lLCB4ZW51bSkKICNkZWZpbmUgU09DX1NJTkdMRV9FWFQoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCxcCiAJIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCkBAIC0yNzIsMTcgKzI4NCwxOSBAQAogICogQVJSQVlfU0laRSBpbnRlcm5hbGx5CiAgKi8KICNkZWZpbmUgU09DX0VOVU1fRE9VQkxFX0RFQ0wobmFtZSwgeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4dGV4dHMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIFwKKwljb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIFwKIAkJCQkJCUFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogI2RlZmluZSBTT0NfRU5VTV9TSU5HTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHh0ZXh0cykgXAogCVNPQ19FTlVNX0RPVUJMRV9ERUNMKG5hbWUsIHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4dGV4dHMpCiAjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChuYW1lLCB4dGV4dHMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh4dGV4dHMpLCB4dGV4dHMpCisJY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hbWUgPSBTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMsIHh2YWx1ZXMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCBcCisJY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hbWUgPSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgXAogCQkJCQkJCUFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzLCB4dmFsdWVzKQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMsIHh2YWx1ZXMpIFwKIAlTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cywgeHZhbHVlcykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChuYW1lLCB4dGV4dHMpIFwKKwljb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX1NJTkdMRV9WSVJUKEFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogCiAvKgogICogQ29tcG9uZW50IHByb2JlIGFuZCByZW1vdmUgb3JkZXJpbmcgbGV2ZWxzIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZQpAQCAtMzQwLDEyICszNTQsNiBAQAogCiBleHRlcm4gc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgKnNvY19hYzk3X29wczsKIAotZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSB7Ci0JU05EX1NPQ19JMkMgPSAxLAotCVNORF9TT0NfU1BJLAotCVNORF9TT0NfUkVHTUFQLAotfTsKLQogZW51bSBzbmRfc29jX3BjbV9zdWJjbGFzcyB7CiAJU05EX1NPQ19QQ01fQ0xBU1NfUENNCT0gMCwKIAlTTkRfU09DX1BDTV9DTEFTU19CRQk9IDEsCkBAIC0zOTIsOCArNDAwLDcgQEAKIGludCBzbmRfc29jX2NvZGVjX3dyaXRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgICAgdW5zaWduZWQgaW50IHJlZyk7CiBpbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCi0JCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKTsKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOwogaW50IHNuZF9zb2NfY2FjaGVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogaW50IHNuZF9zb2NfY2FjaGVfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogaW50IHNuZF9zb2NfY2FjaGVfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwpAQCAtNDEzLDYgKzQyMCwxMCBAQAogc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCWNvbnN0IGNoYXIgKmRhaV9saW5rKTsKIAorYm9vbCBzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpOwordm9pZCBzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IHN0cmVhbSk7Cit2b2lkIHNuZF9zb2NfcnVudGltZV9kZWFjdGl2YXRlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsIGludCBzdHJlYW0pOworCiAvKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBnZXQgY2xvY2sgcmF0ZXMgZnJvbSB2YXJpb3VzIHRoaW5ncyAqLwogaW50IHNuZF9zb2NfY2FsY19mcmFtZV9zaXplKGludCBzYW1wbGVfc2l6ZSwgaW50IGNoYW5uZWxzLCBpbnQgdGRtX3Nsb3RzKTsKIGludCBzbmRfc29jX3BhcmFtc190b19mcmFtZV9zaXplKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKQEAgLTQ5NiwxMCArNTA3LDYgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19pbmZvX3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogI2RlZmluZSBzbmRfc29jX2luZm9fYm9vbF9leHQJCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KQEAgLTYwMCw3ICs2MDcsOCBAQAogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCi0JaW50ICgqamFja19zdGF0dXNfY2hlY2spKHZvaWQpOworCXZvaWQgKmRhdGE7CisJaW50ICgqamFja19zdGF0dXNfY2hlY2spKHZvaWQgKmRhdGEpOwogfTsKIAogc3RydWN0IHNuZF9zb2NfamFjayB7CkBAIC02NTYsMTIgKzY2NCwxOSBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGlkOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXVuc2lnbmVkIGludCBhY3RpdmU7CisKKwl1bnNpZ25lZCBpbnQgaWdub3JlX3BtZG93bl90aW1lOjE7IC8qIHBtZG93bl90aW1lIGlzIGlnbm9yZWQgYXQgc3RvcCAqLworCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKIAlpbnQgbnVtX2RhaTsKIAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgKmRyaXZlcjsKKworCXN0cnVjdCBsaXN0X2hlYWQgZGFpX2xpc3Q7CiB9OwogCiAvKiBTb0MgQXVkaW8gQ29kZWMgZGV2aWNlICovCkBAIC02ODMsNyArNjk4LDYgQEAKIAogCS8qIHJ1bnRpbWUgKi8KIAlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7ICAvKiBmb3IgYWQtaG9jIGFjOTcgZGV2aWNlcyAqLwotCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJdW5zaWduZWQgaW50IGNhY2hlX2J5cGFzczoxOyAvKiBTdXBwcmVzcyBhY2Nlc3MgdG8gdGhlIGNhY2hlICovCiAJdW5zaWduZWQgaW50IHN1c3BlbmRlZDoxOyAvKiBDb2RlYyBpcyBpbiBzdXNwZW5kIFBNIHN0YXRlICovCiAJdW5zaWduZWQgaW50IHByb2JlZDoxOyAvKiBDb2RlYyBoYXMgYmVlbiBwcm9iZWQgKi8KQEAgLTY5Nyw3ICs3MTEsNiBAQAogCS8qIGNvZGVjIElPICovCiAJdm9pZCAqY29udHJvbF9kYXRhOyAvKiBjb2RlYyBjb250cm9sIChpMmMvM3dpcmUpIGRhdGEgKi8KIAlod193cml0ZV90IGh3X3dyaXRlOwotCXVuc2lnbmVkIGludCAoKmh3X3JlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogCXZvaWQgKnJlZ19jYWNoZTsKQEAgLTcwOSw3ICs3MjIsNiBAQAogCiAJLyogZGFwbSAqLwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCBkYXBtOwotCXVuc2lnbmVkIGludCBpZ25vcmVfcG1kb3duX3RpbWU6MTsgLyogcG1kb3duX3RpbWUgaXMgaWdub3JlZCBhdCBzdG9wICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NvZGVjX3Jvb3Q7CkBAIC0xMDY3LDYgKzEwNzksNyBAQAogCWludCBtaW4sIG1heCwgcGxhdGZvcm1fbWF4OwogCWludCByZWcsIHJyZWc7CiAJdW5zaWduZWQgaW50IHNoaWZ0LCByc2hpZnQ7CisJdW5zaWduZWQgaW50IHNpZ25fYml0OwogCXVuc2lnbmVkIGludCBpbnZlcnQ6MTsKIAl1bnNpZ25lZCBpbnQgYXV0b2Rpc2FibGU6MTsKIH07CkBAIC0xMDg1LDE2ICsxMDk4LDI4IEBACiAKIC8qIGVudW1lcmF0ZWQga2NvbnRyb2wgKi8KIHN0cnVjdCBzb2NfZW51bSB7Ci0JdW5zaWduZWQgc2hvcnQgcmVnOwotCXVuc2lnbmVkIHNob3J0IHJlZzI7CisJaW50IHJlZzsKIAl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CiAJdW5zaWduZWQgY2hhciBzaGlmdF9yOwotCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IGl0ZW1zOwogCXVuc2lnbmVkIGludCBtYXNrOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqdGV4dHM7CiAJY29uc3QgdW5zaWduZWQgaW50ICp2YWx1ZXM7CiB9OwogCisvKioKKyAqIHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKCkgLSBDYXN0cyBhIGNvbXBvbmVudCB0byB0aGUgQ09ERUMgaXQgaXMgZW1iZWRkZWQgaW4KKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgdG8gY2FzdCB0byBhIENPREVDCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZCBvbiBjb21wb25lbnRzIHRoYXQgYXJlIGtub3duIHRvIGJlIENPREVDcy4KKyAqIE90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2NvZGVjICpzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYygKKwlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNvbXBvbmVudCwgc3RydWN0IHNuZF9zb2NfY29kZWMsIGNvbXBvbmVudCk7Cit9CisKIC8qIGNvZGVjIElPICovCiB1bnNpZ25lZCBpbnQgc25kX3NvY19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZyk7CiB1bnNpZ25lZCBpbnQgc25kX3NvY193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCkBAIC0xMTY4LDExICsxMTkzLDUxIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShzdHJ1Y3Qgc29jX2VudW0gKmUsCisJdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghZS0+dmFsdWVzKQorCQlyZXR1cm4gdmFsOworCisJZm9yIChpID0gMDsgaSA8IGUtPml0ZW1zOyBpKyspCisJCWlmICh2YWwgPT0gZS0+dmFsdWVzW2ldKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX3NvY19lbnVtX2l0ZW1fdG9fdmFsKHN0cnVjdCBzb2NfZW51bSAqZSwKKwl1bnNpZ25lZCBpbnQgaXRlbSkKK3sKKwlpZiAoIWUtPnZhbHVlcykKKwkJcmV0dXJuIGl0ZW07CisKKwlyZXR1cm4gZS0+dmFsdWVzW2l0ZW1dOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc25kX3NvY19jb21wb25lbnRfaXNfYWN0aXZlKAorCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXJldHVybiBjb21wb25lbnQtPmFjdGl2ZSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc25kX3NvY19jb2RlY19pc19hY3RpdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfc29jX2NvbXBvbmVudF9pc19hY3RpdmUoJmNvZGVjLT5jb21wb25lbnQpOworfQorCiBpbnQgc25kX3NvY191dGlsX2luaXQodm9pZCk7CiB2b2lkIHNuZF9zb2NfdXRpbF9leGl0KHZvaWQpOwogCiBpbnQgc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSk7CitpbnQgc25kX3NvY19vZl9wYXJzZV9hdWRpb19zaW1wbGVfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lKTsKK2ludCBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNsb3RzLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpzbG90X3dpZHRoKTsKIGludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSk7CiB1bnNpZ25lZCBpbnQgc25kX3NvY19vZl9wYXJzZV9kYWlmbXQoc3RydWN0IGRldmljZV9ub2RlICpucCwKQEAgLTExODgsNCArMTI1MywxNSBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc25kX3NvY19wbV9vcHM7CiAKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJbXV0ZXhfbG9jaygmZGFwbS0+Y2FyZC0+ZGFwbV9tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKK3sKKwltdXRleF91bmxvY2soJmRhcG0tPmNhcmQtPmRhcG1fbXV0ZXgpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2JjYWNoZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKaW5kZXggNzExMDg5Ny4uYzljM2MwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKQEAgLTM5OSwyNiArMzk5LDQzIEBACiAKIC8qIEFsbG9jYXRvciAqLwogCi1UUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfaW52YWxpZGF0ZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgY2FjaGUgKmNhKSwKLQlUUF9BUkdTKGNhKSwKK1RSQUNFX0VWRU5UKGJjYWNoZV9pbnZhbGlkYXRlLAorCVRQX1BST1RPKHN0cnVjdCBjYWNoZSAqY2EsIHNpemVfdCBidWNrZXQpLAorCVRQX0FSR1MoY2EsIGJ1Y2tldCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlCQkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luYwkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luY19zaXplCQkpCi0JCV9fZmllbGQodW5zaWduZWQsCXVudXNlZAkJCSkKKwkJX19maWVsZCh1bnNpZ25lZCwJc2VjdG9ycwkJCSkKKwkJX19maWVsZChkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZChfX3U2NCwJCW9mZnNldAkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmZyZWUJCT0gZmlmb191c2VkKCZjYS0+ZnJlZVtSRVNFUlZFX05PTkVdKTsKLQkJX19lbnRyeS0+ZnJlZV9pbmMJPSBmaWZvX3VzZWQoJmNhLT5mcmVlX2luYyk7Ci0JCV9fZW50cnktPmZyZWVfaW5jX3NpemUJPSBjYS0+ZnJlZV9pbmMuc2l6ZTsKLQkJX19lbnRyeS0+dW51c2VkCQk9IGZpZm9fdXNlZCgmY2EtPnVudXNlZCk7CisJCV9fZW50cnktPmRldgkJPSBjYS0+YmRldi0+YmRfZGV2OworCQlfX2VudHJ5LT5vZmZzZXQJCT0gYnVja2V0IDw8IGNhLT5zZXQtPmJ1Y2tldF9iaXRzOworCQlfX2VudHJ5LT5zZWN0b3JzCT0gR0NfU0VDVE9SU19VU0VEKCZjYS0+YnVja2V0c1tidWNrZXRdKTsKIAkpLAogCi0JVFBfcHJpbnRrKCJmcmVlICV1IGZyZWVfaW5jICV1LyV1IHVudXNlZCAldSIsIF9fZW50cnktPmZyZWUsCi0JCSAgX19lbnRyeS0+ZnJlZV9pbmMsIF9fZW50cnktPmZyZWVfaW5jX3NpemUsIF9fZW50cnktPnVudXNlZCkKKwlUUF9wcmludGsoImludmFsaWRhdGVkICV1IHNlY3RvcnMgYXQgJWQsJWQgc2VjdG9yPSVsbHUiLAorCQkgIF9fZW50cnktPnNlY3RvcnMsIE1BSk9SKF9fZW50cnktPmRldiksCisJCSAgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+b2Zmc2V0KQorKTsKKworVFJBQ0VfRVZFTlQoYmNhY2hlX2FsbG9jLAorCVRQX1BST1RPKHN0cnVjdCBjYWNoZSAqY2EsIHNpemVfdCBidWNrZXQpLAorCVRQX0FSR1MoY2EsIGJ1Y2tldCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKF9fdTY0LAkJb2Zmc2V0CQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGNhLT5iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPm9mZnNldAkJPSBidWNrZXQgPDwgY2EtPnNldC0+YnVja2V0X2JpdHM7CisJKSwKKworCVRQX3ByaW50aygiYWxsb2NhdGVkICVkLCVkIHNlY3Rvcj0lbGx1IiwgTUFKT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5vZmZzZXQpCiApOwogCiBUUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfZmFpbCwKQEAgLTQyNiwyMSArNDQzLDIyIEBACiAJVFBfQVJHUyhjYSwgcmVzZXJ2ZSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LAkJZGV2CQkJKQogCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlCQkJKQogCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luYwkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAl1bnVzZWQJCQkpCiAJCV9fZmllbGQodW5zaWduZWQsCWJsb2NrZWQJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gY2EtPmJkZXYtPmJkX2RldjsKIAkJX19lbnRyeS0+ZnJlZQkJPSBmaWZvX3VzZWQoJmNhLT5mcmVlW3Jlc2VydmVdKTsKIAkJX19lbnRyeS0+ZnJlZV9pbmMJPSBmaWZvX3VzZWQoJmNhLT5mcmVlX2luYyk7Ci0JCV9fZW50cnktPnVudXNlZAkJPSBmaWZvX3VzZWQoJmNhLT51bnVzZWQpOwogCQlfX2VudHJ5LT5ibG9ja2VkCT0gYXRvbWljX3JlYWQoJmNhLT5zZXQtPnByaW9fYmxvY2tlZCk7CiAJKSwKIAotCVRQX3ByaW50aygiZnJlZSAldSBmcmVlX2luYyAldSB1bnVzZWQgJXUgYmxvY2tlZCAldSIsIF9fZW50cnktPmZyZWUsCi0JCSAgX19lbnRyeS0+ZnJlZV9pbmMsIF9fZW50cnktPnVudXNlZCwgX19lbnRyeS0+YmxvY2tlZCkKKwlUUF9wcmludGsoImFsbG9jIGZhaWwgJWQsJWQgZnJlZSAldSBmcmVlX2luYyAldSBibG9ja2VkICV1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5mcmVlLAorCQkgIF9fZW50cnktPmZyZWVfaW5jLCBfX2VudHJ5LT5ibG9ja2VkKQogKTsKIAogLyogQmFja2dyb3VuZCB3cml0ZWJhY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCmluZGV4IGU3NmFlMTkuLmU4YTVlY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaApAQCAtMTMyLDYgKzEzMiw3IEBACiAgKiBibG9ja19ycV9jb21wbGV0ZSAtIGJsb2NrIElPIG9wZXJhdGlvbiBjb21wbGV0ZWQgYnkgZGV2aWNlIGRyaXZlcgogICogQHE6IHF1ZXVlIGNvbnRhaW5pbmcgdGhlIGJsb2NrIG9wZXJhdGlvbiByZXF1ZXN0CiAgKiBAcnE6IGJsb2NrIG9wZXJhdGlvbnMgcmVxdWVzdAorICogQG5yX2J5dGVzOiBudW1iZXIgb2YgY29tcGxldGVkIGJ5dGVzCiAgKgogICogVGhlIGJsb2NrX3JxX2NvbXBsZXRlIHRyYWNlcG9pbnQgZXZlbnQgaW5kaWNhdGVzIHRoYXQgc29tZSBwb3J0aW9uCiAgKiBvZiBvcGVyYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgdGhlIGRldmljZSBkcml2ZXIuICBJZgpAQCAtMTM5LDExICsxNDAsMzcgQEAKICAqIGRvIGZvciB0aGUgcmVxdWVzdC4gSWYgQHJxLT5iaW8gaXMgbm9uLU5VTEwgdGhlbiB0aGVyZSBpcwogICogYWRkaXRpb25hbCB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LgogICovCi1ERUZJTkVfRVZFTlQoYmxvY2tfcnFfd2l0aF9lcnJvciwgYmxvY2tfcnFfY29tcGxldGUsCitUUkFDRV9FVkVOVChibG9ja19ycV9jb21wbGV0ZSwKIAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAorCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCSB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpLAogCi0JVFBfQVJHUyhxLCBycSkKKwlUUF9BUkdTKHEsIHJxLCBucl9ieXRlcyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCAgZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCggIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2ZpZWxkKCAgaW50LAkJZXJyb3JzCQkJKQorCQlfX2FycmF5KCAgY2hhciwJCXJ3YnMsCVJXQlNfTEVOCSkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3JxX3BvcyhycSk7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IG5yX2J5dGVzID4+IDk7CisJCV9fZW50cnktPmVycm9ycyAgICA9IHJxLT5lcnJvcnM7CisKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBycS0+Y21kX2ZsYWdzLCBucl9ieXRlcyk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICglcykgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcnMpCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGJsb2NrX3JxLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaHN3YWRzcC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaHN3YWRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzhiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9oc3dhZHNwLmgKQEAgLTAsMCArMSwzODQgQEAKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGhzd2Fkc3AKKworI2lmICFkZWZpbmVkKF9UUkFDRV9IU1dBRFNQX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9IU1dBRFNQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBzc3RfaHN3Oworc3RydWN0IHNzdF9oc3dfc3RyZWFtOworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9mcmVlX3JlcTsKK3N0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxOworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXE7CitzdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGM7CitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHk7CitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGV2aWNlX2NvbmZpZ19yZXE7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1Moc3N0X2lycSwKKworCVRQX1BST1RPKHVpbnQzMl90IHN0YXR1cywgdWludDMyX3QgbWFzayksCisKKwlUUF9BUkdTKHN0YXR1cywgbWFzayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXN0YXR1cwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCW1hc2sJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnN0YXR1cyA9IHN0YXR1czsKKwkJX19lbnRyeS0+bWFzayA9IG1hc2s7CisJKSwKKworCVRQX3ByaW50aygic3RhdHVzIDB4JTguOHggbWFzayAweCU4Ljh4IiwKKwkJKHVuc2lnbmVkIGludClfX2VudHJ5LT5zdGF0dXMsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+bWFzaykKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXJxLCBzc3RfaXJxX2J1c3ksCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgc3RhdHVzLCB1bnNpZ25lZCBpbnQgbWFzayksCisKKwlUUF9BUkdTKHN0YXR1cywgbWFzaykKKworKTsKKworREVGSU5FX0VWRU5UKHNzdF9pcnEsIHNzdF9pcnFfZG9uZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzdGF0dXMsIHVuc2lnbmVkIGludCBtYXNrKSwKKworCVRQX0FSR1Moc3RhdHVzLCBtYXNrKQorCispOworCitERUNMQVJFX0VWRU5UX0NMQVNTKGlwYywKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWwpLAorCisJVFBfQVJHUyhuYW1lLCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCW5hbWUJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl2YWwJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG5hbWUsIG5hbWUpOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygiJXMgMHglOC44eCIsIF9fZ2V0X3N0cihuYW1lKSwgKHVuc2lnbmVkIGludClfX2VudHJ5LT52YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChpcGMsIGlwY19yZXF1ZXN0LAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX3JlcGx5LAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX3BlbmRpbmdfcmVwbHksCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsKSwKKworCVRQX0FSR1MobmFtZSwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoaXBjLCBpcGNfbm90aWZpY2F0aW9uLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX2Vycm9yLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzdHJlYW1fcG9zaXRpb24sCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBwb3MpLAorCisJVFBfQVJHUyhpZCwgcG9zKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJaWQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlwb3MJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlkID0gaWQ7CisJCV9fZW50cnktPnBvcyA9IHBvczsKKwkpLAorCisJVFBfcHJpbnRrKCJpZCAlZCBwb3NpdGlvbiAweCV4IiwKKwkJKHVuc2lnbmVkIGludClfX2VudHJ5LT5pZCwgKHVuc2lnbmVkIGludClfX2VudHJ5LT5wb3MpCispOworCitERUZJTkVfRVZFTlQoc3RyZWFtX3Bvc2l0aW9uLCBzdHJlYW1fcmVhZF9wb3NpdGlvbiwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHBvcyksCisKKwlUUF9BUkdTKGlkLCBwb3MpCisKKyk7CisKK0RFRklORV9FVkVOVChzdHJlYW1fcG9zaXRpb24sIHN0cmVhbV93cml0ZV9wb3NpdGlvbiwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHBvcyksCisKKwlUUF9BUkdTKGlkLCBwb3MpCisKKyk7CisKK1RSQUNFX0VWRU5UKGhzd19zdHJlYW1fYnVmZmVyLAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pLAorCisJVFBfQVJHUyhzdHJlYW0pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlpZAkpCisJCV9fZmllbGQoCWludCwJcHRfYWRkcgkpCisJCV9fZmllbGQoCWludCwJbnVtX3BhZ2VzCSkKKwkJX19maWVsZCgJaW50LAlyaW5nX3NpemUJKQorCQlfX2ZpZWxkKAlpbnQsCXJpbmdfb2Zmc2V0CSkKKwkJX19maWVsZCgJaW50LAlmaXJzdF9wZm4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnB0X2FkZHIgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzOworCQlfX2VudHJ5LT5udW1fcGFnZXMgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ubnVtX3BhZ2VzOworCQlfX2VudHJ5LT5yaW5nX3NpemUgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19zaXplOworCQlfX2VudHJ5LT5yaW5nX29mZnNldCA9IHN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5yaW5nX29mZnNldDsKKwkJX19lbnRyeS0+Zmlyc3RfcGZuID0gc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfZmlyc3RfcGZuOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCByaW5nIGFkZHIgMHgleCBwYWdlcyAlZCBzaXplIDB4JXggb2Zmc2V0IDB4JXggUEZOIDB4JXgiLAorCQkoaW50KSBfX2VudHJ5LT5pZCwgIChpbnQpX19lbnRyeS0+cHRfYWRkciwKKwkJKGludClfX2VudHJ5LT5udW1fcGFnZXMsIChpbnQpX19lbnRyeS0+cmluZ19zaXplLAorCQkoaW50KV9fZW50cnktPnJpbmdfb2Zmc2V0LCAoaW50KV9fZW50cnktPmZpcnN0X3BmbikKKyk7CisKK1RSQUNFX0VWRU5UKGhzd19zdHJlYW1fYWxsb2NfcmVwbHksCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSksCisKKwlUUF9BUkdTKHN0cmVhbSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlkCSkKKwkJX19maWVsZCgJaW50LAlzdHJlYW1faWQJKQorCQlfX2ZpZWxkKAlpbnQsCW1peGVyX2lkCSkKKwkJX19maWVsZCgJaW50LAlwZWFrMAkpCisJCV9fZmllbGQoCWludCwJcGVhazEJKQorCQlfX2ZpZWxkKAlpbnQsCXZvbDAJKQorCQlfX2ZpZWxkKAlpbnQsCXZvbDEJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnN0cmVhbV9pZCA9IHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkOworCQlfX2VudHJ5LT5taXhlcl9pZCA9IHN0cmVhbS0+cmVwbHkubWl4ZXJfaHdfaWQ7CisJCV9fZW50cnktPnBlYWswID0gc3RyZWFtLT5yZXBseS5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMF07CisJCV9fZW50cnktPnBlYWsxID0gc3RyZWFtLT5yZXBseS5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMV07CisJCV9fZW50cnktPnZvbDAgPSBzdHJlYW0tPnJlcGx5LnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzWzBdOworCQlfX2VudHJ5LT52b2wxID0gc3RyZWFtLT5yZXBseS52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkpLAorCisJVFBfcHJpbnRrKCJzdHJlYW0gJWQgaHcgaWQgJWQgbWl4ZXIgJWQgcGVhayAweCV4OjB4JXggdm9sIDB4JXgsMHgleCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAoaW50KSBfX2VudHJ5LT5zdHJlYW1faWQsIChpbnQpX19lbnRyeS0+bWl4ZXJfaWQsCisJCShpbnQpX19lbnRyeS0+cGVhazAsIChpbnQpX19lbnRyeS0+cGVhazEsCisJCShpbnQpX19lbnRyeS0+dm9sMCwgKGludClfX2VudHJ5LT52b2wxKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X21peGVyX2luZm9fcmVwbHksCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHkgKnJlcGx5KSwKKworCVRQX0FSR1MocmVwbHkpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAltaXhlcl9pZAkpCisJCV9fZmllbGQoCWludCwJcGVhazAJKQorCQlfX2ZpZWxkKAlpbnQsCXBlYWsxCSkKKwkJX19maWVsZCgJaW50LAl2b2wwCSkKKwkJX19maWVsZCgJaW50LAl2b2wxCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm1peGVyX2lkID0gcmVwbHktPm1peGVyX2h3X2lkOworCQlfX2VudHJ5LT5wZWFrMCA9IHJlcGx5LT5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMF07CisJCV9fZW50cnktPnBlYWsxID0gcmVwbHktPnBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkJX19lbnRyeS0+dm9sMCA9IHJlcGx5LT52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1swXTsKKwkJX19lbnRyeS0+dm9sMSA9IHJlcGx5LT52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkpLAorCisJVFBfcHJpbnRrKCJtaXhlciBpZCAlZCBwZWFrIDB4JXg6MHgleCB2b2wgMHgleCwweCV4IiwKKwkJKGludClfX2VudHJ5LT5taXhlcl9pZCwKKwkJKGludClfX2VudHJ5LT5wZWFrMCwgKGludClfX2VudHJ5LT5wZWFrMSwKKwkJKGludClfX2VudHJ5LT52b2wwLCAoaW50KV9fZW50cnktPnZvbDEpCispOworCitUUkFDRV9FVkVOVChoc3dfc3RyZWFtX2RhdGFfZm9ybWF0LAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJCXN0cnVjdCBzc3RfaHN3X2F1ZGlvX2RhdGFfZm9ybWF0X2lwYyAqcmVxKSwKKworCVRQX0FSR1Moc3RyZWFtLCByZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdWludDMyX3QsCWlkCSkKKwkJX19maWVsZCgJdWludDMyX3QsCWZyZXF1ZW5jeQkpCisJCV9fZmllbGQoCXVpbnQzMl90LAliaXRkZXB0aAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAltYXAJKQorCQlfX2ZpZWxkKAl1aW50MzJfdCwJY29uZmlnCSkKKwkJX19maWVsZCgJdWludDMyX3QsCXN0eWxlCSkKKwkJX19maWVsZCgJdWludDhfdCwJY2hfbnVtCSkKKwkJX19maWVsZCgJdWludDhfdCwJdmFsaWRfYml0CSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlkID0gc3RyZWFtLT5ob3N0X2lkOworCQlfX2VudHJ5LT5mcmVxdWVuY3kgPSByZXEtPmZyZXF1ZW5jeTsKKwkJX19lbnRyeS0+Yml0ZGVwdGggPSByZXEtPmJpdGRlcHRoOworCQlfX2VudHJ5LT5tYXAgPSByZXEtPm1hcDsKKwkJX19lbnRyeS0+Y29uZmlnID0gcmVxLT5jb25maWc7CisJCV9fZW50cnktPnN0eWxlID0gcmVxLT5zdHlsZTsKKwkJX19lbnRyeS0+Y2hfbnVtID0gcmVxLT5jaF9udW07CisJCV9fZW50cnktPnZhbGlkX2JpdCA9IHJlcS0+dmFsaWRfYml0OworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBmcmVxICVkIGRlcHRoICVkIG1hcCAweCV4IGNvbmZpZyAweCV4IHN0eWxlIDB4JXggY2ggJWQgYml0cyAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDMyX3QpX19lbnRyeS0+ZnJlcXVlbmN5LAorCQkodWludDMyX3QpX19lbnRyeS0+Yml0ZGVwdGgsICh1aW50MzJfdClfX2VudHJ5LT5tYXAsCisJCSh1aW50MzJfdClfX2VudHJ5LT5jb25maWcsICh1aW50MzJfdClfX2VudHJ5LT5zdHlsZSwKKwkJKHVpbnQ4X3QpX19lbnRyeS0+Y2hfbnVtLCAodWludDhfdClfX2VudHJ5LT52YWxpZF9iaXQpCispOworCitUUkFDRV9FVkVOVChoc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3QsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwkJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXEgKnJlcSksCisKKwlUUF9BUkdTKHN0cmVhbSwgcmVxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVpbnQzMl90LAlpZAkpCisJCV9fZmllbGQoCXVpbnQ4X3QsCXBhdGhfaWQJKQorCQlfX2ZpZWxkKAl1aW50OF90LAlzdHJlYW1fdHlwZQkpCisJCV9fZmllbGQoCXVpbnQ4X3QsCWZvcm1hdF9pZAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IHN0cmVhbS0+aG9zdF9pZDsKKwkJX19lbnRyeS0+cGF0aF9pZCA9IHJlcS0+cGF0aF9pZDsKKwkJX19lbnRyeS0+c3RyZWFtX3R5cGUgPSByZXEtPnN0cmVhbV90eXBlOworCQlfX2VudHJ5LT5mb3JtYXRfaWQgPSByZXEtPmZvcm1hdF9pZDsKKwkpLAorCisJVFBfcHJpbnRrKCJzdHJlYW0gJWQgcGF0aCAlZCB0eXBlICVkIGZvcm1hdCAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDhfdClfX2VudHJ5LT5wYXRoX2lkLAorCQkodWludDhfdClfX2VudHJ5LT5zdHJlYW1fdHlwZSwgKHVpbnQ4X3QpX19lbnRyeS0+Zm9ybWF0X2lkKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X3N0cmVhbV9mcmVlX3JlcSwKKworCVRQX1BST1RPKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxICpyZXEpLAorCisJVFBfQVJHUyhzdHJlYW0sIHJlcSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlkCSkKKwkJX19maWVsZCgJaW50LAlzdHJlYW1faWQJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnN0cmVhbV9pZCA9IHJlcS0+c3RyZWFtX2lkOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBodyBpZCAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAoaW50KSBfX2VudHJ5LT5zdHJlYW1faWQpCispOworCitUUkFDRV9FVkVOVChoc3dfdm9sdW1lX3JlcSwKKworCVRQX1BST1RPKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCQlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxKSwKKworCVRQX0FSR1Moc3RyZWFtLCByZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlpZAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAljaGFubmVsCSkKKwkJX19maWVsZCgJdWludDMyX3QsCXRhcmdldF92b2x1bWUJKQorCQlfX2ZpZWxkKAl1aW50NjRfdCwJY3VydmVfZHVyYXRpb24JKQorCQlfX2ZpZWxkKAl1aW50MzJfdCwJY3VydmVfdHlwZQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IHN0cmVhbS0+aG9zdF9pZDsKKwkJX19lbnRyeS0+Y2hhbm5lbCA9IHJlcS0+Y2hhbm5lbDsKKwkJX19lbnRyeS0+dGFyZ2V0X3ZvbHVtZSA9IHJlcS0+dGFyZ2V0X3ZvbHVtZTsKKwkJX19lbnRyeS0+Y3VydmVfZHVyYXRpb24gPSByZXEtPmN1cnZlX2R1cmF0aW9uOworCQlfX2VudHJ5LT5jdXJ2ZV90eXBlID0gcmVxLT5jdXJ2ZV90eXBlOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBjaGFuIDB4JXggdm9sICVkIGR1cmF0aW9uICVsbHUgdHlwZSAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDMyX3QpIF9fZW50cnktPmNoYW5uZWwsCisJCSh1aW50MzJfdClfX2VudHJ5LT50YXJnZXRfdm9sdW1lLAorCQkodWludDY0X3QpX19lbnRyeS0+Y3VydmVfZHVyYXRpb24sCisJCSh1aW50MzJfdClfX2VudHJ5LT5jdXJ2ZV90eXBlKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X2RldmljZV9jb25maWdfcmVxLAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfaXBjX2RldmljZV9jb25maWdfcmVxICpyZXEpLAorCisJVFBfQVJHUyhyZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdWludDMyX3QsCXNzcAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAljbG9ja19mcmVxCSkKKwkJX19maWVsZCgJdWludDMyX3QsCW1vZGUJKQorCQlfX2ZpZWxkKAl1aW50MTZfdCwJY2xvY2tfZGl2aWRlcgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5zc3AgPSByZXEtPnNzcF9pbnRlcmZhY2U7CisJCV9fZW50cnktPmNsb2NrX2ZyZXEgPSByZXEtPmNsb2NrX2ZyZXF1ZW5jeTsKKwkJX19lbnRyeS0+bW9kZSA9IHJlcS0+bW9kZTsKKwkJX19lbnRyeS0+Y2xvY2tfZGl2aWRlciA9IHJlcS0+Y2xvY2tfZGl2aWRlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJTU1AgJWQgRnJlcSAlZCBtb2RlICVkIGRpdiAlZCIsCisJCSh1aW50MzJfdClfX2VudHJ5LT5zc3AsCisJCSh1aW50MzJfdClfX2VudHJ5LT5jbG9ja19mcmVxLCAodWludDMyX3QpX19lbnRyeS0+bW9kZSwKKwkJKHVpbnQzMl90KV9fZW50cnktPmNsb2NrX2RpdmlkZXIpCispOworCisjZW5kaWYgLyogX1RSQUNFX0hTV0FEU1BfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW50ZWwtc3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNzJkMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oCkBAIC0wLDAgKzEsMTQ4IEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpbnRlbC1zc3QKKworI2lmICFkZWZpbmVkKF9UUkFDRV9JTlRFTF9TU1RfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0lOVEVMX1NTVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCitERUNMQVJFX0VWRU5UX0NMQVNTKHNzdF9pcGNfbXNnLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHZhbCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXZhbAkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIjB4JTguOHgiLCAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21zZywgc3N0X2lwY19tc2dfdHgsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1ModmFsKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tc2csIHNzdF9pcGNfbXNnX3J4LAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzc3RfaXBjX21haWxib3gsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlvZmZzZXQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl2YWwJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIiAweCU0LjR4ID0gMHglOC44eCIsCisJCSh1bnNpZ25lZCBpbnQpX19lbnRyeS0+b2Zmc2V0LCAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfaW5ib3hfcmRhdGEsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfaW5ib3hfd2RhdGEsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfb3V0Ym94X3JkYXRhLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKG9mZnNldCwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tYWlsYm94LCBzc3RfaXBjX291dGJveF93ZGF0YSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhvZmZzZXQsIHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzc3RfaXBjX21haWxib3hfaW5mbywKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXNpemUJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnNpemUgPSBzaXplOworCSksCisKKwlUUF9wcmludGsoIk1haWxib3ggYnl0ZXMgMHglOC44eCIsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+c2l6ZSkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3hfaW5mbywgc3N0X2lwY19pbmJveF9yZWFkLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHNpemUpLAorCisJVFBfQVJHUyhzaXplKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tYWlsYm94X2luZm8sIHNzdF9pcGNfaW5ib3hfd3JpdGUsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgc2l6ZSksCisKKwlUUF9BUkdTKHNpemUpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3hfaW5mbywgc3N0X2lwY19vdXRib3hfcmVhZCwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSkKKworKTsKKworREVGSU5FX0VWRU5UKHNzdF9pcGNfbWFpbGJveF9pbmZvLCBzc3RfaXBjX291dGJveF93cml0ZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSkKKworKTsKKworI2VuZGlmIC8qIF9UUkFDRV9TU1RfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZnRyYWNlLmggYi9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oCmluZGV4IDFhOGIyOGQuLjFlZTE5YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZnRyYWNlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaApAQCAtMzEwLDE1ICszMTAsMTIgQEAKICN1bmRlZiBfX2FycmF5CiAjZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKLQkJbXV0ZXhfbG9jaygmZXZlbnRfc3RvcmFnZV9tdXRleCk7CQkJXAorCQljaGFyICp0eXBlX3N0ciA9ICN0eXBlIlsiX19zdHJpbmdpZnkobGVuKSJdIjsJCVwKIAkJQlVJTERfQlVHX09OKGxlbiA+IE1BWF9GSUxURVJfU1RSX1ZBTCk7CQkJXAotCQlzbnByaW50ZihldmVudF9zdG9yYWdlLCBzaXplb2YoZXZlbnRfc3RvcmFnZSksCQlcCi0JCQkgIiVzWyVkXSIsICN0eXBlLCBsZW4pOwkJCQlcCi0JCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCBldmVudF9zdG9yYWdlLCAjaXRlbSwgXAorCQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgdHlwZV9zdHIsICNpdGVtLAlcCiAJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAogCQkJCSBzaXplb2YoZmllbGQuaXRlbSksCQkJXAogCQkJCSBpc19zaWduZWRfdHlwZSh0eXBlKSwgRklMVEVSX09USEVSKTsJXAotCQltdXRleF91bmxvY2soJmV2ZW50X3N0b3JhZ2VfbXV0ZXgpOwkJCVwKIAkJaWYgKHJldCkJCQkJCQlcCiAJCQlyZXR1cm4gcmV0OwkJCQkJXAogCX0gd2hpbGUgKDApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3VuaXN0ZC5oIGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3VuaXN0ZC5oCmluZGV4IGRkZTgwNDEuLjZkYjY2NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvdW5pc3RkLmgKQEAgLTE5MSw2ICsxOTEsNyBAQAogCiAvKiBmcy9yZWFkZGlyLmMgKi8KICNkZWZpbmUgX19OUl9nZXRkZW50czY0IDYxCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogX19TQ19DT01QKF9fTlJfZ2V0ZGVudHM2NCwgc3lzX2dldGRlbnRzNjQsIGNvbXBhdF9zeXNfZ2V0ZGVudHM2NCkKIAogLyogZnMvcmVhZF93cml0ZS5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZAppbmRleCAzY2UyNWI1Li42OTI5NTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKQEAgLTEzOSw2ICsxMzksNyBAQAogaGVhZGVyLXkgKz0gaGlkZGV2LmgKIGhlYWRlci15ICs9IGhpZHJhdy5oCiBoZWFkZXIteSArPSBocGV0LmgKK2hlYWRlci15ICs9IGh5cGVydi5oCiBoZWFkZXIteSArPSBoeXNkbl9pZi5oCiBoZWFkZXIteSArPSBpMmMtZGV2LmgKIGhlYWRlci15ICs9IGkyYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaHlwZXJ2LmggYi9pbmNsdWRlL3VhcGkvbGludXgvaHlwZXJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlYjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9oeXBlcnYuaApAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogQXV0aG9yczoKKyAqICAgSGFpeWFuZyBaaGFuZyA8aGFpeWFuZ3pAbWljcm9zb2Z0LmNvbT4KKyAqICAgSGFuayBKYW5zc2VuICA8aGphbnNzZW5AbWljcm9zb2Z0LmNvbT4KKyAqICAgSy4gWS4gU3Jpbml2YXNhbiA8a3lzQG1pY3Jvc29mdC5jb20+CisgKgorICovCisKKyNpZm5kZWYgX1VBUElfSFlQRVJWX0gKKyNkZWZpbmUgX1VBUElfSFlQRVJWX0gKKworI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKworLyoKKyAqIEZyYW1ld29yayB2ZXJzaW9uIGZvciB1dGlsIHNlcnZpY2VzLgorICovCisjZGVmaW5lIFVUSUxfRldfTUlOT1IgIDAKKworI2RlZmluZSBVVElMX1dTMks4X0ZXX01BSk9SICAxCisjZGVmaW5lIFVUSUxfV1MySzhfRldfVkVSU0lPTiAgICAgKFVUSUxfV1MySzhfRldfTUFKT1IgPDwgMTYgfCBVVElMX0ZXX01JTk9SKQorCisjZGVmaW5lIFVUSUxfRldfTUFKT1IgIDMKKyNkZWZpbmUgVVRJTF9GV19WRVJTSU9OICAgICAoVVRJTF9GV19NQUpPUiA8PCAxNiB8IFVUSUxfRldfTUlOT1IpCisKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGhvc3QgY29udHJvbGxlZCBzbmFwc2hvdCBvZiB0aGUgZ3Vlc3QuCisgKi8KKworI2RlZmluZSBWU1NfT1BfUkVHSVNURVIgMTI4CisKK2VudW0gaHZfdnNzX29wIHsKKwlWU1NfT1BfQ1JFQVRFID0gMCwKKwlWU1NfT1BfREVMRVRFLAorCVZTU19PUF9IT1RfQkFDS1VQLAorCVZTU19PUF9HRVRfRE1fSU5GTywKKwlWU1NfT1BfQlVfQ09NUExFVEUsCisJLyoKKwkgKiBGb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBJQyB2ZXJzaW9uID49IDUuMAorCSAqLworCVZTU19PUF9GUkVFWkUsIC8qIEZyZWV6ZSB0aGUgZmlsZSBzeXN0ZW1zIGluIHRoZSBWTSAqLworCVZTU19PUF9USEFXLCAvKiBVbmZyZWV6ZSB0aGUgZmlsZSBzeXN0ZW1zICovCisJVlNTX09QX0FVVE9fUkVDT1ZFUiwKKwlWU1NfT1BfQ09VTlQgLyogTnVtYmVyIG9mIG9wZXJhdGlvbnMsIG11c3QgYmUgbGFzdCAqLworfTsKKworCisvKgorICogSGVhZGVyIGZvciBhbGwgVlNTIG1lc3NhZ2VzLgorICovCitzdHJ1Y3QgaHZfdnNzX2hkciB7CisJX191OCBvcGVyYXRpb247CisJX191OCByZXNlcnZlZFs3XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoKKyAqIEZsYWcgdmFsdWVzIGZvciB0aGUgaHZfdnNzX2NoZWNrX2ZlYXR1cmUuIExpbnV4IHN1cHBvcnRzIG9ubHkKKyAqIG9uZSB2YWx1ZS4KKyAqLworI2RlZmluZSBWU1NfSEJVX05PX0FVVE9fUkVDT1ZFUlkJMHgwMDAwMDAwNQorCitzdHJ1Y3QgaHZfdnNzX2NoZWNrX2ZlYXR1cmUgeworCV9fdTMyIGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X3Zzc19jaGVja19kbV9pbmZvIHsKKwlfX3UzMiBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodl92c3NfbXNnIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBodl92c3NfaGRyIHZzc19oZHI7CisJCWludCBlcnJvcjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IGh2X3Zzc19jaGVja19mZWF0dXJlIHZzc19jZjsKKwkJc3RydWN0IGh2X3Zzc19jaGVja19kbV9pbmZvIGRtX2luZm87CisJfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGhvc3QgdG8gZ3Vlc3QgY29weSBmYWNpbGl0eS4KKyAqLworCisjZGVmaW5lIEZDT1BZX1ZFUlNJT05fMCAwCisjZGVmaW5lIEZDT1BZX0NVUlJFTlRfVkVSU0lPTiBGQ09QWV9WRVJTSU9OXzAKKyNkZWZpbmUgV19NQVhfUEFUSCAyNjAKKworZW51bSBodl9mY29weV9vcCB7CisJU1RBUlRfRklMRV9DT1BZID0gMCwKKwlXUklURV9UT19GSUxFLAorCUNPTVBMRVRFX0ZDT1BZLAorCUNBTkNFTF9GQ09QWSwKK307CisKK3N0cnVjdCBodl9mY29weV9oZHIgeworCV9fdTMyIG9wZXJhdGlvbjsKKwl1dWlkX2xlIHNlcnZpY2VfaWQwOyAvKiBjdXJyZW50bHkgdW51c2VkICovCisJdXVpZF9sZSBzZXJ2aWNlX2lkMTsgLyogY3VycmVudGx5IHVudXNlZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBPVkVSX1dSSVRFCTB4MQorI2RlZmluZSBDUkVBVEVfUEFUSAkweDIKKworc3RydWN0IGh2X3N0YXJ0X2Zjb3B5IHsKKwlzdHJ1Y3QgaHZfZmNvcHlfaGRyIGhkcjsKKwlfX3UxNiBmaWxlX25hbWVbV19NQVhfUEFUSF07CisJX191MTYgcGF0aF9uYW1lW1dfTUFYX1BBVEhdOworCV9fdTMyIGNvcHlfZmxhZ3M7CisJX191NjQgZmlsZV9zaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZSBmaWxlIGlzIGNodW5rZWQgaW50byBmcmFnbWVudHMuCisgKi8KKyNkZWZpbmUgREFUQV9GUkFHTUVOVAkoNiAqIDEwMjQpCisKK3N0cnVjdCBodl9kb19mY29weSB7CisJc3RydWN0IGh2X2Zjb3B5X2hkciBoZHI7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191OAlkYXRhW0RBVEFfRlJBR01FTlRdOworfTsKKworLyoKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEh5cGVyViBrZXkgdmFsdWUgcGFpciAoS1ZQKSBmdW5jdGlvbmFsaXR5IGZvciBMaW51eC4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBOb3ZlbGwsIEluYy4KKyAqIEF1dGhvciA6IEsuIFkuIFNyaW5pdmFzYW4gPGtzcmluaXZhc2FuQG5vdmVsbC5jb20+CisgKgorICovCisKKy8qCisgKiBNYXhpbXVtIHZhbHVlIHNpemUgLSB1c2VkIGZvciBib3RoIGtleSBuYW1lcyBhbmQgdmFsdWUgZGF0YSwgYW5kIGluY2x1ZGVzCisgKiBhbnkgYXBwbGljYWJsZSBOVUxMIHRlcm1pbmF0b3JzLgorICoKKyAqIE5vdGU6ICBUaGlzIGxpbWl0IGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGZhbGxzIGVhc2lseSB3aXRoaW4gd2hhdCBpcworICogc3VwcG9ydGVkIGZvciBhbGwgbmF0aXZlIGd1ZXN0cyAoYmFjayB0byBXaW4gMjAwMCkgYW5kIHdoYXQgaXMgcmVhc29uYWJsZQorICogZm9yIHRoZSBJQyBLVlAgZXhjaGFuZ2UgZnVuY3Rpb25hbGl0eS4gIE5vdGUgdGhhdCBXaW5kb3dzIE1lLzk4Lzk1IGFyZQorICogbGltaXRlZCB0byAyNTUgY2hhcmFjdGVyIGtleSBuYW1lcy4KKyAqCisgKiBNU0ROIHJlY29tbWVuZHMgbm90IHN0b3JpbmcgZGF0YSB2YWx1ZXMgbGFyZ2VyIHRoYW4gMjA0OCBieXRlcyBpbiB0aGUKKyAqIHJlZ2lzdHJ5LgorICoKKyAqIE5vdGU6ICBUaGlzIHZhbHVlIGlzIHVzZWQgaW4gZGVmaW5pbmcgdGhlIEtWUCBleGNoYW5nZSBtZXNzYWdlIC0gdGhpcyB2YWx1ZQorICogY2Fubm90IGJlIG1vZGlmaWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBtZXNzYWdlIHNpemUgYW5kIGNvbXBhdGliaWxpdHkuCisgKi8KKworLyoKKyAqIGJ5dGVzLCBpbmNsdWRpbmcgYW55IG51bGwgdGVybWluYXRvcnMKKyAqLworI2RlZmluZSBIVl9LVlBfRVhDSEFOR0VfTUFYX1ZBTFVFX1NJWkUgICAgICAgICAgKDIwNDgpCisKKworLyoKKyAqIE1heGltdW0ga2V5IHNpemUgLSB0aGUgcmVnaXN0cnkgbGltaXQgZm9yIHRoZSBsZW5ndGggb2YgYW4gZW50cnkgbmFtZQorICogaXMgMjU2IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgbnVsbCB0ZXJtaW5hdG9yCisgKi8KKworI2RlZmluZSBIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFICAgICAgICAgICAgKDUxMikKKworLyoKKyAqIEluIExpbnV4LCB3ZSBpbXBsZW1lbnQgdGhlIEtWUCBmdW5jdGlvbmFsaXR5IGluIHR3byBjb21wb25lbnRzOgorICogMSkgVGhlIGtlcm5lbCBjb21wb25lbnQgd2hpY2ggaXMgcGFja2FnZWQgYXMgcGFydCBvZiB0aGUgaHZfdXRpbHMgZHJpdmVyCisgKiBpcyByZXNwb25zaWJsZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBob3N0IGFuZCByZXNwb25zaWJsZSBmb3IKKyAqIGltcGxlbWVudGluZyB0aGUgaG9zdC9ndWVzdCBwcm90b2NvbC4gMikgQSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IGlzCisgKiByZXNwb25zaWJsZSBmb3IgZGF0YSBnYXRoZXJpbmcuCisgKgorICogSG9zdC9HdWVzdCBQcm90b2NvbDogVGhlIGhvc3QgaXRlcmF0ZXMgb3ZlciBhbiBpbmRleCBhbmQgZXhwZWN0cyB0aGUgZ3Vlc3QKKyAqIHRvIGFzc2lnbiBhIGtleSBuYW1lIHRvIHRoZSBpbmRleCBhbmQgYWxzbyByZXR1cm4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8KKyAqIHRoZSBrZXkuIFRoZSBob3N0IHdpbGwgaGF2ZSBhdG1vc3Qgb25lIEtWUCB0cmFuc2FjdGlvbiBvdXRzdGFuZGluZyBhdCBhbnkKKyAqIGdpdmVuIHBvaW50IGluIHRpbWUuIFRoZSBob3N0IHNpZGUgaXRlcmF0aW9uIHN0b3BzIHdoZW4gdGhlIGd1ZXN0IHJldHVybnMKKyAqIGFuIGVycm9yLiBNaWNyb3NvZnQgaGFzIHNwZWNpZmllZCB0aGUgZm9sbG93aW5nIG1hcHBpbmcgb2Yga2V5IG5hbWVzIHRvCisgKiBob3N0IHNwZWNpZmllZCBpbmRleDoKKyAqCisgKglJbmRleAkJS2V5IE5hbWUKKyAqCTAJCUZ1bGx5UXVhbGlmaWVkRG9tYWluTmFtZQorICoJMQkJSW50ZWdyYXRpb25TZXJ2aWNlc1ZlcnNpb24KKyAqCTIJCU5ldHdvcmtBZGRyZXNzSVB2NAorICoJMwkJTmV0d29ya0FkZHJlc3NJUHY2CisgKgk0CQlPU0J1aWxkTnVtYmVyCisgKgk1CQlPU05hbWUKKyAqCTYJCU9TTWFqb3JWZXJzaW9uCisgKgk3CQlPU01pbm9yVmVyc2lvbgorICoJOAkJT1NWZXJzaW9uCisgKgk5CQlQcm9jZXNzb3JBcmNoaXRlY3R1cmUKKyAqCisgKiBUaGUgV2luZG93cyBob3N0IGV4cGVjdHMgdGhlIEtleSBOYW1lIGFuZCBLZXkgVmFsdWUgdG8gYmUgZW5jb2RlZCBpbiB1dGYxNi4KKyAqCisgKiBHdWVzdCBLZXJuZWwvS1ZQIERhZW1vbiBQcm90b2NvbDogQXMgbm90ZWQgZWFybGllciwgd2UgaW1wbGVtZW50IGFsbCBvZiB0aGUKKyAqIGRhdGEgZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgaW4gYSB1c2VyIG1vZGUgZGFlbW9uLiBUaGUgdXNlciBsZXZlbCBkYWVtb24KKyAqIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGJpbmRpbmcgdGhlIGtleSBuYW1lIHRvIHRoZSBpbmRleCBhcyB3ZWxsLiBUaGUKKyAqIGtlcm5lbCBhbmQgdXNlci1sZXZlbCBkYWVtb24gY29tbXVuaWNhdGUgdXNpbmcgYSBjb25uZWN0b3IgY2hhbm5lbC4KKyAqCisgKiBUaGUgdXNlciBtb2RlIGNvbXBvbmVudCBmaXJzdCByZWdpc3RlcnMgd2l0aCB0aGUKKyAqIHRoZSBrZXJuZWwgY29tcG9uZW50LiBTdWJzZXF1ZW50bHksIHRoZSBrZXJuZWwgY29tcG9uZW50IHJlcXVlc3RzLCBkYXRhCisgKiBmb3IgdGhlIHNwZWNpZmllZCBrZXlzLiBJbiByZXNwb25zZSB0byB0aGlzIG1lc3NhZ2UgdGhlIHVzZXIgbW9kZSBjb21wb25lbnQKKyAqIGZpbGxzIGluIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQga2V5LiBXZSBvdmVybG9hZCB0aGUKKyAqIHNlcXVlbmNlIGZpZWxkIGluIHRoZSBjbl9tc2cgaGVhZGVyIHRvIGRlZmluZSBvdXIgS1ZQIG1lc3NhZ2UgdHlwZXMuCisgKgorICoKKyAqIFRoZSBrZXJuZWwgY29tcG9uZW50IHNpbXBseSBhY3RzIGFzIGEgY29uZHVpdCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQorICogV2luZG93cyBob3N0IGFuZCB0aGUgdXNlci1sZXZlbCBkYWVtb24uIFRoZSBrZXJuZWwgY29tcG9uZW50IHBhc3NlcyB1cCB0aGUKKyAqIGluZGV4IHJlY2VpdmVkIGZyb20gdGhlIEhvc3QgdG8gdGhlIHVzZXItbGV2ZWwgZGFlbW9uLiBJZiB0aGUgaW5kZXggaXMKKyAqIHZhbGlkIChzdXBwb3J0ZWQpLCB0aGUgY29ycmVzcG9uZGluZyBrZXkgYXMgd2VsbCBhcyBpdHMKKyAqIHZhbHVlIChib3RoIGFyZSBzdHJpbmdzKSBpcyByZXR1cm5lZC4gSWYgdGhlIGluZGV4IGlzIGludmFsaWQKKyAqIChub3Qgc3VwcG9ydGVkKSwgYSBOVUxMIGtleSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgKi8KKworCisvKgorICogUmVnaXN0cnkgdmFsdWUgdHlwZXMuCisgKi8KKworI2RlZmluZSBSRUdfU1ogMQorI2RlZmluZSBSRUdfVTMyIDQKKyNkZWZpbmUgUkVHX1U2NCA4CisKKy8qCisgKiBBcyB3ZSBsb29rIGF0IGV4cGFuZGluZyB0aGUgS1ZQIGZ1bmN0aW9uYWxpdHkgdG8gaW5jbHVkZQorICogSVAgaW5qZWN0aW9uIGZ1bmN0aW9uYWxpdHksIHdlIG5lZWQgdG8gbWFpbnRhaW4gYmluYXJ5CisgKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgZGFlbW9ucy4KKyAqCisgKiBUaGUgS1ZQIG9wY29kZXMgYXJlIGRlZmluZWQgYnkgdGhlIGhvc3QgYW5kIGl0IHdhcyB1bmZvcnR1bmF0ZQorICogdGhhdCBJIGNob3NlIHRvIHRyZWF0IHRoZSByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGFzIHBhcnQgb2YgdGhlCisgKiBLVlAgb3BlcmF0aW9ucyBkZWZpbmVkIGJ5IHRoZSBob3N0LgorICogSGVyZSBpcyB0aGUgbGV2ZWwgb2YgY29tcGF0aWJpbGl0eQorICogKGJldHdlZW4gdGhlIHVzZXIgbGV2ZWwgZGFlbW9uIGFuZCB0aGUga2VybmVsIEtWUCBkcml2ZXIpIHRoYXQgd2UKKyAqIHdpbGwgaW1wbGVtZW50OgorICoKKyAqIEFuIG9sZGVyIGRhZW1vbiB3aWxsIGFsd2F5cyBiZSBzdXBwb3J0ZWQgb24gYSBuZXdlciBkcml2ZXIuCisgKiBBIGdpdmVuIHVzZXIgbGV2ZWwgZGFlbW9uIHdpbGwgcmVxdWlyZSBhIG1pbmltYWwgdmVyc2lvbiBvZiB0aGUKKyAqIGtlcm5lbCBkcml2ZXIuCisgKiBJZiB3ZSBjYW5ub3QgaGFuZGxlIHRoZSB2ZXJzaW9uIGRpZmZlcmVuY2VzLCB3ZSB3aWxsIGZhaWwgZ3JhY2VmdWxseQorICogKHRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGhhdmUgYSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IGlzIG1vcmUKKyAqIGFkdmFuY2VkIHRoYW4gdGhlIEtWUCBkcml2ZXIuCisgKgorICogV2Ugd2lsbCB1c2UgdmFsdWVzIHVzZWQgaW4gdGhpcyBoYW5kc2hha2UgZm9yIGRldGVybWluaW5nIGlmIHdlIGhhdmUKKyAqIHdvcmthYmxlIHVzZXIgbGV2ZWwgZGFlbW9uIGFuZCB0aGUga2VybmVsIGRyaXZlci4gV2UgYmVnaW4gYnkgdGFraW5nIHRoZQorICogcmVnaXN0cmF0aW9uIG9wY29kZSBvdXQgb2YgdGhlIEtWUCBvcGNvZGUgbmFtZXNwYWNlLiBXZSB3aWxsIGhvd2V2ZXIsCisgKiBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIHVzZXItbGV2ZWwgZGFlbW9uIGNvZGUuCisgKi8KKworLyoKKyAqIERhZW1vbiBjb2RlIG5vdCBzdXBwb3J0aW5nIElQIGluamVjdGlvbiAobGVnYWN5IGRhZW1vbikuCisgKi8KKworI2RlZmluZSBLVlBfT1BfUkVHSVNURVIJNAorCisvKgorICogRGFlbW9uIGNvZGUgc3VwcG9ydGluZyBJUCBpbmplY3Rpb24uCisgKiBUaGUgS1ZQIG9wY29kZSBmaWVsZCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHRoZQorICogcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uOyBzbyBkZWZpbmUgYSBuYW1lc3BhY2UgdGhhdAorICogd2lsbCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBob3N0IGRlZmluZWQgS1ZQIG9wY29kZS4KKyAqLworCisjZGVmaW5lIEtWUF9PUF9SRUdJU1RFUjEgMTAwCisKK2VudW0gaHZfa3ZwX2V4Y2hnX29wIHsKKwlLVlBfT1BfR0VUID0gMCwKKwlLVlBfT1BfU0VULAorCUtWUF9PUF9ERUxFVEUsCisJS1ZQX09QX0VOVU1FUkFURSwKKwlLVlBfT1BfR0VUX0lQX0lORk8sCisJS1ZQX09QX1NFVF9JUF9JTkZPLAorCUtWUF9PUF9DT1VOVCAvKiBOdW1iZXIgb2Ygb3BlcmF0aW9ucywgbXVzdCBiZSBsYXN0LiAqLworfTsKKworZW51bSBodl9rdnBfZXhjaGdfcG9vbCB7CisJS1ZQX1BPT0xfRVhURVJOQUwgPSAwLAorCUtWUF9QT09MX0dVRVNULAorCUtWUF9QT09MX0FVVE8sCisJS1ZQX1BPT0xfQVVUT19FWFRFUk5BTCwKKwlLVlBfUE9PTF9BVVRPX0lOVEVSTkFMLAorCUtWUF9QT09MX0NPVU5UIC8qIE51bWJlciBvZiBwb29scywgbXVzdCBiZSBsYXN0LiAqLworfTsKKworLyoKKyAqIFNvbWUgSHlwZXItViBzdGF0dXMgY29kZXMuCisgKi8KKworI2RlZmluZSBIVl9TX09LCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSFZfRV9GQUlMCQkJMHg4MDAwNDAwNQorI2RlZmluZSBIVl9TX0NPTlQJCQkweDgwMDcwMTAzCisjZGVmaW5lIEhWX0VSUk9SX05PVF9TVVBQT1JURUQJCTB4ODAwNzAwMzIKKyNkZWZpbmUgSFZfRVJST1JfTUFDSElORV9MT0NLRUQJCTB4ODAwNzA0RjcKKyNkZWZpbmUgSFZfRVJST1JfREVWSUNFX05PVF9DT05ORUNURUQJMHg4MDA3MDQ4RgorI2RlZmluZSBIVl9JTlZBTElEQVJHCQkJMHg4MDA3MDA1NworI2RlZmluZSBIVl9HVUlEX05PVEZPVU5ECQkweDgwMDQxMDAyCisKKyNkZWZpbmUgQUREUl9GQU1JTFlfTk9ORQkweDAwCisjZGVmaW5lIEFERFJfRkFNSUxZX0lQVjQJMHgwMQorI2RlZmluZSBBRERSX0ZBTUlMWV9JUFY2CTB4MDIKKworI2RlZmluZSBNQVhfQURBUFRFUl9JRF9TSVpFCTEyOAorI2RlZmluZSBNQVhfSVBfQUREUl9TSVpFCTEwMjQKKyNkZWZpbmUgTUFYX0dBVEVXQVlfU0laRQk1MTIKKworCitzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSB7CisJX191MTYJYWRhcHRlcl9pZFtNQVhfQURBUFRFUl9JRF9TSVpFXTsKKwlfX3U4CWFkZHJfZmFtaWx5OworCV9fdTgJZGhjcF9lbmFibGVkOworCV9fdTE2CWlwX2FkZHJbTUFYX0lQX0FERFJfU0laRV07CisJX191MTYJc3ViX25ldFtNQVhfSVBfQUREUl9TSVpFXTsKKwlfX3UxNglnYXRlX3dheVtNQVhfR0FURVdBWV9TSVpFXTsKKwlfX3UxNglkbnNfYWRkcltNQVhfSVBfQUREUl9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGh2X2t2cF9oZHIgeworCV9fdTggb3BlcmF0aW9uOworCV9fdTggcG9vbDsKKwlfX3UxNiBwYWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSB7CisJX191MzIgdmFsdWVfdHlwZTsKKwlfX3UzMiBrZXlfc2l6ZTsKKwlfX3UzMiB2YWx1ZV9zaXplOworCV9fdTgga2V5W0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOworCXVuaW9uIHsKKwkJX191OCB2YWx1ZVtIVl9LVlBfRVhDSEFOR0VfTUFYX1ZBTFVFX1NJWkVdOworCQlfX3UzMiB2YWx1ZV91MzI7CisJCV9fdTY0IHZhbHVlX3U2NDsKKwl9OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X2t2cF9tc2dfZW51bWVyYXRlIHsKKwlfX3UzMiBpbmRleDsKKwlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X2t2cF9tc2dfZ2V0IHsKKwlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOworfTsKKworc3RydWN0IGh2X2t2cF9tc2dfc2V0IHsKKwlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOworfTsKKworc3RydWN0IGh2X2t2cF9tc2dfZGVsZXRlIHsKKwlfX3UzMiBrZXlfc2l6ZTsKKwlfX3U4IGtleVtIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKK307CisKK3N0cnVjdCBodl9rdnBfcmVnaXN0ZXIgeworCV9fdTggdmVyc2lvbltIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKK307CisKK3N0cnVjdCBodl9rdnBfbXNnIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBodl9rdnBfaGRyCWt2cF9oZHI7CisJCWludCBlcnJvcjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IGh2X2t2cF9tc2dfZ2V0CQlrdnBfZ2V0OworCQlzdHJ1Y3QgaHZfa3ZwX21zZ19zZXQJCWt2cF9zZXQ7CisJCXN0cnVjdCBodl9rdnBfbXNnX2RlbGV0ZQlrdnBfZGVsZXRlOworCQlzdHJ1Y3QgaHZfa3ZwX21zZ19lbnVtZXJhdGUJa3ZwX2VudW1fZGF0YTsKKwkJc3RydWN0IGh2X2t2cF9pcGFkZHJfdmFsdWUgICAgICBrdnBfaXBfdmFsOworCQlzdHJ1Y3QgaHZfa3ZwX3JlZ2lzdGVyCQlrdnBfcmVnaXN0ZXI7CisJfSBib2R5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X2t2cF9pcF9tc2cgeworCV9fdTggb3BlcmF0aW9uOworCV9fdTggcG9vbDsKKwlzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSAgICAgIGt2cF9pcF92YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYgLyogX1VBUElfSFlQRVJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9zcGkvc3BpZGV2LmggYi9pbmNsdWRlL3VhcGkvbGludXgvc3BpL3NwaWRldi5oCmluZGV4IDUyZDllZDAuLmRkNWYyMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9zcGkvc3BpZGV2LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NwaS9zcGlkZXYuaApAQCAtNDIsNiArNDIsMTAgQEAKICNkZWZpbmUgU1BJX0xPT1AJCTB4MjAKICNkZWZpbmUgU1BJX05PX0NTCQkweDQwCiAjZGVmaW5lIFNQSV9SRUFEWQkJMHg4MAorI2RlZmluZSBTUElfVFhfRFVBTAkJMHgxMDAKKyNkZWZpbmUgU1BJX1RYX1FVQUQJCTB4MjAwCisjZGVmaW5lIFNQSV9SWF9EVUFMCQkweDQwMAorI2RlZmluZSBTUElfUlhfUVVBRAkJMHg4MDAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC05Miw3ICs5Niw5IEBACiAJX191MTYJCWRlbGF5X3VzZWNzOwogCV9fdTgJCWJpdHNfcGVyX3dvcmQ7CiAJX191OAkJY3NfY2hhbmdlOwotCV9fdTMyCQlwYWQ7CisJX191OAkJdHhfbmJpdHM7CisJX191OAkJcnhfbmJpdHM7CisJX191MTYJCXBhZDsKIAogCS8qIElmIHRoZSBjb250ZW50cyBvZiAnc3RydWN0IHNwaV9pb2NfdHJhbnNmZXInIGV2ZXIgY2hhbmdlCiAJICogaW5jb21wYXRpYmx5LCB0aGVuIHRoZSBpb2N0bCBudW1iZXIgKGN1cnJlbnRseSAwKSBtdXN0IGNoYW5nZTsKQEAgLTExMCw3ICsxMTYsNyBAQAogI2RlZmluZSBTUElfSU9DX01FU1NBR0UoTikgX0lPVyhTUElfSU9DX01BR0lDLCAwLCBjaGFyW1NQSV9NU0dTSVpFKE4pXSkKIAogCi0vKiBSZWFkIC8gV3JpdGUgb2YgU1BJIG1vZGUgKFNQSV9NT0RFXzAuLlNQSV9NT0RFXzMpICovCisvKiBSZWFkIC8gV3JpdGUgb2YgU1BJIG1vZGUgKFNQSV9NT0RFXzAuLlNQSV9NT0RFXzMpIChsaW1pdGVkIHRvIDggYml0cykgKi8KICNkZWZpbmUgU1BJX0lPQ19SRF9NT0RFCQkJX0lPUihTUElfSU9DX01BR0lDLCAxLCBfX3U4KQogI2RlZmluZSBTUElfSU9DX1dSX01PREUJCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDEsIF9fdTgpCiAKQEAgLTEyNiw2ICsxMzIsMTAgQEAKICNkZWZpbmUgU1BJX0lPQ19SRF9NQVhfU1BFRURfSFoJCV9JT1IoU1BJX0lPQ19NQUdJQywgNCwgX191MzIpCiAjZGVmaW5lIFNQSV9JT0NfV1JfTUFYX1NQRUVEX0haCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDQsIF9fdTMyKQogCisvKiBSZWFkIC8gV3JpdGUgb2YgdGhlIFNQSSBtb2RlIGZpZWxkICovCisjZGVmaW5lIFNQSV9JT0NfUkRfTU9ERTMyCQlfSU9SKFNQSV9JT0NfTUFHSUMsIDUsIF9fdTMyKQorI2RlZmluZSBTUElfSU9DX1dSX01PREUzMgkJX0lPVyhTUElfSU9DX01BR0lDLCA1LCBfX3UzMikKKwogCiAKICNlbmRpZiAvKiBTUElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAppbmRleCBkNmIwMTI4Li4yYTRiNGE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaApAQCAtMTAsOSArMTAsMTUgQEAKIAogZW51bSB7CiAJRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQyA9IDEsCi0JRlVOQ1RJT05GU19TVFJJTkdTX01BR0lDICAgICA9IDIKKwlGVU5DVElPTkZTX1NUUklOR1NfTUFHSUMgPSAyLAorCUZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIgPSAzLAogfTsKIAorZW51bSBmdW5jdGlvbmZzX2ZsYWdzIHsKKwlGVU5DVElPTkZTX0hBU19GU19ERVNDID0gMSwKKwlGVU5DVElPTkZTX0hBU19IU19ERVNDID0gMiwKKwlGVU5DVElPTkZTX0hBU19TU19ERVNDID0gNCwKK307CiAKICNpZm5kZWYgX19LRVJORUxfXwogCkBAIC0yOSwyOSArMzUsMzkgQEAKIAogCiAvKgotICogQWxsIG51bWJlcnMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgotICovCi0KLXN0cnVjdCB1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkIHsKLQlfX2xlMzIgbWFnaWM7Ci0JX19sZTMyIGxlbmd0aDsKLQlfX2xlMzIgZnNfY291bnQ7Ci0JX19sZTMyIGhzX2NvdW50OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKICAqIERlc2NyaXB0b3JzIGZvcm1hdDoKICAqCiAgKiB8IG9mZiB8IG5hbWUgICAgICB8IHR5cGUgICAgICAgICB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgKiB8LS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8ICAgMCB8IG1hZ2ljICAgICB8IExFMzIgICAgICAgICB8IEZVTkNUSU9ORlNfe0ZTLEhTfV9ERVNDUklQVE9SU19NQUdJQyB8CisgKiB8ICAgMCB8IG1hZ2ljICAgICB8IExFMzIgICAgICAgICB8IEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIgICAgICB8CisgKiB8ICAgNCB8IGxlbmd0aCAgICB8IExFMzIgICAgICAgICB8IGxlbmd0aCBvZiB0aGUgd2hvbGUgZGF0YSBjaHVuayAgICAgICB8CisgKiB8ICAgOCB8IGZsYWdzICAgICB8IExFMzIgICAgICAgICB8IGNvbWJpbmF0aW9uIG9mIGZ1bmN0aW9uZnNfZmxhZ3MgICAgICB8CisgKiB8ICAgICB8IGZzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBmdWxsLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CisgKiB8ICAgICB8IGhzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBoaWdoLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CisgKiB8ICAgICB8IHNzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBzdXBlci1zcGVlZCBkZXNjcmlwdG9ycyAgICB8CisgKiB8ICAgICB8IGZzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CisgKiB8ICAgICB8IGhzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CisgKiB8ICAgICB8IHNzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2Ygc3VwZXItc3BlZWQgZGVzY3JpcHRvcnMgICAgICB8CisgKgorICogRGVwZW5kaW5nIG9uIHdoaWNoIGZsYWdzIGFyZSBzZXQsIHZhcmlvdXMgZmllbGRzIG1heSBiZSBtaXNzaW5nIGluIHRoZQorICogc3RydWN0dXJlLiAgQW55IGZsYWdzIHRoYXQgYXJlIG5vdCByZWNvZ25pc2VkIGNhdXNlIHRoZSB3aG9sZSBibG9jayB0byBiZQorICogcmVqZWN0ZWQgd2l0aCAtRU5PU1lTLgorICoKKyAqIExlZ2FjeSBkZXNjcmlwdG9ycyBmb3JtYXQ6CisgKgorICogfCBvZmYgfCBuYW1lICAgICAgfCB0eXBlICAgICAgICAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgIDAgfCBtYWdpYyAgICAgfCBMRTMyICAgICAgICAgfCBGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDICAgICAgICAgfAogICogfCAgIDQgfCBsZW5ndGggICAgfCBMRTMyICAgICAgICAgfCBsZW5ndGggb2YgdGhlIHdob2xlIGRhdGEgY2h1bmsgICAgICAgfAogICogfCAgIDggfCBmc19jb3VudCAgfCBMRTMyICAgICAgICAgfCBudW1iZXIgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgfAogICogfCAgMTIgfCBoc19jb3VudCAgfCBMRTMyICAgICAgICAgfCBudW1iZXIgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgfAogICogfCAgMTYgfCBmc19kZXNjcnMgfCBEZXNjcmlwdG9yW10gfCBsaXN0IG9mIGZ1bGwtc3BlZWQgZGVzY3JpcHRvcnMgICAgICAgfAogICogfCAgICAgfCBoc19kZXNjcnMgfCBEZXNjcmlwdG9yW10gfCBsaXN0IG9mIGhpZ2gtc3BlZWQgZGVzY3JpcHRvcnMgICAgICAgfAogICoKLSAqIGRlc2NzIGFyZSBqdXN0IHZhbGlkIFVTQiBkZXNjcmlwdG9ycyBhbmQgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqIEFsbCBudW1iZXJzIG11c3QgYmUgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KKyAqCisgKiBEZXNjcmlwdG9yW10gaXMgYW4gYXJyYXkgb2YgdmFsaWQgVVNCIGRlc2NyaXB0b3JzIHdoaWNoIGhhdmUgdGhlIGZvbGxvd2luZworICogZm9ybWF0OgogICoKICAqIHwgb2ZmIHwgbmFtZSAgICAgICAgICAgIHwgdHlwZSB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICB8CiAgKiB8LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYmRldmljZV9mcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3VzYmRldmljZV9mcy5oCmluZGV4IDBjNjVlNGIuLmFiZTVmNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC91c2JkZXZpY2VfZnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiZGV2aWNlX2ZzLmgKQEAgLTEwMiw3ICsxMDIsMTAgQEAKIAlpbnQgYnVmZmVyX2xlbmd0aDsKIAlpbnQgYWN0dWFsX2xlbmd0aDsKIAlpbnQgc3RhcnRfZnJhbWU7Ci0JaW50IG51bWJlcl9vZl9wYWNrZXRzOworCXVuaW9uIHsKKwkJaW50IG51bWJlcl9vZl9wYWNrZXRzOwkvKiBPbmx5IHVzZWQgZm9yIGlzb2MgdXJicyAqLworCQl1bnNpZ25lZCBpbnQgc3RyZWFtX2lkOwkvKiBPbmx5IHVzZWQgd2l0aCBidWxrIHN0cmVhbXMgKi8KKwl9OwogCWludCBlcnJvcl9jb3VudDsKIAl1bnNpZ25lZCBpbnQgc2lnbnI7CS8qIHNpZ25hbCB0byBiZSBzZW50IG9uIGNvbXBsZXRpb24sCiAJCQkJICBvciAwIGlmIG5vbmUgc2hvdWxkIGJlIHNlbnQuICovCkBAIC0xNDQsNiArMTQ3LDExIEBACiAJY2hhciBkcml2ZXJbVVNCREVWRlNfTUFYRFJJVkVSTkFNRSArIDFdOwogfTsKIAorc3RydWN0IHVzYmRldmZzX3N0cmVhbXMgeworCXVuc2lnbmVkIGludCBudW1fc3RyZWFtczsgLyogTm90IHVzZWQgYnkgVVNCREVWRlNfRlJFRV9TVFJFQU1TICovCisJdW5zaWduZWQgaW50IG51bV9lcHM7CisJdW5zaWduZWQgY2hhciBlcHNbMF07Cit9OwogCiAjZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcikKICNkZWZpbmUgVVNCREVWRlNfQ09OVFJPTDMyICAgICAgICAgICBfSU9XUignVScsIDAsIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIzMikKQEAgLTE3Niw1ICsxODQsNyBAQAogI2RlZmluZSBVU0JERVZGU19SRUxFQVNFX1BPUlQgICAgICBfSU9SKCdVJywgMjUsIHVuc2lnbmVkIGludCkKICNkZWZpbmUgVVNCREVWRlNfR0VUX0NBUEFCSUxJVElFUyAgX0lPUignVScsIDI2LCBfX3UzMikKICNkZWZpbmUgVVNCREVWRlNfRElTQ09OTkVDVF9DTEFJTSAgX0lPUignVScsIDI3LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdF9jbGFpbSkKKyNkZWZpbmUgVVNCREVWRlNfQUxMT0NfU1RSRUFNUyAgICAgX0lPUignVScsIDI4LCBzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcykKKyNkZWZpbmUgVVNCREVWRlNfRlJFRV9TVFJFQU1TICAgICAgX0lPUignVScsIDI5LCBzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcykKIAogI2VuZGlmIC8qIF9VQVBJX0xJTlVYX1VTQkRFVklDRV9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3NnaXZ3LmggYi9pbmNsdWRlL3ZpZGVvL3NnaXZ3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWE1NjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS92aWRlby9zZ2l2dy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLS8qCi0gKiAgbGludXgvZHJpdmVycy92aWRlby9zZ2l2dy5oIC0tIFNHSSBEQkUgZnJhbWUgYnVmZmVyIGRldmljZSBoZWFkZXIKLSAqCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiAgICAgIEplZmZyZXkgTmV3cXVpc3QsIG5ld3F1aXN0QGVuZ3Iuc2dpLnNvbQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19TR0lWV0ZCX0hfXwotI2RlZmluZSBfX1NHSVZXRkJfSF9fCi0KLSNkZWZpbmUgREJFX0dFVFJFRyhyZWcsIGRlc3QpCQkoKGRlc3QpID0gREJFX1JFR19CQVNFLT5yZWcpCi0jZGVmaW5lIERCRV9TRVRSRUcocmVnLCBzcmMpCQlEQkVfUkVHX0JBU0UtPnJlZyA9IChzcmMpCi0jZGVmaW5lIERCRV9JR0VUUkVHKHJlZywgaWR4LCBkZXN0KQkoKGRlc3QpID0gREJFX1JFR19CQVNFLT5yZWdbaWR4XSkKLSNkZWZpbmUgREJFX0lTRVRSRUcocmVnLCBpZHgsIHNyYykJKERCRV9SRUdfQkFTRS0+cmVnW2lkeF0gPSAoc3JjKSkKLQotI2RlZmluZSBNQVNLKG1zYiwgbHNiKSAgICAgICAgICAoICgoKHUzMikxPDwoKG1zYiktKGxzYikrMSkpLTEpIDw8IChsc2IpICkKLSNkZWZpbmUgR0VUKHYsIG1zYiwgbHNiKSAgICAgICAgKCAoKHUzMikodikgJiBNQVNLKG1zYixsc2IpKSA+PiAobHNiKSApCi0jZGVmaW5lIFNFVCh2LCBmLCBtc2IsIGxzYikgICAgICggKHYpID0gKCh2KSZ+TUFTSyhtc2IsbHNiKSkgfCAoKCAodTMyKShmKTw8KGxzYikgKSAmIE1BU0sobXNiLGxzYikpICkKLQotI2RlZmluZSBHRVRfREJFX0ZJRUxEKHJlZywgZmllbGQsIHYpICAgICAgICBHRVQoKHYpLCBEQkVfIyNyZWcjI18jI2ZpZWxkIyNfTVNCLCBEQkVfIyNyZWcjI18jI2ZpZWxkIyNfTFNCKQotI2RlZmluZSBTRVRfREJFX0ZJRUxEKHJlZywgZmllbGQsIHYsIGYpICAgICBTRVQoKHYpLCAoZiksIERCRV8jI3JlZyMjXyMjZmllbGQjI19NU0IsIERCRV8jI3JlZyMjXyMjZmllbGQjI19MU0IpCi0KLS8qIE5PVEU6IEFsbCBsb2Fkcy9zdG9yZXMgbXVzdCBiZSAzMiBiaXRzIGFuZCB1bmNhY2hlZCAqLwotCi0jZGVmaW5lIERCRV9SRUdfUEhZUwkweGQwMDAwMDAwCi0jZGVmaW5lIERCRV9SRUdfU0laRSAgICAgICAgMHgwMTAwMDAwMAotCi1zdHJ1Y3QgYXNyZWdzIHsKLSAgdm9sYXRpbGUgdTMyIGN0cmxzdGF0OyAgICAgLyogMHgwMDAwMDAgZ2VuZXJhbCBjb250cm9sICovCi0gIHZvbGF0aWxlIHUzMiBkb3RjbG9jazsgICAgIC8qIDB4MDAwMDA0IGRvdCBjbG9jayBQTEwgY29udHJvbCAqLwotICB2b2xhdGlsZSB1MzIgaTJjOyAgICAgICAgICAvKiAweDAwMDAwOCBjcnQgSTJDIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIHN5c2NsazsgICAgICAgLyogMHgwMDAwMGMgc3lzdGVtIGNsb2NrIFBMTCBjb250cm9sICovCi0gIHZvbGF0aWxlIHUzMiBpMmNmcDsgICAgICAgIC8qIDB4MDAwMDEwIGZsYXQgcGFuZWwgSTJDIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIGlkOyAgICAgICAgICAgLyogMHgwMDAwMTQgZGV2aWNlIGlkL2NoaXAgcmV2aXNpb24gKi8KLSAgdm9sYXRpbGUgdTMyIGNvbmZpZzsgICAgICAgLyogMHgwMDAwMTggcG93ZXIgb24gY29uZmlndXJhdGlvbiAqLwotICB2b2xhdGlsZSB1MzIgYmlzdDsgICAgICAgICAvKiAweDAwMDAxYyBpbnRlcm5hbCBiaXN0IHN0YXR1cyAqLwotCi0gIGNoYXIgX3BhZDBbIDB4MDEwMDAwIC0gMHgwMDAwMjAgXTsKLQotICB2b2xhdGlsZSB1MzIgdnRfeHk7ICAgICAgICAvKiAweDAxMDAwMCBjdXJyZW50IGRvdCBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X3h5bWF4OyAgICAgLyogMHgwMTAwMDQgbWF4aW11bSBkb3QgY29vcmRzICovCi0gIHZvbGF0aWxlIHUzMiB2dF92c3luYzsgICAgIC8qIDB4MDEwMDA4IHZzeW5jIG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgdnRfaHN5bmM7ICAgICAvKiAweDAxMDAwYyBoc3luYyBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X3ZibGFuazsgICAgLyogMHgwMTAwMTAgdmJsYW5rIG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgdnRfaGJsYW5rOyAgICAvKiAweDAxMDAxNCBoYmxhbmsgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiB2dF9mbGFnczsgICAgIC8qIDB4MDEwMDE4IHBvbGFyaXR5IG9mIHZ0IHNpZ25hbHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2YycmZfbG9jazsgLyogMHgwMTAwMWMgZjJyZiAmIGZyYW1lbGNrIHkgY29vcmQgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2ludHIwMTsgICAgLyogMHgwMTAwMjAgaW50ciAwLDEgeSBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2ludHIyMzsgICAgLyogMHgwMTAwMjQgaW50ciAyLDMgeSBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIGZwX2hkcnY7ICAgICAgLyogMHgwMTAwMjggZmxhdCBwYW5lbCBoZHJ2IG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgZnBfdmRydjsgICAgICAvKiAweDAxMDAyYyBmbGF0IHBhbmVsIHZkcnYgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiBmcF9kZTsgICAgICAgIC8qIDB4MDEwMDMwIGZsYXQgcGFuZWwgZGUgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiB2dF9ocGl4ZW47ICAgIC8qIDB4MDEwMDM0IGludHJubCBob3JpeiBwaXhlbCBvbi9vZmYqLwotICB2b2xhdGlsZSB1MzIgdnRfdnBpeGVuOyAgICAvKiAweDAxMDAzOCBpbnRybmwgdmVydCBwaXhlbCBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2hjbWFwOyAgICAgLyogMHgwMTAwM2MgY21hcCB3cml0ZSAoaG9yaXopICovCi0gIHZvbGF0aWxlIHUzMiB2dF92Y21hcDsgICAgIC8qIDB4MDEwMDQwIGNtYXAgd3JpdGUgKHZlcnQpICovCi0gIHZvbGF0aWxlIHUzMiBkaWRfc3RhcnRfeHk7IC8qIDB4MDEwMDQ0IGVvbC9mIGRpZC94eSByZXNldCB2YWwgKi8KLSAgdm9sYXRpbGUgdTMyIGNyc19zdGFydF94eTsgLyogMHgwMTAwNDggZW9sL2YgY3JzL3h5IHJlc2V0IHZhbCAqLwotICB2b2xhdGlsZSB1MzIgdmNfc3RhcnRfeHk7ICAvKiAweDAxMDA0YyBlb2wvZiB2Yy94eSByZXNldCB2YWwgKi8KLQotICBjaGFyIF9wYWQxWyAweDAyMDAwMCAtIDB4MDEwMDUwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIG92cl93aWR0aF90aWxlOyAvKiAweDAyMDAwMCBvdmVybGF5IHBsYW5lIGN0cmwgMCAqLwotICB2b2xhdGlsZSB1MzIgb3ZyX2luaHdjdHJsOyAgIC8qIDB4MDIwMDA0IG92ZXJsYXkgcGxhbmUgY3RybCAxICovCi0gIHZvbGF0aWxlIHUzMiBvdnJfY29udHJvbDsgICAgLyogMHgwMjAwMDggb3ZlcmxheSBwbGFuZSBjdHJsIDEgKi8KLQotICBjaGFyIF9wYWQyWyAweDAzMDAwMCAtIDB4MDIwMDBDIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGZybV9zaXplX3RpbGU7ICAvKiAweDAzMDAwMCBub3JtYWwgcGxhbmUgY3RybCAwICovCi0gIHZvbGF0aWxlIHUzMiBmcm1fc2l6ZV9waXhlbDsgLyogMHgwMzAwMDQgbm9ybWFsIHBsYW5lIGN0cmwgMSAqLwotICB2b2xhdGlsZSB1MzIgZnJtX2luaHdjdHJsOyAgIC8qIDB4MDMwMDA4IG5vcm1hbCBwbGFuZSBjdHJsIDIgKi8KLSAgdm9sYXRpbGUgdTMyIGZybV9jb250cm9sOwkgICAvKiAweDAzMDAwQyBub3JtYWwgcGxhbmUgY3RybCAzICovCi0KLSAgY2hhciBfcGFkM1sgMHgwNDAwMDAgLSAweDAzMDAxMCBdOwotCi0gIHZvbGF0aWxlIHUzMiBkaWRfaW5od2N0cmw7ICAgLyogMHgwNDAwMDAgRElEIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIGRpZF9jb250cm9sOyAgICAvKiAweDA0MDAwNCBESUQgc2hhZG93ICovCi0KLSAgY2hhciBfcGFkNFsgMHgwNDgwMDAgLSAweDA0MDAwOCBdOwotCi0gIHZvbGF0aWxlIHUzMiBtb2RlX3JlZ3NbMzJdOyAgLyogMHgwNDgwMDAgLSAweDA0ODA3YyBXSUQgdGFibGUgKi8KLQotICBjaGFyIF9wYWQ1WyAweDA1MDAwMCAtIDB4MDQ4MDgwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGNtYXBbNjE0NF07ICAgICAvKiAweDA1MDAwMCAtIDB4MDU1ZmZjIGNvbG9yIG1hcCAqLwotCi0gIGNoYXIgX3BhZDZbIDB4MDU4MDAwIC0gMHgwNTYwMDAgXTsKLQotICB2b2xhdGlsZSB1MzIgY21fZmlmbzsgICAgICAgIC8qIDB4MDU4MDAwIGNvbG9yIG1hcCBmaWZvIHN0YXR1cyAqLwotCi0gIGNoYXIgX3BhZDdbIDB4MDYwMDAwIC0gMHgwNTgwMDQgXTsKLQotICB2b2xhdGlsZSB1MzIgZ21hcFsyNTZdOyAgICAgIC8qIDB4MDYwMDAwIC0gMHgwNjAzZmMgZ2FtbWEgbWFwICovCi0KLSAgY2hhciBfcGFkOFsgMHgwNjgwMDAgLSAweDA2MDQwMCBdOwotCi0gIHZvbGF0aWxlIHUzMiBnbWFwMTBbMTAyNF07ICAgLyogMHgwNjgwMDAgLSAweDA2OGZmYyBnYW1tYSBtYXAgKi8KLQotICBjaGFyIF9wYWQ5WyAweDA3MDAwMCAtIDB4MDY5MDAwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGNyc19wb3M7ICAgICAgICAvKiAweDA3MDAwMCBjdXNyb3IgY29udHJvbCAwICovCi0gIHZvbGF0aWxlIHUzMiBjcnNfY3RsOyAgICAgICAgLyogMHgwNzAwMDQgY3Vzcm9yIGNvbnRyb2wgMSAqLwotICB2b2xhdGlsZSB1MzIgY3JzX2NtYXBbM107ICAgIC8qIDB4MDcwMDA4IC0gMHgwNzAwMTAgY3JzIGNtYXAgKi8KLQotICBjaGFyIF9wYWQxMFsgMHgwNzgwMDAgLSAweDA3MDAxNCBdOwotCi0gIHZvbGF0aWxlIHUzMiBjcnNfZ2x5cGhbNjRdOyAgLyogMHgwNzgwMDAgLSAweDA3ODBmYyBjcnMgZ2x5cGggKi8KLQotICBjaGFyIF9wYWQxMVsgMHgwODAwMDAgLSAweDA3ODEwMCBdOwotCi0gIHZvbGF0aWxlIHUzMiB2Y18wOyAgICAgICAgICAgLyogMHgwODAwMDAgdmlkZW8gY2FwdHVyZSBjcnRsIDAgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzE7ICAgICAgICAgICAvKiAweDA4MDAwNCB2aWRlbyBjYXB0dXJlIGNydGwgMSAqLwotICB2b2xhdGlsZSB1MzIgdmNfMjsgICAgICAgICAgIC8qIDB4MDgwMDA4IHZpZGVvIGNhcHR1cmUgY3J0bCAyICovCi0gIHZvbGF0aWxlIHUzMiB2Y18zOyAgICAgICAgICAgLyogMHgwODAwMGMgdmlkZW8gY2FwdHVyZSBjcnRsIDMgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzQ7ICAgICAgICAgICAvKiAweDA4MDAxMCB2aWRlbyBjYXB0dXJlIGNydGwgMyAqLwotICB2b2xhdGlsZSB1MzIgdmNfNTsgICAgICAgICAgIC8qIDB4MDgwMDE0IHZpZGVvIGNhcHR1cmUgY3J0bCAzICovCi0gIHZvbGF0aWxlIHUzMiB2Y182OyAgICAgICAgICAgLyogMHgwODAwMTggdmlkZW8gY2FwdHVyZSBjcnRsIDMgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzc7ICAgICAgICAgICAvKiAweDA4MDAxYyB2aWRlbyBjYXB0dXJlIGNydGwgMyAqLwotICB2b2xhdGlsZSB1MzIgdmNfODsgICAgICAgICAgIC8qIDB4MDgwMDBjIHZpZGVvIGNhcHR1cmUgY3J0bCAzICovCi19OwotCi0vKiBCaXQgbWFzayBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lIERCRV9DVFJMU1RBVF9DSElQSURfTVNCICAgICAzCi0jZGVmaW5lIERCRV9DVFJMU1RBVF9DSElQSURfTFNCICAgICAwCi0jZGVmaW5lIERCRV9DVFJMU1RBVF9TRU5TRV9OX01TQiAgICA0Ci0jZGVmaW5lIERCRV9DVFJMU1RBVF9TRU5TRV9OX0xTQiAgICA0Ci0jZGVmaW5lIERCRV9DVFJMU1RBVF9QQ0xLU0VMX01TQiAgICAyOQotI2RlZmluZSBEQkVfQ1RSTFNUQVRfUENMS1NFTF9MU0IgICAgMjgKLQotI2RlZmluZSBEQkVfRE9UQ0xLX01fTVNCICAgICAgICAgICAgNwotI2RlZmluZSBEQkVfRE9UQ0xLX01fTFNCICAgICAgICAgICAgMAotI2RlZmluZSBEQkVfRE9UQ0xLX05fTVNCICAgICAgICAgICAgMTMKLSNkZWZpbmUgREJFX0RPVENMS19OX0xTQiAgICAgICAgICAgIDgKLSNkZWZpbmUgREJFX0RPVENMS19QX01TQiAgICAgICAgICAgIDE1Ci0jZGVmaW5lIERCRV9ET1RDTEtfUF9MU0IgICAgICAgICAgICAxNAotI2RlZmluZSBEQkVfRE9UQ0xLX1JVTl9NU0IgICAgICAgICAgMjAKLSNkZWZpbmUgREJFX0RPVENMS19SVU5fTFNCICAgICAgICAgIDIwCi0KLSNkZWZpbmUgREJFX1ZUX1hZX1ZUX0ZSRUVaRV9NU0IgICAgIDMxCi0jZGVmaW5lIERCRV9WVF9YWV9WVF9GUkVFWkVfTFNCICAgICAzMQotCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT05fTVNCCTIzCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT05fTFNCCTEyCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT0ZGX01TQgkxMQotI2RlZmluZSBEQkVfRlBfVkRSVl9GUF9WRFJWX09GRl9MU0IJMAotCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT05fTVNCCTIzCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT05fTFNCCTEyCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT0ZGX01TQgkxMQotI2RlZmluZSBEQkVfRlBfSERSVl9GUF9IRFJWX09GRl9MU0IJMAotCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PTl9NU0IJCTIzCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PTl9MU0IJCTEyCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PRkZfTVNCCQkxMQotI2RlZmluZSBEQkVfRlBfREVfRlBfREVfT0ZGX0xTQgkJMAotCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PRkZfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT05fTFNCICAgICAgICAxMgotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT0ZGX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX1ZCTEFOS19WVF9WQkxBTktfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfVkJMQU5LX1ZUX1ZCTEFOS19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9WQkxBTktfVlRfVkJMQU5LX09GRl9NU0IgICAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1ZCTEFOS19WVF9WQkxBTktfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX0hCTEFOS19WVF9IQkxBTktfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSEJMQU5LX1ZUX0hCTEFOS19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9IQkxBTktfVlRfSEJMQU5LX09GRl9NU0IgICAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX0hCTEFOS19WVF9IQkxBTktfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX0ZMQUdTX1ZEUlZfSU5WRVJUX01TQgkJMAotI2RlZmluZSBEQkVfVlRfRkxBR1NfVkRSVl9JTlZFUlRfTFNCCQkwCi0jZGVmaW5lIERCRV9WVF9GTEFHU19IRFJWX0lOVkVSVF9NU0IJCTIKLSNkZWZpbmUgREJFX1ZUX0ZMQUdTX0hEUlZfSU5WRVJUX0xTQgkJMgotCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PRkZfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT05fTFNCICAgICAgICAxMgotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT0ZGX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX1hZTUFYX1ZUX01BWFhfTVNCICAgIDExCi0jZGVmaW5lIERCRV9WVF9YWU1BWF9WVF9NQVhYX0xTQiAgICAwCi0jZGVmaW5lIERCRV9WVF9YWU1BWF9WVF9NQVhZX01TQiAgICAyMwotI2RlZmluZSBEQkVfVlRfWFlNQVhfVlRfTUFYWV9MU0IgICAgMTIKLQotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PTl9NU0IgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PTl9MU0IgICAgICAxMgotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PRkZfTVNCICAgICAxMQotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PRkZfTFNCICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT05fTVNCICAgICAgMjMKLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT05fTFNCICAgICAgMTIKLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT0ZGX01TQiAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT0ZGX0xTQiAgICAgMAotCi0jZGVmaW5lIERCRV9PVlJfQ09OVFJPTF9PVlJfRE1BX0VOQUJMRV9NU0IgIDAKLSNkZWZpbmUgREJFX09WUl9DT05UUk9MX09WUl9ETUFfRU5BQkxFX0xTQiAgMAotCi0jZGVmaW5lIERCRV9PVlJfSU5IV0NUUkxfT1ZSX0RNQV9FTkFCTEVfTVNCIDAKLSNkZWZpbmUgREJFX09WUl9JTkhXQ1RSTF9PVlJfRE1BX0VOQUJMRV9MU0IgMAotCi0jZGVmaW5lIERCRV9PVlJfV0lEVEhfVElMRV9PVlJfRklGT19SRVNFVF9NU0IgICAgICAgMTMKLSNkZWZpbmUgREJFX09WUl9XSURUSF9USUxFX09WUl9GSUZPX1JFU0VUX0xTQiAgICAgICAxMwotCi0jZGVmaW5lIERCRV9GUk1fQ09OVFJPTF9GUk1fRE1BX0VOQUJMRV9NU0IgIDAKLSNkZWZpbmUgREJFX0ZSTV9DT05UUk9MX0ZSTV9ETUFfRU5BQkxFX0xTQiAgMAotI2RlZmluZSBEQkVfRlJNX0NPTlRST0xfRlJNX1RJTEVfUFRSX01TQiAgICAzMQotI2RlZmluZSBEQkVfRlJNX0NPTlRST0xfRlJNX1RJTEVfUFRSX0xTQiAgICA5Ci0jZGVmaW5lIERCRV9GUk1fQ09OVFJPTF9GUk1fTElORUFSX01TQiAgICAgIDEKLSNkZWZpbmUgREJFX0ZSTV9DT05UUk9MX0ZSTV9MSU5FQVJfTFNCICAgICAgMQotCi0jZGVmaW5lIERCRV9GUk1fSU5IV0NUUkxfRlJNX0RNQV9FTkFCTEVfTVNCIDAKLSNkZWZpbmUgREJFX0ZSTV9JTkhXQ1RSTF9GUk1fRE1BX0VOQUJMRV9MU0IgMAotCi0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9XSURUSF9USUxFX01TQiAgICAgICAgMTIKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX1dJRFRIX1RJTEVfTFNCICAgICAgICA1Ci0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9SSFNfTVNCICAgICAgIDQKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX1JIU19MU0IgICAgICAgMAotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fREVQVEhfTVNCICAgICAxNAotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fREVQVEhfTFNCICAgICAxMwotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fRklGT19SRVNFVF9NU0IgICAgICAgIDE1Ci0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9GSUZPX1JFU0VUX0xTQiAgICAgICAgMTUKLQotI2RlZmluZSBEQkVfRlJNX1NJWkVfUElYRUxfRkJfSEVJR0hUX1BJWF9NU0IgICAgICAgIDMxCi0jZGVmaW5lIERCRV9GUk1fU0laRV9QSVhFTF9GQl9IRUlHSFRfUElYX0xTQiAgICAgICAgMTYKLQotI2RlZmluZSBEQkVfRElEX0NPTlRST0xfRElEX0RNQV9FTkFCTEVfTVNCICAwCi0jZGVmaW5lIERCRV9ESURfQ09OVFJPTF9ESURfRE1BX0VOQUJMRV9MU0IgIDAKLSNkZWZpbmUgREJFX0RJRF9JTkhXQ1RSTF9ESURfRE1BX0VOQUJMRV9NU0IgMAotI2RlZmluZSBEQkVfRElEX0lOSFdDVFJMX0RJRF9ETUFfRU5BQkxFX0xTQiAwCi0KLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRZX01TQiAgICAgMjMKLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRZX0xTQiAgICAgMTIKLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRYX01TQiAgICAgMTEKLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRYX0xTQiAgICAgMAotCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWV9NU0IgICAgIDIzCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWV9MU0IgICAgIDEyCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWF9NU0IgICAgIDExCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWF9MU0IgICAgIDAKLQotI2RlZmluZSBEQkVfV0lEX1RZUF9NU0IgICAgIDQKLSNkZWZpbmUgREJFX1dJRF9UWVBfTFNCICAgICAyCi0jZGVmaW5lIERCRV9XSURfQlVGX01TQiAgICAgMQotI2RlZmluZSBEQkVfV0lEX0JVRl9MU0IgICAgIDAKLQotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRZX01TQiAgICAgICAyMwotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRZX0xTQiAgICAgICAxMgotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRYX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRYX0xTQiAgICAgICAwCi0KLS8qIENvbnN0YW50cyAqLwotCi0jZGVmaW5lIERCRV9GUk1fREVQVEhfOCAgICAgMAotI2RlZmluZSBEQkVfRlJNX0RFUFRIXzE2ICAgIDEKLSNkZWZpbmUgREJFX0ZSTV9ERVBUSF8zMiAgICAyCi0KLSNkZWZpbmUgREJFX0NNT0RFX0k4ICAgICAgICAwCi0jZGVmaW5lIERCRV9DTU9ERV9JMTIgICAgICAgMQotI2RlZmluZSBEQkVfQ01PREVfUkczQjIgICAgIDIKLSNkZWZpbmUgREJFX0NNT0RFX1JHQjQgICAgICAzCi0jZGVmaW5lIERCRV9DTU9ERV9BUkdCNSAgICAgNAotI2RlZmluZSBEQkVfQ01PREVfUkdCOCAgICAgIDUKLSNkZWZpbmUgREJFX0NNT0RFX1JHQkE1ICAgICA2Ci0jZGVmaW5lIERCRV9DTU9ERV9SR0IxMCAgICAgNwotCi0jZGVmaW5lIERCRV9CTU9ERV9CT1RIICAgICAgMwotCi0jZGVmaW5lIERCRV9DUlNfTUFHSUMgICAgICAgNTQKLQotI2RlZmluZSBEQkVfQ0xPQ0tfUkVGX0tIWgkyNzAwMAotCi0vKiBDb25maWcgUmVnaXN0ZXIgKERCRSBPbmx5KSBEZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIERCRV9DT05GSUdfVkRBQ19FTkFCTEUgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBEQkVfQ09ORklHX1ZEQUNfR1NZTkMgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgREJFX0NPTkZJR19WREFDX1BCTEFOSyAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIERCRV9DT05GSUdfRlBFTkFCTEUgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBEQkVfQ09ORklHX0xFTkRJQU4gICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgREJFX0NPTkZJR19USUxFSElTVCAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIERCRV9DT05GSUdfRVhUX0FERFIgICAgICAgICAgMHgwMDAwMDA4MAotCi0jZGVmaW5lIERCRV9DT05GSUdfRkJERVYgICAgICAgICggREJFX0NPTkZJR19WREFDX0VOQUJMRSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19WREFDX0dTWU5DICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19WREFDX1BCTEFOSyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19MRU5ESUFOICAgICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19FWFRfQUREUiApCi0KLS8qCi0gKiBBdmFpbGFibGUgVmlkZW8gVGltaW5ncyBhbmQgQ29ycmVzcG9uZGluZyBJbmRpY2VzCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgREJFX1ZUXzY0MF80ODBfNjAsCi0KLSAgREJFX1ZUXzgwMF82MDBfNjAsCi0gIERCRV9WVF84MDBfNjAwXzc1LAotICBEQkVfVlRfODAwXzYwMF8xMjAsCi0KLSAgREJFX1ZUXzEwMjRfNzY4XzUwLAotICBEQkVfVlRfMTAyNF83NjhfNjAsCi0gIERCRV9WVF8xMDI0Xzc2OF83NSwKLSAgREJFX1ZUXzEwMjRfNzY4Xzg1LAotICBEQkVfVlRfMTAyNF83NjhfMTIwLAotCi0gIERCRV9WVF8xMjgwXzEwMjRfNTAsCi0gIERCRV9WVF8xMjgwXzEwMjRfNjAsCi0gIERCRV9WVF8xMjgwXzEwMjRfNzUsCi0gIERCRV9WVF8xMjgwXzEwMjRfODUsCi0KLSAgREJFX1ZUXzE2MDBfMTAyNF81MywKLSAgREJFX1ZUXzE2MDBfMTAyNF82MCwKLQotICBEQkVfVlRfMTYwMF8xMjAwXzUwLAotICBEQkVfVlRfMTYwMF8xMjAwXzYwLAotICBEQkVfVlRfMTYwMF8xMjAwXzc1LAotCi0gIERCRV9WVF8xOTIwXzEwODBfNTAsCi0gIERCRV9WVF8xOTIwXzEwODBfNjAsCi0gIERCRV9WVF8xOTIwXzEwODBfNzIsCi0KLSAgREJFX1ZUXzE5MjBfMTIwMF81MCwKLSAgREJFX1ZUXzE5MjBfMTIwMF82MCwKLSAgREJFX1ZUXzE5MjBfMTIwMF82NiwKLQotICBEQkVfVlRfVU5LTk9XTgotfSBkYmVfdGltaW5nX3Q7Ci0KLQotCi0vKgotICogQ3JpbWUgVmlkZW8gVGltaW5nIERhdGEgU3RydWN0dXJlCi0gKi8KLQotc3RydWN0IGRiZV90aW1pbmdfaW5mbwotewotICBkYmVfdGltaW5nX3QgdHlwZTsKLSAgaW50IGZsYWdzOwotICBzaG9ydCB3aWR0aDsJCSAgICAvKiBNb25pdG9yIHJlc29sdXRpb24JCSovCi0gIHNob3J0IGhlaWdodDsKLSAgaW50IGZpZWxkc19zZWM7CSAgICAvKiBmaWVsZHMvc2VjICAoSHogLTMgZGVjLiBwbGFjZXMgKi8KLSAgaW50IGNmcmVxOwkJICAgIC8qIHBpeGVsIGNsb2NrIGZyZXF1ZW5jeSAoTUh6IC0zIGRlYy4gcGxhY2VzKSAqLwotICBzaG9ydCBodG90YWw7CQkgICAgLyogSG9yaXpvbnRhbCB0b3RhbCBwaXhlbHMJKi8KLSAgc2hvcnQgaGJsYW5rX3N0YXJ0OwkgICAgLyogSG9yaXpvbnRhbCBibGFuayBzdGFydAkqLwotICBzaG9ydCBoYmxhbmtfZW5kOwkgICAgLyogSG9yaXpvbnRhbCBibGFuayBlbmQJCSovCi0gIHNob3J0IGhzeW5jX3N0YXJ0OwkgICAgLyogSG9yaXpvbnRhbCBzeW5jIHN0YXJ0CSovCi0gIHNob3J0IGhzeW5jX2VuZDsJICAgIC8qIEhvcml6b250YWwgc3luYyBlbmQJCSovCi0gIHNob3J0IHZ0b3RhbDsJCSAgICAvKiBWZXJ0aWNhbCB0b3RhbCBsaW5lcwkJKi8KLSAgc2hvcnQgdmJsYW5rX3N0YXJ0OwkgICAgLyogVmVydGljYWwgYmxhbmsgc3RhcnQJCSovCi0gIHNob3J0IHZibGFua19lbmQ7CSAgICAvKiBWZXJ0aWNhbCBibGFuayBlbmQJCSovCi0gIHNob3J0IHZzeW5jX3N0YXJ0OwkgICAgLyogVmVydGljYWwgc3luYyBzdGFydAkJKi8KLSAgc2hvcnQgdnN5bmNfZW5kOwkgICAgLyogVmVydGljYWwgc3luYyBlbmQJCSovCi0gIHNob3J0IHBsbF9tOwkJICAgIC8qIFBMTCBNIHBhcmFtZXRlcgkJKi8KLSAgc2hvcnQgcGxsX247CQkgICAgLyogUExMIFAgcGFyYW1ldGVyCQkqLwotICBzaG9ydCBwbGxfcDsJCSAgICAvKiBQTEwgTiBwYXJhbWV0ZXIJCSovCi19OwotCi0vKiBEZWZpbmVzIGZvciBkYmVfdm9mX2luZm9fdCBmbGFncyAqLwotCi0jZGVmaW5lIERCRV9WT0ZfVU5LTk9XTk1PTiAgICAxCi0jZGVmaW5lIERCRV9WT0ZfU1RFUkVPICAgICAgICAyCi0jZGVmaW5lIERCRV9WT0ZfRE9fR0VOU1lOQyAgICA0ICAgICAgICAgIC8qIGVuYWJsZSBpbmNvbWluZyBzeW5jICovCi0jZGVmaW5lIERCRV9WT0ZfU1lOQ19PTl9HUkVFTiA4ICAgICAgICAgIC8qIHN5bmMgb24gZ3JlZW4gKi8KLSNkZWZpbmUgREJFX1ZPRl9GTEFUUEFORUwgICAgIDB4MTAwMCAgICAgLyogRkxBVFBBTkVMIFRpbWluZyAqLwotI2RlZmluZSBEQkVfVk9GX01BR0lDS0VZICAgICAgMHgyMDAwICAgICAvKiBCYWNrZG9vciBrZXkgKi8KLQotLyoKLSAqIERCRSBUaW1pbmcgVGFibGVzCi0gKi8KLQotI2lmZGVmIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKLXN0cnVjdCBkYmVfdGltaW5nX2luZm8gZGJlVlRpbWluZ3NbXSA9IHsKLSAgewotICAgIERCRV9WVF82NDBfNDgwXzYwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgICAgIDY0MCwJCQk0ODAsCQk1OTk0MCwJCQkyNTE3NSwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDgwMCwJNjQwLAkJICAgICAgICA4MDAsCQk2NTYsCQk3NTIsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA1MjUsCTQ4MCwJCSAgICAgICAgNTI1LAkJNDkwLAkJICAgIDQ5MiwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICAxNSwJICAgIDIsCQkJCTMKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzgwMF82MDBfNjAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICA4MDAsCQkJNjAwLAkJNjAzMTcsCQkJNDAwMDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMDU2LAk4MDAsCQkgICAgMTA1NiwJCTg0MCwJCSAgICA5NjgsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA2MjgsCTYwMCwJCSAgICA2MjgsCQk2MDEsCQkgICAgNjA1LAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDMsCSAgICAxLAkJCQkxCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF84MDBfNjAwXzc1LAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCSAgICBoZWlnaHQsCQlmaWVsZHNfc2VjLAkgICAgY2ZyZXEgKi8KLSAgICAwLAkgICAgODAwLAkJICAgIDYwMCwJCTc1MDAwLAkJICAgIDQ5NTAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTA1NiwJODAwLAkJICAgIDEwNTYsCQk4MTYsCQkgICAgODk2LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgNjI1LAk2MDAsCQkgICAgNjI1LAkJNjAxLAkJICAgIDYwNCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkgICAgcGxsX3AgKi8KLSAgICAxMSwJICAgIDMsCQkgICAgICAgIDEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzgwMF82MDBfMTIwLAotICAgIC8qCWZsYWdzLAkJCQkJd2lkdGgsCQloZWlnaHQsCQkJZmllbGRzX3NlYywJICAgIGNmcmVxICovCi0gICAgREJFX1ZPRl9TVEVSRU8sCSAgICA4MDAsCQk2MDAsCQkJMTE5ODAwLAkJICAgIDgyOTc4LAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTA0MCwJODAwLAkJICAgIDEwNDAsCQk4NTYsCQkgICAgOTc2LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgNjY2LAk2MDAsCQkgICAgNjY2LAkJNjM3LAkJICAgIDY0MywKLSAgICAvKglwbGxfbSwJcGxsX24sCQkgICAgcGxsX3AgKi8KLSAgICAzMSwJICAgIDUsCQkgICAgICAgIDEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEwMjRfNzY4XzUwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCSAgICBoZWlnaHQsCQlmaWVsZHNfc2VjLAkgICAgY2ZyZXEgKi8KLSAgICAwLAkgICAgMTAyNCwJCSAgICA3NjgsCQk1MDAwMCwJCSAgICA1NDE2MywKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEzNDQsCTEwMjQsCQkgICAgMTM0NCwJCTEwNDgsCQkgICAgMTE4NCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDgwNiwJNzY4LAkJICAgIDgwNiwJCTc3MSwJCSAgICA3NzcsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJICAgIHBsbF9wICovCi0gICAgNCwJICAgIDEsCQkgICAgICAgIDEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEwMjRfNzY4XzYwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgMTAyNCwJCQk3NjgsCQk2MDAwNCwJCQk2NTAwMCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEzNDQsCTEwMjQsCQkgICAgMTM0NCwJCTEwNDgsCQkgICAgMTE4NCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDgwNiwJNzY4LAkJICAgIDgwNiwJCTc3MSwJCSAgICA3NzcsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJCXBsbF9wICovCi0gICAgMTIsCSAgICA1LAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMDI0Xzc2OF83NSwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDEwMjQsCQkJNzY4LAkJNzUwMjksCQkJNzg3NTAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMzEyLAkxMDI0LAkJICAgIDEzMTIsCQkxMDQwLAkJICAgIDExMzYsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA4MDAsCTc2OCwJCSAgICA4MDAsCQk3NjksCQkgICAgNzcyLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDI5LAkgICAgNSwJCQkJMQotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTAyNF83NjhfODUsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAxMDI0LAkJCTc2OCwJCTg0OTk3LAkJCTk0NTAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTM3NiwJMTAyNCwJCSAgICAxMzc2LAkJMTA3MiwJCSAgICAxMTY4LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgODA4LAk3NjgsCQkgICAgODA4LAkJNzY5LAkJICAgIDc3MiwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICA3LAkgICAgMiwJCQkJMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTAyNF83NjhfMTIwLAotICAgIC8qCWZsYWdzLAkJCQkJd2lkdGgsCQloZWlnaHQsCQkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgREJFX1ZPRl9TVEVSRU8sCSAgICAxMDI0LAkJNzY4LAkJCTExOTgwMCwJCQkxMzMxOTUsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMzc2LAkxMDI0LAkJICAgIDEzNzYsCQkxMDcyLAkJICAgIDExNjgsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA4MDgsCTc2OCwJCSAgICA4MDgsCQk3NjksCQkgICAgNzcyLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDUsCSAgICAxLAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMjgwXzEwMjRfNTAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAxMjgwLAkJCTEwMjQsCQk1MDAwMCwJCQk4OTQ2MCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDE2ODAsCTEyODAsCQkgICAgMTY4MCwJCTEzNjAsCQkgICAgMTQ4MCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDEwNjUsCTEwMjQsCQkgICAgMTA2NSwJCTEwMjcsCQkgICAgMTAzMCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICAxMCwJICAgIDMsCQkJCTAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEyODBfMTAyNF82MCwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDEyODAsCQkJMTAyNCwJCTYwMDIwLAkJCTEwODAwMCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDE2ODgsCTEyODAsCQkgICAgMTY4OCwJCTEzMjgsCQkgICAgMTQ0MCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDEwNjYsCTEwMjQsCQkgICAgMTA2NiwJCTEwMjUsCQkgICAgMTAyOCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICA0LAkgICAgMSwJCQkgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTI4MF8xMDI0Xzc1LAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgMTI4MCwJCQkxMDI0LAkJNzUwMjUsCQkJMTM1MDAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTY4OCwJMTI4MCwJCSAgICAxNjg4LAkJMTI5NiwJCSAgICAxNDQwLAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgMTA2NiwJMTAyNCwJCSAgICAxMDY2LAkJMTAyNSwJCSAgICAxMDI4LAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDUsCSAgICAxLAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMjgwXzEwMjRfODUsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJICAgIGhlaWdodCwJCWZpZWxkc19zZWMsCSAgICBjZnJlcSAqLwotICAgIDAsCSAgICAxMjgwLAkJICAgIDEwMjQsCQk4NTAyNCwJCSAgICAxNTc1MDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxNzI4LAkxMjgwLAkJICAgIDE3MjgsCQkxMzQ0LAkJICAgIDE1MDQsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICAxMDcyLAkxMDI0LAkJICAgIDEwNzIsCQkxMDI1LAkJICAgIDEwMjgsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJICAgIHBsbF9wICovCi0gICAgMjksCSAgICA1LAkJICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEwMjRfNTMsCi0gICAgLyogZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIERCRV9WT0ZfRkxBVFBBTkVMIHwgREJFX1ZPRl9NQUdJQ0tFWSwKLSAgICAxNjAwLAkJCTEwMjQsCQk1MzAwMCwJCQkxMDc0NDcsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAxOTAwLCAgIDE2MDAsICAgICAgICAgICAxOTAwLCAgICAgICAgICAgMTYzMCwgICAgICAgICAgIDE3MzAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMDY3LCAgIDEwMjQsICAgICAgICAgICAxMDY3LCAgICAgICAgICAgMTAyNywgICAgICAgICAgIDEwMzAsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA0LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEwMjRfNjAsCi0gICAgLyogZmxhZ3MsCQkJCQl3aWR0aCwgICAgICAgICAgaGVpZ2h0LAkJCWZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIERCRV9WT0ZfRkxBVFBBTkVMLCAgIDE2MDAsICAgICAgICAgICAxMDI0LAkJCTYwMDAwLCAgICAgICAgICAxMDY5MTMsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAxNjcwLCAgIDE2MDAsICAgICAgICAgICAxNjcwLCAgICAgICAgICAgMTYzMCwgICAgICAgICAgIDE2NTAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMDY3LCAgIDEwMjQsICAgICAgICAgICAxMDY3LCAgICAgICAgICAgMTAyNywgICAgICAgICAgIDEwMzAsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA0LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEyMDBfNTAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTYwMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA1MDAwMCwgICAgICAgICAgMTMwNTAwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjA4OCwgICAxNjAwLCAgICAgICAgICAgMjA4OCwgICAgICAgICAgIDE2NDQsICAgICAgICAgICAxNzY0LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDUsICAgICAgICAgICAxMjExLAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgMjQsICAgICA1LCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTYwMF8xMjAwXzYwLAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE2MDAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNTk5NDAsICAgICAgICAgIDE2MjAwMCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDIxNjAsICAgMTYwMCwgICAgICAgICAgIDIxNjAsICAgICAgICAgICAxNjQ0LCAgICAgICAgICAgMTg1NiwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAxLCAgICAgICAgICAgMTIwNCwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDYsCQkxLCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTYwMF8xMjAwXzc1LAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE2MDAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNzUwMDAsICAgICAgICAgIDIwMjUwMCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDIxNjAsICAgMTYwMCwgICAgICAgICAgIDIxNjAsICAgICAgICAgICAxNjQ0LCAgICAgICAgICAgMTg1NiwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAxLCAgICAgICAgICAgMTIwNCwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDE1LAkJMiwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE5MjBfMTA4MF81MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxOTIwLCAgICAgICAgICAgMTA4MCwgICAgICAgICAgIDUwMDAwLCAgICAgICAgICAxMzMyMDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyMzY4LCAgIDE5MjAsICAgICAgICAgICAyMzY4LCAgICAgICAgICAgMTk1MiwgICAgICAgICAgIDIwOTYsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMTI1LCAgIDEwODAsICAgICAgICAgICAxMTI1LCAgICAgICAgICAgMTA4MywgICAgICAgICAgIDEwODYsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA1LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xOTIwXzEwODBfNjAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTkyMCwgICAgICAgICAgIDEwODAsICAgICAgICAgICA1OTk0MCwgICAgICAgICAgMTU5ODQwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjM2OCwgICAxOTIwLCAgICAgICAgICAgMjM2OCwgICAgICAgICAgIDE5NTIsICAgICAgICAgICAyMDk2LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTEyNSwgICAxMDgwLCAgICAgICAgICAgMTEyNSwgICAgICAgICAgIDEwODMsICAgICAgICAgICAxMDg2LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgNiwgICAgICAxLCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTkyMF8xMDgwXzcyLAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE5MjAsICAgICAgICAgICAxMDgwLCAgICAgICAgICAgNzIwMDAsICAgICAgICAgIDIxNjAyMywKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDI1NjAsICAgMTkyMCwgICAgICAgICAgIDI1NjAsICAgICAgICAgICAxOTY4LCAgICAgICAgICAgMjE4NCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDExNzIsICAgMTA4MCwgICAgICAgICAgIDExNzIsICAgICAgICAgICAxMDgzLCAgICAgICAgICAgMTA4NiwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDgsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE5MjBfMTIwMF81MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxOTIwLCAgICAgICAgICAgMTIwMCwgICAgICAgICAgIDUwMDAwLCAgICAgICAgICAxNjE1MDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyNTg0LCAgIDE5MjAsICAgICAgICAgICAyNTg0LCAgICAgICAgICAgMTk4NCwgICAgICAgICAgIDIyNDAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMjUwLCAgIDEyMDAsICAgICAgICAgICAxMjUwLCAgICAgICAgICAgMTIwMywgICAgICAgICAgIDEyMDYsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA2LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xOTIwXzEyMDBfNjAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTkyMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA1OTk0MCwgICAgICAgICAgMTkzODAwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjU4NCwgICAxOTIwLCAgICAgICAgICAgMjU4NCwgICAgICAgICAgIDE5ODQsICAgICAgICAgICAyMjQwLAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDMsICAgICAgICAgICAxMjA2LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgMjksICAgICA0LCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTkyMF8xMjAwXzY2LAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE5MjAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNjYwMDAsICAgICAgICAgIDIxMzE4MCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDI1ODQsICAgMTkyMCwgICAgICAgICAgIDI1ODQsICAgICAgICAgICAxOTg0LCAgICAgICAgICAgMjI0MCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAzLCAgICAgICAgICAgMTIwNiwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDgsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfQotfTsKLQotI2VuZGlmIC8vIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKLQotI2VuZGlmIC8vICEgX19TR0lWV0ZCX0hfXwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDAwOWE3OTcuLmQ1NmNiMDMgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTEzODcsNiArMTM4NywxMyBAQAogCSAgc3VwcG9ydCBmb3IgImZhc3QgdXNlcnNwYWNlIG11dGV4ZXMiLiAgVGhlIHJlc3VsdGluZyBrZXJuZWwgbWF5IG5vdAogCSAgcnVuIGdsaWJjLWJhc2VkIGFwcGxpY2F0aW9ucyBjb3JyZWN0bHkuCiAKK2NvbmZpZyBIQVZFX0ZVVEVYX0NNUFhDSEcKKwlib29sCisJaGVscAorCSAgQXJjaGl0ZWN0dXJlcyBzaG91bGQgc2VsZWN0IHRoaXMgaWYgZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWMoKQorCSAgaXMgaW1wbGVtZW50ZWQgYW5kIGFsd2F5cyB3b3JraW5nLiBUaGlzIHJlbW92ZXMgYSBjb3VwbGUgb2YgcnVudGltZQorCSAgY2hlY2tzLgorCiBjb25maWcgRVBPTEwKIAlib29sICJFbmFibGUgZXZlbnRwb2xsIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvaXBjL2NvbXBhdC5jIGIvaXBjL2NvbXBhdC5jCmluZGV4IGY0ODZiMDAuLmE0Njk1YWQgMTAwNjQ0Ci0tLSBhL2lwYy9jb21wYXQuYworKysgYi9pcGMvY29tcGF0LmMKQEAgLTQzMCw5ICs0MzAsOSBAQAogfQogCiBDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KG1zZ3JjdiwgaW50LCBtc3FpZCwgY29tcGF0X3VwdHJfdCwgbXNncCwKLQkJICAgICAgIGNvbXBhdF9zc2l6ZV90LCBtc2dzeiwgbG9uZywgbXNndHlwLCBpbnQsIG1zZ2ZsZykKKwkJICAgICAgIGNvbXBhdF9zc2l6ZV90LCBtc2dzeiwgY29tcGF0X2xvbmdfdCwgbXNndHlwLCBpbnQsIG1zZ2ZsZykKIHsKLQlyZXR1cm4gZG9fbXNncmN2KG1zcWlkLCBjb21wYXRfcHRyKG1zZ3ApLCAoc3NpemVfdCltc2dzeiwgbXNndHlwLAorCXJldHVybiBkb19tc2dyY3YobXNxaWQsIGNvbXBhdF9wdHIobXNncCksIChzc2l6ZV90KW1zZ3N6LCAobG9uZyltc2d0eXAsCiAJCQkgbXNnZmxnLCBjb21wYXRfZG9fbXNnX2ZpbGwpOwogfQogCkBAIC00OTgsNyArNDk4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfbXNnY3RsKGludCBmaXJzdCwgaW50IHNlY29uZCwgdm9pZCBfX3VzZXIgKnVwdHIpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKG1zZ2N0bCwgaW50LCBmaXJzdCwgaW50LCBzZWNvbmQsIHZvaWQgX191c2VyICosIHVwdHIpCiB7CiAJaW50IGVyciwgZXJyMjsKIAlzdHJ1Y3QgbXNxaWQ2NF9kcyBtNjQ7CkBAIC02NjgsNyArNjY4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfc2htY3RsKGludCBmaXJzdCwgaW50IHNlY29uZCwgdm9pZCBfX3VzZXIgKnVwdHIpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHNobWN0bCwgaW50LCBmaXJzdCwgaW50LCBzZWNvbmQsIHZvaWQgX191c2VyICosIHVwdHIpCiB7CiAJdm9pZCBfX3VzZXIgKnA7CiAJc3RydWN0IHNobWlkNjRfZHMgczY0OwpAQCAtNzQ5LDE3ICs3NDksMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfc2VtdGltZWRvcChpbnQgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICp0c2VtcywKLQkJdW5zaWduZWQgbnNvcHMsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChzZW10aW1lZG9wLCBpbnQsIHNlbWlkLCBzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqLCB0c2VtcywKKwkJICAgICAgIHVuc2lnbmVkLCBuc29wcywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRpbWVvdXQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdHM2NCA9IE5VTEw7Ci0JaWYgKHRpbWVvdXQpIHsKLQkJc3RydWN0IHRpbWVzcGVjIHRzOwotCQl0czY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp0czY0KSk7Ci0JCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0cywgdGltZW91dCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcih0czY0LCAmdHMsIHNpemVvZih0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRzNjQ7CisJaWYgKGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKCZ0czY0LCB0aW1lb3V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIHN5c19zZW10aW1lZG9wKHNlbWlkLCB0c2VtcywgbnNvcHMsIHRzNjQpOwogfQpkaWZmIC0tZ2l0IGEvaXBjL2NvbXBhdF9tcS5jIGIvaXBjL2NvbXBhdF9tcS5jCmluZGV4IDYzZDdjNmRlLi45MGQyOWY1IDEwMDY0NAotLS0gYS9pcGMvY29tcGF0X21xLmMKKysrIGIvaXBjL2NvbXBhdF9tcS5jCkBAIC00Niw5ICs0Niw5IEBACiAJCXwgX19wdXRfdXNlcihhdHRyLT5tcV9jdXJtc2dzLCAmdWF0dHItPm1xX2N1cm1zZ3MpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tcV9vcGVuKGNvbnN0IGNoYXIgX191c2VyICp1X25hbWUsCi0JCQlpbnQgb2ZsYWcsIGNvbXBhdF9tb2RlX3QgbW9kZSwKLQkJCXN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKnVfYXR0cikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQobXFfb3BlbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgdV9uYW1lLAorCQkgICAgICAgaW50LCBvZmxhZywgY29tcGF0X21vZGVfdCwgbW9kZSwKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKiwgdV9hdHRyKQogewogCXZvaWQgX191c2VyICpwID0gTlVMTDsKIAlpZiAodV9hdHRyICYmIG9mbGFnICYgT19DUkVBVCkgewpAQCAtNjQsNDkgKzY0LDM2IEBACiAJcmV0dXJuIHN5c19tcV9vcGVuKHVfbmFtZSwgb2ZsYWcsIG1vZGUsIHApOwogfQogCi1zdGF0aWMgaW50IGNvbXBhdF9wcmVwYXJlX3RpbWVvdXQoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKnAsCi0JCQkJICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdSkKLXsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0JaWYgKCF1KSB7Ci0JCSpwID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHRzKSk7Ci0JaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnRzLCB1KSB8fCBjb3B5X3RvX3VzZXIoKnAsICZ0cywgc2l6ZW9mKHRzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tcV90aW1lZHNlbmQobXFkX3QgbXFkZXMsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCQkJc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBtc2dfcHJpbywKLQkJCWNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp1X2Fic190aW1lb3V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShtcV90aW1lZHNlbmQsIG1xZF90LCBtcWRlcywKKwkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICosIHVfbXNnX3B0ciwKKwkJICAgICAgIGNvbXBhdF9zaXplX3QsIG1zZ19sZW4sIHVuc2lnbmVkIGludCwgbXNnX3ByaW8sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCB1X2Fic190aW1lb3V0KQogewogCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnVfdHM7CiAKLQlpZiAoY29tcGF0X3ByZXBhcmVfdGltZW91dCgmdV90cywgdV9hYnNfdGltZW91dCkpCisJaWYgKGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKCZ1X3RzLCB1X2Fic190aW1lb3V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gc3lzX21xX3RpbWVkc2VuZChtcWRlcywgdV9tc2dfcHRyLCBtc2dfbGVuLAogCQkJbXNnX3ByaW8sIHVfdHMpOwogfQogCi1hc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUobXFkX3QgbXFkZXMsCi0JCQljaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCQkJc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBfX3VzZXIgKnVfbXNnX3ByaW8sCi0JCQljb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdV9hYnNfdGltZW91dCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUobXFfdGltZWRyZWNlaXZlLCBtcWRfdCwgbXFkZXMsCisJCSAgICAgICBjaGFyIF9fdXNlciAqLCB1X21zZ19wdHIsCisJCSAgICAgICBjb21wYXRfc2l6ZV90LCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgX191c2VyICosIHVfbXNnX3ByaW8sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCB1X2Fic190aW1lb3V0KQogewogCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnVfdHM7Ci0JaWYgKGNvbXBhdF9wcmVwYXJlX3RpbWVvdXQoJnVfdHMsIHVfYWJzX3RpbWVvdXQpKQorCisJaWYgKGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKCZ1X3RzLCB1X2Fic190aW1lb3V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gc3lzX21xX3RpbWVkcmVjZWl2ZShtcWRlcywgdV9tc2dfcHRyLCBtc2dfbGVuLAogCQkJdV9tc2dfcHJpbywgdV90cyk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21xX25vdGlmeShtcWRfdCBtcWRlcywKLQkJCWNvbnN0IHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICp1X25vdGlmaWNhdGlvbikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobXFfbm90aWZ5LCBtcWRfdCwgbXFkZXMsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50IF9fdXNlciAqLCB1X25vdGlmaWNhdGlvbikKIHsKIAlzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICpwID0gTlVMTDsKIAlpZiAodV9ub3RpZmljYXRpb24pIHsKQEAgLTEyMiw5ICsxMDksOSBAQAogCXJldHVybiBzeXNfbXFfbm90aWZ5KG1xZGVzLCBwKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cihtcWRfdCBtcWRlcywKLQkJCWNvbnN0IHN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKnVfbXFzdGF0LAotCQkJc3RydWN0IGNvbXBhdF9tcV9hdHRyIF9fdXNlciAqdV9vbXFzdGF0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhtcV9nZXRzZXRhdHRyLCBtcWRfdCwgbXFkZXMsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgX191c2VyICosIHVfbXFzdGF0LAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9tcV9hdHRyIF9fdXNlciAqLCB1X29tcXN0YXQpCiB7CiAJc3RydWN0IG1xX2F0dHIgbXFzdGF0OwogCXN0cnVjdCBtcV9hdHRyIF9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKDIgKiBzaXplb2YoKnApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiYzAxMGVlLi5mMmE4YjYyIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC0xOCwxMSArMTgsMTMgQEAKIENGTEFHU19SRU1PVkVfaXJxX3dvcmsubyA9IC1wZwogZW5kaWYKIAorIyBjb25kX3N5c2NhbGwgaXMgY3VycmVudGx5IG5vdCBMVE8gY29tcGF0aWJsZQorQ0ZMQUdTX3N5c19uaS5vID0gJChESVNBQkxFX0xUTykKKwogb2JqLXkgKz0gc2NoZWQvCiBvYmoteSArPSBsb2NraW5nLwogb2JqLXkgKz0gcG93ZXIvCiBvYmoteSArPSBwcmludGsvCi1vYmoteSArPSBjcHUvCiBvYmoteSArPSBpcnEvCiBvYmoteSArPSByY3UvCiAKQEAgLTkzLDYgKzk1LDcgQEAKIG9iai0kKENPTkZJR19DUkFTSF9EVU1QKSArPSBjcmFzaF9kdW1wLm8KIG9iai0kKENPTkZJR19KVU1QX0xBQkVMKSArPSBqdW1wX2xhYmVsLm8KIG9iai0kKENPTkZJR19DT05URVhUX1RSQUNLSU5HKSArPSBjb250ZXh0X3RyYWNraW5nLm8KK29iai0kKENPTkZJR19UT1JUVVJFX1RFU1QpICs9IHRvcnR1cmUubwogCiAkKG9iaikvY29uZmlncy5vOiAkKG9iaikvY29uZmlnX2RhdGEuaAogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IDMzOTJkM2UuLjk1YTIwZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC02MDgsOSArNjA4LDE5IEBACiAJaW50IGVyciA9IDA7CiAKIAkvKiBPbmx5IHN1cHBvcnQgdGhlIGluaXRpYWwgbmFtZXNwYWNlcyBmb3Igbm93LiAqLworCS8qCisJICogV2UgcmV0dXJuIEVDT05OUkVGVVNFRCBiZWNhdXNlIGl0IHRyaWNrcyB1c2Vyc3BhY2UgaW50byB0aGlua2luZworCSAqIHRoYXQgYXVkaXQgd2FzIG5vdCBjb25maWd1cmVkIGludG8gdGhlIGtlcm5lbC4gIExvdHMgb2YgdXNlcnMKKwkgKiBjb25maWd1cmUgdGhlaXIgUEFNIHN0YWNrIChiZWNhdXNlIHRoYXQncyB3aGF0IHRoZSBkaXN0cm8gZG9lcykKKwkgKiB0byByZWplY3QgbG9naW4gaWYgdW5hYmxlIHRvIHNlbmQgbWVzc2FnZXMgdG8gYXVkaXQuICBJZiB3ZSByZXR1cm4KKwkgKiBFQ09OTlJFRlVTRUQgdGhlIFBBTSBzdGFjayB0aGlua3MgdGhlIGtlcm5lbCBkb2VzIG5vdCBoYXZlIGF1ZGl0CisJICogY29uZmlndXJlZCBpbiBhbmQgd2lsbCBsZXQgbG9naW4gcHJvY2VlZC4gIElmIHdlIHJldHVybiBFUEVSTQorCSAqIHVzZXJzcGFjZSB3aWxsIHJlamVjdCBhbGwgbG9naW5zLiAgVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHdlCisJICogc3VwcG9ydCBub24gaW5pdCBuYW1lc3BhY2VzISEKKwkgKi8KIAlpZiAoKGN1cnJlbnRfdXNlcl9ucygpICE9ICZpbml0X3VzZXJfbnMpIHx8CiAJICAgICh0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkgIT0gJmluaXRfcGlkX25zKSkKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAKIAlzd2l0Y2ggKG1zZ190eXBlKSB7CiAJY2FzZSBBVURJVF9MSVNUOgpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDEwNWYyNzMuLjBjNzUzZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTQxMTIsMTcgKzQxMTIsMTcgQEAKIAogCWVyciA9IHBlcmNwdV9yZWZfaW5pdCgmY3NzLT5yZWZjbnQsIGNzc19yZWxlYXNlKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlOworCQlnb3RvIGVycl9mcmVlX2NzczsKIAogCWluaXRfY3NzKGNzcywgc3MsIGNncnApOwogCiAJZXJyID0gY2dyb3VwX3BvcHVsYXRlX2RpcihjZ3JwLCAxIDw8IHNzLT5zdWJzeXNfaWQpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWU7CisJCWdvdG8gZXJyX2ZyZWVfcGVyY3B1X3JlZjsKIAogCWVyciA9IG9ubGluZV9jc3MoY3NzKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlOworCQlnb3RvIGVycl9jbGVhcl9kaXI7CiAKIAlkZ2V0KGNncnAtPmRlbnRyeSk7CiAJY3NzX2dldChjc3MtPnBhcmVudCk7CkBAIC00MTM4LDggKzQxMzgsMTEgQEAKIAogCXJldHVybiAwOwogCi1lcnJfZnJlZToKK2Vycl9jbGVhcl9kaXI6CisJY2dyb3VwX2NsZWFyX2Rpcihjc3MtPmNncm91cCwgMSA8PCBjc3MtPnNzLT5zdWJzeXNfaWQpOworZXJyX2ZyZWVfcGVyY3B1X3JlZjoKIAlwZXJjcHVfcmVmX2NhbmNlbF9pbml0KCZjc3MtPnJlZmNudCk7CitlcnJfZnJlZV9jc3M6CiAJc3MtPmNzc19mcmVlKGNzcyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCAwYTA5ZTQ4Li5lNDBiMDQzIDEwMDY0NAotLS0gYS9rZXJuZWwvY29tcGF0LmMKKysrIGIva2VybmVsL2NvbXBhdC5jCkBAIC0zMCwyOCArMzAsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotLyoKLSAqIEdldC9zZXQgc3RydWN0IHRpbWV2YWwgd2l0aCBzdHJ1Y3QgdGltZXNwZWMgb24gdGhlIG5hdGl2ZSBzaWRlCi0gKi8KLXN0YXRpYyBpbnQgY29tcGF0X2dldF90aW1ldmFsX2NvbnZlcnQoc3RydWN0IHRpbWVzcGVjICpvLAotCQkJCSAgICAgIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmkpCi17Ci0JbG9uZyB1c2VjOwotCi0JaWYgKGdldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykgfHwKLQkgICAgZ2V0X3VzZXIodXNlYywgJmktPnR2X3VzZWMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlvLT50dl9uc2VjID0gdXNlYyAqIDEwMDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGF0X3B1dF90aW1ldmFsX2NvbnZlcnQoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqbywKLQkJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqaSkKLXsKLQlyZXR1cm4gKHB1dF91c2VyKGktPnR2X3NlYywgJm8tPnR2X3NlYykgfHwKLQkJcHV0X3VzZXIoaS0+dHZfdXNlYywgJm8tPnR2X3VzZWMpKSA/IC1FRkFVTFQgOiAwOwotfQotCiBzdGF0aWMgaW50IGNvbXBhdF9nZXRfdGltZXgoc3RydWN0IHRpbWV4ICp0eGMsIHN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICp1dHApCiB7CiAJbWVtc2V0KHR4YywgMCwgc2l6ZW9mKHN0cnVjdCB0aW1leCkpOwpAQCAtMTEwLDEzICs4OCwxMyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCi0JCXN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihnZXR0aW1lb2ZkYXksIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdHYsCisJCSAgICAgICBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICosIHR6KQogewogCWlmICh0dikgewogCQlzdHJ1Y3QgdGltZXZhbCBrdHY7CiAJCWRvX2dldHRpbWVvZmRheSgma3R2KTsKLQkJaWYgKGNvbXBhdF9wdXRfdGltZXZhbF9jb252ZXJ0KHR2LCAma3R2KSkKKwkJaWYgKGNvbXBhdF9wdXRfdGltZXZhbCgma3R2LCB0dikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKHR6KSB7CkBAIC0xMjcsNjIgKzEwNSw2MSBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCi0JCXN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihzZXR0aW1lb2ZkYXksIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdHYsCisJCSAgICAgICBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICosIHR6KQogewotCXN0cnVjdCB0aW1lc3BlYyBrdHM7Ci0Jc3RydWN0IHRpbWV6b25lIGt0ejsKKwlzdHJ1Y3QgdGltZXZhbCB1c2VyX3R2OworCXN0cnVjdCB0aW1lc3BlYwluZXdfdHM7CisJc3RydWN0IHRpbWV6b25lIG5ld190ejsKIAogCWlmICh0dikgewotCQlpZiAoY29tcGF0X2dldF90aW1ldmFsX2NvbnZlcnQoJmt0cywgdHYpKQorCQlpZiAoY29tcGF0X2dldF90aW1ldmFsKCZ1c2VyX3R2LCB0dikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbmV3X3RzLnR2X3NlYyA9IHVzZXJfdHYudHZfc2VjOworCQluZXdfdHMudHZfbnNlYyA9IHVzZXJfdHYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CiAJfQogCWlmICh0eikgewotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt0eiwgdHosIHNpemVvZihrdHopKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfdHosIHR6LCBzaXplb2YoKnR6KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlyZXR1cm4gZG9fc3lzX3NldHRpbWVvZmRheSh0diA/ICZrdHMgOiBOVUxMLCB0eiA/ICZrdHogOiBOVUxMKTsKKwlyZXR1cm4gZG9fc3lzX3NldHRpbWVvZmRheSh0diA/ICZuZXdfdHMgOiBOVUxMLCB0eiA/ICZuZXdfdHogOiBOVUxMKTsKIH0KIAotaW50IGdldF9jb21wYXRfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmN0dikKK3N0YXRpYyBpbnQgX19jb21wYXRfZ2V0X3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKnR2LCBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpjdHYpCiB7CiAJcmV0dXJuICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBjdHYsIHNpemVvZigqY3R2KSkgfHwKIAkJCV9fZ2V0X3VzZXIodHYtPnR2X3NlYywgJmN0di0+dHZfc2VjKSB8fAogCQkJX19nZXRfdXNlcih0di0+dHZfdXNlYywgJmN0di0+dHZfdXNlYykpID8gLUVGQVVMVCA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChnZXRfY29tcGF0X3RpbWV2YWwpOwogCi1pbnQgcHV0X2NvbXBhdF90aW1ldmFsKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqY3R2KQorc3RhdGljIGludCBfX2NvbXBhdF9wdXRfdGltZXZhbChjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmN0dikKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjdHYsIHNpemVvZigqY3R2KSkgfHwKIAkJCV9fcHV0X3VzZXIodHYtPnR2X3NlYywgJmN0di0+dHZfc2VjKSB8fAogCQkJX19wdXRfdXNlcih0di0+dHZfdXNlYywgJmN0di0+dHZfdXNlYykpID8gLUVGQVVMVCA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwdXRfY29tcGF0X3RpbWV2YWwpOwogCi1pbnQgZ2V0X2NvbXBhdF90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3RzKQorc3RhdGljIGludCBfX2NvbXBhdF9nZXRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjICp0cywgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKmN0cykKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGN0cywgc2l6ZW9mKCpjdHMpKSB8fAogCQkJX19nZXRfdXNlcih0cy0+dHZfc2VjLCAmY3RzLT50dl9zZWMpIHx8CiAJCQlfX2dldF91c2VyKHRzLT50dl9uc2VjLCAmY3RzLT50dl9uc2VjKSkgPyAtRUZBVUxUIDogMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGdldF9jb21wYXRfdGltZXNwZWMpOwogCi1pbnQgcHV0X2NvbXBhdF90aW1lc3BlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3RzKQorc3RhdGljIGludCBfX2NvbXBhdF9wdXRfdGltZXNwZWMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cywgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKmN0cykKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjdHMsIHNpemVvZigqY3RzKSkgfHwKIAkJCV9fcHV0X3VzZXIodHMtPnR2X3NlYywgJmN0cy0+dHZfc2VjKSB8fAogCQkJX19wdXRfdXNlcih0cy0+dHZfbnNlYywgJmN0cy0+dHZfbnNlYykpID8gLUVGQVVMVCA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwdXRfY29tcGF0X3RpbWVzcGVjKTsKIAogaW50IGNvbXBhdF9nZXRfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsIGNvbnN0IHZvaWQgX191c2VyICp1dHYpCiB7CiAJaWYgKENPTVBBVF9VU0VfNjRCSVRfVElNRSkKIAkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHR2LCB1dHYsIHNpemVvZiAqdHYpID8gLUVGQVVMVCA6IDA7CiAJZWxzZQotCQlyZXR1cm4gZ2V0X2NvbXBhdF90aW1ldmFsKHR2LCB1dHYpOworCQlyZXR1cm4gX19jb21wYXRfZ2V0X3RpbWV2YWwodHYsIHV0dik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfZ2V0X3RpbWV2YWwpOwogCkBAIC0xOTEsNyArMTY4LDcgQEAKIAlpZiAoQ09NUEFUX1VTRV82NEJJVF9USU1FKQogCQlyZXR1cm4gY29weV90b191c2VyKHV0diwgdHYsIHNpemVvZiAqdHYpID8gLUVGQVVMVCA6IDA7CiAJZWxzZQotCQlyZXR1cm4gcHV0X2NvbXBhdF90aW1ldmFsKHR2LCB1dHYpOworCQlyZXR1cm4gX19jb21wYXRfcHV0X3RpbWV2YWwodHYsIHV0dik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfcHV0X3RpbWV2YWwpOwogCkBAIC0yMDAsNyArMTc3LDcgQEAKIAlpZiAoQ09NUEFUX1VTRV82NEJJVF9USU1FKQogCQlyZXR1cm4gY29weV9mcm9tX3VzZXIodHMsIHV0cywgc2l6ZW9mICp0cykgPyAtRUZBVUxUIDogMDsKIAllbHNlCi0JCXJldHVybiBnZXRfY29tcGF0X3RpbWVzcGVjKHRzLCB1dHMpOworCQlyZXR1cm4gX19jb21wYXRfZ2V0X3RpbWVzcGVjKHRzLCB1dHMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY29tcGF0X2dldF90aW1lc3BlYyk7CiAKQEAgLTIwOSwxMCArMTg2LDMzIEBACiAJaWYgKENPTVBBVF9VU0VfNjRCSVRfVElNRSkKIAkJcmV0dXJuIGNvcHlfdG9fdXNlcih1dHMsIHRzLCBzaXplb2YgKnRzKSA/IC1FRkFVTFQgOiAwOwogCWVsc2UKLQkJcmV0dXJuIHB1dF9jb21wYXRfdGltZXNwZWModHMsIHV0cyk7CisJCXJldHVybiBfX2NvbXBhdF9wdXRfdGltZXNwZWModHMsIHV0cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfcHV0X3RpbWVzcGVjKTsKIAoraW50IGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiprdHMsCisJCQkgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmN0cykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXRzOworCisJaWYgKCFjdHMgfHwgQ09NUEFUX1VTRV82NEJJVF9USU1FKSB7CisJCSprdHMgPSAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWN0czsKKwkJcmV0dXJuIDA7CisJfQorCisJdXRzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHRzKSk7CisJaWYgKCF1dHMpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0cywgY3RzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcih1dHMsICZ0cywgc2l6ZW9mKHRzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJKmt0cyA9IHV0czsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGxvbmcgY29tcGF0X25hbm9zbGVlcF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KQogewogCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpybXRwOwpAQCAtMjI5LDIxICsyMjksMjEgQEAKIAlpZiAocmV0KSB7CiAJCXJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CiAKLQkJaWYgKHJtdHAgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmcm10LCBybXRwKSkKKwkJaWYgKHJtdHAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmcm10LCBybXRwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25hbm9zbGVlcChzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqcnF0cCwKLQkJCQkgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpybXRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihuYW5vc2xlZXAsIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHJxdHAsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCBybXRwKQogewogCXN0cnVjdCB0aW1lc3BlYyB0dSwgcm10OwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlsb25nIHJldDsKIAotCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0dSwgcnF0cCkpCisJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJnR1LCBycXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoIXRpbWVzcGVjX3ZhbGlkKCZ0dSkpCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJcmVzdGFydC0+Zm4gPSBjb21wYXRfbmFub3NsZWVwX3Jlc3RhcnQ7CiAJCXJlc3RhcnQtPm5hbm9zbGVlcC5jb21wYXRfcm10cCA9IHJtdHA7CiAKLQkJaWYgKHJtdHAgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmcm10LCBybXRwKSkKKwkJaWYgKHJtdHAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmcm10LCBybXRwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJcmV0dXJuIGNvbXBhdF9qaWZmaWVzX3RvX2Nsb2NrX3QoY2xvY2tfdF90b19qaWZmaWVzKHgpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdGltZXMoc3RydWN0IGNvbXBhdF90bXMgX191c2VyICp0YnVmKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMSh0aW1lcywgc3RydWN0IGNvbXBhdF90bXMgX191c2VyICosIHRidWYpCiB7CiAJaWYgKHRidWYpIHsKIAkJc3RydWN0IHRtcyB0bXM7CkBAIC0zNTQsNyArMzU0LDcgQEAKICAqIHR5cGVzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBwdXRfdXNlcigpL2dldF91c2VyKCkuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2lncGVuZGluZyhjb21wYXRfb2xkX3NpZ3NldF90IF9fdXNlciAqc2V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShzaWdwZW5kaW5nLCBjb21wYXRfb2xkX3NpZ3NldF90IF9fdXNlciAqLCBzZXQpCiB7CiAJb2xkX3NpZ3NldF90IHM7CiAJbG9uZyByZXQ7CkBAIC00MjQsOCArNDI0LDggQEAKIAogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsCi0JCXN0cnVjdCBjb21wYXRfcmxpbWl0IF9fdXNlciAqcmxpbSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoc2V0cmxpbWl0LCB1bnNpZ25lZCBpbnQsIHJlc291cmNlLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9ybGltaXQgX191c2VyICosIHJsaW0pCiB7CiAJc3RydWN0IHJsaW1pdCByOwogCkBAIC00NDMsMTUgKzQ0MywxNSBAQAogCiAjaWZkZWYgQ09NUEFUX1JMSU1fT0xEX0lORklOSVRZCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29sZF9nZXRybGltaXQodW5zaWduZWQgaW50IHJlc291cmNlLAotCQlzdHJ1Y3QgY29tcGF0X3JsaW1pdCBfX3VzZXIgKnJsaW0pCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKG9sZF9nZXRybGltaXQsIHVuc2lnbmVkIGludCwgcmVzb3VyY2UsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3JsaW1pdCBfX3VzZXIgKiwgcmxpbSkKIHsKIAlzdHJ1Y3QgcmxpbWl0IHI7CiAJaW50IHJldDsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAKIAlzZXRfZnMoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfb2xkX2dldHJsaW1pdChyZXNvdXJjZSwgJnIpOworCXJldCA9IHN5c19vbGRfZ2V0cmxpbWl0KHJlc291cmNlLCAoc3RydWN0IHJsaW1pdCBfX3VzZXIgKikmcik7CiAJc2V0X2ZzKG9sZF9mcyk7CiAKIAlpZiAoIXJldCkgewpAQCAtNDcwLDggKzQ3MCw4IEBACiAKICNlbmRpZgogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRybGltaXQodW5zaWduZWQgaW50IHJlc291cmNlLAotCQlzdHJ1Y3QgY29tcGF0X3JsaW1pdCBfX3VzZXIgKnJsaW0pCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKGdldHJsaW1pdCwgdW5zaWduZWQgaW50LCByZXNvdXJjZSwKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfcmxpbWl0IF9fdXNlciAqLCBybGltKQogewogCXN0cnVjdCBybGltaXQgcjsKIAlpbnQgcmV0OwpAQCAtNTk2LDkgKzU5Niw5IEBACiAJcmV0dXJuIGNvbXBhdF9nZXRfYml0bWFwKGssIHVzZXJfbWFza19wdHIsIGxlbiAqIDgpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eShjb21wYXRfcGlkX3QgcGlkLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJCSAgICAgY29tcGF0X3Vsb25nX3QgX191c2VyICp1c2VyX21hc2tfcHRyKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzY2hlZF9zZXRhZmZpbml0eSwgY29tcGF0X3BpZF90LCBwaWQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIGxlbiwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQogewogCWNwdW1hc2tfdmFyX3QgbmV3X21hc2s7CiAJaW50IHJldHZhbDsKQEAgLTYxNiw4ICs2MTYsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NjaGVkX2dldGFmZmluaXR5KGNvbXBhdF9waWRfdCBwaWQsIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJCSAgICAgY29tcGF0X3Vsb25nX3QgX191c2VyICp1c2VyX21hc2tfcHRyKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzY2hlZF9nZXRhZmZpbml0eSwgY29tcGF0X3BpZF90LCAgcGlkLCB1bnNpZ25lZCBpbnQsIGxlbiwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQogewogCWludCByZXQ7CiAJY3B1bWFza192YXJfdCBtYXNrOwpAQCAtNjQ3LDggKzY0Nyw4IEBACiBpbnQgZ2V0X2NvbXBhdF9pdGltZXJzcGVjKHN0cnVjdCBpdGltZXJzcGVjICpkc3QsCiAJCQkgIGNvbnN0IHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKnNyYykKIHsKLQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmZHN0LT5pdF9pbnRlcnZhbCwgJnNyYy0+aXRfaW50ZXJ2YWwpIHx8Ci0JICAgIGdldF9jb21wYXRfdGltZXNwZWMoJmRzdC0+aXRfdmFsdWUsICZzcmMtPml0X3ZhbHVlKSkKKwlpZiAoX19jb21wYXRfZ2V0X3RpbWVzcGVjKCZkc3QtPml0X2ludGVydmFsLCAmc3JjLT5pdF9pbnRlcnZhbCkgfHwKKwkgICAgX19jb21wYXRfZ2V0X3RpbWVzcGVjKCZkc3QtPml0X3ZhbHVlLCAmc3JjLT5pdF92YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtNjU2LDE1ICs2NTYsMTUgQEAKIGludCBwdXRfY29tcGF0X2l0aW1lcnNwZWMoc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqZHN0LAogCQkJICBjb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyAqc3JjKQogewotCWlmIChwdXRfY29tcGF0X3RpbWVzcGVjKCZzcmMtPml0X2ludGVydmFsLCAmZHN0LT5pdF9pbnRlcnZhbCkgfHwKLQkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmc3JjLT5pdF92YWx1ZSwgJmRzdC0+aXRfdmFsdWUpKQorCWlmIChfX2NvbXBhdF9wdXRfdGltZXNwZWMoJnNyYy0+aXRfaW50ZXJ2YWwsICZkc3QtPml0X2ludGVydmFsKSB8fAorCSAgICBfX2NvbXBhdF9wdXRfdGltZXNwZWMoJnNyYy0+aXRfdmFsdWUsICZkc3QtPml0X3ZhbHVlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKLWxvbmcgY29tcGF0X3N5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAotCQkJc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKnRpbWVyX2V2ZW50X3NwZWMsCi0JCQl0aW1lcl90IF9fdXNlciAqY3JlYXRlZF90aW1lcl9pZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTModGltZXJfY3JlYXRlLCBjbG9ja2lkX3QsIHdoaWNoX2Nsb2NrLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKiwgdGltZXJfZXZlbnRfc3BlYywKKwkJICAgICAgIHRpbWVyX3QgX191c2VyICosIGNyZWF0ZWRfdGltZXJfaWQpCiB7CiAJc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqZXZlbnQgPSBOVUxMOwogCkBAIC02ODAsOSArNjgwLDkgQEAKIAlyZXR1cm4gc3lzX3RpbWVyX2NyZWF0ZSh3aGljaF9jbG9jaywgZXZlbnQsIGNyZWF0ZWRfdGltZXJfaWQpOwogfQogCi1sb25nIGNvbXBhdF9zeXNfdGltZXJfc2V0dGltZSh0aW1lcl90IHRpbWVyX2lkLCBpbnQgZmxhZ3MsCi0JCQkgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKm5ldywKLQkJCSAgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqb2xkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNCh0aW1lcl9zZXR0aW1lLCB0aW1lcl90LCB0aW1lcl9pZCwgaW50LCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKiwgbmV3LAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqLCBvbGQpCiB7CiAJbG9uZyBlcnI7CiAJbW1fc2VnbWVudF90IG9sZGZzOwpAQCAtNzAzLDggKzcwMyw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotbG9uZyBjb21wYXRfc3lzX3RpbWVyX2dldHRpbWUodGltZXJfdCB0aW1lcl9pZCwKLQkJc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqc2V0dGluZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIodGltZXJfZ2V0dGltZSwgdGltZXJfdCwgdGltZXJfaWQsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgX191c2VyICosIHNldHRpbmcpCiB7CiAJbG9uZyBlcnI7CiAJbW1fc2VnbWVudF90IG9sZGZzOwpAQCAtNzIwLDE0ICs3MjAsMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZShjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCi0JCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoY2xvY2tfc2V0dGltZSwgY2xvY2tpZF90LCB3aGljaF9jbG9jaywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRwKQogewogCWxvbmcgZXJyOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKLQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmdHMsIHRwKSkKKwlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdHMsIHRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJb2xkZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoS0VSTkVMX0RTKTsKQEAgLTczNyw4ICs3MzcsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLWxvbmcgY29tcGF0X3N5c19jbG9ja19nZXR0aW1lKGNsb2NraWRfdCB3aGljaF9jbG9jaywKLQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihjbG9ja19nZXR0aW1lLCBjbG9ja2lkX3QsIHdoaWNoX2Nsb2NrLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdHApCiB7CiAJbG9uZyBlcnI7CiAJbW1fc2VnbWVudF90IG9sZGZzOwpAQCAtNzQ5LDEzICs3NDksMTMgQEAKIAllcnIgPSBzeXNfY2xvY2tfZ2V0dGltZSh3aGljaF9jbG9jaywKIAkJCQkoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSAmdHMpOwogCXNldF9mcyhvbGRmcyk7Ci0JaWYgKCFlcnIgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmdHMsIHRwKSkKKwlpZiAoIWVyciAmJiBjb21wYXRfcHV0X3RpbWVzcGVjKCZ0cywgdHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZShjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCi0JCXN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICp1dHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKGNsb2NrX2FkanRpbWUsIGNsb2NraWRfdCwgd2hpY2hfY2xvY2ssCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqLCB1dHApCiB7CiAJc3RydWN0IHRpbWV4IHR4YzsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CkBAIC03NzcsOCArNzc3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1sb25nIGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzKGNsb2NraWRfdCB3aGljaF9jbG9jaywKLQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihjbG9ja19nZXRyZXMsIGNsb2NraWRfdCwgd2hpY2hfY2xvY2ssCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCB0cCkKIHsKIAlsb25nIGVycjsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CkBAIC03ODksNyArNzg5LDcgQEAKIAllcnIgPSBzeXNfY2xvY2tfZ2V0cmVzKHdoaWNoX2Nsb2NrLAogCQkJICAgICAgIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopICZ0cyk7CiAJc2V0X2ZzKG9sZGZzKTsKLQlpZiAoIWVyciAmJiB0cCAmJiBwdXRfY29tcGF0X3RpbWVzcGVjKCZ0cywgdHApKQorCWlmICghZXJyICYmIHRwICYmIGNvbXBhdF9wdXRfdGltZXNwZWMoJnRzLCB0cCkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CiB9CkBAIC03OTksNyArNzk5LDcgQEAKIAlsb25nIGVycjsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CiAJc3RydWN0IHRpbWVzcGVjIHR1OwotCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgKnJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CiAKIAlyZXN0YXJ0LT5uYW5vc2xlZXAucm10cCA9IChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopICZ0dTsKIAlvbGRmcyA9IGdldF9mcygpOwpAQCAtODA4LDcgKzgwOCw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAogCWlmICgoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spICYmIHJtdHAgJiYKLQkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmdHUsIHJtdHApKQorCSAgICBjb21wYXRfcHV0X3RpbWVzcGVjKCZ0dSwgcm10cCkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGVyciA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSB7CkBAIC04MTgsMTYgKzgxOCwxNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLWxvbmcgY29tcGF0X3N5c19jbG9ja19uYW5vc2xlZXAoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsCi0JCQkgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJxdHAsCi0JCQkgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJtdHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KGNsb2NrX25hbm9zbGVlcCwgY2xvY2tpZF90LCB3aGljaF9jbG9jaywgaW50LCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHJxdHAsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCBybXRwKQogewogCWxvbmcgZXJyOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlzdHJ1Y3QgdGltZXNwZWMgaW4sIG91dDsKIAlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydDsKIAotCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZpbiwgcnF0cCkpCisJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJmluLCBycXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlvbGRmcyA9IGdldF9mcygpOwpAQCAtODM4LDcgKzgzOCw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAogCWlmICgoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spICYmIHJtdHAgJiYKLQkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmb3V0LCBybXRwKSkKKwkgICAgY29tcGF0X3B1dF90aW1lc3BlYygmb3V0LCBybXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAKIC8qIGNvbXBhdF90aW1lX3QgaXMgYSAzMiBiaXQgImxvbmciIGFuZCBuZWVkcyB0byBnZXQgY29udmVydGVkLiAqLwogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c190aW1lKGNvbXBhdF90aW1lX3QgX191c2VyICogdGxvYykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEodGltZSwgY29tcGF0X3RpbWVfdCBfX3VzZXIgKiwgdGxvYykKIHsKIAljb21wYXRfdGltZV90IGk7CiAJc3RydWN0IHRpbWV2YWwgdHY7CkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogCXJldHVybiBpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zdGltZShjb21wYXRfdGltZV90IF9fdXNlciAqdHB0cikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoc3RpbWUsIGNvbXBhdF90aW1lX3QgX191c2VyICosIHRwdHIpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHR2OwogCWludCBlcnI7CkBAIC0xMDQ2LDcgKzEwNDYsNyBAQAogCiAjZW5kaWYgLyogX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FICovCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2FkanRpbWV4KHN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICp1dHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKGFkanRpbWV4LCBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqLCB1dHApCiB7CiAJc3RydWN0IHRpbWV4IHR4YzsKIAlpbnQgZXJyLCByZXQ7CkBAIC0xMDY1LDExICsxMDY1LDExIEBACiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQQotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbW92ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCi0JCWNvbXBhdF91cHRyX3QgX191c2VyICpwYWdlczMyLAotCQljb25zdCBpbnQgX191c2VyICpub2RlcywKLQkJaW50IF9fdXNlciAqc3RhdHVzLAotCQlpbnQgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KG1vdmVfcGFnZXMsIHBpZF90LCBwaWQsIGNvbXBhdF91bG9uZ190LCBucl9wYWdlcywKKwkJICAgICAgIGNvbXBhdF91cHRyX3QgX191c2VyICosIHBhZ2VzMzIsCisJCSAgICAgICBjb25zdCBpbnQgX191c2VyICosIG5vZGVzLAorCQkgICAgICAgaW50IF9fdXNlciAqLCBzdGF0dXMsCisJCSAgICAgICBpbnQsIGZsYWdzKQogewogCWNvbnN0IHZvaWQgX191c2VyICogX191c2VyICpwYWdlczsKIAlpbnQgaTsKQEAgLTEwODUsMTAgKzEwODUsMTAgQEAKIAlyZXR1cm4gc3lzX21vdmVfcGFnZXMocGlkLCBucl9wYWdlcywgcGFnZXMsIG5vZGVzLCBzdGF0dXMsIGZsYWdzKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWlncmF0ZV9wYWdlcyhjb21wYXRfcGlkX3QgcGlkLAotCQkJY29tcGF0X3Vsb25nX3QgbWF4bm9kZSwKLQkJCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqb2xkX25vZGVzLAotCQkJY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICpuZXdfbm9kZXMpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KG1pZ3JhdGVfcGFnZXMsIGNvbXBhdF9waWRfdCwgcGlkLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIG1heG5vZGUsCisJCSAgICAgICBjb25zdCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgb2xkX25vZGVzLAorCQkgICAgICAgY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICosIG5ld19ub2RlcykKIHsKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqb2xkID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqbmV3ID0gTlVMTDsKQEAgLTExMzAsNyArMTEzMCw3IEBACiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJcmV0ID0gc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbChwaWQsIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopJnQpOwogCXNldF9mcyhvbGRfZnMpOwotCWlmIChwdXRfY29tcGF0X3RpbWVzcGVjKCZ0LCBpbnRlcnZhbCkpCisJaWYgKGNvbXBhdF9wdXRfdGltZXNwZWMoJnQsIGludGVydmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9rZXJuZWwvY3B1L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFiMDUyLi4wMDAwMDAwCi0tLSBhL2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmoteQk9IGlkbGUubwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdS9pZGxlLmMgYi9rZXJuZWwvY3B1L2lkbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3ZjQ5NC4uMDAwMDAwMAotLS0gYS9rZXJuZWwvY3B1L2lkbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogR2VuZXJpYyBlbnRyeSBwb2ludCBmb3IgdGhlIGlkbGUgdGhyZWFkcwotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC90aWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdGFja3Byb3RlY3Rvci5oPgotCi0jaW5jbHVkZSA8YXNtL3RsYi5oPgotCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+Ci0KLXN0YXRpYyBpbnQgX19yZWFkX21vc3RseSBjcHVfaWRsZV9mb3JjZV9wb2xsOwotCi12b2lkIGNwdV9pZGxlX3BvbGxfY3RybChib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKSB7Ci0JCWNwdV9pZGxlX2ZvcmNlX3BvbGwrKzsKLQl9IGVsc2UgewotCQljcHVfaWRsZV9mb3JjZV9wb2xsLS07Ci0JCVdBUk5fT05fT05DRShjcHVfaWRsZV9mb3JjZV9wb2xsIDwgMCk7Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfSURMRV9QT0xMX1NFVFVQCi1zdGF0aWMgaW50IF9faW5pdCBjcHVfaWRsZV9wb2xsX3NldHVwKGNoYXIgKl9fdW51c2VkKQotewotCWNwdV9pZGxlX2ZvcmNlX3BvbGwgPSAxOwotCXJldHVybiAxOwotfQotX19zZXR1cCgibm9obHQiLCBjcHVfaWRsZV9wb2xsX3NldHVwKTsKLQotc3RhdGljIGludCBfX2luaXQgY3B1X2lkbGVfbm9wb2xsX3NldHVwKGNoYXIgKl9fdW51c2VkKQotewotCWNwdV9pZGxlX2ZvcmNlX3BvbGwgPSAwOwotCXJldHVybiAxOwotfQotX19zZXR1cCgiaGx0IiwgY3B1X2lkbGVfbm9wb2xsX3NldHVwKTsKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBjcHVfaWRsZV9wb2xsKHZvaWQpCi17Ci0JcmN1X2lkbGVfZW50ZXIoKTsKLQl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKDAsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXdoaWxlICghdGlmX25lZWRfcmVzY2hlZCgpKQotCQljcHVfcmVsYXgoKTsKLQl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKFBXUl9FVkVOVF9FWElULCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXJjdV9pZGxlX2V4aXQoKTsKLQlyZXR1cm4gMTsKLX0KLQotLyogV2VhayBpbXBsZW1lbnRhdGlvbnMgZm9yIG9wdGlvbmFsIGFyY2ggc3BlY2lmaWMgZnVuY3Rpb25zICovCi12b2lkIF9fd2VhayBhcmNoX2NwdV9pZGxlX3ByZXBhcmUodm9pZCkgeyB9Ci12b2lkIF9fd2VhayBhcmNoX2NwdV9pZGxlX2VudGVyKHZvaWQpIHsgfQotdm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9leGl0KHZvaWQpIHsgfQotdm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9kZWFkKHZvaWQpIHsgfQotdm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZSh2b2lkKQotewotCWNwdV9pZGxlX2ZvcmNlX3BvbGwgPSAxOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLX0KLQotLyoKLSAqIEdlbmVyaWMgaWRsZSBsb29wIGltcGxlbWVudGF0aW9uCi0gKi8KLXN0YXRpYyB2b2lkIGNwdV9pZGxlX2xvb3Aodm9pZCkKLXsKLQl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOwotCi0JCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJCWNoZWNrX3BndF9jYWNoZSgpOwotCQkJcm1iKCk7Ci0KLQkJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKQotCQkJCWFyY2hfY3B1X2lkbGVfZGVhZCgpOwotCi0JCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQkJYXJjaF9jcHVfaWRsZV9lbnRlcigpOwotCi0JCQkvKgotCQkJICogSW4gcG9sbCBtb2RlIHdlIHJlZW5hYmxlIGludGVycnVwdHMgYW5kIHNwaW4uCi0JCQkgKgotCQkJICogQWxzbyBpZiB3ZSBkZXRlY3RlZCBpbiB0aGUgd2FrZXVwIGZyb20gaWRsZQotCQkJICogcGF0aCB0aGF0IHRoZSB0aWNrIGJyb2FkY2FzdCBkZXZpY2UgZXhwaXJlZAotCQkJICogZm9yIHVzLCB3ZSBkb24ndCB3YW50IHRvIGdvIGRlZXAgaWRsZSBhcyB3ZQotCQkJICoga25vdyB0aGF0IHRoZSBJUEkgaXMgZ29pbmcgdG8gYXJyaXZlIHJpZ2h0Ci0JCQkgKiBhd2F5Ci0JCQkgKi8KLQkJCWlmIChjcHVfaWRsZV9mb3JjZV9wb2xsIHx8IHRpY2tfY2hlY2tfYnJvYWRjYXN0X2V4cGlyZWQoKSkgewotCQkJCWNwdV9pZGxlX3BvbGwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFjdXJyZW50X2Nscl9wb2xsaW5nX2FuZF90ZXN0KCkpIHsKLQkJCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQkJCXJjdV9pZGxlX2VudGVyKCk7Ci0JCQkJCWFyY2hfY3B1X2lkbGUoKTsKLQkJCQkJV0FSTl9PTl9PTkNFKGlycXNfZGlzYWJsZWQoKSk7Ci0JCQkJCXJjdV9pZGxlX2V4aXQoKTsKLQkJCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJCQl9Ci0JCQkJX19jdXJyZW50X3NldF9wb2xsaW5nKCk7Ci0JCQl9Ci0JCQlhcmNoX2NwdV9pZGxlX2V4aXQoKTsKLQkJfQotCi0JCS8qCi0JCSAqIFNpbmNlIHdlIGZlbGwgb3V0IG9mIHRoZSBsb29wIGFib3ZlLCB3ZSBrbm93Ci0JCSAqIFRJRl9ORUVEX1JFU0NIRUQgbXVzdCBiZSBzZXQsIHByb3BhZ2F0ZSBpdCBpbnRvCi0JCSAqIFBSRUVNUFRfTkVFRF9SRVNDSEVELgotCQkgKgotCQkgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZm9yIHBvbGxpbmcgaWRsZSBsb29wcyB3ZSB3aWxsCi0JCSAqIG5vdCBoYXZlIGhhZCBhbiBJUEkgdG8gZm9sZCB0aGUgc3RhdGUgZm9yIHVzLgotCQkgKi8KLQkJcHJlZW1wdF9zZXRfbmVlZF9yZXNjaGVkKCk7Ci0JCXRpY2tfbm9oel9pZGxlX2V4aXQoKTsKLQkJc2NoZWR1bGVfcHJlZW1wdF9kaXNhYmxlZCgpOwotCX0KLX0KLQotdm9pZCBjcHVfc3RhcnR1cF9lbnRyeShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQotewotCS8qCi0JICogVGhpcyAjaWZkZWYgbmVlZHMgdG8gZGllLCBidXQgaXQncyB0b28gbGF0ZSBpbiB0aGUgY3ljbGUgdG8KLQkgKiBtYWtlIHRoaXMgZ2VuZXJpYyAoYXJtIGFuZCBzaCBoYXZlIG5ldmVyIGludm9rZWQgdGhlIGNhbmFyeQotCSAqIGluaXQgZm9yIHRoZSBub24gYm9vdCBjcHVzISkuIFdpbGwgYmUgZml4ZWQgaW4gMy4xMQotCSAqLwotI2lmZGVmIENPTkZJR19YODYKLQkvKgotCSAqIElmIHdlJ3JlIHRoZSBub24tYm9vdCBDUFUsIG5vdGhpbmcgc2V0IHRoZSBzdGFjayBjYW5hcnkgdXAKLQkgKiBmb3IgdXMuIFRoZSBib290IENQVSBhbHJlYWR5IGhhcyBpdCBpbml0aWFsaXplZCBidXQgbm8gaGFybQotCSAqIGluIGRvaW5nIGl0IGFnYWluLiBUaGlzIGlzIGEgZ29vZCBwbGFjZSBmb3IgdXBkYXRpbmcgaXQsIGFzCi0JICogd2Ugd29udCBldmVyIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gKHNvIHRoZSBpbnZhbGlkCi0JICogY2FuYXJpZXMgYWxyZWFkeSBvbiB0aGUgc3RhY2sgd29udCBldmVyIHRyaWdnZXIpLgotCSAqLwotCWJvb3RfaW5pdF9zdGFja19jYW5hcnkoKTsKLSNlbmRpZgotCV9fY3VycmVudF9zZXRfcG9sbGluZygpOwotCWFyY2hfY3B1X2lkbGVfcHJlcGFyZSgpOwotCWNwdV9pZGxlX2xvb3AoKTsKLX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMgYi9rZXJuZWwvZGVidWcvZGVidWdfY29yZS5jCmluZGV4IDMzNGIzOTguLjk5OTgyYTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMKKysrIGIva2VybmVsL2RlYnVnL2RlYnVnX2NvcmUuYwpAQCAtMTAzNSw3ICsxMDM1LDcgQEAKICAqIG90aGVyd2lzZSBhcyBhIHF1aWNrIG1lYW5zIHRvIHN0b3AgcHJvZ3JhbSBleGVjdXRpb24gYW5kICJicmVhayIgaW50bwogICogdGhlIGRlYnVnZ2VyLgogICovCi12b2lkIGtnZGJfYnJlYWtwb2ludCh2b2lkKQorbm9pbmxpbmUgdm9pZCBrZ2RiX2JyZWFrcG9pbnQodm9pZCkKIHsKIAlhdG9taWNfaW5jKCZrZ2RiX3NldHRpbmdfYnJlYWtwb2ludCk7CiAJd21iKCk7IC8qIFN5bmMgcG9pbnQgYmVmb3JlIGJyZWFrcG9pbnQgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggZmEwYjJkNC4uNjYxOTUxYSAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTIzMSwxMSArMjMxLDI5IEBACiAjZGVmaW5lIE5SX0FDQ1VNVUxBVEVEX1NBTVBMRVMgMTI4CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCBydW5uaW5nX3NhbXBsZV9sZW5ndGgpOwogCi12b2lkIHBlcmZfc2FtcGxlX2V2ZW50X3Rvb2sodTY0IHNhbXBsZV9sZW5fbnMpCitzdGF0aWMgdm9pZCBwZXJmX2R1cmF0aW9uX3dhcm4oc3RydWN0IGlycV93b3JrICp3KQogeworCXU2NCBhbGxvd2VkX25zID0gQUNDRVNTX09OQ0UocGVyZl9zYW1wbGVfYWxsb3dlZF9ucyk7CiAJdTY0IGF2Z19sb2NhbF9zYW1wbGVfbGVuOwogCXU2NCBsb2NhbF9zYW1wbGVzX2xlbjsKKworCWxvY2FsX3NhbXBsZXNfbGVuID0gX19nZXRfY3B1X3ZhcihydW5uaW5nX3NhbXBsZV9sZW5ndGgpOworCWF2Z19sb2NhbF9zYW1wbGVfbGVuID0gbG9jYWxfc2FtcGxlc19sZW4vTlJfQUNDVU1VTEFURURfU0FNUExFUzsKKworCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcKKwkJCSJwZXJmIGludGVycnVwdCB0b29rIHRvbyBsb25nICglbGxkID4gJWxsZCksIGxvd2VyaW5nICIKKwkJCSJrZXJuZWwucGVyZl9ldmVudF9tYXhfc2FtcGxlX3JhdGUgdG8gJWRcbiIsCisJCQlhdmdfbG9jYWxfc2FtcGxlX2xlbiwgYWxsb3dlZF9ucyA+PiAxLAorCQkJc3lzY3RsX3BlcmZfZXZlbnRfc2FtcGxlX3JhdGUpOworfQorCitzdGF0aWMgREVGSU5FX0lSUV9XT1JLKHBlcmZfZHVyYXRpb25fd29yaywgcGVyZl9kdXJhdGlvbl93YXJuKTsKKwordm9pZCBwZXJmX3NhbXBsZV9ldmVudF90b29rKHU2NCBzYW1wbGVfbGVuX25zKQorewogCXU2NCBhbGxvd2VkX25zID0gQUNDRVNTX09OQ0UocGVyZl9zYW1wbGVfYWxsb3dlZF9ucyk7CisJdTY0IGF2Z19sb2NhbF9zYW1wbGVfbGVuOworCXU2NCBsb2NhbF9zYW1wbGVzX2xlbjsKIAogCWlmIChhbGxvd2VkX25zID09IDApCiAJCXJldHVybjsKQEAgLTI2MywxMyArMjgxLDE0IEBACiAJc3lzY3RsX3BlcmZfZXZlbnRfc2FtcGxlX3JhdGUgPSBtYXhfc2FtcGxlc19wZXJfdGljayAqIEhaOwogCXBlcmZfc2FtcGxlX3BlcmlvZF9ucyA9IE5TRUNfUEVSX1NFQyAvIHN5c2N0bF9wZXJmX2V2ZW50X3NhbXBsZV9yYXRlOwogCi0JcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORwotCQkJInBlcmYgc2FtcGxlcyB0b28gbG9uZyAoJWxsZCA+ICVsbGQpLCBsb3dlcmluZyAiCi0JCQkia2VybmVsLnBlcmZfZXZlbnRfbWF4X3NhbXBsZV9yYXRlIHRvICVkXG4iLAotCQkJYXZnX2xvY2FsX3NhbXBsZV9sZW4sIGFsbG93ZWRfbnMsCi0JCQlzeXNjdGxfcGVyZl9ldmVudF9zYW1wbGVfcmF0ZSk7Ci0KIAl1cGRhdGVfcGVyZl9jcHVfbGltaXRzKCk7CisKKwlpZiAoIWlycV93b3JrX3F1ZXVlKCZwZXJmX2R1cmF0aW9uX3dvcmspKSB7CisJCWVhcmx5X3ByaW50aygicGVyZiBpbnRlcnJ1cHQgdG9vayB0b28gbG9uZyAoJWxsZCA+ICVsbGQpLCBsb3dlcmluZyAiCisJCQkgICAgICJrZXJuZWwucGVyZl9ldmVudF9tYXhfc2FtcGxlX3JhdGUgdG8gJWRcbiIsCisJCQkgICAgIGF2Z19sb2NhbF9zYW1wbGVfbGVuLCBhbGxvd2VkX25zID4+IDEsCisJCQkgICAgIHN5c2N0bF9wZXJmX2V2ZW50X3NhbXBsZV9yYXRlKTsKKwl9CiB9CiAKIHN0YXRpYyBhdG9taWM2NF90IHBlcmZfZXZlbnRfaWQ7CkBAIC0xNzE0LDcgKzE3MzMsNyBAQAogCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCAqcGFydGlhbF9ncm91cCA9IE5VTEw7Ci0Jc3RydWN0IHBtdSAqcG11ID0gZ3JvdXBfZXZlbnQtPnBtdTsKKwlzdHJ1Y3QgcG11ICpwbXUgPSBjdHgtPnBtdTsKIAl1NjQgbm93ID0gY3R4LT50aW1lOwogCWJvb2wgc2ltdWxhdGUgPSBmYWxzZTsKIApAQCAtMjU2Myw4ICsyNTgyLDYgQEAKIAkJaWYgKGNwdWN0eC0+Y3R4Lm5yX2JyYW5jaF9zdGFjayA+IDAKIAkJICAgICYmIHBtdS0+Zmx1c2hfYnJhbmNoX3N0YWNrKSB7CiAKLQkJCXBtdSA9IGNwdWN0eC0+Y3R4LnBtdTsKLQogCQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOwogCiAJCQlwZXJmX3BtdV9kaXNhYmxlKHBtdSk7CkBAIC02Mjk0LDcgKzYzMTEsNyBAQAogICogRW5zdXJlcyBhbGwgY29udGV4dHMgd2l0aCB0aGUgc2FtZSB0YXNrX2N0eF9uciBoYXZlIHRoZSBzYW1lCiAgKiBwbXVfY3B1X2NvbnRleHQgdG9vLgogICovCi1zdGF0aWMgdm9pZCAqZmluZF9wbXVfY29udGV4dChpbnQgY3R4bikKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCBfX3BlcmNwdSAqZmluZF9wbXVfY29udGV4dChpbnQgY3R4bikKIHsKIAlzdHJ1Y3QgcG11ICpwbXU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9leHRhYmxlLmMgYi9rZXJuZWwvZXh0YWJsZS5jCmluZGV4IDc2M2ZhZjAuLmQ4YTY0NDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leHRhYmxlLmMKKysrIGIva2VybmVsL2V4dGFibGUuYwpAQCAtMzYsNyArMzYsNyBAQAogZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgX19zdG9wX19fZXhfdGFibGVbXTsKIAogLyogQ2xlYXJlZCBieSBidWlsZCB0aW1lIHRvb2xzIGlmIHRoZSB0YWJsZSBpcyBhbHJlYWR5IHNvcnRlZC4gKi8KLXUzMiBfX2luaXRkYXRhIG1haW5fZXh0YWJsZV9zb3J0X25lZWRlZCA9IDE7Cit1MzIgX19pbml0ZGF0YSBfX3Zpc2libGUgbWFpbl9leHRhYmxlX3NvcnRfbmVlZGVkID0gMTsKIAogLyogU29ydCB0aGUga2VybmVsJ3MgYnVpbHQtaW4gZXhjZXB0aW9uIHRhYmxlICovCiB2b2lkIF9faW5pdCBzb3J0X21haW5fZXh0YWJsZSh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggYTE3NjIxYy4uMzMyNjg4ZSAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0yMzcsNiArMjM3LDcgQEAKIAlXQVJOX09OKGF0b21pY19yZWFkKCZ0c2stPnVzYWdlKSk7CiAJV0FSTl9PTih0c2sgPT0gY3VycmVudCk7CiAKKwl0YXNrX251bWFfZnJlZSh0c2spOwogCXNlY3VyaXR5X3Rhc2tfZnJlZSh0c2spOwogCWV4aXRfY3JlZHModHNrKTsKIAlkZWxheWFjY3RfdHNrX2ZyZWUodHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggNDRhMTI2MS4uNjdkYWNhZiAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTE1Nyw3ICsxNTcsOSBAQAogICogZW5xdWV1ZS4KICAqLwogCisjaWZuZGVmIENPTkZJR19IQVZFX0ZVVEVYX0NNUFhDSEcKIGludCBfX3JlYWRfbW9zdGx5IGZ1dGV4X2NtcHhjaGdfZW5hYmxlZDsKKyNlbmRpZgogCiAvKgogICogRnV0ZXggZmxhZ3MgdXNlZCB0byBlbmNvZGUgb3B0aW9ucyB0byBmdW5jdGlvbnMgYW5kIHByZXNlcnZlIHRoZW0gYWNyb3NzCkBAIC0yMzQsNiArMjM2LDcgQEAKICAqIHdhaXRpbmcgb24gYSBmdXRleC4KICAqLwogc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0IHsKKwlhdG9taWNfdCB3YWl0ZXJzOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgcGxpc3RfaGVhZCBjaGFpbjsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTI1MywyMiArMjU2LDM3IEBACiAJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBoYl93YWl0ZXJzX3BlbmRpbmcoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYikKKy8qCisgKiBSZWZsZWN0cyBhIG5ldyB3YWl0ZXIgYmVpbmcgYWRkZWQgdG8gdGhlIHdhaXRxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhiX3dhaXRlcnNfaW5jKHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAorCWF0b21pY19pbmMoJmhiLT53YWl0ZXJzKTsKIAkvKgotCSAqIFRhc2tzIHRyeWluZyB0byBlbnRlciB0aGUgY3JpdGljYWwgcmVnaW9uIGFyZSBtb3N0IGxpa2VseQotCSAqIHBvdGVudGlhbCB3YWl0ZXJzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGxpc3QuIEVuc3VyZQotCSAqIHRoYXQgd2FrZXJzIHdvbid0IG1pc3MgdG8tYmUtc2xlcHQgdGFza3MgaW4gdGhlIHdpbmRvdyBiZXR3ZWVuCi0JICogdGhlIHdhaXQgY2FsbCBhbmQgdGhlIGFjdHVhbCBwbGlzdF9hZGQuCisJICogRnVsbCBiYXJyaWVyIChBKSwgc2VlIHRoZSBvcmRlcmluZyBjb21tZW50IGFib3ZlLgogCSAqLwotCWlmIChzcGluX2lzX2xvY2tlZCgmaGItPmxvY2spKQotCQlyZXR1cm4gdHJ1ZTsKLQlzbXBfcm1iKCk7IC8qIE1ha2Ugc3VyZSB3ZSBjaGVjayB0aGUgbG9jayBzdGF0ZSBmaXJzdCAqLworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOworI2VuZGlmCit9CiAKLQlyZXR1cm4gIXBsaXN0X2hlYWRfZW1wdHkoJmhiLT5jaGFpbik7CisvKgorICogUmVmbGVjdHMgYSB3YWl0ZXIgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSB3YWl0cXVldWUgYnkgd2FrZXVwCisgKiBwYXRocy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhiX3dhaXRlcnNfZGVjKHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWF0b21pY19kZWMoJmhiLT53YWl0ZXJzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBoYl93YWl0ZXJzX3BlbmRpbmcoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYikKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIGF0b21pY19yZWFkKCZoYi0+d2FpdGVycyk7CiAjZWxzZQotCXJldHVybiB0cnVlOworCXJldHVybiAxOwogI2VuZGlmCiB9CiAKQEAgLTk1NCw2ICs5NzIsNyBAQAogCiAJaGIgPSBjb250YWluZXJfb2YocS0+bG9ja19wdHIsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCwgbG9jayk7CiAJcGxpc3RfZGVsKCZxLT5saXN0LCAmaGItPmNoYWluKTsKKwloYl93YWl0ZXJzX2RlYyhoYik7CiB9CiAKIC8qCkBAIC0xMjU3LDcgKzEyNzYsOSBAQAogCSAqLwogCWlmIChsaWtlbHkoJmhiMS0+Y2hhaW4gIT0gJmhiMi0+Y2hhaW4pKSB7CiAJCXBsaXN0X2RlbCgmcS0+bGlzdCwgJmhiMS0+Y2hhaW4pOworCQloYl93YWl0ZXJzX2RlYyhoYjEpOwogCQlwbGlzdF9hZGQoJnEtPmxpc3QsICZoYjItPmNoYWluKTsKKwkJaGJfd2FpdGVyc19pbmMoaGIyKTsKIAkJcS0+bG9ja19wdHIgPSAmaGIyLT5sb2NrOwogCX0KIAlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5Mik7CkBAIC0xNjAwLDYgKzE2MjEsMTcgQEAKIAlzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiOwogCiAJaGIgPSBoYXNoX2Z1dGV4KCZxLT5rZXkpOworCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgYmVmb3JlIHRha2luZyB0aGUgbG9jayBzbyB0aGF0CisJICogYSBwb3RlbnRpYWwgd2FrZXIgd29uJ3QgbWlzcyBhIHRvLWJlLXNsZXB0IHRhc2sgdGhhdCBpcworCSAqIHdhaXRpbmcgZm9yIHRoZSBzcGlubG9jay4gVGhpcyBpcyBzYWZlIGFzIGFsbCBxdWV1ZV9sb2NrKCkKKwkgKiB1c2VycyBlbmQgdXAgY2FsbGluZyBxdWV1ZV9tZSgpLiBTaW1pbGFybHksIGZvciBob3VzZWtlZXBpbmcsCisJICogZGVjcmVtZW50IHRoZSBjb3VudGVyIGF0IHF1ZXVlX3VubG9jaygpIHdoZW4gc29tZSBlcnJvciBoYXMKKwkgKiBvY2N1cnJlZCBhbmQgd2UgZG9uJ3QgZW5kIHVwIGFkZGluZyB0aGUgdGFzayB0byB0aGUgbGlzdC4KKwkgKi8KKwloYl93YWl0ZXJzX2luYyhoYik7CisKIAlxLT5sb2NrX3B0ciA9ICZoYi0+bG9jazsKIAogCXNwaW5fbG9jaygmaGItPmxvY2spOyAvKiBpbXBsaWVzIE1CIChBKSAqLwpAQCAtMTYxMSw2ICsxNjQzLDcgQEAKIAlfX3JlbGVhc2VzKCZoYi0+bG9jaykKIHsKIAlzcGluX3VubG9jaygmaGItPmxvY2spOworCWhiX3dhaXRlcnNfZGVjKGhiKTsKIH0KIAogLyoqCkBAIC0yMzQyLDYgKzIzNzUsNyBAQAogCQkgKiBVbnF1ZXVlIHRoZSBmdXRleF9xIGFuZCBkZXRlcm1pbmUgd2hpY2ggaXQgd2FzLgogCQkgKi8KIAkJcGxpc3RfZGVsKCZxLT5saXN0LCAmaGItPmNoYWluKTsKKwkJaGJfd2FpdGVyc19kZWMoaGIpOwogCiAJCS8qIEhhbmRsZSBzcHVyaW91cyB3YWtldXBzIGdyYWNlZnVsbHkgKi8KIAkJcmV0ID0gLUVXT1VMREJMT0NLOwpAQCAtMjg0Myw5ICsyODc3LDI4IEBACiAJcmV0dXJuIGRvX2Z1dGV4KHVhZGRyLCBvcCwgdmFsLCB0cCwgdWFkZHIyLCB2YWwyLCB2YWwzKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGZ1dGV4X2RldGVjdF9jbXB4Y2hnKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19IQVZFX0ZVVEVYX0NNUFhDSEcKKwl1MzIgY3VydmFsOworCisJLyoKKwkgKiBUaGlzIHdpbGwgZmFpbCBhbmQgd2Ugd2FudCBpdC4gU29tZSBhcmNoIGltcGxlbWVudGF0aW9ucyBkbworCSAqIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIHRoZSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYygpCisJICogZnVuY3Rpb25hbGl0eS4gV2Ugd2FudCB0byBrbm93IHRoYXQgYmVmb3JlIHdlIGNhbGwgaW4gYW55CisJICogb2YgdGhlIGNvbXBsZXggY29kZSBwYXRocy4gQWxzbyB3ZSB3YW50IHRvIHByZXZlbnQKKwkgKiByZWdpc3RyYXRpb24gb2Ygcm9idXN0IGxpc3RzIGluIHRoYXQgY2FzZS4gTlVMTCBpcworCSAqIGd1YXJhbnRlZWQgdG8gZmF1bHQgYW5kIHdlIGdldCAtRUZBVUxUIG9uIGZ1bmN0aW9uYWwKKwkgKiBpbXBsZW1lbnRhdGlvbiwgdGhlIG5vbi1mdW5jdGlvbmFsIG9uZXMgd2lsbCByZXR1cm4KKwkgKiAtRU5PU1lTLgorCSAqLworCWlmIChjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCgmY3VydmFsLCBOVUxMLCAwLCAwKSA9PSAtRUZBVUxUKQorCQlmdXRleF9jbXB4Y2hnX2VuYWJsZWQgPSAxOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgX19pbml0IGZ1dGV4X2luaXQodm9pZCkKIHsKLQl1MzIgY3VydmFsOwogCXVuc2lnbmVkIGludCBmdXRleF9zaGlmdDsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTI4NjEsMjAgKzI5MTQsMTEgQEAKIAkJCQkJICAgICAgICZmdXRleF9zaGlmdCwgTlVMTCwKIAkJCQkJICAgICAgIGZ1dGV4X2hhc2hzaXplLCBmdXRleF9oYXNoc2l6ZSk7CiAJZnV0ZXhfaGFzaHNpemUgPSAxVUwgPDwgZnV0ZXhfc2hpZnQ7Ci0JLyoKLQkgKiBUaGlzIHdpbGwgZmFpbCBhbmQgd2Ugd2FudCBpdC4gU29tZSBhcmNoIGltcGxlbWVudGF0aW9ucyBkbwotCSAqIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIHRoZSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYygpCi0JICogZnVuY3Rpb25hbGl0eS4gV2Ugd2FudCB0byBrbm93IHRoYXQgYmVmb3JlIHdlIGNhbGwgaW4gYW55Ci0JICogb2YgdGhlIGNvbXBsZXggY29kZSBwYXRocy4gQWxzbyB3ZSB3YW50IHRvIHByZXZlbnQKLQkgKiByZWdpc3RyYXRpb24gb2Ygcm9idXN0IGxpc3RzIGluIHRoYXQgY2FzZS4gTlVMTCBpcwotCSAqIGd1YXJhbnRlZWQgdG8gZmF1bHQgYW5kIHdlIGdldCAtRUZBVUxUIG9uIGZ1bmN0aW9uYWwKLQkgKiBpbXBsZW1lbnRhdGlvbiwgdGhlIG5vbi1mdW5jdGlvbmFsIG9uZXMgd2lsbCByZXR1cm4KLQkgKiAtRU5PU1lTLgotCSAqLwotCWlmIChjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCgmY3VydmFsLCBOVUxMLCAwLCAwKSA9PSAtRUZBVUxUKQotCQlmdXRleF9jbXB4Y2hnX2VuYWJsZWQgPSAxOworCisJZnV0ZXhfZGV0ZWN0X2NtcHhjaGcoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBmdXRleF9oYXNoc2l6ZTsgaSsrKSB7CisJCWF0b21pY19zZXQoJmZ1dGV4X3F1ZXVlc1tpXS53YWl0ZXJzLCAwKTsKIAkJcGxpc3RfaGVhZF9pbml0KCZmdXRleF9xdWV1ZXNbaV0uY2hhaW4pOwogCQlzcGluX2xvY2tfaW5pdCgmZnV0ZXhfcXVldWVzW2ldLmxvY2spOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleF9jb21wYXQuYyBiL2tlcm5lbC9mdXRleF9jb21wYXQuYwppbmRleCBmOWY0NGZkLi41NWM4YzkzIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXhfY29tcGF0LmMKKysrIGIva2VybmVsL2Z1dGV4X2NvbXBhdC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAlpZiAodXRpbWUgJiYgKGNtZCA9PSBGVVRFWF9XQUlUIHx8IGNtZCA9PSBGVVRFWF9MT0NLX1BJIHx8CiAJCSAgICAgIGNtZCA9PSBGVVRFWF9XQUlUX0JJVFNFVCB8fAogCQkgICAgICBjbWQgPT0gRlVURVhfV0FJVF9SRVFVRVVFX1BJKSkgewotCQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmdHMsIHV0aW1lKSkKKwkJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJnRzLCB1dGltZSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKCF0aW1lc3BlY192YWxpZCgmdHMpKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAwOTA5NDM2Li5kNTUwOTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTE2OCwxOSArMTY4LDYgQEAKIAl9CiB9CiAKLQotLyoKLSAqIEdldCB0aGUgcHJlZmVycmVkIHRhcmdldCBDUFUgZm9yIE5PSFoKLSAqLwotc3RhdGljIGludCBocnRpbWVyX2dldF90YXJnZXQoaW50IHRoaXNfY3B1LCBpbnQgcGlubmVkKQotewotI2lmZGVmIENPTkZJR19OT19IWl9DT01NT04KLQlpZiAoIXBpbm5lZCAmJiBnZXRfc3lzY3RsX3RpbWVyX21pZ3JhdGlvbigpICYmIGlkbGVfY3B1KHRoaXNfY3B1KSkKLQkJcmV0dXJuIGdldF9ub2h6X3RpbWVyX3RhcmdldCgpOwotI2VuZGlmCi0JcmV0dXJuIHRoaXNfY3B1OwotfQotCiAvKgogICogV2l0aCBISUdIUkVTPXkgd2UgZG8gbm90IG1pZ3JhdGUgdGhlIHRpbWVyIHdoZW4gaXQgaXMgZXhwaXJpbmcKICAqIGJlZm9yZSB0aGUgbmV4dCBldmVudCBvbiB0aGUgdGFyZ2V0IGNwdSBiZWNhdXNlIHdlIGNhbm5vdCByZXByb2dyYW0KQEAgLTIxNCw3ICsyMDEsNyBAQAogCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm5ld19iYXNlOwogCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpuZXdfY3B1X2Jhc2U7CiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBjcHUgPSBocnRpbWVyX2dldF90YXJnZXQodGhpc19jcHUsIHBpbm5lZCk7CisJaW50IGNwdSA9IGdldF9ub2h6X3RpbWVyX3RhcmdldChwaW5uZWQpOwogCWludCBiYXNlbnVtID0gYmFzZS0+aW5kZXg7CiAKIGFnYWluOgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCBkYzA0YzE2Li42Mzk3ZGYyIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtMjgxLDYgKzI4MSwxOSBAQAogCX0KIH0KIAordm9pZCB1bm1hc2tfdGhyZWFkZWRfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBkZXNjLT5pcnFfZGF0YS5jaGlwOworCisJaWYgKGNoaXAtPmZsYWdzICYgSVJRQ0hJUF9FT0lfVEhSRUFERUQpCisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKworCWlmIChjaGlwLT5pcnFfdW5tYXNrKSB7CisJCWNoaXAtPmlycV91bm1hc2soJmRlc2MtPmlycV9kYXRhKTsKKwkJaXJxX3N0YXRlX2Nscl9tYXNrZWQoZGVzYyk7CisJfQorfQorCiAvKgogICoJaGFuZGxlX25lc3RlZF9pcnEgLSBIYW5kbGUgYSBuZXN0ZWQgaXJxIGZyb20gYSBpcnEgdGhyZWFkCiAgKglAaXJxOgl0aGUgaW50ZXJydXB0IG51bWJlcgpAQCAtNDM1LDYgKzQ0OCwyNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHByZWZsb3dfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpIHsgfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGNvbmRfdW5tYXNrX2VvaV9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxX2NoaXAgKmNoaXApCit7CisJaWYgKCEoZGVzYy0+aXN0YXRlICYgSVJRU19PTkVTSE9UKSkgeworCQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRvIHVubWFzayBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorCSAqIC0gT25lc2hvdCBpcnEgd2hpY2ggZGlkIG5vdCB3YWtlIHRoZSB0aHJlYWQgKGNhdXNlZCBieSBhCisJICogICBzcHVyaW91cyBpbnRlcnJ1cHQgb3IgYSBwcmltYXJ5IGhhbmRsZXIgaGFuZGxpbmcgaXQKKwkgKiAgIGNvbXBsZXRlbHkpLgorCSAqLworCWlmICghaXJxZF9pcnFfZGlzYWJsZWQoJmRlc2MtPmlycV9kYXRhKSAmJgorCSAgICBpcnFkX2lycV9tYXNrZWQoJmRlc2MtPmlycV9kYXRhKSAmJiAhZGVzYy0+dGhyZWFkc19vbmVzaG90KSB7CisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKwkJdW5tYXNrX2lycShkZXNjKTsKKwl9IGVsc2UgaWYgKCEoY2hpcC0+ZmxhZ3MgJiBJUlFDSElQX0VPSV9USFJFQURFRCkpIHsKKwkJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOworCX0KK30KKwogLyoqCiAgKgloYW5kbGVfZmFzdGVvaV9pcnEgLSBpcnEgaGFuZGxlciBmb3IgdHJhbnNwYXJlbnQgY29udHJvbGxlcnMKICAqCUBpcnE6CXRoZSBpbnRlcnJ1cHQgbnVtYmVyCkBAIC00NDgsNiArNDgyLDggQEAKIHZvaWQKIGhhbmRsZV9mYXN0ZW9pX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gZGVzYy0+aXJxX2RhdGEuY2hpcDsKKwogCXJhd19zcGluX2xvY2soJmRlc2MtPmxvY2spOwogCiAJaWYgKHVubGlrZWx5KGlycWRfaXJxX2lucHJvZ3Jlc3MoJmRlc2MtPmlycV9kYXRhKSkpCkBAIC00NzMsMTggKzUwOSwxNCBAQAogCXByZWZsb3dfaGFuZGxlcihkZXNjKTsKIAloYW5kbGVfaXJxX2V2ZW50KGRlc2MpOwogCi0JaWYgKGRlc2MtPmlzdGF0ZSAmIElSUVNfT05FU0hPVCkKLQkJY29uZF91bm1hc2tfaXJxKGRlc2MpOworCWNvbmRfdW5tYXNrX2VvaV9pcnEoZGVzYywgY2hpcCk7CiAKLW91dF9lb2k6Ci0JZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwotb3V0X3VubG9jazoKIAlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogCXJldHVybjsKIG91dDoKLQlpZiAoIShkZXNjLT5pcnFfZGF0YS5jaGlwLT5mbGFncyAmIElSUUNISVBfRU9JX0lGX0hBTkRMRUQpKQotCQlnb3RvIG91dF9lb2k7Ci0JZ290byBvdXRfdW5sb2NrOworCWlmICghKGNoaXAtPmZsYWdzICYgSVJRQ0hJUF9FT0lfSUZfSEFORExFRCkpCisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKwlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaGFuZGxlLmMgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCmluZGV4IDEzMWNhMTcuLjYzNTQ4MDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaGFuZGxlLmMKKysrIGIva2VybmVsL2lycS9oYW5kbGUuYwpAQCAtNDEsNiArNDEsNyBAQAogewogCXJldHVybiBJUlFfTk9ORTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5vX2FjdGlvbik7CiAKIHN0YXRpYyB2b2lkIHdhcm5fbm9fdGhyZWFkKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKIHsKQEAgLTUxLDcgKzUyLDcgQEAKIAkgICAgICAgImJ1dCBubyB0aHJlYWQgZnVuY3Rpb24gYXZhaWxhYmxlLiIsIGlycSwgYWN0aW9uLT5uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgaXJxX3dha2VfdGhyZWFkKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQordm9pZCBfX2lycV93YWtlX3RocmVhZChzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKIHsKIAkvKgogCSAqIEluIGNhc2UgdGhlIHRocmVhZCBjcmFzaGVkIGFuZCB3YXMga2lsbGVkIHdlIGp1c3QgcHJldGVuZCB0aGF0CkBAIC0xNTcsNyArMTU4LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJaXJxX3dha2VfdGhyZWFkKGRlc2MsIGFjdGlvbik7CisJCQlfX2lycV93YWtlX3RocmVhZChkZXNjLCBhY3Rpb24pOwogCiAJCQkvKiBGYWxsIHRocm91Z2ggdG8gYWRkIHRvIHJhbmRvbW5lc3MgKi8KIAkJY2FzZSBJUlFfSEFORExFRDoKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmggYi9rZXJuZWwvaXJxL2ludGVybmFscy5oCmluZGV4IDAwMWZhNWIuLmRkZjFmZmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmgKKysrIGIva2VybmVsL2lycS9pbnRlcm5hbHMuaApAQCAtNiw2ICs2LDcgQEAKICAqIG9mIHRoaXMgZmlsZSBmb3IgeW91ciBub24gY29yZSBjb2RlLgogICovCiAjaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpZmRlZiBDT05GSUdfU1BBUlNFX0lSUQogIyBkZWZpbmUgSVJRX0JJVE1BUF9CSVRTCShOUl9JUlFTICsgODE5NikKQEAgLTczLDYgKzc0LDcgQEAKIGV4dGVybiB2b2lkIGlycV9wZXJjcHVfZGlzYWJsZShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGludCBjcHUpOwogZXh0ZXJuIHZvaWQgbWFza19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIGV4dGVybiB2b2lkIHVubWFza19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKK2V4dGVybiB2b2lkIHVubWFza190aHJlYWRlZF9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUsIGludCBucik7CiAKQEAgLTgyLDYgKzg0LDcgQEAKIC8qIFJlc2VuZGluZyBvZiBpbnRlcnJ1cHRzIDoqLwogdm9pZCBjaGVja19pcnFfcmVzZW5kKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGlycSk7CiBib29sIGlycV93YWl0X2Zvcl9wb2xsKHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7Cit2b2lkIF9faXJxX3dha2VfdGhyZWFkKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9pcnFfcHJvYyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwpAQCAtMTc5LDMgKzE4Miw5IEBACiB7CiAJcmV0dXJuIGQtPnN0YXRlX3VzZV9hY2Nlc3NvcnMgJiBtYXNrOwogfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlfX3RoaXNfY3B1X2luYygqZGVzYy0+a3N0YXRfaXJxcyk7CisJX190aGlzX2NwdV9pbmMoa3N0YXQuaXJxc19zdW0pOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCA4YWI4ZTkzLi5hNzE3NDYxNyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pcnFkZXNjLmMKKysrIGIva2VybmVsL2lycS9pcnFkZXNjLmMKQEAgLTQ4OSw2ICs0ODksMTEgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogfQogCit2b2lkIGtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEpCit7CisJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7Cit9CisKIHVuc2lnbmVkIGludCBrc3RhdF9pcnFzX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCBkM2JmNjYwLi4yNDg2YTRjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTMyLDI0ICszMiwxMCBAQAogZWFybHlfcGFyYW0oInRocmVhZGlycXMiLCBzZXR1cF9mb3JjZWRfaXJxdGhyZWFkcyk7CiAjZW5kaWYKIAotLyoqCi0gKglzeW5jaHJvbml6ZV9pcnEgLSB3YWl0IGZvciBwZW5kaW5nIElSUSBoYW5kbGVycyAob24gb3RoZXIgQ1BVcykKLSAqCUBpcnE6IGludGVycnVwdCBudW1iZXIgdG8gd2FpdCBmb3IKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbnkgcGVuZGluZyBJUlEgaGFuZGxlcnMgZm9yIHRoaXMgaW50ZXJydXB0Ci0gKgl0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gd2hpbGUKLSAqCWhvbGRpbmcgYSByZXNvdXJjZSB0aGUgSVJRIGhhbmRsZXIgbWF5IG5lZWQgeW91IHdpbGwgZGVhZGxvY2suCi0gKgotICoJVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIC0gd2l0aCBjYXJlIC0gZnJvbSBJUlEgY29udGV4dC4KLSAqLwotdm9pZCBzeW5jaHJvbml6ZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIF9fc3luY2hyb25pemVfaGFyZGlycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlib29sIGlucHJvZ3Jlc3M7CiAKLQlpZiAoIWRlc2MpCi0JCXJldHVybjsKLQogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNjcsMTIgKzUzLDU2IEBACiAKIAkJLyogT29wcywgdGhhdCBmYWlsZWQ/ICovCiAJfSB3aGlsZSAoaW5wcm9ncmVzcyk7Cit9CiAKLQkvKgotCSAqIFdlIG1hZGUgc3VyZSB0aGF0IG5vIGhhcmRpcnEgaGFuZGxlciBpcyBydW5uaW5nLiBOb3cgdmVyaWZ5Ci0JICogdGhhdCBubyB0aHJlYWRlZCBoYW5kbGVycyBhcmUgYWN0aXZlLgotCSAqLwotCXdhaXRfZXZlbnQoZGVzYy0+d2FpdF9mb3JfdGhyZWFkcywgIWF0b21pY19yZWFkKCZkZXNjLT50aHJlYWRzX2FjdGl2ZSkpOworLyoqCisgKglzeW5jaHJvbml6ZV9oYXJkaXJxIC0gd2FpdCBmb3IgcGVuZGluZyBoYXJkIElSUSBoYW5kbGVycyAob24gb3RoZXIgQ1BVcykKKyAqCUBpcnE6IGludGVycnVwdCBudW1iZXIgdG8gd2FpdCBmb3IKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbnkgcGVuZGluZyBoYXJkIElSUSBoYW5kbGVycyBmb3IgdGhpcworICoJaW50ZXJydXB0IHRvIGNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcuIElmIHlvdSB1c2UgdGhpcworICoJZnVuY3Rpb24gd2hpbGUgaG9sZGluZyBhIHJlc291cmNlIHRoZSBJUlEgaGFuZGxlciBtYXkgbmVlZCB5b3UKKyAqCXdpbGwgZGVhZGxvY2suIEl0IGRvZXMgbm90IHRha2UgYXNzb2NpYXRlZCB0aHJlYWRlZCBoYW5kbGVycworICoJaW50byBhY2NvdW50LgorICoKKyAqCURvIG5vdCB1c2UgdGhpcyBmb3Igc2h1dGRvd24gc2NlbmFyaW9zIHdoZXJlIHlvdSBtdXN0IGJlIHN1cmUKKyAqCXRoYXQgYWxsIHBhcnRzIChoYXJkaXJxIGFuZCB0aHJlYWRlZCBoYW5kbGVyKSBoYXZlIGNvbXBsZXRlZC4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgLSB3aXRoIGNhcmUgLSBmcm9tIElSUSBjb250ZXh0LgorICovCit2b2lkIHN5bmNocm9uaXplX2hhcmRpcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKGRlc2MpCisJCV9fc3luY2hyb25pemVfaGFyZGlycShkZXNjKTsKK30KK0VYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaGFyZGlycSk7CisKKy8qKgorICoJc3luY2hyb25pemVfaXJxIC0gd2FpdCBmb3IgcGVuZGluZyBJUlEgaGFuZGxlcnMgKG9uIG90aGVyIENQVXMpCisgKglAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyIHRvIHdhaXQgZm9yCisgKgorICoJVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgYW55IHBlbmRpbmcgSVJRIGhhbmRsZXJzIGZvciB0aGlzIGludGVycnVwdAorICoJdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZy4gSWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIHdoaWxlCisgKglob2xkaW5nIGEgcmVzb3VyY2UgdGhlIElSUSBoYW5kbGVyIG1heSBuZWVkIHlvdSB3aWxsIGRlYWRsb2NrLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCAtIHdpdGggY2FyZSAtIGZyb20gSVJRIGNvbnRleHQuCisgKi8KK3ZvaWQgc3luY2hyb25pemVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWlmIChkZXNjKSB7CisJCV9fc3luY2hyb25pemVfaGFyZGlycShkZXNjKTsKKwkJLyoKKwkJICogV2UgbWFkZSBzdXJlIHRoYXQgbm8gaGFyZGlycSBoYW5kbGVyIGlzCisJCSAqIHJ1bm5pbmcuIE5vdyB2ZXJpZnkgdGhhdCBubyB0aHJlYWRlZCBoYW5kbGVycyBhcmUKKwkJICogYWN0aXZlLgorCQkgKi8KKwkJd2FpdF9ldmVudChkZXNjLT53YWl0X2Zvcl90aHJlYWRzLAorCQkJICAgIWF0b21pY19yZWFkKCZkZXNjLT50aHJlYWRzX2FjdGl2ZSkpOworCX0KIH0KIEVYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKIApAQCAtNzE4LDcgKzc0OCw3IEBACiAKIAlpZiAoIWRlc2MtPnRocmVhZHNfb25lc2hvdCAmJiAhaXJxZF9pcnFfZGlzYWJsZWQoJmRlc2MtPmlycV9kYXRhKSAmJgogCSAgICBpcnFkX2lycV9tYXNrZWQoJmRlc2MtPmlycV9kYXRhKSkKLQkJdW5tYXNrX2lycShkZXNjKTsKKwkJdW5tYXNrX3RocmVhZGVkX2lycShkZXNjKTsKIAogb3V0X3VubG9jazoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKQEAgLTcyNyw3ICs3NTcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogLyoKLSAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBjaGFzbmdlIHRoZSBhZmZpbml0eSBvZiB0aGUgaW50ZXJydXB0IHRocmVhZC4KKyAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGFmZmluaXR5IG9mIHRoZSBpbnRlcnJ1cHQgdGhyZWFkLgogICovCiBzdGF0aWMgdm9pZAogaXJxX3RocmVhZF9jaGVja19hZmZpbml0eShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKQEAgLTg4MCw2ICs5MTAsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKglpcnFfd2FrZV90aHJlYWQgLSB3YWtlIHRoZSBpcnEgdGhyZWFkIGZvciB0aGUgYWN0aW9uIGlkZW50aWZpZWQgYnkgZGV2X2lkCisgKglAaXJxOgkJSW50ZXJydXB0IGxpbmUKKyAqCUBkZXZfaWQ6CURldmljZSBpZGVudGl0eSBmb3Igd2hpY2ggdGhlIHRocmVhZCBzaG91bGQgYmUgd29rZW4KKyAqCisgKi8KK3ZvaWQgaXJxX3dha2VfdGhyZWFkKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkZXNjIHx8IFdBUk5fT04oaXJxX3NldHRpbmdzX2lzX3Blcl9jcHVfZGV2aWQoZGVzYykpKQorCQlyZXR1cm47CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGFjdGlvbiA9IGRlc2MtPmFjdGlvbjsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKKwkJaWYgKGFjdGlvbi0+ZGV2X2lkID09IGRldl9pZCkgeworCQkJaWYgKGFjdGlvbi0+dGhyZWFkKQorCQkJCV9faXJxX3dha2VfdGhyZWFkKGRlc2MsIGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX3dha2VfdGhyZWFkKTsKKwogc3RhdGljIHZvaWQgaXJxX3NldHVwX2ZvcmNlZF90aHJlYWRpbmcoc3RydWN0IGlycWFjdGlvbiAqbmV3KQogewogCWlmICghZm9yY2VfaXJxdGhyZWFkcykKQEAgLTg5Niw2ICs5NTMsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaXJxX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSAmZGVzYy0+aXJxX2RhdGE7CisJc3RydWN0IGlycV9jaGlwICpjID0gZC0+Y2hpcDsKKworCXJldHVybiBjLT5pcnFfcmVxdWVzdF9yZXNvdXJjZXMgPyBjLT5pcnFfcmVxdWVzdF9yZXNvdXJjZXMoZCkgOiAwOworfQorCitzdGF0aWMgdm9pZCBpcnFfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZCA9ICZkZXNjLT5pcnFfZGF0YTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmMgPSBkLT5jaGlwOworCisJaWYgKGMtPmlycV9yZWxlYXNlX3Jlc291cmNlcykKKwkJYy0+aXJxX3JlbGVhc2VfcmVzb3VyY2VzKGQpOworfQorCiAvKgogICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYW4gaXJxYWN0aW9uIC0gdHlwaWNhbGx5IHVzZWQgdG8KICAqIGFsbG9jYXRlIHNwZWNpYWwgaW50ZXJydXB0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhcmNoaXRlY3R1cmUuCkBAIC0xMDkxLDYgKzExNjUsMTMgQEAKIAl9CiAKIAlpZiAoIXNoYXJlZCkgeworCQlyZXQgPSBpcnFfcmVxdWVzdF9yZXNvdXJjZXMoZGVzYyk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHJlcXVlc3QgcmVzb3VyY2VzIGZvciAlcyAoaXJxICVkKSBvbiBpcnFjaGlwICVzXG4iLAorCQkJICAgICAgIG5ldy0+bmFtZSwgaXJxLCBkZXNjLT5pcnFfZGF0YS5jaGlwLT5uYW1lKTsKKwkJCWdvdG8gb3V0X21hc2s7CisJCX0KKwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXNjLT53YWl0X2Zvcl90aHJlYWRzKTsKIAogCQkvKiBTZXR1cCB0aGUgdHlwZSAobGV2ZWwsIGVkZ2UgcG9sYXJpdHkpIGlmIGNvbmZpZ3VyZWQ6ICovCkBAIC0xMjYxLDggKzEzNDIsMTAgQEAKIAkqYWN0aW9uX3B0ciA9IGFjdGlvbi0+bmV4dDsKIAogCS8qIElmIHRoaXMgd2FzIHRoZSBsYXN0IGhhbmRsZXIsIHNodXQgZG93biB0aGUgSVJRIGxpbmU6ICovCi0JaWYgKCFkZXNjLT5hY3Rpb24pCisJaWYgKCFkZXNjLT5hY3Rpb24pIHsKIAkJaXJxX3NodXRkb3duKGRlc2MpOworCQlpcnFfcmVsZWFzZV9yZXNvdXJjZXMoZGVzYyk7CisJfQogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIG1ha2Ugc3VyZSBhZmZpbml0eV9oaW50IGlzIGNsZWFuZWQgdXAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvcHJvYy5jIGIva2VybmVsL2lycS9wcm9jLmMKaW5kZXggMzZmNmVlMS4uYWMxYmEyZiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9wcm9jLmMKKysrIGIva2VybmVsL2lycS9wcm9jLmMKQEAgLTMyNCwxNSArMzI0LDE1IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJLyogY3JlYXRlIC9wcm9jL2lycS88aXJxPi9zbXBfYWZmaW5pdHkgKi8KLQlwcm9jX2NyZWF0ZV9kYXRhKCJzbXBfYWZmaW5pdHkiLCAwNjAwLCBkZXNjLT5kaXIsCisJcHJvY19jcmVhdGVfZGF0YSgic21wX2FmZmluaXR5IiwgMDY0NCwgZGVzYy0+ZGlyLAogCQkJICZpcnFfYWZmaW5pdHlfcHJvY19mb3BzLCAodm9pZCAqKShsb25nKWlycSk7CiAKIAkvKiBjcmVhdGUgL3Byb2MvaXJxLzxpcnE+L2FmZmluaXR5X2hpbnQgKi8KLQlwcm9jX2NyZWF0ZV9kYXRhKCJhZmZpbml0eV9oaW50IiwgMDQwMCwgZGVzYy0+ZGlyLAorCXByb2NfY3JlYXRlX2RhdGEoImFmZmluaXR5X2hpbnQiLCAwNDQ0LCBkZXNjLT5kaXIsCiAJCQkgJmlycV9hZmZpbml0eV9oaW50X3Byb2NfZm9wcywgKHZvaWQgKikobG9uZylpcnEpOwogCiAJLyogY3JlYXRlIC9wcm9jL2lycS88aXJxPi9zbXBfYWZmaW5pdHlfbGlzdCAqLwotCXByb2NfY3JlYXRlX2RhdGEoInNtcF9hZmZpbml0eV9saXN0IiwgMDYwMCwgZGVzYy0+ZGlyLAorCXByb2NfY3JlYXRlX2RhdGEoInNtcF9hZmZpbml0eV9saXN0IiwgMDY0NCwgZGVzYy0+ZGlyLAogCQkJICZpcnFfYWZmaW5pdHlfbGlzdF9wcm9jX2ZvcHMsICh2b2lkICopKGxvbmcpaXJxKTsKIAogCXByb2NfY3JlYXRlX2RhdGEoIm5vZGUiLCAwNDQ0LCBkZXNjLT5kaXIsCkBAIC0zNzIsNyArMzcyLDcgQEAKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2RlZmF1bHRfYWZmaW5pdHlfcHJvYyh2b2lkKQogewogI2lmZGVmIENPTkZJR19TTVAKLQlwcm9jX2NyZWF0ZSgiaXJxL2RlZmF1bHRfc21wX2FmZmluaXR5IiwgMDYwMCwgTlVMTCwKKwlwcm9jX2NyZWF0ZSgiaXJxL2RlZmF1bHRfc21wX2FmZmluaXR5IiwgMDY0NCwgTlVMTCwKIAkJICAgICZkZWZhdWx0X2FmZmluaXR5X3Byb2NfZm9wcyk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnFfd29yay5jIGIva2VybmVsL2lycV93b3JrLmMKaW5kZXggNTVmY2NlNi4uYTgyMTcwZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycV93b3JrLmMKKysrIGIva2VybmVsL2lycV93b3JrLmMKQEAgLTYxLDExICs2MSwxMSBAQAogICoKICAqIENhbiBiZSByZS1lbnF1ZXVlZCB3aGlsZSB0aGUgY2FsbGJhY2sgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuCiAgKi8KLXZvaWQgaXJxX3dvcmtfcXVldWUoc3RydWN0IGlycV93b3JrICp3b3JrKQorYm9vbCBpcnFfd29ya19xdWV1ZShzdHJ1Y3QgaXJxX3dvcmsgKndvcmspCiB7CiAJLyogT25seSBxdWV1ZSBpZiBub3QgYWxyZWFkeSBwZW5kaW5nICovCiAJaWYgKCFpcnFfd29ya19jbGFpbSh3b3JrKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBRdWV1ZSB0aGUgZW50cnkgYW5kIHJhaXNlIHRoZSBJUEkgaWYgbmVlZGVkLiAqLwogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtODMsNiArODMsOCBAQAogCX0KIAogCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV93b3JrX3F1ZXVlKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCA2MGJhZmJlLi40NTYwMWNmIDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtMTAzOSwxMCArMTAzOSwxMCBAQAoge30KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2tleGVjX2xvYWQodW5zaWduZWQgbG9uZyBlbnRyeSwKLQkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAotCQkJCXN0cnVjdCBjb21wYXRfa2V4ZWNfc2VnbWVudCBfX3VzZXIgKnNlZ21lbnRzLAotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KGtleGVjX2xvYWQsIGNvbXBhdF91bG9uZ190LCBlbnRyeSwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBucl9zZWdtZW50cywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfa2V4ZWNfc2VnbWVudCBfX3VzZXIgKiwgc2VnbWVudHMsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgZmxhZ3MpCiB7CiAJc3RydWN0IGNvbXBhdF9rZXhlY19zZWdtZW50IGluOwogCXN0cnVjdCBrZXhlY19zZWdtZW50IG91dCwgX191c2VyICprc2VnbWVudHM7CmRpZmYgLS1naXQgYS9rZXJuZWwva3N5c2ZzLmMgYi9rZXJuZWwva3N5c2ZzLmMKaW5kZXggZDk0NWE5NC4uZTY2MDk2NCAxMDA2NDQKLS0tIGEva2VybmVsL2tzeXNmcy5jCisrKyBiL2tlcm5lbC9rc3lzZnMuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogCisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4JLyogcmN1X2V4cGVkaXRlZCAqLworCiAjZGVmaW5lIEtFUk5FTF9BVFRSX1JPKF9uYW1lKSBcCiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IF9fQVRUUl9STyhfbmFtZSkKIApkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUgYi9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZQppbmRleCBiYWFiOGU1Li4zMDZhNzZiIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZQorKysgYi9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIAotb2JqLXkgKz0gbXV0ZXgubyBzZW1hcGhvcmUubyByd3NlbS5vIGxnbG9jay5vCitvYmoteSArPSBtdXRleC5vIHNlbWFwaG9yZS5vIHJ3c2VtLm8gbGdsb2NrLm8gbWNzX3NwaW5sb2NrLm8KIAogaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogQ0ZMQUdTX1JFTU9WRV9sb2NrZGVwLm8gPSAtcGcKQEAgLTIzLDMgKzIzLDQgQEAKIG9iai0kKENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLKSArPSByd3NlbS1zcGlubG9jay5vCiBvYmotJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IHJ3c2VtLXhhZGQubwogb2JqLSQoQ09ORklHX1BFUkNQVV9SV1NFTSkgKz0gcGVyY3B1LXJ3c2VtLm8KK29iai0kKENPTkZJR19MT0NLX1RPUlRVUkVfVEVTVCkgKz0gbG9ja3RvcnR1cmUubwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tpbmcvbG9ja2RlcC5jCmluZGV4IGViOGE1NDcuLmIwZTk0NjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2luZy9sb2NrZGVwLmMKQEAgLTE5MzYsMTIgKzE5MzYsMTIgQEAKIAogCWZvciAoOzspIHsKIAkJaW50IGRpc3RhbmNlID0gY3Vyci0+bG9ja2RlcF9kZXB0aCAtIGRlcHRoICsgMTsKLQkJaGxvY2sgPSBjdXJyLT5oZWxkX2xvY2tzICsgZGVwdGgtMTsKKwkJaGxvY2sgPSBjdXJyLT5oZWxkX2xvY2tzICsgZGVwdGggLSAxOwogCQkvKgogCQkgKiBPbmx5IG5vbi1yZWN1cnNpdmUtcmVhZCBlbnRyaWVzIGdldCBuZXcgZGVwZW5kZW5jaWVzCiAJCSAqIGFkZGVkOgogCQkgKi8KLQkJaWYgKGhsb2NrLT5yZWFkICE9IDIpIHsKKwkJaWYgKGhsb2NrLT5yZWFkICE9IDIgJiYgaGxvY2stPmNoZWNrKSB7CiAJCQlpZiAoIWNoZWNrX3ByZXZfYWRkKGN1cnIsIGhsb2NrLCBuZXh0LAogCQkJCQkJZGlzdGFuY2UsIHRyeWxvY2tfbG9vcCkpCiAJCQkJcmV0dXJuIDA7CkBAIC0yMDk4LDcgKzIwOTgsNyBAQAogCSAqIChJZiBsb29rdXBfY2hhaW5fY2FjaGUoKSByZXR1cm5zIHdpdGggMSBpdCBhY3F1aXJlcwogCSAqIGdyYXBoX2xvY2sgZm9yIHVzKQogCSAqLwotCWlmICghaGxvY2stPnRyeWxvY2sgJiYgKGhsb2NrLT5jaGVjayA9PSAyKSAmJgorCWlmICghaGxvY2stPnRyeWxvY2sgJiYgaGxvY2stPmNoZWNrICYmCiAJICAgIGxvb2t1cF9jaGFpbl9jYWNoZShjdXJyLCBobG9jaywgY2hhaW5fa2V5KSkgewogCQkvKgogCQkgKiBDaGVjayB3aGV0aGVyIGxhc3QgaGVsZCBsb2NrOgpAQCAtMjUxNyw3ICsyNTE3LDcgQEAKIAogCQlCVUdfT04odXNhZ2VfYml0ID49IExPQ0tfVVNBR0VfU1RBVEVTKTsKIAotCQlpZiAoaGxvY2tfY2xhc3MoaGxvY2spLT5rZXkgPT0gX19sb2NrZGVwX25vX3ZhbGlkYXRlX18uc3Via2V5cykKKwkJaWYgKCFobG9jay0+Y2hlY2spCiAJCQljb250aW51ZTsKIAogCQlpZiAoIW1hcmtfbG9jayhjdXJyLCBobG9jaywgdXNhZ2VfYml0KSkKQEAgLTI1NTcsNyArMjU1Nyw3IEBACiAJZGVidWdfYXRvbWljX2luYyhoYXJkaXJxc19vbl9ldmVudHMpOwogfQogCi12b2lkIHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcih1bnNpZ25lZCBsb25nIGlwKQorX192aXNpYmxlIHZvaWQgdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKHVuc2lnbmVkIGxvbmcgaXApCiB7CiAJdGltZV9oYXJkaXJxc19vbihDQUxMRVJfQUREUjAsIGlwKTsKIApAQCAtMjYxMCw3ICsyNjEwLDcgQEAKIC8qCiAgKiBIYXJkaXJxcyB3ZXJlIGRpc2FibGVkOgogICovCi12b2lkIHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIodW5zaWduZWQgbG9uZyBpcCkKK19fdmlzaWJsZSB2b2lkIHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIodW5zaWduZWQgbG9uZyBpcCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCkBAIC0zMDU1LDkgKzMwNTUsNiBAQAogCWludCBjbGFzc19pZHg7CiAJdTY0IGNoYWluX2tleTsKIAotCWlmICghcHJvdmVfbG9ja2luZykKLQkJY2hlY2sgPSAxOwotCiAJaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcykpCiAJCXJldHVybiAwOwogCkBAIC0zMDY5LDggKzMwNjYsOCBAQAogCWlmIChERUJVR19MT0NLU19XQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpKQogCQlyZXR1cm4gMDsKIAotCWlmIChsb2NrLT5rZXkgPT0gJl9fbG9ja2RlcF9ub192YWxpZGF0ZV9fKQotCQljaGVjayA9IDE7CisJaWYgKCFwcm92ZV9sb2NraW5nIHx8IGxvY2stPmtleSA9PSAmX19sb2NrZGVwX25vX3ZhbGlkYXRlX18pCisJCWNoZWNrID0gMDsKIAogCWlmIChzdWJjbGFzcyA8IE5SX0xPQ0tERVBfQ0FDSElOR19DTEFTU0VTKQogCQljbGFzcyA9IGxvY2stPmNsYXNzX2NhY2hlW3N1YmNsYXNzXTsKQEAgLTMxMzgsNyArMzEzNSw3IEBACiAJaGxvY2stPmhvbGR0aW1lX3N0YW1wID0gbG9ja3N0YXRfY2xvY2soKTsKICNlbmRpZgogCi0JaWYgKGNoZWNrID09IDIgJiYgIW1hcmtfaXJxZmxhZ3MoY3VyciwgaGxvY2spKQorCWlmIChjaGVjayAmJiAhbWFya19pcnFmbGFncyhjdXJyLCBobG9jaykpCiAJCXJldHVybiAwOwogCiAJLyogbWFyayBpdCBhcyB1c2VkOiAqLwpAQCAtNDE5MSw3ICs0MTg4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX3Nob3dfaGVsZF9sb2Nrcyk7CiAKLXZvaWQgbG9ja2RlcF9zeXNfZXhpdCh2b2lkKQorYXNtbGlua2FnZSB2b2lkIGxvY2tkZXBfc3lzX2V4aXQodm9pZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9sb2NrdG9ydHVyZS5jIGIva2VybmVsL2xvY2tpbmcvbG9ja3RvcnR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZiMWExCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2xvY2tpbmcvbG9ja3RvcnR1cmUuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIE1vZHVsZS1iYXNlZCB0b3J0dXJlIHRlc3QgZmFjaWxpdHkgZm9yIGxvY2tpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxNAorICoKKyAqIEF1dGhvcjogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPgorICoJQmFzZWQgb24ga2VybmVsL3JjdS90b3J0dXJlLmMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90b3J0dXJlLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4iKTsKKwordG9ydHVyZV9wYXJhbShpbnQsIG53cml0ZXJzX3N0cmVzcywgLTEsCisJICAgICAiTnVtYmVyIG9mIHdyaXRlLWxvY2tpbmcgc3RyZXNzLXRlc3QgdGhyZWFkcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIG9ub2ZmX2hvbGRvZmYsIDAsICJUaW1lIGFmdGVyIGJvb3QgYmVmb3JlIENQVSBob3RwbHVncyAocykiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBvbm9mZl9pbnRlcnZhbCwgMCwKKwkgICAgICJUaW1lIGJldHdlZW4gQ1BVIGhvdHBsdWdzIChzKSwgMD1kaXNhYmxlIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc2h1ZmZsZV9pbnRlcnZhbCwgMywKKwkgICAgICJOdW1iZXIgb2YgamlmZmllcyBiZXR3ZWVuIHNodWZmbGVzLCAwPWRpc2FibGUiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBzaHV0ZG93bl9zZWNzLCAwLCAiU2h1dGRvd24gdGltZSAoaiksIDw9IHplcm8gdG8gZGlzYWJsZS4iKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBzdGF0X2ludGVydmFsLCA2MCwKKwkgICAgICJOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHN0YXRzIHByaW50aygpcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIHN0dXR0ZXIsIDUsICJOdW1iZXIgb2YgamlmZmllcyB0byBydW4vaGFsdCB0ZXN0LCAwPWRpc2FibGUiKTsKK3RvcnR1cmVfcGFyYW0oYm9vbCwgdmVyYm9zZSwgdHJ1ZSwKKwkgICAgICJFbmFibGUgdmVyYm9zZSBkZWJ1Z2dpbmcgcHJpbnRrKClzIik7CisKK3N0YXRpYyBjaGFyICp0b3J0dXJlX3R5cGUgPSAic3Bpbl9sb2NrIjsKK21vZHVsZV9wYXJhbSh0b3J0dXJlX3R5cGUsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModG9ydHVyZV90eXBlLAorCQkgIlR5cGUgb2YgbG9jayB0byB0b3J0dXJlIChzcGluX2xvY2ssIHNwaW5fbG9ja19pcnEsIC4uLikiKTsKKworc3RhdGljIGF0b21pY190IG5fbG9ja190b3J0dXJlX2Vycm9yczsKKworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3RhdHNfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKip3cml0ZXJfdGFza3M7CisKK3N0YXRpYyBpbnQgbnJlYWx3cml0ZXJzX3N0cmVzczsKK3N0YXRpYyBib29sIGxvY2tfaXNfd3JpdGVfaGVsZDsKKworc3RydWN0IGxvY2tfd3JpdGVyX3N0cmVzc19zdGF0cyB7CisJbG9uZyBuX3dyaXRlX2xvY2tfZmFpbDsKKwlsb25nIG5fd3JpdGVfbG9ja19hY3F1aXJlZDsKK307CitzdGF0aWMgc3RydWN0IGxvY2tfd3JpdGVyX3N0cmVzc19zdGF0cyAqbHdzYTsKKworI2lmIGRlZmluZWQoTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19MT0NLX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSkKKyNkZWZpbmUgTE9DS1RPUlRVUkVfUlVOTkFCTEVfSU5JVCAxCisjZWxzZQorI2RlZmluZSBMT0NLVE9SVFVSRV9SVU5OQUJMRV9JTklUIDAKKyNlbmRpZgoraW50IGxvY2t0b3J0dXJlX3J1bm5hYmxlID0gTE9DS1RPUlRVUkVfUlVOTkFCTEVfSU5JVDsKK21vZHVsZV9wYXJhbShsb2NrdG9ydHVyZV9ydW5uYWJsZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9ja3RvcnR1cmVfcnVubmFibGUsICJTdGFydCBsb2NrdG9ydHVyZSBhdCBib290Iik7CisKKy8qIEZvcndhcmQgcmVmZXJlbmNlLiAqLworc3RhdGljIHZvaWQgbG9ja190b3J0dXJlX2NsZWFudXAodm9pZCk7CisKKy8qCisgKiBPcGVyYXRpb25zIHZlY3RvciBmb3Igc2VsZWN0aW5nIGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cy4KKyAqLworc3RydWN0IGxvY2tfdG9ydHVyZV9vcHMgeworCXZvaWQgKCppbml0KSh2b2lkKTsKKwlpbnQgKCp3cml0ZWxvY2spKHZvaWQpOworCXZvaWQgKCp3cml0ZV9kZWxheSkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKTsKKwl2b2lkICgqd3JpdGV1bmxvY2spKHZvaWQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyAqY3VyX29wczsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBsb2NrIHRvcnR1cmUgdGVzdGluZy4KKyAqLworCitzdGF0aWMgaW50IHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfbG9jayh2b2lkKQoreworCXJldHVybiAwOyAgLyogQlVHR1ksIGRvIG5vdCB1c2UgaW4gcmVhbCBsaWZlISEhICovCit9CisKK3N0YXRpYyB2b2lkIHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZ2RlbGF5X3VzID0gMTAwOworCisJLyogV2Ugd2FudCBhIGxvbmcgZGVsYXkgb2NjYXNpb25hbGx5IHRvIGZvcmNlIG1hc3NpdmUgY29udGVudGlvbi4gICovCisJaWYgKCEodG9ydHVyZV9yYW5kb20odHJzcCkgJQorCSAgICAgIChucmVhbHdyaXRlcnNfc3RyZXNzICogMjAwMCAqIGxvbmdkZWxheV91cykpKQorCQltZGVsYXkobG9uZ2RlbGF5X3VzKTsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCWlmICghKHRvcnR1cmVfcmFuZG9tKHRyc3ApICUgKG5yZWFsd3JpdGVyc19zdHJlc3MgKiAyMDAwMCkpKQorCQlwcmVlbXB0X3NjaGVkdWxlKCk7ICAvKiBBbGxvdyB0ZXN0IHRvIGJlIHByZWVtcHRlZC4gKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0b3J0dXJlX2xvY2tfYnVzdGVkX3dyaXRlX3VubG9jayh2b2lkKQoreworCSAgLyogQlVHR1ksIGRvIG5vdCB1c2UgaW4gcmVhbCBsaWZlISEhICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyBsb2NrX2J1c3RlZF9vcHMgPSB7CisJLndyaXRlbG9jawk9IHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfbG9jaywKKwkud3JpdGVfZGVsYXkJPSB0b3J0dXJlX2xvY2tfYnVzdGVkX3dyaXRlX2RlbGF5LAorCS53cml0ZXVubG9jawk9IHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfdW5sb2NrLAorCS5uYW1lCQk9ICJsb2NrX2J1c3RlZCIKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodG9ydHVyZV9zcGlubG9jayk7CisKK3N0YXRpYyBpbnQgdG9ydHVyZV9zcGluX2xvY2tfd3JpdGVfbG9jayh2b2lkKSBfX2FjcXVpcmVzKHRvcnR1cmVfc3BpbmxvY2spCit7CisJc3Bpbl9sb2NrKCZ0b3J0dXJlX3NwaW5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG9ydHVyZV9zcGluX2xvY2tfd3JpdGVfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hvcnRkZWxheV91cyA9IDI7CisJY29uc3QgdW5zaWduZWQgbG9uZyBsb25nZGVsYXlfdXMgPSAxMDA7CisKKwkvKiBXZSB3YW50IGEgc2hvcnQgZGVsYXkgbW9zdGx5IHRvIGVtdWxhdGUgbGlrZWx5IGNvZGUsIGFuZAorCSAqIHdlIHdhbnQgYSBsb25nIGRlbGF5IG9jY2FzaW9uYWxseSB0byBmb3JjZSBtYXNzaXZlIGNvbnRlbnRpb24uCisJICovCisJaWYgKCEodG9ydHVyZV9yYW5kb20odHJzcCkgJQorCSAgICAgIChucmVhbHdyaXRlcnNfc3RyZXNzICogMjAwMCAqIGxvbmdkZWxheV91cykpKQorCQltZGVsYXkobG9uZ2RlbGF5X3VzKTsKKwlpZiAoISh0b3J0dXJlX3JhbmRvbSh0cnNwKSAlCisJICAgICAgKG5yZWFsd3JpdGVyc19zdHJlc3MgKiAyICogc2hvcnRkZWxheV91cykpKQorCQl1ZGVsYXkoc2hvcnRkZWxheV91cyk7CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlpZiAoISh0b3J0dXJlX3JhbmRvbSh0cnNwKSAlIChucmVhbHdyaXRlcnNfc3RyZXNzICogMjAwMDApKSkKKwkJcHJlZW1wdF9zY2hlZHVsZSgpOyAgLyogQWxsb3cgdGVzdCB0byBiZSBwcmVlbXB0ZWQuICovCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdG9ydHVyZV9zcGluX2xvY2tfd3JpdGVfdW5sb2NrKHZvaWQpIF9fcmVsZWFzZXModG9ydHVyZV9zcGlubG9jaykKK3sKKwlzcGluX3VubG9jaygmdG9ydHVyZV9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyBzcGluX2xvY2tfb3BzID0geworCS53cml0ZWxvY2sJPSB0b3J0dXJlX3NwaW5fbG9ja193cml0ZV9sb2NrLAorCS53cml0ZV9kZWxheQk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX2RlbGF5LAorCS53cml0ZXVubG9jawk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX3VubG9jaywKKwkubmFtZQkJPSAic3Bpbl9sb2NrIgorfTsKKworc3RhdGljIGludCB0b3J0dXJlX3NwaW5fbG9ja193cml0ZV9sb2NrX2lycSh2b2lkKQorX19hY3F1aXJlcyh0b3J0dXJlX3NwaW5sb2NrX2lycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRvcnR1cmVfc3BpbmxvY2ssIGZsYWdzKTsKKwljdXJfb3BzLT5mbGFncyA9IGZsYWdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0b3J0dXJlX2xvY2tfc3Bpbl93cml0ZV91bmxvY2tfaXJxKHZvaWQpCitfX3JlbGVhc2VzKHRvcnR1cmVfc3BpbmxvY2spCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG9ydHVyZV9zcGlubG9jaywgY3VyX29wcy0+ZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfdG9ydHVyZV9vcHMgc3Bpbl9sb2NrX2lycV9vcHMgPSB7CisJLndyaXRlbG9jawk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX2xvY2tfaXJxLAorCS53cml0ZV9kZWxheQk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX2RlbGF5LAorCS53cml0ZXVubG9jawk9IHRvcnR1cmVfbG9ja19zcGluX3dyaXRlX3VubG9ja19pcnEsCisJLm5hbWUJCT0gInNwaW5fbG9ja19pcnEiCit9OworCisvKgorICogTG9jayB0b3J0dXJlIHdyaXRlciBrdGhyZWFkLiAgUmVwZWF0ZWRseSBhY3F1aXJlcyBhbmQgcmVsZWFzZXMKKyAqIHRoZSBsb2NrLCBjaGVja2luZyBmb3IgZHVwbGljYXRlIGFjcXVpc2l0aW9ucy4KKyAqLworc3RhdGljIGludCBsb2NrX3RvcnR1cmVfd3JpdGVyKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbG9ja193cml0ZXJfc3RyZXNzX3N0YXRzICpsd3NwID0gYXJnOworCXN0YXRpYyBERUZJTkVfVE9SVFVSRV9SQU5ET00ocmFuZCk7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoImxvY2tfdG9ydHVyZV93cml0ZXIgdGFzayBzdGFydGVkIik7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7CisKKwlkbyB7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQljdXJfb3BzLT53cml0ZWxvY2soKTsKKwkJaWYgKFdBUk5fT05fT05DRShsb2NrX2lzX3dyaXRlX2hlbGQpKQorCQkJbHdzcC0+bl93cml0ZV9sb2NrX2ZhaWwrKzsKKwkJbG9ja19pc193cml0ZV9oZWxkID0gMTsKKwkJbHdzcC0+bl93cml0ZV9sb2NrX2FjcXVpcmVkKys7CisJCWN1cl9vcHMtPndyaXRlX2RlbGF5KCZyYW5kKTsKKwkJbG9ja19pc193cml0ZV9oZWxkID0gMDsKKwkJY3VyX29wcy0+d3JpdGV1bmxvY2soKTsKKwkJc3R1dHRlcl93YWl0KCJsb2NrX3RvcnR1cmVfd3JpdGVyIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygibG9ja190b3J0dXJlX3dyaXRlciIpOworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGFuIGxvY2stdG9ydHVyZS1zdGF0aXN0aWNzIG1lc3NhZ2UgaW4gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tfdG9ydHVyZV9wcmludGsoY2hhciAqcGFnZSkKK3sKKwlib29sIGZhaWwgPSAwOworCWludCBpOworCWxvbmcgbWF4ID0gMDsKKwlsb25nIG1pbiA9IGx3c2FbMF0ubl93cml0ZV9sb2NrX2FjcXVpcmVkOworCWxvbmcgbG9uZyBzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5yZWFsd3JpdGVyc19zdHJlc3M7IGkrKykgeworCQlpZiAobHdzYVtpXS5uX3dyaXRlX2xvY2tfZmFpbCkKKwkJCWZhaWwgPSB0cnVlOworCQlzdW0gKz0gbHdzYVtpXS5uX3dyaXRlX2xvY2tfYWNxdWlyZWQ7CisJCWlmIChtYXggPCBsd3NhW2ldLm5fd3JpdGVfbG9ja19mYWlsKQorCQkJbWF4ID0gbHdzYVtpXS5uX3dyaXRlX2xvY2tfZmFpbDsKKwkJaWYgKG1pbiA+IGx3c2FbaV0ubl93cml0ZV9sb2NrX2ZhaWwpCisJCQltaW4gPSBsd3NhW2ldLm5fd3JpdGVfbG9ja19mYWlsOworCX0KKwlwYWdlICs9IHNwcmludGYocGFnZSwgIiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLAorCQkJIldyaXRlczogIFRvdGFsOiAlbGxkICBNYXgvTWluOiAlbGQvJWxkICVzICBGYWlsOiAlZCAlc1xuIiwKKwkJCXN1bSwgbWF4LCBtaW4sIG1heCAvIDIgPiBtaW4gPyAiPz8/IiA6ICIiLAorCQkJZmFpbCwgZmFpbCA/ICIhISEiIDogIiIpOworCWlmIChmYWlsKQorCQlhdG9taWNfaW5jKCZuX2xvY2tfdG9ydHVyZV9lcnJvcnMpOworfQorCisvKgorICogUHJpbnQgdG9ydHVyZSBzdGF0aXN0aWNzLiAgQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUKKyAqIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBhdCBhIGdpdmVuIHRpbWUhISEgIFRoaXMgaXMgbm9ybWFsbHkgYWNjb21wbGlzaGVkCisgKiBieSByZWx5aW5nIG9uIHRoZSBtb2R1bGUgc3lzdGVtIHRvIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgbW9kdWxlCisgKiBsb2FkZWQsIGFuZCB0aGVuIGJ5IGdpdmluZyB0aGUgbG9ja190b3J0dXJlX3N0YXRzIGt0aHJlYWQgZnVsbCBjb250cm9sCisgKiAob3IgdGhlIGluaXQvY2xlYW51cCBmdW5jdGlvbnMgd2hlbiBsb2NrX3RvcnR1cmVfc3RhdHMgdGhyZWFkIGlzIG5vdAorICogcnVubmluZykuCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tfdG9ydHVyZV9zdGF0c19wcmludCh2b2lkKQoreworCWludCBzaXplID0gbnJlYWx3cml0ZXJzX3N0cmVzcyAqIDIwMCArIDgxOTI7CisJY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9lcnIoImxvY2tfdG9ydHVyZV9zdGF0c19wcmludDogT3V0IG9mIG1lbW9yeSwgbmVlZDogJWQiLAorCQkgICAgICAgc2l6ZSk7CisJCXJldHVybjsKKwl9CisJbG9ja190b3J0dXJlX3ByaW50ayhidWYpOworCXByX2FsZXJ0KCIlcyIsIGJ1Zik7CisJa2ZyZWUoYnVmKTsKK30KKworLyoKKyAqIFBlcmlvZGljYWxseSBwcmludHMgdG9ydHVyZSBzdGF0aXN0aWNzLCBpZiBwZXJpb2RpYyBzdGF0aXN0aWNzIHByaW50aW5nCisgKiB3YXMgc3BlY2lmaWVkIHZpYSB0aGUgc3RhdF9pbnRlcnZhbCBtb2R1bGUgcGFyYW1ldGVyLgorICoKKyAqIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgZnVsbHN0b3AgaGVyZSwgc2luY2UgdGhpcyBvbmUgZG9lc24ndCByZWZlcmVuY2UKKyAqIHZvbGF0aWxlIHN0YXRlIG9yIHJlZ2lzdGVyIGNhbGxiYWNrcy4KKyAqLworc3RhdGljIGludCBsb2NrX3RvcnR1cmVfc3RhdHModm9pZCAqYXJnKQoreworCVZFUkJPU0VfVE9ST1VUX1NUUklORygibG9ja190b3J0dXJlX3N0YXRzIHRhc2sgc3RhcnRlZCIpOworCWRvIHsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7CisJCWxvY2tfdG9ydHVyZV9zdGF0c19wcmludCgpOworCQl0b3J0dXJlX3NodXRkb3duX2Fic29yYigibG9ja190b3J0dXJlX3N0YXRzIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygibG9ja190b3J0dXJlX3N0YXRzIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbG9ja190b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyAqY3VyX29wcywKKwkJCQljb25zdCBjaGFyICp0YWcpCit7CisJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJICItLS0gJXM6IG53cml0ZXJzX3N0cmVzcz0lZCBzdGF0X2ludGVydmFsPSVkIHZlcmJvc2U9JWQgc2h1ZmZsZV9pbnRlcnZhbD0lZCBzdHV0dGVyPSVkIHNodXRkb3duX3NlY3M9JWQgb25vZmZfaW50ZXJ2YWw9JWQgb25vZmZfaG9sZG9mZj0lZFxuIiwKKwkJIHRvcnR1cmVfdHlwZSwgdGFnLCBucmVhbHdyaXRlcnNfc3RyZXNzLCBzdGF0X2ludGVydmFsLCB2ZXJib3NlLAorCQkgc2h1ZmZsZV9pbnRlcnZhbCwgc3R1dHRlciwgc2h1dGRvd25fc2VjcywKKwkJIG9ub2ZmX2ludGVydmFsLCBvbm9mZl9ob2xkb2ZmKTsKK30KKworc3RhdGljIHZvaWQgbG9ja190b3J0dXJlX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICh0b3J0dXJlX2NsZWFudXAoKSkKKwkJcmV0dXJuOworCisJaWYgKHdyaXRlcl90YXNrcykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnJlYWx3cml0ZXJzX3N0cmVzczsgaSsrKQorCQkJdG9ydHVyZV9zdG9wX2t0aHJlYWQobG9ja190b3J0dXJlX3dyaXRlciwKKwkJCQkJICAgICB3cml0ZXJfdGFza3NbaV0pOworCQlrZnJlZSh3cml0ZXJfdGFza3MpOworCQl3cml0ZXJfdGFza3MgPSBOVUxMOworCX0KKworCXRvcnR1cmVfc3RvcF9rdGhyZWFkKGxvY2tfdG9ydHVyZV9zdGF0cywgc3RhdHNfdGFzayk7CisJbG9ja190b3J0dXJlX3N0YXRzX3ByaW50KCk7ICAvKiAtQWZ0ZXItIHRoZSBzdGF0cyB0aHJlYWQgaXMgc3RvcHBlZCEgKi8KKworCWlmIChhdG9taWNfcmVhZCgmbl9sb2NrX3RvcnR1cmVfZXJyb3JzKSkKKwkJbG9ja190b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLAorCQkJCQkJIkVuZCBvZiB0ZXN0OiBGQUlMVVJFIik7CisJZWxzZSBpZiAodG9ydHVyZV9vbm9mZl9mYWlsdXJlcygpKQorCQlsb2NrX3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsCisJCQkJCQkiRW5kIG9mIHRlc3Q6IExPQ0tfSE9UUExVRyIpOworCWVsc2UKKwkJbG9ja190b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLAorCQkJCQkJIkVuZCBvZiB0ZXN0OiBTVUNDRVNTIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxvY2tfdG9ydHVyZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IGZpcnN0ZXJyID0gMDsKKwlzdGF0aWMgc3RydWN0IGxvY2tfdG9ydHVyZV9vcHMgKnRvcnR1cmVfb3BzW10gPSB7CisJCSZsb2NrX2J1c3RlZF9vcHMsICZzcGluX2xvY2tfb3BzLCAmc3Bpbl9sb2NrX2lycV9vcHMsCisJfTsKKworCXRvcnR1cmVfaW5pdF9iZWdpbih0b3J0dXJlX3R5cGUsIHZlcmJvc2UsICZsb2NrdG9ydHVyZV9ydW5uYWJsZSk7CisKKwkvKiBQcm9jZXNzIGFyZ3MgYW5kIHRlbGwgdGhlIHdvcmxkIHRoYXQgdGhlIHRvcnR1cmVyIGlzIG9uIHRoZSBqb2IuICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9ydHVyZV9vcHMpOyBpKyspIHsKKwkJY3VyX29wcyA9IHRvcnR1cmVfb3BzW2ldOworCQlpZiAoc3RyY21wKHRvcnR1cmVfdHlwZSwgY3VyX29wcy0+bmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKSkgeworCQlwcl9hbGVydCgibG9jay10b3J0dXJlOiBpbnZhbGlkIHRvcnR1cmUgdHlwZTogXCIlc1wiXG4iLAorCQkJIHRvcnR1cmVfdHlwZSk7CisJCXByX2FsZXJ0KCJsb2NrLXRvcnR1cmUgdHlwZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKQorCQkJcHJfYWxlcnQoIiAlcyIsIHRvcnR1cmVfb3BzW2ldLT5uYW1lKTsKKwkJcHJfYWxlcnQoIlxuIik7CisJCXRvcnR1cmVfaW5pdF9lbmQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjdXJfb3BzLT5pbml0KQorCQljdXJfb3BzLT5pbml0KCk7IC8qIG5vICJnb3RvIHVud2luZCIgcHJpb3IgdG8gdGhpcyBwb2ludCEhISAqLworCisJaWYgKG53cml0ZXJzX3N0cmVzcyA+PSAwKQorCQlucmVhbHdyaXRlcnNfc3RyZXNzID0gbndyaXRlcnNfc3RyZXNzOworCWVsc2UKKwkJbnJlYWx3cml0ZXJzX3N0cmVzcyA9IDIgKiBudW1fb25saW5lX2NwdXMoKTsKKwlsb2NrX3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsICJTdGFydCBvZiB0ZXN0Iik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdGF0aXN0aWNzIHNvIHRoYXQgZWFjaCBydW4gZ2V0cyBpdHMgb3duIG51bWJlcnMuICovCisKKwlsb2NrX2lzX3dyaXRlX2hlbGQgPSAwOworCWx3c2EgPSBrbWFsbG9jKHNpemVvZigqbHdzYSkgKiBucmVhbHdyaXRlcnNfc3RyZXNzLCBHRlBfS0VSTkVMKTsKKwlpZiAobHdzYSA9PSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX1NUUklORygibHdzYTogT3V0IG9mIG1lbW9yeSIpOworCQlmaXJzdGVyciA9IC1FTk9NRU07CisJCWdvdG8gdW53aW5kOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnJlYWx3cml0ZXJzX3N0cmVzczsgaSsrKSB7CisJCWx3c2FbaV0ubl93cml0ZV9sb2NrX2ZhaWwgPSAwOworCQlsd3NhW2ldLm5fd3JpdGVfbG9ja19hY3F1aXJlZCA9IDA7CisJfQorCisJLyogU3RhcnQgdXAgdGhlIGt0aHJlYWRzLiAqLworCisJaWYgKG9ub2ZmX2ludGVydmFsID4gMCkgeworCQlmaXJzdGVyciA9IHRvcnR1cmVfb25vZmZfaW5pdChvbm9mZl9ob2xkb2ZmICogSFosCisJCQkJCSAgICAgIG9ub2ZmX2ludGVydmFsICogSFopOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJaWYgKHNodWZmbGVfaW50ZXJ2YWwgPiAwKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9zaHVmZmxlX2luaXQoc2h1ZmZsZV9pbnRlcnZhbCk7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAoc2h1dGRvd25fc2VjcyA+IDApIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX3NodXRkb3duX2luaXQoc2h1dGRvd25fc2VjcywKKwkJCQkJCSBsb2NrX3RvcnR1cmVfY2xlYW51cCk7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAoc3R1dHRlciA+IDApIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX3N0dXR0ZXJfaW5pdChzdHV0dGVyKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCisJd3JpdGVyX3Rhc2tzID0ga3phbGxvYyhucmVhbHdyaXRlcnNfc3RyZXNzICogc2l6ZW9mKHdyaXRlcl90YXNrc1swXSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHdyaXRlcl90YXNrcyA9PSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX0VSUlNUUklORygid3JpdGVyX3Rhc2tzOiBPdXQgb2YgbWVtb3J5Iik7CisJCWZpcnN0ZXJyID0gLUVOT01FTTsKKwkJZ290byB1bndpbmQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBucmVhbHdyaXRlcnNfc3RyZXNzOyBpKyspIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKGxvY2tfdG9ydHVyZV93cml0ZXIsICZsd3NhW2ldLAorCQkJCQkJICB3cml0ZXJfdGFza3NbaV0pOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJaWYgKHN0YXRfaW50ZXJ2YWwgPiAwKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9jcmVhdGVfa3RocmVhZChsb2NrX3RvcnR1cmVfc3RhdHMsIE5VTEwsCisJCQkJCQkgIHN0YXRzX3Rhc2spOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJdG9ydHVyZV9pbml0X2VuZCgpOworCXJldHVybiAwOworCit1bndpbmQ6CisJdG9ydHVyZV9pbml0X2VuZCgpOworCWxvY2tfdG9ydHVyZV9jbGVhbnVwKCk7CisJcmV0dXJuIGZpcnN0ZXJyOworfQorCittb2R1bGVfaW5pdChsb2NrX3RvcnR1cmVfaW5pdCk7Cittb2R1bGVfZXhpdChsb2NrX3RvcnR1cmVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suYyBiL2tlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGRjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suYwpAQCAtMCwwICsxLDE3OCBAQAorCisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgIm1jc19zcGlubG9jay5oIgorCisjaWZkZWYgQ09ORklHX1NNUAorCisvKgorICogQW4gTUNTIGxpa2UgbG9jayBlc3BlY2lhbGx5IHRhaWxvcmVkIGZvciBvcHRpbWlzdGljIHNwaW5uaW5nIGZvciBzbGVlcGluZworICogbG9jayBpbXBsZW1lbnRhdGlvbnMgKG11dGV4LCByd3NlbSwgZXRjKS4KKyAqCisgKiBVc2luZyBhIHNpbmdsZSBtY3Mgbm9kZSBwZXIgQ1BVIGlzIHNhZmUgYmVjYXVzZSBzbGVlcGluZyBsb2NrcyBzaG91bGQgbm90IGJlCisgKiBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhbmQgd2UgaGF2ZSBwcmVlbXB0aW9uIGRpc2FibGVkIHdoaWxlCisgKiBzcGlubmluZy4KKyAqLworc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUsIG9zcV9ub2RlKTsKKworLyoKKyAqIEdldCBhIHN0YWJsZSBAbm9kZS0+bmV4dCBwb2ludGVyLCBlaXRoZXIgZm9yIHVubG9jaygpIG9yIHVucXVldWUoKSBwdXJwb3Nlcy4KKyAqIENhbiByZXR1cm4gTlVMTCBpbiBjYXNlIHdlIHdlcmUgdGhlIGxhc3QgcXVldWVkIGFuZCB3ZSB1cGRhdGVkIEBsb2NrIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqCitvc3Ffd2FpdF9uZXh0KHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKipsb2NrLAorCSAgICAgIHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKm5vZGUsCisJICAgICAgc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqcHJldikKK3sKKwlzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICpuZXh0ID0gTlVMTDsKKworCWZvciAoOzspIHsKKwkJaWYgKCpsb2NrID09IG5vZGUgJiYgY21weGNoZyhsb2NrLCBub2RlLCBwcmV2KSA9PSBub2RlKSB7CisJCQkvKgorCQkJICogV2Ugd2VyZSB0aGUgbGFzdCBxdWV1ZWQsIHdlIG1vdmVkIEBsb2NrIGJhY2suIEBwcmV2CisJCQkgKiB3aWxsIG5vdyBvYnNlcnZlIEBsb2NrIGFuZCB3aWxsIGNvbXBsZXRlIGl0cworCQkJICogdW5sb2NrKCkvdW5xdWV1ZSgpLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFdlIG11c3QgeGNoZygpIHRoZSBAbm9kZS0+bmV4dCB2YWx1ZSwgYmVjYXVzZSBpZiB3ZSB3ZXJlIHRvCisJCSAqIGxlYXZlIGl0IGluLCBhIGNvbmN1cnJlbnQgdW5sb2NrKCkvdW5xdWV1ZSgpIGZyb20KKwkJICogQG5vZGUtPm5leHQgbWlnaHQgY29tcGxldGUgU3RlcC1BIGFuZCB0aGluayBpdHMgQHByZXYgaXMKKwkJICogc3RpbGwgdmFsaWQuCisJCSAqCisJCSAqIElmIHRoZSBjb25jdXJyZW50IHVubG9jaygpL3VucXVldWUoKSB3aW5zIHRoZSByYWNlLCB3ZSdsbAorCQkgKiB3YWl0IGZvciBlaXRoZXIgQGxvY2sgdG8gcG9pbnQgdG8gdXMsIHRocm91Z2ggaXRzIFN0ZXAtQiwgb3IKKwkJICogd2FpdCBmb3IgYSBuZXcgQG5vZGUtPm5leHQgZnJvbSBpdHMgU3RlcC1DLgorCQkgKi8KKwkJaWYgKG5vZGUtPm5leHQpIHsKKwkJCW5leHQgPSB4Y2hnKCZub2RlLT5uZXh0LCBOVUxMKTsKKwkJCWlmIChuZXh0KQorCQkJCWJyZWFrOworCQl9CisKKwkJYXJjaF9tdXRleF9jcHVfcmVsYXgoKTsKKwl9CisKKwlyZXR1cm4gbmV4dDsKK30KKworYm9vbCBvc3FfbG9jayhzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICoqbG9jaykKK3sKKwlzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICpub2RlID0gdGhpc19jcHVfcHRyKCZvc3Ffbm9kZSk7CisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqcHJldiwgKm5leHQ7CisKKwlub2RlLT5sb2NrZWQgPSAwOworCW5vZGUtPm5leHQgPSBOVUxMOworCisJbm9kZS0+cHJldiA9IHByZXYgPSB4Y2hnKGxvY2ssIG5vZGUpOworCWlmIChsaWtlbHkocHJldiA9PSBOVUxMKSkKKwkJcmV0dXJuIHRydWU7CisKKwlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7CisKKwkvKgorCSAqIE5vcm1hbGx5IEBwcmV2IGlzIHVudG91Y2hhYmxlIGFmdGVyIHRoZSBhYm92ZSBzdG9yZTsgYmVjYXVzZSBhdCB0aGF0CisJICogbW9tZW50IHVubG9jayBjYW4gcHJvY2VlZCBhbmQgd2lwZSB0aGUgbm9kZSBlbGVtZW50IGZyb20gc3RhY2suCisJICoKKwkgKiBIb3dldmVyLCBzaW5jZSBvdXIgbm9kZXMgYXJlIHN0YXRpYyBwZXItY3B1IHN0b3JhZ2UsIHdlJ3JlCisJICogZ3VhcmFudGVlZCB0aGVpciBleGlzdGVuY2UgLS0gdGhpcyBhbGxvd3MgdXMgdG8gYXBwbHkKKwkgKiBjbXB4Y2hnIGluIGFuIGF0dGVtcHQgdG8gdW5kbyBvdXIgcXVldWVpbmcuCisJICovCisKKwl3aGlsZSAoIXNtcF9sb2FkX2FjcXVpcmUoJm5vZGUtPmxvY2tlZCkpIHsKKwkJLyoKKwkJICogSWYgd2UgbmVlZCB0byByZXNjaGVkdWxlIGJhaWwuLi4gc28gd2UgY2FuIGJsb2NrLgorCQkgKi8KKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJZ290byB1bnF1ZXVlOworCisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiB0cnVlOworCit1bnF1ZXVlOgorCS8qCisJICogU3RlcCAtIEEgIC0tIHN0YWJpbGl6ZSBAcHJldgorCSAqCisJICogVW5kbyBvdXIgQHByZXYtPm5leHQgYXNzaWdubWVudDsgdGhpcyB3aWxsIG1ha2UgQHByZXYncworCSAqIHVubG9jaygpL3VucXVldWUoKSB3YWl0IGZvciBhIG5leHQgcG9pbnRlciBzaW5jZSBAbG9jayBwb2ludHMgdG8gdXMKKwkgKiAob3IgbGF0ZXIpLgorCSAqLworCisJZm9yICg7OykgeworCQlpZiAocHJldi0+bmV4dCA9PSBub2RlICYmCisJCSAgICBjbXB4Y2hnKCZwcmV2LT5uZXh0LCBub2RlLCBOVUxMKSA9PSBub2RlKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogV2UgY2FuIG9ubHkgZmFpbCB0aGUgY21weGNoZygpIHJhY2luZyBhZ2FpbnN0IGFuIHVubG9jaygpLAorCQkgKiBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBvYnNlcnZlIEBub2RlLT5sb2NrZWQgYmVjb21taW5nCisJCSAqIHRydWUuCisJCSAqLworCQlpZiAoc21wX2xvYWRfYWNxdWlyZSgmbm9kZS0+bG9ja2VkKSkKKwkJCXJldHVybiB0cnVlOworCisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CisKKwkJLyoKKwkJICogT3Igd2UgcmFjZSBhZ2FpbnN0IGEgY29uY3VycmVudCB1bnF1ZXVlKCkncyBzdGVwLUIsIGluIHdoaWNoCisJCSAqIGNhc2UgaXRzIHN0ZXAtQyB3aWxsIHdyaXRlIHVzIGEgbmV3IEBub2RlLT5wcmV2IHBvaW50ZXIuCisJCSAqLworCQlwcmV2ID0gQUNDRVNTX09OQ0Uobm9kZS0+cHJldik7CisJfQorCisJLyoKKwkgKiBTdGVwIC0gQiAtLSBzdGFiaWxpemUgQG5leHQKKwkgKgorCSAqIFNpbWlsYXIgdG8gdW5sb2NrKCksIHdhaXQgZm9yIEBub2RlLT5uZXh0IG9yIG1vdmUgQGxvY2sgZnJvbSBAbm9kZQorCSAqIGJhY2sgdG8gQHByZXYuCisJICovCisKKwluZXh0ID0gb3NxX3dhaXRfbmV4dChsb2NrLCBub2RlLCBwcmV2KTsKKwlpZiAoIW5leHQpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogU3RlcCAtIEMgLS0gdW5saW5rCisJICoKKwkgKiBAcHJldiBpcyBzdGFibGUgYmVjYXVzZSBpdHMgc3RpbGwgd2FpdGluZyBmb3IgYSBuZXcgQHByZXYtPm5leHQKKwkgKiBwb2ludGVyLCBAbmV4dCBpcyBzdGFibGUgYmVjYXVzZSBvdXIgQG5vZGUtPm5leHQgcG9pbnRlciBpcyBOVUxMIGFuZAorCSAqIGl0IHdpbGwgd2FpdCBpbiBTdGVwLUEuCisJICovCisKKwlBQ0NFU1NfT05DRShuZXh0LT5wcmV2KSA9IHByZXY7CisJQUNDRVNTX09OQ0UocHJldi0+bmV4dCkgPSBuZXh0OworCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIG9zcV91bmxvY2soc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqKmxvY2spCit7CisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqbm9kZSA9IHRoaXNfY3B1X3B0cigmb3NxX25vZGUpOworCXN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKm5leHQ7CisKKwkvKgorCSAqIEZhc3QgcGF0aCBmb3IgdGhlIHVuY29udGVuZGVkIGNhc2UuCisJICovCisJaWYgKGxpa2VseShjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNlY29uZCBtb3N0IGxpa2VseSBjYXNlLgorCSAqLworCW5leHQgPSB4Y2hnKCZub2RlLT5uZXh0LCBOVUxMKTsKKwlpZiAobmV4dCkgeworCQlBQ0NFU1NfT05DRShuZXh0LT5sb2NrZWQpID0gMTsKKwkJcmV0dXJuOworCX0KKworCW5leHQgPSBvc3Ffd2FpdF9uZXh0KGxvY2ssIG5vZGUsIE5VTEwpOworCWlmIChuZXh0KQorCQlBQ0NFU1NfT05DRShuZXh0LT5sb2NrZWQpID0gMTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5oIGIva2VybmVsL2xvY2tpbmcvbWNzX3NwaW5sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkYmFjNAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTUNTIGxvY2sgZGVmaW5lcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZSBhbmQgQVBJIGRlZmluaXRpb25zIG9mIE1DUyBsb2NrLgorICoKKyAqIFRoZSBNQ1MgbG9jayAocHJvcG9zZWQgYnkgTWVsbG9yLUNydW1tZXkgYW5kIFNjb3R0KSBpcyBhIHNpbXBsZSBzcGluLWxvY2sKKyAqIHdpdGggdGhlIGRlc2lyYWJsZSBwcm9wZXJ0aWVzIG9mIGJlaW5nIGZhaXIsIGFuZCB3aXRoIGVhY2ggY3B1IHRyeWluZworICogdG8gYWNxdWlyZSB0aGUgbG9jayBzcGlubmluZyBvbiBhIGxvY2FsIHZhcmlhYmxlLgorICogSXQgYXZvaWRzIGV4cGVuc2l2ZSBjYWNoZSBib3VuY2luZ3MgdGhhdCBjb21tb24gdGVzdC1hbmQtc2V0IHNwaW4tbG9jaworICogaW1wbGVtZW50YXRpb25zIGluY3VyLgorICovCisjaWZuZGVmIF9fTElOVVhfTUNTX1NQSU5MT0NLX0gKKyNkZWZpbmUgX19MSU5VWF9NQ1NfU1BJTkxPQ0tfSAorCisjaW5jbHVkZSA8YXNtL21jc19zcGlubG9jay5oPgorCitzdHJ1Y3QgbWNzX3NwaW5sb2NrIHsKKwlzdHJ1Y3QgbWNzX3NwaW5sb2NrICpuZXh0OworCWludCBsb2NrZWQ7IC8qIDEgaWYgbG9jayBhY3F1aXJlZCAqLworfTsKKworI2lmbmRlZiBhcmNoX21jc19zcGluX2xvY2tfY29udGVuZGVkCisvKgorICogVXNpbmcgc21wX2xvYWRfYWNxdWlyZSgpIHByb3ZpZGVzIGEgbWVtb3J5IGJhcnJpZXIgdGhhdCBlbnN1cmVzCisgKiBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgaGFwcGVuIGFmdGVyIHRoZSBsb2NrIGlzIGFjcXVpcmVkLgorICovCisjZGVmaW5lIGFyY2hfbWNzX3NwaW5fbG9ja19jb250ZW5kZWQobCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJd2hpbGUgKCEoc21wX2xvYWRfYWNxdWlyZShsKSkpCQkJCQlcCisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgYXJjaF9tY3Nfc3Bpbl91bmxvY2tfY29udGVuZGVkCisvKgorICogc21wX3N0b3JlX3JlbGVhc2UoKSBwcm92aWRlcyBhIG1lbW9yeSBiYXJyaWVyIHRvIGVuc3VyZSBhbGwKKyAqIG9wZXJhdGlvbnMgaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZQorICogdW5sb2NraW5nLgorICovCisjZGVmaW5lIGFyY2hfbWNzX3NwaW5fdW5sb2NrX2NvbnRlbmRlZChsKQkJCQlcCisJc21wX3N0b3JlX3JlbGVhc2UoKGwpLCAxKQorI2VuZGlmCisKKy8qCisgKiBOb3RlOiB0aGUgc21wX2xvYWRfYWNxdWlyZS9zbXBfc3RvcmVfcmVsZWFzZSBwYWlyIGlzIG5vdAorICogc3VmZmljaWVudCB0byBmb3JtIGEgZnVsbCBtZW1vcnkgYmFycmllciBhY3Jvc3MKKyAqIGNwdXMgZm9yIG1hbnkgYXJjaGl0ZWN0dXJlcyAoZXhjZXB0IHg4NikgZm9yIG1jc191bmxvY2sgYW5kIG1jc19sb2NrLgorICogRm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgYSBmdWxsIGJhcnJpZXIgYWNyb3NzIG11bHRpcGxlIGNwdXMKKyAqIHdpdGggbWNzX3VubG9jayBhbmQgbWNzX2xvY2sgcGFpciwgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpIHNob3VsZCBiZQorICogdXNlZCBhZnRlciBtY3NfbG9jay4KKyAqLworCisvKgorICogSW4gb3JkZXIgdG8gYWNxdWlyZSB0aGUgbG9jaywgdGhlIGNhbGxlciBzaG91bGQgZGVjbGFyZSBhIGxvY2FsIG5vZGUgYW5kCisgKiBwYXNzIGEgcmVmZXJlbmNlIG9mIHRoZSBub2RlIHRvIHRoaXMgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIGxvY2suCisgKiBJZiB0aGUgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGFjcXVpcmVkLCB0aGVuIHRoaXMgd2lsbCBwcm9jZWVkIHRvIHNwaW4KKyAqIG9uIHRoaXMgbm9kZS0+bG9ja2VkIHVudGlsIHRoZSBwcmV2aW91cyBsb2NrIGhvbGRlciBzZXRzIHRoZSBub2RlLT5sb2NrZWQKKyAqIGluIG1jc19zcGluX3VubG9jaygpLgorICoKKyAqIFdlIGRvbid0IGlubGluZSBtY3Nfc3Bpbl9sb2NrKCkgc28gdGhhdCBwZXJmIGNhbiBjb3JyZWN0bHkgYWNjb3VudCBmb3IgdGhlCisgKiB0aW1lIHNwZW50IGluIHRoaXMgbG9jayBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBtY3Nfc3Bpbl9sb2NrKHN0cnVjdCBtY3Nfc3BpbmxvY2sgKipsb2NrLCBzdHJ1Y3QgbWNzX3NwaW5sb2NrICpub2RlKQoreworCXN0cnVjdCBtY3Nfc3BpbmxvY2sgKnByZXY7CisKKwkvKiBJbml0IG5vZGUgKi8KKwlub2RlLT5sb2NrZWQgPSAwOworCW5vZGUtPm5leHQgICA9IE5VTEw7CisKKwlwcmV2ID0geGNoZyhsb2NrLCBub2RlKTsKKwlpZiAobGlrZWx5KHByZXYgPT0gTlVMTCkpIHsKKwkJLyoKKwkJICogTG9jayBhY3F1aXJlZCwgZG9uJ3QgbmVlZCB0byBzZXQgbm9kZS0+bG9ja2VkIHRvIDEuIFRocmVhZHMKKwkJICogb25seSBzcGluIG9uIGl0cyBvd24gbm9kZS0+bG9ja2VkIHZhbHVlIGZvciBsb2NrIGFjcXVpc2l0aW9uLgorCQkgKiBIb3dldmVyLCBzaW5jZSB0aGlzIHRocmVhZCBjYW4gaW1tZWRpYXRlbHkgYWNxdWlyZSB0aGUgbG9jaworCQkgKiBhbmQgZG9lcyBub3QgcHJvY2VlZCB0byBzcGluIG9uIGl0cyBvd24gbm9kZS0+bG9ja2VkLCB0aGlzCisJCSAqIHZhbHVlIHdvbid0IGJlIHVzZWQuIElmIGEgZGVidWcgbW9kZSBpcyBuZWVkZWQgdG8KKwkJICogYXVkaXQgbG9jayBzdGF0dXMsIHRoZW4gc2V0IG5vZGUtPmxvY2tlZCB2YWx1ZSBoZXJlLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBsb2NrIGhvbGRlciBwYXNzZXMgdGhlIGxvY2sgZG93bi4gKi8KKwlhcmNoX21jc19zcGluX2xvY2tfY29udGVuZGVkKCZub2RlLT5sb2NrZWQpOworfQorCisvKgorICogUmVsZWFzZXMgdGhlIGxvY2suIFRoZSBjYWxsZXIgc2hvdWxkIHBhc3MgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB0aGF0CisgKiB3YXMgdXNlZCB0byBhY3F1aXJlIHRoZSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIG1jc19zcGluX3VubG9jayhzdHJ1Y3QgbWNzX3NwaW5sb2NrICoqbG9jaywgc3RydWN0IG1jc19zcGlubG9jayAqbm9kZSkKK3sKKwlzdHJ1Y3QgbWNzX3NwaW5sb2NrICpuZXh0ID0gQUNDRVNTX09OQ0Uobm9kZS0+bmV4dCk7CisKKwlpZiAobGlrZWx5KCFuZXh0KSkgeworCQkvKgorCQkgKiBSZWxlYXNlIHRoZSBsb2NrIGJ5IHNldHRpbmcgaXQgdG8gTlVMTAorCQkgKi8KKwkJaWYgKGxpa2VseShjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpKQorCQkJcmV0dXJuOworCQkvKiBXYWl0IHVudGlsIHRoZSBuZXh0IHBvaW50ZXIgaXMgc2V0ICovCisJCXdoaWxlICghKG5leHQgPSBBQ0NFU1NfT05DRShub2RlLT5uZXh0KSkpCisJCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOworCX0KKworCS8qIFBhc3MgbG9jayB0byBuZXh0IHdhaXRlci4gKi8KKwlhcmNoX21jc19zcGluX3VubG9ja19jb250ZW5kZWQoJm5leHQtPmxvY2tlZCk7Cit9CisKKy8qCisgKiBDYW5jZWxsYWJsZSB2ZXJzaW9uIG9mIHRoZSBNQ1MgbG9jayBhYm92ZS4KKyAqCisgKiBJbnRlbmRlZCBmb3IgYWRhcHRpdmUgc3Bpbm5pbmcgb2Ygc2xlZXBpbmcgbG9ja3M6CisgKiBtdXRleF9sb2NrKCkvcndzZW1fZG93bl97cmVhZCx3cml0ZX0oKSBldGMuCisgKi8KKworc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSB7CisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqbmV4dCwgKnByZXY7CisJaW50IGxvY2tlZDsgLyogMSBpZiBsb2NrIGFjcXVpcmVkICovCit9OworCitleHRlcm4gYm9vbCBvc3FfbG9jayhzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICoqbG9jayk7CitleHRlcm4gdm9pZCBvc3FfdW5sb2NrKHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKipsb2NrKTsKKworI2VuZGlmIC8qIF9fTElOVVhfTUNTX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL211dGV4LWRlYnVnLmMgYi9rZXJuZWwvbG9ja2luZy9tdXRleC1kZWJ1Zy5jCmluZGV4IGZhZjZmNWIuLmUxMTkxYzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL211dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL2xvY2tpbmcvbXV0ZXgtZGVidWcuYwpAQCAtODMsNiArODMsMTIgQEAKIAogCURFQlVHX0xPQ0tTX1dBUk5fT04oIWxvY2stPndhaXRfbGlzdC5wcmV2ICYmICFsb2NrLT53YWl0X2xpc3QubmV4dCk7CiAJbXV0ZXhfY2xlYXJfb3duZXIobG9jayk7CisKKwkvKgorCSAqIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkgaXMgZXhwbGljaXRseSAwIGZvciBkZWJ1ZworCSAqIG11dGV4ZXMgc28gdGhhdCB3ZSBjYW4gZG8gaXQgaGVyZSBhZnRlciB3ZSd2ZSB2ZXJpZmllZCBzdGF0ZS4KKwkgKi8KKwlhdG9taWNfc2V0KCZsb2NrLT5jb3VudCwgMSk7CiB9CiAKIHZvaWQgZGVidWdfbXV0ZXhfaW5pdChzdHJ1Y3QgbXV0ZXggKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9tdXRleC5jIGIva2VybmVsL2xvY2tpbmcvbXV0ZXguYwppbmRleCA0ZGQ2ZTRjLi5iYzczZDMzIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9tdXRleC5jCisrKyBiL2tlcm5lbC9sb2NraW5nL211dGV4LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CisjaW5jbHVkZSAibWNzX3NwaW5sb2NrLmgiCiAKIC8qCiAgKiBJbiB0aGUgREVCVUcgY2FzZSB3ZSBhcmUgdXNpbmcgdGhlICJOVUxMIGZhc3RwYXRoIiBmb3IgbXV0ZXhlcywKQEAgLTMzLDYgKzM0LDEzIEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKICMgaW5jbHVkZSAibXV0ZXgtZGVidWcuaCIKICMgaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtbnVsbC5oPgorLyoKKyAqIE11c3QgYmUgMCBmb3IgdGhlIGRlYnVnIGNhc2Ugc28gd2UgZG8gbm90IGRvIHRoZSB1bmxvY2sgb3V0c2lkZSBvZiB0aGUKKyAqIHdhaXRfbG9jayByZWdpb24uIGRlYnVnX211dGV4X3VubG9jaygpIHdpbGwgZG8gdGhlIGFjdHVhbCB1bmxvY2sgaW4gdGhpcworICogY2FzZS4KKyAqLworIyB1bmRlZiBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaworIyBkZWZpbmUgIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkJMAogI2Vsc2UKICMgaW5jbHVkZSAibXV0ZXguaCIKICMgaW5jbHVkZSA8YXNtL211dGV4Lmg+CkBAIC01Miw3ICs2MCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmxvY2stPndhaXRfbGlzdCk7CiAJbXV0ZXhfY2xlYXJfb3duZXIobG9jayk7CiAjaWZkZWYgQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVIKLQlsb2NrLT5zcGluX21sb2NrID0gTlVMTDsKKwlsb2NrLT5vc3EgPSBOVUxMOwogI2VuZGlmCiAKIAlkZWJ1Z19tdXRleF9pbml0KGxvY2ssIG5hbWUsIGtleSk7CkBAIC02Nyw4ICs3NSw3IEBACiAgKiBXZSBhbHNvIHB1dCB0aGUgZmFzdHBhdGggZmlyc3QgaW4gdGhlIGtlcm5lbCBpbWFnZSwgdG8gbWFrZSBzdXJlIHRoZQogICogYnJhbmNoIGlzIHByZWRpY3RlZCBieSB0aGUgQ1BVIGFzIGRlZmF1bHQtdW50YWtlbi4KICAqLwotc3RhdGljIF9fdXNlZCBub2lubGluZSB2b2lkIF9fc2NoZWQKLV9fbXV0ZXhfbG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CitfX3Zpc2libGUgdm9pZCBfX3NjaGVkIF9fbXV0ZXhfbG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CiAKIC8qKgogICogbXV0ZXhfbG9jayAtIGFjcXVpcmUgdGhlIG11dGV4CkBAIC0xMTEsNTQgKzExOCw3IEBACiAgKiBtb3JlIG9yIGxlc3Mgc2ltdWx0YW5lb3VzbHksIHRoZSBzcGlubmVycyBuZWVkIHRvIGFjcXVpcmUgYSBNQ1MgbG9jawogICogZmlyc3QgYmVmb3JlIHNwaW5uaW5nIG9uIHRoZSBvd25lciBmaWVsZC4KICAqCi0gKiBXZSBkb24ndCBpbmxpbmUgbXNwaW5fbG9jaygpIHNvIHRoYXQgcGVyZiBjYW4gY29ycmVjdGx5IGFjY291bnQgZm9yIHRoZQotICogdGltZSBzcGVudCBpbiB0aGlzIGxvY2sgZnVuY3Rpb24uCiAgKi8KLXN0cnVjdCBtc3Bpbl9ub2RlIHsKLQlzdHJ1Y3QgbXNwaW5fbm9kZSAqbmV4dCA7Ci0JaW50CQkgIGxvY2tlZDsJLyogMSBpZiBsb2NrIGFjcXVpcmVkICovCi19OwotI2RlZmluZQlNTE9DSyhtdXRleCkJKChzdHJ1Y3QgbXNwaW5fbm9kZSAqKikmKChtdXRleCktPnNwaW5fbWxvY2spKQotCi1zdGF0aWMgbm9pbmxpbmUKLXZvaWQgbXNwaW5fbG9jayhzdHJ1Y3QgbXNwaW5fbm9kZSAqKmxvY2ssIHN0cnVjdCBtc3Bpbl9ub2RlICpub2RlKQotewotCXN0cnVjdCBtc3Bpbl9ub2RlICpwcmV2OwotCi0JLyogSW5pdCBub2RlICovCi0Jbm9kZS0+bG9ja2VkID0gMDsKLQlub2RlLT5uZXh0ICAgPSBOVUxMOwotCi0JcHJldiA9IHhjaGcobG9jaywgbm9kZSk7Ci0JaWYgKGxpa2VseShwcmV2ID09IE5VTEwpKSB7Ci0JCS8qIExvY2sgYWNxdWlyZWQgKi8KLQkJbm9kZS0+bG9ja2VkID0gMTsKLQkJcmV0dXJuOwotCX0KLQlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7Ci0Jc21wX3dtYigpOwotCS8qIFdhaXQgdW50aWwgdGhlIGxvY2sgaG9sZGVyIHBhc3NlcyB0aGUgbG9jayBkb3duICovCi0Jd2hpbGUgKCFBQ0NFU1NfT05DRShub2RlLT5sb2NrZWQpKQotCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOwotfQotCi1zdGF0aWMgdm9pZCBtc3Bpbl91bmxvY2soc3RydWN0IG1zcGluX25vZGUgKipsb2NrLCBzdHJ1Y3QgbXNwaW5fbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgbXNwaW5fbm9kZSAqbmV4dCA9IEFDQ0VTU19PTkNFKG5vZGUtPm5leHQpOwotCi0JaWYgKGxpa2VseSghbmV4dCkpIHsKLQkJLyoKLQkJICogUmVsZWFzZSB0aGUgbG9jayBieSBzZXR0aW5nIGl0IHRvIE5VTEwKLQkJICovCi0JCWlmIChjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpCi0JCQlyZXR1cm47Ci0JCS8qIFdhaXQgdW50aWwgdGhlIG5leHQgcG9pbnRlciBpcyBzZXQgKi8KLQkJd2hpbGUgKCEobmV4dCA9IEFDQ0VTU19PTkNFKG5vZGUtPm5leHQpKSkKLQkJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7Ci0JfQotCUFDQ0VTU19PTkNFKG5leHQtPmxvY2tlZCkgPSAxOwotCXNtcF93bWIoKTsKLX0KIAogLyoKICAqIE11dGV4IHNwaW5uaW5nIGNvZGUgbWlncmF0ZWQgZnJvbSBrZXJuZWwvc2NoZWQvY29yZS5jCkBAIC0yMTIsNiArMTcyLDkgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOwogCWludCByZXR2YWwgPSAxOwogCisJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQlyZXR1cm4gMDsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAlvd25lciA9IEFDQ0VTU19PTkNFKGxvY2stPm93bmVyKTsKIAlpZiAob3duZXIpCkBAIC0yMjUsNyArMTg4LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgX191c2VkIG5vaW5saW5lIHZvaWQgX19zY2hlZCBfX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CitfX3Zpc2libGUgX191c2VkIG5vaW5saW5lCit2b2lkIF9fc2NoZWQgX19tdXRleF91bmxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpOwogCiAvKioKICAqIG11dGV4X3VubG9jayAtIHJlbGVhc2UgdGhlIG11dGV4CkBAIC00NDYsOSArNDEwLDExIEBACiAJaWYgKCFtdXRleF9jYW5fc3Bpbl9vbl9vd25lcihsb2NrKSkKIAkJZ290byBzbG93cGF0aDsKIAorCWlmICghb3NxX2xvY2soJmxvY2stPm9zcSkpCisJCWdvdG8gc2xvd3BhdGg7CisKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7Ci0JCXN0cnVjdCBtc3Bpbl9ub2RlICBub2RlOwogCiAJCWlmICh1c2Vfd3dfY3R4ICYmIHd3X2N0eC0+YWNxdWlyZWQgPiAwKSB7CiAJCQlzdHJ1Y3Qgd3dfbXV0ZXggKnd3OwpAQCAtNDYzLDE5ICs0MjksMTYgQEAKIAkJCSAqIHBlcmZvcm1lZCB0aGUgb3B0aW1pc3RpYyBzcGlubmluZyBjYW5ub3QgYmUgZG9uZS4KIAkJCSAqLwogCQkJaWYgKEFDQ0VTU19PTkNFKHd3LT5jdHgpKQotCQkJCWdvdG8gc2xvd3BhdGg7CisJCQkJYnJlYWs7CiAJCX0KIAogCQkvKgogCQkgKiBJZiB0aGVyZSdzIGFuIG93bmVyLCB3YWl0IGZvciBpdCB0byBlaXRoZXIKIAkJICogcmVsZWFzZSB0aGUgbG9jayBvciBnbyB0byBzbGVlcC4KIAkJICovCi0JCW1zcGluX2xvY2soTUxPQ0sobG9jayksICZub2RlKTsKIAkJb3duZXIgPSBBQ0NFU1NfT05DRShsb2NrLT5vd25lcik7Ci0JCWlmIChvd25lciAmJiAhbXV0ZXhfc3Bpbl9vbl9vd25lcihsb2NrLCBvd25lcikpIHsKLQkJCW1zcGluX3VubG9jayhNTE9DSyhsb2NrKSwgJm5vZGUpOwotCQkJZ290byBzbG93cGF0aDsKLQkJfQorCQlpZiAob3duZXIgJiYgIW11dGV4X3NwaW5fb25fb3duZXIobG9jaywgb3duZXIpKQorCQkJYnJlYWs7CiAKIAkJaWYgKChhdG9taWNfcmVhZCgmbG9jay0+Y291bnQpID09IDEpICYmCiAJCSAgICAoYXRvbWljX2NtcHhjaGcoJmxvY2stPmNvdW50LCAxLCAwKSA9PSAxKSkgewpAQCAtNDg4LDExICs0NTEsMTAgQEAKIAkJCX0KIAogCQkJbXV0ZXhfc2V0X293bmVyKGxvY2spOwotCQkJbXNwaW5fdW5sb2NrKE1MT0NLKGxvY2spLCAmbm9kZSk7CisJCQlvc3FfdW5sb2NrKCZsb2NrLT5vc3EpOwogCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCW1zcGluX3VubG9jayhNTE9DSyhsb2NrKSwgJm5vZGUpOwogCiAJCS8qCiAJCSAqIFdoZW4gdGhlcmUncyBubyBvd25lciwgd2UgbWlnaHQgaGF2ZSBwcmVlbXB0ZWQgYmV0d2VlbiB0aGUKQEAgLTUwMSw3ICs0NjMsNyBAQAogCQkgKiB0aGUgb3duZXIgY29tcGxldGUuCiAJCSAqLwogCQlpZiAoIW93bmVyICYmIChuZWVkX3Jlc2NoZWQoKSB8fCBydF90YXNrKHRhc2spKSkKLQkJCWdvdG8gc2xvd3BhdGg7CisJCQlicmVhazsKIAogCQkvKgogCQkgKiBUaGUgY3B1X3JlbGF4KCkgY2FsbCBpcyBhIGNvbXBpbGVyIGJhcnJpZXIgd2hpY2ggZm9yY2VzCkBAIC01MTEsNyArNDczLDE1IEBACiAJCSAqLwogCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOwogCX0KKwlvc3FfdW5sb2NrKCZsb2NrLT5vc3EpOwogc2xvd3BhdGg6CisJLyoKKwkgKiBJZiB3ZSBmZWxsIG91dCBvZiB0aGUgc3BpbiBwYXRoIGJlY2F1c2Ugb2YgbmVlZF9yZXNjaGVkKCksCisJICogcmVzY2hlZHVsZSBub3csIGJlZm9yZSB3ZSB0cnktbG9jayB0aGUgbXV0ZXguIFRoaXMgYXZvaWRzIGdldHRpbmcKKwkgKiBzY2hlZHVsZWQgb3V0IHJpZ2h0IGFmdGVyIHdlIG9idGFpbmVkIHRoZSBtdXRleC4KKwkgKi8KKwlpZiAobmVlZF9yZXNjaGVkKCkpCisJCXNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQoKTsKICNlbmRpZgogCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7CiAKQEAgLTcxNywxMCArNjg3LDYgQEAKIAlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSBjb250YWluZXJfb2YobG9ja19jb3VudCwgc3RydWN0IG11dGV4LCBjb3VudCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7Ci0JbXV0ZXhfcmVsZWFzZSgmbG9jay0+ZGVwX21hcCwgbmVzdGVkLCBfUkVUX0lQXyk7Ci0JZGVidWdfbXV0ZXhfdW5sb2NrKGxvY2spOwotCiAJLyoKIAkgKiBzb21lIGFyY2hpdGVjdHVyZXMgbGVhdmUgdGhlIGxvY2sgdW5sb2NrZWQgaW4gdGhlIGZhc3RwYXRoIGZhaWx1cmUKIAkgKiBjYXNlLCBvdGhlcnMgbmVlZCB0byBsZWF2ZSBpdCBsb2NrZWQuIEluIHRoZSBsYXRlciBjYXNlIHdlIGhhdmUgdG8KQEAgLTcyOSw2ICs2OTUsMTAgQEAKIAlpZiAoX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKSkKIAkJYXRvbWljX3NldCgmbG9jay0+Y291bnQsIDEpOwogCisJc3Bpbl9sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKKwltdXRleF9yZWxlYXNlKCZsb2NrLT5kZXBfbWFwLCBuZXN0ZWQsIF9SRVRfSVBfKTsKKwlkZWJ1Z19tdXRleF91bmxvY2sobG9jayk7CisKIAlpZiAoIWxpc3RfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkpIHsKIAkJLyogZ2V0IHRoZSBmaXJzdCBlbnRyeSBmcm9tIHRoZSB3YWl0LWxpc3Q6ICovCiAJCXN0cnVjdCBtdXRleF93YWl0ZXIgKndhaXRlciA9CkBAIC03NDYsNyArNzE2LDcgQEAKIC8qCiAgKiBSZWxlYXNlIHRoZSBsb2NrLCBzbG93cGF0aDoKICAqLwotc3RhdGljIF9fdXNlZCBub2lubGluZSB2b2lkCitfX3Zpc2libGUgdm9pZAogX19tdXRleF91bmxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpCiB7CiAJX19tdXRleF91bmxvY2tfY29tbW9uX3Nsb3dwYXRoKGxvY2tfY291bnQsIDEpOwpAQCAtODAzLDcgKzc3Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG11dGV4X2xvY2tfa2lsbGFibGUpOwogCi1zdGF0aWMgX191c2VkIG5vaW5saW5lIHZvaWQgX19zY2hlZAorX192aXNpYmxlIHZvaWQgX19zY2hlZAogX19tdXRleF9sb2NrX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KQogewogCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3J0bXV0ZXguYyBiL2tlcm5lbC9sb2NraW5nL3J0bXV0ZXguYwppbmRleCAyZTk2MGEyLi5hYTRkZmYwIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9ydG11dGV4LmMKKysrIGIva2VybmVsL2xvY2tpbmcvcnRtdXRleC5jCkBAIC0yMTMsNiArMjEzLDE4IEBACiB9CiAKIC8qCisgKiBDYWxsZWQgYnkgc2NoZWRfc2V0c2NoZWR1bGVyKCkgdG8gY2hlY2sgd2hldGhlciB0aGUgcHJpb3JpdHkgY2hhbmdlCisgKiBpcyBvdmVycnVsZWQgYnkgYSBwb3NzaWJsZSBwcmlvcml0eSBib29zdGluZy4KKyAqLworaW50IHJ0X211dGV4X2NoZWNrX3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgbmV3cHJpbykKK3sKKwlpZiAoIXRhc2tfaGFzX3BpX3dhaXRlcnModGFzaykpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRhc2tfdG9wX3BpX3dhaXRlcih0YXNrKS0+dGFzay0+cHJpbyA8PSBuZXdwcmlvOworfQorCisvKgogICogQWRqdXN0IHRoZSBwcmlvcml0eSBvZiBhIHRhc2ssIGFmdGVyIGl0cyBwaV93YWl0ZXJzIGdvdCBtb2RpZmllZC4KICAqCiAgKiBUaGlzIGNhbiBiZSBib3RoIGJvb3N0aW5nIGFuZCB1bmJvb3N0aW5nLiB0YXNrLT5waV9sb2NrIG11c3QgYmUgaGVsZC4KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYwppbmRleCAxOWM1ZmE5Li4xZDY2ZTA4IDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMKKysrIGIva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jCkBAIC0xNDMsNiArMTQzLDcgQEAKIC8qCiAgKiB3YWl0IGZvciB0aGUgcmVhZCBsb2NrIHRvIGJlIGdyYW50ZWQKICAqLworX192aXNpYmxlCiBzdHJ1Y3Qgcndfc2VtYXBob3JlIF9fc2NoZWQgKnJ3c2VtX2Rvd25fcmVhZF9mYWlsZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewogCWxvbmcgY291bnQsIGFkanVzdG1lbnQgPSAtUldTRU1fQUNUSVZFX1JFQURfQklBUzsKQEAgLTE5MCw2ICsxOTEsNyBAQAogLyoKICAqIHdhaXQgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgdGhlIHdyaXRlIGxvY2sKICAqLworX192aXNpYmxlCiBzdHJ1Y3Qgcndfc2VtYXBob3JlIF9fc2NoZWQgKnJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAlsb25nIGNvdW50LCBhZGp1c3RtZW50ID0gLVJXU0VNX0FDVElWRV9XUklURV9CSUFTOwpAQCAtMjUyLDYgKzI1NCw3IEBACiAgKiBoYW5kbGUgd2FraW5nIHVwIGEgd2FpdGVyIG9uIHRoZSBzZW1hcGhvcmUKICAqIC0gdXBfcmVhZC91cF93cml0ZSBoYXMgZGVjcmVtZW50ZWQgdGhlIGFjdGl2ZSBwYXJ0IG9mIGNvdW50IGlmIHdlIGNvbWUgaGVyZQogICovCitfX3Zpc2libGUKIHN0cnVjdCByd19zZW1hcGhvcmUgKnJ3c2VtX3dha2Uoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNzIsNiArMjc1LDcgQEAKICAqIC0gY2FsbGVyIGluY3JlbWVudGVkIHdhaXRpbmcgcGFydCBvZiBjb3VudCBhbmQgZGlzY292ZXJlZCBpdCBzdGlsbCBuZWdhdGl2ZQogICogLSBqdXN0IHdha2UgdXAgYW55IHJlYWRlcnMgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQogICovCitfX3Zpc2libGUKIHN0cnVjdCByd19zZW1hcGhvcmUgKnJ3c2VtX2Rvd25ncmFkZV93YWtlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGQyNGZjZjIuLjhkYzdmNWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAJCWJ1ZltsKytdID0gJ0MnOwogCS8qCiAJICogVEFJTlRfRk9SQ0VEX1JNTU9EOiBjb3VsZCBiZSBhZGRlZC4KLQkgKiBUQUlOVF9VTlNBRkVfU01QLCBUQUlOVF9NQUNISU5FX0NIRUNLLCBUQUlOVF9CQURfUEFHRSBkb24ndAorCSAqIFRBSU5UX0NQVV9PVVRfT0ZfU1BFQywgVEFJTlRfTUFDSElORV9DSEVDSywgVEFJTlRfQkFEX1BBR0UgZG9uJ3QKIAkgKiBhcHBseSB0byBtb2R1bGVzLgogCSAqLwogCXJldHVybiBsOwpAQCAtMTk0OCw2ICsxOTQ4LDEwIEBACiAKIAkJc3dpdGNoIChzeW1baV0uc3Rfc2huZHgpIHsKIAkJY2FzZSBTSE5fQ09NTU9OOgorCQkJLyogSWdub3JlIGNvbW1vbiBzeW1ib2xzICovCisJCQlpZiAoIXN0cm5jbXAobmFtZSwgIl9fZ251X2x0byIsIDkpKQorCQkJCWJyZWFrOworCiAJCQkvKiBXZSBjb21waWxlZCB3aXRoIC1mbm8tY29tbW9uLiAgVGhlc2UgYXJlIG5vdAogCQkJICAgc3VwcG9zZWQgdG8gaGFwcGVuLiAgKi8KIAkJCXByX2RlYnVnKCJDb21tb24gc3ltYm9sOiAlc1xuIiwgbmFtZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbm90aWZpZXIuYyBiL2tlcm5lbC9ub3RpZmllci5jCmluZGV4IDJkNWNjNGMuLmRiNGM4YjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ub3RpZmllci5jCisrKyBiL2tlcm5lbC9ub3RpZmllci5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAkgKiByYWN5IHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIHdoYXQgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdAogCSAqIGlzLCB3ZSByZS1jaGVjayB0aGUgbGlzdCBhZnRlciBoYXZpbmcgdGFrZW4gdGhlIGxvY2sgYW55d2F5OgogCSAqLwotCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KG5oLT5oZWFkKSkgeworCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIobmgtPmhlYWQpKSB7CiAJCWRvd25fcmVhZCgmbmgtPnJ3c2VtKTsKIAkJcmV0ID0gbm90aWZpZXJfY2FsbF9jaGFpbigmbmgtPmhlYWQsIHZhbCwgdiwgbnJfdG9fY2FsbCwKIAkJCQkJbnJfY2FsbHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCA2ZDYzMDAzLi5jY2E4YTkxIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHRudCB0bnRzW10gPSB7CiAJeyBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUsCSdQJywgJ0cnIH0sCiAJeyBUQUlOVF9GT1JDRURfTU9EVUxFLAkJJ0YnLCAnICcgfSwKLQl7IFRBSU5UX1VOU0FGRV9TTVAsCQknUycsICcgJyB9LAorCXsgVEFJTlRfQ1BVX09VVF9PRl9TUEVDLAknUycsICcgJyB9LAogCXsgVEFJTlRfRk9SQ0VEX1JNTU9ELAkJJ1InLCAnICcgfSwKIAl7IFRBSU5UX01BQ0hJTkVfQ0hFQ0ssCQknTScsICcgJyB9LAogCXsgVEFJTlRfQkFEX1BBR0UsCQknQicsICcgJyB9LApAQCAtNDU5LDcgKzQ1OSw3IEBACiAgKiBDYWxsZWQgd2hlbiBnY2MncyAtZnN0YWNrLXByb3RlY3RvciBmZWF0dXJlIGlzIHVzZWQsIGFuZAogICogZ2NjIGRldGVjdHMgY29ycnVwdGlvbiBvZiB0aGUgb24tc3RhY2sgY2FuYXJ5IHZhbHVlCiAgKi8KLXZvaWQgX19zdGFja19jaGtfZmFpbCh2b2lkKQorX192aXNpYmxlIHZvaWQgX19zdGFja19jaGtfZmFpbCh2b2lkKQogewogCXBhbmljKCJzdGFjay1wcm90ZWN0b3I6IEtlcm5lbCBzdGFjayBpcyBjb3JydXB0ZWQgaW46ICVwXG4iLAogCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IDFmNGJjYjMuLmFkZjk4NjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTExODAsOCArMTE4MCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHRyYWNlKGNvbXBhdF9sb25nX3QgcmVxdWVzdCwgY29tcGF0X2xvbmdfdCBwaWQsCi0JCQkJICBjb21wYXRfbG9uZ190IGFkZHIsIGNvbXBhdF9sb25nX3QgZGF0YSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQocHRyYWNlLCBjb21wYXRfbG9uZ190LCByZXF1ZXN0LCBjb21wYXRfbG9uZ190LCBwaWQsCisJCSAgICAgICBjb21wYXRfbG9uZ190LCBhZGRyLCBjb21wYXRfbG9uZ190LCBkYXRhKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CiAJbG9uZyByZXQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L01ha2VmaWxlIGIva2VybmVsL3JjdS9NYWtlZmlsZQppbmRleCAwMWU5ZWMzLi44MDdjY2ZiIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L01ha2VmaWxlCisrKyBiL2tlcm5lbC9yY3UvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBvYmoteSArPSB1cGRhdGUubyBzcmN1Lm8KLW9iai0kKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUKSArPSB0b3J0dXJlLm8KK29iai0kKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUKSArPSByY3V0b3J0dXJlLm8KIG9iai0kKENPTkZJR19UUkVFX1JDVSkgKz0gdHJlZS5vCiBvYmotJChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkgKz0gdHJlZS5vCiBvYmotJChDT05GSUdfVFJFRV9SQ1VfVFJBQ0UpICs9IHRyZWVfdHJhY2UubwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS9yY3UuaCBiL2tlcm5lbC9yY3UvcmN1LmgKaW5kZXggNzljMzg3Ny4uYmZkYTI3MiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9yY3UuaAorKysgYi9rZXJuZWwvcmN1L3JjdS5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDExCiAgKgpAQCAtMjMsNiArMjMsNyBAQAogI2lmbmRlZiBfX0xJTlVYX1JDVV9ICiAjZGVmaW5lIF9fTElOVVhfUkNVX0gKIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yY3UuaD4KICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFCiAjZGVmaW5lIFJDVV9UUkFDRShzdG10KSBzdG10CiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLwpAQCAtMTE2LDggKzExNyw2IEBACiAJfQogfQogCi1leHRlcm4gaW50IHJjdV9leHBlZGl0ZWQ7Ci0KICNpZmRlZiBDT05GSUdfUkNVX1NUQUxMX0NPTU1PTgogCiBleHRlcm4gaW50IHJjdV9jcHVfc3RhbGxfc3VwcHJlc3M7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3UvcmN1dG9ydHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzBiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwpAQCAtMCwwICsxLDE1ODIgQEAKKy8qCisgKiBSZWFkLUNvcHkgVXBkYXRlIG1vZHVsZS1iYXNlZCB0b3J0dXJlIHRlc3QgZmFjaWxpdHkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwNgorICoKKyAqIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4KKyAqCSAgSm9zaCBUcmlwbGV0dCA8am9zaEBmcmVlZGVza3RvcC5vcmc+CisgKgorICogU2VlIGFsc286ICBEb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dAorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NyY3UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2VfY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdG9ydHVyZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQHVzLmlibS5jb20+IGFuZCBKb3NoIFRyaXBsZXR0IDxqb3NoQGZyZWVkZXNrdG9wLm9yZz4iKTsKKworCit0b3J0dXJlX3BhcmFtKGludCwgZnFzX2R1cmF0aW9uLCAwLAorCSAgICAgICJEdXJhdGlvbiBvZiBmcXMgYnVyc3RzICh1cyksIDAgdG8gZGlzYWJsZSIpOwordG9ydHVyZV9wYXJhbShpbnQsIGZxc19ob2xkb2ZmLCAwLCAiSG9sZG9mZiB0aW1lIHdpdGhpbiBmcXMgYnVyc3RzICh1cykiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBmcXNfc3R1dHRlciwgMywgIldhaXQgdGltZSBiZXR3ZWVuIGZxcyBidXJzdHMgKHMpIik7Cit0b3J0dXJlX3BhcmFtKGJvb2wsIGdwX2V4cCwgZmFsc2UsICJVc2UgZXhwZWRpdGVkIEdQIHdhaXQgcHJpbWl0aXZlcyIpOwordG9ydHVyZV9wYXJhbShib29sLCBncF9ub3JtYWwsIGZhbHNlLAorCSAgICAgIlVzZSBub3JtYWwgKG5vbi1leHBlZGl0ZWQpIEdQIHdhaXQgcHJpbWl0aXZlcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIGlycXJlYWRlciwgMSwgIkFsbG93IFJDVSByZWFkZXJzIGZyb20gaXJxIGhhbmRsZXJzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgbl9iYXJyaWVyX2NicywgMCwKKwkgICAgICIjIG9mIGNhbGxiYWNrcy9rdGhyZWFkcyBmb3IgYmFycmllciB0ZXN0aW5nIik7Cit0b3J0dXJlX3BhcmFtKGludCwgbmZha2V3cml0ZXJzLCA0LCAiTnVtYmVyIG9mIFJDVSBmYWtlIHdyaXRlciB0aHJlYWRzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgbnJlYWRlcnMsIC0xLCAiTnVtYmVyIG9mIFJDVSByZWFkZXIgdGhyZWFkcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIG9iamVjdF9kZWJ1ZywgMCwKKwkgICAgICJFbmFibGUgZGVidWctb2JqZWN0IGRvdWJsZSBjYWxsX3JjdSgpIHRlc3RpbmciKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBvbm9mZl9ob2xkb2ZmLCAwLCAiVGltZSBhZnRlciBib290IGJlZm9yZSBDUFUgaG90cGx1Z3MgKHMpIik7Cit0b3J0dXJlX3BhcmFtKGludCwgb25vZmZfaW50ZXJ2YWwsIDAsCisJICAgICAiVGltZSBiZXR3ZWVuIENQVSBob3RwbHVncyAocyksIDA9ZGlzYWJsZSIpOwordG9ydHVyZV9wYXJhbShpbnQsIHNodWZmbGVfaW50ZXJ2YWwsIDMsICJOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHNodWZmbGVzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc2h1dGRvd25fc2VjcywgMCwgIlNodXRkb3duIHRpbWUgKHMpLCA8PSB6ZXJvIHRvIGRpc2FibGUuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc3RhbGxfY3B1LCAwLCAiU3RhbGwgZHVyYXRpb24gKHMpLCB6ZXJvIHRvIGRpc2FibGUuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc3RhbGxfY3B1X2hvbGRvZmYsIDEwLAorCSAgICAgIlRpbWUgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgc3RhbGwgKHMpLiIpOwordG9ydHVyZV9wYXJhbShpbnQsIHN0YXRfaW50ZXJ2YWwsIDYwLAorCSAgICAgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3RhdHMgcHJpbnRrKClzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc3R1dHRlciwgNSwgIk51bWJlciBvZiBzZWNvbmRzIHRvIHJ1bi9oYWx0IHRlc3QiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCB0ZXN0X2Jvb3N0LCAxLCAiVGVzdCBSQ1UgcHJpbyBib29zdDogMD1ubywgMT1tYXliZSwgMj15ZXMuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgdGVzdF9ib29zdF9kdXJhdGlvbiwgNCwKKwkgICAgICJEdXJhdGlvbiBvZiBlYWNoIGJvb3N0IHRlc3QsIHNlY29uZHMuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgdGVzdF9ib29zdF9pbnRlcnZhbCwgNywKKwkgICAgICJJbnRlcnZhbCBiZXR3ZWVuIGJvb3N0IHRlc3RzLCBzZWNvbmRzLiIpOwordG9ydHVyZV9wYXJhbShib29sLCB0ZXN0X25vX2lkbGVfaHosIHRydWUsCisJICAgICAiVGVzdCBzdXBwb3J0IGZvciB0aWNrbGVzcyBpZGxlIENQVXMiKTsKK3RvcnR1cmVfcGFyYW0oYm9vbCwgdmVyYm9zZSwgdHJ1ZSwKKwkgICAgICJFbmFibGUgdmVyYm9zZSBkZWJ1Z2dpbmcgcHJpbnRrKClzIik7CisKK3N0YXRpYyBjaGFyICp0b3J0dXJlX3R5cGUgPSAicmN1IjsKK21vZHVsZV9wYXJhbSh0b3J0dXJlX3R5cGUsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModG9ydHVyZV90eXBlLCAiVHlwZSBvZiBSQ1UgdG8gdG9ydHVyZSAocmN1LCByY3VfYmgsIC4uLikiKTsKKworc3RhdGljIGludCBucmVhbHJlYWRlcnM7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp3cml0ZXJfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipmYWtld3JpdGVyX3Rhc2tzOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnJlYWRlcl90YXNrczsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YXRzX3Rhc2s7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpmcXNfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJvb3N0X3Rhc2tzW05SX0NQVVNdOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3RhbGxfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipiYXJyaWVyX2Nic190YXNrczsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJhcnJpZXJfdGFzazsKKworI2RlZmluZSBSQ1VfVE9SVFVSRV9QSVBFX0xFTiAxMAorCitzdHJ1Y3QgcmN1X3RvcnR1cmUgeworCXN0cnVjdCByY3VfaGVhZCBydG9ydF9yY3U7CisJaW50IHJ0b3J0X3BpcGVfY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCBydG9ydF9mcmVlOworCWludCBydG9ydF9tYnRlc3Q7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHJjdV90b3J0dXJlX2ZyZWVsaXN0KTsKK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmUgX19yY3UgKnJjdV90b3J0dXJlX2N1cnJlbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb247CitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlIHJjdV90b3J0dXJlc1sxMCAqIFJDVV9UT1JUVVJFX1BJUEVfTEVOXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socmN1X3RvcnR1cmVfbG9jayk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZyBbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSwKKwkJICAgICAgcmN1X3RvcnR1cmVfY291bnQpID0geyAwIH07CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZyBbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSwKKwkJICAgICAgcmN1X3RvcnR1cmVfYmF0Y2gpID0geyAwIH07CitzdGF0aWMgYXRvbWljX3QgcmN1X3RvcnR1cmVfd2NvdW50W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV07CitzdGF0aWMgYXRvbWljX3Qgbl9yY3VfdG9ydHVyZV9hbGxvYzsKK3N0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWw7CitzdGF0aWMgYXRvbWljX3Qgbl9yY3VfdG9ydHVyZV9mcmVlOworc3RhdGljIGF0b21pY190IG5fcmN1X3RvcnR1cmVfbWJlcnJvcjsKK3N0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2Vycm9yOworc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9iYXJyaWVyX2Vycm9yOworc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9rdHJlcnJvcjsKK3N0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvcjsKK3N0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfZmFpbHVyZTsKK3N0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RzOworc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV90aW1lcnM7CitzdGF0aWMgbG9uZyBuX2JhcnJpZXJfYXR0ZW1wdHM7CitzdGF0aWMgbG9uZyBuX2JhcnJpZXJfc3VjY2Vzc2VzOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgcmN1X3RvcnR1cmVfcmVtb3ZlZDsKKworI2lmIGRlZmluZWQoTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFKQorI2RlZmluZSBSQ1VUT1JUVVJFX1JVTk5BQkxFX0lOSVQgMQorI2Vsc2UKKyNkZWZpbmUgUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUIDAKKyNlbmRpZgoraW50IHJjdXRvcnR1cmVfcnVubmFibGUgPSBSQ1VUT1JUVVJFX1JVTk5BQkxFX0lOSVQ7Cittb2R1bGVfcGFyYW0ocmN1dG9ydHVyZV9ydW5uYWJsZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmN1dG9ydHVyZV9ydW5uYWJsZSwgIlN0YXJ0IHJjdXRvcnR1cmUgYXQgYm9vdCIpOworCisjaWYgZGVmaW5lZChDT05GSUdfUkNVX0JPT1NUKSAmJiAhZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisjZGVmaW5lIHJjdV9jYW5fYm9vc3QoKSAxCisjZWxzZSAvKiAjaWYgZGVmaW5lZChDT05GSUdfUkNVX0JPT1NUKSAmJiAhZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpICovCisjZGVmaW5lIHJjdV9jYW5fYm9vc3QoKSAwCisjZW5kaWYgLyogI2Vsc2UgI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLworCisjaWZkZWYgQ09ORklHX1JDVV9UUkFDRQorc3RhdGljIHU2NCBub3RyYWNlIHJjdV90cmFjZV9jbG9ja19sb2NhbCh2b2lkKQoreworCXU2NCB0cyA9IHRyYWNlX2Nsb2NrX2xvY2FsKCk7CisJdW5zaWduZWQgbG9uZyBfX21heWJlX3VudXNlZCB0c19yZW0gPSBkb19kaXYodHMsIE5TRUNfUEVSX1VTRUMpOworCXJldHVybiB0czsKK30KKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCitzdGF0aWMgdTY0IG5vdHJhY2UgcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKHZvaWQpCit7CisJcmV0dXJuIDBVTEw7Cit9CisjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vc3Rfc3RhcnR0aW1lOwkvKiBqaWZmaWVzIG9mIG5leHQgYm9vc3QgdGVzdCBzdGFydC4gKi8KK0RFRklORV9NVVRFWChib29zdF9tdXRleCk7CQkvKiBwcm90ZWN0IHNldHRpbmcgYm9vc3Rfc3RhcnR0aW1lICovCisJCQkJCS8qICBhbmQgYm9vc3QgdGFzayBjcmVhdGUvZGVzdHJveS4gKi8KK3N0YXRpYyBhdG9taWNfdCBiYXJyaWVyX2Nic19jb3VudDsJLyogQmFycmllciBjYWxsYmFja3MgcmVnaXN0ZXJlZC4gKi8KK3N0YXRpYyBib29sIGJhcnJpZXJfcGhhc2U7CQkvKiBUZXN0IHBoYXNlLiAqLworc3RhdGljIGF0b21pY190IGJhcnJpZXJfY2JzX2ludm9rZWQ7CS8qIEJhcnJpZXIgY2FsbGJhY2tzIGludm9rZWQuICovCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgKmJhcnJpZXJfY2JzX3dxOyAvKiBDb29yZGluYXRlIGJhcnJpZXIgdGVzdGluZy4gKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChiYXJyaWVyX3dxKTsKKworLyoKKyAqIEFsbG9jYXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmUgKgorcmN1X3RvcnR1cmVfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJc3Bpbl9sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmcmN1X3RvcnR1cmVfZnJlZWxpc3QpKSB7CisJCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbCk7CisJCXNwaW5fdW5sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2MpOworCXAgPSByY3VfdG9ydHVyZV9mcmVlbGlzdC5uZXh0OworCWxpc3RfZGVsX2luaXQocCk7CisJc3Bpbl91bmxvY2tfYmgoJnJjdV90b3J0dXJlX2xvY2spOworCXJldHVybiBjb250YWluZXJfb2YocCwgc3RydWN0IHJjdV90b3J0dXJlLCBydG9ydF9mcmVlKTsKK30KKworLyoKKyAqIEZyZWUgYW4gZWxlbWVudCB0byB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCisgKi8KK3N0YXRpYyB2b2lkCityY3VfdG9ydHVyZV9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcCkKK3sKKwlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX2ZyZWUpOworCXNwaW5fbG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcC0+cnRvcnRfZnJlZSwgJnJjdV90b3J0dXJlX2ZyZWVsaXN0KTsKKwlzcGluX3VubG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7Cit9CisKKy8qCisgKiBPcGVyYXRpb25zIHZlY3RvciBmb3Igc2VsZWN0aW5nIGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cy4KKyAqLworCitzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHsKKwl2b2lkICgqaW5pdCkodm9pZCk7CisJaW50ICgqcmVhZGxvY2spKHZvaWQpOworCXZvaWQgKCpyZWFkX2RlbGF5KShzdHJ1Y3QgdG9ydHVyZV9yYW5kb21fc3RhdGUgKnJyc3ApOworCXZvaWQgKCpyZWFkdW5sb2NrKShpbnQgaWR4KTsKKwlpbnQgKCpjb21wbGV0ZWQpKHZvaWQpOworCXZvaWQgKCpkZWZlcnJlZF9mcmVlKShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApOworCXZvaWQgKCpzeW5jKSh2b2lkKTsKKwl2b2lkICgqZXhwX3N5bmMpKHZvaWQpOworCXZvaWQgKCpjYWxsKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpOworCXZvaWQgKCpjYl9iYXJyaWVyKSh2b2lkKTsKKwl2b2lkICgqZnFzKSh2b2lkKTsKKwl2b2lkICgqc3RhdHMpKGNoYXIgKnBhZ2UpOworCWludCBpcnFfY2FwYWJsZTsKKwlpbnQgY2FuX2Jvb3N0OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlX29wcyAqY3VyX29wczsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciByY3UgdG9ydHVyZSB0ZXN0aW5nLgorICovCisKK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpIF9fYWNxdWlyZXMoUkNVKQoreworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmN1X3JlYWRfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICpycnNwKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hvcnRkZWxheV91cyA9IDIwMDsKKwljb25zdCB1bnNpZ25lZCBsb25nIGxvbmdkZWxheV9tcyA9IDUwOworCisJLyogV2Ugd2FudCBhIHNob3J0IGRlbGF5IHNvbWV0aW1lcyB0byBtYWtlIGEgcmVhZGVyIGRlbGF5IHRoZSBncmFjZQorCSAqIHBlcmlvZCwgYW5kIHdlIHdhbnQgYSBsb25nIGRlbGF5IG9jY2FzaW9uYWxseSB0byB0cmlnZ2VyCisJICogZm9yY2VfcXVpZXNjZW50X3N0YXRlLiAqLworCisJaWYgKCEodG9ydHVyZV9yYW5kb20ocnJzcCkgJSAobnJlYWxyZWFkZXJzICogMjAwMCAqIGxvbmdkZWxheV9tcykpKQorCQltZGVsYXkobG9uZ2RlbGF5X21zKTsKKwlpZiAoISh0b3J0dXJlX3JhbmRvbShycnNwKSAlIChucmVhbHJlYWRlcnMgKiAyICogc2hvcnRkZWxheV91cykpKQorCQl1ZGVsYXkoc2hvcnRkZWxheV91cyk7CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlpZiAoIXByZWVtcHRfY291bnQoKSAmJgorCSAgICAhKHRvcnR1cmVfcmFuZG9tKHJyc3ApICUgKG5yZWFscmVhZGVycyAqIDIwMDAwKSkpCisJCXByZWVtcHRfc2NoZWR1bGUoKTsgIC8qIE5vIFFTIGlmIHByZWVtcHRfZGlzYWJsZSgpIGluIGVmZmVjdCAqLworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3JlYWRfdW5sb2NrKGludCBpZHgpIF9fcmVsZWFzZXMoUkNVKQoreworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IHJjdV90b3J0dXJlX2NvbXBsZXRlZCh2b2lkKQoreworCXJldHVybiByY3VfYmF0Y2hlc19jb21wbGV0ZWQoKTsKK30KKworc3RhdGljIHZvaWQKK3JjdV90b3J0dXJlX2NiKHN0cnVjdCByY3VfaGVhZCAqcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByY3VfdG9ydHVyZSwgcnRvcnRfcmN1KTsKKworCWlmICh0b3J0dXJlX211c3Rfc3RvcF9pcnEoKSkgeworCQkvKiBUZXN0IGlzIGVuZGluZywganVzdCBkcm9wIGNhbGxiYWNrcyBvbiB0aGUgZmxvb3IuICovCisJCS8qIFRoZSBuZXh0IGluaXRpYWxpemF0aW9uIHdpbGwgcGljayB1cCB0aGUgcGllY2VzLiAqLworCQlyZXR1cm47CisJfQorCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKKwlpZiAoaSA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKQorCQlpID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKKwlpZiAoKytycC0+cnRvcnRfcGlwZV9jb3VudCA+PSBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgeworCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKKwkJcmN1X3RvcnR1cmVfZnJlZShycCk7CisJfSBlbHNlIHsKKwkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShycCk7CisJfQorfQorCitzdGF0aWMgaW50IHJjdV9ub19jb21wbGV0ZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCit7CisJY2FsbF9yY3UoJnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOworfQorCitzdGF0aWMgdm9pZCByY3Vfc3luY190b3J0dXJlX2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHJjdV9vcHMgPSB7CisJLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAorCS5yZWFkbG9jawk9IHJjdV90b3J0dXJlX3JlYWRfbG9jaywKKwkucmVhZF9kZWxheQk9IHJjdV9yZWFkX2RlbGF5LAorCS5yZWFkdW5sb2NrCT0gcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCisJLmNvbXBsZXRlZAk9IHJjdV90b3J0dXJlX2NvbXBsZXRlZCwKKwkuZGVmZXJyZWRfZnJlZQk9IHJjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUsCisJLnN5bmMJCT0gc3luY2hyb25pemVfcmN1LAorCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQsCisJLmNhbGwJCT0gY2FsbF9yY3UsCisJLmNiX2JhcnJpZXIJPSByY3VfYmFycmllciwKKwkuZnFzCQk9IHJjdV9mb3JjZV9xdWllc2NlbnRfc3RhdGUsCisJLnN0YXRzCQk9IE5VTEwsCisJLmlycV9jYXBhYmxlCT0gMSwKKwkuY2FuX2Jvb3N0CT0gcmN1X2Nhbl9ib29zdCgpLAorCS5uYW1lCQk9ICJyY3UiCit9OworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHJjdV9iaCB0b3J0dXJlIHRlc3RpbmcuCisgKi8KKworc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9yZWFkX2xvY2sodm9pZCkgX19hY3F1aXJlcyhSQ1VfQkgpCit7CisJcmN1X3JlYWRfbG9ja19iaCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKFJDVV9CSCkKK3sKKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKK30KKworc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9jb21wbGV0ZWQodm9pZCkKK3sKKwlyZXR1cm4gcmN1X2JhdGNoZXNfY29tcGxldGVkX2JoKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJjdV9iaF90b3J0dXJlX2RlZmVycmVkX2ZyZWUoc3RydWN0IHJjdV90b3J0dXJlICpwKQoreworCWNhbGxfcmN1X2JoKCZwLT5ydG9ydF9yY3UsIHJjdV90b3J0dXJlX2NiKTsKK30KKworc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgcmN1X2JoX29wcyA9IHsKKwkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCisJLnJlYWRsb2NrCT0gcmN1X2JoX3RvcnR1cmVfcmVhZF9sb2NrLAorCS5yZWFkX2RlbGF5CT0gcmN1X3JlYWRfZGVsYXksICAvKiBqdXN0IHJldXNlIHJjdSdzIHZlcnNpb24uICovCisJLnJlYWR1bmxvY2sJPSByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jaywKKwkuY29tcGxldGVkCT0gcmN1X2JoX3RvcnR1cmVfY29tcGxldGVkLAorCS5kZWZlcnJlZF9mcmVlCT0gcmN1X2JoX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKKwkuc3luYwkJPSBzeW5jaHJvbml6ZV9yY3VfYmgsCisJLmV4cF9zeW5jCT0gc3luY2hyb25pemVfcmN1X2JoX2V4cGVkaXRlZCwKKwkuY2FsbAkJPSBjYWxsX3JjdV9iaCwKKwkuY2JfYmFycmllcgk9IHJjdV9iYXJyaWVyX2JoLAorCS5mcXMJCT0gcmN1X2JoX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSwKKwkuc3RhdHMJCT0gTlVMTCwKKwkuaXJxX2NhcGFibGUJPSAxLAorCS5uYW1lCQk9ICJyY3VfYmgiCit9OworCisvKgorICogRG9uJ3QgZXZlbiB0aGluayBhYm91dCB0cnlpbmcgYW55IG9mIHRoZXNlIGluIHJlYWwgbGlmZSEhIQorICogVGhlIG5hbWVzIGluY2x1ZGVzICJidXN0ZWQiLCBhbmQgdGhleSByZWFsbHkgbWVhbnMgaXQhCisgKiBUaGUgb25seSBwdXJwb3NlIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyB0byBwcm92aWRlIGEgYnVnZ3kgUkNVCisgKiBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIHN1cmUgdGhhdCByY3V0b3J0dXJlIGNvcnJlY3RseSBlbWl0cworICogYnVnZ3ktUkNVIGVycm9yIG1lc3NhZ2VzLgorICovCitzdGF0aWMgdm9pZCByY3VfYnVzdGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCit7CisJLyogVGhpcyBpcyBhIGRlbGliZXJhdGUgYnVnIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhICovCisJcmN1X3RvcnR1cmVfY2IoJnAtPnJ0b3J0X3JjdSk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNocm9uaXplX3JjdV9idXN0ZWQodm9pZCkKK3sKKwkvKiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBidWcgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSEgKi8KK30KKworc3RhdGljIHZvaWQKK2NhbGxfcmN1X2J1c3RlZChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpCit7CisJLyogVGhpcyBpcyBhIGRlbGliZXJhdGUgYnVnIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhICovCisJZnVuYyhoZWFkKTsKK30KKworc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgcmN1X2J1c3RlZF9vcHMgPSB7CisJLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAorCS5yZWFkbG9jawk9IHJjdV90b3J0dXJlX3JlYWRfbG9jaywKKwkucmVhZF9kZWxheQk9IHJjdV9yZWFkX2RlbGF5LCAgLyoganVzdCByZXVzZSByY3UncyB2ZXJzaW9uLiAqLworCS5yZWFkdW5sb2NrCT0gcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCisJLmNvbXBsZXRlZAk9IHJjdV9ub19jb21wbGV0ZWQsCisJLmRlZmVycmVkX2ZyZWUJPSByY3VfYnVzdGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKKwkuc3luYwkJPSBzeW5jaHJvbml6ZV9yY3VfYnVzdGVkLAorCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3JjdV9idXN0ZWQsCisJLmNhbGwJCT0gY2FsbF9yY3VfYnVzdGVkLAorCS5jYl9iYXJyaWVyCT0gTlVMTCwKKwkuZnFzCQk9IE5VTEwsCisJLnN0YXRzCQk9IE5VTEwsCisJLmlycV9jYXBhYmxlCT0gMSwKKwkubmFtZQkJPSAicmN1X2J1c3RlZCIKK307CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3Igc3JjdSB0b3J0dXJlIHRlc3RpbmcuCisgKi8KKworREVGSU5FX1NUQVRJQ19TUkNVKHNyY3VfY3RsKTsKKworc3RhdGljIGludCBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpIF9fYWNxdWlyZXMoJnNyY3VfY3RsKQoreworCXJldHVybiBzcmN1X3JlYWRfbG9jaygmc3JjdV9jdGwpOworfQorCitzdGF0aWMgdm9pZCBzcmN1X3JlYWRfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICpycnNwKQoreworCWxvbmcgZGVsYXk7CisJY29uc3QgbG9uZyB1c3BlcnRpY2sgPSAxMDAwMDAwIC8gSFo7CisJY29uc3QgbG9uZyBsb25nZGVsYXkgPSAxMDsKKworCS8qIFdlIHdhbnQgdGhlcmUgdG8gYmUgbG9uZy1ydW5uaW5nIHJlYWRlcnMsIGJ1dCBub3QgYWxsIHRoZSB0aW1lLiAqLworCisJZGVsYXkgPSB0b3J0dXJlX3JhbmRvbShycnNwKSAlCisJCShucmVhbHJlYWRlcnMgKiAyICogbG9uZ2RlbGF5ICogdXNwZXJ0aWNrKTsKKwlpZiAoIWRlbGF5KQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobG9uZ2RlbGF5KTsKKwllbHNlCisJCXJjdV9yZWFkX2RlbGF5KHJyc3ApOworfQorCitzdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfcmVhZF91bmxvY2soaW50IGlkeCkgX19yZWxlYXNlcygmc3JjdV9jdGwpCit7CisJc3JjdV9yZWFkX3VubG9jaygmc3JjdV9jdGwsIGlkeCk7Cit9CisKK3N0YXRpYyBpbnQgc3JjdV90b3J0dXJlX2NvbXBsZXRlZCh2b2lkKQoreworCXJldHVybiBzcmN1X2JhdGNoZXNfY29tcGxldGVkKCZzcmN1X2N0bCk7Cit9CisKK3N0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9kZWZlcnJlZF9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcnApCit7CisJY2FsbF9zcmN1KCZzcmN1X2N0bCwgJnJwLT5ydG9ydF9yY3UsIHJjdV90b3J0dXJlX2NiKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX3N5bmNocm9uaXplKHZvaWQpCit7CisJc3luY2hyb25pemVfc3JjdSgmc3JjdV9jdGwpOworfQorCitzdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfY2FsbChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsCisJCQkgICAgICB2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpoZWFkKSkKK3sKKwljYWxsX3NyY3UoJnNyY3VfY3RsLCBoZWFkLCBmdW5jKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX2JhcnJpZXIodm9pZCkKK3sKKwlzcmN1X2JhcnJpZXIoJnNyY3VfY3RsKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX3N0YXRzKGNoYXIgKnBhZ2UpCit7CisJaW50IGNwdTsKKwlpbnQgaWR4ID0gc3JjdV9jdGwuY29tcGxldGVkICYgMHgxOworCisJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlcyVzIHBlci1DUFUoaWR4PSVkKToiLAorCQkgICAgICAgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcsIGlkeCk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlZCglbHUsJWx1KSIsIGNwdSwKKwkJCSAgICAgICBwZXJfY3B1X3B0cihzcmN1X2N0bC5wZXJfY3B1X3JlZiwgY3B1KS0+Y1shaWR4XSwKKwkJCSAgICAgICBwZXJfY3B1X3B0cihzcmN1X2N0bC5wZXJfY3B1X3JlZiwgY3B1KS0+Y1tpZHhdKTsKKwl9CisJc3ByaW50ZihwYWdlLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX3N5bmNocm9uaXplX2V4cGVkaXRlZCh2b2lkKQoreworCXN5bmNocm9uaXplX3NyY3VfZXhwZWRpdGVkKCZzcmN1X2N0bCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHNyY3Vfb3BzID0geworCS5pbml0CQk9IHJjdV9zeW5jX3RvcnR1cmVfaW5pdCwKKwkucmVhZGxvY2sJPSBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrLAorCS5yZWFkX2RlbGF5CT0gc3JjdV9yZWFkX2RlbGF5LAorCS5yZWFkdW5sb2NrCT0gc3JjdV90b3J0dXJlX3JlYWRfdW5sb2NrLAorCS5jb21wbGV0ZWQJPSBzcmN1X3RvcnR1cmVfY29tcGxldGVkLAorCS5kZWZlcnJlZF9mcmVlCT0gc3JjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUsCisJLnN5bmMJCT0gc3JjdV90b3J0dXJlX3N5bmNocm9uaXplLAorCS5leHBfc3luYwk9IHNyY3VfdG9ydHVyZV9zeW5jaHJvbml6ZV9leHBlZGl0ZWQsCisJLmNhbGwJCT0gc3JjdV90b3J0dXJlX2NhbGwsCisJLmNiX2JhcnJpZXIJPSBzcmN1X3RvcnR1cmVfYmFycmllciwKKwkuc3RhdHMJCT0gc3JjdV90b3J0dXJlX3N0YXRzLAorCS5uYW1lCQk9ICJzcmN1IgorfTsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBzY2hlZCB0b3J0dXJlIHRlc3RpbmcuCisgKi8KKworc3RhdGljIGludCBzY2hlZF90b3J0dXJlX3JlYWRfbG9jayh2b2lkKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2hlZF90b3J0dXJlX3JlYWRfdW5sb2NrKGludCBpZHgpCit7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgcmN1X3NjaGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCit7CisJY2FsbF9yY3Vfc2NoZWQoJnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOworfQorCitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlX29wcyBzY2hlZF9vcHMgPSB7CisJLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAorCS5yZWFkbG9jawk9IHNjaGVkX3RvcnR1cmVfcmVhZF9sb2NrLAorCS5yZWFkX2RlbGF5CT0gcmN1X3JlYWRfZGVsYXksICAvKiBqdXN0IHJldXNlIHJjdSdzIHZlcnNpb24uICovCisJLnJlYWR1bmxvY2sJPSBzY2hlZF90b3J0dXJlX3JlYWRfdW5sb2NrLAorCS5jb21wbGV0ZWQJPSByY3Vfbm9fY29tcGxldGVkLAorCS5kZWZlcnJlZF9mcmVlCT0gcmN1X3NjaGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKKwkuc3luYwkJPSBzeW5jaHJvbml6ZV9zY2hlZCwKKwkuZXhwX3N5bmMJPSBzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWQsCisJLmNhbGwJCT0gY2FsbF9yY3Vfc2NoZWQsCisJLmNiX2JhcnJpZXIJPSByY3VfYmFycmllcl9zY2hlZCwKKwkuZnFzCQk9IHJjdV9zY2hlZF9mb3JjZV9xdWllc2NlbnRfc3RhdGUsCisJLnN0YXRzCQk9IE5VTEwsCisJLmlycV9jYXBhYmxlCT0gMSwKKwkubmFtZQkJPSAic2NoZWQiCit9OworCisvKgorICogUkNVIHRvcnR1cmUgcHJpb3JpdHktYm9vc3QgdGVzdGluZy4gIFJ1bnMgb25lIHJlYWwtdGltZSB0aHJlYWQgcGVyCisgKiBDUFUgZm9yIG1vZGVyYXRlIGJ1cnN0cywgcmVwZWF0ZWRseSByZWdpc3RlcmluZyBSQ1UgY2FsbGJhY2tzIGFuZAorICogc3Bpbm5pbmcgd2FpdGluZyBmb3IgdGhlbSB0byBiZSBpbnZva2VkLiAgSWYgYSBnaXZlbiBjYWxsYmFjayB0YWtlcworICogdG9vIGxvbmcgdG8gYmUgaW52b2tlZCwgd2UgYXNzdW1lIHRoYXQgcHJpb3JpdHkgaW52ZXJzaW9uIGhhcyBvY2N1cnJlZC4KKyAqLworCitzdHJ1Y3QgcmN1X2Jvb3N0X2luZmxpZ2h0IHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCWludCBpbmZsaWdodDsKK307CisKK3N0YXRpYyB2b2lkIHJjdV90b3J0dXJlX2Jvb3N0X2NiKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcmN1X2Jvb3N0X2luZmxpZ2h0ICpyYmlwID0KKwkJY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQsIHJjdSk7CisKKwlzbXBfbWIoKTsgLyogRW5zdXJlIFJDVS1jb3JlIGFjY2Vzc2VzIHByZWNlZGUgY2xlYXJpbmcgLT5pbmZsaWdodCAqLworCXJiaXAtPmluZmxpZ2h0ID0gMDsKK30KKworc3RhdGljIGludCByY3VfdG9ydHVyZV9ib29zdCh2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBjYWxsX3JjdV90aW1lOworCXVuc2lnbmVkIGxvbmcgZW5kdGltZTsKKwl1bnNpZ25lZCBsb25nIG9sZHN0YXJ0dGltZTsKKwlzdHJ1Y3QgcmN1X2Jvb3N0X2luZmxpZ2h0IHJiaSA9IHsgLmluZmxpZ2h0ID0gMCB9OworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKworCVZFUkJPU0VfVE9ST1VUX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3Qgc3RhcnRlZCIpOworCisJLyogU2V0IHJlYWwtdGltZSBwcmlvcml0eS4gKi8KKwlzcC5zY2hlZF9wcmlvcml0eSA9IDE7CisJaWYgKHNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmc3ApIDwgMCkgeworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IFJUIHByaW8gZmFpbGVkISIpOworCQluX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IrKzsKKwl9CisKKwlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKKwkvKiBFYWNoIHBhc3MgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGxvb3AgZG9lcyBvbmUgYm9vc3QtdGVzdCBjeWNsZS4gKi8KKwlkbyB7CisJCS8qIFdhaXQgZm9yIHRoZSBuZXh0IHRlc3QgaW50ZXJ2YWwuICovCisJCW9sZHN0YXJ0dGltZSA9IGJvb3N0X3N0YXJ0dGltZTsKKwkJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzLCBvbGRzdGFydHRpbWUpKSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUob2xkc3RhcnR0aW1lIC0gamlmZmllcyk7CisJCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJCQlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCQlnb3RvIGNoZWNrd2FpdDsKKwkJfQorCisJCS8qIERvIG9uZSBib29zdC10ZXN0IGludGVydmFsLiAqLworCQllbmR0aW1lID0gb2xkc3RhcnR0aW1lICsgdGVzdF9ib29zdF9kdXJhdGlvbiAqIEhaOworCQljYWxsX3JjdV90aW1lID0gamlmZmllczsKKwkJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzLCBlbmR0aW1lKSkgeworCQkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhbGxiYWNrIGluIGZsaWdodCwgcG9zdCBvbmUuICovCisJCQlpZiAoIXJiaS5pbmZsaWdodCkgeworCQkJCXNtcF9tYigpOyAvKiBSQ1UgY29yZSBiZWZvcmUgLT5pbmZsaWdodCA9IDEuICovCisJCQkJcmJpLmluZmxpZ2h0ID0gMTsKKwkJCQljYWxsX3JjdSgmcmJpLnJjdSwgcmN1X3RvcnR1cmVfYm9vc3RfY2IpOworCQkJCWlmIChqaWZmaWVzIC0gY2FsbF9yY3VfdGltZSA+CisJCQkJCSB0ZXN0X2Jvb3N0X2R1cmF0aW9uICogSFogLSBIWiAvIDIpIHsKKwkJCQkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9ib29zdCBib29zdGluZyBmYWlsZWQiKTsKKwkJCQkJbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlKys7CisJCQkJfQorCQkJCWNhbGxfcmN1X3RpbWUgPSBqaWZmaWVzOworCQkJfQorCQkJY29uZF9yZXNjaGVkKCk7CisJCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJCQlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCQlnb3RvIGNoZWNrd2FpdDsKKwkJfQorCisJCS8qCisJCSAqIFNldCB0aGUgc3RhcnQgdGltZSBvZiB0aGUgbmV4dCB0ZXN0IGludGVydmFsLgorCQkgKiBZZXMsIHRoaXMgaXMgdnVsbmVyYWJsZSB0byBsb25nIGRlbGF5cywgYnV0IHN1Y2gKKwkJICogZGVsYXlzIHNpbXBseSBjYXVzZSBhIGZhbHNlIG5lZ2F0aXZlIGZvciB0aGUgbmV4dAorCQkgKiBpbnRlcnZhbC4gIEJlc2lkZXMsIHdlIGFyZSBydW5uaW5nIGF0IFJUIHByaW9yaXR5LAorCQkgKiBzbyBkZWxheXMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgcmFyZS4KKwkJICovCisJCXdoaWxlIChvbGRzdGFydHRpbWUgPT0gYm9vc3Rfc3RhcnR0aW1lICYmCisJCSAgICAgICAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQlpZiAobXV0ZXhfdHJ5bG9jaygmYm9vc3RfbXV0ZXgpKSB7CisJCQkJYm9vc3Rfc3RhcnR0aW1lID0gamlmZmllcyArCisJCQkJCQkgIHRlc3RfYm9vc3RfaW50ZXJ2YWwgKiBIWjsKKwkJCQluX3JjdV90b3J0dXJlX2Jvb3N0cysrOworCQkJCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KKworCQkvKiBHbyBkbyB0aGUgc3R1dHRlci4gKi8KK2NoZWNrd2FpdDoJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9ib29zdCIpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKworCS8qIENsZWFuIHVwIGFuZCBleGl0LiAqLworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IHJiaS5pbmZsaWdodCkgeworCQl0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfYm9vc3QiKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJfQorCXNtcF9tYigpOyAvKiBvcmRlciBhY2Nlc3NlcyB0byAtPmluZmxpZ2h0IGJlZm9yZSBzdGFjay1mcmFtZSBkZWF0aC4gKi8KKwlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSQ1UgdG9ydHVyZSBmb3JjZS1xdWllc2NlbnQtc3RhdGUga3RocmVhZC4gIFJlcGVhdGVkbHkgaW5kdWNlcworICogYnVyc3RzIG9mIGNhbGxzIHRvIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpLCBpbmNyZWFzaW5nIHRoZSBwcm9iYWJpbGl0eQorICogb2Ygb2NjdXJyZW5jZSBvZiBzb21lIGltcG9ydGFudCB0eXBlcyBvZiByYWNlIGNvbmRpdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX2Zxcyh2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBmcXNfcmVzdW1lX3RpbWU7CisJaW50IGZxc19idXJzdF9yZW1haW5pbmc7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2ZxcyB0YXNrIHN0YXJ0ZWQiKTsKKwlkbyB7CisJCWZxc19yZXN1bWVfdGltZSA9IGppZmZpZXMgKyBmcXNfc3R1dHRlciAqIEhaOworCQl3aGlsZSAoVUxPTkdfQ01QX0xUKGppZmZpZXMsIGZxc19yZXN1bWVfdGltZSkgJiYKKwkJICAgICAgICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwkJfQorCQlmcXNfYnVyc3RfcmVtYWluaW5nID0gZnFzX2R1cmF0aW9uOworCQl3aGlsZSAoZnFzX2J1cnN0X3JlbWFpbmluZyA+IDAgJiYKKwkJICAgICAgICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCWN1cl9vcHMtPmZxcygpOworCQkJdWRlbGF5KGZxc19ob2xkb2ZmKTsKKwkJCWZxc19idXJzdF9yZW1haW5pbmcgLT0gZnFzX2hvbGRvZmY7CisJCX0KKwkJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mcXMiKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJyY3VfdG9ydHVyZV9mcXMiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJDVSB0b3J0dXJlIHdyaXRlciBrdGhyZWFkLiAgUmVwZWF0ZWRseSBzdWJzdGl0dXRlcyBhIG5ldyBzdHJ1Y3R1cmUKKyAqIGZvciB0aGF0IHBvaW50ZWQgdG8gYnkgcmN1X3RvcnR1cmVfY3VycmVudCwgZnJlZWluZyB0aGUgb2xkIHN0cnVjdHVyZQorICogYWZ0ZXIgYSBzZXJpZXMgb2YgZ3JhY2UgcGVyaW9kcyAodGhlICJwaXBlbGluZSIpLgorICovCitzdGF0aWMgaW50CityY3VfdG9ydHVyZV93cml0ZXIodm9pZCAqYXJnKQoreworCWJvb2wgZXhwOworCWludCBpOworCXN0cnVjdCByY3VfdG9ydHVyZSAqcnA7CisJc3RydWN0IHJjdV90b3J0dXJlICpycDE7CisJc3RydWN0IHJjdV90b3J0dXJlICpvbGRfcnA7CisJc3RhdGljIERFRklORV9UT1JUVVJFX1JBTkRPTShyYW5kKTsKKworCVZFUkJPU0VfVE9ST1VUX1NUUklORygicmN1X3RvcnR1cmVfd3JpdGVyIHRhc2sgc3RhcnRlZCIpOworCXNldF91c2VyX25pY2UoY3VycmVudCwgTUFYX05JQ0UpOworCisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJcnAgPSByY3VfdG9ydHVyZV9hbGxvYygpOworCQlpZiAocnAgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlycC0+cnRvcnRfcGlwZV9jb3VudCA9IDA7CisJCXVkZWxheSh0b3J0dXJlX3JhbmRvbSgmcmFuZCkgJiAweDNmZik7CisJCW9sZF9ycCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAorCQkJCQkgICAgICAgY3VycmVudCA9PSB3cml0ZXJfdGFzayk7CisJCXJwLT5ydG9ydF9tYnRlc3QgPSAxOworCQlyY3VfYXNzaWduX3BvaW50ZXIocmN1X3RvcnR1cmVfY3VycmVudCwgcnApOworCQlzbXBfd21iKCk7IC8qIE1vZHMgdG8gb2xkX3JwIG11c3QgZm9sbG93IHJjdV9hc3NpZ25fcG9pbnRlcigpICovCisJCWlmIChvbGRfcnApIHsKKwkJCWkgPSBvbGRfcnAtPnJ0b3J0X3BpcGVfY291bnQ7CisJCQlpZiAoaSA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKQorCQkJCWkgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKKwkJCWF0b21pY19pbmMoJnJjdV90b3J0dXJlX3djb3VudFtpXSk7CisJCQlvbGRfcnAtPnJ0b3J0X3BpcGVfY291bnQrKzsKKwkJCWlmIChncF9ub3JtYWwgPT0gZ3BfZXhwKQorCQkJCWV4cCA9ICEhKHRvcnR1cmVfcmFuZG9tKCZyYW5kKSAmIDB4ODApOworCQkJZWxzZQorCQkJCWV4cCA9IGdwX2V4cDsKKwkJCWlmICghZXhwKSB7CisJCQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShvbGRfcnApOworCQkJfSBlbHNlIHsKKwkJCQljdXJfb3BzLT5leHBfc3luYygpOworCQkJCWxpc3RfYWRkKCZvbGRfcnAtPnJ0b3J0X2ZyZWUsCisJCQkJCSAmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwLCBycDEsCisJCQkJCQkJICZyY3VfdG9ydHVyZV9yZW1vdmVkLAorCQkJCQkJCSBydG9ydF9mcmVlKSB7CisJCQkJCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKKwkJCQkJaWYgKGkgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikKKwkJCQkJCWkgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKKwkJCQkJYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKKwkJCQkJaWYgKCsrcnAtPnJ0b3J0X3BpcGVfY291bnQgPj0KKwkJCQkJICAgIFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CisJCQkJCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKKwkJCQkJCWxpc3RfZGVsKCZycC0+cnRvcnRfZnJlZSk7CisJCQkJCQlyY3VfdG9ydHVyZV9mcmVlKHJwKTsKKwkJCQkJfQorCQkJCSB9CisJCQl9CisJCX0KKwkJcmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MoKytyY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24pOworCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX3dyaXRlciIpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX3dyaXRlciIpOworCXJldHVybiAwOworfQorCisvKgorICogUkNVIHRvcnR1cmUgZmFrZSB3cml0ZXIga3RocmVhZC4gIFJlcGVhdGVkbHkgY2FsbHMgc3luYywgd2l0aCBhIHJhbmRvbQorICogZGVsYXkgYmV0d2VlbiBjYWxscy4KKyAqLworc3RhdGljIGludAorcmN1X3RvcnR1cmVfZmFrZXdyaXRlcih2b2lkICphcmcpCit7CisJREVGSU5FX1RPUlRVUkVfUkFORE9NKHJhbmQpOworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RhcnRlZCIpOworCXNldF91c2VyX25pY2UoY3VycmVudCwgTUFYX05JQ0UpOworCisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxICsgdG9ydHVyZV9yYW5kb20oJnJhbmQpJTEwKTsKKwkJdWRlbGF5KHRvcnR1cmVfcmFuZG9tKCZyYW5kKSAmIDB4M2ZmKTsKKwkJaWYgKGN1cl9vcHMtPmNiX2JhcnJpZXIgIT0gTlVMTCAmJgorCQkgICAgdG9ydHVyZV9yYW5kb20oJnJhbmQpICUgKG5mYWtld3JpdGVycyAqIDgpID09IDApIHsKKwkJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKKwkJfSBlbHNlIGlmIChncF9ub3JtYWwgPT0gZ3BfZXhwKSB7CisJCQlpZiAodG9ydHVyZV9yYW5kb20oJnJhbmQpICYgMHg4MCkKKwkJCQljdXJfb3BzLT5zeW5jKCk7CisJCQllbHNlCisJCQkJY3VyX29wcy0+ZXhwX3N5bmMoKTsKKwkJfSBlbHNlIGlmIChncF9ub3JtYWwpIHsKKwkJCWN1cl9vcHMtPnN5bmMoKTsKKwkJfSBlbHNlIHsKKwkJCWN1cl9vcHMtPmV4cF9zeW5jKCk7CisJCX0KKwkJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmN1dG9ydHVyZV90cmFjZV9kdW1wKHZvaWQpCit7CisJc3RhdGljIGF0b21pY190IGJlZW5oZXJlID0gQVRPTUlDX0lOSVQoMCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmJlZW5oZXJlKSkKKwkJcmV0dXJuOworCWlmIChhdG9taWNfeGNoZygmYmVlbmhlcmUsIDEpICE9IDApCisJCXJldHVybjsKKwlmdHJhY2VfZHVtcChEVU1QX0FMTCk7Cit9CisKKy8qCisgKiBSQ1UgdG9ydHVyZSByZWFkZXIgZnJvbSB0aW1lciBoYW5kbGVyLiAgRGVyZWZlcmVuY2VzIHJjdV90b3J0dXJlX2N1cnJlbnQsCisgKiBpbmNyZW1lbnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgcGlwZWxpbmUgYXJyYXkuICBUaGUKKyAqIGNvdW50ZXIgaW4gdGhlIGVsZW1lbnQgc2hvdWxkIG5ldmVyIGJlIGdyZWF0ZXIgdGhhbiAxLCBvdGhlcndpc2UsIHRoZQorICogUkNVIGltcGxlbWVudGF0aW9uIGlzIGJyb2tlbi4KKyAqLworc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfdGltZXIodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJaW50IGlkeDsKKwlpbnQgY29tcGxldGVkOworCWludCBjb21wbGV0ZWRfZW5kOworCXN0YXRpYyBERUZJTkVfVE9SVFVSRV9SQU5ET00ocmFuZCk7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhyYW5kX2xvY2spOworCXN0cnVjdCByY3VfdG9ydHVyZSAqcDsKKwlpbnQgcGlwZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHM7CisKKwlpZHggPSBjdXJfb3BzLT5yZWFkbG9jaygpOworCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOworCXRzID0gcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKCk7CisJcCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAorCQkJCSAgcmN1X3JlYWRfbG9ja19iaF9oZWxkKCkgfHwKKwkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8CisJCQkJICBzcmN1X3JlYWRfbG9ja19oZWxkKCZzcmN1X2N0bCkpOworCWlmIChwID09IE5VTEwpIHsKKwkJLyogTGVhdmUgYmVjYXVzZSByY3VfdG9ydHVyZV93cml0ZXIgaXMgbm90IHlldCB1bmRlcndheSAqLworCQljdXJfb3BzLT5yZWFkdW5sb2NrKGlkeCk7CisJCXJldHVybjsKKwl9CisJaWYgKHAtPnJ0b3J0X21idGVzdCA9PSAwKQorCQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpOworCXNwaW5fbG9jaygmcmFuZF9sb2NrKTsKKwljdXJfb3BzLT5yZWFkX2RlbGF5KCZyYW5kKTsKKwluX3JjdV90b3J0dXJlX3RpbWVycysrOworCXNwaW5fdW5sb2NrKCZyYW5kX2xvY2spOworCXByZWVtcHRfZGlzYWJsZSgpOworCXBpcGVfY291bnQgPSBwLT5ydG9ydF9waXBlX2NvdW50OworCWlmIChwaXBlX2NvdW50ID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKKwkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dC4uLiAqLworCQlwaXBlX2NvdW50ID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJfQorCWNvbXBsZXRlZF9lbmQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKTsKKwlpZiAocGlwZV9jb3VudCA+IDEpIHsKKwkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1LCB0cywKKwkJCQkJICBjb21wbGV0ZWQsIGNvbXBsZXRlZF9lbmQpOworCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKKwl9CisJX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfY291bnRbcGlwZV9jb3VudF0pOworCWNvbXBsZXRlZCA9IGNvbXBsZXRlZF9lbmQgLSBjb21wbGV0ZWQ7CisJaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CisJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KKwkJY29tcGxldGVkID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJfQorCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2JhdGNoW2NvbXBsZXRlZF0pOworCXByZWVtcHRfZW5hYmxlKCk7CisJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOworfQorCisvKgorICogUkNVIHRvcnR1cmUgcmVhZGVyIGt0aHJlYWQuICBSZXBlYXRlZGx5IGRlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAorICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCisgKiBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNob3VsZCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMSwgb3RoZXJ3aXNlLCB0aGUKKyAqIFJDVSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4uCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX3JlYWRlcih2b2lkICphcmcpCit7CisJaW50IGNvbXBsZXRlZDsKKwlpbnQgY29tcGxldGVkX2VuZDsKKwlpbnQgaWR4OworCURFRklORV9UT1JUVVJFX1JBTkRPTShyYW5kKTsKKwlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnA7CisJaW50IHBpcGVfY291bnQ7CisJc3RydWN0IHRpbWVyX2xpc3QgdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHM7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0YXJ0ZWQiKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIE1BWF9OSUNFKTsKKwlpZiAoaXJxcmVhZGVyICYmIGN1cl9vcHMtPmlycV9jYXBhYmxlKQorCQlzZXR1cF90aW1lcl9vbl9zdGFjaygmdCwgcmN1X3RvcnR1cmVfdGltZXIsIDApOworCisJZG8geworCQlpZiAoaXJxcmVhZGVyICYmIGN1cl9vcHMtPmlycV9jYXBhYmxlKSB7CisJCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnQpKQorCQkJCW1vZF90aW1lcigmdCwgamlmZmllcyArIDEpOworCQl9CisJCWlkeCA9IGN1cl9vcHMtPnJlYWRsb2NrKCk7CisJCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOworCQl0cyA9IHJjdV90cmFjZV9jbG9ja19sb2NhbCgpOworCQlwID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHJjdV90b3J0dXJlX2N1cnJlbnQsCisJCQkJCSAgcmN1X3JlYWRfbG9ja19iaF9oZWxkKCkgfHwKKwkJCQkJICByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQoKSB8fAorCQkJCQkgIHNyY3VfcmVhZF9sb2NrX2hlbGQoJnNyY3VfY3RsKSk7CisJCWlmIChwID09IE5VTEwpIHsKKwkJCS8qIFdhaXQgZm9yIHJjdV90b3J0dXJlX3dyaXRlciB0byBnZXQgdW5kZXJ3YXkgKi8KKwkJCWN1cl9vcHMtPnJlYWR1bmxvY2soaWR4KTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocC0+cnRvcnRfbWJ0ZXN0ID09IDApCisJCQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpOworCQljdXJfb3BzLT5yZWFkX2RlbGF5KCZyYW5kKTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXBpcGVfY291bnQgPSBwLT5ydG9ydF9waXBlX2NvdW50OworCQlpZiAocGlwZV9jb3VudCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CisJCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCisJCQlwaXBlX2NvdW50ID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJCX0KKwkJY29tcGxldGVkX2VuZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOworCQlpZiAocGlwZV9jb3VudCA+IDEpIHsKKwkJCWRvX3RyYWNlX3JjdV90b3J0dXJlX3JlYWQoY3VyX29wcy0+bmFtZSwgJnAtPnJ0b3J0X3JjdSwKKwkJCQkJCSAgdHMsIGNvbXBsZXRlZCwgY29tcGxldGVkX2VuZCk7CisJCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKKwkJfQorCQlfX3RoaXNfY3B1X2luYyhyY3VfdG9ydHVyZV9jb3VudFtwaXBlX2NvdW50XSk7CisJCWNvbXBsZXRlZCA9IGNvbXBsZXRlZF9lbmQgLSBjb21wbGV0ZWQ7CisJCWlmIChjb21wbGV0ZWQgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgeworCQkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dC4uLiAqLworCQkJY29tcGxldGVkID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJCX0KKwkJX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfYmF0Y2hbY29tcGxldGVkXSk7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCWN1cl9vcHMtPnJlYWR1bmxvY2soaWR4KTsKKwkJc2NoZWR1bGUoKTsKKwkJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9yZWFkZXIiKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJaWYgKGlycXJlYWRlciAmJiBjdXJfb3BzLT5pcnFfY2FwYWJsZSkKKwkJZGVsX3RpbWVyX3N5bmMoJnQpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygicmN1X3RvcnR1cmVfcmVhZGVyIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gUkNVLXRvcnR1cmUgc3RhdGlzdGljcyBtZXNzYWdlIGluIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZAorcmN1X3RvcnR1cmVfcHJpbnRrKGNoYXIgKnBhZ2UpCit7CisJaW50IGNwdTsKKwlpbnQgaTsKKwlsb25nIHBpcGVzdW1tYXJ5W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0gPSB7IDAgfTsKKwlsb25nIGJhdGNoc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykgeworCQkJcGlwZXN1bW1hcnlbaV0gKz0gcGVyX2NwdShyY3VfdG9ydHVyZV9jb3VudCwgY3B1KVtpXTsKKwkJCWJhdGNoc3VtbWFyeVtpXSArPSBwZXJfY3B1KHJjdV90b3J0dXJlX2JhdGNoLCBjcHUpW2ldOworCQl9CisJfQorCWZvciAoaSA9IFJDVV9UT1JUVVJFX1BJUEVfTEVOIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHBpcGVzdW1tYXJ5W2ldICE9IDApCisJCQlicmVhazsKKwl9CisJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwKKwkJICAgICAgICJydGM6ICVwIHZlcjogJWx1IHRmbGU6ICVkIHJ0YTogJWQgcnRhZjogJWQgcnRmOiAlZCAiLAorCQkgICAgICAgcmN1X3RvcnR1cmVfY3VycmVudCwKKwkJICAgICAgIHJjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbiwKKwkJICAgICAgIGxpc3RfZW1wdHkoJnJjdV90b3J0dXJlX2ZyZWVsaXN0KSwKKwkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jKSwKKwkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwpLAorCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfZnJlZSkpOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAicnRtYmU6ICVkIHJ0YmtlOiAlbGQgcnRicmU6ICVsZCAiLAorCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvciksCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yLAorCQkgICAgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgInJ0YmY6ICVsZCBydGI6ICVsZCBudDogJWxkICIsCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUsCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0cywKKwkJICAgICAgIG5fcmN1X3RvcnR1cmVfdGltZXJzKTsKKwlwYWdlID0gdG9ydHVyZV9vbm9mZl9zdGF0cyhwYWdlKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgImJhcnJpZXI6ICVsZC8lbGQ6JWxkIiwKKwkJICAgICAgIG5fYmFycmllcl9zdWNjZXNzZXMsCisJCSAgICAgICBuX2JhcnJpZXJfYXR0ZW1wdHMsCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IpOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlpZiAoYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvcikgIT0gMCB8fAorCSAgICBuX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IgIT0gMCB8fAorCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yICE9IDAgfHwKKwkgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yICE9IDAgfHwKKwkgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlICE9IDAgfHwKKwkgICAgaSA+IDEpIHsKKwkJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIhISEgIik7CisJCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfZXJyb3IpOworCQlXQVJOX09OX09OQ0UoMSk7CisJfQorCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiUmVhZGVyIFBpcGU6ICIpOworCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykKKwkJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIgJWxkIiwgcGlwZXN1bW1hcnlbaV0pOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgIlJlYWRlciBCYXRjaDogIik7CisJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQorCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlbGQiLCBiYXRjaHN1bW1hcnlbaV0pOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgIkZyZWUtQmxvY2sgQ2lyY3VsYXRpb246ICIpOworCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykgeworCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlZCIsCisJCQkgICAgICAgYXRvbWljX3JlYWQoJnJjdV90b3J0dXJlX3djb3VudFtpXSkpOworCX0KKwlwYWdlICs9IHNwcmludGYocGFnZSwgIlxuIik7CisJaWYgKGN1cl9vcHMtPnN0YXRzKQorCQljdXJfb3BzLT5zdGF0cyhwYWdlKTsKK30KKworLyoKKyAqIFByaW50IHRvcnR1cmUgc3RhdGlzdGljcy4gIENhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIG9ubHkKKyAqIG9uZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gYXQgYSBnaXZlbiB0aW1lISEhICBUaGlzIGlzIG5vcm1hbGx5CisgKiBhY2NvbXBsaXNoZWQgYnkgcmVseWluZyBvbiB0aGUgbW9kdWxlIHN5c3RlbSB0byBvbmx5IGhhdmUgb25lIGNvcHkKKyAqIG9mIHRoZSBtb2R1bGUgbG9hZGVkLCBhbmQgdGhlbiBieSBnaXZpbmcgdGhlIHJjdV90b3J0dXJlX3N0YXRzCisgKiBrdGhyZWFkIGZ1bGwgY29udHJvbCAob3IgdGhlIGluaXQvY2xlYW51cCBmdW5jdGlvbnMgd2hlbiByY3VfdG9ydHVyZV9zdGF0cworICogdGhyZWFkIGlzIG5vdCBydW5uaW5nKS4KKyAqLworc3RhdGljIHZvaWQKK3JjdV90b3J0dXJlX3N0YXRzX3ByaW50KHZvaWQpCit7CisJaW50IHNpemUgPSBucl9jcHVfaWRzICogMjAwICsgODE5MjsKKwljaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXByX2VycigicmN1LXRvcnR1cmU6IE91dCBvZiBtZW1vcnksIG5lZWQ6ICVkIiwgc2l6ZSk7CisJCXJldHVybjsKKwl9CisJcmN1X3RvcnR1cmVfcHJpbnRrKGJ1Zik7CisJcHJfYWxlcnQoIiVzIiwgYnVmKTsKKwlrZnJlZShidWYpOworfQorCisvKgorICogUGVyaW9kaWNhbGx5IHByaW50cyB0b3J0dXJlIHN0YXRpc3RpY3MsIGlmIHBlcmlvZGljIHN0YXRpc3RpY3MgcHJpbnRpbmcKKyAqIHdhcyBzcGVjaWZpZWQgdmlhIHRoZSBzdGF0X2ludGVydmFsIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX3N0YXRzKHZvaWQgKmFyZykKK3sKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3N0YXRzIHRhc2sgc3RhcnRlZCIpOworCWRvIHsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7CisJCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zdGF0cyIpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX3N0YXRzIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgKmN1cl9vcHMsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkgIi0tLSAlczogbnJlYWRlcnM9JWQgbmZha2V3cml0ZXJzPSVkICIKKwkJICJzdGF0X2ludGVydmFsPSVkIHZlcmJvc2U9JWQgdGVzdF9ub19pZGxlX2h6PSVkICIKKwkJICJzaHVmZmxlX2ludGVydmFsPSVkIHN0dXR0ZXI9JWQgaXJxcmVhZGVyPSVkICIKKwkJICJmcXNfZHVyYXRpb249JWQgZnFzX2hvbGRvZmY9JWQgZnFzX3N0dXR0ZXI9JWQgIgorCQkgInRlc3RfYm9vc3Q9JWQvJWQgdGVzdF9ib29zdF9pbnRlcnZhbD0lZCAiCisJCSAidGVzdF9ib29zdF9kdXJhdGlvbj0lZCBzaHV0ZG93bl9zZWNzPSVkICIKKwkJICJzdGFsbF9jcHU9JWQgc3RhbGxfY3B1X2hvbGRvZmY9JWQgIgorCQkgIm5fYmFycmllcl9jYnM9JWQgIgorCQkgIm9ub2ZmX2ludGVydmFsPSVkIG9ub2ZmX2hvbGRvZmY9JWRcbiIsCisJCSB0b3J0dXJlX3R5cGUsIHRhZywgbnJlYWxyZWFkZXJzLCBuZmFrZXdyaXRlcnMsCisJCSBzdGF0X2ludGVydmFsLCB2ZXJib3NlLCB0ZXN0X25vX2lkbGVfaHosIHNodWZmbGVfaW50ZXJ2YWwsCisJCSBzdHV0dGVyLCBpcnFyZWFkZXIsIGZxc19kdXJhdGlvbiwgZnFzX2hvbGRvZmYsIGZxc19zdHV0dGVyLAorCQkgdGVzdF9ib29zdCwgY3VyX29wcy0+Y2FuX2Jvb3N0LAorCQkgdGVzdF9ib29zdF9pbnRlcnZhbCwgdGVzdF9ib29zdF9kdXJhdGlvbiwgc2h1dGRvd25fc2VjcywKKwkJIHN0YWxsX2NwdSwgc3RhbGxfY3B1X2hvbGRvZmYsCisJCSBuX2JhcnJpZXJfY2JzLAorCQkgb25vZmZfaW50ZXJ2YWwsIG9ub2ZmX2hvbGRvZmYpOworfQorCitzdGF0aWMgdm9pZCByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmIChib29zdF90YXNrc1tjcHVdID09IE5VTEwpCisJCXJldHVybjsKKwltdXRleF9sb2NrKCZib29zdF9tdXRleCk7CisJdCA9IGJvb3N0X3Rhc2tzW2NwdV07CisJYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZib29zdF9tdXRleCk7CisKKwkvKiBUaGlzIG11c3QgYmUgb3V0c2lkZSBvZiB0aGUgbXV0ZXgsIG90aGVyd2lzZSBkZWFkbG9jayEgKi8KKwl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9ib29zdCwgdCk7Cit9CisKK3N0YXRpYyBpbnQgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaW50IGNwdSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGJvb3N0X3Rhc2tzW2NwdV0gIT0gTlVMTCkKKwkJcmV0dXJuIDA7ICAvKiBBbHJlYWR5IGNyZWF0ZWQsIG5vdGhpbmcgbW9yZSB0byBkby4gKi8KKworCS8qIERvbid0IGFsbG93IHRpbWUgcmVjYWxjdWxhdGlvbiB3aGlsZSBjcmVhdGluZyBhIG5ldyB0YXNrLiAqLworCW11dGV4X2xvY2soJmJvb3N0X211dGV4KTsKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoIkNyZWF0aW5nIHJjdV90b3J0dXJlX2Jvb3N0IHRhc2siKTsKKwlib29zdF90YXNrc1tjcHVdID0ga3RocmVhZF9jcmVhdGVfb25fbm9kZShyY3VfdG9ydHVyZV9ib29zdCwgTlVMTCwKKwkJCQkJCSAgY3B1X3RvX25vZGUoY3B1KSwKKwkJCQkJCSAgInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJaWYgKElTX0VSUihib29zdF90YXNrc1tjcHVdKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGJvb3N0X3Rhc2tzW2NwdV0pOworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IHRhc2sgY3JlYXRlIGZhaWxlZCIpOworCQluX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yKys7CisJCWJvb3N0X3Rhc2tzW2NwdV0gPSBOVUxMOworCQltdXRleF91bmxvY2soJmJvb3N0X211dGV4KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJa3RocmVhZF9iaW5kKGJvb3N0X3Rhc2tzW2NwdV0sIGNwdSk7CisJd2FrZV91cF9wcm9jZXNzKGJvb3N0X3Rhc2tzW2NwdV0pOworCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgorICogQ1BVLXN0YWxsIGt0aHJlYWQuICBJdCB3YWl0cyBhcyBzcGVjaWZpZWQgYnkgc3RhbGxfY3B1X2hvbGRvZmYsIHRoZW4KKyAqIGluZHVjZXMgYSBDUFUgc3RhbGwgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSBzdGFsbF9jcHUuCisgKi8KK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfc3RhbGwodm9pZCAqYXJncykKK3sKKwl1bnNpZ25lZCBsb25nIHN0b3BfYXQ7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3N0YWxsIHRhc2sgc3RhcnRlZCIpOworCWlmIChzdGFsbF9jcHVfaG9sZG9mZiA+IDApIHsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9zdGFsbCBiZWdpbiBob2xkb2ZmIik7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdGFsbF9jcHVfaG9sZG9mZiAqIEhaKTsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9zdGFsbCBlbmQgaG9sZG9mZiIpOworCX0KKwlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzdG9wX2F0ID0gZ2V0X3NlY29uZHMoKSArIHN0YWxsX2NwdTsKKwkJLyogUkNVIENQVSBzdGFsbCBpcyBleHBlY3RlZCBiZWhhdmlvciBpbiBmb2xsb3dpbmcgY29kZS4gKi8KKwkJcHJfYWxlcnQoInJjdV90b3J0dXJlX3N0YWxsIHN0YXJ0LlxuIik7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXdoaWxlIChVTE9OR19DTVBfTFQoZ2V0X3NlY29uZHMoKSwgc3RvcF9hdCkpCisJCQljb250aW51ZTsgIC8qIEluZHVjZSBSQ1UgQ1BVIHN0YWxsIHdhcm5pbmcuICovCisJCXByZWVtcHRfZW5hYmxlKCk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlwcl9hbGVydCgicmN1X3RvcnR1cmVfc3RhbGwgZW5kLlxuIik7CisJfQorCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zdGFsbCIpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMTAgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNwYXduIENQVS1zdGFsbCBrdGhyZWFkLCBpZiBzdGFsbF9jcHUgc3BlY2lmaWVkLiAqLworc3RhdGljIGludCBfX2luaXQgcmN1X3RvcnR1cmVfc3RhbGxfaW5pdCh2b2lkKQoreworCWlmIChzdGFsbF9jcHUgPD0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfc3RhbGwsIE5VTEwsIHN0YWxsX3Rhc2spOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgUkNVIGJhcnJpZXIgdGVzdGluZy4gKi8KK3ZvaWQgcmN1X3RvcnR1cmVfYmFycmllcl9jYmYoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJYXRvbWljX2luYygmYmFycmllcl9jYnNfaW52b2tlZCk7Cit9CisKKy8qIGt0aHJlYWQgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHVzZWQgdG8gdGVzdCBSQ1UgYmFycmllcnMuICovCitzdGF0aWMgaW50IHJjdV90b3J0dXJlX2JhcnJpZXJfY2JzKHZvaWQgKmFyZykKK3sKKwlsb25nIG15aWQgPSAobG9uZylhcmc7CisJYm9vbCBsYXN0cGhhc2UgPSAwOworCWJvb2wgbmV3cGhhc2U7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKworCWluaXRfcmN1X2hlYWRfb25fc3RhY2soJnJjdSk7CisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9iYXJyaWVyX2NicyB0YXNrIHN0YXJ0ZWQiKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIE1BWF9OSUNFKTsKKwlkbyB7CisJCXdhaXRfZXZlbnQoYmFycmllcl9jYnNfd3FbbXlpZF0sCisJCQkgICAobmV3cGhhc2UgPQorCQkJICAgIEFDQ0VTU19PTkNFKGJhcnJpZXJfcGhhc2UpKSAhPSBsYXN0cGhhc2UgfHwKKwkJCSAgIHRvcnR1cmVfbXVzdF9zdG9wKCkpOworCQlsYXN0cGhhc2UgPSBuZXdwaGFzZTsKKwkJc21wX21iKCk7IC8qIGVuc3VyZSBiYXJyaWVyX3BoYXNlIGxvYWQgYmVmb3JlIC0+Y2FsbCgpLiAqLworCQlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCWJyZWFrOworCQljdXJfb3BzLT5jYWxsKCZyY3UsIHJjdV90b3J0dXJlX2JhcnJpZXJfY2JmKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJhcnJpZXJfY2JzX2NvdW50KSkKKwkJCXdha2VfdXAoJmJhcnJpZXJfd3EpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwljdXJfb3BzLT5jYl9iYXJyaWVyKCk7CisJZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjaygmcmN1KTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX2JhcnJpZXJfY2JzIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGt0aHJlYWQgZnVuY3Rpb24gdG8gZHJpdmUgYW5kIGNvb3JkaW5hdGUgUkNVIGJhcnJpZXIgdGVzdGluZy4gKi8KK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfYmFycmllcih2b2lkICphcmcpCit7CisJaW50IGk7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXIgdGFzayBzdGFydGluZyIpOworCWRvIHsKKwkJYXRvbWljX3NldCgmYmFycmllcl9jYnNfaW52b2tlZCwgMCk7CisJCWF0b21pY19zZXQoJmJhcnJpZXJfY2JzX2NvdW50LCBuX2JhcnJpZXJfY2JzKTsKKwkJc21wX21iKCk7IC8qIEVuc3VyZSBiYXJyaWVyX3BoYXNlIGFmdGVyIHByaW9yIGFzc2lnbm1lbnRzLiAqLworCQliYXJyaWVyX3BoYXNlID0gIWJhcnJpZXJfcGhhc2U7CisJCWZvciAoaSA9IDA7IGkgPCBuX2JhcnJpZXJfY2JzOyBpKyspCisJCQl3YWtlX3VwKCZiYXJyaWVyX2Nic193cVtpXSk7CisJCXdhaXRfZXZlbnQoYmFycmllcl93cSwKKwkJCSAgIGF0b21pY19yZWFkKCZiYXJyaWVyX2Nic19jb3VudCkgPT0gMCB8fAorCQkJICAgdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJCWlmICh0b3J0dXJlX211c3Rfc3RvcCgpKQorCQkJYnJlYWs7CisJCW5fYmFycmllcl9hdHRlbXB0cysrOworCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7IC8qIEltcGxpZXMgc21wX21iKCkgZm9yIHdhaXRfZXZlbnQoKS4gKi8KKwkJaWYgKGF0b21pY19yZWFkKCZiYXJyaWVyX2Nic19pbnZva2VkKSAhPSBuX2JhcnJpZXJfY2JzKSB7CisJCQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IrKzsKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJfQorCQluX2JhcnJpZXJfc3VjY2Vzc2VzKys7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWiAvIDEwKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJyY3VfdG9ydHVyZV9iYXJyaWVyIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgUkNVIGJhcnJpZXIgdGVzdGluZy4gKi8KK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfYmFycmllcl9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmIChuX2JhcnJpZXJfY2JzID09IDApCisJCXJldHVybiAwOworCWlmIChjdXJfb3BzLT5jYWxsID09IE5VTEwgfHwgY3VyX29wcy0+Y2JfYmFycmllciA9PSBOVUxMKSB7CisJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCisJCQkgIiBDYWxsIG9yIGJhcnJpZXIgb3BzIG1pc3NpbmcgZm9yICVzLFxuIiwKKwkJCSB0b3J0dXJlX3R5cGUsIGN1cl9vcHMtPm5hbWUpOworCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJICIgUkNVIGJhcnJpZXIgdGVzdGluZyBvbWl0dGVkIGZyb20gcnVuLlxuIiwKKwkJCSB0b3J0dXJlX3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisJYXRvbWljX3NldCgmYmFycmllcl9jYnNfY291bnQsIDApOworCWF0b21pY19zZXQoJmJhcnJpZXJfY2JzX2ludm9rZWQsIDApOworCWJhcnJpZXJfY2JzX3Rhc2tzID0KKwkJa3phbGxvYyhuX2JhcnJpZXJfY2JzICogc2l6ZW9mKGJhcnJpZXJfY2JzX3Rhc2tzWzBdKSwKKwkJCUdGUF9LRVJORUwpOworCWJhcnJpZXJfY2JzX3dxID0KKwkJa3phbGxvYyhuX2JhcnJpZXJfY2JzICogc2l6ZW9mKGJhcnJpZXJfY2JzX3dxWzBdKSwKKwkJCUdGUF9LRVJORUwpOworCWlmIChiYXJyaWVyX2Nic190YXNrcyA9PSBOVUxMIHx8ICFiYXJyaWVyX2Nic193cSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IG5fYmFycmllcl9jYnM7IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiYXJyaWVyX2Nic193cVtpXSk7CisJCXJldCA9IHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfYmFycmllcl9jYnMsCisJCQkJCSAgICAgKHZvaWQgKikobG9uZylpLAorCQkJCQkgICAgIGJhcnJpZXJfY2JzX3Rhc2tzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHJjdV90b3J0dXJlX2JhcnJpZXIsIE5VTEwsIGJhcnJpZXJfdGFzayk7Cit9CisKKy8qIENsZWFuIHVwIGFmdGVyIFJDVSBiYXJyaWVyIHRlc3RpbmcuICovCitzdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9iYXJyaWVyX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX2JhcnJpZXIsIGJhcnJpZXJfdGFzayk7CisJaWYgKGJhcnJpZXJfY2JzX3Rhc2tzICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5fYmFycmllcl9jYnM7IGkrKykKKwkJCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX2JhcnJpZXJfY2JzLAorCQkJCQkgICAgIGJhcnJpZXJfY2JzX3Rhc2tzW2ldKTsKKwkJa2ZyZWUoYmFycmllcl9jYnNfdGFza3MpOworCQliYXJyaWVyX2Nic190YXNrcyA9IE5VTEw7CisJfQorCWlmIChiYXJyaWVyX2Nic193cSAhPSBOVUxMKSB7CisJCWtmcmVlKGJhcnJpZXJfY2JzX3dxKTsKKwkJYmFycmllcl9jYnNfd3EgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlsb25nIGNwdSA9IChsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJKHZvaWQpcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChjcHUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX2NwdV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHJjdXRvcnR1cmVfY3B1X25vdGlmeSwKK307CisKK3N0YXRpYyB2b2lkCityY3VfdG9ydHVyZV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlyY3V0b3J0dXJlX3JlY29yZF90ZXN0X3RyYW5zaXRpb24oKTsKKwlpZiAodG9ydHVyZV9jbGVhbnVwKCkpIHsKKwkJaWYgKGN1cl9vcHMtPmNiX2JhcnJpZXIgIT0gTlVMTCkKKwkJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKKwkJcmV0dXJuOworCX0KKworCXJjdV90b3J0dXJlX2JhcnJpZXJfY2xlYW51cCgpOworCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX3N0YWxsLCBzdGFsbF90YXNrKTsKKwl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV93cml0ZXIsIHdyaXRlcl90YXNrKTsKKworCWlmIChyZWFkZXJfdGFza3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKQorCQkJdG9ydHVyZV9zdG9wX2t0aHJlYWQocmN1X3RvcnR1cmVfcmVhZGVyLAorCQkJCQkgICAgIHJlYWRlcl90YXNrc1tpXSk7CisJCWtmcmVlKHJlYWRlcl90YXNrcyk7CisJfQorCXJjdV90b3J0dXJlX2N1cnJlbnQgPSBOVUxMOworCisJaWYgKGZha2V3cml0ZXJfdGFza3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKSB7CisJCQl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9mYWtld3JpdGVyLAorCQkJCQkgICAgIGZha2V3cml0ZXJfdGFza3NbaV0pOworCQl9CisJCWtmcmVlKGZha2V3cml0ZXJfdGFza3MpOworCQlmYWtld3JpdGVyX3Rhc2tzID0gTlVMTDsKKwl9CisKKwl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9zdGF0cywgc3RhdHNfdGFzayk7CisJdG9ydHVyZV9zdG9wX2t0aHJlYWQocmN1X3RvcnR1cmVfZnFzLCBmcXNfdGFzayk7CisJaWYgKCh0ZXN0X2Jvb3N0ID09IDEgJiYgY3VyX29wcy0+Y2FuX2Jvb3N0KSB8fAorCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKKwkJdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpKTsKKwl9CisKKwkvKiBXYWl0IGZvciBhbGwgUkNVIGNhbGxiYWNrcyB0byBmaXJlLiAgKi8KKworCWlmIChjdXJfb3BzLT5jYl9iYXJyaWVyICE9IE5VTEwpCisJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKKworCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7ICAvKiAtQWZ0ZXItIHRoZSBzdGF0cyB0aHJlYWQgaXMgc3RvcHBlZCEgKi8KKworCWlmIChhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9lcnJvcikgfHwgbl9yY3VfdG9ydHVyZV9iYXJyaWVyX2Vycm9yKQorCQlyY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3VyX29wcywgIkVuZCBvZiB0ZXN0OiBGQUlMVVJFIik7CisJZWxzZSBpZiAodG9ydHVyZV9vbm9mZl9mYWlsdXJlcygpKQorCQlyY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3VyX29wcywKKwkJCQkJICAgICAgICJFbmQgb2YgdGVzdDogUkNVX0hPVFBMVUciKTsKKwllbHNlCisJCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLCAiRW5kIG9mIHRlc3Q6IFNVQ0NFU1MiKTsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFECitzdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9sZWFrX2NiKHN0cnVjdCByY3VfaGVhZCAqcmhwKQoreworfQorCitzdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9lcnJfY2Ioc3RydWN0IHJjdV9oZWFkICpyaHApCit7CisJLyoKKwkgKiBUaGlzIC1taWdodC0gaGFwcGVuIGR1ZSB0byByYWNlIGNvbmRpdGlvbnMsIGJ1dCBpcyB1bmxpa2VseS4KKwkgKiBUaGUgc2NlbmFyaW8gdGhhdCBsZWFkcyB0byB0aGlzIGhhcHBlbmluZyBpcyB0aGF0IHRoZQorCSAqIGZpcnN0IG9mIHRoZSBwYWlyIG9mIGR1cGxpY2F0ZSBjYWxsYmFja3MgaXMgcXVldWVkLAorCSAqIHNvbWVvbmUgZWxzZSBzdGFydHMgYSBncmFjZSBwZXJpb2QgdGhhdCBpbmNsdWRlcyB0aGF0CisJICogY2FsbGJhY2ssIHRoZW4gdGhlIHNlY29uZCBvZiB0aGUgcGFpciBtdXN0IHdhaXQgZm9yIHRoZQorCSAqIG5leHQgZ3JhY2UgcGVyaW9kLiAgVW5saWtlbHksIGJ1dCBjYW4gaGFwcGVuLiAgSWYgaXQKKwkgKiBkb2VzIGhhcHBlbiwgdGhlIGRlYnVnLW9iamVjdHMgc3Vic3lzdGVtIHdvbid0IGhhdmUgc3BsYXR0ZWQuCisJICovCisJcHJfYWxlcnQoInJjdXRvcnR1cmU6IGR1cGxpY2F0ZWQgY2FsbGJhY2sgd2FzIGludm9rZWQuXG4iKTsKK30KKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQgKi8KKworLyoKKyAqIFZlcmlmeSB0aGF0IGRvdWJsZS1mcmVlIGNhdXNlcyBkZWJ1Zy1vYmplY3RzIHRvIGNvbXBsYWluLCBidXQgb25seQorICogaWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9eS4gIE90aGVyd2lzZSwgc2F5IHRoYXQgdGhlIHRlc3QKKyAqIGNhbm5vdCBiZSBjYXJyaWVkIG91dC4KKyAqLworc3RhdGljIHZvaWQgcmN1X3Rlc3RfZGVidWdfb2JqZWN0cyh2b2lkKQoreworI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFECisJc3RydWN0IHJjdV9oZWFkIHJoMTsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmgyOworCisJaW5pdF9yY3VfaGVhZF9vbl9zdGFjaygmcmgxKTsKKwlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyaDIpOworCXByX2FsZXJ0KCJyY3V0b3J0dXJlOiBXQVJOOiBEdXBsaWNhdGUgY2FsbF9yY3UoKSB0ZXN0IHN0YXJ0aW5nLlxuIik7CisKKwkvKiBUcnkgdG8gcXVldWUgdGhlIHJoMiBwYWlyIG9mIGNhbGxiYWNrcyBmb3IgdGhlIHNhbWUgZ3JhY2UgcGVyaW9kLiAqLworCXByZWVtcHRfZGlzYWJsZSgpOyAvKiBQcmV2ZW50IHByZWVtcHRpb24gZnJvbSBpbnRlcnJ1cHRpbmcgdGVzdC4gKi8KKwlyY3VfcmVhZF9sb2NrKCk7IC8qIE1ha2UgaXQgaW1wb3NzaWJsZSB0byBmaW5pc2ggYSBncmFjZSBwZXJpb2QuICovCisJY2FsbF9yY3UoJnJoMSwgcmN1X3RvcnR1cmVfbGVha19jYik7IC8qIFN0YXJ0IGdyYWNlIHBlcmlvZC4gKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOyAvKiBNYWtlIGl0IGhhcmRlciB0byBzdGFydCBhIG5ldyBncmFjZSBwZXJpb2QuICovCisJY2FsbF9yY3UoJnJoMiwgcmN1X3RvcnR1cmVfbGVha19jYik7CisJY2FsbF9yY3UoJnJoMiwgcmN1X3RvcnR1cmVfZXJyX2NiKTsgLyogRHVwbGljYXRlIGNhbGxiYWNrLiAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJLyogV2FpdCBmb3IgdGhlbSBhbGwgdG8gZ2V0IGRvbmUgc28gd2UgY2FuIHNhZmVseSByZXR1cm4uICovCisJcmN1X2JhcnJpZXIoKTsKKwlwcl9hbGVydCgicmN1dG9ydHVyZTogV0FSTjogRHVwbGljYXRlIGNhbGxfcmN1KCkgdGVzdCBjb21wbGV0ZS5cbiIpOworCWRlc3Ryb3lfcmN1X2hlYWRfb25fc3RhY2soJnJoMSk7CisJZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjaygmcmgyKTsKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLworCXByX2FsZXJ0KCJyY3V0b3J0dXJlOiAhQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQsIG5vdCB0ZXN0aW5nIGR1cGxpY2F0ZSBjYWxsX3JjdSgpXG4iKTsKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQgKi8KK30KKworc3RhdGljIGludCBfX2luaXQKK3JjdV90b3J0dXJlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgY3B1OworCWludCBmaXJzdGVyciA9IDA7CisJc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgKnRvcnR1cmVfb3BzW10gPSB7CisJCSZyY3Vfb3BzLCAmcmN1X2JoX29wcywgJnJjdV9idXN0ZWRfb3BzLCAmc3JjdV9vcHMsICZzY2hlZF9vcHMsCisJfTsKKworCXRvcnR1cmVfaW5pdF9iZWdpbih0b3J0dXJlX3R5cGUsIHZlcmJvc2UsICZyY3V0b3J0dXJlX3J1bm5hYmxlKTsKKworCS8qIFByb2Nlc3MgYXJncyBhbmQgdGVsbCB0aGUgd29ybGQgdGhhdCB0aGUgdG9ydHVyZXIgaXMgb24gdGhlIGpvYi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b3J0dXJlX29wcyk7IGkrKykgeworCQljdXJfb3BzID0gdG9ydHVyZV9vcHNbaV07CisJCWlmIChzdHJjbXAodG9ydHVyZV90eXBlLCBjdXJfb3BzLT5uYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUodG9ydHVyZV9vcHMpKSB7CisJCXByX2FsZXJ0KCJyY3UtdG9ydHVyZTogaW52YWxpZCB0b3J0dXJlIHR5cGU6IFwiJXNcIlxuIiwKKwkJCSB0b3J0dXJlX3R5cGUpOworCQlwcl9hbGVydCgicmN1LXRvcnR1cmUgdHlwZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKQorCQkJcHJfYWxlcnQoIiAlcyIsIHRvcnR1cmVfb3BzW2ldLT5uYW1lKTsKKwkJcHJfYWxlcnQoIlxuIik7CisJCXRvcnR1cmVfaW5pdF9lbmQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjdXJfb3BzLT5mcXMgPT0gTlVMTCAmJiBmcXNfZHVyYXRpb24gIT0gMCkgeworCQlwcl9hbGVydCgicmN1LXRvcnR1cmU6IC0+ZnFzIE5VTEwgYW5kIG5vbi16ZXJvIGZxc19kdXJhdGlvbiwgZnFzIGRpc2FibGVkLlxuIik7CisJCWZxc19kdXJhdGlvbiA9IDA7CisJfQorCWlmIChjdXJfb3BzLT5pbml0KQorCQljdXJfb3BzLT5pbml0KCk7IC8qIG5vICJnb3RvIHVud2luZCIgcHJpb3IgdG8gdGhpcyBwb2ludCEhISAqLworCisJaWYgKG5yZWFkZXJzID49IDApCisJCW5yZWFscmVhZGVycyA9IG5yZWFkZXJzOworCWVsc2UKKwkJbnJlYWxyZWFkZXJzID0gMiAqIG51bV9vbmxpbmVfY3B1cygpOworCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLCAiU3RhcnQgb2YgdGVzdCIpOworCisJLyogU2V0IHVwIHRoZSBmcmVlbGlzdC4gKi8KKworCUlOSVRfTElTVF9IRUFEKCZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmN1X3RvcnR1cmVzKTsgaSsrKSB7CisJCXJjdV90b3J0dXJlc1tpXS5ydG9ydF9tYnRlc3QgPSAwOworCQlsaXN0X2FkZF90YWlsKCZyY3VfdG9ydHVyZXNbaV0ucnRvcnRfZnJlZSwKKwkJCSAgICAgICZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBzbyB0aGF0IGVhY2ggcnVuIGdldHMgaXRzIG93biBudW1iZXJzLiAqLworCisJcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7CisJcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uID0gMDsKKwlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jLCAwKTsKKwlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwsIDApOworCWF0b21pY19zZXQoJm5fcmN1X3RvcnR1cmVfZnJlZSwgMCk7CisJYXRvbWljX3NldCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yLCAwKTsKKwlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2Vycm9yLCAwKTsKKwluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IgPSAwOworCW5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgPSAwOworCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvciA9IDA7CisJbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlID0gMDsKKwluX3JjdV90b3J0dXJlX2Jvb3N0cyA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQorCQlhdG9taWNfc2V0KCZyY3VfdG9ydHVyZV93Y291bnRbaV0sIDApOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7CisJCQlwZXJfY3B1KHJjdV90b3J0dXJlX2NvdW50LCBjcHUpW2ldID0gMDsKKwkJCXBlcl9jcHUocmN1X3RvcnR1cmVfYmF0Y2gsIGNwdSlbaV0gPSAwOworCQl9CisJfQorCisJLyogU3RhcnQgdXAgdGhlIGt0aHJlYWRzLiAqLworCisJZmlyc3RlcnIgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHJjdV90b3J0dXJlX3dyaXRlciwgTlVMTCwKKwkJCQkJICB3cml0ZXJfdGFzayk7CisJaWYgKGZpcnN0ZXJyKQorCQlnb3RvIHVud2luZDsKKwlmYWtld3JpdGVyX3Rhc2tzID0ga3phbGxvYyhuZmFrZXdyaXRlcnMgKiBzaXplb2YoZmFrZXdyaXRlcl90YXNrc1swXSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKGZha2V3cml0ZXJfdGFza3MgPT0gTlVMTCkgeworCQlWRVJCT1NFX1RPUk9VVF9FUlJTVFJJTkcoIm91dCBvZiBtZW1vcnkiKTsKKwkJZmlyc3RlcnIgPSAtRU5PTUVNOworCQlnb3RvIHVud2luZDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9jcmVhdGVfa3RocmVhZChyY3VfdG9ydHVyZV9mYWtld3JpdGVyLAorCQkJCQkJICBOVUxMLCBmYWtld3JpdGVyX3Rhc2tzW2ldKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCXJlYWRlcl90YXNrcyA9IGt6YWxsb2MobnJlYWxyZWFkZXJzICogc2l6ZW9mKHJlYWRlcl90YXNrc1swXSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJlYWRlcl90YXNrcyA9PSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX0VSUlNUUklORygib3V0IG9mIG1lbW9yeSIpOworCQlmaXJzdGVyciA9IC1FTk9NRU07CisJCWdvdG8gdW53aW5kOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnJlYWxyZWFkZXJzOyBpKyspIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHJjdV90b3J0dXJlX3JlYWRlciwgTlVMTCwKKwkJCQkJCSAgcmVhZGVyX3Rhc2tzW2ldKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCWlmIChzdGF0X2ludGVydmFsID4gMCkgeworCQlmaXJzdGVyciA9IHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfc3RhdHMsIE5VTEwsCisJCQkJCQkgIHN0YXRzX3Rhc2spOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJaWYgKHRlc3Rfbm9faWRsZV9oeikgeworCQlmaXJzdGVyciA9IHRvcnR1cmVfc2h1ZmZsZV9pbml0KHNodWZmbGVfaW50ZXJ2YWwgKiBIWik7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAoc3R1dHRlciA8IDApCisJCXN0dXR0ZXIgPSAwOworCWlmIChzdHV0dGVyKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9zdHV0dGVyX2luaXQoc3R1dHRlciAqIEhaKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCWlmIChmcXNfZHVyYXRpb24gPCAwKQorCQlmcXNfZHVyYXRpb24gPSAwOworCWlmIChmcXNfZHVyYXRpb24pIHsKKwkJLyogQ3JlYXRlIHRoZSBmcXMgdGhyZWFkICovCisJCXRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfZnFzLCBOVUxMLCBmcXNfdGFzayk7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAodGVzdF9ib29zdF9pbnRlcnZhbCA8IDEpCisJCXRlc3RfYm9vc3RfaW50ZXJ2YWwgPSAxOworCWlmICh0ZXN0X2Jvb3N0X2R1cmF0aW9uIDwgMikKKwkJdGVzdF9ib29zdF9kdXJhdGlvbiA9IDI7CisJaWYgKCh0ZXN0X2Jvb3N0ID09IDEgJiYgY3VyX29wcy0+Y2FuX2Jvb3N0KSB8fAorCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKKworCQlib29zdF9zdGFydHRpbWUgPSBqaWZmaWVzICsgdGVzdF9ib29zdF9pbnRlcnZhbCAqIEhaOworCQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJCWlmIChjcHVfaXNfb2ZmbGluZShpKSkKKwkJCQljb250aW51ZTsgIC8qIEhldXJpc3RpYzogQ1BVIGNhbiBnbyBvZmZsaW5lLiAqLworCQkJZmlyc3RlcnIgPSByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChpKTsKKwkJCWlmIChmaXJzdGVycikKKwkJCQlnb3RvIHVud2luZDsKKwkJfQorCX0KKwlmaXJzdGVyciA9IHRvcnR1cmVfc2h1dGRvd25faW5pdChzaHV0ZG93bl9zZWNzLCByY3VfdG9ydHVyZV9jbGVhbnVwKTsKKwlpZiAoZmlyc3RlcnIpCisJCWdvdG8gdW53aW5kOworCWZpcnN0ZXJyID0gdG9ydHVyZV9vbm9mZl9pbml0KG9ub2ZmX2hvbGRvZmYgKiBIWiwgb25vZmZfaW50ZXJ2YWwgKiBIWik7CisJaWYgKGZpcnN0ZXJyKQorCQlnb3RvIHVud2luZDsKKwlmaXJzdGVyciA9IHJjdV90b3J0dXJlX3N0YWxsX2luaXQoKTsKKwlpZiAoZmlyc3RlcnIpCisJCWdvdG8gdW53aW5kOworCWZpcnN0ZXJyID0gcmN1X3RvcnR1cmVfYmFycmllcl9pbml0KCk7CisJaWYgKGZpcnN0ZXJyKQorCQlnb3RvIHVud2luZDsKKwlpZiAob2JqZWN0X2RlYnVnKQorCQlyY3VfdGVzdF9kZWJ1Z19vYmplY3RzKCk7CisJcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7CisJdG9ydHVyZV9pbml0X2VuZCgpOworCXJldHVybiAwOworCit1bndpbmQ6CisJdG9ydHVyZV9pbml0X2VuZCgpOworCXJjdV90b3J0dXJlX2NsZWFudXAoKTsKKwlyZXR1cm4gZmlyc3RlcnI7Cit9CisKK21vZHVsZV9pbml0KHJjdV90b3J0dXJlX2luaXQpOworbW9kdWxlX2V4aXQocmN1X3RvcnR1cmVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3NyY3UuYyBiL2tlcm5lbC9yY3Uvc3JjdS5jCmluZGV4IDMzMThkODIuLmM2Mzk1NTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3Uvc3JjdS5jCisrKyBiL2tlcm5lbC9yY3Uvc3JjdS5jCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNgogICogQ29weXJpZ2h0IChDKSBGdWppdHN1LCAyMDEyCkBAIC0zNiw4ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CiAKLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcmN1Lmg+Ci0KICNpbmNsdWRlICJyY3UuaCIKIAogLyoKQEAgLTM5OCw3ICszOTYsNyBAQAogCXJjdV9iYXRjaF9xdWV1ZSgmc3AtPmJhdGNoX3F1ZXVlLCBoZWFkKTsKIAlpZiAoIXNwLT5ydW5uaW5nKSB7CiAJCXNwLT5ydW5uaW5nID0gdHJ1ZTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzcC0+d29yaywgMCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmc3AtPndvcmssIDApOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+cXVldWVfbG9jaywgZmxhZ3MpOwogfQpAQCAtNjc0LDcgKzY3Miw4IEBACiAJfQogCiAJaWYgKHBlbmRpbmcpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc3AtPndvcmssIFNSQ1VfSU5URVJWQUwpOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkgICAmc3AtPndvcmssIFNSQ1VfSU5URVJWQUwpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90aW55LmMgYi9rZXJuZWwvcmN1L3RpbnkuYwppbmRleCAxMjU0ZjMxLi5kOWVmY2MxMyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90aW55LmMKKysrIGIva2VybmVsL3JjdS90aW55LmMKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCkBAIC0zNywxMCArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CiAKLSNpZmRlZiBDT05GSUdfUkNVX1RSQUNFCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3JjdS5oPgotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCi0KICNpbmNsdWRlICJyY3UuaCIKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHRpbnlfcGx1Z2luLmguICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RpbnlfcGx1Z2luLmggYi9rZXJuZWwvcmN1L3RpbnlfcGx1Z2luLmgKaW5kZXggMjgwZDA2Yy4uNDMxNTI4NSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90aW55X3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3UvdGlueV9wbHVnaW4uaApAQCAtMTQsOCArMTQsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDEwIExpbmFybwogICoKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdG9ydHVyZS5jIGIva2VybmVsL3JjdS90b3J0dXJlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmY4YWUuLjAwMDAwMDAKLS0tIGEva2VybmVsL3JjdS90b3J0dXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQ4ICswLDAgQEAKLS8qCi0gKiBSZWFkLUNvcHkgVXBkYXRlIG1vZHVsZS1iYXNlZCB0b3J0dXJlIHRlc3QgZmFjaWxpdHkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA2Ci0gKgotICogQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPgotICoJICBKb3NoIFRyaXBsZXR0IDxqb3NoQGZyZWVkZXNrdG9wLm9yZz4KLSAqCi0gKiBTZWUgYWxzbzogIERvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3JjdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPiBhbmQgSm9zaCBUcmlwbGV0dCA8am9zaEBmcmVlZGVza3RvcC5vcmc+Iik7Ci0KLU1PRFVMRV9BTElBUygicmN1dG9ydHVyZSIpOwotI2lmZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKLSN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCi0jZW5kaWYKLSNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCAicmN1dG9ydHVyZS4iCi0KLXN0YXRpYyBpbnQgZnFzX2R1cmF0aW9uOwotbW9kdWxlX3BhcmFtKGZxc19kdXJhdGlvbiwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZnFzX2R1cmF0aW9uLCAiRHVyYXRpb24gb2YgZnFzIGJ1cnN0cyAodXMpLCAwIHRvIGRpc2FibGUiKTsKLXN0YXRpYyBpbnQgZnFzX2hvbGRvZmY7Ci1tb2R1bGVfcGFyYW0oZnFzX2hvbGRvZmYsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZxc19ob2xkb2ZmLCAiSG9sZG9mZiB0aW1lIHdpdGhpbiBmcXMgYnVyc3RzICh1cykiKTsKLXN0YXRpYyBpbnQgZnFzX3N0dXR0ZXIgPSAzOwotbW9kdWxlX3BhcmFtKGZxc19zdHV0dGVyLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhmcXNfc3R1dHRlciwgIldhaXQgdGltZSBiZXR3ZWVuIGZxcyBidXJzdHMgKHMpIik7Ci1zdGF0aWMgYm9vbCBncF9leHA7Ci1tb2R1bGVfcGFyYW0oZ3BfZXhwLCBib29sLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZ3BfZXhwLCAiVXNlIGV4cGVkaXRlZCBHUCB3YWl0IHByaW1pdGl2ZXMiKTsKLXN0YXRpYyBib29sIGdwX25vcm1hbDsKLW1vZHVsZV9wYXJhbShncF9ub3JtYWwsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhncF9ub3JtYWwsICJVc2Ugbm9ybWFsIChub24tZXhwZWRpdGVkKSBHUCB3YWl0IHByaW1pdGl2ZXMiKTsKLXN0YXRpYyBpbnQgaXJxcmVhZGVyID0gMTsKLW1vZHVsZV9wYXJhbShpcnFyZWFkZXIsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlycXJlYWRlciwgIkFsbG93IFJDVSByZWFkZXJzIGZyb20gaXJxIGhhbmRsZXJzIik7Ci1zdGF0aWMgaW50IG5fYmFycmllcl9jYnM7Ci1tb2R1bGVfcGFyYW0obl9iYXJyaWVyX2NicywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mobl9iYXJyaWVyX2NicywgIiMgb2YgY2FsbGJhY2tzL2t0aHJlYWRzIGZvciBiYXJyaWVyIHRlc3RpbmciKTsKLXN0YXRpYyBpbnQgbmZha2V3cml0ZXJzID0gNDsKLW1vZHVsZV9wYXJhbShuZmFrZXdyaXRlcnMsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG5mYWtld3JpdGVycywgIk51bWJlciBvZiBSQ1UgZmFrZSB3cml0ZXIgdGhyZWFkcyIpOwotc3RhdGljIGludCBucmVhZGVycyA9IC0xOwotbW9kdWxlX3BhcmFtKG5yZWFkZXJzLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhucmVhZGVycywgIk51bWJlciBvZiBSQ1UgcmVhZGVyIHRocmVhZHMiKTsKLXN0YXRpYyBpbnQgb2JqZWN0X2RlYnVnOwotbW9kdWxlX3BhcmFtKG9iamVjdF9kZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mob2JqZWN0X2RlYnVnLCAiRW5hYmxlIGRlYnVnLW9iamVjdCBkb3VibGUgY2FsbF9yY3UoKSB0ZXN0aW5nIik7Ci1zdGF0aWMgaW50IG9ub2ZmX2hvbGRvZmY7Ci1tb2R1bGVfcGFyYW0ob25vZmZfaG9sZG9mZiwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mob25vZmZfaG9sZG9mZiwgIlRpbWUgYWZ0ZXIgYm9vdCBiZWZvcmUgQ1BVIGhvdHBsdWdzIChzKSIpOwotc3RhdGljIGludCBvbm9mZl9pbnRlcnZhbDsKLW1vZHVsZV9wYXJhbShvbm9mZl9pbnRlcnZhbCwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mob25vZmZfaW50ZXJ2YWwsICJUaW1lIGJldHdlZW4gQ1BVIGhvdHBsdWdzIChzKSwgMD1kaXNhYmxlIik7Ci1zdGF0aWMgaW50IHNodWZmbGVfaW50ZXJ2YWwgPSAzOwotbW9kdWxlX3BhcmFtKHNodWZmbGVfaW50ZXJ2YWwsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHNodWZmbGVfaW50ZXJ2YWwsICJOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHNodWZmbGVzIik7Ci1zdGF0aWMgaW50IHNodXRkb3duX3NlY3M7Ci1tb2R1bGVfcGFyYW0oc2h1dGRvd25fc2VjcywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc2h1dGRvd25fc2VjcywgIlNodXRkb3duIHRpbWUgKHMpLCA8PSB6ZXJvIHRvIGRpc2FibGUuIik7Ci1zdGF0aWMgaW50IHN0YWxsX2NwdTsKLW1vZHVsZV9wYXJhbShzdGFsbF9jcHUsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN0YWxsX2NwdSwgIlN0YWxsIGR1cmF0aW9uIChzKSwgemVybyB0byBkaXNhYmxlLiIpOwotc3RhdGljIGludCBzdGFsbF9jcHVfaG9sZG9mZiA9IDEwOwotbW9kdWxlX3BhcmFtKHN0YWxsX2NwdV9ob2xkb2ZmLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhzdGFsbF9jcHVfaG9sZG9mZiwgIlRpbWUgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgc3RhbGwgKHMpLiIpOwotc3RhdGljIGludCBzdGF0X2ludGVydmFsID0gNjA7Ci1tb2R1bGVfcGFyYW0oc3RhdF9pbnRlcnZhbCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc3RhdF9pbnRlcnZhbCwgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3RhdHMgcHJpbnRrKClzIik7Ci1zdGF0aWMgaW50IHN0dXR0ZXIgPSA1OwotbW9kdWxlX3BhcmFtKHN0dXR0ZXIsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN0dXR0ZXIsICJOdW1iZXIgb2Ygc2Vjb25kcyB0byBydW4vaGFsdCB0ZXN0Iik7Ci1zdGF0aWMgaW50IHRlc3RfYm9vc3QgPSAxOwotbW9kdWxlX3BhcmFtKHRlc3RfYm9vc3QsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfYm9vc3QsICJUZXN0IFJDVSBwcmlvIGJvb3N0OiAwPW5vLCAxPW1heWJlLCAyPXllcy4iKTsKLXN0YXRpYyBpbnQgdGVzdF9ib29zdF9kdXJhdGlvbiA9IDQ7Ci1tb2R1bGVfcGFyYW0odGVzdF9ib29zdF9kdXJhdGlvbiwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9ib29zdF9kdXJhdGlvbiwgIkR1cmF0aW9uIG9mIGVhY2ggYm9vc3QgdGVzdCwgc2Vjb25kcy4iKTsKLXN0YXRpYyBpbnQgdGVzdF9ib29zdF9pbnRlcnZhbCA9IDc7Ci1tb2R1bGVfcGFyYW0odGVzdF9ib29zdF9pbnRlcnZhbCwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9ib29zdF9pbnRlcnZhbCwgIkludGVydmFsIGJldHdlZW4gYm9vc3QgdGVzdHMsIHNlY29uZHMuIik7Ci1zdGF0aWMgYm9vbCB0ZXN0X25vX2lkbGVfaHogPSB0cnVlOwotbW9kdWxlX3BhcmFtKHRlc3Rfbm9faWRsZV9oeiwgYm9vbCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRlc3Rfbm9faWRsZV9oeiwgIlRlc3Qgc3VwcG9ydCBmb3IgdGlja2xlc3MgaWRsZSBDUFVzIik7Ci1zdGF0aWMgY2hhciAqdG9ydHVyZV90eXBlID0gInJjdSI7Ci1tb2R1bGVfcGFyYW0odG9ydHVyZV90eXBlLCBjaGFycCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRvcnR1cmVfdHlwZSwgIlR5cGUgb2YgUkNVIHRvIHRvcnR1cmUgKHJjdSwgcmN1X2JoLCAuLi4pIik7Ci1zdGF0aWMgYm9vbCB2ZXJib3NlOwotbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiRW5hYmxlIHZlcmJvc2UgZGVidWdnaW5nIHByaW50aygpcyIpOwotCi0jZGVmaW5lIFRPUlRVUkVfRkxBRyAiLXRvcnR1cmU6IgotI2RlZmluZSBQUklOVEtfU1RSSU5HKHMpIFwKLQlkbyB7IHByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHIHMgIlxuIiwgdG9ydHVyZV90eXBlKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgVkVSQk9TRV9QUklOVEtfU1RSSU5HKHMpIFwKLQlkbyB7IGlmICh2ZXJib3NlKSBwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyBzICJcbiIsIHRvcnR1cmVfdHlwZSk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFZFUkJPU0VfUFJJTlRLX0VSUlNUUklORyhzKSBcCi0JZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcgIiEhISAiIHMgIlxuIiwgdG9ydHVyZV90eXBlKTsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCBucmVhbHJlYWRlcnM7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp3cml0ZXJfdGFzazsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipmYWtld3JpdGVyX3Rhc2tzOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnJlYWRlcl90YXNrczsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YXRzX3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzaHVmZmxlcl90YXNrOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3R1dHRlcl90YXNrOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZnFzX3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpib29zdF90YXNrc1tOUl9DUFVTXTsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNodXRkb3duX3Rhc2s7Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpvbm9mZl90YXNrOwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YWxsX3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICoqYmFycmllcl9jYnNfdGFza3M7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpiYXJyaWVyX3Rhc2s7Ci0KLSNkZWZpbmUgUkNVX1RPUlRVUkVfUElQRV9MRU4gMTAKLQotc3RydWN0IHJjdV90b3J0dXJlIHsKLQlzdHJ1Y3QgcmN1X2hlYWQgcnRvcnRfcmN1OwotCWludCBydG9ydF9waXBlX2NvdW50OwotCXN0cnVjdCBsaXN0X2hlYWQgcnRvcnRfZnJlZTsKLQlpbnQgcnRvcnRfbWJ0ZXN0OwotfTsKLQotc3RhdGljIExJU1RfSEVBRChyY3VfdG9ydHVyZV9mcmVlbGlzdCk7Ci1zdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlIF9fcmN1ICpyY3VfdG9ydHVyZV9jdXJyZW50Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uOwotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZSByY3VfdG9ydHVyZXNbMTAgKiBSQ1VfVE9SVFVSRV9QSVBFX0xFTl07Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJjdV90b3J0dXJlX2xvY2spOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGxvbmcgW1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0sIHJjdV90b3J0dXJlX2NvdW50KSA9Ci0JeyAwIH07Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZyBbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSwgcmN1X3RvcnR1cmVfYmF0Y2gpID0KLQl7IDAgfTsKLXN0YXRpYyBhdG9taWNfdCByY3VfdG9ydHVyZV93Y291bnRbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXTsKLXN0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2FsbG9jOwotc3RhdGljIGF0b21pY190IG5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbDsKLXN0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2ZyZWU7Ci1zdGF0aWMgYXRvbWljX3Qgbl9yY3VfdG9ydHVyZV9tYmVycm9yOwotc3RhdGljIGF0b21pY190IG5fcmN1X3RvcnR1cmVfZXJyb3I7Ci1zdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3I7Ci1zdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yOwotc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yOwotc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlOwotc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdHM7Ci1zdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX3RpbWVyczsKLXN0YXRpYyBsb25nIG5fb2ZmbGluZV9hdHRlbXB0czsKLXN0YXRpYyBsb25nIG5fb2ZmbGluZV9zdWNjZXNzZXM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzdW1fb2ZmbGluZTsKLXN0YXRpYyBpbnQgbWluX29mZmxpbmUgPSAtMTsKLXN0YXRpYyBpbnQgbWF4X29mZmxpbmU7Ci1zdGF0aWMgbG9uZyBuX29ubGluZV9hdHRlbXB0czsKLXN0YXRpYyBsb25nIG5fb25saW5lX3N1Y2Nlc3NlczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN1bV9vbmxpbmU7Ci1zdGF0aWMgaW50IG1pbl9vbmxpbmUgPSAtMTsKLXN0YXRpYyBpbnQgbWF4X29ubGluZTsKLXN0YXRpYyBsb25nIG5fYmFycmllcl9hdHRlbXB0czsKLXN0YXRpYyBsb25nIG5fYmFycmllcl9zdWNjZXNzZXM7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCByY3VfdG9ydHVyZV9yZW1vdmVkOwotc3RhdGljIGNwdW1hc2tfdmFyX3Qgc2h1ZmZsZV90bXBfbWFzazsKLQotc3RhdGljIGludCBzdHV0dGVyX3BhdXNlX3Rlc3Q7Ci0KLSNpZiBkZWZpbmVkKE1PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSkKLSNkZWZpbmUgUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUIDEKLSNlbHNlCi0jZGVmaW5lIFJDVVRPUlRVUkVfUlVOTkFCTEVfSU5JVCAwCi0jZW5kaWYKLWludCByY3V0b3J0dXJlX3J1bm5hYmxlID0gUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUOwotbW9kdWxlX3BhcmFtKHJjdXRvcnR1cmVfcnVubmFibGUsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJjdXRvcnR1cmVfcnVubmFibGUsICJTdGFydCByY3V0b3J0dXJlIGF0IGJvb3QiKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKQotI2RlZmluZSByY3VfY2FuX2Jvb3N0KCkgMQotI2Vsc2UgLyogI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLwotI2RlZmluZSByY3VfY2FuX2Jvb3N0KCkgMAotI2VuZGlmIC8qICNlbHNlICNpZiBkZWZpbmVkKENPTkZJR19SQ1VfQk9PU1QpICYmICFkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkgKi8KLQotI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKLXN0YXRpYyB1NjQgbm90cmFjZSByY3VfdHJhY2VfY2xvY2tfbG9jYWwodm9pZCkKLXsKLQl1NjQgdHMgPSB0cmFjZV9jbG9ja19sb2NhbCgpOwotCXVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgdHNfcmVtID0gZG9fZGl2KHRzLCBOU0VDX1BFUl9VU0VDKTsKLQlyZXR1cm4gdHM7Ci19Ci0jZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLwotc3RhdGljIHU2NCBub3RyYWNlIHJjdV90cmFjZV9jbG9ja19sb2NhbCh2b2lkKQotewotCXJldHVybiAwVUxMOwotfQotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNodXRkb3duX3RpbWU7CS8qIGppZmZpZXMgdG8gc3lzdGVtIHNodXRkb3duLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vc3Rfc3RhcnR0aW1lOwkvKiBqaWZmaWVzIG9mIG5leHQgYm9vc3QgdGVzdCBzdGFydC4gKi8KLURFRklORV9NVVRFWChib29zdF9tdXRleCk7CQkvKiBwcm90ZWN0IHNldHRpbmcgYm9vc3Rfc3RhcnR0aW1lICovCi0JCQkJCS8qICBhbmQgYm9vc3QgdGFzayBjcmVhdGUvZGVzdHJveS4gKi8KLXN0YXRpYyBhdG9taWNfdCBiYXJyaWVyX2Nic19jb3VudDsJLyogQmFycmllciBjYWxsYmFja3MgcmVnaXN0ZXJlZC4gKi8KLXN0YXRpYyBib29sIGJhcnJpZXJfcGhhc2U7CQkvKiBUZXN0IHBoYXNlLiAqLwotc3RhdGljIGF0b21pY190IGJhcnJpZXJfY2JzX2ludm9rZWQ7CS8qIEJhcnJpZXIgY2FsbGJhY2tzIGludm9rZWQuICovCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgKmJhcnJpZXJfY2JzX3dxOyAvKiBDb29yZGluYXRlIGJhcnJpZXIgdGVzdGluZy4gKi8KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChiYXJyaWVyX3dxKTsKLQotLyogTWVkaWF0ZSBybW1vZCBhbmQgc3lzdGVtIHNodXRkb3duLiAgQ29uY3VycmVudCBybW1vZCAmIHNodXRkb3duIGlsbGVnYWwhICovCi0KLSNkZWZpbmUgRlVMTFNUT1BfRE9OVFNUT1AgMAkvKiBOb3JtYWwgb3BlcmF0aW9uLiAqLwotI2RlZmluZSBGVUxMU1RPUF9TSFVURE9XTiAxCS8qIFN5c3RlbSBzaHV0ZG93biB3aXRoIHJjdXRvcnR1cmUgcnVubmluZy4gKi8KLSNkZWZpbmUgRlVMTFNUT1BfUk1NT0QgICAgMgkvKiBOb3JtYWwgcm1tb2Qgb2YgcmN1dG9ydHVyZS4gKi8KLXN0YXRpYyBpbnQgZnVsbHN0b3AgPSBGVUxMU1RPUF9STU1PRDsKLS8qCi0gKiBQcm90ZWN0IGZ1bGxzdG9wIHRyYW5zaXRpb25zIGFuZCBzcGF3bmluZyBvZiBrdGhyZWFkcy4KLSAqLwotc3RhdGljIERFRklORV9NVVRFWChmdWxsc3RvcF9tdXRleCk7Ci0KLS8qIEZvcndhcmQgcmVmZXJlbmNlLiAqLwotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfY2xlYW51cCh2b2lkKTsKLQotLyoKLSAqIERldGVjdCBhbmQgcmVzcG9uZCB0byBhIHN5c3RlbSBzaHV0ZG93bi4KLSAqLwotc3RhdGljIGludAotcmN1dG9ydHVyZV9zaHV0ZG93bl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQxLAotCQkJICAgdW5zaWduZWQgbG9uZyB1bnVzZWQyLCB2b2lkICp1bnVzZWQzKQotewotCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKLQlpZiAoZnVsbHN0b3AgPT0gRlVMTFNUT1BfRE9OVFNUT1ApCi0JCWZ1bGxzdG9wID0gRlVMTFNUT1BfU0hVVERPV047Ci0JZWxzZQotCQlwcl93YXJuKC8qIGJ1dCBnb2luZyBkb3duIGFueXdheSwgc28uLi4gKi8KLQkJICAgICAgICJDb25jdXJyZW50ICdybW1vZCByY3V0b3J0dXJlJyBhbmQgc2h1dGRvd24gaWxsZWdhbCFcbiIpOwotCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQotLyoKLSAqIEFic29yYiBrdGhyZWFkcyBpbnRvIGEga2VybmVsIGZ1bmN0aW9uIHRoYXQgd29uJ3QgcmV0dXJuLCBzbyB0aGF0Ci0gKiB0aGV5IHdvbid0IGV2ZXIgYWNjZXNzIG1vZHVsZSB0ZXh0IG9yIGRhdGEgYWdhaW4uCi0gKi8KLXN0YXRpYyB2b2lkIHJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKGNvbnN0IGNoYXIgKnRpdGxlKQotewotCWlmIChBQ0NFU1NfT05DRShmdWxsc3RvcCkgPT0gRlVMTFNUT1BfU0hVVERPV04pIHsKLQkJcHJfbm90aWNlKAotCQkgICAgICAgInJjdXRvcnR1cmUgdGhyZWFkICVzIHBhcmtpbmcgZHVlIHRvIHN5c3RlbSBzaHV0ZG93blxuIiwKLQkJICAgICAgIHRpdGxlKTsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoTUFYX1NDSEVEVUxFX1RJTUVPVVQpOwotCX0KLX0KLQotLyoKLSAqIEFsbG9jYXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmUgKgotcmN1X3RvcnR1cmVfYWxsb2Modm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCi0Jc3Bpbl9sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmcmN1X3RvcnR1cmVfZnJlZWxpc3QpKSB7Ci0JCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2MpOwotCXAgPSByY3VfdG9ydHVyZV9mcmVlbGlzdC5uZXh0OwotCWxpc3RfZGVsX2luaXQocCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnJjdV90b3J0dXJlX2xvY2spOwotCXJldHVybiBjb250YWluZXJfb2YocCwgc3RydWN0IHJjdV90b3J0dXJlLCBydG9ydF9mcmVlKTsKLX0KLQotLyoKLSAqIEZyZWUgYW4gZWxlbWVudCB0byB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCi0gKi8KLXN0YXRpYyB2b2lkCi1yY3VfdG9ydHVyZV9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcCkKLXsKLQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX2ZyZWUpOwotCXNwaW5fbG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmcC0+cnRvcnRfZnJlZSwgJnJjdV90b3J0dXJlX2ZyZWVsaXN0KTsKLQlzcGluX3VubG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7Ci19Ci0KLXN0cnVjdCByY3VfcmFuZG9tX3N0YXRlIHsKLQl1bnNpZ25lZCBsb25nIHJyc19zdGF0ZTsKLQlsb25nIHJyc19jb3VudDsKLX07Ci0KLSNkZWZpbmUgUkNVX1JBTkRPTV9NVUxUIDM5OTE2ODAxICAvKiBwcmltZSAqLwotI2RlZmluZSBSQ1VfUkFORE9NX0FERAk0NzkwMDE3MDEgLyogcHJpbWUgKi8KLSNkZWZpbmUgUkNVX1JBTkRPTV9SRUZSRVNIIDEwMDAwCi0KLSNkZWZpbmUgREVGSU5FX1JDVV9SQU5ET00obmFtZSkgc3RydWN0IHJjdV9yYW5kb21fc3RhdGUgbmFtZSA9IHsgMCwgMCB9Ci0KLS8qCi0gKiBDcnVkZSBidXQgZmFzdCByYW5kb20tbnVtYmVyIGdlbmVyYXRvci4gIFVzZXMgYSBsaW5lYXIgY29uZ3J1ZW50aWFsCi0gKiBnZW5lcmF0b3IsIHdpdGggb2NjYXNpb25hbCBoZWxwIGZyb20gY3B1X2Nsb2NrKCkuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1yY3VfcmFuZG9tKHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKQotewotCWlmICgtLXJyc3AtPnJyc19jb3VudCA8IDApIHsKLQkJcnJzcC0+cnJzX3N0YXRlICs9ICh1bnNpZ25lZCBsb25nKWxvY2FsX2Nsb2NrKCk7Ci0JCXJyc3AtPnJyc19jb3VudCA9IFJDVV9SQU5ET01fUkVGUkVTSDsKLQl9Ci0JcnJzcC0+cnJzX3N0YXRlID0gcnJzcC0+cnJzX3N0YXRlICogUkNVX1JBTkRPTV9NVUxUICsgUkNVX1JBTkRPTV9BREQ7Ci0JcmV0dXJuIHN3YWh3MzIocnJzcC0+cnJzX3N0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQKLXJjdV9zdHV0dGVyX3dhaXQoY29uc3QgY2hhciAqdGl0bGUpCi17Ci0Jd2hpbGUgKHN0dXR0ZXJfcGF1c2VfdGVzdCB8fCAhcmN1dG9ydHVyZV9ydW5uYWJsZSkgewotCQlpZiAocmN1dG9ydHVyZV9ydW5uYWJsZSkKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKLQkJZWxzZQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoSFopKTsKLQkJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIodGl0bGUpOwotCX0KLX0KLQotLyoKLSAqIE9wZXJhdGlvbnMgdmVjdG9yIGZvciBzZWxlY3RpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHRlc3RzLgotICovCi0KLXN0cnVjdCByY3VfdG9ydHVyZV9vcHMgewotCXZvaWQgKCppbml0KSh2b2lkKTsKLQlpbnQgKCpyZWFkbG9jaykodm9pZCk7Ci0Jdm9pZCAoKnJlYWRfZGVsYXkpKHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKTsKLQl2b2lkICgqcmVhZHVubG9jaykoaW50IGlkeCk7Ci0JaW50ICgqY29tcGxldGVkKSh2b2lkKTsKLQl2b2lkICgqZGVmZXJyZWRfZnJlZSkoc3RydWN0IHJjdV90b3J0dXJlICpwKTsKLQl2b2lkICgqc3luYykodm9pZCk7Ci0Jdm9pZCAoKmV4cF9zeW5jKSh2b2lkKTsKLQl2b2lkICgqY2FsbCkoc3RydWN0IHJjdV9oZWFkICpoZWFkLCB2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpyY3UpKTsKLQl2b2lkICgqY2JfYmFycmllcikodm9pZCk7Ci0Jdm9pZCAoKmZxcykodm9pZCk7Ci0Jdm9pZCAoKnN0YXRzKShjaGFyICpwYWdlKTsKLQlpbnQgaXJxX2NhcGFibGU7Ci0JaW50IGNhbl9ib29zdDsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgKmN1cl9vcHM7Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgcmN1IHRvcnR1cmUgdGVzdGluZy4KLSAqLwotCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX3JlYWRfbG9jayh2b2lkKSBfX2FjcXVpcmVzKFJDVSkKLXsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJjdV9yZWFkX2RlbGF5KHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hvcnRkZWxheV91cyA9IDIwMDsKLQljb25zdCB1bnNpZ25lZCBsb25nIGxvbmdkZWxheV9tcyA9IDUwOwotCi0JLyogV2Ugd2FudCBhIHNob3J0IGRlbGF5IHNvbWV0aW1lcyB0byBtYWtlIGEgcmVhZGVyIGRlbGF5IHRoZSBncmFjZQotCSAqIHBlcmlvZCwgYW5kIHdlIHdhbnQgYSBsb25nIGRlbGF5IG9jY2FzaW9uYWxseSB0byB0cmlnZ2VyCi0JICogZm9yY2VfcXVpZXNjZW50X3N0YXRlLiAqLwotCi0JaWYgKCEocmN1X3JhbmRvbShycnNwKSAlIChucmVhbHJlYWRlcnMgKiAyMDAwICogbG9uZ2RlbGF5X21zKSkpCi0JCW1kZWxheShsb25nZGVsYXlfbXMpOwotCWlmICghKHJjdV9yYW5kb20ocnJzcCkgJSAobnJlYWxyZWFkZXJzICogMiAqIHNob3J0ZGVsYXlfdXMpKSkKLQkJdWRlbGF5KHNob3J0ZGVsYXlfdXMpOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JaWYgKCFwcmVlbXB0X2NvdW50KCkgJiYgIShyY3VfcmFuZG9tKHJyc3ApICUgKG5yZWFscmVhZGVycyAqIDIwMDAwKSkpCi0JCXByZWVtcHRfc2NoZWR1bGUoKTsgIC8qIE5vIFFTIGlmIHByZWVtcHRfZGlzYWJsZSgpIGluIGVmZmVjdCAqLwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3JlYWRfdW5sb2NrKGludCBpZHgpIF9fcmVsZWFzZXMoUkNVKQotewotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX2NvbXBsZXRlZCh2b2lkKQotewotCXJldHVybiByY3VfYmF0Y2hlc19jb21wbGV0ZWQoKTsKLX0KLQotc3RhdGljIHZvaWQKLXJjdV90b3J0dXJlX2NiKHN0cnVjdCByY3VfaGVhZCAqcCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByY3VfdG9ydHVyZSwgcnRvcnRfcmN1KTsKLQotCWlmIChmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCkgewotCQkvKiBUZXN0IGlzIGVuZGluZywganVzdCBkcm9wIGNhbGxiYWNrcyBvbiB0aGUgZmxvb3IuICovCi0JCS8qIFRoZSBuZXh0IGluaXRpYWxpemF0aW9uIHdpbGwgcGljayB1cCB0aGUgcGllY2VzLiAqLwotCQlyZXR1cm47Ci0JfQotCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKLQlpZiAoaSA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKQotCQlpID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKLQlpZiAoKytycC0+cnRvcnRfcGlwZV9jb3VudCA+PSBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgewotCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKLQkJcmN1X3RvcnR1cmVfZnJlZShycCk7Ci0JfSBlbHNlIHsKLQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShycCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHJjdV9ub19jb21wbGV0ZWQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCi17Ci0JY2FsbF9yY3UoJnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOwotfQotCi1zdGF0aWMgdm9pZCByY3Vfc3luY190b3J0dXJlX2luaXQodm9pZCkKLXsKLQlJTklUX0xJU1RfSEVBRCgmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHJjdV9vcHMgPSB7Ci0JLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAotCS5yZWFkbG9jawk9IHJjdV90b3J0dXJlX3JlYWRfbG9jaywKLQkucmVhZF9kZWxheQk9IHJjdV9yZWFkX2RlbGF5LAotCS5yZWFkdW5sb2NrCT0gcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCi0JLmNvbXBsZXRlZAk9IHJjdV90b3J0dXJlX2NvbXBsZXRlZCwKLQkuZGVmZXJyZWRfZnJlZQk9IHJjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUsCi0JLnN5bmMJCT0gc3luY2hyb25pemVfcmN1LAotCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQsCi0JLmNhbGwJCT0gY2FsbF9yY3UsCi0JLmNiX2JhcnJpZXIJPSByY3VfYmFycmllciwKLQkuZnFzCQk9IHJjdV9mb3JjZV9xdWllc2NlbnRfc3RhdGUsCi0JLnN0YXRzCQk9IE5VTEwsCi0JLmlycV9jYXBhYmxlCT0gMSwKLQkuY2FuX2Jvb3N0CT0gcmN1X2Nhbl9ib29zdCgpLAotCS5uYW1lCQk9ICJyY3UiCi19OwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHJjdV9iaCB0b3J0dXJlIHRlc3RpbmcuCi0gKi8KLQotc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9yZWFkX2xvY2sodm9pZCkgX19hY3F1aXJlcyhSQ1VfQkgpCi17Ci0JcmN1X3JlYWRfbG9ja19iaCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKFJDVV9CSCkKLXsKLQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKLX0KLQotc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9jb21wbGV0ZWQodm9pZCkKLXsKLQlyZXR1cm4gcmN1X2JhdGNoZXNfY29tcGxldGVkX2JoKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJjdV9iaF90b3J0dXJlX2RlZmVycmVkX2ZyZWUoc3RydWN0IHJjdV90b3J0dXJlICpwKQotewotCWNhbGxfcmN1X2JoKCZwLT5ydG9ydF9yY3UsIHJjdV90b3J0dXJlX2NiKTsKLX0KLQotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgcmN1X2JoX29wcyA9IHsKLQkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCi0JLnJlYWRsb2NrCT0gcmN1X2JoX3RvcnR1cmVfcmVhZF9sb2NrLAotCS5yZWFkX2RlbGF5CT0gcmN1X3JlYWRfZGVsYXksICAvKiBqdXN0IHJldXNlIHJjdSdzIHZlcnNpb24uICovCi0JLnJlYWR1bmxvY2sJPSByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jaywKLQkuY29tcGxldGVkCT0gcmN1X2JoX3RvcnR1cmVfY29tcGxldGVkLAotCS5kZWZlcnJlZF9mcmVlCT0gcmN1X2JoX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKLQkuc3luYwkJPSBzeW5jaHJvbml6ZV9yY3VfYmgsCi0JLmV4cF9zeW5jCT0gc3luY2hyb25pemVfcmN1X2JoX2V4cGVkaXRlZCwKLQkuY2FsbAkJPSBjYWxsX3JjdV9iaCwKLQkuY2JfYmFycmllcgk9IHJjdV9iYXJyaWVyX2JoLAotCS5mcXMJCT0gcmN1X2JoX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSwKLQkuc3RhdHMJCT0gTlVMTCwKLQkuaXJxX2NhcGFibGUJPSAxLAotCS5uYW1lCQk9ICJyY3VfYmgiCi19OwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHNyY3UgdG9ydHVyZSB0ZXN0aW5nLgotICovCi0KLURFRklORV9TVEFUSUNfU1JDVShzcmN1X2N0bCk7Ci0KLXN0YXRpYyBpbnQgc3JjdV90b3J0dXJlX3JlYWRfbG9jayh2b2lkKSBfX2FjcXVpcmVzKCZzcmN1X2N0bCkKLXsKLQlyZXR1cm4gc3JjdV9yZWFkX2xvY2soJnNyY3VfY3RsKTsKLX0KLQotc3RhdGljIHZvaWQgc3JjdV9yZWFkX2RlbGF5KHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKQotewotCWxvbmcgZGVsYXk7Ci0JY29uc3QgbG9uZyB1c3BlcnRpY2sgPSAxMDAwMDAwIC8gSFo7Ci0JY29uc3QgbG9uZyBsb25nZGVsYXkgPSAxMDsKLQotCS8qIFdlIHdhbnQgdGhlcmUgdG8gYmUgbG9uZy1ydW5uaW5nIHJlYWRlcnMsIGJ1dCBub3QgYWxsIHRoZSB0aW1lLiAqLwotCi0JZGVsYXkgPSByY3VfcmFuZG9tKHJyc3ApICUgKG5yZWFscmVhZGVycyAqIDIgKiBsb25nZGVsYXkgKiB1c3BlcnRpY2spOwotCWlmICghZGVsYXkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShsb25nZGVsYXkpOwotCWVsc2UKLQkJcmN1X3JlYWRfZGVsYXkocnJzcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKCZzcmN1X2N0bCkKLXsKLQlzcmN1X3JlYWRfdW5sb2NrKCZzcmN1X2N0bCwgaWR4KTsKLX0KLQotc3RhdGljIGludCBzcmN1X3RvcnR1cmVfY29tcGxldGVkKHZvaWQpCi17Ci0JcmV0dXJuIHNyY3VfYmF0Y2hlc19jb21wbGV0ZWQoJnNyY3VfY3RsKTsKLX0KLQotc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUoc3RydWN0IHJjdV90b3J0dXJlICpycCkKLXsKLQljYWxsX3NyY3UoJnNyY3VfY3RsLCAmcnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfc3luY2hyb25pemUodm9pZCkKLXsKLQlzeW5jaHJvbml6ZV9zcmN1KCZzcmN1X2N0bCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9jYWxsKHN0cnVjdCByY3VfaGVhZCAqaGVhZCwKLQkJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKQotewotCWNhbGxfc3JjdSgmc3JjdV9jdGwsIGhlYWQsIGZ1bmMpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfYmFycmllcih2b2lkKQotewotCXNyY3VfYmFycmllcigmc3JjdV9jdGwpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfc3RhdHMoY2hhciAqcGFnZSkKLXsKLQlpbnQgY3B1OwotCWludCBpZHggPSBzcmN1X2N0bC5jb21wbGV0ZWQgJiAweDE7Ci0KLQlwYWdlICs9IHNwcmludGYocGFnZSwgIiVzJXMgcGVyLUNQVShpZHg9JWQpOiIsCi0JCSAgICAgICB0b3J0dXJlX3R5cGUsIFRPUlRVUkVfRkxBRywgaWR4KTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiICVkKCVsdSwlbHUpIiwgY3B1LAotCQkJICAgICAgIHBlcl9jcHVfcHRyKHNyY3VfY3RsLnBlcl9jcHVfcmVmLCBjcHUpLT5jWyFpZHhdLAotCQkJICAgICAgIHBlcl9jcHVfcHRyKHNyY3VfY3RsLnBlcl9jcHVfcmVmLCBjcHUpLT5jW2lkeF0pOwotCX0KLQlzcHJpbnRmKHBhZ2UsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfc3luY2hyb25pemVfZXhwZWRpdGVkKHZvaWQpCi17Ci0Jc3luY2hyb25pemVfc3JjdV9leHBlZGl0ZWQoJnNyY3VfY3RsKTsKLX0KLQotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgc3JjdV9vcHMgPSB7Ci0JLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAotCS5yZWFkbG9jawk9IHNyY3VfdG9ydHVyZV9yZWFkX2xvY2ssCi0JLnJlYWRfZGVsYXkJPSBzcmN1X3JlYWRfZGVsYXksCi0JLnJlYWR1bmxvY2sJPSBzcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCi0JLmNvbXBsZXRlZAk9IHNyY3VfdG9ydHVyZV9jb21wbGV0ZWQsCi0JLmRlZmVycmVkX2ZyZWUJPSBzcmN1X3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKLQkuc3luYwkJPSBzcmN1X3RvcnR1cmVfc3luY2hyb25pemUsCi0JLmV4cF9zeW5jCT0gc3JjdV90b3J0dXJlX3N5bmNocm9uaXplX2V4cGVkaXRlZCwKLQkuY2FsbAkJPSBzcmN1X3RvcnR1cmVfY2FsbCwKLQkuY2JfYmFycmllcgk9IHNyY3VfdG9ydHVyZV9iYXJyaWVyLAotCS5zdGF0cwkJPSBzcmN1X3RvcnR1cmVfc3RhdHMsCi0JLm5hbWUJCT0gInNyY3UiCi19OwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHNjaGVkIHRvcnR1cmUgdGVzdGluZy4KLSAqLwotCi1zdGF0aWMgaW50IHNjaGVkX3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpCi17Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjaGVkX3RvcnR1cmVfcmVhZF91bmxvY2soaW50IGlkeCkKLXsKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCi1zdGF0aWMgdm9pZCByY3Vfc2NoZWRfdG9ydHVyZV9kZWZlcnJlZF9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcCkKLXsKLQljYWxsX3JjdV9zY2hlZCgmcC0+cnRvcnRfcmN1LCByY3VfdG9ydHVyZV9jYik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHNjaGVkX29wcyA9IHsKLQkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCi0JLnJlYWRsb2NrCT0gc2NoZWRfdG9ydHVyZV9yZWFkX2xvY2ssCi0JLnJlYWRfZGVsYXkJPSByY3VfcmVhZF9kZWxheSwgIC8qIGp1c3QgcmV1c2UgcmN1J3MgdmVyc2lvbi4gKi8KLQkucmVhZHVubG9jawk9IHNjaGVkX3RvcnR1cmVfcmVhZF91bmxvY2ssCi0JLmNvbXBsZXRlZAk9IHJjdV9ub19jb21wbGV0ZWQsCi0JLmRlZmVycmVkX2ZyZWUJPSByY3Vfc2NoZWRfdG9ydHVyZV9kZWZlcnJlZF9mcmVlLAotCS5zeW5jCQk9IHN5bmNocm9uaXplX3NjaGVkLAotCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCwKLQkuY2FsbAkJPSBjYWxsX3JjdV9zY2hlZCwKLQkuY2JfYmFycmllcgk9IHJjdV9iYXJyaWVyX3NjaGVkLAotCS5mcXMJCT0gcmN1X3NjaGVkX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSwKLQkuc3RhdHMJCT0gTlVMTCwKLQkuaXJxX2NhcGFibGUJPSAxLAotCS5uYW1lCQk9ICJzY2hlZCIKLX07Ci0KLS8qCi0gKiBSQ1UgdG9ydHVyZSBwcmlvcml0eS1ib29zdCB0ZXN0aW5nLiAgUnVucyBvbmUgcmVhbC10aW1lIHRocmVhZCBwZXIKLSAqIENQVSBmb3IgbW9kZXJhdGUgYnVyc3RzLCByZXBlYXRlZGx5IHJlZ2lzdGVyaW5nIFJDVSBjYWxsYmFja3MgYW5kCi0gKiBzcGlubmluZyB3YWl0aW5nIGZvciB0aGVtIHRvIGJlIGludm9rZWQuICBJZiBhIGdpdmVuIGNhbGxiYWNrIHRha2VzCi0gKiB0b28gbG9uZyB0byBiZSBpbnZva2VkLCB3ZSBhc3N1bWUgdGhhdCBwcmlvcml0eSBpbnZlcnNpb24gaGFzIG9jY3VycmVkLgotICovCi0KLXN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQgewotCXN0cnVjdCByY3VfaGVhZCByY3U7Ci0JaW50IGluZmxpZ2h0OwotfTsKLQotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfYm9vc3RfY2Ioc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCXN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQgKnJiaXAgPQotCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJjdV9ib29zdF9pbmZsaWdodCwgcmN1KTsKLQotCXNtcF9tYigpOyAvKiBFbnN1cmUgUkNVLWNvcmUgYWNjZXNzZXMgcHJlY2VkZSBjbGVhcmluZyAtPmluZmxpZ2h0ICovCi0JcmJpcC0+aW5mbGlnaHQgPSAwOwotfQotCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX2Jvb3N0KHZvaWQgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGNhbGxfcmN1X3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBlbmR0aW1lOwotCXVuc2lnbmVkIGxvbmcgb2xkc3RhcnR0aW1lOwotCXN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQgcmJpID0geyAuaW5mbGlnaHQgPSAwIH07Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9ib29zdCBzdGFydGVkIik7Ci0KLQkvKiBTZXQgcmVhbC10aW1lIHByaW9yaXR5LiAqLwotCXNwLnNjaGVkX3ByaW9yaXR5ID0gMTsKLQlpZiAoc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZzcCkgPCAwKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3QgUlQgcHJpbyBmYWlsZWQhIik7Ci0JCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvcisrOwotCX0KLQotCWluaXRfcmN1X2hlYWRfb25fc3RhY2soJnJiaS5yY3UpOwotCS8qIEVhY2ggcGFzcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbG9vcCBkb2VzIG9uZSBib29zdC10ZXN0IGN5Y2xlLiAqLwotCWRvIHsKLQkJLyogV2FpdCBmb3IgdGhlIG5leHQgdGVzdCBpbnRlcnZhbC4gKi8KLQkJb2xkc3RhcnR0aW1lID0gYm9vc3Rfc3RhcnR0aW1lOwotCQl3aGlsZSAoVUxPTkdfQ01QX0xUKGppZmZpZXMsIG9sZHN0YXJ0dGltZSkpIHsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShvbGRzdGFydHRpbWUgLSBqaWZmaWVzKTsKLQkJCXJjdV9zdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX2Jvb3N0Iik7Ci0JCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8Ci0JCQkgICAgZnVsbHN0b3AgIT0gRlVMTFNUT1BfRE9OVFNUT1ApCi0JCQkJZ290byBjaGVja3dhaXQ7Ci0JCX0KLQotCQkvKiBEbyBvbmUgYm9vc3QtdGVzdCBpbnRlcnZhbC4gKi8KLQkJZW5kdGltZSA9IG9sZHN0YXJ0dGltZSArIHRlc3RfYm9vc3RfZHVyYXRpb24gKiBIWjsKLQkJY2FsbF9yY3VfdGltZSA9IGppZmZpZXM7Ci0JCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllcywgZW5kdGltZSkpIHsKLQkJCS8qIElmIHdlIGRvbid0IGhhdmUgYSBjYWxsYmFjayBpbiBmbGlnaHQsIHBvc3Qgb25lLiAqLwotCQkJaWYgKCFyYmkuaW5mbGlnaHQpIHsKLQkJCQlzbXBfbWIoKTsgLyogUkNVIGNvcmUgYmVmb3JlIC0+aW5mbGlnaHQgPSAxLiAqLwotCQkJCXJiaS5pbmZsaWdodCA9IDE7Ci0JCQkJY2FsbF9yY3UoJnJiaS5yY3UsIHJjdV90b3J0dXJlX2Jvb3N0X2NiKTsKLQkJCQlpZiAoamlmZmllcyAtIGNhbGxfcmN1X3RpbWUgPgotCQkJCQkgdGVzdF9ib29zdF9kdXJhdGlvbiAqIEhaIC0gSFogLyAyKSB7Ci0JCQkJCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3QgYm9vc3RpbmcgZmFpbGVkIik7Ci0JCQkJCW5fcmN1X3RvcnR1cmVfYm9vc3RfZmFpbHVyZSsrOwotCQkJCX0KLQkJCQljYWxsX3JjdV90aW1lID0gamlmZmllczsKLQkJCX0KLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJcmN1X3N0dXR0ZXJfd2FpdCgicmN1X3RvcnR1cmVfYm9vc3QiKTsKLQkJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwKLQkJCSAgICBmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCkKLQkJCQlnb3RvIGNoZWNrd2FpdDsKLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGUgc3RhcnQgdGltZSBvZiB0aGUgbmV4dCB0ZXN0IGludGVydmFsLgotCQkgKiBZZXMsIHRoaXMgaXMgdnVsbmVyYWJsZSB0byBsb25nIGRlbGF5cywgYnV0IHN1Y2gKLQkJICogZGVsYXlzIHNpbXBseSBjYXVzZSBhIGZhbHNlIG5lZ2F0aXZlIGZvciB0aGUgbmV4dAotCQkgKiBpbnRlcnZhbC4gIEJlc2lkZXMsIHdlIGFyZSBydW5uaW5nIGF0IFJUIHByaW9yaXR5LAotCQkgKiBzbyBkZWxheXMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgcmFyZS4KLQkJICovCi0JCXdoaWxlIChvbGRzdGFydHRpbWUgPT0gYm9vc3Rfc3RhcnR0aW1lICYmCi0JCSAgICAgICAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCQlpZiAobXV0ZXhfdHJ5bG9jaygmYm9vc3RfbXV0ZXgpKSB7Ci0JCQkJYm9vc3Rfc3RhcnR0aW1lID0gamlmZmllcyArCi0JCQkJCQkgIHRlc3RfYm9vc3RfaW50ZXJ2YWwgKiBIWjsKLQkJCQluX3JjdV90b3J0dXJlX2Jvb3N0cysrOwotCQkJCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCX0KLQotCQkvKiBHbyBkbyB0aGUgc3R1dHRlci4gKi8KLWNoZWNrd2FpdDoJcmN1X3N0dXR0ZXJfd2FpdCgicmN1X3RvcnR1cmVfYm9vc3QiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICA9PSBGVUxMU1RPUF9ET05UU1RPUCk7Ci0KLQkvKiBDbGVhbiB1cCBhbmQgZXhpdC4gKi8KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IHRhc2sgc3RvcHBpbmciKTsKLQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfYm9vc3QiKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCByYmkuaW5mbGlnaHQpCi0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCXNtcF9tYigpOyAvKiBvcmRlciBhY2Nlc3NlcyB0byAtPmluZmxpZ2h0IGJlZm9yZSBzdGFjay1mcmFtZSBkZWF0aC4gKi8KLQlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJDVSB0b3J0dXJlIGZvcmNlLXF1aWVzY2VudC1zdGF0ZSBrdGhyZWFkLiAgUmVwZWF0ZWRseSBpbmR1Y2VzCi0gKiBidXJzdHMgb2YgY2FsbHMgdG8gZm9yY2VfcXVpZXNjZW50X3N0YXRlKCksIGluY3JlYXNpbmcgdGhlIHByb2JhYmlsaXR5Ci0gKiBvZiBvY2N1cnJlbmNlIG9mIHNvbWUgaW1wb3J0YW50IHR5cGVzIG9mIHJhY2UgY29uZGl0aW9ucy4KLSAqLwotc3RhdGljIGludAotcmN1X3RvcnR1cmVfZnFzKHZvaWQgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZxc19yZXN1bWVfdGltZTsKLQlpbnQgZnFzX2J1cnN0X3JlbWFpbmluZzsKLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfZnFzIHRhc2sgc3RhcnRlZCIpOwotCWRvIHsKLQkJZnFzX3Jlc3VtZV90aW1lID0gamlmZmllcyArIGZxc19zdHV0dGVyICogSFo7Ci0JCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllcywgZnFzX3Jlc3VtZV90aW1lKSAmJgotCQkgICAgICAgIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwotCQl9Ci0JCWZxc19idXJzdF9yZW1haW5pbmcgPSBmcXNfZHVyYXRpb247Ci0JCXdoaWxlIChmcXNfYnVyc3RfcmVtYWluaW5nID4gMCAmJgotCQkgICAgICAgIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQkJY3VyX29wcy0+ZnFzKCk7Ci0JCQl1ZGVsYXkoZnFzX2hvbGRvZmYpOwotCQkJZnFzX2J1cnN0X3JlbWFpbmluZyAtPSBmcXNfaG9sZG9mZjsKLQkJfQotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mcXMiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2ZxcyB0YXNrIHN0b3BwaW5nIik7Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX2ZxcyIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJDVSB0b3J0dXJlIHdyaXRlciBrdGhyZWFkLiAgUmVwZWF0ZWRseSBzdWJzdGl0dXRlcyBhIG5ldyBzdHJ1Y3R1cmUKLSAqIGZvciB0aGF0IHBvaW50ZWQgdG8gYnkgcmN1X3RvcnR1cmVfY3VycmVudCwgZnJlZWluZyB0aGUgb2xkIHN0cnVjdHVyZQotICogYWZ0ZXIgYSBzZXJpZXMgb2YgZ3JhY2UgcGVyaW9kcyAodGhlICJwaXBlbGluZSIpLgotICovCi1zdGF0aWMgaW50Ci1yY3VfdG9ydHVyZV93cml0ZXIodm9pZCAqYXJnKQotewotCWJvb2wgZXhwOwotCWludCBpOwotCXN0cnVjdCByY3VfdG9ydHVyZSAqcnA7Ci0Jc3RydWN0IHJjdV90b3J0dXJlICpycDE7Ci0Jc3RydWN0IHJjdV90b3J0dXJlICpvbGRfcnA7Ci0Jc3RhdGljIERFRklORV9SQ1VfUkFORE9NKHJhbmQpOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV93cml0ZXIgdGFzayBzdGFydGVkIik7Ci0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0KLQlkbyB7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCQlycCA9IHJjdV90b3J0dXJlX2FsbG9jKCk7Ci0JCWlmIChycCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXJwLT5ydG9ydF9waXBlX2NvdW50ID0gMDsKLQkJdWRlbGF5KHJjdV9yYW5kb20oJnJhbmQpICYgMHgzZmYpOwotCQlvbGRfcnAgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2socmN1X3RvcnR1cmVfY3VycmVudCwKLQkJCQkJICAgICAgIGN1cnJlbnQgPT0gd3JpdGVyX3Rhc2spOwotCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJjdV90b3J0dXJlX2N1cnJlbnQsIHJwKTsKLQkJc21wX3dtYigpOyAvKiBNb2RzIHRvIG9sZF9ycCBtdXN0IGZvbGxvdyByY3VfYXNzaWduX3BvaW50ZXIoKSAqLwotCQlpZiAob2xkX3JwKSB7Ci0JCQlpID0gb2xkX3JwLT5ydG9ydF9waXBlX2NvdW50OwotCQkJaWYgKGkgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikKLQkJCQlpID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JCQlhdG9taWNfaW5jKCZyY3VfdG9ydHVyZV93Y291bnRbaV0pOwotCQkJb2xkX3JwLT5ydG9ydF9waXBlX2NvdW50Kys7Ci0JCQlpZiAoZ3Bfbm9ybWFsID09IGdwX2V4cCkKLQkJCQlleHAgPSAhIShyY3VfcmFuZG9tKCZyYW5kKSAmIDB4ODApOwotCQkJZWxzZQotCQkJCWV4cCA9IGdwX2V4cDsKLQkJCWlmICghZXhwKSB7Ci0JCQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShvbGRfcnApOwotCQkJfSBlbHNlIHsKLQkJCQljdXJfb3BzLT5leHBfc3luYygpOwotCQkJCWxpc3RfYWRkKCZvbGRfcnAtPnJ0b3J0X2ZyZWUsCi0JCQkJCSAmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwLCBycDEsCi0JCQkJCQkJICZyY3VfdG9ydHVyZV9yZW1vdmVkLAotCQkJCQkJCSBydG9ydF9mcmVlKSB7Ci0JCQkJCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKLQkJCQkJaWYgKGkgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikKLQkJCQkJCWkgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKLQkJCQkJYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKLQkJCQkJaWYgKCsrcnAtPnJ0b3J0X3BpcGVfY291bnQgPj0KLQkJCQkJICAgIFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7Ci0JCQkJCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKLQkJCQkJCWxpc3RfZGVsKCZycC0+cnRvcnRfZnJlZSk7Ci0JCQkJCQlyY3VfdG9ydHVyZV9mcmVlKHJwKTsKLQkJCQkJfQotCQkJCSB9Ci0JCQl9Ci0JCX0KLQkJcmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MoKytyY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24pOwotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV93cml0ZXIiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0b3BwaW5nIik7Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3dyaXRlciIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJDVSB0b3J0dXJlIGZha2Ugd3JpdGVyIGt0aHJlYWQuICBSZXBlYXRlZGx5IGNhbGxzIHN5bmMsIHdpdGggYSByYW5kb20KLSAqIGRlbGF5IGJldHdlZW4gY2FsbHMuCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX2Zha2V3cml0ZXIodm9pZCAqYXJnKQotewotCURFRklORV9SQ1VfUkFORE9NKHJhbmQpOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RhcnRlZCIpOwotCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCi0JZG8gewotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxICsgcmN1X3JhbmRvbSgmcmFuZCklMTApOwotCQl1ZGVsYXkocmN1X3JhbmRvbSgmcmFuZCkgJiAweDNmZik7Ci0JCWlmIChjdXJfb3BzLT5jYl9iYXJyaWVyICE9IE5VTEwgJiYKLQkJICAgIHJjdV9yYW5kb20oJnJhbmQpICUgKG5mYWtld3JpdGVycyAqIDgpID09IDApIHsKLQkJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKLQkJfSBlbHNlIGlmIChncF9ub3JtYWwgPT0gZ3BfZXhwKSB7Ci0JCQlpZiAocmN1X3JhbmRvbSgmcmFuZCkgJiAweDgwKQotCQkJCWN1cl9vcHMtPnN5bmMoKTsKLQkJCWVsc2UKLQkJCQljdXJfb3BzLT5leHBfc3luYygpOwotCQl9IGVsc2UgaWYgKGdwX25vcm1hbCkgewotCQkJY3VyX29wcy0+c3luYygpOwotCQl9IGVsc2UgewotCQkJY3VyX29wcy0+ZXhwX3N5bmMoKTsKLQkJfQotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCA9PSBGVUxMU1RPUF9ET05UU1RPUCk7Ci0KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Zha2V3cml0ZXIgdGFzayBzdG9wcGluZyIpOwotCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCXJldHVybiAwOwotfQotCi12b2lkIHJjdXRvcnR1cmVfdHJhY2VfZHVtcCh2b2lkKQotewotCXN0YXRpYyBhdG9taWNfdCBiZWVuaGVyZSA9IEFUT01JQ19JTklUKDApOwotCi0JaWYgKGF0b21pY19yZWFkKCZiZWVuaGVyZSkpCi0JCXJldHVybjsKLQlpZiAoYXRvbWljX3hjaGcoJmJlZW5oZXJlLCAxKSAhPSAwKQotCQlyZXR1cm47Ci0JZnRyYWNlX2R1bXAoRFVNUF9BTEwpOwotfQotCi0vKgotICogUkNVIHRvcnR1cmUgcmVhZGVyIGZyb20gdGltZXIgaGFuZGxlci4gIERlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAotICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCi0gKiBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNob3VsZCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMSwgb3RoZXJ3aXNlLCB0aGUKLSAqIFJDVSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4uCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3RpbWVyKHVuc2lnbmVkIGxvbmcgdW51c2VkKQotewotCWludCBpZHg7Ci0JaW50IGNvbXBsZXRlZDsKLQlpbnQgY29tcGxldGVkX2VuZDsKLQlzdGF0aWMgREVGSU5FX1JDVV9SQU5ET00ocmFuZCk7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhyYW5kX2xvY2spOwotCXN0cnVjdCByY3VfdG9ydHVyZSAqcDsKLQlpbnQgcGlwZV9jb3VudDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdHM7Ci0KLQlpZHggPSBjdXJfb3BzLT5yZWFkbG9jaygpOwotCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOwotCXRzID0gcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKCk7Ci0JcCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAotCQkJCSAgcmN1X3JlYWRfbG9ja19iaF9oZWxkKCkgfHwKLQkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8Ci0JCQkJICBzcmN1X3JlYWRfbG9ja19oZWxkKCZzcmN1X2N0bCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJLyogTGVhdmUgYmVjYXVzZSByY3VfdG9ydHVyZV93cml0ZXIgaXMgbm90IHlldCB1bmRlcndheSAqLwotCQljdXJfb3BzLT5yZWFkdW5sb2NrKGlkeCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHAtPnJ0b3J0X21idGVzdCA9PSAwKQotCQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpOwotCXNwaW5fbG9jaygmcmFuZF9sb2NrKTsKLQljdXJfb3BzLT5yZWFkX2RlbGF5KCZyYW5kKTsKLQluX3JjdV90b3J0dXJlX3RpbWVycysrOwotCXNwaW5fdW5sb2NrKCZyYW5kX2xvY2spOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCXBpcGVfY291bnQgPSBwLT5ydG9ydF9waXBlX2NvdW50OwotCWlmIChwaXBlX2NvdW50ID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKLQkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dC4uLiAqLwotCQlwaXBlX2NvdW50ID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JfQotCWNvbXBsZXRlZF9lbmQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKTsKLQlpZiAocGlwZV9jb3VudCA+IDEpIHsKLQkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1LCB0cywKLQkJCQkJICBjb21wbGV0ZWQsIGNvbXBsZXRlZF9lbmQpOwotCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKLQl9Ci0JX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfY291bnRbcGlwZV9jb3VudF0pOwotCWNvbXBsZXRlZCA9IGNvbXBsZXRlZF9lbmQgLSBjb21wbGV0ZWQ7Ci0JaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7Ci0JCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KLQkJY29tcGxldGVkID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JfQotCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2JhdGNoW2NvbXBsZXRlZF0pOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwotfQotCi0vKgotICogUkNVIHRvcnR1cmUgcmVhZGVyIGt0aHJlYWQuICBSZXBlYXRlZGx5IGRlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAotICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCi0gKiBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNob3VsZCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMSwgb3RoZXJ3aXNlLCB0aGUKLSAqIFJDVSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4uCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX3JlYWRlcih2b2lkICphcmcpCi17Ci0JaW50IGNvbXBsZXRlZDsKLQlpbnQgY29tcGxldGVkX2VuZDsKLQlpbnQgaWR4OwotCURFRklORV9SQ1VfUkFORE9NKHJhbmQpOwotCXN0cnVjdCByY3VfdG9ydHVyZSAqcDsKLQlpbnQgcGlwZV9jb3VudDsKLQlzdHJ1Y3QgdGltZXJfbGlzdCB0OwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0czsKLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfcmVhZGVyIHRhc2sgc3RhcnRlZCIpOwotCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxX2NhcGFibGUpCi0JCXNldHVwX3RpbWVyX29uX3N0YWNrKCZ0LCByY3VfdG9ydHVyZV90aW1lciwgMCk7Ci0KLQlkbyB7Ci0JCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxX2NhcGFibGUpIHsKLQkJCWlmICghdGltZXJfcGVuZGluZygmdCkpCi0JCQkJbW9kX3RpbWVyKCZ0LCBqaWZmaWVzICsgMSk7Ci0JCX0KLQkJaWR4ID0gY3VyX29wcy0+cmVhZGxvY2soKTsKLQkJY29tcGxldGVkID0gY3VyX29wcy0+Y29tcGxldGVkKCk7Ci0JCXRzID0gcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKCk7Ci0JCXAgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2socmN1X3RvcnR1cmVfY3VycmVudCwKLQkJCQkJICByY3VfcmVhZF9sb2NrX2JoX2hlbGQoKSB8fAotCQkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8Ci0JCQkJCSAgc3JjdV9yZWFkX2xvY2tfaGVsZCgmc3JjdV9jdGwpKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJLyogV2FpdCBmb3IgcmN1X3RvcnR1cmVfd3JpdGVyIHRvIGdldCB1bmRlcndheSAqLwotCQkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChwLT5ydG9ydF9tYnRlc3QgPT0gMCkKLQkJCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfbWJlcnJvcik7Ci0JCWN1cl9vcHMtPnJlYWRfZGVsYXkoJnJhbmQpOwotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJcGlwZV9jb3VudCA9IHAtPnJ0b3J0X3BpcGVfY291bnQ7Ci0JCWlmIChwaXBlX2NvdW50ID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKLQkJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KLQkJCXBpcGVfY291bnQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKLQkJfQotCQljb21wbGV0ZWRfZW5kID0gY3VyX29wcy0+Y29tcGxldGVkKCk7Ci0JCWlmIChwaXBlX2NvdW50ID4gMSkgewotCQkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1LAotCQkJCQkJICB0cywgY29tcGxldGVkLCBjb21wbGV0ZWRfZW5kKTsKLQkJCXJjdXRvcnR1cmVfdHJhY2VfZHVtcCgpOwotCQl9Ci0JCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2NvdW50W3BpcGVfY291bnRdKTsKLQkJY29tcGxldGVkID0gY29tcGxldGVkX2VuZCAtIGNvbXBsZXRlZDsKLQkJaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7Ci0JCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCi0JCQljb21wbGV0ZWQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKLQkJfQotCQlfX3RoaXNfY3B1X2luYyhyY3VfdG9ydHVyZV9iYXRjaFtjb21wbGV0ZWRdKTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwotCQlzY2hlZHVsZSgpOwotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9yZWFkZXIiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0b3BwaW5nIik7Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3JlYWRlciIpOwotCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxX2NhcGFibGUpCi0JCWRlbF90aW1lcl9zeW5jKCZ0KTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYW4gUkNVLXRvcnR1cmUgc3RhdGlzdGljcyBtZXNzYWdlIGluIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgotICovCi1zdGF0aWMgdm9pZAotcmN1X3RvcnR1cmVfcHJpbnRrKGNoYXIgKnBhZ2UpCi17Ci0JaW50IGNwdTsKLQlpbnQgaTsKLQlsb25nIHBpcGVzdW1tYXJ5W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0gPSB7IDAgfTsKLQlsb25nIGJhdGNoc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykgewotCQkJcGlwZXN1bW1hcnlbaV0gKz0gcGVyX2NwdShyY3VfdG9ydHVyZV9jb3VudCwgY3B1KVtpXTsKLQkJCWJhdGNoc3VtbWFyeVtpXSArPSBwZXJfY3B1KHJjdV90b3J0dXJlX2JhdGNoLCBjcHUpW2ldOwotCQl9Ci0JfQotCWZvciAoaSA9IFJDVV9UT1JUVVJFX1BJUEVfTEVOIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKHBpcGVzdW1tYXJ5W2ldICE9IDApCi0JCQlicmVhazsKLQl9Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKLQlwYWdlICs9IHNwcmludGYocGFnZSwKLQkJICAgICAgICJydGM6ICVwIHZlcjogJWx1IHRmbGU6ICVkIHJ0YTogJWQgcnRhZjogJWQgcnRmOiAlZCAiLAotCQkgICAgICAgcmN1X3RvcnR1cmVfY3VycmVudCwKLQkJICAgICAgIHJjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbiwKLQkJICAgICAgIGxpc3RfZW1wdHkoJnJjdV90b3J0dXJlX2ZyZWVsaXN0KSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jKSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwpLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfZnJlZSkpOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAicnRtYmU6ICVkIHJ0YmtlOiAlbGQgcnRicmU6ICVsZCAiLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvciksCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yLAotCQkgICAgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yKTsKLQlwYWdlICs9IHNwcmludGYocGFnZSwgInJ0YmY6ICVsZCBydGI6ICVsZCBudDogJWxkICIsCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUsCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0cywKLQkJICAgICAgIG5fcmN1X3RvcnR1cmVfdGltZXJzKTsKLQlwYWdlICs9IHNwcmludGYocGFnZSwKLQkJICAgICAgICJvbm9mZjogJWxkLyVsZDolbGQvJWxkICVkLCVkOiVkLCVkICVsdTolbHUgKEhaPSVkKSAiLAotCQkgICAgICAgbl9vbmxpbmVfc3VjY2Vzc2VzLCBuX29ubGluZV9hdHRlbXB0cywKLQkJICAgICAgIG5fb2ZmbGluZV9zdWNjZXNzZXMsIG5fb2ZmbGluZV9hdHRlbXB0cywKLQkJICAgICAgIG1pbl9vbmxpbmUsIG1heF9vbmxpbmUsCi0JCSAgICAgICBtaW5fb2ZmbGluZSwgbWF4X29mZmxpbmUsCi0JCSAgICAgICBzdW1fb25saW5lLCBzdW1fb2ZmbGluZSwgSFopOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiYmFycmllcjogJWxkLyVsZDolbGQiLAotCQkgICAgICAgbl9iYXJyaWVyX3N1Y2Nlc3NlcywKLQkJICAgICAgIG5fYmFycmllcl9hdHRlbXB0cywKLQkJICAgICAgIG5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvcik7Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJcbiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwotCWlmIChhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yKSAhPSAwIHx8Ci0JICAgIG5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvciAhPSAwIHx8Ci0JICAgIG5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgIT0gMCB8fAotCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IgIT0gMCB8fAotCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUgIT0gMCB8fAotCSAgICBpID4gMSkgewotCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiEhISAiKTsKLQkJYXRvbWljX2luYygmbl9yY3VfdG9ydHVyZV9lcnJvcik7Ci0JCVdBUk5fT05fT05DRSgxKTsKLQl9Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJSZWFkZXIgUGlwZTogIik7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQotCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlbGQiLCBwaXBlc3VtbWFyeVtpXSk7Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJcbiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiUmVhZGVyIEJhdGNoOiAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxOyBpKyspCi0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiICVsZCIsIGJhdGNoc3VtbWFyeVtpXSk7Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJcbiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiRnJlZS1CbG9jayBDaXJjdWxhdGlvbjogIik7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7Ci0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiICVkIiwKLQkJCSAgICAgICBhdG9taWNfcmVhZCgmcmN1X3RvcnR1cmVfd2NvdW50W2ldKSk7Ci0JfQotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4iKTsKLQlpZiAoY3VyX29wcy0+c3RhdHMpCi0JCWN1cl9vcHMtPnN0YXRzKHBhZ2UpOwotfQotCi0vKgotICogUHJpbnQgdG9ydHVyZSBzdGF0aXN0aWNzLiAgQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgb25seQotICogb25lIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBhdCBhIGdpdmVuIHRpbWUhISEgIFRoaXMgaXMgbm9ybWFsbHkKLSAqIGFjY29tcGxpc2hlZCBieSByZWx5aW5nIG9uIHRoZSBtb2R1bGUgc3lzdGVtIHRvIG9ubHkgaGF2ZSBvbmUgY29weQotICogb2YgdGhlIG1vZHVsZSBsb2FkZWQsIGFuZCB0aGVuIGJ5IGdpdmluZyB0aGUgcmN1X3RvcnR1cmVfc3RhdHMKLSAqIGt0aHJlYWQgZnVsbCBjb250cm9sIChvciB0aGUgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucyB3aGVuIHJjdV90b3J0dXJlX3N0YXRzCi0gKiB0aHJlYWQgaXMgbm90IHJ1bm5pbmcpLgotICovCi1zdGF0aWMgdm9pZAotcmN1X3RvcnR1cmVfc3RhdHNfcHJpbnQodm9pZCkKLXsKLQlpbnQgc2l6ZSA9IG5yX2NwdV9pZHMgKiAyMDAgKyA4MTkyOwotCWNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJcHJfZXJyKCJyY3UtdG9ydHVyZTogT3V0IG9mIG1lbW9yeSwgbmVlZDogJWQiLCBzaXplKTsKLQkJcmV0dXJuOwotCX0KLQlyY3VfdG9ydHVyZV9wcmludGsoYnVmKTsKLQlwcl9hbGVydCgiJXMiLCBidWYpOwotCWtmcmVlKGJ1Zik7Ci19Ci0KLS8qCi0gKiBQZXJpb2RpY2FsbHkgcHJpbnRzIHRvcnR1cmUgc3RhdGlzdGljcywgaWYgcGVyaW9kaWMgc3RhdGlzdGljcyBwcmludGluZwotICogd2FzIHNwZWNpZmllZCB2aWEgdGhlIHN0YXRfaW50ZXJ2YWwgbW9kdWxlIHBhcmFtZXRlci4KLSAqCi0gKiBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IGZ1bGxzdG9wIGhlcmUsIHNpbmNlIHRoaXMgb25lIGRvZXNuJ3QgcmVmZXJlbmNlCi0gKiB2b2xhdGlsZSBzdGF0ZSBvciByZWdpc3RlciBjYWxsYmFja3MuCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX3N0YXRzKHZvaWQgKmFyZykKLXsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YXRzIHRhc2sgc3RhcnRlZCIpOwotCWRvIHsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7Ci0JCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7Ci0JCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zdGF0cyIpOwotCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc3RhdHMgdGFzayBzdG9wcGluZyIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJjdV9pZGxlX2NwdTsJLyogRm9yY2UgYWxsIHRvcnR1cmUgdGFza3Mgb2ZmIHRoaXMgQ1BVICovCi0KLS8qIFNodWZmbGUgdGFza3Mgc3VjaCB0aGF0IHdlIGFsbG93IEByY3VfaWRsZV9jcHUgdG8gYmVjb21lIGlkbGUuIEEgc3BlY2lhbCBjYXNlCi0gKiBpcyB3aGVuIEByY3VfaWRsZV9jcHUgPSAtMSwgd2hlbiB3ZSBhbGxvdyB0aGUgdGFza3MgdG8gcnVuIG9uIGFsbCBDUFVzLgotICovCi1zdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9zaHVmZmxlX3Rhc2tzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQljcHVtYXNrX3NldGFsbChzaHVmZmxlX3RtcF9tYXNrKTsKLQlnZXRfb25saW5lX2NwdXMoKTsKLQotCS8qIE5vIHBvaW50IGluIHNodWZmbGluZyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBvbmxpbmUgQ1BVIChleDogVVApICovCi0JaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpIHsKLQkJcHV0X29ubGluZV9jcHVzKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocmN1X2lkbGVfY3B1ICE9IC0xKQotCQljcHVtYXNrX2NsZWFyX2NwdShyY3VfaWRsZV9jcHUsIHNodWZmbGVfdG1wX21hc2spOwotCi0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgc2h1ZmZsZV90bXBfbWFzayk7Ci0KLQlpZiAocmVhZGVyX3Rhc2tzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBucmVhbHJlYWRlcnM7IGkrKykKLQkJCWlmIChyZWFkZXJfdGFza3NbaV0pCi0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIocmVhZGVyX3Rhc2tzW2ldLAotCQkJCQkJICAgICBzaHVmZmxlX3RtcF9tYXNrKTsKLQl9Ci0JaWYgKGZha2V3cml0ZXJfdGFza3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKQotCQkJaWYgKGZha2V3cml0ZXJfdGFza3NbaV0pCi0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoZmFrZXdyaXRlcl90YXNrc1tpXSwKLQkJCQkJCSAgICAgc2h1ZmZsZV90bXBfbWFzayk7Ci0JfQotCWlmICh3cml0ZXJfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIod3JpdGVyX3Rhc2ssIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChzdGF0c190YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdGF0c190YXNrLCBzaHVmZmxlX3RtcF9tYXNrKTsKLQlpZiAoc3R1dHRlcl90YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdHV0dGVyX3Rhc2ssIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChmcXNfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoZnFzX3Rhc2ssIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChzaHV0ZG93bl90YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzaHV0ZG93bl90YXNrLCBzaHVmZmxlX3RtcF9tYXNrKTsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQlpZiAob25vZmZfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIob25vZmZfdGFzaywgc2h1ZmZsZV90bXBfbWFzayk7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwotCWlmIChzdGFsbF90YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdGFsbF90YXNrLCBzaHVmZmxlX3RtcF9tYXNrKTsKLQlpZiAoYmFycmllcl9jYnNfdGFza3MpCi0JCWZvciAoaSA9IDA7IGkgPCBuX2JhcnJpZXJfY2JzOyBpKyspCi0JCQlpZiAoYmFycmllcl9jYnNfdGFza3NbaV0pCi0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoYmFycmllcl9jYnNfdGFza3NbaV0sCi0JCQkJCQkgICAgIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChiYXJyaWVyX3Rhc2spCi0JCXNldF9jcHVzX2FsbG93ZWRfcHRyKGJhcnJpZXJfdGFzaywgc2h1ZmZsZV90bXBfbWFzayk7Ci0KLQlpZiAocmN1X2lkbGVfY3B1ID09IC0xKQotCQlyY3VfaWRsZV9jcHUgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7Ci0JZWxzZQotCQlyY3VfaWRsZV9jcHUtLTsKLQotCXB1dF9vbmxpbmVfY3B1cygpOwotfQotCi0vKiBTaHVmZmxlIHRhc2tzIGFjcm9zcyBDUFVzLCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgZWFjaCBDUFUgaW4gdGhlCi0gKiBzeXN0ZW0gdG8gYmVjb21lIGlkbGUgYXQgYSB0aW1lIGFuZCBjdXQgb2ZmIGl0cyB0aW1lciB0aWNrcy4gVGhpcyBpcyBtZWFudAotICogdG8gdGVzdCB0aGUgc3VwcG9ydCBmb3Igc3VjaCB0aWNrbGVzcyBpZGxlIENQVSBpbiBSQ1UuCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX3NodWZmbGUodm9pZCAqYXJnKQotewotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1ZmZsZSB0YXNrIHN0YXJ0ZWQiKTsKLQlkbyB7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzaHVmZmxlX2ludGVydmFsICogSFopOwotCQlyY3VfdG9ydHVyZV9zaHVmZmxlX3Rhc2tzKCk7Ci0JCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zaHVmZmxlIik7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Ci0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zaHVmZmxlIHRhc2sgc3RvcHBpbmciKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ2F1c2UgdGhlIHJjdXRvcnR1cmUgdGVzdCB0byAic3R1dHRlciIsIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBhbGwKLSAqIHRocmVhZHMgcGVyaW9kaWNhbGx5LgotICovCi1zdGF0aWMgaW50Ci1yY3VfdG9ydHVyZV9zdHV0dGVyKHZvaWQgKmFyZykKLXsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0dXR0ZXIgdGFzayBzdGFydGVkIik7Ci0JZG8gewotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc3R1dHRlciAqIEhaKTsKLQkJc3R1dHRlcl9wYXVzZV90ZXN0ID0gMTsKLQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc3R1dHRlciAqIEhaKTsKLQkJc3R1dHRlcl9wYXVzZV90ZXN0ID0gMDsKLQkJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3N0dXR0ZXIiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0dXR0ZXIgdGFzayBzdG9wcGluZyIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzICpjdXJfb3BzLCBjb25zdCBjaGFyICp0YWcpCi17Ci0JcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKLQkJICItLS0gJXM6IG5yZWFkZXJzPSVkIG5mYWtld3JpdGVycz0lZCAiCi0JCSAic3RhdF9pbnRlcnZhbD0lZCB2ZXJib3NlPSVkIHRlc3Rfbm9faWRsZV9oej0lZCAiCi0JCSAic2h1ZmZsZV9pbnRlcnZhbD0lZCBzdHV0dGVyPSVkIGlycXJlYWRlcj0lZCAiCi0JCSAiZnFzX2R1cmF0aW9uPSVkIGZxc19ob2xkb2ZmPSVkIGZxc19zdHV0dGVyPSVkICIKLQkJICJ0ZXN0X2Jvb3N0PSVkLyVkIHRlc3RfYm9vc3RfaW50ZXJ2YWw9JWQgIgotCQkgInRlc3RfYm9vc3RfZHVyYXRpb249JWQgc2h1dGRvd25fc2Vjcz0lZCAiCi0JCSAic3RhbGxfY3B1PSVkIHN0YWxsX2NwdV9ob2xkb2ZmPSVkICIKLQkJICJuX2JhcnJpZXJfY2JzPSVkICIKLQkJICJvbm9mZl9pbnRlcnZhbD0lZCBvbm9mZl9ob2xkb2ZmPSVkXG4iLAotCQkgdG9ydHVyZV90eXBlLCB0YWcsIG5yZWFscmVhZGVycywgbmZha2V3cml0ZXJzLAotCQkgc3RhdF9pbnRlcnZhbCwgdmVyYm9zZSwgdGVzdF9ub19pZGxlX2h6LCBzaHVmZmxlX2ludGVydmFsLAotCQkgc3R1dHRlciwgaXJxcmVhZGVyLCBmcXNfZHVyYXRpb24sIGZxc19ob2xkb2ZmLCBmcXNfc3R1dHRlciwKLQkJIHRlc3RfYm9vc3QsIGN1cl9vcHMtPmNhbl9ib29zdCwKLQkJIHRlc3RfYm9vc3RfaW50ZXJ2YWwsIHRlc3RfYm9vc3RfZHVyYXRpb24sIHNodXRkb3duX3NlY3MsCi0JCSBzdGFsbF9jcHUsIHN0YWxsX2NwdV9ob2xkb2ZmLAotCQkgbl9iYXJyaWVyX2NicywKLQkJIG9ub2ZmX2ludGVydmFsLCBvbm9mZl9ob2xkb2ZmKTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX3NodXRkb3duX25iID0gewotCS5ub3RpZmllcl9jYWxsID0gcmN1dG9ydHVyZV9zaHV0ZG93bl9ub3RpZnksCi19OwotCi1zdGF0aWMgdm9pZCByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpbnQgY3B1KQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCWlmIChib29zdF90YXNrc1tjcHVdID09IE5VTEwpCi0JCXJldHVybjsKLQltdXRleF9sb2NrKCZib29zdF9tdXRleCk7Ci0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9ib29zdCB0YXNrIik7Ci0JdCA9IGJvb3N0X3Rhc2tzW2NwdV07Ci0JYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZib29zdF9tdXRleCk7Ci0KLQkvKiBUaGlzIG11c3QgYmUgb3V0c2lkZSBvZiB0aGUgbXV0ZXgsIG90aGVyd2lzZSBkZWFkbG9jayEgKi8KLQlrdGhyZWFkX3N0b3AodCk7Ci0JYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaW50IGNwdSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKGJvb3N0X3Rhc2tzW2NwdV0gIT0gTlVMTCkKLQkJcmV0dXJuIDA7ICAvKiBBbHJlYWR5IGNyZWF0ZWQsIG5vdGhpbmcgbW9yZSB0byBkby4gKi8KLQotCS8qIERvbid0IGFsbG93IHRpbWUgcmVjYWxjdWxhdGlvbiB3aGlsZSBjcmVhdGluZyBhIG5ldyB0YXNrLiAqLwotCW11dGV4X2xvY2soJmJvb3N0X211dGV4KTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIkNyZWF0aW5nIHJjdV90b3J0dXJlX2Jvb3N0IHRhc2siKTsKLQlib29zdF90YXNrc1tjcHVdID0ga3RocmVhZF9jcmVhdGVfb25fbm9kZShyY3VfdG9ydHVyZV9ib29zdCwgTlVMTCwKLQkJCQkJCSAgY3B1X3RvX25vZGUoY3B1KSwKLQkJCQkJCSAgInJjdV90b3J0dXJlX2Jvb3N0Iik7Ci0JaWYgKElTX0VSUihib29zdF90YXNrc1tjcHVdKSkgewotCQlyZXR2YWwgPSBQVFJfRVJSKGJvb3N0X3Rhc2tzW2NwdV0pOwotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IHRhc2sgY3JlYXRlIGZhaWxlZCIpOwotCQluX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yKys7Ci0JCWJvb3N0X3Rhc2tzW2NwdV0gPSBOVUxMOwotCQltdXRleF91bmxvY2soJmJvb3N0X211dGV4KTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0Ja3RocmVhZF9iaW5kKGJvb3N0X3Rhc2tzW2NwdV0sIGNwdSk7Ci0Jd2FrZV91cF9wcm9jZXNzKGJvb3N0X3Rhc2tzW2NwdV0pOwotCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi0vKgotICogQ2F1c2UgdGhlIHJjdXRvcnR1cmUgdGVzdCB0byBzaHV0ZG93biB0aGUgc3lzdGVtIGFmdGVyIHRoZSB0ZXN0IGhhcwotICogcnVuIGZvciB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlIHNodXRkb3duX3NlY3MgbW9kdWxlIHBhcmFtZXRlci4KLSAqLwotc3RhdGljIGludAotcmN1X3RvcnR1cmVfc2h1dGRvd24odm9pZCAqYXJnKQotewotCWxvbmcgZGVsdGE7Ci0JdW5zaWduZWQgbG9uZyBqaWZmaWVzX3NuYXA7Ci0KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3NodXRkb3duIHRhc2sgc3RhcnRlZCIpOwotCWppZmZpZXNfc25hcCA9IEFDQ0VTU19PTkNFKGppZmZpZXMpOwotCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllc19zbmFwLCBzaHV0ZG93bl90aW1lKSAmJgotCSAgICAgICAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWRlbHRhID0gc2h1dGRvd25fdGltZSAtIGppZmZpZXNfc25hcDsKLQkJaWYgKHZlcmJvc2UpCi0JCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCSAicmN1X3RvcnR1cmVfc2h1dGRvd24gdGFzazogJWx1IGppZmZpZXMgcmVtYWluaW5nXG4iLAotCQkJCSB0b3J0dXJlX3R5cGUsIGRlbHRhKTsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGRlbHRhKTsKLQkJamlmZmllc19zbmFwID0gQUNDRVNTX09OQ0UoamlmZmllcyk7Ci0JfQotCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zaHV0ZG93biB0YXNrIHN0b3BwaW5nIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE9LLCBzaHV0IGRvd24gdGhlIHN5c3RlbS4gKi8KLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1dGRvd24gdGFzayBzaHV0dGluZyBkb3duIHN5c3RlbSIpOwotCXNodXRkb3duX3Rhc2sgPSBOVUxMOwkvKiBBdm9pZCBzZWxmLWtpbGwgZGVhZGxvY2suICovCi0JcmN1X3RvcnR1cmVfY2xlYW51cCgpOwkvKiBHZXQgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBtZXNzYWdlLiAqLwotCWtlcm5lbF9wb3dlcl9vZmYoKTsJLyogU2h1dCBkb3duIHRoZSBzeXN0ZW0uICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQotLyoKLSAqIEV4ZWN1dGUgcmFuZG9tIENQVS1ob3RwbHVnIG9wZXJhdGlvbnMgYXQgdGhlIGludGVydmFsIHNwZWNpZmllZAotICogYnkgdGhlIG9ub2ZmX2ludGVydmFsLgotICovCi1zdGF0aWMgaW50Ci1yY3VfdG9ydHVyZV9vbm9mZih2b2lkICphcmcpCi17Ci0JaW50IGNwdTsKLQl1bnNpZ25lZCBsb25nIGRlbHRhOwotCWludCBtYXhjcHUgPSAtMTsKLQlERUZJTkVfUkNVX1JBTkRPTShyYW5kKTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgc3RhcnR0aW1lOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9vbm9mZiB0YXNrIHN0YXJ0ZWQiKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJbWF4Y3B1ID0gY3B1OwotCVdBUk5fT04obWF4Y3B1IDwgMCk7Ci0JaWYgKG9ub2ZmX2hvbGRvZmYgPiAwKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfb25vZmYgYmVnaW4gaG9sZG9mZiIpOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUob25vZmZfaG9sZG9mZiAqIEhaKTsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9vbm9mZiBlbmQgaG9sZG9mZiIpOwotCX0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQljcHUgPSAocmN1X3JhbmRvbSgmcmFuZCkgPj4gNCkgJSAobWF4Y3B1ICsgMSk7Ci0JCWlmIChjcHVfb25saW5lKGNwdSkgJiYgY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmluZyAlZFxuIiwKLQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKLQkJCXN0YXJ0dGltZSA9IGppZmZpZXM7Ci0JCQluX29mZmxpbmVfYXR0ZW1wdHMrKzsKLQkJCXJldCA9IGNwdV9kb3duKGNwdSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmUgJWQgZmFpbGVkOiBlcnJubyAlZFxuIiwKLQkJCQkJCSB0b3J0dXJlX3R5cGUsIGNwdSwgcmV0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmVkICVkXG4iLAotCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKLQkJCQluX29mZmxpbmVfc3VjY2Vzc2VzKys7Ci0JCQkJZGVsdGEgPSBqaWZmaWVzIC0gc3RhcnR0aW1lOwotCQkJCXN1bV9vZmZsaW5lICs9IGRlbHRhOwotCQkJCWlmIChtaW5fb2ZmbGluZSA8IDApIHsKLQkJCQkJbWluX29mZmxpbmUgPSBkZWx0YTsKLQkJCQkJbWF4X29mZmxpbmUgPSBkZWx0YTsKLQkJCQl9Ci0JCQkJaWYgKG1pbl9vZmZsaW5lID4gZGVsdGEpCi0JCQkJCW1pbl9vZmZsaW5lID0gZGVsdGE7Ci0JCQkJaWYgKG1heF9vZmZsaW5lIDwgZGVsdGEpCi0JCQkJCW1heF9vZmZsaW5lID0gZGVsdGE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9ubGluaW5nICVkXG4iLAotCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUpOwotCQkJc3RhcnR0aW1lID0gamlmZmllczsKLQkJCW5fb25saW5lX2F0dGVtcHRzKys7Ci0JCQlyZXQgPSBjcHVfdXAoY3B1KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKLQkJCQkJCSAicmN1X3RvcnR1cmVfb25vZmYgdGFzazogb25saW5lICVkIGZhaWxlZDogZXJybm8gJWRcbiIsCi0JCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUsIHJldCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh2ZXJib3NlKQotCQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCQkJICJyY3VfdG9ydHVyZV9vbm9mZiB0YXNrOiBvbmxpbmVkICVkXG4iLAotCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKLQkJCQluX29ubGluZV9zdWNjZXNzZXMrKzsKLQkJCQlkZWx0YSA9IGppZmZpZXMgLSBzdGFydHRpbWU7Ci0JCQkJc3VtX29ubGluZSArPSBkZWx0YTsKLQkJCQlpZiAobWluX29ubGluZSA8IDApIHsKLQkJCQkJbWluX29ubGluZSA9IGRlbHRhOwotCQkJCQltYXhfb25saW5lID0gZGVsdGE7Ci0JCQkJfQotCQkJCWlmIChtaW5fb25saW5lID4gZGVsdGEpCi0JCQkJCW1pbl9vbmxpbmUgPSBkZWx0YTsKLQkJCQlpZiAobWF4X29ubGluZSA8IGRlbHRhKQotCQkJCQltYXhfb25saW5lID0gZGVsdGE7Ci0JCQl9Ci0JCX0KLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG9ub2ZmX2ludGVydmFsICogSFopOwotCX0KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX29ub2ZmIHRhc2sgc3RvcHBpbmciKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcmN1X3RvcnR1cmVfb25vZmZfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpZiAob25vZmZfaW50ZXJ2YWwgPD0gMCkKLQkJcmV0dXJuIDA7Ci0Jb25vZmZfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX29ub2ZmLCBOVUxMLCAicmN1X3RvcnR1cmVfb25vZmYiKTsKLQlpZiAoSVNfRVJSKG9ub2ZmX3Rhc2spKSB7Ci0JCXJldCA9IFBUUl9FUlIob25vZmZfdGFzayk7Ci0JCW9ub2ZmX3Rhc2sgPSBOVUxMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfb25vZmZfY2xlYW51cCh2b2lkKQotewotCWlmIChvbm9mZl90YXNrID09IE5VTEwpCi0JCXJldHVybjsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX29ub2ZmIHRhc2siKTsKLQlrdGhyZWFkX3N0b3Aob25vZmZfdGFzayk7Ci0Jb25vZmZfdGFzayA9IE5VTEw7Ci19Ci0KLSNlbHNlIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQotc3RhdGljIGludAotcmN1X3RvcnR1cmVfb25vZmZfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9vbm9mZl9jbGVhbnVwKHZvaWQpCi17Ci19Ci0KLSNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCi0KLS8qCi0gKiBDUFUtc3RhbGwga3RocmVhZC4gIEl0IHdhaXRzIGFzIHNwZWNpZmllZCBieSBzdGFsbF9jcHVfaG9sZG9mZiwgdGhlbgotICogaW5kdWNlcyBhIENQVSBzdGFsbCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IHN0YWxsX2NwdS4KLSAqLwotc3RhdGljIGludCByY3VfdG9ydHVyZV9zdGFsbCh2b2lkICphcmdzKQotewotCXVuc2lnbmVkIGxvbmcgc3RvcF9hdDsKLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc3RhbGwgdGFzayBzdGFydGVkIik7Ci0JaWYgKHN0YWxsX2NwdV9ob2xkb2ZmID4gMCkgewotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YWxsIGJlZ2luIGhvbGRvZmYiKTsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YWxsX2NwdV9ob2xkb2ZmICogSFopOwotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YWxsIGVuZCBob2xkb2ZmIik7Ci0JfQotCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXN0b3BfYXQgPSBnZXRfc2Vjb25kcygpICsgc3RhbGxfY3B1OwotCQkvKiBSQ1UgQ1BVIHN0YWxsIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGluIGZvbGxvd2luZyBjb2RlLiAqLwotCQlwcl9hbGVydCgicmN1X3RvcnR1cmVfc3RhbGwgc3RhcnQuXG4iKTsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJd2hpbGUgKFVMT05HX0NNUF9MVChnZXRfc2Vjb25kcygpLCBzdG9wX2F0KSkKLQkJCWNvbnRpbnVlOyAgLyogSW5kdWNlIFJDVSBDUFUgc3RhbGwgd2FybmluZy4gKi8KLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXByX2FsZXJ0KCJyY3VfdG9ydHVyZV9zdGFsbCBlbmQuXG4iKTsKLQl9Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3N0YWxsIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxMCAqIEhaKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogU3Bhd24gQ1BVLXN0YWxsIGt0aHJlYWQsIGlmIHN0YWxsX2NwdSBzcGVjaWZpZWQuICovCi1zdGF0aWMgaW50IF9faW5pdCByY3VfdG9ydHVyZV9zdGFsbF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWlmIChzdGFsbF9jcHUgPD0gMCkKLQkJcmV0dXJuIDA7Ci0Jc3RhbGxfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX3N0YWxsLCBOVUxMLCAicmN1X3RvcnR1cmVfc3RhbGwiKTsKLQlpZiAoSVNfRVJSKHN0YWxsX3Rhc2spKSB7Ci0JCXJldCA9IFBUUl9FUlIoc3RhbGxfdGFzayk7Ci0JCXN0YWxsX3Rhc2sgPSBOVUxMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIENQVS1zdGFsbCBrdGhyZWFkLCBpZiBvbmUgd2FzIHNwYXduZWQuICovCi1zdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9zdGFsbF9jbGVhbnVwKHZvaWQpCi17Ci0JaWYgKHN0YWxsX3Rhc2sgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfc3RhbGxfdGFzay4iKTsKLQlrdGhyZWFkX3N0b3Aoc3RhbGxfdGFzayk7Ci0Jc3RhbGxfdGFzayA9IE5VTEw7Ci19Ci0KLS8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBSQ1UgYmFycmllciB0ZXN0aW5nLiAqLwotdm9pZCByY3VfdG9ydHVyZV9iYXJyaWVyX2NiZihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlhdG9taWNfaW5jKCZiYXJyaWVyX2Nic19pbnZva2VkKTsKLX0KLQotLyoga3RocmVhZCBmdW5jdGlvbiB0byByZWdpc3RlciBjYWxsYmFja3MgdXNlZCB0byB0ZXN0IFJDVSBiYXJyaWVycy4gKi8KLXN0YXRpYyBpbnQgcmN1X3RvcnR1cmVfYmFycmllcl9jYnModm9pZCAqYXJnKQotewotCWxvbmcgbXlpZCA9IChsb25nKWFyZzsKLQlib29sIGxhc3RwaGFzZSA9IDA7Ci0JYm9vbCBuZXdwaGFzZTsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCi0JaW5pdF9yY3VfaGVhZF9vbl9zdGFjaygmcmN1KTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXJfY2JzIHRhc2sgc3RhcnRlZCIpOwotCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWRvIHsKLQkJd2FpdF9ldmVudChiYXJyaWVyX2Nic193cVtteWlkXSwKLQkJCSAgIChuZXdwaGFzZSA9Ci0JCQkgICAgQUNDRVNTX09OQ0UoYmFycmllcl9waGFzZSkpICE9IGxhc3RwaGFzZSB8fAotCQkJICAga3RocmVhZF9zaG91bGRfc3RvcCgpIHx8Ci0JCQkgICBmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCk7Ci0JCWxhc3RwaGFzZSA9IG5ld3BoYXNlOwotCQlzbXBfbWIoKTsgLyogZW5zdXJlIGJhcnJpZXJfcGhhc2UgbG9hZCBiZWZvcmUgLT5jYWxsKCkuICovCi0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgZnVsbHN0b3AgIT0gRlVMTFNUT1BfRE9OVFNUT1ApCi0JCQlicmVhazsKLQkJY3VyX29wcy0+Y2FsbCgmcmN1LCByY3VfdG9ydHVyZV9iYXJyaWVyX2NiZik7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZiYXJyaWVyX2Nic19jb3VudCkpCi0JCQl3YWtlX3VwKCZiYXJyaWVyX3dxKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXJfY2JzIHRhc2sgc3RvcHBpbmciKTsKLQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfYmFycmllcl9jYnMiKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwotCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKLQlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyY3UpOwotCXJldHVybiAwOwotfQotCi0vKiBrdGhyZWFkIGZ1bmN0aW9uIHRvIGRyaXZlIGFuZCBjb29yZGluYXRlIFJDVSBiYXJyaWVyIHRlc3RpbmcuICovCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX2JhcnJpZXIodm9pZCAqYXJnKQotewotCWludCBpOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9iYXJyaWVyIHRhc2sgc3RhcnRpbmciKTsKLQlkbyB7Ci0JCWF0b21pY19zZXQoJmJhcnJpZXJfY2JzX2ludm9rZWQsIDApOwotCQlhdG9taWNfc2V0KCZiYXJyaWVyX2Nic19jb3VudCwgbl9iYXJyaWVyX2Nicyk7Ci0JCXNtcF9tYigpOyAvKiBFbnN1cmUgYmFycmllcl9waGFzZSBhZnRlciBwcmlvciBhc3NpZ25tZW50cy4gKi8KLQkJYmFycmllcl9waGFzZSA9ICFiYXJyaWVyX3BoYXNlOwotCQlmb3IgKGkgPSAwOyBpIDwgbl9iYXJyaWVyX2NiczsgaSsrKQotCQkJd2FrZV91cCgmYmFycmllcl9jYnNfd3FbaV0pOwotCQl3YWl0X2V2ZW50KGJhcnJpZXJfd3EsCi0JCQkgICBhdG9taWNfcmVhZCgmYmFycmllcl9jYnNfY291bnQpID09IDAgfHwKLQkJCSAgIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fAotCQkJICAgZnVsbHN0b3AgIT0gRlVMTFNUT1BfRE9OVFNUT1ApOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGZ1bGxzdG9wICE9IEZVTExTVE9QX0RPTlRTVE9QKQotCQkJYnJlYWs7Ci0JCW5fYmFycmllcl9hdHRlbXB0cysrOwotCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7IC8qIEltcGxpZXMgc21wX21iKCkgZm9yIHdhaXRfZXZlbnQoKS4gKi8KLQkJaWYgKGF0b21pY19yZWFkKCZiYXJyaWVyX2Nic19pbnZva2VkKSAhPSBuX2JhcnJpZXJfY2JzKSB7Ci0JCQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IrKzsKLQkJCVdBUk5fT05fT05DRSgxKTsKLQkJfQotCQluX2JhcnJpZXJfc3VjY2Vzc2VzKys7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWiAvIDEwKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXIgdGFzayBzdG9wcGluZyIpOwotCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9iYXJyaWVyIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogSW5pdGlhbGl6ZSBSQ1UgYmFycmllciB0ZXN0aW5nLiAqLwotc3RhdGljIGludCByY3VfdG9ydHVyZV9iYXJyaWVyX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JaWYgKG5fYmFycmllcl9jYnMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGN1cl9vcHMtPmNhbGwgPT0gTlVMTCB8fCBjdXJfb3BzLT5jYl9iYXJyaWVyID09IE5VTEwpIHsKLQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKLQkJCSAiIENhbGwgb3IgYmFycmllciBvcHMgbWlzc2luZyBmb3IgJXMsXG4iLAotCQkJIHRvcnR1cmVfdHlwZSwgY3VyX29wcy0+bmFtZSk7Ci0JCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkgIiBSQ1UgYmFycmllciB0ZXN0aW5nIG9taXR0ZWQgZnJvbSBydW4uXG4iLAotCQkJIHRvcnR1cmVfdHlwZSk7Ci0JCXJldHVybiAwOwotCX0KLQlhdG9taWNfc2V0KCZiYXJyaWVyX2Nic19jb3VudCwgMCk7Ci0JYXRvbWljX3NldCgmYmFycmllcl9jYnNfaW52b2tlZCwgMCk7Ci0JYmFycmllcl9jYnNfdGFza3MgPQotCQlremFsbG9jKG5fYmFycmllcl9jYnMgKiBzaXplb2YoYmFycmllcl9jYnNfdGFza3NbMF0pLAotCQkJR0ZQX0tFUk5FTCk7Ci0JYmFycmllcl9jYnNfd3EgPQotCQlremFsbG9jKG5fYmFycmllcl9jYnMgKiBzaXplb2YoYmFycmllcl9jYnNfd3FbMF0pLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGJhcnJpZXJfY2JzX3Rhc2tzID09IE5VTEwgfHwgIWJhcnJpZXJfY2JzX3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgbl9iYXJyaWVyX2NiczsgaSsrKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJhcnJpZXJfY2JzX3dxW2ldKTsKLQkJYmFycmllcl9jYnNfdGFza3NbaV0gPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9iYXJyaWVyX2NicywKLQkJCQkJCSAgICh2b2lkICopKGxvbmcpaSwKLQkJCQkJCSAgICJyY3VfdG9ydHVyZV9iYXJyaWVyX2NicyIpOwotCQlpZiAoSVNfRVJSKGJhcnJpZXJfY2JzX3Rhc2tzW2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihiYXJyaWVyX2Nic190YXNrc1tpXSk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgcmN1X3RvcnR1cmVfYmFycmllcl9jYnMiKTsKLQkJCWJhcnJpZXJfY2JzX3Rhc2tzW2ldID0gTlVMTDsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0JYmFycmllcl90YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfYmFycmllciwgTlVMTCwKLQkJCQkgICAicmN1X3RvcnR1cmVfYmFycmllciIpOwotCWlmIChJU19FUlIoYmFycmllcl90YXNrKSkgewotCQlyZXQgPSBQVFJfRVJSKGJhcnJpZXJfdGFzayk7Ci0JCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSByY3VfdG9ydHVyZV9iYXJyaWVyIik7Ci0JCWJhcnJpZXJfdGFzayA9IE5VTEw7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBDbGVhbiB1cCBhZnRlciBSQ1UgYmFycmllciB0ZXN0aW5nLiAqLwotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfYmFycmllcl9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoYmFycmllcl90YXNrICE9IE5VTEwpIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9iYXJyaWVyIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKGJhcnJpZXJfdGFzayk7Ci0JCWJhcnJpZXJfdGFzayA9IE5VTEw7Ci0JfQotCWlmIChiYXJyaWVyX2Nic190YXNrcyAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuX2JhcnJpZXJfY2JzOyBpKyspIHsKLQkJCWlmIChiYXJyaWVyX2Nic190YXNrc1tpXSAhPSBOVUxMKSB7Ci0JCQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9iYXJyaWVyX2NicyB0YXNrIik7Ci0JCQkJa3RocmVhZF9zdG9wKGJhcnJpZXJfY2JzX3Rhc2tzW2ldKTsKLQkJCQliYXJyaWVyX2Nic190YXNrc1tpXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUoYmFycmllcl9jYnNfdGFza3MpOwotCQliYXJyaWVyX2Nic190YXNrcyA9IE5VTEw7Ci0JfQotCWlmIChiYXJyaWVyX2Nic193cSAhPSBOVUxMKSB7Ci0JCWtmcmVlKGJhcnJpZXJfY2JzX3dxKTsKLQkJYmFycmllcl9jYnNfd3EgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJKHZvaWQpcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX2NwdV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHJjdXRvcnR1cmVfY3B1X25vdGlmeSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1yY3VfdG9ydHVyZV9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7Ci0JaWYgKGZ1bGxzdG9wID09IEZVTExTVE9QX1NIVVRET1dOKSB7Ci0JCXByX3dhcm4oLyogYnV0IGdvaW5nIGRvd24gYW55d2F5LCBzby4uLiAqLwotCQkgICAgICAgIkNvbmN1cnJlbnQgJ3JtbW9kIHJjdXRvcnR1cmUnIGFuZCBzaHV0ZG93biBpbGxlZ2FsIVxuIik7Ci0JCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxMCk7Ci0JCWlmIChjdXJfb3BzLT5jYl9iYXJyaWVyICE9IE5VTEwpCi0JCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7Ci0JCXJldHVybjsKLQl9Ci0JZnVsbHN0b3AgPSBGVUxMU1RPUF9STU1PRDsKLQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKLQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcmN1dG9ydHVyZV9zaHV0ZG93bl9uYik7Ci0JcmN1X3RvcnR1cmVfYmFycmllcl9jbGVhbnVwKCk7Ci0JcmN1X3RvcnR1cmVfc3RhbGxfY2xlYW51cCgpOwotCWlmIChzdHV0dGVyX3Rhc2spIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zdHV0dGVyIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKHN0dXR0ZXJfdGFzayk7Ci0JfQotCXN0dXR0ZXJfdGFzayA9IE5VTEw7Ci0JaWYgKHNodWZmbGVyX3Rhc2spIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zaHVmZmxlIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKHNodWZmbGVyX3Rhc2spOwotCQlmcmVlX2NwdW1hc2tfdmFyKHNodWZmbGVfdG1wX21hc2spOwotCX0KLQlzaHVmZmxlcl90YXNrID0gTlVMTDsKLQotCWlmICh3cml0ZXJfdGFzaykgewotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3dyaXRlciB0YXNrIik7Ci0JCWt0aHJlYWRfc3RvcCh3cml0ZXJfdGFzayk7Ci0JfQotCXdyaXRlcl90YXNrID0gTlVMTDsKLQotCWlmIChyZWFkZXJfdGFza3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKSB7Ci0JCQlpZiAocmVhZGVyX3Rhc2tzW2ldKSB7Ci0JCQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKAotCQkJCQkiU3RvcHBpbmcgcmN1X3RvcnR1cmVfcmVhZGVyIHRhc2siKTsKLQkJCQlrdGhyZWFkX3N0b3AocmVhZGVyX3Rhc2tzW2ldKTsKLQkJCX0KLQkJCXJlYWRlcl90YXNrc1tpXSA9IE5VTEw7Ci0JCX0KLQkJa2ZyZWUocmVhZGVyX3Rhc2tzKTsKLQkJcmVhZGVyX3Rhc2tzID0gTlVMTDsKLQl9Ci0JcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7Ci0KLQlpZiAoZmFrZXdyaXRlcl90YXNrcykgewotCQlmb3IgKGkgPSAwOyBpIDwgbmZha2V3cml0ZXJzOyBpKyspIHsKLQkJCWlmIChmYWtld3JpdGVyX3Rhc2tzW2ldKSB7Ci0JCQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKAotCQkJCQkiU3RvcHBpbmcgcmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIik7Ci0JCQkJa3RocmVhZF9zdG9wKGZha2V3cml0ZXJfdGFza3NbaV0pOwotCQkJfQotCQkJZmFrZXdyaXRlcl90YXNrc1tpXSA9IE5VTEw7Ci0JCX0KLQkJa2ZyZWUoZmFrZXdyaXRlcl90YXNrcyk7Ci0JCWZha2V3cml0ZXJfdGFza3MgPSBOVUxMOwotCX0KLQotCWlmIChzdGF0c190YXNrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfc3RhdHMgdGFzayIpOwotCQlrdGhyZWFkX3N0b3Aoc3RhdHNfdGFzayk7Ci0JfQotCXN0YXRzX3Rhc2sgPSBOVUxMOwotCi0JaWYgKGZxc190YXNrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfZnFzIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKGZxc190YXNrKTsKLQl9Ci0JZnFzX3Rhc2sgPSBOVUxMOwotCWlmICgodGVzdF9ib29zdCA9PSAxICYmIGN1cl9vcHMtPmNhbl9ib29zdCkgfHwKLQkgICAgdGVzdF9ib29zdCA9PSAyKSB7Ci0JCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZyY3V0b3J0dXJlX2NwdV9uYik7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQkJcmN1dG9ydHVyZV9ib29zdGVyX2NsZWFudXAoaSk7Ci0JfQotCWlmIChzaHV0ZG93bl90YXNrICE9IE5VTEwpIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zaHV0ZG93biB0YXNrIik7Ci0JCWt0aHJlYWRfc3RvcChzaHV0ZG93bl90YXNrKTsKLQl9Ci0Jc2h1dGRvd25fdGFzayA9IE5VTEw7Ci0JcmN1X3RvcnR1cmVfb25vZmZfY2xlYW51cCgpOwotCi0JLyogV2FpdCBmb3IgYWxsIFJDVSBjYWxsYmFja3MgdG8gZmlyZS4gICovCi0KLQlpZiAoY3VyX29wcy0+Y2JfYmFycmllciAhPSBOVUxMKQotCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7Ci0KLQlyY3VfdG9ydHVyZV9zdGF0c19wcmludCgpOyAgLyogLUFmdGVyLSB0aGUgc3RhdHMgdGhyZWFkIGlzIHN0b3BwZWQhICovCi0KLQlpZiAoYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfZXJyb3IpIHx8IG5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvcikKLQkJcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsICJFbmQgb2YgdGVzdDogRkFJTFVSRSIpOwotCWVsc2UgaWYgKG5fb25saW5lX3N1Y2Nlc3NlcyAhPSBuX29ubGluZV9hdHRlbXB0cyB8fAotCQkgbl9vZmZsaW5lX3N1Y2Nlc3NlcyAhPSBuX29mZmxpbmVfYXR0ZW1wdHMpCi0JCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLAotCQkJCQkgICAgICAgIkVuZCBvZiB0ZXN0OiBSQ1VfSE9UUExVRyIpOwotCWVsc2UKLQkJcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsICJFbmQgb2YgdGVzdDogU1VDQ0VTUyIpOwotfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQKLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX2xlYWtfY2Ioc3RydWN0IHJjdV9oZWFkICpyaHApCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX2Vycl9jYihzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKLXsKLQkvKgotCSAqIFRoaXMgLW1pZ2h0LSBoYXBwZW4gZHVlIHRvIHJhY2UgY29uZGl0aW9ucywgYnV0IGlzIHVubGlrZWx5LgotCSAqIFRoZSBzY2VuYXJpbyB0aGF0IGxlYWRzIHRvIHRoaXMgaGFwcGVuaW5nIGlzIHRoYXQgdGhlCi0JICogZmlyc3Qgb2YgdGhlIHBhaXIgb2YgZHVwbGljYXRlIGNhbGxiYWNrcyBpcyBxdWV1ZWQsCi0JICogc29tZW9uZSBlbHNlIHN0YXJ0cyBhIGdyYWNlIHBlcmlvZCB0aGF0IGluY2x1ZGVzIHRoYXQKLQkgKiBjYWxsYmFjaywgdGhlbiB0aGUgc2Vjb25kIG9mIHRoZSBwYWlyIG11c3Qgd2FpdCBmb3IgdGhlCi0JICogbmV4dCBncmFjZSBwZXJpb2QuICBVbmxpa2VseSwgYnV0IGNhbiBoYXBwZW4uICBJZiBpdAotCSAqIGRvZXMgaGFwcGVuLCB0aGUgZGVidWctb2JqZWN0cyBzdWJzeXN0ZW0gd29uJ3QgaGF2ZSBzcGxhdHRlZC4KLQkgKi8KLQlwcl9hbGVydCgicmN1dG9ydHVyZTogZHVwbGljYXRlZCBjYWxsYmFjayB3YXMgaW52b2tlZC5cbiIpOwotfQotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLwotCi0vKgotICogVmVyaWZ5IHRoYXQgZG91YmxlLWZyZWUgY2F1c2VzIGRlYnVnLW9iamVjdHMgdG8gY29tcGxhaW4sIGJ1dCBvbmx5Ci0gKiBpZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15LiAgT3RoZXJ3aXNlLCBzYXkgdGhhdCB0aGUgdGVzdAotICogY2Fubm90IGJlIGNhcnJpZWQgb3V0LgotICovCi1zdGF0aWMgdm9pZCByY3VfdGVzdF9kZWJ1Z19vYmplY3RzKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQKLQlzdHJ1Y3QgcmN1X2hlYWQgcmgxOwotCXN0cnVjdCByY3VfaGVhZCByaDI7Ci0KLQlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyaDEpOwotCWluaXRfcmN1X2hlYWRfb25fc3RhY2soJnJoMik7Ci0JcHJfYWxlcnQoInJjdXRvcnR1cmU6IFdBUk46IER1cGxpY2F0ZSBjYWxsX3JjdSgpIHRlc3Qgc3RhcnRpbmcuXG4iKTsKLQotCS8qIFRyeSB0byBxdWV1ZSB0aGUgcmgyIHBhaXIgb2YgY2FsbGJhY2tzIGZvciB0aGUgc2FtZSBncmFjZSBwZXJpb2QuICovCi0JcHJlZW1wdF9kaXNhYmxlKCk7IC8qIFByZXZlbnQgcHJlZW1wdGlvbiBmcm9tIGludGVycnVwdGluZyB0ZXN0LiAqLwotCXJjdV9yZWFkX2xvY2soKTsgLyogTWFrZSBpdCBpbXBvc3NpYmxlIHRvIGZpbmlzaCBhIGdyYWNlIHBlcmlvZC4gKi8KLQljYWxsX3JjdSgmcmgxLCByY3VfdG9ydHVyZV9sZWFrX2NiKTsgLyogU3RhcnQgZ3JhY2UgcGVyaW9kLiAqLwotCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIE1ha2UgaXQgaGFyZGVyIHRvIHN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZC4gKi8KLQljYWxsX3JjdSgmcmgyLCByY3VfdG9ydHVyZV9sZWFrX2NiKTsKLQljYWxsX3JjdSgmcmgyLCByY3VfdG9ydHVyZV9lcnJfY2IpOyAvKiBEdXBsaWNhdGUgY2FsbGJhY2suICovCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0KLQkvKiBXYWl0IGZvciB0aGVtIGFsbCB0byBnZXQgZG9uZSBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybi4gKi8KLQlyY3VfYmFycmllcigpOwotCXByX2FsZXJ0KCJyY3V0b3J0dXJlOiBXQVJOOiBEdXBsaWNhdGUgY2FsbF9yY3UoKSB0ZXN0IGNvbXBsZXRlLlxuIik7Ci0JZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjaygmcmgxKTsKLQlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyaDIpOwotI2Vsc2UgLyogI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEICovCi0JcHJfYWxlcnQoInJjdXRvcnR1cmU6ICFDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCwgbm90IHRlc3RpbmcgZHVwbGljYXRlIGNhbGxfcmN1KClcbiIpOwotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLwotfQotCi1zdGF0aWMgaW50IF9faW5pdAotcmN1X3RvcnR1cmVfaW5pdCh2b2lkKQotewotCWludCBpOwotCWludCBjcHU7Ci0JaW50IGZpcnN0ZXJyID0gMDsKLQlpbnQgcmV0dmFsOwotCXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzICp0b3J0dXJlX29wc1tdID0gewotCQkmcmN1X29wcywgJnJjdV9iaF9vcHMsICZzcmN1X29wcywgJnNjaGVkX29wcywKLQl9OwotCi0JbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCi0JLyogUHJvY2VzcyBhcmdzIGFuZCB0ZWxsIHRoZSB3b3JsZCB0aGF0IHRoZSB0b3J0dXJlciBpcyBvbiB0aGUgam9iLiAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKSB7Ci0JCWN1cl9vcHMgPSB0b3J0dXJlX29wc1tpXTsKLQkJaWYgKHN0cmNtcCh0b3J0dXJlX3R5cGUsIGN1cl9vcHMtPm5hbWUpID09IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gQVJSQVlfU0laRSh0b3J0dXJlX29wcykpIHsKLQkJcHJfYWxlcnQoInJjdS10b3J0dXJlOiBpbnZhbGlkIHRvcnR1cmUgdHlwZTogXCIlc1wiXG4iLAotCQkJIHRvcnR1cmVfdHlwZSk7Ci0JCXByX2FsZXJ0KCJyY3UtdG9ydHVyZSB0eXBlczoiKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9ydHVyZV9vcHMpOyBpKyspCi0JCQlwcl9hbGVydCgiICVzIiwgdG9ydHVyZV9vcHNbaV0tPm5hbWUpOwotCQlwcl9hbGVydCgiXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoY3VyX29wcy0+ZnFzID09IE5VTEwgJiYgZnFzX2R1cmF0aW9uICE9IDApIHsKLQkJcHJfYWxlcnQoInJjdS10b3J0dXJlOiAtPmZxcyBOVUxMIGFuZCBub24temVybyBmcXNfZHVyYXRpb24sIGZxcyBkaXNhYmxlZC5cbiIpOwotCQlmcXNfZHVyYXRpb24gPSAwOwotCX0KLQlpZiAoY3VyX29wcy0+aW5pdCkKLQkJY3VyX29wcy0+aW5pdCgpOyAvKiBubyAiZ290byB1bndpbmQiIHByaW9yIHRvIHRoaXMgcG9pbnQhISEgKi8KLQotCWlmIChucmVhZGVycyA+PSAwKQotCQlucmVhbHJlYWRlcnMgPSBucmVhZGVyczsKLQllbHNlCi0JCW5yZWFscmVhZGVycyA9IDIgKiBudW1fb25saW5lX2NwdXMoKTsKLQlyY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3VyX29wcywgIlN0YXJ0IG9mIHRlc3QiKTsKLQlmdWxsc3RvcCA9IEZVTExTVE9QX0RPTlRTVE9QOwotCi0JLyogU2V0IHVwIHRoZSBmcmVlbGlzdC4gKi8KLQotCUlOSVRfTElTVF9IRUFEKCZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmN1X3RvcnR1cmVzKTsgaSsrKSB7Ci0JCXJjdV90b3J0dXJlc1tpXS5ydG9ydF9tYnRlc3QgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZyY3VfdG9ydHVyZXNbaV0ucnRvcnRfZnJlZSwKLQkJCSAgICAgICZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBzbyB0aGF0IGVhY2ggcnVuIGdldHMgaXRzIG93biBudW1iZXJzLiAqLwotCi0JcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7Ci0JcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uID0gMDsKLQlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jLCAwKTsKLQlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwsIDApOwotCWF0b21pY19zZXQoJm5fcmN1X3RvcnR1cmVfZnJlZSwgMCk7Ci0JYXRvbWljX3NldCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yLCAwKTsKLQlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2Vycm9yLCAwKTsKLQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IgPSAwOwotCW5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgPSAwOwotCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvciA9IDA7Ci0Jbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlID0gMDsKLQluX3JjdV90b3J0dXJlX2Jvb3N0cyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQotCQlhdG9taWNfc2V0KCZyY3VfdG9ydHVyZV93Y291bnRbaV0sIDApOwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7Ci0JCQlwZXJfY3B1KHJjdV90b3J0dXJlX2NvdW50LCBjcHUpW2ldID0gMDsKLQkJCXBlcl9jcHUocmN1X3RvcnR1cmVfYmF0Y2gsIGNwdSlbaV0gPSAwOwotCQl9Ci0JfQotCi0JLyogU3RhcnQgdXAgdGhlIGt0aHJlYWRzLiAqLwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJDcmVhdGluZyByY3VfdG9ydHVyZV93cml0ZXIgdGFzayIpOwotCXdyaXRlcl90YXNrID0ga3RocmVhZF9jcmVhdGUocmN1X3RvcnR1cmVfd3JpdGVyLCBOVUxMLAotCQkJCSAgICAgInJjdV90b3J0dXJlX3dyaXRlciIpOwotCWlmIChJU19FUlIod3JpdGVyX3Rhc2spKSB7Ci0JCWZpcnN0ZXJyID0gUFRSX0VSUih3cml0ZXJfdGFzayk7Ci0JCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIiKTsKLQkJd3JpdGVyX3Rhc2sgPSBOVUxMOwotCQlnb3RvIHVud2luZDsKLQl9Ci0Jd2FrZV91cF9wcm9jZXNzKHdyaXRlcl90YXNrKTsKLQlmYWtld3JpdGVyX3Rhc2tzID0ga3phbGxvYyhuZmFrZXdyaXRlcnMgKiBzaXplb2YoZmFrZXdyaXRlcl90YXNrc1swXSksCi0JCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGZha2V3cml0ZXJfdGFza3MgPT0gTlVMTCkgewotCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIm91dCBvZiBtZW1vcnkiKTsKLQkJZmlyc3RlcnIgPSAtRU5PTUVNOwotCQlnb3RvIHVud2luZDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiQ3JlYXRpbmcgcmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIik7Ci0JCWZha2V3cml0ZXJfdGFza3NbaV0gPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9mYWtld3JpdGVyLCBOVUxMLAotCQkJCQkJICAicmN1X3RvcnR1cmVfZmFrZXdyaXRlciIpOwotCQlpZiAoSVNfRVJSKGZha2V3cml0ZXJfdGFza3NbaV0pKSB7Ci0JCQlmaXJzdGVyciA9IFBUUl9FUlIoZmFrZXdyaXRlcl90YXNrc1tpXSk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgZmFrZXdyaXRlciIpOwotCQkJZmFrZXdyaXRlcl90YXNrc1tpXSA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlyZWFkZXJfdGFza3MgPSBremFsbG9jKG5yZWFscmVhZGVycyAqIHNpemVvZihyZWFkZXJfdGFza3NbMF0pLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChyZWFkZXJfdGFza3MgPT0gTlVMTCkgewotCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIm91dCBvZiBtZW1vcnkiKTsKLQkJZmlyc3RlcnIgPSAtRU5PTUVNOwotCQlnb3RvIHVud2luZDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiQ3JlYXRpbmcgcmN1X3RvcnR1cmVfcmVhZGVyIHRhc2siKTsKLQkJcmVhZGVyX3Rhc2tzW2ldID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfcmVhZGVyLCBOVUxMLAotCQkJCQkgICAgICAicmN1X3RvcnR1cmVfcmVhZGVyIik7Ci0JCWlmIChJU19FUlIocmVhZGVyX3Rhc2tzW2ldKSkgewotCQkJZmlyc3RlcnIgPSBQVFJfRVJSKHJlYWRlcl90YXNrc1tpXSk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgcmVhZGVyIik7Ci0JCQlyZWFkZXJfdGFza3NbaV0gPSBOVUxMOwotCQkJZ290byB1bndpbmQ7Ci0JCX0KLQl9Ci0JaWYgKHN0YXRfaW50ZXJ2YWwgPiAwKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiQ3JlYXRpbmcgcmN1X3RvcnR1cmVfc3RhdHMgdGFzayIpOwotCQlzdGF0c190YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfc3RhdHMsIE5VTEwsCi0JCQkJCSJyY3VfdG9ydHVyZV9zdGF0cyIpOwotCQlpZiAoSVNfRVJSKHN0YXRzX3Rhc2spKSB7Ci0JCQlmaXJzdGVyciA9IFBUUl9FUlIoc3RhdHNfdGFzayk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgc3RhdHMiKTsKLQkJCXN0YXRzX3Rhc2sgPSBOVUxMOwotCQkJZ290byB1bndpbmQ7Ci0JCX0KLQl9Ci0JaWYgKHRlc3Rfbm9faWRsZV9oeikgewotCQlyY3VfaWRsZV9jcHUgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7Ci0KLQkJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmc2h1ZmZsZV90bXBfbWFzaywgR0ZQX0tFUk5FTCkpIHsKLQkJCWZpcnN0ZXJyID0gLUVOT01FTTsKLQkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGFsbG9jIG1hc2siKTsKLQkJCWdvdG8gdW53aW5kOwotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBzaHVmZmxlciB0aHJlYWQgKi8KLQkJc2h1ZmZsZXJfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX3NodWZmbGUsIE5VTEwsCi0JCQkJCSAgInJjdV90b3J0dXJlX3NodWZmbGUiKTsKLQkJaWYgKElTX0VSUihzaHVmZmxlcl90YXNrKSkgewotCQkJZnJlZV9jcHVtYXNrX3ZhcihzaHVmZmxlX3RtcF9tYXNrKTsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihzaHVmZmxlcl90YXNrKTsKLQkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSBzaHVmZmxlciIpOwotCQkJc2h1ZmZsZXJfdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlpZiAoc3R1dHRlciA8IDApCi0JCXN0dXR0ZXIgPSAwOwotCWlmIChzdHV0dGVyKSB7Ci0JCS8qIENyZWF0ZSB0aGUgc3R1dHRlciB0aHJlYWQgKi8KLQkJc3R1dHRlcl90YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfc3R1dHRlciwgTlVMTCwKLQkJCQkJICAicmN1X3RvcnR1cmVfc3R1dHRlciIpOwotCQlpZiAoSVNfRVJSKHN0dXR0ZXJfdGFzaykpIHsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihzdHV0dGVyX3Rhc2spOwotCQkJVkVSQk9TRV9QUklOVEtfRVJSU1RSSU5HKCJGYWlsZWQgdG8gY3JlYXRlIHN0dXR0ZXIiKTsKLQkJCXN0dXR0ZXJfdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlpZiAoZnFzX2R1cmF0aW9uIDwgMCkKLQkJZnFzX2R1cmF0aW9uID0gMDsKLQlpZiAoZnFzX2R1cmF0aW9uKSB7Ci0JCS8qIENyZWF0ZSB0aGUgc3R1dHRlciB0aHJlYWQgKi8KLQkJZnFzX3Rhc2sgPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9mcXMsIE5VTEwsCi0JCQkJICAgICAgICJyY3VfdG9ydHVyZV9mcXMiKTsKLQkJaWYgKElTX0VSUihmcXNfdGFzaykpIHsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihmcXNfdGFzayk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgZnFzIik7Ci0JCQlmcXNfdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlpZiAodGVzdF9ib29zdF9pbnRlcnZhbCA8IDEpCi0JCXRlc3RfYm9vc3RfaW50ZXJ2YWwgPSAxOwotCWlmICh0ZXN0X2Jvb3N0X2R1cmF0aW9uIDwgMikKLQkJdGVzdF9ib29zdF9kdXJhdGlvbiA9IDI7Ci0JaWYgKCh0ZXN0X2Jvb3N0ID09IDEgJiYgY3VyX29wcy0+Y2FuX2Jvb3N0KSB8fAotCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKLQotCQlib29zdF9zdGFydHRpbWUgPSBqaWZmaWVzICsgdGVzdF9ib29zdF9pbnRlcnZhbCAqIEhaOwotCQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJCWlmIChjcHVfaXNfb2ZmbGluZShpKSkKLQkJCQljb250aW51ZTsgIC8qIEhldXJpc3RpYzogQ1BVIGNhbiBnbyBvZmZsaW5lLiAqLwotCQkJcmV0dmFsID0gcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaSk7Ci0JCQlpZiAocmV0dmFsIDwgMCkgewotCQkJCWZpcnN0ZXJyID0gcmV0dmFsOwotCQkJCWdvdG8gdW53aW5kOwotCQkJfQotCQl9Ci0JfQotCWlmIChzaHV0ZG93bl9zZWNzID4gMCkgewotCQlzaHV0ZG93bl90aW1lID0gamlmZmllcyArIHNodXRkb3duX3NlY3MgKiBIWjsKLQkJc2h1dGRvd25fdGFzayA9IGt0aHJlYWRfY3JlYXRlKHJjdV90b3J0dXJlX3NodXRkb3duLCBOVUxMLAotCQkJCQkgICAgICAgInJjdV90b3J0dXJlX3NodXRkb3duIik7Ci0JCWlmIChJU19FUlIoc2h1dGRvd25fdGFzaykpIHsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihzaHV0ZG93bl90YXNrKTsKLQkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSBzaHV0ZG93biIpOwotCQkJc2h1dGRvd25fdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCQl3YWtlX3VwX3Byb2Nlc3Moc2h1dGRvd25fdGFzayk7Ci0JfQotCWkgPSByY3VfdG9ydHVyZV9vbm9mZl9pbml0KCk7Ci0JaWYgKGkgIT0gMCkgewotCQlmaXJzdGVyciA9IGk7Ci0JCWdvdG8gdW53aW5kOwotCX0KLQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnJjdXRvcnR1cmVfc2h1dGRvd25fbmIpOwotCWkgPSByY3VfdG9ydHVyZV9zdGFsbF9pbml0KCk7Ci0JaWYgKGkgIT0gMCkgewotCQlmaXJzdGVyciA9IGk7Ci0JCWdvdG8gdW53aW5kOwotCX0KLQlyZXR2YWwgPSByY3VfdG9ydHVyZV9iYXJyaWVyX2luaXQoKTsKLQlpZiAocmV0dmFsICE9IDApIHsKLQkJZmlyc3RlcnIgPSByZXR2YWw7Ci0JCWdvdG8gdW53aW5kOwotCX0KLQlpZiAob2JqZWN0X2RlYnVnKQotCQlyY3VfdGVzdF9kZWJ1Z19vYmplY3RzKCk7Ci0JcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7Ci0JbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci0KLXVud2luZDoKLQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKLQlyY3VfdG9ydHVyZV9jbGVhbnVwKCk7Ci0JcmV0dXJuIGZpcnN0ZXJyOwotfQotCi1tb2R1bGVfaW5pdChyY3VfdG9ydHVyZV9pbml0KTsKLW1vZHVsZV9leGl0KHJjdV90b3J0dXJlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlLmMgYi9rZXJuZWwvcmN1L3RyZWUuYwppbmRleCBiM2QxMTZjLi4wYzQ3ZTMwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWUuYworKysgYi9rZXJuZWwvcmN1L3RyZWUuYwpAQCAtMTIsOCArMTIsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAogICoKQEAgLTU4LDggKzU4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlICJ0cmVlLmgiCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3JjdS5oPgotCiAjaW5jbHVkZSAicmN1LmgiCiAKIE1PRFVMRV9BTElBUygicmN1dHJlZSIpOwpAQCAtODM3LDcgKzgzNSw3IEBACiAJICogdG8gdGhlIG5leHQuICBPbmx5IGRvIHRoaXMgZm9yIHRoZSBwcmltYXJ5IGZsYXZvciBvZiBSQ1UuCiAJICovCiAJaWYgKHJkcC0+cnNwID09IHJjdV9zdGF0ZSAmJgotCSAgICBVTE9OR19DTVBfR0UoQUNDRVNTX09OQ0UoamlmZmllcyksIHJkcC0+cnNwLT5qaWZmaWVzX3Jlc2NoZWQpKSB7CisJICAgIFVMT05HX0NNUF9HRShqaWZmaWVzLCByZHAtPnJzcC0+amlmZmllc19yZXNjaGVkKSkgewogCQlyZHAtPnJzcC0+amlmZmllc19yZXNjaGVkICs9IDU7CiAJCXJlc2NoZWRfY3B1KHJkcC0+Y3B1KTsKIAl9CkBAIC04NDcsNyArODQ1LDcgQEAKIAogc3RhdGljIHZvaWQgcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewotCXVuc2lnbmVkIGxvbmcgaiA9IEFDQ0VTU19PTkNFKGppZmZpZXMpOworCXVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXM7CiAJdW5zaWduZWQgbG9uZyBqMTsKIAogCXJzcC0+Z3Bfc3RhcnQgPSBqOwpAQCAtMTAwNSw3ICsxMDAzLDcgQEAKIAogCWlmIChyY3VfY3B1X3N0YWxsX3N1cHByZXNzIHx8ICFyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSkKIAkJcmV0dXJuOwotCWogPSBBQ0NFU1NfT05DRShqaWZmaWVzKTsKKwlqID0gamlmZmllczsKIAogCS8qCiAJICogTG90cyBvZiBtZW1vcnkgYmFycmllcnMgdG8gcmVqZWN0IGZhbHNlIHBvc2l0aXZlcy4KQEAgLTE0MjMsMTMgKzE0MjEsMTQgQEAKIAogCS8qIEFkdmFuY2UgdG8gYSBuZXcgZ3JhY2UgcGVyaW9kIGFuZCBpbml0aWFsaXplIHN0YXRlLiAqLwogCXJlY29yZF9ncF9zdGFsbF9jaGVja190aW1lKHJzcCk7Ci0Jc21wX3dtYigpOyAvKiBSZWNvcmQgR1AgdGltZXMgYmVmb3JlIHN0YXJ0aW5nIEdQLiAqLwotCXJzcC0+Z3BudW0rKzsKKwkvKiBSZWNvcmQgR1AgdGltZXMgYmVmb3JlIHN0YXJ0aW5nIEdQLCBoZW5jZSBzbXBfc3RvcmVfcmVsZWFzZSgpLiAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZyc3AtPmdwbnVtLCByc3AtPmdwbnVtICsgMSk7CiAJdHJhY2VfcmN1X2dyYWNlX3BlcmlvZChyc3AtPm5hbWUsIHJzcC0+Z3BudW0sIFRQUygic3RhcnQiKSk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmcm5wLT5sb2NrKTsKIAogCS8qIEV4Y2x1ZGUgYW55IGNvbmN1cnJlbnQgQ1BVLWhvdHBsdWcgb3BlcmF0aW9ucy4gKi8KIAltdXRleF9sb2NrKCZyc3AtPm9ub2ZmX211dGV4KTsKKwlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7IC8qIC0+Z3BudW0gaW5jcmVtZW50IGJlZm9yZSBHUCEgKi8KIAogCS8qCiAJICogU2V0IHRoZSBxdWllc2NlbnQtc3RhdGUtbmVlZGVkIGJpdHMgaW4gYWxsIHRoZSByY3Vfbm9kZQpAQCAtMTU1NywxMCArMTU1NiwxMSBAQAogCX0KIAlybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKIAlyYXdfc3Bpbl9sb2NrX2lycSgmcm5wLT5sb2NrKTsKLQlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CisJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOyAvKiBPcmRlciBHUCBiZWZvcmUgLT5jb21wbGV0ZWQgdXBkYXRlLiAqLwogCXJjdV9ub2NiX2dwX3NldChybnAsIG5vY2IpOwogCi0JcnNwLT5jb21wbGV0ZWQgPSByc3AtPmdwbnVtOyAvKiBEZWNsYXJlIGdyYWNlIHBlcmlvZCBkb25lLiAqLworCS8qIERlY2xhcmUgZ3JhY2UgcGVyaW9kIGRvbmUuICovCisJQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpID0gcnNwLT5ncG51bTsKIAl0cmFjZV9yY3VfZ3JhY2VfcGVyaW9kKHJzcC0+bmFtZSwgcnNwLT5jb21wbGV0ZWQsIFRQUygiZW5kIikpOwogCXJzcC0+ZnFzX3N0YXRlID0gUkNVX0dQX0lETEU7CiAJcmRwID0gdGhpc19jcHVfcHRyKHJzcC0+cmRhKTsKQEAgLTIzMDQsNyArMjMwNCw3IEBACiAJCWlmIChybnBfb2xkICE9IE5VTEwpCiAJCQlyYXdfc3Bpbl91bmxvY2soJnJucF9vbGQtPmZxc2xvY2spOwogCQlpZiAocmV0KSB7Ci0JCQlyc3AtPm5fZm9yY2VfcXNfbGgrKzsKKwkJCUFDQ0VTU19PTkNFKHJzcC0+bl9mb3JjZV9xc19saCkrKzsKIAkJCXJldHVybjsKIAkJfQogCQlybnBfb2xkID0gcm5wOwpAQCAtMjMxNiw3ICsyMzE2LDcgQEAKIAlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CiAJcmF3X3NwaW5fdW5sb2NrKCZybnBfb2xkLT5mcXNsb2NrKTsKIAlpZiAoQUNDRVNTX09OQ0UocnNwLT5ncF9mbGFncykgJiBSQ1VfR1BfRkxBR19GUVMpIHsKLQkJcnNwLT5uX2ZvcmNlX3FzX2xoKys7CisJCUFDQ0VTU19PTkNFKHJzcC0+bl9mb3JjZV9xc19saCkrKzsKIAkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucF9vbGQtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOyAgLyogU29tZW9uZSBiZWF0IHVzIHRvIGl0LiAqLwogCX0KQEAgLTI2MzksNiArMjYzOSw1OCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3luY2hyb25pemVfcmN1X2JoKTsKIAorLyoqCisgKiBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1IC0gU25hcHNob3QgY3VycmVudCBSQ1Ugc3RhdGUKKyAqCisgKiBSZXR1cm5zIGEgY29va2llIHRoYXQgaXMgdXNlZCBieSBhIGxhdGVyIGNhbGwgdG8gY29uZF9zeW5jaHJvbml6ZV9yY3UoKQorICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgZnVsbCBncmFjZSBwZXJpb2QgaGFzIGVsYXBzZWQgaW4gdGhlCisgKiBtZWFudGltZS4KKyAqLwordW5zaWduZWQgbG9uZyBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KHZvaWQpCit7CisJLyoKKwkgKiBBbnkgcHJpb3IgbWFuaXB1bGF0aW9uIG9mIFJDVS1wcm90ZWN0ZWQgZGF0YSBtdXN0IGhhcHBlbgorCSAqIGJlZm9yZSB0aGUgbG9hZCBmcm9tIC0+Z3BudW0uCisJICovCisJc21wX21iKCk7ICAvKiBeXl4gKi8KKworCS8qCisJICogTWFrZSBzdXJlIHRoaXMgbG9hZCBoYXBwZW5zIGJlZm9yZSB0aGUgcHVycG9ydGVkbHkKKwkgKiB0aW1lLWNvbnN1bWluZyB3b3JrIGJldHdlZW4gZ2V0X3N0YXRlX3N5bmNocm9uaXplX3JjdSgpCisJICogYW5kIGNvbmRfc3luY2hyb25pemVfcmN1KCkuCisJICovCisJcmV0dXJuIHNtcF9sb2FkX2FjcXVpcmUoJnJjdV9zdGF0ZS0+Z3BudW0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3N0YXRlX3N5bmNocm9uaXplX3JjdSk7CisKKy8qKgorICogY29uZF9zeW5jaHJvbml6ZV9yY3UgLSBDb25kaXRpb25hbGx5IHdhaXQgZm9yIGFuIFJDVSBncmFjZSBwZXJpb2QKKyAqCisgKiBAb2xkc3RhdGU6IHJldHVybiB2YWx1ZSBmcm9tIGVhcmxpZXIgY2FsbCB0byBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KCkKKyAqCisgKiBJZiBhIGZ1bGwgUkNVIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgZWFybGllciBjYWxsIHRvCisgKiBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KCksIGp1c3QgcmV0dXJuLiAgT3RoZXJ3aXNlLCBpbnZva2UKKyAqIHN5bmNocm9uaXplX3JjdSgpIHRvIHdhaXQgZm9yIGEgZnVsbCBncmFjZSBwZXJpb2QuCisgKgorICogWWVzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgY291bnRlciB3cmFwIGludG8gYWNjb3VudC4gIEJ1dAorICogY291bnRlciB3cmFwIGlzIGhhcm1sZXNzLiAgSWYgdGhlIGNvdW50ZXIgd3JhcHMsIHdlIGhhdmUgd2FpdGVkIGZvcgorICogbW9yZSB0aGFuIDIgYmlsbGlvbiBncmFjZSBwZXJpb2RzIChhbmQgd2F5IG1vcmUgb24gYSA2NC1iaXQgc3lzdGVtISksCisgKiBzbyB3YWl0aW5nIGZvciBvbmUgYWRkaXRpb25hbCBncmFjZSBwZXJpb2Qgc2hvdWxkIGJlIGp1c3QgZmluZS4KKyAqLwordm9pZCBjb25kX3N5bmNocm9uaXplX3JjdSh1bnNpZ25lZCBsb25nIG9sZHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgbmV3c3RhdGU7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoaXMgbG9hZCBoYXBwZW5zIGJlZm9yZSBhbnkgUkNVLWRlc3RydWN0aXZlCisJICogYWN0aW9ucyB0aGUgY2FsbGVyIG1pZ2h0IGNhcnJ5IG91dCBhZnRlciB3ZSByZXR1cm4uCisJICovCisJbmV3c3RhdGUgPSBzbXBfbG9hZF9hY3F1aXJlKCZyY3Vfc3RhdGUtPmNvbXBsZXRlZCk7CisJaWYgKFVMT05HX0NNUF9HRShvbGRzdGF0ZSwgbmV3c3RhdGUpKQorCQlzeW5jaHJvbml6ZV9yY3UoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbmRfc3luY2hyb25pemVfcmN1KTsKKwogc3RhdGljIGludCBzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWRfY3B1X3N0b3Aodm9pZCAqZGF0YSkKIHsKIAkvKgpAQCAtMjg4MCw3ICsyOTMyLDcgQEAKICAqIG5vbi1OVUxMLCBzdG9yZSBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgYWxsIGNhbGxiYWNrcyBhcmUgbGF6eS4KICAqIChJZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzLCBhbGwgb2YgdGhlbSBhcmUgZGVlbWVkIHRvIGJlIGxhenkuKQogICovCi1zdGF0aWMgaW50IHJjdV9jcHVfaGFzX2NhbGxiYWNrcyhpbnQgY3B1LCBib29sICphbGxfbGF6eSkKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcmN1X2NwdV9oYXNfY2FsbGJhY2tzKGludCBjcHUsIGJvb2wgKmFsbF9sYXp5KQogewogCWJvb2wgYWwgPSB0cnVlOwogCWJvb2wgaGMgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZS5oIGIva2VybmVsL3JjdS90cmVlLmgKaW5kZXggOGMxOTg3My4uNzVkYzNjMyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlLmgKKysrIGIva2VybmVsL3JjdS90cmVlLmgKQEAgLTEzLDggKzEzLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKaW5kZXggNmUyZWY0Yi4uOTYyZDFkNSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaApAQCAtMTQsOCArMTQsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IFJlZCBIYXQsIDIwMDkKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDkKQEAgLTE1ODYsMTEgKzE1ODYsMTMgQEAKICAqIEJlY2F1c2Ugd2Ugbm90IGhhdmUgUkNVX0ZBU1RfTk9fSFosIGp1c3QgY2hlY2sgd2hldGhlciB0aGlzIENQVSBuZWVkcwogICogYW55IGZsYXZvciBvZiBSQ1UuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgKmRlbHRhX2ppZmZpZXMpCiB7CiAJKmRlbHRhX2ppZmZpZXMgPSBVTE9OR19NQVg7CiAJcmV0dXJuIHJjdV9jcHVfaGFzX2NhbGxiYWNrcyhjcHUsIE5VTEwpOwogfQorI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwgKi8KIAogLyoKICAqIEJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgUkNVX0ZBU1RfTk9fSFosIGRvbid0IGJvdGhlciBjbGVhbmluZyB1cApAQCAtMTY1Niw3ICsxNjU4LDcgQEAKICAqIG9ubHkgaWYgaXQgaGFzIGJlZW4gYXdoaWxlIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZGlkIHNvLiAgQWZ0ZXJ3YXJkcywKICAqIGlmIHRoZXJlIGFyZSBhbnkgY2FsbGJhY2tzIHJlYWR5IGZvciBpbW1lZGlhdGUgaW52b2NhdGlvbiwgcmV0dXJuIHRydWUuCiAgKi8KLXN0YXRpYyBib29sIHJjdV90cnlfYWR2YW5jZV9hbGxfY2JzKHZvaWQpCitzdGF0aWMgYm9vbCBfX21heWJlX3VudXNlZCByY3VfdHJ5X2FkdmFuY2VfYWxsX2Nicyh2b2lkKQogewogCWJvb2wgY2JzX3JlYWR5ID0gZmFsc2U7CiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CkBAIC0xNjk2LDYgKzE2OTgsNyBAQAogICoKICAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIGludGVycnVwdHMuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgKmRqKQogewogCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHAgPSAmcGVyX2NwdShyY3VfZHludGlja3MsIGNwdSk7CkBAIC0xNzI2LDYgKzE3MjksNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKyNlbmRpZiAvKiAjaWZuZGVmIENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMICovCiAKIC8qCiAgKiBQcmVwYXJlIGEgQ1BVIGZvciBpZGxlIGZyb20gYW4gUkNVIHBlcnNwZWN0aXZlLiAgVGhlIGZpcnN0IG1ham9yIHRhc2sKQEAgLTE3MzksNiArMTc0Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmVwYXJlX2Zvcl9pZGxlKGludCBjcHUpCiB7CisjaWZuZGVmIENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMCiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CiAJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZwZXJfY3B1KHJjdV9keW50aWNrcywgY3B1KTsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKQEAgLTE3OTAsNiArMTc5NSw3IEBACiAJCXJjdV9hY2NlbGVyYXRlX2Nicyhyc3AsIHJucCwgcmRwKTsKIAkJcmF3X3NwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAl9CisjZW5kaWYgLyogI2lmbmRlZiBDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCAqLwogfQogCiAvKgpAQCAtMTc5OSwxMSArMTgwNSwxMiBAQAogICovCiBzdGF0aWMgdm9pZCByY3VfY2xlYW51cF9hZnRlcl9pZGxlKGludCBjcHUpCiB7Ci0KKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIAlpZiAocmN1X2lzX25vY2JfY3B1KGNwdSkpCiAJCXJldHVybjsKIAlpZiAocmN1X3RyeV9hZHZhbmNlX2FsbF9jYnMoKSkKIAkJaW52b2tlX3JjdV9jb3JlKCk7CisjZW5kaWYgLyogI2lmbmRlZiBDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCAqLwogfQogCiAvKgpAQCAtMjEwMSw2ICsyMTA4LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZybnAtPm5vY2JfZ3Bfd3FbMV0pOwogfQogCisjaWZuZGVmIENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMCiAvKiBJcyB0aGUgc3BlY2lmaWVkIENQVSBhIG5vLUNQVXMgQ1BVPyAqLwogYm9vbCByY3VfaXNfbm9jYl9jcHUoaW50IGNwdSkKIHsKQEAgLTIxMDgsNiArMjExNiw3IEBACiAJCXJldHVybiBjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcmN1X25vY2JfbWFzayk7CiAJcmV0dXJuIGZhbHNlOwogfQorI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwgKi8KIAogLyoKICAqIEVucXVldWUgdGhlIHNwZWNpZmllZCBzdHJpbmcgb2YgcmN1X2hlYWQgc3RydWN0dXJlcyBvbnRvIHRoZSBzcGVjaWZpZWQKQEAgLTI4OTMsNyArMjkwMiw3IEBACiAgKiBDUFUgdW5sZXNzIHRoZSBncmFjZSBwZXJpb2QgaGFzIGV4dGVuZGVkIGZvciB0b28gbG9uZy4KICAqCiAgKiBUaGlzIGNvZGUgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYWxsIE5PX0haX0ZVTEwgQ1BVcyBhcmUgYWxzbwotICogQ09ORklHX1JDVV9OT0NCX0NQVXMuCisgKiBDT05GSUdfUkNVX05PQ0JfQ1BVIENQVXMuCiAgKi8KIHN0YXRpYyBib29sIHJjdV9ub2h6X2Z1bGxfY3B1KHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZV90cmFjZS5jIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKaW5kZXggNGRlZjQ3NS4uNWNkYzYyZSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCkBAIC0yNzMsNyArMjczLDcgQEAKIAlzZXFfcHJpbnRmKG0sICJuZnFzPSVsdS9uZnFzbmc9JWx1KCVsdSkgZnFsaD0lbHUgb3FsZW49JWxkLyVsZFxuIiwKIAkJICAgcnNwLT5uX2ZvcmNlX3FzLCByc3AtPm5fZm9yY2VfcXNfbmdwLAogCQkgICByc3AtPm5fZm9yY2VfcXMgLSByc3AtPm5fZm9yY2VfcXNfbmdwLAotCQkgICByc3AtPm5fZm9yY2VfcXNfbGgsIHJzcC0+cWxlbl9sYXp5LCByc3AtPnFsZW4pOworCQkgICBBQ0NFU1NfT05DRShyc3AtPm5fZm9yY2VfcXNfbGgpLCByc3AtPnFsZW5fbGF6eSwgcnNwLT5xbGVuKTsKIAlmb3IgKHJucCA9ICZyc3AtPm5vZGVbMF07IHJucCAtICZyc3AtPm5vZGVbMF0gPCByY3VfbnVtX25vZGVzOyBybnArKykgewogCQlpZiAocm5wLT5sZXZlbCAhPSBsZXZlbCkgewogCQkJc2VxX3B1dHMobSwgIlxuIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3VwZGF0ZS5jIGIva2VybmVsL3JjdS91cGRhdGUuYwppbmRleCBjNTQ2MDlmLi40YzBhOWIwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3UvdXBkYXRlLmMKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDEKICAqCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yY3UuaD4KIAogI2luY2x1ZGUgInJjdS5oIgogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDNmMjg1ZGMuLjY3MzA2MWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC00MzIsMTEgKzQzMiw2IEBACiAJCXJlcy0+ZW5kID0gbWF4OwogfQogCi1zdGF0aWMgYm9vbCByZXNvdXJjZV9jb250YWlucyhzdHJ1Y3QgcmVzb3VyY2UgKnJlczEsIHN0cnVjdCByZXNvdXJjZSAqcmVzMikKLXsKLQlyZXR1cm4gcmVzMS0+c3RhcnQgPD0gcmVzMi0+c3RhcnQgJiYgcmVzMS0+ZW5kID49IHJlczItPmVuZDsKLX0KLQogLyoKICAqIEZpbmQgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSB3aXRoIHRoZSBnaXZlbiByYW5nZSBhbmQKICAqIGFsaWdubWVudCBjb25zdHJhaW50cwpAQCAtNDcxLDEwICs0NjYsMTEgQEAKIAkJYXJjaF9yZW1vdmVfcmVzZXJ2YXRpb25zKCZ0bXApOwogCiAJCS8qIENoZWNrIGZvciBvdmVyZmxvdyBhZnRlciBBTElHTigpICovCi0JCWF2YWlsID0gKm5ldzsKIAkJYXZhaWwuc3RhcnQgPSBBTElHTih0bXAuc3RhcnQsIGNvbnN0cmFpbnQtPmFsaWduKTsKIAkJYXZhaWwuZW5kID0gdG1wLmVuZDsKKwkJYXZhaWwuZmxhZ3MgPSBuZXctPmZsYWdzICYgfklPUkVTT1VSQ0VfVU5TRVQ7CiAJCWlmIChhdmFpbC5zdGFydCA+PSB0bXAuc3RhcnQpIHsKKwkJCWFsbG9jLmZsYWdzID0gYXZhaWwuZmxhZ3M7CiAJCQlhbGxvYy5zdGFydCA9IGNvbnN0cmFpbnQtPmFsaWduZihjb25zdHJhaW50LT5hbGlnbmZfZGF0YSwgJmF2YWlsLAogCQkJCQlzaXplLCBjb25zdHJhaW50LT5hbGlnbik7CiAJCQlhbGxvYy5lbmQgPSBhbGxvYy5zdGFydCArIHNpemUgLSAxOwpAQCAtOTQ5LDggKzk0NSw4IEBACiAJcmVzLT5uYW1lID0gbmFtZTsKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJcmVzLT5lbmQgPSBzdGFydCArIG4gLSAxOwotCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1k7Ci0JcmVzLT5mbGFncyB8PSBmbGFnczsKKwlyZXMtPmZsYWdzID0gcmVzb3VyY2VfdHlwZShwYXJlbnQpOworCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9CVVNZIHwgZmxhZ3M7CiAKIAl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL01ha2VmaWxlIGIva2VybmVsL3NjaGVkL01ha2VmaWxlCmluZGV4IDlhOTVjOGMuLmFiMzJiN2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9NYWtlZmlsZQorKysgYi9rZXJuZWwvc2NoZWQvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIAogb2JqLXkgKz0gY29yZS5vIHByb2MubyBjbG9jay5vIGNwdXRpbWUubwogb2JqLXkgKz0gaWRsZV90YXNrLm8gZmFpci5vIHJ0Lm8gZGVhZGxpbmUubyBzdG9wX3Rhc2subwotb2JqLXkgKz0gd2FpdC5vIGNvbXBsZXRpb24ubworb2JqLXkgKz0gd2FpdC5vIGNvbXBsZXRpb24ubyBpZGxlLm8KIG9iai0kKENPTkZJR19TTVApICs9IGNwdXByaS5vIGNwdWRlYWRsaW5lLm8KIG9iai0kKENPTkZJR19TQ0hFRF9BVVRPR1JPVVApICs9IGF1dG9fZ3JvdXAubwogb2JqLSQoQ09ORklHX1NDSEVEU1RBVFMpICs9IHN0YXRzLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9hdXRvX2dyb3VwLmMgYi9rZXJuZWwvc2NoZWQvYXV0b19ncm91cC5jCmluZGV4IDRhMDczNTMuLmU3M2VmYmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9hdXRvX2dyb3VwLmMKKysrIGIva2VybmVsL3NjaGVkL2F1dG9fZ3JvdXAuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJc3RydWN0IGF1dG9ncm91cCAqYWc7CiAJaW50IGVycjsKIAotCWlmIChuaWNlIDwgLTIwIHx8IG5pY2UgPiAxOSkKKwlpZiAobmljZSA8IE1JTl9OSUNFIHx8IG5pY2UgPiBNQVhfTklDRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAllcnIgPSBzZWN1cml0eV90YXNrX3NldG5pY2UoY3VycmVudCwgbmljZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY29yZS5jIGIva2VybmVsL3NjaGVkL2NvcmUuYwppbmRleCBmNWM2NjM1Li45Y2FlMjg2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY29yZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCWlmIChycSA9PSB0aGlzX3JxKCkpIHsKIAkJX19ocnRpY2tfcmVzdGFydChycSk7CiAJfSBlbHNlIGlmICghcnEtPmhydGlja19jc2RfcGVuZGluZykgewotCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHVfb2YocnEpLCAmcnEtPmhydGlja19jc2QsIDApOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoY3B1X29mKHJxKSwgJnJxLT5ocnRpY2tfY3NkKTsKIAkJcnEtPmhydGlja19jc2RfcGVuZGluZyA9IDE7CiAJfQogfQpAQCAtNTU1LDEyICs1NTUsMTUgQEAKICAqIHNlbGVjdGluZyBhbiBpZGxlIGNwdSB3aWxsIGFkZCBtb3JlIGRlbGF5cyB0byB0aGUgdGltZXJzIHRoYW4gaW50ZW5kZWQKICAqIChhcyB0aGF0IGNwdSdzIHRpbWVyIGJhc2UgbWF5IG5vdCBiZSB1cHRvZGF0ZSB3cnQgamlmZmllcyBldGMpLgogICovCi1pbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHZvaWQpCitpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KGludCBwaW5uZWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgaTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAorCWlmIChwaW5uZWQgfHwgIWdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgfHwgIWlkbGVfY3B1KGNwdSkpCisJCXJldHVybiBjcHU7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKIAkJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkgewpAQCAtODIzLDE5ICs4MjYsMTMgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19QQVJBVklSVF9USU1FX0FDQ09VTlRJTkcKIAlpZiAoc3RhdGljX2tleV9mYWxzZSgoJnBhcmF2aXJ0X3N0ZWFsX3JxX2VuYWJsZWQpKSkgewotCQl1NjQgc3Q7Ci0KIAkJc3RlYWwgPSBwYXJhdmlydF9zdGVhbF9jbG9jayhjcHVfb2YocnEpKTsKIAkJc3RlYWwgLT0gcnEtPnByZXZfc3RlYWxfdGltZV9ycTsKIAogCQlpZiAodW5saWtlbHkoc3RlYWwgPiBkZWx0YSkpCiAJCQlzdGVhbCA9IGRlbHRhOwogCi0JCXN0ID0gc3RlYWxfdGlja3Moc3RlYWwpOwotCQlzdGVhbCA9IHN0ICogVElDS19OU0VDOwotCiAJCXJxLT5wcmV2X3N0ZWFsX3RpbWVfcnEgKz0gc3RlYWw7Ci0KIAkJZGVsdGEgLT0gc3RlYWw7CiAJfQogI2VuZGlmCkBAIC0xNzQ1LDggKzE3NDIsMTAgQEAKIAlwLT5udW1hX3NjYW5fc2VxID0gcC0+bW0gPyBwLT5tbS0+bnVtYV9zY2FuX3NlcSA6IDA7CiAJcC0+bnVtYV9zY2FuX3BlcmlvZCA9IHN5c2N0bF9udW1hX2JhbGFuY2luZ19zY2FuX2RlbGF5OwogCXAtPm51bWFfd29yay5uZXh0ID0gJnAtPm51bWFfd29yazsKLQlwLT5udW1hX2ZhdWx0cyA9IE5VTEw7Ci0JcC0+bnVtYV9mYXVsdHNfYnVmZmVyID0gTlVMTDsKKwlwLT5udW1hX2ZhdWx0c19tZW1vcnkgPSBOVUxMOworCXAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnkgPSBOVUxMOworCXAtPmxhc3RfdGFza19udW1hX3BsYWNlbWVudCA9IDA7CisJcC0+bGFzdF9zdW1fZXhlY19ydW50aW1lID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZwLT5udW1hX2VudHJ5KTsKIAlwLT5udW1hX2dyb3VwID0gTlVMTDsKQEAgLTIxNDksOCArMjE0OCw2IEBACiAJaWYgKG1tKQogCQltbWRyb3AobW0pOwogCWlmICh1bmxpa2VseShwcmV2X3N0YXRlID09IFRBU0tfREVBRCkpIHsKLQkJdGFza19udW1hX2ZyZWUocHJldik7Ci0KIAkJaWYgKHByZXYtPnNjaGVkX2NsYXNzLT50YXNrX2RlYWQpCiAJCQlwcmV2LT5zY2hlZF9jbGFzcy0+dGFza19kZWFkKHByZXYpOwogCkBAIC0yMTY3LDEzICsyMTY0LDYgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAotLyogYXNzdW1lcyBycS0+bG9jayBpcyBoZWxkICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJlX3NjaGVkdWxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKLXsKLQlpZiAocHJldi0+c2NoZWRfY2xhc3MtPnByZV9zY2hlZHVsZSkKLQkJcHJldi0+c2NoZWRfY2xhc3MtPnByZV9zY2hlZHVsZShycSwgcHJldik7Ci19Ci0KIC8qIHJxLT5sb2NrIGlzIE5PVCBoZWxkLCBidXQgcHJlZW1wdGlvbiBpcyBkaXNhYmxlZCAqLwogc3RhdGljIGlubGluZSB2b2lkIHBvc3Rfc2NoZWR1bGUoc3RydWN0IHJxICpycSkKIHsKQEAgLTIxOTEsMTAgKzIxODEsNiBAQAogCiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJlX3NjaGVkdWxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKLXsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHBvc3Rfc2NoZWR1bGUoc3RydWN0IHJxICpycSkKIHsKIH0KQEAgLTI1MTAsOCArMjQ5NiwxMyBAQAogCURFQlVHX0xPQ0tTX1dBUk5fT04oKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfTUFTSykgPj0KIAkJCQlQUkVFTVBUX01BU0sgLSAxMCk7CiAjZW5kaWYKLQlpZiAocHJlZW1wdF9jb3VudCgpID09IHZhbCkKLQkJdHJhY2VfcHJlZW1wdF9vZmYoQ0FMTEVSX0FERFIwLCBnZXRfcGFyZW50X2lwKENBTExFUl9BRERSMSkpOworCWlmIChwcmVlbXB0X2NvdW50KCkgPT0gdmFsKSB7CisJCXVuc2lnbmVkIGxvbmcgaXAgPSBnZXRfcGFyZW50X2lwKENBTExFUl9BRERSMSk7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKKwkJY3VycmVudC0+cHJlZW1wdF9kaXNhYmxlX2lwID0gaXA7CisjZW5kaWYKKwkJdHJhY2VfcHJlZW1wdF9vZmYoQ0FMTEVSX0FERFIwLCBpcCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChwcmVlbXB0X2NvdW50X2FkZCk7CiAKQEAgLTI1NTQsNiArMjU0NSwxMyBAQAogCXByaW50X21vZHVsZXMoKTsKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlwcmludF9pcnF0cmFjZV9ldmVudHMocHJldik7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKKwlpZiAoaW5fYXRvbWljX3ByZWVtcHRfb2ZmKCkpIHsKKwkJcHJfZXJyKCJQcmVlbXB0aW9uIGRpc2FibGVkIGF0OiIpOworCQlwcmludF9pcF9zeW0oY3VycmVudC0+cHJlZW1wdF9kaXNhYmxlX2lwKTsKKwkJcHJfY29udCgiXG4iKTsKKwl9CisjZW5kaWYKIAlkdW1wX3N0YWNrKCk7CiAJYWRkX3RhaW50KFRBSU5UX1dBUk4sIExPQ0tERVBfU1RJTExfT0spOwogfQpAQCAtMjU3NywzNiArMjU3NSwzNCBAQAogCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLCBzY2hlZF9jb3VudCk7CiB9CiAKLXN0YXRpYyB2b2lkIHB1dF9wcmV2X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQotewotCWlmIChwcmV2LT5vbl9ycSB8fCBycS0+c2tpcF9jbG9ja191cGRhdGUgPCAwKQotCQl1cGRhdGVfcnFfY2xvY2socnEpOwotCXByZXYtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKLX0KLQogLyoKICAqIFBpY2sgdXAgdGhlIGhpZ2hlc3QtcHJpbyB0YXNrOgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqCi1waWNrX25leHRfdGFzayhzdHJ1Y3QgcnEgKnJxKQorcGlja19uZXh0X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCWNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyAqY2xhc3M7CisJY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzICpjbGFzcyA9ICZmYWlyX3NjaGVkX2NsYXNzOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAogCS8qCiAJICogT3B0aW1pemF0aW9uOiB3ZSBrbm93IHRoYXQgaWYgYWxsIHRhc2tzIGFyZSBpbgogCSAqIHRoZSBmYWlyIGNsYXNzIHdlIGNhbiBjYWxsIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHk6CiAJICovCi0JaWYgKGxpa2VseShycS0+bnJfcnVubmluZyA9PSBycS0+Y2ZzLmhfbnJfcnVubmluZykpIHsKLQkJcCA9IGZhaXJfc2NoZWRfY2xhc3MucGlja19uZXh0X3Rhc2socnEpOwotCQlpZiAobGlrZWx5KHApKQorCWlmIChsaWtlbHkocHJldi0+c2NoZWRfY2xhc3MgPT0gY2xhc3MgJiYKKwkJICAgcnEtPm5yX3J1bm5pbmcgPT0gcnEtPmNmcy5oX25yX3J1bm5pbmcpKSB7CisJCXAgPSBmYWlyX3NjaGVkX2NsYXNzLnBpY2tfbmV4dF90YXNrKHJxLCBwcmV2KTsKKwkJaWYgKGxpa2VseShwICYmIHAgIT0gUkVUUllfVEFTSykpCiAJCQlyZXR1cm4gcDsKIAl9CiAKK2FnYWluOgogCWZvcl9lYWNoX2NsYXNzKGNsYXNzKSB7Ci0JCXAgPSBjbGFzcy0+cGlja19uZXh0X3Rhc2socnEpOwotCQlpZiAocCkKKwkJcCA9IGNsYXNzLT5waWNrX25leHRfdGFzayhycSwgcHJldik7CisJCWlmIChwKSB7CisJCQlpZiAodW5saWtlbHkocCA9PSBSRVRSWV9UQVNLKSkKKwkJCQlnb3RvIGFnYWluOwogCQkJcmV0dXJuIHA7CisJCX0KIAl9CiAKIAlCVUcoKTsgLyogdGhlIGlkbGUgY2xhc3Mgd2lsbCBhbHdheXMgaGF2ZSBhIHJ1bm5hYmxlIHRhc2sgKi8KQEAgLTI3MDAsMTMgKzI2OTYsMTAgQEAKIAkJc3dpdGNoX2NvdW50ID0gJnByZXYtPm52Y3N3OwogCX0KIAotCXByZV9zY2hlZHVsZShycSwgcHJldik7CisJaWYgKHByZXYtPm9uX3JxIHx8IHJxLT5za2lwX2Nsb2NrX3VwZGF0ZSA8IDApCisJCXVwZGF0ZV9ycV9jbG9jayhycSk7CiAKLQlpZiAodW5saWtlbHkoIXJxLT5ucl9ydW5uaW5nKSkKLQkJaWRsZV9iYWxhbmNlKGNwdSwgcnEpOwotCi0JcHV0X3ByZXZfdGFzayhycSwgcHJldik7Ci0JbmV4dCA9IHBpY2tfbmV4dF90YXNrKHJxKTsKKwluZXh0ID0gcGlja19uZXh0X3Rhc2socnEsIHByZXYpOwogCWNsZWFyX3Rza19uZWVkX3Jlc2NoZWQocHJldik7CiAJY2xlYXJfcHJlZW1wdF9uZWVkX3Jlc2NoZWQoKTsKIAlycS0+c2tpcF9jbG9ja191cGRhdGUgPSAwOwpAQCAtMjkwOCw3ICsyOTAxLDggQEAKICAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgJ2VmZmVjdGl2ZScgcHJpb3JpdHkgb2YgYSB0YXNrLiBJdCBkb2VzCiAgKiBub3QgdG91Y2ggLT5ub3JtYWxfcHJpbyBsaWtlIF9fc2V0c2NoZWR1bGVyKCkuCiAgKgotICogVXNlZCBieSB0aGUgcnRfbXV0ZXggY29kZSB0byBpbXBsZW1lbnQgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbG9naWMuCisgKiBVc2VkIGJ5IHRoZSBydF9tdXRleCBjb2RlIHRvIGltcGxlbWVudCBwcmlvcml0eSBpbmhlcml0YW5jZQorICogbG9naWMuIENhbGwgc2l0ZSBvbmx5IGNhbGxzIGlmIHRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBjaGFuZ2VkLgogICovCiB2b2lkIHJ0X211dGV4X3NldHByaW8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJpbykKIHsKQEAgLTI5OTgsNyArMjk5Miw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnEgKnJxOwogCi0JaWYgKFRBU0tfTklDRShwKSA9PSBuaWNlIHx8IG5pY2UgPCAtMjAgfHwgbmljZSA+IDE5KQorCWlmICh0YXNrX25pY2UocCkgPT0gbmljZSB8fCBuaWNlIDwgTUlOX05JQ0UgfHwgbmljZSA+IE1BWF9OSUNFKQogCQlyZXR1cm47CiAJLyoKIAkgKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwsIGlmIGNhbGxlZCBmcm9tIHN5c19zZXRwcmlvcml0eSgpLApAQCAtMzA3NiwxMSArMzA3MCwxMSBAQAogCWlmIChpbmNyZW1lbnQgPiA0MCkKIAkJaW5jcmVtZW50ID0gNDA7CiAKLQluaWNlID0gVEFTS19OSUNFKGN1cnJlbnQpICsgaW5jcmVtZW50OwotCWlmIChuaWNlIDwgLTIwKQotCQluaWNlID0gLTIwOwotCWlmIChuaWNlID4gMTkpCi0JCW5pY2UgPSAxOTsKKwluaWNlID0gdGFza19uaWNlKGN1cnJlbnQpICsgaW5jcmVtZW50OworCWlmIChuaWNlIDwgTUlOX05JQ0UpCisJCW5pY2UgPSBNSU5fTklDRTsKKwlpZiAobmljZSA+IE1BWF9OSUNFKQorCQluaWNlID0gTUFYX05JQ0U7CiAKIAlpZiAoaW5jcmVtZW50IDwgMCAmJiAhY2FuX25pY2UoY3VycmVudCwgbmljZSkpCiAJCXJldHVybiAtRVBFUk07CkBAIC0zMTA5LDE4ICszMTAzLDYgQEAKIH0KIAogLyoqCi0gKiB0YXNrX25pY2UgLSByZXR1cm4gdGhlIG5pY2UgdmFsdWUgb2YgYSBnaXZlbiB0YXNrLgotICogQHA6IHRoZSB0YXNrIGluIHF1ZXN0aW9uLgotICoKLSAqIFJldHVybjogVGhlIG5pY2UgdmFsdWUgWyAtMjAgLi4uIDAgLi4uIDE5IF0uCi0gKi8KLWludCB0YXNrX25pY2UoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXJldHVybiBUQVNLX05JQ0UocCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2tfbmljZSk7Ci0KLS8qKgogICogaWRsZV9jcHUgLSBpcyBhIGdpdmVuIGNwdSBpZGxlIGN1cnJlbnRseT8KICAqIEBjcHU6IHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24uCiAgKgpAQCAtMzE4OSw5ICszMTcxLDggQEAKIAlkbF9zZS0+ZGxfbmV3ID0gMTsKIH0KIAotLyogQWN0dWFsbHkgZG8gcHJpb3JpdHkgY2hhbmdlOiBtdXN0IGhvbGQgcGkgJiBycSBsb2NrLiAqLwotc3RhdGljIHZvaWQgX19zZXRzY2hlZHVsZXIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAotCQkJICAgY29uc3Qgc3RydWN0IHNjaGVkX2F0dHIgKmF0dHIpCitzdGF0aWMgdm9pZCBfX3NldHNjaGVkdWxlcl9wYXJhbXMoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQljb25zdCBzdHJ1Y3Qgc2NoZWRfYXR0ciAqYXR0cikKIHsKIAlpbnQgcG9saWN5ID0gYXR0ci0+c2NoZWRfcG9saWN5OwogCkBAIC0zMjExLDkgKzMxOTIsMjEgQEAKIAkgKiBnZXRwYXJhbSgpL2dldGF0dHIoKSBkb24ndCByZXBvcnQgc2lsbHkgdmFsdWVzIGZvciAhcnQgdGFza3MuCiAJICovCiAJcC0+cnRfcHJpb3JpdHkgPSBhdHRyLT5zY2hlZF9wcmlvcml0eTsKLQogCXAtPm5vcm1hbF9wcmlvID0gbm9ybWFsX3ByaW8ocCk7Ci0JcC0+cHJpbyA9IHJ0X211dGV4X2dldHByaW8ocCk7CisJc2V0X2xvYWRfd2VpZ2h0KHApOworfQorCisvKiBBY3R1YWxseSBkbyBwcmlvcml0eSBjaGFuZ2U6IG11c3QgaG9sZCBwaSAmIHJxIGxvY2suICovCitzdGF0aWMgdm9pZCBfX3NldHNjaGVkdWxlcihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfYXR0ciAqYXR0cikKK3sKKwlfX3NldHNjaGVkdWxlcl9wYXJhbXMocCwgYXR0cik7CisKKwkvKgorCSAqIElmIHdlIGdldCBoZXJlLCB0aGVyZSB3YXMgbm8gcGkgd2FpdGVycyBib29zdGluZyB0aGUKKwkgKiB0YXNrLiBJdCBpcyBzYWZlIHRvIHVzZSB0aGUgbm9ybWFsIHByaW8uCisJICovCisJcC0+cHJpbyA9IG5vcm1hbF9wcmlvKHApOwogCiAJaWYgKGRsX3ByaW8ocC0+cHJpbykpCiAJCXAtPnNjaGVkX2NsYXNzID0gJmRsX3NjaGVkX2NsYXNzOwpAQCAtMzIyMSw4ICszMjE0LDYgQEAKIAkJcC0+c2NoZWRfY2xhc3MgPSAmcnRfc2NoZWRfY2xhc3M7CiAJZWxzZQogCQlwLT5zY2hlZF9jbGFzcyA9ICZmYWlyX3NjaGVkX2NsYXNzOwotCi0Jc2V0X2xvYWRfd2VpZ2h0KHApOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzI3NSw2ICszMjY2LDggQEAKIAkJCQljb25zdCBzdHJ1Y3Qgc2NoZWRfYXR0ciAqYXR0ciwKIAkJCQlib29sIHVzZXIpCiB7CisJaW50IG5ld3ByaW8gPSBkbF9wb2xpY3koYXR0ci0+c2NoZWRfcG9saWN5KSA/IE1BWF9ETF9QUklPIC0gMSA6CisJCSAgICAgIE1BWF9SVF9QUklPIC0gMSAtIGF0dHItPnNjaGVkX3ByaW9yaXR5OwogCWludCByZXR2YWwsIG9sZHByaW8sIG9sZHBvbGljeSA9IC0xLCBvbl9ycSwgcnVubmluZzsKIAlpbnQgcG9saWN5ID0gYXR0ci0+c2NoZWRfcG9saWN5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zMzE5LDcgKzMzMTIsNyBAQAogCSAqLwogCWlmICh1c2VyICYmICFjYXBhYmxlKENBUF9TWVNfTklDRSkpIHsKIAkJaWYgKGZhaXJfcG9saWN5KHBvbGljeSkpIHsKLQkJCWlmIChhdHRyLT5zY2hlZF9uaWNlIDwgVEFTS19OSUNFKHApICYmCisJCQlpZiAoYXR0ci0+c2NoZWRfbmljZSA8IHRhc2tfbmljZShwKSAmJgogCQkJICAgICFjYW5fbmljZShwLCBhdHRyLT5zY2hlZF9uaWNlKSkKIAkJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC0zMzUyLDcgKzMzNDUsNyBAQAogCQkgKiBTQ0hFRF9OT1JNQUwgaWYgdGhlIFJMSU1JVF9OSUNFIHdvdWxkIG5vcm1hbGx5IHBlcm1pdCBpdC4KIAkJICovCiAJCWlmIChwLT5wb2xpY3kgPT0gU0NIRURfSURMRSAmJiBwb2xpY3kgIT0gU0NIRURfSURMRSkgewotCQkJaWYgKCFjYW5fbmljZShwLCBUQVNLX05JQ0UocCkpKQorCQkJaWYgKCFjYW5fbmljZShwLCB0YXNrX25pY2UocCkpKQogCQkJCXJldHVybiAtRVBFUk07CiAJCX0KIApAQCAtMzM4OSwxNiArMzM4MiwxOCBAQAogCX0KIAogCS8qCi0JICogSWYgbm90IGNoYW5naW5nIGFueXRoaW5nIHRoZXJlJ3Mgbm8gbmVlZCB0byBwcm9jZWVkIGZ1cnRoZXI6CisJICogSWYgbm90IGNoYW5naW5nIGFueXRoaW5nIHRoZXJlJ3Mgbm8gbmVlZCB0byBwcm9jZWVkIGZ1cnRoZXIsCisJICogYnV0IHN0b3JlIGEgcG9zc2libGUgbW9kaWZpY2F0aW9uIG9mIHJlc2V0X29uX2ZvcmsuCiAJICovCiAJaWYgKHVubGlrZWx5KHBvbGljeSA9PSBwLT5wb2xpY3kpKSB7Ci0JCWlmIChmYWlyX3BvbGljeShwb2xpY3kpICYmIGF0dHItPnNjaGVkX25pY2UgIT0gVEFTS19OSUNFKHApKQorCQlpZiAoZmFpcl9wb2xpY3kocG9saWN5KSAmJiBhdHRyLT5zY2hlZF9uaWNlICE9IHRhc2tfbmljZShwKSkKIAkJCWdvdG8gY2hhbmdlOwogCQlpZiAocnRfcG9saWN5KHBvbGljeSkgJiYgYXR0ci0+c2NoZWRfcHJpb3JpdHkgIT0gcC0+cnRfcHJpb3JpdHkpCiAJCQlnb3RvIGNoYW5nZTsKIAkJaWYgKGRsX3BvbGljeShwb2xpY3kpKQogCQkJZ290byBjaGFuZ2U7CiAKKwkJcC0+c2NoZWRfcmVzZXRfb25fZm9yayA9IHJlc2V0X29uX2Zvcms7CiAJCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zNDUyLDYgKzM0NDcsMjQgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKKwlwLT5zY2hlZF9yZXNldF9vbl9mb3JrID0gcmVzZXRfb25fZm9yazsKKwlvbGRwcmlvID0gcC0+cHJpbzsKKworCS8qCisJICogU3BlY2lhbCBjYXNlIGZvciBwcmlvcml0eSBib29zdGVkIHRhc2tzLgorCSAqCisJICogSWYgdGhlIG5ldyBwcmlvcml0eSBpcyBsb3dlciBvciBlcXVhbCAodXNlciBzcGFjZSB2aWV3KQorCSAqIHRoYW4gdGhlIGN1cnJlbnQgKGJvb3N0ZWQpIHByaW9yaXR5LCB3ZSBqdXN0IHN0b3JlIHRoZSBuZXcKKwkgKiBub3JtYWwgcGFyYW1ldGVycyBhbmQgZG8gbm90IHRvdWNoIHRoZSBzY2hlZHVsZXIgY2xhc3MgYW5kCisJICogdGhlIHJ1bnF1ZXVlLiBUaGlzIHdpbGwgYmUgZG9uZSB3aGVuIHRoZSB0YXNrIGRlYm9vc3QKKwkgKiBpdHNlbGYuCisJICovCisJaWYgKHJ0X211dGV4X2NoZWNrX3ByaW8ocCwgbmV3cHJpbykpIHsKKwkJX19zZXRzY2hlZHVsZXJfcGFyYW1zKHAsIGF0dHIpOworCQl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJb25fcnEgPSBwLT5vbl9ycTsKIAlydW5uaW5nID0gdGFza19jdXJyZW50KHJxLCBwKTsKIAlpZiAob25fcnEpCkBAIC0zNDU5LDE2ICszNDcyLDE4IEBACiAJaWYgKHJ1bm5pbmcpCiAJCXAtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwKTsKIAotCXAtPnNjaGVkX3Jlc2V0X29uX2ZvcmsgPSByZXNldF9vbl9mb3JrOwotCi0Jb2xkcHJpbyA9IHAtPnByaW87CiAJcHJldl9jbGFzcyA9IHAtPnNjaGVkX2NsYXNzOwogCV9fc2V0c2NoZWR1bGVyKHJxLCBwLCBhdHRyKTsKIAogCWlmIChydW5uaW5nKQogCQlwLT5zY2hlZF9jbGFzcy0+c2V0X2N1cnJfdGFzayhycSk7Ci0JaWYgKG9uX3JxKQotCQllbnF1ZXVlX3Rhc2socnEsIHAsIDApOworCWlmIChvbl9ycSkgeworCQkvKgorCQkgKiBXZSBlbnF1ZXVlIHRvIHRhaWwgd2hlbiB0aGUgcHJpb3JpdHkgb2YgYSB0YXNrIGlzCisJCSAqIGluY3JlYXNlZCAodXNlciBzcGFjZSB2aWV3KS4KKwkJICovCisJCWVucXVldWVfdGFzayhycSwgcCwgb2xkcHJpbyA8PSBwLT5wcmlvID8gRU5RVUVVRV9IRUFEIDogMCk7CisJfQogCiAJY2hlY2tfY2xhc3NfY2hhbmdlZChycSwgcCwgcHJldl9jbGFzcywgb2xkcHJpbyk7CiAJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CkBAIC0zNjI0LDcgKzM2MzksNyBAQAogCSAqIFhYWDogZG8gd2Ugd2FudCB0byBiZSBsZW5pZW50IGxpa2UgZXhpc3Rpbmcgc3lzY2FsbHM7IG9yIGRvIHdlIHdhbnQKIAkgKiB0byBiZSBzdHJpY3QgYW5kIHJldHVybiBhbiBlcnJvciBvbiBvdXQtb2YtYm91bmRzIHZhbHVlcz8KIAkgKi8KLQlhdHRyLT5zY2hlZF9uaWNlID0gY2xhbXAoYXR0ci0+c2NoZWRfbmljZSwgLTIwLCAxOSk7CisJYXR0ci0+c2NoZWRfbmljZSA9IGNsYW1wKGF0dHItPnNjaGVkX25pY2UsIE1JTl9OSUNFLCBNQVhfTklDRSk7CiAKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtMzg0NSw3ICszODYwLDcgQEAKIAllbHNlIGlmICh0YXNrX2hhc19ydF9wb2xpY3kocCkpCiAJCWF0dHIuc2NoZWRfcHJpb3JpdHkgPSBwLT5ydF9wcmlvcml0eTsKIAllbHNlCi0JCWF0dHIuc2NoZWRfbmljZSA9IFRBU0tfTklDRShwKTsKKwkJYXR0ci5zY2hlZF9uaWNlID0gdGFza19uaWNlKHApOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKQEAgLTQ0ODMsNiArNDQ5OCw3IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlycS0+Y3VyciA9IHJxLT5pZGxlID0gaWRsZTsKKwlpZGxlLT5vbl9ycSA9IDE7CiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogCWlkbGUtPm9uX2NwdSA9IDE7CiAjZW5kaWYKQEAgLTQ3MDIsOCArNDcxOCwxMCBAQAogCiAJQlVHX09OKGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CiAKLQlpZiAobW0gIT0gJmluaXRfbW0pCisJaWYgKG1tICE9ICZpbml0X21tKSB7CiAJCXN3aXRjaF9tbShtbSwgJmluaXRfbW0sIGN1cnJlbnQpOworCQlmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoKCk7CisJfQogCW1tZHJvcChtbSk7CiB9CiAKQEAgLTQ3MjEsNiArNDczOSwyMiBAQAogCQlhdG9taWNfbG9uZ19hZGQoZGVsdGEsICZjYWxjX2xvYWRfdGFza3MpOwogfQogCitzdGF0aWMgdm9pZCBwdXRfcHJldl90YXNrX2Zha2Uoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzIGZha2Vfc2NoZWRfY2xhc3MgPSB7CisJLnB1dF9wcmV2X3Rhc2sgPSBwdXRfcHJldl90YXNrX2Zha2UsCit9OworCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0IGZha2VfdGFzayA9IHsKKwkvKgorCSAqIEF2b2lkIHB1bGxfe3J0LGRsfV90YXNrKCkKKwkgKi8KKwkucHJpbyA9IE1BWF9QUklPICsgMSwKKwkuc2NoZWRfY2xhc3MgPSAmZmFrZV9zY2hlZF9jbGFzcywKK307CisKIC8qCiAgKiBNaWdyYXRlIGFsbCB0YXNrcyBmcm9tIHRoZSBycSwgc2xlZXBpbmcgdGFza3Mgd2lsbCBiZSBtaWdyYXRlZCBieQogICogdHJ5X3RvX3dha2VfdXAoKS0+c2VsZWN0X3Rhc2tfcnEoKS4KQEAgLTQ3NjEsNyArNDc5NSw3IEBACiAJCWlmIChycS0+bnJfcnVubmluZyA9PSAxKQogCQkJYnJlYWs7CiAKLQkJbmV4dCA9IHBpY2tfbmV4dF90YXNrKHJxKTsKKwkJbmV4dCA9IHBpY2tfbmV4dF90YXNrKHJxLCAmZmFrZV90YXNrKTsKIAkJQlVHX09OKCFuZXh0KTsKIAkJbmV4dC0+c2NoZWRfY2xhc3MtPnB1dF9wcmV2X3Rhc2socnEsIG5leHQpOwogCkBAIC00ODUxLDcgKzQ4ODUsNyBAQAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgKgogc2RfYWxsb2NfY3RsX2RvbWFpbl90YWJsZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeSgxMyk7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSBzZF9hbGxvY19jdGxfZW50cnkoMTQpOwogCiAJaWYgKHRhYmxlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtNDg3OSw5ICs0OTEzLDEyIEBACiAJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCwgZmFsc2UpOwogCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMTBdLCAiZmxhZ3MiLCAmc2QtPmZsYWdzLAogCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgsIGZhbHNlKTsKLQlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzExXSwgIm5hbWUiLCBzZC0+bmFtZSwKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzExXSwgIm1heF9uZXdpZGxlX2xiX2Nvc3QiLAorCQkmc2QtPm1heF9uZXdpZGxlX2xiX2Nvc3QsCisJCXNpemVvZihsb25nKSwgMDY0NCwgcHJvY19kb3Vsb25ndmVjX21pbm1heCwgZmFsc2UpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMTJdLCAibmFtZSIsIHNkLT5uYW1lLAogCQlDT1JFTkFNRV9NQVhfU0laRSwgMDQ0NCwgcHJvY19kb3N0cmluZywgZmFsc2UpOwotCS8qICZ0YWJsZVsxMl0gaXMgdGVybWluYXRvciAqLworCS8qICZ0YWJsZVsxM10gaXMgdGVybWluYXRvciAqLwogCiAJcmV0dXJuIHRhYmxlOwogfQpAQCAtNjg1OCw3ICs2ODk1LDYgQEAKIAogCQlycS0+cnQucnRfcnVudGltZSA9IGRlZl9ydF9iYW5kd2lkdGgucnRfcnVudGltZTsKICNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQkJSU5JVF9MSVNUX0hFQUQoJnJxLT5sZWFmX3J0X3JxX2xpc3QpOwogCQlpbml0X3RnX3J0X2VudHJ5KCZyb290X3Rhc2tfZ3JvdXAsICZycS0+cnQsIE5VTEwsIGksIE5VTEwpOwogI2VuZGlmCiAKQEAgLTY5NDcsNyArNjk4Myw4IEBACiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9qaWZmeTsJLyogcmF0ZWxpbWl0aW5nICovCiAKIAlyY3Vfc2xlZXBfY2hlY2soKTsgLyogV0FSTl9PTl9PTkNFKCkgYnkgZGVmYXVsdCwgbm8gcmF0ZSBsaW1pdCByZXFkLiAqLwotCWlmICgocHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpICYmICFpcnFzX2Rpc2FibGVkKCkpIHx8CisJaWYgKChwcmVlbXB0X2NvdW50X2VxdWFscyhwcmVlbXB0X29mZnNldCkgJiYgIWlycXNfZGlzYWJsZWQoKSAmJgorCSAgICAgIWlzX2lkbGVfdGFzayhjdXJyZW50KSkgfHwKIAkgICAgc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCiAJCXJldHVybjsKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcHJldl9qaWZmeSArIEhaKSAmJiBwcmV2X2ppZmZ5KQpAQCAtNjk2NSw2ICs3MDAyLDEzIEBACiAJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOwogCWlmIChpcnFzX2Rpc2FibGVkKCkpCiAJCXByaW50X2lycXRyYWNlX2V2ZW50cyhjdXJyZW50KTsKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCWlmICghcHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpKSB7CisJCXByX2VycigiUHJlZW1wdGlvbiBkaXNhYmxlZCBhdDoiKTsKKwkJcHJpbnRfaXBfc3ltKGN1cnJlbnQtPnByZWVtcHRfZGlzYWJsZV9pcCk7CisJCXByX2NvbnQoIlxuIik7CisJfQorI2VuZGlmCiAJZHVtcF9zdGFjaygpOwogfQogRVhQT1JUX1NZTUJPTChfX21pZ2h0X3NsZWVwKTsKQEAgLTcwMTgsNyArNzA2Miw3IEBACiAJCQkgKiBSZW5pY2UgbmVnYXRpdmUgbmljZSBsZXZlbCB1c2Vyc3BhY2UKIAkJCSAqIHRhc2tzIGJhY2sgdG8gMDoKIAkJCSAqLwotCQkJaWYgKFRBU0tfTklDRShwKSA8IDAgJiYgcC0+bW0pCisJCQlpZiAodGFza19uaWNlKHApIDwgMCAmJiBwLT5tbSkKIAkJCQlzZXRfdXNlcl9uaWNlKHAsIDApOwogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMgYi9rZXJuZWwvc2NoZWQvY3B1dGltZS5jCmluZGV4IDk5OTQ3OTEuLmE5NTA5N2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMKKysrIGIva2VybmVsL3NjaGVkL2NwdXRpbWUuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJcC0+dXRpbWVzY2FsZWQgKz0gY3B1dGltZV9zY2FsZWQ7CiAJYWNjb3VudF9ncm91cF91c2VyX3RpbWUocCwgY3B1dGltZSk7CiAKLQlpbmRleCA9IChUQVNLX05JQ0UocCkgPiAwKSA/IENQVVRJTUVfTklDRSA6IENQVVRJTUVfVVNFUjsKKwlpbmRleCA9ICh0YXNrX25pY2UocCkgPiAwKSA/IENQVVRJTUVfTklDRSA6IENQVVRJTUVfVVNFUjsKIAogCS8qIEFkZCB1c2VyIHRpbWUgdG8gY3B1c3RhdC4gKi8KIAl0YXNrX2dyb3VwX2FjY291bnRfZmllbGQocCwgaW5kZXgsIChfX2ZvcmNlIHU2NCkgY3B1dGltZSk7CkBAIC0xNjksNyArMTY5LDcgQEAKIAlwLT5ndGltZSArPSBjcHV0aW1lOwogCiAJLyogQWRkIGd1ZXN0IHRpbWUgdG8gY3B1c3RhdC4gKi8KLQlpZiAoVEFTS19OSUNFKHApID4gMCkgeworCWlmICh0YXNrX25pY2UocCkgPiAwKSB7CiAJCWNwdXN0YXRbQ1BVVElNRV9OSUNFXSArPSAoX19mb3JjZSB1NjQpIGNwdXRpbWU7CiAJCWNwdXN0YXRbQ1BVVElNRV9HVUVTVF9OSUNFXSArPSAoX19mb3JjZSB1NjQpIGNwdXRpbWU7CiAJfSBlbHNlIHsKQEAgLTI1OCwxNiArMjU4LDIyIEBACiB7CiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAJaWYgKHN0YXRpY19rZXlfZmFsc2UoJnBhcmF2aXJ0X3N0ZWFsX2VuYWJsZWQpKSB7Ci0JCXU2NCBzdGVhbCwgc3QgPSAwOworCQl1NjQgc3RlYWw7CisJCWNwdXRpbWVfdCBzdGVhbF9jdDsKIAogCQlzdGVhbCA9IHBhcmF2aXJ0X3N0ZWFsX2Nsb2NrKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCXN0ZWFsIC09IHRoaXNfcnEoKS0+cHJldl9zdGVhbF90aW1lOwogCi0JCXN0ID0gc3RlYWxfdGlja3Moc3RlYWwpOwotCQl0aGlzX3JxKCktPnByZXZfc3RlYWxfdGltZSArPSBzdCAqIFRJQ0tfTlNFQzsKKwkJLyoKKwkJICogY3B1dGltZV90IG1heSBiZSBsZXNzIHByZWNpc2UgdGhhbiBuc2VjcyAoZWc6IGlmIGl0J3MKKwkJICogYmFzZWQgb24gamlmZmllcykuIExldHMgY2FzdCB0aGUgcmVzdWx0IHRvIGNwdXRpbWUKKwkJICogZ3JhbnVsYXJpdHkgYW5kIGFjY291bnQgdGhlIHJlc3Qgb24gdGhlIG5leHQgcm91bmRzLgorCQkgKi8KKwkJc3RlYWxfY3QgPSBuc2Vjc190b19jcHV0aW1lKHN0ZWFsKTsKKwkJdGhpc19ycSgpLT5wcmV2X3N0ZWFsX3RpbWUgKz0gY3B1dGltZV90b19uc2VjcyhzdGVhbF9jdCk7CiAKLQkJYWNjb3VudF9zdGVhbF90aW1lKHN0KTsKLQkJcmV0dXJuIHN0OworCQlhY2NvdW50X3N0ZWFsX3RpbWUoc3RlYWxfY3QpOworCQlyZXR1cm4gc3RlYWxfY3Q7CiAJfQogI2VuZGlmCiAJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwppbmRleCA2ZTc5YjNmLi4yN2VmNDA5IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwpAQCAtMjEwLDYgKzIxMCwxNiBAQAogCiBzdGF0aWMgaW50IHB1c2hfZGxfdGFzayhzdHJ1Y3QgcnEgKnJxKTsKIAorc3RhdGljIGlubGluZSBib29sIG5lZWRfcHVsbF9kbF90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKwlyZXR1cm4gZGxfdGFzayhwcmV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3N0X3NjaGVkdWxlKHN0cnVjdCBycSAqcnEpCit7CisJcnEtPnBvc3Rfc2NoZWR1bGUgPSBoYXNfcHVzaGFibGVfZGxfdGFza3MocnEpOworfQorCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lCkBAIC0yMzIsNiArMjQyLDE5IEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWVkX3B1bGxfZGxfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsX2RsX3Rhc2soc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3N0X3NjaGVkdWxlKHN0cnVjdCBycSAqcnEpCit7Cit9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiBzdGF0aWMgdm9pZCBlbnF1ZXVlX3Rhc2tfZGwoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOwpAQCAtNTg2LDggKzYwOSw4IEBACiAJICogYXBwcm9hY2ggbmVlZCBmdXJ0aGVyIHN0dWR5LgogCSAqLwogCWRlbHRhX2V4ZWMgPSBycV9jbG9ja190YXNrKHJxKSAtIGN1cnItPnNlLmV4ZWNfc3RhcnQ7Ci0JaWYgKHVubGlrZWx5KChzNjQpZGVsdGFfZXhlYyA8IDApKQotCQlkZWx0YV9leGVjID0gMDsKKwlpZiAodW5saWtlbHkoKHM2NClkZWx0YV9leGVjIDw9IDApKQorCQlyZXR1cm47CiAKIAlzY2hlZHN0YXRfc2V0KGN1cnItPnNlLnN0YXRpc3RpY3MuZXhlY19tYXgsCiAJCSAgICAgIG1heChjdXJyLT5zZS5zdGF0aXN0aWNzLmV4ZWNfbWF4LCBkZWx0YV9leGVjKSk7CkBAIC05NDIsNiArOTY1LDggQEAKIAlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwogfQogCitzdGF0aWMgaW50IHB1bGxfZGxfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpOworCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAvKgpAQCAtOTg4LDcgKzEwMTMsNyBAQAogCXJldHVybiByYl9lbnRyeShsZWZ0LCBzdHJ1Y3Qgc2NoZWRfZGxfZW50aXR5LCByYl9ub2RlKTsKIH0KIAotc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19kbChzdHJ1Y3QgcnEgKnJxKQorc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19kbChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCiB7CiAJc3RydWN0IHNjaGVkX2RsX2VudGl0eSAqZGxfc2U7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtOTk2LDkgKzEwMjEsMjAgQEAKIAogCWRsX3JxID0gJnJxLT5kbDsKIAorCWlmIChuZWVkX3B1bGxfZGxfdGFzayhycSwgcHJldikpCisJCXB1bGxfZGxfdGFzayhycSk7CisJLyoKKwkgKiBXaGVuIHByZXYgaXMgREwsIHdlIG1heSB0aHJvdHRsZSBpdCBpbiBwdXRfcHJldl90YXNrKCkuCisJICogU28sIHdlIHVwZGF0ZSB0aW1lIGJlZm9yZSB3ZSBjaGVjayBmb3IgZGxfbnJfcnVubmluZy4KKwkgKi8KKwlpZiAocHJldi0+c2NoZWRfY2xhc3MgPT0gJmRsX3NjaGVkX2NsYXNzKQorCQl1cGRhdGVfY3Vycl9kbChycSk7CisKIAlpZiAodW5saWtlbHkoIWRsX3JxLT5kbF9ucl9ydW5uaW5nKSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKwogCWRsX3NlID0gcGlja19uZXh0X2RsX2VudGl0eShycSwgZGxfcnEpOwogCUJVR19PTighZGxfc2UpOwogCkBAIC0xMDEzLDkgKzEwNDksNyBAQAogCQlzdGFydF9ocnRpY2tfZGwocnEsIHApOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU01QCi0JcnEtPnBvc3Rfc2NoZWR1bGUgPSBoYXNfcHVzaGFibGVfZGxfdGFza3MocnEpOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwlzZXRfcG9zdF9zY2hlZHVsZShycSk7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTE0MjQsMTMgKzE0NTgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHByZV9zY2hlZHVsZV9kbChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCi17Ci0JLyogVHJ5IHRvIHB1bGwgb3RoZXIgdGFza3MgaGVyZSAqLwotCWlmIChkbF90YXNrKHByZXYpKQotCQlwdWxsX2RsX3Rhc2socnEpOwotfQotCiBzdGF0aWMgdm9pZCBwb3N0X3NjaGVkdWxlX2RsKHN0cnVjdCBycSAqcnEpCiB7CiAJcHVzaF9kbF90YXNrcyhycSk7CkBAIC0xNTU4LDcgKzE1ODUsNyBAQAogCWlmICh1bmxpa2VseShwLT5kbC5kbF90aHJvdHRsZWQpKQogCQlyZXR1cm47CiAKLQlpZiAocC0+b25fcnEgfHwgcnEtPmN1cnIgIT0gcCkgeworCWlmIChwLT5vbl9ycSAmJiBycS0+Y3VyciAhPSBwKSB7CiAjaWZkZWYgQ09ORklHX1NNUAogCQlpZiAocnEtPmRsLm92ZXJsb2FkZWQgJiYgcHVzaF9kbF90YXNrKHJxKSAmJiBycSAhPSB0YXNrX3JxKHApKQogCQkJLyogT25seSByZXNjaGVkdWxlIGlmIHB1c2hpbmcgZmFpbGVkICovCkBAIC0xNjIzLDcgKzE2NTAsNiBAQAogCS5zZXRfY3B1c19hbGxvd2VkICAgICAgID0gc2V0X2NwdXNfYWxsb3dlZF9kbCwKIAkucnFfb25saW5lICAgICAgICAgICAgICA9IHJxX29ubGluZV9kbCwKIAkucnFfb2ZmbGluZSAgICAgICAgICAgICA9IHJxX29mZmxpbmVfZGwsCi0JLnByZV9zY2hlZHVsZQkJPSBwcmVfc2NoZWR1bGVfZGwsCiAJLnBvc3Rfc2NoZWR1bGUJCT0gcG9zdF9zY2hlZHVsZV9kbCwKIAkudGFza193b2tlbgkJPSB0YXNrX3dva2VuX2RsLAogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZGVidWcuYyBiL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCmluZGV4IGRkNTJlN2YuLmYzMzQ0YzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCisrKyBiL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCkBAIC0zMjEsNiArMzIxLDcgQEAKIAlQKHNjaGVkX2dvaWRsZSk7CiAjaWZkZWYgQ09ORklHX1NNUAogCVA2NChhdmdfaWRsZSk7CisJUDY0KG1heF9pZGxlX2JhbGFuY2VfY29zdCk7CiAjZW5kaWYKIAogCVAodHR3dV9jb3VudCk7CkBAIC01MzMsMTUgKzUzNCwxNSBAQAogCQkJdW5zaWduZWQgbG9uZyBucl9mYXVsdHMgPSAtMTsKIAkJCWludCBjcHVfY3VycmVudCwgaG9tZV9ub2RlOwogCi0JCQlpZiAocC0+bnVtYV9mYXVsdHMpCi0JCQkJbnJfZmF1bHRzID0gcC0+bnVtYV9mYXVsdHNbMipub2RlICsgaV07CisJCQlpZiAocC0+bnVtYV9mYXVsdHNfbWVtb3J5KQorCQkJCW5yX2ZhdWx0cyA9IHAtPm51bWFfZmF1bHRzX21lbW9yeVsyKm5vZGUgKyBpXTsKIAogCQkJY3B1X2N1cnJlbnQgPSAhaSA/ICh0YXNrX25vZGUocCkgPT0gbm9kZSkgOgogCQkJCShwb2wgJiYgbm9kZV9pc3NldChub2RlLCBwb2wtPnYubm9kZXMpKTsKIAogCQkJaG9tZV9ub2RlID0gKHAtPm51bWFfcHJlZmVycmVkX25pZCA9PSBub2RlKTsKIAotCQkJU0VRX3ByaW50ZihtLCAibnVtYV9mYXVsdHMsICVkLCAlZCwgJWQsICVkLCAlbGRcbiIsCisJCQlTRVFfcHJpbnRmKG0sICJudW1hX2ZhdWx0c19tZW1vcnksICVkLCAlZCwgJWQsICVkLCAlbGRcbiIsCiAJCQkJaSwgbm9kZSwgY3B1X2N1cnJlbnQsIGhvbWVfbm9kZSwgbnJfZmF1bHRzKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9mYWlyLmMgYi9rZXJuZWwvc2NoZWQvZmFpci5jCmluZGV4IDliNGM0ZjMuLjdlOWJkMGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkL2ZhaXIuYwpAQCAtMzIyLDEzICszMjIsMTMgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjZnNfcnEsICZycS0+bGVhZl9jZnNfcnFfbGlzdCwgbGVhZl9jZnNfcnFfbGlzdCkKIAogLyogRG8gdGhlIHR3byAoZW5xdWV1ZWQpIGVudGl0aWVzIGJlbG9uZyB0byB0aGUgc2FtZSBncm91cCA/ICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZzX3JxICoKIGlzX3NhbWVfZ3JvdXAoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnBzZSkKIHsKIAlpZiAoc2UtPmNmc19ycSA9PSBwc2UtPmNmc19ycSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiBzZS0+Y2ZzX3JxOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNjaGVkX2VudGl0eSAqcGFyZW50X2VudGl0eShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKQEAgLTMzNiwxNyArMzM2LDYgQEAKIAlyZXR1cm4gc2UtPnBhcmVudDsKIH0KIAotLyogcmV0dXJuIGRlcHRoIGF0IHdoaWNoIGEgc2NoZWQgZW50aXR5IGlzIHByZXNlbnQgaW4gdGhlIGhpZXJhcmNoeSAqLwotc3RhdGljIGlubGluZSBpbnQgZGVwdGhfc2Uoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci0JaW50IGRlcHRoID0gMDsKLQotCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKLQkJZGVwdGgrKzsKLQotCXJldHVybiBkZXB0aDsKLX0KLQogc3RhdGljIHZvaWQKIGZpbmRfbWF0Y2hpbmdfc2Uoc3RydWN0IHNjaGVkX2VudGl0eSAqKnNlLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICoqcHNlKQogewpAQCAtMzYwLDggKzM0OSw4IEBACiAJICovCiAKIAkvKiBGaXJzdCB3YWxrIHVwIHVudGlsIGJvdGggZW50aXRpZXMgYXJlIGF0IHNhbWUgZGVwdGggKi8KLQlzZV9kZXB0aCA9IGRlcHRoX3NlKCpzZSk7Ci0JcHNlX2RlcHRoID0gZGVwdGhfc2UoKnBzZSk7CisJc2VfZGVwdGggPSAoKnNlKS0+ZGVwdGg7CisJcHNlX2RlcHRoID0gKCpwc2UpLT5kZXB0aDsKIAogCXdoaWxlIChzZV9kZXB0aCA+IHBzZV9kZXB0aCkgewogCQlzZV9kZXB0aC0tOwpAQCAtNDI2LDEyICs0MTUsNiBAQAogI2RlZmluZSBmb3JfZWFjaF9sZWFmX2Nmc19ycShycSwgY2ZzX3JxKSBcCiAJCWZvciAoY2ZzX3JxID0gJnJxLT5jZnM7IGNmc19ycTsgY2ZzX3JxID0gTlVMTCkKIAotc3RhdGljIGlubGluZSBpbnQKLWlzX3NhbWVfZ3JvdXAoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnBzZSkKLXsKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwYXJlbnRfZW50aXR5KHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewogCXJldHVybiBOVUxMOwpAQCAtODE5LDE0ICs4MDIsNiBAQAogLyogU2NhbiBAc2Nhbl9zaXplIE1CIGV2ZXJ5IEBzY2FuX3BlcmlvZCBhZnRlciBhbiBpbml0aWFsIEBzY2FuX2RlbGF5IGluIG1zICovCiB1bnNpZ25lZCBpbnQgc3lzY3RsX251bWFfYmFsYW5jaW5nX3NjYW5fZGVsYXkgPSAxMDAwOwogCi0vKgotICogQWZ0ZXIgc2tpcHBpbmcgYSBwYWdlIG1pZ3JhdGlvbiBvbiBhIHNoYXJlZCBwYWdlLCBza2lwIE4gbW9yZSBudW1hIHBhZ2UKLSAqIG1pZ3JhdGlvbnMgdW5jb25kaXRpb25hbGx5LiBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBOVU1BIG1pZ3JhdGlvbnMKLSAqIGluIHNoYXJlZCBtZW1vcnkgd29ya2xvYWRzLCBhbmQgaGFzIHRoZSBlZmZlY3Qgb2YgcHVsbGluZyB0YXNrcyB0b3dhcmRzCi0gKiB3aGVyZSB0aGVpciBtZW1vcnkgbGl2ZXMsIG92ZXIgcHVsbGluZyB0aGUgbWVtb3J5IHRvd2FyZHMgdGhlIHRhc2suCi0gKi8KLXVuc2lnbmVkIGludCBzeXNjdGxfbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCA9IDE2OwotCiBzdGF0aWMgdW5zaWduZWQgaW50IHRhc2tfbnJfc2Nhbl93aW5kb3dzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIHJzcyA9IDA7CkBAIC04OTMsMTAgKzg2OCwyNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdGFza19saXN0OwogCiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwlub2RlbWFza190IGFjdGl2ZV9ub2RlczsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX2ZhdWx0czsKKwkvKgorCSAqIEZhdWx0c19jcHUgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciBtZW1vcnkgc2hvdWxkIG1vdmUKKwkgKiB0b3dhcmRzIHRoZSBDUFUuIEFzIGEgY29uc2VxdWVuY2UsIHRoZXNlIHN0YXRzIGFyZSB3ZWlnaHRlZAorCSAqIG1vcmUgYnkgQ1BVIHVzZSB0aGFuIGJ5IG1lbW9yeSBmYXVsdHMuCisJICovCisJdW5zaWduZWQgbG9uZyAqZmF1bHRzX2NwdTsKIAl1bnNpZ25lZCBsb25nIGZhdWx0c1swXTsKIH07CiAKKy8qIFNoYXJlZCBvciBwcml2YXRlIGZhdWx0cy4gKi8KKyNkZWZpbmUgTlJfTlVNQV9ISU5UX0ZBVUxUX1RZUEVTIDIKKworLyogTWVtb3J5IGFuZCBDUFUgbG9jYWxpdHkgKi8KKyNkZWZpbmUgTlJfTlVNQV9ISU5UX0ZBVUxUX1NUQVRTIChOUl9OVU1BX0hJTlRfRkFVTFRfVFlQRVMgKiAyKQorCisvKiBBdmVyYWdlZCBzdGF0aXN0aWNzLCBhbmQgdGVtcG9yYXJ5IGJ1ZmZlcnMuICovCisjZGVmaW5lIE5SX05VTUFfSElOVF9GQVVMVF9CVUNLRVRTIChOUl9OVU1BX0hJTlRfRkFVTFRfU1RBVFMgKiAyKQorCiBwaWRfdCB0YXNrX251bWFfZ3JvdXBfaWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXJldHVybiBwLT5udW1hX2dyb3VwID8gcC0+bnVtYV9ncm91cC0+Z2lkIDogMDsKQEAgLTkwNCwxNiArODk1LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfZmF1bHRzX2lkeChpbnQgbmlkLCBpbnQgcHJpdikKIHsKLQlyZXR1cm4gMiAqIG5pZCArIHByaXY7CisJcmV0dXJuIE5SX05VTUFfSElOVF9GQVVMVF9UWVBFUyAqIG5pZCArIHByaXY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0YXNrX2ZhdWx0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBuaWQpCiB7Ci0JaWYgKCFwLT5udW1hX2ZhdWx0cykKKwlpZiAoIXAtPm51bWFfZmF1bHRzX21lbW9yeSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcC0+bnVtYV9mYXVsdHNbdGFza19mYXVsdHNfaWR4KG5pZCwgMCldICsKLQkJcC0+bnVtYV9mYXVsdHNbdGFza19mYXVsdHNfaWR4KG5pZCwgMSldOworCXJldHVybiBwLT5udW1hX2ZhdWx0c19tZW1vcnlbdGFza19mYXVsdHNfaWR4KG5pZCwgMCldICsKKwkJcC0+bnVtYV9mYXVsdHNfbWVtb3J5W3Rhc2tfZmF1bHRzX2lkeChuaWQsIDEpXTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdyb3VwX2ZhdWx0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBuaWQpCkBAIC05MjUsNiArOTE2LDEyIEBACiAJCXAtPm51bWFfZ3JvdXAtPmZhdWx0c1t0YXNrX2ZhdWx0c19pZHgobmlkLCAxKV07CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBncm91cF9mYXVsdHNfY3B1KHN0cnVjdCBudW1hX2dyb3VwICpncm91cCwgaW50IG5pZCkKK3sKKwlyZXR1cm4gZ3JvdXAtPmZhdWx0c19jcHVbdGFza19mYXVsdHNfaWR4KG5pZCwgMCldICsKKwkJZ3JvdXAtPmZhdWx0c19jcHVbdGFza19mYXVsdHNfaWR4KG5pZCwgMSldOworfQorCiAvKgogICogVGhlc2UgcmV0dXJuIHRoZSBmcmFjdGlvbiBvZiBhY2Nlc3NlcyBkb25lIGJ5IGEgcGFydGljdWxhciB0YXNrLCBvcgogICogdGFzayBncm91cCwgb24gYSBwYXJ0aWN1bGFyIG51bWEgbm9kZS4gIFRoZSBncm91cCB3ZWlnaHQgaXMgZ2l2ZW4gYQpAQCAtOTM1LDcgKzkzMiw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9mYXVsdHM7CiAKLQlpZiAoIXAtPm51bWFfZmF1bHRzKQorCWlmICghcC0+bnVtYV9mYXVsdHNfbWVtb3J5KQogCQlyZXR1cm4gMDsKIAogCXRvdGFsX2ZhdWx0cyA9IHAtPnRvdGFsX251bWFfZmF1bHRzOwpAQCAtOTU0LDYgKzk1MSw2OSBAQAogCXJldHVybiAxMDAwICogZ3JvdXBfZmF1bHRzKHAsIG5pZCkgLyBwLT5udW1hX2dyb3VwLT50b3RhbF9mYXVsdHM7CiB9CiAKK2Jvb2wgc2hvdWxkX251bWFfbWlncmF0ZV9tZW1vcnkoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcGFnZSAqIHBhZ2UsCisJCQkJaW50IHNyY19uaWQsIGludCBkc3RfY3B1KQoreworCXN0cnVjdCBudW1hX2dyb3VwICpuZyA9IHAtPm51bWFfZ3JvdXA7CisJaW50IGRzdF9uaWQgPSBjcHVfdG9fbm9kZShkc3RfY3B1KTsKKwlpbnQgbGFzdF9jcHVwaWQsIHRoaXNfY3B1cGlkOworCisJdGhpc19jcHVwaWQgPSBjcHVfcGlkX3RvX2NwdXBpZChkc3RfY3B1LCBjdXJyZW50LT5waWQpOworCisJLyoKKwkgKiBNdWx0aS1zdGFnZSBub2RlIHNlbGVjdGlvbiBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBwZXJpb2RpYworCSAqIG1pZ3JhdGlvbiBmYXVsdCB0byBidWlsZCBhIHRlbXBvcmFsIHRhc2s8LT5wYWdlIHJlbGF0aW9uLiBCeSB1c2luZworCSAqIGEgdHdvLXN0YWdlIGZpbHRlciB3ZSByZW1vdmUgc2hvcnQvdW5saWtlbHkgcmVsYXRpb25zLgorCSAqCisJICogVXNpbmcgUChwKSB+IG5fcCAvIG5fdCBhcyBwZXIgZnJlcXVlbnRpc3QgcHJvYmFiaWxpdHksIHdlIGNhbiBlcXVhdGUKKwkgKiBhIHRhc2sncyB1c2FnZSBvZiBhIHBhcnRpY3VsYXIgcGFnZSAobl9wKSBwZXIgdG90YWwgdXNhZ2Ugb2YgdGhpcworCSAqIHBhZ2UgKG5fdCkgKGluIGEgZ2l2ZW4gdGltZS1zcGFuKSB0byBhIHByb2JhYmlsaXR5LgorCSAqCisJICogT3VyIHBlcmlvZGljIGZhdWx0cyB3aWxsIHNhbXBsZSB0aGlzIHByb2JhYmlsaXR5IGFuZCBnZXR0aW5nIHRoZQorCSAqIHNhbWUgcmVzdWx0IHR3aWNlIGluIGEgcm93LCBnaXZlbiB0aGVzZSBzYW1wbGVzIGFyZSBmdWxseQorCSAqIGluZGVwZW5kZW50LCBpcyB0aGVuIGdpdmVuIGJ5IFAobileMiwgcHJvdmlkZWQgb3VyIHNhbXBsZSBwZXJpb2QKKwkgKiBpcyBzdWZmaWNpZW50bHkgc2hvcnQgY29tcGFyZWQgdG8gdGhlIHVzYWdlIHBhdHRlcm4uCisJICoKKwkgKiBUaGlzIHF1YWRyaWMgc3F1aXNoZXMgc21hbGwgcHJvYmFiaWxpdGllcywgbWFraW5nIGl0IGxlc3MgbGlrZWx5IHdlCisJICogYWN0IG9uIGFuIHVubGlrZWx5IHRhc2s8LT5wYWdlIHJlbGF0aW9uLgorCSAqLworCWxhc3RfY3B1cGlkID0gcGFnZV9jcHVwaWRfeGNoZ19sYXN0KHBhZ2UsIHRoaXNfY3B1cGlkKTsKKwlpZiAoIWNwdXBpZF9waWRfdW5zZXQobGFzdF9jcHVwaWQpICYmCisJCQkJY3B1cGlkX3RvX25pZChsYXN0X2NwdXBpZCkgIT0gZHN0X25pZCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogQWx3YXlzIGFsbG93IG1pZ3JhdGUgb24gcHJpdmF0ZSBmYXVsdHMgKi8KKwlpZiAoY3B1cGlkX21hdGNoX3BpZChwLCBsYXN0X2NwdXBpZCkpCisJCXJldHVybiB0cnVlOworCisJLyogQSBzaGFyZWQgZmF1bHQsIGJ1dCBwLT5udW1hX2dyb3VwIGhhcyBub3QgYmVlbiBzZXQgdXAgeWV0LiAqLworCWlmICghbmcpCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBEbyBub3QgbWlncmF0ZSBpZiB0aGUgZGVzdGluYXRpb24gaXMgbm90IGEgbm9kZSB0aGF0CisJICogaXMgYWN0aXZlbHkgdXNlZCBieSB0aGlzIG51bWEgZ3JvdXAuCisJICovCisJaWYgKCFub2RlX2lzc2V0KGRzdF9uaWQsIG5nLT5hY3RpdmVfbm9kZXMpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFNvdXJjZSBpcyBhIG5vZGUgdGhhdCBpcyBub3QgYWN0aXZlbHkgdXNlZCBieSB0aGlzCisJICogbnVtYSBncm91cCwgd2hpbGUgdGhlIGRlc3RpbmF0aW9uIGlzLiBNaWdyYXRlLgorCSAqLworCWlmICghbm9kZV9pc3NldChzcmNfbmlkLCBuZy0+YWN0aXZlX25vZGVzKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKgorCSAqIEJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgbm9kZXMgaW4gYWN0aXZlCisJICogdXNlIGJ5IHRoaXMgbnVtYSBncm91cC4gTWF4aW1pemUgbWVtb3J5IGJhbmR3aWR0aAorCSAqIGJ5IG1pZ3JhdGluZyBmcm9tIG1vcmUgaGVhdmlseSB1c2VkIGdyb3VwcywgdG8gbGVzcworCSAqIGhlYXZpbHkgdXNlZCBvbmVzLCBzcHJlYWRpbmcgdGhlIGxvYWQgYXJvdW5kLgorCSAqIFVzZSBhIDEvNCBoeXN0ZXJlc2lzIHRvIGF2b2lkIHNwdXJpb3VzIHBhZ2UgbW92ZW1lbnQuCisJICovCisJcmV0dXJuIGdyb3VwX2ZhdWx0cyhwLCBkc3RfbmlkKSA8IChncm91cF9mYXVsdHMocCwgc3JjX25pZCkgKiAzIC8gNCk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHdlaWdodGVkX2NwdWxvYWQoY29uc3QgaW50IGNwdSk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzb3VyY2VfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0YXJnZXRfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSk7CkBAIC0xMjY3LDcgKzEzMjcsNyBAQAogc3RhdGljIHZvaWQgbnVtYV9taWdyYXRlX3ByZWZlcnJlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJLyogVGhpcyB0YXNrIGhhcyBubyBOVU1BIGZhdWx0IHN0YXRpc3RpY3MgeWV0ICovCi0JaWYgKHVubGlrZWx5KHAtPm51bWFfcHJlZmVycmVkX25pZCA9PSAtMSB8fCAhcC0+bnVtYV9mYXVsdHMpKQorCWlmICh1bmxpa2VseShwLT5udW1hX3ByZWZlcnJlZF9uaWQgPT0gLTEgfHwgIXAtPm51bWFfZmF1bHRzX21lbW9yeSkpCiAJCXJldHVybjsKIAogCS8qIFBlcmlvZGljYWxseSByZXRyeSBtaWdyYXRpbmcgdGhlIHRhc2sgdG8gdGhlIHByZWZlcnJlZCBub2RlICovCkBAIC0xMjgyLDYgKzEzNDIsMzggQEAKIH0KIAogLyoKKyAqIEZpbmQgdGhlIG5vZGVzIG9uIHdoaWNoIHRoZSB3b3JrbG9hZCBpcyBhY3RpdmVseSBydW5uaW5nLiBXZSBkbyB0aGlzIGJ5CisgKiB0cmFja2luZyB0aGUgbm9kZXMgZnJvbSB3aGljaCBOVU1BIGhpbnRpbmcgZmF1bHRzIGFyZSB0cmlnZ2VyZWQuIFRoaXMgY2FuCisgKiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgc2V0IG9mIG5vZGVzIHdoZXJlIHRoZSB3b3JrbG9hZCdzIG1lbW9yeSBpcyBjdXJyZW50bHkKKyAqIGxvY2F0ZWQuCisgKgorICogVGhlIGJpdG1hc2sgaXMgdXNlZCB0byBtYWtlIHNtYXJ0ZXIgZGVjaXNpb25zIG9uIHdoZW4gdG8gZG8gTlVNQSBwYWdlCisgKiBtaWdyYXRpb25zLCBUbyBwcmV2ZW50IGZsaXAtZmxvcHBpbmcsIGFuZCBleGNlc3NpdmUgcGFnZSBtaWdyYXRpb25zLCBub2RlcworICogYXJlIGFkZGVkIHdoZW4gdGhleSBjYXVzZSBvdmVyIDYvMTYgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZhdWx0cywgYnV0CisgKiBvbmx5IHJlbW92ZWQgd2hlbiB0aGV5IGRyb3AgYmVsb3cgMy8xNi4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX251bWFfYWN0aXZlX25vZGVfbWFzayhzdHJ1Y3QgbnVtYV9ncm91cCAqbnVtYV9ncm91cCkKK3sKKwl1bnNpZ25lZCBsb25nIGZhdWx0cywgbWF4X2ZhdWx0cyA9IDA7CisJaW50IG5pZDsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlmYXVsdHMgPSBncm91cF9mYXVsdHNfY3B1KG51bWFfZ3JvdXAsIG5pZCk7CisJCWlmIChmYXVsdHMgPiBtYXhfZmF1bHRzKQorCQkJbWF4X2ZhdWx0cyA9IGZhdWx0czsKKwl9CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJZmF1bHRzID0gZ3JvdXBfZmF1bHRzX2NwdShudW1hX2dyb3VwLCBuaWQpOworCQlpZiAoIW5vZGVfaXNzZXQobmlkLCBudW1hX2dyb3VwLT5hY3RpdmVfbm9kZXMpKSB7CisJCQlpZiAoZmF1bHRzID4gbWF4X2ZhdWx0cyAqIDYgLyAxNikKKwkJCQlub2RlX3NldChuaWQsIG51bWFfZ3JvdXAtPmFjdGl2ZV9ub2Rlcyk7CisJCX0gZWxzZSBpZiAoZmF1bHRzIDwgbWF4X2ZhdWx0cyAqIDMgLyAxNikKKwkJCW5vZGVfY2xlYXIobmlkLCBudW1hX2dyb3VwLT5hY3RpdmVfbm9kZXMpOworCX0KK30KKworLyoKICAqIFdoZW4gYWRhcHRpbmcgdGhlIHNjYW4gcmF0ZSwgdGhlIHBlcmlvZCBpcyBkaXZpZGVkIGludG8gTlVNQV9QRVJJT0RfU0xPVFMKICAqIGluY3JlbWVudHMuIFRoZSBtb3JlIGxvY2FsIHRoZSBmYXVsdCBzdGF0aXN0aWNzIGFyZSwgdGhlIGhpZ2hlciB0aGUgc2NhbgogICogcGVyaW9kIHdpbGwgYmUgZm9yIHRoZSBuZXh0IHNjYW4gd2luZG93LiBJZiBsb2NhbC9yZW1vdGUgcmF0aW8gaXMgYmVsb3cKQEAgLTEzNTUsMTEgKzE0NDcsNDEgQEAKIAltZW1zZXQocC0+bnVtYV9mYXVsdHNfbG9jYWxpdHksIDAsIHNpemVvZihwLT5udW1hX2ZhdWx0c19sb2NhbGl0eSkpOwogfQogCisvKgorICogR2V0IHRoZSBmcmFjdGlvbiBvZiB0aW1lIHRoZSB0YXNrIGhhcyBiZWVuIHJ1bm5pbmcgc2luY2UgdGhlIGxhc3QKKyAqIE5VTUEgcGxhY2VtZW50IGN5Y2xlLiBUaGUgc2NoZWR1bGVyIGtlZXBzIHNpbWlsYXIgc3RhdGlzdGljcywgYnV0CisgKiBkZWNheXMgdGhvc2Ugb24gYSAzMm1zIHBlcmlvZCwgd2hpY2ggaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSBvZmYKKyAqIGZyb20gdGhlIGRvemVucy1vZi1zZWNvbmRzIE5VTUEgYmFsYW5jaW5nIHBlcmlvZC4gVXNlIHRoZSBzY2hlZHVsZXIKKyAqIHN0YXRzIG9ubHkgaWYgdGhlIHRhc2sgaXMgc28gbmV3IHRoZXJlIGFyZSBubyBOVU1BIHN0YXRpc3RpY3MgeWV0LgorICovCitzdGF0aWMgdTY0IG51bWFfZ2V0X2F2Z19ydW50aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTY0ICpwZXJpb2QpCit7CisJdTY0IHJ1bnRpbWUsIGRlbHRhLCBub3c7CisJLyogVXNlIHRoZSBzdGFydCBvZiB0aGlzIHRpbWUgc2xpY2UgdG8gYXZvaWQgY2FsY3VsYXRpb25zLiAqLworCW5vdyA9IHAtPnNlLmV4ZWNfc3RhcnQ7CisJcnVudGltZSA9IHAtPnNlLnN1bV9leGVjX3J1bnRpbWU7CisKKwlpZiAocC0+bGFzdF90YXNrX251bWFfcGxhY2VtZW50KSB7CisJCWRlbHRhID0gcnVudGltZSAtIHAtPmxhc3Rfc3VtX2V4ZWNfcnVudGltZTsKKwkJKnBlcmlvZCA9IG5vdyAtIHAtPmxhc3RfdGFza19udW1hX3BsYWNlbWVudDsKKwl9IGVsc2UgeworCQlkZWx0YSA9IHAtPnNlLmF2Zy5ydW5uYWJsZV9hdmdfc3VtOworCQkqcGVyaW9kID0gcC0+c2UuYXZnLnJ1bm5hYmxlX2F2Z19wZXJpb2Q7CisJfQorCisJcC0+bGFzdF9zdW1fZXhlY19ydW50aW1lID0gcnVudGltZTsKKwlwLT5sYXN0X3Rhc2tfbnVtYV9wbGFjZW1lbnQgPSBub3c7CisKKwlyZXR1cm4gZGVsdGE7Cit9CisKIHN0YXRpYyB2b2lkIHRhc2tfbnVtYV9wbGFjZW1lbnQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWludCBzZXEsIG5pZCwgbWF4X25pZCA9IC0xLCBtYXhfZ3JvdXBfbmlkID0gLTE7CiAJdW5zaWduZWQgbG9uZyBtYXhfZmF1bHRzID0gMCwgbWF4X2dyb3VwX2ZhdWx0cyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmYXVsdF90eXBlc1syXSA9IHsgMCwgMCB9OworCXVuc2lnbmVkIGxvbmcgdG90YWxfZmF1bHRzOworCXU2NCBydW50aW1lLCBwZXJpb2Q7CiAJc3BpbmxvY2tfdCAqZ3JvdXBfbG9jayA9IE5VTEw7CiAKIAlzZXEgPSBBQ0NFU1NfT05DRShwLT5tbS0+bnVtYV9zY2FuX3NlcSk7CkBAIC0xMzY4LDYgKzE0OTAsMTAgQEAKIAlwLT5udW1hX3NjYW5fc2VxID0gc2VxOwogCXAtPm51bWFfc2Nhbl9wZXJpb2RfbWF4ID0gdGFza19zY2FuX21heChwKTsKIAorCXRvdGFsX2ZhdWx0cyA9IHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5WzBdICsKKwkJICAgICAgIHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5WzFdOworCXJ1bnRpbWUgPSBudW1hX2dldF9hdmdfcnVudGltZShwLCAmcGVyaW9kKTsKKwogCS8qIElmIHRoZSB0YXNrIGlzIHBhcnQgb2YgYSBncm91cCBwcmV2ZW50IHBhcmFsbGVsIHVwZGF0ZXMgdG8gZ3JvdXAgc3RhdHMgKi8KIAlpZiAocC0+bnVtYV9ncm91cCkgewogCQlncm91cF9sb2NrID0gJnAtPm51bWFfZ3JvdXAtPmxvY2s7CkBAIC0xMzc5LDI0ICsxNTA1LDM3IEBACiAJCXVuc2lnbmVkIGxvbmcgZmF1bHRzID0gMCwgZ3JvdXBfZmF1bHRzID0gMDsKIAkJaW50IHByaXYsIGk7CiAKLQkJZm9yIChwcml2ID0gMDsgcHJpdiA8IDI7IHByaXYrKykgewotCQkJbG9uZyBkaWZmOworCQlmb3IgKHByaXYgPSAwOyBwcml2IDwgTlJfTlVNQV9ISU5UX0ZBVUxUX1RZUEVTOyBwcml2KyspIHsKKwkJCWxvbmcgZGlmZiwgZl9kaWZmLCBmX3dlaWdodDsKIAogCQkJaSA9IHRhc2tfZmF1bHRzX2lkeChuaWQsIHByaXYpOwotCQkJZGlmZiA9IC1wLT5udW1hX2ZhdWx0c1tpXTsKIAogCQkJLyogRGVjYXkgZXhpc3Rpbmcgd2luZG93LCBjb3B5IGZhdWx0cyBzaW5jZSBsYXN0IHNjYW4gKi8KLQkJCXAtPm51bWFfZmF1bHRzW2ldID4+PSAxOwotCQkJcC0+bnVtYV9mYXVsdHNbaV0gKz0gcC0+bnVtYV9mYXVsdHNfYnVmZmVyW2ldOwotCQkJZmF1bHRfdHlwZXNbcHJpdl0gKz0gcC0+bnVtYV9mYXVsdHNfYnVmZmVyW2ldOwotCQkJcC0+bnVtYV9mYXVsdHNfYnVmZmVyW2ldID0gMDsKKwkJCWRpZmYgPSBwLT5udW1hX2ZhdWx0c19idWZmZXJfbWVtb3J5W2ldIC0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5W2ldIC8gMjsKKwkJCWZhdWx0X3R5cGVzW3ByaXZdICs9IHAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnlbaV07CisJCQlwLT5udW1hX2ZhdWx0c19idWZmZXJfbWVtb3J5W2ldID0gMDsKIAotCQkJZmF1bHRzICs9IHAtPm51bWFfZmF1bHRzW2ldOwotCQkJZGlmZiArPSBwLT5udW1hX2ZhdWx0c1tpXTsKKwkJCS8qCisJCQkgKiBOb3JtYWxpemUgdGhlIGZhdWx0c19mcm9tLCBzbyBhbGwgdGFza3MgaW4gYSBncm91cAorCQkJICogY291bnQgYWNjb3JkaW5nIHRvIENQVSB1c2UsIGluc3RlYWQgb2YgYnkgdGhlIHJhdworCQkJICogbnVtYmVyIG9mIGZhdWx0cy4gVGFza3Mgd2l0aCBsaXR0bGUgcnVudGltZSBoYXZlCisJCQkgKiBsaXR0bGUgb3Zlci1hbGwgaW1wYWN0IG9uIHRocm91Z2hwdXQsIGFuZCB0aHVzIHRoZWlyCisJCQkgKiBmYXVsdHMgYXJlIGxlc3MgaW1wb3J0YW50LgorCQkJICovCisJCQlmX3dlaWdodCA9IGRpdjY0X3U2NChydW50aW1lIDw8IDE2LCBwZXJpb2QgKyAxKTsKKwkJCWZfd2VpZ2h0ID0gKGZfd2VpZ2h0ICogcC0+bnVtYV9mYXVsdHNfYnVmZmVyX2NwdVtpXSkgLworCQkJCSAgICh0b3RhbF9mYXVsdHMgKyAxKTsKKwkJCWZfZGlmZiA9IGZfd2VpZ2h0IC0gcC0+bnVtYV9mYXVsdHNfY3B1W2ldIC8gMjsKKwkJCXAtPm51bWFfZmF1bHRzX2J1ZmZlcl9jcHVbaV0gPSAwOworCisJCQlwLT5udW1hX2ZhdWx0c19tZW1vcnlbaV0gKz0gZGlmZjsKKwkJCXAtPm51bWFfZmF1bHRzX2NwdVtpXSArPSBmX2RpZmY7CisJCQlmYXVsdHMgKz0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5W2ldOwogCQkJcC0+dG90YWxfbnVtYV9mYXVsdHMgKz0gZGlmZjsKIAkJCWlmIChwLT5udW1hX2dyb3VwKSB7CiAJCQkJLyogc2FmZSBiZWNhdXNlIHdlIGNhbiBvbmx5IGNoYW5nZSBvdXIgb3duIGdyb3VwICovCiAJCQkJcC0+bnVtYV9ncm91cC0+ZmF1bHRzW2ldICs9IGRpZmY7CisJCQkJcC0+bnVtYV9ncm91cC0+ZmF1bHRzX2NwdVtpXSArPSBmX2RpZmY7CiAJCQkJcC0+bnVtYV9ncm91cC0+dG90YWxfZmF1bHRzICs9IGRpZmY7CiAJCQkJZ3JvdXBfZmF1bHRzICs9IHAtPm51bWFfZ3JvdXAtPmZhdWx0c1tpXTsKIAkJCX0KQEAgLTE0MTYsNiArMTU1NSw3IEBACiAJdXBkYXRlX3Rhc2tfc2Nhbl9wZXJpb2QocCwgZmF1bHRfdHlwZXNbMF0sIGZhdWx0X3R5cGVzWzFdKTsKIAogCWlmIChwLT5udW1hX2dyb3VwKSB7CisJCXVwZGF0ZV9udW1hX2FjdGl2ZV9ub2RlX21hc2socC0+bnVtYV9ncm91cCk7CiAJCS8qCiAJCSAqIElmIHRoZSBwcmVmZXJyZWQgdGFzayBhbmQgZ3JvdXAgbmlkcyBhcmUgZGlmZmVyZW50LAogCQkgKiBpdGVyYXRlIG92ZXIgdGhlIG5vZGVzIGFnYWluIHRvIGZpbmQgdGhlIGJlc3QgcGxhY2UuCkBAIC0xNDY1LDcgKzE2MDUsNyBAQAogCiAJaWYgKHVubGlrZWx5KCFwLT5udW1hX2dyb3VwKSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnVtYV9ncm91cCkgKwotCQkJCSAgICAyKm5yX25vZGVfaWRzKnNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCQkgICAgNCpucl9ub2RlX2lkcypzaXplb2YodW5zaWduZWQgbG9uZyk7CiAKIAkJZ3JwID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKIAkJaWYgKCFncnApCkBAIC0xNDc1LDkgKzE2MTUsMTQgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJmdycC0+bG9jayk7CiAJCUlOSVRfTElTVF9IRUFEKCZncnAtPnRhc2tfbGlzdCk7CiAJCWdycC0+Z2lkID0gcC0+cGlkOworCQkvKiBTZWNvbmQgaGFsZiBvZiB0aGUgYXJyYXkgdHJhY2tzIG5pZHMgd2hlcmUgZmF1bHRzIGhhcHBlbiAqLworCQlncnAtPmZhdWx0c19jcHUgPSBncnAtPmZhdWx0cyArIE5SX05VTUFfSElOVF9GQVVMVF9UWVBFUyAqCisJCQkJCQlucl9ub2RlX2lkczsKIAotCQlmb3IgKGkgPSAwOyBpIDwgMipucl9ub2RlX2lkczsgaSsrKQotCQkJZ3JwLT5mYXVsdHNbaV0gPSBwLT5udW1hX2ZhdWx0c1tpXTsKKwkJbm9kZV9zZXQodGFza19ub2RlKGN1cnJlbnQpLCBncnAtPmFjdGl2ZV9ub2Rlcyk7CisKKwkJZm9yIChpID0gMDsgaSA8IE5SX05VTUFfSElOVF9GQVVMVF9TVEFUUyAqIG5yX25vZGVfaWRzOyBpKyspCisJCQlncnAtPmZhdWx0c1tpXSA9IHAtPm51bWFfZmF1bHRzX21lbW9yeVtpXTsKIAogCQlncnAtPnRvdGFsX2ZhdWx0cyA9IHAtPnRvdGFsX251bWFfZmF1bHRzOwogCkBAIC0xNTM0LDkgKzE2NzksOSBAQAogCiAJZG91YmxlX2xvY2soJm15X2dycC0+bG9jaywgJmdycC0+bG9jayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMipucl9ub2RlX2lkczsgaSsrKSB7Ci0JCW15X2dycC0+ZmF1bHRzW2ldIC09IHAtPm51bWFfZmF1bHRzW2ldOwotCQlncnAtPmZhdWx0c1tpXSArPSBwLT5udW1hX2ZhdWx0c1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTlVNQV9ISU5UX0ZBVUxUX1NUQVRTICogbnJfbm9kZV9pZHM7IGkrKykgeworCQlteV9ncnAtPmZhdWx0c1tpXSAtPSBwLT5udW1hX2ZhdWx0c19tZW1vcnlbaV07CisJCWdycC0+ZmF1bHRzW2ldICs9IHAtPm51bWFfZmF1bHRzX21lbW9yeVtpXTsKIAl9CiAJbXlfZ3JwLT50b3RhbF9mYXVsdHMgLT0gcC0+dG90YWxfbnVtYV9mYXVsdHM7CiAJZ3JwLT50b3RhbF9mYXVsdHMgKz0gcC0+dG90YWxfbnVtYV9mYXVsdHM7CkBAIC0xNTYyLDEyICsxNzA3LDEyIEBACiB7CiAJc3RydWN0IG51bWFfZ3JvdXAgKmdycCA9IHAtPm51bWFfZ3JvdXA7CiAJaW50IGk7Ci0Jdm9pZCAqbnVtYV9mYXVsdHMgPSBwLT5udW1hX2ZhdWx0czsKKwl2b2lkICpudW1hX2ZhdWx0cyA9IHAtPm51bWFfZmF1bHRzX21lbW9yeTsKIAogCWlmIChncnApIHsKIAkJc3Bpbl9sb2NrKCZncnAtPmxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgMipucl9ub2RlX2lkczsgaSsrKQotCQkJZ3JwLT5mYXVsdHNbaV0gLT0gcC0+bnVtYV9mYXVsdHNbaV07CisJCWZvciAoaSA9IDA7IGkgPCBOUl9OVU1BX0hJTlRfRkFVTFRfU1RBVFMgKiBucl9ub2RlX2lkczsgaSsrKQorCQkJZ3JwLT5mYXVsdHNbaV0gLT0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5W2ldOwogCQlncnAtPnRvdGFsX2ZhdWx0cyAtPSBwLT50b3RhbF9udW1hX2ZhdWx0czsKIAogCQlsaXN0X2RlbCgmcC0+bnVtYV9lbnRyeSk7CkBAIC0xNTc3LDE4ICsxNzIyLDIxIEBACiAJCXB1dF9udW1hX2dyb3VwKGdycCk7CiAJfQogCi0JcC0+bnVtYV9mYXVsdHMgPSBOVUxMOwotCXAtPm51bWFfZmF1bHRzX2J1ZmZlciA9IE5VTEw7CisJcC0+bnVtYV9mYXVsdHNfbWVtb3J5ID0gTlVMTDsKKwlwLT5udW1hX2ZhdWx0c19idWZmZXJfbWVtb3J5ID0gTlVMTDsKKwlwLT5udW1hX2ZhdWx0c19jcHU9IE5VTEw7CisJcC0+bnVtYV9mYXVsdHNfYnVmZmVyX2NwdSA9IE5VTEw7CiAJa2ZyZWUobnVtYV9mYXVsdHMpOwogfQogCiAvKgogICogR290IGEgUFJPVF9OT05FIGZhdWx0IGZvciBhIHBhZ2Ugb24gQG5vZGUuCiAgKi8KLXZvaWQgdGFza19udW1hX2ZhdWx0KGludCBsYXN0X2NwdXBpZCwgaW50IG5vZGUsIGludCBwYWdlcywgaW50IGZsYWdzKQordm9pZCB0YXNrX251bWFfZmF1bHQoaW50IGxhc3RfY3B1cGlkLCBpbnQgbWVtX25vZGUsIGludCBwYWdlcywgaW50IGZsYWdzKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAJYm9vbCBtaWdyYXRlZCA9IGZsYWdzICYgVE5GX01JR1JBVEVEOworCWludCBjcHVfbm9kZSA9IHRhc2tfbm9kZShjdXJyZW50KTsKIAlpbnQgcHJpdjsKIAogCWlmICghbnVtYWJhbGFuY2luZ19lbmFibGVkKQpAQCAtMTYwMywxNiArMTc1MSwyNCBAQAogCQlyZXR1cm47CiAKIAkvKiBBbGxvY2F0ZSBidWZmZXIgdG8gdHJhY2sgZmF1bHRzIG9uIGEgcGVyLW5vZGUgYmFzaXMgKi8KLQlpZiAodW5saWtlbHkoIXAtPm51bWFfZmF1bHRzKSkgewotCQlpbnQgc2l6ZSA9IHNpemVvZigqcC0+bnVtYV9mYXVsdHMpICogMiAqIG5yX25vZGVfaWRzOworCWlmICh1bmxpa2VseSghcC0+bnVtYV9mYXVsdHNfbWVtb3J5KSkgeworCQlpbnQgc2l6ZSA9IHNpemVvZigqcC0+bnVtYV9mYXVsdHNfbWVtb3J5KSAqCisJCQkgICBOUl9OVU1BX0hJTlRfRkFVTFRfQlVDS0VUUyAqIG5yX25vZGVfaWRzOwogCi0JCS8qIG51bWFfZmF1bHRzIGFuZCBudW1hX2ZhdWx0c19idWZmZXIgc2hhcmUgdGhlIGFsbG9jYXRpb24gKi8KLQkJcC0+bnVtYV9mYXVsdHMgPSBremFsbG9jKHNpemUgKiAyLCBHRlBfS0VSTkVMfF9fR0ZQX05PV0FSTik7Ci0JCWlmICghcC0+bnVtYV9mYXVsdHMpCisJCXAtPm51bWFfZmF1bHRzX21lbW9yeSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk4pOworCQlpZiAoIXAtPm51bWFfZmF1bHRzX21lbW9yeSkKIAkJCXJldHVybjsKIAotCQlCVUdfT04ocC0+bnVtYV9mYXVsdHNfYnVmZmVyKTsKLQkJcC0+bnVtYV9mYXVsdHNfYnVmZmVyID0gcC0+bnVtYV9mYXVsdHMgKyAoMiAqIG5yX25vZGVfaWRzKTsKKwkJQlVHX09OKHAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnkpOworCQkvKgorCQkgKiBUaGUgYXZlcmFnZWQgc3RhdGlzdGljcywgc2hhcmVkICYgcHJpdmF0ZSwgbWVtb3J5ICYgY3B1LAorCQkgKiBvY2N1cHkgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGFycmF5LiBUaGUgc2Vjb25kIGhhbGYgb2YgdGhlCisJCSAqIGFycmF5IGlzIGZvciBjdXJyZW50IGNvdW50ZXJzLCB3aGljaCBhcmUgYXZlcmFnZWQgaW50byB0aGUKKwkJICogZmlyc3Qgc2V0IGJ5IHRhc2tfbnVtYV9wbGFjZW1lbnQuCisJCSAqLworCQlwLT5udW1hX2ZhdWx0c19jcHUgPSBwLT5udW1hX2ZhdWx0c19tZW1vcnkgKyAoMiAqIG5yX25vZGVfaWRzKTsKKwkJcC0+bnVtYV9mYXVsdHNfYnVmZmVyX21lbW9yeSA9IHAtPm51bWFfZmF1bHRzX21lbW9yeSArICg0ICogbnJfbm9kZV9pZHMpOworCQlwLT5udW1hX2ZhdWx0c19idWZmZXJfY3B1ID0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5ICsgKDYgKiBucl9ub2RlX2lkcyk7CiAJCXAtPnRvdGFsX251bWFfZmF1bHRzID0gMDsKIAkJbWVtc2V0KHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5LCAwLCBzaXplb2YocC0+bnVtYV9mYXVsdHNfbG9jYWxpdHkpKTsKIAl9CkBAIC0xNjQxLDcgKzE3OTcsOCBAQAogCWlmIChtaWdyYXRlZCkKIAkJcC0+bnVtYV9wYWdlc19taWdyYXRlZCArPSBwYWdlczsKIAotCXAtPm51bWFfZmF1bHRzX2J1ZmZlclt0YXNrX2ZhdWx0c19pZHgobm9kZSwgcHJpdildICs9IHBhZ2VzOworCXAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnlbdGFza19mYXVsdHNfaWR4KG1lbV9ub2RlLCBwcml2KV0gKz0gcGFnZXM7CisJcC0+bnVtYV9mYXVsdHNfYnVmZmVyX2NwdVt0YXNrX2ZhdWx0c19pZHgoY3B1X25vZGUsIHByaXYpXSArPSBwYWdlczsKIAlwLT5udW1hX2ZhdWx0c19sb2NhbGl0eVshIShmbGFncyAmIFRORl9GQVVMVF9MT0NBTCldICs9IHBhZ2VzOwogfQogCkBAIC0yMjE5LDEzICsyMzc2LDIwIEBACiAJCXNlLT5hdmcubG9hZF9hdmdfY29udHJpYiA+Pj0gTklDRV8wX1NISUZUOwogCX0KIH0KLSNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcnFfcnVubmFibGVfYXZnKHN0cnVjdCBycSAqcnEsIGludCBydW5uYWJsZSkKK3sKKwlfX3VwZGF0ZV9lbnRpdHlfcnVubmFibGVfYXZnKHJxX2Nsb2NrX3Rhc2socnEpLCAmcnEtPmF2ZywgcnVubmFibGUpOworCV9fdXBkYXRlX3RnX3J1bm5hYmxlX2F2ZygmcnEtPmF2ZywgJnJxLT5jZnMpOworfQorI2Vsc2UgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3VwZGF0ZV9jZnNfcnFfdGdfbG9hZF9jb250cmliKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwKIAkJCQkJCSBpbnQgZm9yY2VfdXBkYXRlKSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3RnX3J1bm5hYmxlX2F2ZyhzdHJ1Y3Qgc2NoZWRfYXZnICpzYSwKIAkJCQkJCSAgc3RydWN0IGNmc19ycSAqY2ZzX3JxKSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX2dyb3VwX2VudGl0eV9jb250cmliKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKSB7fQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3JxX3J1bm5hYmxlX2F2ZyhzdHJ1Y3QgcnEgKnJxLCBpbnQgcnVubmFibGUpIHt9CisjZW5kaWYgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Rhc2tfZW50aXR5X2NvbnRyaWIoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7CkBAIC0yMzIzLDEyICsyNDg3LDYgQEAKIAlfX3VwZGF0ZV9jZnNfcnFfdGdfbG9hZF9jb250cmliKGNmc19ycSwgZm9yY2VfdXBkYXRlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9ycV9ydW5uYWJsZV9hdmcoc3RydWN0IHJxICpycSwgaW50IHJ1bm5hYmxlKQotewotCV9fdXBkYXRlX2VudGl0eV9ydW5uYWJsZV9hdmcocnFfY2xvY2tfdGFzayhycSksICZycS0+YXZnLCBydW5uYWJsZSk7Ci0JX191cGRhdGVfdGdfcnVubmFibGVfYXZnKCZycS0+YXZnLCAmcnEtPmNmcyk7Ci19Ci0KIC8qIEFkZCB0aGUgbG9hZCBnZW5lcmF0ZWQgYnkgc2UgaW50byBjZnNfcnEncyBjaGlsZCBsb2FkLWF2ZXJhZ2UgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBlbnF1ZXVlX2VudGl0eV9sb2FkX2F2ZyhzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsCiAJCQkJCQkgIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLApAQCAtMjQxNiw3ICsyNTc0LDEwIEBACiAJdXBkYXRlX3JxX3J1bm5hYmxlX2F2Zyh0aGlzX3JxLCAwKTsKIH0KIAotI2Vsc2UKK3N0YXRpYyBpbnQgaWRsZV9iYWxhbmNlKHN0cnVjdCBycSAqdGhpc19ycSk7CisKKyNlbHNlIC8qIENPTkZJR19TTVAgKi8KKwogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9lbnRpdHlfbG9hZF9hdmcoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsCiAJCQkJCSAgaW50IHVwZGF0ZV9jZnNfcnEpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3JxX3J1bm5hYmxlX2F2ZyhzdHJ1Y3QgcnEgKnJxLCBpbnQgcnVubmFibGUpIHt9CkBAIC0yNDI4LDcgKzI1ODksMTMgQEAKIAkJCQkJICAgaW50IHNsZWVwKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9jZnNfcnFfYmxvY2tlZF9sb2FkKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwKIAkJCQkJICAgICAgaW50IGZvcmNlX3VwZGF0ZSkge30KLSNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBpZGxlX2JhbGFuY2Uoc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIHZvaWQgZW5xdWV1ZV9zbGVlcGVyKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7CkBAIC0yNTc4LDEwICsyNzQ1LDEwIEBACiB7CiAJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7CiAJCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7Ci0JCWlmIChjZnNfcnEtPmxhc3QgPT0gc2UpCi0JCQljZnNfcnEtPmxhc3QgPSBOVUxMOwotCQllbHNlCisJCWlmIChjZnNfcnEtPmxhc3QgIT0gc2UpCiAJCQlicmVhazsKKworCQljZnNfcnEtPmxhc3QgPSBOVUxMOwogCX0KIH0KIApAQCAtMjU4OSwxMCArMjc1NiwxMCBAQAogewogCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkgewogCQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwotCQlpZiAoY2ZzX3JxLT5uZXh0ID09IHNlKQotCQkJY2ZzX3JxLT5uZXh0ID0gTlVMTDsKLQkJZWxzZQorCQlpZiAoY2ZzX3JxLT5uZXh0ICE9IHNlKQogCQkJYnJlYWs7CisKKwkJY2ZzX3JxLT5uZXh0ID0gTlVMTDsKIAl9CiB9CiAKQEAgLTI2MDAsMTAgKzI3NjcsMTAgQEAKIHsKIAlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpIHsKIAkJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gY2ZzX3JxX29mKHNlKTsKLQkJaWYgKGNmc19ycS0+c2tpcCA9PSBzZSkKLQkJCWNmc19ycS0+c2tpcCA9IE5VTEw7Ci0JCWVsc2UKKwkJaWYgKGNmc19ycS0+c2tpcCAhPSBzZSkKIAkJCWJyZWFrOworCisJCWNmc19ycS0+c2tpcCA9IE5VTEw7CiAJfQogfQogCkBAIC0yNzQ2LDE3ICsyOTEzLDM2IEBACiAgKiAzKSBwaWNrIHRoZSAibGFzdCIgcHJvY2VzcywgZm9yIGNhY2hlIGxvY2FsaXR5CiAgKiA0KSBkbyBub3QgcnVuIHRoZSAic2tpcCIgcHJvY2VzcywgaWYgc29tZXRoaW5nIGVsc2UgaXMgYXZhaWxhYmxlCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwaWNrX25leHRfZW50aXR5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICoKK3BpY2tfbmV4dF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpjdXJyKQogewotCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gX19waWNrX2ZpcnN0X2VudGl0eShjZnNfcnEpOwotCXN0cnVjdCBzY2hlZF9lbnRpdHkgKmxlZnQgPSBzZTsKKwlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpsZWZ0ID0gX19waWNrX2ZpcnN0X2VudGl0eShjZnNfcnEpOworCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlOworCisJLyoKKwkgKiBJZiBjdXJyIGlzIHNldCB3ZSBoYXZlIHRvIHNlZSBpZiBpdHMgbGVmdCBvZiB0aGUgbGVmdG1vc3QgZW50aXR5CisJICogc3RpbGwgaW4gdGhlIHRyZWUsIHByb3ZpZGVkIHRoZXJlIHdhcyBhbnl0aGluZyBpbiB0aGUgdHJlZSBhdCBhbGwuCisJICovCisJaWYgKCFsZWZ0IHx8IChjdXJyICYmIGVudGl0eV9iZWZvcmUoY3VyciwgbGVmdCkpKQorCQlsZWZ0ID0gY3VycjsKKworCXNlID0gbGVmdDsgLyogaWRlYWxseSB3ZSBydW4gdGhlIGxlZnRtb3N0IGVudGl0eSAqLwogCiAJLyoKIAkgKiBBdm9pZCBydW5uaW5nIHRoZSBza2lwIGJ1ZGR5LCBpZiBydW5uaW5nIHNvbWV0aGluZyBlbHNlIGNhbgogCSAqIGJlIGRvbmUgd2l0aG91dCBnZXR0aW5nIHRvbyB1bmZhaXIuCiAJICovCiAJaWYgKGNmc19ycS0+c2tpcCA9PSBzZSkgewotCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZWNvbmQgPSBfX3BpY2tfbmV4dF9lbnRpdHkoc2UpOworCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZWNvbmQ7CisKKwkJaWYgKHNlID09IGN1cnIpIHsKKwkJCXNlY29uZCA9IF9fcGlja19maXJzdF9lbnRpdHkoY2ZzX3JxKTsKKwkJfSBlbHNlIHsKKwkJCXNlY29uZCA9IF9fcGlja19uZXh0X2VudGl0eShzZSk7CisJCQlpZiAoIXNlY29uZCB8fCAoY3VyciAmJiBlbnRpdHlfYmVmb3JlKGN1cnIsIHNlY29uZCkpKQorCQkJCXNlY29uZCA9IGN1cnI7CisJCX0KKwogCQlpZiAoc2Vjb25kICYmIHdha2V1cF9wcmVlbXB0X2VudGl0eShzZWNvbmQsIGxlZnQpIDwgMSkKIAkJCXNlID0gc2Vjb25kOwogCX0KQEAgLTI3NzgsNyArMjk2NCw3IEBACiAJcmV0dXJuIHNlOwogfQogCi1zdGF0aWMgdm9pZCBjaGVja19jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpOworc3RhdGljIGJvb2wgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKIAogc3RhdGljIHZvaWQgcHV0X3ByZXZfZW50aXR5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqcHJldikKIHsKQEAgLTM0MzMsMjIgKzM2MTksMjMgQEAKIH0KIAogLyogY29uZGl0aW9uYWxseSB0aHJvdHRsZSBhY3RpdmUgY2ZzX3JxJ3MgZnJvbSBwdXRfcHJldl9lbnRpdHkoKSAqLwotc3RhdGljIHZvaWQgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQorc3RhdGljIGJvb2wgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCWlmICghY2ZzX2JhbmR3aWR0aF91c2VkKCkpCi0JCXJldHVybjsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGxpa2VseSghY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQgfHwgY2ZzX3JxLT5ydW50aW1lX3JlbWFpbmluZyA+IDApKQotCQlyZXR1cm47CisJCXJldHVybiBmYWxzZTsKIAogCS8qCiAJICogaXQncyBwb3NzaWJsZSBmb3IgYSB0aHJvdHRsZWQgZW50aXR5IHRvIGJlIGZvcmNlZCBpbnRvIGEgcnVubmluZwogCSAqIHN0YXRlIChlLmcuIHNldF9jdXJyX3Rhc2spLCBpbiB0aGlzIGNhc2Ugd2UncmUgZmluaXNoZWQuCiAJICovCiAJaWYgKGNmc19ycV90aHJvdHRsZWQoY2ZzX3JxKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gdHJ1ZTsKIAogCXRocm90dGxlX2Nmc19ycShjZnNfcnEpOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgc2NoZWRfY2ZzX3NsYWNrX3RpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKQEAgLTM1NTgsNyArMzc0NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFjY291bnRfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCB1NjQgZGVsdGFfZXhlYykge30KLXN0YXRpYyB2b2lkIGNoZWNrX2Nmc19ycV9ydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkge30KK3N0YXRpYyBib29sIGNoZWNrX2Nmc19ycV9ydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkgeyByZXR1cm4gZmFsc2U7IH0KIHN0YXRpYyB2b2lkIGNoZWNrX2VucXVldWVfdGhyb3R0bGUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKSB7fQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJldHVybl9jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpIHt9CiAKQEAgLTQyMTMsMTMgKzQ0MDAsMTQgQEAKIH0KIAogLyoKLSAqIHNjaGVkX2JhbGFuY2Vfc2VsZjogYmFsYW5jZSB0aGUgY3VycmVudCB0YXNrIChydW5uaW5nIG9uIGNwdSkgaW4gZG9tYWlucwotICogdGhhdCBoYXZlIHRoZSAnZmxhZycgZmxhZyBzZXQuIEluIHByYWN0aWNlLCB0aGlzIGlzIFNEX0JBTEFOQ0VfRk9SSyBhbmQKLSAqIFNEX0JBTEFOQ0VfRVhFQy4KKyAqIHNlbGVjdF90YXNrX3JxX2ZhaXI6IFNlbGVjdCB0YXJnZXQgcnVucXVldWUgZm9yIHRoZSB3YWtpbmcgdGFzayBpbiBkb21haW5zCisgKiB0aGF0IGhhdmUgdGhlICdzZF9mbGFnJyBmbGFnIHNldC4gSW4gcHJhY3RpY2UsIHRoaXMgaXMgU0RfQkFMQU5DRV9XQUtFLAorICogU0RfQkFMQU5DRV9GT1JLLCBvciBTRF9CQUxBTkNFX0VYRUMuCiAgKgotICogQmFsYW5jZSwgaWUuIHNlbGVjdCB0aGUgbGVhc3QgbG9hZGVkIGdyb3VwLgorICogQmFsYW5jZXMgbG9hZCBieSBzZWxlY3RpbmcgdGhlIGlkbGVzdCBjcHUgaW4gdGhlIGlkbGVzdCBncm91cCwgb3IgdW5kZXIKKyAqIGNlcnRhaW4gY29uZGl0aW9ucyBhbiBpZGxlIHNpYmxpbmcgY3B1IGlmIHRoZSBkb21haW4gaGFzIFNEX1dBS0VfQUZGSU5FIHNldC4KICAqCi0gKiBSZXR1cm5zIHRoZSB0YXJnZXQgQ1BVIG51bWJlciwgb3IgdGhlIHNhbWUgQ1BVIGlmIG5vIGJhbGFuY2luZyBpcyBuZWVkZWQuCisgKiBSZXR1cm5zIHRoZSB0YXJnZXQgY3B1IG51bWJlci4KICAqCiAgKiBwcmVlbXB0IG11c3QgYmUgZGlzYWJsZWQuCiAgKi8KQEAgLTQ0OTQsMjYgKzQ2ODIsMTI0IEBACiAJCXNldF9sYXN0X2J1ZGR5KHNlKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfZmFpcihzdHJ1Y3QgcnEgKnJxKQorc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqCitwaWNrX25leHRfdGFza19mYWlyKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gJnJxLT5jZnM7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqc2U7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCWludCBuZXdfdGFza3M7CiAKK2FnYWluOgorI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECiAJaWYgKCFjZnNfcnEtPm5yX3J1bm5pbmcpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGlkbGU7CisKKwlpZiAocHJldi0+c2NoZWRfY2xhc3MgIT0gJmZhaXJfc2NoZWRfY2xhc3MpCisJCWdvdG8gc2ltcGxlOworCisJLyoKKwkgKiBCZWNhdXNlIG9mIHRoZSBzZXRfbmV4dF9idWRkeSgpIGluIGRlcXVldWVfdGFza19mYWlyKCkgaXQgaXMgcmF0aGVyCisJICogbGlrZWx5IHRoYXQgYSBuZXh0IHRhc2sgaXMgZnJvbSB0aGUgc2FtZSBjZ3JvdXAgYXMgdGhlIGN1cnJlbnQuCisJICoKKwkgKiBUaGVyZWZvcmUgYXR0ZW1wdCB0byBhdm9pZCBwdXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBlbnRpcmUgY2dyb3VwCisJICogaGllcmFyY2h5LCBvbmx5IGNoYW5nZSB0aGUgcGFydCB0aGF0IGFjdHVhbGx5IGNoYW5nZXMuCisJICovCiAKIAlkbyB7Ci0JCXNlID0gcGlja19uZXh0X2VudGl0eShjZnNfcnEpOworCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpjdXJyID0gY2ZzX3JxLT5jdXJyOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGdvdCBoZXJlIHdpdGhvdXQgZG9pbmcgcHV0X3ByZXZfZW50aXR5KCkgd2UgYWxzbworCQkgKiBoYXZlIHRvIGNvbnNpZGVyIGNmc19ycS0+Y3Vyci4gSWYgaXQgaXMgc3RpbGwgYSBydW5uYWJsZQorCQkgKiBlbnRpdHksIHVwZGF0ZV9jdXJyKCkgd2lsbCB1cGRhdGUgaXRzIHZydW50aW1lLCBvdGhlcndpc2UKKwkJICogZm9yZ2V0IHdlJ3ZlIGV2ZXIgc2VlbiBpdC4KKwkJICovCisJCWlmIChjdXJyICYmIGN1cnItPm9uX3JxKQorCQkJdXBkYXRlX2N1cnIoY2ZzX3JxKTsKKwkJZWxzZQorCQkJY3VyciA9IE5VTEw7CisKKwkJLyoKKwkJICogVGhpcyBjYWxsIHRvIGNoZWNrX2Nmc19ycV9ydW50aW1lKCkgd2lsbCBkbyB0aGUgdGhyb3R0bGUgYW5kCisJCSAqIGRlcXVldWUgaXRzIGVudGl0eSBpbiB0aGUgcGFyZW50KHMpLiBUaGVyZWZvcmUgdGhlICdzaW1wbGUnCisJCSAqIG5yX3J1bm5pbmcgdGVzdCB3aWxsIGluZGVlZCBiZSBjb3JyZWN0LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGNoZWNrX2Nmc19ycV9ydW50aW1lKGNmc19ycSkpKQorCQkJZ290byBzaW1wbGU7CisKKwkJc2UgPSBwaWNrX25leHRfZW50aXR5KGNmc19ycSwgY3Vycik7CisJCWNmc19ycSA9IGdyb3VwX2Nmc19ycShzZSk7CisJfSB3aGlsZSAoY2ZzX3JxKTsKKworCXAgPSB0YXNrX29mKHNlKTsKKworCS8qCisJICogU2luY2Ugd2UgaGF2ZW4ndCB5ZXQgZG9uZSBwdXRfcHJldl9lbnRpdHkgYW5kIGlmIHRoZSBzZWxlY3RlZCB0YXNrCisJICogaXMgYSBkaWZmZXJlbnQgdGFzayB0aGFuIHdlIHN0YXJ0ZWQgb3V0IHdpdGgsIHRyeSBhbmQgdG91Y2ggdGhlCisJICogbGVhc3QgYW1vdW50IG9mIGNmc19ycXMuCisJICovCisJaWYgKHByZXYgIT0gcCkgeworCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwc2UgPSAmcHJldi0+c2U7CisKKwkJd2hpbGUgKCEoY2ZzX3JxID0gaXNfc2FtZV9ncm91cChzZSwgcHNlKSkpIHsKKwkJCWludCBzZV9kZXB0aCA9IHNlLT5kZXB0aDsKKwkJCWludCBwc2VfZGVwdGggPSBwc2UtPmRlcHRoOworCisJCQlpZiAoc2VfZGVwdGggPD0gcHNlX2RlcHRoKSB7CisJCQkJcHV0X3ByZXZfZW50aXR5KGNmc19ycV9vZihwc2UpLCBwc2UpOworCQkJCXBzZSA9IHBhcmVudF9lbnRpdHkocHNlKTsKKwkJCX0KKwkJCWlmIChzZV9kZXB0aCA+PSBwc2VfZGVwdGgpIHsKKwkJCQlzZXRfbmV4dF9lbnRpdHkoY2ZzX3JxX29mKHNlKSwgc2UpOworCQkJCXNlID0gcGFyZW50X2VudGl0eShzZSk7CisJCQl9CisJCX0KKworCQlwdXRfcHJldl9lbnRpdHkoY2ZzX3JxLCBwc2UpOworCQlzZXRfbmV4dF9lbnRpdHkoY2ZzX3JxLCBzZSk7CisJfQorCisJaWYgKGhydGlja19lbmFibGVkKHJxKSkKKwkJaHJ0aWNrX3N0YXJ0X2ZhaXIocnEsIHApOworCisJcmV0dXJuIHA7CitzaW1wbGU6CisJY2ZzX3JxID0gJnJxLT5jZnM7CisjZW5kaWYKKworCWlmICghY2ZzX3JxLT5ucl9ydW5uaW5nKQorCQlnb3RvIGlkbGU7CisKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKworCWRvIHsKKwkJc2UgPSBwaWNrX25leHRfZW50aXR5KGNmc19ycSwgTlVMTCk7CiAJCXNldF9uZXh0X2VudGl0eShjZnNfcnEsIHNlKTsKIAkJY2ZzX3JxID0gZ3JvdXBfY2ZzX3JxKHNlKTsKIAl9IHdoaWxlIChjZnNfcnEpOwogCiAJcCA9IHRhc2tfb2Yoc2UpOworCiAJaWYgKGhydGlja19lbmFibGVkKHJxKSkKIAkJaHJ0aWNrX3N0YXJ0X2ZhaXIocnEsIHApOwogCiAJcmV0dXJuIHA7CisKK2lkbGU6CisJbmV3X3Rhc2tzID0gaWRsZV9iYWxhbmNlKHJxKTsKKwkvKgorCSAqIEJlY2F1c2UgaWRsZV9iYWxhbmNlKCkgcmVsZWFzZXMgKGFuZCByZS1hY3F1aXJlcykgcnEtPmxvY2ssIGl0IGlzCisJICogcG9zc2libGUgZm9yIGFueSBoaWdoZXIgcHJpb3JpdHkgdGFzayB0byBhcHBlYXIuIEluIHRoYXQgY2FzZSB3ZQorCSAqIG11c3QgcmUtc3RhcnQgdGhlIHBpY2tfbmV4dF9lbnRpdHkoKSBsb29wLgorCSAqLworCWlmIChuZXdfdGFza3MgPCAwKQorCQlyZXR1cm4gUkVUUllfVEFTSzsKKworCWlmIChuZXdfdGFza3MgPiAwKQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC00NzUxLDcgKzUwMzcsNyBAQAogICogSXMgdGhpcyB0YXNrIGxpa2VseSBjYWNoZS1ob3Q6CiAgKi8KIHN0YXRpYyBpbnQKLXRhc2tfaG90KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTY0IG5vdywgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCit0YXNrX2hvdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHU2NCBub3cpCiB7CiAJczY0IGRlbHRhOwogCkBAIC00Nzg1LDcgKzUwNzEsNyBAQAogewogCWludCBzcmNfbmlkLCBkc3RfbmlkOwogCi0JaWYgKCFzY2hlZF9mZWF0KE5VTUFfRkFWT1VSX0hJR0hFUikgfHwgIXAtPm51bWFfZmF1bHRzIHx8CisJaWYgKCFzY2hlZF9mZWF0KE5VTUFfRkFWT1VSX0hJR0hFUikgfHwgIXAtPm51bWFfZmF1bHRzX21lbW9yeSB8fAogCSAgICAhKGVudi0+c2QtPmZsYWdzICYgU0RfTlVNQSkpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTQ4MTYsNyArNTEwMiw3IEBACiAJaWYgKCFzY2hlZF9mZWF0KE5VTUEpIHx8ICFzY2hlZF9mZWF0KE5VTUFfUkVTSVNUX0xPV0VSKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKCFwLT5udW1hX2ZhdWx0cyB8fCAhKGVudi0+c2QtPmZsYWdzICYgU0RfTlVNQSkpCisJaWYgKCFwLT5udW1hX2ZhdWx0c19tZW1vcnkgfHwgIShlbnYtPnNkLT5mbGFncyAmIFNEX05VTUEpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlzcmNfbmlkID0gY3B1X3RvX25vZGUoZW52LT5zcmNfY3B1KTsKQEAgLTQ5MTIsNyArNTE5OCw3IEBACiAJICogMikgdGFzayBpcyBjYWNoZSBjb2xkLCBvcgogCSAqIDMpIHRvbyBtYW55IGJhbGFuY2UgYXR0ZW1wdHMgaGF2ZSBmYWlsZWQuCiAJICovCi0JdHNrX2NhY2hlX2hvdCA9IHRhc2tfaG90KHAsIHJxX2Nsb2NrX3Rhc2soZW52LT5zcmNfcnEpLCBlbnYtPnNkKTsKKwl0c2tfY2FjaGVfaG90ID0gdGFza19ob3QocCwgcnFfY2xvY2tfdGFzayhlbnYtPnNyY19ycSkpOwogCWlmICghdHNrX2NhY2hlX2hvdCkKIAkJdHNrX2NhY2hlX2hvdCA9IG1pZ3JhdGVfZGVncmFkZXNfbG9jYWxpdHkocCwgZW52KTsKIApAQCAtNTc3NSwxMiArNjA2MSwxMCBAQAogCXB3cl9ub3cgLz0gU0NIRURfUE9XRVJfU0NBTEU7CiAKIAkvKiBBbW91bnQgb2YgbG9hZCB3ZSdkIHN1YnRyYWN0ICovCi0JdG1wID0gKGJ1c2llc3QtPmxvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkgLwotCQlidXNpZXN0LT5ncm91cF9wb3dlcjsKLQlpZiAoYnVzaWVzdC0+YXZnX2xvYWQgPiB0bXApIHsKKwlpZiAoYnVzaWVzdC0+YXZnX2xvYWQgPiBzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrKSB7CiAJCXB3cl9tb3ZlICs9IGJ1c2llc3QtPmdyb3VwX3Bvd2VyICoKIAkJCSAgICBtaW4oYnVzaWVzdC0+bG9hZF9wZXJfdGFzaywKLQkJCQlidXNpZXN0LT5hdmdfbG9hZCAtIHRtcCk7CisJCQkJYnVzaWVzdC0+YXZnX2xvYWQgLSBzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrKTsKIAl9CiAKIAkvKiBBbW91bnQgb2YgbG9hZCB3ZSdkIGFkZCAqLwpAQCAtNjM1OSwxNyArNjY0MywyMyBAQAogICogaWRsZV9iYWxhbmNlIGlzIGNhbGxlZCBieSBzY2hlZHVsZSgpIGlmIHRoaXNfY3B1IGlzIGFib3V0IHRvIGJlY29tZQogICogaWRsZS4gQXR0ZW1wdHMgdG8gcHVsbCB0YXNrcyBmcm9tIG90aGVyIENQVXMuCiAgKi8KLXZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgc3RydWN0IHJxICp0aGlzX3JxKQorc3RhdGljIGludCBpZGxlX2JhbGFuY2Uoc3RydWN0IHJxICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCWludCBwdWxsZWRfdGFzayA9IDA7CiAJdW5zaWduZWQgbG9uZyBuZXh0X2JhbGFuY2UgPSBqaWZmaWVzICsgSFo7CiAJdTY0IGN1cnJfY29zdCA9IDA7CisJaW50IHRoaXNfY3B1ID0gdGhpc19ycS0+Y3B1OwogCisJaWRsZV9lbnRlcl9mYWlyKHRoaXNfcnEpOworCS8qCisJICogV2UgbXVzdCBzZXQgaWRsZV9zdGFtcCBfYmVmb3JlXyBjYWxsaW5nIGlkbGVfYmFsYW5jZSgpLCBzdWNoIHRoYXQgd2UKKwkgKiBtZWFzdXJlIHRoZSBkdXJhdGlvbiBvZiBpZGxlX2JhbGFuY2UoKSBhcyBpZGxlIHRpbWUuCisJICovCiAJdGhpc19ycS0+aWRsZV9zdGFtcCA9IHJxX2Nsb2NrKHRoaXNfcnEpOwogCiAJaWYgKHRoaXNfcnEtPmF2Z19pZGxlIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0KQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBEcm9wIHRoZSBycS0+bG9jaywgYnV0IGtlZXAgSVJRL3ByZWVtcHQgZGlzYWJsZWQuCkBAIC02NDA3LDE1ICs2Njk3LDIyIEBACiAJCWludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhzZC0+YmFsYW5jZV9pbnRlcnZhbCk7CiAJCWlmICh0aW1lX2FmdGVyKG5leHRfYmFsYW5jZSwgc2QtPmxhc3RfYmFsYW5jZSArIGludGVydmFsKSkKIAkJCW5leHRfYmFsYW5jZSA9IHNkLT5sYXN0X2JhbGFuY2UgKyBpbnRlcnZhbDsKLQkJaWYgKHB1bGxlZF90YXNrKSB7Ci0JCQl0aGlzX3JxLT5pZGxlX3N0YW1wID0gMDsKKwkJaWYgKHB1bGxlZF90YXNrKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyYXdfc3Bpbl9sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKIAorCS8qCisJICogV2hpbGUgYnJvd3NpbmcgdGhlIGRvbWFpbnMsIHdlIHJlbGVhc2VkIHRoZSBycSBsb2NrLgorCSAqIEEgdGFzayBjb3VsZCBoYXZlIGJlIGVucXVldWVkIGluIHRoZSBtZWFudGltZQorCSAqLworCWlmICh0aGlzX3JxLT5jZnMuaF9ucl9ydW5uaW5nICYmICFwdWxsZWRfdGFzaykgeworCQlwdWxsZWRfdGFzayA9IDE7CisJCWdvdG8gb3V0OworCX0KKwogCWlmIChwdWxsZWRfdGFzayB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIHRoaXNfcnEtPm5leHRfYmFsYW5jZSkpIHsKIAkJLyoKIAkJICogV2UgYXJlIGdvaW5nIGlkbGUuIG5leHRfYmFsYW5jZSBtYXkgYmUgc2V0IGJhc2VkIG9uCkBAIC02NDI2LDYgKzY3MjMsMjAgQEAKIAogCWlmIChjdXJyX2Nvc3QgPiB0aGlzX3JxLT5tYXhfaWRsZV9iYWxhbmNlX2Nvc3QpCiAJCXRoaXNfcnEtPm1heF9pZGxlX2JhbGFuY2VfY29zdCA9IGN1cnJfY29zdDsKKworb3V0OgorCS8qIElzIHRoZXJlIGEgdGFzayBvZiBhIGhpZ2ggcHJpb3JpdHkgY2xhc3M/ICovCisJaWYgKHRoaXNfcnEtPm5yX3J1bm5pbmcgIT0gdGhpc19ycS0+Y2ZzLmhfbnJfcnVubmluZyAmJgorCSAgICAodGhpc19ycS0+ZGwuZGxfbnJfcnVubmluZyB8fAorCSAgICAgKHRoaXNfcnEtPnJ0LnJ0X25yX3J1bm5pbmcgJiYgIXJ0X3JxX3Rocm90dGxlZCgmdGhpc19ycS0+cnQpKSkpCisJCXB1bGxlZF90YXNrID0gLTE7CisKKwlpZiAocHVsbGVkX3Rhc2spIHsKKwkJaWRsZV9leGl0X2ZhaXIodGhpc19ycSk7CisJCXRoaXNfcnEtPmlkbGVfc3RhbXAgPSAwOworCX0KKworCXJldHVybiBwdWxsZWRfdGFzazsKIH0KIAogLyoKQEAgLTY0OTYsNiArNjgwNywxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvbl9udWxsX2RvbWFpbihzdHJ1Y3QgcnEgKnJxKQoreworCXJldHVybiB1bmxpa2VseSghcmN1X2RlcmVmZXJlbmNlX3NjaGVkKHJxLT5zZCkpOworfQorCiAjaWZkZWYgQ09ORklHX05PX0haX0NPTU1PTgogLyoKICAqIGlkbGUgbG9hZCBiYWxhbmNpbmcgZGV0YWlscwpAQCAtNjU1MCw4ICs2ODY2LDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbm9oel9iYWxhbmNlX2V4aXRfaWRsZShpbnQgY3B1KQogewogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChOT0haX1RJQ0tfU1RPUFBFRCwgbm9oel9mbGFncyhjcHUpKSkpIHsKLQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKTsKLQkJYXRvbWljX2RlYygmbm9oei5ucl9jcHVzKTsKKwkJLyoKKwkJICogQ29tcGxldGVseSBpc29sYXRlZCBDUFVzIGRvbid0IGV2ZXIgc2V0LCBzbyB3ZSBtdXN0IHRlc3QuCisJCSAqLworCQlpZiAobGlrZWx5KGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKSkpIHsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbm9oei5pZGxlX2NwdXNfbWFzayk7CisJCQlhdG9taWNfZGVjKCZub2h6Lm5yX2NwdXMpOworCQl9CiAJCWNsZWFyX2JpdChOT0haX1RJQ0tfU1RPUFBFRCwgbm9oel9mbGFncyhjcHUpKTsKIAl9CiB9CkBAIC02NjA1LDYgKzY5MjYsMTIgQEAKIAlpZiAodGVzdF9iaXQoTk9IWl9USUNLX1NUT1BQRUQsIG5vaHpfZmxhZ3MoY3B1KSkpCiAJCXJldHVybjsKIAorCS8qCisJICogSWYgd2UncmUgYSBjb21wbGV0ZWx5IGlzb2xhdGVkIENQVSwgd2UgZG9uJ3QgcGxheS4KKwkgKi8KKwlpZiAob25fbnVsbF9kb21haW4oY3B1X3JxKGNwdSkpKQorCQlyZXR1cm47CisKIAljcHVtYXNrX3NldF9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKTsKIAlhdG9taWNfaW5jKCZub2h6Lm5yX2NwdXMpOwogCXNldF9iaXQoTk9IWl9USUNLX1NUT1BQRUQsIG5vaHpfZmxhZ3MoY3B1KSk7CkBAIC02ODY3LDExICs3MTk0LDYgQEAKIAlub2h6X2lkbGVfYmFsYW5jZSh0aGlzX3JxLCBpZGxlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb25fbnVsbF9kb21haW4oc3RydWN0IHJxICpycSkKLXsKLQlyZXR1cm4gIXJjdV9kZXJlZmVyZW5jZV9zY2hlZChycS0+c2QpOwotfQotCiAvKgogICogVHJpZ2dlciB0aGUgU0NIRURfU09GVElSUSBpZiBpdCBpcyB0aW1lIHRvIGRvIHBlcmlvZGljIGxvYWQgYmFsYW5jaW5nLgogICovCkBAIC03MDM2LDcgKzczNTgsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgc3dpdGNoZWRfdG9fZmFpcihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JaWYgKCFwLT5zZS5vbl9ycSkKKwlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKKyNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorCS8qCisJICogU2luY2UgdGhlIHJlYWwtZGVwdGggY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgKG9ubHkgRkFJUgorCSAqIGNsYXNzIG1haW50YWluIGRlcHRoIHZhbHVlKSwgcmVzZXQgZGVwdGggcHJvcGVybHkuCisJICovCisJc2UtPmRlcHRoID0gc2UtPnBhcmVudCA/IHNlLT5wYXJlbnQtPmRlcHRoICsgMSA6IDA7CisjZW5kaWYKKwlpZiAoIXNlLT5vbl9ycSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTcwODQsNyArNzQxNCw5IEBACiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKIHN0YXRpYyB2b2lkIHRhc2tfbW92ZV9ncm91cF9mYWlyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG9uX3JxKQogeworCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlOwogCXN0cnVjdCBjZnNfcnEgKmNmc19ycTsKKwogCS8qCiAJICogSWYgdGhlIHRhc2sgd2FzIG5vdCBvbiB0aGUgcnEgYXQgdGhlIHRpbWUgb2YgdGhpcyBjZ3JvdXAgbW92ZW1lbnQKIAkgKiBpdCBtdXN0IGhhdmUgYmVlbiBhc2xlZXAsIHNsZWVwaW5nIHRhc2tzIGtlZXAgdGhlaXIgLT52cnVudGltZQpAQCAtNzExMCwyMyArNzQ0MiwyNCBAQAogCSAqIFRvIHByZXZlbnQgYm9vc3Qgb3IgcGVuYWx0eSBpbiB0aGUgbmV3IGNmc19ycSBjYXVzZWQgYnkgZGVsdGEKIAkgKiBtaW5fdnJ1bnRpbWUgYmV0d2VlbiB0aGUgdHdvIGNmc19ycXMsIHdlIHNraXAgdnJ1bnRpbWUgYWRqdXN0bWVudC4KIAkgKi8KLQlpZiAoIW9uX3JxICYmICghcC0+c2Uuc3VtX2V4ZWNfcnVudGltZSB8fCBwLT5zdGF0ZSA9PSBUQVNLX1dBS0lORykpCisJaWYgKCFvbl9ycSAmJiAoIXNlLT5zdW1fZXhlY19ydW50aW1lIHx8IHAtPnN0YXRlID09IFRBU0tfV0FLSU5HKSkKIAkJb25fcnEgPSAxOwogCiAJaWYgKCFvbl9ycSkKLQkJcC0+c2UudnJ1bnRpbWUgLT0gY2ZzX3JxX29mKCZwLT5zZSktPm1pbl92cnVudGltZTsKKwkJc2UtPnZydW50aW1lIC09IGNmc19ycV9vZihzZSktPm1pbl92cnVudGltZTsKIAlzZXRfdGFza19ycShwLCB0YXNrX2NwdShwKSk7CisJc2UtPmRlcHRoID0gc2UtPnBhcmVudCA/IHNlLT5wYXJlbnQtPmRlcHRoICsgMSA6IDA7CiAJaWYgKCFvbl9ycSkgewotCQljZnNfcnEgPSBjZnNfcnFfb2YoJnAtPnNlKTsKLQkJcC0+c2UudnJ1bnRpbWUgKz0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CisJCWNmc19ycSA9IGNmc19ycV9vZihzZSk7CisJCXNlLT52cnVudGltZSArPSBjZnNfcnEtPm1pbl92cnVudGltZTsKICNpZmRlZiBDT05GSUdfU01QCiAJCS8qCiAJCSAqIG1pZ3JhdGVfdGFza19ycV9mYWlyKCkgd2lsbCBoYXZlIHJlbW92ZWQgb3VyIHByZXZpb3VzCiAJCSAqIGNvbnRyaWJ1dGlvbiwgYnV0IHdlIG11c3Qgc3luY2hyb25pemUgZm9yIG9uZ29pbmcgZnV0dXJlCiAJCSAqIGRlY2F5LgogCQkgKi8KLQkJcC0+c2UuYXZnLmRlY2F5X2NvdW50ID0gYXRvbWljNjRfcmVhZCgmY2ZzX3JxLT5kZWNheV9jb3VudGVyKTsKLQkJY2ZzX3JxLT5ibG9ja2VkX2xvYWRfYXZnICs9IHAtPnNlLmF2Zy5sb2FkX2F2Z19jb250cmliOworCQlzZS0+YXZnLmRlY2F5X2NvdW50ID0gYXRvbWljNjRfcmVhZCgmY2ZzX3JxLT5kZWNheV9jb3VudGVyKTsKKwkJY2ZzX3JxLT5ibG9ja2VkX2xvYWRfYXZnICs9IHNlLT5hdmcubG9hZF9hdmdfY29udHJpYjsKICNlbmRpZgogCX0KIH0KQEAgLTcyMjIsMTAgKzc1NTUsMTMgQEAKIAlpZiAoIXNlKQogCQlyZXR1cm47CiAKLQlpZiAoIXBhcmVudCkKKwlpZiAoIXBhcmVudCkgewogCQlzZS0+Y2ZzX3JxID0gJnJxLT5jZnM7Ci0JZWxzZQorCQlzZS0+ZGVwdGggPSAwOworCX0gZWxzZSB7CiAJCXNlLT5jZnNfcnEgPSBwYXJlbnQtPm15X3E7CisJCXNlLT5kZXB0aCA9IHBhcmVudC0+ZGVwdGggKyAxOworCX0KIAogCXNlLT5teV9xID0gY2ZzX3JxOwogCS8qIGd1YXJhbnRlZSBncm91cCBlbnRpdGllcyBhbHdheXMgaGF2ZSB3ZWlnaHQgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9pZGxlLmMgYi9rZXJuZWwvc2NoZWQvaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTc2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvc2NoZWQvaWRsZS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogR2VuZXJpYyBlbnRyeSBwb2ludCBmb3IgdGhlIGlkbGUgdGhyZWFkcworICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2twcm90ZWN0b3IuaD4KKworI2luY2x1ZGUgPGFzbS90bGIuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgorCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgY3B1X2lkbGVfZm9yY2VfcG9sbDsKKwordm9pZCBjcHVfaWRsZV9wb2xsX2N0cmwoYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQljcHVfaWRsZV9mb3JjZV9wb2xsKys7CisJfSBlbHNlIHsKKwkJY3B1X2lkbGVfZm9yY2VfcG9sbC0tOworCQlXQVJOX09OX09OQ0UoY3B1X2lkbGVfZm9yY2VfcG9sbCA8IDApOworCX0KK30KKworI2lmZGVmIENPTkZJR19HRU5FUklDX0lETEVfUE9MTF9TRVRVUAorc3RhdGljIGludCBfX2luaXQgY3B1X2lkbGVfcG9sbF9zZXR1cChjaGFyICpfX3VudXNlZCkKK3sKKwljcHVfaWRsZV9mb3JjZV9wb2xsID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vaGx0IiwgY3B1X2lkbGVfcG9sbF9zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdV9pZGxlX25vcG9sbF9zZXR1cChjaGFyICpfX3VudXNlZCkKK3sKKwljcHVfaWRsZV9mb3JjZV9wb2xsID0gMDsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImhsdCIsIGNwdV9pZGxlX25vcG9sbF9zZXR1cCk7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgY3B1X2lkbGVfcG9sbCh2b2lkKQoreworCXJjdV9pZGxlX2VudGVyKCk7CisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZSgwLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwl3aGlsZSAoIXRpZl9uZWVkX3Jlc2NoZWQoKSkKKwkJY3B1X3JlbGF4KCk7CisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZShQV1JfRVZFTlRfRVhJVCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlyY3VfaWRsZV9leGl0KCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFdlYWsgaW1wbGVtZW50YXRpb25zIGZvciBvcHRpb25hbCBhcmNoIHNwZWNpZmljIGZ1bmN0aW9ucyAqLwordm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9wcmVwYXJlKHZvaWQpIHsgfQordm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9lbnRlcih2b2lkKSB7IH0KK3ZvaWQgX193ZWFrIGFyY2hfY3B1X2lkbGVfZXhpdCh2b2lkKSB7IH0KK3ZvaWQgX193ZWFrIGFyY2hfY3B1X2lkbGVfZGVhZCh2b2lkKSB7IH0KK3ZvaWQgX193ZWFrIGFyY2hfY3B1X2lkbGUodm9pZCkKK3sKKwljcHVfaWRsZV9mb3JjZV9wb2xsID0gMTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBHZW5lcmljIGlkbGUgbG9vcCBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCBjcHVfaWRsZV9sb29wKHZvaWQpCit7CisJd2hpbGUgKDEpIHsKKwkJdGlja19ub2h6X2lkbGVfZW50ZXIoKTsKKworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQljaGVja19wZ3RfY2FjaGUoKTsKKwkJCXJtYigpOworCisJCQlpZiAoY3B1X2lzX29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwkJCQlhcmNoX2NwdV9pZGxlX2RlYWQoKTsKKworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCWFyY2hfY3B1X2lkbGVfZW50ZXIoKTsKKworCQkJLyoKKwkJCSAqIEluIHBvbGwgbW9kZSB3ZSByZWVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzcGluLgorCQkJICoKKwkJCSAqIEFsc28gaWYgd2UgZGV0ZWN0ZWQgaW4gdGhlIHdha2V1cCBmcm9tIGlkbGUKKwkJCSAqIHBhdGggdGhhdCB0aGUgdGljayBicm9hZGNhc3QgZGV2aWNlIGV4cGlyZWQKKwkJCSAqIGZvciB1cywgd2UgZG9uJ3Qgd2FudCB0byBnbyBkZWVwIGlkbGUgYXMgd2UKKwkJCSAqIGtub3cgdGhhdCB0aGUgSVBJIGlzIGdvaW5nIHRvIGFycml2ZSByaWdodAorCQkJICogYXdheQorCQkJICovCisJCQlpZiAoY3B1X2lkbGVfZm9yY2VfcG9sbCB8fCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKCkpIHsKKwkJCQljcHVfaWRsZV9wb2xsKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghY3VycmVudF9jbHJfcG9sbGluZ19hbmRfdGVzdCgpKSB7CisJCQkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOworCQkJCQlyY3VfaWRsZV9lbnRlcigpOworCQkJCQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKKwkJCQkJCWFyY2hfY3B1X2lkbGUoKTsKKwkJCQkJaWYgKFdBUk5fT05fT05DRShpcnFzX2Rpc2FibGVkKCkpKQorCQkJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJCQlyY3VfaWRsZV9leGl0KCk7CisJCQkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQkJfQorCQkJCV9fY3VycmVudF9zZXRfcG9sbGluZygpOworCQkJfQorCQkJYXJjaF9jcHVfaWRsZV9leGl0KCk7CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSB3ZSBmZWxsIG91dCBvZiB0aGUgbG9vcCBhYm92ZSwgd2Uga25vdworCQkgKiBUSUZfTkVFRF9SRVNDSEVEIG11c3QgYmUgc2V0LCBwcm9wYWdhdGUgaXQgaW50bworCQkgKiBQUkVFTVBUX05FRURfUkVTQ0hFRC4KKwkJICoKKwkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZvciBwb2xsaW5nIGlkbGUgbG9vcHMgd2Ugd2lsbAorCQkgKiBub3QgaGF2ZSBoYWQgYW4gSVBJIHRvIGZvbGQgdGhlIHN0YXRlIGZvciB1cy4KKwkJICovCisJCXByZWVtcHRfc2V0X25lZWRfcmVzY2hlZCgpOworCQl0aWNrX25vaHpfaWRsZV9leGl0KCk7CisJCXNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQoKTsKKwl9Cit9CisKK3ZvaWQgY3B1X3N0YXJ0dXBfZW50cnkoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSkKK3sKKwkvKgorCSAqIFRoaXMgI2lmZGVmIG5lZWRzIHRvIGRpZSwgYnV0IGl0J3MgdG9vIGxhdGUgaW4gdGhlIGN5Y2xlIHRvCisJICogbWFrZSB0aGlzIGdlbmVyaWMgKGFybSBhbmQgc2ggaGF2ZSBuZXZlciBpbnZva2VkIHRoZSBjYW5hcnkKKwkgKiBpbml0IGZvciB0aGUgbm9uIGJvb3QgY3B1cyEpLiBXaWxsIGJlIGZpeGVkIGluIDMuMTEKKwkgKi8KKyNpZmRlZiBDT05GSUdfWDg2CisJLyoKKwkgKiBJZiB3ZSdyZSB0aGUgbm9uLWJvb3QgQ1BVLCBub3RoaW5nIHNldCB0aGUgc3RhY2sgY2FuYXJ5IHVwCisJICogZm9yIHVzLiBUaGUgYm9vdCBDUFUgYWxyZWFkeSBoYXMgaXQgaW5pdGlhbGl6ZWQgYnV0IG5vIGhhcm0KKwkgKiBpbiBkb2luZyBpdCBhZ2Fpbi4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgZm9yIHVwZGF0aW5nIGl0LCBhcworCSAqIHdlIHdvbnQgZXZlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIChzbyB0aGUgaW52YWxpZAorCSAqIGNhbmFyaWVzIGFscmVhZHkgb24gdGhlIHN0YWNrIHdvbnQgZXZlciB0cmlnZ2VyKS4KKwkgKi8KKwlib290X2luaXRfc3RhY2tfY2FuYXJ5KCk7CisjZW5kaWYKKwlfX2N1cnJlbnRfc2V0X3BvbGxpbmcoKTsKKwlhcmNoX2NwdV9pZGxlX3ByZXBhcmUoKTsKKwljcHVfaWRsZV9sb29wKCk7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMgYi9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMKaW5kZXggNTE2YzNkOS4uODc5ZjJiNyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2lkbGVfdGFzay5jCisrKyBiL2tlcm5lbC9zY2hlZC9pZGxlX3Rhc2suYwpAQCAtMTMsMTggKzEzLDggQEAKIHsKIAlyZXR1cm4gdGFza19jcHUocCk7IC8qIElETEUgdGFza3MgYXMgbmV2ZXIgbWlncmF0ZWQgKi8KIH0KLQotc3RhdGljIHZvaWQgcHJlX3NjaGVkdWxlX2lkbGUoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQotewotCWlkbGVfZXhpdF9mYWlyKHJxKTsKLQlycV9sYXN0X3RpY2tfcmVzZXQocnEpOwotfQotCi1zdGF0aWMgdm9pZCBwb3N0X3NjaGVkdWxlX2lkbGUoc3RydWN0IHJxICpycSkKLXsKLQlpZGxlX2VudGVyX2ZhaXIocnEpOwotfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogLyoKICAqIElkbGUgdGFza3MgYXJlIHVuY29uZGl0aW9uYWxseSByZXNjaGVkdWxlZDoKICAqLwpAQCAtMzMsMTMgKzIzLDEyIEBACiAJcmVzY2hlZF90YXNrKHJxLT5pZGxlKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfaWRsZShzdHJ1Y3QgcnEgKnJxKQorc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqCitwaWNrX25leHRfdGFza19pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKwogCXNjaGVkc3RhdF9pbmMocnEsIHNjaGVkX2dvaWRsZSk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCS8qIFRyaWdnZXIgdGhlIHBvc3Qgc2NoZWR1bGUgdG8gZG8gYW4gaWRsZV9lbnRlciBmb3IgQ0ZTICovCi0JcnEtPnBvc3Rfc2NoZWR1bGUgPSAxOwotI2VuZGlmCiAJcmV0dXJuIHJxLT5pZGxlOwogfQogCkBAIC01OCw2ICs0Nyw4IEBACiAKIHN0YXRpYyB2b2lkIHB1dF9wcmV2X3Rhc2tfaWRsZShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCiB7CisJaWRsZV9leGl0X2ZhaXIocnEpOworCXJxX2xhc3RfdGlja19yZXNldChycSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRhc2tfdGlja19pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwgaW50IHF1ZXVlZCkKQEAgLTEwMSw4ICs5Miw2IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJLnNlbGVjdF90YXNrX3JxCQk9IHNlbGVjdF90YXNrX3JxX2lkbGUsCi0JLnByZV9zY2hlZHVsZQkJPSBwcmVfc2NoZWR1bGVfaWRsZSwKLQkucG9zdF9zY2hlZHVsZQkJPSBwb3N0X3NjaGVkdWxlX2lkbGUsCiAjZW5kaWYKIAogCS5zZXRfY3Vycl90YXNrICAgICAgICAgID0gc2V0X2N1cnJfdGFza19pZGxlLApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3J0LmMgYi9rZXJuZWwvc2NoZWQvcnQuYwppbmRleCAxOTk5MDIxLi5kOGNkZjE2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvcnQuYworKysgYi9rZXJuZWwvc2NoZWQvcnQuYwpAQCAtMjI5LDYgKzIyOSwxNCBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCitzdGF0aWMgaW50IHB1bGxfcnRfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpOworCitzdGF0aWMgaW5saW5lIGJvb2wgbmVlZF9wdWxsX3J0X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworCS8qIFRyeSB0byBwdWxsIFJUIHRhc2tzIGhlcmUgaWYgd2UgbG93ZXIgdGhpcyBycSdzIHByaW8gKi8KKwlyZXR1cm4gcnEtPnJ0LmhpZ2hlc3RfcHJpby5jdXJyID4gcHJldi0+cHJpbzsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcnRfb3ZlcmxvYWRlZChzdHJ1Y3QgcnEgKnJxKQogewogCXJldHVybiBhdG9taWNfcmVhZCgmcnEtPnJkLT5ydG9fY291bnQpOwpAQCAtMzE1LDYgKzMyMywxNSBAQAogCXJldHVybiAhcGxpc3RfaGVhZF9lbXB0eSgmcnEtPnJ0LnB1c2hhYmxlX3Rhc2tzKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3N0X3NjaGVkdWxlKHN0cnVjdCBycSAqcnEpCit7CisJLyoKKwkgKiBXZSBkZXRlY3QgdGhpcyBzdGF0ZSBoZXJlIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRha2luZyB0aGUgUlEKKwkgKiBsb2NrIGFnYWluIGxhdGVyIGlmIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHVzaAorCSAqLworCXJxLT5wb3N0X3NjaGVkdWxlID0gaGFzX3B1c2hhYmxlX3Rhc2tzKHJxKTsKK30KKwogc3RhdGljIHZvaWQgZW5xdWV1ZV9wdXNoYWJsZV90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlwbGlzdF9kZWwoJnAtPnB1c2hhYmxlX3Rhc2tzLCAmcnEtPnJ0LnB1c2hhYmxlX3Rhc2tzKTsKQEAgLTM1OSw2ICszNzYsMTkgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBib29sIG5lZWRfcHVsbF9ydF90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB1bGxfcnRfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG9zdF9zY2hlZHVsZShzdHJ1Y3QgcnEgKnJxKQoreworfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgb25fcnRfcnEoc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2UpCkBAIC00NDAsMTEgKzQ3MCw2IEBACiAJCWRlcXVldWVfcnRfZW50aXR5KHJ0X3NlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfcnFfdGhyb3R0bGVkKHN0cnVjdCBydF9ycSAqcnRfcnEpCi17Ci0JcmV0dXJuIHJ0X3JxLT5ydF90aHJvdHRsZWQgJiYgIXJ0X3JxLT5ydF9ucl9ib29zdGVkOwotfQotCiBzdGF0aWMgaW50IHJ0X3NlX2Jvb3N0ZWQoc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2UpCiB7CiAJc3RydWN0IHJ0X3JxICpydF9ycSA9IGdyb3VwX3J0X3JxKHJ0X3NlKTsKQEAgLTUxNSwxMSArNTQwLDYgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfcnFfdGhyb3R0bGVkKHN0cnVjdCBydF9ycSAqcnRfcnEpCi17Ci0JcmV0dXJuIHJ0X3JxLT5ydF90aHJvdHRsZWQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNjaGVkX3J0X3BlcmlvZF9tYXNrKHZvaWQpCiB7CiAJcmV0dXJuIGNwdV9vbmxpbmVfbWFzazsKQEAgLTEzMTgsMTUgKzEzMzgsNyBAQAogewogCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKnJ0X3NlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQlzdHJ1Y3QgcnRfcnEgKnJ0X3JxOwotCi0JcnRfcnEgPSAmcnEtPnJ0OwotCi0JaWYgKCFydF9ycS0+cnRfbnJfcnVubmluZykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAocnRfcnFfdGhyb3R0bGVkKHJ0X3JxKSkKLQkJcmV0dXJuIE5VTEw7CisJc3RydWN0IHJ0X3JxICpydF9ycSAgPSAmcnEtPnJ0OwogCiAJZG8gewogCQlydF9zZSA9IHBpY2tfbmV4dF9ydF9lbnRpdHkocnEsIHJ0X3JxKTsKQEAgLTEzNDAsMjEgKzEzNTIsNDUgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfcnQoc3RydWN0IHJxICpycSkKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKgorcGlja19uZXh0X3Rhc2tfcnQoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IF9waWNrX25leHRfdGFza19ydChycSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCBydF9ycSAqcnRfcnEgPSAmcnEtPnJ0OworCisJaWYgKG5lZWRfcHVsbF9ydF90YXNrKHJxLCBwcmV2KSkgeworCQlwdWxsX3J0X3Rhc2socnEpOworCQkvKgorCQkgKiBwdWxsX3J0X3Rhc2soKSBjYW4gZHJvcCAoYW5kIHJlLWFjcXVpcmUpIHJxLT5sb2NrOyB0aGlzCisJCSAqIG1lYW5zIGEgZGwgdGFzayBjYW4gc2xpcCBpbiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvCisJCSAqIHJlLXN0YXJ0IHRhc2sgc2VsZWN0aW9uLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHJxLT5kbC5kbF9ucl9ydW5uaW5nKSkKKwkJCXJldHVybiBSRVRSWV9UQVNLOworCX0KKworCS8qCisJICogV2UgbWF5IGRlcXVldWUgcHJldidzIHJ0X3JxIGluIHB1dF9wcmV2X3Rhc2soKS4KKwkgKiBTbywgd2UgdXBkYXRlIHRpbWUgYmVmb3JlIHJ0X25yX3J1bm5pbmcgY2hlY2suCisJICovCisJaWYgKHByZXYtPnNjaGVkX2NsYXNzID09ICZydF9zY2hlZF9jbGFzcykKKwkJdXBkYXRlX2N1cnJfcnQocnEpOworCisJaWYgKCFydF9ycS0+cnRfbnJfcnVubmluZykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocnRfcnFfdGhyb3R0bGVkKHJ0X3JxKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKworCXAgPSBfcGlja19uZXh0X3Rhc2tfcnQocnEpOwogCiAJLyogVGhlIHJ1bm5pbmcgdGFzayBpcyBuZXZlciBlbGlnaWJsZSBmb3IgcHVzaGluZyAqLwogCWlmIChwKQogCQlkZXF1ZXVlX3B1c2hhYmxlX3Rhc2socnEsIHApOwogCi0jaWZkZWYgQ09ORklHX1NNUAotCS8qCi0JICogV2UgZGV0ZWN0IHRoaXMgc3RhdGUgaGVyZSBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0YWtpbmcgdGhlIFJRCi0JICogbG9jayBhZ2FpbiBsYXRlciBpZiB0aGVyZSBpcyBubyBuZWVkIHRvIHB1c2gKLQkgKi8KLQlycS0+cG9zdF9zY2hlZHVsZSA9IGhhc19wdXNoYWJsZV90YXNrcyhycSk7Ci0jZW5kaWYKKwlzZXRfcG9zdF9zY2hlZHVsZShycSk7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTE3MjQsMTMgKzE3NjAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHByZV9zY2hlZHVsZV9ydChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCi17Ci0JLyogVHJ5IHRvIHB1bGwgUlQgdGFza3MgaGVyZSBpZiB3ZSBsb3dlciB0aGlzIHJxJ3MgcHJpbyAqLwotCWlmIChycS0+cnQuaGlnaGVzdF9wcmlvLmN1cnIgPiBwcmV2LT5wcmlvKQotCQlwdWxsX3J0X3Rhc2socnEpOwotfQotCiBzdGF0aWMgdm9pZCBwb3N0X3NjaGVkdWxlX3J0KHN0cnVjdCBycSAqcnEpCiB7CiAJcHVzaF9ydF90YXNrcyhycSk7CkBAIC0xODMzLDcgKzE4NjIsNyBAQAogCQlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwogfQogCi12b2lkIGluaXRfc2NoZWRfcnRfY2xhc3Modm9pZCkKK3ZvaWQgX19pbml0IGluaXRfc2NoZWRfcnRfY2xhc3Modm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMjAwNyw3ICsyMDM2LDYgQEAKIAkuc2V0X2NwdXNfYWxsb3dlZCAgICAgICA9IHNldF9jcHVzX2FsbG93ZWRfcnQsCiAJLnJxX29ubGluZSAgICAgICAgICAgICAgPSBycV9vbmxpbmVfcnQsCiAJLnJxX29mZmxpbmUgICAgICAgICAgICAgPSBycV9vZmZsaW5lX3J0LAotCS5wcmVfc2NoZWR1bGUJCT0gcHJlX3NjaGVkdWxlX3J0LAogCS5wb3N0X3NjaGVkdWxlCQk9IHBvc3Rfc2NoZWR1bGVfcnQsCiAJLnRhc2tfd29rZW4JCT0gdGFza193b2tlbl9ydCwKIAkuc3dpdGNoZWRfZnJvbQkJPSBzd2l0Y2hlZF9mcm9tX3J0LApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3NjaGVkLmggYi9rZXJuZWwvc2NoZWQvc2NoZWQuaAppbmRleCBmOTY0YWRkLi5jOTAwN2YyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvc2NoZWQuaAorKysgYi9rZXJuZWwvc2NoZWQvc2NoZWQuaApAQCAtMjQsMjQgKzI0LDYgQEAKIGV4dGVybiB2b2lkIHVwZGF0ZV9jcHVfbG9hZF9hY3RpdmUoc3RydWN0IHJxICp0aGlzX3JxKTsKIAogLyoKLSAqIENvbnZlcnQgdXNlci1uaWNlIHZhbHVlcyBbIC0yMCAuLi4gMCAuLi4gMTkgXQotICogdG8gc3RhdGljIHByaW9yaXR5IFsgTUFYX1JUX1BSSU8uLk1BWF9QUklPLTEgXSwKLSAqIGFuZCBiYWNrLgotICovCi0jZGVmaW5lIE5JQ0VfVE9fUFJJTyhuaWNlKQkoTUFYX1JUX1BSSU8gKyAobmljZSkgKyAyMCkKLSNkZWZpbmUgUFJJT19UT19OSUNFKHByaW8pCSgocHJpbykgLSBNQVhfUlRfUFJJTyAtIDIwKQotI2RlZmluZSBUQVNLX05JQ0UocCkJCVBSSU9fVE9fTklDRSgocCktPnN0YXRpY19wcmlvKQotCi0vKgotICogJ1VzZXIgcHJpb3JpdHknIGlzIHRoZSBuaWNlIHZhbHVlIGNvbnZlcnRlZCB0byBzb21ldGhpbmcgd2UKLSAqIGNhbiB3b3JrIHdpdGggYmV0dGVyIHdoZW4gc2NhbGluZyB2YXJpb3VzIHNjaGVkdWxlciBwYXJhbWV0ZXJzLAotICogaXQncyBhIFsgMCAuLi4gMzkgXSByYW5nZS4KLSAqLwotI2RlZmluZSBVU0VSX1BSSU8ocCkJCSgocCktTUFYX1JUX1BSSU8pCi0jZGVmaW5lIFRBU0tfVVNFUl9QUklPKHApCVVTRVJfUFJJTygocCktPnN0YXRpY19wcmlvKQotI2RlZmluZSBNQVhfVVNFUl9QUklPCQkoVVNFUl9QUklPKE1BWF9QUklPKSkKLQotLyoKICAqIEhlbHBlcnMgZm9yIGNvbnZlcnRpbmcgbmFub3NlY29uZCB0aW1pbmcgdG8gamlmZnkgcmVzb2x1dGlvbgogICovCiAjZGVmaW5lIE5TX1RPX0pJRkZJRVMoVElNRSkJKCh1bnNpZ25lZCBsb25nKShUSU1FKSAvIChOU0VDX1BFUl9TRUMgLyBIWikpCkBAIC00NDEsNiArNDIzLDE4IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X3JxX3Rocm90dGxlZChzdHJ1Y3QgcnRfcnEgKnJ0X3JxKQoreworCXJldHVybiBydF9ycS0+cnRfdGhyb3R0bGVkICYmICFydF9ycS0+cnRfbnJfYm9vc3RlZDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBydF9ycV90aHJvdHRsZWQoc3RydWN0IHJ0X3JxICpydF9ycSkKK3sKKwlyZXR1cm4gcnRfcnEtPnJ0X3Rocm90dGxlZDsKK30KKyNlbmRpZgorCiAvKiBEZWFkbGluZSBjbGFzcycgcmVsYXRlZCBmaWVsZHMgaW4gYSBydW5xdWV1ZSAqLwogc3RydWN0IGRsX3JxIHsKIAkvKiBydW5xdWV1ZSBpcyBhbiByYnRyZWUsIG9yZGVyZWQgYnkgZGVhZGxpbmUgKi8KQEAgLTU1OCwxMSArNTUyLDkgQEAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCS8qIGxpc3Qgb2YgbGVhZiBjZnNfcnEgb24gdGhpcyBjcHU6ICovCiAJc3RydWN0IGxpc3RfaGVhZCBsZWFmX2Nmc19ycV9saXN0OwotI2VuZGlmIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCiAKLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxlYWZfcnRfcnFfbGlzdDsKLSNlbmRpZgorCXN0cnVjdCBzY2hlZF9hdmcgYXZnOworI2VuZGlmIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCiAKIAkvKgogCSAqIFRoaXMgaXMgcGFydCBvZiBhIGdsb2JhbCBjb3VudGVyIHdoZXJlIG9ubHkgdGhlIHRvdGFsIHN1bQpAQCAtNjUxLDggKzY0Myw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCXN0cnVjdCBsbGlzdF9oZWFkIHdha2VfbGlzdDsKICNlbmRpZgotCi0Jc3RydWN0IHNjaGVkX2F2ZyBhdmc7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBjcHVfb2Yoc3RydWN0IHJxICpycSkKQEAgLTExMTIsNiArMTEwMiw4IEBACiAKICNkZWZpbmUgREVRVUVVRV9TTEVFUAkJMQogCisjZGVmaW5lIFJFVFJZX1RBU0sJCSgodm9pZCAqKS0xVUwpCisKIHN0cnVjdCBzY2hlZF9jbGFzcyB7CiAJY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzICpuZXh0OwogCkBAIC0xMTIyLDE0ICsxMTE0LDIyIEBACiAKIAl2b2lkICgqY2hlY2tfcHJlZW1wdF9jdXJyKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOwogCi0Jc3RydWN0IHRhc2tfc3RydWN0ICogKCpwaWNrX25leHRfdGFzaykgKHN0cnVjdCBycSAqcnEpOworCS8qCisJICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwaWNrX25leHRfdGFzaygpIG1ldGhvZCB0aGF0IHdpbGwKKwkgKiByZXR1cm4gdGhlIG5leHQgdGFzayB0byBjYWxsIHB1dF9wcmV2X3Rhc2soKSBvbiB0aGUgQHByZXYgdGFzayBvcgorCSAqIHNvbWV0aGluZyBlcXVpdmFsZW50LgorCSAqCisJICogTWF5IHJldHVybiBSRVRSWV9UQVNLIHdoZW4gaXQgZmluZHMgYSBoaWdoZXIgcHJpbyBjbGFzcyBoYXMgcnVubmFibGUKKwkgKiB0YXNrcy4KKwkgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiAoKnBpY2tfbmV4dF90YXNrKSAoc3RydWN0IHJxICpycSwKKwkJCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldik7CiAJdm9pZCAoKnB1dF9wcmV2X3Rhc2spIChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWludCAgKCpzZWxlY3RfdGFza19ycSkoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgdGFza19jcHUsIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpOwogCXZvaWQgKCptaWdyYXRlX3Rhc2tfcnEpKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG5leHRfY3B1KTsKIAotCXZvaWQgKCpwcmVfc2NoZWR1bGUpIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnBvc3Rfc2NoZWR1bGUpIChzdHJ1Y3QgcnEgKnRoaXNfcnEpOwogCXZvaWQgKCp0YXNrX3dha2luZykgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnRhc2tfd29rZW4pIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CkBAIC0xMTU5LDYgKzExNTksMTEgQEAKICNlbmRpZgogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHB1dF9wcmV2X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworCXByZXYtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKK30KKwogI2RlZmluZSBzY2hlZF9jbGFzc19oaWdoZXN0ICgmc3RvcF9zY2hlZF9jbGFzcykKICNkZWZpbmUgZm9yX2VhY2hfY2xhc3MoY2xhc3MpIFwKICAgIGZvciAoY2xhc3MgPSBzY2hlZF9jbGFzc19oaWdoZXN0OyBjbGFzczsgY2xhc3MgPSBjbGFzcy0+bmV4dCkKQEAgLTExNzUsMTYgKzExODAsMTQgQEAKIGV4dGVybiB2b2lkIHVwZGF0ZV9ncm91cF9wb3dlcihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSk7CiAKIGV4dGVybiB2b2lkIHRyaWdnZXJfbG9hZF9iYWxhbmNlKHN0cnVjdCBycSAqcnEpOwotZXh0ZXJuIHZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgc3RydWN0IHJxICp0aGlzX3JxKTsKIAogZXh0ZXJuIHZvaWQgaWRsZV9lbnRlcl9mYWlyKHN0cnVjdCBycSAqdGhpc19ycSk7CiBleHRlcm4gdm9pZCBpZGxlX2V4aXRfZmFpcihzdHJ1Y3QgcnEgKnRoaXNfcnEpOwogCi0jZWxzZQkvKiBDT05GSUdfU01QICovCisjZWxzZQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9iYWxhbmNlKGludCBjcHUsIHN0cnVjdCBycSAqcnEpCi17Ci19CitzdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9lbnRlcl9mYWlyKHN0cnVjdCBycSAqcnEpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkbGVfZXhpdF9mYWlyKHN0cnVjdCBycSAqcnEpIHsgfQogCiAjZW5kaWYKIApAQCAtMTIxMywxNiArMTIxNiw2IEBACiAKIGV4dGVybiB2b2lkIGluaXRfdGFza19ydW5uYWJsZV9hdmVyYWdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNpZmRlZiBDT05GSUdfUEFSQVZJUlQKLXN0YXRpYyBpbmxpbmUgdTY0IHN0ZWFsX3RpY2tzKHU2NCBzdGVhbCkKLXsKLQlpZiAodW5saWtlbHkoc3RlYWwgPiBOU0VDX1BFUl9TRUMpKQotCQlyZXR1cm4gZGl2X3U2NChzdGVhbCwgVElDS19OU0VDKTsKLQotCXJldHVybiBfX2l0ZXJfZGl2X3U2NF9yZW0oc3RlYWwsIFRJQ0tfTlNFQywgJnN0ZWFsKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5jX25yX3J1bm5pbmcoc3RydWN0IHJxICpycSkKIHsKIAlycS0+bnJfcnVubmluZysrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3N0b3BfdGFzay5jIGIva2VybmVsL3NjaGVkL3N0b3BfdGFzay5jCmluZGV4IGZkYjZiYjAuLmQ2Y2U2NWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9zdG9wX3Rhc2suYworKysgYi9rZXJuZWwvc2NoZWQvc3RvcF90YXNrLmMKQEAgLTIzLDE2ICsyMywxOSBAQAogCS8qIHdlJ3JlIG5ldmVyIHByZWVtcHRlZCAqLwogfQogCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19zdG9wKHN0cnVjdCBycSAqcnEpCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICoKK3BpY2tfbmV4dF90YXNrX3N0b3Aoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqc3RvcCA9IHJxLT5zdG9wOwogCi0JaWYgKHN0b3AgJiYgc3RvcC0+b25fcnEpIHsKLQkJc3RvcC0+c2UuZXhlY19zdGFydCA9IHJxX2Nsb2NrX3Rhc2socnEpOwotCQlyZXR1cm4gc3RvcDsKLQl9CisJaWYgKCFzdG9wIHx8ICFzdG9wLT5vbl9ycSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gTlVMTDsKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKworCXN0b3AtPnNlLmV4ZWNfc3RhcnQgPSBycV9jbG9ja190YXNrKHJxKTsKKworCXJldHVybiBzdG9wOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IGZmZWUzNWIuLjA2ZDU3NGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTExNywxMyArMTE3LDQzIEBACiAJY3NkLT5mbGFncyAmPSB+Q1NEX0ZMQUdfTE9DSzsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhLCBjc2RfZGF0YSk7CisKIC8qCiAgKiBJbnNlcnQgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYWxsX3NpbmdsZV9kYXRhIGVsZW1lbnQKICAqIGZvciBleGVjdXRpb24gb24gdGhlIGdpdmVuIENQVS4gZGF0YSBtdXN0IGFscmVhZHkgaGF2ZQogICogLT5mdW5jLCAtPmluZm8sIGFuZCAtPmZsYWdzIHNldC4KICAqLwotc3RhdGljIHZvaWQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCBpbnQgd2FpdCkKK3N0YXRpYyBpbnQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLAorCQkJICAgICAgIHNtcF9jYWxsX2Z1bmNfdCBmdW5jLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKIHsKKwlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSBjc2Rfc3RhY2sgPSB7IC5mbGFncyA9IDAgfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWZ1bmMoaW5mbyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlpZiAoKHVuc2lnbmVkKWNwdSA+PSBucl9jcHVfaWRzIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CisKKworCWlmICghY3NkKSB7CisJCWNzZCA9ICZjc2Rfc3RhY2s7CisJCWlmICghd2FpdCkKKwkJCWNzZCA9ICZfX2dldF9jcHVfdmFyKGNzZF9kYXRhKTsKKwl9CisKKwljc2RfbG9jayhjc2QpOworCisJY3NkLT5mdW5jID0gZnVuYzsKKwljc2QtPmluZm8gPSBpbmZvOworCiAJaWYgKHdhaXQpCiAJCWNzZC0+ZmxhZ3MgfD0gQ1NEX0ZMQUdfV0FJVDsKIApAQCAtMTQzLDYgKzE3Myw4IEBACiAKIAlpZiAod2FpdCkKIAkJY3NkX2xvY2tfd2FpdChjc2QpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNTEsNyArMTgzLDggQEAKICAqLwogdm9pZCBnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQodm9pZCkKIHsKLQlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpuZXh0OworCXN0cnVjdCBsbGlzdF9ub2RlICplbnRyeTsKKwlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCAqY3NkX25leHQ7CiAKIAkvKgogCSAqIFNob3VsZG4ndCByZWNlaXZlIHRoaXMgaW50ZXJydXB0IG9uIGEgY3B1IHRoYXQgaXMgbm90IHlldCBvbmxpbmUuCkBAIC0xNjEsMjEgKzE5NCwxMiBAQAogCWVudHJ5ID0gbGxpc3RfZGVsX2FsbCgmX19nZXRfY3B1X3ZhcihjYWxsX3NpbmdsZV9xdWV1ZSkpOwogCWVudHJ5ID0gbGxpc3RfcmV2ZXJzZV9vcmRlcihlbnRyeSk7CiAKLQl3aGlsZSAoZW50cnkpIHsKLQkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZDsKLQotCQluZXh0ID0gZW50cnktPm5leHQ7Ci0KLQkJY3NkID0gbGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhLCBsbGlzdCk7CisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjc2QsIGNzZF9uZXh0LCBlbnRyeSwgbGxpc3QpIHsKIAkJY3NkLT5mdW5jKGNzZC0+aW5mbyk7CiAJCWNzZF91bmxvY2soY3NkKTsKLQotCQllbnRyeSA9IG5leHQ7CiAJfQogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEsIGNzZF9kYXRhKTsKLQogLyoKICAqIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSAtIFJ1biBhIGZ1bmN0aW9uIG9uIGEgc3BlY2lmaWMgQ1BVCiAgKiBAZnVuYzogVGhlIGZ1bmN0aW9uIHRvIHJ1bi4gVGhpcyBtdXN0IGJlIGZhc3QgYW5kIG5vbi1ibG9ja2luZy4KQEAgLTE4NywxMiArMjExLDggQEAKIGludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgc21wX2NhbGxfZnVuY190IGZ1bmMsIHZvaWQgKmluZm8sCiAJCQkgICAgIGludCB3YWl0KQogewotCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGQgPSB7Ci0JCS5mbGFncyA9IDAsCi0JfTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0aGlzX2NwdTsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCiAJLyoKIAkgKiBwcmV2ZW50IHByZWVtcHRpb24gYW5kIHJlc2NoZWR1bGUgb24gYW5vdGhlciBwcm9jZXNzb3IsCkBAIC0yMDksMjYgKzIyOSw3IEBACiAJV0FSTl9PTl9PTkNFKGNwdV9vbmxpbmUodGhpc19jcHUpICYmIGlycXNfZGlzYWJsZWQoKQogCQkgICAgICYmICFvb3BzX2luX3Byb2dyZXNzKTsKIAotCWlmIChjcHUgPT0gdGhpc19jcHUpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlmdW5jKGluZm8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSBlbHNlIHsKLQkJaWYgKCh1bnNpZ25lZCljcHUgPCBucl9jcHVfaWRzICYmIGNwdV9vbmxpbmUoY3B1KSkgewotCQkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCA9ICZkOwotCi0JCQlpZiAoIXdhaXQpCi0JCQkJY3NkID0gJl9fZ2V0X2NwdV92YXIoY3NkX2RhdGEpOwotCi0JCQljc2RfbG9jayhjc2QpOwotCi0JCQljc2QtPmZ1bmMgPSBmdW5jOwotCQkJY3NkLT5pbmZvID0gaW5mbzsKLQkJCWdlbmVyaWNfZXhlY19zaW5nbGUoY3B1LCBjc2QsIHdhaXQpOwotCQl9IGVsc2UgewotCQkJZXJyID0gLUVOWElPOwkvKiBDUFUgbm90IG9ubGluZSAqLwotCQl9Ci0JfQorCWVyciA9IGdlbmVyaWNfZXhlY19zaW5nbGUoY3B1LCBOVUxMLCBmdW5jLCBpbmZvLCB3YWl0KTsKIAogCXB1dF9jcHUoKTsKIApAQCAtMjM2LDYgKzIzNywzNCBAQAogfQogRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOwogCisvKioKKyAqIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYygpOiBSdW4gYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9uIGEKKyAqIAkJCSAgICAgICAgIHNwZWNpZmljIENQVS4KKyAqIEBjcHU6IFRoZSBDUFUgdG8gcnVuIG9uLgorICogQGNzZDogUHJlLWFsbG9jYXRlZCBhbmQgc2V0dXAgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBMaWtlIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpLCBidXQgdGhlIGNhbGwgaXMgYXN5bmNob25vdXMgYW5kCisgKiBjYW4gdGh1cyBiZSBkb25lIGZyb20gY29udGV4dHMgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgorICoKKyAqIFRoZSBjYWxsZXIgcGFzc2VzIGhpcyBvd24gcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZQorICogKGllOiBlbWJlZGRlZCBpbiBhbiBvYmplY3QpIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igc3luY2hyb25pemluZyBpdAorICogc3VjaCB0aGF0IHRoZSBJUElzIHBlcmZvcm1lZCBvbiB0aGUgQGNzZCBhcmUgc3RyaWN0bHkgc2VyaWFsaXplZC4KKyAqCisgKiBOT1RFOiBCZSBjYXJlZnVsLCB0aGVyZSBpcyB1bmZvcnR1bmF0ZWx5IG5vIGN1cnJlbnQgZGVidWdnaW5nIGZhY2lsaXR5IHRvCisgKiB2YWxpZGF0ZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBzZXJpYWxpemF0aW9uLgorICovCitpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGludCBjcHUsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QpCit7CisJaW50IGVyciA9IDA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwllcnIgPSBnZW5lcmljX2V4ZWNfc2luZ2xlKGNwdSwgY3NkLCBjc2QtPmZ1bmMsIGNzZC0+aW5mbywgMCk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMpOworCiAvKgogICogc21wX2NhbGxfZnVuY3Rpb25fYW55IC0gUnVuIGEgZnVuY3Rpb24gb24gYW55IG9mIHRoZSBnaXZlbiBjcHVzCiAgKiBAbWFzazogVGhlIG1hc2sgb2YgY3B1cyBpdCBjYW4gcnVuIG9uLgpAQCAtMjgwLDQ0ICszMDksNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfZnVuY3Rpb25fYW55KTsKIAogLyoqCi0gKiBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpOiBSdW4gYSBmdW5jdGlvbiBvbiBhIHNwZWNpZmljIENQVQotICogQGNwdTogVGhlIENQVSB0byBydW4gb24uCi0gKiBAZGF0YTogUHJlLWFsbG9jYXRlZCBhbmQgc2V0dXAgZGF0YSBzdHJ1Y3R1cmUKLSAqIEB3YWl0OiBJZiB0cnVlLCB3YWl0IHVudGlsIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQgb24gc3BlY2lmaWVkIENQVS4KLSAqCi0gKiBMaWtlIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpLCBidXQgYWxsb3cgY2FsbGVyIHRvIHBhc3MgaW4gYQotICogcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZS4gVXNlZnVsIGZvciBlbWJlZGRpbmcgQGRhdGEgaW5zaWRlCi0gKiBvdGhlciBzdHJ1Y3R1cmVzLCBmb3IgaW5zdGFuY2UuCi0gKi8KLXZvaWQgX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCwKLQkJCQlpbnQgd2FpdCkKLXsKLQl1bnNpZ25lZCBpbnQgdGhpc19jcHU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXRoaXNfY3B1ID0gZ2V0X2NwdSgpOwotCS8qCi0JICogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLQkgKiBXZSBhbGxvdyBjcHUncyB0aGF0IGFyZSBub3QgeWV0IG9ubGluZSB0aG91Z2gsIGFzIG5vIG9uZSBlbHNlIGNhbgotCSAqIHNlbmQgc21wIGNhbGwgZnVuY3Rpb24gaW50ZXJydXB0IHRvIHRoaXMgY3B1IGFuZCBhcyBzdWNoIGRlYWRsb2NrcwotCSAqIGNhbid0IGhhcHBlbi4KLQkgKi8KLQlXQVJOX09OX09OQ0UoY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCkpICYmIHdhaXQgJiYgaXJxc19kaXNhYmxlZCgpCi0JCSAgICAgJiYgIW9vcHNfaW5fcHJvZ3Jlc3MpOwotCi0JaWYgKGNwdSA9PSB0aGlzX2NwdSkgewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWNzZC0+ZnVuYyhjc2QtPmluZm8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSBlbHNlIHsKLQkJY3NkX2xvY2soY3NkKTsKLQkJZ2VuZXJpY19leGVjX3NpbmdsZShjcHUsIGNzZCwgd2FpdCk7Ci0JfQotCXB1dF9jcHUoKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKLQotLyoqCiAgKiBzbXBfY2FsbF9mdW5jdGlvbl9tYW55KCk6IFJ1biBhIGZ1bmN0aW9uIG9uIGEgc2V0IG9mIG90aGVyIENQVXMuCiAgKiBAbWFzazogVGhlIHNldCBvZiBjcHVzIHRvIHJ1biBvbiAob25seSBydW5zIG9uIG9ubGluZSBzdWJzZXQpLgogICogQGZ1bmM6IFRoZSBmdW5jdGlvbiB0byBydW4uIFRoaXMgbXVzdCBiZSBmYXN0IGFuZCBub24tYmxvY2tpbmcuCmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCA0OTBmY2JiLi5iNTA5OTBhIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvaXJxLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggYzBhNThiZS4uYWRhZWFiNiAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMTc0LDEwICsxNzQsMTAgQEAKIAogCS8qIG5vcm1hbGl6ZTogYXZvaWQgc2lnbmVkIGRpdmlzaW9uIChyb3VuZGluZyBwcm9ibGVtcykgKi8KIAllcnJvciA9IC1FU1JDSDsKLQlpZiAobmljZXZhbCA8IC0yMCkKLQkJbmljZXZhbCA9IC0yMDsKLQlpZiAobmljZXZhbCA+IDE5KQotCQluaWNldmFsID0gMTk7CisJaWYgKG5pY2V2YWwgPCBNSU5fTklDRSkKKwkJbmljZXZhbCA9IE1JTl9OSUNFOworCWlmIChuaWNldmFsID4gTUFYX05JQ0UpCisJCW5pY2V2YWwgPSBNQVhfTklDRTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDQ5ZTEzZTEuLjA5ZDJlMjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTExMiw5ICsxMTIsNiBAQAogI2lmbmRlZiBDT05GSUdfTU1VCiBleHRlcm4gaW50IHN5c2N0bF9ucl90cmltX3BhZ2VzOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JMT0NLCi1leHRlcm4gaW50IGJsa19pb3BvbGxfZW5hYmxlZDsKLSNlbmRpZgogCiAvKiBDb25zdGFudHMgdXNlZCBmb3IgbWluaW11bSBhbmQgIG1heGltdW0gKi8KICNpZmRlZiBDT05GSUdfTE9DS1VQX0RFVEVDVE9SCkBAIC0zODYsMTMgKzM4Myw2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCiAJewotCQkucHJvY25hbWUgICAgICAgPSAibnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCIsCi0JCS5kYXRhICAgICAgICAgICA9ICZzeXNjdGxfbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCwKLQkJLm1heGxlbiAgICAgICAgID0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlICAgICAgICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgICA9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7CiAJCS5wcm9jbmFtZQk9ICJudW1hX2JhbGFuY2luZyIsCiAJCS5kYXRhCQk9IE5VTEwsIC8qIGZpbGxlZCBpbiBieSBoYW5kbGVyICovCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCkBAIC0xMDk0LDE1ICsxMDg0LDYgQEAKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19CTE9DSwotCXsKLQkJLnByb2NuYW1lCT0gImJsa19pb3BvbGwiLAotCQkuZGF0YQkJPSAmYmxrX2lvcG9sbF9lbmFibGVkLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKLQl9LAotI2VuZGlmCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9LY29uZmlnIGIva2VybmVsL3RpbWUvS2NvbmZpZwppbmRleCAzY2U2ZThjLi5mNDQ4NTEzIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9LY29uZmlnCisrKyBiL2tlcm5lbC90aW1lL0tjb25maWcKQEAgLTEyNCw3ICsxMjQsNyBAQAogZW5kY2hvaWNlCiAKIGNvbmZpZyBOT19IWl9GVUxMX0FMTAotICAgICAgIGJvb2wgIkZ1bGwgZHludGlja3Mgc3lzdGVtIG9uIGFsbCBDUFVzIGJ5IGRlZmF1bHQiCisgICAgICAgYm9vbCAiRnVsbCBkeW50aWNrcyBzeXN0ZW0gb24gYWxsIENQVXMgYnkgZGVmYXVsdCAoZXhjZXB0IENQVSAwKSIKICAgICAgICBkZXBlbmRzIG9uIE5PX0haX0ZVTEwKICAgICAgICBoZWxwCiAgICAgICAgICBJZiB0aGUgdXNlciBkb2Vzbid0IHBhc3MgdGhlIG5vaHpfZnVsbCBib290IG9wdGlvbiB0bwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvTWFrZWZpbGUgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQppbmRleCA5MjUwMTMwLi41N2E0MTNmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQpAQCAtMyw3ICszLDEwIEBACiAKIG9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEKQkJKz0gY2xvY2tldmVudHMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCi1vYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpCSs9IHRpY2stYnJvYWRjYXN0Lm8KK2lmZXEgKCQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUKSx5KQorIG9iai15CQkJCQkJKz0gdGljay1icm9hZGNhc3QubworIG9iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1icm9hZGNhc3QtaHJ0aW1lci5vCitlbmRpZgogb2JqLSQoQ09ORklHX0dFTkVSSUNfU0NIRURfQ0xPQ0spCQkrPSBzY2hlZF9jbG9jay5vCiBvYmotJChDT05GSUdfVElDS19PTkVTSE9UKQkJCSs9IHRpY2stb25lc2hvdC5vCiBvYmotJChDT05GSUdfVElDS19PTkVTSE9UKQkJCSs9IHRpY2stc2NoZWQubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKaW5kZXggMDg2YWQ2MC4uYWQzNjJjMiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYworKysgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCkBAIC00MzksNiArNDM5LDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKTsKIAoraW50IF9fY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCB1MzIgZnJlcSkKK3sKKwljbG9ja2V2ZW50c19jb25maWcoZGV2LCBmcmVxKTsKKworCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkKKwkJcmV0dXJuIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBkZXYtPm5leHRfZXZlbnQsIGZhbHNlKTsKKworCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpCisJCWRldi0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBjbG9ja2V2ZW50c191cGRhdGVfZnJlcSAtIFVwZGF0ZSBmcmVxdWVuY3kgYW5kIHJlcHJvZ3JhbSBhIGNsb2NrIGV2ZW50IGRldmljZS4KICAqIEBkZXY6CWRldmljZSB0byBtb2RpZnkKQEAgLTQ0NiwxNyArNDU5LDIyIEBACiAgKgogICogUmVjb25maWd1cmUgYW5kIHJlcHJvZ3JhbSBhIGNsb2NrIGV2ZW50IGRldmljZSBpbiBvbmVzaG90CiAgKiBtb2RlLiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgY3B1IGZvciB3aGljaCB0aGUgZGV2aWNlIGRlbGl2ZXJzIHBlcgotICogY3B1IHRpbWVyIGV2ZW50cyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQhICBSZXR1cm5zIDAgb24gc3VjY2VzcywKLSAqIC1FVElNRSB3aGVuIHRoZSBldmVudCBpcyBpbiB0aGUgcGFzdC4KKyAqIGNwdSB0aW1lciBldmVudHMuIElmIGNhbGxlZCBmb3IgdGhlIGJyb2FkY2FzdCBkZXZpY2UgdGhlIGNvcmUgdGFrZXMKKyAqIGNhcmUgb2Ygc2VyaWFsaXphdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVUSU1FIHdoZW4gdGhlIGV2ZW50IGlzIGluIHRoZSBwYXN0LgogICovCiBpbnQgY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCB1MzIgZnJlcSkKIHsKLQljbG9ja2V2ZW50c19jb25maWcoZGV2LCBmcmVxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CiAKLQlpZiAoZGV2LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX09ORVNIT1QpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBkZXYtPm5leHRfZXZlbnQsIGZhbHNlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0ID0gdGlja19icm9hZGNhc3RfdXBkYXRlX2ZyZXEoZGV2LCBmcmVxKTsKKwlpZiAocmV0ID09IC1FTk9ERVYpCisJCXJldCA9IF9fY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoZGV2LCBmcmVxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTUyNCwxMiArNTQyLDEzIEBACiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKIC8qKgogICogY2xvY2tldmVudHNfbm90aWZ5IC0gbm90aWZpY2F0aW9uIGFib3V0IHJlbGV2YW50IGV2ZW50cworICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFueSBvdGhlciB2YWx1ZSBvbiBlcnJvcgogICovCi12b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQoraW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjcHU7CisJaW50IGNwdSwgcmV0ID0gMDsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tldmVudHNfbG9jaywgZmxhZ3MpOwogCkBAIC01NDIsNyArNTYxLDcgQEAKIAogCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVI6CiAJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElUOgotCQl0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wocmVhc29uKTsKKwkJcmV0ID0gdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHJlYXNvbik7CiAJCWJyZWFrOwogCiAJY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9EWUlORzoKQEAgLTU4NSw2ICs2MDQsNyBAQAogCQlicmVhazsKIAl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZXZlbnRzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xvY2tldmVudHNfbm90aWZ5KTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvbnRwLmMgYi9rZXJuZWwvdGltZS9udHAuYwppbmRleCBhZjhkMWQ0Li40MTlhNTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9udHAuYworKysgYi9rZXJuZWwvdGltZS9udHAuYwpAQCAtNTE0LDEyICs1MTQsMTMgQEAKIAkJbmV4dC50dl9zZWMrKzsKIAkJbmV4dC50dl9uc2VjIC09IE5TRUNfUEVSX1NFQzsKIAl9Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzeW5jX2Ntb3Nfd29yaywgdGltZXNwZWNfdG9famlmZmllcygmbmV4dCkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJICAgJnN5bmNfY21vc193b3JrLCB0aW1lc3BlY190b19qaWZmaWVzKCZuZXh0KSk7CiB9CiAKIHZvaWQgbnRwX25vdGlmeV9jbW9zX3RpbWVyKHZvaWQpCiB7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzeW5jX2Ntb3Nfd29yaywgMCk7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZzeW5jX2Ntb3Nfd29yaywgMCk7CiB9CiAKICNlbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC1ocnRpbWVyLmMgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC1ocnRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2ODJkNQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYworICogVGhpcyBmaWxlIGVtdWxhdGVzIGEgbG9jYWwgY2xvY2sgZXZlbnQgZGV2aWNlCisgKiB2aWEgYSBwc2V1ZG8gY2xvY2sgZGV2aWNlLgorICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInRpY2staW50ZXJuYWwuaCIKKworc3RhdGljIHN0cnVjdCBocnRpbWVyIGJjdGltZXI7CisKK3N0YXRpYyB2b2lkIGJjX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwkJLyoKKwkJICogTm90ZSwgd2UgY2Fubm90IGNhbmNlbCB0aGUgdGltZXIgaGVyZSBhcyB3ZSBtaWdodAorCQkgKiBydW4gaW50byB0aGUgZm9sbG93aW5nIGxpdmUgbG9jayBzY2VuYXJpbzoKKwkJICoKKwkJICogY3B1IDAJCWNwdTEKKwkJICogbG9jayhicm9hZGNhc3RfbG9jayk7CisJCSAqCQkJaHJ0aW1lcl9pbnRlcnJ1cHQoKQorCQkgKgkJCWJjX2hhbmRsZXIoKQorCQkgKgkJCSAgIHRpY2tfaGFuZGxlX29uZXNob3RfYnJvYWRjYXN0KCk7CisJCSAqCQkJICAgIGxvY2soYnJvYWRjYXN0X2xvY2spOworCQkgKiBocnRpbWVyX2NhbmNlbCgpCisJCSAqICB3YWl0X2Zvcl9jYWxsYmFjaygpCisJCSAqLworCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJmJjdGltZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBndXRzIG9mIHRoZSBicm9hZGNhc3QgY29kZSB3aGVuIHRoZSBjcHUKKyAqIHdoaWNoIGlzIGFib3V0IHRvIGVudGVyIGlkbGUgaGFzIHRoZSBlYXJsaWVzdCBicm9hZGNhc3QgdGltZXIgZXZlbnQuCisgKi8KK3N0YXRpYyBpbnQgYmNfc2V0X25leHQoa3RpbWVfdCBleHBpcmVzLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwkvKgorCSAqIFdlIHRyeSB0byBjYW5jZWwgdGhlIHRpbWVyIGZpcnN0LiBJZiB0aGUgY2FsbGJhY2sgaXMgb24KKwkgKiBmbGlnaHQgb24gc29tZSBvdGhlciBjcHUgdGhlbiB3ZSBsZXQgaXQgaGFuZGxlIGl0LiBJZiB3ZQorCSAqIHdlcmUgYWJsZSB0byBjYW5jZWwgdGhlIHRpbWVyIG5vdGhpbmcgY2FuIHJlYXJtIGl0IGFzIHdlCisJICogb3duIGJyb2FkY2FzdF9sb2NrLgorCSAqCisJICogSG93ZXZlciB3ZSBjYW4gYWxzbyBiZSBjYWxsZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciBvZgorCSAqIGNlX2Jyb2FkY2FzdF9ocnRpbWVyIGl0c2VsZiB3aGVuIGl0IGV4cGlyZXMuIFdlIGNhbm5vdAorCSAqIHJlc3RhcnQgdGhlIHRpbWVyIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBjYWxsYmFjaywgYnV0IHdlCisJICogY2FuIHNldCB0aGUgZXhwaXJ5IHRpbWUgYW5kIGxldCB0aGUgY2FsbGJhY2sgcmV0dXJuCisJICogSFJUSU1FUl9SRVNUQVJULgorCSAqLworCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJmJjdGltZXIpID49IDApIHsKKwkJaHJ0aW1lcl9zdGFydCgmYmN0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCU19QSU5ORUQpOworCQkvKiBCaW5kIHRoZSAiZGV2aWNlIiB0byB0aGUgY3B1ICovCisJCWJjLT5ib3VuZF9vbiA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl9IGVsc2UgaWYgKGJjLT5ib3VuZF9vbiA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJaHJ0aW1lcl9zZXRfZXhwaXJlcygmYmN0aW1lciwgZXhwaXJlcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjZV9icm9hZGNhc3RfaHJ0aW1lciA9IHsKKwkuc2V0X21vZGUJCT0gYmNfc2V0X21vZGUsCisJLnNldF9uZXh0X2t0aW1lCQk9IGJjX3NldF9uZXh0LAorCS5mZWF0dXJlcwkJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UIHwKKwkJCQkgIENMT0NLX0VWVF9GRUFUX0tUSU1FIHwKKwkJCQkgIENMT0NLX0VWVF9GRUFUX0hSVElNRVIsCisJLnJhdGluZwkJCT0gMCwKKwkuYm91bmRfb24JCT0gLTEsCisJLm1pbl9kZWx0YV9ucwkJPSAxLAorCS5tYXhfZGVsdGFfbnMJCT0gS1RJTUVfTUFYLAorCS5taW5fZGVsdGFfdGlja3MJPSAxLAorCS5tYXhfZGVsdGFfdGlja3MJPSBVTE9OR19NQVgsCisJLm11bHQJCQk9IDEsCisJLnNoaWZ0CQkJPSAwLAorCS5jcHVtYXNrCQk9IGNwdV9hbGxfbWFzaywKK307CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBiY19oYW5kbGVyKHN0cnVjdCBocnRpbWVyICp0KQoreworCWNlX2Jyb2FkY2FzdF9ocnRpbWVyLmV2ZW50X2hhbmRsZXIoJmNlX2Jyb2FkY2FzdF9ocnRpbWVyKTsKKworCWlmIChjZV9icm9hZGNhc3RfaHJ0aW1lci5uZXh0X2V2ZW50LnR2NjQgPT0gS1RJTUVfTUFYKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKKwlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOworfQorCit2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCkKK3sKKwlocnRpbWVyX2luaXQoJmJjdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisJYmN0aW1lci5mdW5jdGlvbiA9IGJjX2hhbmRsZXI7CisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZjZV9icm9hZGNhc3RfaHJ0aW1lcik7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwppbmRleCA5ODk3N2E1Li42NGM1OTkwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKQEAgLTEyMCw2ICsxMjAsMTkgQEAKIAlyZXR1cm4gKGRldiAmJiB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2ID09IGRldik7CiB9CiAKK2ludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKQoreworCWludCByZXQgPSAtRU5PREVWOworCisJaWYgKHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShkZXYpKSB7CisJCXJhd19zcGluX2xvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworCQlyZXQgPSBfX2Nsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKGRldiwgZnJlcSk7CisJCXJhd19zcGluX3VubG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIHZvaWQgZXJyX2Jyb2FkY2FzdChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlwcl9jcml0X29uY2UoIkZhaWxlZCB0byBicm9hZGNhc3QgdGltZXIgdGljay4gU29tZSBDUFVzIG1heSBiZSB1bnJlc3BvbnNpdmUuXG4iKTsKQEAgLTI3MiwxMiArMjg1LDggQEAKICAqLwogc3RhdGljIHZvaWQgdGlja19kb19wZXJpb2RpY19icm9hZGNhc3Qodm9pZCkKIHsKLQlyYXdfc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKLQogCWNwdW1hc2tfYW5kKHRtcG1hc2ssIGNwdV9vbmxpbmVfbWFzaywgdGlja19icm9hZGNhc3RfbWFzayk7CiAJdGlja19kb19icm9hZGNhc3QodG1wbWFzayk7Ci0KLQlyYXdfc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOwogfQogCiAvKgpAQCAtMjg3LDEzICsyOTYsMTUgQEAKIHsKIAlrdGltZV90IG5leHQ7CiAKKwlyYXdfc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKKwogCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CiAKIAkvKgogCSAqIFRoZSBkZXZpY2UgaXMgaW4gcGVyaW9kaWMgbW9kZS4gTm8gcmVwcm9ncmFtbWluZyBuZWNlc3Nhcnk6CiAJICovCiAJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAogCS8qCiAJICogU2V0dXAgdGhlIG5leHQgcGVyaW9kIGZvciBkZXZpY2VzLCB3aGljaCBkbyBub3QgaGF2ZQpAQCAtMzA2LDkgKzMxNywxMSBAQAogCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKIAogCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBmYWxzZSkpCi0JCQlyZXR1cm47CisJCQlnb3RvIHVubG9jazsKIAkJdGlja19kb19wZXJpb2RpY19icm9hZGNhc3QoKTsKIAl9Cit1bmxvY2s6CisJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKIH0KIAogLyoKQEAgLTYzMCwyNCArNjQzLDYxIEBACiAJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKIH0KIAorc3RhdGljIGludCBicm9hZGNhc3RfbmVlZHNfY3B1KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjLCBpbnQgY3B1KQoreworCWlmICghKGJjLT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0hSVElNRVIpKQorCQlyZXR1cm4gMDsKKwlpZiAoYmMtPm5leHRfZXZlbnQudHY2NCA9PSBLVElNRV9NQVgpCisJCXJldHVybiAwOworCXJldHVybiBiYy0+Ym91bmRfb24gPT0gY3B1ID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIHZvaWQgYnJvYWRjYXN0X3NodXRkb3duX2xvY2FsKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjLAorCQkJCSAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCS8qCisJICogRm9yIGhydGltZXIgYmFzZWQgYnJvYWRjYXN0aW5nIHdlIGNhbm5vdCBzaHV0ZG93biB0aGUgY3B1CisJICogbG9jYWwgZGV2aWNlIGlmIG91ciBvd24gZXZlbnQgaXMgdGhlIGZpcnN0IG9uZSB0byBleHBpcmUgb3IKKwkgKiBpZiB3ZSBvd24gdGhlIGJyb2FkY2FzdCB0aW1lci4KKwkgKi8KKwlpZiAoYmMtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfSFJUSU1FUikgeworCQlpZiAoYnJvYWRjYXN0X25lZWRzX2NwdShiYywgc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwkJCXJldHVybjsKKwkJaWYgKGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKKwkJCXJldHVybjsKKwl9CisJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7Cit9CisKK3N0YXRpYyB2b2lkIGJyb2FkY2FzdF9tb3ZlX2JjKGludCBkZWFkY3B1KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKworCWlmICghYmMgfHwgIWJyb2FkY2FzdF9uZWVkc19jcHUoYmMsIGRlYWRjcHUpKQorCQlyZXR1cm47CisJLyogVGhpcyBtb3ZlcyB0aGUgYnJvYWRjYXN0IGFzc2lnbm1lbnQgdG8gdGhpcyBjcHUgKi8KKwljbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KGJjLCBiYy0+bmV4dF9ldmVudCwgMSk7Cit9CisKIC8qCiAgKiBQb3dlcnN0YXRlIGluZm9ybWF0aW9uOiBUaGUgc3lzdGVtIGVudGVycy9sZWF2ZXMgYSBzdGF0ZSwgd2hlcmUKICAqIGFmZmVjdGVkIGRldmljZXMgbWlnaHQgc3RvcAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQlVTWSBpZiB0aGUgY3B1IGlzIHVzZWQgdG8gYnJvYWRjYXN0IHdha2V1cHMuCiAgKi8KLXZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKQoraW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYywgKmRldjsKIAlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJa3RpbWVfdCBub3c7Ci0JaW50IGNwdTsKKwlpbnQgY3B1LCByZXQgPSAwOwogCiAJLyoKIAkgKiBQZXJpb2RpYyBtb2RlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVudGVyL2V4aXQgb2YgcG93ZXIKIAkgKiBzdGF0ZXMKIAkgKi8KIAlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBXZSBhcmUgY2FsbGVkIHdpdGggcHJlZW10aW9uIGRpc2FibGVkIGZyb20gdGhlIGRlcHRoIG9mIHRoZQpAQCAtNjU4LDcgKzcwOCw3IEBACiAJZGV2ID0gdGQtPmV2dGRldjsKIAogCWlmICghKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OwogCkBAIC02NjYsNyArNzE2LDcgQEAKIAlpZiAocmVhc29uID09IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSKSB7CiAJCWlmICghY3B1bWFza190ZXN0X2FuZF9zZXRfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgewogCQkJV0FSTl9PTl9PTkNFKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9wZW5kaW5nX21hc2spKTsKLQkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQkJYnJvYWRjYXN0X3NodXRkb3duX2xvY2FsKGJjLCBkZXYpOwogCQkJLyoKIAkJCSAqIFdlIG9ubHkgcmVwcm9ncmFtIHRoZSBicm9hZGNhc3QgdGltZXIgaWYgd2UKIAkJCSAqIGRpZCBub3QgbWFyayBvdXJzZWxmIGluIHRoZSBmb3JjZSBtYXNrIGFuZApAQCAtNjc5LDYgKzcyOSwxNiBAQAogCQkJICAgIGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKIAkJCQl0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoYmMsIGNwdSwgZGV2LT5uZXh0X2V2ZW50LCAxKTsKIAkJfQorCQkvKgorCQkgKiBJZiB0aGUgY3VycmVudCBDUFUgb3ducyB0aGUgaHJ0aW1lciBicm9hZGNhc3QKKwkJICogbWVjaGFuaXNtLCBpdCBjYW5ub3QgZ28gZGVlcCBpZGxlIGFuZCB3ZSByZW1vdmUgdGhlCisJCSAqIENQVSBmcm9tIHRoZSBicm9hZGNhc3QgbWFzay4gV2UgZG9uJ3QgaGF2ZSB0byBnbworCQkgKiB0aHJvdWdoIHRoZSBFWElUIHBhdGggYXMgdGhlIGxvY2FsIHRpbWVyIGlzIG5vdAorCQkgKiBzaHV0ZG93bi4KKwkJICovCisJCXJldCA9IGJyb2FkY2FzdF9uZWVkc19jcHUoYmMsIGNwdSk7CisJCWlmIChyZXQpCisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzayk7CiAJfSBlbHNlIHsKIAkJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgewogCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKQEAgLTc0Niw2ICs4MDYsNyBAQAogCX0KIG91dDoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC04NTIsNiArOTEzLDggQEAKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X3BlbmRpbmdfbWFzayk7CiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9mb3JjZV9tYXNrKTsKIAorCWJyb2FkY2FzdF9tb3ZlX2JjKGNwdSk7CisKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwppbmRleCAyMGIyZmUzLi4wMTU2NjEyIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKQEAgLTk4LDE4ICs5OCwxOSBAQAogdm9pZCB0aWNrX2hhbmRsZV9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlrdGltZV90IG5leHQ7CisJa3RpbWVfdCBuZXh0ID0gZGV2LT5uZXh0X2V2ZW50OwogCiAJdGlja19wZXJpb2RpYyhjcHUpOwogCiAJaWYgKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQogCQlyZXR1cm47Ci0JLyoKLQkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCi0JICogcGVyaW9kaWMgbW9kZToKLQkgKi8KLQluZXh0ID0ga3RpbWVfYWRkKGRldi0+bmV4dF9ldmVudCwgdGlja19wZXJpb2QpOwogCWZvciAoOzspIHsKKwkJLyoKKwkJICogU2V0dXAgdGhlIG5leHQgcGVyaW9kIGZvciBkZXZpY2VzLCB3aGljaCBkbyBub3QgaGF2ZQorCQkgKiBwZXJpb2RpYyBtb2RlOgorCQkgKi8KKwkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CisKIAkJaWYgKCFjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KGRldiwgbmV4dCwgZmFsc2UpKQogCQkJcmV0dXJuOwogCQkvKgpAQCAtMTE4LDEyICsxMTksMTEgQEAKIAkJICogdG8gYmUgc3VyZSB3ZSdyZSB1c2luZyBhIHJlYWwgaGFyZHdhcmUgY2xvY2tzb3VyY2UuCiAJCSAqIE90aGVyd2lzZSB3ZSBjb3VsZCBnZXQgdHJhcHBlZCBpbiBhbiBpbmZpbml0ZQogCQkgKiBsb29wLCBhcyB0aGUgdGlja19wZXJpb2RpYygpIGluY3JlbWVudHMgamlmZmllcywKLQkJICogd2hlbiB0aGVuIHdpbGwgaW5jcmVtZW50IHRpbWUsIHBvc2libHkgY2F1c2luZworCQkgKiB3aGljaCB0aGVuIHdpbGwgaW5jcmVtZW50IHRpbWUsIHBvc3NpYmx5IGNhdXNpbmcKIAkJICogdGhlIGxvb3AgdG8gdHJpZ2dlciBhZ2FpbiBhbmQgYWdhaW4uCiAJCSAqLwogCQlpZiAodGltZWtlZXBpbmdfdmFsaWRfZm9yX2hyZXMoKSkKIAkJCXRpY2tfcGVyaW9kaWMoY3B1KTsKLQkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmggYi9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmgKaW5kZXggODMyOTY2OS4uN2FiOTJiMSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCisrKyBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaApAQCAtNDYsNyArNDYsNyBAQAogZXh0ZXJuIHZvaWQgdGlja19yZXN1bWVfb25lc2hvdCh2b2lkKTsKICMgaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKLWV4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CitleHRlcm4gaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKTsKIGV4dGVybiBpbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpOwpAQCAtNTgsNyArNTgsNyBAQAogewogCUJVRygpOwogfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCAqY3B1cCkgeyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2FjdGl2ZSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC04Nyw3ICs4Nyw3IEBACiB7CiAJQlVHKCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfcmVzdW1lX2Jyb2FkY2FzdF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQogewpAQCAtMTExLDYgKzExMSw3IEBACiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQKIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KTsKK2ludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKTsKIAogI2Vsc2UgLyogIUJST0FEQ0FTVCAqLwogCkBAIC0xMzMsNiArMTM0LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3N1c3BlbmRfYnJvYWRjYXN0KHZvaWQpIHsgfQogc3RhdGljIGlubGluZSBpbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0KHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19icm9hZGNhc3RfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCQkgICAgIHUzMiBmcmVxKSB7IHJldHVybiAtRU5PREVWOyB9CiAKIC8qCiAgKiBTZXQgdGhlIHBlcmlvZGljIGhhbmRsZXIgaW4gbm9uIGJyb2FkY2FzdCBtb2RlCkBAIC0xNTIsNiArMTU1LDggQEAKIAlyZXR1cm4gIShkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfRFVNTVkpOwogfQogCitpbnQgX19jbG9ja2V2ZW50c191cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKTsKKwogI2VuZGlmCiAKIGV4dGVybiB2b2lkIGRvX3RpbWVyKHVuc2lnbmVkIGxvbmcgdGlja3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggMGFhNGNlODEuLjViNDAyNzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtMTQzNSw3ICsxNDM1LDggQEAKIG91dDoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZWtlZXBlcl9sb2NrLCBmbGFncyk7CiAJaWYgKGNsb2NrX3NldCkKLQkJY2xvY2tfd2FzX3NldCgpOworCQkvKiBIYXZlIHRvIGNhbGwgX2RlbGF5ZWQgdmVyc2lvbiwgc2luY2UgaW4gaXJxIGNvbnRleHQqLworCQljbG9ja193YXNfc2V0X2RlbGF5ZWQoKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmdfZGVidWcuYwppbmRleCA4MDI0MzNhLi40ZDU0Zjk3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAorI2luY2x1ZGUgInRpbWVrZWVwaW5nX2ludGVybmFsLmgiCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdGltZV9iaW5bMzJdID0gezB9OwogCiBzdGF0aWMgaW50IHRrX2RlYnVnX3Nob3dfc2xlZXBfdGltZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IGFjY2ZkMjQuLjg3YmQ1MjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC01Miw3ICs1Miw3IEBACiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvdGltZXIuaD4KIAotdTY0IGppZmZpZXNfNjQgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgPSBJTklUSUFMX0pJRkZJRVM7CitfX3Zpc2libGUgdTY0IGppZmZpZXNfNjQgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgPSBJTklUSUFMX0pJRkZJRVM7CiAKIEVYUE9SVF9TWU1CT0woamlmZmllc182NCk7CiAKQEAgLTgxLDYgKzgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRpbWVyX2ppZmZpZXM7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyOwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3RpbWVyczsKKwl1bnNpZ25lZCBsb25nIGFsbF90aW1lcnM7CiAJc3RydWN0IHR2ZWNfcm9vdCB0djE7CiAJc3RydWN0IHR2ZWMgdHYyOwogCXN0cnVjdCB0dmVjIHR2MzsKQEAgLTMzNyw2ICszMzgsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNldF90aW1lcl9zbGFjayk7CiAKKy8qCisgKiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgY2F0Y2ggdXAgLT50aW1lcl9qaWZmaWVzIHRvIHRoZSBjdXJyZW50IHRpbWUuCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgdHZlY19iYXNlIGxvY2suICBSZXR1cm5zIHRydWUgaWYgdGhlIGxpc3QKKyAqIHdhcyBlbXB0eSBhbmQgdGhlcmVmb3JlIC0+dGltZXJfamlmZmllcyB3YXMgdXBkYXRlZC4KKyAqLworc3RhdGljIGJvb2wgY2F0Y2h1cF90aW1lcl9qaWZmaWVzKHN0cnVjdCB0dmVjX2Jhc2UgKmJhc2UpCit7CisJaWYgKCFiYXNlLT5hbGxfdGltZXJzKSB7CisJCWJhc2UtPnRpbWVyX2ppZmZpZXMgPSBqaWZmaWVzOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZAogX19pbnRlcm5hbF9hZGRfdGltZXIoc3RydWN0IHR2ZWNfYmFzZSAqYmFzZSwgc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogewpAQCAtMzgzLDE1ICszOTgsMTcgQEAKIAogc3RhdGljIHZvaWQgaW50ZXJuYWxfYWRkX3RpbWVyKHN0cnVjdCB0dmVjX2Jhc2UgKmJhc2UsIHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKKwkodm9pZCljYXRjaHVwX3RpbWVyX2ppZmZpZXMoYmFzZSk7CiAJX19pbnRlcm5hbF9hZGRfdGltZXIoYmFzZSwgdGltZXIpOwogCS8qCiAJICogVXBkYXRlIGJhc2UtPmFjdGl2ZV90aW1lcnMgYW5kIGJhc2UtPm5leHRfdGltZXIKIAkgKi8KIAlpZiAoIXRiYXNlX2dldF9kZWZlcnJhYmxlKHRpbWVyLT5iYXNlKSkgewotCQlpZiAodGltZV9iZWZvcmUodGltZXItPmV4cGlyZXMsIGJhc2UtPm5leHRfdGltZXIpKQorCQlpZiAoIWJhc2UtPmFjdGl2ZV90aW1lcnMrKyB8fAorCQkgICAgdGltZV9iZWZvcmUodGltZXItPmV4cGlyZXMsIGJhc2UtPm5leHRfdGltZXIpKQogCQkJYmFzZS0+bmV4dF90aW1lciA9IHRpbWVyLT5leHBpcmVzOwotCQliYXNlLT5hY3RpdmVfdGltZXJzKys7CiAJfQorCWJhc2UtPmFsbF90aW1lcnMrKzsKIH0KIAogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwpAQCAtNjcxLDYgKzY4OCw4IEBACiAJZGV0YWNoX3RpbWVyKHRpbWVyLCB0cnVlKTsKIAlpZiAoIXRiYXNlX2dldF9kZWZlcnJhYmxlKHRpbWVyLT5iYXNlKSkKIAkJYmFzZS0+YWN0aXZlX3RpbWVycy0tOworCWJhc2UtPmFsbF90aW1lcnMtLTsKKwkodm9pZCljYXRjaHVwX3RpbWVyX2ppZmZpZXMoYmFzZSk7CiB9CiAKIHN0YXRpYyBpbnQgZGV0YWNoX2lmX3BlbmRpbmcoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCBzdHJ1Y3QgdHZlY19iYXNlICpiYXNlLApAQCAtNjg1LDYgKzcwNCw4IEBACiAJCWlmICh0aW1lci0+ZXhwaXJlcyA9PSBiYXNlLT5uZXh0X3RpbWVyKQogCQkJYmFzZS0+bmV4dF90aW1lciA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CiAJfQorCWJhc2UtPmFsbF90aW1lcnMtLTsKKwkodm9pZCljYXRjaHVwX3RpbWVyX2ppZmZpZXMoYmFzZSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTczOSwxMiArNzYwLDcgQEAKIAogCWRlYnVnX2FjdGl2YXRlKHRpbWVyLCBleHBpcmVzKTsKIAotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX05PX0haX0NPTU1PTikgJiYgZGVmaW5lZChDT05GSUdfU01QKQotCWlmICghcGlubmVkICYmIGdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgJiYgaWRsZV9jcHUoY3B1KSkKLQkJY3B1ID0gZ2V0X25vaHpfdGltZXJfdGFyZ2V0KCk7Ci0jZW5kaWYKKwljcHUgPSBnZXRfbm9oel90aW1lcl90YXJnZXQocGlubmVkKTsKIAluZXdfYmFzZSA9IHBlcl9jcHUodHZlY19iYXNlcywgY3B1KTsKIAogCWlmIChiYXNlICE9IG5ld19iYXNlKSB7CkBAIC05MzksOCArOTU1LDE1IEBACiAJICogd2l0aCB0aGUgdGltZXIgYnkgaG9sZGluZyB0aGUgdGltZXIgYmFzZSBsb2NrLiBUaGlzIGFsc28KIAkgKiBtYWtlcyBzdXJlIHRoYXQgYSBDUFUgb24gdGhlIHdheSB0byBzdG9wIGl0cyB0aWNrIGNhbiBub3QKIAkgKiBldmFsdWF0ZSB0aGUgdGltZXIgd2hlZWwuCisJICoKKwkgKiBTcGFyZSB0aGUgSVBJIGZvciBkZWZlcnJhYmxlIHRpbWVycyBvbiBpZGxlIHRhcmdldHMgdGhvdWdoLgorCSAqIFRoZSBuZXh0IGJ1c3kgdGlja3Mgd2lsbCB0YWtlIGNhcmUgb2YgaXQuIEV4Y2VwdCBmdWxsIGR5bnRpY2tzCisJICogcmVxdWlyZSBzcGVjaWFsIGNhcmUgYWdhaW5zdCByYWNlcyB3aXRoIGlkbGVfY3B1KCksIGxldHMgZGVhbAorCSAqIHdpdGggdGhhdCBsYXRlci4KIAkgKi8KLQl3YWtlX3VwX25vaHpfY3B1KGNwdSk7CisJaWYgKCF0YmFzZV9nZXRfZGVmZXJyYWJsZSh0aW1lci0+YmFzZSkgfHwgdGlja19ub2h6X2Z1bGxfY3B1KGNwdSkpCisJCXdha2VfdXBfbm9oel9jcHUoY3B1KTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF90aW1lcl9vbik7CkBAIC0xMTQ2LDYgKzExNjksMTAgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXI7CiAKIAlzcGluX2xvY2tfaXJxKCZiYXNlLT5sb2NrKTsKKwlpZiAoY2F0Y2h1cF90aW1lcl9qaWZmaWVzKGJhc2UpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJCXJldHVybjsKKwl9CiAJd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCB3b3JrX2xpc3Q7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmd29ya19saXN0OwpAQCAtMTE2MCw3ICsxMTg3LDcgQEAKIAkJCQkJIWNhc2NhZGUoYmFzZSwgJmJhc2UtPnR2NCwgSU5ERVgoMikpKQogCQkJY2FzY2FkZShiYXNlLCAmYmFzZS0+dHY1LCBJTkRFWCgzKSk7CiAJCSsrYmFzZS0+dGltZXJfamlmZmllczsKLQkJbGlzdF9yZXBsYWNlX2luaXQoYmFzZS0+dHYxLnZlYyArIGluZGV4LCAmd29ya19saXN0KTsKKwkJbGlzdF9yZXBsYWNlX2luaXQoYmFzZS0+dHYxLnZlYyArIGluZGV4LCBoZWFkKTsKIAkJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCQl2b2lkICgqZm4pKHVuc2lnbmVkIGxvbmcpOwogCQkJdW5zaWduZWQgbG9uZyBkYXRhOwpAQCAtMTUyMyw5ICsxNTUwLDggQEAKIAkJCWlmICghYmFzZSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJLyogTWFrZSBzdXJlIHRoYXQgdHZlY19iYXNlIGlzIDIgYnl0ZSBhbGlnbmVkICovCi0JCQlpZiAodGJhc2VfZ2V0X2RlZmVycmFibGUoYmFzZSkpIHsKLQkJCQlXQVJOX09OKDEpOworCQkJLyogTWFrZSBzdXJlIHR2ZWNfYmFzZSBoYXMgVElNRVJfRkxBR19NQVNLIGJpdHMgZnJlZSAqLworCQkJaWYgKFdBUk5fT04oYmFzZSAhPSB0YmFzZV9nZXRfYmFzZShiYXNlKSkpIHsKIAkJCQlrZnJlZShiYXNlKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KQEAgLTE1NTksNiArMTU4NSw3IEBACiAJYmFzZS0+dGltZXJfamlmZmllcyA9IGppZmZpZXM7CiAJYmFzZS0+bmV4dF90aW1lciA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CiAJYmFzZS0+YWN0aXZlX3RpbWVycyA9IDA7CisJYmFzZS0+YWxsX3RpbWVycyA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NDgsOSArMTY3NSw5IEBACiAKIAllcnIgPSB0aW1lcl9jcHVfbm90aWZ5KCZ0aW1lcnNfbmIsICh1bnNpZ25lZCBsb25nKUNQVV9VUF9QUkVQQVJFLAogCQkJICAgICAgICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpbml0X3RpbWVyX3N0YXRzKCk7Ci0KIAlCVUdfT04oZXJyICE9IE5PVElGWV9PSyk7CisKKwlpbml0X3RpbWVyX3N0YXRzKCk7CiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ0aW1lcnNfbmIpOwogCW9wZW5fc29mdGlycShUSU1FUl9TT0ZUSVJRLCBydW5fdGltZXJfc29mdGlycSk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdG9ydHVyZS5jIGIva2VybmVsL3RvcnR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M5YWZjCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RvcnR1cmUuYwpAQCAtMCwwICsxLDcxOSBAQAorLyoKKyAqIENvbW1vbiBmdW5jdGlvbnMgZm9yIGluLWtlcm5lbCB0b3J0dXJlIHRlc3RzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDE0CisgKgorICogQXV0aG9yOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQHVzLmlibS5jb20+CisgKglCYXNlZCBvbiBrZXJuZWwvcmN1L3RvcnR1cmUuYy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlX2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcnR1cmUuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPiIpOworCitzdGF0aWMgY2hhciAqdG9ydHVyZV90eXBlOworc3RhdGljIGJvb2wgdmVyYm9zZTsKKworLyogTWVkaWF0ZSBybW1vZCBhbmQgc3lzdGVtIHNodXRkb3duLiAgQ29uY3VycmVudCBybW1vZCAmIHNodXRkb3duIGlsbGVnYWwhICovCisjZGVmaW5lIEZVTExTVE9QX0RPTlRTVE9QIDAJLyogTm9ybWFsIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgRlVMTFNUT1BfU0hVVERPV04gMQkvKiBTeXN0ZW0gc2h1dGRvd24gd2l0aCB0b3J0dXJlIHJ1bm5pbmcuICovCisjZGVmaW5lIEZVTExTVE9QX1JNTU9EICAgIDIJLyogTm9ybWFsIHJtbW9kIG9mIHRvcnR1cmUuICovCitzdGF0aWMgaW50IGZ1bGxzdG9wID0gRlVMTFNUT1BfUk1NT0Q7CitzdGF0aWMgREVGSU5FX01VVEVYKGZ1bGxzdG9wX211dGV4KTsKK3N0YXRpYyBpbnQgKnRvcnR1cmVfcnVubmFibGU7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworLyoKKyAqIFZhcmlhYmxlcyBmb3Igb25saW5lLW9mZmxpbmUgaGFuZGxpbmcuICBPbmx5IHByZXNlbnQgaWYgQ1BVIGhvdHBsdWcKKyAqIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgKi8KKworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqb25vZmZfdGFzazsKK3N0YXRpYyBsb25nIG9ub2ZmX2hvbGRvZmY7CitzdGF0aWMgbG9uZyBvbm9mZl9pbnRlcnZhbDsKK3N0YXRpYyBsb25nIG5fb2ZmbGluZV9hdHRlbXB0czsKK3N0YXRpYyBsb25nIG5fb2ZmbGluZV9zdWNjZXNzZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdW1fb2ZmbGluZTsKK3N0YXRpYyBpbnQgbWluX29mZmxpbmUgPSAtMTsKK3N0YXRpYyBpbnQgbWF4X29mZmxpbmU7CitzdGF0aWMgbG9uZyBuX29ubGluZV9hdHRlbXB0czsKK3N0YXRpYyBsb25nIG5fb25saW5lX3N1Y2Nlc3NlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1bV9vbmxpbmU7CitzdGF0aWMgaW50IG1pbl9vbmxpbmUgPSAtMTsKK3N0YXRpYyBpbnQgbWF4X29ubGluZTsKKworLyoKKyAqIEV4ZWN1dGUgcmFuZG9tIENQVS1ob3RwbHVnIG9wZXJhdGlvbnMgYXQgdGhlIGludGVydmFsIHNwZWNpZmllZAorICogYnkgdGhlIG9ub2ZmX2ludGVydmFsLgorICovCitzdGF0aWMgaW50Cit0b3J0dXJlX29ub2ZmKHZvaWQgKmFyZykKK3sKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CisJaW50IG1heGNwdSA9IC0xOworCURFRklORV9UT1JUVVJFX1JBTkRPTShyYW5kKTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc3RhcnR0aW1lOworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX29ub2ZmIHRhc2sgc3RhcnRlZCIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQltYXhjcHUgPSBjcHU7CisJV0FSTl9PTihtYXhjcHUgPCAwKTsKKwlpZiAob25vZmZfaG9sZG9mZiA+IDApIHsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX29ub2ZmIGJlZ2luIGhvbGRvZmYiKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG9ub2ZmX2hvbGRvZmYpOworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInRvcnR1cmVfb25vZmYgZW5kIGhvbGRvZmYiKTsKKwl9CisJd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKSB7CisJCWNwdSA9ICh0b3J0dXJlX3JhbmRvbSgmcmFuZCkgPj4gNCkgJSAobWF4Y3B1ICsgMSk7CisJCWlmIChjcHVfb25saW5lKGNwdSkgJiYgY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkgInRvcnR1cmVfb25vZmYgdGFzazogb2ZmbGluaW5nICVkXG4iLAorCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUpOworCQkJc3RhcnR0aW1lID0gamlmZmllczsKKwkJCW5fb2ZmbGluZV9hdHRlbXB0cysrOworCQkJcmV0ID0gY3B1X2Rvd24oY3B1KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJCQkJCSAidG9ydHVyZV9vbm9mZiB0YXNrOiBvZmZsaW5lICVkIGZhaWxlZDogZXJybm8gJWRcbiIsCisJCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUsIHJldCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkJICJ0b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmVkICVkXG4iLAorCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCQluX29mZmxpbmVfc3VjY2Vzc2VzKys7CisJCQkJZGVsdGEgPSBqaWZmaWVzIC0gc3RhcnR0aW1lOworCQkJCXN1bV9vZmZsaW5lICs9IGRlbHRhOworCQkJCWlmIChtaW5fb2ZmbGluZSA8IDApIHsKKwkJCQkJbWluX29mZmxpbmUgPSBkZWx0YTsKKwkJCQkJbWF4X29mZmxpbmUgPSBkZWx0YTsKKwkJCQl9CisJCQkJaWYgKG1pbl9vZmZsaW5lID4gZGVsdGEpCisJCQkJCW1pbl9vZmZsaW5lID0gZGVsdGE7CisJCQkJaWYgKG1heF9vZmZsaW5lIDwgZGVsdGEpCisJCQkJCW1heF9vZmZsaW5lID0gZGVsdGE7CisJCQl9CisJCX0gZWxzZSBpZiAoY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkgInRvcnR1cmVfb25vZmYgdGFzazogb25saW5pbmcgJWRcbiIsCisJCQkJCSB0b3J0dXJlX3R5cGUsIGNwdSk7CisJCQlzdGFydHRpbWUgPSBqaWZmaWVzOworCQkJbl9vbmxpbmVfYXR0ZW1wdHMrKzsKKwkJCXJldCA9IGNwdV91cChjcHUpOworCQkJaWYgKHJldCkgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkJICJ0b3J0dXJlX29ub2ZmIHRhc2s6IG9ubGluZSAlZCBmYWlsZWQ6IGVycm5vICVkXG4iLAorCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1LCByZXQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJCQkJCSAidG9ydHVyZV9vbm9mZiB0YXNrOiBvbmxpbmVkICVkXG4iLAorCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCQluX29ubGluZV9zdWNjZXNzZXMrKzsKKwkJCQlkZWx0YSA9IGppZmZpZXMgLSBzdGFydHRpbWU7CisJCQkJc3VtX29ubGluZSArPSBkZWx0YTsKKwkJCQlpZiAobWluX29ubGluZSA8IDApIHsKKwkJCQkJbWluX29ubGluZSA9IGRlbHRhOworCQkJCQltYXhfb25saW5lID0gZGVsdGE7CisJCQkJfQorCQkJCWlmIChtaW5fb25saW5lID4gZGVsdGEpCisJCQkJCW1pbl9vbmxpbmUgPSBkZWx0YTsKKwkJCQlpZiAobWF4X29ubGluZSA8IGRlbHRhKQorCQkJCQltYXhfb25saW5lID0gZGVsdGE7CisJCQl9CisJCX0KKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG9ub2ZmX2ludGVydmFsKTsKKwl9CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJ0b3J0dXJlX29ub2ZmIik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCisKKy8qCisgKiBJbml0aWF0ZSBvbmxpbmUtb2ZmbGluZSBoYW5kbGluZy4KKyAqLworaW50IHRvcnR1cmVfb25vZmZfaW5pdChsb25nIG9vaG9sZG9mZiwgbG9uZyBvb2ludGVydmFsKQoreworCWludCByZXQgPSAwOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJb25vZmZfaG9sZG9mZiA9IG9vaG9sZG9mZjsKKwlvbm9mZl9pbnRlcnZhbCA9IG9vaW50ZXJ2YWw7CisJaWYgKG9ub2ZmX2ludGVydmFsIDw9IDApCisJCXJldHVybiAwOworCXJldCA9IHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQodG9ydHVyZV9vbm9mZiwgTlVMTCwgb25vZmZfdGFzayk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX29ub2ZmX2luaXQpOworCisvKgorICogQ2xlYW4gdXAgYWZ0ZXIgb25saW5lL29mZmxpbmUgdGVzdGluZy4KKyAqLworc3RhdGljIHZvaWQgdG9ydHVyZV9vbm9mZl9jbGVhbnVwKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKG9ub2ZmX3Rhc2sgPT0gTlVMTCkKKwkJcmV0dXJuOworCVZFUkJPU0VfVE9ST1VUX1NUUklORygiU3RvcHBpbmcgdG9ydHVyZV9vbm9mZiB0YXNrIik7CisJa3RocmVhZF9zdG9wKG9ub2ZmX3Rhc2spOworCW9ub2ZmX3Rhc2sgPSBOVUxMOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfb25vZmZfY2xlYW51cCk7CisKKy8qCisgKiBQcmludCBvbmxpbmUvb2ZmbGluZSB0ZXN0aW5nIHN0YXRpc3RpY3MuCisgKi8KK2NoYXIgKnRvcnR1cmVfb25vZmZfc3RhdHMoY2hhciAqcGFnZSkKK3sKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlwYWdlICs9IHNwcmludGYocGFnZSwKKwkJICAgICAgICJvbm9mZjogJWxkLyVsZDolbGQvJWxkICVkLCVkOiVkLCVkICVsdTolbHUgKEhaPSVkKSAiLAorCQkgICAgICAgbl9vbmxpbmVfc3VjY2Vzc2VzLCBuX29ubGluZV9hdHRlbXB0cywKKwkJICAgICAgIG5fb2ZmbGluZV9zdWNjZXNzZXMsIG5fb2ZmbGluZV9hdHRlbXB0cywKKwkJICAgICAgIG1pbl9vbmxpbmUsIG1heF9vbmxpbmUsCisJCSAgICAgICBtaW5fb2ZmbGluZSwgbWF4X29mZmxpbmUsCisJCSAgICAgICBzdW1fb25saW5lLCBzdW1fb2ZmbGluZSwgSFopOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwlyZXR1cm4gcGFnZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfb25vZmZfc3RhdHMpOworCisvKgorICogV2VyZSBhbGwgdGhlIG9ubGluZS9vZmZsaW5lIG9wZXJhdGlvbnMgc3VjY2Vzc2Z1bD8KKyAqLworYm9vbCB0b3J0dXJlX29ub2ZmX2ZhaWx1cmVzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJcmV0dXJuIG5fb25saW5lX3N1Y2Nlc3NlcyAhPSBuX29ubGluZV9hdHRlbXB0cyB8fAorCSAgICAgICBuX29mZmxpbmVfc3VjY2Vzc2VzICE9IG5fb2ZmbGluZV9hdHRlbXB0czsKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9vbm9mZl9mYWlsdXJlcyk7CisKKyNkZWZpbmUgVE9SVFVSRV9SQU5ET01fTVVMVAkzOTkxNjgwMSAgLyogcHJpbWUgKi8KKyNkZWZpbmUgVE9SVFVSRV9SQU5ET01fQURECTQ3OTAwMTcwMSAvKiBwcmltZSAqLworI2RlZmluZSBUT1JUVVJFX1JBTkRPTV9SRUZSRVNICTEwMDAwCisKKy8qCisgKiBDcnVkZSBidXQgZmFzdCByYW5kb20tbnVtYmVyIGdlbmVyYXRvci4gIFVzZXMgYSBsaW5lYXIgY29uZ3J1ZW50aWFsCisgKiBnZW5lcmF0b3IsIHdpdGggb2NjYXNpb25hbCBoZWxwIGZyb20gY3B1X2Nsb2NrKCkuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RvcnR1cmVfcmFuZG9tKHN0cnVjdCB0b3J0dXJlX3JhbmRvbV9zdGF0ZSAqdHJzcCkKK3sKKwlpZiAoLS10cnNwLT50cnNfY291bnQgPCAwKSB7CisJCXRyc3AtPnRyc19zdGF0ZSArPSAodW5zaWduZWQgbG9uZylsb2NhbF9jbG9jaygpOworCQl0cnNwLT50cnNfY291bnQgPSBUT1JUVVJFX1JBTkRPTV9SRUZSRVNIOworCX0KKwl0cnNwLT50cnNfc3RhdGUgPSB0cnNwLT50cnNfc3RhdGUgKiBUT1JUVVJFX1JBTkRPTV9NVUxUICsKKwkJVE9SVFVSRV9SQU5ET01fQUREOworCXJldHVybiBzd2FodzMyKHRyc3AtPnRyc19zdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3JhbmRvbSk7CisKKy8qCisgKiBWYXJpYWJsZXMgZm9yIHNodWZmbGluZy4gIFRoZSBpZGVhIGlzIHRvIGVuc3VyZSB0aGF0IGVhY2ggQ1BVIHN0YXlzCisgKiBpZGxlIGZvciBhbiBleHRlbmRlZCBwZXJpb2QgdG8gdGVzdCBpbnRlcmFjdGlvbnMgd2l0aCBkeW50aWNrIGlkbGUsCisgKiBhcyB3ZWxsIGFzIGludGVyYWN0aW9ucyB3aXRoIGFueSBwZXItQ1BVIHZhcmlibGVzLgorICovCitzdHJ1Y3Qgc2h1ZmZsZV90YXNrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0X2w7CisJc3RydWN0IHRhc2tfc3RydWN0ICpzdF90OworfTsKKworc3RhdGljIGxvbmcgc2h1ZmZsZV9pbnRlcnZhbDsJLyogSW4gamlmZmllcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNodWZmbGVyX3Rhc2s7CitzdGF0aWMgY3B1bWFza192YXJfdCBzaHVmZmxlX3RtcF9tYXNrOworc3RhdGljIGludCBzaHVmZmxlX2lkbGVfY3B1OwkvKiBGb3JjZSBhbGwgdG9ydHVyZSB0YXNrcyBvZmYgdGhpcyBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNodWZmbGVfdGFza19saXN0ID0gTElTVF9IRUFEX0lOSVQoc2h1ZmZsZV90YXNrX2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChzaHVmZmxlX3Rhc2tfbXV0ZXgpOworCisvKgorICogUmVnaXN0ZXIgYSB0YXNrIHRvIGJlIHNodWZmbGVkLiAgSWYgdGhlcmUgaXMgbm8gbWVtb3J5LCBqdXN0IHNwbGF0CisgKiBhbmQgZG9uJ3QgYm90aGVyIHJlZ2lzdGVyaW5nLgorICovCit2b2lkIHRvcnR1cmVfc2h1ZmZsZV90YXNrX3JlZ2lzdGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHApCit7CisJc3RydWN0IHNodWZmbGVfdGFzayAqc3RwOworCisJaWYgKFdBUk5fT05fT05DRSh0cCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCXN0cCA9IGttYWxsb2Moc2l6ZW9mKCpzdHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoV0FSTl9PTl9PTkNFKHN0cCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCXN0cC0+c3RfdCA9IHRwOworCW11dGV4X2xvY2soJnNodWZmbGVfdGFza19tdXRleCk7CisJbGlzdF9hZGQoJnN0cC0+c3RfbCwgJnNodWZmbGVfdGFza19saXN0KTsKKwltdXRleF91bmxvY2soJnNodWZmbGVfdGFza19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodWZmbGVfdGFza19yZWdpc3Rlcik7CisKKy8qCisgKiBVbnJlZ2lzdGVyIGFsbCB0YXNrcywgZm9yIGV4YW1wbGUsIGF0IHRoZSBlbmQgb2YgdGhlIHRvcnR1cmUgcnVuLgorICovCitzdGF0aWMgdm9pZCB0b3J0dXJlX3NodWZmbGVfdGFza191bnJlZ2lzdGVyX2FsbCh2b2lkKQoreworCXN0cnVjdCBzaHVmZmxlX3Rhc2sgKnN0cDsKKwlzdHJ1Y3Qgc2h1ZmZsZV90YXNrICpwOworCisJbXV0ZXhfbG9jaygmc2h1ZmZsZV90YXNrX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3RwLCBwLCAmc2h1ZmZsZV90YXNrX2xpc3QsIHN0X2wpIHsKKwkJbGlzdF9kZWwoJnN0cC0+c3RfbCk7CisJCWtmcmVlKHN0cCk7CisJfQorCW11dGV4X3VubG9jaygmc2h1ZmZsZV90YXNrX211dGV4KTsKK30KKworLyogU2h1ZmZsZSB0YXNrcyBzdWNoIHRoYXQgd2UgYWxsb3cgc2h1ZmZsZV9pZGxlX2NwdSB0byBiZWNvbWUgaWRsZS4KKyAqIEEgc3BlY2lhbCBjYXNlIGlzIHdoZW4gc2h1ZmZsZV9pZGxlX2NwdSA9IC0xLCBpbiB3aGljaCBjYXNlIHdlIGFsbG93CisgKiB0aGUgdGFza3MgdG8gcnVuIG9uIGFsbCBDUFVzLgorICovCitzdGF0aWMgdm9pZCB0b3J0dXJlX3NodWZmbGVfdGFza3Modm9pZCkKK3sKKwlzdHJ1Y3Qgc2h1ZmZsZV90YXNrICpzdHA7CisKKwljcHVtYXNrX3NldGFsbChzaHVmZmxlX3RtcF9tYXNrKTsKKwlnZXRfb25saW5lX2NwdXMoKTsKKworCS8qIE5vIHBvaW50IGluIHNodWZmbGluZyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBvbmxpbmUgQ1BVIChleDogVVApICovCisJaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpIHsKKwkJcHV0X29ubGluZV9jcHVzKCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IENQVS4gIFVwb24gb3ZlcmZsb3csIGRvbid0IGlkbGUgYW55IENQVXMuICovCisJc2h1ZmZsZV9pZGxlX2NwdSA9IGNwdW1hc2tfbmV4dChzaHVmZmxlX2lkbGVfY3B1LCBzaHVmZmxlX3RtcF9tYXNrKTsKKwlpZiAoc2h1ZmZsZV9pZGxlX2NwdSA+PSBucl9jcHVfaWRzKQorCQlzaHVmZmxlX2lkbGVfY3B1ID0gLTE7CisJaWYgKHNodWZmbGVfaWRsZV9jcHUgIT0gLTEpIHsKKwkJY3B1bWFza19jbGVhcl9jcHUoc2h1ZmZsZV9pZGxlX2NwdSwgc2h1ZmZsZV90bXBfbWFzayk7CisJCWlmIChjcHVtYXNrX2VtcHR5KHNodWZmbGVfdG1wX21hc2spKSB7CisJCQlwdXRfb25saW5lX2NwdXMoKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW11dGV4X2xvY2soJnNodWZmbGVfdGFza19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHAsICZzaHVmZmxlX3Rhc2tfbGlzdCwgc3RfbCkKKwkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoc3RwLT5zdF90LCBzaHVmZmxlX3RtcF9tYXNrKTsKKwltdXRleF91bmxvY2soJnNodWZmbGVfdGFza19tdXRleCk7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworLyogU2h1ZmZsZSB0YXNrcyBhY3Jvc3MgQ1BVcywgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIGVhY2ggQ1BVIGluIHRoZQorICogc3lzdGVtIHRvIGJlY29tZSBpZGxlIGF0IGEgdGltZSBhbmQgY3V0IG9mZiBpdHMgdGltZXIgdGlja3MuIFRoaXMgaXMgbWVhbnQKKyAqIHRvIHRlc3QgdGhlIHN1cHBvcnQgZm9yIHN1Y2ggdGlja2xlc3MgaWRsZSBDUFUgaW4gUkNVLgorICovCitzdGF0aWMgaW50IHRvcnR1cmVfc2h1ZmZsZSh2b2lkICphcmcpCit7CisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodWZmbGUgdGFzayBzdGFydGVkIik7CisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2h1ZmZsZV9pbnRlcnZhbCk7CisJCXRvcnR1cmVfc2h1ZmZsZV90YXNrcygpOworCQl0b3J0dXJlX3NodXRkb3duX2Fic29yYigidG9ydHVyZV9zaHVmZmxlIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygidG9ydHVyZV9zaHVmZmxlIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgc2h1ZmZsZXIsIHdpdGggc2h1ZmZpbnQgaW4gamlmZmllcy4KKyAqLworaW50IHRvcnR1cmVfc2h1ZmZsZV9pbml0KGxvbmcgc2h1ZmZpbnQpCit7CisJc2h1ZmZsZV9pbnRlcnZhbCA9IHNodWZmaW50OworCisJc2h1ZmZsZV9pZGxlX2NwdSA9IC0xOworCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmc2h1ZmZsZV90bXBfbWFzaywgR0ZQX0tFUk5FTCkpIHsKKwkJVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKCJGYWlsZWQgdG8gYWxsb2MgbWFzayIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIHNodWZmbGVyIHRocmVhZCAqLworCXJldHVybiB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc2h1ZmZsZSwgTlVMTCwgc2h1ZmZsZXJfdGFzayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodWZmbGVfaW5pdCk7CisKKy8qCisgKiBTdG9wIHRoZSBzaHVmZmxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHRvcnR1cmVfc2h1ZmZsZV9jbGVhbnVwKHZvaWQpCit7CisJdG9ydHVyZV9zaHVmZmxlX3Rhc2tfdW5yZWdpc3Rlcl9hbGwoKTsKKwlpZiAoc2h1ZmZsZXJfdGFzaykgeworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoIlN0b3BwaW5nIHRvcnR1cmVfc2h1ZmZsZSB0YXNrIik7CisJCWt0aHJlYWRfc3RvcChzaHVmZmxlcl90YXNrKTsKKwkJZnJlZV9jcHVtYXNrX3ZhcihzaHVmZmxlX3RtcF9tYXNrKTsKKwl9CisJc2h1ZmZsZXJfdGFzayA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodWZmbGVfY2xlYW51cCk7CisKKy8qCisgKiBWYXJpYWJsZXMgZm9yIGF1dG8tc2h1dGRvd24uICBUaGlzIGFsbG93cyAibGlnaHRzIG91dCIgdG9ydHVyZSBydW5zCisgKiB0byBiZSBmdWxseSBzY3JpcHRlZC4KKyAqLworc3RhdGljIGludCBzaHV0ZG93bl9zZWNzOwkJLyogZGVzaXJlZCB0ZXN0IGR1cmF0aW9uIGluIHNlY29uZHMuICovCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzaHV0ZG93bl90YXNrOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2h1dGRvd25fdGltZTsJLyogamlmZmllcyB0byBzeXN0ZW0gc2h1dGRvd24uICovCitzdGF0aWMgdm9pZCAoKnRvcnR1cmVfc2h1dGRvd25faG9vaykodm9pZCk7CisKKy8qCisgKiBBYnNvcmIga3RocmVhZHMgaW50byBhIGtlcm5lbCBmdW5jdGlvbiB0aGF0IHdvbid0IHJldHVybiwgc28gdGhhdAorICogdGhleSB3b24ndCBldmVyIGFjY2VzcyBtb2R1bGUgdGV4dCBvciBkYXRhIGFnYWluLgorICovCit2b2lkIHRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKGNvbnN0IGNoYXIgKnRpdGxlKQoreworCXdoaWxlIChBQ0NFU1NfT05DRShmdWxsc3RvcCkgPT0gRlVMTFNUT1BfU0hVVERPV04pIHsKKwkJcHJfbm90aWNlKCJ0b3J0dXJlIHRocmVhZCAlcyBwYXJraW5nIGR1ZSB0byBzeXN0ZW0gc2h1dGRvd25cbiIsCisJCQkgIHRpdGxlKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKTsKKworLyoKKyAqIENhdXNlIHRoZSB0b3J0dXJlIHRlc3QgdG8gc2h1dGRvd24gdGhlIHN5c3RlbSBhZnRlciB0aGUgdGVzdCBoYXMKKyAqIHJ1biBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSBzaHV0ZG93bl9zZWNzIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCB0b3J0dXJlX3NodXRkb3duKHZvaWQgKmFyZykKK3sKKwlsb25nIGRlbHRhOworCXVuc2lnbmVkIGxvbmcgamlmZmllc19zbmFwOworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodXRkb3duIHRhc2sgc3RhcnRlZCIpOworCWppZmZpZXNfc25hcCA9IGppZmZpZXM7CisJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzX3NuYXAsIHNodXRkb3duX3RpbWUpICYmCisJICAgICAgICF0b3J0dXJlX211c3Rfc3RvcCgpKSB7CisJCWRlbHRhID0gc2h1dGRvd25fdGltZSAtIGppZmZpZXNfc25hcDsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCSAidG9ydHVyZV9zaHV0ZG93biB0YXNrOiAlbHUgamlmZmllcyByZW1haW5pbmdcbiIsCisJCQkJIHRvcnR1cmVfdHlwZSwgZGVsdGEpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGVsdGEpOworCQlqaWZmaWVzX3NuYXAgPSBqaWZmaWVzOworCX0KKwlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkgeworCQl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInRvcnR1cmVfc2h1dGRvd24iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT0ssIHNodXQgZG93biB0aGUgc3lzdGVtLiAqLworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodXRkb3duIHRhc2sgc2h1dHRpbmcgZG93biBzeXN0ZW0iKTsKKwlzaHV0ZG93bl90YXNrID0gTlVMTDsJLyogQXZvaWQgc2VsZi1raWxsIGRlYWRsb2NrLiAqLworCWlmICh0b3J0dXJlX3NodXRkb3duX2hvb2spCisJCXRvcnR1cmVfc2h1dGRvd25faG9vaygpOworCWVsc2UKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJObyB0b3J0dXJlX3NodXRkb3duX2hvb2soKSwgc2tpcHBpbmcuIik7CisJa2VybmVsX3Bvd2VyX29mZigpOwkvKiBTaHV0IGRvd24gdGhlIHN5c3RlbS4gKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXJ0IHVwIHRoZSBzaHV0ZG93biB0YXNrLgorICovCitpbnQgdG9ydHVyZV9zaHV0ZG93bl9pbml0KGludCBzc2Vjcywgdm9pZCAoKmNsZWFudXApKHZvaWQpKQoreworCWludCByZXQgPSAwOworCisJc2h1dGRvd25fc2VjcyA9IHNzZWNzOworCXRvcnR1cmVfc2h1dGRvd25faG9vayA9IGNsZWFudXA7CisJaWYgKHNodXRkb3duX3NlY3MgPiAwKSB7CisJCXNodXRkb3duX3RpbWUgPSBqaWZmaWVzICsgc2h1dGRvd25fc2VjcyAqIEhaOworCQlyZXQgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc2h1dGRvd24sIE5VTEwsCisJCQkJCSAgICAgc2h1dGRvd25fdGFzayk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodXRkb3duX2luaXQpOworCisvKgorICogRGV0ZWN0IGFuZCByZXNwb25kIHRvIGEgc3lzdGVtIHNodXRkb3duLgorICovCitzdGF0aWMgaW50IHRvcnR1cmVfc2h1dGRvd25fbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkMSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHVudXNlZDIsIHZvaWQgKnVudXNlZDMpCit7CisJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOworCWlmIChBQ0NFU1NfT05DRShmdWxsc3RvcCkgPT0gRlVMTFNUT1BfRE9OVFNUT1ApIHsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJVbnNjaGVkdWxlZCBzeXN0ZW0gc2h1dGRvd24gZGV0ZWN0ZWQiKTsKKwkJQUNDRVNTX09OQ0UoZnVsbHN0b3ApID0gRlVMTFNUT1BfU0hVVERPV047CisJfSBlbHNlIHsKKwkJcHJfd2FybigiQ29uY3VycmVudCBybW1vZCBhbmQgc2h1dGRvd24gaWxsZWdhbCFcbiIpOworCX0KKwltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdG9ydHVyZV9zaHV0ZG93bl9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRvcnR1cmVfc2h1dGRvd25fbm90aWZ5LAorfTsKKworLyoKKyAqIFNodXQgZG93biB0aGUgc2h1dGRvd24gdGFzay4gIFNheSB3aGF0Pz8/ICBIZWghICBUaGlzIGNhbiBoYXBwZW4gaWYKKyAqIHRoZSB0b3J0dXJlIG1vZHVsZSBnZXRzIGFuIHJtbW9kIGJlZm9yZSB0aGUgc2h1dGRvd24gdGltZSBhcnJpdmVzLiAgOy0pCisgKi8KK3N0YXRpYyB2b2lkIHRvcnR1cmVfc2h1dGRvd25fY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ0b3J0dXJlX3NodXRkb3duX25iKTsKKwlpZiAoc2h1dGRvd25fdGFzayAhPSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX1NUUklORygiU3RvcHBpbmcgdG9ydHVyZV9zaHV0ZG93biB0YXNrIik7CisJCWt0aHJlYWRfc3RvcChzaHV0ZG93bl90YXNrKTsKKwl9CisJc2h1dGRvd25fdGFzayA9IE5VTEw7Cit9CisKKy8qCisgKiBWYXJpYWJsZXMgZm9yIHN0dXR0ZXJpbmcsIHdoaWNoIG1lYW5zIHRvIHBlcmlvZGljYWxseSBwYXVzZSBhbmQKKyAqIHJlc3RhcnQgdGVzdGluZyBpbiBvcmRlciB0byBjYXRjaCBidWdzIHRoYXQgYXBwZWFyIHdoZW4gbG9hZCBpcworICogc3VkZGVubHkgYXBwbGllZCB0byBvciByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3R1dHRlcl90YXNrOworc3RhdGljIGludCBzdHV0dGVyX3BhdXNlX3Rlc3Q7CitzdGF0aWMgaW50IHN0dXR0ZXI7CisKKy8qCisgKiBCbG9jayB1bnRpbCB0aGUgc3R1dHRlciBpbnRlcnZhbCBlbmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKKyAqIGJ5IGFsbCBydW5uaW5nIGt0aHJlYWRzIHRoYXQgbmVlZCB0byBiZSBzdWJqZWN0IHRvIHN0dXR0ZXJpbmcuCisgKi8KK3ZvaWQgc3R1dHRlcl93YWl0KGNvbnN0IGNoYXIgKnRpdGxlKQoreworCXdoaWxlIChBQ0NFU1NfT05DRShzdHV0dGVyX3BhdXNlX3Rlc3QpIHx8CisJICAgICAgICh0b3J0dXJlX3J1bm5hYmxlICYmICFBQ0NFU1NfT05DRSgqdG9ydHVyZV9ydW5uYWJsZSkpKSB7CisJCWlmIChzdHV0dGVyX3BhdXNlX3Rlc3QpCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CisJCWVsc2UKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKHRpdGxlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHV0dGVyX3dhaXQpOworCisvKgorICogQ2F1c2UgdGhlIHRvcnR1cmUgdGVzdCB0byAic3R1dHRlciIsIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBhbGwKKyAqIHRocmVhZHMgcGVyaW9kaWNhbGx5LgorICovCitzdGF0aWMgaW50IHRvcnR1cmVfc3R1dHRlcih2b2lkICphcmcpCit7CisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3N0dXR0ZXIgdGFzayBzdGFydGVkIik7CisJZG8geworCQlpZiAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpIHsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdHV0dGVyKTsKKwkJCUFDQ0VTU19PTkNFKHN0dXR0ZXJfcGF1c2VfdGVzdCkgPSAxOworCQl9CisJCWlmICghdG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdHV0dGVyKTsKKwkJQUNDRVNTX09OQ0Uoc3R1dHRlcl9wYXVzZV90ZXN0KSA9IDA7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJ0b3J0dXJlX3N0dXR0ZXIiKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJ0b3J0dXJlX3N0dXR0ZXIiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYW5kIGtpY2sgb2ZmIHRoZSB0b3J0dXJlX3N0dXR0ZXIga3RocmVhZC4KKyAqLworaW50IHRvcnR1cmVfc3R1dHRlcl9pbml0KGludCBzKQoreworCWludCByZXQ7CisKKwlzdHV0dGVyID0gczsKKwlyZXQgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc3R1dHRlciwgTlVMTCwgc3R1dHRlcl90YXNrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9zdHV0dGVyX2luaXQpOworCisvKgorICogQ2xlYW51cCBhZnRlciB0aGUgdG9ydHVyZV9zdHV0dGVyIGt0aHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkIHRvcnR1cmVfc3R1dHRlcl9jbGVhbnVwKHZvaWQpCit7CisJaWYgKCFzdHV0dGVyX3Rhc2spCisJCXJldHVybjsKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoIlN0b3BwaW5nIHRvcnR1cmVfc3R1dHRlciB0YXNrIik7CisJa3RocmVhZF9zdG9wKHN0dXR0ZXJfdGFzayk7CisJc3R1dHRlcl90YXNrID0gTlVMTDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdG9ydHVyZSBtb2R1bGUuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgLW5vdC0gaW52b2tlZCB2aWEKKyAqIHRoZSB1c3VhbCBtb2R1bGVfaW5pdCgpIG1lY2hhbmlzbSwgYnV0IHJhdGhlciBieSBhbiBleHBsaWNpdCBjYWxsIGZyb20KKyAqIHRoZSBjbGllbnQgdG9ydHVyZSBtb2R1bGUuICBUaGlzIGNhbGwgbXVzdCBiZSBwYWlyZWQgd2l0aCBhIGxhdGVyCisgKiB0b3J0dXJlX2luaXRfZW5kKCkuCisgKgorICogVGhlIHJ1bm5hYmxlIHBhcmFtZXRlciBwb2ludHMgdG8gYSBmbGFnIHRoYXQgY29udHJvbHMgd2hldGhlciBvciBub3QKKyAqIHRoZSB0ZXN0IGlzIGN1cnJlbnRseSBydW5uYWJsZS4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggZmxhZywgcGFzcyBpbiBOVUxMLgorICovCit2b2lkIF9faW5pdCB0b3J0dXJlX2luaXRfYmVnaW4oY2hhciAqdHR5cGUsIGJvb2wgdiwgaW50ICpydW5uYWJsZSkKK3sKKwltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJdG9ydHVyZV90eXBlID0gdHR5cGU7CisJdmVyYm9zZSA9IHY7CisJdG9ydHVyZV9ydW5uYWJsZSA9IHJ1bm5hYmxlOworCWZ1bGxzdG9wID0gRlVMTFNUT1BfRE9OVFNUT1A7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfaW5pdF9iZWdpbik7CisKKy8qCisgKiBUZWxsIHRoZSB0b3J0dXJlIG1vZHVsZSB0aGF0IGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgorICovCit2b2lkIF9faW5pdCB0b3J0dXJlX2luaXRfZW5kKHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ0b3J0dXJlX3NodXRkb3duX25iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfaW5pdF9lbmQpOworCisvKgorICogQ2xlYW4gdXAgdG9ydHVyZSBtb2R1bGUuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgLW5vdC0gaW52b2tlZCB2aWEKKyAqIHRoZSB1c3VhbCBtb2R1bGVfZXhpdCgpIG1lY2hhbmlzbSwgYnV0IHJhdGhlciBieSBhbiBleHBsaWNpdCBjYWxsIGZyb20KKyAqIHRoZSBjbGllbnQgdG9ydHVyZSBtb2R1bGUuICBSZXR1cm5zIHRydWUgaWYgYSByYWNlIHdpdGggc3lzdGVtIHNodXRkb3duCisgKiBpcyBkZXRlY3RlZCwgb3RoZXJ3aXNlLCBhbGwga3RocmVhZHMgc3RhcnRlZCBieSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlCisgKiB3aWxsIGJlIHNodXQgZG93bi4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGVyIHN0YXJ0cyBzaHV0dGluZyBkb3duIGl0cyBvd24KKyAqIGt0aHJlYWRzLgorICovCitib29sIHRvcnR1cmVfY2xlYW51cCh2b2lkKQoreworCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKKwlpZiAoQUNDRVNTX09OQ0UoZnVsbHN0b3ApID09IEZVTExTVE9QX1NIVVRET1dOKSB7CisJCXByX3dhcm4oIkNvbmN1cnJlbnQgcm1tb2QgYW5kIHNodXRkb3duIGlsbGVnYWwhXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEwKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCUFDQ0VTU19PTkNFKGZ1bGxzdG9wKSA9IEZVTExTVE9QX1JNTU9EOworCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOworCXRvcnR1cmVfc2h1dGRvd25fY2xlYW51cCgpOworCXRvcnR1cmVfc2h1ZmZsZV9jbGVhbnVwKCk7CisJdG9ydHVyZV9zdHV0dGVyX2NsZWFudXAoKTsKKwl0b3J0dXJlX29ub2ZmX2NsZWFudXAoKTsKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX2NsZWFudXApOworCisvKgorICogSXMgaXQgdGltZSBmb3IgdGhlIGN1cnJlbnQgdG9ydHVyZSB0ZXN0IHRvIHN0b3A/CisgKi8KK2Jvb2wgdG9ydHVyZV9tdXN0X3N0b3Aodm9pZCkKK3sKKwlyZXR1cm4gdG9ydHVyZV9tdXN0X3N0b3BfaXJxKCkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9tdXN0X3N0b3ApOworCisvKgorICogSXMgaXQgdGltZSBmb3IgdGhlIGN1cnJlbnQgdG9ydHVyZSB0ZXN0IHRvIHN0b3A/ICBUaGlzIGlzIHRoZSBpcnEtc2FmZQorICogdmVyc2lvbiwgaGVuY2Ugbm8gY2hlY2sgZm9yIGt0aHJlYWRfc2hvdWxkX3N0b3AoKS4KKyAqLworYm9vbCB0b3J0dXJlX211c3Rfc3RvcF9pcnEodm9pZCkKK3sKKwlyZXR1cm4gQUNDRVNTX09OQ0UoZnVsbHN0b3ApICE9IEZVTExTVE9QX0RPTlRTVE9QOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9tdXN0X3N0b3BfaXJxKTsKKworLyoKKyAqIEVhY2gga3RocmVhZCBtdXN0IHdhaXQgZm9yIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSBiZWZvcmUgcmV0dXJuaW5nIGZyb20KKyAqIGl0cyB0b3AtbGV2ZWwgZnVuY3Rpb24sIG90aGVyd2lzZSBzZWdmYXVsdHMgZW5zdWUuICBUaGlzIGZ1bmN0aW9uCisgKiBwcmludHMgYSAic3RvcHBpbmciIG1lc3NhZ2UgYW5kIHdhaXRzIGZvciBrdGhyZWFkX3Nob3VsZF9zdG9wKCksIGFuZAorICogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFsbCB0b3J0dXJlIGt0aHJlYWRzIGltbWVkaWF0ZWx5IHByaW9yIHRvCisgKiByZXR1cm5pbmcuCisgKi8KK3ZvaWQgdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKGNoYXIgKnRpdGxlKQoreworCWlmICh2ZXJib3NlKQorCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcodGl0bGUpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKHRpdGxlKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKTsKKworLyoKKyAqIENyZWF0ZSBhIGdlbmVyaWMgdG9ydHVyZSBrdGhyZWFkIHRoYXQgaXMgaW1tZWRpYXRlbHkgcnVubmFibGUuICBJZiB5b3UKKyAqIG5lZWQgdGhlIGt0aHJlYWQgdG8gYmUgc3RvcHBlZCBzbyB0aGF0IHlvdSBjYW4gZG8gc29tZXRoaW5nIHRvIGl0IGJlZm9yZQorICogaXQgc3RhcnRzLCB5b3Ugd2lsbCBuZWVkIHRvIG9wZW4tY29kZSB5b3VyIG93bi4KKyAqLworaW50IF90b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKGludCAoKmZuKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGNoYXIgKnMsIGNoYXIgKm0sCisJCQkgICAgY2hhciAqZiwgc3RydWN0IHRhc2tfc3RydWN0ICoqdHApCit7CisJaW50IHJldCA9IDA7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcobSk7CisJKnRwID0ga3RocmVhZF9ydW4oZm4sIGFyZywgcyk7CisJaWYgKElTX0VSUigqdHApKSB7CisJCXJldCA9IFBUUl9FUlIoKnRwKTsKKwkJVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKGYpOworCQkqdHAgPSBOVUxMOworCX0KKwl0b3J0dXJlX3NodWZmbGVfdGFza19yZWdpc3RlcigqdHApOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfdG9ydHVyZV9jcmVhdGVfa3RocmVhZCk7CisKKy8qCisgKiBTdG9wIGEgZ2VuZXJpYyBrdGhyZWFkLCBlbWl0dGluZyBhIG1lc3NhZ2UuCisgKi8KK3ZvaWQgX3RvcnR1cmVfc3RvcF9rdGhyZWFkKGNoYXIgKm0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnRwKQoreworCWlmICgqdHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCVZFUkJPU0VfVE9ST1VUX1NUUklORyhtKTsKKwlrdGhyZWFkX3N0b3AoKnRwKTsKKwkqdHAgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX3RvcnR1cmVfc3RvcF9rdGhyZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKaW5kZXggYjQxOGNiMC4uNGYzYTNjMDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCkBAIC03MDIsNiArNzAyLDcgQEAKICAqIGJsa19hZGRfdHJhY2VfcnEgLSBBZGQgYSB0cmFjZSBmb3IgYSByZXF1ZXN0IG9yaWVudGVkIGFjdGlvbgogICogQHE6CQlxdWV1ZSB0aGUgaW8gaXMgZm9yCiAgKiBAcnE6CQl0aGUgc291cmNlIHJlcXVlc3QKKyAqIEBucl9ieXRlczoJbnVtYmVyIG9mIGNvbXBsZXRlZCBieXRlcwogICogQHdoYXQ6CXRoZSBhY3Rpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTcwOSw3ICs3MTAsNyBAQAogICoKICAqKi8KIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnEoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKLQkJCSAgICAgdTMyIHdoYXQpCisJCQkgICAgIHVuc2lnbmVkIGludCBucl9ieXRlcywgdTMyIHdoYXQpCiB7CiAJc3RydWN0IGJsa190cmFjZSAqYnQgPSBxLT5ibGtfdHJhY2U7CiAKQEAgLTcxOCwxMSArNzE5LDExIEBACiAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0JMT0NLX1BDKSB7CiAJCXdoYXQgfD0gQkxLX1RDX0FDVChCTEtfVENfUEMpOwotCQlfX2Jsa19hZGRfdHJhY2UoYnQsIDAsIGJsa19ycV9ieXRlcyhycSksIHJxLT5jbWRfZmxhZ3MsCisJCV9fYmxrX2FkZF90cmFjZShidCwgMCwgbnJfYnl0ZXMsIHJxLT5jbWRfZmxhZ3MsCiAJCQkJd2hhdCwgcnEtPmVycm9ycywgcnEtPmNtZF9sZW4sIHJxLT5jbWQpOwogCX0gZWxzZSAgewogCQl3aGF0IHw9IEJMS19UQ19BQ1QoQkxLX1RDX0ZTKTsKLQkJX19ibGtfYWRkX3RyYWNlKGJ0LCBibGtfcnFfcG9zKHJxKSwgYmxrX3JxX2J5dGVzKHJxKSwKKwkJX19ibGtfYWRkX3RyYWNlKGJ0LCBibGtfcnFfcG9zKHJxKSwgbnJfYnl0ZXMsCiAJCQkJcnEtPmNtZF9mbGFncywgd2hhdCwgcnEtPmVycm9ycywgMCwgTlVMTCk7CiAJfQogfQpAQCAtNzMwLDMzICs3MzEsMzQgQEAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnFfYWJvcnQodm9pZCAqaWdub3JlLAogCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0FCT1JUKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBibGtfcnFfYnl0ZXMocnEpLCBCTEtfVEFfQUJPUlQpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX3JxX2luc2VydCh2b2lkICppZ25vcmUsCiAJCQkJICAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0lOU0VSVCk7CisJYmxrX2FkZF90cmFjZV9ycShxLCBycSwgYmxrX3JxX2J5dGVzKHJxKSwgQkxLX1RBX0lOU0VSVCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnFfaXNzdWUodm9pZCAqaWdub3JlLAogCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0lTU1VFKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBibGtfcnFfYnl0ZXMocnEpLCBCTEtfVEFfSVNTVUUpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX3JxX3JlcXVldWUodm9pZCAqaWdub3JlLAogCQkJCSAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX1JFUVVFVUUpOworCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIGJsa19ycV9ieXRlcyhycSksIEJMS19UQV9SRVFVRVVFKTsKIH0KIAogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9ycV9jb21wbGV0ZSh2b2lkICppZ25vcmUsCiAJCQkJICAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCi0JCQkJICAgICAgc3RydWN0IHJlcXVlc3QgKnJxKQorCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0NPTVBMRVRFKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBucl9ieXRlcywgQkxLX1RBX0NPTVBMRVRFKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMKaW5kZXggYTU0NTdkNS4uMDQzNGZmMSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyX2JlbmNobWFyay5jCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlcl9iZW5jaG1hcmsuYwpAQCAtNDAsOCArNDAsOCBAQAogbW9kdWxlX3BhcmFtKHdyaXRlX2l0ZXJhdGlvbiwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHdyaXRlX2l0ZXJhdGlvbiwgIiMgb2Ygd3JpdGVzIGJldHdlZW4gdGltZXN0YW1wIHJlYWRpbmdzIik7CiAKLXN0YXRpYyBpbnQgcHJvZHVjZXJfbmljZSA9IDE5Owotc3RhdGljIGludCBjb25zdW1lcl9uaWNlID0gMTk7CitzdGF0aWMgaW50IHByb2R1Y2VyX25pY2UgPSBNQVhfTklDRTsKK3N0YXRpYyBpbnQgY29uc3VtZXJfbmljZSA9IE1BWF9OSUNFOwogCiBzdGF0aWMgaW50IHByb2R1Y2VyX2ZpZm8gPSAtMTsKIHN0YXRpYyBpbnQgY29uc3VtZXJfZmlmbyA9IC0xOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAKIAkvKiBMZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSB0ZXN0IGlzIHJ1bm5pbmcgYXQgbG93IHByaW9yaXR5ICovCiAJaWYgKHByb2R1Y2VyX2ZpZm8gPCAwICYmIGNvbnN1bWVyX2ZpZm8gPCAwICYmCi0JICAgIHByb2R1Y2VyX25pY2UgPT0gMTkgJiYgY29uc3VtZXJfbmljZSA9PSAxOSkKKwkgICAgcHJvZHVjZXJfbmljZSA9PSBNQVhfTklDRSAmJiBjb25zdW1lcl9uaWNlID09IE1BWF9OSUNFKQogCQl0cmFjZV9wcmludGsoIldBUk5JTkchISEgVGhpcyB0ZXN0IGlzIHJ1bm5pbmcgYXQgbG93ZXN0IHByaW9yaXR5LlxuIik7CiAKIAl0cmFjZV9wcmludGsoIlRpbWU6ICAgICAlbGxkICh1c2VjcylcbiIsIHRpbWUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwppbmRleCA4MTVjODc4Li4yNGMxZjIzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwpAQCAtMTYwMCwxNSArMTYwMCwzMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQpOwogCitzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyICp0ZW1wX2J1ZmZlcjsKKwogc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKIHRyYWNlX2V2ZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoc3RydWN0IHJpbmdfYnVmZmVyICoqY3VycmVudF9yYiwKIAkJCSAgc3RydWN0IGZ0cmFjZV9ldmVudF9maWxlICpmdHJhY2VfZmlsZSwKIAkJCSAgaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpCiB7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICplbnRyeTsKKwogCSpjdXJyZW50X3JiID0gZnRyYWNlX2ZpbGUtPnRyLT50cmFjZV9idWZmZXIuYnVmZmVyOwotCXJldHVybiB0cmFjZV9idWZmZXJfbG9ja19yZXNlcnZlKCpjdXJyZW50X3JiLAorCWVudHJ5ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZSgqY3VycmVudF9yYiwKIAkJCQkJIHR5cGUsIGxlbiwgZmxhZ3MsIHBjKTsKKwkvKgorCSAqIElmIHRyYWNpbmcgaXMgb2ZmLCBidXQgd2UgaGF2ZSB0cmlnZ2VycyBlbmFibGVkCisJICogd2Ugc3RpbGwgbmVlZCB0byBsb29rIGF0IHRoZSBldmVudCBkYXRhLiBVc2UgdGhlIHRlbXBfYnVmZmVyCisJICogdG8gc3RvcmUgdGhlIHRyYWNlIGV2ZW50IGZvciB0aGUgdGlnZ2VyIHRvIHVzZS4gSXQncyByZWN1c2l2ZQorCSAqIHNhZmUgYW5kIHdpbGwgbm90IGJlIHJlY29yZGVkIGFueXdoZXJlLgorCSAqLworCWlmICghZW50cnkgJiYgZnRyYWNlX2ZpbGUtPmZsYWdzICYgRlRSQUNFX0VWRU5UX0ZMX1RSSUdHRVJfQ09ORCkgeworCQkqY3VycmVudF9yYiA9IHRlbXBfYnVmZmVyOworCQllbnRyeSA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoKmN1cnJlbnRfcmIsCisJCQkJCQkgIHR5cGUsIGxlbiwgZmxhZ3MsIHBjKTsKKwl9CisJcmV0dXJuIGVudHJ5OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfZXZlbnRfYnVmZmVyX2xvY2tfcmVzZXJ2ZSk7CiAKQEAgLTY0OTQsMTEgKzY1MTAsMTYgQEAKIAogCXJhd19zcGluX2xvY2tfaW5pdCgmZ2xvYmFsX3RyYWNlLnN0YXJ0X2xvY2spOwogCisJLyogVXNlZCBmb3IgZXZlbnQgdHJpZ2dlcnMgKi8KKwl0ZW1wX2J1ZmZlciA9IHJpbmdfYnVmZmVyX2FsbG9jKFBBR0VfU0laRSwgUkJfRkxfT1ZFUldSSVRFKTsKKwlpZiAoIXRlbXBfYnVmZmVyKQorCQlnb3RvIG91dF9mcmVlX2NwdW1hc2s7CisKIAkvKiBUT0RPOiBtYWtlIHRoZSBudW1iZXIgb2YgYnVmZmVycyBob3QgcGx1Z2dhYmxlIHdpdGggQ1BVUyAqLwogCWlmIChhbGxvY2F0ZV90cmFjZV9idWZmZXJzKCZnbG9iYWxfdHJhY2UsIHJpbmdfYnVmX3NpemUpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInRyYWNlcjogZmFpbGVkIHRvIGFsbG9jYXRlIHJpbmcgYnVmZmVyIVxuIik7CiAJCVdBUk5fT04oMSk7Ci0JCWdvdG8gb3V0X2ZyZWVfY3B1bWFzazsKKwkJZ290byBvdXRfZnJlZV90ZW1wX2J1ZmZlcjsKIAl9CiAKIAlpZiAoZ2xvYmFsX3RyYWNlLmJ1ZmZlcl9kaXNhYmxlZCkKQEAgLTY1NDAsNiArNjU2MSw4IEBACiAKIAlyZXR1cm4gMDsKIAorb3V0X2ZyZWVfdGVtcF9idWZmZXI6CisJcmluZ19idWZmZXJfZnJlZSh0ZW1wX2J1ZmZlcik7CiBvdXRfZnJlZV9jcHVtYXNrOgogCWZyZWVfcGVyY3B1KGdsb2JhbF90cmFjZS50cmFjZV9idWZmZXIuZGF0YSk7CiAjaWZkZWYgQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcGVyZi5jCmluZGV4IGU4NTRmNDIuLmM4OTQ2MTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3BlcmYuYwpAQCAtMzEsOSArMzEsMjUgQEAKIAl9CiAKIAkvKiBUaGUgZnRyYWNlIGZ1bmN0aW9uIHRyYWNlIGlzIGFsbG93ZWQgb25seSBmb3Igcm9vdC4gKi8KLQlpZiAoZnRyYWNlX2V2ZW50X2lzX2Z1bmN0aW9uKHRwX2V2ZW50KSAmJgotCSAgICBwZXJmX3BhcmFub2lkX3RyYWNlcG9pbnRfcmF3KCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07CisJaWYgKGZ0cmFjZV9ldmVudF9pc19mdW5jdGlvbih0cF9ldmVudCkpIHsKKwkJaWYgKHBlcmZfcGFyYW5vaWRfdHJhY2Vwb2ludF9yYXcoKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgYWxsb3cgdXNlciBzcGFjZSBjYWxsY2hhaW5zIGZvciAgZnVuY3Rpb24gdHJhY2UKKwkJICogZXZlbnQsIGR1ZSB0byBpc3N1ZXMgd2l0aCBwYWdlIGZhdWx0cyB3aGlsZSB0cmFjaW5nIHBhZ2UKKwkJICogZmF1bHQgaGFuZGxlciBhbmQgaXRzIG92ZXJhbGwgdHJpY2tpbmVzcyBuYXR1cmUuCisJCSAqLworCQlpZiAoIXBfZXZlbnQtPmF0dHIuZXhjbHVkZV9jYWxsY2hhaW5fdXNlcikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqIFNhbWUgcmVhc29uIHRvIGRpc2FibGUgdXNlciBzdGFjayBkdW1wIGFzIGZvciB1c2VyIHNwYWNlCisJCSAqIGNhbGxjaGFpbnMgYWJvdmUuCisJCSAqLworCQlpZiAocF9ldmVudC0+YXR0ci5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1NUQUNLX1VTRVIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBObyB0cmFjaW5nLCBqdXN0IGNvdW50aW5nLCBzbyBubyBvYnZpb3VzIGxlYWsgKi8KIAlpZiAoIShwX2V2ZW50LT5hdHRyLnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkFXKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwppbmRleCBmMzk4OWNlLi43YjE2ZDQwIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCkBAIC0yNywxMiArMjcsNiBAQAogCiBERUZJTkVfTVVURVgoZXZlbnRfbXV0ZXgpOwogCi1ERUZJTkVfTVVURVgoZXZlbnRfc3RvcmFnZV9tdXRleCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChldmVudF9zdG9yYWdlX211dGV4KTsKLQotY2hhciBldmVudF9zdG9yYWdlW0VWRU5UX1NUT1JBR0VfU0laRV07Ci1FWFBPUlRfU1lNQk9MX0dQTChldmVudF9zdG9yYWdlKTsKLQogTElTVF9IRUFEKGZ0cmFjZV9ldmVudHMpOwogc3RhdGljIExJU1RfSEVBRChmdHJhY2VfY29tbW9uX2ZpZWxkcyk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYwppbmRleCA3YzNlM2U3Li5lZTBhNTA5IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jCkBAIC05NSwxNSArOTUsMTIgQEAKICN1bmRlZiBfX2FycmF5CiAjZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKKwkJY2hhciAqdHlwZV9zdHIgPSAjdHlwZSJbIl9fc3RyaW5naWZ5KGxlbikiXSI7CQlcCiAJCUJVSUxEX0JVR19PTihsZW4gPiBNQVhfRklMVEVSX1NUUl9WQUwpOwkJCVwKLQkJbXV0ZXhfbG9jaygmZXZlbnRfc3RvcmFnZV9tdXRleCk7CQkJXAotCQlzbnByaW50ZihldmVudF9zdG9yYWdlLCBzaXplb2YoZXZlbnRfc3RvcmFnZSksCQlcCi0JCQkgIiVzWyVkXSIsICN0eXBlLCBsZW4pOwkJCQlcCi0JCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCBldmVudF9zdG9yYWdlLCAjaXRlbSwgXAorCQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgdHlwZV9zdHIsICNpdGVtLAlcCiAJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAogCQkJCSBzaXplb2YoZmllbGQuaXRlbSksCQkJXAogCQkJCSBpc19zaWduZWRfdHlwZSh0eXBlKSwgZmlsdGVyX3R5cGUpOwlcCi0JCW11dGV4X3VubG9jaygmZXZlbnRfc3RvcmFnZV9tdXRleCk7CQkJXAogCQlpZiAocmV0KQkJCQkJCVwKIAkJCXJldHVybiByZXQ7CQkJCQlcCiAJfSB3aGlsZSAoMCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYwppbmRleCAyYWVmYmVlLi44ODdlZjg4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMKQEAgLTQ5OCwxNCArNDk4LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRyYWNlX2hhcmRpcnFzX29mZik7CiAKLXZvaWQgdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKHVuc2lnbmVkIGxvbmcgY2FsbGVyX2FkZHIpCitfX3Zpc2libGUgdm9pZCB0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIodW5zaWduZWQgbG9uZyBjYWxsZXJfYWRkcikKIHsKIAlpZiAoIXByZWVtcHRfdHJhY2UoKSAmJiBpcnFfdHJhY2UoKSkKIAkJc3RvcF9jcml0aWNhbF90aW1pbmcoQ0FMTEVSX0FERFIwLCBjYWxsZXJfYWRkcik7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcik7CiAKLXZvaWQgdHJhY2VfaGFyZGlycXNfb2ZmX2NhbGxlcih1bnNpZ25lZCBsb25nIGNhbGxlcl9hZGRyKQorX192aXNpYmxlIHZvaWQgdHJhY2VfaGFyZGlycXNfb2ZmX2NhbGxlcih1bnNpZ25lZCBsb25nIGNhbGxlcl9hZGRyKQogewogCWlmICghcHJlZW1wdF90cmFjZSgpICYmIGlycV90cmFjZSgpKQogCQlzdGFydF9jcml0aWNhbF90aW1pbmcoQ0FMTEVSX0FERFIwLCBjYWxsZXJfYWRkcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdXAuYyBiL2tlcm5lbC91cC5jCmluZGV4IDUwOTQwM2UuLjE3NjBiZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91cC5jCisrKyBiL2tlcm5lbC91cC5jCkBAIC0yMiwxNiArMjIsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKIAotdm9pZCBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLAotCQkJCWludCB3YWl0KQoraW50IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyhpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3NkLT5mdW5jKGNzZC0+aW5mbyk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSk7CitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyk7CiAKIGludCBvbl9lYWNoX2NwdShzbXBfY2FsbF9mdW5jX3QgZnVuYywgdm9pZCAqaW5mbywgaW50IHdhaXQpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvd2F0Y2hkb2cuYyBiL2tlcm5lbC93YXRjaGRvZy5jCmluZGV4IDQ0MzE2MTAuLjAxYzZmOTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93YXRjaGRvZy5jCisrKyBiL2tlcm5lbC93YXRjaGRvZy5jCkBAIC01MDUsNyArNTA1LDYgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX3RpbWVycyhpbnQgY3B1KQogewotCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGRhdGEgPSB7LmZ1bmMgPSByZXN0YXJ0X3dhdGNoZG9nX2hydGltZXJ9OwogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgcGVyZiBldmVudCBjb3VudGVyIHdpbGwgYWRvcHQgdG8gYSBuZXcKIAkgKiBzYW1wbGluZyBwZXJpb2QuIFVwZGF0aW5nIHRoZSBzYW1wbGluZyBwZXJpb2QgZGlyZWN0bHkgd291bGQKQEAgLTUxNSw3ICs1MTQsNyBAQAogCSAqIG1pZ2h0IGJlIGxhdGUgYWxyZWFkeSBzbyB3ZSBoYXZlIHRvIHJlc3RhcnQgdGhlIHRpbWVyIGFzIHdlbGwuCiAJICovCiAJd2F0Y2hkb2dfbm1pX2Rpc2FibGUoY3B1KTsKLQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsICZkYXRhLCAxKTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCByZXN0YXJ0X3dhdGNoZG9nX2hydGltZXIsIE5VTEwsIDEpOwogCXdhdGNoZG9nX25taV9lbmFibGUoY3B1KTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDE5M2U5NzcuLjBlZTYzYWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTUxNiw2ICs1MTYsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlc3Ryb3lfd29ya19vbl9zdGFjayk7CiAKK3ZvaWQgZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKK3sKKwlkZXN0cm95X3RpbWVyX29uX3N0YWNrKCZ3b3JrLT50aW1lcik7CisJZGVidWdfb2JqZWN0X2ZyZWUoJndvcmstPndvcmssICZ3b3JrX2RlYnVnX2Rlc2NyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRlc3Ryb3lfZGVsYXllZF93b3JrX29uX3N0YWNrKTsKKwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193b3JrX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfd29ya19kZWFjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CkBAIC0zMjI1LDcgKzMyMzIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmYXR0cnMtPm5pY2UpID09IDEgJiYKLQkgICAgYXR0cnMtPm5pY2UgPj0gLTIwICYmIGF0dHJzLT5uaWNlIDw9IDE5KQorCSAgICBhdHRycy0+bmljZSA+PSBNSU5fTklDRSAmJiBhdHRycy0+bmljZSA8PSBNQVhfTklDRSkKIAkJcmV0ID0gYXBwbHlfd29ya3F1ZXVlX2F0dHJzKHdxLCBhdHRycyk7CiAJZWxzZQogCQlyZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBhNDhhYmVhLi5kZDdmODg1IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtOTgwLDYgKzk4MCwyMSBAQAogCSAgVGhlIGZvbGxvd2luZyBsb2NraW5nIEFQSXMgYXJlIGNvdmVyZWQ6IHNwaW5sb2Nrcywgcndsb2NrcywKIAkgIG11dGV4ZXMgYW5kIHJ3c2Vtcy4KIAorY29uZmlnIExPQ0tfVE9SVFVSRV9URVNUCisJdHJpc3RhdGUgInRvcnR1cmUgdGVzdHMgZm9yIGxvY2tpbmciCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlzZWxlY3QgVE9SVFVSRV9URVNUCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgYSBrZXJuZWwgbW9kdWxlIHRoYXQgcnVucyB0b3J0dXJlIHRlc3RzCisJICBvbiBrZXJuZWwgbG9ja2luZyBwcmltaXRpdmVzLiAgVGhlIGtlcm5lbCBtb2R1bGUgbWF5IGJlIGJ1aWx0CisJICBhZnRlciB0aGUgZmFjdCBvbiB0aGUgcnVubmluZyBrZXJuZWwgdG8gYmUgdGVzdGVkLCBpZiBkZXNpcmVkLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb2NraW5nLXByaW1pdGl2ZSB0b3J0dXJlIHRlc3RzCisJICB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwuCisJICBTYXkgTSBpZiB5b3Ugd2FudCB0aGVzZSB0b3J0dXJlIHRlc3RzIHRvIGJ1aWxkIGFzIGEgbW9kdWxlLgorCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKIGVuZG1lbnUgIyBsb2NrIGRlYnVnZ2luZwogCiBjb25maWcgVFJBQ0VfSVJRRkxBR1MKQEAgLTExNDEsOSArMTE1NiwxNCBAQAogCiAJIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgogCitjb25maWcgVE9SVFVSRV9URVNUCisJdHJpc3RhdGUKKwlkZWZhdWx0IG4KKwogY29uZmlnIFJDVV9UT1JUVVJFX1RFU1QKIAl0cmlzdGF0ZSAidG9ydHVyZSB0ZXN0cyBmb3IgUkNVIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJc2VsZWN0IFRPUlRVUkVfVEVTVAogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIGEga2VybmVsIG1vZHVsZSB0aGF0IHJ1bnMgdG9ydHVyZSB0ZXN0cwpkaWZmIC0tZ2l0IGEvbGliL2ZvbnRzL0tjb25maWcgYi9saWIvZm9udHMvS2NvbmZpZwppbmRleCA0ZGMxYjk5Li4zNGZkOTMxIDEwMDY0NAotLS0gYS9saWIvZm9udHMvS2NvbmZpZworKysgYi9saWIvZm9udHMvS2NvbmZpZwpAQCAtOSw3ICs5LDcgQEAKIAogY29uZmlnIEZPTlRTCiAJYm9vbCAiU2VsZWN0IGNvbXBpbGVkLWluIGZvbnRzIgotCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRSB8fCBTVElfQ09OU09MRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGZvbnRzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQKIAkgIHlvdXIgZnJhbWUgYnVmZmVyIGNvbnNvbGUgdXN1YWxseSB1c2UuCkBAIC0yMiw3ICsyMiw3IEBACiAKIGNvbmZpZyBGT05UXzh4OAogCWJvb2wgIlZHQSA4eDggZm9udCIgaWYgRk9OVFMKLQlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUgfHwgU1RJX0NPTlNPTEUKIAlkZWZhdWx0IHkgaWYgIVNQQVJDICYmICFGT05UUwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlICJoaWdoIHJlc29sdXRpb24iIGZvbnQgZm9yIHRoZSBWR0EgZnJhbWUgYnVmZmVyICh0aGUgb25lCkBAIC00NSw3ICs0NSw3IEBACiAKIGNvbmZpZyBGT05UXzZ4MTEKIAlib29sICJNYWMgY29uc29sZSA2eDExIGZvbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMpIiBpZiBGT05UUwotCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRSB8fCBTVElfQ09OU09MRQogCWRlZmF1bHQgeSBpZiAhU1BBUkMgJiYgIUZPTlRTICYmIE1BQwogCWhlbHAKIAkgIFNtYWxsIGNvbnNvbGUgZm9udCB3aXRoIE1hY2ludG9zaC1zdHlsZSBoaWdoLWhhbGYgZ2x5cGhzLiAgU29tZSBNYWMKZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCBiZmU0ZGI0Li4xYmE0OTU2IDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC04NjksNiArODY5LDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkcl9pbml0KTsKIAorc3RhdGljIGludCBpZHJfaGFzX2VudHJ5KGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMTsKK30KKworYm9vbCBpZHJfaXNfZW1wdHkoc3RydWN0IGlkciAqaWRwKQoreworCXJldHVybiAhaWRyX2Zvcl9lYWNoKGlkcCwgaWRyX2hhc19lbnRyeSwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9pc19lbXB0eSk7CiAKIC8qKgogICogRE9DOiBJREEgZGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9rb2JqZWN0LmMgYi9saWIva29iamVjdC5jCmluZGV4IGNiMTRhZWEuLjU4NzUxYmIgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0LmMKKysrIGIvbGliL2tvYmplY3QuYwpAQCAtOTQsNyArOTQsNyBAQAogCQlCVUdfT04ob3BzLT50eXBlID49IEtPQkpfTlNfVFlQRVMpOwogCQlCVUdfT04oIWtvYmpfbnNfdHlwZV9yZWdpc3RlcmVkKG9wcy0+dHlwZSkpOwogCi0JCWtlcm5mc19lbmFibGVfbnMoa29iai0+c2QpOworCQlzeXNmc19lbmFibGVfbnMoa29iai0+c2QpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliL3JhbmRvbTMyLmMgYi9saWIvcmFuZG9tMzIuYwppbmRleCAxZTViMmRmLi42MTQ4OTY3IDEwMDY0NAotLS0gYS9saWIvcmFuZG9tMzIuYworKysgYi9saWIvcmFuZG9tMzIuYwpAQCAtMjQ0LDggKzI0NCwxOSBAQAogCXN0YXRpYyBib29sIGxhdGNoID0gZmFsc2U7CiAJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIAorCS8qIEFza2luZyBmb3IgcmFuZG9tIGJ5dGVzIG1pZ2h0IHJlc3VsdCBpbiBieXRlcyBnZXR0aW5nCisJICogbW92ZWQgaW50byB0aGUgbm9uYmxvY2tpbmcgcG9vbCBhbmQgdGh1cyBtYXJraW5nIGl0CisJICogYXMgaW5pdGlhbGl6ZWQuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBkb3VibGUgYmFjayBpbnRvCisJICogdGhpcyBmdW5jdGlvbiBhbmQgYXR0ZW1wdCB0byBkbyBhIGxhdGUgcmVzZWVkLgorCSAqIElnbm9yZSB0aGUgcG9pbnRsZXNzIGF0dGVtcHQgdG8gcmVzZWVkIGFnYWluIGlmIHdlJ3JlCisJICogYWxyZWFkeSB3YWl0aW5nIGZvciBieXRlcyB3aGVuIHRoZSBub25ibG9ja2luZyBwb29sCisJICogZ290IGluaXRpYWxpemVkLgorCSAqLworCiAJLyogb25seSBhbGxvdyBpbml0aWFsIHNlZWRpbmcgKGxhdGUgPT0gZmFsc2UpIG9uY2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKSkKKwkJcmV0dXJuOworCiAJaWYgKGxhdGNoICYmICFsYXRlKQogCQlnb3RvIG91dDsKIAlsYXRjaCA9IHRydWU7CmRpZmYgLS1naXQgYS9saWIvc3RyaW5nLmMgYi9saWIvc3RyaW5nLmMKaW5kZXggZTU4NzhkZS4uOWIxZjkwNiAxMDA2NDQKLS0tIGEvbGliL3N0cmluZy5jCisrKyBiL2xpYi9zdHJpbmcuYwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgogICovCiAjdW5kZWYgbWVtY21wCi1pbnQgbWVtY21wKGNvbnN0IHZvaWQgKmNzLCBjb25zdCB2b2lkICpjdCwgc2l6ZV90IGNvdW50KQorX192aXNpYmxlIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqY3MsIGNvbnN0IHZvaWQgKmN0LCBzaXplX3QgY291bnQpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqc3UxLCAqc3UyOwogCWludCByZXMgPSAwOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCAxODViNmQzLi41ZTJjZjZmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtNzE5LDEwICs3MTksMTUgQEAKIAkJc3BlY3AgPSAmbWVtX3NwZWM7CiAJCWRlY29kZSA9IDA7CiAJfQotCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgKnNwZWNwKTsKLQlpZiAocmVzLT5zdGFydCAhPSByZXMtPmVuZCkgewotCQkqcCsrID0gJy0nOwotCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCAqc3BlY3ApOworCWlmIChkZWNvZGUgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpIHsKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAic2l6ZSAiLCBzdHJfc3BlYyk7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCAqc3BlY3ApOworCX0gZWxzZSB7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgKnNwZWNwKTsKKwkJaWYgKHJlcy0+c3RhcnQgIT0gcmVzLT5lbmQpIHsKKwkJCSpwKysgPSAnLSc7CisJCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCAqc3BlY3ApOworCQl9CiAJfQogCWlmIChkZWNvZGUpIHsKIAkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkKZGlmZiAtLWdpdCBhL21tL2ZyZW1hcC5jIGIvbW0vZnJlbWFwLmMKaW5kZXggYmJjNGQ2Ni4uMzRmZWJhNiAxMDA2NDQKLS0tIGEvbW0vZnJlbWFwLmMKKysrIGIvbW0vZnJlbWFwLmMKQEAgLTIzLDI4ICsyMyw0NCBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorc3RhdGljIGludCBtbV9jb3VudGVyKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBQYWdlQW5vbihwYWdlKSA/IE1NX0FOT05QQUdFUyA6IE1NX0ZJTEVQQUdFUzsKK30KKwogc3RhdGljIHZvaWQgemFwX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCXB0ZV90IHB0ZSA9ICpwdGVwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN3cF9lbnRyeV90IGVudHJ5OwogCiAJaWYgKHB0ZV9wcmVzZW50KHB0ZSkpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KIAkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHB0ZV9wZm4ocHRlKSk7CiAJCXB0ZSA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyLCBwdGVwKTsKIAkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRlKTsKIAkJaWYgKHBhZ2UpIHsKIAkJCWlmIChwdGVfZGlydHkocHRlKSkKIAkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCXVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7CisJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihwYWdlKSk7CiAJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKTsKLQkJCWRlY19tbV9jb3VudGVyKG1tLCBNTV9GSUxFUEFHRVMpOwogCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFwdGVfZmlsZShwdGUpKQotCQkJZnJlZV9zd2FwX2FuZF9jYWNoZShwdGVfdG9fc3dwX2VudHJ5KHB0ZSkpOworCX0gZWxzZSB7CS8qIHphcF9wdGUoKSBpcyBub3QgY2FsbGVkIHdoZW4gcHRlX25vbmUoKSAqLworCQlpZiAoIXB0ZV9maWxlKHB0ZSkpIHsKKwkJCXVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7CisJCQllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkocHRlKTsKKwkJCWlmIChub25fc3dhcF9lbnRyeShlbnRyeSkpIHsKKwkJCQlpZiAoaXNfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkgeworCQkJCQlwYWdlID0gbWlncmF0aW9uX2VudHJ5X3RvX3BhZ2UoZW50cnkpOworCQkJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihwYWdlKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmcmVlX3N3YXBfYW5kX2NhY2hlKGVudHJ5KTsKKwkJCQlkZWNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpOworCQkJfQorCQl9CiAJCXB0ZV9jbGVhcl9ub3RfcHJlc2VudF9mdWxsKG1tLCBhZGRyLCBwdGVwLCAwKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IGFlM2M4ZjMuLjQ3NTVjODUgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC0xNTU2LDEwICsxNTU2LDEwIEBACiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldF9tZW1wb2xpY3koaW50IF9fdXNlciAqcG9saWN5LAotCQkJCSAgICAgY29tcGF0X3Vsb25nX3QgX191c2VyICpubWFzaywKLQkJCQkgICAgIGNvbXBhdF91bG9uZ190IG1heG5vZGUsCi0JCQkJICAgICBjb21wYXRfdWxvbmdfdCBhZGRyLCBjb21wYXRfdWxvbmdfdCBmbGFncykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoZ2V0X21lbXBvbGljeSwgaW50IF9fdXNlciAqLCBwb2xpY3ksCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgbm1hc2ssCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgbWF4bm9kZSwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBhZGRyLCBjb21wYXRfdWxvbmdfdCwgZmxhZ3MpCiB7CiAJbG9uZyBlcnI7CiAJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5tID0gTlVMTDsKQEAgLTE1ODYsOCArMTU4Niw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2V0X21lbXBvbGljeShpbnQgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICpubWFzaywKLQkJCQkgICAgIGNvbXBhdF91bG9uZ190IG1heG5vZGUpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHNldF9tZW1wb2xpY3ksIGludCwgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICosIG5tYXNrLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIG1heG5vZGUpCiB7CiAJbG9uZyBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgX191c2VyICpubSA9IE5VTEw7CkBAIC0xNjA5LDkgKzE2MDksOSBAQAogCXJldHVybiBzeXNfc2V0X21lbXBvbGljeShtb2RlLCBubSwgbnJfYml0cysxKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWJpbmQoY29tcGF0X3Vsb25nX3Qgc3RhcnQsIGNvbXBhdF91bG9uZ190IGxlbiwKLQkJCSAgICAgY29tcGF0X3Vsb25nX3QgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICpubWFzaywKLQkJCSAgICAgY29tcGF0X3Vsb25nX3QgbWF4bm9kZSwgY29tcGF0X3Vsb25nX3QgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KG1iaW5kLCBjb21wYXRfdWxvbmdfdCwgc3RhcnQsIGNvbXBhdF91bG9uZ190LCBsZW4sCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICosIG5tYXNrLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIG1heG5vZGUsIGNvbXBhdF91bG9uZ190LCBmbGFncykKIHsKIAlsb25nIGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5tID0gTlVMTDsKQEAgLTIzMDEsMzUgKzIzMDEsNiBAQAogCWttZW1fY2FjaGVfZnJlZShzbl9jYWNoZSwgbik7CiB9CiAKLSNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkcKLXN0YXRpYyBib29sIG51bWFfbWlncmF0ZV9kZWZlcnJlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBsYXN0X2NwdXBpZCkKLXsKLQkvKiBOZXZlciBkZWZlciBhIHByaXZhdGUgZmF1bHQgKi8KLQlpZiAoY3B1cGlkX21hdGNoX3BpZChwLCBsYXN0X2NwdXBpZCkpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChwLT5udW1hX21pZ3JhdGVfZGVmZXJyZWQpIHsKLQkJcC0+bnVtYV9taWdyYXRlX2RlZmVycmVkLS07Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZWZlcl9udW1hX21pZ3JhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXAtPm51bWFfbWlncmF0ZV9kZWZlcnJlZCA9IHN5c2N0bF9udW1hX2JhbGFuY2luZ19taWdyYXRlX2RlZmVycmVkOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgYm9vbCBudW1hX21pZ3JhdGVfZGVmZXJyZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgbGFzdF9jcHVwaWQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVmZXJfbnVtYV9taWdyYXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKLXsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi8KLQogLyoqCiAgKiBtcG9sX21pc3BsYWNlZCAtIGNoZWNrIHdoZXRoZXIgY3VycmVudCBwYWdlIG5vZGUgaXMgdmFsaWQgaW4gcG9saWN5CiAgKgpAQCAtMjQwMyw1MiArMjM3NCw5IEBACiAKIAkvKiBNaWdyYXRlIHRoZSBwYWdlIHRvd2FyZHMgdGhlIG5vZGUgd2hvc2UgQ1BVIGlzIHJlZmVyZW5jaW5nIGl0ICovCiAJaWYgKHBvbC0+ZmxhZ3MgJiBNUE9MX0ZfTU9ST04pIHsKLQkJaW50IGxhc3RfY3B1cGlkOwotCQlpbnQgdGhpc19jcHVwaWQ7Ci0KIAkJcG9sbmlkID0gdGhpc25pZDsKLQkJdGhpc19jcHVwaWQgPSBjcHVfcGlkX3RvX2NwdXBpZCh0aGlzY3B1LCBjdXJyZW50LT5waWQpOwogCi0JCS8qCi0JCSAqIE11bHRpLXN0YWdlIG5vZGUgc2VsZWN0aW9uIGlzIHVzZWQgaW4gY29uanVuY3Rpb24KLQkJICogd2l0aCBhIHBlcmlvZGljIG1pZ3JhdGlvbiBmYXVsdCB0byBidWlsZCBhIHRlbXBvcmFsCi0JCSAqIHRhc2s8LT5wYWdlIHJlbGF0aW9uLiBCeSB1c2luZyBhIHR3by1zdGFnZSBmaWx0ZXIgd2UKLQkJICogcmVtb3ZlIHNob3J0L3VubGlrZWx5IHJlbGF0aW9ucy4KLQkJICoKLQkJICogVXNpbmcgUChwKSB+IG5fcCAvIG5fdCBhcyBwZXIgZnJlcXVlbnRpc3QKLQkJICogcHJvYmFiaWxpdHksIHdlIGNhbiBlcXVhdGUgYSB0YXNrJ3MgdXNhZ2Ugb2YgYQotCQkgKiBwYXJ0aWN1bGFyIHBhZ2UgKG5fcCkgcGVyIHRvdGFsIHVzYWdlIG9mIHRoaXMKLQkJICogcGFnZSAobl90KSAoaW4gYSBnaXZlbiB0aW1lLXNwYW4pIHRvIGEgcHJvYmFiaWxpdHkuCi0JCSAqCi0JCSAqIE91ciBwZXJpb2RpYyBmYXVsdHMgd2lsbCBzYW1wbGUgdGhpcyBwcm9iYWJpbGl0eSBhbmQKLQkJICogZ2V0dGluZyB0aGUgc2FtZSByZXN1bHQgdHdpY2UgaW4gYSByb3csIGdpdmVuIHRoZXNlCi0JCSAqIHNhbXBsZXMgYXJlIGZ1bGx5IGluZGVwZW5kZW50LCBpcyB0aGVuIGdpdmVuIGJ5Ci0JCSAqIFAobileMiwgcHJvdmlkZWQgb3VyIHNhbXBsZSBwZXJpb2QgaXMgc3VmZmljaWVudGx5Ci0JCSAqIHNob3J0IGNvbXBhcmVkIHRvIHRoZSB1c2FnZSBwYXR0ZXJuLgotCQkgKgotCQkgKiBUaGlzIHF1YWRyaWMgc3F1aXNoZXMgc21hbGwgcHJvYmFiaWxpdGllcywgbWFraW5nCi0JCSAqIGl0IGxlc3MgbGlrZWx5IHdlIGFjdCBvbiBhbiB1bmxpa2VseSB0YXNrPC0+cGFnZQotCQkgKiByZWxhdGlvbi4KLQkJICovCi0JCWxhc3RfY3B1cGlkID0gcGFnZV9jcHVwaWRfeGNoZ19sYXN0KHBhZ2UsIHRoaXNfY3B1cGlkKTsKLQkJaWYgKCFjcHVwaWRfcGlkX3Vuc2V0KGxhc3RfY3B1cGlkKSAmJiBjcHVwaWRfdG9fbmlkKGxhc3RfY3B1cGlkKSAhPSB0aGlzbmlkKSB7Ci0KLQkJCS8qIFNlZSBzeXNjdGxfbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCBjb21tZW50ICovCi0JCQlpZiAoIWNwdXBpZF9tYXRjaF9waWQoY3VycmVudCwgbGFzdF9jcHVwaWQpKQotCQkJCWRlZmVyX251bWFfbWlncmF0ZShjdXJyZW50KTsKLQotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBUaGUgcXVhZHJhdGljIGZpbHRlciBhYm92ZSByZWR1Y2VzIGV4dHJhbmVvdXMgbWlncmF0aW9uCi0JCSAqIG9mIHNoYXJlZCBwYWdlcyBzb21ld2hhdC4gVGhpcyBjb2RlIHJlZHVjZXMgaXQgZXZlbiBtb3JlLAotCQkgKiByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgcGFnZSBtaWdyYXRpb25zIG9mIHNoYXJlZCBwYWdlcy4KLQkJICogVGhpcyBtYWtlcyB3b3JrbG9hZHMgd2l0aCBzaGFyZWQgcGFnZXMgcmVseSBtb3JlIG9uCi0JCSAqICJtb3ZlIHRhc2sgbmVhciBpdHMgbWVtb3J5IiwgYW5kIGxlc3Mgb24gIm1vdmUgbWVtb3J5Ci0JCSAqIHRvd2FyZHMgaXRzIHRhc2siLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4KLQkJICovCi0JCWlmIChudW1hX21pZ3JhdGVfZGVmZXJyZWQoY3VycmVudCwgbGFzdF9jcHVwaWQpKQorCQlpZiAoIXNob3VsZF9udW1hX21pZ3JhdGVfbWVtb3J5KGN1cnJlbnQsIHBhZ2UsIGN1cm5pZCwgdGhpc2NwdSkpCiAJCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBiNDk0ZmRiLi5iZWQ0ODgwIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0xNzgsNiArMTc4LDM3IEBACiB9CiAKIC8qCisgKiBDb25ncmF0dWxhdGlvbnMgdG8gdHJpbml0eSBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcuCisgKiBtbS9mcmVtYXAuYydzIHJlbWFwX2ZpbGVfcGFnZXMoKSBhY2NlcHRzIGFueSByYW5nZSB3aXRoaW4gYSBzaW5nbGUgdm1hIHRvCisgKiBjb252ZXJ0IHRoYXQgdm1hIHRvIFZNX05PTkxJTkVBUjsgYW5kIGdlbmVyaWNfZmlsZV9yZW1hcF9wYWdlcygpIHdpbGwgdGhlbgorICogcmVwbGFjZSB0aGUgc3BlY2lmaWVkIHJhbmdlIGJ5IGZpbGUgcHRlcyB0aHJvdWdob3V0IChtYXliZSBwb3B1bGF0ZWQgYWZ0ZXIpLgorICogSWYgcGFnZSBtaWdyYXRpb24gZmluZHMgYSBwYWdlIHdpdGhpbiB0aGF0IHJhbmdlLCB3aGlsZSBpdCdzIHN0aWxsIGxvY2F0ZWQKKyAqIGJ5IHZtYV9pbnRlcnZhbF90cmVlIHJhdGhlciB0aGFuIGxvc3QgdG8gaV9tbWFwX25vbmxpbmVhciBsaXN0LCBubyBwcm9ibGVtOgorICogemFwX3B0ZSgpIGNsZWFycyB0aGUgdGVtcG9yYXJ5IG1pZ3JhdGlvbiBlbnRyeSBiZWZvcmUgbW1hcF9zZW0gaXMgZHJvcHBlZC4KKyAqIEJ1dCBpZiB0aGUgbWlncmF0aW5nIHBhZ2UgaXMgaW4gYSBwYXJ0IG9mIHRoZSB2bWEgb3V0c2lkZSB0aGUgcmFuZ2UgdG8gYmUKKyAqIHJlbWFwcGVkLCB0aGVuIGl0IHdpbGwgbm90IGJlIGNsZWFyZWQsIGFuZCByZW1vdmVfbWlncmF0aW9uX3B0ZXMoKSBuZWVkcyB0bworICogZGVhbCB3aXRoIGl0LiAgRm9ydHVuYXRlbHksIHRoaXMgcGFydCBvZiB0aGUgdm1hIGlzIG9mIGNvdXJzZSBzdGlsbCBsaW5lYXIsCisgKiBzbyB3ZSBqdXN0IG5lZWQgdG8gdXNlIGxpbmVhciBsb2NhdGlvbiBvbiB0aGUgbm9ubGluZWFyIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2xpbmVhcl9taWdyYXRpb25fcHRlc19mcm9tX25vbmxpbmVhcihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwkvKiBodWdldGxiZnMgZG9lcyBub3Qgc3VwcG9ydCByZW1hcF9wYWdlcywgc28gbm8gaHVnZSBwZ29mZiB3b3JyaWVzICovCisJcGdvZmZfdCBwZ29mZiA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gUEFHRV9TSElGVCk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bWEsCisJCSZtYXBwaW5nLT5pX21tYXBfbm9ubGluZWFyLCBzaGFyZWQubm9ubGluZWFyKSB7CisKKwkJYWRkciA9IHZtYS0+dm1fc3RhcnQgKyAoKHBnb2ZmIC0gdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCk7CisJCWlmIChhZGRyID49IHZtYS0+dm1fc3RhcnQgJiYgYWRkciA8IHZtYS0+dm1fZW5kKQorCQkJcmVtb3ZlX21pZ3JhdGlvbl9wdGUocGFnZSwgdm1hLCBhZGRyLCBhcmcpOworCX0KKwlyZXR1cm4gU1dBUF9BR0FJTjsKK30KKworLyoKICAqIEdldCByaWQgb2YgYWxsIG1pZ3JhdGlvbiBlbnRyaWVzIGFuZCByZXBsYWNlIHRoZW0gYnkKICAqIHJlZmVyZW5jZXMgdG8gdGhlIGluZGljYXRlZCBwYWdlLgogICovCkBAIC0xODYsNiArMjE3LDcgQEAKIAlzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0gewogCQkucm1hcF9vbmUgPSByZW1vdmVfbWlncmF0aW9uX3B0ZSwKIAkJLmFyZyA9IG9sZCwKKwkJLmZpbGVfbm9ubGluZWFyID0gcmVtb3ZlX2xpbmVhcl9taWdyYXRpb25fcHRlc19mcm9tX25vbmxpbmVhciwKIAl9OwogCiAJcm1hcF93YWxrKG5ldywgJnJ3Yyk7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggMjBmZjBjMy4uODFiYTU0ZiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtMjkxOCw3ICsyOTE4LDcgQEAKICAqIFRoZSBhcnJheSBwb2ludGVyIGFuZCB0aGUgcGFnZXMgaXQgcG9pbnRzIHRvIGFyZSBhc3N1bWVkIHRvIHN0YXkgYWxpdmUKICAqIGZvciBhcyBsb25nIGFzIHRoaXMgbWFwcGluZyBtaWdodCBleGlzdC4KICAqLwotaW50IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHZtX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewpAQCAtMjkyNyw3ICsyOTI3LDcgQEAKIAogCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkodm1hID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmdm1hLT5hbm9uX3ZtYV9jaGFpbik7CiAJdm1hLT52bV9tbSA9IG1tOwpAQCAtMjk0OCwxMSArMjk0OCwyMyBAQAogCiAJcGVyZl9ldmVudF9tbWFwKHZtYSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdm1hOwogCiBvdXQ6CiAJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworaW50IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgICAgdW5zaWduZWQgbG9uZyB2bV9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IF9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwKKwkJCSAgICBhZGRyLCBsZW4sIHZtX2ZsYWdzLCBwYWdlcyk7CisKKwlpZiAoSVNfRVJSKHZtYSkpCisJCXJldHVybiBQVFJfRVJSKHZtYSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBERUZJTkVfTVVURVgobW1fYWxsX2xvY2tzX211dGV4KTsKZGlmZiAtLWdpdCBhL21tL21tdV9jb250ZXh0LmMgYi9tbS9tbXVfY29udGV4dC5jCmluZGV4IDhhOGNkMDIuLmY4MDJjMmQgMTAwNjQ0Ci0tLSBhL21tL21tdV9jb250ZXh0LmMKKysrIGIvbW0vbW11X2NvbnRleHQuYwpAQCAtMzEsNiArMzEsOSBAQAogCXRzay0+bW0gPSBtbTsKIAlzd2l0Y2hfbW0oYWN0aXZlX21tLCBtbSwgdHNrKTsKIAl0YXNrX3VubG9jayh0c2spOworI2lmZGVmIGZpbmlzaF9hcmNoX3Bvc3RfbG9ja19zd2l0Y2gKKwlmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoKCk7CisjZW5kaWYKIAogCWlmIChhY3RpdmVfbW0gIT0gbW0pCiAJCW1tZHJvcChhY3RpdmVfbW0pOwpkaWZmIC0tZ2l0IGEvbW0vcGVyY3B1LmMgYi9tbS9wZXJjcHUuYwppbmRleCAwMzZjZmUwLi42M2UyNGZiIDEwMDY0NAotLS0gYS9tbS9wZXJjcHUuYworKysgYi9tbS9wZXJjcHUuYwpAQCAtMTAyLDEwICsxMDIsMTEgQEAKIAlpbnQJCQlmcmVlX3NpemU7CS8qIGZyZWUgYnl0ZXMgaW4gdGhlIGNodW5rICovCiAJaW50CQkJY29udGlnX2hpbnQ7CS8qIG1heCBjb250aWd1b3VzIHNpemUgaGludCAqLwogCXZvaWQJCQkqYmFzZV9hZGRyOwkvKiBiYXNlIGFkZHJlc3Mgb2YgdGhpcyBjaHVuayAqLwotCWludAkJCW1hcF91c2VkOwkvKiAjIG9mIG1hcCBlbnRyaWVzIHVzZWQgKi8KKwlpbnQJCQltYXBfdXNlZDsJLyogIyBvZiBtYXAgZW50cmllcyB1c2VkIGJlZm9yZSB0aGUgc2VudHJ5ICovCiAJaW50CQkJbWFwX2FsbG9jOwkvKiAjIG9mIG1hcCBlbnRyaWVzIGFsbG9jYXRlZCAqLwogCWludAkJCSptYXA7CQkvKiBhbGxvY2F0aW9uIG1hcCAqLwogCXZvaWQJCQkqZGF0YTsJCS8qIGNodW5rIGRhdGEgKi8KKwlpbnQJCQlmaXJzdF9mcmVlOwkvKiBubyBmcmVlIGJlbG93IHRoaXMgKi8KIAlib29sCQkJaW1tdXRhYmxlOwkvKiBubyBbZGVdcG9wdWxhdGlvbiBhbGxvd2VkICovCiAJdW5zaWduZWQgbG9uZwkJcG9wdWxhdGVkW107CS8qIHBvcHVsYXRlZCBiaXRtYXAgKi8KIH07CkBAIC0zNTYsMTEgKzM1NywxMSBAQAogewogCWludCBuZXdfYWxsb2M7CiAKLQlpZiAoY2h1bmstPm1hcF9hbGxvYyA+PSBjaHVuay0+bWFwX3VzZWQgKyAyKQorCWlmIChjaHVuay0+bWFwX2FsbG9jID49IGNodW5rLT5tYXBfdXNlZCArIDMpCiAJCXJldHVybiAwOwogCiAJbmV3X2FsbG9jID0gUENQVV9ERkxfTUFQX0FMTE9DOwotCXdoaWxlIChuZXdfYWxsb2MgPCBjaHVuay0+bWFwX3VzZWQgKyAyKQorCXdoaWxlIChuZXdfYWxsb2MgPCBjaHVuay0+bWFwX3VzZWQgKyAzKQogCQluZXdfYWxsb2MgKj0gMjsKIAogCXJldHVybiBuZXdfYWxsb2M7CkBAIC00MTgsNDggKzQxOSw2IEBACiB9CiAKIC8qKgotICogcGNwdV9zcGxpdF9ibG9jayAtIHNwbGl0IGEgbWFwIGJsb2NrCi0gKiBAY2h1bms6IGNodW5rIG9mIGludGVyZXN0Ci0gKiBAaTogaW5kZXggb2YgbWFwIGJsb2NrIHRvIHNwbGl0Ci0gKiBAaGVhZDogaGVhZCBzaXplIGluIGJ5dGVzIChjYW4gYmUgMCkKLSAqIEB0YWlsOiB0YWlsIHNpemUgaW4gYnl0ZXMgKGNhbiBiZSAwKQotICoKLSAqIFNwbGl0IHRoZSBAaSd0aCBtYXAgYmxvY2sgaW50byB0d28gb3IgdGhyZWUgYmxvY2tzLiAgSWYgQGhlYWQgaXMKLSAqIG5vbi16ZXJvLCBAaGVhZCBieXRlcyBibG9jayBpcyBpbnNlcnRlZCBiZWZvcmUgYmxvY2sgQGkgbW92aW5nIGl0Ci0gKiB0byBAaSsxIGFuZCByZWR1Y2luZyBpdHMgc2l6ZSBieSBAaGVhZCBieXRlcy4KLSAqCi0gKiBJZiBAdGFpbCBpcyBub24temVybywgdGhlIHRhcmdldCBibG9jaywgd2hpY2ggY2FuIGJlIEBpIG9yIEBpKzEKLSAqIGRlcGVuZGluZyBvbiBAaGVhZCwgaXMgcmVkdWNlZCBieSBAdGFpbCBieXRlcyBhbmQgQHRhaWwgYnl0ZSBibG9jawotICogaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHRhcmdldCBibG9jay4KLSAqCi0gKiBAY2h1bmstPm1hcCBtdXN0IGhhdmUgZW5vdWdoIGZyZWUgc2xvdHMgdG8gYWNjb21tb2RhdGUgdGhlIHNwbGl0LgotICoKLSAqIENPTlRFWFQ6Ci0gKiBwY3B1X2xvY2suCi0gKi8KLXN0YXRpYyB2b2lkIHBjcHVfc3BsaXRfYmxvY2soc3RydWN0IHBjcHVfY2h1bmsgKmNodW5rLCBpbnQgaSwKLQkJCSAgICAgaW50IGhlYWQsIGludCB0YWlsKQotewotCWludCBucl9leHRyYSA9ICEhaGVhZCArICEhdGFpbDsKLQotCUJVR19PTihjaHVuay0+bWFwX2FsbG9jIDwgY2h1bmstPm1hcF91c2VkICsgbnJfZXh0cmEpOwotCi0JLyogaW5zZXJ0IG5ldyBzdWJibG9ja3MgKi8KLQltZW1tb3ZlKCZjaHVuay0+bWFwW2kgKyBucl9leHRyYV0sICZjaHVuay0+bWFwW2ldLAotCQlzaXplb2YoY2h1bmstPm1hcFswXSkgKiAoY2h1bmstPm1hcF91c2VkIC0gaSkpOwotCWNodW5rLT5tYXBfdXNlZCArPSBucl9leHRyYTsKLQotCWlmIChoZWFkKSB7Ci0JCWNodW5rLT5tYXBbaSArIDFdID0gY2h1bmstPm1hcFtpXSAtIGhlYWQ7Ci0JCWNodW5rLT5tYXBbaSsrXSA9IGhlYWQ7Ci0JfQotCWlmICh0YWlsKSB7Ci0JCWNodW5rLT5tYXBbaSsrXSAtPSB0YWlsOwotCQljaHVuay0+bWFwW2ldID0gdGFpbDsKLQl9Ci19Ci0KLS8qKgogICogcGNwdV9hbGxvY19hcmVhIC0gYWxsb2NhdGUgYXJlYSBmcm9tIGEgcGNwdV9jaHVuawogICogQGNodW5rOiBjaHVuayBvZiBpbnRlcmVzdAogICogQHNpemU6IHdhbnRlZCBzaXplIGluIGJ5dGVzCkBAIC00ODMsMTkgKzQ0MiwyNyBAQAogCWludCBvc2xvdCA9IHBjcHVfY2h1bmtfc2xvdChjaHVuayk7CiAJaW50IG1heF9jb250aWcgPSAwOwogCWludCBpLCBvZmY7CisJYm9vbCBzZWVuX2ZyZWUgPSBmYWxzZTsKKwlpbnQgKnA7CiAKLQlmb3IgKGkgPSAwLCBvZmYgPSAwOyBpIDwgY2h1bmstPm1hcF91c2VkOyBvZmYgKz0gYWJzKGNodW5rLT5tYXBbaSsrXSkpIHsKLQkJYm9vbCBpc19sYXN0ID0gaSArIDEgPT0gY2h1bmstPm1hcF91c2VkOworCWZvciAoaSA9IGNodW5rLT5maXJzdF9mcmVlLCBwID0gY2h1bmstPm1hcCArIGk7IGkgPCBjaHVuay0+bWFwX3VzZWQ7IGkrKywgcCsrKSB7CiAJCWludCBoZWFkLCB0YWlsOworCQlpbnQgdGhpc19zaXplOworCisJCW9mZiA9ICpwOworCQlpZiAob2ZmICYgMSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIGV4dHJhIGZvciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgKi8KIAkJaGVhZCA9IEFMSUdOKG9mZiwgYWxpZ24pIC0gb2ZmOwotCQlCVUdfT04oaSA9PSAwICYmIGhlYWQgIT0gMCk7CiAKLQkJaWYgKGNodW5rLT5tYXBbaV0gPCAwKQotCQkJY29udGludWU7Ci0JCWlmIChjaHVuay0+bWFwW2ldIDwgaGVhZCArIHNpemUpIHsKLQkJCW1heF9jb250aWcgPSBtYXgoY2h1bmstPm1hcFtpXSwgbWF4X2NvbnRpZyk7CisJCXRoaXNfc2l6ZSA9IChwWzFdICYgfjEpIC0gb2ZmOworCQlpZiAodGhpc19zaXplIDwgaGVhZCArIHNpemUpIHsKKwkJCWlmICghc2Vlbl9mcmVlKSB7CisJCQkJY2h1bmstPmZpcnN0X2ZyZWUgPSBpOworCQkJCXNlZW5fZnJlZSA9IHRydWU7CisJCQl9CisJCQltYXhfY29udGlnID0gbWF4KHRoaXNfc2l6ZSwgbWF4X2NvbnRpZyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC01MDUsNDQgKzQ3Miw1OSBAQAogCQkgKiB0aGFuIHNpemVvZihpbnQpLCB3aGljaCBpcyB2ZXJ5IHNtYWxsIGJ1dCBpc24ndCB0b28KIAkJICogdW5jb21tb24gZm9yIHBlcmNwdSBhbGxvY2F0aW9ucy4KIAkJICovCi0JCWlmIChoZWFkICYmIChoZWFkIDwgc2l6ZW9mKGludCkgfHwgY2h1bmstPm1hcFtpIC0gMV0gPiAwKSkgewotCQkJaWYgKGNodW5rLT5tYXBbaSAtIDFdID4gMCkKLQkJCQljaHVuay0+bWFwW2kgLSAxXSArPSBoZWFkOwotCQkJZWxzZSB7Ci0JCQkJY2h1bmstPm1hcFtpIC0gMV0gLT0gaGVhZDsKKwkJaWYgKGhlYWQgJiYgKGhlYWQgPCBzaXplb2YoaW50KSB8fCAhKHBbLTFdICYgMSkpKSB7CisJCQkqcCA9IG9mZiArPSBoZWFkOworCQkJaWYgKHBbLTFdICYgMSkKIAkJCQljaHVuay0+ZnJlZV9zaXplIC09IGhlYWQ7Ci0JCQl9Ci0JCQljaHVuay0+bWFwW2ldIC09IGhlYWQ7Ci0JCQlvZmYgKz0gaGVhZDsKKwkJCWVsc2UKKwkJCQltYXhfY29udGlnID0gbWF4KCpwIC0gcFstMV0sIG1heF9jb250aWcpOworCQkJdGhpc19zaXplIC09IGhlYWQ7CiAJCQloZWFkID0gMDsKIAkJfQogCiAJCS8qIGlmIHRhaWwgaXMgc21hbGwsIGp1c3Qga2VlcCBpdCBhcm91bmQgKi8KLQkJdGFpbCA9IGNodW5rLT5tYXBbaV0gLSBoZWFkIC0gc2l6ZTsKLQkJaWYgKHRhaWwgPCBzaXplb2YoaW50KSkKKwkJdGFpbCA9IHRoaXNfc2l6ZSAtIGhlYWQgLSBzaXplOworCQlpZiAodGFpbCA8IHNpemVvZihpbnQpKSB7CiAJCQl0YWlsID0gMDsKKwkJCXNpemUgPSB0aGlzX3NpemUgLSBoZWFkOworCQl9CiAKIAkJLyogc3BsaXQgaWYgd2FycmFudGVkICovCiAJCWlmIChoZWFkIHx8IHRhaWwpIHsKLQkJCXBjcHVfc3BsaXRfYmxvY2soY2h1bmssIGksIGhlYWQsIHRhaWwpOworCQkJaW50IG5yX2V4dHJhID0gISFoZWFkICsgISF0YWlsOworCisJCQkvKiBpbnNlcnQgbmV3IHN1YmJsb2NrcyAqLworCQkJbWVtbW92ZShwICsgbnJfZXh0cmEgKyAxLCBwICsgMSwKKwkJCQlzaXplb2YoY2h1bmstPm1hcFswXSkgKiAoY2h1bmstPm1hcF91c2VkIC0gaSkpOworCQkJY2h1bmstPm1hcF91c2VkICs9IG5yX2V4dHJhOworCiAJCQlpZiAoaGVhZCkgewotCQkJCWkrKzsKLQkJCQlvZmYgKz0gaGVhZDsKLQkJCQltYXhfY29udGlnID0gbWF4KGNodW5rLT5tYXBbaSAtIDFdLCBtYXhfY29udGlnKTsKKwkJCQlpZiAoIXNlZW5fZnJlZSkgeworCQkJCQljaHVuay0+Zmlyc3RfZnJlZSA9IGk7CisJCQkJCXNlZW5fZnJlZSA9IHRydWU7CisJCQkJfQorCQkJCSorK3AgPSBvZmYgKz0gaGVhZDsKKwkJCQkrK2k7CisJCQkJbWF4X2NvbnRpZyA9IG1heChoZWFkLCBtYXhfY29udGlnKTsKIAkJCX0KLQkJCWlmICh0YWlsKQotCQkJCW1heF9jb250aWcgPSBtYXgoY2h1bmstPm1hcFtpICsgMV0sIG1heF9jb250aWcpOworCQkJaWYgKHRhaWwpIHsKKwkJCQlwWzFdID0gb2ZmICsgc2l6ZTsKKwkJCQltYXhfY29udGlnID0gbWF4KHRhaWwsIG1heF9jb250aWcpOworCQkJfQogCQl9CiAKKwkJaWYgKCFzZWVuX2ZyZWUpCisJCQljaHVuay0+Zmlyc3RfZnJlZSA9IGkgKyAxOworCiAJCS8qIHVwZGF0ZSBoaW50IGFuZCBtYXJrIGFsbG9jYXRlZCAqLwotCQlpZiAoaXNfbGFzdCkKKwkJaWYgKGkgKyAxID09IGNodW5rLT5tYXBfdXNlZCkKIAkJCWNodW5rLT5jb250aWdfaGludCA9IG1heF9jb250aWc7IC8qIGZ1bGx5IHNjYW5uZWQgKi8KIAkJZWxzZQogCQkJY2h1bmstPmNvbnRpZ19oaW50ID0gbWF4KGNodW5rLT5jb250aWdfaGludCwKIAkJCQkJCSBtYXhfY29udGlnKTsKIAotCQljaHVuay0+ZnJlZV9zaXplIC09IGNodW5rLT5tYXBbaV07Ci0JCWNodW5rLT5tYXBbaV0gPSAtY2h1bmstPm1hcFtpXTsKKwkJY2h1bmstPmZyZWVfc2l6ZSAtPSBzaXplOworCQkqcCB8PSAxOwogCiAJCXBjcHVfY2h1bmtfcmVsb2NhdGUoY2h1bmssIG9zbG90KTsKIAkJcmV0dXJuIG9mZjsKQEAgLTU3MCwzNCArNTUyLDUwIEBACiBzdGF0aWMgdm9pZCBwY3B1X2ZyZWVfYXJlYShzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bmssIGludCBmcmVlbWUpCiB7CiAJaW50IG9zbG90ID0gcGNwdV9jaHVua19zbG90KGNodW5rKTsKLQlpbnQgaSwgb2ZmOworCWludCBvZmYgPSAwOworCXVuc2lnbmVkIGksIGo7CisJaW50IHRvX2ZyZWUgPSAwOworCWludCAqcDsKIAotCWZvciAoaSA9IDAsIG9mZiA9IDA7IGkgPCBjaHVuay0+bWFwX3VzZWQ7IG9mZiArPSBhYnMoY2h1bmstPm1hcFtpKytdKSkKLQkJaWYgKG9mZiA9PSBmcmVlbWUpCi0JCQlicmVhazsKKwlmcmVlbWUgfD0gMTsJLyogd2UgYXJlIHNlYXJjaGluZyBmb3IgPGdpdmVuIG9mZnNldCwgaW4gdXNlPiBwYWlyICovCisKKwlpID0gMDsKKwlqID0gY2h1bmstPm1hcF91c2VkOworCXdoaWxlIChpICE9IGopIHsKKwkJdW5zaWduZWQgayA9IChpICsgaikgLyAyOworCQlvZmYgPSBjaHVuay0+bWFwW2tdOworCQlpZiAob2ZmIDwgZnJlZW1lKQorCQkJaSA9IGsgKyAxOworCQllbHNlIGlmIChvZmYgPiBmcmVlbWUpCisJCQlqID0gazsKKwkJZWxzZQorCQkJaSA9IGogPSBrOworCX0KIAlCVUdfT04ob2ZmICE9IGZyZWVtZSk7Ci0JQlVHX09OKGNodW5rLT5tYXBbaV0gPiAwKTsKIAotCWNodW5rLT5tYXBbaV0gPSAtY2h1bmstPm1hcFtpXTsKLQljaHVuay0+ZnJlZV9zaXplICs9IGNodW5rLT5tYXBbaV07CisJaWYgKGkgPCBjaHVuay0+Zmlyc3RfZnJlZSkKKwkJY2h1bmstPmZpcnN0X2ZyZWUgPSBpOwogCi0JLyogbWVyZ2Ugd2l0aCBwcmV2aW91cz8gKi8KLQlpZiAoaSA+IDAgJiYgY2h1bmstPm1hcFtpIC0gMV0gPj0gMCkgewotCQljaHVuay0+bWFwW2kgLSAxXSArPSBjaHVuay0+bWFwW2ldOwotCQljaHVuay0+bWFwX3VzZWQtLTsKLQkJbWVtbW92ZSgmY2h1bmstPm1hcFtpXSwgJmNodW5rLT5tYXBbaSArIDFdLAotCQkJKGNodW5rLT5tYXBfdXNlZCAtIGkpICogc2l6ZW9mKGNodW5rLT5tYXBbMF0pKTsKLQkJaS0tOwotCX0KKwlwID0gY2h1bmstPm1hcCArIGk7CisJKnAgPSBvZmYgJj0gfjE7CisJY2h1bmstPmZyZWVfc2l6ZSArPSAocFsxXSAmIH4xKSAtIG9mZjsKKwogCS8qIG1lcmdlIHdpdGggbmV4dD8gKi8KLQlpZiAoaSArIDEgPCBjaHVuay0+bWFwX3VzZWQgJiYgY2h1bmstPm1hcFtpICsgMV0gPj0gMCkgewotCQljaHVuay0+bWFwW2ldICs9IGNodW5rLT5tYXBbaSArIDFdOwotCQljaHVuay0+bWFwX3VzZWQtLTsKLQkJbWVtbW92ZSgmY2h1bmstPm1hcFtpICsgMV0sICZjaHVuay0+bWFwW2kgKyAyXSwKLQkJCShjaHVuay0+bWFwX3VzZWQgLSAoaSArIDEpKSAqIHNpemVvZihjaHVuay0+bWFwWzBdKSk7CisJaWYgKCEocFsxXSAmIDEpKQorCQl0b19mcmVlKys7CisJLyogbWVyZ2Ugd2l0aCBwcmV2aW91cz8gKi8KKwlpZiAoaSA+IDAgJiYgIShwWy0xXSAmIDEpKSB7CisJCXRvX2ZyZWUrKzsKKwkJaS0tOworCQlwLS07CisJfQorCWlmICh0b19mcmVlKSB7CisJCWNodW5rLT5tYXBfdXNlZCAtPSB0b19mcmVlOworCQltZW1tb3ZlKHAgKyAxLCBwICsgMSArIHRvX2ZyZWUsCisJCQkoY2h1bmstPm1hcF91c2VkIC0gaSkgKiBzaXplb2YoY2h1bmstPm1hcFswXSkpOwogCX0KIAotCWNodW5rLT5jb250aWdfaGludCA9IG1heChjaHVuay0+bWFwW2ldLCBjaHVuay0+Y29udGlnX2hpbnQpOworCWNodW5rLT5jb250aWdfaGludCA9IG1heChjaHVuay0+bWFwW2kgKyAxXSAtIGNodW5rLT5tYXBbaV0gLSAxLCBjaHVuay0+Y29udGlnX2hpbnQpOwogCXBjcHVfY2h1bmtfcmVsb2NhdGUoY2h1bmssIG9zbG90KTsKIH0KIApAQCAtNjE3LDcgKzYxNSw5IEBACiAJfQogCiAJY2h1bmstPm1hcF9hbGxvYyA9IFBDUFVfREZMX01BUF9BTExPQzsKLQljaHVuay0+bWFwW2NodW5rLT5tYXBfdXNlZCsrXSA9IHBjcHVfdW5pdF9zaXplOworCWNodW5rLT5tYXBbMF0gPSAwOworCWNodW5rLT5tYXBbMV0gPSBwY3B1X3VuaXRfc2l6ZSB8IDE7CisJY2h1bmstPm1hcF91c2VkID0gMTsKIAogCUlOSVRfTElTVF9IRUFEKCZjaHVuay0+bGlzdCk7CiAJY2h1bmstPmZyZWVfc2l6ZSA9IHBjcHVfdW5pdF9zaXplOwpAQCAtNzEzLDYgKzcxMywxNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCBfX3BlcmNwdSAqcHRyOwogCisJLyoKKwkgKiBXZSB3YW50IHRoZSBsb3dlc3QgYml0IG9mIG9mZnNldCBhdmFpbGFibGUgZm9yIGluLXVzZS9mcmVlCisJICogaW5kaWNhdG9yLCBzbyBmb3JjZSA+PSAxNmJpdCBhbGlnbm1lbnQgYW5kIG1ha2Ugc2l6ZSBldmVuLgorCSAqLworCWlmICh1bmxpa2VseShhbGlnbiA8IDIpKQorCQlhbGlnbiA9IDI7CisKKwlpZiAodW5saWtlbHkoc2l6ZSAmIDEpKQorCQlzaXplKys7CisKIAlpZiAodW5saWtlbHkoIXNpemUgfHwgc2l6ZSA+IFBDUFVfTUlOX1VOSVRfU0laRSB8fCBhbGlnbiA+IFBBR0VfU0laRSkpIHsKIAkJV0FSTih0cnVlLCAiaWxsZWdhbCBzaXplICglenUpIG9yIGFsaWduICglenUpIGZvciAiCiAJCSAgICAgInBlcmNwdSBhbGxvY2F0aW9uXG4iLCBzaXplLCBhbGlnbik7CkBAIC0xMzQzLDkgKzEzNTMsMTMgQEAKIAl9CiAJc2NodW5rLT5jb250aWdfaGludCA9IHNjaHVuay0+ZnJlZV9zaXplOwogCi0Jc2NodW5rLT5tYXBbc2NodW5rLT5tYXBfdXNlZCsrXSA9IC1haS0+c3RhdGljX3NpemU7CisJc2NodW5rLT5tYXBbMF0gPSAxOworCXNjaHVuay0+bWFwWzFdID0gYWktPnN0YXRpY19zaXplOworCXNjaHVuay0+bWFwX3VzZWQgPSAxOwogCWlmIChzY2h1bmstPmZyZWVfc2l6ZSkKLQkJc2NodW5rLT5tYXBbc2NodW5rLT5tYXBfdXNlZCsrXSA9IHNjaHVuay0+ZnJlZV9zaXplOworCQlzY2h1bmstPm1hcFsrK3NjaHVuay0+bWFwX3VzZWRdID0gMSB8IChhaS0+c3RhdGljX3NpemUgKyBzY2h1bmstPmZyZWVfc2l6ZSk7CisJZWxzZQorCQlzY2h1bmstPm1hcFsxXSB8PSAxOwogCiAJLyogaW5pdCBkeW5hbWljIGNodW5rIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChkeW5fc2l6ZSkgewpAQCAtMTM1OCw4ICsxMzcyLDEwIEBACiAJCWJpdG1hcF9maWxsKGRjaHVuay0+cG9wdWxhdGVkLCBwY3B1X3VuaXRfcGFnZXMpOwogCiAJCWRjaHVuay0+Y29udGlnX2hpbnQgPSBkY2h1bmstPmZyZWVfc2l6ZSA9IGR5bl9zaXplOwotCQlkY2h1bmstPm1hcFtkY2h1bmstPm1hcF91c2VkKytdID0gLXBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQ7Ci0JCWRjaHVuay0+bWFwW2RjaHVuay0+bWFwX3VzZWQrK10gPSBkY2h1bmstPmZyZWVfc2l6ZTsKKwkJZGNodW5rLT5tYXBbMF0gPSAxOworCQlkY2h1bmstPm1hcFsxXSA9IHBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQ7CisJCWRjaHVuay0+bWFwWzJdID0gKHBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQgKyBkY2h1bmstPmZyZWVfc2l6ZSkgfCAxOworCQlkY2h1bmstPm1hcF91c2VkID0gMjsKIAl9CiAKIAkvKiBsaW5rIHRoZSBmaXJzdCBjaHVuayBpbiAqLwpkaWZmIC0tZ2l0IGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKaW5kZXggZmQyNmQwNC4uM2M1Y2Y2OCAxMDA2NDQKLS0tIGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYworKysgYi9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jCkBAIC00NTYsMjUgKzQ1NiwyMyBAQAogCXJldHVybiByYzsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1jb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYoY29tcGF0X3BpZF90IHBpZCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqbHZlYywKLQkJCSAgICB1bnNpZ25lZCBsb25nIGxpb3ZjbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnJ2ZWMsCi0JCQkgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHByb2Nlc3Nfdm1fcmVhZHYsIGNvbXBhdF9waWRfdCwgcGlkLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKiwgbHZlYywKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBsaW92Y250LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKiwgcnZlYywKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCByaW92Y250LAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIGZsYWdzKQogewogCXJldHVybiBjb21wYXRfcHJvY2Vzc192bV9ydyhwaWQsIGx2ZWMsIGxpb3ZjbnQsIHJ2ZWMsCiAJCQkJICAgIHJpb3ZjbnQsIGZsYWdzLCAwKTsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1jb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KGNvbXBhdF9waWRfdCBwaWQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGxpb3ZjbnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHJpb3ZjbnQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHByb2Nlc3Nfdm1fd3JpdGV2LCBjb21wYXRfcGlkX3QsIHBpZCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosIGx2ZWMsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgbGlvdmNudCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosIHJ2ZWMsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgcmlvdmNudCwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBmbGFncykKIHsKIAlyZXR1cm4gY29tcGF0X3Byb2Nlc3Nfdm1fcncocGlkLCBsdmVjLCBsaW92Y250LCBydmVjLAogCQkJCSAgICByaW92Y250LCBmbGFncywgMSk7CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggZDlkNDIzMS4uMTFjZjMyMiAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtMTE2NSw2ICsxMTY1LDE2IEBACiAJCX0KIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlLAogCQkJICAgc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHBhZ2UpKSk7CisJfSBlbHNlIGlmIChwdGVfdW51c2VkKHB0ZXZhbCkpIHsKKwkJLyoKKwkJICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm8KKwkJICogaW50ZXJlc3QgYW55bW9yZS4gU2ltcGx5IGRpc2NhcmQgdGhlIHB0ZSwgdm1zY2FuCisJCSAqIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LgorCQkgKi8KKwkJaWYgKFBhZ2VBbm9uKHBhZ2UpKQorCQkJZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7CisJCWVsc2UKKwkJCWRlY19tbV9jb3VudGVyKG1tLCBNTV9GSUxFUEFHRVMpOwogCX0gZWxzZSBpZiAoUGFnZUFub24ocGFnZSkpIHsKIAkJc3dwX2VudHJ5X3QgZW50cnkgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKIAkJcHRlX3Qgc3dwX3B0ZTsKQEAgLTEzNjAsOCArMTM3MCw5IEBACiB9CiAKIHN0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX25vbmxpbmVhcihzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdm9pZCAqYXJnKQogeworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCWludCByZXQgPSBTV0FQX0FHQUlOOwogCXVuc2lnbmVkIGxvbmcgY3Vyc29yOwogCXVuc2lnbmVkIGxvbmcgbWF4X25sX2N1cnNvciA9IDA7CkBAIC0xNjYzLDcgKzE2NzQsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZtYXBwaW5nLT5pX21tYXBfbm9ubGluZWFyKSkKIAkJZ290byBkb25lOwogCi0JcmV0ID0gcndjLT5maWxlX25vbmxpbmVhcihwYWdlLCBtYXBwaW5nLCB2bWEpOworCXJldCA9IHJ3Yy0+ZmlsZV9ub25saW5lYXIocGFnZSwgbWFwcGluZywgcndjLT5hcmcpOwogCiBkb25lOgogCW11dGV4X3VubG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmMgYi9uZXQvODAyMXEvdmxhbi5jCmluZGV4IGVjOTkwOTkuLjE3NTI3M2YgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW4uYwpAQCAtMzA3LDkgKzMwNywxMSBAQAogc3RhdGljIHZvaWQgdmxhbl90cmFuc2Zlcl9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuZGV2KQogeworCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdih2bGFuZGV2KTsKKwogCXZsYW5kZXYtPmdzb19tYXhfc2l6ZSA9IGRldi0+Z3NvX21heF9zaXplOwogCi0JaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCkKKwlpZiAodmxhbl9od19vZmZsb2FkX2NhcGFibGUoZGV2LT5mZWF0dXJlcywgdmxhbi0+dmxhbl9wcm90bykpCiAJCXZsYW5kZXYtPmhhcmRfaGVhZGVyX2xlbiA9IGRldi0+aGFyZF9oZWFkZXJfbGVuOwogCWVsc2UKIAkJdmxhbmRldi0+aGFyZF9oZWFkZXJfbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBWTEFOX0hMRU47CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9kZXYuYyBiL25ldC84MDIxcS92bGFuX2Rldi5jCmluZGV4IDRiNjVhYTQuLjI3YmZlMmYgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyBiL25ldC84MDIxcS92bGFuX2Rldi5jCkBAIC01NzgsNiArNTc4LDkgQEAKIAogCWRldi0+ZmVhdHVyZXMgfD0gcmVhbF9kZXYtPnZsYW5fZmVhdHVyZXMgfCBORVRJRl9GX0xMVFg7CiAJZGV2LT5nc29fbWF4X3NpemUgPSByZWFsX2Rldi0+Z3NvX21heF9zaXplOworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WTEFOX0ZFQVRVUkVTKQorCQluZXRkZXZfd2FybihyZWFsX2RldiwgIlZMQU4gZmVhdHVyZXMgYXJlIHNldCBpbmNvcnJlY3RseS4gIFEtaW4tUSBjb25maWd1cmF0aW9ucyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LlxuIik7CisKIAogCS8qIGlwdjYgc2hhcmVkIGNhcmQgcmVsYXRlZCBzdHVmZiAqLwogCWRldi0+ZGV2X2lkID0gcmVhbF9kZXYtPmRldl9pZDsKQEAgLTU5Miw3ICs1OTUsOCBAQAogI2VuZGlmCiAKIAlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IHJlYWxfZGV2LT5uZWVkZWRfaGVhZHJvb207Ci0JaWYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYKSB7CisJaWYgKHZsYW5faHdfb2ZmbG9hZF9jYXBhYmxlKHJlYWxfZGV2LT5mZWF0dXJlcywKKwkJCQkgICAgdmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX3Byb3RvKSkgewogCQlkZXYtPmhlYWRlcl9vcHMgICAgICA9ICZ2bGFuX3Bhc3N0aHJ1X2hlYWRlcl9vcHM7CiAJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcmVhbF9kZXYtPmhhcmRfaGVhZGVyX2xlbjsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggNjNmMDQ1NS4uOGZlOGI3MSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC00OSwxNCArNDksMTQgQEAKIAlicnN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKIAl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYnJzdGF0cy0+c3luY3ApOwogCi0JaWYgKCFicl9hbGxvd2VkX2luZ3Jlc3MoYnIsIGJyX2dldF92bGFuX2luZm8oYnIpLCBza2IsICZ2aWQpKQotCQlnb3RvIG91dDsKLQogCUJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldiA9IGRldjsKIAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAKKwlpZiAoIWJyX2FsbG93ZWRfaW5ncmVzcyhiciwgYnJfZ2V0X3ZsYW5faW5mbyhiciksIHNrYiwgJnZpZCkpCisJCWdvdG8gb3V0OworCiAJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKQogCQlicl9mbG9vZF9kZWxpdmVyKGJyLCBza2IsIGZhbHNlKTsKIAllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCmluZGV4IDI4ZDU0NDYuLmQwY2NhM2MgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYworKysgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKQEAgLTI5LDYgKzI5LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsICpicmRldiA9IEJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldjsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihicmRldik7CiAJc3RydWN0IHBjcHVfc3dfbmV0c3RhdHMgKmJyc3RhdHMgPSB0aGlzX2NwdV9wdHIoYnItPnN0YXRzKTsKKwlzdHJ1Y3QgbmV0X3BvcnRfdmxhbnMgKnB2OwogCiAJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYnJzdGF0cy0+c3luY3ApOwogCWJyc3RhdHMtPnJ4X3BhY2tldHMrKzsKQEAgLTM5LDE4ICs0MCwxOCBAQAogCSAqIHBhY2tldCBpcyBhbGxvd2VkIGV4Y2VwdCBpbiBwcm9taXNjIG1vZHVlIHdoZW4gc29tZW9uZQogCSAqIG1heSBiZSBydW5uaW5nIHBhY2tldCBjYXB0dXJlLgogCSAqLworCXB2ID0gYnJfZ2V0X3ZsYW5faW5mbyhicik7CiAJaWYgKCEoYnJkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmCi0JICAgICFicl9hbGxvd2VkX2VncmVzcyhiciwgYnJfZ2V0X3ZsYW5faW5mbyhiciksIHNrYikpIHsKKwkgICAgIWJyX2FsbG93ZWRfZWdyZXNzKGJyLCBwdiwgc2tiKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KIAotCXNrYiA9IGJyX2hhbmRsZV92bGFuKGJyLCBicl9nZXRfdmxhbl9pbmZvKGJyKSwgc2tiKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCiAJaW5kZXYgPSBza2ItPmRldjsKIAlza2ItPmRldiA9IGJyZGV2OworCXNrYiA9IGJyX2hhbmRsZV92bGFuKGJyLCBwdiwgc2tiKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCiAJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX0lOLCBza2IsIGluZGV2LCBOVUxMLAogCQkgICAgICAgbmV0aWZfcmVjZWl2ZV9za2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl92bGFuLmMgYi9uZXQvYnJpZGdlL2JyX3ZsYW4uYwppbmRleCA4MjQ5Y2E3Ni4uZjIzYzc0YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl92bGFuLmMKKysrIGIvbmV0L2JyaWRnZS9icl92bGFuLmMKQEAgLTExOSwyMiArMTE5LDYgQEAKIAlrZnJlZV9yY3UodiwgcmN1KTsKIH0KIAotLyogU3RyaXAgdGhlIHRhZyBmcm9tIHRoZSBwYWNrZXQuICBXaWxsIHJldHVybiBza2Igd2l0aCB0Y2kgc2V0IDAuICAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICpicl92bGFuX3VudGFnKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7Ci0JCXNrYi0+dmxhbl90Y2kgPSAwOwotCQlyZXR1cm4gc2tiOwotCX0KLQotCXNrYi0+dmxhbl90Y2kgPSAwOwotCXNrYiA9IHZsYW5fdW50YWcoc2tiKTsKLQlpZiAoc2tiKQotCQlza2ItPnZsYW5fdGNpID0gMDsKLQotCXJldHVybiBza2I7Ci19Ci0KIHN0cnVjdCBza19idWZmICpicl9oYW5kbGVfdmxhbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9wb3J0X3ZsYW5zICpwdiwKIAkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTQ0LDEzICsxMjgsMjcgQEAKIAlpZiAoIWJyLT52bGFuX2VuYWJsZWQpCiAJCWdvdG8gb3V0OwogCisJLyogVmxhbiBmaWx0ZXIgdGFibGUgbXVzdCBiZSBjb25maWd1cmVkIGF0IHRoaXMgcG9pbnQuICBUaGUKKwkgKiBvbmx5IGV4Y2VwdGlvbiBpcyB0aGUgYnJpZGdlIGlzIHNldCBpbiBwcm9taXNjIG1vZGUgYW5kIHRoZQorCSAqIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgdGhlIGJyaWRnZSBkZXZpY2UuICBJbiB0aGlzIGNhc2UKKwkgKiBwYXNzIHRoZSBwYWNrZXQgYXMgaXMuCisJICovCisJaWYgKCFwdikgeworCQlpZiAoKGJyLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmIHNrYi0+ZGV2ID09IGJyLT5kZXYpIHsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwogCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCB0aGUgZnJhbWUgd2FzIGZpbHRlcmVkIGFuZCBjb250YWlucwogCSAqIGEgdmFsaWQgdmxhbiBpZC4gIElmIHRoZSB2bGFuIGlkIGlzIHNldCBpbiB0aGUgdW50YWdnZWQgYml0bWFwLAogCSAqIHNlbmQgdW50YWdnZWQ7IG90aGVyd2lzZSwgc2VuZCB0YWdnZWQuCiAJICovCiAJYnJfdmxhbl9nZXRfdGFnKHNrYiwgJnZpZCk7CiAJaWYgKHRlc3RfYml0KHZpZCwgcHYtPnVudGFnZ2VkX2JpdG1hcCkpCi0JCXNrYiA9IGJyX3ZsYW5fdW50YWcoc2tiKTsKKwkJc2tiLT52bGFuX3RjaSA9IDA7CiAKIG91dDoKIAlyZXR1cm4gc2tiOwpAQCAtMTc0LDYgKzE3MiwxOCBAQAogCWlmICghdikKIAkJcmV0dXJuIGZhbHNlOwogCisJLyogSWYgdmxhbiB0eCBvZmZsb2FkIGlzIGRpc2FibGVkIG9uIGJyaWRnZSBkZXZpY2UgYW5kIGZyYW1lIHdhcworCSAqIHNlbnQgZnJvbSB2bGFuIGRldmljZSBvbiB0aGUgYnJpZGdlIGRldmljZSwgaXQgZG9lcyBub3QgaGF2ZQorCSAqIEhXIGFjY2VsZXJhdGVkIHZsYW4gdGFnLgorCSAqLworCWlmICh1bmxpa2VseSghdmxhbl90eF90YWdfcHJlc2VudChza2IpICYmCisJCSAgICAgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpIHx8CisJCSAgICAgIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMUFEKSkpKSB7CisJCXNrYiA9IHZsYW5fdW50YWcoc2tiKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwogCWVyciA9IGJyX3ZsYW5fZ2V0X3RhZyhza2IsIHZpZCk7CiAJaWYgKCEqdmlkKSB7CiAJCXUxNiBwdmlkID0gYnJfZ2V0X3B2aWQodik7CmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggZjUwMTYxZi4uOWE3NmVhZiAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMzg0LDggKzM4NCw4IEBACiAJcmV0dXJuIHNvY2tfc2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShzZXRzb2Nrb3B0LCBpbnQsIGZkLCBpbnQsIGxldmVsLCBpbnQsIG9wdG5hbWUsCisJCSAgICAgICBjaGFyIF9fdXNlciAqLCBvcHR2YWwsIHVuc2lnbmVkIGludCwgb3B0bGVuKQogewogCWludCBlcnI7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOwpAQCAtNTA0LDggKzUwNCw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXBucyk7CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldHNvY2tvcHQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoZ2V0c29ja29wdCwgaW50LCBmZCwgaW50LCBsZXZlbCwgaW50LCBvcHRuYW1lLAorCQkgICAgICAgY2hhciBfX3VzZXIgKiwgb3B0dmFsLCBpbnQgX191c2VyICosIG9wdGxlbikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKQEAgLTczNSwxNSArNzM1LDE1IEBACiB9OwogI3VuZGVmIEFMCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbmRtc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzZW5kbXNnLCBpbnQsIGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiwgbXNnLCB1bnNpZ25lZCBpbnQsIGZsYWdzKQogewogCWlmIChmbGFncyAmIE1TR19DTVNHX0NPTVBBVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIF9fc3lzX3NlbmRtc2coZmQsIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKW1zZywgZmxhZ3MgfCBNU0dfQ01TR19DT01QQVQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbW1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKm1tc2csCi0JCQkJICAgIHVuc2lnbmVkIGludCB2bGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KHNlbmRtbXNnLCBpbnQsIGZkLCBzdHJ1Y3QgY29tcGF0X21tc2doZHIgX191c2VyICosIG1tc2csCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIHZsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MpCiB7CiAJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc1MSwyOCArNzUxLDI4IEBACiAJCQkgICAgICBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Ztc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhyZWN2bXNnLCBpbnQsIGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiwgbXNnLCB1bnNpZ25lZCBpbnQsIGZsYWdzKQogewogCWlmIChmbGFncyAmIE1TR19DTVNHX0NPTVBBVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIF9fc3lzX3JlY3Ztc2coZmQsIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKW1zZywgZmxhZ3MgfCBNU0dfQ01TR19DT01QQVQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2KGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChyZWN2LCBpbnQsIGZkLCB2b2lkIF9fdXNlciAqLCBidWYsIGNvbXBhdF9zaXplX3QsIGxlbiwgdW5zaWduZWQgaW50LCBmbGFncykKIHsKIAlyZXR1cm4gc3lzX3JlY3YoZmQsIGJ1ZiwgbGVuLCBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Zmcm9tKGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICphZGRyLAotCQkJCSAgICBpbnQgX191c2VyICphZGRybGVuKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNihyZWN2ZnJvbSwgaW50LCBmZCwgdm9pZCBfX3VzZXIgKiwgYnVmLCBjb21wYXRfc2l6ZV90LCBsZW4sCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIGFkZHIsCisJCSAgICAgICBpbnQgX191c2VyICosIGFkZHJsZW4pCiB7CiAJcmV0dXJuIHN5c19yZWN2ZnJvbShmZCwgYnVmLCBsZW4sIGZsYWdzIHwgTVNHX0NNU0dfQ09NUEFULCBhZGRyLCBhZGRybGVuKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdm1tc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21tc2doZHIgX191c2VyICptbXNnLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgdmxlbiwgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdGltZW91dCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUocmVjdm1tc2csIGludCwgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKiwgbW1zZywKKwkJICAgICAgIHVuc2lnbmVkIGludCwgdmxlbiwgdW5zaWduZWQgaW50LCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRpbWVvdXQpCiB7CiAJaW50IGRhdGFncmFtczsKIAlzdHJ1Y3QgdGltZXNwZWMga3RzcGVjOwpAQCAtNzk1LDcgKzc5NSw3IEBACiAJcmV0dXJuIGRhdGFncmFtczsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc29ja2V0Y2FsbChpbnQgY2FsbCwgdTMyIF9fdXNlciAqYXJncykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoc29ja2V0Y2FsbCwgaW50LCBjYWxsLCB1MzIgX191c2VyICosIGFyZ3MpCiB7CiAJaW50IHJldDsKIAl1MzIgYVs2XTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggYjFiMGM4ZC4uYmMzYzg5NyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTIyODYsNyArMjI4Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNrYl9jaGVja3N1bV9oZWxwKTsKIAotX19iZTE2IHNrYl9uZXR3b3JrX3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IpCitfX2JlMTYgc2tiX25ldHdvcmtfcHJvdG9jb2woc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpkZXB0aCkKIHsKIAlfX2JlMTYgdHlwZSA9IHNrYi0+cHJvdG9jb2w7CiAJaW50IHZsYW5fZGVwdGggPSBFVEhfSExFTjsKQEAgLTIzMTMsNiArMjMxMyw4IEBACiAJCXZsYW5fZGVwdGggKz0gVkxBTl9ITEVOOwogCX0KIAorCSpkZXB0aCA9IHZsYW5fZGVwdGg7CisKIAlyZXR1cm4gdHlwZTsKIH0KIApAQCAtMjMyNiwxMiArMjMyOCwxMyBAQAogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRVBST1RPTk9TVVBQT1JUKTsKIAlzdHJ1Y3QgcGFja2V0X29mZmxvYWQgKnB0eXBlOwotCV9fYmUxNiB0eXBlID0gc2tiX25ldHdvcmtfcHJvdG9jb2woc2tiKTsKKwlpbnQgdmxhbl9kZXB0aCA9IHNrYi0+bWFjX2xlbjsKKwlfX2JlMTYgdHlwZSA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKHNrYiwgJnZsYW5fZGVwdGgpOwogCiAJaWYgKHVubGlrZWx5KCF0eXBlKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT5tYWNfbGVuKTsKKwlfX3NrYl9wdWxsKHNrYiwgdmxhbl9kZXB0aCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHR5cGUsICZvZmZsb2FkX2Jhc2UsIGxpc3QpIHsKQEAgLTI0OTgsOCArMjUwMSwxMCBAQAogCQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogeworCWludCB0bXA7CisKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fTk9ORSAmJgotCSAgICAhY2FuX2NoZWNrc3VtX3Byb3RvY29sKGZlYXR1cmVzLCBza2JfbmV0d29ya19wcm90b2NvbChza2IpKSkgeworCSAgICAhY2FuX2NoZWNrc3VtX3Byb3RvY29sKGZlYXR1cmVzLCBza2JfbmV0d29ya19wcm90b2NvbChza2IsICZ0bXApKSkgewogCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9BTExfQ1NVTTsKIAl9IGVsc2UgaWYgKGlsbGVnYWxfaGlnaGRtYShkZXYsIHNrYikpIHsKIAkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfU0c7CkBAIC00MTMwLDggKzQxMzUsOCBAQAogCQkJc3RydWN0IHNvZnRuZXRfZGF0YSAqbmV4dCA9IHJlbXNkLT5ycHNfaXBpX25leHQ7CiAKIAkJCWlmIChjcHVfb25saW5lKHJlbXNkLT5jcHUpKQotCQkJCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKHJlbXNkLT5jcHUsCi0JCQkJCQkJICAgJnJlbXNkLT5jc2QsIDApOworCQkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyhyZW1zZC0+Y3B1LAorCQkJCQkJCSAgICZyZW1zZC0+Y3NkKTsKIAkJCXJlbXNkID0gbmV4dDsKIAkJfQogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IGE2NjRmNzguLmRmOWU2YjEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTc0Miw3ICs3NDIsNyBAQAogCXN0cnVjdCBuZF9tc2cgKm1zZzsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyOwogCi0JaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfQVJQKSkKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IG5kX21zZykpKQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDFhMGRhYzIuLjEyMGVlY2MgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC0yMTIxLDEyICsyMTIxLDEzIEBACiBzdGF0aWMgaW50IG5sbXNnX3BvcHVsYXRlX2ZkYl9maWxsKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICB1OCAqYWRkciwgdTMyIHBpZCwgdTMyIHNlcSwKLQkJCQkgICBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKQorCQkJCSAgIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJICAgaW50IG5sZmxhZ3MpCiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5kbXNnICpuZG07CiAKLQlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpuZG0pLCBOTE1fRl9NVUxUSSk7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqbmRtKSwgbmxmbGFncyk7CiAJaWYgKCFubGgpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKQEAgLTIxNjQsNyArMjE2NSw3IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3V0OwogCi0JZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGFkZHIsIDAsIDAsIHR5cGUsIE5URl9TRUxGKTsKKwllcnIgPSBubG1zZ19wb3B1bGF0ZV9mZGJfZmlsbChza2IsIGRldiwgYWRkciwgMCwgMCwgdHlwZSwgTlRGX1NFTEYsIDApOwogCWlmIChlcnIgPCAwKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlnb3RvIGVycm91dDsKQEAgLTIzODksNyArMjM5MCw4IEBACiAKIAkJZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGhhLT5hZGRyLAogCQkJCQkgICAgICBwb3J0aWQsIHNlcSwKLQkJCQkJICAgICAgUlRNX05FV05FSUdILCBOVEZfU0VMRik7CisJCQkJCSAgICAgIFJUTV9ORVdORUlHSCwgTlRGX1NFTEYsCisJCQkJCSAgICAgIE5MTV9GX01VTFRJKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogc2tpcDoKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggODY5YzdhZi4uOTBiOTZhMSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTIxMjcsMjUgKzIxMjcsMzEgQEAKICAqCiAgKglUaGUgYGhsZW5gIGFzIGNhbGN1bGF0ZWQgYnkgc2tiX3plcm9jb3B5X2hlYWRsZW4oKSBzcGVjaWZpZXMgdGhlCiAgKgloZWFkcm9vbSBpbiB0aGUgYHRvYCBidWZmZXIuCisgKgorICoJUmV0dXJuIHZhbHVlOgorICoJMDogZXZlcnl0aGluZyBpcyBPSworICoJLUVOT01FTTogY291bGRuJ3Qgb3JwaGFuIGZyYWdzIG9mIEBmcm9tIGR1ZSB0byBsYWNrIG9mIG1lbW9yeQorICoJLUVGQVVMVDogc2tiX2NvcHlfYml0cygpIGZvdW5kIHNvbWUgcHJvYmxlbSB3aXRoIHNrYiBnZW9tZXRyeQogICovCi12b2lkCi1za2JfemVyb2NvcHkoc3RydWN0IHNrX2J1ZmYgKnRvLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwgaW50IGxlbiwgaW50IGhsZW4pCitpbnQKK3NrYl96ZXJvY29weShzdHJ1Y3Qgc2tfYnVmZiAqdG8sIHN0cnVjdCBza19idWZmICpmcm9tLCBpbnQgbGVuLCBpbnQgaGxlbikKIHsKIAlpbnQgaSwgaiA9IDA7CiAJaW50IHBsZW4gPSAwOyAvKiBsZW5ndGggb2Ygc2tiLT5oZWFkIGZyYWdtZW50ICovCisJaW50IHJldDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCiAJQlVHX09OKCFmcm9tLT5oZWFkX2ZyYWcgJiYgIWhsZW4pOwogCiAJLyogZG9udCBib3RoZXIgd2l0aCBzbWFsbCBwYXlsb2FkcyAqLwotCWlmIChsZW4gPD0gc2tiX3RhaWxyb29tKHRvKSkgewotCQlza2JfY29weV9iaXRzKGZyb20sIDAsIHNrYl9wdXQodG8sIGxlbiksIGxlbik7Ci0JCXJldHVybjsKLQl9CisJaWYgKGxlbiA8PSBza2JfdGFpbHJvb20odG8pKQorCQlyZXR1cm4gc2tiX2NvcHlfYml0cyhmcm9tLCAwLCBza2JfcHV0KHRvLCBsZW4pLCBsZW4pOwogCiAJaWYgKGhsZW4pIHsKLQkJc2tiX2NvcHlfYml0cyhmcm9tLCAwLCBza2JfcHV0KHRvLCBobGVuKSwgaGxlbik7CisJCXJldCA9IHNrYl9jb3B5X2JpdHMoZnJvbSwgMCwgc2tiX3B1dCh0bywgaGxlbiksIGhsZW4pOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CiAJCWxlbiAtPSBobGVuOwogCX0gZWxzZSB7CiAJCXBsZW4gPSBtaW5fdChpbnQsIHNrYl9oZWFkbGVuKGZyb20pLCBsZW4pOwpAQCAtMjE2Myw2ICsyMTY5LDExIEBACiAJdG8tPmxlbiArPSBsZW4gKyBwbGVuOwogCXRvLT5kYXRhX2xlbiArPSBsZW4gKyBwbGVuOwogCisJaWYgKHVubGlrZWx5KHNrYl9vcnBoYW5fZnJhZ3MoZnJvbSwgR0ZQX0FUT01JQykpKSB7CisJCXNrYl90eF9lcnJvcihmcm9tKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oZnJvbSktPm5yX2ZyYWdzOyBpKyspIHsKIAkJaWYgKCFsZW4pCiAJCQlicmVhazsKQEAgLTIxNzMsNiArMjE4NCw4IEBACiAJCWorKzsKIAl9CiAJc2tiX3NoaW5mbyh0byktPm5yX2ZyYWdzID0gajsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3plcm9jb3B5KTsKIApAQCAtMjg2Niw4ICsyODc5LDkgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgaSA9IDA7CiAJaW50IHBvczsKKwlpbnQgZHVtbXk7CiAKLQlwcm90byA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKGhlYWRfc2tiKTsKKwlwcm90byA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKGhlYWRfc2tiLCAmZHVtbXkpOwogCWlmICh1bmxpa2VseSghcHJvdG8pKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZ3JlX2RlbXV4LmMgYi9uZXQvaXB2NC9ncmVfZGVtdXguYwppbmRleCAxODYzNDIyZi4uMjUwYmU3NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZ3JlX2RlbXV4LmMKKysrIGIvbmV0L2lwdjQvZ3JlX2RlbXV4LmMKQEAgLTE4Miw2ICsxODIsMTQgQEAKIAlpbnQgaTsKIAlib29sIGNzdW1fZXJyID0gZmFsc2U7CiAKKyNpZmRlZiBDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVAorCWlmIChpcHY0X2lzX211bHRpY2FzdChpcF9oZHIoc2tiKS0+ZGFkZHIpKSB7CisJCS8qIExvb3BlZCBiYWNrIHBhY2tldCwgZHJvcCBpdCEgKi8KKwkJaWYgKHJ0X2lzX291dHB1dF9yb3V0ZShza2JfcnRhYmxlKHNrYikpKQorCQkJZ290byBkcm9wOworCX0KKyNlbmRpZgorCiAJaWYgKHBhcnNlX2dyZV9oZWFkZXIoc2tiLCAmdHBpLCAmY3N1bV9lcnIpIDwgMCkKIAkJZ290byBkcm9wOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWwuYyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCmluZGV4IDc4YTg5ZTYuLmE4MmEyMmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCkBAIC00MTYsOSArNDE2LDYgQEAKIAogI2lmZGVmIENPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUCiAJaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwaC0+ZGFkZHIpKSB7Ci0JCS8qIExvb3BlZCBiYWNrIHBhY2tldCwgZHJvcCBpdCEgKi8KLQkJaWYgKHJ0X2lzX291dHB1dF9yb3V0ZShza2JfcnRhYmxlKHNrYikpKQotCQkJZ290byBkcm9wOwogCQl0dW5uZWwtPmRldi0+c3RhdHMubXVsdGljYXN0Kys7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMgYi9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCmluZGV4IDZmODQ3ZGQuLjhkNjk2MjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJbmZfcmVzZXQoc2tiKTsKIAlzZWNwYXRoX3Jlc2V0KHNrYik7CiAJc2tiX2NsZWFyX2hhc2hfaWZfbm90X2w0KHNrYik7CisJc2tiX2RzdF9kcm9wKHNrYik7CiAJc2tiLT52bGFuX3RjaSA9IDA7CiAJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgMCk7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IGI5YjM0NzIuLjI4ODYzNTcwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC0yMjU1LDEzICsyMjU1LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgaXBtcl9maWxsX21yb3V0ZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCBzdHJ1Y3QgbWZjX2NhY2hlICpjLCBpbnQgY21kKQorCQkJICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHN0cnVjdCBtZmNfY2FjaGUgKmMsIGludCBjbWQsCisJCQkgICAgaW50IGZsYWdzKQogewogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBydG1zZyAqcnRtOwogCWludCBlcnI7CiAKLQlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgY21kLCBzaXplb2YoKnJ0bSksIE5MTV9GX01VTFRJKTsKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgY21kLCBzaXplb2YoKnJ0bSksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKQEAgLTIzMjksNyArMjMzMCw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAotCWVyciA9IGlwbXJfZmlsbF9tcm91dGUobXJ0LCBza2IsIDAsIDAsIG1mYywgY21kKTsKKwllcnIgPSBpcG1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLCAwLCAwLCBtZmMsIGNtZCwgMCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3V0OwogCkBAIC0yMzY4LDcgKzIzNjksOCBAQAogCQkJCWlmIChpcG1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLAogCQkJCQkJICAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkJICAgICBtZmMsIFJUTV9ORVdST1VURSkgPCAwKQorCQkJCQkJICAgICBtZmMsIFJUTV9ORVdST1VURSwKKwkJCQkJCSAgICAgTkxNX0ZfTVVMVEkpIDwgMCkKIAkJCQkJZ290byBkb25lOwogbmV4dF9lbnRyeToKIAkJCQllKys7CkBAIC0yMzgyLDcgKzIzODQsOCBAQAogCQkJaWYgKGlwbXJfZmlsbF9tcm91dGUobXJ0LCBza2IsCiAJCQkJCSAgICAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCiAJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgIG1mYywgUlRNX05FV1JPVVRFKSA8IDApIHsKKwkJCQkJICAgICBtZmMsIFJUTV9ORVdST1VURSwKKwkJCQkJICAgICBOTE1fRl9NVUxUSSkgPCAwKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCAzY2Y5NzY1Li4xZTRlYWM3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTI2MjgsNyArMjYyOCw3IEBACiB7CiAJX19iZTMyIGRlc3QsIHNyYzsKIAlfX3UxNiBkZXN0cCwgc3JjcDsKLQlsb25nIGRlbHRhID0gdHctPnR3X3R0ZCAtIGppZmZpZXM7CisJczMyIGRlbHRhID0gdHctPnR3X3R0ZCAtIGluZXRfdHdfdGltZV9zdGFtcCgpOwogCiAJZGVzdCAgPSB0dy0+dHdfZGFkZHI7CiAJc3JjICAgPSB0dy0+dHdfcmN2X3NhZGRyOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggMzQ0ZTk3Mi4uNmM3ZmEwOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0xMzMsMTAgKzEzMywxMiBAQAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGluZXQ2X2FkZHJfbHN0W0lONl9BRERSX0hTSVpFXTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWRkcmNvbmZfaGFzaF9sb2NrKTsKIAotc3RhdGljIHZvaWQgYWRkcmNvbmZfdmVyaWZ5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgYWRkcmNvbmZfdmVyaWZ5KHZvaWQpOworc3RhdGljIHZvaWQgYWRkcmNvbmZfdmVyaWZ5X3J0bmwodm9pZCk7CitzdGF0aWMgdm9pZCBhZGRyY29uZl92ZXJpZnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKLXN0YXRpYyBERUZJTkVfVElNRVIoYWRkcl9jaGtfdGltZXIsIGFkZHJjb25mX3ZlcmlmeSwgMCwgMCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFkZHJjb25mX3ZlcmlmeV9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWRkcmNvbmZfd3E7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoYWRkcl9jaGtfd29yaywgYWRkcmNvbmZfdmVyaWZ5X3dvcmspOwogCiBzdGF0aWMgdm9pZCBhZGRyY29uZl9qb2luX2FueWNhc3Qoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKTsKIHN0YXRpYyB2b2lkIGFkZHJjb25mX2xlYXZlX2FueWNhc3Qoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKTsKQEAgLTE1MSw3ICsxNTMsNyBAQAogCQkJCQkJICB1MzIgZmxhZ3MsIHUzMiBub2ZsYWdzKTsKIAogc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3N0YXJ0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7Ci1zdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdyk7CiBzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfY29tcGxldGVkKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7CiBzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfcnVuKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOwogc3RhdGljIHZvaWQgYWRkcmNvbmZfcnNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKQEAgLTI0Nyw5ICsyNDksOSBAQAogCQlfX2luNl9kZXZfcHV0KGlkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBhZGRyY29uZl9kZWxfZGFkX3RpbWVyKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2RlbF9kYWRfd29yayhzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7Ci0JaWYgKGRlbF90aW1lcigmaWZwLT5kYWRfdGltZXIpKQorCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZpZnAtPmRhZF93b3JrKSkKIAkJX19pbjZfaWZhX3B1dChpZnApOwogfQogCkBAIC0yNjEsMTIgKzI2MywxMiBAQAogCW1vZF90aW1lcigmaWRldi0+cnNfdGltZXIsIGppZmZpZXMgKyB3aGVuKTsKIH0KIAotc3RhdGljIHZvaWQgYWRkcmNvbmZfbW9kX2RhZF90aW1lcihzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAsCi0JCQkJICAgdW5zaWduZWQgbG9uZyB3aGVuKQorc3RhdGljIHZvaWQgYWRkcmNvbmZfbW9kX2RhZF93b3JrKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGRlbGF5KQogewotCWlmICghdGltZXJfcGVuZGluZygmaWZwLT5kYWRfdGltZXIpKQorCWlmICghZGVsYXllZF93b3JrX3BlbmRpbmcoJmlmcC0+ZGFkX3dvcmspKQogCQlpbjZfaWZhX2hvbGQoaWZwKTsKLQltb2RfdGltZXIoJmlmcC0+ZGFkX3RpbWVyLCBqaWZmaWVzICsgd2hlbik7CisJbW9kX2RlbGF5ZWRfd29yayhhZGRyY29uZl93cSwgJmlmcC0+ZGFkX3dvcmssIGRlbGF5KTsKIH0KIAogc3RhdGljIGludCBzbm1wNl9hbGxvY19kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKQEAgLTc1MSw4ICs3NTMsOSBAQAogCiAJaW42X2Rldl9wdXQoaWZwLT5pZGV2KTsKIAotCWlmIChkZWxfdGltZXIoJmlmcC0+ZGFkX3RpbWVyKSkKLQkJcHJfbm90aWNlKCJUaW1lciBpcyBzdGlsbCBydW5uaW5nLCB3aGVuIGZyZWVpbmcgaWZhPSVwXG4iLCBpZnApOworCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZpZnAtPmRhZF93b3JrKSkKKwkJcHJfbm90aWNlKCJkZWxheWVkIERBRCB3b3JrIHdhcyBwZW5kaW5nIHdoaWxlIGZyZWVpbmcgaWZhPSVwXG4iLAorCQkJICBpZnApOwogCiAJaWYgKGlmcC0+c3RhdGUgIT0gSU5FVDZfSUZBRERSX1NUQVRFX0RFQUQpIHsKIAkJcHJfd2FybigiRnJlZWluZyBhbGl2ZSBpbmV0NiBhZGRyZXNzICVwXG4iLCBpZnApOwpAQCAtODQ5LDggKzg1Miw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmaWZhLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWZhLT5zdGF0ZV9sb2NrKTsKLQlzZXR1cF90aW1lcigmaWZhLT5kYWRfdGltZXIsIGFkZHJjb25mX2RhZF90aW1lciwKLQkJICAgICh1bnNpZ25lZCBsb25nKWlmYSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlmYS0+ZGFkX3dvcmssIGFkZHJjb25mX2RhZF93b3JrKTsKIAlJTklUX0hMSVNUX05PREUoJmlmYS0+YWRkcl9sc3QpOwogCWlmYS0+c2NvcGUgPSBzY29wZTsKIAlpZmEtPnByZWZpeF9sZW4gPSBwZnhsZW47CkBAIC05OTAsNiArOTkyLDggQEAKIAllbnVtIGNsZWFudXBfcHJlZml4X3J0X3QgYWN0aW9uID0gQ0xFQU5VUF9QUkVGSVhfUlRfTk9QOwogCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKIAorCUFTU0VSVF9SVE5MKCk7CisKIAlzcGluX2xvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CiAJc3RhdGUgPSBpZnAtPnN0YXRlOwogCWlmcC0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRDsKQEAgLTEwMjEsNyArMTAyNSw3IEBACiAKIAl3cml0ZV91bmxvY2tfYmgoJmlmcC0+aWRldi0+bG9jayk7CiAKLQlhZGRyY29uZl9kZWxfZGFkX3RpbWVyKGlmcCk7CisJYWRkcmNvbmZfZGVsX2RhZF93b3JrKGlmcCk7CiAKIAlpcHY2X2lmYV9ub3RpZnkoUlRNX0RFTEFERFIsIGlmcCk7CiAKQEAgLTE2MDQsNyArMTYwOCw3IEBACiB7CiAJaWYgKGlmcC0+ZmxhZ3MmSUZBX0ZfUEVSTUFORU5UKSB7CiAJCXNwaW5fbG9ja19iaCgmaWZwLT5sb2NrKTsKLQkJYWRkcmNvbmZfZGVsX2RhZF90aW1lcihpZnApOworCQlhZGRyY29uZl9kZWxfZGFkX3dvcmsoaWZwKTsKIAkJaWZwLT5mbGFncyB8PSBJRkFfRl9URU5UQVRJVkU7CiAJCWlmIChkYWRfZmFpbGVkKQogCQkJaWZwLT5mbGFncyB8PSBJRkFfRl9EQURGQUlMRUQ7CkBAIC0xNjI1LDIwICsxNjI5LDIxIEBACiAJCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAkJfQogCQlpcHY2X2RlbF9hZGRyKGlmcCk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJaXB2Nl9kZWxfYWRkcihpZnApOworCX0KIH0KIAogc3RhdGljIGludCBhZGRyY29uZl9kYWRfZW5kKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKIHsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAotCXNwaW5fbG9jaygmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CiAJaWYgKGlmcC0+c3RhdGUgPT0gSU5FVDZfSUZBRERSX1NUQVRFX0RBRCkgewogCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BPU1REQUQ7CiAJCWVyciA9IDA7CiAJfQotCXNwaW5fdW5sb2NrKCZpZnAtPnN0YXRlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE2NzEsNyArMTY3NiwxMiBAQAogCQl9CiAJfQogCi0JYWRkcmNvbmZfZGFkX3N0b3AoaWZwLCAxKTsKKwlzcGluX2xvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CisJLyogdHJhbnNpdGlvbiBmcm9tIF9QT1NUREFEIHRvIF9FUlJEQUQgKi8KKwlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX0VSUkRBRDsKKwlzcGluX3VubG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKworCWFkZHJjb25mX21vZF9kYWRfd29yayhpZnAsIDApOwogfQogCiAvKiBKb2luIHRvIHNvbGljaXRlZCBhZGRyIG11bHRpY2FzdCBncm91cC4gKi8KQEAgLTE2ODAsNiArMTY5MCw4IEBACiB7CiAJc3RydWN0IGluNl9hZGRyIG1hZGRyOwogCisJQVNTRVJUX1JUTkwoKTsKKwogCWlmIChkZXYtPmZsYWdzJihJRkZfTE9PUEJBQ0t8SUZGX05PQVJQKSkKIAkJcmV0dXJuOwogCkBAIC0xNjkxLDYgKzE3MDMsOCBAQAogewogCXN0cnVjdCBpbjZfYWRkciBtYWRkcjsKIAorCUFTU0VSVF9SVE5MKCk7CisKIAlpZiAoaWRldi0+ZGV2LT5mbGFncyYoSUZGX0xPT1BCQUNLfElGRl9OT0FSUCkpCiAJCXJldHVybjsKIApAQCAtMTcwMSw2ICsxNzE1LDkgQEAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX2pvaW5fYW55Y2FzdChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7CiAJc3RydWN0IGluNl9hZGRyIGFkZHI7CisKKwlBU1NFUlRfUlROTCgpOworCiAJaWYgKGlmcC0+cHJlZml4X2xlbiA+PSAxMjcpIC8qIFJGQyA2MTY0ICovCiAJCXJldHVybjsKIAlpcHY2X2FkZHJfcHJlZml4KCZhZGRyLCAmaWZwLT5hZGRyLCBpZnAtPnByZWZpeF9sZW4pOwpAQCAtMTcxMiw2ICsxNzI5LDkgQEAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX2xlYXZlX2FueWNhc3Qoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewogCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCisJQVNTRVJUX1JUTkwoKTsKKwogCWlmIChpZnAtPnByZWZpeF9sZW4gPj0gMTI3KSAvKiBSRkMgNjE2NCAqLwogCQlyZXR1cm47CiAJaXB2Nl9hZGRyX3ByZWZpeCgmYWRkciwgJmlmcC0+YWRkciwgaWZwLT5wcmVmaXhfbGVuKTsKQEAgLTIyNzEsMTEgKzIyOTEsMTMgQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAKLQkJCWlmcC0+ZmxhZ3MgfD0gSUZBX0ZfTUFOQUdFVEVNUEFERFI7CiAJCQl1cGRhdGVfbGZ0ID0gMDsKIAkJCWNyZWF0ZSA9IDE7CisJCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CisJCQlpZnAtPmZsYWdzIHw9IElGQV9GX01BTkFHRVRFTVBBRERSOwogCQkJaWZwLT5jc3RhbXAgPSBqaWZmaWVzOwogCQkJaWZwLT50b2tlbml6ZWQgPSB0b2tlbml6ZWQ7CisJCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAkJCWFkZHJjb25mX2RhZF9zdGFydChpZnApOwogCQl9CiAKQEAgLTIzMjYsNyArMjM0OCw3IEBACiAJCQkJCSBjcmVhdGUsIG5vdyk7CiAKIAkJCWluNl9pZmFfcHV0KGlmcCk7Ci0JCQlhZGRyY29uZl92ZXJpZnkoMCk7CisJCQlhZGRyY29uZl92ZXJpZnkoKTsKIAkJfQogCX0KIAlpbmV0Nl9wcmVmaXhfbm90aWZ5KFJUTV9ORVdQUkVGSVgsIGluNl9kZXYsIHBpbmZvKTsKQEAgLTI0NzUsNyArMjQ5Nyw3IEBACiAJCQltYW5hZ2VfdGVtcGFkZHJzKGlkZXYsIGlmcCwgdmFsaWRfbGZ0LCBwcmVmZXJlZF9sZnQsCiAJCQkJCSB0cnVlLCBqaWZmaWVzKTsKIAkJaW42X2lmYV9wdXQoaWZwKTsKLQkJYWRkcmNvbmZfdmVyaWZ5KDApOworCQlhZGRyY29uZl92ZXJpZnlfcnRubCgpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwMTEsNyArMzAzMyw3IEBACiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpZmEsIGgsIGFkZHJfbHN0KSB7CiAJCQlpZiAoaWZhLT5pZGV2ID09IGlkZXYpIHsKIAkJCQlobGlzdF9kZWxfaW5pdF9yY3UoJmlmYS0+YWRkcl9sc3QpOwotCQkJCWFkZHJjb25mX2RlbF9kYWRfdGltZXIoaWZhKTsKKwkJCQlhZGRyY29uZl9kZWxfZGFkX3dvcmsoaWZhKTsKIAkJCQlnb3RvIHJlc3RhcnQ7CiAJCQl9CiAJCX0KQEAgLTMwNDksNyArMzA3MSw3IEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZpZGV2LT5hZGRyX2xpc3QpKSB7CiAJCWlmYSA9IGxpc3RfZmlyc3RfZW50cnkoJmlkZXYtPmFkZHJfbGlzdCwKIAkJCQkgICAgICAgc3RydWN0IGluZXQ2X2lmYWRkciwgaWZfbGlzdCk7Ci0JCWFkZHJjb25mX2RlbF9kYWRfdGltZXIoaWZhKTsKKwkJYWRkcmNvbmZfZGVsX2RhZF93b3JrKGlmYSk7CiAKIAkJbGlzdF9kZWwoJmlmYS0+aWZfbGlzdCk7CiAKQEAgLTMxNDgsMTAgKzMxNzAsMTAgQEAKIAkJcmFuZF9udW0gPSBwcmFuZG9tX3UzMigpICUgKGlkZXYtPmNuZi5ydHJfc29saWNpdF9kZWxheSA/IDogMSk7CiAKIAlpZnAtPmRhZF9wcm9iZXMgPSBpZGV2LT5jbmYuZGFkX3RyYW5zbWl0czsKLQlhZGRyY29uZl9tb2RfZGFkX3RpbWVyKGlmcCwgcmFuZF9udW0pOworCWFkZHJjb25mX21vZF9kYWRfd29yayhpZnAsIHJhbmRfbnVtKTsKIH0KIAotc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3N0YXJ0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF9iZWdpbihzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlmcC0+aWRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWRldi0+ZGV2OwpAQCAtMzIwMywyNSArMzIyNSw2OCBAQAogCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF9zdGFydChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7Ci0Jc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwID0gKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKikgZGF0YTsKKwlib29sIGJlZ2luX2RhZCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOworCWlmIChpZnAtPnN0YXRlICE9IElORVQ2X0lGQUREUl9TVEFURV9ERUFEKSB7CisJCWlmcC0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfUFJFREFEOworCQliZWdpbl9kYWQgPSB0cnVlOworCX0KKwlzcGluX3VubG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKworCWlmIChiZWdpbl9kYWQpCisJCWFkZHJjb25mX21vZF9kYWRfd29yayhpZnAsIDApOworfQorCitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3KSwKKwkJCQkJCXN0cnVjdCBpbmV0Nl9pZmFkZHIsCisJCQkJCQlkYWRfd29yayk7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlmcC0+aWRldjsKIAlzdHJ1Y3QgaW42X2FkZHIgbWNhZGRyOwogCisJZW51bSB7CisJCURBRF9QUk9DRVNTLAorCQlEQURfQkVHSU4sCisJCURBRF9BQk9SVCwKKwl9IGFjdGlvbiA9IERBRF9QUk9DRVNTOworCisJcnRubF9sb2NrKCk7CisKKwlzcGluX2xvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CisJaWYgKGlmcC0+c3RhdGUgPT0gSU5FVDZfSUZBRERSX1NUQVRFX1BSRURBRCkgeworCQlhY3Rpb24gPSBEQURfQkVHSU47CisJCWlmcC0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfREFEOworCX0gZWxzZSBpZiAoaWZwLT5zdGF0ZSA9PSBJTkVUNl9JRkFERFJfU1RBVEVfRVJSREFEKSB7CisJCWFjdGlvbiA9IERBRF9BQk9SVDsKKwkJaWZwLT5zdGF0ZSA9IElORVQ2X0lGQUREUl9TVEFURV9QT1NUREFEOworCX0KKwlzcGluX3VubG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKworCWlmIChhY3Rpb24gPT0gREFEX0JFR0lOKSB7CisJCWFkZHJjb25mX2RhZF9iZWdpbihpZnApOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKGFjdGlvbiA9PSBEQURfQUJPUlQpIHsKKwkJYWRkcmNvbmZfZGFkX3N0b3AoaWZwLCAxKTsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKCFpZnAtPmRhZF9wcm9iZXMgJiYgYWRkcmNvbmZfZGFkX2VuZChpZnApKQogCQlnb3RvIG91dDsKIAotCXdyaXRlX2xvY2soJmlkZXYtPmxvY2spOworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPmxvY2spOwogCWlmIChpZGV2LT5kZWFkIHx8ICEoaWRldi0+aWZfZmxhZ3MgJiBJRl9SRUFEWSkpIHsKLQkJd3JpdGVfdW5sb2NrKCZpZGV2LT5sb2NrKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJc3Bpbl9sb2NrKCZpZnAtPmxvY2spOwogCWlmIChpZnAtPnN0YXRlID09IElORVQ2X0lGQUREUl9TVEFURV9ERUFEKSB7CiAJCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOwotCQl3cml0ZV91bmxvY2soJmlkZXYtPmxvY2spOworCQl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTMyMzIsNyArMzI5Nyw3IEBACiAKIAkJaWZwLT5mbGFncyAmPSB+KElGQV9GX1RFTlRBVElWRXxJRkFfRl9PUFRJTUlTVElDfElGQV9GX0RBREZBSUxFRCk7CiAJCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOwotCQl3cml0ZV91bmxvY2soJmlkZXYtPmxvY2spOworCQl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwogCiAJCWFkZHJjb25mX2RhZF9jb21wbGV0ZWQoaWZwKTsKIApAQCAtMzI0MCwxNiArMzMwNSwxNyBAQAogCX0KIAogCWlmcC0+ZGFkX3Byb2Jlcy0tOwotCWFkZHJjb25mX21vZF9kYWRfdGltZXIoaWZwLAotCQkJICAgICAgIE5FSUdIX1ZBUihpZnAtPmlkZXYtPm5kX3Bhcm1zLCBSRVRSQU5TX1RJTUUpKTsKKwlhZGRyY29uZl9tb2RfZGFkX3dvcmsoaWZwLAorCQkJICAgICAgTkVJR0hfVkFSKGlmcC0+aWRldi0+bmRfcGFybXMsIFJFVFJBTlNfVElNRSkpOwogCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOwotCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAogCS8qIHNlbmQgYSBuZWlnaGJvdXIgc29saWNpdGF0aW9uIGZvciBvdXIgYWRkciAqLwogCWFkZHJjb25mX2FkZHJfc29saWN0X211bHQoJmlmcC0+YWRkciwgJm1jYWRkcik7CiAJbmRpc2Nfc2VuZF9ucyhpZnAtPmlkZXYtPmRldiwgTlVMTCwgJmlmcC0+YWRkciwgJm1jYWRkciwgJmluNmFkZHJfYW55KTsKIG91dDoKIAlpbjZfaWZhX3B1dChpZnApOworCXJ0bmxfdW5sb2NrKCk7CiB9CiAKIC8qIGlmcC0+aWRldiBtdXN0IGJlIGF0IGxlYXN0IHJlYWQgbG9ja2VkICovCkBAIC0zMjc2LDcgKzMzNDIsNyBAQAogCXN0cnVjdCBpbjZfYWRkciBsbGFkZHI7CiAJYm9vbCBzZW5kX3JzLCBzZW5kX21sZDsKIAotCWFkZHJjb25mX2RlbF9kYWRfdGltZXIoaWZwKTsKKwlhZGRyY29uZl9kZWxfZGFkX3dvcmsoaWZwKTsKIAogCS8qCiAJICoJQ29uZmlndXJlIHRoZSBhZGRyZXNzIGZvciByZWNlcHRpb24uIE5vdyBpdCBpcyB2YWxpZC4KQEAgLTM1MTcsMjMgKzM1ODMsMjMgQEAKICAqCVBlcmlvZGljIGFkZHJlc3Mgc3RhdHVzIHZlcmlmaWNhdGlvbgogICovCiAKLXN0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh1bnNpZ25lZCBsb25nIGZvbykKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeV9ydG5sKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBub3csIG5leHQsIG5leHRfc2VjLCBuZXh0X3NjaGVkOwogCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKIAlpbnQgaTsKIAorCUFTU0VSVF9SVE5MKCk7CisKIAlyY3VfcmVhZF9sb2NrX2JoKCk7Ci0Jc3Bpbl9sb2NrKCZhZGRyY29uZl92ZXJpZnlfbG9jayk7CiAJbm93ID0gamlmZmllczsKIAluZXh0ID0gcm91bmRfamlmZmllc191cChub3cgKyBBRERSX0NIRUNLX0ZSRVFVRU5DWSk7CiAKLQlkZWxfdGltZXIoJmFkZHJfY2hrX3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZhZGRyX2Noa193b3JrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBJTjZfQUREUl9IU0laRTsgaSsrKSB7CiByZXN0YXJ0OgotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3VfYmgoaWZwLAotCQkJCQkgJmluZXQ2X2FkZHJfbHN0W2ldLCBhZGRyX2xzdCkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3VfYmgoaWZwLCAmaW5ldDZfYWRkcl9sc3RbaV0sIGFkZHJfbHN0KSB7CiAJCQl1bnNpZ25lZCBsb25nIGFnZTsKIAogCQkJLyogV2hlbiBzZXR0aW5nIHByZWZlcnJlZF9sZnQgdG8gYSB2YWx1ZSBub3QgemVybyBvcgpAQCAtMzYyOCwxMyArMzY5NCwyMiBAQAogCiAJQURCRyhLRVJOX0RFQlVHICJub3cgPSAlbHUsIHNjaGVkdWxlID0gJWx1LCByb3VuZGVkIHNjaGVkdWxlID0gJWx1ID0+ICVsdVxuIiwKIAkgICAgICBub3csIG5leHQsIG5leHRfc2VjLCBuZXh0X3NjaGVkKTsKLQotCWFkZHJfY2hrX3RpbWVyLmV4cGlyZXMgPSBuZXh0X3NjaGVkOwotCWFkZF90aW1lcigmYWRkcl9jaGtfdGltZXIpOwotCXNwaW5fdW5sb2NrKCZhZGRyY29uZl92ZXJpZnlfbG9jayk7CisJbW9kX2RlbGF5ZWRfd29yayhhZGRyY29uZl93cSwgJmFkZHJfY2hrX3dvcmssIG5leHRfc2NoZWQgLSBub3cpOwogCXJjdV9yZWFkX3VubG9ja19iaCgpOwogfQogCitzdGF0aWMgdm9pZCBhZGRyY29uZl92ZXJpZnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJcnRubF9sb2NrKCk7CisJYWRkcmNvbmZfdmVyaWZ5X3J0bmwoKTsKKwlydG5sX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCBhZGRyY29uZl92ZXJpZnkodm9pZCkKK3sKKwltb2RfZGVsYXllZF93b3JrKGFkZHJjb25mX3dxLCAmYWRkcl9jaGtfd29yaywgMCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaW42X2FkZHIgKmV4dHJhY3RfYWRkcihzdHJ1Y3QgbmxhdHRyICphZGRyLCBzdHJ1Y3QgbmxhdHRyICpsb2NhbCwKIAkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqKnBlZXJfcGZ4KQogewpAQCAtMzY5MSw2ICszNzY2LDggQEAKIAlib29sIHdhc19tYW5hZ2V0ZW1wYWRkcjsKIAlib29sIGhhZF9wcmVmaXhyb3V0ZTsKIAorCUFTU0VSVF9SVE5MKCk7CisKIAlpZiAoIXZhbGlkX2xmdCB8fCAocHJlZmVyZWRfbGZ0ID4gdmFsaWRfbGZ0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTM3NTYsNyArMzgzMyw3IEBACiAJCQkJICF3YXNfbWFuYWdldGVtcGFkZHIsIGppZmZpZXMpOwogCX0KIAotCWFkZHJjb25mX3ZlcmlmeSgwKTsKKwlhZGRyY29uZl92ZXJpZnlfcnRubCgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00Mzg2LDYgKzQ0NjMsOCBAQAogCWJvb2wgdXBkYXRlX3JzID0gZmFsc2U7CiAJc3RydWN0IGluNl9hZGRyIGxsX2FkZHI7CiAKKwlBU1NFUlRfUlROTCgpOworCiAJaWYgKHRva2VuID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChpcHY2X2FkZHJfYW55KHRva2VuKSkKQEAgLTQ0MzQsNyArNDUxMyw3IEBACiAJfQogCiAJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKLQlhZGRyY29uZl92ZXJpZnkoMCk7CisJYWRkcmNvbmZfdmVyaWZ5X3J0bmwoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYzNiw2ICs0NzE1LDkgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlmcC0+aWRldi0+ZGV2KTsKIAorCWlmIChldmVudCkKKwkJQVNTRVJUX1JUTkwoKTsKKwogCWluZXQ2X2lmYV9ub3RpZnkoZXZlbnQgPyA6IFJUTV9ORVdBRERSLCBpZnApOwogCiAJc3dpdGNoIChldmVudCkgewpAQCAtNTI0NCw2ICs1MzI2LDEyIEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2FkZHJsYWJlbDsKIAorCWFkZHJjb25mX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiaXB2Nl9hZGRyY29uZiIpOworCWlmICghYWRkcmNvbmZfd3EpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm93cTsKKwl9CisKIAkvKiBUaGUgYWRkcmNvbmYgbmV0ZGV2IG5vdGlmaWVyIHJlcXVpcmVzIHRoYXQgbG9vcGJhY2tfZGV2CiAJICogaGFzIGl0J3MgaXB2NiBwcml2YXRlIGluZm9ybWF0aW9uIGFsbG9jYXRlZCBhbmQgc2V0dXAKIAkgKiBiZWZvcmUgaXQgY2FuIGJyaW5nIHVwIGFuZCBnaXZlIGxpbmstbG9jYWwgYWRkcmVzc2VzCkBAIC01Mjc0LDcgKzUzNjIsNyBAQAogCiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcHY2X2Rldl9ub3RmKTsKIAotCWFkZHJjb25mX3ZlcmlmeSgwKTsKKwlhZGRyY29uZl92ZXJpZnkoKTsKIAogCXJ0bmxfYWZfcmVnaXN0ZXIoJmluZXQ2X29wcyk7CiAKQEAgLTUzMDIsNiArNTM5MCw4IEBACiAJcnRubF9hZl91bnJlZ2lzdGVyKCZpbmV0Nl9vcHMpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcHY2X2Rldl9ub3RmKTsKIGVycmxvOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGFkZHJjb25mX3dxKTsKK291dF9ub3dxOgogCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmYWRkcmNvbmZfb3BzKTsKIG91dF9hZGRybGFiZWw6CiAJaXB2Nl9hZGRyX2xhYmVsX2NsZWFudXAoKTsKQEAgLTUzMzcsNyArNTQyNyw4IEBACiAJZm9yIChpID0gMDsgaSA8IElONl9BRERSX0hTSVpFOyBpKyspCiAJCVdBUk5fT04oIWhsaXN0X2VtcHR5KCZpbmV0Nl9hZGRyX2xzdFtpXSkpOwogCXNwaW5fdW5sb2NrX2JoKCZhZGRyY29uZl9oYXNoX2xvY2spOwotCi0JZGVsX3RpbWVyKCZhZGRyX2Noa190aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWRkcl9jaGtfd29yayk7CiAJcnRubF91bmxvY2soKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKGFkZHJjb25mX3dxKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAxNmY5MWEyLi42NGQ2MDczIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC0xMTAxLDIxICsxMTAxLDE5IEBACiAJCQkJdW5zaWduZWQgaW50IGZyYWdoZWFkZXJsZW4sCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0LAotCQkJCWJvb2wgcG10dXByb2JlKQorCQkJCXVuc2lnbmVkIGludCBvcmlnX210dSkKIHsKIAlpZiAoIShydC0+ZHN0LmZsYWdzICYgRFNUX1hGUk1fVFVOTkVMKSkgewogCQlpZiAoc2tiID09IE5VTEwpIHsKIAkJCS8qIGZpcnN0IGZyYWdtZW50LCByZXNlcnZlIGhlYWRlcl9sZW4gKi8KLQkJCSptdHUgPSAqbXR1IC0gcnQtPmRzdC5oZWFkZXJfbGVuOworCQkJKm10dSA9IG9yaWdfbXR1IC0gcnQtPmRzdC5oZWFkZXJfbGVuOwogCiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogdGhpcyBmcmFnbWVudCBpcyBub3QgZmlyc3QsIHRoZSBoZWFkZXJzCiAJCQkgKiBzcGFjZSBpcyByZWdhcmRlZCBhcyBkYXRhIHNwYWNlLgogCQkJICovCi0JCQkqbXR1ID0gbWluKCptdHUsIHBtdHVwcm9iZSA/Ci0JCQkJICAgcnQtPmRzdC5kZXYtPm10dSA6Ci0JCQkJICAgZHN0X210dShydC0+ZHN0LnBhdGgpKTsKKwkJCSptdHUgPSBvcmlnX210dTsKIAkJfQogCQkqbWF4ZnJhZ2xlbiA9ICgoKm10dSAtIGZyYWdoZWFkZXJsZW4pICYgfjcpCiAJCQkgICAgICArIGZyYWdoZWFkZXJsZW4gLSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKQEAgLTExMzIsNyArMTEzMCw3IEBACiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBpbmV0X2NvcmsgKmNvcms7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYl9wcmV2ID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbWF4ZnJhZ2xlbiwgZnJhZ2hlYWRlcmxlbiwgbXR1OworCXVuc2lnbmVkIGludCBtYXhmcmFnbGVuLCBmcmFnaGVhZGVybGVuLCBtdHUsIG9yaWdfbXR1OwogCWludCBleHRoZHJsZW47CiAJaW50IGRzdF9leHRoZHJsZW47CiAJaW50IGhoX2xlbjsKQEAgLTEyMTQsNiArMTIxMiw3IEBACiAJCWRzdF9leHRoZHJsZW4gPSAwOwogCQltdHUgPSBjb3JrLT5mcmFnc2l6ZTsKIAl9CisJb3JpZ19tdHUgPSBtdHU7CiAKIAloaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldik7CiAKQEAgLTEzMTEsOCArMTMxMCw3IEBACiAJCQlpZiAoc2tiID09IE5VTEwgfHwgc2tiX3ByZXYgPT0gTlVMTCkKIAkJCQlpcDZfYXBwZW5kX2RhdGFfbXR1KCZtdHUsICZtYXhmcmFnbGVuLAogCQkJCQkJICAgIGZyYWdoZWFkZXJsZW4sIHNrYiwgcnQsCi0JCQkJCQkgICAgbnAtPnBtdHVkaXNjID49Ci0JCQkJCQkgICAgSVBWNl9QTVRVRElTQ19QUk9CRSk7CisJCQkJCQkgICAgb3JpZ19tdHUpOwogCiAJCQlza2JfcHJldiA9IHNrYjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2bXIuYyBiL25ldC9pcHY2L2lwNm1yLmMKaW5kZXggMGViNDAzOC4uODczNzQwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2bXIuYworKysgYi9uZXQvaXB2Ni9pcDZtci5jCkBAIC0yMzQ5LDEzICsyMzQ5LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgaXA2bXJfZmlsbF9tcm91dGUoc3RydWN0IG1yNl90YWJsZSAqbXJ0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCBzdHJ1Y3QgbWZjNl9jYWNoZSAqYywgaW50IGNtZCkKKwkJCSAgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgc3RydWN0IG1mYzZfY2FjaGUgKmMsIGludCBjbWQsCisJCQkgICAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgcnRtc2cgKnJ0bTsKIAlpbnQgZXJyOwogCi0JbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGNtZCwgc2l6ZW9mKCpydG0pLCBOTE1fRl9NVUxUSSk7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGNtZCwgc2l6ZW9mKCpydG0pLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCkBAIC0yNDIzLDcgKzI0MjQsNyBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKLQllcnIgPSBpcDZtcl9maWxsX21yb3V0ZShtcnQsIHNrYiwgMCwgMCwgbWZjLCBjbWQpOworCWVyciA9IGlwNm1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLCAwLCAwLCBtZmMsIGNtZCwgMCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3V0OwogCkBAIC0yNDYyLDcgKzI0NjMsOCBAQAogCQkJCWlmIChpcDZtcl9maWxsX21yb3V0ZShtcnQsIHNrYiwKIAkJCQkJCSAgICAgIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAogCQkJCQkJICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkJICAgICAgbWZjLCBSVE1fTkVXUk9VVEUpIDwgMCkKKwkJCQkJCSAgICAgIG1mYywgUlRNX05FV1JPVVRFLAorCQkJCQkJICAgICAgTkxNX0ZfTVVMVEkpIDwgMCkKIAkJCQkJZ290byBkb25lOwogbmV4dF9lbnRyeToKIAkJCQllKys7CkBAIC0yNDc2LDcgKzI0NzgsOCBAQAogCQkJaWYgKGlwNm1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLAogCQkJCQkgICAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgICBtZmMsIFJUTV9ORVdST1VURSkgPCAwKSB7CisJCQkJCSAgICAgIG1mYywgUlRNX05FV1JPVVRFLAorCQkJCQkgICAgICBOTE1fRl9NVUxUSSkgPCAwKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCAxYTA0YzEzLi43OTMyNjk3IDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTQzMywxMiArNDMzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KGNvbnN0IHN0cnVjdCBzYWRiX3hfc2VjX2N0eCAqc2VjX2N0eCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KGNvbnN0IHN0cnVjdCBzYWRiX3hfc2VjX2N0eCAqc2VjX2N0eCwKKwkJCQkJCQkJICAgICBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gTlVMTDsKIAlpbnQgY3R4X3NpemUgPSBzZWNfY3R4LT5zYWRiX3hfY3R4X2xlbjsKIAotCXVjdHggPSBrbWFsbG9jKChzaXplb2YoKnVjdHgpK2N0eF9zaXplKSwgR0ZQX0tFUk5FTCk7CisJdWN0eCA9IGttYWxsb2MoKHNpemVvZigqdWN0eCkrY3R4X3NpemUpLCBnZnApOwogCiAJaWYgKCF1Y3R4KQogCQlyZXR1cm4gTlVMTDsKQEAgLTExMjQsNyArMTEyNSw3IEBACiAKIAlzZWNfY3R4ID0gZXh0X2hkcnNbU0FEQl9YX0VYVF9TRUNfQ1RYIC0gMV07CiAJaWYgKHNlY19jdHggIT0gTlVMTCkgewotCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHggPSBwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KHNlY19jdHgpOworCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHggPSBwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KHNlY19jdHgsIEdGUF9LRVJORUwpOwogCiAJCWlmICghdWN0eCkKIAkJCWdvdG8gb3V0OwpAQCAtMjIzMSwxNCArMjIzMiwxNCBAQAogCiAJc2VjX2N0eCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfU0VDX0NUWCAtIDFdOwogCWlmIChzZWNfY3R4ICE9IE5VTEwpIHsKLQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChzZWNfY3R4KTsKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChzZWNfY3R4LCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIXVjdHgpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmeHAtPnNlY3VyaXR5LCB1Y3R4KTsKKwkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnhwLT5zZWN1cml0eSwgdWN0eCwgR0ZQX0tFUk5FTCk7CiAJCWtmcmVlKHVjdHgpOwogCiAJCWlmIChlcnIpCkBAIC0yMzM1LDEyICsyMzM2LDEyIEBACiAKIAlzZWNfY3R4ID0gZXh0X2hkcnNbU0FEQl9YX0VYVF9TRUNfQ1RYIC0gMV07CiAJaWYgKHNlY19jdHggIT0gTlVMTCkgewotCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHggPSBwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KHNlY19jdHgpOworCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHggPSBwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KHNlY19jdHgsIEdGUF9LRVJORUwpOwogCiAJCWlmICghdWN0eCkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZwb2xfY3R4LCB1Y3R4KTsKKwkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnBvbF9jdHgsIHVjdHgsIEdGUF9LRVJORUwpOwogCQlrZnJlZSh1Y3R4KTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC0zMjM5LDggKzMyNDAsOCBAQAogCQl9CiAJCWlmICgoKmRpciA9IHZlcmlmeV9zZWNfY3R4X2xlbihwKSkpCiAJCQlnb3RvIG91dDsKLQkJdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCk7Ci0JCSpkaXIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmeHAtPnNlY3VyaXR5LCB1Y3R4KTsKKwkJdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCwgR0ZQX0FUT01JQyk7CisJCSpkaXIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmeHAtPnNlY3VyaXR5LCB1Y3R4LCBHRlBfQVRPTUlDKTsKIAkJa2ZyZWUodWN0eCk7CiAKIAkJaWYgKCpkaXIpCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2NvcmUuYyBiL25ldC9sMnRwL2wydHBfY29yZS5jCmluZGV4IDg1ZDlkOTQuLmM4MzgyN2UgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfY29yZS5jCisrKyBiL25ldC9sMnRwL2wydHBfY29yZS5jCkBAIC0yMDE2LDcgKzIwMTYsNyBAQAogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQlsMnRwX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJsMnRwIiwgV1FfTk9OX1JFRU5UUkFOVCB8IFdRX1VOQk9VTkQsIDApOworCWwydHBfd3EgPSBhbGxvY193b3JrcXVldWUoImwydHAiLCBXUV9VTkJPVU5ELCAwKTsKIAlpZiAoIWwydHBfd3EpIHsKIAkJcHJfZXJyKCJhbGxvY193b3JrcXVldWUgZmFpbGVkXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWVfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWVfY29yZS5jCmluZGV4IGYwNzJmZTguLjEwODEyMGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZV9jb3JlLmMKQEAgLTM1NCwxMyArMzU0LDE2IEBACiAKIAlza2IgPSBuZm5ldGxpbmtfYWxsb2Nfc2tiKG5ldCwgc2l6ZSwgcXVldWUtPnBlZXJfcG9ydGlkLAogCQkJCSAgR0ZQX0FUT01JQyk7Ci0JaWYgKCFza2IpCisJaWYgKCFza2IpIHsKKwkJc2tiX3R4X2Vycm9yKGVudHNrYik7CiAJCXJldHVybiBOVUxMOworCX0KIAogCW5saCA9IG5sbXNnX3B1dChza2IsIDAsIDAsCiAJCQlORk5MX1NVQlNZU19RVUVVRSA8PCA4IHwgTkZRTkxfTVNHX1BBQ0tFVCwKIAkJCXNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpLCAwKTsKIAlpZiAoIW5saCkgeworCQlza2JfdHhfZXJyb3IoZW50c2tiKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTQ4OCwxMyArNDkxLDE1IEBACiAJCW5sYS0+bmxhX3R5cGUgPSBORlFBX1BBWUxPQUQ7CiAJCW5sYS0+bmxhX2xlbiA9IG5sYV9hdHRyX3NpemUoZGF0YV9sZW4pOwogCi0JCXNrYl96ZXJvY29weShza2IsIGVudHNrYiwgZGF0YV9sZW4sIGhsZW4pOworCQlpZiAoc2tiX3plcm9jb3B5KHNrYiwgZW50c2tiLCBkYXRhX2xlbiwgaGxlbikpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+bGVuOwogCXJldHVybiBza2I7CiAKIG5sYV9wdXRfZmFpbHVyZToKKwlza2JfdHhfZXJyb3IoZW50c2tiKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAluZXRfZXJyX3JhdGVsaW1pdGVkKCJuZl9xdWV1ZTogZXJyb3IgY3JlYXRpbmcgcGFja2V0IG1lc3NhZ2VcbiIpOwogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwppbmRleCBlOWE0OGJhLi4yNzBiNzdkIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwpAQCAtNDY0LDcgKzQ2NCw5IEBACiAJfQogCW5sYS0+bmxhX2xlbiA9IG5sYV9hdHRyX3NpemUoc2tiLT5sZW4pOwogCi0Jc2tiX3plcm9jb3B5KHVzZXJfc2tiLCBza2IsIHNrYi0+bGVuLCBobGVuKTsKKwllcnIgPSBza2JfemVyb2NvcHkodXNlcl9za2IsIHNrYiwgc2tiLT5sZW4sIGhsZW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OwogCiAJLyogUGFkIE9WU19QQUNLRVRfQVRUUl9QQUNLRVQgaWYgbGluZWFyIGNvcHkgd2FzIHBlcmZvcm1lZCAqLwogCWlmICghKGRwLT51c2VyX2ZlYXR1cmVzICYgT1ZTX0RQX0ZfVU5BTElHTkVEKSkgewpAQCAtNDc4LDYgKzQ4MCw4IEBACiAKIAllcnIgPSBnZW5sbXNnX3VuaWNhc3Qob3ZzX2RwX2dldF9uZXQoZHApLCB1c2VyX3NrYiwgdXBjYWxsX2luZm8tPnBvcnRpZCk7CiBvdXQ6CisJaWYgKGVycikKKwkJc2tiX3R4X2Vycm9yKHNrYik7CiAJa2ZyZWVfc2tiKG5za2IpOwogCXJldHVybiBlcnI7CiB9CkBAIC0xMTc0LDcgKzExNzgsNyBAQAogCXN0cnVjdCBkYXRhcGF0aCAqZHA7CiAKIAlkcCA9IGxvb2t1cF9kYXRhcGF0aChzb2NrX25ldChza2ItPnNrKSwgaW5mby0+dXNlcmhkciwgaW5mby0+YXR0cnMpOwotCWlmICghZHApCisJaWYgKElTX0VSUihkcCkpCiAJCXJldHVybjsKIAogCVdBUk4oZHAtPnVzZXJfZmVhdHVyZXMsICJEcm9wcGluZyBwcmV2aW91c2x5IGFubm91bmNlZCB1c2VyIGZlYXR1cmVzXG4iKTsKQEAgLTE3NjIsMTEgKzE3NjYsMTIgQEAKIAlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF0sIHNraXAgPSBjYi0+YXJnc1sxXTsKIAlpbnQgaSwgaiA9IDA7CiAKLQlkcCA9IGdldF9kcChzb2NrX25ldChza2ItPnNrKSwgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7Ci0JaWYgKCFkcCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyY3VfcmVhZF9sb2NrKCk7CisJZHAgPSBnZXRfZHAoc29ja19uZXQoc2tiLT5zayksIG92c19oZWFkZXItPmRwX2lmaW5kZXgpOworCWlmICghZHApIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAlmb3IgKGkgPSBidWNrZXQ7IGkgPCBEUF9WUE9SVF9IQVNIX0JVQ0tFVFM7IGkrKykgewogCQlzdHJ1Y3QgdnBvcnQgKnZwb3J0OwogCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuYwppbmRleCAxNmY0YjQ2Li4yOTk4OTg5IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmMKQEAgLTczLDYgKzczLDcgQEAKIAogCWlmICgoZmxvdy0+a2V5LmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQKSB8fAogCSAgICAgZmxvdy0+a2V5LmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQVjYpKSAmJgorCSAgICBmbG93LT5rZXkuaXAuZnJhZyAhPSBPVlNfRlJBR19UWVBFX0xBVEVSICYmCiAJICAgIGZsb3ctPmtleS5pcC5wcm90byA9PSBJUFBST1RPX1RDUCAmJgogCSAgICBsaWtlbHkoc2tiLT5sZW4gPj0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkpIHsKIAkJdGNwX2ZsYWdzID0gVENQX0ZMQUdTX0JFMTYodGNwX2hkcihza2IpKTsKQEAgLTkxLDcgKzkyLDcgQEAKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnVzZWQsIF9fYmUxNiAqdGNwX2ZsYWdzKQogewogCXNwaW5fbG9jaygmc3RhdHMtPmxvY2spOwotCWlmICh0aW1lX2FmdGVyKHN0YXRzLT51c2VkLCAqdXNlZCkpCisJaWYgKCEqdXNlZCB8fCB0aW1lX2FmdGVyKHN0YXRzLT51c2VkLCAqdXNlZCkpCiAJCSp1c2VkID0gc3RhdHMtPnVzZWQ7CiAJKnRjcF9mbGFncyB8PSBzdGF0cy0+dGNwX2ZsYWdzOwogCW92c19zdGF0cy0+bl9wYWNrZXRzICs9IHN0YXRzLT5wYWNrZXRfY291bnQ7CkBAIC0xMDIsMzAgKzEwMywyNCBAQAogdm9pZCBvdnNfZmxvd19zdGF0c19nZXQoc3RydWN0IHN3X2Zsb3cgKmZsb3csIHN0cnVjdCBvdnNfZmxvd19zdGF0cyAqb3ZzX3N0YXRzLAogCQkJdW5zaWduZWQgbG9uZyAqdXNlZCwgX19iZTE2ICp0Y3BfZmxhZ3MpCiB7Ci0JaW50IGNwdSwgY3VyX2NwdTsKKwlpbnQgY3B1OwogCiAJKnVzZWQgPSAwOwogCSp0Y3BfZmxhZ3MgPSAwOwogCW1lbXNldChvdnNfc3RhdHMsIDAsIHNpemVvZigqb3ZzX3N0YXRzKSk7CiAKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJaWYgKCFmbG93LT5zdGF0cy5pc19wZXJjcHUpIHsKIAkJc3RhdHNfcmVhZChmbG93LT5zdGF0cy5zdGF0LCBvdnNfc3RhdHMsIHVzZWQsIHRjcF9mbGFncyk7CiAJfSBlbHNlIHsKLQkJY3VyX2NwdSA9IGdldF9jcHUoKTsKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQkJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzOwogCi0JCQlpZiAoY3B1ID09IGN1cl9jcHUpCi0JCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCiAJCQlzdGF0cyA9IHBlcl9jcHVfcHRyKGZsb3ctPnN0YXRzLmNwdV9zdGF0cywgY3B1KTsKIAkJCXN0YXRzX3JlYWQoc3RhdHMsIG92c19zdGF0cywgdXNlZCwgdGNwX2ZsYWdzKTsKLQotCQkJaWYgKGNwdSA9PSBjdXJfY3B1KQotCQkJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQl9Ci0JCXB1dF9jcHUoKTsKIAl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YXRzX3Jlc2V0KHN0cnVjdCBmbG93X3N0YXRzICpzdGF0cykKQEAgLTE0MCwyNSArMTM1LDE3IEBACiAKIHZvaWQgb3ZzX2Zsb3dfc3RhdHNfY2xlYXIoc3RydWN0IHN3X2Zsb3cgKmZsb3cpCiB7Ci0JaW50IGNwdSwgY3VyX2NwdTsKKwlpbnQgY3B1OwogCisJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWlmICghZmxvdy0+c3RhdHMuaXNfcGVyY3B1KSB7CiAJCXN0YXRzX3Jlc2V0KGZsb3ctPnN0YXRzLnN0YXQpOwogCX0gZWxzZSB7Ci0JCWN1cl9jcHUgPSBnZXRfY3B1KCk7Ci0KIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCi0JCQlpZiAoY3B1ID09IGN1cl9jcHUpCi0JCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCiAJCQlzdGF0c19yZXNldChwZXJfY3B1X3B0cihmbG93LT5zdGF0cy5jcHVfc3RhdHMsIGNwdSkpOwotCi0JCQlpZiAoY3B1ID09IGN1cl9jcHUpCi0JCQkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCX0KLQkJcHV0X2NwdSgpOwogCX0KKwlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIAogc3RhdGljIGludCBjaGVja19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKZGlmZiAtLWdpdCBhL25ldC90aXBjL3N1YnNjci5jIGIvbmV0L3RpcGMvc3Vic2NyLmMKaW5kZXggMTFjOWFlMC4uNjQyNDM3MiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc3Vic2NyLmMKKysrIGIvbmV0L3RpcGMvc3Vic2NyLmMKQEAgLTI2Myw5ICsyNjMsOSBAQAogICoKICAqIENhbGxlZCB3aXRoIHN1YnNjcmliZXIgbG9jayBoZWxkLgogICovCi1zdGF0aWMgc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWJzY3Jfc3Vic2NyaWJlKHN0cnVjdCB0aXBjX3N1YnNjciAqcywKLQkJCQkJICAgICBzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoteworc3RhdGljIGludCBzdWJzY3Jfc3Vic2NyaWJlKHN0cnVjdCB0aXBjX3N1YnNjciAqcywKKwkJCSAgICBzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyLAorCQkJICAgIHN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqKnN1Yl9wKSB7CiAJc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWI7CiAJaW50IHN3YXA7CiAKQEAgLTI3NiwyMyArMjc2LDIxIEBACiAJaWYgKHMtPmZpbHRlciAmIGh0b2hsKFRJUENfU1VCX0NBTkNFTCwgc3dhcCkpIHsKIAkJcy0+ZmlsdGVyICY9IH5odG9obChUSVBDX1NVQl9DQU5DRUwsIHN3YXApOwogCQlzdWJzY3JfY2FuY2VsKHMsIHN1YnNjcmliZXIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogUmVmdXNlIHN1YnNjcmlwdGlvbiBpZiBnbG9iYWwgbGltaXQgZXhjZWVkZWQgKi8KIAlpZiAoYXRvbWljX3JlYWQoJnN1YnNjcmlwdGlvbl9jb3VudCkgPj0gVElQQ19NQVhfU1VCU0NSSVBUSU9OUykgewogCQlwcl93YXJuKCJTdWJzY3JpcHRpb24gcmVqZWN0ZWQsIGxpbWl0IHJlYWNoZWQgKCV1KVxuIiwKIAkJCVRJUENfTUFYX1NVQlNDUklQVElPTlMpOwotCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogQWxsb2NhdGUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLwogCXN1YiA9IGttYWxsb2Moc2l6ZW9mKCpzdWIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXN1YikgewogCQlwcl93YXJuKCJTdWJzY3JpcHRpb24gcmVqZWN0ZWQsIG5vIG1lbW9yeVxuIik7Ci0JCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHN1YnNjcmlwdGlvbiBvYmplY3QgKi8KQEAgLTMwNiw4ICszMDQsNyBAQAogCSAgICAoc3ViLT5zZXEubG93ZXIgPiBzdWItPnNlcS51cHBlcikpIHsKIAkJcHJfd2FybigiU3Vic2NyaXB0aW9uIHJlamVjdGVkLCBpbGxlZ2FsIHJlcXVlc3RcbiIpOwogCQlrZnJlZShzdWIpOwotCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCUlOSVRfTElTVF9IRUFEKCZzdWItPm5hbWVzZXFfbGlzdCk7CiAJbGlzdF9hZGQoJnN1Yi0+c3Vic2NyaXB0aW9uX2xpc3QsICZzdWJzY3JpYmVyLT5zdWJzY3JpcHRpb25fbGlzdCk7CkBAIC0zMjAsOCArMzE3LDggQEAKIAkJCSAgICAgKEhhbmRsZXIpc3Vic2NyX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKXN1Yik7CiAJCWtfc3RhcnRfdGltZXIoJnN1Yi0+dGltZXIsIHN1Yi0+dGltZW91dCk7CiAJfQotCi0JcmV0dXJuIHN1YjsKKwkqc3ViX3AgPSBzdWI7CisJcmV0dXJuIDA7CiB9CiAKIC8qIEhhbmRsZSBvbmUgdGVybWluYXRpb24gcmVxdWVzdCBmb3IgdGhlIHN1YnNjcmliZXIgKi8KQEAgLTMzNSwxMCArMzMyLDE0IEBACiAJCQkJICB2b2lkICp1c3JfZGF0YSwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCB0aXBjX3N1YnNjcmliZXIgKnN1YnNjcmliZXIgPSB1c3JfZGF0YTsKLQlzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YjsKKwlzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YiA9IE5VTEw7CiAKIAlzcGluX2xvY2tfYmgoJnN1YnNjcmliZXItPmxvY2spOwotCXN1YiA9IHN1YnNjcl9zdWJzY3JpYmUoKHN0cnVjdCB0aXBjX3N1YnNjciAqKWJ1Ziwgc3Vic2NyaWJlcik7CisJaWYgKHN1YnNjcl9zdWJzY3JpYmUoKHN0cnVjdCB0aXBjX3N1YnNjciAqKWJ1Ziwgc3Vic2NyaWJlciwgJnN1YikgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdWJzY3JpYmVyLT5sb2NrKTsKKwkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKKwkJcmV0dXJuOworCX0KIAlpZiAoc3ViKQogCQl0aXBjX25hbWV0Ymxfc3Vic2NyaWJlKHN1Yik7CiAJc3Bpbl91bmxvY2tfYmgoJnN1YnNjcmliZXItPmxvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGNlNmVjNmMuLjk0NDA0ZjEgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTE3ODcsOCArMTc4NywxMSBAQAogCQlnb3RvIG91dDsKIAogCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdS0+cmVhZGxvY2spOwotCWlmIChlcnIpIHsKLQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHNvY2tfcmN2dGltZW8oc2ssIG5vYmxvY2spKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQkvKiByZWN2bXNnKCkgaW4gbm9uIGJsb2NraW5nIG1vZGUgaXMgc3VwcG9zZWQgdG8gcmV0dXJuIC1FQUdBSU4KKwkJICogc2tfcmN2dGltZW8gaXMgbm90IGhvbm9yZWQgYnkgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCkKKwkJICovCisJCWVyciA9IG5vYmxvY2sgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE5MTMsNiArMTkxNiw3IEBACiAJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOwogCURFQ0xBUkVfU09DS0FERFIoc3RydWN0IHNvY2thZGRyX3VuICosIHN1bmFkZHIsIG1zZy0+bXNnX25hbWUpOwogCWludCBjb3BpZWQgPSAwOworCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CiAJaW50IGNoZWNrX2NyZWRzID0gMDsKIAlpbnQgdGFyZ2V0OwogCWludCBlcnIgPSAwOwpAQCAtMTkyOCw3ICsxOTMyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAl0YXJnZXQgPSBzb2NrX3Jjdmxvd2F0KHNrLCBmbGFncyZNU0dfV0FJVEFMTCwgc2l6ZSk7Ci0JdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyZNU0dfRE9OVFdBSVQpOworCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgbm9ibG9jayk7CiAKIAkvKiBMb2NrIHRoZSBzb2NrZXQgdG8gcHJldmVudCBxdWV1ZSBkaXNvcmRlcmluZwogCSAqIHdoaWxlIHNsZWVwcyBpbiBtZW1jcHlfdG9tc2cKQEAgLTE5NDAsOCArMTk0NCwxMSBAQAogCX0KIAogCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdS0+cmVhZGxvY2spOwotCWlmIChlcnIpIHsKLQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQkvKiByZWN2bXNnKCkgaW4gbm9uIGJsb2NraW5nIG1vZGUgaXMgc3VwcG9zZWQgdG8gcmV0dXJuIC1FQUdBSU4KKwkJICogc2tfcmN2dGltZW8gaXMgbm90IGhvbm9yZWQgYnkgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCkKKwkJICovCisJCWVyciA9IG5vYmxvY2sgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggYzI3NDE3OS4uMmY3ZGRjMyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAJCXJldHVybiAwOwogCiAJdWN0eCA9IG5sYV9kYXRhKHJ0KTsKLQlyZXR1cm4gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnBvbC0+c2VjdXJpdHksIHVjdHgpOworCXJldHVybiBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmcG9sLT5zZWN1cml0eSwgdWN0eCwgR0ZQX0tFUk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlfdGVtcGxhdGVzKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdXQsCkBAIC0xNjI2LDcgKzE2MjYsNyBAQAogCQlpZiAocnQpIHsKIAkJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IG5sYV9kYXRhKHJ0KTsKIAotCQkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJmN0eCwgdWN0eCk7CisJCQllcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmY3R4LCB1Y3R4LCBHRlBfS0VSTkVMKTsKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMTkyOCw3ICsxOTI4LDcgQEAKIAkJaWYgKHJ0KSB7CiAJCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHggPSBubGFfZGF0YShydCk7CiAKLQkJCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZjdHgsIHVjdHgpOworCQkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJmN0eCwgdWN0eCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAJCX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCmluZGV4IDU0N2UxNWQuLjkzYTBkYTIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtMTU1LDYgKzE1NSwxNSBAQAogIyBJbXBvcnRhbnQ6IG5vIHNwYWNlcyBhcm91bmQgb3B0aW9ucwogYXItb3B0aW9uID0gJChjYWxsIHRyeS1ydW4sICQoQVIpIHJjJCgxKSAiJCRUTVAiLCQoMSksJCgyKSkKIAorIyBsZC12ZXJzaW9uCisjIFVzYWdlOiAkKGNhbGwgbGQtdmVyc2lvbikKKyMgTm90ZSB0aGlzIGlzIG1haW5seSBmb3IgSEogTHUncyAzIG51bWJlciBiaW51dGlsIHZlcnNpb25zCitsZC12ZXJzaW9uID0gJChzaGVsbCAkKExEKSAtLXZlcnNpb24gfCAkKHNyY3RyZWUpL3NjcmlwdHMvbGQtdmVyc2lvbi5zaCkKKworIyBsZC1pZnZlcnNpb24KKyMgVXNhZ2U6ICAkKGNhbGwgbGQtaWZ2ZXJzaW9uLCAtZ2UsIDIyMjUyLCB5KQorbGQtaWZ2ZXJzaW9uID0gJChzaGVsbCBbICQoY2FsbCBsZC12ZXJzaW9uKSAkKDEpICQoMikgXSAmJiBlY2hvICQoMykpCisKICMjIyMjIwogCiAjIyMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCmluZGV4IGQ1ZDg1OWMuLjlmMGVlMjIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApAQCAtMTk4LDcgKzE5OCw3IEBACiAkKG11bHRpLW9ianMteToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiAKIHF1aWV0X2NtZF9jY19zX2MgPSBDQyAkKHF1aWV0X21vZHRhZykgICRACi1jbWRfY2Nfc19jICAgICAgID0gJChDQykgJChjX2ZsYWdzKSAtZnZlcmJvc2UtYXNtIC1TIC1vICRAICQ8CitjbWRfY2Nfc19jICAgICAgID0gJChDQykgJChjX2ZsYWdzKSAkKERJU0FCTEVfTFRPKSAtZnZlcmJvc2UtYXNtIC1TIC1vICRAICQ8CiAKICQob2JqKS8lLnM6ICQoc3JjKS8lLmMgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nY2MtbGQgYi9zY3JpcHRzL2djYy1sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRhYjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nY2MtbGQKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisjIHJ1biBnY2Mgd2l0aCBsZCBvcHRpb25zCisjIHVzZWQgYXMgYSB3cmFwcGVyIHRvIGV4ZWN1dGUgbGluayB0aW1lIG9wdGltaXphdGlvbnMKKyMgeWVzIHZpcmdpbmlhLCB0aGlzIGlzIG5vdCBwcmV0dHkKKworQVJHUz0iLW5vc3RkbGliIgorCit3aGlsZSBbICIkMSIgIT0gIiIgXSA7IGRvCisJY2FzZSAiJDEiIGluCisJLXNhdmUtdGVtcHN8LW0zMnwtbTY0KSBOPSIkMSIgOzsKKwktcikgTj0iJDEiIDs7CisJLVtXZ10qKSBOPSIkMSIgOzsKKwktW29sdl18LVtPZmRdKnwtbm9zdGRsaWIpIE49IiQxIiA7OworCS0tZW5kLWdyb3VwfC0tc3RhcnQtZ3JvdXApCisJCSBOPSItV2wsJDEiIDs7CisJLVtSVEZHaEllemNieVl1XSp8XAorLS1zY3JpcHR8LS1kZWZzeW18LWluaXR8LU1hcHwtLW9mb3JtYXR8LXJwYXRofFwKKy1ycGF0aC1saW5rfC0tc29ydC1zZWN0aW9ufC0tc2VjdGlvbi1zdGFydHwtVGJzc3wtVGRhdGF8LVR0ZXh0fFwKKy0tdmVyc2lvbi1zY3JpcHR8LS1keW5hbWljLWxpc3R8LS12ZXJzaW9uLWV4cG9ydHMtc3ltYm9sfC0td3JhcHwtbSkKKwkJQT0iJDEiIDsgc2hpZnQgOyBOPSItV2wsJEEsJDEiIDs7CisJLVttXSopIE49IiQxIiA7OworCS0qKSBOPSItV2wsJDEiIDs7CisJKikgIE49IiQxIiA7OworCWVzYWMKKwlBUkdTPSIkQVJHUyAkTiIKKwlzaGlmdAorZG9uZQorCitleGVjICRDQyAkQVJHUwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sZC12ZXJzaW9uLnNoIGIvc2NyaXB0cy9sZC12ZXJzaW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5ODU4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2xkLXZlcnNpb24uc2gKQEAgLTAsMCArMSw4IEBACisjIS91c3IvYmluL2F3ayAtZgorIyBleHRyYWN0IGxpbmtlciB2ZXJzaW9uIG51bWJlciBmcm9tIHN0ZGluIGFuZCB0dXJuIGludG8gc2luZ2xlIG51bWJlcgorCXsKKwlnc3ViKCIuKikiLCAiIik7CisJc3BsaXQoJDEsYSwgIi4iKTsKKwlwcmludCBhWzFdKjEwMDAwMDAwICsgYVsyXSoxMDAwMDAgKyBhWzNdKjEwMDAwICsgYVs0XSoxMDAgKyBhWzVdOworCWV4aXQKKwl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9kZXZpY2V0YWJsZS1vZmZzZXRzLmMgYi9zY3JpcHRzL21vZC9kZXZpY2V0YWJsZS1vZmZzZXRzLmMKaW5kZXggYmI1ZDExNS4uZjI4MjUxNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jCisrKyBiL3NjcmlwdHMvbW9kL2RldmljZXRhYmxlLW9mZnNldHMuYwpAQCAtMTc0LDYgKzE3NCw5IEBACiAJREVWSURfRklFTEQoeDg2X2NwdV9pZCwgbW9kZWwpOwogCURFVklEX0ZJRUxEKHg4Nl9jcHVfaWQsIHZlbmRvcik7CiAKKwlERVZJRChjcHVfZmVhdHVyZSk7CisJREVWSURfRklFTEQoY3B1X2ZlYXR1cmUsIGZlYXR1cmUpOworCiAJREVWSUQobWVpX2NsX2RldmljZV9pZCk7CiAJREVWSURfRklFTEQobWVpX2NsX2RldmljZV9pZCwgbmFtZSk7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCAyNWU1Y2IwLi4yNWY2ZjU5IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0xMTEwLDcgKzExMTAsNyBAQAogfQogQUREX1RPX0RFVlRBQkxFKCJhbWJhIiwgYW1iYV9pZCwgZG9fYW1iYV9lbnRyeSk7CiAKLS8qIExPT0tTIGxpa2UgeDg2Y3B1OnZlbmRvcjpWVlZWOmZhbWlseTpGRkZGOm1vZGVsOk1NTU06ZmVhdHVyZToqLEZFQVQsKgorLyogTE9PS1MgbGlrZSBjcHU6dHlwZTp4ODYsdmVuVlZWVmZhbUZGRkZtb2RNTU1NOmZlYXR1cmU6KixGRUFULCoKICAqIEFsbCBmaWVsZHMgYXJlIG51bWJlcnMuIEl0IHdvdWxkIGJlIG5pY2VyIHRvIHVzZSBzdHJpbmdzIGZvciB2ZW5kb3IKICAqIGFuZCBmZWF0dXJlLCBidXQgZ2V0dGluZyB0aG9zZSBvdXQgb2YgdGhlIGJ1aWxkIHN5c3RlbSBoZXJlIGlzIHRvbwogICogY29tcGxpY2F0ZWQuCkBAIC0xMTI0LDEwICsxMTI0LDEwIEBACiAJREVGX0ZJRUxEKHN5bXZhbCwgeDg2X2NwdV9pZCwgbW9kZWwpOwogCURFRl9GSUVMRChzeW12YWwsIHg4Nl9jcHVfaWQsIHZlbmRvcik7CiAKLQlzdHJjcHkoYWxpYXMsICJ4ODZjcHU6Iik7Ci0JQUREKGFsaWFzLCAidmVuZG9yOiIsICB2ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTlksIHZlbmRvcik7Ci0JQUREKGFsaWFzLCAiOmZhbWlseToiLCBmYW1pbHkgIT0gWDg2X0ZBTUlMWV9BTlksIGZhbWlseSk7Ci0JQUREKGFsaWFzLCAiOm1vZGVsOiIsICBtb2RlbCAgIT0gWDg2X01PREVMX0FOWSwgIG1vZGVsKTsKKwlzdHJjcHkoYWxpYXMsICJjcHU6dHlwZTp4ODYsIik7CisJQUREKGFsaWFzLCAidmVuIiwgdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU5ZLCB2ZW5kb3IpOworCUFERChhbGlhcywgImZhbSIsIGZhbWlseSAhPSBYODZfRkFNSUxZX0FOWSwgZmFtaWx5KTsKKwlBREQoYWxpYXMsICJtb2QiLCBtb2RlbCAgIT0gWDg2X01PREVMX0FOWSwgIG1vZGVsKTsKIAlzdHJjYXQoYWxpYXMsICI6ZmVhdHVyZToqIik7CiAJaWYgKGZlYXR1cmUgIT0gWDg2X0ZFQVRVUkVfQU5ZKQogCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgIiUwNFgqIiwgZmVhdHVyZSk7CkBAIC0xMTM1LDYgKzExMzUsMTYgQEAKIH0KIEFERF9UT19ERVZUQUJMRSgieDg2Y3B1IiwgeDg2X2NwdV9pZCwgZG9feDg2Y3B1X2VudHJ5KTsKIAorLyogTE9PS1MgbGlrZSBjcHU6dHlwZToqOmZlYXR1cmU6KkZFQVQqICovCitzdGF0aWMgaW50IGRvX2NwdV9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqc3ltdmFsLCBjaGFyICphbGlhcykKK3sKKwlERUZfRklFTEQoc3ltdmFsLCBjcHVfZmVhdHVyZSwgZmVhdHVyZSk7CisKKwlzcHJpbnRmKGFsaWFzLCAiY3B1OnR5cGU6KjpmZWF0dXJlOiolMDRYKiIsIGZlYXR1cmUpOworCXJldHVybiAxOworfQorQUREX1RPX0RFVlRBQkxFKCJjcHUiLCBjcHVfZmVhdHVyZSwgZG9fY3B1X2VudHJ5KTsKKwogLyogTG9va3MgbGlrZTogbWVpOlMgKi8KIHN0YXRpYyBpbnQgZG9fbWVpX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpzeW12YWwsCiAJCQljaGFyICphbGlhcykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCA5OWE0NWZkLi4wNjYzNTU2IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC02MjMsNyArNjIzLDEwIEBACiAKIAlzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpIHsKIAljYXNlIFNITl9DT01NT046Ci0JCXdhcm4oIlwiJXNcIiBbJXNdIGlzIENPTU1PTiBzeW1ib2xcbiIsIHN5bW5hbWUsIG1vZC0+bmFtZSk7CisJCWlmICghc3RybmNtcChzeW1uYW1lLCAiX19nbnVfbHRvXyIsIHNpemVvZigiX19nbnVfbHRvXyIpLTEpKSB7CisJCQkvKiBTaG91bGQgd2FybiBoZXJlLCBidXQgbW9kcG9zdCBydW5zIGJlZm9yZSB0aGUgbGlua2VyICovCisJCX0gZWxzZQorCQkJd2FybigiXCIlc1wiIFslc10gaXMgQ09NTU9OIHN5bWJvbFxuIiwgc3ltbmFtZSwgbW9kLT5uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBTSE5fVU5ERUY6CiAJCS8qIHVuZGVmaW5lZCBzeW1ib2wgKi8KQEAgLTg0OSw2ICs4NTIsNyBAQAogCSIueHQubGl0IiwgICAgICAgICAvKiB4dGVuc2EgKi8KIAkiLmFyY2V4dG1hcCoiLAkJCS8qIGFyYyAqLwogCSIuZ251LmxpbmtvbmNlLmFyY2V4dCoiLAkvKiBhcmMgOiBtb2R1bGVzICovCisJIi5nbnUubHRvKiIsCiAJTlVMTAogfTsKIApAQCAtMTQ1NSw2ICsxNDU5LDEwIEBACiAJCXRvID0gZmluZF9lbGZfc3ltYm9sKGVsZiwgci0+cl9hZGRlbmQsIHN5bSk7CiAJCXRvc3ltID0gc3ltX25hbWUoZWxmLCB0byk7CiAKKwkJaWYgKCFzdHJuY21wKGZyb21zeW0sICJyZWZlcmVuY2VfX19pbml0Y2FsbCIsCisJCQkJc2l6ZW9mKCJyZWZlcmVuY2VfX19pbml0Y2FsbCIpLTEpKQorCQkJcmV0dXJuOworCiAJCS8qIGNoZWNrIHdoaXRlbGlzdCAtIHdlIG1heSBpZ25vcmUgaXQgKi8KIAkJaWYgKHNlY3JlZl93aGl0ZWxpc3QobWlzbWF0Y2gsCiAJCQkJCWZyb21zZWMsIGZyb21zeW0sIHRvc2VjLCB0b3N5bSkpIHsKQEAgLTE2OTMsNiArMTcwMSwxOSBAQAogCX0KIH0KIAorc3RhdGljIGNoYXIgKnJlbW92ZV9kb3QoY2hhciAqcykKK3sKKwljaGFyICplbmQ7CisJaW50IG4gPSBzdHJjc3BuKHMsICIuIik7CisKKwlpZiAobiA+IDAgJiYgc1tuXSAhPSAwKSB7CisJCXN0cnRvdWwocyArIG4gKyAxLCAmZW5kLCAxMCk7CisJCWlmICAoZW5kID4gcyArIG4gKyAxICYmICgqZW5kID09ICcuJyB8fCAqZW5kID09IDApKQorCQkJc1tuXSA9IDA7CisJfQorCXJldHVybiBzOworfQorCiBzdGF0aWMgdm9pZCByZWFkX3N5bWJvbHMoY2hhciAqbW9kbmFtZSkKIHsKIAljb25zdCBjaGFyICpzeW1uYW1lOwpAQCAtMTczMSw3ICsxNzUyLDcgQEAKIAl9CiAKIAlmb3IgKHN5bSA9IGluZm8uc3ltdGFiX3N0YXJ0OyBzeW0gPCBpbmZvLnN5bXRhYl9zdG9wOyBzeW0rKykgewotCQlzeW1uYW1lID0gaW5mby5zdHJ0YWIgKyBzeW0tPnN0X25hbWU7CisJCXN5bW5hbWUgPSByZW1vdmVfZG90KGluZm8uc3RydGFiICsgc3ltLT5zdF9uYW1lKTsKIAogCQloYW5kbGVfbW9kdmVyc2lvbnMobW9kLCAmaW5mbywgc3ltLCBzeW1uYW1lKTsKIAkJaGFuZGxlX21vZGRldnRhYmxlKG1vZCwgJmluZm8sIHN5bSwgc3ltbmFtZSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmggYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmgKaW5kZXggNTEyMDdlNC4uMTY4YjQzZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5oCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuaApAQCAtMTI3LDcgKzEyNyw3IEBACiAJRWxmX1NlY3Rpb24gIGV4cG9ydF9ncGxfc2VjOwogCUVsZl9TZWN0aW9uICBleHBvcnRfdW51c2VkX2dwbF9zZWM7CiAJRWxmX1NlY3Rpb24gIGV4cG9ydF9ncGxfZnV0dXJlX3NlYzsKLQljb25zdCBjaGFyICAgKnN0cnRhYjsKKwljaGFyICAgICAgICAgKnN0cnRhYjsKIAljaGFyCSAgICAgKm1vZGluZm87CiAJdW5zaWduZWQgaW50IG1vZGluZm9fbGVuOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9jYXBhYmlsaXR5LmMgYi9zZWN1cml0eS9jYXBhYmlsaXR5LmMKaW5kZXggOGI0ZjI0YS4uMjFlMmI5YyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvY2FwYWJpbGl0eS5jCisrKyBiL3NlY3VyaXR5L2NhcGFiaWxpdHkuYwpAQCAtNzU3LDcgKzc1Nyw4IEBACiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiBzdGF0aWMgaW50IGNhcF94ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eShzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwKLQkJCQkJICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgpCisJCQkJCSAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LAorCQkJCQkgIGdmcF90IGdmcCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMgYi9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCmluZGV4IGJiZDMyYzcuLjM0Nzg5NjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKKysrIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwpAQCAtNjUsOCArNjUsOCBAQAogICogdGFraW5nIGEgMzItYml0IHN5c2NhbGwgYXJlIHplcm8uICBJZiB5b3UgY2FuLCB5b3Ugc2hvdWxkIGNhbGwgc3lzX2tleWN0bCgpCiAgKiBkaXJlY3RseS4KICAqLwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfa2V5Y3RsKHUzMiBvcHRpb24sCi0JCQkJICB1MzIgYXJnMiwgdTMyIGFyZzMsIHUzMiBhcmc0LCB1MzIgYXJnNSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoa2V5Y3RsLCB1MzIsIG9wdGlvbiwKKwkJICAgICAgIHUzMiwgYXJnMiwgdTMyLCBhcmczLCB1MzIsIGFyZzQsIHUzMiwgYXJnNSkKIHsKIAlzd2l0Y2ggKG9wdGlvbikgewogCWNhc2UgS0VZQ1RMX0dFVF9LRVlSSU5HX0lEOgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VjdXJpdHkuYyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKaW5kZXggMTViNjkyOC4uOTE5Y2FkOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VjdXJpdHkuYworKysgYi9zZWN1cml0eS9zZWN1cml0eS5jCkBAIC0xMzE3LDkgKzEzMTcsMTEgQEAKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KIAotaW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLCBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgpCitpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsCisJCQkgICAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LAorCQkJICAgICAgIGdmcF90IGdmcCkKIHsKLQlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eShjdHhwLCBzZWNfY3R4KTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eShjdHhwLCBzZWNfY3R4LCBnZnApOwogfQogRVhQT1JUX1NZTUJPTChzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYyk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCA0YjM0ODQ3Li5iMzMyZTJjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC02NjgsNyArNjY4LDcgQEAKIAkJaWYgKGZsYWdzW2ldID09IFNCTEFCRUxfTU5UKQogCQkJY29udGludWU7CiAJCXJjID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQobW91bnRfb3B0aW9uc1tpXSwKLQkJCQkJICAgICBzdHJsZW4obW91bnRfb3B0aW9uc1tpXSksICZzaWQpOworCQkJCQkgICAgIHN0cmxlbihtb3VudF9vcHRpb25zW2ldKSwgJnNpZCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0VMaW51eDogc2VjdXJpdHlfY29udGV4dF90b19zaWQiCiAJCQkgICAgICAgIiglcykgZmFpbGVkIGZvciAoZGV2ICVzLCB0eXBlICVzKSBlcnJubz0lZFxuIiwKQEAgLTI0ODksNyArMjQ4OSw4IEBACiAJCWlmIChmbGFnc1tpXSA9PSBTQkxBQkVMX01OVCkKIAkJCWNvbnRpbnVlOwogCQlsZW4gPSBzdHJsZW4obW91bnRfb3B0aW9uc1tpXSk7Ci0JCXJjID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQobW91bnRfb3B0aW9uc1tpXSwgbGVuLCAmc2lkKTsKKwkJcmMgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChtb3VudF9vcHRpb25zW2ldLCBsZW4sICZzaWQsCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0VMaW51eDogc2VjdXJpdHlfY29udGV4dF90b19zaWQiCiAJCQkgICAgICAgIiglcykgZmFpbGVkIGZvciAoZGV2ICVzLCB0eXBlICVzKSBlcnJubz0lZFxuIiwKQEAgLTI4OTMsNyArMjg5NCw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHZhbHVlLCBzaXplLCAmbmV3c2lkKTsKKwlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHZhbHVlLCBzaXplLCAmbmV3c2lkLCBHRlBfS0VSTkVMKTsKIAlpZiAocmMgPT0gLUVJTlZBTCkgewogCQlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpIHsKIAkJCXN0cnVjdCBhdWRpdF9idWZmZXIgKmFiOwpAQCAtMzA1MCw3ICszMDUxLDcgQEAKIAlpZiAoIXZhbHVlIHx8ICFzaXplKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCXJjID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoKHZvaWQgKil2YWx1ZSwgc2l6ZSwgJm5ld3NpZCk7CisJcmMgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCgodm9pZCAqKXZhbHVlLCBzaXplLCAmbmV3c2lkLCBHRlBfS0VSTkVMKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtNTUyOSw3ICs1NTMwLDcgQEAKIAkJCXN0cltzaXplLTFdID0gMDsKIAkJCXNpemUtLTsKIAkJfQotCQllcnJvciA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHZhbHVlLCBzaXplLCAmc2lkKTsKKwkJZXJyb3IgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh2YWx1ZSwgc2l6ZSwgJnNpZCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnJvciA9PSAtRUlOVkFMICYmICFzdHJjbXAobmFtZSwgImZzY3JlYXRlIikpIHsKIAkJCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkgewogCQkJCXN0cnVjdCBhdWRpdF9idWZmZXIgKmFiOwpAQCAtNTYzOCw3ICs1NjM5LDcgQEAKIAogc3RhdGljIGludCBzZWxpbnV4X3NlY2N0eF90b19zZWNpZChjb25zdCBjaGFyICpzZWNkYXRhLCB1MzIgc2VjbGVuLCB1MzIgKnNlY2lkKQogewotCXJldHVybiBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzZWNkYXRhLCBzZWNsZW4sIHNlY2lkKTsKKwlyZXR1cm4gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2VjZGF0YSwgc2VjbGVuLCBzZWNpZCwgR0ZQX0tFUk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlbGludXhfcmVsZWFzZV9zZWNjdHgoY2hhciAqc2VjZGF0YSwgdTMyIHNlY2xlbikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmgKaW5kZXggOGVkOGRhZi4uY2U3ODUyYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogaW50IHNlY3VyaXR5X3NpZF90b19jb250ZXh0X2ZvcmNlKHUzMiBzaWQsIGNoYXIgKipzY29udGV4dCwgdTMyICpzY29udGV4dF9sZW4pOwogCiBpbnQgc2VjdXJpdHlfY29udGV4dF90b19zaWQoY29uc3QgY2hhciAqc2NvbnRleHQsIHUzMiBzY29udGV4dF9sZW4sCi0JdTMyICpvdXRfc2lkKTsKKwkJCSAgICB1MzIgKm91dF9zaWQsIGdmcF90IGdmcCk7CiAKIGludCBzZWN1cml0eV9jb250ZXh0X3RvX3NpZF9kZWZhdWx0KGNvbnN0IGNoYXIgKnNjb250ZXh0LCB1MzIgc2NvbnRleHRfbGVuLAogCQkJCSAgICB1MzIgKm91dF9zaWQsIHUzMiBkZWZfc2lkLCBnZnBfdCBnZnBfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3hmcm0uaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmgKaW5kZXggNDhjM2NjOS4uOWYwNTg0NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3hmcm0uaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUveGZybS5oCkBAIC0xMCw3ICsxMCw4IEBACiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KIAogaW50IHNlbGludXhfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsCi0JCQkgICAgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgpOworCQkJICAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4LAorCQkJICAgICAgZ2ZwX3QgZ2ZwKTsKIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2Nsb25lKHN0cnVjdCB4ZnJtX3NlY19jdHggKm9sZF9jdHgsCiAJCQkgICAgICBzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqbmV3X2N0eHApOwogdm9pZCBzZWxpbnV4X3hmcm1fcG9saWN5X2ZyZWUoc3RydWN0IHhmcm1fc2VjX2N0eCAqY3R4KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IDUxMjJhZmYuLmQ2MGMwZWUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtNTc2LDcgKzU3Niw3IEBACiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKLQlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChidWYsIHNpemUsICZzaWQpOworCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGJ1Ziwgc2l6ZSwgJnNpZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKQEAgLTczMSwxMSArNzMxLDEzIEBACiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOworCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkLAorCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKQEAgLTgxNywxMSArODE5LDEzIEBACiAJCW9iam5hbWUgPSBuYW1lYnVmOwogCX0KIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOworCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkLAorCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKQEAgLTg3OCwxMSArODgyLDEzIEBACiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOworCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkLAorCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKQEAgLTkzNCw3ICs5NDAsNyBAQAogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMiLCBjb24sIHVzZXIpICE9IDIpCiAJCWdvdG8gb3V0OwogCi0JbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoY29uLCBzdHJsZW4oY29uKSArIDEsICZzaWQpOworCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGNvbiwgc3RybGVuKGNvbikgKyAxLCAmc2lkLCBHRlBfS0VSTkVMKTsKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIApAQCAtOTk0LDExICsxMDAwLDEzIEBACiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOworCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkLAorCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCA1ZDAxNDRlLi40YmNhNDk0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC0xMjg5LDE2ICsxMjg5LDE4IEBACiAgKiBAc2NvbnRleHQ6IHNlY3VyaXR5IGNvbnRleHQKICAqIEBzY29udGV4dF9sZW46IGxlbmd0aCBpbiBieXRlcwogICogQHNpZDogc2VjdXJpdHkgaWRlbnRpZmllciwgU0lECisgKiBAZ2ZwOiBjb250ZXh0IGZvciB0aGUgYWxsb2NhdGlvbgogICoKICAqIE9idGFpbnMgYSBTSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWN1cml0eSBjb250ZXh0IHRoYXQKICAqIGhhcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHNwZWNpZmllZCBieSBAc2NvbnRleHQuCiAgKiBSZXR1cm5zIC0lRUlOVkFMIGlmIHRoZSBjb250ZXh0IGlzIGludmFsaWQsIC0lRU5PTUVNIGlmIGluc3VmZmljaWVudAogICogbWVtb3J5IGlzIGF2YWlsYWJsZSwgb3IgMCBvbiBzdWNjZXNzLgogICovCi1pbnQgc2VjdXJpdHlfY29udGV4dF90b19zaWQoY29uc3QgY2hhciAqc2NvbnRleHQsIHUzMiBzY29udGV4dF9sZW4sIHUzMiAqc2lkKQoraW50IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGNvbnN0IGNoYXIgKnNjb250ZXh0LCB1MzIgc2NvbnRleHRfbGVuLCB1MzIgKnNpZCwKKwkJCSAgICBnZnBfdCBnZnApCiB7CiAJcmV0dXJuIHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkX2NvcmUoc2NvbnRleHQsIHNjb250ZXh0X2xlbiwKLQkJCQkJICAgIHNpZCwgU0VDU0lEX05VTEwsIEdGUF9LRVJORUwsIDApOworCQkJCQkgICAgc2lkLCBTRUNTSURfTlVMTCwgZ2ZwLCAwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCmluZGV4IDA0NjJjYjMuLjk4YjA0MjYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgveGZybS5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCkBAIC03OCw3ICs3OCw4IEBACiAgKiB4ZnJtX3VzZXJfc2VjX2N0eCBjb250ZXh0LgogICovCiBzdGF0aWMgaW50IHNlbGludXhfeGZybV9hbGxvY191c2VyKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAotCQkJCSAgIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCkKKwkJCQkgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgsCisJCQkJICAgZ2ZwX3QgZ2ZwKQogewogCWludCByYzsKIAljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X3NlY3VyaXR5KCk7CkBAIC05NCw3ICs5NSw3IEBACiAJaWYgKHN0cl9sZW4gPj0gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpICsgc3RyX2xlbiArIDEsIEdGUF9LRVJORUwpOworCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpICsgc3RyX2xlbiArIDEsIGdmcCk7CiAJaWYgKCFjdHgpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMDMsNyArMTA0LDcgQEAKIAljdHgtPmN0eF9sZW4gPSBzdHJfbGVuOwogCW1lbWNweShjdHgtPmN0eF9zdHIsICZ1Y3R4WzFdLCBzdHJfbGVuKTsKIAljdHgtPmN0eF9zdHJbc3RyX2xlbl0gPSAnXDAnOwotCXJjID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoY3R4LT5jdHhfc3RyLCBzdHJfbGVuLCAmY3R4LT5jdHhfc2lkKTsKKwlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGN0eC0+Y3R4X3N0ciwgc3RyX2xlbiwgJmN0eC0+Y3R4X3NpZCwgZ2ZwKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyOwogCkBAIC0yODIsOSArMjgzLDEwIEBACiAgKiBMU00gaG9vayBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG9jcyBhbmQgdHJhbnNmZXJzIHVjdHggc3BlYyB0byB4ZnJtX3BvbGljeS4KICAqLwogaW50IHNlbGludXhfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsCi0JCQkgICAgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgpCisJCQkgICAgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgsCisJCQkgICAgICBnZnBfdCBnZnApCiB7Ci0JcmV0dXJuIHNlbGludXhfeGZybV9hbGxvY191c2VyKGN0eHAsIHVjdHgpOworCXJldHVybiBzZWxpbnV4X3hmcm1fYWxsb2NfdXNlcihjdHhwLCB1Y3R4LCBnZnApOwogfQogCiAvKgpAQCAtMzMyLDcgKzMzNCw3IEBACiBpbnQgc2VsaW51eF94ZnJtX3N0YXRlX2FsbG9jKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAogCQkJICAgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgpCiB7Ci0JcmV0dXJuIHNlbGludXhfeGZybV9hbGxvY191c2VyKCZ4LT5zZWN1cml0eSwgdWN0eCk7CisJcmV0dXJuIHNlbGludXhfeGZybV9hbGxvY191c2VyKCZ4LT5zZWN1cml0eSwgdWN0eCwgR0ZQX0tFUk5FTCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvYW9hLmggYi9zb3VuZC9hb2EvYW9hLmgKaW5kZXggZTA4Nzg5NC4uMzRjNjY4ZiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2FvYS5oCisrKyBiL3NvdW5kL2FvYS9hb2EuaApAQCAtMTE2LDcgKzExNiw3IEBACiAJc3RydWN0IHNuZF9jYXJkICphbHNhX2NhcmQ7CiB9OwogICAgICAgICAKLWV4dGVybiBpbnQgYW9hX3NuZF9kZXZpY2VfbmV3KHNuZF9kZXZpY2VfdHlwZV90IHR5cGUsCitleHRlcm4gaW50IGFvYV9zbmRfZGV2aWNlX25ldyhlbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlLAogCXZvaWQgKiBkZXZpY2VfZGF0YSwgc3RydWN0IHNuZF9kZXZpY2Vfb3BzICogb3BzKTsKIGV4dGVybiBzdHJ1Y3Qgc25kX2NhcmQgKmFvYV9nZXRfY2FyZCh2b2lkKTsKIGV4dGVybiBpbnQgYW9hX3NuZF9jdGxfYWRkKHN0cnVjdCBzbmRfa2NvbnRyb2wqIGNvbnRyb2wpOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMgYi9zb3VuZC9hb2EvY29kZWNzL29ueXguYwppbmRleCA0Y2VkYzY5Li5mMDFiZmZiIDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29kZWNzL29ueXguYworKysgYi9zb3VuZC9hb2EvY29kZWNzL29ueXguYwpAQCAtODg5LDcgKzg4OSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChhb2Ffc25kX2RldmljZV9uZXcoU05EUlZfREVWX0xPV0xFVkVMLCBvbnl4LCAmb3BzKSkgeworCWlmIChhb2Ffc25kX2RldmljZV9uZXcoU05EUlZfREVWX0NPREVDLCBvbnl4LCAmb3BzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIG9ueXggc25kIGRldmljZSFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3Rhcy5jIGIvc291bmQvYW9hL2NvZGVjcy90YXMuYwppbmRleCBjNDkxYWUwLi5jZjNjNjMwIDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29kZWNzL3Rhcy5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3MvdGFzLmMKQEAgLTgyNiw3ICs4MjYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9MT1dMRVZFTCwgdGFzLCAmb3BzKSkgeworCWlmIChhb2Ffc25kX2RldmljZV9uZXcoU05EUlZfREVWX0NPREVDLCB0YXMsICZvcHMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBjcmVhdGUgdGFzIHNuZCBkZXZpY2UhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy90b29uaWUuYyBiL3NvdW5kL2FvYS9jb2RlY3MvdG9vbmllLmMKaW5kZXggNjlkMmNiNi4uN2U4YzM0MSAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy90b29uaWUuYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3Rvb25pZS5jCkBAIC05Miw3ICs5Miw3IEBACiAJaWYgKHRvb25pZS0+Y29kZWMuY29ubmVjdGVkICE9IDEpCiAJCXJldHVybiAtRU5PVENPTk47CiAKLQlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9MT1dMRVZFTCwgdG9vbmllLCAmb3BzKSkgeworCWlmIChhb2Ffc25kX2RldmljZV9uZXcoU05EUlZfREVWX0NPREVDLCB0b29uaWUsICZvcHMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBjcmVhdGUgdG9vbmllIHNuZCBkZXZpY2UhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvYWxzYS5jIGIvc291bmQvYW9hL2NvcmUvYWxzYS5jCmluZGV4IDBmYTM4NTUuLjRhN2U0ZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb3JlL2Fsc2EuYworKysgYi9zb3VuZC9hb2EvY29yZS9hbHNhLmMKQEAgLTIzLDEzICsyMywxMiBAQAogCQkvKiBjYW5ub3QgYmUgRUVYSVNUIGR1ZSB0byB1c2FnZSBpbiBhb2FfZmFicmljX3JlZ2lzdGVyICovCiAJCXJldHVybiAtRUJVU1k7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIG5hbWUsIG1vZCwgc2l6ZW9mKHN0cnVjdCBhb2FfY2FyZCksCi0JCQkgICAgICAmYWxzYV9jYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoZGV2LCBpbmRleCwgbmFtZSwgbW9kLCBzaXplb2Yoc3RydWN0IGFvYV9jYXJkKSwKKwkJCSAgICZhbHNhX2NhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWFvYV9jYXJkID0gYWxzYV9jYXJkLT5wcml2YXRlX2RhdGE7CiAJYW9hX2NhcmQtPmFsc2FfY2FyZCA9IGFsc2FfY2FyZDsKLQlhbHNhX2NhcmQtPmRldiA9IGRldjsKIAlzdHJsY3B5KGFsc2FfY2FyZC0+ZHJpdmVyLCAiQXBwbGVPbmJkQXVkaW8iLCBzaXplb2YoYWxzYV9jYXJkLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGFsc2FfY2FyZC0+c2hvcnRuYW1lLCBuYW1lLCBzaXplb2YoYWxzYV9jYXJkLT5zaG9ydG5hbWUpKTsKIAlzdHJsY3B5KGFsc2FfY2FyZC0+bG9uZ25hbWUsIG5hbWUsIHNpemVvZihhbHNhX2NhcmQtPmxvbmduYW1lKSk7CkBAIC02MCw3ICs1OSw3IEBACiAJfQogfQogCi1pbnQgYW9hX3NuZF9kZXZpY2VfbmV3KHNuZF9kZXZpY2VfdHlwZV90IHR5cGUsCitpbnQgYW9hX3NuZF9kZXZpY2VfbmV3KGVudW0gc25kX2RldmljZV90eXBlIHR5cGUsCiAJCSAgICAgICB2b2lkICogZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqIG9wcykKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBhb2FfZ2V0X2NhcmQoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmMgYi9zb3VuZC9hcm0vYWFjaS5jCmluZGV4IGM0MjFmZGIuLjBlODNhNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmMKKysrIGIvc291bmQvYXJtL2FhY2kuYwpAQCAtODk5LDggKzg5OSw4IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCi0JCQkgICAgICBUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBhYWNpKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2LT5kZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgYWFjaSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTEwNTUsOCArMTA1NSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGFhY2ktPmNhcmQsICZkZXYtPmRldik7Ci0KIAlyZXQgPSBzbmRfY2FyZF9yZWdpc3RlcihhYWNpLT5jYXJkKTsKIAlpZiAocmV0ID09IDApIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXNcbiIsIGFhY2ktPmNhcmQtPmxvbmduYW1lKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKaW5kZXggOWEyYWMxZS4uM2ExMGRmNiAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKQEAgLTE3OSwxMiArMTc5LDExIEBACiAJCWdvdG8gZXJyX2RldjsKIAl9CiAKLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCi0JCQkgICAgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmZGV2LT5kZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKLQljYXJkLT5kZXYgPSAmZGV2LT5kZXY7CiAJc3RybGNweShjYXJkLT5kcml2ZXIsIGRldi0+ZGV2LmRyaXZlci0+bmFtZSwgc2l6ZW9mKGNhcmQtPmRyaXZlcikpOwogCiAJcmV0ID0gcHhhMnh4X3BjbV9uZXcoY2FyZCwgJnB4YTJ4eF9hYzk3X3BjbV9jbGllbnQsICZweGEyeHhfYWM5N19wY20pOwpAQCAtMjEwLDcgKzIwOSw2IEBACiAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmNvZGVjX3BkYXRhWzBdKQogCQlzbmRfYWM5N19kZXZfYWRkX3BkYXRhKGFjOTdfYnVzLT5jb2RlY1swXSwgcGRhdGEtPmNvZGVjX3BkYXRhWzBdKTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPmRldik7CiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hdG1lbC9hYmRhYy5jIGIvc291bmQvYXRtZWwvYWJkYWMuYwppbmRleCAzNTE5NTE4Li5lZGYyY2E3IDEwMDY0NAotLS0gYS9zb3VuZC9hdG1lbC9hYmRhYy5jCisrKyBiL3NvdW5kL2F0bWVsL2FiZGFjLmMKQEAgLTQyOSw4ICs0MjksOSBAQAogCX0KIAljbGtfZW5hYmxlKHBjbGspOwogCi0JcmV0dmFsID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgYXRtZWxfYWJkYWMpLCAmY2FyZCk7CisJcmV0dmFsID0gc25kX2NhcmRfbmV3KCZwZGV2LT5kZXYsIFNORFJWX0RFRkFVTFRfSURYMSwKKwkJCSAgICAgIFNORFJWX0RFRkFVTFRfU1RSMSwgVEhJU19NT0RVTEUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGF0bWVsX2FiZGFjKSwgJmNhcmQpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzb3VuZCBjYXJkIGRldmljZVxuIik7CiAJCWdvdG8gb3V0X3B1dF9zYW1wbGVfY2xrOwpAQCAtNDY3LDggKzQ2OCw2IEBACiAJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKLQogCWlmIChwZGF0YS0+ZHdzLmRtYV9kZXYpIHsKIAkJZG1hX2NhcF9tYXNrX3QgbWFzazsKIApAQCAtNDkyLDcgKzQ5MSw3IEBACiAJaWYgKCFwZGF0YS0+ZHdzLmRtYV9kZXYgfHwgIWRhYy0+ZG1hLmNoYW4pIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRE1BIG5vdCBhdmFpbGFibGVcbiIpOwogCQlyZXR2YWwgPSAtRU5PREVWOwotCQlnb3RvIG91dF91bnNldF9jYXJkX2RldjsKKwkJZ290byBvdXRfdW5tYXBfcmVnczsKIAl9CiAKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQXRtZWwgQUJEQUMiKTsKQEAgLTUyMSw5ICs1MjAsNiBAQAogb3V0X3JlbGVhc2VfZG1hOgogCWRtYV9yZWxlYXNlX2NoYW5uZWwoZGFjLT5kbWEuY2hhbik7CiAJZGFjLT5kbWEuY2hhbiA9IE5VTEw7Ci1vdXRfdW5zZXRfY2FyZF9kZXY6Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBOVUxMKTsKLQlmcmVlX2lycShpcnEsIGRhYyk7CiBvdXRfdW5tYXBfcmVnczoKIAlpb3VubWFwKGRhYy0+cmVncyk7CiBvdXRfZnJlZV9jYXJkOgpAQCAtNTc5LDcgKzU3NSw2IEBACiAKIAlkbWFfcmVsZWFzZV9jaGFubmVsKGRhYy0+ZG1hLmNoYW4pOwogCWRhYy0+ZG1hLmNoYW4gPSBOVUxMOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7CiAJaW91bm1hcChkYWMtPnJlZ3MpOwogCWZyZWVfaXJxKGRhYy0+aXJxLCBkYWMpOwogCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hdG1lbC9hYzk3Yy5jIGIvc291bmQvYXRtZWwvYWM5N2MuYwppbmRleCBjNWYwZGRkLi4wNWVjMDQ5IDEwMDY0NAotLS0gYS9zb3VuZC9hdG1lbC9hYzk3Yy5jCisrKyBiL3NvdW5kL2F0bWVsL2FjOTdjLmMKQEAgLTk0NSw4ICs5NDUsOSBAQAogCX0KIAljbGtfZW5hYmxlKHBjbGspOwogCi0JcmV0dmFsID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgYXRtZWxfYWM5N2MpLCAmY2FyZCk7CisJcmV0dmFsID0gc25kX2NhcmRfbmV3KCZwZGV2LT5kZXYsIFNORFJWX0RFRkFVTFRfSURYMSwKKwkJCSAgICAgIFNORFJWX0RFRkFVTFRfU1RSMSwgVEhJU19NT0RVTEUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGF0bWVsX2FjOTdjKSwgJmNhcmQpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzb3VuZCBjYXJkIGRldmljZVxuIik7CiAJCWdvdG8gZXJyX3NuZF9jYXJkX25ldzsKQEAgLTk5MCw4ICs5OTEsNiBAQAogCQljaGlwLT5yZXNldF9waW4gPSAtRUlOVkFMOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KIAlhdG1lbF9hYzk3Y19yZXNldChjaGlwKTsKIAogCS8qIEVuYWJsZSBvdmVycnVuIGludGVycnVwdCBmcm9tIGNvZGVjIGNoYW5uZWwgKi8KQEAgLTExMTMsOCArMTExMiw2IEBACiAJCWNoaXAtPmRtYS50eF9jaGFuID0gTlVMTDsKIAl9CiBlcnJfYWM5N19idXM6Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBOVUxMKTsKLQogCWlmIChncGlvX2lzX3ZhbGlkKGNoaXAtPnJlc2V0X3BpbikpCiAJCWdwaW9fZnJlZShjaGlwLT5yZXNldF9waW4pOwogCkBAIC0xMTk1LDcgKzExOTIsNiBAQAogCQljaGlwLT5kbWEudHhfY2hhbiA9IE5VTEw7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBOVUxMKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYyBiL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jCmluZGV4IDdhMjA4OTcuLjc0MDNmMzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jCisrKyBiL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJa2ZyZWUoZGF0YSk7CiAJfQogCXNuZF9jYXJkX3VucmVmKGNvbXByLT5jYXJkKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNuZF9jb21wcl9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sLmMgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwppbmRleCBkOGFhMjA2Li5mMDM4ZjVhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbnRyb2wuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWlkKSkKIAkJcmV0dXJuOwogCXJlYWRfbG9jaygmY2FyZC0+Y3RsX2ZpbGVzX3J3bG9jayk7Ci0jaWYgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX01JWEVSX09TUykKIAljYXJkLT5taXhlcl9vc3NfY2hhbmdlX2NvdW50Kys7CiAjZW5kaWYKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewpAQCAtMTcwLDcgKzE3MCw3IEBACiAJCQlldi0+bWFzayA9IG1hc2s7CiAJCQlsaXN0X2FkZF90YWlsKCZldi0+bGlzdCwgJmN0bC0+ZXZlbnRzKTsKIAkJfSBlbHNlIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIk5vIG1lbW9yeSBhdmFpbGFibGUgdG8gYWxsb2NhdGUgZXZlbnRcbiIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsICJObyBtZW1vcnkgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIGV2ZW50XG4iKTsKIAkJfQogCV9mb3VuZDoKIAkJd2FrZV91cCgmY3RsLT5jaGFuZ2Vfc2xlZXApOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAKIAlrY3RsID0ga3phbGxvYyhzaXplb2YoKmtjdGwpICsgc2l6ZW9mKHN0cnVjdCBzbmRfa2NvbnRyb2xfdm9sYXRpbGUpICogY29udHJvbC0+Y291bnQsIEdGUF9LRVJORUwpOwogCWlmIChrY3RsID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIGNvbnRyb2wgaW5zdGFuY2VcbiIpOworCQlwcl9lcnIoIkFMU0E6IENhbm5vdCBhbGxvY2F0ZSBjb250cm9sIGluc3RhbmNlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCSprY3RsID0gKmNvbnRyb2w7CkBAIC0yNDEsOSArMjQxLDggQEAKIAlpZiAobmNvbnRyb2wtPm5hbWUpIHsKIAkJc3RybGNweShrY3RsLmlkLm5hbWUsIG5jb250cm9sLT5uYW1lLCBzaXplb2Yoa2N0bC5pZC5uYW1lKSk7CiAJCWlmIChzdHJjbXAobmNvbnRyb2wtPm5hbWUsIGtjdGwuaWQubmFtZSkgIT0gMCkKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgIkNvbnRyb2wgbmFtZSAnJXMnIHRydW5jYXRlZCB0byAnJXMnXG4iLAotCQkJCSAgIG5jb250cm9sLT5uYW1lLCBrY3RsLmlkLm5hbWUpOworCQkJcHJfd2FybigiQUxTQTogQ29udHJvbCBuYW1lICclcycgdHJ1bmNhdGVkIHRvICclcydcbiIsCisJCQkJbmNvbnRyb2wtPm5hbWUsIGtjdGwuaWQubmFtZSk7CiAJfQogCWtjdGwuaWQuaW5kZXggPSBuY29udHJvbC0+aW5kZXg7CiAJa2N0bC5jb3VudCA9IG5jb250cm9sLT5jb3VudCA/IG5jb250cm9sLT5jb3VudCA6IDE7CkBAIC0zMDYsNyArMzA1LDcgQEAKIAl3aGlsZSAoc25kX2N0bF9yZW1vdmVfbnVtaWRfY29uZmxpY3QoY2FyZCwgY291bnQpKSB7CiAJCWlmICgtLWl0ZXIgPT0gMCkgewogCQkJLyogdGhpcyBzaXR1YXRpb24gaXMgdmVyeSB1bmxpa2VseSAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBjb250cm9sIG51bWlkXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBjb250cm9sIG51bWlkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQpAQCAtMzQxLDcgKzM0MCw3IEBACiAJZG93bl93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwogCWlmIChzbmRfY3RsX2ZpbmRfaWQoY2FyZCwgJmlkKSkgewogCQl1cF93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwotCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJjb250cm9sICVpOiVpOiVpOiVzOiVpIGlzIGFscmVhZHkgcHJlc2VudFxuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjb250cm9sICVpOiVpOiVpOiVzOiVpIGlzIGFscmVhZHkgcHJlc2VudFxuIiwKIAkJCQkJaWQuaWZhY2UsCiAJCQkJCWlkLmRldmljZSwKIAkJCQkJaWQuc3ViZGV2aWNlLApAQCAtMTQwNiw3ICsxNDA1LDcgQEAKIAkJfQogCX0KIAl1cF9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwotCXNuZF9wcmludGRkKCJ1bmtub3duIGlvY3RsID0gMHgleFxuIiwgY21kKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgInVua25vd24gaW9jdGwgPSAweCV4XG4iLCBjbWQpOwogCXJldHVybiAtRU5PVFRZOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKaW5kZXggMmJiOTVhNy4uYjljMDkxMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJfSBlbHNlIHsKIAkJc2l6ZSA9IGdldF9lbGVtX3NpemUodHlwZSwgY291bnQpOwogCQlpZiAoc2l6ZSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic25kX2lvY3RsMzJfY3RsX2VsZW1fdmFsdWU6IHVua25vd24gdHlwZSAlZFxuIiwgdHlwZSk7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgInNuZF9pb2N0bDMyX2N0bF9lbGVtX3ZhbHVlOiB1bmtub3duIHR5cGUgJWRcbiIsIHR5cGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEtPnZhbHVlLmJ5dGVzLmRhdGEsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2RldmljZS5jIGIvc291bmQvY29yZS9kZXZpY2UuYwppbmRleCBkZjg4ZGVmLi40MWJlYzMwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2RldmljZS5jCisrKyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKQEAgLTQxLDI4ICs0MSw3MiBAQAogICoKICAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotaW50IHNuZF9kZXZpY2VfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc25kX2RldmljZV90eXBlX3QgdHlwZSwKK2ludCBzbmRfZGV2aWNlX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGVudW0gc25kX2RldmljZV90eXBlIHR5cGUsCiAJCSAgIHZvaWQgKmRldmljZV9kYXRhLCBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgKm9wcykKIHsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEgfHwgIW9wcykpCiAJCXJldHVybiAtRU5YSU87CiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgZGV2aWNlLCB0eXBlPSVkXG4iLCB0eXBlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpc3QpOwogCWRldi0+Y2FyZCA9IGNhcmQ7CiAJZGV2LT50eXBlID0gdHlwZTsKIAlkZXYtPnN0YXRlID0gU05EUlZfREVWX0JVSUxEOwogCWRldi0+ZGV2aWNlX2RhdGEgPSBkZXZpY2VfZGF0YTsKIAlkZXYtPm9wcyA9IG9wczsKLQlsaXN0X2FkZCgmZGV2LT5saXN0LCAmY2FyZC0+ZGV2aWNlcyk7CS8qIGFkZCB0byB0aGUgaGVhZCBvZiBsaXN0ICovCisKKwkvKiBpbnNlcnQgdGhlIGVudHJ5IGluIGFuIGluY3JlbWVudGFsbHkgc29ydGVkIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX3ByZXYocCwgJmNhcmQtPmRldmljZXMpIHsKKwkJc3RydWN0IHNuZF9kZXZpY2UgKnBkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfZGV2aWNlLCBsaXN0KTsKKwkJaWYgKCh1bnNpZ25lZCBpbnQpcGRldi0+dHlwZSA8PSAodW5zaWduZWQgaW50KXR5cGUpCisJCQlicmVhazsKKwl9CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCBwKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc25kX2RldmljZV9uZXcpOworCitzdGF0aWMgaW50IF9fc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+c3RhdGUgPT0gU05EUlZfREVWX1JFR0lTVEVSRUQpIHsKKwkJaWYgKGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdCAmJgorCQkgICAgZGV2LT5vcHMtPmRldl9kaXNjb25uZWN0KGRldikpCisJCQlkZXZfZXJyKGRldi0+Y2FyZC0+ZGV2LCAiZGV2aWNlIGRpc2Nvbm5lY3QgZmFpbHVyZVxuIik7CisJCWRldi0+c3RhdGUgPSBTTkRSVl9ERVZfRElTQ09OTkVDVEVEOworCX0KIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfZGV2aWNlX25ldyk7CitzdGF0aWMgdm9pZCBfX3NuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2KQoreworCS8qIHVubGluayAqLworCWxpc3RfZGVsKCZkZXYtPmxpc3QpOworCisJX19zbmRfZGV2aWNlX2Rpc2Nvbm5lY3QoZGV2KTsKKwlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKSB7CisJCWlmIChkZXYtPm9wcy0+ZGV2X2ZyZWUoZGV2KSkKKwkJCWRldl9lcnIoZGV2LT5jYXJkLT5kZXYsICJkZXZpY2UgZnJlZSBmYWlsdXJlXG4iKTsKKwl9CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlICpsb29rX2Zvcl9kZXYoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KQorCQlpZiAoZGV2LT5kZXZpY2VfZGF0YSA9PSBkZXZpY2VfZGF0YSkKKwkJCXJldHVybiBkZXY7CisKKwlyZXR1cm4gTlVMTDsKK30KIAogLyoqCiAgKiBzbmRfZGV2aWNlX2ZyZWUgLSByZWxlYXNlIHRoZSBkZXZpY2UgZnJvbSB0aGUgY2FyZApAQCAtNzIsNzMgKzExNiwzMyBAQAogICogUmVtb3ZlcyB0aGUgZGV2aWNlIGZyb20gdGhlIGxpc3Qgb24gdGhlIGNhcmQgYW5kIGludm9rZXMgdGhlCiAgKiBjYWxsYmFja3MsIGRldl9kaXNjb25uZWN0IGFuZCBkZXZfZnJlZSwgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhdGUuCiAgKiBUaGVuIHJlbGVhc2UgdGhlIGRldmljZS4KLSAqCi0gKiBSZXR1cm46IFplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgb3IgaWYgdGhlCi0gKiBkZXZpY2Ugbm90IGZvdW5kLgogICovCi1pbnQgc25kX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpCit2b2lkIHNuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CiAJCiAJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWRldmljZV9kYXRhKSkKLQkJcmV0dXJuIC1FTlhJTzsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKLQkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgIT0gZGV2aWNlX2RhdGEpCi0JCQljb250aW51ZTsKLQkJLyogdW5saW5rICovCi0JCWxpc3RfZGVsKCZkZXYtPmxpc3QpOwotCQlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfUkVHSVNURVJFRCAmJgotCQkgICAgZGV2LT5vcHMtPmRldl9kaXNjb25uZWN0KQotCQkJaWYgKGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdChkZXYpKQotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCQkJICAgImRldmljZSBkaXNjb25uZWN0IGZhaWx1cmVcbiIpOwotCQlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKSB7Ci0JCQlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKGRldikpCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGV2aWNlIGZyZWUgZmFpbHVyZVxuIik7Ci0JCX0KLQkJa2ZyZWUoZGV2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNuZF9wcmludGQoImRldmljZSBmcmVlICVwIChmcm9tICVwRiksIG5vdCBmb3VuZFxuIiwgZGV2aWNlX2RhdGEsCi0JCSAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIC1FTlhJTzsKKwkJcmV0dXJuOworCWRldiA9IGxvb2tfZm9yX2RldihjYXJkLCBkZXZpY2VfZGF0YSk7CisJaWYgKGRldikKKwkJX19zbmRfZGV2aWNlX2ZyZWUoZGV2KTsKKwllbHNlCisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiZGV2aWNlIGZyZWUgJXAgKGZyb20gJXBGKSwgbm90IGZvdW5kXG4iLAorCQkJZGV2aWNlX2RhdGEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc25kX2RldmljZV9mcmVlKTsKIAotLyoqCi0gKiBzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QgLSBkaXNjb25uZWN0IHRoZSBkZXZpY2UKLSAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQotICogQGRldmljZV9kYXRhOiB0aGUgZGF0YSBwb2ludGVyIHRvIGRpc2Nvbm5lY3QKLSAqCi0gKiBUdXJucyB0aGUgZGV2aWNlIGludG8gdGhlIGRpc2Nvbm5lY3Rpb24gc3RhdGUsIGludm9raW5nCi0gKiBkZXZfZGlzY29ubmVjdCBjYWxsYmFjaywgaWYgdGhlIGRldmljZSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICoKLSAqIFVzdWFsbHkgY2FsbGVkIGZyb20gc25kX2NhcmRfZGlzY29ubmVjdCgpLgotICoKLSAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSBvciBpZiB0aGUKLSAqIGRldmljZSBub3QgZm91bmQuCi0gKi8KLWludCBzbmRfZGV2aWNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSkKK3N0YXRpYyBpbnQgX19zbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQotCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFkZXZpY2VfZGF0YSkpCi0JCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9SRUdJU1RFUkVEICYmCi0JCSAgICBkZXYtPm9wcy0+ZGV2X2Rpc2Nvbm5lY3QpIHsKLQkJCWlmIChkZXYtPm9wcy0+ZGV2X2Rpc2Nvbm5lY3QoZGV2KSkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkZXZpY2UgZGlzY29ubmVjdCBmYWlsdXJlXG4iKTsKLQkJCWRldi0+c3RhdGUgPSBTTkRSVl9ERVZfRElTQ09OTkVDVEVEOworCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCkgeworCQlpZiAoZGV2LT5vcHMtPmRldl9yZWdpc3RlcikgeworCQkJaW50IGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CiAJCX0KLQkJcmV0dXJuIDA7CisJCWRldi0+c3RhdGUgPSBTTkRSVl9ERVZfUkVHSVNURVJFRDsKIAl9Ci0Jc25kX3ByaW50ZCgiZGV2aWNlIGRpc2Nvbm5lY3QgJXAgKGZyb20gJXBGKSwgbm90IGZvdW5kXG4iLCBkZXZpY2VfZGF0YSwKLQkJICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlyZXR1cm4gLUVOWElPOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE1NywyNiArMTYxLDE1IEBACiBpbnQgc25kX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0JaW50IGVycjsKIAogCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFkZXZpY2VfZGF0YSkpCiAJCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7Ci0JCQlpZiAoKGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KSkgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX1JFR0lTVEVSRUQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlzbmRfcHJpbnRkKCJzbmRfZGV2aWNlX3JlZ2lzdGVyIGJ1c3lcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KKwlkZXYgPSBsb29rX2Zvcl9kZXYoY2FyZCwgZGV2aWNlX2RhdGEpOworCWlmIChkZXYpCisJCXJldHVybiBfX3NuZF9kZXZpY2VfcmVnaXN0ZXIoZGV2KTsKIAlzbmRfQlVHKCk7CiAJcmV0dXJuIC1FTlhJTzsKIH0KLQogRVhQT1JUX1NZTUJPTChzbmRfZGV2aWNlX3JlZ2lzdGVyKTsKIAogLyoKQEAgLTE5MSwxMSArMTg0LDkgQEAKIAlpZiAoc25kX0JVR19PTighY2FyZCkpCiAJCXJldHVybiAtRU5YSU87CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7Ci0JCQlpZiAoKGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KSkgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX1JFR0lTVEVSRUQ7Ci0JCX0KKwkJZXJyID0gX19zbmRfZGV2aWNlX3JlZ2lzdGVyKGRldik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTEsOCArMjAyLDggQEAKIAogCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKIAkJcmV0dXJuIC1FTlhJTzsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKLQkJaWYgKHNuZF9kZXZpY2VfZGlzY29ubmVjdChjYXJkLCBkZXYtPmRldmljZV9kYXRhKSA8IDApCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKKwkJaWYgKF9fc25kX2RldmljZV9kaXNjb25uZWN0KGRldikgPCAwKQogCQkJZXJyID0gLUVOWElPOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMjIyLDI0ICsyMTMsMTIgQEAKICAqIHJlbGVhc2UgYWxsIHRoZSBkZXZpY2VzIG9uIHRoZSBjYXJkLgogICogY2FsbGVkIGZyb20gaW5pdC5jCiAgKi8KLWludCBzbmRfZGV2aWNlX2ZyZWVfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc25kX2RldmljZV9jbWRfdCBjbWQpCit2b2lkIHNuZF9kZXZpY2VfZnJlZV9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgcmFuZ2VfbG93LCByYW5nZV9oaWdoLCB0eXBlOworCXN0cnVjdCBzbmRfZGV2aWNlICpkZXYsICpuZXh0OwogCiAJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQotCQlyZXR1cm4gLUVOWElPOwotCXJhbmdlX2xvdyA9IChfX2ZvcmNlIHVuc2lnbmVkIGludCljbWQgKiBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFOwotCXJhbmdlX2hpZ2ggPSByYW5nZV9sb3cgKyBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFIC0gMTsKLSAgICAgIF9fYWdhaW46Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCXR5cGUgPSAoX19mb3JjZSB1bnNpZ25lZCBpbnQpZGV2LT50eXBlOwotCQlpZiAodHlwZSA+PSByYW5nZV9sb3cgJiYgdHlwZSA8PSByYW5nZV9oaWdoKSB7Ci0JCQlpZiAoKGVyciA9IHNuZF9kZXZpY2VfZnJlZShjYXJkLCBkZXYtPmRldmljZV9kYXRhKSkgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlnb3RvIF9fYWdhaW47Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisJCXJldHVybjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShkZXYsIG5leHQsICZjYXJkLT5kZXZpY2VzLCBsaXN0KQorCQlfX3NuZF9kZXZpY2VfZnJlZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ocnRpbWVyLmMgYi9zb3VuZC9jb3JlL2hydGltZXIuYwppbmRleCBiOGIzMWM0Li44ODZiZTdkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2hydGltZXIuYworKysgYi9zb3VuZC9jb3JlL2hydGltZXIuYwpAQCAtMTI2LDggKzEyNiw3IEBACiAKIAlocnRpbWVyX2dldF9yZXMoQ0xPQ0tfTU9OT1RPTklDLCAmdHApOwogCWlmICh0cC50dl9zZWMgPiAwIHx8ICF0cC50dl9uc2VjKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSAgICJzbmQtaHJ0aW1lcjogSW52YWxpZCByZXNvbHV0aW9uICV1LiUwOXUiLAorCQlwcl9lcnIoInNuZC1ocnRpbWVyOiBJbnZhbGlkIHJlc29sdXRpb24gJXUuJTA5dSIsCiAJCQkgICAodW5zaWduZWQpdHAudHZfc2VjLCAodW5zaWduZWQpdHAudHZfbnNlYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaHdkZXAuYyBiL3NvdW5kL2NvcmUvaHdkZXAuYwppbmRleCBkMTA1MDczLi42OTQ1OWU1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2h3ZGVwLmMKKysrIGIvc291bmQvY29yZS9od2RlcC5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIAkJKnJod2RlcCA9IE5VTEw7CiAJaHdkZXAgPSBremFsbG9jKHNpemVvZigqaHdkZXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoaHdkZXAgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJod2RlcDogY2Fubm90IGFsbG9jYXRlXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJod2RlcDogY2Fubm90IGFsbG9jYXRlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWh3ZGVwLT5jYXJkID0gY2FyZDsKQEAgLTM5NSw2ICszOTUsNyBAQAogCQkqcmh3ZGVwID0gaHdkZXA7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9od2RlcF9uZXcpOwogCiBzdGF0aWMgaW50IHNuZF9od2RlcF9mcmVlKHN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwKQogewpAQCAtNDE1LDM3ICs0MTYsNjEgQEAKIHN0YXRpYyBpbnQgc25kX2h3ZGVwX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBod2RlcC0+Y2FyZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IGVycjsKIAljaGFyIG5hbWVbMzJdOwogCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWlmIChzbmRfaHdkZXBfc2VhcmNoKGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlKSkgeworCWlmIChzbmRfaHdkZXBfc2VhcmNoKGNhcmQsIGh3ZGVwLT5kZXZpY2UpKSB7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlsaXN0X2FkZF90YWlsKCZod2RlcC0+bGlzdCwgJnNuZF9od2RlcF9kZXZpY2VzKTsKIAlzcHJpbnRmKG5hbWUsICJod0MlaUQlaSIsIGh3ZGVwLT5jYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOwotCWlmICgoZXJyID0gc25kX3JlZ2lzdGVyX2RldmljZShTTkRSVl9ERVZJQ0VfVFlQRV9IV0RFUCwKLQkJCQkgICAgICAgaHdkZXAtPmNhcmQsIGh3ZGVwLT5kZXZpY2UsCi0JCQkJICAgICAgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwLCBuYW1lKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBoYXJkd2FyZSBkZXBlbmRlbnQgZGV2aWNlICVpOiVpXG4iLAotCQkJICAgaHdkZXAtPmNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CisJZGV2ID0gaHdkZXAtPmRldjsKKwlpZiAoIWRldikKKwkJZGV2ID0gc25kX2NhcmRfZ2V0X2RldmljZV9saW5rKGh3ZGVwLT5jYXJkKTsKKwllcnIgPSBzbmRfcmVnaXN0ZXJfZGV2aWNlX2Zvcl9kZXYoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsCisJCQkJCSAgaHdkZXAtPmNhcmQsIGh3ZGVwLT5kZXZpY2UsCisJCQkJCSAgJnNuZF9od2RlcF9mX29wcywgaHdkZXAsIG5hbWUsIGRldik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihkZXYsCisJCQkidW5hYmxlIHRvIHJlZ2lzdGVyIGhhcmR3YXJlIGRlcGVuZGVudCBkZXZpY2UgJWk6JWlcbiIsCisJCQljYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOwogCQlsaXN0X2RlbCgmaHdkZXAtPmxpc3QpOwogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIGVycjsKIAl9CisKKwlpZiAoaHdkZXAtPmdyb3VwcykgeworCQlzdHJ1Y3QgZGV2aWNlICpkID0gc25kX2dldF9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsCisJCQkJCQkgIGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlKTsKKwkJaWYgKGQpIHsKKwkJCWlmIChod2RlcC0+cHJpdmF0ZV9kYXRhKQorCQkJCWRldl9zZXRfZHJ2ZGF0YShkLCBod2RlcC0+cHJpdmF0ZV9kYXRhKTsKKwkJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cHMoJmQtPmtvYmosIGh3ZGVwLT5ncm91cHMpOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2X3dhcm4oZGV2LAorCQkJCQkgImh3ZGVwICVkOiVkOiBjYW5ub3QgY3JlYXRlIHN5c2ZzIGdyb3Vwc1xuIiwKKwkJCQkJIGNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CisJCQlwdXRfZGV2aWNlKGQpOworCQl9CisJfQorCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCiAJaHdkZXAtPm9zc3JlZyA9IDA7CiAJaWYgKGh3ZGVwLT5vc3NfdHlwZSA+PSAwKSB7CiAJCWlmICgoaHdkZXAtPm9zc190eXBlID09IFNORFJWX09TU19ERVZJQ0VfVFlQRV9ETUZNKSAmJiAoaHdkZXAtPmRldmljZSAhPSAwKSkgewotCQkJc25kX3ByaW50ayAoS0VSTl9XQVJOSU5HICJvbmx5IGh3ZGVwIGRldmljZSAwIGNhbiBiZSByZWdpc3RlcmVkIGFzIE9TUyBkaXJlY3QgRk0gZGV2aWNlIVxuIik7CisJCQlkZXZfd2FybihkZXYsCisJCQkJICJvbmx5IGh3ZGVwIGRldmljZSAwIGNhbiBiZSByZWdpc3RlcmVkIGFzIE9TUyBkaXJlY3QgRk0gZGV2aWNlIVxuIik7CiAJCX0gZWxzZSB7CiAJCQlpZiAoc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoaHdkZXAtPm9zc190eXBlLAotCQkJCQkJICAgIGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlLAotCQkJCQkJICAgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwLAotCQkJCQkJICAgIGh3ZGVwLT5vc3NfZGV2KSA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIGNvbXBhdGliaWxpdHkgZGV2aWNlICVpOiVpXG4iLAotCQkJCQkgICBod2RlcC0+Y2FyZC0+bnVtYmVyLCBod2RlcC0+ZGV2aWNlKTsKKwkJCQkJCSAgICBjYXJkLCBod2RlcC0+ZGV2aWNlLAorCQkJCQkJICAgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwKSA8IDApIHsKKwkJCQlkZXZfZXJyKGRldiwKKwkJCQkJInVuYWJsZSB0byByZWdpc3RlciBPU1MgY29tcGF0aWJpbGl0eSBkZXZpY2UgJWk6JWlcbiIsCisJCQkJCWNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CiAJCQl9IGVsc2UKIAkJCQlod2RlcC0+b3NzcmVnID0gMTsKIAkJfQpAQCAtNTQzLDUgKzU2OCwzIEBACiAKIG1vZHVsZV9pbml0KGFsc2FfaHdkZXBfaW5pdCkKIG1vZHVsZV9leGl0KGFsc2FfaHdkZXBfZXhpdCkKLQotRVhQT1JUX1NZTUJPTChzbmRfaHdkZXBfbmV3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mby5jIGIvc291bmQvY29yZS9pbmZvLmMKaW5kZXggZTc5YmFhMS4uMDUxZDU1YiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvLmMKKysrIGIvc291bmQvY29yZS9pbmZvLmMKQEAgLTQxOCw5ICs0MTgsMTQgQEAKIAkJCWlmIChlbnRyeS0+Yy50ZXh0LndyaXRlKSB7CiAJCQkJZW50cnktPmMudGV4dC53cml0ZShlbnRyeSwgZGF0YS0+d2J1ZmZlcik7CiAJCQkJaWYgKGRhdGEtPndidWZmZXItPmVycm9yKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJkYXRhIHdyaXRlIGVycm9yIHRvICVzICglaSlcbiIsCi0JCQkJCQllbnRyeS0+bmFtZSwKLQkJCQkJCWRhdGEtPndidWZmZXItPmVycm9yKTsKKwkJCQkJaWYgKGVudHJ5LT5jYXJkKQorCQkJCQkJZGV2X3dhcm4oZW50cnktPmNhcmQtPmRldiwgImluZm86IGRhdGEgd3JpdGUgZXJyb3IgdG8gJXMgKCVpKVxuIiwKKwkJCQkJCQkgZW50cnktPm5hbWUsCisJCQkJCQkJIGRhdGEtPndidWZmZXItPmVycm9yKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJfd2FybigiQUxTQTogaW5mbzogZGF0YSB3cml0ZSBlcnJvciB0byAlcyAoJWkpXG4iLAorCQkJCQkJCWVudHJ5LT5uYW1lLAorCQkJCQkJCWRhdGEtPndidWZmZXItPmVycm9yKTsKIAkJCQl9CiAJCQl9CiAJCQlrZnJlZShkYXRhLT53YnVmZmVyLT5idWZmZXIpOwpAQCAtNTQwLDcgKzU0NSw3IEBACiAJCXNuZF9vc3Nfcm9vdCA9IGVudHJ5OwogCX0KICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TRVFVRU5DRVIpCiAJewogCQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCQlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeShUSElTX01PRFVMRSwgInNlcSIsIE5VTEwpKSA9PSBOVUxMKQpAQCAtNTY3LDcgKzU3Miw3IEBACiAJc25kX21pbm9yX2luZm9fZG9uZSgpOwogCXNuZF9pbmZvX3ZlcnNpb25fZG9uZSgpOwogCWlmIChzbmRfcHJvY19yb290KSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUikgfHwgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1NFUVVFTkNFUikKIAkJc25kX2luZm9fZnJlZV9lbnRyeShzbmRfc2VxX3Jvb3QpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luaXQuYyBiL3NvdW5kL2NvcmUvaW5pdC5jCmluZGV4IDBkNDJmY2QuLjVlZTgzODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvaW5pdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtOTQsNyArOTUsNyBAQAogCXJldHVybiBtYXRjaDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiBpbnQgKCpzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjaykoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZnJlZV9mbGFnKTsKIEVYUE9SVF9TWU1CT0woc25kX21peGVyX29zc19ub3RpZnlfY2FsbGJhY2spOwogI2VuZGlmCkBAIC0xMTIsMTEgKzExMywxMSBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoKGVyciA9IHNuZF9pbmZvX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgaW5mb1xuIik7CisJCWRldl9kYmcoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBjYXJkIGluZm9cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZCwgImlkIiwgY2FyZC0+cHJvY19yb290KSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgZW50cnlcbiIpOworCQlkZXZfZGJnKGNhcmQtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgY2FyZCBlbnRyeVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9jYXJkX2lkX3JlYWQ7CkBAIC0xNTYsOCArMTU3LDE3IEBACiAJcmV0dXJuIG1hc2s7IC8qIHVuY2hhbmdlZCAqLwogfQogCitzdGF0aWMgaW50IHNuZF9jYXJkX2RvX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjYXJkX2Rldl9hdHRyX2dyb3Vwc1tdOworCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhcmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzbmRfY2FyZF9kb19mcmVlKGRldl90b19zbmRfY2FyZChkZXYpKTsKK30KKwogLyoqCi0gKiAgc25kX2NhcmRfY3JlYXRlIC0gY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc291bmRjYXJkIHN0cnVjdHVyZQorICogIHNuZF9jYXJkX25ldyAtIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNvdW5kY2FyZCBzdHJ1Y3R1cmUKKyAqICBAcGFyZW50OiB0aGUgcGFyZW50IGRldmljZSBvYmplY3QKICAqICBAaWR4OiBjYXJkIGluZGV4IChhZGRyZXNzKSBbMCAuLi4gKFNORFJWX0NBUkRTLTEpXQogICogIEB4aWQ6IGNhcmQgaWRlbnRpZmljYXRpb24gKEFTQ0lJIHN0cmluZykKICAqICBAbW9kdWxlOiB0b3AgbGV2ZWwgbW9kdWxlIGZvciBsb2NraW5nCkBAIC0xNzIsNyArMTgyLDcgQEAKICAqCiAgKiAgUmV0dXJuOiBaZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCi1pbnQgc25kX2NhcmRfY3JlYXRlKGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCwKK2ludCBzbmRfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgaWR4LCBjb25zdCBjaGFyICp4aWQsCiAJCSAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAogCQkgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZF9yZXQpCiB7CkBAIC0xODgsNiArMTk4LDggQEAKIAljYXJkID0ga3phbGxvYyhzaXplb2YoKmNhcmQpICsgZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoZXh0cmFfc2l6ZSA+IDApCisJCWNhcmQtPnByaXZhdGVfZGF0YSA9IChjaGFyICopY2FyZCArIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmQpOwogCWlmICh4aWQpCiAJCXN0cmxjcHkoY2FyZC0+aWQsIHhpZCwgc2l6ZW9mKGNhcmQtPmlkKSk7CiAJZXJyID0gMDsKQEAgLTIwNSwxNCArMjE3LDE2IEBACiAJCWVyciA9IC1FTk9ERVY7CiAJaWYgKGVyciA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBmaW5kIHRoZSBzbG90IGZvciBpbmRleCAlZCAocmFuZ2UgMC0laSksIGVycm9yOiAlZFxuIiwKKwkJZGV2X2VycihwYXJlbnQsICJjYW5ub3QgZmluZCB0aGUgc2xvdCBmb3IgaW5kZXggJWQgKHJhbmdlIDAtJWkpLCBlcnJvcjogJWRcbiIsCiAJCQkgaWR4LCBzbmRfZWNhcmRzX2xpbWl0IC0gMSwgZXJyKTsKLQkJZ290byBfX2Vycm9yOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAJc2V0X2JpdChpZHgsIHNuZF9jYXJkc19sb2NrKTsJCS8qIGxvY2sgaXQgKi8KIAlpZiAoaWR4ID49IHNuZF9lY2FyZHNfbGltaXQpCiAJCXNuZF9lY2FyZHNfbGltaXQgPSBpZHggKyAxOyAvKiBpbmNyZWFzZSB0aGUgbGltaXQgKi8KIAltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKKwljYXJkLT5kZXYgPSBwYXJlbnQ7CiAJY2FyZC0+bnVtYmVyID0gaWR4OwogCWNhcmQtPm1vZHVsZSA9IG1vZHVsZTsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+ZGV2aWNlcyk7CkBAIC0yMjIsMzYgKzIzNiw0MiBAQAogCUlOSVRfTElTVF9IRUFEKCZjYXJkLT5jdGxfZmlsZXMpOwogCXNwaW5fbG9ja19pbml0KCZjYXJkLT5maWxlc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+ZmlsZXNfbGlzdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+c2h1dGRvd25fc2xlZXApOwotCWF0b21pY19zZXQoJmNhcmQtPnJlZmNvdW50LCAwKTsKICNpZmRlZiBDT05GSUdfUE0KIAltdXRleF9pbml0KCZjYXJkLT5wb3dlcl9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5wb3dlcl9zbGVlcCk7CiAjZW5kaWYKKworCWRldmljZV9pbml0aWFsaXplKCZjYXJkLT5jYXJkX2Rldik7CisJY2FyZC0+Y2FyZF9kZXYucGFyZW50ID0gcGFyZW50OworCWNhcmQtPmNhcmRfZGV2LmNsYXNzID0gc291bmRfY2xhc3M7CisJY2FyZC0+Y2FyZF9kZXYucmVsZWFzZSA9IHJlbGVhc2VfY2FyZF9kZXZpY2U7CisJY2FyZC0+Y2FyZF9kZXYuZ3JvdXBzID0gY2FyZF9kZXZfYXR0cl9ncm91cHM7CisJZXJyID0ga29iamVjdF9zZXRfbmFtZSgmY2FyZC0+Y2FyZF9kZXYua29iaiwgImNhcmQlZCIsIGlkeCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX19lcnJvcjsKKwogCS8qIHRoZSBjb250cm9sIGludGVyZmFjZSBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSB0aGUgdXNlciBzcGFjZSB1bnRpbCAqLwogCS8qIHNuZF9jYXJkc19iaXRtYXNrIGFuZCBzbmRfY2FyZHMgYXJlIHNldCB3aXRoIHNuZF9jYXJkX3JlZ2lzdGVyICovCiAJZXJyID0gc25kX2N0bF9jcmVhdGUoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGNvbnRyb2wgbWlub3JzXG4iKTsKKwkJZGV2X2VycihwYXJlbnQsICJ1bmFibGUgdG8gcmVnaXN0ZXIgY29udHJvbCBtaW5vcnNcbiIpOwogCQlnb3RvIF9fZXJyb3I7CiAJfQogCWVyciA9IHNuZF9pbmZvX2NhcmRfY3JlYXRlKGNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBjcmVhdGUgY2FyZCBpbmZvXG4iKTsKKwkJZGV2X2VycihwYXJlbnQsICJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgaW5mb1xuIik7CiAJCWdvdG8gX19lcnJvcl9jdGw7CiAJfQotCWlmIChleHRyYV9zaXplID4gMCkKLQkJY2FyZC0+cHJpdmF0ZV9kYXRhID0gKGNoYXIgKiljYXJkICsgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZCk7CiAJKmNhcmRfcmV0ID0gY2FyZDsKIAlyZXR1cm4gMDsKIAogICAgICAgX19lcnJvcl9jdGw6Ci0Jc25kX2RldmljZV9mcmVlX2FsbChjYXJkLCBTTkRSVl9ERVZfQ01EX1BSRSk7CisJc25kX2RldmljZV9mcmVlX2FsbChjYXJkKTsKICAgICAgIF9fZXJyb3I6Ci0Ja2ZyZWUoY2FyZCk7CisJcHV0X2RldmljZSgmY2FyZC0+Y2FyZF9kZXYpOwogICAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0woc25kX2NhcmRfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woc25kX2NhcmRfbmV3KTsKIAogLyogcmV0dXJuIG5vbi16ZXJvIGlmIGEgY2FyZCBpcyBhbHJlYWR5IGxvY2tlZCAqLwogaW50IHNuZF9jYXJkX2xvY2tlZChpbnQgY2FyZCkKQEAgLTM5NCw3ICs0MTQsNyBAQAogCS8qIHBoYXNlIDM6IG5vdGlmeSBhbGwgY29ubmVjdGVkIGRldmljZXMgYWJvdXQgZGlzY29ubmVjdGlvbiAqLwogCS8qIGF0IHRoaXMgcG9pbnQsIHRoZXkgY2Fubm90IHJlc3BvbmQgdG8gYW55IGNhbGxzIGV4Y2VwdCByZWxlYXNlKCkgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQogCQlzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayhjYXJkLCBTTkRfTUlYRVJfT1NTX05PVElGWV9ESVNDT05ORUNUKTsKICNlbmRpZgpAQCAtNDAyLDEyICs0MjIsMTIgQEAKIAkvKiBub3RpZnkgYWxsIGRldmljZXMgdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGVkICovCiAJZXJyID0gc25kX2RldmljZV9kaXNjb25uZWN0X2FsbChjYXJkKTsKIAlpZiAoZXJyIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibm90IGFsbCBkZXZpY2VzIGZvciBjYXJkICVpIGNhbiBiZSBkaXNjb25uZWN0ZWRcbiIsIGNhcmQtPm51bWJlcik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibm90IGFsbCBkZXZpY2VzIGZvciBjYXJkICVpIGNhbiBiZSBkaXNjb25uZWN0ZWRcbiIsIGNhcmQtPm51bWJlcik7CiAKIAlzbmRfaW5mb19jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7Ci0JaWYgKGNhcmQtPmNhcmRfZGV2KSB7Ci0JCWRldmljZV91bnJlZ2lzdGVyKGNhcmQtPmNhcmRfZGV2KTsKLQkJY2FyZC0+Y2FyZF9kZXYgPSBOVUxMOworCWlmIChjYXJkLT5yZWdpc3RlcmVkKSB7CisJCWRldmljZV9kZWwoJmNhcmQtPmNhcmRfZGV2KTsKKwkJY2FyZC0+cmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KICNpZmRlZiBDT05GSUdfUE0KIAl3YWtlX3VwKCZjYXJkLT5wb3dlcl9zbGVlcCk7CkBAIC00MzAsODEgKzQ1MCw0OCBAQAogICovCiBzdGF0aWMgaW50IHNuZF9jYXJkX2RvX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQogCQlzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayhjYXJkLCBTTkRfTUlYRVJfT1NTX05PVElGWV9GUkVFKTsKICNlbmRpZgotCWlmIChzbmRfZGV2aWNlX2ZyZWVfYWxsKGNhcmQsIFNORFJWX0RFVl9DTURfUFJFKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGZyZWUgYWxsIGRldmljZXMgKHByZSlcbiIpOwotCQkvKiBGYXRhbCwgYnV0IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciAqLwotCX0KLQlpZiAoc25kX2RldmljZV9mcmVlX2FsbChjYXJkLCBTTkRSVl9ERVZfQ01EX05PUk1BTCkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBmcmVlIGFsbCBkZXZpY2VzIChub3JtYWwpXG4iKTsKLQkJLyogRmF0YWwsIGJ1dCB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KLQl9Ci0JaWYgKHNuZF9kZXZpY2VfZnJlZV9hbGwoY2FyZCwgU05EUlZfREVWX0NNRF9QT1NUKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGZyZWUgYWxsIGRldmljZXMgKHBvc3QpXG4iKTsKLQkJLyogRmF0YWwsIGJ1dCB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KLQl9CisJc25kX2RldmljZV9mcmVlX2FsbChjYXJkKTsKIAlpZiAoY2FyZC0+cHJpdmF0ZV9mcmVlKQogCQljYXJkLT5wcml2YXRlX2ZyZWUoY2FyZCk7CiAJc25kX2luZm9fZnJlZV9lbnRyeShjYXJkLT5wcm9jX2lkKTsKIAlpZiAoc25kX2luZm9fY2FyZF9mcmVlKGNhcmQpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGZyZWUgY2FyZCBpbmZvXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGZyZWUgY2FyZCBpbmZvXG4iKTsKIAkJLyogTm90IGZhdGFsIGVycm9yICovCiAJfQorCWlmIChjYXJkLT5yZWxlYXNlX2NvbXBsZXRpb24pCisJCWNvbXBsZXRlKGNhcmQtPnJlbGVhc2VfY29tcGxldGlvbik7CiAJa2ZyZWUoY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogc25kX2NhcmRfdW5yZWYgLSByZWxlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlcgotICogQGNhcmQ6IHRoZSBjYXJkIGluc3RhbmNlCi0gKgotICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50ZXIuICBXaGVuIGl0IHJlYWNoZXMgdG8gemVybywgd2FrZSB1cAotICogdGhlIHNsZWVwZXIgYW5kIGNhbGwgdGhlIGRlc3RydWN0b3IgaWYgbmVlZGVkLgotICovCi12b2lkIHNuZF9jYXJkX3VucmVmKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FyZC0+cmVmY291bnQpKSB7Ci0JCXdha2VfdXAoJmNhcmQtPnNodXRkb3duX3NsZWVwKTsKLQkJaWYgKGNhcmQtPmZyZWVfb25fbGFzdF9jbG9zZSkKLQkJCXNuZF9jYXJkX2RvX2ZyZWUoY2FyZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChzbmRfY2FyZF91bnJlZik7Ci0KIGludCBzbmRfY2FyZF9mcmVlX3doZW5fY2xvc2VkKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKLQlpbnQgcmV0OwotCi0JYXRvbWljX2luYygmY2FyZC0+cmVmY291bnQpOwotCXJldCA9IHNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7Ci0JaWYgKHJldCkgewotCQlhdG9taWNfZGVjKCZjYXJkLT5yZWZjb3VudCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY2FyZC0+ZnJlZV9vbl9sYXN0X2Nsb3NlID0gMTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FyZC0+cmVmY291bnQpKQotCQlzbmRfY2FyZF9kb19mcmVlKGNhcmQpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9jYXJkX2ZyZWVfd2hlbl9jbG9zZWQpOwotCi1pbnQgc25kX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCi17CiAJaW50IHJldCA9IHNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQotCS8qIHdhaXQsIHVudGlsIGFsbCBkZXZpY2VzIGFyZSByZWFkeSBmb3IgdGhlIGZyZWUgb3BlcmF0aW9uICovCi0Jd2FpdF9ldmVudChjYXJkLT5zaHV0ZG93bl9zbGVlcCwgIWF0b21pY19yZWFkKCZjYXJkLT5yZWZjb3VudCkpOwotCXNuZF9jYXJkX2RvX2ZyZWUoY2FyZCk7CisJcHV0X2RldmljZSgmY2FyZC0+Y2FyZF9kZXYpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9mcmVlX3doZW5fY2xvc2VkKTsKIAoraW50IHNuZF9jYXJkX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBjb21wbGV0aW9uIHJlbGVhc2VkOworCWludCByZXQ7CisKKwlpbml0X2NvbXBsZXRpb24oJnJlbGVhc2VkKTsKKwljYXJkLT5yZWxlYXNlX2NvbXBsZXRpb24gPSAmcmVsZWFzZWQ7CisJcmV0ID0gc25kX2NhcmRfZnJlZV93aGVuX2Nsb3NlZChjYXJkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qIHdhaXQsIHVudGlsIGFsbCBkZXZpY2VzIGFyZSByZWFkeSBmb3IgdGhlIGZyZWUgb3BlcmF0aW9uICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmcmVsZWFzZWQpOworCXJldHVybiAwOworfQogRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9mcmVlKTsKIAogLyogcmV0cmlldmUgdGhlIGxhc3Qgd29yZCBvZiBzaG9ydG5hbWUgb3IgbG9uZ25hbWUgKi8KQEAgLTU5OCw3ICs1ODUsNyBAQAogCQlnb3RvIGFnYWluOwogCX0KIAkvKiBsYXN0IHJlc29ydC4uLiAqLwotCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBzZXQgY2FyZCBpZCAoJXMpXG4iLCBpZCk7CisJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gc2V0IGNhcmQgaWQgKCVzKVxuIiwgaWQpOwogCWlmIChjYXJkLT5wcm9jX3Jvb3QtPm5hbWUpCiAJCXN0cmxjcHkoY2FyZC0+aWQsIGNhcmQtPnByb2Nfcm9vdC0+bmFtZSwgc2l6ZW9mKGNhcmQtPmlkKSk7CiB9CkBAIC02MjYsMTUgKzYxMywxNSBAQAogY2FyZF9pZF9zaG93X2F0dHIoc3RydWN0IGRldmljZSAqZGV2LAogCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGNhcmQgPyBjYXJkLT5pZCA6ICIobnVsbCkiKTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc25kX2NhcmQsIGNhcmRfZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgY2FyZC0+aWQpOwogfQogCiBzdGF0aWMgc3NpemVfdAogY2FyZF9pZF9zdG9yZV9hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpOwogCWNoYXIgYnVmMVtzaXplb2YoY2FyZC0+aWQpXTsKIAlzaXplX3QgY29weSA9IGNvdW50ID4gc2l6ZW9mKGNhcmQtPmlkKSAtIDEgPwogCQkJCQlzaXplb2YoY2FyZC0+aWQpIC0gMSA6IGNvdW50OwpAQCAtNjYwLDE5ICs2NDcsMzIgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjYXJkX2lkX2F0dHJzID0KLQlfX0FUVFIoaWQsIFNfSVJVR08gfCBTX0lXVVNSLCBjYXJkX2lkX3Nob3dfYXR0ciwgY2FyZF9pZF9zdG9yZV9hdHRyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpZCwgU19JUlVHTyB8IFNfSVdVU1IsIGNhcmRfaWRfc2hvd19hdHRyLCBjYXJkX2lkX3N0b3JlX2F0dHIpOwogCiBzdGF0aWMgc3NpemVfdAogY2FyZF9udW1iZXJfc2hvd19hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBjYXJkID8gY2FyZC0+bnVtYmVyIDogLTEpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBjYXJkLT5udW1iZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgY2FyZF9udW1iZXJfYXR0cnMgPQotCV9fQVRUUihudW1iZXIsIFNfSVJVR08sIGNhcmRfbnVtYmVyX3Nob3dfYXR0ciwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobnVtYmVyLCBTX0lSVUdPLCBjYXJkX251bWJlcl9zaG93X2F0dHIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2FyZF9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaWQuYXR0ciwKKwkmZGV2X2F0dHJfbnVtYmVyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY2FyZF9kZXZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMJPSBjYXJkX2Rldl9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjYXJkX2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZjYXJkX2Rldl9hdHRyX2dyb3VwLAorCU5VTEwKK307CiAKIC8qKgogICogIHNuZF9jYXJkX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgdGhlIHNvdW5kY2FyZApAQCAtNjkyLDEyICs2OTIsMTEgQEAKIAlpZiAoc25kX0JVR19PTighY2FyZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFjYXJkLT5jYXJkX2RldikgewotCQljYXJkLT5jYXJkX2RldiA9IGRldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIGNhcmQtPmRldiwKLQkJCQkJICAgICAgIE1LREVWKDAsIDApLCBjYXJkLAotCQkJCQkgICAgICAgImNhcmQlaSIsIGNhcmQtPm51bWJlcik7Ci0JCWlmIChJU19FUlIoY2FyZC0+Y2FyZF9kZXYpKQotCQkJY2FyZC0+Y2FyZF9kZXYgPSBOVUxMOworCWlmICghY2FyZC0+cmVnaXN0ZXJlZCkgeworCQllcnIgPSBkZXZpY2VfYWRkKCZjYXJkLT5jYXJkX2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY2FyZC0+cmVnaXN0ZXJlZCA9IHRydWU7CiAJfQogCiAJaWYgKChlcnIgPSBzbmRfZGV2aWNlX3JlZ2lzdGVyX2FsbChjYXJkKSkgPCAwKQpAQCAtNzIzLDE5ICs3MjIsMTAgQEAKIAlzbmRfY2FyZHNbY2FyZC0+bnVtYmVyXSA9IGNhcmQ7CiAJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJaW5pdF9pbmZvX2Zvcl9jYXJkKGNhcmQpOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQogCQlzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayhjYXJkLCBTTkRfTUlYRVJfT1NTX05PVElGWV9SRUdJU1RFUik7CiAjZW5kaWYKLQlpZiAoY2FyZC0+Y2FyZF9kZXYpIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGNhcmQtPmNhcmRfZGV2LCAmY2FyZF9pZF9hdHRycyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGNhcmQtPmNhcmRfZGV2LCAmY2FyZF9udW1iZXJfYXR0cnMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkwOCw3ICs4OTgsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJbGlzdF9hZGQoJm1maWxlLT5saXN0LCAmY2FyZC0+ZmlsZXNfbGlzdCk7Ci0JYXRvbWljX2luYygmY2FyZC0+cmVmY291bnQpOworCWdldF9kZXZpY2UoJmNhcmQtPmNhcmRfZGV2KTsKIAlzcGluX3VubG9jaygmY2FyZC0+ZmlsZXNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC05NDcsMTEgKzkzNywxMSBAQAogCX0KIAlzcGluX3VubG9jaygmY2FyZC0+ZmlsZXNfbG9jayk7CiAJaWYgKCFmb3VuZCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBTFNBIGNhcmQgZmlsZSByZW1vdmUgcHJvYmxlbSAoJXApXG4iLCBmaWxlKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYXJkIGZpbGUgcmVtb3ZlIHByb2JsZW0gKCVwKVxuIiwgZmlsZSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAlrZnJlZShmb3VuZCk7Ci0Jc25kX2NhcmRfdW5yZWYoY2FyZCk7CisJcHV0X2RldmljZSgmY2FyZC0+Y2FyZF9kZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2lzYWRtYS5jIGIvc291bmQvY29yZS9pc2FkbWEuYwppbmRleCBlMmIzODYxLi4zMWU4NTQ0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2lzYWRtYS5jCisrKyBiL3NvdW5kL2NvcmUvaXNhZG1hLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlyZXN1bHQgPSByZXN1bHQxOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAocmVzdWx0ID4gc2l6ZSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicG9pbnRlciAoMHgleCkgZm9yIERNQSAjJWxkIGlzIGdyZWF0ZXIgdGhhbiB0cmFuc2ZlciBzaXplICgweCV4KVxuIiwgcmVzdWx0LCBkbWEsIHNpemUpOworCQlwcl9lcnIoIkFMU0E6IHBvaW50ZXIgKDB4JXgpIGZvciBETUEgIyVsZCBpcyBncmVhdGVyIHRoYW4gdHJhbnNmZXIgc2l6ZSAoMHgleClcbiIsIHJlc3VsdCwgZG1hLCBzaXplKTsKICNlbmRpZgogCWlmIChyZXN1bHQgPj0gc2l6ZSB8fCByZXN1bHQgPT0gMCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbWFsbG9jLmMgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKaW5kZXggNDU5NWY5My4uMDgyNTA5ZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9tZW1hbGxvYy5jCisrKyBiL3NvdW5kL2NvcmUvbWVtYWxsb2MuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzbmQtbWFsbG9jOiBpbnZhbGlkIGRldmljZSB0eXBlICVkXG4iLCB0eXBlKTsKKwkJcHJfZXJyKCJzbmQtbWFsbG9jOiBpbnZhbGlkIGRldmljZSB0eXBlICVkXG4iLCB0eXBlKTsKIAkJZG1hYi0+YXJlYSA9IE5VTEw7CiAJCWRtYWItPmFkZHIgPSAwOwogCQlyZXR1cm4gLUVOWElPOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzbmQtbWFsbG9jOiBpbnZhbGlkIGRldmljZSB0eXBlICVkXG4iLCBkbWFiLT5kZXYudHlwZSk7CisJCXByX2Vycigic25kLW1hbGxvYzogaW52YWxpZCBkZXZpY2UgdHlwZSAlZFxuIiwgZG1hYi0+ZGV2LnR5cGUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwppbmRleCBlOGExZDE4Li41ZTYzNDlmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwpAQCAtMTE4Nyw3ICsxMTg3LDggQEAKIAkJCWlmIChvc3NfbWl4ZXJfbmFtZXNbY2hdICYmIHN0cmNtcChvc3NfbWl4ZXJfbmFtZXNbY2hdLCBzdHIpID09IDApCiAJCQkJYnJlYWs7CiAJCWlmIChjaCA+PSBTTkRSVl9PU1NfTUFYX01JWEVSUykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXJfb3NzOiBpbnZhbGlkIE9TUyB2b2x1bWUgJyVzJ1xuIiwgc3RyKTsKKwkJCXByX2VycigiQUxTQTogbWl4ZXJfb3NzOiBpbnZhbGlkIE9TUyB2b2x1bWUgJyVzJ1xuIiwKKwkJCSAgICAgICBzdHIpOwogCQkJY29udGludWU7CiAJCX0KIAkJY3B0ciA9IHNuZF9pbmZvX2dldF9zdHIoc3RyLCBjcHRyLCBzaXplb2Yoc3RyKSk7CkBAIC0xMjAxLDcgKzEyMDIsNyBAQAogCQlzbmRfaW5mb19nZXRfc3RyKGlkeHN0ciwgY3B0ciwgc2l6ZW9mKGlkeHN0cikpOwogCQlpZHggPSBzaW1wbGVfc3RydG91bChpZHhzdHIsIE5VTEwsIDEwKTsKIAkJaWYgKGlkeCA+PSAweDQwMDApIHsgLyogdG9vIGJpZyAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXJfb3NzOiBpbnZhbGlkIGluZGV4ICVkXG4iLCBpZHgpOworCQkJcHJfZXJyKCJBTFNBOiBtaXhlcl9vc3M6IGludmFsaWQgaW5kZXggJWRcbiIsIGlkeCk7CiAJCQljb250aW51ZTsKIAkJfQogCQltdXRleF9sb2NrKCZtaXhlci0+cmVnX211dGV4KTsKQEAgLTEyMTIsNyArMTIxMyw3IEBACiAJCQlnb3RvIF9fdW5sb2NrOwogCQl0YmwgPSBrbWFsbG9jKHNpemVvZigqdGJsKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghIHRibCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXJfb3NzOiBubyBtZW1vcnlcbiIpOworCQkJcHJfZXJyKCJBTFNBOiBtaXhlcl9vc3M6IG5vIG1lbW9yeVxuIik7CiAJCQlnb3RvIF9fdW5sb2NrOwogCQl9CiAJCXRibC0+b3NzX2lkID0gY2g7CkBAIC0xMzQzLDIwICsxMzQ0LDE4IEBACiAJc3RydWN0IHNuZF9taXhlcl9vc3MgKm1peGVyOwogCiAJaWYgKGNtZCA9PSBTTkRfTUlYRVJfT1NTX05PVElGWV9SRUdJU1RFUikgewotCQljaGFyIG5hbWVbMTI4XTsKIAkJaW50IGlkeCwgZXJyOwogCiAJCW1peGVyID0ga2NhbGxvYygyLCBzaXplb2YoKm1peGVyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtaXhlciA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCW11dGV4X2luaXQoJm1peGVyLT5yZWdfbXV0ZXgpOwotCQlzcHJpbnRmKG5hbWUsICJtaXhlciVpJWkiLCBjYXJkLT5udW1iZXIsIDApOwogCQlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9NSVhFUiwKIAkJCQkJCSAgIGNhcmQsIDAsCi0JCQkJCQkgICAmc25kX21peGVyX29zc19mX29wcywgY2FyZCwKLQkJCQkJCSAgIG5hbWUpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBPU1MgbWl4ZXIgZGV2aWNlICVpOiVpXG4iLAotCQkJCSAgIGNhcmQtPm51bWJlciwgMCk7CisJCQkJCQkgICAmc25kX21peGVyX29zc19mX29wcywgY2FyZCkpIDwgMCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJInVuYWJsZSB0byByZWdpc3RlciBPU1MgbWl4ZXIgZGV2aWNlICVpOiVpXG4iLAorCQkJCWNhcmQtPm51bWJlciwgMCk7CiAJCQlrZnJlZShtaXhlcik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0xMzY1LDcgKzEzNjQsOCBAQAogCQlpZiAoKmNhcmQtPm1peGVybmFtZSkKIAkJCXN0cmxjcHkobWl4ZXItPm5hbWUsIGNhcmQtPm1peGVybmFtZSwgc2l6ZW9mKG1peGVyLT5uYW1lKSk7CiAJCWVsc2UKLQkJCXN0cmxjcHkobWl4ZXItPm5hbWUsIG5hbWUsIHNpemVvZihtaXhlci0+bmFtZSkpOworCQkJc25wcmludGYobWl4ZXItPm5hbWUsIHNpemVvZihtaXhlci0+bmFtZSksCisJCQkJICJtaXhlciVpIiwgY2FyZC0+bnVtYmVyKTsKICNpZmRlZiBTTkRSVl9PU1NfSU5GT19ERVZfTUlYRVJTCiAJCXNuZF9vc3NfaW5mb19yZWdpc3RlcihTTkRSVl9PU1NfSU5GT19ERVZfTUlYRVJTLAogCQkJCSAgICAgIGNhcmQtPm51bWJlciwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwppbmRleCA0YzFjYzUxLi5hZGE2OWQ3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKKysrIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCkBAIC04NTQsNyArODU0LDcgQEAKIAlwYXJhbXMgPSBrbWFsbG9jKHNpemVvZigqcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CiAJc3BhcmFtcyA9IGttYWxsb2Moc2l6ZW9mKCpzcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzd19wYXJhbXMgfHwgIXBhcmFtcyB8fCAhc3BhcmFtcykgewotCQlzbmRfcHJpbnRkKCJObyBtZW1vcnlcbiIpOworCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAiTm8gbWVtb3J5XG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsdXJlOwogCX0KQEAgLTg3Nyw3ICs4NzcsNyBAQAogCX0KIAllcnIgPSBzbmRfcGNtX2h3X3BhcmFtX21hc2soc3Vic3RyZWFtLCBzcGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fQUNDRVNTLCAmbWFzayk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgiTm8gdXNhYmxlIGFjY2Vzc2VzXG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIk5vIHVzYWJsZSBhY2Nlc3Nlc1xuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZmFpbHVyZTsKIAl9CkBAIC05MDIsNyArOTAyLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoKF9fZm9yY2UgaW50KXNmb3JtYXQgPiAoX19mb3JjZSBpbnQpU05EUlZfUENNX0ZPUk1BVF9MQVNUKSB7Ci0JCQlzbmRfcHJpbnRkKCJDYW5ub3QgZmluZCBhIGZvcm1hdCEhIVxuIik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAiQ2Fubm90IGZpbmQgYSBmb3JtYXQhISFcbiIpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQpAQCAtOTQyLDE0ICs5NDIsMTYgQEAKIAkJaWYgKChlcnIgPSBzbmRfcGNtX3BsdWdfZm9ybWF0X3BsdWdpbnMoc3Vic3RyZWFtLAogCQkJCQkJICAgICAgIHBhcmFtcywgCiAJCQkJCQkgICAgICAgc3BhcmFtcykpIDwgMCkgewotCQkJc25kX3ByaW50ZCgic25kX3BjbV9wbHVnX2Zvcm1hdF9wbHVnaW5zIGZhaWxlZDogJWlcbiIsIGVycik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJCSJzbmRfcGNtX3BsdWdfZm9ybWF0X3BsdWdpbnMgZmFpbGVkOiAlaVxuIiwgZXJyKTsKIAkJCXNuZF9wY21fb3NzX3BsdWdpbl9jbGVhcihzdWJzdHJlYW0pOwogCQkJZ290byBmYWlsdXJlOwogCQl9CiAJCWlmIChydW50aW1lLT5vc3MucGx1Z2luX2ZpcnN0KSB7CiAJCQlzdHJ1Y3Qgc25kX3BjbV9wbHVnaW4gKnBsdWdpbjsKIAkJCWlmICgoZXJyID0gc25kX3BjbV9wbHVnaW5fYnVpbGRfaW8oc3Vic3RyZWFtLCBzcGFyYW1zLCAmcGx1Z2luKSkgPCAwKSB7Ci0JCQkJc25kX3ByaW50ZCgic25kX3BjbV9wbHVnaW5fYnVpbGRfaW8gZmFpbGVkOiAlaVxuIiwgZXJyKTsKKwkJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJCQkic25kX3BjbV9wbHVnaW5fYnVpbGRfaW8gZmFpbGVkOiAlaVxuIiwgZXJyKTsKIAkJCQlzbmRfcGNtX29zc19wbHVnaW5fY2xlYXIoc3Vic3RyZWFtKTsKIAkJCQlnb3RvIGZhaWx1cmU7CiAJCQl9CkBAIC05ODMsNyArOTg1LDcgQEAKIAlzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9EUk9QLCBOVUxMKTsKIAogCWlmICgoZXJyID0gc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfSFdfUEFSQU1TLCBzcGFyYW1zKSkgPCAwKSB7Ci0JCXNuZF9wcmludGQoIkhXX1BBUkFNUyBmYWlsZWQ6ICVpXG4iLCBlcnIpOworCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAiSFdfUEFSQU1TIGZhaWxlZDogJWlcbiIsIGVycik7CiAJCWdvdG8gZmFpbHVyZTsKIAl9CiAKQEAgLTEwMTYsNyArMTAxOCw3IEBACiAJfQogCiAJaWYgKChlcnIgPSBzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9TV19QQVJBTVMsIHN3X3BhcmFtcykpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJTV19QQVJBTVMgZmFpbGVkOiAlaVxuIiwgZXJyKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIlNXX1BBUkFNUyBmYWlsZWQ6ICVpXG4iLCBlcnIpOwogCQlnb3RvIGZhaWx1cmU7CiAJfQogCkBAIC0xMTEwLDcgKzExMTIsOCBAQAogCiAJZXJyID0gc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfUFJFUEFSRSwgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgic25kX3BjbV9vc3NfcHJlcGFyZTogU05EUlZfUENNX0lPQ1RMX1BSRVBBUkUgZmFpbGVkXG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCSJzbmRfcGNtX29zc19wcmVwYXJlOiBTTkRSVl9QQ01fSU9DVExfUFJFUEFSRSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlydW50aW1lLT5vc3MucHJlcGFyZSA9IDA7CkBAIC0xMTc1LDEyICsxMTc4LDEwIEBACiAJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CiAJCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZTogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFhSVU5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZTogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogd3JpdGU6IHJlY292ZXJpbmcgZnJvbSAlc1xuIiwKKwkJCQlydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOID8KKwkJCQkiWFJVTiIgOiAiU1VTUEVORCIpOwogI2VuZGlmCiAJCQlyZXQgPSBzbmRfcGNtX29zc19wcmVwYXJlKHN1YnN0cmVhbSk7CiAJCQlpZiAocmV0IDwgMCkKQEAgLTEyMTMsMTIgKzEyMTQsMTAgQEAKIAkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gfHwKIAkJICAgIHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRCkgewogI2lmZGVmIE9TU19ERUJVRwotCQkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4pCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHJlYWQ6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBYUlVOXG4iKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogcmVhZDogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogcmVhZDogcmVjb3ZlcmluZyBmcm9tICVzXG4iLAorCQkJCXJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gPworCQkJCSJYUlVOIiA6ICJTVVNQRU5EIik7CiAjZW5kaWYKIAkJCXJldCA9IHNuZF9wY21fa2VybmVsX2lvY3RsKHN1YnN0cmVhbSwgU05EUlZfUENNX0lPQ1RMX0RSQUlOLCBOVUxMKTsKIAkJCWlmIChyZXQgPCAwKQpAQCAtMTI2MSwxMiArMTI2MCwxMCBAQAogCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiB8fAogCQkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEKSB7CiAjaWZkZWYgT1NTX0RFQlVHCi0JCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTikKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogd3JpdGV2OiAiCi0JCQkJICAgICAgICJyZWNvdmVyaW5nIGZyb20gWFJVTlxuIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHdyaXRldjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogd3JpdGV2OiByZWNvdmVyaW5nIGZyb20gJXNcbiIsCisJCQkJcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiA/CisJCQkJIlhSVU4iIDogIlNVU1BFTkQiKTsKICNlbmRpZgogCQkJcmV0ID0gc25kX3BjbV9vc3NfcHJlcGFyZShzdWJzdHJlYW0pOwogCQkJaWYgKHJldCA8IDApCkBAIC0xMjk5LDEyICsxMjk2LDEwIEBACiAJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CiAJCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkdjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFhSVU5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkdjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFNVU1BFTkRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkicGNtX29zczogcmVhZHY6IHJlY292ZXJpbmcgZnJvbSAlc1xuIiwKKwkJCQlydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOID8KKwkJCQkiWFJVTiIgOiAiU1VTUEVORCIpOwogI2VuZGlmCiAJCQlyZXQgPSBzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9EUkFJTiwgTlVMTCk7CiAJCQlpZiAocmV0IDwgMCkKQEAgLTE1NjEsNyArMTU1Niw3IEBACiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKCZydW50aW1lLT5zbGVlcCwgJndhaXQpOwogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJzeW5jMTogc2l6ZSA9ICVsaVxuIiwgc2l6ZSk7CisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInN5bmMxOiBzaXplID0gJWxpXG4iLCBzaXplKTsKICNlbmRpZgogCXdoaWxlICgxKSB7CiAJCXJlc3VsdCA9IHNuZF9wY21fb3NzX3dyaXRlMihzdWJzdHJlYW0sIHJ1bnRpbWUtPm9zcy5idWZmZXIsIHNpemUsIDEpOwpAQCAtMTU4Nyw3ICsxNTgyLDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChyZXMgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiT1NTIHN5bmMgZXJyb3IgLSBETUEgdGltZW91dFxuIik7CisJCQlwY21fZXJyKHN1YnN0cmVhbS0+cGNtLAorCQkJCSJPU1Mgc3luYyBlcnJvciAtIERNQSB0aW1lb3V0XG4iKTsKIAkJCXJlc3VsdCA9IC1FSU87CiAJCQlicmVhazsKIAkJfQpAQCAtMTYxOCw3ICsxNjE0LDcgQEAKIAkJbXV0ZXhfbG9jaygmcnVudGltZS0+b3NzLnBhcmFtc19sb2NrKTsKIAkJaWYgKHJ1bnRpbWUtPm9zcy5idWZmZXJfdXNlZCA+IDApIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJzeW5jOiBidWZmZXJfdXNlZFxuIik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAic3luYzogYnVmZmVyX3VzZWRcbiIpOwogI2VuZGlmCiAJCQlzaXplID0gKDggKiAocnVudGltZS0+b3NzLnBlcmlvZF9ieXRlcyAtIHJ1bnRpbWUtPm9zcy5idWZmZXJfdXNlZCkgKyA3KSAvIHdpZHRoOwogCQkJc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UoZm9ybWF0LApAQCAtMTYzMSw3ICsxNjI3LDcgQEAKIAkJCX0KIAkJfSBlbHNlIGlmIChydW50aW1lLT5vc3MucGVyaW9kX3B0ciA+IDApIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJzeW5jOiBwZXJpb2RfcHRyXG4iKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sICJzeW5jOiBwZXJpb2RfcHRyXG4iKTsKICNlbmRpZgogCQkJc2l6ZSA9IHJ1bnRpbWUtPm9zcy5wZXJpb2RfYnl0ZXMgLSBydW50aW1lLT5vc3MucGVyaW9kX3B0cjsKIAkJCXNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKGZvcm1hdCwKQEAgLTE5ODMsNyArMTk3OSw3IEBACiAJaW50IGVyciwgY21kOwogCiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHRyaWdnZXIgPSAweCV4XG4iLCB0cmlnZ2VyKTsKKwlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAicGNtX29zczogdHJpZ2dlciA9IDB4JXhcbiIsIHRyaWdnZXIpOwogI2VuZGlmCiAJCiAJcHN1YnN0cmVhbSA9IHBjbV9vc3NfZmlsZS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKQEAgLTIyMDMsOSArMjE5OSw5IEBACiAJfQogCiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHNwYWNlOiBieXRlcyA9ICVpLCBmcmFnbWVudHMgPSAlaSwgIgotCSAgICAgICAiZnJhZ3N0b3RhbCA9ICVpLCBmcmFnc2l6ZSA9ICVpXG4iLAotCSAgICAgICBpbmZvLmJ5dGVzLCBpbmZvLmZyYWdtZW50cywgaW5mby5mcmFnc3RvdGFsLCBpbmZvLmZyYWdzaXplKTsKKwlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkicGNtX29zczogc3BhY2U6IGJ5dGVzID0gJWksIGZyYWdtZW50cyA9ICVpLCBmcmFnc3RvdGFsID0gJWksIGZyYWdzaXplID0gJWlcbiIsCisJCWluZm8uYnl0ZXMsIGluZm8uZnJhZ21lbnRzLCBpbmZvLmZyYWdzdG90YWwsIGluZm8uZnJhZ3NpemUpOwogI2VuZGlmCiAJaWYgKGNvcHlfdG9fdXNlcihfaW5mbywgJmluZm8sIHNpemVvZihpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMjIxNSw3ICsyMjExLDcgQEAKIHN0YXRpYyBpbnQgc25kX3BjbV9vc3NfZ2V0X21hcGJ1ZihzdHJ1Y3Qgc25kX3BjbV9vc3NfZmlsZSAqcGNtX29zc19maWxlLCBpbnQgc3RyZWFtLCBzdHJ1Y3QgYnVmZm1lbV9kZXNjIF9fdXNlciAqIF9pbmZvKQogewogCS8vIGl0IHdvbid0IGJlIHByb2JhYmx5IGltcGxlbWVudGVkCi0JLy8gc25kX3ByaW50ZCgiVE9ETzogc25kX3BjbV9vc3NfZ2V0X21hcGJ1ZlxuIik7CisJLy8gcHJfZGVidWcoIlRPRE86IHNuZF9wY21fb3NzX2dldF9tYXBidWZcbiIpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0yNTE5LDcgKzI1MTUsNyBAQAogCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdQJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IGlvY3RsID0gMHgleFxuIiwgY21kKTsKKwlwcl9kZWJ1ZygicGNtX29zczogaW9jdGwgPSAweCV4XG4iLCBjbWQpOwogI2VuZGlmCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORENUTF9EU1BfUkVTRVQ6CkBAIC0yNjQ2LDcgKzI2NDIsNyBAQAogCWNhc2UgU05EQ1RMX0RTUF9QUk9GSUxFOgogCQlyZXR1cm4gMDsJLyogc2lsZW50bHkgaWdub3JlICovCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZCgicGNtX29zczogdW5rbm93biBjb21tYW5kID0gMHgleFxuIiwgY21kKTsKKwkJcHJfZGVidWcoInBjbV9vc3M6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7CiAJfQogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtMjY3Myw4ICsyNjY5LDkgQEAKICNlbHNlCiAJewogCQlzc2l6ZV90IHJlcyA9IHNuZF9wY21fb3NzX3JlYWQxKHN1YnN0cmVhbSwgYnVmLCBjb3VudCk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkICVsaSBieXRlcyAiCi0JCSAgICAgICAiKHJldHVybmVkICVsaSBieXRlcylcbiIsIChsb25nKWNvdW50LCAobG9uZylyZXMpOworCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJInBjbV9vc3M6IHJlYWQgJWxpIGJ5dGVzIChyZXR1cm5lZCAlbGkgYnl0ZXMpXG4iLAorCQkJKGxvbmcpY291bnQsIChsb25nKXJlcyk7CiAJCXJldHVybiByZXM7CiAJfQogI2VuZGlmCkBAIC0yNjkzLDcgKzI2OTAsNyBAQAogCXN1YnN0cmVhbS0+Zl9mbGFncyA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOwogCXJlc3VsdCA9IHNuZF9wY21fb3NzX3dyaXRlMShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpOwogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZSAlbGkgYnl0ZXMgKHdyb3RlICVsaSBieXRlcylcbiIsCisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInBjbV9vc3M6IHdyaXRlICVsaSBieXRlcyAod3JvdGUgJWxpIGJ5dGVzKVxuIiwKIAkgICAgICAgKGxvbmcpY291bnQsIChsb25nKXJlc3VsdCk7CiAjZW5kaWYKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjc3Miw3ICsyNzY5LDcgQEAKIAlpbnQgZXJyOwogCiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IG1tYXAgYmVnaW5cbiIpOworCXByX2RlYnVnKCJwY21fb3NzOiBtbWFwIGJlZ2luXG4iKTsKICNlbmRpZgogCXBjbV9vc3NfZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzd2l0Y2ggKChhcmVhLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fV1JJVEUpKSkgewpAQCAtMjgyMiw3ICsyODE5LDcgQEAKIAlydW50aW1lLT5zaWxlbmNlX3RocmVzaG9sZCA9IDA7CiAJcnVudGltZS0+c2lsZW5jZV9zaXplID0gMDsKICNpZmRlZiBPU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogbW1hcCBvaywgYnl0ZXMgPSAweCV4XG4iLAorCXByX2RlYnVnKCJwY21fb3NzOiBtbWFwIG9rLCBieXRlcyA9IDB4JXhcbiIsCiAJICAgICAgIHJ1bnRpbWUtPm9zcy5tbWFwX2J5dGVzKTsKICNlbmRpZgogCS8qIEluIG1tYXAgbW9kZSB3ZSBuZXZlciBzdG9wICovCkBAIC0zMDA3LDEyICszMDA0LDEwIEBACiAKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX29zc19kc3Aoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IGluZGV4KQogewotCWNoYXIgbmFtZVsxMjhdOwotCXNwcmludGYobmFtZSwgImRzcCVpJWkiLCBwY20tPmNhcmQtPm51bWJlciwgcGNtLT5kZXZpY2UpOwogCWlmIChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfUENNLAogCQkJCSAgICBwY20tPmNhcmQsIGluZGV4LCAmc25kX3BjbV9vc3NfZl9yZWcsCi0JCQkJICAgIHBjbSwgbmFtZSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBPU1MgUENNIGRldmljZSAlaTolaVxuIiwKKwkJCQkgICAgcGNtKSA8IDApIHsKKwkJcGNtX2VycihwY20sICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIFBDTSBkZXZpY2UgJWk6JWlcbiIsCiAJCQkgICBwY20tPmNhcmQtPm51bWJlciwgcGNtLT5kZXZpY2UpOwogCX0KIH0KQEAgLTMwOTMsMTIgKzMwODgsMTIgQEAKIAkvKiBjaGVjayBkZXZpY2UgbWFwIHRhYmxlICovCiAJZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKIAkJaWYgKGRzcF9tYXBbaV0gPCAwIHx8IGRzcF9tYXBbaV0gPj0gU05EUlZfUENNX0RFVklDRVMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgZHNwX21hcFslZF0gPSAlZFxuIiwKKwkJCXByX2VycigiQUxTQTogcGNtX29zczogaW52YWxpZCBkc3BfbWFwWyVkXSA9ICVkXG4iLAogCQkJCSAgIGksIGRzcF9tYXBbaV0pOwogCQkJZHNwX21hcFtpXSA9IDA7CiAJCX0KIAkJaWYgKGFkc3BfbWFwW2ldIDwgMCB8fCBhZHNwX21hcFtpXSA+PSBTTkRSVl9QQ01fREVWSUNFUykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBhZHNwX21hcFslZF0gPSAlZFxuIiwKKwkJCXByX2VycigiQUxTQTogcGNtX29zczogaW52YWxpZCBhZHNwX21hcFslZF0gPSAlZFxuIiwKIAkJCQkgICBpLCBhZHNwX21hcFtpXSk7CiAJCQlhZHNwX21hcFtpXSA9IDE7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtLmMgYi9zb3VuZC9jb3JlL3BjbS5jCmluZGV4IGUxZTllMGMuLjQzOTMyZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtLmMKKysrIGIvc291bmQvY29yZS9wY20uYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJcmV0dXJuIHNuZF9wY21fc3RhdGVfbmFtZXNbKF9fZm9yY2UgaW50KXN0YXRlXTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1BDTV9PU1MpCiAjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbmRfcGNtX29zc19mb3JtYXRfbmFtZShpbnQgZm9ybWF0KQpAQCAtMzM4LDcgKzMzOCw4IEBACiAKIAlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBpbmZvKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJzbmRfcGNtX3Byb2NfaW5mb19yZWFkOiBjYW5ub3QgbWFsbG9jXG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCSJzbmRfcGNtX3Byb2NfaW5mb19yZWFkOiBjYW5ub3QgbWFsbG9jXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzk4LDcgKzM5OSw3IEBACiAJc25kX2lwcmludGYoYnVmZmVyLCAicmF0ZTogJXUgKCV1LyV1KVxuIiwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+cmF0ZV9udW0sIHJ1bnRpbWUtPnJhdGVfZGVuKTsJCiAJc25kX2lwcmludGYoYnVmZmVyLCAicGVyaW9kX3NpemU6ICVsdVxuIiwgcnVudGltZS0+cGVyaW9kX3NpemUpOwkKIAlzbmRfaXByaW50ZihidWZmZXIsICJidWZmZXJfc2l6ZTogJWx1XG4iLCBydW50aW1lLT5idWZmZXJfc2l6ZSk7CQotI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1BDTV9PU1MpCiAJaWYgKHN1YnN0cmVhbS0+b3NzLm9zcykgewogCQlzbmRfaXByaW50ZihidWZmZXIsICJPU1MgZm9ybWF0OiAlc1xuIiwgc25kX3BjbV9vc3NfZm9ybWF0X25hbWUocnVudGltZS0+b3NzLmZvcm1hdCkpOwogCQlzbmRfaXByaW50ZihidWZmZXIsICJPU1MgY2hhbm5lbHM6ICV1XG4iLCBydW50aW1lLT5vc3MuY2hhbm5lbHMpOwkKQEAgLTY1MSw3ICs2NTIsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9ICZwY20tPnN0cmVhbXNbc3RyZWFtXTsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgKnByZXY7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCW11dGV4X2luaXQoJnBzdHItPm9zcy5zZXR1cF9tdXRleCk7CiAjZW5kaWYKIAlwc3RyLT5zdHJlYW0gPSBzdHJlYW07CkBAIC02NjAsNyArNjYxLDcgQEAKIAlpZiAoc3Vic3RyZWFtX2NvdW50ID4gMCAmJiAhcGNtLT5pbnRlcm5hbCkgewogCQllcnIgPSBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXQocHN0cik7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXRcbiIpOworCQkJcGNtX2VycihwY20sICJFcnJvciBpbiBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXRcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTY2OCw3ICs2NjksNyBAQAogCWZvciAoaWR4ID0gMCwgcHJldiA9IE5VTEw7IGlkeCA8IHN1YnN0cmVhbV9jb3VudDsgaWR4KyspIHsKIAkJc3Vic3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN1YnN0cmVhbSksIEdGUF9LRVJORUwpOwogCQlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbm5vdCBhbGxvY2F0ZSBQQ00gc3Vic3RyZWFtXG4iKTsKKwkJCXBjbV9lcnIocGNtLCAiQ2Fubm90IGFsbG9jYXRlIFBDTSBzdWJzdHJlYW1cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJc3Vic3RyZWFtLT5wY20gPSBwY207CkBAIC02ODUsNyArNjg2LDggQEAKIAkJaWYgKCFwY20tPmludGVybmFsKSB7CiAJCQllcnIgPSBzbmRfcGNtX3N1YnN0cmVhbV9wcm9jX2luaXQoc3Vic3RyZWFtKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gc25kX3BjbV9zdHJlYW1fcHJvY19pbml0XG4iKTsKKwkJCQlwY21fZXJyKHBjbSwKKwkJCQkJIkVycm9yIGluIHNuZF9wY21fc3RyZWFtX3Byb2NfaW5pdFxuIik7CiAJCQkJaWYgKHByZXYgPT0gTlVMTCkKIAkJCQkJcHN0ci0+c3Vic3RyZWFtID0gTlVMTDsKIAkJCQllbHNlCkBAIC03MjQsNyArNzI2LDcgQEAKIAkJKnJwY20gPSBOVUxMOwogCXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCpwY20pLCBHRlBfS0VSTkVMKTsKIAlpZiAocGNtID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIFBDTVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIFBDTVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwY20tPmNhcmQgPSBjYXJkOwpAQCAtODA3LDcgKzgwOSw3IEBACiBzdGF0aWMgdm9pZCBzbmRfcGNtX2ZyZWVfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N0ciAqIHBzdHIpCiB7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sICpzdWJzdHJlYW1fbmV4dDsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCXN0cnVjdCBzbmRfcGNtX29zc19zZXR1cCAqc2V0dXAsICpzZXR1cG47CiAjZW5kaWYKIAlzdWJzdHJlYW0gPSBwc3RyLT5zdWJzdHJlYW07CkBAIC04MTksNyArODIxLDcgQEAKIAkJc3Vic3RyZWFtID0gc3Vic3RyZWFtX25leHQ7CiAJfQogCXNuZF9wY21fc3RyZWFtX3Byb2NfZG9uZShwc3RyKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCWZvciAoc2V0dXAgPSBwc3RyLT5vc3Muc2V0dXBfbGlzdDsgc2V0dXA7IHNldHVwID0gc2V0dXBuKSB7CiAJCXNldHVwbiA9IHNldHVwLT5uZXh0OwogCQlrZnJlZShzZXR1cC0+dGFza19uYW1lKTsKQEAgLTEwMTYsOCArMTAxOCwyMCBAQAogICAgICAgICByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgc3RyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjbV9hdHRycyA9Ci0JX19BVFRSKHBjbV9jbGFzcywgU19JUlVHTywgc2hvd19wY21fY2xhc3MsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHBjbV9jbGFzcywgU19JUlVHTywgc2hvd19wY21fY2xhc3MsIE5VTEwpOworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBjbV9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGNtX2NsYXNzLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGNtX2Rldl9hdHRyX2dyb3VwID0geworCS5hdHRycwk9IHBjbV9kZXZfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqcGNtX2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZwY21fZGV2X2F0dHJfZ3JvdXAsCisJTlVMTAorfTsKIAogc3RhdGljIGludCBzbmRfcGNtX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewpAQCAtMTA2Nyw4ICsxMDgxLDE4IEBACiAJCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShkZXZ0eXBlLCBwY20tPmNhcmQsIHBjbS0+ZGV2aWNlLAotCQkJCQkgICZwY21fYXR0cnMpOworCisJCWRldiA9IHNuZF9nZXRfZGV2aWNlKGRldnR5cGUsIHBjbS0+Y2FyZCwgcGNtLT5kZXZpY2UpOworCQlpZiAoZGV2KSB7CisJCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXBzKCZkZXYtPmtvYmosCisJCQkJCQkgIHBjbV9kZXZfYXR0cl9ncm91cHMpOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2X3dhcm4oZGV2LAorCQkJCQkgInBjbSAlZDolZDogY2Fubm90IGNyZWF0ZSBzeXNmcyBncm91cHNcbiIsCisJCQkJCSBwY20tPmNhcmQtPm51bWJlciwgcGNtLT5kZXZpY2UpOworCQkJcHV0X2RldmljZShkZXYpOworCQl9CisKIAkJZm9yIChzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbY2lkeF0uc3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkKIAkJCXNuZF9wY21fdGltZXJfaW5pdChzdWJzdHJlYW0pOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jIGIvc291bmQvY29yZS9wY21fbGliLmMKaW5kZXggYTIxMDQ2Ny4uY2U4M2RlZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWlmICh4cnVuX2RlYnVnKHN1YnN0cmVhbSwgWFJVTl9ERUJVR19CQVNJQykpIHsKIAkJY2hhciBuYW1lWzE2XTsKIAkJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKLQkJc25kX3ByaW50ZChLRVJOX0RFQlVHICJYUlVOOiAlc1xuIiwgbmFtZSk7CisJCXBjbV93YXJuKHN1YnN0cmVhbS0+cGNtLCAiWFJVTjogJXNcbiIsIG5hbWUpOwogCQlkdW1wX3N0YWNrX29uX3hydW4oc3Vic3RyZWFtKTsKIAl9CiB9CkBAIC0xODQsOSArMTg0LDcgQEAKIAlkbyB7CQkJCQkJCQlcCiAJCWlmICh4cnVuX2RlYnVnKHN1YnN0cmVhbSwgWFJVTl9ERUJVR19CQVNJQykpIHsJCVwKIAkJCXhydW5fbG9nX3Nob3coc3Vic3RyZWFtKTsJCQlcCi0JCQlpZiAoc25kX3ByaW50ZF9yYXRlbGltaXQoKSkgewkJCVwKLQkJCQlzbmRfcHJpbnRkKCJQQ006ICIgZm10LCAjI2FyZ3MpOwlcCi0JCQl9CQkJCQkJXAorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJBTFNBOiBQQ006ICIgZm10LCAjI2FyZ3MpOwlcCiAJCQlkdW1wX3N0YWNrX29uX3hydW4oc3Vic3RyZWFtKTsJCQlcCiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC0yNTMsNyArMjUxLDcgQEAKIAkJZW50cnkgPSAmbG9nLT5lbnRyaWVzW2lkeF07CiAJCWlmIChlbnRyeS0+cGVyaW9kX3NpemUgPT0gMCkKIAkJCWJyZWFrOwotCQlzbmRfcHJpbnRkKCJod3B0ciBsb2c6ICVzOiAlc2o9JWx1LCBwb3M9JWxkLyVsZC8lbGQsICIKKwkJcHJfaW5mbygiaHdwdHIgbG9nOiAlczogJXNqPSVsdSwgcG9zPSVsZC8lbGQvJWxkLCAiCiAJCQkgICAiaHdwdHI9JWxkLyVsZFxuIiwKIAkJCSAgIG5hbWUsIGVudHJ5LT5pbl9pbnRlcnJ1cHQgPyAiW1FdICIgOiAiIiwKIAkJCSAgIGVudHJ5LT5qaWZmaWVzLApAQCAtMzQyLDE0ICszNDAsMTQgQEAKIAkJcmV0dXJuIC1FUElQRTsKIAl9CiAJaWYgKHBvcyA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkgewotCQlpZiAoc25kX3ByaW50ZF9yYXRlbGltaXQoKSkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCQljaGFyIG5hbWVbMTZdOwogCQkJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKIAkJCXhydW5fbG9nX3Nob3coc3Vic3RyZWFtKTsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgICJCVUc6ICVzLCBwb3MgPSAlbGQsICIKLQkJCQkgICAiYnVmZmVyIHNpemUgPSAlbGQsIHBlcmlvZCBzaXplID0gJWxkXG4iLAotCQkJCSAgIG5hbWUsIHBvcywgcnVudGltZS0+YnVmZmVyX3NpemUsCi0JCQkJICAgcnVudGltZS0+cGVyaW9kX3NpemUpOworCQkJcGNtX2VycihzdWJzdHJlYW0tPnBjbSwKKwkJCQkiQlVHOiAlcywgcG9zID0gJWxkLCBidWZmZXIgc2l6ZSA9ICVsZCwgcGVyaW9kIHNpemUgPSAlbGRcbiIsCisJCQkJbmFtZSwgcG9zLCBydW50aW1lLT5idWZmZXJfc2l6ZSwKKwkJCQlydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCX0KIAkJcG9zID0gMDsKIAl9CkBAIC0zOTQsOCArMzkyLDggQEAKIAkJCVhSVU5fREVCVUdfUEVSSU9EVVBEQVRFIDogWFJVTl9ERUJVR19IV1BUUlVQREFURSkpIHsKIAkJY2hhciBuYW1lWzE2XTsKIAkJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKLQkJc25kX3ByaW50ZCgiJXNfdXBkYXRlOiAlczogcG9zPSV1LyV1LyV1LCAiCi0JCQkgICAiaHdwdHI9JWxkLyVsZC8lbGQvJWxkXG4iLAorCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJIiVzX3VwZGF0ZTogJXM6IHBvcz0ldS8ldS8ldSwgaHdwdHI9JWxkLyVsZC8lbGQvJWxkXG4iLAogCQkJICAgaW5faW50ZXJydXB0ID8gInBlcmlvZCIgOiAiaHdwdHIiLAogCQkJICAgbmFtZSwKIAkJCSAgICh1bnNpZ25lZCBpbnQpcG9zLApAQCAtMTI0Miw2ICsxMjQwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9tYXNrNjQpOwogCiAvKioKICAqIHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIC0gYXBwbHkgYW4gaW50ZWdlciBjb25zdHJhaW50IHRvIGFuIGludGVydmFsCkBAIC0xOTQxLDggKzE5NDAsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCF0b3V0KSB7Ci0JCQlzbmRfcHJpbnRkKCIlcyB3cml0ZSBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPylcbiIsCi0JCQkJICAgaXNfcGxheWJhY2sgPyAicGxheWJhY2siIDogImNhcHR1cmUiKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkJIiVzIHdyaXRlIGVycm9yIChETUEgb3IgSVJRIHRyb3VibGU/KVxuIiwKKwkJCQlpc19wbGF5YmFjayA/ICJwbGF5YmFjayIgOiAiY2FwdHVyZSIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IDAxYTVlMDUuLmI2NTNhYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC0xOTAsMTIgKzE5MCwxMiBAQAogCQlpZiAoIShwYXJhbXMtPnJtYXNrICYgKDEgPDwgaykpKQogCQkJY29udGludWU7CiAjaWZkZWYgUlVMRVNfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1trXSk7Ci0JCXByaW50aygiJTA0eCUwNHglMDR4JTA0eCAtPiAiLCBtLT5iaXRzWzNdLCBtLT5iaXRzWzJdLCBtLT5iaXRzWzFdLCBtLT5iaXRzWzBdKTsKKwkJcHJfZGVidWcoIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1trXSk7CisJCXByX2NvbnQoIiUwNHglMDR4JTA0eCUwNHggLT4gIiwgbS0+Yml0c1szXSwgbS0+Yml0c1syXSwgbS0+Yml0c1sxXSwgbS0+Yml0c1swXSk7CiAjZW5kaWYKIAkJY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZShtLCBjb25zdHJzX21hc2soY29uc3RycywgaykpOwogI2lmZGVmIFJVTEVTX0RFQlVHCi0JCXByaW50aygiJTA0eCUwNHglMDR4JTA0eFxuIiwgbS0+Yml0c1szXSwgbS0+Yml0c1syXSwgbS0+Yml0c1sxXSwgbS0+Yml0c1swXSk7CisJCXByX2NvbnQoIiUwNHglMDR4JTA0eCUwNHhcbiIsIG0tPmJpdHNbM10sIG0tPmJpdHNbMl0sIG0tPmJpdHNbMV0sIG0tPmJpdHNbMF0pOwogI2VuZGlmCiAJCWlmIChjaGFuZ2VkKQogCQkJcGFyYW1zLT5jbWFzayB8PSAxIDw8IGs7CkBAIC0yMTAsMjEgKzIxMCwyMSBAQAogCQlpZiAoIShwYXJhbXMtPnJtYXNrICYgKDEgPDwgaykpKQogCQkJY29udGludWU7CiAjaWZkZWYgUlVMRVNfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1trXSk7CisJCXByX2RlYnVnKCIlcyA9ICIsIHNuZF9wY21faHdfcGFyYW1fbmFtZXNba10pOwogCQlpZiAoaS0+ZW1wdHkpCi0JCQlwcmludGsoImVtcHR5Iik7CisJCQlwcl9jb250KCJlbXB0eSIpOwogCQllbHNlCi0JCQlwcmludGsoIiVjJXUgJXUlYyIsIAorCQkJcHJfY29udCgiJWMldSAldSVjIiwKIAkJCSAgICAgICBpLT5vcGVubWluID8gJygnIDogJ1snLCBpLT5taW4sCiAJCQkgICAgICAgaS0+bWF4LCBpLT5vcGVubWF4ID8gJyknIDogJ10nKTsKLQkJcHJpbnRrKCIgLT4gIik7CisJCXByX2NvbnQoIiAtPiAiKTsKICNlbmRpZgogCQljaGFuZ2VkID0gc25kX2ludGVydmFsX3JlZmluZShpLCBjb25zdHJzX2ludGVydmFsKGNvbnN0cnMsIGspKTsKICNpZmRlZiBSVUxFU19ERUJVRwogCQlpZiAoaS0+ZW1wdHkpCi0JCQlwcmludGsoImVtcHR5XG4iKTsKKwkJCXByX2NvbnQoImVtcHR5XG4iKTsKIAkJZWxzZSAKLQkJCXByaW50aygiJWMldSAldSVjXG4iLCAKKwkJCXByX2NvbnQoIiVjJXUgJXUlY1xuIiwKIAkJCSAgICAgICBpLT5vcGVubWluID8gJygnIDogJ1snLCBpLT5taW4sCiAJCQkgICAgICAgaS0+bWF4LCBpLT5vcGVubWF4ID8gJyknIDogJ10nKTsKICNlbmRpZgpAQCAtMjU1LDE4ICsyNTUsMTggQEAKIAkJCWlmICghZG9pdCkKIAkJCQljb250aW51ZTsKICNpZmRlZiBSVUxFU19ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJ1bGUgJWQgWyVwXTogIiwgaywgci0+ZnVuYyk7CisJCQlwcl9kZWJ1ZygiUnVsZSAlZCBbJXBdOiAiLCBrLCByLT5mdW5jKTsKIAkJCWlmIChyLT52YXIgPj0gMCkgewotCQkJCXByaW50aygiJXMgPSAiLCBzbmRfcGNtX2h3X3BhcmFtX25hbWVzW3ItPnZhcl0pOworCQkJCXByX2NvbnQoIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1tyLT52YXJdKTsKIAkJCQlpZiAoaHdfaXNfbWFzayhyLT52YXIpKSB7CiAJCQkJCW0gPSBod19wYXJhbV9tYXNrKHBhcmFtcywgci0+dmFyKTsKLQkJCQkJcHJpbnRrKCIleCIsICptLT5iaXRzKTsKKwkJCQkJcHJfY29udCgiJXgiLCAqbS0+Yml0cyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgci0+dmFyKTsKIAkJCQkJaWYgKGktPmVtcHR5KQotCQkJCQkJcHJpbnRrKCJlbXB0eSIpOworCQkJCQkJcHJfY29udCgiZW1wdHkiKTsKIAkJCQkJZWxzZQotCQkJCQkJcHJpbnRrKCIlYyV1ICV1JWMiLCAKKwkJCQkJCXByX2NvbnQoIiVjJXUgJXUlYyIsCiAJCQkJCQkgICAgICAgaS0+b3Blbm1pbiA/ICcoJyA6ICdbJywgaS0+bWluLAogCQkJCQkJICAgICAgIGktPm1heCwgaS0+b3Blbm1heCA/ICcpJyA6ICddJyk7CiAJCQkJfQpAQCAtMjc1LDE5ICsyNzUsMTkgQEAKIAkJCWNoYW5nZWQgPSByLT5mdW5jKHBhcmFtcywgcik7CiAjaWZkZWYgUlVMRVNfREVCVUcKIAkJCWlmIChyLT52YXIgPj0gMCkgewotCQkJCXByaW50aygiIC0+ICIpOworCQkJCXByX2NvbnQoIiAtPiAiKTsKIAkJCQlpZiAoaHdfaXNfbWFzayhyLT52YXIpKQotCQkJCQlwcmludGsoIiV4IiwgKm0tPmJpdHMpOworCQkJCQlwcl9jb250KCIleCIsICptLT5iaXRzKTsKIAkJCQllbHNlIHsKIAkJCQkJaWYgKGktPmVtcHR5KQotCQkJCQkJcHJpbnRrKCJlbXB0eSIpOworCQkJCQkJcHJfY29udCgiZW1wdHkiKTsKIAkJCQkJZWxzZQotCQkJCQkJcHJpbnRrKCIlYyV1ICV1JWMiLCAKKwkJCQkJCXByX2NvbnQoIiVjJXUgJXUlYyIsCiAJCQkJCQkgICAgICAgaS0+b3Blbm1pbiA/ICcoJyA6ICdbJywgaS0+bWluLAogCQkJCQkJICAgICAgIGktPm1heCwgaS0+b3Blbm1heCA/ICcpJyA6ICddJyk7CiAJCQkJfQogCQkJfQotCQkJcHJpbnRrKCJcbiIpOworCQkJcHJfY29udCgiXG4iKTsKICNlbmRpZgogCQkJcnN0YW1wc1trXSA9IHN0YW1wOwogCQkJaWYgKGNoYW5nZWQgJiYgci0+dmFyID49IDApIHsKQEAgLTM5OSw3ICszOTksNyBAQAogCQlyZXR1cm4gLUVCQURGRDsKIAl9CiAJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1BDTV9PU1MpCiAJaWYgKCFzdWJzdHJlYW0tPm9zcy5vc3MpCiAjZW5kaWYKIAkJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQpAQCAtOTU0LDcgKzk1NCw3IEBACiAgKgogICogVGhlIHN0YXRlIG9mIGVhY2ggc3RyZWFtIGlzIHRoZW4gY2hhbmdlZCB0byB0aGUgZ2l2ZW4gc3RhdGUgdW5jb25kaXRpb25hbGx5LgogICoKLSAqIFJldHVybjogWmVybyBpZiBzdWNjZXNmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KIGludCBzbmRfcGNtX3N0b3Aoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIHNuZF9wY21fc3RhdGVfdCBzdGF0ZSkKIHsKQEAgLTE1NDEsNyArMTU0MSw4IEBACiAJCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpCiAJCQkJcmVzdWx0ID0gLUVTVFJQSVBFOwogCQkJZWxzZSB7Ci0JCQkJc25kX3ByaW50ZCgicGxheWJhY2sgZHJhaW4gZXJyb3IgKERNQSBvciBJUlEgdHJvdWJsZT8pXG4iKTsKKwkJCQlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCisJCQkJCSJwbGF5YmFjayBkcmFpbiBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPylcbiIpOwogCQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7CiAJCQkJcmVzdWx0ID0gLUVJTzsKIAkJCX0KQEAgLTIwNjYsNyArMjA2Nyw3IEBACiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2luaXQoc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRkKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2luaXQgZmFpbGVkXG4iKTsKKwkJcGNtX2RiZyhwY20sICJzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2luaXQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTIwNzcsNyArMjA3OCw3IEBACiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2NvbXBsZXRlKHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgic25kX3BjbV9od19jb25zdHJhaW50c19jb21wbGV0ZSBmYWlsZWRcbiIpOworCQlwY21fZGJnKHBjbSwgInNuZF9wY21faHdfY29uc3RyYWludHNfY29tcGxldGUgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTI2MDksNyArMjYxMCw3IEBACiAJCXJldHVybiByZXM7CiAJfQogCX0KLQlzbmRfcHJpbnRkKCJ1bmtub3duIGlvY3RsID0gMHgleFxuIiwgY21kKTsKKwlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAidW5rbm93biBpb2N0bCA9IDB4JXhcbiIsIGNtZCk7CiAJcmV0dXJuIC1FTk9UVFk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3BjbV90aW1lci5jCmluZGV4IGIwMWQ5NDguLjIwZWNkOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9wY21fdGltZXIuYwpAQCAtNTMsNyArNTMsOSBAQAogCQlwb3N0ICo9IDI7CiAJfQogCWlmIChyYXRlID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGNtIHRpbWVyIHJlc29sdXRpb24gb3V0IG9mIHJhbmdlIChyYXRlID0gJXUsIHBlcmlvZF9zaXplID0gJWx1KVxuIiwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCQlwY21fZXJyKHN1YnN0cmVhbS0+cGNtLAorCQkJInBjbSB0aW1lciByZXNvbHV0aW9uIG91dCBvZiByYW5nZSAocmF0ZSA9ICV1LCBwZXJpb2Rfc2l6ZSA9ICVsdSlcbiIsCisJCQlydW50aW1lLT5yYXRlLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCXJ1bnRpbWUtPnRpbWVyX3Jlc29sdXRpb24gPSAtMTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jIGIvc291bmQvY29yZS9yYXdtaWRpLmMKaW5kZXggN2I1OTZiNS4uNmZjNzFhNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9yYXdtaWRpLmMKKysrIGIvc291bmQvY29yZS9yYXdtaWRpLmMKQEAgLTU2LDYgKzU2LDEzIEBACiBzdGF0aWMgTElTVF9IRUFEKHNuZF9yYXdtaWRpX2RldmljZXMpOwogc3RhdGljIERFRklORV9NVVRFWChyZWdpc3Rlcl9tdXRleCk7CiAKKyNkZWZpbmUgcm1pZGlfZXJyKHJtaWRpLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfZXJyKChybWlkaSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHJtaWRpX3dhcm4ocm1pZGksIGZtdCwgYXJncy4uLikgXAorCWRldl93YXJuKChybWlkaSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHJtaWRpX2RiZyhybWlkaSwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2RiZygocm1pZGkpLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQorCiBzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpICpzbmRfcmF3bWlkaV9zZWFyY2goc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2aWNlKQogewogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcmF3bWlkaTsKQEAgLTE2NSw2ICsxNzIsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJvcF9vdXRwdXQpOwogCiBpbnQgc25kX3Jhd21pZGlfZHJhaW5fb3V0cHV0KHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTE4MCw3ICsxODgsOSBAQAogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJZXJyID0gLUVSRVNUQVJUU1lTOwogCWlmIChydW50aW1lLT5hdmFpbCA8IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICYmICF0aW1lb3V0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJyYXdtaWRpIGRyYWluIGVycm9yIChhdmFpbCA9ICVsaSwgYnVmZmVyX3NpemUgPSAlbGkpXG4iLCAobG9uZylydW50aW1lLT5hdmFpbCwgKGxvbmcpcnVudGltZS0+YnVmZmVyX3NpemUpOworCQlybWlkaV93YXJuKHN1YnN0cmVhbS0+cm1pZGksCisJCQkgICAicmF3bWlkaSBkcmFpbiBlcnJvciAoYXZhaWwgPSAlbGksIGJ1ZmZlcl9zaXplID0gJWxpKVxuIiwKKwkJCSAgIChsb25nKXJ1bnRpbWUtPmF2YWlsLCAobG9uZylydW50aW1lLT5idWZmZXJfc2l6ZSk7CiAJCWVyciA9IC1FSU87CiAJfQogCXJ1bnRpbWUtPmRyYWluID0gMDsKQEAgLTE5NCw2ICsyMDQsNyBAQAogCX0KIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9kcmFpbl9vdXRwdXQpOwogCiBpbnQgc25kX3Jhd21pZGlfZHJhaW5faW5wdXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewpAQCAtMjA4LDYgKzIxOSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9kcmFpbl9pbnB1dCk7CiAKIC8qIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBzdWJzdHJlYW0gZm9yIHRoZSBnaXZlbiBzdHJlYW0gZGlyZWN0aW9uOwogICogaWYgYSBzcGVjaWZpYyBzdWJkZXZpY2UgaXMgZ2l2ZW4sIHRyeSB0byBhc3NpZ24gaXQKQEAgLTM0NSw2ICszNTcsNyBAQAogCQltb2R1bGVfcHV0KHJtaWRpLT5jYXJkLT5tb2R1bGUpOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF9vcGVuKTsKIAogc3RhdGljIGludCBzbmRfcmF3bWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtNTIzLDYgKzUzNiw3IEBACiAJbW9kdWxlX3B1dChybWlkaS0+Y2FyZC0+bW9kdWxlKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX3JlbGVhc2UpOwogCiBzdGF0aWMgaW50IHNuZF9yYXdtaWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC01OTksNiArNjEzLDcgQEAKIAl9CiAJcmV0dXJuIC1FTlhJTzsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfaW5mb19zZWxlY3QpOwogCiBzdGF0aWMgaW50IHNuZF9yYXdtaWRpX2luZm9fc2VsZWN0X3VzZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCQlzdHJ1Y3Qgc25kX3Jhd21pZGlfaW5mbyBfX3VzZXIgKl9pbmZvKQpAQCAtNjQ2LDYgKzY2MSw3IEBACiAJc3Vic3RyZWFtLT5hY3RpdmVfc2Vuc2luZyA9ICFwYXJhbXMtPm5vX2FjdGl2ZV9zZW5zaW5nOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9vdXRwdXRfcGFyYW1zKTsKIAogaW50IHNuZF9yYXdtaWRpX2lucHV0X3BhcmFtcyhzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfcmF3bWlkaV9wYXJhbXMgKiBwYXJhbXMpCkBAIC02NzEsNiArNjg3LDcgQEAKIAlydW50aW1lLT5hdmFpbF9taW4gPSBwYXJhbXMtPmF2YWlsX21pbjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfaW5wdXRfcGFyYW1zKTsKIAogc3RhdGljIGludCBzbmRfcmF3bWlkaV9vdXRwdXRfc3RhdHVzKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgIHN0cnVjdCBzbmRfcmF3bWlkaV9zdGF0dXMgKiBzdGF0dXMpCkBAIC04MDIsMTAgKzgxOSw5IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInJhd21pZGk6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7Ci0jZW5kaWYKKwkJcm1pZGlfZGJnKHJmaWxlLT5ybWlkaSwKKwkJCSAgInJhd21pZGk6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7CiAJfQogCXJldHVybiAtRU5PVFRZOwogfQpAQCAtODc1LDcgKzg5MSw4IEBACiAJaWYgKCFzdWJzdHJlYW0tPm9wZW5lZCkKIAkJcmV0dXJuIC1FQkFERkQ7CiAJaWYgKHJ1bnRpbWUtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNuZF9yYXdtaWRpX3JlY2VpdmU6IGlucHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3JlY2VpdmU6IGlucHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKQEAgLTkyNiw2ICs5NDMsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9yZWNlaXZlKTsKIAogc3RhdGljIGxvbmcgc25kX3Jhd21pZGlfa2VybmVsX3JlYWQxKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICp1c2VyYnVmLApAQCAtOTY4LDYgKzk4Niw3IEBACiAJc25kX3Jhd21pZGlfaW5wdXRfdHJpZ2dlcihzdWJzdHJlYW0sIDEpOwogCXJldHVybiBzbmRfcmF3bWlkaV9rZXJuZWxfcmVhZDEoc3Vic3RyZWFtLCBOVUxMLyp1c2VyYnVmKi8sIGJ1ZiwgY291bnQpOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfcmVhZCk7CiAKIHN0YXRpYyBzc2l6ZV90IHNuZF9yYXdtaWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCQlsb2ZmX3QgKm9mZnNldCkKQEAgLTEwMzQsNyArMTA1Myw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChydW50aW1lLT5idWZmZXIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eTogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3RyYW5zbWl0X2VtcHR5OiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CiAJCXJldHVybiAxOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwpAQCAtMTA0Miw2ICsxMDYyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJlc3VsdDsJCQogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eSk7CiAKIC8qKgogICogc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayAtIGNvcHkgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIKQEAgLTEwNjUsNyArMTA4Niw4IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAlpZiAocnVudGltZS0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlazogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWs6IG91dHB1dCBpcyBub3QgYWN0aXZlISEhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJlc3VsdCA9IDA7CkBAIC0xMDk3LDExICsxMTE5LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWspOwogCiAvKioKICAqIHNuZF9yYXdtaWRpX3RyYW5zbWl0X2FjayAtIGFja25vd2xlZGdlIHRoZSB0cmFuc21pc3Npb24KICAqIEBzdWJzdHJlYW06IHRoZSByYXdtaWRpIHN1YnN0cmVhbQotICogQGNvdW50OiB0aGUgdHJhbmZlcnJlZCBjb3VudAorICogQGNvdW50OiB0aGUgdHJhbnNmZXJyZWQgY291bnQKICAqCiAgKiBBZHZhbmNlcyB0aGUgaGFyZHdhcmUgcG9pbnRlciBmb3IgdGhlIGludGVybmFsIG91dHB1dCBidWZmZXIgd2l0aAogICogdGhlIGdpdmVuIHNpemUgYW5kIHVwZGF0ZXMgdGhlIGNvbmRpdGlvbi4KQEAgLTExMTUsNyArMTEzOCw4IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAlpZiAocnVudGltZS0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrOiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CisJCXJtaWRpX2RiZyhzdWJzdHJlYW0tPnJtaWRpLAorCQkJICAic25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrOiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwpAQCAtMTEzMSw2ICsxMTU1LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9hY2spOwogCiAvKioKICAqIHNuZF9yYXdtaWRpX3RyYW5zbWl0IC0gY29weSBmcm9tIHRoZSBidWZmZXIgdG8gdGhlIGRldmljZQpAQCAtMTE1Miw2ICsxMTc3LDcgQEAKIAkJcmV0dXJuIGNvdW50OwogCXJldHVybiBzbmRfcmF3bWlkaV90cmFuc21pdF9hY2soc3Vic3RyZWFtLCBjb3VudCk7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0KTsKIAogc3RhdGljIGxvbmcgc25kX3Jhd21pZGlfa2VybmVsX3dyaXRlMShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnVzZXJidWYsCkBAIC0xMjEzLDYgKzEyMzksNyBAQAogewogCXJldHVybiBzbmRfcmF3bWlkaV9rZXJuZWxfd3JpdGUxKHN1YnN0cmVhbSwgTlVMTCwgYnVmLCBjb3VudCk7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF93cml0ZSk7CiAKIHN0YXRpYyBzc2l6ZV90IHNuZF9yYXdtaWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQpAQCAtMTQxMyw3ICsxNDQwLDcgQEAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgewogCQlzdWJzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3Vic3RyZWFtKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAicmF3bWlkaTogY2Fubm90IGFsbG9jYXRlIHN1YnN0cmVhbVxuIik7CisJCQlybWlkaV9lcnIocm1pZGksICJyYXdtaWRpOiBjYW5ub3QgYWxsb2NhdGUgc3Vic3RyZWFtXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXN1YnN0cmVhbS0+c3RyZWFtID0gZGlyZWN0aW9uOwpAQCAtMTQ1OCw3ICsxNDg1LDcgQEAKIAkJKnJyYXdtaWRpID0gTlVMTDsKIAlybWlkaSA9IGt6YWxsb2Moc2l6ZW9mKCpybWlkaSksIEdGUF9LRVJORUwpOwogCWlmIChybWlkaSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInJhd21pZGk6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAicmF3bWlkaTogY2Fubm90IGFsbG9jYXRlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJtaWRpLT5jYXJkID0gY2FyZDsKQEAgLTE0OTIsNiArMTUxOSw3IEBACiAJCSpycmF3bWlkaSA9IHJtaWRpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9uZXcpOwogCiBzdGF0aWMgdm9pZCBzbmRfcmF3bWlkaV9mcmVlX3N1YnN0cmVhbXMoc3RydWN0IHNuZF9yYXdtaWRpX3N0ciAqc3RyZWFtKQogewpAQCAtMTU1Nyw3ICsxNTg1LDggQEAKIAlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfUkFXTUlESSwKIAkJCQkgICAgICAgcm1pZGktPmNhcmQsIHJtaWRpLT5kZXZpY2UsCiAJCQkJICAgICAgICZzbmRfcmF3bWlkaV9mX29wcywgcm1pZGksIG5hbWUpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLCBybWlkaS0+Y2FyZC0+bnVtYmVyLCBybWlkaS0+ZGV2aWNlKTsKKwkJcm1pZGlfZXJyKHJtaWRpLCAidW5hYmxlIHRvIHJlZ2lzdGVyIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLAorCQkJICBybWlkaS0+Y2FyZC0+bnVtYmVyLCBybWlkaS0+ZGV2aWNlKTsKIAkJbGlzdF9kZWwoJnJtaWRpLT5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiBlcnI7CkBAIC0xNTc0LDggKzE2MDMsMTAgQEAKIAlpZiAoKGludClybWlkaS0+ZGV2aWNlID09IG1pZGlfbWFwW3JtaWRpLT5jYXJkLT5udW1iZXJdKSB7CiAJCWlmIChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfTUlESSwKIAkJCQkJICAgIHJtaWRpLT5jYXJkLCAwLCAmc25kX3Jhd21pZGlfZl9vcHMsCi0JCQkJCSAgICBybWlkaSwgbmFtZSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLCBybWlkaS0+Y2FyZC0+bnVtYmVyLCAwKTsKKwkJCQkJICAgIHJtaWRpKSA8IDApIHsKKwkJCXJtaWRpX2VycihybWlkaSwKKwkJCQkgICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLAorCQkJCSAgcm1pZGktPmNhcmQtPm51bWJlciwgMCk7CiAJCX0gZWxzZSB7CiAJCQlybWlkaS0+b3NzcmVnKys7CiAjaWZkZWYgU05EUlZfT1NTX0lORk9fREVWX01JREkKQEAgLTE1ODYsOCArMTYxNywxMCBAQAogCWlmICgoaW50KXJtaWRpLT5kZXZpY2UgPT0gYW1pZGlfbWFwW3JtaWRpLT5jYXJkLT5udW1iZXJdKSB7CiAJCWlmIChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfTUlESSwKIAkJCQkJICAgIHJtaWRpLT5jYXJkLCAxLCAmc25kX3Jhd21pZGlfZl9vcHMsCi0JCQkJCSAgICBybWlkaSwgbmFtZSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLCBybWlkaS0+Y2FyZC0+bnVtYmVyLCAxKTsKKwkJCQkJICAgIHJtaWRpKSA8IDApIHsKKwkJCXJtaWRpX2VycihybWlkaSwKKwkJCQkgICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIHJhd21pZGkgZGV2aWNlICVpOiVpXG4iLAorCQkJCSAgcm1pZGktPmNhcmQtPm51bWJlciwgMSk7CiAJCX0gZWxzZSB7CiAJCQlybWlkaS0+b3NzcmVnKys7CiAJCX0KQEAgLTE2NzAsNiArMTcwMyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzdHJlYW0sICZybWlkaS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbXMsIGxpc3QpCiAJCXN1YnN0cmVhbS0+b3BzID0gb3BzOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9zZXRfb3BzKTsKIAogLyoKICAqICBFTlRSWSBmdW5jdGlvbnMKQEAgLTE2ODUsMTEgKzE3MTksMTMgQEAKIAkvKiBjaGVjayBkZXZpY2UgbWFwIHRhYmxlICovCiAJZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKIAkJaWYgKG1pZGlfbWFwW2ldIDwgMCB8fCBtaWRpX21hcFtpXSA+PSBTTkRSVl9SQVdNSURJX0RFVklDRVMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgbWlkaV9tYXBbJWRdID0gJWRcbiIsIGksIG1pZGlfbWFwW2ldKTsKKwkJCXByX2VycigiQUxTQTogcmF3bWlkaTogaW52YWxpZCBtaWRpX21hcFslZF0gPSAlZFxuIiwKKwkJCSAgICAgICBpLCBtaWRpX21hcFtpXSk7CiAJCQltaWRpX21hcFtpXSA9IDA7CiAJCX0KIAkJaWYgKGFtaWRpX21hcFtpXSA8IDAgfHwgYW1pZGlfbWFwW2ldID49IFNORFJWX1JBV01JRElfREVWSUNFUykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBhbWlkaV9tYXBbJWRdID0gJWRcbiIsIGksIGFtaWRpX21hcFtpXSk7CisJCQlwcl9lcnIoIkFMU0E6IHJhd21pZGk6IGludmFsaWQgYW1pZGlfbWFwWyVkXSA9ICVkXG4iLAorCQkJICAgICAgIGksIGFtaWRpX21hcFtpXSk7CiAJCQlhbWlkaV9tYXBbaV0gPSAxOwogCQl9CiAJfQpAQCAtMTcwNiwyMSArMTc0MiwzIEBACiAKIG1vZHVsZV9pbml0KGFsc2FfcmF3bWlkaV9pbml0KQogbW9kdWxlX2V4aXQoYWxzYV9yYXdtaWRpX2V4aXQpCi0KLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfb3V0cHV0X3BhcmFtcyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2lucHV0X3BhcmFtcyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJhaW5fb3V0cHV0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJhaW5faW5wdXQpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9yZWNlaXZlKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfZW1wdHkpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9wZWVrKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXQpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9uZXcpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9zZXRfb3BzKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfaW5mb19zZWxlY3QpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfb3Blbik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF9yZWxlYXNlKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX3JlYWQpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfd3JpdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ydGN0aW1lci5jIGIvc291bmQvY29yZS9ydGN0aW1lci5jCmluZGV4IGU4NWU3MmIuLmYzNDIwZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvdGltZXIuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQykgfHwgZGVmaW5lZChDT05GSUdfUlRDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19SVEMpCiAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogCkBAIC0xMzIsOCArMTMyLDcgQEAKIAogCWlmIChydGN0aW1lcl9mcmVxIDwgMiB8fCBydGN0aW1lcl9mcmVxID4gODE5MiB8fAogCSAgICAhaXNfcG93ZXJfb2ZfMihydGN0aW1lcl9mcmVxKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJydGN0aW1lcjogaW52YWxpZCBmcmVxdWVuY3kgJWRcbiIsCi0JCQkgICBydGN0aW1lcl9mcmVxKTsKKwkJcHJfZXJyKCJBTFNBOiBydGN0aW1lcjogaW52YWxpZCBmcmVxdWVuY3kgJWRcbiIsIHJ0Y3RpbWVyX2ZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE4NSw0ICsxODQsNCBAQAogCiBNT0RVTEVfQUxJQVMoInNuZC10aW1lci0iIF9fc3RyaW5naWZ5KFNORFJWX1RJTUVSX0dMT0JBTF9SVEMpKTsKIAotI2VuZGlmIC8qIENPTkZJR19SVEMgfHwgQ09ORklHX1JUQ19NT0RVTEUgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19SVEMpICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYwppbmRleCA4ZDRkNWU4Li4xNmQ0MjY3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKQEAgLTM5LDEyICszOSw2IEBACiBNT0RVTEVfQUxJQVNfU05EUlZfTUlOT1IoU05EUlZfTUlOT1JfT1NTX1NFUVVFTkNFUik7CiBNT0RVTEVfQUxJQVNfU05EUlZfTUlOT1IoU05EUlZfTUlOT1JfT1NTX01VU0lDKTsKIAotI2lmZGVmIFNORFJWX1NFUV9PU1NfREVCVUcKLW1vZHVsZV9wYXJhbShzZXFfb3NzX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhzZXFfb3NzX2RlYnVnLCAiZGVidWcgb3B0aW9uIik7Ci1pbnQgc2VxX29zc19kZWJ1ZyA9IDA7Ci0jZW5kaWYKLQogCiAvKgogICogcHJvdG90eXBlcwpAQCAtMjMxLDIyICsyMjUsMTkgQEAKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJaWYgKChyYyA9IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9TRVFVRU5DRVIsCiAJCQkJCSAgTlVMTCwgMCwKLQkJCQkJICAmc2VxX29zc19mX29wcywgTlVMTCwKLQkJCQkJICBTTkRSVl9TRVFfT1NTX0RFVk5BTUUpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIHNlcVxuIik7CisJCQkJCSAgJnNlcV9vc3NfZl9vcHMsIE5VTEwpKSA8IDApIHsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCByZWdpc3RlciBkZXZpY2Ugc2VxXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiByYzsKIAl9CiAJaWYgKChyYyA9IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9NVVNJQywKIAkJCQkJICBOVUxMLCAwLAotCQkJCQkgICZzZXFfb3NzX2Zfb3BzLCBOVUxMLAotCQkJCQkgIFNORFJWX1NFUV9PU1NfREVWTkFNRSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciBkZXZpY2UgbXVzaWNcbiIpOworCQkJCQkgICZzZXFfb3NzX2Zfb3BzLCBOVUxMKSkgPCAwKSB7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIG11c2ljXG4iKTsKIAkJc25kX3VucmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfU0VRVUVOQ0VSLCBOVUxMLCAwKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiByYzsKIAl9Ci0JZGVidWdfcHJpbnRrKCgiZGV2aWNlIHJlZ2lzdGVyZWRcbiIpKTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NSwxMSArMjQ2LDEwIEBACiB1bnJlZ2lzdGVyX2RldmljZSh2b2lkKQogewogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlkZWJ1Z19wcmludGsoKCJkZXZpY2UgdW5yZWdpc3RlcmVkXG4iKSk7CiAJaWYgKHNuZF91bnJlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX01VU0lDLCBOVUxMLCAwKSA8IDApCQkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgdW5yZWdpc3RlciBkZXZpY2UgbXVzaWNcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGVycm9yIHVucmVnaXN0ZXIgZGV2aWNlIG11c2ljXG4iKTsKIAlpZiAoc25kX3VucmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfU0VRVUVOQ0VSLCBOVUxMLCAwKSA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHVucmVnaXN0ZXIgZGV2aWNlIHNlcVxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogZXJyb3IgdW5yZWdpc3RlciBkZXZpY2Ugc2VxXG4iKTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfZGV2aWNlLmggYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19kZXZpY2UuaAppbmRleCBjMDE1NGE5Li5iNDM5MjQzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19kZXZpY2UuaAorKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19kZXZpY2UuaApAQCAtMzEsOSArMzEsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3NlcV9rZXJuZWwuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAKLS8qIGVuYWJsZSBkZWJ1ZyBwcmludCAqLwotI2RlZmluZSBTTkRSVl9TRVFfT1NTX0RFQlVHCi0KIC8qIG1heC4gYXBwbGljYXRpb25zICovCiAjZGVmaW5lIFNORFJWX1NFUV9PU1NfTUFYX0NMSUVOVFMJMTYKICNkZWZpbmUgU05EUlZfU0VRX09TU19NQVhfU1lOVEhfREVWUwkxNgpAQCAtNDYsNyArNDMsNiBAQAogI2RlZmluZSBTTkRSVl9TRVFfT1NTX1ZFUlNJT05fU1RSCSIwLjEuOCIKIAogLyogZGV2aWNlIGFuZCBwcm9jIGludGVyZmFjZSBuYW1lICovCi0jZGVmaW5lIFNORFJWX1NFUV9PU1NfREVWTkFNRQkJInNlcV9vc3MiCiAjZGVmaW5lIFNORFJWX1NFUV9PU1NfUFJPQ05BTUUJCSJvc3MiCiAKIApAQCAtMTc3LDEzICsxNzMsNCBAQAogLyogbWlzYy4gZnVuY3Rpb25zIGZvciBwcm9jIGludGVyZmFjZSAqLwogY2hhciAqZW5hYmxlZF9zdHIoaW50IGJvb2wpOwogCi0KLS8qIGZvciBkZWJ1ZyAqLwotI2lmZGVmIFNORFJWX1NFUV9PU1NfREVCVUcKLWV4dGVybiBpbnQgc2VxX29zc19kZWJ1ZzsKLSNkZWZpbmUgZGVidWdfcHJpbnRrKHgpCWRvIHsgaWYgKHNlcV9vc3NfZGVidWcgPiAwKSBzbmRfcHJpbnRkIHg7IH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBkZWJ1Z19wcmludGsoeCkJLyoqLwotI2VuZGlmCi0KICNlbmRpZiAvKiBfX1NFUV9PU1NfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYwppbmRleCBiM2YzOWI1Li5iOTE4NGQyIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW5pdC5jCkBAIC05Miw3ICs5Miw2IEBACiAJCWdvdG8gX19lcnJvcjsKIAogCXN5c3RlbV9jbGllbnQgPSByYzsKLQlkZWJ1Z19wcmludGsoKCJuZXcgY2xpZW50ID0gJWRcbiIsIHJjKSk7CiAKIAkvKiBjcmVhdGUgYW5ub3VjZW1lbnQgcmVjZWl2ZXIgcG9ydCAqLwogCW1lbXNldChwb3J0LCAwLCBzaXplb2YoKnBvcnQpKTsKQEAgLTE5MCwxMCArMTg5LDkgQEAKIAogCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtYWxsb2MgZGV2aWNlIGluZm9cbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyBkZXZpY2UgaW5mb1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkZWJ1Z19wcmludGsoKCJvc3Nfb3BlbjogZHAgPSAlcFxuIiwgZHApKTsKIAogCWRwLT5jc2VxID0gc3lzdGVtX2NsaWVudDsKIAlkcC0+cG9ydCA9IC0xOwpAQCAtMjA2LDcgKzIwNCw3IEBACiAKIAlkcC0+aW5kZXggPSBpOwogCWlmIChpID49IFNORFJWX1NFUV9PU1NfTUFYX0NMSUVOVFMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidG9vIG1hbnkgYXBwbGljYXRpb25zXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiB0b28gbWFueSBhcHBsaWNhdGlvbnNcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gX2Vycm9yOwogCX0KQEAgLTIxNiwyMSArMjE0LDE5IEBACiAJc25kX3NlcV9vc3NfbWlkaV9zZXR1cChkcCk7CiAKIAlpZiAoZHAtPnN5bnRoX29wZW5lZCA9PSAwICYmIGRwLT5tYXhfbWlkaWRldiA9PSAwKSB7Ci0JCS8qIHNuZF9wcmludGsoS0VSTl9FUlIgIm5vIGRldmljZSBmb3VuZFxuIik7ICovCisJCS8qIHByX2VycigiQUxTQTogc2VxX29zczogbm8gZGV2aWNlIGZvdW5kXG4iKTsgKi8KIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIF9lcnJvcjsKIAl9CiAKIAkvKiBjcmVhdGUgcG9ydCAqLwotCWRlYnVnX3ByaW50aygoImNyZWF0ZSBuZXcgcG9ydFxuIikpOwogCXJjID0gY3JlYXRlX3BvcnQoZHApOwogCWlmIChyYyA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgY3JlYXRlIHBvcnRcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IGNyZWF0ZSBwb3J0XG4iKTsKIAkJZ290byBfZXJyb3I7CiAJfQogCiAJLyogYWxsb2NhdGUgcXVldWUgKi8KLQlkZWJ1Z19wcmludGsoKCJhbGxvY2F0ZSBxdWV1ZVxuIikpOwogCXJjID0gYWxsb2Nfc2VxX3F1ZXVlKGRwKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIF9lcnJvcjsKQEAgLTI0Nyw3ICsyNDMsNiBAQAogCWRwLT5maWxlX21vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKIAogCS8qIGluaXRpYWxpemUgcmVhZCBxdWV1ZSAqLwotCWRlYnVnX3ByaW50aygoImluaXRpYWxpemUgcmVhZCBxdWV1ZVxuIikpOwogCWlmIChpc19yZWFkX21vZGUoZHAtPmZpbGVfbW9kZSkpIHsKIAkJZHAtPnJlYWRxID0gc25kX3NlcV9vc3NfcmVhZHFfbmV3KGRwLCBtYXhxbGVuKTsKIAkJaWYgKCFkcC0+cmVhZHEpIHsKQEAgLTI1Nyw3ICsyNTIsNiBAQAogCX0KIAogCS8qIGluaXRpYWxpemUgd3JpdGUgcXVldWUgKi8KLQlkZWJ1Z19wcmludGsoKCJpbml0aWFsaXplIHdyaXRlIHF1ZXVlXG4iKSk7CiAJaWYgKGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkpIHsKIAkJZHAtPndyaXRlcSA9IHNuZF9zZXFfb3NzX3dyaXRlcV9uZXcoZHAsIG1heHFsZW4pOwogCQlpZiAoIWRwLT53cml0ZXEpIHsKQEAgLTI2NywxNCArMjYxLDEyIEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSB0aW1lciAqLwotCWRlYnVnX3ByaW50aygoImluaXRpYWxpemUgdGltZXJcbiIpKTsKIAlkcC0+dGltZXIgPSBzbmRfc2VxX29zc190aW1lcl9uZXcoZHApOwogCWlmICghZHAtPnRpbWVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jIHRpbWVyXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBhbGxvYyB0aW1lclxuIik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBfZXJyb3I7CiAJfQotCWRlYnVnX3ByaW50aygoInRpbWVyIGluaXRpYWxpemVkXG4iKSk7CiAKIAkvKiBzZXQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgKi8KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBkcDsKQEAgLTI4OCw3ICsyODAsNiBAQAogCWNsaWVudF90YWJsZVtkcC0+aW5kZXhdID0gZHA7CiAJbnVtX2NsaWVudHMrKzsKIAotCWRlYnVnX3ByaW50aygoIm9wZW4gZG9uZVxuIikpOwogCXJldHVybiAwOwogCiAgX2Vycm9yOgpAQCAtMzQ3LDcgKzMzOCw2IEBACiAJCXJldHVybiByYzsKIAogCWRwLT5wb3J0ID0gcG9ydC5hZGRyLnBvcnQ7Ci0JZGVidWdfcHJpbnRrKCgibmV3IHBvcnQgPSAlZFxuIiwgcG9ydC5hZGRyLnBvcnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzYzLDcgKzM1Myw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRlYnVnX3ByaW50aygoImRlbGV0ZV9wb3J0ICVpXG4iLCBkcC0+cG9ydCkpOwogCXJldHVybiBzbmRfc2VxX2V2ZW50X3BvcnRfZGV0YWNoKGRwLT5jc2VxLCBkcC0+cG9ydCk7CiB9CiAKQEAgLTQwMSw3ICszOTAsNyBAQAogCXFpbmZvLnF1ZXVlID0gcXVldWU7CiAJcmMgPSBjYWxsX2N0bChTTkRSVl9TRVFfSU9DVExfREVMRVRFX1FVRVVFLCAmcWluZm8pOwogCWlmIChyYyA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAic2VxLW9zczogdW5hYmxlIHRvIGRlbGV0ZSBxdWV1ZSAlZCAoJWQpXG4iLCBxdWV1ZSwgcmMpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IHVuYWJsZSB0byBkZWxldGUgcXVldWUgJWQgKCVkKVxuIiwgcXVldWUsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQzOCwyMSArNDI3LDE2IEBACiAJY2xpZW50X3RhYmxlW2RwLT5pbmRleF0gPSBOVUxMOwogCW51bV9jbGllbnRzLS07CiAKLQlkZWJ1Z19wcmludGsoKCJyZXNldHRpbmcuLlxuIikpOwogCXNuZF9zZXFfb3NzX3Jlc2V0KGRwKTsKIAotCWRlYnVnX3ByaW50aygoImNsZWFuaW5nIHVwLi5cbiIpKTsKIAlzbmRfc2VxX29zc19zeW50aF9jbGVhbnVwKGRwKTsKIAlzbmRfc2VxX29zc19taWRpX2NsZWFudXAoZHApOwogCiAJLyogY2xlYXIgc2xvdCAqLwotCWRlYnVnX3ByaW50aygoInJlbGVhc2luZyByZXNvdXJjZS4uXG4iKSk7CiAJcXVldWUgPSBkcC0+cXVldWU7CiAJaWYgKGRwLT5wb3J0ID49IDApCiAJCWRlbGV0ZV9wb3J0KGRwKTsKIAlkZWxldGVfc2VxX3F1ZXVlKHF1ZXVlKTsKLQotCWRlYnVnX3ByaW50aygoInJlbGVhc2UgZG9uZVxuIikpOwogfQogCiAKQEAgLTQ2Niw3ICs0NTAsNiBAQAogCQlyZXR1cm47CiAJaWYgKGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkgJiYgIWlzX25vbmJsb2NrX21vZGUoZHAtPmZpbGVfbW9kZSkgJiYKIAkgICAgZHAtPndyaXRlcSkgewotCQlkZWJ1Z19wcmludGsoKCJzeW5jaW5nLi5cbiIpKTsKIAkJd2hpbGUgKHNuZF9zZXFfb3NzX3dyaXRlcV9zeW5jKGRwLT53cml0ZXEpKQogCQkJOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2lvY3RsLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pb2N0bC5jCmluZGV4IDVhYzcwMWMuLjViODUyMDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2lvY3RsLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW9jdGwuYwpAQCAtOTAsMTIgKzkwLDEwIEBACiAJCXJldHVybiBzbmRfc2VxX29zc190aW1lcl9pb2N0bChkcC0+dGltZXIsIGNtZCwgYXJnKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9QQU5JQzoKLQkJZGVidWdfcHJpbnRrKCgicGFuaWNcbiIpKTsKIAkJc25kX3NlcV9vc3NfcmVzZXQoZHApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNhc2UgU05EQ1RMX1NFUV9TWU5DOgotCQlkZWJ1Z19wcmludGsoKCJzeW5jXG4iKSk7CiAJCWlmICghIGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkgfHwgZHAtPndyaXRlcSA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CiAJCXdoaWxlIChzbmRfc2VxX29zc193cml0ZXFfc3luYyhkcC0+d3JpdGVxKSkKQEAgLTEwNSw1NSArMTAzLDQ1IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX1JFU0VUOgotCQlkZWJ1Z19wcmludGsoKCJyZXNldFxuIikpOwogCQlzbmRfc2VxX29zc19yZXNldChkcCk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX1RFU1RNSURJOgotCQlkZWJ1Z19wcmludGsoKCJ0ZXN0IG1pZGlcbiIpKTsKIAkJaWYgKGdldF91c2VyKGRldiwgcCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX21pZGlfb3BlbihkcCwgZGV2LCBkcC0+ZmlsZV9tb2RlKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9HRVRJTkNPVU5UOgotCQlkZWJ1Z19wcmludGsoKCJnZXQgaW4gY291bnRcbiIpKTsKIAkJaWYgKGRwLT5yZWFkcSA9PSBOVUxMIHx8ICEgaXNfcmVhZF9tb2RlKGRwLT5maWxlX21vZGUpKQogCQkJcmV0dXJuIDA7CiAJCXJldHVybiBwdXRfdXNlcihkcC0+cmVhZHEtPnFsZW4sIHApID8gLUVGQVVMVCA6IDA7CiAKIAljYXNlIFNORENUTF9TRVFfR0VUT1VUQ09VTlQ6Ci0JCWRlYnVnX3ByaW50aygoImdldCBvdXQgY291bnRcbiIpKTsKIAkJaWYgKCEgaXNfd3JpdGVfbW9kZShkcC0+ZmlsZV9tb2RlKSB8fCBkcC0+d3JpdGVxID09IE5VTEwpCiAJCQlyZXR1cm4gMDsKIAkJcmV0dXJuIHB1dF91c2VyKHNuZF9zZXFfb3NzX3dyaXRlcV9nZXRfZnJlZV9zaXplKGRwLT53cml0ZXEpLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX0dFVFRJTUU6Ci0JCWRlYnVnX3ByaW50aygoImdldCB0aW1lXG4iKSk7CiAJCXJldHVybiBwdXRfdXNlcihzbmRfc2VxX29zc190aW1lcl9jdXJfdGljayhkcC0+dGltZXIpLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUzoKLQkJZGVidWdfcHJpbnRrKCgicmVzZXQgc2FtcGxlc1xuIikpOwogCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gc25kX3NlcV9vc3Nfc3ludGhfaW9jdGwoZHAsIGRldiwgY21kLCBjYXJnKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9OUlNZTlRIUzoKLQkJZGVidWdfcHJpbnRrKCgibnIgc3ludGhzXG4iKSk7CiAJCXJldHVybiBwdXRfdXNlcihkcC0+bWF4X3N5bnRoZGV2LCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX05STUlESVM6Ci0JCWRlYnVnX3ByaW50aygoIm5yIG1pZGlzXG4iKSk7CiAJCXJldHVybiBwdXRfdXNlcihkcC0+bWF4X21pZGlkZXYsIHApID8gLUVGQVVMVCA6IDA7CiAKIAljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6Ci0JCWRlYnVnX3ByaW50aygoIm1lbSBhdmFpbFxuIikpOwogCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQl2YWwgPSBzbmRfc2VxX29zc19zeW50aF9pb2N0bChkcCwgZGV2LCBjbWQsIGNhcmcpOwogCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfRk1fNE9QX0VOQUJMRToKLQkJZGVidWdfcHJpbnRrKCgiNG9wXG4iKSk7CiAJCWlmIChnZXRfdXNlcihkZXYsIHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXNuZF9zZXFfb3NzX3N5bnRoX2lvY3RsKGRwLCBkZXYsIGNtZCwgY2FyZyk7CkBAIC0xNjEsMTkgKzE0OSwxNSBAQAogCiAJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKIAljYXNlIFNORENUTF9TWU5USF9JRDoKLQkJZGVidWdfcHJpbnRrKCgic3ludGggaW5mb1xuIikpOwogCQlyZXR1cm4gc25kX3NlcV9vc3Nfc3ludGhfaW5mb191c2VyKGRwLCBhcmcpOwogCiAJY2FzZSBTTkRDVExfU0VRX09VVE9GQkFORDoKLQkJZGVidWdfcHJpbnRrKCgib3V0IG9mIGJhbmRcbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX29vYl91c2VyKGRwLCBhcmcpOwogCiAJY2FzZSBTTkRDVExfTUlESV9JTkZPOgotCQlkZWJ1Z19wcmludGsoKCJtaWRpIGluZm9cbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX21pZGlfaW5mb191c2VyKGRwLCBhcmcpOwogCiAJY2FzZSBTTkRDVExfU0VRX1RIUkVTSE9MRDoKLQkJZGVidWdfcHJpbnRrKCgidGhyZXNob2xkXG4iKSk7CiAJCWlmICghIGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGdldF91c2VyKHZhbCwgcCkpCkBAIC0xODYsNyArMTcwLDYgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIFNORENUTF9NSURJX1BSRVRJTUU6Ci0JCWRlYnVnX3ByaW50aygoInByZXRpbWVcbiIpKTsKIAkJaWYgKGRwLT5yZWFkcSA9PSBOVUxMIHx8ICFpc19yZWFkX21vZGUoZHAtPmZpbGVfbW9kZSkpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGdldF91c2VyKHZhbCwgcCkpCkBAIC0xOTksNyArMTgyLDYgQEAKIAkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCkgPyAtRUZBVUxUIDogMDsKIAogCWRlZmF1bHQ6Ci0JCWRlYnVnX3ByaW50aygoIm90aGVyc1xuIikpOwogCQlpZiAoISBpc193cml0ZV9tb2RlKGRwLT5maWxlX21vZGUpKQogCQkJcmV0dXJuIC1FSU87CiAJCXJldHVybiBzbmRfc2VxX29zc19zeW50aF9pb2N0bChkcCwgMCwgY21kLCBjYXJnKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYwppbmRleCA4NjJkODQ4OS4uM2E0NTY5NiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfbWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYwpAQCAtMTUzLDcgKzE1Myw2IEBACiAJc3RydWN0IHNlcV9vc3NfbWlkaSAqbWRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGVidWdfcHJpbnRrKCgiY2hlY2sgZm9yIE1JREkgY2xpZW50ICVkIHBvcnQgJWRcbiIsIHBpbmZvLT5hZGRyLmNsaWVudCwgcGluZm8tPmFkZHIucG9ydCkpOwogCS8qIHRoZSBwb3J0IG11c3QgaW5jbHVkZSBnZW5lcmljIG1pZGkgKi8KIAlpZiAoISAocGluZm8tPnR5cGUgJiBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQykpCiAJCXJldHVybiAwOwpAQCAtMTc1LDcgKzE3NCw3IEBACiAJICogYWxsb2NhdGUgbWlkaSBpbmZvIHJlY29yZAogCSAqLwogCWlmICgobWRldiA9IGt6YWxsb2Moc2l6ZW9mKCptZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgbWFsbG9jIG1pZGkgaW5mb1xuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIG1pZGkgaW5mb1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTkxLDcgKzE5MCw3IEBACiAKIAkvKiBjcmVhdGUgTUlESSBjb2RlciAqLwogCWlmIChzbmRfbWlkaV9ldmVudF9uZXcoTUFYX01JRElfRVZFTlRfQlVGLCAmbWRldi0+Y29kZXIpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtYWxsb2MgbWlkaSBjb2RlclxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIG1pZGkgY29kZXJcbiIpOwogCQlrZnJlZShtZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNDA2LDcgKzQwNSw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRlYnVnX3ByaW50aygoImNsb3NpbmcgY2xpZW50ICVkIHBvcnQgJWQgbW9kZSAlZFxuIiwgbWRldi0+Y2xpZW50LCBtZGV2LT5wb3J0LCBtZGV2LT5vcGVuZWQpKTsKIAltZW1zZXQoJnN1YnMsIDAsIHNpemVvZihzdWJzKSk7CiAJaWYgKG1kZXYtPm9wZW5lZCAmIFBFUk1fV1JJVEUpIHsKIAkJc3Vicy5zZW5kZXIgPSBkcC0+YWRkcjsKQEAgLTQ3MCw3ICs0NjgsNiBAQAogCQlzdHJ1Y3Qgc25kX3NlcV9ldmVudCBldjsKIAkJaW50IGM7CiAKLQkJZGVidWdfcHJpbnRrKCgicmVzZXR0aW5nIGNsaWVudCAlZCBwb3J0ICVkXG4iLCBtZGV2LT5jbGllbnQsIG1kZXYtPnBvcnQpKTsKIAkJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CiAJCWV2LmRlc3QuY2xpZW50ID0gbWRldi0+Y2xpZW50OwogCQlldi5kZXN0LnBvcnQgPSBtZGV2LT5wb3J0OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfcmVhZHEuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3JlYWRxLmMKaW5kZXggNzM2NjFjNC4uNjU0ZDE3YSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfcmVhZHEuYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19yZWFkcS5jCkBAIC00OCwxMiArNDgsMTIgQEAKIAlzdHJ1Y3Qgc2VxX29zc19yZWFkcSAqcTsKIAogCWlmICgocSA9IGt6YWxsb2Moc2l6ZW9mKCpxKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgbWFsbG9jIHJlYWQgcXVldWVcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyByZWFkIHF1ZXVlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKChxLT5xID0ga2NhbGxvYyhtYXhsZW4sIHNpemVvZih1bmlvbiBldnJlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IG1hbGxvYyByZWFkIHF1ZXVlIGJ1ZmZlclxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIHJlYWQgcXVldWUgYnVmZmVyXG4iKTsKIAkJa2ZyZWUocSk7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCmluZGV4IGM1Yjc3M2EuLjcwMWZlYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICgocmVjID0ga3phbGxvYyhzaXplb2YoKnJlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IG1hbGxvYyBzeW50aCBpbmZvXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBtYWxsb2Mgc3ludGggaW5mb1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlyZWMtPnNlcV9kZXZpY2UgPSAtMTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogCWlmIChpID49IG1heF9zeW50aF9kZXZzKSB7CiAJCWlmIChtYXhfc3ludGhfZGV2cyA+PSBTTkRSVl9TRVFfT1NTX01BWF9TWU5USF9ERVZTKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBtb3JlIHN5bnRoIHNsb3RcbiIpOworCQkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBubyBtb3JlIHN5bnRoIHNsb3RcbiIpOwogCQkJa2ZyZWUocmVjKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xMzgsNyArMTM4LDYgQEAKIAl9CiAJcmVjLT5zZXFfZGV2aWNlID0gaTsKIAlzeW50aF9kZXZzW2ldID0gcmVjOwotCWRlYnVnX3ByaW50aygoInN5bnRoICVzIHJlZ2lzdGVyZWQgJWRcbiIsIHJlYy0+bmFtZSwgaSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKIAlkZXYtPmRyaXZlcl9kYXRhID0gcmVjOwogI2lmZGVmIFNORFJWX09TU19JTkZPX0RFVl9TWU5USApAQCAtMTYzLDcgKzE2Miw3IEBACiAJfQogCWlmIChpbmRleCA+PSBtYXhfc3ludGhfZGV2cykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IHVucmVnaXN0ZXIgc3ludGhcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IHVucmVnaXN0ZXIgc3ludGhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3ludGhfZGV2c1tpbmRleF0gPSBOVUxMOwpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJCWlmIChpbmZvLT5ucl92b2ljZXMgPiAwKSB7CiAJCQlpbmZvLT5jaCA9IGtjYWxsb2MoaW5mby0+bnJfdm9pY2VzLCBzaXplb2Yoc3RydWN0IHNlcV9vc3NfY2hpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWluZm8tPmNoKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IG1hbGxvY1xuIik7CisJCQkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBDYW5ub3QgbWFsbG9jIHZvaWNlc1xuIik7CiAJCQkJcmVjLT5vcGVyLmNsb3NlKCZpbmZvLT5hcmcpOwogCQkJCW1vZHVsZV9wdXQocmVjLT5vcGVyLm93bmVyKTsKIAkJCQlzbmRfdXNlX2xvY2tfZnJlZSgmcmVjLT51c2VfbG9jayk7CkBAIC0yNTYsNyArMjU1LDYgQEAKIAkJCX0KIAkJCXJlc2V0X2NoYW5uZWxzKGluZm8pOwogCQl9Ci0JCWRlYnVnX3ByaW50aygoInN5bnRoICVkIGFzc2lnbmVkXG4iLCBpKSk7CiAJCWluZm8tPm9wZW5lZCsrOwogCQlyZWMtPm9wZW5lZCsrOwogCQlkcC0+c3ludGhfb3BlbmVkKys7CkBAIC0zMjYsNyArMzI0LDYgQEAKIAkJCWlmIChyZWMgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKIAkJCWlmIChyZWMtPm9wZW5lZCA+IDApIHsKLQkJCQlkZWJ1Z19wcmludGsoKCJzeW50aCAlZCBjbG9zZWRcbiIsIGkpKTsKIAkJCQlyZWMtPm9wZXIuY2xvc2UoJmluZm8tPmFyZyk7CiAJCQkJbW9kdWxlX3B1dChyZWMtPm9wZXIub3duZXIpOwogCQkJCXJlYy0+b3BlbmVkID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc190aW1lci5jCmluZGV4IGFiNTljYmYuLjRmMjRlYTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfdGltZXIuYwpAQCAtMjMzLDcgKzIzMyw2IEBACiAJaW50IHZhbHVlOwogCiAJaWYgKGNtZCA9PSBTTkRDVExfU0VRX0NUUkxSQVRFKSB7Ci0JCWRlYnVnX3ByaW50aygoImN0cmwgcmF0ZVxuIikpOwogCQkvKiBpZiAqYXJnID09IDAsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgKi8KIAkJaWYgKGdldF91c2VyKHZhbHVlLCBhcmcpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNDgsMjEgKzI0NywxNiBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORENUTF9UTVJfU1RBUlQ6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHN0YXJ0XG4iKSk7CiAJCXJldHVybiBzbmRfc2VxX29zc190aW1lcl9zdGFydCh0aW1lcik7CiAJY2FzZSBTTkRDVExfVE1SX1NUT1A6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHN0b3BcbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3RpbWVyX3N0b3AodGltZXIpOwogCWNhc2UgU05EQ1RMX1RNUl9DT05USU5VRToKLQkJZGVidWdfcHJpbnRrKCgidGltZXIgY29udGludWVcbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3RpbWVyX2NvbnRpbnVlKHRpbWVyKTsKIAljYXNlIFNORENUTF9UTVJfVEVNUE86Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHRlbXBvXG4iKSk7CiAJCWlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gc25kX3NlcV9vc3NfdGltZXJfdGVtcG8odGltZXIsIHZhbHVlKTsKIAljYXNlIFNORENUTF9UTVJfVElNRUJBU0U6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIHRpbWViYXNlXG4iKSk7CiAJCWlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAodmFsdWUgPCBNSU5fT1NTX1RJTUVCQVNFKQpAQCAtMjc2LDcgKzI3MCw2IEBACiAJY2FzZSBTTkRDVExfVE1SX01FVFJPTk9NRToKIAljYXNlIFNORENUTF9UTVJfU0VMRUNUOgogCWNhc2UgU05EQ1RMX1RNUl9TT1VSQ0U6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIFhYWFxuIikpOwogCQkvKiBub3Qgc3VwcG9ydGVkICovCiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCA0ZGM2YmFlLi45Y2E1ZTY0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudHB0cihpbnQgY2xpZW50aWQpCiB7CiAJaWYgKGNsaWVudGlkIDwgMCB8fCBjbGllbnRpZCA+PSBTTkRSVl9TRVFfTUFYX0NMSUVOVFMpIHsKLQkJc25kX3ByaW50ZCgiU2VxOiBvb3BzLiBUcnlpbmcgdG8gZ2V0IHBvaW50ZXIgdG8gY2xpZW50ICVkXG4iLAorCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBvb3BzLiBUcnlpbmcgdG8gZ2V0IHBvaW50ZXIgdG8gY2xpZW50ICVkXG4iLAogCQkJICAgY2xpZW50aWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMzYsNyArMTM2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudDsKIAogCWlmIChjbGllbnRpZCA8IDAgfHwgY2xpZW50aWQgPj0gU05EUlZfU0VRX01BWF9DTElFTlRTKSB7Ci0JCXNuZF9wcmludGQoIlNlcTogb29wcy4gVHJ5aW5nIHRvIGdldCBwb2ludGVyIHRvIGNsaWVudCAlZFxuIiwKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogb29wcy4gVHJ5aW5nIHRvIGdldCBwb2ludGVyIHRvIGNsaWVudCAlZFxuIiwKIAkJCSAgIGNsaWVudGlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjkxLDggKzI5MSw4IEBACiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCXN3aXRjaCAoY2xpZW50LT50eXBlKSB7CiAJY2FzZSBOT19DTElFTlQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJTZXE6IFRyeWluZyB0byBmcmVlIHVudXNlZCBjbGllbnQgJWRcbiIsCi0JCQkgICBjbGllbnQtPm51bWJlcik7CisJCXByX3dhcm4oIkFMU0E6IHNlcTogVHJ5aW5nIHRvIGZyZWUgdW51c2VkIGNsaWVudCAlZFxuIiwKKwkJCWNsaWVudC0+bnVtYmVyKTsKIAkJYnJlYWs7CiAJY2FzZSBVU0VSX0NMSUVOVDoKIAljYXNlIEtFUk5FTF9DTElFTlQ6CkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTZXE6IFRyeWluZyB0byBmcmVlIGNsaWVudCAlZCB3aXRoIHVuZGVmaW5lZCB0eXBlID0gJWRcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBUcnlpbmcgdG8gZnJlZSBjbGllbnQgJWQgd2l0aCB1bmRlZmluZWQgdHlwZSA9ICVkXG4iLAogCQkJICAgY2xpZW50LT5udW1iZXIsIGNsaWVudC0+dHlwZSk7CiAJfQogCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwpAQCAtNzczLDcgKzc3Myw3IEBACiBzdGF0aWMgaW50IG11bHRpY2FzdF9ldmVudChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgc3RydWN0IHNuZF9zZXFfZXZlbnQgKmV2ZW50LAogCQkJICAgaW50IGF0b21pYywgaW50IGhvcCkKIHsKLQlzbmRfcHJpbnRkKCJzZXE6IG11bHRpY2FzdCBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOworCXByX2RlYnVnKCJBTFNBOiBzZXE6IG11bHRpY2FzdCBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwogCXJldHVybiAwOyAvKiBpZ25vcmVkICovCiB9CiAjZW5kaWYgLyogU1VQUE9SVF9CUk9BRENBU1QgKi8KQEAgLTc5NCw3ICs3OTQsNyBAQAogCiAJaG9wKys7CiAJaWYgKGhvcCA+PSBTTkRSVl9TRVFfTUFYX0hPUFMpIHsKLQkJc25kX3ByaW50ZCgidG9vIGxvbmcgZGVsaXZlcnkgcGF0aCAoJWQ6JWQtPiVkOiVkKVxuIiwKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogdG9vIGxvbmcgZGVsaXZlcnkgcGF0aCAoJWQ6JWQtPiVkOiVkKVxuIiwKIAkJCSAgIGV2ZW50LT5zb3VyY2UuY2xpZW50LCBldmVudC0+c291cmNlLnBvcnQsCiAJCQkgICBldmVudC0+ZGVzdC5jbGllbnQsIGV2ZW50LT5kZXN0LnBvcnQpOwogCQlyZXR1cm4gLUVNTElOSzsKQEAgLTIxOTYsNyArMjE5Niw3IEBACiAJCWlmIChwLT5jbWQgPT0gY21kKQogCQkJcmV0dXJuIHAtPmZ1bmMoY2xpZW50LCBhcmcpOwogCX0KLQlzbmRfcHJpbnRkKCJzZXEgdW5rbm93biBpb2N0bCgpIDB4JXggKHR5cGU9JyVjJywgbnVtYmVyPTB4JTAyeClcbiIsCisJcHJfZGVidWcoIkFMU0E6IHNlcSB1bmtub3duIGlvY3RsKCkgMHgleCAodHlwZT0nJWMnLCBudW1iZXI9MHglMDJ4KVxuIiwKIAkJICAgY21kLCBfSU9DX1RZUEUoY21kKSwgX0lPQ19OUihjbWQpKTsKIAlyZXR1cm4gLUVOT1RUWTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYwppbmRleCAwNDBjNjBlLi45MWE3ODZhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogLyoKICAqIHJlZ2lzdGVyIGEgc2VxdWVuY2VyIGRldmljZQotICogY2FyZCA9IGNhcmQgaW5mbyAoTlVMTCBhbGxvd2VkKQorICogY2FyZCA9IGNhcmQgaW5mbwogICogZGV2aWNlID0gZGV2aWNlIG51bWJlciAoaWYgYW55KQogICogaWQgPSBpZCBvZiBkcml2ZXIKICAqIHJlc3VsdCA9IHJldHVybiBwb2ludGVyIChOVUxMIGFsbG93ZWQgaWYgdW5uZWNlc3NhcnkpCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImRyaXZlcl9yZWdpc3RlcjogZHJpdmVyICclcycgYWxyZWFkeSBleGlzdHNcbiIsIGlkKTsKKwkJcHJfd2FybigiQUxTQTogc2VxOiBkcml2ZXJfcmVnaXN0ZXI6IGRyaXZlciAnJXMnIGFscmVhZHkgZXhpc3RzXG4iLCBpZCk7CiAJCXVubG9ja19kcml2ZXIob3BzKTsKIAkJc25kX3NlcV9hdXRvbG9hZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM5OCw3ICszOTgsNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCWlmICghIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpIHx8CiAJICAgIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0NLRUQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRyaXZlcl91bnJlZ2lzdGVyOiBjYW5ub3QgdW5sb2FkIGRyaXZlciAnJXMnOiBzdGF0dXM9JXhcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBkcml2ZXJfdW5yZWdpc3RlcjogY2Fubm90IHVubG9hZCBkcml2ZXIgJyVzJzogc3RhdHVzPSV4XG4iLAogCQkJICAgaWQsIG9wcy0+ZHJpdmVyKTsKIAkJdW5sb2NrX2RyaXZlcihvcHMpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAKIAlvcHMtPmRyaXZlciA9IDA7CiAJaWYgKG9wcy0+bnVtX2luaXRfZGV2aWNlcyA+IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImZyZWVfZHJpdmVyOiBpbml0X2RldmljZXMgPiAwISEgKCVkKVxuIiwKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGZyZWVfZHJpdmVyOiBpbml0X2RldmljZXMgPiAwISEgKCVkKVxuIiwKIAkJCSAgIG9wcy0+bnVtX2luaXRfZGV2aWNlcyk7CiAJbXV0ZXhfdW5sb2NrKCZvcHMtPnJlZ19tdXRleCk7CiAKQEAgLTQ1OSw3ICs0NTksNyBAQAogCWlmIChkZXYtPnN0YXR1cyAhPSBTTkRSVl9TRVFfREVWSUNFX0ZSRUUpCiAJCXJldHVybiAwOyAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCiAJaWYgKG9wcy0+YXJnc2l6ZSAhPSBkZXYtPmFyZ3NpemUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW5jb21wYXRpYmxlIGRldmljZSAnJXMnIGZvciBwbHVnLWluICclcycgKCVkICVkKVxuIiwKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGluY29tcGF0aWJsZSBkZXZpY2UgJyVzJyBmb3IgcGx1Zy1pbiAnJXMnICglZCAlZClcbiIsCiAJCQkgICBkZXYtPm5hbWUsIG9wcy0+aWQsIG9wcy0+YXJnc2l6ZSwgZGV2LT5hcmdzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJCWRldi0+c3RhdHVzID0gU05EUlZfU0VRX0RFVklDRV9SRUdJU1RFUkVEOwogCQlvcHMtPm51bV9pbml0X2RldmljZXMrKzsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbml0X2RldmljZSBmYWlsZWQ6ICVzOiAlc1xuIiwKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGluaXRfZGV2aWNlIGZhaWxlZDogJXM6ICVzXG4iLAogCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlkKTsKIAl9CiAKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCWlmIChkZXYtPnN0YXR1cyAhPSBTTkRSVl9TRVFfREVWSUNFX1JFR0lTVEVSRUQpCiAJCXJldHVybiAwOyAvKiBub3QgcmVnaXN0ZXJlZCAqLwogCWlmIChvcHMtPmFyZ3NpemUgIT0gZGV2LT5hcmdzaXplKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImluY29tcGF0aWJsZSBkZXZpY2UgJyVzJyBmb3IgcGx1Zy1pbiAnJXMnICglZCAlZClcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBpbmNvbXBhdGlibGUgZGV2aWNlICclcycgZm9yIHBsdWctaW4gJyVzJyAoJWQgJWQpXG4iLAogCQkJICAgZGV2LT5uYW1lLCBvcHMtPmlkLCBvcHMtPmFyZ3NpemUsIGRldi0+YXJnc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ5NSw3ICs0OTUsNyBAQAogCQlkZXYtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAkJb3BzLT5udW1faW5pdF9kZXZpY2VzLS07CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZnJlZV9kZXZpY2UgZmFpbGVkOiAlczogJXNcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBmcmVlX2RldmljZSBmYWlsZWQ6ICVzOiAlc1xuIiwKIAkJCSAgIGRldi0+bmFtZSwgZGV2LT5pZCk7CiAJfQogCkBAIC01NTksNyArNTU5LDcgQEAKIAlzbmRfaW5mb19mcmVlX2VudHJ5KGluZm9fZW50cnkpOwogI2VuZGlmCiAJaWYgKG51bV9vcHMpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRyaXZlcnMgbm90IHJlbGVhc2VkICglZClcbiIsIG51bV9vcHMpOworCQlwcl9lcnIoIkFMU0E6IHNlcTogZHJpdmVycyBub3QgcmVsZWFzZWQgKCVkKVxuIiwgbnVtX29wcyk7CiB9CiAKIG1vZHVsZV9pbml0KGFsc2Ffc2VxX2RldmljZV9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwppbmRleCBkYmM1NTA3Li5lYzY2N2YxIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJaW50IGk7CiAKIAlpZiAocG9ydHMgPCAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgbnVtYmVyIG9mIHBvcnRzICVkXG4iLCBwb3J0cyk7CisJCXByX2VycigiQUxTQTogc2VxX2R1bW15OiBpbnZhbGlkIG51bWJlciBvZiBwb3J0cyAlZFxuIiwgcG9ydHMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZmlmby5jCmluZGV4IDBkNzVhZmEuLjU1OTk4OTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYwpAQCAtMzQsNyArMzQsNyBAQAogCiAJZiA9IGt6YWxsb2Moc2l6ZW9mKCpmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX2ZpZm9fbmV3KCkgXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9maWZvX25ldygpIFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMKaW5kZXggMmNmZTUwYy4uM2I2OTNlOSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbG9jay5jCkBAIC0zMSwxMiArMzEsMTIgQEAKIAlpbnQgbWF4X2NvdW50ID0gNSAqIEhaOwogCiAJaWYgKGF0b21pY19yZWFkKGxvY2twKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VxX2xvY2s6IGxvY2sgdHJvdWJsZSBbY291bnRlciA9ICVkXSBpbiAlczolZFxuIiwgYXRvbWljX3JlYWQobG9ja3ApLCBmaWxlLCBsaW5lKTsKKwkJcHJfd2FybigiQUxTQTogc2VxX2xvY2s6IGxvY2sgdHJvdWJsZSBbY291bnRlciA9ICVkXSBpbiAlczolZFxuIiwgYXRvbWljX3JlYWQobG9ja3ApLCBmaWxlLCBsaW5lKTsKIAkJcmV0dXJuOwogCX0KIAl3aGlsZSAoYXRvbWljX3JlYWQobG9ja3ApID4gMCkgewogCQlpZiAobWF4X2NvdW50ID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJzZXFfbG9jazogdGltZW91dCBbJWQgbGVmdF0gaW4gJXM6JWRcbiIsIGF0b21pY19yZWFkKGxvY2twKSwgZmlsZSwgbGluZSk7CisJCQlwcl93YXJuKCJBTFNBOiBzZXFfbG9jazogdGltZW91dCBbJWQgbGVmdF0gaW4gJXM6JWRcbiIsIGF0b21pY19yZWFkKGxvY2twKSwgZmlsZSwgbGluZSk7CiAJCQlicmVhazsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwppbmRleCBmNDc4Zjc3Li4xZTIwNmRlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9vbC0+cHRyID09IE5VTEwpIHsJLyogbm90IGluaXRpYWxpemVkICovCi0JCXNuZF9wcmludGQoInNlcTogcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBwb29sIGlzIG5vdCBpbml0aWFsaXplZFxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CkBAIC0zODgsNyArMzg4LDcgQEAKIAogCXBvb2wtPnB0ciA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc2VxX2V2ZW50X2NlbGwpICogcG9vbC0+c2l6ZSk7CiAJaWYgKHBvb2wtPnB0ciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNlcTogbWFsbG9jIGZvciBzZXF1ZW5jZXIgZXZlbnRzIGZhaWxlZFxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmb3Igc2VxdWVuY2VyIGV2ZW50cyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogCiAJd2hpbGUgKGF0b21pY19yZWFkKCZwb29sLT5jb3VudGVyKSA+IDApIHsKIAkJaWYgKG1heF9jb3VudCA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAic25kX3NlcV9wb29sX2RvbmUgdGltZW91dDogJWQgY2VsbHMgcmVtYWluXG4iLCBhdG9taWNfcmVhZCgmcG9vbC0+Y291bnRlcikpOworCQkJcHJfd2FybigiQUxTQTogc25kX3NlcV9wb29sX2RvbmUgdGltZW91dDogJWQgY2VsbHMgcmVtYWluXG4iLCBhdG9taWNfcmVhZCgmcG9vbC0+Y291bnRlcikpOwogCQkJYnJlYWs7CiAJCX0KIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkvKiBjcmVhdGUgcG9vbCBibG9jayAqLwogCXBvb2wgPSBremFsbG9jKHNpemVvZigqcG9vbCksIEdGUF9LRVJORUwpOwogCWlmIChwb29sID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic2VxOiBtYWxsb2MgZmFpbGVkIGZvciBwb29sXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3IgcG9vbFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYwppbmRleCA2NDA2OWRiLi4zZTA1YzU1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaWYgKCh0bXAgPSBydW50aW1lLT5hdmFpbCkgPCBjb3VudCkgewogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiTUlESSBvdXRwdXQgYnVmZmVyIG92ZXJydW5cbiIpOworCQkJcHJfZXJyKCJBTFNBOiBzZXFfbWlkaTogTUlESSBvdXRwdXQgYnVmZmVyIG92ZXJydW5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKHNuZF9yYXdtaWRpX2tlcm5lbF93cml0ZShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpIDwgY291bnQpCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlpZiAoZXYtPnR5cGUgPT0gU05EUlZfU0VRX0VWRU5UX1NZU0VYKSB7CS8qIHNwZWNpYWwgY2FzZSwgdG8gc2F2ZSBzcGFjZSAqLwogCQlpZiAoKGV2LT5mbGFncyAmIFNORFJWX1NFUV9FVkVOVF9MRU5HVEhfTUFTSykgIT0gU05EUlZfU0VRX0VWRU5UX0xFTkdUSF9WQVJJQUJMRSkgewogCQkJLyogaW52YWxpZCBldmVudCAqLwotCQkJc25kX3ByaW50ZCgic2VxX21pZGk6IGludmFsaWQgc3lzZXggZXZlbnQgZmxhZ3MgPSAweCV4XG4iLCBldi0+ZmxhZ3MpOworCQkJcHJfZGVidWcoIkFMU0E6IHNlcV9taWRpOiBpbnZhbGlkIHN5c2V4IGV2ZW50IGZsYWdzID0gMHgleFxuIiwgZXYtPmZsYWdzKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXNuZF9zZXFfZHVtcF92YXJfZXZlbnQoZXYsIChzbmRfc2VxX2R1bXBfZnVuY190KWR1bXBfbWlkaSwgc3Vic3RyZWFtKTsKQEAgLTE4OSw3ICsxODksNyBAQAogCQkJCQkgICBtc3ludGgtPnN1YmRldmljZSwKIAkJCQkJICAgU05EUlZfUkFXTUlESV9MRkxHX0lOUFVULAogCQkJCQkgICAmbXN5bnRoLT5pbnB1dF9yZmlsZSkpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJtaWRpIGlucHV0IG9wZW4gZmFpbGVkISEhXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcV9taWRpOiBtaWRpIGlucHV0IG9wZW4gZmFpbGVkISEhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcnVudGltZSA9IG1zeW50aC0+aW5wdXRfcmZpbGUuaW5wdXQtPnJ1bnRpbWU7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAkJCQkJICAgbXN5bnRoLT5zdWJkZXZpY2UsCiAJCQkJCSAgIFNORFJWX1JBV01JRElfTEZMR19PVVRQVVQsCiAJCQkJCSAgICZtc3ludGgtPm91dHB1dF9yZmlsZSkpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJtaWRpIG91dHB1dCBvcGVuIGZhaWxlZCEhIVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaTogbWlkaSBvdXRwdXQgb3BlbiBmYWlsZWQhISFcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jCmluZGV4IDZmNjQ0NzEuLjliNjQ3MGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2VtdWwuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAlpbnQgZGVzdF9jaGFubmVsID0gMDsKIAogCWlmIChldiA9PSBOVUxMIHx8IGNoYW5zZXQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJldiBvciBjaGFuYmFzZSBOVUxMIChzbmRfbWlkaV9wcm9jZXNzX2V2ZW50KVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaV9lbXVsOiBldiBvciBjaGFuYmFzZSBOVUxMIChzbmRfbWlkaV9wcm9jZXNzX2V2ZW50KVxuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGNoYW5zZXQtPmNoYW5uZWxzID09IE5VTEwpCkBAIC05OCw3ICs5OCw3IEBACiAJaWYgKHNuZF9zZXFfZXZfaXNfY2hhbm5lbF90eXBlKGV2KSkgewogCQlkZXN0X2NoYW5uZWwgPSBldi0+ZGF0YS5ub3RlLmNoYW5uZWw7CiAJCWlmIChkZXN0X2NoYW5uZWwgPj0gY2hhbnNldC0+bWF4X2NoYW5uZWxzKSB7Ci0JCQlzbmRfcHJpbnRkKCJkZXN0IGNoYW5uZWwgaXMgJWQsIG1heCBpcyAlZFxuIiwKKwkJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaV9lbXVsOiBkZXN0IGNoYW5uZWwgaXMgJWQsIG1heCBpcyAlZFxuIiwKIAkJCQkgICBkZXN0X2NoYW5uZWwsIGNoYW5zZXQtPm1heF9jaGFubmVscyk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIzMiw3ICsyMzIsNyBAQAogCWNhc2UgU05EUlZfU0VRX0VWRU5UX0VDSE86CiAJbm90X3lldDoKIAlkZWZhdWx0OgotCQkvKnNuZF9wcmludGQoIlVuaW1wbGVtZW50ZWQgZXZlbnQgJWRcbiIsIGV2LT50eXBlKTsqLworCQkvKnByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaV9lbXVsOiBVbmltcGxlbWVudGVkIGV2ZW50ICVkXG4iLCBldi0+dHlwZSk7Ki8KIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwppbmRleCA5NTE2ZTVjLi43OTRhMzQxIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwpAQCAtMTM1LDE0ICsxMzUsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoY2xpZW50LT5udW1fcG9ydHMgPj0gU05EUlZfU0VRX01BWF9QT1JUUyAtIDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInRvbyBtYW55IHBvcnRzIGZvciBjbGllbnQgJWRcbiIsIGNsaWVudC0+bnVtYmVyKTsKKwkJcHJfd2FybigiQUxTQTogc2VxOiB0b28gbWFueSBwb3J0cyBmb3IgY2xpZW50ICVkXG4iLCBjbGllbnQtPm51bWJlcik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIGNyZWF0ZSBhIG5ldyBwb3J0ICovCiAJbmV3X3BvcnQgPSBremFsbG9jKHNpemVvZigqbmV3X3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBuZXdfcG9ydCkgewotCQlzbmRfcHJpbnRkKCJtYWxsb2MgZmFpbGVkIGZvciByZWdpc3RlcmluZyBjbGllbnQgcG9ydFxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHJlZ2lzdGVyaW5nIGNsaWVudCBwb3J0XG4iKTsKIAkJcmV0dXJuIE5VTEw7CS8qIGZhaWx1cmUsIG91dCBvZiBtZW1vcnkgKi8KIAl9CiAJLyogaW5pdCBwb3J0IGRhdGEgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKaW5kZXggMjk4OTZhYi4uMDIxYjAyYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogCWYgPSBremFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpOwogCWlmIChmID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9wcmlvcV9uZXcoKVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfcHJpb3FfbmV3KClcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJCkBAIC03OSw3ICs3OSw3IEBACiAJKmZpZm8gPSBOVUxMOwogCiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2RlbGV0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBzbmRfc2VxX3ByaW9xX2RlbGV0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJY3VyID0gY3VyLT5uZXh0OwogCQlpZiAoISAtLWNvdW50KSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmLT5sb2NrLCBmbGFncyk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCBhIHBvaW50ZXIuLiBpbmZpbml0ZSBsb29wP1xuIik7CisJCQlwcl9lcnIoIkFMU0E6IHNlcTogY2Fubm90IGZpbmQgYSBwb2ludGVyLi4gaW5maW5pdGUgbG9vcD9cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMjMsNyArMjIzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZi0+bG9jaywgZmxhZ3MpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiBpbnQgc25kX3NlcV9wcmlvcV9hdmFpbChzdHJ1Y3Qgc25kX3NlcV9wcmlvcSAqIGYpCiB7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gZi0+Y2VsbHM7CkBAIC0yNTksNyArMjU5LDcgQEAKIHN0cnVjdCBzbmRfc2VxX2V2ZW50X2NlbGwgKnNuZF9zZXFfcHJpb3FfY2VsbF9wZWVrKHN0cnVjdCBzbmRfc2VxX3ByaW9xICogZikKIHsKIAlpZiAoZiA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoIm9vcHM6IHNuZF9zZXFfcHJpb3FfY2VsbF9pbigpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldHVybiBmLT5oZWFkOwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJCQlmcmVlcHJldiA9IGNlbGw7CiAJCX0gZWxzZSB7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgInR5cGUgPSAlaSwgc291cmNlID0gJWksIGRlc3QgPSAlaSwgIgorCQkJcHJfZGVidWcoIkFMU0E6IHNlcTogdHlwZSA9ICVpLCBzb3VyY2UgPSAlaSwgZGVzdCA9ICVpLCAiCiAJCQkgICAgICAgImNsaWVudCA9ICVpXG4iLAogCQkJCWNlbGwtPmV2ZW50LnR5cGUsCiAJCQkJY2VsbC0+ZXZlbnQuc291cmNlLmNsaWVudCwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMKaW5kZXggZjkwNzczNi4uYWFkNDg3OCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJcSA9IGt6YWxsb2Moc2l6ZW9mKCpxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHEgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX3F1ZXVlX25ldygpXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9xdWV1ZV9uZXcoKVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYwppbmRleCAyNGQ0NGIyLi5lNzM2MDUzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYwpAQCAtNTcsNyArNTcsNyBAQAogCQogCXRtciA9IGt6YWxsb2Moc2l6ZW9mKCp0bXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAodG1yID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgibWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV90aW1lcl9uZXcoKSBcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX3RpbWVyX25ldygpIFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmdG1yLT5sb2NrKTsKQEAgLTc4LDcgKzc4LDcgQEAKIAkqdG1yID0gTlVMTDsKIAogCWlmICh0ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogc25kX3NlcV90aW1lcl9kZWxldGUoKSBjYWxsZWQgd2l0aCBOVUxMIHRpbWVyXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV90aW1lcl9kZWxldGUoKSBjYWxsZWQgd2l0aCBOVUxMIHRpbWVyXG4iKTsKIAkJcmV0dXJuOwogCX0KIAl0LT5ydW5uaW5nID0gMDsKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkvKiByZWZ1c2UgdG8gY2hhbmdlIHBwcSBvbiBydW5uaW5nIHRpbWVycyAqLwogCQkvKiBiZWNhdXNlIGl0IHdpbGwgdXBzZXQgdGhlIHNvbmcgcG9zaXRpb24gKHRpY2tzKSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0bXItPmxvY2ssIGZsYWdzKTsKLQkJc25kX3ByaW50ZCgic2VxOiBjYW5ub3QgY2hhbmdlIHBwcSBvZiBhIHJ1bm5pbmcgdGltZXJcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBjYW5ub3QgY2hhbmdlIHBwcSBvZiBhIHJ1bm5pbmcgdGltZXJcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjUyLDcgKzI1Miw3IEBACiAKIAkvKiBGSVhNRSAqLwogCWlmIChiYXNlICE9IFNLRVdfQkFTRSkgewotCQlzbmRfcHJpbnRkKCJpbnZhbGlkIHNrZXcgYmFzZSAweCV4XG4iLCBiYXNlKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogaW52YWxpZCBza2V3IGJhc2UgMHgleFxuIiwgYmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdG1yLT5sb2NrLCBmbGFncyk7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJfQogCX0KIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzZXEgZmF0YWwgZXJyb3I6IGNhbm5vdCBjcmVhdGUgdGltZXIgKCVpKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXEgZmF0YWwgZXJyb3I6IGNhbm5vdCBjcmVhdGUgdGltZXIgKCVpKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJdC0+Y2FsbGJhY2sgPSBzbmRfc2VxX3RpbWVyX2ludGVycnVwdDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCmluZGV4IDRiNTBlNjAuLjU2ZTBmNGNkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQkvKiBzaG91bGQgY2hlY2sgcHJlc2VuY2Ugb2YgcG9ydCBtb3JlIHN0cmljdGx5Li4gKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2VxX21vZGUgaXMgbm90IHNldDogJWRcbiIsIHJkZXYtPnNlcV9tb2RlKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfdmlybWlkaTogc2VxX21vZGUgaXMgbm90IHNldDogJWRcbiIsIHJkZXYtPnNlcV9tb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZC5jIGIvc291bmQvY29yZS9zb3VuZC5jCmluZGV4IDQzN2MyNWUuLjM4YWQxYTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmQuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCWlmIChtcmVnICYmIG1yZWctPnR5cGUgPT0gdHlwZSkgewogCQlwcml2YXRlX2RhdGEgPSBtcmVnLT5wcml2YXRlX2RhdGE7CiAJCWlmIChwcml2YXRlX2RhdGEgJiYgbXJlZy0+Y2FyZF9wdHIpCi0JCQlhdG9taWNfaW5jKCZtcmVnLT5jYXJkX3B0ci0+cmVmY291bnQpOworCQkJZ2V0X2RldmljZSgmbXJlZy0+Y2FyZF9wdHItPmNhcmRfZGV2KTsKIAl9IGVsc2UKIAkJcHJpdmF0ZV9kYXRhID0gTlVMTDsKIAltdXRleF91bmxvY2soJnNvdW5kX211dGV4KTsKQEAgLTM1NSwyMiArMzU1LDI1IEBACiAKIEVYUE9SVF9TWU1CT0woc25kX3VucmVnaXN0ZXJfZGV2aWNlKTsKIAotaW50IHNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQorLyogZ2V0IHRoZSBhc3NpZ25lZCBkZXZpY2UgdG8gdGhlIGdpdmVuIHR5cGUgYW5kIGRldmljZSBudW1iZXI7CisgKiB0aGUgY2FsbGVyIG5lZWRzIHRvIHJlbGVhc2UgaXQgdmlhIHB1dF9kZXZpY2UoKSBhZnRlciB1c2luZyBpdAorICovCitzdHJ1Y3QgZGV2aWNlICpzbmRfZ2V0X2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KQogewotCWludCBtaW5vciwgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgZGV2aWNlICpkOworCWludCBtaW5vcjsKKwlzdHJ1Y3QgZGV2aWNlICpkID0gTlVMTDsKIAogCW11dGV4X2xvY2soJnNvdW5kX211dGV4KTsKIAltaW5vciA9IGZpbmRfc25kX21pbm9yKHR5cGUsIGNhcmQsIGRldik7Ci0JaWYgKG1pbm9yID49IDAgJiYgKGQgPSBzbmRfbWlub3JzW21pbm9yXS0+ZGV2KSAhPSBOVUxMKQotCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZCwgYXR0cik7CisJaWYgKG1pbm9yID49IDApIHsKKwkJZCA9IHNuZF9taW5vcnNbbWlub3JdLT5kZXY7CisJCWlmIChkKQorCQkJZ2V0X2RldmljZShkKTsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZzb3VuZF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLQorCXJldHVybiBkOwogfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUpOworRVhQT1JUX1NZTUJPTChzbmRfZ2V0X2RldmljZSk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogLyoKQEAgLTQ1OCw3ICs0NjEsNyBAQAogCXNuZF9tYWpvciA9IG1ham9yOwogCXNuZF9lY2FyZHNfbGltaXQgPSBjYXJkc19saW1pdDsKIAlpZiAocmVnaXN0ZXJfY2hyZGV2KG1ham9yLCAiYWxzYSIsICZzbmRfZm9wcykpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIG5hdGl2ZSBtYWpvciBkZXZpY2UgbnVtYmVyICVkXG4iLCBtYWpvcik7CisJCXByX2VycigiQUxTQSBjb3JlOiB1bmFibGUgdG8gcmVnaXN0ZXIgbmF0aXZlIG1ham9yIGRldmljZSBudW1iZXIgJWRcbiIsIG1ham9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmIChzbmRfaW5mb19pbml0KCkgPCAwKSB7CkBAIC00NjcsNyArNDcwLDcgQEAKIAl9CiAJc25kX2luZm9fbWlub3JfcmVnaXN0ZXIoKTsKICNpZm5kZWYgTU9EVUxFCi0JcHJpbnRrKEtFUk5fSU5GTyAiQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIERyaXZlciBJbml0aWFsaXplZC5cbiIpOworCXByX2luZm8oIkFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSBEcml2ZXIgSW5pdGlhbGl6ZWQuXG4iKTsKICNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZF9vc3MuYyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKaW5kZXggNzI2YTQ5YS4uNTczYTY1ZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZF9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpZmRlZiBDT05GSUdfU05EX09TU0VNVUwKIAotI2lmICFkZWZpbmVkKENPTkZJR19TT1VORCkgJiYgIShkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfU09VTkRfTU9EVUxFKSkKKyNpZiAhSVNfRU5BQkxFRChDT05GSUdfU09VTkQpCiAjZXJyb3IgIkVuYWJsZSB0aGUgT1NTIHNvdW5kY29yZSBtdWx0aXBsZXhlciAoQ09ORklHX1NPVU5EKSBpbiB0aGUga2VybmVsLiIKICNlbmRpZgogCkBAIC01NSw3ICs1NSw3IEBACiAJaWYgKG1yZWcgJiYgbXJlZy0+dHlwZSA9PSB0eXBlKSB7CiAJCXByaXZhdGVfZGF0YSA9IG1yZWctPnByaXZhdGVfZGF0YTsKIAkJaWYgKHByaXZhdGVfZGF0YSAmJiBtcmVnLT5jYXJkX3B0cikKLQkJCWF0b21pY19pbmMoJm1yZWctPmNhcmRfcHRyLT5yZWZjb3VudCk7CisJCQlnZXRfZGV2aWNlKCZtcmVnLT5jYXJkX3B0ci0+Y2FyZF9kZXYpOwogCX0gZWxzZQogCQlwcml2YXRlX2RhdGEgPSBOVUxMOwogCW11dGV4X3VubG9jaygmc291bmRfb3NzX211dGV4KTsKQEAgLTEwNSw4ICsxMDUsNyBAQAogfQogCiBpbnQgc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhLAotCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCisJCQkgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSkKIHsKIAlpbnQgbWlub3IgPSBzbmRfb3NzX2tlcm5lbF9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwogCWludCBtaW5vcl91bml0OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS90aW1lci5jIGIvc291bmQvY29yZS90aW1lci5jCmluZGV4IDZkZGNmMDYuLmNmZDQ1NWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3RpbWVyLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0hSVElNRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9IUlRJTUVSX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSFJUSU1FUikKICNkZWZpbmUgREVGQVVMVF9USU1FUl9MSU1JVCA0Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19TTkRfUlRDVElNRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9SVENUSU1FUl9NT0RVTEUpCisjZWxpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfUlRDVElNRVIpCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgMgogI2Vsc2UKICNkZWZpbmUgREVGQVVMVF9USU1FUl9MSU1JVCAxCkBAIC0yNDAsNyArMjQwLDggQEAKIAkJLyogb3BlbiBhIHNsYXZlIGluc3RhbmNlICovCiAJCWlmICh0aWQtPmRldl9zY2xhc3MgPD0gU05EUlZfVElNRVJfU0NMQVNTX05PTkUgfHwKIAkJICAgIHRpZC0+ZGV2X3NjbGFzcyA+IFNORFJWX1RJTUVSX1NDTEFTU19PU1NfU0VRVUVOQ0VSKSB7Ci0JCQlzbmRfcHJpbnRkKCJpbnZhbGlkIHNsYXZlIGNsYXNzICVpXG4iLCB0aWQtPmRldl9zY2xhc3MpOworCQkJcHJfZGVidWcoIkFMU0E6IHRpbWVyOiBpbnZhbGlkIHNsYXZlIGNsYXNzICVpXG4iLAorCQkJCSB0aWQtPmRldl9zY2xhc3MpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwpAQCAtNzc0LDcgKzc3NSw3IEBACiAJCSpydGltZXIgPSBOVUxMOwogCXRpbWVyID0ga3phbGxvYyhzaXplb2YoKnRpbWVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRpbWVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZXI6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CisJCXByX2VycigiQUxTQTogdGltZXI6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl0aW1lci0+dG1yX2NsYXNzID0gdGlkLT5kZXZfY2xhc3M7CkBAIC04MTMsNyArODE0LDcgQEAKIAlpZiAoISBsaXN0X2VtcHR5KCZ0aW1lci0+b3Blbl9saXN0X2hlYWQpKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwogCQlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aTsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInRpbWVyICVwIGlzIGJ1c3k/XG4iLCB0aW1lcik7CisJCXByX3dhcm4oIkFMU0E6IHRpbWVyICVwIGlzIGJ1c3k/XG4iLCB0aW1lcik7CiAJCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmdGltZXItPm9wZW5fbGlzdF9oZWFkKSB7CiAJCQlsaXN0X2RlbF9pbml0KHApOwogCQkJdGkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIG9wZW5fbGlzdCk7CkBAIC0xOTU1LDEyICsxOTU2LDEwIEBACiAjZW5kaWYKIAogCWlmICgoZXJyID0gc25kX3RpbWVyX3JlZ2lzdGVyX3N5c3RlbSgpKSA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBzeXN0ZW0gdGltZXIgKCVpKVxuIiwKLQkJCSAgIGVycik7CisJCXByX2VycigiQUxTQTogdW5hYmxlIHRvIHJlZ2lzdGVyIHN5c3RlbSB0aW1lciAoJWkpXG4iLCBlcnIpOwogCWlmICgoZXJyID0gc25kX3JlZ2lzdGVyX2RldmljZShTTkRSVl9ERVZJQ0VfVFlQRV9USU1FUiwgTlVMTCwgMCwKIAkJCQkgICAgICAgJnNuZF90aW1lcl9mX29wcywgTlVMTCwgInRpbWVyIikpIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIHRpbWVyIGRldmljZSAoJWkpXG4iLAotCQkJICAgZXJyKTsKKwkJcHJfZXJyKCJBTFNBOiB1bmFibGUgdG8gcmVnaXN0ZXIgdGltZXIgZGV2aWNlICglaSlcbiIsIGVycik7CiAJc25kX3RpbWVyX3Byb2NfaW5pdCgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS92bWFzdGVyLmMgYi9zb3VuZC9jb3JlL3ZtYXN0ZXIuYwppbmRleCA4NDJhOTdkLi42YzU4ZTZmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3ZtYXN0ZXIuYworKysgYi9zb3VuZC9jb3JlL3ZtYXN0ZXIuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJaWYgKHNsYXZlLT5pbmZvLmNvdW50ID4gMiAgfHwKIAkgICAgKHNsYXZlLT5pbmZvLnR5cGUgIT0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSICYmCiAJICAgICBzbGF2ZS0+aW5mby50eXBlICE9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBzbGF2ZSBlbGVtZW50XG4iKTsKKwkJcHJfZXJyKCJBTFNBOiB2bWFzdGVyOiBpbnZhbGlkIHNsYXZlIGVsZW1lbnRcbiIpOwogCQlrZnJlZSh1aW5mbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvYWxvb3AuYyBiL3NvdW5kL2RyaXZlcnMvYWxvb3AuYwppbmRleCBmNzU4OTkyLi4yYTE2Yzg2IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2Fsb29wLmMKKysrIGIvc291bmQvZHJpdmVycy9hbG9vcC5jCkBAIC0xMTQyLDggKzExNDIsOCBAQAogCWludCBkZXYgPSBkZXZwdHItPmlkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IGxvb3BiYWNrKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2cHRyLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBsb29wYmFjayksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlsb29wYmFjayA9IGNhcmQtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwppbmRleCA5MTViNGQ3Li5mYWI5MGJkIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMKKysrIGIvc291bmQvZHJpdmVycy9kdW1teS5jCkBAIC0xMDU0LDggKzEwNTQsOCBAQAogCWludCBpZHgsIGVycjsKIAlpbnQgZGV2ID0gZGV2cHRyLT5pZDsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2R1bW15KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2cHRyLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfZHVtbXkpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZHVtbXkgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xMTE0LDggKzExMTQsNiBAQAogCiAJZHVtbXlfcHJvY19pbml0KGR1bW15KTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPT0gMCkgewogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYyBiL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMKaW5kZXggOTVlYTRhMS4uMzNlZDc2NSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYworKysgYi9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jCkBAIC0xMjgwLDcgKzEyODAsOCBAQAogCWlmICghZW5hYmxlW2Rldl0pCiAJCXJldHVybiAtRU5PRU5UOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwZmRldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBzbmRfbWw0MDNfYWM5N2NyX2NyZWF0ZShjYXJkLCBwZmRldiwgJm1sNDAzX2FjOTdjcik7CkBAIC0xMzEwLDggKzEzMTEsNiBAQAogCQkodW5zaWduZWQgbG9uZyltbDQwM19hYzk3Y3ItPnBvcnQsIG1sNDAzX2FjOTdjci0+aXJxLAogCQltbDQwM19hYzk3Y3ItPmNhcHR1cmVfaXJxLCBkZXYgKyAxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBmZGV2LT5kZXYpOwotCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKaW5kZXggOTBhM2E3Yi4uODMwMTRiOCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKKysrIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKQEAgLTY0LDcgKzY0LDggQEAKIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9tcHU0MDFfZGV2aWNlczsKIAotc3RhdGljIGludCBzbmRfbXB1NDAxX2NyZWF0ZShpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipyY2FyZCkKK3N0YXRpYyBpbnQgc25kX21wdTQwMV9jcmVhdGUoc3RydWN0IGRldmljZSAqZGV2cHRyLCBpbnQgZGV2LAorCQkJICAgICBzdHJ1Y3Qgc25kX2NhcmQgKipyY2FyZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKQEAgLTczLDcgKzc0LDggQEAKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidGhlIHVhcnRfZW50ZXIgb3B0aW9uIGlzIG9ic29sZXRlOyByZW1vdmUgaXRcbiIpOwogCiAJKnJjYXJkID0gTlVMTDsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoZGV2cHRyLCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiTVBVLTQwMSBVQVJUIik7CkBAIC0xMTQsMTAgKzExNiw5IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInNwZWNpZnkgb3IgZGlzYWJsZSBJUlFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZXJyID0gc25kX21wdTQwMV9jcmVhdGUoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX21wdTQwMV9jcmVhdGUoJmRldnB0ci0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXZwdHItPmRldik7CiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC0xOTQsMTQgKzE5NSwxMyBAQAogCQllcnIgPSBzbmRfbXB1NDAxX3BucChkZXYsIHBucF9kZXYsIGlkKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSBzbmRfbXB1NDAxX2NyZWF0ZShkZXYsICZjYXJkKTsKKwkJZXJyID0gc25kX21wdTQwMV9jcmVhdGUoJnBucF9kZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwbnBfZGV2LT5kZXYpOwogCQlwbnBfc2V0X2RydmRhdGEocG5wX2RldiwgY2FyZCk7CiAJCXNuZF9tcHU0MDFfZGV2aWNlcysrOwogCQkrK2RldjsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXRwYXYuYyBiL3NvdW5kL2RyaXZlcnMvbXRwYXYuYwppbmRleCBlNWVjN2ViLi40YjY2YzdmIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL210cGF2LmMKKysrIGIvc291bmQvZHJpdmVycy9tdHBhdi5jCkBAIC02OTcsNyArNjk3LDggQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBtdHBhdiAqbXRwX2NhcmQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgc2l6ZW9mKCptdHBfY2FyZCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCptdHBfY2FyZCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNzMyLDcgKzczMyw2IEBACiAKIAlzbmRfbXRwYXZfcG9ydHNjYW4obXRwX2NhcmQpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT5kZXYpOwogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKG10cF9jYXJkLT5jYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBfX2Vycm9yOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tdHM2NC5jIGIvc291bmQvZHJpdmVycy9tdHM2NC5jCmluZGV4IDRlMGRkMjIuLmY1ZmQ0NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvbXRzNjQuYworKysgYi9zb3VuZC9kcml2ZXJzL210czY0LmMKQEAgLTk1OSw3ICs5NTksOCBAQAogCWlmICgoZXJyID0gc25kX210czY0X3Byb2JlX3BvcnQocCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRkKCJDYW5ub3QgY3JlYXRlIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTAwOSw4ICsxMDEwLDYgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKLQogCS8qIEF0IHRoaXMgcG9pbnQgY2FyZCB3aWxsIGJlIHVzYWJsZSAqLwogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQlzbmRfcHJpbnRkKCJDYW5ub3QgcmVnaXN0ZXIgY2FyZFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCmluZGV4IDMzZDlhODUuLmY2NmFmNTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCkBAIC01MDEsMTAgKzUwMSw4IEBACiAJaHctPnByaXZhdGVfZGF0YSA9IG9wbDM7CiAJaHctPmV4Y2x1c2l2ZSA9IDE7CiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCi0JaWYgKGRldmljZSA9PSAwKSB7CisJaWYgKGRldmljZSA9PSAwKQogCQlody0+b3NzX3R5cGUgPSBTTkRSVl9PU1NfREVWSUNFX1RZUEVfRE1GTTsKLQkJc3ByaW50Zihody0+b3NzX2RldiwgImRtZm0laSIsIGNhcmQtPm51bWJlcik7Ci0JfQogI2VuZGlmCiAJc3RyY3B5KGh3LT5uYW1lLCBody0+aWQpOwogCXN3aXRjaCAob3BsMy0+aGFyZHdhcmUgJiBPUEwzX0hXX01BU0spIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCmluZGV4IDc0MmE0YjYuLmRkY2MxYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRfZm0uaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TRVFVRU5DRVIpCiAjZGVmaW5lIE9QTDNfU1VQUE9SVF9TWU5USAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMgYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jCmluZGV4IDMyOGJkMjkuLjM2ODA4Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMKKysrIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJaHJ0aW1lcl9pbml0KCZwY3NwX2NoaXAudGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CiAJcGNzcF9jaGlwLnRpbWVyLmZ1bmN0aW9uID0gcGNzcF9kb190aW1lcjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMjcsOCArMTI3LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KHBjc3BfY2hpcC5jYXJkLCBkZXYpOwotCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlBDLVNwZWFrZXIiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAicGNzcCIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJJbnRlcm5hbCBQQy1TcGVha2VyIGF0IHBvcnQgMHgleCIsCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9pbnB1dC5jIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3BfaW5wdXQuYwppbmRleCBiODc0YjBhLi4wZWNmOGE0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9pbnB1dC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX2lucHV0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgInBjc3AuaCIKKyNpbmNsdWRlICJwY3NwX2lucHV0LmgiCiAKIHN0YXRpYyB2b2lkIHBjc3Brcl9kb19zb3VuZCh1bnNpZ25lZCBpbnQgY291bnQpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYyBiL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCmluZGV4IDk5MTAxOGQuLjc4Y2NmYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCkBAIC03NDgsNyArNzQ4LDggQEAKIAlpZiAoKGVyciA9IHNuZF9wb3J0bWFuX3Byb2JlX3BvcnQocCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRkKCJDYW5ub3QgY3JlYXRlIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNzk4LDggKzc5OSw2IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KIAkvKiBBdCB0aGlzIHBvaW50IGNhcmQgd2lsbCBiZSB1c2FibGUgKi8KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX3ByaW50ZCgiQ2Fubm90IHJlZ2lzdGVyIGNhcmRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwppbmRleCBlMGJmNWU3Li45YWQ0NDE0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYworKysgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwpAQCAtOTQyLDcgKzk0Miw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciAgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC05NjksOCArOTcwLDYgQEAKIAkJdWFydC0+YmFzZSwKIAkJdWFydC0+aXJxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKLQogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKIAkJZ290byBfZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Zpcm1pZGkuYyBiL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jCmluZGV4IGFjZTM4NzkuLmIxNzg3MjQyOSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92aXJtaWRpLmMKKysrIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKQEAgLTkwLDggKzkwLDggQEAKIAlpbnQgaWR4LCBlcnI7CiAJaW50IGRldiA9IGRldnB0ci0+aWQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3Zpcm1pZGkpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3Zpcm1pZGkpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJdm1pZGkgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xMTgsOCArMTE4LDYgQEAKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVmlyTUlESSIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJWaXJ0dWFsIE1JREkgQ2FyZCAlaSIsIGRldiArIDEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOwotCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPT0gMCkgewogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIGNhcmQpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2RpY2UuYyBiL3NvdW5kL2ZpcmV3aXJlL2RpY2UuYwppbmRleCBjMGFhNjQ5Li4wYzM5NDg2IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9kaWNlLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZGljZS5jCkBAIC0xMzI2LDEwICsxMzI2LDEwIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIE5VTEwsIFRISVNfTU9EVUxFLCBzaXplb2YoKmRpY2UpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZ1bml0LT5kZXZpY2UsIC0xLCBOVUxMLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqZGljZSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZ1bml0LT5kZXZpY2UpOwogCiAJZGljZSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlkaWNlLT5jYXJkID0gY2FyZDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jIGIvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKaW5kZXggZmQ0MmU2Yi4uN2FjOTQ0MyAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKKysrIGIvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKQEAgLTYzMSwxMCArNjMxLDEwIEBACiAJc3RydWN0IGlzaWdodCAqaXNpZ2h0OwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoLTEsIE5VTEwsIFRISVNfTU9EVUxFLCBzaXplb2YoKmlzaWdodCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnVuaXQtPmRldmljZSwgLTEsIE5VTEwsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCppc2lnaHQpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdW5pdC0+ZGV2aWNlKTsKIAogCWlzaWdodCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpc2lnaHQtPmNhcmQgPSBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvc2NzMXguYyBiL3NvdW5kL2ZpcmV3aXJlL3NjczF4LmMKaW5kZXggODU4MDIzYy4uMmRiYTg0OCAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvc2NzMXguYworKysgYi9zb3VuZC9maXJld2lyZS9zY3MxeC5jCkBAIC0zOTEsMTAgKzM5MSwxMCBAQAogCXN0cnVjdCBzY3MgKnNjczsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xNiwgTlVMTCwgVEhJU19NT0RVTEUsIHNpemVvZigqc2NzKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmdW5pdC0+ZGV2aWNlLCAtMTYsIE5VTEwsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCpzY3MpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdW5pdC0+ZGV2aWNlKTsKIAogCXNjcyA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlzY3MtPmNhcmQgPSBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYyBiL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMKaW5kZXggY2M4YmMzYS4uOWY3ZWYyMSAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYworKysgYi9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCkBAIC02NjgsMTAgKzY2OCwxMCBAQAogCXUzMiBmaXJtd2FyZTsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCBOVUxMLCBUSElTX01PRFVMRSwgc2l6ZW9mKCpmd3NwayksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnVuaXQtPmRldmljZSwgLTEsIE5VTEwsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCpmd3NwayksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZ1bml0LT5kZXZpY2UpOwogCiAJZndzcGsgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJZndzcGstPmNhcmQgPSBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExMy5jIGIvc291bmQvaTJjL290aGVyL2FrNDExMy5jCmluZGV4IGUwNGU3NTAuLjFhM2E2ZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCUFLNDExM19DSU5UIHwgQUs0MTEzX1NUQyk7CiAJY2hpcC0+cmNzMSA9IHJlZ19yZWFkKGNoaXAsIEFLNDExM19SRUdfUkNTMSk7CiAJY2hpcC0+cmNzMiA9IHJlZ19yZWFkKGNoaXAsIEFLNDExM19SRUdfUkNTMik7Ci0JZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfQ09ERUMsIGNoaXAsICZvcHMpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIF9fZmFpbDsKIApkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCmluZGV4IDE1YWUwMjUuLmM3ZjU2MzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCWNoaXAtPnJjczAgPSByZWdfcmVhZChjaGlwLCBBSzQxMTRfUkVHX1JDUzApICYgfihBSzQxMTRfUUlOVCB8IEFLNDExNF9DSU5UKTsKIAljaGlwLT5yY3MxID0gcmVnX3JlYWQoY2hpcCwgQUs0MTE0X1JFR19SQ1MxKTsKIAotCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKQorCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0NPREVDLCBjaGlwLCAmb3BzKSkgPCAwKQogCQlnb3RvIF9fZmFpbDsKIAogCWlmIChyX2FrNDExNCkKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYwppbmRleCA0MGUzM2M5Li44ODQ1MmU4IDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNy5jCkBAIC02Miw3ICs2Miw3IEBACiAKIHN0YXRpYyB2b2lkIHNuZF9hazQxMTdfZnJlZShzdHJ1Y3QgYWs0MTE3ICpjaGlwKQogewotCWRlbF90aW1lcigmY2hpcC0+dGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZjaGlwLT50aW1lcik7CiAJa2ZyZWUoY2hpcCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwppbmRleCAyNmNlMjZhLi5mNDgxYTQxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKKysrIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCkBAIC0xNDQsOCArMTQ0LDkgQEAKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJc3RydWN0IHNuZF90aW1lciAqdGltZXI7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9hZDE4MTZhKSwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LAorCQkJICAgICBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfYWQxODE2YSksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAJY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTE1NCw3ICsxNTUsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJaWYgKChlcnJvciA9IHNuZF9hZDE4MTZhX2NyZWF0ZShjYXJkLCBwb3J0W2Rldl0sCiAJCQkJCWlycVtkZXZdLApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKaW5kZXggZTNmNDU1YmQuLjA5M2YyMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYwpAQCAtOTEsNyArOTEsNyBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTE5LDggKzExOSw2IEBACiAJaWYgKHRoaW5rcGFkW25dKQogCQlzdHJjYXQoY2FyZC0+bG9uZ25hbWUsICIgW1RoaW5rcGFkXSIpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYpOwotCiAJZXJyb3IgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZGxpYi5jIGIvc291bmQvaXNhL2FkbGliLmMKaW5kZXggMzU2NTkyMS4uMTIwYzUyNCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkbGliLmMKKysrIGIvc291bmQvaXNhL2FkbGliLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApIHsKIAkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgY3JlYXRlIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC04Myw4ICs4Myw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCByZWdpc3RlciBjYXJkXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hbHMxMDAuYyBiL3NvdW5kL2lzYS9hbHMxMDAuYwppbmRleCAxMGYwOGExLi4zMmQwMTUyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWxzMTAwLmMKKysrIGIvc291bmQvaXNhL2FsczEwMC5jCkBAIC0xOTMsOCArMTkzLDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmRfYWxzMTAwICphY2FyZDsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FsczEwMCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgICAgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYWxzMTAwKSwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAlhY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTIwMyw3ICsyMDQsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJaWYgKHBpZC0+ZHJpdmVyX2RhdGEgPT0gU0JfSFdfRFQwMTlYKQogCQlkbWExNltkZXZdID0gLTE7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYXp0MjMyMC5jIGIvc291bmQvaXNhL2F6dDIzMjAuYwppbmRleCBkYjMwMWZmLi4wZWE3NWZjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYXp0MjMyMC5jCisrKyBiL3NvdW5kL2lzYS9henQyMzIwLmMKQEAgLTE4NCw4ICsxODQsOSBAQAogCXN0cnVjdCBzbmRfd3NzICpjaGlwOwogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXp0MjMyMCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgICAgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXp0MjMyMCksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAJYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xOTQsNyArMTk1LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCWlmICgoZXJyb3IgPSBzbmRfY2FyZF9henQyMzIwX2VuYWJsZV93c3MocG9ydFtkZXZdKSkpIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jbWk4MzI4LmMgYi9zb3VuZC9pc2EvY21pODMyOC5jCmluZGV4IGFiNmIyZGMuLjQ3Nzg4NTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jbWk4MzI4LmMKKysrIGIvc291bmQvaXNhL2NtaTgzMjguYwpAQCAtMjkzLDE1ICsyOTMsMTQgQEAKIAl9CiAJb3V0Yih2YWwsIHBvcnQpOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25kZXZdLCBpZFtuZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfY21pODMyOCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbbmRldl0sIGlkW25kZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2NtaTgzMjgpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY21pID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWNtaS0+Y2FyZCA9IGNhcmQ7CiAJY21pLT5wb3J0ID0gcG9ydDsKIAljbWktPndzc19jZmcgPSB2YWw7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAogCWVyciA9IHNuZF93c3NfY3JlYXRlKGNhcmQsIHBvcnQgKyA0LCAtMSwgaXJxW25kZXZdLCBkbWExW25kZXZdLAogCQkJZG1hMltuZGV2XSwgV1NTX0hXX0RFVEVDVCwgMCwgJmNtaS0+d3NzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jbWk4MzMwLmMgYi9zb3VuZC9pc2EvY21pODMzMC5jCmluZGV4IDI3MGI5NjUuLmRmZWRmZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jbWk4MzMwLmMKKysrIGIvc291bmQvaXNhL2NtaTgzMzAuYwpAQCAtNTE0LDE0ICs1MTQsMTUgQEAKIAogI2RlZmluZSBQRlgJImNtaTgzMzA6ICIKIAotc3RhdGljIGludCBzbmRfY21pODMzMF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX2NtaTgzMzBfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQlzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9jbWk4MzMwICphY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY21pODMzMCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jbWk4MzMwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZCBub3QgZ2V0IGEgbmV3IGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjM1LDEwICs2MzYsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NtaTgzMzBfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX2NtaTgzMzBfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9jbWk4MzMwX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjk4LDcgKzY5OCw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJCQkgICAgICAgCi0JcmVzID0gc25kX2NtaTgzMzBfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJcmVzID0gc25kX2NtaTgzMzBfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCWlmICgocmVzID0gc25kX2NtaTgzMzBfcG5wKGRldiwgY2FyZC0+cHJpdmF0ZV9kYXRhLCBwY2FyZCwgcGlkKSkgPCAwKSB7CkBAIC03MDYsNyArNzA2LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJaWYgKChyZXMgPSBzbmRfY21pODMzMF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCmluZGV4IGJhOWE3NGUuLjdkYmEwN2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKKysrIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYwpAQCAtOTUsNyArOTUsNyBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTM1LDggKzEzNSw2IEBACiAJCQlkZXZfd2FybihkZXYsICJNUFU0MDEgbm90IGRldGVjdGVkXG4iKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKaW5kZXggNjk2MTRhYy4uNzUwZjUxYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCkBAIC0zNjQsMTMgKzM2NCwxNCBAQAogCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoYWNhcmQtPnJlc19zYl9wb3J0KTsKIH0KIAotc3RhdGljIGludCBzbmRfY3M0MjN4X2NhcmRfbmV3KGludCBkZXYsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCBzbmRfY3M0MjN4X2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIGludCBkZXYsCisJCQkgICAgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2NzNDIzNiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2NzNDIzNiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9jczQyMzZfZnJlZTsKQEAgLTQ4NywxMCArNDg4LDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jczQyM3hfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX2NzNDIzeF9jYXJkX25ldyhwZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCWlmICgoZXJyID0gc25kX2NzNDIzeF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCQlpZiAoIXN0cmNtcChjZGV2LT5pZFswXS5pZCwgY2lkKSkKIAkJCWJyZWFrOwogCX0KLQllcnIgPSBzbmRfY3M0MjN4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9jczQyM3hfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZXJyID0gc25kX2NhcmRfY3M0MjN4X3BucChkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGRldiwgY2Rldik7CkBAIC01ODYsNyArNTg2LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9jczQyM3hfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC02MzgsNyArNjM3LDcgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJlcyA9IHNuZF9jczQyM3hfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJcmVzID0gc25kX2NzNDIzeF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAJaWYgKChyZXMgPSBzbmRfY2FyZF9jczQyM3hfcG5wYyhkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGNhcmQsIHBpZCkpIDwgMCkgewpAQCAtNjQ3LDcgKzY0Niw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgocmVzID0gc25kX2NzNDIzeF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMgYi9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCmluZGV4IGNkY2ZiNTcuLjc2MDAxZmUwIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCisrKyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMKQEAgLTE4Nyw4ICsxODcsOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2VzMTY4OCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2VzMTY4OCksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTE5Niw4ICsxOTYsNiBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYpOwotCiAJZXJyb3IgPSBzbmRfZXMxNjg4X3Byb2JlKGNhcmQsIG4pOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMjc0LDggKzI3Miw5IEBACiAJaWYgKGRldiA9PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9lczE2ODgpLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICAgIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF9lczE2ODgpLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0yODUsNyArMjg0LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAllcnJvciA9IHNuZF9lczE2ODhfcHJvYmUoY2FyZCwgZGV2KTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxOHh4LmMgYi9zb3VuZC9pc2EvZXMxOHh4LmMKaW5kZXggMTI5NzhiOC4uMWMxNjgzMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTh4eC5jCisrKyBiL3NvdW5kL2lzYS9lczE4eHguYwpAQCAtMjEwNSwxMCArMjEwNSwxMSBAQAogI2RlZmluZSBpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KQkJMAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgc25kX2VzMTh4eF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX2VzMTh4eF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBpbnQgZGV2LAorCQkJICAgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewotCXJldHVybiBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxOHh4KSwgY2FyZHApOworCXJldHVybiBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxOHh4KSwgY2FyZHApOwogfQogCiBzdGF0aWMgaW50IHNuZF9hdWRpb2RyaXZlX3Byb2JlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldikKQEAgLTIxNzksMTAgKzIxODAsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2VzMTh4eF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfZXMxOHh4X2NhcmRfbmV3KGRldnB0ciwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwogCWlmICgoZXJyID0gc25kX2F1ZGlvZHJpdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC0yMjg0LDE0ICsyMjg0LDEzIEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfZXMxOHh4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9lczE4eHhfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfYXVkaW9kcml2ZV9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9hdWRpb2RyaXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtMjM0Miw3ICsyMzQxLDcgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJlcyA9IHNuZF9lczE4eHhfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJcmVzID0gc25kX2VzMTh4eF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAKQEAgLTIzNTAsNyArMjM0OSw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgocmVzID0gc25kX2F1ZGlvZHJpdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jIGIvc291bmQvaXNhL2dhbGF4eS9nYWxheHkuYwppbmRleCA4MTI0NGU3Li4xZWIyYjFlIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jCisrKyBiL3NvdW5kL2lzYS9nYWxheHkvZ2FsYXh5LmMKQEAgLTUwNiwxMyArNTA2LDExIEBACiAJdTggdHlwZTsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIHNpemVvZiAqZ2FsYXh5LAotCQkJICAgICAgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKmdhbGF4eSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9nYWxheHlfZnJlZTsKIAlnYWxheHkgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jIGIvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKaW5kZXggMWFkYzFiOS4uN2NlMjlmZiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCXN0cnVjdCBzbmRfZ3VzX2NhcmQgKmd1czsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoZGV2LCBpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xOTksOCArMTk5LDYgQEAKIAkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSArIHN0cmxlbihjYXJkLT5sb25nbmFtZSksCiAJCQkiJiVkIiwgZ3VzLT5nZjEuZG1hMik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwppbmRleCAzOGUxZTMyLi4yOGExNjkzIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwpAQCAtMjQyLDggKzI0Miw4IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfZXMxNjg4KSwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxNjg4KSwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMzI4LDggKzMyOCw2IEBACiAJCSJpcnEgJWkmJWksIGRtYSAlaSYlaSIsIGVzMTY4OC0+cG9ydCwKIAkJZ3VzLT5nZjEuaXJxLCBlczE2ODgtPmlycSwgZ3VzLT5nZjEuZG1hMSwgZXMxNjg4LT5kbWE4KTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jIGIvc291bmQvaXNhL2d1cy9ndXNtYXguYwppbmRleCA2NTJkNWQ4Li4zOWRmMzZjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKQEAgLTIxNCw4ICsyMTQsOCBAQAogCXN0cnVjdCBzbmRfd3NzICp3c3M7CiAJc3RydWN0IHNuZF9ndXNtYXggKm1heGNhcmQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9ndXNtYXgpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfZ3VzbWF4KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9ndXNtYXhfZnJlZTsKQEAgLTMzNyw4ICszMzcsNiBAQAogCWlmICh4ZG1hMiA+PSAwKQogCQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwgIiYlaSIsIHhkbWEyKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7Ci0KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBfZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKaW5kZXggYWZlZjBkNy4uNWFiYmJlNCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCkBAIC02MjUsMTQgKzYyNSwxNSBAQAogCQlmcmVlX2lycShpd2NhcmQtPmlycSwgKHZvaWQgKilpd2NhcmQpOwogfQogCi1zdGF0aWMgaW50IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQkgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2ludGVyd2F2ZSAqaXdjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9pbnRlcndhdmUpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfaW50ZXJ3YXZlKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWl3Y2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTc3OSwxMSArNzgwLDEwIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoZGV2cHRyLCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAlpZiAoKGVyciA9IHNuZF9pbnRlcndhdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC04NzYsNyArODc2LDcgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAkJCQkKLQlyZXMgPSBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF9pbnRlcndhdmVfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC04ODQsNyArODg0LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJaWYgKChyZXMgPSBzbmRfaW50ZXJ3YXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jIGIvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jCmluZGV4IDBhOTBiZDYuLjUwMTZiZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYworKysgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMKQEAgLTkwNSwxMiArOTA1LDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX21zbmQpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbXNuZCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAljaGlwLT5jYXJkID0gY2FyZDsKIApAQCAtMTEyMiwxNCArMTEyMSwxNCBAQAogCSAqIENyZWF0ZSBhIG5ldyBBTFNBIHNvdW5kIGNhcmQgZW50cnksIGluIGFudGljaXBhdGlvbgogCSAqIG9mIGRldGVjdGluZyBvdXIgaGFyZHdhcmUgLi4uCiAJICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfbXNuZCksICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICBpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX21zbmQpLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWNoaXAtPmNhcmQgPSBjYXJkOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgb2ZmIHRoZSBJU0EgUG5QIGJ1cyAuLi4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcGwzc2EyLmMgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCmluZGV4IGNjMDFjNDEuLmEyMTliYzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtNjI3LDE0ICs2MjcsMTUgQEAKIAlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGNoaXAtPnJlc19wb3J0KTsKIH0KIAotc3RhdGljIGludCBzbmRfb3BsM3NhMl9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX29wbDNzYTJfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQlzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9vcGwzc2EyKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX29wbDNzYTIpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk9QTDNTQTIiKTsKQEAgLTczNywxNCArNzM4LDEzIEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfb3BsM3NhMl9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfb3BsM3NhMl9jYXJkX25ldygmcGRldi0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3BucChkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCWlmICgoZXJyID0gc25kX29wbDNzYTJfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC04MDIsMTQgKzgwMiwxMyBAQAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtODgzLDEwICs4ODIsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvbWlyby5jIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCmluZGV4IDYxOTc1M2QuLmMyY2E2ODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKQEAgLTE0MTEsOCArMTQxMSw4IEBACiAJc3RydWN0IHNuZF9taXJvICptaXJvOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbWlybyksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXZwdHIsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX21pcm8pLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xNDc5LDggKzE0NzksNiBAQAogCQl9CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwotCiAJZXJyb3IgPSBzbmRfbWlyb19wcm9iZShjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CkBAIC0xNTg0LDggKzE1ODIsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCWlmICghaXNhcG5wKQogCQlyZXR1cm4gLUVOT0RFVjsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9taXJvKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX21pcm8pLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE2MTIsNyArMTYxMCw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJZXJyID0gc25kX21pcm9fcHJvYmUoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCmluZGV4IDZlZmZlOTkuLmM5YjU4MjggMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYwpAQCAtOTM0LDEzICs5MzQsMTMgQEAKIAlyZXR1cm4gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbnQgc25kX29wdGk5eHhfY2FyZF9uZXcoc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9vcHRpOXh4X2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9vcHRpOXh4KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfb3B0aTl4eCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9vcHRpOXh4X2ZyZWU7CkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCX0KICNlbmRpZgogCi0JZXJyb3IgPSBzbmRfb3B0aTl4eF9jYXJkX25ldygmY2FyZCk7CisJZXJyb3IgPSBzbmRfb3B0aTl4eF9jYXJkX25ldyhkZXZwdHIsICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTEwMTgsNyArMTAxOCw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwogCWlmICgoZXJyb3IgPSBzbmRfb3B0aTl4eF9wcm9iZShjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKQEAgLTExMDAsNyArMTA5OSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJaWYgKCEgaXNhcG5wKQogCQlyZXR1cm4gLUVOT0RFVjsKLQllcnJvciA9IHNuZF9vcHRpOXh4X2NhcmRfbmV3KCZjYXJkKTsKKwllcnJvciA9IHNuZF9vcHRpOXh4X2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xMTMxLDcgKzExMzAsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgoZXJyb3IgPSBzbmRfb3B0aTl4eF9wcm9iZShjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9qYXp6MTYuYyBiL3NvdW5kL2lzYS9zYi9qYXp6MTYuYwppbmRleCAzNTZhNjMwLi45MGQyZWJhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2IvamF6ejE2LmMKKysrIGIvc291bmQvaXNhL3NiL2phenoxNi5jCkBAIC0yMjksOCArMjI5LDggQEAKIAlzdGF0aWMgaW50IHBvc3NpYmxlX2RtYXMxNltdID0gezUsIDcsIC0xfTsKIAlpbnQgZXJyLCB4aXJxLCB4ZG1hOCwgeGRtYTE2LCB4bXB1X3BvcnQsIHhtcHVfaXJxOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9qYXp6MTYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2phenoxNiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzI3LDggKzMyNyw2IEBACiAJCQkJCW1wdV9wb3J0W2Rldl0pOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl9mcmVlOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiMTYuYyBiL3NvdW5kL2lzYS9zYi9zYjE2LmMKaW5kZXggYTQxMzA5OS4uM2Y2OTQ1NCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiMTYuYworKysgYi9zb3VuZC9pc2Evc2Ivc2IxNi5jCkBAIC0zMjMsMTMgKzMyMywxNCBAQAogI2RlZmluZSBpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KQkJMAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgc25kX3NiMTZfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9zYjE2X2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKmRldnB0ciwgaW50IGRldiwKKwkJCSAgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3NiMTYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX3NiMTYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3NiMTZfZnJlZTsKQEAgLTQ5Myw3ICs0OTQsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX3NiMTZfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX3NiMTZfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTUwNyw3ICs1MDgsNiBAQAogCWF3ZV9wb3J0W2Rldl0gPSBwb3J0W2Rldl0gKyAweDQwMDsKICNlbmRpZgogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9zYjE2X3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjEzLDEwICs2MTMsOSBAQAogCWZvciAoIDsgZGV2IDwgU05EUlZfQ0FSRFM7IGRldisrKSB7CiAJCWlmICghZW5hYmxlW2Rldl0gfHwgIWlzYXBucFtkZXZdKQogCQkJY29udGludWU7Ci0JCXJlcyA9IHNuZF9zYjE2X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCQlyZXMgPSBzbmRfc2IxNl9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgZGV2LCAmY2FyZCk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIHJlczsKLQkJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJCWlmICgocmVzID0gc25kX2NhcmRfc2IxNl9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBjYXJkLCBwaWQpKSA8IDAgfHwKIAkJICAgIChyZXMgPSBzbmRfc2IxNl9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2I4LmMgYi9zb3VuZC9pc2Evc2Ivc2I4LmMKaW5kZXggYTgwNmFlOS4uNmMzMmIzYSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiOC5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjguYwpAQCAtMTAyLDggKzEwMiw4IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9zYjgpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfc2I4KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTkyLDggKzE5Miw2IEBACiAJCWNoaXAtPnBvcnQsCiAJCWlycVtkZXZdLCBkbWE4W2Rldl0pOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKLQogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKIAkJZ290byBfZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2M2MDAwLmMgYi9zb3VuZC9pc2Evc2M2MDAwLmMKaW5kZXggMDlkNDgxYi4uMTVhMTUyZSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NjNjAwMC5jCisrKyBiL3NvdW5kL2lzYS9zYzYwMDAuYwpAQCAtNTU5LDggKzU1OSw4IEBACiAJY2hhciBfX2lvbWVtICp2bXNzX3BvcnQ7CiAKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgc2l6ZW9mKHZwb3J0KSwKLQkJCQkmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YodnBvcnQpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTY2OCw4ICs2NjgsNiBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJHYWxsYW50IFNDLTYwMDAgYXQgMHglbHgsIGlycSAlZCwgZG1hICVkIiwKIAkJbXNzX3BvcnRbZGV2XSwgeGlycSwgeGRtYSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldnB0cik7Ci0KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfdW5tYXAyOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NzY2FwZS5jIGIvc291bmQvaXNhL3NzY2FwZS5jCmluZGV4IDU3YjMzODkuLjQ0NDA1ZGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zc2NhcGUuYworKysgYi9zb3VuZC9pc2Evc3NjYXBlLmMKQEAgLTExNjksOCArMTE2OSw4IEBACiAJc3RydWN0IHNvdW5kc2NhcGUgKnNzY2FwZTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZHNjYXBlKSwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc291bmRzY2FwZSksICZjYXJkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTE3OCw3ICsxMTc4LDYgQEAKIAlzc2NhcGUtPnR5cGUgPSBTU0NBUEU7CiAKIAlkbWFbZGV2XSAmPSAweDAzOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAKIAlyZXQgPSBjcmVhdGVfc3NjYXBlKGRldiwgY2FyZCk7CiAJaWYgKHJldCA8IDApCkBAIC0xMjU5LDggKzEyNTgsOSBAQAogCSAqIENyZWF0ZSBhIG5ldyBBTFNBIHNvdW5kIGNhcmQgZW50cnksIGluIGFudGljaXBhdGlvbgogCSAqIG9mIGRldGVjdGluZyBvdXIgaGFyZHdhcmUgLi4uCiAJICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZHNjYXBlKSwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzb3VuZHNjYXBlKSwgJmNhcmQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMjg4LDcgKzEyODgsNiBAQAogCQl3c3NfcG9ydFtpZHhdID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAxKTsKIAkJZG1hMltpZHhdID0gcG5wX2RtYShkZXYsIDEpOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCXJldCA9IGNyZWF0ZV9zc2NhcGUoaWR4LCBjYXJkKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCmluZGV4IDgyZGQ3NjkuLmJmYmYzOGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwpAQCAtMzM0LDE0ICszMzQsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgc25kX3dhdmVmcm9udF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX3dhdmVmcm9udF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBpbnQgZGV2LAorCQkJCSAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXNuZF93YXZlZnJvbnRfY2FyZF90ICphY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHNuZF93YXZlZnJvbnRfY2FyZF90KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzbmRfd2F2ZWZyb250X2NhcmRfdCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTY0LDEwICs1NjUsOSBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX3dhdmVmcm9udF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfd2F2ZWZyb250X2NhcmRfbmV3KHBkZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfd2F2ZWZyb250X3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXMgPSBzbmRfd2F2ZWZyb250X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF93YXZlZnJvbnRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC02MjMsNyArNjIzLDYgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCiAJaWYgKChyZXMgPSBzbmRfd2F2ZWZyb250X3Byb2JlKGNhcmQsIGRldikpIDwgMCkKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL21pcHMvYXUxeDAwLmMgYi9zb3VuZC9taXBzL2F1MXgwMC5jCmluZGV4IDIyNGY1NGIuLmE3Y2M0OWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvYXUxeDAwLmMKKysrIGIvc291bmQvbWlwcy9hdTF4MDAuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtOTgsNiArOTksNyBAQAogCiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW1bMl07CS8qIHBsYXliYWNrICYgY2FwdHVyZSAqLworCWludCBkbWFpZFsyXTsJCS8qIHR4KDApL3J4KDEpIERNQSBpZHMgKi8KIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2FsIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00NjUsMTUgKzQ2NywxNyBAQAogCXNwaW5fbG9ja19pbml0KCZhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXS0+ZG1hX2xvY2spOwogCiAJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCWlmICgoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1RYLAorCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKGF1MTAwMC0+ZG1haWRbMF0sCiAJCQkiQUM5NyBUWCIsIGF1MTAwMF9kbWFfaW50ZXJydXB0LCAwLAotCQkJYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSkgPCAwKSB7CisJCQlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pOworCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSA8IDApIHsKIAkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCWlmICgoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA9IHJlcXVlc3RfYXUxMDAwX2RtYShETUFfSURfQUM5N0NfUlgsCisJYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA9IHJlcXVlc3RfYXUxMDAwX2RtYShhdTEwMDAtPmRtYWlkWzFdLAogCQkJIkFDOTcgUlgiLCBhdTEwMDBfZG1hX2ludGVycnVwdCwgMCwKLQkJCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKSkgPCAwKXsKKwkJCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKTsKKwlpZiAoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA8IDApewogCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC01NTIsMjcgKzU1NiwxMTEgQEAKIAlzcGluX3VubG9jaygmYXUxMDAwLT5hYzk3X2xvY2spOwogfQogCi1zdGF0aWMgaW50Ci1zbmRfYXUxMDAwX2FjOTdfbmV3KHN0cnVjdCBzbmRfYXUxMDAwICphdTEwMDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXR1cCAvIERlc3Ryb3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF9hdTEwMDBfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNuZF9hdTEwMDAgKmF1MTAwMCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pIHsKKwkgIAlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEgPj0gMCkKKwkJCWZyZWVfYXUxMDAwX2RtYShhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSk7CisJCWtmcmVlKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXSk7CisJfQorCisJaWYgKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKSB7CisJCWlmIChhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXS0+ZG1hID49IDApCisJCQlmcmVlX2F1MTAwMF9kbWEoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSk7CisJCWtmcmVlKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKTsKKwl9CisKKwlpZiAoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KSB7CisJCS8qIHB1dCBpbnRlcm5hbCBBQzk3IGJsb2NrIGludG8gcmVzZXQgKi8KKwkJaWYgKGF1MTAwMC0+YWM5N19pb3BvcnQpIHsKKwkJCWF1MTAwMC0+YWM5N19pb3BvcnQtPmNudHJsID0gQUM5N0NfUlM7CisJCQlpb3VubWFwKGF1MTAwMC0+YWM5N19pb3BvcnQpOworCQkJYXUxMDAwLT5hYzk3X2lvcG9ydCA9IE5VTEw7CisJCX0KKwkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShhdTEwMDAtPmFjOTdfcmVzX3BvcnQpOworCQlhdTEwMDAtPmFjOTdfcmVzX3BvcnQgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIG9wcyA9IHsKKwkud3JpdGUJPSBzbmRfYXUxMDAwX2FjOTdfd3JpdGUsCisJLnJlYWQJPSBzbmRfYXUxMDAwX2FjOTdfcmVhZCwKK307CisKK3N0YXRpYyBpbnQgYXUxMDAwX2FjOTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgZXJyOworCXZvaWQgX19pb21lbSAqaW87CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2F1MTAwMCAqYXUxMDAwOwogCXN0cnVjdCBzbmRfYWM5N19idXMgKnBidXM7CiAJc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlIGFjOTc7Ci0gCXN0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBvcHMgPSB7Ci0JCS53cml0ZSA9IHNuZF9hdTEwMDBfYWM5N193cml0ZSwKLQkJLnJlYWQgPSBzbmRfYXUxMDAwX2FjOTdfcmVhZCwKLQl9OwogCi0JaWYgKChhdTEwMDAtPmFjOTdfcmVzX3BvcnQgPSByZXF1ZXN0X21lbV9yZWdpb24oQ1BIWVNBRERSKEFDOTdDX0NPTkZJRyksCi0JICAgICAgIAkJMHgxMDAwMDAsICJBdTF4MDAgQUM5NyIpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFMU0EgQUM5NzogY2FuJ3QgZ3JhcCBBQzk3IHBvcnRcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlhdTEwMDAtPmFjOTdfaW9wb3J0ID0gKHN0cnVjdCBhdTEwMDBfYWM5N19yZWcgKikKLQkJS1NFRzFBRERSKGF1MTAwMC0+YWM5N19yZXNfcG9ydC0+c3RhcnQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCAtMSwgIkFDOTciLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2F1MTAwMCksICZjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAorCWF1MTAwMCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlhdTEwMDAtPmNhcmQgPSBjYXJkOwogCXNwaW5fbG9ja19pbml0KCZhdTEwMDAtPmFjOTdfbG9jayk7CiAKKwkvKiBmcm9tIGhlcmUgb24gbGV0IEFMU0EgY2FsbCB0aGUgc3BlY2lhbCBmcmVlaW5nIGZ1bmN0aW9uICovCisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2F1MTAwMF9mcmVlOworCisJLyogVFggRE1BIElEICovCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFyKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJubyBUWCBETUEgcGxhdGZvcm0gcmVzb3VyY2UhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWF1MTAwMC0+ZG1haWRbMF0gPSByLT5zdGFydDsKKworCS8qIFJYIERNQSBJRCAqLworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOworCWlmICghcikgeworCQllcnIgPSAtRU5PREVWOworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAibm8gUlggRE1BIHBsYXRmb3JtIHJlc291cmNlIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlhdTEwMDAtPmRtYWlkWzFdID0gci0+c3RhcnQ7CisKKwlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fc3RyZWFtKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pCisJCWdvdG8gb3V0OworCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gLTE7CisKKwlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19zdHJlYW0pLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0pCisJCWdvdG8gb3V0OworCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPSAtMTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcikKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUJVU1k7CisJYXUxMDAwLT5hYzk3X3Jlc19wb3J0ID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LAorCQkJCQlyLT5lbmQgLSByLT5zdGFydCArIDEsIHBkZXYtPm5hbWUpOworCWlmICghYXUxMDAwLT5hYzk3X3Jlc19wb3J0KSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFMU0EgQUM5NzogY2FuJ3QgZ3JhYiBBQzk3IHBvcnRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbyA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFpbykKKwkJZ290byBvdXQ7CisKKwlhdTEwMDAtPmFjOTdfaW9wb3J0ID0gKHN0cnVjdCBhdTEwMDBfYWM5N19yZWcgKilpbzsKKwogCS8qIGNvbmZpZ3VyZSBwaW5zIGZvciBBQyc5NwogCVRPRE86IG1vdmUgdG8gYm9hcmRfc2V0dXAuYyAqLwogCWF1X3dyaXRlbChhdV9yZWFkbChTWVNfUElORlVOQykgJiB+MHgwMiwgU1lTX1BJTkZVTkMpOwpAQCAtNTkwLDEwNyArNjc4LDYyIEBACiAJbWRlbGF5KDUpOwogCiAJLyogSW5pdGlhbGlzZSBBQzk3IG1pZGRsZS1sYXllciAqLwotCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGF1MTAwMC0+Y2FyZCwgMCwgJm9wcywgYXUxMDAwLCAmcGJ1cykpIDwgMCkKLSAJCXJldHVybiBlcnI7CisJZXJyID0gc25kX2FjOTdfYnVzKGF1MTAwMC0+Y2FyZCwgMCwgJm9wcywgYXUxMDAwLCAmcGJ1cyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OwogCiAJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCWFjOTcucHJpdmF0ZV9kYXRhID0gYXUxMDAwOwotCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZhdTEwMDAtPmFjOTcpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXAgLyBEZXN0cm95IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkCi1zbmRfYXUxMDAwX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQotewotCXN0cnVjdCBzbmRfYXUxMDAwICphdTEwMDAgPSBjYXJkLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KSB7Ci0JCS8qIHB1dCBpbnRlcm5hbCBBQzk3IGJsb2NrIGludG8gcmVzZXQgKi8KLQkJYXUxMDAwLT5hYzk3X2lvcG9ydC0+Y250cmwgPSBBQzk3Q19SUzsKLQkJYXUxMDAwLT5hYzk3X2lvcG9ydCA9IE5VTEw7Ci0JCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KTsKLQl9Ci0KLQlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSB7Ci0JICAJaWYgKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID49IDApCi0JCQlmcmVlX2F1MTAwMF9kbWEoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEpOwotCQlrZnJlZShhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pOwotCX0KLQotCWlmIChhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkgewotCQlpZiAoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA+PSAwKQotCQkJZnJlZV9hdTEwMDBfZG1hKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEpOwotCQlrZnJlZShhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSk7Ci0JfQotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NhcmQgKmF1MTAwMF9jYXJkOwotCi1zdGF0aWMgaW50IF9faW5pdAotYXUxMDAwX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2F1MTAwMCAqYXUxMDAwOwotCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCAiQUM5NyIsIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfYXUxMDAwKSwgJmNhcmQpOworCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmYXUxMDAwLT5hYzk3KTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKLQljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfYXUxMDAwX2ZyZWU7Ci0JYXUxMDAwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwotCWF1MTAwMC0+Y2FyZCA9IGNhcmQ7Ci0KLQlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fc3RyZWFtKSwgR0ZQX0tFUk5FTCk7Ci0JYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRSBdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX3N0cmVhbSksIEdGUF9LRVJORUwpOwotCS8qIHNvIHRoYXQgc25kX2F1MTAwMF9mcmVlIHdpbGwgd29yayBhcyBpbnRlbmRlZCAqLwotIAlhdTEwMDAtPmFjOTdfcmVzX3BvcnQgPSBOVUxMOwotCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pCi0JCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gLTE7Ci0JaWYgKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkUgXSkKLQkJYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRSBdLT5kbWEgPSAtMTsKLQotCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPT0gTlVMTCB8fAotCSAgICBhdTEwMDAtPnN0cmVhbVtDQVBUVVJFIF0gPT0gTlVMTCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAoKGVyciA9IHNuZF9hdTEwMDBfYWM5N19uZXcoYXUxMDAwKSkgPCAwICkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICgoZXJyID0gc25kX2F1MTAwMF9wY21fbmV3KGF1MTAwMCkpIDwgMCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KKwllcnIgPSBzbmRfYXUxMDAwX3BjbV9uZXcoYXUxMDAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQXUxMDAwLUFDOTciKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQU1EIEF1MTAwMC1BQzk3Iik7CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIkFNRCBBdTEwMDAtLUFDOTcgQUxTQSBEcml2ZXIiKTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBTFNBIEFDOTc6IERyaXZlciBJbml0aWFsaXplZFxuIik7Ci0JYXUxMDAwX2NhcmQgPSBjYXJkOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKIAlyZXR1cm4gMDsKKworIG91dDoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhdTEwMDBfZXhpdCh2b2lkKQorc3RhdGljIGludCBhdTEwMDBfYWM5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzbmRfY2FyZF9mcmVlKGF1MTAwMF9jYXJkKTsKKwlyZXR1cm4gc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CiB9CiAKLW1vZHVsZV9pbml0KGF1MTAwMF9pbml0KTsKLW1vZHVsZV9leGl0KGF1MTAwMF9leGl0KTsKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXUxMDAwX2FjOTdjX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJhdTEwMDAtYWM5N2MiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhdTEwMDBfYWM5N19wcm9iZSwKKwkucmVtb3ZlCQk9IGF1MTAwMF9hYzk3X3JlbW92ZSwKK307CiAKK3N0YXRpYyBpbnQgX19pbml0IGF1MTAwMF9hYzk3X2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTEwMDBfYWM5N2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MTAwMF9hYzk3X3VubG9hZCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdTEwMDBfYWM5N2NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXUxMDAwX2FjOTdfbG9hZCk7Cittb2R1bGVfZXhpdChhdTEwMDBfYWM5N191bmxvYWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9oYWwyLmMgYi9zb3VuZC9taXBzL2hhbDIuYwppbmRleCAyYjdmNmU4Li4yMzQ0MWI5IDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL2hhbDIuYworKysgYi9zb3VuZC9taXBzL2hhbDIuYwpAQCAtODgwLDcgKzg4MCw3IEBACiAJc3RydWN0IHNuZF9oYWwyICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTg4OSw3ICs4ODksNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCiAJZXJyID0gaGFsMl9wY21fY3JlYXRlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCmluZGV4IGNmZTk5YWUuLjA0YmIwNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCisrKyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCkBAIC05MjAsNyArOTIwLDcgQEAKIAlzdHJ1Y3Qgc25kX3NnaW8yYXVkaW8gKmNoaXA7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwZGV2LT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTI5LDcgKzkyOSw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CiAKIAllcnIgPSBzbmRfc2dpbzJhdWRpb19uZXdfcGNtKGNoaXApOwogCWlmIChlcnIgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvS2NvbmZpZyBiL3NvdW5kL29zcy9LY29uZmlnCmluZGV4IDFhOTY0MDIuLjQ4NTY4ZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9LY29uZmlnCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC0xMywxNSArMTMsNiBAQAogCSAgbm90ZSB0aGF0IENPTkZJR19LR0RCIHNob3VsZCBub3QgYmUgZW5hYmxlZCBhdCB0aGUgc2FtZQogCSAgdGltZSwgc2luY2UgaXQgYWxzbyBhdHRlbXB0cyB0byB1c2UgdGhpcyBVQVJUIHBvcnQuCiAKLWNvbmZpZyBTT1VORF9WV1NORAotCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgotCWRlcGVuZHMgb24gWDg2X1ZJU1dTCi0JaGVscAotCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhbiBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIGFuZCB5b3Ugd2FudCB0byBiZQotCSAgYWJsZSB0byB1c2UgaXRzIG9uLWJvYXJkIGF1ZGlvLiAgUmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQ+IGZvciBtb3JlIGluZm8gb24gdGhpcyBkcml2ZXIncwotCSAgY2FwYWJpbGl0aWVzLgotCiBjb25maWcgU09VTkRfTVNORENMQVMKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIE11bHRpU291bmQgQ2xhc3NpYywgVGFoaXRpLCBNb250ZXJleSIKIAlkZXBlbmRzIG9uIChtIHx8ICFTVEFOREFMT05FKSAmJiBJU0EKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9NYWtlZmlsZSBiL3NvdW5kL29zcy9NYWtlZmlsZQppbmRleCA3N2YyMWI2Li45YmRiYmRlIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvTWFrZWZpbGUKKysrIGIvc291bmQvb3NzL01ha2VmaWxlCkBAIC0yNCw3ICsyNCw2IEBACiBvYmotJChDT05GSUdfU09VTkRfV0FWRUFSVElTVCkJKz0gd2F2ZWFydGlzdC5vCiBvYmotJChDT05GSUdfU09VTkRfTVNORENMQVMpCSs9IG1zbmQubyBtc25kX2NsYXNzaWMubwogb2JqLSQoQ09ORklHX1NPVU5EX01TTkRQSU4pCSs9IG1zbmQubyBtc25kX3Bpbm5hY2xlLm8KLW9iai0kKENPTkZJR19TT1VORF9WV1NORCkJKz0gdndzbmQubwogb2JqLSQoQ09ORklHX1NPVU5EX0JDTV9DUzQyOTdBKQkrPSBzd2FybV9jczQyOTdhLm8KIAogb2JqLSQoQ09ORklHX0RNQVNPVU5EKQkJKz0gZG1hc291bmQvCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMi5oIGIvc291bmQvb3NzL3BhczIuaAppbmRleCBmYTEyYzU1Li5kMTlmNzU3IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvcGFzMi5oCisrKyBiL3NvdW5kL29zcy9wYXMyLmgKQEAgLTE1LDMgKzE1LDYgQEAKIC8qCUZyb20gcGFzX21pZGkuYyAqLwogdm9pZCBwYXNfbWlkaV9pbml0KHZvaWQpOwogdm9pZCBwYXNfbWlkaV9pbnRlcnJ1cHQodm9pZCk7CisKKy8qCUZyb20gcGFzMl9taXhlci5jKi8KK3ZvaWQgbWl4X3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMl9jYXJkLmMgYi9zb3VuZC9vc3MvcGFzMl9jYXJkLmMKaW5kZXggNzAwNGUyNC4uYjA3OTU0YSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3BhczJfY2FyZC5jCisrKyBiL3NvdW5kL29zcy9wYXMyX2NhcmQuYwpAQCAtNzQsOCArNzQsNiBAQAogICogdG8gc3VwcG9ydCBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJhc2UgYWRkcmVzcwogICovCiAKLWV4dGVybiB2b2lkICAgICBtaXhfd3JpdGUodW5zaWduZWQgY2hhciBkYXRhLCBpbnQgaW9hZGRyKTsKLQogdW5zaWduZWQgY2hhciBwYXNfcmVhZChpbnQgaW9hZGRyKQogewogCXJldHVybiBpbmIoaW9hZGRyICsgcGFzX3RyYW5zbGF0ZV9jb2RlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92d3NuZC5jIGIvc291bmQvb3NzL3Z3c25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzdlOWMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL3Z3c25kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTA2ICswLDAgQEAKLS8qCi0gKiBTb3VuZCBkcml2ZXIgZm9yIFNpbGljb24gR3JhcGhpY3MgMzIwIGFuZCA1NDAgVmlzdWFsIFdvcmtzdGF0aW9ucycKLSAqIG9uYm9hcmQgYXVkaW8uICBTZWUgbm90ZXMgaW4gRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQgLgotICoKLSAqIENvcHlyaWdodCAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI3VuZGVmIFZXU05EX0RFQlVHCQkJLyogZGVmaW5lIGZvciBkZWJ1Z2dpbmcgKi8KLQotLyoKLSAqIFhYWCB0byBkbyAtCi0gKgotICoJRXh0ZXJuYWwgc3luYy4KLSAqCVJlbmFtZSBzd2J1ZiwgaHdidWYsIHUmaSwgaHdwdHImc3dwdHIgdG8gc29tZXRoaW5nIHJhdGlvbmFsLgotICoJQnVnIC0gaWYgc2VsZWN0KCkgY2FsbGVkIGJlZm9yZSByZWFkKCksIHBjbV9zZXR1cCgpIG5vdCBjYWxsZWQuCi0gKglCdWcgLSBvdXRwdXQgZG9lc24ndCBzdG9wIHNvb24gZW5vdWdoIGlmIHByb2Nlc3Mga2lsbGVkLgotICovCi0KLS8qCi0gKiBUaGluZ3MgdG8gdGVzdCAtCi0gKgotICoJV2lsbCByZWFkdi93cml0ZXYgd29yaz8gIFdyaXRlIGEgdGVzdC4KLSAqCi0gKglpbnNtb2Qvcm1tb2QgMTAwIG1pbGxpb24gdGltZXMuCi0gKgotICoJUnVuIEkvTyB1bnRpbCBpbnQgcHRycyB3cmFwIGFyb3VuZCAocm91Z2hseSA2LjIgaG91cnMgQCBEQVQKLSAqCXJhdGUpLgotICoKLSAqCUNvbmN1cnJlbnQgdGhyZWFkcyBiYW5naW5nIG9uIG1peGVyIHNpbXVsdGFuZW91c2x5LCBib3RoIFVQCi0gKglhbmQgU01QIGtlcm5lbHMuICBFc3BlY2lhbGx5LCB3YXRjaCBmb3IgdGhyZWFkIEEgY2hhbmdpbmcKLSAqCU9VVFNSQyB3aGlsZSB0aHJlYWQgQiBjaGFuZ2VzIGdhaW4gLS0gYm90aCB3cml0ZSB0byB0aGUgc2FtZQotICoJYWQxODQzIHJlZ2lzdGVyLgotICoKLSAqCVdoYXQgaGFwcGVucyBpZiBhIGNsaWVudCBvcGVucyAvZGV2L2F1ZGlvIHRoZW4gZm9ya3M/Ci0gKglEbyB0d28gcHJvY3MgaGF2ZSAvZGV2L2F1ZGlvIG9wZW4/ICBUZXN0LgotICoKLSAqCVB1bXAgYXVkaW8gdGhyb3VnaCB0aGUgQ0QsIE1JQyBhbmQgbGluZSBpbnB1dHMgYW5kIHZlcmlmeSB0aGF0Ci0gKgl0aGV5IG1peC9tdXRlIGludG8gdGhlIG91dHB1dC4KLSAqCi0gKglBcHBzOgotICoJCWFtcAotICoJCW1wZzEyMwotICoJCXgxMWFtcAotICoJCW14dgotICoJCWttZWRpYQotICoJCWVzb3VuZAotICoJCW5lZWQgbW9yZSBpbnB1dCBhcHBzCi0gKgotICoJUnVuIHRlc3RzIHdoaWxlIGJvbWJhcmRpbmcgd2l0aCBzaWduYWxzLiAgc2V0aXRpbWVyKDIpIHdpbGwgZG8gaXQuLi4gICovCi0KLS8qCi0gKiBUaGlzIGRyaXZlciBpcyBvcmdhbml6ZWQgaW4gbmluZSBzZWN0aW9ucy4KLSAqIFRoZSBuaW5lIHNlY3Rpb25zIGFyZToKLSAqCi0gKglkZWJ1ZyBzdHVmZgotICogCWxvdyBsZXZlbCBsaXRoaXVtIGFjY2VzcwotICoJaGlnaCBsZXZlbCBsaXRoaXVtIGFjY2VzcwotICoJQUQxODQzIGFjY2VzcwotICoJUENNIEkvTwotICoJYXVkaW8gZHJpdmVyCi0gKgltaXhlciBkcml2ZXIKLSAqCXByb2JlL2F0dGFjaC91bmxvYWQKLSAqCWluaXRpYWxpemF0aW9uIGFuZCBsb2FkYWJsZSBrZXJuZWwgbW9kdWxlIGludGVyZmFjZQotICoKLSAqIFRoYXQgaXMgcm91Z2hseSB0aGUgb3JkZXIgb2YgaW5jcmVhc2luZyBhYnN0cmFjdGlvbiwgc28gZm9yd2FyZAotICogZGVwZW5kZW5jaWVzIGFyZSBtaW5pbWFsLgotICovCi0KLS8qCi0gKiBMb2NraW5nIE5vdGVzCi0gKgotICoJSU5DX1VTRV9DT1VOVCBhbmQgREVDX1VTRV9DT1VOVCBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YKLSAqCW9wZW4gZGVzY3JpcHRvcnMgdG8gdGhpcyBkcml2ZXIuIFRoZXkgc3RvcmUgaXQgaW4gdndzbmRfdXNlX2NvdW50LgotICogCVRoZSBnbG9iYWwgZGV2aWNlIGxpc3QsIHZ3c25kX2Rldl9saXN0LAlpcyBpbW11dGFibGUgd2hlbiB0aGUgSU5fVVNFCi0gKglpcyB0cnVlLgotICoKLSAqCWRldmMtPm9wZW5fbG9jayBpcyBhIHNlbWFwaG9yZSB0aGF0IGlzIHVzZWQgdG8gZW5mb3JjZSB0aGUKLSAqCXNpbmdsZSByZWFkZXIvc2luZ2xlIHdyaXRlciBydWxlIGZvciAvZGV2L2F1ZGlvLiAgVGhlIHJ1bGUgaXMKLSAqCXRoYXQgZWFjaCBkZXZpY2UgbWF5IGhhdmUgYXQgbW9zdCBvbmUgcmVhZGVyIGFuZCBvbmUgd3JpdGVyLgotICoJT3BlbiB3aWxsIGJsb2NrIHVudGlsIHRoZSBwcmV2aW91cyBjbGllbnQgaGFzIGNsb3NlZCB0aGUKLSAqCWRldmljZSwgdW5sZXNzIE9fTk9OQkxPQ0sgaXMgc3BlY2lmaWVkLgotICoKLSAqCVRoZSBzZW1hcGhvcmUgZGV2Yy0+aW9fbXV0ZXggc2VyaWFsaXplcyBQQ00gSS9PIHN5c2NhbGxzLiAgVGhpcwotICoJaXMgdW5uZWNlc3NhcnkgaW4gTGludXggMi4yLCBiZWNhdXNlIHRoZSBrZXJuZWwgbG9jawotICoJc2VyaWFsaXplcyByZWFkLCB3cml0ZSwgYW5kIGlvY3RsIGdsb2JhbGx5LCBidXQgaXQncyB0aGVyZSwKLSAqCXJlYWR5IGZvciB0aGUgYnJhdmUsIG5ldyBwb3N0LWtlcm5lbC1sb2NrIHdvcmxkLgotICoKLSAqCUxvY2tpbmcgYmV0d2VlbiBpbnRlcnJ1cHQgYW5kIGJhc2VsZXZlbCBpcyBoYW5kbGVkIGJ5IHRoZQotICoJImxvY2siIHNwaW5sb2NrIGluIHZ3c25kX3BvcnQgKG9uZSBsb2NrIGVhY2ggZm9yIHJlYWQgYW5kCi0gKgl3cml0ZSkuICBFYWNoIGhhbGYgaG9sZHMgdGhlIGxvY2sganVzdCBsb25nIGVub3VnaCB0byBzZWUgd2hhdAotICoJYXJlYSBpdCBvd25zIGFuZCB1cGRhdGUgaXRzIHBvaW50ZXJzLiAgU2VlIHBjbV9vdXRwdXQoKSBhbmQKLSAqCXBjbV9pbnB1dCgpIGZvciBtb3N0IG9mIHRoZSBnb3J5IHN0dWZmLgotICoKLSAqCWRldmMtPm1peF9tdXRleCBzZXJpYWxpemVzIGFsbCBtaXhlciBpb2N0bHMuICBUaGlzIGlzIGFsc28KLSAqCXJlZHVuZGFudCBiZWNhdXNlIG9mIHRoZSBrZXJuZWwgbG9jay4KLSAqCi0gKglUaGUgbG93ZXN0IGxldmVsIGxvY2sgaXMgbGl0aC0+bGl0aGl1bV9sb2NrLiAgSXQgaXMgYQotICoJc3BpbmxvY2sgd2hpY2ggaXMgaGVsZCBkdXJpbmcgdGhlIHR3by1yZWdpc3RlciB0YW5nbyBvZgotICoJcmVhZGluZy93cml0aW5nIGFuIEFEMTg0MyByZWdpc3Rlci4gIFNlZQotICoJbGlfe3JlYWQsd3JpdGV9X2FkMTg0M19yZWcoKS4KLSAqLwotCi0vKgotICogU2FtcGxlIEZvcm1hdCBOb3RlcwotICoKLSAqCUxpdGhpdW0ncyBETUEgZW5naW5lIGhhcyB0d28gZm9ybWF0czogMTYtYml0IDIncyBjb21wbGVtZW50Ci0gKglhbmQgOC1iaXQgdW5zaWduZWQgLiAgMTYtYml0IHRyYW5zZmVycyB0aGUgZGF0YSB1bm1vZGlmaWVkLCAyCi0gKglieXRlcyBwZXIgc2FtcGxlLiAgOC1iaXQgdW5zaWduZWQgdHJhbnNmZXJzIDEgYnl0ZSBwZXIgc2FtcGxlCi0gKglhbmQgWE9ScyBlYWNoIGJ5dGUgd2l0aCAweDgwLiAgTGl0aGl1bSBjYW4gaW5wdXQgb3Igb3V0cHV0Ci0gKgllaXRoZXIgbW9ubyBvciBzdGVyZW8gaW4gZWl0aGVyIGZvcm1hdC4KLSAqCi0gKglUaGUgQUQxODQzIGhhcyBmb3VyIGZvcm1hdHM6IDE2LWJpdCAyJ3MgY29tcGxlbWVudCwgOC1iaXQKLSAqCXVuc2lnbmVkLCA4LWJpdCBtdS1MYXcgYW5kIDgtYml0IEEtTGF3LgotICoKLSAqCVRoaXMgZHJpdmVyIHN1cHBvcnRzIGZpdmUgZm9ybWF0czogQUZNVF9TOCwgQUZNVF9VOCwKLSAqCUFGTVRfTVVfTEFXLCBBRk1UX0FfTEFXLCBhbmQgQUZNVF9TMTZfTEUuCi0gKgotICoJRm9yIEFGTVRfVTggb3V0cHV0LCB3ZSBrZWVwIHRoZSBBRDE4NDMgaW4gMTYtYml0IG1vZGUsIGFuZAotICoJcmVseSBvbiBMaXRoaXVtJ3MgWE9SIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIFU4IGFuZCBTOC4KLSAqCi0gKglGb3IgQUZNVF9TOCwgQUZNVF9NVV9MQVcgYW5kIEFGTVRfQV9MQVcgb3V0cHV0LCB3ZSBoYXZlIHRvIFhPUgotICoJdGhlIDB4ODAgYml0IGluIHNvZnR3YXJlIHRvIGNvbXBlbnNhdGUgZm9yIExpdGhpdW0ncyBYT1IuCi0gKglUaGlzIGhhcHBlbnMgaW4gcGNtX2NvcHlfe2luLG91dH0oKS4KLSAqCi0gKiBDaGFuZ2VzOgotICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KLSAqCQlBZGRlZCBzb21lIF9faW5pdC9fX2V4aXQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS92aXN3cy9jb2JhbHQuaD4KLQotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi1zdGF0aWMgREVGSU5FX01VVEVYKHZ3c25kX211dGV4KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVidWcgc3R1ZmYgKi8KLQotI2lmZGVmIFZXU05EX0RFQlVHCi0KLXN0YXRpYyBpbnQgc2h1dF91cCA9IDE7Ci0KLS8qCi0gKiBkYmdhc3NlcnQgLSBjYWxsZWQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMuCi0gKi8KLQotc3RhdGljIHZvaWQgZGJnYXNzZXJ0KGNvbnN0IGNoYXIgKmZjbiwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmV4cHIpCi17Ci0JaWYgKGluX2ludGVycnVwdCgpKQotCQlwYW5pYygiQVNTRVJUSU9OIEZBSUxFRCBJTiBJTlRFUlJVUFQsICVzOiVzOiVkICVzXG4iLAotCQkgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKLQllbHNlIHsKLQkJaW50IHg7Ci0JCXByaW50ayhLRVJOX0VSUiAiQVNTRVJUSU9OIEZBSUxFRCwgJXM6JXM6JWQgJXNcbiIsCi0JCSAgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKLQkJeCA9ICogKHZvbGF0aWxlIGludCAqKSAwOyAvKiBmb3JjZSBwcm9jIHRvIGV4aXQgKi8KLQl9Ci19Ci0KLS8qCi0gKiBCdW5jaCBvZiB1c2VmdWwgZGVidWcgbWFjcm9zOgotICoKLSAqCUFTU0VSVAktIHByaW50IHVubGVzcyBlIG5vbnplcm8gKHBhbmljIGlmIGluIGludGVycnVwdCkKLSAqCURCR0RPCS0gaW5jbHVkZSBhcmJpdHJhcnkgY29kZSBpZiBkZWJ1Z2dpbmcKLSAqCURCR1gJLSBkZWJ1ZyBwcmludCByYXcgKHcvbyBmdW5jdGlvbiBuYW1lKQotICoJREJHUAktIGRlYnVnIHByaW50IHcvIGZ1bmN0aW9uIG5hbWUKLSAqCURCR0UJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiBlbnRyeQotICoJREJHQwktIGRlYnVnIHByaW50IGZ1bmN0aW9uIGNhbGwKLSAqCURCR1IJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiByZXR1cm4KLSAqCURCR1hWCS0gZGVidWcgcHJpbnQgcmF3IHdoZW4gdmVyYm9zZQotICoJREJHUFYJLSBkZWJ1ZyBwcmludCB3aGVuIHZlcmJvc2UKLSAqCURCR0VWCS0gZGVidWcgcHJpbnQgZnVuY3Rpb24gZW50cnkgd2hlbiB2ZXJib3NlCi0gKglEQkdSVgktIGRlYnVnIHByaW50IGZ1bmN0aW9uIHJldHVybiB3aGVuIHZlcmJvc2UKLSAqLwotCi0jZGVmaW5lIEFTU0VSVChlKSAgICAgICgoZSkgPyAodm9pZCkgMCA6IGRiZ2Fzc2VydChfX2Z1bmNfXywgX19MSU5FX18sICNlKSkKLSNkZWZpbmUgREJHRE8oeCkgICAgICAgICAgICB4Ci0jZGVmaW5lIERCR1goZm10LCBhcmdzLi4uKSAgKGluX2ludGVycnVwdCgpID8gMCA6IHByaW50ayhLRVJOX0VSUiBmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR1AoZm10LCBhcmdzLi4uKSAgKERCR1goIiVzOiAiIGZtdCwgX19mdW5jX18gLCAjI2FyZ3MpKQotI2RlZmluZSBEQkdFKGZtdCwgYXJncy4uLikgIChEQkdYKCIlcyIgZm10LCBfX2Z1bmNfXyAsICMjYXJncykpCi0jZGVmaW5lIERCR0MocnRuKSAgICAgICAgICAgKERCR1AoImNhbGxpbmcgJXNcbiIsIHJ0bikpCi0jZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKERCR1AoInJldHVybmluZ1xuIikpCi0jZGVmaW5lIERCR1hWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHWChmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR1BWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHUChmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHRShmbXQsICMjYXJncykpCi0jZGVmaW5lIERCR0NWKHJ0bikgICAgICAgICAgKHNodXRfdXAgPyAwIDogREJHQyhydG4pKQotI2RlZmluZSBEQkdSVigpICAgICAgICAgICAgIChzaHV0X3VwID8gMCA6IERCR1IoKSkKLQotI2Vsc2UgLyogIVZXU05EX0RFQlVHICovCi0KLSNkZWZpbmUgQVNTRVJUKGUpICAgICAgICAgICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgLyogZG9uJ3QgKi8KLSNkZWZpbmUgREJHWChmbXQsIGFyZ3MuLi4pICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR1AoZm10LCBhcmdzLi4uKSAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdFKGZtdCwgYXJncy4uLikgICgodm9pZCkgMCkKLSNkZWZpbmUgREJHQyhydG4pICAgICAgICAgICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdQVihmbXQsIGFyZ3MuLi4pICgodm9pZCkgMCkKLSNkZWZpbmUgREJHWFYoZm10LCBhcmdzLi4uKSAoKHZvaWQpIDApCi0jZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdDVihydG4pICAgICAgICAgICgodm9pZCkgMCkKLSNkZWZpbmUgREJHUlYoKSAgICAgICAgICAgICAoKHZvaWQpIDApCi0KLSNlbmRpZiAvKiAhVldTTkRfREVCVUcgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbG93IGxldmVsIGxpdGhpdW0gYWNjZXNzICovCi0KLS8qCi0gKiBXZSBuZWVkIHRvIHRhbGsgdG8gTGl0aGl1bSByZWdpc3RlcnMgb24gdGhyZWUgcGFnZXMuICBIZXJlIGFyZQotICogdGhlIHBhZ2VzJyBvZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcyAoMHhGRjAwMTAwMCkuCi0gKi8KLQotZW51bSB7Ci0JTElfUEFHRTBfT0ZGU0VUID0gMHgwMTAwMCAtIDB4MTAwMCwgLyogRkYwMDEwMDAgKi8KLQlMSV9QQUdFMV9PRkZTRVQgPSAweDBGMDAwIC0gMHgxMDAwLCAvKiBGRjAwRjAwMCAqLwotCUxJX1BBR0UyX09GRlNFVCA9IDB4MTAwMDAgLSAweDEwMDAsIC8qIEZGMDEwMDAwICovCi19OwotCi0vKiBsb3ctbGV2ZWwgbGl0aGl1bSBkYXRhICovCi0KLXR5cGVkZWYgc3RydWN0IGxpdGhpdW0gewotCXZvaWQgKgkJcGFnZTA7CQkvKiB2aXJ0dWFsIGFkZHJlc3NlcyAqLwotCXZvaWQgKgkJcGFnZTE7Ci0Jdm9pZCAqCQlwYWdlMjsKLQlzcGlubG9ja190CWxvY2s7CQkvKiBwcm90ZWN0cyBjb2RlYyBhbmQgVVNUL01TQyBhY2Nlc3MgKi8KLX0gbGl0aGl1bV90OwotCi0vKgotICogbGlfZGVzdHJveSBkZXN0cm95cyB0aGUgbGl0aGl1bV90IHN0cnVjdHVyZSBhbmQgdm0gbWFwcGluZ3MuCi0gKi8KLQotc3RhdGljIHZvaWQgbGlfZGVzdHJveShsaXRoaXVtX3QgKmxpdGgpCi17Ci0JaWYgKGxpdGgtPnBhZ2UwKSB7Ci0JCWlvdW5tYXAobGl0aC0+cGFnZTApOwotCQlsaXRoLT5wYWdlMCA9IE5VTEw7Ci0JfQotCWlmIChsaXRoLT5wYWdlMSkgewotCQlpb3VubWFwKGxpdGgtPnBhZ2UxKTsKLQkJbGl0aC0+cGFnZTEgPSBOVUxMOwotCX0KLQlpZiAobGl0aC0+cGFnZTIpIHsKLQkJaW91bm1hcChsaXRoLT5wYWdlMik7Ci0JCWxpdGgtPnBhZ2UyID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiBsaV9jcmVhdGUgaW5pdGlhbGl6ZXMgdGhlIGxpdGhpdW1fdCBzdHJ1Y3R1cmUgYW5kIHNldHMgdXAgdm0gbWFwcGluZ3MKLSAqIHRvIGFjY2VzcyB0aGUgcmVnaXN0ZXJzLgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGxpX2NyZWF0ZShsaXRoaXVtX3QgKmxpdGgsIHVuc2lnbmVkIGxvbmcgYmFzZWFkZHIpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmxpdGgtPmxvY2spOwotCWxpdGgtPnBhZ2UwID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTBfT0ZGU0VULCBQQUdFX1NJWkUpOwotCWxpdGgtPnBhZ2UxID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTFfT0ZGU0VULCBQQUdFX1NJWkUpOwotCWxpdGgtPnBhZ2UyID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTJfT0ZGU0VULCBQQUdFX1NJWkUpOwotCWlmICghbGl0aC0+cGFnZTAgfHwgIWxpdGgtPnBhZ2UxIHx8ICFsaXRoLT5wYWdlMikgewotCQlsaV9kZXN0cm95KGxpdGgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBiYXNpYyByZWdpc3RlciBhY2Nlc3NvcnMgLSByZWFkL3dyaXRlIGxvbmcvYnl0ZQotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbGlfcmVhZGwobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmKQotewotCXJldHVybiAqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoLT5wYWdlMCArIG9mZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgbGlfcmVhZGIobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmKQotewotCXJldHVybiAqICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChsaXRoLT5wYWdlMCArIG9mZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGVsKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9mZiwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aC0+cGFnZTAgKyBvZmYpID0gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpX3dyaXRlYihsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYsIHVuc2lnbmVkIGNoYXIgdmFsKQotewotCSogKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKSA9IHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSGlnaCBMZXZlbCBMaXRoaXVtIEFjY2VzcyAqLwotCi0vKgotICogTGl0aGl1bSBETUEgTm90ZXMKLSAqCi0gKiBMaXRoaXVtIGhhcyB0d28gZGVkaWNhdGVkIERNQSBjaGFubmVscyBmb3IgYXVkaW8uICBUaGV5IGFyZSBrbm93bgotICogYXMgY29tbTEgYW5kIGNvbW0yIChjb21tdW5pY2F0aW9uIGFyZWFzIDEgYW5kIDIpLiAgQ29tbTEgaXMgZm9yCi0gKiBpbnB1dCwgYW5kIGNvbW0yIGlzIGZvciBvdXRwdXQuICBFYWNoIGlzIGNvbnRyb2xsZWQgYnkgdGhyZWUKLSAqIHJlZ2lzdGVyczogQkFTRSAoYmFzZSBhZGRyZXNzKSwgQ0ZHIChjb25maWcpIGFuZCBDQ1RMCi0gKiAoY29uZmlnL2NvbnRyb2wpLgotICoKLSAqIEVhY2ggRE1BIGNoYW5uZWwgcG9pbnRzIHRvIGEgcGh5c2ljYWxseSBjb250aWd1b3VzIHJpbmcgYnVmZmVyIGluCi0gKiBtYWluIG1lbW9yeSBvZiB1cCB0byA4IEtieXRlcy4gIChUaGlzIGRyaXZlciBhbHdheXMgdXNlcyA4IEtiLikKLSAqIFRoZXJlIGFyZSB0aHJlZSBwb2ludGVycyBpbnRvIHRoZSByaW5nIGJ1ZmZlcjogcmVhZCwgd3JpdGUsIGFuZAotICogdHJpZ2dlci4gIFRoZSBwb2ludGVycyBhcmUgOCBiaXRzIGVhY2guICBFYWNoIHBvaW50ZXIgcG9pbnRzIHRvCi0gKiAzMi1ieXRlICJjaHVua3MiIG9mIGRhdGEuICBUaGUgRE1BIGVuZ2luZSBtb3ZlcyAzMiBieXRlcyBhdCBhIHRpbWUsCi0gKiBzbyB0aGVyZSBpcyBubyBmaW5lci1ncmFudWxhcml0eSBjb250cm9sLgotICoKLSAqIEluIGNvbW0xLCB0aGUgaGFyZHdhcmUgdXBkYXRlcyB0aGUgd3JpdGUgcHRyLCBhbmQgc29mdHdhcmUgdXBkYXRlcwotICogdGhlIHJlYWQgcHRyLiAgSW4gY29tbTIsIGl0J3MgdGhlIG9wcG9zaXRlOiBoYXJkd2FyZSB1cGRhdGVzIHRoZQotICogcmVhZCBwdHIsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzIHRoZSB3cml0ZSBwdHIuICBJIGRlc2lnbmF0ZSB0aGUKLSAqIGhhcmR3YXJlLXVwZGF0ZWQgcHRyIGFzIHRoZSBod3B0ciwgYW5kIHRoZSBzb2Z0d2FyZS11cGRhdGVkIHB0ciBhcwotICogdGhlIHN3cHRyLgotICoKLSAqIFRoZSB0cmlnZ2VyIHB0ciBhbmQgdHJpZ2dlciBtYXNrIGFyZSB1c2VkIHRvIHRyaWdnZXIgaW50ZXJydXB0cy4KLSAqIEZyb20gdGhlIExpdGhpdW0gc3BlYywgc2VjdGlvbiA1LjYuOCwgcmV2aXNpb24gb2YgMTIvMTUvMTk5ODoKLSAqCi0gKglUcmlnZ2VyIE1hc2sgVmFsdWUKLSAqCi0gKglBIHRocmVlIGJpdCB3aWRlIGZpZWxkIHRoYXQgcmVwcmVzZW50cyBhIHBvd2VyIG9mIHR3byBtYXNrCi0gKgl0aGF0IGlzIHVzZWQgd2hlbmV2ZXIgdGhlIHRyaWdnZXIgcG9pbnRlciBpcyBjb21wYXJlZCB0byBpdHMKLSAqCXJlc3BlY3RpdmUgcmVhZCBvciB3cml0ZSBwb2ludGVyLiAgQSB2YWx1ZSBvZiB6ZXJvIGhlcmUKLSAqCWltcGxpZXMgYSBtYXNrIG9mIDB4RkYgYW5kIGEgdmFsdWUgb2Ygc2V2ZW4gaW1wbGllcyBhIG1hc2sKLSAqCTB4MDEuICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIHN1Yi1kaXZpZGUgdGhlIHJpbmcgYnVmZmVyCi0gKglpbnRvIHBpZSBzZWN0aW9ucyBzbyB0aGF0IGludGVycnVwdHMgbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YKLSAqCWhhcmR3YXJlIGZyb20gc2VjdGlvbiB0byBzZWN0aW9uLgotICoKLSAqIE15IGludGVycHJldGF0aW9uIG9mIHRoYXQgaXMsIHdoZW5ldmVyIHRoZSBodyBwdHIgaXMgdXBkYXRlZCwgaXQgaXMKLSAqIGNvbXBhcmVkIHdpdGggdGhlIHRyaWdnZXIgcHRyLCBhbmQgdGhlIHJlc3VsdCBpcyBtYXNrZWQgYnkgdGhlCi0gKiB0cmlnZ2VyIG1hc2suICAoQWN0dWFsbHksIGJ5IHRoZSBjb21wbGVtZW50IG9mIHRoZSB0cmlnZ2VyIG1hc2suKQotICogSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBhbiBpbnRlcnJ1cHQgaXMgdHJpZ2dlcmVkLiAgSS5lLiwgaW50ZXJydXB0Ci0gKiBpZiAoKGh3cHRyICYgfm1hc2spID09ICh0cnB0ciAmIH5tYXNrKSkuICBUaGUgbWFzayBpcyBmb3JtZWQgZnJvbQotICogdGhlIHRyaWdnZXIgcmVnaXN0ZXIgdmFsdWUgYXMgbWFzayA9ICgxIDw8ICg4IC0gdG1yZWcpKSAtIDEuCi0gKgotICogSW4geWV0IGRpZmZlcmVudCB3b3Jkcywgc2V0dGluZyB0bXJlZyB0byAwIGNhdXNlcyBhbiBpbnRlcnJ1cHQgYWZ0ZXIKLSAqIGV2ZXJ5IDI1NiBETUEgY2h1bmtzICg4MTkyIGJ5dGVzKSBvciBvbmNlIHBlciB0cmF2ZXJzYWwgb2YgdGhlCi0gKiByaW5nIGJ1ZmZlci4gIFNldHRpbmcgaXQgdG8gNyBjYXVlcyBhbiBpbnRlcnJ1cHQgZXZlcnkgMiBETUEgY2h1bmtzCi0gKiAoNjQgYnl0ZXMpIG9yIDEyOCB0aW1lcyBwZXIgdHJhdmVyc2FsIG9mIHRoZSByaW5nIGJ1ZmZlci4KLSAqLwotCi0vKiBMaXRoaXVtIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIExJX0hPU1RfQ09OVFJPTExFUgkweDAwMAotIyBkZWZpbmUgTElfSENfUkVTRVQJCSAweDAwMDA4MDAwCi0jIGRlZmluZSBMSV9IQ19MSU5LX0VOQUJMRQkgMHgwMDAwNDAwMAotIyBkZWZpbmUgTElfSENfTElOS19GQUlMVVJFCSAweDAwMDAwMDA0Ci0jIGRlZmluZSBMSV9IQ19MSU5LX0NPREVDCSAweDAwMDAwMDAyCi0jIGRlZmluZSBMSV9IQ19MSU5LX1JFQURZCSAweDAwMDAwMDAxCi0KLSNkZWZpbmUgTElfSU5UUl9TVEFUVVMJCTB4MDEwCi0jZGVmaW5lIExJX0lOVFJfTUFTSwkJMHgwMTQKLSMgZGVmaW5lIExJX0lOVFJfTElOS19FUlIJIDB4MDAwMDgwMDAKLSMgZGVmaW5lIExJX0lOVFJfQ09NTTJfVFJJRwkgMHgwMDAwMDAwOAotIyBkZWZpbmUgTElfSU5UUl9DT01NMl9VTkRFUkZMT1cgMHgwMDAwMDAwNAotIyBkZWZpbmUgTElfSU5UUl9DT01NMV9UUklHCSAweDAwMDAwMDAyCi0jIGRlZmluZSBMSV9JTlRSX0NPTU0xX09WRVJGTE9XICAweDAwMDAwMDAxCi0KLSNkZWZpbmUgTElfQ09ERUNfQ09NTUFORAkweDAxOAotIyBkZWZpbmUgTElfQ0NfQlVTWQkJIDB4MDAwMDgwMDAKLSMgZGVmaW5lIExJX0NDX0RJUgkJIDB4MDAwMDAwODAKLSMgIGRlZmluZSBMSV9DQ19ESVJfUkQJCSAgTElfQ0NfRElSCi0jICBkZWZpbmUgTElfQ0NfRElSX1dSCQkoIUxJX0NDX0RJUikKLSMgZGVmaW5lIExJX0NDX0FERFJfTUFTSwkgMHgwMDAwMDA3RgotCi0jZGVmaW5lIExJX0NPREVDX0RBVEEJCTB4MDFDCi0KLSNkZWZpbmUgTElfQ09NTTFfQkFTRQkJMHgxMDAKLSNkZWZpbmUgTElfQ09NTTFfQ1RMCQkweDEwNAotIyBkZWZpbmUgTElfQ0NUTF9SRVNFVAkJIDB4ODAwMDAwMDAKLSMgZGVmaW5lIExJX0NDVExfU0laRQkJIDB4NzAwMDAwMDAKLSMgZGVmaW5lIExJX0NDVExfRE1BX0VOQUJMRQkgMHgwODAwMDAwMAotIyBkZWZpbmUgTElfQ0NUTF9UTUFTSwkJIDB4MDcwMDAwMDAgLyogdHJpZ2dlciBtYXNrICovCi0jIGRlZmluZSBMSV9DQ1RMX1RQVFIJCSAweDAwRkYwMDAwIC8qIHRyaWdnZXIgcG9pbnRlciAqLwotIyBkZWZpbmUgTElfQ0NUTF9SUFRSCQkgMHgwMDAwRkYwMAotIyBkZWZpbmUgTElfQ0NUTF9XUFRSCQkgMHgwMDAwMDBGRgotI2RlZmluZSBMSV9DT01NMV9DRkcJCTB4MTA4Ci0jIGRlZmluZSBMSV9DQ0ZHX0xPQ0sJCSAweDAwMDA4MDAwCi0jIGRlZmluZSBMSV9DQ0ZHX1NMT1QJCSAweDAwMDAwMDcwCi0jIGRlZmluZSBMSV9DQ0ZHX0RJUkVDVElPTgkgMHgwMDAwMDAwOAotIyAgZGVmaW5lIExJX0NDRkdfRElSX0lOCSghTElfQ0NGR19ESVJFQ1RJT04pCi0jICBkZWZpbmUgTElfQ0NGR19ESVJfT1VUCSAgTElfQ0NGR19ESVJFQ1RJT04KLSMgZGVmaW5lIExJX0NDRkdfTU9ERQkJIDB4MDAwMDAwMDQKLSMgIGRlZmluZSBMSV9DQ0ZHX01PREVfTU9OTwkoIUxJX0NDRkdfTU9ERSkKLSMgIGRlZmluZSBMSV9DQ0ZHX01PREVfU1RFUkVPCSAgTElfQ0NGR19NT0RFCi0jIGRlZmluZSBMSV9DQ0ZHX0ZPUk1BVAkJIDB4MDAwMDAwMDMKLSMgIGRlZmluZSBMSV9DQ0ZHX0ZNVF84QklUCSAgMHgwMDAwMDAwMAotIyAgZGVmaW5lIExJX0NDRkdfRk1UXzE2QklUCSAgMHgwMDAwMDAwMQotI2RlZmluZSBMSV9DT01NMl9CQVNFCQkweDEwQwotI2RlZmluZSBMSV9DT01NMl9DVEwJCTB4MTEwCi0gLyogYml0IGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZSBhcyBMSV9DT01NMV9DVEwgKi8KLSNkZWZpbmUgTElfQ09NTTJfQ0ZHCQkweDExNAotIC8qIGJpdCBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUgYXMgTElfQ09NTTFfQ0ZHICovCi0KLSNkZWZpbmUgTElfVVNUX0xPVwkJMHgyMDAJLyogNjQtYml0IFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUgaXMgKi8KLSNkZWZpbmUgTElfVVNUX0hJR0gJCTB4MjA0CS8qIG1pY3Jvc2Vjb25kcyBzaW5jZSBib290ICovCi0KLSNkZWZpbmUgTElfQVVESU8xX1VTVAkJMHgzMDAJLyogVVNULU1TQyBwYWlycyAqLwotI2RlZmluZSBMSV9BVURJTzFfTVNDCQkweDMwNAkvKiBNU0MgKE1lZGlhIFN0cmVhbSBDb3VudGVyKSAqLwotI2RlZmluZSBMSV9BVURJTzJfVVNUCQkweDMwOAkvKiBjb3VudHMgc2FtcGxlcyBhY3R1YWxseSAqLwotI2RlZmluZSBMSV9BVURJTzJfTVNDCQkweDMwQwkvKiBwcm9jZXNzZWQgYXMgb2YgdGltZSBVU1QgKi8KLQotLyogCi0gKiBMaXRoaXVtJ3MgRE1BIGVuZ2luZSBvcGVyYXRlcyBvbiBjaHVua3Mgb2YgMzIgYnl0ZXMuICBXZSBjYWxsIHRoYXQKLSAqIGEgRE1BQ0hVTksuCi0gKi8KLQotI2RlZmluZSBETUFDSFVOS19TSElGVCA1Ci0jZGVmaW5lIERNQUNIVU5LX1NJWkUgKDEgPDwgRE1BQ0hVTktfU0hJRlQpCi0jZGVmaW5lIEJZVEVTX1RPX0NIVU5LUyhieXRlcykgKChieXRlcykgPj4gRE1BQ0hVTktfU0hJRlQpCi0jZGVmaW5lIENIVU5LU19UT19CWVRFUyhjaHVua3MpICgoY2h1bmtzKSA8PCBETUFDSFVOS19TSElGVCkKLQotLyoKLSAqIFR3byBjb252ZW5pZW50IG1hY3JvcyB0byBzaGlmdCBiaXRmaWVsZHMgaW50by9vdXQgb2YgcG9zaXRpb24uCi0gKgotICogT2JzZXJ2ZSB0aGF0IChtYXNrICYgLW1hc2spIGlzICgxIDw8IGxvd19zZXRfYml0X29mKG1hc2spKS4KLSAqIEFzIGxvbmcgYXMgbWFzayBpcyBjb25zdGFudCwgd2UgdHJ1c3QgdGhlIGNvbXBpbGVyIHdpbGwgY2hhbmdlIHRoZQotICogbXVsdGlwbHkgYW5kIGRpdmlkZSBpbnRvIHNoaWZ0cy4KLSAqLwotCi0jZGVmaW5lIFNISUZUX0ZJRUxEKHZhbCwgbWFzaykgKCgodmFsKSAqICgobWFzaykgJiAtKG1hc2spKSkgJiAobWFzaykpCi0jZGVmaW5lIFVOU0hJRlRfRklFTEQodmFsLCBtYXNrKSAoKCh2YWwpICYgKG1hc2spKSAvICgobWFzaykgJiAtKG1hc2spKSkKLQotLyoKLSAqIGRtYV9jaGFuX2Rlc2MgaXMgaW52YXJpYW50IGluZm9ybWF0aW9uIGFib3V0IGEgTGl0aGl1bQotICogRE1BIGNoYW5uZWwuICBUaGVyZSBhcmUgdHdvIGluc3RhbmNlcywgbGlfY29tbTEgYW5kIGxpX2NvbW0yLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgQ0NUTCByZWdpc3RlciBmaWVsZHMgYXJlIHdyaXRlIHB0ciBhbmQgcmVhZCBwdHIsIGJ1dCB3aGF0Ci0gKiB3ZSBjYXJlIGFib3V0IGFyZSB3aGljaCBwb2ludGVyIGlzIHVwZGF0ZWQgYnkgc29mdHdhcmUgYW5kIHdoaWNoIGJ5Ci0gKiBoYXJkd2FyZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBkbWFfY2hhbl9kZXNjIHsKLQlpbnQgYmFzZXJlZzsKLQlpbnQgY2ZncmVnOwotCWludCBjdGxyZWc7Ci0JaW50IGh3cHRycmVnOwotCWludCBzd3B0cnJlZzsKLQlpbnQgdXN0cmVnOwotCWludCBtc2NyZWc7Ci0JdW5zaWduZWQgbG9uZyBzd3B0cm1hc2s7Ci0JaW50IGFkMTg0M19zbG90OwotCWludCBkaXJlY3Rpb247CQkJLyogTElfQ0NUTF9ESVJfSU4vT1VUICovCi19IGRtYV9jaGFuX2Rlc2NfdDsKLQotc3RhdGljIGNvbnN0IGRtYV9jaGFuX2Rlc2NfdCBsaV9jb21tMSA9IHsKLQlMSV9DT01NMV9CQVNFLAkJCS8qIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JTElfQ09NTTFfQ0ZHLAkJCS8qIGNvbmZpZyByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMV9DVEwsCQkJLyogY29udHJvbCByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMV9DVEwgKyAwLAkJLyogaHcgcHRyIHJlZyBvZmZzZXQgKHdyaXRlIHB0cikgKi8KLQlMSV9DT01NMV9DVEwgKyAxLAkJLyogc3cgcHRyIHJlZyBvZmZzZXQgKHJlYWQgcHRyKSAqLwotCUxJX0FVRElPMV9VU1QsCQkJLyogdXN0IHJlZyBvZmZzZXQgKi8KLQlMSV9BVURJTzFfTVNDLAkJCS8qIG1zYyByZWcgb2Zmc2V0ICovCi0JTElfQ0NUTF9SUFRSLAkJCS8qIHN3IHB0ciBiaXRtYXNrIGluIGN0bHZhbCAqLwotCTIsCQkJCS8qIGFkMTg0MyBzZXJpYWwgc2xvdCAqLwotCUxJX0NDRkdfRElSX0lOCQkJLyogZGlyZWN0aW9uICovCi19OwotCi1zdGF0aWMgY29uc3QgZG1hX2NoYW5fZGVzY190IGxpX2NvbW0yID0gewotCUxJX0NPTU0yX0JBU0UsCQkJLyogYmFzZSByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMl9DRkcsCQkJLyogY29uZmlnIHJlZ2lzdGVyIG9mZnNldCAqLwotCUxJX0NPTU0yX0NUTCwJCQkvKiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldCAqLwotCUxJX0NPTU0yX0NUTCArIDEsCQkvKiBodyBwdHIgcmVnIG9mZnNldCAocmVhZCBwdHIpICovCi0JTElfQ09NTTJfQ1RMICsgMCwJCS8qIHN3IHB0ciByZWcgb2Zmc2V0ICh3cml0ciBwdHIpICovCi0JTElfQVVESU8yX1VTVCwJCQkvKiB1c3QgcmVnIG9mZnNldCAqLwotCUxJX0FVRElPMl9NU0MsCQkJLyogbXNjIHJlZyBvZmZzZXQgKi8KLQlMSV9DQ1RMX1dQVFIsCQkJLyogc3cgcHRyIGJpdG1hc2sgaW4gY3RsdmFsICovCi0JMiwJCQkJLyogYWQxODQzIHNlcmlhbCBzbG90ICovCi0JTElfQ0NGR19ESVJfT1VUCQkJLyogZGlyZWN0aW9uICovCi19OwotCi0vKgotICogZG1hX2NoYW4gaXMgdmFyaWFibGUgaW5mb3JtYXRpb24gYWJvdXQgYSBMaXRoaXVtIERNQSBjaGFubmVsLgotICoKLSAqIFRoZSBkZXNjIGZpZWxkIHBvaW50cyB0byBpbnZhcmlhbnQgaW5mb3JtYXRpb24uCi0gKiBUaGUgbGl0aCBmaWVsZCBwb2ludHMgdG8gYSBsaXRoaXVtX3Qgd2hpY2ggaXMgcGFzc2VkCi0gKiB0byBsaV9yZWFkKiBhbmQgbGlfd3JpdGUqIHRvIGFjY2VzcyB0aGUgcmVnaXN0ZXJzLgotICogVGhlICp2YWwgZmllbGRzIHNoYWRvdyB0aGUgbGl0aGl1bSByZWdpc3RlcnMnIGNvbnRlbnRzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGRtYV9jaGFuIHsKLQljb25zdCBkbWFfY2hhbl9kZXNjX3QgKmRlc2M7Ci0JbGl0aGl1bV90ICAgICAgKmxpdGg7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2V2YWw7Ci0JdW5zaWduZWQgbG9uZwljZmd2YWw7Ci0JdW5zaWduZWQgbG9uZwljdGx2YWw7Ci19IGRtYV9jaGFuX3Q7Ci0KLS8qCi0gKiB1c3Rtc2MgaXMgYSBVU1QvTVNDIHBhaXIgKFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUvTWVkaWEgU3RyZWFtIENvdW50ZXIpLgotICogVVNUIGlzIHRpbWUgaW4gbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBzeXN0ZW0gYm9vdGVkLCBhbmQgTVNDIGlzIGEKLSAqIGNvdW50ZXIgdGhhdCBpbmNyZW1lbnRzIHdpdGggZXZlcnkgYXVkaW8gc2FtcGxlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHVzdG1zYyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHVzdDsKLQl1bnNpZ25lZCBsb25nIG1zYzsKLX0gdXN0bXNjX3Q7Ci0KLS8qCi0gKiBsaV9hZDE4NDNfd2FpdCB3YWl0cyB1bnRpbCBsaXRoaXVtIHNheXMgdGhlIEFEMTg0MyByZWdpc3RlcgotICogZXhjaGFuZ2UgaXMgbm90IGJ1c3kuICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVCVVNZIG9uIHRpbWVvdXQuCi0gKgotICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCBsaXRoaXVtX2xvY2sgaGVsZC4KLSAqLwotCi1zdGF0aWMgaW50IGxpX2FkMTg0M193YWl0KGxpdGhpdW1fdCAqbGl0aCkKLXsKLQl1bnNpZ25lZCBsb25nIGxhdGVyID0gamlmZmllcyArIDI7Ci0Jd2hpbGUgKGxpX3JlYWRsKGxpdGgsIExJX0NPREVDX0NPTU1BTkQpICYgTElfQ0NfQlVTWSkKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbGF0ZXIpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGxpX3JlYWRfYWQxODQzX3JlZyByZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGEgMTYgYml0IEFEMTg0MyByZWdpc3Rlci4KLSAqCi0gKiBSZXR1cm5zIHVuc2lnbmVkIHJlZ2lzdGVyIHZhbHVlIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGhpdW1fdCAqbGl0aCwgaW50IHJlZykKLXsKLQlpbnQgdmFsOwotCi0JQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7Ci0Jc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKLQl7Ci0JCXZhbCA9IGxpX2FkMTg0M193YWl0KGxpdGgpOwotCQlpZiAodmFsID09IDApIHsKLQkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19DT01NQU5ELCBMSV9DQ19ESVJfUkQgfCByZWcpOwotCQkJdmFsID0gbGlfYWQxODQzX3dhaXQobGl0aCk7Ci0JCX0KLQkJaWYgKHZhbCA9PSAwKQotCQkJdmFsID0gbGlfcmVhZGwobGl0aCwgTElfQ09ERUNfREFUQSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKLQotCURCR1hWKCJsaV9yZWFkX2FkMTg0M19yZWcobGl0aD0weCVwLCByZWc9JWQpIHJldHVybnMgMHglMDR4XG4iLAotCSAgICAgIGxpdGgsIHJlZywgdmFsKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBsaV93cml0ZV9hZDE4NDNfcmVnIHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIGEgMTYgYml0IEFEMTg0MyByZWdpc3Rlci4KLSAqLwotCi1zdGF0aWMgdm9pZCBsaV93cml0ZV9hZDE4NDNfcmVnKGxpdGhpdW1fdCAqbGl0aCwgaW50IHJlZywgaW50IG5ld3ZhbCkKLXsKLQlzcGluX2xvY2soJmxpdGgtPmxvY2spOwotCXsKLQkJaWYgKGxpX2FkMTg0M193YWl0KGxpdGgpID09IDApIHsKLQkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19EQVRBLCBuZXd2YWwpOwotCQkJbGlfd3JpdGVsKGxpdGgsIExJX0NPREVDX0NPTU1BTkQsIExJX0NDX0RJUl9XUiB8IHJlZyk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJmxpdGgtPmxvY2spOwotfQotCi0vKgotICogbGlfc2V0dXBfZG1hIGNhbGN1bGF0ZXMgYWxsIHRoZSByZWdpc3RlciBzZXR0aW5ncyBmb3IgRE1BIGluIGEgcGFydGljdWxhcgotICogbW9kZS4gIEl0IHRha2VzIHRvbyBtYW55IGFyZ3VtZW50cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBsaV9zZXR1cF9kbWEoZG1hX2NoYW5fdCAqY2hhbiwKLQkJCSBjb25zdCBkbWFfY2hhbl9kZXNjX3QgKmRlc2MsCi0JCQkgbGl0aGl1bV90ICpsaXRoLAotCQkJIHVuc2lnbmVkIGxvbmcgYnVmZmVyX3BhZGRyLAotCQkJIGludCBidWZzaGlmdCwKLQkJCSBpbnQgZnJhZ3NoaWZ0LAotCQkJIGludCBjaGFubmVscywKLQkJCSBpbnQgc2FtcHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBtb2RlLCBmb3JtYXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplLCB0bWFzazsKLQotCURCR0VWKCIoY2hhbj0weCVwLCBkZXNjPTB4JXAsIGxpdGg9MHglcCwgYnVmZmVyX3BhZGRyPTB4JWx4LCAiCi0JICAgICAiYnVmc2hpZnQ9JWQsIGZyYWdzaGlmdD0lZCwgY2hhbm5lbHM9JWQsIHNhbXBzaXplPSVkKVxuIiwKLQkgICAgIGNoYW4sIGRlc2MsIGxpdGgsIGJ1ZmZlcl9wYWRkciwKLQkgICAgIGJ1ZnNoaWZ0LCBmcmFnc2hpZnQsIGNoYW5uZWxzLCBzYW1wc2l6ZSk7Ci0KLQkvKiBSZXNldCB0aGUgY2hhbm5lbCBmaXJzdC4gKi8KLQotCWxpX3dyaXRlbChsaXRoLCBkZXNjLT5jdGxyZWcsIExJX0NDVExfUkVTRVQpOwotCi0JQVNTRVJUKGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gMik7Ci0JaWYgKGNoYW5uZWxzID09IDIpCi0JCW1vZGUgPSBMSV9DQ0ZHX01PREVfU1RFUkVPOwotCWVsc2UKLQkJbW9kZSA9IExJX0NDRkdfTU9ERV9NT05POwotCUFTU0VSVChzYW1wc2l6ZSA9PSAxIHx8IHNhbXBzaXplID09IDIpOwotCWlmIChzYW1wc2l6ZSA9PSAyKQotCQlmb3JtYXQgPSBMSV9DQ0ZHX0ZNVF8xNkJJVDsKLQllbHNlCi0JCWZvcm1hdCA9IExJX0NDRkdfRk1UXzhCSVQ7Ci0JY2hhbi0+ZGVzYyA9IGRlc2M7Ci0JY2hhbi0+bGl0aCA9IGxpdGg7Ci0KLQkvKgotCSAqIExpdGhpdW0gRE1BIGFkZHJlc3MgcmVnaXN0ZXIgdGFrZXMgYSA0MC1iaXQgcGh5c2ljYWwKLQkgKiBhZGRyZXNzLCByaWdodC1zaGlmdGVkIGJ5IDggc28gaXQgZml0cyBpbiAzMiBiaXRzLiAgQml0IDM3Ci0JICogbXVzdCBiZSBzZXQgLS0gaXQgZW5hYmxlcyBjYWNoZSBjb2hlcmVuY2UuCi0JICovCi0KLQlBU1NFUlQoIShidWZmZXJfcGFkZHIgJiAweEZGKSk7Ci0JY2hhbi0+YmFzZXZhbCA9IChidWZmZXJfcGFkZHIgPj4gOCkgfCAxIDw8ICgzNyAtIDgpOwotCi0JY2hhbi0+Y2ZndmFsID0gKChjaGFuLT5jZmd2YWwgJiB+TElfQ0NGR19MT0NLKSB8Ci0JCQlTSElGVF9GSUVMRChkZXNjLT5hZDE4NDNfc2xvdCwgTElfQ0NGR19TTE9UKSB8Ci0JCQlkZXNjLT5kaXJlY3Rpb24gfAotCQkJbW9kZSB8Ci0JCQlmb3JtYXQpOwotCi0Jc2l6ZSA9IGJ1ZnNoaWZ0IC0gNjsKLQl0bWFzayA9IDEzIC0gZnJhZ3NoaWZ0OwkJLyogU2VlIExpdGhpdW0gRE1BIE5vdGVzIGFib3ZlLiAqLwotCUFTU0VSVChzaXplID49IDIgJiYgc2l6ZSA8PSA3KTsKLQlBU1NFUlQodG1hc2sgPj0gMSAmJiB0bWFzayA8PSA3KTsKLQljaGFuLT5jdGx2YWwgPSAoKGNoYW4tPmN0bHZhbCAmIH5MSV9DQ1RMX1JFU0VUKSB8Ci0JCQlTSElGVF9GSUVMRChzaXplLCBMSV9DQ1RMX1NJWkUpIHwKLQkJCShjaGFuLT5jdGx2YWwgJiB+TElfQ0NUTF9ETUFfRU5BQkxFKSB8Ci0JCQlTSElGVF9GSUVMRCh0bWFzaywgTElfQ0NUTF9UTUFTSykgfAotCQkJU0hJRlRfRklFTEQoMCwgTElfQ0NUTF9UUFRSKSk7Ci0KLQlEQkdQVigiYmFzZXJlZyAweCV4ID0gMHglbHhcbiIsIGRlc2MtPmJhc2VyZWcsIGNoYW4tPmJhc2V2YWwpOwotCURCR1BWKCJjZmdyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5jZmdyZWcsIGNoYW4tPmNmZ3ZhbCk7Ci0JREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLQotCWxpX3dyaXRlbChsaXRoLCBkZXNjLT5iYXNlcmVnLCBjaGFuLT5iYXNldmFsKTsKLQlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y2ZncmVnLCBjaGFuLT5jZmd2YWwpOwotCWxpX3dyaXRlbChsaXRoLCBkZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci0KLQlEQkdSVigpOwotfQotCi1zdGF0aWMgdm9pZCBsaV9zaHV0ZG93bl9kbWEoZG1hX2NoYW5fdCAqY2hhbikKLXsKLQlsaXRoaXVtX3QgKmxpdGggPSBjaGFuLT5saXRoOwotCXZvaWQgKiBsaXRoMSA9IGxpdGgtPnBhZ2UxOwotCi0JREJHRVYoIihjaGFuPTB4JXApXG4iLCBjaGFuKTsKLQkKLQljaGFuLT5jdGx2YWwgJj0gfkxJX0NDVExfRE1BX0VOQUJMRTsKLQlEQkdQVigiY3RscmVnIDB4JXggPSAweCVseFxuIiwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOwotCWxpX3dyaXRlbChsaXRoLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci0KLQkvKgotCSAqIE9mZnNldCAweDUwMCBvbiBMaXRoaXVtIHBhZ2UgMSBpcyBhbiB1bmRvY3VtZW50ZWQsCi0JICogdW5zdXBwb3J0ZWQgcmVnaXN0ZXIgdGhhdCBob2xkcyB0aGUgemVybyBzYW1wbGUgdmFsdWUuCi0JICogTGl0aGl1bSBpcyBzdXBwb3NlZCB0byBvdXRwdXQgemVybyBzYW1wbGVzIHdoZW4gRE1BIGlzCi0JICogaW5hY3RpdmUsIGFuZCByZXBlYXQgdGhlIGxhc3Qgc2FtcGxlIHdoZW4gRE1BIHVuZGVyZmxvd3MuCi0JICogQnV0IGl0IGhhcyBhIGJ1Zywgd2hlcmUsIGFmdGVyIHVuZGVyZmxvdyBvY2N1cnMsIHRoZSB6ZXJvCi0JICogc2FtcGxlIGlzIG5vdCByZXNldC4KLQkgKgotCSAqIEkgZXhwZWN0IHRoaXMgdG8gYnJlYWsgaW4gYSBmdXR1cmUgcmV2IG9mIExpdGhpdW0uCi0JICovCi0KLQlpZiAobGl0aDEgJiYgY2hhbi0+ZGVzYy0+ZGlyZWN0aW9uID09IExJX0NDRkdfRElSX09VVCkKLQkJKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aDEgKyAweDUwMCkgPSAwOwotfQotCi0vKgotICogbGlfYWN0aXZhdGVfZG1hIGFsd2F5cyBzdGFydHMgZG1hIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KLSAqCi0gKiBOLkIuLCB0aGVzZSBtYXkgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0LgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfYWN0aXZhdGVfZG1hKGRtYV9jaGFuX3QgKmNoYW4pCi17Ci0JY2hhbi0+Y3RsdmFsIHw9IExJX0NDVExfRE1BX0VOQUJMRTsKLQlEQkdQVigiY3RsdmFsID0gMHglbHhcbiIsIGNoYW4tPmN0bHZhbCk7Ci0JbGlfd3JpdGVsKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgbGlfZGVhY3RpdmF0ZV9kbWEoZG1hX2NoYW5fdCAqY2hhbikKLXsKLQlsaXRoaXVtX3QgKmxpdGggPSBjaGFuLT5saXRoOwotCXZvaWQgKiBsaXRoMiA9IGxpdGgtPnBhZ2UyOwotCi0JY2hhbi0+Y3RsdmFsICY9IH4oTElfQ0NUTF9ETUFfRU5BQkxFIHwgTElfQ0NUTF9SUFRSIHwgTElfQ0NUTF9XUFRSKTsKLQlEQkdQVigiY3RsdmFsID0gMHglbHhcbiIsIGNoYW4tPmN0bHZhbCk7Ci0JREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLQlsaV93cml0ZWwobGl0aCwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOwotCi0JLyoKLQkgKiBPZmZzZXRzIDB4OTggYW5kIDB4OUMgb24gTGl0aGl1bSBwYWdlIDIgYXJlIHVuZG9jdW1lbnRlZCwKLQkgKiB1bnN1cHBvcnRlZCByZWdpc3RlcnMgdGhhdCBhcmUgaW50ZXJuYWwgY29waWVzIG9mIHRoZSBETUEKLQkgKiByZWFkIGFuZCB3cml0ZSBwb2ludGVycy4gIEJlY2F1c2Ugb2YgYSBMaXRoaXVtIGJ1ZywgdGhlc2UKLQkgKiByZWdpc3RlcnMgYXJlbid0IHplcm9lZCBjb3JyZWN0bHkgd2hlbiBETUEgaXMgc2h1dCBvZmYuICBTbwotCSAqIHdlIHdoYWNrIHRoZW0gZGlyZWN0bHkuCi0JICoKLQkgKiBJIGV4cGVjdCB0aGlzIHRvIGJyZWFrIGluIGEgZnV0dXJlIHJldiBvZiBMaXRoaXVtLgotCSAqLwotCi0JaWYgKGxpdGgyICYmIGNoYW4tPmRlc2MtPmRpcmVjdGlvbiA9PSBMSV9DQ0ZHX0RJUl9PVVQpIHsKLQkJKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aDIgKyAweDk4KSA9IDA7Ci0JCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgyICsgMHg5QykgPSAwOwotCX0KLX0KLQotLyoKLSAqIHJlYWQvd3JpdGUgdGhlIHJpbmcgYnVmZmVyIHBvaW50ZXJzLiAgVGhlc2Ugcm91dGluZXMnIGFyZ3VtZW50cyBhbmQgcmVzdWx0cwotICogYXJlIGJ5dGUgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJpbmcgYnVmZmVyLgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIGludCBsaV9yZWFkX3N3cHRyKGRtYV9jaGFuX3QgKmNoYW4pCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrID0gY2hhbi0+ZGVzYy0+c3dwdHJtYXNrOwotCi0JcmV0dXJuIENIVU5LU19UT19CWVRFUyhVTlNISUZUX0ZJRUxEKGNoYW4tPmN0bHZhbCwgbWFzaykpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgbGlfcmVhZF9od3B0cihkbWFfY2hhbl90ICpjaGFuKQotewotCXJldHVybiBDSFVOS1NfVE9fQllURVMobGlfcmVhZGIoY2hhbi0+bGl0aCwgY2hhbi0+ZGVzYy0+aHdwdHJyZWcpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBsaV93cml0ZV9zd3B0cihkbWFfY2hhbl90ICpjaGFuLCBpbnQgdmFsKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IGNoYW4tPmRlc2MtPnN3cHRybWFzazsKLQotCUFTU0VSVCghKHZhbCAmIH5DSFVOS1NfVE9fQllURVMoMHhGRikpKTsKLQl2YWwgPSBCWVRFU19UT19DSFVOS1ModmFsKTsKLQljaGFuLT5jdGx2YWwgPSAoY2hhbi0+Y3RsdmFsICYgfm1hc2spIHwgU0hJRlRfRklFTEQodmFsLCBtYXNrKTsKLQlsaV93cml0ZWIoY2hhbi0+bGl0aCwgY2hhbi0+ZGVzYy0+c3dwdHJyZWcsIHZhbCk7Ci19Ci0KLS8qIGxpX3JlYWRfVVNUTVNDKCkgcmV0dXJucyBhIFVTVC9NU0MgcGFpciBmb3IgdGhlIGdpdmVuIGNoYW5uZWwuICovCi0KLXN0YXRpYyB2b2lkIGxpX3JlYWRfVVNUTVNDKGRtYV9jaGFuX3QgKmNoYW4sIHVzdG1zY190ICp1c3Rtc2MpCi17Ci0JbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKLQljb25zdCBkbWFfY2hhbl9kZXNjX3QgKmRlc2MgPSBjaGFuLT5kZXNjOwotCXVuc2lnbmVkIGxvbmcgbm93X2xvdywgbm93X2hpZ2gwLCBub3dfaGlnaDEsIGNoYW5fdXN0OwotCi0Jc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKLQl7Ci0JCS8qCi0JCSAqIHJldHJ5IHVudGlsIHdlIGRvIGFsbCBmaXZlIHJlYWRzIHdpdGhvdXQgdGhlCi0JCSAqIGhpZ2ggd29yZCBjaGFuZ2luZy4gIChIaWdoIHdvcmQgaW5jcmVtZW50cwotCQkgKiBldmVyeSAyXjMyIG1pY3Jvc2Vjb25kcywgaS5lLiwgbm90IG9mdGVuKQotCQkgKi8KLQkJZG8gewotCQkJbm93X2hpZ2gwID0gbGlfcmVhZGwobGl0aCwgTElfVVNUX0hJR0gpOwotCQkJbm93X2xvdyA9IGxpX3JlYWRsKGxpdGgsIExJX1VTVF9MT1cpOwotCi0JCQkvKgotCQkJICogTGl0aGl1bSBndWFyYW50ZWVzIHRoZXNlIHR3byByZWFkcyB3aWxsIGJlCi0JCQkgKiBhdG9taWMgLS0gdXN0IHdpbGwgbm90IGluY3JlbWVudCBhZnRlciBtc2MKLQkJCSAqIGlzIHJlYWQuCi0JCQkgKi8KLQotCQkJdXN0bXNjLT5tc2MgPSBsaV9yZWFkbChsaXRoLCBkZXNjLT5tc2NyZWcpOwotCQkJY2hhbl91c3QgPSBsaV9yZWFkbChsaXRoLCBkZXNjLT51c3RyZWcpOwotCi0JCQlub3dfaGlnaDEgPSBsaV9yZWFkbChsaXRoLCBMSV9VU1RfSElHSCk7Ci0JCX0gd2hpbGUgKG5vd19oaWdoMCAhPSBub3dfaGlnaDEpOwotCX0JCi0Jc3Bpbl91bmxvY2soJmxpdGgtPmxvY2spOwotCXVzdG1zYy0+dXN0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG5vd19oaWdoMCA8PCAzMiB8IGNoYW5fdXN0KTsKLX0KLQotc3RhdGljIHZvaWQgbGlfZW5hYmxlX2ludGVycnVwdHMobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBpbnQgbWFzaykKLXsKLQlEQkdFVigiKGxpdGg9MHglcCwgbWFzaz0weCV4KVxuIiwgbGl0aCwgbWFzayk7Ci0KLQkvKiBjbGVhciBhbnkgYWxyZWFkeS1wZW5kaW5nIGludGVycnVwdHMuICovCi0KLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9TVEFUVVMsIG1hc2spOwotCi0JLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLiAqLwotCi0JbWFzayB8PSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX01BU0spOwotCWxpX3dyaXRlbChsaXRoLCBMSV9JTlRSX01BU0ssIG1hc2spOwotfQotCi1zdGF0aWMgdm9pZCBsaV9kaXNhYmxlX2ludGVycnVwdHMobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBpbnQgbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQga2VlcG1hc2s7Ci0KLQlEQkdFVigiKGxpdGg9MHglcCwgbWFzaz0weCV4KVxuIiwgbGl0aCwgbWFzayk7Ci0KLQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzICovCi0KLQlrZWVwbWFzayA9IGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfTUFTSykgJiB+bWFzazsKLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9NQVNLLCBrZWVwbWFzayk7Ci0KLQkvKiBjbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLwotCi0JbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCBtYXNrKTsKLX0KLQotLyogR2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGxpX2dldF9jbGVhcl9pbnRyX3N0YXR1cyhsaXRoaXVtX3QgKmxpdGgpCi17Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfU1RBVFVTKTsKLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9TVEFUVVMsIH4wKTsKLQlyZXR1cm4gc3RhdHVzICYgbGlfcmVhZGwobGl0aCwgTElfSU5UUl9NQVNLKTsKLX0KLQotc3RhdGljIGludCBsaV9pbml0KGxpdGhpdW1fdCAqbGl0aCkKLXsKLQkvKiAxLiBTeXN0ZW0gcG93ZXIgc3VwcGxpZXMgc3RhYmlsaXplLiAqLwotCi0JLyogMi4gQXNzZXJ0IHRoZSB+UkVTRVQgc2lnbmFsLiAqLwotCi0JbGlfd3JpdGVsKGxpdGgsIExJX0hPU1RfQ09OVFJPTExFUiwgTElfSENfUkVTRVQpOwotCXVkZWxheSgxKTsKLQotCS8qIDMuIERlYXNzZXJ0IHRoZSB+UkVTRVQgc2lnbmFsIGFuZCBlbnRlciBhIHdhaXQgcGVyaW9kIHRvIGFsbG93Ci0JICAgdGhlIEFEMTg0MyBpbnRlcm5hbCBjbG9ja3MgYW5kIHRoZSBleHRlcm5hbCBjcnlzdGFsIG9zY2lsbGF0b3IKLQkgICB0byBzdGFiaWxpemUuICovCi0KLQlsaV93cml0ZWwobGl0aCwgTElfSE9TVF9DT05UUk9MTEVSLCBMSV9IQ19MSU5LX0VOQUJMRSk7Ci0JdWRlbGF5KDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEFEMTg0MyBhY2Nlc3MgKi8KLQotLyoKLSAqIEFEMTg0MyBiaXRmaWVsZCBkZWZpbml0aW9ucy4gIEFsbCBhcmUgbmFtZWQgYXMgaW4gdGhlIEFEMTg0MyBkYXRhCi0gKiBzaGVldCwgd2l0aCBhZDE4NDNfIHByZXBlbmRlZCBhbmQgaW5kaXZpZHVhbCBiaXQgbnVtYmVycyByZW1vdmVkLgotICoKLSAqIEUuZy4sIGJpdHMgTFNTMCB0aHJvdWdoIExTUzIgYmVjb21lIGFkMTg0M19MU1MuCi0gKgotICogT25seSB0aGUgYml0ZmllbGRzIHdlIG5lZWQgYXJlIGRlZmluZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODQzX2JpdGZpZWxkIHsKLQljaGFyIHJlZzsKLQljaGFyIGxvX2JpdDsKLQljaGFyIG5iaXRzOwotfSBhZDE4NDNfYml0ZmllbGRfdDsKLQotc3RhdGljIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90Ci0JYWQxODQzX1BETk8gICA9IHsgIDAsIDE0LCAgMSB9LAkvKiBDb252ZXJ0ZXIgUG93ZXItRG93biBGbGFnICovCi0JYWQxODQzX0lOSVQgICA9IHsgIDAsIDE1LCAgMSB9LAkvKiBDbG9jayBJbml0aWFsaXphdGlvbiBGbGFnICovCi0JYWQxODQzX1JJRyAgICA9IHsgIDIsICAwLCAgNCB9LAkvKiBSaWdodCBBREMgSW5wdXQgR2FpbiAqLwotCWFkMTg0M19STUdFICAgPSB7ICAyLCAgNCwgIDEgfSwJLyogUmlnaHQgQURDIE1pYyBHYWluIEVuYWJsZSAqLwotCWFkMTg0M19SU1MgICAgPSB7ICAyLCAgNSwgIDMgfSwJLyogUmlnaHQgQURDIFNvdXJjZSBTZWxlY3QgKi8KLQlhZDE4NDNfTElHICAgID0geyAgMiwgIDgsICA0IH0sCS8qIExlZnQgQURDIElucHV0IEdhaW4gKi8KLQlhZDE4NDNfTE1HRSAgID0geyAgMiwgMTIsICAxIH0sCS8qIExlZnQgQURDIE1pYyBHYWluIEVuYWJsZSAqLwotCWFkMTg0M19MU1MgICAgPSB7ICAyLCAxMywgIDMgfSwJLyogTGVmdCBBREMgU291cmNlIFNlbGVjdCAqLwotCWFkMTg0M19SWDFNICAgPSB7ICA0LCAgMCwgIDUgfSwJLyogUmlnaHQgQXV4IDEgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfUlgxTU0gID0geyAgNCwgIDcsICAxIH0sCS8qIFJpZ2h0IEF1eCAxIE1peCBNdXRlICovCi0JYWQxODQzX0xYMU0gICA9IHsgIDQsICA4LCAgNSB9LAkvKiBMZWZ0IEF1eCAxIE1peCBHYWluL0F0dGVuICovCi0JYWQxODQzX0xYMU1NICA9IHsgIDQsIDE1LCAgMSB9LAkvKiBMZWZ0IEF1eCAxIE1peCBNdXRlICovCi0JYWQxODQzX1JYMk0gICA9IHsgIDUsICAwLCAgNSB9LAkvKiBSaWdodCBBdXggMiBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19SWDJNTSAgPSB7ICA1LCAgNywgIDEgfSwJLyogUmlnaHQgQXV4IDIgTWl4IE11dGUgKi8KLQlhZDE4NDNfTFgyTSAgID0geyAgNSwgIDgsICA1IH0sCS8qIExlZnQgQXV4IDIgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfTFgyTU0gID0geyAgNSwgMTUsICAxIH0sCS8qIExlZnQgQXV4IDIgTWl4IE11dGUgKi8KLQlhZDE4NDNfUk1DTSAgID0geyAgNywgIDAsICA1IH0sCS8qIFJpZ2h0IE1pYyBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19STUNNTSAgPSB7ICA3LCAgNywgIDEgfSwJLyogUmlnaHQgTWljIE1peCBNdXRlICovCi0JYWQxODQzX0xNQ00gICA9IHsgIDcsICA4LCAgNSB9LAkvKiBMZWZ0IE1pYyBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19MTUNNTSAgPSB7ICA3LCAxNSwgIDEgfSwJLyogTGVmdCBNaWMgTWl4IE11dGUgKi8KLQlhZDE4NDNfSFBPUyAgID0geyAgOCwgIDQsICAxIH0sCS8qIEhlYWRwaG9uZSBPdXRwdXQgVm9sdGFnZSBTd2luZyAqLwotCWFkMTg0M19IUE9NICAgPSB7ICA4LCAgNSwgIDEgfSwJLyogSGVhZHBob25lIE91dHB1dCBNdXRlICovCi0JYWQxODQzX1JEQTFHICA9IHsgIDksICAwLCAgNiB9LAkvKiBSaWdodCBEQUMxIEFuYWxvZy9EaWdpdGFsIEdhaW4gKi8KLQlhZDE4NDNfUkRBMUdNID0geyAgOSwgIDcsICAxIH0sCS8qIFJpZ2h0IERBQzEgQW5hbG9nIE11dGUgKi8KLQlhZDE4NDNfTERBMUcgID0geyAgOSwgIDgsICA2IH0sCS8qIExlZnQgREFDMSBBbmFsb2cvRGlnaXRhbCBHYWluICovCi0JYWQxODQzX0xEQTFHTSA9IHsgIDksIDE1LCAgMSB9LAkvKiBMZWZ0IERBQzEgQW5hbG9nIE11dGUgKi8KLQlhZDE4NDNfUkRBMUFNID0geyAxMSwgIDcsICAxIH0sCS8qIFJpZ2h0IERBQzEgRGlnaXRhbCBNdXRlICovCi0JYWQxODQzX0xEQTFBTSA9IHsgMTEsIDE1LCAgMSB9LAkvKiBMZWZ0IERBQzEgRGlnaXRhbCBNdXRlICovCi0JYWQxODQzX0FETEMgICA9IHsgMTUsICAwLCAgMiB9LAkvKiBBREMgTGVmdCBTYW1wbGUgUmF0ZSBTb3VyY2UgKi8KLQlhZDE4NDNfQURSQyAgID0geyAxNSwgIDIsICAyIH0sCS8qIEFEQyBSaWdodCBTYW1wbGUgUmF0ZSBTb3VyY2UgKi8KLQlhZDE4NDNfREExQyAgID0geyAxNSwgIDgsICAyIH0sCS8qIERBQzEgU2FtcGxlIFJhdGUgU291cmNlICovCi0JYWQxODQzX0MxQyAgICA9IHsgMTcsICAwLCAxNiB9LAkvKiBDbG9jayAxIFNhbXBsZSBSYXRlIFNlbGVjdCAqLwotCWFkMTg0M19DMkMgICAgPSB7IDIwLCAgMCwgMTYgfSwJLyogQ2xvY2sgMSBTYW1wbGUgUmF0ZSBTZWxlY3QgKi8KLQlhZDE4NDNfREFBREwgID0geyAyNSwgIDQsICAyIH0sCS8qIERpZ2l0YWwgQURDIExlZnQgU291cmNlIFNlbGVjdCAqLwotCWFkMTg0M19EQUFEUiAgPSB7IDI1LCAgNiwgIDIgfSwJLyogRGlnaXRhbCBBREMgUmlnaHQgU291cmNlIFNlbGVjdCAqLwotCWFkMTg0M19EUlNGTFQgPSB7IDI1LCAxNSwgIDEgfSwJLyogRGlnaXRhbCBSZWFtcGxlciBGaWx0ZXIgTW9kZSAqLwotCWFkMTg0M19BRExGICAgPSB7IDI2LCAgMCwgIDIgfSwgLyogQURDIExlZnQgQ2hhbm5lbCBEYXRhIEZvcm1hdCAqLwotCWFkMTg0M19BRFJGICAgPSB7IDI2LCAgMiwgIDIgfSwgLyogQURDIFJpZ2h0IENoYW5uZWwgRGF0YSBGb3JtYXQgKi8KLQlhZDE4NDNfQURUTEsgID0geyAyNiwgIDQsICAxIH0sCS8qIEFEQyBUcmFuc21pdCBMb2NrIE1vZGUgU2VsZWN0ICovCi0JYWQxODQzX1NDRiAgICA9IHsgMjYsICA3LCAgMSB9LAkvKiBTQ0xLIEZyZXF1ZW5jeSBTZWxlY3QgKi8KLQlhZDE4NDNfREExRiAgID0geyAyNiwgIDgsICAyIH0sCS8qIERBQzEgRGF0YSBGb3JtYXQgU2VsZWN0ICovCi0JYWQxODQzX0RBMVNNICA9IHsgMjYsIDE0LCAgMSB9LAkvKiBEQUMxIFN0ZXJlby9Nb25vIE1vZGUgU2VsZWN0ICovCi0JYWQxODQzX0FETEVOICA9IHsgMjcsICAwLCAgMSB9LAkvKiBBREMgTGVmdCBDaGFubmVsIEVuYWJsZSAqLwotCWFkMTg0M19BRFJFTiAgPSB7IDI3LCAgMSwgIDEgfSwJLyogQURDIFJpZ2h0IENoYW5uZWwgRW5hYmxlICovCi0JYWQxODQzX0FBTUVOICA9IHsgMjcsICA0LCAgMSB9LAkvKiBBbmFsb2cgdG8gQW5hbG9nIE1peCBFbmFibGUgKi8KLQlhZDE4NDNfQU5BRU4gID0geyAyNywgIDcsICAxIH0sCS8qIEFuYWxvZyBDaGFubmVsIEVuYWJsZSAqLwotCWFkMTg0M19EQTFFTiAgPSB7IDI3LCAgOCwgIDEgfSwJLyogREFDMSBFbmFibGUgKi8KLQlhZDE4NDNfREEyRU4gID0geyAyNywgIDksICAxIH0sCS8qIERBQzIgRW5hYmxlICovCi0JYWQxODQzX0MxRU4gICA9IHsgMjgsIDExLCAgMSB9LAkvKiBDbG9jayBHZW5lcmF0b3IgMSBFbmFibGUgKi8KLQlhZDE4NDNfQzJFTiAgID0geyAyOCwgMTIsICAxIH0sCS8qIENsb2NrIEdlbmVyYXRvciAyIEVuYWJsZSAqLwotCWFkMTg0M19QRE5JICAgPSB7IDI4LCAxNSwgIDEgfTsJLyogQ29udmVydGVyIFBvd2VyIERvd24gKi8KLQotLyoKLSAqIFRoZSB2YXJpb3VzIHJlZ2lzdGVycyBvZiB0aGUgQUQxODQzIHVzZSB0aHJlZSBkaWZmZXJlbnQgZm9ybWF0cyBmb3IKLSAqIHNwZWNpZnlpbmcgZ2Fpbi4gIFRoZSBhZDE4NDNfZ2FpbiBzdHJ1Y3R1cmUgcGFyYW1ldGVyaXplcyB0aGUKLSAqIGZvcm1hdHMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODQzX2dhaW4gewotCi0JaW50CW5lZ2F0aXZlOwkJLyogbm9uemVybyBpZiBnYWluIGlzIG5lZ2F0aXZlLiAqLwotCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpsZmllbGQ7Ci0JY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKnJmaWVsZDsKLQotfSBhZDE4NDNfZ2Fpbl90OwotCi1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9SRUNMRVYKLQkJCQk9IHsgMCwgJmFkMTg0M19MSUcsICAgJmFkMTg0M19SSUcgfTsKLXN0YXRpYyBjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX0xJTkUKLQkJCQk9IHsgMSwgJmFkMTg0M19MWDFNLCAgJmFkMTg0M19SWDFNIH07Ci1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9DRAotCQkJCT0geyAxLCAmYWQxODQzX0xYMk0sICAmYWQxODQzX1JYMk0gfTsKLXN0YXRpYyBjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX01JQwotCQkJCT0geyAxLCAmYWQxODQzX0xNQ00sICAmYWQxODQzX1JNQ00gfTsKLXN0YXRpYyBjb25zdCBhZDE4NDNfZ2Fpbl90IGFkMTg0M19nYWluX1BDTQotCQkJCT0geyAxLCAmYWQxODQzX0xEQTFHLCAmYWQxODQzX1JEQTFHIH07Ci0KLS8qIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYW4gQUQxODQzIGJpdGZpZWxkLiAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19yZWFkX2JpdHMobGl0aGl1bV90ICpsaXRoLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZmllbGQpCi17Ci0JaW50IHcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZyk7Ci0JaW50IHZhbCA9IHcgPj4gZmllbGQtPmxvX2JpdCAmICgoMSA8PCBmaWVsZC0+bmJpdHMpIC0gMSk7Ci0KLQlEQkdYVigiYWQxODQzX3JlYWRfYml0cyhsaXRoPTB4JXAsIGZpZWxkLT57JWQgJWQgJWR9KSByZXR1cm5zIDB4JXhcbiIsCi0JICAgICAgbGl0aCwgZmllbGQtPnJlZywgZmllbGQtPmxvX2JpdCwgZmllbGQtPm5iaXRzLCB2YWwpOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIHdyaXRlIGEgbmV3IHZhbHVlIHRvIGFuIEFEMTg0MyBiaXRmaWVsZCBhbmQgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCi0gKi8KLQotc3RhdGljIGludCBhZDE4NDNfd3JpdGVfYml0cyhsaXRoaXVtX3QgKmxpdGgsCi0JCQkgICAgIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpmaWVsZCwKLQkJCSAgICAgaW50IG5ld3ZhbCkKLXsKLQlpbnQgdyA9IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoLCBmaWVsZC0+cmVnKTsKLQlpbnQgbWFzayA9ICgoMSA8PCBmaWVsZC0+bmJpdHMpIC0gMSkgPDwgZmllbGQtPmxvX2JpdDsKLQlpbnQgb2xkdmFsID0gKHcgJiBtYXNrKSA+PiBmaWVsZC0+bG9fYml0OwotCWludCBuZXdiaXRzID0gKG5ld3ZhbCA8PCBmaWVsZC0+bG9fYml0KSAmIG1hc2s7Ci0JdyA9ICh3ICYgfm1hc2spIHwgbmV3Yml0czsKLQkodm9pZCkgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCBmaWVsZC0+cmVnLCB3KTsKLQotCURCR1hWKCJhZDE4NDNfd3JpdGVfYml0cyhsaXRoPTB4JXAsIGZpZWxkLT57JWQgJWQgJWR9LCB2YWw9MHgleCkgIgotCSAgICAgICJyZXR1cm5zIDB4JXhcbiIsCi0JICAgICAgbGl0aCwgZmllbGQtPnJlZywgZmllbGQtPmxvX2JpdCwgZmllbGQtPm5iaXRzLCBuZXd2YWwsCi0JICAgICAgb2xkdmFsKTsKLQotCXJldHVybiBvbGR2YWw7Ci19Ci0KLS8qCi0gKiBhZDE4NDNfcmVhZF9tdWx0aSByZWFkcyBtdWx0aXBsZSBiaXRmaWVsZHMgZnJvbSB0aGUgc2FtZSBBRDE4NDMKLSAqIHJlZ2lzdGVyLiAgSXQgdXNlcyBhIHNpbmdsZSByZWFkIGN5Y2xlIHRvIGRvIGl0LiAgKFJlYWRpbmcgdGhlCi0gKiBhZDE4NDMgcmVxdWlyZXMgMjU2IGJpdCB0aW1lcyBhdCAxMi4yODggTUh6LCBvciBuZWFybHkgMjAKLSAqIG1pY3Jvc2Vjb25kcy4pCi0gKgotICogQ2FsbGVkIGlrZSB0aGlzLgotICoKLSAqICBhZDE4NDNfcmVhZF9tdWx0aShsaXRoLCBuZmllbGRzLAotICoJCSAgICAgICZhZDE4NDNfRklFTEQxLCAmdmFsMSwKLSAqCQkgICAgICAmYWQxODQzX0ZJRUxEMiwgJnZhbDIsIC4uLik7Ci0gKi8KLQotc3RhdGljIHZvaWQgYWQxODQzX3JlYWRfbXVsdGkobGl0aGl1bV90ICpsaXRoLCBpbnQgYXJnY291bnQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpmcDsKLQlpbnQgdyA9IDAsIG1hc2ssICp2YWx1ZSwgcmVnID0gLTE7Ci0KLQl2YV9zdGFydChhcCwgYXJnY291bnQpOwotCXdoaWxlICgtLWFyZ2NvdW50ID49IDApIHsKLQkJZnAgPSB2YV9hcmcoYXAsIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICopOwotCQl2YWx1ZSA9IHZhX2FyZyhhcCwgaW50ICopOwotCQlpZiAocmVnID09IC0xKSB7Ci0JCQlyZWcgPSBmcC0+cmVnOwotCQkJdyA9IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoLCByZWcpOwotCQl9Ci0JCUFTU0VSVChyZWcgPT0gZnAtPnJlZyk7Ci0JCW1hc2sgPSAoMSA8PCBmcC0+bmJpdHMpIC0gMTsKLQkJKnZhbHVlID0gdyA+PiBmcC0+bG9fYml0ICYgbWFzazsKLQl9Ci0JdmFfZW5kKGFwKTsKLX0KLQotLyoKLSAqIGFkMTg0M193cml0ZV9tdWx0aSBzdG9yZXMgbXVsdGlwbGUgYml0ZmllbGRzIGludG8gdGhlIHNhbWUgQUQxODQzCi0gKiByZWdpc3Rlci4gIEl0IHVzZXMgb25lIHJlYWQgYW5kIG9uZSB3cml0ZSBjeWNsZSB0byBkbyBpdC4KLSAqCi0gKiBDYWxsZWQgbGlrZSB0aGlzLgotICoKLSAqICBhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgbmZpZWxkcywKLSAqCQkgICAgICAgJmFkMTg0M19GSUVMRDEsIHZhbDEsCi0gKgkJICAgICAgICZhZDE4NDNfRklFTEYyLCB2YWwyLCAuLi4pOwotICovCi0KLXN0YXRpYyB2b2lkIGFkMTg0M193cml0ZV9tdWx0aShsaXRoaXVtX3QgKmxpdGgsIGludCBhcmdjb3VudCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0JaW50IHJlZzsKLQljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZnA7Ci0JaW50IHZhbHVlOwotCWludCB3LCBtLCBtYXNrLCBiaXRzOwotCi0JbWFzayA9IDA7Ci0JYml0cyA9IDA7Ci0JcmVnID0gLTE7Ci0KLQl2YV9zdGFydChhcCwgYXJnY291bnQpOwotCXdoaWxlICgtLWFyZ2NvdW50ID49IDApIHsKLQkJZnAgPSB2YV9hcmcoYXAsIGNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICopOwotCQl2YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKLQkJaWYgKHJlZyA9PSAtMSkKLQkJCXJlZyA9IGZwLT5yZWc7Ci0JCUFTU0VSVChmcC0+cmVnID09IHJlZyk7Ci0JCW0gPSAoKDEgPDwgZnAtPm5iaXRzKSAtIDEpIDw8IGZwLT5sb19iaXQ7Ci0JCW1hc2sgfD0gbTsKLQkJYml0cyB8PSAodmFsdWUgPDwgZnAtPmxvX2JpdCkgJiBtOwotCX0KLQl2YV9lbmQoYXApOwotCUFTU0VSVCghKGJpdHMgJiB+bWFzaykpOwotCWlmICh+bWFzayAmIDB4RkZGRikKLQkJdyA9IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoLCByZWcpOwotCWVsc2UKLQkJdyA9IDA7Ci0JdyA9ICh3ICYgfm1hc2spIHwgYml0czsKLQkodm9pZCkgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCByZWcsIHcpOwotfQotCi0vKgotICogYWQxODQzX2dldF9nYWluIHJlYWRzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYW5kIGV4dHJhY3RzIHRoZSBnYWluIHZhbHVlCi0gKiB1c2luZyB0aGUgc3VwcGxpZWQgZ2FpbiB0eXBlLiAgSXQgcmV0dXJucyB0aGUgZ2FpbiBpbiBPU1MgZm9ybWF0LgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX2dldF9nYWluKGxpdGhpdW1fdCAqbGl0aCwgY29uc3QgYWQxODQzX2dhaW5fdCAqZ3ApCi17Ci0JaW50IGxnLCByZzsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrID0gKDEgPDwgZ3AtPmxmaWVsZC0+bmJpdHMpIC0gMTsKLQotCWFkMTg0M19yZWFkX211bHRpKGxpdGgsIDIsIGdwLT5sZmllbGQsICZsZywgZ3AtPnJmaWVsZCwgJnJnKTsKLQlpZiAoZ3AtPm5lZ2F0aXZlKSB7Ci0JCWxnID0gbWFzayAtIGxnOwotCQlyZyA9IG1hc2sgLSByZzsKLQl9Ci0JbGcgPSAobGcgKiAxMDAgKyAobWFzayA+PiAxKSkgLyBtYXNrOwotCXJnID0gKHJnICogMTAwICsgKG1hc2sgPj4gMSkpIC8gbWFzazsKLQlyZXR1cm4gbGcgPDwgMCB8IHJnIDw8IDg7Ci19Ci0KLS8qCi0gKiBTZXQgYW4gYXVkaW8gY2hhbm5lbCdzIGdhaW4uIENvbnZlcnRzIGZyb20gT1NTIGZvcm1hdCB0byBBRDE4NDMncwotICogZm9ybWF0LgotICoKLSAqIFJldHVybnMgdGhlIG5ldyBnYWluLCB3aGljaCBtYXkgYmUgbG93ZXIgdGhhbiB0aGUgb2xkIGdhaW4uCi0gKi8KLQotc3RhdGljIGludCBhZDE4NDNfc2V0X2dhaW4obGl0aGl1bV90ICpsaXRoLAotCQkJICAgY29uc3QgYWQxODQzX2dhaW5fdCAqZ3AsCi0JCQkgICBpbnQgbmV3dmFsKQotewotCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAoMSA8PCBncC0+bGZpZWxkLT5uYml0cykgLSAxOwotCi0JaW50IGxnID0gbmV3dmFsID4+IDAgJiAweEZGOwotCWludCByZyA9IG5ld3ZhbCA+PiA4OwotCWlmIChsZyA8IDAgfHwgbGcgPiAxMDAgfHwgcmcgPCAwIHx8IHJnID4gMTAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlsZyA9IChsZyAqIG1hc2sgKyAobWFzayA+PiAxKSkgLyAxMDA7Ci0JcmcgPSAocmcgKiBtYXNrICsgKG1hc2sgPj4gMSkpIC8gMTAwOwotCWlmIChncC0+bmVnYXRpdmUpIHsKLQkJbGcgPSBtYXNrIC0gbGc7Ci0JCXJnID0gbWFzayAtIHJnOwotCX0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgZ3AtPmxmaWVsZCwgbGcsIGdwLT5yZmllbGQsIHJnKTsKLQlyZXR1cm4gYWQxODQzX2dldF9nYWluKGxpdGgsIGdwKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY3VycmVudCByZWNvcmRpbmcgc291cmNlLCBpbiBPU1MgZm9ybWF0LiAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19nZXRfcmVjc3JjKGxpdGhpdW1fdCAqbGl0aCkKLXsKLQlpbnQgbHMgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFNTKTsKLQotCXN3aXRjaCAobHMpIHsKLQljYXNlIDE6Ci0JCXJldHVybiBTT1VORF9NQVNLX01JQzsKLQljYXNlIDI6Ci0JCXJldHVybiBTT1VORF9NQVNLX0xJTkU7Ci0JY2FzZSAzOgotCQlyZXR1cm4gU09VTkRfTUFTS19DRDsKLQljYXNlIDY6Ci0JCXJldHVybiBTT1VORF9NQVNLX1BDTTsKLQlkZWZhdWx0OgotCQlBU1NFUlQoMCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qCi0gKiBFbmFibGUvZGlzYWJsZSBkaWdpdGFsIHJlc2FtcGxlIG1vZGUgaW4gdGhlIEFEMTg0My4KLSAqCi0gKiBUaGUgQUQxODQzIHJlcXVpcmVzIHRoYXQgQURMLCBBRFIsIERBMSBhbmQgREEyIGJlIHBvd2VyZWQgZG93bgotICogd2hpbGUgc3dpdGNoaW5nIG1vZGVzLiAgU28gd2Ugc2F2ZSBEQTEncyBzdGF0ZSAoREEyJ3Mgc3RhdGUgaXMgbm90Ci0gKiBpbnRlcmVzdGluZyksIHBvd2VyIHRoZW0gZG93biwgc3dpdGNoIGludG8vb3V0IG9mIHJlc2FtcGxlIG1vZGUsCi0gKiBwb3dlciB0aGVtIHVwLCBhbmQgcmVzdG9yZSBzdGF0ZS4KLSAqCi0gKiBUaGlzIHdpbGwgY2F1c2UgYXVkaWJsZSBnbGl0Y2hlcyBpZiBEL0Egb3IgQS9EIGlzIGdvaW5nIG9uLCBzbyB0aGUKLSAqIGRyaXZlciBkaXNhbGxvd3MgdGhhdCAoaW4gbWl4ZXJfd3JpdGVfaW9jdGwoKSkuCi0gKgotICogVGhlIG9wZW4gcXVlc3Rpb24gaXMsIGlzIHRoaXMgd29ydGggZG9pbmc/ICBJJ20gbGVhdmluZyBpdCBpbiwKLSAqIGJlY2F1c2UgaXQncyB3cml0dGVuLCBidXQuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aGl1bV90ICpsaXRoLCBpbnQgb25vZmYpCi17Ci0JLyogU2F2ZSBEQTEgbXV0ZSBhbmQgZ2FpbiAoYWRkciA5IGlzIERBMSBhbmFsb2cgZ2Fpbi9hdHRlbnVhdGlvbikgKi8KLQlpbnQgc2F2ZV9kYTEgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgOSk7Ci0KLQkvKiBQb3dlciBkb3duIEEvRCBhbmQgRC9BLiAqLwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCA0LAotCQkJICAgJmFkMTg0M19EQTFFTiwgMCwKLQkJCSAgICZhZDE4NDNfREEyRU4sIDAsCi0JCQkgICAmYWQxODQzX0FETEVOLCAwLAotCQkJICAgJmFkMTg0M19BRFJFTiwgMCk7Ci0KLQkvKiBTd2l0Y2ggbW9kZSAqLwotCUFTU0VSVChvbm9mZiA9PSAwIHx8IG9ub2ZmID09IDEpOwotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfRFJTRkxULCBvbm9mZik7Ci0KLSAJLyogUG93ZXIgdXAgQS9EIGFuZCBEL0EuICovCi0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDMsCi0JCQkgICAmYWQxODQzX0RBMUVOLCAxLAotCQkJICAgJmFkMTg0M19BRExFTiwgMSwKLQkJCSAgICZhZDE4NDNfQURSRU4sIDEpOwotCi0JLyogUmVzdG9yZSBEQTEgbXV0ZSBhbmQgZ2Fpbi4gKi8KLQlsaV93cml0ZV9hZDE4NDNfcmVnKGxpdGgsIDksIHNhdmVfZGExKTsKLX0KLQotLyoKLSAqIFNldCByZWNvcmRpbmcgc291cmNlLiAgQXJnIG5ld3NyYyBzcGVjaWZpZXMgYW4gT1NTIGNoYW5uZWwgbWFzay4KLSAqCi0gKiBUaGUgY29tcGxpY2F0aW9uIGlzIHRoYXQgd2hlbiB3ZSBzd2l0Y2ggaW50by9vdXQgb2YgbG9vcGJhY2sgbW9kZQotICogKGkuZS4sIHNyYyA9IFNPVU5EX01BU0tfUENNKSwgd2UgY2hhbmdlIHRoZSBBRDE4NDMgaW50by9vdXQgb2YKLSAqIGRpZ2l0YWwgcmVzYW1wbGluZyBtb2RlLgotICoKLSAqIFJldHVybnMgbmV3c3JjIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX3NldF9yZWNzcmMobGl0aGl1bV90ICpsaXRoLCBpbnQgbmV3c3JjKQotewotCWludCBiaXRzOwotCWludCBvbGRiaXRzOwotCi0Jc3dpdGNoIChuZXdzcmMpIHsKLQljYXNlIFNPVU5EX01BU0tfUENNOgotCQliaXRzID0gNjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01BU0tfTUlDOgotCQliaXRzID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01BU0tfTElORToKLQkJYml0cyA9IDI7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NQVNLX0NEOgotCQliaXRzID0gMzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jb2xkYml0cyA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MU1MpOwotCWlmIChuZXdzcmMgPT0gU09VTkRfTUFTS19QQ00gJiYgb2xkYml0cyAhPSA2KSB7Ci0JCURCR1AoImVuYWJsaW5nIGRpZ2l0YWwgcmVzYW1wbGUgbW9kZVxuIik7Ci0JCWFkMTg0M19zZXRfcmVzYW1wbGVfbW9kZShsaXRoLCAxKTsKLQkJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkJICAgJmFkMTg0M19EQUFETCwgMiwKLQkJCQkgICAmYWQxODQzX0RBQURSLCAyKTsKLQl9IGVsc2UgaWYgKG5ld3NyYyAhPSBTT1VORF9NQVNLX1BDTSAmJiBvbGRiaXRzID09IDYpIHsKLQkJREJHUCgiZGlzYWJsaW5nIGRpZ2l0YWwgcmVzYW1wbGUgbW9kZVxuIik7Ci0JCWFkMTg0M19zZXRfcmVzYW1wbGVfbW9kZShsaXRoLCAwKTsKLQkJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkJICAgJmFkMTg0M19EQUFETCwgMCwKLQkJCQkgICAmYWQxODQzX0RBQURSLCAwKTsKLQl9Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFNTLCBiaXRzLCAmYWQxODQzX1JTUywgYml0cyk7Ci0JcmV0dXJuIG5ld3NyYzsKLX0KLQotLyoKLSAqIFJldHVybiBjdXJyZW50IG91dHB1dCBzb3VyY2VzLCBpbiBPU1MgZm9ybWF0LgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX2dldF9vdXRzcmMobGl0aGl1bV90ICpsaXRoKQotewotCWludCBwY20sIGxpbmUsIG1pYywgY2Q7Ci0KLQlwY20gID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xEQTFHTSkgPyAwIDogU09VTkRfTUFTS19QQ007Ci0JbGluZSA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MWDFNTSkgID8gMCA6IFNPVU5EX01BU0tfTElORTsKLQljZCAgID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xYMk1NKSAgPyAwIDogU09VTkRfTUFTS19DRDsKLQltaWMgID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xNQ01NKSAgPyAwIDogU09VTkRfTUFTS19NSUM7Ci0KLQlyZXR1cm4gcGNtIHwgbGluZSB8IGNkIHwgbWljOwotfQotCi0vKgotICogU2V0IG91dHB1dCBzb3VyY2VzLiAgQXJnIGlzIGEgbWFzayBvZiBhY3RpdmUgc291cmNlcyBpbiBPU1MgZm9ybWF0LgotICoKLSAqIFJldHVybnMgc291cmNlIG1hc2sgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCi0gKi8KLQotc3RhdGljIGludCBhZDE4NDNfc2V0X291dHNyYyhsaXRoaXVtX3QgKmxpdGgsIGludCBtYXNrKQotewotCWludCBwY20sIGxpbmUsIG1pYywgY2Q7Ci0KLQlpZiAobWFzayAmIH4oU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAotCQkgICAgIFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX01JQykpCi0JCXJldHVybiAtRUlOVkFMOwotCXBjbSAgPSAobWFzayAmIFNPVU5EX01BU0tfUENNKSAgPyAwIDogMTsKLQlsaW5lID0gKG1hc2sgJiBTT1VORF9NQVNLX0xJTkUpID8gMCA6IDE7Ci0JbWljICA9IChtYXNrICYgU09VTkRfTUFTS19NSUMpICA/IDAgOiAxOwotCWNkICAgPSAobWFzayAmIFNPVU5EX01BU0tfQ0QpICAgPyAwIDogMTsKLQotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xEQTFHTSwgcGNtLCAmYWQxODQzX1JEQTFHTSwgcGNtKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MWDFNTSwgbGluZSwgJmFkMTg0M19SWDFNTSwgbGluZSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFgyTU0sIGNkLCAgICZhZDE4NDNfUlgyTU0sIGNkKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MTUNNTSwgbWljLCAgJmFkMTg0M19STUNNTSwgbWljKTsKLQotCXJldHVybiBtYXNrOwotfQotCi0vKiBTZXR1cCBhZDE4NDMgZm9yIEQvQSBjb252ZXJzaW9uLiAqLwotCi1zdGF0aWMgdm9pZCBhZDE4NDNfc2V0dXBfZGFjKGxpdGhpdW1fdCAqbGl0aCwKLQkJCSAgICAgaW50IGZyYW1lcmF0ZSwKLQkJCSAgICAgaW50IGZtdCwKLQkJCSAgICAgaW50IGNoYW5uZWxzKQotewotCWludCBhZF9mbXQgPSAwLCBhZF9tb2RlID0gMDsKLQotCURCR0VWKCIobGl0aD0weCVwLCBmcmFtZXJhdGU9JWQsIGZtdD0lZCwgY2hhbm5lbHM9JWQpXG4iLAotCSAgICAgIGxpdGgsIGZyYW1lcmF0ZSwgZm10LCBjaGFubmVscyk7Ci0KLQlzd2l0Y2ggKGZtdCkgewotCWNhc2UgQUZNVF9TODoJCWFkX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9VODoJCWFkX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9TMTZfTEU6CWFkX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9NVV9MQVc6CWFkX2ZtdCA9IDI7IGJyZWFrOwotCWNhc2UgQUZNVF9BX0xBVzoJYWRfZm10ID0gMzsgYnJlYWs7Ci0JZGVmYXVsdDoJCUFTU0VSVCgwKTsKLQl9Ci0KLQlzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0JY2FzZSAyOgkJCWFkX21vZGUgPSAwOyBicmVhazsKLQljYXNlIDE6CQkJYWRfbW9kZSA9IDE7IGJyZWFrOwotCWRlZmF1bHQ6CQlBU1NFUlQoMCk7Ci0JfQotCQkKLQlEQkdQVigiYWRfbW9kZSA9ICVkLCBhZF9mbXQgPSAlZFxuIiwgYWRfbW9kZSwgYWRfZm10KTsKLQlBU1NFUlQoZnJhbWVyYXRlID49IDQwMDAgJiYgZnJhbWVyYXRlIDw9IDQ5MDAwKTsKLQlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0MxQywgZnJhbWVyYXRlKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwKLQkJCSAgICZhZDE4NDNfREExU00sIGFkX21vZGUsICZhZDE4NDNfREExRiwgYWRfZm10KTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODQzX3NodXRkb3duX2RhYyhsaXRoaXVtX3QgKmxpdGgpCi17Ci0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19EQTFGLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODQzX3NldHVwX2FkYyhsaXRoaXVtX3QgKmxpdGgsIGludCBmcmFtZXJhdGUsIGludCBmbXQsIGludCBjaGFubmVscykKLXsKLQlpbnQgZGFfZm10ID0gMDsKLQotCURCR0VWKCIobGl0aD0weCVwLCBmcmFtZXJhdGU9JWQsIGZtdD0lZCwgY2hhbm5lbHM9JWQpXG4iLAotCSAgICAgIGxpdGgsIGZyYW1lcmF0ZSwgZm10LCBjaGFubmVscyk7Ci0KLQlzd2l0Y2ggKGZtdCkgewotCWNhc2UgQUZNVF9TODoJCWRhX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9VODoJCWRhX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9TMTZfTEU6CWRhX2ZtdCA9IDE7IGJyZWFrOwotCWNhc2UgQUZNVF9NVV9MQVc6CWRhX2ZtdCA9IDI7IGJyZWFrOwotCWNhc2UgQUZNVF9BX0xBVzoJZGFfZm10ID0gMzsgYnJlYWs7Ci0JZGVmYXVsdDoJCUFTU0VSVCgwKTsKLQl9Ci0KLQlEQkdQVigiZGFfZm10ID0gJWRcbiIsIGRhX2ZtdCk7Ci0JQVNTRVJUKGZyYW1lcmF0ZSA+PSA0MDAwICYmIGZyYW1lcmF0ZSA8PSA0OTAwMCk7Ci0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19DMkMsIGZyYW1lcmF0ZSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkgICAmYWQxODQzX0FETEYsIGRhX2ZtdCwgJmFkMTg0M19BRFJGLCBkYV9mbXQpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4NDNfc2h1dGRvd25fYWRjKGxpdGhpdW1fdCAqbGl0aCkKLXsKLQkvKiBub3RoaW5nIHRvIGRvICovCi19Ci0KLS8qCi0gKiBGdWxseSBpbml0aWFsaXplIHRoZSBhZDE4NDMuICBBcyBkZXNjcmliZWQgaW4gdGhlIEFEMTg0MyBkYXRhCi0gKiBzaGVldCwgc2VjdGlvbiAiU1RBUlQtVVAgU0VRVUVOQ0UiLiAgVGhlIG51bWJlcmVkIGNvbW1lbnRzIGFyZQotICogc3Vic2VjdGlvbiBoZWFkaW5ncyBmcm9tIHRoZSBkYXRhIHNoZWV0LiAgU2VlIHRoZSBkYXRhIHNoZWV0LCBwYWdlcwotICogNTItNTQsIGZvciBtb3JlIGluZm8uCi0gKgotICogcmV0dXJuIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhZDE4NDNfaW5pdChsaXRoaXVtX3QgKmxpdGgpCi17Ci0JdW5zaWduZWQgbG9uZyBsYXRlcjsKLQlpbnQgZXJyOwotCi0JZXJyID0gbGlfaW5pdChsaXRoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19JTklUKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidndzbmQgc291bmQ6IEFEMTg0MyB3b24ndCBpbml0aWFsaXplXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19TQ0YsIDEpOwotCi0JLyogNC4gUHV0IHRoZSBjb252ZXJzaW9uIHJlc291cmNlcyBpbnRvIHN0YW5kYnkuICovCi0KLQlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX1BETkksIDApOwotCWxhdGVyID0gamlmZmllcyArIEhaIC8gMjsJLyogcm91Z2hseSBoYWxmIGEgc2Vjb25kICovCi0JREJHRE8oc2h1dF91cCsrKTsKLQl3aGlsZSAoYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX1BETk8pKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGxhdGVyKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgInZ3c25kIGF1ZGlvOiBBRDE4NDMgd29uJ3QgcG93ZXIgdXBcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJc2NoZWR1bGUoKTsKLQl9Ci0JREJHRE8oc2h1dF91cC0tKTsKLQotCS8qIDUuIFBvd2VyIHVwIHRoZSBjbG9jayBnZW5lcmF0b3JzIGFuZCBlbmFibGUgY2xvY2sgb3V0cHV0IHBpbnMuICovCi0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19DMUVOLCAxLCAmYWQxODQzX0MyRU4sIDEpOwotCi0JLyogNi4gQ29uZmlndXJlIGNvbnZlcnNpb24gcmVzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGluIHN0YW5kYnkuICovCi0KLSAJLyogREFDMSB1c2VzIGNsb2NrIDEgYXMgc291cmNlLCBBREMgdXNlcyBjbG9jayAyLiAgQWx3YXlzLiAqLwotCi0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDMsCi0JCQkgICAmYWQxODQzX0RBMUMsIDEsCi0JCQkgICAmYWQxODQzX0FETEMsIDIsCi0JCQkgICAmYWQxODQzX0FEUkMsIDIpOwotCi0JLyogNy4gRW5hYmxlIGNvbnZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19BRFRMSywgMSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDUsCi0JCQkgICAmYWQxODQzX0FOQUVOLCAxLAotCQkJICAgJmFkMTg0M19BQU1FTiwgMSwKLQkJCSAgICZhZDE4NDNfREExRU4sIDEsCi0JCQkgICAmYWQxODQzX0FETEVOLCAxLAotCQkJICAgJmFkMTg0M19BRFJFTiwgMSk7Ci0KLQkvKiA4LiBDb25maWd1cmUgY29udmVyc2lvbiByZXNvdXJjZXMgd2hpbGUgdGhleSBhcmUgZW5hYmxlZC4gKi8KLQotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfREExQywgMSk7Ci0KLQkvKiBVbm11dGUgYWxsIGNoYW5uZWxzLiAqLwotCi0JYWQxODQzX3NldF9vdXRzcmMobGl0aCwKLQkJCSAgKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKLQkJCSAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCkpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xEQTFBTSwgMCwgJmFkMTg0M19SREExQU0sIDApOwotCi0JLyogU2V0IGRlZmF1bHQgcmVjb3JkaW5nIHNvdXJjZSB0byBMaW5lIEluIGFuZCBzZXQKLQkgKiBtaWMgZ2FpbiB0byArMjAgZEIuCi0JICovCi0KLQlhZDE4NDNfc2V0X3JlY3NyYyhsaXRoLCBTT1VORF9NQVNLX0xJTkUpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xNR0UsIDEsICZhZDE4NDNfUk1HRSwgMSk7Ci0KLQkvKiBTZXQgU3BlYWtlciBPdXQgbGV2ZWwgdG8gKy8tIDRWIGFuZCB1bm11dGUgaXQuICovCi0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19IUE9TLCAxLCAmYWQxODQzX0hQT00sIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBDTSBJL08gKi8KLQotI2RlZmluZSBSRUFEX0lOVFJfTUFTSyAgKExJX0lOVFJfQ09NTTFfVFJJRyB8IExJX0lOVFJfQ09NTTFfT1ZFUkZMT1cpCi0jZGVmaW5lIFdSSVRFX0lOVFJfTUFTSyAoTElfSU5UUl9DT01NMl9UUklHIHwgTElfSU5UUl9DT01NMl9VTkRFUkZMT1cpCi0KLXR5cGVkZWYgZW51bSB2d3NuZF9wb3J0X3N3c3RhdGUgewkvKiBzb2Z0d2FyZSBzdGF0ZSAqLwotCVNXX09GRiwKLQlTV19JTklUSUFMLAotCVNXX1JVTiwKLQlTV19EUkFJTiwKLX0gdndzbmRfcG9ydF9zd3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB2d3NuZF9wb3J0X2h3c3RhdGUgewkvKiBoYXJkd2FyZSBzdGF0ZSAqLwotCUhXX1NUT1BQRUQsCi0JSFdfUlVOTklORywKLX0gdndzbmRfcG9ydF9od3N0YXRlX3Q7Ci0KLS8qCi0gKiBUaGVzZSBmbGFncyBhcmUgcmVhZCBieSBJU1IsIGJ1dCBvbmx5IHdyaXR0ZW4gYXQgYmFzZWxpbmUuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHZ3c25kX3BvcnRfZmxhZ3MgewotCURJU0FCTEVEID0gMSA8PCAwLAotCUVSRkxPV04gID0gMSA8PCAxLAkJLyogb3ZlcmZsb3duIG9yIHVuZGVyZmxvd24gKi8KLQlIV19CVVNZICA9IDEgPDwgMiwKLX0gdndzbmRfcG9ydF9mbGFnc190OwotCi0vKgotICogdndzbmRfcG9ydCBpcyB0aGUgcGVyLXBvcnQgZGF0YSBzdHJ1Y3R1cmUuICBFYWNoIGRldmljZSBoYXMgdHdvCi0gKiBwb3J0cywgb25lIGZvciBpbnB1dCBhbmQgb25lIGZvciBvdXRwdXQuCi0gKgotICogTG9ja2luZzoKLSAqCi0gKglwb3J0LT5sb2NrIHByb3RlY3RzOiBod3N0YXRlLCBmbGFncywgc3diX1tpdV1fYXZhaWwuCi0gKgotICoJZGV2Yy0+aW9fbXV0ZXggcHJvdGVjdHM6IHN3c3RhdGUsIHN3XyosIHN3Yl9baXVdX2lkeC4KLSAqCi0gKglldmVyeXRoaW5nIGVsc2UgaXMgb25seSB3cml0dGVuIGJ5IG9wZW4vcmVsZWFzZSBvcgotICoJcGNtX3tzZXR1cCxzaHV0ZG93bn0oKSwgd2hpY2ggYXJlIHNlcmlhbGl6ZWQgYnkgYQotICoJY29tYmluYXRpb24gb2YgZGV2Yy0+b3Blbl9tdXRleCBhbmQgZGV2Yy0+aW9fbXV0ZXguCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdndzbmRfcG9ydCB7Ci0KLQlzcGlubG9ja190CWxvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7Ci0JdndzbmRfcG9ydF9zd3N0YXRlX3Qgc3dzdGF0ZTsKLQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlOwotCXZ3c25kX3BvcnRfZmxhZ3NfdCBmbGFnczsKLQotCWludAkJc3dfY2hhbm5lbHM7Ci0JaW50CQlzd19zYW1wbGVmbXQ7Ci0JaW50CQlzd19mcmFtZXJhdGU7Ci0JaW50CQlzYW1wbGVfc2l6ZTsKLQlpbnQJCWZyYW1lX3NpemU7Ci0JdW5zaWduZWQgaW50CXplcm9fd29yZDsJLyogemVybyBmb3IgdGhlIHNhbXBsZSBmb3JtYXQgKi8KLQotCWludAkJc3dfZnJhZ3NoaWZ0OwotCWludAkJc3dfZnJhZ2NvdW50OwotCWludAkJc3dfc3ViZGl2c2hpZnQ7Ci0KLQl1bnNpZ25lZCBpbnQJaHdfZnJhZ3NoaWZ0OwotCXVuc2lnbmVkIGludAlod19mcmFnc2l6ZTsKLQl1bnNpZ25lZCBpbnQJaHdfZnJhZ2NvdW50OwotCi0JaW50CQlod2J1Zl9zaXplOwotCXVuc2lnbmVkIGxvbmcJaHdidWZfcGFkZHI7Ci0JdW5zaWduZWQgbG9uZwlod2J1Zl92YWRkcjsKLQl2b2lkICoJCWh3YnVmOwkJLyogaHdidWYgPT0gaHdidWZfdmFkZHIgKi8KLQlpbnQJCWh3YnVmX21heDsJLyogbWF4IGJ5dGVzIHRvIHByZWxvYWQgKi8KLQotCXZvaWQgKgkJc3didWY7Ci0JdW5zaWduZWQgaW50CXN3YnVmX3NpemU7CS8qIHNpemUgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQJc3diX3VfaWR4OwkvKiBpbmRleCBvZiBuZXh0IHVzZXIgYnl0ZSAqLwotCXVuc2lnbmVkIGludAlzd2JfaV9pZHg7CS8qIGluZGV4IG9mIG5leHQgaW50ciBieXRlICovCi0JdW5zaWduZWQgaW50CXN3Yl91X2F2YWlsOwkvKiAjIGJ5dGVzIGF2YWlsIHRvIHVzZXIgKi8KLQl1bnNpZ25lZCBpbnQJc3diX2lfYXZhaWw7CS8qICMgYnl0ZXMgYXZhaWwgdG8gaW50ciAqLwotCi0JZG1hX2NoYW5fdAljaGFuOwotCi0JLyogQWNjb3VudGluZyAqLwotCi0JaW50CQlieXRlX2NvdW50OwotCWludAkJZnJhZ19jb3VudDsKLQlpbnQJCU1TQ19vZmZzZXQ7Ci0KLX0gdndzbmRfcG9ydF90OwotCi0vKiB2d3NuZF9kZXYgaXMgdGhlIHBlci1kZXZpY2UgZGF0YSBzdHJ1Y3R1cmUuICovCi0KLXR5cGVkZWYgc3RydWN0IHZ3c25kX2RldiB7Ci0Jc3RydWN0IHZ3c25kX2RldiAqbmV4dF9kZXY7Ci0JaW50CQlhdWRpb19taW5vcjsJLyogbWlub3IgbnVtYmVyIG9mIGF1ZGlvIGRldmljZSAqLwotCWludAkJbWl4ZXJfbWlub3I7CS8qIG1pbm9yIG51bWJlciBvZiBtaXhlciBkZXZpY2UgKi8KLQotCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwotCXN0cnVjdCBtdXRleCBpb19tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggbWl4X211dGV4OwotCWZtb2RlX3QJCW9wZW5fbW9kZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7Ci0KLQlsaXRoaXVtX3QJbGl0aDsKLQotCXZ3c25kX3BvcnRfdAlycG9ydDsKLQl2d3NuZF9wb3J0X3QJd3BvcnQ7Ci19IHZ3c25kX2Rldl90OwotCi1zdGF0aWMgdndzbmRfZGV2X3QgKnZ3c25kX2Rldl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiBhbGwgZGV2aWNlcyAqLwotCi1zdGF0aWMgYXRvbWljX3QgdndzbmRfdXNlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLSMgZGVmaW5lIElOQ19VU0VfQ09VTlQgKGF0b21pY19pbmMoJnZ3c25kX3VzZV9jb3VudCkpCi0jIGRlZmluZSBERUNfVVNFX0NPVU5UIChhdG9taWNfZGVjKCZ2d3NuZF91c2VfY291bnQpKQotIyBkZWZpbmUgSU5fVVNFICAgICAgICAoYXRvbWljX3JlYWQoJnZ3c25kX3VzZV9jb3VudCkgIT0gMCkKLQotLyoKLSAqIExpdGhpdW0gY2FuIG9ubHkgRE1BIG11bHRpcGxlcyBvZiAzMiBieXRlcy4gIEl0cyBETUEgYnVmZmVyIG1heQotICogYmUgdXAgdG8gOCBLYi4gIFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIDggS2IuCi0gKgotICogTWVtb3J5IGJ1ZyB3b3JrYXJvdW5kIC0tIEknbSBub3Qgc3VyZSB3aGF0J3MgZ29pbmcgb24gaGVyZSwgYnV0Ci0gKiBzb21laG93IHBjbV9jb3B5X291dCgpIHdhcyB0cmlnZ2VyaW5nIHNlZ3YncyBnb2luZyBvbiB0byB0aGUgbmV4dAotICogcGFnZSBvZiB0aGUgaHcgYnVmZmVyLiAgU28sIEkgbWFrZSB0aGUgaHcgYnVmZmVyIG9uZSBzaXplIGJpZ2dlcgotICogdGhhbiB3ZSBhY3R1YWxseSB1c2UuICBUaGF0IHdheSwgdGhlIGZvbGxvd2luZyBwYWdlIGlzIGFsbG9jYXRlZAotICogYW5kIG1hcHBlZCwgYW5kIG5vIGVycm9yLiAgSSBzdXNwZWN0IHRoYXQgc29tZXRoaW5nIGlzIGJyb2tlbgotICogaW4gQ29iYWx0LCBidXQgaGF2ZW4ndCByZWFsbHkgaW52ZXN0aWdhdGVkLiAgSEJPIGlzIHRoZSBhY3R1YWwKLSAqIHNpemUgb2YgdGhlIGJ1ZmZlciwgYW5kIEhXQlVGX09SREVSIGlzIHdoYXQgd2UgYWxsb2NhdGUuCi0gKi8KLQotI2RlZmluZSBIV0JVRl9TSElGVCAxMwotI2RlZmluZSBIV0JVRl9TSVpFICgxIDw8IEhXQlVGX1NISUZUKQotIyBkZWZpbmUgSEJPICAgICAgICAgKEhXQlVGX1NISUZUID4gUEFHRV9TSElGVCA/IEhXQlVGX1NISUZUIC0gUEFHRV9TSElGVCA6IDApCi0jIGRlZmluZSBIV0JVRl9PUkRFUiAoSEJPICsgMSkJCS8qIG5leHQgc2l6ZSBiaWdnZXIgKi8KLSNkZWZpbmUgTUlOX1NQRUVEIDQwMDAKLSNkZWZpbmUgTUFYX1NQRUVEIDQ5MDAwCi0KLSNkZWZpbmUgTUlOX0ZSQUdTSElGVAkJCShETUFDSFVOS19TSElGVCArIDEpCi0jZGVmaW5lIE1BWF9GUkFHU0hJRlQJCQkoUEFHRV9TSElGVCkKLSNkZWZpbmUgTUlOX0ZSQUdTSVpFCQkJKDEgPDwgTUlOX0ZSQUdTSElGVCkKLSNkZWZpbmUgTUFYX0ZSQUdTSVpFCQkJKDEgPDwgTUFYX0ZSQUdTSElGVCkKLSNkZWZpbmUgTUlOX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCTMKLSNkZWZpbmUgTUFYX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCSgzMiAqIFBBR0VfU0laRSAvIChmcmFnc2l6ZSkpCi0jZGVmaW5lIERFRkFVTFRfRlJBR1NISUZUCQkxMgotI2RlZmluZSBERUZBVUxUX0ZSQUdDT1VOVAkJMTYKLSNkZWZpbmUgREVGQVVMVF9TVUJESVZTSElGVAkJMAotCi0vKgotICogVGhlIHNvZnR3YXJlIGJ1ZmZlciAoc3didWYpIGlzIGEgcmluZyBidWZmZXIgc2hhcmVkIGJldHdlZW4gdXNlcgotICogbGV2ZWwgYW5kIGludGVycnVwdCBsZXZlbC4gIEVhY2ggbGV2ZWwgb3ducyBzb21lIG9mIHRoZSBieXRlcyBpbgotICogdGhlIGJ1ZmZlciwgYW5kIG1heSBnaXZlIGJ5dGVzIGF3YXkgYnkgY2FsbGluZyBzd2JfaW5jX3t1LGl9KCkuCi0gKiBVc2VyIGxldmVsIGNhbGxzIF91IGZvciB1c2VyLCBhbmQgaW50ZXJydXB0IGxldmVsIGNhbGxzIF9pIGZvcgotICogaW50ZXJydXB0LgotICoKLSAqIHBvcnQtPnN3Yl97dSxpfV9hdmFpbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGF0IGxldmVsLgotICoKLSAqIHBvcnQtPnN3Yl97dSxpfV9pZHggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhdmFpbGFibGUgYnl0ZSBpbiB0aGUKLSAqIGJ1ZmZlci4KLSAqCi0gKiBFYWNoIGxldmVsIGNhbGxzIHN3Yl9pbmNfe3UsaX0oKSB0byBhdG9taWNhbGx5IGluY3JlbWVudCBpdHMgaW5kZXgsCi0gKiByZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgYm90aCBzaWRlcywgYW5kCi0gKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuICBTaW5jZSBlYWNoIHNpZGUgY2FuIG9ubHkKLSAqIGdpdmUgYXdheSBieXRlcywgdGhlIG90aGVyIHNpZGUgY2FuIG9ubHkgaW5jcmVhc2UgdGhlIG51bWJlciBvZgotICogYnl0ZXMgYXZhaWxhYmxlIHRvIHRoaXMgc2lkZS4gIEVhY2ggc2lkZSB1cGRhdGVzIGl0cyBvd24gaW5kZXgKLSAqIHZhcmlhYmxlLCBzd2Jfe3UsaX1faWR4LCBzbyBubyBsb2NrIGlzIG5lZWRlZCB0byByZWFkIGl0LgotICoKLSAqIFRvIHF1ZXJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCBjYWxsIHN3Yl9pbmNfe3UsaX0gd2l0aCBhbgotICogaW5jcmVtZW50IG9mIHplcm8uCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKLXsKLQlpZiAoaW5jKSB7Ci0JCXBvcnQtPnN3Yl91X2lkeCArPSBpbmM7Ci0JCXBvcnQtPnN3Yl91X2lkeCAlPSBwb3J0LT5zd2J1Zl9zaXplOwotCQlwb3J0LT5zd2JfdV9hdmFpbCAtPSBpbmM7Ci0JCXBvcnQtPnN3Yl9pX2F2YWlsICs9IGluYzsKLQl9Ci0JcmV0dXJuIHBvcnQtPnN3Yl91X2F2YWlsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXsKLQkJcmV0ID0gX19zd2JfaW5jX3UocG9ydCwgaW5jKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX3N3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCi17Ci0JaWYgKGluYykgewotCQlwb3J0LT5zd2JfaV9pZHggKz0gaW5jOwotCQlwb3J0LT5zd2JfaV9pZHggJT0gcG9ydC0+c3didWZfc2l6ZTsKLQkJcG9ydC0+c3diX2lfYXZhaWwgLT0gaW5jOwotCQlwb3J0LT5zd2JfdV9hdmFpbCArPSBpbmM7Ci0JfQotCXJldHVybiBwb3J0LT5zd2JfaV9hdmFpbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHN3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl7Ci0JCXJldCA9IF9fc3diX2luY19pKHBvcnQsIGluYyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogcGNtX3NldHVwIC0gdGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGFsbCBwb3J0IHN0YXRlIGFmdGVyCi0gKiBtb2RlLXNldHRpbmcgaW9jdGxzIGhhdmUgYmVlbiBkb25lLCBidXQgYmVmb3JlIHRoZSBmaXJzdCBJL08gaXMKLSAqIGRvbmUuCi0gKgotICogTG9ja2luZzogY2FsbGVkIHdpdGggZGV2Yy0+aW9fbXV0ZXggaGVsZC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCi0gKi8KLQotc3RhdGljIGludCBwY21fc2V0dXAodndzbmRfZGV2X3QgKmRldmMsCi0JCSAgICAgdndzbmRfcG9ydF90ICpycG9ydCwKLQkJICAgICB2d3NuZF9wb3J0X3QgKndwb3J0KQotewotCXZ3c25kX3BvcnRfdCAqYXBvcnQgPSBycG9ydCA/IHJwb3J0IDogd3BvcnQ7Ci0JaW50IHNhbXBsZV9zaXplOwotCXVuc2lnbmVkIGludCB6ZXJvX3dvcmQ7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgcnBvcnQ9MHglcCwgd3BvcnQ9MHglcClcbiIsIGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0KLQlBU1NFUlQoYXBvcnQgIT0gTlVMTCk7Ci0JaWYgKGFwb3J0LT5zd2J1ZiAhPSBOVUxMKQotCQlyZXR1cm4gMDsKLQlzd2l0Y2ggKGFwb3J0LT5zd19zYW1wbGVmbXQpIHsKLQljYXNlIEFGTVRfTVVfTEFXOgotCQlzYW1wbGVfc2l6ZSA9IDE7Ci0JCXplcm9fd29yZCA9IDB4RkZGRkZGRkYgXiAweDgwODA4MDgwOwotCQlicmVhazsKLQotCWNhc2UgQUZNVF9BX0xBVzoKLQkJc2FtcGxlX3NpemUgPSAxOwotCQl6ZXJvX3dvcmQgPSAweEQ1RDVENUQ1IF4gMHg4MDgwODA4MDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfVTg6Ci0JCXNhbXBsZV9zaXplID0gMTsKLQkJemVyb193b3JkID0gMHg4MDgwODA4MDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfUzg6Ci0JCXNhbXBsZV9zaXplID0gMTsKLQkJemVyb193b3JkID0gMHgwMDAwMDAwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfUzE2X0xFOgotCQlzYW1wbGVfc2l6ZSA9IDI7Ci0JCXplcm9fd29yZCA9IDB4MDAwMDAwMDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc2FtcGxlX3NpemUgPSAwOwkvKiBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcgKi8KLQkJemVyb193b3JkID0gMDsKLQkJQVNTRVJUKDApOwotCX0KLQlhcG9ydC0+c2FtcGxlX3NpemUgID0gc2FtcGxlX3NpemU7Ci0JYXBvcnQtPnplcm9fd29yZCAgICA9IHplcm9fd29yZDsKLQlhcG9ydC0+ZnJhbWVfc2l6ZSAgID0gYXBvcnQtPnN3X2NoYW5uZWxzICogYXBvcnQtPnNhbXBsZV9zaXplOwotCWFwb3J0LT5od19mcmFnc2hpZnQgPSBhcG9ydC0+c3dfZnJhZ3NoaWZ0IC0gYXBvcnQtPnN3X3N1YmRpdnNoaWZ0OwotCWFwb3J0LT5od19mcmFnc2l6ZSAgPSAxIDw8IGFwb3J0LT5od19mcmFnc2hpZnQ7Ci0JYXBvcnQtPmh3X2ZyYWdjb3VudCA9IGFwb3J0LT5zd19mcmFnY291bnQgPDwgYXBvcnQtPnN3X3N1YmRpdnNoaWZ0OwotCUFTU0VSVChhcG9ydC0+aHdfZnJhZ3NpemUgPj0gTUlOX0ZSQUdTSVpFKTsKLQlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdzaXplIDw9IE1BWF9GUkFHU0laRSk7Ci0JQVNTRVJUKGFwb3J0LT5od19mcmFnY291bnQgPj0gTUlOX0ZSQUdDT1VOVChhcG9ydC0+aHdfZnJhZ3NpemUpKTsKLQlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdjb3VudCA8PSBNQVhfRlJBR0NPVU5UKGFwb3J0LT5od19mcmFnc2l6ZSkpOwotCWlmIChycG9ydCkgewotCQlpbnQgaHdmcmFncywgc3dmcmFnczsKLQkJcnBvcnQtPmh3YnVmX21heCA9IGFwb3J0LT5od2J1Zl9zaXplIC0gRE1BQ0hVTktfU0laRTsKLQkJaHdmcmFncyA9IHJwb3J0LT5od2J1Zl9tYXggPj4gYXBvcnQtPmh3X2ZyYWdzaGlmdDsKLQkJc3dmcmFncyA9IGFwb3J0LT5od19mcmFnY291bnQgLSBod2ZyYWdzOwotCQlpZiAoc3dmcmFncyA8IDIpCi0JCQlzd2ZyYWdzID0gMjsKLQkJcnBvcnQtPnN3YnVmX3NpemUgPSBzd2ZyYWdzICogYXBvcnQtPmh3X2ZyYWdzaXplOwotCQlEQkdQVigiaHdmcmFncyA9ICVkLCBzd2ZyYWdzID0gJWRcbiIsIGh3ZnJhZ3MsIHN3ZnJhZ3MpOwotCQlEQkdQVigicmVhZCBod2J1Zl9tYXggPSAlZCwgc3didWZfc2l6ZSA9ICVkXG4iLAotCQkgICAgIHJwb3J0LT5od2J1Zl9tYXgsIHJwb3J0LT5zd2J1Zl9zaXplKTsKLQl9Ci0JaWYgKHdwb3J0KSB7Ci0JCWludCBod2ZyYWdzLCBzd2ZyYWdzOwotCQlpbnQgdG90YWxfYnl0ZXMgPSBhcG9ydC0+aHdfZnJhZ2NvdW50ICogYXBvcnQtPmh3X2ZyYWdzaXplOwotCQl3cG9ydC0+aHdidWZfbWF4ID0gYXBvcnQtPmh3YnVmX3NpemUgLSBETUFDSFVOS19TSVpFOwotCQlpZiAod3BvcnQtPmh3YnVmX21heCA+IHRvdGFsX2J5dGVzKQotCQkJd3BvcnQtPmh3YnVmX21heCA9IHRvdGFsX2J5dGVzOwotCQlod2ZyYWdzID0gd3BvcnQtPmh3YnVmX21heCA+PiBhcG9ydC0+aHdfZnJhZ3NoaWZ0OwotCQlEQkdQVigiaHdmcmFncyA9ICVkXG4iLCBod2ZyYWdzKTsKLQkJc3dmcmFncyA9IGFwb3J0LT5od19mcmFnY291bnQgLSBod2ZyYWdzOwotCQlpZiAoc3dmcmFncyA8IDIpCi0JCQlzd2ZyYWdzID0gMjsKLQkJd3BvcnQtPnN3YnVmX3NpemUgPSBzd2ZyYWdzICogYXBvcnQtPmh3X2ZyYWdzaXplOwotCQlEQkdQVigiaHdmcmFncyA9ICVkLCBzd2ZyYWdzID0gJWRcbiIsIGh3ZnJhZ3MsIHN3ZnJhZ3MpOwotCQlEQkdQVigid3JpdGUgaHdidWZfbWF4ID0gJWQsIHN3YnVmX3NpemUgPSAlZFxuIiwKLQkJICAgICB3cG9ydC0+aHdidWZfbWF4LCB3cG9ydC0+c3didWZfc2l6ZSk7Ci0JfQotCi0JYXBvcnQtPnN3Yl91X2lkeCAgICA9IDA7Ci0JYXBvcnQtPnN3Yl9pX2lkeCAgICA9IDA7Ci0JYXBvcnQtPmJ5dGVfY291bnQgICA9IDA7Ci0KLQkvKgotCSAqIElzIHRoaXMgYSBDb2JhbHQgYnVnPyAgV2UgbmVlZCB0byBtYWtlIHRoaXMgYnVmZmVyIGV4dGVuZAotCSAqIG9uZSBwYWdlIGZ1cnRoZXIgdGhhbiB3ZSBhY3R1YWxseSB1c2UgLS0gc29tZWhvdyBtZW1jcHkKLQkgKiBjYXVzZXMgYW4gZXhjZXB0b2luIG90aGVyd2lzZS4gIEkgc3VzcGVjdCB0aGVyZSdzIGEgYnVnIGluCi0JICogQ29iYWx0IChvciBzb21ld2hlcmUpIHdoZXJlIGl0J3MgZ2VuZXJhdGluZyBhIGZhdWx0IG9uIGEKLQkgKiBzcGVjdWxhdGl2ZSBsb2FkIG9yIHNvbWV0aGluZy4gIE9idmlvdXNseSwgSSBoYXZlbid0IHRha2VuCi0JICogdGhlIHRpbWUgdG8gdHJhY2sgaXQgZG93bi4KLQkgKi8KLQotCWFwb3J0LT5zd2J1ZiAgICAgICAgPSB2bWFsbG9jKGFwb3J0LT5zd2J1Zl9zaXplICsgUEFHRV9TSVpFKTsKLQlpZiAoIWFwb3J0LT5zd2J1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKHJwb3J0ICYmIHdwb3J0KSB7Ci0JCUFTU0VSVChhcG9ydCA9PSBycG9ydCk7Ci0JCUFTU0VSVCh3cG9ydC0+c3didWYgPT0gTlVMTCk7Ci0JCS8qIE9uZSBleHRyYSBwYWdlIC0gc2VlIGNvbW1lbnQgYWJvdmUuICovCi0JCXdwb3J0LT5zd2J1ZiA9IHZtYWxsb2MoYXBvcnQtPnN3YnVmX3NpemUgKyBQQUdFX1NJWkUpOwotCQlpZiAoIXdwb3J0LT5zd2J1ZikgewotCQkJdmZyZWUoYXBvcnQtPnN3YnVmKTsKLQkJCWFwb3J0LT5zd2J1ZiA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQl3cG9ydC0+c2FtcGxlX3NpemUgID0gcnBvcnQtPnNhbXBsZV9zaXplOwotCQl3cG9ydC0+emVyb193b3JkICAgID0gcnBvcnQtPnplcm9fd29yZDsKLQkJd3BvcnQtPmZyYW1lX3NpemUgICA9IHJwb3J0LT5mcmFtZV9zaXplOwotCQl3cG9ydC0+aHdfZnJhZ3NoaWZ0ID0gcnBvcnQtPmh3X2ZyYWdzaGlmdDsKLQkJd3BvcnQtPmh3X2ZyYWdzaXplICA9IHJwb3J0LT5od19mcmFnc2l6ZTsKLQkJd3BvcnQtPmh3X2ZyYWdjb3VudCA9IHJwb3J0LT5od19mcmFnY291bnQ7Ci0JCXdwb3J0LT5zd2J1Zl9zaXplICAgPSBycG9ydC0+c3didWZfc2l6ZTsKLQkJd3BvcnQtPmh3YnVmX21heCAgICA9IHJwb3J0LT5od2J1Zl9tYXg7Ci0JCXdwb3J0LT5zd2JfdV9pZHggICAgPSBycG9ydC0+c3diX3VfaWR4OwotCQl3cG9ydC0+c3diX2lfaWR4ICAgID0gcnBvcnQtPnN3Yl9pX2lkeDsKLQkJd3BvcnQtPmJ5dGVfY291bnQgICA9IHJwb3J0LT5ieXRlX2NvdW50OwotCX0KLQlpZiAocnBvcnQpIHsKLQkJcnBvcnQtPnN3Yl91X2F2YWlsID0gMDsKLQkJcnBvcnQtPnN3Yl9pX2F2YWlsID0gcnBvcnQtPnN3YnVmX3NpemU7Ci0JCXJwb3J0LT5zd3N0YXRlID0gU1dfUlVOOwotCQlsaV9zZXR1cF9kbWEoJnJwb3J0LT5jaGFuLAotCQkJICAgICAmbGlfY29tbTEsCi0JCQkgICAgICZkZXZjLT5saXRoLAotCQkJICAgICBycG9ydC0+aHdidWZfcGFkZHIsCi0JCQkgICAgIEhXQlVGX1NISUZULAotCQkJICAgICBycG9ydC0+aHdfZnJhZ3NoaWZ0LAotCQkJICAgICBycG9ydC0+c3dfY2hhbm5lbHMsCi0JCQkgICAgIHJwb3J0LT5zYW1wbGVfc2l6ZSk7Ci0JCWFkMTg0M19zZXR1cF9hZGMoJmRldmMtPmxpdGgsCi0JCQkJIHJwb3J0LT5zd19mcmFtZXJhdGUsCi0JCQkJIHJwb3J0LT5zd19zYW1wbGVmbXQsCi0JCQkJIHJwb3J0LT5zd19jaGFubmVscyk7Ci0JCWxpX2VuYWJsZV9pbnRlcnJ1cHRzKCZkZXZjLT5saXRoLCBSRUFEX0lOVFJfTUFTSyk7Ci0JCWlmICghKHJwb3J0LT5mbGFncyAmIERJU0FCTEVEKSkgewotCQkJdXN0bXNjX3QgdXN0bXNjOwotCQkJcnBvcnQtPmh3c3RhdGUgPSBIV19SVU5OSU5HOwotCQkJbGlfYWN0aXZhdGVfZG1hKCZycG9ydC0+Y2hhbik7Ci0JCQlsaV9yZWFkX1VTVE1TQygmcnBvcnQtPmNoYW4sICZ1c3Rtc2MpOwotCQkJcnBvcnQtPk1TQ19vZmZzZXQgPSB1c3Rtc2MubXNjOwotCQl9Ci0JfQotCWlmICh3cG9ydCkgewotCQlpZiAod3BvcnQtPmh3YnVmX21heCA+IHdwb3J0LT5zd2J1Zl9zaXplKQotCQkJd3BvcnQtPmh3YnVmX21heCA9IHdwb3J0LT5zd2J1Zl9zaXplOwotCQl3cG9ydC0+ZmxhZ3MgJj0gfkVSRkxPV047Ci0JCXdwb3J0LT5zd2JfdV9hdmFpbCA9IHdwb3J0LT5zd2J1Zl9zaXplOwotCQl3cG9ydC0+c3diX2lfYXZhaWwgPSAwOwotCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX1JVTjsKLQkJbGlfc2V0dXBfZG1hKCZ3cG9ydC0+Y2hhbiwKLQkJCSAgICAgJmxpX2NvbW0yLAotCQkJICAgICAmZGV2Yy0+bGl0aCwKLQkJCSAgICAgd3BvcnQtPmh3YnVmX3BhZGRyLAotCQkJICAgICBIV0JVRl9TSElGVCwKLQkJCSAgICAgd3BvcnQtPmh3X2ZyYWdzaGlmdCwKLQkJCSAgICAgd3BvcnQtPnN3X2NoYW5uZWxzLAotCQkJICAgICB3cG9ydC0+c2FtcGxlX3NpemUpOwotCQlhZDE4NDNfc2V0dXBfZGFjKCZkZXZjLT5saXRoLAotCQkJCSB3cG9ydC0+c3dfZnJhbWVyYXRlLAotCQkJCSB3cG9ydC0+c3dfc2FtcGxlZm10LAotCQkJCSB3cG9ydC0+c3dfY2hhbm5lbHMpOwotCQlsaV9lbmFibGVfaW50ZXJydXB0cygmZGV2Yy0+bGl0aCwgV1JJVEVfSU5UUl9NQVNLKTsKLQl9Ci0JREJHUlYoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHBjbV9zaHV0ZG93bl9wb3J0IC0gc2h1dCBkb3duIG9uZSBwb3J0IChkaXJlY3Rpb24pIGZvciBQQ00gSS9PLgotICogT25seSBjYWxsZWQgZnJvbSBwY21fc2h1dGRvd24uCi0gKi8KLQotc3RhdGljIHZvaWQgcGNtX3NodXRkb3duX3BvcnQodndzbmRfZGV2X3QgKmRldmMsCi0JCQkgICAgICB2d3NuZF9wb3J0X3QgKmFwb3J0LAotCQkJICAgICAgdW5zaWduZWQgaW50IG1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JYXBvcnQtPnN3c3RhdGUgPSBTV19JTklUSUFMOwotCWFkZF93YWl0X3F1ZXVlKCZhcG9ydC0+cXVldWUsICZ3YWl0KTsKLQl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQlod3N0YXRlID0gYXBvcnQtPmh3c3RhdGU7Ci0JCX0JCQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoaHdzdGF0ZSA9PSBIV19TVE9QUEVEKQotCQkJYnJlYWs7Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZhcG9ydC0+cXVldWUsICZ3YWl0KTsKLQlsaV9kaXNhYmxlX2ludGVycnVwdHMoJmRldmMtPmxpdGgsIG1hc2spOwotCWlmIChhcG9ydCA9PSAmZGV2Yy0+cnBvcnQpCi0JCWFkMTg0M19zaHV0ZG93bl9hZGMoJmRldmMtPmxpdGgpOwotCWVsc2UgLyogYXBvcnQgPT0gJmRldmMtPndwb3J0KSAqLwotCQlhZDE4NDNfc2h1dGRvd25fZGFjKCZkZXZjLT5saXRoKTsKLQlsaV9zaHV0ZG93bl9kbWEoJmFwb3J0LT5jaGFuKTsKLQl2ZnJlZShhcG9ydC0+c3didWYpOwotCWFwb3J0LT5zd2J1ZiA9IE5VTEw7Ci0JYXBvcnQtPmJ5dGVfY291bnQgPSAwOwotfQotCi0vKgotICogcGNtX3NodXRkb3duIHVuZG9lcyB3aGF0IHBjbV9zZXR1cCBkaWQuCi0gKiBBbHNvIHNldHMgdGhlIHBvcnRzJyBzd3N0YXRlIHRvIG5ld3N0YXRlLgotICovCi0KLXN0YXRpYyB2b2lkIHBjbV9zaHV0ZG93bih2d3NuZF9kZXZfdCAqZGV2YywKLQkJCSB2d3NuZF9wb3J0X3QgKnJwb3J0LAotCQkJIHZ3c25kX3BvcnRfdCAqd3BvcnQpCi17Ci0JREJHRVYoIihkZXZjPTB4JXAsIHJwb3J0PTB4JXAsIHdwb3J0PTB4JXApXG4iLCBkZXZjLCBycG9ydCwgd3BvcnQpOwotCi0JaWYgKHJwb3J0ICYmIHJwb3J0LT5zd2J1ZikgewotCQlEQkdQVigic2h1dHRpbmcgZG93biBycG9ydFxuIik7Ci0JCXBjbV9zaHV0ZG93bl9wb3J0KGRldmMsIHJwb3J0LCBSRUFEX0lOVFJfTUFTSyk7Ci0JfQotCWlmICh3cG9ydCAmJiB3cG9ydC0+c3didWYpIHsKLQkJREJHUFYoInNodXR0aW5nIGRvd24gd3BvcnRcbiIpOwotCQlwY21fc2h1dGRvd25fcG9ydChkZXZjLCB3cG9ydCwgV1JJVEVfSU5UUl9NQVNLKTsKLQl9Ci0JREJHUlYoKTsKLX0KLQotc3RhdGljIHZvaWQgcGNtX2NvcHlfaW4odndzbmRfcG9ydF90ICpycG9ydCwgaW50IHN3aWR4LCBpbnQgaHdpZHgsIGludCBuYikKLXsKLQljaGFyICpzcmMgPSBycG9ydC0+aHdidWYgKyBod2lkeDsKLQljaGFyICpkc3QgPSBycG9ydC0+c3didWYgKyBzd2lkeDsKLQlpbnQgZm10ID0gcnBvcnQtPnN3X3NhbXBsZWZtdDsKLQotCURCR1BWKCJzd2lkeCA9ICVkLCBod2lkeCA9ICVkXG4iLCBzd2lkeCwgaHdpZHgpOwotCUFTU0VSVChycG9ydC0+aHdidWYgIT0gTlVMTCk7Ci0JQVNTRVJUKHJwb3J0LT5zd2J1ZiAhPSBOVUxMKTsKLQlBU1NFUlQobmIgPiAwICYmIChuYiAlIDMyKSA9PSAwKTsKLQlBU1NFUlQoc3dpZHggJSAzMiA9PSAwICYmIGh3aWR4ICUgMzIgPT0gMCk7Ci0JQVNTRVJUKHN3aWR4ID49IDAgJiYgc3dpZHggKyBuYiA8PSBycG9ydC0+c3didWZfc2l6ZSk7Ci0JQVNTRVJUKGh3aWR4ID49IDAgJiYgaHdpZHggKyBuYiA8PSBycG9ydC0+aHdidWZfc2l6ZSk7Ci0KLQlpZiAoZm10ID09IEFGTVRfTVVfTEFXIHx8IGZtdCA9PSBBRk1UX0FfTEFXIHx8IGZtdCA9PSBBRk1UX1M4KSB7Ci0KLQkJLyogU2VlIFNhbXBsZSBGb3JtYXQgTm90ZXMgYWJvdmUuICovCi0KLQkJY2hhciAqZW5kID0gc3JjICsgbmI7Ci0JCXdoaWxlIChzcmMgPCBlbmQpCi0JCQkqZHN0KysgPSAqc3JjKysgXiAweDgwOwotCX0gZWxzZQotCQltZW1jcHkoZHN0LCBzcmMsIG5iKTsKLX0KLQotc3RhdGljIHZvaWQgcGNtX2NvcHlfb3V0KHZ3c25kX3BvcnRfdCAqd3BvcnQsIGludCBzd2lkeCwgaW50IGh3aWR4LCBpbnQgbmIpCi17Ci0JY2hhciAqc3JjID0gd3BvcnQtPnN3YnVmICsgc3dpZHg7Ci0JY2hhciAqZHN0ID0gd3BvcnQtPmh3YnVmICsgaHdpZHg7Ci0JaW50IGZtdCA9IHdwb3J0LT5zd19zYW1wbGVmbXQ7Ci0KLQlBU1NFUlQobmIgPiAwICYmIChuYiAlIDMyKSA9PSAwKTsKLQlBU1NFUlQod3BvcnQtPmh3YnVmICE9IE5VTEwpOwotCUFTU0VSVCh3cG9ydC0+c3didWYgIT0gTlVMTCk7Ci0JQVNTRVJUKHN3aWR4ICUgMzIgPT0gMCAmJiBod2lkeCAlIDMyID09IDApOwotCUFTU0VSVChzd2lkeCA+PSAwICYmIHN3aWR4ICsgbmIgPD0gd3BvcnQtPnN3YnVmX3NpemUpOwotCUFTU0VSVChod2lkeCA+PSAwICYmIGh3aWR4ICsgbmIgPD0gd3BvcnQtPmh3YnVmX3NpemUpOwotCWlmIChmbXQgPT0gQUZNVF9NVV9MQVcgfHwgZm10ID09IEFGTVRfQV9MQVcgfHwgZm10ID09IEFGTVRfUzgpIHsKLQotCQkvKiBTZWUgU2FtcGxlIEZvcm1hdCBOb3RlcyBhYm92ZS4gKi8KLQotCQljaGFyICplbmQgPSBzcmMgKyBuYjsKLQkJd2hpbGUgKHNyYyA8IGVuZCkKLQkJCSpkc3QrKyA9ICpzcmMrKyBeIDB4ODA7Ci0JfSBlbHNlCi0JCW1lbWNweShkc3QsIHNyYywgbmIpOwotfQotCi0vKgotICogcGNtX291dHB1dCgpIGlzIGNhbGxlZCBib3RoIGZyb20gYmFzZWxldmVsIGFuZCBmcm9tIGludGVycnVwdCBsZXZlbC4KLSAqIFRoaXMgaXMgd2hlcmUgYXVkaW8gZnJhbWVzIGFyZSBjb3BpZWQgaW50byB0aGUgaGFyZHdhcmUtYWNjZXNzaWJsZQotICogcmluZyBidWZmZXIuCi0gKgotICogTG9ja2luZyBub3RlOiBUaGUgcGFydCBvZiB0aGlzIHJvdXRpbmUgdGhhdCBmaWd1cmVzIG91dCB3aGF0IHRvIGRvCi0gKiBob2xkcyB3cG9ydC0+bG9jay4gIFRoZSBsb25nZXIgcGFydCByZWxlYXNlcyB3cG9ydC0+bG9jaywgYnV0IHNldHMKLSAqIHdwb3J0LT5mbGFncyAmIEhXX0JVU1kuICBBZnRlcndhcmQsIGl0IHJlYWNxdWlyZXMgd3BvcnQtPmxvY2ssIGFuZAotICogY2hlY2tzIGZvciBtb3JlIHdvcmsgdG8gZG8uCi0gKgotICogSWYgYW5vdGhlciB0aHJlYWQgY2FsbHMgcGNtX291dHB1dCgpIHdoaWxlIEhXX0JVU1kgaXMgc2V0LCBpdAotICogcmV0dXJucyBpbW1lZGlhdGVseSwga25vd2luZyB0aGF0IHRoZSB0aHJlYWQgdGhhdCBzZXQgSFdfQlVTWSB3aWxsCi0gKiBsb29rIGZvciBtb3JlIHdvcmsgdG8gZG8gYmVmb3JlIHJldHVybmluZy4KLSAqCi0gKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgcG9ydC0+bG9jayBpcyBoZWxkIGZvciBzZXZlcmFsIHNob3J0Ci0gKiBwZXJpb2RzIGluc3RlYWQgb2Ygb25lIGxvbmcgcGVyaW9kLiAgQWxzbywgd2hlbiBwY21fb3V0cHV0IGlzCi0gKiBjYWxsZWQgZnJvbSBiYXNlIGxldmVsLCBpdCByZWVuYWJsZXMgaW50ZXJydXB0cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBwY21fb3V0cHV0KHZ3c25kX2Rldl90ICpkZXZjLCBpbnQgZXJmbG93biwgaW50IG5iKQotewotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7Ci0JY29uc3QgaW50IGh3bWF4ICA9IHdwb3J0LT5od2J1Zl9tYXg7Ci0JY29uc3QgaW50IGh3c2l6ZSA9IHdwb3J0LT5od2J1Zl9zaXplOwotCWNvbnN0IGludCBzd3NpemUgPSB3cG9ydC0+c3didWZfc2l6ZTsKLQljb25zdCBpbnQgZnJhZ3NpemUgPSB3cG9ydC0+aHdfZnJhZ3NpemU7Ci0JdW5zaWduZWQgbG9uZyBpZmxhZ3M7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgZXJmbG93bj0lZCwgbmI9JWQpXG4iLCBkZXZjLCBlcmZsb3duLCBuYik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCWlmIChlcmZsb3duKQotCQl3cG9ydC0+ZmxhZ3MgfD0gRVJGTE9XTjsKLQkodm9pZCkgX19zd2JfaW5jX3Uod3BvcnQsIG5iKTsKLQlpZiAod3BvcnQtPmZsYWdzICYgSFdfQlVTWSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJREJHUFYoInJldHVybmluZzogSFcgQlVTWVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHdwb3J0LT5mbGFncyAmIERJU0FCTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlEQkdQVigicmV0dXJuaW5nOiBESVNBQkxFRFxuIik7Ci0JCXJldHVybjsKLQl9Ci0Jd3BvcnQtPmZsYWdzIHw9IEhXX0JVU1k7Ci0Jd2hpbGUgKDEpIHsKLQkJaW50IHN3cHRyLCBod3B0ciwgaHdfYXZhaWwsIHN3X2F2YWlsLCBzd2lkeDsKLQkJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZSA9IHdwb3J0LT5od3N0YXRlOwotCQl2d3NuZF9wb3J0X3N3c3RhdGVfdCBzd3N0YXRlID0gd3BvcnQtPnN3c3RhdGU7Ci0JCWludCBod191bmF2YWlsOwotCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0KLQkJaHdwdHIgPSBsaV9yZWFkX2h3cHRyKCZ3cG9ydC0+Y2hhbik7Ci0JCXN3cHRyID0gbGlfcmVhZF9zd3B0cigmd3BvcnQtPmNoYW4pOwotCQlod191bmF2YWlsID0gKHN3cHRyIC0gaHdwdHIgKyBod3NpemUpICUgaHdzaXplOwotCQlod19hdmFpbCA9IChod21heCAtIGh3X3VuYXZhaWwpICYgLWZyYWdzaXplOwotCQlzd19hdmFpbCA9IHdwb3J0LT5zd2JfaV9hdmFpbCAmIC1mcmFnc2l6ZTsKLQkJaWYgKHN3X2F2YWlsICYmIHN3c3RhdGUgPT0gU1dfUlVOKSB7Ci0JCQlpZiAod3BvcnQtPmZsYWdzICYgRVJGTE9XTikgewotCQkJCXdwb3J0LT5mbGFncyAmPSB+RVJGTE9XTjsKLQkJCX0KLQkJfSBlbHNlIGlmIChzd3N0YXRlID09IFNXX0lOSVRJQUwgfHwKLQkJCSBzd3N0YXRlID09IFNXX09GRiB8fAotCQkJIChzd3N0YXRlID09IFNXX0RSQUlOICYmCi0JCQkgICFzd19hdmFpbCAmJgotCQkJICAod3BvcnQtPmZsYWdzICYgRVJGTE9XTikpKSB7Ci0JCQlEQkdQKCJzdG9wcGluZy4gIGh3c3RhdGUgPSAlZFxuIiwgaHdzdGF0ZSk7Ci0JCQlpZiAoaHdzdGF0ZSAhPSBIV19TVE9QUEVEKSB7Ci0JCQkJbGlfZGVhY3RpdmF0ZV9kbWEoJndwb3J0LT5jaGFuKTsKLQkJCQl3cG9ydC0+aHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JCQl9Ci0JCQl3YWtlX3VwKCZ3cG9ydC0+cXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFzd19hdmFpbCB8fCAhaHdfYXZhaWwpCi0JCQlicmVhazsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7Ci0KLQkJLyoKLQkJICogV2UgZ2F2ZSB1cCB0aGUgcG9ydCBsb2NrLCBidXQgd2UgaGF2ZSB0aGUgSFdfQlVTWSBmbGFnLgotCQkgKiBQcm9jZWVkIHdpdGhvdXQgYWNjZXNzaW5nIGFueSBub25sb2NhbCBzdGF0ZS4KLQkJICogRG8gbm90IGV4aXQgdGhlIGxvb3AgLS0gbXVzdCBjaGVjayBmb3IgbW9yZSB3b3JrLgotCQkgKi8KLQotCQlzd2lkeCA9IHdwb3J0LT5zd2JfaV9pZHg7Ci0JCW5iID0gaHdfYXZhaWw7Ci0JCWlmIChuYiA+IHN3X2F2YWlsKQotCQkJbmIgPSBzd19hdmFpbDsKLQkJaWYgKG5iID4gaHdzaXplIC0gc3dwdHIpCi0JCQluYiA9IGh3c2l6ZSAtIHN3cHRyOyAvKiBkb24ndCBvdmVyZmxvdyBod2J1ZiAqLwotCQlpZiAobmIgPiBzd3NpemUgLSBzd2lkeCkKLQkJCW5iID0gc3dzaXplIC0gc3dpZHg7IC8qIGRvbid0IG92ZXJmbG93IHN3YnVmICovCi0JCUFTU0VSVChuYiA+IDApOwotCQlpZiAobmIgJSBmcmFnc2l6ZSkgewotCQkJREJHUCgibmIgPSAlZCwgZnJhZ3NpemUgPSAlZFxuIiwgbmIsIGZyYWdzaXplKTsKLQkJCURCR1AoImh3X2F2YWlsID0gJWRcbiIsIGh3X2F2YWlsKTsKLQkJCURCR1AoInN3X2F2YWlsID0gJWRcbiIsIHN3X2F2YWlsKTsKLQkJCURCR1AoImh3c2l6ZSA9ICVkLCBzd3B0ciA9ICVkXG4iLCBod3NpemUsIHN3cHRyKTsKLQkJCURCR1AoInN3c2l6ZSA9ICVkLCBzd2lkeCA9ICVkXG4iLCBzd3NpemUsIHN3aWR4KTsKLQkJfQotCQlBU1NFUlQoIShuYiAlIGZyYWdzaXplKSk7Ci0JCURCR1BWKCJjb3B5aW5nIHN3YlslZC4uJWRdIHRvIGh3YlslZC4uJWRdXG4iLAotCQkgICAgICBzd2lkeCwgc3dpZHggKyBuYiwgc3dwdHIsIHN3cHRyICsgbmIpOwotCQlwY21fY29weV9vdXQod3BvcnQsIHN3aWR4LCBzd3B0ciwgbmIpOwotCQlsaV93cml0ZV9zd3B0cigmd3BvcnQtPmNoYW4sIChzd3B0ciArIG5iKSAlIGh3c2l6ZSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJaWYgKGh3c3RhdGUgPT0gSFdfU1RPUFBFRCkgewotCQkJREJHUFYoInN0YXJ0aW5nXG4iKTsKLQkJCWxpX2FjdGl2YXRlX2RtYSgmd3BvcnQtPmNoYW4pOwotCQkJd3BvcnQtPmh3c3RhdGUgPSBIV19SVU5OSU5HOwotCQkJbGlfcmVhZF9VU1RNU0MoJndwb3J0LT5jaGFuLCAmdXN0bXNjKTsKLQkJCUFTU0VSVCh3cG9ydC0+Ynl0ZV9jb3VudCAlIHdwb3J0LT5mcmFtZV9zaXplID09IDApOwotCQkJd3BvcnQtPk1TQ19vZmZzZXQgPSB1c3Rtc2MubXNjIC0gd3BvcnQtPmJ5dGVfY291bnQgLyB3cG9ydC0+ZnJhbWVfc2l6ZTsKLQkJfQotCQlfX3N3Yl9pbmNfaSh3cG9ydCwgbmIpOwotCQl3cG9ydC0+Ynl0ZV9jb3VudCArPSBuYjsKLQkJd3BvcnQtPmZyYWdfY291bnQgKz0gbmIgLyBmcmFnc2l6ZTsKLQkJQVNTRVJUKG5iICUgZnJhZ3NpemUgPT0gMCk7Ci0JCXdha2VfdXAoJndwb3J0LT5xdWV1ZSk7Ci0JfQotCXdwb3J0LT5mbGFncyAmPSB+SFdfQlVTWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQlEQkdSVigpOwotfQotCi0vKgotICogcGNtX2lucHV0KCkgaXMgY2FsbGVkIGJvdGggZnJvbSBiYXNlbGV2ZWwgYW5kIGZyb20gaW50ZXJydXB0IGxldmVsLgotICogVGhpcyBpcyB3aGVyZSBhdWRpbyBmcmFtZXMgYXJlIGNvcGllZCBvdXQgb2YgdGhlIGhhcmR3YXJlLWFjY2Vzc2libGUKLSAqIHJpbmcgYnVmZmVyLgotICoKLSAqIExvY2tpbmcgbm90ZTogVGhlIHBhcnQgb2YgdGhpcyByb3V0aW5lIHRoYXQgZmlndXJlcyBvdXQgd2hhdCB0byBkbwotICogaG9sZHMgcnBvcnQtPmxvY2suICBUaGUgbG9uZ2VyIHBhcnQgcmVsZWFzZXMgcnBvcnQtPmxvY2ssIGJ1dCBzZXRzCi0gKiBycG9ydC0+ZmxhZ3MgJiBIV19CVVNZLiAgQWZ0ZXJ3YXJkLCBpdCByZWFjcXVpcmVzIHJwb3J0LT5sb2NrLCBhbmQKLSAqIGNoZWNrcyBmb3IgbW9yZSB3b3JrIHRvIGRvLgotICoKLSAqIElmIGFub3RoZXIgdGhyZWFkIGNhbGxzIHBjbV9pbnB1dCgpIHdoaWxlIEhXX0JVU1kgaXMgc2V0LCBpdAotICogcmV0dXJucyBpbW1lZGlhdGVseSwga25vd2luZyB0aGF0IHRoZSB0aHJlYWQgdGhhdCBzZXQgSFdfQlVTWSB3aWxsCi0gKiBsb29rIGZvciBtb3JlIHdvcmsgdG8gZG8gYmVmb3JlIHJldHVybmluZy4KLSAqCi0gKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgcG9ydC0+bG9jayBpcyBoZWxkIGZvciBzZXZlcmFsIHNob3J0Ci0gKiBwZXJpb2RzIGluc3RlYWQgb2Ygb25lIGxvbmcgcGVyaW9kLiAgQWxzbywgd2hlbiBwY21faW5wdXQgaXMKLSAqIGNhbGxlZCBmcm9tIGJhc2UgbGV2ZWwsIGl0IHJlZW5hYmxlcyBpbnRlcnJ1cHRzLgotICovCi0KLXN0YXRpYyB2b2lkIHBjbV9pbnB1dCh2d3NuZF9kZXZfdCAqZGV2YywgaW50IGVyZmxvd24sIGludCBuYikKLXsKLQl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gJmRldmMtPnJwb3J0OwotCWNvbnN0IGludCBod21heCAgPSBycG9ydC0+aHdidWZfbWF4OwotCWNvbnN0IGludCBod3NpemUgPSBycG9ydC0+aHdidWZfc2l6ZTsKLQljb25zdCBpbnQgc3dzaXplID0gcnBvcnQtPnN3YnVmX3NpemU7Ci0JY29uc3QgaW50IGZyYWdzaXplID0gcnBvcnQtPmh3X2ZyYWdzaXplOwotCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwotCi0JREJHRVYoIihkZXZjPTB4JXAsIGVyZmxvd249JWQsIG5iPSVkKVxuIiwgZGV2YywgZXJmbG93biwgbmIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCWlmIChlcmZsb3duKQotCQlycG9ydC0+ZmxhZ3MgfD0gRVJGTE9XTjsKLQkodm9pZCkgX19zd2JfaW5jX3UocnBvcnQsIG5iKTsKLQlpZiAocnBvcnQtPmZsYWdzICYgSFdfQlVTWSB8fCAhcnBvcnQtPnN3YnVmKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlEQkdQVigicmV0dXJuaW5nOiBIVyBCVVNZIG9yICFzd2J1ZlxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJwb3J0LT5mbGFncyAmIERJU0FCTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlEQkdQVigicmV0dXJuaW5nOiBESVNBQkxFRFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JcnBvcnQtPmZsYWdzIHw9IEhXX0JVU1k7Ci0Jd2hpbGUgKDEpIHsKLQkJaW50IHN3cHRyLCBod3B0ciwgaHdfYXZhaWwsIHN3X2F2YWlsLCBzd2lkeDsKLQkJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZSA9IHJwb3J0LT5od3N0YXRlOwotCQl2d3NuZF9wb3J0X3N3c3RhdGVfdCBzd3N0YXRlID0gcnBvcnQtPnN3c3RhdGU7Ci0KLQkJaHdwdHIgPSBsaV9yZWFkX2h3cHRyKCZycG9ydC0+Y2hhbik7Ci0JCXN3cHRyID0gbGlfcmVhZF9zd3B0cigmcnBvcnQtPmNoYW4pOwotCQlod19hdmFpbCA9IChod3B0ciAtIHN3cHRyICsgaHdzaXplKSAlIGh3c2l6ZSAmIC1mcmFnc2l6ZTsKLQkJaWYgKGh3X2F2YWlsID4gaHdtYXgpCi0JCQlod19hdmFpbCA9IGh3bWF4OwotCQlzd19hdmFpbCA9IHJwb3J0LT5zd2JfaV9hdmFpbCAmIC1mcmFnc2l6ZTsKLQkJaWYgKHN3c3RhdGUgIT0gU1dfUlVOKSB7Ci0JCQlEQkdQKCJzdG9wcGluZy4gIGh3c3RhdGUgPSAlZFxuIiwgaHdzdGF0ZSk7Ci0JCQlpZiAoaHdzdGF0ZSAhPSBIV19TVE9QUEVEKSB7Ci0JCQkJbGlfZGVhY3RpdmF0ZV9kbWEoJnJwb3J0LT5jaGFuKTsKLQkJCQlycG9ydC0+aHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JCQl9Ci0JCQl3YWtlX3VwKCZycG9ydC0+cXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFzd19hdmFpbCB8fCAhaHdfYXZhaWwpCi0JCQlicmVhazsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7Ci0KLQkJLyoKLQkJICogV2UgZ2F2ZSB1cCB0aGUgcG9ydCBsb2NrLCBidXQgd2UgaGF2ZSB0aGUgSFdfQlVTWSBmbGFnLgotCQkgKiBQcm9jZWVkIHdpdGhvdXQgYWNjZXNzaW5nIGFueSBub25sb2NhbCBzdGF0ZS4KLQkJICogRG8gbm90IGV4aXQgdGhlIGxvb3AgLS0gbXVzdCBjaGVjayBmb3IgbW9yZSB3b3JrLgotCQkgKi8KLQotCQlzd2lkeCA9IHJwb3J0LT5zd2JfaV9pZHg7Ci0JCW5iID0gaHdfYXZhaWw7Ci0JCWlmIChuYiA+IHN3X2F2YWlsKQotCQkJbmIgPSBzd19hdmFpbDsKLQkJaWYgKG5iID4gaHdzaXplIC0gc3dwdHIpCi0JCQluYiA9IGh3c2l6ZSAtIHN3cHRyOyAvKiBkb24ndCBvdmVyZmxvdyBod2J1ZiAqLwotCQlpZiAobmIgPiBzd3NpemUgLSBzd2lkeCkKLQkJCW5iID0gc3dzaXplIC0gc3dpZHg7IC8qIGRvbid0IG92ZXJmbG93IHN3YnVmICovCi0JCUFTU0VSVChuYiA+IDApOwotCQlpZiAobmIgJSBmcmFnc2l6ZSkgewotCQkJREJHUCgibmIgPSAlZCwgZnJhZ3NpemUgPSAlZFxuIiwgbmIsIGZyYWdzaXplKTsKLQkJCURCR1AoImh3X2F2YWlsID0gJWRcbiIsIGh3X2F2YWlsKTsKLQkJCURCR1AoInN3X2F2YWlsID0gJWRcbiIsIHN3X2F2YWlsKTsKLQkJCURCR1AoImh3c2l6ZSA9ICVkLCBzd3B0ciA9ICVkXG4iLCBod3NpemUsIHN3cHRyKTsKLQkJCURCR1AoInN3c2l6ZSA9ICVkLCBzd2lkeCA9ICVkXG4iLCBzd3NpemUsIHN3aWR4KTsKLQkJfQotCQlBU1NFUlQoIShuYiAlIGZyYWdzaXplKSk7Ci0JCURCR1BWKCJjb3B5aW5nIGh3YlslZC4uJWRdIHRvIHN3YlslZC4uJWRdXG4iLAotCQkgICAgICBzd3B0ciwgc3dwdHIgKyBuYiwgc3dpZHgsIHN3aWR4ICsgbmIpOwotCQlwY21fY29weV9pbihycG9ydCwgc3dpZHgsIHN3cHRyLCBuYik7Ci0JCWxpX3dyaXRlX3N3cHRyKCZycG9ydC0+Y2hhbiwgKHN3cHRyICsgbmIpICUgaHdzaXplKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCQlfX3N3Yl9pbmNfaShycG9ydCwgbmIpOwotCQlycG9ydC0+Ynl0ZV9jb3VudCArPSBuYjsKLQkJcnBvcnQtPmZyYWdfY291bnQgKz0gbmIgLyBmcmFnc2l6ZTsKLQkJQVNTRVJUKG5iICUgZnJhZ3NpemUgPT0gMCk7Ci0JCXdha2VfdXAoJnJwb3J0LT5xdWV1ZSk7Ci0JfQotCXJwb3J0LT5mbGFncyAmPSB+SFdfQlVTWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKLQlEQkdSVigpOwotfQotCi0vKgotICogcGNtX2ZsdXNoX2ZyYWcoKSB3cml0ZXMgemVybyBzYW1wbGVzIHRvIGZpbGwgdGhlIGN1cnJlbnQgZnJhZ21lbnQsCi0gKiB0aGVuIGZsdXNoZXMgaXQgdG8gdGhlIGhhcmR3YXJlLgotICoKLSAqIEl0IGlzIG9ubHkgbWVhbmluZ2Z1bCB0byBmbHVzaCBvdXRwdXQsIG5vdCBpbnB1dC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwY21fZmx1c2hfZnJhZyh2d3NuZF9kZXZfdCAqZGV2YykKLXsKLQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gJmRldmMtPndwb3J0OwotCi0JREJHUFYoInN3c3RhdGUgPSAlZFxuIiwgd3BvcnQtPnN3c3RhdGUpOwotCWlmICh3cG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pIHsKLQkJaW50IGlkeCA9IHdwb3J0LT5zd2JfdV9pZHg7Ci0JCWludCBlbmQgPSAoaWR4ICsgd3BvcnQtPmh3X2ZyYWdzaXplIC0gMSkKLQkJCT4+IHdwb3J0LT5od19mcmFnc2hpZnQKLQkJCTw8IHdwb3J0LT5od19mcmFnc2hpZnQ7Ci0JCWludCBuYiA9IGVuZCAtIGlkeDsKLQkJREJHUFYoImNsZWFyaW5nICVkIGJ5dGVzXG4iLCBuYik7Ci0JCWlmIChuYikKLQkJCW1lbXNldCh3cG9ydC0+c3didWYgKyBpZHgsCi0JCQkgICAgICAgKGNoYXIpIHdwb3J0LT56ZXJvX3dvcmQsCi0JCQkgICAgICAgbmIpOwotCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX0RSQUlOOwotCQlwY21fb3V0cHV0KGRldmMsIDAsIG5iKTsKLQl9Ci0JREJHUlYoKTsKLX0KLQotLyoKLSAqIFdhaXQgZm9yIG91dHB1dCB0byBkcmFpbi4gIFRoaXMgc2xlZXBzIHVuaW50ZXJydXB0aWJseSBiZWNhdXNlCi0gKiB0aGVyZSBpcyBub3RoaW5nIGludGVsbGlnZW50IHdlIGNhbiBkbyBpZiBpbnRlcnJ1cHRlZC4gIFRoaXMKLSAqIG1lYW5zIHRoZSBwcm9jZXNzIHdpbGwgYmUgZGVsYXllZCBpbiByZXNwb25kaW5nIHRvIHRoZSBzaWduYWwuCi0gKi8KLQotc3RhdGljIHZvaWQgcGNtX3dyaXRlX3N5bmModndzbmRfZGV2X3QgKmRldmMpCi17Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9ICZkZXZjLT53cG9ydDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7Ci0KLQlEQkdFVigiKGRldmM9MHglcClcbiIsIGRldmMpOwotCWFkZF93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQlod3N0YXRlID0gd3BvcnQtPmh3c3RhdGU7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGh3c3RhdGUgPT0gSFdfU1RPUFBFRCkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZSgpOwotCX0KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JREJHUFYoInN3c3RhdGUgPSAlZCwgaHdzdGF0ZSA9ICVkXG4iLCB3cG9ydC0+c3dzdGF0ZSwgd3BvcnQtPmh3c3RhdGUpOwotCURCR1JWKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGF1ZGlvIGRyaXZlciAqLwotCi0vKgotICogc2VlayBvbiBhbiBhdWRpbyBkZXZpY2UgYWx3YXlzIGZhaWxzLgotICovCi0KLXN0YXRpYyB2b2lkIHZ3c25kX2F1ZGlvX3JlYWRfaW50cih2d3NuZF9kZXZfdCAqZGV2YywgdW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlpbnQgb3ZlcmZsb3duID0gc3RhdHVzICYgTElfSU5UUl9DT01NMV9PVkVSRkxPVzsKLQotCWlmIChzdGF0dXMgJiBSRUFEX0lOVFJfTUFTSykKLQkJcGNtX2lucHV0KGRldmMsIG92ZXJmbG93biwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZ3c25kX2F1ZGlvX3dyaXRlX2ludHIodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBzdGF0dXMpCi17Ci0JaW50IHVuZGVyZmxvd24gPSBzdGF0dXMgJiBMSV9JTlRSX0NPTU0yX1VOREVSRkxPVzsKLQotCWlmIChzdGF0dXMgJiBXUklURV9JTlRSX01BU0spCi0JCXBjbV9vdXRwdXQoZGV2YywgdW5kZXJmbG93biwgMCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB2d3NuZF9hdWRpb19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9IGRldl9pZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCi0JREJHRVYoIihpcnE9JWQsIGRldl9pZD0weCVwKVxuIiwgaXJxLCBkZXZfaWQpOwotCi0Jc3RhdHVzID0gbGlfZ2V0X2NsZWFyX2ludHJfc3RhdHVzKCZkZXZjLT5saXRoKTsKLQl2d3NuZF9hdWRpb19yZWFkX2ludHIoZGV2Yywgc3RhdHVzKTsKLQl2d3NuZF9hdWRpb193cml0ZV9pbnRyKGRldmMsIHN0YXR1cyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgIGNoYXIgKmJ1ZmZlciwKLQkJCQkgICBzaXplX3QgY291bnQsCi0JCQkJICAgbG9mZl90ICpwcG9zKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KLQkJCSAgICAgICAmZGV2Yy0+cnBvcnQgOiBOVUxMKTsKLQlpbnQgcmV0LCBuYjsKLQotCURCR0VWKCIoZmlsZT0weCVwLCBidWZmZXI9MHglcCwgY291bnQ9JWQsIHBwb3M9MHglcClcbiIsCi0JICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKLQotCWlmICghcnBvcnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHJwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7Ci0JCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KLQkJCSZkZXZjLT53cG9ydCA6IE5VTEw7Ci0JCXJldCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXQgPSAwOwotCXdoaWxlIChjb3VudCkgewotCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJYWRkX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQl3aGlsZSAoKG5iID0gc3diX2luY191KHJwb3J0LCAwKSkgPT0gMCkgewotCQkJREJHUFYoImJsb2NraW5nXG4iKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAocnBvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKLQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZycG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnBvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLQkJCX0KLQkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQlwY21faW5wdXQoZGV2YywgMCwgMCk7Ci0JCS8qIG5iIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdXNlcmJ1Zi4gKi8KLQkJaWYgKG5iID4gY291bnQpCi0JCQluYiA9IGNvdW50OwotCQlEQkdQVigibmIgPSAlZFxuIiwgbmIpOwotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcnBvcnQtPnN3YnVmICsgcnBvcnQtPnN3Yl91X2lkeCwgbmIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCSh2b2lkKSBzd2JfaW5jX3UocnBvcnQsIG5iKTsKLQkJYnVmZmVyICs9IG5iOwotCQljb3VudCAtPSBuYjsKLQkJcmV0ICs9IG5iOwotCX0KLQlEQkdQVigicmV0dXJuaW5nICVkXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZ3c25kX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciAqYnVmZmVyLAotCQkJCXNpemVfdCBjb3VudCwKLQkJCQlsb2ZmX3QgKnBwb3MpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3NpemVfdCByZXQ7Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0ID0gdndzbmRfYXVkaW9fZG9fcmVhZChmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKLQltdXRleF91bmxvY2soJmRldmMtPmlvX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyLAotCQkJCSAgICBzaXplX3QgY291bnQsCi0JCQkJICAgIGxvZmZfdCAqcHBvcykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPwotCQkJICAgICAgICZkZXZjLT53cG9ydCA6IE5VTEwpOwotCWludCByZXQsIG5iOwotCi0JREJHRVYoIihmaWxlPTB4JXAsIGJ1ZmZlcj0weCVwLCBjb3VudD0lZCwgcHBvcz0weCVwKVxuIiwKLQkgICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKLQotCWlmICghd3BvcnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHdwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7Ci0JCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPwotCQkJJmRldmMtPnJwb3J0IDogTlVMTDsKLQkJcmV0ID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0ID0gMDsKLQl3aGlsZSAoY291bnQpIHsKLQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JCWFkZF93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJd2hpbGUgKChuYiA9IHN3Yl9pbmNfdSh3cG9ydCwgMCkpID09IDApIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAod3BvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKLQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLQkJCX0KLQkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQkvKiBuYiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHVzZXJidWYuICovCi0JCWlmIChuYiA+IGNvdW50KQotCQkJbmIgPSBjb3VudDsKLQkJREJHUFYoIm5iID0gJWRcbiIsIG5iKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHdwb3J0LT5zd2J1ZiArIHdwb3J0LT5zd2JfdV9pZHgsIGJ1ZmZlciwgbmIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXBjbV9vdXRwdXQoZGV2YywgMCwgbmIpOwotCQlidWZmZXIgKz0gbmI7Ci0JCWNvdW50IC09IG5iOwotCQlyZXQgKz0gbmI7Ci0JfQotCURCR1BWKCJyZXR1cm5pbmcgJWRcbiIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgdndzbmRfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLQkJCQkgc2l6ZV90IGNvdW50LAotCQkJCSBsb2ZmX3QgKnBwb3MpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3NpemVfdCByZXQ7Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0ID0gdndzbmRfYXVkaW9fZG9fd3JpdGUoZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHZ3c25kX2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPwotCQkmZGV2Yy0+cnBvcnQgOiBOVUxMOwotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KLQkJJmRldmMtPndwb3J0IDogTlVMTDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQlEQkdFVigiKGZpbGU9MHglcCwgd2FpdD0weCVwKVxuIiwgZmlsZSwgd2FpdCk7Ci0KLQlBU1NFUlQocnBvcnQgfHwgd3BvcnQpOwotCWlmIChycG9ydCkgewotCQlwb2xsX3dhaXQoZmlsZSwgJnJwb3J0LT5xdWV1ZSwgd2FpdCk7Ci0JCWlmIChzd2JfaW5jX3UocnBvcnQsIDApKQotCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7Ci0JfQotCWlmICh3cG9ydCkgewotCQlwb2xsX3dhaXQoZmlsZSwgJndwb3J0LT5xdWV1ZSwgd2FpdCk7Ci0JCWlmICh3cG9ydC0+c3didWYgPT0gTlVMTCB8fCBzd2JfaW5jX3Uod3BvcnQsIDApKQotCQkJbWFzayB8PSAoUE9MTE9VVCB8IFBPTExXUk5PUk0pOwotCX0KLQotCURCR1BWKCJyZXR1cm5pbmcgMHgleFxuIiwgbWFzayk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBpbnQgdndzbmRfYXVkaW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdndzbmRfcG9ydF90ICpycG9ydCA9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/Ci0JCSZkZXZjLT5ycG9ydCA6IE5VTEw7Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPwotCQkmZGV2Yy0+d3BvcnQgOiBOVUxMOwotCXZ3c25kX3BvcnRfdCAqYXBvcnQgPSBycG9ydCA/IHJwb3J0IDogd3BvcnQ7Ci0Jc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGJ1Zl9pbmZvOwotCXN0cnVjdCBjb3VudF9pbmZvIGluZm87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaXZhbDsKLQotCQotCURCR0VWKCIoZmlsZT0weCVwLCBjbWQ9MHgleCwgYXJnPTB4JWx4KVxuIiwKLQkgICAgICBmaWxlLCBjbWQsIGFyZyk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgkJLyogX1NJT1IgKCdNJywgMTE4LCBpbnQpICovCi0JCURCR1goIk9TU19HRVRWRVJTSU9OXG4iKTsKLQkJaXZhbCA9IFNPVU5EX1ZFUlNJT047Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoJLyogX1NJT1IgKCdQJywxNSwgaW50KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVENBUFNcbiIpOwotCQlpdmFsID0gRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CS8qIF9TSU9SICgnUCcsMTEsIGludCkgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKLQkJaXZhbCA9IChBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8Ci0JCQlBRk1UX1U4IHwgQUZNVF9TOCk7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgkvKiBfU0lPUiAoJ1AnLCAyLCBpbnQpICovCi0JCURCR1goIlNPVU5EX1BDTV9SRUFEX1JBVEVcbiIpOwotCQlpdmFsID0gYXBvcnQtPnN3X2ZyYW1lcmF0ZTsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CS8qIF9TSU9SICgnUCcsIDYsIGludCkgKi8KLQkJREJHWCgiU09VTkRfUENNX1JFQURfQ0hBTk5FTFNcbiIpOwotCQlpdmFsID0gYXBvcnQtPnN3X2NoYW5uZWxzOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NQRUVEOgkJLyogX1NJT1dSKCdQJywgMiwgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfU1BFRUQgJWRcbiIsIGl2YWwpOwotCQlpZiAoaXZhbCkgewotCQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpIHsKLQkJCQlEQkdYKCJTTkRDVExfRFNQX1NQRUVEIGZhaWxlZDogc3dzdGF0ZSA9ICVkXG4iLAotCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaWYgKGl2YWwgPCBNSU5fU1BFRUQpCi0JCQkJaXZhbCA9IE1JTl9TUEVFRDsKLQkJCWlmIChpdmFsID4gTUFYX1NQRUVEKQotCQkJCWl2YWwgPSBNQVhfU1BFRUQ7Ci0JCQlpZiAocnBvcnQpCi0JCQkJcnBvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7Ci0JCQlpZiAod3BvcnQpCi0JCQkJd3BvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7Ci0JCX0gZWxzZQotCQkJaXZhbCA9IGFwb3J0LT5zd19mcmFtZXJhdGU7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkJLyogX1NJT1dSKCdQJywgMywgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfU1RFUkVPICVkXG4iLCBpdmFsKTsKLQkJaWYgKGl2YWwgIT0gMCAmJiBpdmFsICE9IDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHJwb3J0KQotCQkJcnBvcnQtPnN3X2NoYW5uZWxzID0gaXZhbCArIDE7Ci0JCWlmICh3cG9ydCkKLQkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWwgKyAxOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgkvKiBfU0lPV1IoJ1AnLCA2LCBpbnQpICovCi0JCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREJHWCgiU05EQ1RMX0RTUF9DSEFOTkVMUyAlZFxuIiwgaXZhbCk7Ci0JCWlmIChpdmFsICE9IDEgJiYgaXZhbCAhPSAyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChycG9ydCkKLQkJCXJwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7Ci0JCWlmICh3cG9ydCkKLQkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToJLyogX1NJT1dSKCdQJywgNCwgaW50KSAqLwotCQlpdmFsID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCWlmIChpdmFsIDwgMCkgewotCQkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIGZhaWxlZCwgZXJybm8gJWRcbiIsIGl2YWwpOwotCQkJcmV0dXJuIGl2YWw7Ci0JCX0KLQkJaXZhbCA9IDEgPDwgYXBvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIHJldHVybmluZyAlZFxuIiwgaXZhbCk7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CS8qIF9TSU9XUignUCcsMTAsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UICVkOiVkXG4iLAotCQkgICAgIGl2YWwgPj4gMTYsIGl2YWwgJiAweEZGRkYpOwotCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl7Ci0JCQlpbnQgc3dfZnJhZ3NoaWZ0ID0gaXZhbCAmIDB4RkZGRjsKLQkJCWludCBzd19zdWJkaXZzaGlmdCA9IGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKLQkJCWludCBod19mcmFnc2hpZnQgPSBzd19mcmFnc2hpZnQgLSBzd19zdWJkaXZzaGlmdDsKLQkJCWludCBzd19mcmFnY291bnQgPSAoaXZhbCA+PiAxNikgJiAweEZGRkY7Ci0JCQlpbnQgaHdfZnJhZ3NpemU7Ci0JCQlpZiAoaHdfZnJhZ3NoaWZ0IDwgTUlOX0ZSQUdTSElGVCkKLQkJCQlod19mcmFnc2hpZnQgPSBNSU5fRlJBR1NISUZUOwotCQkJaWYgKGh3X2ZyYWdzaGlmdCA+IE1BWF9GUkFHU0hJRlQpCi0JCQkJaHdfZnJhZ3NoaWZ0ID0gTUFYX0ZSQUdTSElGVDsKLQkJCXN3X2ZyYWdzaGlmdCA9IGh3X2ZyYWdzaGlmdCArIGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKLQkJCWh3X2ZyYWdzaXplID0gMSA8PCBod19mcmFnc2hpZnQ7Ci0JCQlpZiAoc3dfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCi0JCQkJc3dfZnJhZ2NvdW50ID0gTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7Ci0JCQlpZiAoc3dfZnJhZ2NvdW50ID4gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCi0JCQkJc3dfZnJhZ2NvdW50ID0gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7Ci0JCQlEQkdQVigic3dfZnJhZ3NoaWZ0ID0gJWRcbiIsIHN3X2ZyYWdzaGlmdCk7Ci0JCQlEQkdQVigicnBvcnQgPSAweCVwLCB3cG9ydCA9IDB4JXBcbiIsIHJwb3J0LCB3cG9ydCk7Ci0JCQlpZiAocnBvcnQpIHsKLQkJCQlycG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OwotCQkJCXJwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7Ci0JCQl9Ci0JCQlpZiAod3BvcnQpIHsKLQkJCQl3cG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OwotCQkJCXdwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7Ci0JCQl9Ci0JCQlpdmFsID0gc3dfZnJhZ2NvdW50IDw8IDE2IHwgc3dfZnJhZ3NoaWZ0OwotCQl9Ci0JCURCR1goIlNORENUTF9EU1BfU0VURlJBR01FTlQgcmV0dXJucyAlZDolZFxuIiwKLQkJICAgICAgaXZhbCA+PiAxNiwgaXZhbCAmIDB4RkZGRik7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgkvKiBfU0lPV1IoJ1AnLCA5LCBpbnQpICovCi0gICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NVQkRJVklERSAlZFxuIiwgaXZhbCk7Ci0JCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXsKLQkJCWludCBzdWJkaXZzaGlmdDsKLQkJCWludCBod19mcmFnc2hpZnQsIGh3X2ZyYWdzaXplLCBod19mcmFnY291bnQ7Ci0JCQlzd2l0Y2ggKGl2YWwpIHsKLQkJCWNhc2UgMTogc3ViZGl2c2hpZnQgPSAwOyBicmVhazsKLQkJCWNhc2UgMjogc3ViZGl2c2hpZnQgPSAxOyBicmVhazsKLQkJCWNhc2UgNDogc3ViZGl2c2hpZnQgPSAyOyBicmVhazsKLQkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaHdfZnJhZ3NoaWZ0ID0gYXBvcnQtPnN3X2ZyYWdzaGlmdCAtIHN1YmRpdnNoaWZ0OwotCQkJaWYgKGh3X2ZyYWdzaGlmdCA8IE1JTl9GUkFHU0hJRlQgfHwKLQkJCSAgICBod19mcmFnc2hpZnQgPiBNQVhfRlJBR1NISUZUKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaHdfZnJhZ3NpemUgPSAxIDw8IGh3X2ZyYWdzaGlmdDsKLQkJCWh3X2ZyYWdjb3VudCA9IGFwb3J0LT5zd19mcmFnY291bnQgPj4gc3ViZGl2c2hpZnQ7Ci0JCQlpZiAoaHdfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkgfHwKLQkJCSAgICBod19mcmFnY291bnQgPiBNQVhfRlJBR0NPVU5UKGh3X2ZyYWdzaXplKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChycG9ydCkKLQkJCQlycG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKLQkJCWlmICh3cG9ydCkKLQkJCQl3cG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKLQkJfQotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CQkvKiBfU0lPV1IoJ1AnLDUsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZNVCAlZFxuIiwgaXZhbCk7Ci0JCWlmIChpdmFsICE9IEFGTVRfUVVFUlkpIHsKLQkJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKSB7Ci0JCQkJREJHUCgiU0VURk1UIGZhaWxlZCwgc3dzdGF0ZSA9ICVkXG4iLAotCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJc3dpdGNoIChpdmFsKSB7Ci0JCQljYXNlIEFGTVRfTVVfTEFXOgotCQkJY2FzZSBBRk1UX0FfTEFXOgotCQkJY2FzZSBBRk1UX1U4OgotCQkJY2FzZSBBRk1UX1M4OgotCQkJY2FzZSBBRk1UX1MxNl9MRToKLQkJCQlpZiAocnBvcnQpCi0JCQkJCXJwb3J0LT5zd19zYW1wbGVmbXQgPSBpdmFsOwotCQkJCWlmICh3cG9ydCkKLQkJCQkJd3BvcnQtPnN3X3NhbXBsZWZtdCA9IGl2YWw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0JCWl2YWwgPSBhcG9ydC0+c3dfc2FtcGxlZm10OwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToJLyogX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pICovCi0JCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRVxuIik7Ci0JCWlmICghd3BvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAoaXZhbCA8IDApCi0JCQlyZXR1cm4gaXZhbDsKLQkJaXZhbCA9IHN3Yl9pbmNfdSh3cG9ydCwgMCk7Ci0JCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gd3BvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHdwb3J0LT5zd19mcmFnY291bnQ7Ci0JCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCB3cG9ydC0+c3dfZnJhZ3NoaWZ0OwotCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7Ci0JCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRSByZXR1cm5zIHsgJWQgJWQgJWQgJWQgfVxuIiwKLQkJICAgICBidWZfaW5mby5mcmFnbWVudHMsIGJ1Zl9pbmZvLmZyYWdzdG90YWwsCi0JCSAgICAgYnVmX2luZm8uZnJhZ3NpemUsIGJ1Zl9pbmZvLmJ5dGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZidWZfaW5mbywgc2l6ZW9mIGJ1Zl9pbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CS8qIF9TSU9SICgnUCcsMTMsIGF1ZGlvX2J1Zl9pbmZvKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7Ci0JCWlmICghcnBvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAoaXZhbCA8IDApCi0JCQlyZXR1cm4gaXZhbDsKLQkJaXZhbCA9IHN3Yl9pbmNfdShycG9ydCwgMCk7Ci0JCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gcnBvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHJwb3J0LT5zd19mcmFnY291bnQ7Ci0JCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCBycG9ydC0+c3dfZnJhZ3NoaWZ0OwotCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7Ci0JCURCR1goIlNORENUTF9EU1BfR0VUSVNQQUNFIHJldHVybnMgeyAlZCAlZCAlZCAlZCB9XG4iLAotCQkgICAgIGJ1Zl9pbmZvLmZyYWdtZW50cywgYnVmX2luZm8uZnJhZ3N0b3RhbCwKLQkJICAgICBidWZfaW5mby5mcmFnc2l6ZSwgYnVmX2luZm8uYnl0ZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmJ1Zl9pbmZvLCBzaXplb2YgYnVmX2luZm8pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgkvKiBfU0lPICAoJ1AnLDE0KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX05PTkJMT0NLXG4iKTsKLQkJc3Bpbl9sb2NrKCZmaWxlLT5mX2xvY2spOwotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXNwaW5fdW5sb2NrKCZmaWxlLT5mX2xvY2spOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoJCS8qIF9TSU8gICgnUCcsIDApICovCi0JCURCR1goIlNORENUTF9EU1BfUkVTRVRcbiIpOwotCQkvKgotCQkgKiBOb3RoaW5nIHNwZWNpYWwgbmVlZHMgdG8gYmUgZG9uZSBmb3IgaW5wdXQuICBJbnB1dAotCQkgKiBzYW1wbGVzIHNpdCBpbiBzd2J1ZiwgYnV0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZAotCQkgKiB0byBlbXB0eSB3aGVuIHBjbV9zZXR1cCgpIGlzIGNhbGxlZC4KLQkJICovCi0JCWlmICh3cG9ydCAmJiB3cG9ydC0+c3didWYpIHsKLQkJCXdwb3J0LT5zd3N0YXRlID0gU1dfSU5JVElBTDsKLQkJCXBjbV9vdXRwdXQoZGV2YywgMCwgMCk7Ci0JCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKLQkJfQotCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfU1lOQzoJCS8qIF9TSU8gICgnUCcsIDEpICovCi0JCURCR1goIlNORENUTF9EU1BfU1lOQ1xuIik7Ci0JCWlmICh3cG9ydCkgewotCQkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7Ci0JCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKLQkJfQotCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfUE9TVDoJCS8qIF9TSU8gICgnUCcsIDgpICovCi0JCURCR1goIlNORENUTF9EU1BfUE9TVFxuIik7Ci0JCWlmICghd3BvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CS8qIF9TSU9SICgnUCcsIDE3LCBjb3VudF9pbmZvKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVElQVFJcbiIpOwotCQlpZiAoIXJwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZycG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0JCQlpZiAocnBvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgewotCQkJCUFTU0VSVChycG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOwotCQkJCWxpX3JlYWRfVVNUTVNDKCZycG9ydC0+Y2hhbiwgJnVzdG1zYyk7Ci0JCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSBycG9ydC0+TVNDX29mZnNldDsKLQkJCQlpbmZvLmJ5dGVzICo9IHJwb3J0LT5mcmFtZV9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZvLmJ5dGVzID0gcnBvcnQtPmJ5dGVfY291bnQ7Ci0JCQl9Ci0JCQlpbmZvLmJsb2NrcyA9IHJwb3J0LT5mcmFnX2NvdW50OwotCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCXJwb3J0LT5mcmFnX2NvdW50ID0gMDsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgkvKiBfU0lPUiAoJ1AnLDE4LCBjb3VudF9pbmZvKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVE9QVFJcbiIpOwotCQlpZiAoIXdwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl7Ci0JCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0JCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgewotCQkJCUFTU0VSVCh3cG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOwotCQkJCWxpX3JlYWRfVVNUTVNDKCZ3cG9ydC0+Y2hhbiwgJnVzdG1zYyk7Ci0JCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+TVNDX29mZnNldDsKLQkJCQlpbmZvLmJ5dGVzICo9IHdwb3J0LT5mcmFtZV9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZvLmJ5dGVzID0gd3BvcnQtPmJ5dGVfY291bnQ7Ci0JCQl9Ci0JCQlpbmZvLmJsb2NrcyA9IHdwb3J0LT5mcmFnX2NvdW50OwotCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCXdwb3J0LT5mcmFnX2NvdW50ID0gMDsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CS8qIF9TSU9SICgnUCcsIDIzLCBpbnQpICovCi0JCURCR1goIlNORENUTF9EU1BfR0VUT0RFTEFZXG4iKTsKLQkJaWYgKCF3cG9ydCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJewotCQkJaW50IGZzaXplID0gd3BvcnQtPmZyYW1lX3NpemU7Ci0JCQlpdmFsID0gd3BvcnQtPnN3Yl9pX2F2YWlsIC8gZnNpemU7Ci0JCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgewotCQkJCWludCBzd3B0ciwgaHdwdHIsIGh3ZnJhbWVzLCBod2J5dGVzLCBod3NpemU7Ci0JCQkJaW50IHRvdGFsaHdieXRlczsKLQkJCQl1c3Rtc2NfdCB1c3Rtc2M7Ci0KLQkJCQlod3NpemUgPSB3cG9ydC0+aHdidWZfc2l6ZTsKLQkJCQlzd3B0ciA9IGxpX3JlYWRfc3dwdHIoJndwb3J0LT5jaGFuKTsKLQkJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOwotCQkJCWh3ZnJhbWVzID0gdXN0bXNjLm1zYyAtIHdwb3J0LT5NU0Nfb2Zmc2V0OwotCQkJCXRvdGFsaHdieXRlcyA9IGh3ZnJhbWVzICogZnNpemU7Ci0JCQkJaHdwdHIgPSB0b3RhbGh3Ynl0ZXMgJSBod3NpemU7Ci0JCQkJaHdieXRlcyA9IChzd3B0ciAtIGh3cHRyICsgaHdzaXplKSAlIGh3c2l6ZTsKLQkJCQlpdmFsICs9IGh3Ynl0ZXMgLyBmc2l6ZTsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1BST0ZJTEU6CS8qIF9TSU9XICgnUCcsIDIzLCBpbnQpICovCi0JCURCR1goIlNORENUTF9EU1BfUFJPRklMRVxuIik7Ci0KLQkJLyoKLQkJICogVGhvbWFzIFNhaWxlciBleHBsYWlucyBTTkRDVExfRFNQX1BST0ZJTEUKLQkJICogKHByaXZhdGUgZW1haWwsIE1hcmNoIDI0LCAxOTk5KToKLQkJICoKLQkJICogICAgIFRoaXMgZ2l2ZXMgdGhlIHNvdW5kIGRyaXZlciBhIGhpbnQgb24gd2hhdCBpdAotCQkgKiAgICAgc2hvdWxkIGRvIHdpdGggcGFydGlhbCBmcmFnbWVudHMKLQkJICogICAgIChpLmUuIGZyYWdtZW50cyBwYXJ0aWFsbHkgZmlsbGVkIHdpdGggd3JpdGUpLgotCQkgKiAgICAgVGhpcyBjYW4gZGlyZWN0IHRoZSBkcml2ZXIgdG8gemVybyB0aGVtIG9yCi0JCSAqICAgICBsZWF2ZSB0aGVtIGFsb25lLiAgQnV0IGRvbid0IGFzayBtZSB3aGF0IHRoaXMKLQkJICogICAgIGlzIGdvb2QgZm9yLCBteSBkcml2ZXIganVzdCB6ZXJvZXMgdGhlIGxhc3QKLQkJICogICAgIGZyYWdtZW50IGJlZm9yZSB0aGUgcmVjZWl2ZXIgc3RvcHMsIG5vIGlkZWEKLQkJICogICAgIHdoYXQgZ29vZCBmb3IgYW55IG90aGVyIGJlaGF2aW91ciBjb3VsZAotCQkgKiAgICAgYmUuIEltcGxlbWVudGluZyBpdCBhcyBOT1Agc2VlbXMgc2FmZS4KLQkJICovCi0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoJLyogX1NJT1IgKCdQJywxNiwgaW50KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVFRSSUdHRVJcbiIpOwotCQlpdmFsID0gMDsKLQkJaWYgKHJwb3J0KSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlpZiAoIShycG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCi0JCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQkJaWYgKHdwb3J0KSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlpZiAoISh3cG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCi0JCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoJLyogX1NJT1cgKCdQJywxNiwgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfU0VUVFJJR0dFUiAlZFxuIiwgaXZhbCk7Ci0KLQkJLyoKLQkJICogSWYgdXNlciBpcyBkaXNhYmxpbmcgSS9PIGFuZCBwb3J0IGlzIG5vdCBpbiBpbml0aWFsCi0JCSAqIHN0YXRlLCBmYWlsIHdpdGggRUlOVkFMLgotCQkgKi8KLQotCQlpZiAoKChycG9ydCAmJiAhKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSkgfHwKLQkJICAgICAod3BvcnQgJiYgIShpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpKSkgJiYKLQkJICAgIGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAocnBvcnQpIHsKLQkJCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlod3N0YXRlID0gcnBvcnQtPmh3c3RhdGU7Ci0JCQkJaWYgKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQotCQkJCQlycG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOwotCQkJCWVsc2UKLQkJCQkJcnBvcnQtPmZsYWdzIHw9IERJU0FCTEVEOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCWlmIChod3N0YXRlICE9IEhXX1JVTk5JTkcgJiYgaXZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKLQotCQkJCWlmIChycG9ydC0+c3dzdGF0ZSA9PSBTV19JTklUSUFMKQotCQkJCQlwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJCQllbHNlCi0JCQkJCWxpX2FjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOwotCQkJfQotCQl9Ci0JCWlmICh3cG9ydCkgewotCQkJdndzbmRfcG9ydF9mbGFnc190IHBmbGFnczsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOwotCQkJewotCQkJCXBmbGFncyA9IHdwb3J0LT5mbGFnczsKLQkJCQlpZiAoaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKQotCQkJCQl3cG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOwotCQkJCWVsc2UKLQkJCQkJd3BvcnQtPmZsYWdzIHw9IERJU0FCTEVEOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCWlmIChwZmxhZ3MgJiBESVNBQkxFRCAmJiBpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKLQkJCQlpZiAod3BvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKQotCQkJCQlwY21fb3V0cHV0KGRldmMsIDAsIDApOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCi0JZGVmYXVsdDoKLQkJREJHUCgidW5rbm93biBpb2N0bCAweCV4XG4iLCBjbWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JREJHUCgidW5pbXBsZW1lbnRlZCBpb2N0bCAweCV4XG4iLCBjbWQpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgbG9uZyB2d3NuZF9hdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gKHZ3c25kX2Rldl90ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCW11dGV4X2xvY2soJmRldmMtPmlvX211dGV4KTsKLQlyZXQgPSB2d3NuZF9hdWRpb19kb19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBObyBtbWFwLiAqLwotCi1zdGF0aWMgaW50IHZ3c25kX2F1ZGlvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCURCR0UoIihmaWxlPTB4JXAsIHZtYT0weCVwKVxuIiwgZmlsZSwgdm1hKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotLyoKLSAqIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBmb3IgcmVhZCBhbmQvb3Igd3JpdGUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgdndzbmRfYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YzsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWludCBzd19zYW1wbGVmbXQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0KLQlEQkdFKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCUlOQ19VU0VfQ09VTlQ7Ci0JZm9yIChkZXZjID0gdndzbmRfZGV2X2xpc3Q7IGRldmM7IGRldmMgPSBkZXZjLT5uZXh0X2RldikKLQkJaWYgKChkZXZjLT5hdWRpb19taW5vciAmIH4weDBGKSA9PSAobWlub3IgJiB+MHgwRikpCi0JCQlicmVhazsKLQotCWlmIChkZXZjID09IE5VTEwpIHsKLQkJREVDX1VTRV9DT1VOVDsKLQkJbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW11dGV4X2xvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCXdoaWxlICgxKSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmZGV2Yy0+b3Blbl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKCEoZGV2Yy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSkKLQkJCWJyZWFrOwotCi0JCW11dGV4X3VubG9jaygmZGV2Yy0+b3Blbl9tdXRleCk7Ci0JCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCURFQ19VU0VfQ09VTlQ7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJREVDX1VTRV9DT1VOVDsKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCX0KLQkJbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCQltdXRleF9sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQl9Ci0JZmluaXNoX3dhaXQoJmRldmMtPm9wZW5fd2FpdCwgJndhaXQpOwotCWRldmMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKLQltdXRleF91bmxvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCi0JLyogZ2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdCBmcm9tIG1pbm9yIG51bWJlci4gKi8KLQotCXN3X3NhbXBsZWZtdCA9IDA7Ci0JaWYgKChtaW5vciAmIDB4RikgPT0gU05EX0RFVl9EU1ApCi0JCXN3X3NhbXBsZWZtdCA9IEFGTVRfVTg7Ci0JZWxzZSBpZiAoKG1pbm9yICYgMHhGKSA9PSBTTkRfREVWX0FVRElPKQotCQlzd19zYW1wbGVmbXQgPSBBRk1UX01VX0xBVzsKLQllbHNlIGlmICgobWlub3IgJiAweEYpID09IFNORF9ERVZfRFNQMTYpCi0JCXN3X3NhbXBsZWZtdCA9IEFGTVRfUzE2X0xFOwotCWVsc2UKLQkJQVNTRVJUKDApOwotCi0JLyogSW5pdGlhbGl6ZSB2d3NuZF9wb3J0cy4gKi8KLQotCW11dGV4X2xvY2soJmRldmMtPmlvX211dGV4KTsKLQl7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlkZXZjLT5ycG9ydC5zd3N0YXRlICAgICAgICA9IFNXX0lOSVRJQUw7Ci0JCQlkZXZjLT5ycG9ydC5mbGFncyAgICAgICAgICA9IDA7Ci0JCQlkZXZjLT5ycG9ydC5zd19jaGFubmVscyAgICA9IDE7Ci0JCQlkZXZjLT5ycG9ydC5zd19zYW1wbGVmbXQgICA9IHN3X3NhbXBsZWZtdDsKLQkJCWRldmMtPnJwb3J0LnN3X2ZyYW1lcmF0ZSAgID0gODAwMDsKLQkJCWRldmMtPnJwb3J0LnN3X2ZyYWdzaGlmdCAgID0gREVGQVVMVF9GUkFHU0hJRlQ7Ci0JCQlkZXZjLT5ycG9ydC5zd19mcmFnY291bnQgICA9IERFRkFVTFRfRlJBR0NPVU5UOwotCQkJZGV2Yy0+cnBvcnQuc3dfc3ViZGl2c2hpZnQgPSBERUZBVUxUX1NVQkRJVlNISUZUOwotCQkJZGV2Yy0+cnBvcnQuYnl0ZV9jb3VudCAgICAgPSAwOwotCQkJZGV2Yy0+cnBvcnQuZnJhZ19jb3VudCAgICAgPSAwOwotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJZGV2Yy0+d3BvcnQuc3dzdGF0ZSAgICAgICAgPSBTV19JTklUSUFMOwotCQkJZGV2Yy0+d3BvcnQuZmxhZ3MgICAgICAgICAgPSAwOwotCQkJZGV2Yy0+d3BvcnQuc3dfY2hhbm5lbHMgICAgPSAxOwotCQkJZGV2Yy0+d3BvcnQuc3dfc2FtcGxlZm10ICAgPSBzd19zYW1wbGVmbXQ7Ci0JCQlkZXZjLT53cG9ydC5zd19mcmFtZXJhdGUgICA9IDgwMDA7Ci0JCQlkZXZjLT53cG9ydC5zd19mcmFnc2hpZnQgICA9IERFRkFVTFRfRlJBR1NISUZUOwotCQkJZGV2Yy0+d3BvcnQuc3dfZnJhZ2NvdW50ICAgPSBERUZBVUxUX0ZSQUdDT1VOVDsKLQkJCWRldmMtPndwb3J0LnN3X3N1YmRpdnNoaWZ0ID0gREVGQVVMVF9TVUJESVZTSElGVDsKLQkJCWRldmMtPndwb3J0LmJ5dGVfY291bnQgICAgID0gMDsKLQkJCWRldmMtPndwb3J0LmZyYWdfY291bnQgICAgID0gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmRldmMtPmlvX211dGV4KTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldmM7Ci0JREJHUlYoKTsKLQltdXRleF91bmxvY2soJnZ3c25kX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlbGVhc2UgKGNsb3NlKSB0aGUgYXVkaW8gZGV2aWNlLgotICovCi0KLXN0YXRpYyBpbnQgdndzbmRfYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9IE5VTEwsICpycG9ydCA9IE5VTEw7Ci0JaW50IGVyciA9IDA7Ci0KLQltdXRleF9sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JbXV0ZXhfbG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCXsKLQkJREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlycG9ydCA9ICZkZXZjLT5ycG9ydDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQl3cG9ydCA9ICZkZXZjLT53cG9ydDsKLQkJCXBjbV9mbHVzaF9mcmFnKGRldmMpOwotCQkJcGNtX3dyaXRlX3N5bmMoZGV2Yyk7Ci0JCX0KLQkJcGNtX3NodXRkb3duKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCWlmIChycG9ydCkKLQkJCXJwb3J0LT5zd3N0YXRlID0gU1dfT0ZGOwotCQlpZiAod3BvcnQpCi0JCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX09GRjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQl7Ci0JCWRldmMtPm9wZW5fbW9kZSAmPSB+ZmlsZS0+Zl9tb2RlOwotCX0KLQltdXRleF91bmxvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCXdha2VfdXAoJmRldmMtPm9wZW5fd2FpdCk7Ci0JREVDX1VTRV9DT1VOVDsKLQlEQkdSKCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfYXVkaW9fZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkubGxzZWVrID0Jbm9fbGxzZWVrLAotCS5yZWFkID0JCXZ3c25kX2F1ZGlvX3JlYWQsCi0JLndyaXRlID0JdndzbmRfYXVkaW9fd3JpdGUsCi0JLnBvbGwgPQkJdndzbmRfYXVkaW9fcG9sbCwKLQkudW5sb2NrZWRfaW9jdGwgPSB2d3NuZF9hdWRpb19pb2N0bCwKLQkubW1hcCA9CQl2d3NuZF9hdWRpb19tbWFwLAotCS5vcGVuID0JCXZ3c25kX2F1ZGlvX29wZW4sCi0JLnJlbGVhc2UgPQl2d3NuZF9hdWRpb19yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbWl4ZXIgZHJpdmVyICovCi0KLS8qIG9wZW4gdGhlIG1peGVyIGRldmljZS4gKi8KLQotc3RhdGljIGludCB2d3NuZF9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXZ3c25kX2Rldl90ICpkZXZjOwotCi0JREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7Ci0KLQlJTkNfVVNFX0NPVU5UOwotCW11dGV4X2xvY2soJnZ3c25kX211dGV4KTsKLQlmb3IgKGRldmMgPSB2d3NuZF9kZXZfbGlzdDsgZGV2YzsgZGV2YyA9IGRldmMtPm5leHRfZGV2KQotCQlpZiAoZGV2Yy0+bWl4ZXJfbWlub3IgPT0gaW1pbm9yKGlub2RlKSkKLQkJCWJyZWFrOwotCi0JaWYgKGRldmMgPT0gTlVMTCkgewotCQlERUNfVVNFX0NPVU5UOwotCQltdXRleF91bmxvY2soJnZ3c25kX211dGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldmM7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHJlbGVhc2UgKGNsb3NlKSB0aGUgbWl4ZXIgZGV2aWNlLiAqLwotCi1zdGF0aWMgaW50IHZ3c25kX21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7Ci0JREVDX1VTRV9DT1VOVDsKLQlyZXR1cm4gMDsKLX0KLQotLyogbWl4ZXJfcmVhZF9pb2N0bCBoYW5kbGVzIGFsbCByZWFkIGlvY3RscyBvbiB0aGUgbWl4ZXIgZGV2aWNlLiAqLwotCi1zdGF0aWMgaW50IG1peGVyX3JlYWRfaW9jdGwodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBuciwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgdmFsID0gLTE7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgbnI9MHgleCwgYXJnPTB4JXApXG4iLCBkZXZjLCBuciwgYXJnKTsKLQotCXN3aXRjaCAobnIpIHsKLQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCXZhbCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJdmFsID0gKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfUkVDTEVWKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6Ci0JCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1JFQ0xFVik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9PVVRNQVNLOgotCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAotCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6Ci0JCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUENNOgotCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9QQ00pOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfTElORToKLQkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fTElORSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX01JQyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9DRDoKLQkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fQ0QpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgotCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9SRUNMRVYpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQl2YWwgPSBhZDE4NDNfZ2V0X3JlY3NyYygmZGV2Yy0+bGl0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6Ci0JCXZhbCA9IGFkMTg0M19nZXRfb3V0c3JjKCZkZXZjLT5saXRoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKLX0KLQotLyogbWl4ZXJfd3JpdGVfaW9jdGwgaGFuZGxlcyBhbGwgd3JpdGUgaW9jdGxzIG9uIHRoZSBtaXhlciBkZXZpY2UuICovCi0KLXN0YXRpYyBpbnQgbWl4ZXJfd3JpdGVfaW9jdGwodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBuciwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgdmFsOwotCWludCBlcnI7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgbnI9MHgleCwgYXJnPTB4JXApXG4iLCBkZXZjLCBuciwgYXJnKTsKLQotCWVyciA9IGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzd2l0Y2ggKG5yKSB7Ci0JY2FzZSBTT1VORF9NSVhFUl9QQ006Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX1BDTSwgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0xJTkU6Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0xJTkUsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX01JQywgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0NEOgotCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9DRCwgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKLQkJdmFsID0gYWQxODQzX3NldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUkVDTEVWLCB2YWwpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQlpZiAoZGV2Yy0+cnBvcnQuc3didWYgfHwgZGV2Yy0+d3BvcnQuc3didWYpCi0JCQlyZXR1cm4gLUVCVVNZOwkvKiBjYW4ndCBjaGFuZ2UgcmVjc3JjIHdoaWxlIHJ1bm5pbmcgKi8KLQkJdmFsID0gYWQxODQzX3NldF9yZWNzcmMoJmRldmMtPmxpdGgsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6Ci0JCXZhbCA9IGFkMTg0M19zZXRfb3V0c3JjKCZkZXZjLT5saXRoLCB2YWwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKLQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpOwotfQotCi0vKiBUaGlzIGlzIHRoZSBpb2N0bCBlbnRyeSB0byB0aGUgbWl4ZXIgZHJpdmVyLiAqLwotCi1zdGF0aWMgbG9uZyB2d3NuZF9taXhlcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgdW5zaWduZWQgaW50IG5ybWFzayA9IF9JT0NfTlJNQVNLIDw8IF9JT0NfTlJTSElGVDsKLQljb25zdCB1bnNpZ25lZCBpbnQgbnIgPSAoY21kICYgbnJtYXNrKSA+PiBfSU9DX05SU0hJRlQ7Ci0JaW50IHJldHZhbDsKLQotCURCR0VWKCIoZGV2Yz0weCVwLCBjbWQ9MHgleCwgYXJnPTB4JWx4KVxuIiwgZGV2YywgY21kLCBhcmcpOwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCW11dGV4X2xvY2soJmRldmMtPm1peF9tdXRleCk7Ci0JewotCQlpZiAoKGNtZCAmIH5ucm1hc2spID09IE1JWEVSX1JFQUQoMCkpCi0JCQlyZXR2YWwgPSBtaXhlcl9yZWFkX2lvY3RsKGRldmMsIG5yLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJZWxzZSBpZiAoKGNtZCAmIH5ucm1hc2spID09IE1JWEVSX1dSSVRFKDApKQotCQkJcmV0dmFsID0gbWl4ZXJfd3JpdGVfaW9jdGwoZGV2YywgbnIsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQllbHNlCi0JCQlyZXR2YWwgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmRldmMtPm1peF9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfbWl4ZXJfZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkubGxzZWVrID0Jbm9fbGxzZWVrLAotCS51bmxvY2tlZF9pb2N0bCA9IHZ3c25kX21peGVyX2lvY3RsLAotCS5vcGVuID0JCXZ3c25kX21peGVyX29wZW4sCi0JLnJlbGVhc2UgPQl2d3NuZF9taXhlcl9yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogcHJvYmUvYXR0YWNoL3VubG9hZCAqLwotCi0vKiBkcml2ZXIgcHJvYmUgcm91dGluZS4gIFJldHVybiBub256ZXJvIGlmIGhhcmR3YXJlIGlzIGZvdW5kLiAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9iZV92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JbGl0aGl1bV90IGxpdGg7Ci0JaW50IHc7Ci0JdW5zaWduZWQgbG9uZyBsYXRlcjsKLQotCURCR0VWKCIoaHdfY29uZmlnPTB4JXApXG4iLCBod19jb25maWcpOwotCi0JLyogWFhYIHZlcmlmeSBsaXRoaXVtIHByZXNlbnQgKHRvIHByZXZlbnQgY3Jhc2ggb24gbm9uLXZ3KSAqLwotCi0JaWYgKGxpX2NyZWF0ZSgmbGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBjYW4ndCBtYXAgbGl0aGl1bVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlsYXRlciA9IGppZmZpZXMgKyAyOwotCWxpX3dyaXRlbCgmbGl0aCwgTElfSE9TVF9DT05UUk9MTEVSLCBMSV9IQ19MSU5LX0VOQUJMRSk7Ci0JZG8gewotCQl3ID0gbGlfcmVhZGwoJmxpdGgsIExJX0hPU1RfQ09OVFJPTExFUik7Ci0JfSB3aGlsZSAodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBsYXRlcikpOwotCQotCWxpX2Rlc3Ryb3koJmxpdGgpOwotCi0JREJHUFYoIkhDID0gMHglMDR4XG4iLCB3KTsKLQotCWlmICgodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSkgfHwgKHcgJiBMSV9IQ19MSU5LX0NPREVDKSkgewotCi0JCS8qIFRoaXMgbWF5IGluZGljYXRlIGEgYmV0YSBtYWNoaW5lIHdpdGggbm8gYXVkaW8sCi0JCSAqIG9yIGEgZnV0dXJlIG1hY2hpbmUgd2l0aCBkaWZmZXJlbnQgYXVkaW8uCi0JCSAqIE9uIGJldGEtcmVsZWFzZSAzMjAgdy8gbm8gYXVkaW8sIEhDID09IDB4NDAwMCAqLwotCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBhdWRpbyBjb2RlYyBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodyAmIExJX0hDX0xJTktfRkFJTFVSRSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9iZV92d3NuZDogY2FuJ3QgaW5pdCBhdWRpbyBjb2RlY1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gInZ3c25kOiBsaXRoaXVtIGF1ZGlvIGF0IG1taW8gJSN4IGlycSAlZFxuIiwKLQkJaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPmlycSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIGRyaXZlciBhdHRhY2ggcm91dGluZS4gIEluaXRpYWxpemUgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyBhbmQKLSAqIGluaXRpYWxpemUgaGFyZHdhcmUuICBBIG5ldyB2d3NuZF9kZXZfdCBpcyBhbGxvY2F0ZWQgYW5kIHB1dAotICogb250byB0aGUgZ2xvYmFsIGxpc3QsIHZ3c25kX2Rldl9saXN0LgotICoKLSAqIFJldHVybiArbWlub3JfZGV2IG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGF0dGFjaF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBOVUxMOwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JREJHRVYoIihod19jb25maWc9MHglcClcbiIsIGh3X2NvbmZpZyk7Ci0KLQlkZXZjID0ga21hbGxvYyhzaXplb2YgKHZ3c25kX2Rldl90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldmMgPT0gTlVMTCkKLQkJZ290byBmYWlsMDsKLQotCWVyciA9IGxpX2NyZWF0ZSgmZGV2Yy0+bGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWwxOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+b3Blbl93YWl0KTsKLQotCWRldmMtPnJwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOwotCWRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7Ci0JaWYgKCFkZXZjLT5ycG9ydC5od2J1Zl92YWRkcikKLQkJZ290byBmYWlsMjsKLQlkZXZjLT5ycG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyOwotCWRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPnJwb3J0Lmh3YnVmKTsKLQotCS8qCi0JICogUXVvdGUgZnJvbSB0aGUgTlQgZHJpdmVyOgotCSAqCi0JICogLy8gV0FSTklORyEhISBIQUNLIHRvIHNldHVwIG91dHB1dCBkbWEhISEKLQkgKiAvLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZXZlbiBvbiBvdXRwdXQgdGhlcmUgaXMgc29tZSBkYXRhCi0JICogLy8gdHJpY2tsaW5nIGludG8gdGhlIGlucHV0IERNQSBjaGFubmVsLiAgVGhpcyBpcyBhIGJ1ZyBpbiB0aGUKLQkgKiAvLyBMaXRoaXVtIG1pY3JvY29kZS4KLQkgKiAvLyAtLXNkZQotCSAqCi0JICogV2Ugc2V0IHRoZSBpbnB1dCBzaWRlJ3MgRE1BIGJhc2UgYWRkcmVzcyBoZXJlLiAgSXQgd2lsbCByZW1haW4KLQkgKiB2YWxpZCB1bnRpbCB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgotCSAqLwotCi0JbGlfd3JpdGVsKCZkZXZjLT5saXRoLCBMSV9DT01NMV9CQVNFLAotCQkgIGRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID4+IDggfCAxIDw8ICgzNyAtIDgpKTsKLQotCWRldmMtPndwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOwotCWRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7Ci0JaWYgKCFkZXZjLT53cG9ydC5od2J1Zl92YWRkcikKLQkJZ290byBmYWlsMzsKLQlkZXZjLT53cG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyOwotCWRldmMtPndwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPndwb3J0Lmh3YnVmKTsKLQlEQkdQKCJ3cG9ydCBod2J1ZiA9IDB4JXBcbiIsIGRldmMtPndwb3J0Lmh3YnVmKTsKLQotCURCR0RPKHNodXRfdXArKyk7Ci0JZXJyID0gYWQxODQzX2luaXQoJmRldmMtPmxpdGgpOwotCURCR0RPKHNodXRfdXAtLSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsNDsKLQotCS8qIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQotCWVyciA9IHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCB2d3NuZF9hdWRpb19pbnRyLCAwLCAidndzbmQiLCBkZXZjKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWw1OwotCi0JLyogcmVnaXN0ZXIgdGhpcyBkZXZpY2UncyBkcml2ZXJzLiAqLwotCi0JZGV2Yy0+YXVkaW9fbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnZ3c25kX2F1ZGlvX2ZvcHMsIC0xKTsKLQlpZiAoKGVyciA9IGRldmMtPmF1ZGlvX21pbm9yKSA8IDApIHsKLQkJREJHRE8ocHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAiYXR0YWNoX3Z3c25kOiByZWdpc3Rlcl9zb3VuZF9kc3AgZXJyb3IgJWRcbiIsCi0JCQkgICAgIGVycikpOwotCQlnb3RvIGZhaWw2OwotCX0KLQlkZXZjLT5taXhlcl9taW5vciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZ2d3NuZF9taXhlcl9mb3BzLAotCQkJCQkJIGRldmMtPmF1ZGlvX21pbm9yID4+IDQpOwotCWlmICgoZXJyID0gZGV2Yy0+bWl4ZXJfbWlub3IpIDwgMCkgewotCQlEQkdETyhwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICJhdHRhY2hfdndzbmQ6IHJlZ2lzdGVyX3NvdW5kX21peGVyIGVycm9yICVkXG4iLAotCQkJICAgICBlcnIpKTsKLQkJZ290byBmYWlsNzsKLQl9Ci0KLQkvKiBTcXVpcnJlbCBhd2F5IGRldmljZSBpbmRpY2VzIGZvciB1bmxvYWQgcm91dGluZS4gKi8KLQotCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBkZXZjLT5hdWRpb19taW5vcjsKLQotCS8qIEluaXRpYWxpemUgYXMgbXVjaCBvZiAqZGV2YyBhcyBwb3NzaWJsZSAqLwotCi0JbXV0ZXhfaW5pdCgmZGV2Yy0+b3Blbl9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmZGV2Yy0+aW9fbXV0ZXgpOwotCW11dGV4X2luaXQoJmRldmMtPm1peF9tdXRleCk7Ci0JZGV2Yy0+b3Blbl9tb2RlID0gMDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+cnBvcnQubG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+cnBvcnQucXVldWUpOwotCWRldmMtPnJwb3J0LnN3c3RhdGUgPSBTV19PRkY7Ci0JZGV2Yy0+cnBvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JZGV2Yy0+cnBvcnQuZmxhZ3MgPSAwOwotCWRldmMtPnJwb3J0LnN3YnVmID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+d3BvcnQubG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+d3BvcnQucXVldWUpOwotCWRldmMtPndwb3J0LnN3c3RhdGUgPSBTV19PRkY7Ci0JZGV2Yy0+d3BvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7Ci0JZGV2Yy0+d3BvcnQuZmxhZ3MgPSAwOwotCWRldmMtPndwb3J0LnN3YnVmID0gTlVMTDsKLQotCS8qIFN1Y2Nlc3MuICBMaW5rIHVzIG9udG8gdGhlIGxvY2FsIGRldmljZSBsaXN0LiAqLwotCi0JZGV2Yy0+bmV4dF9kZXYgPSB2d3NuZF9kZXZfbGlzdDsKLQl2d3NuZF9kZXZfbGlzdCA9IGRldmM7Ci0JcmV0dXJuIGRldmMtPmF1ZGlvX21pbm9yOwotCi0JLyogU28gbWFueSB3YXlzIHRvIGZhaWwuICBVbmRvIHdoYXQgd2UgZGlkLiAqLwotCi0gZmFpbDc6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2Yy0+YXVkaW9fbWlub3IpOwotIGZhaWw2OgotCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBkZXZjKTsKLSBmYWlsNToKLSBmYWlsNDoKLQlmcmVlX3BhZ2VzKGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7Ci0gZmFpbDM6Ci0JZnJlZV9wYWdlcyhkZXZjLT5ycG9ydC5od2J1Zl92YWRkciwgSFdCVUZfT1JERVIpOwotIGZhaWwyOgotCWxpX2Rlc3Ryb3koJmRldmMtPmxpdGgpOwotIGZhaWwxOgotCWtmcmVlKGRldmMpOwotIGZhaWwwOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IHVubG9hZF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMsICoqZGV2Y3A7Ci0KLQlEQkdFKCIoKVxuIik7Ci0KLQlkZXZjcCA9ICZ2d3NuZF9kZXZfbGlzdDsKLQl3aGlsZSAoKGRldmMgPSAqZGV2Y3ApKSB7Ci0JCWlmIChkZXZjLT5hdWRpb19taW5vciA9PSBod19jb25maWctPnNsb3RzWzBdKSB7Ci0JCQkqZGV2Y3AgPSBkZXZjLT5uZXh0X2RldjsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldmNwID0gJmRldmMtPm5leHRfZGV2OwotCX0KLQotCWlmICghZGV2YykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldmMtPm1peGVyX21pbm9yKTsKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChkZXZjLT5hdWRpb19taW5vcik7Ci0JZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGRldmMpOwotCWZyZWVfcGFnZXMoZGV2Yy0+d3BvcnQuaHdidWZfdmFkZHIsIEhXQlVGX09SREVSKTsKLQlmcmVlX3BhZ2VzKGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7Ci0JbGlfZGVzdHJveSgmZGV2Yy0+bGl0aCk7Ci0Ja2ZyZWUoZGV2Yyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIHRoZV9od19jb25maWcgPSB7Ci0JMHhGRjAwMTAwMCwJCQkvKiBsaXRoaXVtIHBoeXMgYWRkciAgKi8KLQlDT19JUlEoQ09fQVBJQ19MSV9BVURJTykJLyogaXJxICovCi19OwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBWaXN1YWwgV29ya3N0YXRpb24gc291bmQgbW9kdWxlIik7Ci1NT0RVTEVfQVVUSE9SKCJCb2IgTWlsbGVyIDxrYm9iQHNnaS5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdndzbmQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JREJHWFYoIlxuIik7Ci0JREJHWFYoInNvdW5kOjp2d3NuZDo6aW5pdF9tb2R1bGUoKVxuIik7Ci0KLQlpZiAoIXByb2JlX3Z3c25kKCZ0aGVfaHdfY29uZmlnKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQllcnIgPSBhdHRhY2hfdndzbmQoJnRoZV9od19jb25maWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92d3NuZCh2b2lkKQotewotCURCR1goInNvdW5kOjp2d3NuZDo6Y2xlYW51cF9tb2R1bGUoKVxuIik7Ci0KLQl1bmxvYWRfdndzbmQoJnRoZV9od19jb25maWcpOwotfQotCi1tb2R1bGVfaW5pdChpbml0X3Z3c25kKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfdndzbmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGFyaXNjL2hhcm1vbnkuYyBiL3NvdW5kL3BhcmlzYy9oYXJtb255LmMKaW5kZXggNjdmNTZhMi4uNGIyMGJlNyAxMDA2NDQKLS0tIGEvc291bmQvcGFyaXNjL2hhcm1vbnkuYworKysgYi9zb3VuZC9wYXJpc2MvaGFybW9ueS5jCkBAIC05NTksOCArOTU5LDYgQEAKICAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX3JldDsKICAgICAgICAgfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGFkZXYtPmRldik7Ci0KIAkqcmNoaXAgPSBoOwogCiAJcmV0dXJuIDA7CkBAIC05NzcsNyArOTc1LDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9oYXJtb255ICpoOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBhZGV2LT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL0tjb25maWcgYi9zb3VuZC9wY2kvS2NvbmZpZwppbmRleCA4NzU2YzhlLi4wYjBjMGNmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvS2NvbmZpZwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKIGNvbmZpZyBTTkRfQ1M1NTMwCiAJdHJpc3RhdGUgIkNTNTUzMCBBdWRpbyIKLQlkZXBlbmRzIG9uIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBJU0FfRE1BX0FQSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAlzZWxlY3QgU05EX1NCMTZfRFNQCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGF1ZGlvIG9uIEN5cml4L05hdFNlbWkgQ1M1NTMwIGNoaXBzLgpAQCAtMjg2LDYgKzI4Niw3IEBACiAKIGNvbmZpZyBTTkRfQ1M1NTM1QVVESU8KIAl0cmlzdGF0ZSAiQ1M1NTM1L0NTNTUzNiBBdWRpbyIKKwlkZXBlbmRzIG9uIFg4Nl8zMiB8fCBNSVBTIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTTkRfUENNCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCiAJaGVscApAQCAtNTc4LDggKzU3OSw2IEBACiAJICBGTTgwMSBjaGlwIHdpdGggYSBURUE1NzU3IHR1bmVyIChNZWRpYUZvcnRlIFNGMjU2LVBDUywgU0YyNTYtUENQIGFuZAogCSAgU0Y2NC1QQ1IpIGludG8gdGhlIHNuZC1mbTgwMSBkcml2ZXIuCiAKLXNvdXJjZSAic291bmQvcGNpL2hkYS9LY29uZmlnIgotCiBjb25maWcgU05EX0hEU1AKIAl0cmlzdGF0ZSAiUk1FIEhhbW1lcmZhbGwgRFNQIEF1ZGlvIgogCXNlbGVjdCBGV19MT0FERVIKQEAgLTc5Niw3ICs3OTUsNyBAQAogCiBjb25maWcgU05EX1NJUzcwMTkKIAl0cmlzdGF0ZSAiU2lTIDcwMTkgQXVkaW8gQWNjZWxlcmF0b3IiCi0JZGVwZW5kcyBvbiBYODYgJiYgIVg4Nl82NAorCWRlcGVuZHMgb24gWDg2XzMyCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCiAJc2VsZWN0IFpPTkVfRE1BCiAJaGVscApAQCAtODg5LDMgKzg4OCw1IEBACiAJICB3aWxsIGJlIGNhbGxlZCBzbmQteW1mcGNpLgogCiBlbmRpZgkjIFNORF9QQ0kKKworc291cmNlICJzb3VuZC9wY2kvaGRhL0tjb25maWciCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggYmY1NzhiYTIuLjE0YWQ1NGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKQEAgLTIxNCw2ICsyMTQsMTIgQEAKICNkZWZpbmUgYWM5N19pc19wb3dlcl9zYXZlX21vZGUoYWM5NykgMAogI2VuZGlmCiAKKyNkZWZpbmUgYWM5N19lcnIoYWM5NywgZm10LCBhcmdzLi4uKQlcCisJZGV2X2VycigoYWM5NyktPmJ1cy0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgYWM5N193YXJuKGFjOTcsIGZtdCwgYXJncy4uLikJXAorCWRldl93YXJuKChhYzk3KS0+YnVzLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBhYzk3X2RiZyhhYzk3LCBmbXQsIGFyZ3MuLi4pCVwKKwlkZXZfZGJnKChhYzk3KS0+YnVzLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQogCiAvKgogICogIEkvTyByb3V0aW5lcwpAQCAtMTY3Myw3ICsxNjc5LDcgQEAKIAlpbnQgZXJyLCBpZHg7CiAKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJBQzk3X0dQSU9fQ0ZHID0gJXhcbiIsCisJYWM5N19kYmcoYWM5NywgIkFDOTdfR1BJT19DRkcgPSAleFxuIiwKIAkgICAgICAgc25kX2FjOTdfcmVhZChhYzk3LEFDOTdfR1BJT19DRkcpKTsKIAkqLwogCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfR1BJT19DRkcsIDB4ZmZmZiAmIH4oQUM5N19HUElPX0xJTkUxX09IKSk7CkBAIC0xOTYzLDcgKzE5NjksNyBAQAogCQkgICAgIGFjOTctPmJ1cy0+Y2FyZC0+bnVtYmVyLCBhYzk3LT5udW0sCiAJCSAgICAgc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUoYWM5NykpOwogCWlmICgoZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZhYzk3LT5kZXYpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgYWM5NyBidXNcbiIpOworCQlhYzk3X2VycihhYzk3LCAiQ2FuJ3QgcmVnaXN0ZXIgYWM5NyBidXNcbiIpOwogCQlhYzk3LT5kZXYuYnVzID0gTlVMTDsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yMDg5LDcgKzIwOTUsOCBAQAogCQkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyg1MDApLCAxKTsKIAkJfQogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkFDJzk3ICVkIGRvZXMgbm90IHJlc3BvbmQgLSBSRVNFVFxuIiwgYWM5Ny0+bnVtKTsKKwkJCWFjOTdfd2FybihhYzk3LCAiQUMnOTcgJWQgZG9lcyBub3QgcmVzcG9uZCAtIFJFU0VUXG4iLAorCQkJCSBhYzk3LT5udW0pOwogCQkJLyogcHJvY2VlZCBhbnl3YXkgLSBpdCdzIG9mdGVuIG5vbi1jcml0aWNhbCAqLwogCQl9CiAJfQpAQCAtMjA5OCw3ICsyMTA1LDkgQEAKIAlhYzk3LT5pZCB8PSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMik7CiAJaWYgKCEgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0RFVEVDVF9CWV9WRU5ET1IpICYmCiAJICAgIChhYzk3LT5pZCA9PSAweDAwMDAwMDAwIHx8IGFjOTctPmlkID09IDB4ZmZmZmZmZmYpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3ICVkIGFjY2VzcyBpcyBub3QgdmFsaWQgWzB4JXhdLCByZW1vdmluZyBtaXhlci5cbiIsIGFjOTctPm51bSwgYWM5Ny0+aWQpOworCQlhYzk3X2VycihhYzk3LAorCQkJICJBQyc5NyAlZCBhY2Nlc3MgaXMgbm90IHZhbGlkIFsweCV4XSwgcmVtb3ZpbmcgbWl4ZXIuXG4iLAorCQkJIGFjOTctPm51bSwgYWM5Ny0+aWQpOwogCQlzbmRfYWM5N19mcmVlKGFjOTcpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yMTMxLDcgKzIxNDAsOSBAQAogCiAJaWYgKCFhYzk3X2lzX2F1ZGlvKGFjOTcpICYmICFhYzk3X2lzX21vZGVtKGFjOTcpKSB7CiAJCWlmICghKGFjOTctPnNjYXBzICYgKEFDOTdfU0NBUF9TS0lQX0FVRElPfEFDOTdfU0NBUF9TS0lQX01PREVNKSkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyAlZCBhY2Nlc3MgZXJyb3IgKG5vdCBhdWRpbyBvciBtb2RlbSBjb2RlYylcbiIsIGFjOTctPm51bSk7CisJCQlhYzk3X2VycihhYzk3LAorCQkJCSAiQUMnOTcgJWQgYWNjZXNzIGVycm9yIChub3QgYXVkaW8gb3IgbW9kZW0gY29kZWMpXG4iLAorCQkJCSBhYzk3LT5udW0pOwogCQlzbmRfYWM5N19mcmVlKGFjOTcpOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CkBAIC0yMTU2LDcgKzIxNjcsOCBAQAogCQkJCWdvdG8gX19yZWFkeV9vazsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJBQyc5NyAlZCBhbmFsb2cgc3Vic2VjdGlvbnMgbm90IHJlYWR5XG4iLCBhYzk3LT5udW0pOworCQlhYzk3X3dhcm4oYWM5NywKKwkJCSAgIkFDJzk3ICVkIGFuYWxvZyBzdWJzZWN0aW9ucyBub3QgcmVhZHlcbiIsIGFjOTctPm51bSk7CiAJfQogCiAJLyogRklYTUU6IGFkZCBwb3dlcmRvd24gY29udHJvbCAqLwpAQCAtMjE4OCw3ICsyMjAwLDEwIEBACiAJCQkJZ290byBfX3JlYWR5X29rOwogCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIk1DJzk3ICVkIGNvbnZlcnRlcnMgYW5kIEdQSU8gbm90IHJlYWR5ICgweCV4KVxuIiwgYWM5Ny0+bnVtLCBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTVNUQVRVUykpOworCQlhYzk3X3dhcm4oYWM5NywKKwkJCSAgIk1DJzk3ICVkIGNvbnZlcnRlcnMgYW5kIEdQSU8gbm90IHJlYWR5ICgweCV4KVxuIiwKKwkJCSAgYWM5Ny0+bnVtLAorCQkJICBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTVNUQVRVUykpOwogCX0KIAkKICAgICAgIF9fcmVhZHlfb2s6CkBAIC0yNzIzLDcgKzI3MzgsNyBAQAogewogCXVuc2lnbmVkIHNob3J0IHNjZmc7CiAJaWYgKChhYzk3LT5pZCAmIDB4ZmZmZmZmMDApICE9IDB4NDE0NDUzMDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWM5N19xdWlyayBBRF9TSEFSSU5HIGlzIG9ubHkgZm9yIEFEIGNvZGVjc1xuIik7CisJCWFjOTdfZXJyKGFjOTcsICJhYzk3X3F1aXJrIEFEX1NIQVJJTkcgaXMgb25seSBmb3IgQUQgY29kZWNzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIFR1cm4gb24gT01TIGJpdCB0byByb3V0ZSBtaWNyb3Bob25lIHRvIGJhY2sgcGFuZWwgKi8KQEAgLTI3MzksNyArMjc1NCw4IEBACiBzdGF0aWMgaW50IHR1bmVfYWxjX2phY2soc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewogCWlmICgoYWM5Ny0+aWQgJiAweGZmZmZmZjAwKSAhPSAweDQxNGM0NzAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFjOTdfcXVpcmsgQUxDX0pBQ0sgaXMgb25seSBmb3IgUmVhbHRlayBjb2RlY3NcbiIpOworCQlhYzk3X2VycihhYzk3LAorCQkJICJhYzk3X3F1aXJrIEFMQ19KQUNLIGlzIG9ubHkgZm9yIFJlYWx0ZWsgY29kZWNzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIDB4N2EsIDB4MjAsIDB4MjApOyAvKiBzZWxlY3QgamFjayBkZXRlY3QgZnVuY3Rpb24gKi8KQEAgLTI4OTksNyArMjkxNSw4IEBACiAJaWYgKG92ZXJyaWRlICYmIHN0cmNtcChvdmVycmlkZSwgIi0xIikgJiYgc3RyY21wKG92ZXJyaWRlLCAiZGVmYXVsdCIpKSB7CiAJCXJlc3VsdCA9IGFwcGx5X3F1aXJrX3N0cihhYzk3LCBvdmVycmlkZSk7CiAJCWlmIChyZXN1bHQgPCAwKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlcyBmYWlsZWQgKCVkKVxuIiwgb3ZlcnJpZGUsIHJlc3VsdCk7CisJCQlhYzk3X2VycihhYzk3LCAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlcyBmYWlsZWQgKCVkKVxuIiwKKwkJCQkgb3ZlcnJpZGUsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC0yOTEzLDEwICsyOTMwLDE0IEBACiAJCSAgICBxdWlyay0+c3ViZGV2aWNlID09IChxdWlyay0+bWFzayAmIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpKSB7CiAJCQlpZiAocXVpcmstPmNvZGVjX2lkICYmIHF1aXJrLT5jb2RlY19pZCAhPSBhYzk3LT5pZCkKIAkJCQljb250aW51ZTsKLQkJCXNuZF9wcmludGRkKCJhYzk3IHF1aXJrIGZvciAlcyAoJTA0eDolMDR4KVxuIiwgcXVpcmstPm5hbWUsIGFjOTctPnN1YnN5c3RlbV92ZW5kb3IsIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpOworCQkJYWM5N19kYmcoYWM5NywgImFjOTcgcXVpcmsgZm9yICVzICglMDR4OiUwNHgpXG4iLAorCQkJCSBxdWlyay0+bmFtZSwgYWM5Ny0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJCQkgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSk7CiAJCQlyZXN1bHQgPSBhcHBseV9xdWlyayhhYzk3LCBxdWlyay0+dHlwZSk7CiAJCQlpZiAocmVzdWx0IDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZvciAlcyBmYWlsZWQgKCVkKVxuIiwgcXVpcmstPnR5cGUsIHF1aXJrLT5uYW1lLCByZXN1bHQpOworCQkJCWFjOTdfZXJyKGFjOTcsCisJCQkJCSAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlZCBmb3IgJXMgZmFpbGVkICglZClcbiIsCisJCQkJCSBxdWlyay0+dHlwZSwgcXVpcmstPm5hbWUsIHJlc3VsdCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCmluZGV4IDY2YTNiYzkuLjk5MTc2MjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKQEAgLTM0NzcsNyArMzQ3Nyw4IEBACiAKIAkJc2N0bCA9IHNuZF9hYzk3X2ZpbmRfbWl4ZXJfY3RsKGFjOTcsICpzKTsKIAkJaWYgKCFzY3RsKSB7Ci0JCQlzbmRfcHJpbnRkZCgiQ2Fubm90IGZpbmQgc2xhdmUgJXMsIHNraXBwZWRcbiIsICpzKTsKKwkJCWRldl9kYmcoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsCisJCQkJIkNhbm5vdCBmaW5kIHNsYXZlICVzLCBza2lwcGVkXG4iLCAqcyk7CiAJCQljb250aW51ZTsKIAkJfQogCQllcnIgPSBzbmRfY3RsX2FkZF9zbGF2ZShrY3RsLCBzY3RsKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCmluZGV4IGVhYjBmYzkuLmQxNTI5N2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwpAQCAtNjA0LDcgKzYwNCw5IEBACiAJCX0KIAkJaWYgKCFva19mbGFnKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJnBjbS0+YnVzLT5idXNfbG9jayk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCBjb25maWd1cmF0aW9uIGZvciBBQzk3IHNsb3QgJWlcbiIsIGkpOworCQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKKwkJCQkiY2Fubm90IGZpbmQgY29uZmlndXJhdGlvbiBmb3IgQUM5NyBzbG90ICVpXG4iLAorCQkJCWkpOwogCQkJZXJyID0gLUVBR0FJTjsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTYxOCwxNSArNjIwLDIwIEBACiAJCQlpZiAocGNtLT5yW3JdLnJzbG90c1tjaWR4XSAmICgxIDw8IGkpKSB7CiAJCQkJcmVnID0gZ2V0X3Nsb3RfcmVnKHBjbSwgY2lkeCwgaSwgcik7CiAJCQkJaWYgKHJlZyA9PSAweGZmKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgQUM5NyBzbG90ICVpP1xuIiwgaSk7CisJCQkJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsCisJCQkJCQkiaW52YWxpZCBBQzk3IHNsb3QgJWk/XG4iLCBpKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWlmIChyZWdfb2tbY2lkeF0gJiAoMSA8PCAocmVnIC0gQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpKSkKIAkJCQkJY29udGludWU7Ci0JCQkJLy9wcmludGsoS0VSTl9ERUJVRyAic2V0dGluZyBhYzk3IHJlZyAweCV4IHRvIHJhdGUgJWRcbiIsIHJlZywgcmF0ZSk7CisJCQkJZGV2X2RiZyhidXMtPmNhcmQtPmRldiwKKwkJCQkJInNldHRpbmcgYWM5NyByZWcgMHgleCB0byByYXRlICVkXG4iLAorCQkJCQlyZWcsIHJhdGUpOwogCQkJCWVyciA9IHNuZF9hYzk3X3NldF9yYXRlKHBjbS0+cltyXS5jb2RlY1tjaWR4XSwgcmVnLCByYXRlKTsKIAkJCQlpZiAoZXJyIDwgMCkKLQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgaW4gc25kX2FjOTdfc2V0X3JhdGU6IGNpZHg9JWQsIHJlZz0weCV4LCByYXRlPSVkLCBlcnI9JWRcbiIsIGNpZHgsIHJlZywgcmF0ZSwgZXJyKTsKKwkJCQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKKwkJCQkJCSJlcnJvciBpbiBzbmRfYWM5N19zZXRfcmF0ZTogY2lkeD0lZCwgcmVnPTB4JXgsIHJhdGU9JWQsIGVycj0lZFxuIiwKKwkJCQkJCWNpZHgsIHJlZywgcmF0ZSwgZXJyKTsKIAkJCQllbHNlCiAJCQkJCXJlZ19va1tjaWR4XSB8PSAoMSA8PCAocmVnIC0gQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCBiNjgwZDAzLi40ODhmOTY2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC03Nyw5ICs3Nyw2IEBACiAjZGVmaW5lIERFVk5BTUUgImFkMTg4OSIKICNkZWZpbmUgUEZYCURFVk5BTUUgIjogIgogCi0vKiBsZXQncyB1c2UgdGhlIGdsb2JhbCBzb3VuZCBkZWJ1ZyBpbnRlcmZhY2VzICovCi0jZGVmaW5lIGFkMTg4OV9kZWJ1ZyhmbXQsIGFyZy4uLikgc25kX3ByaW50ZChLRVJOX0RFQlVHIGZtdCwgIyMgYXJnKQotCiAvKiBrZWVwIHRyYWNrIG9mIHNvbWUgaHcgcmVnaXN0ZXJzICovCiBzdHJ1Y3QgYWQxODg5X3JlZ2lzdGVyX3N0YXRlIHsKIAl1MTYgcmVnOwkvKiByZWcgc2V0dXAgKi8KQEAgLTI2NCwxMSArMjYxLDExIEBACiAJCQkmJiAtLXJldHJ5KQogCQltZGVsYXkoMSk7CiAJaWYgKCFyZXRyeSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiWyVzXSBMaW5rIGlzIG5vdCByZWFkeS5cbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiWyVzXSBMaW5rIGlzIG5vdCByZWFkeS5cbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlPOwogCX0KLQlhZDE4ODlfZGVidWcoIlslc10gcmVhZHkgYWZ0ZXIgJWQgbXNcbiIsIF9fZnVuY19fLCA0MDAgLSByZXRyeSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJbJXNdIHJlYWR5IGFmdGVyICVkIG1zXG4iLCBfX2Z1bmNfXywgNDAwIC0gcmV0cnkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDUsOSArNDAyLDkgQEAKIAkKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPmxvY2spOwogCQotCWFkMTg4OV9kZWJ1ZygicHJlcGFyZSBwbGF5YmFjazogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsICIKLQkJCSJzaXplID0gJXUsIHJlZyA9IDB4JXgsIHJhdGUgPSAldVxuIiwgY2hpcC0+d2F2ZS5hZGRyLAotCQkJY291bnQsIHNpemUsIHJlZywgcnQtPnJhdGUpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicHJlcGFyZSBwbGF5YmFjazogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsIHNpemUgPSAldSwgcmVnID0gMHgleCwgcmF0ZSA9ICV1XG4iLAorCQljaGlwLT53YXZlLmFkZHIsIGNvdW50LCBzaXplLCByZWcsIHJ0LT5yYXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUyLDkgKzQ0OSw5IEBACiAJCiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5sb2NrKTsKIAkKLQlhZDE4ODlfZGVidWcoInByZXBhcmUgY2FwdHVyZTogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsICIKLQkJCSJzaXplID0gJXUsIHJlZyA9IDB4JXgsIHJhdGUgPSAldVxuIiwgY2hpcC0+cmFtYy5hZGRyLAotCQkJY291bnQsIHNpemUsIHJlZywgcnQtPnJhdGUpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicHJlcGFyZSBjYXB0dXJlOiBhZGRyID0gMHgleCwgY291bnQgPSAldSwgc2l6ZSA9ICV1LCByZWcgPSAweCV4LCByYXRlID0gJXVcbiIsCisJCWNoaXAtPnJhbWMuYWRkciwgY291bnQsIHNpemUsIHJlZywgcnQtPnJhdGUpOwogCXJldHVybiAwOwogfQogCkBAIC02MTQsNyArNjExLDggQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJaWYgKHN0ICYgKEFEX0RNQV9ESVNSX1BNQUl8QURfRE1BX0RJU1JfUFRBSSkpCi0JCWFkMTg4OV9kZWJ1ZygiVW5leHBlY3RlZCBtYXN0ZXIgb3IgdGFyZ2V0IGFib3J0IGludGVycnVwdCFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJVbmV4cGVjdGVkIG1hc3RlciBvciB0YXJnZXQgYWJvcnQgaW50ZXJydXB0IVxuIik7CiAKIAlpZiAoKHN0ICYgQURfRE1BX0RJU1JfV0FWSSkgJiYgY2hpcC0+cHN1YnMpCiAJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+cHN1YnMpOwpAQCAtNjU2LDcgKzY1NCw3IEBACiAJCQkJCQlCVUZGRVJfQllURVNfTUFYKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJidWZmZXIgYWxsb2NhdGlvbiBlcnJvcjogJWRcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiYnVmZmVyIGFsbG9jYXRpb24gZXJyb3I6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkKQEAgLTkxMiw3ICs5MTAsNyBAQAogCS8qIGNoZWNrIFBDSSBhdmFpbGFiaWxpdHkgKDMyYml0IERNQSkgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyb3Igc2V0dGluZyAzMi1iaXQgRE1BIG1hc2suXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlcnJvciBzZXR0aW5nIDMyLWJpdCBETUEgbWFzay5cbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC05MzUsNyArOTMzLDcgQEAKIAljaGlwLT5iYXIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5pb2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAwKTsKIAlpZiAoY2hpcC0+aW9iYXNlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIHJlc2VydmUgcmVnaW9uLlxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlc2VydmUgcmVnaW9uLlxuIik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBmcmVlX2FuZF9yZXQ7CiAJfQpAQCAtOTQ2LDcgKzk0NCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hZDE4ODlfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3Qgb2J0YWluIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBvYnRhaW4gSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9hZDE4ODlfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC05NjUsOCArOTYzLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCiAJcmV0dXJuIDA7CkBAIC05OTYsNyArOTkyLDggQEAKIAl9CiAKIAkvKiAoMikgKi8KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCS8qIFhYWCBSRVZJU0lUOiB3ZSBjYW4gcHJvYmFibHkgYWxsb2NhdGUgY2hpcCBpbiB0aGlzIGNhbGwgKi8KIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCBjNjgzNWEzLi5mZWIyOWMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC02NSwxOCArNjUsNiBAQAogCiAKIC8qCi0gKiAgRGVidWcgcGFydCBkZWZpbml0aW9ucwotICovCi0KLS8qICNkZWZpbmUgQUxJX0RFQlVHICovCi0KLSNpZmRlZiBBTElfREVCVUcKLSNkZWZpbmUgc25kX2FsaV9wcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncyk7Ci0jZWxzZQotI2RlZmluZSBzbmRfYWxpX3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotLyoKICAqICBDb25zdGFudHMgZGVmaW5pdGlvbgogICovCiAKQEAgLTMyMSw3ICszMDksNyBAQAogCX0KIAogCXNuZF9hbGlfNTQ1MV9wb2tlKGNvZGVjLCBwb3J0LCByZXMgJiB+MHg4MDAwKTsKLQlzbmRfcHJpbnRkZCgiYWxpX2NvZGVjX3JlYWR5OiBjb2RlYyBpcyBub3QgcmVhZHkuXG4gIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2NvZGVjX3JlYWR5OiBjb2RlYyBpcyBub3QgcmVhZHkuXG4gIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTM0Miw3ICszMzAsNyBAQAogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9CiAKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfc3RpbWVyX3JlYWQ6IHN0aW1lciBpcyBub3QgcmVhZHkuXG4iKTsKKwlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfc3RpbWVyX3JlYWQ6IHN0aW1lciBpcyBub3QgcmVhZHkuXG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMzU0LDcgKzM0Miw4IEBACiAJdW5zaWduZWQgaW50IHBvcnQ7CiAKIAlpZiAocmVnID49IDB4ODApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2NvZGVjX3Bva2U6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkiYWxpX2NvZGVjX3Bva2U6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zODUsNyArMzc0LDggQEAKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAogCWlmIChyZWcgPj0gMHg4MCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfY29kZWNfcGVlazogcmVnKCV4aCkgaW52YWxpZC5cbiIsIHJlZyk7CisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCSJhbGlfY29kZWNfcGVlazogcmVnKCV4aCkgaW52YWxpZC5cbiIsIHJlZyk7CiAJCXJldHVybiB+MDsKIAl9CiAKQEAgLTQxNyw3ICs0MDcsNyBAQAogewogCXN0cnVjdCBzbmRfYWxpICpjb2RlYyA9IGFjOTctPnByaXZhdGVfZGF0YTsKIAotCXNuZF9hbGlfcHJpbnRrKCJjb2RlY193cml0ZTogcmVnPSV4aCBkYXRhPSV4aC5cbiIsIHJlZywgdmFsKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJjb2RlY193cml0ZTogcmVnPSV4aCBkYXRhPSV4aC5cbiIsIHJlZywgdmFsKTsKIAlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpIHsKIAkJb3V0bCgodmFsIDw8IEFMSV9BQzk3X0dQSU9fREFUQV9TSElGVCkgfCBBTElfQUM5N19HUElPX0VOQUJMRSwKIAkJICAgICBBTElfUkVHKGNvZGVjLCBBTElfQUM5N19HUElPKSk7CkBAIC00MzMsNyArNDIzLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBhYzk3LT5wcml2YXRlX2RhdGE7CiAKLQlzbmRfYWxpX3ByaW50aygiY29kZWNfcmVhZCByZWc9JXhoLlxuIiwgcmVnKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJjb2RlY19yZWFkIHJlZz0leGguXG4iLCByZWcpOwogCXJldHVybiBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIGFjOTctPm51bSwgcmVnKTsKIH0KIApAQCAtNDc0LDcgKzQ2NCw3IEBACiAJfQogCiAJLyogbm9uLWZhdGFsIGlmIHlvdSBoYXZlIGEgbm9uIFBNIGNhcGFibGUgY29kZWMgKi8KLQkvKiBzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpNTQ1MTogcmVzZXQgdGltZSBvdXRcbiIpOyAqLworCS8qIGRldl93YXJuKGNvZGVjLT5jYXJkLT5kZXYsICJhbGk1NDUxOiByZXNldCB0aW1lIG91dFxuIik7ICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyOCw3ICs1MTgsNyBAQAogCXVuc2lnbmVkIGludCBtYXNrOwogCXN0cnVjdCBzbmRfYWxpX2NoYW5uZWxfY29udHJvbCAqcGNocmVncyA9ICYoY29kZWMtPmNocmVncyk7CiAKLQlzbmRfYWxpX3ByaW50aygiZGlzYWJsZV92b2ljZV9pcnEgY2hhbm5lbD0lZFxuIixjaGFubmVsKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJkaXNhYmxlX3ZvaWNlX2lycSBjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsKIAogCW1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CiAJcGNocmVncy0+ZGF0YS5haW50ZW4gID0gaW5sKEFMSV9SRUcoY29kZWMsIHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7CkBAIC01NDEsNyArNTMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaWR4ID0gIGNoYW5uZWwgJiAweDFmOwogCiAJaWYgKGNvZGVjLT5zeW50aC5jaGNudCA+PSBBTElfQ0hBTk5FTFMpewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKIAkJCSAgICJhbGlfYWxsb2NfcGNtX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTU0OSw3ICs1MzksNyBAQAogCWlmICghKGNvZGVjLT5zeW50aC5jaG1hcCAmICgxIDw8IGlkeCkpKSB7CiAJCWNvZGVjLT5zeW50aC5jaG1hcCB8PSAxIDw8IGlkeDsKIAkJY29kZWMtPnN5bnRoLmNoY250Kys7Ci0JCXNuZF9hbGlfcHJpbnRrKCJhbGxvY19wY21fY2hhbm5lbCBuby4gJWQuXG4iLGlkeCk7CisJCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsbG9jX3BjbV9jaGFubmVsIG5vLiAlZC5cbiIsIGlkeCk7CiAJCXJldHVybiBpZHg7CiAJfQogCXJldHVybiAtMTsKQEAgLTU2MCw3ICs1NTAsOCBAQAogCWludCBpZHg7CiAJaW50IHJlc3VsdCA9IC0xOwogCi0Jc25kX2FsaV9wcmludGsoImZpbmRfZnJlZV9jaGFubmVsOiBmb3IgJXNcbiIscmVjID8gInJlYyIgOiAicGNtIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LAorCQkiZmluZF9mcmVlX2NoYW5uZWw6IGZvciAlc1xuIiwgcmVjID8gInJlYyIgOiAicGNtIik7CiAKIAkvKiByZWNvcmRpbmcgKi8KIAlpZiAocmVjKSB7CkBAIC01NzUsOCArNTY2LDggQEAKIAkJaWYgKHJlc3VsdCA+PSAwKQogCQkJcmV0dXJuIHJlc3VsdDsKIAkJZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6ICIKLQkJCQkgICAicmVjb3JkIGNoYW5uZWwgaXMgYnVzeSBub3cuXG4iKTsKKwkJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCQkiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiByZWNvcmQgY2hhbm5lbCBpcyBidXN5IG5vdy5cbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtNTkwLDggKzU4MSw4IEBACiAJCWlmIChyZXN1bHQgPj0gMCkKIAkJCXJldHVybiByZXN1bHQ7CiAJCWVsc2UKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9maW5kX2ZyZWVfY2hhbm5lbDogIgotCQkJCSAgICJTL1BESUYgb3V0IGNoYW5uZWwgaXMgaW4gYnVzeSBub3cuXG4iKTsKKwkJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCQkiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiBTL1BESUYgb3V0IGNoYW5uZWwgaXMgaW4gYnVzeSBub3cuXG4iKTsKIAl9CiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFMSV9DSEFOTkVMUzsgaWR4KyspIHsKQEAgLTU5OSw3ICs1OTAsNyBAQAogCQlpZiAocmVzdWx0ID49IDApCiAJCQlyZXR1cm4gcmVzdWx0OwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKKwlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTYwNywxNCArNTk4LDE1IEBACiB7CiAJdW5zaWduZWQgaW50IGlkeCA9IGNoYW5uZWwgJiAweDAwMDAwMDFmOwogCi0Jc25kX2FsaV9wcmludGsoImZyZWVfY2hhbm5lbF9wY20gY2hhbm5lbD0lZFxuIixjaGFubmVsKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJmcmVlX2NoYW5uZWxfcGNtIGNoYW5uZWw9JWRcbiIsIGNoYW5uZWwpOwogCiAJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPj0gQUxJX0NIQU5ORUxTKQogCQlyZXR1cm47CiAKIAlpZiAoIShjb2RlYy0+c3ludGguY2htYXAgJiAoMSA8PCBpZHgpKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZnJlZV9jaGFubmVsX3BjbTogIgotCQkJICAgImNoYW5uZWwgJWQgaXMgbm90IGluIHVzZS5cbiIsIGNoYW5uZWwpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkiYWxpX2ZyZWVfY2hhbm5lbF9wY206IGNoYW5uZWwgJWQgaXMgbm90IGluIHVzZS5cbiIsCisJCQljaGFubmVsKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCWNvZGVjLT5zeW50aC5jaG1hcCAmPSB+KDEgPDwgaWR4KTsKQEAgLTYyNiw3ICs2MTgsNyBAQAogewogCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwogCi0Jc25kX2FsaV9wcmludGsoInN0b3Bfdm9pY2U6IGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAic3RvcF92b2ljZTogY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7CiAJb3V0bChtYXNrLCBBTElfUkVHKGNvZGVjLCBjb2RlYy0+Y2hyZWdzLnJlZ3Muc3RvcCkpOwogfQogCkBAIC02NjcsNyArNjU5LDcgQEAKIAl9CiAKIAlpZiAoY291bnQgPiA1MDAwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZGV0ZWN0X3NwZGlmX3JhdGU6IHRpbWVvdXQhXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2RldGVjdF9zcGRpZl9yYXRlOiB0aW1lb3V0IVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTY4Miw3ICs2NzQsNyBAQAogCX0KIAogCWlmIChjb3VudCA+IDUwMDAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZTogdGltZW91dCFcbiIpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfZGV0ZWN0X3NwZGlmX3JhdGU6IHRpbWVvdXQhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODU3LDkgKzg0OSw2IEBACiAJc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZTsKIAlzdHJ1Y3Qgc25kX2FsaV9jaGFubmVsX2NvbnRyb2wgKnBjaHJlZ3M7CiAJdW5zaWduZWQgaW50IG9sZCwgbWFzazsKLSNpZmRlZiBBTElfREVCVUcKLQl1bnNpZ25lZCBpbnQgdGVtcCwgY3NwZjsKLSNlbmRpZgogCiAJcGNocmVncyA9ICYoY29kZWMtPmNocmVncyk7CiAKQEAgLTg3NywxNCArODY2LDExIEBACiAKIAlpZiAocHZvaWNlLT5wY20gJiYgcHZvaWNlLT5zdWJzdHJlYW0pIHsKIAkJLyogcGNtIGludGVycnVwdCAqLwotI2lmZGVmIEFMSV9ERUJVRwotCQlvdXRiKCh1OCkocHZvaWNlLT5udW1iZXIpLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7Ci0JCXRlbXAgPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMgKyAyKSk7Ci0JCWNzcGYgPSAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9DU1BGKSkgJiBtYXNrKSA9PSBtYXNrOwotI2VuZGlmCiAJCWlmIChwdm9pY2UtPnJ1bm5pbmcpIHsKLQkJCXNuZF9hbGlfcHJpbnRrKCJ1cGRhdGVfcHRyOiBjc289JTQuNHggY3NwZj0lZC5cbiIsCi0JCQkJICAgICAgICh1MTYpdGVtcCwgY3NwZik7CisJCQlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkJInVwZGF0ZV9wdHI6IGNzbz0lNC40eCBjc3BmPSVkLlxuIiwKKwkJCQlpbncoQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMgKyAyKSksCisJCQkJKGlubChBTElfUkVHKGNvZGVjLCBBTElfQ1NQRikpICYgbWFzaykgPT0gbWFzayk7CiAJCQlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKIAkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHZvaWNlLT5zdWJzdHJlYW0pOwogCQkJc3Bpbl9sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwpAQCAtOTQwLDE0ICs5MjYsMTQgQEAKIAlzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqcHZvaWNlOwogCWludCBpZHg7CiAKLQlzbmRfYWxpX3ByaW50aygiYWxsb2Nfdm9pY2U6IHR5cGU9JWQgcmVjPSVkXG4iLCB0eXBlLCByZWMpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsbG9jX3ZvaWNlOiB0eXBlPSVkIHJlYz0lZFxuIiwgdHlwZSwgcmVjKTsKIAogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT52b2ljZV9hbGxvYyk7CiAJaWYgKHR5cGUgPT0gU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNKSB7CiAJCWlkeCA9IGNoYW5uZWwgPiAwID8gc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChjb2RlYywgY2hhbm5lbCkgOgogCQkJc25kX2FsaV9maW5kX2ZyZWVfY2hhbm5lbChjb2RlYyxyZWMpOwogCQlpZiAoaWR4IDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2FsbG9jX3ZvaWNlOiBlcnIuXG4iKTsKKwkJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwgImFsaV9hbGxvY192b2ljZTogZXJyLlxuIik7CiAJCQlzcGluX3VubG9ja19pcnEoJmNvZGVjLT52b2ljZV9hbGxvYyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtOTcwLDcgKzk1Niw3IEBACiAJdm9pZCAoKnByaXZhdGVfZnJlZSkodm9pZCAqKTsKIAl2b2lkICpwcml2YXRlX2RhdGE7CiAKLQlzbmRfYWxpX3ByaW50aygiZnJlZV92b2ljZTogY2hhbm5lbD0lZFxuIixwdm9pY2UtPm51bWJlcik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiZnJlZV92b2ljZTogY2hhbm5lbD0lZFxuIiwgcHZvaWNlLT5udW1iZXIpOwogCWlmICghcHZvaWNlLT51c2UpCiAJCXJldHVybjsKIAlzbmRfYWxpX2NsZWFyX3ZvaWNlcyhjb2RlYywgcHZvaWNlLT5udW1iZXIsIHB2b2ljZS0+bnVtYmVyKTsKQEAgLTExNTMsNyArMTEzOSw3IEBACiAJb3V0bCh2YWwsIEFMSV9SRUcoY29kZWMsIEFMSV9BSU5URU4pKTsKIAlpZiAoZG9fc3RhcnQpCiAJCW91dGwod2hhdCwgQUxJX1JFRyhjb2RlYywgQUxJX1NUQVJUKSk7Ci0Jc25kX2FsaV9wcmludGsoInRyaWdnZXI6IHdoYXQ9JXhoIHdoYXRpPSV4aFxuIiwgd2hhdCwgd2hhdGkpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInRyaWdnZXI6IHdoYXQ9JXhoIHdoYXRpPSV4aFxuIiwgd2hhdCwgd2hhdGkpOwogCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0xMjM5LDcgKzEyMjUsNyBAQAogCXVuc2lnbmVkIGludCBWT0w7CiAJdW5zaWduZWQgaW50IEVDOwogCQotCXNuZF9hbGlfcHJpbnRrKCJwbGF5YmFja19wcmVwYXJlIC4uLlxuIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicGxheWJhY2tfcHJlcGFyZSAuLi5cbiIpOwogCiAJc3Bpbl9sb2NrX2lycSgmY29kZWMtPnJlZ19sb2NrKTsJCiAJCkBAIC0xMjY2LDcgKzEyNTIsNyBAQAogCS8qIHNldCB0YXJnZXQgRVNPIGZvciBjaGFubmVsICovCiAJcHZvaWNlLT5lc28gPSBydW50aW1lLT5idWZmZXJfc2l6ZTsgCiAKLQlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZTogZXNvPSV4aCBjb3VudD0leGhcbiIsCisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicGxheWJhY2tfcHJlcGFyZTogZXNvPSV4aCBjb3VudD0leGhcbiIsCiAJCSAgICAgICBwdm9pY2UtPmVzbywgcHZvaWNlLT5jb3VudCk7CiAKIAkvKiBzZXQgRVNPIHRvIGNhcHR1cmUgZmlyc3QgTUlETFAgaW50ZXJydXB0ICovCkBAIC0xMjc4LDggKzEyNjQsOSBAQAogCVBBTiA9IDA7CiAJVk9MID0gMDsKIAlFQyA9IDA7Ci0Jc25kX2FsaV9wcmludGsoInBsYXliYWNrX3ByZXBhcmU6XG4iKTsKLQlzbmRfYWxpX3ByaW50aygiY2g9JWQsIFJhdGU9JWQgRGVsdGE9JXhoLEdWU0VMPSV4aCxQQU49JXhoLENUUkw9JXhoXG4iLAorCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInBsYXliYWNrX3ByZXBhcmU6XG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsCisJCSJjaD0lZCwgUmF0ZT0lZCBEZWx0YT0leGgsR1ZTRUw9JXhoLFBBTj0leGgsQ1RSTD0leGhcbiIsCiAJCSAgICAgICBwdm9pY2UtPm51bWJlcixydW50aW1lLT5yYXRlLERlbHRhLEdWU0VMLFBBTixDVFJMKTsKIAlzbmRfYWxpX3dyaXRlX3ZvaWNlX3JlZ3MoY29kZWMsCiAJCQkJIHB2b2ljZS0+bnVtYmVyLApAQCAtMTMzMiw3ICsxMzE5LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT5yZWdfbG9jayk7CiAKLQlzbmRfYWxpX3ByaW50aygiYWxpX3ByZXBhcmUuLi5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsaV9wcmVwYXJlLi4uXG4iKTsKIAogCXNuZF9hbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChjb2RlYyxwdm9pY2UtPm51bWJlcik7CiAKQEAgLTEzNTEsMTUgKzEzMzgsMTYgQEAKIAogCQlyYXRlID0gc25kX2FsaV9nZXRfc3BkaWZfaW5fcmF0ZShjb2RlYyk7CiAJCWlmIChyYXRlID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhbGlfY2FwdHVyZV9wcmVhcHJlOiAiCi0JCQkJICAgInNwZGlmIHJhdGUgZGV0ZWN0IGVyciFcbiIpOworCQkJZGV2X3dhcm4oY29kZWMtPmNhcmQtPmRldiwKKwkJCQkgImFsaV9jYXB0dXJlX3ByZWFwcmU6IHNwZGlmIHJhdGUgZGV0ZWN0IGVyciFcbiIpOwogCQkJcmF0ZSA9IDQ4MDAwOwogCQl9CiAJCXNwaW5fbG9ja19pcnEoJmNvZGVjLT5yZWdfbG9jayk7CiAJCWJWYWx1ZSA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMKSk7CiAJCWlmIChiVmFsdWUgJiAweDEwKSB7CiAJCQlvdXRiKGJWYWx1ZSxBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMKSk7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjbGVhciBTUERJRiBwYXJpdHkgZXJyb3IgZmxhZy5cbiIpOworCQkJZGV2X3dhcm4oY29kZWMtPmNhcmQtPmRldiwKKwkJCQkgImNsZWFyIFNQRElGIHBhcml0eSBlcnJvciBmbGFnLlxuIik7CiAJCX0KIAogCQlpZiAocmF0ZSAhPSA0ODAwMCkKQEAgLTE0MTgsNyArMTQwNiw3IEBACiAJb3V0Yihwdm9pY2UtPm51bWJlciwgQUxJX1JFRyhjb2RlYywgQUxJX0dDX0NJUikpOwogCWNzbyA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKIAlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKLQlzbmRfYWxpX3ByaW50aygicGxheWJhY2sgcG9pbnRlciByZXR1cm5lZCBjc289JXhoLlxuIiwgY3NvKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJwbGF5YmFjayBwb2ludGVyIHJldHVybmVkIGNzbz0leGguXG4iLCBjc28pOwogCiAJcmV0dXJuIGNzbzsKIH0KQEAgLTE2ODUsNyArMTY3Myw4IEBACiAJZXJyID0gc25kX3BjbV9uZXcoY29kZWMtPmNhcmQsIGRlc2MtPm5hbWUsIGRldmljZSwKIAkJCSAgZGVzYy0+cGxheWJhY2tfbnVtLCBkZXNjLT5jYXB0dXJlX251bSwgJnBjbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX2FsaV9wY206IGVyciBjYWxsZWQgc25kX3BjbV9uZXcuXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LAorCQkJInNuZF9hbGlfcGNtOiBlcnIgY2FsbGVkIHNuZF9wY21fbmV3LlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCXBjbS0+cHJpdmF0ZV9kYXRhID0gY29kZWM7CkBAIC0xODYxLDcgKzE4NTAsNyBAQAogCQlhYzk3Lm51bSA9IGk7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKGNvZGVjLT5hYzk3X2J1cywgJmFjOTcsICZjb2RlYy0+YWM5N1tpXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCiAJCQkJICAgImFsaSBtaXhlciAlZCBjcmVhdGluZyBlcnJvci5cbiIsIGkpOwogCQkJaWYgKGkgPT0gMCkKIAkJCQlyZXR1cm4gZXJyOwpAQCAtMTk0Nyw4ICsxOTM2LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsaTU0NTE6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTIwMTMsMTAgKzIwMDEsMTAgQEAKIAl1bnNpZ25lZCBjaGFyIHRlbXA7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CiAKLQlzbmRfYWxpX3ByaW50aygiY2hpcCBpbml0aWFsaXppbmcgLi4uIFxuIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiY2hpcCBpbml0aWFsaXppbmcgLi4uXG4iKTsKIAogCWlmIChzbmRfYWxpX3Jlc2V0XzU0NTEoY29kZWMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9jaGlwX2luaXQ6IHJlc2V0IDU0NTEgZXJyb3IuXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2NoaXBfaW5pdDogcmVzZXQgNTQ1MSBlcnJvci5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMDYyLDcgKzIwNTAsNyBAQAogCQkgICAgIEFMSV9SRUcoY29kZWMsIEFMSV9TQ1RSTCkpOwogCX0KIAotCXNuZF9hbGlfcHJpbnRrKCJjaGlwIGluaXRpYWxpemUgc3VjY2VlZC5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImNoaXAgaW5pdGlhbGl6ZSBzdWNjZWVkLlxuIik7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTIwODgsNyArMjA3Niw3IEBACiB7CiAJaW50IGVycjsKIAotCXNuZF9hbGlfcHJpbnRrKCJyZXNvdXJjZXMgYWxsb2NhdGlvbiAuLi5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInJlc291cmNlcyBhbGxvY2F0aW9uIC4uLlxuIik7CiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhjb2RlYy0+cGNpLCAiQUxJIDU0NTEiKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTIwOTYsMTEgKzIwODQsMTEgQEAKIAogCWlmIChyZXF1ZXN0X2lycShjb2RlYy0+cGNpLT5pcnEsIHNuZF9hbGlfY2FyZF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNvZGVjKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVxdWVzdCBpcnEuXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNvZGVjLT5pcnEgPSBjb2RlYy0+cGNpLT5pcnE7Ci0Jc25kX2FsaV9wcmludGsoInJlc291cmNlcyBhbGxvY2F0ZWQuXG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJyZXNvdXJjZXMgYWxsb2NhdGVkLlxuIik7CiAJcmV0dXJuIDA7CiB9CiBzdGF0aWMgaW50IHNuZF9hbGlfZGV2X2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKQEAgLTIxMjUsNyArMjExMyw3IEBACiAKIAkqcl9hbGkgPSBOVUxMOwogCi0Jc25kX2FsaV9wcmludGsoImNyZWF0aW5nIC4uLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjcmVhdGluZyAuLi5cbiIpOwogCiAJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwpAQCAtMjEzNCw4ICsyMTIyLDggQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMxIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMSkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzEpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgIjMxYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzFiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0yMTk5LDQ4ICsyMTg3LDQ2IEBACiAJLyogTTE1MzM6IHNvdXRoYnJpZGdlICovCiAJY29kZWMtPnBjaV9tMTUzMyA9IHBjaV9nZXRfZGV2aWNlKDB4MTBiOSwgMHgxNTMzLCBOVUxMKTsKIAlpZiAoIWNvZGVjLT5wY2lfbTE1MzMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpNTQ1MTogY2Fubm90IGZpbmQgQUxpIDE1MzMgY2hpcC5cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBmaW5kIEFMaSAxNTMzIGNoaXAuXG4iKTsKIAkJc25kX2FsaV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCS8qIE03MTAxOiBwb3dlciBtYW5hZ2VtZW50ICovCiAJY29kZWMtPnBjaV9tNzEwMSA9IHBjaV9nZXRfZGV2aWNlKDB4MTBiOSwgMHg3MTAxLCBOVUxMKTsKIAlpZiAoIWNvZGVjLT5wY2lfbTcxMDEgJiYgY29kZWMtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGk1NDUxOiBjYW5ub3QgZmluZCBBTGkgNzEwMSBjaGlwLlxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGZpbmQgQUxpIDcxMDEgY2hpcC5cbiIpOwogCQlzbmRfYWxpX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzbmRfYWxpX3ByaW50aygic25kX2RldmljZV9uZXcgaXMgY2FsbGVkLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJzbmRfZGV2aWNlX25ldyBpcyBjYWxsZWQuXG4iKTsKIAllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNvZGVjLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfYWxpX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCS8qIGluaXRpYWxpc2Ugc3ludGggdm9pY2VzKi8KIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspCiAJCWNvZGVjLT5zeW50aC52b2ljZXNbaV0ubnVtYmVyID0gaTsKIAogCWVyciA9IHNuZF9hbGlfY2hpcF9pbml0KGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGkgY3JlYXRlOiBjaGlwIGluaXQgZXJyb3IuXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJhbGkgY3JlYXRlOiBjaGlwIGluaXQgZXJyb3IuXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAljb2RlYy0+aW1hZ2UgPSBrbWFsbG9jKHNpemVvZigqY29kZWMtPmltYWdlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb2RlYy0+aW1hZ2UpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBhbGxvY2F0ZSBhcG0gYnVmZmVyXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CiAjZW5kaWYKIAogCXNuZF9hbGlfZW5hYmxlX2FkZHJlc3NfaW50ZXJydXB0KGNvZGVjKTsKIAljb2RlYy0+aHdfaW5pdGlhbGl6ZWQgPSAxOwogCiAJKnJfYWxpID0gY29kZWM7Ci0Jc25kX2FsaV9wcmludGsoImNyZWF0ZWQuXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgImNyZWF0ZWQuXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI1MSw5ICsyMjM3LDkgQEAKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWM7CiAJaW50IGVycjsKIAotCXNuZF9hbGlfcHJpbnRrKCJwcm9iZSAuLi5cbiIpOworCWRldl9kYmcoJnBjaS0+ZGV2LCAicHJvYmUgLi4uXG4iKTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMjYyLDEyICsyMjQ4LDEyIEBACiAJCWdvdG8gZXJyb3I7CiAJY2FyZC0+cHJpdmF0ZV9kYXRhID0gY29kZWM7CiAKLQlzbmRfYWxpX3ByaW50aygibWl4ZXIgYnVpbGRpbmcgLi4uXG4iKTsKKwlkZXZfZGJnKCZwY2ktPmRldiwgIm1peGVyIGJ1aWxkaW5nIC4uLlxuIik7CiAJZXJyID0gc25kX2FsaV9taXhlcihjb2RlYyk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CiAJCi0Jc25kX2FsaV9wcmludGsoInBjbSBidWlsZGluZyAuLi5cbiIpOworCWRldl9kYmcoJnBjaS0+ZGV2LCAicGNtIGJ1aWxkaW5nIC4uLlxuIik7CiAJZXJyID0gc25kX2FsaV9idWlsZF9wY21zKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKQEAgLTIyODAsNyArMjI2Niw3IEBACiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIGNvZGVjLT5wb3J0LCBjb2RlYy0+aXJxKTsKIAotCXNuZF9hbGlfcHJpbnRrKCJyZWdpc3RlciBjYXJkLlxuIik7CisJZGV2X2RiZygmcGNpLT5kZXYsICJyZWdpc3RlciBjYXJkLlxuIik7CiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggNTkxZWZiNi4uY2M5YTE1YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtODcsMTkgKzg3LDggQEAKICNkZWZpbmUgUExBWUJBQ0tfQkxPQ0tfQ09VTlRFUgkweDlBCiAjZGVmaW5lIFJFQ09SRF9CTE9DS19DT1VOVEVSCTB4OUIKIAotI2RlZmluZSBERUJVR19DQUxMUwkwCiAjZGVmaW5lIERFQlVHX1BMQVlfUkVDCTAKIAotI2lmIERFQlVHX0NBTExTCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbHMoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNkZWZpbmUgc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKSBwcmludGsoS0VSTl9FUlIgIi0tPiAlc1xuIiwgX19mdW5jX18pCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCkgcHJpbnRrKEtFUk5fRVJSICI8LS0gJXNcbiIsIF9fZnVuY19fKQotI2Vsc2UKLSNkZWZpbmUgc25kX2FsczMwMF9kYmdjYWxscyhmb3JtYXQsIGFyZ3MuLi4pCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCkKLSNkZWZpbmUgc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKQotI2VuZGlmCi0KICNpZiBERUJVR19QTEFZX1JFQwogI2RlZmluZSBzbmRfYWxzMzAwX2RiZ3BsYXkoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0LCAjI2FyZ3MpCiAjZWxzZQpAQCAtMTc3LDcgKzE2Niw2IEBACiBzdGF0aWMgdm9pZCBzbmRfYWxzMzAwX3NldF9pcnFfZmxhZyhzdHJ1Y3Qgc25kX2FsczMwMCAqY2hpcCwgaW50IGNtZCkKIHsKIAl1MzIgdG1wID0gc25kX2FsczMwMF9nY3JfcmVhZChjaGlwLT5wb3J0LCBNSVNDX0NPTlRST0wpOwotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAKIAkvKiBib29sZWFuIFhPUiBjaGVjaywgc2luY2Ugb2xkIHZzLiBuZXcgaGFyZHdhcmUgaGF2ZQogCSAgIGRpcmVjdGx5IHJldmVyc2VkIGJpdCBzZXR0aW5nIGZvciBFTkFCTEUgYW5kIERJU0FCTEUuCkBAIC0xODgsMTkgKzE3NiwxNiBAQAogCWVsc2UKIAkJdG1wICY9IH5JUlFfU0VUX0JJVDsKIAlzbmRfYWxzMzAwX2djcl93cml0ZShjaGlwLT5wb3J0LCBNSVNDX0NPTlRST0wsIHRtcCk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGludCBzbmRfYWxzMzAwX2ZyZWUoc3RydWN0IHNuZF9hbHMzMDAgKmNoaXApCiB7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfYWxzMzAwX3NldF9pcnFfZmxhZyhjaGlwLCBJUlFfRElTQUJMRSk7CiAJaWYgKGNoaXAtPmlycSA+PSAwKQogCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKIAlrZnJlZShjaGlwKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0yODAsOSArMjY1LDcgQEAKIAogc3RhdGljIHZvaWQgc25kX2FsczMwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfYWxzMzAwX2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCkBAIC0zMzAsMTQgKzMxMywxMiBAQAogCQkucmVhZCA9IHNuZF9hbHMzMDBfYWM5N19yZWFkLAogCX07CiAKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNoaXAtPmNhcmQsIDAsICZvcHMsIE5VTEwsICZidXMpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKIAltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CiAJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOwogCi0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gc25kX2FjOTdfbWl4ZXIoYnVzLCAmYWM5NywgJmNoaXAtPmFjOTcpOwogfQogCkBAIC0zOTUsMTMgKzM3NiwxMSBAQAogCiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF9hbHMzMDBfcGxheWJhY2tfaHc7CiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAlkYXRhLT5jb250cm9sX3JlZ2lzdGVyID0gUExBWUJBQ0tfQ09OVFJPTDsKIAlkYXRhLT5ibG9ja19jb3VudGVyX3JlZ2lzdGVyID0gUExBWUJBQ0tfQkxPQ0tfQ09VTlRFUjsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00MTEsMTEgKzM5MCw5IEBACiAJc3RydWN0IHNuZF9hbHMzMDBfc3Vic3RyZWFtX2RhdGEgKmRhdGE7CiAKIAlkYXRhID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlrZnJlZShkYXRhKTsKIAljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOwogCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00MjgsMTMgKzQwNSwxMSBAQAogCiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCXJ1bnRpbWUtPmh3ID0gc25kX2FsczMwMF9jYXB0dXJlX2h3OwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGRhdGE7CiAJZGF0YS0+Y29udHJvbF9yZWdpc3RlciA9IFJFQ09SRF9DT05UUk9MOwogCWRhdGEtPmJsb2NrX2NvdW50ZXJfcmVnaXN0ZXIgPSBSRUNPUkRfQkxPQ0tfQ09VTlRFUjsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00NDQsMTEgKzQxOSw5IEBACiAJc3RydWN0IHNuZF9hbHMzMDBfc3Vic3RyZWFtX2RhdGEgKmRhdGE7CiAKIAlkYXRhID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlrZnJlZShkYXRhKTsKIAljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CiAJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ3Miw3ICs0NDUsNiBAQAogCXVuc2lnbmVkIHNob3J0IHBlcmlvZF9ieXRlcyA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogCXVuc2lnbmVkIHNob3J0IGJ1ZmZlcl9ieXRlcyA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwogCQotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCXRtcCA9IHNuZF9hbHMzMDBfZ2NyX3JlYWQoY2hpcC0+cG9ydCwgUExBWUJBQ0tfQ09OVFJPTCk7CiAJdG1wICY9IH5UUkFOU0ZFUl9TVEFSVDsKQEAgLTQ5MSw3ICs0NjMsNiBAQAogCXNuZF9hbHMzMDBfZ2NyX3dyaXRlKGNoaXAtPnBvcnQsIFBMQVlCQUNLX0VORCwKIAkJCQkJcnVudGltZS0+ZG1hX2FkZHIgKyBidWZmZXJfYnl0ZXMgLSAxKTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC01MDMsNyArNDc0LDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKIAl1bnNpZ25lZCBzaG9ydCBidWZmZXJfYnl0ZXMgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCXRtcCA9IHNuZF9hbHMzMDBfZ2NyX3JlYWQoY2hpcC0+cG9ydCwgUkVDT1JEX0NPTlRST0wpOwogCXRtcCAmPSB+VFJBTlNGRVJfU1RBUlQ7CkBAIC01MjIsNyArNDkyLDYgQEAKIAlzbmRfYWxzMzAwX2djcl93cml0ZShjaGlwLT5wb3J0LCBSRUNPUkRfRU5ELAogCQkJCQlydW50aW1lLT5kbWFfYWRkciArIGJ1ZmZlcl9ieXRlcyAtIDEpOwogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzNyw3ICs1MDYsNiBAQAogCWRhdGEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlyZWcgPSBkYXRhLT5jb250cm9sX3JlZ2lzdGVyOwogCi0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC01NjgsNyArNTM2LDYgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU4Miw3ICs1NDksNiBAQAogCWRhdGEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKIAkKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCWN1cnJlbnRfcHRyID0gKHUxNikgc25kX2FsczMwMF9nY3JfcmVhZChjaGlwLT5wb3J0LAogCQkJCQlkYXRhLT5ibG9ja19jb3VudGVyX3JlZ2lzdGVyKSArIDQ7CkBAIC01OTUsNyArNTYxLDYgQEAKIAlpZiAoZGF0YS0+cGVyaW9kX2ZsaXBmbG9wID09IDApCiAJCWN1cnJlbnRfcHRyICs9IHBlcmlvZF9ieXRlczsKIAlzbmRfYWxzMzAwX2RiZ3BsYXkoIlBvaW50ZXIgKGJ5dGVzKTogJWRcbiIsIGN1cnJlbnRfcHRyKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJyZW50X3B0cik7CiB9CiAKQEAgLTYyNiw3ICs1OTEsNiBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycjsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkFMUzMwMCIsIDAsIDEsIDEsICZwY20pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNjQzLDcgKzYwNyw2IEBACiAJLyogcHJlLWFsbG9jYXRpb24gb2YgYnVmZmVycyAqLwogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCiAJc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC02NTIsNyArNjE1LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB0bXA7CiAJCi0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAljaGlwLT5yZXZpc2lvbiA9IChzbmRfYWxzMzAwX2djcl9yZWFkKGNoaXAtPnBvcnQsIE1JU0NfQ09OVFJPTCkgPj4gMTYpCiAJCQkJCQkJCSYgMHgwMDAwMDAwRjsKQEAgLTY3OSw3ICs2NDEsNiBAQAogCXNuZF9hbHMzMDBfZ2NyX3dyaXRlKGNoaXAtPnBvcnQsIFBMQVlCQUNLX0NPTlRST0wsCiAJCQl0bXAgJiB+VFJBTlNGRVJfU1RBUlQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGludCBzbmRfYWxzMzAwX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCkBAIC02OTUsMTMgKzY1NiwxMiBAQAogCX07CiAJKnJjaGlwID0gTlVMTDsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCB8fAogCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzZXR0aW5nIDI4Yml0IERNQSBtYXNrXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlcnJvciBzZXR0aW5nIDI4Yml0IERNQSBtYXNrXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtNzMzLDcgKzY5Myw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGlycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2FsczMwMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTc0NCwxMyArNzA0LDEzIEBACiAKIAllcnIgPSBzbmRfYWxzMzAwX2FjOTcoY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBjcmVhdGUgYWM5N1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBhYzk3XG4iKTsKIAkJc25kX2FsczMwMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICgoZXJyID0gc25kX2FsczMwMF9uZXdfcGNtKGNoaXApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBjcmVhdGUgUENNXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb3VsZCBub3QgY3JlYXRlIFBDTVxuIik7CiAJCXNuZF9hbHMzMDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC03NjEsMTAgKzcyMSw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC03OTQsOCArNzUxLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczMwMDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtODI5LDcgKzc4NSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCBmZmM4MjFiLi5iNzUxYzM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTU3OCw3ICs1NzgsNyBAQAogCQlzbmRfYWxzNGtfaW9iYXNlX3JlYWRiKGNoaXAtPmFsdF9wb3J0LAogCQkJCQlBTFM0S19JT0JfMTZfQUNLX0ZPUl9DUjFFKTsKIAotCS8qIHByaW50ayhLRVJOX0lORk8gImFsczQwMDA6IGlycSAweCUwNHggMHglMDR4XG4iLAorCS8qIGRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWxzNDAwMDogaXJxIDB4JTA0eCAweCUwNHhcbiIsCiAJCQkJCSBwY2lfaXJxc3RhdHVzLCBzYl9pcnFzdGF0dXMpOyAqLwogCiAJLyogb25seSBhY2sgdGhlIHRoaW5ncyB3ZSBhY3R1YWxseSBoYW5kbGVkIGFib3ZlICovCkBAIC03OTEsMTMgKzc5MSwxMyBAQAogCX0KIAogCWlmICghcikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbHM0MDAwOiBjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CisJCWRldl93YXJuKCZhY2FyZC0+cGNpLT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJYWNhcmQtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycigmYWNhcmQtPnBjaS0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC04NzMsNyArODczLDcgQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI0IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKCZwY2ktPmRldiwgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtODg4LDkgKzg4OCw5IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJX0NPTU1BTkQsIHdvcmQgfCBQQ0lfQ09NTUFORF9JTyk7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAkKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIAotCQkJICAgICAgc2l6ZW9mKCphY2FyZCkgLyogcHJpdmF0ZV9kYXRhOiBhY2FyZCAqLywKLQkJCSAgICAgICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqYWNhcmQpIC8qIHByaXZhdGVfZGF0YTogYWNhcmQgKi8sCisJCQkgICAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2kpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKQEAgLTkyMCw3ICs5MjAsNiBAQAogCiAJY2hpcC0+cGNpID0gcGNpOwogCWNoaXAtPmFsdF9wb3J0ID0gaW9iYXNlOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCXNuZF9hbHM0MDAwX2NvbmZpZ3VyZShjaGlwKTsKIApAQCAtOTM0LDcgKzkzMyw3IEBACiAJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQlNUFU0MDFfSU5GT19JUlFfSE9PSywKIAkJCQkJLTEsICZjaGlwLT5ybWlkaSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKKwkJZGV2X2VycigmcGNpLT5kZXYsICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCiAJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzMwX01JRElfREFUQSk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC05NTUsNyArOTU0LDcgQEAKIAkJCQlpb2Jhc2UgKyBBTFM0S19JT0JfMTBfQURMSUJfQUREUjAsCiAJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzEyX0FETElCX0FERFIyLAogCQkJICAgIE9QTDNfSFdfQVVUTywgMSwgJm9wbDMpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IG5vIE9QTCBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAorCQlkZXZfZXJyKCZwY2ktPmRldiwgIm5vIE9QTCBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAogCQkJICAgaW9iYXNlICsgQUxTNEtfSU9CXzEwX0FETElCX0FERFIwLAogCQkJICAgaW9iYXNlICsgQUxTNEtfSU9CXzEyX0FETElCX0FERFIyKTsKIAl9IGVsc2UgewpAQCAtMTAxNSw4ICsxMDE0LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCmluZGV4IDVmMmFjZDMuLjkwMWM5NDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwpAQCAtMTI1MywxMSArMTI1MywxMiBAQAogCQkJbnVtX291dHN0cmVhbXMsCW51bV9pbnN0cmVhbXMsICZwY20pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCiAJLyogcG9pbnRlciB0byBvcHMgc3RydWN0IGlzIHN0b3JlZCwgZG9udCBjaGFuZ2Ugb3BzIGFmdGVyd2FyZHMhICovCi0JCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCi0JCQkJJnNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19tbWFwX29wcyk7Ci0JCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKLQkJCQkmc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfbW1hcF9vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkmc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX21tYXBfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJCQkmc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfbW1hcF9vcHMpOwogCiAJcGNtLT5wcml2YXRlX2RhdGEgPSBhc2locGk7CiAJcGNtLT5pbmZvX2ZsYWdzID0gMDsKQEAgLTI4MjcsMTcgKzI4MjgsMTMgQEAKIAlocGkgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJYWRhcHRlcl9pbmRleCA9IGhwaS0+YWRhcHRlci0+aW5kZXg7CiAJLyogZmlyc3QgdHJ5IHRvIGdpdmUgdGhlIGNhcmQgdGhlIHNhbWUgaW5kZXggYXMgaXRzIGhhcmR3YXJlIGluZGV4ICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGFkYXB0ZXJfaW5kZXgsCi0JCQkgICAgICBpZFthZGFwdGVyX2luZGV4XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FzaWhwaSksCi0JCQkgICAgICAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2lfZGV2LT5kZXYsIGFkYXB0ZXJfaW5kZXgsIGlkW2FkYXB0ZXJfaW5kZXhdLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXNpaHBpKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCS8qIGlmIHRoYXQgZmFpbHMsIHRyeSB0aGUgZGVmYXVsdCBpbmRleD09bmV4dCBhdmFpbGFibGUgKi8KLQkJZXJyID0KLQkJICAgIHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLAotCQkJCSAgICBUSElTX01PRFVMRSwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9hc2locGkpLAotCQkJCSAgICAmY2FyZCk7CisJCWVyciA9IHNuZF9jYXJkX25ldygmcGNpX2Rldi0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLAorCQkJCSAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FzaWhwaSksCisJCQkJICAgJmNhcmQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCkBAIC0yODQ1LDggKzI4NDIsNiBAQAogCQkJYWRhcHRlcl9pbmRleCwgY2FyZC0+bnVtYmVyKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2lfZGV2LT5kZXYpOwotCiAJYXNpaHBpID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFzaWhwaS0+Y2FyZCA9IGNhcmQ7CiAJYXNpaHBpLT5wY2kgPSBwY2lfZGV2OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IGY2ZGVjM2UuLmFlMDdiNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCiAJd2hpbGUgKGF0aWl4cF9yZWFkKGNoaXAsIFBIWVNfT1VUX0FERFIpICYgQVRJX1JFR19QSFlTX09VVF9BRERSX0VOKSB7CiAJCWlmICghIHRpbWVvdXQtLSkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cDogY29kZWMgYWNxdWlyZSB0aW1lb3V0XG4iKTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjIGFjcXVpcmUgdGltZW91dFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCXVkZWxheSgxKTsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCX0gd2hpbGUgKC0tdGltZW91dCk7CiAJLyogdGltZSBvdXQgbWF5IGhhcHBlbiBkdXJpbmcgcmVzZXQgKi8KIAlpZiAocmVnIDwgMHg3YykKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cDogY29kZWMgcmVhZCB0aW1lb3V0IChyZWcgJXgpXG4iLCByZWcpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZWFkIHRpbWVvdXQgKHJlZyAleClcbiIsIHJlZyk7CiAJcmV0dXJuIDB4ZmZmZjsKIH0KIApAQCAtNTIzLDcgKzUyMyw3IEBACiAJCW1kZWxheSgxKTsKIAkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1JFU0VULCBBVElfUkVHX0NNRF9BQ19SRVNFVCk7CiAJCWlmICghLS10aW1lb3V0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHA6IGNvZGVjIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZXNldCB0aW1lb3V0XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTY3LDkgKzU2Nyw4IEBACiAKIAlxID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBhdGlpeHBfcXVpcmtzKTsKIAlpZiAocSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8KLQkJCSAgICAiQXRpaXhwIHF1aXJrIGZvciAlcy4gIEZvcmNpbmcgY29kZWMgJWRcbiIsCi0JCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHEpLCBxLT52YWx1ZSk7CisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiYXRpaXhwIHF1aXJrIGZvciAlcy4gIEZvcmNpbmcgY29kZWMgJWRcbiIsCisJCQlzbmRfcGNpX3F1aXJrX25hbWUocSksIHEtPnZhbHVlKTsKIAkJcmV0dXJuIHEtPnZhbHVlOwogCX0KIAkvKiB0aGlzIGhhcmR3YXJlIGRvZXNuJ3QgbmVlZCB3b3JrYXJvdW5kcy4gIFByb2JlIGZvciBjb2RlYyAqLwpAQCAtNjAwLDcgKzU5OSw3IEBACiAJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwgMCk7IC8qIGRpc2FibGUgaXJxcyAqLwogCiAJaWYgKChjaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyAmIEFMTF9DT0RFQ19OT1RfUkVBRFkpID09IEFMTF9DT0RFQ19OT1RfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBkZXRlY3RlZCFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGRldGVjdGVkIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCXJldHVybiAwOwpAQCAtNjc2LDcgKzY3NSw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBjdXJwdHIpOwogCX0KLQlzbmRfcHJpbnRkKCJhdGlpeHA6IGludmFsaWQgRE1BIHBvaW50ZXIgcmVhZCAweCV4IChidWY9JXgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBETUEgcG9pbnRlciByZWFkIDB4JXggKGJ1Zj0leClcbiIsCiAJCSAgIHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKSwgZG1hLT5idWZfYWRkcik7CiAJcmV0dXJuIDA7CiB9CkBAIC02ODgsNyArNjg3LDcgQEAKIHsKIAlpZiAoISBkbWEtPnN1YnN0cmVhbSB8fCAhIGRtYS0+cnVubmluZykKIAkJcmV0dXJuOwotCXNuZF9wcmludGRkKCJhdGlpeHA6IFhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrKGRtYS0+c3Vic3RyZWFtKTsKIAlzbmRfcGNtX3N0b3AoZG1hLT5zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKIAlzbmRfcGNtX3N0cmVhbV91bmxvY2soZG1hLT5zdWJzdHJlYW0pOwpAQCAtMTQ1MywxNCArMTQ1MiwxNSBAQAogCQkJYWM5Ny5zY2FwcyB8PSBBQzk3X1NDQVBfTk9fU1BESUY7CiAJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3W2ldKSkgPCAwKSB7CiAJCQljaGlwLT5hYzk3W2ldID0gTlVMTDsgLyogdG8gYmUgc3VyZSAqLwotCQkJc25kX3ByaW50ZGQoImF0aWl4cDogY29kZWMgJWQgbm90IGF2YWlsYWJsZSBmb3IgYXVkaW9cbiIsIGkpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjICVkIG5vdCBhdmFpbGFibGUgZm9yIGF1ZGlvXG4iLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWNvZGVjX2NvdW50Kys7CiAJfQogCiAJaWYgKCEgY29kZWNfY291bnQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBhdmFpbGFibGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTUxMSw4ICsxNTExLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImF0aWl4cDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTYzNywxNCArMTYzNiwxNCBAQAogCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5yZW1hcF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXRpaXhwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xNjU3LDggKzE2NTYsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2NoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpAQCAtMTY3MSw3ICsxNjY4LDcgQEAKIAlzdHJ1Y3QgYXRpaXhwICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCmluZGV4IDI4OTU2M2UuLmI5ZGM5NmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAJd2hpbGUgKGF0aWl4cF9yZWFkKGNoaXAsIFBIWVNfT1VUX0FERFIpICYgQVRJX1JFR19QSFlTX09VVF9BRERSX0VOKSB7CiAJCWlmICghIHRpbWVvdXQtLSkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cC1tb2RlbTogY29kZWMgYWNxdWlyZSB0aW1lb3V0XG4iKTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjIGFjcXVpcmUgdGltZW91dFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCXVkZWxheSgxKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCX0gd2hpbGUgKC0tdGltZW91dCk7CiAJLyogdGltZSBvdXQgbWF5IGhhcHBlbiBkdXJpbmcgcmVzZXQgKi8KIAlpZiAocmVnIDwgMHg3YykKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cC1tb2RlbTogY29kZWMgcmVhZCB0aW1lb3V0IChyZWcgJXgpXG4iLCByZWcpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZWFkIHRpbWVvdXQgKHJlZyAleClcbiIsIHJlZyk7CiAJcmV0dXJuIDB4ZmZmZjsKIH0KIApAQCAtNDk5LDcgKzQ5OSw3IEBACiAJCW1zbGVlcCgxKTsKIAkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1JFU0VULCBBVElfUkVHX0NNRF9BQ19SRVNFVCk7CiAJCWlmICghLS10aW1lb3V0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHAtbW9kZW06IGNvZGVjIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyByZXNldCB0aW1lb3V0XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTUzLDcgKzU1Myw3IEBACiAJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwgMCk7IC8qIGRpc2FibGUgaXJxcyAqLwogCiAJaWYgKChjaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyAmIEFMTF9DT0RFQ19OT1RfUkVBRFkpID09IEFMTF9DT0RFQ19OT1RfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwLW1vZGVtOiBubyBjb2RlYyBkZXRlY3RlZCFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGRldGVjdGVkIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCXJldHVybiAwOwpAQCAtNjI0LDcgKzYyNCw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBjdXJwdHIpOwogCX0KLQlzbmRfcHJpbnRkKCJhdGlpeHAtbW9kZW06IGludmFsaWQgRE1BIHBvaW50ZXIgcmVhZCAweCV4IChidWY9JXgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBETUEgcG9pbnRlciByZWFkIDB4JXggKGJ1Zj0leClcbiIsCiAJCSAgIHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKSwgZG1hLT5idWZfYWRkcik7CiAJcmV0dXJuIDA7CiB9CkBAIC02MzcsNyArNjM3LDcgQEAKIHsKIAlpZiAoISBkbWEtPnN1YnN0cmVhbSB8fCAhIGRtYS0+cnVubmluZykKIAkJcmV0dXJuOwotCXNuZF9wcmludGRkKCJhdGlpeHAtbW9kZW06IFhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrKGRtYS0+c3Vic3RyZWFtKTsKIAlzbmRfcGNtX3N0b3AoZG1hLT5zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKIAlzbmRfcGNtX3N0cmVhbV91bmxvY2soZG1hLT5zdWJzdHJlYW0pOwpAQCAtMTA5OCwxNCArMTA5OCwxNSBAQAogCQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU8gfCBBQzk3X1NDQVBfUE9XRVJfU0FWRTsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKIAkJCWNoaXAtPmFjOTdbaV0gPSBOVUxMOyAvKiB0byBiZSBzdXJlICovCi0JCQlzbmRfcHJpbnRkZCgiYXRpaXhwLW1vZGVtOiBjb2RlYyAlZCBub3QgYXZhaWxhYmxlIGZvciBtb2RlbVxuIiwgaSk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWMgJWQgbm90IGF2YWlsYWJsZSBmb3IgbW9kZW1cbiIsIGkpOwogCQkJY29udGludWU7CiAJCX0KIAkJY29kZWNfY291bnQrKzsKIAl9CiAKIAlpZiAoISBjb2RlY19jb3VudCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHAtbW9kZW06IG5vIGNvZGVjIGF2YWlsYWJsZVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibm8gY29kZWMgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMTUwLDggKzExNTEsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRpaXhwLW1vZGVtOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMjYyLDE0ICsxMjYyLDE0IEBACiAJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWNoaXAtPnJlbWFwX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAwKTsKIAlpZiAoY2hpcC0+cmVtYXBfYWRkciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKIAkJc25kX2F0aWl4cF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hdGlpeHBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2F0aWl4cF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEyODIsOCArMTI4Miw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjk2LDcgKzEyOTQsNyBAQAogCXN0cnVjdCBhdGlpeHBfbW9kZW0gKmNoaXA7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYwppbmRleCA3MDU5ZGQ2Li5hZmIxYjQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKQEAgLTIxMSw4ICsyMTEsNiBAQAogCQlnb3RvIGFsbG9jX291dDsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCiAJcmV0dXJuIDA7CkBAIC0yNTAsNyArMjQ4LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCS8vICgyKQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKaW5kZXggMjkyNTIyMC4uMTIwZDBkMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCisrKyBiL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLyogY2hlY2sgUENJIGF2YWlsYWJpbGl0eSAoMzJiaXQgRE1BKSAqLwogCWlmICgocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgfHwKIAkgICAgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IEltcG9zc2libGUgdG8gc2V0IDMyYml0IG1hc2sgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJJbXBvc3NpYmxlIHRvIHNldCAzMmJpdCBtYXNrIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTI5MCw3ICsyOTAsNyBAQAogCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKSk7CiAKIAlpZiAoY2hpcC0+aW9iYXNlX3ZpcnQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImF3MjogdW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiIpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaSk7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlrZnJlZShjaGlwKTsKQEAgLTMwMiw3ICszMDIsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXcyX3NhYTcxNDZfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImF3MjogQ2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAKIAkJaW91bm1hcChjaGlwLT5pb2Jhc2VfdmlydCk7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKQEAgLTMyMiwxMiArMzIyLDEwIEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwogCSpyY2hpcCA9IGNoaXA7CiAKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJBdWRpb3dlcmsgMiBzb3VuZCBjYXJkIChzYWE3MTQ2IGNoaXBzZXQpIGRldGVjdGVkIGFuZCAiCi0JICAgICAgICJtYW5hZ2VkXG4iKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiQXVkaW93ZXJrIDIgc291bmQgY2FyZCAoc2FhNzE0NiBjaGlwc2V0KSBkZXRlY3RlZCBhbmQgbWFuYWdlZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0OSw3ICszNDcsOCBAQAogCX0KIAogCS8qICgyKSBDcmVhdGUgY2FyZCBpbnN0YW5jZSAqLwotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zOTksNyArMzk4LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiYXcyOiBQbGF5YmFja19vcGVuXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICJQbGF5YmFja19vcGVuXG4iKTsKIAlydW50aW1lLT5odyA9IHNuZF9hdzJfcGxheWJhY2tfaHc7CiAJcmV0dXJuIDA7CiB9CkBAIC00MTUsNyArNDE0LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiYXcyOiBDYXB0dXJlX29wZW5cbiIpOworCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIkNhcHR1cmVfb3BlblxuIik7CiAJcnVudGltZS0+aHcgPSBzbmRfYXcyX2NhcHR1cmVfaHc7CiAJcmV0dXJuIDA7CiB9CkBAIC02MDMsNyArNjAyLDcgQEAKIAllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQXVkaW93ZXJrMiBhbmFsb2cgcGxheWJhY2siLCAwLCAxLCAwLAogCQkJICAmcGNtX3BsYXliYWNrX2FuYSk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbmV3IGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02MzMsMTQgKzYzMiwxNSBAQAogCQkJCQkJICAgIChjaGlwLT5wY2kpLAogCQkJCQkJICAgIDY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgImF3Mjogc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCAiCi0JCSAgICAgICAiZXJyb3IgKDB4JVgpXG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsIGVycm9yICgweCVYKVxuIiwKKwkJCWVycik7CiAKIAllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQXVkaW93ZXJrMiBkaWdpdGFsIHBsYXliYWNrIiwgMSwgMSwgMCwKIAkJCSAgJnBjbV9wbGF5YmFja19udW0pOwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbmV3IGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCS8qIENyZWF0aW9uIG9rICovCkBAIC02NjksMTcgKzY2OSwxNSBAQAogCQkJCQkJICAgIChjaGlwLT5wY2kpLAogCQkJCQkJICAgIDY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJhdzI6IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgIgotCQkgICAgICAgIigweCVYKVxuIiwgZXJyKTsKLQotCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgKDB4JVgpXG4iLAorCQkJZXJyKTsKIAogCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBdWRpb3dlcmsyIGNhcHR1cmUiLCAyLCAwLCAxLAogCQkJICAmcGNtX2NhcHR1cmUpOwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbmV3IGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC03MDksMTUgKzcwNywxNSBAQAogCQkJCQkJICAgIChjaGlwLT5wY2kpLAogCQkJCQkJICAgIDY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJhdzI6IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgIgotCQkgICAgICAgIigweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkic25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCBlcnJvciAoMHglWClcbiIsCisJCQllcnIpOwogCiAKIAkvKiBDcmVhdGUgY29udHJvbCAqLwogCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmYXcyX2NvbnRyb2wsIGNoaXApKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImF3Mjogc25kX2N0bF9hZGQgZXJyb3IgKDB4JVgpXG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInNuZF9jdGxfYWRkIGVycm9yICgweCVYKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdzIvYXcyLXNhYTcxNDYuYyBiL3NvdW5kL3BjaS9hdzIvYXcyLXNhYTcxNDYuYwppbmRleCA0NDM5NjM2Li42ZDI0ZTk1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXcyL2F3Mi1zYWE3MTQ2LmMKKysrIGIvc291bmQvcGNpL2F3Mi9hdzItc2FhNzE0Ni5jCkBAIC0yMDQsOCArMjA0LDcgQEAKIAkJLyogRGVmaW5lIHVwcGVyIGxpbWl0IGZvciBETUEgYWNjZXNzICovCiAJCVdSSVRFUkVHKGRtYV9hZGRyICsgYnVmZmVyX3NpemUsIFByb3RBMV9vdXQpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImF3Mjogc25kX2F3Ml9zYWE3MTQ2X3BjbV9pbml0X3BsYXliYWNrOiAiCisJCXByX2VycigiYXcyOiBzbmRfYXcyX3NhYTcxNDZfcGNtX2luaXRfcGxheWJhY2s6ICIKIAkJICAgICAgICJTdWJzdHJlYW0gbnVtYmVyIGlzIG5vdCAwIG9yIDEgLT4gbm90IG1hbmFnZWRcbiIpOwogCX0KIH0KQEAgLTI1MSw4ICsyNTAsNyBAQAogCQkvKiBEZWZpbmUgdXBwZXIgbGltaXQgZm9yIERNQSBhY2Nlc3MgICovCiAJCVdSSVRFUkVHKGRtYV9hZGRyICsgYnVmZmVyX3NpemUsIFByb3RBMV9pbik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYXcyOiBzbmRfYXcyX3NhYTcxNDZfcGNtX2luaXRfY2FwdHVyZTogIgorCQlwcl9lcnIoImF3Mjogc25kX2F3Ml9zYWE3MTQ2X3BjbV9pbml0X2NhcHR1cmU6ICIKIAkJICAgICAgICJTdWJzdHJlYW0gbnVtYmVyIGlzIG5vdCAwIC0+IG5vdCBtYW5hZ2VkXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwppbmRleCAxYWVmNzEyLi5jOTIxNmMwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTIzOCw2MSArMjM4LDYgQEAKICAgICAyPi9kZXYvbnVsbAogKi8KIAotI2RlZmluZSBERUJVR19NSVNDCTAKLSNkZWZpbmUgREVCVUdfQ0FMTFMJMAotI2RlZmluZSBERUJVR19NSVhFUgkwCi0jZGVmaW5lIERFQlVHX0NPREVDCTAKLSNkZWZpbmUgREVCVUdfVElNRVIJMAotI2RlZmluZSBERUJVR19HQU1FCTAKLSNkZWZpbmUgREVCVUdfUE0JMAotI2RlZmluZSBNSVhFUl9URVNUSU5HCTAKLQotI2lmIERFQlVHX01JU0MKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWlzYyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWlzYyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX0NBTExTCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxzKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCwgIyNhcmdzKQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKSBwcmludGsoS0VSTl9ERUJVRyAiLS0+ICVzXG4iLCBfX2Z1bmNfXykKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCkgcHJpbnRrKEtFUk5fREVCVUcgIjwtLSAlc1xuIiwgX19mdW5jX18pCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxscyhmb3JtYXQsIGFyZ3MuLi4pCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpCi0jZW5kaWYKLQotI2lmIERFQlVHX01JWEVSCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ21peGVyKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdtaXhlcihmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX0NPREVDCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NvZGVjKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjb2RlYyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX01JU0MKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJndGltZXIoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3RpbWVyKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWYgREVCVUdfR0FNRQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdnYW1lKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdnYW1lKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWYgREVCVUdfUE0KLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJncG0oZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3BtKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLwogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBWkYzMzI4IHNvdW5kY2FyZC4iKTsKQEAgLTQ3NSw2ICs0MjAsMTIgQEAKIAlyZXR1cm4gaW5iKGNoaXAtPmN0cmxfaW8gKyByZWcpOwogfQogCitzdGF0aWMgaW5saW5lIHUxNgorc25kX2F6ZjMzMjhfY3RybF9pbncoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLCB1bnNpZ25lZCByZWcpCit7CisJcmV0dXJuIGludyhjaGlwLT5jdHJsX2lvICsgcmVnKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkCiBzbmRfYXpmMzMyOF9jdHJsX291dHcoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLCB1bnNpZ25lZCByZWcsIHUxNiB2YWx1ZSkKIHsKQEAgLTU3OCwxMSArNTI5LDEyIEBACiAjaWZkZWYgQVpGX1VTRV9BQzk3X0xBWUVSCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQodW5zaWduZWQgc2hvcnQgcmVnLCBjb25zdCBjaGFyICptb2RlKQorc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCByZWcsIGNvbnN0IGNoYXIgKm1vZGUpCiB7CiAJLyogbmVlZCB0byBhZGQgc29tZSBtb3JlIG9yIGxlc3MgY2xldmVyIGVtdWxhdGlvbj8gKi8KLQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSJhenQzMzI4OiBtaXNzaW5nICVzIGVtdWxhdGlvbiBmb3IgQUM5NyByZWdpc3RlciAweCUwMnghXG4iLAorCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJIm1pc3NpbmcgJXMgZW11bGF0aW9uIGZvciBBQzk3IHJlZ2lzdGVyIDB4JTAyeCFcbiIsCiAJCW1vZGUsIHJlZyk7CiB9CiAKQEAgLTcxNywxMCArNjY5LDggQEAKIAl1bnNpZ25lZCBzaG9ydCByZWdfdmFsID0gMDsKIAlib29sIHVuc3VwcG9ydGVkID0gZmFsc2U7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigKLQkJInNuZF9hemYzMzI4X21peGVyX2FjOTdfcmVhZCByZWdfYWM5NyAldVxuIiwKLQkJCXJlZ19hYzk3Ci0JKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNuZF9hemYzMzI4X21peGVyX2FjOTdfcmVhZCByZWdfYWM5NyAldVxuIiwKKwkJcmVnX2FjOTcpOwogCWlmIChyZWdfYXpmICYgQVpGX0FDOTdfUkVHX1VOU1VQUE9SVEVEKQogCQl1bnN1cHBvcnRlZCA9IHRydWU7CiAJZWxzZSB7CkBAIC03NjUsNyArNzE1LDcgQEAKIAkJfQogCX0KIAlpZiAodW5zdXBwb3J0ZWQpCi0JCXNuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKHJlZ19hYzk3LCAicmVhZCIpOworCQlzbmRfYXpmMzMyOF9taXhlcl9hYzk3X21hcF91bnN1cHBvcnRlZChjaGlwLCByZWdfYWM5NywgInJlYWQiKTsKIAogCXJldHVybiByZWdfdmFsOwogfQpAQCAtNzc4LDEwICs3MjgsOSBAQAogCXVuc2lnbmVkIHNob3J0IHJlZ19hemYgPSBzbmRfYXpmMzMyOF9taXhlcl9hYzk3X21hcF9yZWdfaWR4KHJlZ19hYzk3KTsKIAlib29sIHVuc3VwcG9ydGVkID0gZmFsc2U7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJInNuZF9hemYzMzI4X21peGVyX2FjOTdfd3JpdGUgcmVnX2FjOTcgJXUgdmFsICV1XG4iLAotCQkJcmVnX2FjOTcsIHZhbAotCSk7CisJCXJlZ19hYzk3LCB2YWwpOwogCWlmIChyZWdfYXpmICYgQVpGX0FDOTdfUkVHX1VOU1VQUE9SVEVEKQogCQl1bnN1cHBvcnRlZCA9IHRydWU7CiAJZWxzZSB7CkBAIC04MTQsNyArNzYzLDcgQEAKIAkJfQogCX0KIAlpZiAodW5zdXBwb3J0ZWQpCi0JCXNuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKHJlZ19hYzk3LCAid3JpdGUiKTsKKwkJc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQoY2hpcCwgcmVnX2FjOTcsICJ3cml0ZSIpOwogfQogCiBzdGF0aWMgaW50CkBAIC04NTAsNyArNzk5LDcgQEAKIAkJICogZHVlIHRvIHRoaXMgY2FyZCBiZWluZyBhIHZlcnkgcXVpcmt5IEFDOTcgImxvb2thbGlrZSIuCiAJCSAqLwogCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fRVJSICJhenQzMzI4OiBBQzk3IGluaXQgZmFpbGVkLCBlcnIgJWQhXG4iLCByYyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUM5NyBpbml0IGZhaWxlZCwgZXJyICVkIVxuIiwgcmMpOwogCiAJLyogSWYgd2UgcmV0dXJuIGFuIGVycm9yIGhlcmUsIHRoZW4gc25kX2NhcmRfZnJlZSgpIHNob3VsZAogCSAqIGZyZWUgdXAgYW55IGFjOTcgY29kZWNzIHRoYXQgZ290IGNyZWF0ZWQsIGFzIHdlbGwgYXMgdGhlIGJ1cy4KQEAgLTg3MCw4ICs4MTksNiBAQAogCXVuc2lnbmVkIGNoYXIgY3Vycl92b2xfbGVmdCA9IDAsIGN1cnJfdm9sX3JpZ2h0ID0gMDsKIAlpbnQgbGVmdF9jaGFuZ2UgPSAwLCByaWdodF9jaGFuZ2UgPSAwOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7Ci0KIAlpZiAoY2hhbl9zZWwgJiBTRVRfQ0hBTl9MRUZUKSB7CiAJCWN1cnJfdm9sX2xlZnQgID0gaW5iKHBvcnRiYXNlICsgMSk7CiAKQEAgLTkxMiw3ICs4NTksNiBAQAogCQlpZiAoZGVsYXkpCiAJCQltZGVsYXkoZGVsYXkpOwogCX0gd2hpbGUgKChsZWZ0X2NoYW5nZSkgfHwgKHJpZ2h0X2NoYW5nZSkpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiAvKgpAQCAtOTkwLDE0ICs5MzYsMTIgQEAKIHsKIAlzdHJ1Y3QgYXpmMzMyOF9taXhlcl9yZWcgcmVnOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJdWluZm8tPnR5cGUgPSByZWcubWFzayA9PSAxID8KIAkJU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IHJlZy5zdGVyZW8gKyAxOwogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcmVnLm1hc2s7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMDksNyArOTUzLDYgQEAKIAlzdHJ1Y3QgYXpmMzMyOF9taXhlcl9yZWcgcmVnOwogCXUxNiBvcmVnLCB2YWw7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAogCW9yZWcgPSBzbmRfYXpmMzMyOF9taXhlcl9pbncoY2hpcCwgcmVnLnJlZyk7CkBAIC0xMDIzLDEyICs5NjYsMTEgQEAKIAkJCXZhbCA9IHJlZy5tYXNrIC0gdmFsOwogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHZhbDsKIAl9Ci0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoImdldDogJTAyeCBpcyAlMDR4IC0+IHZvbCAlMDJseHwlMDJseCAiCi0JCQkgICAgICIoc2hpZnQgJTAyZHwlMDJkLCBtYXNrICUwMngsIGludi4gJWQsIHN0ZXJlbyAlZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJnZXQ6ICUwMnggaXMgJTA0eCAtPiB2b2wgJTAybHh8JTAybHggKHNoaWZ0ICUwMmR8JTAyZCwgbWFzayAlMDJ4LCBpbnYuICVkLCBzdGVyZW8gJWQpXG4iLAogCQlyZWcucmVnLCBvcmVnLAogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCiAJCXJlZy5sY2hhbl9zaGlmdCwgcmVnLnJjaGFuX3NoaWZ0LCByZWcubWFzaywgcmVnLmludmVydCwgcmVnLnN0ZXJlbyk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNDAsNyArOTgyLDYgQEAKIAlzdHJ1Y3QgYXpmMzMyOF9taXhlcl9yZWcgcmVnOwogCXUxNiBvcmVnLCBucmVnLCB2YWw7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAlvcmVnID0gc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHJlZy5yZWcpOwogCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgcmVnLm1hc2s7CkBAIC0xMDY0LDEyICsxMDA1LDExIEBACiAJZWxzZQogICAgICAgICAJc25kX2F6ZjMzMjhfbWl4ZXJfb3V0dyhjaGlwLCByZWcucmVnLCBucmVnKTsKIAotCXNuZF9hemYzMzI4X2RiZ21peGVyKCJwdXQ6ICUwMnggdG8gJTAybHh8JTAybHgsICIKLQkJCSAgICAgIm9yZWcgJTA0eDsgc2hpZnQgJTAyZHwlMDJkIC0+IG5yZWcgJTA0eDsgYWZ0ZXI6ICUwNHhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJwdXQ6ICUwMnggdG8gJTAybHh8JTAybHgsIG9yZWcgJTA0eDsgc2hpZnQgJTAyZHwlMDJkIC0+IG5yZWcgJTA0eDsgYWZ0ZXI6ICUwNHhcbiIsCiAJCXJlZy5yZWcsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwKIAkJb3JlZywgcmVnLmxjaGFuX3NoaWZ0LCByZWcucmNoYW5fc2hpZnQsCiAJCW5yZWcsIHNuZF9hemYzMzI4X21peGVyX2ludyhjaGlwLCByZWcucmVnKSk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIChucmVnICE9IG9yZWcpOwogfQogCkBAIC0xMTM1LDcgKzEwNzUsOCBAQAogCX0gZWxzZQogICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gcmVnLmxjaGFuX3NoaWZ0KSAmIChyZWcuZW51bV9jIC0gMSk7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigiZ2V0X2VudW06ICUwMnggaXMgJTA0eCAtPiAlZHwlZCAoc2hpZnQgJTAyZCwgZW51bV9jICVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImdldF9lbnVtOiAlMDJ4IGlzICUwNHggLT4gJWR8JWQgKHNoaWZ0ICUwMmQsIGVudW1fYyAlZClcbiIsCiAJCXJlZy5yZWcsIHZhbCwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSwKIAkJcmVnLmxjaGFuX3NoaWZ0LCByZWcuZW51bV9jKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMTY3LDcgKzExMDgsOCBAQAogCXNuZF9hemYzMzI4X21peGVyX291dHcoY2hpcCwgcmVnLnJlZywgdmFsKTsKIAlucmVnID0gdmFsOwogCi0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoInB1dF9lbnVtOiAlMDJ4IHRvICUwNHgsIG9yZWcgJTA0eFxuIiwgcmVnLnJlZywgdmFsLCBvcmVnKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInB1dF9lbnVtOiAlMDJ4IHRvICUwNHgsIG9yZWcgJTA0eFxuIiwgcmVnLnJlZywgdmFsLCBvcmVnKTsKIAlyZXR1cm4gKG5yZWcgIT0gb3JlZyk7CiB9CiAKQEAgLTEyNTMsNyArMTE5NSw2IEBACiAJdW5zaWduZWQgaW50IGlkeDsKIAlpbnQgZXJyOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJaWYgKHNuZF9CVUdfT04oIWNoaXAgfHwgIWNoaXAtPmNhcmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTI3OSw3ICsxMjIwLDYgQEAKIAlzbmRfY29tcG9uZW50X2FkZChjYXJkLCAiQVpGMzMyOCBtaXhlciIpOwogCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJBWkYzMzI4IG1peGVyIik7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBBWkZfVVNFX0FDOTdfTEFZRVIgKi8KQEAgLTEyODgsMTkgKzEyMjgsMTMgQEAKIHNuZF9hemYzMzI4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7Ci0JaW50IHJlczsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQlyZXMgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwotCXJldHVybiByZXM7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNuZF9hemYzMzI4X2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMzE1LDcgKzEyNDksNiBAQAogCXUxNiB2YWwgPSAweGZmMDA7CiAJdTggZnJlcSA9IDA7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzd2l0Y2ggKGJpdHJhdGUpIHsKIAljYXNlIEFaRl9GUkVRXzQwMDA6ICBmcmVxID0gU09VTkRGT1JNQVRfRlJFUV9TVVNQRUNURURfNDAwMDsgYnJlYWs7CiAJY2FzZSBBWkZfRlJFUV80ODAwOiAgZnJlcSA9IFNPVU5ERk9STUFUX0ZSRVFfU1VTUEVDVEVEXzQ4MDA7IGJyZWFrOwpAQCAtMTM3OSw3ICsxMzEyLDYgQEAKIAkJKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY29kZWMtPmxvY2ssIGZsYWdzKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0xNDA0LDE1ICsxMzM2LDE2IEBACiAJCWNoaXAtPnNoYWRvd19yZWdfY3RybF82QUggfD0gYml0bWFzazsKIAllbHNlCiAJCWNoaXAtPnNoYWRvd19yZWdfY3RybF82QUggJj0gfmJpdG1hc2s7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoIjZBSF91cGRhdGUgbWFzayAweCUwNHggZG9fbWFzayAlZDogdmFsIDB4JTA0eFxuIiwKLQkJCWJpdG1hc2ssIGRvX21hc2ssIGNoaXAtPnNoYWRvd19yZWdfY3RybF82QUgpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiNkFIX3VwZGF0ZSBtYXNrIDB4JTA0eCBkb19tYXNrICVkOiB2YWwgMHglMDR4XG4iLAorCQliaXRtYXNrLCBkb19tYXNrLCBjaGlwLT5zaGFkb3dfcmVnX2N0cmxfNkFIKTsKIAlzbmRfYXpmMzMyOF9jdHJsX291dHcoY2hpcCwgSURYX0lPXzZBSCwgY2hpcC0+c2hhZG93X3JlZ19jdHJsXzZBSCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc25kX2F6ZjMzMjhfY3RybF9lbmFibGVfY29kZWNzKHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwgYm9vbCBlbmFibGUpCiB7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoImNvZGVjX2VuYWJsZSAlZFxuIiwgZW5hYmxlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX2VuYWJsZSAlZFxuIiwgZW5hYmxlKTsKIAkvKiBubyBpZGVhIHdoYXQgZXhhY3RseSBpcyBiZWluZyBkb25lIGhlcmUsIGJ1dCBJIHN0cm9uZ2x5IGFzc3VtZSBpdCdzCiAJICogUE0gcmVsYXRlZCAqLwogCXNuZF9hemYzMzI4X2N0cmxfcmVnXzZBSF91cGRhdGUoCkBAIC0xNDI5LDcgKzEzNjIsNyBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9ICZjaGlwLT5jb2RlY3NbY29kZWNfdHlwZV07CiAJYm9vbCBuZWVkX2NoYW5nZSA9IChjb2RlYy0+cnVubmluZyAhPSBlbmFibGUpOwogCi0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSJjb2RlY19hY3Rpdml0eTogJXMgY29kZWMsIGVuYWJsZSAlZCwgbmVlZF9jaGFuZ2UgJWRcbiIsCiAJCQkJY29kZWMtPm5hbWUsIGVuYWJsZSwgbmVlZF9jaGFuZ2UKIAkpOwpAQCAtMTQ3MCwxMyArMTQwMywxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMsCi0JCQkJdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCi0JCQkJdW5zaWduZWQgaW50IGJ1ZmZlcl9ieXRlcworc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsCisJCQkgIHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYywKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICB1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzLAorCQkJICB1bnNpZ25lZCBpbnQgYnVmZmVyX2J5dGVzCiApCiB7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJV0FSTl9PTkNFKHBlcmlvZF9ieXRlcyAmIDEsICJvZGQgcGVyaW9kIGxlbmd0aCE/XG4iKTsKIAlXQVJOX09OQ0UoYnVmZmVyX2J5dGVzICE9IDIgKiBwZXJpb2RfYnl0ZXMsCiAJCSAibWlzc2VkIG91ciBpbnB1dCBleHBlY3RhdGlvbnMhICV1IHZzLiAldVxuIiwKQEAgLTE0OTksNyArMTQzMiw3IEBACiAJCXNldHVwX2lvLmRtYV9zdGFydF8xID0gYWRkcjsKIAkJc2V0dXBfaW8uZG1hX3N0YXJ0XzIgPSBhZGRyK2FyZWFfbGVuZ3RoOwogCi0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSJzZXRkbWE6IGJ1ZmZlcnMgJTA4eFsldV0gLyAlMDh4WyV1XSwgJXUsICV1XG4iLAogCQkJCXNldHVwX2lvLmRtYV9zdGFydF8xLCBhcmVhX2xlbmd0aCwKIAkJCQlzZXR1cF9pby5kbWFfc3RhcnRfMiwgYXJlYV9sZW5ndGgsCkBAIC0xNTIyLDcgKzE0NTUsNiBAQAogCQkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNvZGVjLT5sb2NrLCBmbGFncyk7CiAJfQotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNTM1LDggKzE0NjcsNiBAQAogCXVuc2lnbmVkIGludCBjb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogI2VuZGlmCiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQogCWNvZGVjLT5kbWFfYmFzZSA9IHJ1bnRpbWUtPmRtYV9hZGRyOwogCiAjaWYgMApAQCAtMTU0NCwxMCArMTQ3NCw5IEBACiAJCXJ1bnRpbWUtPnJhdGUsCiAJCXNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCksCiAJCXJ1bnRpbWUtPmNoYW5uZWxzKTsKLQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNvZGVjLAorCXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoY2hpcCwgY29kZWMsCiAJCQkJCXJ1bnRpbWUtPmRtYV9hZGRyLCBjb3VudCwgc2l6ZSk7CiAjZW5kaWYKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2MiwxMSArMTQ5MSw5IEBACiAJYm9vbCBwcmV2aW91c2x5X211dGVkID0gZmFsc2U7CiAJYm9vbCBpc19tYWluX21peGVyX3BsYXliYWNrX2NvZGVjID0gKEFaRl9DT0RFQ19QTEFZQkFDSyA9PSBjb2RlYy0+dHlwZSk7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxscygic25kX2F6ZjMzMjhfcGNtX3RyaWdnZXIgY21kICVkXG4iLCBjbWQpOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiU1RBUlQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJTVEFSVCBQQ00gJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAogCQlpZiAoaXNfbWFpbl9taXhlcl9wbGF5YmFja19jb2RlYykgewogCQkJLyogbXV0ZSBXYXZlT3V0IChhdm9pZCBjbGlja2luZyBkdXJpbmcgc2V0dXApICovCkBAIC0xNTkzLDcgKzE1MjAsNyBAQAogCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNvZGVjLCBJRFhfSU9fQ09ERUNfSVJRVFlQRSwgMHhmZmZmKTsKIAkJc3Bpbl91bmxvY2soY29kZWMtPmxvY2spOwogCi0JCXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoY29kZWMsIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNoaXAsIGNvZGVjLCBydW50aW1lLT5kbWFfYWRkciwKIAkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pLAogCQkJc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkKIAkJKTsKQEAgLTE2MzMsMTAgKzE1NjAsMTAgQEAKIAkJCQkpOwogCQl9CiAKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNUQVJURUQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gU1RBUlRFRCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlJFU1VNRSAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlBDTSBSRVNVTUUgJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAkJLyogcmVzdW1lIGNvZGVjIGlmIHdlIHdlcmUgYWN0aXZlICovCiAJCXNwaW5fbG9jayhjb2RlYy0+bG9jayk7CiAJCWlmIChjb2RlYy0+cnVubmluZykKQEAgLTE2NDgsNyArMTU3NSw3IEBACiAJCXNwaW5fdW5sb2NrKGNvZGVjLT5sb2NrKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiU1RPUCAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlBDTSBTVE9QICVzXG4iLCBjb2RlYy0+bmFtZSk7CiAKIAkJaWYgKGlzX21haW5fbWl4ZXJfcGxheWJhY2tfY29kZWMpIHsKIAkJCS8qIG11dGUgV2F2ZU91dCAoYXZvaWQgY2xpY2tpbmcgZHVyaW5nIHNldHVwKSAqLwpAQCAtMTY4NCwxMCArMTYxMSwxMCBAQAogCQkJCSk7CiAJCX0KIAotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiU1RPUFBFRCAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlBDTSBTVE9QUEVEICVzXG4iLCBjb2RlYy0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNVU1BFTkQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gU1VTUEVORCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCQkvKiBtYWtlIHN1cmUgY29kZWMgaXMgc3RvcHBlZCAqLwogCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX0ZMQUdTLAogCQkJc25kX2F6ZjMzMjhfY29kZWNfaW53KApAQCAtMTY5NiwxNyArMTYyMywxNiBAQAogCQkpOwogCQlicmVhazsKICAgICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJGSVhNRTogU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCBOSVkhXG4iKTsKKwkJV0FSTigxLCAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0ggTklZIVxuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0UgTklZIVxuIik7CisJCVdBUk4oMSwgIkZJWE1FOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFIE5JWSFcbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJGSVhNRTogdW5rbm93biB0cmlnZ2VyIG1vZGUhXG4iKTsKKwkJV0FSTigxLCAiRklYTUU6IHVua25vd24gdHJpZ2dlciBtb2RlIVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTcyOCw4ICsxNjU0LDggQEAKIAlyZXN1bHQgLT0gY29kZWMtPmRtYV9iYXNlOwogI2VuZGlmCiAJZnJtcmVzID0gYnl0ZXNfdG9fZnJhbWVzKCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHJlc3VsdCk7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoIiUwOGxpICVzIEAgMHglOGx4LCBmcmFtZXMgJThsZFxuIiwKLQkJCQlqaWZmaWVzLCBjb2RlYy0+bmFtZSwgcmVzdWx0LCBmcm1yZXMpOworCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIiUwOGxpICVzIEAgMHglOGx4LCBmcmFtZXMgJThsZFxuIiwKKwkJamlmZmllcywgY29kZWMtPm5hbWUsIHJlc3VsdCwgZnJtcmVzKTsKIAlyZXR1cm4gZnJtcmVzOwogfQogCkBAIC0xNzkyLDcgKzE3MTgsNyBAQAogCSAqIHNrZWxldG9uIGhhbmRsZXIgb25seQogCSAqICh3ZSBkbyBub3Qgd2FudCBheGlzIHJlYWRpbmcgaW4gaW50ZXJydXB0IGhhbmRsZXIgLSB0b28gbXVjaCBsb2FkISkKIAkgKi8KLQlzbmRfYXpmMzMyOF9kYmdnYW1lKCJnYW1lcG9ydCBpcnFcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2FtZXBvcnQgaXJxXG4iKTsKIAogCSAvKiB0aGlzIHNob3VsZCBBQ0sgdGhlIGdhbWVwb3J0IElSUSBwcm9wZXJseSwgaG9wZWZ1bGx5LiAqLwogCXNuZF9hemYzMzI4X2dhbWVfaW53KGNoaXAsIElEWF9HQU1FX0FYSVNfVkFMVUUpOwpAQCAtMTgwNCw3ICsxNzMwLDcgQEAKIAlzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAlpbnQgcmVzOwogCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiZ2FtZXBvcnRfb3BlbiwgbW9kZSAlZFxuIiwgbW9kZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJnYW1lcG9ydF9vcGVuLCBtb2RlICVkXG4iLCBtb2RlKTsKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgogCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CkBAIC0xODI3LDcgKzE3NTMsNyBAQAogewogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOwogCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiZ2FtZXBvcnRfY2xvc2VcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2FtZXBvcnRfY2xvc2VcbiIpOwogCXNuZF9hemYzMzI4X2dhbWVwb3J0X3NldF9jb3VudGVyX2ZyZXF1ZW5jeShjaGlwLAogCQkJCUdBTUVfSFdDRkdfQURDX0NPVU5URVJfRlJFUV8xXzIwMCk7CiAJc25kX2F6ZjMzMjhfZ2FtZXBvcnRfYXhpc19jaXJjdWl0X2VuYWJsZShjaGlwLCAwKTsKQEAgLTE4OTIsOSArMTgxOCw4IEBACiAJCQlheGVzW2ldID0gLTE7CiAJfQogCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiY29va2VkX3JlYWQ6IGF4ZXMgJWQgJWQgJWQgJWQgYnV0dG9ucyAlZFxuIiwKLQkJYXhlc1swXSwgYXhlc1sxXSwgYXhlc1syXSwgYXhlc1szXSwgKmJ1dHRvbnMKLQkpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY29va2VkX3JlYWQ6IGF4ZXMgJWQgJWQgJWQgJWQgYnV0dG9ucyAlZFxuIiwKKwkJYXhlc1swXSwgYXhlc1sxXSwgYXhlc1syXSwgYXhlc1szXSwgKmJ1dHRvbnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTA2LDcgKzE4MzEsNyBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogY2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xOTUwLDIzICsxODc1LDIzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHNuZF9hemYzMzI4X2dhbWVwb3J0X2ludGVycnVwdChzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXApCiB7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaHVoLCBnYW1lIHBvcnQgSVJRIG9jY3VycmVkIT9cbiIpOworCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImh1aCwgZ2FtZSBwb3J0IElSUSBvY2N1cnJlZCE/XG4iKTsKIH0KICNlbmRpZiAvKiBTVVBQT1JUX0dBTUVQT1JUICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfaXJxX2xvZ191bmtub3duX3R5cGUodTggd2hpY2gpCitzbmRfYXpmMzMyOF9pcnFfbG9nX3Vua25vd25fdHlwZShzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsIHU4IHdoaWNoKQogewotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKAotCSJhenQzMzI4OiB1bmtub3duIElSUSB0eXBlICgleCkgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iLAotCQl3aGljaAotCSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJ1bmtub3duIElSUSB0eXBlICgleCkgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iLAorCQl3aGljaCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqZmlyc3RfY29kZWMsCitzbmRfYXpmMzMyOF9wY21faW50ZXJydXB0KHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwKKwkJCSAgY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmZpcnN0X2NvZGVjLAogCQkJICB1OCBzdGF0dXMKICkKIHsKQEAgLTE5OTAsMTcgKzE5MTUsMTUgQEAKIAogCQlpZiAoY29kZWMtPnN1YnN0cmVhbSkgewogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjb2RlYy0+c3Vic3RyZWFtKTsKLQkJCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCIlcyBwZXJpb2QgZG9uZSAoIyV4KSwgQCAleFxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiJXMgcGVyaW9kIGRvbmUgKCMleCksIEAgJXhcbiIsCiAJCQkJY29kZWMtPm5hbWUsCiAJCQkJd2hpY2gsCiAJCQkJc25kX2F6ZjMzMjhfY29kZWNfaW5sKAotCQkJCQljb2RlYywgSURYX0lPX0NPREVDX0RNQV9DVVJSUE9TCi0JCQkJKQotCQkJKTsKKwkJCQkJY29kZWMsIElEWF9JT19DT0RFQ19ETUFfQ1VSUlBPUykpOwogCQl9IGVsc2UKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF6dDMzMjg6IGlycSBoYW5kbGVyIHByb2JsZW0hXG4iKTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImlycSBoYW5kbGVyIHByb2JsZW0hXG4iKTsKIAkJaWYgKHdoaWNoICYgSVJRX1NPTUVUSElORykKLQkJCXNuZF9hemYzMzI4X2lycV9sb2dfdW5rbm93bl90eXBlKHdoaWNoKTsKKwkJCXNuZF9hemYzMzI4X2lycV9sb2dfdW5rbm93bl90eXBlKGNoaXAsIHdoaWNoKTsKIAl9CiB9CiAKQEAgLTIwMDksOSArMTkzMiw3IEBACiB7CiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwID0gZGV2X2lkOwogCXU4IHN0YXR1czsKLSNpZiBERUJVR19DT0RFQwogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGlycV9jb3VudDsKLSNlbmRpZgogCiAJc3RhdHVzID0gc25kX2F6ZjMzMjhfY3RybF9pbmIoY2hpcCwgSURYX0lPX0lSUVNUQVRVUyk7CiAKQEAgLTIwMjIsMTQgKzE5NDMsMTMgQEAKIAkpKQogCQlyZXR1cm4gSVJRX05PTkU7IC8qIG11c3QgYmUgaW50ZXJydXB0IGZvciBhbm90aGVyIGRldmljZSAqLwogCi0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSJpcnFfY291bnQgJWxkISBJRFhfSU9fSVJRU1RBVFVTICUwNHhcbiIsCiAJCQlpcnFfY291bnQrKyAvKiBkZWJ1Zy1vbmx5ICovLAotCQkJc3RhdHVzCi0JKTsKKwkJCXN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSVJRX1RJTUVSKSB7Ci0JCS8qIHNuZF9hemYzMzI4X2RiZ2NvZGVjKCJ0aW1lciAlbGRcbiIsCisJCS8qIGRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAidGltZXIgJWxkXG4iLAogCQkJc25kX2F6ZjMzMjhfY29kZWNfaW5sKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSkKIAkJCQkmIFRJTUVSX1ZBTFVFX01BU0sKIAkJKTsgKi8KQEAgLTIwMzksMTEgKzE5NTksMTEgQEAKICAgICAgICAgICAgICAgICBzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAkJc25kX2F6ZjMzMjhfY3RybF9vdXRiKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSArIDMsIDB4MDcpOwogCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiYXp0MzMyODogdGltZXIgSVJRXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ0aW1lciBJUlFcbiIpOwogCX0KIAogCWlmIChzdGF0dXMgJiAoSVJRX1BMQVlCQUNLfElSUV9SRUNPUkRJTkd8SVJRX0kyU19PVVQpKQotCQlzbmRfYXpmMzMyOF9wY21faW50ZXJydXB0KGNoaXAtPmNvZGVjcywgc3RhdHVzKTsKKwkJc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChjaGlwLCBjaGlwLT5jb2RlY3MsIHN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSVJRX0dBTUVQT1JUKQogCQlzbmRfYXpmMzMyOF9nYW1lcG9ydF9pbnRlcnJ1cHQoY2hpcCk7CkBAIC0yMDU1LDcgKzE5NzUsNyBAQAogCiAJCS8qIGhtbSwgZG8gd2UgaGF2ZSB0byBhY2sgdGhlIElSUSBoZXJlIHNvbWVob3c/CiAJCSAqIElmIHNvLCB0aGVuIEkgZG9uJ3Qga25vdyBob3cgeWV0Li4uICovCi0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJhenQzMzI4OiBNUFU0MDEgSVJRXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJNUFU0MDEgSVJRXG4iKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMjEzMyw3ICsyMDUzLDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9ICZjaGlwLT5jb2RlY3NbY29kZWNfdHlwZV07CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljb2RlYy0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCiAJLyogc2FtZSBwYXJhbWV0ZXJzIGZvciBhbGwgb3VyIGNvZGVjcyAtIGF0IGxlYXN0IHdlIHRoaW5rIHNvLi4uICovCkBAIC0yMTQyLDcgKzIwNjEsNiBAQAogCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCSAgICZzbmRfYXpmMzMyOF9od19jb25zdHJhaW50c19yYXRlcyk7CiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gY29kZWM7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNzEsOSArMjA4OSw3IEBACiAJc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0KIAkJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljb2RlYy0+c3Vic3RyZWFtID0gTlVMTDsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIyMCw4ICsyMTM2LDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQogCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBWkYzMzI4IERTUCIsIEFaRl9QQ01ERVZfU1RELAogCQkJCQkJCQkxLCAxLCAmcGNtKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTIyNTgsNyArMjE3Miw2IEBACiAJCQkJCQlzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCiAJCQkJCQkJNjQqMTAyNCwgNjQqMTAyNCk7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI4MSw3ICsyMTk0LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBkZWxheTsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCWNoaXAgPSBzbmRfdGltZXJfY2hpcCh0aW1lcik7CiAJZGVsYXkgPSAoKHRpbWVyLT5zdGlja3MgKiBzZXF0aW1lcl9zY2FsaW5nKSAtIDEpICYgVElNRVJfVkFMVUVfTUFTSzsKIAlpZiAoZGVsYXkgPCA0OSkgewpAQCAtMjI4OSwxNSArMjIwMSwxNCBAQAogCQkgKiB0aGlzIHRpbWluZyB0d2VhawogCQkgKiAod2UgbmVlZCB0byBkbyBpdCB0byBhdm9pZCBhIGxvY2t1cCwgdGhvdWdoKSAqLwogCi0JCXNuZF9hemYzMzI4X2RiZ3RpbWVyKCJkZWxheSB3YXMgdG9vIGxvdyAoJWQpIVxuIiwgZGVsYXkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRlbGF5IHdhcyB0b28gbG93ICglZCkhXG4iLCBkZWxheSk7CiAJCWRlbGF5ID0gNDk7IC8qIG1pbmltdW0gdGltZSBpcyA0OSB0aWNrcyAqLwogCX0KLQlzbmRfYXpmMzMyOF9kYmd0aW1lcigic2V0dGluZyB0aW1lciBjb3VudGRvd24gdmFsdWUgJWRcbiIsIGRlbGF5KTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNldHRpbmcgdGltZXIgY291bnRkb3duIHZhbHVlICVkXG4iLCBkZWxheSk7CiAJZGVsYXkgfD0gVElNRVJfQ09VTlRET1dOX0VOQUJMRSB8IFRJTUVSX0lSUV9FTkFCTEU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJc25kX2F6ZjMzMjhfY3RybF9vdXRsKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSwgZGVsYXkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMDcsNyArMjIxOCw2IEBACiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogCS8qIGRpc2FibGUgdGltZXIgY291bnRkb3duIGFuZCBpbnRlcnJ1cHQgKi8KQEAgLTIzMTksNyArMjIyOSw2IEBACiAJICAgdGhlIGhhcmR3YXJlL0FMU0EgaW50ZXJydXB0IGFjdGl2aXR5LiAqLwogCXNuZF9hemYzMzI4X2N0cmxfb3V0YihjaGlwLCBJRFhfSU9fVElNRVJfVkFMVUUgKyAzLCAweDA0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzI4LDEwICsyMjM3LDggQEAKIHNuZF9hemYzMzI4X3RpbWVyX3ByZWNpc2VfcmVzb2x1dGlvbihzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lciwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm51bSwgdW5zaWduZWQgbG9uZyAqZGVuKQogewotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCSpudW0gPSAxOwogCSpkZW4gPSAxMDI0MDAwIC8gc2VxdGltZXJfc2NhbGluZzsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM1MSw3ICsyMjU4LDYgQEAKIAlzdHJ1Y3Qgc25kX3RpbWVyX2lkIHRpZDsKIAlpbnQgZXJyOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJdGlkLmRldl9jbGFzcyA9IFNORFJWX1RJTUVSX0NMQVNTX0NBUkQ7CiAJdGlkLmRldl9zY2xhc3MgPSBTTkRSVl9USU1FUl9TQ0xBU1NfTk9ORTsKIAl0aWQuY2FyZCA9IGNoaXAtPmNhcmQtPm51bWJlcjsKQEAgLTIzNzYsNyArMjI4Miw2IEBACiAJZXJyID0gMDsKIAogb3V0OgotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI0MzgsMzQgKzIzNDMsMzQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc25kX2F6ZjMzMjhfZGVidWdfc2hvd19wb3J0cyhjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXApCiB7Ci0jaWYgREVCVUdfTUlTQwogCXUxNiB0bXA7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXNjKAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkiY3RybF9pbyAweCVseCwgZ2FtZV9pbyAweCVseCwgbXB1X2lvIDB4JWx4LCAiCiAJCSJvcGwzX2lvIDB4JWx4LCBtaXhlcl9pbyAweCVseCwgaXJxICVkXG4iLAogCQljaGlwLT5jdHJsX2lvLCBjaGlwLT5nYW1lX2lvLCBjaGlwLT5tcHVfaW8sCi0JCWNoaXAtPm9wbDNfaW8sIGNoaXAtPm1peGVyX2lvLCBjaGlwLT5pcnEKLQkpOworCQljaGlwLT5vcGwzX2lvLCBjaGlwLT5taXhlcl9pbywgY2hpcC0+aXJxKTsKIAotCXNuZF9hemYzMzI4X2RiZ21pc2MoImdhbWUgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJnYW1lICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQlzbmRfYXpmMzMyOF9nYW1lX2luYihjaGlwLCAwKSwKIAkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgMSksCiAJCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDIpLAogCQlzbmRfYXpmMzMyOF9nYW1lX2luYihjaGlwLCAzKSwKIAkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgNCksCi0JCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDUpCi0JKTsKKwkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgNSkpOwogCiAJZm9yICh0bXAgPSAwOyB0bXAgPCAweDA3OyB0bXAgKz0gMSkKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygibXB1X2lvIDB4JTA0eFxuIiwgaW5iKGNoaXAtPm1wdV9pbyArIHRtcCkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJtcHVfaW8gMHglMDR4XG4iLCBpbmIoY2hpcC0+bXB1X2lvICsgdG1wKSk7CiAKIAlmb3IgKHRtcCA9IDA7IHRtcCA8PSAweDA3OyB0bXAgKz0gMSkKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygiMHglMDJ4OiBnYW1lMjAwIDB4JTA0eCwgZ2FtZTIwOCAweCUwNHhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIjB4JTAyeDogZ2FtZTIwMCAweCUwNHgsIGdhbWUyMDggMHglMDR4XG4iLAogCQkJdG1wLCBpbmIoMHgyMDAgKyB0bXApLCBpbmIoMHgyMDggKyB0bXApKTsKIAogCWZvciAodG1wID0gMDsgdG1wIDw9IDB4MDE7IHRtcCArPSAxKQotCQlzbmRfYXpmMzMyOF9kYmdtaXNjKAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSIweCUwMng6IG1wdTMwMCAweCUwNHgsIG1wdTMxMCAweCUwNHgsIG1wdTMyMCAweCUwNHgsICIKIAkJCSJtcHUzMzAgMHglMDR4IG9wbDM4OCAweCUwNHggb3BsMzhjIDB4JTA0eFxuIiwKIAkJCQl0bXAsCkBAIC0yNDc0LDE5ICsyMzc5LDE3IEBACiAJCQkJaW5iKDB4MzIwICsgdG1wKSwKIAkJCQlpbmIoMHgzMzAgKyB0bXApLAogCQkJCWluYigweDM4OCArIHRtcCksCi0JCQkJaW5iKDB4MzhjICsgdG1wKQotCQkpOworCQkJCWluYigweDM4YyArIHRtcCkpOwogCiAJZm9yICh0bXAgPSAwOyB0bXAgPCBBWkZfSU9fU0laRV9DVFJMOyB0bXAgKz0gMikKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygiY3RybCAweCUwMng6IDB4JTA0eFxuIiwKLQkJCXRtcCwgc25kX2F6ZjMzMjhfY3RybF9pbncoY2hpcCwgdG1wKQotCQkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjdHJsIDB4JTAyeDogMHglMDR4XG4iLAorCQkJdG1wLCBzbmRfYXpmMzMyOF9jdHJsX2ludyhjaGlwLCB0bXApKTsKIAogCWZvciAodG1wID0gMDsgdG1wIDwgQVpGX0lPX1NJWkVfTUlYRVI7IHRtcCArPSAyKQotCQlzbmRfYXpmMzMyOF9kYmdtaXNjKCJtaXhlciAweCUwMng6IDB4JTA0eFxuIiwKLQkJCXRtcCwgc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHRtcCkKLQkJKTsKLSNlbmRpZiAvKiBERUJVR19NSVNDICovCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIm1peGVyIDB4JTAyeDogMHglMDR4XG4iLAorCQkJdG1wLCBzbmRfYXpmMzMyOF9taXhlcl9pbncoY2hpcCwgdG1wKSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTI1MjMsOCArMjQyNiw4IEBACiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI0IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJCQkiMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIKIAkJKTsKIAkJZXJyID0gLUVOWElPOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yNTYwLDcgKzI0NjMsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXpmMzMyOF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC0yNTk5LDggKzI1MDIsNiBAQAogCQlzcGluX3VubG9ja19pcnEoY29kZWMtPmxvY2spOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7CiAKIAllcnIgPSAwOwpAQCAtMjYyNCw3ICsyNTI1LDYgQEAKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJaW50IGVycjsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CkBAIC0yNjM1LDcgKzI1MzUsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTI2NTcsNyArMjU1OCw3IEBACiAJCS0xLCAmY2hpcC0+cm1pZGkKIAkpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImF6ZjMzMjg6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCiAJCQkJY2hpcC0+bXB1X2lvCiAJCSk7CiAJCWdvdG8gb3V0X2VycjsKQEAgLTI2NzMsNyArMjU3NCw3IEBACiAKIAlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGNoaXAtPm9wbDNfaW8sIGNoaXAtPm9wbDNfaW8rMiwKIAkJCSAgICBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXpmMzMyODogbm8gT1BMMyBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAorCQlkZXZfZXJyKGNhcmQtPmRldiwgIm5vIE9QTDMgZGV2aWNlIGF0IDB4JWx4LTB4JWx4P1xuIiwKIAkJCSAgIGNoaXAtPm9wbDNfaW8sIGNoaXAtPm9wbDNfaW8rMgogCQkpOwogCX0gZWxzZSB7CkBAIC0yNjk1LDEyICsyNTk2LDE1IEBACiAJCWdvdG8gb3V0X2VycjsKIAogI2lmZGVmIE1PRFVMRQotCXByaW50ayhLRVJOX0lORk8KLSJhenQzMzI4OiBTb3VuZCBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4LWJhc2VkIHNvdW5kY2FyZHMgc3VjaCBhcyBQQ0kxNjguXG4iCi0iYXp0MzMyODogSGFyZHdhcmUgd2FzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCB1bmZvcnR1bmF0ZWx5LlxuIgotImF6dDMzMjg6IEZlZWwgZnJlZSB0byBjb250YWN0IGFuZGkgQVQgbGlzYXMuZGUgZm9yIGJ1ZyByZXBvcnRzIGV0Yy4hXG4iCi0iYXp0MzMyODogVXNlci1zY2FsYWJsZSBzZXF1ZW5jZXIgdGltZXIgc2V0IHRvICVkSHogKDEwMjQwMDBIeiAvICVkKS5cbiIsCi0JMTAyNDAwMCAvIHNlcXRpbWVyX3NjYWxpbmcsIHNlcXRpbWVyX3NjYWxpbmcpOworCWRldl9pbmZvKGNhcmQtPmRldiwKKwkJICJTb3VuZCBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4LWJhc2VkIHNvdW5kY2FyZHMgc3VjaCBhcyBQQ0kxNjguXG4iKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiSGFyZHdhcmUgd2FzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCB1bmZvcnR1bmF0ZWx5LlxuIik7CisJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkgIkZlZWwgZnJlZSB0byBjb250YWN0IGFuZGkgQVQgbGlzYXMuZGUgZm9yIGJ1ZyByZXBvcnRzIGV0Yy4hXG4iKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiVXNlci1zY2FsYWJsZSBzZXF1ZW5jZXIgdGltZXIgc2V0IHRvICVkSHogKDEwMjQwMDBIeiAvICVkKS5cbiIsCisJCSAxMDI0MDAwIC8gc2VxdGltZXJfc2NhbGluZywgc2VxdGltZXJfc2NhbGluZyk7CiAjZW5kaWYKIAogCXNuZF9hemYzMzI4X2dhbWVwb3J0KGNoaXAsIGRldik7CkBAIC0yNzEyLDMxICsyNjE2LDI5IEBACiAJZ290byBvdXQ7CiAKIG91dF9lcnI6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYXpmMzMyODogc29tZXRoaW5nIGZhaWxlZCwgZXhpdGluZ1xuIik7CisJZGV2X2VycihjYXJkLT5kZXYsICJzb21ldGhpbmcgZmFpbGVkLCBleGl0aW5nXG4iKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCiBvdXQ6Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQKIHNuZF9hemYzMzI4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyh1bnNpZ25lZCBsb25nIGlvX2FkZHIsIHVuc2lnbmVkIGNvdW50LCB1MzIgKnNhdmVkX3JlZ3MpCitzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAorCQkJIHVuc2lnbmVkIGxvbmcgaW9fYWRkciwgdW5zaWduZWQgY291bnQsIHUzMiAqc2F2ZWRfcmVncykKIHsKIAl1bnNpZ25lZCByZWc7CiAKIAlmb3IgKHJlZyA9IDA7IHJlZyA8IGNvdW50OyArK3JlZykgewogCQkqc2F2ZWRfcmVncyA9IGlubChpb19hZGRyKTsKLQkJc25kX2F6ZjMzMjhfZGJncG0oInN1c3BlbmQ6IGlvIDB4JTA0bHg6IDB4JTA4eFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdXNwZW5kOiBpbyAweCUwNGx4OiAweCUwOHhcbiIsCiAJCQlpb19hZGRyLCAqc2F2ZWRfcmVncyk7CiAJCSsrc2F2ZWRfcmVnczsKIAkJaW9fYWRkciArPSBzaXplb2YoKnNhdmVkX3JlZ3MpOwpAQCAtMjc0NCw3ICsyNjQ2LDggQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1zbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjb25zdCB1MzIgKnNhdmVkX3JlZ3MsCitzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsCisJCQljb25zdCB1MzIgKnNhdmVkX3JlZ3MsCiAJCQl1bnNpZ25lZCBsb25nIGlvX2FkZHIsCiAJCQl1bnNpZ25lZCBjb3VudAogKQpAQCAtMjc1Myw3ICsyNjU2LDggQEAKIAogCWZvciAocmVnID0gMDsgcmVnIDwgY291bnQ7ICsrcmVnKSB7CiAJCW91dGwoKnNhdmVkX3JlZ3MsIGlvX2FkZHIpOwotCQlzbmRfYXpmMzMyOF9kYmdwbSgicmVzdW1lOiBpbyAweCUwNGx4OiAweCUwOHggLS0+IDB4JTA4eFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicmVzdW1lOiBpbyAweCUwNGx4OiAweCUwOHggLS0+IDB4JTA4eFxuIiwKIAkJCWlvX2FkZHIsICpzYXZlZF9yZWdzLCBpbmwoaW9fYWRkcikpOwogCQkrK3NhdmVkX3JlZ3M7CiAJCWlvX2FkZHIgKz0gc2l6ZW9mKCpzYXZlZF9yZWdzKTsKQEAgLTI3NjYsNyArMjY3MCw3IEBACiAjaWZkZWYgQVpGX1VTRV9BQzk3X0xBWUVSCiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKICNlbHNlCi0Jc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAtPm1peGVyX2lvLAorCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLCBjaGlwLT5taXhlcl9pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX21peGVyKSwgY2hpcC0+c2F2ZWRfcmVnc19taXhlcik7CiAKIAkvKiBtYWtlIHN1cmUgdG8gZGlzYWJsZSBtYXN0ZXIgdm9sdW1lIGV0Yy4gdG8gcHJldmVudCBsb29waW5nIHNvdW5kICovCkBAIC0yNzgxLDcgKzI2ODUsNyBAQAogI2lmZGVmIEFaRl9VU0VfQUM5N19MQVlFUgogCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3KTsKICNlbHNlCi0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19taXhlciwgY2hpcC0+bWl4ZXJfaW8sCisJc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcCwgY2hpcC0+c2F2ZWRfcmVnc19taXhlciwgY2hpcC0+bWl4ZXJfaW8sCiAJCQkJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19taXhlcikpOwogCiAJLyogdW5mb3J0dW5hdGVseSB3aXRoIDMyYml0IHRyYW5zZmVycywgSURYX01JWEVSX1BMQVlfTUFTVEVSICgweDAyKQpAQCAtMjgwOCwxOCArMjcxMiwxOCBAQAogCiAJc25kX2F6ZjMzMjhfc3VzcGVuZF9hYzk3KGNoaXApOwogCi0Jc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAtPmN0cmxfaW8sCisJc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAsIGNoaXAtPmN0cmxfaW8sCiAJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19jdHJsKSwgY2hpcC0+c2F2ZWRfcmVnc19jdHJsKTsKIAogCS8qIG1hbnVhbGx5IHN0b3JlIHRoZSBvbmUgY3VycmVudGx5IHJlbGV2YW50IHdyaXRlLW9ubHkgcmVnLCB0b28gKi8KIAlzYXZlZF9yZWdzX2N0cmxfdTE2ID0gKHUxNiAqKWNoaXAtPnNhdmVkX3JlZ3NfY3RybDsKIAlzYXZlZF9yZWdzX2N0cmxfdTE2W0lEWF9JT182QUggLyAyXSA9IGNoaXAtPnNoYWRvd19yZWdfY3RybF82QUg7CiAKLQlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcC0+Z2FtZV9pbywKKwlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcCwgY2hpcC0+Z2FtZV9pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX2dhbWUpLCBjaGlwLT5zYXZlZF9yZWdzX2dhbWUpOwotCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLT5tcHVfaW8sCisJc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAsIGNoaXAtPm1wdV9pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX21wdSksIGNoaXAtPnNhdmVkX3JlZ3NfbXB1KTsKLQlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcC0+b3BsM19pbywKKwlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcCwgY2hpcC0+b3BsM19pbywKIAkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX29wbDMpLCBjaGlwLT5zYXZlZF9yZWdzX29wbDMpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CkBAIC0yODM4LDIzICsyNzQyLDIyIEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhenQzMzI4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAotCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAtPnNhdmVkX3JlZ3NfZ2FtZSwgY2hpcC0+Z2FtZV9pbywKKwlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLCBjaGlwLT5zYXZlZF9yZWdzX2dhbWUsIGNoaXAtPmdhbWVfaW8sCiAJCQkJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19nYW1lKSk7Ci0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19tcHUsIGNoaXAtPm1wdV9pbywKKwlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLCBjaGlwLT5zYXZlZF9yZWdzX21wdSwgY2hpcC0+bXB1X2lvLAogCQkJCQlBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3NfbXB1KSk7Ci0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19vcGwzLCBjaGlwLT5vcGwzX2lvLAorCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAsIGNoaXAtPnNhdmVkX3JlZ3Nfb3BsMywgY2hpcC0+b3BsM19pbywKIAkJCQkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX29wbDMpKTsKIAogCXNuZF9hemYzMzI4X3Jlc3VtZV9hYzk3KGNoaXApOwogCi0Jc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcC0+c2F2ZWRfcmVnc19jdHJsLCBjaGlwLT5jdHJsX2lvLAorCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAsIGNoaXAtPnNhdmVkX3JlZ3NfY3RybCwgY2hpcC0+Y3RybF9pbywKIAkJCQkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX2N0cmwpKTsKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggMTg4MDIwMy4uODU0NjcxMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTI5MywxNyArMjkzLDIzIEBACiAJCVBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8IFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZOwogCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIFBDSV9TVEFUVVMsIHBjaV9zdGF0dXMpOwogCWlmIChwY2lfc3RhdHVzICE9IFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBaWVlZSAtIFBDSSBlcnJvciEgc3RhdHVzICUjMDh4LCBQQ0kgc3RhdHVzICUjMDR4XG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBaWVlZSAtIFBDSSBlcnJvciEgc3RhdHVzICUjMDh4LCBQQ0kgc3RhdHVzICUjMDR4XG4iLAogCQkJICAgc3RhdHVzICYgRVJST1JfSU5URVJSVVBUUywgcGNpX3N0YXR1cyk7CiAJZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFpZWVlIC0gUENJIHBhcml0eSBlcnJvciBkZXRlY3RlZCFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBaWVlZSAtIFBDSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQhXG4iKTsKIAkJLyogZXJyb3IgJ2hhbmRsaW5nJyBzaW1pbGFyIHRvIGFpYzd4eHhfcGNpLmM6ICovCiAJCWNoaXAtPnBjaV9wYXJpdHlfZXJyb3JzKys7CiAJCWlmIChjaGlwLT5wY2lfcGFyaXR5X2Vycm9ycyA+IDIwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJUb28gbWFueSBQQ0kgcGFyaXR5IGVycm9ycyBvYnNlcnZlZC5cbiIpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiU29tZSBkZXZpY2Ugb24gdGhpcyBidXMgaXMgZ2VuZXJhdGluZyBiYWQgcGFyaXR5LlxuIik7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJUaGlzIGlzIGFuIGVycm9yICpvYnNlcnZlZCBieSosIG5vdCAqZ2VuZXJhdGVkIGJ5KiwgdGhpcyBjYXJkLlxuIik7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJQQ0kgcGFyaXR5IGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRpc2FibGVkLlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiVG9vIG1hbnkgUENJIHBhcml0eSBlcnJvcnMgb2JzZXJ2ZWQuXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJTb21lIGRldmljZSBvbiB0aGlzIGJ1cyBpcyBnZW5lcmF0aW5nIGJhZCBwYXJpdHkuXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJUaGlzIGlzIGFuIGVycm9yICpvYnNlcnZlZCBieSosIG5vdCAqZ2VuZXJhdGVkIGJ5KiwgdGhpcyBjYXJkLlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiUENJIHBhcml0eSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkaXNhYmxlZC5cbiIpOwogCQkJY2hpcC0+aW50ZXJydXB0X21hc2sgJj0gfihJTlRfUFBFUlIgfCBJTlRfUklQRVJSKTsKIAkJCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0lOVF9NQVNLLCBjaGlwLT5pbnRlcnJ1cHRfbWFzayk7CiAJCX0KQEAgLTMyMyw5ICszMjksMTEgQEAKIAogCWlmIChpcnFfc3RhdHVzICYgRVJST1JfSU5URVJSVVBUUykgewogCQlpZiAoaXJxX3N0YXR1cyAmIChJTlRfRkJVUyB8IElOVF9GVFJHVCkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiRklGTyBvdmVycnVuLCBzdGF0dXMgJSMwOHhcbiIsIHN0YXR1cyk7CisJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJGSUZPIG92ZXJydW4sIHN0YXR1cyAlIzA4eFxuIiwgc3RhdHVzKTsKIAkJaWYgKGlycV9zdGF0dXMgJiBJTlRfT0NFUlIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnRlcm5hbCBSSVNDIGVycm9yLCBzdGF0dXMgJSMwOHhcbiIsIHN0YXR1cyk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiaW50ZXJuYWwgUklTQyBlcnJvciwgc3RhdHVzICUjMDh4XG4iLCBzdGF0dXMpOwogCQlpZiAoaXJxX3N0YXR1cyAmIChJTlRfUFBFUlIgfCBJTlRfUklQRVJSIHwgSU5UX1BBQk9SVCkpCiAJCQlzbmRfYnQ4N3hfcGNpX2Vycm9yKGNoaXAsIGlycV9zdGF0dXMpOwogCX0KQEAgLTc0Nyw3ICs3NTUsNyBAQAogCX0KIAljaGlwLT5tbWlvID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKCFjaGlwLT5tbWlvKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCByZW1hcCBpbyBtZW1vcnlcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCByZW1hcCBpbyBtZW1vcnlcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtNzYyLDcgKzc3MCw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9idDg3eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7CkBAIC03NzMsNyArNzgxLDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwogCSpyY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiAKQEAgLTg1MSwxNCArODU4LDE1IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmxhY2tsaXN0KTsgKytpKQogCQlpZiAoYmxhY2tsaXN0W2ldLnN1YnZlbmRvciA9PSBwY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYKIAkJICAgIGJsYWNrbGlzdFtpXS5zdWJkZXZpY2UgPT0gcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhcmQgJSMwNHgtJSMwNHg6JSMwNHggaGFzIG5vIGF1ZGlvXG4iLAorCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJImNhcmQgJSMwNHgtJSMwNHg6JSMwNHggaGFzIG5vIGF1ZGlvXG4iLAogCQkJCSAgICBwY2ktPmRldmljZSwgcGNpLT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gInVua25vd24gY2FyZCAlIzA0eC0lIzA0eDolIzA0eFxuIiwKKwlkZXZfaW5mbygmcGNpLT5kZXYsICJ1bmtub3duIGNhcmQgJSMwNHgtJSMwNHg6JSMwNHhcbiIsCiAJCSAgIHBjaS0+ZGV2aWNlLCBwY2ktPnN1YnN5c3RlbV92ZW5kb3IsIHBjaS0+c3Vic3lzdGVtX2RldmljZSk7Ci0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSwgYW5kLCAiCisJZGV2X2luZm8oJnBjaS0+ZGV2LCAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUsIGFuZCwgIgogCQkgICAiaWYgaXQgd29ya3MsIHRoZSBjb3JyZWN0IGRpZ2l0YWxfcmF0ZSBvcHRpb24gdG8gIgogCQkgICAiPGFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZz5cbiIpOwogCXJldHVybiBTTkRfQlQ4N1hfQk9BUkRfVU5LTk9XTjsKQEAgLTg4OCw3ICs4OTYsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTI1LDcgKzkzNCw3IEBACiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBfZXJyb3I7CiAJfQotCXNuZF9wcmludGsoS0VSTl9JTkZPICJidDg3eCVkOiBVc2luZyBib2FyZCAlZCwgJXNhbmFsb2csICVzZGlnaXRhbCAiCisJZGV2X2luZm8oY2FyZC0+ZGV2LCAiYnQ4N3glZDogVXNpbmcgYm9hcmQgJWQsICVzYW5hbG9nLCAlc2RpZ2l0YWwgIgogCQkgICAiKHJhdGUgJWQgSHopXG4iLCBkZXYsIGJvYXJkaWQsCiAJCSAgIGNoaXAtPmJvYXJkLm5vX2FuYWxvZyA/ICJubyAiIDogIiIsCiAJCSAgIGNoaXAtPmJvYXJkLm5vX2RpZ2l0YWwgPyAibm8gIiA6ICIiLCBjaGlwLT5ib2FyZC5kaWdfcmF0ZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKaW5kZXggZjRkYjU1OC4uZjk0Y2M2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpAQCAtNDE3LDEzICs0MTcsMTMgQEAKIAlpbnQgc3RhdHVzOwogCWludCByZXRyeTsKIAlpZiAoKHJlZyA+IDB4N2YpIHx8ICh2YWx1ZSA+IDB4MWZmKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpMmNfd3JpdGU6IGludmFsaWQgdmFsdWVzLlxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJpMmNfd3JpdGU6IGludmFsaWQgdmFsdWVzLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXRtcCA9IHJlZyA8PCAyNSB8IHZhbHVlIDw8IDE2OwogCS8qCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJJMkMtd3JpdGU6cmVnPTB4JXgsIHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsdWUpOworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJJMkMtd3JpdGU6cmVnPTB4JXgsIHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsdWUpOwogCSovCiAJLyogTm90IHN1cmUgd2hhdCB0aGlzIEkyQyBjaGFubmVsIGNvbnRyb2xzLiAqLwogCS8qIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgSTJDX0QwLCAwLCB0bXApOyAqLwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJCS8qIFdhaXQgdGlsbCB0aGUgdHJhbnNhY3Rpb24gZW5kcyAqLwogCQl3aGlsZSAoMSkgewogCQkJc3RhdHVzID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEkyQ19BLCAwKTsKLQkJCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJJMkM6c3RhdHVzPTB4JXhcbiIsIHN0YXR1cyk7Ki8KKwkJCS8qZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgIkkyQzpzdGF0dXM9MHgleFxuIiwgc3RhdHVzKTsqLwogCQkJdGltZW91dCsrOwogCQkJaWYgKChzdGF0dXMgJiBJMkNfQV9BRENfU1RBUlQpID09IDApCiAJCQkJYnJlYWs7CkBAIC00NTYsNyArNDU2LDcgQEAKIAl9CiAKIAlpZiAocmV0cnkgPT0gMTApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiV3JpdGluZyB0byBBREMgZmFpbGVkIVxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJXcml0aW5nIHRvIEFEQyBmYWlsZWQhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogICAgIApAQCAtNTE2LDcgKzUxNiw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNuZF9jYTAxMDZfY2hhbm5lbF9kYWMoc3RydWN0IHNuZF9jYTAxMDZfZGV0YWlscyAqZGV0YWlscywKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9jaGFubmVsX2RhYyhzdHJ1Y3Qgc25kX2NhMDEwNiAqY2hpcCwKKwkJCQkgIHN0cnVjdCBzbmRfY2EwMTA2X2RldGFpbHMgKmRldGFpbHMsCiAJCQkJICBpbnQgY2hhbm5lbF9pZCkKIHsKIAlzd2l0Y2ggKGNoYW5uZWxfaWQpIHsKQEAgLTUyOSw3ICs1MzAsNyBAQAogCWNhc2UgUENNX1VOS05PV05fQ0hBTk5FTDoKIAkJcmV0dXJuIChkZXRhaWxzLT5zcGlfZGFjICYgMHgwMDBmKSA+PiAoNCAqIDApOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiY2EwMTA2OiB1bmtub3duIGNoYW5uZWxfaWQgJWRcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY2EwMTA2OiB1bmtub3duIGNoYW5uZWxfaWQgJWRcbiIsCiAJCQkgICBjaGFubmVsX2lkKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC01MzksNyArNTQwLDcgQEAKIAkJCQkgICAgaW50IHBvd2VyKQogewogCWlmIChjaGlwLT5kZXRhaWxzLT5zcGlfZGFjKSB7Ci0JCWNvbnN0IGludCBkYWMgPSBzbmRfY2EwMTA2X2NoYW5uZWxfZGFjKGNoaXAtPmRldGFpbHMsCisJCWNvbnN0IGludCBkYWMgPSBzbmRfY2EwMTA2X2NoYW5uZWxfZGFjKGNoaXAsIGNoaXAtPmRldGFpbHMsCiAJCQkJCQkgICAgICAgY2hhbm5lbF9pZCk7CiAJCWNvbnN0IGludCByZWcgPSBzcGlfZGFjZF9yZWdbZGFjXTsKIAkJY29uc3QgaW50IGJpdCA9IHNwaV9kYWNkX2JpdFtkYWNdOwpAQCAtNTgzLDcgKzU4NCw3IEBACiAKIAljaGFubmVsLT51c2UgPSAxOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAJKi8KICAgICAgICAgLy9jaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfY2EwMTA2X3BjbV9jaGFubmVsX2ludGVycnVwdDsKQEAgLTY2MCw3ICs2NjEsOCBAQAogCiAJZXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCplcGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVwY20gPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJvcGVuX2NhcHR1cmVfY2hhbm5lbDogZmFpbGVkIGVwY20gYWxsb2NcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJvcGVuX2NhcHR1cmVfY2hhbm5lbDogZmFpbGVkIGVwY20gYWxsb2NcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKICAgICAgICAgfQogCWVwY20tPmVtdSA9IGNoaXA7CkBAIC02NzcsNyArNjc5LDcgQEAKIAogCWNoYW5uZWwtPnVzZSA9IDE7CiAJLyoKLSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAJKi8KICAgICAgICAgLy9jaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfY2EwMTA2X3BjbV9jaGFubmVsX2ludGVycnVwdDsKQEAgLTc3MSw3ICs3NzMsNyBAQAogCWludCBpOwogCQogI2lmIDAgLyogZGVidWcgKi8KLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAogCQkgICAicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgZm9ybWF0PTB4JXgsICIKIAkJICAgImNoYW5uZWxzPSVkLCBidWZmZXJfc2l6ZT0lbGQsIHBlcmlvZF9zaXplPSVsZCwgIgogCQkgICAicGVyaW9kcz0ldSwgZnJhbWVzX3RvX2J5dGVzPSVkXG4iLApAQCAtNzc5LDkgKzc4MSwxMSBAQAogCQkgICBydW50aW1lLT5jaGFubmVscywgcnVudGltZS0+YnVmZmVyX3NpemUsCiAJCSAgIHJ1bnRpbWUtPnBlcmlvZF9zaXplLCBydW50aW1lLT5wZXJpb2RzLAogCQkgICBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgMSkpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIHRhYmxlX2Jhc2U9JXBcbiIsCiAJCSAgIHJ1bnRpbWUtPmRtYV9hZGRyLCBydW50aW1lLT5kbWFfYXJlYSwgdGFibGVfYmFzZSk7Ci0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsCiAJCSAgIGVtdS0+YnVmZmVyLmFkZHIsIGVtdS0+YnVmZmVyLmFyZWEsIGVtdS0+YnVmZmVyLmJ5dGVzKTsKICNlbmRpZiAvKiBkZWJ1ZyAqLwogCS8qIFJhdGUgY2FuIGJlIHNldCBwZXIgY2hhbm5lbC4gKi8KQEAgLTg3Niw3ICs4ODAsNyBAQAogCXUzMiByZWc3MTsKIAkKICNpZiAwIC8qIGRlYnVnICovCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJICAgInByZXBhcmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsIGZvcm1hdD0weCV4LCAiCiAJCSAgICJjaGFubmVscz0lZCwgYnVmZmVyX3NpemU9JWxkLCBwZXJpb2Rfc2l6ZT0lbGQsICIKIAkJICAgInBlcmlvZHM9JXUsIGZyYW1lc190b19ieXRlcz0lZFxuIiwKQEAgLTg4NCw5ICs4ODgsMTEgQEAKIAkJICAgcnVudGltZS0+Y2hhbm5lbHMsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAogCQkgICBydW50aW1lLT5wZXJpb2Rfc2l6ZSwgcnVudGltZS0+cGVyaW9kcywKIAkJICAgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDEpKTsKLSAgICAgICAgc25kX3ByaW50ayhLRVJOX0RFQlVHICJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIHRhYmxlX2Jhc2U9JXBcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIiwKIAkJICAgcnVudGltZS0+ZG1hX2FkZHIsIHJ1bnRpbWUtPmRtYV9hcmVhLCB0YWJsZV9iYXNlKTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgZG1hX2J5dGVzKHNpemUpPSV4XG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIiwKIAkJICAgZW11LT5idWZmZXIuYWRkciwgZW11LT5idWZmZXIuYXJlYSwgZW11LT5idWZmZXIuYnl0ZXMpOwogI2VuZGlmIC8qIGRlYnVnICovCiAJLyogcmVnNzEgY29udHJvbHMgQURDIHJhdGUuICovCkBAIC05MzQsNyArOTQwLDcgQEAKIAogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJICAgICAgICJwcmVwYXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCBmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsICIKIAkgICAgICAgImJ1ZmZlcl9zaXplPSVsZCwgcGVyaW9kX3NpemU9JWxkLCBmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCiAJICAgICAgIGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsCkBAIC05ODIsMTMgKzk4OCwxMyBAQAogCQlydW50aW1lID0gcy0+cnVudGltZTsKIAkJZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJY2hhbm5lbCA9IGVwY20tPmNoYW5uZWxfaWQ7Ci0JCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7ICovCisJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsgKi8KIAkJZXBjbS0+cnVubmluZyA9IHJ1bm5pbmc7CiAJCWJhc2ljIHw9ICgweDEgPDwgY2hhbm5lbCk7CiAJCWV4dGVuZGVkIHw9ICgweDEwIDw8IGNoYW5uZWwpOwogICAgICAgICAgICAgICAgIHNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CiAgICAgICAgIH0KLQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImJhc2ljPTB4JXgsIGV4dGVuZGVkPTB4JXhcbiIsYmFzaWMsIGV4dGVuZGVkKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiYmFzaWM9MHgleCwgZXh0ZW5kZWQ9MHgleFxuIixiYXNpYywgZXh0ZW5kZWQpOyAqLwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtMTA3MCw3ICsxMDc2LDcgQEAKIAkJCXJldHVybiBwdHI7CiAJCXByZXZfcHRyID0gcHRyOwogCX0gd2hpbGUgKC0tdGltZW91dCk7Ci0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImNhMDEwNjogdW5zdGFibGUgRE1BIHBvaW50ZXIhXG4iKTsKKwlkZXZfd2FybihlbXUtPmNhcmQtPmRldiwgImNhMDEwNjogdW5zdGFibGUgRE1BIHBvaW50ZXIhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5Myw3ICsxMDk5LDcgQEAKICAgICAgICAgaWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgInB0cjEgPSAweCVseCwgcHRyMj0weCVseCwgcHRyPTB4JWx4LCAiCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInB0cjEgPSAweCVseCwgcHRyMj0weCVseCwgcHRyPTB4JWx4LCAiCiAJICAgICAgICJidWZmZXJfc2l6ZSA9IDB4JXgsIHBlcmlvZF9zaXplID0gMHgleCwgYml0cz0lZCwgcmF0ZT0lZFxuIiwKIAkgICAgICAgcHRyMSwgcHRyMiwgcHRyLCAoaW50KXJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAogCSAgICAgICAoaW50KXJ1bnRpbWUtPnBlcmlvZF9zaXplLCAoaW50KXJ1bnRpbWUtPmZyYW1lX2JpdHMsCkBAIC0xMjg0LDkgKzEyOTAsOSBAQAogCiAgICAgICAgIHN0YXQ3NiA9IHNuZF9jYTAxMDZfcHRyX3JlYWQoY2hpcCwgRVhURU5ERURfSU5ULCAwKTsKIAkvKgotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiaW50ZXJydXB0IHN0YXR1cyA9IDB4JTA4eCwgc3RhdDc2PTB4JTA4eFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHN0YXR1cyA9IDB4JTA4eCwgc3RhdDc2PTB4JTA4eFxuIiwKIAkJICAgc3RhdHVzLCBzdGF0NzYpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicHRyPTB4JTA4eFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHRyPTB4JTA4eFxuIiwKIAkJICAgc25kX2NhMDEwNl9wdHJfcmVhZChjaGlwLCBQTEFZQkFDS19QT0lOVEVSLCAwKSk7CiAJKi8KICAgICAgICAgbWFzayA9IDB4MTE7IC8qIDB4MSBmb3Igb25lIGhhbGYsIDB4MTAgZm9yIHRoZSBvdGhlciBoYWxmIHBlcmlvZC4gKi8KQEAgLTEyOTYsMTEgKzEzMDIsMTMgQEAKIC8qIEZJWE1FOiBTZWxlY3QgdGhlIGNvcnJlY3Qgc3Vic3RyZWFtIGZvciBwZXJpb2QgZWxhcHNlZCAqLwogCQkJaWYocGNoYW5uZWwtPnVzZSkgewogCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNoYW5uZWwtPmVwY20tPnN1YnN0cmVhbSk7Ci0JCQkJLy9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgWyVkXSB1c2VkXG4iLCBpKTsKKwkJCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7ICovCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCX0KLQkgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiY2hhbm5lbD0lcFxuIixwY2hhbm5lbCk7Ci0JICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQkvKgorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiY2hhbm5lbD0lcFxuIiwgcGNoYW5uZWwpOworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHN0YXQ3NlslZF0gPSAlMDh4LCB1c2U9JWQsIGNoYW5uZWw9JWRcbiIsIGksIHN0YXQ3NiwgcGNoYW5uZWwtPnVzZSwgcGNoYW5uZWwtPm51bWJlcik7CisJCSovCiAJCW1hc2sgPDw9IDE7CiAJfQogICAgICAgICBtYXNrID0gMHgxMTAwMDA7IC8qIDB4MSBmb3Igb25lIGhhbGYsIDB4MTAgZm9yIHRoZSBvdGhlciBoYWxmIHBlcmlvZC4gKi8KQEAgLTEzMTAsMTEgKzEzMTgsMTMgQEAKIC8qIEZJWE1FOiBTZWxlY3QgdGhlIGNvcnJlY3Qgc3Vic3RyZWFtIGZvciBwZXJpb2QgZWxhcHNlZCAqLwogCQkJaWYocGNoYW5uZWwtPnVzZSkgewogCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNoYW5uZWwtPmVwY20tPnN1YnN0cmVhbSk7Ci0JCQkJLy9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgWyVkXSB1c2VkXG4iLCBpKTsKKwkJCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7ICovCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCX0KLQkgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiY2hhbm5lbD0lcFxuIixwY2hhbm5lbCk7Ci0JICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQkvKgorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiY2hhbm5lbD0lcFxuIiwgcGNoYW5uZWwpOworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHN0YXQ3NlslZF0gPSAlMDh4LCB1c2U9JWQsIGNoYW5uZWw9JWRcbiIsIGksIHN0YXQ3NiwgcGNoYW5uZWwtPnVzZSwgcGNoYW5uZWwtPm51bWJlcik7CisJCSovCiAJCW1hc2sgPDw9IDE7CiAJfQogCkBAIC0xNjAzLDcgKzE2MTMsNyBAQAogCQlpbnQgc2l6ZSwgbjsKIAogCQlzaXplID0gQVJSQVlfU0laRShpMmNfYWRjX2luaXQpOwotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgIkkyQzphcnJheSBzaXplPTB4JXhcbiIsIHNpemUpOyAqLworCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiSTJDOmFycmF5IHNpemU9MHgleFxuIiwgc2l6ZSk7ICovCiAJCWZvciAobiA9IDA7IG4gPCBzaXplOyBuKyspCiAJCQlzbmRfY2EwMTA2X2kyY193cml0ZShjaGlwLCBpMmNfYWRjX2luaXRbbl1bMF0sCiAJCQkJCSAgICAgaTJjX2FkY19pbml0W25dWzFdKTsKQEAgLTE2NjgsNyArMTY3OCw3IEBACiAJCXJldHVybiBlcnI7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgdG8gc2V0IDMyYml0IG1hc2sgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlcnJvciB0byBzZXQgMzJiaXQgbWFzayBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xNjg5LDE0ICsxNjk5LDE0IEBACiAJY2hpcC0+cmVzX3BvcnQgPSByZXF1ZXN0X3JlZ2lvbihjaGlwLT5wb3J0LCAweDIwLCAic25kX2NhMDEwNiIpOwogCWlmICghY2hpcC0+cmVzX3BvcnQpIHsKIAkJc25kX2NhMDEwNl9mcmVlKGNoaXApOwotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgcG9ydFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIHRoZSBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jYTAxMDZfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfY2EwMTA2X2ZyZWUoY2hpcCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaXJxXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKQEAgLTE3MTIsNyArMTcyMiw3IEBACiAJLyogcmVhZCBzZXJpYWwgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmNoaXAtPnNlcmlhbCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmY2hpcC0+bW9kZWwpOwotCXByaW50ayhLRVJOX0lORk8gInNuZC1jYTAxMDY6IE1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsCisJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTW9kZWwgJTA0eCBSZXYgJTA4eCBTZXJpYWwgJTA4eFxuIiwKIAkgICAgICAgY2hpcC0+bW9kZWwsIHBjaS0+cmV2aXNpb24sIGNoaXAtPnNlcmlhbCk7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkNBMDEwNiIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJDQTAxMDYiKTsKQEAgLTE3MjYsNyArMTczNiw3IEBACiAJfQogCWNoaXAtPmRldGFpbHMgPSBjOwogCWlmIChzdWJzeXN0ZW1bZGV2XSkgewotCQlwcmludGsoS0VSTl9JTkZPICJzbmQtY2EwMTA2OiBTb3VuZCBjYXJkIG5hbWU9JXMsICIKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lPSVzLCAiCiAJCSAgICAgICAic3Vic3lzdGVtPTB4JXguIEZvcmNlZCB0byBzdWJzeXN0ZW09MHgleFxuIiwKIAkJICAgICAgIGMtPm5hbWUsIGNoaXAtPnNlcmlhbCwgc3Vic3lzdGVtW2Rldl0pOwogCX0KQEAgLTE4NDMsNyArMTg1Myw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xODY4LDE4ICsxODc5LDE2IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQlzbmRfcHJpbnRkZCgiY2EwMTA2OiBwcm9iZSBmb3IgTUlESSBjaGFubmVsIEEgLi4uIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJwcm9iZSBmb3IgTUlESSBjaGFubmVsIEEgLi4uIik7CiAJZXJyID0gc25kX2NhMDEwNl9taWRpKGNoaXAsIENBMDEwNl9NSURJX0NIQU5fQSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7Ci0Jc25kX3ByaW50ZGQoIiBkb25lLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICIgZG9uZS5cbiIpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlzbmRfY2EwMTA2X3Byb2NfaW5pdChjaGlwKTsKICNlbmRpZgogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2FfbWlkaS5jCmluZGV4IDhiYmRmMjYuLmI5MWM3ZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2FfbWlkaS5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2FfbWlkaS5jCkBAIC00Niw3ICs0Niw3IEBACiAJCWNhX21pZGlfcmVhZF9kYXRhKG1pZGkpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAodGltZW91dCA8PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYV9taWRpX2NsZWFyX3J4OiB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKKwkJcHJfZXJyKCJjYV9taWRpX2NsZWFyX3J4OiB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKIAkJCSAgIGNhX21pZGlfcmVhZF9zdGF0KG1pZGkpKTsKICNlbmRpZgogfQpAQCAtMTEzLDcgKzExMyw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPmlucHV0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIW9rKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYV9taWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHgleCAoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpISEhXG4iLAorCQlwcl9lcnIoImNhX21pZGlfY21kOiAweCV4IGZhaWxlZCBhdCAweCV4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCiAJCQkgICBjbWQsCiAJCQkgICBtaWRpLT5nZXRfZGV2X2lkX3BvcnQobWlkaS0+ZGV2X2lkKSwKIAkJCSAgIGNhX21pZGlfcmVhZF9zdGF0KG1pZGkpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NtaXBjaS5jIGIvc291bmQvcGNpL2NtaXBjaS5jCmluZGV4IDI3NTVlYzUuLjEyYzMxOGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jbWlwY2kuYworKysgYi9zb3VuZC9wY2kvY21pcGNpLmMKQEAgLTc5Niw3ICs3OTYsNyBAQAogCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCiAJCXJlYy0+Zm10IHw9IDB4MDE7CiAJaWYgKHJlYy0+aXNfZGFjICYmIHNldF9kYWNfY2hhbm5lbHMoY20sIHJlYywgcnVudGltZS0+Y2hhbm5lbHMpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJjYW5ub3Qgc2V0IGRhYyBjaGFubmVsc1xuIik7CisJCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImNhbm5vdCBzZXQgZGFjIGNoYW5uZWxzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04MjcsNyArODI3LDcgQEAKIAllbHNlCiAJCWNtLT5jdHJsIHw9IHZhbDsKIAlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsKTsKLQkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDAgPSAlMDh4XG4iLCBjbS0+Y3RybCk7CisJLyogZGV2X2RiZyhjbS0+Y2FyZC0+ZGV2LCAiZnVuY3RybDAgPSAlMDh4XG4iLCBjbS0+Y3RybCk7ICovCiAKIAkvKiBzZXQgc2FtcGxlIHJhdGUgKi8KIAlmcmVxID0gMDsKQEAgLTg1MCw3ICs4NTAsNyBAQAogCQl2YWwgfD0gKGZyZXEgPDwgQ01fQVNGQ19TSElGVCkgJiBDTV9BU0ZDX01BU0s7CiAJfQogCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19GVU5DVFJMMSwgdmFsKTsKLQkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDEgPSAlMDh4XG4iLCB2YWwpOworCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImZ1bmN0cmwxID0gJTA4eFxuIiwgdmFsKTsKIAogCS8qIHNldCBmb3JtYXQgKi8KIAl2YWwgPSBzbmRfY21pcGNpX3JlYWQoY20sIENNX1JFR19DSEZPUk1BVCk7CkBAIC04NjYsNyArODY2LDcgQEAKIAkJdmFsIHw9IGZyZXFfZXh0IDw8IChyZWMtPmNoICogMik7CiAJfQogCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19DSEZPUk1BVCwgdmFsKTsKLQkvL3NuZF9wcmludGQoImNtaXBjaTogY2hmb3JtYXQgPSAlMDh4XG4iLCB2YWwpOworCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImNoZm9ybWF0ID0gJTA4eFxuIiwgdmFsKTsKIAogCWlmICghcmVjLT5pc19kYWMgJiYgY20tPmNoaXBfdmVyc2lvbikgewogCQlpZiAocnVudGltZS0+cmF0ZSA+IDQ0MTAwKQpAQCAtOTA0LDcgKzkwNCw3IEBACiAJCWNtLT5jdHJsIHw9IGNoZW47CiAJCS8qIGVuYWJsZSBjaGFubmVsICovCiAJCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19GVU5DVFJMMCwgY20tPmN0cmwpOwotCQkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDAgPSAlMDh4XG4iLCBjbS0+Y3RybCk7CisJCWRldl9kYmcoY20tPmNhcmQtPmRldiwgImZ1bmN0cmwwID0gJTA4eFxuIiwgY20tPmN0cmwpOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCXJlYy0+cnVubmluZyA9IDA7CkBAIC05NTIsNyArOTUyLDcgQEAKIAkJaWYgKHJlbSA8IHJlYy0+ZG1hX3NpemUpCiAJCQlnb3RvIG9rOwogCX0gCi0JcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IGludmFsaWQgUENNIHBvaW50ZXI6ICUjeFxuIiwgcmVtKTsKKwlkZXZfZXJyKGNtLT5jYXJkLT5kZXYsICJpbnZhbGlkIFBDTSBwb2ludGVyOiAlI3hcbiIsIHJlbSk7CiAJcmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKIG9rOgogCXB0ciA9IChyZWMtPmRtYV9zaXplIC0gKHJlbSArIDEpKSA+PiByZWMtPnNoaWZ0OwpAQCAtMjg4OSwxMyArMjg4OSwxMyBAQAogCX0KIAogCWlmICghcikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjbWlwY2k6IGNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnRzXG4iKTsKKwkJZGV2X3dhcm4oY20tPmNhcmQtPmRldiwgImNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnRzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAljbS0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY20tPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjk5NSwxMyArMjk5NSwxNCBAQAogCiAJCWlmIChzbmRfb3BsM19jcmVhdGUoY20tPmNhcmQsIGlvc3ludGgsIGlvc3ludGggKyAyLAogCQkJCSAgICBPUEwzX0hXX09QTDMsIDAsICZvcGwzKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBubyBPUEwgZGV2aWNlIGF0ICUjbHgsICIKLQkJCSAgICAgICAic2tpcHBpbmcuLi5cbiIsIGlvc3ludGgpOworCQkJZGV2X2VycihjbS0+Y2FyZC0+ZGV2LAorCQkJCSJubyBPUEwgZGV2aWNlIGF0ICUjbHgsIHNraXBwaW5nLi4uXG4iLAorCQkJCWlvc3ludGgpOwogCQkJZ290byBkaXNhYmxlX2ZtOwogCQl9CiAJfQogCWlmICgoZXJyID0gc25kX29wbDNfaHdkZXBfbmV3KG9wbDMsIDAsIDEsIE5VTEwpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IGNhbm5vdCBjcmVhdGUgT1BMMyBod2RlcFxuIik7CisJCWRldl9lcnIoY20tPmNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgT1BMMyBod2RlcFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiAwOwpAQCAtMzA2MCw3ICszMDYxLDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NtaXBjaV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNtKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2NtaXBjaV9mcmVlKGNtKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0zMTkyLDggKzMxOTMsOSBAQAogCQkJLyogZW5hYmxlIFVBUlQgKi8KIAkJCXNuZF9jbWlwY2lfc2V0X2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLCBDTV9VQVJUX0VOKTsKIAkJCWlmIChpbmIoaW9taWRpICsgMSkgPT0gMHhmZikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBlbmFibGUgTVBVLTQwMSBwb3J0IgotCQkJCQkgICAiIGF0ICUjbHhcbiIsIGlvbWlkaSk7CisJCQkJZGV2X2VycihjbS0+Y2FyZC0+ZGV2LAorCQkJCQkiY2Fubm90IGVuYWJsZSBNUFUtNDAxIHBvcnQgYXQgJSNseFxuIiwKKwkJCQkJaW9taWRpKTsKIAkJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLAogCQkJCQkJICAgICBDTV9VQVJUX0VOKTsKIAkJCQlpb21pZGkgPSAwOwpAQCAtMzIzNyw3ICszMjM5LDggQEAKIAkJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgOiAwKSB8CiAJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywKIAkJCQkJICAgICAgIC0xLCAmY20tPnJtaWRpKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogbm8gVUFSVDQwMSBkZXZpY2UgYXQgMHglbHhcbiIsIGlvbWlkaSk7CisJCQlkZXZfZXJyKGNtLT5jYXJkLT5kZXYsCisJCQkJIm5vIFVBUlQ0MDEgZGV2aWNlIGF0IDB4JWx4XG4iLCBpb21pZGkpOwogCQl9CiAJfQogCkBAIC0zMjU0LDggKzMyNTcsNiBAQAogCWlmIChzbmRfY21pcGNpX2NyZWF0ZV9nYW1lcG9ydChjbSwgZGV2KSA8IDApCiAJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfRlVOQ1RSTDEsIENNX0pZU1RLX0VOKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY21pcGNpID0gY207CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjgwLDcgKzMyODEsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAkKQEAgLTMzODEsOCArMzM4Myw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCAxZGM3OTNlLi40M2QxZjkxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC01NjQsNyArNTY0LDggQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyB3cml0ZSBwcm9ibGVtLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCByZWcsIHZhbCk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJBQyc5NyB3cml0ZSBwcm9ibGVtLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCByZWcsIHZhbCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfY3M0MjgxX2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCkBAIC02MjQsNyArNjI1LDggQEAKIAkJCWdvdG8gX19vazE7CiAJfQogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ0NUTF9EQ1YpLCByZWcgPSAweCV4XG4iLCByZWcpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ0NUTF9EQ1YpLCByZWcgPSAweCV4XG4iLCByZWcpOwogCXJlc3VsdCA9IDB4ZmZmZjsKIAlnb3RvIF9fZW5kOwogCQpAQCAtNjQzLDcgKzY0NSw4IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJBQyc5NyByZWFkIHByb2JsZW0gKEFDU1RTX1ZTVFMpLCByZWcgPSAweCV4XG4iLCByZWcpOwogCXJlc3VsdCA9IDB4ZmZmZjsKIAlnb3RvIF9fZW5kOwogCkBAIC04MzUsOCArODM4LDkgQEAKIAlzdHJ1Y3QgY3M0MjgxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAiRENDID0gMHgleCwgYnVmZmVyX3NpemUgPSAweCV4LCBqaWZmaWVzID0gJWxpXG4iLAotCSAgICAgICBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgZG1hLT5yZWdEQ0MpLCBydW50aW1lLT5idWZmZXJfc2l6ZSwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIkRDQyA9IDB4JXgsIGJ1ZmZlcl9zaXplID0gMHgleCwgamlmZmllcyA9ICVsaVxuIiwKKwkJc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIGRtYS0+cmVnRENDKSwgcnVudGltZS0+YnVmZmVyX3NpemUsCiAJICAgICAgIGppZmZpZXMpOwogCSovCiAJcmV0dXJuIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0KQEAgLTEyNjUsNyArMTI2OSw4IEBACiAKIAljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQyODE6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEzNjEsNyArMTM2Niw3IEBACiAJY2hpcC0+aXJxID0gLTE7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlpZiAoZHVhbF9jb2RlYyA8IDAgfHwgZHVhbF9jb2RlYyA+IDMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBkdWFsX2NvZGVjIG9wdGlvbiAlZFxuIiwgZHVhbF9jb2RlYyk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiaW52YWxpZCBkdWFsX2NvZGVjIG9wdGlvbiAlZFxuIiwgZHVhbF9jb2RlYyk7CiAJCWR1YWxfY29kZWMgPSAwOwogCX0KIAljaGlwLT5kdWFsX2NvZGVjID0gZHVhbF9jb2RlYzsKQEAgLTEzODMsNyArMTM4OCw3IEBACiAJCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY3M0MjgxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9jczQyODFfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTQwMiw4ICsxNDA3LDYgQEAKIAogCXNuZF9jczQyODFfcHJvY19pbml0KGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MjUsNyArMTQyOCw4IEBACiAJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ0ZMUiwgQkEwX0NGTFJfREVGQVVMVCk7CiAJCXRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0ZMUik7CiAJCWlmICh0bXAgIT0gQkEwX0NGTFJfREVGQVVMVCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ0ZMUiBzZXR1cCBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkNGTFIgc2V0dXAgZmFpbGVkICgweCV4KVxuIiwgdG1wKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQpAQCAtMTQzNiwxMSArMTQ0MCwxMyBAQAogCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ1dQUiwgMHg0MjgxKTsKIAkKIAlpZiAoKHRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfU0VSQzEpKSAhPSAoQkEwX1NFUkMxX1NPMUVOIHwgQkEwX1NFUkMxX0FDOTcpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlNFUkMxIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlNFUkMxIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoKHRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfU0VSQzIpKSAhPSAoQkEwX1NFUkMyX1NJMUVOIHwgQkEwX1NFUkMyX0FDOTcpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlNFUkMyIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlNFUkMyIEFDJzk3IGNoZWNrIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTUwMiw3ICsxNTA4LDcgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRExMUkRZIG5vdCBzZWVuXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkRMTFJEWSBub3Qgc2VlblxuIik7CiAJcmV0dXJuIC1FSU87CiAKICAgICAgIF9fb2swOgpAQCAtMTUyOCw3ICsxNTM0LDkgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAibmV2ZXIgcmVhZCBjb2RlYyByZWFkeSBmcm9tIEFDJzk3ICgweCV4KVxuIiwgc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NUUykpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkibmV2ZXIgcmVhZCBjb2RlYyByZWFkeSBmcm9tIEFDJzk3ICgweCV4KVxuIiwKKwkJc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NUUykpOwogCXJldHVybiAtRUlPOwogCiAgICAgICBfX29rMToKQEAgLTE1MzksNyArMTU0Nyw4IEBACiAJCQkJZ290byBfX2NvZGVjMl9vazsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJzZWNvbmRhcnkgY29kZWMgZG9lc24ndCByZXNwb25kLiBkaXNhYmxlIGl0Li4uXG4iKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJzZWNvbmRhcnkgY29kZWMgZG9lc24ndCByZXNwb25kLiBkaXNhYmxlIGl0Li4uXG4iKTsKIAkJY2hpcC0+ZHVhbF9jb2RlYyA9IDA7CiAJX19jb2RlYzJfb2s6IDsKIAl9CkBAIC0xNTY5LDcgKzE1NzgsNyBAQAogCiAJaWYgKC0tcmV0cnlfY291bnQgPiAwKQogCQlnb3RvIF9fcmV0cnk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAibmV2ZXIgcmVhZCBJU1YzIGFuZCBJU1Y0IGZyb20gQUMnOTdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibmV2ZXIgcmVhZCBJU1YzIGFuZCBJU1Y0IGZyb20gQUMnOTdcbiIpOwogCXJldHVybiAtRUlPOwogCiAgICAgICBfX29rMjoKQEAgLTE5MTcsNyArMTkyNiw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMDU1LDggKzIwNjUsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0MjgxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYwppbmRleCBiMDM0OTgzLi5hZjBlYWNiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKQEAgLTg4LDcgKzg4LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfY3M0Nnh4X2NyZWF0ZShjYXJkLCBwY2ksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDA2MjM5OGUuLjMyYjQ0ZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogCXRtcCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDVEwpOwogCWlmICgodG1wICYgQUNDVExfVkZSTSkgPT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAgImNzNDZ4eDogQUNDVExfVkZSTSBub3Qgc2V0IDB4JXhcbiIsdG1wKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiQUNDVExfVkZSTSBub3Qgc2V0IDB4JXhcbiIsIHRtcCk7CiAJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsICh0bXAgJiAofkFDQ1RMX0VTWU4pKSB8IEFDQ1RMX1ZGUk0gKTsKIAkJbXNsZWVwKDUwKTsKIAkJdG1wID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NUTCArIG9mZnNldCk7CkBAIC0xNjgsNyArMTY4LDggQEAKIAkJCWdvdG8gb2sxOwogCX0KIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKIAlyZXN1bHQgPSAweGZmZmY7CiAJZ290byBlbmQ7CiAJCkBAIC0xODcsNyArMTg4LDkgQEAKIAkJdWRlbGF5KDEwKTsKIAl9CiAJCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgY29kZWNfaW5kZXggJWQsIHJlZyA9IDB4JXhcbiIsIGNvZGVjX2luZGV4LCByZWcpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgY29kZWNfaW5kZXggJWQsIHJlZyA9IDB4JXhcbiIsCisJCWNvZGVjX2luZGV4LCByZWcpOwogCXJlc3VsdCA9IDB4ZmZmZjsKIAlnb3RvIGVuZDsKIApAQCAtMTk3LDcgKzIwMCw4IEBACiAJICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCiAJICovCiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJlKSByZWcgPSAweCV4LCB2YWwgPSAweCV4LCBCQTBfQUNDQUQgPSAweCV4XG4iLCByZWcsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJlKSByZWcgPSAweCV4LCB2YWwgPSAweCV4LCBCQTBfQUNDQUQgPSAweCV4XG4iLCByZWcsCiAJCQlzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDU0RBKSwKIAkJCXNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDQUQpKTsKICNlbmRpZgpAQCAtMjg2LDcgKzI5MCw5IEBACiAJCQlnb3RvIGVuZDsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyB3cml0ZSBwcm9ibGVtLCBjb2RlY19pbmRleCA9ICVkLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBjb2RlY19pbmRleCwgcmVnLCB2YWwpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgd3JpdGUgcHJvYmxlbSwgY29kZWNfaW5kZXggPSAlZCwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwKKwkJY29kZWNfaW5kZXgsIHJlZywgdmFsKTsKICBlbmQ6CiAJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgLTEpOwogfQpAQCAtNjA4LDggKzYxNCw4IEBACiAJfQogICAKIAlpZihzdGF0dXMgJiBTRVJCU1RfV0JTWSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGZhaWx1cmUgd2FpdGluZyBmb3IgIgotCQkJICAgIkZJRk8gY29tbWFuZCB0byBjb21wbGV0ZVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImZhaWx1cmUgd2FpdGluZyBmb3IgRklGTyBjb21tYW5kIHRvIGNvbXBsZXRlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02NDYsNyArNjUyLDkgQEAKIAkJICogIE1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgRklGTyB3cml0ZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KIAkJICovCiAJCWlmIChjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDEpKSB7Ci0JCQlzbmRfcHJpbnRkZCAoImZhaWxlZCB3YWl0aW5nIGZvciBGSUZPIGF0IGFkZHIgKCUwMlgpXG4iLGlkeCk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsCisJCQkJaWR4KTsKIAogCQkJaWYgKHBvd2VyZG93bikKIAkJCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsKQEAgLTY5NCw3ICs3MDIsNyBAQAogCX0KIAogCWlmIChzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX1NQQ1IpICYgU1BDUl9SVU5GUikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcHJvY19zdG9wKHN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwKQpAQCAtMTA1NCw3ICsxMDYyLDggQEAKIAkJY3BjbS0+cGNtX2NoYW5uZWwgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fY2hhbm5lbCAoY2hpcCwgc2FtcGxlX3JhdGUsIAogCQkJCQkJCQkgICBjcGNtLCBjcGNtLT5od19idWYuYWRkcixjcGNtLT5wY21fY2hhbm5lbF9pZCk7CiAJCWlmIChjcGNtLT5wY21fY2hhbm5lbCA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGZhaWxlZCB0byBjcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGNyZWF0ZSB2aXJ0dWFsIFBDTSBjaGFubmVsXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWNwY20tPnBjbV9jaGFubmVsLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwpAQCAtMTA2Nyw3ICsxMDc2LDggQEAKIAkJaWYgKCAoY3BjbS0+cGNtX2NoYW5uZWwgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fY2hhbm5lbCAoY2hpcCwgc2FtcGxlX3JhdGUsIGNwY20sIAogCQkJCQkJCQkJIGNwY20tPmh3X2J1Zi5hZGRyLAogCQkJCQkJCQkJIGNwY20tPnBjbV9jaGFubmVsX2lkKSkgPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsZWQgdG8gcmUtY3JlYXRlIHZpcnR1YWwgUENNIGNoYW5uZWxcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWxlZCB0byByZS1jcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0xMTE2LDcgKzExMjYsOCBAQAogCQkgcmV0dXJuIC1FSU5WQUw7CiAJIH0KIAotCXNuZF9wcmludGRkICgicGVyaW9kX3NpemUgKCVkKSwgcGVyaW9kcyAoJWQpIGJ1ZmZlcl9zaXplKCVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInBlcmlvZF9zaXplICglZCksIHBlcmlvZHMgKCVkKSBidWZmZXJfc2l6ZSglZClcbiIsCiAJCSAgICAgcGVyaW9kX3NpemUsIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyksCiAJCSAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKICNlbmRpZgpAQCAtMTUzMSwyMiArMTU0MiwyMCBAQAogCiBzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzbmRfcHJpbnRkZCgib3BlbiBmcm9udCBjaGFubmVsXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICJvcGVuIGZyb250IGNoYW5uZWxcbiIpOwogCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9NQUlOX0NIQU5ORUwpOwogfQogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAogc3RhdGljIGludCBzbmRfY3M0Nnh4X3BsYXliYWNrX29wZW5fcmVhcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzbmRfcHJpbnRkZCgib3BlbiByZWFyIGNoYW5uZWxcbiIpOwotCisJZGV2X2RiZyhzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCAib3BlbiByZWFyIGNoYW5uZWxcbiIpOwogCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9SRUFSX0NIQU5ORUwpOwogfQogCiBzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jbGZlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXNuZF9wcmludGRkKCJvcGVuIGNlbnRlciAtIExGRSBjaGFubmVsXG4iKTsKLQorCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIm9wZW4gY2VudGVyIC0gTEZFIGNoYW5uZWxcbiIpOwogCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9DRU5URVJfTEZFX0NIQU5ORUwpOwogfQogCkBAIC0xNTU0LDcgKzE1NjMsNyBAQAogewogCXN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCi0Jc25kX3ByaW50ZGQoIm9wZW4gcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm9wZW4gcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNwb3NfbXV0ZXgpOwogCWNzNDZ4eF9pZWM5NThfcHJlX29wZW4gKGNoaXApOwpAQCAtMTU3MCw3ICsxNTc5LDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogICAKLQlzbmRfcHJpbnRkZCgiY2xvc2UgcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNsb3NlIHJhdyBpZWM5NTggY2hhbm5lbFxuIik7CiAKIAllcnIgPSBzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlKHN1YnN0cmVhbSk7CiAKQEAgLTI0MjEsMTAgKzI0MzAsMTAgQEAKIAogCS8qIHNldCB0aGUgZGVzaXJlZCBDT0RFQyBtb2RlICovCiAJaWYgKGFjOTctPm51bSA9PSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCkgewotCQlzbmRfcHJpbnRkZCgiY3M0Nnh4OiBDT0RFQzEgbW9kZSAlMDR4XG4iLCAweDApOworCQlkZXZfZGJnKGFjOTctPmJ1cy0+Y2FyZC0+ZGV2LCAiQ09ERUMxIG1vZGUgJTA0eFxuIiwgMHgwKTsKIAkJc25kX2NzNDZ4eF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfQ1NSX0FDTU9ERSwgMHgwKTsKIAl9IGVsc2UgaWYgKGFjOTctPm51bSA9PSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSB7Ci0JCXNuZF9wcmludGRkKCJjczQ2eHg6IENPREVDMiBtb2RlICUwNHhcbiIsIDB4Myk7CisJCWRldl9kYmcoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsICJDT0RFQzIgbW9kZSAlMDR4XG4iLCAweDMpOwogCQlzbmRfY3M0Nnh4X2FjOTdfd3JpdGUoYWM5NywgQUM5N19DU1JfQUNNT0RFLCAweDMpOwogCX0gZWxzZSB7CiAJCXNuZF9CVUcoKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAuLi4gKi8KQEAgLTI0NTYsNyArMjQ2NSw4IEBACiAJCW1zbGVlcCgxMCk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQ1M0Nnh4IHNlY29uZGFyeSBjb2RlYyBkb2Vzbid0IHJlc3BvbmQhXG4iKTsgIAorCWRldl9lcnIoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsCisJCSJDUzQ2eHggc2Vjb25kYXJ5IGNvZGVjIGRvZXNuJ3QgcmVzcG9uZCFcbiIpOwogfQogI2VuZGlmCiAKQEAgLTI0NzYsNyArMjQ4Niw4IEBACiAJCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgQUM5N19SRVNFVCwgMCwgY29kZWMpOwogCQl1ZGVsYXkoMTApOwogCQlpZiAoc25kX2NzNDZ4eF9jb2RlY19yZWFkKGNoaXAsIEFDOTdfUkVTRVQsIGNvZGVjKSAmIDB4ODAwMCkgewotCQkJc25kX3ByaW50ZGQoInNuZF9jczQ2eHg6IHNlY29uYWRyeSBjb2RlYyBub3QgcHJlc2VudFxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkic2Vjb25hZHJ5IGNvZGVjIG5vdCBwcmVzZW50XG4iKTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KIAl9CkBAIC0yNDg5LDcgKzI1MDAsNyBAQAogCQl9CiAJCW1zbGVlcCgxMCk7CiAJfQotCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBjb2RlYyAlZCBkZXRlY3Rpb24gdGltZW91dFxuIiwgY29kZWMpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgJWQgZGV0ZWN0aW9uIHRpbWVvdXRcbiIsIGNvZGVjKTsKIAlyZXR1cm4gLUVOWElPOwogfQogCkBAIC0yNTA5LDcgKzI1MjAsNyBAQAogCiAJLyogZGV0ZWN0IHByaW1hcnkgY29kZWMgKi8KIAljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDA7Ci0Jc25kX3ByaW50ZGQoInNuZF9jczQ2eHg6IGRldGVjdGluZyBwcmltYXJ5IGNvZGVjXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRldGVjdGluZyBwcmltYXJ5IGNvZGVjXG4iKTsKIAlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjYXJkLCAwLCAmb3BzLCBjaGlwLCAmY2hpcC0+YWM5N19idXMpKSA8IDApCiAJCXJldHVybiBlcnI7CiAJY2hpcC0+YWM5N19idXMtPnByaXZhdGVfZnJlZSA9IHNuZF9jczQ2eHhfbWl4ZXJfZnJlZV9hYzk3X2J1czsKQEAgLTI1MTksNyArMjUzMCw3IEBACiAJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAxOwogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAotCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBkZXRlY3Rpbmcgc2Vjb25hZHJ5IGNvZGVjXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRldGVjdGluZyBzZWNvbmFkcnkgY29kZWNcbiIpOwogCS8qIHRyeSBkZXRlY3QgYSBzZWNvbmRhcnkgY29kZWMgKi8KIAlpZiAoISBjczQ2eHhfZGV0ZWN0X2NvZGVjKGNoaXAsIENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpKQogCQljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDI7CkBAIC0yNTU0LDcgKzI1NjUsNyBAQAogCX0KIAkvKiBkbyBzb3VuZGNhcmQgc3BlY2lmaWMgbWl4ZXIgc2V0dXAgKi8KIAlpZiAoY2hpcC0+bWl4ZXJfaW5pdCkgewotCQlzbmRfcHJpbnRkZCAoImNhbGxpbmcgY2hpcC0+bWl4ZXJfaW5pdChjaGlwKTtcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNhbGxpbmcgY2hpcC0+bWl4ZXJfaW5pdChjaGlwKTtcbiIpOwogCQljaGlwLT5taXhlcl9pbml0KGNoaXApOwogCX0KICNlbmRpZgpAQCAtMjgwMSw3ICsyODEyLDggQEAKIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzEzOCw4ICszMTUwLDEwIEBACiAJfQogCiAKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjcmVhdGUgLSBuZXZlciByZWFkIGNvZGVjIHJlYWR5IGZyb20gQUMnOTdcbiIpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIml0IGlzIG5vdCBwcm9iYWJseSBidWcsIHRyeSB0byB1c2UgQ1M0MjM2IGRyaXZlclxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJjcmVhdGUgLSBuZXZlciByZWFkIGNvZGVjIHJlYWR5IGZyb20gQUMnOTdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiaXQgaXMgbm90IHByb2JhYmx5IGJ1ZywgdHJ5IHRvIHVzZSBDUzQyMzYgZHJpdmVyXG4iKTsKIAlyZXR1cm4gLUVJTzsKICBvazE6CiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUApAQCAtMzE1Nyw3ICszMTcxLDggQEAKIAkJICogIE1ha2Ugc3VyZSBDT0RFQyBpcyBSRUFEWS4KIAkJICovCiAJCWlmICghKHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMyKSAmIEFDU1RTX0NSRFkpKQotCQkJc25kX3ByaW50ZGQoImNzNDZ4eDogbmV2ZXIgcmVhZCBjYXJkIHJlYWR5IGZyb20gc2Vjb25kYXJ5IEFDJzk3XG4iKTsKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBzZWNvbmRhcnkgQUMnOTdcbiIpOwogCX0KICNlbmRpZgogCkBAIC0zMTg3LDE3ICszMjAyLDIxIEBACiAJfQogCiAjaWZuZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjcmVhdGUgLSBuZXZlciByZWFkIElTVjMgJiBJU1Y0IGZyb20gQUMnOTdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiY3JlYXRlIC0gbmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKIAlyZXR1cm4gLUVJTzsKICNlbHNlCiAJLyogVGhpcyBtYXkgaGFwcGVuIG9uIGEgY29sZCBib290IHdpdGggYSBUZXJyYXRlYyBTaVhQYWNrIDUuMS4KIAkgICBSZWxvYWRpbmcgdGhlIGRyaXZlciBtYXkgaGVscCwgaWYgdGhlcmUncyBvdGhlciBzb3VuZGNhcmRzIAogCSAgIHdpdGggdGhlIHNhbWUgcHJvYmxlbSBJIHdvdWxkIGxpa2UgdG8ga25vdy4gKEJlbm55KSAqLwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1I6IHNuZC1jczQ2eHg6IG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiICAgICAgIFRyeSByZWxvYWRpbmcgdGhlIEFMU0EgZHJpdmVyLCBpZiB5b3UgZmluZCBzb21ldGhpbmdcbiIpOwotICAgICAgICBzbmRfcHJpbnRrKEtFUk5fRVJSICIgICAgICAgYnJva2VuIG9yIG5vdCB3b3JraW5nIG9uIHlvdXIgc291bmRjYXJkIHVwb25cbiIpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIiAgICAgICB0aGlzIG1lc3NhZ2UgcGxlYXNlIHJlcG9ydCB0byBhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIlRyeSByZWxvYWRpbmcgdGhlIEFMU0EgZHJpdmVyLCBpZiB5b3UgZmluZCBzb21ldGhpbmdcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiYnJva2VuIG9yIG5vdCB3b3JraW5nIG9uIHlvdXIgc291bmRjYXJkIHVwb25cbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkidGhpcyBtZXNzYWdlIHBsZWFzZSByZXBvcnQgdG8gYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnXG4iKTsKIAogCXJldHVybiAtRUlPOwogI2VuZGlmCkBAIC0zMjY2LDEzICszMjg1LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IENTNDZYWF9EU1BfTU9EVUxFUzsgaSsrKSB7CiAJCWVyciA9IGxvYWRfZmlybXdhcmUoY2hpcCwgJmNoaXAtPm1vZHVsZXNbaV0sIG1vZHVsZV9uYW1lc1tpXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJmaXJtd2FyZSBsb2FkIGVycm9yIFslc11cbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImZpcm13YXJlIGxvYWQgZXJyb3IgWyVzXVxuIiwKIAkJCQkgICBtb2R1bGVfbmFtZXNbaV0pOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQllcnIgPSBjczQ2eHhfZHNwX2xvYWRfbW9kdWxlKGNoaXAsIGNoaXAtPm1vZHVsZXNbaV0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW1hZ2UgZG93bmxvYWQgZXJyb3IgWyVzXVxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW1hZ2UgZG93bmxvYWQgZXJyb3IgWyVzXVxuIiwKIAkJCQkgICBtb2R1bGVfbmFtZXNbaV0pOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMzI4OCw3ICszMzA3LDcgQEAKIAkvKiBvbGQgaW1hZ2UgKi8KIAllcnIgPSBzbmRfY3M0Nnh4X2Rvd25sb2FkX2ltYWdlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImltYWdlIGRvd25sb2FkIGVycm9yXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJpbWFnZSBkb3dubG9hZCBlcnJvclxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0zMzQxLDcgKzMzNjAsNyBAQAogCXUzMiBpZHgsIHZhbGlkX3Nsb3RzLHRtcCxwb3dlcmRvd24gPSAwOwogCXUxNiBtb2RlbV9wb3dlcixwaW5fY29uZmlnLGxvZ2ljX3R5cGU7CiAKLQlzbmRfcHJpbnRkZCAoImNzNDZ4eDogY3M0Nnh4X3NldHVwX2VhcGRfc2xvdCgpK1xuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjczQ2eHhfc2V0dXBfZWFwZF9zbG90KCkrXG4iKTsKIAogCS8qCiAJICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdApAQCAtMzM1OSw3ICszMzc4LDggQEAKIAkgKiBzdHVmZi4KIAkgKi8KIAlpZihjaGlwLT5ucl9hYzk3X2NvZGVjcyAhPSAyKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJjczQ2eHg6IGNzNDZ4eF9zZXR1cF9lYXBkX3Nsb3QoKSAtIG5vIHNlY29uZGFyeSBjb2RlYyBjb25maWd1cmVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY3M0Nnh4X3NldHVwX2VhcGRfc2xvdCgpIC0gbm8gc2Vjb25kYXJ5IGNvZGVjIGNvbmZpZ3VyZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM0MDAsNyArMzQyMCw3IEBACiAJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ09TViwgdmFsaWRfc2xvdHMpOwogCiAJaWYgKCBjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDEpICkgewotCSAgc25kX3ByaW50ZGQoIkZJRk8gaXMgYnVzeVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBpcyBidXN5XG4iKTsKIAkgIAogCSAgcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzQyMSw3ICszNDQxLDkgQEAKIAkJICogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZQogCQkgKi8KIAkJaWYgKCBjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDIwMCkgKSB7Ci0JCQlzbmRfcHJpbnRkZCgiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsaWR4KTsKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJmYWlsZWQgd2FpdGluZyBmb3IgRklGTyBhdCBhZGRyICglMDJYKVxuIiwKKwkJCQlpZHgpOwogCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMzUxMCwxNCArMzUzMiwxNCBAQAogCiAJY2hpcC0+YW1wbGlmaWVyICs9IGNoYW5nZTsKIAlpZiAoY2hpcC0+YW1wbGlmaWVyICYmICFvbGQpIHsKLQkJc25kX3ByaW50ZGQgKCJIZXJjdWxlcyBhbXBsaWZpZXIgT05cbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkhlcmN1bGVzIGFtcGxpZmllciBPTlxuIik7CiAKIAkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT0RSLCAKIAkJCQkgICBFR1BJT0RSX0dQT0UyIHwgdmFsMSk7ICAgICAvKiBlbmFibGUgRUdQSU8yIG91dHB1dCAqLwogCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPUFRSLCAKIAkJCQkgICBFR1BJT1BUUl9HUFBUMiB8IHZhbDIpOyAgIC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCiAJfSBlbHNlIGlmIChvbGQgJiYgIWNoaXAtPmFtcGxpZmllcikgewotCQlzbmRfcHJpbnRkZCAoIkhlcmN1bGVzIGFtcGxpZmllciBPRkZcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkhlcmN1bGVzIGFtcGxpZmllciBPRkZcbiIpOwogCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsICB2YWwxICYgfkVHUElPRFJfR1BPRTIpOyAvKiBkaXNhYmxlICovCiAJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9QVFIsIHZhbDIgJiB+RUdQSU9QVFJfR1BQVDIpOyAvKiBkaXNhYmxlICovCiAJfQpAQCAtMzUyNSw3ICszNTQ3LDcgQEAKIAogc3RhdGljIHZvaWQgdm95ZXRyYV9taXhlcl9pbml0IChzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCkKIHsKLQlzbmRfcHJpbnRkZCAoImluaXRpYWxpemluZyBWb3lldHJhIG1peGVyXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemluZyBWb3lldHJhIG1peGVyXG4iKTsKIAogCS8qIEVuYWJsZSBTUERJRiBvdXQgKi8KIAlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsIEVHUElPRFJfR1BPRTApOwpAQCAtMzU0Myw3ICszNTY1LDcgQEAKIAkvKiBzZXQgRUdQSU8gdG8gZGVmYXVsdCAqLwogCWhlcmN1bGVzX2luaXQoY2hpcCk7CiAKLQlzbmRfcHJpbnRkZCAoImluaXRpYWxpemluZyBIZXJjdWxlcyBtaXhlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXppbmcgSGVyY3VsZXMgbWl4ZXJcbiIpOwogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAogCWlmIChjaGlwLT5pbl9zdXNwZW5kKQpAQCAtMzU1NCw3ICszNTc2LDkgQEAKIAogCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfaGVyY3VsZXNfY29udHJvbHNbaWR4XSwgY2hpcCk7CiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBIZXJjdWxlcyBtaXhlciAoJWQpXG4iLGVycik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGluaXRpYWxpemUgSGVyY3VsZXMgbWl4ZXIgKCVkKVxuIiwKKwkJCQllcnIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0zODI2LDggKzM4NTAsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zOTMyLDcgKzM5NTUsOCBAQAogCWNoaXAtPmJhMV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CiAJaWYgKGNoaXAtPmJhMF9hZGRyID09IDAgfHwgY2hpcC0+YmEwX2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpfjAgfHwKIAkgICAgY2hpcC0+YmExX2FkZHIgPT0gMCB8fCBjaGlwLT5iYTFfYWRkciA9PSAodW5zaWduZWQgbG9uZyl+MCkgewotCSAgICAJc25kX3ByaW50ayhLRVJOX0VSUiAid3JvbmcgYWRkcmVzcyhlcykgLSBiYTAgPSAweCVseCwgYmExID0gMHglbHhcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIndyb25nIGFkZHJlc3MoZXMpIC0gYmEwID0gMHglbHgsIGJhMSA9IDB4JWx4XG4iLAogCQkJICAgY2hpcC0+YmEwX2FkZHIsIGNoaXAtPmJhMV9hZGRyKTsKIAkgICAgCXNuZF9jczQ2eHhfZnJlZShjaGlwKTsKIAkgICAgCXJldHVybiAtRU5PTUVNOwpAQCAtMzk2OSw3ICszOTkzLDggQEAKIAogCWZvciAoY3AgPSAmY2FyZHNbMF07IGNwLT5uYW1lOyBjcCsrKSB7CiAJCWlmIChjcC0+dmVuZG9yID09IHNzX3ZlbmRvciAmJiBjcC0+aWQgPT0gc3NfY2FyZCkgewotCQkJc25kX3ByaW50ZGQgKCJoYWNrIGZvciAlcyBlbmFibGVkXG4iLCBjcC0+bmFtZSk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImhhY2sgZm9yICVzIGVuYWJsZWRcbiIsCisJCQkJY3AtPm5hbWUpOwogCiAJCQljaGlwLT5hbXBsaWZpZXJfY3RybCA9IGNwLT5hbXA7CiAJCQljaGlwLT5hY3RpdmVfY3RybCA9IGNwLT5hY3RpdmU7CkBAIC0zOTgyLDEyICs0MDA3LDE0IEBACiAJfQogCiAJaWYgKGV4dGVybmFsX2FtcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQ3J5c3RhbCBFQVBEIHN1cHBvcnQgZm9yY2VkIG9uLlxuIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiQ3J5c3RhbCBFQVBEIHN1cHBvcnQgZm9yY2VkIG9uLlxuIik7CiAJCWNoaXAtPmFtcGxpZmllcl9jdHJsID0gYW1wX3ZveWV0cmE7CiAJfQogCiAJaWYgKHRoaW5rcGFkKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkgIkFjdGl2YXRpbmcgQ0xLUlVOIGhhY2sgZm9yIFRoaW5rcGFkLlxuIik7CiAJCWNoaXAtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7CiAJCWNsa3J1bl9pbml0KGNoaXApOwogCX0KQEAgLTQwMDUsMTQgKzQwMzIsMTYgQEAKIAkJcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5pZHhbaWR4XTsKIAkJaWYgKChyZWdpb24tPnJlc291cmNlID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlZ2lvbi0+YmFzZSwgcmVnaW9uLT5zaXplLAogCQkJCQkJCSAgIHJlZ2lvbi0+bmFtZSkpID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwKIAkJCQkgICByZWdpb24tPmJhc2UsIHJlZ2lvbi0+YmFzZSArIHJlZ2lvbi0+c2l6ZSAtIDEpOwogCQkJc25kX2NzNDZ4eF9mcmVlKGNoaXApOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlyZWdpb24tPnJlbWFwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUocmVnaW9uLT5iYXNlLCByZWdpb24tPnNpemUpOwogCQlpZiAocmVnaW9uLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzIGlvcmVtYXAgcHJvYmxlbVxuIiwgcmVnaW9uLT5uYW1lKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSIlcyBpb3JlbWFwIHByb2JsZW1cbiIsIHJlZ2lvbi0+bmFtZSk7CiAJCQlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtNDAyMCw3ICs0MDQ5LDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NzNDZ4eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtNDA1OCw4ICs0MDg3LDYgQEAKIAogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsgLyogZGlzYWJsZSBDTEtSVU4gKi8KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKaW5kZXggMTY4NmI0Zi4uMWM0YTBmYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwpAQCAtODUsMTIgKzg1LDE1IEBACiAJCQkJCQlhZGRyZXNzICA9IChoaXZhbCAmIDB4MDBGRkYpIDw8IDU7CiAJCQkJCQlhZGRyZXNzIHw9ICBsb3ZhbCA+PiAxNTsKICAgICAgICAgICAgIAotCQkJCQkJc25kX3ByaW50ZGQoImhhbmRsZV93aWRlb3BbMV06ICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsaGl2YWwsbG92YWwsYWRkcmVzcyk7CisJCQkJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkiaGFuZGxlX3dpZGVvcFsxXTogJTA1eDolMDV4IGFkZHIgJTA0eFxuIiwKKwkJCQkJCQloaXZhbCwgbG92YWwsIGFkZHJlc3MpOwogICAgICAgICAgICAgCiAJCQkJCQlpZiAoICEoYWRkcmVzcyAmIDB4ODAwMCkgKSB7CiAJCQkJCQkJYWRkcmVzcyArPSAoaW5zLT5jb2RlLm9mZnNldCAvIDIpIC0gb3ZlcmxheV9iZWdpbl9hZGRyZXNzOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzbmRfcHJpbnRkZCgiaGFuZGxlX3dpZGVvcFsxXTogUk9NIHN5bWJvbCBub3QgcmVhbGxvY2F0ZWRcbiIpOworCQkJCQkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkJCQkiaGFuZGxlX3dpZGVvcFsxXTogUk9NIHN5bWJvbCBub3QgcmVhbGxvY2F0ZWRcbiIpOwogCQkJCQkJfQogICAgICAgICAgICAgCiAJCQkJCQloaXZhbCAmPSAweEZGMDAwOwpAQCAtMTAyLDggKzEwNSw5IEBACiAJCQkJCQlhZGRyZXNzICA9IChoaXZhbCAmIDB4MDBGRkYpIDw8IDU7CiAJCQkJCQlhZGRyZXNzIHw9ICBsb3ZhbCA+PiAxNTsKICAgICAgICAgICAgIAotCQkJCQkJc25kX3ByaW50ZGQoImhhbmRsZV93aWRlb3A6WzJdICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsaGl2YWwsbG92YWwsYWRkcmVzcyk7ICAgICAgICAgICAgCi0JCQkJCQlucmVhbGxvY2F0ZWQgKys7CisJCQkJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkiaGFuZGxlX3dpZGVvcDpbMl0gJTA1eDolMDV4IGFkZHIgJTA0eFxuIiwKKwkJCQkJCQloaXZhbCwgbG92YWwsIGFkZHJlc3MpOwkJCQkJCW5yZWFsbG9jYXRlZCsrOwogCQkJCQl9IC8qIHdpZGVfb3Bjb2Rlc1tqXSA9PSB3aWRlX29wICovCiAJCQkJfSAvKiBmb3IgKi8KIAkJCX0gLyogbW9kX3R5cGUgPT0gMCAuLi4gKi8KQEAgLTExMyw3ICsxMTcsOCBAQAogCQlpbnMtPmNvZGUuZGF0YVtpbnMtPmNvZGUuc2l6ZSsrXSA9IGhpdmFsOwogCX0KIAotCXNuZF9wcmludGRkKCJkc3Bfc3BvczogJWQgaW5zdHJ1Y3Rpb25zIHJlYWxsb2NhdGVkXG4iLG5yZWFsbG9jYXRlZCk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJkc3Bfc3BvczogJWQgaW5zdHJ1Y3Rpb25zIHJlYWxsb2NhdGVkXG4iLCBucmVhbGxvY2F0ZWQpOwogCXJldHVybiBucmVhbGxvY2F0ZWQ7CiB9CiAKQEAgLTE1Nyw3ICsxNjIsOCBAQAogCiAJZm9yIChpID0gMDtpIDwgbW9kdWxlLT5zeW1ib2xfdGFibGUubnN5bWJvbHM7ICsraSkgewogCQlpZiAoaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMgPT0gKERTUF9NQVhfU1lNQk9MUyAtIDEpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIHRhYmxlIGlzIGZ1bGxcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBzeW1ib2wgdGFibGUgaXMgZnVsbFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0xNzYsOCArMTgyLDExIEBACiAKIAkJCWlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzKys7CiAJCX0gZWxzZSB7Ci0gICAgICAgICAgLyogaWYgKDApIHByaW50ayAoImRzcF9zcG9zOiBzeW1ib2wgPCVzPiBkdXBsaWNhdGVkLCBwcm9iYWJseSBub3RoaW5nIHdyb25nIHdpdGggdGhhdCAoQ2lycnVzPylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uc3ltYm9sX25hbWUpOyAqLworI2lmIDAKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gZHVwbGljYXRlZCwgcHJvYmFibHkgbm90aGluZyB3cm9uZyB3aXRoIHRoYXQgKENpcnJ1cz8pXG4iLAorCQkJCW1vZHVsZS0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uc3ltYm9sX25hbWUpOyAqLworI2VuZGlmCiAJCX0KIAl9CiAKQEAgLTE5MiwxNCArMjAxLDE1IEBACiAJaW50IGluZGV4OwogCiAJaWYgKGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID09IChEU1BfTUFYX1NZTUJPTFMgLSAxKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIHRhYmxlIGlzIGZ1bGxcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBzeW1ib2wgdGFibGUgaXMgZnVsbFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KICAgCiAJaWYgKGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLAogCQkJCSAgICAgc3ltYm9sX25hbWUsCiAJCQkJICAgICB0eXBlKSAhPSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgPCVzPiBkdXBsaWNhdGVkXG4iLCBzeW1ib2xfbmFtZSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgPCVzPiBkdXBsaWNhdGVkXG4iLCBzeW1ib2xfbmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMzA1LDE5ICszMTUsMjAgQEAKIAl1MzIgZG9mZnNldCwgZHNpemU7CiAKIAlpZiAoIXBhcmFtZXRlcikgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gcGFyYW1ldGVyIHNlZ21lbnRcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBwYXJhbWV0ZXIgc2VnbWVudFxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCWRvZmZzZXQgPSAocGFyYW1ldGVyLT5vZmZzZXQgKiA0ICsgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVCk7CiAJZHNpemUgICA9IHBhcmFtZXRlci0+c2l6ZSAqIDQ7CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6ICIKLQkJICAgICJkb3dubG9hZGluZyBwYXJhbWV0ZXIgZGF0YSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiZHNwX3Nwb3M6IGRvd25sb2FkaW5nIHBhcmFtZXRlciBkYXRhIHRvIGNoaXAgKCUwOHgtJTA4eClcbiIsCiAJCSAgICBkb2Zmc2V0LGRvZmZzZXQgKyBkc2l6ZSk7CiAJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsIHBhcmFtZXRlci0+ZGF0YSwgZG9mZnNldCwgZHNpemUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiAiCi0JCQkgICAiZmFpbGVkIHRvIGRvd25sb2FkIHBhcmFtZXRlciBkYXRhIHRvIERTUFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgcGFyYW1ldGVyIGRhdGEgdG8gRFNQXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtMzI5LDE4ICszNDAsMjEgQEAKIAl1MzIgZG9mZnNldCwgZHNpemU7CiAKIAlpZiAoIXNhbXBsZSkgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gc2FtcGxlIHNlZ21lbnRcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBzYW1wbGUgc2VnbWVudFxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCWRvZmZzZXQgPSAoc2FtcGxlLT5vZmZzZXQgKiA0ICArIERTUF9TQU1QTEVfQllURV9PRkZTRVQpOwogCWRzaXplICAgPSAgc2FtcGxlLT5zaXplICogNDsKIAotCXNuZF9wcmludGRkKCJkc3Bfc3BvczogZG93bmxvYWRpbmcgc2FtcGxlIGRhdGEgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImRzcF9zcG9zOiBkb3dubG9hZGluZyBzYW1wbGUgZGF0YSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAogCQkgICAgZG9mZnNldCxkb2Zmc2V0ICsgZHNpemUpOwogCiAJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsc2FtcGxlLT5kYXRhLGRvZmZzZXQsZHNpemUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gc2FtcGxlIGRhdGEgdG8gRFNQXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IGZhaWxlZCB0byBzYW1wbGUgZGF0YSB0byBEU1BcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNTQsMTQgKzM2OCwxNiBAQAogCWludCBlcnI7CiAKIAlpZiAoaW5zLT5ubW9kdWxlcyA9PSBEU1BfTUFYX01PRFVMRVMgLSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiB0byBtYW55IG1vZHVsZXMgbG9hZGVkIGludG8gRFNQXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHRvIG1hbnkgbW9kdWxlcyBsb2FkZWQgaW50byBEU1BcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IGxvYWRpbmcgbW9kdWxlICVzIGludG8gRFNQXG4iLCBtb2R1bGUtPm1vZHVsZV9uYW1lKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImRzcF9zcG9zOiBsb2FkaW5nIG1vZHVsZSAlcyBpbnRvIERTUFxuIiwgbW9kdWxlLT5tb2R1bGVfbmFtZSk7CiAgIAogCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBwYXJhbWV0ZXIgYXJlYVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGNsZWFyaW5nIHBhcmFtZXRlciBhcmVhXG4iKTsKIAkJc25kX2NzNDZ4eF9jbGVhcl9CQTEoY2hpcCwgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVCwgRFNQX1BBUkFNRVRFUl9CWVRFX1NJWkUpOwogCX0KICAgCkBAIC0zNzEsNyArMzg3LDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBzYW1wbGUgYXJlYVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGNsZWFyaW5nIHNhbXBsZSBhcmVhXG4iKTsKIAkJc25kX2NzNDZ4eF9jbGVhcl9CQTEoY2hpcCwgRFNQX1NBTVBMRV9CWVRFX09GRlNFVCwgRFNQX1NBTVBMRV9CWVRFX1NJWkUpOwogCX0KIApAQCAtMzgxLDE1ICszOTcsMTcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBjb2RlIGFyZWFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBjbGVhcmluZyBjb2RlIGFyZWFcbiIpOwogCQlzbmRfY3M0Nnh4X2NsZWFyX0JBMShjaGlwLCBEU1BfQ09ERV9CWVRFX09GRlNFVCwgRFNQX0NPREVfQllURV9TSVpFKTsKIAl9CiAKIAlpZiAoY29kZSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBjb2RlIHNlZ21lbnRcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogbW9kdWxlIGdvdCBubyBjb2RlIHNlZ21lbnRcbiIpOwogCX0gZWxzZSB7CiAJCWlmIChpbnMtPmNvZGUub2Zmc2V0ICsgY29kZS0+c2l6ZSA+IERTUF9DT0RFX0JZVEVfU0laRSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBEU1BcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBubyBzcGFjZSBhdmFpbGFibGUgaW4gRFNQXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTQwMSwxOSArNDE5LDIyIEBACiAJCWlmIChzbmRfQlVHX09OKCFtb2R1bGUtPnN5bWJvbF90YWJsZS5zeW1ib2xzKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoYWRkX3N5bWJvbHMoY2hpcCxtb2R1bGUpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGxvYWQgc3ltYm9sIHRhYmxlXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGxvYWQgc3ltYm9sIHRhYmxlXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAgICAgCiAJCWRvZmZzZXQgPSAoY29kZS0+b2Zmc2V0ICogNCArIGlucy0+Y29kZS5vZmZzZXQgKiA0ICsgRFNQX0NPREVfQllURV9PRkZTRVQpOwogCQlkc2l6ZSAgID0gY29kZS0+c2l6ZSAqIDQ7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogZG93bmxvYWRpbmcgY29kZSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZG93bmxvYWRpbmcgY29kZSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAogCQkJICAgIGRvZmZzZXQsZG9mZnNldCArIGRzaXplKTsgICAKIAogCQltb2R1bGUtPm5maXh1cHMgPSBzaGFkb3dfYW5kX3JlYWxsb2NhdGVfY29kZShjaGlwLGNvZGUtPmRhdGEsY29kZS0+c2l6ZSxtb2R1bGUtPm92ZXJsYXlfYmVnaW5fYWRkcmVzcyk7CiAKIAkJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsKGlucy0+Y29kZS5kYXRhICsgaW5zLT5jb2RlLm9mZnNldCksZG9mZnNldCxkc2l6ZSkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgY29kZSB0byBEU1BcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgY29kZSB0byBEU1BcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtNDQ3LDcgKzQ2OCw3IEBACiAJfQogCiAjaWYgMAotCXByaW50ayAoImRzcF9zcG9zOiBzeW1ib2wgPCVzPiB0eXBlICUwMnggbm90IGZvdW5kXG4iLAorCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IHN5bWJvbCA8JXM+IHR5cGUgJTAyeCBub3QgZm91bmRcbiIsCiAJCXN5bWJvbF9uYW1lLHN5bWJvbF90eXBlKTsKICNlbmRpZgogCkBAIC05MTAsNyArOTMxLDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCi1zdGF0aWMgaW50IGRlYnVnX3RyZWU7CiBzdGF0aWMgdm9pZCBfZHNwX2NyZWF0ZV90YXNrX3RyZWUgKHN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwLCB1MzIgKiB0YXNrX2RhdGEsCiAJCQkJICAgdTMyICBkZXN0LCBpbnQgc2l6ZSkKIHsKQEAgLTkxOSwxMyArOTM5LDEzIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCWlmIChkZWJ1Z190cmVlKSBwcmludGsgKCJhZGRyICVwLCB2YWwgJTA4eFxuIixzcGRzdCx0YXNrX2RhdGFbaV0pOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImFkZHIgJXAsIHZhbCAlMDh4XG4iLAorCQkJc3Bkc3QsIHRhc2tfZGF0YVtpXSk7CiAJCXdyaXRlbCh0YXNrX2RhdGFbaV0sc3Bkc3QpOwogCQlzcGRzdCArPSBzaXplb2YodTMyKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgZGVidWdfc2NiOwogc3RhdGljIHZvaWQgX2RzcF9jcmVhdGVfc2NiIChzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCwgdTMyICogc2NiX2RhdGEsIHUzMiBkZXN0KQogewogCXZvaWQgX19pb21lbSAqc3Bkc3QgPSBjaGlwLT5yZWdpb24uaWR4WzFdLnJlbWFwX2FkZHIgKyAKQEAgLTkzMyw3ICs5NTMsOCBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDB4MTA7ICsraSkgewotCQlpZiAoZGVidWdfc2NiKSBwcmludGsgKCJhZGRyICVwLCB2YWwgJTA4eFxuIixzcGRzdCxzY2JfZGF0YVtpXSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWRkciAlcCwgdmFsICUwOHhcbiIsCisJCQlzcGRzdCwgc2NiX2RhdGFbaV0pOwogCQl3cml0ZWwoc2NiX2RhdGFbaV0sc3Bkc3QpOwogCQlzcGRzdCArPSBzaXplb2YodTMyKTsKIAl9CkBAIC05NjAsNyArOTgxLDggQEAKIAlpbnQgaW5kZXg7CiAKIAlpZiAoaW5zLT5uc2NiID09IERTUF9NQVhfU0NCX0RFU0MgLSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFNDQlxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFNDQlxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtOTkxLDcgKzEwMTMsOCBAQAogCXN0cnVjdCBkc3BfdGFza19kZXNjcmlwdG9yICogZGVzYyA9IE5VTEw7CiAKIAlpZiAoaW5zLT5udGFzayA9PSBEU1BfTUFYX1RBU0tfREVTQyAtIDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGdvdCBubyBwbGFjZSBmb3Igb3RoZXIgVEFTS1xuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFRBU0tcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEwMzEsNyArMTA1NCw3IEBACiAJCWRlc2MtPmRhdGEgPSBzY2JfZGF0YTsKIAkJX2RzcF9jcmVhdGVfc2NiKGNoaXAsc2NiX2RhdGEsZGVzdCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBtYXAgU0NCXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogZmFpbGVkIHRvIG1hcCBTQ0JcbiIpOwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCQlrZnJlZShzY2JfZGF0YSk7CiAjZW5kaWYKQEAgLTEwNTIsNyArMTA3NSw3IEBACiAJCWRlc2MtPmRhdGEgPSB0YXNrX2RhdGE7CiAJCV9kc3BfY3JlYXRlX3Rhc2tfdHJlZShjaGlwLHRhc2tfZGF0YSxkZXN0LHNpemUpOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gbWFwIFRBU0tcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBmYWlsZWQgdG8gbWFwIFRBU0tcbiIpOwogCX0KIAogCXJldHVybiBkZXNjOwpAQCAtMTEwNSwzMSArMTEyOCwzNiBAQAogCiAJbnVsbF9hbGdvcml0aG0gID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJOVUxMQUxHT1JJVEhNIiwgU1lNQk9MX0NPREUpOwogCWlmIChudWxsX2FsZ29yaXRobSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgTlVMTEFMR09SSVRITSBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIE5VTExBTEdPUklUSE0gbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJZmdfdGFza190cmVlX2hlYWRlcl9jb2RlID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJGR1RBU0tUUkVFSEVBREVSQ09ERSIsIFNZTUJPTF9DT0RFKTsgIAogCWlmIChmZ190YXNrX3RyZWVfaGVhZGVyX2NvZGUgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIEZHVEFTS1RSRUVIRUFERVJDT0RFIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgRkdUQVNLVFJFRUhFQURFUkNPREUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJdGFza190cmVlX2hlYWRlcl9jb2RlID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJUQVNLVFJFRUhFQURFUkNPREUiLCBTWU1CT0xfQ09ERSk7ICAKIAlpZiAodGFza190cmVlX2hlYWRlcl9jb2RlID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRUhFQURFUkNPREUgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRUhFQURFUkNPREUgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogICAKIAl0YXNrX3RyZWVfdGhyZWFkID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJUQVNLVFJFRVRIUkVBRCIsIFNZTUJPTF9DT0RFKTsKIAlpZiAodGFza190cmVlX3RocmVhZCA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgVEFTS1RSRUVUSFJFQUQgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRVRIUkVBRCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAltYWdpY19zbm9vcF90YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJNQUdJQ1NOT09QVEFTSyIsIFNZTUJPTF9DT0RFKTsKIAlpZiAobWFnaWNfc25vb3BfdGFzayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgTUFHSUNTTk9PUFRBU0sgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBNQUdJQ1NOT09QVEFTSyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAgIApAQCAtMTQ3Niw3ICsxNTA0LDcgQEAKIAlyZXR1cm4gMDsKIAogIF9mYWlsX2VuZDoKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIHNldHVwIFNDQidzIGluIERTUFxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogZmFpbGVkIHRvIHNldHVwIFNDQidzIGluIERTUFxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTE0OTEsMTggKzE1MTksMjEgQEAKIAogCXMxNl9hc3luY19jb2RlY19pbnB1dF90YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJTMTZfQVNZTkNDT0RFQ0lOUFVUVEFTSyIsIFNZTUJPTF9DT0RFKTsKIAlpZiAoczE2X2FzeW5jX2NvZGVjX2lucHV0X3Rhc2sgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFMxNl9BU1lOQ0NPREVDSU5QVVRUQVNLIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgUzE2X0FTWU5DQ09ERUNJTlBVVFRBU0sgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXNwZGlmb190YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJTUERJRk9UQVNLIiwgU1lNQk9MX0NPREUpOwogCWlmIChzcGRpZm9fdGFzayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgU1BESUZPVEFTSyBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIFNQRElGT1RBU0sgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJc3BkaWZpX3Rhc2sgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwgIlNQRElGSVRBU0siLCBTWU1CT0xfQ09ERSk7CiAJaWYgKHNwZGlmaV90YXNrID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBTUERJRklUQVNLIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgU1BESUZJVEFTSyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE4ODMsNyArMTkxNCw4IEBACiAJfQogCiAJaWYgKGkgPT0gMjUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IFNQSU9Xcml0ZVRhc2sgbm90IHJlc3BvbmRpbmdcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogU1BJT1dyaXRlVGFzayBub3QgcmVzcG9uZGluZ1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jCmluZGV4IDQwOWU4NzYuLjgyODRiYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jCkBAIC0yMzMsOCArMjMzLDExIEBACiB7CiAJaWYgKHNjYi0+cHJvY19pbmZvKSB7CiAJCXN0cnVjdCBwcm9jX3NjYl9pbmZvICogc2NiX2luZm8gPSBzY2ItPnByb2NfaW5mby0+cHJpdmF0ZV9kYXRhOworCQlzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCA9IHNjYl9pbmZvLT5jaGlwOwogCi0JCXNuZF9wcmludGRkKCJjczQ2eHhfZHNwX3Byb2NfZnJlZV9zY2JfZGVzYzogZnJlZWluZyAlc1xuIixzY2ItPnNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiY3M0Nnh4X2RzcF9wcm9jX2ZyZWVfc2NiX2Rlc2M6IGZyZWVpbmcgJXNcbiIsCisJCQlzY2ItPnNjYl9uYW1lKTsKIAogCQlzbmRfaW5mb19mcmVlX2VudHJ5KHNjYi0+cHJvY19pbmZvKTsKIAkJc2NiLT5wcm9jX2luZm8gPSBOVUxMOwpAQCAtMzA1LDcgKzMwOCw3IEBACiAJc2NiX2RhdGFbU0NCZnVuY0VudHJ5UHRyXSAmPSAweEZGRkYwMDAwOwogCXNjYl9kYXRhW1NDQmZ1bmNFbnRyeVB0cl0gfD0gdGFza19lbnRyeS0+YWRkcmVzczsKIAotCXNuZF9wcmludGRkKCJkc3Bfc3BvczogY3JlYXRpbmcgU0NCIDwlcz5cbiIsbmFtZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogY3JlYXRpbmcgU0NCIDwlcz5cbiIsIG5hbWUpOwogCiAJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfc2NiKGNoaXAsbmFtZSxzY2JfZGF0YSxkZXN0KTsKIApAQCAtMzIwLDkgKzMyMywxNSBAQAogCS8qIHVwZGF0ZSBwYXJlbnQgU0NCICovCiAJaWYgKHNjYi0+cGFyZW50X3NjYl9wdHIpIHsKICNpZiAwCi0JCXByaW50ayAoInNjYi0+cGFyZW50X3NjYl9wdHIgPSAlc1xuIixzY2ItPnBhcmVudF9zY2JfcHRyLT5zY2JfbmFtZSk7Ci0JCXByaW50ayAoInNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ciA9ICVzXG4iLHNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ci0+c2NiX25hbWUpOwotCQlwcmludGsgKCJzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgPSAlc1xuIixzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHItPnNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkic2NiLT5wYXJlbnRfc2NiX3B0ciA9ICVzXG4iLAorCQkJc2NiLT5wYXJlbnRfc2NiX3B0ci0+c2NiX25hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSAlc1xuIiwKKwkJCXNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ci0+c2NiX25hbWUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgPSAlc1xuIiwKKwkJCXNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ci0+c2NiX25hbWUpOwogI2VuZGlmCiAJCS8qIGxpbmsgdG8gIHBhcmVudCBTQ0IgKi8KIAkJaWYgKHNjYl9jaGlsZF90eXBlID09IFNDQl9PTl9QQVJFTlRfTkVYVF9TQ0IpIHsKQEAgLTM2OCw3ICszNzcsOCBAQAogCQkJCQkgICAgICAgU1lNQk9MX0NPREUpOwogICAKIAlpZiAodGFza19lbnRyeSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sICVzIG5vdCBmb3VuZFxuIix0YXNrX2VudHJ5X25hbWUpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sICVzIG5vdCBmb3VuZFxuIiwgdGFza19lbnRyeV9uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogICAKQEAgLTU4Miw3ICs1OTIsOCBAQAogCQkJCQkJCQkgU1lNQk9MX0NPREUpOwogICAgIAogCQlpZiAoaW5zLT5udWxsX2FsZ29yaXRobSA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBOVUxMQUxHT1JJVEhNIG5vdCBmb3VuZFxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZHNwX3Nwb3M6IHN5bWJvbCBOVUxMQUxHT1JJVEhNIG5vdCBmb3VuZFxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfSAgICAKIAl9CkBAIC02MTIsNyArNjIzLDggQEAKIAl1bnNpZ25lZCBpbnQgcGhpSW5jcjsKIAl1bnNpZ25lZCBpbnQgY29ycmVjdGlvblBlckdPRiwgY29ycmVjdGlvblBlclNlYzsKIAotCXNuZF9wcmludGRkKCAiZHNwX3Nwb3M6IHNldHRpbmcgJXMgcmF0ZSB0byAldVxuIixzY2JfbmFtZSxyYXRlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBzZXR0aW5nICVzIHJhdGUgdG8gJXVcbiIsCisJCXNjYl9uYW1lLCByYXRlKTsKIAogCS8qCiAJICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KQEAgLTY3MCw3ICs2ODIsOCBAQAogCQkJCQkJCQkgU1lNQk9MX0NPREUpOwogCQkJCiAJCQlpZiAoaW5zLT5zMTZfdXAgPT0gTlVMTCkgewotCQkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFMxNl9VUFNSQyBub3QgZm91bmRcbiIpOworCQkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiZHNwX3Nwb3M6IHN5bWJvbCBTMTZfVVBTUkMgbm90IGZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0gICAgCiAJCX0KQEAgLTEyNjUsNyArMTI3OCw3IEBACiAJCSAgIHRoZSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZWQgKHdoaWNoIGNvdWxkCiAJCSAgIGFsdGVyIHRoZSByYXcgZGF0YSBzdHJlYW0gLi4uKSAqLwogCQlpZiAoc2FtcGxlX3JhdGUgPT0gNDgwMDApIHsKLQkJCXNuZF9wcmludGRkICgiSUVDOTU4IHBhc3MgdGhyb3VnaFxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIklFQzk1OCBwYXNzIHRocm91Z2hcbiIpOwogCQkJLyogSGFjayB0byBieXBhc3MgY3JlYXRpbmcgYSBuZXcgU1JDICovCiAJCQlwYXNzX3Rocm91Z2ggPSAxOwogCQl9CkBAIC0xMjk5LDEzICsxMzEyLDE0IEBACiAJfQogCiAJaWYgKHBjbV9pbmRleCA9PSAtMSkgewotCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IG5vIGZyZWUgUENNIGNoYW5uZWxcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBubyBmcmVlIFBDTSBjaGFubmVsXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKHNyY19zY2IgPT0gTlVMTCkgewogCQlpZiAoaW5zLT5uc3JjX3NjYiA+PSBEU1BfTUFYX1NSQ19OUikgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHRvIG1hbnkgU1JDIGluc3RhbmNlc1xuISIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiB0byBtYW55IFNSQyBpbnN0YW5jZXNcbiEiKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTEzMzEsNyArMTM0NSw4IEBACiAKIAkJc25wcmludGYgKHNjYl9uYW1lLERTUF9NQVhfU0NCX05BTUUsIlNyY1Rhc2tfU0NCJWQiLHNyY19pbmRleCk7CiAJCQotCQlzbmRfcHJpbnRkZCggImRzcF9zcG9zOiBjcmVhdGluZyBTUkMgXCIlc1wiXG4iLHNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IGNyZWF0aW5nIFNSQyBcIiVzXCJcbiIsIHNjYl9uYW1lKTsKIAkJc3JjX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NyY190YXNrX3NjYihjaGlwLHNjYl9uYW1lLAogCQkJCQkJCSBzYW1wbGVfcmF0ZSwKIAkJCQkJCQkgc3JjX291dHB1dF9idWZmZXJfYWRkcltzcmNfaW5kZXhdLApAQCAtMTM0Myw3ICsxMzU4LDggQEAKIAkJCQkJCQkgcGFzc190aHJvdWdoKTsKIAogCQlpZiAoIXNyY19zY2IpIHsKLQkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBTUkN0YXNrU0NCXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBTUkN0YXNrU0NCXG4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTEzNTUsOCArMTM3MSw4IEBACiAgIAogCXNucHJpbnRmIChzY2JfbmFtZSxEU1BfTUFYX1NDQl9OQU1FLCJQQ01SZWFkZXJfU0NCJWQiLHBjbV9pbmRleCk7CiAKLQlzbmRfcHJpbnRkZCggImRzcF9zcG9zOiBjcmVhdGluZyBQQ00gXCIlc1wiICglZClcbiIsc2NiX25hbWUsCi0gICAgICAgICAgICAgICAgIHBjbV9jaGFubmVsX2lkKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBjcmVhdGluZyBQQ00gXCIlc1wiICglZClcbiIsCisJCXNjYl9uYW1lLCBwY21fY2hhbm5lbF9pZCk7CiAKIAlwY21fc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX3JlYWRlcl9zY2IoY2hpcCxzY2JfbmFtZSwKIAkJCQkJCSAgIHBjbV9yZWFkZXJfYnVmZmVyX2FkZHJbcGNtX2luZGV4XSwKQEAgLTEzNjksNyArMTM4NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCiAJaWYgKCFwY21fc2NiKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBQQ01yZWFkZXJTQ0JcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGNyZWF0ZSBQQ01yZWFkZXJTQ0JcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJCkBAIC0xNDE5LDcgKzE0MzYsOCBAQAogCQl0ZW1wIHw9IERNQV9SUV9DMV9TT1VSQ0VfTU9EMTY7CiAJCWJyZWFrOyAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkZCAoInBlcmlvZCBzaXplICglZCkgbm90IHN1cHBvcnRlZCBieSBIV1xuIiwgcGVyaW9kX3NpemUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJwZXJpb2Qgc2l6ZSAoJWQpIG5vdCBzdXBwb3J0ZWQgYnkgSFdcbiIsIHBlcmlvZF9zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDU3LDcgKzE0NzUsOCBAQAogCQl0ZW1wIHw9IERNQV9SUV9DMV9ERVNUX01PRDE2OwogCQlicmVhazsgCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZGQgKCJwZXJpb2Qgc2l6ZSAoJWQpIG5vdCBzdXBwb3J0ZWQgYnkgSFdcbiIsIHBlcmlvZF9zaXplKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicGVyaW9kIHNpemUgKCVkKSBub3Qgc3VwcG9ydGVkIGJ5IEhXXG4iLCBwZXJpb2Rfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzMC5jIGIvc291bmQvcGNpL2NzNTUzMC5jCmluZGV4IGM2YjgyYzguLmI0ZTBmZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzAuYworKysgYi9zb3VuZC9wY2kvY3M1NTMwLmMKQEAgLTE2MCwxNyArMTYwLDE3IEBACiAJc2JfYmFzZSA9IDB4MjIwICsgMHgyMCAqIChtYXAgJiAzKTsKIAogCWlmIChtYXAgJiAoMTw8MikpCi0JCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogWHByZXNzQXVkaW8gYXQgMHglbHhcbiIsIHNiX2Jhc2UpOworCQlkZXZfaW5mbyhjYXJkLT5kZXYsICJYcHJlc3NBdWRpbyBhdCAweCVseFxuIiwgc2JfYmFzZSk7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgWHByZXNzQXVkaW8hXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb3VsZCBub3QgZmluZCBYcHJlc3NBdWRpbyFcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChtYXAgJiAoMTw8NSkpCi0JCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogTVBVIGF0IDB4MzAwXG4iKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTVBVIGF0IDB4MzAwXG4iKTsKIAllbHNlIGlmIChtYXAgJiAoMTw8NikpCi0JCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogTVBVIGF0IDB4MzMwXG4iKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTVBVIGF0IDB4MzMwXG4iKTsKIAogCWlycSA9IHNuZF9jczU1MzBfbWl4ZXJfcmVhZChzYl9iYXNlLCAweDgwKSAmIDB4MEY7CiAJZG1hOCA9IHNuZF9jczU1MzBfbWl4ZXJfcmVhZChzYl9iYXNlLCAweDgxKTsKQEAgLTE4Miw3ICsxODIsNyBAQAogCWVsc2UgaWYgKGRtYTggJiAweDgwKQogCQlkbWExNiA9IDc7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBObyAxNmJpdCBETUEgZW5hYmxlZFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiTm8gMTZiaXQgRE1BIGVuYWJsZWRcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE5NCw3ICsxOTQsNyBAQAogCWVsc2UgaWYgKGRtYTggJiAweDA4KQogCQlkbWE4ID0gMzsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDUzU1MzA6IE5vIDhiaXQgRE1BIGVuYWJsZWRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIk5vIDhiaXQgRE1BIGVuYWJsZWRcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTIwOCwzMiArMjA4LDMxIEBACiAJZWxzZSBpZiAoaXJxICYgOCkKIAkJaXJxID0gMTA7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBTb3VuZEJsYXN0ZXIgSVJRIG5vdCBzZXRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIlNvdW5kQmxhc3RlciBJUlEgbm90IHNldFxuIik7CiAJCXNuZF9jczU1MzBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ1M1NTMwOiBJUlE6ICVkIERNQTg6ICVkIERNQTE2OiAlZFxuIiwgaXJxLCBkbWE4LCAKLQkJCQkJCQkJCWRtYTE2KTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsICJJUlE6ICVkIERNQTg6ICVkIERNQTE2OiAlZFxuIiwgaXJxLCBkbWE4LCBkbWExNik7CiAKIAllcnIgPSBzbmRfc2Jkc3BfY3JlYXRlKGNhcmQsIHNiX2Jhc2UsIGlycSwgc25kX3NiMTZkc3BfaW50ZXJydXB0LCBkbWE4LAogCQkJCQkJZG1hMTYsIFNCX0hXX0NTNTUzMCwgJmNoaXAtPnNiKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogQ291bGQgbm90IGNyZWF0ZSBTb3VuZEJsYXN0ZXJcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNvdWxkIG5vdCBjcmVhdGUgU291bmRCbGFzdGVyXG4iKTsKIAkJc25kX2NzNTUzMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IHNuZF9zYjE2ZHNwX3BjbShjaGlwLT5zYiwgMCwgJmNoaXAtPnNiLT5wY20pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBDb3VsZCBub3QgY3JlYXRlIFBDTVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBQQ01cbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJZXJyID0gc25kX3NibWl4ZXJfbmV3KGNoaXAtPnNiKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogQ291bGQgbm90IGNyZWF0ZSBNaXhlclxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBNaXhlclxuIik7CiAJCXNuZF9jczU1MzBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNDQsNyArMjQzLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NCw3ICsyNjIsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYwppbmRleCBjMGQyODM1Li5lZGNiYmRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYwpAQCAtODQsNyArODQsOCBAQAogCQl1ZGVsYXkoMSk7CiAJfSB3aGlsZSAoLS10aW1lb3V0KTsKIAlpZiAoIXRpbWVvdXQpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkZhaWx1cmUgd3JpdGluZyB0byBjczU1MzUgY29kZWNcbiIpOworCQlkZXZfZXJyKGNzNTUzNWF1LT5jYXJkLT5kZXYsCisJCQkiRmFpbHVyZSB3cml0aW5nIHRvIGNzNTUzNSBjb2RlY1xuIik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfY3M1NTM1YXVkaW9fY29kZWNfcmVhZChzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1LApAQCAtMTA5LDggKzExMCw5IEBACiAJCXVkZWxheSgxKTsKIAl9IHdoaWxlICgtLXRpbWVvdXQpOwogCWlmICghdGltZW91dCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbHVyZSByZWFkaW5nIGNvZGVjIHJlZyAweCV4LCIKLQkJCQkJIkxhc3QgdmFsdWU9MHgleFxuIiwgcmVnLCB2YWwpOworCQlkZXZfZXJyKGNzNTUzNWF1LT5jYXJkLT5kZXYsCisJCQkiRmFpbHVyZSByZWFkaW5nIGNvZGVjIHJlZyAweCV4LCBMYXN0IHZhbHVlPTB4JXhcbiIsCisJCQlyZWcsIHZhbCk7CiAKIAlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSB2YWw7CiB9CkBAIC0xNjgsNyArMTcwLDcgQEAKIAlvbHBjX3ByZXF1aXJrcyhjYXJkLCAmYWM5Nyk7CiAKIAlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY3M1NTM1YXUtPmFjOTcpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4ZXIgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJtaXhlciBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTc2LDcgKzE3OCw3IEBACiAKIAllcnIgPSBvbHBjX3F1aXJrcyhjYXJkLCBjczU1MzVhdS0+YWM5Nyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAib2xwYyBxdWlya3MgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJvbHBjIHF1aXJrcyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTk0LDggKzE5Niw5IEBACiAJCWRtYSA9IGNzNTUzNWF1LT5wbGF5YmFja19zdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjczU1MzVhdS0+cGxheWJhY2tfc3Vic3RyZWFtKTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGJtMCBpcnEgc3JjLCBibV9zdGF0PSV4XG4iLAotCQkJCQlibV9zdGF0KTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LAorCQkJInVuZXhwZWN0ZWQgYm0wIGlycSBzcmMsIGJtX3N0YXQ9JXhcbiIsCisJCQlibV9zdGF0KTsKIAl9CiB9CiAKQEAgLTI0MSw4ICsyNDQsOSBAQAogCQkJCXByb2Nlc3NfYm0xX2lycShjczU1MzVhdSk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlVuZXhwZWN0ZWQgaXJxIHNyYzogIgotCQkJCQkJIjB4JXhcbiIsIGFjY19pcnFfc3RhdCk7CisJCQkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5leHBlY3RlZCBpcnEgc3JjOiAweCV4XG4iLAorCQkJCQlhY2NfaXJxX3N0YXQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yODcsNyArMjkxLDcgQEAKIAogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1bmFibGUgdG8gZ2V0IDMyYml0IGRtYVxuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgInVuYWJsZSB0byBnZXQgMzJiaXQgZG1hXG4iKTsKIAkJZXJyID0gLUVOWElPOwogCQlnb3RvIHBjaWZhaWw7CiAJfQpAQCAtMzEyLDcgKzMxNiw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jczU1MzVhdWRpb19pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNzNTUzNWF1KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIHNuZGZhaWw7CiAJfQpAQCAtMzI0LDggKzMyOCw2IEBACiAJCQkJICBjczU1MzVhdSwgJm9wcykpIDwgMCkKIAkJZ290byBzbmRmYWlsOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjczU1MzVhdSA9IGNzNTUzNWF1OwogCXJldHVybiAwOwogCkBAIC0zNTMsNyArMzU1LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19vbHBjLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fb2xwYy5jCmluZGV4IGU2YTQ0NTAuLjNiMGZkYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19vbHBjLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX29scGMuYwpAQCAtMzYsNyArMzYsOCBAQAogCWVyciA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfVEVTVDIsCiAJCQkxIDw8IEFDOTdfQURfSFBGRF9TSElGVCwgb24gPDwgQUM5N19BRF9IUEZEX1NISUZUKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzZXR0aW5nIEhpZ2ggUGFzcyBGaWx0ZXIgLSAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihhYzk3LT5idXMtPmNhcmQtPmRldiwKKwkJCSJzZXR0aW5nIEhpZ2ggUGFzcyBGaWx0ZXIgLSAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTgsNyArNTksNyBAQAogCWVyciA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQywKIAkJCTEgPDwgQUM5N19BRF9WUkVGRF9TSElGVCwgb24gPDwgQUM5N19BRF9WUkVGRF9TSElGVCk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInNldHRpbmcgTUlDIEJpYXMgLSAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihhYzk3LT5idXMtPmNhcmQtPmRldiwgInNldHRpbmcgTUlDIEJpYXMgLSAlZFxuIiwgZXJyKTsKIH0KIAogc3RhdGljIGludCBvbHBjX2RjX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKQEAgLTE1Myw3ICsxNTQsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChncGlvX3JlcXVlc3QoT0xQQ19HUElPX01JQ19BQywgRFJWX05BTUUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiB1bmFibGUgdG8gYWxsb2NhdGUgTUlDIEdQSU9cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBNSUMgR1BJT1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoT0xQQ19HUElPX01JQ19BQywgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKaW5kZXggOWFiMDFhNy4uOWMyZGM5MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwpAQCAtMzE3LDcgKzMxNyw3IEBACiAJCWRtYS0+b3BzLT5kaXNhYmxlX2RtYShjczU1MzVhdSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuaGFuZGxlZCB0cmlnZ2VyXG4iKTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAidW5oYW5kbGVkIHRyaWdnZXJcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CkBAIC0zMzUsMTMgKzMzNSwxMyBAQAogCWRtYSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWN1cmRtYSA9IGRtYS0+b3BzLT5yZWFkX2RtYV9wbnRyKGNzNTUzNWF1KTsKIAlpZiAoY3VyZG1hIDwgZG1hLT5idWZfYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjdXJkbWE9JXggPCAleCBidWZhZGRyLlxuIiwKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAiY3VyZG1hPSV4IDwgJXggYnVmYWRkci5cbiIsCiAJCQkJCWN1cmRtYSwgZG1hLT5idWZfYWRkcik7CiAJCXJldHVybiAwOwogCX0KIAljdXJkbWEgLT0gZG1hLT5idWZfYWRkcjsKIAlpZiAoY3VyZG1hID49IGRtYS0+YnVmX2J5dGVzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRpZmY9JXggPj0gJXggYnVmX2J5dGVzLlxuIiwKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAiZGlmZj0leCA+PSAleCBidWZfYnl0ZXMuXG4iLAogCQkJCQljdXJkbWEsIGRtYS0+YnVmX2J5dGVzKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwppbmRleCA2YzM0ZGVmLi4zNGNjNjAwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwpAQCAtNzQsNyArNzQsNyBAQAogCXNuZF9jczU1MzVhdWRpb19zdG9wX2hhcmR3YXJlKGNzNTUzNWF1KTsKIAogCWlmIChwY2lfc2F2ZV9zdGF0ZShwY2kpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M1NTM1YXVkaW86IHBjaV9zYXZlX3N0YXRlIGZhaWxlZCFcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9zYXZlX3N0YXRlIGZhaWxlZCFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CkBAIC05NCw4ICs5NCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczU1MzVhdWRpbzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTEzLDcgKzExMiw3IEBACiAJfSB3aGlsZSAoLS10aW1lb3V0KTsKIAogCWlmICghdGltZW91dCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbHVyZSBnZXR0aW5nIEFDIExpbmsgcmVhZHlcbiIpOworCQlkZXZfZXJyKGNzNTUzNWF1LT5jYXJkLT5kZXYsICJGYWlsdXJlIGdldHRpbmcgQUMgTGluayByZWFkeVxuIik7CiAKIAkvKiBzZXQgdXAgcmF0ZSByZWdzLCBkbWEuIGFjdHVhbCBpbml0aWF0aW9uIGlzIGRvbmUgaW4gdHJpZyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1M1NTM1QVVESU9fRE1BUzsgaSsrKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCmluZGV4IGViODY4MjkuLmFmNjMyYmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCkBAIC0xNzM5LDggKzE3MzksNiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yMTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyYXRjID0gYXRjOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkveGZpLmMgYi9zb3VuZC9wY2kvY3R4ZmkveGZpLmMKaW5kZXggZDQ2NGFkMi4uOTg0MjZkMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL3hmaS5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS94ZmkuYwpAQCAtNzEsNyArNzEsOCBAQAogCQlkZXYrKzsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJaWYgKChyZWZlcmVuY2VfcmF0ZSAhPSA0ODAwMCkgJiYgKHJlZmVyZW5jZV9yYXRlICE9IDQ0MTAwKSkgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKaW5kZXggMDVjZmU1NS4uOWYxMGM5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCkBAIC01OCw3ICs1OCw4IEBACiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZWEvJXMiLCBjYXJkX2Z3W2Z3X2luZGV4XS5kYXRhKTsKIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBuYW1lLCBwY2lfZGV2aWNlKGNoaXApKTsKIAlpZiAoZXJyIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZ2V0X2Zpcm13YXJlKCk6IEZpcm13YXJlIG5vdCBhdmFpbGFibGUgKCVkKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZ2V0X2Zpcm13YXJlKCk6IEZpcm13YXJlIG5vdCBhdmFpbGFibGUgKCVkKVxuIiwgZXJyKTsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAllbHNlCiAJCWNoaXAtPmZ3X2NhY2hlW2Z3X2luZGV4XSA9ICpmd19lbnRyeTsKQEAgLTU2Myw3ICs1NjQsNyBAQAogCWVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQkJICAgICAgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWFsbG9jX3BhZ2VzIGVycj0lZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJtYWxsb2NfcGFnZXMgZXJyPSVkXG4iLCBlcnIpOwogCQlzcGluX2xvY2tfaXJxKCZjaGlwLT5sb2NrKTsKIAkJZnJlZV9waXBlcyhjaGlwLCBwaXBlKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5sb2NrKTsKQEAgLTE5ODksOCArMTk5MCw4IEBACiAKIAlpZiAoKGNoaXAtPmlvcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPmRzcF9yZWdpc3RlcnNfcGh5cywgc3osCiAJCQkJCSAgICAgIEVDSE9DQVJEX05BTUUpKSA9PSBOVUxMKSB7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiY2Fubm90IGdldCBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJc25kX2VjaG9fZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdldCBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2hpcC0+ZHNwX3JlZ2lzdGVycyA9ICh2b2xhdGlsZSB1MzIgX19pb21lbSAqKQpAQCAtMTk5OCw4ICsxOTk5LDggQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VjaG9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXNuZF9lY2hvX2ZyZWUoY2hpcCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpAQCAtMjAxMSw4ICsyMDEyLDggQEAKIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKIAkJCQlzaXplb2Yoc3RydWN0IGNvbW1fcGFnZSksCiAJCQkJJmNoaXAtPmNvbW1wYWdlX2RtYV9idWYpIDwgMCkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY29tbSBwYWdlXG4iKTsKIAkJc25kX2VjaG9fZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHRoZSBjb21tIHBhZ2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2hpcC0+Y29tbV9wYWdlX3BoeXMgPSBjaGlwLT5jb21tcGFnZV9kbWFfYnVmLmFkZHI7CkBAIC0yMDU4LDEyICsyMDU5LDExIEBACiAKIAlERV9JTklUKCgiRWNob2F1ZGlvIGRyaXZlciBzdGFydGluZy4uLlxuIikpOwogCWkgPSAwOwotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJY2hpcCA9IE5VTEw7CS8qIFRlbGxzIHNuZF9lY2hvX2NyZWF0ZSB0byBhbGxvY2F0ZSBjaGlwICovCiAJaWYgKChlcnIgPSBzbmRfZWNob19jcmVhdGUoY2FyZCwgcGNpLCAmY2hpcCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpAQCAtMjA4Miw3ICsyMDgyLDcgQEAKIAkJY2hpcC0+ZHNwX3JlZ2lzdGVyc19waHlzLCBjaGlwLT5pcnEpOwogCiAJaWYgKChlcnIgPSBzbmRfZWNob19uZXdfcGNtKGNoaXApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibmV3IHBjbSBlcnJvciAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJuZXcgcGNtIGVycm9yICVkXG4iLCBlcnIpOwogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIwOTAsNyArMjA5MCw3IEBACiAjaWZkZWYgRUNIT0NBUkRfSEFTX01JREkKIAlpZiAoY2hpcC0+aGFzX21pZGkpIHsJLyogU29tZSBNaWEncyBkbyBub3QgaGF2ZSBtaWRpICovCiAJCWlmICgoZXJyID0gc25kX2VjaG9fbWlkaV9jcmVhdGUoY2FyZCwgY2hpcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibmV3IG1pZGkgZXJyb3IgJWRcbiIsIGVycik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5ldyBtaWRpIGVycm9yICVkXG4iLCBlcnIpOwogCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTIxODksMTQgKzIxODksMTQgQEAKIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBjdGxfZXJyb3I7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gIkNhcmQgcmVnaXN0ZXJlZDogJXNcbiIsIGNhcmQtPmxvbmduYW1lKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsICJDYXJkIHJlZ2lzdGVyZWQ6ICVzXG4iLCBjYXJkLT5sb25nbmFtZSk7CiAKIAlwY2lfc2V0X2RydmRhdGEocGNpLCBjaGlwKTsKIAlkZXYrKzsKIAlyZXR1cm4gMDsKIAogY3RsX2Vycm9yOgotCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldyBjb250cm9sIGVycm9yICVkXG4iLCBlcnIpOworCWRldl9lcnIoY2FyZC0+ZGV2LCAibmV3IGNvbnRyb2wgZXJyb3IgJWRcbiIsIGVycik7CiAJc25kX2NhcmRfZnJlZShjYXJkKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjI5MSw4ICsyMjkxLDggQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VjaG9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXNuZF9lY2hvX2ZyZWUoY2hpcCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19kc3AuYwppbmRleCBkOGM2NzBjLi41YTZhMjE3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19kc3AuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19kc3AuYwpAQCAtNTMsNyArNTMsNyBAQAogCQl1ZGVsYXkoMSk7CiAJfQogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAid2FpdF9oYW5kc2hha2UoKTogVGltZW91dCB3YWl0aW5nIGZvciBEU1BcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdF9oYW5kc2hha2UoKTogVGltZW91dCB3YWl0aW5nIGZvciBEU1BcbiIpOwogCXJldHVybiAtRUJVU1k7CiB9CiAKQEAgLTE0OSw3ICsxNDksOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQlpZiAocmVhZF9kc3AoY2hpcCwgJnNuW2ldKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlYWQgc2VyaWFsIG51bWJlclxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlYWQgc2VyaWFsIG51bWJlclxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KQEAgLTE4NCw3ICsxODUsNyBAQAogCiAJZXJyID0gZ2V0X2Zpcm13YXJlKCZmdywgY2hpcCwgYXNpYyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkZpcm13YXJlIG5vdCBmb3VuZCAhXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRmlybXdhcmUgbm90IGZvdW5kICFcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMjQ3LDcgKzI0OCw3IEBACiAKIAlpID0gZ2V0X2Zpcm13YXJlKCZmdywgY2hpcCwgRldfMzYxX0xPQURFUik7CiAJaWYgKGkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJGaXJtd2FyZSBub3QgZm91bmQgIVxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIkZpcm13YXJlIG5vdCBmb3VuZCAhXG4iKTsKIAkJcmV0dXJuIGk7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21pZGkuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCmluZGV4IGFiZmQ1MWMuLjdmNGRmYWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCkBAIC0yMjEsNyArMjIxLDggQEAKIAkJREVfTUlEKCgiVHJ5IHRvIHNlbmQgJWQgYnl0ZXMuLi5cbiIsIGJ5dGVzKSk7CiAJCXNlbnQgPSB3cml0ZV9taWRpKGNoaXAsIGJ1ZiwgYnl0ZXMpOwogCQlpZiAoc2VudCA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIndyaXRlX21pZGkoKSBlcnJvciAlZFxuIiwgc2VudCk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkid3JpdGVfbWlkaSgpIGVycm9yICVkXG4iLCBzZW50KTsKIAkJCS8qIHJldHJ5IGxhdGVyICovCiAJCQlzZW50ID0gOTAwMDsKIAkJCWNoaXAtPm1pZGlfZnVsbCA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKaW5kZXggOWUxYmQwYy4uYWQ5ZDlmOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwpAQCAtMTE3LDcgKzExNyw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChtYXhfYnVmZmVyX3NpemVbZGV2XSA8IDMyKQpAQCAtMTY5LDcgKzE3MCw4IEBACiAJaWYgKHNuZF9zZXFfZGV2aWNlX25ldyhjYXJkLCAxLCBTTkRSVl9TRVFfREVWX0lEX0VNVTEwSzFfU1lOVEgsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZW11MTBrMV9zeW50aF9hcmcpLCAmd2F2ZSkgPCAwIHx8CiAJICAgIHdhdmUgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgaW5pdGlhbGl6ZSBFbXUxMGsxIHdhdmV0YWJsZSBzeW50aFxuIik7CisJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJjYW4ndCBpbml0aWFsaXplIEVtdTEwazEgd2F2ZXRhYmxlIHN5bnRoXG4iKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc25kX2VtdTEwazFfc3ludGhfYXJnICphcmc7CiAJCWFyZyA9IFNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKHdhdmUpOwpAQCAtMjQ2LDggKzI0OCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKaW5kZXggY2FlMzY1OS4uM2YzZWYzOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfY2FsbGJhY2suYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCQl2cCA9ICZlbXUtPnZvaWNlc1tiZXN0W2ldLnZvaWNlXTsKIAkJCWlmICgoY2ggPSB2cC0+Y2gpIDwgMCkgewogCQkJCS8qCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LAogCQkJCSAgICAgICAic3ludGhfZ2V0X3ZvaWNlOiBjaCA8IDAgKCVkKSA/PyIsIGkpOwogCQkJCSovCiAJCQkJY29udGludWU7CkBAIC0zMzksNyArMzM5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZW1lbS0+bWFwX2xvY2tlZCsrOwogCWlmIChzbmRfZW11MTBrMV9tZW1ibGtfbWFwKGh3LCBlbWVtKSA8IDApIHsKLQkJLyogcHJpbnRrKEtFUk5fRVJSICJlbXU6IGNhbm5vdCBtYXAhXG4iKTsgKi8KKwkJLyogZGV2X2Vycihody0+Y2FyZC0+ZGV2SywgImVtdTogY2Fubm90IG1hcCFcbiIpOyAqLwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWFwcGVkX29mZnNldCA9IHNuZF9lbXUxMGsxX21lbWJsa19vZmZzZXQoZW1lbSkgPj4gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggYmRkODg4ZS4uMjI5MjY5NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCX0KIAlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+Y2EwMTA4X2NoaXApIHsgLyogYXVkaWd5MiBWYWx1ZSAqLwogCQkvKiBIYWNrcyBmb3IgQWxpY2UzIHRvIHdvcmsgaW5kZXBlbmRlbnQgb2YgaGFQMTZWIGRyaXZlciAqLwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQXVkaWd5MiB2YWx1ZTogU3BlY2lhbCBjb25maWcuXG4iKTsKKwkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJBdWRpZ3kyIHZhbHVlOiBTcGVjaWFsIGNvbmZpZy5cbiIpOwogCQkvKiBTZXR1cCBTUkNNdWx0aV9JMlMgU2FtcGxpbmdSYXRlICovCiAJCXRtcCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgQV9TUERJRl9TQU1QTEVSQVRFLCAwKTsKIAkJdG1wICY9IDB4ZmZmZmYxZmY7CkBAIC03MjMsNyArNzIzLDggQEAKIAkJaWYgKHJlZyAmIEVNVV9IQU5BX09QVElPTl9ET0NLX09GRkxJTkUpIHsKIAkJCS8qIEF1ZGlvIERvY2sgYXR0YWNoZWQgKi8KIAkJCS8qIFJldHVybiB0byBBdWRpbyBEb2NrIHByb2dyYW1taW5nIG1vZGUgKi8KLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmVcbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmVcbiIpOwogCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCBFTVVfSEFOQV9GUEdBX0NPTkZJR19BVURJT0RPQ0spOwogCiAJCQlpZiAoIWVtdS0+ZG9ja19mdykgewpAQCAtNzU2LDE5ICs3NTcsMjUgQEAKIAogCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCAwKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lSUV9TVEFUVVMsICZyZWcpOwotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEVNVV9IQU5BK0RPQ0tfSVJRX1NUQVRVUyA9IDB4JXhcbiIsIHJlZyk7CisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkgImVtdTEwMTA6IEVNVV9IQU5BK0RPQ0tfSVJRX1NUQVRVUyA9IDB4JXhcbiIsCisJCQkJIHJlZyk7CiAJCQkvKiBJRCwgc2hvdWxkIHJlYWQgJiAweDdmID0gMHg1NSB3aGVuIEZQR0EgcHJvZ3JhbW1lZC4gKi8KIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnKTsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBFTVVfSEFOQStET0NLX0lEID0gMHgleFxuIiwgcmVnKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogRU1VX0hBTkErRE9DS19JRCA9IDB4JXhcbiIsIHJlZyk7CiAJCQlpZiAoKHJlZyAmIDB4MWYpICE9IDB4MTUpIHsKIAkJCQkvKiBGUEdBIGZhaWxlZCB0byBiZSBwcm9ncmFtbWVkICovCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IExvYWRpbmcgQXVkaW8gRG9jayBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwkJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkJICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZyA9IDB4JXhcbiIsCisJCQkJCSByZWcpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEF1ZGlvIERvY2sgRmlybXdhcmUgbG9hZGVkXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogQXVkaW8gRG9jayBGaXJtd2FyZSBsb2FkZWRcbiIpOwogCQkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0RPQ0tfTUFKT1JfUkVWLCAmdG1wKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9ET0NLX01JTk9SX1JFViwgJnRtcDIpOwotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkF1ZGlvIERvY2sgdmVyOiAldS4ldVxuIiwKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiQXVkaW8gRG9jayB2ZXI6ICV1LiV1XG4iLAogCQkJCSAgIHRtcCwgdG1wMik7CiAJCQkvKiBTeW5jIGNsb2NraW5nIGJldHdlZW4gMTAxMCBhbmQgRG9jayAqLwogCQkJLyogQWxsb3cgRExMIHRvIHNldHRsZSAqLwpAQCAtNzc3LDcgKzc4NCw3IEBACiAJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCBFTVVfVU5NVVRFKTsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogZmlybXdhcmUgdGhyZWFkIHN0b3BwaW5nXG4iKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IGZpcm13YXJlIHRocmVhZCBzdG9wcGluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxOCw3ICs4MjUsNyBAQAogCXUzMiB0bXAsIHRtcDIsIHJlZzsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IFNwZWNpYWwgY29uZmlnLlxuIik7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBTcGVjaWFsIGNvbmZpZy5cbiIpOwogCS8qIEFDOTcgMi4xLCBBbnkgMTZNZWcgb2YgNEdpZyBhZGRyZXNzLCBBdXRvLU11dGUsIEVNVTMyIFNsYXZlLAogCSAqIExvY2sgU291bmQgTWVtb3J5IENhY2hlLCBMb2NrIFRhbmsgTWVtb3J5IENhY2hlLAogCSAqIE11dGUgYWxsIGNvZGVjcy4KQEAgLTg0Myw3ICs4NTAsNyBAQAogCiAJLyogSUQsIHNob3VsZCByZWFkICYgMHg3ZiA9IDB4NTUuIChCaXQgNyBpcyB0aGUgSVJRIGJpdCkgKi8KIAlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JRCwgJnJlZyk7Ci0Jc25kX3ByaW50ZGQoInJlZzEgPSAweCV4XG4iLCByZWcpOworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJyZWcxID0gMHgleFxuIiwgcmVnKTsKIAlpZiAoKHJlZyAmIDB4M2YpID09IDB4MTUpIHsKIAkJLyogRlBHQSBuZXRsaXN0IGFscmVhZHkgcHJlc2VudCBzbyBjbGVhciBpdCAqLwogCQkvKiBSZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZSAqLwpAQCAtODUxLDEzICs4NTgsMTQgQEAKIAkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCAweDAyKTsKIAl9CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcpOwotCXNuZF9wcmludGRkKCJyZWcyID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicmVnMiA9IDB4JXhcbiIsIHJlZyk7CiAJaWYgKChyZWcgJiAweDNmKSA9PSAweDE1KSB7CiAJCS8qIEZQR0EgZmFpbGVkIHRvIHJldHVybiB0byBwcm9ncmFtbWluZyBtb2RlICovCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBGUEdBIGZhaWxlZCB0byByZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZVxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJlbXUxMDEwOiBGUEdBIGZhaWxlZCB0byByZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRU1VX0hBTkFfSUQgPSAweCV4XG4iLCByZWcpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogRU1VX0hBTkFfSUQgPSAweCV4XG4iLCByZWcpOwogCiAJaWYgKCFlbXUtPmZpcm13YXJlKSB7CiAJCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwpAQCAtODgwLDE2ICs4ODgsMTkgQEAKIAogCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZlbXUtPmZpcm13YXJlLCBmaWxlbmFtZSwgJmVtdS0+cGNpLT5kZXYpOwogCQlpZiAoZXJyICE9IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwMTA6IGZpcm13YXJlOiAlcyBub3QgZm91bmQuIEVyciA9ICVkXG4iLCBmaWxlbmFtZSwgZXJyKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogZmlybXdhcmU6ICVzIG5vdCBmb3VuZC4gRXJyID0gJWRcbiIsCisJCQkJIGZpbGVuYW1lLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogZmlybXdhcmUgZmlsZSA9ICVzLCBzaXplID0gMHglenhcbiIsCisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJlbXUxMDEwOiBmaXJtd2FyZSBmaWxlID0gJXMsIHNpemUgPSAweCV6eFxuIiwKIAkJCSAgIGZpbGVuYW1lLCBlbXUtPmZpcm13YXJlLT5zaXplKTsKIAl9CiAKIAllcnIgPSBzbmRfZW11MTAxMF9sb2FkX2Zpcm13YXJlKGVtdSwgZW11LT5maXJtd2FyZSk7CiAJaWYgKGVyciAhPSAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEZpcm13YXJlIGZhaWxlZFxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogTG9hZGluZyBGaXJtd2FyZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtODk3LDIxICs5MDgsMjMgQEAKIAlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JRCwgJnJlZyk7CiAJaWYgKChyZWcgJiAweDNmKSAhPSAweDE1KSB7CiAJCS8qIEZQR0EgZmFpbGVkIHRvIGJlIHByb2dyYW1tZWQgKi8KLQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IExvYWRpbmcgSGFuYSBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkgImVtdTEwMTA6IExvYWRpbmcgSGFuYSBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnID0gMHgleFxuIiwKKwkJCSByZWcpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogSGFuYSBGaXJtd2FyZSBsb2FkZWRcbiIpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogSGFuYSBGaXJtd2FyZSBsb2FkZWRcbiIpOwogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX01BSk9SX1JFViwgJnRtcCk7CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfTUlOT1JfUkVWLCAmdG1wMik7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEhhbmEgdmVyc2lvbjogJXUuJXVcbiIsIHRtcCwgdG1wMik7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBIYW5hIHZlcnNpb246ICV1LiV1XG4iLCB0bXAsIHRtcDIpOwogCS8qIEVuYWJsZSA0OFZvbHQgcG93ZXIgdG8gQXVkaW8gRG9jayAqLwogCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX1BXUiwgRU1VX0hBTkFfRE9DS19QV1JfT04pOwogCiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IENhcmQgb3B0aW9ucyA9IDB4JXhcbiIsIHJlZyk7CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IENhcmQgb3B0aW9ucyA9IDB4JXhcbiIsIHJlZyk7CiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSUNBTF9UWVBFLCAmdG1wKTsKIAkvKiBPcHRpY2FsIC0+IEFEQVQgSS9PICAqLwogCS8qIDAgOiBTUERJRgpAQCAtOTUwLDcgKzk2Myw3IEBACiAJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0lSUV9FTkFCTEUsIDB4MDApOwogCiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zMyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBDYXJkIG9wdGlvbnMzID0gMHgleFxuIiwgcmVnKTsKIAkvKiBEZWZhdWx0IFdDTEsgc2V0IHRvIDQ4a0h6LiAqLwogCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ERUZDTE9DSywgMHgwMCk7CiAJLyogV29yZCBDbG9jayBzb3VyY2UsIEludGVybmFsIDQ4a0h6IHgxICovCkBAIC0xODA4LDcgKzE4MjEsOSBAQAogCWVtdS0+cmV2aXNpb24gPSBwY2ktPnJldmlzaW9uOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmZW11LT5zZXJpYWwpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJmVtdS0+bW9kZWwpOwotCXNuZF9wcmludGRkKCJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW1fdmVuZG9yX2lkID0gMHgleCwgc3Vic3lzdGVtX2lkID0gMHgleFxuIiwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlLCBlbXUtPnNlcmlhbCwgZW11LT5tb2RlbCk7CisJZGV2X2RiZyhjYXJkLT5kZXYsCisJCSJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW1fdmVuZG9yX2lkID0gMHgleCwgc3Vic3lzdGVtX2lkID0gMHgleFxuIiwKKwkJcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlLCBlbXUtPnNlcmlhbCwgZW11LT5tb2RlbCk7CiAKIAlmb3IgKGMgPSBlbXVfY2hpcF9kZXRhaWxzOyBjLT52ZW5kb3I7IGMrKykgewogCQlpZiAoYy0+dmVuZG9yID09IHBjaS0+dmVuZG9yICYmIGMtPmRldmljZSA9PSBwY2ktPmRldmljZSkgewpAQCAtMTgyNywyMSArMTg0MiwyMSBAQAogCQl9CiAJfQogCWlmIChjLT52ZW5kb3IgPT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBDYXJkIG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJlbXUxMGsxOiBDYXJkIG5vdCByZWNvZ25pc2VkXG4iKTsKIAkJa2ZyZWUoZW11KTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAllbXUtPmNhcmRfY2FwYWJpbGl0aWVzID0gYzsKIAlpZiAoYy0+c3Vic3lzdGVtICYmICFzdWJzeXN0ZW0pCi0JCXNuZF9wcmludGRkKCJTb3VuZCBjYXJkIG5hbWUgPSAlc1xuIiwgYy0+bmFtZSk7CisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lID0gJXNcbiIsIGMtPm5hbWUpOwogCWVsc2UgaWYgKHN1YnN5c3RlbSkKLQkJc25kX3ByaW50ZGQoIlNvdW5kIGNhcmQgbmFtZSA9ICVzLCAiCisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lID0gJXMsICIKIAkJCSJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW0gPSAweCV4LiAiCiAJCQkiRm9yY2VkIHRvIHN1YnN5c3RlbSA9IDB4JXhcbiIsCWMtPm5hbWUsCiAJCQlwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UsIGVtdS0+c2VyaWFsLCBjLT5zdWJzeXN0ZW0pOwogCWVsc2UKLQkJc25kX3ByaW50ZGQoIlNvdW5kIGNhcmQgbmFtZSA9ICVzLCAiCisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiU291bmQgY2FyZCBuYW1lID0gJXMsICIKIAkJCSJ2ZW5kb3IgPSAweCV4LCBkZXZpY2UgPSAweCV4LCBzdWJzeXN0ZW0gPSAweCV4LlxuIiwKIAkJCWMtPm5hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSwKIAkJCWVtdS0+c2VyaWFsKTsKQEAgLTE4NjksNyArMTg4NCw5IEBACiAJZW11LT5kbWFfbWFzayA9IGlzX2F1ZGlneSA/IEFVRElHWV9ETUFfTUFTSyA6IEVNVTEwSzFfRE1BX01BU0s7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBlbXUtPmRtYV9tYXNrKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgZW11LT5kbWFfbWFzaykgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IFBDSSBidXNtYXN0ZXIgRE1BIHdpdGggbWFzayAweCVseFxuIiwgZW11LT5kbWFfbWFzayk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IFBDSSBidXNtYXN0ZXIgRE1BIHdpdGggbWFzayAweCVseFxuIiwKKwkJCWVtdS0+ZG1hX21hc2spOwogCQlrZnJlZShlbXUpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTIwMjEsNyArMjAzOCw2IEBACiAJc25kX2VtdTEwazFfcHJvY19pbml0KGVtdSk7CiAjZW5kaWYKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAkqcmVtdSA9IGVtdTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jCmluZGV4IDY2MmE0NTguLjBlMDY5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3BhdGNoLmMKQEAgLTUwLDcgKzUwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc3AtPnYuc2l6ZSA9PSAwKSB7Ci0JCXNuZF9wcmludGQoImVtdTogcm9tIGZvbnQgZm9yIHNhbXBsZSAlZFxuIiwgc3AtPnYuc2FtcGxlKTsKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJCSJlbXU6IHJvbSBmb250IGZvciBzYW1wbGUgJWRcbiIsIHNwLT52LnNhbXBsZSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTIsNyArOTMsOCBAQAogCQlibG9ja3NpemUgKj0gMjsKIAlzcC0+YmxvY2sgPSBzbmRfZW11MTBrMV9zeW50aF9hbGxvYyhlbXUsIGJsb2Nrc2l6ZSk7CiAJaWYgKHNwLT5ibG9jayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoImVtdTEwazE6IHN5bnRoIG1hbGxvYyBmYWlsZWQgKHNpemU9JWQpXG4iLCBibG9ja3NpemUpOworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkJInN5bnRoIG1hbGxvYyBmYWlsZWQgKHNpemU9JWQpXG4iLCBibG9ja3NpemUpOwogCQkvKiBub3QgRU5PTUVNIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9TUykgKi8KIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKaW5kZXggNTZhZDlkNi4uZWZlMDE3NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCkBAIC0zNjksNyArMzY5LDggQEAKIAlpZiAoZXBjbS0+c3Vic3RyZWFtID09IE5VTEwpCiAJCXJldHVybjsKICNpZiAwCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gIklSUTogcG9zaXRpb24gPSAweCV4LCBwZXJpb2QgPSAweCV4LCBzaXplID0gMHgleFxuIiwKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJICJJUlE6IHBvc2l0aW9uID0gMHgleCwgcGVyaW9kID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCiAJCSAgIGVwY20tPnN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKGVwY20tPnN1YnN0cmVhbSksCiAJCSAgIHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhlcGNtLT5zdWJzdHJlYW0pLAogCQkgICBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoZXBjbS0+c3Vic3RyZWFtKSk7CkBAIC00ODcsNyArNDg4LDExIEBACiAJaW50IGNoYW5uZWwgPSBlcGNtLT52b2ljZS0+bnVtYmVyOwogCWludCByZXN1bHQgPSAwOwogCi0vLwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAidHJpZ2dlciAtIGVtdTEwazF4ID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlZFxuIiwgKGludCllbXUsIGNtZCwgKGludClzdWJzdHJlYW0tPm9wcy0+cG9pbnRlcihzdWJzdHJlYW0pKTsKKwkvKgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJ0cmlnZ2VyIC0gZW11MTBrMXggPSAweCV4LCBjbWQgPSAlaSwgcG9pbnRlciA9ICVkXG4iLAorCQkoaW50KWVtdSwgY21kLCAoaW50KXN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKHN1YnN0cmVhbSkpOworCSovCiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC04MjYsNyArODMxLDcgQEAKIAkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGlmIG5lY2Vzc2FyeQogCW91dGwoc3RhdHVzLCBjaGlwLT5wb3J0ICsgSVBSKTsKIAotCS8vIHNuZF9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgJTA4eFxuIiwgc3RhdHVzKTsKKwkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdCAlMDh4XG4iLCBzdGF0dXMpOyAqLwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtOTE5LDcgKzkyNCw3IEBACiAJCXJldHVybiBlcnI7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHRvIHNldCAyOGJpdCBtYXNrIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgdG8gc2V0IDI4Yml0IG1hc2sgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtOTQwLDE0ICs5NDUsMTUgQEAKIAljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKChjaGlwLT5yZXNfcG9ydCA9IHJlcXVlc3RfcmVnaW9uKGNoaXAtPnBvcnQsIDgsCiAJCQkJCSAgICAgIkVNVTEwSzFYIikpID09IE5VTEwpIHsgCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgYWxsb2NhdGUgdGhlIHBvcnQgMHglbHhcbiIsIGNoaXAtPnBvcnQpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgcG9ydCAweCVseFxuIiwKKwkJCWNoaXAtPnBvcnQpOwogCQlzbmRfZW11MTBrMXhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lbXUxMGsxeF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtOTY0LDcgKzk3MCw3IEBACiAJY2hpcC0+cmV2aXNpb24gPSBwY2ktPnJldmlzaW9uOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmY2hpcC0+c2VyaWFsKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZjaGlwLT5tb2RlbCk7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsIGNoaXAtPm1vZGVsLAorCWRldl9pbmZvKGNhcmQtPmRldiwgIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsIGNoaXAtPm1vZGVsLAogCQkgICBjaGlwLT5yZXZpc2lvbiwgY2hpcC0+c2VyaWFsKTsKIAogCW91dGwoMCwgY2hpcC0+cG9ydCArIElOVEUpOwkKQEAgLTEyNDgsNyArMTI1NCw5IEBACiAJCW1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAodGltZW91dCA8PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjbWQ6IGNsZWFyIHJ4IHRpbWVvdXQgKHN0YXR1cyA9IDB4JXgpXG4iLCBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKKwkJCW1wdTQwMV9yZWFkX3N0YXQoZW11LCBtcHUpKTsKICNlbmRpZgogfQogCkBAIC0xMzIyLDcgKzEzMzAsOCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5pbnB1dF9sb2NrLCBmbGFncyk7CiAJaWYgKCFvaykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHglbHggKHN0YXR1cyA9IDB4JXgsIGRhdGEgPSAweCV4KSEhIVxuIiwKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCSJtaWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHglbHggKHN0YXR1cyA9IDB4JXgsIGRhdGEgPSAweCV4KSEhIVxuIiwKIAkJCSAgIGNtZCwgZW11LT5wb3J0LAogCQkJICAgbXB1NDAxX3JlYWRfc3RhdChlbXUsIG1pZGkpLAogCQkJICAgbXB1NDAxX3JlYWRfZGF0YShlbXUsIG1pZGkpKTsKQEAgLTE1NjQsNyArMTU3Myw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xNjA4LDggKzE2MTgsNiBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPnBvcnQsIGNoaXAtPmlycSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCmluZGV4IDFmOWM3YzQuLjc0NWYwNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIAkvKiBBX1BVVF9TVEVSRU9fT1VUUFVUKEFfRVhUT1VUX0ZST05UX0wsIEFfRVhUT1VUX0ZST05UX1IsIHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpOyAqLwogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXVfbW9kZWwpIHsKIAkJLyogRU1VMTAxMCBPdXRwdXRzIGZyb20gUENNIEZyb250LCBSZWFyLCBDZW50ZXIsIExGRSwgU2lkZSAqLwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRU1VIG91dHB1dHMgb25cbiIpOworCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgIkVNVSBvdXRwdXRzIG9uXG4iKTsKIAkJZm9yICh6ID0gMDsgeiA8IDg7IHorKykgewogCQkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDEwOF9jaGlwKSB7CiAJCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEEzX0VNVTMyT1VUKHopLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKQEAgLTE1NzEsNyArMTU3MSw5IEBACiAJCUFfU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiwgdG1wICsgMSk7CiAJCWlmICgoej09MSkgJiYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPnNwZGlmX2J1ZykpIHsKIAkJCS8qIER1ZSB0byBhIFNQRElGIG91dHB1dCBidWcgb24gc29tZSBBdWRpZ3kgY2FyZHMsIHRoaXMgY29kZSBkZWxheXMgdGhlIFJpZ2h0IGNoYW5uZWwgYnkgMSBzYW1wbGUgKi8KLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJJbnN0YWxsaW5nIHNwZGlmX2J1ZyBwYXRjaDogJXNcbiIsIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPm5hbWUpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJJbnN0YWxsaW5nIHNwZGlmX2J1ZyBwYXRjaDogJXNcbiIsCisJCQkJIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPm5hbWUpOwogCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRVhUT1VUKEFfRVhUT1VUX0ZST05UX0wgKyB6KSwgQV9HUFIoZ3ByIC0gMyksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKIAkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAzKSwgQV9HUFIodG1wICsgMCksIEFfR1BSKHRtcCArIDEpLCBBX0NfMDAwMDAwMDApOwogCQl9IGVsc2UgewpAQCAtMTU5NSw3ICsxNTk3LDcgQEAKIAogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXVfbW9kZWwpIHsKIAkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDEwOF9jaGlwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRU1VMiBpbnB1dHMgb25cbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJFTVUyIGlucHV0cyBvblxuIik7CiAJCQlmb3IgKHogPSAwOyB6IDwgMHgxMDsgeisrKSB7CiAJCQkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIAogCQkJCQkJCQkJYml0X3NoaWZ0ZXIxNiwKQEAgLTE2MDMsMTEgKzE2MDUsMTEgQEAKIAkJCQkJCQkJCUFfRlhCVVMyKHoqMikgKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJFTVUgaW5wdXRzIG9uXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiRU1VIGlucHV0cyBvblxuIik7CiAJCQkvKiBDYXB0dXJlIDE2IChvcmlnaW5hbGx5IDgpIGNoYW5uZWxzIG9mIFMzMl9MRSBzb3VuZCAqLwogCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgImVtdWZ4LmM6IGdwcj0weCV4LCB0bXA9MHgleFxuIiwKKwkJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlbXVmeC5jOiBncHI9MHgleCwgdG1wPTB4JXhcbiIsCiAJCQkgICAgICAgZ3ByLCB0bXApOwogCQkJKi8KIAkJCS8qIEZvciB0aGUgRU1VMTAxMDogSG93IHRvIGdldCAzMmJpdCB2YWx1ZXMgZnJvbSB0aGUgRFNQLiBIaWdoIDE2Yml0cyBpbnRvIEwsIGxvdyAxNmJpdHMgaW50byBSLiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKaW5kZXggZjZjM2RhMC4uYzVhZTJhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCkBAIC0xODUzLDggKzE4NTMsMTAgQEAKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmVtdS0+YWM5NykpIDwgMCkgewogCQkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmFjOTdfY2hpcCA9PSAxKQogCQkJCXJldHVybiBlcnI7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiZW11MTBrMTogQUM5NyBpcyBvcHRpb25hbCBvbiB0aGlzIGJvYXJkXG4iKTsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPIiAgICAgICAgICBQcm9jZWVkaW5nIHdpdGhvdXQgYWM5NyBtaXhlcnMuLi5cbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJBQzk3IGlzIG9wdGlvbmFsIG9uIHRoaXMgYm9hcmRcbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJQcm9jZWVkaW5nIHdpdGhvdXQgYWM5NyBtaXhlcnMuLi5cbiIpOwogCQkJc25kX2RldmljZV9mcmVlKGVtdS0+Y2FyZCwgcGJ1cyk7CiAJCQlnb3RvIG5vX2FjOTc7IC8qIEZJWE1FOiBnZXQgcmlkIG9mIHVnbHkgZ290b3MuLiAqLwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVtcHU0MDEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jCmluZGV4IDFlYzkxMjQuLmZkZjJiMGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jCkBAIC02NCw3ICs2NCw5IEBACiAJCW1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAodGltZW91dCA8PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjbWQ6IGNsZWFyIHJ4IHRpbWVvdXQgKHN0YXR1cyA9IDB4JXgpXG4iLCBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwKKwkJCW1wdTQwMV9yZWFkX3N0YXQoZW11LCBtcHUpKTsKICNlbmRpZgogfQogCkBAIC0xNDEsNyArMTQzLDggQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+aW5wdXRfbG9jaywgZmxhZ3MpOwogCWlmICghb2spIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCiAJCQkgICBjbWQsIGVtdS0+cG9ydCwKIAkJCSAgIG1wdTQwMV9yZWFkX3N0YXQoZW11LCBtaWRpKSwKIAkJCSAgIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtaWRpKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCmluZGV4IDVhZTFkMDQuLmY4MjQ4MWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCkBAIC00NCw3ICs0NCw4IEBACiAJaWYgKGVwY20tPnN1YnN0cmVhbSA9PSBOVUxMKQogCQlyZXR1cm47CiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJJUlE6IHBvc2l0aW9uID0gMHgleCwgcGVyaW9kID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJIklSUTogcG9zaXRpb24gPSAweCV4LCBwZXJpb2QgPSAweCV4LCBzaXplID0gMHgleFxuIiwKIAkJCWVwY20tPnN1YnN0cmVhbS0+cnVudGltZS0+aHctPnBvaW50ZXIoZW11LCBlcGNtLT5zdWJzdHJlYW0pLAogCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKGVwY20tPnN1YnN0cmVhbSksCiAJCQlzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoZXBjbS0+c3Vic3RyZWFtKSk7CkBAIC0xNDcsNyArMTQ4LDcgQEAKIAkJCQkJICAgICAgJmVwY20tPmV4dHJhKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCS8qCi0JCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX2NoYW5uZWxfYWxsb2M6ICIKKwkJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJwY21fY2hhbm5lbF9hbGxvYzogIgogCQkJICAgICAgICJmYWlsZWQgZXh0cmE6IHZvaWNlcz0lZCwgZnJhbWU9JWRcbiIsCiAJCQkgICAgICAgdm9pY2VzLCBmcmFtZSk7CiAJCQkqLwpAQCAtNzYxLDcgKzc2Miw4IEBACiAJaW50IHJlc3VsdCA9IDA7CiAKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJ0cmlnZ2VyIC0gZW11MTBrMSA9IDB4JXgsIGNtZCA9ICVpLCBwb2ludGVyID0gJWlcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJInRyaWdnZXIgLSBlbXUxMGsxID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlaVxuIiwKIAkgICAgICAgKGludCllbXUsIGNtZCwgc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKSkKIAkqLwogCXNwaW5fbG9jaygmZW11LT5yZWdfbG9jayk7CkBAIC04MTUsNyArODE3LDcgQEAKIAkJb3V0bChlcGNtLT5jYXB0dXJlX2lwciwgZW11LT5wb3J0ICsgSVBSKTsKIAkJc25kX2VtdTEwazFfaW50cl9lbmFibGUoZW11LCBlcGNtLT5jYXB0dXJlX2ludGUpOwogCQkvKgotCQlwcmludGsoS0VSTl9ERUJVRyAiYWRjY3IgPSAweCV4LCBhZGNicyA9IDB4JXhcbiIsCisJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJhZGNjciA9IDB4JXgsIGFkY2JzID0gMHgleFxuIiwKIAkJICAgICAgIGVwY20tPmFkY2NyLCBlcGNtLT5hZGNicyk7CiAJCSovCiAJCXN3aXRjaCAoZXBjbS0+dHlwZSkgewpAQCAtODI2LDcgKzgyOCwxMCBAQAogCQkJaWYgKGVtdS0+YXVkaWd5KSB7CiAJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMSwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwpOwogCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhXQzIsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsMik7Ci0JCQkJc25kX3ByaW50ZGQoImNyX3ZhbD0weCV4LCBjcl92YWwyPTB4JXhcbiIsIGVwY20tPmNhcHR1cmVfY3JfdmFsLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbDIpOworCQkJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCQkJCSJjcl92YWw9MHgleCwgY3JfdmFsMj0weCV4XG4iLAorCQkJCQllcGNtLT5jYXB0dXJlX2NyX3ZhbCwKKwkJCQkJZXBjbS0+Y2FwdHVyZV9jcl92YWwyKTsKIAkJCX0gZWxzZQogCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZYV0MsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsKTsKIAkJCWJyZWFrOwpAQCAtODg5LDcgKzg5NCw3IEBACiAJfQogI2VuZGlmCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJICAgICAgICJwdHIgPSAweCVseCwgYnVmZmVyX3NpemUgPSAweCVseCwgcGVyaW9kX3NpemUgPSAweCVseFxuIiwKIAkgICAgICAgKGxvbmcpcHRyLCAobG9uZylydW50aW1lLT5idWZmZXJfc2l6ZSwKIAkgICAgICAgKGxvbmcpcnVudGltZS0+cGVyaW9kX3NpemUpOwpAQCAtMTU5NCw3ICsxNTk5LDggQEAKIAkJCQkJCSAgIHVuc2lnbmVkIGludCB0cmFtX3NoaWZ0KQogewogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgInRyYW1fcG9rZTE6IGRzdF9sZWZ0ID0gMHglcCwgZHN0X3JpZ2h0ID0gMHglcCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJ0cmFtX3Bva2UxOiBkc3RfbGVmdCA9IDB4JXAsIGRzdF9yaWdodCA9IDB4JXAsICIKIAkgICAgICAgInNyYyA9IDB4JXAsIGNvdW50ID0gMHgleFxuIiwKIAkgICAgICAgZHN0X2xlZnQsIGRzdF9yaWdodCwgc3JjLCBjb3VudCk7CiAJKi8KQEAgLTE2NzUsNyArMTY4MSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHJlcGFyZTogZXRyYW1fcGFnZXMgPSAweCVwLCBkbWFfYXJlYSA9IDB4JXgsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHJlcGFyZTogZXRyYW1fcGFnZXMgPSAweCVwLCBkbWFfYXJlYSA9IDB4JXgsICIKIAkgICAgICAgImJ1ZmZlcl9zaXplID0gMHgleCAoMHgleClcbiIsCiAJICAgICAgIGVtdS0+Zng4MDEwLmV0cmFtX3BhZ2VzLCBydW50aW1lLT5kbWFfYXJlYSwKIAkgICAgICAgcnVudGltZS0+YnVmZmVyX3NpemUsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIDw8IDIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaW8uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKaW5kZXggZTRmYmE0OS4uNzA2YjRmMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvaW8uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCkBAIC03MSwxMSArNzEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1hc2s7CiAKLQlpZiAoIWVtdSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwdHJfd3JpdGU6IGVtdSBpcyBudWxsIVxuIik7Ci0JCWR1bXBfc3RhY2soKTsKKwlpZiAoc25kX0JVR19PTighZW11KSkKIAkJcmV0dXJuOwotCX0KIAltYXNrID0gZW11LT5hdWRpZ3kgPyBBX1BUUl9BRERSRVNTX01BU0sgOiBQVFJfQUREUkVTU19NQVNLOwogCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIG1hc2spIHwgKGNobiAmIFBUUl9DSEFOTkVMTlVNX01BU0spOwogCkBAIC0xOTksNyArMTk2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAogCWlmICgocmVnID4gMHg3ZikgfHwgKHZhbHVlID4gMHgxZmYpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImkyY193cml0ZTogaW52YWxpZCB2YWx1ZXMuXG4iKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwgImkyY193cml0ZTogaW52YWxpZCB2YWx1ZXMuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjcsNyArMjI0LDcgQEAKIAkJCQlicmVhazsKIAogCQkJaWYgKHRpbWVvdXQgPiAxMDAwKSB7Ci0gICAgICAgICAgICAgICAgCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORworCQkJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LAogCQkJCQkgICAiZW11MTBrMTpJMkM6dGltZW91dCBzdGF0dXM9MHgleFxuIiwKIAkJCQkJICAgc3RhdHVzKTsKIAkJCQlicmVhazsKQEAgLTIzOSw4ICsyMzYsOCBAQAogCX0KIAogCWlmIChyZXRyeSA9PSAxMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJXcml0aW5nIHRvIEFEQyBmYWlsZWQhXG4iKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3RhdHVzPTB4JXgsIHJlZz0lZCwgdmFsdWU9JWRcbiIsCisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJXcml0aW5nIHRvIEFEQyBmYWlsZWQhXG4iKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwgInN0YXR1cz0weCV4LCByZWc9JWQsIHZhbHVlPSVkXG4iLAogCQkJc3RhdHVzLCByZWcsIHZhbHVlKTsKIAkJLyogZHVtcF9zdGFjaygpOyAqLwogCQllcnIgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaXJxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYwppbmRleCAzMGJmZWQ2Li4zYzVjNWUzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYwpAQCAtNDEsMTEgKzQxLDEyIEBACiAJCW9yaWdfc3RhdHVzID0gc3RhdHVzOwogCQloYW5kbGVkID0gMTsKIAkJaWYgKChzdGF0dXMgJiAweGZmZmZmZmZmKSA9PSAweGZmZmZmZmZmKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAic25kLWVtdTEwazE6IFN1c3BlY3RlZCBzb3VuZCBjYXJkIHJlbW92YWxcbiIpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJTdXNwZWN0ZWQgc291bmQgY2FyZCByZW1vdmFsXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChzdGF0dXMgJiBJUFJfUENJRVJST1IpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludGVycnVwdDogUENJIGVycm9yXG4iKTsKKwkJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IFBDSSBlcnJvclxuIik7CiAJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX1BDSUVSUk9SRU5BQkxFKTsKIAkJCXN0YXR1cyAmPSB+SVBSX1BDSUVSUk9SOwogCQl9CkBAIC0xNTcsMTkgKzE1OCwyMiBAQAogCQkJCXN0cnVjdCBzbmRfZW11MTBrMV92b2ljZSAqcHZvaWNlID0gJihlbXUtPnAxNnZfdm9pY2VzWzBdKTsKIAkJCQlzdHJ1Y3Qgc25kX2VtdTEwazFfdm9pY2UgKmN2b2ljZSA9ICYoZW11LT5wMTZ2X2NhcHR1cmVfdm9pY2UpOwogCi0JCQkJLy9wcmludGsoS0VSTl9JTkZPICJzdGF0dXMyPTB4JXhcbiIsIHN0YXR1czIpOworCQkJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJzdGF0dXMyPTB4JXhcbiIsIHN0YXR1czIpOyAqLwogCQkJCW9yaWdfc3RhdHVzMiA9IHN0YXR1czI7CiAJCQkJaWYoc3RhdHVzMiAmIG1hc2spIHsKIAkJCQkJaWYocHZvaWNlLT51c2UpIHsKIAkJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHZvaWNlLT5lcGNtLT5zdWJzdHJlYW0pOwogCQkJCQl9IGVsc2UgeyAKLQkJCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInAxNnY6IHN0YXR1czogMHglMDh4LCBtYXNrPTB4JTA4eCwgcHZvaWNlPSVwLCB1c2U9JWRcbiIsIHN0YXR1czIsIG1hc2ssIHB2b2ljZSwgcHZvaWNlLT51c2UpOworCQkJCQkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCQkJCQkicDE2djogc3RhdHVzOiAweCUwOHgsIG1hc2s9MHglMDh4LCBwdm9pY2U9JXAsIHVzZT0lZFxuIiwKKwkJCQkJCQlzdGF0dXMyLCBtYXNrLCBwdm9pY2UsCisJCQkJCQkJcHZvaWNlLT51c2UpOwogCQkJCQl9CiAJCQkJfQogCQkJCWlmKHN0YXR1czIgJiAweDExMDAwMCkgewotCQkJCQkvL3ByaW50ayhLRVJOX0lORk8gImNhcHR1cmUgaW50IGZvdW5kXG4iKTsKKwkJCQkJLyogZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJjYXB0dXJlIGludCBmb3VuZFxuIik7ICovCiAJCQkJCWlmKGN2b2ljZS0+dXNlKSB7Ci0JCQkJCQkvL3ByaW50ayhLRVJOX0lORk8gImNhcHR1cmUgcGVyaW9kX2VsYXBzZWRcbiIpOworCQkJCQkJLyogZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJjYXB0dXJlIHBlcmlvZF9lbGFwc2VkXG4iKTsgKi8KIAkJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY3ZvaWNlLT5lcGNtLT5zdWJzdHJlYW0pOwogCQkJCQl9CiAJCQkJfQpAQCAtMTgwLDcgKzE4NCw4IEBACiAKIAkJaWYgKHN0YXR1cykgewogCQkJdW5zaWduZWQgaW50IGJpdHM7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmhhbmRsZWQgaW50ZXJydXB0OiAweCUwOHhcbiIsIHN0YXR1cyk7CisJCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSJ1bmhhbmRsZWQgaW50ZXJydXB0OiAweCUwOHhcbiIsIHN0YXR1cyk7CiAJCQkvL21ha2Ugc3VyZSBhbnkgaW50ZXJydXB0cyB3ZSBkb24ndCBoYW5kbGUgYXJlIGRpc2FibGVkOgogCQkJYml0cyA9IElOVEVfRlhEU1BFTkFCTEUgfAogCQkJCUlOVEVfUENJRVJST1JFTkFCTEUgfApAQCAtMjAyLDcgKzIwNyw3IEBACiAJCW91dGwob3JpZ19zdGF0dXMsIGVtdS0+cG9ydCArIElQUik7IC8qIGFjayBhbGwgKi8KIAl9CiAJaWYgKHRpbWVvdXQgPT0gMTAwMCkKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwazEgaXJxIHJvdXRpbmUgZmFpbHVyZVxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTBrMSBpcnEgcm91dGluZSBmYWlsdXJlXG4iKTsKIAogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9tZW1vcnkuYwppbmRleCBhZTcwOWMxLi5jNjhlNmRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9tZW1vcnkuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9tZW1vcnkuYwpAQCAtMjM2LDExICsyMzYsMTMgQEAKIHN0YXRpYyBpbnQgaXNfdmFsaWRfcGFnZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgZG1hX2FkZHJfdCBhZGRyKQogewogCWlmIChhZGRyICYgfmVtdS0+ZG1hX21hc2spIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWF4IG1lbW9yeSBzaXplIGlzIDB4JWx4IChhZGRyID0gMHglbHgpISFcbiIsIGVtdS0+ZG1hX21hc2ssICh1bnNpZ25lZCBsb25nKWFkZHIpOworCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJIm1heCBtZW1vcnkgc2l6ZSBpcyAweCVseCAoYWRkciA9IDB4JWx4KSEhXG4iLAorCQkJZW11LT5kbWFfbWFzaywgKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoYWRkciAmIChFTVVQQUdFU0laRS0xKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwYWdlIGlzIG5vdCBhbGlnbmVkXG4iKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwgInBhZ2UgaXMgbm90IGFsaWduZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC0zMzEsNyArMzMzLDggQEAKIAkJZWxzZQogCQkJYWRkciA9IHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc3Vic3RyZWFtLCBvZnMpOwogCQlpZiAoISBpc192YWxpZF9wYWdlKGVtdSwgYWRkcikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11OiBmYWlsdXJlIHBhZ2UgPSAlZFxuIiwgaWR4KTsKKwkJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkJImVtdTogZmFpbHVyZSBwYWdlID0gJWRcbiIsIGlkeCk7CiAJCQltdXRleF91bmxvY2soJmhkci0+YmxvY2tfbXV0ZXgpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTUwNyw3ICs1MTAsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAlwdHIgPSBlbXUtPnBhZ2VfcHRyX3RhYmxlW3BhZ2VdOwogCWlmICghIHB0cikgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGFjY2VzcyB0byBOVUxMIHB0cjogcGFnZSA9ICVkXG4iLCBwYWdlKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCSJhY2Nlc3MgdG8gTlVMTCBwdHI6IHBhZ2UgPSAlZFxuIiwgcGFnZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwdHIgKz0gb2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvcDE2di5jIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCmluZGV4IDdlMjAyNWMuLmE0ZmU3ZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMV9wY20gKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAgIAogCWlmIChlcGNtKSB7Ci0gICAgICAgIAkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20gZnJlZTogJXBcbiIsIGVwY20pOyAqLworCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiZXBjbSBmcmVlOiAlcFxuIiwgZXBjbSk7ICovCiAJCWtmcmVlKGVwY20pOwogCX0KIH0KQEAgLTE4MywxNCArMTgzLDE0IEBACiAJaW50IGVycjsKIAogCWVwY20gPSBremFsbG9jKHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOwotICAgICAgICAvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20ga2NhbGxvYzogJXBcbiIsIGVwY20pOyAqLworCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlcGNtIGtjYWxsb2M6ICVwXG4iLCBlcGNtKTsgKi8KIAogCWlmIChlcGNtID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCWVwY20tPmVtdSA9IGVtdTsKIAllcGNtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJLyoKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20gZGV2aWNlPSVkLCBjaGFubmVsX2lkPSVkXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlcGNtIGRldmljZT0lZCwgY2hhbm5lbF9pZD0lZFxuIiwKIAkJICAgc3Vic3RyZWFtLT5wY20tPmRldmljZSwgY2hhbm5lbF9pZCk7CiAJKi8KIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlcGNtOwpAQCAtMjAzLDEwICsyMDMsMTAgQEAKIAogICAgICAgICBjaGFubmVsLT51c2U9MTsKICNpZiAwIC8qIGRlYnVnICovCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJICAgInAxNnY6IG9wZW4gY2hhbm5lbF9pZD0lZCwgY2hhbm5lbD0lcCwgdXNlPTB4JXhcbiIsCiAJCSAgIGNoYW5uZWxfaWQsIGNoYW5uZWwsIGNoYW5uZWwtPnVzZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAib3BlbjpjaGFubmVsX2lkPSVkLCBjaGlwPSVwLCBjaGFubmVsPSVwXG4iLAogCSAgICAgICBjaGFubmVsX2lkLCBjaGlwLCBjaGFubmVsKTsKICNlbmRpZiAvKiBkZWJ1ZyAqLwogCS8qIGNoYW5uZWwtPmludGVycnVwdCA9IHNuZF9wMTZ2X3BjbV9jaGFubmVsX2ludGVycnVwdDsgKi8KQEAgLTIzMSwxNCArMjMxLDE0IEBACiAJaW50IGVycjsKIAogCWVwY20gPSBremFsbG9jKHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOwotCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXBjbSBrY2FsbG9jOiAlcFxuIiwgZXBjbSk7ICovCisJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImVwY20ga2NhbGxvYzogJXBcbiIsIGVwY20pOyAqLwogCiAJaWYgKGVwY20gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZXBjbS0+ZW11ID0gZW11OwogCWVwY20tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAkvKgotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXBjbSBkZXZpY2U9JWQsIGNoYW5uZWxfaWQ9JWRcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImVwY20gZGV2aWNlPSVkLCBjaGFubmVsX2lkPSVkXG4iLAogCQkgICBzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlLCBjaGFubmVsX2lkKTsKIAkqLwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGVwY207CkBAIC0yNTEsMTAgKzI1MSwxMCBAQAogCiAJY2hhbm5lbC0+dXNlPTE7CiAjaWYgMCAvKiBkZWJ1ZyAqLwotCXNuZF9wcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCSAgICJwMTZ2OiBvcGVuIGNoYW5uZWxfaWQ9JWQsIGNoYW5uZWw9JXAsIHVzZT0weCV4XG4iLAogCQkgICBjaGFubmVsX2lkLCBjaGFubmVsLCBjaGFubmVsLT51c2UpOwotCXByaW50ayhLRVJOX0RFQlVHICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAjZW5kaWYgLyogZGVidWcgKi8KIAkvKiBjaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfcDE2dl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7ICovCkBAIC0zNDksMTUgKzM0OSwxOCBAQAogCXUzMiB0bXA7CiAJCiAjaWYgMCAvKiBkZWJ1ZyAqLwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJwcmVwYXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCAiCiAJCSAgICJmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsIGJ1ZmZlcl9zaXplPSVsZCwgIgogCQkgICAicGVyaW9kX3NpemU9JWxkLCBwZXJpb2RzPSV1LCBmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCiAJCSAgIGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsCiAJCSAgIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSwKIAkJICAgcnVudGltZS0+cGVyaW9kcywgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDEpKTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLAogCQkgICBydW50aW1lLT5kbWFfYWRkciwgcnVudGltZS0+ZG1hX2FyZWEsIHRhYmxlX2Jhc2UpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgZG1hX2J5dGVzKHNpemUpPSV4XG4iLAogCQkgICBlbXUtPnAxNnZfYnVmZmVyLmFkZHIsIGVtdS0+cDE2dl9idWZmZXIuYXJlYSwKIAkJICAgZW11LT5wMTZ2X2J1ZmZlci5ieXRlcyk7CiAjZW5kaWYgLyogZGVidWcgKi8KQEAgLTQwNSw3ICs0MDgsNyBAQAogCXUzMiB0bXA7CiAKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJwcmVwYXJlIGNhcHR1cmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHJlcGFyZSBjYXB0dXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCAiCiAJICAgICAgICJmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsIGJ1ZmZlcl9zaXplPSVsZCwgcGVyaW9kX3NpemU9JWxkLCAiCiAJICAgICAgICJmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCiAJICAgICAgIGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsCkBAIC00OTEsMTMgKzQ5NCwxMyBAQAogCQlydW50aW1lID0gcy0+cnVudGltZTsKIAkJZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJY2hhbm5lbCA9IHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UtZW11LT5wMTZ2X2RldmljZV9vZmZzZXQ7Ci0JCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAicDE2diBjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsgKi8KKwkJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInAxNnYgY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7ICovCiAJCWVwY20tPnJ1bm5pbmcgPSBydW5uaW5nOwogCQliYXNpYyB8PSAoMHgxPDxjaGFubmVsKTsKIAkJaW50ZSB8PSAoSU5URTJfUExBWUJBQ0tfQ0hfMF9MT09QPDxjaGFubmVsKTsKICAgICAgICAgICAgICAgICBzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwogICAgICAgICB9Ci0JLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJiYXNpYz0weCV4LCBpbnRlPTB4JXhcbiIsIGJhc2ljLCBpbnRlKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiYmFzaWM9MHgleCwgaW50ZT0weCV4XG4iLCBiYXNpYywgaW50ZSk7ICovCiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC01ODgsMTAgKzU5MSwxMCBAQAogCXB0cj1wdHIyOwogCWlmIChwdHIgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKIAkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidWZmZXIgY2FwdHVyZSBsaW1pdGVkIVxuIik7CisJCWRldl93YXJuKGVtdS0+Y2FyZC0+ZGV2LCAiYnVmZmVyIGNhcHR1cmUgbGltaXRlZCFcbiIpOwogCX0KIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgIgogCSAgICAgICAiYnVmZmVyX3NpemUgPSAweCV4LCBwZXJpb2Rfc2l6ZSA9IDB4JXgsIGJpdHM9JWQsIHJhdGU9JWRcbiIsCiAJICAgICAgIHB0cjEsIHB0cjIsIHB0ciwgKGludClydW50aW1lLT5idWZmZXJfc2l6ZSwKIAkgICAgICAgKGludClydW50aW1lLT5wZXJpb2Rfc2l6ZSwgKGludClydW50aW1lLT5mcmFtZV9iaXRzLApAQCAtNjMwLDcgKzYzMyw3IEBACiAJaWYgKGNoaXAtPnAxNnZfYnVmZmVyLmFyZWEpIHsKIAkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5wMTZ2X2J1ZmZlcik7CiAJCS8qCi0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicGVyaW9kIGxhYmxlcyBmcmVlOiAlcFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJwZXJpb2QgbGFibGVzIGZyZWU6ICVwXG4iLAogCQkJICAgJmNoaXAtPnAxNnZfYnVmZmVyKTsKIAkJKi8KIAl9CkBAIC02NDQsNyArNjQ3LDcgQEAKIAlpbnQgZXJyOwogICAgICAgICBpbnQgY2FwdHVyZT0xOwogICAKLQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgInNuZF9wMTZ2X3BjbSBjYWxsZWQuIGRldmljZT0lZFxuIiwgZGV2aWNlKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAic25kX3AxNnZfcGNtIGNhbGxlZC4gZGV2aWNlPSVkXG4iLCBkZXZpY2UpOyAqLwogCWVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0ID0gZGV2aWNlOwogCWlmIChycGNtKQogCQkqcnBjbSA9IE5VTEw7CkBAIC02NzIsNyArNjc1LDcgQEAKIAkJCQkJCQkgKCg2NTUzNiAtIDY0KSAqIDgpLCAoKDY1NTM2IC0gNjQpICogOCkpKSA8IDApIAogCQkJcmV0dXJuIGVycjsKIAkJLyoKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCQkgICAicHJlYWxsb2NhdGUgcGxheWJhY2sgc3Vic3RyZWFtOiBlcnI9JWRcbiIsIGVycik7CiAJCSovCiAJfQpAQCAtNjg2LDcgKzY4OSw3IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM2IC0gNjQsIDY1NTM2IC0gNjQpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQkvKgotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJCSAgICJwcmVhbGxvY2F0ZSBjYXB0dXJlIHN1YnN0cmVhbTogZXJyPSVkXG4iLCBlcnIpOwogCQkqLwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMgYi9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCmluZGV4IDEwMWU3Y2IuLmYxNmZkNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwpAQCAtNTUsNyArNTUsNyBAQAogCWZpcnN0X3ZvaWNlID0gbGFzdF92b2ljZSA9IDA7CiAJZm9yIChpID0gZW11LT5uZXh0X2ZyZWVfdm9pY2UsIGogPSAwOyBqIDwgTlVNX0cgOyBpICs9IG51bWJlciwgaiArPSBudW1iZXIpIHsKIAkJLyoKLQkJcHJpbnRrKEtFUk5fREVCVUcgImkgJWQgaiAlZCBuZXh0IGZyZWUgJWQhXG4iLAorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiaSAlZCBqICVkIG5leHQgZnJlZSAlZCFcbiIsCiAJCSAgICAgICBpLCBqLCBlbXUtPm5leHRfZnJlZV92b2ljZSk7CiAJCSovCiAJCWkgJT0gTlVNX0c7CkBAIC03NSw3ICs3NSw3IEBACiAJCQl9CiAJCX0KIAkJaWYgKCFza2lwKSB7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYWxsb2NhdGVkIHZvaWNlICVkXG4iLCBpKTsgKi8KKwkJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJhbGxvY2F0ZWQgdm9pY2UgJWRcbiIsIGkpOyAqLwogCQkJZmlyc3Rfdm9pY2UgPSBpOwogCQkJbGFzdF92b2ljZSA9IChpICsgbnVtYmVyKSAlIE5VTV9HOwogCQkJZW11LT5uZXh0X2ZyZWVfdm9pY2UgPSBsYXN0X3ZvaWNlOwpAQCAtODksNyArODksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQl2b2ljZSA9ICZlbXUtPnZvaWNlc1soZmlyc3Rfdm9pY2UgKyBpKSAlIE5VTV9HXTsKIAkJLyoKLQkJcHJpbnRrKGtFUk5fREVCVUcgInZvaWNlIGFsbG9jIC0gJWksICVpIG9mICVpXG4iLAorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAidm9pY2UgYWxsb2MgLSAlaSwgJWkgb2YgJWlcbiIsCiAJCSAgICAgICB2b2ljZS0+bnVtYmVyLCBpZHgtZmlyc3Rfdm9pY2UrMSwgbnVtYmVyKTsKIAkJKi8KIAkJdm9pY2UtPnVzZSA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCA2MTI2MmYzLi4yOWNkMzM5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTUyNSw3ICs1MjUsNyBAQAogCQkJcmV0dXJuIHI7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ3YWl0IHNyYyByZWFkeSB0aW1lb3V0IDB4JWx4IFsweCV4XVxuIiwKKwlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwgIndhaXQgc3JjIHJlYWR5IHRpbWVvdXQgMHglbHggWzB4JXhdXG4iLAogCQkgICBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSwgcik7CiAJcmV0dXJuIDA7CiB9CkBAIC01ODcsNyArNTg3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGVuZF90aW1lID0gamlmZmllcyArIEhaIC8gMTA7CiAKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVuc29uaXEtPmNhcmQtPmRldiwKIAkgICAgICAgIkNPREVDIFdSSVRFOiByZWcgPSAweCV4LCB2YWwgPSAweCV4ICgweCV4KSwgY3JlZyA9IDB4JXhcbiIsCiAJICAgICAgIHJlZywgdmFsLCBFU18xMzcwX0NPREVDX1dSSVRFKHJlZywgdmFsKSwgRVNfUkVHKGVuc29uaXEsIDEzNzBfQ09ERUMpKTsKICNlbmRpZgpAQCAtNTk4LDcgKzU5OCw3IEBACiAJCX0KIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcihlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjIHdyaXRlIHRpbWVvdXQsIHN0YXR1cyA9IDB4JXhcbiIsCisJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsICJjb2RlYyB3cml0ZSB0aW1lb3V0LCBzdGF0dXMgPSAweCV4XG4iLAogCQkgICBpbmwoRVNfUkVHKGVuc29uaXEsIFNUQVRVUykpKTsKIH0KIApAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjIHdyaXRlIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLAorCWRldl9lcnIoZW5zb25pcS0+Y2FyZC0+ZGV2LCAiY29kZWMgd3JpdGUgdGltZW91dCBhdCAweCVseCBbMHgleF1cbiIsCiAJCSAgIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSwgaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSkpOwogfQogCkBAIC03MDYsOCArNzA2LDggQEAKIAkJCX0KIAkJCW11dGV4X3VubG9jaygmZW5zb25pcS0+c3JjX211dGV4KTsKIAkJCWlmICgrK2ZhaWwgPiAxMCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjIHJlYWQgdGltZW91dCAoZmluYWwpICIKLQkJCQkJICAgImF0IDB4JWx4LCByZWcgPSAweCV4IFsweCV4XVxuIiwKKwkJCQlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCQkJImNvZGVjIHJlYWQgdGltZW91dCAoZmluYWwpIGF0IDB4JWx4LCByZWcgPSAweCV4IFsweCV4XVxuIiwKIAkJCQkJICAgRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpLCByZWcsCiAJCQkJCSAgIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTcxNiw3ICs3MTYsNyBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmZW5zb25pcS0+c3JjX211dGV4KTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlczEzNzE6IGNvZGVjIHJlYWQgdGltZW91dCBhdCAweCVseCBbMHgleF1cbiIsCisJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsICJjb2RlYyByZWFkIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLAogCQkgICBFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQyksIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTYsNyArMTc5Niw3IEBACiAjaWZkZWYgU1VQUE9SVF9KT1lTVElDSwogCiAjaWZkZWYgQ0hJUDEzNzEKLXN0YXRpYyBpbnQgc25kX2Vuc29uaXFfZ2V0X2pveXN0aWNrX3BvcnQoaW50IGRldikKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfZ2V0X2pveXN0aWNrX3BvcnQoc3RydWN0IGVuc29uaXEgKmVuc29uaXEsIGludCBkZXYpCiB7CiAJc3dpdGNoIChqb3lzdGlja19wb3J0W2Rldl0pIHsKIAljYXNlIDA6IC8qIGRpc2FibGVkICovCkBAIC0xODA4LDEyICsxODA4LDEzIEBACiAJCXJldHVybiBqb3lzdGlja19wb3J0W2Rldl07CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImVuczEzNzE6IGludmFsaWQgam95c3RpY2sgcG9ydCAlI3giLCBqb3lzdGlja19wb3J0W2Rldl0pOworCQlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCSJpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4Iiwgam95c3RpY2tfcG9ydFtkZXZdKTsKIAkJcmV0dXJuIDA7CiAJfQogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGludCBkZXYpCitzdGF0aWMgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KHN0cnVjdCBlbnNvbmlxICplbnNvbmlxLCBpbnQgZGV2KQogewogCXJldHVybiBqb3lzdGlja1tkZXZdID8gMHgyMDAgOiAwOwogfQpAQCAtMTgyNCw3ICsxODI1LDcgQEAKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOwogCWludCBpb19wb3J0OwogCi0JaW9fcG9ydCA9IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGRldik7CisJaW9fcG9ydCA9IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGVuc29uaXEsIGRldik7CiAKIAlzd2l0Y2ggKGlvX3BvcnQpIHsKIAljYXNlIDA6CkBAIC0xODM1LDE0ICsxODM2LDE2IEBACiAJCQlpZiAocmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgOCwgImVuczEzN3g6IGdhbWVwb3J0IikpCiAJCQkJYnJlYWs7CiAJCWlmIChpb19wb3J0ID4gMHgyMTgpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVuczEzN3g6IG5vIGdhbWVwb3J0IHBvcnRzIGF2YWlsYWJsZVxuIik7CisJCQlkZXZfd2FybihlbnNvbmlxLT5jYXJkLT5kZXYsCisJCQkJICJubyBnYW1lcG9ydCBwb3J0cyBhdmFpbGFibGVcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgOCwgImVuczEzN3g6IGdhbWVwb3J0IikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVuczEzN3g6IGdhbWVwb3J0IGlvIHBvcnQgJSN4IGluIHVzZVxuIiwKKwkJCWRldl93YXJuKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCQkgImdhbWVwb3J0IGlvIHBvcnQgJSN4IGluIHVzZVxuIiwKIAkJCSAgICAgICBpb19wb3J0KTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTE4NTEsNyArMTg1NCw4IEBACiAKIAllbnNvbmlxLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbnMxMzd4OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoZW5zb25pcS0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9yZWdpb24oaW9fcG9ydCwgOCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTIwODIsOCArMjA4Niw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTIxMzcsNyArMjE0MCw3IEBACiAJZW5zb25pcS0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F1ZGlvcGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgZW5zb25pcSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lbnNvbmlxX2ZyZWUoZW5zb25pcSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjE0NSw3ICsyMTQ4LDcgQEAKICNpZmRlZiBDSElQMTM3MAogCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAogCQkJCTE2LCAmZW5zb25pcS0+ZG1hX2J1ZykgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcGhhbnRvbSBhcmVhIC0gZG1hX2J1Z1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBwaGFudG9tIGFyZWEgLSBkbWFfYnVnXG4iKTsKIAkJc25kX2Vuc29uaXFfZnJlZShlbnNvbmlxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yMTgwLDggKzIxODMsNiBAQAogCiAJc25kX2Vuc29uaXFfcHJvY19pbml0KGVuc29uaXEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJlbnNvbmlxID0gZW5zb25pcTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0MzcsNyArMjQzOCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKaW5kZXggOTIxM2ZiMy4uMzRkOTViZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTkzOC5jCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtMjU0LDcgKzI1NCw2IEBACiAjZGVmaW5lIFdSSVRFX0xPT1BfVElNRU9VVAkweDEwMDAwCiAjZGVmaW5lIEdFVF9MT09QX1RJTUVPVVQJMHgwMTAwMAogCi0jdW5kZWYgUkVHX0RFQlVHCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogV3JpdGUgdG8gYSBtaXhlciByZWdpc3RlcgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjY1LDkgKzI2NCw3IEBACiAJb3V0YihyZWcsIFNMU0JfUkVHKGNoaXAsIE1JWEVSQUREUikpOwogCW91dGIodmFsLCBTTFNCX1JFRyhjaGlwLCBNSVhFUkRBVEEpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5taXhlcl9sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJNaXhlciByZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJNaXhlciByZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjgxLDkgKzI3OCw3IEBACiAJb3V0YihyZWcsIFNMU0JfUkVHKGNoaXAsIE1JWEVSQUREUikpOwogCWRhdGEgPSBpbmIoU0xTQl9SRUcoY2hpcCwgTUlYRVJEQVRBKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bWl4ZXJfbG9jaywgZmxhZ3MpOwotI2lmZGVmIFJFR19ERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiTWl4ZXIgcmVnICUwMnggbm93IGlzICUwMnhcbiIsIHJlZywgZGF0YSk7Ci0jZW5kaWYKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk1peGVyIHJlZyAlMDJ4IG5vdyBpcyAlMDJ4XG4iLCByZWcsIGRhdGEpOwogCXJldHVybiBkYXRhOwogfQogCkBAIC0zMDIsMTAgKzI5Nyw5IEBACiAJaWYgKHZhbCAhPSBvdmFsKSB7CiAJCW5ldyA9IChvbGQgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CiAJCW91dGIobmV3LCBTTFNCX1JFRyhjaGlwLCBNSVhFUkRBVEEpKTsKLSNpZmRlZiBSRUdfREVCVUcKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJNaXhlciByZWcgJTAyeCB3YXMgJTAyeCwgc2V0IHRvICUwMnhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk1peGVyIHJlZyAlMDJ4IHdhcyAlMDJ4LCBzZXQgdG8gJTAyeFxuIiwKIAkJCSAgIHJlZywgb2xkLCBuZXcpOwotI2VuZGlmCiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPm1peGVyX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gb3ZhbDsKQEAgLTMyNCw3ICszMTgsOCBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0VSUiAic25kX2VzMTkzOF93cml0ZV9jbWQgdGltZW91dCAoMHgwMiV4LzB4MDIleClcbiIsIGNtZCwgdik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJzbmRfZXMxOTM4X3dyaXRlX2NtZCB0aW1lb3V0ICgweDAyJXgvMHgwMiV4KVxuIiwgY21kLCB2KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMzNyw3ICszMzIsNyBAQAogCWZvciAoaSA9IEdFVF9MT09QX1RJTUVPVVQ7IGk7IGktLSkKIAkJaWYgKCh2ID0gaW5iKFNMU0JfUkVHKGNoaXAsIFNUQVRVUykpKSAmIDB4ODApCiAJCQlyZXR1cm4gaW5iKFNMU0JfUkVHKGNoaXAsIFJFQUREQVRBKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiZ2V0X2J5dGUgdGltZW91dDogc3RhdHVzIDB4MDIleFxuIiwgdik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJnZXRfYnl0ZSB0aW1lb3V0OiBzdGF0dXMgMHgwMiV4XG4iLCB2KTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtMzUxLDkgKzM0Niw3IEBACiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKIAlzbmRfZXMxOTM4X3dyaXRlX2NtZChjaGlwLCB2YWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJSZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJSZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzY4LDkgKzM2MSw3IEBACiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKIAl2YWwgPSBzbmRfZXMxOTM4X2dldF9ieXRlKGNoaXApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJSZWcgJTAyeCBub3cgaXMgJTAyeFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJSZWcgJTAyeCBub3cgaXMgJTAyeFxuIiwgcmVnLCB2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTM5MSwxMCArMzgyLDggQEAKIAkJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKIAkJbmV3ID0gKG9sZCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKIAkJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgbmV3KTsKLSNpZmRlZiBSRUdfREVCVUcKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJSZWcgJTAyeCB3YXMgJTAyeCwgc2V0IHRvICUwMnhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiUmVnICUwMnggd2FzICUwMngsIHNldCB0byAlMDJ4XG4iLAogCQkJICAgcmVnLCBvbGQsIG5ldyk7Ci0jZW5kaWYKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gb3ZhbDsKQEAgLTQxNiw3ICs0MDUsNyBAQAogCQkJCWdvdG8gX19uZXh0OwogCQl9CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkVTUyBTb2xvLTEgcmVzZXQgZmFpbGVkXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkVTUyBTb2xvLTEgcmVzZXQgZmFpbGVkXG4iKTsKIAogICAgICBfX25leHQ6CiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgRVNTX0NNRF9FTkFCTEVFWFQpOwpAQCAtMTUwNCwxNiArMTQ5MywxNSBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXMxOTM4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lczE5MzhfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZCwgZGlzYWJsaW5nIGRldmljZVxuIiwKKwkJCXBjaS0+aXJxKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTU0NSw3ICsxNTMzLDggQEAKIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTYxMiw3ICsxNjAxLDggQEAKICAgICAgICAgLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyNCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI0KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwogICAgICAgICB9CkBAIC0xNjM5LDE1ICsxNjI5LDE0IEBACiAJY2hpcC0+Z2FtZV9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgNCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTM4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lczE5MzhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7Ci0jaWZkZWYgRVMxOTM4X0RERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiY3JlYXRlOiBpbzogMHglbHgsIHNiOiAweCVseCwgdmM6IDB4JWx4LCBtcHU6IDB4JWx4LCBnYW1lOiAweCVseFxuIiwKKwlkZXZfZGJnKGNhcmQtPmRldiwKKwkJImNyZWF0ZTogaW86IDB4JWx4LCBzYjogMHglbHgsIHZjOiAweCVseCwgbXB1OiAweCVseCwgZ2FtZTogMHglbHhcbiIsCiAJCSAgIGNoaXAtPmlvX3BvcnQsIGNoaXAtPnNiX3BvcnQsIGNoaXAtPnZjX3BvcnQsIGNoaXAtPm1wdV9wb3J0LCBjaGlwLT5nYW1lX3BvcnQpOwotI2VuZGlmCiAKIAljaGlwLT5kZG1hX3BvcnQgPSBjaGlwLT52Y19wb3J0ICsgMHgwMDsJCS8qIGZpeCBmcm9tIFRob21hcyBTYWlsZXIgKi8KIApAQCAtMTY1OCw4ICsxNjQ3LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpAQCAtMTY3NSwyMSArMTY2MiwyMiBAQAogCiAJc3RhdHVzID0gaW5iKFNMSU9fUkVHKGNoaXAsIElSUUNPTlRST0wpKTsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgIkVzMTkzOGRlYnVnIC0gaW50ZXJydXB0IHN0YXR1czogPTB4JXhcbiIsIHN0YXR1cyk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJFczE5MzhkZWJ1ZyAtIGludGVycnVwdCBzdGF0dXM6ID0weCV4XG4iLCBzdGF0dXMpOwogI2VuZGlmCiAJCiAJLyogQVVESU8gMSAqLwogCWlmIChzdGF0dXMgJiAweDEwKSB7CiAjaWYgMAotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIGludGVycnVwdFxuIik7Ci0JCXByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIERNQUMgRE1BIGNvdW50OiAldVxuIiwKIAkJICAgICAgIGludyhTTERNX1JFRyhjaGlwLCBETUFDT1VOVCkpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSAgICAgICAiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDEgRE1BQyBETUEgYmFzZTogJXVcbiIsCiAJCSAgICAgICBpbmwoU0xETV9SRUcoY2hpcCwgRE1BQUREUikpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSAgICAgICAiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDEgRE1BQyBETUEgc3RhdHVzOiAweCV4XG4iLAogCQkgICAgICAgaW5sKFNMRE1fUkVHKGNoaXAsIERNQVNUQVRVUykpKTsKICNlbmRpZgpAQCAtMTcwNSwxMiArMTY5MywxMiBAQAogCS8qIEFVRElPIDIgKi8KIAlpZiAoc3RhdHVzICYgMHgyMCkgewogI2lmIDAKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBpbnRlcnJ1cHRcbiIpOwotCQlwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBETUFDIERNQSBjb3VudDogJXVcbiIsCiAJCSAgICAgICBpbncoU0xJT19SRUcoY2hpcCwgQVVESU8yRE1BQ09VTlQpKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAyIERNQUMgRE1BIGJhc2U6ICV1XG4iLAogCQkgICAgICAgaW5sKFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUFERFIpKSk7CiAKQEAgLTE4MDgsNyArMTc5Niw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspIHsKQEAgLTE4NDMsNyArMTgzMiw3IEBACiAJCQkgICAgU0xTQl9SRUcoY2hpcCwgRk1MT1dBRERSKSwKIAkJCSAgICBTTFNCX1JFRyhjaGlwLCBGTUhJR0hBRERSKSwKIAkJCSAgICBPUEwzX0hXX09QTDMsIDEsICZvcGwzKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IE9QTDMgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLAorCQlkZXZfZXJyKGNhcmQtPmRldiwgIk9QTDMgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLAogCQkJICAgU0xTQl9SRUcoY2hpcCwgRk1MT1dBRERSKSk7CiAJfSBlbHNlIHsKIAkgICAgICAgIGlmICgoZXJyID0gc25kX29wbDNfdGltZXJfbmV3KG9wbDMsIDAsIDEpKSA8IDApIHsKQEAgLTE4NTksNyArMTg0OCw3IEBACiAJCQkJY2hpcC0+bXB1X3BvcnQsCiAJCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAogCQkJCS0xLCAmY2hpcC0+cm1pZGkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogdW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMVxuIik7CiAJfSBlbHNlIHsKIAkJLy8gdGhpcyBsaW5lIGlzIHZpdGFsIGZvciBNSURJIGludGVycnVwdCBoYW5kbGluZyBvbiBlc3Mtc29sbzEKIAkJLy8gYW5kcmVhc0BmbHlpbmctc25haWwuZGUKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5NjguYyBiL3NvdW5kL3BjaS9lczE5NjguYwppbmRleCA3NzJjYzM2Li41YmIxY2Y2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC02MzIsNyArNjMyLDcgQEAKIAkJCXJldHVybiAwOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9Ci0Jc25kX3ByaW50ZCgiZXMxOTY4OiBhYzk3IHRpbWVvdXRcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWM5NyB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gMTsgLyogdGltZW91dCAqLwogfQogCkBAIC02NDQsNyArNjQ0LDcgQEAKIAkJaWYgKCEoaW5iKGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19JTkRFWCkgJiAxKSkKIAkJCXJldHVybiAwOwogCX0KLQlzbmRfcHJpbnRkKCJlczE5Njg6IGFjOTcgdGltZW91dFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhYzk3IHRpbWVvdXRcbiIpOwogCXJldHVybiAxOyAvKiB0aW1lb3V0ICovCiB9CiAKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCiAJCWlmIChfX21hZXN0cm9fcmVhZChjaGlwLCBJRFIxX0NSQU1fUE9JTlRFUikgPT0gaW5kZXgpCiAJCQlyZXR1cm47Ci0Jc25kX3ByaW50ZCgiZXMxOTY4OiBBUFUgcmVnaXN0ZXIgc2VsZWN0IGZhaWxlZC4gKFRpbWVvdXQpXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkFQVSByZWdpc3RlciBzZWxlY3QgZmFpbGVkLiAoVGltZW91dClcbiIpOwogfQogCiAvKiBubyBzcGlubG9jayAqLwpAQCAtNjk5LDcgKzY5OSw3IEBACiAJCQlyZXR1cm47CiAJCV9fbWFlc3Ryb193cml0ZShjaGlwLCBJRFIwX0RBVEFfUE9SVCwgZGF0YSk7CiAJfQotCXNuZF9wcmludGQoImVzMTk2ODogQVBVIHJlZ2lzdGVyIHNldCBwcm9iYWJseSBmYWlsZWQgKFRpbWVvdXQpIVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJBUFUgcmVnaXN0ZXIgc2V0IHByb2JhYmx5IGZhaWxlZCAoVGltZW91dCkhXG4iKTsKIH0KIAogLyogbm8gc3BpbmxvY2sgKi8KQEAgLTE0NDIsMTMgKzE0NDIsMTQgQEAKIAkJCQkJICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAogCQkJCQkgICBjaGlwLT50b3RhbF9idWZzaXplLCAmY2hpcC0+ZG1hKTsKIAlpZiAoZXJyIDwgMCB8fCAhIGNoaXAtPmRtYS5hcmVhKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVzMTk2ODogY2FuJ3QgYWxsb2NhdGUgZG1hIHBhZ2VzIGZvciBzaXplICVkXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW4ndCBhbGxvY2F0ZSBkbWEgcGFnZXMgZm9yIHNpemUgJWRcbiIsCiAJCQkgICBjaGlwLT50b3RhbF9idWZzaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmICgoY2hpcC0+ZG1hLmFkZHIgKyBjaGlwLT5kbWEuYnl0ZXMgLSAxKSAmIH4oKDEgPDwgMjgpIC0gMSkpIHsKIAkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5kbWEpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IERNQSBidWZmZXIgYmV5b25kIDI1Nk1CLlxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRE1BIGJ1ZmZlciBiZXlvbmQgMjU2TUIuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNDg5LDcgKzE0OTAsOCBAQAogCX0KIAljaGFuLT5tZW1vcnkgPSBzbmRfZXMxOTY4X25ld19tZW1vcnkoY2hpcCwgc2l6ZSk7CiAJaWYgKGNoYW4tPm1lbW9yeSA9PSBOVUxMKSB7Ci0JCS8vIHNuZF9wcmludGQoImNhbm5vdCBhbGxvY2F0ZSBkbWEgYnVmZmVyOiBzaXplID0gJWRcbiIsIHNpemUpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgZG1hIGJ1ZmZlcjogc2l6ZSA9ICVkXG4iLCBzaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJmNoYW4tPm1lbW9yeS0+YnVmKTsKQEAgLTE3MTUsMTEgKzE3MTcsMTMgQEAKIAogCS8qIHNlYXJjaCAyIEFQVXMgKGFsdGhvdWdoIG9uZSBhcHUgaXMgZW5vdWdoKSAqLwogCWlmICgoYXB1ID0gc25kX2VzMTk2OF9hbGxvY19hcHVfcGFpcihjaGlwLCBFU01fQVBVX1BDTV9QTEFZKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhtbSwgY2Fubm90IGZpbmQgZW1wdHkgQVBVIHBhaXIhP1xuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiSG1tLCBjYW5ub3QgZmluZCBlbXB0eSBBUFUgcGFpciE/XG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoKG1lbW9yeSA9IHNuZF9lczE5NjhfbmV3X21lbW9yeShjaGlwLCBDTE9DS19NRUFTVVJFX0JVRlNJWkUpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSBkbWEgYnVmZmVyIC0gdXNpbmcgZGVmYXVsdCBjbG9jayAlZFxuIiwgY2hpcC0+Y2xvY2spOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgImNhbm5vdCBhbGxvY2F0ZSBkbWEgYnVmZmVyIC0gdXNpbmcgZGVmYXVsdCBjbG9jayAlZFxuIiwKKwkJCSBjaGlwLT5jbG9jayk7CiAJCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBhcHUpOwogCQlyZXR1cm47CiAJfQpAQCAtMTc4MCw3ICsxNzg0LDcgQEAKIAllbHNlCiAJCXQgKz0gc3RvcF90aW1lLnR2X3VzZWMgLSBzdGFydF90aW1lLnR2X3VzZWM7CiAJaWYgKHQgPT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICI/PyBjYWxjdWxhdGlvbiBlcnJvci4uXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICI/PyBjYWxjdWxhdGlvbiBlcnJvci4uXG4iKTsKIAl9IGVsc2UgewogCQlvZmZzZXQgKj0gMTAwMDsKIAkJb2Zmc2V0ID0gKG9mZnNldCAvIHQpICogMTAwMCArICgob2Zmc2V0ICUgdCkgKiAxMDAwKSAvIHQ7CkBAIC0xNzg4LDcgKzE3OTIsNyBAQAogCQkJaWYgKG9mZnNldCA+PSA0MDAwMCAmJiBvZmZzZXQgPD0gNTAwMDApCiAJCQkJY2hpcC0+Y2xvY2sgPSAoY2hpcC0+Y2xvY2sgKiBvZmZzZXQpIC8gNDgwMDA7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiZXMxOTY4OiBjbG9ja2luZyB0byAlZFxuIiwgY2hpcC0+Y2xvY2spOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJjbG9ja2luZyB0byAlZFxuIiwgY2hpcC0+Y2xvY2spOwogCX0KIAlzbmRfZXMxOTY4X2ZyZWVfbWVtb3J5KGNoaXAsIG1lbW9yeSk7CiAJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGFwdSk7CkBAIC0yMTA4LDcgKzIxMTIsNyBAQAogCW91dHcoaW53KGlvYWRkciArIDB4M2MpICYgMHhmZmZjLCBpb2FkZHIgKyAweDNjKTsKIAogI2lmIDAJCQkJLyogdGhlIGxvb3AgaGVyZSBuZWVkcyB0byBiZSBtdWNoIGJldHRlciBpZiB3ZSB3YW50IGl0Li4gKi8KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAidHJ5aW5nIHNvZnR3YXJlIHJlc2V0XG4iKTsKKwlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJ0cnlpbmcgc29mdHdhcmUgcmVzZXRcbiIpOwogCS8qIHRyeSBhbmQgZG8gYSBzb2Z0d2FyZSByZXNldCAqLwogCW91dGIoMHg4MCB8IDB4N2MsIGlvYWRkciArIDB4MzApOwogCWZvciAodyA9IDA7OyB3KyspIHsKQEAgLTI0MTYsOCArMjQyMCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI0NzksNyArMjQ4Miw4IEBACiAKIAljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNzA2LDcgKzI3MTAsOCBAQAogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjggYml0cyAqLwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI4Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMjc0MCw3ICsyNzQ1LDcgQEAKIAljaGlwLT5pb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTY4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lczE5NjhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNzcwLDcgKzI3NzUsNyBAQAogCQl9CiAJCWlmIChkb19wbSA+IDEpIHsKIAkJCS8qIG5vdCBtYXRjaGVkOyBkaXNhYmxpbmcgcG0gKi8KLQkJCXByaW50ayhLRVJOX0lORk8gImVzMTk2ODogbm90IGF0dGVtcHRpbmcgcG93ZXIgbWFuYWdlbWVudC5cbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAibm90IGF0dGVtcHRpbmcgcG93ZXIgbWFuYWdlbWVudC5cbiIpOwogCQkJZG9fcG0gPSAwOwogCQl9CiAJfQpAQCAtMjc4Myw4ICsyNzg4LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KICNpZmRlZiBDT05GSUdfU05EX0VTMTk2OF9SQURJTwogCS8qIGRvbid0IHBsYXkgd2l0aCBHUElPcyBvbiBsYXB0b3BzICovCiAJaWYgKGNoaXAtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciAhPSAweDEyNWQpCkBAIC0yODAyLDcgKzI4MDUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNuZF9lczE5NjhfdGVhNTc1eF9ncGlvcyk7IGkrKykgewogCQljaGlwLT50ZWE1NzV4X3R1bmVyID0gaTsKIAkJaWYgKCFzbmRfdGVhNTc1eF9pbml0KCZjaGlwLT50ZWEsIFRISVNfTU9EVUxFKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVzMTk2ODogZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAorCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAogCQkJCSAgIGdldF90ZWE1NzV4X2dwaW8oY2hpcCktPm5hbWUpOwogCQkJc3RybGNweShjaGlwLT50ZWEuY2FyZCwgZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKS0+bmFtZSwKIAkJCQlzaXplb2YoY2hpcC0+dGVhLmNhcmQpKTsKQEAgLTI4MzYsNyArMjgzOSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIApAQCAtMjkwMCw3ICsyOTA0LDcgQEAKIAkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczE5Njg6IHNraXBwaW5nIE1QVS00MDEgTUlESSBzdXBwb3J0Li5cbiIpOworCQkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAic2tpcHBpbmcgTVBVLTQwMSBNSURJIHN1cHBvcnQuLlxuIik7CiAJCX0KIAl9CiAKQEAgLTI5MDksOCArMjkxMyw4IEBACiAjaWZkZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKIAllcnIgPSBzbmRfZXMxOTY4X2lucHV0X3JlZ2lzdGVyKGNoaXApOwogCWlmIChlcnIpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJJbnB1dCBkZXZpY2UgcmVnaXN0cmF0aW9uICIKLQkJCSJmYWlsZWQgd2l0aCBlcnJvciAlaSIsIGVycik7CisJCWRldl93YXJuKGNhcmQtPmRldiwKKwkJCSAiSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlaSIsIGVycik7CiAjZW5kaWYKIAogCXNuZF9lczE5Njhfc3RhcnRfaXJxKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCA0NWJjOGE5Li5kYjE4Y2NhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJCQlnb3RvIG9rMTsKIAkJdWRlbGF5KDEwKTsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgaW50ZXJmYWNlIGlzIGJ1c3kgKDEpXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IGludGVyZmFjZSBpcyBidXN5ICgxKVxuIik7CiAJcmV0dXJuOwogCiAgb2sxOgpAQCAtMjY5LDcgKzI2OSw3IEBACiAJCQlyZXR1cm47CiAJCXVkZWxheSgxMCk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgYnVzeSAoMilcbiIsIGFjOTctPm51bSk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOwogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2ZtODAxX2NvZGVjX3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCkBAIC0yODUsNyArMjg1LDcgQEAKIAkJCWdvdG8gb2sxOwogCQl1ZGVsYXkoMTApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBpbnRlcmZhY2UgaXMgYnVzeSAoMSlcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgaW50ZXJmYWNlIGlzIGJ1c3kgKDEpXG4iKTsKIAlyZXR1cm4gMDsKIAogIG9rMToKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQkJZ290byBvazI7CiAJCXVkZWxheSgxMCk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgYnVzeSAoMilcbiIsIGFjOTctPm51bSk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOwogCXJldHVybiAwOwogCiAgb2syOgpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQlnb3RvIG9rMzsKIAkJdWRlbGF5KDEwKTsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgaW50ZXJmYWNlICMlZCBpcyBub3QgdmFsaWQgKDIpXG4iLCBhYzk3LT5udW0pOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgaW50ZXJmYWNlICMlZCBpcyBub3QgdmFsaWQgKDIpXG4iLCBhYzk3LT5udW0pOwogCXJldHVybiAwOwogCiAgb2szOgpAQCAtMTEwMCw4ICsxMTAwLDggQEAKIAogCWlmICh3YWl0X2Zvcl9jb2RlYyhjaGlwLCAwLCBBQzk3X1JFU0VULCBtc2Vjc190b19qaWZmaWVzKDc1MCkpIDwgMCkKIAkJaWYgKCFyZXN1bWUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJQcmltYXJ5IEFDJzk3IGNvZGVjIG5vdCBmb3VuZCwgIgotCQkJCQkgICAgImFzc3VtZSBTRjY0LVBDUiAodHVuZXItb25seSlcbiIpOworCQkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAiUHJpbWFyeSBBQyc5NyBjb2RlYyBub3QgZm91bmQsIGFzc3VtZSBTRjY0LVBDUiAodHVuZXItb25seSlcbiIpOwogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IDMgfCBUVU5FUl9PTkxZOwogCQkJZ290byBfX2FjOTdfb2s7CiAJCX0KQEAgLTEyMjUsNyArMTIyNSw3IEBACiAJaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfT05MWSkgPT0gMCkgewogCQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9mbTgwMV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBjaGlwLT5pcnEpOworCQkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIGNoaXAtPmlycSk7CiAJCQlzbmRfZm04MDFfZnJlZShjaGlwKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTEyNTEsOCArMTI1MSw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAjaWZkZWYgQ09ORklHX1NORF9GTTgwMV9URUE1NzVYX0JPT0wKIAllcnIgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmcGNpLT5kZXYsICZjaGlwLT52NGwyX2Rldik7CiAJaWYgKGVyciA8IDApIHsKQEAgLTEyNjcsNyArMTI2NSw3IEBACiAJaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA+IDAgJiYKIAkgICAgKHRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIDwgNCkgewogCQlpZiAoc25kX3RlYTU3NXhfaW5pdCgmY2hpcC0+dGVhLCBUSElTX01PRFVMRSkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiVEVBNTc1eCByYWRpbyBub3QgZm91bmRcbiIpOwogCQkJc25kX2ZtODAxX2ZyZWUoY2hpcCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMTI3NiwxMyArMTI3NCwxNCBAQAogCQlmb3IgKHRlYTU3NXhfdHVuZXIgPSAxOyB0ZWE1NzV4X3R1bmVyIDw9IDM7IHRlYTU3NXhfdHVuZXIrKykgewogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IHRlYTU3NXhfdHVuZXI7CiAJCQlpZiAoIXNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSwgVEhJU19NT0RVTEUpKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImRldGVjdGVkIFRFQTU3NXggcmFkaW8gdHlwZSAlc1xuIiwKKwkJCQlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCQkJCSAiZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAogCQkJCQkgICBnZXRfdGVhNTc1eF9ncGlvKGNoaXApLT5uYW1lKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlpZiAodGVhNTc1eF90dW5lciA9PSA0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJURUE1NzV4IHJhZGlvIG5vdCBmb3VuZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKIAkJCWNoaXAtPnRlYTU3NXhfdHVuZXIgPSBUVU5FUl9ESVNBQkxFRDsKIAkJfQogCX0KQEAgLTEzMTIsNyArMTMxMSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmICgoZXJyID0gc25kX2ZtODAxX2NyZWF0ZShjYXJkLCBwY2ksIHRlYTU3NXhfdHVuZXJbZGV2XSwgcmFkaW9fbnJbZGV2XSwgJmNoaXApKSA8IDApIHsKQEAgLTE0MTEsOCArMTQxMSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmbTgwMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9LY29uZmlnIGIvc291bmQvcGNpL2hkYS9LY29uZmlnCmluZGV4IDBlNTM2MzQuLmFjMTdjM2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvaGRhL0tjb25maWcKQEAgLTEsOCArMSwxNSBAQAotbWVudWNvbmZpZyBTTkRfSERBX0lOVEVMCi0JdHJpc3RhdGUgIkludGVsIEhEIEF1ZGlvIgorbWVudSAiSEQtQXVkaW8iCisKK2NvbmZpZyBTTkRfSERBCisJdHJpc3RhdGUKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfVk1BU1RFUgogCXNlbGVjdCBTTkRfS0NUTF9KQUNLCisKK2NvbmZpZyBTTkRfSERBX0lOVEVMCisJdHJpc3RhdGUgIkhEIEF1ZGlvIFBDSSIKKwlkZXBlbmRzIG9uIFNORF9QQ0kKKwlzZWxlY3QgU05EX0hEQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBJbnRlbCAiSGlnaCBEZWZpbml0aW9uCiAJICBBdWRpbyIgKEF6YWxpYSkgYW5kIGl0cyBjb21wYXRpYmxlIGRldmljZXMuCkBAIC0xMyw3ICsyMCw3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtaGRhLWludGVsLgogCi1pZiBTTkRfSERBX0lOVEVMCitpZiBTTkRfSERBCiAKIGNvbmZpZyBTTkRfSERBX0RTUF9MT0FERVIKIAlib29sCkBAIC00MSw3ICs0OCw2IEBACiAKIGNvbmZpZyBTTkRfSERBX1JFQ09ORklHCiAJYm9vbCAiQWxsb3cgZHluYW1pYyBjb2RlYyByZWNvbmZpZ3VyYXRpb24iCi0JZGVwZW5kcyBvbiBTTkRfSERBX0hXREVQCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIEhELWF1ZGlvIGNvZGVjIHJlLWNvbmZpZ3VyYXRpb24gZmVhdHVyZS4KIAkgIFRoaXMgYWRkcyB0aGUgc3lzZnMgaW50ZXJmYWNlcyB0byBhbGxvdyB1c2VyIHRvIGNsZWFyIHRoZSB3aG9sZQpAQCAtNTAsNyArNTYsNyBAQAogCiBjb25maWcgU05EX0hEQV9JTlBVVF9CRUVQCiAJYm9vbCAiU3VwcG9ydCBkaWdpdGFsIGJlZXAgdmlhIGlucHV0IGxheWVyIgotCWRlcGVuZHMgb24gSU5QVVQ9eSB8fCBJTlBVVD1TTkRfSERBX0lOVEVMCisJZGVwZW5kcyBvbiBJTlBVVD15IHx8IElOUFVUPVNORF9IREEKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGJ1aWxkIGEgZGlnaXRhbCBiZWVwIGludGVyZmFjZSBmb3IgSEQtYXVkaW8KIAkgIGRyaXZlci4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBnZW5lcmF0ZSBkaWdpdGFsIGJlZXBzLgpAQCAtNzYsNyArODIsNiBAQAogY29uZmlnIFNORF9IREFfUEFUQ0hfTE9BREVSCiAJYm9vbCAiU3VwcG9ydCBpbml0aWFsaXphdGlvbiBwYXRjaCBsb2FkaW5nIGZvciBIRC1hdWRpbyIKIAlzZWxlY3QgRldfTE9BREVSCi0Jc2VsZWN0IFNORF9IREFfSFdERVAKIAlzZWxlY3QgU05EX0hEQV9SRUNPTkZJRwogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gYWxsb3cgdGhlIEhELWF1ZGlvIGRyaXZlciB0byBsb2FkIGEgcHNldWRvCkBAIC04NCw4ICs4OSw2IEBACiAJICBzdGFydCB1cC4gIFRoZSAicGF0Y2giIGZpbGUgY2FuIGJlIHNwZWNpZmllZCB2aWEgcGF0Y2ggbW9kdWxlCiAJICBvcHRpb24sIHN1Y2ggYXMgcGF0Y2g9aGRhLWluaXQuCiAKLQkgIFRoaXMgb3B0aW9uIHR1cm5zIG9uIGh3ZGVwIGFuZCByZWNvbmZpZyBmZWF0dXJlcyBhdXRvbWF0aWNhbGx5LgotCiBjb25maWcgU05EX0hEQV9DT0RFQ19SRUFMVEVLCiAJdHJpc3RhdGUgIkJ1aWxkIFJlYWx0ZWsgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKIAlzZWxlY3QgU05EX0hEQV9HRU5FUklDCkBAIC05NCw3ICs5Nyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBBTEM4ODAuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfUkVBTFRFSz1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19SRUFMVEVLPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfQU5BTE9HCiAJdHJpc3RhdGUgIkJ1aWxkIEFuYWxvZyBEZXZpY2UgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKQEAgLTEwNCw3ICsxMDcsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQUQxOTg2QS4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19BTkFMT0c9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfQU5BTE9HPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfU0lHTUFURUwKIAl0cmlzdGF0ZSAiQnVpbGQgSURUL1NpZ21hdGVsIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCkBAIC0xMTQsNyArMTE3LDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIFNUQUM5MjAwLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX1NJR01BVEVMPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX1NJR01BVEVMPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfVklBCiAJdHJpc3RhdGUgIkJ1aWxkIFZJQSBIRC1hdWRpbyBjb2RlYyBzdXBwb3J0IgpAQCAtMTI0LDcgKzEyNyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBWVDE3MDguCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfVklBPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX1ZJQT1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0hETUkKIAl0cmlzdGF0ZSAiQnVpbGQgSERNSS9EaXNwbGF5UG9ydCBIRC1hdWRpbyBjb2RlYyBzdXBwb3J0IgpAQCAtMTM0LDcgKzEzNyw3IEBACiAJICBJbnRlbCBhbmQgTnZpZGlhIEhETUkvRGlzcGxheVBvcnQgY29kZWNzLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX0hETUk9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfSERNST1tCiAKIGNvbmZpZyBTTkRfSERBX0k5MTUKIAlib29sCkBAIC0xNDksNyArMTUyLDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIENTNDIwNi4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19DSVJSVVM9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfQ0lSUlVTPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfQ09ORVhBTlQKIAl0cmlzdGF0ZSAiQnVpbGQgQ29uZXhhbnQgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKQEAgLTE1OSw3ICsxNjIsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQ1gyMDU0OS4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19DT05FWEFOVD1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19DT05FWEFOVD1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NBMDExMAogCXRyaXN0YXRlICJCdWlsZCBDcmVhdGl2ZSBDQTAxMTAtSUJHIGNvZGVjIHN1cHBvcnQiCkBAIC0xNjksNyArMTcyLDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBmb3VuZCBvbiBzb21lIENyZWF0aXZlIFgtRmkgY2FyZHMuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQ0EwMTEwPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0NBMDExMD1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NBMDEzMgogCXRyaXN0YXRlICJCdWlsZCBDcmVhdGl2ZSBDQTAxMzIgY29kZWMgc3VwcG9ydCIKQEAgLTE3OCw3ICsxODEsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQ0EwMTMyPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0NBMDEzMj1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NBMDEzMl9EU1AKIAlib29sICJTdXBwb3J0IG5ldyBEU1AgY29kZSBmb3IgQ0EwMTMyIGNvZGVjIgpAQCAtMjAwLDcgKzIwMyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBDTUk5ODgwLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX0NNRURJQT1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19DTUVESUE9bQogCiBjb25maWcgU05EX0hEQV9DT0RFQ19TSTMwNTQKIAl0cmlzdGF0ZSAiQnVpbGQgU2lsaWNvbiBMYWJzIDMwNTQgSEQtbW9kZW0gY29kZWMgc3VwcG9ydCIKQEAgLTIwOSw3ICsyMTIsNyBAQAogCSAgKGFuZCBjb21wYXRpYmxlcykgc3VwcG9ydCBpbiBzbmQtaGRhLWludGVsIGRyaXZlci4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19TSTMwNTQ9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfU0kzMDU0PW0KIAogY29uZmlnIFNORF9IREFfR0VORVJJQwogCXRyaXN0YXRlICJFbmFibGUgZ2VuZXJpYyBIRC1hdWRpbyBjb2RlYyBwYXJzZXIiCkBAIC0yMTgsNyArMjIxLDcgQEAKIAkgIGluIHNuZC1oZGEtaW50ZWwgZHJpdmVyLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0dFTkVSSUM9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfR0VORVJJQz1tCiAKIGNvbmZpZyBTTkRfSERBX1BPV0VSX1NBVkVfREVGQVVMVAogCWludCAiRGVmYXVsdCB0aW1lLW91dCBmb3IgSEQtYXVkaW8gcG93ZXItc2F2ZSBtb2RlIgpAQCAtMjI5LDMgKzIzMiw1IEBACiAJICBwb3dlci1zYXZlIG1vZGUuICAwIG1lYW5zIHRvIGRpc2FibGUgdGhlIHBvd2VyLXNhdmUgbW9kZS4KIAogZW5kaWYKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggMWZjYjExOC4uZDBkMGMxOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC0xLDE1ICsxLDE2IEBACiBzbmQtaGRhLWludGVsLW9ianMgOj0gaGRhX2ludGVsLm8KK3NuZC1oZGEtY29udHJvbGxlci1vYmpzIDo9IGhkYV9jb250cm9sbGVyLm8KICMgZm9yIGhhc3dlbGwgcG93ZXIgd2VsbAogc25kLWhkYS1pbnRlbC0kKENPTkZJR19TTkRfSERBX0k5MTUpICs9CWhkYV9pOTE1Lm8KIAotc25kLWhkYS1jb2RlYy15IDo9IGhkYV9jb2RlYy5vIGhkYV9qYWNrLm8gaGRhX2F1dG9fcGFyc2VyLm8KK3NuZC1oZGEtY29kZWMteSA6PSBoZGFfY29kZWMubyBoZGFfamFjay5vIGhkYV9hdXRvX3BhcnNlci5vIGhkYV9zeXNmcy5vCiBzbmQtaGRhLWNvZGVjLSQoQ09ORklHX1BST0NfRlMpICs9IGhkYV9wcm9jLm8KIHNuZC1oZGEtY29kZWMtJChDT05GSUdfU05EX0hEQV9IV0RFUCkgKz0gaGRhX2h3ZGVwLm8KIHNuZC1oZGEtY29kZWMtJChDT05GSUdfU05EX0hEQV9JTlBVVF9CRUVQKSArPSBoZGFfYmVlcC5vCiAKICMgZm9yIHRyYWNlLXBvaW50cwogQ0ZMQUdTX2hkYV9jb2RlYy5vIDo9IC1JJChzcmMpCi1DRkxBR1NfaGRhX2ludGVsLm8gOj0gLUkkKHNyYykKK0NGTEFHU19oZGFfY29udHJvbGxlci5vIDo9IC1JJChzcmMpCiAKIHNuZC1oZGEtY29kZWMtZ2VuZXJpYy1vYmpzIDo9CWhkYV9nZW5lcmljLm8KIHNuZC1oZGEtY29kZWMtcmVhbHRlay1vYmpzIDo9CXBhdGNoX3JlYWx0ZWsubwpAQCAtMjUsNyArMjYsOCBAQAogc25kLWhkYS1jb2RlYy1oZG1pLW9ianMgOj0JcGF0Y2hfaGRtaS5vIGhkYV9lbGQubwogCiAjIGNvbW1vbiBkcml2ZXIKLW9iai0kKENPTkZJR19TTkRfSERBX0lOVEVMKSA6PSBzbmQtaGRhLWNvZGVjLm8KK29iai0kKENPTkZJR19TTkRfSERBKSA6PSBzbmQtaGRhLWNvZGVjLm8KK29iai0kKENPTkZJR19TTkRfSERBKSArPSBzbmQtaGRhLWNvbnRyb2xsZXIubwogCiAjIGNvZGVjIGRyaXZlcnMKIG9iai0kKENPTkZJR19TTkRfSERBX0dFTkVSSUMpICs9IHNuZC1oZGEtY29kZWMtZ2VuZXJpYy5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jIGIvc291bmQvcGNpL2hkYS9oZGFfYXV0b19wYXJzZXIuYwppbmRleCA0N2FkMzFjLi45MGQyZmRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2F1dG9fcGFyc2VyLmMKQEAgLTIyNywxMCArMjI3LDE4IEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoIWFzc29jX2xpbmVfb3V0KQogCQkJCWFzc29jX2xpbmVfb3V0ID0gYXNzb2M7Ci0JCQllbHNlIGlmIChhc3NvY19saW5lX291dCAhPSBhc3NvYykKKwkJCWVsc2UgaWYgKGFzc29jX2xpbmVfb3V0ICE9IGFzc29jKSB7CisJCQkJY29kZWNfaW5mbyhjb2RlYywKKwkJCQkJICAgImlnbm9yZSBwaW4gMHgleCB3aXRoIG1pc21hdGNoaW5nIGFzc29jIyAweCV4IHZzIDB4JXhcbiIsCisJCQkJCSAgIG5pZCwgYXNzb2MsIGFzc29jX2xpbmVfb3V0KTsKIAkJCQljb250aW51ZTsKLQkJCWlmIChjZmctPmxpbmVfb3V0cyA+PSBBUlJBWV9TSVpFKGNmZy0+bGluZV9vdXRfcGlucykpCisJCQl9CisJCQlpZiAoY2ZnLT5saW5lX291dHMgPj0gQVJSQVlfU0laRShjZmctPmxpbmVfb3V0X3BpbnMpKSB7CisJCQkJY29kZWNfaW5mbyhjb2RlYywKKwkJCQkJICAgImlnbm9yZSBwaW4gMHgleCwgdG9vIG1hbnkgYXNzaWduZWQgcGluc1xuIiwKKwkJCQkJICAgbmlkKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAkJCWxpbmVfb3V0W2NmZy0+bGluZV9vdXRzXS5waW4gPSBuaWQ7CiAJCQlsaW5lX291dFtjZmctPmxpbmVfb3V0c10uc2VxID0gc2VxOwogCQkJY2ZnLT5saW5lX291dHMrKzsKQEAgLTIzOCw4ICsyNDYsMTIgQEAKIAkJY2FzZSBBQ19KQUNLX1NQRUFLRVI6CiAJCQlzZXEgPSBnZXRfZGVmY2ZnX3NlcXVlbmNlKGRlZl9jb25mKTsKIAkJCWFzc29jID0gZ2V0X2RlZmNmZ19hc3NvY2lhdGlvbihkZWZfY29uZik7Ci0JCQlpZiAoY2ZnLT5zcGVha2VyX291dHMgPj0gQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucykpCisJCQlpZiAoY2ZnLT5zcGVha2VyX291dHMgPj0gQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucykpIHsKKwkJCQljb2RlY19pbmZvKGNvZGVjLAorCQkJCQkgICAiaWdub3JlIHBpbiAweCV4LCB0b28gbWFueSBhc3NpZ25lZCBwaW5zXG4iLAorCQkJCQkgICBuaWQpOwogCQkJCWNvbnRpbnVlOworCQkJfQogCQkJc3BlYWtlcl9vdXRbY2ZnLT5zcGVha2VyX291dHNdLnBpbiA9IG5pZDsKIAkJCXNwZWFrZXJfb3V0W2NmZy0+c3BlYWtlcl9vdXRzXS5zZXEgPSAoYXNzb2MgPDwgNCkgfCBzZXE7CiAJCQljZmctPnNwZWFrZXJfb3V0cysrOwpAQCAtMjQ3LDggKzI1OSwxMiBAQAogCQljYXNlIEFDX0pBQ0tfSFBfT1VUOgogCQkJc2VxID0gZ2V0X2RlZmNmZ19zZXF1ZW5jZShkZWZfY29uZik7CiAJCQlhc3NvYyA9IGdldF9kZWZjZmdfYXNzb2NpYXRpb24oZGVmX2NvbmYpOwotCQkJaWYgKGNmZy0+aHBfb3V0cyA+PSBBUlJBWV9TSVpFKGNmZy0+aHBfcGlucykpCisJCQlpZiAoY2ZnLT5ocF9vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5ocF9waW5zKSkgeworCQkJCWNvZGVjX2luZm8oY29kZWMsCisJCQkJCSAgICJpZ25vcmUgcGluIDB4JXgsIHRvbyBtYW55IGFzc2lnbmVkIHBpbnNcbiIsCisJCQkJCSAgIG5pZCk7CiAJCQkJY29udGludWU7CisJCQl9CiAJCQlocF9vdXRbY2ZnLT5ocF9vdXRzXS5waW4gPSBuaWQ7CiAJCQlocF9vdXRbY2ZnLT5ocF9vdXRzXS5zZXEgPSAoYXNzb2MgPDwgNCkgfCBzZXE7CiAJCQljZmctPmhwX291dHMrKzsKQEAgLTI2Nyw4ICsyODMsMTIgQEAKIAkJCWJyZWFrOwogCQljYXNlIEFDX0pBQ0tfU1BESUZfT1VUOgogCQljYXNlIEFDX0pBQ0tfRElHX09USEVSX09VVDoKLQkJCWlmIChjZmctPmRpZ19vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5kaWdfb3V0X3BpbnMpKQorCQkJaWYgKGNmZy0+ZGlnX291dHMgPj0gQVJSQVlfU0laRShjZmctPmRpZ19vdXRfcGlucykpIHsKKwkJCQljb2RlY19pbmZvKGNvZGVjLAorCQkJCQkgICAiaWdub3JlIHBpbiAweCV4LCB0b28gbWFueSBhc3NpZ25lZCBwaW5zXG4iLAorCQkJCQkgICBuaWQpOwogCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY2ZnLT5kaWdfb3V0X3BpbnNbY2ZnLT5kaWdfb3V0c10gPSBuaWQ7CiAJCQljZmctPmRpZ19vdXRfdHlwZVtjZmctPmRpZ19vdXRzXSA9CiAJCQkJKGxvYyA9PSBBQ19KQUNLX0xPQ19IRE1JKSA/CkBAIC0zMTMsOSArMzMzLDkgQEAKIAkJfQogCiAJCWlmIChoc21pYykKLQkJCXNuZF9wcmludGRkKCJUb2xkIHRvIGxvb2sgZm9yIGEgaGVhZHNldCBtaWMsIGJ1dCBkaWRuJ3QgZmluZCBhbnkuXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIlRvbGQgdG8gbG9vayBmb3IgYSBoZWFkc2V0IG1pYywgYnV0IGRpZG4ndCBmaW5kIGFueS5cbiIpOwogCQlpZiAoaHBtaWMpCi0JCQlzbmRfcHJpbnRkZCgiVG9sZCB0byBsb29rIGZvciBhIGhlYWRwaG9uZSBtaWMsIGJ1dCBkaWRuJ3QgZmluZCBhbnkuXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIlRvbGQgdG8gbG9vayBmb3IgYSBoZWFkcGhvbmUgbWljLCBidXQgZGlkbid0IGZpbmQgYW55LlxuIik7CiAJfQogCiAJLyogRklYLVVQOgpAQCAtMzg0LDMzICs0MDQsMzMgQEAKIAkvKgogCSAqIGRlYnVnIHByaW50cyBvZiB0aGUgcGFyc2VkIHJlc3VsdHMKIAkgKi8KLQlzbmRfcHJpbnRkKCJhdXRvY29uZmlnOiBsaW5lX291dHM9JWQgKDB4JXgvMHgleC8weCV4LzB4JXgvMHgleCkgdHlwZTolc1xuIiwKKwljb2RlY19pbmZvKGNvZGVjLCAiYXV0b2NvbmZpZzogbGluZV9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpIHR5cGU6JXNcbiIsCiAJCSAgIGNmZy0+bGluZV9vdXRzLCBjZmctPmxpbmVfb3V0X3BpbnNbMF0sIGNmZy0+bGluZV9vdXRfcGluc1sxXSwKIAkJICAgY2ZnLT5saW5lX291dF9waW5zWzJdLCBjZmctPmxpbmVfb3V0X3BpbnNbM10sCiAJCSAgIGNmZy0+bGluZV9vdXRfcGluc1s0XSwKIAkJICAgY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX0hQX09VVCA/ICJocCIgOgogCQkgICAoY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUID8KIAkJICAgICJzcGVha2VyIiA6ICJsaW5lIikpOwotCXNuZF9wcmludGQoIiAgIHNwZWFrZXJfb3V0cz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KVxuIiwKKwljb2RlY19pbmZvKGNvZGVjLCAiICAgc3BlYWtlcl9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpXG4iLAogCQkgICBjZmctPnNwZWFrZXJfb3V0cywgY2ZnLT5zcGVha2VyX3BpbnNbMF0sCiAJCSAgIGNmZy0+c3BlYWtlcl9waW5zWzFdLCBjZmctPnNwZWFrZXJfcGluc1syXSwKIAkJICAgY2ZnLT5zcGVha2VyX3BpbnNbM10sIGNmZy0+c3BlYWtlcl9waW5zWzRdKTsKLQlzbmRfcHJpbnRkKCIgICBocF9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpXG4iLAorCWNvZGVjX2luZm8oY29kZWMsICIgICBocF9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpXG4iLAogCQkgICBjZmctPmhwX291dHMsIGNmZy0+aHBfcGluc1swXSwKIAkJICAgY2ZnLT5ocF9waW5zWzFdLCBjZmctPmhwX3BpbnNbMl0sCiAJCSAgIGNmZy0+aHBfcGluc1szXSwgY2ZnLT5ocF9waW5zWzRdKTsKLQlzbmRfcHJpbnRkKCIgICBtb25vOiBtb25vX291dD0weCV4XG4iLCBjZmctPm1vbm9fb3V0X3Bpbik7CisJY29kZWNfaW5mbyhjb2RlYywgIiAgIG1vbm86IG1vbm9fb3V0PTB4JXhcbiIsIGNmZy0+bW9ub19vdXRfcGluKTsKIAlpZiAoY2ZnLT5kaWdfb3V0cykKLQkJc25kX3ByaW50ZCgiICAgZGlnLW91dD0weCV4LzB4JXhcbiIsCisJCWNvZGVjX2luZm8oY29kZWMsICIgICBkaWctb3V0PTB4JXgvMHgleFxuIiwKIAkJCSAgIGNmZy0+ZGlnX291dF9waW5zWzBdLCBjZmctPmRpZ19vdXRfcGluc1sxXSk7Ci0Jc25kX3ByaW50ZCgiICAgaW5wdXRzOlxuIik7CisJY29kZWNfaW5mbyhjb2RlYywgIiAgIGlucHV0czpcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQlzbmRfcHJpbnRkKCIgICAgICVzPTB4JXhcbiIsCisJCWNvZGVjX2luZm8oY29kZWMsICIgICAgICVzPTB4JXhcbiIsCiAJCQkgICAgaGRhX2dldF9hdXRvY2ZnX2lucHV0X2xhYmVsKGNvZGVjLCBjZmcsIGkpLAogCQkJICAgIGNmZy0+aW5wdXRzW2ldLnBpbik7CiAJfQogCWlmIChjZmctPmRpZ19pbl9waW4pCi0JCXNuZF9wcmludGQoIiAgIGRpZy1pbj0weCV4XG4iLCBjZmctPmRpZ19pbl9waW4pOworCQljb2RlY19pbmZvKGNvZGVjLCAiICAgZGlnLWluPTB4JXhcbiIsIGNmZy0+ZGlnX2luX3Bpbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc3NCwzOCArNzk0LDMzIEBACiAJCWNhc2UgSERBX0ZJWFVQX1BJTlM6CiAJCQlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFIHx8ICFmaXgtPnYucGlucykKIAkJCQlicmVhazsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyBTRlgKLQkJCQkgICAgIiVzOiBBcHBseSBwaW5jZmcgZm9yICVzXG4iLAorCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IEFwcGx5IHBpbmNmZyBmb3IgJXNcbiIsCiAJCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlzbmRfaGRhX2FwcGx5X3BpbmNmZ3MoY29kZWMsIGZpeC0+di5waW5zKTsKIAkJCWJyZWFrOwogCQljYXNlIEhEQV9GSVhVUF9WRVJCUzoKIAkJCWlmIChhY3Rpb24gIT0gSERBX0ZJWFVQX0FDVF9QUk9CRSB8fCAhZml4LT52LnZlcmJzKQogCQkJCWJyZWFrOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPIFNGWAotCQkJCSAgICAiJXM6IEFwcGx5IGZpeC12ZXJicyBmb3IgJXNcbiIsCisJCQljb2RlY19kYmcoY29kZWMsICIlczogQXBwbHkgZml4LXZlcmJzIGZvciAlc1xuIiwKIAkJCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgbW9kZWxuYW1lKTsKIAkJCXNuZF9oZGFfYWRkX3ZlcmJzKGNvZGVjLCBmaXgtPnYudmVyYnMpOwogCQkJYnJlYWs7CiAJCWNhc2UgSERBX0ZJWFVQX0ZVTkM6CiAJCQlpZiAoIWZpeC0+di5mdW5jKQogCQkJCWJyZWFrOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPIFNGWAotCQkJCSAgICAiJXM6IEFwcGx5IGZpeC1mdW5jIGZvciAlc1xuIiwKKwkJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBBcHBseSBmaXgtZnVuYyBmb3IgJXNcbiIsCiAJCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlmaXgtPnYuZnVuYyhjb2RlYywgZml4LCBhY3Rpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgSERBX0ZJWFVQX1BJTkNUTFM6CiAJCQlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJPQkUgfHwgIWZpeC0+di5waW5zKQogCQkJCWJyZWFrOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPIFNGWAotCQkJCSAgICAiJXM6IEFwcGx5IHBpbmN0bCBmb3IgJXNcbiIsCisJCQljb2RlY19kYmcoY29kZWMsICIlczogQXBwbHkgcGluY3RsIGZvciAlc1xuIiwKIAkJCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgbW9kZWxuYW1lKTsKIAkJCXNldF9waW5fdGFyZ2V0cyhjb2RlYywgZml4LT52LnBpbnMpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWAotCQkJCSAgICIlczogSW52YWxpZCBmaXh1cCB0eXBlICVkXG4iLAorCQkJY29kZWNfZXJyKGNvZGVjLCAiJXM6IEludmFsaWQgZml4dXAgdHlwZSAlZFxuIiwKIAkJCQkgICBjb2RlYy0+Y2hpcF9uYW1lLCBmaXgtPnR5cGUpOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwppbmRleCAwNTg5YjM5Li44YzZjNTBhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgpAQCAtMTQwLDcgKzEzOSwxMCBAQAogCiBzdGF0aWMgdm9pZCBzbmRfaGRhX2RvX2RldGFjaChzdHJ1Y3QgaGRhX2JlZXAgKmJlZXApCiB7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYmVlcC0+ZGV2KTsKKwlpZiAoYmVlcC0+cmVnaXN0ZXJlZCkKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYmVlcC0+ZGV2KTsKKwllbHNlCisJCWlucHV0X2ZyZWVfZGV2aWNlKGJlZXAtPmRldik7CiAJYmVlcC0+ZGV2ID0gTlVMTDsKIAl0dXJuX29mZl9iZWVwKGJlZXApOwogfQpAQCAtMTQ5LDcgKzE1MSw2IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gYmVlcC0+Y29kZWM7Ci0JaW50IGVycjsKIAogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaW5wdXRfZGV2KQpAQCAtMTY3LDE1ICsxNjgsOSBAQAogCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9TTkQpOwogCWlucHV0X2Rldi0+c25kYml0WzBdID0gQklUX01BU0soU05EX0JFTEwpIHwgQklUX01BU0soU05EX1RPTkUpOwogCWlucHV0X2Rldi0+ZXZlbnQgPSBzbmRfaGRhX2JlZXBfZXZlbnQ7Ci0JaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNvZGVjLT5idXMtPnBjaS0+ZGV2OworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjb2RlYy0+ZGV2OwogCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgYmVlcCk7CiAKLQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKLQlpZiAoZXJyIDwgMCkgewotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfYmVlcDogdW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQogCWJlZXAtPmRldiA9IGlucHV0X2RldjsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NSw2ICsyNDAsMjcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKTsKIAoraW50IHNuZF9oZGFfcmVnaXN0ZXJfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9iZWVwICpiZWVwID0gY29kZWMtPmJlZXA7CisJaW50IGVycjsKKworCWlmICghYmVlcCB8fCAhYmVlcC0+ZGV2KQorCQlyZXR1cm4gMDsKKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShiZWVwLT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWNvZGVjX2Vycihjb2RlYywgImhkYV9iZWVwOiB1bmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoYmVlcC0+ZGV2KTsKKwkJY29kZWMtPmJlZXAgPSBOVUxMOworCQlrZnJlZShiZWVwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJYmVlcC0+cmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKTsKKwogc3RhdGljIGJvb2wgY3RsX2hhc19tdXRlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCmluZGV4IGNiODg0NjQuLmE2M2I1ZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKQEAgLTM0LDYgKzM0LDcgQEAKIAljaGFyIHBoeXNbMzJdOwogCWludCB0b25lOwogCWhkYV9uaWRfdCBuaWQ7CisJdW5zaWduZWQgaW50IHJlZ2lzdGVyZWQ6MTsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlZDoxOwogCXVuc2lnbmVkIGludCBsaW5lYXJfdG9uZToxOwkvKiBsaW5lYXIgdG9uZSBmb3IgSURUL1NUQUMgY29kZWMgKi8KIAl1bnNpZ25lZCBpbnQgcGxheWluZzoxOwpAQCAtNDUsNiArNDYsNyBAQAogaW50IHNuZF9oZGFfZW5hYmxlX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlKTsKIGludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCk7CiB2b2lkIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKK2ludCBzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCkKIHsKQEAgLTUzLDUgKzU1LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfcmVnaXN0ZXJfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKaW5kZXggZGFmY2Y4Mi4uNGMyMDI3NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KQEAgLTY4LDYgKzY3LDcgQEAKIAl7IDB4MTdlOCwgIkNocm9udGVsIiB9LAogCXsgMHgxODU0LCAiTEciIH0sCiAJeyAweDFhZWMsICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MiIH0sCisJeyAweDFhZjQsICJRRU1VIiB9LAogCXsgMHg0MzRkLCAiQy1NZWRpYSIgfSwKIAl7IDB4ODA4NiwgIkludGVsIiB9LAogCXsgMHg4Mzg0LCAiU2lnbWFUZWwiIH0sCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogCWlmICgoY29kZWMtPmFkZHIgJiB+MHhmKSB8fCAobmlkICYgfjB4N2YpIHx8CiAJICAgICh2ZXJiICYgfjB4ZmZmKSB8fCAocGFybSAmIH4weGZmZmYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGRhLWNvZGVjOiBvdXQgb2YgcmFuZ2UgY21kICV4OiV4OiV4OiV4XG4iLAorCQljb2RlY19lcnIoY29kZWMsICJoZGEtY29kZWM6IG91dCBvZiByYW5nZSBjbWQgJXg6JXg6JXg6JXhcbiIsCiAJCSAgICAgICBjb2RlYy0+YWRkciwgbmlkLCB2ZXJiLCBwYXJtKTsKIAkJcmV0dXJuIH4wOwogCX0KQEAgLTI0OSw4ICsyNDksOCBAQAogCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CiAJaWYgKCFjb2RlY19pbl9wbShjb2RlYykgJiYgcmVzICYmICpyZXMgPT0gLTEgJiYgYnVzLT5yaXJiX2Vycm9yKSB7CiAJCWlmIChidXMtPnJlc3BvbnNlX3Jlc2V0KSB7Ci0JCQlzbmRfcHJpbnRkKCJoZGFfY29kZWM6IHJlc2V0dGluZyBCVVMgZHVlIHRvICIKLQkJCQkgICAiZmF0YWwgY29tbXVuaWNhdGlvbiBlcnJvclxuIik7CisJCQljb2RlY19kYmcoY29kZWMsCisJCQkJICAicmVzZXR0aW5nIEJVUyBkdWUgdG8gZmF0YWwgY29tbXVuaWNhdGlvbiBlcnJvclxuIik7CiAJCQl0cmFjZV9oZGFfYnVzX3Jlc2V0KGJ1cyk7CiAJCQlidXMtPm9wcy5idXNfcmVzZXQoYnVzKTsKIAkJfQpAQCAtNDc1LDggKzQ3NSw3IEBACiAKIAlpZiAobGVuID4gMCAmJiBjb25uX2xpc3QpIHsKIAkJaWYgKGxlbiA+IG1heF9jb25ucykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiAiCi0JCQkJICAgIlRvbyBtYW55IGNvbm5lY3Rpb25zICVkIGZvciBOSUQgMHgleFxuIiwKKwkJCWNvZGVjX2Vycihjb2RlYywgIlRvbyBtYW55IGNvbm5lY3Rpb25zICVkIGZvciBOSUQgMHgleFxuIiwKIAkJCQkgICBsZW4sIG5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNTc0LDggKzU3Myw4IEBACiAJCXJhbmdlX3ZhbCA9ICEhKHBhcm0gJiAoMSA8PCAoc2hpZnQtMSkpKTsgLyogcmFuZ2VzICovCiAJCXZhbCA9IHBhcm0gJiBtYXNrOwogCQlpZiAodmFsID09IDAgJiYgbnVsbF9jb3VudCsrKSB7ICAvKiBubyBzZWNvbmQgY2hhbmNlICovCi0JCQlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjOiAiCi0JCQkJICAgImludmFsaWQgQ09OTkVDVF9MSVNUIHZlcmIgJXhbJWldOiV4XG4iLAorCQkJY29kZWNfZGJnKGNvZGVjLAorCQkJCSAgImludmFsaWQgQ09OTkVDVF9MSVNUIHZlcmIgJXhbJWldOiV4XG4iLAogCQkJCSAgICBuaWQsIGksIHBhcm0pOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTU4Myw3ICs1ODIsNyBAQAogCQlpZiAocmFuZ2VfdmFsKSB7CiAJCQkvKiByYW5nZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgYW5kIHRoaXMgb25lICovCiAJCQlpZiAoIXByZXZfbmlkIHx8IHByZXZfbmlkID49IHZhbCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6ICIKKwkJCQljb2RlY193YXJuKGNvZGVjLAogCQkJCQkgICAiaW52YWxpZCBkZXBfcmFuZ2VfdmFsICV4OiV4XG4iLAogCQkJCQkgICBwcmV2X25pZCwgdmFsKTsKIAkJCQljb250aW51ZTsKQEAgLTY2MCw3ICs2NTksNyBAQAogCWlmICghcmVjdXJzaXZlKQogCQlyZXR1cm4gLTE7CiAJaWYgKHJlY3Vyc2l2ZSA+IDEwKSB7Ci0JCXNuZF9wcmludGQoImhkYV9jb2RlYzogdG9vIGRlZXAgY29ubmVjdGlvbiBmb3IgMHgleFxuIiwgbmlkKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAidG9vIGRlZXAgY29ubmVjdGlvbiBmb3IgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZWN1cnNpdmUrKzsKQEAgLTgwOCw4ICs4MDcsNyBAQAogCiAJdW5zb2wgPSBremFsbG9jKHNpemVvZigqdW5zb2wpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVuc29sKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogIgotCQkJICAgImNhbid0IGFsbG9jYXRlIHVuc29saWNpdGVkIHF1ZXVlXG4iKTsKKwkJZGV2X2VycihidXMtPmNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIHVuc29saWNpdGVkIHF1ZXVlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzKTsKQEAgLTgyMSw1MSArODE5LDM2IEBACiAvKgogICogZGVzdHJ1Y3RvcgogICovCi1zdGF0aWMgdm9pZCBzbmRfaGRhX2NvZGVjX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotCi1zdGF0aWMgaW50IHNuZF9oZGFfYnVzX2ZyZWUoc3RydWN0IGhkYV9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIHNuZF9oZGFfYnVzX2ZyZWUoc3RydWN0IGhkYV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgKm47Ci0KIAlpZiAoIWJ1cykKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKKworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmJ1cy0+Y29kZWNfbGlzdCkpOwogCWlmIChidXMtPndvcmtxKQogCQlmbHVzaF93b3JrcXVldWUoYnVzLT53b3JrcSk7CiAJaWYgKGJ1cy0+dW5zb2wpCiAJCWtmcmVlKGJ1cy0+dW5zb2wpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb2RlYywgbiwgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewotCQlzbmRfaGRhX2NvZGVjX2ZyZWUoY29kZWMpOwotCX0KIAlpZiAoYnVzLT5vcHMucHJpdmF0ZV9mcmVlKQogCQlidXMtPm9wcy5wcml2YXRlX2ZyZWUoYnVzKTsKIAlpZiAoYnVzLT53b3JrcSkKIAkJZGVzdHJveV93b3JrcXVldWUoYnVzLT53b3JrcSk7CiAKIAlrZnJlZShidXMpOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9oZGFfYnVzX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGhkYV9idXMgKmJ1cyA9IGRldmljZS0+ZGV2aWNlX2RhdGE7Ci0JYnVzLT5zaHV0ZG93biA9IDE7Ci0JcmV0dXJuIHNuZF9oZGFfYnVzX2ZyZWUoYnVzKTsKLX0KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0hXREVQCi1zdGF0aWMgaW50IHNuZF9oZGFfYnVzX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBoZGFfYnVzICpidXMgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJc25kX2hkYV9od2RlcF9hZGRfc3lzZnMoY29kZWMpOwotCQlzbmRfaGRhX2h3ZGVwX2FkZF9wb3dlcl9zeXNmcyhjb2RlYyk7Ci0JfQorCXNuZF9oZGFfYnVzX2ZyZWUoZGV2aWNlLT5kZXZpY2VfZGF0YSk7CiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQotI2RlZmluZSBzbmRfaGRhX2J1c19kZXZfcmVnaXN0ZXIJTlVMTAotI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX2hkYV9idXNfZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaGRhX2J1cyAqYnVzID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlidXMtPnNodXRkb3duID0gMTsKKwlyZXR1cm4gMDsKK30KIAogLyoqCiAgKiBzbmRfaGRhX2J1c19uZXcgLSBjcmVhdGUgYSBIREEgYnVzCkBAIC04ODIsNyArODY1LDcgQEAKIAlzdHJ1Y3QgaGRhX2J1cyAqYnVzOwogCWludCBlcnI7CiAJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBkZXZfb3BzID0gewotCQkuZGV2X3JlZ2lzdGVyID0gc25kX2hkYV9idXNfZGV2X3JlZ2lzdGVyLAorCQkuZGV2X2Rpc2Nvbm5lY3QgPSBzbmRfaGRhX2J1c19kZXZfZGlzY29ubmVjdCwKIAkJLmRldl9mcmVlID0gc25kX2hkYV9idXNfZGV2X2ZyZWUsCiAJfTsKIApAQCAtODk2LDcgKzg3OSw3IEBACiAKIAlidXMgPSBremFsbG9jKHNpemVvZigqYnVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1cyA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIHN0cnVjdCBoZGFfYnVzXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaGRhX2J1c1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtOTE1LDcgKzg5OCw3IEBACiAJCSAiaGQtYXVkaW8lZCIsIGNhcmQtPm51bWJlcik7CiAJYnVzLT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGJ1cy0+d29ya3FfbmFtZSk7CiAJaWYgKCFidXMtPndvcmtxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlICVzXG4iLAorCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlICVzXG4iLAogCQkJICAgYnVzLT53b3JrcV9uYW1lKTsKIAkJa2ZyZWUoYnVzKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05NTksNyArOTQyLDcgQEAKIAltdXRleF9sb2NrKCZwcmVzZXRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodGJsLCAmaGRhX3ByZXNldF90YWJsZXMsIGxpc3QpIHsKIAkJaWYgKCF0cnlfbW9kdWxlX2dldCh0YmwtPm93bmVyKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgbW9kdWxlX2dldFxuIik7CisJCQljb2RlY19lcnIoY29kZWMsICJjYW5ub3QgbW9kdWxlX2dldFxuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQlmb3IgKHByZXNldCA9IHRibC0+cHJlc2V0OyBwcmVzZXQtPmlkOyBwcmVzZXQrKykgewpAQCAtMTE4NSw3ICsxMTY4LDcgQEAKIHsKIAlzdHJ1Y3QgaGRhX3BpbmNmZyAqcGluOwogCi0jaWZkZWYgQ09ORklHX1NORF9IREFfSFdERVAKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwogCXsKIAkJdW5zaWduZWQgaW50IGNmZyA9IDA7CiAJCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKQEAgLTEzMDAsNyArMTI4Myw3IEBACiBzdGF0aWMgdm9pZCBmcmVlX2luaXRfcGluY2ZncyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmRyaXZlcl9waW5zKTsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAorI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCiAJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT51c2VyX3BpbnMpOwogI2VuZGlmCiAJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5pbml0X3BpbnMpOwpAQCAtMTM3NCw2ICsxMzU3LDcgQEAKIAlpZiAoY29kZWMtPnBhdGNoX29wcy5mcmVlKQogCQljb2RlYy0+cGF0Y2hfb3BzLmZyZWUoY29kZWMpOwogCWhkYV9jYWxsX3BtX25vdGlmeShjb2RlYywgZmFsc2UpOyAvKiBjYW5jZWwgbGVmdG92ZXIgcmVmY291bnRzICovCisJc25kX2hkYV9zeXNmc19jbGVhcihjb2RlYyk7CiAJdW5sb2FkX3BhcnNlcihjb2RlYyk7CiAJbW9kdWxlX3B1dChjb2RlYy0+b3duZXIpOwogCWZyZWVfaGRhX2NhY2hlKCZjb2RlYy0+YW1wX2NhY2hlKTsKQEAgLTEzODMsNyArMTM2Nyw3IEBACiAJa2ZyZWUoY29kZWMtPm1vZGVsbmFtZSk7CiAJa2ZyZWUoY29kZWMtPndjYXBzKTsKIAljb2RlYy0+YnVzLT5udW1fY29kZWNzLS07Ci0Ja2ZyZWUoY29kZWMpOworCXB1dF9kZXZpY2UoJmNvZGVjLT5kZXYpOwogfQogCiBzdGF0aWMgYm9vbCBzbmRfaGRhX2NvZGVjX2dldF9zdXBwb3J0ZWRfcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0xMzkyLDYgKzEzNzYsMzggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGRhX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQl1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGUpOwogCitzdGF0aWMgaW50IHNuZF9oZGFfY29kZWNfZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCWludCBlcnIgPSBkZXZpY2VfYWRkKCZjb2RlYy0+ZGV2KTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9oZGFfcmVnaXN0ZXJfYmVlcF9kZXZpY2UoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfY29kZWNfZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisKKwlzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShjb2RlYyk7CisJZGV2aWNlX2RlbCgmY29kZWMtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkYV9jb2RlY19kZXZfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQoreworCXNuZF9oZGFfY29kZWNfZnJlZShkZXZpY2UtPmRldmljZV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoganVzdCBmcmVlIHRoZSBjb250YWluZXIgKi8KK3N0YXRpYyB2b2lkIHNuZF9oZGFfY29kZWNfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBoZGFfY29kZWMsIGRldikpOworfQorCiAvKioKICAqIHNuZF9oZGFfY29kZWNfbmV3IC0gY3JlYXRlIGEgSERBIGNvZGVjCiAgKiBAYnVzOiB0aGUgYnVzIHRvIGFzc2lnbgpAQCAtMTQwOCw2ICsxNDI0LDExIEBACiAJY2hhciBjb21wb25lbnRbMzFdOwogCWhkYV9uaWRfdCBmZzsKIAlpbnQgZXJyOworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgZGV2X29wcyA9IHsKKwkJLmRldl9yZWdpc3RlciA9IHNuZF9oZGFfY29kZWNfZGV2X3JlZ2lzdGVyLAorCQkuZGV2X2Rpc2Nvbm5lY3QgPSBzbmRfaGRhX2NvZGVjX2Rldl9kaXNjb25uZWN0LAorCQkuZGV2X2ZyZWUgPSBzbmRfaGRhX2NvZGVjX2Rldl9mcmVlLAorCX07CiAKIAlpZiAoc25kX0JVR19PTighYnVzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDE1LDE3ICsxNDM2LDI3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGJ1cy0+Y2FkZHJfdGJsW2NvZGVjX2FkZHJdKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogIgotCQkJICAgImFkZHJlc3MgMHgleCBpcyBhbHJlYWR5IG9jY3VwaWVkXG4iLCBjb2RlY19hZGRyKTsKKwkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKKwkJCSJhZGRyZXNzIDB4JXggaXMgYWxyZWFkeSBvY2N1cGllZFxuIiwKKwkJCWNvZGVjX2FkZHIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWNvZGVjID0ga3phbGxvYyhzaXplb2YoKmNvZGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNvZGVjID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgc3RydWN0IGhkYV9jb2RlY1xuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaGRhX2NvZGVjXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJZGV2aWNlX2luaXRpYWxpemUoJmNvZGVjLT5kZXYpOworCWNvZGVjLT5kZXYucGFyZW50ID0gJmJ1cy0+Y2FyZC0+Y2FyZF9kZXY7CisJY29kZWMtPmRldi5jbGFzcyA9IHNvdW5kX2NsYXNzOworCWNvZGVjLT5kZXYucmVsZWFzZSA9IHNuZF9oZGFfY29kZWNfZGV2X3JlbGVhc2U7CisJY29kZWMtPmRldi5ncm91cHMgPSBzbmRfaGRhX2Rldl9hdHRyX2dyb3VwczsKKwlkZXZfc2V0X25hbWUoJmNvZGVjLT5kZXYsICJoZGF1ZGlvQyVkRCVkIiwgYnVzLT5jYXJkLT5udW1iZXIsCisJCSAgICAgY29kZWNfYWRkcik7CisJZGV2X3NldF9kcnZkYXRhKCZjb2RlYy0+ZGV2LCBjb2RlYyk7IC8qIGZvciBzeXNmcyAqLworCiAJY29kZWMtPmJ1cyA9IGJ1czsKIAljb2RlYy0+YWRkciA9IGNvZGVjX2FkZHI7CiAJbXV0ZXhfaW5pdCgmY29kZWMtPnNwZGlmX211dGV4KTsKQEAgLTE0NTYsMTEgKzE0ODcsMTMgQEAKIAloZGFfa2VlcF9wb3dlcl9vbihjb2RlYyk7CiAjZW5kaWYKIAorCXNuZF9oZGFfc3lzZnNfaW5pdChjb2RlYyk7CisKIAlpZiAoY29kZWMtPmJ1cy0+bW9kZWxuYW1lKSB7CiAJCWNvZGVjLT5tb2RlbG5hbWUgPSBrc3RyZHVwKGNvZGVjLT5idXMtPm1vZGVsbmFtZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY29kZWMtPm1vZGVsbmFtZSkgewotCQkJc25kX2hkYV9jb2RlY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiAtRU5PREVWOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9CiAKQEAgLTE0ODQsNyArMTUxNyw3IEBACiAKIAlzZXR1cF9mZ19ub2Rlcyhjb2RlYyk7CiAJaWYgKCFjb2RlYy0+YWZnICYmICFjb2RlYy0+bWZnKSB7Ci0JCXNuZF9wcmludGRkKCJoZGFfY29kZWM6IG5vIEFGRyBvciBNRkcgbm9kZSBmb3VuZFxuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJubyBBRkcgb3IgTUZHIG5vZGUgZm91bmRcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE0OTIsNyArMTUyNSw3IEBACiAJZmcgPSBjb2RlYy0+YWZnID8gY29kZWMtPmFmZyA6IGNvZGVjLT5tZmc7CiAJZXJyID0gcmVhZF93aWRnZXRfY2Fwcyhjb2RlYywgZmcpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2Fubm90IG1hbGxvY1xuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJjYW5ub3QgbWFsbG9jXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJZXJyID0gcmVhZF9waW5fZGVmYXVsdHMoY29kZWMpOwpAQCAtMTUyOCw2ICsxNTYxLDEwIEBACiAJCWNvZGVjLT5zdWJzeXN0ZW1faWQsIGNvZGVjLT5yZXZpc2lvbl9pZCk7CiAJc25kX2NvbXBvbmVudF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwgY29tcG9uZW50KTsKIAorCWVyciA9IHNuZF9kZXZpY2VfbmV3KGJ1cy0+Y2FyZCwgU05EUlZfREVWX0NPREVDLCBjb2RlYywgJmRldl9vcHMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCiAJaWYgKGNvZGVjcCkKIAkJKmNvZGVjcCA9IGNvZGVjOwogCXJldHVybiAwOwpAQCAtMTU1MCw3ICsxNTg3LDcgQEAKIAlmZyA9IGNvZGVjLT5hZmcgPyBjb2RlYy0+YWZnIDogY29kZWMtPm1mZzsKIAllcnIgPSByZWFkX3dpZGdldF9jYXBzKGNvZGVjLCBmZyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgbWFsbG9jXG4iKTsKKwkJY29kZWNfZXJyKGNvZGVjLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNjI3LDcgKzE2NjQsNyBAQAogI2VuZGlmCiAJCX0KIAkJaWYgKCFwYXRjaCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJoZGEtY29kZWM6IE5vIGNvZGVjIHBhcnNlciBpcyBhdmFpbGFibGVcbiIpOworCQkJY29kZWNfZXJyKGNvZGVjLCAiTm8gY29kZWMgcGFyc2VyIGlzIGF2YWlsYWJsZVxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTE3MTEsOSArMTc0OCw5IEBACiAJaWYgKCFuaWQpCiAJCXJldHVybjsKIAotCXNuZF9wcmludGRkKCJoZGFfY29kZWNfc2V0dXBfc3RyZWFtOiAiCi0JCSAgICAiTklEPTB4JXgsIHN0cmVhbT0weCV4LCBjaGFubmVsPSVkLCBmb3JtYXQ9MHgleFxuIiwKLQkJICAgIG5pZCwgc3RyZWFtX3RhZywgY2hhbm5lbF9pZCwgZm9ybWF0KTsKKwljb2RlY19kYmcoY29kZWMsCisJCSAgImhkYV9jb2RlY19zZXR1cF9zdHJlYW06IE5JRD0weCV4LCBzdHJlYW09MHgleCwgY2hhbm5lbD0lZCwgZm9ybWF0PTB4JXhcbiIsCisJCSAgbmlkLCBzdHJlYW1fdGFnLCBjaGFubmVsX2lkLCBmb3JtYXQpOwogCXAgPSBnZXRfaGRhX2N2dF9zZXR1cChjb2RlYywgbmlkKTsKIAlpZiAoIXApCiAJCXJldHVybjsKQEAgLTE3NjAsNyArMTc5Nyw3IEBACiAJaWYgKGNvZGVjLT5ub19zdGlja3lfc3RyZWFtKQogCQlkb19ub3cgPSAxOwogCi0Jc25kX3ByaW50ZGQoImhkYV9jb2RlY19jbGVhbnVwX3N0cmVhbTogTklEPTB4JXhcbiIsIG5pZCk7CisJY29kZWNfZGJnKGNvZGVjLCAiaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtOiBOSUQ9MHgleFxuIiwgbmlkKTsKIAlwID0gZ2V0X2hkYV9jdnRfc2V0dXAoY29kZWMsIG5pZCk7CiAJaWYgKHApIHsKIAkJLyogaGVyZSB3ZSBqdXN0IGNsZWFyIHRoZSBhY3RpdmUgZmxhZyB3aGVuIGRvX25vdyBpc24ndCBzZXQ7CkBAIC0yMjgyLDkgKzIzMTksOSBAQAogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gZ2V0X2FtcF9tYXhfdmFsdWUoY29kZWMsIG5pZCwgZGlyLCBvZnMpOwogCWlmICghdWluZm8tPnZhbHVlLmludGVnZXIubWF4KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogIgotCQkgICAgICAgIm51bV9zdGVwcyA9IDAgZm9yIE5JRD0weCV4IChjdGwgPSAlcylcbiIsIG5pZCwKLQkJICAgICAgIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJY29kZWNfd2Fybihjb2RlYywKKwkJCSAgICJudW1fc3RlcHMgPSAwIGZvciBOSUQ9MHgleCAoY3RsID0gJXMpXG4iLAorCQkJICAgbmlkLCBrY29udHJvbC0+aWQubmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI1NTgsOCArMjU5NSw4IEBACiAJCWl0ZW0tPm5pZCA9IG5pZDsKIAkJcmV0dXJuIDA7CiAJfQotCXByaW50ayhLRVJOX0VSUiAiaGRhLWNvZGVjOiBubyBOSUQgZm9yIG1hcHBpbmcgY29udHJvbCAlczolZDolZFxuIiwKLQkgICAgICAga2N0bC0+aWQubmFtZSwga2N0bC0+aWQuaW5kZXgsIGluZGV4KTsKKwljb2RlY19lcnIoY29kZWMsICJubyBOSUQgZm9yIG1hcHBpbmcgY29udHJvbCAlczolZDolZFxuIiwKKwkJICBrY3RsLT5pZC5uYW1lLCBrY3RsLT5pZC5pbmRleCwgaW5kZXgpOwogCXJldHVybiAtRUlOVkFMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9hZGRfbmlkKTsKQEAgLTI2NjAsNiArMjY5Nyw3IEBACiAJCQkJICBidXMtPnBjbV9kZXZfYml0cyk7CiAJCX0KIAl9CisJc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoY29kZWMpOwogCWlmIChjb2RlYy0+cGF0Y2hfb3BzLmZyZWUpCiAJCWNvZGVjLT5wYXRjaF9vcHMuZnJlZShjb2RlYyk7CiAJbWVtc2V0KCZjb2RlYy0+cGF0Y2hfb3BzLCAwLCBzaXplb2YoY29kZWMtPnBhdGNoX29wcykpOwpAQCAtMjc1MSw3ICsyNzg5LDcgQEAKIAkJCXJldHVybiAtMTsKIAkJaWYgKCpzdGVwX3RvX2NoZWNrICYmICpzdGVwX3RvX2NoZWNrICE9IHN0ZXApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogTWlzbWF0Y2hpbmcgZEIgc3RlcCBmb3Igdm1hc3RlciBzbGF2ZSAoJWQhPSVkKVxuIiwKLQkJCQkgICAqc3RlcF90b19jaGVjaywgc3RlcCk7CistCQkJCSAgICpzdGVwX3RvX2NoZWNrLCBzdGVwKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQkqc3RlcF90b19jaGVjayA9IHN0ZXA7CkBAIC0yODIxLDcgKzI4NTksNyBAQAogCiAJZXJyID0gbWFwX3NsYXZlcyhjb2RlYywgc2xhdmVzLCBzdWZmaXgsIGNoZWNrX3NsYXZlX3ByZXNlbnQsIE5VTEwpOwogCWlmIChlcnIgIT0gMSkgewotCQlzbmRfcHJpbnRkZCgiTm8gc2xhdmUgZm91bmQgZm9yICVzXG4iLCBuYW1lKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiTm8gc2xhdmUgZm91bmQgZm9yICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCWtjdGwgPSBzbmRfY3RsX21ha2VfdmlydHVhbF9tYXN0ZXIobmFtZSwgdGx2KTsKQEAgLTM0ODcsNyArMzUyNSw3IEBACiAKIAlpZHggPSBmaW5kX2VtcHR5X21peGVyX2N0bF9pZHgoY29kZWMsICJJRUM5NTggUGxheWJhY2sgU3dpdGNoIiwgaWR4KTsKIAlpZiAoaWR4IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogdG9vIG1hbnkgSUVDOTU4IG91dHB1dHNcbiIpOworCQljb2RlY19lcnIoY29kZWMsICJ0b28gbWFueSBJRUM5NTggb3V0cHV0c1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXNwZGlmID0gc25kX2FycmF5X25ldygmY29kZWMtPnNwZGlmX291dCk7CkBAIC0zNjkxLDcgKzM3MjksNyBAQAogCiAJaWR4ID0gZmluZF9lbXB0eV9taXhlcl9jdGxfaWR4KGNvZGVjLCAiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwgMCk7CiAJaWYgKGlkeCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IHRvbyBtYW55IElFQzk1OCBpbnB1dHNcbiIpOworCQljb2RlY19lcnIoY29kZWMsICJ0b28gbWFueSBJRUM5NTggaW5wdXRzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZm9yIChkaWdfbWl4ID0gZGlnX2luX2N0bHM7IGRpZ19taXgtPm5hbWU7IGRpZ19taXgrKykgewpAQCAtNDAxMCw3ICs0MDQ4LDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAorI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCiAvKiBleGVjdXRlIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyAqLwogc3RhdGljIHZvaWQgaGRhX2V4ZWNfaW5pdF92ZXJicyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTQxMTgsMTIgKzQxNTYsMTMgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CiAJCWludCBlcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgYnVpbGQgY29udHJvbHMgIgotCQkJICAgICAgICJmb3IgIyVkIChlcnJvciAlZClcbiIsIGNvZGVjLT5hZGRyLCBlcnIpOworCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCSAgImNhbm5vdCBidWlsZCBjb250cm9scyBmb3IgIyVkIChlcnJvciAlZClcbiIsCisJCQkJICBjb2RlYy0+YWRkciwgZXJyKTsKIAkJCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImhkYV9jb2RlYzogY2Fubm90IHJldmVydCBjb2RlY1xuIik7CisJCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCQkgICJjYW5ub3QgcmV2ZXJ0IGNvZGVjXG4iKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC00Mjk0LDcgKzQzMzMsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlzbmRfcHJpbnRkZCgiaW52YWxpZCBmb3JtYXQgd2lkdGggJWRcbiIsCi0JCQkgICAgc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KSk7CisJCQkgIHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCkpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQzNzAsMTAgKzQ0MDksMTAgQEAKIAkJCQlyYXRlcyB8PSByYXRlX2JpdHNbaV0uYWxzYV9iaXRzOwogCQl9CiAJCWlmIChyYXRlcyA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IHJhdGVzID09IDAgIgotCQkJCSAgICIobmlkPTB4JXgsIHZhbD0weCV4LCBvdnJkPSVpKVxuIiwKLQkJCQkJbmlkLCB2YWwsCi0JCQkJCSh3Y2FwcyAmIEFDX1dDQVBfRk9STUFUX09WUkQpID8gMSA6IDApOworCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCSAgInJhdGVzID09IDAgKG5pZD0weCV4LCB2YWw9MHgleCwgb3ZyZD0laSlcbiIsCisJCQkJICBuaWQsIHZhbCwKKwkJCQkgICh3Y2FwcyAmIEFDX1dDQVBfRk9STUFUX09WUkQpID8gMSA6IDApOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJKnJhdGVzcCA9IHJhdGVzOwpAQCAtNDQzMywxMiArNDQ3MiwxMSBAQAogCQkJYnBzID0gODsKIAkJfQogCQlpZiAoZm9ybWF0cyA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IGZvcm1hdHMgPT0gMCAiCi0JCQkJICAgIihuaWQ9MHgleCwgdmFsPTB4JXgsIG92cmQ9JWksICIKLQkJCQkgICAic3RyZWFtcz0weCV4KVxuIiwKLQkJCQkJbmlkLCB2YWwsCi0JCQkJCSh3Y2FwcyAmIEFDX1dDQVBfRk9STUFUX09WUkQpID8gMSA6IDAsCi0JCQkJCXN0cmVhbXMpOworCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCSAgImZvcm1hdHMgPT0gMCAobmlkPTB4JXgsIHZhbD0weCV4LCBvdnJkPSVpLCBzdHJlYW1zPTB4JXgpXG4iLAorCQkJCSAgbmlkLCB2YWwsCisJCQkJICAod2NhcHMgJiBBQ19XQ0FQX0ZPUk1BVF9PVlJEKSA/IDEgOiAwLAorCQkJCSAgc3RyZWFtcyk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoZm9ybWF0c3ApCkBAIC00NjI5LDcgKzQ2NjcsNyBAQAogCWludCBpOwogCiAJaWYgKHR5cGUgPj0gSERBX1BDTV9OVFlQRVMpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgUENNIHR5cGUgJWRcbiIsIHR5cGUpOworCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LCAiSW52YWxpZCBQQ00gdHlwZSAlZFxuIiwgdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDY1MCwxMCArNDY4OCwxMSBAQAogCX0KICNlbmRpZgogCi0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIlRvbyBtYW55ICVzIGRldmljZXNcbiIsCisJZGV2X3dhcm4oYnVzLT5jYXJkLT5kZXYsICJUb28gbWFueSAlcyBkZXZpY2VzXG4iLAogCQlzbmRfaGRhX3BjbV90eXBlX25hbWVbdHlwZV0pOwogI2lmbmRlZiBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTCi0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkNvbnNpZGVyIGJ1aWxkaW5nIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXlcbiIpOworCWRldl93YXJuKGJ1cy0+Y2FyZC0+ZGV2LAorCQkgIkNvbnNpZGVyIGJ1aWxkaW5nIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXlcbiIpOwogI2VuZGlmCiAJcmV0dXJuIC1FQUdBSU47CiB9CkBAIC00NjkxLDEyICs0NzMwLDEzIEBACiAJCQlyZXR1cm4gMDsKIAkJZXJyID0gY29kZWMtPnBhdGNoX29wcy5idWlsZF9wY21zKGNvZGVjKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgYnVpbGQgUENNcyIKLQkJCSAgICAgICAiZm9yICMlZCAoZXJyb3IgJWQpXG4iLCBjb2RlYy0+YWRkciwgZXJyKTsKKwkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkgICJjYW5ub3QgYnVpbGQgUENNcyBmb3IgIyVkIChlcnJvciAlZClcbiIsCisJCQkJICBjb2RlYy0+YWRkciwgZXJyKTsKIAkJCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImhkYV9jb2RlYzogY2Fubm90IHJldmVydCBjb2RlY1xuIik7CisJCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCQkgICJjYW5ub3QgcmV2ZXJ0IGNvZGVjXG4iKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC00NzE1LDkgKzQ3NTUsOSBAQAogCQkJY3BjbS0+ZGV2aWNlID0gZGV2OwogCQkJZXJyID0gc25kX2hkYV9hdHRhY2hfcGNtKGNvZGVjLCBjcGNtKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IGNhbm5vdCBhdHRhY2ggIgotCQkJCSAgICAgICAiUENNIHN0cmVhbSAlZCBmb3IgY29kZWMgIyVkXG4iLAotCQkJCSAgICAgICBkZXYsIGNvZGVjLT5hZGRyKTsKKwkJCQljb2RlY19lcnIoY29kZWMsCisJCQkJCSAgImNhbm5vdCBhdHRhY2ggUENNIHN0cmVhbSAlZCBmb3IgY29kZWMgIyVkXG4iLAorCQkJCQkgIGRldiwgY29kZWMtPmFkZHIpOwogCQkJCWNvbnRpbnVlOyAvKiBubyBmYXRhbCBlcnJvciAqLwogCQkJfQogCQl9CkBAIC00Nzg2LDggKzQ4MjYsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgewogCQkJaWYgKG1vZGVsc1tpXSAmJgogCQkJICAgICFzdHJjbXAoY29kZWMtPm1vZGVsbmFtZSwgbW9kZWxzW2ldKSkgewotCQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IG1vZGVsICclcycgaXMgIgotCQkJCQkgICAic2VsZWN0ZWRcbiIsIG1vZGVsc1tpXSk7CisJCQkJY29kZWNfaW5mbyhjb2RlYywgIm1vZGVsICclcycgaXMgc2VsZWN0ZWRcbiIsCisJCQkJCSAgIG1vZGVsc1tpXSk7CiAJCQkJcmV0dXJuIGk7CiAJCQl9CiAJCX0KQEAgLTQ4MDksMTAgKzQ4NDksOSBAQAogCQkJc3ByaW50Zih0bXAsICIjJWQiLCB0YmwtPnZhbHVlKTsKIAkJCW1vZGVsID0gdG1wOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkICIKLQkJCSAgICAiZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAotCQkJICAgIG1vZGVsLCB0YmwtPnN1YnZlbmRvciwgdGJsLT5zdWJkZXZpY2UsCi0JCQkgICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIm1vZGVsICclcycgaXMgc2VsZWN0ZWQgZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAorCQkJICAgbW9kZWwsIHRibC0+c3VidmVuZG9yLCB0YmwtPnN1YmRldmljZSwKKwkJCSAgICh0YmwtPm5hbWUgPyB0YmwtPm5hbWUgOiAiVW5rbm93biBkZXZpY2UiKSk7CiAjZW5kaWYKIAkJcmV0dXJuIHRibC0+dmFsdWU7CiAJfQpAQCAtNDg3MCwxMCArNDkwOSw5IEBACiAJCQlzcHJpbnRmKHRtcCwgIiMlZCIsIHRibC0+dmFsdWUpOwogCQkJbW9kZWwgPSB0bXA7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IG1vZGVsICclcycgaXMgc2VsZWN0ZWQgIgotCQkJICAgICJmb3IgY29uZmlnICV4OiV4ICglcylcbiIsCi0JCQkgICAgbW9kZWwsIHRibC0+c3VidmVuZG9yLCB0YmwtPnN1YmRldmljZSwKLQkJCSAgICAodGJsLT5uYW1lID8gdGJsLT5uYW1lIDogIlVua25vd24gZGV2aWNlIikpOworCQljb2RlY19pbmZvKGNvZGVjLCAibW9kZWwgJyVzJyBpcyBzZWxlY3RlZCBmb3IgY29uZmlnICV4OiV4ICglcylcbiIsCisJCQkgICBtb2RlbCwgdGJsLT5zdWJ2ZW5kb3IsIHRibC0+c3ViZGV2aWNlLAorCQkJICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKICNlbmRpZgogCQlyZXR1cm4gdGJsLT52YWx1ZTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAppbmRleCBhYjJhNDQ0Li5hNDIzMzEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKQEAgLTI3MSw2ICsyNzEsNyBAQAogCiAvKiBjb2RlYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IGhkYV9jb2RlYyB7CisJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IGhkYV9idXMgKmJ1czsKIAl1bnNpZ25lZCBpbnQgYWRkcjsJLyogY29kZWMgYWRkciovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBsaXN0IHBvaW50ICovCkBAIC0zMzIsMTQgKzMzMywxNyBAQAogCXN0cnVjdCBzbmRfYXJyYXkgZHJpdmVyX3BpbnM7CS8qIHBpbiBjb25maWdzIHNldCBieSBjb2RlYyBwYXJzZXIgKi8KIAlzdHJ1Y3Qgc25kX2FycmF5IGN2dF9zZXR1cHM7CS8qIGF1ZGlvIGNvbnZlcnQgc2V0dXBzICovCiAKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAogCXN0cnVjdCBtdXRleCB1c2VyX211dGV4OwotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwkvKiBhc3NpZ25lZCBod2RlcCBkZXZpY2UgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwogCXN0cnVjdCBzbmRfYXJyYXkgaW5pdF92ZXJiczsJLyogYWRkaXRpb25hbCBpbml0IHZlcmJzICovCiAJc3RydWN0IHNuZF9hcnJheSBoaW50czsJCS8qIGFkZGl0aW9uYWwgaGludHMgKi8KIAlzdHJ1Y3Qgc25kX2FycmF5IHVzZXJfcGluczsJLyogZGVmYXVsdCBwaW4gY29uZmlncyB0byBvdmVycmlkZSAqLwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAorCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwkvKiBhc3NpZ25lZCBod2RlcCBkZXZpY2UgKi8KKyNlbmRpZgorCiAJLyogbWlzYyBmbGFncyAqLwogCXVuc2lnbmVkIGludCBzcGRpZl9zdGF0dXNfcmVzZXQgOjE7IC8qIG5lZWRzIHRvIHRvZ2dsZSBTUERJRiBmb3IgZWFjaAogCQkJCQkgICAgICogc3RhdHVzIGNoYW5nZQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTkzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMKQEAgLTAsMCArMSwyMDMxIEBACisvKgorICoKKyAqICBJbXBsZW1lbnRhdGlvbiBvZiBwcmltYXJ5IGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSW50ZWwgSEQgQXVkaW8uCisgKgorICogIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogICAgICAgICAgICAgICAgICAgICBQZWlTZW4gSG91IDxwc2hvdUByZWFsdGVrLmNvbS50dz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImhkYV9wcml2LmgiCisjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAiaGRhX2ludGVsX3RyYWNlLmgiCisKKy8qIERTUCBsb2NrIGhlbHBlcnMgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCisjZGVmaW5lIGRzcF9sb2NrX2luaXQoZGV2KQltdXRleF9pbml0KCYoZGV2KS0+ZHNwX211dGV4KQorI2RlZmluZSBkc3BfbG9jayhkZXYpCQltdXRleF9sb2NrKCYoZGV2KS0+ZHNwX211dGV4KQorI2RlZmluZSBkc3BfdW5sb2NrKGRldikJCW11dGV4X3VubG9jaygmKGRldiktPmRzcF9tdXRleCkKKyNkZWZpbmUgZHNwX2lzX2xvY2tlZChkZXYpCSgoZGV2KS0+bG9ja2VkKQorI2Vsc2UKKyNkZWZpbmUgZHNwX2xvY2tfaW5pdChkZXYpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkc3BfbG9jayhkZXYpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHNwX3VubG9jayhkZXYpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHNwX2lzX2xvY2tlZChkZXYpCTAKKyNlbmRpZgorCisvKgorICogQVpYIHN0cmVhbSBvcGVyYXRpb25zLgorICovCisKKy8qIHN0YXJ0IGEgc3RyZWFtICovCitzdGF0aWMgdm9pZCBhenhfc3RyZWFtX3N0YXJ0KHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCS8qCisJICogQmVmb3JlIHN0cmVhbSBzdGFydCwgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIKKwkgKi8KKwlhenhfZGV2LT5pbnN1ZmZpY2llbnQgPSAxOworCisJLyogZW5hYmxlIFNJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLAorCQkgICBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSB8ICgxIDw8IGF6eF9kZXYtPmluZGV4KSk7CisJLyogc2V0IERNQSBzdGFydCBhbmQgaW50ZXJydXB0IG1hc2sgKi8KKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwKKwkJICAgICAgYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgfAorCQkgICAgICBTRF9DVExfRE1BX1NUQVJUIHwgU0RfSU5UX01BU0spOworfQorCisvKiBzdG9wIERNQSAqLworc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9jbGVhcihzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwKKwkJICAgICAgYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgJgorCQkgICAgICB+KFNEX0NUTF9ETUFfU1RBUlQgfCBTRF9JTlRfTUFTSykpOworCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7IC8qIHRvIGJlIHN1cmUgKi8KK30KKworLyogc3RvcCBhIHN0cmVhbSAqLwordm9pZCBhenhfc3RyZWFtX3N0b3Aoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCit7CisJYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKKwkvKiBkaXNhYmxlIFNJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLAorCQkgICBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSAmIH4oMSA8PCBhenhfZGV2LT5pbmRleCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X3N0cmVhbV9zdG9wKTsKKworLyogcmVzZXQgc3RyZWFtICovCitzdGF0aWMgdm9pZCBhenhfc3RyZWFtX3Jlc2V0KHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCB0aW1lb3V0OworCisJYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKKworCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLAorCQkgICAgICBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSB8CisJCSAgICAgIFNEX0NUTF9TVFJFQU1fUkVTRVQpOworCXVkZWxheSgzKTsKKwl0aW1lb3V0ID0gMzAwOworCXdoaWxlICghKCh2YWwgPSBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSkgJgorCQkgU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYgLS10aW1lb3V0KQorCQk7CisJdmFsICY9IH5TRF9DVExfU1RSRUFNX1JFU0VUOworCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLCB2YWwpOworCXVkZWxheSgzKTsKKworCXRpbWVvdXQgPSAzMDA7CisJLyogd2FpdGluZyBmb3IgaGFyZHdhcmUgdG8gcmVwb3J0IHRoYXQgdGhlIHN0cmVhbSBpcyBvdXQgb2YgcmVzZXQgKi8KKwl3aGlsZSAoKCh2YWwgPSBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSkgJgorCQlTRF9DVExfU1RSRUFNX1JFU0VUKSAmJiAtLXRpbWVvdXQpCisJCTsKKworCS8qIHJlc2V0IGZpcnN0IHBvc2l0aW9uIC0gbWF5IG5vdCBiZSBzeW5jZWQgd2l0aCBodyBhdCB0aGlzIHRpbWUgKi8KKwkqYXp4X2Rldi0+cG9zYnVmID0gMDsKK30KKworLyoKKyAqIHNldCB1cCB0aGUgU0QgZm9yIHN0cmVhbWluZworICovCitzdGF0aWMgaW50IGF6eF9zZXR1cF9jb250cm9sbGVyKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJLyogbWFrZSBzdXJlIHRoZSBydW4gYml0IGlzIHplcm8gZm9yIFNEICovCisJYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKKwkvKiBwcm9ncmFtIHRoZSBzdHJlYW1fdGFnICovCisJdmFsID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCk7CisJdmFsID0gKHZhbCAmIH5TRF9DVExfU1RSRUFNX1RBR19NQVNLKSB8CisJCShhenhfZGV2LT5zdHJlYW1fdGFnIDw8IFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUKTsKKwlpZiAoIWF6eF9zbm9vcChjaGlwKSkKKwkJdmFsIHw9IFNEX0NUTF9UUkFGRklDX1BSSU87CisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DVEwsIHZhbCk7CisKKwkvKiBwcm9ncmFtIHRoZSBsZW5ndGggb2Ygc2FtcGxlcyBpbiBjeWNsaWMgYnVmZmVyICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DQkwsIGF6eF9kZXYtPmJ1ZnNpemUpOworCisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtIGZvcm1hdCAqLworCS8qIHRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwcm9ncmFtbWVkICovCisJYXp4X3NkX3dyaXRldyhjaGlwLCBhenhfZGV2LCBTRF9GT1JNQVQsIGF6eF9kZXYtPmZvcm1hdF92YWwpOworCisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtIExWSSAobGFzdCB2YWxpZCBpbmRleCkgb2YgdGhlIEJETCAqLworCWF6eF9zZF93cml0ZXcoY2hpcCwgYXp4X2RldiwgU0RfTFZJLCBhenhfZGV2LT5mcmFncyAtIDEpOworCisJLyogcHJvZ3JhbSB0aGUgQkRMIGFkZHJlc3MgKi8KKwkvKiBsb3dlciBCREwgYWRkcmVzcyAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUEwsICh1MzIpYXp4X2Rldi0+YmRsLmFkZHIpOworCS8qIHVwcGVyIEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQVSwKKwkJICAgICAgdXBwZXJfMzJfYml0cyhhenhfZGV2LT5iZGwuYWRkcikpOworCisJLyogZW5hYmxlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwlpZiAoY2hpcC0+cG9zaXRpb25fZml4WzBdICE9IFBPU19GSVhfTFBJQiB8fAorCSAgICBjaGlwLT5wb3NpdGlvbl9maXhbMV0gIT0gUE9TX0ZJWF9MUElCKSB7CisJCWlmICghKGF6eF9yZWFkbChjaGlwLCBEUExCQVNFKSAmIElDSDZfRFBMQkFTRV9FTkFCTEUpKQorCQkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLAorCQkJCSh1MzIpY2hpcC0+cG9zYnVmLmFkZHIgfCBJQ0g2X0RQTEJBU0VfRU5BQkxFKTsKKwl9CisKKwkvKiBzZXQgdGhlIGludGVycnVwdCBlbmFibGUgYml0cyBpbiB0aGUgZGVzY3JpcHRvciBjb250cm9sIHJlZ2lzdGVyICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DVEwsCisJCSAgICAgIGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9DVEwpIHwgU0RfSU5UX01BU0spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGFzc2lnbiBhIHN0cmVhbSBmb3IgdGhlIFBDTSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqCithenhfYXNzaWduX2RldmljZShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgZGV2LCBpLCBudW1zOworCXN0cnVjdCBhenhfZGV2ICpyZXMgPSBOVUxMOworCS8qIG1ha2UgYSBub24temVybyB1bmlxdWUga2V5IGZvciB0aGUgc3Vic3RyZWFtICovCisJaW50IGtleSA9IChzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlIDw8IDE2KSB8IChzdWJzdHJlYW0tPm51bWJlciA8PCAyKSB8CisJCShzdWJzdHJlYW0tPnN0cmVhbSArIDEpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJZGV2ID0gY2hpcC0+cGxheWJhY2tfaW5kZXhfb2Zmc2V0OworCQludW1zID0gY2hpcC0+cGxheWJhY2tfc3RyZWFtczsKKwl9IGVsc2UgeworCQlkZXYgPSBjaGlwLT5jYXB0dXJlX2luZGV4X29mZnNldDsKKwkJbnVtcyA9IGNoaXAtPmNhcHR1cmVfc3RyZWFtczsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKywgZGV2KyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltkZXZdOworCQlkc3BfbG9jayhhenhfZGV2KTsKKwkJaWYgKCFhenhfZGV2LT5vcGVuZWQgJiYgIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKKwkJCXJlcyA9IGF6eF9kZXY7CisJCQlpZiAocmVzLT5hc3NpZ25lZF9rZXkgPT0ga2V5KSB7CisJCQkJcmVzLT5vcGVuZWQgPSAxOworCQkJCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OworCQkJCWRzcF91bmxvY2soYXp4X2Rldik7CisJCQkJcmV0dXJuIGF6eF9kZXY7CisJCQl9CisJCX0KKwkJZHNwX3VubG9jayhhenhfZGV2KTsKKwl9CisJaWYgKHJlcykgeworCQlkc3BfbG9jayhyZXMpOworCQlyZXMtPm9wZW5lZCA9IDE7CisJCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OworCQlkc3BfdW5sb2NrKHJlcyk7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qIHJlbGVhc2UgdGhlIGFzc2lnbmVkIHN0cmVhbSAqLworc3RhdGljIGlubGluZSB2b2lkIGF6eF9yZWxlYXNlX2RldmljZShzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwlhenhfZGV2LT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgY3ljbGVfdCBhenhfY2NfcmVhZChjb25zdCBzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYykKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGNvbnRhaW5lcl9vZihjYywgc3RydWN0IGF6eF9kZXYsIGF6eF9jYyk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisKKwlyZXR1cm4gYXp4X3JlYWRsKGNoaXAsIFdBTExDTEspOworfQorCitzdGF0aWMgdm9pZCBhenhfdGltZWNvdW50ZXJfaW5pdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlib29sIGZvcmNlLCBjeWNsZV90IGxhc3QpCit7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCB0aW1lY291bnRlciAqdGMgPSAmYXp4X2Rldi0+YXp4X3RjOworCXN0cnVjdCBjeWNsZWNvdW50ZXIgKmNjID0gJmF6eF9kZXYtPmF6eF9jYzsKKwl1NjQgbnNlYzsKKworCWNjLT5yZWFkID0gYXp4X2NjX3JlYWQ7CisJY2MtPm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKKworCS8qCisJICogQ29udmVydGluZyBmcm9tIDI0IE1IeiB0byBucyBtZWFucyBhcHBseWluZyBhIDEyNS8zIGZhY3Rvci4KKwkgKiBUbyBhdm9pZCBhbnkgc2F0dXJhdGlvbiBpc3N1ZXMgaW4gaW50ZXJtZWRpYXRlIG9wZXJhdGlvbnMsCisJICogdGhlIDEyNSBmYWN0b3IgaXMgYXBwbGllZCBmaXJzdC4gVGhlIGRpdmlzaW9uIGlzIGFwcGxpZWQKKwkgKiBsYXN0IGFmdGVyIHJlYWRpbmcgdGhlIHRpbWVjb3VudGVyIHZhbHVlLgorCSAqIEFwcGx5aW5nIHRoZSAxLzMgZmFjdG9yIGFzIHBhcnQgb2YgdGhlIG11bHRpcGxpY2F0aW9uCisJICogcmVxdWlyZXMgYXQgbGVhc3QgMjAgYml0cyBmb3IgYSBkZWNlbnQgcHJlY2lzaW9uLCBob3dldmVyCisJICogb3ZlcmZsb3dzIG9jY3VyIGFmdGVyIGFib3V0IDQgaG91cnMgb3IgbGVzcywgbm90IGEgb3B0aW9uLgorCSAqLworCisJY2MtPm11bHQgPSAxMjU7IC8qIHNhdHVyYXRpb24gYWZ0ZXIgMTk1IHllYXJzICovCisJY2MtPnNoaWZ0ID0gMDsKKworCW5zZWMgPSAwOyAvKiBhdWRpbyB0aW1lIGlzIGVsYXBzZWQgdGltZSBzaW5jZSB0cmlnZ2VyICovCisJdGltZWNvdW50ZXJfaW5pdCh0YywgY2MsIG5zZWMpOworCWlmIChmb3JjZSkKKwkJLyoKKwkJICogZm9yY2UgdGltZWNvdW50ZXIgdG8gdXNlIHByZWRlZmluZWQgdmFsdWUsCisJCSAqIHVzZWQgZm9yIHN5bmNocm9uaXplZCBzdGFydHMKKwkJICovCisJCXRjLT5jeWNsZV9sYXN0ID0gbGFzdDsKK30KKworc3RhdGljIHU2NCBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXU2NCBuc2VjKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJdTY0IGNvZGVjX2ZyYW1lcywgY29kZWNfbnNlY3M7CisKKwlpZiAoIWhpbmZvLT5vcHMuZ2V0X2RlbGF5KQorCQlyZXR1cm4gbnNlYzsKKworCWNvZGVjX2ZyYW1lcyA9IGhpbmZvLT5vcHMuZ2V0X2RlbGF5KGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwljb2RlY19uc2VjcyA9IGRpdl91NjQoY29kZWNfZnJhbWVzICogMTAwMDAwMDAwMExMLAorCQkJICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJldHVybiBuc2VjICsgY29kZWNfbnNlY3M7CisKKwlyZXR1cm4gKG5zZWMgPiBjb2RlY19uc2VjcykgPyBuc2VjIC0gY29kZWNfbnNlY3MgOiAwOworfQorCisvKgorICogc2V0IHVwIGEgQkRMIGVudHJ5CisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfYmRsZShzdHJ1Y3QgYXp4ICpjaGlwLAorCQkgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsCisJCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LCB1MzIgKipiZGxwLAorCQkgICAgICBpbnQgb2ZzLCBpbnQgc2l6ZSwgaW50IHdpdGhfaW9jKQoreworCXUzMiAqYmRsID0gKmJkbHA7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlpbnQgY2h1bms7CisKKwkJaWYgKGF6eF9kZXYtPmZyYWdzID49IEFaWF9NQVhfQkRMX0VOVFJJRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlhZGRyID0gc25kX3NnYnVmX2dldF9hZGRyKGRtYWIsIG9mcyk7CisJCS8qIHByb2dyYW0gdGhlIGFkZHJlc3MgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLworCQliZGxbMF0gPSBjcHVfdG9fbGUzMigodTMyKWFkZHIpOworCQliZGxbMV0gPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGFkZHIpKTsKKwkJLyogcHJvZ3JhbSB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgQkRMIGVudHJ5ICovCisJCWNodW5rID0gc25kX3NnYnVmX2dldF9jaHVua19zaXplKGRtYWIsIG9mcywgc2l6ZSk7CisJCS8qIG9uZSBCRExFIGNhbm5vdCBjcm9zcyA0SyBib3VuZGFyeSBvbiBDVEhEQSBjaGlwcyAqLworCQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfNEtfQkRMRV9CT1VOREFSWSkgeworCQkJdTMyIHJlbWFpbiA9IDB4MTAwMCAtIChvZnMgJiAweGZmZik7CisJCQlpZiAoY2h1bmsgPiByZW1haW4pCisJCQkJY2h1bmsgPSByZW1haW47CisJCX0KKwkJYmRsWzJdID0gY3B1X3RvX2xlMzIoY2h1bmspOworCQkvKiBwcm9ncmFtIHRoZSBJT0MgdG8gZW5hYmxlIGludGVycnVwdAorCQkgKiBvbmx5IHdoZW4gdGhlIHdob2xlIGZyYWdtZW50IGlzIHByb2Nlc3NlZAorCQkgKi8KKwkJc2l6ZSAtPSBjaHVuazsKKwkJYmRsWzNdID0gKHNpemUgfHwgIXdpdGhfaW9jKSA/IDAgOiBjcHVfdG9fbGUzMigweDAxKTsKKwkJYmRsICs9IDQ7CisJCWF6eF9kZXYtPmZyYWdzKys7CisJCW9mcyArPSBjaHVuazsKKwl9CisJKmJkbHAgPSBiZGw7CisJcmV0dXJuIG9mczsKK30KKworLyoKKyAqIHNldCB1cCBCREwgZW50cmllcworICovCitzdGF0aWMgaW50IGF6eF9zZXR1cF9wZXJpb2RzKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwl1MzIgKmJkbDsKKwlpbnQgaSwgb2ZzLCBwZXJpb2RzLCBwZXJpb2RfYnl0ZXM7CisJaW50IHBvc19hZGogPSAwOworCisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKKworCXBlcmlvZF9ieXRlcyA9IGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwlwZXJpb2RzID0gYXp4X2Rldi0+YnVmc2l6ZSAvIHBlcmlvZF9ieXRlczsKKworCS8qIHByb2dyYW0gdGhlIGluaXRpYWwgQkRMIGVudHJpZXMgKi8KKwliZGwgPSAodTMyICopYXp4X2Rldi0+YmRsLmFyZWE7CisJb2ZzID0gMDsKKwlhenhfZGV2LT5mcmFncyA9IDA7CisKKwlpZiAoY2hpcC0+YmRsX3Bvc19hZGopCisJCXBvc19hZGogPSBjaGlwLT5iZGxfcG9zX2FkaltjaGlwLT5kZXZfaW5kZXhdOworCWlmICghYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCAmJiBwb3NfYWRqID4gMCkgeworCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCQlpbnQgcG9zX2FsaWduID0gcG9zX2FkajsKKwkJcG9zX2FkaiA9IChwb3NfYWRqICogcnVudGltZS0+cmF0ZSArIDQ3OTk5KSAvIDQ4MDAwOworCQlpZiAoIXBvc19hZGopCisJCQlwb3NfYWRqID0gcG9zX2FsaWduOworCQllbHNlCisJCQlwb3NfYWRqID0gKChwb3NfYWRqICsgcG9zX2FsaWduIC0gMSkgLyBwb3NfYWxpZ24pICoKKwkJCQlwb3NfYWxpZ247CisJCXBvc19hZGogPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcG9zX2Fkaik7CisJCWlmIChwb3NfYWRqID49IHBlcmlvZF9ieXRlcykgeworCQkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCJUb28gYmlnIGFkanVzdG1lbnQgJWRcbiIsCisJCQkJIHBvc19hZGopOworCQkJcG9zX2FkaiA9IDA7CisJCX0gZWxzZSB7CisJCQlvZnMgPSBzZXR1cF9iZGxlKGNoaXAsIHNuZF9wY21fZ2V0X2RtYV9idWYoc3Vic3RyZWFtKSwKKwkJCQkJIGF6eF9kZXYsCisJCQkJCSAmYmRsLCBvZnMsIHBvc19hZGosIHRydWUpOworCQkJaWYgKG9mcyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0gZWxzZQorCQlwb3NfYWRqID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJpb2RzOyBpKyspIHsKKwkJaWYgKGkgPT0gcGVyaW9kcyAtIDEgJiYgcG9zX2FkaikKKwkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAorCQkJCQkgYXp4X2RldiwgJmJkbCwgb2ZzLAorCQkJCQkgcGVyaW9kX2J5dGVzIC0gcG9zX2FkaiwgMCk7CisJCWVsc2UKKwkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAorCQkJCQkgYXp4X2RldiwgJmJkbCwgb2ZzLAorCQkJCQkgcGVyaW9kX2J5dGVzLAorCQkJCQkgIWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXApOworCQlpZiAob2ZzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCXJldHVybiAwOworCisgZXJyb3I6CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJUb28gbWFueSBCREwgZW50cmllczogYnVmZmVyPSVkLCBwZXJpb2Q9JWRcbiIsCisJCWF6eF9kZXYtPmJ1ZnNpemUsIHBlcmlvZF9ieXRlcyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBQQ00gb3BzCisgKi8KKworc3RhdGljIGludCBhenhfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlhenhfZGV2LT5zdWJzdHJlYW0gPSBOVUxMOworCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOworCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOworCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhenhfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJaW50IHJldDsKKworCWRzcF9sb2NrKGdldF9henhfZGV2KHN1YnN0cmVhbSkpOworCWlmIChkc3BfaXNfbG9ja2VkKGdldF9henhfZGV2KHN1YnN0cmVhbSkpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcmV0ID0gY2hpcC0+b3BzLT5zdWJzdHJlYW1fYWxsb2NfcGFnZXMoY2hpcCwgc3Vic3RyZWFtLAorCQkJCQkgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit1bmxvY2s6CisJZHNwX3VubG9jayhnZXRfYXp4X2RldihzdWJzdHJlYW0pKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF6eF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlpbnQgZXJyOworCisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlkc3BfbG9jayhhenhfZGV2KTsKKwlpZiAoIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKKwkJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQTCwgMCk7CisJCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUFUsIDApOworCQlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwgMCk7CisJCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOworCQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOworCQlhenhfZGV2LT5mb3JtYXRfdmFsID0gMDsKKwl9CisKKwlzbmRfaGRhX2NvZGVjX2NsZWFudXAoYXBjbS0+Y29kZWMsIGhpbmZvLCBzdWJzdHJlYW0pOworCisJZXJyID0gY2hpcC0+b3BzLT5zdWJzdHJlYW1fZnJlZV9wYWdlcyhjaGlwLCBzdWJzdHJlYW0pOworCWF6eF9kZXYtPnByZXBhcmVkID0gMDsKKwlkc3BfdW5sb2NrKGF6eF9kZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IGJ1ZnNpemUsIHBlcmlvZF9ieXRlcywgZm9ybWF0X3ZhbCwgc3RyZWFtX3RhZzsKKwlpbnQgZXJyOworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9CisJCXNuZF9oZGFfc3BkaWZfb3V0X29mX25pZChhcGNtLT5jb2RlYywgaGluZm8tPm5pZCk7CisJdW5zaWduZWQgc2hvcnQgY3RscyA9IHNwZGlmID8gc3BkaWYtPmN0bHMgOiAwOworCisJZHNwX2xvY2soYXp4X2Rldik7CisJaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlhenhfc3RyZWFtX3Jlc2V0KGNoaXAsIGF6eF9kZXYpOworCWZvcm1hdF92YWwgPSBzbmRfaGRhX2NhbGNfc3RyZWFtX2Zvcm1hdChydW50aW1lLT5yYXRlLAorCQkJCQkJcnVudGltZS0+Y2hhbm5lbHMsCisJCQkJCQlydW50aW1lLT5mb3JtYXQsCisJCQkJCQloaW5mby0+bWF4YnBzLAorCQkJCQkJY3Rscyk7CisJaWYgKCFmb3JtYXRfdmFsKSB7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImludmFsaWQgZm9ybWF0X3ZhbCwgcmF0ZT0lZCwgY2g9JWQsIGZvcm1hdD0lZFxuIiwKKwkJCXJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5mb3JtYXQpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlidWZzaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJcGVyaW9kX2J5dGVzID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImF6eF9wY21fcHJlcGFyZTogYnVmc2l6ZT0weCV4LCBmb3JtYXQ9MHgleFxuIiwKKwkJYnVmc2l6ZSwgZm9ybWF0X3ZhbCk7CisKKwlpZiAoYnVmc2l6ZSAhPSBhenhfZGV2LT5idWZzaXplIHx8CisJICAgIHBlcmlvZF9ieXRlcyAhPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgfHwKKwkgICAgZm9ybWF0X3ZhbCAhPSBhenhfZGV2LT5mb3JtYXRfdmFsIHx8CisJICAgIHJ1bnRpbWUtPm5vX3BlcmlvZF93YWtldXAgIT0gYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCkgeworCQlhenhfZGV2LT5idWZzaXplID0gYnVmc2l6ZTsKKwkJYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gcGVyaW9kX2J5dGVzOworCQlhenhfZGV2LT5mb3JtYXRfdmFsID0gZm9ybWF0X3ZhbDsKKwkJYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCA9IHJ1bnRpbWUtPm5vX3BlcmlvZF93YWtldXA7CisJCWVyciA9IGF6eF9zZXR1cF9wZXJpb2RzKGNoaXAsIHN1YnN0cmVhbSwgYXp4X2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byB1bmxvY2s7CisJfQorCisJLyogd2hlbiBMUElCIGRlbGF5IGNvcnJlY3Rpb24gZ2l2ZXMgYSBzbWFsbCBuZWdhdGl2ZSB2YWx1ZSwKKwkgKiB3ZSBpZ25vcmUgaXQ7IGN1cnJlbnRseSBzZXQgdGhlIHRocmVzaG9sZCBzdGF0aWNhbGx5IHRvCisJICogNjQgZnJhbWVzCisJICovCisJaWYgKHJ1bnRpbWUtPnBlcmlvZF9zaXplID4gNjQpCisJCWF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCA9IC1mcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgNjQpOworCWVsc2UKKwkJYXp4X2Rldi0+ZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkID0gMDsKKworCS8qIHdhbGxjbGsgaGFzIDI0TWh6IGNsb2NrIHNvdXJjZSAqLworCWF6eF9kZXYtPnBlcmlvZF93YWxsY2xrID0gKCgocnVudGltZS0+cGVyaW9kX3NpemUgKiAyNDAwMCkgLworCQkJCQkJcnVudGltZS0+cmF0ZSkgKiAxMDAwKTsKKwlhenhfc2V0dXBfY29udHJvbGxlcihjaGlwLCBhenhfZGV2KTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJYXp4X2Rldi0+Zmlmb19zaXplID0KKwkJCWF6eF9zZF9yZWFkdyhjaGlwLCBhenhfZGV2LCBTRF9GSUZPU0laRSkgKyAxOworCWVsc2UKKwkJYXp4X2Rldi0+Zmlmb19zaXplID0gMDsKKworCXN0cmVhbV90YWcgPSBhenhfZGV2LT5zdHJlYW1fdGFnOworCS8qIENBLUlCRyBjaGlwcyBuZWVkIHRoZSBwbGF5YmFjayBzdHJlYW0gc3RhcnRpbmcgZnJvbSAxICovCisJaWYgKChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCkgJiYKKwkgICAgc3RyZWFtX3RhZyA+IGNoaXAtPmNhcHR1cmVfc3RyZWFtcykKKwkJc3RyZWFtX3RhZyAtPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7CisJZXJyID0gc25kX2hkYV9jb2RlY19wcmVwYXJlKGFwY20tPmNvZGVjLCBoaW5mbywgc3RyZWFtX3RhZywKKwkJCQkgICAgIGF6eF9kZXYtPmZvcm1hdF92YWwsIHN1YnN0cmVhbSk7CisKKyB1bmxvY2s6CisJaWYgKCFlcnIpCisJCWF6eF9kZXYtPnByZXBhcmVkID0gMTsKKwlkc3BfdW5sb2NrKGF6eF9kZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKKwlpbnQgcnN0YXJ0ID0gMCwgc3RhcnQsIG5zeW5jID0gMCwgc2JpdHMgPSAwOworCWludCBud2FpdCwgdGltZW91dDsKKworCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXRyYWNlX2F6eF9wY21fdHJpZ2dlcihjaGlwLCBhenhfZGV2LCBjbWQpOworCisJaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikgfHwgIWF6eF9kZXYtPnByZXBhcmVkKQorCQlyZXR1cm4gLUVQSVBFOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlyc3RhcnQgPSAxOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJc3RhcnQgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJc3RhcnQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgeworCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQorCQkJY29udGludWU7CisJCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKKwkJc2JpdHMgfD0gMSA8PCBhenhfZGV2LT5pbmRleDsKKwkJbnN5bmMrKzsKKwkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwl9CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCS8qIGZpcnN0LCBzZXQgU1lOQyBiaXRzIG9mIGNvcnJlc3BvbmRpbmcgc3RyZWFtcyAqLworCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19PTERfU1NZTkMpCisJCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAorCQkJYXp4X3JlYWRsKGNoaXAsIE9MRF9TU1lOQykgfCBzYml0cyk7CisJZWxzZQorCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpIHwgc2JpdHMpOworCisJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKKwkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCWNvbnRpbnVlOworCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYocyk7CisJCWlmIChzdGFydCkgeworCQkJYXp4X2Rldi0+c3RhcnRfd2FsbGNsayA9IGF6eF9yZWFkbChjaGlwLCBXQUxMQ0xLKTsKKwkJCWlmICghcnN0YXJ0KQorCQkJCWF6eF9kZXYtPnN0YXJ0X3dhbGxjbGsgLT0KKwkJCQkJCWF6eF9kZXYtPnBlcmlvZF93YWxsY2xrOworCQkJYXp4X3N0cmVhbV9zdGFydChjaGlwLCBhenhfZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWF6eF9zdHJlYW1fc3RvcChjaGlwLCBhenhfZGV2KTsKKwkJfQorCQlhenhfZGV2LT5ydW5uaW5nID0gc3RhcnQ7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKHN0YXJ0KSB7CisJCS8qIHdhaXQgdW50aWwgYWxsIEZJRk9zIGdldCByZWFkeSAqLworCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKKwkJCW53YWl0ID0gMDsKKwkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCQkJY29udGludWU7CisJCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOworCQkJCWlmICghKGF6eF9zZF9yZWFkYihjaGlwLCBhenhfZGV2LCBTRF9TVFMpICYKKwkJCQkgICAgICBTRF9TVFNfRklGT19SRUFEWSkpCisJCQkJCW53YWl0Kys7CisJCQl9CisJCQlpZiAoIW53YWl0KQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiB3YWl0IHVudGlsIGFsbCBSVU4gYml0cyBhcmUgY2xlYXJlZCAqLworCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKKwkJCW53YWl0ID0gMDsKKwkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCQkJY29udGludWU7CisJCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOworCQkJCWlmIChhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSAmCisJCQkJICAgIFNEX0NUTF9ETUFfU1RBUlQpCisJCQkJCW53YWl0Kys7CisJCQl9CisJCQlpZiAoIW53YWl0KQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9CisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJLyogcmVzZXQgU1lOQyBiaXRzICovCisJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX09MRF9TU1lOQykKKwkJYXp4X3dyaXRlbChjaGlwLCBPTERfU1NZTkMsCisJCQlhenhfcmVhZGwoY2hpcCwgT0xEX1NTWU5DKSAmIH5zYml0cyk7CisJZWxzZQorCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpICYgfnNiaXRzKTsKKwlpZiAoc3RhcnQpIHsKKwkJYXp4X3RpbWVjb3VudGVyX2luaXQoc3Vic3RyZWFtLCAwLCAwKTsKKwkJaWYgKG5zeW5jID4gMSkgeworCQkJY3ljbGVfdCBjeWNsZV9sYXN0OworCisJCQkvKiBzYW1lIHN0YXJ0IGN5Y2xlIGZvciBtYXN0ZXIgYW5kIGdyb3VwICovCisJCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwkJCWN5Y2xlX2xhc3QgPSBhenhfZGV2LT5henhfdGMuY3ljbGVfbGFzdDsKKworCQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKKwkJCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQorCQkJCQljb250aW51ZTsKKwkJCQlhenhfdGltZWNvdW50ZXJfaW5pdChzLCAxLCBjeWNsZV9sYXN0KTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCisvKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uIHdpdGggY29ycmVjdGlvbiBvbiBWSUEgY2hpcHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3ZpYV9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkJIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGludCBsaW5rX3BvcywgbWluaV9wb3MsIGJvdW5kX3BvczsKKwl1bnNpZ25lZCBpbnQgbW9kX2xpbmtfcG9zLCBtb2RfZG1hX3BvcywgbW9kX21pbmlfcG9zOworCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CisKKwlsaW5rX3BvcyA9IGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9MUElCKTsKKwlpZiAoYXp4X2Rldi0+c3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkvKiBQbGF5YmFjaywgbm8gcHJvYmxlbSB1c2luZyBsaW5rIHBvc2l0aW9uICovCisJCXJldHVybiBsaW5rX3BvczsKKwl9CisKKwkvKiBDYXB0dXJlICovCisJLyogRm9yIG5ldyBjaGlwc2V0LAorCSAqIHVzZSBtb2QgdG8gZ2V0IHRoZSBETUEgcG9zaXRpb24ganVzdCBsaWtlIG9sZCBjaGlwc2V0CisJICovCisJbW9kX2RtYV9wb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKKwltb2RfZG1hX3BvcyAlPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisKKwkvKiBhenhfZGV2LT5maWZvX3NpemUgY2FuJ3QgZ2V0IEZJRk8gc2l6ZSBvZiBpbiBzdHJlYW0uCisJICogR2V0IGZyb20gYmFzZSBhZGRyZXNzICsgb2Zmc2V0LgorCSAqLworCWZpZm9fc2l6ZSA9IHJlYWR3KGNoaXAtPnJlbWFwX2FkZHIgKyBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUKTsKKworCWlmIChhenhfZGV2LT5pbnN1ZmZpY2llbnQpIHsKKwkJLyogTGluayBwb3NpdGlvbiBuZXZlciBnYXRoZXIgdGhhbiBGSUZPIHNpemUgKi8KKwkJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKKwkJCXJldHVybiAwOworCisJCWF6eF9kZXYtPmluc3VmZmljaWVudCA9IDA7CisJfQorCisJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKKwkJbWluaV9wb3MgPSBhenhfZGV2LT5idWZzaXplICsgbGlua19wb3MgLSBmaWZvX3NpemU7CisJZWxzZQorCQltaW5pX3BvcyA9IGxpbmtfcG9zIC0gZmlmb19zaXplOworCisJLyogRmluZCBuZWFyZXN0IHByZXZpb3VzIGJvdWRhcnkgKi8KKwltb2RfbWluaV9wb3MgPSBtaW5pX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwltb2RfbGlua19wb3MgPSBsaW5rX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwlpZiAobW9kX2xpbmtfcG9zID49IGZpZm9fc2l6ZSkKKwkJYm91bmRfcG9zID0gbGlua19wb3MgLSBtb2RfbGlua19wb3M7CisJZWxzZSBpZiAobW9kX2RtYV9wb3MgPj0gbW9kX21pbmlfcG9zKQorCQlib3VuZF9wb3MgPSBtaW5pX3BvcyAtIG1vZF9taW5pX3BvczsKKwllbHNlIHsKKwkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3MgKyBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisJCWlmIChib3VuZF9wb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKKwkJCWJvdW5kX3BvcyA9IDA7CisJfQorCisJLyogQ2FsY3VsYXRlIHJlYWwgRE1BIHBvc2l0aW9uIHdlIHdhbnQgKi8KKwlyZXR1cm4gYm91bmRfcG9zICsgbW9kX2RtYV9wb3M7Cit9CisKK3Vuc2lnbmVkIGludCBhenhfZ2V0X3Bvc2l0aW9uKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiwKKwkJCSAgICAgIGJvb2wgd2l0aF9jaGVjaykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGF6eF9kZXYtPnN1YnN0cmVhbTsKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgcG9zOworCWludCBzdHJlYW0gPSBzdWJzdHJlYW0tPnN0cmVhbTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3RyZWFtXTsKKwlpbnQgZGVsYXkgPSAwOworCisJc3dpdGNoIChjaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSkgeworCWNhc2UgUE9TX0ZJWF9MUElCOgorCQkvKiByZWFkIExQSUIgKi8KKwkJcG9zID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0xQSUIpOworCQlicmVhazsKKwljYXNlIFBPU19GSVhfVklBQ09NQk86CisJCXBvcyA9IGF6eF92aWFfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB1c2UgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLworCQlwb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKKwkJaWYgKHdpdGhfY2hlY2sgJiYgY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPT0gUE9TX0ZJWF9BVVRPKSB7CisJCQlpZiAoIXBvcyB8fCBwb3MgPT0gKHUzMiktMSkgeworCQkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJICJJbnZhbGlkIHBvc2l0aW9uIGJ1ZmZlciwgdXNpbmcgTFBJQiByZWFkIG1ldGhvZCBpbnN0ZWFkLlxuIik7CisJCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX0xQSUI7CisJCQkJcG9zID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0xQSUIpOworCQkJfSBlbHNlCisJCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX1BPU0JVRjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAocG9zID49IGF6eF9kZXYtPmJ1ZnNpemUpCisJCXBvcyA9IDA7CisKKwkvKiBjYWxjdWxhdGUgcnVudGltZSBkZWxheSBmcm9tIExQSUIgKi8KKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lICYmCisJICAgIGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfUE9TQlVGICYmCisJICAgIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZKSkgeworCQl1bnNpZ25lZCBpbnQgbHBpYl9wb3MgPSBhenhfc2RfcmVhZGwoY2hpcCwgYXp4X2RldiwgU0RfTFBJQik7CisJCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCWRlbGF5ID0gcG9zIC0gbHBpYl9wb3M7CisJCWVsc2UKKwkJCWRlbGF5ID0gbHBpYl9wb3MgLSBwb3M7CisJCWlmIChkZWxheSA8IDApIHsKKwkJCWlmIChkZWxheSA+PSBhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQpCisJCQkJZGVsYXkgPSAwOworCQkJZWxzZQorCQkJCWRlbGF5ICs9IGF6eF9kZXYtPmJ1ZnNpemU7CisJCX0KKwkJaWYgKGRlbGF5ID49IGF6eF9kZXYtPnBlcmlvZF9ieXRlcykgeworCQkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAiVW5zdGFibGUgTFBJQiAoJWQgPj0gJWQpOyBkaXNhYmxpbmcgTFBJQiBkZWxheSBjb3VudGluZ1xuIiwKKwkJCQkgZGVsYXksIGF6eF9kZXYtPnBlcmlvZF9ieXRlcyk7CisJCQlkZWxheSA9IDA7CisJCQljaGlwLT5kcml2ZXJfY2FwcyAmPSB+QVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVk7CisJCX0KKwkJZGVsYXkgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkZWxheSk7CisJfQorCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZSkgeworCQlpZiAoaGluZm8tPm9wcy5nZXRfZGVsYXkpCisJCQlkZWxheSArPSBoaW5mby0+b3BzLmdldF9kZWxheShoaW5mbywgYXBjbS0+Y29kZWMsCisJCQkJCQkgICAgICBzdWJzdHJlYW0pOworCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRlbGF5ID0gZGVsYXk7CisJfQorCisJdHJhY2VfYXp4X2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2LCBwb3MsIGRlbGF5KTsKKwlyZXR1cm4gcG9zOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2dldF9wb3NpdGlvbik7CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBhenhfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJICAgICAgIGF6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2RldiwgZmFsc2UpKTsKK30KKworc3RhdGljIGludCBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJdTY0IG5zZWM7CisKKwluc2VjID0gdGltZWNvdW50ZXJfcmVhZCgmYXp4X2Rldi0+YXp4X3RjKTsKKwluc2VjID0gZGl2X3U2NChuc2VjLCAzKTsgLyogY2FuIGJlIG9wdGltaXplZCAqLworCW5zZWMgPSBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN1YnN0cmVhbSwgbnNlYyk7CisKKwkqdHMgPSBuc190b190aW1lc3BlYyhuc2VjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgYXp4X3BjbV9odyA9IHsKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIC8qIE5vIGZ1bGwtcmVzdW1lIHlldCBpbXBsZW1lbnRlZCAqLworCQkJCSAvKiBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfCovCisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTk9fUEVSSU9EX1dBS0VVUCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0ODAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkyLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CUFaWF9NQVhfQlVGX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPQkxMjgsCisJLnBlcmlvZF9ieXRlc19tYXggPQlBWlhfTUFYX0JVRl9TSVpFIC8gMiwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJQVpYX01BWF9GUkFHLAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisJaW50IGJ1ZmZfc3RlcDsKKworCW11dGV4X2xvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCWF6eF9kZXYgPSBhenhfYXNzaWduX2RldmljZShjaGlwLCBzdWJzdHJlYW0pOworCWlmIChhenhfZGV2ID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcnVudGltZS0+aHcgPSBhenhfcGNtX2h3OworCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IGhpbmZvLT5jaGFubmVsc19taW47CisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gaGluZm8tPmNoYW5uZWxzX21heDsKKwlydW50aW1lLT5ody5mb3JtYXRzID0gaGluZm8tPmZvcm1hdHM7CisJcnVudGltZS0+aHcucmF0ZXMgPSBoaW5mby0+cmF0ZXM7CisJc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisKKwkvKiBhdm9pZCB3cmFwLWFyb3VuZCB3aXRoIHdhbGwtY2xvY2sgKi8KKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfVElNRSwKKwkJCQkgICAgIDIwLAorCQkJCSAgICAgMTc4MDAwMDAwKTsKKworCWlmIChjaGlwLT5hbGlnbl9idWZmZXJfc2l6ZSkKKwkJLyogY29uc3RyYWluIGJ1ZmZlciBzaXplcyB0byBiZSBtdWx0aXBsZSBvZiAxMjgKKwkJICAgYnl0ZXMuIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGVybXMgb2YgbWVtb3J5CisJCSAgIGFjY2VzcyBidXQgaXNuJ3QgcmVxdWlyZWQgYnkgdGhlIEhEQSBzcGVjIGFuZAorCQkgICBwcmV2ZW50cyB1c2VycyBmcm9tIHNwZWNpZnlpbmcgZXhhY3QgcGVyaW9kL2J1ZmZlcgorCQkgICBzaXplcy4gRm9yIGV4YW1wbGUgZm9yIDQ0LjFrSHosIGEgcGVyaW9kIHNpemUgc2V0CisJCSAgIHRvIDIwbXMgd2lsbCBiZSByb3VuZGVkIHRvIDE5LjU5bXMuICovCisJCWJ1ZmZfc3RlcCA9IDEyODsKKwllbHNlCisJCS8qIERvbid0IGVuZm9yY2Ugc3RlcHMgb24gYnVmZmVyIHNpemVzLCBzdGlsbCBuZWVkIHRvCisJCSAgIGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMgKEhEQSBzcGVjKS4gVGVzdGVkIG9uIEludGVsCisJCSAgIEhEQSBjb250cm9sbGVycywgbWF5IG5vdCB3b3JrIG9uIGFsbCBkZXZpY2VzIHdoZXJlCisJCSAgIG9wdGlvbiBuZWVkcyB0byBiZSBkaXNhYmxlZCAqLworCQlidWZmX3N0ZXAgPSA0OworCisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCQkgICBidWZmX3N0ZXApOworCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCisJCQkJICAgYnVmZl9zdGVwKTsKKwlzbmRfaGRhX3Bvd2VyX3VwX2Qzd2FpdChhcGNtLT5jb2RlYyk7CisJZXJyID0gaGluZm8tPm9wcy5vcGVuKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7CisJCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7CisJCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF9wY21fbGltaXRfaHdfcmF0ZXMocnVudGltZSk7CisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbikgfHwKKwkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4KSB8fAorCSAgICBzbmRfQlVHX09OKCFydW50aW1lLT5ody5mb3JtYXRzKSB8fAorCSAgICBzbmRfQlVHX09OKCFydW50aW1lLT5ody5yYXRlcykpIHsKKwkJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOworCQloaW5mby0+b3BzLmNsb3NlKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwkJc25kX2hkYV9wb3dlcl9kb3duKGFwY20tPmNvZGVjKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGlzYWJsZSBXQUxMQ0xPQ0sgdGltZXN0YW1wcyBmb3IgY2FwdHVyZSBzdHJlYW1zCisJICAgdW50aWwgd2UgZmlndXJlIG91dCBob3cgdG8gaGFuZGxlIGRpZ2l0YWwgaW5wdXRzICovCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcnVudGltZS0+aHcuaW5mbyAmPSB+U05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlhenhfZGV2LT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJYXp4X2Rldi0+cnVubmluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGF6eF9kZXY7CisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCWlmIChjaGlwLT5vcHMtPnBjbV9tbWFwX3ByZXBhcmUpCisJCWNoaXAtPm9wcy0+cGNtX21tYXBfcHJlcGFyZShzdWJzdHJlYW0sIGFyZWEpOworCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKKwkub3BlbiA9IGF6eF9wY21fb3BlbiwKKwkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLAorCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSBhenhfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IGF6eF9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKKwkud2FsbF9jbG9jayA9ICBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAsCisJLm1tYXAgPSBhenhfcGNtX21tYXAsCisJLnBhZ2UgPSBzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworc3RhdGljIHZvaWQgYXp4X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBwY20tPnByaXZhdGVfZGF0YTsKKwlpZiAoYXBjbSkgeworCQlsaXN0X2RlbCgmYXBjbS0+bGlzdCk7CisJCWtmcmVlKGFwY20pOworCX0KK30KKworI2RlZmluZSBNQVhfUFJFQUxMT0NfU0laRQkoMzIgKiAxMDI0ICogMTAyNCkKKworc3RhdGljIGludCBhenhfYXR0YWNoX3BjbV9zdHJlYW0oc3RydWN0IGhkYV9idXMgKmJ1cywgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBoZGFfcGNtICpjcGNtKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBhenhfcGNtICphcGNtOworCWludCBwY21fZGV2ID0gY3BjbS0+ZGV2aWNlOworCXVuc2lnbmVkIGludCBzaXplOworCWludCBzLCBlcnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFwY20sICZjaGlwLT5wY21fbGlzdCwgbGlzdCkgeworCQlpZiAoYXBjbS0+cGNtLT5kZXZpY2UgPT0gcGNtX2RldikgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJQQ00gJWQgYWxyZWFkeSBleGlzdHNcbiIsCisJCQkJcGNtX2Rldik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIGNwY20tPm5hbWUsIHBjbV9kZXYsCisJCQkgIGNwY20tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW1zLAorCQkJICBjcGNtLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW1zLAorCQkJICAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzdHJsY3B5KHBjbS0+bmFtZSwgY3BjbS0+bmFtZSwgc2l6ZW9mKHBjbS0+bmFtZSkpOworCWFwY20gPSBremFsbG9jKHNpemVvZigqYXBjbSksIEdGUF9LRVJORUwpOworCWlmIChhcGNtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWFwY20tPmNoaXAgPSBjaGlwOworCWFwY20tPnBjbSA9IHBjbTsKKwlhcGNtLT5jb2RlYyA9IGNvZGVjOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gYXBjbTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IGF6eF9wY21fZnJlZTsKKwlpZiAoY3BjbS0+cGNtX3R5cGUgPT0gSERBX1BDTV9UWVBFX01PREVNKQorCQlwY20tPmRldl9jbGFzcyA9IFNORFJWX1BDTV9DTEFTU19NT0RFTTsKKwlsaXN0X2FkZF90YWlsKCZhcGNtLT5saXN0LCAmY2hpcC0+cGNtX2xpc3QpOworCWNwY20tPnBjbSA9IHBjbTsKKwlmb3IgKHMgPSAwOyBzIDwgMjsgcysrKSB7CisJCWFwY20tPmhpbmZvW3NdID0gJmNwY20tPnN0cmVhbVtzXTsKKwkJaWYgKGNwY20tPnN0cmVhbVtzXS5zdWJzdHJlYW1zKQorCQkJc25kX3BjbV9zZXRfb3BzKHBjbSwgcywgJmF6eF9wY21fb3BzKTsKKwl9CisJLyogYnVmZmVyIHByZS1hbGxvY2F0aW9uICovCisJc2l6ZSA9IENPTkZJR19TTkRfSERBX1BSRUFMTE9DX1NJWkUgKiAxMDI0OworCWlmIChzaXplID4gTUFYX1BSRUFMTE9DX1NJWkUpCisJCXNpemUgPSBNQVhfUFJFQUxMT0NfU0laRTsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkgICAgICBjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSAgICAgIHNpemUsIE1BWF9QUkVBTExPQ19TSVpFKTsKKwkvKiBsaW5rIHRvIGNvZGVjICovCisJcGNtLT5kZXYgPSAmY29kZWMtPmRldjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENPUkIgLyBSSVJCIGludGVyZmFjZQorICovCitzdGF0aWMgaW50IGF6eF9hbGxvY19jbWRfaW8oc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgZXJyOworCisJLyogc2luZ2xlIHBhZ2UgKGF0IGxlYXN0IDQwOTYgYnl0ZXMpIG11c3Qgc3VmZmljZSBmb3IgYm90aCByaW5nYnVmZmVzICovCisJZXJyID0gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgUEFHRV9TSVpFLCAmY2hpcC0+cmIpOworCWlmIChlcnIgPCAwKQorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBDT1JCL1JJUkJcbiIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfYWxsb2NfY21kX2lvKTsKKworc3RhdGljIHZvaWQgYXp4X2luaXRfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IHRpbWVvdXQ7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJLyogQ09SQiBzZXQgdXAgKi8KKwljaGlwLT5jb3JiLmFkZHIgPSBjaGlwLT5yYi5hZGRyOworCWNoaXAtPmNvcmIuYnVmID0gKHUzMiAqKWNoaXAtPnJiLmFyZWE7CisJYXp4X3dyaXRlbChjaGlwLCBDT1JCTEJBU0UsICh1MzIpY2hpcC0+Y29yYi5hZGRyKTsKKwlhenhfd3JpdGVsKGNoaXAsIENPUkJVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5jb3JiLmFkZHIpKTsKKworCS8qIHNldCB0aGUgY29yYiBzaXplIHRvIDI1NiBlbnRyaWVzIChVTEkgcmVxdWlyZXMgZXhwbGljaXRseSkgKi8KKwlhenhfd3JpdGViKGNoaXAsIENPUkJTSVpFLCAweDAyKTsKKwkvKiBzZXQgdGhlIGNvcmIgd3JpdGUgcG9pbnRlciB0byAwICovCisJYXp4X3dyaXRldyhjaGlwLCBDT1JCV1AsIDApOworCisJLyogcmVzZXQgdGhlIGNvcmIgaHcgcmVhZCBwb2ludGVyICovCisJYXp4X3dyaXRldyhjaGlwLCBDT1JCUlAsIElDSDZfQ09SQlJQX1JTVCk7CisJZm9yICh0aW1lb3V0ID0gMTAwMDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkgeworCQlpZiAoKGF6eF9yZWFkdyhjaGlwLCBDT1JCUlApICYgSUNINl9DT1JCUlBfUlNUKSA9PSBJQ0g2X0NPUkJSUF9SU1QpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlpZiAodGltZW91dCA8PSAwKQorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNPUkIgcmVzZXQgdGltZW91dCMxLCBDT1JCUlAgPSAlZFxuIiwKKwkJCWF6eF9yZWFkdyhjaGlwLCBDT1JCUlApKTsKKworCWF6eF93cml0ZXcoY2hpcCwgQ09SQlJQLCAwKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDAwOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKSB7CisJCWlmIChhenhfcmVhZHcoY2hpcCwgQ09SQlJQKSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHRpbWVvdXQgPD0gMCkKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDT1JCIHJlc2V0IHRpbWVvdXQjMiwgQ09SQlJQID0gJWRcbiIsCisJCQlhenhfcmVhZHcoY2hpcCwgQ09SQlJQKSk7CisKKwkvKiBlbmFibGUgY29yYiBkbWEgKi8KKwlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIElDSDZfQ09SQkNUTF9SVU4pOworCisJLyogUklSQiBzZXQgdXAgKi8KKwljaGlwLT5yaXJiLmFkZHIgPSBjaGlwLT5yYi5hZGRyICsgMjA0ODsKKwljaGlwLT5yaXJiLmJ1ZiA9ICh1MzIgKikoY2hpcC0+cmIuYXJlYSArIDIwNDgpOworCWNoaXAtPnJpcmIud3AgPSBjaGlwLT5yaXJiLnJwID0gMDsKKwltZW1zZXQoY2hpcC0+cmlyYi5jbWRzLCAwLCBzaXplb2YoY2hpcC0+cmlyYi5jbWRzKSk7CisJYXp4X3dyaXRlbChjaGlwLCBSSVJCTEJBU0UsICh1MzIpY2hpcC0+cmlyYi5hZGRyKTsKKwlhenhfd3JpdGVsKGNoaXAsIFJJUkJVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5yaXJiLmFkZHIpKTsKKworCS8qIHNldCB0aGUgcmlyYiBzaXplIHRvIDI1NiBlbnRyaWVzIChVTEkgcmVxdWlyZXMgZXhwbGljaXRseSkgKi8KKwlhenhfd3JpdGViKGNoaXAsIFJJUkJTSVpFLCAweDAyKTsKKwkvKiByZXNldCB0aGUgcmlyYiBodyB3cml0ZSBwb2ludGVyICovCisJYXp4X3dyaXRldyhjaGlwLCBSSVJCV1AsIElDSDZfUklSQldQX1JTVCk7CisJLyogc2V0IE49MSwgZ2V0IFJJUkIgcmVzcG9uc2UgaW50ZXJydXB0IGZvciBuZXcgZW50cnkgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQpCisJCWF6eF93cml0ZXcoY2hpcCwgUklOVENOVCwgMHhjMCk7CisJZWxzZQorCQlhenhfd3JpdGV3KGNoaXAsIFJJTlRDTlQsIDEpOworCS8qIGVuYWJsZSByaXJiIGRtYSBhbmQgcmVzcG9uc2UgaXJxICovCisJYXp4X3dyaXRlYihjaGlwLCBSSVJCQ1RMLCBJQ0g2X1JCQ1RMX0RNQV9FTiB8IElDSDZfUkJDVExfSVJRX0VOKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9pbml0X2NtZF9pbyk7CisKK3N0YXRpYyB2b2lkIGF6eF9mcmVlX2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkvKiBkaXNhYmxlIHJpbmdidWZmZXIgRE1BcyAqLworCWF6eF93cml0ZWIoY2hpcCwgUklSQkNUTCwgMCk7CisJYXp4X3dyaXRlYihjaGlwLCBDT1JCQ1RMLCAwKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9mcmVlX2NtZF9pbyk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2NvbW1hbmRfYWRkcih1MzIgY21kKQoreworCXVuc2lnbmVkIGludCBhZGRyID0gY21kID4+IDI4OworCisJaWYgKGFkZHIgPj0gQVpYX01BWF9DT0RFQ1MpIHsKKwkJc25kX0JVRygpOworCQlhZGRyID0gMDsKKwl9CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgYXp4X2NvcmJfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGFkZHIgPSBhenhfY29tbWFuZF9hZGRyKHZhbCk7CisJdW5zaWduZWQgaW50IHdwLCBycDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCS8qIGFkZCBjb21tYW5kIHRvIGNvcmIgKi8KKwl3cCA9IGF6eF9yZWFkdyhjaGlwLCBDT1JCV1ApOworCWlmICh3cCA9PSAweGZmZmYpIHsKKwkJLyogc29tZXRoaW5nIHdyb25nLCBjb250cm9sbGVyIGxpa2VseSB0dXJuZWQgdG8gRDMgKi8KKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwl3cCsrOworCXdwICU9IElDSDZfTUFYX0NPUkJfRU5UUklFUzsKKworCXJwID0gYXp4X3JlYWR3KGNoaXAsIENPUkJSUCk7CisJaWYgKHdwID09IHJwKSB7CisJCS8qIG9vcHMsIGl0J3MgZnVsbCAqLworCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJY2hpcC0+cmlyYi5jbWRzW2FkZHJdKys7CisJY2hpcC0+Y29yYi5idWZbd3BdID0gY3B1X3RvX2xlMzIodmFsKTsKKwlhenhfd3JpdGV3KGNoaXAsIENPUkJXUCwgd3ApOworCisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBJQ0g2X1JJUkJfRVhfVU5TT0xfRVYJKDE8PDQpCisKKy8qIHJldHJpZXZlIFJJUkIgZW50cnkgLSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgYXp4X3VwZGF0ZV9yaXJiKHN0cnVjdCBhenggKmNoaXApCit7CisJdW5zaWduZWQgaW50IHJwLCB3cDsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwl1MzIgcmVzLCByZXNfZXg7CisKKwl3cCA9IGF6eF9yZWFkdyhjaGlwLCBSSVJCV1ApOworCWlmICh3cCA9PSAweGZmZmYpIHsKKwkJLyogc29tZXRoaW5nIHdyb25nLCBjb250cm9sbGVyIGxpa2VseSB0dXJuZWQgdG8gRDMgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICh3cCA9PSBjaGlwLT5yaXJiLndwKQorCQlyZXR1cm47CisJY2hpcC0+cmlyYi53cCA9IHdwOworCisJd2hpbGUgKGNoaXAtPnJpcmIucnAgIT0gd3ApIHsKKwkJY2hpcC0+cmlyYi5ycCsrOworCQljaGlwLT5yaXJiLnJwICU9IElDSDZfTUFYX1JJUkJfRU5UUklFUzsKKworCQlycCA9IGNoaXAtPnJpcmIucnAgPDwgMTsgLyogYW4gUklSQiBlbnRyeSBpcyA4LWJ5dGVzICovCisJCXJlc19leCA9IGxlMzJfdG9fY3B1KGNoaXAtPnJpcmIuYnVmW3JwICsgMV0pOworCQlyZXMgPSBsZTMyX3RvX2NwdShjaGlwLT5yaXJiLmJ1ZltycF0pOworCQlhZGRyID0gcmVzX2V4ICYgMHhmOworCQlpZiAoKGFkZHIgPj0gQVpYX01BWF9DT0RFQ1MpIHx8ICEoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGFkZHIpKSkgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzcHVyaW91cyByZXNwb25zZSAlI3g6JSN4LCBycCA9ICVkLCB3cCA9ICVkIiwKKwkJCQlyZXMsIHJlc19leCwKKwkJCQljaGlwLT5yaXJiLnJwLCB3cCk7CisJCQlzbmRfQlVHKCk7CisJCX0KKwkJZWxzZSBpZiAocmVzX2V4ICYgSUNINl9SSVJCX0VYX1VOU09MX0VWKQorCQkJc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudChjaGlwLT5idXMsIHJlcywgcmVzX2V4KTsKKwkJZWxzZSBpZiAoY2hpcC0+cmlyYi5jbWRzW2FkZHJdKSB7CisJCQljaGlwLT5yaXJiLnJlc1thZGRyXSA9IHJlczsKKwkJCXNtcF93bWIoKTsKKwkJCWNoaXAtPnJpcmIuY21kc1thZGRyXS0tOworCQl9IGVsc2UgaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzcHVyaW91cyByZXNwb25zZSAlI3g6JSN4LCBsYXN0IGNtZD0lIzA4eFxuIiwKKwkJCQlyZXMsIHJlc19leCwKKwkJCQljaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJCX0KKwl9Cit9CisKKy8qIHJlY2VpdmUgYSByZXNwb25zZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhenhfcmlyYl9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCQkJICB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgbG9vcGNvdW50ZXI7CisJaW50IGRvX3BvbGwgPSAwOworCisgYWdhaW46CisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCisJZm9yIChsb29wY291bnRlciA9IDA7OyBsb29wY291bnRlcisrKSB7CisJCWlmIChjaGlwLT5wb2xsaW5nX21vZGUgfHwgZG9fcG9sbCkgeworCQkJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQkJYXp4X3VwZGF0ZV9yaXJiKGNoaXApOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCX0KKwkJaWYgKCFjaGlwLT5yaXJiLmNtZHNbYWRkcl0pIHsKKwkJCXNtcF9ybWIoKTsKKwkJCWJ1cy0+cmlyYl9lcnJvciA9IDA7CisKKwkJCWlmICghZG9fcG9sbCkKKwkJCQljaGlwLT5wb2xsX2NvdW50ID0gMDsKKwkJCXJldHVybiBjaGlwLT5yaXJiLnJlc1thZGRyXTsgLyogdGhlIGxhc3QgdmFsdWUgKi8KKwkJfQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCQlpZiAoYnVzLT5uZWVkc19kYW1uX2xvbmdfZGVsYXkgfHwgbG9vcGNvdW50ZXIgPiAzMDAwKQorCQkJbXNsZWVwKDIpOyAvKiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCAqLworCQllbHNlIHsKKwkJCXVkZWxheSgxMCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKworCWlmICghYnVzLT5ub19yZXNwb25zZV9mYWxsYmFjaykKKwkJcmV0dXJuIC0xOworCisJaWYgKCFjaGlwLT5wb2xsaW5nX21vZGUgJiYgY2hpcC0+cG9sbF9jb3VudCA8IDIpIHsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiYXp4X2dldF9yZXNwb25zZSB0aW1lb3V0LCBwb2xsaW5nIHRoZSBjb2RlYyBvbmNlOiBsYXN0IGNtZD0weCUwOHhcbiIsCisJCQljaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJCWRvX3BvbGwgPSAxOworCQljaGlwLT5wb2xsX2NvdW50Kys7CisJCWdvdG8gYWdhaW47CisJfQorCisKKwlpZiAoIWNoaXAtPnBvbGxpbmdfbW9kZSkgeworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgImF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgc3dpdGNoaW5nIHRvIHBvbGxpbmcgbW9kZTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQkJIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKKwkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoY2hpcC0+bXNpKSB7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiTm8gcmVzcG9uc2UgZnJvbSBjb2RlYywgZGlzYWJsaW5nIE1TSTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQkJIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKKwkJaWYgKGNoaXAtPm9wcy0+ZGlzYWJsZV9tc2lfcmVzZXRfaXJxKGNoaXApICYmCisJCSAgICBjaGlwLT5vcHMtPmRpc2FibGVfbXNpX3Jlc2V0X2lycShjaGlwKSA8IDApIHsKKwkJCWJ1cy0+cmlyYl9lcnJvciA9IDE7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoY2hpcC0+cHJvYmluZykgeworCQkvKiBJZiB0aGlzIGNyaXRpY2FsIHRpbWVvdXQgaGFwcGVucyBkdXJpbmcgdGhlIGNvZGVjIHByb2JpbmcKKwkJICogcGhhc2UsIHRoaXMgaXMgbGlrZWx5IGFuIGFjY2VzcyB0byBhIG5vbi1leGlzdGluZyBjb2RlYworCQkgKiBzbG90LiAgQmV0dGVyIHRvIHJldHVybiBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIHN5c3RlbS4KKwkJICovCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhIGZhdGFsIGNvbW11bmljYXRpb24gZXJyb3I7IG5lZWQgZWl0aGVyIHRvIHJlc2V0IG9yIHRvIGZhbGxiYWNrCisJICogdG8gdGhlIHNpbmdsZV9jbWQgbW9kZQorCSAqLworCWJ1cy0+cmlyYl9lcnJvciA9IDE7CisJaWYgKGJ1cy0+YWxsb3dfYnVzX3Jlc2V0ICYmICFidXMtPnJlc3BvbnNlX3Jlc2V0ICYmICFidXMtPmluX3Jlc2V0KSB7CisJCWJ1cy0+cmVzcG9uc2VfcmVzZXQgPSAxOworCQlyZXR1cm4gLTE7IC8qIGdpdmUgYSBjaGFuY2UgdG8gcmV0cnkgKi8KKwl9CisKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgc3dpdGNoaW5nIHRvIHNpbmdsZV9jbWQgbW9kZTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQljaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJY2hpcC0+c2luZ2xlX2NtZCA9IDE7CisJYnVzLT5yZXNwb25zZV9yZXNldCA9IDA7CisJLyogcmVsZWFzZSBDT1JCL1JJUkIgKi8KKwlhenhfZnJlZV9jbWRfaW8oY2hpcCk7CisJLyogZGlzYWJsZSB1bnNvbGljaXRlZCByZXNwb25zZXMgKi8KKwlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSAmIH5JQ0g2X0dDVExfVU5TT0wpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFVzZSB0aGUgc2luZ2xlIGltbWVkaWF0ZSBjb21tYW5kIGluc3RlYWQgb2YgQ09SQi9SSVJCIGZvciBzaW1wbGljaXR5CisgKgorICogTm90ZTogYWNjb3JkaW5nIHRvIEludGVsLCB0aGlzIGlzIG5vdCBwcmVmZXJyZWQgdXNlLiAgVGhlIGNvbW1hbmQgd2FzCisgKiAgICAgICBpbnRlbmRlZCBmb3IgdGhlIEJJT1Mgb25seSwgYW5kIG1heSBnZXQgY29uZnVzZWQgd2l0aCB1bnNvbGljaXRlZAorICogICAgICAgcmVzcG9uc2VzLiAgU28sIHdlIHNob3VsZG4ndCB1c2UgaXQgZm9yIG5vcm1hbCBvcGVyYXRpb24gZnJvbSB0aGUKKyAqICAgICAgIGRyaXZlci4KKyAqICAgICAgIEkgbGVmdCB0aGUgY29kZXMsIGhvd2V2ZXIsIGZvciBkZWJ1Z2dpbmcvdGVzdGluZyBwdXJwb3Nlcy4KKyAqLworCisvKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQgYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgYXp4ICpjaGlwLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlpbnQgdGltZW91dCA9IDUwOworCisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQkvKiBjaGVjayBJUlYgYnVzeSBiaXQgKi8KKwkJaWYgKGF6eF9yZWFkdyhjaGlwLCBJUlMpICYgSUNINl9JUlNfVkFMSUQpIHsKKwkJCS8qIHJldXNlIHJpcmIucmVzIGFzIHRoZSByZXNwb25zZSByZXR1cm4gdmFsdWUgKi8KKwkJCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gYXp4X3JlYWRsKGNoaXAsIElSKTsKKwkJCXJldHVybiAwOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJnZXRfcmVzcG9uc2UgdGltZW91dDogSVJTPTB4JXhcbiIsCisJCQlhenhfcmVhZHcoY2hpcCwgSVJTKSk7CisJY2hpcC0+cmlyYi5yZXNbYWRkcl0gPSAtMTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgYXp4X3NpbmdsZV9zZW5kX2NtZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgdmFsKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgYWRkciA9IGF6eF9jb21tYW5kX2FkZHIodmFsKTsKKwlpbnQgdGltZW91dCA9IDUwOworCisJYnVzLT5yaXJiX2Vycm9yID0gMDsKKwl3aGlsZSAodGltZW91dC0tKSB7CisJCS8qIGNoZWNrIElDQiBidXN5IGJpdCAqLworCQlpZiAoISgoYXp4X3JlYWR3KGNoaXAsIElSUykgJiBJQ0g2X0lSU19CVVNZKSkpIHsKKwkJCS8qIENsZWFyIElSViB2YWxpZCBiaXQgKi8KKwkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8CisJCQkJICAgSUNINl9JUlNfVkFMSUQpOworCQkJYXp4X3dyaXRlbChjaGlwLCBJQywgdmFsKTsKKwkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8CisJCQkJICAgSUNINl9JUlNfQlVTWSk7CisJCQlyZXR1cm4gYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShjaGlwLCBhZGRyKTsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNlbmRfY21kIHRpbWVvdXQ6IElSUz0weCV4LCB2YWw9MHgleFxuIiwKKwkJCWF6eF9yZWFkdyhjaGlwLCBJUlMpLCB2YWwpOworCXJldHVybiAtRUlPOworfQorCisvKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3NpbmdsZV9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBhZGRyKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gY2hpcC0+cmlyYi5yZXNbYWRkcl07Cit9CisKKy8qCisgKiBUaGUgYmVsb3cgYXJlIHRoZSBtYWluIGNhbGxiYWNrcyBmcm9tIGhkYV9jb2RlYy4KKyAqCisgKiBUaGV5IGFyZSBqdXN0IHRoZSBza2VsZXRvbiB0byBjYWxsIHN1Yi1jYWxsYmFja3MgYWNjb3JkaW5nIHRvIHRoZQorICogY3VycmVudCBzZXR0aW5nIG9mIGNoaXAtPnNpbmdsZV9jbWQuCisgKi8KKworLyogc2VuZCBhIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgYXp4X3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCB2YWwpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGNoaXAtPmRpc2FibGVkKQorCQlyZXR1cm4gMDsKKwljaGlwLT5sYXN0X2NtZFthenhfY29tbWFuZF9hZGRyKHZhbCldID0gdmFsOworCWlmIChjaGlwLT5zaW5nbGVfY21kKQorCQlyZXR1cm4gYXp4X3NpbmdsZV9zZW5kX2NtZChidXMsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gYXp4X2NvcmJfc2VuZF9jbWQoYnVzLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X3NlbmRfY21kKTsKKworLyogZ2V0IGEgcmVzcG9uc2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2dldF9yZXNwb25zZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGFkZHIpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGlwLT5kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJaWYgKGNoaXAtPnNpbmdsZV9jbWQpCisJCXJldHVybiBhenhfc2luZ2xlX2dldF9yZXNwb25zZShidXMsIGFkZHIpOworCWVsc2UKKwkJcmV0dXJuIGF6eF9yaXJiX2dldF9yZXNwb25zZShidXMsIGFkZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2dldF9yZXNwb25zZSk7CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCisvKgorICogRFNQIGxvYWRpbmcgY29kZSAoZS5nLiBmb3IgQ0EwMTMyKQorICovCisKKy8qIHVzZSB0aGUgZmlyc3Qgc3RyZWFtIGZvciBsb2FkaW5nIERTUCAqLworc3RhdGljIHN0cnVjdCBhenhfZGV2ICoKK2F6eF9nZXRfZHNwX2xvYWRlcl9kZXYoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlyZXR1cm4gJmNoaXAtPmF6eF9kZXZbY2hpcC0+cGxheWJhY2tfaW5kZXhfb2Zmc2V0XTsKK30KKworc3RhdGljIGludCBhenhfbG9hZF9kc3BfcHJlcGFyZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCXVuc2lnbmVkIGludCBieXRlX3NpemUsCisJCQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWZwKQoreworCXUzMiAqYmRsOworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKKwlpbnQgZXJyOworCisJYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7CisKKwlkc3BfbG9jayhhenhfZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGF6eF9kZXYtPnJ1bm5pbmcgfHwgYXp4X2Rldi0+bG9ja2VkKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrOworCX0KKwlhenhfZGV2LT5wcmVwYXJlZCA9IDA7CisJY2hpcC0+c2F2ZWRfYXp4X2RldiA9ICphenhfZGV2OworCWF6eF9kZXYtPmxvY2tlZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCSBieXRlX3NpemUsIGJ1ZnApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9hbGxvYzsKKworCWF6eF9kZXYtPmJ1ZnNpemUgPSBieXRlX3NpemU7CisJYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gYnl0ZV9zaXplOworCWF6eF9kZXYtPmZvcm1hdF92YWwgPSBmb3JtYXQ7CisKKwlhenhfc3RyZWFtX3Jlc2V0KGNoaXAsIGF6eF9kZXYpOworCisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKKworCWF6eF9kZXYtPmZyYWdzID0gMDsKKwliZGwgPSAodTMyICopYXp4X2Rldi0+YmRsLmFyZWE7CisJZXJyID0gc2V0dXBfYmRsZShjaGlwLCBidWZwLCBhenhfZGV2LCAmYmRsLCAwLCBieXRlX3NpemUsIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJYXp4X3NldHVwX2NvbnRyb2xsZXIoY2hpcCwgYXp4X2Rldik7CisJZHNwX3VubG9jayhhenhfZGV2KTsKKwlyZXR1cm4gYXp4X2Rldi0+c3RyZWFtX3RhZzsKKworIGVycm9yOgorCWNoaXAtPm9wcy0+ZG1hX2ZyZWVfcGFnZXMoY2hpcCwgYnVmcCk7CisgZXJyX2FsbG9jOgorCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoYXp4X2Rldi0+b3BlbmVkKQorCQkqYXp4X2RldiA9IGNoaXAtPnNhdmVkX2F6eF9kZXY7CisJYXp4X2Rldi0+bG9ja2VkID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKyB1bmxvY2s6CisJZHNwX3VubG9jayhhenhfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhenhfbG9hZF9kc3BfdHJpZ2dlcihzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHN0YXJ0KQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7CisKKwlpZiAoc3RhcnQpCisJCWF6eF9zdHJlYW1fc3RhcnQoY2hpcCwgYXp4X2Rldik7CisJZWxzZQorCQlhenhfc3RyZWFtX3N0b3AoY2hpcCwgYXp4X2Rldik7CisJYXp4X2Rldi0+cnVubmluZyA9IHN0YXJ0OworfQorCitzdGF0aWMgdm9pZCBhenhfbG9hZF9kc3BfY2xlYW51cChzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJCSBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gYXp4X2dldF9kc3BfbG9hZGVyX2RldihjaGlwKTsKKworCWlmICghZG1hYi0+YXJlYSB8fCAhYXp4X2Rldi0+bG9ja2VkKQorCQlyZXR1cm47CisKKwlkc3BfbG9jayhhenhfZGV2KTsKKwkvKiByZXNldCBCREwgYWRkcmVzcyAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUEwsIDApOworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUFUsIDApOworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLCAwKTsKKwlhenhfZGV2LT5idWZzaXplID0gMDsKKwlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOworCWF6eF9kZXYtPmZvcm1hdF92YWwgPSAwOworCisJY2hpcC0+b3BzLT5kbWFfZnJlZV9wYWdlcyhjaGlwLCBkbWFiKTsKKwlkbWFiLT5hcmVhID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoYXp4X2Rldi0+b3BlbmVkKQorCQkqYXp4X2RldiA9IGNoaXAtPnNhdmVkX2F6eF9kZXY7CisJYXp4X2Rldi0+bG9ja2VkID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlkc3BfdW5sb2NrKGF6eF9kZXYpOworfQorI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIgKi8KKworaW50IGF6eF9hbGxvY19zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgeworCQlkc3BfbG9ja19pbml0KCZjaGlwLT5henhfZGV2W2ldKTsKKwkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgQkRMIGZvciBlYWNoIHN0cmVhbSAqLworCQllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCQkgQkRMX1NJWkUsCisJCQkJCQkgJmNoaXAtPmF6eF9kZXZbaV0uYmRsKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIEJETFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSBjaGlwLT5udW1fc3RyZWFtcyAqIDgsICZjaGlwLT5wb3NidWYpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIHBvc2J1ZlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGFsbG9jYXRlIENPUkIvUklSQiAqLworCWVyciA9IGF6eF9hbGxvY19jbWRfaW8oY2hpcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfYWxsb2Nfc3RyZWFtX3BhZ2VzKTsKKwordm9pZCBhenhfZnJlZV9zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKwlpZiAoY2hpcC0+YXp4X2RldikgeworCQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykKKwkJCWlmIChjaGlwLT5henhfZGV2W2ldLmJkbC5hcmVhKQorCQkJCWNoaXAtPm9wcy0+ZG1hX2ZyZWVfcGFnZXMoCisJCQkJCWNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCk7CisJfQorCWlmIChjaGlwLT5yYi5hcmVhKQorCQljaGlwLT5vcHMtPmRtYV9mcmVlX3BhZ2VzKGNoaXAsICZjaGlwLT5yYik7CisJaWYgKGNoaXAtPnBvc2J1Zi5hcmVhKQorCQljaGlwLT5vcHMtPmRtYV9mcmVlX3BhZ2VzKGNoaXAsICZjaGlwLT5wb3NidWYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2ZyZWVfc3RyZWFtX3BhZ2VzKTsKKworLyoKKyAqIExvd2xldmVsIGludGVyZmFjZQorICovCisKKy8qIGVudGVyIGxpbmsgcmVzZXQgKi8KK3ZvaWQgYXp4X2VudGVyX2xpbmtfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiByZXNldCBjb250cm9sbGVyICovCisJYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgJiB+SUNINl9HQ1RMX1JFU0VUKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICgoYXp4X3JlYWRiKGNoaXAsIEdDVEwpICYgSUNINl9HQ1RMX1JFU0VUKSAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2VudGVyX2xpbmtfcmVzZXQpOworCisvKiBleGl0IGxpbmsgcmVzZXQgKi8KK3N0YXRpYyB2b2lkIGF6eF9leGl0X2xpbmtfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlhenhfd3JpdGViKGNoaXAsIEdDVEwsIGF6eF9yZWFkYihjaGlwLCBHQ1RMKSB8IElDSDZfR0NUTF9SRVNFVCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwl3aGlsZSAoIWF6eF9yZWFkYihjaGlwLCBHQ1RMKSAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOworfQorCisvKiByZXNldCBjb2RlYyBsaW5rICovCitzdGF0aWMgaW50IGF6eF9yZXNldChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKK3sKKwlpZiAoIWZ1bGxfcmVzZXQpCisJCWdvdG8gX19za2lwOworCisJLyogY2xlYXIgU1RBVEVTVFMgKi8KKwlhenhfd3JpdGV3KGNoaXAsIFNUQVRFU1RTLCBTVEFURVNUU19JTlRfTUFTSyk7CisKKwkvKiByZXNldCBjb250cm9sbGVyICovCisJYXp4X2VudGVyX2xpbmtfcmVzZXQoY2hpcCk7CisKKwkvKiBkZWxheSBmb3IgPj0gMTAwdXMgZm9yIGNvZGVjIFBMTCB0byBzZXR0bGUgcGVyIHNwZWMKKwkgKiBSZXYgMC45IHNlY3Rpb24gNS41LjEKKwkgKi8KKwl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKKworCS8qIEJyaW5nIGNvbnRyb2xsZXIgb3V0IG9mIHJlc2V0ICovCisJYXp4X2V4aXRfbGlua19yZXNldChjaGlwKTsKKworCS8qIEJyZW50IENoYXJ0cmFuZCBzYWlkIHRvIHdhaXQgPj0gNTQwdXMgZm9yIGNvZGVjcyB0byBpbml0aWFsaXplICovCisJdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOworCisgICAgICBfX3NraXA6CisJLyogY2hlY2sgdG8gc2VlIGlmIGNvbnRyb2xsZXIgaXMgcmVhZHkgKi8KKwlpZiAoIWF6eF9yZWFkYihjaGlwLCBHQ1RMKSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImF6eF9yZXNldDogY29udHJvbGxlciBub3QgcmVhZHkhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBBY2NlcHQgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzICovCisJaWYgKCFjaGlwLT5zaW5nbGVfY21kKQorCQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSB8CisJCQkgICBJQ0g2X0dDVExfVU5TT0wpOworCisJLyogZGV0ZWN0IGNvZGVjcyAqLworCWlmICghY2hpcC0+Y29kZWNfbWFzaykgeworCQljaGlwLT5jb2RlY19tYXNrID0gYXp4X3JlYWR3KGNoaXAsIFNUQVRFU1RTKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjb2RlY19tYXNrID0gMHgleFxuIiwKKwkJCWNoaXAtPmNvZGVjX21hc2spOworCX0KKworCXJldHVybiAwOworfQorCisvKiBlbmFibGUgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgYXp4X2ludF9lbmFibGUoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwkvKiBlbmFibGUgY29udHJvbGxlciBDSUUgYW5kIEdJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLCBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSB8CisJCSAgIElDSDZfSU5UX0NUUkxfRU4gfCBJQ0g2X0lOVF9HTE9CQUxfRU4pOworfQorCisvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIGF6eF9pbnRfZGlzYWJsZShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWludCBpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGluIHN0cmVhbSBkZXNjcmlwdG9yICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJYXp4X3NkX3dyaXRlYihjaGlwLCBhenhfZGV2LCBTRF9DVEwsCisJCQkgICAgICBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSAmCisJCQkJCX5TRF9JTlRfTUFTSyk7CisJfQorCisJLyogZGlzYWJsZSBTSUUgZm9yIGFsbCBzdHJlYW1zICovCisJYXp4X3dyaXRlYihjaGlwLCBJTlRDVEwsIDApOworCisJLyogZGlzYWJsZSBjb250cm9sbGVyIENJRSBhbmQgR0lFICovCisJYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpICYKKwkJICAgfihJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfR0xPQkFMX0VOKSk7Cit9CisKKy8qIGNsZWFyIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIGF6eF9pbnRfY2xlYXIoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGNsZWFyIHN0cmVhbSBzdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgeworCQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOworCQlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOworCX0KKworCS8qIGNsZWFyIFNUQVRFU1RTICovCisJYXp4X3dyaXRldyhjaGlwLCBTVEFURVNUUywgU1RBVEVTVFNfSU5UX01BU0spOworCisJLyogY2xlYXIgcmlyYiBzdGF0dXMgKi8KKwlhenhfd3JpdGViKGNoaXAsIFJJUkJTVFMsIFJJUkJfSU5UX01BU0spOworCisJLyogY2xlYXIgaW50IHN0YXR1cyAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UU1RTLCBJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfQUxMX1NUUkVBTSk7Cit9CisKKy8qCisgKiByZXNldCBhbmQgc3RhcnQgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgKi8KK3ZvaWQgYXp4X2luaXRfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKK3sKKwlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KKwlhenhfcmVzZXQoY2hpcCwgZnVsbF9yZXNldCk7CisKKwkvKiBpbml0aWFsaXplIGludGVycnVwdHMgKi8KKwlhenhfaW50X2NsZWFyKGNoaXApOworCWF6eF9pbnRfZW5hYmxlKGNoaXApOworCisJLyogaW5pdGlhbGl6ZSB0aGUgY29kZWMgY29tbWFuZCBJL08gKi8KKwlpZiAoIWNoaXAtPnNpbmdsZV9jbWQpCisJCWF6eF9pbml0X2NtZF9pbyhjaGlwKTsKKworCS8qIHByb2dyYW0gdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLworCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwgKHUzMiljaGlwLT5wb3NidWYuYWRkcik7CisJYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCB1cHBlcl8zMl9iaXRzKGNoaXAtPnBvc2J1Zi5hZGRyKSk7CisKKwljaGlwLT5pbml0aWFsaXplZCA9IDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfaW5pdF9jaGlwKTsKKwordm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApCit7CisJaWYgKCFjaGlwLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYXp4X2ludF9kaXNhYmxlKGNoaXApOworCWF6eF9pbnRfY2xlYXIoY2hpcCk7CisKKwkvKiBkaXNhYmxlIENPUkIvUklSQiAqLworCWF6eF9mcmVlX2NtZF9pbyhjaGlwKTsKKworCS8qIGRpc2FibGUgcG9zaXRpb24gYnVmZmVyICovCisJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKKwlhenhfd3JpdGVsKGNoaXAsIERQVUJBU0UsIDApOworCisJY2hpcC0+aW5pdGlhbGl6ZWQgPSAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X3N0b3BfY2hpcCk7CisKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitpcnFyZXR1cm5fdCBhenhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gZGV2X2lkOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCXUzMiBzdGF0dXM7CisJdTggc2Rfc3RhdHVzOworCWludCBpOworCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkKKwkJaWYgKGNoaXAtPmNhcmQtPmRldi0+cG93ZXIucnVudGltZV9zdGF0dXMgIT0gUlBNX0FDVElWRSkKKwkJCXJldHVybiBJUlFfTk9ORTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlpZiAoY2hpcC0+ZGlzYWJsZWQpIHsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXN0YXR1cyA9IGF6eF9yZWFkbChjaGlwLCBJTlRTVFMpOworCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZmZmZmZmZikgeworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOworCQlpZiAoc3RhdHVzICYgYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrKSB7CisJCQlzZF9zdGF0dXMgPSBhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfU1RTKTsKKwkJCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7CisJCQlpZiAoIWF6eF9kZXYtPnN1YnN0cmVhbSB8fCAhYXp4X2Rldi0+cnVubmluZyB8fAorCQkJICAgICEoc2Rfc3RhdHVzICYgU0RfSU5UX0NPTVBMRVRFKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIGNoZWNrIHdoZXRoZXIgdGhpcyBJUlEgaXMgcmVhbGx5IGFjY2VwdGFibGUgKi8KKwkJCWlmICghY2hpcC0+b3BzLT5wb3NpdGlvbl9jaGVjayB8fAorCQkJICAgIGNoaXAtPm9wcy0+cG9zaXRpb25fY2hlY2soY2hpcCwgYXp4X2RldikpIHsKKwkJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoYXp4X2Rldi0+c3Vic3RyZWFtKTsKKwkJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIGNsZWFyIHJpcmIgaW50ICovCisJc3RhdHVzID0gYXp4X3JlYWRiKGNoaXAsIFJJUkJTVFMpOworCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9NQVNLKSB7CisJCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9SRVNQT05TRSkgeworCQkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZKQorCQkJCXVkZWxheSg4MCk7CisJCQlhenhfdXBkYXRlX3JpcmIoY2hpcCk7CisJCX0KKwkJYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKKwl9CisKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2ludGVycnVwdCk7CisKKy8qCisgKiBDb2RlYyBpbml0ZXJmYWNlCisgKi8KKworLyoKKyAqIFByb2JlIHRoZSBnaXZlbiBjb2RlYyBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgcHJvYmVfY29kZWMoc3RydWN0IGF6eCAqY2hpcCwgaW50IGFkZHIpCit7CisJdW5zaWduZWQgaW50IGNtZCA9IChhZGRyIDw8IDI4KSB8IChBQ19OT0RFX1JPT1QgPDwgMjApIHwKKwkJKEFDX1ZFUkJfUEFSQU1FVEVSUyA8PCA4KSB8IEFDX1BBUl9WRU5ET1JfSUQ7CisJdW5zaWduZWQgaW50IHJlczsKKworCW11dGV4X2xvY2soJmNoaXAtPmJ1cy0+Y21kX211dGV4KTsKKwljaGlwLT5wcm9iaW5nID0gMTsKKwlhenhfc2VuZF9jbWQoY2hpcC0+YnVzLCBjbWQpOworCXJlcyA9IGF6eF9nZXRfcmVzcG9uc2UoY2hpcC0+YnVzLCBhZGRyKTsKKwljaGlwLT5wcm9iaW5nID0gMDsKKwltdXRleF91bmxvY2soJmNoaXAtPmJ1cy0+Y21kX211dGV4KTsKKwlpZiAocmVzID09IC0xKQorCQlyZXR1cm4gLUVJTzsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjICMlZCBwcm9iZWQgT0tcbiIsIGFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhenhfYnVzX3Jlc2V0KHN0cnVjdCBoZGFfYnVzICpidXMpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJYnVzLT5pbl9yZXNldCA9IDE7CisJYXp4X3N0b3BfY2hpcChjaGlwKTsKKwlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOworI2lmZGVmIENPTkZJR19QTQorCWlmIChjaGlwLT5pbml0aWFsaXplZCkgeworCQlzdHJ1Y3QgYXp4X3BjbSAqcDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpCisJCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHAtPnBjbSk7CisJCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMpOworCQlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOworCX0KKyNlbmRpZgorCWJ1cy0+aW5fcmVzZXQgPSAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBwb3dlci11cC9kb3duIHRoZSBjb250cm9sbGVyICovCitzdGF0aWMgdm9pZCBhenhfcG93ZXJfbm90aWZ5KHN0cnVjdCBoZGFfYnVzICpidXMsIGJvb2wgcG93ZXJfdXApCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCEoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkpCisJCXJldHVybjsKKworCWlmIChwb3dlcl91cCkKKwkJcG1fcnVudGltZV9nZXRfc3luYyhjaGlwLT5jYXJkLT5kZXYpOworCWVsc2UKKwkJcG1fcnVudGltZV9wdXRfc3luYyhjaGlwLT5jYXJkLT5kZXYpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2phY2twb2xsX2ludGVydmFsKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZiAoIWNoaXAtPmphY2twb2xsX21zKQorCQlyZXR1cm4gMDsKKworCWkgPSBjaGlwLT5qYWNrcG9sbF9tc1tjaGlwLT5kZXZfaW5kZXhdOworCWlmIChpID09IDApCisJCXJldHVybiAwOworCWlmIChpIDwgNTAgfHwgaSA+IDYwMDAwKQorCQlqID0gMDsKKwllbHNlCisJCWogPSBtc2Vjc190b19qaWZmaWVzKGkpOworCWlmIChqID09IDApCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiamFja3BvbGxfbXMgdmFsdWUgb3V0IG9mIHJhbmdlOiAlZFxuIiwgaSk7CisJcmV0dXJuIGo7Cit9CisKKy8qIENvZGVjIGluaXRpYWxpemF0aW9uICovCitpbnQgYXp4X2NvZGVjX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwLCBjb25zdCBjaGFyICptb2RlbCwKKwkJICAgICB1bnNpZ25lZCBpbnQgbWF4X3Nsb3RzLAorCQkgICAgIGludCAqcG93ZXJfc2F2ZV90bykKK3sKKwlzdHJ1Y3QgaGRhX2J1c190ZW1wbGF0ZSBidXNfdGVtcDsKKwlpbnQgYywgY29kZWNzLCBlcnI7CisKKwltZW1zZXQoJmJ1c190ZW1wLCAwLCBzaXplb2YoYnVzX3RlbXApKTsKKwlidXNfdGVtcC5wcml2YXRlX2RhdGEgPSBjaGlwOworCWJ1c190ZW1wLm1vZGVsbmFtZSA9IG1vZGVsOworCWJ1c190ZW1wLnBjaSA9IGNoaXAtPnBjaTsKKwlidXNfdGVtcC5vcHMuY29tbWFuZCA9IGF6eF9zZW5kX2NtZDsKKwlidXNfdGVtcC5vcHMuZ2V0X3Jlc3BvbnNlID0gYXp4X2dldF9yZXNwb25zZTsKKwlidXNfdGVtcC5vcHMuYXR0YWNoX3BjbSA9IGF6eF9hdHRhY2hfcGNtX3N0cmVhbTsKKwlidXNfdGVtcC5vcHMuYnVzX3Jlc2V0ID0gYXp4X2J1c19yZXNldDsKKyNpZmRlZiBDT05GSUdfUE0KKwlidXNfdGVtcC5wb3dlcl9zYXZlID0gcG93ZXJfc2F2ZV90bzsKKwlidXNfdGVtcC5vcHMucG1fbm90aWZ5ID0gYXp4X3Bvd2VyX25vdGlmeTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKKwlidXNfdGVtcC5vcHMubG9hZF9kc3BfcHJlcGFyZSA9IGF6eF9sb2FkX2RzcF9wcmVwYXJlOworCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF90cmlnZ2VyID0gYXp4X2xvYWRfZHNwX3RyaWdnZXI7CisJYnVzX3RlbXAub3BzLmxvYWRfZHNwX2NsZWFudXAgPSBhenhfbG9hZF9kc3BfY2xlYW51cDsKKyNlbmRpZgorCisJZXJyID0gc25kX2hkYV9idXNfbmV3KGNoaXAtPmNhcmQsICZidXNfdGVtcCwgJmNoaXAtPmJ1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUklSQl9ERUxBWSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkVuYWJsZSBkZWxheSBpbiBSSVJCIGhhbmRsaW5nXG4iKTsKKwkJY2hpcC0+YnVzLT5uZWVkc19kYW1uX2xvbmdfZGVsYXkgPSAxOworCX0KKworCWNvZGVjcyA9IDA7CisJaWYgKCFtYXhfc2xvdHMpCisJCW1heF9zbG90cyA9IEFaWF9ERUZBVUxUX0NPREVDUzsKKworCS8qIEZpcnN0IHRyeSB0byBwcm9iZSBhbGwgZ2l2ZW4gY29kZWMgc2xvdHMgKi8KKwlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKKwkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgeworCQkJaWYgKHByb2JlX2NvZGVjKGNoaXAsIGMpIDwgMCkgeworCQkJCS8qIFNvbWUgQklPU2VuIGdpdmUgeW91IHdyb25nIGNvZGVjIGFkZHJlc3NlcworCQkJCSAqIHRoYXQgZG9uJ3QgZXhpc3QKKwkJCQkgKi8KKwkJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSAiQ29kZWMgIyVkIHByb2JlIGVycm9yOyBkaXNhYmxpbmcgaXQuLi5cbiIsIGMpOworCQkJCWNoaXAtPmNvZGVjX21hc2sgJj0gfigxIDw8IGMpOworCQkJCS8qIE1vcmUgYmFkbHksIGFjY2Vzc2luZyB0byBhIG5vbi1leGlzdGluZworCQkJCSAqIGNvZGVjIG9mdGVuIHNjcmV3cyB1cCB0aGUgY29udHJvbGxlciBjaGlwLAorCQkJCSAqIGFuZCBkaXN0dXJicyB0aGUgZnVydGhlciBjb21tdW5pY2F0aW9ucy4KKwkJCQkgKiBUaHVzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcHJvYmluZywKKwkJCQkgKiBiZXR0ZXIgdG8gcmVzZXQgdGhlIGNvbnRyb2xsZXIgY2hpcCB0bworCQkJCSAqIGdldCBiYWNrIHRvIHRoZSBzYW5pdHkgc3RhdGUuCisJCQkJICovCisJCQkJYXp4X3N0b3BfY2hpcChjaGlwKTsKKwkJCQlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOworCQkJfQorCQl9CisJfQorCisJLyogQU1EIGNoaXBzZXRzIG9mdGVuIGNhdXNlIHRoZSBjb21tdW5pY2F0aW9uIHN0YWxscyB1cG9uIGNlcnRhaW4KKwkgKiBzZXF1ZW5jZSBsaWtlIHRoZSBwaW4tZGV0ZWN0aW9uLiAgSXQgc2VlbXMgdGhhdCBmb3JjaW5nIHRoZSBzeW5jZWQKKwkgKiBhY2Nlc3Mgd29ya3MgYXJvdW5kIHRoZSBzdGFsbC4gIEdycnIuLi4KKwkgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfU1lOQ19XUklURSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkVuYWJsZSBzeW5jX3dyaXRlIGZvciBzdGFibGUgY29tbXVuaWNhdGlvblxuIik7CisJCWNoaXAtPmJ1cy0+c3luY193cml0ZSA9IDE7CisJCWNoaXAtPmJ1cy0+YWxsb3dfYnVzX3Jlc2V0ID0gMTsKKwl9CisKKwkvKiBUaGVuIGNyZWF0ZSBjb2RlYyBpbnN0YW5jZXMgKi8KKwlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKKwkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgeworCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CisJCQllcnIgPSBzbmRfaGRhX2NvZGVjX25ldyhjaGlwLT5idXMsIGMsICZjb2RlYyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWNvZGVjLT5qYWNrcG9sbF9pbnRlcnZhbCA9IGdldF9qYWNrcG9sbF9pbnRlcnZhbChjaGlwKTsKKwkJCWNvZGVjLT5iZWVwX21vZGUgPSBjaGlwLT5iZWVwX21vZGU7CisJCQljb2RlY3MrKzsKKwkJfQorCX0KKwlpZiAoIWNvZGVjcykgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjcyBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2NvZGVjX2NyZWF0ZSk7CisKKy8qIGNvbmZpZ3VyZSBlYWNoIGNvZGVjIGluc3RhbmNlICovCitpbnQgYXp4X2NvZGVjX2NvbmZpZ3VyZShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjaGlwLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKKwkJc25kX2hkYV9jb2RlY19jb25maWd1cmUoY29kZWMpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9jb2RlY19jb25maWd1cmUpOworCisvKiBtaXhlciBjcmVhdGlvbiAtIGFsbCBzdHVmZiBpcyBpbXBsZW1lbnRlZCBpbiBoZGEgbW9kdWxlICovCitpbnQgYXp4X21peGVyX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXJldHVybiBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKGNoaXAtPmJ1cyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfbWl4ZXJfY3JlYXRlKTsKKworCisvKiBpbml0aWFsaXplIFNEIHN0cmVhbXMgKi8KK2ludCBhenhfaW5pdF9zdHJlYW0oc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgZWFjaCBzdHJlYW0gKGFrYSBkZXZpY2UpCisJICogYXNzaWduIHRoZSBzdGFydGluZyBiZGwgYWRkcmVzcyB0byBlYWNoIHN0cmVhbSAoZGV2aWNlKQorCSAqIGFuZCBpbml0aWFsaXplCisJICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJYXp4X2Rldi0+cG9zYnVmID0gKHUzMiBfX2lvbWVtICopKGNoaXAtPnBvc2J1Zi5hcmVhICsgaSAqIDgpOworCQkvKiBvZmZzZXQ6IFNESTA9MHg4MCwgU0RJMT0weGEwLCAuLi4gU0RPMz0weDE2MCAqLworCQlhenhfZGV2LT5zZF9hZGRyID0gY2hpcC0+cmVtYXBfYWRkciArICgweDIwICogaSArIDB4ODApOworCQkvKiBpbnQgbWFzazogU0RJMD0weDAxLCBTREkxPTB4MDIsIC4uLiBTRE8zPTB4ODAgKi8KKwkJYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrID0gMSA8PCBpOworCQkvKiBzdHJlYW0gdGFnOiBtdXN0IGJlIG5vbi16ZXJvIGFuZCB1bmlxdWUgKi8KKwkJYXp4X2Rldi0+aW5kZXggPSBpOworCQlhenhfZGV2LT5zdHJlYW1fdGFnID0gaSArIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfaW5pdF9zdHJlYW0pOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbW1vbiBIREEgZHJpdmVyIGZ1bmNpdG9ucyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmUzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgdGhlIGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSEQgQXVkaW8uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0hEQV9DT05UUk9MTEVSX0gKKyNkZWZpbmUgX19TT1VORF9IREFfQ09OVFJPTExFUl9ICisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9wcml2LmgiCisKKy8qIFBDTSBzZXR1cCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqZ2V0X2F6eF9kZXYoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworfQordW5zaWduZWQgaW50IGF6eF9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAorCQkJICAgICAgYm9vbCB3aXRoX2NoZWNrKTsKKworLyogU3RyZWFtIGNvbnRyb2wuICovCit2b2lkIGF6eF9zdHJlYW1fc3RvcChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2Rldik7CisKKy8qIEFsbG9jYXRpb24gZnVuY3Rpb25zLiAqLworaW50IGF6eF9hbGxvY19zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCk7Cit2b2lkIGF6eF9mcmVlX3N0cmVhbV9wYWdlcyhzdHJ1Y3QgYXp4ICpjaGlwKTsKKworLyogTG93IGxldmVsIGF6eCBpbnRlcmZhY2UgKi8KK3ZvaWQgYXp4X2luaXRfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCk7Cit2b2lkIGF6eF9zdG9wX2NoaXAoc3RydWN0IGF6eCAqY2hpcCk7Cit2b2lkIGF6eF9lbnRlcl9saW5rX3Jlc2V0KHN0cnVjdCBhenggKmNoaXApOworaXJxcmV0dXJuX3QgYXp4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisvKiBDb2RlYyBpbnRlcmZhY2UgKi8KK2ludCBhenhfY29kZWNfY3JlYXRlKHN0cnVjdCBhenggKmNoaXAsIGNvbnN0IGNoYXIgKm1vZGVsLAorCQkgICAgIHVuc2lnbmVkIGludCBtYXhfc2xvdHMsCisJCSAgICAgaW50ICpwb3dlcl9zYXZlX3RvKTsKK2ludCBhenhfY29kZWNfY29uZmlndXJlKHN0cnVjdCBhenggKmNoaXApOworaW50IGF6eF9taXhlcl9jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCk7CitpbnQgYXp4X2luaXRfc3RyZWFtKHN0cnVjdCBhenggKmNoaXApOworCisjZW5kaWYgLyogX19TT1VORF9IREFfQ09OVFJPTExFUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9lbGQuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCmluZGV4IDc5Y2E4MGYuLjQ2NjkwYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAl2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKIAkJCQkJQUNfVkVSQl9HRVRfSERNSV9FTERELCBieXRlX2luZGV4KTsKICNpZmRlZiBCRV9QQVJBTk9JRAotCXByaW50ayhLRVJOX0lORk8gIkhETUk6IEVMRCBkYXRhIGJ5dGUgJWQ6IDB4JXhcbiIsIGJ5dGVfaW5kZXgsIHZhbCk7CisJY29kZWNfaW5mbyhjb2RlYywgIkhETUk6IEVMRCBkYXRhIGJ5dGUgJWQ6IDB4JXhcbiIsIGJ5dGVfaW5kZXgsIHZhbCk7CiAjZW5kaWYKIAlyZXR1cm4gdmFsOwogfQpAQCAtMzMyLDExICszMzIsMTEgQEAKIAlzaXplID0gc25kX2hkbWlfZ2V0X2VsZF9zaXplKGNvZGVjLCBuaWQpOwogCWlmIChzaXplID09IDApIHsKIAkJLyogd2ZnOiB3b3JrYXJvdW5kIGZvciBBU1VTIFA1RS1WTSBIRE1JIGJvYXJkICovCi0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JOiBFTEQgYnVmIHNpemUgaXMgMCwgZm9yY2UgMTI4XG4iKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIkhETUk6IEVMRCBidWYgc2l6ZSBpcyAwLCBmb3JjZSAxMjhcbiIpOwogCQlzaXplID0gMTI4OwogCX0KIAlpZiAoc2l6ZSA8IEVMRF9GSVhFRF9CWVRFUyB8fCBzaXplID4gRUxEX01BWF9TSVpFKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JOiBpbnZhbGlkIEVMRCBidWYgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JOiBpbnZhbGlkIEVMRCBidWYgc2l6ZSAlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIApAQCAtMzQ4LDggKzM0OCw3IEBACiAJCSAqIEp1c3QgYWJvcnQuIFRoZSBjYWxsZXIgd2lsbCByZXBvbGwgYWZ0ZXIgYSB3aGlsZS4KIAkJICovCiAJCWlmICghKHZhbCAmIEFDX0VMRERfRUxEX1ZBTElEKSkgewotCQkJc25kX3ByaW50ZChLRVJOX0lORk8KLQkJCQkgICJIRE1JOiBpbnZhbGlkIEVMRCBkYXRhIGJ5dGUgJWRcbiIsIGkpOworCQkJY29kZWNfaW5mbyhjb2RlYywgIkhETUk6IGludmFsaWQgRUxEIGRhdGEgYnl0ZSAlZFxuIiwgaSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtMzYxLDcgKzM2MCw3IEBACiAJCSAqIGNvcnJlY3RseSB3cml0ZXMgRUxEIGNvbnRlbnQgYmVmb3JlIHNldHRpbmcgRUxEX3ZhbGlkIGJpdC4KIAkJICovCiAJCWlmICghdmFsICYmICFpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIkhETUk6IDAgRUxEIGRhdGFcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogMCBFTEQgZGF0YVxuIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtNjgxLDcgKzY4MCw3IEBACiAJc3BrYWxsb2MgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQVRJX1ZFUkJfR0VUX1NQRUFLRVJfQUxMT0NBVElPTiwgMCk7CiAKIAlpZiAoc3BrYWxsb2MgPD0gMCkgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSSBBVEkvQU1EOiBubyBzcGVha2VyIGFsbG9jYXRpb24gZm9yIEVMRFxuIik7CisJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JIEFUSS9BTUQ6IG5vIHNwZWFrZXIgYWxsb2NhdGlvbiBmb3IgRUxEXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03MjIsNyArNzIxLDcgQEAKIAkJc2lua19kZXNjX2xlbiA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBVElfVkVSQl9HRVRfU0lOS19JTkZPX0RBVEEsIDApOwogCiAJCWlmIChzaW5rX2Rlc2NfbGVuID4gRUxEX01BWF9NTkwpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JIEFUSS9BTUQ6IFRydW5jYXRpbmcgSERNSSBzaW5rIGRlc2NyaXB0aW9uIHdpdGggbGVuZ3RoICVkXG4iLAorCQkJY29kZWNfaW5mbyhjb2RlYywgIkhETUkgQVRJL0FNRDogVHJ1bmNhdGluZyBIRE1JIHNpbmsgZGVzY3JpcHRpb24gd2l0aCBsZW5ndGggJWRcbiIsCiAJCQkJICAgc2lua19kZXNjX2xlbik7CiAJCQlzaW5rX2Rlc2NfbGVuID0gRUxEX01BWF9NTkw7CiAJCX0KQEAgLTc2NCw3ICs3NjMsNyBAQAogCX0KIAogCWlmIChwb3MgPT0gRUxEX0ZJWEVEX0JZVEVTICsgc2lua19kZXNjX2xlbikgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSSBBVEkvQU1EOiBubyBhdWRpbyBkZXNjcmlwdG9ycyBmb3IgRUxEXG4iKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIkhETUkgQVRJL0FNRDogbm8gYXVkaW8gZGVzY3JpcHRvcnMgZm9yIEVMRFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCmluZGV4IGQ5YTA5YmQuLjE2MTMzODggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+a2N0bHMpOwogfQogCi12b2lkIHNuZF9oZGFfZ2VuX3NwZWNfZnJlZShzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjKQorc3RhdGljIHZvaWQgc25kX2hkYV9nZW5fc3BlY19mcmVlKHN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMpCiB7CiAJaWYgKCFzcGVjKQogCQlyZXR1cm47CkBAIC04Nyw3ICs4Nyw2IEBACiAJc25kX2FycmF5X2ZyZWUoJnNwZWMtPnBhdGhzKTsKIAlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+bG9vcGJhY2tfbGlzdCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dlbl9zcGVjX2ZyZWUpOwogCiAvKgogICogc3RvcmUgdXNlciBoaW50cwpAQCAtMzQ3LDcgKzM0Niw4IEBACiAJcmV0dXJuIGlzX2N0bF91c2VkKGNvZGVjLCB2YWwsIHR5cGUpOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9uaWRfcGF0aChjb25zdCBjaGFyICpwZngsIHN0cnVjdCBuaWRfcGF0aCAqcGF0aCkKK3N0YXRpYyB2b2lkIHByaW50X25pZF9wYXRoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgY29uc3QgY2hhciAqcGZ4LCBzdHJ1Y3QgbmlkX3BhdGggKnBhdGgpCiB7CiAJY2hhciBidWZbNDBdOwogCWludCBpOwpAQCAtMzU5LDcgKzM1OSw3IEBACiAJCXNwcmludGYodG1wLCAiOiUwMngiLCBwYXRoLT5wYXRoW2ldKTsKIAkJc3RybGNhdChidWYsIHRtcCwgc2l6ZW9mKGJ1ZikpOwogCX0KLQlzbmRfcHJpbnRkZCgiJXMgcGF0aDogZGVwdGg9JWQgJXNcbiIsIHBmeCwgcGF0aC0+ZGVwdGgsIGJ1Zik7CisJY29kZWNfZGJnKGNvZGVjLCAiJXMgcGF0aDogZGVwdGg9JWQgJXNcbiIsIHBmeCwgcGF0aC0+ZGVwdGgsIGJ1Zik7CiB9CiAKIC8qIGNhbGxlZCByZWN1cnNpdmVseSAqLwpAQCAtNzYyLDcgKzc2Miw3IEBACiAJCQkJCQkgICAgQUNfUFdSU1RfRDApOwogCQl9CiAJCWlmIChlbmFibGUgJiYgcGF0aC0+bXVsdGlbaV0pCi0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCisJCQlzbmRfaGRhX2NvZGVjX3VwZGF0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAogCQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCiAJCQkJCSAgICBwYXRoLT5pZHhbaV0pOwogCQlpZiAoaGFzX2FtcF9pbihjb2RlYywgcGF0aCwgaSkpCkBAIC0xMjYxLDcgKzEyNjEsNyBAQAogCQkJZGFjID0gZGFjc1tpXSA9IDA7CiAJCQliYWRuZXNzICs9IGJhZC0+bm9fZGFjOwogCQl9IGVsc2UgewotCQkJLyogcHJpbnRfbmlkX3BhdGgoIm91dHB1dCIsIHBhdGgpOyAqLworCQkJLyogcHJpbnRfbmlkX3BhdGgoY29kZWMsICJvdXRwdXQiLCBwYXRoKTsgKi8KIAkJCXBhdGgtPmFjdGl2ZSA9IHRydWU7CiAJCQlwYXRoX2lkeFtpXSA9IHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIAkJCWJhZG5lc3MgKz0gYXNzaWduX291dF9wYXRoX2N0bHMoY29kZWMsIHBhdGgpOwpAQCAtMTM4OCw3ICsxMzg4LDcgQEAKIAkJCQliYWRuZXNzKys7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQkvKiBwcmludF9uaWRfcGF0aCgibXVsdGlpbyIsIHBhdGgpOyAqLworCQkJLyogcHJpbnRfbmlkX3BhdGgoY29kZWMsICJtdWx0aWlvIiwgcGF0aCk7ICovCiAJCQlzcGVjLT5tdWx0aV9pb1tzcGVjLT5tdWx0aV9pb3NdLnBpbiA9IG5pZDsKIAkJCXNwZWMtPm11bHRpX2lvW3NwZWMtPm11bHRpX2lvc10uZGFjID0gZGFjOwogCQkJc3BlYy0+b3V0X3BhdGhzW2NmZy0+bGluZV9vdXRzICsgc3BlYy0+bXVsdGlfaW9zXSA9CkBAIC0xNDQ1LDcgKzE0NDUsNyBAQAogCQlpZiAocGF0aCkgewogCQkJZGFjc1tpXSA9IGRhYzsKIAkJCWZvdW5kID0gdHJ1ZTsKLQkJCS8qIHByaW50X25pZF9wYXRoKCJvdXRwdXQiLCBwYXRoKTsgKi8KKwkJCS8qIHByaW50X25pZF9wYXRoKGNvZGVjLCAib3V0cHV0IiwgcGF0aCk7ICovCiAJCQlwYXRoLT5hY3RpdmUgPSB0cnVlOwogCQkJcGF0aF9pZHhbaV0gPSBzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiAJCX0KQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAJfQogCWlmICghcGF0aCkKIAkJcmV0dXJuIDA7Ci0JLyogcHJpbnRfbmlkX3BhdGgoIm91dHB1dC1hYW1peCIsIHBhdGgpOyAqLworCS8qIHByaW50X25pZF9wYXRoKGNvZGVjLCAib3V0cHV0LWFhbWl4IiwgcGF0aCk7ICovCiAJcGF0aC0+YWN0aXZlID0gZmFsc2U7IC8qIHVudXNlZCBhcyBkZWZhdWx0ICovCiAJcmV0dXJuIHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIH0KQEAgLTE3MDAsNyArMTcwMCw3IEBACiAjZGVmaW5lIERFQlVHX0JBRE5FU1MKIAogI2lmZGVmIERFQlVHX0JBRE5FU1MKLSNkZWZpbmUgZGVidWdfYmFkbmVzcwlzbmRfcHJpbnRkZAorI2RlZmluZSBkZWJ1Z19iYWRuZXNzKGZtdCwgYXJncy4uLikJY29kZWNfZGJnKGNvZGVjLCBmbXQsICMjYXJncykKICNlbHNlCiAjZGVmaW5lIGRlYnVnX2JhZG5lc3MoLi4uKQogI2VuZGlmCkBAIC0xNzEzLDcgKzE3MTMsNyBAQAogCiAJcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfZnJvbV9pZHgoY29kZWMsIGlkeCk7CiAJaWYgKHBhdGgpCi0JCXByaW50X25pZF9wYXRoKHBmeCwgcGF0aCk7CisJCXByaW50X25pZF9wYXRoKGNvZGVjLCBwZngsIHBhdGgpOwogfQogCiBzdGF0aWMgdm9pZCBkZWJ1Z19zaG93X2NvbmZpZ3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0xNzgxLDcgKzE3ODEsNyBAQAogCQlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSAhPSBBQ19XSURfQVVEX09VVCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3BlYy0+bnVtX2FsbF9kYWNzID49IEFSUkFZX1NJWkUoc3BlYy0+YWxsX2RhY3MpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGE6IFRvbyBtYW55IERBQ3MhXG4iKTsKKwkJCWNvZGVjX2Vycihjb2RlYywgIlRvbyBtYW55IERBQ3MhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNwZWMtPmFsbF9kYWNzW3NwZWMtPm51bV9hbGxfZGFjcysrXSA9IG5pZDsKQEAgLTI0MzAsNyArMjQzMCw3IEBACiAJc3BlYy0+aHBfbWljX3BpbiA9IG5pZDsKIAkvKiB3ZSBjYW4ndCBoYW5kbGUgYXV0by1taWMgdG9nZXRoZXIgd2l0aCBIUC1taWMgKi8KIAlzcGVjLT5zdXBwcmVzc19hdXRvX21pYyA9IDE7Ci0Jc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIHNoYXJlZCBJL08gamFjayBvbiBOSUQgMHgleFxuIiwgbmlkKTsKKwljb2RlY19kYmcoY29kZWMsICJFbmFibGUgc2hhcmVkIEkvTyBqYWNrIG9uIE5JRCAweCV4XG4iLCBuaWQpOwogCXJldHVybiAwOwogfQogCkBAIC0yODg0LDcgKzI4ODQsNyBAQAogCXBhdGggPSBzbmRfaGRhX2FkZF9uZXdfcGF0aChjb2RlYywgcGluLCBtaXhfbmlkLCAwKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRUlOVkFMOwotCXByaW50X25pZF9wYXRoKCJsb29wYmFjayIsIHBhdGgpOworCXByaW50X25pZF9wYXRoKGNvZGVjLCAibG9vcGJhY2siLCBwYXRoKTsKIAlzcGVjLT5sb29wYmFja19wYXRoc1tpbnB1dF9pZHhdID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwogCiAJaWR4ID0gcGF0aC0+aWR4W3BhdGgtPmRlcHRoIC0gMV07CkBAIC0yOTEyLDcgKzI5MTIsNyBAQAogCQlwYXRoID0gc25kX2hkYV9hZGRfbmV3X3BhdGgoY29kZWMsIHNwZWMtPm1peGVyX25pZCwKIAkJCQkJICAgIHNwZWMtPm1peGVyX21lcmdlX25pZCwgMCk7CiAJCWlmIChwYXRoKSB7Ci0JCQlwcmludF9uaWRfcGF0aCgibG9vcGJhY2stbWVyZ2UiLCBwYXRoKTsKKwkJCXByaW50X25pZF9wYXRoKGNvZGVjLCAibG9vcGJhY2stbWVyZ2UiLCBwYXRoKTsKIAkJCXBhdGgtPmFjdGl2ZSA9IHRydWU7CiAJCQlzcGVjLT5sb29wYmFja19tZXJnZV9wYXRoID0KIAkJCQlzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CkBAIC0yOTkxLDcgKzI5OTEsNyBAQAogCQkJfQogCQl9CiAKLQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogZW5hYmxpbmcgQURDIHN3aXRjaGluZ1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImVuYWJsaW5nIEFEQyBzd2l0Y2hpbmdcbiIpOwogCQlzcGVjLT5keW5fYWRjX3N3aXRjaCA9IDE7CiAJfSBlbHNlIGlmIChudW1zICE9IHNwZWMtPm51bV9hZGNfbmlkcykgewogCQkvKiBzaHJpbmsgdGhlIGludmFsaWQgYWRjcyBhbmQgaW5wdXQgcGF0aHMgKi8KQEAgLTMwMTUsNyArMzAxNSw3IEBACiAKIAlpZiAoaW11eC0+bnVtX2l0ZW1zID09IDEgfHwKIAkgICAgKGltdXgtPm51bV9pdGVtcyA9PSAyICYmIHNwZWMtPmhwX21pYykpIHsKLQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogcmVkdWNpbmcgdG8gYSBzaW5nbGUgQURDXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAicmVkdWNpbmcgdG8gYSBzaW5nbGUgQURDXG4iKTsKIAkJc3BlYy0+bnVtX2FkY19uaWRzID0gMTsgLyogcmVkdWNlIHRvIGEgc2luZ2xlIEFEQyAqLwogCX0KIApAQCAtMzA0Niw3ICszMDQ2LDcgQEAKIAkJcGF0aCA9IHNuZF9oZGFfYWRkX25ld19wYXRoKGNvZGVjLCBwaW4sIGFkYywgYW5jaG9yKTsKIAkJaWYgKCFwYXRoKQogCQkJY29udGludWU7Ci0JCXByaW50X25pZF9wYXRoKCJpbnB1dCIsIHBhdGgpOworCQlwcmludF9uaWRfcGF0aChjb2RlYywgImlucHV0IiwgcGF0aCk7CiAJCXNwZWMtPmlucHV0X3BhdGhzW2ltdXhfaWR4XVtjXSA9CiAJCQlzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiAKQEAgLTM3MTIsNyArMzcxMiw3IEBACiAJCXBhdGggPSBzbmRfaGRhX2FkZF9uZXdfcGF0aChjb2RlYywgZGlnX25pZCwgcGluLCAwKTsKIAkJaWYgKCFwYXRoKQogCQkJY29udGludWU7Ci0JCXByaW50X25pZF9wYXRoKCJkaWdvdXQiLCBwYXRoKTsKKwkJcHJpbnRfbmlkX3BhdGgoY29kZWMsICJkaWdvdXQiLCBwYXRoKTsKIAkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKIAkJc3BlYy0+ZGlnb3V0X3BhdGhzW2ldID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwogCQlzZXRfcGluX3RhcmdldChjb2RlYywgcGluLCBQSU5fT1VULCBmYWxzZSk7CkBAIC0zNzM5LDcgKzM3MzksNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJcGF0aCA9IHNuZF9oZGFfYWRkX25ld19wYXRoKGNvZGVjLCBwaW4sIGRpZ19uaWQsIDApOwogCQkJaWYgKHBhdGgpIHsKLQkJCQlwcmludF9uaWRfcGF0aCgiZGlnaW4iLCBwYXRoKTsKKwkJCQlwcmludF9uaWRfcGF0aChjb2RlYywgImRpZ2luIiwgcGF0aCk7CiAJCQkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKIAkJCQlzcGVjLT5kaWdfaW5fbmlkID0gZGlnX25pZDsKIAkJCQlzcGVjLT5kaWdpbl9wYXRoID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwpAQCAtNDE3MCw4ICs0MTcwLDcgQEAKIAkJaGRhX25pZF90IG5pZCA9IGNmZy0+aHBfcGluc1tpXTsKIAkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIG5pZCkpCiAJCQljb250aW51ZTsKLQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIEhQIGF1dG8tbXV0aW5nIG9uIE5JRCAweCV4XG4iLAotCQkJICAgIG5pZCk7CisJCWNvZGVjX2RiZyhjb2RlYywgIkVuYWJsZSBIUCBhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKIAkJc25kX2hkYV9qYWNrX2RldGVjdF9lbmFibGVfY2FsbGJhY2soY29kZWMsIG5pZCwgSERBX0dFTl9IUF9FVkVOVCwKIAkJCQkJCSAgICBjYWxsX2hwX2F1dG9tdXRlKTsKIAkJc3BlYy0+ZGV0ZWN0X2hwID0gMTsKQEAgLTQxODMsNyArNDE4Miw3IEBACiAJCQkJaGRhX25pZF90IG5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKIAkJCQlpZiAoIWlzX2phY2tfZGV0ZWN0YWJsZShjb2RlYywgbmlkKSkKIAkJCQkJY29udGludWU7Ci0JCQkJc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIExpbmUtT3V0IGF1dG8tbXV0aW5nIG9uIE5JRCAweCV4XG4iLCBuaWQpOworCQkJCWNvZGVjX2RiZyhjb2RlYywgIkVuYWJsZSBMaW5lLU91dCBhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKIAkJCQlzbmRfaGRhX2phY2tfZGV0ZWN0X2VuYWJsZV9jYWxsYmFjayhjb2RlYywgbmlkLAogCQkJCQkJCQkgICAgSERBX0dFTl9GUk9OVF9FVkVOVCwKIAkJCQkJCQkJICAgIGNhbGxfbGluZV9hdXRvbXV0ZSk7CkBAIC00MzAzLDcgKzQzMDIsNyBAQAogCXNwZWMtPmF1dG9fbWljID0gMTsKIAlzcGVjLT5udW1fYWRjX25pZHMgPSAxOwogCXNwZWMtPmN1cl9tdXhbMF0gPSBzcGVjLT5hbV9lbnRyeVswXS5pZHg7Ci0Jc25kX3ByaW50ZGQoImhkYS1jb2RlYzogRW5hYmxlIGF1dG8tbWljIHN3aXRjaCBvbiBOSUQgMHgleC8weCV4LzB4JXhcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiRW5hYmxlIGF1dG8tbWljIHN3aXRjaCBvbiBOSUQgMHgleC8weCV4LzB4JXhcbiIsCiAJCSAgICBzcGVjLT5hbV9lbnRyeVswXS5waW4sCiAJCSAgICBzcGVjLT5hbV9lbnRyeVsxXS5waW4sCiAJCSAgICBzcGVjLT5hbV9lbnRyeVsyXS5waW4pOwpAQCAtNTM1MCw3ICs1MzQ5LDcgQEAKICAqLwogdm9pZCBzbmRfaGRhX2dlbl9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKKwlzbmRfaGRhX2FwcGx5X2ZpeHVwKGNvZGVjLCBIREFfRklYVVBfQUNUX0ZSRUUpOwogCXNuZF9oZGFfZ2VuX3NwZWNfZnJlZShjb2RlYy0+c3BlYyk7CiAJa2ZyZWUoY29kZWMtPnNwZWMpOwogCWNvZGVjLT5zcGVjID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaAppbmRleCBjOTA4YWZiLi5iYjJkZWE3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5oCkBAIC0yOTcsNyArMjk3LDYgQEAKIH07CiAKIGludCBzbmRfaGRhX2dlbl9zcGVjX2luaXQoc3RydWN0IGhkYV9nZW5fc3BlYyAqc3BlYyk7Ci12b2lkIHNuZF9oZGFfZ2VuX3NwZWNfZnJlZShzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjKTsKIAogaW50IHNuZF9oZGFfZ2VuX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogdm9pZCBzbmRfaGRhX2dlbl9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jCmluZGV4IDcyZDgzODkuLjAxNGE3ODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYwpAQCAtMjAsMjQgKzIwLDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCiAjaW5jbHVkZSA8c291bmQvaGRhX2h3ZGVwLmg+CiAjaW5jbHVkZSA8c291bmQvbWlub3JzLmg+CiAKLS8qIGhpbnQgc3RyaW5nIHBhaXIgKi8KLXN0cnVjdCBoZGFfaGludCB7Ci0JY29uc3QgY2hhciAqa2V5OwotCWNvbnN0IGNoYXIgKnZhbDsJLyogY29udGFpbmVkIGluIHRoZSBzYW1lIGFsbG9jIGFzIGtleSAqLwotfTsKLQogLyoKICAqIHdyaXRlL3JlYWQgYW4gb3V0LW9mLWJvdW5kIHZlcmIKICAqLwpAQCAtMTA1LDI2ICs5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX2h3ZGVwX2VsZW1lbnRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBpOwotCi0JLyogY2xlYXIgaW5pdCB2ZXJicyAqLwotCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aW5pdF92ZXJicyk7Ci0JLyogY2xlYXIgaGludHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKLQkJa2ZyZWUoaGludC0+a2V5KTsgLyogd2UgZG9uJ3QgbmVlZCB0byBmcmVlIGhpbnQtPnZhbCAqLwotCX0KLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmhpbnRzKTsKLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPnVzZXJfcGlucyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGh3ZGVwX2ZyZWUoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApCi17Ci0JY2xlYXJfaHdkZXBfZWxlbWVudHMoaHdkZXAtPnByaXZhdGVfZGF0YSk7Ci19Ci0KIGludCBzbmRfaGRhX2NyZWF0ZV9od2RlcChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAljaGFyIGh3bmFtZVsxNl07CkBAIC0xMzksOCArMTA4LDggQEAKIAlzcHJpbnRmKGh3ZGVwLT5uYW1lLCAiSERBIENvZGVjICVkIiwgY29kZWMtPmFkZHIpOwogCWh3ZGVwLT5pZmFjZSA9IFNORFJWX0hXREVQX0lGQUNFX0hEQTsKIAlod2RlcC0+cHJpdmF0ZV9kYXRhID0gY29kZWM7Ci0JaHdkZXAtPnByaXZhdGVfZnJlZSA9IGh3ZGVwX2ZyZWU7CiAJaHdkZXAtPmV4Y2x1c2l2ZSA9IDE7CisJaHdkZXAtPmdyb3VwcyA9IHNuZF9oZGFfZGV2X2F0dHJfZ3JvdXBzOwogCiAJaHdkZXAtPm9wcy5vcGVuID0gaGRhX2h3ZGVwX29wZW47CiAJaHdkZXAtPm9wcy5pb2N0bCA9IGhkYV9od2RlcF9pb2N0bDsKQEAgLTE0OCw3NDAgKzExNyw4IEBACiAJaHdkZXAtPm9wcy5pb2N0bF9jb21wYXQgPSBoZGFfaHdkZXBfaW9jdGxfY29tcGF0OwogI2VuZGlmCiAKLQltdXRleF9pbml0KCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0Jc25kX2FycmF5X2luaXQoJmNvZGVjLT5pbml0X3ZlcmJzLCBzaXplb2Yoc3RydWN0IGhkYV92ZXJiKSwgMzIpOwotCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+aGludHMsIHNpemVvZihzdHJ1Y3QgaGRhX2hpbnQpLCAzMik7Ci0Jc25kX2FycmF5X2luaXQoJmNvZGVjLT51c2VyX3BpbnMsIHNpemVvZihzdHJ1Y3QgaGRhX3BpbmNmZyksIDE2KTsKKwkvKiBsaW5rIHRvIGNvZGVjICovCisJaHdkZXAtPmRldiA9ICZjb2RlYy0+ZGV2OwogCiAJcmV0dXJuIDA7CiB9Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBzc2l6ZV90IHBvd2VyX29uX2FjY3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgamlmZmllc190b19tc2Vjcyhjb2RlYy0+cG93ZXJfb25fYWNjdCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBwb3dlcl9vZmZfYWNjdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChjb2RlYyk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3MoY29kZWMtPnBvd2VyX29mZl9hY2N0KSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwb3dlcl9hdHRyc1tdID0gewotCV9fQVRUUl9STyhwb3dlcl9vbl9hY2N0KSwKLQlfX0FUVFJfUk8ocG93ZXJfb2ZmX2FjY3QpLAotfTsKLQotaW50IHNuZF9oZGFfaHdkZXBfYWRkX3Bvd2VyX3N5c2ZzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gY29kZWMtPmh3ZGVwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG93ZXJfYXR0cnMpOyBpKyspCi0JCXNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsIGh3ZGVwLT5jYXJkLAotCQkJCQkgIGh3ZGVwLT5kZXZpY2UsICZwb3dlcl9hdHRyc1tpXSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwotCi0vKgotICogc3lzZnMgaW50ZXJmYWNlCi0gKi8KLQotc3RhdGljIGludCBjbGVhcl9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gc25kX2hkYV9jb2RlY19yZXNldChjb2RlYyk7Ci0JaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IGZyZWUuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JY2xlYXJfaHdkZXBfZWxlbWVudHMoY29kZWMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlY29uZmlnX2NvZGVjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBlcnI7Ci0KLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiaGRhLWNvZGVjOiByZWNvbmZpZ3VyaW5nXG4iKTsKLQllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IHJlY29uZmlndXJlLlxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWVyciA9IHNuZF9oZGFfY29kZWNfY29uZmlndXJlKGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJvcjsKLQkvKiByZWJ1aWxkIFBDTXMgKi8KLQllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycm9yOwotCS8qIHJlYnVpbGQgbWl4ZXJzICovCi0JZXJyID0gc25kX2hkYV9jb2RlY19idWlsZF9jb250cm9scyhjb2RlYyk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY29kZWMtPmJ1cy0+Y2FyZCk7Ci0gZXJyb3I6Ci0Jc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogYWxsb2NhdGUgYSBzdHJpbmcgYXQgbW9zdCBsZW4gY2hhcnMsIGFuZCByZW1vdmUgdGhlIHRyYWlsaW5nIEVPTAotICovCi1zdGF0aWMgY2hhciAqa3N0cm5kdXBfbm9lb2woY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbGVuKQotewotCWNoYXIgKnMgPSBrc3RybmR1cChzcmMsIGxlbiwgR0ZQX0tFUk5FTCk7Ci0JY2hhciAqcDsKLQlpZiAoIXMpCi0JCXJldHVybiBOVUxMOwotCXAgPSBzdHJjaHIocywgJ1xuJyk7Ci0JaWYgKHApCi0JCSpwID0gMDsKLQlyZXR1cm4gczsKLX0KLQotI2RlZmluZSBDT0RFQ19JTkZPX1NIT1codHlwZSkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgY2hhciAqYnVmKQkJCQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CQlcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgY29kZWMtPnR5cGUpOwkJXAotfQotCi0jZGVmaW5lIENPREVDX0lORk9fU1RSX1NIT1codHlwZSkJCQkJXAotc3RhdGljIHNzaXplX3QgdHlwZSMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCQkJY2hhciAqYnVmKQkJXAotewkJCQkJCQkJXAotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCi0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwkJXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAkJCQlcCi0JCSAgICAgICBjb2RlYy0+dHlwZSA/IGNvZGVjLT50eXBlIDogIiIpOwkJXAotfQotCi1DT0RFQ19JTkZPX1NIT1codmVuZG9yX2lkKTsKLUNPREVDX0lORk9fU0hPVyhzdWJzeXN0ZW1faWQpOwotQ09ERUNfSU5GT19TSE9XKHJldmlzaW9uX2lkKTsKLUNPREVDX0lORk9fU0hPVyhhZmcpOwotQ09ERUNfSU5GT19TSE9XKG1mZyk7Ci1DT0RFQ19JTkZPX1NUUl9TSE9XKHZlbmRvcl9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NIT1coY2hpcF9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NIT1cobW9kZWxuYW1lKTsKLQotI2RlZmluZSBDT0RFQ19JTkZPX1NUT1JFKHR5cGUpCQkJCQlcCi1zdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CQlcCi0JdW5zaWduZWQgbG9uZyB2YWw7CQkJCQlcCi0JaW50IGVyciA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CQkJXAotCWlmIChlcnIgPCAwKQkJCQkJCVwKLQkJcmV0dXJuIGVycjsJCQkJCVwKLQljb2RlYy0+dHlwZSA9IHZhbDsJCQkJCVwKLQlyZXR1cm4gY291bnQ7CQkJCQkJXAotfQotCi0jZGVmaW5lIENPREVDX0lORk9fU1RSX1NUT1JFKHR5cGUpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsJCVwKLQljaGFyICpzID0ga3N0cm5kdXBfbm9lb2woYnVmLCA2NCk7CQkJXAotCWlmICghcykJCQkJCQkJXAotCQlyZXR1cm4gLUVOT01FTTsJCQkJCVwKLQlrZnJlZShjb2RlYy0+dHlwZSk7CQkJCQlcCi0JY29kZWMtPnR5cGUgPSBzOwkJCQkJXAotCXJldHVybiBjb3VudDsJCQkJCQlcCi19Ci0KLUNPREVDX0lORk9fU1RPUkUodmVuZG9yX2lkKTsKLUNPREVDX0lORk9fU1RPUkUoc3Vic3lzdGVtX2lkKTsKLUNPREVDX0lORk9fU1RPUkUocmV2aXNpb25faWQpOwotQ09ERUNfSU5GT19TVFJfU1RPUkUodmVuZG9yX25hbWUpOwotQ09ERUNfSU5GT19TVFJfU1RPUkUoY2hpcF9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NUT1JFKG1vZGVsbmFtZSk7Ci0KLSNkZWZpbmUgQ09ERUNfQUNUSU9OX1NUT1JFKHR5cGUpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsJCVwKLQlpbnQgZXJyID0gMDsJCQkJCQlcCi0JaWYgKCpidWYpCQkJCQkJXAotCQllcnIgPSB0eXBlIyNfY29kZWMoY29kZWMpOwkJCVwKLQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNvdW50OwkJCQlcCi19Ci0KLUNPREVDX0FDVElPTl9TVE9SRShyZWNvbmZpZyk7Ci1DT0RFQ19BQ1RJT05fU1RPUkUoY2xlYXIpOwotCi1zdGF0aWMgc3NpemVfdCBpbml0X3ZlcmJzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgaSwgbGVuID0gMDsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5pbml0X3ZlcmJzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX3ZlcmIgKnYgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmluaXRfdmVyYnMsIGkpOwotCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCi0JCQkJIjB4JTAyeCAweCUwM3ggMHglMDR4XG4iLAotCQkJCXYtPm5pZCwgdi0+dmVyYiwgdi0+cGFyYW0pOwotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX2luaXRfdmVyYnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaGRhX3ZlcmIgKnY7Ci0JaW50IG5pZCwgdmVyYiwgcGFyYW07Ci0KLQlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpICVpIiwgJm5pZCwgJnZlcmIsICZwYXJhbSkgIT0gMykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFuaWQgfHwgIXZlcmIpCi0JCXJldHVybiAtRUlOVkFMOwotCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQl2ID0gc25kX2FycmF5X25ldygmY29kZWMtPmluaXRfdmVyYnMpOwotCWlmICghdikgewotCQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXYtPm5pZCA9IG5pZDsKLQl2LT52ZXJiID0gdmVyYjsKLQl2LT5wYXJhbSA9IHBhcmFtOwotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBpbml0X3ZlcmJzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgZXJyID0gcGFyc2VfaW5pdF92ZXJicyhjb2RlYywgYnVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGhpbnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCWludCBpLCBsZW4gPSAwOwotCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLAotCQkJCSIlcyA9ICVzXG4iLCBoaW50LT5rZXksIGhpbnQtPnZhbCk7Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGRhX2hpbnQgKmdldF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKLQkJaWYgKCFzdHJjbXAoaGludC0+a2V5LCBrZXkpKQotCQkJcmV0dXJuIGhpbnQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVfdHJhaWxfc3BhY2VzKGNoYXIgKnN0cikKLXsKLQljaGFyICpwOwotCWlmICghKnN0cikKLQkJcmV0dXJuOwotCXAgPSBzdHIgKyBzdHJsZW4oc3RyKSAtIDE7Ci0JZm9yICg7IGlzc3BhY2UoKnApOyBwLS0pIHsKLQkJKnAgPSAwOwotCQlpZiAocCA9PSBzdHIpCi0JCQlyZXR1cm47Ci0JfQotfQotCi0jZGVmaW5lIE1BWF9ISU5UUwkxMDI0Ci0KLXN0YXRpYyBpbnQgcGFyc2VfaGludHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKLXsKLQljaGFyICprZXksICp2YWw7Ci0Jc3RydWN0IGhkYV9oaW50ICpoaW50OwotCWludCBlcnIgPSAwOwotCi0JYnVmID0gc2tpcF9zcGFjZXMoYnVmKTsKLQlpZiAoISpidWYgfHwgKmJ1ZiA9PSAnIycgfHwgKmJ1ZiA9PSAnXG4nKQotCQlyZXR1cm4gMDsKLQlpZiAoKmJ1ZiA9PSAnPScpCi0JCXJldHVybiAtRUlOVkFMOwotCWtleSA9IGtzdHJuZHVwX25vZW9sKGJ1ZiwgMTAyNCk7Ci0JaWYgKCFrZXkpCi0JCXJldHVybiAtRU5PTUVNOwotCS8qIGV4dHJhY3Qga2V5IGFuZCB2YWwgKi8KLQl2YWwgPSBzdHJjaHIoa2V5LCAnPScpOwotCWlmICghdmFsKSB7Ci0JCWtmcmVlKGtleSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkqdmFsKysgPSAwOwotCXZhbCA9IHNraXBfc3BhY2VzKHZhbCk7Ci0JcmVtb3ZlX3RyYWlsX3NwYWNlcyhrZXkpOwotCXJlbW92ZV90cmFpbF9zcGFjZXModmFsKTsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JaGludCA9IGdldF9oaW50KGNvZGVjLCBrZXkpOwotCWlmIChoaW50KSB7Ci0JCS8qIHJlcGxhY2UgKi8KLQkJa2ZyZWUoaGludC0+a2V5KTsKLQkJaGludC0+a2V5ID0ga2V5OwotCQloaW50LT52YWwgPSB2YWw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQkvKiBhbGxvY2F0ZSBhIG5ldyBoaW50IGVudHJ5ICovCi0JaWYgKGNvZGVjLT5oaW50cy51c2VkID49IE1BWF9ISU5UUykKLQkJaGludCA9IE5VTEw7Ci0JZWxzZQotCQloaW50ID0gc25kX2FycmF5X25ldygmY29kZWMtPmhpbnRzKTsKLQlpZiAoaGludCkgewotCQloaW50LT5rZXkgPSBrZXk7Ci0JCWhpbnQtPnZhbCA9IHZhbDsKLQl9IGVsc2UgewotCQllcnIgPSAtRU5PTUVNOwotCX0KLSB1bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JaWYgKGVycikKLQkJa2ZyZWUoa2V5KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3NpemVfdCBoaW50c19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCWludCBlcnIgPSBwYXJzZV9oaW50cyhjb2RlYywgYnVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBpbl9jb25maWdzX3Nob3coc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJc3RydWN0IHNuZF9hcnJheSAqbGlzdCwKLQkJCQljaGFyICpidWYpCi17Ci0JaW50IGksIGxlbiA9IDA7Ci0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBsaXN0LT51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9waW5jZmcgKnBpbiA9IHNuZF9hcnJheV9lbGVtKGxpc3QsIGkpOwotCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIweCUwMnggMHglMDh4XG4iLAotCQkJICAgICAgIHBpbi0+bmlkLCBwaW4tPmNmZyk7Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGluaXRfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT5pbml0X3BpbnMsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHVzZXJfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRyaXZlcl9waW5fY29uZmlnc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT5kcml2ZXJfcGlucywgYnVmKTsKLX0KLQotI2RlZmluZSBNQVhfUElOX0NPTkZJR1MJCTMyCi0KLXN0YXRpYyBpbnQgcGFyc2VfdXNlcl9waW5fY29uZmlncyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqYnVmKQotewotCWludCBuaWQsIGNmZywgZXJyOwotCi0JaWYgKHNzY2FuZihidWYsICIlaSAlaSIsICZuaWQsICZjZmcpICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghbmlkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JZXJyID0gc25kX2hkYV9hZGRfcGluY2ZnKGNvZGVjLCAmY29kZWMtPnVzZXJfcGlucywgbmlkLCBjZmcpOwotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHVzZXJfcGluX2NvbmZpZ3Nfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCWludCBlcnIgPSBwYXJzZV91c2VyX3Bpbl9jb25maWdzKGNvZGVjLCBidWYpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiBjb3VudDsKLX0KLQotI2RlZmluZSBDT0RFQ19BVFRSX1JXKHR5cGUpIFwKLQlfX0FUVFIodHlwZSwgMDY0NCwgdHlwZSMjX3Nob3csIHR5cGUjI19zdG9yZSkKLSNkZWZpbmUgQ09ERUNfQVRUUl9STyh0eXBlKSBcCi0JX19BVFRSX1JPKHR5cGUpCi0jZGVmaW5lIENPREVDX0FUVFJfV08odHlwZSkgXAotCV9fQVRUUih0eXBlLCAwMjAwLCBOVUxMLCB0eXBlIyNfc3RvcmUpCi0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjb2RlY19hdHRyc1tdID0gewotCUNPREVDX0FUVFJfUlcodmVuZG9yX2lkKSwKLQlDT0RFQ19BVFRSX1JXKHN1YnN5c3RlbV9pZCksCi0JQ09ERUNfQVRUUl9SVyhyZXZpc2lvbl9pZCksCi0JQ09ERUNfQVRUUl9STyhhZmcpLAotCUNPREVDX0FUVFJfUk8obWZnKSwKLQlDT0RFQ19BVFRSX1JXKHZlbmRvcl9uYW1lKSwKLQlDT0RFQ19BVFRSX1JXKGNoaXBfbmFtZSksCi0JQ09ERUNfQVRUUl9SVyhtb2RlbG5hbWUpLAotCUNPREVDX0FUVFJfUlcoaW5pdF92ZXJicyksCi0JQ09ERUNfQVRUUl9SVyhoaW50cyksCi0JQ09ERUNfQVRUUl9STyhpbml0X3Bpbl9jb25maWdzKSwKLQlDT0RFQ19BVFRSX1JXKHVzZXJfcGluX2NvbmZpZ3MpLAotCUNPREVDX0FUVFJfUk8oZHJpdmVyX3Bpbl9jb25maWdzKSwKLQlDT0RFQ19BVFRSX1dPKHJlY29uZmlnKSwKLQlDT0RFQ19BVFRSX1dPKGNsZWFyKSwKLX07Ci0KLS8qCi0gKiBjcmVhdGUgc3lzZnMgZmlsZXMgb24gaHdkZXAgZGlyZWN0b3J5Ci0gKi8KLWludCBzbmRfaGRhX2h3ZGVwX2FkZF9zeXNmcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGNvZGVjLT5od2RlcDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGVjX2F0dHJzKTsgaSsrKQotCQlzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKFNORFJWX0RFVklDRV9UWVBFX0hXREVQLCBod2RlcC0+Y2FyZCwKLQkJCQkJICBod2RlcC0+ZGV2aWNlLCAmY29kZWNfYXR0cnNbaV0pOwotCXJldHVybiAwOwotfQotCi0vKgotICogTG9vayBmb3IgaGludCBzdHJpbmcKLSAqLwotY29uc3QgY2hhciAqc25kX2hkYV9nZXRfaGludChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqa2V5KQotewotCXN0cnVjdCBoZGFfaGludCAqaGludCA9IGdldF9oaW50KGNvZGVjLCBrZXkpOwotCXJldHVybiBoaW50ID8gaGludC0+dmFsIDogTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2hpbnQpOwotCi1pbnQgc25kX2hkYV9nZXRfYm9vbF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCi17Ci0JY29uc3QgY2hhciAqcDsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXAgPSBzbmRfaGRhX2dldF9oaW50KGNvZGVjLCBrZXkpOwotCWlmICghcCB8fCAhKnApCi0JCXJldCA9IC1FTk9FTlQ7Ci0JZWxzZSB7Ci0JCXN3aXRjaCAodG91cHBlcigqcCkpIHsKLQkJY2FzZSAnVCc6IC8qIHRydWUgKi8KLQkJY2FzZSAnWSc6IC8qIHllcyAqLwotCQljYXNlICcxJzoKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfYm9vbF9oaW50KTsKLQotaW50IHNuZF9oZGFfZ2V0X2ludF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXksIGludCAqdmFscCkKLXsKLQljb25zdCBjaGFyICpwOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JcCA9IHNuZF9oZGFfZ2V0X2hpbnQoY29kZWMsIGtleSk7Ci0JaWYgKCFwKQotCQlyZXQgPSAtRU5PRU5UOwotCWVsc2UgaWYgKGtzdHJ0b3VsKHAsIDAsICZ2YWwpKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UgewotCQkqdmFscCA9IHZhbDsKLQkJcmV0ID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2ludF9oaW50KTsKLSNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRyAqLwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCi0KLS8qIHBhcnNlciBtb2RlICovCi1lbnVtIHsKLQlMSU5FX01PREVfTk9ORSwKLQlMSU5FX01PREVfQ09ERUMsCi0JTElORV9NT0RFX01PREVMLAotCUxJTkVfTU9ERV9QSU5DRkcsCi0JTElORV9NT0RFX1ZFUkIsCi0JTElORV9NT0RFX0hJTlQsCi0JTElORV9NT0RFX1ZFTkRPUl9JRCwKLQlMSU5FX01PREVfU1VCU1lTVEVNX0lELAotCUxJTkVfTU9ERV9SRVZJU0lPTl9JRCwKLQlMSU5FX01PREVfQ0hJUF9OQU1FLAotCU5VTV9MSU5FX01PREVTLAotfTsKLQotc3RhdGljIGlubGluZSBpbnQgc3RybWF0Y2goY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKLXsKLQlyZXR1cm4gc3RybmljbXAoYSwgYiwgc3RybGVuKGIpKSA9PSAwOwotfQotCi0vKiBwYXJzZSB0aGUgY29udGVudHMgYWZ0ZXIgdGhlIGxpbmUgIltjb2RlY10iCi0gKiBhY2NlcHQgb25seSB0aGUgbGluZSB3aXRoIHRocmVlIG51bWJlcnMsIGFuZCBhc3NpZ24gdGhlIGN1cnJlbnQgY29kZWMKLSAqLwotc3RhdGljIHZvaWQgcGFyc2VfY29kZWNfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0JaW50IHZlbmRvcmlkLCBzdWJpZCwgY2FkZHI7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0KLQkqY29kZWNwID0gTlVMTDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpICVpIiwgJnZlbmRvcmlkLCAmc3ViaWQsICZjYWRkcikgPT0gMykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCQlpZiAoKHZlbmRvcmlkIDw9IDAgfHwgY29kZWMtPnZlbmRvcl9pZCA9PSB2ZW5kb3JpZCkgJiYKLQkJCSAgICAoc3ViaWQgPD0gMCB8fCBjb2RlYy0+c3Vic3lzdGVtX2lkID09IHN1YmlkKSAmJgotCQkJICAgIGNvZGVjLT5hZGRyID09IGNhZGRyKSB7Ci0JCQkJKmNvZGVjcCA9IGNvZGVjOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKiBwYXJzZSB0aGUgY29udGVudHMgYWZ0ZXIgdGhlIG90aGVyIGNvbW1hbmQgdGFncywgW3BpbmNmZ10sIFt2ZXJiXSwKLSAqIFt2ZW5kb3JfaWRdLCBbc3Vic3lzdGVtX2lkXSwgW3JldmlzaW9uX2lkXSwgW2NoaXBfbmFtZV0sIFtoaW50XSBhbmQgW21vZGVsXQotICoganVzdCBwYXNzIHRvIHRoZSBzeXNmcyBoZWxwZXIgKG9ubHkgd2hlbiBhbnkgY29kZWMgd2FzIHNwZWNpZmllZCkKLSAqLwotc3RhdGljIHZvaWQgcGFyc2VfcGluY2ZnX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlwYXJzZV91c2VyX3Bpbl9jb25maWdzKCpjb2RlY3AsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX3ZlcmJfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlwYXJzZV9pbml0X3ZlcmJzKCpjb2RlY3AsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX2hpbnRfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlwYXJzZV9oaW50cygqY29kZWNwLCBidWYpOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZV9tb2RlbF9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlrZnJlZSgoKmNvZGVjcCktPm1vZGVsbmFtZSk7Ci0JKCpjb2RlY3ApLT5tb2RlbG5hbWUgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX2NoaXBfbmFtZV9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKLXsKLQlrZnJlZSgoKmNvZGVjcCktPmNoaXBfbmFtZSk7Ci0JKCpjb2RlY3ApLT5jaGlwX25hbWUgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7Ci19Ci0KLSNkZWZpbmUgREVGSU5FX1BBUlNFX0lEX01PREUobmFtZSkgXAotc3RhdGljIHZvaWQgcGFyc2VfIyNuYW1lIyNfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsIFwKLQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkgXAoteyBcCi0JdW5zaWduZWQgbG9uZyB2YWw7IFwKLQlpZiAoIWtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkpIFwKLQkJKCpjb2RlY3ApLT5uYW1lID0gdmFsOyBcCi19Ci0KLURFRklORV9QQVJTRV9JRF9NT0RFKHZlbmRvcl9pZCk7Ci1ERUZJTkVfUEFSU0VfSURfTU9ERShzdWJzeXN0ZW1faWQpOwotREVGSU5FX1BBUlNFX0lEX01PREUocmV2aXNpb25faWQpOwotCi0KLXN0cnVjdCBoZGFfcGF0Y2hfaXRlbSB7Ci0JY29uc3QgY2hhciAqdGFnOwotCWNvbnN0IGNoYXIgKmFsaWFzOwotCXZvaWQgKCpwYXJzZXIpKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywgc3RydWN0IGhkYV9jb2RlYyAqKnJldGMpOwotfTsKLQotc3RhdGljIHN0cnVjdCBoZGFfcGF0Y2hfaXRlbSBwYXRjaF9pdGVtc1tOVU1fTElORV9NT0RFU10gPSB7Ci0JW0xJTkVfTU9ERV9DT0RFQ10gPSB7Ci0JCS50YWcgPSAiW2NvZGVjXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9jb2RlY19tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9NT0RFTF0gPSB7Ci0JCS50YWcgPSAiW21vZGVsXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9tb2RlbF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9WRVJCXSA9IHsKLQkJLnRhZyA9ICJbdmVyYl0iLAotCQkuYWxpYXMgPSAiW2luaXRfdmVyYnNdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3ZlcmJfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfUElOQ0ZHXSA9IHsKLQkJLnRhZyA9ICJbcGluY2ZnXSIsCi0JCS5hbGlhcyA9ICJbdXNlcl9waW5fY29uZmlnc10iLAotCQkucGFyc2VyID0gcGFyc2VfcGluY2ZnX21vZGUsCi0JfSwKLQlbTElORV9NT0RFX0hJTlRdID0gewotCQkudGFnID0gIltoaW50XSIsCi0JCS5hbGlhcyA9ICJbaGludHNdIiwKLQkJLnBhcnNlciA9IHBhcnNlX2hpbnRfbW9kZQotCX0sCi0JW0xJTkVfTU9ERV9WRU5ET1JfSURdID0gewotCQkudGFnID0gIlt2ZW5kb3JfaWRdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3ZlbmRvcl9pZF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9TVUJTWVNURU1fSURdID0gewotCQkudGFnID0gIltzdWJzeXN0ZW1faWRdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3N1YnN5c3RlbV9pZF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9SRVZJU0lPTl9JRF0gPSB7Ci0JCS50YWcgPSAiW3JldmlzaW9uX2lkXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9yZXZpc2lvbl9pZF9tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9DSElQX05BTUVdID0gewotCQkudGFnID0gIltjaGlwX25hbWVdIiwKLQkJLnBhcnNlciA9IHBhcnNlX2NoaXBfbmFtZV9tb2RlLAotCX0sCi19OwotCi0vKiBjaGVjayB0aGUgbGluZSBzdGFydGluZyB3aXRoICdbJyAtLSBjaGFuZ2UgdGhlIHBhcnNlciBtb2RlIGFjY29kaW5nbHkgKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGluZV9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cykKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYXRjaF9pdGVtcyk7IGkrKykgewotCQlpZiAoIXBhdGNoX2l0ZW1zW2ldLnRhZykKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RybWF0Y2goYnVmLCBwYXRjaF9pdGVtc1tpXS50YWcpKQotCQkJcmV0dXJuIGk7Ci0JCWlmIChwYXRjaF9pdGVtc1tpXS5hbGlhcyAmJiBzdHJtYXRjaChidWYsIHBhdGNoX2l0ZW1zW2ldLmFsaWFzKSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gTElORV9NT0RFX05PTkU7Ci19Ci0KLS8qIGNvcHkgb25lIGxpbmUgZnJvbSB0aGUgYnVmZmVyIGluIGZ3LCBhbmQgdXBkYXRlIHRoZSBmaWVsZHMgaW4gZncKLSAqIHJldHVybiB6ZXJvIGlmIGl0IHJlYWNoZXMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBvciBub24temVybwotICogaWYgc3VjY2Vzc2Z1bGx5IGNvcGllZCBhIGxpbmUKLSAqCi0gKiB0aGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIGxpbmUgYXJlIHN0cmlwcGVkCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2xpbmVfZnJvbV9mdyhjaGFyICpidWYsIGludCBzaXplLCBzaXplX3QgKmZ3X3NpemVfcCwKLQkJCSAgICBjb25zdCB2b2lkICoqZndfZGF0YV9wKQotewotCWludCBsZW47Ci0Jc2l6ZV90IGZ3X3NpemUgPSAqZndfc2l6ZV9wOwotCWNvbnN0IGNoYXIgKnAgPSAqZndfZGF0YV9wOwotCi0Jd2hpbGUgKGlzc3BhY2UoKnApICYmIGZ3X3NpemUpIHsKLQkJcCsrOwotCQlmd19zaXplLS07Ci0JfQotCWlmICghZndfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGxlbiA9IDA7IGxlbiA8IGZ3X3NpemU7IGxlbisrKSB7Ci0JCWlmICghKnApCi0JCQlicmVhazsKLQkJaWYgKCpwID09ICdcbicpIHsKLQkJCXArKzsKLQkJCWxlbisrOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGxlbiA8IHNpemUpCi0JCQkqYnVmKysgPSAqcCsrOwotCX0KLQkqYnVmID0gMDsKLQkqZndfc2l6ZV9wID0gZndfc2l6ZSAtIGxlbjsKLQkqZndfZGF0YV9wID0gcDsKLQlyZW1vdmVfdHJhaWxfc3BhY2VzKGJ1Zik7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBsb2FkIGEgInBhdGNoIiBmaXJtd2FyZSBmaWxlIGFuZCBwYXJzZSBpdAotICovCi1pbnQgc25kX2hkYV9sb2FkX3BhdGNoKHN0cnVjdCBoZGFfYnVzICpidXMsIHNpemVfdCBmd19zaXplLCBjb25zdCB2b2lkICpmd19idWYpCi17Ci0JY2hhciBidWZbMTI4XTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKLQlpbnQgbGluZV9tb2RlOwotCi0JbGluZV9tb2RlID0gTElORV9NT0RFX05PTkU7Ci0JY29kZWMgPSBOVUxMOwotCXdoaWxlIChnZXRfbGluZV9mcm9tX2Z3KGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAmZndfc2l6ZSwgJmZ3X2J1ZikpIHsKLQkJaWYgKCEqYnVmIHx8ICpidWYgPT0gJyMnIHx8ICpidWYgPT0gJ1xuJykKLQkJCWNvbnRpbnVlOwotCQlpZiAoKmJ1ZiA9PSAnWycpCi0JCQlsaW5lX21vZGUgPSBwYXJzZV9saW5lX21vZGUoYnVmLCBidXMpOwotCQllbHNlIGlmIChwYXRjaF9pdGVtc1tsaW5lX21vZGVdLnBhcnNlciAmJgotCQkJIChjb2RlYyB8fCBsaW5lX21vZGUgPD0gTElORV9NT0RFX0NPREVDKSkKLQkJCXBhdGNoX2l0ZW1zW2xpbmVfbW9kZV0ucGFyc2VyKGJ1ZiwgYnVzLCAmY29kZWMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfbG9hZF9wYXRjaCk7Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMKaW5kZXggNzZjMTNkNS4uOWQwN2U0ZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2k5MTUuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlpZiAoIWdldF9wb3dlciB8fCAhcHV0X3Bvd2VyKQogCQlyZXR1cm47CiAKLQlzbmRfcHJpbnRkZCgiSERBIGRpc3BsYXkgcG93ZXIgJXMgXG4iLAorCXByX2RlYnVnKCJIREEgZGlzcGxheSBwb3dlciAlcyBcbiIsCiAJCQllbmFibGUgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7CiAJaWYgKGVuYWJsZSkKIAkJZ2V0X3Bvd2VyKCk7CkBAIC00NCw3ICs0NCw3IEBACiAKIAlnZXRfcG93ZXIgPSBzeW1ib2xfcmVxdWVzdChpOTE1X3JlcXVlc3RfcG93ZXJfd2VsbCk7CiAJaWYgKCFnZXRfcG93ZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImhkYS1pOTE1OiBnZXRfcG93ZXIgc3ltYm9sIGdldCBmYWlsXG4iKTsKKwkJcHJfd2FybigiaGRhLWk5MTU6IGdldF9wb3dlciBzeW1ib2wgZ2V0IGZhaWxcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTU1LDcgKzU1LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX3ByaW50ZCgiSERBIGRyaXZlciBnZXQgc3ltYm9sIHN1Y2Nlc3NmdWxseSBmcm9tIGk5MTUgbW9kdWxlXG4iKTsKKwlwcl9kZWJ1ZygiSERBIGRyaXZlciBnZXQgc3ltYm9sIHN1Y2Nlc3NmdWxseSBmcm9tIGk5MTUgbW9kdWxlXG4iKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCBlMzU0YWIxLi43N2NhODk0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTYzLDYgKzYzLDggQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9pOTE1LmgiCisjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJoZGFfcHJpdi5oIgogCiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CkBAIC0xMjcsNiArMTI5LDcgQEAKICNkZWZpbmUgcGFyYW1fY2hlY2tfeGludCBwYXJhbV9jaGVja19pbnQKIAogc3RhdGljIGludCBwb3dlcl9zYXZlID0gQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRV9ERUZBVUxUOworc3RhdGljIGludCAqcG93ZXJfc2F2ZV9hZGRyID0gJnBvd2VyX3NhdmU7CiBtb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgeGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmUsICJBdXRvbWF0aWMgcG93ZXItc2F2aW5nIHRpbWVvdXQgIgogCQkgIihpbiBzZWNvbmQsIDAgPSBkaXNhYmxlKS4iKTsKQEAgLTEzOCw2ICsxNDEsOCBAQAogc3RhdGljIGJvb2wgcG93ZXJfc2F2ZV9jb250cm9sbGVyID0gMTsKIG1vZHVsZV9wYXJhbShwb3dlcl9zYXZlX2NvbnRyb2xsZXIsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlX2NvbnRyb2xsZXIsICJSZXNldCBjb250cm9sbGVyIGluIHBvd2VyIHNhdmUgbW9kZS4iKTsKKyNlbHNlCitzdGF0aWMgaW50ICpwb3dlcl9zYXZlX2FkZHI7CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBpbnQgYWxpZ25fYnVmZmVyX3NpemUgPSAtMTsKQEAgLTE0OSwxMCArMTU0LDggQEAKIHN0YXRpYyBib29sIGhkYV9zbm9vcCA9IHRydWU7CiBtb2R1bGVfcGFyYW1fbmFtZWQoc25vb3AsIGhkYV9zbm9vcCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNub29wLCAiRW5hYmxlL2Rpc2FibGUgc25vb3BpbmciKTsKLSNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQkoY2hpcCktPnNub29wCiAjZWxzZQogI2RlZmluZSBoZGFfc25vb3AJCXRydWUKLSNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQl0cnVlCiAjZW5kaWYKIAogCkBAIC0xOTEsMTIgKzE5NCw2IEBACiAJCQkgIntVTEksIE01NDYxfX0iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgSERBIGRyaXZlciIpOwogCi0jaWZkZWYgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USwotI2RlZmluZSBTRlgJLyogbm9wICovCi0jZWxzZQotI2RlZmluZSBTRlgJImhkYS1pbnRlbCAiCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19WR0FfU1dJVENIRVJPTykKICNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSERBX0NPREVDX0hETUkpCiAjZGVmaW5lIFNVUFBPUlRfVkdBX1NXSVRDSEVST08KQEAgLTIwNSwzNjQgKzIwMiw3IEBACiAKIAogLyoKLSAqIHJlZ2lzdGVycwogICovCi0jZGVmaW5lIElDSDZfUkVHX0dDQVAJCQkweDAwCi0jZGVmaW5lICAgSUNINl9HQ0FQXzY0T0sJKDEgPDwgMCkgICAvKiA2NGJpdCBhZGRyZXNzIHN1cHBvcnQgKi8KLSNkZWZpbmUgICBJQ0g2X0dDQVBfTlNETwkoMyA8PCAxKSAgIC8qICMgb2Ygc2VyaWFsIGRhdGEgb3V0IHNpZ25hbHMgKi8KLSNkZWZpbmUgICBJQ0g2X0dDQVBfQlNTCQkoMzEgPDwgMykgIC8qICMgb2YgYmlkaXJlY3Rpb25hbCBzdHJlYW1zICovCi0jZGVmaW5lICAgSUNINl9HQ0FQX0lTUwkJKDE1IDw8IDgpICAvKiAjIG9mIGlucHV0IHN0cmVhbXMgKi8KLSNkZWZpbmUgICBJQ0g2X0dDQVBfT1NTCQkoMTUgPDwgMTIpIC8qICMgb2Ygb3V0cHV0IHN0cmVhbXMgKi8KLSNkZWZpbmUgSUNINl9SRUdfVk1JTgkJCTB4MDIKLSNkZWZpbmUgSUNINl9SRUdfVk1BSgkJCTB4MDMKLSNkZWZpbmUgSUNINl9SRUdfT1VUUEFZCQkJMHgwNAotI2RlZmluZSBJQ0g2X1JFR19JTlBBWQkJCTB4MDYKLSNkZWZpbmUgSUNINl9SRUdfR0NUTAkJCTB4MDgKLSNkZWZpbmUgICBJQ0g2X0dDVExfUkVTRVQJKDEgPDwgMCkgICAvKiBjb250cm9sbGVyIHJlc2V0ICovCi0jZGVmaW5lICAgSUNINl9HQ1RMX0ZDTlRSTAkoMSA8PCAxKSAgIC8qIGZsdXNoIGNvbnRyb2wgKi8KLSNkZWZpbmUgICBJQ0g2X0dDVExfVU5TT0wJKDEgPDwgOCkgICAvKiBhY2NlcHQgdW5zb2wuIHJlc3BvbnNlIGVuYWJsZSAqLwotI2RlZmluZSBJQ0g2X1JFR19XQUtFRU4JCQkweDBjCi0jZGVmaW5lIElDSDZfUkVHX1NUQVRFU1RTCQkweDBlCi0jZGVmaW5lIElDSDZfUkVHX0dTVFMJCQkweDEwCi0jZGVmaW5lICAgSUNINl9HU1RTX0ZTVFMJKDEgPDwgMSkgICAvKiBmbHVzaCBzdGF0dXMgKi8KLSNkZWZpbmUgSUNINl9SRUdfSU5UQ1RMCQkJMHgyMAotI2RlZmluZSBJQ0g2X1JFR19JTlRTVFMJCQkweDI0Ci0jZGVmaW5lIElDSDZfUkVHX1dBTExDTEsJCTB4MzAJLyogMjRNaHogc291cmNlICovCi0jZGVmaW5lIElDSDZfUkVHX09MRF9TU1lOQwkJMHgzNAkvKiBTU1lOQyBmb3Igb2xkIElDSCAqLwotI2RlZmluZSBJQ0g2X1JFR19TU1lOQwkJCTB4MzgKLSNkZWZpbmUgSUNINl9SRUdfQ09SQkxCQVNFCQkweDQwCi0jZGVmaW5lIElDSDZfUkVHX0NPUkJVQkFTRQkJMHg0NAotI2RlZmluZSBJQ0g2X1JFR19DT1JCV1AJCQkweDQ4Ci0jZGVmaW5lIElDSDZfUkVHX0NPUkJSUAkJCTB4NGEKLSNkZWZpbmUgICBJQ0g2X0NPUkJSUF9SU1QJKDEgPDwgMTUpICAvKiByZWFkIHBvaW50ZXIgcmVzZXQgKi8KLSNkZWZpbmUgSUNINl9SRUdfQ09SQkNUTAkJMHg0YwotI2RlZmluZSAgIElDSDZfQ09SQkNUTF9SVU4JKDEgPDwgMSkgICAvKiBlbmFibGUgRE1BICovCi0jZGVmaW5lICAgSUNINl9DT1JCQ1RMX0NNRUlFCSgxIDw8IDApICAgLyogZW5hYmxlIG1lbW9yeSBlcnJvciBpcnEgKi8KLSNkZWZpbmUgSUNINl9SRUdfQ09SQlNUUwkJMHg0ZAotI2RlZmluZSAgIElDSDZfQ09SQlNUU19DTUVJCSgxIDw8IDApICAgLyogbWVtb3J5IGVycm9yIGluZGljYXRpb24gKi8KLSNkZWZpbmUgSUNINl9SRUdfQ09SQlNJWkUJCTB4NGUKLQotI2RlZmluZSBJQ0g2X1JFR19SSVJCTEJBU0UJCTB4NTAKLSNkZWZpbmUgSUNINl9SRUdfUklSQlVCQVNFCQkweDU0Ci0jZGVmaW5lIElDSDZfUkVHX1JJUkJXUAkJCTB4NTgKLSNkZWZpbmUgICBJQ0g2X1JJUkJXUF9SU1QJKDEgPDwgMTUpICAvKiB3cml0ZSBwb2ludGVyIHJlc2V0ICovCi0jZGVmaW5lIElDSDZfUkVHX1JJTlRDTlQJCTB4NWEKLSNkZWZpbmUgSUNINl9SRUdfUklSQkNUTAkJMHg1YwotI2RlZmluZSAgIElDSDZfUkJDVExfSVJRX0VOCSgxIDw8IDApICAgLyogZW5hYmxlIElSUSAqLwotI2RlZmluZSAgIElDSDZfUkJDVExfRE1BX0VOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLwotI2RlZmluZSAgIElDSDZfUkJDVExfT1ZFUlJVTl9FTgkoMSA8PCAyKSAgIC8qIGVuYWJsZSBvdmVycnVuIGlycSAqLwotI2RlZmluZSBJQ0g2X1JFR19SSVJCU1RTCQkweDVkCi0jZGVmaW5lICAgSUNINl9SQlNUU19JUlEJKDEgPDwgMCkgICAvKiByZXNwb25zZSBpcnEgKi8KLSNkZWZpbmUgICBJQ0g2X1JCU1RTX09WRVJSVU4JKDEgPDwgMikgICAvKiBvdmVycnVuIGlycSAqLwotI2RlZmluZSBJQ0g2X1JFR19SSVJCU0laRQkJMHg1ZQotCi0jZGVmaW5lIElDSDZfUkVHX0lDCQkJMHg2MAotI2RlZmluZSBJQ0g2X1JFR19JUgkJCTB4NjQKLSNkZWZpbmUgSUNINl9SRUdfSVJTCQkJMHg2OAotI2RlZmluZSAgIElDSDZfSVJTX1ZBTElECSgxPDwxKQotI2RlZmluZSAgIElDSDZfSVJTX0JVU1kJCSgxPDwwKQotCi0jZGVmaW5lIElDSDZfUkVHX0RQTEJBU0UJCTB4NzAKLSNkZWZpbmUgSUNINl9SRUdfRFBVQkFTRQkJMHg3NAotI2RlZmluZSAgIElDSDZfRFBMQkFTRV9FTkFCTEUJMHgxCS8qIEVuYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KLQotLyogU0Qgb2Zmc2V0OiBTREkwPTB4ODAsIFNESTE9MHhhMCwgLi4uIFNETzM9MHgxNjAgKi8KLWVudW0geyBTREkwLCBTREkxLCBTREkyLCBTREkzLCBTRE8wLCBTRE8xLCBTRE8yLCBTRE8zIH07Ci0KLS8qIHN0cmVhbSByZWdpc3RlciBvZmZzZXRzIGZyb20gc3RyZWFtIGJhc2UgKi8KLSNkZWZpbmUgSUNINl9SRUdfU0RfQ1RMCQkJMHgwMAotI2RlZmluZSBJQ0g2X1JFR19TRF9TVFMJCQkweDAzCi0jZGVmaW5lIElDSDZfUkVHX1NEX0xQSUIJCTB4MDQKLSNkZWZpbmUgSUNINl9SRUdfU0RfQ0JMCQkJMHgwOAotI2RlZmluZSBJQ0g2X1JFR19TRF9MVkkJCQkweDBjCi0jZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9XCQkweDBlCi0jZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9TSVpFCQkweDEwCi0jZGVmaW5lIElDSDZfUkVHX1NEX0ZPUk1BVAkJMHgxMgotI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQTAkJMHgxOAotI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQVQkJMHgxYwotCi0vKiBQQ0kgc3BhY2UgKi8KLSNkZWZpbmUgSUNINl9QQ0lSRUdfVENTRUwJMHg0NAotCi0vKgotICogb3RoZXIgY29uc3RhbnRzCi0gKi8KLQotLyogbWF4IG51bWJlciBvZiBTRHMgKi8KLS8qIElDSCwgQVRJIGFuZCBWSUEgaGF2ZSA0IHBsYXliYWNrIGFuZCA0IGNhcHR1cmUgKi8KLSNkZWZpbmUgSUNINl9OVU1fQ0FQVFVSRQk0Ci0jZGVmaW5lIElDSDZfTlVNX1BMQVlCQUNLCTQKLQotLyogVUxJIGhhcyA2IHBsYXliYWNrIGFuZCA1IGNhcHR1cmUgKi8KLSNkZWZpbmUgVUxJX05VTV9DQVBUVVJFCQk1Ci0jZGVmaW5lIFVMSV9OVU1fUExBWUJBQ0sJNgotCi0vKiBBVEkgSERNSSBtYXkgaGF2ZSB1cCB0byA4IHBsYXliYWNrcyBhbmQgMCBjYXB0dXJlICovCi0jZGVmaW5lIEFUSUhETUlfTlVNX0NBUFRVUkUJMAotI2RlZmluZSBBVElIRE1JX05VTV9QTEFZQkFDSwk4Ci0KLS8qIFRFUkEgaGFzIDQgcGxheWJhY2sgYW5kIDMgY2FwdHVyZSAqLwotI2RlZmluZSBURVJBX05VTV9DQVBUVVJFCTMKLSNkZWZpbmUgVEVSQV9OVU1fUExBWUJBQ0sJNAotCi0vKiB0aGlzIG51bWJlciBpcyBzdGF0aWNhbGx5IGRlZmluZWQgZm9yIHNpbXBsaWNpdHkgKi8KLSNkZWZpbmUgTUFYX0FaWF9ERVYJCTE2Ci0KLS8qIG1heCBudW1iZXIgb2YgZnJhZ21lbnRzIC0gd2UgbWF5IHVzZSBtb3JlIGlmIGFsbG9jYXRpbmcgbW9yZSBwYWdlcyBmb3IgQkRMICovCi0jZGVmaW5lIEJETF9TSVpFCQk0MDk2Ci0jZGVmaW5lIEFaWF9NQVhfQkRMX0VOVFJJRVMJKEJETF9TSVpFIC8gMTYpCi0jZGVmaW5lIEFaWF9NQVhfRlJBRwkJMzIKLS8qIG1heCBidWZmZXIgc2l6ZSAtIG5vIGgvdyBsaW1pdCwgeW91IGNhbiBpbmNyZWFzZSBhcyB5b3UgbGlrZSAqLwotI2RlZmluZSBBWlhfTUFYX0JVRl9TSVpFCSgxMDI0KjEwMjQqMTAyNCkKLQotLyogUklSQiBpbnQgbWFzazogb3ZlcnJ1blsyXSwgcmVzcG9uc2VbMF0gKi8KLSNkZWZpbmUgUklSQl9JTlRfUkVTUE9OU0UJMHgwMQotI2RlZmluZSBSSVJCX0lOVF9PVkVSUlVOCTB4MDQKLSNkZWZpbmUgUklSQl9JTlRfTUFTSwkJMHgwNQotCi0vKiBTVEFURVNUUyBpbnQgbWFzazogUzMsU0QyLFNEMSxTRDAgKi8KLSNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTgKLSNkZWZpbmUgQVpYX0RFRkFVTFRfQ09ERUNTCTQKLSNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJKCgxIDw8IEFaWF9NQVhfQ09ERUNTKSAtIDEpCi0KLS8qIFNEX0NUTCBiaXRzICovCi0jZGVmaW5lIFNEX0NUTF9TVFJFQU1fUkVTRVQJMHgwMQkvKiBzdHJlYW0gcmVzZXQgYml0ICovCi0jZGVmaW5lIFNEX0NUTF9ETUFfU1RBUlQJMHgwMgkvKiBzdHJlYW0gRE1BIHN0YXJ0IGJpdCAqLwotI2RlZmluZSBTRF9DVExfU1RSSVBFCQkoMyA8PCAxNikJLyogc3RyaXBlIGNvbnRyb2wgKi8KLSNkZWZpbmUgU0RfQ1RMX1RSQUZGSUNfUFJJTwkoMSA8PCAxOCkJLyogdHJhZmZpYyBwcmlvcml0eSAqLwotI2RlZmluZSBTRF9DVExfRElSCQkoMSA8PCAxOSkJLyogYmktZGlyZWN0aW9uYWwgc3RyZWFtICovCi0jZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX01BU0sJKDB4ZiA8PCAyMCkKLSNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9UQUdfU0hJRlQJMjAKLQotLyogU0RfQ1RMIGFuZCBTRF9TVFMgKi8KLSNkZWZpbmUgU0RfSU5UX0RFU0NfRVJSCQkweDEwCS8qIGRlc2NyaXB0b3IgZXJyb3IgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNEX0lOVF9GSUZPX0VSUgkJMHgwOAkvKiBGSUZPIGVycm9yIGludGVycnVwdCAqLwotI2RlZmluZSBTRF9JTlRfQ09NUExFVEUJCTB4MDQJLyogY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0RfSU5UX01BU0sJCShTRF9JTlRfREVTQ19FUlJ8U0RfSU5UX0ZJRk9fRVJSfFwKLQkJCQkgU0RfSU5UX0NPTVBMRVRFKQotCi0vKiBTRF9TVFMgKi8KLSNkZWZpbmUgU0RfU1RTX0ZJRk9fUkVBRFkJMHgyMAkvKiBGSUZPIHJlYWR5ICovCi0KLS8qIElOVENUTCBhbmQgSU5UU1RTICovCi0jZGVmaW5lIElDSDZfSU5UX0FMTF9TVFJFQU0JMHhmZgkgICAvKiBhbGwgc3RyZWFtIGludGVycnVwdHMgKi8KLSNkZWZpbmUgSUNINl9JTlRfQ1RSTF9FTgkweDQwMDAwMDAwIC8qIGNvbnRyb2xsZXIgaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgSUNINl9JTlRfR0xPQkFMX0VOCTB4ODAwMDAwMDAgLyogZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0ICovCi0KLS8qIGJlbG93IGFyZSBzbyBmYXIgaGFyZGNvZGVkIC0gc2hvdWxkIHJlYWQgcmVnaXN0ZXJzIGluIGZ1dHVyZSAqLwotI2RlZmluZSBJQ0g2X01BWF9DT1JCX0VOVFJJRVMJMjU2Ci0jZGVmaW5lIElDSDZfTUFYX1JJUkJfRU5UUklFUwkyNTYKLQotLyogcG9zaXRpb24gZml4IG1vZGUgKi8KLWVudW0gewotCVBPU19GSVhfQVVUTywKLQlQT1NfRklYX0xQSUIsCi0JUE9TX0ZJWF9QT1NCVUYsCi0JUE9TX0ZJWF9WSUFDT01CTywKLQlQT1NfRklYX0NPTUJPLAotfTsKLQotLyogRGVmaW5lcyBmb3IgQVRJIEhEIEF1ZGlvIHN1cHBvcnQgaW4gU0I0NTAgc291dGggYnJpZGdlICovCi0jZGVmaW5lIEFUSV9TQjQ1MF9IREFVRElPX01JU0NfQ05UUjJfQUREUiAgIDB4NDIKLSNkZWZpbmUgQVRJX1NCNDUwX0hEQVVESU9fRU5BQkxFX1NOT09QICAgICAgMHgwMgotCi0vKiBEZWZpbmVzIGZvciBOdmlkaWEgSERBIHN1cHBvcnQgKi8KLSNkZWZpbmUgTlZJRElBX0hEQV9UUkFOU1JFR19BRERSICAgICAgMHg0ZQotI2RlZmluZSBOVklESUFfSERBX0VOQUJMRV9DT0hCSVRTICAgICAweDBmCi0jZGVmaW5lIE5WSURJQV9IREFfSVNUUk1fQ09IICAgICAgICAgIDB4NGQKLSNkZWZpbmUgTlZJRElBX0hEQV9PU1RSTV9DT0ggICAgICAgICAgMHg0YwotI2RlZmluZSBOVklESUFfSERBX0VOQUJMRV9DT0hCSVQgICAgICAweDAxCi0KLS8qIERlZmluZXMgZm9yIEludGVsIFNDSCBIREEgc25vb3AgY29udHJvbCAqLwotI2RlZmluZSBJTlRFTF9TQ0hfSERBX0RFVkMgICAgICAweDc4Ci0jZGVmaW5lIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QICAgICAgICgweDE8PDExKQotCi0vKiBEZWZpbmUgSU4gc3RyZWFtIDAgRklGTyBzaXplIG9mZnNldCBpbiBWSUEgY29udHJvbGxlciAqLwotI2RlZmluZSBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUCTB4OTAKLS8qIERlZmluZSBWSUEgSEQgQXVkaW8gRGV2aWNlIElEKi8KLSNkZWZpbmUgVklBX0hEQUNfREVWSUNFX0lECQkweDMyODgKLQotLyogSEQgQXVkaW8gY2xhc3MgY29kZSAqLwotI2RlZmluZSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9IRF9BVURJTwkweDA0MDMKLQotLyoKLSAqLwotCi1zdHJ1Y3QgYXp4X2RldiB7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJkbDsgLyogQkRMIGJ1ZmZlciAqLwotCXUzMiAqcG9zYnVmOwkJLyogcG9zaXRpb24gYnVmZmVyIHBvaW50ZXIgKi8KLQotCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiBzaXplIG9mIHRoZSBwbGF5IGJ1ZmZlciBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXM7IC8qIHNpemUgb2YgdGhlIHBlcmlvZCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGludCBmcmFnczsJLyogbnVtYmVyIGZvciBwZXJpb2QgaW4gdGhlIHBsYXkgYnVmZmVyICovCi0JdW5zaWduZWQgaW50IGZpZm9fc2l6ZTsJLyogRklGTyBzaXplICovCi0JdW5zaWduZWQgbG9uZyBzdGFydF93YWxsY2xrOwkvKiBzdGFydCArIG1pbmltdW0gd2FsbGNsayAqLwotCXVuc2lnbmVkIGxvbmcgcGVyaW9kX3dhbGxjbGs7CS8qIHdhbGxjbGsgZm9yIHBlcmlvZCAqLwotCi0Jdm9pZCBfX2lvbWVtICpzZF9hZGRyOwkvKiBzdHJlYW0gZGVzY3JpcHRvciBwb2ludGVyICovCi0KLQl1MzIgc2RfaW50X3N0YV9tYXNrOwkvKiBzdHJlYW0gaW50IHN0YXR1cyBtYXNrICovCi0KLQkvKiBwY20gc3VwcG9ydCAqLwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwkvKiBhc3NpZ25lZCBzdWJzdHJlYW0sCi0JCQkJCQkgKiBzZXQgaW4gUENNIG9wZW4KLQkJCQkJCSAqLwotCXVuc2lnbmVkIGludCBmb3JtYXRfdmFsOwkvKiBmb3JtYXQgdmFsdWUgdG8gYmUgc2V0IGluIHRoZQotCQkJCQkgKiBjb250cm9sbGVyIGFuZCB0aGUgY29kZWMKLQkJCQkJICovCi0JdW5zaWduZWQgY2hhciBzdHJlYW1fdGFnOwkvKiBhc3NpZ25lZCBzdHJlYW0gKi8KLQl1bnNpZ25lZCBjaGFyIGluZGV4OwkJLyogc3RyZWFtIGluZGV4ICovCi0JaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KLQotCXVuc2lnbmVkIGludCBvcGVuZWQgOjE7Ci0JdW5zaWduZWQgaW50IHJ1bm5pbmcgOjE7Ci0JdW5zaWduZWQgaW50IGlycV9wZW5kaW5nIDoxOwotCXVuc2lnbmVkIGludCBwcmVwYXJlZDoxOwotCXVuc2lnbmVkIGludCBsb2NrZWQ6MTsKLQkvKgotCSAqIEZvciBWSUE6Ci0JICogIEEgZmxhZyB0byBlbnN1cmUgRE1BIHBvc2l0aW9uIGlzIDAKLQkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCi0JICovCi0JdW5zaWduZWQgaW50IGluc3VmZmljaWVudCA6MTsKLQl1bnNpZ25lZCBpbnQgd2NfbWFya2VkOjE7Ci0JdW5zaWduZWQgaW50IG5vX3BlcmlvZF93YWtldXA6MTsKLQotCXN0cnVjdCB0aW1lY291bnRlciAgYXp4X3RjOwotCXN0cnVjdCBjeWNsZWNvdW50ZXIgYXp4X2NjOwotCi0JaW50IGRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZDsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLQlzdHJ1Y3QgbXV0ZXggZHNwX211dGV4OwotI2VuZGlmCi19OwotCi0vKiBEU1AgbG9jayBoZWxwZXJzICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotI2RlZmluZSBkc3BfbG9ja19pbml0KGRldikJbXV0ZXhfaW5pdCgmKGRldiktPmRzcF9tdXRleCkKLSNkZWZpbmUgZHNwX2xvY2soZGV2KQkJbXV0ZXhfbG9jaygmKGRldiktPmRzcF9tdXRleCkKLSNkZWZpbmUgZHNwX3VubG9jayhkZXYpCQltdXRleF91bmxvY2soJihkZXYpLT5kc3BfbXV0ZXgpCi0jZGVmaW5lIGRzcF9pc19sb2NrZWQoZGV2KQkoKGRldiktPmxvY2tlZCkKLSNlbHNlCi0jZGVmaW5lIGRzcF9sb2NrX2luaXQoZGV2KQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgZHNwX2xvY2soZGV2KQkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGRzcF91bmxvY2soZGV2KQkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGRzcF9pc19sb2NrZWQoZGV2KQkwCi0jZW5kaWYKLQotLyogQ09SQi9SSVJCICovCi1zdHJ1Y3QgYXp4X3JiIHsKLQl1MzIgKmJ1ZjsJCS8qIENPUkIvUklSQiBidWZmZXIKLQkJCQkgKiBFYWNoIENPUkIgZW50cnkgaXMgNGJ5dGUsIFJJUkIgaXMgOGJ5dGUKLQkJCQkgKi8KLQlkbWFfYWRkcl90IGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ09SQi9SSVJCIGJ1ZmZlciAqLwotCS8qIGZvciBSSVJCICovCi0JdW5zaWduZWQgc2hvcnQgcnAsIHdwOwkvKiByZWFkL3dyaXRlIHBvaW50ZXJzICovCi0JaW50IGNtZHNbQVpYX01BWF9DT0RFQ1NdOwkvKiBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLwotCXUzMiByZXNbQVpYX01BWF9DT0RFQ1NdOwkvKiBsYXN0IHJlYWQgdmFsdWUgKi8KLX07Ci0KLXN0cnVjdCBhenhfcGNtIHsKLQlzdHJ1Y3QgYXp4ICpjaGlwOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mb1syXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgYXp4IHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaTsKLQlpbnQgZGV2X2luZGV4OwotCi0JLyogY2hpcCB0eXBlIHNwZWNpZmljICovCi0JaW50IGRyaXZlcl90eXBlOwotCXVuc2lnbmVkIGludCBkcml2ZXJfY2FwczsKLQlpbnQgcGxheWJhY2tfc3RyZWFtczsKLQlpbnQgcGxheWJhY2tfaW5kZXhfb2Zmc2V0OwotCWludCBjYXB0dXJlX3N0cmVhbXM7Ci0JaW50IGNhcHR1cmVfaW5kZXhfb2Zmc2V0OwotCWludCBudW1fc3RyZWFtczsKLQotCS8qIHBjaSByZXNvdXJjZXMgKi8KLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOwotCWludCBpcnE7Ci0KLQkvKiBsb2NrcyAqLwotCXNwaW5sb2NrX3QgcmVnX2xvY2s7Ci0Jc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Ci0Jc3RydWN0IGNvbXBsZXRpb24gcHJvYmVfd2FpdDsKLQotCS8qIHN0cmVhbXMgKHggbnVtX3N0cmVhbXMpICovCi0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7Ci0KLQkvKiBQQ00gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHBjbV9saXN0OyAvKiBhenhfcGNtIGxpc3QgKi8KLQotCS8qIEhEIGNvZGVjICovCi0JdW5zaWduZWQgc2hvcnQgY29kZWNfbWFzazsKLQlpbnQgIGNvZGVjX3Byb2JlX21hc2s7IC8qIGNvcGllZCBmcm9tIHByb2JlX21hc2sgb3B0aW9uICovCi0Jc3RydWN0IGhkYV9idXMgKmJ1czsKLQl1bnNpZ25lZCBpbnQgYmVlcF9tb2RlOwotCi0JLyogQ09SQi9SSVJCICovCi0Jc3RydWN0IGF6eF9yYiBjb3JiOwotCXN0cnVjdCBhenhfcmIgcmlyYjsKLQotCS8qIENPUkIvUklSQiBhbmQgcG9zaXRpb24gYnVmZmVycyAqLwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciByYjsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcG9zYnVmOwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCi0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLSNlbmRpZgotCi0JLyogZmxhZ3MgKi8KLQlpbnQgcG9zaXRpb25fZml4WzJdOyAvKiBmb3IgYm90aCBwbGF5YmFjay9jYXB0dXJlIHN0cmVhbXMgKi8KLQlpbnQgcG9sbF9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcnVubmluZyA6MTsKLQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQgOjE7Ci0JdW5zaWduZWQgaW50IHNpbmdsZV9jbWQgOjE7Ci0JdW5zaWduZWQgaW50IHBvbGxpbmdfbW9kZSA6MTsKLQl1bnNpZ25lZCBpbnQgbXNpIDoxOwotCXVuc2lnbmVkIGludCBpcnFfcGVuZGluZ193YXJuZWQgOjE7Ci0JdW5zaWduZWQgaW50IHByb2JpbmcgOjE7IC8qIGNvZGVjIHByb2JpbmcgcGhhc2UgKi8KLQl1bnNpZ25lZCBpbnQgc25vb3A6MTsKLQl1bnNpZ25lZCBpbnQgYWxpZ25fYnVmZmVyX3NpemU6MTsKLQl1bnNpZ25lZCBpbnQgcmVnaW9uX3JlcXVlc3RlZDoxOwotCi0JLyogVkdBLXN3aXRjaGVyb28gc2V0dXAgKi8KLQl1bnNpZ25lZCBpbnQgdXNlX3ZnYV9zd2l0Y2hlcm9vOjE7Ci0JdW5zaWduZWQgaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyZWQ6MTsKLQl1bnNpZ25lZCBpbnQgaW5pdF9mYWlsZWQ6MTsgLyogZGVsYXllZCBpbml0IGZhaWxlZCAqLwotCXVuc2lnbmVkIGludCBkaXNhYmxlZDoxOyAvKiBkaXNhYmxlZCBieSBWR0Etc3dpdGNoZXIgKi8KLQotCS8qIGZvciBkZWJ1Z2dpbmcgKi8KLQl1bnNpZ25lZCBpbnQgbGFzdF9jbWRbQVpYX01BWF9DT0RFQ1NdOwotCi0JLyogZm9yIHBlbmRpbmcgaXJxcyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfcGVuZGluZ193b3JrOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHByb2JlX3dvcms7Ci0KLQkvKiByZWJvb3Qgbm90aWZpZXIgKGZvciBteXN0ZXJpb3VzIGhhbmd1cCBwcm9ibGVtIGF0IHBvd2VyLWRvd24pICovCi0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJlYm9vdF9ub3RpZmllcjsKLQotCS8qIGNhcmQgbGlzdCAoZm9yIHBvd2VyX3NhdmUgdHJpZ2dlcikgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCi0Jc3RydWN0IGF6eF9kZXYgc2F2ZWRfYXp4X2RldjsKLSNlbmRpZgotCi0JLyogc2Vjb25kYXJ5IHBvd2VyIGRvbWFpbiBmb3IgaGRtaSBhdWRpbyB1bmRlciB2Z2EgZGV2aWNlICovCi0Jc3RydWN0IGRldl9wbV9kb21haW4gaGRtaV9wbV9kb21haW47Ci19OwotCi0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKLSNpbmNsdWRlICJoZGFfaW50ZWxfdHJhY2UuaCIKIAogLyogZHJpdmVyIHR5cGVzICovCiBlbnVtIHsKQEAgLTU4NCwyOCArMjI0LDYgQEAKIAlBWlhfTlVNX0RSSVZFUlMsIC8qIGtlZXAgdGhpcyBhcyBsYXN0IGVudHJ5ICovCiB9OwogCi0vKiBkcml2ZXIgcXVpcmtzIChjYXBhYmlsaXRpZXMpICovCi0vKiBiaXRzIDAtNyBhcmUgdXNlZCBmb3IgaW5kaWNhdGluZyBkcml2ZXIgdHlwZSAqLwotI2RlZmluZSBBWlhfRENBUFNfTk9fVENTRUwJKDEgPDwgOCkJLyogTm8gSW50ZWwgVENTRUwgYml0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19OT19NU0kJKDEgPDwgOSkJLyogTm8gTVNJIHN1cHBvcnQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0FUSV9TTk9PUAkoMSA8PCAxMCkJLyogQVRJIHNub29wIGVuYWJsZSAqLwotI2RlZmluZSBBWlhfRENBUFNfTlZJRElBX1NOT09QCSgxIDw8IDExKQkvKiBOdmlkaWEgc25vb3AgZW5hYmxlICovCi0jZGVmaW5lIEFaWF9EQ0FQU19TQ0hfU05PT1AJKDEgPDwgMTIpCS8qIFNDSC9QQ0ggc25vb3AgZW5hYmxlICovCi0jZGVmaW5lIEFaWF9EQ0FQU19SSVJCX0RFTEFZCSgxIDw8IDEzKQkvKiBMb25nIGRlbGF5IGluIHJlYWQgbG9vcCAqLwotI2RlZmluZSBBWlhfRENBUFNfUklSQl9QUkVfREVMQVkgKDEgPDwgMTQpCS8qIFB1dCBhIGRlbGF5IGJlZm9yZSByZWFkICovCi0jZGVmaW5lIEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCAoMSA8PCAxNSkJLyogWC1GaSB3b3JrYXJvdW5kICovCi0jZGVmaW5lIEFaWF9EQ0FQU19QT1NGSVhfTFBJQgkoMSA8PCAxNikJLyogVXNlIExQSUIgYXMgZGVmYXVsdCAqLwotI2RlZmluZSBBWlhfRENBUFNfUE9TRklYX1ZJQQkoMSA8PCAxNykJLyogVXNlIFZJQUNPTUJPIGFzIGRlZmF1bHQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX05PXzY0QklUCSgxIDw8IDE4KQkvKiBObyA2NGJpdCBhZGRyZXNzICovCi0jZGVmaW5lIEFaWF9EQ0FQU19TWU5DX1dSSVRFCSgxIDw8IDE5KQkvKiBzeW5jIGVhY2ggY21kIHdyaXRlICovCi0jZGVmaW5lIEFaWF9EQ0FQU19PTERfU1NZTkMJKDEgPDwgMjApCS8qIE9sZCBTU1lOQyByZWcgZm9yIElDSCAqLwotI2RlZmluZSBBWlhfRENBUFNfQlVGU0laRQkoMSA8PCAyMSkJLyogbm8gYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19BTElHTl9CVUZTSVpFCSgxIDw8IDIyKQkvKiBidWZmZXIgc2l6ZSBhbGlnbm1lbnQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTXzRLX0JETEVfQk9VTkRBUlkgKDEgPDwgMjMpCS8qIEJETEUgaW4gNGsgYm91bmRhcnkgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVkgICgxIDw8IDI1KQkvKiBUYWtlIExQSUIgYXMgZGVsYXkgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1BNX1JVTlRJTUUJKDEgPDwgMjYpCS8qIHJ1bnRpbWUgUE0gc3VwcG9ydCAqLwotI2RlZmluZSBBWlhfRENBUFNfSTkxNV9QT1dFUldFTEwgKDEgPDwgMjcpCS8qIEhTVyBpOTE1IHBvd2VyIHdlbGwgc3VwcG9ydCAqLwotCiAvKiBxdWlya3MgZm9yIEludGVsIFBDSCAqLwogI2RlZmluZSBBWlhfRENBUFNfSU5URUxfUENIX05PUE0gXAogCShBWlhfRENBUFNfU0NIX1NOT09QIHwgQVpYX0RDQVBTX0JVRlNJWkUgfCBcCkBAIC02NjMsMzggKzI4MSw2IEBACiAJW0FaWF9EUklWRVJfR0VORVJJQ10gPSAiSEQtQXVkaW8gR2VuZXJpYyIsCiB9OwogCi0vKgotICogbWFjcm9zIGZvciBlYXN5IHVzZQotICovCi0jZGVmaW5lIGF6eF93cml0ZWwoY2hpcCxyZWcsdmFsdWUpIFwKLQl3cml0ZWwodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfcmVhZGwoY2hpcCxyZWcpIFwKLQlyZWFkbCgoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3dyaXRldyhjaGlwLHJlZyx2YWx1ZSkgXAotCXdyaXRldyh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9yZWFkdyhjaGlwLHJlZykgXAotCXJlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfd3JpdGViKGNoaXAscmVnLHZhbHVlKSBcCi0Jd3JpdGViKHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3JlYWRiKGNoaXAscmVnKSBcCi0JcmVhZGIoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0KLSNkZWZpbmUgYXp4X3NkX3dyaXRlbChkZXYscmVnLHZhbHVlKSBcCi0Jd3JpdGVsKHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfc2RfcmVhZGwoZGV2LHJlZykgXAotCXJlYWRsKChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9zZF93cml0ZXcoZGV2LHJlZyx2YWx1ZSkgXAotCXdyaXRldyh2YWx1ZSwgKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3NkX3JlYWR3KGRldixyZWcpIFwKLQlyZWFkdygoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfc2Rfd3JpdGViKGRldixyZWcsdmFsdWUpIFwKLQl3cml0ZWIodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9zZF9yZWFkYihkZXYscmVnKSBcCi0JcmVhZGIoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLQotLyogZm9yIHBjbSBzdXBwb3J0ICovCi0jZGVmaW5lIGdldF9henhfZGV2KHN1YnN0cmVhbSkgKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKQotCiAjaWZkZWYgQ09ORklHX1g4Ngogc3RhdGljIHZvaWQgX19tYXJrX3BhZ2VzX3djKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiwgYm9vbCBvbikKIHsKQEAgLTc0OSw1NzggKzMzNSw2IEBACiAjZW5kaWYKIAogc3RhdGljIGludCBhenhfYWNxdWlyZV9pcnEoc3RydWN0IGF6eCAqY2hpcCwgaW50IGRvX2Rpc2Nvbm5lY3QpOwotc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IHZhbCk7Ci0vKgotICogSW50ZXJmYWNlIGZvciBIRCBjb2RlYwotICovCi0KLS8qCi0gKiBDT1JCIC8gUklSQiBpbnRlcmZhY2UKLSAqLwotc3RhdGljIGludCBhenhfYWxsb2NfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaW50IGVycjsKLQotCS8qIHNpbmdsZSBwYWdlIChhdCBsZWFzdCA0MDk2IGJ5dGVzKSBtdXN0IHN1ZmZpY2UgZm9yIGJvdGggcmluZ2J1ZmZlcyAqLwotCWVyciA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLAotCQkJCSAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCSAgUEFHRV9TSVpFLCAmY2hpcC0+cmIpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogY2Fubm90IGFsbG9jYXRlIENPUkIvUklSQlxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnJiLCB0cnVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2luaXRfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCi17Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCS8qIENPUkIgc2V0IHVwICovCi0JY2hpcC0+Y29yYi5hZGRyID0gY2hpcC0+cmIuYWRkcjsKLQljaGlwLT5jb3JiLmJ1ZiA9ICh1MzIgKiljaGlwLT5yYi5hcmVhOwotCWF6eF93cml0ZWwoY2hpcCwgQ09SQkxCQVNFLCAodTMyKWNoaXAtPmNvcmIuYWRkcik7Ci0JYXp4X3dyaXRlbChjaGlwLCBDT1JCVUJBU0UsIHVwcGVyXzMyX2JpdHMoY2hpcC0+Y29yYi5hZGRyKSk7Ci0KLQkvKiBzZXQgdGhlIGNvcmIgc2l6ZSB0byAyNTYgZW50cmllcyAoVUxJIHJlcXVpcmVzIGV4cGxpY2l0bHkpICovCi0JYXp4X3dyaXRlYihjaGlwLCBDT1JCU0laRSwgMHgwMik7Ci0JLyogc2V0IHRoZSBjb3JiIHdyaXRlIHBvaW50ZXIgdG8gMCAqLwotCWF6eF93cml0ZXcoY2hpcCwgQ09SQldQLCAwKTsKLQkvKiByZXNldCB0aGUgY29yYiBodyByZWFkIHBvaW50ZXIgKi8KLQlhenhfd3JpdGV3KGNoaXAsIENPUkJSUCwgSUNINl9DT1JCUlBfUlNUKTsKLQkvKiBlbmFibGUgY29yYiBkbWEgKi8KLQlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIElDSDZfQ09SQkNUTF9SVU4pOwotCi0JLyogUklSQiBzZXQgdXAgKi8KLQljaGlwLT5yaXJiLmFkZHIgPSBjaGlwLT5yYi5hZGRyICsgMjA0ODsKLQljaGlwLT5yaXJiLmJ1ZiA9ICh1MzIgKikoY2hpcC0+cmIuYXJlYSArIDIwNDgpOwotCWNoaXAtPnJpcmIud3AgPSBjaGlwLT5yaXJiLnJwID0gMDsKLQltZW1zZXQoY2hpcC0+cmlyYi5jbWRzLCAwLCBzaXplb2YoY2hpcC0+cmlyYi5jbWRzKSk7Ci0JYXp4X3dyaXRlbChjaGlwLCBSSVJCTEJBU0UsICh1MzIpY2hpcC0+cmlyYi5hZGRyKTsKLQlhenhfd3JpdGVsKGNoaXAsIFJJUkJVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5yaXJiLmFkZHIpKTsKLQotCS8qIHNldCB0aGUgcmlyYiBzaXplIHRvIDI1NiBlbnRyaWVzIChVTEkgcmVxdWlyZXMgZXhwbGljaXRseSkgKi8KLQlhenhfd3JpdGViKGNoaXAsIFJJUkJTSVpFLCAweDAyKTsKLQkvKiByZXNldCB0aGUgcmlyYiBodyB3cml0ZSBwb2ludGVyICovCi0JYXp4X3dyaXRldyhjaGlwLCBSSVJCV1AsIElDSDZfUklSQldQX1JTVCk7Ci0JLyogc2V0IE49MSwgZ2V0IFJJUkIgcmVzcG9uc2UgaW50ZXJydXB0IGZvciBuZXcgZW50cnkgKi8KLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQpCi0JCWF6eF93cml0ZXcoY2hpcCwgUklOVENOVCwgMHhjMCk7Ci0JZWxzZQotCQlhenhfd3JpdGV3KGNoaXAsIFJJTlRDTlQsIDEpOwotCS8qIGVuYWJsZSByaXJiIGRtYSBhbmQgcmVzcG9uc2UgaXJxICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCQ1RMLCBJQ0g2X1JCQ1RMX0RNQV9FTiB8IElDSDZfUkJDVExfSVJRX0VOKTsKLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2ZyZWVfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCi17Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCS8qIGRpc2FibGUgcmluZ2J1ZmZlciBETUFzICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCQ1RMLCAwKTsKLQlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIDApOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9jb21tYW5kX2FkZHIodTMyIGNtZCkKLXsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGNtZCA+PiAyODsKLQotCWlmIChhZGRyID49IEFaWF9NQVhfQ09ERUNTKSB7Ci0JCXNuZF9CVUcoKTsKLQkJYWRkciA9IDA7Ci0JfQotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3Jlc3BvbnNlX2FkZHIodTMyIHJlcykKLXsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IHJlcyAmIDB4ZjsKLQotCWlmIChhZGRyID49IEFaWF9NQVhfQ09ERUNTKSB7Ci0JCXNuZF9CVUcoKTsKLQkJYWRkciA9IDA7Ci0JfQotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qIHNlbmQgYSBjb21tYW5kICovCi1zdGF0aWMgaW50IGF6eF9jb3JiX3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBhZGRyID0gYXp4X2NvbW1hbmRfYWRkcih2YWwpOwotCXVuc2lnbmVkIGludCB3cCwgcnA7Ci0KLQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQkvKiBhZGQgY29tbWFuZCB0byBjb3JiICovCi0Jd3AgPSBhenhfcmVhZHcoY2hpcCwgQ09SQldQKTsKLQlpZiAod3AgPT0gMHhmZmZmKSB7Ci0JCS8qIHNvbWV0aGluZyB3cm9uZywgY29udHJvbGxlciBsaWtlbHkgdHVybmVkIHRvIEQzICovCi0JCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0Jd3ArKzsKLQl3cCAlPSBJQ0g2X01BWF9DT1JCX0VOVFJJRVM7Ci0KLQlycCA9IGF6eF9yZWFkdyhjaGlwLCBDT1JCUlApOwotCWlmICh3cCA9PSBycCkgewotCQkvKiBvb3BzLCBpdCdzIGZ1bGwgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWNoaXAtPnJpcmIuY21kc1thZGRyXSsrOwotCWNoaXAtPmNvcmIuYnVmW3dwXSA9IGNwdV90b19sZTMyKHZhbCk7Ci0JYXp4X3dyaXRlbChjaGlwLCBDT1JCV1AsIHdwKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgSUNINl9SSVJCX0VYX1VOU09MX0VWCSgxPDw0KQotCi0vKiByZXRyaWV2ZSBSSVJCIGVudHJ5IC0gY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIgKi8KLXN0YXRpYyB2b2lkIGF6eF91cGRhdGVfcmlyYihzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXVuc2lnbmVkIGludCBycCwgd3A7Ci0JdW5zaWduZWQgaW50IGFkZHI7Ci0JdTMyIHJlcywgcmVzX2V4OwotCi0Jd3AgPSBhenhfcmVhZHcoY2hpcCwgUklSQldQKTsKLQlpZiAod3AgPT0gMHhmZmZmKSB7Ci0JCS8qIHNvbWV0aGluZyB3cm9uZywgY29udHJvbGxlciBsaWtlbHkgdHVybmVkIHRvIEQzICovCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAod3AgPT0gY2hpcC0+cmlyYi53cCkKLQkJcmV0dXJuOwotCWNoaXAtPnJpcmIud3AgPSB3cDsKLQotCXdoaWxlIChjaGlwLT5yaXJiLnJwICE9IHdwKSB7Ci0JCWNoaXAtPnJpcmIucnArKzsKLQkJY2hpcC0+cmlyYi5ycCAlPSBJQ0g2X01BWF9SSVJCX0VOVFJJRVM7Ci0KLQkJcnAgPSBjaGlwLT5yaXJiLnJwIDw8IDE7IC8qIGFuIFJJUkIgZW50cnkgaXMgOC1ieXRlcyAqLwotCQlyZXNfZXggPSBsZTMyX3RvX2NwdShjaGlwLT5yaXJiLmJ1ZltycCArIDFdKTsKLQkJcmVzID0gbGUzMl90b19jcHUoY2hpcC0+cmlyYi5idWZbcnBdKTsKLQkJYWRkciA9IGF6eF9yZXNwb25zZV9hZGRyKHJlc19leCk7Ci0JCWlmIChyZXNfZXggJiBJQ0g2X1JJUkJfRVhfVU5TT0xfRVYpCi0JCQlzbmRfaGRhX3F1ZXVlX3Vuc29sX2V2ZW50KGNoaXAtPmJ1cywgcmVzLCByZXNfZXgpOwotCQllbHNlIGlmIChjaGlwLT5yaXJiLmNtZHNbYWRkcl0pIHsKLQkJCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gcmVzOwotCQkJc21wX3dtYigpOwotCQkJY2hpcC0+cmlyYi5jbWRzW2FkZHJdLS07Ci0JCX0gZWxzZSBpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IHNwdXJpb3VzIHJlc3BvbnNlICUjeDolI3gsIGxhc3QgY21kPSUjMDh4XG4iLAotCQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksCi0JCQkJICAgcmVzLCByZXNfZXgsCi0JCQkJICAgY2hpcC0+bGFzdF9jbWRbYWRkcl0pOwotCQl9Ci0JfQotfQotCi0vKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3JpcmJfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJCSAgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGxvb3Bjb3VudGVyOwotCWludCBkb19wb2xsID0gMDsKLQotIGFnYWluOgotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKLQotCWZvciAobG9vcGNvdW50ZXIgPSAwOzsgbG9vcGNvdW50ZXIrKykgewotCQlpZiAoY2hpcC0+cG9sbGluZ19tb2RlIHx8IGRvX3BvbGwpIHsKLQkJCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkJCWF6eF91cGRhdGVfcmlyYihjaGlwKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCQl9Ci0JCWlmICghY2hpcC0+cmlyYi5jbWRzW2FkZHJdKSB7Ci0JCQlzbXBfcm1iKCk7Ci0JCQlidXMtPnJpcmJfZXJyb3IgPSAwOwotCi0JCQlpZiAoIWRvX3BvbGwpCi0JCQkJY2hpcC0+cG9sbF9jb3VudCA9IDA7Ci0JCQlyZXR1cm4gY2hpcC0+cmlyYi5yZXNbYWRkcl07IC8qIHRoZSBsYXN0IHZhbHVlICovCi0JCX0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQlicmVhazsKLQkJaWYgKGJ1cy0+bmVlZHNfZGFtbl9sb25nX2RlbGF5IHx8IGxvb3Bjb3VudGVyID4gMzAwMCkKLQkJCW1zbGVlcCgyKTsgLyogdGVtcG9yYXJ5IHdvcmthcm91bmQgKi8KLQkJZWxzZSB7Ci0JCQl1ZGVsYXkoMTApOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCX0KLQl9Ci0KLQlpZiAoIWJ1cy0+bm9fcmVzcG9uc2VfZmFsbGJhY2spCi0JCXJldHVybiAtMTsKLQotCWlmICghY2hpcC0+cG9sbGluZ19tb2RlICYmIGNoaXAtPnBvbGxfY291bnQgPCAyKSB7Ci0JCXNuZF9wcmludGRkKFNGWCAiJXM6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgotCQkJICAgInBvbGxpbmcgdGhlIGNvZGVjIG9uY2U6IGxhc3QgY21kPTB4JTA4eFxuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKLQkJZG9fcG9sbCA9IDE7Ci0JCWNoaXAtPnBvbGxfY291bnQrKzsKLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQotCWlmICghY2hpcC0+cG9sbGluZ19tb2RlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgotCQkJICAgInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGU6IGxhc3QgY21kPTB4JTA4eFxuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKLQkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQlpZiAoY2hpcC0+bXNpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IE5vIHJlc3BvbnNlIGZyb20gY29kZWMsICIKLQkJCSAgICJkaXNhYmxpbmcgTVNJOiBsYXN0IGNtZD0weCUwOHhcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBjaGlwLT5sYXN0X2NtZFthZGRyXSk7Ci0JCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7Ci0JCWNoaXAtPmlycSA9IC0xOwotCQlwY2lfZGlzYWJsZV9tc2koY2hpcC0+cGNpKTsKLQkJY2hpcC0+bXNpID0gMDsKLQkJaWYgKGF6eF9hY3F1aXJlX2lycShjaGlwLCAxKSA8IDApIHsKLQkJCWJ1cy0+cmlyYl9lcnJvciA9IDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQlpZiAoY2hpcC0+cHJvYmluZykgewotCQkvKiBJZiB0aGlzIGNyaXRpY2FsIHRpbWVvdXQgaGFwcGVucyBkdXJpbmcgdGhlIGNvZGVjIHByb2JpbmcKLQkJICogcGhhc2UsIHRoaXMgaXMgbGlrZWx5IGFuIGFjY2VzcyB0byBhIG5vbi1leGlzdGluZyBjb2RlYwotCQkgKiBzbG90LiAgQmV0dGVyIHRvIHJldHVybiBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIHN5c3RlbS4KLQkJICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBhIGZhdGFsIGNvbW11bmljYXRpb24gZXJyb3I7IG5lZWQgZWl0aGVyIHRvIHJlc2V0IG9yIHRvIGZhbGxiYWNrCi0JICogdG8gdGhlIHNpbmdsZV9jbWQgbW9kZQotCSAqLwotCWJ1cy0+cmlyYl9lcnJvciA9IDE7Ci0JaWYgKGJ1cy0+YWxsb3dfYnVzX3Jlc2V0ICYmICFidXMtPnJlc3BvbnNlX3Jlc2V0ICYmICFidXMtPmluX3Jlc2V0KSB7Ci0JCWJ1cy0+cmVzcG9uc2VfcmVzZXQgPSAxOwotCQlyZXR1cm4gLTE7IC8qIGdpdmUgYSBjaGFuY2UgdG8gcmV0cnkgKi8KLQl9Ci0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfaW50ZWw6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgotCQkgICAic3dpdGNoaW5nIHRvIHNpbmdsZV9jbWQgbW9kZTogbGFzdCBjbWQ9MHglMDh4XG4iLAotCQkgICBjaGlwLT5sYXN0X2NtZFthZGRyXSk7Ci0JY2hpcC0+c2luZ2xlX2NtZCA9IDE7Ci0JYnVzLT5yZXNwb25zZV9yZXNldCA9IDA7Ci0JLyogcmVsZWFzZSBDT1JCL1JJUkIgKi8KLQlhenhfZnJlZV9jbWRfaW8oY2hpcCk7Ci0JLyogZGlzYWJsZSB1bnNvbGljaXRlZCByZXNwb25zZXMgKi8KLQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSAmIH5JQ0g2X0dDVExfVU5TT0wpOwotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIFVzZSB0aGUgc2luZ2xlIGltbWVkaWF0ZSBjb21tYW5kIGluc3RlYWQgb2YgQ09SQi9SSVJCIGZvciBzaW1wbGljaXR5Ci0gKgotICogTm90ZTogYWNjb3JkaW5nIHRvIEludGVsLCB0aGlzIGlzIG5vdCBwcmVmZXJyZWQgdXNlLiAgVGhlIGNvbW1hbmQgd2FzCi0gKiAgICAgICBpbnRlbmRlZCBmb3IgdGhlIEJJT1Mgb25seSwgYW5kIG1heSBnZXQgY29uZnVzZWQgd2l0aCB1bnNvbGljaXRlZAotICogICAgICAgcmVzcG9uc2VzLiAgU28sIHdlIHNob3VsZG4ndCB1c2UgaXQgZm9yIG5vcm1hbCBvcGVyYXRpb24gZnJvbSB0aGUKLSAqICAgICAgIGRyaXZlci4KLSAqICAgICAgIEkgbGVmdCB0aGUgY29kZXMsIGhvd2V2ZXIsIGZvciBkZWJ1Z2dpbmcvdGVzdGluZyBwdXJwb3Nlcy4KLSAqLwotCi0vKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KLXN0YXRpYyBpbnQgYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgYXp4ICpjaGlwLCB1bnNpZ25lZCBpbnQgYWRkcikKLXsKLQlpbnQgdGltZW91dCA9IDUwOwotCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQkvKiBjaGVjayBJUlYgYnVzeSBiaXQgKi8KLQkJaWYgKGF6eF9yZWFkdyhjaGlwLCBJUlMpICYgSUNINl9JUlNfVkFMSUQpIHsKLQkJCS8qIHJldXNlIHJpcmIucmVzIGFzIHRoZSByZXNwb25zZSByZXR1cm4gdmFsdWUgKi8KLQkJCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gYXp4X3JlYWRsKGNoaXAsIElSKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXVkZWxheSgxKTsKLQl9Ci0JaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJc25kX3ByaW50ZChTRlggIiVzOiBnZXRfcmVzcG9uc2UgdGltZW91dDogSVJTPTB4JXhcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBhenhfcmVhZHcoY2hpcCwgSVJTKSk7Ci0JY2hpcC0+cmlyYi5yZXNbYWRkcl0gPSAtMTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotLyogc2VuZCBhIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQgYXp4X3NpbmdsZV9zZW5kX2NtZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgdmFsKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGF6eF9jb21tYW5kX2FkZHIodmFsKTsKLQlpbnQgdGltZW91dCA9IDUwOwotCi0JYnVzLT5yaXJiX2Vycm9yID0gMDsKLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCS8qIGNoZWNrIElDQiBidXN5IGJpdCAqLwotCQlpZiAoISgoYXp4X3JlYWR3KGNoaXAsIElSUykgJiBJQ0g2X0lSU19CVVNZKSkpIHsKLQkJCS8qIENsZWFyIElSViB2YWxpZCBiaXQgKi8KLQkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8Ci0JCQkJICAgSUNINl9JUlNfVkFMSUQpOwotCQkJYXp4X3dyaXRlbChjaGlwLCBJQywgdmFsKTsKLQkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8Ci0JCQkJICAgSUNINl9JUlNfQlVTWSk7Ci0JCQlyZXR1cm4gYXp4X3NpbmdsZV93YWl0X2Zvcl9yZXNwb25zZShjaGlwLCBhZGRyKTsKLQkJfQotCQl1ZGVsYXkoMSk7Ci0JfQotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXNuZF9wcmludGQoU0ZYICIlczogc2VuZF9jbWQgdGltZW91dDogSVJTPTB4JXgsIHZhbD0weCV4XG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgYXp4X3JlYWR3KGNoaXAsIElSUyksIHZhbCk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qIHJlY2VpdmUgYSByZXNwb25zZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhenhfc2luZ2xlX2dldF9yZXNwb25zZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJCQkgICAgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXJldHVybiBjaGlwLT5yaXJiLnJlc1thZGRyXTsKLX0KLQotLyoKLSAqIFRoZSBiZWxvdyBhcmUgdGhlIG1haW4gY2FsbGJhY2tzIGZyb20gaGRhX2NvZGVjLgotICoKLSAqIFRoZXkgYXJlIGp1c3QgdGhlIHNrZWxldG9uIHRvIGNhbGwgc3ViLWNhbGxiYWNrcyBhY2NvcmRpbmcgdG8gdGhlCi0gKiBjdXJyZW50IHNldHRpbmcgb2YgY2hpcC0+c2luZ2xlX2NtZC4KLSAqLwotCi0vKiBzZW5kIGEgY29tbWFuZCAqLwotc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoY2hpcC0+ZGlzYWJsZWQpCi0JCXJldHVybiAwOwotCWNoaXAtPmxhc3RfY21kW2F6eF9jb21tYW5kX2FkZHIodmFsKV0gPSB2YWw7Ci0JaWYgKGNoaXAtPnNpbmdsZV9jbWQpCi0JCXJldHVybiBhenhfc2luZ2xlX3NlbmRfY21kKGJ1cywgdmFsKTsKLQllbHNlCi0JCXJldHVybiBhenhfY29yYl9zZW5kX2NtZChidXMsIHZhbCk7Ci19Ci0KLS8qIGdldCBhIHJlc3BvbnNlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBhZGRyKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQlpZiAoY2hpcC0+ZGlzYWJsZWQpCi0JCXJldHVybiAwOwotCWlmIChjaGlwLT5zaW5nbGVfY21kKQotCQlyZXR1cm4gYXp4X3NpbmdsZV9nZXRfcmVzcG9uc2UoYnVzLCBhZGRyKTsKLQllbHNlCi0JCXJldHVybiBhenhfcmlyYl9nZXRfcmVzcG9uc2UoYnVzLCBhZGRyKTsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHZvaWQgYXp4X3Bvd2VyX25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHBvd2VyX3VwKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotc3RhdGljIGludCBhenhfbG9hZF9kc3BfcHJlcGFyZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZm9ybWF0LAotCQkJCXVuc2lnbmVkIGludCBieXRlX3NpemUsCi0JCQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWZwKTsKLXN0YXRpYyB2b2lkIGF6eF9sb2FkX2RzcF90cmlnZ2VyKHN0cnVjdCBoZGFfYnVzICpidXMsIGJvb2wgc3RhcnQpOwotc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX2NsZWFudXAoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKTsKLSNlbmRpZgotCi0vKiBlbnRlciBsaW5rIHJlc2V0ICovCi1zdGF0aWMgdm9pZCBhenhfZW50ZXJfbGlua19yZXNldChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KLQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSAmIH5JQ0g2X0dDVExfUkVTRVQpOwotCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7Ci0Jd2hpbGUgKChhenhfcmVhZGIoY2hpcCwgR0NUTCkgJiBJQ0g2X0dDVExfUkVTRVQpICYmCi0JCQl0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKLQkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7Ci19Ci0KLS8qIGV4aXQgbGluayByZXNldCAqLwotc3RhdGljIHZvaWQgYXp4X2V4aXRfbGlua19yZXNldChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCWF6eF93cml0ZWIoY2hpcCwgR0NUTCwgYXp4X3JlYWRiKGNoaXAsIEdDVEwpIHwgSUNINl9HQ1RMX1JFU0VUKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwotCXdoaWxlICghYXp4X3JlYWRiKGNoaXAsIEdDVEwpICYmCi0JCQl0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKLQkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7Ci19Ci0KLS8qIHJlc2V0IGNvZGVjIGxpbmsgKi8KLXN0YXRpYyBpbnQgYXp4X3Jlc2V0KHN0cnVjdCBhenggKmNoaXAsIGludCBmdWxsX3Jlc2V0KQotewotCWlmICghZnVsbF9yZXNldCkKLQkJZ290byBfX3NraXA7Ci0KLQkvKiBjbGVhciBTVEFURVNUUyAqLwotCWF6eF93cml0ZXcoY2hpcCwgU1RBVEVTVFMsIFNUQVRFU1RTX0lOVF9NQVNLKTsKLQotCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KLQlhenhfZW50ZXJfbGlua19yZXNldChjaGlwKTsKLQotCS8qIGRlbGF5IGZvciA+PSAxMDB1cyBmb3IgY29kZWMgUExMIHRvIHNldHRsZSBwZXIgc3BlYwotCSAqIFJldiAwLjkgc2VjdGlvbiA1LjUuMQotCSAqLwotCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOwotCi0JLyogQnJpbmcgY29udHJvbGxlciBvdXQgb2YgcmVzZXQgKi8KLQlhenhfZXhpdF9saW5rX3Jlc2V0KGNoaXApOwotCi0JLyogQnJlbnQgQ2hhcnRyYW5kIHNhaWQgdG8gd2FpdCA+PSA1NDB1cyBmb3IgY29kZWNzIHRvIGluaXRpYWxpemUgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTIwMCk7Ci0KLSAgICAgIF9fc2tpcDoKLQkvKiBjaGVjayB0byBzZWUgaWYgY29udHJvbGxlciBpcyByZWFkeSAqLwotCWlmICghYXp4X3JlYWRiKGNoaXAsIEdDVEwpKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogYXp4X3Jlc2V0OiBjb250cm9sbGVyIG5vdCByZWFkeSFcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIEFjY2VwdCB1bnNvbGljaXRlZCByZXNwb25zZXMgKi8KLQlpZiAoIWNoaXAtPnNpbmdsZV9jbWQpCi0JCWF6eF93cml0ZWwoY2hpcCwgR0NUTCwgYXp4X3JlYWRsKGNoaXAsIEdDVEwpIHwKLQkJCSAgIElDSDZfR0NUTF9VTlNPTCk7Ci0KLQkvKiBkZXRlY3QgY29kZWNzICovCi0JaWYgKCFjaGlwLT5jb2RlY19tYXNrKSB7Ci0JCWNoaXAtPmNvZGVjX21hc2sgPSBhenhfcmVhZHcoY2hpcCwgU1RBVEVTVFMpOwotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBjb2RlY19tYXNrID0gMHgleFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgY2hpcC0+Y29kZWNfbWFzayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIExvd2xldmVsIGludGVyZmFjZQotICovICAKLQotLyogZW5hYmxlIGludGVycnVwdHMgKi8KLXN0YXRpYyB2b2lkIGF6eF9pbnRfZW5hYmxlKHN0cnVjdCBhenggKmNoaXApCi17Ci0JLyogZW5hYmxlIGNvbnRyb2xsZXIgQ0lFIGFuZCBHSUUgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgfAotCQkgICBJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfR0xPQkFMX0VOKTsKLX0KLQotLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi1zdGF0aWMgdm9pZCBhenhfaW50X2Rpc2FibGUoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQlpbnQgaTsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyBpbiBzdHJlYW0gZGVzY3JpcHRvciAqLwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0JCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07Ci0JCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLAotCQkJICAgICAgYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkgJiB+U0RfSU5UX01BU0spOwotCX0KLQotCS8qIGRpc2FibGUgU0lFIGZvciBhbGwgc3RyZWFtcyAqLwotCWF6eF93cml0ZWIoY2hpcCwgSU5UQ1RMLCAwKTsKLQotCS8qIGRpc2FibGUgY29udHJvbGxlciBDSUUgYW5kIEdJRSAqLwotCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLCBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSAmCi0JCSAgIH4oSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0dMT0JBTF9FTikpOwotfQotCi0vKiBjbGVhciBpbnRlcnJ1cHRzICovCi1zdGF0aWMgdm9pZCBhenhfaW50X2NsZWFyKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaW50IGk7Ci0KLQkvKiBjbGVhciBzdHJlYW0gc3RhdHVzICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKLQkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKLQkJYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9TVFMsIFNEX0lOVF9NQVNLKTsKLQl9Ci0KLQkvKiBjbGVhciBTVEFURVNUUyAqLwotCWF6eF93cml0ZXcoY2hpcCwgU1RBVEVTVFMsIFNUQVRFU1RTX0lOVF9NQVNLKTsKLQotCS8qIGNsZWFyIHJpcmIgc3RhdHVzICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKLQotCS8qIGNsZWFyIGludCBzdGF0dXMgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVFNUUywgSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0FMTF9TVFJFQU0pOwotfQotCi0vKiBzdGFydCBhIHN0cmVhbSAqLwotc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9zdGFydChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQkvKgotCSAqIEJlZm9yZSBzdHJlYW0gc3RhcnQsIGluaXRpYWxpemUgcGFyYW1ldGVyCi0JICovCi0JYXp4X2Rldi0+aW5zdWZmaWNpZW50ID0gMTsKLQotCS8qIGVuYWJsZSBTSUUgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwKLQkJICAgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgfCAoMSA8PCBhenhfZGV2LT5pbmRleCkpOwotCS8qIHNldCBETUEgc3RhcnQgYW5kIGludGVycnVwdCBtYXNrICovCi0JYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpIHwKLQkJICAgICAgU0RfQ1RMX0RNQV9TVEFSVCB8IFNEX0lOVF9NQVNLKTsKLX0KLQotLyogc3RvcCBETUEgKi8KLXN0YXRpYyB2b2lkIGF6eF9zdHJlYW1fY2xlYXIoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpICYKLQkJICAgICAgfihTRF9DVExfRE1BX1NUQVJUIHwgU0RfSU5UX01BU0spKTsKLQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOyAvKiB0byBiZSBzdXJlICovCi19Ci0KLS8qIHN0b3AgYSBzdHJlYW0gKi8KLXN0YXRpYyB2b2lkIGF6eF9zdHJlYW1fc3RvcChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQlhenhfc3RyZWFtX2NsZWFyKGNoaXAsIGF6eF9kZXYpOwotCS8qIGRpc2FibGUgU0lFICovCi0JYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsCi0JCSAgIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpICYgfigxIDw8IGF6eF9kZXYtPmluZGV4KSk7Ci19Ci0KLQotLyoKLSAqIHJlc2V0IGFuZCBzdGFydCB0aGUgY29udHJvbGxlciByZWdpc3RlcnMKLSAqLwotc3RhdGljIHZvaWQgYXp4X2luaXRfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKLXsKLQlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQotCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KLQlhenhfcmVzZXQoY2hpcCwgZnVsbF9yZXNldCk7Ci0KLQkvKiBpbml0aWFsaXplIGludGVycnVwdHMgKi8KLQlhenhfaW50X2NsZWFyKGNoaXApOwotCWF6eF9pbnRfZW5hYmxlKGNoaXApOwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgY29kZWMgY29tbWFuZCBJL08gKi8KLQlpZiAoIWNoaXAtPnNpbmdsZV9jbWQpCi0JCWF6eF9pbml0X2NtZF9pbyhjaGlwKTsKLQotCS8qIHByb2dyYW0gdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwotCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwgKHUzMiljaGlwLT5wb3NidWYuYWRkcik7Ci0JYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCB1cHBlcl8zMl9iaXRzKGNoaXAtPnBvc2J1Zi5hZGRyKSk7Ci0KLQljaGlwLT5pbml0aWFsaXplZCA9IDE7Ci19CiAKIC8qCiAgKiBpbml0aWFsaXplIHRoZSBQQ0kgcmVnaXN0ZXJzCkBAIC0xMzQ2LDcgKzM2MCw3IEBACiAJICogVGhlIFBDSSByZWdpc3RlciBUQ1NFTCBpcyBkZWZpbmVkIGluIHRoZSBJbnRlbCBtYW51YWxzLgogCSAqLwogCWlmICghKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05PX1RDU0VMKSkgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBDbGVhcmluZyBUQ1NFTFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2xlYXJpbmcgVENTRUxcbiIpOwogCQl1cGRhdGVfcGNpX2J5dGUoY2hpcC0+cGNpLCBJQ0g2X1BDSVJFR19UQ1NFTCwgMHgwNywgMCk7CiAJfQogCkBAIC0xMzU0LDcgKzM2OCw4IEBACiAJICogd2UgbmVlZCB0byBlbmFibGUgc25vb3AuCiAJICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0FUSV9TTk9PUCkgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBTZXR0aW5nIEFUSSBzbm9vcDogJWRcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9zbm9vcChjaGlwKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU2V0dGluZyBBVEkgc25vb3A6ICVkXG4iLAorCQkJYXp4X3Nub29wKGNoaXApKTsKIAkJdXBkYXRlX3BjaV9ieXRlKGNoaXAtPnBjaSwKIAkJCQlBVElfU0I0NTBfSERBVURJT19NSVNDX0NOVFIyX0FERFIsIDB4MDcsCiAJCQkJYXp4X3Nub29wKGNoaXApID8gQVRJX1NCNDUwX0hEQVVESU9fRU5BQkxFX1NOT09QIDogMCk7CkBAIC0xMzYyLDcgKzM3Nyw4IEBACiAKIAkvKiBGb3IgTlZJRElBIEhEQSwgZW5hYmxlIHNub29wICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05WSURJQV9TTk9PUCkgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBTZXR0aW5nIE52aWRpYSBzbm9vcDogJWRcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9zbm9vcChjaGlwKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU2V0dGluZyBOdmlkaWEgc25vb3A6ICVkXG4iLAorCQkJYXp4X3Nub29wKGNoaXApKTsKIAkJdXBkYXRlX3BjaV9ieXRlKGNoaXAtPnBjaSwKIAkJCQlOVklESUFfSERBX1RSQU5TUkVHX0FERFIsCiAJCQkJMHgwZiwgTlZJRElBX0hEQV9FTkFCTEVfQ09IQklUUyk7CkBAIC0xMzg3LDExMTIgKzQwMywyOSBAQAogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpcC0+cGNpLAogCQkJCUlOVEVMX1NDSF9IREFfREVWQywgJnNub29wKTsKIAkJfQotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBTQ0ggc25vb3A6ICVzXG4iLAotCQkJCXBjaV9uYW1lKGNoaXAtPnBjaSksIChzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKQotCQkJCT8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU0NIIHNub29wOiAlc1xuIiwKKwkJCShzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKSA/CisJCQkiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKICAgICAgICAgfQogfQogCi0KIHN0YXRpYyBpbnQgYXp4X3Bvc2l0aW9uX29rKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KTsKIAotLyoKLSAqIGludGVycnVwdCBoYW5kbGVyCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhenhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKKy8qIGNhbGxlZCBmcm9tIElSUSAqLworc3RhdGljIGludCBhenhfcG9zaXRpb25fY2hlY2soc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCiB7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGRldl9pZDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKLQl1MzIgc3RhdHVzOwotCXU4IHNkX3N0YXR1czsKLQlpbnQgaSwgb2s7CisJaW50IG9rOwogCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkKLQkJaWYgKGNoaXAtPnBjaS0+ZGV2LnBvd2VyLnJ1bnRpbWVfc3RhdHVzICE9IFJQTV9BQ1RJVkUpCi0JCQlyZXR1cm4gSVJRX05PTkU7Ci0jZW5kaWYKLQotCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JaWYgKGNoaXAtPmRpc2FibGVkKSB7Ci0JCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlzdGF0dXMgPSBhenhfcmVhZGwoY2hpcCwgSU5UU1RTKTsKLQlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IDB4ZmZmZmZmZmYpIHsKLQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlhenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07Ci0JCWlmIChzdGF0dXMgJiBhenhfZGV2LT5zZF9pbnRfc3RhX21hc2spIHsKLQkJCXNkX3N0YXR1cyA9IGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9TVFMpOwotCQkJYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9TVFMsIFNEX0lOVF9NQVNLKTsKLQkJCWlmICghYXp4X2Rldi0+c3Vic3RyZWFtIHx8ICFhenhfZGV2LT5ydW5uaW5nIHx8Ci0JCQkgICAgIShzZF9zdGF0dXMgJiBTRF9JTlRfQ09NUExFVEUpKQotCQkJCWNvbnRpbnVlOwotCQkJLyogY2hlY2sgd2hldGhlciB0aGlzIElSUSBpcyByZWFsbHkgYWNjZXB0YWJsZSAqLwotCQkJb2sgPSBhenhfcG9zaXRpb25fb2soY2hpcCwgYXp4X2Rldik7Ci0JCQlpZiAob2sgPT0gMSkgewotCQkJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMDsKLQkJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoYXp4X2Rldi0+c3Vic3RyZWFtKTsKLQkJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJCX0gZWxzZSBpZiAob2sgPT0gMCAmJiBjaGlwLT5idXMgJiYgY2hpcC0+YnVzLT53b3JrcSkgewotCQkJCS8qIGJvZ3VzIElSUSwgcHJvY2VzcyBpdCBsYXRlciAqLwotCQkJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMTsKLQkJCQlxdWV1ZV93b3JrKGNoaXAtPmJ1cy0+d29ya3EsCi0JCQkJCSAgICZjaGlwLT5pcnFfcGVuZGluZ193b3JrKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGNsZWFyIHJpcmIgaW50ICovCi0Jc3RhdHVzID0gYXp4X3JlYWRiKGNoaXAsIFJJUkJTVFMpOwotCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9NQVNLKSB7Ci0JCWlmIChzdGF0dXMgJiBSSVJCX0lOVF9SRVNQT05TRSkgewotCQkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZKQotCQkJCXVkZWxheSg4MCk7Ci0JCQlhenhfdXBkYXRlX3JpcmIoY2hpcCk7Ci0JCX0KLQkJYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKLQl9Ci0KLSNpZiAwCi0JLyogY2xlYXIgc3RhdGUgc3RhdHVzIGludCAqLwotCWlmIChhenhfcmVhZHcoY2hpcCwgU1RBVEVTVFMpICYgMHgwNCkKLQkJYXp4X3dyaXRldyhjaGlwLCBTVEFURVNUUywgMHgwNCk7Ci0jZW5kaWYKLQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKgotICogc2V0IHVwIGEgQkRMIGVudHJ5Ci0gKi8KLXN0YXRpYyBpbnQgc2V0dXBfYmRsZShzdHJ1Y3QgYXp4ICpjaGlwLAotCQkgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsCi0JCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LCB1MzIgKipiZGxwLAotCQkgICAgICBpbnQgb2ZzLCBpbnQgc2l6ZSwgaW50IHdpdGhfaW9jKQotewotCXUzMiAqYmRsID0gKmJkbHA7Ci0KLQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJZG1hX2FkZHJfdCBhZGRyOwotCQlpbnQgY2h1bms7Ci0KLQkJaWYgKGF6eF9kZXYtPmZyYWdzID49IEFaWF9NQVhfQkRMX0VOVFJJRVMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlhZGRyID0gc25kX3NnYnVmX2dldF9hZGRyKGRtYWIsIG9mcyk7Ci0JCS8qIHByb2dyYW0gdGhlIGFkZHJlc3MgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLwotCQliZGxbMF0gPSBjcHVfdG9fbGUzMigodTMyKWFkZHIpOwotCQliZGxbMV0gPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGFkZHIpKTsKLQkJLyogcHJvZ3JhbSB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgQkRMIGVudHJ5ICovCi0JCWNodW5rID0gc25kX3NnYnVmX2dldF9jaHVua19zaXplKGRtYWIsIG9mcywgc2l6ZSk7Ci0JCS8qIG9uZSBCRExFIGNhbm5vdCBjcm9zcyA0SyBib3VuZGFyeSBvbiBDVEhEQSBjaGlwcyAqLwotCQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfNEtfQkRMRV9CT1VOREFSWSkgewotCQkJdTMyIHJlbWFpbiA9IDB4MTAwMCAtIChvZnMgJiAweGZmZik7Ci0JCQlpZiAoY2h1bmsgPiByZW1haW4pCi0JCQkJY2h1bmsgPSByZW1haW47Ci0JCX0KLQkJYmRsWzJdID0gY3B1X3RvX2xlMzIoY2h1bmspOwotCQkvKiBwcm9ncmFtIHRoZSBJT0MgdG8gZW5hYmxlIGludGVycnVwdAotCQkgKiBvbmx5IHdoZW4gdGhlIHdob2xlIGZyYWdtZW50IGlzIHByb2Nlc3NlZAotCQkgKi8KLQkJc2l6ZSAtPSBjaHVuazsKLQkJYmRsWzNdID0gKHNpemUgfHwgIXdpdGhfaW9jKSA/IDAgOiBjcHVfdG9fbGUzMigweDAxKTsKLQkJYmRsICs9IDQ7Ci0JCWF6eF9kZXYtPmZyYWdzKys7Ci0JCW9mcyArPSBjaHVuazsKLQl9Ci0JKmJkbHAgPSBiZGw7Ci0JcmV0dXJuIG9mczsKLX0KLQotLyoKLSAqIHNldCB1cCBCREwgZW50cmllcwotICovCi1zdGF0aWMgaW50IGF6eF9zZXR1cF9wZXJpb2RzKHN0cnVjdCBhenggKmNoaXAsCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQl1MzIgKmJkbDsKLQlpbnQgaSwgb2ZzLCBwZXJpb2RzLCBwZXJpb2RfYnl0ZXM7Ci0JaW50IHBvc19hZGo7Ci0KLQkvKiByZXNldCBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsIDApOwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUFUsIDApOwotCi0JcGVyaW9kX2J5dGVzID0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzOwotCXBlcmlvZHMgPSBhenhfZGV2LT5idWZzaXplIC8gcGVyaW9kX2J5dGVzOwotCi0JLyogcHJvZ3JhbSB0aGUgaW5pdGlhbCBCREwgZW50cmllcyAqLwotCWJkbCA9ICh1MzIgKilhenhfZGV2LT5iZGwuYXJlYTsKLQlvZnMgPSAwOwotCWF6eF9kZXYtPmZyYWdzID0gMDsKLQlwb3NfYWRqID0gYmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XTsKLQlpZiAoIWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXAgJiYgcG9zX2FkaiA+IDApIHsKLQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQkJaW50IHBvc19hbGlnbiA9IHBvc19hZGo7Ci0JCXBvc19hZGogPSAocG9zX2FkaiAqIHJ1bnRpbWUtPnJhdGUgKyA0Nzk5OSkgLyA0ODAwMDsKLQkJaWYgKCFwb3NfYWRqKQotCQkJcG9zX2FkaiA9IHBvc19hbGlnbjsKLQkJZWxzZQotCQkJcG9zX2FkaiA9ICgocG9zX2FkaiArIHBvc19hbGlnbiAtIDEpIC8gcG9zX2FsaWduKSAqCi0JCQkJcG9zX2FsaWduOwotCQlwb3NfYWRqID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHBvc19hZGopOwotCQlpZiAocG9zX2FkaiA+PSBwZXJpb2RfYnl0ZXMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IFRvbyBiaWcgYWRqdXN0bWVudCAlZFxuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBiZGxfcG9zX2FkaltjaGlwLT5kZXZfaW5kZXhdKTsKLQkJCXBvc19hZGogPSAwOwotCQl9IGVsc2UgewotCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCi0JCQkJCSBhenhfZGV2LAotCQkJCQkgJmJkbCwgb2ZzLCBwb3NfYWRqLCB0cnVlKTsKLQkJCWlmIChvZnMgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IGVsc2UKLQkJcG9zX2FkaiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgewotCQlpZiAoaSA9PSBwZXJpb2RzIC0gMSAmJiBwb3NfYWRqKQotCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCi0JCQkJCSBhenhfZGV2LCAmYmRsLCBvZnMsCi0JCQkJCSBwZXJpb2RfYnl0ZXMgLSBwb3NfYWRqLCAwKTsKLQkJZWxzZQotCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCi0JCQkJCSBhenhfZGV2LCAmYmRsLCBvZnMsCi0JCQkJCSBwZXJpb2RfYnl0ZXMsCi0JCQkJCSAhYXp4X2Rldi0+bm9fcGVyaW9kX3dha2V1cCk7Ci0JCWlmIChvZnMgPCAwKQotCQkJZ290byBlcnJvcjsKKwlvayA9IGF6eF9wb3NpdGlvbl9vayhjaGlwLCBhenhfZGV2KTsKKwlpZiAob2sgPT0gMSkgeworCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDA7CisJCXJldHVybiBvazsKKwl9IGVsc2UgaWYgKG9rID09IDAgJiYgY2hpcC0+YnVzICYmIGNoaXAtPmJ1cy0+d29ya3EpIHsKKwkJLyogYm9ndXMgSVJRLCBwcm9jZXNzIGl0IGxhdGVyICovCisJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMTsKKwkJcXVldWVfd29yayhjaGlwLT5idXMtPndvcmtxLCAmY2hpcC0+aXJxX3BlbmRpbmdfd29yayk7CiAJfQogCXJldHVybiAwOwotCi0gZXJyb3I6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBUb28gbWFueSBCREwgZW50cmllczogYnVmZmVyPSVkLCBwZXJpb2Q9JWRcbiIsCi0JCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9kZXYtPmJ1ZnNpemUsIHBlcmlvZF9ieXRlcyk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIHJlc2V0IHN0cmVhbSAqLwotc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9yZXNldChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbDsKLQlpbnQgdGltZW91dDsKLQotCWF6eF9zdHJlYW1fY2xlYXIoY2hpcCwgYXp4X2Rldik7Ci0KLQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwgYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkgfAotCQkgICAgICBTRF9DVExfU1RSRUFNX1JFU0VUKTsKLQl1ZGVsYXkoMyk7Ci0JdGltZW91dCA9IDMwMDsKLQl3aGlsZSAoISgodmFsID0gYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkpICYgU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYKLQkgICAgICAgLS10aW1lb3V0KQotCQk7Ci0JdmFsICY9IH5TRF9DVExfU1RSRUFNX1JFU0VUOwotCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLCB2YWwpOwotCXVkZWxheSgzKTsKLQotCXRpbWVvdXQgPSAzMDA7Ci0JLyogd2FpdGluZyBmb3IgaGFyZHdhcmUgdG8gcmVwb3J0IHRoYXQgdGhlIHN0cmVhbSBpcyBvdXQgb2YgcmVzZXQgKi8KLQl3aGlsZSAoKCh2YWwgPSBhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSkgJiBTRF9DVExfU1RSRUFNX1JFU0VUKSAmJgotCSAgICAgICAtLXRpbWVvdXQpCi0JCTsKLQotCS8qIHJlc2V0IGZpcnN0IHBvc2l0aW9uIC0gbWF5IG5vdCBiZSBzeW5jZWQgd2l0aCBodyBhdCB0aGlzIHRpbWUgKi8KLQkqYXp4X2Rldi0+cG9zYnVmID0gMDsKLX0KLQotLyoKLSAqIHNldCB1cCB0aGUgU0QgZm9yIHN0cmVhbWluZwotICovCi1zdGF0aWMgaW50IGF6eF9zZXR1cF9jb250cm9sbGVyKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0JLyogbWFrZSBzdXJlIHRoZSBydW4gYml0IGlzIHplcm8gZm9yIFNEICovCi0JYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKLQkvKiBwcm9ncmFtIHRoZSBzdHJlYW1fdGFnICovCi0JdmFsID0gYXp4X3NkX3JlYWRsKGF6eF9kZXYsIFNEX0NUTCk7Ci0JdmFsID0gKHZhbCAmIH5TRF9DVExfU1RSRUFNX1RBR19NQVNLKSB8Ci0JCShhenhfZGV2LT5zdHJlYW1fdGFnIDw8IFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUKTsKLQlpZiAoIWF6eF9zbm9vcChjaGlwKSkKLQkJdmFsIHw9IFNEX0NUTF9UUkFGRklDX1BSSU87Ci0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsIHZhbCk7Ci0KLQkvKiBwcm9ncmFtIHRoZSBsZW5ndGggb2Ygc2FtcGxlcyBpbiBjeWNsaWMgYnVmZmVyICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DQkwsIGF6eF9kZXYtPmJ1ZnNpemUpOwotCi0JLyogcHJvZ3JhbSB0aGUgc3RyZWFtIGZvcm1hdCAqLwotCS8qIHRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwcm9ncmFtbWVkICovCi0JYXp4X3NkX3dyaXRldyhhenhfZGV2LCBTRF9GT1JNQVQsIGF6eF9kZXYtPmZvcm1hdF92YWwpOwotCi0JLyogcHJvZ3JhbSB0aGUgc3RyZWFtIExWSSAobGFzdCB2YWxpZCBpbmRleCkgb2YgdGhlIEJETCAqLwotCWF6eF9zZF93cml0ZXcoYXp4X2RldiwgU0RfTFZJLCBhenhfZGV2LT5mcmFncyAtIDEpOwotCi0JLyogcHJvZ3JhbSB0aGUgQkRMIGFkZHJlc3MgKi8KLQkvKiBsb3dlciBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsICh1MzIpYXp4X2Rldi0+YmRsLmFkZHIpOwotCS8qIHVwcGVyIEJETCBhZGRyZXNzICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgdXBwZXJfMzJfYml0cyhhenhfZGV2LT5iZGwuYWRkcikpOwotCi0JLyogZW5hYmxlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQlpZiAoY2hpcC0+cG9zaXRpb25fZml4WzBdICE9IFBPU19GSVhfTFBJQiB8fAotCSAgICBjaGlwLT5wb3NpdGlvbl9maXhbMV0gIT0gUE9TX0ZJWF9MUElCKSB7Ci0JCWlmICghKGF6eF9yZWFkbChjaGlwLCBEUExCQVNFKSAmIElDSDZfRFBMQkFTRV9FTkFCTEUpKQotCQkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLAotCQkJCSh1MzIpY2hpcC0+cG9zYnVmLmFkZHIgfCBJQ0g2X0RQTEJBU0VfRU5BQkxFKTsKLQl9Ci0KLQkvKiBzZXQgdGhlIGludGVycnVwdCBlbmFibGUgYml0cyBpbiB0aGUgZGVzY3JpcHRvciBjb250cm9sIHJlZ2lzdGVyICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsCi0JCSAgICAgIGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpIHwgU0RfSU5UX01BU0spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9iZSB0aGUgZ2l2ZW4gY29kZWMgYWRkcmVzcwotICovCi1zdGF0aWMgaW50IHByb2JlX2NvZGVjKHN0cnVjdCBhenggKmNoaXAsIGludCBhZGRyKQotewotCXVuc2lnbmVkIGludCBjbWQgPSAoYWRkciA8PCAyOCkgfCAoQUNfTk9ERV9ST09UIDw8IDIwKSB8Ci0JCShBQ19WRVJCX1BBUkFNRVRFUlMgPDwgOCkgfCBBQ19QQVJfVkVORE9SX0lEOwotCXVuc2lnbmVkIGludCByZXM7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5idXMtPmNtZF9tdXRleCk7Ci0JY2hpcC0+cHJvYmluZyA9IDE7Ci0JYXp4X3NlbmRfY21kKGNoaXAtPmJ1cywgY21kKTsKLQlyZXMgPSBhenhfZ2V0X3Jlc3BvbnNlKGNoaXAtPmJ1cywgYWRkcik7Ci0JY2hpcC0+cHJvYmluZyA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5idXMtPmNtZF9tdXRleCk7Ci0JaWYgKHJlcyA9PSAtMSkKLQkJcmV0dXJuIC1FSU87Ci0Jc25kX3ByaW50ZGQoU0ZYICIlczogY29kZWMgIyVkIHByb2JlZCBPS1xuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X2F0dGFjaF9wY21fc3RyZWFtKHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSBzdHJ1Y3QgaGRhX3BjbSAqY3BjbSk7Ci1zdGF0aWMgdm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApOwotCi1zdGF0aWMgdm9pZCBhenhfYnVzX3Jlc2V0KHN0cnVjdCBoZGFfYnVzICpidXMpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCi0JYnVzLT5pbl9yZXNldCA9IDE7Ci0JYXp4X3N0b3BfY2hpcChjaGlwKTsKLQlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOwotI2lmZGVmIENPTkZJR19QTQotCWlmIChjaGlwLT5pbml0aWFsaXplZCkgewotCQlzdHJ1Y3QgYXp4X3BjbSAqcDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpCi0JCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHAtPnBjbSk7Ci0JCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMpOwotCQlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOwotCX0KLSNlbmRpZgotCWJ1cy0+aW5fcmVzZXQgPSAwOwotfQotCi1zdGF0aWMgaW50IGdldF9qYWNrcG9sbF9pbnRlcnZhbChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWludCBpID0gamFja3BvbGxfbXNbY2hpcC0+ZGV2X2luZGV4XTsKLQl1bnNpZ25lZCBpbnQgajsKLQlpZiAoaSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoaSA8IDUwIHx8IGkgPiA2MDAwMCkKLQkJaiA9IDA7Ci0JZWxzZQotCQlqID0gbXNlY3NfdG9famlmZmllcyhpKTsKLQlpZiAoaiA9PSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlgKLQkJCSAgICJqYWNrcG9sbF9tcyB2YWx1ZSBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBpKTsKLQlyZXR1cm4gajsKLX0KLQotLyoKLSAqIENvZGVjIGluaXRpYWxpemF0aW9uCi0gKi8KLQotLyogbnVtYmVyIG9mIGNvZGVjIHNsb3RzIGZvciBlYWNoIGNoaXBzZXQ6IDAgPSBkZWZhdWx0IHNsb3RzIChpLmUuIDQpICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9tYXhfY29kZWNzW0FaWF9OVU1fRFJJVkVSU10gPSB7Ci0JW0FaWF9EUklWRVJfTlZJRElBXSA9IDgsCi0JW0FaWF9EUklWRVJfVEVSQV0gPSAxLAotfTsKLQotc3RhdGljIGludCBhenhfY29kZWNfY3JlYXRlKHN0cnVjdCBhenggKmNoaXAsIGNvbnN0IGNoYXIgKm1vZGVsKQotewotCXN0cnVjdCBoZGFfYnVzX3RlbXBsYXRlIGJ1c190ZW1wOwotCWludCBjLCBjb2RlY3MsIGVycjsKLQlpbnQgbWF4X3Nsb3RzOwotCi0JbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7Ci0JYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKLQlidXNfdGVtcC5tb2RlbG5hbWUgPSBtb2RlbDsKLQlidXNfdGVtcC5wY2kgPSBjaGlwLT5wY2k7Ci0JYnVzX3RlbXAub3BzLmNvbW1hbmQgPSBhenhfc2VuZF9jbWQ7Ci0JYnVzX3RlbXAub3BzLmdldF9yZXNwb25zZSA9IGF6eF9nZXRfcmVzcG9uc2U7Ci0JYnVzX3RlbXAub3BzLmF0dGFjaF9wY20gPSBhenhfYXR0YWNoX3BjbV9zdHJlYW07Ci0JYnVzX3RlbXAub3BzLmJ1c19yZXNldCA9IGF6eF9idXNfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX1BNCi0JYnVzX3RlbXAucG93ZXJfc2F2ZSA9ICZwb3dlcl9zYXZlOwotCWJ1c190ZW1wLm9wcy5wbV9ub3RpZnkgPSBhenhfcG93ZXJfbm90aWZ5OwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF9wcmVwYXJlID0gYXp4X2xvYWRfZHNwX3ByZXBhcmU7Ci0JYnVzX3RlbXAub3BzLmxvYWRfZHNwX3RyaWdnZXIgPSBhenhfbG9hZF9kc3BfdHJpZ2dlcjsKLQlidXNfdGVtcC5vcHMubG9hZF9kc3BfY2xlYW51cCA9IGF6eF9sb2FkX2RzcF9jbGVhbnVwOwotI2VuZGlmCi0KLQllcnIgPSBzbmRfaGRhX2J1c19uZXcoY2hpcC0+Y2FyZCwgJmJ1c190ZW1wLCAmY2hpcC0+YnVzKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19SSVJCX0RFTEFZKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogRW5hYmxlIGRlbGF5IGluIFJJUkIgaGFuZGxpbmdcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQljaGlwLT5idXMtPm5lZWRzX2RhbW5fbG9uZ19kZWxheSA9IDE7Ci0JfQotCi0JY29kZWNzID0gMDsKLQltYXhfc2xvdHMgPSBhenhfbWF4X2NvZGVjc1tjaGlwLT5kcml2ZXJfdHlwZV07Ci0JaWYgKCFtYXhfc2xvdHMpCi0JCW1heF9zbG90cyA9IEFaWF9ERUZBVUxUX0NPREVDUzsKLQotCS8qIEZpcnN0IHRyeSB0byBwcm9iZSBhbGwgZ2l2ZW4gY29kZWMgc2xvdHMgKi8KLQlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKLQkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgewotCQkJaWYgKHByb2JlX2NvZGVjKGNoaXAsIGMpIDwgMCkgewotCQkJCS8qIFNvbWUgQklPU2VuIGdpdmUgeW91IHdyb25nIGNvZGVjIGFkZHJlc3NlcwotCQkJCSAqIHRoYXQgZG9uJ3QgZXhpc3QKLQkJCQkgKi8KLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlgKLQkJCQkJICAgIiVzOiBDb2RlYyAjJWQgcHJvYmUgZXJyb3I7ICIKLQkJCQkJICAgImRpc2FibGluZyBpdC4uLlxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgYyk7Ci0JCQkJY2hpcC0+Y29kZWNfbWFzayAmPSB+KDEgPDwgYyk7Ci0JCQkJLyogTW9yZSBiYWRseSwgYWNjZXNzaW5nIHRvIGEgbm9uLWV4aXN0aW5nCi0JCQkJICogY29kZWMgb2Z0ZW4gc2NyZXdzIHVwIHRoZSBjb250cm9sbGVyIGNoaXAsCi0JCQkJICogYW5kIGRpc3R1cmJzIHRoZSBmdXJ0aGVyIGNvbW11bmljYXRpb25zLgotCQkJCSAqIFRodXMgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwcm9iaW5nLAotCQkJCSAqIGJldHRlciB0byByZXNldCB0aGUgY29udHJvbGxlciBjaGlwIHRvCi0JCQkJICogZ2V0IGJhY2sgdG8gdGhlIHNhbml0eSBzdGF0ZS4KLQkJCQkgKi8KLQkJCQlhenhfc3RvcF9jaGlwKGNoaXApOwotCQkJCWF6eF9pbml0X2NoaXAoY2hpcCwgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBBTUQgY2hpcHNldHMgb2Z0ZW4gY2F1c2UgdGhlIGNvbW11bmljYXRpb24gc3RhbGxzIHVwb24gY2VydGFpbgotCSAqIHNlcXVlbmNlIGxpa2UgdGhlIHBpbi1kZXRlY3Rpb24uICBJdCBzZWVtcyB0aGF0IGZvcmNpbmcgdGhlIHN5bmNlZAotCSAqIGFjY2VzcyB3b3JrcyBhcm91bmQgdGhlIHN0YWxsLiAgR3Jyci4uLgotCSAqLwotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19TWU5DX1dSSVRFKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogRW5hYmxlIHN5bmNfd3JpdGUgZm9yIHN0YWJsZSBjb21tdW5pY2F0aW9uXG4iLAotCQkJcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCWNoaXAtPmJ1cy0+c3luY193cml0ZSA9IDE7Ci0JCWNoaXAtPmJ1cy0+YWxsb3dfYnVzX3Jlc2V0ID0gMTsKLQl9Ci0KLQkvKiBUaGVuIGNyZWF0ZSBjb2RlYyBpbnN0YW5jZXMgKi8KLQlmb3IgKGMgPSAwOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKLQkJaWYgKChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpICYgY2hpcC0+Y29kZWNfcHJvYmVfbWFzaykgewotCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JCQllcnIgPSBzbmRfaGRhX2NvZGVjX25ldyhjaGlwLT5idXMsIGMsICZjb2RlYyk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQljb250aW51ZTsKLQkJCWNvZGVjLT5qYWNrcG9sbF9pbnRlcnZhbCA9IGdldF9qYWNrcG9sbF9pbnRlcnZhbChjaGlwKTsKLQkJCWNvZGVjLT5iZWVwX21vZGUgPSBjaGlwLT5iZWVwX21vZGU7Ci0JCQljb2RlY3MrKzsKLQkJfQotCX0KLQlpZiAoIWNvZGVjcykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IG5vIGNvZGVjcyBpbml0aWFsaXplZFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBjb25maWd1cmUgZWFjaCBjb2RlYyBpbnN0YW5jZSAqLwotc3RhdGljIGludCBhenhfY29kZWNfY29uZmlndXJlKHN0cnVjdCBhenggKmNoaXApCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNoaXAtPmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewotCQlzbmRfaGRhX2NvZGVjX2NvbmZpZ3VyZShjb2RlYyk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBQQ00gc3VwcG9ydAotICovCi0KLS8qIGFzc2lnbiBhIHN0cmVhbSBmb3IgdGhlIFBDTSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqCi1henhfYXNzaWduX2RldmljZShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgZGV2LCBpLCBudW1zOwotCXN0cnVjdCBhenhfZGV2ICpyZXMgPSBOVUxMOwotCS8qIG1ha2UgYSBub24temVybyB1bmlxdWUga2V5IGZvciB0aGUgc3Vic3RyZWFtICovCi0JaW50IGtleSA9IChzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlIDw8IDE2KSB8IChzdWJzdHJlYW0tPm51bWJlciA8PCAyKSB8Ci0JCShzdWJzdHJlYW0tPnN0cmVhbSArIDEpOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJZGV2ID0gY2hpcC0+cGxheWJhY2tfaW5kZXhfb2Zmc2V0OwotCQludW1zID0gY2hpcC0+cGxheWJhY2tfc3RyZWFtczsKLQl9IGVsc2UgewotCQlkZXYgPSBjaGlwLT5jYXB0dXJlX2luZGV4X29mZnNldDsKLQkJbnVtcyA9IGNoaXAtPmNhcHR1cmVfc3RyZWFtczsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKywgZGV2KyspIHsKLQkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltkZXZdOwotCQlkc3BfbG9jayhhenhfZGV2KTsKLQkJaWYgKCFhenhfZGV2LT5vcGVuZWQgJiYgIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKLQkJCXJlcyA9IGF6eF9kZXY7Ci0JCQlpZiAocmVzLT5hc3NpZ25lZF9rZXkgPT0ga2V5KSB7Ci0JCQkJcmVzLT5vcGVuZWQgPSAxOwotCQkJCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OwotCQkJCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JCQkJcmV0dXJuIGF6eF9kZXY7Ci0JCQl9Ci0JCX0KLQkJZHNwX3VubG9jayhhenhfZGV2KTsKLQl9Ci0JaWYgKHJlcykgewotCQlkc3BfbG9jayhyZXMpOwotCQlyZXMtPm9wZW5lZCA9IDE7Ci0JCXJlcy0+YXNzaWduZWRfa2V5ID0ga2V5OwotCQlkc3BfdW5sb2NrKHJlcyk7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qIHJlbGVhc2UgdGhlIGFzc2lnbmVkIHN0cmVhbSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF6eF9yZWxlYXNlX2RldmljZShzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQlhenhfZGV2LT5vcGVuZWQgPSAwOwotfQotCi1zdGF0aWMgY3ljbGVfdCBhenhfY2NfcmVhZChjb25zdCBzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYykKLXsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGNvbnRhaW5lcl9vZihjYywgc3RydWN0IGF6eF9kZXYsIGF6eF9jYyk7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0KLQlyZXR1cm4gYXp4X3JlYWRsKGNoaXAsIFdBTExDTEspOwotfQotCi1zdGF0aWMgdm9pZCBhenhfdGltZWNvdW50ZXJfaW5pdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlib29sIGZvcmNlLCBjeWNsZV90IGxhc3QpCi17Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXN0cnVjdCB0aW1lY291bnRlciAqdGMgPSAmYXp4X2Rldi0+YXp4X3RjOwotCXN0cnVjdCBjeWNsZWNvdW50ZXIgKmNjID0gJmF6eF9kZXYtPmF6eF9jYzsKLQl1NjQgbnNlYzsKLQotCWNjLT5yZWFkID0gYXp4X2NjX3JlYWQ7Ci0JY2MtPm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKLQotCS8qCi0JICogQ29udmVydGluZyBmcm9tIDI0IE1IeiB0byBucyBtZWFucyBhcHBseWluZyBhIDEyNS8zIGZhY3Rvci4KLQkgKiBUbyBhdm9pZCBhbnkgc2F0dXJhdGlvbiBpc3N1ZXMgaW4gaW50ZXJtZWRpYXRlIG9wZXJhdGlvbnMsCi0JICogdGhlIDEyNSBmYWN0b3IgaXMgYXBwbGllZCBmaXJzdC4gVGhlIGRpdmlzaW9uIGlzIGFwcGxpZWQKLQkgKiBsYXN0IGFmdGVyIHJlYWRpbmcgdGhlIHRpbWVjb3VudGVyIHZhbHVlLgotCSAqIEFwcGx5aW5nIHRoZSAxLzMgZmFjdG9yIGFzIHBhcnQgb2YgdGhlIG11bHRpcGxpY2F0aW9uCi0JICogcmVxdWlyZXMgYXQgbGVhc3QgMjAgYml0cyBmb3IgYSBkZWNlbnQgcHJlY2lzaW9uLCBob3dldmVyCi0JICogb3ZlcmZsb3dzIG9jY3VyIGFmdGVyIGFib3V0IDQgaG91cnMgb3IgbGVzcywgbm90IGEgb3B0aW9uLgotCSAqLwotCi0JY2MtPm11bHQgPSAxMjU7IC8qIHNhdHVyYXRpb24gYWZ0ZXIgMTk1IHllYXJzICovCi0JY2MtPnNoaWZ0ID0gMDsKLQotCW5zZWMgPSAwOyAvKiBhdWRpbyB0aW1lIGlzIGVsYXBzZWQgdGltZSBzaW5jZSB0cmlnZ2VyICovCi0JdGltZWNvdW50ZXJfaW5pdCh0YywgY2MsIG5zZWMpOwotCWlmIChmb3JjZSkKLQkJLyoKLQkJICogZm9yY2UgdGltZWNvdW50ZXIgdG8gdXNlIHByZWRlZmluZWQgdmFsdWUsCi0JCSAqIHVzZWQgZm9yIHN5bmNocm9uaXplZCBzdGFydHMKLQkJICovCi0JCXRjLT5jeWNsZV9sYXN0ID0gbGFzdDsKLX0KLQotc3RhdGljIHU2NCBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXU2NCBuc2VjKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0JdTY0IGNvZGVjX2ZyYW1lcywgY29kZWNfbnNlY3M7Ci0KLQlpZiAoIWhpbmZvLT5vcHMuZ2V0X2RlbGF5KQotCQlyZXR1cm4gbnNlYzsKLQotCWNvZGVjX2ZyYW1lcyA9IGhpbmZvLT5vcHMuZ2V0X2RlbGF5KGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKLQljb2RlY19uc2VjcyA9IGRpdl91NjQoY29kZWNfZnJhbWVzICogMTAwMDAwMDAwMExMLAotCQkJICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldHVybiBuc2VjICsgY29kZWNfbnNlY3M7Ci0KLQlyZXR1cm4gKG5zZWMgPiBjb2RlY19uc2VjcykgPyBuc2VjIC0gY29kZWNfbnNlY3MgOiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9nZXRfd2FsbGNsb2NrX3RzdGFtcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3QgdGltZXNwZWMgKnRzKQotewotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQl1NjQgbnNlYzsKLQotCW5zZWMgPSB0aW1lY291bnRlcl9yZWFkKCZhenhfZGV2LT5henhfdGMpOwotCW5zZWMgPSBkaXZfdTY0KG5zZWMsIDMpOyAvKiBjYW4gYmUgb3B0aW1pemVkICovCi0JbnNlYyA9IGF6eF9hZGp1c3RfY29kZWNfZGVsYXkoc3Vic3RyZWFtLCBuc2VjKTsKLQotCSp0cyA9IG5zX3RvX3RpbWVzcGVjKG5zZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBhenhfcGNtX2h3ID0gewotCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkgLyogTm8gZnVsbC1yZXN1bWUgeWV0IGltcGxlbWVudGVkICovCi0JCQkJIC8qIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8Ki8KLQkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKLQkJCQkgU05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0sgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQKSwKLQkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JLnJhdGVfbWluID0JCTQ4MDAwLAotCS5yYXRlX21heCA9CQk0ODAwMCwKLQkuY2hhbm5lbHNfbWluID0JCTIsCi0JLmNoYW5uZWxzX21heCA9CQkyLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JQVpYX01BWF9CVUZfU0laRSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CTEyOCwKLQkucGVyaW9kX2J5dGVzX21heCA9CUFaWF9NQVhfQlVGX1NJWkUgLyAyLAotCS5wZXJpb2RzX21pbiA9CQkyLAotCS5wZXJpb2RzX21heCA9CQlBWlhfTUFYX0ZSQUcsCi0JLmZpZm9fc2l6ZSA9CQkwLAotfTsKLQotc3RhdGljIGludCBhenhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQlpbnQgYnVmZl9zdGVwOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JYXp4X2RldiA9IGF6eF9hc3NpZ25fZGV2aWNlKGNoaXAsIHN1YnN0cmVhbSk7Ci0JaWYgKGF6eF9kZXYgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlydW50aW1lLT5odyA9IGF6eF9wY21faHc7Ci0JcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGluZm8tPmNoYW5uZWxzX21pbjsKLQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBoaW5mby0+Y2hhbm5lbHNfbWF4OwotCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPSBoaW5mby0+Zm9ybWF0czsKLQlydW50aW1lLT5ody5yYXRlcyA9IGhpbmZvLT5yYXRlczsKLQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwotCXNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQotCS8qIGF2b2lkIHdyYXAtYXJvdW5kIHdpdGggd2FsbC1jbG9jayAqLwotCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9USU1FLAotCQkJCTIwLAotCQkJCTE3ODAwMDAwMCk7Ci0KLQlpZiAoY2hpcC0+YWxpZ25fYnVmZmVyX3NpemUpCi0JCS8qIGNvbnN0cmFpbiBidWZmZXIgc2l6ZXMgdG8gYmUgbXVsdGlwbGUgb2YgMTI4Ci0JCSAgIGJ5dGVzLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IGluIHRlcm1zIG9mIG1lbW9yeQotCQkgICBhY2Nlc3MgYnV0IGlzbid0IHJlcXVpcmVkIGJ5IHRoZSBIREEgc3BlYyBhbmQKLQkJICAgcHJldmVudHMgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGV4YWN0IHBlcmlvZC9idWZmZXIKLQkJICAgc2l6ZXMuIEZvciBleGFtcGxlIGZvciA0NC4xa0h6LCBhIHBlcmlvZCBzaXplIHNldAotCQkgICB0byAyMG1zIHdpbGwgYmUgcm91bmRlZCB0byAxOS41OW1zLiAqLwotCQlidWZmX3N0ZXAgPSAxMjg7Ci0JZWxzZQotCQkvKiBEb24ndCBlbmZvcmNlIHN0ZXBzIG9uIGJ1ZmZlciBzaXplcywgc3RpbGwgbmVlZCB0bwotCQkgICBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChIREEgc3BlYykuIFRlc3RlZCBvbiBJbnRlbAotCQkgICBIREEgY29udHJvbGxlcnMsIG1heSBub3Qgd29yayBvbiBhbGwgZGV2aWNlcyB3aGVyZQotCQkgICBvcHRpb24gbmVlZHMgdG8gYmUgZGlzYWJsZWQgKi8KLQkJYnVmZl9zdGVwID0gNDsKLQotCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCi0JCQkJICAgYnVmZl9zdGVwKTsKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLAotCQkJCSAgIGJ1ZmZfc3RlcCk7Ci0Jc25kX2hkYV9wb3dlcl91cF9kM3dhaXQoYXBjbS0+Y29kZWMpOwotCWVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOwotCQlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOwotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChzbmRfQlVHX09OKCFydW50aW1lLT5ody5jaGFubmVsc19taW4pIHx8Ci0JICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCkgfHwKLQkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcuZm9ybWF0cykgfHwKLQkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcucmF0ZXMpKSB7Ci0JCWF6eF9yZWxlYXNlX2RldmljZShhenhfZGV2KTsKLQkJaGluZm8tPm9wcy5jbG9zZShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0JCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7Ci0JCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGRpc2FibGUgV0FMTENMT0NLIHRpbWVzdGFtcHMgZm9yIGNhcHR1cmUgc3RyZWFtcwotCSAgIHVudGlsIHdlIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSBkaWdpdGFsIGlucHV0cyAqLwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJ1bnRpbWUtPmh3LmluZm8gJj0gflNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JYXp4X2Rldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0KLQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBhenhfZGV2OwotCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW11dGV4X2xvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWF6eF9kZXYtPnN1YnN0cmVhbSA9IE5VTEw7Ci0JYXp4X2Rldi0+cnVubmluZyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7Ci0JaGluZm8tPm9wcy5jbG9zZShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0Jc25kX2hkYV9wb3dlcl9kb3duKGFwY20tPmNvZGVjKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKLXsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7Ci0JaW50IHJldDsKLQotCWRzcF9sb2NrKGF6eF9kZXYpOwotCWlmIChkc3BfaXNfbG9ja2VkKGF6eF9kZXYpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOwotCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOwotCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7Ci0JYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7Ci0JcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKLQkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byB1bmxvY2s7Ci0JbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgdHJ1ZSk7Ci0gdW5sb2NrOgotCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhenhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0KLQkvKiByZXNldCBCREwgYWRkcmVzcyAqLwotCWRzcF9sb2NrKGF6eF9kZXYpOwotCWlmICghZHNwX2lzX2xvY2tlZChhenhfZGV2KSkgewotCQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKLQkJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgMCk7Ci0JCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ1RMLCAwKTsKLQkJYXp4X2Rldi0+YnVmc2l6ZSA9IDA7Ci0JCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7Ci0JCWF6eF9kZXYtPmZvcm1hdF92YWwgPSAwOwotCX0KLQotCXNuZF9oZGFfY29kZWNfY2xlYW51cChhcGNtLT5jb2RlYywgaGluZm8sIHN1YnN0cmVhbSk7Ci0KLQltYXJrX3J1bnRpbWVfd2MoY2hpcCwgYXp4X2Rldiwgc3Vic3RyZWFtLCBmYWxzZSk7Ci0JYXp4X2Rldi0+cHJlcGFyZWQgPSAwOwotCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLX0KLQotc3RhdGljIGludCBhenhfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQl1bnNpZ25lZCBpbnQgYnVmc2l6ZSwgcGVyaW9kX2J5dGVzLCBmb3JtYXRfdmFsLCBzdHJlYW1fdGFnOwotCWludCBlcnI7Ci0Jc3RydWN0IGhkYV9zcGRpZl9vdXQgKnNwZGlmID0KLQkJc25kX2hkYV9zcGRpZl9vdXRfb2ZfbmlkKGFwY20tPmNvZGVjLCBoaW5mby0+bmlkKTsKLQl1bnNpZ25lZCBzaG9ydCBjdGxzID0gc3BkaWYgPyBzcGRpZi0+Y3RscyA6IDA7Ci0KLQlkc3BfbG9jayhhenhfZGV2KTsKLQlpZiAoZHNwX2lzX2xvY2tlZChhenhfZGV2KSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWF6eF9zdHJlYW1fcmVzZXQoY2hpcCwgYXp4X2Rldik7Ci0JZm9ybWF0X3ZhbCA9IHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0KHJ1bnRpbWUtPnJhdGUsCi0JCQkJCQlydW50aW1lLT5jaGFubmVscywKLQkJCQkJCXJ1bnRpbWUtPmZvcm1hdCwKLQkJCQkJCWhpbmZvLT5tYXhicHMsCi0JCQkJCQljdGxzKTsKLQlpZiAoIWZvcm1hdF92YWwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlgKLQkJCSAgICIlczogaW52YWxpZCBmb3JtYXRfdmFsLCByYXRlPSVkLCBjaD0lZCwgZm9ybWF0PSVkXG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+Y2hhbm5lbHMsIHJ1bnRpbWUtPmZvcm1hdCk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWJ1ZnNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQotCXNuZF9wcmludGRkKFNGWCAiJXM6IGF6eF9wY21fcHJlcGFyZTogYnVmc2l6ZT0weCV4LCBmb3JtYXQ9MHgleFxuIiwKLQkJICAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGJ1ZnNpemUsIGZvcm1hdF92YWwpOwotCi0JaWYgKGJ1ZnNpemUgIT0gYXp4X2Rldi0+YnVmc2l6ZSB8fAotCSAgICBwZXJpb2RfYnl0ZXMgIT0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzIHx8Ci0JICAgIGZvcm1hdF92YWwgIT0gYXp4X2Rldi0+Zm9ybWF0X3ZhbCB8fAotCSAgICBydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwICE9IGF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXApIHsKLQkJYXp4X2Rldi0+YnVmc2l6ZSA9IGJ1ZnNpemU7Ci0JCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IHBlcmlvZF9ieXRlczsKLQkJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IGZvcm1hdF92YWw7Ci0JCWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXAgPSBydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwOwotCQllcnIgPSBhenhfc2V0dXBfcGVyaW9kcyhjaGlwLCBzdWJzdHJlYW0sIGF6eF9kZXYpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gdW5sb2NrOwotCX0KLQotCS8qIHdoZW4gTFBJQiBkZWxheSBjb3JyZWN0aW9uIGdpdmVzIGEgc21hbGwgbmVnYXRpdmUgdmFsdWUsCi0JICogd2UgaWdub3JlIGl0OyBjdXJyZW50bHkgc2V0IHRoZSB0aHJlc2hvbGQgc3RhdGljYWxseSB0bwotCSAqIDY0IGZyYW1lcwotCSAqLwotCWlmIChydW50aW1lLT5wZXJpb2Rfc2l6ZSA+IDY0KQotCQlhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQgPSAtZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDY0KTsKLQllbHNlCi0JCWF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCA9IDA7Ci0KLQkvKiB3YWxsY2xrIGhhcyAyNE1oeiBjbG9jayBzb3VyY2UgKi8KLQlhenhfZGV2LT5wZXJpb2Rfd2FsbGNsayA9ICgoKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMjQwMDApIC8KLQkJCQkJCXJ1bnRpbWUtPnJhdGUpICogMTAwMCk7Ci0JYXp4X3NldHVwX2NvbnRyb2xsZXIoY2hpcCwgYXp4X2Rldik7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWF6eF9kZXYtPmZpZm9fc2l6ZSA9IGF6eF9zZF9yZWFkdyhhenhfZGV2LCBTRF9GSUZPU0laRSkgKyAxOwotCWVsc2UKLQkJYXp4X2Rldi0+Zmlmb19zaXplID0gMDsKLQotCXN0cmVhbV90YWcgPSBhenhfZGV2LT5zdHJlYW1fdGFnOwotCS8qIENBLUlCRyBjaGlwcyBuZWVkIHRoZSBwbGF5YmFjayBzdHJlYW0gc3RhcnRpbmcgZnJvbSAxICovCi0JaWYgKChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCkgJiYKLQkgICAgc3RyZWFtX3RhZyA+IGNoaXAtPmNhcHR1cmVfc3RyZWFtcykKLQkJc3RyZWFtX3RhZyAtPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7Ci0JZXJyID0gc25kX2hkYV9jb2RlY19wcmVwYXJlKGFwY20tPmNvZGVjLCBoaW5mbywgc3RyZWFtX3RhZywKLQkJCQkgICAgIGF6eF9kZXYtPmZvcm1hdF92YWwsIHN1YnN0cmVhbSk7Ci0KLSB1bmxvY2s6Ci0JaWYgKCFlcnIpCi0JCWF6eF9kZXYtPnByZXBhcmVkID0gMTsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKLQlpbnQgcnN0YXJ0ID0gMCwgc3RhcnQsIG5zeW5jID0gMCwgc2JpdHMgPSAwOwotCWludCBud2FpdCwgdGltZW91dDsKLQotCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXRyYWNlX2F6eF9wY21fdHJpZ2dlcihjaGlwLCBhenhfZGV2LCBjbWQpOwotCi0JaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikgfHwgIWF6eF9kZXYtPnByZXBhcmVkKQotCQlyZXR1cm4gLUVQSVBFOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlyc3RhcnQgPSAxOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQkJc3RhcnQgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJc3RhcnQgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewotCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQotCQkJY29udGludWU7Ci0JCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKLQkJc2JpdHMgfD0gMSA8PCBhenhfZGV2LT5pbmRleDsKLQkJbnN5bmMrKzsKLQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKLQl9Ci0KLQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCS8qIGZpcnN0LCBzZXQgU1lOQyBiaXRzIG9mIGNvcnJlc3BvbmRpbmcgc3RyZWFtcyAqLwotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19PTERfU1NZTkMpCi0JCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAotCQkJYXp4X3JlYWRsKGNoaXAsIE9MRF9TU1lOQykgfCBzYml0cyk7Ci0JZWxzZQotCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpIHwgc2JpdHMpOwotCi0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKLQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCWNvbnRpbnVlOwotCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYocyk7Ci0JCWlmIChzdGFydCkgewotCQkJYXp4X2Rldi0+c3RhcnRfd2FsbGNsayA9IGF6eF9yZWFkbChjaGlwLCBXQUxMQ0xLKTsKLQkJCWlmICghcnN0YXJ0KQotCQkJCWF6eF9kZXYtPnN0YXJ0X3dhbGxjbGsgLT0KLQkJCQkJCWF6eF9kZXYtPnBlcmlvZF93YWxsY2xrOwotCQkJYXp4X3N0cmVhbV9zdGFydChjaGlwLCBhenhfZGV2KTsKLQkJfSBlbHNlIHsKLQkJCWF6eF9zdHJlYW1fc3RvcChjaGlwLCBhenhfZGV2KTsKLQkJfQotCQlhenhfZGV2LT5ydW5uaW5nID0gc3RhcnQ7Ci0JfQotCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKHN0YXJ0KSB7Ci0JCS8qIHdhaXQgdW50aWwgYWxsIEZJRk9zIGdldCByZWFkeSAqLwotCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKLQkJCW53YWl0ID0gMDsKLQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7Ci0JCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOwotCQkJCWlmICghKGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9TVFMpICYKLQkJCQkgICAgICBTRF9TVFNfRklGT19SRUFEWSkpCi0JCQkJCW53YWl0Kys7Ci0JCQl9Ci0JCQlpZiAoIW53YWl0KQotCQkJCWJyZWFrOwotCQkJY3B1X3JlbGF4KCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiB3YWl0IHVudGlsIGFsbCBSVU4gYml0cyBhcmUgY2xlYXJlZCAqLwotCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pIHsKLQkJCW53YWl0ID0gMDsKLQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7Ci0JCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOwotCQkJCWlmIChhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSAmCi0JCQkJICAgIFNEX0NUTF9ETUFfU1RBUlQpCi0JCQkJCW53YWl0Kys7Ci0JCQl9Ci0JCQlpZiAoIW53YWl0KQotCQkJCWJyZWFrOwotCQkJY3B1X3JlbGF4KCk7Ci0JCX0KLQl9Ci0Jc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JLyogcmVzZXQgU1lOQyBiaXRzICovCi0JaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX09MRF9TU1lOQykKLQkJYXp4X3dyaXRlbChjaGlwLCBPTERfU1NZTkMsCi0JCQlhenhfcmVhZGwoY2hpcCwgT0xEX1NTWU5DKSAmIH5zYml0cyk7Ci0JZWxzZQotCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpICYgfnNiaXRzKTsKLQlpZiAoc3RhcnQpIHsKLQkJYXp4X3RpbWVjb3VudGVyX2luaXQoc3Vic3RyZWFtLCAwLCAwKTsKLQkJaWYgKG5zeW5jID4gMSkgewotCQkJY3ljbGVfdCBjeWNsZV9sYXN0OwotCi0JCQkvKiBzYW1lIHN0YXJ0IGN5Y2xlIGZvciBtYXN0ZXIgYW5kIGdyb3VwICovCi0JCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQkJCWN5Y2xlX2xhc3QgPSBhenhfZGV2LT5henhfdGMuY3ljbGVfbGFzdDsKLQotCQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKLQkJCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQotCQkJCQljb250aW51ZTsKLQkJCQlhenhfdGltZWNvdW50ZXJfaW5pdChzLCAxLCBjeWNsZV9sYXN0KTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiAwOwotfQotCi0vKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uIHdpdGggY29ycmVjdGlvbiBvbiBWSUEgY2hpcHMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3ZpYV9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKLQkJCQkJIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQotewotCXVuc2lnbmVkIGludCBsaW5rX3BvcywgbWluaV9wb3MsIGJvdW5kX3BvczsKLQl1bnNpZ25lZCBpbnQgbW9kX2xpbmtfcG9zLCBtb2RfZG1hX3BvcywgbW9kX21pbmlfcG9zOwotCXVuc2lnbmVkIGludCBmaWZvX3NpemU7Ci0KLQlsaW5rX3BvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKLQlpZiAoYXp4X2Rldi0+c3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkvKiBQbGF5YmFjaywgbm8gcHJvYmxlbSB1c2luZyBsaW5rIHBvc2l0aW9uICovCi0JCXJldHVybiBsaW5rX3BvczsKLQl9Ci0KLQkvKiBDYXB0dXJlICovCi0JLyogRm9yIG5ldyBjaGlwc2V0LAotCSAqIHVzZSBtb2QgdG8gZ2V0IHRoZSBETUEgcG9zaXRpb24ganVzdCBsaWtlIG9sZCBjaGlwc2V0Ci0JICovCi0JbW9kX2RtYV9wb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKLQltb2RfZG1hX3BvcyAlPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7Ci0KLQkvKiBhenhfZGV2LT5maWZvX3NpemUgY2FuJ3QgZ2V0IEZJRk8gc2l6ZSBvZiBpbiBzdHJlYW0uCi0JICogR2V0IGZyb20gYmFzZSBhZGRyZXNzICsgb2Zmc2V0LgotCSAqLwotCWZpZm9fc2l6ZSA9IHJlYWR3KGNoaXAtPnJlbWFwX2FkZHIgKyBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUKTsKLQotCWlmIChhenhfZGV2LT5pbnN1ZmZpY2llbnQpIHsKLQkJLyogTGluayBwb3NpdGlvbiBuZXZlciBnYXRoZXIgdGhhbiBGSUZPIHNpemUgKi8KLQkJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKLQkJCXJldHVybiAwOwotCi0JCWF6eF9kZXYtPmluc3VmZmljaWVudCA9IDA7Ci0JfQotCi0JaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKLQkJbWluaV9wb3MgPSBhenhfZGV2LT5idWZzaXplICsgbGlua19wb3MgLSBmaWZvX3NpemU7Ci0JZWxzZQotCQltaW5pX3BvcyA9IGxpbmtfcG9zIC0gZmlmb19zaXplOwotCi0JLyogRmluZCBuZWFyZXN0IHByZXZpb3VzIGJvdWRhcnkgKi8KLQltb2RfbWluaV9wb3MgPSBtaW5pX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKLQltb2RfbGlua19wb3MgPSBsaW5rX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKLQlpZiAobW9kX2xpbmtfcG9zID49IGZpZm9fc2l6ZSkKLQkJYm91bmRfcG9zID0gbGlua19wb3MgLSBtb2RfbGlua19wb3M7Ci0JZWxzZSBpZiAobW9kX2RtYV9wb3MgPj0gbW9kX21pbmlfcG9zKQotCQlib3VuZF9wb3MgPSBtaW5pX3BvcyAtIG1vZF9taW5pX3BvczsKLQllbHNlIHsKLQkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3MgKyBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7Ci0JCWlmIChib3VuZF9wb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKLQkJCWJvdW5kX3BvcyA9IDA7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHJlYWwgRE1BIHBvc2l0aW9uIHdlIHdhbnQgKi8KLQlyZXR1cm4gYm91bmRfcG9zICsgbW9kX2RtYV9wb3M7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2dldF9wb3NpdGlvbihzdHJ1Y3QgYXp4ICpjaGlwLAotCQkJCSAgICAgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYsCi0JCQkJICAgICBib29sIHdpdGhfY2hlY2spCi17Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JdW5zaWduZWQgaW50IHBvczsKLQlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N0cmVhbV07Ci0JaW50IGRlbGF5ID0gMDsKLQotCXN3aXRjaCAoY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0pIHsKLQljYXNlIFBPU19GSVhfTFBJQjoKLQkJLyogcmVhZCBMUElCICovCi0JCXBvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1NfRklYX1ZJQUNPTUJPOgotCQlwb3MgPSBhenhfdmlhX2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogdXNlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQkJcG9zID0gbGUzMl90b19jcHUoKmF6eF9kZXYtPnBvc2J1Zik7Ci0JCWlmICh3aXRoX2NoZWNrICYmIGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfQVVUTykgewotCQkJaWYgKCFwb3MgfHwgcG9zID09ICh1MzIpLTEpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgICAgICJoZGEtaW50ZWw6IEludmFsaWQgcG9zaXRpb24gYnVmZmVyLCAiCi0JCQkJICAgICAgICJ1c2luZyBMUElCIHJlYWQgbWV0aG9kIGluc3RlYWQuXG4iKTsKLQkJCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfTFBJQjsKLQkJCQlwb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7Ci0JCQl9IGVsc2UKLQkJCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfUE9TQlVGOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKLQkJcG9zID0gMDsKLQotCS8qIGNhbGN1bGF0ZSBydW50aW1lIGRlbGF5IGZyb20gTFBJQiAqLwotCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUgJiYKLQkgICAgY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPT0gUE9TX0ZJWF9QT1NCVUYgJiYKLQkgICAgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVkpKSB7Ci0JCXVuc2lnbmVkIGludCBscGliX3BvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKLQkJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJZGVsYXkgPSBwb3MgLSBscGliX3BvczsKLQkJZWxzZQotCQkJZGVsYXkgPSBscGliX3BvcyAtIHBvczsKLQkJaWYgKGRlbGF5IDwgMCkgewotCQkJaWYgKGRlbGF5ID49IGF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCkKLQkJCQlkZWxheSA9IDA7Ci0JCQllbHNlCi0JCQkJZGVsYXkgKz0gYXp4X2Rldi0+YnVmc2l6ZTsKLQkJfQotCQlpZiAoZGVsYXkgPj0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlgKLQkJCQkgICAiJXM6IFVuc3RhYmxlIExQSUIgKCVkID49ICVkKTsgIgotCQkJCSAgICJkaXNhYmxpbmcgTFBJQiBkZWxheSBjb3VudGluZ1xuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBkZWxheSwgYXp4X2Rldi0+cGVyaW9kX2J5dGVzKTsKLQkJCWRlbGF5ID0gMDsKLQkJCWNoaXAtPmRyaXZlcl9jYXBzICY9IH5BWlhfRENBUFNfQ09VTlRfTFBJQl9ERUxBWTsKLQkJfQotCQlkZWxheSA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRlbGF5KTsKLQl9Ci0KLQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lKSB7Ci0JCWlmIChoaW5mby0+b3BzLmdldF9kZWxheSkKLQkJCWRlbGF5ICs9IGhpbmZvLT5vcHMuZ2V0X2RlbGF5KGhpbmZvLCBhcGNtLT5jb2RlYywKLQkJCQkJCSAgICAgIHN1YnN0cmVhbSk7Ci0JCXN1YnN0cmVhbS0+cnVudGltZS0+ZGVsYXkgPSBkZWxheTsKLQl9Ci0KLQl0cmFjZV9henhfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYsIHBvcywgZGVsYXkpOwotCXJldHVybiBwb3M7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBhenhfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLAotCQkJICAgICAgIGF6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2RldiwgZmFsc2UpKTsKIH0KIAogLyoKQEAgLTI1MjEsNyArNDU0LDcgQEAKIAlpZiAod2FsbGNsayA8IChhenhfZGV2LT5wZXJpb2Rfd2FsbGNsayAqIDUpIC8gNCAmJgogCSAgICBwb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPiBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgLyAyKQogCQkvKiBORyAtIGl0J3MgYmVsb3cgdGhlIGZpcnN0IG5leHQgcGVyaW9kIGJvdW5kYXJ5ICovCi0JCXJldHVybiBiZGxfcG9zX2FkaltjaGlwLT5kZXZfaW5kZXhdID8gMCA6IC0xOworCQlyZXR1cm4gY2hpcC0+YmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XSA/IDAgOiAtMTsKIAlhenhfZGV2LT5zdGFydF93YWxsY2xrICs9IHdhbGxjbGs7CiAJcmV0dXJuIDE7IC8qIE9LLCBpdCdzIGZpbmUgKi8KIH0KQEAgLTI1MzUsMTAgKzQ2OCw5IEBACiAJaW50IGksIHBlbmRpbmcsIG9rOwogCiAJaWYgKCFjaGlwLT5pcnFfcGVuZGluZ193YXJuZWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhkYS1pbnRlbDogSVJRIHRpbWluZyB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZCAiCi0JCSAgICAgICAiZm9yIGNhcmQgIyVkLiBTdWdnZXN0IGEgYmlnZ2VyIGJkbF9wb3NfYWRqLlxuIiwKLQkJICAgICAgIGNoaXAtPmNhcmQtPm51bWJlcik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiSVJRIHRpbWluZyB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZCBmb3IgY2FyZCAjJWQuIFN1Z2dlc3QgYSBiaWdnZXIgYmRsX3Bvc19hZGouXG4iLAorCQkJIGNoaXAtPmNhcmQtPm51bWJlcik7CiAJCWNoaXAtPmlycV9wZW5kaW5nX3dhcm5lZCA9IDE7CiAJfQogCkBAIC0yNTgwLDEzOSArNTEyLDE0IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2Ci1zdGF0aWMgaW50IGF6eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKLXsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlpZiAoIWF6eF9zbm9vcChjaGlwKSkKLQkJYXJlYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShhcmVhLT52bV9wYWdlX3Byb3QpOwotCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGF6eF9wY21fbW1hcAlOVUxMCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKLQkub3BlbiA9IGF6eF9wY21fb3BlbiwKLQkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLAotCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMgPSBhenhfcGNtX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9IGF6eF9wY21faHdfZnJlZSwKLQkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKLQkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKLQkud2FsbF9jbG9jayA9ICBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAsCi0JLm1tYXAgPSBhenhfcGNtX21tYXAsCi0JLnBhZ2UgPSBzbmRfcGNtX3NnYnVmX29wc19wYWdlLAotfTsKLQotc3RhdGljIHZvaWQgYXp4X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBwY20tPnByaXZhdGVfZGF0YTsKLQlpZiAoYXBjbSkgewotCQlsaXN0X2RlbCgmYXBjbS0+bGlzdCk7Ci0JCWtmcmVlKGFwY20pOwotCX0KLX0KLQotI2RlZmluZSBNQVhfUFJFQUxMT0NfU0laRQkoMzIgKiAxMDI0ICogMTAyNCkKLQotc3RhdGljIGludAotYXp4X2F0dGFjaF9wY21fc3RyZWFtKHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkgICAgICBzdHJ1Y3QgaGRhX3BjbSAqY3BjbSkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbTsKLQlpbnQgcGNtX2RldiA9IGNwY20tPmRldmljZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQlpbnQgcywgZXJyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShhcGNtLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGFwY20tPnBjbS0+ZGV2aWNlID09IHBjbV9kZXYpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogUENNICVkIGFscmVhZHkgZXhpc3RzXG4iLAotCQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIHBjbV9kZXYpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjcGNtLT5uYW1lLCBwY21fZGV2LAotCQkJICBjcGNtLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtcywKLQkJCSAgY3BjbS0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcywKLQkJCSAgJnBjbSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0Jc3RybGNweShwY20tPm5hbWUsIGNwY20tPm5hbWUsIHNpemVvZihwY20tPm5hbWUpKTsKLQlhcGNtID0ga3phbGxvYyhzaXplb2YoKmFwY20pLCBHRlBfS0VSTkVMKTsKLQlpZiAoYXBjbSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlhcGNtLT5jaGlwID0gY2hpcDsKLQlhcGNtLT5wY20gPSBwY207Ci0JYXBjbS0+Y29kZWMgPSBjb2RlYzsKLQlwY20tPnByaXZhdGVfZGF0YSA9IGFwY207Ci0JcGNtLT5wcml2YXRlX2ZyZWUgPSBhenhfcGNtX2ZyZWU7Ci0JaWYgKGNwY20tPnBjbV90eXBlID09IEhEQV9QQ01fVFlQRV9NT0RFTSkKLQkJcGNtLT5kZXZfY2xhc3MgPSBTTkRSVl9QQ01fQ0xBU1NfTU9ERU07Ci0JbGlzdF9hZGRfdGFpbCgmYXBjbS0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKLQljcGNtLT5wY20gPSBwY207Ci0JZm9yIChzID0gMDsgcyA8IDI7IHMrKykgewotCQlhcGNtLT5oaW5mb1tzXSA9ICZjcGNtLT5zdHJlYW1bc107Ci0JCWlmIChjcGNtLT5zdHJlYW1bc10uc3Vic3RyZWFtcykKLQkJCXNuZF9wY21fc2V0X29wcyhwY20sIHMsICZhenhfcGNtX29wcyk7Ci0JfQotCS8qIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbiAqLwotCXNpemUgPSBDT05GSUdfU05EX0hEQV9QUkVBTExPQ19TSVpFICogMTAyNDsKLQlpZiAoc2l6ZSA+IE1BWF9QUkVBTExPQ19TSVpFKQotCQlzaXplID0gTUFYX1BSRUFMTE9DX1NJWkU7Ci0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKLQkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkgICAgICBzaXplLCBNQVhfUFJFQUxMT0NfU0laRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBtaXhlciBjcmVhdGlvbiAtIGFsbCBzdHVmZiBpcyBpbXBsZW1lbnRlZCBpbiBoZGEgbW9kdWxlCi0gKi8KLXN0YXRpYyBpbnQgYXp4X21peGVyX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXJldHVybiBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKGNoaXAtPmJ1cyk7Ci19Ci0KLQotLyoKLSAqIGluaXRpYWxpemUgU0Qgc3RyZWFtcwotICovCi1zdGF0aWMgaW50IGF6eF9pbml0X3N0cmVhbShzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWludCBpOwotCi0JLyogaW5pdGlhbGl6ZSBlYWNoIHN0cmVhbSAoYWthIGRldmljZSkKLQkgKiBhc3NpZ24gdGhlIHN0YXJ0aW5nIGJkbCBhZGRyZXNzIHRvIGVhY2ggc3RyZWFtIChkZXZpY2UpCi0JICogYW5kIGluaXRpYWxpemUKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwotCQlhenhfZGV2LT5wb3NidWYgPSAodTMyIF9faW9tZW0gKikoY2hpcC0+cG9zYnVmLmFyZWEgKyBpICogOCk7Ci0JCS8qIG9mZnNldDogU0RJMD0weDgwLCBTREkxPTB4YTAsIC4uLiBTRE8zPTB4MTYwICovCi0JCWF6eF9kZXYtPnNkX2FkZHIgPSBjaGlwLT5yZW1hcF9hZGRyICsgKDB4MjAgKiBpICsgMHg4MCk7Ci0JCS8qIGludCBtYXNrOiBTREkwPTB4MDEsIFNESTE9MHgwMiwgLi4uIFNETzM9MHg4MCAqLwotCQlhenhfZGV2LT5zZF9pbnRfc3RhX21hc2sgPSAxIDw8IGk7Ci0JCS8qIHN0cmVhbSB0YWc6IG11c3QgYmUgbm9uLXplcm8gYW5kIHVuaXF1ZSAqLwotCQlhenhfZGV2LT5pbmRleCA9IGk7Ci0JCWF6eF9kZXYtPnN0cmVhbV90YWcgPSBpICsgMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBhenhfYWNxdWlyZV9pcnEoc3RydWN0IGF6eCAqY2hpcCwgaW50IGRvX2Rpc2Nvbm5lY3QpCiB7CiAJaWYgKHJlcXVlc3RfaXJxKGNoaXAtPnBjaS0+aXJxLCBhenhfaW50ZXJydXB0LAogCQkJY2hpcC0+bXNpID8gMCA6IElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGRhLWludGVsOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBjaGlwLT5wY2ktPmlycSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byBncmFiIElSUSAlZCwgZGlzYWJsaW5nIGRldmljZVxuIiwKKwkJCWNoaXAtPnBjaS0+aXJxKTsKIAkJaWYgKGRvX2Rpc2Nvbm5lY3QpCiAJCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNoaXAtPmNhcmQpOwogCQlyZXR1cm4gLTE7CkBAIC0yNzIyLDE2MCArNTI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaWYgKCFjaGlwLT5pbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JYXp4X2ludF9kaXNhYmxlKGNoaXApOwotCWF6eF9pbnRfY2xlYXIoY2hpcCk7Ci0KLQkvKiBkaXNhYmxlIENPUkIvUklSQiAqLwotCWF6eF9mcmVlX2NtZF9pbyhjaGlwKTsKLQotCS8qIGRpc2FibGUgcG9zaXRpb24gYnVmZmVyICovCi0JYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKLQlhenhfd3JpdGVsKGNoaXAsIERQVUJBU0UsIDApOwotCi0JY2hpcC0+aW5pdGlhbGl6ZWQgPSAwOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotLyoKLSAqIERTUCBsb2FkaW5nIGNvZGUgKGUuZy4gZm9yIENBMDEzMikKLSAqLwotCi0vKiB1c2UgdGhlIGZpcnN0IHN0cmVhbSBmb3IgbG9hZGluZyBEU1AgKi8KLXN0YXRpYyBzdHJ1Y3QgYXp4X2RldiAqCi1henhfZ2V0X2RzcF9sb2FkZXJfZGV2KHN0cnVjdCBhenggKmNoaXApCi17Ci0JcmV0dXJuICZjaGlwLT5henhfZGV2W2NoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldF07Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X2xvYWRfZHNwX3ByZXBhcmUoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGZvcm1hdCwKLQkJCQl1bnNpZ25lZCBpbnQgYnl0ZV9zaXplLAotCQkJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmcCkKLXsKLQl1MzIgKmJkbDsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7Ci0JaW50IGVycjsKLQotCWF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOwotCi0JZHNwX2xvY2soYXp4X2Rldik7Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCWlmIChhenhfZGV2LT5ydW5uaW5nIHx8IGF6eF9kZXYtPmxvY2tlZCkgewotCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JYXp4X2Rldi0+cHJlcGFyZWQgPSAwOwotCWNoaXAtPnNhdmVkX2F6eF9kZXYgPSAqYXp4X2RldjsKLQlhenhfZGV2LT5sb2NrZWQgPSAxOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCi0JZXJyID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVZfU0csCi0JCQkJICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJICBieXRlX3NpemUsIGJ1ZnApOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9hbGxvYzsKLQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgYnVmcCwgdHJ1ZSk7Ci0JYXp4X2Rldi0+YnVmc2l6ZSA9IGJ5dGVfc2l6ZTsKLQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSBieXRlX3NpemU7Ci0JYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IGZvcm1hdDsKLQotCWF6eF9zdHJlYW1fcmVzZXQoY2hpcCwgYXp4X2Rldik7Ci0KLQkvKiByZXNldCBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsIDApOwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUFUsIDApOwotCi0JYXp4X2Rldi0+ZnJhZ3MgPSAwOwotCWJkbCA9ICh1MzIgKilhenhfZGV2LT5iZGwuYXJlYTsKLQllcnIgPSBzZXR1cF9iZGxlKGNoaXAsIGJ1ZnAsIGF6eF9kZXYsICZiZGwsIDAsIGJ5dGVfc2l6ZSwgMCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlhenhfc2V0dXBfY29udHJvbGxlcihjaGlwLCBhenhfZGV2KTsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiBhenhfZGV2LT5zdHJlYW1fdGFnOwotCi0gZXJyb3I6Ci0JbWFya19wYWdlc193YyhjaGlwLCBidWZwLCBmYWxzZSk7Ci0Jc25kX2RtYV9mcmVlX3BhZ2VzKGJ1ZnApOwotIGVycl9hbGxvYzoKLQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKGF6eF9kZXYtPm9wZW5lZCkKLQkJKmF6eF9kZXYgPSBjaGlwLT5zYXZlZF9henhfZGV2OwotCWF6eF9kZXYtPmxvY2tlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0gdW5sb2NrOgotCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX3RyaWdnZXIoc3RydWN0IGhkYV9idXMgKmJ1cywgYm9vbCBzdGFydCkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOwotCi0JaWYgKHN0YXJ0KQotCQlhenhfc3RyZWFtX3N0YXJ0KGNoaXAsIGF6eF9kZXYpOwotCWVsc2UKLQkJYXp4X3N0cmVhbV9zdG9wKGNoaXAsIGF6eF9kZXYpOwotCWF6eF9kZXYtPnJ1bm5pbmcgPSBzdGFydDsKLX0KLQotc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX2NsZWFudXAoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7Ci0KLQlpZiAoIWRtYWItPmFyZWEgfHwgIWF6eF9kZXYtPmxvY2tlZCkKLQkJcmV0dXJuOwotCi0JZHNwX2xvY2soYXp4X2Rldik7Ci0JLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0NUTCwgMCk7Ci0JYXp4X2Rldi0+YnVmc2l6ZSA9IDA7Ci0JYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gMDsKLQlhenhfZGV2LT5mb3JtYXRfdmFsID0gMDsKLQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgZG1hYiwgZmFsc2UpOwotCXNuZF9kbWFfZnJlZV9wYWdlcyhkbWFiKTsKLQlkbWFiLT5hcmVhID0gTlVMTDsKLQotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlpZiAoYXp4X2Rldi0+b3BlbmVkKQotCQkqYXp4X2RldiA9IGNoaXAtPnNhdmVkX2F6eF9kZXY7Ci0JYXp4X2Rldi0+bG9ja2VkID0gMDsKLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotfQotI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIgKi8KLQogI2lmZGVmIENPTkZJR19QTQotLyogcG93ZXItdXAvZG93biB0aGUgY29udHJvbGxlciAqLwotc3RhdGljIHZvaWQgYXp4X3Bvd2VyX25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHBvd2VyX3VwKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQotCWlmICghKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpKQotCQlyZXR1cm47Ci0KLQlpZiAocG93ZXJfdXApCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmNoaXAtPnBjaS0+ZGV2KTsKLQllbHNlCi0JCXBtX3J1bnRpbWVfcHV0X3N5bmMoJmNoaXAtPnBjaS0+ZGV2KTsKLX0KLQogc3RhdGljIERFRklORV9NVVRFWChjYXJkX2xpc3RfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKGNhcmRfbGlzdCk7CiAKQEAgLTI5NjksOCArNjIzLDggQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImhkYS1pbnRlbDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTMxMjcsMzYgKzc4MSwzMiBAQAogCWlmICghY2hpcC0+YnVzKSB7CiAJCWNoaXAtPmRpc2FibGVkID0gZGlzYWJsZWQ7CiAJCWlmICghZGlzYWJsZWQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWAotCQkJCSAgICIlczogU3RhcnQgZGVsYXllZCBpbml0aWFsaXphdGlvblxuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlN0YXJ0IGRlbGF5ZWQgaW5pdGlhbGl6YXRpb25cbiIpOwogCQkJaWYgKGF6eF9wcm9iZV9jb250aW51ZShjaGlwKSA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWAotCQkJCQkgICAiJXM6IGluaXRpYWxpemF0aW9uIGVycm9yXG4iLAotCQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKIAkJCQljaGlwLT5pbml0X2ZhaWxlZCA9IHRydWU7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyBTRlgKLQkJCSAgICIlczogJXMgdmlhIFZHQS1zd2l0Y2hlcm9vXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpLAotCQkJICAgZGlzYWJsZWQgPyAiRGlzYWJsaW5nIiA6ICJFbmFibGluZyIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICIlcyB2aWEgVkdBLXN3aXRjaGVyb29cbiIsCisJCQkgZGlzYWJsZWQgPyAiRGlzYWJsaW5nIiA6ICJFbmFibGluZyIpOwogCQlpZiAoZGlzYWJsZWQpIHsKLQkJCXBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZCgmcGNpLT5kZXYpOwotCQkJYXp4X3N1c3BlbmQoJnBjaS0+ZGV2KTsKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZChjYXJkLT5kZXYpOworCQkJYXp4X3N1c3BlbmQoY2FyZC0+ZGV2KTsKIAkJCS8qIHdoZW4gd2UgZ2V0IHN1c3BlbmRlZCBieSB2Z2Egc3dpdGNoZXJvbyB3ZSBlbmQgdXAgaW4gRDNjb2xkLAogCQkJICogaG93ZXZlciB3ZSBoYXZlIG5vIEFDUEkgaGFuZGxlLCBzbyBwY2kvYWNwaSBjYW4ndCBwdXQgdXMgdGhlcmUsCiAJCQkgKiBwdXQgb3Vyc2VsdmVzIHRoZXJlICovCiAJCQlwY2ktPmN1cnJlbnRfc3RhdGUgPSBQQ0lfRDNjb2xkOwogCQkJY2hpcC0+ZGlzYWJsZWQgPSB0cnVlOwogCQkJaWYgKHNuZF9oZGFfbG9ja19kZXZpY2VzKGNoaXAtPmJ1cykpCi0JCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICIlczogQ2Fubm90IGxvY2sgZGV2aWNlcyFcbiIsCi0JCQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJICJDYW5ub3QgbG9jayBkZXZpY2VzIVxuIik7CiAJCX0gZWxzZSB7CiAJCQlzbmRfaGRhX3VubG9ja19kZXZpY2VzKGNoaXAtPmJ1cyk7Ci0JCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmcGNpLT5kZXYpOworCQkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoY2FyZC0+ZGV2KTsKIAkJCWNoaXAtPmRpc2FibGVkID0gZmFsc2U7Ci0JCQlhenhfcmVzdW1lKCZwY2ktPmRldik7CisJCQlhenhfcmVzdW1lKGNhcmQtPmRldik7CiAJCX0KIAl9CiB9CkBAIC0zMTgxLDkgKzgzMSw4IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnAgPSBnZXRfYm91bmRfdmdhKGNoaXAtPnBjaSk7CiAJaWYgKHApIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gU0ZYCi0JCQkgICAiJXM6IEhhbmRsZSBWR0Etc3dpdGNoZXJvbyBhdWRpbyBjbGllbnRcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJIYW5kbGUgVkdBLXN3aXRjaGVyb28gYXVkaW8gY2xpZW50XG4iKTsKIAkJY2hpcC0+dXNlX3ZnYV9zd2l0Y2hlcm9vID0gMTsKIAkJcGNpX2Rldl9wdXQocCk7CiAJfQpAQCAtMzIxMSw3ICs4NjAsOCBAQAogCWNoaXAtPnZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyZWQgPSAxOwogCiAJLyogcmVnaXN0ZXIgYXMgYW4gb3B0aW11cyBoZG1pIGF1ZGlvIHBvd2VyIGRvbWFpbiAqLwotCXZnYV9zd2l0Y2hlcm9vX2luaXRfZG9tYWluX3BtX29wdGltdXNfaGRtaV9hdWRpbygmY2hpcC0+cGNpLT5kZXYsICZjaGlwLT5oZG1pX3BtX2RvbWFpbik7CisJdmdhX3N3aXRjaGVyb29faW5pdF9kb21haW5fcG1fb3B0aW11c19oZG1pX2F1ZGlvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkgJmNoaXAtPmhkbWlfcG1fZG9tYWluKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC0zMjYwLDIxICs5MTAsNyBAQAogCWlmIChjaGlwLT5yZW1hcF9hZGRyKQogCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCi0JaWYgKGNoaXAtPmF6eF9kZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspCi0JCQlpZiAoY2hpcC0+YXp4X2RldltpXS5iZGwuYXJlYSkgewotCQkJCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPmF6eF9kZXZbaV0uYmRsLCBmYWxzZSk7Ci0JCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5henhfZGV2W2ldLmJkbCk7Ci0JCQl9Ci0JfQotCWlmIChjaGlwLT5yYi5hcmVhKSB7Ci0JCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnJiLCBmYWxzZSk7Ci0JCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cmIpOwotCX0KLQlpZiAoY2hpcC0+cG9zYnVmLmFyZWEpIHsKLQkJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+cG9zYnVmLCBmYWxzZSk7Ci0JCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cG9zYnVmKTsKLQl9CisJYXp4X2ZyZWVfc3RyZWFtX3BhZ2VzKGNoaXApOwogCWlmIChjaGlwLT5yZWdpb25fcmVxdWVzdGVkKQogCQlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CkBAIC0zMzc0LDIwICsxMDEwLDE5IEBACiAKIAlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY2hpcC0+cGNpLCBwb3NpdGlvbl9maXhfbGlzdCk7CiAJaWYgKHEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgImhkYV9pbnRlbDogcG9zaXRpb25fZml4IHNldCB0byAlZCAiCi0JCSAgICAgICAiZm9yIGRldmljZSAlMDR4OiUwNHhcbiIsCi0JCSAgICAgICBxLT52YWx1ZSwgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkgInBvc2l0aW9uX2ZpeCBzZXQgdG8gJWQgZm9yIGRldmljZSAlMDR4OiUwNHhcbiIsCisJCQkgcS0+dmFsdWUsIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlKTsKIAkJcmV0dXJuIHEtPnZhbHVlOwogCX0KIAogCS8qIENoZWNrIFZJQS9BVEkgSEQgQXVkaW8gQ29udHJvbGxlciBleGlzdCAqLwogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19QT1NGSVhfVklBKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogVXNpbmcgVklBQ09NQk8gcG9zaXRpb24gZml4XG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJVc2luZyBWSUFDT01CTyBwb3NpdGlvbiBmaXhcbiIpOwogCQlyZXR1cm4gUE9TX0ZJWF9WSUFDT01CTzsKIAl9CiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BPU0ZJWF9MUElCKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogVXNpbmcgTFBJQiBwb3NpdGlvbiBmaXhcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlVzaW5nIExQSUIgcG9zaXRpb24gZml4XG4iKTsKIAkJcmV0dXJuIFBPU19GSVhfTFBJQjsKIAl9CiAJcmV0dXJuIFBPU19GSVhfQVVUTzsKQEAgLTM0MjUsMTAgKzEwNjAsOSBAQAogCWlmIChjaGlwLT5jb2RlY19wcm9iZV9tYXNrID09IC0xKSB7CiAJCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChjaGlwLT5wY2ksIHByb2JlX21hc2tfbGlzdCk7CiAJCWlmIChxKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9pbnRlbDogcHJvYmVfbWFzayBzZXQgdG8gMHgleCAiCi0JCQkgICAgICAgImZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAotCQkJICAgICAgIHEtPnZhbHVlLCBxLT5zdWJ2ZW5kb3IsIHEtPnN1YmRldmljZSk7CisJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJwcm9iZV9tYXNrIHNldCB0byAweCV4IGZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAorCQkJCSBxLT52YWx1ZSwgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UpOwogCQkJY2hpcC0+Y29kZWNfcHJvYmVfbWFzayA9IHEtPnZhbHVlOwogCQl9CiAJfQpAQCAtMzQzNyw4ICsxMDcxLDggQEAKIAlpZiAoY2hpcC0+Y29kZWNfcHJvYmVfbWFzayAhPSAtMSAmJgogCSAgICAoY2hpcC0+Y29kZWNfcHJvYmVfbWFzayAmIEFaWF9GT1JDRV9DT0RFQ19NQVNLKSkgewogCQljaGlwLT5jb2RlY19tYXNrID0gY2hpcC0+Y29kZWNfcHJvYmVfbWFzayAmIDB4ZmY7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9pbnRlbDogY29kZWNfbWFzayBmb3JjZWQgdG8gMHgleFxuIiwKLQkJICAgICAgIGNoaXAtPmNvZGVjX21hc2spOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJjb2RlY19tYXNrIGZvcmNlZCB0byAweCV4XG4iLAorCQkJIGNoaXAtPmNvZGVjX21hc2spOwogCX0KIH0KIApAQCAtMzQ3MCwxNiArMTEwNCwxNiBAQAogCWNoaXAtPm1zaSA9IDE7CS8qIGVuYWJsZSBNU0kgYXMgZGVmYXVsdCAqLwogCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChjaGlwLT5wY2ksIG1zaV9ibGFja19saXN0KTsKIAlpZiAocSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiaGRhX2ludGVsOiBtc2kgZm9yIGRldmljZSAlMDR4OiUwNHggc2V0IHRvICVkXG4iLAotCQkgICAgICAgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UsIHEtPnZhbHVlKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJtc2kgZm9yIGRldmljZSAlMDR4OiUwNHggc2V0IHRvICVkXG4iLAorCQkJIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlLCBxLT52YWx1ZSk7CiAJCWNoaXAtPm1zaSA9IHEtPnZhbHVlOwogCQlyZXR1cm47CiAJfQogCiAJLyogTlZpZGlhIGNoaXBzZXRzIHNlZW0gdG8gY2F1c2UgdHJvdWJsZXMgd2l0aCBNU0kgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfTk9fTVNJKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9pbnRlbDogRGlzYWJsaW5nIE1TSVxuIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIkRpc2FibGluZyBNU0lcbiIpOwogCQljaGlwLT5tc2kgPSAwOwogCX0KIH0KQEAgLTM1MTEsOCArMTE0NSw4IEBACiAJfQogCiAJaWYgKHNub29wICE9IGNoaXAtPnNub29wKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWCAiJXM6IEZvcmNlIHRvICVzIG1vZGVcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBzbm9vcCA/ICJzbm9vcCIgOiAibm9uLXNub29wIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIkZvcmNlIHRvICVzIG1vZGVcbiIsCisJCQkgc25vb3AgPyAic25vb3AiIDogIm5vbi1zbm9vcCIpOwogCQljaGlwLT5zbm9vcCA9IHNub29wOwogCX0KIH0KQEAgLTM1MjcsNiArMTE2MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYXp4X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCiAJCSAgICAgIGludCBkZXYsIHVuc2lnbmVkIGludCBkcml2ZXJfY2FwcywKKwkJICAgICAgY29uc3Qgc3RydWN0IGhkYV9jb250cm9sbGVyX29wcyAqaGRhX29wcywKIAkJICAgICAgc3RydWN0IGF6eCAqKnJjaGlwKQogewogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewpAQCAtMzU0Myw3ICsxMTc4LDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghY2hpcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IENhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iLCBwY2lfbmFtZShwY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgY2hpcFxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zNTUyLDExICsxMTg3LDEzIEBACiAJbXV0ZXhfaW5pdCgmY2hpcC0+b3Blbl9tdXRleCk7CiAJY2hpcC0+Y2FyZCA9IGNhcmQ7CiAJY2hpcC0+cGNpID0gcGNpOworCWNoaXAtPm9wcyA9IGhkYV9vcHM7CiAJY2hpcC0+aXJxID0gLTE7CiAJY2hpcC0+ZHJpdmVyX2NhcHMgPSBkcml2ZXJfY2FwczsKIAljaGlwLT5kcml2ZXJfdHlwZSA9IGRyaXZlcl9jYXBzICYgMHhmZjsKIAljaGVja19tc2koY2hpcCk7CiAJY2hpcC0+ZGV2X2luZGV4ID0gZGV2OworCWNoaXAtPmphY2twb2xsX21zID0gamFja3BvbGxfbXM7CiAJSU5JVF9XT1JLKCZjaGlwLT5pcnFfcGVuZGluZ193b3JrLCBhenhfaXJxX3BlbmRpbmdfd29yayk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPnBjbV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY2hpcC0+bGlzdCk7CkBAIC0zNTg4LDExICsxMjI1LDExIEBACiAJCQlicmVhazsKIAkJfQogCX0KKwljaGlwLT5iZGxfcG9zX2FkaiA9IGJkbF9wb3NfYWRqOwogCiAJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IEVycm9yIGNyZWF0aW5nIGRldmljZSBbY2FyZF0hXG4iLAotCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJFcnJvciBjcmVhdGluZyBkZXZpY2UgW2NhcmRdIVxuIik7CiAJCWF6eF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTM2MTAsNyArMTI0Nyw3IEBACiAJaW50IGRldiA9IGNoaXAtPmRldl9pbmRleDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gY2hpcC0+cGNpOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7Ci0JaW50IGksIGVycjsKKwlpbnQgZXJyOwogCXVuc2lnbmVkIHNob3J0IGdjYXA7CiAKICNpZiBCSVRTX1BFUl9MT05HICE9IDY0CkBAIC0zNjMxLDcgKzEyNjgsNyBAQAogCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5yZW1hcF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IGlvcmVtYXAgZXJyb3JcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImlvcmVtYXAgZXJyb3JcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIApAQCAtMzY0Niw3ICsxMjgzLDcgQEAKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAogCWdjYXAgPSBhenhfcmVhZHcoY2hpcCwgR0NBUCk7Ci0Jc25kX3ByaW50ZGQoU0ZYICIlczogY2hpcHNldCBnbG9iYWwgY2FwYWJpbGl0aWVzID0gMHgleFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwgZ2NhcCk7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjaGlwc2V0IGdsb2JhbCBjYXBhYmlsaXRpZXMgPSAweCV4XG4iLCBnY2FwKTsKIAogCS8qIGRpc2FibGUgU0I2MDAgNjRiaXQgc3VwcG9ydCBmb3Igc2FmZXR5ICovCiAJaWYgKGNoaXAtPnBjaS0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVRJKSB7CkBAIC0zNjYzLDcgKzEzMDAsNyBAQAogCiAJLyogZGlzYWJsZSA2NGJpdCBETUEgYWRkcmVzcyBvbiBzb21lIGRldmljZXMgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfTk9fNjRCSVQpIHsKLQkJc25kX3ByaW50ZChTRlggIiVzOiBEaXNhYmxpbmcgNjRiaXQgRE1BXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2RiZyhjYXJkLT5kZXYsICJEaXNhYmxpbmcgNjRiaXQgRE1BXG4iKTsKIAkJZ2NhcCAmPSB+SUNINl9HQ0FQXzY0T0s7CiAJfQogCkBAIC0zNzE4LDMzICsxMzU1LDExIEBACiAJY2hpcC0+YXp4X2RldiA9IGtjYWxsb2MoY2hpcC0+bnVtX3N0cmVhbXMsIHNpemVvZigqY2hpcC0+YXp4X2RldiksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlwLT5henhfZGV2KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogY2Fubm90IG1hbGxvYyBhenhfZGV2XG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgbWFsbG9jIGF6eF9kZXZcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlkc3BfbG9ja19pbml0KCZjaGlwLT5henhfZGV2W2ldKTsKLQkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgQkRMIGZvciBlYWNoIHN0cmVhbSAqLwotCQllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCQkJICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJCSAgQkRMX1NJWkUsICZjaGlwLT5henhfZGV2W2ldLmJkbCk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBCRExcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+YXp4X2RldltpXS5iZGwsIHRydWUpOwotCX0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCQkgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKLQkJCQkgIGNoaXAtPm51bV9zdHJlYW1zICogOCwgJmNoaXAtPnBvc2J1Zik7Ci0JaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBjYW5ub3QgYWxsb2NhdGUgcG9zYnVmXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnBvc2J1ZiwgdHJ1ZSk7Ci0JLyogYWxsb2NhdGUgQ09SQi9SSVJCICovCi0JZXJyID0gYXp4X2FsbG9jX2NtZF9pbyhjaGlwKTsKKwllcnIgPSBhenhfYWxsb2Nfc3RyZWFtX3BhZ2VzKGNoaXApOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zNzU3LDcgKzEzNzIsNyBAQAogCiAJLyogY29kZWMgZGV0ZWN0aW9uICovCiAJaWYgKCFjaGlwLT5jb2RlY19tYXNrKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogbm8gY29kZWNzIGZvdW5kIVxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibm8gY29kZWNzIGZvdW5kIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMzc5Myw4ICsxNDA4LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gY2hpcC0+cGNpOwogCiAJaWYgKCFmdykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IENhbm5vdCBsb2FkIGZpcm13YXJlLCBhYm9ydGluZ1xuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbm5vdCBsb2FkIGZpcm13YXJlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0zODEyLDYgKzE0MjYsMTMyIEBACiB9CiAjZW5kaWYKIAorLyoKKyAqIEhEQSBjb250cm9sbGVyIG9wcy4KKyAqLworCisvKiBQQ0kgcmVnaXN0ZXIgYWNjZXNzLiAqLworc3RhdGljIHZvaWQgcGNpX2F6eF93cml0ZWwodTMyIHZhbHVlLCB1MzIgX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZWwodmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgdTMyIHBjaV9henhfcmVhZGwodTMyIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBwY2lfYXp4X3dyaXRldyh1MTYgdmFsdWUsIHUxNiBfX2lvbWVtICphZGRyKQoreworCXdyaXRldyh2YWx1ZSwgYWRkcik7Cit9CisKK3N0YXRpYyB1MTYgcGNpX2F6eF9yZWFkdyh1MTYgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9henhfd3JpdGViKHU4IHZhbHVlLCB1OCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlYih2YWx1ZSwgYWRkcik7Cit9CisKK3N0YXRpYyB1OCBwY2lfYXp4X3JlYWRiKHU4IF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRiKGFkZHIpOworfQorCitzdGF0aWMgaW50IGRpc2FibGVfbXNpX3Jlc2V0X2lycShzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWludCBlcnI7CisKKwlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCWNoaXAtPmlycSA9IC0xOworCXBjaV9kaXNhYmxlX21zaShjaGlwLT5wY2kpOworCWNoaXAtPm1zaSA9IDA7CisJZXJyID0gYXp4X2FjcXVpcmVfaXJxKGNoaXAsIDEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERNQSBwYWdlIGFsbG9jYXRpb24gaGVscGVycy4gICovCitzdGF0aWMgaW50IGRtYV9hbGxvY19wYWdlcyhzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJICAgaW50IHR5cGUsCisJCQkgICBzaXplX3Qgc2l6ZSwKKwkJCSAgIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmKQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKHR5cGUsCisJCQkJICBjaGlwLT5jYXJkLT5kZXYsCisJCQkJICBzaXplLCBidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCW1hcmtfcGFnZXNfd2MoY2hpcCwgYnVmLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX2ZyZWVfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpCit7CisJbWFya19wYWdlc193YyhjaGlwLCBidWYsIGZhbHNlKTsKKwlzbmRfZG1hX2ZyZWVfcGFnZXMoYnVmKTsKK30KKworc3RhdGljIGludCBzdWJzdHJlYW1fYWxsb2NfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlpbnQgcmV0OworCisJbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOworCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOworCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7CisJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7CisJcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3Vic3RyZWFtX2ZyZWVfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbV9tbWFwX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKyNpZmRlZiBDT05GSUdfWDg2CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCWFyZWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUoYXJlYS0+dm1fcGFnZV9wcm90KTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb250cm9sbGVyX29wcyBwY2lfaGRhX29wcyA9IHsKKwkucmVnX3dyaXRlbCA9IHBjaV9henhfd3JpdGVsLAorCS5yZWdfcmVhZGwgPSBwY2lfYXp4X3JlYWRsLAorCS5yZWdfd3JpdGV3ID0gcGNpX2F6eF93cml0ZXcsCisJLnJlZ19yZWFkdyA9IHBjaV9henhfcmVhZHcsCisJLnJlZ193cml0ZWIgPSBwY2lfYXp4X3dyaXRlYiwKKwkucmVnX3JlYWRiID0gcGNpX2F6eF9yZWFkYiwKKwkuZGlzYWJsZV9tc2lfcmVzZXRfaXJxID0gZGlzYWJsZV9tc2lfcmVzZXRfaXJxLAorCS5kbWFfYWxsb2NfcGFnZXMgPSBkbWFfYWxsb2NfcGFnZXMsCisJLmRtYV9mcmVlX3BhZ2VzID0gZG1hX2ZyZWVfcGFnZXMsCisJLnN1YnN0cmVhbV9hbGxvY19wYWdlcyA9IHN1YnN0cmVhbV9hbGxvY19wYWdlcywKKwkuc3Vic3RyZWFtX2ZyZWVfcGFnZXMgPSBzdWJzdHJlYW1fZnJlZV9wYWdlcywKKwkucGNtX21tYXBfcHJlcGFyZSA9IHBjbV9tbWFwX3ByZXBhcmUsCisJLnBvc2l0aW9uX2NoZWNrID0gYXp4X3Bvc2l0aW9uX2NoZWNrLAorfTsKKwogc3RhdGljIGludCBhenhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQogewpAQCAtMzgyOCwxNSArMTU2OCwxNSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGEtaW50ZWw6IEVycm9yIGNyZWF0aW5nIGNhcmQhXG4iKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJFcnJvciBjcmVhdGluZyBjYXJkIVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCi0JZXJyID0gYXp4X2NyZWF0ZShjYXJkLCBwY2ksIGRldiwgcGNpX2lkLT5kcml2ZXJfZGF0YSwgJmNoaXApOworCWVyciA9IGF6eF9jcmVhdGUoY2FyZCwgcGNpLCBkZXYsIHBjaV9pZC0+ZHJpdmVyX2RhdGEsCisJCQkgJnBjaV9oZGFfb3BzLCAmY2hpcCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CiAJY2FyZC0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKQEAgLTM4NDUsMTUgKzE1ODUsMTMgQEAKIAogCWVyciA9IHJlZ2lzdGVyX3ZnYV9zd2l0Y2hlcm9vKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYCi0JCQkgICAiJXM6IEVycm9yIHJlZ2lzdGVyaW5nIFZHQS1zd2l0Y2hlcm9vIGNsaWVudFxuIiwgcGNpX25hbWUocGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiRXJyb3IgcmVnaXN0ZXJpbmcgVkdBLXN3aXRjaGVyb28gY2xpZW50XG4iKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlpZiAoY2hlY2tfaGRtaV9kaXNhYmxlZChwY2kpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWCAiJXM6IFZHQSBjb250cm9sbGVyIGlzIGRpc2FibGVkXG4iLAotCQkJICAgcGNpX25hbWUocGNpKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWCAiJXM6IERlbGF5aW5nIGluaXRpYWxpemF0aW9uXG4iLCBwY2lfbmFtZShwY2kpKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiVkdBIGNvbnRyb2xsZXIgaXMgZGlzYWJsZWRcbiIpOworCQlkZXZfaW5mbyhjYXJkLT5kZXYsICJEZWxheWluZyBpbml0aWFsaXphdGlvblxuIik7CiAJCWNoaXAtPmRpc2FibGVkID0gdHJ1ZTsKIAl9CiAKQEAgLTM4NjEsOCArMTU5OSw4IEBACiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKIAlpZiAocGF0Y2hbZGV2XSAmJiAqcGF0Y2hbZGV2XSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IEFwcGx5aW5nIHBhdGNoIGZpcm13YXJlICclcydcbiIsCi0JCQkgICBwY2lfbmFtZShwY2kpLCBwYXRjaFtkZXZdKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQXBwbHlpbmcgcGF0Y2ggZmlybXdhcmUgJyVzJ1xuIiwKKwkJCSBwYXRjaFtkZXZdKTsKIAkJZXJyID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIHBhdGNoW2Rldl0sCiAJCQkJCSAgICAgICZwY2ktPmRldiwgR0ZQX0tFUk5FTCwgY2FyZCwKIAkJCQkJICAgICAgYXp4X2Zpcm13YXJlX2NiKTsKQEAgLTM4NzQsNyArMTYxMiw3IEBACiAKICNpZm5kZWYgQ09ORklHX1NORF9IREFfSTkxNQogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19JOTE1X1BPV0VSV0VMTCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIkhhc3dlbGwgbXVzdCBidWlsZCBpbiBDT05GSUdfU05EX0hEQV9JOTE1XG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJIYXN3ZWxsIG11c3QgYnVpbGQgaW4gQ09ORklHX1NORF9IREFfSTkxNVxuIik7CiAjZW5kaWYKIAogCWlmIChzY2hlZHVsZV9wcm9iZSkKQEAgLTM4OTAsNiArMTYyOCwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIG51bWJlciBvZiBjb2RlYyBzbG90cyBmb3IgZWFjaCBjaGlwc2V0OiAwID0gZGVmYXVsdCBzbG90cyAoaS5lLiA0KSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhenhfbWF4X2NvZGVjc1tBWlhfTlVNX0RSSVZFUlNdID0geworCVtBWlhfRFJJVkVSX05WSURJQV0gPSA4LAorCVtBWlhfRFJJVkVSX1RFUkFdID0gMSwKK307CisKIHN0YXRpYyBpbnQgYXp4X3Byb2JlX2NvbnRpbnVlKHN0cnVjdCBhenggKmNoaXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaSA9IGNoaXAtPnBjaTsKQEAgLTM5MDEsNyArMTY0NSw4IEBACiAjaWZkZWYgQ09ORklHX1NORF9IREFfSTkxNQogCQllcnIgPSBoZGFfaTkxNV9pbml0KCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgcmVxdWVzdCBwb3dlci13ZWxsIGZyb20gaTkxNVxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiRXJyb3IgcmVxdWVzdCBwb3dlci13ZWxsIGZyb20gaTkxNVxuIik7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CiAjZW5kaWYKQEAgLTM5MTcsNyArMTY2MiwxMCBAQAogI2VuZGlmCiAKIAkvKiBjcmVhdGUgY29kZWMgaW5zdGFuY2VzICovCi0JZXJyID0gYXp4X2NvZGVjX2NyZWF0ZShjaGlwLCBtb2RlbFtkZXZdKTsKKwllcnIgPSBhenhfY29kZWNfY3JlYXRlKGNoaXAsIG1vZGVsW2Rldl0sCisJCQkgICAgICAgYXp4X21heF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdLAorCQkJICAgICAgIHBvd2VyX3NhdmVfYWRkcik7CisKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKQEAgLTQxNDIsNyArMTg5MCw3IEBACiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0NUSERBIHwgQVpYX0RDQVBTX1BSRVNFVF9DVEhEQSB9LAogCXsgUENJX0RFVklDRSgweDExMDIsIDB4MDAxMiksCiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0NUSERBIHwgQVpYX0RDQVBTX1BSRVNFVF9DVEhEQSB9LAotI2lmICFkZWZpbmVkKENPTkZJR19TTkRfQ1RYRkkpICYmICFkZWZpbmVkKENPTkZJR19TTkRfQ1RYRklfTU9EVUxFKQorI2lmICFJU19FTkFCTEVEKENPTkZJR19TTkRfQ1RYRkkpCiAJLyogdGhlIGZvbGxvd2luZyBlbnRyeSBjb25mbGljdHMgd2l0aCBzbmQtY3R4ZmkgZHJpdmVyLAogCSAqIGFzIGN0eGZpIGRyaXZlciBtdXRhdGVzIGZyb20gSEQtYXVkaW8gdG8gbmF0aXZlIG1vZGUgd2l0aAogCSAqIGEgc3BlY2lhbCBjb21tYW5kIHNlcXVlbmNlLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggZGE4MGM1Yi4uZTUxZDE1NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC01OTcsMjMgKzU5NywxMCBAQAogc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9jcmVhdGVfaHdkZXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1NORF9IREFfSFdERVApCi1pbnQgc25kX2hkYV9od2RlcF9hZGRfcG93ZXJfc3lzZnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfaHdkZXBfYWRkX3Bvd2VyX3N5c2ZzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCit2b2lkIHNuZF9oZGFfc3lzZnNfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Cit2b2lkIHNuZF9oZGFfc3lzZnNfY2xlYXIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKLWludCBzbmRfaGRhX2h3ZGVwX2FkZF9zeXNmcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9od2RlcF9hZGRfc3lzZnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpzbmRfaGRhX2Rldl9hdHRyX2dyb3Vwc1tdOwogCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKIGNvbnN0IGNoYXIgKnNuZF9oZGFfZ2V0X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSk7CkBAIC03NzEsNCArNzU4LDExIEBACiAjZGVmaW5lIFNORF9QUklOVF9DSEFOTkVMX0FMTE9DQVRJT05fQURWSVNFRF9CVUZTSVpFIDgwCiB2b2lkIHNuZF9wcmludF9jaGFubmVsX2FsbG9jYXRpb24oaW50IHNwa19hbGxvYywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKIAorLyoKKyAqLworI2RlZmluZSBjb2RlY19lcnIoY29kZWMsIGZtdCwgYXJncy4uLikgZGV2X2VycigmKGNvZGVjKS0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfd2Fybihjb2RlYywgZm10LCBhcmdzLi4uKSBkZXZfd2FybigmKGNvZGVjKS0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfaW5mbyhjb2RlYywgZm10LCBhcmdzLi4uKSBkZXZfaW5mbygmKGNvZGVjKS0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfZGJnKGNvZGVjLCBmbXQsIGFyZ3MuLi4pIGRldl9kYmcoJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCisKICNlbmRpZiAvKiBfX1NPVU5EX0hEQV9MT0NBTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wcml2LmggYi9zb3VuZC9wY2kvaGRhL2hkYV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzOGI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3ByaXYuaApAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqICBDb21tb24gZGVmaW5lcyBmb3IgdGhlIGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSEQgQXVkaW8uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0hEQV9QUklWX0gKKyNkZWZpbmUgX19TT1VORF9IREFfUFJJVl9ICisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworLyoKKyAqIHJlZ2lzdGVycworICovCisjZGVmaW5lIElDSDZfUkVHX0dDQVAJCQkweDAwCisjZGVmaW5lICAgSUNINl9HQ0FQXzY0T0sJKDEgPDwgMCkgICAvKiA2NGJpdCBhZGRyZXNzIHN1cHBvcnQgKi8KKyNkZWZpbmUgICBJQ0g2X0dDQVBfTlNETwkoMyA8PCAxKSAgIC8qICMgb2Ygc2VyaWFsIGRhdGEgb3V0IHNpZ25hbHMgKi8KKyNkZWZpbmUgICBJQ0g2X0dDQVBfQlNTCQkoMzEgPDwgMykgIC8qICMgb2YgYmlkaXJlY3Rpb25hbCBzdHJlYW1zICovCisjZGVmaW5lICAgSUNINl9HQ0FQX0lTUwkJKDE1IDw8IDgpICAvKiAjIG9mIGlucHV0IHN0cmVhbXMgKi8KKyNkZWZpbmUgICBJQ0g2X0dDQVBfT1NTCQkoMTUgPDwgMTIpIC8qICMgb2Ygb3V0cHV0IHN0cmVhbXMgKi8KKyNkZWZpbmUgSUNINl9SRUdfVk1JTgkJCTB4MDIKKyNkZWZpbmUgSUNINl9SRUdfVk1BSgkJCTB4MDMKKyNkZWZpbmUgSUNINl9SRUdfT1VUUEFZCQkJMHgwNAorI2RlZmluZSBJQ0g2X1JFR19JTlBBWQkJCTB4MDYKKyNkZWZpbmUgSUNINl9SRUdfR0NUTAkJCTB4MDgKKyNkZWZpbmUgICBJQ0g2X0dDVExfUkVTRVQJKDEgPDwgMCkgICAvKiBjb250cm9sbGVyIHJlc2V0ICovCisjZGVmaW5lICAgSUNINl9HQ1RMX0ZDTlRSTAkoMSA8PCAxKSAgIC8qIGZsdXNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgICBJQ0g2X0dDVExfVU5TT0wJKDEgPDwgOCkgICAvKiBhY2NlcHQgdW5zb2wuIHJlc3BvbnNlIGVuYWJsZSAqLworI2RlZmluZSBJQ0g2X1JFR19XQUtFRU4JCQkweDBjCisjZGVmaW5lIElDSDZfUkVHX1NUQVRFU1RTCQkweDBlCisjZGVmaW5lIElDSDZfUkVHX0dTVFMJCQkweDEwCisjZGVmaW5lICAgSUNINl9HU1RTX0ZTVFMJKDEgPDwgMSkgICAvKiBmbHVzaCBzdGF0dXMgKi8KKyNkZWZpbmUgSUNINl9SRUdfSU5UQ1RMCQkJMHgyMAorI2RlZmluZSBJQ0g2X1JFR19JTlRTVFMJCQkweDI0CisjZGVmaW5lIElDSDZfUkVHX1dBTExDTEsJCTB4MzAJLyogMjRNaHogc291cmNlICovCisjZGVmaW5lIElDSDZfUkVHX09MRF9TU1lOQwkJMHgzNAkvKiBTU1lOQyBmb3Igb2xkIElDSCAqLworI2RlZmluZSBJQ0g2X1JFR19TU1lOQwkJCTB4MzgKKyNkZWZpbmUgSUNINl9SRUdfQ09SQkxCQVNFCQkweDQwCisjZGVmaW5lIElDSDZfUkVHX0NPUkJVQkFTRQkJMHg0NAorI2RlZmluZSBJQ0g2X1JFR19DT1JCV1AJCQkweDQ4CisjZGVmaW5lIElDSDZfUkVHX0NPUkJSUAkJCTB4NGEKKyNkZWZpbmUgICBJQ0g2X0NPUkJSUF9SU1QJKDEgPDwgMTUpICAvKiByZWFkIHBvaW50ZXIgcmVzZXQgKi8KKyNkZWZpbmUgSUNINl9SRUdfQ09SQkNUTAkJMHg0YworI2RlZmluZSAgIElDSDZfQ09SQkNUTF9SVU4JKDEgPDwgMSkgICAvKiBlbmFibGUgRE1BICovCisjZGVmaW5lICAgSUNINl9DT1JCQ1RMX0NNRUlFCSgxIDw8IDApICAgLyogZW5hYmxlIG1lbW9yeSBlcnJvciBpcnEgKi8KKyNkZWZpbmUgSUNINl9SRUdfQ09SQlNUUwkJMHg0ZAorI2RlZmluZSAgIElDSDZfQ09SQlNUU19DTUVJCSgxIDw8IDApICAgLyogbWVtb3J5IGVycm9yIGluZGljYXRpb24gKi8KKyNkZWZpbmUgSUNINl9SRUdfQ09SQlNJWkUJCTB4NGUKKworI2RlZmluZSBJQ0g2X1JFR19SSVJCTEJBU0UJCTB4NTAKKyNkZWZpbmUgSUNINl9SRUdfUklSQlVCQVNFCQkweDU0CisjZGVmaW5lIElDSDZfUkVHX1JJUkJXUAkJCTB4NTgKKyNkZWZpbmUgICBJQ0g2X1JJUkJXUF9SU1QJKDEgPDwgMTUpICAvKiB3cml0ZSBwb2ludGVyIHJlc2V0ICovCisjZGVmaW5lIElDSDZfUkVHX1JJTlRDTlQJCTB4NWEKKyNkZWZpbmUgSUNINl9SRUdfUklSQkNUTAkJMHg1YworI2RlZmluZSAgIElDSDZfUkJDVExfSVJRX0VOCSgxIDw8IDApICAgLyogZW5hYmxlIElSUSAqLworI2RlZmluZSAgIElDSDZfUkJDVExfRE1BX0VOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLworI2RlZmluZSAgIElDSDZfUkJDVExfT1ZFUlJVTl9FTgkoMSA8PCAyKSAgIC8qIGVuYWJsZSBvdmVycnVuIGlycSAqLworI2RlZmluZSBJQ0g2X1JFR19SSVJCU1RTCQkweDVkCisjZGVmaW5lICAgSUNINl9SQlNUU19JUlEJKDEgPDwgMCkgICAvKiByZXNwb25zZSBpcnEgKi8KKyNkZWZpbmUgICBJQ0g2X1JCU1RTX09WRVJSVU4JKDEgPDwgMikgICAvKiBvdmVycnVuIGlycSAqLworI2RlZmluZSBJQ0g2X1JFR19SSVJCU0laRQkJMHg1ZQorCisjZGVmaW5lIElDSDZfUkVHX0lDCQkJMHg2MAorI2RlZmluZSBJQ0g2X1JFR19JUgkJCTB4NjQKKyNkZWZpbmUgSUNINl9SRUdfSVJTCQkJMHg2OAorI2RlZmluZSAgIElDSDZfSVJTX1ZBTElECSgxPDwxKQorI2RlZmluZSAgIElDSDZfSVJTX0JVU1kJCSgxPDwwKQorCisjZGVmaW5lIElDSDZfUkVHX0RQTEJBU0UJCTB4NzAKKyNkZWZpbmUgSUNINl9SRUdfRFBVQkFTRQkJMHg3NAorI2RlZmluZSAgIElDSDZfRFBMQkFTRV9FTkFCTEUJMHgxCS8qIEVuYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KKworLyogU0Qgb2Zmc2V0OiBTREkwPTB4ODAsIFNESTE9MHhhMCwgLi4uIFNETzM9MHgxNjAgKi8KK2VudW0geyBTREkwLCBTREkxLCBTREkyLCBTREkzLCBTRE8wLCBTRE8xLCBTRE8yLCBTRE8zIH07CisKKy8qIHN0cmVhbSByZWdpc3RlciBvZmZzZXRzIGZyb20gc3RyZWFtIGJhc2UgKi8KKyNkZWZpbmUgSUNINl9SRUdfU0RfQ1RMCQkJMHgwMAorI2RlZmluZSBJQ0g2X1JFR19TRF9TVFMJCQkweDAzCisjZGVmaW5lIElDSDZfUkVHX1NEX0xQSUIJCTB4MDQKKyNkZWZpbmUgSUNINl9SRUdfU0RfQ0JMCQkJMHgwOAorI2RlZmluZSBJQ0g2X1JFR19TRF9MVkkJCQkweDBjCisjZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9XCQkweDBlCisjZGVmaW5lIElDSDZfUkVHX1NEX0ZJRk9TSVpFCQkweDEwCisjZGVmaW5lIElDSDZfUkVHX1NEX0ZPUk1BVAkJMHgxMgorI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQTAkJMHgxOAorI2RlZmluZSBJQ0g2X1JFR19TRF9CRExQVQkJMHgxYworCisvKiBQQ0kgc3BhY2UgKi8KKyNkZWZpbmUgSUNINl9QQ0lSRUdfVENTRUwJMHg0NAorCisvKgorICogb3RoZXIgY29uc3RhbnRzCisgKi8KKworLyogbWF4IG51bWJlciBvZiBTRHMgKi8KKy8qIElDSCwgQVRJIGFuZCBWSUEgaGF2ZSA0IHBsYXliYWNrIGFuZCA0IGNhcHR1cmUgKi8KKyNkZWZpbmUgSUNINl9OVU1fQ0FQVFVSRQk0CisjZGVmaW5lIElDSDZfTlVNX1BMQVlCQUNLCTQKKworLyogVUxJIGhhcyA2IHBsYXliYWNrIGFuZCA1IGNhcHR1cmUgKi8KKyNkZWZpbmUgVUxJX05VTV9DQVBUVVJFCQk1CisjZGVmaW5lIFVMSV9OVU1fUExBWUJBQ0sJNgorCisvKiBBVEkgSERNSSBtYXkgaGF2ZSB1cCB0byA4IHBsYXliYWNrcyBhbmQgMCBjYXB0dXJlICovCisjZGVmaW5lIEFUSUhETUlfTlVNX0NBUFRVUkUJMAorI2RlZmluZSBBVElIRE1JX05VTV9QTEFZQkFDSwk4CisKKy8qIFRFUkEgaGFzIDQgcGxheWJhY2sgYW5kIDMgY2FwdHVyZSAqLworI2RlZmluZSBURVJBX05VTV9DQVBUVVJFCTMKKyNkZWZpbmUgVEVSQV9OVU1fUExBWUJBQ0sJNAorCisvKiB0aGlzIG51bWJlciBpcyBzdGF0aWNhbGx5IGRlZmluZWQgZm9yIHNpbXBsaWNpdHkgKi8KKyNkZWZpbmUgTUFYX0FaWF9ERVYJCTE2CisKKy8qIG1heCBudW1iZXIgb2YgZnJhZ21lbnRzIC0gd2UgbWF5IHVzZSBtb3JlIGlmIGFsbG9jYXRpbmcgbW9yZSBwYWdlcyBmb3IgQkRMICovCisjZGVmaW5lIEJETF9TSVpFCQk0MDk2CisjZGVmaW5lIEFaWF9NQVhfQkRMX0VOVFJJRVMJKEJETF9TSVpFIC8gMTYpCisjZGVmaW5lIEFaWF9NQVhfRlJBRwkJMzIKKy8qIG1heCBidWZmZXIgc2l6ZSAtIG5vIGgvdyBsaW1pdCwgeW91IGNhbiBpbmNyZWFzZSBhcyB5b3UgbGlrZSAqLworI2RlZmluZSBBWlhfTUFYX0JVRl9TSVpFCSgxMDI0KjEwMjQqMTAyNCkKKworLyogUklSQiBpbnQgbWFzazogb3ZlcnJ1blsyXSwgcmVzcG9uc2VbMF0gKi8KKyNkZWZpbmUgUklSQl9JTlRfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBSSVJCX0lOVF9PVkVSUlVOCTB4MDQKKyNkZWZpbmUgUklSQl9JTlRfTUFTSwkJMHgwNQorCisvKiBTVEFURVNUUyBpbnQgbWFzazogUzMsU0QyLFNEMSxTRDAgKi8KKyNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTgKKyNkZWZpbmUgQVpYX0RFRkFVTFRfQ09ERUNTCTQKKyNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJKCgxIDw8IEFaWF9NQVhfQ09ERUNTKSAtIDEpCisKKy8qIFNEX0NUTCBiaXRzICovCisjZGVmaW5lIFNEX0NUTF9TVFJFQU1fUkVTRVQJMHgwMQkvKiBzdHJlYW0gcmVzZXQgYml0ICovCisjZGVmaW5lIFNEX0NUTF9ETUFfU1RBUlQJMHgwMgkvKiBzdHJlYW0gRE1BIHN0YXJ0IGJpdCAqLworI2RlZmluZSBTRF9DVExfU1RSSVBFCQkoMyA8PCAxNikJLyogc3RyaXBlIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0RfQ1RMX1RSQUZGSUNfUFJJTwkoMSA8PCAxOCkJLyogdHJhZmZpYyBwcmlvcml0eSAqLworI2RlZmluZSBTRF9DVExfRElSCQkoMSA8PCAxOSkJLyogYmktZGlyZWN0aW9uYWwgc3RyZWFtICovCisjZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX01BU0sJKDB4ZiA8PCAyMCkKKyNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9UQUdfU0hJRlQJMjAKKworLyogU0RfQ1RMIGFuZCBTRF9TVFMgKi8KKyNkZWZpbmUgU0RfSU5UX0RFU0NfRVJSCQkweDEwCS8qIGRlc2NyaXB0b3IgZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIFNEX0lOVF9GSUZPX0VSUgkJMHgwOAkvKiBGSUZPIGVycm9yIGludGVycnVwdCAqLworI2RlZmluZSBTRF9JTlRfQ09NUExFVEUJCTB4MDQJLyogY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0RfSU5UX01BU0sJCShTRF9JTlRfREVTQ19FUlJ8U0RfSU5UX0ZJRk9fRVJSfFwKKwkJCQkgU0RfSU5UX0NPTVBMRVRFKQorCisvKiBTRF9TVFMgKi8KKyNkZWZpbmUgU0RfU1RTX0ZJRk9fUkVBRFkJMHgyMAkvKiBGSUZPIHJlYWR5ICovCisKKy8qIElOVENUTCBhbmQgSU5UU1RTICovCisjZGVmaW5lIElDSDZfSU5UX0FMTF9TVFJFQU0JMHhmZgkgICAvKiBhbGwgc3RyZWFtIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSUNINl9JTlRfQ1RSTF9FTgkweDQwMDAwMDAwIC8qIGNvbnRyb2xsZXIgaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgSUNINl9JTlRfR0xPQkFMX0VOCTB4ODAwMDAwMDAgLyogZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0ICovCisKKy8qIGJlbG93IGFyZSBzbyBmYXIgaGFyZGNvZGVkIC0gc2hvdWxkIHJlYWQgcmVnaXN0ZXJzIGluIGZ1dHVyZSAqLworI2RlZmluZSBJQ0g2X01BWF9DT1JCX0VOVFJJRVMJMjU2CisjZGVmaW5lIElDSDZfTUFYX1JJUkJfRU5UUklFUwkyNTYKKworLyogZHJpdmVyIHF1aXJrcyAoY2FwYWJpbGl0aWVzKSAqLworLyogYml0cyAwLTcgYXJlIHVzZWQgZm9yIGluZGljYXRpbmcgZHJpdmVyIHR5cGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX05PX1RDU0VMCSgxIDw8IDgpCS8qIE5vIEludGVsIFRDU0VMIGJpdCAqLworI2RlZmluZSBBWlhfRENBUFNfTk9fTVNJCSgxIDw8IDkpCS8qIE5vIE1TSSBzdXBwb3J0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19BVElfU05PT1AJKDEgPDwgMTApCS8qIEFUSSBzbm9vcCBlbmFibGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX05WSURJQV9TTk9PUAkoMSA8PCAxMSkJLyogTnZpZGlhIHNub29wIGVuYWJsZSAqLworI2RlZmluZSBBWlhfRENBUFNfU0NIX1NOT09QCSgxIDw8IDEyKQkvKiBTQ0gvUENIIHNub29wIGVuYWJsZSAqLworI2RlZmluZSBBWlhfRENBUFNfUklSQl9ERUxBWQkoMSA8PCAxMykJLyogTG9uZyBkZWxheSBpbiByZWFkIGxvb3AgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZICgxIDw8IDE0KQkvKiBQdXQgYSBkZWxheSBiZWZvcmUgcmVhZCAqLworI2RlZmluZSBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQgKDEgPDwgMTUpCS8qIFgtRmkgd29ya2Fyb3VuZCAqLworI2RlZmluZSBBWlhfRENBUFNfUE9TRklYX0xQSUIJKDEgPDwgMTYpCS8qIFVzZSBMUElCIGFzIGRlZmF1bHQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9WSUEJKDEgPDwgMTcpCS8qIFVzZSBWSUFDT01CTyBhcyBkZWZhdWx0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19OT182NEJJVAkoMSA8PCAxOCkJLyogTm8gNjRiaXQgYWRkcmVzcyAqLworI2RlZmluZSBBWlhfRENBUFNfU1lOQ19XUklURQkoMSA8PCAxOSkJLyogc3luYyBlYWNoIGNtZCB3cml0ZSAqLworI2RlZmluZSBBWlhfRENBUFNfT0xEX1NTWU5DCSgxIDw8IDIwKQkvKiBPbGQgU1NZTkMgcmVnIGZvciBJQ0ggKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0JVRlNJWkUJKDEgPDwgMjEpCS8qIG5vIGJ1ZmZlciBzaXplIGFsaWdubWVudCAqLworI2RlZmluZSBBWlhfRENBUFNfQUxJR05fQlVGU0laRQkoMSA8PCAyMikJLyogYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCisjZGVmaW5lIEFaWF9EQ0FQU180S19CRExFX0JPVU5EQVJZICgxIDw8IDIzKQkvKiBCRExFIGluIDRrIGJvdW5kYXJ5ICovCisjZGVmaW5lIEFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZICAoMSA8PCAyNSkJLyogVGFrZSBMUElCIGFzIGRlbGF5ICovCisjZGVmaW5lIEFaWF9EQ0FQU19QTV9SVU5USU1FCSgxIDw8IDI2KQkvKiBydW50aW1lIFBNIHN1cHBvcnQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0k5MTVfUE9XRVJXRUxMICgxIDw8IDI3KQkvKiBIU1cgaTkxNSBwb3dlcndlbGwgc3VwcG9ydCAqLworCisvKiBwb3NpdGlvbiBmaXggbW9kZSAqLworZW51bSB7CisJUE9TX0ZJWF9BVVRPLAorCVBPU19GSVhfTFBJQiwKKwlQT1NfRklYX1BPU0JVRiwKKwlQT1NfRklYX1ZJQUNPTUJPLAorCVBPU19GSVhfQ09NQk8sCit9OworCisvKiBEZWZpbmVzIGZvciBBVEkgSEQgQXVkaW8gc3VwcG9ydCBpbiBTQjQ1MCBzb3V0aCBicmlkZ2UgKi8KKyNkZWZpbmUgQVRJX1NCNDUwX0hEQVVESU9fTUlTQ19DTlRSMl9BRERSICAgMHg0MgorI2RlZmluZSBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1AgICAgICAweDAyCisKKy8qIERlZmluZXMgZm9yIE52aWRpYSBIREEgc3VwcG9ydCAqLworI2RlZmluZSBOVklESUFfSERBX1RSQU5TUkVHX0FERFIgICAgICAweDRlCisjZGVmaW5lIE5WSURJQV9IREFfRU5BQkxFX0NPSEJJVFMgICAgIDB4MGYKKyNkZWZpbmUgTlZJRElBX0hEQV9JU1RSTV9DT0ggICAgICAgICAgMHg0ZAorI2RlZmluZSBOVklESUFfSERBX09TVFJNX0NPSCAgICAgICAgICAweDRjCisjZGVmaW5lIE5WSURJQV9IREFfRU5BQkxFX0NPSEJJVCAgICAgIDB4MDEKKworLyogRGVmaW5lcyBmb3IgSW50ZWwgU0NIIEhEQSBzbm9vcCBjb250cm9sICovCisjZGVmaW5lIElOVEVMX1NDSF9IREFfREVWQyAgICAgIDB4NzgKKyNkZWZpbmUgSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1AgICAgICAgKDB4MTw8MTEpCisKKy8qIERlZmluZSBJTiBzdHJlYW0gMCBGSUZPIHNpemUgb2Zmc2V0IGluIFZJQSBjb250cm9sbGVyICovCisjZGVmaW5lIFZJQV9JTl9TVFJFQU0wX0ZJRk9fU0laRV9PRkZTRVQJMHg5MAorLyogRGVmaW5lIFZJQSBIRCBBdWRpbyBEZXZpY2UgSUQqLworI2RlZmluZSBWSUFfSERBQ19ERVZJQ0VfSUQJCTB4MzI4OAorCisvKiBIRCBBdWRpbyBjbGFzcyBjb2RlICovCisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX0hEX0FVRElPCTB4MDQwMworCitzdHJ1Y3QgYXp4X2RldiB7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJkbDsgLyogQkRMIGJ1ZmZlciAqLworCXUzMiAqcG9zYnVmOwkJLyogcG9zaXRpb24gYnVmZmVyIHBvaW50ZXIgKi8KKworCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiBzaXplIG9mIHRoZSBwbGF5IGJ1ZmZlciBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXM7IC8qIHNpemUgb2YgdGhlIHBlcmlvZCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBmcmFnczsJLyogbnVtYmVyIGZvciBwZXJpb2QgaW4gdGhlIHBsYXkgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGZpZm9fc2l6ZTsJLyogRklGTyBzaXplICovCisJdW5zaWduZWQgbG9uZyBzdGFydF93YWxsY2xrOwkvKiBzdGFydCArIG1pbmltdW0gd2FsbGNsayAqLworCXVuc2lnbmVkIGxvbmcgcGVyaW9kX3dhbGxjbGs7CS8qIHdhbGxjbGsgZm9yIHBlcmlvZCAqLworCisJdm9pZCBfX2lvbWVtICpzZF9hZGRyOwkvKiBzdHJlYW0gZGVzY3JpcHRvciBwb2ludGVyICovCisKKwl1MzIgc2RfaW50X3N0YV9tYXNrOwkvKiBzdHJlYW0gaW50IHN0YXR1cyBtYXNrICovCisKKwkvKiBwY20gc3VwcG9ydCAqLworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwkvKiBhc3NpZ25lZCBzdWJzdHJlYW0sCisJCQkJCQkgKiBzZXQgaW4gUENNIG9wZW4KKwkJCQkJCSAqLworCXVuc2lnbmVkIGludCBmb3JtYXRfdmFsOwkvKiBmb3JtYXQgdmFsdWUgdG8gYmUgc2V0IGluIHRoZQorCQkJCQkgKiBjb250cm9sbGVyIGFuZCB0aGUgY29kZWMKKwkJCQkJICovCisJdW5zaWduZWQgY2hhciBzdHJlYW1fdGFnOwkvKiBhc3NpZ25lZCBzdHJlYW0gKi8KKwl1bnNpZ25lZCBjaGFyIGluZGV4OwkJLyogc3RyZWFtIGluZGV4ICovCisJaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KKworCXVuc2lnbmVkIGludCBvcGVuZWQ6MTsKKwl1bnNpZ25lZCBpbnQgcnVubmluZzoxOworCXVuc2lnbmVkIGludCBpcnFfcGVuZGluZzoxOworCXVuc2lnbmVkIGludCBwcmVwYXJlZDoxOworCXVuc2lnbmVkIGludCBsb2NrZWQ6MTsKKwkvKgorCSAqIEZvciBWSUE6CisJICogIEEgZmxhZyB0byBlbnN1cmUgRE1BIHBvc2l0aW9uIGlzIDAKKwkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCisJICovCisJdW5zaWduZWQgaW50IGluc3VmZmljaWVudDoxOworCXVuc2lnbmVkIGludCB3Y19tYXJrZWQ6MTsKKwl1bnNpZ25lZCBpbnQgbm9fcGVyaW9kX3dha2V1cDoxOworCisJc3RydWN0IHRpbWVjb3VudGVyICBhenhfdGM7CisJc3RydWN0IGN5Y2xlY291bnRlciBhenhfY2M7CisKKwlpbnQgZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkOworCisjaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgorCS8qIEFsbG93cyBkc3AgbG9hZCB0byBoYXZlIHNvbGUgYWNjZXNzIHRvIHRoZSBwbGF5YmFjayBzdHJlYW0uICovCisJc3RydWN0IG11dGV4IGRzcF9tdXRleDsKKyNlbmRpZgorfTsKKworLyogQ09SQi9SSVJCICovCitzdHJ1Y3QgYXp4X3JiIHsKKwl1MzIgKmJ1ZjsJCS8qIENPUkIvUklSQiBidWZmZXIKKwkJCQkgKiBFYWNoIENPUkIgZW50cnkgaXMgNGJ5dGUsIFJJUkIgaXMgOGJ5dGUKKwkJCQkgKi8KKwlkbWFfYWRkcl90IGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ09SQi9SSVJCIGJ1ZmZlciAqLworCS8qIGZvciBSSVJCICovCisJdW5zaWduZWQgc2hvcnQgcnAsIHdwOwkvKiByZWFkL3dyaXRlIHBvaW50ZXJzICovCisJaW50IGNtZHNbQVpYX01BWF9DT0RFQ1NdOwkvKiBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLworCXUzMiByZXNbQVpYX01BWF9DT0RFQ1NdOwkvKiBsYXN0IHJlYWQgdmFsdWUgKi8KK307CisKK3N0cnVjdCBheng7CisKKy8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIHRvIGhkYSByZWdpc3RlcnMuICovCitzdHJ1Y3QgaGRhX2NvbnRyb2xsZXJfb3BzIHsKKwkvKiBSZWdpc3RlciBBY2Nlc3MgKi8KKwl2b2lkICgqcmVnX3dyaXRlbCkodTMyIHZhbHVlLCB1MzIgX19pb21lbSAqYWRkcik7CisJdTMyICgqcmVnX3JlYWRsKSh1MzIgX19pb21lbSAqYWRkcik7CisJdm9pZCAoKnJlZ193cml0ZXcpKHUxNiB2YWx1ZSwgdTE2IF9faW9tZW0gKmFkZHIpOworCXUxNiAoKnJlZ19yZWFkdykodTE2IF9faW9tZW0gKmFkZHIpOworCXZvaWQgKCpyZWdfd3JpdGViKSh1OCB2YWx1ZSwgdTggX19pb21lbSAqYWRkcik7CisJdTggKCpyZWdfcmVhZGIpKHU4IF9faW9tZW0gKmFkZHIpOworCS8qIERpc2FibGUgbXNpIGlmIHN1cHBvcnRlZCwgUENJIG9ubHkgKi8KKwlpbnQgKCpkaXNhYmxlX21zaV9yZXNldF9pcnEpKHN0cnVjdCBhenggKik7CisJLyogQWxsb2NhdGlvbiBvcHMgKi8KKwlpbnQgKCpkbWFfYWxsb2NfcGFnZXMpKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgICAgaW50IHR5cGUsCisJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkgICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpOworCXZvaWQgKCpkbWFfZnJlZV9wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpOworCWludCAoKnN1YnN0cmVhbV9hbGxvY19wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICAgc2l6ZV90IHNpemUpOworCWludCAoKnN1YnN0cmVhbV9mcmVlX3BhZ2VzKShzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CisJdm9pZCAoKnBjbV9tbWFwX3ByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpOworCS8qIENoZWNrIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYWNjZXB0YWJsZSAqLworCWludCAoKnBvc2l0aW9uX2NoZWNrKShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2Rldik7Cit9OworCitzdHJ1Y3QgYXp4X3BjbSB7CisJc3RydWN0IGF6eCAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm9bMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGF6eCB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJaW50IGRldl9pbmRleDsKKworCS8qIGNoaXAgdHlwZSBzcGVjaWZpYyAqLworCWludCBkcml2ZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZHJpdmVyX2NhcHM7CisJaW50IHBsYXliYWNrX3N0cmVhbXM7CisJaW50IHBsYXliYWNrX2luZGV4X29mZnNldDsKKwlpbnQgY2FwdHVyZV9zdHJlYW1zOworCWludCBjYXB0dXJlX2luZGV4X29mZnNldDsKKwlpbnQgbnVtX3N0cmVhbXM7CisJY29uc3QgaW50ICpqYWNrcG9sbF9tczsgLyogcGVyLWNhcmQgamFjayBwb2xsIGludGVydmFsICovCisKKwkvKiBSZWdpc3RlciBpbnRlcmFjdGlvbi4gKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2NvbnRyb2xsZXJfb3BzICpvcHM7CisKKwkvKiBwY2kgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKKwlpbnQgaXJxOworCisJLyogbG9ja3MgKi8KKwlzcGlubG9ja190IHJlZ19sb2NrOworCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OyAvKiBQcmV2ZW50cyBjb25jdXJyZW50IG9wZW4vY2xvc2Ugb3BlcmF0aW9ucyAqLworCXN0cnVjdCBjb21wbGV0aW9uIHByb2JlX3dhaXQ7CisKKwkvKiBzdHJlYW1zICh4IG51bV9zdHJlYW1zKSAqLworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCisJLyogUENNICovCisJc3RydWN0IGxpc3RfaGVhZCBwY21fbGlzdDsgLyogYXp4X3BjbSBsaXN0ICovCisKKwkvKiBIRCBjb2RlYyAqLworCXVuc2lnbmVkIHNob3J0IGNvZGVjX21hc2s7CisJaW50ICBjb2RlY19wcm9iZV9tYXNrOyAvKiBjb3BpZWQgZnJvbSBwcm9iZV9tYXNrIG9wdGlvbiAqLworCXN0cnVjdCBoZGFfYnVzICpidXM7CisJdW5zaWduZWQgaW50IGJlZXBfbW9kZTsKKworCS8qIENPUkIvUklSQiAqLworCXN0cnVjdCBhenhfcmIgY29yYjsKKwlzdHJ1Y3QgYXp4X3JiIHJpcmI7CisKKwkvKiBDT1JCL1JJUkIgYW5kIHBvc2l0aW9uIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcmI7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIHBvc2J1ZjsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisjZW5kaWYKKworCS8qIGZsYWdzICovCisJaW50IHBvc2l0aW9uX2ZpeFsyXTsgLyogZm9yIGJvdGggcGxheWJhY2svY2FwdHVyZSBzdHJlYW1zICovCisJY29uc3QgaW50ICpiZGxfcG9zX2FkajsKKwlpbnQgcG9sbF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcnVubmluZzoxOworCXVuc2lnbmVkIGludCBpbml0aWFsaXplZDoxOworCXVuc2lnbmVkIGludCBzaW5nbGVfY21kOjE7CisJdW5zaWduZWQgaW50IHBvbGxpbmdfbW9kZToxOworCXVuc2lnbmVkIGludCBtc2k6MTsKKwl1bnNpZ25lZCBpbnQgaXJxX3BlbmRpbmdfd2FybmVkOjE7CisJdW5zaWduZWQgaW50IHByb2Jpbmc6MTsgLyogY29kZWMgcHJvYmluZyBwaGFzZSAqLworCXVuc2lnbmVkIGludCBzbm9vcDoxOworCXVuc2lnbmVkIGludCBhbGlnbl9idWZmZXJfc2l6ZToxOworCXVuc2lnbmVkIGludCByZWdpb25fcmVxdWVzdGVkOjE7CisKKwkvKiBWR0Etc3dpdGNoZXJvbyBzZXR1cCAqLworCXVuc2lnbmVkIGludCB1c2VfdmdhX3N3aXRjaGVyb286MTsKKwl1bnNpZ25lZCBpbnQgdmdhX3N3aXRjaGVyb29fcmVnaXN0ZXJlZDoxOworCXVuc2lnbmVkIGludCBpbml0X2ZhaWxlZDoxOyAvKiBkZWxheWVkIGluaXQgZmFpbGVkICovCisJdW5zaWduZWQgaW50IGRpc2FibGVkOjE7IC8qIGRpc2FibGVkIGJ5IFZHQS1zd2l0Y2hlciAqLworCisJLyogZm9yIGRlYnVnZ2luZyAqLworCXVuc2lnbmVkIGludCBsYXN0X2NtZFtBWlhfTUFYX0NPREVDU107CisKKwkvKiBmb3IgcGVuZGluZyBpcnFzICovCisJc3RydWN0IHdvcmtfc3RydWN0IGlycV9wZW5kaW5nX3dvcms7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHJvYmVfd29yazsKKworCS8qIHJlYm9vdCBub3RpZmllciAoZm9yIG15c3RlcmlvdXMgaGFuZ3VwIHByb2JsZW0gYXQgcG93ZXItZG93bikgKi8KKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcmVib290X25vdGlmaWVyOworCisJLyogY2FyZCBsaXN0IChmb3IgcG93ZXJfc2F2ZSB0cmlnZ2VyKSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKKwlzdHJ1Y3QgYXp4X2RldiBzYXZlZF9henhfZGV2OworI2VuZGlmCisKKwkvKiBzZWNvbmRhcnkgcG93ZXIgZG9tYWluIGZvciBoZG1pIGF1ZGlvIHVuZGVyIHZnYSBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2X3BtX2RvbWFpbiBoZG1pX3BtX2RvbWFpbjsKK307CisKKyNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLCisjZGVmaW5lIFNGWAkvKiBub3AgKi8KKyNlbHNlCisjZGVmaW5lIFNGWAkiaGRhLWludGVsICIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4NgorI2RlZmluZSBhenhfc25vb3AoY2hpcCkJCSgoY2hpcCktPnNub29wKQorI2Vsc2UKKyNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQl0cnVlCisjZW5kaWYKKworLyoKKyAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKKyAqLworCisjZGVmaW5lIGF6eF93cml0ZWwoY2hpcCwgcmVnLCB2YWx1ZSkgXAorCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlbCh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfcmVhZGwoY2hpcCwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGwoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfd3JpdGV3KGNoaXAsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZXcodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3JlYWR3KGNoaXAsIHJlZykgXAorCSgoY2hpcCktPm9wcy0+cmVnX3JlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3dyaXRlYihjaGlwLCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGViKHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9yZWFkYihjaGlwLCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkYigoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisKKyNkZWZpbmUgYXp4X3NkX3dyaXRlbChjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWwodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZGwoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkbCgoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3dyaXRldyhjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZXcodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZHcoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkdygoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3dyaXRlYihjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWIodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZGIoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkYigoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKworI2VuZGlmIC8qIF9fU09VTkRfSERBX1BSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfc3lzZnMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwNzkwOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3N5c2ZzLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qCisgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIEhELWF1ZGlvIGNvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiBzcGxpdCBmcm9tIGhkYV9od2RlcC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKyNpbmNsdWRlIDxzb3VuZC9oZGFfaHdkZXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KKworLyogaGludCBzdHJpbmcgcGFpciAqLworc3RydWN0IGhkYV9oaW50IHsKKwljb25zdCBjaGFyICprZXk7CisJY29uc3QgY2hhciAqdmFsOwkvKiBjb250YWluZWQgaW4gdGhlIHNhbWUgYWxsb2MgYXMga2V5ICovCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgc3NpemVfdCBwb3dlcl9vbl9hY2N0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgamlmZmllc190b19tc2Vjcyhjb2RlYy0+cG93ZXJfb25fYWNjdCkpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcl9vZmZfYWNjdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgamlmZmllc190b19tc2Vjcyhjb2RlYy0+cG93ZXJfb2ZmX2FjY3QpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyX29uX2FjY3QpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyX29mZl9hY2N0KTsKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2RlZmluZSBDT0RFQ19JTkZPX1NIT1codHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBjb2RlYy0+dHlwZSk7CQlcCit9CisKKyNkZWZpbmUgQ09ERUNfSU5GT19TVFJfU0hPVyh0eXBlKQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljaGFyICpidWYpCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwJCQkJXAorCQkgICAgICAgY29kZWMtPnR5cGUgPyBjb2RlYy0+dHlwZSA6ICIiKTsJCVwKK30KKworQ09ERUNfSU5GT19TSE9XKHZlbmRvcl9pZCk7CitDT0RFQ19JTkZPX1NIT1coc3Vic3lzdGVtX2lkKTsKK0NPREVDX0lORk9fU0hPVyhyZXZpc2lvbl9pZCk7CitDT0RFQ19JTkZPX1NIT1coYWZnKTsKK0NPREVDX0lORk9fU0hPVyhtZmcpOworQ09ERUNfSU5GT19TVFJfU0hPVyh2ZW5kb3JfbmFtZSk7CitDT0RFQ19JTkZPX1NUUl9TSE9XKGNoaXBfbmFtZSk7CitDT0RFQ19JTkZPX1NUUl9TSE9XKG1vZGVsbmFtZSk7CisKK3N0YXRpYyBzc2l6ZV90IHBpbl9jb25maWdzX3Nob3coc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJc3RydWN0IHNuZF9hcnJheSAqbGlzdCwKKwkJCQljaGFyICpidWYpCit7CisJaW50IGksIGxlbiA9IDA7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT51c2VkOyBpKyspIHsKKwkJc3RydWN0IGhkYV9waW5jZmcgKnBpbiA9IHNuZF9hcnJheV9lbGVtKGxpc3QsIGkpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIweCUwMnggMHglMDh4XG4iLAorCQkJICAgICAgIHBpbi0+bmlkLCBwaW4tPmNmZyk7CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBwaW5fY29uZmlnc19zaG93KGNvZGVjLCAmY29kZWMtPmluaXRfcGlucywgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgZHJpdmVyX3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHBpbl9jb25maWdzX3Nob3coY29kZWMsICZjb2RlYy0+ZHJpdmVyX3BpbnMsIGJ1Zik7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCisvKgorICogc3lzZnMgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIGludCBjbGVhcl9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2hkYV9jb2RlY19yZXNldChjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJY29kZWNfZXJyKGNvZGVjLCAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IGZyZWUuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc25kX2hkYV9zeXNmc19jbGVhcihjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVjb25maWdfY29kZWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGVycjsKKworCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOworCWNvZGVjX2luZm8oY29kZWMsICJoZGEtY29kZWM6IHJlY29uZmlndXJpbmdcbiIpOworCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKSB7CisJCWNvZGVjX2Vycihjb2RlYywKKwkJCSAgICJUaGUgY29kZWMgaXMgYmVpbmcgdXNlZCwgY2FuJ3QgcmVjb25maWd1cmUuXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZXJyID0gc25kX2hkYV9jb2RlY19jb25maWd1cmUoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIHJlYnVpbGQgUENNcyAqLworCWVyciA9IHNuZF9oZGFfY29kZWNfYnVpbGRfcGNtcyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogcmVidWlsZCBtaXhlcnMgKi8KKwllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3Rlcihjb2RlYy0+YnVzLT5jYXJkKTsKKyBlcnJvcjoKKwlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBhbGxvY2F0ZSBhIHN0cmluZyBhdCBtb3N0IGxlbiBjaGFycywgYW5kIHJlbW92ZSB0aGUgdHJhaWxpbmcgRU9MCisgKi8KK3N0YXRpYyBjaGFyICprc3RybmR1cF9ub2VvbChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4pCit7CisJY2hhciAqcyA9IGtzdHJuZHVwKHNyYywgbGVuLCBHRlBfS0VSTkVMKTsKKwljaGFyICpwOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHN0cmNocihzLCAnXG4nKTsKKwlpZiAocCkKKwkJKnAgPSAwOworCXJldHVybiBzOworfQorCisjZGVmaW5lIENPREVDX0lORk9fU1RPUkUodHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCXVuc2lnbmVkIGxvbmcgdmFsOwkJCQkJXAorCWludCBlcnIgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwkJCVwKKwlpZiAoZXJyIDwgMCkJCQkJCQlcCisJCXJldHVybiBlcnI7CQkJCQlcCisJY29kZWMtPnR5cGUgPSB2YWw7CQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCVwKK30KKworI2RlZmluZSBDT0RFQ19JTkZPX1NUUl9TVE9SRSh0eXBlKQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwljaGFyICpzID0ga3N0cm5kdXBfbm9lb2woYnVmLCA2NCk7CQkJXAorCWlmICghcykJCQkJCQkJXAorCQlyZXR1cm4gLUVOT01FTTsJCQkJCVwKKwlrZnJlZShjb2RlYy0+dHlwZSk7CQkJCQlcCisJY29kZWMtPnR5cGUgPSBzOwkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQlcCit9CisKK0NPREVDX0lORk9fU1RPUkUodmVuZG9yX2lkKTsKK0NPREVDX0lORk9fU1RPUkUoc3Vic3lzdGVtX2lkKTsKK0NPREVDX0lORk9fU1RPUkUocmV2aXNpb25faWQpOworQ09ERUNfSU5GT19TVFJfU1RPUkUodmVuZG9yX25hbWUpOworQ09ERUNfSU5GT19TVFJfU1RPUkUoY2hpcF9uYW1lKTsKK0NPREVDX0lORk9fU1RSX1NUT1JFKG1vZGVsbmFtZSk7CisKKyNkZWZpbmUgQ09ERUNfQUNUSU9OX1NUT1JFKHR5cGUpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCWludCBlcnIgPSAwOwkJCQkJCVwKKwlpZiAoKmJ1ZikJCQkJCQlcCisJCWVyciA9IHR5cGUjI19jb2RlYyhjb2RlYyk7CQkJXAorCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7CQkJCVwKK30KKworQ09ERUNfQUNUSU9OX1NUT1JFKHJlY29uZmlnKTsKK0NPREVDX0FDVElPTl9TVE9SRShjbGVhcik7CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfdmVyYnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGksIGxlbiA9IDA7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aW5pdF92ZXJicy51c2VkOyBpKyspIHsKKwkJc3RydWN0IGhkYV92ZXJiICp2ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5pbml0X3ZlcmJzLCBpKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJCSIweCUwMnggMHglMDN4IDB4JTA0eFxuIiwKKwkJCQl2LT5uaWQsIHYtPnZlcmIsIHYtPnBhcmFtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwYXJzZV9pbml0X3ZlcmJzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV92ZXJiICp2OworCWludCBuaWQsIHZlcmIsIHBhcmFtOworCisJaWYgKHNzY2FuZihidWYsICIlaSAlaSAlaSIsICZuaWQsICZ2ZXJiLCAmcGFyYW0pICE9IDMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghbmlkIHx8ICF2ZXJiKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJdiA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT5pbml0X3ZlcmJzKTsKKwlpZiAoIXYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2LT5uaWQgPSBuaWQ7CisJdi0+dmVyYiA9IHZlcmI7CisJdi0+cGFyYW0gPSBwYXJhbTsKKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaW5pdF92ZXJic19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyID0gcGFyc2VfaW5pdF92ZXJicyhjb2RlYywgYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhpbnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGksIGxlbiA9IDA7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aGludHMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfaGludCAqaGludCA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aGludHMsIGkpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkJIiVzID0gJXNcbiIsIGhpbnQtPmtleSwgaGludC0+dmFsKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBoZGFfaGludCAqZ2V0X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aGludHMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfaGludCAqaGludCA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aGludHMsIGkpOworCQlpZiAoIXN0cmNtcChoaW50LT5rZXksIGtleSkpCisJCQlyZXR1cm4gaGludDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV90cmFpbF9zcGFjZXMoY2hhciAqc3RyKQoreworCWNoYXIgKnA7CisJaWYgKCEqc3RyKQorCQlyZXR1cm47CisJcCA9IHN0ciArIHN0cmxlbihzdHIpIC0gMTsKKwlmb3IgKDsgaXNzcGFjZSgqcCk7IHAtLSkgeworCQkqcCA9IDA7CisJCWlmIChwID09IHN0cikKKwkJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgTUFYX0hJTlRTCTEwMjQKKworc3RhdGljIGludCBwYXJzZV9oaW50cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqYnVmKQoreworCWNoYXIgKmtleSwgKnZhbDsKKwlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQ7CisJaW50IGVyciA9IDA7CisKKwlidWYgPSBza2lwX3NwYWNlcyhidWYpOworCWlmICghKmJ1ZiB8fCAqYnVmID09ICcjJyB8fCAqYnVmID09ICdcbicpCisJCXJldHVybiAwOworCWlmICgqYnVmID09ICc9JykKKwkJcmV0dXJuIC1FSU5WQUw7CisJa2V5ID0ga3N0cm5kdXBfbm9lb2woYnVmLCAxMDI0KTsKKwlpZiAoIWtleSkKKwkJcmV0dXJuIC1FTk9NRU07CisJLyogZXh0cmFjdCBrZXkgYW5kIHZhbCAqLworCXZhbCA9IHN0cmNocihrZXksICc9Jyk7CisJaWYgKCF2YWwpIHsKKwkJa2ZyZWUoa2V5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSp2YWwrKyA9IDA7CisJdmFsID0gc2tpcF9zcGFjZXModmFsKTsKKwlyZW1vdmVfdHJhaWxfc3BhY2VzKGtleSk7CisJcmVtb3ZlX3RyYWlsX3NwYWNlcyh2YWwpOworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwloaW50ID0gZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJaWYgKGhpbnQpIHsKKwkJLyogcmVwbGFjZSAqLworCQlrZnJlZShoaW50LT5rZXkpOworCQloaW50LT5rZXkgPSBrZXk7CisJCWhpbnQtPnZhbCA9IHZhbDsKKwkJZ290byB1bmxvY2s7CisJfQorCS8qIGFsbG9jYXRlIGEgbmV3IGhpbnQgZW50cnkgKi8KKwlpZiAoY29kZWMtPmhpbnRzLnVzZWQgPj0gTUFYX0hJTlRTKQorCQloaW50ID0gTlVMTDsKKwllbHNlCisJCWhpbnQgPSBzbmRfYXJyYXlfbmV3KCZjb2RlYy0+aGludHMpOworCWlmIChoaW50KSB7CisJCWhpbnQtPmtleSA9IGtleTsKKwkJaGludC0+dmFsID0gdmFsOworCX0gZWxzZSB7CisJCWVyciA9IC1FTk9NRU07CisJfQorIHVubG9jazoKKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlpZiAoZXJyKQorCQlrZnJlZShrZXkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhpbnRzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyID0gcGFyc2VfaGludHMoY29kZWMsIGJ1Zik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCB1c2VyX3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIGJ1Zik7Cit9CisKKyNkZWZpbmUgTUFYX1BJTl9DT05GSUdTCQkzMgorCitzdGF0aWMgaW50IHBhcnNlX3VzZXJfcGluX2NvbmZpZ3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlpbnQgbmlkLCBjZmcsIGVycjsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkgJWkiLCAmbmlkLCAmY2ZnKSAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW5pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCWVyciA9IHNuZF9oZGFfYWRkX3BpbmNmZyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIG5pZCwgY2ZnKTsKKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdCB1c2VyX3Bpbl9jb25maWdzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnIgPSBwYXJzZV91c2VyX3Bpbl9jb25maWdzKGNvZGVjLCBidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBjb3VudDsKK30KKworLyogc3lzZnMgYXR0cmlidXRlcyBleHBvc2VkIG9ubHkgd2hlbiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRz15ICovCitzdGF0aWMgREVWSUNFX0FUVFJfUlcoaW5pdF92ZXJicyk7CitzdGF0aWMgREVWSUNFX0FUVFJfUlcoaGludHMpOworc3RhdGljIERFVklDRV9BVFRSX1JXKHVzZXJfcGluX2NvbmZpZ3MpOworc3RhdGljIERFVklDRV9BVFRSX1dPKHJlY29uZmlnKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhjbGVhcik7CisKKy8qCisgKiBMb29rIGZvciBoaW50IHN0cmluZworICovCitjb25zdCBjaGFyICpzbmRfaGRhX2dldF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IGhkYV9oaW50ICpoaW50ID0gZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJcmV0dXJuIGhpbnQgPyBoaW50LT52YWwgOiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfaGludCk7CisKK2ludCBzbmRfaGRhX2dldF9ib29sX2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwljb25zdCBjaGFyICpwOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcCA9IHNuZF9oZGFfZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJaWYgKCFwIHx8ICEqcCkKKwkJcmV0ID0gLUVOT0VOVDsKKwllbHNlIHsKKwkJc3dpdGNoICh0b3VwcGVyKCpwKSkgeworCQljYXNlICdUJzogLyogdHJ1ZSAqLworCQljYXNlICdZJzogLyogeWVzICovCisJCWNhc2UgJzEnOgorCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dldF9ib29sX2hpbnQpOworCitpbnQgc25kX2hkYV9nZXRfaW50X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSwgaW50ICp2YWxwKQoreworCWNvbnN0IGNoYXIgKnA7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlwID0gc25kX2hkYV9nZXRfaGludChjb2RlYywga2V5KTsKKwlpZiAoIXApCisJCXJldCA9IC1FTk9FTlQ7CisJZWxzZSBpZiAoa3N0cnRvdWwocCwgMCwgJnZhbCkpCisJCXJldCA9IC1FSU5WQUw7CisJZWxzZSB7CisJCSp2YWxwID0gdmFsOworCQlyZXQgPSAwOworCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfaW50X2hpbnQpOworI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX1JFQ09ORklHICovCisKKy8qCisgKiBjb21tb24gc3lzZnMgYXR0cmlidXRlcworICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKKyNkZWZpbmUgUkVDT05GSUdfREVWSUNFX0FUVFIobmFtZSkJREVWSUNFX0FUVFJfUlcobmFtZSkKKyNlbHNlCisjZGVmaW5lIFJFQ09ORklHX0RFVklDRV9BVFRSKG5hbWUpCURFVklDRV9BVFRSX1JPKG5hbWUpCisjZW5kaWYKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUih2ZW5kb3JfaWQpOworc3RhdGljIFJFQ09ORklHX0RFVklDRV9BVFRSKHN1YnN5c3RlbV9pZCk7CitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIocmV2aXNpb25faWQpOworc3RhdGljIERFVklDRV9BVFRSX1JPKGFmZyk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8obWZnKTsKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUih2ZW5kb3JfbmFtZSk7CitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIoY2hpcF9uYW1lKTsKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUihtb2RlbG5hbWUpOworc3RhdGljIERFVklDRV9BVFRSX1JPKGluaXRfcGluX2NvbmZpZ3MpOworc3RhdGljIERFVklDRV9BVFRSX1JPKGRyaXZlcl9waW5fY29uZmlncyk7CisKKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgorCisvKiBwYXJzZXIgbW9kZSAqLworZW51bSB7CisJTElORV9NT0RFX05PTkUsCisJTElORV9NT0RFX0NPREVDLAorCUxJTkVfTU9ERV9NT0RFTCwKKwlMSU5FX01PREVfUElOQ0ZHLAorCUxJTkVfTU9ERV9WRVJCLAorCUxJTkVfTU9ERV9ISU5ULAorCUxJTkVfTU9ERV9WRU5ET1JfSUQsCisJTElORV9NT0RFX1NVQlNZU1RFTV9JRCwKKwlMSU5FX01PREVfUkVWSVNJT05fSUQsCisJTElORV9NT0RFX0NISVBfTkFNRSwKKwlOVU1fTElORV9NT0RFUywKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0cm1hdGNoKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJcmV0dXJuIHN0cm5pY21wKGEsIGIsIHN0cmxlbihiKSkgPT0gMDsKK30KKworLyogcGFyc2UgdGhlIGNvbnRlbnRzIGFmdGVyIHRoZSBsaW5lICJbY29kZWNdIgorICogYWNjZXB0IG9ubHkgdGhlIGxpbmUgd2l0aCB0aHJlZSBudW1iZXJzLCBhbmQgYXNzaWduIHRoZSBjdXJyZW50IGNvZGVjCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2NvZGVjX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCWludCB2ZW5kb3JpZCwgc3ViaWQsIGNhZGRyOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCisJKmNvZGVjcCA9IE5VTEw7CisJaWYgKHNzY2FuZihidWYsICIlaSAlaSAlaSIsICZ2ZW5kb3JpZCwgJnN1YmlkLCAmY2FkZHIpID09IDMpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgeworCQkJaWYgKCh2ZW5kb3JpZCA8PSAwIHx8IGNvZGVjLT52ZW5kb3JfaWQgPT0gdmVuZG9yaWQpICYmCisJCQkgICAgKHN1YmlkIDw9IDAgfHwgY29kZWMtPnN1YnN5c3RlbV9pZCA9PSBzdWJpZCkgJiYKKwkJCSAgICBjb2RlYy0+YWRkciA9PSBjYWRkcikgeworCQkJCSpjb2RlY3AgPSBjb2RlYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworLyogcGFyc2UgdGhlIGNvbnRlbnRzIGFmdGVyIHRoZSBvdGhlciBjb21tYW5kIHRhZ3MsIFtwaW5jZmddLCBbdmVyYl0sCisgKiBbdmVuZG9yX2lkXSwgW3N1YnN5c3RlbV9pZF0sIFtyZXZpc2lvbl9pZF0sIFtjaGlwX25hbWVdLCBbaGludF0gYW5kIFttb2RlbF0KKyAqIGp1c3QgcGFzcyB0byB0aGUgc3lzZnMgaGVscGVyIChvbmx5IHdoZW4gYW55IGNvZGVjIHdhcyBzcGVjaWZpZWQpCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3BpbmNmZ19tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJcGFyc2VfdXNlcl9waW5fY29uZmlncygqY29kZWNwLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV92ZXJiX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJcGFyc2VfaW5pdF92ZXJicygqY29kZWNwLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9oaW50X21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJcGFyc2VfaGludHMoKmNvZGVjcCwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfbW9kZWxfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJa2ZyZWUoKCpjb2RlY3ApLT5tb2RlbG5hbWUpOworCSgqY29kZWNwKS0+bW9kZWxuYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jaGlwX25hbWVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCit7CisJa2ZyZWUoKCpjb2RlY3ApLT5jaGlwX25hbWUpOworCSgqY29kZWNwKS0+Y2hpcF9uYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworfQorCisjZGVmaW5lIERFRklORV9QQVJTRV9JRF9NT0RFKG5hbWUpIFwKK3N0YXRpYyB2b2lkIHBhcnNlXyMjbmFtZSMjX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBcCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApIFwKK3sgXAorCXVuc2lnbmVkIGxvbmcgdmFsOyBcCisJaWYgKCFrc3RydG91bChidWYsIDAsICZ2YWwpKSBcCisJCSgqY29kZWNwKS0+bmFtZSA9IHZhbDsgXAorfQorCitERUZJTkVfUEFSU0VfSURfTU9ERSh2ZW5kb3JfaWQpOworREVGSU5FX1BBUlNFX0lEX01PREUoc3Vic3lzdGVtX2lkKTsKK0RFRklORV9QQVJTRV9JRF9NT0RFKHJldmlzaW9uX2lkKTsKKworCitzdHJ1Y3QgaGRhX3BhdGNoX2l0ZW0geworCWNvbnN0IGNoYXIgKnRhZzsKKwljb25zdCBjaGFyICphbGlhczsKKwl2b2lkICgqcGFyc2VyKShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKipyZXRjKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BhdGNoX2l0ZW0gcGF0Y2hfaXRlbXNbTlVNX0xJTkVfTU9ERVNdID0geworCVtMSU5FX01PREVfQ09ERUNdID0geworCQkudGFnID0gIltjb2RlY10iLAorCQkucGFyc2VyID0gcGFyc2VfY29kZWNfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfTU9ERUxdID0geworCQkudGFnID0gIlttb2RlbF0iLAorCQkucGFyc2VyID0gcGFyc2VfbW9kZWxfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfVkVSQl0gPSB7CisJCS50YWcgPSAiW3ZlcmJdIiwKKwkJLmFsaWFzID0gIltpbml0X3ZlcmJzXSIsCisJCS5wYXJzZXIgPSBwYXJzZV92ZXJiX21vZGUsCisJfSwKKwlbTElORV9NT0RFX1BJTkNGR10gPSB7CisJCS50YWcgPSAiW3BpbmNmZ10iLAorCQkuYWxpYXMgPSAiW3VzZXJfcGluX2NvbmZpZ3NdIiwKKwkJLnBhcnNlciA9IHBhcnNlX3BpbmNmZ19tb2RlLAorCX0sCisJW0xJTkVfTU9ERV9ISU5UXSA9IHsKKwkJLnRhZyA9ICJbaGludF0iLAorCQkuYWxpYXMgPSAiW2hpbnRzXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9oaW50X21vZGUKKwl9LAorCVtMSU5FX01PREVfVkVORE9SX0lEXSA9IHsKKwkJLnRhZyA9ICJbdmVuZG9yX2lkXSIsCisJCS5wYXJzZXIgPSBwYXJzZV92ZW5kb3JfaWRfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfU1VCU1lTVEVNX0lEXSA9IHsKKwkJLnRhZyA9ICJbc3Vic3lzdGVtX2lkXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9zdWJzeXN0ZW1faWRfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfUkVWSVNJT05fSURdID0geworCQkudGFnID0gIltyZXZpc2lvbl9pZF0iLAorCQkucGFyc2VyID0gcGFyc2VfcmV2aXNpb25faWRfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfQ0hJUF9OQU1FXSA9IHsKKwkJLnRhZyA9ICJbY2hpcF9uYW1lXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9jaGlwX25hbWVfbW9kZSwKKwl9LAorfTsKKworLyogY2hlY2sgdGhlIGxpbmUgc3RhcnRpbmcgd2l0aCAnWycgLS0gY2hhbmdlIHRoZSBwYXJzZXIgbW9kZSBhY2NvZGluZ2x5ICovCitzdGF0aWMgaW50IHBhcnNlX2xpbmVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGF0Y2hfaXRlbXMpOyBpKyspIHsKKwkJaWYgKCFwYXRjaF9pdGVtc1tpXS50YWcpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cm1hdGNoKGJ1ZiwgcGF0Y2hfaXRlbXNbaV0udGFnKSkKKwkJCXJldHVybiBpOworCQlpZiAocGF0Y2hfaXRlbXNbaV0uYWxpYXMgJiYgc3RybWF0Y2goYnVmLCBwYXRjaF9pdGVtc1tpXS5hbGlhcykpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIExJTkVfTU9ERV9OT05FOworfQorCisvKiBjb3B5IG9uZSBsaW5lIGZyb20gdGhlIGJ1ZmZlciBpbiBmdywgYW5kIHVwZGF0ZSB0aGUgZmllbGRzIGluIGZ3CisgKiByZXR1cm4gemVybyBpZiBpdCByZWFjaGVzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgb3Igbm9uLXplcm8KKyAqIGlmIHN1Y2Nlc3NmdWxseSBjb3BpZWQgYSBsaW5lCisgKgorICogdGhlIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFyZSBzdHJpcHBlZAorICovCitzdGF0aWMgaW50IGdldF9saW5lX2Zyb21fZncoY2hhciAqYnVmLCBpbnQgc2l6ZSwgc2l6ZV90ICpmd19zaXplX3AsCisJCQkgICAgY29uc3Qgdm9pZCAqKmZ3X2RhdGFfcCkKK3sKKwlpbnQgbGVuOworCXNpemVfdCBmd19zaXplID0gKmZ3X3NpemVfcDsKKwljb25zdCBjaGFyICpwID0gKmZ3X2RhdGFfcDsKKworCXdoaWxlIChpc3NwYWNlKCpwKSAmJiBmd19zaXplKSB7CisJCXArKzsKKwkJZndfc2l6ZS0tOworCX0KKwlpZiAoIWZ3X3NpemUpCisJCXJldHVybiAwOworCisJZm9yIChsZW4gPSAwOyBsZW4gPCBmd19zaXplOyBsZW4rKykgeworCQlpZiAoISpwKQorCQkJYnJlYWs7CisJCWlmICgqcCA9PSAnXG4nKSB7CisJCQlwKys7CisJCQlsZW4rKzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChsZW4gPCBzaXplKQorCQkJKmJ1ZisrID0gKnArKzsKKwl9CisJKmJ1ZiA9IDA7CisJKmZ3X3NpemVfcCA9IGZ3X3NpemUgLSBsZW47CisJKmZ3X2RhdGFfcCA9IHA7CisJcmVtb3ZlX3RyYWlsX3NwYWNlcyhidWYpOworCXJldHVybiAxOworfQorCisvKgorICogbG9hZCBhICJwYXRjaCIgZmlybXdhcmUgZmlsZSBhbmQgcGFyc2UgaXQKKyAqLworaW50IHNuZF9oZGFfbG9hZF9wYXRjaChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzaXplX3QgZndfc2l6ZSwgY29uc3Qgdm9pZCAqZndfYnVmKQoreworCWNoYXIgYnVmWzEyOF07CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CisJaW50IGxpbmVfbW9kZTsKKworCWxpbmVfbW9kZSA9IExJTkVfTU9ERV9OT05FOworCWNvZGVjID0gTlVMTDsKKwl3aGlsZSAoZ2V0X2xpbmVfZnJvbV9mdyhidWYsIHNpemVvZihidWYpIC0gMSwgJmZ3X3NpemUsICZmd19idWYpKSB7CisJCWlmICghKmJ1ZiB8fCAqYnVmID09ICcjJyB8fCAqYnVmID09ICdcbicpCisJCQljb250aW51ZTsKKwkJaWYgKCpidWYgPT0gJ1snKQorCQkJbGluZV9tb2RlID0gcGFyc2VfbGluZV9tb2RlKGJ1ZiwgYnVzKTsKKwkJZWxzZSBpZiAocGF0Y2hfaXRlbXNbbGluZV9tb2RlXS5wYXJzZXIgJiYKKwkJCSAoY29kZWMgfHwgbGluZV9tb2RlIDw9IExJTkVfTU9ERV9DT0RFQykpCisJCQlwYXRjaF9pdGVtc1tsaW5lX21vZGVdLnBhcnNlcihidWYsIGJ1cywgJmNvZGVjKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2xvYWRfcGF0Y2gpOworI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUiAqLworCisvKgorICogc3lzZnMgZW50cmllcworICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaGRhX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl92ZW5kb3JfaWQuYXR0ciwKKwkmZGV2X2F0dHJfc3Vic3lzdGVtX2lkLmF0dHIsCisJJmRldl9hdHRyX3JldmlzaW9uX2lkLmF0dHIsCisJJmRldl9hdHRyX2FmZy5hdHRyLAorCSZkZXZfYXR0cl9tZmcuYXR0ciwKKwkmZGV2X2F0dHJfdmVuZG9yX25hbWUuYXR0ciwKKwkmZGV2X2F0dHJfY2hpcF9uYW1lLmF0dHIsCisJJmRldl9hdHRyX21vZGVsbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9pbml0X3Bpbl9jb25maWdzLmF0dHIsCisJJmRldl9hdHRyX2RyaXZlcl9waW5fY29uZmlncy5hdHRyLAorI2lmZGVmIENPTkZJR19QTQorCSZkZXZfYXR0cl9wb3dlcl9vbl9hY2N0LmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyX29mZl9hY2N0LmF0dHIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCSZkZXZfYXR0cl9pbml0X3ZlcmJzLmF0dHIsCisJJmRldl9hdHRyX2hpbnRzLmF0dHIsCisJJmRldl9hdHRyX3VzZXJfcGluX2NvbmZpZ3MuYXR0ciwKKwkmZGV2X2F0dHJfcmVjb25maWcuYXR0ciwKKwkmZGV2X2F0dHJfY2xlYXIuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGhkYV9kZXZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMJPSBoZGFfZGV2X2F0dHJzLAorfTsKKworY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc25kX2hkYV9kZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmaGRhX2Rldl9hdHRyX2dyb3VwLAorCU5VTEwKK307CisKK3ZvaWQgc25kX2hkYV9zeXNmc19pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCW11dGV4X2luaXQoJmNvZGVjLT51c2VyX211dGV4KTsKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+aW5pdF92ZXJicywgc2l6ZW9mKHN0cnVjdCBoZGFfdmVyYiksIDMyKTsKKwlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPmhpbnRzLCBzaXplb2Yoc3RydWN0IGhkYV9oaW50KSwgMzIpOworCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+dXNlcl9waW5zLCBzaXplb2Yoc3RydWN0IGhkYV9waW5jZmcpLCAxNik7CisjZW5kaWYKK30KKwordm9pZCBzbmRfaGRhX3N5c2ZzX2NsZWFyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCisJaW50IGk7CisKKwkvKiBjbGVhciBpbml0IHZlcmJzICovCisJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5pbml0X3ZlcmJzKTsKKwkvKiBjbGVhciBoaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aGludHMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfaGludCAqaGludCA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aGludHMsIGkpOworCQlrZnJlZShoaW50LT5rZXkpOyAvKiB3ZSBkb24ndCBuZWVkIHRvIGZyZWUgaGludC0+dmFsICovCisJfQorCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aGludHMpOworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+dXNlcl9waW5zKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggOGVkMGJjYy4uNDBiYTA2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0yMSw3ICsyMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKaW5kZXggMzBiM2E0Yi4uNWU2NTk5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCmluZGV4IDQ2ZWNkYmIuLjA5MmYyYmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC04NjgsNyArODY3LDcgQEAKIAlpbnQgc3RhdHVzID0gMDsKIAogCWlmIChkYXRhID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImNoaXBpb193cml0ZV9kYXRhIG51bGwgcHRyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiY2hpcGlvX3dyaXRlX2RhdGEgbnVsbCBwdHJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0MDcsMTIgKzE0MDYsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZGlyID09IFNDUF9HRVQgJiYgcmVwbHkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNwaW9fc2NwIGdldCBidXQgaGFzIG5vIGJ1ZmZlclxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX3NjcCBnZXQgYnV0IGhhcyBubyBidWZmZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAocmVwbHkgIT0gTlVMTCAmJiAocmVwbHlfbGVuID09IE5VTEwgfHwgKCpyZXBseV9sZW4gPT0gMCkpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkc3Bpb19zY3AgYmFkIHJlc3AgYnVmIGxlbiBwYXJtc1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX3NjcCBiYWQgcmVzcCBidWYgbGVuIHBhcm1zXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDMwLDcgKzE0MjksNyBAQAogCQkJCQlzaXplb2Yoc2NwX3JlcGx5KSwgJnJldF9ieXRlcyk7CiAKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNwaW9fc2NwOiBzZW5kIHNjcCBtc2cgZmFpbGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fc2NwOiBzZW5kIHNjcCBtc2cgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTE0NDksMTcgKzE0NDgsMTcgQEAKIAkJCQkJLyBzaXplb2YodW5zaWduZWQgaW50KTsKIAogCQlpZiAoKnJlcGx5X2xlbiA8IHJldF9zaXplKnNpemVvZih1bnNpZ25lZCBpbnQpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAicmVwbHkgdG9vIGxvbmcgZm9yIGJ1ZlxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZXBseSB0b28gbG9uZyBmb3IgYnVmXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9IGVsc2UgaWYgKHJldF9zaXplICE9IHJlcGx5X2RhdGFfc2l6ZSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIlJldExlbiBhbmQgSGRyTGVuIC5ORS5cbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiUmV0TGVuIGFuZCBIZHJMZW4gLk5FLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCSpyZXBseV9sZW4gPSByZXRfc2l6ZSpzaXplb2YodW5zaWduZWQgaW50KTsKIAkJCW1lbWNweShyZXBseSwgc2NwX3JlcGx5LmRhdGEsICpyZXBseV9sZW4pOwogCQl9CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlcGx5IGlsbC1mb3JtZWQgb3IgZXJyZmxhZyBzZXRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJyZXBseSBpbGwtZm9ybWVkIG9yIGVycmZsYWcgc2V0XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNDg5LDIyICsxNDg4LDIyIEBACiAJaW50IHN0YXR1cyA9IDA7CiAJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2YoZG1hX2NoYW4pOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcGlvX2FsbG9jX2RtYV9jaGFuKCkgLS0gYmVnaW5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwaW9fYWxsb2NfZG1hX2NoYW4oKSAtLSBiZWdpblxuIik7CiAJc3RhdHVzID0gZHNwaW9fc2NwKGNvZGVjLCBNQVNURVJDT05UUk9MLCBNQVNURVJDT05UUk9MX0FMTE9DX0RNQV9DSEFOLAogCQkJU0NQX0dFVCwgTlVMTCwgMCwgZG1hX2NoYW4sICZzaXplKTsKIAogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwaW9fYWxsb2NfZG1hX2NoYW46IFNDUCBGYWlsZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3Bpb19hbGxvY19kbWFfY2hhbjogU0NQIEZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJaWYgKCgqZG1hX2NoYW4gKyAxKSA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAibm8gZnJlZSBkbWEgY2hhbm5lbHMgdG8gYWxsb2NhdGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJubyBmcmVlIGRtYSBjaGFubmVscyB0byBhbGxvY2F0ZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0Jc25kX3ByaW50ZGQoImRzcGlvX2FsbG9jX2RtYV9jaGFuOiBjaGFuPSVkXG4iLCAqZG1hX2NoYW4pOwotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3Bpb19hbGxvY19kbWFfY2hhbigpIC0tIGNvbXBsZXRlXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJkc3Bpb19hbGxvY19kbWFfY2hhbjogY2hhbj0lZFxuIiwgKmRtYV9jaGFuKTsKKwljb2RlY19kYmcoY29kZWMsICIgICAgIGRzcGlvX2FsbG9jX2RtYV9jaGFuKCkgLS0gY29tcGxldGVcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE1MTcsMTggKzE1MTYsMTggQEAKIAlpbnQgc3RhdHVzID0gMDsKIAl1bnNpZ25lZCBpbnQgZHVtbXkgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcGlvX2ZyZWVfZG1hX2NoYW4oKSAtLSBiZWdpblxuIik7Ci0Jc25kX3ByaW50ZGQoImRzcGlvX2ZyZWVfZG1hX2NoYW46IGNoYW49JWRcbiIsIGRtYV9jaGFuKTsKKwljb2RlY19kYmcoY29kZWMsICIgICAgIGRzcGlvX2ZyZWVfZG1hX2NoYW4oKSAtLSBiZWdpblxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fZnJlZV9kbWFfY2hhbjogY2hhbj0lZFxuIiwgZG1hX2NoYW4pOwogCiAJc3RhdHVzID0gZHNwaW9fc2NwKGNvZGVjLCBNQVNURVJDT05UUk9MLCBNQVNURVJDT05UUk9MX0FMTE9DX0RNQV9DSEFOLAogCQkJICAgU0NQX1NFVCwgJmRtYV9jaGFuLCBzaXplb2YoZG1hX2NoYW4pLCBOVUxMLCAmZHVtbXkpOwogCiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3Bpb19mcmVlX2RtYV9jaGFuOiBTQ1AgRmFpbGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fZnJlZV9kbWFfY2hhbjogU0NQIEZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcGlvX2ZyZWVfZG1hX2NoYW4oKSAtLSBjb21wbGV0ZVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3Bpb19mcmVlX2RtYV9jaGFuKCkgLS0gY29tcGxldGVcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE1NzYsMTQgKzE1NzUsMTQgQEAKIAl1bnNpZ25lZCBpbnQgcmVzOwogCWludCByZXRyeSA9IDIwOwogCi0Jc25kX3ByaW50ZGQoImRzcF9yZXNldFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiZHNwX3Jlc2V0XG4iKTsKIAlkbyB7CiAJCXJlcyA9IGRzcGlvX3NlbmQoY29kZWMsIFZFTkRPUl9EU1BJT19EU1BfSU5JVCwgMCk7CiAJCXJldHJ5LS07CiAJfSB3aGlsZSAocmVzID09IC1FSU8gJiYgcmV0cnkpOwogCiAJaWYgKCFyZXRyeSkgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Jlc2V0IHRpbWVvdXRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3BfcmVzZXQgdGltZW91dFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTYzNiwzOSArMTYzNSwzOSBAQAogCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJYm9vbCBjb2RlLCB5cmFtOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3NldHVwX2NvbW1vbigpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zZXR1cF9jb21tb24oKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOwogCiAJaWYgKGRtYV9jaGFuID49IERTUERNQUNfRE1BX0NGR19DSEFOTkVMX0NPVU5UKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkbWEgY2hhbiBudW0gaW52YWxpZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRtYSBjaGFuIG51bSBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGRzcF9pc19kbWFfYWN0aXZlKGNvZGVjLCBkbWFfY2hhbikpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImRtYSBhbHJlYWR5IGFjdGl2ZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRtYSBhbHJlYWR5IGFjdGl2ZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJZHNwX2FkZHggPSBkc3BfY2hpcF90b19kc3BfYWRkeChjaGlwX2FkZHgsICZjb2RlLCAmeXJhbSk7CiAKIAlpZiAoZHNwX2FkZHggPT0gSU5WQUxJRF9DSElQX0FERFJFU1MpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImludmFsaWQgY2hpcCBhZGRyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaW52YWxpZCBjaGlwIGFkZHJcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAogCWNobmxfcHJvcCA9IERTUERNQUNfQ0hOTFBST1BfQUNfTUFTSzsKIAlhY3RpdmUgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIHN0YXJ0IHJlZyBwZ21cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgc3RhcnQgcmVnIHBnbVxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywgRFNQRE1BQ19DSE5MUFJPUF9JTlNUX09GRlNFVCwKIAkJCQkgICAgICZjaG5sX3Byb3ApOwogCiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAicmVhZCBDSE5MUFJPUCBSZWcgZmFpbFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZWFkIENITkxQUk9QIFJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3BfZG1hX3NldHVwX2NvbW1vbigpIFJlYWQgQ0hOTFBST1BcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3BfZG1hX3NldHVwX2NvbW1vbigpIFJlYWQgQ0hOTFBST1BcbiIpOwogCX0KIAogCWlmICghY29kZSkKQEAgLTE2ODAsMjAgKzE2NzksMjAgQEAKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19DSE5MUFJPUF9JTlNUX09GRlNFVCwgY2hubF9wcm9wKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgQ0hOTFBST1AgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBDSE5MUFJPUCBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBDSE5MUFJPUFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBDSE5MUFJPUFxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywgRFNQRE1BQ19BQ1RJVkVfSU5TVF9PRkZTRVQsCiAJCQkJICAgICAmYWN0aXZlKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQUNUSVZFIFJlZyBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgInJlYWQgQUNUSVZFIFJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3BfZG1hX3NldHVwX2NvbW1vbigpIFJlYWQgQUNUSVZFXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwX2RtYV9zZXR1cF9jb21tb24oKSBSZWFkIEFDVElWRVxuIik7CiAJfQogCiAJYWN0aXZlICY9ICh+KDEgPDwgKERTUERNQUNfQUNUSVZFX0FBUl9MT0JJVCArIGRtYV9jaGFuKSkpICYKQEAgLTE3MDEsMzUgKzE3MDAsMzUgQEAKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19BQ1RJVkVfSU5TVF9PRkZTRVQsIGFjdGl2ZSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIEFDVElWRSBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIEFDVElWRSBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIEFDVElWRVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBBQ1RJVkVcbiIpOwogCiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLCBEU1BETUFDX0FVRENIU0VMX0lOU1RfT0ZGU0VUKGRtYV9jaGFuKSwKIAkJCSAgICAgIHBvcnRfbWFwX21hc2spOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBBVURDSFNFTCBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIEFVRENIU0VMIFJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIEFVRENIU0VMXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIEFVRENIU0VMXG4iKTsKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19JUlFDTlRfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLAogCQkJRFNQRE1BQ19JUlFDTlRfQklDTlRfTUFTSyB8IERTUERNQUNfSVJRQ05UX0NJQ05UX01BU0spOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBJUlFDTlQgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBJUlFDTlQgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgV3JpdGUgSVJRQ05UXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIElSUUNOVFxuIik7CiAKLQlzbmRfcHJpbnRkZCgKKwljb2RlY19kYmcoY29kZWMsCiAJCSAgICJDaGlwQT0weCV4LERzcEE9MHgleCxkbWFDaD0ldSwgIgogCQkgICAiQ0hTRUw9MHgleCxDSFBST1A9MHgleCxBY3RpdmU9MHgleFxuIiwKIAkJICAgY2hpcF9hZGR4LCBkc3BfYWRkeCwgZG1hX2NoYW4sCiAJCSAgIHBvcnRfbWFwX21hc2ssIGNobmxfcHJvcCwgYWN0aXZlKTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zZXR1cF9jb21tb24oKSAtLSBDb21wbGV0ZSAtLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgLS0gQ29tcGxldGUgLS0tLS0tXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc1NSwyMCArMTc1NCwyMCBAQAogCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfZG1hX2NvdW50ID0gMSA8PCAoRFNQRE1BQ19YRlJDTlRfQkNOVF9ISUJJVCAtCiAJCQkJCQlEU1BETUFDX1hGUkNOVF9CQ05UX0xPQklUICsgMSk7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc2V0dXAoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc2V0dXAoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOwogCiAJaWYgKGNvdW50ID4gbWF4X2RtYV9jb3VudCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiY291bnQgdG9vIGJpZ1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImNvdW50IHRvbyBiaWdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlkc3BfYWRkeCA9IGRzcF9jaGlwX3RvX2RzcF9hZGR4KGNoaXBfYWRkeCwgJmNvZGUsICZ5cmFtKTsKIAlpZiAoZHNwX2FkZHggPT0gSU5WQUxJRF9DSElQX0FERFJFU1MpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImludmFsaWQgY2hpcCBhZGRyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaW52YWxpZCBjaGlwIGFkZHJcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cCgpICAgIHN0YXJ0IHJlZyBwZ21cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBzdGFydCByZWcgcGdtXG4iKTsKIAogCWFkZHJfZmllbGQgPSBkc3BfYWRkeCA8PCBEU1BETUFDX0RNQUNGR19EQkFEUl9MT0JJVDsKIAlpbmNyX2ZpZWxkICAgPSAwOwpAQCAtMTc4NSwxMCArMTc4NCwxMCBAQAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19ETUFDRkdfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLAogCQkJCWRtYV9jZmcpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBETUFDRkcgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBETUFDRkcgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBXcml0ZSBETUFDRkdcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBXcml0ZSBETUFDRkdcbiIpOwogCiAJYWRyX29mcyA9IChjb3VudCAtIDEpIDw8IChEU1BETUFDX0RTUEFEUk9GU19CT0ZTX0xPQklUICsKIAkJCQkJCQkoY29kZSA/IDAgOiAxKSk7CkBAIC0xNzk2LDEwICsxNzk1LDEwIEBACiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLCBEU1BETUFDX0RTUEFEUk9GU19JTlNUX09GRlNFVChkbWFfY2hhbiksCiAJCQkJYWRyX29mcyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIERTUEFEUk9GUyBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIERTUEFEUk9GUyBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cCgpICAgIFdyaXRlIERTUEFEUk9GU1xuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cCgpICAgIFdyaXRlIERTUEFEUk9GU1xuIik7CiAKIAliYXNlX2NudCA9IChjb3VudCAtIDEpIDw8IERTUERNQUNfWEZSQ05UX0JDTlRfTE9CSVQ7CiAKQEAgLTE4MTAsMTcgKzE4MDksMTcgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsCiAJCQkJRFNQRE1BQ19YRlJDTlRfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLCB4ZnJfY250KTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgWEZSQ05UIFJlZyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAid3JpdGUgWEZSQ05UIFJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwKCkgICAgV3JpdGUgWEZSQ05UXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwKCkgICAgV3JpdGUgWEZSQ05UXG4iKTsKIAotCXNuZF9wcmludGRkKAorCWNvZGVjX2RiZyhjb2RlYywKIAkJICAgIkNoaXBBPTB4JXgsIGNudD0weCV4LCBETUFDRkc9MHgleCwgIgogCQkgICAiQURST0ZTPTB4JXgsIFhGUkNOVD0weCV4XG4iLAogCQkgICBjaGlwX2FkZHgsIGNvdW50LCBkbWFfY2ZnLCBhZHJfb2ZzLCB4ZnJfY250KTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zZXR1cCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zZXR1cCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MzQsMTcgKzE4MzMsMTcgQEAKIAl1bnNpZ25lZCBpbnQgcmVnID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywKIAkJCQkgICAgIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULCAmcmVnKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0YXJ0KCkgICAgUmVhZCBDSE5MU1RBUlRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICItLSBkc3BfZG1hX3N0YXJ0KCkgICAgUmVhZCBDSE5MU1RBUlRcbiIpOwogCiAJCXJlZyAmPSB+KERTUERNQUNfQ0hOTFNUQVJUX0VOX01BU0sgfAogCQkJCURTUERNQUNfQ0hOTFNUQVJUX0RJU19NQVNLKTsKQEAgLTE4NTMsMTAgKzE4NTIsMTAgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULAogCQkJcmVnIHwgKDEgPDwgKGRtYV9jaGFuICsgRFNQRE1BQ19DSE5MU1RBUlRfRU5fTE9CSVQpKSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIENITkxTVEFSVCByZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIENITkxTVEFSVCByZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdGFydCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTg3MCwxNyArMTg2OSwxNyBAQAogCXVuc2lnbmVkIGludCByZWcgPSAwOwogCWludCBzdGF0dXMgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0b3AoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RvcCgpIC0tIEJlZ2luIC0tLS0tLS0tLVxuIik7CiAKIAlpZiAob3ZseSkgewogCQlzdGF0dXMgPSBjaGlwaW9fcmVhZChjb2RlYywKIAkJCQkgICAgIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULCAmcmVnKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgInJlYWQgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0b3AoKSAgICBSZWFkIENITkxTVEFSVFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RvcCgpICAgIFJlYWQgQ0hOTFNUQVJUXG4iKTsKIAkJcmVnICY9IH4oRFNQRE1BQ19DSE5MU1RBUlRfRU5fTUFTSyB8CiAJCQkJRFNQRE1BQ19DSE5MU1RBUlRfRElTX01BU0spOwogCX0KQEAgLTE4ODgsMTAgKzE4ODcsMTAgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfQ0hOTFNUQVJUX0lOU1RfT0ZGU0VULAogCQkJcmVnIHwgKDEgPDwgKGRtYV9jaGFuICsgRFNQRE1BQ19DSE5MU1RBUlRfRElTX0xPQklUKSkpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBDSE5MU1RBUlQgcmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBDSE5MU1RBUlQgcmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc3RvcCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdG9wKCkgLS0gQ29tcGxldGUgLS0tLS0tLS0tXG4iKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTc0LDE3ICsxOTczLDE3IEBACiB7CiAJaW50IHN0YXR1czsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBiZWdpblxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBiZWdpblxuIik7CiAKIAlpZiAoKHJhdGVfbXVsdGkgIT0gMSkgJiYgKHJhdGVfbXVsdGkgIT0gMikgJiYgKHJhdGVfbXVsdGkgIT0gNCkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImJhZCByYXRlIG11bHRpcGxlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiYmFkIHJhdGUgbXVsdGlwbGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzdGF0dXMgPSBkc3BfYWxsb2NhdGVfcm91dGVyX3BvcnRzKGNvZGVjLCBudW1fY2hhbnMsCiAJCQkJCSAgIHJhdGVfbXVsdGksIDAsIHBvcnRfbWFwKTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBjb21wbGV0ZVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3BfYWxsb2NhdGVfcG9ydHMoKSAtLSBjb21wbGV0ZVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjAwMSw3ICsyMDAwLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmF0ZV9tdWx0aSA9IHNhbXBsZV9yYXRlX211bCAvIHNhbXBsZV9yYXRlX2RpdjsKIAogCWlmICgocmF0ZV9tdWx0aSAhPSAxKSAmJiAocmF0ZV9tdWx0aSAhPSAyKSAmJiAocmF0ZV9tdWx0aSAhPSA0KSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiYmFkIHJhdGUgbXVsdGlwbGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJiYWQgcmF0ZSBtdWx0aXBsZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjAxOSwxNCArMjAxOCwxNCBAQAogewogCWludCBzdGF0dXM7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgICAgZHNwX2ZyZWVfcG9ydHMoKSAtLSBiZWdpblxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3BfZnJlZV9wb3J0cygpIC0tIGJlZ2luXG4iKTsKIAogCXN0YXR1cyA9IGRzcF9mcmVlX3JvdXRlcl9wb3J0cyhjb2RlYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImZyZWUgcm91dGVyIHBvcnRzIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJmcmVlIHJvdXRlciBwb3J0cyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcF9mcmVlX3BvcnRzKCkgLS0gY29tcGxldGVcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwX2ZyZWVfcG9ydHMoKSAtLSBjb21wbGV0ZVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjA5Miw4ICsyMDkxLDYgQEAKIHsKIAlib29sIGNtZDsKIAotCXNuZF9wcmludGRkKCJkbWFfc2V0X3N0YXRlIHN0YXRlPSVkXG4iLCBzdGF0ZSk7Ci0KIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBETUFfU1RBVEVfU1RPUDoKIAkJY21kID0gZmFsc2U7CkBAIC0yMTk2LDcgKzIxOTMsNyBAQAogCXVuc2lnbmVkIGludCBjb3VudDsKIAogCWlmIChmbHMgPT0gTlVMTCB8fCBmbHMtPmNoaXBfYWRkciAhPSBnX2NoaXBfYWRkcl9tYWdpY192YWx1ZSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiaGNpX3dyaXRlIGludmFsaWQgcGFyYW1zXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaGNpX3dyaXRlIGludmFsaWQgcGFyYW1zXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjA1LDcgKzIyMDIsNyBAQAogCXdoaWxlIChjb3VudCA+PSAyKSB7CiAJCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgZGF0YVswXSwgZGF0YVsxXSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiaGNpX3dyaXRlIGNoaXBpbyBmYWlsZWRcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiaGNpX3dyaXRlIGNoaXBpbyBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCQljb3VudCAtPSAyOwpAQCAtMjI2NSwxMiArMjI2MiwxMiBAQAogCX0KIAogCWlmIChoY2lfd3JpdGUgJiYgKCFmbHMgfHwgaXNfbGFzdChmbHMpKSkgewotCQlzbmRfcHJpbnRkZCgiaGNpX3dyaXRlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiaGNpX3dyaXRlXG4iKTsKIAkJcmV0dXJuIGRzcHhmcl9oY2lfd3JpdGUoY29kZWMsIGhjaV93cml0ZSk7CiAJfQogCiAJaWYgKGZscyA9PSBOVUxMIHx8IGRtYV9lbmdpbmUgPT0gTlVMTCB8fCBwb3J0X21hcF9tYXNrID09IDApIHsKLQkJc25kX3ByaW50ZGQoIkludmFsaWQgUGFyYW1zXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiSW52YWxpZCBQYXJhbXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyODYsNyArMjI4Myw3IEBACiAJaWYgKCFVQ19SQU5HRShjaGlwX2FkZHgsIHdvcmRzX3RvX3dyaXRlKSAmJgogCSAgICAhWF9SQU5HRV9BTEwoY2hpcF9hZGR4LCB3b3Jkc190b193cml0ZSkgJiYKIAkgICAgIVlfUkFOR0VfQUxMKGNoaXBfYWRkeCwgd29yZHNfdG9fd3JpdGUpKSB7Ci0JCXNuZF9wcmludGRkKCJJbnZhbGlkIGNoaXBfYWRkeCBQYXJhbXNcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJJbnZhbGlkIGNoaXBfYWRkeCBQYXJhbXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyOTYsNyArMjI5Myw3IEBACiAJYnVmZmVyX2FkZHggPSBkbWFfZ2V0X2J1ZmZlcl9hZGRyKGRtYV9lbmdpbmUpOwogCiAJaWYgKGJ1ZmZlcl9hZGR4ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImRtYV9lbmdpbmUgYnVmZmVyIE5VTExcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkbWFfZW5naW5lIGJ1ZmZlciBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzA5LDcgKzIzMDYsNyBAQAogCQkJKG51bV9jaGFucyAqIHNhbXBsZV9yYXRlX211bCAvIHNhbXBsZV9yYXRlX2RpdikpOwogCiAJaWYgKGhkYV9mcmFtZV9zaXplX3dvcmRzID09IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImZybXN6IHplcm9cbiIpOworCQljb2RlY19kYmcoY29kZWMsICJmcm1zeiB6ZXJvXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzE3LDE0ICsyMzE0LDE0IEBACiAJCQkJKHVuc2lnbmVkIGludCkoVUNfUkFOR0UoY2hpcF9hZGR4LCAxKSA/CiAJCQkJNjU1MzYgOiAzMjc2OCkpOwogCWJ1ZmZlcl9zaXplX3dvcmRzIC09IGJ1ZmZlcl9zaXplX3dvcmRzICUgaGRhX2ZyYW1lX3NpemVfd29yZHM7Ci0Jc25kX3ByaW50ZGQoCisJY29kZWNfZGJnKGNvZGVjLAogCQkgICAiY2hwYWRyPTB4JTA4eCBmcm1zej0ldSBuY2hhbj0ldSAiCiAJCSAgICJyYXRlX211bD0ldSBkaXY9JXUgYnVmc3o9JXVcbiIsCiAJCSAgIGNoaXBfYWRkeCwgaGRhX2ZyYW1lX3NpemVfd29yZHMsIG51bV9jaGFucywKIAkJICAgc2FtcGxlX3JhdGVfbXVsLCBzYW1wbGVfcmF0ZV9kaXYsIGJ1ZmZlcl9zaXplX3dvcmRzKTsKIAogCWlmIChidWZmZXJfc2l6ZV93b3JkcyA8IGhkYV9mcmFtZV9zaXplX3dvcmRzKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkc3B4ZnJfb25lX3NlZzpmYWlsZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3B4ZnJfb25lX3NlZzpmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIzMzgsNyArMjMzNSw3IEBACiAKIAl3aGlsZSAod29yZHNfdG9fd3JpdGUgIT0gMCkgewogCQlydW5fc2l6ZV93b3JkcyA9IG1pbihidWZmZXJfc2l6ZV93b3Jkcywgd29yZHNfdG9fd3JpdGUpOwotCQlzbmRfcHJpbnRkZCgiZHNweGZyIChzZWcgbG9vcCljbnQ9JXUgcnM9JXUgcmVtYWluZGVyPSV1XG4iLAorCQljb2RlY19kYmcoY29kZWMsICJkc3B4ZnIgKHNlZyBsb29wKWNudD0ldSBycz0ldSByZW1haW5kZXI9JXVcbiIsCiAJCQkgICAgd29yZHNfdG9fd3JpdGUsIHJ1bl9zaXplX3dvcmRzLCByZW1haW5kZXJfd29yZHMpOwogCQlkbWFfeGZlcihkbWFfZW5naW5lLCBkYXRhLCBydW5fc2l6ZV93b3JkcypzaXplb2YodTMyKSk7CiAJCWlmICghY29tbV9kbWFfc2V0dXBfZG9uZSkgewpAQCAtMjM2MCw3ICsyMzU3LDcgQEAKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlyZXR1cm4gc3RhdHVzOwogCQlpZiAoIWRzcF9pc19kbWFfYWN0aXZlKGNvZGVjLCBkbWFfY2hhbikpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJkc3B4ZnI6RE1BIGRpZCBub3Qgc3RhcnRcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiZHNweGZyOkRNQSBkaWQgbm90IHN0YXJ0XG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCXN0YXR1cyA9IGRtYV9zZXRfc3RhdGUoZG1hX2VuZ2luZSwgRE1BX1NUQVRFX1JVTik7CkBAIC0yMzkyLDcgKzIzODksNyBAQAogCQlpZiAoZG1hX2FjdGl2ZSkKIAkJCWJyZWFrOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiKysrKysgRE1BIGNvbXBsZXRlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiKysrKysgRE1BIGNvbXBsZXRlXG4iKTsKIAkJZG1hX3NldF9zdGF0ZShkbWFfZW5naW5lLCBETUFfU1RBVEVfU1RPUCk7CiAJCXN0YXR1cyA9IGRtYV9yZXNldChkbWFfZW5naW5lKTsKIApAQCAtMjQ2Niw3ICsyNDYzLDcgQEAKIAkJCQkJaGRhX2Zvcm1hdCwgJnJlc3BvbnNlKTsKIAogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJzZXQgY29udmVydGVyIGZvcm1hdCBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAic2V0IGNvbnZlcnRlciBmb3JtYXQgZmFpbFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI0ODEsNyArMjQ3OCw3IEBACiAJaWYgKG92bHkpIHsKIAkJc3RhdHVzID0gZHNwaW9fYWxsb2NfZG1hX2NoYW4oY29kZWMsICZkbWFfY2hhbik7CiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiYWxsb2MgZG1hY2hhbiBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgImFsbG9jIGRtYWNoYW4gZmFpbFxuIik7CiAJCQlkbWFfY2hhbiA9IElOVkFMSURfRE1BX0NIQU5ORUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTI0OTEsNyArMjQ4OCw3IEBACiAJc3RhdHVzID0gZHNwX2FsbG9jYXRlX3BvcnRzX2Zvcm1hdChjb2RlYywgaGRhX2Zvcm1hdCwKIAkJCQkJJnBvcnRfbWFwX21hc2spOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJhbGxvYyBwb3J0cyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiYWxsb2MgcG9ydHMgZmFpbFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI0OTksMTMgKzI0OTYsMTMgQEAKIAlzdGF0dXMgPSBjb2RlY19zZXRfY29udmVydGVyX3N0cmVhbV9jaGFubmVsKGNvZGVjLAogCQkJV0lER0VUX0NISVBfQ1RSTCwgc3RyZWFtX2lkLCAwLCAmcmVzcG9uc2UpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJzZXQgc3RyZWFtIGNoYW4gZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgInNldCBzdHJlYW0gY2hhbiBmYWlsXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXdoaWxlICgoZmxzX2RhdGEgIT0gTlVMTCkgJiYgIWlzX2xhc3QoZmxzX2RhdGEpKSB7CiAJCWlmICghaXNfdmFsaWQoZmxzX2RhdGEpKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiRkxTIGNoZWNrIGZhaWxcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiRkxTIGNoZWNrIGZhaWxcbiIpOwogCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMjU0OCw3ICsyNTQ1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZHNwbG9hZF9wb3N0X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0tLSBkc3Bsb2FkX3Bvc3Rfc2V0dXAgLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLS0tIGRzcGxvYWRfcG9zdF9zZXR1cCAtLS0tLS1cbiIpOwogCiAJLypzZXQgRFNQIHNwZWFrZXIgdG8gMi4wIGNvbmZpZ3VyYXRpb24qLwogCWNoaXBpb193cml0ZShjb2RlYywgWFJBTV9YUkFNX0lOU1RfT0ZGU0VUKDB4MTgpLCAweDA4MDgwMDgwKTsKQEAgLTI1ODYsNyArMjU4Myw3IEBACiAJdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOwogCXVuc2lnbmVkIHNob3J0IGNoYW5uZWxzOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLS0tIGRzcGxvYWRfaW1hZ2UgYmVnaW4gLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLS0tIGRzcGxvYWRfaW1hZ2UgYmVnaW4gLS0tLS0tXG4iKTsKIAlpZiAocm91dGVyX2NoYW5zID09IDApIHsKIAkJaWYgKCFvdmx5KQogCQkJcm91dGVyX2NoYW5zID0gRE1BX1RSQU5TRkVSX0ZSQU1FX1NJWkVfTldPUkRTOwpAQCAtMjYwMywyNyArMjYwMCwyNyBAQAogCX0KIAogCWRvIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJSZWFkeSB0byBwcm9ncmFtIERNQVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIlJlYWR5IHRvIHByb2dyYW0gRE1BXG4iKTsKIAkJaWYgKCFvdmx5KQogCQkJc3RhdHVzID0gZHNwX3Jlc2V0KGNvZGVjKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwX3Jlc2V0KCkgY29tcGxldGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3BfcmVzZXQoKSBjb21wbGV0ZVxuIik7CiAJCXN0YXR1cyA9IGRzcHhmcl9pbWFnZShjb2RlYywgZmxzLCByZWxvYywgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLAogCQkJCSAgICAgIG92bHkpOwogCiAJCWlmIChzdGF0dXMgPCAwKQogCQkJYnJlYWs7CiAKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJkc3B4ZnJfaW1hZ2UoKSBjb21wbGV0ZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcHhmcl9pbWFnZSgpIGNvbXBsZXRlXG4iKTsKIAkJaWYgKGF1dG9zdGFydCAmJiAhb3ZseSkgewogCQkJZHNwbG9hZF9wb3N0X3NldHVwKGNvZGVjKTsKIAkJCXN0YXR1cyA9IGRzcF9zZXRfcnVuX3N0YXRlKGNvZGVjKTsKIAkJfQogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiTE9BRCBGSU5JU0hFRFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkxPQUQgRklOSVNIRURcbiIpOwogCX0gd2hpbGUgKDApOwogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTMxMzIsNyArMzEyOSw3IEBACiAJdW5zaWduZWQgaW50IHRtcDsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfc2VsZWN0X291dFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NlbGVjdF9vdXRcbiIpOwogCiAJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CiAKQEAgLTMxNTAsNyArMzE0Nyw3IEBACiAJCXNwZWMtPmN1cl9vdXRfdHlwZSA9IFNQRUFLRVJfT1VUOwogCiAJaWYgKHNwZWMtPmN1cl9vdXRfdHlwZSA9PSBTUEVBS0VSX09VVCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9zZWxlY3Rfb3V0IHNwZWFrZXJcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc2VsZWN0X291dCBzcGVha2VyXG4iKTsKIAkJLypzcGVha2VyIG91dCBjb25maWcqLwogCQl0bXAgPSBGTE9BVF9PTkU7CiAJCWVyciA9IGRzcGlvX3NldF91aW50X3BhcmFtKGNvZGVjLCAweDgwLCAweDA0LCB0bXApOwpAQCAtMzE4Myw3ICszMTgwLDcgQEAKIAkJc25kX2hkYV9zZXRfcGluX2N0bChjb2RlYywgc3BlYy0+b3V0X3BpbnNbMF0sCiAJCQkJICAgIHBpbl9jdGwgfCBQSU5fT1VUKTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9zZWxlY3Rfb3V0IGhwXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NlbGVjdF9vdXQgaHBcbiIpOwogCQkvKmhlYWRwaG9uZSBvdXQgY29uZmlnKi8KIAkJdG1wID0gRkxPQVRfWkVSTzsKIAkJZXJyID0gZHNwaW9fc2V0X3VpbnRfcGFyYW0oY29kZWMsIDB4ODAsIDB4MDQsIHRtcCk7CkBAIC0zMjg4LDcgKzMyODUsNyBAQAogCWludCBqYWNrX3ByZXNlbnQ7CiAJaW50IGF1dG9famFjazsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3NlbGVjdF9taWNcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9zZWxlY3RfbWljXG4iKTsKIAogCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOwogCkBAIC0zNDEwLDcgKzM0MDcsNyBAQAogCQkJdmFsID0gMDsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9lZmZlY3Rfc2V0OiBuaWQ9MHgleCwgdmFsPSVsZFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfZWZmZWN0X3NldDogbmlkPTB4JXgsIHZhbD0lbGRcbiIsCiAJCSAgICBuaWQsIHZhbCk7CiAKIAlvbiA9ICh2YWwgPT0gMCkgPyBGTE9BVF9aRVJPIDogRkxPQVRfT05FOwpAQCAtMzQzMiw3ICszNDI5LDcgQEAKIAloZGFfbmlkX3QgbmlkOwogCWludCBpLCByZXQgPSAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfcGVfc3dpdGNoX3NldDogdmFsPSVsZFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfcGVfc3dpdGNoX3NldDogdmFsPSVsZFxuIiwKIAkJICAgIHNwZWMtPmVmZmVjdHNfc3dpdGNoW1BMQVlfRU5IQU5DRU1FTlQgLSBFRkZFQ1RfU1RBUlRfTklEXSk7CiAKIAlpID0gT1VUX0VGRkVDVF9TVEFSVF9OSUQgLSBFRkZFQ1RfU1RBUlRfTklEOwpAQCAtMzQ3OCw3ICszNDc1LDcgQEAKIAlpbnQgaSwgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgb2xkdmFsOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfY3ZvaWNlX3N3aXRjaF9zZXQ6IHZhbD0lbGRcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX2N2b2ljZV9zd2l0Y2hfc2V0OiB2YWw9JWxkXG4iLAogCQkgICAgc3BlYy0+ZWZmZWN0c19zd2l0Y2hbQ1JZU1RBTF9WT0lDRSAtIEVGRkVDVF9TVEFSVF9OSURdKTsKIAogCWkgPSBJTl9FRkZFQ1RfU1RBUlRfTklEIC0gRUZGRUNUX1NUQVJUX05JRDsKQEAgLTM2MDgsNyArMzYwNSw3IEBACiAJaWYgKHNlbCA+PSBpdGVtcykKIAkJcmV0dXJuIDA7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl92b2ljZWZ4X3B1dDogc2VsPSVkLCBwcmVzZXQ9JXNcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3ZvaWNlZnhfcHV0OiBzZWw9JWQsIHByZXNldD0lc1xuIiwKIAkJICAgIHNlbCwgY2EwMTMyX3ZvaWNlZnhfcHJlc2V0c1tzZWxdLm5hbWUpOwogCiAJLyoKQEAgLTM2NzksNyArMzY3Niw3IEBACiAJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwogCWludCBjaGFuZ2VkID0gMTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3N3aXRjaF9wdXQ6IG5pZD0weCV4LCB2YWw9JWxkXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9zd2l0Y2hfcHV0OiBuaWQ9MHgleCwgdmFsPSVsZFxuIiwKIAkJICAgIG5pZCwgKnZhbHApOwogCiAJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CkBAIC00MTQyLDcgKzQxMzksNyBAQAogCXU4IHZhbDsKIAl1bnNpZ25lZCBpbnQgb2xkdmFsOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfc2V0X2RtaWM6IGVuYWJsZT0lZFxuIiwgZW5hYmxlKTsKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc2V0X2RtaWM6IGVuYWJsZT0lZFxuIiwgZW5hYmxlKTsKIAogCW9sZHZhbCA9IHN0b3BfbWljMShjb2RlYyk7CiAJY2EwMTMyX3NldF92aXBzb3VyY2UoY29kZWMsIDApOwpAQCAtNDI1MCw3ICs0MjQ3LDcgQEAKIAlpbnQgaTsKIAloZGFfbmlkX3QgbmlkOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfcmVmcmVzaF93aWRnZXRfY2Fwcy5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9yZWZyZXNoX3dpZGdldF9jYXBzLlxuIik7CiAJbmlkID0gY29kZWMtPnN0YXJ0X25pZDsKIAlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9ub2RlczsgaSsrLCBuaWQrKykKIAkJY29kZWMtPndjYXBzW2ldID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsCkBAIC00Mzk0LDcgKzQzOTEsNyBAQAogewogCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfcHJvY2Vzc19kc3BfcmVzcG9uc2VcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9wcm9jZXNzX2RzcF9yZXNwb25zZVxuIik7CiAJaWYgKHNwZWMtPndhaXRfc2NwKSB7CiAJCWlmIChkc3Bpb19nZXRfcmVzcG9uc2VfZGF0YShjb2RlYykgPj0gMCkKIAkJCXNwZWMtPndhaXRfc2NwID0gMDsKQEAgLTQ0MTMsNyArNDQxMCw3IEBACiAJCXJlcyA9IHNuZF9oZGFfamFja19nZXRfYWN0aW9uKGNvZGVjLAogCQkJCShyZXMgPj4gQUNfVU5TT0xfUkVTX1RBR19TSElGVCkgJiAweDNmKTsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInNuZF9oZGFfamFja19nZXRfYWN0aW9uOiAweCV4XG4iLCByZXMpOworCQljb2RlY19kYmcoY29kZWMsICJzbmRfaGRhX2phY2tfZ2V0X2FjdGlvbjogMHgleFxuIiwgcmVzKTsKIAogCQlzd2l0Y2ggKHJlcykgewogCQljYXNlIFVOU09MX1RBR19IUDoKQEAgLTQ2NTgsNyArNDY1NSw3IEBACiAJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjOwogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgicGF0Y2hfY2EwMTMyXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJwYXRjaF9jYTAxMzJcbiIpOwogCiAJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKaW5kZXggZmM0OTJhYy4uMzg3ZjBiNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCmluZGV4IDljNmNlNzMuLjA2MWVhNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwpAQCAtMjMsNyArMjMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC0zMiw2ICszMSw5IEBACiAjaW5jbHVkZSAiaGRhX2phY2suaCIKICNpbmNsdWRlICJoZGFfZ2VuZXJpYy5oIgogCisjdW5kZWYgRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTCisKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKICNkZWZpbmUgTlVNX1BJTlMJMTEKIAogCkBAIC00NSwxMCArNDcsMTIgQEAKIAlDTUlfQVVUTywJLyogbGV0IGRyaXZlciBndWVzcyBpdCAqLwogCUNNSV9NT0RFTFMKIH07CisjZW5kaWYgLyogRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTICovCiAKIHN0cnVjdCBjbWlfc3BlYyB7CiAJc3RydWN0IGhkYV9nZW5fc3BlYyBnZW47CiAKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKIAkvKiBiZWxvdyBhcmUgb25seSBmb3Igc3RhdGljIG1vZGVscyAqLwogCiAJaW50IGJvYXJkX2NvbmZpZzsKQEAgLTgxLDggKzg1LDEwIEBACiAKIAkvKiBtdWx0aWNoYW5uZWwgcGlucyAqLwogCXN0cnVjdCBoZGFfdmVyYiBtdWx0aV9pbml0WzldOwkvKiAyIHZlcmJzIGZvciBlYWNoIHBpbiArIHRlcm1pbmF0b3IgKi8KKyNlbmRpZiAvKiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MgKi8KIH07CiAKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKIC8qCiAgKiBpbnB1dCBNVVgKICAqLwpAQCAtNTY2LDYgKzU3Miw3IEBACiAJLmluaXQgPSBjbWk5ODgwX2luaXQsCiAJLmZyZWUgPSBjbWk5ODgwX2ZyZWUsCiB9OworI2VuZGlmIC8qIEVOQUJMRV9DTUlfU1RBVElDX1FVSVJLUyAqLwogCiAvKgogICogc3R1ZmYgZm9yIGF1dG8tcGFyc2VyCkBAIC01ODgsMTUgKzU5NSwyMCBAQAogCiAJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmY2ZnKGNvZGVjLCBjZmcsIE5VTEwsIDApOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCWVyciA9IHNuZF9oZGFfZ2VuX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCBjZmcpOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGNtaV9hdXRvX3BhdGNoX29wczsKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCXNuZF9oZGFfZ2VuX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKKwogc3RhdGljIGludCBwYXRjaF9jbWk5ODgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjbWlfc3BlYyAqc3BlYzsKQEAgLTYwNiwyMyArNjE4LDE4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY29kZWMtPnNwZWMgPSBzcGVjOworI2lmZGVmIEVOQUJMRV9DTUlfU1RBVElDX1FVSVJLUwogCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDTUlfTU9ERUxTLAogCQkJCQkJCWNtaTk4ODBfbW9kZWxzLAogCQkJCQkJCWNtaTk4ODBfY2ZnX3RibCk7CiAJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCisJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCiAJCQkgICAgY29kZWMtPmNoaXBfbmFtZSk7CiAJCXNwZWMtPmJvYXJkX2NvbmZpZyA9IENNSV9BVVRPOyAvKiB0cnkgZXZlcnl0aGluZyAqLwogCX0KIAotCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPT0gQ01JX0FVVE8pIHsKLQkJaW50IGVyciA9IGNtaV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfaGRhX2dlbl9mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPT0gQ01JX0FVVE8pCisJCXJldHVybiBjbWlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCiAJLyogY29weSBkZWZhdWx0IERBQyBOSURzICovCiAJbWVtY3B5KHNwZWMtPmRhY19uaWRzLCBjbWk5ODgwX2RhY19uaWRzLCBzaXplb2Yoc3BlYy0+ZGFjX25pZHMpKTsKQEAgLTY2OSw2ICs2NzYsOSBAQAogCWNvZGVjLT5wYXRjaF9vcHMgPSBjbWk5ODgwX3BhdGNoX29wczsKIAogCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gY21pX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKyNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IGJjZjkxYmUuLjFkYzdlOTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KQEAgLTM1LDcgKzM0LDcgQEAKICNpbmNsdWRlICJoZGFfamFjay5oIgogI2luY2x1ZGUgImhkYV9nZW5lcmljLmgiCiAKLSNkZWZpbmUgRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTCisjdW5kZWYgRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTCiAKICNkZWZpbmUgQ1hUX1BJTl9ESVJfSU4gICAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgQ1hUX1BJTl9ESVJfT1VUICAgICAgICAgICAgIDB4MDEKQEAgLTY4LDYgKzY3LDEyIEBACiAKIAl1bnNpZ25lZCBpbnQgcGFyc2VfZmxhZ3M7IC8qIGZsYWcgZm9yIHNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZygpICovCiAKKwkvKiBPUExDIFhPIHNwZWNpZmljICovCisJYm9vbCByZWNvcmRpbmc7CisJYm9vbCBkY19lbmFibGU7CisJdW5zaWduZWQgaW50IGRjX2lucHV0X2JpYXM7IC8qIG9mZnNldCBpbnRvIG9scGNfeG9fZGNfYmlhcyAqLworCXN0cnVjdCBuaWRfcGF0aCAqZGNfbW9kZV9wYXRoOworCiAjaWZkZWYgRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTCiAJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1s1XTsKIAlpbnQgbnVtX21peGVyczsKQEAgLTEyMywxOSArMTI4LDYgQEAKIAl1bnNpZ25lZCBpbnQgaHBfbGFwdG9wOjE7CiAJdW5zaWduZWQgaW50IGFzdXM6MTsKIAotCXVuc2lnbmVkIGludCBleHRfbWljX3ByZXNlbnQ7Ci0JdW5zaWduZWQgaW50IHJlY29yZGluZzsKLQl2b2lkICgqY2FwdHVyZV9wcmVwYXJlKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0Jdm9pZCAoKmNhcHR1cmVfY2xlYW51cCkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotCi0JLyogT0xQQyBYTy0xLjUgc3VwcG9ydHMgREMgaW5wdXQgbW9kZSAoZS5nLiBmb3IgdXNlIHdpdGggYW5hbG9nIHNlbnNvcnMpCi0JICogdGhyb3VnaCB0aGUgbWljcm9waG9uZSBqYWNrLgotCSAqIFdoZW4gdGhlIHVzZXIgZW5hYmxlcyB0aGlzIHRocm91Z2ggYSBtaXhlciBzd2l0Y2gsIGJvdGggaW50ZXJuYWwgYW5kCi0JICogZXh0ZXJuYWwgbWljcm9waG9uZXMgYXJlIGRpc2FibGVkLiBHYWluIGlzIGZpeGVkIGF0IDBkQi4gSW4gdGhpcyBtb2RlLAotCSAqIHdlIGFsc28gYWxsb3cgdGhlIGJpYXMgdG8gYmUgY29uZmlndXJlZCB0aHJvdWdoIGEgc2VwYXJhdGUgbWl4ZXIKLQkgKiBjb250cm9sLiAqLwotCXVuc2lnbmVkIGludCBkY19lbmFibGU7Ci0JdW5zaWduZWQgaW50IGRjX2lucHV0X2JpYXM7IC8qIG9mZnNldCBpbnRvIGN4dDUwNjZfb2xwY19kY19iaWFzICovCiAJdW5zaWduZWQgaW50IG1pY19ib29zdDsgLyogb2Zmc2V0IGludG8gY3h0NTA2Nl9hbmFsb2dfbWljX2Jvb3N0ICovCiAjZW5kaWYgLyogRU5BQkxFX0NYVF9TVEFUSUNfUVVJUktTICovCiB9OwpAQCAtMjUzLDggKzI0NSw2IEBACiAJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpZiAoc3BlYy0+Y2FwdHVyZV9wcmVwYXJlKQotCQlzcGVjLT5jYXB0dXJlX3ByZXBhcmUoY29kZWMpOwogCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNfbmlkc1tzdWJzdHJlYW0tPm51bWJlcl0sCiAJCQkJICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKIAlyZXR1cm4gMDsKQEAgLTI2Niw4ICsyNTYsNiBAQAogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdKTsKLQlpZiAoc3BlYy0+Y2FwdHVyZV9jbGVhbnVwKQotCQlzcGVjLT5jYXB0dXJlX2NsZWFudXAoY29kZWMpOwogCXJldHVybiAwOwogfQogCkBAIC00NTcsOSArNDQ1LDcgQEAKIAogc3RhdGljIHZvaWQgY29uZXhhbnRfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKLQlrZnJlZShzcGVjKTsKKwlrZnJlZShjb2RlYy0+c3BlYyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHRfY2FwdHVyZV9taXhlcnNbXSA9IHsKQEAgLTY3MywxNCArNjU5LDYgQEAKIAl9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggY3h0NTA0NV9jYXB0dXJlX3NvdXJjZV9ocDUzMCA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsICAgICAgICAgIDB4MSB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDIgfSwKLQl9Ci19OwotCiAvKiB0dXJuIG9uL29mZiBFQVBEICgrIG11dGUgSFApIGFzIGEgbWFzdGVyIHN3aXRjaCAqLwogc3RhdGljIGludCBjeHQ1MDQ1X2hwX21hc3Rlcl9zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtNzk2LDI4ICs3NzQsNiBAQAogCXt9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0NV9taXhlcnNfaHA1MzBbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZjeHQ1MDQ1X2hwX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5pbmZvID0gY3h0X2VhcGRfaW5mbywKLQkJLmdldCA9IGN4dF9lYXBkX2dldCwKLQkJLnB1dCA9IGN4dDUwNDVfaHBfbWFzdGVyX3N3X3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAweDEwLAotCX0sCi0KLQl7fQotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDQ1X2luaXRfdmVyYnNbXSA9IHsKIAkvKiBMaW5lIGluLCBNaWMgKi8KIAl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU58QUNfUElOQ1RMX1ZSRUZfODAgfSwKQEAgLTEwMDAsNyArOTU2LDYgQEAKIAlDWFQ1MDQ1X0xBUFRPUF9NSUNTRU5TRSwKIAlDWFQ1MDQ1X0xBUFRPUF9IUE1JQ1NFTlNFLAogCUNYVDUwNDVfQkVOUSwKLQlDWFQ1MDQ1X0xBUFRPUF9IUDUzMCwKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJQ1hUNTA0NV9URVNULAogI2VuZGlmCkBAIC0xMDEzLDcgKzk2OCw2IEBACiAJW0NYVDUwNDVfTEFQVE9QX01JQ1NFTlNFXQk9ICJsYXB0b3AtbWljc2Vuc2UiLAogCVtDWFQ1MDQ1X0xBUFRPUF9IUE1JQ1NFTlNFXQk9ICJsYXB0b3AtaHBtaWNzZW5zZSIsCiAJW0NYVDUwNDVfQkVOUV0JCQk9ICJiZW5xIiwKLQlbQ1hUNTA0NV9MQVBUT1BfSFA1MzBdCQk9ICJsYXB0b3AtaHA1MzAiLAogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlbQ1hUNTA0NV9URVNUXQkJPSAidGVzdCIsCiAjZW5kaWYKQEAgLTEwMjEsOCArOTc1LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDQ1X2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGQ1LCAiSFAgNTMwIiwgQ1hUNTA0NV9MQVBUT1BfSFA1MzApLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIFAxMDUiLCBDWFQ1MDQ1X0xBUFRPUF9NSUNTRU5TRSksCiAJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDc1MywgIkJlbnEgUjU1RSIsIENYVDUwNDVfQkVOUSksCiAJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBhZCwgIkZ1aml0c3UgU2kxNTIwIiwgQ1hUNTA0NV9MQVBUT1BfTUlDU0VOU0UpLAogCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwY2IsICJGdWppdHN1IFNpMzUxNSIsIENYVDUwNDVfTEFQVE9QX0hQTUlDU0VOU0UpLApAQCAtMTExMywxNCArMTA2NSw2IEBACiAJCXNwZWMtPm51bV9taXhlcnMgPSAyOwogCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBjeHQ1MDQ1X2luaXQ7CiAJCWJyZWFrOwotCWNhc2UgQ1hUNTA0NV9MQVBUT1BfSFA1MzA6Ci0JCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDQ1X2hwX3Vuc29sX2V2ZW50OwotCQlzcGVjLT5pbnB1dF9tdXggPSAmY3h0NTA0NV9jYXB0dXJlX3NvdXJjZV9ocDUzMDsKLQkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOwotCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gY3h0NTA0NV9ocF9zZW5zZV9pbml0X3ZlcmJzOwotCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDQ1X21peGVyc19ocDUzMDsKLQkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA0NV9pbml0OwotCQlicmVhazsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJY2FzZSBDWFQ1MDQ1X1RFU1Q6CiAJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ1X3Rlc3RfY2FwdHVyZV9zb3VyY2U7CkBAIC0xOTQwLDExICsxODg0LDYgQEAKIHN0YXRpYyBjb25zdCBoZGFfbmlkX3QgY3h0NTA2Nl9jYXBzcmNfbmlkc1sxXSA9IHsgMHgxNyB9Owogc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBjeHQ1MDY2X2RpZ291dF9waW5fbmlkc1syXSA9IHsgMHgyMCwgMHgyMiB9OwogCi0vKiBPTFBDJ3MgbWljcm9waG9uZSBwb3J0IGlzIERDIGNvdXBsZWQgZm9yIHVzZSB3aXRoIGV4dGVybmFsIHNlbnNvcnMsCi0gKiB0aGVyZWZvcmUgd2UgdXNlIGEgNTAlIG1pYyBiaWFzIGluIG9yZGVyIHRvIGNlbnRlciB0aGUgaW5wdXQgc2lnbmFsIHdpdGgKLSAqIHRoZSBEQyBpbnB1dCByYW5nZSBvZiB0aGUgY29kZWMuICovCi0jZGVmaW5lIENYVDUwNjZfT0xQQ19FWFRfTUlDX0JJQVMgUElOX1ZSRUY1MAotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgY3h0NTA2Nl9tb2Rlc1sxXSA9IHsKIAl7IDIsIE5VTEwgfSwKIH07CkBAIC0xOTU5LDcgKzE4OTgsOCBAQAogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJdW5zaWduZWQgaW50IHBpbmN0bDsKIAotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiB1cGRhdGUgc3BlYWtlciwgaHBfcHJlc2VudD0lZCwgY3VyX2VhcGQ9JWRcbiIsCisJY29kZWNfZGJnKGNvZGVjLAorCQkgICJDWFQ1MDY2OiB1cGRhdGUgc3BlYWtlciwgaHBfcHJlc2VudD0lZCwgY3VyX2VhcGQ9JWRcbiIsCiAJCSAgICBzcGVjLT5ocF9wcmVzZW50LCBzcGVjLT5jdXJfZWFwZCk7CiAKIAkvKiBQb3J0IEEgKEhQKSAqLwpAQCAtMTk5Nyw4OCArMTkzNyw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBjeHQ1MDY2X29scGNfZGNfYmlhcyA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk9mZiIsIFBJTl9JTiB9LAotCQl7ICI1MCUiLCBQSU5fVlJFRjUwIH0sCi0JCXsgIjgwJSIsIFBJTl9WUkVGODAgfSwKLQl9LAotfTsKLQotc3RhdGljIGludCBjeHQ1MDY2X3NldF9vbHBjX2RjX2JpYXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQkvKiBFdmVuIHRob3VnaCBwb3J0IEYgaXMgdGhlIERDIGlucHV0LCB0aGUgYmlhcyBpcyBjb250cm9sbGVkIG9uIHBvcnQgQi4KLQkgKiB3ZSBhbHNvIGxlYXZlIHRoYXQgcG9ydCBhcyBhbiBhY3RpdmUgaW5wdXQgKGJ1dCB1bnNlbGVjdGVkKSBpbiBEQyBtb2RlCi0JICoganVzdCBpbiBjYXNlIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGJpYXMgc2V0dGluZyB0YWtlIGVmZmVjdC4gKi8KLQlyZXR1cm4gc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgMHgxYSwKLQkJY3h0NTA2Nl9vbHBjX2RjX2JpYXMuaXRlbXNbc3BlYy0+ZGNfaW5wdXRfYmlhc10uaW5kZXgpOwotfQotCi0vKiBPTFBDIGRlZmVycyBtaWMgd2lkZ2V0IGNvbnRyb2wgdW50aWwgd2hlbiBjYXB0dXJlIGlzIHN0YXJ0ZWQgYmVjYXVzZSB0aGUKLSAqIG1pY3JvcGhvbmUgTEVEIGNvbWVzIG9uIGFzIHNvb24gYXMgdGhlc2Ugc2V0dGluZ3MgYXJlIHB1dCBpbiBwbGFjZS4gaWYgd2UKLSAqIGRpZCB0aGlzIGJlZm9yZSByZWNvcmRpbmcsIGl0IHdvdWxkIGdpdmUgdGhlIGZhbHNlIGluZGljYXRpb24gdGhhdCByZWNvcmRpbmcKLSAqIGlzIGhhcHBlbmluZyB3aGVuIGl0IGlzIG5vdC4gKi8KLXN0YXRpYyB2b2lkIGN4dDUwNjZfb2xwY19zZWxlY3RfbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaWYgKCFzcGVjLT5yZWNvcmRpbmcpCi0JCXJldHVybjsKLQotCWlmIChzcGVjLT5kY19lbmFibGUpIHsKLQkJLyogaW4gREMgbW9kZSB3ZSBpZ25vcmUgcHJlc2VuY2UgZGV0ZWN0aW9uIGFuZCBqdXN0IHVzZSB0aGUgamFjawotCQkgKiB0aHJvdWdoIG91ciBzcGVjaWFsIERDIHBvcnQgKi8KLQkJY29uc3Qgc3RydWN0IGhkYV92ZXJiIGVuYWJsZV9kY19tb2RlW10gPSB7Ci0JCQkvKiBkaXNibGUgaW50ZXJuYWwgbWljLCBwb3J0IEMgKi8KLQkJCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JCQkvKiBlbmFibGUgREMgY2FwdHVyZSwgcG9ydCBGICovCi0JCQl7MHgxZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCQkJe30sCi0JCX07Ci0KLQkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZW5hYmxlX2RjX21vZGUpOwotCQkvKiBwb3J0IEIgaW5wdXQgZGlzYWJsZWQgKGFuZCBiaWFzIHNldCkgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGNhbGwgKi8KLQkJY3h0NTA2Nl9zZXRfb2xwY19kY19iaWFzKGNvZGVjKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGRpc2FibGUgREMgKHBvcnQgRikgKi8KLQlzbmRfaGRhX3NldF9waW5fY3RsKGNvZGVjLCAweDFlLCAwKTsKLQotCS8qIGV4dGVybmFsIG1pYywgcG9ydCBCICovCi0Jc25kX2hkYV9zZXRfcGluX2N0bChjb2RlYywgMHgxYSwKLQkJc3BlYy0+ZXh0X21pY19wcmVzZW50ID8gQ1hUNTA2Nl9PTFBDX0VYVF9NSUNfQklBUyA6IDApOwotCi0JLyogaW50ZXJuYWwgbWljLCBwb3J0IEMgKi8KLQlzbmRfaGRhX3NldF9waW5fY3RsKGNvZGVjLCAweDFiLAotCQlzcGVjLT5leHRfbWljX3ByZXNlbnQgPyAwIDogUElOX1ZSRUY4MCk7Ci19Ci0KLS8qIHRvZ2dsZSBpbnB1dCBvZiBidWlsdC1pbiBhbmQgbWljIGphY2sgYXBwcm9wcmlhdGVseSAqLwotc3RhdGljIHZvaWQgY3h0NTA2Nl9vbHBjX2F1dG9taWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQotCWlmIChzcGVjLT5kY19lbmFibGUpIC8qIGRvbid0IGRvIHByZXNlbmNlIGRldGVjdGlvbiBpbiBEQyBtb2RlICovCi0JCXJldHVybjsKLQotCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWEsIDAsCi0JCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKLQlpZiAocHJlc2VudCkKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwotCWVsc2UKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAotCQlwcmVzZW50ID8gMCA6IDEpOwotCXNwZWMtPmV4dF9taWNfcHJlc2VudCA9ICEhcHJlc2VudDsKLQotCWN4dDUwNjZfb2xwY19zZWxlY3RfbWljKGNvZGVjKTsKLX0KLQogLyogdG9nZ2xlIGlucHV0IG9mIGJ1aWx0LWluIGRpZ2l0YWwgbWljIGFuZCBtaWMgamFjayBhcHByb3ByaWF0ZWx5ICovCiBzdGF0aWMgdm9pZCBjeHQ1MDY2X3Zvc3Ryb19hdXRvbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewpAQCAtMjExMCwxMCArMTk2OCwxMCBAQAogCiAJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWEpOwogCWlmIChwcmVzZW50KSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGV4dF9taWNfcHJlc2VudCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX2Fic2VudCk7CiAJfQogfQpAQCAtMjEzOCwxMCArMTk5NiwxMCBAQAogCiAJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWIpOwogCWlmIChwcmVzZW50KSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGV4dF9taWNfcHJlc2VudCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX2Fic2VudCk7CiAJfQogfQpAQCAtMjE1Myw3ICsyMDExLDcgQEAKIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKIAogCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFiKTsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBwcmVzZW50PSVkXG4iLCBwcmVzZW50KTsKKwljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIHByZXNlbnQ9JWRcbiIsIHByZXNlbnQpOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAogCQkJICAgIHByZXNlbnQgPyAxIDogMCk7CiB9CkBAIC0yMTY1LDcgKzIwMjMsNyBAQAogCXVuc2lnbmVkIGludCBwcmVzZW50OwogCiAJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWIpOwotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIHByZXNlbnQ9JWRcbiIsIHByZXNlbnQpOworCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgcHJlc2VudD0lZFxuIiwgcHJlc2VudCk7CiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNywgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCiAJCQkgICAgcHJlc2VudCA/IDEgOiAzKTsKIH0KQEAgLTIyMDQsMTMgKzIwNjIsMTMgQEAKIAlleHRfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWIpOwogCWRvY2tfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWEpOwogCWlmIChleHRfcHJlc2VudCkgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX3ByZXNlbnQpOwogCX0gZWxzZSBpZiAoZG9ja19wcmVzZW50KSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBkb2NrIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBkb2NrIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBkb2NrX21pY19wcmVzZW50KTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGFic2VudFxuIik7CiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGV4dF9taWNfYWJzZW50KTsKIAl9CiB9CkBAIC0yMjI5LDcgKzIwODcsNyBAQAogCiAJc3BlYy0+aHBfcHJlc2VudCA9IHBvcnRBID8gSFBfUFJFU0VOVF9QT1JUX0EgOiAwOwogCXNwZWMtPmhwX3ByZXNlbnQgfD0gcG9ydEQgPyBIUF9QUkVTRU5UX1BPUlRfRCA6IDA7Ci0Jc25kX3ByaW50ZGQoIkNYVDUwNjY6IGhwIGF1dG9tdXRlIHBvcnRBPSV4IHBvcnREPSV4IHByZXNlbnQ9JWRcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogaHAgYXV0b211dGUgcG9ydEE9JXggcG9ydEQ9JXggcHJlc2VudD0lZFxuIiwKIAkJcG9ydEEsIHBvcnRELCBzcGVjLT5ocF9wcmVzZW50KTsKIAljeHQ1MDY2X3VwZGF0ZV9zcGVha2VyKGNvZGVjKTsKIH0KQEAgLTIyNTIsMjYgKzIxMTAsOSBAQAogfQogCiAvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgamFjayBzZW5zaW5nICovCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogdW5zb2wgZXZlbnQgJXggKCV4KVxuIiwgcmVzLCByZXMgPj4gMjYpOwotCXN3aXRjaCAocmVzID4+IDI2KSB7Ci0JY2FzZSBDT05FWEFOVF9IUF9FVkVOVDoKLQkJY3h0NTA2Nl9ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09ORVhBTlRfTUlDX0VWRU5UOgotCQkvKiBpZ25vcmUgbWljIGV2ZW50cyBpbiBEQyBtb2RlOyB3ZSdyZSBhbHdheXMgdXNpbmcgdGhlIGphY2sgKi8KLQkJaWYgKCFzcGVjLT5kY19lbmFibGUpCi0JCQljeHQ1MDY2X29scGNfYXV0b21pYyhjb2RlYyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIGphY2sgc2Vuc2luZyAqLwogc3RhdGljIHZvaWQgY3h0NTA2Nl91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKIHsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogdW5zb2wgZXZlbnQgJXggKCV4KVxuIiwgcmVzLCByZXMgPj4gMjYpOworCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IHVuc29sIGV2ZW50ICV4ICgleClcbiIsIHJlcywgcmVzID4+IDI2KTsKIAlzd2l0Y2ggKHJlcyA+PiAyNikgewogCWNhc2UgQ09ORVhBTlRfSFBfRVZFTlQ6CiAJCWN4dDUwNjZfaHBfYXV0b211dGUoY29kZWMpOwpAQCAtMjMzOCwxMjQgKzIxNzksMTAgQEAKIAkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKIAogCXNwZWMtPm1pY19ib29zdCA9IGlkeDsKLQlpZiAoIXNwZWMtPmRjX2VuYWJsZSkKLQkJY3h0NTA2Nl9zZXRfbWljX2Jvb3N0KGNvZGVjKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgY3h0NTA2Nl9lbmFibGVfZGMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JY29uc3Qgc3RydWN0IGhkYV92ZXJiIGVuYWJsZV9kY19tb2RlW10gPSB7Ci0JCS8qIGRpc2FibGUgZ2FpbiAqLwotCQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JCS8qIHN3aXRjaCB0byBEQyBpbnB1dCAqLwotCQl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDN9LAotCQl7fQotCX07Ci0KLQkvKiBjb25maWd1cmUgYXMgaW5wdXQgc291cmNlICovCi0Jc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZW5hYmxlX2RjX21vZGUpOwotCWN4dDUwNjZfb2xwY19zZWxlY3RfbWljKGNvZGVjKTsgLyogYWxzbyBzZXRzIGNvbmZpZ3VyZWQgYmlhcyAqLwotfQotCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X2Rpc2FibGVfZGMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JLyogcmVjb25maWd1cmUgaW5wdXQgc291cmNlICovCiAJY3h0NTA2Nl9zZXRfbWljX2Jvb3N0KGNvZGVjKTsKLQkvKiBhdXRvbWljIGFsc28gc2VsZWN0cyB0aGUgcmlnaHQgbWljIGlmIHdlJ3JlIHJlY29yZGluZyAqLwotCWN4dDUwNjZfb2xwY19hdXRvbWljKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc3BlYy0+ZGNfZW5hYmxlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGN4dDUwNjZfb2xwY19kY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGRjX2VuYWJsZSA9ICEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAoZGNfZW5hYmxlID09IHNwZWMtPmRjX2VuYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlzcGVjLT5kY19lbmFibGUgPSBkY19lbmFibGU7Ci0JaWYgKGRjX2VuYWJsZSkKLQkJY3h0NTA2Nl9lbmFibGVfZGMoY29kZWMpOwotCWVsc2UKLQkJY3h0NTA2Nl9kaXNhYmxlX2RjKGNvZGVjKTsKLQogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGN4dDUwNjZfb2xwY19kY19iaWFzX2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfaW5mbygmY3h0NTA2Nl9vbHBjX2RjX2JpYXMsIHVpbmZvKTsKLX0KLQotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfYmlhc19lbnVtX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5kY19pbnB1dF9iaWFzOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGN4dDUwNjZfb2xwY19kY19iaWFzX2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmY3h0NTA2Nl9hbmFsb2dfbWljX2Jvb3N0OwotCXVuc2lnbmVkIGludCBpZHg7Ci0KLQlpZHggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQotCQlpZHggPSBpbXV4LT5udW1faXRlbXMgLSAxOwotCi0Jc3BlYy0+ZGNfaW5wdXRfYmlhcyA9IGlkeDsKLQlpZiAoc3BlYy0+ZGNfZW5hYmxlKQotCQljeHQ1MDY2X3NldF9vbHBjX2RjX2JpYXMoY29kZWMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JLyogbWFyayBhcyByZWNvcmRpbmcgYW5kIGNvbmZpZ3VyZSB0aGUgbWljcm9waG9uZSB3aWRnZXQgc28gdGhhdCB0aGUKLQkgKiByZWNvcmRpbmcgTEVEIGNvbWVzIG9uLiAqLwotCXNwZWMtPnJlY29yZGluZyA9IDE7Ci0JY3h0NTA2Nl9vbHBjX3NlbGVjdF9taWMoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfY2FwdHVyZV9jbGVhbnVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IGhkYV92ZXJiIGRpc2FibGVfbWljc1tdID0gewotCQkvKiBkaXNhYmxlIGV4dGVybmFsIG1pYywgcG9ydCBCICovCi0JCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JCS8qIGRpc2JsZSBpbnRlcm5hbCBtaWMsIHBvcnQgQyAqLwotCQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCQkvKiBkaXNhYmxlIERDIGNhcHR1cmUsIHBvcnQgRiAqLwotCQl7MHgxZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQkJe30sCi0JfTsKLQotCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGRpc2FibGVfbWljcyk7Ci0Jc3BlYy0+cmVjb3JkaW5nID0gMDsKLX0KLQogc3RhdGljIHZvaWQgY29uZXhhbnRfY2hlY2tfZGlnX291dHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgIGNvbnN0IGhkYV9uaWRfdCAqZGlnX3BpbnMsCiAJCQkJICAgIGludCBudW1fcGlucykKQEAgLTI1MDYsNDMgKzIyMzMsNiBAQAogCXt9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA2Nl9taXhlcl9tYXN0ZXJfb2xwY1tdID0gewotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAotCQkJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSywKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfQU1QX0ZMQUcsCi0JCS5pbmZvID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8sCi0JCS5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfZ2V0LAotCQkucHV0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dCwKLQkJLnRsdiA9IHsgLmMgPSBzbmRfaGRhX21peGVyX2FtcF90bHYgfSwKLQkJLyogb2Zmc2V0IGJ5IDI4IHZvbHVtZSBzdGVwcyB0byBsaW1pdCBtaW5pbXVtIGdhaW4gdG8gLTQ2ZEIgKi8KLQkJLnByaXZhdGVfdmFsdWUgPQotCQkJSERBX0NPTVBPU0VfQU1QX1ZBTF9PRlMoMHgxMCwgMywgMCwgSERBX09VVFBVVCwgMjgpLAotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDY2X21peGVyX29scGNfZGNbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJEQyBNb2RlIEVuYWJsZSBTd2l0Y2giLAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBjeHQ1MDY2X29scGNfZGNfZ2V0LAotCQkucHV0ID0gY3h0NTA2Nl9vbHBjX2RjX3B1dCwKLQl9LAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkRDIElucHV0IEJpYXMgRW51bSIsCi0JCS5pbmZvID0gY3h0NTA2Nl9vbHBjX2RjX2JpYXNfZW51bV9pbmZvLAotCQkuZ2V0ID0gY3h0NTA2Nl9vbHBjX2RjX2JpYXNfZW51bV9nZXQsCi0JCS5wdXQgPSBjeHQ1MDY2X29scGNfZGNfYmlhc19lbnVtX3B1dCwKLQl9LAotCXt9Ci19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA2Nl9taXhlcnNbXSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtMjYzMyw2NyArMjMyMyw2IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDY2X2luaXRfdmVyYnNfb2xwY1tdID0gewotCS8qIFBvcnQgQTogaGVhZHBob25lcyAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogREFDMSAqLwotCi0JLyogUG9ydCBCOiBleHRlcm5hbCBtaWNyb3Bob25lICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBQb3J0IEM6IGludGVybmFsIG1pY3JvcGhvbmUgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCS8qIFBvcnQgRDogdW51c2VkICovCi0JezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBQb3J0IEU6IHVudXNlZCwgYnV0IGhhcyBwcmltYXJ5IEVBUEQgKi8KLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4Mn0sIC8qIGRlZmF1bHQgb24gKi8KLQotCS8qIFBvcnQgRjogZXh0ZXJuYWwgREMgaW5wdXQgdGhyb3VnaCBtaWNyb3Bob25lIHBvcnQgKi8KLQl7MHgxZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCS8qIFBvcnQgRzogaW50ZXJuYWwgc3BlYWtlcnMgKi8KLQl7MHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBEQUMxICovCi0KLQkvKiBEQUMxICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIERBQzI6IHVudXNlZCAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDUwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0KLQkvKiBEaXNhYmxlIGRpZ2l0YWwgbWljcm9waG9uZSBwb3J0ICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBBdWRpbyBpbnB1dCBzZWxlY3RvcnMgKi8KLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfCAweDN9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQotCS8qIERpc2FibGUgU1BESUYgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudHMgZm9yIFBvcnQgQSBhbmQgQiAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfSFBfRVZFTlR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfTUlDX0VWRU5UfSwKLQl7IH0gLyogZW5kICovCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGN4dDUwNjZfaW5pdF92ZXJic192b3N0cm9bXSA9IHsKIAkvKiBQb3J0IEE6IGhlYWRwaG9uZXMgKi8KIAl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKQEAgLTI4NzksNyArMjUwOCw3IEBACiAvKiBpbml0aWFsaXplIGphY2stc2Vuc2luZywgdG9vICovCiBzdGF0aWMgaW50IGN4dDUwNjZfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogaW5pdFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogaW5pdFxuIik7CiAJY29uZXhhbnRfaW5pdChjb2RlYyk7CiAJaWYgKGNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQpIHsKIAkJY3h0NTA2Nl9ocF9hdXRvbXV0ZShjb2RlYyk7CkBAIC0yODg5LDI1ICsyNTE4LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjeHQ1MDY2X29scGNfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBpbml0XG4iKTsKLQljb25leGFudF9pbml0KGNvZGVjKTsKLQljeHQ1MDY2X2hwX2F1dG9tdXRlKGNvZGVjKTsKLQlpZiAoIXNwZWMtPmRjX2VuYWJsZSkgewotCQljeHQ1MDY2X3NldF9taWNfYm9vc3QoY29kZWMpOwotCQljeHQ1MDY2X29scGNfYXV0b21pYyhjb2RlYyk7Ci0JfSBlbHNlIHsKLQkJY3h0NTA2Nl9lbmFibGVfZGMoY29kZWMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogZW51bSB7CiAJQ1hUNTA2Nl9MQVBUT1AsCQkvKiBMYXB0b3BzIHcvIEVBUEQgc3VwcG9ydCAqLwogCUNYVDUwNjZfREVMTF9MQVBUT1AsCS8qIERlbGwgTGFwdG9wICovCi0JQ1hUNTA2Nl9PTFBDX1hPXzFfNSwJLyogT0xQQyBYTyAxLjUgKi8KIAlDWFQ1MDY2X0RFTExfVk9TVFJPLAkvKiBEZWxsIFZvc3RybyAxMDE1aSAqLwogCUNYVDUwNjZfSURFQVBBRCwJLyogTGVub3ZvIElkZWFQYWQgVTE1MCAqLwogCUNYVDUwNjZfVEhJTktQQUQsCS8qIExlbm92byBUaGlua1BhZCBUNDEwcywgb3RoZXJzPyAqLwpAQCAtMjkyMCw3ICsyNTMzLDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3h0NTA2Nl9tb2RlbHNbQ1hUNTA2Nl9NT0RFTFNdID0gewogCVtDWFQ1MDY2X0xBUFRPUF0JPSAibGFwdG9wIiwKIAlbQ1hUNTA2Nl9ERUxMX0xBUFRPUF0JPSAiZGVsbC1sYXB0b3AiLAotCVtDWFQ1MDY2X09MUENfWE9fMV81XQk9ICJvbHBjLXhvLTFfNSIsCiAJW0NYVDUwNjZfREVMTF9WT1NUUk9dCT0gImRlbGwtdm9zdHJvIiwKIAlbQ1hUNTA2Nl9JREVBUEFEXQk9ICJpZGVhcGFkIiwKIAlbQ1hUNTA2Nl9USElOS1BBRF0JPSAidGhpbmtwYWQiLApAQCAtMjk0MSwxMCArMjU1Myw4IEBACiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTY0MywgIkFzdXMgSzUySlUiLCBDWFQ1MDY2X0FTVVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5OTMsICJBc3VzIFU1MEYiLCBDWFQ1MDY2X0FTVVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMWUsICJUb3NoaWJhIFNhdGVsbGl0ZSBDNjUwRCIsIENYVDUwNjZfSURFQVBBRCksCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY1MCwgIlRvc2hpYmEgU2F0ZWxsaXRlIFA1MDAtUFNQR1NDLTAxODAwVCIsIENYVDUwNjZfT0xQQ19YT18xXzUpLAogCVNORF9QQ0lfUVVJUksoMHgxNGYxLCAweDAxMDEsICJDb25leGFudCBSZWZlcmVuY2UgYm9hcmQiLAogCQkgICAgICBDWFQ1MDY2X0xBUFRPUCksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDgzMywgIk9MUEMgWE8tMS41IiwgQ1hUNTA2Nl9PTFBDX1hPXzFfNSksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIkxlbm92byBUNDAwcyIsIENYVDUwNjZfVEhJTktQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYzUsICJUaGlua3BhZCBFZGdlIDEzIiwgQ1hUNTA2Nl9USElOS1BBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjFjNiwgIlRoaW5rcGFkIEVkZ2UgMTMiLCBDWFQ1MDY2X0FTVVMpLApAQCAtMzAzMCwzMiArMjY0MCwxMSBAQAogCQlzcGVjLT5taWNfYm9vc3QgPSAzOyAvKiBkZWZhdWx0IDMwZEIgZ2FpbiAqLwogCQlicmVhazsKIAotCWNhc2UgQ1hUNTA2Nl9PTFBDX1hPXzFfNToKLQkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA2Nl9vbHBjX2luaXQ7Ci0JCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDY2X29scGNfdW5zb2xfZXZlbnQ7Ci0JCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBjeHQ1MDY2X2luaXRfdmVyYnNfb2xwYzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyX21hc3Rlcl9vbHBjOwotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfbWl4ZXJfb2xwY19kYzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyczsKLQkJc3BlYy0+cG9ydF9kX21vZGUgPSAwOwotCQlzcGVjLT5taWNfYm9vc3QgPSAzOyAvKiBkZWZhdWx0IDMwZEIgZ2FpbiAqLwotCi0JCS8qIG5vIFMvUERJRiBvdXQgKi8KLQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAwOwotCi0JCS8qIGlucHV0IHNvdXJjZSBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkICovCi0JCXNwZWMtPmlucHV0X211eCA9IE5VTEw7Ci0KLQkJLyogb3VyIGNhcHR1cmUgaG9va3Mgd2hpY2ggYWxsb3cgdXMgdG8gdHVybiBvbiB0aGUgbWljcm9waG9uZSBMRUQKLQkJICogYXQgdGhlIHJpZ2h0IHRpbWUgKi8KLQkJc3BlYy0+Y2FwdHVyZV9wcmVwYXJlID0gY3h0NTA2Nl9vbHBjX2NhcHR1cmVfcHJlcGFyZTsKLQkJc3BlYy0+Y2FwdHVyZV9jbGVhbnVwID0gY3h0NTA2Nl9vbHBjX2NhcHR1cmVfY2xlYW51cDsKLQkJYnJlYWs7CiAJY2FzZSBDWFQ1MDY2X0RFTExfVk9TVFJPOgogCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBjeHQ1MDY2X2luaXQ7CiAJCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDY2X3Vuc29sX2V2ZW50OwogCQlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA2Nl9pbml0X3ZlcmJzX3Zvc3RybzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyX21hc3Rlcl9vbHBjOworCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfbWl4ZXJfbWFzdGVyOwogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfbWl4ZXJzOwogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGN4dDUwNjZfdm9zdHJvX21peGVyczsKIAkJc3BlYy0+cG9ydF9kX21vZGUgPSAwOwpAQCAtMzIwNywxMSArMjc5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGN4X2F1dG9fZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfaGRhX2FwcGx5X2ZpeHVwKGNvZGVjLCBIREFfRklYVVBfQUNUX0ZSRUUpOwotCXNuZF9oZGFfZ2VuX2ZyZWUoY29kZWMpOwotfQorI2RlZmluZSBjeF9hdXRvX2ZyZWUJc25kX2hkYV9nZW5fZnJlZQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19vcHMgY3hfYXV0b19wYXRjaF9vcHMgPSB7CiAJLmJ1aWxkX2NvbnRyb2xzID0gY3hfYXV0b19idWlsZF9jb250cm9scywKQEAgLTMyMzgsNiArMjgyMywxMSBAQAogCUNYVF9GSVhVUF9IRUFEUEhPTkVfTUlDLAogCUNYVF9GSVhVUF9HUElPMSwKIAlDWFRfRklYVVBfVEhJTktQQURfQUNQSSwKKwlDWFRfRklYVVBfT0xQQ19YTywKKwlDWFRfRklYVVBfQ0FQX01JWF9BTVAsCisJQ1hUX0ZJWFVQX1RPU0hJQkFfUDEwNSwKKwlDWFRfRklYVVBfSFBfNTMwLAorCUNYVF9GSVhVUF9DQVBfTUlYX0FNUF81MDQ3LAogfTsKIAogLyogZm9yIGhkYV9maXh1cF90aGlua3BhZF9hY3BpKCkgKi8KQEAgLTMzMTYsNiArMjkwNiwyODggQEAKIAl9CiB9CiAKKy8qIE9QTEMgWE8gMS41IGZpeHVwICovCisKKy8qIE9MUEMgWE8tMS41IHN1cHBvcnRzIERDIGlucHV0IG1vZGUgKGUuZy4gZm9yIHVzZSB3aXRoIGFuYWxvZyBzZW5zb3JzKQorICogdGhyb3VnaCB0aGUgbWljcm9waG9uZSBqYWNrLgorICogV2hlbiB0aGUgdXNlciBlbmFibGVzIHRoaXMgdGhyb3VnaCBhIG1peGVyIHN3aXRjaCwgYm90aCBpbnRlcm5hbCBhbmQKKyAqIGV4dGVybmFsIG1pY3JvcGhvbmVzIGFyZSBkaXNhYmxlZC4gR2FpbiBpcyBmaXhlZCBhdCAwZEIuIEluIHRoaXMgbW9kZSwKKyAqIHdlIGFsc28gYWxsb3cgdGhlIGJpYXMgdG8gYmUgY29uZmlndXJlZCB0aHJvdWdoIGEgc2VwYXJhdGUgbWl4ZXIKKyAqIGNvbnRyb2wuICovCisKKyNkZWZpbmUgdXBkYXRlX21pY19waW4oY29kZWMsIG5pZCwgdmFsKQkJCQkJXAorCXNuZF9oZGFfY29kZWNfdXBkYXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCQkJXAorCQkJCSAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgdmFsKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggb2xwY194b19kY19iaWFzID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiT2ZmIiwgUElOX0lOIH0sCisJCXsgIjUwJSIsIFBJTl9WUkVGNTAgfSwKKwkJeyAiODAlIiwgUElOX1ZSRUY4MCB9LAorCX0sCit9OworCitzdGF0aWMgdm9pZCBvbHBjX3hvX3VwZGF0ZV9taWNfYm9vc3Qoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgY2gsIHZhbDsKKworCWZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKwkJdmFsID0gQUNfQU1QX1NFVF9PVVRQVVQgfAorCQkJKGNoID8gQUNfQU1QX1NFVF9SSUdIVCA6IEFDX0FNUF9TRVRfTEVGVCk7CisJCWlmICghc3BlYy0+ZGNfZW5hYmxlKQorCQkJdmFsIHw9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MTcsIGNoLCBIREFfT1VUUFVULCAwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNywgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9scGNfeG9fdXBkYXRlX21pY19waW5zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGN1cl9pbnB1dCwgdmFsOworCXN0cnVjdCBuaWRfcGF0aCAqcGF0aDsKKworCWN1cl9pbnB1dCA9IHNwZWMtPmdlbi5pbnB1dF9wYXRoc1swXVtzcGVjLT5nZW4uY3VyX211eFswXV07CisKKwkvKiBTZXQgdXAgbWljIHBpbnMgZm9yIHBvcnQtQiwgQyBhbmQgRiBkeW5hbWljYWxseSBhcyB0aGUgcmVjb3JkaW5nCisJICogTEVEIGlzIHR1cm5lZCBvbi9vZmYgYnkgdGhlc2UgcGluIGNvbnRyb2xzCisJICovCisJaWYgKCFzcGVjLT5kY19lbmFibGUpIHsKKwkJLyogZGlzYWJsZSBEQyBiaWFzIHBhdGggYW5kIHBpbiBmb3IgcG9ydCBGICovCisJCXVwZGF0ZV9taWNfcGluKGNvZGVjLCAweDFlLCAwKTsKKwkJc25kX2hkYV9hY3RpdmF0ZV9wYXRoKGNvZGVjLCBzcGVjLT5kY19tb2RlX3BhdGgsIGZhbHNlLCBmYWxzZSk7CisKKwkJLyogdXBkYXRlIHBvcnQgQiAoZXh0IG1pYykgYW5kIEMgKGludCBtaWMpICovCisJCS8qIE9MUEMgZGVmZXJzIG1pYyB3aWRnZXQgY29udHJvbCB1bnRpbCB3aGVuIGNhcHR1cmUgaXMKKwkJICogc3RhcnRlZCBiZWNhdXNlIHRoZSBtaWNyb3Bob25lIExFRCBjb21lcyBvbiBhcyBzb29uIGFzCisJCSAqIHRoZXNlIHNldHRpbmdzIGFyZSBwdXQgaW4gcGxhY2UuIGlmIHdlIGRpZCB0aGlzIGJlZm9yZQorCQkgKiByZWNvcmRpbmcsIGl0IHdvdWxkIGdpdmUgdGhlIGZhbHNlIGluZGljYXRpb24gdGhhdAorCQkgKiByZWNvcmRpbmcgaXMgaGFwcGVuaW5nIHdoZW4gaXQgaXMgbm90LgorCQkgKi8KKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWEsIHNwZWMtPnJlY29yZGluZyA/CisJCQkgICAgICAgc25kX2hkYV9jb2RlY19nZXRfcGluX3RhcmdldChjb2RlYywgMHgxYSkgOiAwKTsKKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWIsIHNwZWMtPnJlY29yZGluZyA/CisJCQkgICAgICAgc25kX2hkYV9jb2RlY19nZXRfcGluX3RhcmdldChjb2RlYywgMHgxYikgOiAwKTsKKwkJLyogZW5hYmxlIG5vcm1hbCBtaWMgcGF0aCAqLworCQlwYXRoID0gc25kX2hkYV9nZXRfcGF0aF9mcm9tX2lkeChjb2RlYywgY3VyX2lucHV0KTsKKwkJaWYgKHBhdGgpCisJCQlzbmRfaGRhX2FjdGl2YXRlX3BhdGgoY29kZWMsIHBhdGgsIHRydWUsIGZhbHNlKTsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIG5vcm1hbCBtaWMgcGF0aCAqLworCQlwYXRoID0gc25kX2hkYV9nZXRfcGF0aF9mcm9tX2lkeChjb2RlYywgY3VyX2lucHV0KTsKKwkJaWYgKHBhdGgpCisJCQlzbmRfaGRhX2FjdGl2YXRlX3BhdGgoY29kZWMsIHBhdGgsIGZhbHNlLCBmYWxzZSk7CisKKwkJLyogRXZlbiB0aG91Z2ggcG9ydCBGIGlzIHRoZSBEQyBpbnB1dCwgdGhlIGJpYXMgaXMgY29udHJvbGxlZAorCQkgKiBvbiBwb3J0IEIuICBXZSBhbHNvIGxlYXZlIHRoYXQgcG9ydCBhcyBhbiBhY3RpdmUgaW5wdXQgKGJ1dAorCQkgKiB1bnNlbGVjdGVkKSBpbiBEQyBtb2RlIGp1c3QgaW4gY2FzZSB0aGF0IGlzIG5lY2Vzc2FyeSB0bworCQkgKiBtYWtlIHRoZSBiaWFzIHNldHRpbmcgdGFrZSBlZmZlY3QuCisJCSAqLworCQlpZiAoc3BlYy0+cmVjb3JkaW5nKQorCQkJdmFsID0gb2xwY194b19kY19iaWFzLml0ZW1zW3NwZWMtPmRjX2lucHV0X2JpYXNdLmluZGV4OworCQllbHNlCisJCQl2YWwgPSAwOworCQl1cGRhdGVfbWljX3Bpbihjb2RlYywgMHgxYSwgdmFsKTsKKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWIsIDApOworCQkvKiBlbmFibGUgREMgYmlhcyBwYXRoIGFuZCBwaW4gKi8KKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWUsIHNwZWMtPnJlY29yZGluZyA/IFBJTl9JTiA6IDApOworCQlzbmRfaGRhX2FjdGl2YXRlX3BhdGgoY29kZWMsIHNwZWMtPmRjX21vZGVfcGF0aCwgdHJ1ZSwgZmFsc2UpOworCX0KK30KKworLyogbWljX2F1dG9zd2l0Y2ggaG9vayAqLworc3RhdGljIHZvaWQgb2xwY194b19hdXRvbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2phY2tfdGJsICpqYWNrKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHNhdmVkX2NhY2hlZF93cml0ZSA9IGNvZGVjLT5jYWNoZWRfd3JpdGU7CisKKwljb2RlYy0+Y2FjaGVkX3dyaXRlID0gMTsKKwkvKiBpbiBEQyBtb2RlLCB3ZSBkb24ndCBoYW5kbGUgYXV0b21pYyAqLworCWlmICghc3BlYy0+ZGNfZW5hYmxlKQorCQlzbmRfaGRhX2dlbl9taWNfYXV0b3N3aXRjaChjb2RlYywgamFjayk7CisJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCXNuZF9oZGFfY29kZWNfZmx1c2hfY2FjaGUoY29kZWMpOworCWNvZGVjLT5jYWNoZWRfd3JpdGUgPSBzYXZlZF9jYWNoZWRfd3JpdGU7CisJaWYgKHNwZWMtPmRjX2VuYWJsZSkKKwkJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKK30KKworLyogcGNtX2NhcHR1cmUgaG9vayAqLworc3RhdGljIHZvaWQgb2xwY194b19jYXB0dXJlX2hvb2soc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwkvKiB0b2dnbGUgc3BlYy0+cmVjb3JkaW5nIGZsYWcgYW5kIHVwZGF0ZSBtaWMgcGlucyBhY2NvcmRpbmdseQorCSAqIGZvciB0dXJuaW5nIG9uL29mZiBMRUQKKwkgKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSERBX0dFTl9QQ01fQUNUX1BSRVBBUkU6CisJCXNwZWMtPnJlY29yZGluZyA9IDE7CisJCW9scGNfeG9fdXBkYXRlX21pY19waW5zKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBIREFfR0VOX1BDTV9BQ1RfQ0xFQU5VUDoKKwkJc3BlYy0+cmVjb3JkaW5nID0gMDsKKwkJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb2xwY194b19kY19tb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc3BlYy0+ZGNfZW5hYmxlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9scGNfeG9fZGNfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZGNfZW5hYmxlID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChkY19lbmFibGUgPT0gc3BlYy0+ZGNfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCXNwZWMtPmRjX2VuYWJsZSA9IGRjX2VuYWJsZTsKKwlvbHBjX3hvX3VwZGF0ZV9taWNfcGlucyhjb2RlYyk7CisJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvbHBjX3hvX2RjX2JpYXNfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmRjX2lucHV0X2JpYXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2xwY194b19kY19iaWFzX2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oJm9scGNfeG9fZGNfYmlhcywgdWluZm8pOworfQorCitzdGF0aWMgaW50IG9scGNfeG9fZGNfYmlhc19lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZvbHBjX3hvX2RjX2JpYXM7CisJdW5zaWduZWQgaW50IGlkeDsKKworCWlkeCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKGlkeCA+PSBpbXV4LT5udW1faXRlbXMpCisJCWlkeCA9IGltdXgtPm51bV9pdGVtcyAtIDE7CisJaWYgKHNwZWMtPmRjX2lucHV0X2JpYXMgPT0gaWR4KQorCQlyZXR1cm4gMDsKKworCXNwZWMtPmRjX2lucHV0X2JpYXMgPSBpZHg7CisJaWYgKHNwZWMtPmRjX2VuYWJsZSkKKwkJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb2xwY194b19taXhlcnNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQyBNb2RlIEVuYWJsZSBTd2l0Y2giLAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBvbHBjX3hvX2RjX21vZGVfZ2V0LAorCQkucHV0ID0gb2xwY194b19kY19tb2RlX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkRDIElucHV0IEJpYXMgRW51bSIsCisJCS5pbmZvID0gb2xwY194b19kY19iaWFzX2VudW1faW5mbywKKwkJLmdldCA9IG9scGNfeG9fZGNfYmlhc19lbnVtX2dldCwKKwkJLnB1dCA9IG9scGNfeG9fZGNfYmlhc19lbnVtX3B1dCwKKwl9LAorCXt9Cit9OworCisvKiBvdmVycmlkaW5nIG1pYyBib29zdCBwdXQgY2FsbGJhY2s7IHVwZGF0ZSBtaWMgYm9vc3Qgdm9sdW1lIG9ubHkgd2hlbgorICogREMgbW9kZSBpcyBkaXNhYmxlZAorICovCitzdGF0aWMgaW50IG9scGNfeG9fbWljX2Jvb3N0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgcmV0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wpOworCWlmIChyZXQgPiAwICYmIHNwZWMtPmRjX2VuYWJsZSkKKwkJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjeHRfZml4dXBfb2xwY194byhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgY29uc3Qgc3RydWN0IGhkYV9maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJPQkUpCisJCXJldHVybjsKKworCXNwZWMtPmdlbi5taWNfYXV0b3N3aXRjaF9ob29rID0gb2xwY194b19hdXRvbWljOworCXNwZWMtPmdlbi5wY21fY2FwdHVyZV9ob29rID0gb2xwY194b19jYXB0dXJlX2hvb2s7CisJc3BlYy0+ZGNfbW9kZV9wYXRoID0gc25kX2hkYV9hZGRfbmV3X3BhdGgoY29kZWMsIDB4MWUsIDB4MTQsIDApOworCisJc25kX2hkYV9hZGRfbmV3X2N0bHMoY29kZWMsIG9scGNfeG9fbWl4ZXJzKTsKKworCS8qIE9MUEMncyBtaWNyb3Bob25lIHBvcnQgaXMgREMgY291cGxlZCBmb3IgdXNlIHdpdGggZXh0ZXJuYWwgc2Vuc29ycywKKwkgKiB0aGVyZWZvcmUgd2UgdXNlIGEgNTAlIG1pYyBiaWFzIGluIG9yZGVyIHRvIGNlbnRlciB0aGUgaW5wdXQgc2lnbmFsCisJICogd2l0aCB0aGUgREMgaW5wdXQgcmFuZ2Ugb2YgdGhlIGNvZGVjLgorCSAqLworCXNuZF9oZGFfY29kZWNfc2V0X3Bpbl90YXJnZXQoY29kZWMsIDB4MWEsIFBJTl9WUkVGNTApOworCisJLyogb3ZlcnJpZGUgbWljIGJvb3N0IGNvbnRyb2wgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+Z2VuLmtjdGxzLnVzZWQ7IGkrKykgeworCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bCA9CisJCQlzbmRfYXJyYXlfZWxlbSgmc3BlYy0+Z2VuLmtjdGxzLCBpKTsKKwkJaWYgKCFzdHJjbXAoa2N0bC0+bmFtZSwgIk1pYyBCb29zdCBWb2x1bWUiKSkgeworCQkJa2N0bC0+cHV0ID0gb2xwY194b19taWNfYm9vc3RfcHV0OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBGaXggbWF4IGlucHV0IGxldmVsIG9uIG1peGVyIHdpZGdldCB0byAwZEIKKyAqIChvcmlnaW5hbGx5IGl0IGhhcyAweDJiIHN0ZXBzIHdpdGggMGRCIG9mZnNldCAweDE0KQorICovCitzdGF0aWMgdm9pZCBjeHRfZml4dXBfY2FwX21peF9hbXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc25kX2hkYV9vdmVycmlkZV9hbXBfY2Fwcyhjb2RlYywgMHgxNywgSERBX0lOUFVULAorCQkJCSAgKDB4MTQgPDwgQUNfQU1QQ0FQX09GRlNFVF9TSElGVCkgfAorCQkJCSAgKDB4MTQgPDwgQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVCkgfAorCQkJCSAgKDB4MDUgPDwgQUNfQU1QQ0FQX1NURVBfU0laRV9TSElGVCkgfAorCQkJCSAgKDEgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKTsKK30KKworLyoKKyAqIEZpeCBtYXggaW5wdXQgbGV2ZWwgb24gbWl4ZXIgd2lkZ2V0IHRvIDBkQgorICogKG9yaWdpbmFsbHkgaXQgaGFzIDB4MWUgc3RlcHMgd2l0aCAwIGRCIG9mZnNldCAweDE3KQorICovCitzdGF0aWMgdm9pZCBjeHRfZml4dXBfY2FwX21peF9hbXBfNTA0NyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDEwLCBIREFfSU5QVVQsCisJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfT0ZGU0VUX1NISUZUKSB8CisJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUKSB8CisJCQkJICAoMHgwNSA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8CisJCQkJICAoMSA8PCBBQ19BTVBDQVBfTVVURV9TSElGVCkpOworfQogCiAvKiBUaGlua1BhZCBYMjAwICYgY28gd2l0aCBjeHQ1MDUxICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9waW50YmwgY3h0X3BpbmNmZ19sZW5vdm9feDIwMFtdID0gewpAQCAtMzQwMSw2ICszMjczLDY4IEBACiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBoZGFfZml4dXBfdGhpbmtwYWRfYWNwaSwKIAl9LAorCVtDWFRfRklYVVBfT0xQQ19YT10gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBjeHRfZml4dXBfb2xwY194bywKKwl9LAorCVtDWFRfRklYVVBfQ0FQX01JWF9BTVBdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gY3h0X2ZpeHVwX2NhcF9taXhfYW1wLAorCX0sCisJW0NYVF9GSVhVUF9UT1NISUJBX1AxMDVdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsgMHgxMCwgMHg5NjE3MDFmMCB9LCAvKiBzcGVha2VyL2hwICovCisJCQl7IDB4MTIsIDB4MDJhMTkwMWUgfSwgLyogZXh0IG1pYyAqLworCQkJeyAweDE0LCAweDk1YTcwMTEwIH0sIC8qIGludCBtaWMgKi8KKwkJCXt9CisJCX0sCisJfSwKKwlbQ1hUX0ZJWFVQX0hQXzUzMF0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgeworCQkJeyAweDEyLCAweDkwYTYwMTYwIH0sIC8qIGludCBtaWMgKi8KKwkJCXt9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QLAorCX0sCisJW0NYVF9GSVhVUF9DQVBfTUlYX0FNUF81MDQ3XSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGN4dF9maXh1cF9jYXBfbWl4X2FtcF81MDQ3LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0NV9maXh1cHNbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGQ1LCAiSFAgNTMwIiwgQ1hUX0ZJWFVQX0hQXzUzMCksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYzMSwgIlRvc2hpYmEgUDEwNSIsIENYVF9GSVhVUF9UT1NISUJBX1AxMDUpLAorCS8qIEhQLCBQYWNrYXJkIEJlbGwsIEZ1aml0c3UtU2llbWVucyAmIExlbm92byBsYXB0b3BzIGhhdmUKKwkgKiByZWFsbHkgYmFkIHNvdW5kIG92ZXIgMGRCIG9uIE5JRCAweDE3LgorCSAqLworCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTAzYywgIkhQIiwgQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE2MzEsICJQYWNrYXJkIEJlbGwiLCBDWFRfRklYVVBfQ0FQX01JWF9BTVApLAorCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTczNCwgIkZ1aml0c3UiLCBDWFRfRklYVVBfQ0FQX01JWF9BTVApLAorCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTdhYSwgIkxlbm92byIsIENYVF9GSVhVUF9DQVBfTUlYX0FNUCksCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX21vZGVsX2ZpeHVwIGN4dDUwNDVfZml4dXBfbW9kZWxzW10gPSB7CisJeyAuaWQgPSBDWFRfRklYVVBfQ0FQX01JWF9BTVAsIC5uYW1lID0gImNhcC1taXgtYW1wIiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX1RPU0hJQkFfUDEwNSwgLm5hbWUgPSAidG9zaGliYS1wMTA1IiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX0hQXzUzMCwgLm5hbWUgPSAiaHAtNTMwIiB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0N19maXh1cHNbXSA9IHsKKwkvKiBIUCBsYXB0b3BzIGhhdmUgcmVhbGx5IGJhZCBzb3VuZCBvdmVyIDAgZEIgb24gTklEIDB4MTAuCisJICovCisJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDNjLCAiSFAiLCBDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0NyksCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX21vZGVsX2ZpeHVwIGN4dDUwNDdfZml4dXBfbW9kZWxzW10gPSB7CisJeyAuaWQgPSBDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0NywgLm5hbWUgPSAiY2FwLW1peC1hbXAiIH0sCisJe30KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDUxX2ZpeHVwc1tdID0gewpAQCAtMzQwOCwxMCArMzM0MiwxNiBAQAogCXt9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9tb2RlbF9maXh1cCBjeHQ1MDUxX2ZpeHVwX21vZGVsc1tdID0geworCXsgLmlkID0gQ1hUX1BJTkNGR19MRU5PVk9fWDIwMCwgLm5hbWUgPSAibGVub3ZvLXgyMDAiIH0sCisJe30KK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDY2X2ZpeHVwc1tdID0gewogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NDMsICJBY2VyIEFzcGlyZSBPbmUgNTIyIiwgQ1hUX0ZJWFVQX1NURVJFT19ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTRjLCAiQWNlciBBc3BpcmUgMzgzMFRHIiwgQ1hUX0ZJWFVQX0dQSU8xKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzhkLCAiQXN1cyIsIENYVF9GSVhVUF9IRUFEUEhPTkVfTUlDX1BJTiksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDgzMywgIk9MUEMgWE8tMS41IiwgQ1hUX0ZJWFVQX09MUENfWE8pLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJMZW5vdm8gVDQwMCIsIENYVF9QSU5DRkdfTEVOT1ZPX1RQNDEwKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiTGVub3ZvIFQ0MTAiLCBDWFRfUElOQ0ZHX0xFTk9WT19UUDQxMCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjE1ZiwgIkxlbm92byBUNTEwIiwgQ1hUX1BJTkNGR19MRU5PVk9fVFA0MTApLApAQCAtMzQyOCw2ICszMzY4LDE3IEBACiAJe30KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX21vZGVsX2ZpeHVwIGN4dDUwNjZfZml4dXBfbW9kZWxzW10gPSB7CisJeyAuaWQgPSBDWFRfRklYVVBfU1RFUkVPX0RNSUMsIC5uYW1lID0gInN0ZXJlby1kbWljIiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX0dQSU8xLCAubmFtZSA9ICJncGlvMSIgfSwKKwl7IC5pZCA9IENYVF9GSVhVUF9IRUFEUEhPTkVfTUlDX1BJTiwgLm5hbWUgPSAiaGVhZHBob25lLW1pYy1waW4iIH0sCisJeyAuaWQgPSBDWFRfUElOQ0ZHX0xFTk9WT19UUDQxMCwgLm5hbWUgPSAidHA0MTAiIH0sCisJeyAuaWQgPSBDWFRfRklYVVBfVEhJTktQQURfQUNQSSwgLm5hbWUgPSAidGhpbmtwYWQiIH0sCisJeyAuaWQgPSBDWFRfUElOQ0ZHX0xFTU9URV9BMTAwNCwgLm5hbWUgPSAibGVtb3RlLWExMDA0IiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX09MUENfWE8sIC5uYW1lID0gIm9scGMteG8iIH0sCisJe30KK307CisKIC8qIGFkZCAiZmFrZSIgbXV0ZSBhbXAtY2FwcyB0byBEQUNzIG9uIGN4NTA1MSBzbyB0aGF0IG1peGVyIG11dGUgc3dpdGNoZXMKICAqIGNhbiBiZSBjcmVhdGVkIChia28jNDI4MjUpCiAgKi8KQEAgLTM0NDksOCArMzQwMCw3IEBACiAJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWM7CiAJaW50IGVycjsKIAotCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKLQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7CisJY29kZWNfaW5mbyhjb2RlYywgIiVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsIGNvZGVjLT5jaGlwX25hbWUpOwogCiAJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcGVjKQpAQCAtMzQ2NywxOSArMzQxNywyOCBAQAogCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgewogCWNhc2UgMHgxNGYxNTA0NToKIAkJY29kZWMtPnNpbmdsZV9hZGNfYW1wID0gMTsKKwkJc3BlYy0+Z2VuLm1peGVyX25pZCA9IDB4MTc7CisJCXNwZWMtPmdlbi5hZGRfc3RlcmVvX21peF9pbnB1dCA9IDE7CisJCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgY3h0NTA0NV9maXh1cF9tb2RlbHMsCisJCQkJICAgY3h0NTA0NV9maXh1cHMsIGN4dF9maXh1cHMpOwogCQlicmVhazsKIAljYXNlIDB4MTRmMTUwNDc6CiAJCWNvZGVjLT5waW5fYW1wX3dvcmthcm91bmQgPSAxOwogCQlzcGVjLT5nZW4ubWl4ZXJfbmlkID0gMHgxOTsKKwkJc3BlYy0+Z2VuLmFkZF9zdGVyZW9fbWl4X2lucHV0ID0gMTsKKwkJc25kX2hkYV9waWNrX2ZpeHVwKGNvZGVjLCBjeHQ1MDQ3X2ZpeHVwX21vZGVscywKKwkJCQkgICBjeHQ1MDQ3X2ZpeHVwcywgY3h0X2ZpeHVwcyk7CiAJCWJyZWFrOwogCWNhc2UgMHgxNGYxNTA1MToKIAkJYWRkX2N4NTA1MV9mYWtlX211dGVzKGNvZGVjKTsKIAkJY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCA9IDE7Ci0JCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgTlVMTCwgY3h0NTA1MV9maXh1cHMsIGN4dF9maXh1cHMpOworCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIGN4dDUwNTFfZml4dXBfbW9kZWxzLAorCQkJCSAgIGN4dDUwNTFfZml4dXBzLCBjeHRfZml4dXBzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCA9IDE7Ci0JCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgTlVMTCwgY3h0NTA2Nl9maXh1cHMsIGN4dF9maXh1cHMpOworCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIGN4dDUwNjZfZml4dXBfbW9kZWxzLAorCQkJCSAgIGN4dDUwNjZfZml4dXBzLCBjeHRfZml4dXBzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0zNTEzLDcgKzM0NzIsNyBAQAogCSAqIEJldHRlciB0byBtYWtlIHJlc2V0LCB0aGVuLgogCSAqLwogCWlmICghY29kZWMtPmJ1cy0+c3luY193cml0ZSkgewotCQlzbmRfcHJpbnRkKCJoZGFfY29kZWM6ICIKKwkJY29kZWNfaW5mbyhjb2RlYywKIAkJCSAgICJFbmFibGUgc3luY193cml0ZSBmb3Igc3RhYmxlIGNvbW11bmljYXRpb25cbiIpOwogCQljb2RlYy0+YnVzLT5zeW5jX3dyaXRlID0gMTsKIAkJY29kZWMtPmJ1cy0+YWxsb3dfYnVzX3Jlc2V0ID0gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggNWVmOTUwMy4uMGNiNWI4OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAloZGFfbmlkX3QgcGluX25pZDsKIAlpbnQgbnVtX211eF9uaWRzOwogCWhkYV9uaWRfdCBtdXhfbmlkc1tIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwlpbnQgbXV4X2lkeDsKIAloZGFfbmlkX3QgY3Z0X25pZDsKIAogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwpAQCAtMzUzLDQwICszNTQsNDMgQEAKICNkZWZpbmUgZ2V0X3BjbV9yZWMoc3BlYywgaWR4KSBcCiAJKChzdHJ1Y3QgaGRhX3BjbSAqKXNuZF9hcnJheV9lbGVtKCZzcGVjLT5wY21fcmVjLCBpZHgpKQogCi1zdGF0aWMgaW50IHBpbl9uaWRfdG9fcGluX2luZGV4KHN0cnVjdCBoZG1pX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW5fbmlkKQorc3RhdGljIGludCBwaW5fbmlkX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbl9uaWQpCiB7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBwaW5faWR4OwogCiAJZm9yIChwaW5faWR4ID0gMDsgcGluX2lkeCA8IHNwZWMtPm51bV9waW5zOyBwaW5faWR4KyspCiAJCWlmIChnZXRfcGluKHNwZWMsIHBpbl9pZHgpLT5waW5fbmlkID09IHBpbl9uaWQpCiAJCQlyZXR1cm4gcGluX2lkeDsKIAotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRE1JOiBwaW4gbmlkICVkIG5vdCByZWdpc3RlcmVkXG4iLCBwaW5fbmlkKTsKKwljb2RlY193YXJuKGNvZGVjLCAiSERNSTogcGluIG5pZCAlZCBub3QgcmVnaXN0ZXJlZFxuIiwgcGluX25pZCk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgaGluZm9fdG9fcGluX2luZGV4KHN0cnVjdCBoZG1pX3NwZWMgKnNwZWMsCitzdGF0aWMgaW50IGhpbmZvX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCSAgICAgIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8pCiB7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBwaW5faWR4OwogCiAJZm9yIChwaW5faWR4ID0gMDsgcGluX2lkeCA8IHNwZWMtPm51bV9waW5zOyBwaW5faWR4KyspCiAJCWlmIChnZXRfcGNtX3JlYyhzcGVjLCBwaW5faWR4KS0+c3RyZWFtID09IGhpbmZvKQogCQkJcmV0dXJuIHBpbl9pZHg7CiAKLQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogaGluZm8gJXAgbm90IHJlZ2lzdGVyZWRcbiIsIGhpbmZvKTsKKwljb2RlY193YXJuKGNvZGVjLCAiSERNSTogaGluZm8gJXAgbm90IHJlZ2lzdGVyZWRcbiIsIGhpbmZvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBjdnRfbmlkX3RvX2N2dF9pbmRleChzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgY3Z0X25pZCkKK3N0YXRpYyBpbnQgY3Z0X25pZF90b19jdnRfaW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBjdnRfbmlkKQogeworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgY3Z0X2lkeDsKIAogCWZvciAoY3Z0X2lkeCA9IDA7IGN2dF9pZHggPCBzcGVjLT5udW1fY3Z0czsgY3Z0X2lkeCsrKQogCQlpZiAoZ2V0X2N2dChzcGVjLCBjdnRfaWR4KS0+Y3Z0X25pZCA9PSBjdnRfbmlkKQogCQkJcmV0dXJuIGN2dF9pZHg7CiAKLQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogY3Z0IG5pZCAlZCBub3QgcmVnaXN0ZXJlZFxuIiwgY3Z0X25pZCk7CisJY29kZWNfd2Fybihjb2RlYywgIkhETUk6IGN2dCBuaWQgJWQgbm90IHJlZ2lzdGVyZWRcbiIsIGN2dF9uaWQpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC03MDYsNyArNzEwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJY2hhbm5lbCA9IHNwZWMtPm9wcy5waW5fZ2V0X3Nsb3RfY2hhbm5lbChjb2RlYywgcGluX25pZCwgaSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJIRE1JOiBBU1AgY2hhbm5lbCAlZCA9PiBzbG90ICVkXG4iLAorCQljb2RlY19kYmcoY29kZWMsICJIRE1JOiBBU1AgY2hhbm5lbCAlZCA9PiBzbG90ICVkXG4iLAogCQkJCQkJY2hhbm5lbCwgaSk7CiAJfQogI2VuZGlmCkBAIC03NTUsOCArNzU5LDcgQEAKIAkJaW50IGNoYW5uZWwgPSAoc2xvdHNldHVwICYgMHhmMCkgPj4gNDsKIAkJZXJyID0gc3BlYy0+b3BzLnBpbl9zZXRfc2xvdF9jaGFubmVsKGNvZGVjLCBwaW5fbmlkLCBoZG1pX3Nsb3QsIGNoYW5uZWwpOwogCQlpZiAoZXJyKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX05PVElDRQotCQkJCSAgICAiSERNSTogY2hhbm5lbCBtYXBwaW5nIGZhaWxlZFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJIRE1JOiBjaGFubmVsIG1hcHBpbmcgZmFpbGVkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTY3LDEyICs5NzAsMTIgQEAKIAlpbnQgc2l6ZTsKIAogCXNpemUgPSBzbmRfaGRtaV9nZXRfZWxkX3NpemUoY29kZWMsIHBpbl9uaWQpOwotCXByaW50ayhLRVJOX0RFQlVHICJIRE1JOiBFTEQgYnVmIHNpemUgaXMgJWRcbiIsIHNpemUpOworCWNvZGVjX2RiZyhjb2RlYywgIkhETUk6IEVMRCBidWYgc2l6ZSBpcyAlZFxuIiwgc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCXNpemUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBpbl9uaWQsIDAsCiAJCQkJCQlBQ19WRVJCX0dFVF9IRE1JX0RJUF9TSVpFLCBpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkhETUk6IERJUCBHUFslZF0gYnVmIHNpemUgaXMgJWRcbiIsIGksIHNpemUpOworCQljb2RlY19kYmcoY29kZWMsICJIRE1JOiBESVAgR1BbJWRdIGJ1ZiBzaXplIGlzICVkXG4iLCBpLCBzaXplKTsKIAl9CiAjZW5kaWYKIH0KQEAgLTk5NCwxMiArOTk3LDEyIEBACiAJCQloZG1pX3dyaXRlX2RpcF9ieXRlKGNvZGVjLCBwaW5fbmlkLCAweDApOwogCQkJaGRtaV9nZXRfZGlwX2luZGV4KGNvZGVjLCBwaW5fbmlkLCAmcGksICZiaSk7CiAJCQlpZiAocGkgIT0gaSkKLQkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiZGlwIGluZGV4ICVkOiAlZCAhPSAlZFxuIiwKKwkJCQljb2RlY19kYmcoY29kZWMsICJkaXAgaW5kZXggJWQ6ICVkICE9ICVkXG4iLAogCQkJCQkJYmksIHBpLCBpKTsKIAkJCWlmIChiaSA9PSAwKSAvKiBieXRlIGluZGV4IHdyYXBwZWQgYXJvdW5kICovCiAJCQkJYnJlYWs7CiAJCX0KLQkJc25kX3ByaW50ZChLRVJOX0lORk8KKwkJY29kZWNfZGJnKGNvZGVjLAogCQkJIkhETUk6IERJUCBHUFslZF0gYnVmIHJlcG9ydGVkIHNpemU9JWQsIHdyaXR0ZW49JWRcbiIsCiAJCQlpLCBzaXplLCBqKTsKIAl9CkBAIC0xMDYyLDYgKzEwNjUsNyBAQAogewogCXVuaW9uIGF1ZGlvX2luZm9mcmFtZSBhaTsKIAorCW1lbXNldCgmYWksIDAsIHNpemVvZihhaSkpOwogCWlmIChjb25uX3R5cGUgPT0gMCkgeyAvKiBIRE1JICovCiAJCXN0cnVjdCBoZG1pX2F1ZGlvX2luZm9mcmFtZSAqaGRtaV9haSA9ICZhaS5oZG1pOwogCkBAIC0xMDgwLDcgKzEwODQsNyBAQAogCQlkcF9haS0+Q0MwMl9DVDQ3CT0gYWN0aXZlX2NoYW5uZWxzIC0gMTsKIAkJZHBfYWktPkNBCQk9IGNhOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGQoIkhETUk6IHVua25vd24gY29ubmVjdGlvbiB0eXBlIGF0IHBpbiAlZFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogdW5rbm93biBjb25uZWN0aW9uIHR5cGUgYXQgcGluICVkXG4iLAogCQkJICAgIHBpbl9uaWQpOwogCQlyZXR1cm47CiAJfQpAQCAtMTA5Miw4ICsxMDk2LDggQEAKIAkgKi8KIAlpZiAoIWhkbWlfaW5mb2ZyYW1lX3VwdG9kYXRlKGNvZGVjLCBwaW5fbmlkLCBhaS5ieXRlcywKIAkJCQkJc2l6ZW9mKGFpKSkpIHsKLQkJc25kX3ByaW50ZGQoImhkbWlfcGluX3NldHVwX2luZm9mcmFtZTogIgotCQkJICAgICJwaW49JWQgY2hhbm5lbHM9JWQgY2E9MHglMDJ4XG4iLAorCQljb2RlY19kYmcoY29kZWMsCisJCQkgICJoZG1pX3Bpbl9zZXR1cF9pbmZvZnJhbWU6IHBpbj0lZCBjaGFubmVscz0lZCBjYT0weCUwMnhcbiIsCiAJCQkgICAgcGluX25pZCwKIAkJCSAgICBhY3RpdmVfY2hhbm5lbHMsIGNhKTsKIAkJaGRtaV9zdG9wX2luZm9mcmFtZV90cmFucyhjb2RlYywgcGluX25pZCk7CkBAIC0xMTYxLDcgKzExNjUsNyBAQAogc3RhdGljIHZvaWQgamFja19jYWxsYmFjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9qYWNrX3RibCAqamFjaykKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IHBpbl9pZHggPSBwaW5fbmlkX3RvX3Bpbl9pbmRleChzcGVjLCBqYWNrLT5uaWQpOworCWludCBwaW5faWR4ID0gcGluX25pZF90b19waW5faW5kZXgoY29kZWMsIGphY2stPm5pZCk7CiAJaWYgKHBpbl9pZHggPCAwKQogCQlyZXR1cm47CiAKQEAgLTExODAsNyArMTE4NCw3IEBACiAJCXJldHVybjsKIAlqYWNrLT5qYWNrX2RpcnR5ID0gMTsKIAotCV9zbmRfcHJpbnRkKFNORF9QUl9WRVJCT1NFLAorCWNvZGVjX2RiZyhjb2RlYywKIAkJIkhETUkgaG90IHBsdWcgZXZlbnQ6IENvZGVjPSVkIFBpbj0lZCBEZXZpY2U9JWQgSW5hY3RpdmU9JWQgUHJlc2VuY2VfRGV0ZWN0PSVkIEVMRF9WYWxpZD0lZFxuIiwKIAkJY29kZWMtPmFkZHIsIGphY2stPm5pZCwgZGV2X2VudHJ5LCAhIShyZXMgJiBBQ19VTlNPTF9SRVNfSUEpLAogCQkhIShyZXMgJiBBQ19VTlNPTF9SRVNfUEQpLCAhIShyZXMgJiBBQ19VTlNPTF9SRVNfRUxEVikpOwpAQCAtMTE5NSw3ICsxMTk5LDcgQEAKIAlpbnQgY3Bfc3RhdGUgPSAhIShyZXMgJiBBQ19VTlNPTF9SRVNfQ1BfU1RBVEUpOwogCWludCBjcF9yZWFkeSA9ICEhKHJlcyAmIEFDX1VOU09MX1JFU19DUF9SRUFEWSk7CiAKLQlwcmludGsoS0VSTl9JTkZPCisJY29kZWNfaW5mbyhjb2RlYywKIAkJIkhETUkgQ1AgZXZlbnQ6IENPREVDPSVkIFRBRz0lZCBTVUJUQUc9MHgleCBDUF9TVEFURT0lZCBDUF9SRUFEWT0lZFxuIiwKIAkJY29kZWMtPmFkZHIsCiAJCXRhZywKQEAgLTEyMTcsNyArMTIyMSw3IEBACiAJaW50IHN1YnRhZyA9IChyZXMgJiBBQ19VTlNPTF9SRVNfU1VCVEFHKSA+PiBBQ19VTlNPTF9SRVNfU1VCVEFHX1NISUZUOwogCiAJaWYgKCFzbmRfaGRhX2phY2tfdGJsX2dldF9mcm9tX3RhZyhjb2RlYywgdGFnKSkgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiVW5leHBlY3RlZCBIRE1JIGV2ZW50IHRhZyAweCV4XG4iLCB0YWcpOworCQljb2RlY19kYmcoY29kZWMsICJVbmV4cGVjdGVkIEhETUkgZXZlbnQgdGFnIDB4JXhcbiIsIHRhZyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyNDQsNyArMTI0OCw3IEBACiAJCW1zbGVlcCg0MCk7CiAJCXB3ciA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9QT1dFUl9TVEFURSwgMCk7CiAJCXB3ciA9IChwd3IgJiBBQ19QV1JTVF9BQ1RVQUwpID4+IEFDX1BXUlNUX0FDVFVBTF9TSElGVDsKLQkJc25kX3ByaW50ZCgiSGFzd2VsbCBIRE1JIGF1ZGlvOiBQb3dlciBmb3IgcGluIDB4JXggaXMgbm93IEQlZFxuIiwgbmlkLCBwd3IpOworCQljb2RlY19kYmcoY29kZWMsICJIYXN3ZWxsIEhETUkgYXVkaW86IFBvd2VyIGZvciBwaW4gMHgleCBpcyBub3cgRCVkXG4iLCBuaWQsIHB3cik7CiAJfQogfQogCkBAIC0xMjc0LDggKzEyNzgsOCBAQAogCQllbHNlCiAJCQluZXdfcGluY3RsIHw9IEFDX1BJTkNUTF9FUFRfTkFUSVZFOwogCi0JCXNuZF9wcmludGRkKCJoZG1pX3Bpbl9oYnJfc2V0dXA6ICIKLQkJCSAgICAiTklEPTB4JXgsICVzcGluY3RsPTB4JXhcbiIsCisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgImhkbWlfcGluX2hicl9zZXR1cDogTklEPTB4JXgsICVzcGluY3RsPTB4JXhcbiIsCiAJCQkgICAgcGluX25pZCwKIAkJCSAgICBwaW5jdGwgPT0gbmV3X3BpbmN0bCA/ICIiIDogIm5ldy0iLAogCQkJICAgIG5ld19waW5jdGwpOwpAQCAtMTMwMiw3ICsxMzA2LDcgQEAKIAllcnIgPSBzcGVjLT5vcHMucGluX2hicl9zZXR1cChjb2RlYywgcGluX25pZCwgaXNfaGJyX2Zvcm1hdChmb3JtYXQpKTsKIAogCWlmIChlcnIpIHsKLQkJc25kX3ByaW50ZGQoImhkbWlfc2V0dXBfc3RyZWFtOiBIQlIgaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImhkbWlfc2V0dXBfc3RyZWFtOiBIQlIgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMzQxLDYgKzEzNDUsOCBAQAogCWlmIChjdnRfaWR4ID09IHNwZWMtPm51bV9jdnRzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXBlcl9waW4tPm11eF9pZHggPSBtdXhfaWR4OworCiAJaWYgKGN2dF9pZCkKIAkJKmN2dF9pZCA9IGN2dF9pZHg7CiAJaWYgKG11eF9pZCkKQEAgLTEzNDksNiArMTM1NSwyMiBAQAogCXJldHVybiAwOwogfQogCisvKiBBc3N1cmUgdGhlIHBpbiBzZWxlY3QgdGhlIHJpZ2h0IGNvbnZldG9yICovCitzdGF0aWMgdm9pZCBpbnRlbF92ZXJpZnlfcGluX2N2dF9jb25uZWN0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluKQoreworCWhkYV9uaWRfdCBwaW5fbmlkID0gcGVyX3Bpbi0+cGluX25pZDsKKwlpbnQgbXV4X2lkeCwgY3VycjsKKworCW11eF9pZHggPSBwZXJfcGluLT5tdXhfaWR4OworCWN1cnIgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBpbl9uaWQsIDAsCisJCQkJCSAgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDApOworCWlmIChjdXJyICE9IG11eF9pZHgpCisJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIHBpbl9uaWQsIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKKwkJCQkJICAgIG11eF9pZHgpOworfQorCiAvKiBJbnRlbCBIRE1JIHdvcmthcm91bmQgdG8gZml4IGF1ZGlvIHJvdXRpbmcgaXNzdWU6CiAgKiBGb3Igc29tZSBJbnRlbCBkaXNwbGF5IGNvZGVjcywgcGlucyBzaGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uIGxpc3QuCiAgKiBTbyBhIGNvbnZldGVyIGNhbiBiZSBzZWxlY3RlZCBieSBtdWx0aXBsZSBwaW5zIGFuZCBwbGF5YmFjayBvbiBhbnkgb2YgdGhlc2UKQEAgLTEzODksNyArMTQxMSw4IEBACiAJCWZvciAoY3Z0X2lkeCA9IDA7IGN2dF9pZHggPCBzcGVjLT5udW1fY3Z0czsgY3Z0X2lkeCsrKSB7CiAJCQlwZXJfY3Z0ID0gZ2V0X2N2dChzcGVjLCBjdnRfaWR4KTsKIAkJCWlmICghcGVyX2N2dC0+YXNzaWduZWQpIHsKLQkJCQlzbmRfcHJpbnRkZCgiY2hvb3NlIGN2dCAlZCBmb3IgcGluIG5pZCAlZFxuIiwKKwkJCQljb2RlY19kYmcoY29kZWMsCisJCQkJCSAgImNob29zZSBjdnQgJWQgZm9yIHBpbiBuaWQgJWRcbiIsCiAJCQkJCWN2dF9pZHgsIG5pZCk7CiAJCQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAogCQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCkBAIC0xNDE2LDcgKzE0MzksNyBAQAogCWludCBlcnI7CiAKIAkvKiBWYWxpZGF0ZSBoaW5mbyAqLwotCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoY29kZWMsIGhpbmZvKTsKIAlpZiAoc25kX0JVR19PTihwaW5faWR4IDwgMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCXBlcl9waW4gPSBnZXRfcGluKHNwZWMsIHBpbl9pZHgpOwpAQCAtMTQ4Miw5ICsxNTA1LDggQEAKIAloZGFfbmlkX3QgcGluX25pZCA9IHBlcl9waW4tPnBpbl9uaWQ7CiAKIAlpZiAoIShnZXRfd2NhcHMoY29kZWMsIHBpbl9uaWQpICYgQUNfV0NBUF9DT05OX0xJU1QpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAiSERNSTogcGluICVkIHdjYXBzICUjeCAiCi0JCQkgICAiZG9lcyBub3Qgc3VwcG9ydCBjb25uZWN0aW9uIGxpc3RcbiIsCisJCWNvZGVjX3dhcm4oY29kZWMsCisJCQkgICAiSERNSTogcGluICVkIHdjYXBzICUjeCBkb2VzIG5vdCBzdXBwb3J0IGNvbm5lY3Rpb24gbGlzdFxuIiwKIAkJCSAgIHBpbl9uaWQsIGdldF93Y2Fwcyhjb2RlYywgcGluX25pZCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTI3LDcgKzE1NDksNyBAQAogCWVsc2UKIAkJZWxkLT5lbGRfdmFsaWQgPSBmYWxzZTsKIAotCV9zbmRfcHJpbnRkKFNORF9QUl9WRVJCT1NFLAorCWNvZGVjX2RiZyhjb2RlYywKIAkJIkhETUkgc3RhdHVzOiBDb2RlYz0lZCBQaW49JWQgUHJlc2VuY2VfRGV0ZWN0PSVkIEVMRF9WYWxpZD0lZFxuIiwKIAkJY29kZWMtPmFkZHIsIHBpbl9uaWQsIHBpbl9lbGQtPm1vbml0b3JfcHJlc2VudCwgZWxkLT5lbGRfdmFsaWQpOwogCkBAIC0xNjkwLDcgKzE3MTIsNyBAQAogCiAJbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGNvZGVjLT5hZmcsICZuaWQpOwogCWlmICghbmlkIHx8IG5vZGVzIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogZmFpbGVkIHRvIGdldCBhZmcgc3ViIG5vZGVzXG4iKTsKKwkJY29kZWNfd2Fybihjb2RlYywgIkhETUk6IGZhaWxlZCB0byBnZXQgYWZnIHN1YiBub2Rlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTc0NCwxMiArMTc2NiwyNSBAQAogewogCWhkYV9uaWRfdCBjdnRfbmlkID0gaGluZm8tPm5pZDsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IHBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCWludCBwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KGNvZGVjLCBoaW5mbyk7CiAJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluID0gZ2V0X3BpbihzcGVjLCBwaW5faWR4KTsKIAloZGFfbmlkX3QgcGluX25pZCA9IHBlcl9waW4tPnBpbl9uaWQ7CiAJYm9vbCBub25fcGNtOwogCWludCBwaW5jdGw7CiAKKwlpZiAoaXNfaGFzd2VsbF9wbHVzKGNvZGVjKSB8fCBpc192YWxsZXl2aWV3KGNvZGVjKSkgeworCQkvKiBWZXJpZnkgcGluOmN2dCBzZWxlY3Rpb25zIHRvIGF2b2lkIHNpbGVudCBhdWRpbyBhZnRlciBTMy4KKwkJICogQWZ0ZXIgUzMsIHRoZSBhdWRpbyBkcml2ZXIgcmVzdG9yZXMgcGluOmN2dCBzZWxlY3Rpb25zCisJCSAqIGJ1dCB0aGlzIGNhbiBoYXBwZW4gYmVmb3JlIGdmeCBpcyByZWFkeSBhbmQgc3VjaCBzZWxlY3Rpb24KKwkJICogaXMgb3Zlcmxvb2tlZCBieSBIVy4gVGh1cyBtdWx0aXBsZSBwaW5zIGNhbiBzaGFyZSBhIHNhbWUKKwkJICogZGVmYXVsdCBjb252ZXJ0b3IgYW5kIG11dGUgY29udHJvbCB3aWxsIGFmZmVjdCBlYWNoIG90aGVyLAorCQkgKiB3aGljaCBjYW4gY2F1c2UgYSByZXN1bWVkIGF1ZGlvIHBsYXliYWNrIGJlY29tZSBzaWxlbnQKKwkJICogYWZ0ZXIgUzMuCisJCSAqLworCQlpbnRlbF92ZXJpZnlfcGluX2N2dF9jb25uZWN0KGNvZGVjLCBwZXJfcGluKTsKKwkJaW50ZWxfbm90X3NoYXJlX2Fzc2lnbmVkX2N2dChjb2RlYywgcGluX25pZCwgcGVyX3Bpbi0+bXV4X2lkeCk7CisJfQorCiAJbm9uX3BjbSA9IGNoZWNrX25vbl9wY21fcGVyX2N2dChjb2RlYywgY3Z0X25pZCk7CiAJbXV0ZXhfbG9jaygmcGVyX3Bpbi0+bG9jayk7CiAJcGVyX3Bpbi0+Y2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOwpAQCAtMTc4OCw3ICsxODIzLDcgQEAKIAlpbnQgcGluY3RsOwogCiAJaWYgKGhpbmZvLT5uaWQpIHsKLQkJY3Z0X2lkeCA9IGN2dF9uaWRfdG9fY3Z0X2luZGV4KHNwZWMsIGhpbmZvLT5uaWQpOworCQljdnRfaWR4ID0gY3Z0X25pZF90b19jdnRfaW5kZXgoY29kZWMsIGhpbmZvLT5uaWQpOwogCQlpZiAoc25kX0JVR19PTihjdnRfaWR4IDwgMCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcGVyX2N2dCA9IGdldF9jdnQoc3BlYywgY3Z0X2lkeCk7CkBAIC0xNzk3LDcgKzE4MzIsNyBAQAogCQlwZXJfY3Z0LT5hc3NpZ25lZCA9IDA7CiAJCWhpbmZvLT5uaWQgPSAwOwogCi0JCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCQlwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KGNvZGVjLCBoaW5mbyk7CiAJCWlmIChzbmRfQlVHX09OKHBpbl9pZHggPCAwKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlwZXJfcGluID0gZ2V0X3BpbihzcGVjLCBwaW5faWR4KTsKQEAgLTIyMTEsNyArMjI0Niw3IEBACiAJCXJldHVybjsKIAogCS8qIG92ZXJyaWRlIHBpbnMgY29ubmVjdGlvbiBsaXN0ICovCi0Jc25kX3ByaW50ZGQoImhkbWk6IGhhc3dlbGw6IG92ZXJyaWRlIHBpbiBjb25uZWN0aW9uIDB4JXhcbiIsIG5pZCk7CisJY29kZWNfZGJnKGNvZGVjLCAiaGRtaTogaGFzd2VsbDogb3ZlcnJpZGUgcGluIGNvbm5lY3Rpb24gMHgleFxuIiwgbmlkKTsKIAlzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdChjb2RlYywgbmlkLCBzcGVjLT5udW1fY3Z0cywgc3BlYy0+Y3Z0X25pZHMpOwogfQogCkBAIC0zMTMyLDggKzMxNjcsOCBAQAogCQllbHNlCiAJCQloYnJfY3RsX25ldyA9IGhicl9jdGwgJiB+QVRJX0hCUl9FTkFCTEU7CiAKLQkJc25kX3ByaW50ZGQoImF0aWhkbWlfcGluX2hicl9zZXR1cDogIgotCQkJCSJOSUQ9MHgleCwgJXNoYnItY3RsPTB4JXhcbiIsCisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgImF0aWhkbWlfcGluX2hicl9zZXR1cDogTklEPTB4JXgsICVzaGJyLWN0bD0weCV4XG4iLAogCQkJCXBpbl9uaWQsCiAJCQkJaGJyX2N0bCA9PSBoYnJfY3RsX25ldyA/ICIiIDogIm5ldy0iLAogCQkJCWhicl9jdGxfbmV3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggOGQwYTg0NC4uZWEyMzUxZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTM5NSw2ICszOTUsOCBAQAogCQlnb3RvIGRvX3NrdTsKIAl9CiAKKwlpZiAoIWNvZGVjLT5idXMtPnBjaSkKKwkJcmV0dXJuIC0xOwogCWFzcyA9IGNvZGVjLT5zdWJzeXN0ZW1faWQgJiAweGZmZmY7CiAJaWYgKGFzcyAhPSBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgJiYgKGFzcyAmIDEpKQogCQlnb3RvIGRvX3NrdTsKQEAgLTQwNSw4ICs0MDcsOCBAQAogCWFzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgbmlkKTsKIAogCWlmICghKGFzcyAmIDEpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IFNLVSBub3QgcmVhZHkgMHglMDh4XG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSwgYXNzKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIiVzOiBTS1Ugbm90IHJlYWR5IDB4JTA4eFxuIiwKKwkJCSAgIGNvZGVjLT5jaGlwX25hbWUsIGFzcyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTQzMCwxNyArNDMyLDE3IEBACiAJc3BlYy0+Y2RlZmluZS5zd2FwID0gKGFzcyAmIDB4MikgPj4gMTsKIAlzcGVjLT5jZGVmaW5lLm92ZXJyaWRlID0gYXNzICYgMHgxOwogCi0Jc25kX3ByaW50ZCgiU0tVOiBOaWQ9MHgleCBza3VfY2ZnPTB4JTA4eFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IE5pZD0weCV4IHNrdV9jZmc9MHglMDh4XG4iLAogCQkgICBuaWQsIHNwZWMtPmNkZWZpbmUuc2t1X2NmZyk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBwb3J0X2Nvbm5lY3Rpdml0eT0weCV4XG4iLAorCWNvZGVjX2RiZyhjb2RlYywgIlNLVTogcG9ydF9jb25uZWN0aXZpdHk9MHgleFxuIiwKIAkJICAgc3BlYy0+Y2RlZmluZS5wb3J0X2Nvbm5lY3Rpdml0eSk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBlbmFibGVfcGNiZWVwPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuZW5hYmxlX3BjYmVlcCk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBjaGVja19zdW09MHglMDh4XG4iLCBzcGVjLT5jZGVmaW5lLmNoZWNrX3N1bSk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBjdXN0b21pemF0aW9uPTB4JTA4eFxuIiwgc3BlYy0+Y2RlZmluZS5jdXN0b21pemF0aW9uKTsKLQlzbmRfcHJpbnRkKCJTS1U6IGV4dGVybmFsX2FtcD0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLmV4dGVybmFsX2FtcCk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBwbGF0Zm9ybV90eXBlPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUucGxhdGZvcm1fdHlwZSk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBzd2FwPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuc3dhcCk7Ci0Jc25kX3ByaW50ZCgiU0tVOiBvdmVycmlkZT0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLm92ZXJyaWRlKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGVuYWJsZV9wY2JlZXA9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5lbmFibGVfcGNiZWVwKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGNoZWNrX3N1bT0weCUwOHhcbiIsIHNwZWMtPmNkZWZpbmUuY2hlY2tfc3VtKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGN1c3RvbWl6YXRpb249MHglMDh4XG4iLCBzcGVjLT5jZGVmaW5lLmN1c3RvbWl6YXRpb24pOworCWNvZGVjX2RiZyhjb2RlYywgIlNLVTogZXh0ZXJuYWxfYW1wPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuZXh0ZXJuYWxfYW1wKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IHBsYXRmb3JtX3R5cGU9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5wbGF0Zm9ybV90eXBlKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IHN3YXA9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5zd2FwKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IG92ZXJyaWRlPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUub3ZlcnJpZGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00ODMsNyArNDg1LDggQEAKIAl9CiAKIAlhc3MgPSBjb2RlYy0+c3Vic3lzdGVtX2lkICYgMHhmZmZmOwotCWlmICgoYXNzICE9IGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgJiYgKGFzcyAmIDEpKQorCWlmIChjb2RlYy0+YnVzLT5wY2kgJiYKKwkgICAgYXNzICE9IGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSAmJiAoYXNzICYgMSkpCiAJCWdvdG8gZG9fc2t1OwogCiAJLyogaW52YWxpZCBTU0lELCBjaGVjayB0aGUgc3BlY2lhbCBOSUQgcGluIGRlZmNmZyBpbnN0ZWFkICovCkBAIC00OTksOCArNTAyLDggQEAKIAlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwMjYwKQogCQluaWQgPSAweDE3OwogCWFzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgbmlkKTsKLQlzbmRfcHJpbnRkKCJyZWFsdGVrOiBObyB2YWxpZCBTU0lELCAiCi0JCSAgICJjaGVja2luZyBwaW5jZmcgMHglMDh4IGZvciBOSUQgMHgleFxuIiwKKwljb2RlY19kYmcoY29kZWMsCisJCSAgInJlYWx0ZWs6IE5vIHZhbGlkIFNTSUQsIGNoZWNraW5nIHBpbmNmZyAweCUwOHggZm9yIE5JRCAweCV4XG4iLAogCQkgICBhc3MsIG5pZCk7CiAJaWYgKCEoYXNzICYgMSkpCiAJCXJldHVybiAwOwpAQCAtNTE2LDcgKzUxOSw3IEBACiAJaWYgKCgoYXNzID4+IDE2KSAmIDB4ZikgIT0gdG1wKQogCQlyZXR1cm4gMDsKIGRvX3NrdToKLQlzbmRfcHJpbnRkKCJyZWFsdGVrOiBFbmFibGluZyBpbml0IEFTTV9JRD0weCUwNHggQ09ERUNfSUQ9JTA4eFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJyZWFsdGVrOiBFbmFibGluZyBpbml0IEFTTV9JRD0weCUwNHggQ09ERUNfSUQ9JTA4eFxuIiwKIAkJICAgYXNzICYgMHhmZmZmLCBjb2RlYy0+dmVuZG9yX2lkKTsKIAkvKgogCSAqIDAgOiBvdmVycmlkZQpAQCAtNTc0LDggKzU3Nyw4IEBACiB7CiAJaWYgKCFhbGNfc3Vic3lzdGVtX2lkKGNvZGVjLCBwb3J0cykpIHsKIAkJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JCXNuZF9wcmludGQoInJlYWx0ZWs6ICIKLQkJCSAgICJFbmFibGUgZGVmYXVsdCBzZXR1cCBmb3IgYXV0byBtb2RlIGFzIGZhbGxiYWNrXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLAorCQkJICAicmVhbHRlazogRW5hYmxlIGRlZmF1bHQgc2V0dXAgZm9yIGF1dG8gbW9kZSBhcyBmYWxsYmFja1xuIik7CiAJCXNwZWMtPmluaXRfYW1wID0gQUxDX0lOSVRfREVGQVVMVDsKIAl9CiB9CkBAIC04NDUsMTEgKzg0OCw3IEBACiAJCXNuZF9oZGFfc2h1dHVwX3BpbnMoY29kZWMpOwogfQogCi1zdGF0aWMgdm9pZCBhbGNfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfaGRhX2FwcGx5X2ZpeHVwKGNvZGVjLCBIREFfRklYVVBfQUNUX0ZSRUUpOwotCXNuZF9oZGFfZ2VuX2ZyZWUoY29kZWMpOwotfQorI2RlZmluZSBhbGNfZnJlZQlzbmRfaGRhX2dlbl9mcmVlCiAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyB2b2lkIGFsY19wb3dlcl9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtOTcwLDYgKzk2OSw4IEBACiAJCQlyZXR1cm4gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgcC0+bmFtZSk7CiAJfQogCisJaWYgKCFjb2RlYy0+YnVzLT5wY2kpCisJCXJldHVybiAwOwogCWZvciAocSA9IHJlbmFtZV9wY2lfdGJsOyBxLT5jb2RlY192ZW5kb3JfaWQ7IHErKykgewogCQlpZiAocS0+Y29kZWNfdmVuZG9yX2lkICE9IGNvZGVjLT52ZW5kb3JfaWQpCiAJCQljb250aW51ZTsKQEAgLTk5Myw2ICs5OTQsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYmVlcF93aGl0ZV9saXN0W10gPSB7CiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTAzYywgIkFTVVMiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTVkLCAiQVNVUyIsIDEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyOWYsICJBU1VTIiwgMSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODM3NiwgIkVlZVBDIiwgMSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODNjZSwgIkVlZVBDIiwgMSksCkBAIC0yNzg2LDYgKzI3ODgsMjM3IEBACiAJc25kX2hkYV9zaHV0dXBfcGlucyhjb2RlYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzI4Ml9yZXN0b3JlX2RlZmF1bHRfdmFsdWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IHZhbDsKKworCS8qIFBvd2VyIERvd24gQ29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwMywgMHgwMDAyKTsKKwkvKiBGSUZPIGFuZCBmaWx0ZXIgY2xvY2sgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDUsIDB4MDcwMCk7CisJLyogRE1JQyBjb250cm9sICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA3LCAweDAyMDApOworCS8qIEFuYWxvZyBjbG9jayAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA2KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDYsICh2YWwgJiB+MHgwMGYwKSB8IDB4MCk7CisJLyogSkQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwOCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA4LCAodmFsICYgfjB4ZmZmYykgfCAweDBjMmMpOworCS8qIEpEIG9mZnNldDEgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGEsIDB4Y2NjYyk7CisJLyogSkQgb2Zmc2V0MiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwYiwgMHhjY2NjKTsKKwkvKiBMRE8xLzIvMywgREFDL0FEQyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwZSwgMHg2ZTAwKTsKKwkvKiBKRCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBmKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGYsICh2YWwgJiB+MHhmODAwKSB8IDB4MTAwMCk7CisJLyogQ2FwbGVzcyAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDEwKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MTAsICh2YWwgJiB+MHhmYzAwKSB8IDB4MGMwMCk7CisJLyogQ2xhc3MgRCB0ZXN0IDQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmYsIDB4MCk7CisJLyogSU8gcG93ZXIgZG93biBkaXJlY3RseSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBjKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGMsICh2YWwgJiB+MHhmZTAwKSB8IDB4MCk7CisJLyogQU5DICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM0LCAweGEwYzApOworCS8qIEFHQyBNVVggKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxNik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDE2LCAodmFsICYgfjB4MDAwOCkgfCAweDApOworCS8qIERBQyBzaW1wbGUgY29udGVudCBwcm90ZWN0aW9uICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MWQpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxZCwgKHZhbCAmIH4weDAwZTApIHwgMHgwKTsKKwkvKiBBREMgc2ltcGxlIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFmKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWYsICh2YWwgJiB+MHgwMGUwKSB8IDB4MCk7CisJLyogREFDIEFEQyBaZXJvIERldGVjdGlvbiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgyMSwgMHg4ODA0KTsKKwkvKiBQTEwgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NjMsIDB4MjkwMik7CisJLyogY2FwbGVzcyBjb250cm9sIDIgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NjgsIDB4YTA4MCk7CisJLyogY2FwbGVzcyBjb250cm9sIDMgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NjksIDB4MzQwMCk7CisJLyogY2FwbGVzcyBjb250cm9sIDQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmEsIDB4MmYzZSk7CisJLyogY2FwbGVzcyBjb250cm9sIDUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmIsIDB4MCk7CisJLyogY2xhc3MgRCB0ZXN0IDIgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg2ZCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZkLCAodmFsICYgfjB4MGZmZikgfCAweDA5MDApOworCS8qIGNsYXNzIEQgdGVzdCAzICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZlLCAweDExMGEpOworCS8qIGNsYXNzIEQgdGVzdCA1ICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NzApOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3MCwgKHZhbCAmIH4weDAwZjgpIHwgMHgwMGQ4KTsKKwkvKiBjbGFzcyBEIHRlc3QgNiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3MSwgMHgwMDE0KTsKKwkvKiBjbGFzc0QgT0NQICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDcyLCAweGMyYmEpOworCS8qIGNsYXNzRCBwdXJlIERDIHRlc3QgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg3Nyk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDc3LCAodmFsICYgfjB4MGY4MCkgfCAweDApOworCS8qIENsYXNzIEQgYW1wIGNvbnRyb2wgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NmMsIDB4ZmMwNik7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI4Ml9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWhkYV9uaWRfdCBocF9waW4gPSBzcGVjLT5nZW4uYXV0b2NmZy5ocF9waW5zWzBdOworCWJvb2wgaHBfcGluX3NlbnNlOworCWludCBjb2VmNzg7CisKKwlhbGMyODJfcmVzdG9yZV9kZWZhdWx0X3ZhbHVlKGNvZGVjKTsKKworCWlmICghaHBfcGluKQorCQlyZXR1cm47CisJaHBfcGluX3NlbnNlID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgaHBfcGluKTsKKwljb2VmNzggPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg3OCk7CisKKwkvKiBJbmRleCAweDc4IERpcmVjdCBEcml2ZSBIUCBBTVAgTFBNIENvbnRyb2wgMSAqLworCS8qIEhlYWRwaG9uZSBjYXBsZXNzIHNldCB0byBoaWdoIHBvd2VyIG1vZGUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzgsIDB4OTAwNCk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoMik7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBocF9waW4sIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFKTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCg4NSk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBocF9waW4sIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUKTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCgxMDApOworCisJLyogSGVhZHBob25lIGNhcGxlc3Mgc2V0IHRvIG5vcm1hbCBtb2RlICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDc4LCBjb2VmNzgpOworfQorCitzdGF0aWMgdm9pZCBhbGMyODJfc2h1dHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWhkYV9uaWRfdCBocF9waW4gPSBzcGVjLT5nZW4uYXV0b2NmZy5ocF9waW5zWzBdOworCWJvb2wgaHBfcGluX3NlbnNlOworCWludCBjb2VmNzg7CisKKwlpZiAoIWhwX3BpbikgeworCQlhbGMyNjlfc2h1dHVwKGNvZGVjKTsKKwkJcmV0dXJuOworCX0KKworCWhwX3Bpbl9zZW5zZSA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIGhwX3Bpbik7CisJY29lZjc4ID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NzgpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3OCwgMHg5MDA0KTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCgyKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGhwX3BpbiwgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUpOworCisJaWYgKGhwX3Bpbl9zZW5zZSkKKwkJbXNsZWVwKDg1KTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGhwX3BpbiwgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MCk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoMTAwKTsKKworCWFsY19hdXRvX3NldHVwX2VhcGQoY29kZWMsIGZhbHNlKTsKKwlzbmRfaGRhX3NodXR1cF9waW5zKGNvZGVjKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzgsIGNvZWY3OCk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI4M19yZXN0b3JlX2RlZmF1bHRfdmFsdWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IHZhbDsKKworCS8qIFBvd2VyIERvd24gQ29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwMywgMHgwMDAyKTsKKwkvKiBGSUZPIGFuZCBmaWx0ZXIgY2xvY2sgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDUsIDB4MDcwMCk7CisJLyogRE1JQyBjb250cm9sICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA3LCAweDAyMDApOworCS8qIEFuYWxvZyBjbG9jayAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA2KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDYsICh2YWwgJiB+MHgwMGYwKSB8IDB4MCk7CisJLyogSkQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwOCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA4LCAodmFsICYgfjB4ZmZmYykgfCAweDBjMmMpOworCS8qIEpEIG9mZnNldDEgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGEsIDB4Y2NjYyk7CisJLyogSkQgb2Zmc2V0MiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwYiwgMHhjY2NjKTsKKwkvKiBMRE8xLzIvMywgREFDL0FEQyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwZSwgMHg2ZmMwKTsKKwkvKiBKRCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBmKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGYsICh2YWwgJiB+MHhmODAwKSB8IDB4MTAwMCk7CisJLyogQ2FwbGVzcyAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDEwKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MTAsICh2YWwgJiB+MHhmYzAwKSB8IDB4MGMwMCk7CisJLyogQ2xhc3MgRCB0ZXN0IDQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2EsIDB4MCk7CisJLyogSU8gcG93ZXIgZG93biBkaXJlY3RseSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDBjKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGMsICh2YWwgJiB+MHhmZTAwKSB8IDB4MCk7CisJLyogQU5DICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDIyLCAweGEwYzApOworCS8qIEFHQyBNVVggKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmZXhfaWR4KGNvZGVjLCAweDUzLCAweDAxKTsKKwlhbGNfd3JpdGVfY29lZmV4X2lkeChjb2RlYywgMHg1MywgMHgwMSwgKHZhbCAmIH4weDAwMGYpIHwgMHgwMDA4KTsKKwkvKiBEQUMgc2ltcGxlIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFkKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWQsICh2YWwgJiB+MHgwMGUwKSB8IDB4MCk7CisJLyogQURDIHNpbXBsZSBjb250ZW50IHByb3RlY3Rpb24gKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxZik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFmLCAodmFsICYgfjB4MDBlMCkgfCAweDApOworCS8qIERBQyBBREMgWmVybyBEZXRlY3Rpb24gKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MjEsIDB4ODgwNCk7CisJLyogUExMICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDJlLCAweDI5MDIpOworCS8qIGNhcGxlc3MgY29udHJvbCAyICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDMzLCAweGEwODApOworCS8qIGNhcGxlc3MgY29udHJvbCAzICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM0LCAweDM0MDApOworCS8qIGNhcGxlc3MgY29udHJvbCA0ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM1LCAweDJmM2UpOworCS8qIGNhcGxlc3MgY29udHJvbCA1ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDM2LCAweDApOworCS8qIGNsYXNzIEQgdGVzdCAyICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MzgpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzOCwgKHZhbCAmIH4weDBmZmYpIHwgMHgwOTAwKTsKKwkvKiBjbGFzcyBEIHRlc3QgMyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzOSwgMHgxMTBhKTsKKwkvKiBjbGFzcyBEIHRlc3QgNSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDNiKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2IsICh2YWwgJiB+MHgwMGY4KSB8IDB4MDBkOCk7CisJLyogY2xhc3MgRCB0ZXN0IDYgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2MsIDB4MDAxNCk7CisJLyogY2xhc3NEIE9DUCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzZCwgMHhjMmJhKTsKKwkvKiBjbGFzc0QgcHVyZSBEQyB0ZXN0ICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NDIpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0MiwgKHZhbCAmIH4weDBmODApIHwgMHgwKTsKKwkvKiB0ZXN0IG1vZGUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDksIDB4MCk7CisJLyogQ2xhc3MgRCBEQyBlbmFibGUgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg0MCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQwLCAodmFsICYgfjB4ZjgwMCkgfCAweDk4MDApOworCS8qIERDIG9mZnNldCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDQyKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDIsICh2YWwgJiB+MHhmMDAwKSB8IDB4MjAwMCk7CisJLyogQ2xhc3MgRCBhbXAgY29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzNywgMHhmYzA2KTsKK30KKwogc3RhdGljIHZvaWQgYWxjMjgzX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC0yNzkzLDYgKzMwMjYsOCBAQAogCWJvb2wgaHBfcGluX3NlbnNlOwogCWludCB2YWw7CiAKKwlhbGMyODNfcmVzdG9yZV9kZWZhdWx0X3ZhbHVlKGNvZGVjKTsKKwogCWlmICghaHBfcGluKQogCQlyZXR1cm47CiAJaHBfcGluX3NlbnNlID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgaHBfcGluKTsKQEAgLTMxNjksNyArMzQwNCw4IEBACiAJCXNwZWMtPmdlbi52bWFzdGVyX211dGUuaG9vayA9IGFsYzI2OV9maXh1cF9taWNfbXV0ZV9ob29rOwogCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlX2VudW0gPSAxOwogCQljb2RlYy0+cG93ZXJfZmlsdGVyID0gbGVkX3Bvd2VyX2ZpbHRlcjsKLQkJc25kX3ByaW50ZCgiRGV0ZWN0ZWQgbXV0ZSBMRUQgZm9yICV4OiVkXG4iLCBzcGVjLT5tdXRlX2xlZF9uaWQsCisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgIkRldGVjdGVkIG11dGUgTEVEIGZvciAleDolZFxuIiwgc3BlYy0+bXV0ZV9sZWRfbmlkLAogCQkJICAgc3BlYy0+bXV0ZV9sZWRfcG9sYXJpdHkpOwogCQlicmVhazsKIAl9CkBAIC0zMjk1LDcgKzM1MzEsNyBAQAogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4YjcsIDB4ODAyYik7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byB1bnBsdWdnZWQgbW9kZS5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBzZXQgdG8gdW5wbHVnZ2VkIG1vZGUuXG4iKTsKIH0KIAogCkBAIC0zMzM4LDcgKzM1NzQsNyBAQAogCQlzbmRfaGRhX3NldF9waW5fY3RsX2NhY2hlKGNvZGVjLCBtaWNfcGluLCBQSU5fVlJFRjUwKTsKIAkJYnJlYWs7CiAJfQotCXNuZF9wcmludGRkKCJIZWFkc2V0IGphY2sgc2V0IHRvIG1pYy1pbiBtb2RlLlxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiSGVhZHNldCBqYWNrIHNldCB0byBtaWMtaW4gbW9kZS5cbiIpOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfaGVhZHNldF9tb2RlX2RlZmF1bHQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0zMzY2LDcgKzM2MDIsNyBAQAogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4YjcsIDB4ODAyYik7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byBoZWFkcGhvbmUgKGRlZmF1bHQpIG1vZGUuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgc2V0IHRvIGhlYWRwaG9uZSAoZGVmYXVsdCkgbW9kZS5cbiIpOwogfQogCiAvKiBJcGhvbmUgdHlwZSAqLwpAQCAtMzM5NSw3ICszNjMxLDcgQEAKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGMzLCAweDAwMDApOwogCQlicmVhazsKIAl9Ci0Jc25kX3ByaW50ZGQoIkhlYWRzZXQgamFjayBzZXQgdG8gaVBob25lLXN0eWxlIGhlYWRzZXQgbW9kZS5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBzZXQgdG8gaVBob25lLXN0eWxlIGhlYWRzZXQgbW9kZS5cbiIpOwogfQogCiAvKiBOb2tpYSB0eXBlICovCkBAIC0zNDI0LDcgKzM2NjAsNyBAQAogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4YzMsIDB4MDAwMCk7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byBOb2tpYS1zdHlsZSBoZWFkc2V0IG1vZGUuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgc2V0IHRvIE5va2lhLXN0eWxlIGhlYWRzZXQgbW9kZS5cbiIpOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfZGV0ZXJtaW5lX2hlYWRzZXRfdHlwZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTM0NjYsNyArMzcwMiw3IEBACiAJCWJyZWFrOwogCX0KIAotCXNuZF9wcmludGRkKCJIZWFkc2V0IGphY2sgZGV0ZWN0ZWQgaVBob25lLXN0eWxlIGhlYWRzZXQ6ICVzXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBkZXRlY3RlZCBpUGhvbmUtc3R5bGUgaGVhZHNldDogJXNcbiIsCiAJCSAgICBpc19jdGlhID8gInllcyIgOiAibm8iKTsKIAlzcGVjLT5jdXJyZW50X2hlYWRzZXRfdHlwZSA9IGlzX2N0aWEgPyBBTENfSEVBRFNFVF9UWVBFX0NUSUEgOiBBTENfSEVBRFNFVF9UWVBFX09NVFA7CiB9CkBAIC0zNTkyLDIxICszODI4LDM4IEBACiAJCWFsY19maXh1cF9oZWFkc2V0X21vZGUoY29kZWMsIGZpeCwgYWN0aW9uKTsKIH0KIAorc3RhdGljIHZvaWQgYWxjMjU1X3NldF9kZWZhdWx0X2phY2tfdHlwZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwkvKiBTZXQgdG8gaXBob25lIHR5cGUgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWIsIDB4ODgwYik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQ1LCAweGQwODkpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxYiwgMHgwODBiKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDYsIDB4MDAwNCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFiLCAweDBjMGIpOworCW1zbGVlcCgzMCk7Cit9CisKIHN0YXRpYyB2b2lkIGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKIHsKIAlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKSB7Ci0JCS8qIFNldCB0byBpcGhvbmUgdHlwZSAqLwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWIsIDB4ODgwYik7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0NSwgMHhkMDg5KTsKLQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFiLCAweDA4MGIpOwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDYsIDB4MDAwNCk7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxYiwgMHgwYzBiKTsKLQkJbXNsZWVwKDMwKTsKKwkJYWxjMjU1X3NldF9kZWZhdWx0X2phY2tfdHlwZShjb2RlYyk7CiAJfQogCWFsY19maXh1cF9oZWFkc2V0X21vZGUoY29kZWMsIGZpeCwgYWN0aW9uKTsKIH0KIAorc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2hlYWRzZXRfbW9kZV9hbGMyNTVfbm9faHBfbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKSB7CisJCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCQlzcGVjLT5wYXJzZV9mbGFncyB8PSBIREFfUElOQ0ZHX0hFQURTRVRfTUlDOworCQlhbGMyNTVfc2V0X2RlZmF1bHRfamFja190eXBlKGNvZGVjKTsKKwl9IAorCWVsc2UKKwkJYWxjX2ZpeHVwX2hlYWRzZXRfbW9kZShjb2RlYywgZml4LCBhY3Rpb24pOworfQorCiBzdGF0aWMgdm9pZCBhbGNfZml4dXBfYXV0b19tdXRlX3ZpYV9hbXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKIHsKQEAgLTM4ODcsNyArNDE0MCw5IEBACiAJQUxDMjkwX0ZJWFVQX1NVQldPT0ZFUl9IU0pBQ0ssCiAJQUxDMjY5X0ZJWFVQX1RISU5LUEFEX0FDUEksCiAJQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwlBTEMyNTVfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFLAogCUFMQzI1NV9GSVhVUF9IRUFEU0VUX01PREUsCisJQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERV9OT19IUF9NSUMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9maXh1cCBhbGMyNjlfZml4dXBzW10gPSB7CkBAIC00MjY0LDEwICs0NTE5LDIzIEBACiAJCS5jaGFpbmVkID0gdHJ1ZSwKIAkJLmNoYWluX2lkID0gQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERQogCX0sCisJW0FMQzI1NV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0VdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsgMHgxOSwgMHgwMWExOTEzYyB9LCAvKiB1c2UgYXMgaGVhZHNldCBtaWMsIHdpdGhvdXQgaXRzIG93biBqYWNrIGRldGVjdCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERV9OT19IUF9NSUMKKwl9LAogCVtBTEMyNTVfRklYVVBfSEVBRFNFVF9NT0RFXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1LAogCX0sCisJW0FMQzI1NV9GSVhVUF9IRUFEU0VUX01PREVfTk9fSFBfTUlDXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1X25vX2hwX21pYywKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OV9maXh1cF90YmxbXSA9IHsKQEAgLTQzMTksNiArNDU4Nyw5IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYxNiwgIkRlbGwgVm9zdHJvIDU0NzAiLCBBTEMyOTBfRklYVVBfU1VCV09PRkVSX0hTSkFDSyksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYxZiwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjI5LCAiRGVsbCIsIEFMQzI2OV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MmMsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYyZSwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjMyLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MzgsICJEZWxsIEluc3Bpcm9uIDU0MzkiLCBBTEMyOTBfRklYVVBfTU9OT19TUEVBS0VSU19IU0pBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2M2UsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYzZiwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKQEAgLTQzMzEsNiArNDYwMiw4IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY1OCwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjVmLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NjIsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY2OCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjY5LCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDE1Y2MsICJEZWxsIFg1IFByZWNpc2lvbiIsIEFMQzI2OV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDE1Y2QsICJEZWxsIFg1IFByZWNpc2lvbiIsIEFMQzI2OV9GSVhVUF9ERUxMMl9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDE1ODYsICJIUCIsIEFMQzI2OV9GSVhVUF9IUF9NVVRFX0xFRF9NSUMyKSwKQEAgLTQ1NzMsMTMgKzQ4NDYsMTUgQEAKIAkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZBOwogCQlzd2l0Y2ggKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGYwKSB7CiAJCWNhc2UgMHgwMDEwOgotCQkJaWYgKGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKKwkJCWlmIChjb2RlYy0+YnVzLT5wY2kgJiYKKwkJCSAgICBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDI1ICYmCiAJCQkgICAgc3BlYy0+Y2RlZmluZS5wbGF0Zm9ybV90eXBlID09IDEpCiAJCQkJZXJyID0gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MVgiKTsKIAkJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDAyMDoKLQkJCWlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FhICYmCisJCQlpZiAoY29kZWMtPmJ1cy0+cGNpICYmCisJCQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTdhYSAmJgogCQkJICAgIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDIxZjMpCiAJCQkJZXJyID0gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzMyMDIiKTsKIAkJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQzsKQEAgLTQ2MDIsNiArNDg3Nyw4IEBACiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDI4MjoKIAkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI4MjsKKwkJc3BlYy0+c2h1dHVwID0gYWxjMjgyX3NodXR1cDsKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjMjgyX2luaXQ7CiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDIzMzoKIAljYXNlIDB4MTBlYzAyODM6CkBAIC00OTE5LDggKzUxOTYsNyBAQAogCQkJCSAgICAgICgweDNiIDw8IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHwKIAkJCQkgICAgICAoMHgwMyA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8CiAJCQkJICAgICAgKDAgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhkYV9jb2RlYzogZmFpbGVkIHRvIG92ZXJyaWRlIGFtcCBjYXBzIGZvciBOSUQgMHgyXG4iKTsKKwkJY29kZWNfd2Fybihjb2RlYywgImZhaWxlZCB0byBvdmVycmlkZSBhbXAgY2FwcyBmb3IgTklEIDB4MlxuIik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9jaG1hcF9lbGVtIGFzdXNfcGNtXzJfMV9jaG1hcHNbXSA9IHsKQEAgLTQ5NDIsOCArNTIxOCw1NCBAQAogCX0KIH0KIAorLyogdHVybiBvbi9vZmYgbXV0ZSBMRUQgcGVyIHZtYXN0ZXIgaG9vayAqLworc3RhdGljIHZvaWQgYWxjNjYyX2xlZF9ncGlvMV9tdXRlX2hvb2sodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgb2xkdmFsID0gc3BlYy0+Z3Bpb19sZWQ7CisKKwlpZiAoZW5hYmxlZCkKKwkJc3BlYy0+Z3Bpb19sZWQgJj0gfjB4MDE7CisJZWxzZQorCQlzcGVjLT5ncGlvX2xlZCB8PSAweDAxOworCWlmIChzcGVjLT5ncGlvX2xlZCAhPSBvbGR2YWwpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDEsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwKKwkJCQkgICAgc3BlYy0+Z3Bpb19sZWQpOworfQorCisvKiBhdm9pZCBEMyBmb3Iga2VlcGluZyBHUElPIHVwICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fbGVkX3Bvd2VyX2ZpbHRlcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICBoZGFfbmlkX3QgbmlkLAorCQkJCQkgIHVuc2lnbmVkIGludCBwb3dlcl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpZiAobmlkID09IGNvZGVjLT5hZmcgJiYgcG93ZXJfc3RhdGUgPT0gQUNfUFdSU1RfRDMgJiYgc3BlYy0+Z3Bpb19sZWQpCisJCXJldHVybiBBQ19QV1JTVF9EMDsKKwlyZXR1cm4gcG93ZXJfc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2Ml9maXh1cF9sZWRfZ3BpbzEoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgY29uc3Qgc3RydWN0IGhkYV9maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgZ3Bpb19pbml0W10gPSB7CisJCXsgMHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAxIH0sCisJCXsgMHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDEgfSwKKwkJe30KKwl9OworCisJaWYgKGFjdGlvbiA9PSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRSkgeworCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlLmhvb2sgPSBhbGM2NjJfbGVkX2dwaW8xX211dGVfaG9vazsKKwkJc3BlYy0+Z3Bpb19sZWQgPSAwOworCQlzbmRfaGRhX2FkZF92ZXJicyhjb2RlYywgZ3Bpb19pbml0KTsKKwkJY29kZWMtPnBvd2VyX2ZpbHRlciA9IGdwaW9fbGVkX3Bvd2VyX2ZpbHRlcjsKKwl9Cit9CisKIGVudW0gewogCUFMQzY2Ml9GSVhVUF9BU1BJUkUsCisJQUxDNjYyX0ZJWFVQX0xFRF9HUElPMSwKIAlBTEM2NjJfRklYVVBfSURFQVBBRCwKIAlBTEMyNzJfRklYVVBfTUFSSU8sCiAJQUxDNjYyX0ZJWFVQX0NaQ19QMTBULApAQCAtNDk2Miw5ICs1Mjg0LDEwIEBACiAJQUxDNjYyX0ZJWFVQX0lOVl9ETUlDLAogCUFMQzY2OF9GSVhVUF9ERUxMX01JQ19OT19QUkVTRU5DRSwKIAlBTEM2NjhfRklYVVBfSEVBRFNFVF9NT0RFLAotCUFMQzY2Ml9GSVhVUF9CQVNTX0NITUFQLAorCUFMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQLAorCUFMQzY2Ml9GSVhVUF9CQVNTXzE2LAogCUFMQzY2Ml9GSVhVUF9CQVNTXzFBLAotCUFMQzY2Ml9GSVhVUF9CQVNTXzFBX0NITUFQLAorCUFMQzY2Ml9GSVhVUF9CQVNTX0NITUFQLAogCUFMQzY2OF9GSVhVUF9BVVRPX01VVEUsCiB9OwogCkBAIC00OTc2LDEyICs1Mjk5LDE4IEBACiAJCQl7IH0KIAkJfQogCX0sCisJW0FMQzY2Ml9GSVhVUF9MRURfR1BJTzFdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gYWxjNjYyX2ZpeHVwX2xlZF9ncGlvMSwKKwl9LAogCVtBTEM2NjJfRklYVVBfSURFQVBBRF0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCiAJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgewogCQkJeyAweDE3LCAweDk5MTMwMTEyIH0sIC8qIHN1Yndvb2ZlciAqLwogCQkJeyB9Ci0JCX0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfTEVEX0dQSU8xLAogCX0sCiAJW0FMQzI3Ml9GSVhVUF9NQVJJT10gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCkBAIC01MTQ2LDI0ICs1NDc1LDMzIEBACiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2FsYzY2OCwKIAl9LAotCVtBTEM2NjJfRklYVVBfQkFTU19DSE1BUF0gPSB7CisJW0FMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGFsY19maXh1cF9iYXNzX2NobWFwLAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9BU1VTX01PREU0CiAJfSwKKwlbQUxDNjYyX0ZJWFVQX0JBU1NfMTZdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsweDE2LCAweDgwMTA2MTExfSwgLyogYmFzcyBzcGVha2VyICovCisJCQl7fQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9CQVNTX0NITUFQLAorCX0sCiAJW0FMQzY2Ml9GSVhVUF9CQVNTXzFBXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKIAkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CiAJCQl7MHgxYSwgMHg4MDEwNjExMX0sIC8qIGJhc3Mgc3BlYWtlciAqLwogCQkJe30KIAkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCwKIAl9LAotCVtBTEM2NjJfRklYVVBfQkFTU18xQV9DSE1BUF0gPSB7CisJW0FMQzY2Ml9GSVhVUF9CQVNTX0NITUFQXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGFsY19maXh1cF9iYXNzX2NobWFwLAotCQkuY2hhaW5lZCA9IHRydWUsCi0JCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9CQVNTXzFBLAogCX0sCiB9OwogCkBAIC01MTg1LDkgKzU1MjMsMTEgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjI4LCAiRGVsbCIsIEFMQzY2OF9GSVhVUF9BVVRPX01VVEUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NGUsICJEZWxsIiwgQUxDNjY4X0ZJWFVQX0FVVE9fTVVURSksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MTYzMiwgIkhQIFJQNTgwMCIsIEFMQzY2Ml9GSVhVUF9IUF9SUDU4MDApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExY2QsICJBc3VzIE41NTAiLCBBTEM2NjJfRklYVVBfQkFTU18xQV9DSE1BUCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ3NywgIkFTVVMgTjU2VloiLCBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MWJmMywgIkFTVVMgTjc2VloiLCBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFjZCwgIkFzdXMgTjU1MCIsIEFMQzY2Ml9GSVhVUF9CQVNTXzFBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDc3LCAiQVNVUyBONTZWWiIsIEFMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNWE3LCAiQVNVUyBVWDUxVlpIIiwgQUxDNjYyX0ZJWFVQX0JBU1NfMTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDFiNzMsICJBU1VTIE41NVNGIiwgQUxDNjYyX0ZJWFVQX0JBU1NfMTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDFiZjMsICJBU1VTIE43NlZaIiwgQUxDNjYyX0ZJWFVQX0JBU1NfTU9ERTRfQ0hNQVApLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDg0NjksICJBU1VTIG1vYm8iLCBBTEM2NjJfRklYVVBfTk9fSkFDS19ERVRFQ1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBjZDYsICJGb3hjb25uIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwNTEsICJTYW1zdW5nIFI3MjAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCkBAIC01MzI4LDcgKzU2NjgsNyBAQAogCQlzcGVjLT5nZW4uYmVlcF9uaWQgPSAweDAxOwogCiAJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmICgxIDw8IDE0KSkgJiYKLQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgorCSAgICBjb2RlYy0+YnVzLT5wY2kgJiYgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgogCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgewogCQllcnIgPSBhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjcyWCIpOwogCQlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCmluZGV4IDY2NzlhNTAuLjMyMDhhZDY5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCX0gd2hpbGUgKCh2YWwgJiBTSTMwNTRfTUVJX1JFQURZKSAhPSBTSTMwNTRfTUVJX1JFQURZICYmIHdhaXRfY291bnQtLSk7CiAKIAlpZigodmFsJlNJMzA1NF9NRUlfUkVBRFkpICE9IFNJMzA1NF9NRUlfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2kzMDU0OiBjYW5ub3QgaW5pdGlhbGl6ZS4gRVhUIE1JRCA9ICUwNHhcbiIsIHZhbCk7CisJCWNvZGVjX2Vycihjb2RlYywgInNpMzA1NDogY2Fubm90IGluaXRpYWxpemUuIEVYVCBNSUQgPSAlMDR4XG4iLCB2YWwpOwogCQkvKiBsZXQncyBwcmF5IHRoYXQgdGhpcyBpcyBubyBmYXRhbCBlcnJvciAqLwogCQkvKiByZXR1cm4gLUVBQ0NFUzsgKi8KIAl9CkBAIC0yNDcsNyArMjQ3LDggQEAKIAlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9DRkcxLDB4MjAwKTsKIAogCWlmKChHRVRfUkVHKGNvZGVjLFNJMzA1NF9MSU5FX1NUQVRVUykgJiAoMTw8NikpID09IDApIHsKLQkJc25kX3ByaW50ZCgiTGluayBGcmFtZSBEZXRlY3QoRkRUKSBpcyBub3QgcmVhZHkgKGxpbmUgc3RhdHVzOiAlMDR4KVxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLAorCQkJICAiTGluayBGcmFtZSBEZXRlY3QoRkRUKSBpcyBub3QgcmVhZHkgKGxpbmUgc3RhdHVzOiAlMDR4KVxuIiwKIAkJCQlHRVRfUkVHKGNvZGVjLFNJMzA1NF9MSU5FX1NUQVRVUykpOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDNiYzI5YzkuLjc1NTE1YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogewogCXVuc2lnbmVkIGludCBncGlvc3RhdGUsIGdwaW9tYXNrLCBncGlvZGlyOwogCi0Jc25kX3ByaW50ZGQoIiVzIG1zayAleCBkaXIgJXggZ3BpbyAleFxuIiwgX19mdW5jX18sIG1hc2ssIGRpcl9tYXNrLCBkYXRhKTsKKwljb2RlY19kYmcoY29kZWMsICIlcyBtc2sgJXggZGlyICV4IGdwaW8gJXhcbiIsIF9fZnVuY19fLCBtYXNrLCBkaXJfbWFzaywgZGF0YSk7CiAKIAlncGlvc3RhdGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCiAJCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CkBAIC0zNTksNyArMzU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHBpbmN0bDsKIAotCXNuZF9wcmludGRkKCIlcywgbmlkICV4IGN0bCAleFxuIiwgX19mdW5jX18sIG5pZCwgbmV3X3ZyZWYpOworCWNvZGVjX2RiZyhjb2RlYywgIiVzLCBuaWQgJXggY3RsICV4XG4iLCBfX2Z1bmNfXywgbmlkLCBuZXdfdnJlZik7CiAJcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKIApAQCAtMjA4Niw5ICsyMDg2LDEyIEBACiAJfQogCiAJaWYgKGZpbmRfbXV0ZV9sZWRfY2ZnKGNvZGVjLCBzcGVjLT5kZWZhdWx0X3BvbGFyaXR5KSkKLQkJc25kX3ByaW50ZCgibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKIAkJCQlzcGVjLT5ncGlvX2xlZCwKIAkJCQlzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSk7CisKKwkvKiBhbGxvdyBhdXRvLXN3aXRjaGluZyBvZiBkb2NrIGxpbmUtaW4gKi8KKwlzcGVjLT5nZW4ubGluZV9pbl9hdXRvX3N3aXRjaCA9IHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YWM5MmhkODN4eHhfZml4dXBfaHBfemVwaHlyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMzA3Nyw3ICszMDgwLDcgQEAKIAl9CiAKIAlpZiAoZmluZF9tdXRlX2xlZF9jZmcoY29kZWMsIDEpKQotCQlzbmRfcHJpbnRkKCJtdXRlIExFRCBncGlvICVkIHBvbGFyaXR5ICVkXG4iLAorCQljb2RlY19kYmcoY29kZWMsICJtdXRlIExFRCBncGlvICVkIHBvbGFyaXR5ICVkXG4iLAogCQkJCXNwZWMtPmdwaW9fbGVkLAogCQkJCXNwZWMtPmdwaW9fbGVkX3BvbGFyaXR5KTsKIApAQCAtNDQyMiw4ICs0NDI1LDggQEAKIAogCW51bV9kYWNzID0gc25kX2hkYV9nZXRfbnVtX2Nvbm5zKGNvZGVjLCAweDBhKSAtIDE7CiAJaWYgKG51bV9kYWNzIDwgMyB8fCBudW1fZGFjcyA+IDUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBDb3VsZCBub3QgZGV0ZXJtaW5lICIKLQkJICAgICAgICJudW1iZXIgb2YgY2hhbm5lbHMgZGVmYXVsdGluZyB0byBEQUMgY291bnRcbiIpOworCQljb2RlY193YXJuKGNvZGVjLAorCQkJICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmF1bHRpbmcgdG8gREFDIGNvdW50XG4iKTsKIAkJbnVtX2RhY3MgPSA1OwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKaW5kZXggZjg0MTk1Zi4uNzc4MTY2MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC00NjUsMTQgKzQ2NSw4IEBACiAKIHN0YXRpYyB2b2lkIHZpYV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0JaWYgKCFzcGVjKQotCQlyZXR1cm47Ci0KIAl2dDE3MDhfc3RvcF9ocF93b3JrKGNvZGVjKTsKLQlzbmRfaGRhX2dlbl9zcGVjX2ZyZWUoJnNwZWMtPmdlbik7Ci0Ja2ZyZWUoc3BlYyk7CisJc25kX2hkYV9nZW5fZnJlZShjb2RlYyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMgYi9zb3VuZC9wY2kvaGRhL3RoaW5rcGFkX2hlbHBlci5jCmluZGV4IDhmZTNiOGMuLjZiYTBiNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMKKysrIGIvc291bmQvcGNpL2hkYS90aGlua3BhZF9oZWxwZXIuYwpAQCAtNjMsNyArNjMsOCBAQAogCQlpZiAoIWxlZF9zZXRfZnVuYykKIAkJCWxlZF9zZXRfZnVuYyA9IHN5bWJvbF9yZXF1ZXN0KHRwYWNwaV9sZWRfc2V0KTsKIAkJaWYgKCFsZWRfc2V0X2Z1bmMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gZmluZCB0aGlua3BhZC1hY3BpIHN5bWJvbCB0cGFjcGlfbGVkX3NldFxuIik7CisJCQljb2RlY193YXJuKGNvZGVjLAorCQkJCSAgICJGYWlsZWQgdG8gZmluZCB0aGlua3BhZC1hY3BpIHN5bWJvbCB0cGFjcGlfbGVkX3NldFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzUsNyArNzYsOCBAQAogCQl9CiAJCWlmIChsZWRfc2V0X2Z1bmMoVFBBQ1BJX0xFRF9NSUNNVVRFLCBmYWxzZSkgPj0gMCkgewogCQkJaWYgKHNwZWMtPm51bV9hZGNfbmlkcyA+IDEpCi0JCQkJc25kX3ByaW50ZGQoIlNraXBwaW5nIG1pY211dGUgTEVEIGNvbnRyb2wgZHVlIHRvIHNldmVyYWwgQURDcyIpOworCQkJCWNvZGVjX2RiZyhjb2RlYywKKwkJCQkJICAiU2tpcHBpbmcgbWljbXV0ZSBMRUQgY29udHJvbCBkdWUgdG8gc2V2ZXJhbCBBRENzIik7CiAJCQllbHNlIHsKIAkJCQlzcGVjLT5jYXBfc3luY19ob29rID0gdXBkYXRlX3RwYWNwaV9taWNtdXRlX2xlZDsKIAkJCQlyZW1vdmVmdW5jID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCmluZGV4IDU1OTAyZWMuLjNiM2NmNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCkBAIC0xOTM3LDkgKzE5MzcsMTIgQEAKIAkJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCQlpZCA9IGF1cmVvbl9jczg0MTVfZ2V0KGljZSwgQ1M4NDE1X0lEKTsKIAkJaWYgKGlkICE9IDB4NDEpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiTm8gQ1M4NDE1IGNoaXAuIFNraXBwaW5nIENTODQxNSBjb250cm9scy5cbiIpOworCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJICJObyBDUzg0MTUgY2hpcC4gU2tpcHBpbmcgQ1M4NDE1IGNvbnRyb2xzLlxuIik7CiAJCWVsc2UgaWYgKChpZCAmIDB4MEYpICE9IDB4MDEpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgQ1M4NDE1IHJldi4gKCVjKVxuIiwgKGNoYXIpKChpZCAmIDB4MEYpICsgJ0EnIC0gMSkpOworCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJICJEZXRlY3RlZCB1bnN1cHBvcnRlZCBDUzg0MTUgcmV2LiAoJWMpXG4iLAorCQkJCSAoY2hhcikoKGlkICYgMHgwRikgKyAnQScgLSAxKSk7CiAJCWVsc2UgewogCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M4NDE1X2NvbnRyb2xzKTsgaSsrKSB7CiAJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCmluZGV4IDllMjhjYzEuLmVkMjE0NGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwpAQCAtNDI1LDcgKzQyNSw4IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5jczg0MjcsICZyZWcsIDEpICE9IDEpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBzZW5kIHJlZ2lzdGVyIDB4JXggYnl0ZSB0byBDUzg0MjdcbiIsIHJlZyk7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIHNlbmQgcmVnaXN0ZXIgMHgleCBieXRlIHRvIENTODQyN1xuIiwgcmVnKTsKIAlzbmRfaTJjX3JlYWRieXRlcyhpY2UtPmNzODQyNywgJnJlZywgMSk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAocmVnICYgQ1M4NDI3X1VOTE9DSykgPyAxIDogMDsKIAlyZXR1cm4gMDsKQEAgLTU3NSw2ICs1NzYsMzAgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2RlbHRhX3Jlc3VtZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFrbV9iYWNrdXBbQUs0WFhYX0lNQUdFX1NJWkVdOworCS8qIGluaXQgY29kZWMgYW5kIHJlc3RvcmUgcmVnaXN0ZXJzICovCisJaWYgKGljZS0+YWttX2NvZGVjcykgeworCQltZW1jcHkoYWttX2JhY2t1cCwgaWNlLT5ha20tPmltYWdlcywgc2l6ZW9mKGFrbV9iYWNrdXApKTsKKwkJc25kX2FrbTR4eHhfaW5pdChpY2UtPmFrbSk7CisJCW1lbWNweShpY2UtPmFrbS0+aW1hZ2VzLCBha21fYmFja3VwLCBzaXplb2YoYWttX2JhY2t1cCkpOworCQlzbmRfYWttNHh4eF9yZXNldChpY2UtPmFrbSwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZGVsdGFfc3VzcGVuZChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwlpZiAoaWNlLT5ha21fY29kZWNzKSAvKiByZXNldCAmIG11dGUgY29kZWMgKi8KKwkJc25kX2FrbTR4eHhfcmVzZXQoaWNlLT5ha20sIDEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBzbmRfaWNlMTcxMl9kZWx0YV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCWludCBlcnI7CkBAIC02MjEsNyArNjQ2LDExIEBACiAJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA0OwogCQlicmVhazsKIAl9Ci0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwlpY2UtPnBtX3Jlc3VtZSA9IHNuZF9pY2UxNzEyX2RlbHRhX3Jlc3VtZTsKKwlpY2UtPnBtX3N1c3BlbmQgPSBzbmRfaWNlMTcxMl9kZWx0YV9zdXNwZW5kOworCWljZS0+cG1fc3VzcGVuZF9lbmFibGVkID0gMTsKKyNlbmRpZgogCS8qIGluaXRpYWxpemUgdGhlIFNQSSBjbG9jayB0byBoaWdoICovCiAJdG1wID0gc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEpOwogCXRtcCB8PSBJQ0UxNzEyX0RFTFRBX0FQX0NDTEs7CkBAIC02MzcsNyArNjY2LDcgQEAKIAljYXNlIElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyOgogCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE2NkU6CiAJCWlmICgoZXJyID0gc25kX2kyY19idXNfY3JlYXRlKGljZS0+Y2FyZCwgIklDRTE3MTIgR1BJTyAxIiwgTlVMTCwgJmljZS0+aTJjKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgSTJDIGJ1c1xuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWljZS0+aTJjLT5wcml2YXRlX2RhdGEgPSBpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCmluZGV4IGJjMmU3MDEuLjgxN2ExYmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCkBAIC0xNjMsNyArMTYzLDggQEAKIAogICAgICBfX2Vycm9yOgogCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBSzQ1MjQgY2hpcCBzZWxlY3QgZmFpbGVkLCBjaGVjayBjYWJsZSB0byB0aGUgZnJvbnQgbW9kdWxlXG4iKTsKKwlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkiQUs0NTI0IGNoaXAgc2VsZWN0IGZhaWxlZCwgY2hlY2sgY2FibGUgdG8gdGhlIGZyb250IG1vZHVsZVxuIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTE3NCw3ICsxNzUsNyBAQAogCXVuc2lnbmVkIGNoYXIgdG1wOwogCS8qIGFzc2VydCBBSzQ1MjQgQ1MgKi8KIAlpZiAoc25kX2ljZTE3MTJfZXdzODhtdF9jaGlwX3NlbGVjdChpY2UsIH4oMSA8PCBjaGlwKSAmIDB4MGYpIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZmF0YWwgZXJyb3IgKGV3czg4bXQgY2hpcCBzZWxlY3QpXG4iKTsKKwkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwgImZhdGFsIGVycm9yIChld3M4OG10IGNoaXAgc2VsZWN0KVxuIik7CiAJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCXRtcCA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEgfAogCQlJQ0UxNzEyX0VXUzg4X1NFUklBTF9DTE9DSyB8CkBAIC00NTYsNyArNDU3LDcgQEAKIAogCS8qIGNyZWF0ZSBpMmMgKi8KIAlpZiAoKGVyciA9IHNuZF9pMmNfYnVzX2NyZWF0ZShpY2UtPmNhcmQsICJJQ0UxNzEyIEdQSU8gMSIsIE5VTEwsICZpY2UtPmkyYykpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBJMkMgYnVzXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWNlLT5pMmMtPnByaXZhdGVfZGF0YSA9IGljZTsKQEAgLTQ2OSw3ICs0NzAsOCBAQAogCQkJCQkgICAgSUNFMTcxMl82RklSRV9QQ0Y5NTU0X0FERFIsCiAJCQkJCSAgICAmc3BlYy0+aTJjZGV2c1tFV1NfSTJDXzZGSVJFXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJQQ0Y5NTU0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkJCSJQQ0Y5NTU0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXNuZF9pY2UxNzEyXzZmaXJlX3dyaXRlX3BjYShpY2UsIFBDRjk1NTRfUkVHX0NPTkZJRywgMHg4MCk7CkBAIC04MzQsNyArODM2LDcgQEAKIAlieXRlID0gMDsKIAlpZiAoc25kX2kyY19yZWFkYnl0ZXMoc3BlYy0+aTJjZGV2c1tFV1NfSTJDXzZGSVJFXSwgJmJ5dGUsIDEpICE9IDEpIHsKIAkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCByZWFkIHBjYVxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVhZCBwY2FcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IDI4ZWM4NzIuLjI5MTY3MmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCWVyciA9IHNuZF9jczg0MjdfY3JlYXRlKGljZS0+aTJjLCBhZGRyLAogCQkoaWNlLT5jczg0MjdfdGltZW91dCAqIEhaKSAvIDEwMDAsICZpY2UtPmNzODQyNyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ1M4NDI3IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJDUzg0MjcgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWNlLT5zcGRpZi5vcHMub3BlbiA9IG9wZW5fY3M4NDI3OwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJCQl1MTYgcGJrc3RhdHVzOwogCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJCQlwYmtzdGF0dXMgPSBpbncoSUNFRFMoaWNlLCBJTlRTVEFUKSk7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAicGJrc3RhdHVzID0gMHgleFxuIiwgcGJrc3RhdHVzKTsgKi8KKwkJCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJwYmtzdGF0dXMgPSAweCV4XG4iLCBwYmtzdGF0dXMpOyAqLwogCQkJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgewogCQkJCWlmICgocGJrc3RhdHVzICYgKDMgPDwgKGlkeCAqIDIpKSkgPT0gMCkKIAkJCQkJY29udGludWU7CkBAIC05MDMsNyArOTAzLDggQEAKIAlpZiAocnBjbSkKIAkJKnJwY20gPSBwY207CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJDb25zdW1lciBQQ00gY29kZSBkb2VzIG5vdCB3b3JrIHdlbGwgYXQgdGhlIG1vbWVudCAtLWprXG4iKTsKKwlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJICJDb25zdW1lciBQQ00gY29kZSBkb2VzIG5vdCB3b3JrIHdlbGwgYXQgdGhlIG1vbWVudCAtLWprXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTUzNCw3ICsxNTM1LDggQEAKIAkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBhYzk3IGZvciBjb25zdW1lciwgc2tpcHBlZFxuIik7CisJCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJCQkgImNhbm5vdCBpbml0aWFsaXplIGFjOTcgZm9yIGNvbnN1bWVyLCBza2lwcGVkXG4iKTsKIAkJZWxzZSB7CiAJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcsIGljZSkpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNTUyLDcgKzE1NTQsOCBAQAogCQlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9pY2UxNzEyX21peGVyX2ZyZWVfYWM5NzsKIAkJZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MTI6IGNhbm5vdCBpbml0aWFsaXplIHBybyBhYzk3LCBza2lwcGVkXG4iKTsKKwkJCWRldl93YXJuKGljZS0+Y2FyZC0+ZGV2LAorCQkJCSAiY2Fubm90IGluaXRpYWxpemUgcHJvIGFjOTcsIHNraXBwZWRcbiIpOwogCQllbHNlCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0yMzMyLDcgKzIzMzUsOCBAQAogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWNlLT5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZkZXZpY2UpOwogCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gKCh1bnNpZ25lZCBpbnQpc3dhYjE2KHZlbmRvcikgPDwgMTYpIHwgc3dhYjE2KGRldmljZSk7CiAJCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwgaWNlLT5lZXByb20uc3VidmVuZG9yID09ICh1bnNpZ25lZCBpbnQpLTEpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MTI6IE5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKKwkJCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkJCQkiTm8gdmFsaWQgSUQgaXMgZm91bmRcbiIpOwogCQkJCXJldHVybiAtRU5YSU87CiAJCQl9CiAJCX0KQEAgLTIzNDAsMjEgKzIzNDQsMjIgQEAKIAlmb3IgKHRibCA9IGNhcmRfdGFibGVzOyAqdGJsOyB0YmwrKykgewogCQlmb3IgKGMgPSAqdGJsOyBjLT5zdWJ2ZW5kb3I7IGMrKykgewogCQkJaWYgKG1vZGVsbmFtZSAmJiBjLT5tb2RlbCAmJiAhc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcxMjogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsIGMtPm5hbWUpOworCQkJCWRldl9pbmZvKGljZS0+Y2FyZC0+ZGV2LAorCQkJCQkgIlVzaW5nIGJvYXJkIG1vZGVsICVzXG4iLCBjLT5uYW1lKTsKIAkJCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSBjLT5zdWJ2ZW5kb3I7CiAJCQl9IGVsc2UgaWYgKGMtPnN1YnZlbmRvciAhPSBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpCiAJCQkJY29udGludWU7CiAJCQlpZiAoIWMtPmVlcHJvbV9zaXplIHx8ICFjLT5lZXByb21fZGF0YSkKIAkJCQlnb3RvIGZvdW5kOwogCQkJLyogaWYgdGhlIEVFUFJPTSBpcyBnaXZlbiBieSB0aGUgZHJpdmVyLCB1c2UgaXQgKi8KLQkJCXNuZF9wcmludGRkKCJ1c2luZyB0aGUgZGVmaW5lZCBlZXByb20uLlxuIik7CisJCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAidXNpbmcgdGhlIGRlZmluZWQgZWVwcm9tLi5cbiIpOwogCQkJaWNlLT5lZXByb20udmVyc2lvbiA9IDE7CiAJCQlpY2UtPmVlcHJvbS5zaXplID0gYy0+ZWVwcm9tX3NpemUgKyA2OwogCQkJbWVtY3B5KGljZS0+ZWVwcm9tLmRhdGEsIGMtPmVlcHJvbV9kYXRhLCBjLT5lZXByb21fc2l6ZSk7CiAJCQlnb3RvIHJlYWRfc2tpcHBlZDsKIAkJfQogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBObyBtYXRjaGluZyBtb2RlbCBmb3VuZCBmb3IgSUQgMHgleFxuIiwKKwlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwgIk5vIG1hdGNoaW5nIG1vZGVsIGZvdW5kIGZvciBJRCAweCV4XG4iLAogCSAgICAgICBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpOwogCiAgZm91bmQ6CkBAIC0yMzYyLDEyICsyMzY3LDEzIEBACiAJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQogCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7IC8qIEZJWE1FOiBhbnkgY2FyZHMgd2l0aG91dCB0aGUgY29ycmVjdCBzaXplPyAqLwogCWVsc2UgaWYgKGljZS0+ZWVwcm9tLnNpemUgPiAzMikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwgaWNlLT5lZXByb20uc2l6ZSk7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsIGljZS0+ZWVwcm9tLnNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDA1KTsKIAlpZiAoaWNlLT5lZXByb20udmVyc2lvbiAhPSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsCisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJpbnZhbGlkIEVFUFJPTSB2ZXJzaW9uICVpXG4iLAogCQkJICAgaWNlLT5lZXByb20udmVyc2lvbik7CiAJCS8qIHJldHVybiAtRUlPOyAqLwogCX0KQEAgLTI0MjgsNiArMjQzNCwxMyBAQAogCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19DT05TVU1FUl9QT1dFUkRPV04sIDApOwogCX0KIAlzbmRfaWNlMTcxMl9zZXRfcHJvX3JhdGUoaWNlLCA0ODAwMCwgMSk7CisJLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLworCW91dGIoKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSA9PSAwID8KKwkgICAgICBJQ0UxNzEyX0lSUV9NUFUyIDogMCkgfAorCSAgICAgKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSA/CisJICAgICAgSUNFMTcxMl9JUlFfUEJLRFMgfCBJQ0UxNzEyX0lSUV9DT05DQVAgfCBJQ0UxNzEyX0lSUV9DT05QQksgOiAwKSwKKwkgICAgIElDRVJFRyhpY2UsIElSUU1BU0spKTsKKwlvdXRiKDB4MDAsIElDRU1UKGljZSwgSVJRKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NTMsNyArMjU2Niw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyOCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI4Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0yNTg5LDYgKzI2MDMsNyBAQAogCWljZS0+cGNpID0gcGNpOwogCWljZS0+aXJxID0gLTE7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwkvKiBkaXNhYmxlIGxlZ2FjeSBlbXVsYXRpb24gKi8KIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaWNlLT5wY2ksIDB4NDAsIDB4ODA3Zik7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGljZS0+cGNpLCAweDQyLCAweDAwMDYpOwogCXNuZF9pY2UxNzEyX3Byb2NfaW5pdChpY2UpOwpAQCAtMjYwOSw3ICsyNjI0LDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ljZTE3MTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBpY2UpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI2MjUsMjIgKzI2NDAsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLwotCW91dGIoKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSA9PSAwID8KLQkgICAgICBJQ0UxNzEyX0lSUV9NUFUyIDogMCkgfAotCSAgICAgKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSA/Ci0JICAgICAgSUNFMTcxMl9JUlFfUEJLRFMgfCBJQ0UxNzEyX0lSUV9DT05DQVAgfCBJQ0UxNzEyX0lSUV9DT05QQksgOiAwKSwKLQkgICAgIElDRVJFRyhpY2UsIElSUU1BU0spKTsKLQlvdXRiKDB4MDAsIElDRU1UKGljZSwgSVJRKSk7Ci0KIAllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcyk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2ljZTE3MTJfZnJlZShpY2UpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2ljZTE3MTIgPSBpY2U7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjcwLDcgKzI2NzUsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjgwOSwxMSArMjgxNSw4MCBAQAogCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaSA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCWlmICghaWNlLT5wbV9zdXNwZW5kX2VuYWJsZWQpCisJCXJldHVybiAwOworCisJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCisJc25kX3BjbV9zdXNwZW5kX2FsbChpY2UtPnBjbSk7CisJc25kX3BjbV9zdXNwZW5kX2FsbChpY2UtPnBjbV9wcm8pOworCXNuZF9wY21fc3VzcGVuZF9hbGwoaWNlLT5wY21fZHMpOworCXNuZF9hYzk3X3N1c3BlbmQoaWNlLT5hYzk3KTsKKworCWlmIChpY2UtPnBtX3N1c3BlbmQpCisJCWljZS0+cG1fc3VzcGVuZChpY2UpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWljZS0+cG1fc3VzcGVuZF9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCWlmIChzbmRfaWNlMTcxMl9jaGlwX2luaXQoaWNlKSA8IDApIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGljZS0+cG1fcmVzdW1lKQorCQlpY2UtPnBtX3Jlc3VtZShpY2UpOworCisJaWYgKGljZS0+YWM5NykKKwkJc25kX2FjOTdfcmVzdW1lKGljZS0+YWM5Nyk7CisKKwlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzbmRfaWNlMTcxMl9wbSwgc25kX2ljZTE3MTJfc3VzcGVuZCwgc25kX2ljZTE3MTJfcmVzdW1lKTsKKyNkZWZpbmUgU05EX1ZUMTcxMl9QTV9PUFMJJnNuZF9pY2UxNzEyX3BtCisjZWxzZQorI2RlZmluZSBTTkRfVlQxNzEyX1BNX09QUwlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpY2UxNzEyX2RyaXZlciA9IHsKIAkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9pY2UxNzEyX2lkcywKIAkucHJvYmUgPSBzbmRfaWNlMTcxMl9wcm9iZSwKIAkucmVtb3ZlID0gc25kX2ljZTE3MTJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5wbSA9IFNORF9WVDE3MTJfUE1fT1BTLAorCX0sCiB9OwogCiBtb2R1bGVfcGNpX2RyaXZlcihpY2UxNzEyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggNTAwNDcxNy4uNWU3OTQ4ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIG9sZF9jbWQ7CiAJfQotCXNuZF9wcmludGQoS0VSTl9FUlIgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CisJZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CiAJcmV0dXJuIG9sZF9jbWQ7CiB9CiAKQEAgLTE1Niw3ICsxNTYsNyBAQAogCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspCiAJCWlmICgoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgJiBiaXQpID09IDApCiAJCQlyZXR1cm4gMDsKLQlzbmRfcHJpbnRkKEtFUk5fRVJSICJzbmRfdnQxNzI0X2FjOTdfd2FpdF9iaXQ6IHRpbWVvdXRcbiIpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJzbmRfdnQxNzI0X2FjOTdfd2FpdF9iaXQ6IHRpbWVvdXRcbiIpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC00MzAsMTAgKzQzMCwxMCBAQAogCQlzcGluX2xvY2soJmljZS0+cmVnX2xvY2spOwogCQlpZiAoKyt0aW1lb3V0ID4gMTApIHsKIAkJCXN0YXR1cyA9IGluYihJQ0VSRUcxNzI0KGljZSwgSVJRU1RBVCkpOwotCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBUb28gbG9uZyBpcnEgbG9vcCwgIgotCQkJICAgICAgICJzdGF0dXMgPSAweCV4XG4iLCBzdGF0dXMpOworCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwKKwkJCQkiVG9vIGxvbmcgaXJxIGxvb3AsIHN0YXR1cyA9IDB4JXhcbiIsIHN0YXR1cyk7CiAJCQlpZiAoc3RhdHVzICYgVlQxNzI0X0lSUV9NUFVfVFgpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MjQ6IERpc2FibGluZyBNUFVfVFhcbiIpOworCQkJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJEaXNhYmxpbmcgTVBVX1RYXG4iKTsKIAkJCQllbmFibGVfbWlkaV9pcnEoaWNlLCBWVDE3MjRfSVJRX01QVV9UWCwgMCk7CiAJCQl9CiAJCQlzcGluX3VubG9jaygmaWNlLT5yZWdfbG9jayk7CkBAIC04MDEsNyArODAxLDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHJvIHByZXBhcmU6IGNoID0gJWQsIGFkZHIgPSAweCV4LCAiCisJZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgInBybyBwcmVwYXJlOiBjaCA9ICVkLCBhZGRyID0gMHgleCwgIgogCSAgICAgICAiYnVmZmVyID0gMHgleCwgcGVyaW9kID0gMHgleFxuIiwKIAkgICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscywKIAkgICAgICAgKHVuc2lnbmVkIGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLApAQCAtODIxLDEzICs4MjEsMTMgQEAKICNpZiAwIC8qIHJlYWQgUExBWUJBQ0tfQUREUiAqLwogCXB0ciA9IGlubChJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19BRERSKSk7CiAJaWYgKHB0ciA8IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIpIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBuZWdhdGl2ZSBwdHJcbiIpOworCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBuZWdhdGl2ZSBwdHJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcHRyIC09IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CiAJcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKIAlpZiAocHRyID49IHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAorCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAogCQkJICAgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTg0MCw3ICs4NDAsNyBAQAogCWVsc2UgaWYgKHB0ciA8PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQlwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcHRyOwogCWVsc2UgewotCQlzbmRfcHJpbnRkKCJpY2UxNzI0OiBpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsCisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsCiAJCQkgICAoaW50KXB0ciwgKGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKIAkJcHRyID0gMDsKIAl9CkBAIC04ODQsNyArODg0LDcgQEAKIAllbHNlIGlmIChwdHIgPD0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJcHRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSAtIHB0cjsKIAllbHNlIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAorCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAogCQkJICAgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSk7CiAJCXB0ciA9IDA7CiAJfQpAQCAtMTUwOCw3ICsxNTA4LDggQEAKIAkJYWM5Ny5wcml2YXRlX2RhdGEgPSBpY2U7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm8gYWM5Nywgc2tpcHBlZFxuIik7CisJCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJCQkgImNhbm5vdCBpbml0aWFsaXplIHBybyBhYzk3LCBza2lwcGVkXG4iKTsKIAkJZWxzZQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtMjI3MSw3ICsyMjcyLDcgQEAKIAl3aGlsZSAoKGluYihJQ0VSRUcxNzI0KGljZSwgSTJDX0NUUkwpKSAmIFZUMTcyNF9JMkNfQlVTWSkgJiYgdC0tKQogCQk7CiAJaWYgKHQgPT0gLTEpCi0JCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogaTJjIGJ1c3kgdGltZW91dFxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJpMmMgYnVzeSB0aW1lb3V0XG4iKTsKIH0KIAogdW5zaWduZWQgY2hhciBzbmRfdnQxNzI0X3JlYWRfaTJjKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLApAQCAtMjI4Nyw3ICsyMjg4LDcgQEAKIAl2YWwgPSBpbmIoSUNFUkVHMTcyNChpY2UsIEkyQ19EQVRBKSk7CiAJbXV0ZXhfdW5sb2NrKCZpY2UtPmkyY19tdXRleCk7CiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAiaTJjX3JlYWQ6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCB2YWwpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpMmNfcmVhZDogWzB4JXgsMHgleF0gPSAweCV4XG4iLCBkZXYsIGFkZHIsIHZhbCk7CiAJKi8KIAlyZXR1cm4gdmFsOwogfQpAQCAtMjI5OCw3ICsyMjk5LDcgQEAKIAltdXRleF9sb2NrKCZpY2UtPmkyY19tdXRleCk7CiAJd2FpdF9pMmNfYnVzeShpY2UpOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgImkyY193cml0ZTogWzB4JXgsMHgleF0gPSAweCV4XG4iLCBkZXYsIGFkZHIsIGRhdGEpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpMmNfd3JpdGU6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCBkYXRhKTsKIAkqLwogCW91dGIoYWRkciwgSUNFUkVHMTcyNChpY2UsIEkyQ19CWVRFX0FERFIpKTsKIAlvdXRiKGRhdGEsIElDRVJFRzE3MjQoaWNlLCBJMkNfREFUQSkpOwpAQCAtMjMzNSw3ICsyMzM2LDggQEAKIAkJCQkoKHVuc2lnbmVkIGludClzd2FiMTYodmVuZG9yKSA8PCAxNikgfCBzd2FiMTYoZGV2aWNlKTsKIAkJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gMCB8fAogCQkJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAodW5zaWduZWQgaW50KS0xKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBObyB2YWxpZCBJRCBpcyBmb3VuZFxuIik7CisJCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwKKwkJCQkJIk5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQogCQl9CkBAIC0yMzQ0LDcgKzIzNDYsOCBAQAogCQlmb3IgKGMgPSAqdGJsOyBjLT5uYW1lOyBjKyspIHsKIAkJCWlmIChtb2RlbG5hbWUgJiYgYy0+bW9kZWwgJiYKIAkJCSAgICAhc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcyNDogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsCisJCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJCSAiVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsCiAJCQkJICAgICAgIGMtPm5hbWUpOwogCQkJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9IGMtPnN1YnZlbmRvcjsKIAkJCX0gZWxzZSBpZiAoYy0+c3VidmVuZG9yICE9IGljZS0+ZWVwcm9tLnN1YnZlbmRvcikKQEAgLTIzNTMsMTQgKzIzNTYsMTQgQEAKIAkJCWlmICghYy0+ZWVwcm9tX3NpemUgfHwgIWMtPmVlcHJvbV9kYXRhKQogCQkJCWdvdG8gZm91bmQ7CiAJCQkvKiBpZiB0aGUgRUVQUk9NIGlzIGdpdmVuIGJ5IHRoZSBkcml2ZXIsIHVzZSBpdCAqLwotCQkJc25kX3ByaW50ZGQoInVzaW5nIHRoZSBkZWZpbmVkIGVlcHJvbS4uXG4iKTsKKwkJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJ1c2luZyB0aGUgZGVmaW5lZCBlZXByb20uLlxuIik7CiAJCQlpY2UtPmVlcHJvbS52ZXJzaW9uID0gMjsKIAkJCWljZS0+ZWVwcm9tLnNpemUgPSBjLT5lZXByb21fc2l6ZSArIDY7CiAJCQltZW1jcHkoaWNlLT5lZXByb20uZGF0YSwgYy0+ZWVwcm9tX2RhdGEsIGMtPmVlcHJvbV9zaXplKTsKIAkJCWdvdG8gcmVhZF9za2lwcGVkOwogCQl9CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MjQ6IE5vIG1hdGNoaW5nIG1vZGVsIGZvdW5kIGZvciBJRCAweCV4XG4iLAorCWRldl93YXJuKGljZS0+Y2FyZC0+ZGV2LCAiTm8gbWF0Y2hpbmcgbW9kZWwgZm91bmQgZm9yIElEIDB4JXhcbiIsCiAJICAgICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvcik7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJLyogYXNzdW1lIEFDOTctb25seSBjYXJkIHdoaWNoIGNhbiBzdXNwZW5kIHdpdGhvdXQgYWRkaXRpb25hbCBjb2RlICovCkBAIC0yMzcyLDEzICsyMzc1LDEzIEBACiAJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQogCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7CiAJZWxzZSBpZiAoaWNlLT5lZXByb20uc2l6ZSA+IDMyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogSW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsCisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJJbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwKIAkJICAgICAgIGljZS0+ZWVwcm9tLnNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDUpOwogCWlmIChpY2UtPmVlcHJvbS52ZXJzaW9uICE9IDEgJiYgaWNlLT5lZXByb20udmVyc2lvbiAhPSAyKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzI0OiBJbnZhbGlkIEVFUFJPTSB2ZXJzaW9uICVpXG4iLAorCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwgIkludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsCiAJCSAgICAgICBpY2UtPmVlcHJvbS52ZXJzaW9uKTsKIAlzaXplID0gaWNlLT5lZXByb20uc2l6ZSAtIDY7CiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTI1ODYsNyArMjU4OSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92dDE3MjRfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBpY2UpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdnQxNzI0X2ZyZWUoaWNlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjYwOSw4ICsyNjEyLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcl9pY2UxNzEyID0gaWNlOwogCXJldHVybiAwOwogfQpAQCAtMjYzOCw3ICsyNjM5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwppbmRleCA4ODU1OTMzLi43YTZjMDc4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkvKiBBSzUzODUgZmlyc3QsIHNpbmNlIGl0IHJlcXVpcmVzIGNvbGQgcmVzZXQgYWZmZWN0aW5nIGJvdGggY29kZWNzICovCiAJb2xkX2dwaW8gPSBpY2UtPmdwaW8uZ2V0X2RhdGEoaWNlKTsKIAluZXdfZ3BpbyA9ICAob2xkX2dwaW8gJiB+R1BJT19BSzUzODVBX01BU0spIHwgYWs1Mzg1X3BpbnM7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIkpVTEkgLSBhazUzODUgc2V0X3JhdGVfdmFsOiBuZXcgZ3BpbyAweCV4XG4iLAorCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJKVUxJIC0gYWs1Mzg1IHNldF9yYXRlX3ZhbDogbmV3IGdwaW8gMHgleFxuIiwKIAkJbmV3X2dwaW8pOyAqLwogCWljZS0+Z3Bpby5zZXRfZGF0YShpY2UsIG5ld19ncGlvKTsKIApAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCQluZXdfZ3BpbyA9ICBvbGRfZ3BpbyAmCiAJCQkJfigodW5zaWduZWQgaW50KSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJfQotCS8qIHByaW50ayhLRVJOX0RFQlVHCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwKIAkJIkpVTEkgLSBtdXRlL3VubXV0ZTogY29udHJvbF92YWx1ZTogMHgleCwgb2xkX2dwaW86IDB4JXgsICIKIAkJIm5ld19ncGlvIDB4JXhcbiIsCiAJCSh1bnNpZ25lZCBpbnQpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sIG9sZF9ncGlvLApAQCAtNDM5LDkgKzQzOSw5IEBACiB7CiAJZm9yICg7ICpsaXN0OyBsaXN0KyspIHsKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqc2xhdmUgPSBjdGxfZmluZChjYXJkLCAqbGlzdCk7Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJhZGRfc2xhdmVzIC0gJXNcbiIsICpsaXN0KTsgKi8KKwkJLyogZGV2X2RiZyhjYXJkLT5kZXYsICJhZGRfc2xhdmVzIC0gJXNcbiIsICpsaXN0KTsgKi8KIAkJaWYgKHNsYXZlKSB7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAic2xhdmUgJXMgZm91bmRcbiIsICpsaXN0KTsgKi8KKwkJCS8qIGRldl9kYmcoY2FyZC0+ZGV2LCAic2xhdmUgJXMgZm91bmRcbiIsICpsaXN0KTsgKi8KIAkJCXNuZF9jdGxfYWRkX3NsYXZlKG1hc3Rlciwgc2xhdmUpOwogCQl9CiAJfQpAQCAtNTM2LDcgKzUzNiw3IEBACiAKIAlvbGQgPSBpY2UtPmdwaW8uZ2V0X2RhdGEoaWNlKTsKIAluZXcgPSAgKG9sZCAmIH5HUElPX1JBVEVfTUFTSykgfCBnZXRfZ3Bpb192YWwocmF0ZSk7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIkpVTEkgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgIkpVTEkgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCiAJCQlvbGQgJiBHUElPX1JBVEVfTUFTSywKIAkJCW5ldyAmIEdQSU9fUkFURV9NQVNLKTsgKi8KIApAQCAtNTczLDcgKzU3Myw3IEBACiAJaWYgKGljZS0+aXNfc3BkaWZfbWFzdGVyKGljZSkgJiYgYzEpIHsKIAkJLyogb25seSBmb3IgU1BESUYgbWFzdGVyIG1vZGUsIHJhdGUgd2FzIGNoYW5nZWQgKi8KIAkJcmF0ZSA9IHNuZF9hazQxMTRfZXh0ZXJuYWxfcmF0ZShhazQxMTQpOwotCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYWs0MTE0IC0gaW5wdXQgcmF0ZSBjaGFuZ2VkIHRvICVkXG4iLAorCQkvKiBkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiYWs0MTE0IC0gaW5wdXQgcmF0ZSBjaGFuZ2VkIHRvICVkXG4iLAogCQkJCXJhdGUpOyAqLwogCQlqdWxpX2FrbV9zZXRfcmF0ZV92YWwoaWNlLT5ha20sIHJhdGUpOwogCX0KQEAgLTYyOCw3ICs2MjgsNyBAQAogI2VuZGlmCiAKIAlpZiAoc3BlYy0+YW5hbG9nKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImp1bGlAOiBhbmFsb2cgSS9PIGRldGVjdGVkXG4iKTsKKwkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsICJqdWxpQDogYW5hbG9nIEkvTyBkZXRlY3RlZFxuIik7CiAJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOwogCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCmluZGV4IGU2MTAzMzkuLmYzYjQ5MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAluZXcgPSAofm11dGUgPDwgNyAmIDB4ODApIHwgKG9sZCAmIH4weDgwKTsKIAljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CiAJaWYgKGNoYW5nZSkKLQkJLypwcmludGsgKCJWb2x1bWUgcmVnaXN0ZXIgMHglMDJ4OiAweCUwMnhcbiIsIGlkeCwgbmV3KTsqLworCQkvKiBkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiVm9sdW1lIHJlZ2lzdGVyIDB4JTAyeDogMHglMDJ4XG4iLCBpZHgsIG5ldyk7Ki8KIAkJc3RhYzk0NjBfcHV0KGljZSwgaWR4LCBuZXcpOwogCXJldHVybiBjaGFuZ2U7CiB9CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkvKiBkdWUgdG8gcG9zc2libGUgY29uZmxpY3RzIHdpdGggc3RhYzk0NjBfc2V0X3JhdGVfdmFsLCBtdXRleGluZyAqLwogCW11dGV4X2xvY2soJnNwZWMtPm11dGVfbXV0ZXgpOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgIk11dGUgcHV0OiByZWcgMHglMDJ4LCBjdHJsIHZhbHVlOiAweCUwMnhcbiIsIGlkeCwKKwlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiTXV0ZSBwdXQ6IHJlZyAweCUwMngsIGN0cmwgdmFsdWU6IDB4JTAyeFxuIiwgaWR4LAogCSAgICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CiAJKi8KIAljaGFuZ2UgPSBzdGFjOTQ2MF9kYWNfbXV0ZShpY2UsIGlkeCwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJaWYgKGNoYW5nZSkgewogCQlvdm9sID0gICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCk7CiAJCS8qCi0JCXByaW50ayhLRVJOX0RFQlVHICJEQUMgVm9sdW1lOiByZWcgMHglMDJ4OiAweCUwMnhcbiIsCisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJEQUMgVm9sdW1lOiByZWcgMHglMDJ4OiAweCUwMnhcbiIsCiAJCSAgICAgICBpZHgsIG92b2wpOwogCQkqLwogCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCkpOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJZm9yIChpZHggPSAwOyBpZHggPCA3IDsgKytpZHgpCiAJCWNoYW5nZWRbaWR4XSA9IHN0YWM5NDYwX2RhY19tdXRlKGljZSwKIAkJCQlTVEFDOTQ2WF9NQVNURVJfVk9MVU1FICsgaWR4LCAwKTsKLQkvKnByaW50ayhLRVJOX0RFQlVHICJSYXRlIGNoYW5nZTogJWQsIG5ldyBNQzogMHglMDJ4XG4iLCByYXRlLCBuZXcpOyovCisJLypkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiUmF0ZSBjaGFuZ2U6ICVkLCBuZXcgTUM6IDB4JTAyeFxuIiwgcmF0ZSwgbmV3KTsqLwogCXN0YWM5NDYwX3B1dChpY2UsIFNUQUM5NDZYX01BU1RFUl9DTE9DS0lORywgbmV3KTsKIAl1ZGVsYXkoMTApOwogCS8qIHVubXV0aW5nIC0gb25seSBvcmlnaW5hbGx5IHVubXV0ZWQgZGFjcyAtCkBAIC03NjgsOSArNzY4LDEwIEBACiAJCS8qIGZyb20gdGhpcyBtb21lbnQgaWYgZXJyID0gMCB0aGVuCiAJCSAqIHNwZWMtPmFrNDExNCBzaG91bGQgbm90IGJlIG51bGwKIAkJICovCi0JCXNuZF9wcmludGRkKCJBSzQxMTQgaW5pdGlhbGl6ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIGVycik7CisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsCisJCQkiQUs0MTE0IGluaXRpYWxpemVkIHdpdGggc3RhdHVzICVkXG4iLCBlcnIpOwogCX0gZWxzZQotCQlzbmRfcHJpbnRkZCgiQUs0MTE0IG5vdCBmb3VuZFxuIik7CisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJBSzQxMTQgbm90IGZvdW5kXG4iKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcXVhcnRldC5jIGIvc291bmQvcGNpL2ljZTE3MTIvcXVhcnRldC5jCmluZGV4IDcxYzYwMDMuLjJjMmRmNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3F1YXJ0ZXQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9xdWFydGV0LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAJaWYgKHNuZF9CVUdfT04oY2hpcCA8IDAgfHwgY2hpcCA+PSA0KSkKIAkJcmV0dXJuOwotCS8qcHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgdG8gQUs0NjIwOiBjaGlwPSVkLCBhZGRyPTB4JXgsCisJLypkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiV3JpdGluZyB0byBBSzQ2MjA6IGNoaXA9JWQsIGFkZHI9MHgleCwKIAkgIGRhdGE9MHgleFxuIiwgY2hpcCwgYWRkciwgZGF0YSk7Ki8KIAlvcmlnX2RpciA9IGljZS0+Z3Bpby5nZXRfZGlyKGljZSk7CiAJaWNlLT5ncGlvLnNldF9kaXIoaWNlLCBvcmlnX2RpciB8IEdQSU9fU1BJX0FMTCk7CkBAIC04OTgsNyArODk4LDcgQEAKIAluZXcgPSAgKGdldF9jcGxkKGljZSkgJiB+Q1BMRF9DS1NfTUFTSykgfCBnZXRfY2tzX3ZhbChyYXRlKTsKIAkvKiBzd2l0Y2ggdG8gaW50ZXJuYWwgY2xvY2ssIGRyb3AgQ1BMRF9TWU5DX1NFTCAqLwogCW5ldyAmPSB+Q1BMRF9TWU5DX1NFTDsKLQkvKiBwcmludGsoS0VSTl9ERUJVRyAiUVQgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgIlFUIC0gc2V0X3JhdGU6IG9sZCAleCwgbmV3ICV4XG4iLAogCSAgIGdldF9jcGxkKGljZSksIG5ldyk7ICovCiAJc2V0X2NwbGQoaWNlLCBuZXcpOwogfQpAQCAtOTc4LDcgKzk3OCw3IEBACiAJCQljMSkgewogCQkvKiBvbmx5IGZvciBTUERJRiBtYXN0ZXIgbW9kZSwgcmF0ZSB3YXMgY2hhbmdlZCAqLwogCQlyYXRlID0gc25kX2FrNDExM19leHRlcm5hbF9yYXRlKGFrNDExMyk7Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJhazQxMTMgLSBpbnB1dCByYXRlIGNoYW5nZWQgdG8gJWRcbiIsCisJCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJhazQxMTMgLSBpbnB1dCByYXRlIGNoYW5nZWQgdG8gJWRcbiIsCiAJCSAgIHJhdGUpOyAqLwogCQlxdGV0X2FrbV9zZXRfcmF0ZV92YWwoaWNlLT5ha20sIHJhdGUpOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggMDhkODczMy4uNjgzNDBkNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTU0Nyw3ICs1NDcsOCBAQAogCS8qIGFjY2VzcyB0byBzb21lIGZvcmJpZGRlbiAobm9uIGV4aXN0ZW50KSBhYzk3IHJlZ2lzdGVycyB3aWxsIG5vdAogCSAqIHJlc2V0IHRoZSBzZW1hcGhvcmUuIFNvIGV2ZW4gaWYgeW91IGRvbid0IGdldCB0aGUgc2VtYXBob3JlLCBzdGlsbAogCSAqIGNvbnRpbnVlIHRoZSBhY2Nlc3MuIFdlIGRvbid0IG5lZWQgdGhlIHNlbWFwaG9yZSBhbnl3YXkuICovCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfc2VtYXBob3JlOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IFsweCV4XVsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNvZGVjX3NlbWFwaG9yZTogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBbMHgleF1bMHgleF1cbiIsCiAJCQlpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoQUNDX1NFTUEpKSwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKTsKIAlpYWdldHdvcmQoY2hpcCwgMCk7CS8qIGNsZWFyIHNlbWFwaG9yZSBmbGFnICovCiAJLyogSSBkb24ndCBjYXJlIGFib3V0IHRoZSBzZW1hcGhvcmUgKi8KQEAgLTU2Miw3ICs1NjMsOSBAQAogCQogCWlmIChzbmRfaW50ZWw4eDBfY29kZWNfc2VtYXBob3JlKGNoaXAsIGFjOTctPm51bSkgPCAwKSB7CiAJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3dyaXRlICVkOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWNfd3JpdGUgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCX0KIAlpYXB1dHdvcmQoY2hpcCwgcmVnICsgYWM5Ny0+bnVtICogMHg4MCwgdmFsKTsKIH0KQEAgLTU3Niw3ICs1NzksOSBAQAogCiAJaWYgKHNuZF9pbnRlbDh4MF9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQlyZXMgPSAweGZmZmY7CiAJfSBlbHNlIHsKIAkJcmVzID0gaWFnZXR3b3JkKGNoaXAsIHJlZyArIGFjOTctPm51bSAqIDB4ODApOwpAQCAtNTg1LDcgKzU5MCw5IEBACiAJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwgdG1wICYKIAkJCQkgIH4oY2hpcC0+Y29kZWNfcmVhZHlfYml0cyB8IElDSF9HU0NJKSk7CiAJCQlpZiAoISBjaGlwLT5pbl9hYzk3X2luaXQpCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogcmVhZCB0aW1lb3V0IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSJjb2RlY19yZWFkICVkOiByZWFkIHRpbWVvdXQgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJCWFjOTctPm51bSwgcmVnKTsKIAkJCXJlcyA9IDB4ZmZmZjsKIAkJfQogCX0KQEAgLTYxOSw3ICs2MjYsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJc25kX3ByaW50ZChLRVJOX1dBUk5JTkcgImludGVsOHgwOiBBQzk3IGNvZGVjIHJlYWR5IHRpbWVvdXQuXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiQUM5NyBjb2RlYyByZWFkeSB0aW1lb3V0LlxuIik7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtNjMxLDcgKzYzOCw3IEBACiAJd2hpbGUgKC0tdGltZSAmJiAoaWdldGR3b3JkKGNoaXAsIElDSFJFRyhBTElfQ0FTKSkgJiBBTElfQ0FTX1NFTV9CVVNZKSkKIAkJdWRlbGF5KDEpOwogCWlmICghIHRpbWUgJiYgISBjaGlwLT5pbl9hYzk3X2luaXQpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhbGlfY29kZWNfc2VtYXBob3JlIHRpbWVvdXRcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJhbGlfY29kZWNfc2VtYXBob3JlIHRpbWVvdXRcbiIpOwogCXJldHVybiBzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3JlYWR5KGNoaXAsIEFMSV9DU1BTUl9DT0RFQ19SRUFEWSk7CiB9CiAKQEAgLTcwMCw3ICs3MDcsNyBAQAogCQkJYmRiYXJbaWR4ICsgMV0gPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwIHwgLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KIAkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZSA+PiBpY2hkZXYtPnBvc19zaGlmdCk7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJkYmFyWyVpXSA9IDB4JXggWzB4JXhdXG4iLAorCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwKIAkJCSAgICAgICBpZHggKyAwLCBiZGJhcltpZHggKyAwXSwgYmRiYXJbaWR4ICsgMV0pOwogI2VuZGlmCiAJCX0KQEAgLTcxMiw4ICs3MTksOCBAQAogCWljaGRldi0+bHZpX2ZyYWcgPSBJQ0hfUkVHX0xWSV9NQVNLICUgaWNoZGV2LT5mcmFnczsKIAlpY2hkZXYtPnBvc2l0aW9uID0gMDsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgIgotCSAgICAgICAicGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKIAkgICAgICAgaWNoZGV2LT5sdmlfZnJhZywgaWNoZGV2LT5mcmFncywgaWNoZGV2LT5mcmFnc2l6ZSwKIAkgICAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2VuZGlmCkBAIC03ODEsOCArNzg4LDggQEAKIAkJaWNoZGV2LT5sdmlfZnJhZyAlPSBpY2hkZXYtPmZyYWdzOwogCQlpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYgKyBpY2hkZXYtPmx2aV9mcmFnICogaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAibmV3OiBiZGJhclslaV0gPSAweCV4IFsweCV4XSwgcHJlZmV0Y2ggPSAlaSwgIgotCSAgICAgICAiYWxsID0gMHgleCwgMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sIHByZWZldGNoID0gJWksIGFsbCA9IDB4JXgsIDB4JXhcbiIsCiAJICAgICAgIGljaGRldi0+bHZpICogMiwgaWNoZGV2LT5iZGJhcltpY2hkZXYtPmx2aSAqIDJdLAogCSAgICAgICBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksCiAJICAgICAgIGlubChwb3J0ICsgNCksIGluYihwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKTsKQEAgLTIyODksNyArMjI5Niw4IEBACiAJCWFjOTcubnVtID0gaTsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKIAkJCWlmIChlcnIgIT0gLUVBQ0NFUykKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjb2RlYyAjJWRcbiIsIGkpOworCQkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgY29kZWMgIyVkXG4iLCBpKTsKIAkJCWlmIChpID09IDApCiAJCQkJZ290byBfX2VycjsKIAkJfQpAQCAtMjQ0MSw3ICsyNDQ5LDcgQEAKIAkJCXJldHVybiAwOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd2FybSByZXNldCBzdGlsbCBpbiBwcm9ncmVzcz8gWzB4JXhdXG4iLAorCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgd2FybSByZXNldCBzdGlsbCBpbiBwcm9ncmVzcz8gWzB4JXhdXG4iLAogCQkgICBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkpOwogCXJldHVybiAtRUlPOwogfQpAQCAtMjQ4Myw3ICsyNDkxLDggQEAKIAkJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCQlpZiAoISBzdGF0dXMpIHsKIAkJCS8qIG5vIGNvZGVjIGlzIGZvdW5kICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKIAkJCQkgICBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTI1NDcsNyArMjU1Niw3IEBACiAJCQlnb3RvIF9fb2s7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZXNldCBmYWlsZWQuXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOwogCWlmIChwcm9iaW5nKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMjU5MSw3ICsyNjAwLDcgQEAKICAgICAgICAgCQkgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MDogcmVzZXQgb2YgcmVnaXN0ZXJzIGZhaWxlZD9cbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJyZXNldCBvZiByZWdpc3RlcnMgZmFpbGVkP1xuIik7CiAgICAgICAgIH0KIAkvKiBpbml0aWFsaXplIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3RzICovCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQpAQCAtMjY5Miw4ICsyNzAxLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNzAxLDggKzI3MDksOCBAQAogCXNuZF9pbnRlbDh4MF9jaGlwX2luaXQoY2hpcCwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iLAorCQkJcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNzc5LDcgKzI3ODcsOCBAQAogICAgICAgX19hZ2FpbjoKIAlzdWJzID0gY2hpcC0+cGNtWzBdLT5zdHJlYW1zWzBdLnN1YnN0cmVhbTsKIAlpZiAoISBzdWJzIHx8IHN1YnMtPmRtYV9idWZmZXIuYnl0ZXMgPCBJTlRFTDhYMF9URVNUQlVGX1NJWkUpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOwogCQlyZXR1cm47CiAJfQogCWljaGRldiA9ICZjaGlwLT5pY2hkW0lDSERfUENNT1VUXTsKQEAgLTI3ODksNyArMjc5OCw4IEBACiAKIAkvKiBzZXQgcmF0ZSAqLwogCWlmIChzbmRfYWM5N19zZXRfcmF0ZShjaGlwLT5hYzk3WzBdLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgNDgwMDApIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc2V0IGFjOTcgcmF0ZTogY2xvY2sgPSAlZFxuIiwgY2hpcC0+YWM5N19idXMtPmNsb2NrKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3Qgc2V0IGFjOTcgcmF0ZTogY2xvY2sgPSAlZFxuIiwKKwkJCWNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CiAJCXJldHVybjsKIAl9CiAJc25kX2ludGVsOHgwX3NldHVwX3BlcmlvZHMoY2hpcCwgaWNoZGV2KTsKQEAgLTI4NDMsNyArMjg1Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlpZiAocG9zID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IG1lYXN1cmUgLSB1bnJlbGlhYmxlIERNQSBwb3NpdGlvbi4uXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibWVhc3VyZSAtIHVucmVsaWFibGUgRE1BIHBvc2l0aW9uLi5cbiIpOwogCSAgICAgIF9fcmV0cnk6CiAJCWlmIChhdHRlbXB0IDwgMykgewogCQkJbXNsZWVwKDMwMCk7CkBAIC0yODU3LDE2ICsyODY4LDE3IEBACiAJdCA9IHN0b3BfdGltZS50dl9zZWMgLSBzdGFydF90aW1lLnR2X3NlYzsKIAl0ICo9IDEwMDAwMDA7CiAJdCArPSAoc3RvcF90aW1lLnR2X25zZWMgLSBzdGFydF90aW1lLnR2X25zZWMpIC8gMTAwMDsKLQlwcmludGsoS0VSTl9JTkZPICIlczogbWVhc3VyZWQgJWx1IHVzZWNzICglbHUgc2FtcGxlcylcbiIsIF9fZnVuY19fLCB0LCBwb3MpOworCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJICIlczogbWVhc3VyZWQgJWx1IHVzZWNzICglbHUgc2FtcGxlcylcbiIsIF9fZnVuY19fLCB0LCBwb3MpOwogCWlmICh0ID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6ID8/IGNhbGN1bGF0aW9uIGVycm9yLi5cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIj8/IGNhbGN1bGF0aW9uIGVycm9yLi5cbiIpOwogCQlnb3RvIF9fcmV0cnk7CiAJfQogCXBvcyAqPSAxMDAwOwogCXBvcyA9IChwb3MgLyB0KSAqIDEwMDAgKyAoKHBvcyAlIHQpICogMTAwMCkgLyB0OwogCWlmIChwb3MgPCA0MDAwMCB8fCBwb3MgPj0gNjAwMDApIHsKIAkJLyogYWJub3JtYWwgdmFsdWUuIGh3IHByb2JsZW0/ICovCi0JCXByaW50ayhLRVJOX0lORk8gImludGVsOHgwOiBtZWFzdXJlZCBjbG9jayAlbGQgcmVqZWN0ZWRcbiIsIHBvcyk7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIm1lYXN1cmVkIGNsb2NrICVsZCByZWplY3RlZFxuIiwgcG9zKTsKIAkJZ290byBfX3JldHJ5OwogCX0gZWxzZSBpZiAocG9zID4gNDA1MDAgJiYgcG9zIDwgNDE1MDApCiAJCS8qIGZpcnN0IGV4Y2VwdGlvbiAtIDQxMDAwSHogcmVmZXJlbmNlIGNsb2NrICovCkBAIC0yODc4LDcgKzI4OTAsNyBAQAogCQkvKiBub3QgNDgwMDBIeiwgdHVuaW5nIHRoZSBjbG9jay4uICovCiAJCWNoaXAtPmFjOTdfYnVzLT5jbG9jayA9IChjaGlwLT5hYzk3X2J1cy0+Y2xvY2sgKiA0ODAwMCkgLyBwb3M7CiAgICAgICBfX2VuZDoKLQlwcmludGsoS0VSTl9JTkZPICJpbnRlbDh4MDogY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CisJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CiAJc25kX2FjOTdfdXBkYXRlX3Bvd2VyKGNoaXAtPmFjOTdbMF0sIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCAwKTsKIH0KIApAQCAtMjg5OSw3ICsyOTExLDcgQEAKIAl3bCA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgaW50ZWw4eDBfY2xvY2tfbGlzdCk7CiAJaWYgKCF3bCkKIAkJcmV0dXJuIDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6IHdoaXRlIGxpc3QgcmF0ZSBmb3IgJTA0eDolMDR4IGlzICVpXG4iLAorCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIndoaXRlIGxpc3QgcmF0ZSBmb3IgJTA0eDolMDR4IGlzICVpXG4iLAogCSAgICAgICBwY2ktPnN1YnN5c3RlbV92ZW5kb3IsIHBjaS0+c3Vic3lzdGVtX2RldmljZSwgd2wtPnZhbHVlKTsKIAljaGlwLT5hYzk3X2J1cy0+Y2xvY2sgPSB3bC0+dmFsdWU7CiAJcmV0dXJuIDE7CkBAIC0zMDAzLDcgKzMwMTUsNyBAQAogCiBmaW5pOgogCWlmIChtc2cgIT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6ICVzIG9wdGltaXphdGlvblxuIiwgbXNnKTsKKwkJZGV2X2luZm8oJnBjaS0+ZGV2LCAiJXMgb3B0aW1pemF0aW9uXG4iLCBtc2cpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTMwOTgsNyArMzExMCw3IEBACiAJZWxzZQogCQljaGlwLT5hZGRyID0gcGNpX2lvbWFwKHBjaSwgMCwgMCk7CiAJaWYgKCFjaGlwLT5hZGRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKIAkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTMxMDcsNyArMzExOSw3IEBACiAJZWxzZQogCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAxLCAwKTsKIAlpZiAoIWNoaXAtPmJtYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ29udHJvbGxlciBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzE1Miw3ICszMTY0LDcgQEAKIAkJCQljaGlwLT5iZGJhcnNfY291bnQgKiBzaXplb2YodTMyKSAqIElDSF9NQVhfRlJBR1MgKiAyLAogCQkJCSZjaGlwLT5iZGJhcnMpIDwgMCkgewogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IGNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnNcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyogdGFibGVzIG11c3QgYmUgYWxpZ25lZCB0byA4IGJ5dGVzIGhlcmUsIGJ1dCB0aGUga2VybmVsIHBhZ2VzCkBAIC0zMjA2LDcgKzMyMTgsNyBAQAogCS8qIHJlcXVlc3QgaXJxIGFmdGVyIGluaXRpYWxpemFpbmcgaW50X3N0YV9tYXNrLCBldGMgKi8KIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0zMjE3LDggKzMyMjksNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2ludGVsOHgwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTMyNjUsMTIgKzMyNzUsMTIgQEAKIAl3ID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBzcGRpZl9hY2xpbmtfZGVmYXVsdHMpOwogCWlmICh3KSB7CiAJCWlmICh3LT52YWx1ZSkKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTwotCQkJCSAgICAiaW50ZWw4eDA6IFVzaW5nIFNQRElGIG92ZXIgQUMtTGluayBmb3IgJXNcbiIsCisJCQlkZXZfZGJnKCZwY2ktPmRldiwKKwkJCQkiVXNpbmcgU1BESUYgb3ZlciBBQy1MaW5rIGZvciAlc1xuIiwKIAkJCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHcpKTsKIAkJZWxzZQotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkJICAgICJpbnRlbDh4MDogVXNpbmcgaW50ZWdyYXRlZCBTUERJRiBETUEgZm9yICVzXG4iLAorCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJIlVzaW5nIGludGVncmF0ZWQgU1BESUYgRE1BIGZvciAlc1xuIiwKIAkJCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHcpKTsKIAkJcmV0dXJuIHctPnZhbHVlOwogCX0KQEAgLTMyODUsNyArMzI5NSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCAzNTczYzExLi5iNTRkM2U5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0zMzQsNyArMzM0LDggQEAKIAkvKiBhY2Nlc3MgdG8gc29tZSBmb3JiaWRkZW4gKG5vbiBleGlzdGVudCkgYWM5NyByZWdpc3RlcnMgd2lsbCBub3QKIAkgKiByZXNldCB0aGUgc2VtYXBob3JlLiBTbyBldmVuIGlmIHlvdSBkb24ndCBnZXQgdGhlIHNlbWFwaG9yZSwgc3RpbGwKIAkgKiBjb250aW51ZSB0aGUgYWNjZXNzLiBXZSBkb24ndCBuZWVkIHRoZSBzZW1hcGhvcmUgYW55d2F5LiAqLwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3NlbWFwaG9yZTogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBbMHgleF1bMHgleF1cbiIsCisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJjb2RlY19zZW1hcGhvcmU6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgWzB4JXhdWzB4JXhdXG4iLAogCQkJaWdldGJ5dGUoY2hpcCwgSUNIUkVHKEFDQ19TRU1BKSksIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSk7CiAJaWFnZXR3b3JkKGNoaXAsIDApOwkvKiBjbGVhciBzZW1hcGhvcmUgZmxhZyAqLwogCS8qIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgc2VtYXBob3JlICovCkBAIC0zNDksNyArMzUwLDkgQEAKIAkKIAlpZiAoc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfd3JpdGUgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsIGFjOTctPm51bSwgcmVnKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlY193cml0ZSAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCQlhYzk3LT5udW0sIHJlZyk7CiAJfQogCWlhcHV0d29yZChjaGlwLCByZWcgKyBhYzk3LT5udW0gKiAweDgwLCB2YWwpOwogfQpAQCAtMzYzLDcgKzM2Niw5IEBACiAKIAlpZiAoc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQlyZXMgPSAweGZmZmY7CiAJfSBlbHNlIHsKIAkJcmVzID0gaWFnZXR3b3JkKGNoaXAsIHJlZyArIGFjOTctPm51bSAqIDB4ODApOwpAQCAtMzcyLDcgKzM3Nyw5IEBACiAJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwKIAkJCQkgIHRtcCAmIH4oSUNIX1NSSXxJQ0hfUFJJfElDSF9UUkl8SUNIX0dTQ0kpKTsKIAkJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkICVkOiByZWFkIHRpbWVvdXQgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsIGFjOTctPm51bSwgcmVnKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJImNvZGVjX3JlYWQgJWQ6IHJlYWQgdGltZW91dCBmb3IgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQkJcmVzID0gMHhmZmZmOwogCQl9CiAJfQpAQCAtNDEyLDcgKzQxOSw3IEBACiAJCQliZGJhcltpZHggKyAxXSA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDAgfCAvKiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLwogCQkJCQkJICAgICBpY2hkZXYtPmZyYWdzaXplID4+IGNoaXAtPnBjbV9wb3Nfc2hpZnQpOwogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHICJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYmRiYXJbJWldID0gMHgleCBbMHgleF1cbiIsCiAJCQkgICAgICAgaWR4ICsgMCwgYmRiYXJbaWR4ICsgMF0sIGJkYmFyW2lkeCArIDFdKTsKIAkJCSovCiAJCX0KQEAgLTQyNCw4ICs0MzEsOCBAQAogCWljaGRldi0+bHZpX2ZyYWcgPSBJQ0hfUkVHX0xWSV9NQVNLICUgaWNoZGV2LT5mcmFnczsKIAlpY2hkZXYtPnBvc2l0aW9uID0gMDsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgIgotCSAgICAgICAicGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKIAkgICAgICAgaWNoZGV2LT5sdmlfZnJhZywgaWNoZGV2LT5mcmFncywgaWNoZGV2LT5mcmFnc2l6ZSwKIAkgICAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2VuZGlmCkBAIC00NzAsOCArNDc3LDggQEAKIAkJCQkJCQkgICAgIGljaGRldi0+bHZpX2ZyYWcgKgogCQkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2lmIDAKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sICIKLQkJICAgICAgICJwcmVmZXRjaCA9ICVpLCBhbGwgPSAweCV4LCAweCV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJuZXc6IGJkYmFyWyVpXSA9IDB4JXggWzB4JXhdLCBwcmVmZXRjaCA9ICVpLCBhbGwgPSAweCV4LCAweCV4XG4iLAogCQkgICAgICAgaWNoZGV2LT5sdmkgKiAyLCBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0sCiAJCSAgICAgICBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksCiAJCSAgICAgICBpbmwocG9ydCArIDQpLCBpbmIocG9ydCArIElDSF9SRUdfT0ZGX0NSKSk7CkBAIC04NTAsNyArODU3LDggQEAKIAlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKIAlhYzk3Lm51bSA9IGdsb2Jfc3RhICYgSUNIX1NDUiA/IDEgOiAwOwogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZ4OTcpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGluaXRpYWxpemUgY29kZWMgIyVkXG4iLCBhYzk3Lm51bSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIGNvZGVjICMlZFxuIiwgYWM5Ny5udW0pOwogCQlpZiAoYWM5Ny5udW0gPT0gMCkKIAkJCWdvdG8gX19lcnI7CiAJCXJldHVybiBlcnI7CkBAIC05MDEsNyArOTA5LDcgQEAKIAkJCWdvdG8gX19vazsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwKIAkJICAgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKIAlyZXR1cm4gLUVJTzsKIApAQCAtOTIxLDcgKzkyOSw4IEBACiAJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKIAkJaWYgKCEgc3RhdHVzKSB7CiAJCQkvKiBubyBjb2RlYyBpcyBmb3VuZCAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCiAJCQkJICAgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xMDQyLDE2ICsxMDUxLDE1IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MG06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwbV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDBtOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iLAorCQkJcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMTY1LDcgKzExNzMsNyBAQAogCWVsc2UKIAkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDAsIDApOwogCWlmICghY2hpcC0+YWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9pbnRlbDh4MG1fZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE3NCw3ICsxMTgyLDcgQEAKIAllbHNlCiAJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDEsIDApOwogCWlmICghY2hpcC0+Ym1hZGRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9pbnRlbDh4MG1fZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE4Miw3ICsxMTkwLDcgQEAKICBwb3J0X2luaXRlZDoKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MG1faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2ludGVsOHgwbV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEyNDMsOCArMTI1MSw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfaW50ZWw4eDBtID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyODMsNyArMTI4OSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKaW5kZXggOWNmOTgyOS4uOGYzNmQ3NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKKysrIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKQEAgLTI0MTgsOCArMjQxOCw2IEBACiAKICAgICAgICAgc25kX2tvcmcxMjEyX3Byb2NfaW5pdChrb3JnMTIxMik7CiAgICAgICAgIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogICAgICAgICAqIHJjaGlwID0ga29yZzEyMTI7CiAJcmV0dXJuIDA7CiAKQEAgLTI0NDUsNyArMjQ0Myw4IEBACiAJCWRldisrOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwppbmRleCAwNTY4NTQwLi42ODgyNGNkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5jCkBAIC03NSw3ICs3NSw3IEBACiBzdGF0aWMgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogI2RlZmluZSB2ZXJib3NlX2RlYnVnKGZtdCwgYXJncy4uLikJCQlcCi0JZG8geyBpZiAoZGVidWcgPiAxKSBwcmludGsoS0VSTl9ERUJVRyBTRlggZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCWRvIHsgaWYgKGRlYnVnID4gMSkgcHJfZGVidWcoU0ZYIGZtdCwgIyNhcmdzKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIHZlcmJvc2VfZGVidWcoZm10LCBhcmdzLi4uKQogI2VuZGlmCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJCXZlcmJvc2VfZGVidWcoImdldF9yZXNwb25zZTogJXgsICV4XG4iLAogCQkJCSAgICAgIGNoaXAtPnJlcywgY2hpcC0+cmVzX2V4KTsKIAkJCWlmIChjaGlwLT5yZXNfZXggJiBMT0xBX1JJUkJfRVhfRVJST1IpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiUklSQiBFUlJPUjogIgorCQkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIlJJUkIgRVJST1I6ICIKIAkJCQkgICAgICAgIk5JRD0leCwgdmVyYj0leCwgZGF0YT0leCwgZXh0PSV4XG4iLAogCQkJCSAgICAgICBjaGlwLT5sYXN0X2NtZF9uaWQsCiAJCQkJICAgICAgIGNoaXAtPmxhc3RfdmVyYiwgY2hpcC0+bGFzdF9kYXRhLApAQCAtMTgyLDkgKzE4Miw5IEBACiAJCXVkZWxheSgyMCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiUklSQiByZXNwb25zZSBlcnJvclxuIik7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiUklSQiByZXNwb25zZSBlcnJvclxuIik7CiAJaWYgKCFjaGlwLT5wb2xsaW5nX21vZGUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBTRlggInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGVcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJzd2l0Y2hpbmcgdG8gcG9sbGluZyBtb2RlXG4iKTsKIAkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAJaWYgKCFnY3RsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCByZXNldCBjb250cm9sbGVyXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXQgY29udHJvbGxlclxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ1Miw0MCArNDUyLDQwIEBACiAKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgMCwgTE9MQV9QQVJfVkVORE9SX0lELCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIFZFTkRPUl9JRFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBWRU5ET1JfSURcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl2YWwgPj49IDE2OwogCWlmICh2YWwgIT0gMHgxMzY5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIlVua25vd24gY29kZWMgdmVuZG9yIDB4JXhcbiIsIHZhbCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiVW5rbm93biBjb2RlYyB2ZW5kb3IgMHgleFxuIiwgdmFsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIDEsIExPTEFfUEFSX0ZVTkNUSU9OX1RZUEUsICZ2YWwpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkNhbid0IHJlYWQgRlVOQ1RJT05fVFlQRVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBGVU5DVElPTl9UWVBFXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKHZhbCAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIlVua25vd24gZnVuY3Rpb24gdHlwZSAlZFxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJVbmtub3duIGZ1bmN0aW9uIHR5cGUgJWRcbiIsIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVyciA9IGxvbGFfcmVhZF9wYXJhbShjaGlwLCAxLCBMT0xBX1BBUl9TUEVDSUZJQ19DQVBTLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIFNQRUNDQVBTXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIFNQRUNDQVBTXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJY2hpcC0+bG9sYV9jYXBzID0gdmFsOwogCWNoaXAtPnBpbltDQVBUXS5udW1fcGlucyA9IExPTEFfQUZHX0lOUFVUX1BJTl9DT1VOVChjaGlwLT5sb2xhX2NhcHMpOwogCWNoaXAtPnBpbltQTEFZXS5udW1fcGlucyA9IExPTEFfQUZHX09VVFBVVF9QSU5fQ09VTlQoY2hpcC0+bG9sYV9jYXBzKTsKLQlzbmRfcHJpbnRkZChTRlggInNwZWNjYXBzPTB4JXgsIHBpbnMgaW49JWQsIG91dD0lZFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNwZWNjYXBzPTB4JXgsIHBpbnMgaW49JWQsIG91dD0lZFxuIiwKIAkJICAgIGNoaXAtPmxvbGFfY2FwcywKIAkJICAgIGNoaXAtPnBpbltDQVBUXS5udW1fcGlucywgY2hpcC0+cGluW1BMQVldLm51bV9waW5zKTsKIAogCWlmIChjaGlwLT5waW5bQ0FQVF0ubnVtX3BpbnMgPiBNQVhfQVVESU9fSU5PVVRfQ09VTlQgfHwKIAkgICAgY2hpcC0+cGluW1BMQVldLm51bV9waW5zID4gTUFYX0FVRElPX0lOT1VUX0NPVU5UKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkludmFsaWQgTG9sYS1zcGVjIGNhcHMgMHgleFxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJJbnZhbGlkIExvbGEtc3BlYyBjYXBzIDB4JXhcbiIsIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTg2LDcgKzU4Niw2IEBACiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTYwOSw3ICs2MDgsNyBAQAogCQljaGlwLT5zYW1wbGVfcmF0ZV9tYXggPSAxOTIwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWAorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCiAJCQkgICAiSW52YWxpZCBncmFudWxhcml0eSAlZCwgcmVzZXQgdG8gJWRcbiIsCiAJCQkgICBjaGlwLT5ncmFudWxhcml0eSwgTE9MQV9HUkFOVUxBUklUWV9NQVgpOwogCQljaGlwLT5ncmFudWxhcml0eSA9IExPTEFfR1JBTlVMQVJJVFlfTUFYOwpAQCAtNjE4LDcgKzYxNyw3IEBACiAJfQogCWNoaXAtPnNhbXBsZV9yYXRlX21pbiA9IHNhbXBsZV9yYXRlX21pbltkZXZdOwogCWlmIChjaGlwLT5zYW1wbGVfcmF0ZV9taW4gPiBjaGlwLT5zYW1wbGVfcmF0ZV9tYXgpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICJJbnZhbGlkIHNhbXBsZV9yYXRlX21pbiAlZCwgcmVzZXQgdG8gMTYwMDBcbiIsCiAJCQkgICBjaGlwLT5zYW1wbGVfcmF0ZV9taW4pOwogCQljaGlwLT5zYW1wbGVfcmF0ZV9taW4gPSAxNjAwMDsKQEAgLTYzNiw3ICs2MzUsNyBAQAogCWNoaXAtPmJhclsxXS5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CiAJY2hpcC0+YmFyWzFdLnJlbWFwX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAyKTsKIAlpZiAoIWNoaXAtPmJhclswXS5yZW1hcF9hZGRyIHx8ICFjaGlwLT5iYXJbMV0ucmVtYXBfYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiaW9yZW1hcCBlcnJvclxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW9yZW1hcCBlcnJvclxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBlcnJvdXQ7CiAJfQpAQCAtNjQ5LDcgKzY0OCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGxvbGFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGVycm91dDsKIAl9CkBAIC02NjAsNyArNjU5LDcgQEAKIAljaGlwLT5wY21bQ0FQVF0ubnVtX3N0cmVhbXMgPSAoZGV2ZXIgPj4gMCkgJiAweDNmZjsKIAljaGlwLT5wY21bUExBWV0ubnVtX3N0cmVhbXMgPSAoZGV2ZXIgPj4gMTApICYgMHgzZmY7CiAJY2hpcC0+dmVyc2lvbiA9IChkZXZlciA+PiAyNCkgJiAweGZmOwotCXNuZF9wcmludGRkKFNGWCAic3RyZWFtcyBpbj0lZCwgb3V0PSVkLCB2ZXJzaW9uPTB4JXhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdHJlYW1zIGluPSVkLCBvdXQ9JWQsIHZlcnNpb249MHgleFxuIiwKIAkJICAgIGNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtcywgY2hpcC0+cGNtW1BMQVldLm51bV9zdHJlYW1zLAogCQkgICAgY2hpcC0+dmVyc2lvbik7CiAKQEAgLTY2OSw3ICs2NjgsNyBAQAogCSAgICBjaGlwLT5wY21bUExBWV0ubnVtX3N0cmVhbXMgPiBNQVhfU1RSRUFNX09VVF9DT1VOVCB8fAogCSAgICAoIWNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtcyAmJgogCSAgICAgIWNoaXAtPnBjbVtQTEFZXS5udW1fc3RyZWFtcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiaW52YWxpZCBERVZFUiA9ICV4XG4iLCBkZXZlcik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBERVZFUiA9ICV4XG4iLCBkZXZlcik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3V0OwogCX0KQEAgLTY4MCw3ICs2NzksNyBAQAogCiAJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgZGV2aWNlIFtjYXJkXSFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkVycm9yIGNyZWF0aW5nIGRldmljZSBbY2FyZF0hXG4iKTsKIAkJZ290byBlcnJvdXQ7CiAJfQogCkBAIC03MTcsMTQgKzcxNiwxMyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgY2FyZCFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkVycm9yIGNyZWF0aW5nIGNhcmQhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAllcnIgPSBsb2xhX2NyZWF0ZShjYXJkLCBwY2ksIGRldiwgJmNoaXApOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9jbG9jay5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9jbG9jay5jCmluZGV4IGViMWQ2YjkuLjJiZWY2YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfY2xvY2suYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX2Nsb2NrLmMKQEAgLTEyOCwyMSArMTI4LDIxIEBACiAKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgbmlkLCBMT0xBX1BBUl9BVURJT19XSURHRVRfQ0FQLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IHJlYWQgd2NhcHMgZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKCh2YWwgJiAweGZmZjAwMDAwKSAhPSAweDAxZjAwMDAwKSB7IC8qIHRlc3QgU3ViVHlwZSBhbmQgVHlwZSAqLwotCQlzbmRfcHJpbnRkZCgiTm8gdmFsaWQgY2xvY2sgd2lkZ2V0XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJObyB2YWxpZCBjbG9jayB3aWRnZXRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAljaGlwLT5jbG9jay5uaWQgPSBuaWQ7CiAJY2hpcC0+Y2xvY2suaXRlbXMgPSB2YWwgJiAweGZmOwotCXNuZF9wcmludGRkKCJjbG9ja19saXN0IG5pZD0leCwgZW50cmllcz0lZFxuIiwgbmlkLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tfbGlzdCBuaWQ9JXgsIGVudHJpZXM9JWRcbiIsIG5pZCwKIAkJICAgIGNoaXAtPmNsb2NrLml0ZW1zKTsKIAlpZiAoY2hpcC0+Y2xvY2suaXRlbXMgPiBNQVhfU0FNUExFX0NMT0NLX0NPVU5UKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkNMT0NLX0xJU1QgdG9vIGJpZzogJWRcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ0xPQ0tfTElTVCB0b28gYmlnOiAlZFxuIiwKIAkJICAgICAgIGNoaXAtPmNsb2NrLml0ZW1zKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCWVyciA9IGxvbGFfY29kZWNfcmVhZChjaGlwLCBuaWQsIExPTEFfVkVSQl9HRVRfQ0xPQ0tfTElTVCwKIAkJCQkgICAgICBpZHgsIDAsICZ2YWwsICZyZXNfZXgpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCBDTE9DS19MSVNUXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBDTE9DS19MSVNUXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBTRlggImVycm9yIGluIGVuYWJsZV9jbG9ja19ldmVudHMgJWRcbiIsCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIGluIGVuYWJsZV9jbG9ja19ldmVudHMgJWRcbiIsCiAJCSAgICAgICByZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICJlcnJvciBpbiBzZXRfY2xvY2sgJWRcbiIsIHJlcyk7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIGluIHNldF9jbG9jayAlZFxuIiwgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jCmluZGV4IDUyYzhkNmIuLjc4MmY0ZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX21peGVyLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlwaW4tPm5pZCA9IG5pZDsKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgbmlkLCBMT0xBX1BBUl9BVURJT19XSURHRVRfQ0FQLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IHJlYWQgd2NhcHMgZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCXZhbCAmPSAweDAwZjAwZmZmOyAvKiB0ZXN0IFRZUEUgYW5kIGJpdHMgMC4uMTEgKi8KQEAgLTQ4LDcgKzQ4LDcgQEAKIAllbHNlIGlmICh2YWwgPT0gMHgwMDQwMDAwYyAmJiBkaXIgPT0gUExBWSkgLyogRGlnPTAsIE91dEFtcC9vdnJkICovCiAJCXBpbi0+aXNfYW5hbG9nID0gdHJ1ZTsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLCB2YWwsIG5pZCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLCB2YWwsIG5pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjIsNyArNjIsNyBAQAogCWVsc2UKIAkJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQU1QX0lOX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCBBTVAtY2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIEFNUC1jYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzksNyArNzksNyBAQAogCWVyciA9IGxvbGFfY29kZWNfcmVhZChjaGlwLCBuaWQsIExPTEFfVkVSQl9HRVRfTUFYX0xFVkVMLCAwLCAwLCAmdmFsLAogCQkJICAgICAgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgZ2V0IE1BWF9MRVZFTCAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IGdldCBNQVhfTEVWRUwgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGluLT5tYXhfbGV2ZWwgPSB2YWwgJiAweDNmZjsgICAvKiAxMCBiaXRzICovCkBAIC0xMTksMTIgKzExOSwxMiBAQAogCiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQVVESU9fV0lER0VUX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCB3Y2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICgodmFsICYgMHhmZmYwMDAwMCkgIT0gMHgwMmYwMDAwMCkgeyAvKiB0ZXN0IFN1YlR5cGUgYW5kIFR5cGUgKi8KLQkJc25kX3ByaW50ZGQoIk5vIHZhbGlkIG1peGVyIHdpZGdldFxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTm8gdmFsaWQgbWl4ZXIgd2lkZ2V0XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKi8KIAlpZiAoY2hpcC0+bWl4ZXIuc3JjX3N0cmVhbV9vdXRfb2ZzID4gTUFYX0FVRElPX0lOT1VUX0NPVU5UIHx8CiAJICAgIGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzID4gTUFYX1NUUkVBTV9JTl9DT1VOVCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJJbnZhbGlkIG1peGVyIHdpZGdldCBzaXplXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJJbnZhbGlkIG1peGVyIHdpZGdldCBzaXplXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJKCgoMVUgPDwgY2hpcC0+bWl4ZXIuZGVzdF9waHlzX291dHMpIC0gMSkKIAkJIDw8IGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzKTsKIAotCXNuZF9wcmludGRkKCJNaXhlciBzcmNfbWFzaz0leCwgZGVzdF9tYXNrPSV4XG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTWl4ZXIgc3JjX21hc2s9JXgsIGRlc3RfbWFzaz0leFxuIiwKIAkJICAgIGNoaXAtPm1peGVyLnNyY19tYXNrLCBjaGlwLT5taXhlci5kZXN0X21hc2spOwogCiAJcmV0dXJuIDA7CkBAIC0yMzYsNyArMjM2LDggQEAKIAkgICAgKGdhaW4gPT0gcmVhZHcoJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2FpbltpZF0pKSkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfcHJpbnRkZCgibG9sYV9taXhlcl9zZXRfc3JjX2dhaW4gKGlkPSVkLCBnYWluPSVkKSBlbmFibGU9JXhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJsb2xhX21peGVyX3NldF9zcmNfZ2FpbiAoaWQ9JWQsIGdhaW49JWQpIGVuYWJsZT0leFxuIiwKIAkJCWlkLCBnYWluLCB2YWwpOwogCXdyaXRldyhnYWluLCAmY2hpcC0+bWl4ZXIuYXJyYXktPnNyY19nYWluW2lkXSk7CiAJd3JpdGVsKHZhbCwgJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2Fpbl9lbmFibGUpOwpAQCAtNDA5LDcgKzQxMCw4IEBACiAJCXJldHVybiAwOwogCWlmIChleHRlcm5hbF9jYWxsKQogCQlsb2xhX2NvZGVjX2ZsdXNoKGNoaXApOwotCXNuZF9wcmludGRkKCJzZXRfYW5hbG9nX3ZvbHVtZSAoZGlyPSVkIGlkeD0lZCwgdm9sdW1lPSVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInNldF9hbmFsb2dfdm9sdW1lIChkaXI9JWQgaWR4PSVkLCB2b2x1bWU9JWQpXG4iLAogCQkJZGlyLCBpZHgsIHZhbCk7CiAJZXJyID0gbG9sYV9jb2RlY193cml0ZShjaGlwLCBwaW4tPm5pZCwKIAkJCSAgICAgICBMT0xBX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIHZhbCwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYwppbmRleCA1ZWE4NWU4Li4zYmQ2OTg1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJcmV0dXJuOwogCQltc2xlZXAoMSk7CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICJTUlNUIG5vdCBjbGVhciAoc3RyZWFtICVkKVxuIiwgc3RyLT5kc2QpOworCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIlNSU1Qgbm90IGNsZWFyIChzdHJlYW0gJWQpXG4iLCBzdHItPmRzZCk7CiB9CiAKIHN0YXRpYyBpbnQgbG9sYV9zdHJlYW1fd2FpdF9mb3JfZmlmbyhzdHJ1Y3QgbG9sYSAqY2hpcCwKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJcmV0dXJuIDA7CiAJCW1zbGVlcCgxKTsKIAl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyBTRlggIkZJRk8gbm90IHJlYWR5IChzdHJlYW0gJWQpXG4iLCBzdHItPmRzZCk7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBub3QgcmVhZHkgKHN0cmVhbSAlZClcbiIsIHN0ci0+ZHNkKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTU2LDcgKzE1Niw3IEBACiAJCQlyZXR1cm4gMDsKIAkJbXNsZWVwKDEpOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiRklGTyBub3QgcmVhZHkgKHBlbmRpbmcgJWQpXG4iLCBwZW5kaW5nIC0gMSk7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBub3QgcmVhZHkgKHBlbmRpbmcgJWQpXG4iLCBwZW5kaW5nIC0gMSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTM3Myw3ICszNzMsNyBAQAogCXJldHVybiAwOwogCiAgZXJyb3I6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIlRvbyBtYW55IEJETCBlbnRyaWVzOiBidWZmZXI9JWQsIHBlcmlvZD0lZFxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlRvbyBtYW55IEJETCBlbnRyaWVzOiBidWZmZXI9JWQsIHBlcmlvZD0lZFxuIiwKIAkJICAgc3RyLT5idWZzaXplLCBwZXJpb2RfYnl0ZXMpOwogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtNDE1LDcgKzQxNSw3IEBACiAJZXJyID0gbG9sYV9jb2RlY19yZWFkKGNoaXAsIHN0ci0+bmlkLCBMT0xBX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQsCiAJCQkgICAgICBzdHItPmZvcm1hdF92ZXJiLCAwLCAmdmFsLCBOVUxMKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW5ub3Qgc2V0IHN0cmVhbSBmb3JtYXQgMHgleFxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW5ub3Qgc2V0IHN0cmVhbSBmb3JtYXQgMHgleFxuIiwKIAkJICAgICAgIHN0ci0+Zm9ybWF0X3ZlcmIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTQyNyw3ICs0MjcsOCBAQAogCQkJCSAgICAgIExPTEFfVkVSQl9TRVRfQ0hBTk5FTF9TVFJFQU1JRCwgMCwgdmVyYiwKIAkJCQkgICAgICAmdmFsLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBTRlggIkNhbm5vdCBzZXQgc3RyZWFtIGNoYW5uZWwgJWRcbiIsIGkpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkNhbm5vdCBzZXQgc3RyZWFtIGNoYW5uZWwgJWRcbiIsIGkpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTY1MSwxMyArNjUyLDE0IEBACiAJCXN0ci0+ZHNkICs9IE1BWF9TVFJFQU1fSU5fQ09VTlQ7CiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQVVESU9fV0lER0VUX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCB3Y2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoZGlyID09IFBMQVkpIHsKIAkJLyogdGVzdCBUWVBFIGFuZCBiaXRzIDAuLjExIChubyB0ZXN0IGJpdDkgOiBEaWdpdGFsID0gMC8xKSAqLwogCQlpZiAoKHZhbCAmIDB4MDBmMDBkZmYpICE9IDB4MDAwMDAwMTApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBTRlggIkludmFsaWQgd2NhcHMgMHgleCBmb3IgMHgleFxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJJbnZhbGlkIHdjYXBzIDB4JXggZm9yIDB4JXhcbiIsCiAJCQkgICAgICAgdmFsLCBuaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTY2Niw3ICs2NjgsOCBAQAogCQkgKiAoYnVnIDogaWdub3JlIGJpdDg6IENvbm4gbGlzdCA9IDAvMSkKIAkJICovCiAJCWlmICgodmFsICYgMHgwMGYwMGNmZikgIT0gMHgwMDEwMDAxMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkludmFsaWQgd2NhcHMgMHgleCBmb3IgMHgleFxuIiwKIAkJCSAgICAgICB2YWwsIG5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNjc3LDE0ICs2ODAsMTUgQEAKIAogCWVyciA9IGxvbGFfcmVhZF9wYXJhbShjaGlwLCBuaWQsIExPTEFfUEFSX1NUUkVBTV9GT1JNQVRTLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIEZPUk1BVFMgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIEZPUk1BVFMgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJdmFsICY9IDM7CiAJaWYgKHZhbCA9PSAzKQogCQlzdHItPmNhbl9mbG9hdCA9IHRydWU7CiAJaWYgKCEodmFsICYgMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCBmb3JtYXRzIDB4JXggZm9yIDB4JXgiLCB2YWwsIG5pZCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIkludmFsaWQgZm9ybWF0cyAweCV4IGZvciAweCV4IiwgdmFsLCBuaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCmluZGV4IDVmY2FhYTYuLjI3ZjYwY2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCisrKyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCkBAIC0xMTIsMTYgKzExMiwxNiBAQAogCiAJc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemUgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAotCXNuZF9wcmludGQoTFhQICJhbGxvY2F0aW5nIHBpcGUgZm9yICVkIGNoYW5uZWxzXG4iLCBjaGFubmVscyk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhbGxvY2F0aW5nIHBpcGUgZm9yICVkIGNoYW5uZWxzXG4iLCBjaGFubmVscyk7CiAJZXJyID0gbHhfcGlwZV9hbGxvY2F0ZShjaGlwLCAwLCBpc19jYXB0dXJlLCBjaGFubmVscyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImFsbG9jYXRpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgTFhQICJhbGxvY2F0aW5nIHBpcGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAllcnIgPSBseF9zZXRfZ3JhbnVsYXJpdHkoY2hpcCwgcGVyaW9kX3NpemUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzZXR0aW5nIGdyYW51bGFyaXR5IHRvICVsZCBmYWlsZWRcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic2V0dGluZyBncmFudWxhcml0eSB0byAlbGQgZmFpbGVkXG4iLAogCQkJICAgcGVyaW9kX3NpemUpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEzNiwyNCArMTM2LDI0IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgaXNfY2FwdHVyZSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCi0Jc25kX3ByaW50ZChMWFAgInNldHRpbmcgc3RyZWFtIGZvcm1hdFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHN0cmVhbSBmb3JtYXRcbiIpOwogCWVyciA9IGx4X3N0cmVhbV9zZXRfZm9ybWF0KGNoaXAsIHJ1bnRpbWUsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzZXR0aW5nIHN0cmVhbSBmb3JtYXQgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHN0cmVhbSBmb3JtYXQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAic3RhcnRpbmcgcGlwZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdGFydGluZyBwaXBlXG4iKTsKIAllcnIgPSBseF9waXBlX3N0YXJ0KGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzdGFydGluZyBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmcgcGlwZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGQoTFhQICJ3YWl0aW5nIGZvciBwaXBlIHRvIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIndhaXRpbmcgZm9yIHBpcGUgdG8gc3RhcnRcbiIpOwogCWVyciA9IGx4X3BpcGVfd2FpdF9mb3Jfc3RhcnQoY2hpcCwgMCwgaXNfY2FwdHVyZSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIndhaXRpbmcgZm9yIHBpcGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ3YWl0aW5nIGZvciBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNjcsMjQgKzE2NywyNCBAQAogCWludCBlcnIgPSAwOwogCWludCBpc19jYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAKLQlzbmRfcHJpbnRkKExYUCAicGF1c2luZyBwaXBlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInBhdXNpbmcgcGlwZVxuIik7CiAJZXJyID0gbHhfcGlwZV9wYXVzZShjaGlwLCAwLCBpc19jYXB0dXJlKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAicGF1c2luZyBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAicGF1c2luZyBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3ByaW50ZChMWFAgIndhaXRpbmcgZm9yIHBpcGUgdG8gYmVjb21lIGlkbGVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdGluZyBmb3IgcGlwZSB0byBiZWNvbWUgaWRsZVxuIik7CiAJZXJyID0gbHhfcGlwZV93YWl0X2Zvcl9pZGxlKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJ3YWl0aW5nIGZvciBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdGluZyBmb3IgcGlwZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGQoTFhQICJzdG9wcGluZyBwaXBlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nIHBpcGVcbiIpOwogCWVyciA9IGx4X3BpcGVfc3RvcChjaGlwLCAwLCBpc19jYXB0dXJlKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKExYUCAic3RvcHBpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nIHBpcGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE5OCwxMCArMTk4LDEwIEBACiAJaW50IGVyciA9IDA7CiAJaW50IGlzX2NhcHR1cmUgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIAotCXNuZF9wcmludGQoTFhQICJyZWxlYXNpbmcgcGlwZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJyZWxlYXNpbmcgcGlwZVxuIik7CiAJZXJyID0gbHhfcGlwZV9yZWxlYXNlKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoTFhQICJyZWxlYXNpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInJlbGVhc2luZyBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgYm9hcmRfcmF0ZTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9vcGVuXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfcGNtX29wZW5cbiIpOwogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHN0cnVjdCAqLwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKIAkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBMWFAgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kc1xuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kc1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAjZW5kaWYKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJCQkgICBib2FyZF9yYXRlLCBib2FyZF9yYXRlKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiY291bGQgbm90IGNvbnN0cmFpbiBwZXJpb2RzXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiY291bGQgbm90IGNvbnN0cmFpbiBwZXJpb2RzXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCQkJCSAgIE1JQ1JPQkxBWkVfSUJMX01JTiwKIAkJCQkJICAgTUlDUk9CTEFaRV9JQkxfTUFYKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBMWFAKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kIHNpemVcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjYzLDE0ICsyNjMsMTQgQEAKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5zZXR1cF9tdXRleCk7Ci0Jc25kX3ByaW50ZGQoIjwtbHhfcGNtX29wZW4sICVkXG4iLCBlcnIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiPC1seF9wY21fb3BlbiwgJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBseF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJaW50IGVyciA9IDA7Ci0Jc25kX3ByaW50ZGQoIi0+bHhfcGNtX2Nsb3NlXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICItPmx4X3BjbV9jbG9zZVxuIik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjg1LDEzICsyODUsMTMgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpseF9zdHJlYW0gPSBpc19jYXB0dXJlID8gJmNoaXAtPmNhcHR1cmVfc3RyZWFtIDoKIAkJJmNoaXAtPnBsYXliYWNrX3N0cmVhbTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9zdHJlYW1fcG9pbnRlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X3BjbV9zdHJlYW1fcG9pbnRlclxuIik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOwogCXBvcyA9IGx4X3N0cmVhbS0+ZnJhbWVfcG9zICogc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7CiAKLQlzbmRfcHJpbnRkZChMWFAgInN0cmVhbV9wb2ludGVyIGF0ICVsZFxuIiwgcG9zKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0cmVhbV9wb2ludGVyIGF0ICVsZFxuIiwgcG9zKTsKIAlyZXR1cm4gcG9zOwogfQogCkBAIC0zMDEsMzcgKzMwMSwzNyBAQAogCWludCBlcnIgPSAwOwogCWNvbnN0IGludCBpc19jYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9wY21fcHJlcGFyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X3BjbV9wcmVwYXJlXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIAogCWlmIChjaGlwLT5oYXJkd2FyZV9ydW5uaW5nW2lzX2NhcHR1cmVdKSB7CiAJCWVyciA9IGx4X2hhcmR3YXJlX3N0b3AoY2hpcCwgc3Vic3RyZWFtKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJmYWlsZWQgdG8gc3RvcCBoYXJkd2FyZS4gIgorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmYWlsZWQgdG8gc3RvcCBoYXJkd2FyZS4gIgogCQkJCSAgICJFcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQkJZ290byBleGl0OwogCQl9CiAKIAkJZXJyID0gbHhfaGFyZHdhcmVfY2xvc2UoY2hpcCwgc3Vic3RyZWFtKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJmYWlsZWQgdG8gY2xvc2UgaGFyZHdhcmUuICIKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIGNsb3NlIGhhcmR3YXJlLiAiCiAJCQkJICAgIkVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAib3BlbmluZyBoYXJkd2FyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvcGVuaW5nIGhhcmR3YXJlXG4iKTsKIAllcnIgPSBseF9oYXJkd2FyZV9vcGVuKGNoaXAsIHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBvcGVuIGhhcmR3YXJlLiAiCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIG9wZW4gaGFyZHdhcmUuICIKIAkJCSAgICJFcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gbHhfaGFyZHdhcmVfc3RhcnQoY2hpcCwgc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlLiAiCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlLiAiCiAJCQkgICAiRXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTM1NCw3ICszNTQsNyBAQAogCXN0cnVjdCBseDY0NjRlcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9od19wYXJhbXNcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9wY21faHdfcGFyYW1zXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIApAQCAtMzg5LDIwICszODksMjAgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgaXNfY2FwdHVyZSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfcGNtX2h3X2ZyZWVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9wY21faHdfZnJlZVxuIik7CiAJbXV0ZXhfbG9jaygmY2hpcC0+c2V0dXBfbXV0ZXgpOwogCiAJaWYgKGNoaXAtPmhhcmR3YXJlX3J1bm5pbmdbaXNfY2FwdHVyZV0pIHsKIAkJZXJyID0gbHhfaGFyZHdhcmVfc3RvcChjaGlwLCBzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBzdG9wIGhhcmR3YXJlLiAiCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImZhaWxlZCB0byBzdG9wIGhhcmR3YXJlLiAiCiAJCQkJICAgIkVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQllcnIgPSBseF9oYXJkd2FyZV9jbG9zZShjaGlwLCBzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBjbG9zZSBoYXJkd2FyZS4gIgorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmYWlsZWQgdG8gY2xvc2UgaGFyZHdhcmUuICIKIAkJCQkgICAiRXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNDQ2LDI1ICs0NDYsMjUgQEAKIAogCQllcnIgPSBseF9idWZmZXJfYXNrKGNoaXAsIDAsIGlzX2NhcHR1cmUsICZuZWVkZWQsICZmcmVlZCwKIAkJCQkgICAgc2l6ZV9hcnJheSk7Ci0JCXNuZF9wcmludGRkKExYUCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCiAJCQkgICAgbmVlZGVkLCBmcmVlZCk7CiAKIAkJZXJyID0gbHhfYnVmZmVyX2dpdmUoY2hpcCwgMCwgaXNfY2FwdHVyZSwgcGVyaW9kX2J5dGVzLAogCQkJCSAgICAgbG93ZXJfMzJfYml0cyhidWYpLCB1cHBlcl8zMl9iaXRzKGJ1ZiksCiAJCQkJICAgICAmYnVmZmVyX2luZGV4KTsKIAotCQlzbmRfcHJpbnRkZChMWFAgInN0YXJ0aW5nOiBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdGFydGluZzogYnVmZmVyIGluZGV4ICV4IG9uIDB4JWx4ICglZCBieXRlcylcbiIsCiAJCQkgICAgYnVmZmVyX2luZGV4LCAodW5zaWduZWQgbG9uZylidWYsIHBlcmlvZF9ieXRlcyk7CiAJCWJ1ZiArPSBwZXJpb2RfYnl0ZXM7CiAJfQogCiAJZXJyID0gbHhfYnVmZmVyX2FzayhjaGlwLCAwLCBpc19jYXB0dXJlLCAmbmVlZGVkLCAmZnJlZWQsIHNpemVfYXJyYXkpOwotCXNuZF9wcmludGRkKExYUCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOwogCi0Jc25kX3ByaW50ZChMWFAgInN0YXJ0aW5nOiBzdGFydGluZyBzdHJlYW1cbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IHN0YXJ0aW5nIHN0cmVhbVxuIik7CiAJZXJyID0gbHhfc3RyZWFtX3N0YXJ0KGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY291bGRuJ3Qgc3RhcnQgc3RyZWFtXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb3VsZG4ndCBzdGFydCBzdHJlYW1cbiIpOwogCWVsc2UKIAkJbHhfc3RyZWFtLT5zdGF0dXMgPSBMWF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7CiAKQEAgLTQ3NiwxMCArNDc2LDEwIEBACiAJY29uc3QgdW5zaWduZWQgaW50IGlzX2NhcHR1cmUgPSBseF9zdHJlYW0tPmlzX2NhcHR1cmU7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGQoTFhQICJzdG9wcGluZzogc3RvcHBpbmcgc3RyZWFtXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nOiBzdG9wcGluZyBzdHJlYW1cbiIpOwogCWVyciA9IGx4X3N0cmVhbV9zdG9wKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY291bGRuJ3Qgc3RvcCBzdHJlYW1cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkbid0IHN0b3Agc3RyZWFtXG4iKTsKIAllbHNlCiAJCWx4X3N0cmVhbS0+c3RhdHVzID0gTFhfU1RSRUFNX1NUQVRVU19GUkVFOwogCkBAIC01MDcsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAgPSAoc3RydWN0IGx4NjQ2NGVzICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfdHJpZ2dlcl90YXNrbGV0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdHJpZ2dlcl90YXNrbGV0XG4iKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CiAJbHhfdHJpZ2dlcl90YXNrbGV0X2Rpc3BhdGNoX3N0cmVhbShjaGlwLCAmY2hpcC0+Y2FwdHVyZV9zdHJlYW0pOwpAQCAtNTQ3LDE0ICs1NDcsMTQgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpzdHJlYW0gPSBpc19jYXB0dXJlID8gJmNoaXAtPmNhcHR1cmVfc3RyZWFtIDoKIAkJJmNoaXAtPnBsYXliYWNrX3N0cmVhbTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV90cmlnZ2VyXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfcGNtX3RyaWdnZXJcbiIpOwogCiAJcmV0dXJuIGx4X3BjbV90cmlnZ2VyX2Rpc3BhdGNoKGNoaXAsIHN0cmVhbSwgY21kKTsKIH0KIAogc3RhdGljIGludCBzbmRfbHg2NDY0ZXNfZnJlZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCiB7Ci0Jc25kX3ByaW50ZGQoIi0+c25kX2x4NjQ2NGVzX2ZyZWVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5zbmRfbHg2NDY0ZXNfZnJlZVxuIik7CiAKIAlseF9pcnFfZGlzYWJsZShjaGlwKTsKIApAQCAtNTgzLDcgKzU4Myw3IEBACiAJaW50IGk7CiAJdTMyIHBseF9yZWcgPSBseF9wbHhfcmVnX3JlYWQoY2hpcCwgZVBMWF9DSElQU0MpOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfaW5pdF94aWxpbnhfcmVzZXRcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pbml0X3hpbGlueF9yZXNldFxuIik7CiAKIAkvKiBhY3RpdmF0ZSByZXNldCBvZiB4aWxpbnggKi8KIAlwbHhfcmVnICY9IH5DSElQU0NfUkVTRVRfWElMSU5YOwpAQCAtNjAzLDggKzYwMyw4IEBACiAJCW1zbGVlcCgxMCk7CiAJCXJlZ19tYm94MyA9IGx4X3BseF9yZWdfcmVhZChjaGlwLCBlUExYX01CT1gzKTsKIAkJaWYgKHJlZ19tYm94MykgewotCQkJc25kX3ByaW50ZChMWFAgInhpbGlueCByZXNldCBkb25lXG4iKTsKLQkJCXNuZF9wcmludGRkKExYUCAieGlsaW54IHRvb2sgJWQgbG9vcHNcbiIsIGkpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ4aWxpbnggcmVzZXQgZG9uZVxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInhpbGlueCB0b29rICVkIGxvb3BzXG4iLCBpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNjI0LDcgKzYyNCw3IEBACiB7CiAJdTMyIHJlZzsKIAotCXNuZF9wcmludGRkKCItPmx4X2luaXRfeGlsaW54X3Rlc3RcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pbml0X3hpbGlueF90ZXN0XG4iKTsKIAogCS8qIFRFU1QgaWYgd2UgaGF2ZSBhY2Nlc3MgdG8gWGlsaW54L01pY3JvQmxhemUgKi8KIAlseF9kc3BfcmVnX3dyaXRlKGNoaXAsIGVSZWdfQ1NNLCAwKTsKQEAgLTYzMiwxOSArNjMyLDE5IEBACiAJcmVnID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NNKTsKIAogCWlmIChyZWcpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIlByb2JsZW06IFJlZ19DU00gJXguXG4iLCByZWcpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlByb2JsZW06IFJlZ19DU00gJXguXG4iLCByZWcpOwogCiAJCS8qIFBDSTkwNTZfU1BBQ0UwX1JFTUFQICovCiAJCWx4X3BseF9yZWdfd3JpdGUoY2hpcCwgZVBMWF9QQ0lDUiwgMSk7CiAKIAkJcmVnID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NNKTsKIAkJaWYgKHJlZykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIkVycm9yOiBSZWdfQ1NNICV4LlxuIiwgcmVnKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRXJyb3I6IFJlZ19DU00gJXguXG4iLCByZWcpOwogCQkJcmV0dXJuIC1FQUdBSU47IC8qIHNlZW1zIHRvIGJlIGFwcHJvcHJpYXRlICovCiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAiWGlsaW54L01pY3JvQmxhemUgYWNjZXNzIHRlc3Qgc3VjY2Vzc2Z1bFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJYaWxpbngvTWljcm9CbGF6ZSBhY2Nlc3MgdGVzdCBzdWNjZXNzZnVsXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjYxLDcgKzY2MSw3IEBACiAJCSg2NCA8PCBJT0NSX09VVFBVVFNfT0ZGU0VUKSB8CiAJCShGUkVRX1JBVElPX1NJTkdMRV9NT0RFIDw8IEZSRVFfUkFUSU9fT0ZGU0VUKTsKIAotCXNuZF9wcmludGRkKCItPmx4X2luaXRfZXRoZXJzb3VuZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2luaXRfZXRoZXJzb3VuZFxuIik7CiAKIAljaGlwLT5mcmVxX3JhdGlvID0gRlJFUV9SQVRJT19TSU5HTEVfTU9ERTsKIApAQCAtNjc1LDE4ICs2NzUsMTggQEAKIAogCWZvciAoaSA9IDA7IGkgIT0gMTAwMDsgKytpKSB7CiAJCWlmIChseF9kc3BfcmVnX3JlYWQoY2hpcCwgZVJlZ19DU0VTKSAmIDQpIHsKLQkJCXNuZF9wcmludGQoTFhQICJldGhlcnNvdW5kIGluaXRpYWxpemVkIGFmdGVyICVkbXNcbiIsCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImV0aGVyc291bmQgaW5pdGlhbGl6ZWQgYWZ0ZXIgJWRtc1xuIiwKIAkJCQkgICBpKTsKIAkJCWdvdG8gZXRoZXJzb3VuZF9pbml0aWFsaXplZDsKIAkJfQogCQltc2xlZXAoMSk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUAorCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgImV0aGVyc291bmQgY291bGQgbm90IGJlIGluaXRpYWxpemVkIGFmdGVyICVkbXNcbiIsIGkpOwogCXJldHVybiAtRVRJTUVET1VUOwogCiAgZXRoZXJzb3VuZF9pbml0aWFsaXplZDoKLQlzbmRfcHJpbnRkKExYUCAiZXRoZXJzb3VuZCBpbml0aWFsaXplZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJldGhlcnNvdW5kIGluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjk2LDE0ICs2OTYsMTQgQEAKIAogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9pbml0X2dldF92ZXJzaW9uX2ZlYXR1cmVzXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfaW5pdF9nZXRfdmVyc2lvbl9mZWF0dXJlc1xuIik7CiAKIAllcnIgPSBseF9kc3BfZ2V0X3ZlcnNpb24oY2hpcCwgJmRzcF92ZXJzaW9uKTsKIAogCWlmIChlcnIgPT0gMCkgewogCQl1MzIgZnJlcTsKIAotCQlzbmRfcHJpbnRrKExYUCAiRFNQIHZlcnNpb246IFYlMDJkLiUwMmQgIyVkXG4iLAorCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJEU1AgdmVyc2lvbjogViUwMmQuJTAyZCAjJWRcbiIsCiAJCQkgICAoZHNwX3ZlcnNpb24+PjE2KSAmIDB4ZmYsIChkc3BfdmVyc2lvbj4+OCkgJiAweGZmLAogCQkJICAgZHNwX3ZlcnNpb24gJiAweGZmKTsKIApAQCAtNzE4LDkgKzcxOCw5IEBACiAJCWVyciA9IGx4X2RzcF9nZXRfY2xvY2tfZnJlcXVlbmN5KGNoaXAsICZmcmVxKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJY2hpcC0+Ym9hcmRfc2FtcGxlX3JhdGUgPSBmcmVxOwotCQlzbmRfcHJpbnRkKExYUCAiYWN0dWFsIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgZnJlcSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWN0dWFsIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgZnJlcSk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIkRTUCBjb3JydXB0ZWQgXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJEU1AgY29ycnVwdGVkIFxuIik7CiAJCWVyciA9IC1FQUdBSU47CiAJfQogCkBAIC03MzIsNyArNzMyLDcgQEAKIAlpbnQgZXJyID0gMDsKIAl1MzIgc25hcHBlZF9ncmFuID0gTUlDUk9CTEFaRV9JQkxfTUlOOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfc2V0X2dyYW51bGFyaXR5XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfc2V0X2dyYW51bGFyaXR5XG4iKTsKIAogCS8qIGJsb2Nrc2l6ZSBpcyBhIHBvd2VyIG9mIDIgKi8KIAl3aGlsZSAoKHNuYXBwZWRfZ3JhbiA8IGdyYW4pICYmCkBAIC03NDUsMTQgKzc0NSwxNCBAQAogCiAJZXJyID0gbHhfZHNwX3NldF9ncmFudWxhcml0eShjaGlwLCBzbmFwcGVkX2dyYW4pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiY291bGQgbm90IHNldCBncmFudWxhcml0eVxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBzZXQgZ3JhbnVsYXJpdHlcbiIpOwogCQllcnIgPSAtRUFHQUlOOwogCX0KIAogCWlmIChzbmFwcGVkX2dyYW4gIT0gZ3JhbikKLQkJc25kX3ByaW50ayhMWFAgInNuYXBwZWQgYmxvY2tzaXplIHRvICVkXG4iLCBzbmFwcGVkX2dyYW4pOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInNuYXBwZWQgYmxvY2tzaXplIHRvICVkXG4iLCBzbmFwcGVkX2dyYW4pOwogCi0Jc25kX3ByaW50ZChMWFAgInNldCBibG9ja3NpemUgb24gYm9hcmQgJWRcbiIsIHNuYXBwZWRfZ3Jhbik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXQgYmxvY2tzaXplIG9uIGJvYXJkICVkXG4iLCBzbmFwcGVkX2dyYW4pOwogCWNoaXAtPnBjbV9ncmFudWxhcml0eSA9IHNuYXBwZWRfZ3JhbjsKIAogCXJldHVybiBlcnI7CkBAIC03NjQsMTkgKzc2NCwxOSBAQAogCWludCBlcnI7CiAJaW50IGk7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9pbml0X2RzcFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2luaXRfZHNwXG4iKTsKIAotCXNuZF9wcmludGQoTFhQICJpbml0aWFsaXplIGJvYXJkXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemUgYm9hcmRcbiIpOwogCWVyciA9IGx4X2luaXRfeGlsaW54X3Jlc2V0KGNoaXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkKExYUCAidGVzdGluZyBib2FyZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ0ZXN0aW5nIGJvYXJkXG4iKTsKIAllcnIgPSBseF9pbml0X3hpbGlueF90ZXN0KGNoaXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkKExYUCAiaW5pdGlhbGl6ZSBldGhlcnNvdW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW5pdGlhbGl6ZSBldGhlcnNvdW5kIGNvbmZpZ3VyYXRpb25cbiIpOwogCWVyciA9IGx4X2luaXRfZXRoZXJzb3VuZF9jb25maWcoY2hpcCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTc5Nyw4ICs3OTcsOSBAQAogCXJldHVybiAtRVRJTUVET1VUOwogCiBtYWNfcmVhZHk6Ci0Jc25kX3ByaW50ZChMWFAgIm1hYyBhZGRyZXNzIHJlYWR5IHJlYWQgYWZ0ZXI6ICVkbXNcbiIsIGkpOwotCXNuZF9wcmludGsoTFhQICJtYWMgYWRkcmVzczogJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYLiUwMlhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJtYWMgYWRkcmVzcyByZWFkeSByZWFkIGFmdGVyOiAlZG1zXG4iLCBpKTsKKwlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCSAibWFjIGFkZHJlc3M6ICUwMlguJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYXG4iLAogCQkgICBjaGlwLT5tYWNfYWRkcmVzc1swXSwgY2hpcC0+bWFjX2FkZHJlc3NbMV0sIGNoaXAtPm1hY19hZGRyZXNzWzJdLAogCQkgICBjaGlwLT5tYWNfYWRkcmVzc1szXSwgY2hpcC0+bWFjX2FkZHJlc3NbNF0sIGNoaXAtPm1hY19hZGRyZXNzWzVdKTsKIApAQCAtOTc3LDcgKzk3OCw3IEBACiAJCS5kZXZfZnJlZSA9IHNuZF9seDY0NjRlc19kZXZfZnJlZSwKIAl9OwogCi0Jc25kX3ByaW50ZGQoIi0+c25kX2x4NjQ2NGVzX2NyZWF0ZVxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICItPnNuZF9seDY0NjRlc19jcmVhdGVcbiIpOwogCiAJKnJjaGlwID0gTlVMTDsKIApAQCAtOTkxLDggKzk5Miw4IEBACiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgIjMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xMDM0LDcgKzEwMzUsNyBAQAogCWVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBseF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gcmVxdWVzdF9pcnFfZmFpbGVkOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKQEAgLTEwNDUsNyArMTA0Niw3IEBACiAKIAllcnIgPSBseF9pbml0X2RzcChjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiZXJyb3IgZHVyaW5nIERTUCBpbml0aWFsaXphdGlvblxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgZHVyaW5nIERTUCBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMDYyLDggKzEwNjMsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTA5MCw3ICsxMDg5LDcgQEAKIAlzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXA7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGRkKCItPnNuZF9seDY0NjRlc19wcm9iZVxuIik7CisJZGV2X2RiZygmcGNpLT5kZXYsICItPnNuZF9seDY0NjRlc19wcm9iZVxuIik7CiAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEwOTksMTMgKzEwOTgsMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAllcnIgPSBzbmRfbHg2NDY0ZXNfY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJlcnJvciBkdXJpbmcgc25kX2x4NjQ2NGVzX2NyZWF0ZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgZHVyaW5nIHNuZF9seDY0NjRlc19jcmVhdGVcbiIpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIApAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNuZF9wcmludGRkKExYUCAiaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsXG4iKTsKIAlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKIAlkZXYrKzsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHhfY29yZS5jCmluZGV4IDYyNmVjYWQuLjJkOGU5NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4X2NvcmUuYwpAQCAtMTQxLDYzICsxNDEsNiBAQAogCWlvd3JpdGUzMihkYXRhLCBhZGRyZXNzKTsKIH0KIAotdTMyIGx4X3BseF9tYm94X3JlYWQoc3RydWN0IGx4NjQ2NGVzICpjaGlwLCBpbnQgbWJveF9ucikKLXsKLQlpbnQgaW5kZXg7Ci0KLQlzd2l0Y2ggKG1ib3hfbnIpIHsKLQljYXNlIDE6Ci0JCWluZGV4ID0gZVBMWF9NQk9YMTsgICAgYnJlYWs7Ci0JY2FzZSAyOgotCQlpbmRleCA9IGVQTFhfTUJPWDI7ICAgIGJyZWFrOwotCWNhc2UgMzoKLQkJaW5kZXggPSBlUExYX01CT1gzOyAgICBicmVhazsKLQljYXNlIDQ6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNDsgICAgYnJlYWs7Ci0JY2FzZSA1OgotCQlpbmRleCA9IGVQTFhfTUJPWDU7ICAgIGJyZWFrOwotCWNhc2UgNjoKLQkJaW5kZXggPSBlUExYX01CT1g2OyAgICBicmVhazsKLQljYXNlIDc6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNzsgICAgYnJlYWs7Ci0JY2FzZSAwOgkJCS8qIHJlc2VydmVkIGZvciBIRiBmbGFncyAqLwotCQlzbmRfQlVHKCk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDB4ZGVhZGJlZWY7Ci0JfQotCi0JcmV0dXJuIGx4X3BseF9yZWdfcmVhZChjaGlwLCBpbmRleCk7Ci19Ci0KLWludCBseF9wbHhfbWJveF93cml0ZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAsIGludCBtYm94X25yLCB1MzIgdmFsdWUpCi17Ci0JaW50IGluZGV4ID0gLTE7Ci0KLQlzd2l0Y2ggKG1ib3hfbnIpIHsKLQljYXNlIDE6Ci0JCWluZGV4ID0gZVBMWF9NQk9YMTsgICAgYnJlYWs7Ci0JY2FzZSAzOgotCQlpbmRleCA9IGVQTFhfTUJPWDM7ICAgIGJyZWFrOwotCWNhc2UgNDoKLQkJaW5kZXggPSBlUExYX01CT1g0OyAgICBicmVhazsKLQljYXNlIDU6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNTsgICAgYnJlYWs7Ci0JY2FzZSA2OgotCQlpbmRleCA9IGVQTFhfTUJPWDY7ICAgIGJyZWFrOwotCWNhc2UgNzoKLQkJaW5kZXggPSBlUExYX01CT1g3OyAgICBicmVhazsKLQljYXNlIDA6CQkJLyogcmVzZXJ2ZWQgZm9yIEhGIGZsYWdzICovCi0JY2FzZSAyOgkJCS8qIHJlc2VydmVkIGZvciBQaXBlIFN0YXRlcwotCQkJCSAqIHRoZSBEU1Aga2VlcHMgYW4gaW1hZ2Ugb2YgaXQgKi8KLQkJc25kX0JVRygpOwotCQlyZXR1cm4gLUVCQURSUUM7Ci0JfQotCi0JbHhfcGx4X3JlZ193cml0ZShjaGlwLCBpbmRleCwgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi0KIC8qIHJtaCAqLwogCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwpAQCAtMzMwLDcgKzI3Myw3IEBACiAJaW50IGR3bG9vcDsKIAogCWlmIChseF9kc3BfcmVnX3JlYWQoY2hpcCwgZVJlZ19DU00pICYgKFJlZ19DU01fTUMgfCBSZWdfQ1NNX01SKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiUElPU2VuZE1lc3NhZ2UgZVJlZ19DU00gJXhcbiIsIHJlZyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiUElPU2VuZE1lc3NhZ2UgZVJlZ19DU00gJXhcbiIsIHJlZyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0zNTEsNyArMjk0LDcgQEAKIAkJfSBlbHNlCiAJCQl1ZGVsYXkoMSk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiVElNRU9VVCBseF9tZXNzYWdlX3NlbmRfYXRvbWljISAiCisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiVElNRU9VVCBseF9tZXNzYWdlX3NlbmRfYXRvbWljISAiCiAJCSAgICJwb2xsaW5nIGZhaWxlZFxuIik7CiAKIHBvbGxpbmdfc3VjY2Vzc2Z1bDoKQEAgLTM2MywxOCArMzA2LDE4IEBACiAJCQkJCSAgIHJtaC0+c3RhdF9sZW4pOwogCQl9CiAJfSBlbHNlCi0JCXNuZF9wcmludGsoTFhQICJybWggZXJyb3I6ICUwOHhcbiIsIHJlZyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAicm1oIGVycm9yOiAlMDh4XG4iLCByZWcpOwogCiAJLyogY2xlYXIgUmVnX0NTTV9NUiAqLwogCWx4X2RzcF9yZWdfd3JpdGUoY2hpcCwgZVJlZ19DU00sIDApOwogCiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIEVEX0RTUF9USU1FRF9PVVQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAibHhfbWVzc2FnZV9zZW5kOiBkc3AgdGltZW91dFxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImx4X21lc3NhZ2Vfc2VuZDogZHNwIHRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAogCWNhc2UgRURfRFNQX0NSQVNIRUQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAibHhfbWVzc2FnZV9zZW5kOiBkc3AgY3Jhc2hlZFxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImx4X21lc3NhZ2Vfc2VuZDogZHNwIGNyYXNoZWRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTQ5MSwzMyArNDM0LDYgQEAKICNkZWZpbmUgQ1NFU19CUk9BRENBU1QgICAgICAweDAwMDIKICNkZWZpbmUgQ1NFU19VUERBVEVfTERTViAgICAweDAwMDQKIAotaW50IGx4X2RzcF9lc19jaGVja19waXBlbGluZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpICE9IENTRVNfVElNRU9VVDsgKytpKSB7Ci0JCS8qCi0JCSAqIGxlIGJpdCBDU0VTX1VQREFURV9MRFNWIGVzdCDDg8KgIDEgZMODwqlzIHF1ZSBsZSBtYWNwcm9nCi0JCSAqIGVzdCBwcmV0LiBpbCByZS1wYXNzZSDDg8KgIDAgbG9yc3F1ZSBsZSBwcmVtaWVyIHJlYWQgYQotCQkgKiDDg8KpdMODwqkgZmFpdC4gcG91ciBsJ2luc3RhbnQgb24gcmV0aXJlIGxlIHRlc3QgY2FyIGNlIGJpdAotCQkgKiBwYXNzZSBhIDEgZW52aXJvbiAyMDAgw4PCoCA0MDAgbXMgYXByw4PCqXMgcXVlIGxlIHJlZ2lzdHJlCi0JCSAqIGNvbmZFUyDDg8KgIMODwql0w4PCqSDDg8KpY3JpdCAoa2ljayBkdSB4aWxpbnggRVMpLgotCQkgKgotCQkgKiBPbiBuZSB0ZXN0ZSBxdWUgbGUgYml0IENFLgotCQkgKiAqLwotCi0JCXUzMiBjc2VzID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NFUyk7Ci0KLQkJaWYgKChjc2VzICYgQ1NFU19DRSkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotCiAjZGVmaW5lIFBJUEVfSU5GT19UT19DTUQoY2FwdHVyZSwgcGlwZSkJCQkJCVwKIAkoKHUzMikoKHUzMikocGlwZSkgfCAoKGNhcHR1cmUpID8gSURfSVNfQ0FQVFVSRSA6IDBMKSkgPDwgSURfT0ZGU0VUKQogCkBAIC01NDIsNyArNDU4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5tc2dfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGVyciAhPSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJseDY0NjRlczogY291bGQgbm90IGFsbG9jYXRlIHBpcGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBwaXBlXG4iKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02MDQsMTEgKzUyMCwxMyBAQAogCQl9CiAKICNpZiAwCi0JCXNuZF9wcmludGRkKExYUCAiQ01EXzA4X0FTS19CVUZGRVJTOiBuZWVkZWQgJWQsIGZyZWVkICVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJDTURfMDhfQVNLX0JVRkZFUlM6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCiAJCQkgICAgKnJfbmVlZGVkLCAqcl9mcmVlZCk7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX0JVRkZFUjsgKytpKSB7CiAJCQlmb3IgKGkgPSAwOyBpICE9IGNoaXAtPnJtaC5zdGF0X2xlbjsgKytpKQotCQkJCXNuZF9wcmludGRkKCIgIHN0YXRbJWRdOiAleCwgJXhcbiIsIGksCisJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSIgIHN0YXRbJWRdOiAleCwgJXhcbiIsIGksCiAJCQkJCSAgICBjaGlwLT5ybWguc3RhdFtpXSwKIAkJCQkJICAgIGNoaXAtPnJtaC5zdGF0W2ldICYgTUFTS19EQVRBX1NJWkUpOwogCQl9CkBAIC03MDEsOCArNjE5LDggQEAKIAllcnIgPSBseF9tZXNzYWdlX3NlbmRfYXRvbWljKGNoaXAsICZjaGlwLT5ybWgpOyAvKiBkb24ndCBzbGVlcCEgKi8KIAogCWlmIChlcnIgIT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJICAgImx4NjQ2NGVzOiBjb3VsZCBub3QgcXVlcnkgcGlwZSdzIHNhbXBsZSBjb3VudFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc2FtcGxlIGNvdW50XG4iKTsKIAllbHNlIHsKIAkJKnJzYW1wbGVfY291bnQgPSAoKHU2NCkoY2hpcC0+cm1oLnN0YXRbMF0gJiBNQVNLX1NQTF9DT1VOVF9ISSkKIAkJCQkgIDw8IDI0KSAgICAgLyogaGkgcGFydCAqLwpAQCAtNzI4LDcgKzY0Niw3IEBACiAJZXJyID0gbHhfbWVzc2FnZV9zZW5kX2F0b21pYyhjaGlwLCAmY2hpcC0+cm1oKTsKIAogCWlmIChlcnIgIT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibHg2NDY0ZXM6IGNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc3RhdGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc3RhdGVcbiIpOwogCWVsc2UKIAkJKnJzdGF0ZSA9IChjaGlwLT5ybWguc3RhdFswXSA+PiBQU1RBVEVfT0ZGU0VUKSAmIDB4MEY7CiAKQEAgLTgwMSw3ICs3MTksNyBAQAogCXUzMiBjaGFubmVscyA9IHJ1bnRpbWUtPmNoYW5uZWxzOwogCiAJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzICE9IGNoYW5uZWxzKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY2hhbm5lbCBjb3VudCBtaXNtYXRjaDogJWQgdnMgJWQiLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNoYW5uZWwgY291bnQgbWlzbWF0Y2g6ICVkIHZzICVkIiwKIAkJCSAgIHJ1bnRpbWUtPmNoYW5uZWxzLCBjaGFubmVscyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bXNnX2xvY2ssIGZsYWdzKTsKQEAgLTkwNCwxMyArODIyLDE2IEBACiAJfQogCiAJaWYgKGVyciA9PSBFQl9SQlVGRkVSU19UQUJMRV9PVkVSRkxPVykKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX1JCVUZGRVJTX1RBQkxFX09WRVJGTE9XXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfUkJVRkZFUlNfVEFCTEVfT1ZFUkZMT1dcbiIpOwogCiAJaWYgKGVyciA9PSBFQl9JTlZBTElEX1NUUkVBTSkKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX0lOVkFMSURfU1RSRUFNXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfSU5WQUxJRF9TVFJFQU1cbiIpOwogCiAJaWYgKGVyciA9PSBFQl9DTURfUkVGVVNFRCkKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX0NNRF9SRUZVU0VEXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfQ01EX1JFRlVTRURcbiIpOwogCiAgZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5tc2dfbG9jaywgZmxhZ3MpOwpAQCAtOTgzLDcgKzkwNCw4IEBACiAJY2hpcC0+cm1oLmNtZFsxXSA9ICh1MzIpKG11dGVfbWFzayA+PiAodTY0KTMyKTsJICAgICAgIC8qIGhpIHBhcnQgKi8KIAljaGlwLT5ybWguY21kWzJdID0gKHUzMikobXV0ZV9tYXNrICYgKHU2NCkweEZGRkZGRkZGKTsgLyogbG8gcGFydCAqLwogCi0Jc25kX3ByaW50aygibXV0ZSAleCAleCAleFxuIiwgY2hpcC0+cm1oLmNtZFswXSwgY2hpcC0+cm1oLmNtZFsxXSwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIm11dGUgJXggJXggJXhcbiIsIGNoaXAtPnJtaC5jbWRbMF0sIGNoaXAtPnJtaC5jbWRbMV0sCiAJCSAgIGNoaXAtPnJtaC5jbWRbMl0pOwogCiAJZXJyID0gbHhfbWVzc2FnZV9zZW5kX2F0b21pYyhjaGlwLCAmY2hpcC0+cm1oKTsKQEAgLTEwOTMsNyArMTAxNSw3IEBACiAJfQogCiAJaWYgKGlycV9hc3luYykgewotCQkvKiBzbmRfcHJpbnRkKCJpbnRlcnJ1cHQ6IGFzeW5jIGV2ZW50IHBlbmRpbmdcbiIpOyAqLworCQkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogYXN5bmMgZXZlbnQgcGVuZGluZ1xuIik7ICovCiAJCSpyX2FzeW5jX3BlbmRpbmcgPSAxOwogCX0KIApAQCAtMTEzOSwxMyArMTA2MSwxMyBAQAogCWlmIChlYl9wZW5kaW5nX2luKSB7CiAJCSpyX25vdGlmaWVkX2luX3BpcGVfbWFzayA9ICgodTY0KXN0YXRbM10gPDwgMzIpCiAJCQkrIHN0YXRbNF07Ci0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBFT0JJIHBlbmRpbmcgJWxseFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IEVPQkkgcGVuZGluZyAlbGx4XG4iLAogCQkJICAgICpyX25vdGlmaWVkX2luX3BpcGVfbWFzayk7CiAJfQogCWlmIChlYl9wZW5kaW5nX291dCkgewogCQkqcl9ub3RpZmllZF9vdXRfcGlwZV9tYXNrID0gKCh1NjQpc3RhdFsxXSA8PCAzMikKIAkJCSsgc3RhdFsyXTsKLQkJc25kX3ByaW50ZGQoTFhQICJpbnRlcnJ1cHQ6IEVPQk8gcGVuZGluZyAlbGx4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogRU9CTyBwZW5kaW5nICVsbHhcbiIsCiAJCQkgICAgKnJfbm90aWZpZWRfb3V0X3BpcGVfbWFzayk7CiAJfQogCkBAIC0xMTgxLDE3ICsxMTAzLDE5IEBACiAJdTMyIG5lZWRlZCwgZnJlZWQ7CiAJdTMyIHNpemVfYXJyYXlbTUFYX1NUUkVBTV9CVUZGRVJdOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfaW50ZXJydXB0X3JlcXVlc3RfbmV3X2J1ZmZlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2ludGVycnVwdF9yZXF1ZXN0X25ld19idWZmZXJcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKIAogCWVyciA9IGx4X2J1ZmZlcl9hc2soY2hpcCwgMCwgaXNfY2FwdHVyZSwgJm5lZWRlZCwgJmZyZWVkLCBzaXplX2FycmF5KTsKLQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogbmVlZGVkICVkLCBmcmVlZCAlZFxuIiwgbmVlZGVkLCBmcmVlZCk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJpbnRlcnJ1cHQ6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOwogCiAJdW5wYWNrX3BvaW50ZXIoYnVmLCAmYnVmX2xvLCAmYnVmX2hpKTsKIAllcnIgPSBseF9idWZmZXJfZ2l2ZShjaGlwLCAwLCBpc19jYXB0dXJlLCBwZXJpb2RfYnl0ZXMsIGJ1Zl9sbywgYnVmX2hpLAogCQkJICAgICAmYnVmZmVyX2luZGV4KTsKLQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogZ2F2ZSBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImludGVycnVwdDogZ2F2ZSBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKIAkJICAgIGJ1ZmZlcl9pbmRleCwgKHVuc2lnbmVkIGxvbmcpYnVmLCBwZXJpb2RfYnl0ZXMpOwogCiAJbHhfc3RyZWFtLT5mcmFtZV9wb3MgPSBuZXh0X3BvczsKQEAgLTEyMDYsMTEgKzExMzAsMTEgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpseF9zdHJlYW0gPSAmY2hpcC0+cGxheWJhY2tfc3RyZWFtOwogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF90YXNrbGV0X3BsYXliYWNrXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdGFza2xldF9wbGF5YmFja1xuIik7CiAKIAllcnIgPSBseF9pbnRlcnJ1cHRfcmVxdWVzdF9uZXdfYnVmZmVyKGNoaXAsIGx4X3N0cmVhbSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNhbm5vdCByZXF1ZXN0IG5ldyBidWZmZXIgZm9yIHBsYXliYWNrXG4iKTsKIAogCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQobHhfc3RyZWFtLT5zdHJlYW0pOwpAQCAtMTIyMiwxMCArMTE0NiwxMCBAQAogCXN0cnVjdCBseF9zdHJlYW0gKmx4X3N0cmVhbSA9ICZjaGlwLT5jYXB0dXJlX3N0cmVhbTsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfdGFza2xldF9jYXB0dXJlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdGFza2xldF9jYXB0dXJlXG4iKTsKIAllcnIgPSBseF9pbnRlcnJ1cHRfcmVxdWVzdF9uZXdfYnVmZmVyKGNoaXAsIGx4X3N0cmVhbSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNhbm5vdCByZXF1ZXN0IG5ldyBidWZmZXIgZm9yIGNhcHR1cmVcbiIpOwogCiAJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChseF9zdHJlYW0tPnN0cmVhbSk7CkBAIC0xMjQwLDEyICsxMTY0LDE0IEBACiAJaW50IGVyciA9IDA7CiAKIAlpZiAobm90aWZpZWRfaW5fcGlwZV9tYXNrKSB7Ci0JCXNuZF9wcmludGRkKExYUCAicmVxdWVzdGluZyBhdWRpbyB0cmFuc2ZlciBmb3IgY2FwdHVyZVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInJlcXVlc3RpbmcgYXVkaW8gdHJhbnNmZXIgZm9yIGNhcHR1cmVcbiIpOwogCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjaGlwLT50YXNrbGV0X2NhcHR1cmUpOwogCX0KIAogCWlmIChub3RpZmllZF9vdXRfcGlwZV9tYXNrKSB7Ci0JCXNuZF9wcmludGRkKExYUCAicmVxdWVzdGluZyBhdWRpbyB0cmFuc2ZlciBmb3IgcGxheWJhY2tcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJyZXF1ZXN0aW5nIGF1ZGlvIHRyYW5zZmVyIGZvciBwbGF5YmFja1xuIik7CiAJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNoaXAtPnRhc2tsZXRfcGxheWJhY2spOwogCX0KIApAQCAtMTI2MSwxMSArMTE4NywxMiBAQAogCiAJc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKIAotCXNuZF9wcmludGRkKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAKIAlpZiAoIWx4X2ludGVycnVwdF9hY2soY2hpcCwgJmlycXNyYywgJmFzeW5jX3BlbmRpbmcsICZhc3luY19lc2NtZCkpIHsKIAkJc3Bpbl91bmxvY2soJmNoaXAtPmxvY2spOwotCQlzbmRfcHJpbnRkZCgiSVJRX05PTkVcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIklSUV9OT05FXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOyAvKiB0aGlzIGRldmljZSBkaWQgbm90IGNhdXNlIHRoZSBpbnRlcnJ1cHQgKi8KIAl9CiAKQEAgLTEyNzQsMTYgKzEyMDEsMTYgQEAKIAogI2lmIDAKIAlpZiAoaXJxc3JjICYgTUFTS19TWVNfU1RBVFVTX0VPQkkpCi0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBFT0JJXG4iKTsKKwkJZGV2X2RnZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IEVPQklcbiIpOwogCiAJaWYgKGlycXNyYyAmIE1BU0tfU1lTX1NUQVRVU19FT0JPKQotCQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogRU9CT1xuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0OiBFT0JPXG4iKTsKIAogCWlmIChpcnFzcmMgJiBNQVNLX1NZU19TVEFUVVNfVVJVTikKLQkJc25kX3ByaW50ZGQoTFhQICJpbnRlcnJ1cHQ6IFVSVU5cbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogVVJVTlxuIik7CiAKIAlpZiAoaXJxc3JjICYgTUFTS19TWVNfU1RBVFVTX09SVU4pCi0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBPUlVOXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IE9SVU5cbiIpOwogI2VuZGlmCiAKIAlpZiAoYXN5bmNfcGVuZGluZykgewpAQCAtMTI5OCw3ICsxMjI1LDcgQEAKIAkJCQkJCSAgICAgICAmbm90aWZpZWRfaW5fcGlwZV9tYXNrLAogCQkJCQkJICAgICAgICZub3RpZmllZF9vdXRfcGlwZV9tYXNrKTsKIAkJaWYgKGVycikKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKIAkJCQkgICAiZXJyb3IgaGFuZGxpbmcgYXN5bmMgZXZlbnRzXG4iKTsKIAogCQllcnIgPSBseF9pbnRlcnJ1cHRfaGFuZGxlX2F1ZGlvX3RyYW5zZmVyKGNoaXAsCkBAIC0xMzA2LDcgKzEyMzMsNyBAQAogCQkJCQkJCSBub3RpZmllZF9vdXRfcGlwZV9tYXNrCiAJCQkpOwogCQlpZiAoZXJyKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJCSAgICJlcnJvciBkdXJpbmcgYXVkaW8gdHJhbnNmZXJcbiIpOwogCX0KIApAQCAtMTMxOCw3ICsxMjQ1LDcgQEAKIAkJICoKIAkJICogKi8KIAotCQlzbmRfcHJpbnRkZCgibHg2NDY0ZXM6IGludGVycnVwdCByZXF1ZXN0cyBlc2NtZCBoYW5kbGluZ1xuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHJlcXVlc3RzIGVzY21kIGhhbmRsaW5nXG4iKTsKICNlbmRpZgogCX0KIApAQCAtMTM0NiwxMiArMTI3MywxMiBAQAogCiB2b2lkIGx4X2lycV9lbmFibGUoc3RydWN0IGx4NjQ2NGVzICpjaGlwKQogewotCXNuZF9wcmludGRkKCItPmx4X2lycV9lbmFibGVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pcnFfZW5hYmxlXG4iKTsKIAlseF9pcnFfc2V0KGNoaXAsIDEpOwogfQogCiB2b2lkIGx4X2lycV9kaXNhYmxlKHN0cnVjdCBseDY0NjRlcyAqY2hpcCkKIHsKLQlzbmRfcHJpbnRkZCgiLT5seF9pcnFfZGlzYWJsZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2lycV9kaXNhYmxlXG4iKTsKIAlseF9pcnFfc2V0KGNoaXAsIDApOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21hZXN0cm8zLmMgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwppbmRleCBkNTQxNzM2Li4wZDNlYTNlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWFlc3RybzMuYworKysgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwpAQCAtMTQwMyw3ICsxNDAzLDcgQEAKIAkvKiBzZXQgYnVmZmVyIGFkZHJlc3MgKi8KIAlzLT5idWZmZXJfYWRkciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CiAJaWYgKHMtPmJ1ZmZlcl9hZGRyICYgMHgzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm9oIG15LCBub3QgYWxpZ25lZFxuIik7CisJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIm9oIG15LCBub3QgYWxpZ25lZFxuIik7CiAJCXMtPmJ1ZmZlcl9hZGRyID0gcy0+YnVmZmVyX2FkZHIgJiB+MHgzOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE5MDAsNyArMTkwMCw3IEBACiAJCWNwdV9yZWxheCgpOwogCX0gd2hpbGUgKGktLSA+IDApOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOwogCXJldHVybiAxOwogfQogCkBAIC0yMDE1LDcgKzIwMTUsOCBAQAogCQlkZWxheTEgKz0gMTA7CiAJCWRlbGF5MiArPSAxMDA7CiAKLQkJc25kX3ByaW50ZCgibWFlc3RybzM6IHJldHJ5aW5nIGNvZGVjIHJlc2V0IHdpdGggZGVsYXlzIG9mICVkIGFuZCAlZCBtc1xuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicmV0cnlpbmcgY29kZWMgcmVzZXQgd2l0aCBkZWxheXMgb2YgJWQgYW5kICVkIG1zXG4iLAogCQkJICAgZGVsYXkxLCBkZWxheTIpOwogCX0KIApAQCAtMjE5NCw3ICsyMTk1LDggQEAKIAlhZGRyZXNzID0gMHgxMTAwICsgKChkYXRhX2J5dGVzLzIpICogaW5kZXgpOwogCiAJaWYgKChhZGRyZXNzICsgKGRhdGFfYnl0ZXMvMikpID49IDB4MWMwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yICVkIGJ5dGVzIGF0IGluZCAlZCAoYWRkciAweCV4KVxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibm8gbWVtb3J5IGZvciAlZCBieXRlcyBhdCBpbmQgJWQgKGFkZHIgMHgleClcbiIsCiAJCQkgICBkYXRhX2J5dGVzLCBpbmRleCwgYWRkcmVzcyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI0MzksOCArMjQ0MSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtYWVzdG9yMzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjU1Myw3ICsyNTU0LDggQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI4IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTI1ODYsOSArMjU4OCw4IEBACiAJZWxzZSB7CiAJCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19hbXBfcXVpcmtfbGlzdCk7CiAJCWlmIChxdWlyaykgewotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkJICAgICJtYWVzdHJvMzogc2V0IGFtcC1ncGlvIGZvciAnJXMnXG4iLAotCQkJCSAgICBzbmRfcGNpX3F1aXJrX25hbWUocXVpcmspKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgInNldCBhbXAtZ3BpbyBmb3IgJyVzJ1xuIiwKKwkJCQkgc25kX3BjaV9xdWlya19uYW1lKHF1aXJrKSk7CiAJCQljaGlwLT5hbXBfZ3BpbyA9IHF1aXJrLT52YWx1ZTsKIAkJfSBlbHNlIGlmIChjaGlwLT5hbGxlZ3JvX2ZsYWcpCiAJCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX0FMTEVHUk87CkBAIC0yNTk4LDkgKzI1OTksOCBAQAogCiAJcXVpcmsgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIG0zX2lyZGFfcXVpcmtfbGlzdCk7CiAJaWYgKHF1aXJrKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTwotCQkJICAgICJtYWVzdHJvMzogZW5hYmxlZCBpcmRhIHdvcmthcm91bmQgZm9yICclcydcbiIsCi0JCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHF1aXJrKSk7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgImVuYWJsZWQgaXJkYSB3b3JrYXJvdW5kIGZvciAnJXMnXG4iLAorCQkJIHNuZF9wY2lfcXVpcmtfbmFtZShxdWlyaykpOwogCQljaGlwLT5pcmRhX3dvcmthcm91bmQgPSAxOwogCX0KIAlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbTNfaHZfcXVpcmtfbGlzdCk7CkBAIC0yNjUyLDcgKzI2NTIsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbTNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX20zX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI2NjEsNyArMjY2MSw3IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJY2hpcC0+c3VzcGVuZF9tZW0gPSB2bWFsbG9jKHNpemVvZih1MTYpICogKFJFVl9CX0NPREVfTUVNT1JZX0xFTkdUSCArIFJFVl9CX0RBVEFfTUVNT1JZX0xFTkdUSCkpOwogCWlmIChjaGlwLT5zdXNwZW5kX21lbSA9PSBOVUxMKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIGFwbSBidWZmZXJcbiIpOwogI2VuZGlmCiAKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgewpAQCAtMjY4NSwxNiArMjY4NSwxNSBAQAogCWlmIChjaGlwLT5odl9jb25maWcgJiBIVl9DVFJMX0VOQUJMRSkgewogCQllcnIgPSBzbmRfbTNfaW5wdXRfcmVnaXN0ZXIoY2hpcCk7CiAJCWlmIChlcnIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiAiCi0JCQkJImZhaWxlZCB3aXRoIGVycm9yICVpIiwgZXJyKTsKKwkJCWRldl93YXJuKGNhcmQtPmRldiwKKwkJCQkgIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWkiLAorCQkJCSBlcnIpOwogCX0KICNlbmRpZgogCiAJc25kX20zX2VuYWJsZV9pbnRzKGNoaXApOwogCXNuZF9tM19hc3NwX2NvbnRpbnVlKGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKmNoaXBfcmV0ID0gY2hpcDsKIAogCXJldHVybiAwOyAKQEAgLTI3MjEsNyArMjcyMCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzY0LDcgKzI3NjQsNyBAQAogCQkJCSAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAogCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm8zOiBubyBNSURJIHN1cHBvcnQuXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAibm8gTUlESSBzdXBwb3J0LlxuIik7CiAjZW5kaWYKIAogCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggMWUwZjZlZS4uYTkzZTdhZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJCWlmKCFzdGFydCkgcmV0dXJuIDA7IC8qIGFscmVhZHkgc3RvcHBlZCAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X3BpcGVfc3RhdGUgY2FsbGVkIHdpdGggd3JvbmcgcGlwZS0+c3RhdHVzIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3IgbWl4YXJ0X3NldF9waXBlX3N0YXRlIGNhbGxlZCB3aXRoIHdyb25nIHBpcGUtPnN0YXR1cyFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmdW5jdGlvbiBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlIHN0YXR1cyAqLwogCX0KIApAQCAtMTAyLDcgKzEwMyw4IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnX3dhaXRfbm90aWYobWdyLCAmcmVxdWVzdCwgc3lzdGVtX21zZ191aWQpOwogCWlmKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciA6IE1TR19TWVNURU1fV0FJVF9TWU5DSFJPX0NNRCB3YXMgbm90IG5vdGlmaWVkICFcbiIpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJImVycm9yIDogTVNHX1NZU1RFTV9XQUlUX1NZTkNIUk9fQ01EIHdhcyBub3Qgbm90aWZpZWQgIVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMjMsNyArMTI1LDkgQEAKIAogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CiAJaWYgKGVyciA8IDAgfHwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzICE9IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NUUkVBTV9TVCoqKl9TVFJFQU1fR1JQX1BBQ0tFVCBlcnI9JXggc3RhdD0leCAhXG4iLCBlcnIsIGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3IgTVNHX1NUUkVBTV9TVCoqKl9TVFJFQU1fR1JQX1BBQ0tFVCBlcnI9JXggc3RhdD0leCAhXG4iLAorCQkJZXJyLCBncm91cF9zdGF0ZV9yZXNwLnR4eF9zdGF0dXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEzNCw3ICsxMzgsOSBAQAogCiAJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CiAJCWlmIChlcnIgPCAwIHx8IGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1RSRUFNX1NUQVJUX1NUUkVBTV9HUlBfUEFDS0VUIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fU1RBUlRfU1RSRUFNX0dSUF9QQUNLRVQgZXJyPSV4IHN0YXQ9JXggIVxuIiwKKwkJCQllcnIsIGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyk7CiAgCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtMTQ3LDcgKzE1Myw5IEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdCksICZzdGF0KTsKIAkJaWYgKGVyciA8IDAgfHwgc3RhdCAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQgZXJyPSV4IHN0YXQ9JXggIVxuIiwgZXJyLCBzdGF0KTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TWVNURU1fU0VORF9TWU5DSFJPX0NNRCBlcnI9JXggc3RhdD0leCAhXG4iLAorCQkJCWVyciwgc3RhdCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNzgsNyArMTg2LDkgQEAKIAkJaWYocmF0ZSA9PSAwKQogCQkJcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Nsb2NrKCVkKSBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlLT5zdGF0dXMgIVxuIiwgcmF0ZSk7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJlcnJvciBtaXhhcnRfc2V0X2Nsb2NrKCVkKSBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlLT5zdGF0dXMgIVxuIiwKKwkJCQlyYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTkwLDcgKzIwMCw3IEBACiAJY2xvY2tfcHJvcGVydGllcy5uYl9jYWxsZXJzID0gMTsgLyogb25seSBvbmUgZW50cnkgaW4gdWlkX2NhbGxlciAhICovCiAJY2xvY2tfcHJvcGVydGllcy51aWRfY2FsbGVyWzBdID0gcGlwZS0+Z3JvdXBfdWlkOwogCi0Jc25kX3ByaW50ZGQoIm1peGFydF9zZXRfY2xvY2sgdG8gJWQga0h6XG4iLCByYXRlKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAibWl4YXJ0X3NldF9jbG9jayB0byAlZCBrSHpcbiIsIHJhdGUpOwogCiAJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NMT0NLX1NFVF9QUk9QRVJUSUVTOwogCXJlcXVlc3QudWlkID0gbWdyLT51aWRfY29uc29sZV9tYW5hZ2VyOwpAQCAtMTk5LDcgKzIwOSw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihjbG9ja19wcm9wX3Jlc3ApLCAmY2xvY2tfcHJvcF9yZXNwKTsKIAlpZiAoZXJyIDwgMCB8fCBjbG9ja19wcm9wX3Jlc3Auc3RhdHVzICE9IDAgfHwgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUgIT0gQ01fU1RBTkRBTE9ORSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ0xPQ0tfU0VUX1BST1BFUlRJRVMgZXJyPSV4IHN0YXQ9JXggbW9kPSV4ICFcbiIsIGVyciwgY2xvY2tfcHJvcF9yZXNwLnN0YXR1cywgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJImVycm9yIE1TR19DTE9DS19TRVRfUFJPUEVSVElFUyBlcnI9JXggc3RhdD0leCBtb2Q9JXggIVxuIiwKKwkJCWVyciwgY2xvY2tfcHJvcF9yZXNwLnN0YXR1cywgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI1Miw3ICsyNjQsOSBAQAogCQkJc3RydWN0IG1peGFydF9zdHJlYW1pbmdfZ3JvdXAgc2dyb3VwX3Jlc3A7CiAJCX0gKmJ1ZjsKIAotCQlzbmRfcHJpbnRkZCgiYWRkX3JlZl9waXBlIGF1ZGlvIGNoaXAoJWQpIHBjbSglZClcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiYWRkX3JlZl9waXBlIGF1ZGlvIGNoaXAoJWQpIHBjbSglZClcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlcik7CiAKIAkJYnVmID0ga21hbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikKQEAgLTMwMiw3ICszMTYsOSBAQAogCiAJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2coY2hpcC0+bWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGJ1Zi0+c2dyb3VwX3Jlc3ApLCAmYnVmLT5zZ3JvdXBfcmVzcCk7CiAJCWlmKChlcnIgPCAwKSB8fCAoYnVmLT5zZ3JvdXBfcmVzcC5zdGF0dXMgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fQUREXyoqUFVUX0dST1VQIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgYnVmLT5zZ3JvdXBfcmVzcC5zdGF0dXMpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fQUREXyoqUFVUX0dST1VQIGVycj0leCBzdGF0PSV4ICFcbiIsCisJCQkJZXJyLCBidWYtPnNncm91cF9yZXNwLnN0YXR1cyk7CiAJCQlrZnJlZShidWYpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTM0MywxMyArMzU5LDE0IEBACiAJCS8qIHJlbGVhc2UgdGhlIGNsb2NrICovCiAJCWVyciA9IG1peGFydF9zZXRfY2xvY2soIG1nciwgcGlwZSwgMCk7CiAJCWlmKCBlcnIgPCAwICkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4YXJ0X3NldF9jbG9jaygwKSByZXR1cm4gZXJyb3IhXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJIm1peGFydF9zZXRfY2xvY2soMCkgcmV0dXJuIGVycm9yIVxuIik7CiAJCX0KIAogCQkvKiBzdG9wIHRoZSBwaXBlICovCiAJCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBpcGUsIDApOwogCQlpZiggZXJyIDwgMCApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0b3BwaW5nIHBpcGUhXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CiAJCX0KIAogCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1RSRUFNX0RFTEVURV9HUk9VUDsKQEAgLTM2MCw3ICszNzcsOSBAQAogCQkvKiBkZWxldGUgdGhlIHBpcGUgKi8KIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoZGVsZXRlX3Jlc3ApLCAmZGVsZXRlX3Jlc3ApOwogCQlpZiAoKGVyciA8IDApIHx8IChkZWxldGVfcmVzcC5zdGF0dXMgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fREVMRVRFX0dST1VQIGVycigleCksIHN0YXR1cygleClcbiIsIGVyciwgZGVsZXRlX3Jlc3Auc3RhdHVzKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fREVMRVRFX0dST1VQIGVycigleCksIHN0YXR1cygleClcbiIsCisJCQkJZXJyLCBkZWxldGVfcmVzcC5zdGF0dXMpOwogCQl9CiAKIAkJcGlwZS0+Z3JvdXBfdWlkID0gKHN0cnVjdCBtaXhhcnRfdWlkKXswLDB9OwpAQCAtNDE0LDcgKzQzMyw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCi0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7CiAKIAkJLyogU1RBUlRfU1RSRUFNICovCiAJCWlmKCBtaXhhcnRfc2V0X3N0cmVhbV9zdGF0ZShzdHJlYW0sIDEpICkKQEAgLTQzMSwxOSArNDUwLDE5IEBACiAKIAkJc3RyZWFtLT5zdGF0dXMgPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19PUEVOOwogCi0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iKTsKKwkJZGV2X2RiZyhzdWJzLT5wY20tPmNhcmQtPmRldiwgIlNORFJWX1BDTV9UUklHR0VSX1NUT1BcbiIpOwogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgogCQkvKiBUT0RPICovCiAJCXN0cmVhbS0+c3RhdHVzID0gTUlYQVJUX1NUUkVBTV9TVEFUVVNfUEFVU0U7Ci0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fUEFVU0VfUFVTSFxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fUEFVU0VfUFVTSFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJLyogVE9ETyAqLwogCQlzdHJlYW0tPnN0YXR1cyA9IE1JWEFSVF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7Ci0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fUEFVU0VfUkVMRUFTRVxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fUEFVU0VfUkVMRUFTRVxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDU2LDcgKzQ3NSw4IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCXdoaWxlIChhdG9taWNfcmVhZCgmbWdyLT5tc2dfcHJvY2Vzc2VkKSA+IDApIHsKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGFydDogY2Fubm90IHByb2Nlc3Mgbm9uYmxvY2sgZXZlbnRzIVxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJtaXhhcnQ6IGNhbm5vdCBwcm9jZXNzIG5vbmJsb2NrIGV2ZW50cyFcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTQ3NCw3ICs0OTQsNyBAQAogCiAJLyogVE9ETyBkZSBmYcOnb24gbm9uIGJsb3F1YW50ZSwgcsOpYXBwbGlxdWVyIGxlcyBod19wYXJhbXMgKHJhdGUsIGJpdHMsIGNvZGVjKSAqLwogCi0Jc25kX3ByaW50ZGQoInNuZF9taXhhcnRfcHJlcGFyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzbmRfbWl4YXJ0X3ByZXBhcmVcbiIpOwogCiAJbWl4YXJ0X3N5bmNfbm9uYmxvY2tfZXZlbnRzKGNoaXAtPm1ncik7CiAKQEAgLTU0MiwxMSArNTYyLDEzIEBACiAJCXN0cmVhbV9wYXJhbS5zYW1wbGVfc2l6ZSA9IDMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzbmRfcHJpbnRkZCgic2V0IFNORFJWX1BDTV9GT1JNQVQgc2FtcGxlX3R5cGUoJWQpIHNhbXBsZV9zaXplKCVkKSBmcmVxKCVkKSBjaGFubmVscyglZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJzZXQgU05EUlZfUENNX0ZPUk1BVCBzYW1wbGVfdHlwZSglZCkgc2FtcGxlX3NpemUoJWQpIGZyZXEoJWQpIGNoYW5uZWxzKCVkKVxuIiwKIAkJICAgc3RyZWFtX3BhcmFtLnNhbXBsZV90eXBlLCBzdHJlYW1fcGFyYW0uc2FtcGxlX3NpemUsIHN0cmVhbV9wYXJhbS5zYW1wbGluZ19mcmVxLCBzdHJlYW0tPmNoYW5uZWxzKTsKIAogCS8qIFRPRE86IHdoYXQgZWxzZSB0byBjb25maWd1cmUgPyAqLwpAQCAtNTY2LDcgKzU4OCw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihyZXNwKSwgJnJlc3ApOwogCWlmKChlcnIgPCAwKSB8fCByZXNwLmVycm9yX2NvZGUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiTVNHX1NUUkVBTV9TRVRfSU5QVVRfU1RBR0VfUEFSQU0gZXJyPSV4OyByZXNwPSV4XG4iLCBlcnIsIHJlc3AuZXJyb3JfY29kZSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk1TR19TVFJFQU1fU0VUX0lOUFVUX1NUQUdFX1BBUkFNIGVycj0leDsgcmVzcD0leFxuIiwKKwkJCWVyciwgcmVzcC5lcnJvcl9jb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtNjI3LDggKzY1MSw5IEBACiAJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCA9IHN1YnMtPnJ1bnRpbWUtPmRtYV9ieXRlczsKIAkJLyogYnVmZmVyaW5mb1tpXS5idWZmZXJfaWQgIGlzIGFscmVhZHkgZGVmaW5lZCAqLwogCi0JCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X2h3X3BhcmFtcyhwY20gJWQpIDogZG1hX2FkZHIoJXgpIGRtYV9ieXRlcygleCkgc3Vicy1udW1iZXIoJWQpXG4iLCBpLAotCQkJCWJ1ZmZlcmluZm9baV0uYnVmZmVyX2FkZHJlc3MsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNuZF9taXhhcnRfaHdfcGFyYW1zKHBjbSAlZCkgOiBkbWFfYWRkcigleCkgZG1hX2J5dGVzKCV4KSBzdWJzLW51bWJlciglZClcbiIsCisJCQlpLCBidWZmZXJpbmZvW2ldLmJ1ZmZlcl9hZGRyZXNzLAogCQkJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCwKIAkJCQlzdWJzLT5udW1iZXIpOwogCX0KQEAgLTcxNCwxNCArNzM5LDE4IEBACiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CiAJfQotCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwKKwkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAKIAkvKiBnZXQgc3RyZWFtIGluZm8gKi8KIAlzdHJlYW0gPSAmKGNoaXAtPnBsYXliYWNrX3N0cmVhbVtwY21fbnVtYmVyXVtzdWJzLT5udW1iZXJdKTsKIAogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKIAkJLyogc3RyZWFtcyBpbiB1c2UgKi8KLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLCBjaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlciwgc3Vicy0+bnVtYmVyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfZXhpdF9vcGVuOwogCX0KQEAgLTczNyw3ICs3NjYsNyBAQAogCS8qIHN0YXJ0IHRoZSBwaXBlIGlmIG5lY2Vzc2FyeSAqLwogCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShjaGlwLT5tZ3IsIHBpcGUsIDEpOwogCWlmKCBlcnIgPCAwICkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdGFydGluZyBwaXBlIVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZXJyb3Igc3RhcnRpbmcgcGlwZSFcbiIpOwogCQlzbmRfbWl4YXJ0X2tpbGxfcmVmX3BpcGUoY2hpcC0+bWdyLCBwaXBlLCAwKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBfZXhpdF9vcGVuOwpAQCAtNzkyLDE0ICs4MjEsMTcgQEAKIAogCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IDI7IC8qIGZvciBpbnN0YW5jZSwgbm8gbW9ubyAqLwogCi0Jc25kX3ByaW50ZGQoInNuZF9taXhhcnRfY2FwdHVyZV9vcGVuIEMlZC9QJWQvU3ViJWRcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwKKwkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAKIAkvKiBnZXQgc3RyZWFtIGluZm8gKi8KIAlzdHJlYW0gPSAmKGNoaXAtPmNhcHR1cmVfc3RyZWFtW3BjbV9udW1iZXJdKTsKIAogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKIAkJLyogc3RyZWFtcyBpbiB1c2UgKi8KLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZCBpbiB1c2VcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzbmRfbWl4YXJ0X2NhcHR1cmVfb3BlbiBDJWQvUCVkL1N1YiVkIGluIHVzZVxuIiwKKwkJCWNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gX2V4aXRfb3BlbjsKIAl9CkBAIC04MTUsNyArODQ3LDcgQEAKIAkvKiBzdGFydCB0aGUgcGlwZSBpZiBuZWNlc3NhcnkgKi8KIAllcnIgPSBtaXhhcnRfc2V0X3BpcGVfc3RhdGUoY2hpcC0+bWdyLCBwaXBlLCAxKTsKIAlpZiggZXJyIDwgMCApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3Igc3RhcnRpbmcgcGlwZSFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIHN0YXJ0aW5nIHBpcGUhXG4iKTsKIAkJc25kX21peGFydF9raWxsX3JlZl9waXBlKGNoaXAtPm1nciwgcGlwZSwgMCk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX2V4aXRfb3BlbjsKQEAgLTg1NSw3ICs4ODcsOCBAQAogCiAJbXV0ZXhfbG9jaygmbWdyLT5zZXR1cF9tdXRleCk7CiAKLQlzbmRfcHJpbnRkZCgic25kX21peGFydF9jbG9zZSBDJWQvUCVkL1N1YiVkXG4iLCBjaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX21peGFydF9jbG9zZSBDJWQvUCVkL1N1YiVkXG4iLAorCQljaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOwogCiAJLyogc2FtcGxlIHJhdGUgcmVsZWFzZWQgKi8KIAlpZigtLW1nci0+cmVmX2NvdW50X3JhdGUgPT0gMCkgewpAQCAtODY1LDcgKzg5OCw5IEBACiAJLyogZGVsZXRlIHBpcGUgKi8KIAlpZiAoc25kX21peGFydF9raWxsX3JlZl9waXBlKG1nciwgc3RyZWFtLT5waXBlLCAwICkgPCAwKSB7CiAKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3Igc25kX21peGFydF9raWxsX3JlZl9waXBlIEMlZFAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHN0cmVhbS0+cGNtX251bWJlcik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImVycm9yIHNuZF9taXhhcnRfa2lsbF9yZWZfcGlwZSBDJWRQJWRcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyKTsKIAl9CiAKIAlzdHJlYW0tPnBpcGUgICAgICA9IE5VTEw7CkBAIC05NDAsNyArOTc1LDggQEAKIAlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG5hbWUsIE1JWEFSVF9QQ01fQU5BTE9HLAogCQkJICAgICAgIE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TLAogCQkJICAgICAgIE1JWEFSVF9DQVBUVVJFX1NUUkVBTVMsICZwY20pKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSB0aGUgYW5hbG9nIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY3JlYXRlIHRoZSBhbmFsb2cgcGNtICVkXG4iLCBjaGlwLT5jaGlwX2lkeCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC05NzEsNyArMTAwNyw4IEBACiAJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBNSVhBUlRfUENNX0RJR0lUQUwsCiAJCQkgICAgICAgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMsCiAJCQkgICAgICAgTUlYQVJUX0NBUFRVUkVfU1RSRUFNUywgJnBjbSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTAxNCw3ICsxMDUxLDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDI4LDggKzEwNjUsNiBAQAogCX0KIAogCW1nci0+Y2hpcFtpZHhdID0gY2hpcDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDczLDcgKzExMDgsNyBAQAogCS8qIHJlc2V0IGJvYXJkIGlmIHNvbWUgZmlybXdhcmUgd2FzIGxvYWRlZCAqLwogCWlmKG1nci0+ZHNwX2xvYWRlZCkgewogCQlzbmRfbWl4YXJ0X3Jlc2V0X2JvYXJkKG1ncik7Ci0JCXNuZF9wcmludGRkKCJyZXNldCBtaVhhcnQgIVxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJyZXNldCBtaVhhcnQgIVxuIik7CiAJfQogCiAJLyogcmVsZWFzZSB0aGUgaS9vIHBvcnRzICovCkBAIC0xMjM0LDcgKzEyNjksOCBAQAogCiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoJnBjaS0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTI2MCw3ICsxMjk2LDcgQEAKIAkJbWdyLT5tZW1baV0ucGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIGkpOwogCQltZ3ItPm1lbVtpXS52aXJ0ID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgaSk7CiAJCWlmICghbWdyLT5tZW1baV0udmlydCkgewotCQkgICAgICAgIHByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIHJlc291cmNlIDB4JWx4XG4iLAorCQkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgcmVzb3VyY2UgMHglbHhcbiIsCiAJCQkgICAgICAgbWdyLT5tZW1baV0ucGh5cyk7CiAJCQlzbmRfbWl4YXJ0X2ZyZWUobWdyKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xMjY5LDcgKzEzMDUsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbWl4YXJ0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMwOCwxMCArMTM0NCwxMSBAQAogCQllbHNlCiAJCQlpZHggPSBpbmRleFtkZXZdICsgaTsKIAkJc25wcmludGYodG1waWQsIHNpemVvZih0bXBpZCksICIlcy0lZCIsIGlkW2Rldl0gPyBpZFtkZXZdIDogIk1JWEFSVCIsIGkpOwotCQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaWR4LCB0bXBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwkJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaWR4LCB0bXBpZCwgVEhJU19NT0RVTEUsCisJCQkJICAgMCwgJmNhcmQpOwogCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNhcmQgJWRcbiIsIGkpOworCQkJZGV2X2VycigmcGNpLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNhcmQgJWRcbiIsIGkpOwogCQkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMKaW5kZXggM2RmMGY1My4uNzFmNGJkYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2NvcmUuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTk0LDcgKzk1LDggQEAKIAogCWlmKCAoc2l6ZSA8IE1TR19ERVNDUklQVE9SX1NJWkUpIHx8IChyZXNwLT5zaXplIDwgKHNpemUgLSBNU0dfREVTQ1JJUFRPUl9TSVpFKSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicHJvYmxlbSB3aXRoIHJlc3BvbnNlIHNpemUgPSAlZFxuIiwgc2l6ZSk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkicHJvYmxlbSB3aXRoIHJlc3BvbnNlIHNpemUgPSAlZFxuIiwgc2l6ZSk7CiAJCWdvdG8gX2NsZWFuX2V4aXQ7CiAJfQogCXNpemUgLT0gTVNHX0RFU0NSSVBUT1JfU0laRTsKQEAgLTE2MSw3ICsxNjMsNyBAQAogCWhlYWRwdHIgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgTVNHX0lOQk9VTkRfRlJFRV9IRUFEKSk7CiAKIAlpZiAodGFpbHB0ciA9PSBoZWFkcHRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yOiBubyBtZXNzYWdlIGZyYW1lIGF2YWlsYWJsZVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvcjogbm8gbWVzc2FnZSBmcmFtZSBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjY1LDcgKzI2Nyw4IEBACiAJaWYgKCEgdGltZW91dCkgewogCQkvKiBlcnJvciAtIG5vIGFjayAqLwogCQltdXRleF91bmxvY2soJm1nci0+bXNnX211dGV4KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3I6IG5vIHJlc3BvbnNlIG9uIG1zZyAleFxuIiwgbXNnX2ZyYW1lKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvcjogbm8gcmVzcG9uc2Ugb24gbXNnICV4XG4iLCBtc2dfZnJhbWUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTI3OCw3ICsyODEsNyBAQAogCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnX2ZyYW1lKTsKIAogCWlmKCByZXF1ZXN0LT5tZXNzYWdlX2lkICE9IHJlc3AubWVzc2FnZV9pZCApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlJFU1BPTlNFIEVSUk9SIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJSRVNQT05TRSBFUlJPUiFcbiIpOwogCiAJbXV0ZXhfdW5sb2NrKCZtZ3ItPm1zZ19tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTMyMSw3ICszMjQsOCBAQAogCWlmICghIHRpbWVvdXQpIHsKIAkJLyogZXJyb3IgLSBubyBhY2sgKi8KIAkJbXV0ZXhfdW5sb2NrKCZtZ3ItPm1zZ19tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yOiBub3RpZmljYXRpb24gJXggbm90IHJlY2VpdmVkXG4iLCBub3RpZl9ldmVudCk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3I6IG5vdGlmaWNhdGlvbiAleCBub3QgcmVjZWl2ZWRcbiIsIG5vdGlmX2V2ZW50KTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zNzgsNyArMzgyLDkgQEAKIAkJCXJlc3Auc2l6ZSA9IHNpemVvZihtaXhhcnRfbXNnX2RhdGEpOwogCQkJZXJyID0gZ2V0X21zZyhtZ3IsICZyZXNwLCBhZGRyKTsKIAkJCWlmKCBlcnIgPCAwICkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInRhc2tsZXQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLCBlcnIsIG1zZyk7CisJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkJInRhc2tsZXQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLAorCQkJCQllcnIsIG1zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTM4OCwxMCArMzk0LDEzIEBACiAJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9JTlBVVF9TVEFHRV9QQUNLRVQ6CiAJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9PVVRQVVRfU1RBR0VfUEFDS0VUOgogCQkJCWlmKG1peGFydF9tc2dfZGF0YVswXSkKLQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsIG1peGFydF9tc2dfZGF0YVswXSk7CisJCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCQkidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsCisJCQkJCQltaXhhcnRfbXNnX2RhdGFbMF0pOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlzbmRfcHJpbnRkZCgidGFza2xldCByZWNlaXZlZCBtZigleCkgOiBtc2dfaWQoJXgpIHVpZCgleCwgJXgpIHNpemUoJXpkKVxuIiwKKwkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkidGFza2xldCByZWNlaXZlZCBtZigleCkgOiBtc2dfaWQoJXgpIHVpZCgleCwgJXgpIHNpemUoJXpkKVxuIiwKIAkJCQkJICAgbXNnLCByZXNwLm1lc3NhZ2VfaWQsIHJlc3AudWlkLm9iamVjdF9pZCwgcmVzcC51aWQuZGVzYywgcmVzcC5zaXplKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTQwMSw3ICs0MTAsOSBAQAogCQljYXNlIE1TR19UWVBFX0NPTU1BTkQ6CiAJCQkvKiBnZXRfbXNnKCkgbmVjZXNzYXJ5ICovCiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0YXNrbGV0IGRvZXNuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggbWVzc2FnZSAleFxuIiwgbXNnKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJInRhc2tsZXQgZG9lc24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBtZXNzYWdlICV4XG4iLAorCQkJCW1zZyk7CiAJCX0gLyogc3dpdGNoIHR5cGUgKi8KIAogCQkvKiBkZWNyZW1lbnQgY291bnRlciAqLwpAQCAtNDUxLDcgKzQ2Miw5IEBACiAJCQlyZXNwLnNpemUgPSBzaXplb2YobWl4YXJ0X21zZ19kYXRhKTsKIAkJCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnICYgfk1TR19UWVBFX01BU0spOwogCQkJaWYoIGVyciA8IDAgKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0OiBlcnJvciglZCkgcmVhZGluZyBtZiAleFxuIiwgZXJyLCBtc2cpOworCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJpbnRlcnJ1cHQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLAorCQkJCQllcnIsIG1zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTQ3Miw3ICs0ODUsOCBAQAogCQkJCQlzdHJ1Y3QgbWl4YXJ0X3N0cmVhbSAqc3RyZWFtOwogCiAJCQkJCWlmICgoY2hpcF9udW1iZXIgPj0gbWdyLT5udW1fY2FyZHMpIHx8IChwY21fbnVtYmVyID49IE1JWEFSVF9QQ01fVE9UQUwpIHx8IChzdWJfbnVtYmVyID49IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TKSkgewotCQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAorCQkJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkJCQkiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAogCQkJCQkJCSAgIGJ1ZmZlcl9pZCwgbm90aWZ5LT5zdHJlYW1zW2ldLnNhbXBsZV9wb3NfbG93X3BhcnQpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTUyNCwxOCArNTM4LDIyIEBACiAJCQkJCX0KICNlbmRpZgogCQkJCQkoKGNoYXIqKW1peGFydF9tc2dfZGF0YSlbcmVzcC5zaXplIC0gMV0gPSAwOwotCQkJCQlzbmRfcHJpbnRkZCgiTUlYQVJUIFRSQUNFIDogJXNcbiIsIChjaGFyKiltaXhhcnRfbXNnX2RhdGEpOworCQkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkJIk1JWEFSVCBUUkFDRSA6ICVzXG4iLAorCQkJCQkJKGNoYXIgKiltaXhhcnRfbXNnX2RhdGEpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAotCQkJc25kX3ByaW50ZGQoImNvbW1hbmQgJXggbm90IGhhbmRsZWRcbiIsIHJlc3AubWVzc2FnZV9pZCk7CisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiY29tbWFuZCAleCBub3QgaGFuZGxlZFxuIiwKKwkJCQlyZXNwLm1lc3NhZ2VfaWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNU0dfVFlQRV9OT1RJRlk6CiAJCQlpZihtc2cgJiBNU0dfQ0FOQ0VMX05PVElGWV9NQVNLKSB7CiAJCQkJbXNnICY9IH5NU0dfQ0FOQ0VMX05PVElGWV9NQVNLOwotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbmNlbGVkIG5vdGlmaWNhdGlvbiAleCAhXG4iLCBtc2cpOworCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJjYW5jZWxlZCBub3RpZmljYXRpb24gJXggIVxuIiwgbXNnKTsKIAkJCX0KIAkJCS8qIG5vIGJyZWFrLCBjb250aW51ZSAhICovCiAJCWNhc2UgTVNHX1RZUEVfQU5TV0VSOgpAQCAtNTU2LDcgKzU3NCw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBNU0dfVFlQRV9SRVFVRVNUOgogCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ZGQoImludGVycnVwdCByZWNlaXZlZCByZXF1ZXN0ICV4XG4iLCBtc2cpOworCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkiaW50ZXJydXB0IHJlY2VpdmVkIHJlcXVlc3QgJXhcbiIsIG1zZyk7CiAJCQkvKiBUT0RPIDogYXJlIHRoZXJlIHRoaW5ncyB0byBkbyBoZXJlID8gKi8KIAkJCWJyZWFrOwogCQl9IC8qIHN3aXRjaCBvbiBtc2cgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKaW5kZXggZWNlMWY4My4uNTgxZTFlNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCkBAIC0xNjUsNyArMTY1LDggQEAKIAogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKCpjb25uZWN0b3IpLCBjb25uZWN0b3IpOwogCWlmKChlcnIgPCAwKSB8fCAoY29ubmVjdG9yLT5lcnJvcl9jb2RlKSB8fCAoY29ubmVjdG9yLT51aWRfY291bnQgPiBNSVhBUlRfTUFYX1BIWVNfQ09OTkVDVE9SUykpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9FTlVNX1BMQVlfQ09OTkVDVE9SXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUExBWV9DT05ORUNUT1JcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMTg0LDcgKzE4NSw3IEBACiAJCQlwaXBlLT51aWRfbGVmdF9jb25uZWN0b3IgPSBjb25uZWN0b3ItPnVpZFtrXTsgICAgLyogZXZlbiAqLwogCQl9CiAKLQkJLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5YmFjayBjb25uZWN0b3JbJWRdLm9iamVjdF9pZCA9ICV4XG4iLCBrLCBjb25uZWN0b3ItPnVpZFtrXS5vYmplY3RfaWQpOyAqLworCQkvKiBkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicGxheWJhY2sgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KIAogCQkvKiBUT0RPOiByZWFsbHkgbmVlZCBzZW5kX21zZyBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPIGZvciBlYWNoIGNvbm5lY3RvciA/IHBlcmhhcHMgZm9yIGFuYWxvZyBsZXZlbCBjYXBzID8gKi8KIAkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTzsKQEAgLTE5NCwxMCArMTk1LDExIEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKIAkJaWYoIGVyciA8IDAgKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk9cbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5ICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLworCQkvKmRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJwbGF5ICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLwogCX0KIAogCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TWVNURU1fRU5VTV9SRUNPUkRfQ09OTkVDVE9SOwpAQCAtMjA3LDcgKzIwOSw4IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZigqY29ubmVjdG9yKSwgY29ubmVjdG9yKTsKIAlpZigoZXJyIDwgMCkgfHwgKGNvbm5lY3Rvci0+ZXJyb3JfY29kZSkgfHwgKGNvbm5lY3Rvci0+dWlkX2NvdW50ID4gTUlYQVJUX01BWF9QSFlTX0NPTk5FQ1RPUlMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TWVNURU1fRU5VTV9SRUNPUkRfQ09OTkVDVE9SXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUkVDT1JEX0NPTk5FQ1RPUlxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CkBAIC0yMjYsNyArMjI5LDcgQEAKIAkJCXBpcGUtPnVpZF9sZWZ0X2Nvbm5lY3RvciA9IGNvbm5lY3Rvci0+dWlkW2tdOyAgICAvKiBldmVuICovCiAJCX0KIAotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImNhcHR1cmUgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KKwkJLyogZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgImNhcHR1cmUgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KIAogCQkvKiBUT0RPOiByZWFsbHkgbmVlZCBzZW5kX21zZyBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPIGZvciBlYWNoIGNvbm5lY3RvciA/IHBlcmhhcHMgZm9yIGFuYWxvZyBsZXZlbCBjYXBzID8gKi8KIAkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTzsKQEAgLTIzNiwxMCArMjM5LDExIEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKIAkJaWYoIGVyciA8IDAgKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk9cbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJyZWMgIGFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50ID0gJXhcbiIsIGF1ZGlvX2luZm8tPmluZm8uYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQpOyovCisJCS8qZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInJlYyAgYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQgPSAleFxuIiwgYXVkaW9faW5mby0+aW5mby5hbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCk7Ki8KIAl9CiAJZXJyID0gMDsKIApAQCAtMjcyLDcgKzI3Niw5IEBACiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoY29uc29sZV9tZ3IpLCAmY29uc29sZV9tZ3IpOwogCiAJaWYoIChlcnIgPCAwKSB8fCAoY29uc29sZV9tZ3IuZXJyb3JfY29kZSAhPSAwKSApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEIDogZXJyPSV4XG4iLCBjb25zb2xlX21nci5lcnJvcl9jb2RlKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEIDogZXJyPSV4XG4iLAorCQkJY29uc29sZV9tZ3IuZXJyb3JfY29kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjg2LDcgKzI5Miw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihwaHlzX2lvKSwgJnBoeXNfaW8pOwogCWlmKCAoZXJyIDwgMCkgfHwgKCBwaHlzX2lvLmVycm9yX2NvZGUgIT0gMCApICkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gZXJyKCV4KSBlcnJvcl9jb2RlKCV4KVxuIiwgZXJyLCBwaHlzX2lvLmVycm9yX2NvZGUgKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gZXJyKCV4KSBlcnJvcl9jb2RlKCV4KVxuIiwKKwkJCWVyciwgcGh5c19pby5lcnJvcl9jb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMjIsNyArMzMwLDcgQEAKIAkvKiB0aGlzIGNvbW1hbmQgaGFzIG5vIGRhdGEuIHJlc3BvbnNlIGlzIGEgMzIgYml0IHN0YXR1cyAqLwogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGspLCAmayk7CiAJaWYoIChlcnIgPCAwKSB8fCAoayAhPSAwKSApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9TRU5EX1NZTkNIUk9fQ01EXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVycm9yIE1TR19TWVNURU1fU0VORF9TWU5DSFJPX0NNRFxuIik7CiAJCXJldHVybiBlcnIgPT0gMCA/IC1FSU5WQUwgOiBlcnI7CiAJfQogCkBAIC0zNDgsNyArMzU2LDcgQEAKIAogCS8qIG1vdGhlcmJvYXJkIHhpbGlueCBzdGF0dXMgNSB3aWxsIHNheSB0aGF0IHRoZSBib2FyZCBpcyBwZXJmb3JtaW5nIGEgcmVzZXQgKi8KIAlpZiAoc3RhdHVzX3hpbGlueCA9PSA1KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydCBpcyByZXNldHRpbmcgIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJtaVhhcnQgaXMgcmVzZXR0aW5nICFcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluIGxhdGVyICovCiAJfQogCkBAIC0zNTcsMTIgKzM2NSwxMyBAQAogCiAJCS8qIHhpbGlueCBhbHJlYWR5IGxvYWRlZCA/ICovIAogCQlpZiAoc3RhdHVzX3hpbGlueCA9PSA0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInhpbGlueCBpcyBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJ4aWxpbnggaXMgYWxyZWFkeSBsb2FkZWQgIVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQkvKiB0aGUgc3RhdHVzIHNob3VsZCBiZSAwID09ICJpZGxlIiAqLwogCQlpZiAoc3RhdHVzX3hpbGlueCAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ4aWxpbnggbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkieGlsaW54IGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwKIAkJCQkgICBzdGF0dXNfeGlsaW54KTsKIAkJCXJldHVybiAtRUlPOyAvKiBtb2Rwcm9iIC1yIG1heSBoZWxwID8gKi8KIAkJfQpAQCAtMzkzLDEzICs0MDIsMTQgQEAKIAljYXNlIE1JWEFSVF9NT1RIRVJCT0FSRF9FTEZfSU5ERVg6CiAKIAkJaWYgKHN0YXR1c19lbGYgPT0gNCkgewotCQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlbGYgZmlsZSBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJlbGYgZmlsZSBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogdGhlIHN0YXR1cyBzaG91bGQgYmUgMCA9PSAiaWRsZSIgKi8KIAkJaWYgKHN0YXR1c19lbGYgIT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZWxmIGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVsZiBsb2FkIGVycm9yICEgc3RhdHVzID0gJWRcbiIsCiAJCQkJICAgc3RhdHVzX2VsZik7CiAJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCiAJCX0KQEAgLTQwNyw3ICs0MTcsNyBAQAogCQkvKiB3YWl0IGZvciB4aWxpbnggc3RhdHVzID09IDQgKi8KIAkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19NWExYX1NUQVRVU19PRkZTRVQsIDEsIDQsIDUwMCk7IC8qIDVzZWMgKi8KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInhpbGlueCB3YXMgbm90IGxvYWRlZCBvciAiCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAieGlsaW54IHdhcyBub3QgbG9hZGVkIG9yICIKIAkJCQkgICAiY291bGQgbm90IGJlIHN0YXJ0ZWRcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtNDI5LDcgKzQzOSw3IEBACiAJCS8qIHdhaXQgZm9yIGVsZiBzdGF0dXMgPT0gNCAqLwogCQllcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0VMRl9TVEFUVVNfT0ZGU0VULCAxLCA0LCAzMDApOyAvKiAzc2VjICovCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbGYgY291bGQgbm90IGJlIHN0YXJ0ZWRcbiIpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVsZiBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTQ0Myw3ICs0NTMsNyBAQAogCiAJCS8qIGVsZiBhbmQgeGlsaW54IHNob3VsZCBiZSBsb2FkZWQgKi8KIAkJaWYgKHN0YXR1c19lbGYgIT0gNCB8fCBzdGF0dXNfeGlsaW54ICE9IDQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAieGlsaW54IG9yIGVsZiBub3QgIgorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInhpbGlueCBvciBlbGYgbm90ICIKIAkJCSAgICAgICAic3VjY2Vzc2Z1bGx5IGxvYWRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCiAJCX0KQEAgLTQ1MSw3ICs0NjEsNyBAQAogCQkvKiB3YWl0IGZvciBkYXVnaHRlciBkZXRlY3Rpb24gIT0gMCAqLwogCQllcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RCUkRfUFJFU0VOQ0VfT0ZGU0VULCAwLCAwLCAzMCk7IC8qIDMwMG1zZWMgKi8KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0YXJ0aW5nIGVsZiBmaWxlXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdGFydGluZyBlbGYgZmlsZVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTQ2Nyw3ICs0NzcsOCBAQAogCiAJCS8qIGRhdWdodGVyIHNob3VsZCBiZSBpZGxlICovCiAJCWlmIChzdGF0dXNfZGF1Z2h0ICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZGF1Z2h0ZXIgbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkiZGF1Z2h0ZXIgbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAogCQkJICAgICAgIHN0YXR1c19kYXVnaHQpOwogCQkJcmV0dXJuIC1FSU87IC8qIG1vZHByb2IgLXIgbWF5IGhlbHAgPyAqLwogCQl9CkBAIC00ODcsNyArNDk4LDcgQEAKIAkJLyogd2FpdCBmb3Igc3RhdHVzID09IDIgKi8KIAkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19EWExYX1NUQVRVU19PRkZTRVQsIDEsIDIsIDMwKTsgLyogMzAwbXNlYyAqLwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGF1Z2h0ZXIgYm9hcmQgbG9hZCBlcnJvclxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZGF1Z2h0ZXIgYm9hcmQgbG9hZCBlcnJvclxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTUwOSw3ICs1MjAsNyBAQAogICAgICAgICAvKiB3YWl0IGZvciBkYXVnaHRlciBzdGF0dXMgPT0gMyAqLwogICAgICAgICBlcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RYTFhfU1RBVFVTX09GRlNFVCwgMSwgMywgMzAwKTsgLyogM3NlYyAqLwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkgICAiZGF1Z2h0ZXIgYm9hcmQgY291bGQgbm90IGJlIGluaXRpYWxpc2VkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC01MjAsNyArNTMxLDcgQEAKIAkvKiBmaXJzdCBjb21tdW5pY2F0aW9uIHdpdGggZW1iZWRkZWQgKi8KIAllcnIgPSBtaXhhcnRfZmlyc3RfaW5pdChtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaVhhcnQgY291bGQgbm90IGJlIHNldCB1cFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJtaVhhcnQgY291bGQgbm90IGJlIHNldCB1cFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC01NDAsNyArNTUxLDggQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3ByaW50ZGQoIm1pWGFydCBmaXJtd2FyZSBkb3dubG9hZGVkIGFuZCBzdWNjZXNzZnVsbHkgc2V0IHVwXG4iKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkibWlYYXJ0IGZpcm13YXJlIGRvd25sb2FkZWQgYW5kIHN1Y2Nlc3NmdWxseSBzZXQgdXBcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTksNyArNTcxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXNwcmludGYocGF0aCwgIm1peGFydC8lcyIsIGZ3X2ZpbGVzW2ldKTsKIAkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwYXRoLCAmbWdyLT5wY2ktPmRldikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydDogY2FuJ3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwgcGF0aCk7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJtaVhhcnQ6IGNhbid0IGxvYWQgZmlybXdhcmUgJXNcbiIsIHBhdGgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAkJLyogZmFrZSBod2RlcCBkc3AgcmVjb3JkICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwppbmRleCAzYmE2MTc0Li4yNGExOTU1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMKQEAgLTMyOSw3ICszMjksOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKIAlpZigoZXJyPDApIHx8IChyZXNwLmVycm9yX2NvZGUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLCBjaGlwLT5jaGlwX2lkeCwgaXNfY2FwdHVyZSwgcmVzcC5lcnJvcl9jb2RlKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIGlzX2NhcHR1cmUsIHJlc3AuZXJyb3JfY29kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc2Miw3ICs3NjQsOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdHVzKSwgJnN0YXR1cyk7CiAJaWYoKGVycjwwKSB8fCBzdGF0dXMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdGF0dXMpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtODA1LDcgKzgwOSw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihzdGF0dXMpLCAmc3RhdHVzKTsKIAlpZigoZXJyPDApIHx8IHN0YXR1cykgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIE1TR19TVFJFQU1fU0VUX0lOX0FVRElPX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdGF0dXMpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBNU0dfU1RSRUFNX1NFVF9JTl9BVURJT19MRVZFTCBjYXJkKCVkKSBzdGF0dXMoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHN0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk3Nyw3ICs5ODMsOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKIAlpZigoZXJyPDApIHx8IHJlc3ApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfQ09OTkVDVE9SX1NFVF9PVVRfQVVESU9fTEVWRUwgY2FyZCglZCkgcmVzcCgleClcbiIsIGNoaXAtPmNoaXBfaWR4LCByZXNwKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZXJyb3IgTVNHX0NPTk5FQ1RPUl9TRVRfT1VUX0FVRElPX0xFVkVMIGNhcmQoJWQpIHJlc3AoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHJlc3ApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCmluZGV4IGZlNzlmZmYuLmRkYzYwMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCkBAIC0zMTgsNyArMzE4LDggQEAKIAlvZmZzZXQgLT0gY2hpcC0+YnVmZmVyX3N0YXJ0OwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gY2hpcC0+YnVmZmVyX3NpemUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAid3JpdGVfYnVmZmVyIGludmFsaWQgb2Zmc2V0ID0gJWQgc2l6ZSA9ICVkXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ3cml0ZV9idWZmZXIgaW52YWxpZCBvZmZzZXQgPSAlZCBzaXplID0gJWRcbiIsCiAJCQkgICBvZmZzZXQsIHNpemUpOwogCQlyZXR1cm47CiAJfQpAQCAtMzY2LDcgKzM2Nyw4IEBACiAJCSBOTV9SRUNPUkRfUkVHX09GRlNFVCA6IE5NX1BMQVlCQUNLX1JFR19PRkZTRVQpOwogCiAJaWYgKHNuZF9ubTI1Nl9yZWFkYihjaGlwLCBwb2Zmc2V0KSAmIDEpIHsKLQkJc25kX3ByaW50ZCgiTk0yNTY6IEVuZ2luZSB3YXMgZW5hYmxlZCB3aGlsZSBsb2FkaW5nIGNvZWZmaWNpZW50cyFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJOTTI1NjogRW5naW5lIHdhcyBlbmFibGVkIHdoaWxlIGxvYWRpbmcgY29lZmZpY2llbnRzIVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ2Niw3ICs0NjgsOCBAQAogCWlmIChjaGlwLT5pcnEgPCAwKSB7CiAJCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgY2hpcC0+aW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+cGNpLT5pcnEpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+cGNpLT5pcnEpOwogCQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfbXV0ZXgpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQpAQCAtMTAzOSw3ICsxMDQyLDcgQEAKIAlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMSkgewogCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7CiAJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMSk7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOwogCQlzbmRfbm0yNTZfd3JpdGV3KGNoaXAsIE5NX0lOVF9SRUcsIDB4ODAwMCk7CiAJCWNieXRlID0gc25kX25tMjU2X3JlYWRiKGNoaXAsIDB4NDAwKTsKIAkJc25kX25tMjU2X3dyaXRlYihjaGlwLCAweDQwMCwgY2J5dGUgfCAyKTsKQEAgLTEwNDgsMTQgKzEwNTEsMTUgQEAKIAlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgewogCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzI7CiAJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMik7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOwogCQljYnl0ZSA9IHNuZF9ubTI1Nl9yZWFkYihjaGlwLCAweDQwMCk7CiAJCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg0MDAsIGNieXRlICYgfjIpOwogCX0KIAogCS8qIFVua25vd24gaW50ZXJydXB0LiAqLwogCWlmIChzdGF0dXMpIHsKLQkJc25kX3ByaW50ZCgiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAogCQkJICAgc3RhdHVzKTsKIAkJLyogUHJheS4gKi8KIAkJTk1fQUNLX0lOVChjaGlwLCBzdGF0dXMpOwpAQCAtMTEwNCw3ICsxMTA4LDcgQEAKIAlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzEpIHsKIAkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMTsKIAkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzEpOwotCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKIAkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOwogCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSB8IDIpOwogCX0KQEAgLTExMTIsMTQgKzExMTYsMTUgQEAKIAlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzIpIHsKIAkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMjsKIAkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzIpOwotCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKIAkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOwogCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSAmIH4yKTsKIAl9CiAKIAkvKiBVbmtub3duIGludGVycnVwdC4gKi8KIAlpZiAoc3RhdHVzKSB7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKIAkJCSAgIHN0YXR1cyk7CiAJCS8qIFByYXkuICovCiAJCU5NMl9BQ0tfSU5UKGNoaXAsIHN0YXR1cyk7CkBAIC0xMjQ1LDcgKzEyNTAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCXNuZF9wcmludGQoIm5tMjU2OiBhYzk3IGNvZGVjIG5vdCByZWFkeS4uXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm5tMjU2OiBhYzk3IGNvZGVjIG5vdCByZWFkeS4uXG4iKTsKIH0KIAogLyogc3RhdGljIHJlc29sdXRpb24gdGFibGUgKi8KQEAgLTEzNDcsNyArMTM1Miw4IEBACiAKIAl0ZW1wID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmJ1ZmZlcl9hZGRyICsgY2hpcC0+YnVmZmVyX2VuZCAtIDB4NDAwLCAxNik7CiAJaWYgKHRlbXAgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gc2NhbiBmb3IgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiVW5hYmxlIHRvIHNjYW4gZm9yIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0xMzYxLDEyICsxMzY3LDE0IEBACiAJCWlmIChwb2ludGVyID09IDB4ZmZmZmZmZmYgfHwKIAkJICAgIHBvaW50ZXIgPCBjaGlwLT5idWZmZXJfc2l6ZSB8fAogCQkgICAgcG9pbnRlciA+IGNoaXAtPmJ1ZmZlcl9lbmQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgc2lnbmF0dXJlIGZvdW5kOiAweCV4XG4iLCBwb2ludGVyKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJpbnZhbGlkIHNpZ25hdHVyZSBmb3VuZDogMHgleFxuIiwgcG9pbnRlcik7CiAJCQlpb3VubWFwKHRlbXApOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0gZWxzZSB7CiAJCQlwb2ludGVyX2ZvdW5kID0gcG9pbnRlcjsKLQkJCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBmb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCisJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJmb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCiAJCQkgICAgICAgcG9pbnRlcik7CiAJCX0KIAl9CkBAIC0xNDExLDggKzE0MTksNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm0yNTY6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE1MjAsMTQgKzE1MjcsMTUgQEAKIAljaGlwLT5yZXNfY3BvcnQgPSByZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSwKIAkJCQkJICAgICBjYXJkLT5kcml2ZXIpOwogCWlmIChjaGlwLT5yZXNfY3BvcnQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtZW1vcnkgcmVnaW9uIDB4JWx4IChzaXplIDB4JXgpIGJ1c3lcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibWVtb3J5IHJlZ2lvbiAweCVseCAoc2l6ZSAweCV4KSBidXN5XG4iLAogCQkJICAgY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfX2Vycm9yOwogCX0KIAljaGlwLT5jcG9ydCA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5jcG9ydF9hZGRyLCBOTV9QT1JUMl9TSVpFKTsKIAlpZiAoY2hpcC0+Y3BvcnQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gbWFwIGNvbnRyb2wgcG9ydCAlbHhcbiIsIGNoaXAtPmNwb3J0X2FkZHIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBtYXAgY29udHJvbCBwb3J0ICVseFxuIiwKKwkJCWNoaXAtPmNwb3J0X2FkZHIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMTUzNywxMiArMTU0NSwxNCBAQAogCQlwdmFsID0gc25kX25tMjU2X3JlYWR3KGNoaXAsIE5NX01JWEVSX1BSRVNFTkNFKTsKIAkJaWYgKChwdmFsICYgTk1fUFJFU0VOQ0VfTUFTSykgIT0gTk1fUFJFU0VOQ0VfVkFMVUUpIHsKIAkJCWlmICghIGZvcmNlX2FjOTcpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm5tMjU2OiBubyBhYzk3IGlzIGZvdW5kIVxuIik7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIgIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSAiCi0JCQkJICAgICAgICJwYXNzaW5nIGluIHRoZSBtb2R1bGUgcGFyYW1ldGVyXG4iKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiAgICBmb3JjZV9hYzk3PTFcbiIpOwotCQkJCXByaW50ayhLRVJOX0VSUiAiICBvciB0cnkgc2IxNiwgb3BsM3NhMiwgb3IgIgotCQkJCSAgICAgICAiY3M0MjN4IGRyaXZlcnMgaW5zdGVhZC5cbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkibm8gYWM5NyBpcyBmb3VuZCFcbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiZm9yY2UgdGhlIGRyaXZlciB0byBsb2FkIGJ5IHBhc3NpbmcgaW4gdGhlIG1vZHVsZSBwYXJhbWV0ZXJcbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiIGZvcmNlX2FjOTc9MVxuIik7CisJCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJCSJvciB0cnkgc2IxNiwgb3BsM3NhMiwgb3IgY3M0MjN4IGRyaXZlcnMgaW5zdGVhZC5cbiIpOwogCQkJCWVyciA9IC1FTlhJTzsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CkBAIC0xNTgxLDE0ICsxNTkxLDE0IEBACiAJY2hpcC0+YnVmZmVyX3N0YXJ0ID0gY2hpcC0+YnVmZmVyX2VuZCAtIGNoaXAtPmJ1ZmZlcl9zaXplOwogCWNoaXAtPmJ1ZmZlcl9hZGRyICs9IGNoaXAtPmJ1ZmZlcl9zdGFydDsKIAotCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBNYXBwaW5nIHBvcnQgMSBmcm9tIDB4JXggLSAweCV4XG4iLAorCWRldl9pbmZvKGNhcmQtPmRldiwgIk1hcHBpbmcgcG9ydCAxIGZyb20gMHgleCAtIDB4JXhcbiIsCiAJICAgICAgIGNoaXAtPmJ1ZmZlcl9zdGFydCwgY2hpcC0+YnVmZmVyX2VuZCk7CiAKIAljaGlwLT5yZXNfYnVmZmVyID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPmJ1ZmZlcl9hZGRyLAogCQkJCQkgICAgICBjaGlwLT5idWZmZXJfc2l6ZSwKIAkJCQkJICAgICAgY2FyZC0+ZHJpdmVyKTsKIAlpZiAoY2hpcC0+cmVzX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm5tMjU2OiBidWZmZXIgMHglbHggKHNpemUgMHgleCkgYnVzeVxuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJidWZmZXIgMHglbHggKHNpemUgMHgleCkgYnVzeVxuIiwKIAkJCSAgIGNoaXAtPmJ1ZmZlcl9hZGRyLCBjaGlwLT5idWZmZXJfc2l6ZSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfX2Vycm9yOwpAQCAtMTU5Niw3ICsxNjA2LDggQEAKIAljaGlwLT5idWZmZXIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YnVmZmVyX2FkZHIsIGNoaXAtPmJ1ZmZlcl9zaXplKTsKIAlpZiAoY2hpcC0+YnVmZmVyID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIG1hcCByaW5nIGJ1ZmZlciBhdCAlbHhcbiIsIGNoaXAtPmJ1ZmZlcl9hZGRyKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gbWFwIHJpbmcgYnVmZmVyIGF0ICVseFxuIiwKKwkJCWNoaXAtPmJ1ZmZlcl9hZGRyKTsKIAkJZ290byBfX2Vycm9yOwogCX0KIApAQCAtMTYyNiw4ICsxNjM3LDYgQEAKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkKIAkJZ290byBfX2Vycm9yOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKmNoaXBfcmV0ID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTY2MCwxMiArMTY2OSwxMiBAQAogCiAJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbm0yNTZfcXVpcmtzKTsKIAlpZiAocSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiBFbmFibGVkIHF1aXJrIGZvciAlcy5cbiIsCisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiRW5hYmxlZCBxdWlyayBmb3IgJXMuXG4iLAogCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZShxKSk7CiAJCXN3aXRjaCAocS0+dmFsdWUpIHsKIAkJY2FzZSBOTV9CTEFDS0xJU1RFRDoKLQkJCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBUaGUgZGV2aWNlIGlzIGJsYWNrbGlzdGVkLiAiCi0JCQkgICAgICAgIkxvYWRpbmcgc3RvcHBlZFxuIik7CisJCQlkZXZfaW5mbygmcGNpLT5kZXYsCisJCQkJICJUaGUgZGV2aWNlIGlzIGJsYWNrbGlzdGVkLiBMb2FkaW5nIHN0b3BwZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWNhc2UgTk1fUkVTRVRfV09SS0FST1VORF8yOgogCQkJcmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKQEAgLTE2NzYsNyArMTY4NSw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTY5MSw3ICsxNzAwLDcgQEAKIAkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk5NMjU2WEwrIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgZGV2aWNlIGlkIDB4JXhcbiIsIHBjaS0+ZGV2aWNlKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJpbnZhbGlkIGRldmljZSBpZCAweCV4XG4iLCBwY2ktPmRldmljZSk7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3MTQsMTIgKzE3MjMsMTIgQEAKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCiAJaWYgKHJlc2V0X3dvcmthcm91bmQpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJubTI1NjogcmVzZXRfd29ya2Fyb3VuZCBhY3RpdmF0ZWRcbiIpOworCQlkZXZfZGJnKCZwY2ktPmRldiwgInJlc2V0X3dvcmthcm91bmQgYWN0aXZhdGVkXG4iKTsKIAkJY2hpcC0+cmVzZXRfd29ya2Fyb3VuZCA9IDE7CiAJfQogCiAJaWYgKHJlc2V0X3dvcmthcm91bmRfMikgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiByZXNldF93b3JrYXJvdW5kXzIgYWN0aXZhdGVkXG4iKTsKKwkJZGV2X2RiZygmcGNpLT5kZXYsICJyZXNldF93b3JrYXJvdW5kXzIgYWN0aXZhdGVkXG4iKTsKIAkJY2hpcC0+cmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCmluZGV4IDMyNzQ5MDcuLjRiOGEzMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd3JpdGUgdGltZW91dFxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyB3cml0ZSB0aW1lb3V0XG4iKTsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3dyaXRlX2FjOTcpOwogCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJCXJlZyBePSAweGZmZmY7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCB0aW1lb3V0IG9uIGNvZGVjICV1XG4iLCBjb2RlYyk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyByZWFkIHRpbWVvdXQgb24gY29kZWMgJXVcbiIsIGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3JlYWRfYWM5Nyk7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJCQkJCU9YWUdFTl9TUElfQlVTWSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJveHlnZW46IFNQSSB3YWl0IHRpbWVvdXRcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAib3h5Z2VuOiBTUEkgd2FpdCB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMjg4LDUgKzI4OCw1IEBACiAJCSAgICAgICYgT1hZR0VOX0VFUFJPTV9CVVNZKSkKIAkJCXJldHVybjsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRUVQUk9NIHdyaXRlIHRpbWVvdXRcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRUVQUk9NIHdyaXRlIHRpbWVvdXRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCBiMGNiNDhhLi5iNjdlMzA2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJCW94eWdlbl9jbGVhcl9iaXRzOChjaGlwLCBPWFlHRU5fTUlTQywKIAkJCQkgICBPWFlHRU5fTUlTQ19XUklURV9QQ0lfU1VCSUQpOwogCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJFRVBST00gSUQgcmVzdG9yZWRcbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJFRVBST00gSUQgcmVzdG9yZWRcbiIpOwogCX0KIH0KIApAQCAtNTk1LDcgKzU5NSw4IEBACiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgb3duZXIsIHNpemVvZigqY2hpcCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIG93bmVyLAorCQkJICAgc2l6ZW9mKCpjaGlwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC02MTYsMTMgKzYxNywxMyBAQAogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIERSSVZFUik7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CiAJCWdvdG8gZXJyX3BjaV9lbmFibGU7CiAJfQogCiAJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMCkgJiBJT1JFU09VUkNFX0lPKSB8fAogCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkgPCBPWFlHRU5fSU9fU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIFBDSSBJL08gcmFuZ2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgUENJIEkvTyByYW5nZVxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBlcnJfcGNpX3JlZ2lvbnM7CiAJfQpAQCAtNjQ4LDcgKzY0OSw2IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gb3h5Z2VuX2NhcmRfZnJlZTsKIAogCWNvbmZpZ3VyZV9wY2llX2JyaWRnZShwY2kpOwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIG94eWdlbl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaW50ZXJydXB0ICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaW50ZXJydXB0ICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gZXJyX2NhcmQ7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpAQCAtNzk2LDcgKzc5Niw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlZW5hYmxlIGRldmljZSIpOworCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWVuYWJsZSBkZXZpY2UiKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jIGIvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jCmluZGV4IGVkNmYxOTkuLjRjZjMyMDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmMKQEAgLTIzOCwxMSArMjM4LDIxIEBACiAJY3M0MjQ1X3dyaXRlX3NwaShjaGlwLCBDUzQyNDVfTUNMS19GUkVRKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2hpZnRfYml0cyh1bnNpZ25lZCBpbnQgdmFsdWUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNoaWZ0X2Zyb20sCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNoaWZ0X3RvLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtYXNrKQoreworCWlmIChzaGlmdF9mcm9tIDwgc2hpZnRfdG8pCisJCXJldHVybiAodmFsdWUgPDwgKHNoaWZ0X3RvIC0gc2hpZnRfZnJvbSkpICYgbWFzazsKKwllbHNlCisJCXJldHVybiAodmFsdWUgPj4gKHNoaWZ0X2Zyb20gLSBzaGlmdF90bykpICYgbWFzazsKK30KKwogdW5zaWduZWQgaW50IGFkanVzdF9kZ19kYWNfcm91dGluZyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJCQkgIHVuc2lnbmVkIGludCBwbGF5X3JvdXRpbmcpCiB7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQl1bnNpZ25lZCBpbnQgcm91dGluZyA9IDA7CiAKIAlzd2l0Y2ggKGRhdGEtPm91dHB1dF9zZWwpIHsKIAljYXNlIFBMQVlCQUNLX0RTVF9IUDoKQEAgLTI1MiwxNSArMjYyLDIzIEBACiAJCQlPWFlHRU5fUExBWV9NVVRFNjcsIE9YWUdFTl9QTEFZX01VVEVfTUFTSyk7CiAJCWJyZWFrOwogCWNhc2UgUExBWUJBQ0tfRFNUX01VTFRJQ0g6Ci0JCXJvdXRpbmcgPSAoMCA8PCBPWFlHRU5fUExBWV9EQUMwX1NPVVJDRV9TSElGVCkgfAotCQkJICAoMiA8PCBPWFlHRU5fUExBWV9EQUMxX1NPVVJDRV9TSElGVCkgfAotCQkJICAoMSA8PCBPWFlHRU5fUExBWV9EQUMyX1NPVVJDRV9TSElGVCkgfAotCQkJICAoMCA8PCBPWFlHRU5fUExBWV9EQUMzX1NPVVJDRV9TSElGVCk7CiAJCW94eWdlbl93cml0ZThfbWFza2VkKGNoaXAsIE9YWUdFTl9QTEFZX1JPVVRJTkcsCiAJCQlPWFlHRU5fUExBWV9NVVRFMDEsIE9YWUdFTl9QTEFZX01VVEVfTUFTSyk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gcm91dGluZzsKKwlyZXR1cm4gKHBsYXlfcm91dGluZyAmIE9YWUdFTl9QTEFZX0RBQzBfU09VUkNFX01BU0spIHwKKwkgICAgICAgc2hpZnRfYml0cyhwbGF5X3JvdXRpbmcsCisJCQkgIE9YWUdFTl9QTEFZX0RBQzJfU09VUkNFX1NISUZULAorCQkJICBPWFlHRU5fUExBWV9EQUMxX1NPVVJDRV9TSElGVCwKKwkJCSAgT1hZR0VOX1BMQVlfREFDMV9TT1VSQ0VfTUFTSykgfAorCSAgICAgICBzaGlmdF9iaXRzKHBsYXlfcm91dGluZywKKwkJCSAgT1hZR0VOX1BMQVlfREFDMV9TT1VSQ0VfU0hJRlQsCisJCQkgIE9YWUdFTl9QTEFZX0RBQzJfU09VUkNFX1NISUZULAorCQkJICBPWFlHRU5fUExBWV9EQUMyX1NPVVJDRV9NQVNLKSB8CisJICAgICAgIHNoaWZ0X2JpdHMocGxheV9yb3V0aW5nLAorCQkJICBPWFlHRU5fUExBWV9EQUMwX1NPVVJDRV9TSElGVCwKKwkJCSAgT1hZR0VOX1BMQVlfREFDM19TT1VSQ0VfU0hJRlQsCisJCQkgIE9YWUdFTl9QTEFZX0RBQzNfU09VUkNFX01BU0spOwogfQogCiB2b2lkIGR1bXBfY3M0MjQ1X3JlZ2lzdGVycyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2hkbWkuYwppbmRleCAxMzZkYWM2YS4uOTFkOTJiYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCWlmIChjaGlwLT51YXJ0X2lucHV0X2NvdW50ID49IDIgJiYKIAkgICAgY2hpcC0+dWFydF9pbnB1dFtjaGlwLT51YXJ0X2lucHV0X2NvdW50IC0gMl0gPT0gJ08nICYmCiAJICAgIGNoaXAtPnVhcnRfaW5wdXRbY2hpcC0+dWFydF9pbnB1dF9jb3VudCAtIDFdID09ICdLJykgewotCQlwcmludGsoS0VSTl9ERUJVRyAibWVzc2FnZSBmcm9tIEhETUkgY2hpcCByZWNlaXZlZDpcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm1lc3NhZ2UgZnJvbSBIRE1JIGNoaXAgcmVjZWl2ZWQ6XG4iKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwKIAkJCQkgICAgIGNoaXAtPnVhcnRfaW5wdXQsIGNoaXAtPnVhcnRfaW5wdXRfY291bnQpOwogCQljaGlwLT51YXJ0X2lucHV0X2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2xpYi5jCmluZGV4IDBlYmU3ZjUuLjcwNmIxYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9saWIuYwpAQCAtNTYsOSArNTYsOSBAQAogCWlmIChoYXNfcG93ZXIgIT0gZGF0YS0+aGFzX3Bvd2VyKSB7CiAJCWRhdGEtPmhhc19wb3dlciA9IGhhc19wb3dlcjsKIAkJaWYgKGhhc19wb3dlcikgewotCQkJc25kX3ByaW50ayhLRVJOX05PVElDRSAicG93ZXIgcmVzdG9yZWRcbiIpOworCQkJZGV2X25vdGljZShjaGlwLT5jYXJkLT5kZXYsICJwb3dlciByZXN0b3JlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fQ1JJVAorCQkJZGV2X2NyaXQoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJCSAgICJIZXkhIERvbid0IHVucGx1ZyB0aGUgcG93ZXIgY2FibGUhXG4iKTsKIAkJCS8qIFRPRE86IHN0b3AgUENNcyAqLwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IGQzNzliMjguLjhkMDk0NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAkJCXJtaC5jbWRfbGVuID0gMzsKIAkJCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgJnJtaCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgQ01EX0FDQ0VTU19JT19XUklURSAiCiAJCQkJCSAgICJmb3IgUExMIHJlZ2lzdGVyIDogJXghXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCS8qIHNldCB0aGUgbmV3IGZyZXF1ZW5jeSAqLwotCXNuZF9wcmludGRkKCJjbG9jayByZWdpc3RlciA6IHNldCAleFxuIiwgdmFsKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiY2xvY2sgcmVnaXN0ZXIgOiBzZXQgJXhcbiIsIHZhbCk7CiAJZXJyID0gcGN4aHJfd3JpdGVfaW9fbnVtX3JlZ19jb250KG1nciwgUENYSFJfRlJFUV9SRUdfTUFTSywKIAkJCQkJICB2YWwsIGNoYW5nZWQpOwogCWlmIChlcnIpCkBAIC0zODAsNyArMzgwLDcgQEAKIAkJbWdyLT5jb2RlY19zcGVlZCA9IHNwZWVkOwkvKiBzYXZlIG5ldyBjb2RlYyBzcGVlZCAqLwogCX0KIAotCXNuZF9wcmludGRkKCJwY3hocl9zdWJfc2V0X2Nsb2NrIHRvICVkSHogKHJlYWxmcmVxPSVkKVxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicGN4aHJfc3ViX3NldF9jbG9jayB0byAlZEh6IChyZWFsZnJlcT0lZClcbiIsCiAJCSAgICByYXRlLCByZWFsZnJlcSk7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODAsNyArNDgwLDcgQEAKIAljYXNlIFJFR19TVEFUVVNfU1lOQ18xOTIwMDAgOglyYXRlID0gMTkyMDAwOyBicmVhazsKIAlkZWZhdWx0OiByYXRlID0gMDsKIAl9Ci0Jc25kX3ByaW50ZGQoIkV4dGVybmFsIGNsb2NrIGlzIGF0ICVkIEh6XG4iLCByYXRlKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiRXh0ZXJuYWwgY2xvY2sgaXMgYXQgJWQgSHpcbiIsIHJhdGUpOwogCSpzYW1wbGVfcmF0ZSA9IHJhdGU7CiAJcmV0dXJuIDA7CiB9CkBAIC01MzcsOCArNTM3LDggQEAKIAogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1IgcGN4aHJfc2V0X3N0cmVhbV9zdGF0ZSBlcnI9JXg7XG4iLAotCQkJICAgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiRVJST1IgcGN4aHJfc2V0X3N0cmVhbV9zdGF0ZSBlcnI9JXg7XG4iLCBlcnIpOwogCXN0cmVhbS0+c3RhdHVzID0KIAkgIHN0YXJ0ID8gUENYSFJfU1RSRUFNX1NUQVRVU19TVEFSVEVEIDogUENYSFJfU1RSRUFNX1NUQVRVU19TVE9QUEVEOwogCXJldHVybiBlcnI7CkBAIC02MjgsNyArNjI4LDggQEAKIAlybWguY21kW3JtaC5jbWRfbGVuKytdID0gKGhlYWRlciAmIDB4ZmYpIDw8IDE2OwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1IgcGN4aHJfc2V0X2Zvcm1hdCBlcnI9JXg7XG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJFUlJPUiBwY3hocl9zZXRfZm9ybWF0IGVycj0leDtcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjY1LDcgKzY2Niw3IEBACiAJcm1oLmNtZF9sZW4gPSA0OwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICJFUlJPUiBDTURfVVBEQVRFX1JfQlVGRkVSUyBlcnI9JXg7XG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC03MzUsMTEgKzczNiwxMSBAQAogCX0KIAlpZiAoY2FwdHVyZV9tYXNrID09IDAgJiYgcGxheWJhY2tfbWFzayA9PSAwKSB7CiAJCW11dGV4X3VubG9jaygmbWdyLT5zZXR1cF9tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6IG5vIHBpcGVzXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6IG5vIHBpcGVzXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNuZF9wcmludGRkKCJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6ICIKIAkJICAgICJwbGF5YmFja19tYXNrPSV4IGNhcHR1cmVfbWFzaz0leFxuIiwKIAkJICAgIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzayk7CiAKQEAgLTc0Nyw3ICs3NDgsNyBAQAogCWVyciA9IHBjeGhyX3NldF9waXBlX3N0YXRlKG1nciwgIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzaywgMCk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJm1nci0+c2V0dXBfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCiAJCQkgICAiZXJyb3Igc3RvcCBwaXBlcyAoUCV4IEMleClcbiIsCiAJCQkgICBwbGF5YmFja19tYXNrLCBjYXB0dXJlX21hc2spOwogCQlyZXR1cm47CkBAIC03OTIsNyArNzkzLDcgQEAKIAllcnIgPSBwY3hocl9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzaywgMSk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJm1nci0+c2V0dXBfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCiAJCQkgICAiZXJyb3Igc3RhcnQgcGlwZXMgKFAleCBDJXgpXG4iLAogCQkJICAgcGxheWJhY2tfbWFzaywgY2FwdHVyZV9tYXNrKTsKIAkJcmV0dXJuOwpAQCAtODI1LDcgKzgyNiw3IEBACiAKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHX1ZFUkJPU0UKIAlkb19nZXR0aW1lb2ZkYXkoJm15X3R2Mik7Ci0Jc25kX3ByaW50ZGQoIioqKlRSSUdHRVIgVEFTS0xFVCoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgIioqKlRSSUdHRVIgVEFTS0xFVCoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCiAJCSAgICAobG9uZykobXlfdHYyLnR2X3VzZWMgLSBteV90djEudHZfdXNlYyksIGVycik7CiAjZW5kaWYKIH0KQEAgLTkwMiw3ICs5MDMsNyBAQAogCX0KIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBwY3hocl9oYXJkd2FyZV90aW1lciBlcnIoJXgpXG4iLAorCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGN4aHJfaGFyZHdhcmVfdGltZXIgZXJyKCV4KVxuIiwKIAkJCSAgIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTkxNiw3ICs5MTcsOCBAQAogCXN0cnVjdCBwY3hocl9tZ3IgKm1nciA9IGNoaXAtPm1ncjsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9wcmludGRkKCJwY3hocl9wcmVwYXJlIDogcGVyaW9kX3NpemUoJWx4KSBwZXJpb2RzKCV4KSBidWZmZXJfc2l6ZSglbHgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicGN4aHJfcHJlcGFyZSA6IHBlcmlvZF9zaXplKCVseCkgcGVyaW9kcygleCkgYnVmZmVyX3NpemUoJWx4KVxuIiwKIAkJICAgIHN1YnMtPnJ1bnRpbWUtPnBlcmlvZF9zaXplLCBzdWJzLT5ydW50aW1lLT5wZXJpb2RzLAogCQkgICAgc3Vicy0+cnVudGltZS0+YnVmZmVyX3NpemUpOwogCkBAIC0xMDI1LDExICsxMDI3LDExIEBACiAJcnVudGltZS0+aHcgPSBwY3hocl9jYXBzOwogCiAJaWYoIHN1YnMtPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICkgewotCQlzbmRfcHJpbnRkZCgicGN4aHJfb3BlbiBwbGF5YmFjayBjaGlwJWQgc3VicyVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInBjeGhyX29wZW4gcGxheWJhY2sgY2hpcCVkIHN1YnMlZFxuIiwKIAkJCSAgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJc3RyZWFtID0gJmNoaXAtPnBsYXliYWNrX3N0cmVhbVtzdWJzLT5udW1iZXJdOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGRkKCJwY3hocl9vcGVuIGNhcHR1cmUgY2hpcCVkIHN1YnMlZFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJwY3hocl9vcGVuIGNhcHR1cmUgY2hpcCVkIHN1YnMlZFxuIiwKIAkJCSAgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJaWYgKG1nci0+bW9ub19jYXB0dXJlKQogCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gMTsKQEAgLTEwMzksNyArMTA0MSw3IEBACiAJfQogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBQQ1hIUl9TVFJFQU1fU1RBVFVTX0ZSRUUpewogCQkvKiBzdHJlYW1zIGluIHVzZSAqLwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9vcGVuIGNoaXAlZCBzdWJzJWQgaW4gdXNlXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInBjeGhyX29wZW4gY2hpcCVkIHN1YnMlZCBpbiB1c2VcbiIsCiAJCQkgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJbXV0ZXhfdW5sb2NrKCZtZ3ItPnNldHVwX211dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTExMDUsNyArMTEwNyw3IEBACiAKIAltdXRleF9sb2NrKCZtZ3ItPnNldHVwX211dGV4KTsKIAotCXNuZF9wcmludGRkKCJwY3hocl9jbG9zZSBjaGlwJWQgc3VicyVkXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAicGN4aHJfY2xvc2UgY2hpcCVkIHN1YnMlZFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBzdWJzLT5udW1iZXIpOwogCiAJLyogc2FtcGxlIHJhdGUgcmVsZWFzZWQgKi8KQEAgLTExNjgsNyArMTE3MCw3IEBACiAJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCAwLAogCQkJICAgICAgIGNoaXAtPm5iX3N0cmVhbXNfcGxheSwKIAkJCSAgICAgICBjaGlwLT5uYl9zdHJlYW1zX2NhcHQsICZwY20pKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBwY20gJXNcbiIsIG5hbWUpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgcGNtICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOwpAQCAtMTIxNCw3ICsxMjE2LDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjM5LDcgKzEyNDEsNiBAQAogCX0KIAogCW1nci0+Y2hpcFtpZHhdID0gY2hpcDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4OCw3ICsxNDg5LDcgQEAKIAkvKiByZXNldCBib2FyZCBpZiBzb21lIGZpcm13YXJlIHdhcyBsb2FkZWQgKi8KIAlpZihtZ3ItPmRzcF9sb2FkZWQpIHsKIAkJcGN4aHJfcmVzZXRfYm9hcmQobWdyKTsKLQkJc25kX3ByaW50ZGQoInJlc2V0IHBjeGhyICFcbiIpOworCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicmVzZXQgcGN4aHIgIVxuIik7CiAJfQogCiAJLyogcmVsZWFzZSBpcnEgICovCkBAIC0xNTM3LDggKzE1MzgsOCBAQAogCiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCQkgICAiMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKCZwY2ktPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTE1ODksNyArMTU5MCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHBjeGhyX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcGN4aHJfZnJlZShtZ3IpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE2MzgsMTAgKzE2MzksMTEgQEAKIAogCQlzbnByaW50Zih0bXBpZCwgc2l6ZW9mKHRtcGlkKSwgIiVzLSVkIiwKIAkJCSBpZFtkZXZdID8gaWRbZGV2XSA6IGNhcmRfbmFtZSwgaSk7Ci0JCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCQllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwKKwkJCQkgICAwLCAmY2FyZCk7CiAKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZCAlZFxuIiwgaSk7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZCAlZFxuIiwgaSk7CiAJCQlwY3hocl9mcmVlKG1ncik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2NvcmUuYwppbmRleCAzN2I0MzFiLi5kZjkzNzE5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9jb3JlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgInBjeGhyLmgiCkBAIC0xMzIsMTQgKzEzMywxNCBAQAogCQkqcmVhZCA9IFBDWEhSX0lOUEIobWdyLCByZWcpOwogCQlpZiAoKCpyZWFkICYgbWFzaykgPT0gYml0KSB7CiAJCQlpZiAoaSA+IDEwMCkKLQkJCQlzbmRfcHJpbnRkZCgiQVRURU5USU9OISBjaGVja19yZWcoJXgpICIKLQkJCQkJICAgICJsb29wY291bnQ9JWRcbiIsCisJCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkJIkFUVEVOVElPTiEgY2hlY2tfcmVnKCV4KSBsb29wY291bnQ9JWRcbiIsCiAJCQkJCSAgICByZWcsIGkpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSsrOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKIAkJICAgInBjeGhyX2NoZWNrX3JlZ19iaXQ6IHRpbWVvdXQsIHJlZz0leCwgbWFzaz0weCV4LCB2YWw9JXhcbiIsCiAJCSAgIHJlZywgbWFzaywgKnJlYWQpOwogCXJldHVybiAtRUlPOwpAQCAtMjE2LDcgKzIxNyw3IEBACiAJZXJyID0gcGN4aHJfY2hlY2tfcmVnX2JpdChtZ3IsIFBDWEhSX0RTUF9DVlIsICBQQ1hIUl9DVlJfSEkwOF9IQywgMCwKIAkJCQkgIFBDWEhSX1RJTUVPVVRfRFNQLCAmcmVnKTsKIAlpZiAoZXJyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjeGhyX3NlbmRfaXRfZHNwIDogVElNRU9VVCBDVlJcbiIpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAicGN4aHJfc2VuZF9pdF9kc3AgOiBUSU1FT1VUIENWUlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCWlmIChpdGRzcCAmIFBDWEhSX01BU0tfSVRfTUFOQUdFX0hGNSkgewpAQCAtMjI3LDcgKzIyOCw3IEBACiAJCQkJCSAgUENYSFJfVElNRU9VVF9EU1AsCiAJCQkJCSAgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkJICAgInBjeGhyX3NlbmRfaXRfZHNwIDogVElNRU9VVCBIRjVcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMjk0LDcgKzI5NSw3IEBACiAJICovCiAJaWYoc2Vjb25kKSB7CiAJCWlmICgoY2hpcHNjICYgUENYSFJfQ0hJUFNDX0dQSV9VU0VSSSkgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgbG9hZGluZyBmaXJzdCB4aWxpbnhcbiIpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVycm9yIGxvYWRpbmcgZmlyc3QgeGlsaW54XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qIGFjdGl2YXRlIHNlY29uZCB4aWxpbnggKi8KQEAgLTM2MCw3ICszNjEsNyBAQAogCQkJCQkgIFBDWEhSX0lTUl9ISTA4X1RSRFksCiAJCQkJCSAgUENYSFJfVElNRU9VVF9EU1AsICZkdW1teSk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkJICAgImRzcCBsb2FkaW5nIGVycm9yIGF0IHBvc2l0aW9uICVkXG4iLCBpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTM5Niw3ICszOTcsNyBAQAogCQltc2xlZXAoUENYSFJfV0FJVF9ERUZBVUxUKTsKIAkJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfSUNSLCByZWcpOwogCQltc2xlZXAoUENYSFJfV0FJVF9ERUZBVUxUKTsKLQkJc25kX3ByaW50ZGQoIm5vIG5lZWQgdG8gbG9hZCBlZXByb20gYm9vdFxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJubyBuZWVkIHRvIGxvYWQgZWVwcm9tIGJvb3RcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfSUNSLCByZWcpOwpAQCAtNTYxLDkgKzU2Miw5IEBACiAJCQkJCSAgUENYSFJfSVNSX0hJMDhfUlhERiwKIAkJCQkJICBQQ1hIUl9USU1FT1VUX0RTUCwgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSCBzdGF0OiAiCi0JCQkJICAgIklTUjpSWERGPTEgKElTUiA9ICV4OyBpPSVkIClcbiIsCi0JCQkJICAgcmVnLCBpKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJIkVSUk9SIFJNSCBzdGF0OiBJU1I6UlhERj0xIChJU1IgPSAleDsgaT0lZCApXG4iLAorCQkJCXJlZywgaSk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCS8qIHJlYWQgZGF0YSAqLwpAQCAtNTkxLDEzICs1OTIsMTMgQEAKIAkJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQlpZiAocm1oLT5jbWRfaWR4IDwgQ01EX0xBU1RfSU5ERVgpCi0JCQlzbmRfcHJpbnRkZCgiICAgIHN0YXRbJWRdPSV4XG4iLCBpLCBkYXRhKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICIgICAgc3RhdFslZF09JXhcbiIsIGksIGRhdGEpOwogI2VuZGlmCiAJCWlmIChpIDwgbWF4X3N0YXRfbGVuKQogCQkJcm1oLT5zdGF0W2ldID0gZGF0YTsKIAl9CiAJaWYgKHJtaC0+c3RhdF9sZW4gPiBtYXhfc3RhdF9sZW4pIHsKLQkJc25kX3ByaW50ZGQoIlBDWEhSIDogcm1oLT5zdGF0X2xlbj0leCB0b28gYmlnXG4iLAorCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiUENYSFIgOiBybWgtPnN0YXRfbGVuPSV4IHRvbyBiaWdcbiIsCiAJCQkgICAgcm1oLT5zdGF0X2xlbik7CiAJCXJtaC0+c3RhdF9sZW4gPSBtYXhfc3RhdF9sZW47CiAJfQpAQCAtNjE1LDcgKzYxNiw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWVyciA9IHBjeGhyX3NlbmRfaXRfZHNwKG1nciwgUENYSFJfSVRfTUVTU0FHRSwgMSk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9zZW5kX21lc3NhZ2UgOiBFRF9EU1BfQ1JBU0hFRFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkicGN4aHJfc2VuZF9tZXNzYWdlIDogRURfRFNQX0NSQVNIRURcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkvKiB3YWl0IGZvciBjaGsgYml0ICovCkBAIC02NDEsNyArNjQzLDcgQEAKIAkJZGF0YSAmPSAweGZmN2ZmZjsJLyogTUFTS18xX1dPUkRfQ09NTUFORCAqLwogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWlmIChybWgtPmNtZF9pZHggPCBDTURfTEFTVF9JTkRFWCkKLQkJc25kX3ByaW50ZGQoIk1TRyBjbWRbMF09JXggKCVzKVxuIiwKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgIk1TRyBjbWRbMF09JXggKCVzKVxuIiwKIAkJCSAgICBkYXRhLCBjbWRfbmFtZXNbcm1oLT5jbWRfaWR4XSk7CiAjZW5kaWYKIApAQCAtNjcxLDcgKzY3Myw4IEBACiAJCQlkYXRhID0gcm1oLT5jbWRbaV07CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCQlpZiAocm1oLT5jbWRfaWR4IDwgQ01EX0xBU1RfSU5ERVgpCi0JCQkJc25kX3ByaW50ZGQoIiAgICBjbWRbJWRdPSV4XG4iLCBpLCBkYXRhKTsKKwkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkiICAgIGNtZFslZF09JXhcbiIsIGksIGRhdGEpOwogI2VuZGlmCiAJCQllcnIgPSBwY3hocl9jaGVja19yZWdfYml0KG1nciwgUENYSFJfRFNQX0lTUiwKIAkJCQkJCSAgUENYSFJfSVNSX0hJMDhfVFJEWSwKQEAgLTY5NywxNCArNzAwLDE1IEBACiAJCQkJCSAgUENYSFJfSVNSX0hJMDhfUlhERiwKIAkJCQkJICBQQ1hIUl9USU1FT1VUX0RTUCwgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSDogSVNSOlJYREY9MSAoSVNSID0gJXgpXG4iLCByZWcpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkiRVJST1IgUk1IOiBJU1I6UlhERj0xIChJU1IgPSAleClcbiIsIHJlZyk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCS8qIHJlYWQgZXJyb3IgY29kZSAqLwogCQlkYXRhICA9IFBDWEhSX0lOUEIobWdyLCBQQ1hIUl9EU1BfVFhIKSA8PCAxNjsKIAkJZGF0YSB8PSBQQ1hIUl9JTlBCKG1nciwgUENYSFJfRFNQX1RYTSkgPDwgODsKIAkJZGF0YSB8PSBQQ1hIUl9JTlBCKG1nciwgUENYSFJfRFNQX1RYTCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSCglZCk6IDB4JXhcbiIsCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJFUlJPUiBSTUgoJWQpOiAweCV4XG4iLAogCQkJICAgcm1oLT5jbWRfaWR4LCBkYXRhKTsKIAkJZXJyID0gLUVJTlZBTDsKIAl9IGVsc2UgewpAQCAtNzgwLDcgKzc4NCw3IEBACiAJICogKFBDWEhSX1BJUEVfU1RBVEVfQ0FQVFVSRV9PRkZTRVQpCiAJICovCiAJc3RhcnRfbWFzayAmPSAweGZmZmZmZjsKLQlzbmRfcHJpbnRkZCgiQ01EX1BJUEVfU1RBVEUgTUJPWDI9MHglMDZ4XG4iLCBzdGFydF9tYXNrKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiQ01EX1BJUEVfU1RBVEUgTUJPWDI9MHglMDZ4XG4iLCBzdGFydF9tYXNrKTsKIAlyZXR1cm4gc3RhcnRfbWFzazsKIH0KIApAQCAtODA5LDcgKzgxMyw3IEBACiAJCQl9CiAJCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCQkJaWYgKGVycikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgcGlwZSBzdGFydCAiCiAJCQkJCSAgICIoQ01EX0NBTl9TVEFSVF9QSVBFKSBlcnI9JXghXG4iLAogCQkJCQkgICBlcnIpOwpAQCAtODQ3LDcgKzg1MSw3IEBACiAJCQl9CiAJCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCQkJaWYgKGVycikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgcGlwZSBzdG9wICIKIAkJCQkJICAgIihDTURfU1RPUF9QSVBFKSBlcnI9JXghXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CkBAIC04NzYsNyArODgwLDcgQEAKIAkJCQkJCQkgIDEgPDwgKGF1ZGlvIC0gUENYSFJfUElQRV9TVEFURV9DQVBUVVJFX09GRlNFVCkpOwogCQkJZXJyID0gcGN4aHJfc2VuZF9tc2cobWdyLCAmcm1oKTsKIAkJCWlmIChlcnIpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKIAkJCQkJICAgImVycm9yIHBpcGUgc3RhcnQgIgogCQkJCQkgICAiKENNRF9DT05GX1BJUEUpIGVycj0leCFcbiIsIGVycik7CiAJCQkJcmV0dXJuIGVycjsKQEAgLTg4OSw3ICs4OTMsNyBAQAogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9TRU5EX0lSUUEpOwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgJnJtaCk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkgICAiZXJyb3IgcGlwZSBzdGFydCAoQ01EX1NFTkRfSVJRQSkgZXJyPSV4IVxuIiwKIAkJCSAgIGVycik7CiAJCXJldHVybiBlcnI7CkBAIC05MTMsNyArOTE3LDggQEAKIAkJICAgICAgKGNhcHR1cmVfbWFzayA8PCBQQ1hIUl9QSVBFX1NUQVRFX0NBUFRVUkVfT0ZGU0VUKSk7CiAJLyogY3VycmVudCBwaXBlIHN0YXRlIChwbGF5YmFjayArIHJlY29yZCkgKi8KIAlzdGF0ZSA9IHBjeGhyX3BpcGVzX3J1bm5pbmcobWdyKTsKLQlzbmRfcHJpbnRkZCgicGN4aHJfc2V0X3BpcGVfc3RhdGUgJXMgKG1hc2sgJXggY3VycmVudCAleClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJInBjeGhyX3NldF9waXBlX3N0YXRlICVzIChtYXNrICV4IGN1cnJlbnQgJXgpXG4iLAogCQkgICAgc3RhcnQgPyAiU1RBUlQiIDogIlNUT1AiLCBhdWRpb19tYXNrLCBzdGF0ZSk7CiAJaWYgKHN0YXJ0KSB7CiAJCS8qIHN0YXJ0IG9ubHkgcGlwZXMgdGhhdCBhcmUgbm90IHlldCBzdGFydGVkICovCkBAIC05NDQsNyArOTQ5LDcgQEAKIAkJaWYgKChzdGF0ZSAmIGF1ZGlvX21hc2spID09IChzdGFydCA/IGF1ZGlvX21hc2sgOiAwKSkKIAkJCWJyZWFrOwogCQlpZiAoKytpID49IE1BWF9XQUlUX0ZPUl9EU1AgKiAxMDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHBpcGUgc3RhcnQvc3RvcFxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGlwZSBzdGFydC9zdG9wXG4iKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJdWRlbGF5KDEwKTsJCQkvKiB3YWl0IDEwIG1pY3Jvc2Vjb25kcyAqLwpAQCAtOTU2LDcgKzk2MSw3IEBACiAJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWRvX2dldHRpbWVvZmRheSgmbXlfdHYyKTsKLQlzbmRfcHJpbnRkZCgiKioqU0VUIFBJUEUgU1RBVEUqKiogVElNRSA9ICVsZCAoZXJyID0gJXgpXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICIqKipTRVQgUElQRSBTVEFURSoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCiAJCSAgICAobG9uZykobXlfdHYyLnR2X3VzZWMgLSBteV90djEudHZfdXNlYyksIGVycik7CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTk3MSw3ICs5NzYsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1nci0+bXNnX2xvY2ssIGZsYWdzKTsKIAlpZiAoKG1nci0+aW9fbnVtX3JlZ19jb250ICYgbWFzaykgPT0gdmFsdWUpIHsKLQkJc25kX3ByaW50ZGQoIklPX05VTV9SRUdfQ09OVCBtYXNrICV4IGFscmVhZHkgaXMgc2V0IHRvICV4XG4iLAorCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJIklPX05VTV9SRUdfQ09OVCBtYXNrICV4IGFscmVhZHkgaXMgc2V0IHRvICV4XG4iLAogCQkJICAgIG1hc2ssIHZhbHVlKTsKIAkJaWYgKGNoYW5nZWQpCiAJCQkqY2hhbmdlZCA9IDA7CkBAIC0xMDI0LDcgKzEwMzAsNyBAQAogCQllcnIgPSAoKGVyciA+PiAxMikgJiAweGZmZik7CiAJaWYgKCFlcnIpCiAJCXJldHVybiAwOwotCXNuZF9wcmludGRkKCJDTURfQVNZTkMgOiBFcnJvciAlcyAlcyBQaXBlICVkIGVycj0leFxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiQ01EX0FTWU5DIDogRXJyb3IgJXMgJXMgUGlwZSAlZCBlcnI9JXhcbiIsCiAJCSAgICBlcnJfc3JjX25hbWVbZXJyX3NyY10sCiAJCSAgICBpc19jYXB0dXJlID8gIlJlY29yZCIgOiAiUGxheSIsIHBpcGUsIGVycik7CiAJaWYgKGVyciA9PSAweGUwMSkKQEAgLTEwNDUsMjAgKzEwNTEsMjQgQEAKIAlpbnQgaSwgajsKIAogCWlmIChtZ3ItPnNyY19pdF9kc3AgJiBQQ1hIUl9JUlFfRlJFUV9DSEFOR0UpCi0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIGV2ZW50IG9jY3VycmVkXG4iKTsKIAlpZiAobWdyLT5zcmNfaXRfZHNwICYgUENYSFJfSVJRX1RJTUVfQ09ERSkKLQkJc25kX3ByaW50ZGQoIlRBU0tMRVQgOiBQQ1hIUl9JUlFfVElNRV9DT0RFIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX1RJTUVfQ09ERSBldmVudCBvY2N1cnJlZFxuIik7CiAJaWYgKG1nci0+c3JjX2l0X2RzcCAmIFBDWEhSX0lSUV9OT1RJRlkpCi0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX05PVElGWSBldmVudCBvY2N1cnJlZFxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkiVEFTS0xFVCA6IFBDWEhSX0lSUV9OT1RJRlkgZXZlbnQgb2NjdXJyZWRcbiIpOwogCWlmIChtZ3ItPnNyY19pdF9kc3AgJiAoUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIHwgUENYSFJfSVJRX1RJTUVfQ09ERSkpIHsKIAkJLyogY2xlYXIgZXZlbnRzIEZSRVFfQ0hBTkdFIGFuZCBUSU1FX0NPREUgKi8KIAkJcGN4aHJfaW5pdF9ybWgocHJtaCwgQ01EX1RFU1RfSVQpOwogCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsIHBybWgpOwotCQlzbmRfcHJpbnRkZCgiQ01EX1RFU1RfSVQgOiBlcnI9JXgsIHN0YXQ9JXhcbiIsCisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJDTURfVEVTVF9JVCA6IGVycj0leCwgc3RhdD0leFxuIiwKIAkJCSAgICBlcnIsIHBybWgtPnN0YXRbMF0pOwogCX0KIAlpZiAobWdyLT5zcmNfaXRfZHNwICYgUENYSFJfSVJRX0FTWU5DKSB7Ci0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX0FTWU5DIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX0FTWU5DIGV2ZW50IG9jY3VycmVkXG4iKTsKIAogCQlwY3hocl9pbml0X3JtaChwcm1oLCBDTURfQVNZTkMpOwogCQlwcm1oLT5jbWRbMF0gfD0gMTsJLyogYWRkIFNFTF9BU1lOQ19FVkVOVFMgKi8KQEAgLTEwNjYsNyArMTA3Niw3IEBACiAJCXBybWgtPnN0YXRfbGVuID0gUENYSFJfU0laRV9NQVhfTE9OR19TVEFUVVM7CiAJCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgcHJtaCk7CiAJCWlmIChlcnIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBwY3hocl9tc2dfdGFza2xldD0leDtcbiIsCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiRVJST1IgcGN4aHJfbXNnX3Rhc2tsZXQ9JXg7XG4iLAogCQkJCSAgIGVycik7CiAJCWkgPSAxOwogCQl3aGlsZSAoaSA8IHBybWgtPnN0YXRfbGVuKSB7CkBAIC0xMDc5LDcgKzEwODksOCBAQAogCQkJdTMyIGVycjI7CiAKIAkJCWlmIChwcm1oLT5zdGF0W2ldICYgMHg4MDAwMDApIHsJLyogaWYgQklUX0VORCAqLwotCQkJCXNuZF9wcmludGRkKCJUQVNLTEVUIDogRW5kJXNQaXBlICVkXG4iLAorCQkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJUQVNLTEVUIDogRW5kJXNQaXBlICVkXG4iLAogCQkJCQkgICAgaXNfY2FwdHVyZSA/ICJSZWNvcmQiIDogIlBsYXkiLAogCQkJCQkgICAgcGlwZSk7CiAJCQl9CkBAIC0xMTM2LDcgKzExNDcsOCBAQAogCWh3X3NhbXBsZV9jb3VudCA9ICgodV9pbnQ2NF90KXJtaC5zdGF0WzBdKSA8PCAyNDsKIAlod19zYW1wbGVfY291bnQgKz0gKHVfaW50NjRfdClybWguc3RhdFsxXTsKIAotCXNuZF9wcmludGRkKCJzdHJlYW0gJWMlZCA6IGFicyBzYW1wbGVzIHJlYWwoJWxsdSkgdGltZXIoJWxsdSlcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJInN0cmVhbSAlYyVkIDogYWJzIHNhbXBsZXMgcmVhbCglbGx1KSB0aW1lciglbGx1KVxuIiwKIAkJICAgIHN0cmVhbS0+cGlwZS0+aXNfY2FwdHVyZSA/ICdDJyA6ICdQJywKIAkJICAgIHN0cmVhbS0+c3Vic3RyZWFtLT5udW1iZXIsCiAJCSAgICBod19zYW1wbGVfY291bnQsCkBAIC0xMjAyLDcgKzEyMTQsNyBAQAogCQkJCSh1X2ludDMyX3QpKG5ld19zYW1wbGVfY291bnQgLQogCQkJCQkgICAgc3RyZWFtLT50aW1lcl9hYnNfcGVyaW9kcyk7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCSAgICJFUlJPUiBuZXdfc2FtcGxlX2NvdW50IHRvbyBzbWFsbCA/Pz8gJWxkXG4iLAogCQkJCSAgIChsb25nIHVuc2lnbmVkIGludCluZXdfc2FtcGxlX2NvdW50KTsKIAkJfQpAQCAtMTI0NywzMyArMTI1OSwzOSBAQAogCQkgICAgKG1nci0+ZHNwX3RpbWVfbGFzdCAhPSBQQ1hIUl9EU1BfVElNRV9JTlZBTElEKSkgewogCQkJLyogaGFuZGxlIGRzcCBjb3VudGVyIHdyYXBhcm91bmQgd2l0aG91dCByZXN5bmMgKi8KIAkJCWludCB0bXBfZGlmZiA9IGRzcF90aW1lX2RpZmYgKyBQQ1hIUl9EU1BfVElNRV9NQVNLICsgMTsKLQkJCXNuZF9wcmludGRkKCJXQVJOSU5HIERTUCB0aW1lc3RhbXAgb2xkKCVkKSBuZXcoJWQpIiwKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJIldBUk5JTkcgRFNQIHRpbWVzdGFtcCBvbGQoJWQpIG5ldyglZCkiLAogCQkJCSAgICBtZ3ItPmRzcF90aW1lX2xhc3QsIGRzcF90aW1lX25ldyk7CiAJCQlpZiAodG1wX2RpZmYgPiAwICYmIHRtcF9kaWZmIDw9ICgyKm1nci0+Z3JhbnVsYXJpdHkpKSB7Ci0JCQkJc25kX3ByaW50ZGQoIi0+IHRpbWVzdGFtcCB3cmFwYXJvdW5kIE9LOiAiCisJCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkJIi0+IHRpbWVzdGFtcCB3cmFwYXJvdW5kIE9LOiAiCiAJCQkJCSAgICAiZGlmZj0lZFxuIiwgdG1wX2RpZmYpOwogCQkJCWRzcF90aW1lX2RpZmYgPSB0bXBfZGlmZjsKIAkJCX0gZWxzZSB7Ci0JCQkJc25kX3ByaW50ZGQoIi0+IHJlc3luY2hyb25pemUgYWxsIHN0cmVhbXNcbiIpOworCQkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJCSItPiByZXN5bmNocm9uaXplIGFsbCBzdHJlYW1zXG4iKTsKIAkJCQltZ3ItPmRzcF90aW1lX2VycisrOwogCQkJfQogCQl9CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCWlmIChkc3BfdGltZV9kaWZmID09IDApCi0JCQlzbmRfcHJpbnRkZCgiRVJST1IgRFNQIFRJTUUgTk8gRElGRiB0aW1lKCVkKVxuIiwKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJIkVSUk9SIERTUCBUSU1FIE5PIERJRkYgdGltZSglZClcbiIsCiAJCQkJICAgIGRzcF90aW1lX25ldyk7CiAJCWVsc2UgaWYgKGRzcF90aW1lX2RpZmYgPj0gKDIqbWdyLT5ncmFudWxhcml0eSkpCi0JCQlzbmRfcHJpbnRkZCgiRVJST1IgRFNQIFRJTUUgVE9PIEJJRyBvbGQoJWQpIGFkZCglZClcbiIsCisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJFUlJPUiBEU1AgVElNRSBUT08gQklHIG9sZCglZCkgYWRkKCVkKVxuIiwKIAkJCQkgICAgbWdyLT5kc3BfdGltZV9sYXN0LAogCQkJCSAgICBkc3BfdGltZV9uZXcgLSBtZ3ItPmRzcF90aW1lX2xhc3QpOwogCQllbHNlIGlmIChkc3BfdGltZV9kaWZmICUgbWdyLT5ncmFudWxhcml0eSkKLQkJCXNuZF9wcmludGRkKCJFUlJPUiBEU1AgVElNRSBpbmNyZWFzZWQgYnkgJWRcbiIsCisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJFUlJPUiBEU1AgVElNRSBpbmNyZWFzZWQgYnkgJWRcbiIsCiAJCQkJICAgIGRzcF90aW1lX2RpZmYpOwogI2VuZGlmCiAJCW1nci0+ZHNwX3RpbWVfbGFzdCA9IGRzcF90aW1lX25ldzsKIAogCQlpZiAodGltZXJfdG9nZ2xlID09IG1nci0+dGltZXJfdG9nZ2xlKSB7Ci0JCQlzbmRfcHJpbnRkZCgiRVJST1IgVElNRVIgVE9HR0xFXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJFUlJPUiBUSU1FUiBUT0dHTEVcbiIpOwogCQkJbWdyLT5kc3BfdGltZV9lcnIrKzsKIAkJfQogCQltZ3ItPnRpbWVyX3RvZ2dsZSA9IHRpbWVyX3RvZ2dsZTsKQEAgLTEzMDgsNyArMTMyNiw3IEBACiAJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWlmIChyZWcgJiBQQ1hIUl9GQVRBTF9EU1BfRVJSKQotCQlzbmRfcHJpbnRkZCgiRkFUQUwgRFNQIEVSUk9SIDogJXhcbiIsIHJlZyk7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJGQVRBTCBEU1AgRVJST1IgOiAleFxuIiwgcmVnKTsKICNlbmRpZgogCXNwaW5fdW5sb2NrKCZtZ3ItPmxvY2spOwogCXJldHVybiBJUlFfSEFORExFRDsJLyogdGhpcyBkZXZpY2UgY2F1c2VkIHRoZSBpbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggZDk5NTE3NS4uMTVhOGNlNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTcyLDcgKzcyLDggQEAKIAkvKiB0ZXN0IG1heCBuYiBzdWJzdHJlYW0gcGVyIHBpcGUgKi8KIAlpZiAoKChybWguc3RhdFsxXSA+PiA3KSAmIDB4NUYpIDwgUENYSFJfUExBWUJBQ0tfU1RSRUFNUykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jc25kX3ByaW50ZGQoInN1cHBvcnRlZCBmb3JtYXRzIDogcGxheWJhY2s9JXggY2FwdHVyZT0leFxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkic3VwcG9ydGVkIGZvcm1hdHMgOiBwbGF5YmFjaz0leCBjYXB0dXJlPSV4XG4iLAogCQkgICAgcm1oLnN0YXRbMl0sIHJtaC5zdGF0WzNdKTsKIAogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9WRVJTSU9OKTsKQEAgLTg0LDcgKzg1LDggQEAKIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0Jc25kX3ByaW50ZGQoIlBDWEhSIERTUCB2ZXJzaW9uIGlzICVkLiVkLiVkXG4iLCAocm1oLnN0YXRbMF0+PjE2KSYweGZmLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCSJQQ1hIUiBEU1AgdmVyc2lvbiBpcyAlZC4lZC4lZFxuIiwgKHJtaC5zdGF0WzBdPj4xNikmMHhmZiwKIAkJICAgIChybWguc3RhdFswXT4+OCkmMHhmZiwgcm1oLnN0YXRbMF0mMHhmZik7CiAJbWdyLT5kc3BfdmVyc2lvbiA9IHJtaC5zdGF0WzBdOwogCkBAIC0xNzksNyArMTgxLDcgQEAKIAkJc3RyZWFtX2NvdW50ID0gUENYSFJfUExBWUJBQ0tfU1RSRUFNUzsKIAkJYXVkaW9fY291bnQgPSAyOwkvKiBhbHdheXMgc3RlcmVvICovCiAJfQotCXNuZF9wcmludGRkKCJzbmRfYWRkX3JlZl9waXBlIHBpbiglZCkgcGNtJWMwXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJzbmRfYWRkX3JlZl9waXBlIHBpbiglZCkgcGNtJWMwXG4iLAogCQkgICAgcGluLCBpc19jYXB0dXJlID8gJ2MnIDogJ3AnKTsKIAlwaXBlLT5pc19jYXB0dXJlID0gaXNfY2FwdHVyZTsKIAlwaXBlLT5maXJzdF9hdWRpbyA9IHBpbjsKQEAgLTE5NCw3ICsxOTYsNyBAQAogCX0KIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHBpcGUgYWxsb2NhdGlvbiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBwaXBlIGFsbG9jYXRpb24gIgogCQkJICAgIihDTURfUkVTX1BJUEUpIGVycj0leCFcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjIyLDE0ICsyMjQsMTQgQEAKIAkvKiBzdG9wIG9uZSBwaXBlICovCiAJZXJyID0gcGN4aHJfc2V0X3BpcGVfc3RhdGUobWdyLCBwbGF5YmFja19tYXNrLCBjYXB0dXJlX21hc2ssIDApOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CiAJLyogcmVsZWFzZSB0aGUgcGlwZSAqLwogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9GUkVFX1BJUEUpOwogCXBjeGhyX3NldF9waXBlX2NtZF9wYXJhbXMoJnJtaCwgcGlwZS0+aXNfY2FwdHVyZSwgcGlwZS0+Zmlyc3RfYXVkaW8sCiAJCQkJICAwLCAwKTsKIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBwaXBlIHJlbGVhc2UgIgorCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGlwZSByZWxlYXNlICIKIAkJCSAgICIoQ01EX0ZSRUVfUElQRSkgZXJyKCV4KVxuIiwgZXJyKTsKIAlwaXBlLT5zdGF0dXMgPSBQQ1hIUl9QSVBFX1VOREVGSU5FRDsKIAlyZXR1cm4gZXJyOwpAQCAtMjg5LDcgKzI5MSw4IEBACiB7CiAJaW50IGVyciwgY2FyZF9pbmRleDsKIAotCXNuZF9wcmludGRkKCJsb2FkaW5nIGRzcCBbJWRdIHNpemUgPSAlWmRcbiIsIGluZGV4LCBkc3AtPnNpemUpOworCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCSJsb2FkaW5nIGRzcCBbJWRdIHNpemUgPSAlWmRcbiIsIGluZGV4LCBkc3AtPnNpemUpOwogCiAJc3dpdGNoIChpbmRleCkgewogCWNhc2UgUENYSFJfRklSTVdBUkVfWExYX0lOVF9JTkRFWDoKQEAgLTMxMywxOSArMzE2LDE5IEBACiAJCQlyZXR1cm4gZXJyOwogCQlicmVhazsJLyogY29udGludWUgd2l0aCBmaXJzdCBpbml0ICovCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAid3JvbmcgZmlsZSBpbmRleFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJ3cm9uZyBmaWxlIGluZGV4XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfSAvKiBlbmQgb2Ygc3dpdGNoIGZpbGUgaW5kZXgqLwogCiAJLyogZmlyc3QgY29tbXVuaWNhdGlvbiB3aXRoIGVtYmVkZGVkICovCiAJZXJyID0gcGN4aHJfaW5pdF9ib2FyZChtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hociBjb3VsZCBub3QgYmUgc2V0IHVwXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInBjeGhyIGNvdWxkIG5vdCBiZSBzZXQgdXBcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAllcnIgPSBwY3hocl9jb25maWdfcGlwZXMobWdyKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGN4aHIgcGlwZXMgY291bGQgbm90IGJlIHNldCB1cFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc2V0IHVwXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAgICAgICAgCS8qIGNyZWF0ZSBkZXZpY2VzIGFuZCBtaXhlciBpbiBhY2NvcmRhbmNlIHdpdGggSFcgb3B0aW9ucyovCkBAIC0zNDQsMTAgKzM0NywxMSBAQAogCX0KIAllcnIgPSBwY3hocl9zdGFydF9waXBlcyhtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9wcmludGRkKCJwY3hociBmaXJtd2FyZSBkb3dubG9hZGVkIGFuZCBzdWNjZXNzZnVsbHkgc2V0IHVwXG4iKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkicGN4aHIgZmlybXdhcmUgZG93bmxvYWRlZCBhbmQgc3VjY2Vzc2Z1bGx5IHNldCB1cFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4Miw3ICszODYsOCBAQAogCQkJY29udGludWU7CiAJCXNwcmludGYocGF0aCwgInBjeGhyLyVzIiwgZndfZmlsZXNbZndfc2V0XVtpXSk7CiAJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcGF0aCwgJm1nci0+cGNpLT5kZXYpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocjogY2FuJ3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJInBjeGhyOiBjYW4ndCBsb2FkIGZpcm13YXJlICVzXG4iLAogCQkJCSAgIHBhdGgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXgyMi5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKaW5kZXggODRmZTU3Ni4uNmE1NmU1MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgpAQCAtMjkwLDcgKzI5MSw4IEBACiAJcmVnID0gUENYSFJfSU5QQihtZ3IsIFBDWEhSX1hMWF9TVEFUVVMpOwogCWlmIChyZWcgJiBQQ1hIUl9TVEFUX01JQ19DQVBTKQogCQltZ3ItPmJvYXJkX2hhc19taWMgPSAxOwkvKiBtaWNyb3Bob25lIGF2YWlsYWJsZSAqLwotCXNuZF9wcmludGRkKCJNSUMgaW5wdXQgYXZhaWxhYmxlID0gJWRcbiIsIG1nci0+Ym9hcmRfaGFzX21pYyk7CisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJIk1JQyBpbnB1dCBhdmFpbGFibGUgPSAlZFxuIiwgbWdyLT5ib2FyZF9oYXNfbWljKTsKIAogCS8qIHJlc2V0IGNvZGVjICovCiAJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfUkVTRVQsCkBAIC00MDUsNyArNDA3LDcgQEAKIAogCWhyMjIyX2NvbmZpZ19ha20obWdyLCBBS01fVU5NVVRFX0NNRCk7CiAKLQlzbmRfcHJpbnRkZCgic2V0X2Nsb2NrIHRvICVkSHogKHJlYWxmcmVxPSVkIHBsbHJlZz0leClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInNldF9jbG9jayB0byAlZEh6IChyZWFsZnJlcT0lZCBwbGxyZWc9JXgpXG4iLAogCQkgICAgcmF0ZSwgcmVhbGZyZXEsIHBsbHJlZyk7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzEsMTMgKzQzMywxNSBAQAogCQlyZWcgPSBQQ1hIUl9TVEFUX0ZSRVFfVUVSMV9NQVNLOwogCiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoImdldF9leHRlcm5hbF9jbG9jayA6IHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJnZXRfZXh0ZXJuYWxfY2xvY2sgOiB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQkgICAgY2xvY2tfdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOyAvKiBvdGhlciBjbG9ja3Mgbm90IHN1cHBvcnRlZCAqLwogCX0KIAogCWlmICgoUENYSFJfSU5QQihtZ3IsIFBDWEhSX1hMWF9DU1VFUikgJiBtYXNrKSAhPSBtYXNrKSB7Ci0JCXNuZF9wcmludGRkKCJnZXRfZXh0ZXJuYWxfY2xvY2soJWQpID0gMCBIelxuIiwgY2xvY2tfdHlwZSk7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkiZ2V0X2V4dGVybmFsX2Nsb2NrKCVkKSA9IDAgSHpcbiIsIGNsb2NrX3R5cGUpOwogCQkqc2FtcGxlX3JhdGUgPSAwOwogCQlyZXR1cm4gMDsgLyogbm8gZXh0ZXJuYWwgY2xvY2sgbG9ja2VkICovCiAJfQpAQCAtNDk1LDcgKzQ5OSw3IEBACiAJZWxzZQogCQlyYXRlID0gMDsKIAotCXNuZF9wcmludGRkKCJFeHRlcm5hbCBjbG9jayBpcyBhdCAlZCBIeiAobWVhc3VyZWQgJWQgSHopXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJFeHRlcm5hbCBjbG9jayBpcyBhdCAlZCBIeiAobWVhc3VyZWQgJWQgSHopXG4iLAogCQkgICAgcmF0ZSwgY2FsY19yYXRlKTsKIAkqc2FtcGxlX3JhdGUgPSByYXRlOwogCXJldHVybiAwOwpAQCAtNTQyLDcgKzU0Niw4IEBACiBpbnQgaHIyMjJfdXBkYXRlX2FuYWxvZ19hdWRpb19sZXZlbChzdHJ1Y3Qgc25kX3BjeGhyICpjaGlwLAogCQkJCSAgICBpbnQgaXNfY2FwdHVyZSwgaW50IGNoYW5uZWwpCiB7Ci0Jc25kX3ByaW50ZGQoImhyMjIyX3VwZGF0ZV9hbmFsb2dfYXVkaW9fbGV2ZWwoJXMgY2hhbj0lZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJocjIyMl91cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsKCVzIGNoYW49JWQpXG4iLAogCQkgICAgaXNfY2FwdHVyZSA/ICJjYXB0dXJlIiA6ICJwbGF5YmFjayIsIGNoYW5uZWwpOwogCWlmIChpc19jYXB0dXJlKSB7CiAJCWludCBsZXZlbF9sLCBsZXZlbF9yLCBsZXZlbF9taWM7CkBAIC02NDIsNyArNjQ3LDcgQEAKIAkJaWYgKFBDWEhSX0lOUEIoY2hpcC0+bWdyLCBQQ1hIUl9YTFhfQ1NVRVIpICYgbWFzaykKIAkJCXRlbXAgfD0gMTsKIAl9Ci0Jc25kX3ByaW50ZGQoInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBhZXNfaWR4LCB0ZW1wKTsKIAkqYWVzX2JpdHMgPSB0ZW1wOwogCXJldHVybiAwOwpAQCAtNjg0LDcgKzY4OSw3IEBACiAKIAlQQ1hIUl9PVVRQQihtZ3IsIFBDWEhSX1hMWF9TRUxNSUMsIG1nci0+eGx4X3NlbG1pYyk7CiAKLQlzbmRfcHJpbnRkZCgiaHIyMjJfbWljcm9fYm9vc3QgOiBzZXQgJXhcbiIsIGJvb3N0X21hc2spOworCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJocjIyMl9taWNyb19ib29zdCA6IHNldCAleFxuIiwgYm9vc3RfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGhyMjIyX3BoYW50b21fcG93ZXIoc3RydWN0IHBjeGhyX21nciAqbWdyLCBpbnQgcG93ZXIpCkBAIC02OTYsNyArNzAxLDcgQEAKIAogCVBDWEhSX09VVFBCKG1nciwgUENYSFJfWExYX1NFTE1JQywgbWdyLT54bHhfc2VsbWljKTsKIAotCXNuZF9wcmludGRkKCJocjIyMl9waGFudG9tX3Bvd2VyIDogc2V0ICVkXG4iLCBwb3dlcik7CisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgImhyMjIyX3BoYW50b21fcG93ZXIgOiBzZXQgJWRcbiIsIHBvd2VyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCmluZGV4IGZlYzA0OTMuLjk1Yzk1NzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCkBAIC03Miw3ICs3Miw4IEBACiAJcm1oLmNtZF9sZW4gPSAzOwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciB1cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsIGNhcmQoJWQpIgorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciB1cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsIGNhcmQoJWQpIgogCQkJICAgIiBpc19jYXB0dXJlKCVkKSBlcnIoJXgpXG4iLAogCQkJICAgY2hpcC0+Y2hpcF9pZHgsIGlzX2NhcHR1cmUsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjg0LDcgKzI4NSw3IEBACiAKIAllcnIgPSBwY3hocl9zZW5kX21zZyhjaGlwLT5tZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbCAiCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZXJyb3IgdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbCAiCiAJCQkgICAiY2FyZCglZCkgZXJyKCV4KVxuIiwgY2hpcC0+Y2hpcF9pZHgsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMzNSw3ICszMzYsOCBAQAogCiAJZXJyID0gcGN4aHJfc2VuZF9tc2coY2hpcC0+bWdyLCAmcm1oKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIHVwZGF0ZV9hdWRpb19sZXZlbCglZCkgZXJyPSV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciB1cGRhdGVfYXVkaW9fbGV2ZWwoJWQpIGVycj0leFxuIiwKIAkJCSAgIGNoaXAtPmNoaXBfaWR4LCBlcnIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05MzAsNyArOTMyLDcgQEAKIAkJCQl0ZW1wIHw9IDE7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBhZXNfaWR4LCB0ZW1wKTsKIAkqYWVzX2JpdHMgPSB0ZW1wOwogCXJldHVybiAwOwpAQCAtOTkyLDcgKzk5NCw4IEBACiAJCQlybWguY21kWzBdIHw9IElPX05VTV9SRUdfQ1VFUjsKIAkJCXJtaC5jbWRbMV0gPSBjbWQ7CiAJCQlybWguY21kX2xlbiA9IDI7Ci0JCQlzbmRfcHJpbnRkZCgid3JpdGUgaWVjOTU4IEFFUyAlZCBieXRlICVkIGJpdCAlZCAoY21kICV4KVxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJ3cml0ZSBpZWM5NTggQUVTICVkIGJ5dGUgJWQgYml0ICVkIChjbWQgJXgpXG4iLAogCQkJCSAgICBjaGlwLT5jaGlwX2lkeCwgYWVzX2lkeCwgaSwgY21kKTsKIAkJCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJCQlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCmluZGV4IDU2Y2M4OTEuLmI0YTgyNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYworKysgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKQEAgLTE5MTYsOCArMTkxNiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwODYsNyArMjA4NCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHNuZF9yaXB0aWRlX2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWUzMi5jIGIvc291bmQvcGNpL3JtZTMyLmMKaW5kZXggY2MyNjM0Ni4uY2MyZjBjMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTMyLmMKKysrIGIvc291bmQvcGNpL3JtZTMyLmMKQEAgLTEzNDksMTQgKzEzNDksMTUgQEAKIAogCXJtZTMyLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocm1lMzItPnBvcnQsIFJNRTMyX0lPX1NJWkUpOwogCWlmICghcm1lMzItPmlvYmFzZSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJZGV2X2VycihybWUzMi0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAogCQkJICAgcm1lMzItPnBvcnQsIHJtZTMyLT5wb3J0ICsgUk1FMzJfSU9fU0laRSAtIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWUzMl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHJtZTMyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihybWUzMi0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTMyLT5pcnEgPSBwY2ktPmlycTsKQEAgLTE5MzgsMTUgKzE5MzksMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybWUzMiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgcm1lMzIpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTMyX2NhcmRfZnJlZTsKIAlybWUzMiA9IChzdHJ1Y3Qgcm1lMzIgKikgY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXJtZTMyLT5jYXJkID0gY2FyZDsKIAlybWUzMi0+cGNpID0gcGNpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKICAgICAgICAgaWYgKGZ1bGxkdXBsZXhbZGV2XSkKIAkJcm1lMzItPmZ1bGxkdXBsZXhfbW9kZSA9IDE7CiAJaWYgKChlcnIgPSBzbmRfcm1lMzJfY3JlYXRlKHJtZTMyKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTYuYyBiL3NvdW5kL3BjaS9ybWU5Ni5jCmluZGV4IDAyMzYzNjMuLjc2MTY5OTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5Ni5jCisrKyBiL3NvdW5kL3BjaS9ybWU5Ni5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAogCXU4IHJldjsgLyogY2FyZCByZXZpc2lvbiBudW1iZXIgKi8KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXUzMiBwbGF5YmFja19wb2ludGVyOwogCXUzMiBjYXB0dXJlX3BvaW50ZXI7CiAJdm9pZCAqcGxheWJhY2tfc3VzcGVuZF9idWZmZXI7CkBAIC0xNTcwLDcgKzE1NzAsNyBAQAogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHJtZTk2LT5wY2kpOwogCQlybWU5Ni0+cG9ydCA9IDA7CiAJfQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXZmcmVlKHJtZTk2LT5wbGF5YmFja19zdXNwZW5kX2J1ZmZlcik7CiAJdmZyZWUocm1lOTYtPmNhcHR1cmVfc3VzcGVuZF9idWZmZXIpOwogI2VuZGlmCkBAIC0xNjA5LDEzICsxNjA5LDE1IEBACiAKIAlybWU5Ni0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTk2LT5wb3J0LCBSTUU5Nl9JT19TSVpFKTsKIAlpZiAoIXJtZTk2LT5pb2Jhc2UpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsIHJtZTk2LT5wb3J0LCBybWU5Ni0+cG9ydCArIFJNRTk2X0lPX1NJWkUgLSAxKTsKKwkJZGV2X2VycihybWU5Ni0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJcm1lOTYtPnBvcnQsIHJtZTk2LT5wb3J0ICsgUk1FOTZfSU9fU0laRSAtIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWU5Nl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHJtZTk2KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihybWU5Ni0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTk2LT5pcnEgPSBwY2ktPmlycTsKQEAgLTIzNzIsMTMgKzIzNzQsMTIgQEAKICAqIENhcmQgaW5pdGlhbGlzYXRpb24KICAqLwogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAKLXN0YXRpYyBpbnQKLXNuZF9ybWU5Nl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCSAgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBybWU5Nl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybWU5NiAqcm1lOTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CkBAIC0yNDA3LDE1ICsyNDA4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXNuZF9ybWU5Nl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3N0YXRpYyBpbnQgcm1lOTZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybWU5NiAqcm1lOTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInJtZTk2OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI0NTEsNyArMjQ1MiwxMSBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhybWU5Nl9wbSwgcm1lOTZfc3VzcGVuZCwgcm1lOTZfcmVzdW1lKTsKKyNkZWZpbmUgUk1FOTZfUE1fT1BTCSZybWU5Nl9wbQorI2Vsc2UKKyNkZWZpbmUgUk1FOTZfUE1fT1BTCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIHZvaWQgc25kX3JtZTk2X2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CkBAIC0yNDc1LDMxICsyNDgwLDMwIEBACiAJCWRldisrOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybWU5NiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgcm1lOTYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTk2X2NhcmRfZnJlZTsKIAlybWU5NiA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlybWU5Ni0+Y2FyZCA9IGNhcmQ7CiAJcm1lOTYtPnBjaSA9IHBjaTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJaWYgKChlcnIgPSBzbmRfcm1lOTZfY3JlYXRlKHJtZTk2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXJtZTk2LT5wbGF5YmFja19zdXNwZW5kX2J1ZmZlciA9IHZtYWxsb2MoUk1FOTZfQlVGRkVSX1NJWkUpOwogCWlmICghcm1lOTYtPnBsYXliYWNrX3N1c3BlbmRfYnVmZmVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJZGV2X2VycihjYXJkLT5kZXYsCiAJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHBsYXliYWNrIHN1c3BlbmQgYnVmZmVyIVxuIik7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlybWU5Ni0+Y2FwdHVyZV9zdXNwZW5kX2J1ZmZlciA9IHZtYWxsb2MoUk1FOTZfQlVGRkVSX1NJWkUpOwogCWlmICghcm1lOTYtPmNhcHR1cmVfc3VzcGVuZF9idWZmZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNhcmQtPmRldiwKIAkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY2FwdHVyZSBzdXNwZW5kIGJ1ZmZlciFcbiIpOwogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI1NDgsMTAgKzI1NTIsOSBAQAogCS5pZF90YWJsZSA9IHNuZF9ybWU5Nl9pZHMsCiAJLnByb2JlID0gc25kX3JtZTk2X3Byb2JlLAogCS5yZW1vdmUgPSBzbmRfcm1lOTZfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gc25kX3JtZTk2X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHNuZF9ybWU5Nl9yZXN1bWUsCi0jZW5kaWYKKwkuZHJpdmVyID0geworCQkucG0gPSBSTUU5Nl9QTV9PUFMsCisJfSwKIH07CiAKIG1vZHVsZV9wY2lfZHJpdmVyKHJtZTk2X2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggYmQ5MGM4MC4uNGM2ZjVkMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtNjc1LDE0ICs2NzUsMTUgQEAKIAkJaWYgKDAgPT0gKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmCiAJCQkJCUhEU1BfQ29uZmlnRXJyb3IpKSB7CiAJCQlpZiAoaSkgewotCQkJCXNuZF9wcmludGQoIkhhbW1lcmZhbGwtRFNQOiBJTyBib3ggZm91bmQgYWZ0ZXIgJWQgbXNcbiIsCisJCQkJZGV2X2RiZyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJJTyBib3ggZm91bmQgYWZ0ZXIgJWQgbXNcbiIsCiAJCQkJCQkoMjAgKiBpKSk7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQogCQltc2xlZXAoMjApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogbm8gSU8gYm94IGNvbm5lY3RlZCFcbiIpOworCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LCAibm8gSU8gYm94IGNvbm5lY3RlZCFcbiIpOwogCWhkc3AtPnN0YXRlICY9IH5IRFNQX0Zpcm13YXJlTG9hZGVkOwogCXJldHVybiAtRUlPOwogfQpAQCAtNjk5LDEzICs3MDAsMTMgQEAKIAkJaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfQ29uZmlnRXJyb3IpCiAJCQltc2xlZXAoZGVsYXkpOwogCQllbHNlIHsKLQkJCXNuZF9wcmludGQoIkhhbW1lcmZhbGwtRFNQOiBpb2JveCBmb3VuZCBhZnRlciAldW1zIVxuIiwKKwkJCWRldl9kYmcoaGRzcC0+Y2FyZC0+ZGV2LCAiaW9ib3ggZm91bmQgYWZ0ZXIgJXVtcyFcbiIsCiAJCQkJICAgaSAqIGRlbGF5KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IG5vIElPIGJveCBjb25uZWN0ZWQhXG4iKTsKKwlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJubyBJTyBib3ggY29ubmVjdGVkIVxuIik7CiAJaGRzcC0+c3RhdGUgJj0gfkhEU1BfRmlybXdhcmVMb2FkZWQ7CiAJcmV0dXJuIC1FSU87CiB9CkBAIC03MjgsMTMgKzcyOSwxNCBAQAogCiAJaWYgKChoZHNwX3JlYWQgKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpICYgSERTUF9EbGxFcnJvcikgIT0gMCkgewogCi0JCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogbG9hZGluZyBmaXJtd2FyZVxuIik7CisJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgImxvYWRpbmcgZmlybXdhcmVcbiIpOwogCiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19QUk9HUkFNKTsKIAkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9maWZvRGF0YSwgMCk7CiAKIAkJaWYgKGhkc3BfZmlmb193YWl0IChoZHNwLCAwLCBIRFNQX0xPTkdfV0FJVCkpIHsKLQkJCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogdGltZW91dCB3YWl0aW5nIGZvciBkb3dubG9hZCBwcmVwYXJhdGlvblxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGRvd25sb2FkIHByZXBhcmF0aW9uXG4iKTsKIAkJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9TMjAwKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC03NDQsNyArNzQ2LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IEhEU1BfRklSTVdBUkVfU0laRSAvIDQ7ICsraSkgewogCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCBjYWNoZVtpXSk7CiAJCQlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDEyNywgSERTUF9MT05HX1dBSVQpKSB7Ci0JCQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiB0aW1lb3V0IGR1cmluZyBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSAidGltZW91dCBkdXJpbmcgZmlybXdhcmUgbG9hZGluZ1xuIik7CiAJCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2wyUmVnLCBIRFNQX1MyMDApOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQpAQCAtNzYwLDExICs3NjMsMTIgQEAKIAkJaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIgPSAwOwogI2VuZGlmCiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIGhkc3AtPmNvbnRyb2wyX3JlZ2lzdGVyKTsKLQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiBmaW5pc2hlZCBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LCAiZmluaXNoZWQgZmlybXdhcmUgbG9hZGluZ1xuIik7CiAKIAl9CiAJaWYgKGhkc3AtPnN0YXRlICYgSERTUF9Jbml0aWFsaXphdGlvbkNvbXBsZXRlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJIYW1tZXJmYWxsLURTUDogZmlybXdhcmUgbG9hZGVkIGZyb20gY2FjaGUsIHJlc3RvcmluZyBkZWZhdWx0c1xuIik7CisJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwKKwkJCSAiZmlybXdhcmUgbG9hZGVkIGZyb20gY2FjaGUsIHJlc3RvcmluZyBkZWZhdWx0c1xuIik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoZHNwLT5sb2NrLCBmbGFncyk7CiAJCXNuZF9oZHNwX3NldF9kZWZhdWx0cyhoZHNwKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRzcC0+bG9jaywgZmxhZ3MpOwpAQCAtNzkxLDcgKzc5NSw3IEBACiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfZmlmb0RhdGEsIDApOwogCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA8IDApIHsKIAkJCWhkc3AtPmlvX3R5cGUgPSBNdWx0aWZhY2U7Ci0JCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogTXVsdGlmYWNlIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgIk11bHRpZmFjZSBmb3VuZFxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC03OTksNyArODAzLDcgQEAKIAkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKIAkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkgPT0gMCkgewogCQkJaGRzcC0+aW9fdHlwZSA9IERpZ2lmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IERpZ2lmYWNlIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgIkRpZ2lmYWNlIGZvdW5kXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTgwOCw3ICs4MTIsNyBAQAogCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfZmlmb0RhdGEsIDApOwogCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA9PSAwKSB7CiAJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE11bHRpZmFjZSBmb3VuZFxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJNdWx0aWZhY2UgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtODE3LDEyICs4MjEsMTIgQEAKIAkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKIAkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkgPCAwKSB7CiAJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE11bHRpZmFjZSBmb3VuZFxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJNdWx0aWZhY2UgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCQloZHNwLT5pb190eXBlID0gUlBNOwotCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogUlBNIGZvdW5kXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LCAiUlBNIGZvdW5kXG4iKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJLyogZmlybXdhcmUgd2FzIGFscmVhZHkgbG9hZGVkLCBnZXQgaW9ib3ggdHlwZSAqLwpAQCAtODQ3LDIwICs4NTEsMTggQEAKIAkJaGRzcC0+c3RhdGUgJj0gfkhEU1BfRmlybXdhcmVMb2FkZWQ7CiAJCWlmICghIGxvYWRfb25fZGVtYW5kKQogCQkJcmV0dXJuIC1FSU87Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBmaXJtd2FyZSBub3QgcHJlc2VudC5cbiIpOworCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwgImZpcm13YXJlIG5vdCBwcmVzZW50LlxuIik7CiAJCS8qIHRyeSB0byBsb2FkIGZpcm13YXJlICovCiAJCWlmICghIChoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVDYWNoZWQpKSB7CiAJCQlpZiAoISBoZHNwX3JlcXVlc3RfZndfbG9hZGVyKGhkc3ApKQogCQkJCXJldHVybiAwOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCSAgICJIYW1tZXJmYWxsLURTUDogTm8gZmlybXdhcmUgbG9hZGVkIG5vciAiCi0JCQkJICAgImNhY2hlZCwgcGxlYXNlIHVwbG9hZCBmaXJtd2FyZS5cbiIpOworCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJICAgIk5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCQkgICAiSGFtbWVyZmFsbC1EU1A6IEZpcm13YXJlIGxvYWRpbmcgZnJvbSAiCi0JCQkJICAgImNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJICAgIkZpcm13YXJlIGxvYWRpbmcgZnJvbSBjYWNoZSBmYWlsZWQsIHBsZWFzZSB1cGxvYWQgbWFudWFsbHkuXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQpAQCAtODg4LDcgKzg5MCw4IEBACiAJCXVkZWxheSAoMTAwKTsKIAl9CiAKLQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHdhaXQgZm9yIEZJRk8gc3RhdHVzIDw9ICVkIGZhaWxlZCBhZnRlciAlZCBpdGVyYXRpb25zXG4iLAorCWRldl93YXJuKGhkc3AtPmNhcmQtPmRldiwKKwkJICJ3YWl0IGZvciBGSUZPIHN0YXR1cyA8PSAlZCBmYWlsZWQgYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwKIAkJICAgIGNvdW50LCB0aW1lb3V0KTsKIAlyZXR1cm4gLTE7CiB9CkBAIC0xMDA1LDcgKzEwMDgsOSBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHVua25vd24gc3BkaWYgZnJlcXVlbmN5IHN0YXR1czsgYml0cyA9IDB4JXgsIHN0YXR1cyA9IDB4JXhcbiIsIHJhdGVfYml0cywgc3RhdHVzKTsKKwlkZXZfd2FybihoZHNwLT5jYXJkLT5kZXYsCisJCSAidW5rbm93biBzcGRpZiBmcmVxdWVuY3kgc3RhdHVzOyBiaXRzID0gMHgleCwgc3RhdHVzID0gMHgleFxuIiwKKwkJIHJhdGVfYml0cywgc3RhdHVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzOSw3ICsxMTQ0LDggQEAKIAlpZiAoIShoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9DbG9ja01vZGVNYXN0ZXIpKSB7CiAJCWlmIChjYWxsZWRfaW50ZXJuYWxseSkgewogCQkJLyogcmVxdWVzdCBmcm9tIGN0bCBvciBjYXJkIGluaXRpYWxpemF0aW9uICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlLlxuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlLlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0gZWxzZSB7CiAJCQkvKiBod19wYXJhbSByZXF1ZXN0IHdoaWxlIGluIEF1dG9TeW5jIG1vZGUgKi8KQEAgLTExNDcsMTEgKzExNTMsMTQgQEAKIAkJCWludCBzcGRpZl9mcmVxID0gaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZShoZHNwKTsKIAogCQkJaWYgKChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqMikgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIGRvdWJsZSBzcGVlZCBtb2RlXG4iKTsKKwkJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSAiRGV0ZWN0ZWQgQURBVCBpbiBkb3VibGUgc3BlZWQgbW9kZVxuIik7CiAJCQllbHNlIGlmIChoZHNwLT5pb190eXBlID09IEg5NjMyICYmIChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqNCkgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIHF1YWQgc3BlZWQgbW9kZVxuIik7CisJCQkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIkRldGVjdGVkIEFEQVQgaW4gcXVhZCBzcGVlZCBtb2RlXG4iKTsKIAkJCWVsc2UgaWYgKHJhdGUgIT0gZXh0ZXJuYWxfZnJlcSkgewotCQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJIYW1tZXJmYWxsLURTUDogTm8gQXV0b1N5bmMgc291cmNlIGZvciByZXF1ZXN0ZWQgcmF0ZVxuIik7CisJCQkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIk5vIEF1dG9TeW5jIHNvdXJjZSBmb3IgcmVxdWVzdGVkIHJhdGVcbiIpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQpAQCAtMTIyMyw3ICsxMjMyLDggQEAKIAl9CiAKIAlpZiAocmVqZWN0X2lmX29wZW4gJiYgKGhkc3AtPmNhcHR1cmVfcGlkID49IDAgfHwgaGRzcC0+cGxheWJhY2tfcGlkID49IDApKSB7Ci0JCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogY2Fubm90IGNoYW5nZSBzcGVlZCBtb2RlIChjYXB0dXJlIFBJRCA9ICVkLCBwbGF5YmFjayBQSUQgPSAlZClcbiIsCisJCWRldl93YXJuKGhkc3AtPmNhcmQtPmRldiwKKwkJCSAiY2Fubm90IGNoYW5nZSBzcGVlZCBtb2RlIChjYXB0dXJlIFBJRCA9ICVkLCBwbGF5YmFjayBQSUQgPSAlZClcbiIsCiAJCQkgICAgaGRzcC0+Y2FwdHVyZV9waWQsCiAJCQkgICAgaGRzcC0+cGxheWJhY2tfcGlkKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM3ODUsNyArMzc5NSw4IEBACiAJICAgIHNuZF9oYW1tZXJmYWxsX2dldF9idWZmZXIoaGRzcC0+cGNpLCAmaGRzcC0+cGxheWJhY2tfZG1hX2J1ZiwgSERTUF9ETUFfQVJFQV9CWVRFUykgPCAwKSB7CiAJCWlmIChoZHNwLT5jYXB0dXJlX2RtYV9idWYuYXJlYSkKIAkJCXNuZF9kbWFfZnJlZV9wYWdlcygmaGRzcC0+Y2FwdHVyZV9kbWFfYnVmKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIGhkc3AtPmNhcmRfbmFtZSk7CisJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBubyBidWZmZXJzIGF2YWlsYWJsZVxuIiwgaGRzcC0+Y2FyZF9uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00NzQ3LDcgKzQ3NTgsOCBAQAogCQkJcmV0dXJuIGVycjsKIAogCQlpZiAoIShoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVMb2FkZWQpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZmlybXdhcmUgbmVlZHMgdG8gYmUgdXBsb2FkZWQgdG8gdGhlIGNhcmQuXG4iKTsKKwkJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCSJmaXJtd2FyZSBuZWVkcyB0byBiZSB1cGxvYWRlZCB0byB0aGUgY2FyZC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtNDg1OCw3ICs0ODcwLDggQEAKIAkJaWYgKGhkc3AtPnN0YXRlICYgKEhEU1BfRmlybXdhcmVDYWNoZWQgfCBIRFNQX0Zpcm13YXJlTG9hZGVkKSkKIAkJCXJldHVybiAtRUJVU1k7CiAKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBpbml0aWFsaXppbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJICJpbml0aWFsaXppbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKIAkJZmlybXdhcmUgPSAoc3RydWN0IGhkc3BfZmlybXdhcmUgX191c2VyICopYXJncDsKIAogCQlpZiAoZ2V0X3VzZXIoZmlybXdhcmVfZGF0YSwgJmZpcm13YXJlLT5maXJtd2FyZV9kYXRhKSkKQEAgLTQ4OTMsNyArNDkwNiw4IEBACiAJCQlzbmRfaGRzcF9pbml0aWFsaXplX21pZGlfZmx1c2goaGRzcCk7CiAKIAkJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX2Fsc2FfZGV2aWNlcyhoZHNwLT5jYXJkLCBoZHNwKSkgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGFsc2EgZGV2aWNlc1xuIik7CisJCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJlcnJvciBjcmVhdGluZyBhbHNhIGRldmljZXNcbiIpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0KQEAgLTQ5ODMsNyArNDk5Nyw4IEBACiAJaW50IGk7CiAKIAlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDAsIDEwMCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVuYWJsZV9pbyBmaWZvX3dhaXQgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkiZW5hYmxlX2lvIGZpZm9fd2FpdCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTUwNTcsMjUgKzUwNzIsMjkgQEAKIAlpbnQgZXJyOwogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfcGNtKGNhcmQsIGhkc3ApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IEVycm9yIGNyZWF0aW5nIHBjbSBpbnRlcmZhY2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJFcnJvciBjcmVhdGluZyBwY20gaW50ZXJmYWNlXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAogCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX21pZGkoY2FyZCwgaGRzcCwgMCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgZmlyc3QgbWlkaSBpbnRlcmZhY2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJFcnJvciBjcmVhdGluZyBmaXJzdCBtaWRpIGludGVyZmFjZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGhkc3AtPmlvX3R5cGUgPT0gRGlnaWZhY2UgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTY1MikgewogCQlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9taWRpKGNhcmQsIGhkc3AsIDEpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBFcnJvciBjcmVhdGluZyBzZWNvbmQgbWlkaSBpbnRlcmZhY2VcbiIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkVycm9yIGNyZWF0aW5nIHNlY29uZCBtaWRpIGludGVyZmFjZVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfY29udHJvbHMoY2FyZCwgaGRzcCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgY3RsIGludGVyZmFjZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkVycm9yIGNyZWF0aW5nIGN0bCBpbnRlcmZhY2VcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTA4OCw3ICs1MTA3LDggQEAKIAloZHNwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOwogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9zZXRfZGVmYXVsdHMoaGRzcCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3Igc2V0dGluZyBkZWZhdWx0IHZhbHVlc1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkVycm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXNcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTA5OCw3ICs1MTE4LDggQEAKIAkJCWhkc3AtPnBvcnQsIGhkc3AtPmlycSk7CiAKIAkJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZXJyb3IgcmVnaXN0ZXJpbmcgY2FyZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiZXJyb3IgcmVnaXN0ZXJpbmcgY2FyZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWhkc3AtPnN0YXRlIHw9IEhEU1BfSW5pdGlhbGl6YXRpb25Db21wbGV0ZTsKQEAgLTUxNDEsMTYgKzUxNjIsMTkgQEAKIAkJCWZ3ZmlsZSA9ICJkaWdpZmFjZV9maXJtd2FyZV9yZXYxMS5iaW4iOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd2ZpbGUsICZoZHNwLT5wY2ktPmRldikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGNhbm5vdCBsb2FkIGZpcm13YXJlICVzXG4iLCBmd2ZpbGUpOworCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwgZndmaWxlKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCWlmIChmdy0+c2l6ZSA8IEhEU1BfRklSTVdBUkVfU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkidG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKIAkJCSAgIChpbnQpZnctPnNpemUsIEhEU1BfRklSTVdBUkVfU0laRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUxNjcsMTMgKzUxOTEsMTUgQEAKIAkJCXJldHVybiBlcnI7CiAKIAkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfaHdkZXAoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGh3ZGVwIGRldmljZVxuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZXJyb3IgY3JlYXRpbmcgaHdkZXAgZGV2aWNlXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJc25kX2hkc3BfaW5pdGlhbGl6ZV9jaGFubmVscyhoZHNwKTsKIAkJc25kX2hkc3BfaW5pdGlhbGl6ZV9taWRpX2ZsdXNoKGhkc3ApOwogCQlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9hbHNhX2RldmljZXMoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGFsc2EgZGV2aWNlc1xuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZXJyb3IgY3JlYXRpbmcgYWxzYSBkZXZpY2VzXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC01MjQ5LDEzICs1Mjc1LDE0IEBACiAJCXJldHVybiBlcnI7CiAJaGRzcC0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmICgoaGRzcC0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGhkc3AtPnBvcnQsIEhEU1BfSU9fRVhURU5UKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwgaGRzcC0+cG9ydCwgaGRzcC0+cG9ydCArIEhEU1BfSU9fRVhURU5UIC0gMSk7CisJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJCWhkc3AtPnBvcnQsIGhkc3AtPnBvcnQgKyBIRFNQX0lPX0VYVEVOVCAtIDEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2hkc3BfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBoZHNwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdW5hYmxlIHRvIHVzZSBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtNTI4MSwxNyArNTMwOCwyMCBAQAogCQkJCSAgIGlmIHVzZXJzcGFjZSBpcyBub3QgcmVhZHkgZm9yCiAJCQkJICAgZmlybXdhcmUgdXBsb2FkCiAJCQkJKi8KLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogY291bGRuJ3QgZ2V0IGZpcm13YXJlIGZyb20gdXNlcnNwYWNlLiB0cnkgdXNpbmcgaGRzcGxvYWRlclxuIik7CisJCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJjb3VsZG4ndCBnZXQgZmlybXdhcmUgZnJvbSB1c2Vyc3BhY2UuIHRyeSB1c2luZyBoZHNwbG9hZGVyXG4iKTsKIAkJCWVsc2UKIAkJCQkvKiBpbml0IGlzIGNvbXBsZXRlLCB3ZSByZXR1cm4gKi8KIAkJCQlyZXR1cm4gMDsKIAkJCS8qIHdlIGRlZmVyIGluaXRpYWxpemF0aW9uICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSGFtbWVyZmFsbC1EU1A6IGNhcmQgaW5pdGlhbGl6YXRpb24gcGVuZGluZyA6IHdhaXRpbmcgZm9yIGZpcm13YXJlXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkgImNhcmQgaW5pdGlhbGl6YXRpb24gcGVuZGluZyA6IHdhaXRpbmcgZm9yIGZpcm13YXJlXG4iKTsKIAkJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX2h3ZGVwKGNhcmQsIGhkc3ApKSA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJICJGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CiAJCQlpZiAoaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzMlJlZ2lzdGVyKSAmIEhEU1BfdmVyc2lvbjIpCiAJCQkJaGRzcC0+aW9fdHlwZSA9IFJQTTsKIAkJCWVsc2UgaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1czJSZWdpc3RlcikgJiBIRFNQX3ZlcnNpb24xKQpAQCAtNTM3NSw4ICs1NDA1LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBoZHNwKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBoZHNwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC01Mzg0LDcgKzU0MTQsNiBAQAogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9oZHNwX2NhcmRfZnJlZTsKIAloZHNwLT5kZXYgPSBkZXY7CiAJaGRzcC0+cGNpID0gcGNpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlKGNhcmQsIGhkc3ApKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IGU5OGRjMDAuLmNiODJiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtMTY1MSw5ICsxNjUxLDggQEAKIAkJCSAgIGp1c3QgbWFrZSBhIHdhcm5pbmcgYW4gcmVtZW1iZXIgc2V0dGluZwogCQkJICAgZm9yIGZ1dHVyZSBtYXN0ZXIgbW9kZSBzd2l0Y2hpbmcgKi8KIAotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhEU1BNOiAiCi0JCQkJICAgIldhcm5pbmc6IGRldmljZSBpcyBub3QgcnVubmluZyAiCi0JCQkJICAgImFzIGEgY2xvY2sgbWFzdGVyLlxuIik7CisJCQlkZXZfd2FybihoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiV2FybmluZzogZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyLlxuIik7CiAJCQlub3Rfc2V0ID0gMTsKIAkJfSBlbHNlIHsKIApAQCAtMTY2NCwxNSArMTY2MywxNCBAQAogCQkJaWYgKGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSkgPT0KIAkJCSAgICBIRFNQTV9BVVRPU1lOQ19GUk9NX05PTkUpIHsKIAotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRFNQTTogIgotCQkJCQkgICAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luYyBcbiIpOworCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJCSAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luY1xuIik7CiAJCQkJbm90X3NldCA9IDE7CiAKIAkJCX0gZWxzZSBpZiAocmF0ZSAhPSBleHRlcm5hbF9mcmVxKSB7CiAKLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERTUE06ICIKLQkJCQkJICAgIldhcm5pbmc6IE5vIEF1dG9TeW5jIHNvdXJjZSBmb3IgIgotCQkJCQkgICAicmVxdWVzdGVkIHJhdGVcbiIpOworCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJCSAiV2FybmluZzogTm8gQXV0b1N5bmMgc291cmNlIGZvciByZXF1ZXN0ZWQgcmF0ZVxuIik7CiAJCQkJbm90X3NldCA9IDE7CiAJCQl9CiAJCX0KQEAgLTE3MzgsMTMgKzE3MzYsMTEgQEAKIAogCWlmIChjdXJyZW50X3NwZWVkICE9IHRhcmdldF9zcGVlZAogCSAgICAmJiAoaGRzcG0tPmNhcHR1cmVfcGlkID49IDAgfHwgaGRzcG0tPnBsYXliYWNrX3BpZCA+PSAwKSkgewotCQlzbmRfcHJpbnRrCi0JCSAgICAoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCSAgICAgImNhbm5vdCBjaGFuZ2UgZnJvbSAlcyBzcGVlZCB0byAlcyBzcGVlZCBtb2RlICIKLQkJICAgICAiKGNhcHR1cmUgUElEID0gJWQsIHBsYXliYWNrIFBJRCA9ICVkKVxuIiwKLQkJICAgICBoZHNwbV9zcGVlZF9uYW1lc1tjdXJyZW50X3NwZWVkXSwKLQkJICAgICBoZHNwbV9zcGVlZF9uYW1lc1t0YXJnZXRfc3BlZWRdLAotCQkgICAgIGhkc3BtLT5jYXB0dXJlX3BpZCwgaGRzcG0tPnBsYXliYWNrX3BpZCk7CisJCWRldl9lcnIoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY2hhbmdlIGZyb20gJXMgc3BlZWQgdG8gJXMgc3BlZWQgbW9kZSAoY2FwdHVyZSBQSUQgPSAlZCwgcGxheWJhY2sgUElEID0gJWQpXG4iLAorCQkJaGRzcG1fc3BlZWRfbmFtZXNbY3VycmVudF9zcGVlZF0sCisJCQloZHNwbV9zcGVlZF9uYW1lc1t0YXJnZXRfc3BlZWRdLAorCQkJaGRzcG0tPmNhcHR1cmVfcGlkLCBoZHNwbS0+cGxheWJhY2tfcGlkKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTU0NDYsNyArNTQ0Miw3IEBACiAJICogICAgICAgICAgMCAgICAgICAgIDY0ICAgICB+Mzk5ODIzMSAgICAgICB+ODE5MTU1OAogCSAqKi8KIAkvKgotCSAgIHNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1faW50ZXJydXB0ICVsbHUgQCAlbGx4XG4iLAorCSAgZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwgInNuZF9oZHNwbV9pbnRlcnJ1cHQgJWxsdSBAICVsbHhcbiIsCiAJICAgbm93LWhkc3BtLT5sYXN0X2ludGVycnVwdCwgc3RhdHVzICYgMHhGRkMwKTsKIAkgICBoZHNwbS0+bGFzdF9pbnRlcnJ1cHQgPSBub3c7CiAJKi8KQEAgLTU1ODMsNyArNTU3OSw3IEBACiAJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCWVyciA9IGhkc3BtX3NldF9yYXRlKGhkc3BtLCBwYXJhbXNfcmF0ZShwYXJhbXMpLCAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZXJyIG9uIGhkc3BtX3NldF9yYXRlOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwgImVyciBvbiBoZHNwbV9zZXRfcmF0ZTogJWRcbiIsIGVycik7CiAJCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCQlfc25kX3BjbV9od19wYXJhbV9zZXRlbXB0eShwYXJhbXMsCiAJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwpAQCAtNTU5NCw3ICs1NTkwLDggQEAKIAllcnIgPSBoZHNwbV9zZXRfaW50ZXJydXB0X2ludGVydmFsKGhkc3BtLAogCQkJcGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlcnIgb24gaGRzcG1fc2V0X2ludGVycnVwdF9pbnRlcnZhbDogJWRcbiIsIGVycik7CisJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkgImVyciBvbiBoZHNwbV9zZXRfaW50ZXJydXB0X2ludGVydmFsOiAlZFxuIiwgZXJyKTsKIAkJX3NuZF9wY21faHdfcGFyYW1fc2V0ZW1wdHkocGFyYW1zLAogCQkJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSk7CiAJCXJldHVybiBlcnI7CkBAIC01NjEwLDcgKzU2MDcsOCBAQAogCWVyciA9CiAJCXNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIEhEU1BNX0RNQV9BUkVBX0JZVEVTKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZXJyIG9uIHNuZF9wY21fbGliX21hbGxvY19wYWdlczogJWRcbiIsIGVycik7CisJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkgImVyciBvbiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXM6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTYyNCw3ICs1NjIyLDggQEAKIAogCQloZHNwbS0+cGxheWJhY2tfYnVmZmVyID0KIAkJCSh1bnNpZ25lZCBjaGFyICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7Ci0JCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCisJCWRldl9kYmcoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCiAJCQkJaGRzcG0tPnBsYXliYWNrX2J1ZmZlcik7CiAJfSBlbHNlIHsKIAkJaGRzcG1fc2V0X3NnYnVmKGhkc3BtLCBzdWJzdHJlYW0sIEhEU1BNX3BhZ2VBZGRyZXNzQnVmZmVySW4sCkBAIC01NjM1LDE4ICs1NjM0LDIxIEBACiAKIAkJaGRzcG0tPmNhcHR1cmVfYnVmZmVyID0KIAkJCSh1bnNpZ25lZCBjaGFyICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7Ci0JCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgY2FwdHVyZSBhdCAlcFxuIiwKKwkJZGV2X2RiZyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciBjYXB0dXJlIGF0ICVwXG4iLAogCQkJCWhkc3BtLT5jYXB0dXJlX2J1ZmZlcik7CiAJfQogCiAJLyoKLQkgICBzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yICVzIGF0IDB4JTA4WFxuIiwKKwkgICBkZXZfZGJnKGhkc3BtLT5jYXJkLT5kZXYsCisJICAgIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciAlcyBhdCAweCUwOFhcbiIsCiAJICAgc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/CiAJICAgInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKIAkgICBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHN1YnN0cmVhbSwgMCkpOwogCSAgICovCiAJLyoKLQkgICBzbmRfcHJpbnRkZCgic2V0X2h3cGFyYW1zOiAlcyAlZCBIeiwgJWQgY2hhbm5lbHMsIGJzID0gJWRcbiIsCisJICAgZGV2X2RiZyhoZHNwbS0+Y2FyZC0+ZGV2LAorCSAgICJzZXRfaHdwYXJhbXM6ICVzICVkIEh6LCAlZCBjaGFubmVscywgYnMgPSAlZFxuIiwKIAkgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KIAkgICAicGxheWJhY2siIDogImNhcHR1cmUiLAogCSAgIHBhcmFtc19yYXRlKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLApAQCAtNTY2NywxMiArNTY2OSwxNCBAQAogCS8qIFN3aXRjaCB0byBuYXRpdmUgZmxvYXQgZm9ybWF0IGlmIHJlcXVlc3RlZCAqLwogCWlmIChTTkRSVl9QQ01fRk9STUFUX0ZMT0FUX0xFID09IHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCQlpZiAoIShoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BlX0ZMT0FUX0ZPUk1BVCkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiaGRzcG06IFN3aXRjaGluZyB0byBuYXRpdmUgMzJiaXQgTEUgZmxvYXQgZm9ybWF0LlxuIik7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3dpdGNoaW5nIHRvIG5hdGl2ZSAzMmJpdCBMRSBmbG9hdCBmb3JtYXQuXG4iKTsKIAogCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQZV9GTE9BVF9GT1JNQVQ7CiAJfSBlbHNlIGlmIChTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSA9PSBwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKIAkJaWYgKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUGVfRkxPQVRfRk9STUFUKQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImhkc3BtOiBTd2l0Y2hpbmcgdG8gbmF0aXZlIDMyYml0IExFIGludGVnZXIgZm9ybWF0LlxuIik7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3dpdGNoaW5nIHRvIG5hdGl2ZSAzMmJpdCBMRSBpbnRlZ2VyIGZvcm1hdC5cbiIpOwogCiAJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQZV9GTE9BVF9GT1JNQVQ7CiAJfQpAQCAtNTcxNSwxMiArNTcxOSwxNiBAQAogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJaWYgKHNuZF9CVUdfT04oaW5mby0+Y2hhbm5lbCA+PSBoZHNwbS0+bWF4X2NoYW5uZWxzX291dCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCBvdXQgb2YgcmFuZ2UgKCVkKVxuIiwgaW5mby0+Y2hhbm5lbCk7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAic25kX2hkc3BtX2NoYW5uZWxfaW5mbzogb3V0cHV0IGNoYW5uZWwgb3V0IG9mIHJhbmdlICglZClcbiIsCisJCQkJIGluZm8tPmNoYW5uZWwpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlpZiAoaGRzcG0tPmNoYW5uZWxfbWFwX291dFtpbmZvLT5jaGFubmVsXSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCAlZCBtYXBwZWQgb3V0XG4iLCBpbmZvLT5jaGFubmVsKTsKKwkJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCAlZCBtYXBwZWQgb3V0XG4iLAorCQkJCSBpbmZvLT5jaGFubmVsKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTU3MjgsMTIgKzU3MzYsMTYgQEAKIAkJCUhEU1BNX0NIQU5ORUxfQlVGRkVSX0JZVEVTOwogCX0gZWxzZSB7CiAJCWlmIChzbmRfQlVHX09OKGluZm8tPmNoYW5uZWwgPj0gaGRzcG0tPm1heF9jaGFubmVsc19pbikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsIG91dCBvZiByYW5nZSAoJWQpXG4iLCBpbmZvLT5jaGFubmVsKTsKKwkJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsIG91dCBvZiByYW5nZSAoJWQpXG4iLAorCQkJCSBpbmZvLT5jaGFubmVsKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJaWYgKGhkc3BtLT5jaGFubmVsX21hcF9pbltpbmZvLT5jaGFubmVsXSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsICVkIG1hcHBlZCBvdXRcbiIsIGluZm8tPmNoYW5uZWwpOworCQkJZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwKKwkJCQkgInNuZF9oZHNwbV9jaGFubmVsX2luZm86IGlucHV0IGNoYW5uZWwgJWQgbWFwcGVkIG91dFxuIiwKKwkJCQkgaW5mby0+Y2hhbm5lbCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC02MjgzLDcgKzYyOTUsNyBAQAogCiAJCXMgPSBjb3B5X3RvX3VzZXIoYXJncCwgbGV2ZWxzLCBzaXplb2Yoc3RydWN0IGhkc3BtX3BlYWtfcm1zKSk7CiAJCWlmICgwICE9IHMpIHsKLQkJCS8qIHNuZF9wcmludGsoS0VSTl9FUlIgImNvcHlfdG9fdXNlciguLiwgLi4sICVsdSk6ICVsdQorCQkJLyogZGV2X2VycihoZHNwbS0+Y2FyZC0+ZGV2LCAiY29weV90b191c2VyKC4uLCAuLiwgJWx1KTogJWx1CiAJCQkgW0xldmVsc11cbiIsIHNpemVvZihzdHJ1Y3QgaGRzcG1fcGVha19ybXMpLCBzKTsKIAkJCSAqLwogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC02MzI5LDcgKzYzNDEsNyBAQAogCQlzID0gY29weV90b191c2VyKGFyZ3AsICZsdGMsIHNpemVvZihzdHJ1Y3QgaGRzcG1fbHRjKSk7CiAJCWlmICgwICE9IHMpIHsKIAkJCS8qCi0JCQkgc25kX3ByaW50ayhLRVJOX0VSUiAiY29weV90b191c2VyKC4uLCAuLiwgJWx1KTogJWx1IFtMVENdXG4iLCBzaXplb2Yoc3RydWN0IGhkc3BtX2x0YyksIHMpOyAqLworCQkJICBkZXZfZXJyKGhkc3BtLT5jYXJkLT5kZXYsICJjb3B5X3RvX3VzZXIoLi4sIC4uLCAlbHUpOiAlbHUgW0xUQ11cbiIsIHNpemVvZihzdHJ1Y3QgaGRzcG1fbHRjKSwgcyk7ICovCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCkBAIC02NDk0LDExICs2NTA2LDEzIEBACiAJCQkJCQkgICB3YW50ZWQsCiAJCQkJCQkgICB3YW50ZWQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGRkKCJDb3VsZCBub3QgcHJlYWxsb2NhdGUgJXpkIEJ5dGVzXG4iLCB3YW50ZWQpOworCQlkZXZfZGJnKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkiQ291bGQgbm90IHByZWFsbG9jYXRlICV6ZCBCeXRlc1xuIiwgd2FudGVkKTsKIAogCQlyZXR1cm4gZXJyOwogCX0gZWxzZQotCQlzbmRfcHJpbnRkZCgiIFByZWFsbG9jYXRlZCAlemQgQnl0ZXNcbiIsIHdhbnRlZCk7CisJCWRldl9kYmcoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSIgUHJlYWxsb2NhdGVkICV6ZCBCeXRlc1xuIiwgd2FudGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjU1OSw3ICs2NTczLDcgQEAKIHsKIAlpbnQgZXJyLCBpOwogCi0Jc25kX3ByaW50ZGQoIkNyZWF0ZSBjYXJkLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIkNyZWF0ZSBjYXJkLi4uXG4iKTsKIAllcnIgPSBzbmRfaGRzcG1fY3JlYXRlX3BjbShjYXJkLCBoZHNwbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC02NTgxLDcgKzY1OTUsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX3ByaW50ZGQoInByb2MgaW5pdC4uLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJwcm9jIGluaXQuLi5cbiIpOwogCXNuZF9oZHNwbV9wcm9jX2luaXQoaGRzcG0pOwogCiAJaGRzcG0tPnN5c3RlbV9zYW1wbGVfcmF0ZSA9IC0xOwpAQCAtNjU5MiwyMyArNjYwNiwyMyBAQAogCWhkc3BtLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CiAJaGRzcG0tPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CiAKLQlzbmRfcHJpbnRkZCgiU2V0IGRlZmF1bHRzLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIlNldCBkZWZhdWx0cy4uLlxuIik7CiAJZXJyID0gc25kX2hkc3BtX3NldF9kZWZhdWx0cyhoZHNwbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiVXBkYXRlIG1peGVyIGNvbnRyb2xzLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIlVwZGF0ZSBtaXhlciBjb250cm9scy4uLlxuIik7CiAJaGRzcG1fdXBkYXRlX3NpbXBsZV9taXhlcl9jb250cm9scyhoZHNwbSk7CiAKLQlzbmRfcHJpbnRkZCgiSW5pdGlhbGl6ZWluZyBjb21wbGV0ZSA/Pz9cbiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAiSW5pdGlhbGl6ZWluZyBjb21wbGV0ZSA/Pz9cbiIpOwogCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSERTUE06IGVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGRkKCIuLi4geWVzIG5vd1xuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICIuLi4geWVzIG5vd1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2NjIsOCArNjY3Niw4IEBACiAJCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBNQURJIjsKIAkJCWhkc3BtLT5taWRpUG9ydHMgPSAzOwogCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCSJIRFNQTTogdW5rbm93biBmaXJtd2FyZSByZXZpc2lvbiAleFxuIiwKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJ1bmtub3duIGZpcm13YXJlIHJldmlzaW9uICV4XG4iLAogCQkJCWhkc3BtLT5maXJtd2FyZV9yZXYpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTY2ODIsMzYgKzY2OTYsMzUgQEAKIAloZHNwbS0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlvX2V4dGVudCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKTsKIAotCXNuZF9wcmludGRkKCJncmFiYmVkIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJZGV2X2RiZyhjYXJkLT5kZXYsICJncmFiYmVkIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCiAJCQloZHNwbS0+cG9ydCwgaGRzcG0tPnBvcnQgKyBpb19leHRlbnQgLSAxKTsKIAogCWhkc3BtLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaGRzcG0tPnBvcnQsIGlvX2V4dGVudCk7CiAJaWYgKCFoZHNwbS0+aW9iYXNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCQkJInVuYWJsZSB0byByZW1hcCByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwKIAkJCQloZHNwbS0+cG9ydCwgaGRzcG0tPnBvcnQgKyBpb19leHRlbnQgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0Jc25kX3ByaW50ZGQoInJlbWFwcGVkIHJlZ2lvbiAoMHglbHgpIDB4JWx4LTB4JWx4XG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAicmVtYXBwZWQgcmVnaW9uICgweCVseCkgMHglbHgtMHglbHhcbiIsCiAJCQkodW5zaWduZWQgbG9uZyloZHNwbS0+aW9iYXNlLCBoZHNwbS0+cG9ydCwKIAkJCWhkc3BtLT5wb3J0ICsgaW9fZXh0ZW50IC0gMSk7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9oZHNwbV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGhkc3BtKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIRFNQTTogdW5hYmxlIHRvIHVzZSBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXNuZF9wcmludGRkKCJ1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJ1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAKIAloZHNwbS0+aXJxID0gcGNpLT5pcnE7CiAKLQlzbmRfcHJpbnRkZCgia21hbGxvYyBNaXhlciBtZW1vcnkgb2YgJXpkIEJ5dGVzXG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAia21hbGxvYyBNaXhlciBtZW1vcnkgb2YgJXpkIEJ5dGVzXG4iLAogCQkJc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpOwogCWhkc3BtLT5taXhlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlciksIEdGUF9LRVJORUwpOwogCWlmICghaGRzcG0tPm1peGVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCQkJInVuYWJsZSB0byBrbWFsbG9jIE1peGVyIG1lbW9yeSBvZiAlZCBCeXRlc1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGttYWxsb2MgTWl4ZXIgbWVtb3J5IG9mICVkIEJ5dGVzXG4iLAogCQkJCShpbnQpc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NzgwLDE0ICs2NzkzLDE0IEBACiAJCWhkc3BtLT5xc19vdXRfY2hhbm5lbHMgPSBBSU9fT1VUX1FTX0NIQU5ORUxTOwogCiAJCWlmICgwID09IChoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpICYgSERTUE1fczJfQUVCSV9EKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBRUIgaW5wdXQgYm9hcmQgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQUVCIGlucHV0IGJvYXJkIGZvdW5kXG4iKTsKIAkJCWhkc3BtLT5zc19pbl9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPmRzX2luX2NoYW5uZWxzICs9IDQ7CiAJCQloZHNwbS0+cXNfaW5fY2hhbm5lbHMgKz0gNDsKIAkJfQogCiAJCWlmICgwID09IChoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpICYgSERTUE1fczJfQUVCT19EKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBRUIgb3V0cHV0IGJvYXJkIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgIkFFQiBvdXRwdXQgYm9hcmQgZm91bmRcbiIpOwogCQkJaGRzcG0tPnNzX291dF9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPmRzX291dF9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPnFzX291dF9jaGFubmVscyArPSA0OwpAQCAtNjg1NCw3ICs2ODY3LDcgQEAKIAkJCWlmIChOVUxMICE9IGhkc3BtLT50Y28pIHsKIAkJCQloZHNwbV90Y29fd3JpdGUoaGRzcG0pOwogCQkJfQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBSU8vUmF5REFUIFRDTyBtb2R1bGUgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQUlPL1JheURBVCBUQ08gbW9kdWxlIGZvdW5kXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWhkc3BtLT50Y28gPSBOVUxMOwogCQl9CkBAIC02ODY5LDcgKzY4ODIsNyBAQAogCQkJaWYgKE5VTEwgIT0gaGRzcG0tPnRjbykgewogCQkJCWhkc3BtX3Rjb193cml0ZShoZHNwbSk7CiAJCQl9Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSERTUE06IE1BREkvQUVTIFRDTyBtb2R1bGUgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTUFESS9BRVMgVENPIG1vZHVsZSBmb3VuZFxuIik7CiAJCX0gZWxzZSB7CiAJCQloZHNwbS0+dGNvID0gTlVMTDsKIAkJfQpAQCAtNjk1MSw3ICs2OTY0LDcgQEAKIAkJfQogCX0KIAotCXNuZF9wcmludGRkKCJjcmVhdGUgYWxzYSBkZXZpY2VzLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjcmVhdGUgYWxzYSBkZXZpY2VzLlxuIik7CiAJZXJyID0gc25kX2hkc3BtX2NyZWF0ZV9hbHNhX2RldmljZXMoY2FyZCwgaGRzcG0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNzAxNiw4ICs3MDI5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sCi0JCQlUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBoZHNwbSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgaGRzcG0pLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTcwMjYsOCArNzAzOSw2IEBACiAJaGRzcG0tPmRldiA9IGRldjsKIAloZHNwbS0+cGNpID0gcGNpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJZXJyID0gc25kX2hkc3BtX2NyZWF0ZShjYXJkLCBoZHNwbSk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwppbmRleCAxNTAzZWUzLi4xZDliZTkwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCkBAIC0zOTQsNyArMzk0LDkgQEAKIAlpZiAob2Zmc2V0IDwgcGVyaW9kX3NpemUpIHsKIAkJaWYgKG9mZnNldCA+IHJtZTk2NTItPm1heF9qaXR0ZXIpIHsKIAkJCWlmIChmcmFnKQotCQkJCXByaW50ayhLRVJOX0VSUiAiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAwKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLCBzdGF0dXMsIG9mZnNldCk7CisJCQkJZGV2X2VycihybWU5NjUyLT5jYXJkLT5kZXYsCisJCQkJCSJVbmV4cGVjdGVkIGh3X3BvaW50ZXIgcG9zaXRpb24gKGJ1ZmlkID09IDApOiBzdGF0dXM6ICV4IG9mZnNldDogJWRcbiIsCisJCQkJCXN0YXR1cywgb2Zmc2V0KTsKIAkJfSBlbHNlIGlmICghZnJhZykKIAkJCXJldHVybiAwOwogCQlvZmZzZXQgLT0gcm1lOTY1Mi0+bWF4X2ppdHRlcjsKQEAgLTQwMyw3ICs0MDUsOSBAQAogCX0gZWxzZSB7CiAJCWlmIChvZmZzZXQgPiBwZXJpb2Rfc2l6ZSArIHJtZTk2NTItPm1heF9qaXR0ZXIpIHsKIAkJCWlmICghZnJhZykKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuZXhwZWN0ZWQgaHdfcG9pbnRlciBwb3NpdGlvbiAoYnVmaWQgPT0gMSk6IHN0YXR1czogJXggb2Zmc2V0OiAlZFxuIiwgc3RhdHVzLCBvZmZzZXQpOworCQkJCWRldl9lcnIocm1lOTY1Mi0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAxKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLAorCQkJCQlzdGF0dXMsIG9mZnNldCk7CiAJCX0gZWxzZSBpZiAoZnJhZykKIAkJCXJldHVybiBwZXJpb2Rfc2l6ZTsKIAkJb2Zmc2V0IC09IHJtZTk2NTItPm1heF9qaXR0ZXI7CkBAIC03NjksNyArNzczLDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAorCQlkZXZfZXJyKHMtPmNhcmQtPmRldiwKKwkJCSIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAogCQkJICAgcy0+Y2FyZF9uYW1lLCByYXRlX2JpdHMpOwogCQlyZXR1cm4gMDsKIAkJYnJlYWs7CkBAIC0xNzkwLDcgKzE3OTUsOCBAQAogCSAgICBzbmRfaGFtbWVyZmFsbF9nZXRfYnVmZmVyKHJtZTk2NTItPnBjaSwgJnJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYsIFJNRTk2NTJfRE1BX0FSRUFfQllURVMpIDwgMCkgewogCQlpZiAocm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFyZWEpCiAJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnJtZTk2NTItPmNhcHR1cmVfZG1hX2J1Zik7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGJ1ZmZlcnMgYXZhaWxhYmxlXG4iLCBybWU5NjUyLT5jYXJkX25hbWUpOworCQlkZXZfZXJyKHJtZTk2NTItPmNhcmQtPmRldiwKKwkJCSIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIHJtZTk2NTItPmNhcmRfbmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjQ2OCwxMyArMjQ3NCwxNCBAQAogCXJtZTk2NTItPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAlybWU5NjUyLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocm1lOTY1Mi0+cG9ydCwgUk1FOTY1Ml9JT19FWFRFTlQpOwogCWlmIChybWU5NjUyLT5pb2Jhc2UgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBybWU5NjUyLT5wb3J0LCBybWU5NjUyLT5wb3J0ICsgUk1FOTY1Ml9JT19FWFRFTlQgLSAxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJcm1lOTY1Mi0+cG9ydCwgcm1lOTY1Mi0+cG9ydCArIFJNRTk2NTJfSU9fRVhURU5UIC0gMSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCQogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTk2NTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBybWU5NjUyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJcm1lOTY1Mi0+aXJxID0gcGNpLT5pcnE7CkBAIC0yNTg3LDggKzI1OTQsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9ybWU5NjUyKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfcm1lOTY1MiksICZjYXJkKTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMjU5Nyw3ICsyNjA0LDYgQEAKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfcm1lOTY1Ml9jYXJkX2ZyZWU7CiAJcm1lOTY1Mi0+ZGV2ID0gZGV2OwogCXJtZTk2NTItPnBjaSA9IHBjaTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAKIAlpZiAoKGVyciA9IHNuZF9ybWU5NjUyX2NyZWF0ZShjYXJkLCBybWU5NjUyLCBwcmVjaXNlX3B0cltkZXZdKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc2lzNzAxOS5jIGIvc291bmQvcGNpL3NpczcwMTkuYwppbmRleCBlNDEzYjRlLi42YjI2YjkzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTE0MDQsOCArMTQwNCw2IEBACiAJaWYgKHJjKQogCQlnb3RvIGVycm9yX291dF9jbGVhbnVwOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJcmV0dXJuIDA7CiAKIGVycm9yX291dF9jbGVhbnVwOgpAQCAtMTQ0MCw3ICsxNDM4LDggQEAKIAlpZiAoIWNvZGVjcykKIAkJY29kZWNzID0gU0lTX1BSSU1BUllfQ09ERUNfUFJFU0VOVDsKIAotCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIHNpemVvZigqc2lzKSwgJmNhcmQpOworCXJjID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgc2l6ZW9mKCpzaXMpLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnJvcl9vdXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCmluZGV4IDJhNDZiZjkuLjIwNDRkYzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKKysrIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJb3V0bChjb3VudCwgc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9DT1VOVDApOwogCW91dGIoMHgxOCwgc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9NT0RFKTsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgInByb2dyYW0gZG1hYTogYWRkciA9IDB4JXgsIHBhZGRyID0gMHgleFxuIiwKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsICJwcm9ncmFtIGRtYWE6IGFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXhcbiIsCiAJICAgICAgIGFkZHIsIGlubChzb25pYy0+ZG1hYV9wb3J0ICsgU1ZfRE1BX0FERFIwKSk7CiAjZW5kaWYKIH0KQEAgLTI4OSw3ICsyODksNyBAQAogCW91dGwoY291bnQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfQ09VTlQwKTsKIAlvdXRiKDB4MTQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfTU9ERSk7CiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJwcm9ncmFtIGRtYWM6IGFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXhcbiIsCisJZGV2X2RiZyhzb25pYy0+Y2FyZC0+ZGV2LCAicHJvZ3JhbSBkbWFjOiBhZGRyID0gMHgleCwgcGFkZHIgPSAweCV4XG4iLAogCSAgICAgICBhZGRyLCBpbmwoc29uaWMtPmRtYWNfcG9ydCArIFNWX0RNQV9BRERSMCkpOwogI2VuZGlmCiB9CkBAIC0zNTcsMTA1ICszNTcsMTA1IEBACiAjaWYgMAogc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfZGVidWcoc3RydWN0IHNvbmljdmliZXMgKiBzb25pYykKIHsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiU1YgUkVHUzogICAgICAgICAgSU5ERVggPSAweCUwMnggICIsIGluYihTVl9SRUcoc29uaWMsIElOREVYKSkpOwotCXByaW50aygiICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAwOiBsZWZ0IGlucHV0ICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAwKSk7Ci0JcHJpbnRrKCIgIDB4MjA6IHN5bnRoIHJhdGUgbG93ICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjApKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAxOiByaWdodCBpbnB1dCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAxKSk7Ci0JcHJpbnRrKCIgIDB4MjE6IHN5bnRoIHJhdGUgaGlnaCA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAyOiBsZWZ0IEFVWDEgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSk7Ci0JcHJpbnRrKCIgIDB4MjI6IEFEQyBjbG9jayAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAzOiByaWdodCBBVVgxICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAzKSk7Ci0JcHJpbnRrKCIgIDB4MjM6IEFEQyBhbHQgcmF0ZSAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA0OiBsZWZ0IENEICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA0KSk7Ci0JcHJpbnRrKCIgIDB4MjQ6IEFEQyBwbGwgTSAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA1OiByaWdodCBDRCAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSk7Ci0JcHJpbnRrKCIgIDB4MjU6IEFEQyBwbGwgTiAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA2OiBsZWZ0IGxpbmUgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA2KSk7Ci0JcHJpbnRrKCIgIDB4MjY6IFN5bnRoIHBsbCBNICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA3OiByaWdodCBsaW5lICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA3KSk7Ci0JcHJpbnRrKCIgIDB4Mjc6IFN5bnRoIHBsbCBOICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjcpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA4OiBNSUMgICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSk7Ci0JcHJpbnRrKCIgIDB4Mjg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA5OiBHYW1lIHBvcnQgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA5KSk7Ci0JcHJpbnRrKCIgIDB4Mjk6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjkpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBhOiBsZWZ0IHN5bnRoICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBhKSk7Ci0JcHJpbnRrKCIgIDB4MmE6IE1QVTQwMSAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBiOiByaWdodCBzeW50aCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSk7Ci0JcHJpbnRrKCIgIDB4MmI6IGRyaXZlIGN0cmwgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBjOiBsZWZ0IEFVWDIgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBjKSk7Ci0JcHJpbnRrKCIgIDB4MmM6IFNSUyBzcGFjZSAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBkOiByaWdodCBBVVgyICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBkKSk7Ci0JcHJpbnRrKCIgIDB4MmQ6IFNSUyBjZW50ZXIgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBlOiBsZWZ0IGFuYWxvZyAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSk7Ci0JcHJpbnRrKCIgIDB4MmU6IHdhdmUgc291cmNlICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBmOiByaWdodCBhbmFsb2cgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBmKSk7Ci0JcHJpbnRrKCIgIDB4MmY6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEwOiBsZWZ0IFBDTSAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEwKSk7Ci0JcHJpbnRrKCIgIDB4MzA6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzApKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDExOiByaWdodCBQQ00gICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSk7Ci0JcHJpbnRrKCIgIDB4MzE6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEyOiBETUEgZGF0YSBmb3JtYXQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEyKSk7Ci0JcHJpbnRrKCIgIDB4MzI6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEzOiBQL0MgZW5hYmxlICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEzKSk7Ci0JcHJpbnRrKCIgIDB4MzM6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE0OiBVL0QgYnV0dG9uICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSk7Ci0JcHJpbnRrKCIgIDB4MzQ6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE1OiByZXZpc2lvbiAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE1KSk7Ci0JcHJpbnRrKCIgIDB4MzU6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE2OiBBREMgb3V0cHV0IGN0cmwgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE2KSk7Ci0JcHJpbnRrKCIgIDB4MzY6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSk7Ci0JcHJpbnRrKCIgIDB4Mzc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE4OiBETUEgQSB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE4KSk7Ci0JcHJpbnRrKCIgIDB4Mzg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzgpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE5OiBETUEgQSBsb3dlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE5KSk7Ci0JcHJpbnRrKCIgIDB4Mzk6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzkpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSk7Ci0JcHJpbnRrKCIgIDB4M2E6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFiKSk7Ci0JcHJpbnRrKCIgIDB4M2I6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2IpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFjOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFjKSk7Ci0JcHJpbnRrKCIgIDB4M2M6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2MpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFkOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSk7Ci0JcHJpbnRrKCIgIDB4M2Q6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFlOiBQQ00gcmF0ZSBsb3cgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFlKSk7Ci0JcHJpbnRrKCIgIDB4M2U6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2UpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFmOiBQQ00gcmF0ZSBoaWdoICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFmKSk7Ci0JcHJpbnRrKCIgIDB4M2Y6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2YpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSJTViBSRUdTOiAgICAgICAgICBJTkRFWCA9IDB4JTAyeCAgICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsCisJCWluYihTVl9SRUcoc29uaWMsIElOREVYKSksIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDA6IGxlZnQgaW5wdXQgICAgICA9IDB4JTAyeCAgICAweDIwOiBzeW50aCByYXRlIGxvdyAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAwKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjApKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDE6IHJpZ2h0IGlucHV0ICAgICA9IDB4JTAyeCAgICAweDIxOiBzeW50aCByYXRlIGhpZ2ggPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAxKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDI6IGxlZnQgQVVYMSAgICAgICA9IDB4JTAyeCAgICAweDIyOiBBREMgY2xvY2sgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDM6IHJpZ2h0IEFVWDEgICAgICA9IDB4JTAyeCAgICAweDIzOiBBREMgYWx0IHJhdGUgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAzKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDQ6IGxlZnQgQ0QgICAgICAgICA9IDB4JTAyeCAgICAweDI0OiBBREMgcGxsIE0gICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA0KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDU6IHJpZ2h0IENEICAgICAgICA9IDB4JTAyeCAgICAweDI1OiBBREMgcGxsIE4gICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDY6IGxlZnQgbGluZSAgICAgICA9IDB4JTAyeCAgICAweDI2OiBTeW50aCBwbGwgTSAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA2KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDc6IHJpZ2h0IGxpbmUgICAgICA9IDB4JTAyeCAgICAweDI3OiBTeW50aCBwbGwgTiAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA3KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjcpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDg6IE1JQyAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDI4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDk6IEdhbWUgcG9ydCAgICAgICA9IDB4JTAyeCAgICAweDI5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA5KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjkpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGE6IGxlZnQgc3ludGggICAgICA9IDB4JTAyeCAgICAweDJhOiBNUFU0MDEgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBhKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGI6IHJpZ2h0IHN5bnRoICAgICA9IDB4JTAyeCAgICAweDJiOiBkcml2ZSBjdHJsICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGM6IGxlZnQgQVVYMiAgICAgICA9IDB4JTAyeCAgICAweDJjOiBTUlMgc3BhY2UgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBjKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGQ6IHJpZ2h0IEFVWDIgICAgICA9IDB4JTAyeCAgICAweDJkOiBTUlMgY2VudGVyICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBkKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGU6IGxlZnQgYW5hbG9nICAgICA9IDB4JTAyeCAgICAweDJlOiB3YXZlIHNvdXJjZSAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGY6IHJpZ2h0IGFuYWxvZyAgICA9IDB4JTAyeCAgICAweDJmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBmKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTA6IGxlZnQgUENNICAgICAgICA9IDB4JTAyeCAgICAweDMwOiBhbmFsb2cgcG93ZXIgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEwKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzApKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTE6IHJpZ2h0IFBDTSAgICAgICA9IDB4JTAyeCAgICAweDMxOiBhbmFsb2cgcG93ZXIgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTI6IERNQSBkYXRhIGZvcm1hdCA9IDB4JTAyeCAgICAweDMyOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEyKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTM6IFAvQyBlbmFibGUgICAgICA9IDB4JTAyeCAgICAweDMzOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEzKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTQ6IFUvRCBidXR0b24gICAgICA9IDB4JTAyeCAgICAweDM0OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTU6IHJldmlzaW9uICAgICAgICA9IDB4JTAyeCAgICAweDM1OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE1KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTY6IEFEQyBvdXRwdXQgY3RybCA9IDB4JTAyeCAgICAweDM2OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE2KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDM3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTg6IERNQSBBIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDM4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE4KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzgpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTk6IERNQSBBIGxvd2VyIGNudCA9IDB4JTAyeCAgICAweDM5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE5KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzkpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWE6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDNhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWI6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDNiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFiKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2IpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWM6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDNjOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFjKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2MpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWQ6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDNkOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWU6IFBDTSByYXRlIGxvdyAgICA9IDB4JTAyeCAgICAweDNlOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFlKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2UpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWY6IFBDTSByYXRlIGhpZ2ggICA9IDB4JTAyeCAgICAweDNmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFmKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2YpKTsKIH0KIAogI2VuZGlmCkBAIC01MTEsOCArNTExLDEwIEBACiAJKnJlc19tID0gbTsKIAkqcmVzX24gPSBuOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAibWV0cmljID0gJWksIHhtID0gJWksIHhuID0gJWlcbiIsIG1ldHJpYywgeG0sIHhuKTsKLQlwcmludGsoS0VSTl9ERUJVRyAicGxsOiBtID0gMHgleCwgciA9IDB4JXgsIG4gPSAweCV4XG4iLCByZWcsIG0sIHIsIG4pOworCWRldl9kYmcoc29uaWMtPmNhcmQtPmRldiwKKwkJIm1ldHJpYyA9ICVpLCB4bSA9ICVpLCB4biA9ICVpXG4iLCBtZXRyaWMsIHhtLCB4bik7CisJZGV2X2RiZyhzb25pYy0+Y2FyZC0+ZGV2LAorCQkicGxsOiBtID0gMHgleCwgciA9IDB4JXgsIG4gPSAweCV4XG4iLCByZWcsIG0sIHIsIG4pOwogI2VuZGlmCiB9CiAKQEAgLTYyNCw3ICs2MjYsOCBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJaWYgKHN0YXR1cyA9PSAweGZmKSB7CS8qIGZhaWx1cmUgKi8KIAkJb3V0Yihzb25pYy0+aXJxbWFzayA9IH4wLCBTVl9SRUcoc29uaWMsIElSUU1BU0spKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSVJRIGZhaWx1cmUgLSBpbnRlcnJ1cHRzIGRpc2FibGVkISFcbiIpOworCQlkZXZfZXJyKHNvbmljLT5jYXJkLT5kZXYsCisJCQkiSVJRIGZhaWx1cmUgLSBpbnRlcnJ1cHRzIGRpc2FibGVkISFcbiIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCWlmIChzb25pYy0+cGNtKSB7CkBAIC0xMTk4LDcgKzEyMDEsOCBAQAogCiAJc29uaWMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgInNvbmljdmliZXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2Vycihzb25pYy0+Y2FyZC0+ZGV2LAorCQkJInNvbmljdmliZXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjY3LDcgKzEyNzEsOCBAQAogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjQgYml0cyAqLwogICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CiAgICAgICAgIH0KQEAgLTEyOTYsNyArMTMwMSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9zb25pY3ZpYmVzX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgc29uaWMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMzEwLDI0ICsxMzE1LDMyIEBACiAJaWYgKCFkbWFhKSB7CiAJCWRtYWEgPSBkbWFpbzsKIAkJZG1haW8gKz0gMHgxMDsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQSBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFhKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJICJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEEgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwKKwkJCSBkbWFhKTsKIAl9CiAJaWYgKCFkbWFjKSB7CiAJCWRtYWMgPSBkbWFpbzsKIAkJZG1haW8gKz0gMHgxMDsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQyBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFjKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJICJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEMgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwKKwkJCSBkbWFjKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsIGRtYWEpOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQ4LCBkbWFjKTsKIAogCWlmICgoc29uaWMtPnJlc19kbWFhID0gcmVxdWVzdF9yZWdpb24oZG1hYSwgMHgxMCwgIlMzIFNvbmljVmliZXMgRERNQS1BIikpID09IE5VTEwpIHsKIAkJc25kX3NvbmljdmliZXNfZnJlZShzb25pYyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIERETUEtQSBwb3J0IGF0IDB4JXgtMHgleFxuIiwgZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGdyYWIgRERNQS1BIHBvcnQgYXQgMHgleC0weCV4XG4iLAorCQkJZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKChzb25pYy0+cmVzX2RtYWMgPSByZXF1ZXN0X3JlZ2lvbihkbWFjLCAweDEwLCAiUzMgU29uaWNWaWJlcyBERE1BLUMiKSkgPT0gTlVMTCkgewogCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgRERNQS1DIHBvcnQgYXQgMHgleC0weCV4XG4iLCBkbWFjLCBkbWFjICsgMHgxMCAtIDEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJ1bmFibGUgdG8gZ3JhYiBERE1BLUMgcG9ydCBhdCAweCV4LTB4JXhcbiIsCisJCQlkbWFjLCBkbWFjICsgMHgxMCAtIDEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMTM5Miw4ICsxNDA1LDYgQEAKIAogCXNuZF9zb25pY3ZpYmVzX3Byb2NfaW5pdChzb25pYyk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcnNvbmljID0gc29uaWM7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDU5LDcgKzE0NzAsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAgCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZm9yIChpZHggPSAwOyBpZHggPCA1OyBpZHgrKykgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCmluZGV4IGIzYjU4OGIuLmQ4NTI0NTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKQEAgLTg5LDcgKzg5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKaW5kZXggZmIwZTE1OC4uMTI3MmMxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKQEAgLTY5LDQwICs2OSw0MCBAQAogewogCXVuc2lnbmVkIGludCB2YWwsIHRtcDsKIAotCXByaW50ayhLRVJOX0RFQlVHICJUcmlkZW50IHZvaWNlICVpOlxuIiwgdm9pY2UpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiVHJpZGVudCB2b2ljZSAlaTpcbiIsIHZvaWNlKTsKIAlvdXRiKHZvaWNlLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOwogCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9MQkEpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTEJBOiAweCV4XG4iLCB2YWwpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiTEJBOiAweCV4XG4iLCB2YWwpOwogCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9HVlNFTF9QQU5fVk9MX0NUUkxfRUMpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiR1ZTZWw6ICVpXG4iLCB2YWwgPj4gMzEpOwotCXByaW50ayhLRVJOX0RFQlVHICJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlZvbDogMHgleFxuIiwgKHZhbCA+PiAxNikgJiAweGZmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiQ1RSTDogMHgleFxuIiwgKHZhbCA+PiAxMikgJiAweDBmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJHVlNlbDogJWlcbiIsIHZhbCA+PiAzMSk7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJWb2w6IDB4JXhcbiIsICh2YWwgPj4gMTYpICYgMHhmZik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJDVFJMOiAweCV4XG4iLCAodmFsID4+IDEyKSAmIDB4MGYpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CiAJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9OWCkgewogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfQ1NPX0FMUEhBX0ZNUykpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ1NPOiAweCV4XG4iLCB2YWwgPj4gMTYpOwotCQlwcmludGsoIkFscGhhOiAweCV4XG4iLCAodmFsID4+IDQpICYgMHgwZmZmKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkZNUzogMHgleFxuIiwgdmFsICYgMHgwZik7CisJCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQ1NPOiAweCV4XG4iLCB2YWwgPj4gMTYpOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFscGhhOiAweCV4XG4iLCAodmFsID4+IDQpICYgMHgwZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJGTVM6IDB4JXhcbiIsIHZhbCAmIDB4MGYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfRVNPX0RFTFRBKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFU086IDB4JXhcbiIsIHZhbCA+PiAxNik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJEZWx0YTogMHgleFxuIiwgdmFsICYgMHhmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJFU086IDB4JXhcbiIsIHZhbCA+PiAxNik7CisJCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiRGVsdGE6IDB4JXhcbiIsIHZhbCAmIDB4ZmZmZik7CiAJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9EWF9GTUNfUlZPTF9DVk9MKSk7CiAJfSBlbHNlIHsJCS8vIFRSSURFTlRfREVWSUNFX0lEX05YCiAJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9OWF9ERUxUQV9DU08pKTsKIAkJdG1wID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ1NPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJDU086IDB4JXhcbiIsIHZhbCAmIDB4MDBmZmZmZmYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfRVNPKSk7CiAJCXRtcCB8PSAodmFsID4+IDE2KSAmIDB4ZmYwMDsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkRlbHRhOiAweCV4XG4iLCB0bXApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiRVNPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJEZWx0YTogMHgleFxuIiwgdG1wKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJFU086IDB4JXhcbiIsIHZhbCAmIDB4MDBmZmZmZmYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfQUxQSEFfRk1TX0ZNQ19SVk9MX0NWT0wpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkFscGhhOiAweCV4XG4iLCB2YWwgPj4gMjApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiRk1TOiAweCV4XG4iLCAodmFsID4+IDE2KSAmIDB4MGYpOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFscGhhOiAweCV4XG4iLCB2YWwgPj4gMjApOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkZNUzogMHgleFxuIiwgKHZhbCA+PiAxNikgJiAweDBmKTsKIAl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUlZvbDogMHgleFxuIiwgKHZhbCA+PiA3KSAmIDB4N2YpOwotCXByaW50ayhLRVJOX0RFQlVHICJDVm9sOiAweCV4XG4iLCB2YWwgJiAweDdmKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIlJWb2w6IDB4JXhcbiIsICh2YWwgPj4gNykgJiAweDdmKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkNWb2w6IDB4JXhcbiIsIHZhbCAmIDB4N2YpOwogfQogI2VuZGlmCiAKQEAgLTE1Niw3ICsxNTYsOCBAQAogCX0KIAogCWlmIChjb3VudCA9PSAwICYmICF0cmlkZW50LT5hYzk3X2RldGVjdCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhYzk3IGNvZGVjIHJlYWQgVElNRU9VVCBbMHgleC8weCV4XSEhIVxuIiwKKwkJZGV2X2Vycih0cmlkZW50LT5jYXJkLT5kZXYsCisJCQkiYWM5NyBjb2RlYyByZWFkIFRJTUVPVVQgWzB4JXgvMHgleF0hISFcbiIsCiAJCQkgICByZWcsIGRhdGEpOwogCQlkYXRhID0gMDsKIAl9CkBAIC00OTcsMTYgKzQ5OCwxNiBAQAogCW91dGwocmVnc1s0XSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAxNikpOwogCiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJ3cml0dGVuICVpIGNoYW5uZWw6XG4iLCB2b2ljZS0+bnVtYmVyKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICByZWdzWzBdID0gMHgleC8weCV4XG4iLAorCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAid3JpdHRlbiAlaSBjaGFubmVsOlxuIiwgdm9pY2UtPm51bWJlcik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbMF0gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbMF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDApKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiAgcmVnc1sxXSA9IDB4JXgvMHgleFxuIiwKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIiAgcmVnc1sxXSA9IDB4JXgvMHgleFxuIiwKIAkgICAgICAgcmVnc1sxXSwgaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX1NUQVJUICsgNCkpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICByZWdzWzJdID0gMHgleC8weCV4XG4iLAorCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiICByZWdzWzJdID0gMHgleC8weCV4XG4iLAogCSAgICAgICByZWdzWzJdLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyA4KSkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsCisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbM10sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDEyKSkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIHJlZ3NbNF0gPSAweCV4LzB4JXhcbiIsCisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbNF0gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbNF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDE2KSkpOwogI2VuZGlmCiB9CkBAIC01ODksNyArNTkwLDcgQEAKIAkJb3V0Yih2b2ljZS0+Vm9sID4+IDIsIFRSSURfUkVHKHRyaWRlbnQsIENIX0dWU0VMX1BBTl9WT0xfQ1RSTF9FQyArIDIpKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJ2b2ljZS0+Vm9sID0gMHgleFxuIiwgdm9pY2UtPlZvbCk7ICovCisJCS8qIGRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAidm9pY2UtPlZvbCA9IDB4JXhcbiIsIHZvaWNlLT5Wb2wpOyAqLwogCQlvdXR3KCh2b2ljZS0+Q1RSTCA8PCAxMikgfCB2b2ljZS0+Vm9sLAogCQkgICAgIFRSSURfUkVHKHRyaWRlbnQsIENIX0dWU0VMX1BBTl9WT0xfQ1RSTF9FQykpOwogCQlicmVhazsKQEAgLTMwMTMsMTMgKzMwMTQsMTUgQEAKIAkJX2FjOTcubnVtID0gMTsKIAkJZXJyID0gc25kX2FjOTdfbWl4ZXIodHJpZGVudC0+YWM5N19idXMsICZfYWM5NywgJnRyaWRlbnQtPmFjOTdfc2VjKTsKIAkJaWYgKGVyciA8IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTSTcwMTg6IHRoZSBzZWNvbmRhcnkgY29kZWMgLSBpbnZhbGlkIGFjY2Vzc1xuIik7CisJCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwKKwkJCQkiU0k3MDE4OiB0aGUgc2Vjb25kYXJ5IGNvZGVjIC0gaW52YWxpZCBhY2Nlc3NcbiIpOwogI2lmIDAJLy8gb25seSBmb3IgbXkgdGVzdGluZyBwdXJwb3NlIC0tamsKIAkJewogCQkJc3RydWN0IHNuZF9hYzk3ICptYzk3OwogCQkJZXJyID0gc25kX2FjOTdfbW9kZW0odHJpZGVudC0+Y2FyZCwgJl9hYzk3LCAmbWM5Nyk7CiAJCQlpZiAoZXJyIDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzbmRfYWM5N19tb2RlbSByZXR1cm5lZCBlcnJvciAlaVxuIiwgZXJyKTsKKwkJCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwKKwkJCQkJInNuZF9hYzk3X21vZGVtIHJldHVybmVkIGVycm9yICVpXG4iLCBlcnIpOwogCQl9CiAjZW5kaWYKIAl9CkBAIC0zMTk3LDcgKzMyMDAsOCBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzI3MCw3ICszMjc0LDggQEAKIAkJCWdvdG8gX19zaTcwMThfb2s7CiAJCWRvX2RlbGF5KHRyaWRlbnQpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyByZWFkeSBlcnJvciBbMHgleF1cbiIsIGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkpOworCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLAorCQlpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpKTsKIAlpZiAoci0tID4gMCkgewogCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKIAkJZG8gewpAQCAtMzM2Nyw3ICszMzcyLDcgQEAKIAogCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YSh0cmlkZW50LT5wY2kpLAogCQkJCTIgKiBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQsICZ0cmlkZW50LT50bGIuYnVmZmVyKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIFRMQiBidWZmZXJcbiIpOworCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBUTEIgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXRyaWRlbnQtPnRsYi5lbnRyaWVzID0gKHVuc2lnbmVkIGludCopQUxJR04oKHVuc2lnbmVkIGxvbmcpdHJpZGVudC0+dGxiLmJ1ZmZlci5hcmVhLCBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQpOwpAQCAtMzM3NSwxMyArMzM4MCwxNCBAQAogCS8qIGFsbG9jYXRlIHNoYWRvdyBUTEIgcGFnZSB0YWJsZSAodmlydHVhbCBhZGRyZXNzZXMpICovCiAJdHJpZGVudC0+dGxiLnNoYWRvd19lbnRyaWVzID0gdm1hbGxvYyhTTkRSVl9UUklERU5UX01BWF9QQUdFUypzaXplb2YodW5zaWduZWQgbG9uZykpOwogCWlmICh0cmlkZW50LT50bGIuc2hhZG93X2VudHJpZXMgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgc2hhZG93IFRMQiBlbnRyaWVzXG4iKTsKKwkJZGV2X2Vycih0cmlkZW50LT5jYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIHNoYWRvdyBUTEIgZW50cmllc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkvKiBhbGxvY2F0ZSBhbmQgc2V0dXAgc2lsZW50IHBhZ2UgYW5kIGluaXRpYWxpc2UgVExCIGVudHJpZXMgKi8KIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKIAkJCQlTTkRSVl9UUklERU5UX1BBR0VfU0laRSwgJnRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBzaWxlbnQgcGFnZVxuIik7CisJCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHNpbGVudCBwYWdlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbXNldCh0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYXJlYSwgMCwgU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpOwpAQCAtMzQzOSw3ICszNDQ1LDcgQEAKIAkJCWdvdG8gX19keF9vazsKIAkJZG9fZGVsYXkodHJpZGVudCk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKKwlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKIAlyZXR1cm4gLUVJTzsKIAogIF9fZHhfb2s6CkBAIC0zNDc3LDcgKzM0ODMsOCBAQAogCQkJZ290byBfX254X29rOwogCQlkb19kZWxheSh0cmlkZW50KTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkpOworCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLAorCQlpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkpOwogCXJldHVybiAtRUlPOwogCiAgX19ueF9vazoKQEAgLTM1NjIsNyArMzU2OSw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAzMCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzApKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMwKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMwYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzBiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0zNjAwLDcgKzM2MDgsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdHJpZGVudF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHRyaWRlbnQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdHJpZGVudF9mcmVlKHRyaWRlbnQpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTM2NjQsNyArMzY3Miw2IEBACiAJc25kX3RyaWRlbnRfZW5hYmxlX2Vzbyh0cmlkZW50KTsKIAogCXNuZF90cmlkZW50X3Byb2NfaW5pdCh0cmlkZW50KTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJKnJ0cmlkZW50ID0gdHJpZGVudDsKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NTAsOCArMzk1Nyw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCA1YWU2ZjA0Li45NWI5OGY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJZGV2X2VycigmcGNpLT5kZXYsICJ0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CkBAIC00NzQsOCArNDc0LDkgQEAKIAkJCX0gZWxzZQogCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAiCi0JCQkgICAgICAgIihyZXN0ICVkKVxuIiwgaWR4LCBvZnMsIHIsIHJlc3QpOworCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJInRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLAorCQkJCWlkeCwgb2ZzLCByLCByZXN0KTsKIAkJCSovCiAJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKIAkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOwpAQCAtNTI4LDcgKzUyOSw3IEBACiAJCWlmICghKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkpCiAJCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAogCQkgICBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTU4Nyw3ICs1ODgsOCBAQAogCXh2YWwgfD0gKHJlZyAmIDB4N2YpIDw8IFZJQV9SRUdfQUM5N19DTURfU0hJRlQ7CiAgICAgICAJd2hpbGUgKDEpIHsKICAgICAgIAkJaWYgKGFnYWluKysgPiAzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkOiBjb2RlYyAlaSBpcyBub3QgdmFsaWQgWzB4JXhdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQ6IGNvZGVjICVpIGlzIG5vdCB2YWxpZCBbMHgleF1cbiIsCiAJCQkJICAgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CiAJCSAgICAgIAlyZXR1cm4gMHhmZmZmOwogCQl9CkBAIC03NzcsNyArNzc5LDkgQEAKIAkoKHBvcykgPCB2aWFkZXYtPmxhc3Rwb3MgJiYgKChwb3MpID49IHZpYWRldi0+YnVmc2l6ZTIgfHxcCiAJCQkJICAgICB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHN0cnVjdCB2aWFkZXYgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfbGluZWFyX3BvcyhzdHJ1Y3QgdmlhODJ4eCAqY2hpcCwKKwkJCQkJICAgc3RydWN0IHZpYWRldiAqdmlhZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaWR4LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IHNpemUsIGJhc2UsIHJlczsKQEAgLTc5MCw3ICs3OTQsOCBAQAogCiAJLyogY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uICovCiAJaWYgKHNpemUgPCBjb3VudCkgewotCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKHNpemUgPSAlZCwgY291bnQgPSAlZClcbiIsCiAJCQkgICAoaW50KXNpemUsIChpbnQpY291bnQpOwogCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CiAJfSBlbHNlIHsKQEAgLTgwNyw5ICs4MTIsOSBAQAogCQl9CiAJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKICNpZmRlZiBQT0lOVEVSX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiZmFpbDogaWR4ID0gJWkvJWksIGxhc3Rwb3MgPSAweCV4LCAiCi0JCQkgICAgICAgImJ1ZnNpemUyID0gMHgleCwgb2Zmc2l6ZSA9IDB4JXgsIHNpemUgPSAweCV4LCAiCi0JCQkgICAgICAgImNvdW50ID0gMHgleFxuIiwgaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLAorCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgYnVmc2l6ZTIgPSAweCV4LCBvZmZzaXplID0gMHgleCwgc2l6ZSA9IDB4JXgsIGNvdW50ID0gMHgleFxuIiwKKwkJCQlpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMsCiAJCQkgICAgICAgdmlhZGV2LT5sYXN0cG9zLCB2aWFkZXYtPmJ1ZnNpemUyLAogCQkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0LAogCQkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZSwgY291bnQpOwpAQCAtODE3LDggKzgyMiw4IEBACiAJCQkvKiBjb3VudCByZWdpc3RlciByZXR1cm5zIGZ1bGwgc2l6ZSB3aGVuIGVuZCBvZiBidWZmZXIgaXMgcmVhY2hlZCAqLwogCQkJcmVzID0gYmFzZSArIHNpemU7CiAJCQlpZiAoY2hlY2tfaW52YWxpZF9wb3ModmlhZGV2LCByZXMpKSB7Ci0JCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKDIpLCAiCi0JCQkJCSAgICJ1c2luZyBsYXN0IHZhbGlkIHBvaW50ZXJcbiIpOworCQkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKDIpLCB1c2luZyBsYXN0IHZhbGlkIHBvaW50ZXJcbiIpOwogCQkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAkJCX0KIAkJfQpAQCAtODUwLDcgKzg1NSw3IEBACiAJCWlkeCA9IDA7CiAJZWxzZSAvKiBDVVJSX1BUUiBob2xkcyB0aGUgYWRkcmVzcyArIDggKi8KIAkJaWR4ID0gKChwdHIgLSAodW5zaWduZWQgaW50KXZpYWRldi0+dGFibGUuYWRkcikgLyA4IC0gMSkgJSB2aWFkZXYtPnRibF9lbnRyaWVzOwotCXJlcyA9IGNhbGNfbGluZWFyX3Bvcyh2aWFkZXYsIGlkeCwgY291bnQpOworCXJlcyA9IGNhbGNfbGluZWFyX3BvcyhjaGlwLCB2aWFkZXYsIGlkeCwgY291bnQpOwogCXZpYWRldi0+bGFzdHBvcyA9IHJlczsgLyogcmVtZW1iZXIgdGhlIGxhc3QgcG9zaXRpb24gKi8KIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCkBAIC04ODksMTMgKzg5NCwxNCBAQAogCQlpZHggPSBjb3VudCA+PiAyNDsKIAkJaWYgKGlkeCA+PSB2aWFkZXYtPnRibF9lbnRyaWVzKSB7CiAjaWZkZWYgUE9JTlRFUl9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGludmFsaWQgaWR4ID0gJWkvJWlcbiIsIGlkeCwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJmYWlsOiBpbnZhbGlkIGlkeCA9ICVpLyVpXG4iLCBpZHgsCiAJCQkgICAgICAgdmlhZGV2LT50YmxfZW50cmllcyk7CiAjZW5kaWYKIAkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAkJfSBlbHNlIHsKIAkJCWNvdW50ICY9IDB4ZmZmZmZmOwotCQkJcmVzID0gY2FsY19saW5lYXJfcG9zKHZpYWRldiwgaWR4LCBjb3VudCk7CisJCQlyZXMgPSBjYWxjX2xpbmVhcl9wb3MoY2hpcCwgdmlhZGV2LCBpZHgsIGNvdW50KTsKIAkJfQogCX0gZWxzZSB7CiAJCXJlcyA9IHZpYWRldi0+aHdwdHJfZG9uZTsKQEAgLTE5NDAsMTQgKzE5NDYsMTUgQEAKIAogCXIgPSByZXF1ZXN0X3JlZ2lvbihKT1lTVElDS19BRERSLCA4LCAiVklBNjg2IGdhbWVwb3J0Iik7CiAJaWYgKCFyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInZpYTgyeHg6IGNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnQgJSN4XG4iLAorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0ICUjeFxuIiwKIAkJICAgICAgIEpPWVNUSUNLX0FERFIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMDE2LDcgKzIwMjMsOCBAQAogCQlzdHJjcHkoc2lkLm5hbWUsICJQQ00gUGxheWJhY2sgVm9sdW1lIik7CiAJCXNpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOwogCQlpZiAoISBzbmRfY3RsX2ZpbmRfaWQoY2hpcC0+Y2FyZCwgJnNpZCkpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJVc2luZyBEWFMgYXMgUENNIFBsYXliYWNrXG4iKTsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlVzaW5nIERYUyBhcyBQQ00gUGxheWJhY2tcbiIpOwogCQkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdmlhODIzM19wY21keHNfdm9sdW1lX2NvbnRyb2wsIGNoaXApKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CkBAIC0yMTAyLDggKzIxMTAsOSBAQAogCQkJCQltcHVfcG9ydCwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CiAJCQkJCU1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwKIAkJCQkJJmNoaXAtPnJtaWRpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEiCi0JCQkgICAgICAgIiBhdCAweCVseCwgc2tpcHBpbmdcbiIsIG1wdV9wb3J0KTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEgYXQgMHglbHgsIHNraXBwaW5nXG4iLAorCQkJCSBtcHVfcG9ydCk7CiAJCQlsZWdhY3kgJj0gflZJQV9GVU5DX0VOQUJMRV9NSURJOwogCQl9IGVsc2UgewogCQkJbGVnYWN5ICY9IH5WSUFfRlVOQ19NSURJX0lSUU1BU0s7CS8qIGVuYWJsZSBNSURJIGludGVycnVwdCAqLwpAQCAtMjIwMyw3ICsyMjEyLDggQEAKIAl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOwogCiAJaWYgKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKIAogI2lmIDAgLyogRklYTUU6IHdlIGRvbid0IHN1cHBvcnQgdGhlIHNlY29uZCBjb2RlYyB5ZXQgc28gc2tpcCB0aGUgZGV0ZWN0aW9uIG5vdy4uICovCiAJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKQEAgLTIzMDMsOCArMjMxMyw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNDE3LDcgKzI0MjYsNyBAQAogCQkJc25kX3ZpYTgyMzNfaW50ZXJydXB0IDoJc25kX3ZpYTY4Nl9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX3ZpYTgyeHhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNDQxLDggKzI0NTAsNiBAQAogCSAqIFdlIGNhbGwgcGNpX3NldF9tYXN0ZXIgaGVyZSBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQuICovCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX3ZpYSA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTE2LDcgKzI1MjMsNyBAQAogCiAJdyA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgZHhzX3doaXRlbGlzdCk7CiAJaWYgKHcpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJ2aWE4Mnh4OiBEWFMgd2hpdGUgbGlzdCBmb3IgJXMgZm91bmRcbiIsCisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiRFhTIHdoaXRlIGxpc3QgZm9yICVzIGZvdW5kXG4iLAogCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZSh3KSk7CiAJCXJldHVybiB3LT52YWx1ZTsKIAl9CkBAIC0yNTI4LDEwICsyNTM1LDEwIEBACiAJLyoKIAkgKiBub3QgZGV0ZWN0ZWQsIHRyeSA0OGsgcmF0ZSBvbmx5IHRvIGJlIHN1cmUuCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyAidmlhODJ4eDogQXNzdW1pbmcgRFhTIGNoYW5uZWxzIHdpdGggNDhrIGZpeGVkIHNhbXBsZSByYXRlLlxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgUGxlYXNlIHRyeSBkeHNfc3VwcG9ydD01IG9wdGlvblxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgYW5kIHJlcG9ydCBpZiBpdCB3b3JrcyBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWFkIEFMU0EtQ29uZmlndXJhdGlvbi50eHQuXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICJBc3N1bWluZyBEWFMgY2hhbm5lbHMgd2l0aCA0OGsgZml4ZWQgc2FtcGxlIHJhdGUuXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICIgICAgICAgICBQbGVhc2UgdHJ5IGR4c19zdXBwb3J0PTUgb3B0aW9uXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICIgICAgICAgICBhbmQgcmVwb3J0IGlmIGl0IHdvcmtzIG9uIHlvdXIgbWFjaGluZS5cbiIpOworCWRldl9pbmZvKCZwY2ktPmRldiwgIiAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlYWQgQUxTQS1Db25maWd1cmF0aW9uLnR4dC5cbiIpOwogCXJldHVybiBWSUFfRFhTXzQ4SzsKIH07CiAKQEAgLTI1NDQsNyArMjU1MSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNTg0LDcgKzI1OTEsNyBAQAogCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlZJQTgyMzMiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjYXJkIHR5cGUgJWRcbiIsIGNhcmRfdHlwZSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiaW52YWxpZCBjYXJkIHR5cGUgJWRcbiIsIGNhcmRfdHlwZSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCBjYTE5MDI4Li40NmEwNTI2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJZGV2X2VycigmcGNpLT5kZXYsICJ0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CkBAIC0zMjksOCArMzI5LDkgQEAKIAkJCX0gZWxzZQogCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAiCi0JCQkgICAgICAgIihyZXN0ICVkKVxuIiwgaWR4LCBvZnMsIHIsIHJlc3QpOworCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJInRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLAorCQkJCWlkeCwgb2ZzLCByLCByZXN0KTsKIAkJCSovCiAJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKIAkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOwpAQCAtMzgyLDcgKzM4Myw3IEBACiAJCWlmICghKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkpCiAJCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAogCQkgICBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTQ0Myw3ICs0NDQsOCBAQAogCXh2YWwgfD0gKHJlZyAmIDB4N2YpIDw8IFZJQV9SRUdfQUM5N19DTURfU0hJRlQ7CiAgICAgICAJd2hpbGUgKDEpIHsKICAgICAgIAkJaWYgKGFnYWluKysgPiAzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkOiBjb2RlYyAlaSBpcyBub3QgdmFsaWQgWzB4JXhdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQ6IGNvZGVjICVpIGlzIG5vdCB2YWxpZCBbMHgleF1cbiIsCiAJCQkJICAgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CiAJCSAgICAgIAlyZXR1cm4gMHhmZmZmOwogCQl9CkBAIC01NjAsNyArNTYyLDkgQEAKIAkoKHBvcykgPCB2aWFkZXYtPmxhc3Rwb3MgJiYgKChwb3MpID49IHZpYWRldi0+YnVmc2l6ZTIgfHxcCiAJCQkJICAgICB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHN0cnVjdCB2aWFkZXYgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfbGluZWFyX3BvcyhzdHJ1Y3QgdmlhODJ4eF9tb2RlbSAqY2hpcCwKKwkJCQkJICAgc3RydWN0IHZpYWRldiAqdmlhZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaWR4LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IHNpemUsIHJlczsKQEAgLTU3MCwyMCArNTc0LDIxIEBACiAKIAkvKiBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gKi8KIAlpZiAoc2l6ZSA8IGNvdW50KSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyIChzaXplID0gJWQsIGNvdW50ID0gJWQpXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwKIAkJCSAgIChpbnQpc2l6ZSwgKGludCljb3VudCk7CiAJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAl9IGVsc2UgaWYgKGNoZWNrX2ludmFsaWRfcG9zKHZpYWRldiwgcmVzKSkgewogI2lmZGVmIFBPSU5URVJfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgIgotCQkgICAgICAgImJ1ZnNpemUyID0gMHgleCwgb2Zmc2l6ZSA9IDB4JXgsIHNpemUgPSAweCV4LCAiCi0JCSAgICAgICAiY291bnQgPSAweCV4XG4iLCBpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMsIHZpYWRldi0+bGFzdHBvcywKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZmFpbDogaWR4ID0gJWkvJWksIGxhc3Rwb3MgPSAweCV4LCBidWZzaXplMiA9IDB4JXgsIG9mZnNpemUgPSAweCV4LCBzaXplID0gMHgleCwgY291bnQgPSAweCV4XG4iLAorCQkJaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLCB2aWFkZXYtPmxhc3Rwb3MsCiAJCSAgICAgICB2aWFkZXYtPmJ1ZnNpemUyLCB2aWFkZXYtPmlkeF90YWJsZVtpZHhdLm9mZnNldCwKIAkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZSwgY291bnQpOwogI2VuZGlmCiAJCWlmIChjb3VudCAmJiBzaXplIDwgY291bnQpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyLCAiCi0JCQkJICAgInVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIsIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CiAJCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CiAJCX0gZWxzZSB7CiAJCQlpZiAoISBjb3VudCkKQEAgLTU5NSw4ICs2MDAsOCBAQAogCQkJCSAqLwogCQkJCXJlcyA9IHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ICsgc2l6ZTsKIAkJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKLQkJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksICIKLQkJCQkJICAgInVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CiAJCQkJcmVzID0gdmlhZGV2LT5sYXN0cG9zOwogCQkJfQogCQl9CkBAIC02MzIsNyArNjM3LDcgQEAKIAllbHNlIC8qIENVUlJfUFRSIGhvbGRzIHRoZSBhZGRyZXNzICsgOCAqLwogCQlpZHggPSAoKHB0ciAtICh1bnNpZ25lZCBpbnQpdmlhZGV2LT50YWJsZS5hZGRyKSAvIDggLSAxKSAlCiAJCQl2aWFkZXYtPnRibF9lbnRyaWVzOwotCXJlcyA9IGNhbGNfbGluZWFyX3Bvcyh2aWFkZXYsIGlkeCwgY291bnQpOworCXJlcyA9IGNhbGNfbGluZWFyX3BvcyhjaGlwLCB2aWFkZXYsIGlkeCwgY291bnQpOwogCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcmVzKTsKQEAgLTk5MSw3ICs5OTYsOCBAQAogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAKIAlpZiAoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19CVVNZKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOwogCiAJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKIAkJCQkgVklBX1JFR19BQzk3X1NFQ09OREFSWV9WQUxJRCB8CkBAIC0xMDU0LDggKzEwNjAsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidmlhODJ4eC1tb2RlbTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTEzNyw3ICsxMTQyLDcgQEAKIAljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdmlhODJ4eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdmlhODJ4eF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTExNjEsOCArMTE2Niw2IEBACiAJICogV2UgY2FsbCBwY2lfc2V0X21hc3RlciBoZXJlIGJlY2F1c2UgaXQgZG9lcyBub3QgaHVydC4gKi8KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfdmlhID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNzcsNyArMTE4MCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMTg4LDcgKzExOTEsNyBAQAogCQlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlZJQSA4MlhYIG1vZGVtIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwppbmRleCBhYjhhOWIxLi5mZjkwNzRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdngyMjIvdngyMjIuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92eF9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF92eDIyMl9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE4MSw4ICsxODEsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IHZ4OwogCXJldHVybiAwOwogfQpAQCAtMjA0LDcgKzIwMiw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMjksNyArMjI4LDcgQEAKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCAmIDB4JWx4LCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIHZ4LT5wb3J0WzBdLCB2eC0+cG9ydFsxXSwgdngtPmNvcmUuaXJxKTsKLQlzbmRfcHJpbnRkZCgiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpXG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpXG4iLAogCQkgICAgY2FyZC0+c2hvcnRuYW1lLCB2eC0+cG9ydFswXSwgdngtPnBvcnRbMV0sIHZ4LT5jb3JlLmlycSk7CiAKICNpZmRlZiBTTkRfVlhfRldfTE9BREVSCkBAIC0yODAsOCArMjc5LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4MjIyOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKaW5kZXggYTY5ZTc3NC4uMmQxNTcwMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCisrKyBiL3NvdW5kL3BjaS92eDIyMi92eDIyMl9vcHMuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiB7CiAJb3V0Yih2YWwsIHZ4Ml9yZWdfYWRkcihjaGlwLCBvZmZzZXQpKTsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvdXRiOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvdXRiOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CiAJKi8KIH0KIApAQCAtMTI5LDcgKzEyOSw3IEBACiBzdGF0aWMgdm9pZCB2eDJfb3V0bChzdHJ1Y3QgdnhfY29yZSAqY2hpcCwgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCkKIHsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CiAJKi8KIAlvdXRsKHZhbCwgdngyX3JlZ19hZGRyKGNoaXAsIG9mZnNldCkpOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiAJc3RydWN0IHNuZF92eDIyMiAqY2hpcCA9IChzdHJ1Y3Qgc25kX3Z4MjIyICopX2NoaXA7CiAJdW5zaWduZWQgaW50IGRhdGE7CiAKLQlzbmRfcHJpbnRkZCgidGVzdGluZyB4aWxpbnguLi5cbiIpOworCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgInRlc3RpbmcgeGlsaW54Li4uXG4iKTsKIAkvKiBUaGlzIHRlc3QgdXNlcyBzZXZlcmFsIHdyaXRlL3JlYWQgc2VxdWVuY2VzIG9uIFRFU1QwIGFuZCBURVNUMSBiaXRzCiAJICogdG8gZmlndXJlIG91dCB3aGV2ZXIgb3Igbm90IHRoZSB4aWxpbnggd2FzIGNvcnJlY3RseSBsb2FkZWQKIAkgKi8KQEAgLTE4Myw3ICsxODMsNyBAQAogCXZ4X2lubChjaGlwLCBJU1IpOwogCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAlpZiAoKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QwX01BU0spID09IFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykgewotCQlzbmRfcHJpbnRkZCgiYmFkIVxuIik7CisJCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgImJhZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXZ4X2lubChjaGlwLCBJU1IpOwogCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAlpZiAoISAoZGF0YSAmIFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykpIHsKLQkJc25kX3ByaW50ZGQoImJhZCEgIzJcbiIpOworCQlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJiYWQhICMyXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJdnhfaW5sKGNoaXAsIElTUik7CiAJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAkJaWYgKChkYXRhICYgVlhfU1RBVFVTX1ZBTF9URVNUMV9NQVNLKSA9PSBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spIHsKLQkJCXNuZF9wcmludGRkKCJiYWQhICMzXG4iKTsKKwkJCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgImJhZCEgIzNcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApAQCAtMjEyLDExICsyMTIsMTEgQEAKIAkJdnhfaW5sKGNoaXAsIElTUik7CiAJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAkJaWYgKCEgKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spKSB7Ci0JCQlzbmRfcHJpbnRkZCgiYmFkISAjNFxuIik7CisJCQlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJiYWQhICM0XG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQotCXNuZF9wcmludGRkKCJvaywgeGlsaW54IGZpbmUuXG4iKTsKKwlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJvaywgeGlsaW54IGZpbmUuXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk3LDcgKzM5Nyw4IEBACiAJCWkgPSB2eF9pbmwoY2hpcCwgR1BJT0MpOwogCQlpZiAoaSAmIDB4MDEwMCkKIAkJCXJldHVybiAwOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2eDIyMjogeGlsaW54IHRlc3QgZmFpbGVkIGFmdGVyIGxvYWQsIEdQSU9DPTB4JXhcbiIsIGkpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ4aWxpbnggdGVzdCBmYWlsZWQgYWZ0ZXIgbG9hZCwgR1BJT0M9MHgleFxuIiwgaSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKaW5kZXggZTg5MzJiMi4uODJlZWQxNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCkBAIC0xMDYsNyArMTA2LDggQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoIXIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogbm8gZ2FtZXBvcnQgcG9ydHMgYXZhaWxhYmxlXG4iKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJIm5vIGdhbWVwb3J0IHBvcnRzIGF2YWlsYWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAkJfQpAQCAtMTE2LDE5ICsxMTcsMjIgQEAKIAkJY2FzZSAweDIwNDogbGVnYWN5X2N0cmwyIHw9IDIgPDwgNjsgYnJlYWs7CiAJCWNhc2UgMHgyMDU6IGxlZ2FjeV9jdHJsMiB8PSAzIDw8IDY7IGJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IGludmFsaWQgam95c3RpY2sgcG9ydCAlI3giLCBpb19wb3J0KTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4IiwgaW9fcG9ydCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAogCWlmICghciAmJiAhKHIgPSByZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCAxLCAiWU1GUENJIGdhbWVwb3J0IikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBqb3lzdGljayBwb3J0ICUjeCBpcyBpbiB1c2UuXG4iLCBpb19wb3J0KTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiam95c3RpY2sgcG9ydCAlI3ggaXMgaW4gdXNlLlxuIiwgaW9fcG9ydCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTg3LDcgKzE5MSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zMTMsNyArMzE4LDkgQEAKIAkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJhd21pZGkpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgTVBVNDAxIGF0IDB4JWx4LCBza2lwcGluZy4uLlxuIiwgbXB1X3BvcnRbZGV2XSk7CisJCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkJICJjYW5ub3QgaW5pdGlhbGl6ZSBNUFU0MDEgYXQgMHglbHgsIHNraXBwaW5nLi4uXG4iLAorCQkJCSBtcHVfcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX01JRU47IC8qIGRpc2FibGUgTVBVNDAxIGlycSAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOwogCQl9CkBAIC0zMjMsMTIgKzMzMCwxNCBAQAogCQkJCQkgICBmbV9wb3J0W2Rldl0sCiAJCQkJCSAgIGZtX3BvcnRbZGV2XSArIDIsCiAJCQkJCSAgIE9QTDNfSFdfT1BMMywgMSwgJm9wbDMpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgRk0gT1BMMyBhdCAweCVseCwgc2tpcHBpbmcuLi5cbiIsIGZtX3BvcnRbZGV2XSk7CisJCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkJICJjYW5ub3QgaW5pdGlhbGl6ZSBGTSBPUEwzIGF0IDB4JWx4LCBza2lwcGluZy4uLlxuIiwKKwkJCQkgZm1fcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX0ZNRU47CiAJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCBQQ0lSX0RTWEdfTEVHQUNZLCBsZWdhY3lfY3RybCk7CiAJCX0gZWxzZSBpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBvcGwzIGh3ZGVwXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBvcGwzIGh3ZGVwXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggZDU5MWMxNS4uODFjOTE2YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtODYsNyArODYsOSBAQAogCQkJcmV0dXJuIDA7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjICVpIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsIHNlY29uZGFyeSwgc25kX3ltZnBjaV9yZWFkdyhjaGlwLCByZWcpKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCQlzZWNvbmRhcnksIHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgcmVnKSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtMzE5LDcgKzMyMSw3IEBACiAJCXlwY20tPmxhc3RfcG9zID0gcG9zOwogCQlpZiAoeXBjbS0+cGVyaW9kX3BvcyA+PSB5cGNtLT5wZXJpb2Rfc2l6ZSkgewogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICAgICAiZG9uZSAtIGFjdGl2ZV9iYW5rID0gMHgleCwgc3RhcnQgPSAweCV4XG4iLAogCQkJICAgICAgIGNoaXAtPmFjdGl2ZV9iYW5rLAogCQkJICAgICAgIHZvaWNlLT5iYW5rW2NoaXAtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CkBAIC0zNzIsNyArMzc0LDcgQEAKIAkJaWYgKHlwY20tPnBlcmlvZF9wb3MgPj0geXBjbS0+cGVyaW9kX3NpemUpIHsKIAkJCXlwY20tPnBlcmlvZF9wb3MgJT0geXBjbS0+cGVyaW9kX3NpemU7CiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgICAgICJkb25lIC0gYWN0aXZlX2JhbmsgPSAweCV4LCBzdGFydCA9IDB4JXhcbiIsCiAJCQkgICAgICAgY2hpcC0+YWN0aXZlX2JhbmssCiAJCQkgICAgICAgdm9pY2UtPmJhbmtbY2hpcC0+YWN0aXZlX2JhbmtdLnN0YXJ0KTsKQEAgLTIwNjcsNyArMjA2OSw4IEBACiAJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKIAlpZiAoZXJyID49IDApIHsKIAkJaWYgKGNoaXAtPmRzcF9taWNyb2NvZGUtPnNpemUgIT0gWURTWEdfRFNQTEVOR1RIKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJEU1AgbWljcm9jb2RlIGhhcyB3cm9uZyBzaXplXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJEU1AgbWljcm9jb2RlIGhhcyB3cm9uZyBzaXplXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMDgyLDggKzIwODUsOCBAQAogCQkJICAgICAgICZjaGlwLT5wY2ktPmRldik7CiAJaWYgKGVyciA+PSAwKSB7CiAJCWlmIChjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZS0+c2l6ZSAhPSBZRFNYR19DVFJMTEVOR1RIKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb250cm9sbGVyIG1pY3JvY29kZSIKLQkJCQkgICAiIGhhcyB3cm9uZyBzaXplXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb250cm9sbGVyIG1pY3JvY29kZSBoYXMgd3Jvbmcgc2l6ZVxuIik7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjM2MCw4ICsyMzYzLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjQzMywxMyArMjQzNSwxNSBAQAogCWNoaXAtPnNyYzQ0MV91c2VkID0gLTE7CiAKIAlpZiAoKGNoaXAtPnJlc19yZWdfYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5yZWdfYXJlYV9waHlzLCAweDgwMDAsICJZTUZQQ0kiKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBjaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byBncmFiIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCQljaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfeW1mcGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNDUzLDcgKzI0NTcsNyBAQAogCiAJZXJyID0gc25kX3ltZnBjaV9yZXF1ZXN0X2Zpcm13YXJlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmaXJtd2FyZSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsIGVycik7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNDg3LDggKzI0OTEsNiBAQAogCiAJc25kX3ltZnBjaV9wcm9jX2luaXQoY2FyZCwgY2hpcCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggOGY0ODlkZS4uNTZiZGExMiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0xMTIsNyArMTEyLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIGRpc2FibGVkIGV4cGxpY2l0bHkgKi8KIAogCS8qIG9rLCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmxpbmstPmRldiwgaW5kZXhbaV0sIGlkW2ldLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwZGFjZjogY2Fubm90IGNyZWF0ZSBhIGNhcmQgaW5zdGFuY2VcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTMxLDggKzEzMiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmbGluay0+ZGV2KTsKLQogCXBkYWNmLT5pbmRleCA9IGk7CiAJY2FyZF9saXN0W2ldID0gY2FyZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBkNGRiN2VjLi43ODZlN2UxIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMjM4LDcgKzIzOCw2IEBACiAJCWdvdG8gZmFpbGVkOwogCiAJY2hpcC0+ZGV2ID0gJmxpbmstPmRldjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsIGNoaXAtPmRldik7CiAKIAlpZiAoc25kX3Z4cG9ja2V0X2Fzc2lnbl9yZXNvdXJjZXMoY2hpcCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LAogCQkJCQkJbGluay0+aXJxKSA8IDApCkBAIC0zMDcsNyArMzA2LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIGRpc2FibGVkIGV4cGxpY2l0bHkgKi8KIAogCS8qIG9rLCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBfZGV2LT5kZXYsIGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidnhwb2NrZXQ6IGNhbm5vdCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlXG4iKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKaW5kZXggOGFiYjUyMS4uMzUwYTdjOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jCisrKyBiL3NvdW5kL3BwYy9wb3dlcm1hYy5jCkBAIC01OCw3ICs1OCw3IEBACiAJY2hhciAqbmFtZV9leHQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMjIsOCArMTIyLDYgQEAKIAlpZiAoZW5hYmxlX2JlZXApCiAJCXNuZF9wbWFjX2F0dGFjaF9iZWVwKGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOwotCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQogCQlnb3RvIF9fZXJyb3I7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IGViYjc2ZjIuLjU4ZjI5MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtOTg0LDcgKzk4NCw4IEBACiAJfQogCiAJLyogY3JlYXRlIGNhcmQgaW5zdGFuY2UgKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJnRoZV9jYXJkLmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmZGV2LT5jb3JlLCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJnRoZV9jYXJkLmNhcmQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGNsZWFuX2lycTsKIApAQCAtMTA1Miw3ICsxMDUzLDYgQEAKIAlzbmRfcHMzX2luaXRfYXZzZXR0aW5nKCZ0aGVfY2FyZCk7CiAKIAkvKiByZWdpc3RlciB0aGUgY2FyZCAqLwotCXNuZF9jYXJkX3NldF9kZXYodGhlX2NhcmQuY2FyZCwgJmRldi0+Y29yZSk7CiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIodGhlX2NhcmQuY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gY2xlYW5fZG1hX21hcDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NoL2FpY2EuYyBiL3NvdW5kL3NoL2FpY2EuYwppbmRleCA3OGEzNjk3Li40Nzg0OWVhIDEwMDY0NAotLS0gYS9zb3VuZC9zaC9haWNhLmMKKysrIGIvc291bmQvc2gvYWljYS5jCkBAIC02MDgsOCArNjA4LDggQEAKIAlkcmVhbWNhc3RjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FpY2EpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWRyZWFtY2FzdGNhcmQpKQogCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIFNORF9BSUNBX0RSSVZFUiwgVEhJU19NT0RVTEUsIDAsCi0JCQkgICAgICAmZHJlYW1jYXN0Y2FyZC0+Y2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXgsIFNORF9BSUNBX0RSSVZFUiwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmZHJlYW1jYXN0Y2FyZC0+Y2FyZCk7CiAJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CiAJCWtmcmVlKGRyZWFtY2FzdGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjI0LDcgKzYyNCw2IEBACiAJZXJyID0gc25kX2FpY2FwY21jaGlwKGRyZWFtY2FzdGNhcmQsIDApOwogCWlmICh1bmxpa2VseShlcnIgPCAwKSkKIAkJZ290byBmcmVlZHJlYW1jYXN0OwotCXNuZF9jYXJkX3NldF9kZXYoZHJlYW1jYXN0Y2FyZC0+Y2FyZCwgJmRldnB0ci0+ZGV2KTsKIAlkcmVhbWNhc3RjYXJkLT50aW1lci5kYXRhID0gMDsKIAlkcmVhbWNhc3RjYXJkLT5jaGFubmVsID0gTlVMTDsKIAkvKiBBZGQgYmFzaWMgY29udHJvbHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKaW5kZXggN2M5NDIyYy4uZDFmYjc0ZCAxMDA2NDQKLS0tIGEvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKKysrIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldnB0ci0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZFxuIik7CiAJCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL0tjb25maWcgYi9zb3VuZC9zb2MvS2NvbmZpZwppbmRleCBkNjJjZTQ4Li4wMDYwYjMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvS2NvbmZpZwpAQCAtNTAsNiArNTAsNyBAQAogc291cmNlICJzb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvczYwMDAvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3NoL0tjb25maWciCitzb3VyY2UgInNvdW5kL3NvYy9zaXJmL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zcGVhci9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvdGVncmEvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3R4eDkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9NYWtlZmlsZQppbmRleCA2MmExODIyZTcuLjVmMWRmMDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBzYW1zdW5nLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHM2MDAwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNoLworb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNpcmYvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gc3BlYXIvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdGVncmEvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdHh4OS8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9LY29uZmlnIGIvc291bmQvc29jL2F0bWVsL0tjb25maWcKaW5kZXggZTYzNGViNy4uNDc4OTYxOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2F0bWVsL0tjb25maWcKQEAgLTU4LDYgKzU4LDYgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBBVE1FTF9TU0MgJiYgQVJDSF9BVDkxICYmIE1BQ0hfQUZFQjkyNjAgJiYgU05EX0FUTUVMX1NPQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1BEQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1NTQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHNvdW5kIG9uIEFGRUI5MjYwIGJvYXJkLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKaW5kZXggMWVhZDNjOS4uZGU0MzNjZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwpAQCAtMzQxLDYgKzM0MSw3IEBACiB7CiAJaW50IGlkID0gZGFpLT5pZDsKIAlzdHJ1Y3QgYXRtZWxfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW2lkXTsKKwlzdHJ1Y3Qgc3NjX2RldmljZSAqc3NjID0gc3NjX3AtPnNzYzsKIAlzdHJ1Y3QgYXRtZWxfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CiAJaW50IGRpciwgY2hhbm5lbHMsIGJpdHM7CiAJdTMyIHRmbXIsIHJmbXIsIHRjbXIsIHJjbXI7CkBAIC00NjYsNyArNDY3LDggQEAKIAkJCXwgU1NDX0JGKFJDTVJfU1RBUlQsIHN0YXJ0X2V2ZW50KQogCQkJfCBTU0NfQkYoUkNNUl9DS0ksIFNTQ19DS0lfUklTSU5HKQogCQkJfCBTU0NfQkYoUkNNUl9DS08sIFNTQ19DS09fTk9ORSkKLQkJCXwgU1NDX0JGKFJDTVJfQ0tTLCBTU0NfQ0tTX0NMT0NLKTsKKwkJCXwgU1NDX0JGKFJDTVJfQ0tTLCBzc2MtPmNsa19mcm9tX3JrX3BpbiA/CisJCQkJCSAgIFNTQ19DS1NfUElOIDogU1NDX0NLU19DTE9DSyk7CiAKIAkJcmZtciA9CSAgU1NDX0JGKFJGTVJfRlNFREdFLCBTU0NfRlNFREdFX1BPU0lUSVZFKQogCQkJfCBTU0NfQkYoUkZNUl9GU09TLCBTU0NfRlNPU19OT05FKQpAQCAtNDgxLDcgKzQ4Myw4IEBACiAJCQl8IFNTQ19CRihUQ01SX1NUQVJULCBzdGFydF9ldmVudCkKIAkJCXwgU1NDX0JGKFRDTVJfQ0tJLCBTU0NfQ0tJX0ZBTExJTkcpCiAJCQl8IFNTQ19CRihUQ01SX0NLTywgU1NDX0NLT19OT05FKQotCQkJfCBTU0NfQkYoVENNUl9DS1MsIFNTQ19DS1NfUElOKTsKKwkJCXwgU1NDX0JGKFRDTVJfQ0tTLCBzc2MtPmNsa19mcm9tX3JrX3BpbiA/CisJCQkJCSAgIFNTQ19DS1NfQ0xPQ0sgOiBTU0NfQ0tTX1BJTik7CiAKIAkJdGZtciA9CSAgU1NDX0JGKFRGTVJfRlNFREdFLCBTU0NfRlNFREdFX1BPU0lUSVZFKQogCQkJfCBTU0NfQkYoVEZNUl9GU0RFTiwgMCkKQEAgLTU1MCw3ICs1NTMsOCBAQAogCQkJfCBTU0NfQkYoUkNNUl9TVEFSVCwgU1NDX1NUQVJUX1JJU0lOR19SRikKIAkJCXwgU1NDX0JGKFJDTVJfQ0tJLCBTU0NfQ0tJX1JJU0lORykKIAkJCXwgU1NDX0JGKFJDTVJfQ0tPLCBTU0NfQ0tPX05PTkUpCi0JCQl8IFNTQ19CRihSQ01SX0NLUywgU1NDX0NLU19QSU4pOworCQkJfCBTU0NfQkYoUkNNUl9DS1MsIHNzYy0+Y2xrX2Zyb21fcmtfcGluID8KKwkJCQkJICAgU1NDX0NLU19QSU4gOiBTU0NfQ0tTX0NMT0NLKTsKIAogCQlyZm1yID0JICBTU0NfQkYoUkZNUl9GU0VER0UsIFNTQ19GU0VER0VfUE9TSVRJVkUpCiAJCQl8IFNTQ19CRihSRk1SX0ZTT1MsIFNTQ19GU09TX05PTkUpCkBAIC01NjUsNyArNTY5LDggQEAKIAkJCXwgU1NDX0JGKFRDTVJfU1RBUlQsIFNTQ19TVEFSVF9SSVNJTkdfUkYpCiAJCQl8IFNTQ19CRihUQ01SX0NLSSwgU1NDX0NLSV9GQUxMSU5HKQogCQkJfCBTU0NfQkYoVENNUl9DS08sIFNTQ19DS09fTk9ORSkKLQkJCXwgU1NDX0JGKFRDTVJfQ0tTLCBTU0NfQ0tTX1BJTik7CisJCQl8IFNTQ19CRihSQ01SX0NLUywgc3NjLT5jbGtfZnJvbV9ya19waW4gPworCQkJCQkgICBTU0NfQ0tTX0NMT0NLIDogU1NDX0NLU19QSU4pOwogCiAJCXRmbXIgPQkgIFNTQ19CRihURk1SX0ZTRURHRSwgU1NDX0ZTRURHRV9QT1NJVElWRSkKIAkJCXwgU1NDX0JGKFRGTVJfRlNERU4sIDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCmluZGV4IGYxNWJmZjEuLjE3NGJkNTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCkBAIC0xNTUsMjUgKzE1NSwxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMjBla19kYXBtX3dpZGdldHMpKTsKLQkvKiBTZXQgdXAgc3BlY2lmaWMgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKLQogCS8qIG5vdCBjb25uZWN0ZWQgKi8KIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSTElORUlOIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTExJTkVJTiIpOwogCi0jaWZkZWYgRU5BQkxFX01JQ19JTlBVVAotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJJbnQgTWljIik7Ci0jZWxzZQotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkludCBNaWMiKTsKKyNpZm5kZWYgRU5BQkxFX01JQ19JTlBVVAorCXNuZF9zb2NfZGFwbV9uY19waW4oJnJ0ZC0+Y2FyZC0+ZGFwbSwgIkludCBNaWMiKTsKICNlbmRpZgogCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk0LDYgKzE4MywxMSBAQAogCS5kYWlfbGluayA9ICZhdDkxc2FtOWcyMGVrX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhdDkxc2FtOWcyMGVrX3NldF9iaWFzX2xldmVsLAorCisJLmRhcG1fd2lkZ2V0cyA9IGF0OTFzYW05ZzIwZWtfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAogfTsKIAogc3RhdGljIGludCBhdDkxc2FtOWcyMGVrX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCmluZGV4IDQ1NDRkOGUuLjYzNDdkNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCkBAIC0xNCw3ICsxNCw4IEBACiAJZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTICYmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX0JGNVhYX1NPQ19JMlMgaWYgIUJGNjB4CiAJc2VsZWN0IFNORF9CRjZYWF9TT0NfSTJTIGlmIEJGNjB4Ci0Jc2VsZWN0IFNORF9TT0NfU1NNMjYwMgorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDJfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyX0kyQyBpZiBJMkMKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCiAJICBTU00yNjAyIEF1ZGlvIENvZGVjIEFkZC1PbiBDYXJkLgpAQCAtNDYsNyArNDcsOCBAQAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgRVZBTC1BREFWODBYIGJvYXJkcyBvbiBCbGFja2ZpbiBldmFsIGJvYXJkcyIKIAlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0FEQVY4MFgKKwlzZWxlY3QgU05EX1NPQ19BREFWODAxIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BREFWODAzIGlmIEkyQwogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMgRVZBTC1BREFWODAxIG9yCiAJICBFVkFMLUFEQVY4MDMgYm9hcmQgY29ubmVjdGVkIHRvIG9uZSBvZiB0aGUgQmxhY2tmaW4gZXZhbHVhdGlvbiBib2FyZHMKQEAgLTY3LDcgKzY5LDggQEAKIAl0cmlzdGF0ZSAiU29DIEFEMTkzWCBBdWRpbyBzdXBwb3J0IGZvciBCbGFja2ZpbiIKIAlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0FEMTkzWAorCXNlbGVjdCBTTkRfU09DX0FEMTkzWF9JMkMgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfQUQxOTNYX1NQSSBpZiBTUElfTUFTVEVSCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEFEMTkzWCBjb2RlYyBvbiBCbGFja2Zpbi4KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEFEMTkzNiwgQUQxOTM3LCBBRDE5MzggYW5kIEFEMTkzOS4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jaXJydXMvS2NvbmZpZyBiL3NvdW5kL3NvYy9jaXJydXMvS2NvbmZpZwppbmRleCAwNmY5MzhkLi41NDc3YzU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY2lycnVzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NpcnJ1cy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFNORF9FUDkzWFhfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciB0aGUgQ2lycnVzIExvZ2ljIEVQOTN4eCBzZXJpZXMiCi0JZGVwZW5kcyBvbiAoQVJDSF9FUDkzWFggfHwgQ09NUElMRV9URVNUKSAmJiBTTkRfU09DCisJZGVwZW5kcyBvbiBBUkNIX0VQOTNYWCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1NPQ19HRU5FUklDX0RNQUVOR0lORV9QQ00KIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KQEAgLTE4LDcgKzE4LDcgQEAKICAgICAgICAgdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlIgogICAgICAgICBkZXBlbmRzIG9uIFNORF9FUDkzWFhfU09DICYmIE1BQ0hfU05BUFBFUl9DTDE1CiAgICAgICAgIHNlbGVjdCBTTkRfRVA5M1hYX1NPQ19JMlMKLSAgICAgICAgc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKyAgICAgICAgc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAgICAgICAgIGhlbHAKICAgICAgICAgICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEkyUyBhdWRpbyBvbiB0aGUKICAgICAgICAgICBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NpcnJ1cy9zbmFwcGVyY2wxNS5jIGIvc291bmQvc29jL2NpcnJ1cy9zbmFwcGVyY2wxNS5jCmluZGV4IDI5MjM4YTcuLjViNjhiMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jaXJydXMvc25hcHBlcmNsMTUuYworKysgYi9zb3VuZC9zb2MvY2lycnVzL3NuYXBwZXJjbDE1LmMKQEAgLTY1LDE4ICs2NSw2IEBACiAJeyJNSUNJTiIsIE5VTEwsICJNaWMgSmFjayJ9LAogfTsKIAotc3RhdGljIGludCBzbmFwcGVyY2wxNV90bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbmFwcGVyY2wxNV9kYWkgPSB7CiAJLm5hbWUJCT0gInRsdjMyMGFpYzIzIiwKIAkuc3RyZWFtX25hbWUJPSAiQUlDMjMiLApAQCAtODQsNyArNzIsNiBAQAogCS5jb2RlY19kYWlfbmFtZQk9ICJ0bHYzMjBhaWMyMy1oaWZpIiwKIAkuY29kZWNfbmFtZQk9ICJ0bHYzMjBhaWMyMy1jb2RlYy4wLTAwMWEiLAogCS5wbGF0Zm9ybV9uYW1lCT0gImVwOTN4eC1pMnMiLAotCS5pbml0CQk9IHNuYXBwZXJjbDE1X3RsdjMyMGFpYzIzX2luaXQsCiAJLmRhaV9mbXQJPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9JRiB8CiAJCQkgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJLm9wcwkJPSAmc25hcHBlcmNsMTVfb3BzLApAQCAtOTUsNiArODIsMTEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rCT0gJnNuYXBwZXJjbDE1X2RhaSwKIAkubnVtX2xpbmtzCT0gMSwKKworCS5kYXBtX3dpZGdldHMJCT0gdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwkJPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgc25hcHBlcmNsMTVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwppbmRleCA2NDdhNzJjLi5iMDdlMTcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCkBAIC00NDgsMzggKzQ0OCwzOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqcG04NjB4X3BhX3RleHRzW10gPSB7Ii0zMyUiLCAiMCUiLCAiMzMlIiwgIjY2JSJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczFfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzFfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMxX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0hTMV9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzJfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMyX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0hTMl9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczFfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzFfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMxX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0hTMV9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczJfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzJfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMyX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0hTMl9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzFfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzFfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8xX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0xPMV9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzJfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8yX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0xPMl9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzFfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzFfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8xX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0xPMV9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzJfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzJfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8yX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0xPMl9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9zcGtfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9FQVJfQ1RSTF8xLCA1LCA0LCBwbTg2MHhfcGFfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBtODYweF9zcGtfcGFfZW51bSwKKwkJCSAgICBQTTg2MFhfRUFSX0NUUkxfMSwgNSwgcG04NjB4X3BhX3RleHRzKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwbTg2MHhfZWFyX3BhX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfRUFSX0NUUkxfMiwgMCwgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfZWFyX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0VBUl9DVFJMXzIsIDAsIHBtODYweF9wYV90ZXh0cyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcG04NjB4X3Nwa19lYXJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9FQVJfQ1RSTF8xLCAzLCA0LCBwbTg2MHhfb3BhbXBfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBtODYweF9zcGtfZWFyX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0VBUl9DVFJMXzEsIDMsIHBtODYweF9vcGFtcF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwbTg2MHhfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiQURDIENhcHR1cmUgVm9sdW1lIiwgUE04NjBYX0FEQ19BTkFfMiwKQEAgLTU2MSw4ICs1NjEsOCBAQAogCSJQQ00gTCIsICJQQ00gUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9QQ01fSUZBQ0VfMywgNiwgMiwgYWlmMV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWYxX2VudW0sCisJCQkgICAgUE04NjBYX1BDTV9JRkFDRV8zLCA2LCBhaWYxX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlBDTSBNdXgiLCBhaWYxX2VudW0pOwpAQCAtNTcyLDggKzU3Miw4IEBACiAJIkRJTiIsICJESU4xIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaTJzX2Rpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0kyU19JRkFDRV8zLCAxLCAyLCBpMnNfZGluX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGkyc19kaW5fZW51bSwKKwkJCSAgICBQTTg2MFhfSTJTX0lGQUNFXzMsIDEsIGkyc19kaW5fdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpMnNfZGluX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSTJTIERJTiBNdXgiLCBpMnNfZGluX2VudW0pOwpAQCAtNTgzLDggKzU4Myw4IEBACiAJIkV4IFBBIiwgIkFEQyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGkyc19taWNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9JMlNfSUZBQ0VfMywgNCwgMiwgaTJzX21pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChpMnNfbWljX2VudW0sCisJCQkgICAgUE04NjBYX0kyU19JRkFDRV8zLCA0LCBpMnNfbWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaTJzX21pY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkkyUyBNaWMgTXV4IiwgaTJzX21pY19lbnVtKTsKQEAgLTU5NCw4ICs1OTQsOCBAQAogCSJBRENSIiwgIkFEQ0wiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfUENNX0lGQUNFXzMsIDQsIDIsIGFkY2xfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjbF9lbnVtLAorCQkJICAgIFBNODYwWF9QQ01fSUZBQ0VfMywgNCwgYWRjbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBREMgTGVmdCBNdXgiLCBhZGNsX2VudW0pOwpAQCAtNjA1LDggKzYwNSw4IEBACiAJIkFEQ0wiLCAiQURDUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY3JfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9QQ01fSUZBQ0VfMywgMiwgMiwgYWRjcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNyX2VudW0sCisJCQkgICAgUE04NjBYX1BDTV9JRkFDRV8zLCAyLCBhZGNyX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBSaWdodCBNdXgiLCBhZGNyX2VudW0pOwpAQCAtNjE2LDggKzYxNiw4IEBACiAJIkFEQ1IiLCAiRUMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNyX2VjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQURDX0VOXzIsIDMsIDIsIGFkY3JfZWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjcl9lY19lbnVtLAorCQkJICAgIFBNODYwWF9BRENfRU5fMiwgMywgYWRjcl9lY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY3JfZWNfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBRENSIEVDIE11eCIsIGFkY3JfZWNfZW51bSk7CkBAIC02MjcsOCArNjI3LDggQEAKIAkiTGVmdCIsICJSaWdodCIsICJMZWZ0ICsgUmlnaHQiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBlY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0VDX1BBVEgsIDEsIDMsIGVjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVjX2VudW0sCisJCQkgICAgUE04NjBYX0VDX1BBVEgsIDEsIGVjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZWNfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJFQyBNdXgiLCBlY19lbnVtKTsKQEAgLTYzOCwzNiArNjM4LDM2IEBACiB9OwogCiAvKiBEQUMgSGVhZHNldCAxIE11eCAvIE11eDEwICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19oczFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDAsIDQsIGRhY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfaHMxX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgMCwgZGFjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjX2hzMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBIUzEgTXV4IiwgZGFjX2hzMV9lbnVtKTsKIAogLyogREFDIEhlYWRzZXQgMiBNdXggLyBNdXgxMSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfaHMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX0lOUFVUX1NFTF8xLCAyLCA0LCBkYWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2hzMl9lbnVtLAorCQkJICAgIFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDIsIGRhY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY19oczJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEQUMgSFMyIE11eCIsIGRhY19oczJfZW51bSk7CiAKIC8qIERBQyBMaW5lb3V0IDEgTXV4IC8gTXV4MTIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2xvMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgNCwgNCwgZGFjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19sbzFfZW51bSwKKwkJCSAgICBQTTg2MFhfQU5BX0lOUFVUX1NFTF8xLCA0LCBkYWNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNfbG8xX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDIExPMSBNdXgiLCBkYWNfbG8xX2VudW0pOwogCiAvKiBEQUMgTGluZW91dCAyIE11eCAvIE11eDEzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19sbzJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDYsIDQsIGRhY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfbG8yX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgNiwgZGFjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjX2xvMl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBMTzIgTXV4IiwgZGFjX2xvMl9lbnVtKTsKIAogLyogREFDIFNwZWFya2VyIEVhcnBob25lIE11eCAvIE11eDE0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19zcGtfZWFyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX0lOUFVUX1NFTF8yLCAwLCA0LCBkYWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX3Nwa19lYXJfZW51bSwKKwkJCSAgICBQTTg2MFhfQU5BX0lOUFVUX1NFTF8yLCAwLCBkYWNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNfc3BrX2Vhcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBTUCBNdXgiLCBkYWNfc3BrX2Vhcl9lbnVtKTsKQEAgLTY3NywyOSArNjc3LDI5IEBACiAJIkRpZ2l0YWwiLCAiQW5hbG9nIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHMxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMCwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHMxX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDAsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHMxX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSGVhZHNldDEgTXV4IiwgaHMxX2VudW0pOwogCiAvKiBIZWFkc2V0IDIgTXV4IC8gTXV4MTYgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMSwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHMyX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDEsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHMyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSGVhZHNldDIgTXV4IiwgaHMyX2VudW0pOwogCiAvKiBMaW5lb3V0IDEgTXV4IC8gTXV4MTcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG8xX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMiwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG8xX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDIsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG8xX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGluZW91dDEgTXV4IiwgbG8xX2VudW0pOwogCiAvKiBMaW5lb3V0IDIgTXV4IC8gTXV4MTggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG8yX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMywgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG8yX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDMsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG8yX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGluZW91dDIgTXV4IiwgbG8yX2VudW0pOwpAQCAtNzA5LDggKzcwOSw4IEBACiAJIkVhcnBpZWNlIiwgIlNwZWFrZXIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfVE9fQU5BLCA2LCAyLCBzcGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDYsIHNwa190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa19kZW11eCA9CiAJU09DX0RBUE1fRU5VTSgiU3BlYWtlciBFYXJwaWVjZSBEZW11eCIsIHNwa19lbnVtKTsKQEAgLTcyMCw4ICs3MjAsOCBAQAogCSJNaWMgMSIsICJNaWMgMiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0FEQ19BTkFfNCwgNCwgMiwgbWljX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY19lbnVtLAorCQkJICAgIFBNODYwWF9BRENfQU5BXzQsIDQsIG1pY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1pY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIk1JQyBNdXgiLCBtaWNfZW51bSk7CkBAIC0xMzI3LDggKzEzMjcsNyBAQAogCiAJcG04NjB4LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHBtODYweC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIHBtODYweC0+cmVnbWFwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggOTgzZDA4N2EuLmYwZTg0MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTgsNiArOCw4IEBACiAJZGVmYXVsdCB5IGlmIEkyQz15CiAJZGVmYXVsdCB5IGlmIFNQSV9NQVNURVI9eQogCittZW51ICJDT0RFQyBkcml2ZXJzIgorCiBjb25maWcgU05EX1NPQ19BTExfQ09ERUNTCiAJdHJpc3RhdGUgIkJ1aWxkIGFsbCBBU29DIENPREVDIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBDT01QSUxFX1RFU1QKQEAgLTE2LDE1ICsxOCwyMCBAQAogCXNlbGVjdCBTTkRfU09DX0FCODUwMF9DT0RFQyBpZiBBQlg1MDBfQ09SRQogCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMgaWYgU05EX1NPQ19BQzk3X0JVUwogCXNlbGVjdCBTTkRfU09DX0FEMTgzNiBpZiBTUElfTUFTVEVSCi0Jc2VsZWN0IFNORF9TT0NfQUQxOTNYIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKKwlzZWxlY3QgU05EX1NPQ19BRDE5M1hfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BRDE5M1hfSTJDIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FEMTk4MCBpZiBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfQUQ3MzMxMQogCXNlbGVjdCBTTkRfU09DX0FEQVUxMzczIGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX0FEQVY4MFggaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX0FEQVY4MDEgaWYgU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX0FEQVY4MDMgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfQURBVTE5NzdfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BREFVMTk3N19JMkMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQURBVTE3MDEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQURTMTE3WAogCXNlbGVjdCBTTkRfU09DX0FLNDEwNCBpZiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfQUs0NTM1IGlmIEkyQworCXNlbGVjdCBTTkRfU09DX0FLNDU1NAogCXNlbGVjdCBTTkRfU09DX0FLNDY0MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19BSzQ2NDIgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQUs0NjcxIGlmIEkyQwpAQCAtMzcsNiArNDQsNyBAQAogCXNlbGVjdCBTTkRfU09DX0NTNDJMNzMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQ1M0MjcwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0NTNDI3MSBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfQ1M0MlhYOF9JMkMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQ1gyMDQ0MiBpZiBUVFkKIAlzZWxlY3QgU05EX1NPQ19EQTcyMTAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfREE3MjEzIGlmIEkyQwpAQCAtNTksMjAgKzY3LDI2IEBACiAJc2VsZWN0IFNORF9TT0NfUENNMTY4MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19QQ00xNzkyQSBpZiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfUENNMzAwOAorCXNlbGVjdCBTTkRfU09DX1BDTTUxMnhfSTJDIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1BDTTUxMnhfU1BJIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19SVDU2MzEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1NjQwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NHVEw1MDAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NJNDc2WCBpZiBNRkRfU0k0NzZYX0NPUkUKKwlzZWxlY3QgU05EX1NPQ19TSVJGX0FVRElPX0NPREVDCiAJc2VsZWN0IFNORF9TT0NfU045NTAzMSBpZiBJTlRFTF9TQ1VfSVBDCiAJc2VsZWN0IFNORF9TT0NfU1BESUYKIAlzZWxlY3QgU05EX1NPQ19TU00yNTE4IGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDJfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyX0kyQyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TVEEzMlggaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfU1RBNTI5IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NUQUM5NzY2IGlmIFNORF9TT0NfQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19UQVM1MDg2IGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzX0kyQyBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19TUEkgaWYgU1BJX01BU1RFUgogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzI2IGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzMVhYIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzMyWDQgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1ggaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVFBBNjEzMEEyIGlmIEkyQwpAQCAtMTgyLDYgKzE5NiwxNCBAQAogY29uZmlnIFNORF9TT0NfQUQxOTNYCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQUQxOTNYX1NQSQorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQUQxOTNYCisKK2NvbmZpZyBTTkRfU09DX0FEMTkzWF9JMkMKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX0FEMTkzWAorCiBjb25maWcgU05EX1NPQ19BRDE5ODAKIAl0cmlzdGF0ZQogCkBAIC0xODksNDEgKzIxMSw2NiBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX0FEQVUxNzAxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEQVUxNzAxIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfU0lHTUFEU1AKLQl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BREFVMTM3MwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0FEQVUxOTc3CisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfQURBVTE5NzdfU1BJCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19BREFVMTk3NworCXNlbGVjdCBSRUdNQVBfU1BJCisKK2NvbmZpZyBTTkRfU09DX0FEQVUxOTc3X0kyQworCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQURBVTE5NzcKKwlzZWxlY3QgUkVHTUFQX0kyQworCiBjb25maWcgU05EX1NPQ19BREFWODBYCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQURBVjgwMQorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQURBVjgwWAorCitjb25maWcgU05EX1NPQ19BREFWODAzCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19BREFWODBYCisKIGNvbmZpZyBTTkRfU09DX0FEUzExN1gKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQxMDQKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0MTA0IENPREVDIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgogCiBjb25maWcgU05EX1NPQ19BSzQ1MzUKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQ1NTQKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0NTU0IENPREVDIgogCiBjb25maWcgU05EX1NPQ19BSzQ2NDEKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQ2NDIKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0NjQyIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX0FLNDY3MQogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX0FLNTM4NgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkFLTSBBSzU2MzggQ09ERUMiCiAKIGNvbmZpZyBTTkRfU09DX0FMQzU2MjMKICAgICAgICB0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19BTEM1NjMyCiAJdHJpc3RhdGUKIApAQCAtMjM0LDE0ICsyODEsMTcgQEAKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19DUzQyTDUyCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDJMNTIgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfQ1M0Mkw3MwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBDUzQyTDczIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAKICMgQ2lycnVzIExvZ2ljIENTNDI3MCBDb2RlYwogY29uZmlnIFNORF9TT0NfQ1M0MjcwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDI3MCBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQwogCiAjIENpcnJ1cyBMb2dpYyBDUzQyNzAgQ29kZWMgVkQgPSAzLjNWIEVycmF0YQogIyBTZWxlY3QgaWYgeW91IGFyZSBhZmZlY3RlZCBieSB0aGUgZXJyYXRhIHdoZXJlIHRoZSBwYXJ0IHdpbGwgbm90IGZ1bmN0aW9uCkBAIC0yNTIsOCArMzAyLDE4IEBACiAJZGVwZW5kcyBvbiBTTkRfU09DX0NTNDI3MAogCiBjb25maWcgU05EX1NPQ19DUzQyNzEKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDI3MSBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKKworY29uZmlnIFNORF9TT0NfQ1M0MlhYOAogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0NTNDJYWDhfSTJDCisJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBDUzQyNDQ4L0NTNDI4ODggQ09ERUMgKEkyQykiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgU05EX1NPQ19DUzQyWFg4CisJc2VsZWN0IFJFR01BUF9JMkMKKwogY29uZmlnIFNORF9TT0NfQ1gyMDQ0MgogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBUVFkKQEAgLTI4Myw2ICszNDMsOSBAQAogY29uZmlnIFNORF9TT0NfRE1JQwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0hETUlfQ09ERUMKKyAgICAgICB0cmlzdGF0ZSAiSERNSSBzdHViIENPREVDIgorCiBjb25maWcgU05EX1NPQ19JU0FCRUxMRQogICAgICAgICB0cmlzdGF0ZQogCkBAIC0zMDEsMTggKzM2NCwzMiBAQAogY29uZmlnIFNORF9TT0NfTUFYOTg1MAogCXRyaXN0YXRlCiAKLWNvbmZpZyBTTkRfU09DX0hETUlfQ09ERUMKLSAgICAgICB0cmlzdGF0ZQotCiBjb25maWcgU05EX1NPQ19QQ00xNjgxCi0gICAgICAgdHJpc3RhdGUKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgUENNMTY4MSBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19QQ00xNzkyQQotICAgICAgIHRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTE3OTJBIENPREVDIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgogCiBjb25maWcgU05EX1NPQ19QQ00zMDA4CiAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfUENNNTEyeAorCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX1BDTTUxMnhfSTJDCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTUxMnggQ09ERUNzIC0gSTJDIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFNORF9TT0NfUENNNTEyeAorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBTTkRfU09DX1BDTTUxMnhfU1BJCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTUxMnggQ09ERUNzIC0gU1BJIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX1BDTTUxMngKKwlzZWxlY3QgUkVHTUFQX1NQSQorCiBjb25maWcgU05EX1NPQ19SVDU2MzEKIAl0cmlzdGF0ZQogCkBAIC0zMjEsNyArMzk4LDggQEAKIAogI0ZyZWVzY2FsZSBzZ3RsNTAwMCBjb2RlYwogY29uZmlnIFNORF9TT0NfU0dUTDUwMDAKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJGcmVlc2NhbGUgU0dUTDUwMDAgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfU0k0NzZYCiAJdHJpc3RhdGUKQEAgLTMzMCwxMSArNDA4LDE1IEBACiAJdHJpc3RhdGUKIAlzZWxlY3QgQ1JDMzIKIAorY29uZmlnIFNORF9TT0NfU0lSRl9BVURJT19DT0RFQworCXRyaXN0YXRlICJTaVJGIFNvQyBpbnRlcm5hbCBhdWRpbyBjb2RlYyIKKwlzZWxlY3QgUkVHTUFQX01NSU8KKwogY29uZmlnIFNORF9TT0NfU045NTAzMQogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1NQRElGCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiUy9QRElGIENPREVDIgogCiBjb25maWcgU05EX1NPQ19TU00yNTE4CiAJdHJpc3RhdGUKQEAgLTM0Miw2ICs0MjQsMTQgQEAKIGNvbmZpZyBTTkRfU09DX1NTTTI2MDIKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19TU00yNjAyX1NQSQorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19TU00yNjAyX0kyQworCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19TVEEzMlgKIAl0cmlzdGF0ZQogCkBAIC0zNTIsMjAgKzQ0MiwzMyBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RBUzUwODYKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUQVM1MDg2IHNwZWFrZXIgYW1wbGlmaWVyIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzIzCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMworCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMyM19TUEkKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzI2CiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFNQSQogCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzMVhYCisgICAgICAgIHRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzMyWDQKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzWAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRMVjMyMEFJQzN4IENPREVDcyIKKwlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19UTFYzMjBEQUMzMwogCXRyaXN0YXRlCkBAIC00MTQsNTUgKzUxNyw2OSBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODUxMAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MTAgQ09ERUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODUyMwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MjMgREFDIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1dNODU4MAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MjMgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004NzExCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODcxMSBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzI3CiAJdHJpc3RhdGUKIAogY29uZmlnIFNORF9TT0NfV004NzI4Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODcyOCBEQUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODczMQotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3MzEgQ09ERUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODczNwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3MzcgQURDIgorCWRlcGVuZHMgb24gU05EX1NPQ19JMkNfQU5EX1NQSQogCiBjb25maWcgU05EX1NPQ19XTTg3NDEKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004NzM3IERBQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzUwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc1MCBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzUzCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc1MyBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzcwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3MCBDT0RFQyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKIAogY29uZmlnIFNORF9TT0NfV004Nzc2Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3NiBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzgyCiAJdHJpc3RhdGUKIAogY29uZmlnIFNORF9TT0NfV004ODA0Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODgwNCBTL1BESUYgdHJhbnNjZWl2ZXIiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5MDMgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004OTA0CiAJdHJpc3RhdGUKQEAgLTQ4MCw3ICs1OTcsOCBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODk2MgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5NjIgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004OTcxCiAJdHJpc3RhdGUKQEAgLTU1Myw0ICs2NzEsNyBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RQQTYxMzBBMgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRQQTYxMzBBMiBoZWFkcGhvbmUgYW1wbGlmaWVyIgorCWRlcGVuZHMgb24gSTJDCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IGJjMTI2NzYuLjNjNGQyNzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtMywxMSArMywxOCBAQAogc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCiBzbmQtc29jLWFkMTgzNi1vYmpzIDo9IGFkMTgzNi5vCiBzbmQtc29jLWFkMTkzeC1vYmpzIDo9IGFkMTkzeC5vCitzbmQtc29jLWFkMTkzeC1zcGktb2JqcyA6PSBhZDE5M3gtc3BpLm8KK3NuZC1zb2MtYWQxOTN4LWkyYy1vYmpzIDo9IGFkMTkzeC1pMmMubwogc25kLXNvYy1hZDE5ODAtb2JqcyA6PSBhZDE5ODAubwogc25kLXNvYy1hZDczMzExLW9ianMgOj0gYWQ3MzMxMS5vCiBzbmQtc29jLWFkYXUxNzAxLW9ianMgOj0gYWRhdTE3MDEubwogc25kLXNvYy1hZGF1MTM3My1vYmpzIDo9IGFkYXUxMzczLm8KK3NuZC1zb2MtYWRhdTE5Nzctb2JqcyA6PSBhZGF1MTk3Ny5vCitzbmQtc29jLWFkYXUxOTc3LXNwaS1vYmpzIDo9IGFkYXUxOTc3LXNwaS5vCitzbmQtc29jLWFkYXUxOTc3LWkyYy1vYmpzIDo9IGFkYXUxOTc3LWkyYy5vCiBzbmQtc29jLWFkYXY4MHgtb2JqcyA6PSBhZGF2ODB4Lm8KK3NuZC1zb2MtYWRhdjgwMS1vYmpzIDo9IGFkYXY4MDEubworc25kLXNvYy1hZGF2ODAzLW9ianMgOj0gYWRhdjgwMy5vCiBzbmQtc29jLWFkczExN3gtb2JqcyA6PSBhZHMxMTd4Lm8KIHNuZC1zb2MtYWs0MTA0LW9ianMgOj0gYWs0MTA0Lm8KIHNuZC1zb2MtYWs0NTM1LW9ianMgOj0gYWs0NTM1Lm8KQEAgLTIzLDYgKzMwLDggQEAKIHNuZC1zb2MtY3M0Mmw3My1vYmpzIDo9IGNzNDJsNzMubwogc25kLXNvYy1jczQyNzAtb2JqcyA6PSBjczQyNzAubwogc25kLXNvYy1jczQyNzEtb2JqcyA6PSBjczQyNzEubworc25kLXNvYy1jczQyeHg4LW9ianMgOj0gY3M0Mnh4OC5vCitzbmQtc29jLWNzNDJ4eDgtaTJjLW9ianMgOj0gY3M0Mnh4OC1pMmMubwogc25kLXNvYy1jeDIwNDQyLW9ianMgOj0gY3gyMDQ0Mi5vCiBzbmQtc29jLWRhNzIxMC1vYmpzIDo9IGRhNzIxMC5vCiBzbmQtc29jLWRhNzIxMy1vYmpzIDo9IGRhNzIxMy5vCkBAIC00Niw2ICs1NSw5IEBACiBzbmQtc29jLXBjbTE2ODEtb2JqcyA6PSBwY20xNjgxLm8KIHNuZC1zb2MtcGNtMTc5MmEtY29kZWMtb2JqcyA6PSBwY20xNzkyYS5vCiBzbmQtc29jLXBjbTMwMDgtb2JqcyA6PSBwY20zMDA4Lm8KK3NuZC1zb2MtcGNtNTEyeC1vYmpzIDo9IHBjbTUxMngubworc25kLXNvYy1wY201MTJ4LWkyYy1vYmpzIDo9IHBjbTUxMngtaTJjLm8KK3NuZC1zb2MtcGNtNTEyeC1zcGktb2JqcyA6PSBwY201MTJ4LXNwaS5vCiBzbmQtc29jLXJ0NTYzMS1vYmpzIDo9IHJ0NTYzMS5vCiBzbmQtc29jLXJ0NTY0MC1vYmpzIDo9IHJ0NTY0MC5vCiBzbmQtc29jLXNndGw1MDAwLW9ianMgOj0gc2d0bDUwMDAubwpAQCAtNTMsMTkgKzY1LDI1IEBACiBzbmQtc29jLWFsYzU2MzItb2JqcyA6PSBhbGM1NjMyLm8KIHNuZC1zb2Mtc2lnbWFkc3Atb2JqcyA6PSBzaWdtYWRzcC5vCiBzbmQtc29jLXNpNDc2eC1vYmpzIDo9IHNpNDc2eC5vCitzbmQtc29jLXNpcmYtYXVkaW8tY29kZWMtb2JqcyA6PSBzaXJmLWF1ZGlvLWNvZGVjLm8KIHNuZC1zb2Mtc245NTAzMS1vYmpzIDo9IHNuOTUwMzEubwogc25kLXNvYy1zcGRpZi10eC1vYmpzIDo9IHNwZGlmX3RyYW5zbWl0dGVyLm8KIHNuZC1zb2Mtc3BkaWYtcngtb2JqcyA6PSBzcGRpZl9yZWNlaXZlci5vCiBzbmQtc29jLXNzbTI1MTgtb2JqcyA6PSBzc20yNTE4Lm8KIHNuZC1zb2Mtc3NtMjYwMi1vYmpzIDo9IHNzbTI2MDIubworc25kLXNvYy1zc20yNjAyLXNwaS1vYmpzIDo9IHNzbTI2MDItc3BpLm8KK3NuZC1zb2Mtc3NtMjYwMi1pMmMtb2JqcyA6PSBzc20yNjAyLWkyYy5vCiBzbmQtc29jLXN0YTMyeC1vYmpzIDo9IHN0YTMyeC5vCiBzbmQtc29jLXN0YTUyOS1vYmpzIDo9IHN0YTUyOS5vCiBzbmQtc29jLXN0YWM5NzY2LW9ianMgOj0gc3RhYzk3NjYubwogc25kLXNvYy10YXM1MDg2LW9ianMgOj0gdGFzNTA4Ni5vCiBzbmQtc29jLXRsdjMyMGFpYzIzLW9ianMgOj0gdGx2MzIwYWljMjMubworc25kLXNvYy10bHYzMjBhaWMyMy1pMmMtb2JqcyA6PSB0bHYzMjBhaWMyMy1pMmMubworc25kLXNvYy10bHYzMjBhaWMyMy1zcGktb2JqcyA6PSB0bHYzMjBhaWMyMy1zcGkubwogc25kLXNvYy10bHYzMjBhaWMyNi1vYmpzIDo9IHRsdjMyMGFpYzI2Lm8KLXNuZC1zb2MtdGx2MzIwYWljM3gtb2JqcyA6PSB0bHYzMjBhaWMzeC5vCitzbmQtc29jLXRsdjMyMGFpYzMxeHgtb2JqcyA6PSB0bHYzMjBhaWMzMXh4Lm8KIHNuZC1zb2MtdGx2MzIwYWljMzJ4NC1vYmpzIDo9IHRsdjMyMGFpYzMyeDQubworc25kLXNvYy10bHYzMjBhaWMzeC1vYmpzIDo9IHRsdjMyMGFpYzN4Lm8KIHNuZC1zb2MtdGx2MzIwZGFjMzMtb2JqcyA6PSB0bHYzMjBkYWMzMy5vCiBzbmQtc29jLXR3bDQwMzAtb2JqcyA6PSB0d2w0MDMwLm8KIHNuZC1zb2MtdHdsNjA0MC1vYmpzIDo9IHR3bDYwNDAubwpAQCAtMTM0LDExICsxNTIsMTggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE4MzYpCSs9IHNuZC1zb2MtYWQxODM2Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWCkJKz0gc25kLXNvYy1hZDE5M3gubworb2JqLSQoQ09ORklHX1NORF9TT0NfQUQxOTNYX1NQSSkJKz0gc25kLXNvYy1hZDE5M3gtc3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWF9JMkMpCSs9IHNuZC1zb2MtYWQxOTN4LWkyYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE5ODApCSs9IHNuZC1zb2MtYWQxOTgwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FENzMzMTEpICs9IHNuZC1zb2MtYWQ3MzMxMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTM3MykJKz0gc25kLXNvYy1hZGF1MTM3My5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTk3NykJCSs9IHNuZC1zb2MtYWRhdTE5Nzcubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVTE5NzdfU1BJKQkrPSBzbmQtc29jLWFkYXUxOTc3LXNwaS5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTk3N19JMkMpCSs9IHNuZC1zb2MtYWRhdTE5NzctaTJjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FEQVUxNzAxKSAgKz0gc25kLXNvYy1hZGF1MTcwMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFWODBYKSAgKz0gc25kLXNvYy1hZGF2ODB4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEQVY4MDEpICArPSBzbmQtc29jLWFkYXY4MDEubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVjgwMykgICs9IHNuZC1zb2MtYWRhdjgwMy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRFMxMTdYKQkrPSBzbmQtc29jLWFkczExN3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQUs0MTA0KQkrPSBzbmQtc29jLWFrNDEwNC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BSzQ1MzUpCSs9IHNuZC1zb2MtYWs0NTM1Lm8KQEAgLTE1Niw2ICsxODEsOCBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0Mkw3MykJKz0gc25kLXNvYy1jczQybDczLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0NTNDI3MCkJKz0gc25kLXNvYy1jczQyNzAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MjcxKQkrPSBzbmQtc29jLWNzNDI3MS5vCitvYmotJChDT05GSUdfU05EX1NPQ19DUzQyWFg4KQkrPSBzbmQtc29jLWNzNDJ4eDgubworb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MlhYOF9JMkMpICs9IHNuZC1zb2MtY3M0Mnh4OC1pMmMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1gyMDQ0MikJKz0gc25kLXNvYy1jeDIwNDQyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0RBNzIxMCkJKz0gc25kLXNvYy1kYTcyMTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfREE3MjEzKQkrPSBzbmQtc29jLWRhNzIxMy5vCkBAIC0xNzksNiArMjA2LDkgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1BDTTE2ODEpCSs9IHNuZC1zb2MtcGNtMTY4MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00xNzkyQSkJKz0gc25kLXNvYy1wY20xNzkyYS1jb2RlYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00zMDA4KQkrPSBzbmQtc29jLXBjbTMwMDgubworb2JqLSQoQ09ORklHX1NORF9TT0NfUENNNTEyeCkJKz0gc25kLXNvYy1wY201MTJ4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1BDTTUxMnhfSTJDKQkrPSBzbmQtc29jLXBjbTUxMngtaTJjLm8KK29iai0kKENPTkZJR19TTkRfU09DX1BDTTUxMnhfU1BJKQkrPSBzbmQtc29jLXBjbTUxMngtc3BpLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTYzMSkJKz0gc25kLXNvYy1ydDU2MzEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjQwKQkrPSBzbmQtc29jLXJ0NTY0MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TR1RMNTAwMCkgICs9IHNuZC1zb2Mtc2d0bDUwMDAubwpAQCAtMTg4LDE0ICsyMTgsMTkgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1NQRElGKQkrPSBzbmQtc29jLXNwZGlmLXJ4Lm8gc25kLXNvYy1zcGRpZi10eC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TU00yNTE4KQkrPSBzbmQtc29jLXNzbTI1MTgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1NNMjYwMikJKz0gc25kLXNvYy1zc20yNjAyLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDJfU1BJKQkrPSBzbmQtc29jLXNzbTI2MDItc3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDJfSTJDKQkrPSBzbmQtc29jLXNzbTI2MDItaTJjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NUQTMyWCkgICArPSBzbmQtc29jLXN0YTMyeC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TVEE1MjkpICAgKz0gc25kLXNvYy1zdGE1Mjkubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1RBQzk3NjYpCSs9IHNuZC1zb2Mtc3RhYzk3NjYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVEFTNTA4NikJKz0gc25kLXNvYy10YXM1MDg2Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLm8KK29iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzX0kyQykJKz0gc25kLXNvYy10bHYzMjBhaWMyMy1pMmMubworb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjNfU1BJKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLXNwaS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMyNikJKz0gc25kLXNvYy10bHYzMjBhaWMyNi5vCi1vYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzWCkJKz0gc25kLXNvYy10bHYzMjBhaWMzeC5vCitvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzMVhYKSAgICAgKz0gc25kLXNvYy10bHYzMjBhaWMzMXh4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzMyWDQpICAgICArPSBzbmQtc29jLXRsdjMyMGFpYzMyeDQubworb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDM1gpCSs9IHNuZC1zb2MtdGx2MzIwYWljM3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwREFDMzMpCSs9IHNuZC1zb2MtdGx2MzIwZGFjMzMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVFdMNDAzMCkJKz0gc25kLXNvYy10d2w0MDMwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RXTDYwNDApCSs9IHNuZC1zb2MtdHdsNjA0MC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCA3N2Y0NTk4Li42ODU5OThkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTQwLDggKzQwLDggQEAKICAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmFkMTgzNl9kZWVtcFtdID0geyJOb25lIiwgIjQ0LjFrSHoiLCAiMzJrSHoiLCAiNDhrSHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE4MzZfZGVlbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFEMTgzNl9EQUNfQ1RSTDEsIDgsIDQsIGFkMTgzNl9kZWVtcCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWQxODM2X2RlZW1wX2VudW0sCisJCQkgICAgQUQxODM2X0RBQ19DVFJMMSwgOCwgYWQxODM2X2RlZW1wKTsKIAogI2RlZmluZSBBRDE4MzZfREFDX1ZPTFVNRSh4KSBcCiAJU09DX0RPVUJMRV9SKCJEQUMiICN4ICIgUGxheWJhY2sgVm9sdW1lIiwgQUQxODM2X0RBQ19MX1ZPTCh4KSwgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtaTJjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNhMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtaTJjLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEFEMTkzNi9BRDE5MzcgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkMTkzeC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7CisJeyAiYWQxOTM2IiwgMCB9LAorCXsgImFkMTkzNyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQxOTN4X2lkKTsKKworc3RhdGljIGludCBhZDE5M3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkMTkzeF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gODsKKworCXJldHVybiBhZDE5M3hfcHJvYmUoJmNsaWVudC0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZDE5M3hfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQxOTN4X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQxOTN4IiwKKwl9LAorCS5wcm9iZSAgICA9IGFkMTkzeF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gYWQxOTN4X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gYWQxOTN4X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGFkMTkzeF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEMTkzNi9BRDE5MzcgYXVkaW8gQ09ERUMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwY2VmOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LXNwaS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBBRDE5MzgvQUQxOTM5IGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAiYWQxOTN4LmgiCisKK3N0YXRpYyBpbnQgYWQxOTN4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkMTkzeF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gMTY7CisJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMHgwOTsKKwljb25maWcud3JpdGVfZmxhZ19tYXNrID0gMHgwODsKKworCXJldHVybiBhZDE5M3hfcHJvYmUoJnNwaS0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZDE5M3hfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQxOTN4X3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWQxOTN4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQxOTN4X3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFkMTkzeF9zcGlfcmVtb3ZlLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkMTkzeF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEMTkzOC9BRDE5MzkgYXVkaW8gQ09ERUMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCmluZGV4IDVhNDJkY2EuLjY4NDRkMGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwpAQCAtNiwxMiArNiwxMCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0xOSw2ICsxNyw3IEBACiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCiAjaW5jbHVkZSAiYWQxOTN4LmgiCiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwpAQCAtMzIsOCArMzEsOCBAQAogICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkMTkzeF9kZWVtcFtdID0geyJOb25lIiwgIjQ4a0h6IiwgIjQ0LjFrSHoiLCAiMzJrSHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE5M3hfZGVlbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFEMTkzWF9EQUNfQ1RSTDIsIDEsIDQsIGFkMTkzeF9kZWVtcCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWQxOTN4X2RlZW1wX2VudW0sIEFEMTkzWF9EQUNfQ1RSTDIsIDEsCisJCQkgICAgYWQxOTN4X2RlZW1wKTsKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX01JTk1BWChhZGF1MTkzeF90bHYsIC05NTYzLCAwKTsKIApAQCAtMzIwLDE3ICszMTksOSBAQAogCS5vcHMgPSAmYWQxOTN4X2RhaV9vcHMsCiB9OwogCi1zdGF0aWMgaW50IGFkMTkzeF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IGFkMTkzeF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3ggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFkMTkzeC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qIGRlZmF1bHQgc2V0dGluZyBmb3IgYWQxOTN4ICovCiAKQEAgLTM0OCwxMSArMzM5LDExIEBACiAJcmVnbWFwX3dyaXRlKGFkMTkzeC0+cmVnbWFwLCBBRDE5M1hfUExMX0NMS19DVFJMMCwgMHg5OSk7IC8qIG1jbGs9MjQuNTc2TWh6OiAweDlEOyBtY2xrPTEyLjI4OE1oejogMHg5OSAqLwogCXJlZ21hcF93cml0ZShhZDE5M3gtPnJlZ21hcCwgQUQxOTNYX1BMTF9DTEtfQ1RSTDEsIDB4MDQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FkMTkzeCA9IHsKLQkucHJvYmUgPSAJYWQxOTN4X3Byb2JlLAorCS5wcm9iZSA9IGFkMTkzeF9jb2RlY19wcm9iZSwKIAkuY29udHJvbHMgPSBhZDE5M3hfc25kX2NvbnRyb2xzLAogCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkMTkzeF9zbmRfY29udHJvbHMpLAogCS5kYXBtX3dpZGdldHMgPSBhZDE5M3hfZGFwbV93aWRnZXRzLApAQCAtMzY2LDE0MCArMzU3LDMxIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9zcGlfcmVnbWFwX2NvbmZpZyA9IHsKLQkudmFsX2JpdHMgPSA4LAotCS5yZWdfYml0cyA9IDE2LAotCS5yZWFkX2ZsYWdfbWFzayA9IDB4MDksCi0JLndyaXRlX2ZsYWdfbWFzayA9IDB4MDgsCi0KK2NvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9yZWdtYXBfY29uZmlnID0gewogCS5tYXhfcmVnaXN0ZXIgPSBBRDE5M1hfTlVNX1JFR1MgLSAxLAogCS52b2xhdGlsZV9yZWcgPSBhZGF1MTkzeF9yZWdfdm9sYXRpbGUsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoYWQxOTN4X3JlZ21hcF9jb25maWcpOwogCi1zdGF0aWMgaW50IGFkMTkzeF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK2ludCBhZDE5M3hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3g7CiAKLQlhZDE5M3ggPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGFkMTkzeF9wcml2KSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCWFkMTkzeCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqYWQxOTN4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFkMTkzeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWFkMTkzeC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmYWQxOTN4X3NwaV9yZWdtYXBfY29uZmlnKTsKLQlpZiAoSVNfRVJSKGFkMTkzeC0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWQxOTN4LT5yZWdtYXApOworCWFkMTkzeC0+cmVnbWFwID0gcmVnbWFwOwogCi0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgYWQxOTN4KTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZDE5M3gpOwogCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCi0JCQkmYWQxOTN4X2RhaSwgMSk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCisJCSZhZDE5M3hfZGFpLCAxKTsKIH0KLQotc3RhdGljIGludCBhZDE5M3hfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQxOTN4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWQxOTN4IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gYWQxOTN4X3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IGFkMTkzeF9zcGlfcmVtb3ZlLAotfTsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWQxOTN4X2kyY19yZWdtYXBfY29uZmlnID0gewotCS52YWxfYml0cyA9IDgsCi0JLnJlZ19iaXRzID0gOCwKLQotCS5tYXhfcmVnaXN0ZXIgPSBBRDE5M1hfTlVNX1JFR1MgLSAxLAotCS52b2xhdGlsZV9yZWcgPSBhZGF1MTkzeF9yZWdfdm9sYXRpbGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7Ci0JeyAiYWQxOTM2IiwgMCB9LAotCXsgImFkMTkzNyIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQxOTN4X2lkKTsKLQotc3RhdGljIGludCBhZDE5M3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBhZDE5M3hfcHJpdiAqYWQxOTN4OwotCi0JYWQxOTN4ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhZDE5M3hfcHJpdiksCi0JCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoYWQxOTN4ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWQxOTN4LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhZDE5M3hfaTJjX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoYWQxOTN4LT5yZWdtYXApKQotCQlyZXR1cm4gUFRSX0VSUihhZDE5M3gtPnJlZ21hcCk7Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhZDE5M3gpOwotCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCi0JCQkmYWQxOTN4X2RhaSwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxOTN4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkMTkzeF9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkMTkzeCIsCi0JfSwKLQkucHJvYmUgICAgPSBhZDE5M3hfaTJjX3Byb2JlLAotCS5yZW1vdmUgICA9IGFkMTkzeF9pMmNfcmVtb3ZlLAotCS5pZF90YWJsZSA9IGFkMTkzeF9pZCwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgYWQxOTN4X21vZGluaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9ICBpMmNfYWRkX2RyaXZlcigmYWQxOTN4X2kyY19kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBBRDE5M1ggSTJDIGRyaXZlcjogJWRcbiIsCi0JCQkJcmV0KTsKLQl9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQxOTN4X3NwaV9kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBBRDE5M1ggU1BJIGRyaXZlcjogJWRcbiIsCi0JCQkJcmV0KTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotbW9kdWxlX2luaXQoYWQxOTN4X21vZGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWQxOTN4X21vZGV4aXQodm9pZCkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQxOTN4X3NwaV9kcml2ZXIpOwotI2VuZGlmCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0JaTJjX2RlbF9kcml2ZXIoJmFkMTkzeF9pMmNfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoYWQxOTN4X21vZGV4aXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYWQxOTN4X3Byb2JlKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIGFkMTkzeCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmgKaW5kZXggNDczMzg4MC4uYWI5YTk5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5oCkBAIC05LDYgKzksMTMgQEAKICNpZm5kZWYgX19BRDE5M1hfSF9fCiAjZGVmaW5lIF9fQUQxOTNYX0hfXwogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBkZXZpY2U7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZDE5M3hfcmVnbWFwX2NvbmZpZzsKK2ludCBhZDE5M3hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOworCiAjZGVmaW5lIEFEMTkzWF9QTExfQ0xLX0NUUkwwICAgIDB4MDAKICNkZWZpbmUgQUQxOTNYX1BMTF9QT1dFUkRPV04gICAgICAgICAgIDB4MDEKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF9NQVNLICAgMHg2CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKaW5kZXggZWI4MzZlZC4uODc3ZjU3MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYwpAQCAtMzQ1LDE1ICszNDUsMTUgQEAKIAkiQ2hhbm5lbCA1IiwKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKIAlBREFVMTM3M19GRFNQX1NFTDEsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAogCUFEQVUxMzczX0ZEU1BfU0VMMSwgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCiAJQURBVTEzNzNfRkRTUF9TRUwyLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2hwZl9jaGFubmVsX2VudW0sCiAJQURBVTEzNzNfRkRTUF9TRUwzLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSwKIAlBREFVMTM3M19GRFNQX1NFTDQsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfaHBmX2N1dG9mZl90ZXh0W10gPSB7CkBAIC0zNjIsNyArMzYyLDcgQEAKIAkiODAwSHoiLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2hwZl9jdXRvZmZfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY3V0b2ZmX2VudW0sCiAJQURBVTEzNzNfSFBGX0NUUkwsIDMsIGFkYXUxMzczX2hwZl9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dFtdID0gewpAQCAtMzg4LDE0ICszODgsMTQgQEAKIAk1LCA3LCBUTFZfREJfU0NBTEVfSVRFTSgxNDAwLCAxNTAsIDApLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAogCUFEQVUxMzczX0JBU1MxLCA1LCBhZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKIAlBREFVMTM3M19CQVNTMSwgMiwgNywgYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3RleHQsCiAJYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3ZhbHVlcyk7CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKIAlBREFVMTM3M19CQVNTMSwgMCwgYWRhdTEzNzNfYmFzc19ocGZfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfM2RfbGV2ZWxfdGV4dFtdID0gewpAQCAtNDA5LDkgKzQwOSw5IEBACiAJIjAuMTY4NzUgZnMiLCAiMC4yNzA4MyBmcyIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9sZXZlbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2xldmVsX2VudW0sCiAJQURBVTEzNzNfM0RfQ1RSTDEsIDQsIGFkYXUxMzczXzNkX2xldmVsX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtLAogCUFEQVUxMzczXzNEX0NUUkwxLCAwLCBhZGF1MTM3M18zZF9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfM2RfdGx2W10gPSB7CkBAIC00MjcsMTEgKzQyNywxMSBAQAogCSJTdGVyZW8iLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAogCUFEQVUxMzczX09VVFBVVF9DVFJMLCA0LCBhZGF1MTM3M19scl9tdXhfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCiAJQURBVTEzNzNfT1VUUFVUX0NUUkwsIDYsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19zcGVha2VyX2xyX211eF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX3NwZWFrZXJfbHJfbXV4X2VudW0sCiAJQURBVTEzNzNfTFNfQ1RSTCwgNCwgYWRhdTEzNzNfbHJfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfY29udHJvbHNbXSA9IHsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCSJETUlDMSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYXUxMzczX2RlY2ltYXRvcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgMiwgYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9WSVJUX0RFQ0woYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0sCisJYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfZGVjaW1hdG9yX211eCA9CiAJU09DX0RBUE1fRU5VTV9WSVJUKCJEZWNpbWF0b3IgTXV4IiwgYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0pOwpAQCAtMTM3NiwxNSArMTM3Niw4IEBACiAJc3RydWN0IGFkYXUxMzczX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlib29sIGxpbmVvdXRfZGlmZmVyZW50aWFsID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgcmV0OwogCWludCBpOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlpZiAocGRhdGEpIHsKIAkJaWYgKHBkYXRhLT5udW1fZHJjID4gQVJSQVlfU0laRShwZGF0YS0+ZHJjX3NldHRpbmcpKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAwZThjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1pMmMuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkYXUxOTc3LmgiCisKK3N0YXRpYyBpbnQgYWRhdTE5NzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkYXUxOTc3X3JlZ21hcF9jb25maWc7CisJY29uZmlnLnZhbF9iaXRzID0gODsKKwljb25maWcucmVnX2JpdHMgPSA4OworCisJcmV0dXJuIGFkYXUxOTc3X3Byb2JlKCZjbGllbnQtPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmY29uZmlnKSwKKwkJaWQtPmRyaXZlcl9kYXRhLCBOVUxMKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF1MTk3N19pMmNfaWRzW10gPSB7CisJeyAiYWRhdTE5NzciLCBBREFVMTk3NyB9LAorCXsgImFkYXUxOTc4IiwgQURBVTE5NzggfSwKKwl7ICJhZGF1MTk3OSIsIEFEQVUxOTc4IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkYXUxOTc3X2kyY19pZHMpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdTE5NzdfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGF1MTk3NyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRhdTE5NzdfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBhZGF1MTk3N19pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYXUxOTc3X2kyY19pZHMsCit9OworbW9kdWxlX2kyY19kcml2ZXIoYWRhdTE5NzdfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1zcGkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5Nzctc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1Y2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5Nzctc3BpLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAiYWRhdTE5NzcuaCIKKworc3RhdGljIHZvaWQgYWRhdTE5Nzdfc3BpX3N3aXRjaF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJLyoKKwkgKiBUbyBnZXQgdGhlIGRldmljZSBpbnRvIFNQSSBtb2RlIENMQVRDSCBoYXMgdG8gYmUgcHVsbGVkIGxvdyB0aHJlZQorCSAqIHRpbWVzLiAgRG8gdGhpcyBieSBpc3N1aW5nIHRocmVlIGR1bW15IHJlYWRzLgorCSAqLworCXNwaV93OHI4KHNwaSwgMHgwMCk7CisJc3BpX3c4cjgoc3BpLCAweDAwKTsKKwlzcGlfdzhyOChzcGksIDB4MDApOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CisJc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOworCisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb25maWcgPSBhZGF1MTk3N19yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gMTY7CisJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMHgxOworCisJcmV0dXJuIGFkYXUxOTc3X3Byb2JlKCZzcGktPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmY29uZmlnKSwKKwkJaWQtPmRyaXZlcl9kYXRhLCBhZGF1MTk3N19zcGlfc3dpdGNoX21vZGUpOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYXUxOTc3X3NwaV9pZHNbXSA9IHsKKwl7ICJhZGF1MTk3NyIsIEFEQVUxOTc3IH0sCisJeyAiYWRhdTE5NzgiLCBBREFVMTk3OCB9LAorCXsgImFkYXUxOTc5IiwgQURBVTE5NzggfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRhdTE5Nzdfc3BpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGF1MTk3N19zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXUxOTc3IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGF1MTk3N19zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXUxOTc3X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYWRhdTE5Nzdfc3BpX2lkcywKK307Cittb2R1bGVfc3BpX2RyaXZlcihhZGF1MTk3N19zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1NWRhNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYwpAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2FkYXUxOTc3Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJhZGF1MTk3Ny5oIgorCisjZGVmaW5lIEFEQVUxOTc3X1JFR19QT1dFUgkJMHgwMAorI2RlZmluZSBBREFVMTk3N19SRUdfUExMCQkweDAxCisjZGVmaW5lIEFEQVUxOTc3X1JFR19CT09TVAkJMHgwMgorI2RlZmluZSBBREFVMTk3N19SRUdfTUlDQklBUwkJMHgwMworI2RlZmluZSBBREFVMTk3N19SRUdfQkxPQ0tfUE9XRVJfU0FJCTB4MDQKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1NBSV9DVFJMMAkJMHgwNQorI2RlZmluZSBBREFVMTk3N19SRUdfU0FJX0NUUkwxCQkweDA2CisjZGVmaW5lIEFEQVUxOTc3X1JFR19DTUFQMTIJCTB4MDcKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0NNQVAzNAkJMHgwOAorI2RlZmluZSBBREFVMTk3N19SRUdfU0FJX09WRVJURU1QCTB4MDkKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1BPU1RfQURDX0dBSU4oeCkJKDB4MGEgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1JFR19NSVNDX0NPTlRST0wJMHgwZQorI2RlZmluZSBBREFVMTk3N19SRUdfRElBR19DT05UUk9MCTB4MTAKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1NUQVRVUyh4KQkJKDB4MTEgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1JFR19ESUFHX0lSUTEJCTB4MTUKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0RJQUdfSVJRMgkJMHgxNgorI2RlZmluZSBBREFVMTk3N19SRUdfQURKVVNUMQkJMHgxNworI2RlZmluZSBBREFVMTk3N19SRUdfQURKVVNUMgkJMHgxOAorI2RlZmluZSBBREFVMTk3N19SRUdfQURDX0NMSVAJCTB4MTkKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0RDX0hQRl9DQUwJCTB4MWEKKworI2RlZmluZSBBREFVMTk3N19QT1dFUl9SRVNFVAkJCUJJVCg3KQorI2RlZmluZSBBREFVMTk3N19QT1dFUl9QV1VQCQkJQklUKDApCisKKyNkZWZpbmUgQURBVTE5NzdfUExMX0NMS19TCQkJQklUKDQpCisjZGVmaW5lIEFEQVUxOTc3X1BMTF9NQ1NfTUFTSwkJCTB4NworCisjZGVmaW5lIEFEQVUxOTc3X01JQ0JJQVNfTUJfVk9MVFNfTUFTSwkJMHhmMAorI2RlZmluZSBBREFVMTk3N19NSUNCSUFTX01CX1ZPTFRTX09GRlNFVAk0CisKKyNkZWZpbmUgQURBVTE5NzdfQkxPQ0tfUE9XRVJfU0FJX0xSX1BPTAkJQklUKDcpCisjZGVmaW5lIEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0UJQklUKDYpCisjZGVmaW5lIEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9MRE9fRU4JCUJJVCg1KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfTUFTSwkJKDB4MyA8PCA2KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0kyUwkJKDB4MCA8PCA2KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0xKCQkoMHgxIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQJCSgweDIgPDwgNikKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9SSl8xNkJJVAkJKDB4MyA8PCA2KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfTUFTSwkJKDB4NyA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX0kyUwkJKDB4MCA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV8yCQkoMHgxIDw8IDMpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzQJCSgweDIgPDwgMykKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9URE1fOAkJKDB4MyA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV8xNgkJKDB4NCA8PCAzKQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GU19NQVNLCQkoMHg3KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfODAwMF8xMjAwMAkoMHgwKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMTYwMDBfMjQwMDAJKDB4MSkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzMyMDAwXzQ4MDAwCSgweDIpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GU182NDAwMF85NjAwMAkoMHgzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMTI4MDAwXzE5MjAwMAkoMHg0KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9TTE9UX1dJRFRIX01BU0sJKDB4MyA8PCA1KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfU0xPVF9XSURUSF8zMgkoMHgwIDw8IDUpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9TTE9UX1dJRFRIXzI0CSgweDEgPDwgNSkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMTYJKDB4MiA8PCA1KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfREFUQV9XSURUSF9NQVNLCSgweDEgPDwgNCkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMTZCSVQJKDB4MSA8PCA0KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfREFUQV9XSURUSF8yNEJJVAkoMHgwIDw8IDQpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9MUkNMS19QVUxTRQkJQklUKDMpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9NU0IJCQlCSVQoMikKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFXzE2CQkoMHgxIDw8IDEpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9CQ0xLUkFURV8zMgkJKDB4MCA8PCAxKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfQkNMS1JBVEVfTUFTSwkoMHgxIDw8IDEpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVIJCUJJVCgwKQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9PVkVSVEVNUF9EUlZfQyh4KQkJQklUKDQgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9PVkVSVEVNUF9EUlZfSElaCQlCSVQoMykKKworI2RlZmluZSBBREFVMTk3N19NSVNDX0NPTlRST0xfU1VNX01PREVfTUFTSwkoMHgzIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9TVU1fTU9ERV8xQ0gJKDB4MiA8PCA2KQorI2RlZmluZSBBREFVMTk3N19NSVNDX0NPTlRST0xfU1VNX01PREVfMkNICSgweDEgPDwgNikKKyNkZWZpbmUgQURBVTE5NzdfTUlTQ19DT05UUk9MX1NVTV9NT0RFXzRDSAkoMHgwIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9NTVVURQkJQklUKDQpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9EQ19DQUwJCUJJVCgwKQorCisjZGVmaW5lIEFEQVUxOTc3X0NIQU5fTUFQX1NFQ09ORF9TTE9UX09GRlNFVAk0CisjZGVmaW5lIEFEQVUxOTc3X0NIQU5fTUFQX0ZJUlNUX1NMT1RfT0ZGU0VUCTAKKworc3RydWN0IGFkYXUxOTc3IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJYm9vbCByaWdodF9qOworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJZW51bSBhZGF1MTk3N19zeXNjbGtfc3JjIHN5c2Nsa19zcmM7CisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfZ3BpbzsKKwllbnVtIGFkYXUxOTc3X3R5cGUgdHlwZTsKKworCXN0cnVjdCByZWd1bGF0b3IgKmF2ZGRfcmVnOworCXN0cnVjdCByZWd1bGF0b3IgKmR2ZGRfcmVnOworCisJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgKCpzd2l0Y2hfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKworCXVuc2lnbmVkIGludCBtYXhfbWFzdGVyX2ZzOworCXVuc2lnbmVkIGludCBzbG90X3dpZHRoOworCWJvb2wgZW5hYmxlZDsKKwlib29sIG1hc3RlcjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgYWRhdTE5NzdfcmVnX2RlZmF1bHRzW10gPSB7CisJeyAweDAwLCAweDAwIH0sCisJeyAweDAxLCAweDQxIH0sCisJeyAweDAyLCAweDRhIH0sCisJeyAweDAzLCAweDdkIH0sCisJeyAweDA0LCAweDNkIH0sCisJeyAweDA1LCAweDAyIH0sCisJeyAweDA2LCAweDAwIH0sCisJeyAweDA3LCAweDEwIH0sCisJeyAweDA4LCAweDMyIH0sCisJeyAweDA5LCAweGYwIH0sCisJeyAweDBhLCAweGEwIH0sCisJeyAweDBiLCAweGEwIH0sCisJeyAweDBjLCAweGEwIH0sCisJeyAweDBkLCAweGEwIH0sCisJeyAweDBlLCAweDAyIH0sCisJeyAweDEwLCAweDBmIH0sCisJeyAweDE1LCAweDIwIH0sCisJeyAweDE2LCAweDAwIH0sCisJeyAweDE3LCAweDAwIH0sCisJeyAweDE4LCAweDAwIH0sCisJeyAweDFhLCAweDAwIH0sCit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYX01VVEUoYWRhdTE5NzdfYWRjX2dhaW4sIC0zNTYyLCA2MDAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkYXUxOTc3X21pY2JpYXNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUyIsIEFEQVUxOTc3X1JFR19NSUNCSUFTLAorCQkzLCAwLCBOVUxMLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkYXUxOTc3X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFkoIlZyZWYiLCBBREFVMTk3N19SRUdfQkxPQ0tfUE9XRVJfU0FJLAorCQk0LCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9BREMoIkFEQzEiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzIiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDEsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzMiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDIsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzQiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDMsIDApLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4zIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU40IiksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJWUkVGIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhZGF1MTk3N19kYXBtX3JvdXRlc1tdID0geworCXsgIkFEQzEiLCBOVUxMLCAiQUlOMSIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIkFJTjIiIH0sCisJeyAiQURDMyIsIE5VTEwsICJBSU4zIiB9LAorCXsgIkFEQzQiLCBOVUxMLCAiQUlONCIgfSwKKworCXsgIkFEQzEiLCBOVUxMLCAiVnJlZiIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIlZyZWYiIH0sCisJeyAiQURDMyIsIE5VTEwsICJWcmVmIiB9LAorCXsgIkFEQzQiLCBOVUxMLCAiVnJlZiIgfSwKKworCXsgIlZSRUYiLCBOVUxMLCAiVnJlZiIgfSwKK307CisKKyNkZWZpbmUgQURBVTE5NzdfVk9MVU1FKHgpIFwKKwlTT0NfU0lOR0xFX1RMVigiQURDIiAjeCAiIENhcHR1cmUgVm9sdW1lIiwgXAorCQlBREFVMTk3N19SRUdfUE9TVF9BRENfR0FJTigoeCkgLSAxKSwgXAorCQkwLCAyNTUsIDEsIGFkYXUxOTc3X2FkY19nYWluKQorCisjZGVmaW5lIEFEQVUxOTc3X0hQRl9TV0lUQ0goeCkgXAorCVNPQ19TSU5HTEUoIkFEQyIgI3ggIiBIaWdocGFzcy1GaWx0ZXIgQ2FwdHVyZSBTd2l0Y2giLCBcCisJCUFEQVUxOTc3X1JFR19EQ19IUEZfQ0FMLCAoeCkgLSAxLCAxLCAwKQorCisjZGVmaW5lIEFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goeCkgXAorCVNPQ19TSU5HTEUoIkFEQyIgI3ggIiBEQyBTdWJzdHJhY3Rpb24gQ2FwdHVyZSBTd2l0Y2giLCBcCisJCUFEQVUxOTc3X1JFR19EQ19IUEZfQ0FMLCAoeCkgKyAzLCAxLCAwKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTE5Nzdfc25kX2NvbnRyb2xzW10gPSB7CisJQURBVTE5NzdfVk9MVU1FKDEpLAorCUFEQVUxOTc3X1ZPTFVNRSgyKSwKKwlBREFVMTk3N19WT0xVTUUoMyksCisJQURBVTE5NzdfVk9MVU1FKDQpLAorCisJQURBVTE5NzdfSFBGX1NXSVRDSCgxKSwKKwlBREFVMTk3N19IUEZfU1dJVENIKDIpLAorCUFEQVUxOTc3X0hQRl9TV0lUQ0goMyksCisJQURBVTE5NzdfSFBGX1NXSVRDSCg0KSwKKworCUFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goMSksCisJQURBVTE5NzdfRENfU1VCX1NXSVRDSCgyKSwKKwlBREFVMTk3N19EQ19TVUJfU1dJVENIKDMpLAorCUFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goNCksCit9OworCitzdGF0aWMgaW50IGFkYXUxOTc3X3Jlc2V0KHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIHJlc2V0IGJpdCBpcyBvYnZpb3VzbHkgdm9sYXRpbGUsIGJ1dCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2FjaGUKKwkgKiB0aGUgb3RoZXIgYml0cyBpbiB0aGUgcmVnaXN0ZXIsIHNvIHdlIGNhbid0IGp1c3QgbWFyayB0aGUgd2hvbGUKKwkgKiByZWdpc3RlciBhcyB2b2xhdGlsZS4gU2luY2UgdGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSdsbCBldmVyCisJICogdG91Y2ggdGhlIHJlc2V0IGJpdCBqdXN0IGJ5cGFzcyB0aGUgY2FjaGUgZm9yIHRoaXMgb3BlcmF0aW9uLgorCSAqLworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhZGF1MTk3Ny0+cmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BPV0VSLAorCQkJQURBVTE5NzdfUE9XRVJfUkVTRVQpOworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhZGF1MTk3Ny0+cmVnbWFwLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciB0aHMgRlMgZmllbGQgaW4gdGhlIENUUkwwIHJlZ2lzdGVyCisgKiBkZXBlbmRpbmcgb24gdGhlIHJhdGUuCisgKi8KK3N0YXRpYyBpbnQgYWRhdTE5NzdfbG9va3VwX2ZzKHVuc2lnbmVkIGludCByYXRlKQoreworCWlmIChyYXRlID49IDgwMDAgJiYgcmF0ZSA8PSAxMjAwMCkKKwkJcmV0dXJuIEFEQVUxOTc3X1NBSV9DVFJMMF9GU184MDAwXzEyMDAwOworCWVsc2UgaWYgKHJhdGUgPj0gMTYwMDAgJiYgcmF0ZSA8PSAyNDAwMCkKKwkJcmV0dXJuIEFEQVUxOTc3X1NBSV9DVFJMMF9GU18xNjAwMF8yNDAwMDsKKwllbHNlIGlmIChyYXRlID49IDMyMDAwICYmIHJhdGUgPD0gNDgwMDApCisJCXJldHVybiBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMzIwMDBfNDgwMDA7CisJZWxzZSBpZiAocmF0ZSA+PSA2NDAwMCAmJiByYXRlIDw9IDk2MDAwKQorCQlyZXR1cm4gQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzY0MDAwXzk2MDAwOworCWVsc2UgaWYgKHJhdGUgPj0gMTI4MDAwICYmIHJhdGUgPD0gMTkyMDAwKQorCQlyZXR1cm4gQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzEyODAwMF8xOTIwMDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19sb29rdXBfbWNzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcsIHVuc2lnbmVkIGludCByYXRlLAorCXVuc2lnbmVkIGludCBmcykKK3sKKwl1bnNpZ25lZCBpbnQgbWNzOworCisJLyoKKwkgKiByYXRlID0gc3lzY2xrIC8gKDUxMiAqIG1jc19sdXRbbWNzXSkgKiAyKipmcworCSAqID0+IG1jc19sdXRbbWNzXSA9IHN5c2NsayAvICg1MTIgKiByYXRlKSAqIDIqKmZzCisJICogPT4gbWNzX2x1dFttY3NdID0gc3lzY2xrIC8gKCg1MTIgLyAyKipmcykgKiByYXRlKQorCSAqLworCisJcmF0ZSAqPSA1MTIgPj4gZnM7CisKKwlpZiAoYWRhdTE5NzctPnN5c2NsayAlIHJhdGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY3MgPSBhZGF1MTk3Ny0+c3lzY2xrIC8gcmF0ZTsKKworCS8qIFRoZSBmYWN0b3JzIGNvbmZpZ3VyZWQgYnkgTUNTIGFyZSAxLCAyLCAzLCA0LCA2ICovCisJaWYgKG1jcyA8IDEgfHwgbWNzID4gNiB8fCBtY3MgPT0gNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY3MgPSBtY3MgLSAxOworCWlmIChtY3MgPT0gNSkKKwkJbWNzID0gNDsKKworCXJldHVybiBtY3M7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE5NzdfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJdW5zaWduZWQgaW50IHNsb3Rfd2lkdGg7CisJdW5zaWduZWQgaW50IGN0cmwwLCBjdHJsMF9tYXNrOworCXVuc2lnbmVkIGludCBjdHJsMTsKKwlpbnQgbWNzLCBmczsKKwlpbnQgcmV0OworCisJZnMgPSBhZGF1MTk3N19sb29rdXBfZnMocmF0ZSk7CisJaWYgKGZzIDwgMCkKKwkJcmV0dXJuIGZzOworCisJaWYgKGFkYXUxOTc3LT5zeXNjbGtfc3JjID09IEFEQVUxOTc3X1NZU0NMS19TUkNfTUNMSykgeworCQltY3MgPSBhZGF1MTk3N19sb29rdXBfbWNzKGFkYXUxOTc3LCByYXRlLCBmcyk7CisJCWlmIChtY3MgPCAwKQorCQkJcmV0dXJuIG1jczsKKwl9IGVsc2UgeworCQltY3MgPSAwOworCX0KKworCWN0cmwwX21hc2sgPSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfTUFTSzsKKwljdHJsMCA9IGZzOworCisJaWYgKGFkYXUxOTc3LT5yaWdodF9qKSB7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMTZCSVQ7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWN0cmwwX21hc2sgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9NQVNLOworCX0KKworCWlmIChhZGF1MTk3Ny0+bWFzdGVyKSB7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMTZCSVQ7CisJCQlzbG90X3dpZHRoID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjoKKwkJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMjRCSVQ7CisJCQlzbG90X3dpZHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogSW4gVERNIG1vZGUgdGhlcmUgaXMgYSBmaXhlZCBzbG90IHdpZHRoICovCisJCWlmIChhZGF1MTk3Ny0+c2xvdF93aWR0aCkKKwkJCXNsb3Rfd2lkdGggPSBhZGF1MTk3Ny0+c2xvdF93aWR0aDsKKworCQlpZiAoc2xvdF93aWR0aCA9PSAxNikKKwkJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9CQ0xLUkFURV8xNjsKKwkJZWxzZQorCQkJY3RybDEgfD0gQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFXzMyOworCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLAorCQkJQURBVTE5NzdfUkVHX1NBSV9DVFJMMSwKKwkJCUFEQVUxOTc3X1NBSV9DVFJMMV9EQVRBX1dJRFRIX01BU0sgfAorCQkJQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFX01BU0ssCisJCQljdHJsMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9DVFJMMCwKKwkJCQljdHJsMF9tYXNrLCBjdHJsMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19QTEwsCisJCQkJQURBVTE5NzdfUExMX01DU19NQVNLLCBtY3MpOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3Bvd2VyX2Rpc2FibGUoc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghYWRhdTE5NzctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19QT1dFUiwKKwkJQURBVTE5NzdfUE9XRVJfUFdVUCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlZ2NhY2hlX21hcmtfZGlydHkoYWRhdTE5NzctPnJlZ21hcCk7CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGFkYXUxOTc3LT5yZWdtYXAsIHRydWUpOworCisJcmVndWxhdG9yX2Rpc2FibGUoYWRhdTE5NzctPmF2ZGRfcmVnKTsKKwlpZiAoYWRhdTE5NzctPmR2ZGRfcmVnKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhZGF1MTk3Ny0+ZHZkZF9yZWcpOworCisJYWRhdTE5NzctPmVuYWJsZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3Bvd2VyX2VuYWJsZShzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWRhdTE5NzctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGF1MTk3Ny0+YXZkZF9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYWRhdTE5NzctPmR2ZGRfcmVnKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWRhdTE5NzctPmR2ZGRfcmVnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfYXZkZDsKKwl9CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMSk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGFkYXUxOTc3LT5yZWdtYXAsIGZhbHNlKTsKKworCWlmIChhZGF1MTk3Ny0+c3dpdGNoX21vZGUpCisJCWFkYXUxOTc3LT5zd2l0Y2hfbW9kZShhZGF1MTk3Ny0+ZGV2KTsKKworCXJldCA9IGFkYXUxOTc3X3Jlc2V0KGFkYXUxOTc3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BPV0VSLAorCQlBREFVMTk3N19QT1dFUl9QV1VQLCBBREFVMTk3N19QT1dFUl9QV1VQKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlyZXQgPSByZWdjYWNoZV9zeW5jKGFkYXUxOTc3LT5yZWdtYXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rpc2FibGVfZHZkZDsKKworCS8qCisJICogVGhlIFBMTCByZWdpc3RlciBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHNvZnR3YXJlIHJlc2V0LiBJdCBpcworCSAqIHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciB3YXMgY2hhbmdlZCB0byB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlIHdoaWxlIHdlIHdlcmUgaW4gY2FjaGUgb25seSBtb2RlLiBJbiB0aGlzIGNhc2UKKwkgKiByZWdjYWNoZV9zeW5jIHdpbGwgc2tpcCBvdmVyIGl0IGFuZCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHN5bmMKKwkgKiBpdC4KKwkgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfUExMLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlpZiAodmFsID09IDB4NDEpIHsKKwkJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFkYXUxOTc3LT5yZWdtYXAsIHRydWUpOworCQlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BMTCwKKwkJCTB4NDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGlzYWJsZV9kdmRkOworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYWRhdTE5NzctPnJlZ21hcCwgZmFsc2UpOworCX0KKworCWFkYXUxOTc3LT5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiByZXQ7CisKK2Vycl9kaXNhYmxlX2R2ZGQ6CisJaWYgKGFkYXUxOTc3LT5kdmRkX3JlZykKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWRhdTE5NzctPmR2ZGRfcmVnKTsKK2Vycl9kaXNhYmxlX2F2ZGQ6CisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFkYXUxOTc3LT5hdmRkX3JlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorCQkJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZW5hYmxlKGFkYXUxOTc3KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlyZXQgPSBhZGF1MTk3N19wb3dlcl9kaXNhYmxlKGFkYXUxOTc3KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NldF90ZG1fc2xvdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IHR4X21hc2ssCisJdW5zaWduZWQgaW50IHJ4X21hc2ssIGludCBzbG90cywgaW50IHdpZHRoKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXVuc2lnbmVkIGludCBjdHJsMCwgY3RybDEsIGRydjsKKwl1bnNpZ25lZCBpbnQgc2xvdFs0XTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKHNsb3RzID09IDApIHsKKwkJLyogMCA9IE5vIGZpeGVkIHNsb3Qgd2lkdGggKi8KKwkJYWRhdTE5NzctPnNsb3Rfd2lkdGggPSAwOworCQlhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyA9IDE5MjAwMDsKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLAorCQkJQURBVTE5NzdfUkVHX1NBSV9DVFJMMCwgQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9NQVNLLAorCQkJQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9JMlMpOworCX0KKworCWlmIChyeF9tYXNrID09IDAgfHwgdHhfbWFzayAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRydiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzbG90W2ldID0gX19mZnMocnhfbWFzayk7CisJCWRydiB8PSBBREFVMTk3N19TQUlfT1ZFUlRFTVBfRFJWX0MoaSk7CisJCXJ4X21hc2sgJj0gfigxIDw8IHNsb3RbaV0pOworCQlpZiAoc2xvdFtpXSA+PSBzbG90cykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocnhfbWFzayA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHJ4X21hc2sgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxNjoKKwkJY3RybDEgPSBBREFVMTk3N19TQUlfQ1RSTDFfU0xPVF9XSURUSF8xNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJLyogV2UgY2FuIG9ubHkgZ2VuZXJhdGUgMTYgYml0IG9yIDMyIGJpdCB3aWRlIHNsb3RzICovCisJCWlmIChhZGF1MTk3Ny0+bWFzdGVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc2xvdHMpIHsKKwljYXNlIDI6CisJCWN0cmwwID0gQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9URE1fMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljdHJsMCA9IEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzQ7CisJCWJyZWFrOworCWNhc2UgODoKKwkJY3RybDAgPSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV84OworCQlicmVhazsKKwljYXNlIDE2OgorCQljdHJsMCA9IEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9PVkVSVEVNUCwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDApIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDEpIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDIpIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDMpLCBkcnYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX0NNQVAxMiwKKwkJKHNsb3RbMV0gPDwgQURBVTE5NzdfQ0hBTl9NQVBfU0VDT05EX1NMT1RfT0ZGU0VUKSB8CisJCShzbG90WzBdIDw8IEFEQVUxOTc3X0NIQU5fTUFQX0ZJUlNUX1NMT1RfT0ZGU0VUKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfQ01BUDM0LAorCQkoc2xvdFszXSA8PCBBREFVMTk3N19DSEFOX01BUF9TRUNPTkRfU0xPVF9PRkZTRVQpIHwKKwkJKHNsb3RbMl0gPDwgQURBVTE5NzdfQ0hBTl9NQVBfRklSU1RfU0xPVF9PRkZTRVQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDAsCisJCUFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfTUFTSywgY3RybDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9DVFJMMSwKKwkJQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfTUFTSywgY3RybDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZGF1MTk3Ny0+c2xvdF93aWR0aCA9IHdpZHRoOworCisJLyogSW4gbWFzdGVyIG1vZGUgdGhlIG1heGltdW0gYml0Y2xvY2sgaXMgMjQuNTc2IE1IeiAqLworCWFkYXUxOTc3LT5tYXhfbWFzdGVyX2ZzID0gbWluKDE5MjAwMCwgMjQ1NzYwMDAgLyB3aWR0aCAvIHNsb3RzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAobXV0ZSkKKwkJdmFsID0gQURBVTE5NzdfTUlTQ19DT05UUk9MX01NVVRFOworCWVsc2UKKwkJdmFsID0gMDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX01JU0NfQ09OVFJPTCwKKwkJCUFEQVUxOTc3X01JU0NfQ09OVFJPTF9NTVVURSwgdmFsKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgY3RybDAgPSAwLCBjdHJsMSA9IDAsIGJsb2NrX3Bvd2VyID0gMDsKKwlib29sIGludmVydF9scmNsazsKKwlpbnQgcmV0OworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYWRhdTE5NzctPm1hc3RlciA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVI7CisJCWFkYXUxOTc3LT5tYXN0ZXIgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWJsb2NrX3Bvd2VyIHw9IEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0U7CisJCWludmVydF9scmNsayA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpbnZlcnRfbHJjbGsgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQlibG9ja19wb3dlciB8PSBBREFVMTk3N19CTE9DS19QT1dFUl9TQUlfQkNMS19FREdFOworCQlpbnZlcnRfbHJjbGsgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGF1MTk3Ny0+cmlnaHRfaiA9IGZhbHNlOworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY3RybDAgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9JMlM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQljdHJsMCB8PSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0xKOworCQlpbnZlcnRfbHJjbGsgPSAhaW52ZXJ0X2xyY2xrOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQ7CisJCWFkYXUxOTc3LT5yaWdodF9qID0gdHJ1ZTsKKwkJaW52ZXJ0X2xyY2xrID0gIWludmVydF9scmNsazsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJY3RybDEgfD0gQURBVTE5NzdfU0FJX0NUUkwxX0xSQ0xLX1BVTFNFOworCQljdHJsMCB8PSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0kyUzsKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9MUkNMS19QVUxTRTsKKwkJY3RybDAgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9MSjsKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbnZlcnRfbHJjbGspCisJCWJsb2NrX3Bvd2VyIHw9IEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9MUl9QT0w7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX0JMT0NLX1BPV0VSX1NBSSwKKwkJQURBVTE5NzdfQkxPQ0tfUE9XRVJfU0FJX0xSX1BPTCB8CisJCUFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0UsIGJsb2NrX3Bvd2VyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDAsCisJCUFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfTUFTSywKKwkJY3RybDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDEsCisJCUFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVIgfCBBREFVMTk3N19TQUlfQ1RSTDFfTFJDTEtfUFVMU0UsCisJCWN0cmwxKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXU2NCBmb3JtYXRzID0gMDsKKworCWlmIChhZGF1MTk3Ny0+c2xvdF93aWR0aCA9PSAxNikKKwkJZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkU7CisJZWxzZSBpZiAoYWRhdTE5NzctPnJpZ2h0X2ogfHwgYWRhdTE5NzctPnNsb3Rfd2lkdGggPT0gMjQpCisJCWZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkU7CisKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmYWRhdTE5NzctPmNvbnN0cmFpbnRzKTsKKworCWlmIChhZGF1MTk3Ny0+bWFzdGVyKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCA4MDAwLCBhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyk7CisKKwlpZiAoZm9ybWF0cyAhPSAwKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWFzazY0KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsIGZvcm1hdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE5Nzdfc2V0X3RyaXN0YXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgdHJpc3RhdGUpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICh0cmlzdGF0ZSkKKwkJdmFsID0gQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9ISVo7CisJZWxzZQorCQl2YWwgPSAwOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfU0FJX09WRVJURU1QLAorCQlBREFVMTk3N19TQUlfT1ZFUlRFTVBfRFJWX0hJWiwgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWRhdTE5NzdfZGFpX29wcyA9IHsKKwkuc3RhcnR1cAk9IGFkYXUxOTc3X3N0YXJ0dXAsCisJLmh3X3BhcmFtcwk9IGFkYXUxOTc3X2h3X3BhcmFtcywKKwkubXV0ZV9zdHJlYW0JPSBhZGF1MTk3N19tdXRlLAorCS5zZXRfZm10CT0gYWRhdTE5Nzdfc2V0X2RhaV9mbXQsCisJLnNldF90ZG1fc2xvdAk9IGFkYXUxOTc3X3NldF90ZG1fc2xvdCwKKwkuc2V0X3RyaXN0YXRlCT0gYWRhdTE5Nzdfc2V0X3RyaXN0YXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWRhdTE5NzdfZGFpID0geworCS5uYW1lID0gImFkYXUxOTc3LWhpZmkiLAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCQkuc2lnX2JpdHMgPSAyNCwKKwl9LAorCS5vcHMgPSAmYWRhdTE5NzdfZGFpX29wcywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTE5NzdfcmF0ZXNbXSA9IHsKKwk4MDAwLCAxNjAwMCwgMzIwMDAsIDY0MDAwLCAxMjgwMDAsCisJMTEwMjUsIDIyMDUwLCA0NDEwMCwgODgyMDAsIDE3MjQwMCwKKwkxMjAwMCwgMjQwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwLAorfTsKKworI2RlZmluZSBBREFVMTk3N19SQVRFX0NPTlNUUkFJTlRfTUFTS18zMjAwMCAweDAwMWYKKyNkZWZpbmUgQURBVTE5NzdfUkFURV9DT05TVFJBSU5UX01BU0tfNDQxMDAgMHgwM2UwCisjZGVmaW5lIEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLXzQ4MDAwIDB4N2MwMAorLyogQWxsIHJhdGVzID49IDMyMDAwICovCisjZGVmaW5lIEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLX0xSQ0xLIDB4NzM5YworCitzdGF0aWMgYm9vbCBhZGF1MTk3N19jaGVja19zeXNjbGsodW5zaWduZWQgaW50IG1jbGssIHVuc2lnbmVkIGludCBiYXNlX2ZyZXEpCit7CisJdW5zaWduZWQgaW50IG1jczsKKworCWlmIChtY2xrICUgKGJhc2VfZnJlcSAqIDEyOCkgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJbWNzID0gbWNsayAvICgxMjggKiBiYXNlX2ZyZXEpOworCWlmIChtY3MgPCAxIHx8IG1jcyA+IDYgfHwgbWNzID09IDUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWludCBjbGtfaWQsIGludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGNsa19zcmM7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmIChkaXIgIT0gU05EX1NPQ19DTE9DS19JTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2xrX2lkICE9IEFEQVUxOTc3X1NZU0NMSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgQURBVTE5NzdfU1lTQ0xLX1NSQ19NQ0xLOgorCQljbGtfc3JjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBREFVMTk3N19TWVNDTEtfU1JDX0xSQ0xLOgorCQljbGtfc3JjID0gQURBVTE5NzdfUExMX0NMS19TOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZnJlcSAhPSAwICYmIHNvdXJjZSA9PSBBREFVMTk3N19TWVNDTEtfU1JDX01DTEspIHsKKwkJaWYgKGZyZXEgPCA0MDAwMDAwIHx8IGZyZXEgPiAzNjg2NDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChhZGF1MTk3N19jaGVja19zeXNjbGsoZnJlcSwgMzIwMDApKQorCQkJbWFzayB8PSBBREFVMTk3N19SQVRFX0NPTlNUUkFJTlRfTUFTS18zMjAwMDsKKwkJaWYgKGFkYXUxOTc3X2NoZWNrX3N5c2NsayhmcmVxLCA0NDEwMCkpCisJCQltYXNrIHw9IEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLXzQ0MTAwOworCQlpZiAoYWRhdTE5NzdfY2hlY2tfc3lzY2xrKGZyZXEsIDQ4MDAwKSkKKwkJCW1hc2sgfD0gQURBVTE5NzdfUkFURV9DT05TVFJBSU5UX01BU0tfNDgwMDA7CisKKwkJaWYgKG1hc2sgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoc291cmNlID09IEFEQVUxOTc3X1NZU0NMS19TUkNfTFJDTEspIHsKKwkJbWFzayA9IEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLX0xSQ0xLOworCX0KKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfUExMLAorCQlBREFVMTk3N19QTExfQ0xLX1MsIGNsa19zcmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZGF1MTk3Ny0+Y29uc3RyYWludHMubWFzayA9IG1hc2s7CisJYWRhdTE5NzctPnN5c2Nsa19zcmMgPSBzb3VyY2U7CisJYWRhdTE5NzctPnN5c2NsayA9IGZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGFkYXUxOTc3LT50eXBlKSB7CisJY2FzZSBBREFVMTk3NzoKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygmY29kZWMtPmRhcG0sCisJCQlhZGF1MTk3N19taWNiaWFzX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWRhdTE5NzdfbWljYmlhc19kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBhZGF1MTk3N19jb2RlY19kcml2ZXIgPSB7CisJLnByb2JlID0gYWRhdTE5NzdfY29kZWNfcHJvYmUsCisJLnNldF9iaWFzX2xldmVsID0gYWRhdTE5Nzdfc2V0X2JpYXNfbGV2ZWwsCisJLnNldF9zeXNjbGsgPSBhZGF1MTk3N19zZXRfc3lzY2xrLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKworCS5jb250cm9scyA9IGFkYXUxOTc3X3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTk3N19zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBhZGF1MTk3N19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYWRhdTE5NzdfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIGludCBhZGF1MTk3N19zZXR1cF9taWNiaWFzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCit7CisJc3RydWN0IGFkYXUxOTc3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gYWRhdTE5NzctPmRldi0+cGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWljYmlhczsKKworCWlmIChwZGF0YSkgeworCQltaWNiaWFzID0gcGRhdGEtPm1pY2JpYXM7CisJCWlmIChtaWNiaWFzID4gQURBVTE5NzdfTUlDQklBU185VjApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gZWxzZSB7CisJCW1pY2JpYXMgPSBBREFVMTk3N19NSUNCSUFTXzhWNTsKKwl9CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19NSUNCSUFTLAorCQlBREFVMTk3N19NSUNCSUFTX01CX1ZPTFRTX01BU0ssCisJCW1pY2JpYXMgPDwgQURBVTE5NzdfTUlDQklBU19NQl9WT0xUU19PRkZTRVQpOworfQorCitpbnQgYWRhdTE5NzdfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJZW51bSBhZGF1MTk3N190eXBlIHR5cGUsIHZvaWQgKCpzd2l0Y2hfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2KSkKK3sKKwl1bnNpZ25lZCBpbnQgcG93ZXJfb2ZmX21hc2s7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NzsKKwlpbnQgcmV0OworCisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCisJYWRhdTE5NzcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkYXUxOTc3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXUxOTc3ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhdTE5NzctPmRldiA9IGRldjsKKwlhZGF1MTk3Ny0+dHlwZSA9IHR5cGU7CisJYWRhdTE5NzctPnJlZ21hcCA9IHJlZ21hcDsKKwlhZGF1MTk3Ny0+c3dpdGNoX21vZGUgPSBzd2l0Y2hfbW9kZTsKKwlhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyA9IDE5MjAwMDsKKworCWFkYXUxOTc3LT5jb25zdHJhaW50cy5saXN0ID0gYWRhdTE5NzdfcmF0ZXM7CisJYWRhdTE5NzctPmNvbnN0cmFpbnRzLmNvdW50ID0gQVJSQVlfU0laRShhZGF1MTk3N19yYXRlcyk7CisKKwlhZGF1MTk3Ny0+YXZkZF9yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAiQVZERCIpOworCWlmIChJU19FUlIoYWRhdTE5NzctPmF2ZGRfcmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRhdTE5NzctPmF2ZGRfcmVnKTsKKworCWFkYXUxOTc3LT5kdmRkX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJEVkREIik7CisJaWYgKElTX0VSUihhZGF1MTk3Ny0+ZHZkZF9yZWcpKSB7CisJCWlmIChQVFJfRVJSKGFkYXUxOTc3LT5kdmRkX3JlZykgIT0gLUVOT0RFVikKKwkJCXJldHVybiBQVFJfRVJSKGFkYXUxOTc3LT5kdmRkX3JlZyk7CisJCWFkYXUxOTc3LT5kdmRkX3JlZyA9IE5VTEw7CisJfQorCisJYWRhdTE5NzctPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldChkZXYsICJyZXNldCIpOworCWlmIChJU19FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pKSB7CisJCXJldCA9IFBUUl9FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pOworCQlpZiAocmV0ICE9IC1FTk9FTlQgJiYgcmV0ICE9IC1FTk9TWVMpCisJCQlyZXR1cm4gUFRSX0VSUihhZGF1MTk3Ny0+cmVzZXRfZ3Bpbyk7CisJCWFkYXUxOTc3LT5yZXNldF9ncGlvID0gTlVMTDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF1MTk3Nyk7CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pIHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQluZGVsYXkoMTAwKTsKKwl9CisKKwlyZXQgPSBhZGF1MTk3N19wb3dlcl9lbmFibGUoYWRhdTE5NzcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodHlwZSA9PSBBREFVMTk3NykgeworCQlyZXQgPSBhZGF1MTk3N19zZXR1cF9taWNiaWFzKGFkYXUxOTc3KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3Bvd2Vyb2ZmOworCX0KKworCWlmIChhZGF1MTk3Ny0+ZHZkZF9yZWcpCisJCXBvd2VyX29mZl9tYXNrID0gfjA7CisJZWxzZQorCQlwb3dlcl9vZmZfbWFzayA9IH5BREFVMTk3N19CTE9DS19QT1dFUl9TQUlfTERPX0VOOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksCisJCQkJcG93ZXJfb2ZmX21hc2ssIDB4MDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2Vyb2ZmOworCisJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZGlzYWJsZShhZGF1MTk3Nyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXUxOTc3X2NvZGVjX2RyaXZlciwKKwkJCSZhZGF1MTk3N19kYWksIDEpOworCitlcnJfcG93ZXJvZmY6CisJYWRhdTE5NzdfcG93ZXJfZGlzYWJsZShhZGF1MTk3Nyk7CisJcmV0dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRhdTE5NzdfcHJvYmUpOworCitzdGF0aWMgYm9vbCBhZGF1MTk3N19yZWdpc3Rlcl92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFEQVUxOTc3X1JFR19TVEFUVVMoMCk6CisJY2FzZSBBREFVMTk3N19SRUdfU1RBVFVTKDEpOgorCWNhc2UgQURBVTE5NzdfUkVHX1NUQVRVUygyKToKKwljYXNlIEFEQVUxOTc3X1JFR19TVEFUVVMoMyk6CisJY2FzZSBBREFVMTk3N19SRUdfQURDX0NMSVA6CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWRhdTE5NzdfcmVnbWFwX2NvbmZpZyA9IHsKKwkubWF4X3JlZ2lzdGVyID0gQURBVTE5NzdfUkVHX0RDX0hQRl9DQUwsCisJLnZvbGF0aWxlX3JlZyA9IGFkYXUxOTc3X3JlZ2lzdGVyX3ZvbGF0aWxlLAorCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IGFkYXUxOTc3X3JlZ19kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfcmVnX2RlZmF1bHRzKSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhZGF1MTk3N19yZWdtYXBfY29uZmlnKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmggYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNzE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpZm5kZWYgX19TT1VORF9TT0NfQ09ERUNTX0FEQVUxOTc3X0hfXworI2RlZmluZSBfX1NPVU5EX1NPQ19DT0RFQ1NfQURBVTE5NzdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworc3RydWN0IGRldmljZTsKKworZW51bSBhZGF1MTk3N190eXBlIHsKKwlBREFVMTk3NywKKwlBREFVMTk3OCwKKwlBREFVMTk3OSwKK307CisKK2ludCBhZGF1MTk3N19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwllbnVtIGFkYXUxOTc3X3R5cGUgdHlwZSwgdm9pZCAoKnN3aXRjaF9tb2RlKShzdHJ1Y3QgZGV2aWNlICpkZXYpKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXUxOTc3X3JlZ21hcF9jb25maWc7CisKK2VudW0gYWRhdTE5NzdfY2xrX2lkIHsKKwlBREFVMTk3N19TWVNDTEssCit9OworCitlbnVtIGFkYXUxOTc3X3N5c2Nsa19zcmMgeworCUFEQVUxOTc3X1NZU0NMS19TUkNfTUNMSywKKwlBREFVMTk3N19TWVNDTEtfU1JDX0xSQ0xLLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGZjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MDEuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQURBVjgwMSBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkYXY4MHguaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYXY4MHhfc3BpX2lkW10gPSB7CisJeyAiYWRhdjgwMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRhdjgweF9zcGlfaWQpOworCitzdGF0aWMgaW50IGFkYXY4MHhfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOworCisJY29uZmlnID0gYWRhdjgweF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy5yZWFkX2ZsYWdfbWFzayA9IDB4MDE7CisKKwlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJnNwaS0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkYXY4MHhfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZGF2ODAxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWRhdjgweF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBhZGF2ODB4X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWRhdjgweF9zcGlfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIoYWRhdjgweF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVY4MDEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIllpIExpIDx5aS5saUBhbmFsb2cuY29tPj4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMy5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODAzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkOWZjZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMy5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBBREFWODAzIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJhZGF2ODB4LmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF2ODAzX2lkW10gPSB7CisJeyAiYWRhdjgwMyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdjgwM19pZCk7CisKK3N0YXRpYyBpbnQgYWRhdjgwM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGFkYXY4MHhfYnVzX3Byb2JlKCZjbGllbnQtPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWRhdjgweF9yZWdtYXBfY29uZmlnKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgwM19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkYXY4MDNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXY4MDMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkYXY4MDNfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXY4MDNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYXY4MDNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoYWRhdjgwM19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgQURBVjgwMyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0FVVEhPUigiWWkgTGkgPHlpLmxpQGFuYWxvZy5jb20+PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCBmNzhiMjdhLi41MDYyZTM0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtOCwxNyArOCwxNSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKICNpbmNsdWRlICJhZGF2ODB4LmgiCiAKQEAgLTU0MSw2ICs1MzksNyBAQAogCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAlpZiAoZGlyID09IFNORF9TT0NfQ0xPQ0tfSU4pIHsKIAkJc3dpdGNoIChjbGtfaWQpIHsKQEAgLTU3Myw3ICs1NzIsNyBAQAogCQkJcmVnbWFwX3dyaXRlKGFkYXY4MHgtPnJlZ21hcCwgQURBVjgwWF9JQ0xLX0NUUkwyLAogCQkJCWljbGtfY3RybDIpOwogCi0JCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJCX0KIAl9IGVsc2UgewogCQl1bnNpZ25lZCBpbnQgbWFzazsKQEAgLTYwMCwxNyArNTk5LDIxIEBACiAJCQlhZGF2ODB4LT5zeXNjbGtfcGRbY2xrX2lkXSA9IGZhbHNlOwogCQl9CiAKKwkJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKIAkJaWYgKGFkYXY4MHgtPnN5c2Nsa19wZFswXSkKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwxIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDEiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMSIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDEiKTsKIAogCQlpZiAoYWRhdjgweC0+c3lzY2xrX3BkWzFdIHx8IGFkYXY4MHgtPnN5c2Nsa19wZFsyXSkKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDIiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDIiKTsKIAotCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCX0KIAogCXJldHVybiAwOwpAQCAtNzIyLDcgKzcyNSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JaWYgKCFjb2RlYy0+YWN0aXZlIHx8ICFhZGF2ODB4LT5yYXRlKQorCWlmICghc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpIHx8ICFhZGF2ODB4LT5yYXRlKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKQEAgLTczNSw3ICs3MzgsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAotCWlmICghY29kZWMtPmFjdGl2ZSkKKwlpZiAoIXNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkKIAkJYWRhdjgweC0+cmF0ZSA9IDA7CiB9CiAKQEAgLTc5OCwxNSArODAxLDggQEAKIAogc3RhdGljIGludCBhZGF2ODB4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMCwgMCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEZvcmNlIFBMTHMgb24gZm9yIFNZU0NMSyBvdXRwdXQgKi8KIAlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwxIik7CiAJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOwpAQCAtODY0LDM5ICs4NjAsMjYgQEAKIAkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fcm91dGVzKSwKIH07CiAKLXN0YXRpYyBpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCitpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHg7Ci0JaW50IHJldDsKIAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKIAotCWFkYXY4MHggPSBremFsbG9jKHNpemVvZigqYWRhdjgweCksIEdGUF9LRVJORUwpOworCWFkYXY4MHggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkYXY4MHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXY4MHgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0KIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF2ODB4KTsKIAlhZGF2ODB4LT5yZWdtYXAgPSByZWdtYXA7CiAKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXY4MHhfY29kZWNfZHJpdmVyLAorCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXY4MHhfY29kZWNfZHJpdmVyLAogCQlhZGF2ODB4X2RhaXMsIEFSUkFZX1NJWkUoYWRhdjgweF9kYWlzKSk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUoYWRhdjgweCk7Ci0KLQlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRhdjgweF9idXNfcHJvYmUpOwogCi1zdGF0aWMgaW50IGFkYXY4MHhfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKGRldik7Ci0Ja2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXJldHVybiAwOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZGF2ODB4X3NwaV9yZWdtYXBfY29uZmlnID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWRhdjgweF9yZWdtYXBfY29uZmlnID0gewogCS52YWxfYml0cyA9IDgsCiAJLnBhZF9iaXRzID0gMSwKIAkucmVnX2JpdHMgPSA3LApAQCAtOTA4LDEwNSArODkxLDcgQEAKIAkucmVnX2RlZmF1bHRzID0gYWRhdjgweF9yZWdfZGVmYXVsdHMsCiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfcmVnX2RlZmF1bHRzKSwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZGF2ODB4X3NwaV9pZFtdID0gewotCXsgImFkYXY4MDEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkYXY4MHhfc3BpX2lkKTsKLQotc3RhdGljIGludCBhZGF2ODB4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXJldHVybiBhZGF2ODB4X2J1c19wcm9iZSgmc3BpLT5kZXYsCi0JCWRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmFkYXY4MHhfc3BpX3JlZ21hcF9jb25maWcpKTsKLX0KLQotc3RhdGljIGludCBhZGF2ODB4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gYWRhdjgweF9idXNfcmVtb3ZlKCZzcGktPmRldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGF2ODB4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWRhdjgwMSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IGFkYXY4MHhfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gYWRhdjgweF9zcGlfcmVtb3ZlLAotCS5pZF90YWJsZQk9IGFkYXY4MHhfc3BpX2lkLAotfTsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXY4MHhfaTJjX3JlZ21hcF9jb25maWcgPSB7Ci0JLnZhbF9iaXRzID0gOCwKLQkucGFkX2JpdHMgPSAxLAotCS5yZWdfYml0cyA9IDcsCi0KLQkubWF4X3JlZ2lzdGVyID0gQURBVjgwWF9QTExfT1VURSwKLQotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAotCS5yZWdfZGVmYXVsdHMgPSBhZGF2ODB4X3JlZ19kZWZhdWx0cywKLQkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWRhdjgweF9yZWdfZGVmYXVsdHMpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkYXY4MHhfaTJjX2lkW10gPSB7Ci0JeyAiYWRhdjgwMyIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdjgweF9pMmNfaWQpOwotCi1zdGF0aWMgaW50IGFkYXY4MHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJmNsaWVudC0+ZGV2LAotCQlkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhZGF2ODB4X2kyY19yZWdtYXBfY29uZmlnKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRhdjgweF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIGFkYXY4MHhfYnVzX3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdjgweF9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkYXY4MDMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IGFkYXY4MHhfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBhZGF2ODB4X2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gYWRhdjgweF9pMmNfaWQsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGFkYXY4MHhfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9IGkyY19hZGRfZHJpdmVyKCZhZGF2ODB4X2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKLSNlbmRpZgotCi0JcmV0dXJuIHJldDsKLX0KLW1vZHVsZV9pbml0KGFkYXY4MHhfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhZGF2ODB4X2V4aXQodm9pZCkKLXsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0JaTJjX2RlbF9kcml2ZXIoJmFkYXY4MHhfaTJjX2RyaXZlcik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoYWRhdjgweF9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFkYXY4MHhfcmVnbWFwX2NvbmZpZyk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBBREFWODB4IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCmluZGV4IGFkYjBmYzcuLjhhMWQ3YzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCkBAIC05LDYgKzksMTMgQEAKICNpZm5kZWYgX0FEQVY4MFhfSAogI2RlZmluZSBfQURBVjgwWF9ICiAKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworc3RydWN0IGRldmljZTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXY4MHhfcmVnbWFwX2NvbmZpZzsKK2ludCBhZGF2ODB4X2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCk7CisKIGVudW0gYWRhdjgweF9wbGxfc3JjIHsKIAlBREFWODBYX1BMTF9TUkNfWElOLAogCUFEQVY4MFhfUExMX1NSQ19YVEFMLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKaW5kZXggYjQ4MTlkYy4uMTBhZGYyNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCkBAIC0xNzQsOCArMTc0LDYgQEAKIAlzdHJ1Y3QgYWs0MTA0X3ByaXZhdGUgKmFrNDEwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWs0MTA0LT5yZWdtYXA7Ci0KIAkvKiBzZXQgcG93ZXItdXAgYW5kIG5vbi1yZXNldCBiaXRzICovCiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFrNDEwNC0+cmVnbWFwLCBBSzQxMDRfUkVHX0NPTlRST0wxLAogCQkJCSBBSzQxMDRfQ09OVFJPTDFfUFcgfCBBSzQxMDRfQ09OVFJPTDFfUlNUTiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCmluZGV4IDY4NGZlOTEuLjMwZTI5NzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwpAQCAtMzg4LDE1ICszODgsNiBAQAogCiBzdGF0aWMgaW50IGFrNDUzNV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFrNDUzNV9wcml2ICphazQ1MzUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFrNDUzNS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlhazQ1MzVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKaW5kZXggOTRjYmU1MC4uODY4YzBlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC0xMTMsMTQgKzExMywxNCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGF1eF9pbl90bHYsIC0yMTAwLCAzMDAsIDApOwogCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21vbm9fb3V0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSzQ2NDFfU0lHMSwgNiwgMiwgYWs0NjQxX21vbm9fb3V0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX2hwX291dF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUs0NjQxX01PREUyLCAyLCAyLCBhazQ2NDFfaHBfb3V0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21pY19zZWxlY3RfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFLNDY0MV9NSUMsIDEsIDIsIGFrNDY0MV9taWNfc2VsZWN0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21pY19vcl9kYWNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFLNDY0MV9CVElGLCA0LCAyLCBhazQ2NDFfbWljX29yX2RhYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21vbm9fb3V0X2VudW0sCisJCQkgICAgQUs0NjQxX1NJRzEsIDYsIGFrNDY0MV9tb25vX291dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX2hwX291dF9lbnVtLAorCQkJICAgIEFLNDY0MV9NT0RFMiwgMiwgYWs0NjQxX2hwX291dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21pY19zZWxlY3RfZW51bSwKKwkJCSAgICBBSzQ2NDFfTUlDLCAxLCBhazQ2NDFfbWljX3NlbGVjdCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21pY19vcl9kYWNfZW51bSwKKwkJCSAgICBBSzQ2NDFfQlRJRiwgNCwgYWs0NjQxX21pY19vcl9kYWMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0NjQxX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJNb25vIDEgT3V0cHV0IiwgYWs0NjQxX21vbm9fb3V0X2VudW0pLApAQCAtNTE5LDE0ICs1MTksNiBAQAogCiBzdGF0aWMgaW50IGFrNDY0MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlhazQ2NDFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggMWY2NDZjNi4uOTI2NTVjYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC00NjUsMTQgKzQ2NSw2IEBACiAKIHN0YXRpYyBpbnQgYWs0NjQyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJYWs0NjQyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCmluZGV4IDI1YmRmNmEuLjk5OGZhMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0yMywxMDQgKzI0LDk5IEBACiAjaW5jbHVkZSAiYWs0NjcxLmgiCiAKIAotLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCi1zdHJ1Y3QgYWs0NjcxX3ByaXYgewotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotfTsKLQogLyogYWs0NjcxIHJlZ2lzdGVyIGNhY2hlICYgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncyAqLwotc3RhdGljIGNvbnN0IHU4IGFrNDY3MV9yZWdbQUs0NjcxX0NBQ0hFUkVHTlVNXSA9IHsKLQkweDAwLAkvKiBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVAkoMHgwMCkJKi8KLQkweGY2LAkvKiBBSzQ2NzFfUExMX01PREVfU0VMRUNUMAkJKDB4MDEpCSovCi0JMHgwMCwJLyogQUs0NjcxX1BMTF9NT0RFX1NFTEVDVDEJCSgweDAyKQkqLwotCTB4MDIsCS8qIEFLNDY3MV9GT1JNQVRfU0VMRUNUCQkJKDB4MDMpCSovCi0JMHgwMCwJLyogQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNUCQkoMHgwNCkJKi8KLQkweDU1LAkvKiBBSzQ2NzFfTUlDX0FNUF9HQUlOCQkJKDB4MDUpCSovCi0JMHgwMCwJLyogQUs0NjcxX01JWElOR19QT1dFUl9NQU5BR0VNRU5UMAkoMHgwNikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQxCSgweDA3KQkqLwotCTB4YjUsCS8qIEFLNDY3MV9PVVRQVVRfVk9MVU1FX0NPTlRST0wJCSgweDA4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9MT1VUMV9TSUdOQUxfU0VMRUNUCQkoMHgwOSkJKi8KLQkweDAwLAkvKiBBSzQ2NzFfUk9VVDFfU0lHTkFMX1NFTEVDVAkJKDB4MGEpCSovCi0JMHgwMCwJLyogQUs0NjcxX0xPVVQyX1NJR05BTF9TRUxFQ1QJCSgweDBiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ST1VUMl9TSUdOQUxfU0VMRUNUCQkoMHgwYykJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTE9VVDNfU0lHTkFMX1NFTEVDVAkJKDB4MGQpCSovCi0JMHgwMCwJLyogQUs0NjcxX1JPVVQzX1NJR05BTF9TRUxFQ1QJCSgweDBlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9MT1VUMV9QT1dFUl9NQU5BR0VSTUVOVAkoMHgwZikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTE9VVDJfUE9XRVJfTUFOQUdFUk1FTlQJKDB4MTApCSovCi0JMHg4MCwJLyogQUs0NjcxX0xPVVQzX1BPV0VSX01BTkFHRVJNRU5UCSgweDExKQkqLwotCTB4OTEsCS8qIEFLNDY3MV9MQ0hfSU5QVVRfVk9MVU1FX0NPTlRST0wJKDB4MTIpCSovCi0JMHg5MSwJLyogQUs0NjcxX1JDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMykJKi8KLQkweGUxLAkvKiBBSzQ2NzFfQUxDX1JFRkVSRU5DRV9TRUxFQ1QJCSgweDE0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ESUdJVEFMX01JWElOR19DT05UUk9MCSgweDE1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9BTENfVElNRVJfU0VMRUNUCQkoMHgxNikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfQUxDX01PREVfQ09OVFJPTAkJKDB4MTcpCSovCi0JMHgwMiwJLyogQUs0NjcxX01PREVfQ09OVFJPTDEJCQkoMHgxOCkJKi8KLQkweDAxLAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMgkJCSgweDE5KQkqLwotCTB4MTgsCS8qIEFLNDY3MV9MQ0hfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCSgweDFhKQkqLwotCTB4MTgsCS8qIEFLNDY3MV9SQ0hfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCSgweDFiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9TSURFVE9ORV9BX0NPTlRST0wJCSgweDFjKQkqLwotCTB4MDIsCS8qIEFLNDY3MV9ESUdJVEFMX0ZJTFRFUl9TRUxFQ1QJCSgweDFkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwzX0NPRUZGSUNJRU5UMAkJKDB4MWUpCSovCi0JMHgwMCwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQxCQkoMHgxZikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMM19DT0VGRklDSUVOVDIJCSgweDIwKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwzX0NPRUZGSUNJRU5UMwkJKDB4MjEpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMAkJKDB4MjIpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMQkJKDB4MjMpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMgkJKDB4MjQpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMwkJKDB4MjUpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UNAkJKDB4MjYpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UNQkJKDB4MjcpCSovCi0JMHhhOSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQwCQkoMHgyOCkJKi8KLQkweDFmLAkvKiBBSzQ2NzFfRklMMV9DT0VGRklDSUVOVDEJCSgweDI5KQkqLwotCTB4YWQsCS8qIEFLNDY3MV9GSUwxX0NPRUZGSUNJRU5UMgkJKDB4MmEpCSovCi0JMHgyMCwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQzCQkoMHgyYikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMMl9DT0VGRklDSUVOVDAJCSgweDJjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwyX0NPRUZGSUNJRU5UMQkJKDB4MmQpCSovCi0JMHgwMCwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQyCQkoMHgyZSkJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMMl9DT0VGRklDSUVOVDMJCSgweDJmKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ESUdJVEFMX0ZJTFRFUl9TRUxFQ1QyCSgweDMwKQkqLwotCTB4MDAsCS8qIHRoaXMgcmVnaXN0ZXIgbm90IHVzZWQJCQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDAJCSgweDMyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDEJCSgweDMzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDIJCSgweDM0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDMJCSgweDM1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDQJCSgweDM2KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDUJCSgweDM3KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDAJCSgweDM4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDEJCSgweDM5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDIJCSgweDNhKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDMJCSgweDNiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDQJCSgweDNjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDUJCSgweDNkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDAJCSgweDNlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDEJCSgweDNmKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDIJCSgweDQwKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDMJCSgweDQxKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDQJCSgweDQyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDUJCSgweDQzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDAJCSgweDQ0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDEJCSgweDQ1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDIJCSgweDQ2KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDMJCSgweDQ3KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDQJCSgweDQ4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDUJCSgweDQ5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDAJCSgweDRhKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDEJCSgweDRiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDIJCSgweDRjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDMJCSgweDRkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDQJCSgweDRlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDUJCSgweDRmKQkqLwotCTB4ODgsCS8qIEFLNDY3MV9FUV9DT05UUk9MXzI1MEhaXzEwMEhaCSgweDUwKQkqLwotCTB4ODgsCS8qIEFLNDY3MV9FUV9DT05UUk9MXzM1MDBIWl8xS0haCSgweDUxKQkqLwotCTB4MDgsCS8qIEFLNDY3MV9FUV9DT05UUk9fMTBLSFoJCSgweDUyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDAJCSgweDUzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDEJCSgweDU0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDIJCSgweDU1KQkqLwotCTB4MTgsCS8qIEFLNDY3MV9ESUdJVEFMX1ZPTFVNRV9CX0NPTlRST0wJKDB4NTYpCSovCi0JMHgxOCwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0NfQ09OVFJPTAkoMHg1NykJKi8KLQkweDAwLAkvKiBBSzQ2NzFfU0lERVRPTkVfVk9MVU1FX0NPTlRST0wJKDB4NTgpCSovCi0JMHgwMCwJLyogQUs0NjcxX0RJR0lUQUxfTUlYSU5HX0NPTlRST0wyCSgweDU5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9TQVJfQURDX0NPTlRST0wJCSgweDVhKQkqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBhazQ2NzFfcmVnX2RlZmF1bHRzW10gPSB7CisJeyAweDAwLCAweDAwIH0sCS8qIEFLNDY3MV9BRF9EQV9QT1dFUl9NQU5BR0VNRU5UCSgweDAwKQkqLworCXsgMHgwMSwgMHhmNiB9LAkvKiBBSzQ2NzFfUExMX01PREVfU0VMRUNUMAkJKDB4MDEpCSovCisJeyAweDAyLCAweDAwIH0sCS8qIEFLNDY3MV9QTExfTU9ERV9TRUxFQ1QxCQkoMHgwMikJKi8KKwl7IDB4MDMsIDB4MDIgfSwJLyogQUs0NjcxX0ZPUk1BVF9TRUxFQ1QJCQkoMHgwMykJKi8KKwl7IDB4MDQsIDB4MDAgfSwJLyogQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNUCQkoMHgwNCkJKi8KKwl7IDB4MDUsIDB4NTUgfSwJLyogQUs0NjcxX01JQ19BTVBfR0FJTgkJCSgweDA1KQkqLworCXsgMHgwNiwgMHgwMCB9LAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQwCSgweDA2KQkqLworCXsgMHgwNywgMHgwMCB9LAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQxCSgweDA3KQkqLworCXsgMHgwOCwgMHhiNSB9LAkvKiBBSzQ2NzFfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCQkoMHgwOCkJKi8KKwl7IDB4MDksIDB4MDAgfSwJLyogQUs0NjcxX0xPVVQxX1NJR05BTF9TRUxFQ1QJCSgweDA5KQkqLworCXsgMHgwYSwgMHgwMCB9LAkvKiBBSzQ2NzFfUk9VVDFfU0lHTkFMX1NFTEVDVAkJKDB4MGEpCSovCisJeyAweDBiLCAweDAwIH0sCS8qIEFLNDY3MV9MT1VUMl9TSUdOQUxfU0VMRUNUCQkoMHgwYikJKi8KKwl7IDB4MGMsIDB4MDAgfSwJLyogQUs0NjcxX1JPVVQyX1NJR05BTF9TRUxFQ1QJCSgweDBjKQkqLworCXsgMHgwZCwgMHgwMCB9LAkvKiBBSzQ2NzFfTE9VVDNfU0lHTkFMX1NFTEVDVAkJKDB4MGQpCSovCisJeyAweDBlLCAweDAwIH0sCS8qIEFLNDY3MV9ST1VUM19TSUdOQUxfU0VMRUNUCQkoMHgwZSkJKi8KKwl7IDB4MGYsIDB4MDAgfSwJLyogQUs0NjcxX0xPVVQxX1BPV0VSX01BTkFHRVJNRU5UCSgweDBmKQkqLworCXsgMHgxMCwgMHgwMCB9LAkvKiBBSzQ2NzFfTE9VVDJfUE9XRVJfTUFOQUdFUk1FTlQJKDB4MTApCSovCisJeyAweDExLCAweDgwIH0sCS8qIEFLNDY3MV9MT1VUM19QT1dFUl9NQU5BR0VSTUVOVAkoMHgxMSkJKi8KKwl7IDB4MTIsIDB4OTEgfSwJLyogQUs0NjcxX0xDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMikJKi8KKwl7IDB4MTMsIDB4OTEgfSwJLyogQUs0NjcxX1JDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMykJKi8KKwl7IDB4MTQsIDB4ZTEgfSwJLyogQUs0NjcxX0FMQ19SRUZFUkVOQ0VfU0VMRUNUCQkoMHgxNCkJKi8KKwl7IDB4MTUsIDB4MDAgfSwJLyogQUs0NjcxX0RJR0lUQUxfTUlYSU5HX0NPTlRST0wJKDB4MTUpCSovCisJeyAweDE2LCAweDAwIH0sCS8qIEFLNDY3MV9BTENfVElNRVJfU0VMRUNUCQkoMHgxNikJKi8KKwl7IDB4MTcsIDB4MDAgfSwJLyogQUs0NjcxX0FMQ19NT0RFX0NPTlRST0wJCSgweDE3KQkqLworCXsgMHgxOCwgMHgwMiB9LAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMQkJCSgweDE4KQkqLworCXsgMHgxOSwgMHgwMSB9LAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMgkJCSgweDE5KQkqLworCXsgMHgxYSwgMHgxOCB9LAkvKiBBSzQ2NzFfTENIX09VVFBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxYSkJKi8KKwl7IDB4MWIsIDB4MTggfSwJLyogQUs0NjcxX1JDSF9PVVRQVVRfVk9MVU1FX0NPTlRST0wJKDB4MWIpCSovCisJeyAweDFjLCAweDAwIH0sCS8qIEFLNDY3MV9TSURFVE9ORV9BX0NPTlRST0wJCSgweDFjKQkqLworCXsgMHgxZCwgMHgwMiB9LAkvKiBBSzQ2NzFfRElHSVRBTF9GSUxURVJfU0VMRUNUCQkoMHgxZCkJKi8KKwl7IDB4MWUsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQwCQkoMHgxZSkJKi8KKwl7IDB4MWYsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQxCQkoMHgxZikJKi8KKwl7IDB4MjAsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQyCQkoMHgyMCkJKi8KKwl7IDB4MjEsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQzCQkoMHgyMSkJKi8KKwl7IDB4MjIsIDB4MDAgfSwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMAkJKDB4MjIpCSovCisJeyAweDIzLCAweDAwIH0sCS8qIEFLNDY3MV9FUV9DT0VGRklDSUVOVDEJCSgweDIzKQkqLworCXsgMHgyNCwgMHgwMCB9LAkvKiBBSzQ2NzFfRVFfQ09FRkZJQ0lFTlQyCQkoMHgyNCkJKi8KKwl7IDB4MjUsIDB4MDAgfSwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMwkJKDB4MjUpCSovCisJeyAweDI2LCAweDAwIH0sCS8qIEFLNDY3MV9FUV9DT0VGRklDSUVOVDQJCSgweDI2KQkqLworCXsgMHgyNywgMHgwMCB9LAkvKiBBSzQ2NzFfRVFfQ09FRkZJQ0lFTlQ1CQkoMHgyNykJKi8KKwl7IDB4MjgsIDB4YTkgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQwCQkoMHgyOCkJKi8KKwl7IDB4MjksIDB4MWYgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQxCQkoMHgyOSkJKi8KKwl7IDB4MmEsIDB4YWQgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQyCQkoMHgyYSkJKi8KKwl7IDB4MmIsIDB4MjAgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQzCQkoMHgyYikJKi8KKwl7IDB4MmMsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQwCQkoMHgyYykJKi8KKwl7IDB4MmQsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQxCQkoMHgyZCkJKi8KKwl7IDB4MmUsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQyCQkoMHgyZSkJKi8KKwl7IDB4MmYsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQzCQkoMHgyZikJKi8KKwl7IDB4MzAsIDB4MDAgfSwJLyogQUs0NjcxX0RJR0lUQUxfRklMVEVSX1NFTEVDVDIJKDB4MzApCSovCisKKwl7IDB4MzIsIDB4MDAgfSwJLyogQUs0NjcxX0UxX0NPRUZGSUNJRU5UMAkJKDB4MzIpCSovCisJeyAweDMzLCAweDAwIH0sCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDEJCSgweDMzKQkqLworCXsgMHgzNCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTFfQ09FRkZJQ0lFTlQyCQkoMHgzNCkJKi8KKwl7IDB4MzUsIDB4MDAgfSwJLyogQUs0NjcxX0UxX0NPRUZGSUNJRU5UMwkJKDB4MzUpCSovCisJeyAweDM2LCAweDAwIH0sCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDQJCSgweDM2KQkqLworCXsgMHgzNywgMHgwMCB9LAkvKiBBSzQ2NzFfRTFfQ09FRkZJQ0lFTlQ1CQkoMHgzNykJKi8KKwl7IDB4MzgsIDB4MDAgfSwJLyogQUs0NjcxX0UyX0NPRUZGSUNJRU5UMAkJKDB4MzgpCSovCisJeyAweDM5LCAweDAwIH0sCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDEJCSgweDM5KQkqLworCXsgMHgzYSwgMHgwMCB9LAkvKiBBSzQ2NzFfRTJfQ09FRkZJQ0lFTlQyCQkoMHgzYSkJKi8KKwl7IDB4M2IsIDB4MDAgfSwJLyogQUs0NjcxX0UyX0NPRUZGSUNJRU5UMwkJKDB4M2IpCSovCisJeyAweDNjLCAweDAwIH0sCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDQJCSgweDNjKQkqLworCXsgMHgzZCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTJfQ09FRkZJQ0lFTlQ1CQkoMHgzZCkJKi8KKwl7IDB4M2UsIDB4MDAgfSwJLyogQUs0NjcxX0UzX0NPRUZGSUNJRU5UMAkJKDB4M2UpCSovCisJeyAweDNmLCAweDAwIH0sCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDEJCSgweDNmKQkqLworCXsgMHg0MCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTNfQ09FRkZJQ0lFTlQyCQkoMHg0MCkJKi8KKwl7IDB4NDEsIDB4MDAgfSwJLyogQUs0NjcxX0UzX0NPRUZGSUNJRU5UMwkJKDB4NDEpCSovCisJeyAweDQyLCAweDAwIH0sCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDQJCSgweDQyKQkqLworCXsgMHg0MywgMHgwMCB9LAkvKiBBSzQ2NzFfRTNfQ09FRkZJQ0lFTlQ1CQkoMHg0MykJKi8KKwl7IDB4NDQsIDB4MDAgfSwJLyogQUs0NjcxX0U0X0NPRUZGSUNJRU5UMAkJKDB4NDQpCSovCisJeyAweDQ1LCAweDAwIH0sCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDEJCSgweDQ1KQkqLworCXsgMHg0NiwgMHgwMCB9LAkvKiBBSzQ2NzFfRTRfQ09FRkZJQ0lFTlQyCQkoMHg0NikJKi8KKwl7IDB4NDcsIDB4MDAgfSwJLyogQUs0NjcxX0U0X0NPRUZGSUNJRU5UMwkJKDB4NDcpCSovCisJeyAweDQ4LCAweDAwIH0sCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDQJCSgweDQ4KQkqLworCXsgMHg0OSwgMHgwMCB9LAkvKiBBSzQ2NzFfRTRfQ09FRkZJQ0lFTlQ1CQkoMHg0OSkJKi8KKwl7IDB4NGEsIDB4MDAgfSwJLyogQUs0NjcxX0U1X0NPRUZGSUNJRU5UMAkJKDB4NGEpCSovCisJeyAweDRiLCAweDAwIH0sCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDEJCSgweDRiKQkqLworCXsgMHg0YywgMHgwMCB9LAkvKiBBSzQ2NzFfRTVfQ09FRkZJQ0lFTlQyCQkoMHg0YykJKi8KKwl7IDB4NGQsIDB4MDAgfSwJLyogQUs0NjcxX0U1X0NPRUZGSUNJRU5UMwkJKDB4NGQpCSovCisJeyAweDRlLCAweDAwIH0sCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDQJCSgweDRlKQkqLworCXsgMHg0ZiwgMHgwMCB9LAkvKiBBSzQ2NzFfRTVfQ09FRkZJQ0lFTlQ1CQkoMHg0ZikJKi8KKwl7IDB4NTAsIDB4ODggfSwJLyogQUs0NjcxX0VRX0NPTlRST0xfMjUwSFpfMTAwSFoJKDB4NTApCSovCisJeyAweDUxLCAweDg4IH0sCS8qIEFLNDY3MV9FUV9DT05UUk9MXzM1MDBIWl8xS0haCSgweDUxKQkqLworCXsgMHg1MiwgMHgwOCB9LAkvKiBBSzQ2NzFfRVFfQ09OVFJPXzEwS0haCQkoMHg1MikJKi8KKwl7IDB4NTMsIDB4MDAgfSwJLyogQUs0NjcxX1BDTV9JRl9DT05UUk9MMAkJKDB4NTMpCSovCisJeyAweDU0LCAweDAwIH0sCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDEJCSgweDU0KQkqLworCXsgMHg1NSwgMHgwMCB9LAkvKiBBSzQ2NzFfUENNX0lGX0NPTlRST0wyCQkoMHg1NSkJKi8KKwl7IDB4NTYsIDB4MTggfSwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0JfQ09OVFJPTAkoMHg1NikJKi8KKwl7IDB4NTcsIDB4MTggfSwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0NfQ09OVFJPTAkoMHg1NykJKi8KKwl7IDB4NTgsIDB4MDAgfSwJLyogQUs0NjcxX1NJREVUT05FX1ZPTFVNRV9DT05UUk9MCSgweDU4KQkqLworCXsgMHg1OSwgMHgwMCB9LAkvKiBBSzQ2NzFfRElHSVRBTF9NSVhJTkdfQ09OVFJPTDIJKDB4NTkpCSovCisJeyAweDVhLCAweDAwIH0sCS8qIEFLNDY3MV9TQVJfQURDX0NPTlRST0wJCSgweDVhKQkqLwogfTsKIAogLyoKQEAgLTI0MSwxOSArMjM3LDE3IEBACiAvKiBJbnB1dCBNVVhzICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWs0NjcxX2xpbl9tdXhfdGV4dHNbXSA9CiAJCXsiTElOMSIsICJMSU4yIiwgIkxJTjMiLCAiTElONCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhazQ2NzFfbGluX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNULCAwLAotCQkJQVJSQVlfU0laRShhazQ2NzFfbGluX211eF90ZXh0cyksCi0JCQlhazQ2NzFfbGluX211eF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjcxX2xpbl9tdXhfZW51bSwKKwkJCSAgICBBSzQ2NzFfTUlDX1NJR05BTF9TRUxFQ1QsIDAsCisJCQkgICAgYWs0NjcxX2xpbl9tdXhfdGV4dHMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFrNDY3MV9saW5fbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWs0NjcxX2xpbl9tdXhfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphazQ2NzFfcmluX211eF90ZXh0c1tdID0KIAkJeyJSSU4xIiwgIlJJTjIiLCAiUklOMyIsICJSSU40In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFrNDY3MV9yaW5fbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSzQ2NzFfTUlDX1NJR05BTF9TRUxFQ1QsIDIsCi0JCQlBUlJBWV9TSVpFKGFrNDY3MV9yaW5fbXV4X3RleHRzKSwKLQkJCWFrNDY3MV9yaW5fbXV4X3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhazQ2NzFfcmluX211eF9lbnVtLAorCQkJICAgIEFLNDY3MV9NSUNfU0lHTkFMX1NFTEVDVCwgMiwKKwkJCSAgICBhazQ2NzFfcmluX211eF90ZXh0cyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0NjcxX3Jpbl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhazQ2NzFfcmluX211eF9lbnVtKTsKIApAQCAtNjE5LDIxICs2MTMsNyBAQAogCiBzdGF0aWMgaW50IGFrNDY3MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFrNDY3MV9wcml2ICphazQ2NzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIGFrNDY3MS0+Y29udHJvbF90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGFrNDY3MV9zbmRfY29udHJvbHMsCi0JCQkgICAgIEFSUkFZX1NJWkUoYWs0NjcxX3NuZF9jb250cm9scykpOwotCi0JYWs0NjcxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBhazQ2NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIH0KIAogc3RhdGljIGludCBhazQ2NzFfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTY0NiwyOCArNjI2LDM2IEBACiAJLnByb2JlID0gYWs0NjcxX3Byb2JlLAogCS5yZW1vdmUgPSBhazQ2NzFfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDY3MV9zZXRfYmlhc19sZXZlbCwKLQkucmVnX2NhY2hlX3NpemUgPSBBSzQ2NzFfQ0FDSEVSRUdOVU0sCi0JLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTgpLAotCS5yZWdfY2FjaGVfZGVmYXVsdCA9IGFrNDY3MV9yZWcsCisJLmNvbnRyb2xzID0gYWs0NjcxX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhazQ2NzFfc25kX2NvbnRyb2xzKSwKIAkuZGFwbV93aWRnZXRzID0gYWs0NjcxX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX2RhcG1fd2lkZ2V0cyksCiAJLmRhcG1fcm91dGVzID0gYWs0NjcxX2ludGVyY29uLAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDY3MV9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs0NjcxX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQUs0NjcxX1NBUl9BRENfQ09OVFJPTCwKKwkucmVnX2RlZmF1bHRzID0gYWs0NjcxX3JlZ19kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX3JlZ19kZWZhdWx0cyksCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCit9OworCiBzdGF0aWMgaW50IGFrNDY3MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RydWN0IGFrNDY3MV9wcml2ICphazQ2NzE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWludCByZXQ7CiAKLQlhazQ2NzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGFrNDY3MV9wcml2KSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmIChhazQ2NzEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhazQ2NzEpOwotCWFrNDY3MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWs0NjcxX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHJlZ21hcDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl9hazQ2NzEsICZhazQ2NzFfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmggYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5oCmluZGV4IDYxY2I3YWIuLjM5NGEzNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuaApAQCAtMTA1LDggKzEwNSw2IEBACiAjZGVmaW5lIEFLNDY3MV9ESUdJVEFMX01JWElOR19DT05UUk9MMgkJMHg1OQogI2RlZmluZSBBSzQ2NzFfU0FSX0FEQ19DT05UUk9MCQkJMHg1YQogCi0jZGVmaW5lIEFLNDY3MV9DQUNIRVJFR05VTQkJCShBSzQ2NzFfU0FSX0FEQ19DT05UUk9MICsgMSkKLQogLyogQml0ZmllbGQgRGVmaW5pdGlvbnMgKi8KIAogLyogQUs0NjcxX0FEX0RBX1BPV0VSX01BTkFHRU1FTlQgKDB4MDApIEZpZWxkcyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hbGM1NjIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYwppbmRleCBkMzAzNjI4Li4wOWY3ZTc3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMzgsMjYgKzM5LDEzIEBACiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IGFsYzU2MjNfcHJpdiB7Ci0JZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXU4IGlkOwogCXVuc2lnbmVkIGludCBzeXNjbGs7Ci0JdTE2IHJlZ19jYWNoZVtBTEM1NjIzX1ZFTkRPUl9JRDIrMl07CiAJdW5zaWduZWQgaW50IGFkZF9jdHJsOwogCXVuc2lnbmVkIGludCBqYWNrX2RldF9jdHJsOwogfTsKIAotc3RhdGljIHZvaWQgYWxjNTYyM19maWxsX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogbm90IHJlYWxseSBlZmZpY2llbnQgLi4uICovCi0JY29kZWMtPmNhY2hlX2J5cGFzcyA9IDE7Ci0JZm9yIChpID0gMCA7IGkgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSA7IGkgKz0gc3RlcCkKLQkJY2FjaGVbaV0gPSBzbmRfc29jX3JlYWQoY29kZWMsIGkpOwotCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBhbGM1NjIzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19SRVNFVCwgMCk7CkBAIC0yMjgsMzIgKzIxNiwzNyBAQAogCQkiVm1pZCIsICJIUE91dCBNaXgiLCAiU3BlYWtlciBNaXgiLCAiTW9ubyBNaXgifTsKIAogLyogYXV4b3V0IG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19hdXhfb3V0X2lucHV0X2VudW0gPQotU09DX0VOVU1fU0lOR0xFKEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDYsIDQsIGFsYzU2MjNfYXV4X291dF9pbnB1dF9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MjNfYXV4X291dF9pbnB1dF9lbnVtLAorCQkJICAgIEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDYsCisJCQkgICAgYWxjNTYyM19hdXhfb3V0X2lucHV0X3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19hdXhvdXRfbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWxjNTYyM19hdXhfb3V0X2lucHV0X2VudW0pOwogCiAvKiBzcGVha2VyIG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19zcGtvdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTAsIDQsIGFsYzU2MjNfc3Brb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYyM19zcGtvdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwKKwkJCSAgICBhbGM1NjIzX3Nwa291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfc3Brb3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3Brb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgbGVmdCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfaHBsX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA5LCAyLCBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA5LAorCQkJICAgIGFsYzU2MjNfaHBsX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHBsX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIGhlYWRwaG9uZSByaWdodCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfaHByX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA4LCAyLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA4LAorCQkJICAgIGFsYzU2MjNfaHByX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHByX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfc3BrX25fc291cl9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYyM19zcGtfbl9zb3VyX2VudW0sCisJCQkgICAgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTQsCisJCQkgICAgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19zcGtvdXRuX211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3BrX25fc291cl9lbnVtKTsKIApAQCAtMzM4LDggKzMzMSw5IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjNTYyM19hbXBfbmFtZXNbXSA9IHsiQUIgQW1wIiwgIkQgQW1wIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfYW1wX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMywgMiwgYWxjNTYyM19hbXBfbmFtZXMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MjNfYW1wX2VudW0sCisJCQkgICAgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsCisJCQkgICAgYWxjNTYyM19hbXBfbmFtZXMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfYW1wX211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2FtcF9lbnVtKTsKIApAQCAtODY5LDE4ICs4NjMsMjggQEAKIAogc3RhdGljIGludCBhbGM1NjIzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogeworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwogCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWxjNTYyMy0+cmVnbWFwLCB0cnVlKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFsYzU2MjNfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAyIDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIDsgaSArPSBzdGVwKQotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCBjYWNoZVtpXSk7CisJcmVnY2FjaGVfY2FjaGVfb25seShhbGM1NjIzLT5yZWdtYXAsIGZhbHNlKTsKKwlyZXQgPSByZWdjYWNoZV9zeW5jKGFsYzU2MjMtPnJlZ21hcCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzeW5jIHJlZ2lzdGVyIGNhY2hlOiAlZFxuIiwKKwkJCXJldCk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWxjNTYyMy0+cmVnbWFwLCB0cnVlKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlhbGM1NjIzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKQEAgLTkwMCwxNCArOTA0LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgYWxjNTYyMy0+Y29udHJvbF90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJYWxjNTYyM19yZXNldChjb2RlYyk7Ci0JYWxjNTYyM19maWxsX2NhY2hlKGNvZGVjKTsKIAogCS8qIHBvd2VyIG9uIGRldmljZSAqLwogCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKQEAgLTk4MCw5ICs5NzcsMTUgQEAKIAkuc3VzcGVuZCA9IGFsYzU2MjNfc3VzcGVuZCwKIAkucmVzdW1lID0gYWxjNTYyM19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gYWxjNTYyM19zZXRfYmlhc19sZXZlbCwKLQkucmVnX2NhY2hlX3NpemUgPSBBTEM1NjIzX1ZFTkRPUl9JRDIrMiwKLQkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAotCS5yZWdfY2FjaGVfc3RlcCA9IDIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWxjNTYyM19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSAxNiwKKwkucmVnX3N0cmlkZSA9IDIsCisKKwkubWF4X3JlZ2lzdGVyID0gQUxDNTYyM19WRU5ET1JfSUQyLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAogLyoKQEAgLTk5NiwxOSArOTk5LDMyIEBACiB7CiAJc3RydWN0IGFsYzU2MjNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGFsYzU2MjNfcHJpdiAqYWxjNTYyMzsKLQlpbnQgcmV0LCB2aWQxLCB2aWQyOworCXVuc2lnbmVkIGludCB2aWQxLCB2aWQyOworCWludCByZXQ7CiAKLQl2aWQxID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQUxDNTYyM19WRU5ET1JfSUQxKTsKLQlpZiAodmlkMSA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBJMkNcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwlhbGM1NjIzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmIChhbGM1NjIzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWxjNTYyMy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWxjNTYyM19yZWdtYXApOworCWlmIChJU19FUlIoYWxjNTYyMy0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKGFsYzU2MjMtPnJlZ21hcCk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpc2UgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChhbGM1NjIzLT5yZWdtYXAsIEFMQzU2MjNfVkVORE9SX0lEMSwgJnZpZDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgdmVuZG9yIElEMTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCXZpZDEgPSAoKHZpZDEgJiAweGZmKSA8PCA4KSB8ICh2aWQxID4+IDgpOwogCi0JdmlkMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFMQzU2MjNfVkVORE9SX0lEMik7Ci0JaWYgKHZpZDIgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgSTJDXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJcmV0ID0gcmVnbWFwX3JlYWQoYWxjNTYyMy0+cmVnbWFwLCBBTEM1NjIzX1ZFTkRPUl9JRDIsICZ2aWQyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWFkIHZlbmRvciBJRDI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmICgodmlkMSAhPSAweDEwZWMpIHx8ICh2aWQyICE9IGlkLT5kcml2ZXJfZGF0YSkpIHsKQEAgLTEwMjEsMTEgKzEwMzcsNiBAQAogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3VuZCBjb2RlYyBpZCA6IGFsYzU2JTAyeFxuIiwgdmlkMik7CiAKLQlhbGM1NjIzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChhbGM1NjIzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWlmIChwZGF0YSkgewogCQlhbGM1NjIzLT5hZGRfY3RybCA9IHBkYXRhLT5hZGRfY3RybDsKQEAgLTEwNDgsNyArMTA1OSw2IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWxjNTYyMyk7Ci0JYWxjNTYyMy0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCiAJCSZzb2NfY29kZWNfZGV2aWNlX2FsYzU2MjMsICZhbGM1NjIzX2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCmluZGV4IGZiMDAxYzUuLmVjMDcxYTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCkBAIC0yOTMsNTEgKzI5Myw1OSBAQAogCQkiQURDIExSIiwgIlZvaWNlIFN0ZXJlbyBEaWdpdGFsIn07CiAKIC8qIGF1eG91dCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfYXV4X291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA2LCA0LCBhbGM1NjMyX2F1eF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2F1eF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA2LAorCQkJICAgIGFsYzU2MzJfYXV4X291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfYXV4b3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJBdXhPdXQgTXV4IiwgYWxjNTYzMl9hdXhfb3V0X2lucHV0X2VudW0pOwogCiAvKiBzcGVha2VyIG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYzMl9zcGtvdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTAsIDQsIGFsYzU2MzJfc3Brb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9zcGtvdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwKKwkJCSAgICBhbGM1NjMyX3Nwa291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfc3Brb3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJTcGVha2VyT3V0IE11eCIsIGFsYzU2MzJfc3Brb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgbGVmdCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfaHBsX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA5LCAyLCBhbGM1NjMyX2hwbF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2hwbF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA5LAorCQkJICAgIGFsYzU2MzJfaHBsX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfaHBsX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiTGVmdCBIZWFkcGhvbmUgTXV4IiwgYWxjNTYzMl9ocGxfb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgcmlnaHQgb3V0cHV0IG11eCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgOCwgMiwgYWxjNTYzMl9ocHJfb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9ocHJfb3V0X2lucHV0X2VudW0sCisJCQkgICAgQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgOCwKKwkJCSAgICBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfc2VsKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjMyX2hwcl9vdXRfbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJpZ2h0IEhlYWRwaG9uZSBNdXgiLCBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfc3BrX25fc291cl9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYzMl9zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9zcGtfbl9zb3VyX2VudW0sCisJCQkgICAgQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTQsCisJCQkgICAgYWxjNTYzMl9zcGtfbl9zb3VyX3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYzMl9zcGtvdXRuX211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJTcGVha2VyT3V0IE4gTXV4IiwgYWxjNTYzMl9zcGtfbl9zb3VyX2VudW0pOwogCiAvKiBzcGVha2VyIGFtcGxpZmllciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MzJfYW1wX25hbWVzW10gPSB7IkFCIEFtcCIsICJEIEFtcCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2FtcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsIDIsIGFsYzU2MzJfYW1wX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2FtcF9lbnVtLAorCQkJICAgIEFMQzU2MzJfT1VUUFVUX01JWEVSX0NUUkwsIDEzLAorCQkJICAgIGFsYzU2MzJfYW1wX25hbWVzKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjMyX2FtcF9tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIkFCLUQgQW1wIE11eCIsIGFsYzU2MzJfYW1wX2VudW0pOwogCiAvKiBBREMgb3V0cHV0IHNlbGVjdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2FkY3JfZnVuY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9EQUNfRlVOQ19TRUxFQ1QsIDUsIDIsIGFsYzU2MzJfYWRjcl9mdW5jX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9hZGNyX2Z1bmNfZW51bSwKKwkJCSAgICBBTEM1NjMyX0RBQ19GVU5DX1NFTEVDVCwgNSwKKwkJCSAgICBhbGM1NjMyX2FkY3JfZnVuY19zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfYWRjcl9mdW5jX2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJBRENSIE11eCIsIGFsYzU2MzJfYWRjcl9mdW5jX2VudW0pOwogCiAvKiBJMlMgb3V0IHNlbGVjdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2kyc19vdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFMQzU2MzJfSTJTX09VVF9DVEwsIDUsIDIsIGFsYzU2MzJfaTJzX291dF9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MzJfaTJzX291dF9lbnVtLAorCQkJICAgIEFMQzU2MzJfSTJTX09VVF9DVEwsIDUsCisJCQkgICAgYWxjNTYzMl9pMnNfb3V0X3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYzMl9pMnNfb3V0X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJJMlNPdXQgTXV4IiwgYWxjNTYzMl9pMnNfb3V0X2VudW0pOwogCkBAIC0xMDU1LDE0ICsxMDYzLDYgQEAKIAlzdHJ1Y3QgYWxjNTYzMl9wcml2ICphbGM1NjMyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBhbGM1NjMyLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIHBvd2VyIG9uIGRldmljZSAgKi8KIAlhbGM1NjMyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKaW5kZXggZTQyOTVmZS4uMjllMTk4ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKQEAgLTUzLDYgKzUzLDE0IEBACiAjZGVmaW5lIEFSSVpPTkFfQUlGX1JYX0VOQUJMRVMgICAgICAgICAgICAgICAgICAweDFBCiAjZGVmaW5lIEFSSVpPTkFfQUlGX0ZPUkNFX1dSSVRFICAgICAgICAgICAgICAgICAweDFCCiAKKyNkZWZpbmUgQVJJWk9OQV9GTExfVkNPX0NPUk5FUiAxNDE5MDAwMDAKKyNkZWZpbmUgQVJJWk9OQV9GTExfTUFYX0ZSRUYgICAxMzUwMDAwMAorI2RlZmluZSBBUklaT05BX0ZMTF9NSU5fRlZDTyAgIDkwMDAwMDAwCisjZGVmaW5lIEFSSVpPTkFfRkxMX01BWF9GUkFUSU8gMTYKKyNkZWZpbmUgQVJJWk9OQV9GTExfTUFYX1JFRkRJViA4CisjZGVmaW5lIEFSSVpPTkFfRkxMX01JTl9PVVRESVYgMgorI2RlZmluZSBBUklaT05BX0ZMTF9NQVhfT1VURElWIDcKKwogI2RlZmluZSBhcml6b25hX2ZsbF9lcnIoX2ZsbCwgZm10LCAuLi4pIFwKIAlkZXZfZXJyKF9mbGwtPmFyaXpvbmEtPmRldiwgIkZMTCVkOiAiIGZtdCwgX2ZsbC0+aWQsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIGFyaXpvbmFfZmxsX3dhcm4oX2ZsbCwgZm10LCAuLi4pIFwKQEAgLTU0Miw2NyArNTUwLDc2IEBACiAJIjE1bXMvNmRCIiwgIjMwbXMvNmRCIiwKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2luX3ZkX3JhbXAgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0lOUFVUX1ZPTFVNRV9SQU1QLAotCQkJQVJJWk9OQV9JTl9WRF9SQU1QX1NISUZULCA3LCBhcml6b25hX3ZvbF9yYW1wX3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9pbl92ZF9yYW1wLAorCQkgICAgIEFSSVpPTkFfSU5QVVRfVk9MVU1FX1JBTVAsCisJCSAgICAgQVJJWk9OQV9JTl9WRF9SQU1QX1NISUZULAorCQkgICAgIGFyaXpvbmFfdm9sX3JhbXBfdGV4dCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX2luX3ZkX3JhbXApOwogCi1jb25zdCBzdHJ1Y3Qgc29jX2VudW0gYXJpem9uYV9pbl92aV9yYW1wID0KLQlTT0NfRU5VTV9TSU5HTEUoQVJJWk9OQV9JTlBVVF9WT0xVTUVfUkFNUCwKLQkJCUFSSVpPTkFfSU5fVklfUkFNUF9TSElGVCwgNywgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfaW5fdmlfcmFtcCwKKwkJICAgICBBUklaT05BX0lOUFVUX1ZPTFVNRV9SQU1QLAorCQkgICAgIEFSSVpPTkFfSU5fVklfUkFNUF9TSElGVCwKKwkJICAgICBhcml6b25hX3ZvbF9yYW1wX3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9pbl92aV9yYW1wKTsKIAotY29uc3Qgc3RydWN0IHNvY19lbnVtIGFyaXpvbmFfb3V0X3ZkX3JhbXAgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX09VVFBVVF9WT0xVTUVfUkFNUCwKLQkJCUFSSVpPTkFfT1VUX1ZEX1JBTVBfU0hJRlQsIDcsIGFyaXpvbmFfdm9sX3JhbXBfdGV4dCk7CitTT0NfRU5VTV9TSU5HTEVfREVDTChhcml6b25hX291dF92ZF9yYW1wLAorCQkgICAgIEFSSVpPTkFfT1VUUFVUX1ZPTFVNRV9SQU1QLAorCQkgICAgIEFSSVpPTkFfT1VUX1ZEX1JBTVBfU0hJRlQsCisJCSAgICAgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfb3V0X3ZkX3JhbXApOwogCi1jb25zdCBzdHJ1Y3Qgc29jX2VudW0gYXJpem9uYV9vdXRfdmlfcmFtcCA9Ci0JU09DX0VOVU1fU0lOR0xFKEFSSVpPTkFfT1VUUFVUX1ZPTFVNRV9SQU1QLAotCQkJQVJJWk9OQV9PVVRfVklfUkFNUF9TSElGVCwgNywgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfb3V0X3ZpX3JhbXAsCisJCSAgICAgQVJJWk9OQV9PVVRQVVRfVk9MVU1FX1JBTVAsCisJCSAgICAgQVJJWk9OQV9PVVRfVklfUkFNUF9TSElGVCwKKwkJICAgICBhcml6b25hX3ZvbF9yYW1wX3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9vdXRfdmlfcmFtcCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcml6b25hX2xocGZfbW9kZV90ZXh0W10gPSB7CiAJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYxX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGMV8xLCBBUklaT05BX0xIUEYxX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjFfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGMV8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjFfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjFfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGMl8xLCBBUklaT05BX0xIUEYyX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjJfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGMl8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjJfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjJfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYzX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGM18xLCBBUklaT05BX0xIUEYzX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjNfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGM18xLAorCQkgICAgIEFSSVpPTkFfTEhQRjNfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjNfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGY0X21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGNF8xLCBBUklaT05BX0xIUEY0X01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjRfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGNF8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjRfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjRfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcml6b25hX25nX2hvbGRfdGV4dFtdID0gewogCSIzMG1zIiwgIjEyMG1zIiwgIjI1MG1zIiwgIjUwMG1zIiwKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX25nX2hvbGQgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX05PSVNFX0dBVEVfQ09OVFJPTCwgQVJJWk9OQV9OR0FURV9IT0xEX1NISUZULAotCQkJNCwgYXJpem9uYV9uZ19ob2xkX3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9uZ19ob2xkLAorCQkgICAgIEFSSVpPTkFfTk9JU0VfR0FURV9DT05UUk9MLAorCQkgICAgIEFSSVpPTkFfTkdBVEVfSE9MRF9TSElGVCwKKwkJICAgICBhcml6b25hX25nX2hvbGRfdGV4dCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX25nX2hvbGQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFyaXpvbmFfaW5faHBmX2N1dF90ZXh0W10gPSB7CiAJIjIuNUh6IiwgIjVIeiIsICIxMEh6IiwgIjIwSHoiLCAiNDBIeiIKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2luX2hwZl9jdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFSSVpPTkFfSFBGX0NPTlRST0wsIEFSSVpPTkFfSU5fSFBGX0NVVF9TSElGVCwKLQkJCUFSUkFZX1NJWkUoYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpLAotCQkJYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9pbl9ocGZfY3V0X2VudW0sCisJCSAgICAgQVJJWk9OQV9IUEZfQ09OVFJPTCwKKwkJICAgICBBUklaT05BX0lOX0hQRl9DVVRfU0hJRlQsCisJCSAgICAgYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9pbl9ocGZfY3V0X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFyaXpvbmFfaW5fZG1pY19vc3JfdGV4dFtdID0gewpAQCAtMTM3Nyw3NCArMTM5NCwxNDcgQEAKIAlpbnQgZ2FpbjsKIH07CiAKK3N0YXRpYyBpbnQgYXJpem9uYV92YWxpZGF0ZV9mbGwoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsCisJCQkJdW5zaWduZWQgaW50IEZyZWYsCisJCQkJdW5zaWduZWQgaW50IEZvdXQpCit7CisJdW5zaWduZWQgaW50IEZ2Y29fbWluOworCisJaWYgKEZyZWYgLyBBUklaT05BX0ZMTF9NQVhfUkVGRElWID4gQVJJWk9OQV9GTExfTUFYX0ZSRUYpIHsKKwkJYXJpem9uYV9mbGxfZXJyKGZsbCwKKwkJCQkiQ2FuJ3Qgc2NhbGUgJWRNSHogaW4gdG8gPD0xMy41TUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlGdmNvX21pbiA9IEFSSVpPTkFfRkxMX01JTl9GVkNPICogZmxsLT52Y29fbXVsdDsKKwlpZiAoRm91dCAqIEFSSVpPTkFfRkxMX01BWF9PVVRESVYgPCBGdmNvX21pbikgeworCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiTm8gRkxMX09VVERJViBmb3IgRm91dD0ldUh6XG4iLAorCQkJCUZvdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcml6b25hX2ZpbmRfZnJhdGlvKHVuc2lnbmVkIGludCBGcmVmLCBpbnQgKmZyYXRpbykKK3sKKwlpbnQgaTsKKworCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgRkxMX0ZSQVRJTyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZsbF9mcmF0aW9zKTsgaSsrKSB7CisJCWlmIChmbGxfZnJhdGlvc1tpXS5taW4gPD0gRnJlZiAmJiBGcmVmIDw9IGZsbF9mcmF0aW9zW2ldLm1heCkgeworCQkJaWYgKGZyYXRpbykKKwkJCQkqZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZnJhdGlvOworCQkJcmV0dXJuIGZsbF9mcmF0aW9zW2ldLnJhdGlvOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYXJpem9uYV9jYWxjX2ZyYXRpbyhzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwKKwkJCSAgICAgICBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnICpjZmcsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgRnJlZiwgYm9vbCBzeW5jKQoreworCWludCBpbml0X3JhdGlvLCByYXRpbzsKKwlpbnQgcmVmZGl2LCBkaXY7CisKKwkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6LCBmaW5kIGluaXRpYWwgcmVmZGl2ICovCisJZGl2ID0gMTsKKwljZmctPnJlZmRpdiA9IDA7CisJd2hpbGUgKEZyZWYgPiBBUklaT05BX0ZMTF9NQVhfRlJFRikgeworCQlkaXYgKj0gMjsKKwkJRnJlZiAvPSAyOworCQljZmctPnJlZmRpdisrOworCisJCWlmIChkaXYgPiBBUklaT05BX0ZMTF9NQVhfUkVGRElWKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmluZCBhbiBhcHByb3ByaWF0ZSBGTExfRlJBVElPICovCisJaW5pdF9yYXRpbyA9IGFyaXpvbmFfZmluZF9mcmF0aW8oRnJlZiwgJmNmZy0+ZnJhdGlvKTsKKwlpZiAoaW5pdF9yYXRpbyA8IDApIHsKKwkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIlVuYWJsZSB0byBmaW5kIEZSQVRJTyBmb3IgRnJlZj0ldUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gaW5pdF9yYXRpbzsKKwl9CisKKwlzd2l0Y2ggKGZsbC0+YXJpem9uYS0+dHlwZSkgeworCWNhc2UgV001MTEwOgorCQlpZiAoZmxsLT5hcml6b25hLT5yZXYgPCAzIHx8IHN5bmMpCisJCQlyZXR1cm4gaW5pdF9yYXRpbzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGluaXRfcmF0aW87CisJfQorCisJY2ZnLT5mcmF0aW8gPSBpbml0X3JhdGlvIC0gMTsKKworCS8qIEFkanVzdCBGUkFUSU8vcmVmZGl2IHRvIGF2b2lkIGludGVnZXIgbW9kZSBpZiBwb3NzaWJsZSAqLworCXJlZmRpdiA9IGNmZy0+cmVmZGl2OworCisJd2hpbGUgKGRpdiA8PSBBUklaT05BX0ZMTF9NQVhfUkVGRElWKSB7CisJCWZvciAocmF0aW8gPSBpbml0X3JhdGlvOyByYXRpbyA8PSBBUklaT05BX0ZMTF9NQVhfRlJBVElPOworCQkgICAgIHJhdGlvKyspIHsKKwkJCWlmICh0YXJnZXQgJSAocmF0aW8gKiBGcmVmKSkgeworCQkJCWNmZy0+cmVmZGl2ID0gcmVmZGl2OworCQkJCWNmZy0+ZnJhdGlvID0gcmF0aW8gLSAxOworCQkJCXJldHVybiByYXRpbzsKKwkJCX0KKwkJfQorCisJCWZvciAocmF0aW8gPSBpbml0X3JhdGlvIC0gMTsgcmF0aW8gPj0gMDsgcmF0aW8tLSkgeworCQkJaWYgKEFSSVpPTkFfRkxMX1ZDT19DT1JORVIgLyAoZmxsLT52Y29fbXVsdCAqIHJhdGlvKSA8CisJCQkgICAgRnJlZikKKwkJCQlicmVhazsKKworCQkJaWYgKHRhcmdldCAlIChyYXRpbyAqIEZyZWYpKSB7CisJCQkJY2ZnLT5yZWZkaXYgPSByZWZkaXY7CisJCQkJY2ZnLT5mcmF0aW8gPSByYXRpbyAtIDE7CisJCQkJcmV0dXJuIHJhdGlvOworCQkJfQorCQl9CisKKwkJZGl2ICo9IDI7CisJCUZyZWYgLz0gMjsKKwkJcmVmZGl2Kys7CisJCWluaXRfcmF0aW8gPSBhcml6b25hX2ZpbmRfZnJhdGlvKEZyZWYsIE5VTEwpOworCX0KKworCWFyaXpvbmFfZmxsX3dhcm4oZmxsLCAiRmFsbGluZyBiYWNrIHRvIGludGVnZXIgbW9kZSBvcGVyYXRpb25cbiIpOworCXJldHVybiBjZmctPmZyYXRpbyArIDE7Cit9CisKIHN0YXRpYyBpbnQgYXJpem9uYV9jYWxjX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwKIAkJCSAgICBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnICpjZmcsCi0JCQkgICAgdW5zaWduZWQgaW50IEZyZWYsCi0JCQkgICAgdW5zaWduZWQgaW50IEZvdXQpCisJCQkgICAgdW5zaWduZWQgaW50IEZyZWYsIGJvb2wgc3luYykKIHsKIAl1bnNpZ25lZCBpbnQgdGFyZ2V0LCBkaXYsIGdjZF9mbGw7CiAJaW50IGksIHJhdGlvOwogCi0JYXJpem9uYV9mbGxfZGJnKGZsbCwgIkZyZWY9JXUgRm91dD0ldVxuIiwgRnJlZiwgRm91dCk7Ci0KLQkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6ICovCi0JZGl2ID0gMTsKLQljZmctPnJlZmRpdiA9IDA7Ci0Jd2hpbGUgKChGcmVmIC8gZGl2KSA+IDEzNTAwMDAwKSB7Ci0JCWRpdiAqPSAyOwotCQljZmctPnJlZmRpdisrOwotCi0JCWlmIChkaXYgPiA4KSB7Ci0JCQlhcml6b25hX2ZsbF9lcnIoZmxsLAotCQkJCQkiQ2FuJ3Qgc2NhbGUgJWRNSHogaW4gdG8gPD0xMy41TUh6XG4iLAotCQkJCQlGcmVmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JLyogQXBwbHkgdGhlIGRpdmlzaW9uIGZvciBvdXIgcmVtYWluaW5nIGNhbGN1bGF0aW9ucyAqLwotCUZyZWYgLz0gZGl2OworCWFyaXpvbmFfZmxsX2RiZyhmbGwsICJGcmVmPSV1IEZvdXQ9JXVcbiIsIEZyZWYsIGZsbC0+Zm91dCk7CiAKIAkvKiBGdmNvIHNob3VsZCBiZSBvdmVyIHRoZSB0YXJndDsgZG9uJ3QgY2hlY2sgdGhlIHVwcGVyIGJvdW5kICovCi0JZGl2ID0gMTsKLQl3aGlsZSAoRm91dCAqIGRpdiA8IDkwMDAwMDAwICogZmxsLT52Y29fbXVsdCkgeworCWRpdiA9IEFSSVpPTkFfRkxMX01JTl9PVVRESVY7CisJd2hpbGUgKGZsbC0+Zm91dCAqIGRpdiA8IEFSSVpPTkFfRkxMX01JTl9GVkNPICogZmxsLT52Y29fbXVsdCkgewogCQlkaXYrKzsKLQkJaWYgKGRpdiA+IDcpIHsKLQkJCWFyaXpvbmFfZmxsX2VycihmbGwsICJObyBGTExfT1VURElWIGZvciBGb3V0PSV1SHpcbiIsCi0JCQkJCUZvdXQpOworCQlpZiAoZGl2ID4gQVJJWk9OQV9GTExfTUFYX09VVERJVikKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAJfQotCXRhcmdldCA9IEZvdXQgKiBkaXYgLyBmbGwtPnZjb19tdWx0OworCXRhcmdldCA9IGZsbC0+Zm91dCAqIGRpdiAvIGZsbC0+dmNvX211bHQ7CiAJY2ZnLT5vdXRkaXYgPSBkaXY7CiAKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiRnZjbz0lZEh6XG4iLCB0YXJnZXQpOwogCi0JLyogRmluZCBhbiBhcHByb3ByYWl0ZSBGTExfRlJBVElPIGFuZCBmYWN0b3IgaXQgb3V0IG9mIHRoZSB0YXJnZXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmbGxfZnJhdGlvcyk7IGkrKykgewotCQlpZiAoZmxsX2ZyYXRpb3NbaV0ubWluIDw9IEZyZWYgJiYgRnJlZiA8PSBmbGxfZnJhdGlvc1tpXS5tYXgpIHsKLQkJCWNmZy0+ZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZnJhdGlvOwotCQkJcmF0aW8gPSBmbGxfZnJhdGlvc1tpXS5yYXRpbzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IEFSUkFZX1NJWkUoZmxsX2ZyYXRpb3MpKSB7Ci0JCWFyaXpvbmFfZmxsX2VycihmbGwsICJVbmFibGUgdG8gZmluZCBGUkFUSU8gZm9yIEZyZWY9JXVIelxuIiwKLQkJCQlGcmVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgRkxMX0ZSQVRJTyBhbmQgcmVmZGl2ICovCisJcmF0aW8gPSBhcml6b25hX2NhbGNfZnJhdGlvKGZsbCwgY2ZnLCB0YXJnZXQsIEZyZWYsIHN5bmMpOworCWlmIChyYXRpbyA8IDApCisJCXJldHVybiByYXRpbzsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZsbF9nYWlucyk7IGkrKykgewotCQlpZiAoZmxsX2dhaW5zW2ldLm1pbiA8PSBGcmVmICYmIEZyZWYgPD0gZmxsX2dhaW5zW2ldLm1heCkgewotCQkJY2ZnLT5nYWluID0gZmxsX2dhaW5zW2ldLmdhaW47Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGZsbF9nYWlucykpIHsKLQkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIlVuYWJsZSB0byBmaW5kIGdhaW4gZm9yIEZyZWY9JXVIelxuIiwKLQkJCQlGcmVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEFwcGx5IHRoZSBkaXZpc2lvbiBmb3Igb3VyIHJlbWFpbmluZyBjYWxjdWxhdGlvbnMgKi8KKwlGcmVmID0gRnJlZiAvICgxIDw8IGNmZy0+cmVmZGl2KTsKIAogCWNmZy0+biA9IHRhcmdldCAvIChyYXRpbyAqIEZyZWYpOwogCkBAIC0xNDY5LDYgKzE1NTksMTggQEAKIAkJY2ZnLT5sYW1iZGEgPj49IDE7CiAJfQogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmxsX2dhaW5zKTsgaSsrKSB7CisJCWlmIChmbGxfZ2FpbnNbaV0ubWluIDw9IEZyZWYgJiYgRnJlZiA8PSBmbGxfZ2FpbnNbaV0ubWF4KSB7CisJCQljZmctPmdhaW4gPSBmbGxfZ2FpbnNbaV0uZ2FpbjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUoZmxsX2dhaW5zKSkgeworCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiVW5hYmxlIHRvIGZpbmQgZ2FpbiBmb3IgRnJlZj0ldUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiTj0leCBUSEVUQT0leCBMQU1CREE9JXhcbiIsCiAJCQljZmctPm4sIGNmZy0+dGhldGEsIGNmZy0+bGFtYmRhKTsKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiRlJBVElPPSV4KCVkKSBPVVRESVY9JXggUkVGQ0xLX0RJVj0leFxuIiwKQEAgLTE0OTYsMTQgKzE1OTgsMTggQEAKIAkJCQkgY2ZnLT5yZWZkaXYgPDwgQVJJWk9OQV9GTEwxX0NMS19SRUZfRElWX1NISUZUIHwKIAkJCQkgc291cmNlIDw8IEFSSVpPTkFfRkxMMV9DTEtfUkVGX1NSQ19TSElGVCk7CiAKLQlpZiAoc3luYykKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDB4NywKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCi0JCQkJCSBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOwotCWVsc2UKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDB4OSwKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCi0JCQkJCSBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOworCWlmIChzeW5jKSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAweDcsCisJCQkJICAgQVJJWk9OQV9GTEwxX0dBSU5fTUFTSywKKwkJCQkgICBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOworCX0gZWxzZSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAweDUsCisJCQkJICAgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLLAorCQkJCSAgIGNmZy0+b3V0ZGl2IDw8IEFSSVpPTkFfRkxMMV9PVVRESVZfU0hJRlQpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMHg5LAorCQkJCSAgIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCisJCQkJICAgY2ZnLT5nYWluIDw8IEFSSVpPTkFfRkxMMV9HQUlOX1NISUZUKTsKKwl9CiAKIAlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMiwKIAkJCQkgQVJJWk9OQV9GTEwxX0NUUkxfVVBEIHwgQVJJWk9OQV9GTEwxX05fTUFTSywKQEAgLTE1MjYsMTMgKzE2MzIsMTIgQEAKIAlyZXR1cm4gcmVnICYgQVJJWk9OQV9GTEwxX0VOQTsKIH0KIAotc3RhdGljIHZvaWQgYXJpem9uYV9lbmFibGVfZmxsKHN0cnVjdCBhcml6b25hX2ZsbCAqZmxsLAotCQkJICAgICAgc3RydWN0IGFyaXpvbmFfZmxsX2NmZyAqcmVmLAotCQkJICAgICAgc3RydWN0IGFyaXpvbmFfZmxsX2NmZyAqc3luYykKK3N0YXRpYyB2b2lkIGFyaXpvbmFfZW5hYmxlX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCkKIHsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGZsbC0+YXJpem9uYTsKIAlpbnQgcmV0OwogCWJvb2wgdXNlX3N5bmMgPSBmYWxzZTsKKwlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIGNmZzsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSBib3RoIFJFRkNMSyBhbmQgU1lOQ0NMSyB0aGVuIGVuYWJsZSBib3RoLApAQCAtMTU0MCwyMyArMTY0NSwyMSBAQAogCSAqLwogCWlmIChmbGwtPnJlZl9zcmMgPj0gMCAmJiBmbGwtPnJlZl9mcmVxICYmCiAJICAgIGZsbC0+cmVmX3NyYyAhPSBmbGwtPnN5bmNfc3JjKSB7Ci0JCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDUsCi0JCQkJCSBBUklaT05BX0ZMTDFfT1VURElWX01BU0ssCi0JCQkJCSByZWYtPm91dGRpdiA8PCBBUklaT05BX0ZMTDFfT1VURElWX1NISUZUKTsKKwkJYXJpem9uYV9jYWxjX2ZsbChmbGwsICZjZmcsIGZsbC0+cmVmX2ZyZXEsIGZhbHNlKTsKIAotCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsIHJlZiwgZmxsLT5yZWZfc3JjLAorCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsICZjZmcsIGZsbC0+cmVmX3NyYywKIAkJCQkgIGZhbHNlKTsKIAkJaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewotCQkJYXJpem9uYV9hcHBseV9mbGwoYXJpem9uYSwgZmxsLT5iYXNlICsgMHgxMCwgc3luYywKKwkJCWFyaXpvbmFfY2FsY19mbGwoZmxsLCAmY2ZnLCBmbGwtPnN5bmNfZnJlcSwgdHJ1ZSk7CisKKwkJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSArIDB4MTAsICZjZmcsCiAJCQkJCSAgZmxsLT5zeW5jX3NyYywgdHJ1ZSk7CiAJCQl1c2Vfc3luYyA9IHRydWU7CiAJCX0KIAl9IGVsc2UgaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyA1LAotCQkJCQkgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLLAotCQkJCQkgc3luYy0+b3V0ZGl2IDw8IEFSSVpPTkFfRkxMMV9PVVRESVZfU0hJRlQpOworCQlhcml6b25hX2NhbGNfZmxsKGZsbCwgJmNmZywgZmxsLT5zeW5jX2ZyZXEsIGZhbHNlKTsKIAotCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsIHN5bmMsCisJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSwgJmNmZywKIAkJCQkgIGZsbC0+c3luY19zcmMsIGZhbHNlKTsKIAogCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAweDExLApAQCAtMTYxOCwzMiArMTcyMSwyMiBAQAogaW50IGFyaXpvbmFfc2V0X2ZsbF9yZWZjbGsoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsIGludCBzb3VyY2UsCiAJCQkgICB1bnNpZ25lZCBpbnQgRnJlZiwgdW5zaWduZWQgaW50IEZvdXQpCiB7Ci0Jc3RydWN0IGFyaXpvbmFfZmxsX2NmZyByZWYsIHN5bmM7CiAJaW50IHJldDsKIAogCWlmIChmbGwtPnJlZl9zcmMgPT0gc291cmNlICYmIGZsbC0+cmVmX2ZyZXEgPT0gRnJlZikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZmxsLT5mb3V0KSB7Ci0JCWlmIChGcmVmID4gMCkgewotCQkJcmV0ID0gYXJpem9uYV9jYWxjX2ZsbChmbGwsICZyZWYsIEZyZWYsIGZsbC0+Zm91dCk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWlmIChmbGwtPnN5bmNfc3JjID49IDApIHsKLQkJCXJldCA9IGFyaXpvbmFfY2FsY19mbGwoZmxsLCAmc3luYywgZmxsLT5zeW5jX2ZyZXEsCi0JCQkJCSAgICAgICBmbGwtPmZvdXQpOwotCQkJaWYgKHJldCAhPSAwKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KKwlpZiAoZmxsLT5mb3V0ICYmIEZyZWYgPiAwKSB7CisJCXJldCA9IGFyaXpvbmFfdmFsaWRhdGVfZmxsKGZsbCwgRnJlZiwgZmxsLT5mb3V0KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlmbGwtPnJlZl9zcmMgPSBzb3VyY2U7CiAJZmxsLT5yZWZfZnJlcSA9IEZyZWY7CiAKIAlpZiAoZmxsLT5mb3V0ICYmIEZyZWYgPiAwKSB7Ci0JCWFyaXpvbmFfZW5hYmxlX2ZsbChmbGwsICZyZWYsICZzeW5jKTsKKwkJYXJpem9uYV9lbmFibGVfZmxsKGZsbCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjUzLDcgKzE3NDYsNiBAQAogaW50IGFyaXpvbmFfc2V0X2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwgaW50IHNvdXJjZSwKIAkJICAgIHVuc2lnbmVkIGludCBGcmVmLCB1bnNpZ25lZCBpbnQgRm91dCkKIHsKLQlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIHJlZiwgc3luYzsKIAlpbnQgcmV0OwogCiAJaWYgKGZsbC0+c3luY19zcmMgPT0gc291cmNlICYmCkBAIC0xNjYyLDEzICsxNzU0LDEyIEBACiAKIAlpZiAoRm91dCkgewogCQlpZiAoZmxsLT5yZWZfc3JjID49IDApIHsKLQkJCXJldCA9IGFyaXpvbmFfY2FsY19mbGwoZmxsLCAmcmVmLCBmbGwtPnJlZl9mcmVxLAotCQkJCQkgICAgICAgRm91dCk7CisJCQlyZXQgPSBhcml6b25hX3ZhbGlkYXRlX2ZsbChmbGwsIGZsbC0+cmVmX2ZyZXEsIEZvdXQpOwogCQkJaWYgKHJldCAhPSAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlyZXQgPSBhcml6b25hX2NhbGNfZmxsKGZsbCwgJnN5bmMsIEZyZWYsIEZvdXQpOworCQlyZXQgPSBhcml6b25hX3ZhbGlkYXRlX2ZsbChmbGwsIEZyZWYsIEZvdXQpOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE2NzgsNyArMTc2OSw3IEBACiAJZmxsLT5mb3V0ID0gRm91dDsKIAogCWlmIChGb3V0KSB7Ci0JCWFyaXpvbmFfZW5hYmxlX2ZsbChmbGwsICZyZWYsICZzeW5jKTsKKwkJYXJpem9uYV9lbmFibGVfZmxsKGZsbCk7CiAJfSBlbHNlIHsKIAkJYXJpem9uYV9kaXNhYmxlX2ZsbChmbGwpOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCmluZGV4IDQzNzM3YTI3Li4xZTI1YzdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKQEAgLTEzOCw5ICsxMzgsOCBAQAogCXN0cnVjdCBkYXZpbmNpX3ZjICpkYXZpbmNpX3ZjID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAogCWRhdmluY2lfdmMtPmNxOTN2Yy5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkYXZpbmNpX3ZjLT5yZWdtYXA7CiAKLQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMzIsIDMyLCBTTkRfU09DX1JFR01BUCk7CisJc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIGRhdmluY2lfdmMtPnJlZ21hcCk7CiAKIAkvKiBPZmYsIHdpdGggcG93ZXIgb24gKi8KIAljcTkzdmNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IDgzYzgzNWQuLjM5MjBlNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtNTA2LDE1ICs1MDYsNiBAQAogCXN0cnVjdCBjczQyNzBfcHJpdmF0ZSAqY3M0MjcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCS8qIFRlbGwgQVNvQyB3aGF0IGtpbmQgb2YgSS9PIHRvIHVzZSB0byByZWFkIHRoZSByZWdpc3RlcnMuICBBU29DIHdpbGwKLQkgKiB0aGVuIGRvIHRoZSBJMkMgdHJhbnNhY3Rpb25zIGl0c2VsZi4KLQkgKi8KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9PIChyZXQ9JWkpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIERpc2FibGUgYXV0by1tdXRlLiAgVGhpcyBmZWF0dXJlIGFwcGVhcnMgdG8gYmUgYnVnZ3kuICBJbiBzb21lCiAJICogc2l0dWF0aW9ucywgYXV0by1tdXRlIHdpbGwgbm90IGRlYWN0aXZhdGUgd2hlbiBpdCBzaG91bGQsIHNvIHdlIHdhbnQKIAkgKiB0aGlzIGZlYXR1cmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIEFuIGFwcGxpY2F0aW9uIChlLmcuIGFsc2FjdGwpIGNhbgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKaW5kZXggY2UwNWZkOS4uYWVmNDk2NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCkBAIC0xNTksNyArMTU5LDYgQEAKIH0KIAogc3RydWN0IGNzNDI3MV9wcml2YXRlIHsKLQkvKiBTTkRfU09DX0kyQyBvciBTTkRfU09DX1NQSSAqLwogCXVuc2lnbmVkIGludAkJCW1jbGs7CiAJYm9vbAkJCQltYXN0ZXI7CiAJYm9vbAkJCQlkZWVtcGg7CkBAIC01NDAsMTQgKzUzOSwxMCBAQAogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IGNzNDI3MV9wbGF0Zm9ybV9kYXRhICpjczQyNzFwbGF0ID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlpbnQgcmV0OwotCWludCBncGlvX25yZXNldCA9IC1FSU5WQUw7CiAJYm9vbCBhbXV0ZWNfZXFfYm11dGVjID0gZmFsc2U7CiAKICNpZmRlZiBDT05GSUdfT0YKIAlpZiAob2ZfbWF0Y2hfZGV2aWNlKGNzNDI3MV9kdF9pZHMsIGNvZGVjLT5kZXYpKSB7Ci0JCWdwaW9fbnJlc2V0ID0gb2ZfZ2V0X25hbWVkX2dwaW8oY29kZWMtPmRldi0+b2Zfbm9kZSwKLQkJCQkJCSJyZXNldC1ncGlvIiwgMCk7Ci0KIAkJaWYgKG9mX2dldF9wcm9wZXJ0eShjb2RlYy0+ZGV2LT5vZl9ub2RlLAogCQkJCSAgICAgImNpcnJ1cyxhbXV0ZWMtZXEtYm11dGVjIiwgTlVMTCkpCiAJCQlhbXV0ZWNfZXFfYm11dGVjID0gdHJ1ZTsKQEAgLTU1OSwyNyArNTU0LDE5IEBACiAjZW5kaWYKIAogCWlmIChjczQyNzFwbGF0KSB7Ci0JCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MXBsYXQtPmdwaW9fbnJlc2V0KSkKLQkJCWdwaW9fbnJlc2V0ID0gY3M0MjcxcGxhdC0+Z3Bpb19ucmVzZXQ7Ci0KIAkJYW11dGVjX2VxX2JtdXRlYyA9IGNzNDI3MXBsYXQtPmFtdXRlY19lcV9ibXV0ZWM7CiAJCWNzNDI3MS0+ZW5hYmxlX3NvZnRfcmVzZXQgPSBjczQyNzFwbGF0LT5lbmFibGVfc29mdF9yZXNldDsKIAl9CiAKLQlpZiAoZ3Bpb19ucmVzZXQgPj0gMCkKLQkJaWYgKGRldm1fZ3Bpb19yZXF1ZXN0KGNvZGVjLT5kZXYsIGdwaW9fbnJlc2V0LCAiQ1M0MjcxIFJlc2V0IikpCi0JCQlncGlvX25yZXNldCA9IC1FSU5WQUw7Ci0JaWYgKGdwaW9fbnJlc2V0ID49IDApIHsKKwlpZiAoZ3Bpb19pc192YWxpZChjczQyNzEtPmdwaW9fbnJlc2V0KSkgewogCQkvKiBSZXNldCBjb2RlYyAqLwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpb19ucmVzZXQsIDApOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoY3M0MjcxLT5ncGlvX25yZXNldCwgMCk7CiAJCXVkZWxheSgxKTsKLQkJZ3Bpb19zZXRfdmFsdWUoZ3Bpb19ucmVzZXQsIDEpOworCQlncGlvX3NldF92YWx1ZShjczQyNzEtPmdwaW9fbnJlc2V0LCAxKTsKIAkJLyogR2l2ZSB0aGUgY29kZWMgdGltZSB0byB3YWtlIHVwICovCiAJCXVkZWxheSgxKTsKIAl9CiAKLQljczQyNzEtPmdwaW9fbnJlc2V0ID0gZ3Bpb19ucmVzZXQ7Ci0KIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY3M0MjcxLT5yZWdtYXAsIENTNDI3MV9NT0RFMiwKIAkJCQkgQ1M0MjcxX01PREUyX1BETiB8IENTNDI3MV9NT0RFMl9DUEVOLAogCQkJCSBDUzQyNzFfTU9ERTJfUEROIHwgQ1M0MjcxX01PREUyX0NQRU4pOwpAQCAtNjI1LDYgKzYxMiwzNiBAQAogCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3JvdXRlcyksCiB9OwogCitzdGF0aWMgaW50IGNzNDI3MV9jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqKmMpCit7CisJc3RydWN0IGNzNDI3MV9wbGF0Zm9ybV9kYXRhICpjczQyNzFwbGF0ID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxOworCisJY3M0MjcxID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjczQyNzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzNDI3MSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAob2ZfbWF0Y2hfZGV2aWNlKGNzNDI3MV9kdF9pZHMsIGRldikpCisJCWNzNDI3MS0+Z3Bpb19ucmVzZXQgPQorCQkJb2ZfZ2V0X25hbWVkX2dwaW8oZGV2LT5vZl9ub2RlLCAicmVzZXQtZ3BpbyIsIDApOworCisJaWYgKGNzNDI3MXBsYXQpCisJCWNzNDI3MS0+Z3Bpb19ucmVzZXQgPSBjczQyNzFwbGF0LT5ncGlvX25yZXNldDsKKworCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MS0+Z3Bpb19ucmVzZXQpKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3QoZGV2LCBjczQyNzEtPmdwaW9fbnJlc2V0LAorCQkJCQkiQ1M0MjcxIFJlc2V0Iik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkqYyA9IGNzNDI3MTsKKwlyZXR1cm4gMDsKK30KKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQyNzFfc3BpX3JlZ21hcCA9IHsKQEAgLTY0NCwxMCArNjYxLDExIEBACiBzdGF0aWMgaW50IGNzNDI3MV9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgY3M0MjcxX3ByaXZhdGUgKmNzNDI3MTsKKwlpbnQgcmV0OwogCi0JY3M0MjcxID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpjczQyNzEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNzNDI3MSkKLQkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gY3M0MjcxX2NvbW1vbl9wcm9iZSgmc3BpLT5kZXYsICZjczQyNzEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgY3M0MjcxKTsKIAljczQyNzEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmNzNDI3MV9zcGlfcmVnbWFwKTsKQEAgLTY5OCwxMCArNzE2LDExIEBACiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxOworCWludCByZXQ7CiAKLQljczQyNzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmNzNDI3MSksIEdGUF9LRVJORUwpOwotCWlmICghY3M0MjcxKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBjczQyNzFfY29tbW9uX3Byb2JlKCZjbGllbnQtPmRldiwgJmNzNDI3MSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjczQyNzEpOwogCWNzNDI3MS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmY3M0MjcxX2kyY19yZWdtYXApOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwppbmRleCA2ZTllYTgzLi42YzBkYTJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAogI2luY2x1ZGUgImNzNDJsNTEuaCIKIApAQCAtNDAsNyArNDEsNiBAQAogfTsKIAogc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSB7Ci0JZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJdW5zaWduZWQgaW50IG1jbGs7CiAJdW5zaWduZWQgaW50IGF1ZGlvX21vZGU7CS8qIFRoZSBtb2RlIChJMlMgb3IgbGVmdC1qdXN0aWZpZWQpICovCiAJZW51bSBtYXN0ZXJfc2xhdmVfbW9kZSBmdW5jOwpAQCAtNTIsMjQgKzUyLDYgQEAKIAkJU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0JFIHwgXAogCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSAgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSkKIAotc3RhdGljIGludCBjczQybDUxX2ZpbGxfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGUgKyAxOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKLQlzMzIgbGVuZ3RoOwotCi0JbGVuZ3RoID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoaTJjX2NsaWVudCwKLQkJCUNTNDJMNTFfRklSU1RSRUcgfCAweDgwLCBDUzQyTDUxX05VTVJFR1MsIGNhY2hlKTsKLQlpZiAobGVuZ3RoICE9IENTNDJMNTFfTlVNUkVHUykgewotCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsCi0JCQkJIkkyQyByZWFkIGZhaWx1cmUsIGFkZHI9MHgleCAocmV0PSVkIHZzICVkKVxuIiwKLQkJCQlpMmNfY2xpZW50LT5hZGRyLCBsZW5ndGgsIENTNDJMNTFfTlVNUkVHUyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNzNDJsNTFfZ2V0X2NoYW5fbWl4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC0xMjQsOSArMTA2LDggQEAKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY19wY21fdGx2LCAtNTE1MCwgNTAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHRvbmVfdGx2LCAtMTA1MCwgMTUwLCAwKTsKLS8qIFRoaXMgaXMgYSBsaWUuIGFmdGVyIC0xMDIgZGIsIGl0IHN0YXlzIGF0IC0xMDIgKi8KLS8qIG1heWJlIGEgcmFuZ2Ugd291bGQgYmUgYmV0dGVyICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW91dF90bHYsIC0xMTU1MCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW91dF90bHYsIC0xMDIwMCwgNTAsIDApOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYm9vc3RfdGx2LCAxNjAwLCAxNjAwLCAwKTsKIHN0YXRpYyBjb25zdCBjaGFyICpjaGFuX21peFtdID0gewpAQCAtMTM1LDEzICsxMTYsMTIgQEAKIAkiUiBMIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9jaGFuX21peCA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGNoYW5fbWl4KSwgY2hhbl9taXgpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChjczQybDUxX2NoYW5fbWl4LCBjaGFuX21peCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQybDUxX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9TWF9UTFYoIlBDTSBQbGF5YmFjayBWb2x1bWUiLAogCQkJQ1M0Mkw1MV9QQ01BX1ZPTCwgQ1M0Mkw1MV9QQ01CX1ZPTCwKLQkJCTYsIDB4MTksIDB4N0YsIGFkY19wY21fdGx2KSwKKwkJCTAsIDB4MTksIDB4N0YsIGFkY19wY21fdGx2KSwKIAlTT0NfRE9VQkxFX1IoIlBDTSBQbGF5YmFjayBTd2l0Y2giLAogCQkJQ1M0Mkw1MV9QQ01BX1ZPTCwgQ1M0Mkw1MV9QQ01CX1ZPTCwgNywgMSwgMSksCiAJU09DX0RPVUJMRV9SX1NYX1RMVigiQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsCkBAIC0xNDksNyArMTI5LDcgQEAKIAkJCTAsIDB4MzQsIDB4RTQsIGFvdXRfdGx2KSwKIAlTT0NfRE9VQkxFX1JfU1hfVExWKCJBREMgTWl4ZXIgVm9sdW1lIiwKIAkJCUNTNDJMNTFfQURDQV9WT0wsIENTNDJMNTFfQURDQl9WT0wsCi0JCQk2LCAweDE5LCAweDdGLCBhZGNfcGNtX3RsdiksCisJCQkwLCAweDE5LCAweDdGLCBhZGNfcGNtX3RsdiksCiAJU09DX0RPVUJMRV9SKCJBREMgTWl4ZXIgU3dpdGNoIiwKIAkJCUNTNDJMNTFfQURDQV9WT0wsIENTNDJMNTFfQURDQl9WT0wsIDcsIDEsIDEpLAogCVNPQ19TSU5HTEUoIlBsYXliYWNrIERlZW1waGFzaXMgU3dpdGNoIiwgQ1M0Mkw1MV9EQUNfQ1RMLCAzLCAxLCAwKSwKQEAgLTE5MiwyMiArMTcyLDIyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpjczQybDUxX2RhY19uYW1lc1tdID0geyJEaXJlY3QgUENNIiwKIAkiRFNQIFBDTSIsICJBREMifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9kYWNfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUxX0RBQ19DVEwsIDYsIDMsIGNzNDJsNTFfZGFjX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjczQybDUxX2RhY19tdXhfZW51bSwKKwkJCSAgICBDUzQyTDUxX0RBQ19DVEwsIDYsIGNzNDJsNTFfZGFjX25hbWVzKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQybDUxX2RhY19tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgY3M0Mmw1MV9kYWNfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY3M0Mmw1MV9hZGNsX25hbWVzW10gPSB7IkFJTjEgTGVmdCIsICJBSU4yIExlZnQiLAogCSJNSUMgTGVmdCIsICJNSUMrcHJlYW1wIExlZnQifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9hZGNsX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1MV9BRENfSU5QVVQsIDQsIDQsIGNzNDJsNTFfYWRjbF9uYW1lcyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY3M0Mmw1MV9hZGNsX211eF9lbnVtLAorCQkJICAgIENTNDJMNTFfQURDX0lOUFVULCA0LCBjczQybDUxX2FkY2xfbmFtZXMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDJsNTFfYWRjbF9tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgY3M0Mmw1MV9hZGNsX211eF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNzNDJsNTFfYWRjcl9uYW1lc1tdID0geyJBSU4xIFJpZ2h0IiwgIkFJTjIgUmlnaHQiLAogCSJNSUMgUmlnaHQiLCAiTUlDK3ByZWFtcCBSaWdodCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjczQybDUxX2FkY3JfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUxX0FEQ19JTlBVVCwgNiwgNCwgY3M0Mmw1MV9hZGNyX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjczQybDUxX2FkY3JfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw1MV9BRENfSU5QVVQsIDYsIGNzNDJsNTFfYWRjcl9uYW1lcyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M0Mmw1MV9hZGNyX211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBjczQybDUxX2FkY3JfbXV4X2VudW0pOwogCkBAIC01MDUsMjEgKzQ4NSw4IEBACiAKIHN0YXRpYyBpbnQgY3M0Mmw1MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSAqY3M0Mmw1MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQsIHJlZzsKIAotCXJldCA9IGNzNDJsNTFfZmlsbF9jYWNoZShjb2RlYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIGZpbGwgcmVnaXN0ZXIgY2FjaGVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBjczQybDUxLT5jb250cm9sX3R5cGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKgogCSAqIERBQyBjb25maWd1cmF0aW9uCiAJICogLSBVc2Ugc2lnbmFsIHByb2Nlc3NvcgpAQCAtNTM4LDggKzUwNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9jczQybDUxID0gewogCS5wcm9iZSA9IGNzNDJsNTFfcHJvYmUsCi0JLnJlZ19jYWNoZV9zaXplID0gQ1M0Mkw1MV9OVU1SRUdTICsgMSwKLQkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1OCksCiAKIAkuY29udHJvbHMgPSBjczQybDUxX3NuZF9jb250cm9scywKIAkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDUxX3NuZF9jb250cm9scyksCkBAIC01NDksMzggKzUxNCw1MyBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNTFfcm91dGVzKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQybDUxX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQ1M0Mkw1MV9DSEFSR0VfRlJFUSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CisKIHN0YXRpYyBpbnQgY3M0Mmw1MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQsCiAJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjczQybDUxX3ByaXZhdGUgKmNzNDJsNTE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXVuc2lnbmVkIGludCB2YWw7CiAJaW50IHJldDsKIAorCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyY19jbGllbnQsICZjczQybDUxX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmaTJjX2NsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSByZWdtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAkvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgQ1M0Mkw1MSAqLwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpMmNfY2xpZW50LCBDUzQyTDUxX0NISVBfUkVWX0lEKTsKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIENTNDJMNTFfQ0hJUF9SRVZfSUQsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgImZhaWxlZCB0byByZWFkIEkyQ1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKChyZXQgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQSkpICYmCi0JICAgIChyZXQgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQikpKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZFxuIik7CisJaWYgKCh2YWwgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQSkpICYmCisJICAgICh2YWwgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQikpKSB7CisJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZDogJXhcbiIsIHZhbCk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJZGV2X2luZm8oJmkyY19jbGllbnQtPmRldiwgImZvdW5kIGRldmljZSBjczQybDUxIHJldiAlZFxuIiwKLQkJCQlyZXQgJiA3KTsKKwkJIHZhbCAmIDcpOwogCiAJY3M0Mmw1MSA9IGRldm1fa3phbGxvYygmaTJjX2NsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjczQybDUxKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBjb2RlY1xuIik7CisJaWYgKCFjczQybDUxKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgY3M0Mmw1MSk7Ci0JY3M0Mmw1MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjX2NsaWVudC0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZpY2VfY3M0Mmw1MSwgJmNzNDJsNTFfZGFpLCAxKTsKQEAgLTYwMCwxMCArNTgwLDE3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDJsNTFfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjczQybDUxX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJjaXJydXMsY3M0Mmw1MSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0Mmw1MV9vZl9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBjczQybDUxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiY3M0Mmw1MS1jb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBjczQybDUxX29mX21hdGNoLAogCX0sCiAJLmlkX3RhYmxlID0gY3M0Mmw1MV9pZCwKIAkucHJvYmUgPSBjczQybDUxX2kyY19wcm9iZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKaW5kZXggMGJhYzZkNS4uZjBjYTZiZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKQEAgLTIxMCwxMyArMjEwLDExIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNTJfYWRjYl90ZXh0W10gPSB7CiAJIklucHV0MUIiLCAiSW5wdXQyQiIsICJJbnB1dDNCIiwgIklucHV0NEIiLCAiUEdBIElucHV0IFJpZ2h0In07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUEdBX0EsIDUsCi0JCUFSUkFZX1NJWkUoY3M0Mmw1Ml9hZGNhX3RleHQpLCBjczQybDUyX2FkY2FfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjYV9lbnVtLAorCQkJICAgIENTNDJMNTJfQURDX1BHQV9BLCA1LCBjczQybDUyX2FkY2FfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjYl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUEdBX0IsIDUsCi0JCUFSUkFZX1NJWkUoY3M0Mmw1Ml9hZGNiX3RleHQpLCBjczQybDUyX2FkY2JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjYl9lbnVtLAorCQkJICAgIENTNDJMNTJfQURDX1BHQV9CLCA1LCBjczQybDUyX2FkY2JfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNhX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBBREMgSW5wdXQgQ2FwdHVyZSBNdXgiLCBhZGNhX2VudW0pOwpAQCAtMjI5LDI2ICsyMjcsMjIgQEAKIAkiMC44ICtWQSIsICIwLjgzICtWQSIsICIwLjkxICtWQSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljX2JpYXNfbGV2ZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfSUZBQ0VfQ1RMMiwgMCwKLQkJCUFSUkFZX1NJWkUobWljX2JpYXNfbGV2ZWxfdGV4dCksIG1pY19iaWFzX2xldmVsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY19iaWFzX2xldmVsX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9JRkFDRV9DVEwyLCAwLCBtaWNfYmlhc19sZXZlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjczQybDUyX21pY190ZXh0W10gPSB7ICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9NSUNBX0NUTCwgNSwKLQkJCUFSUkFZX1NJWkUoY3M0Mmw1Ml9taWNfdGV4dCksIGNzNDJsNTJfbWljX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY2FfZW51bSwKKwkJCSAgICBDUzQyTDUyX01JQ0FfQ1RMLCA1LCBjczQybDUyX21pY190ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNiX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX01JQ0JfQ1RMLCA1LAotCQkJQVJSQVlfU0laRShjczQybDUyX21pY190ZXh0KSwgY3M0Mmw1Ml9taWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljYl9lbnVtLAorCQkJICAgIENTNDJMNTJfTUlDQl9DVEwsIDUsIGNzNDJsNTJfbWljX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpZ2l0YWxfb3V0cHV0X211eF90ZXh0W10gPSB7IkFEQyIsICJEU1AifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkaWdpdGFsX291dHB1dF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX01JU0NfQ1RMLCA2LAotCQkJQVJSQVlfU0laRShkaWdpdGFsX291dHB1dF9tdXhfdGV4dCksCi0JCQlkaWdpdGFsX291dHB1dF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGlnaXRhbF9vdXRwdXRfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9BRENfTUlTQ19DVEwsIDYsCisJCQkgICAgZGlnaXRhbF9vdXRwdXRfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGlnaXRhbF9vdXRwdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEaWdpdGFsIE91dHB1dCBNdXgiLCBkaWdpdGFsX291dHB1dF9tdXhfZW51bSk7CkBAIC0yNTgsMTggKzI1MiwxOCBAQAogCSIwLjcwOTkiLCAiMC44Mzk5IiwgIjEuMDAwIiwgIjEuMTQzMCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHBfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9QQl9DVEwxLCA1LAotCQlBUlJBWV9TSVpFKGhwX2dhaW5fbnVtX3RleHQpLCBocF9nYWluX251bV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChocF9nYWluX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9QQl9DVEwxLCA1LAorCQkJICAgIGhwX2dhaW5fbnVtX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfcGl0Y2hfdGV4dFtdID0gewogCSJDNCIsICJDNSIsICJENSIsICJFNSIsICJGNSIsICJHNSIsICJBNSIsICJCNSIsCiAJIkM2IiwgIkQ2IiwgIkU2IiwgIkY2IiwgIkc2IiwgIkE2IiwgIkI2IiwgIkM3IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX3BpdGNoX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX0JFRVBfRlJFUSwgNCwKLQkJCUFSUkFZX1NJWkUoYmVlcF9waXRjaF90ZXh0KSwgYmVlcF9waXRjaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX3BpdGNoX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9CRUVQX0ZSRVEsIDQsCisJCQkgICAgYmVlcF9waXRjaF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZWVwX29udGltZV90ZXh0W10gPSB7CiAJIjg2IG1zIiwgIjQzMCBtcyIsICI3ODAgbXMiLCAiMS4yMCBzIiwgIjEuNTAgcyIsCkBAIC0yNzcsNjYgKzI3MSw2NiBAQAogCSIzLjUwIHMiLCAiMy44MCBzIiwgIjQuMjAgcyIsICI0LjUwIHMiLCAiNC44MCBzIiwgIjUuMjAgcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYmVlcF9vbnRpbWVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQkVFUF9GUkVRLCAwLAotCQkJQVJSQVlfU0laRShiZWVwX29udGltZV90ZXh0KSwgYmVlcF9vbnRpbWVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmVlcF9vbnRpbWVfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfRlJFUSwgMCwKKwkJCSAgICBiZWVwX29udGltZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZWVwX29mZnRpbWVfdGV4dFtdID0gewogCSIxLjIzIHMiLCAiMi41OCBzIiwgIjMuOTAgcyIsICI1LjIwIHMiLAogCSI2LjYwIHMiLCAiOC4wNSBzIiwgIjkuMzUgcyIsICIxMC44MCBzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX29mZnRpbWVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQkVFUF9WT0wsIDUsCi0JCQlBUlJBWV9TSVpFKGJlZXBfb2ZmdGltZV90ZXh0KSwgYmVlcF9vZmZ0aW1lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJlZXBfb2ZmdGltZV9lbnVtLAorCQkJICAgIENTNDJMNTJfQkVFUF9WT0wsIDUsCisJCQkgICAgYmVlcF9vZmZ0aW1lX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfY29uZmlnX3RleHRbXSA9IHsKIAkiT2ZmIiwgIlNpbmdsZSIsICJNdWx0aXBsZSIsICJDb250aW51b3VzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX2NvbmZpZ19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9CRUVQX1RPTkVfQ1RMLCA2LAotCQkJQVJSQVlfU0laRShiZWVwX2NvbmZpZ190ZXh0KSwgYmVlcF9jb25maWdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmVlcF9jb25maWdfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDYsCisJCQkgICAgYmVlcF9jb25maWdfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmVlcF9iYXNzX3RleHRbXSA9IHsKIAkiNTAgSHoiLCAiMTAwIEh6IiwgIjIwMCBIeiIsICIyNTAgSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJlZXBfYmFzc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9CRUVQX1RPTkVfQ1RMLCAxLAotCQkJQVJSQVlfU0laRShiZWVwX2Jhc3NfdGV4dCksIGJlZXBfYmFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX2Jhc3NfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDEsCisJCQkgICAgYmVlcF9iYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfdHJlYmxlX3RleHRbXSA9IHsKIAkiNSBrSHoiLCAiNyBrSHoiLCAiMTAga0h6IiwgIiAxNSBrSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJlZXBfdHJlYmxlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDMsCi0JCQlBUlJBWV9TSVpFKGJlZXBfdHJlYmxlX3RleHQpLCBiZWVwX3RyZWJsZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX3RyZWJsZV9lbnVtLAorCQkJICAgIENTNDJMNTJfQkVFUF9UT05FX0NUTCwgMywKKwkJCSAgICBiZWVwX3RyZWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuZ190aHJlc2hvbGRfdGV4dFtdID0gewogCSItMzRkQiIsICItMzdkQiIsICItNDBkQiIsICItNDNkQiIsCiAJIi00NmRCIiwgIi01MmRCIiwgIi01OGRCIiwgIi02NGRCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ190aHJlc2hvbGRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfTk9JU0VfR0FURV9DVEwsIDIsCi0JCUFSUkFZX1NJWkUobmdfdGhyZXNob2xkX3RleHQpLCBuZ190aHJlc2hvbGRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobmdfdGhyZXNob2xkX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMiwKKwkJCSAgICBuZ190aHJlc2hvbGRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3M0Mmw1Ml9uZ19kZWxheV90ZXh0W10gPSB7CiAJIjUwbXMiLCAiMTAwbXMiLCAiMTUwbXMiLCAiMjAwbXMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ19kZWxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMCwKLQkJQVJSQVlfU0laRShjczQybDUyX25nX2RlbGF5X3RleHQpLCBjczQybDUyX25nX2RlbGF5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX2RlbGF5X2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMCwKKwkJCSAgICBjczQybDUyX25nX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNTJfbmdfdHlwZV90ZXh0W10gPSB7CiAJIkFwcGx5IFNwZWNpZmljIiwgIkFwcGx5IEFsbCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmdfdHlwZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgNiwKLQkJQVJSQVlfU0laRShjczQybDUyX25nX3R5cGVfdGV4dCksIGNzNDJsNTJfbmdfdHlwZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChuZ190eXBlX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgNiwKKwkJCSAgICBjczQybDUyX25nX3R5cGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGVmdF9zd2FwX3RleHRbXSA9IHsKIAkiTGVmdCIsICJMUiAyIiwgIlJpZ2h0In07CkBAIC0zNDcsNyArMzQxLDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3dhcF92YWx1ZXNbXSA9IHsgMCwgMSwgMyB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY2Ffc3dhcF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUENNX01JWEVSLCAyLCAxLAorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDIsIDMsCiAJCQkgICAgICBBUlJBWV9TSVpFKGxlZnRfc3dhcF90ZXh0KSwKIAkJCSAgICAgIGxlZnRfc3dhcF90ZXh0LAogCQkJICAgICAgc3dhcF92YWx1ZXMpOwpAQCAtMzU2LDcgKzM1MCw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhZGNhX3N3YXBfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtYV9zd2FwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDYsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgNiwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUobGVmdF9zd2FwX3RleHQpLAogCQkJICAgICAgbGVmdF9zd2FwX3RleHQsCiAJCQkgICAgICBzd2FwX3ZhbHVlcyk7CkBAIC0zNjUsNyArMzU5LDcgQEAKIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHBjbWFfc3dhcF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNiX3N3YXBfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgMCwgMSwKKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUENNX01JWEVSLCAwLCAzLAogCQkJICAgICAgQVJSQVlfU0laRShyaWdodF9zd2FwX3RleHQpLAogCQkJICAgICAgcmlnaHRfc3dhcF90ZXh0LAogCQkJICAgICAgc3dhcF92YWx1ZXMpOwpAQCAtMzc0LDcgKzM2OCw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhZGNiX3N3YXBfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtYl9zd2FwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDQsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgNCwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUocmlnaHRfc3dhcF90ZXh0KSwKIAkJCSAgICAgIHJpZ2h0X3N3YXBfdGV4dCwKIAkJCSAgICAgIHN3YXBfdmFsdWVzKTsKQEAgLTExMTUsMTQgKzExMDksNyBAQAogc3RhdGljIGludCBjczQybDUyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY3M0Mmw1Ml9wcml2YXRlICpjczQybDUyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBjczQybDUyLT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCXJlZ2NhY2hlX2NhY2hlX29ubHkoY3M0Mmw1Mi0+cmVnbWFwLCB0cnVlKTsKIAogCWNzNDJsNTJfYWRkX21pY19jb250cm9scyhjb2RlYyk7CkBAIC0xMTM0LDcgKzExMjEsNyBAQAogCWNzNDJsNTItPnN5c2NsayA9IENTNDJMNTJfREVGQVVMVF9DTEs7CiAJY3M0Mmw1Mi0+Y29uZmlnLmZvcm1hdCA9IENTNDJMNTJfREVGQVVMVF9GT1JNQVQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNzNDJsNTJfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKaW5kZXggNTQ5ZDVkNi4uMGVlNjBhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKQEAgLTI3OCwxMyArMjc4LDEzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfcGdhYV90ZXh0W10gPSB7ICJMaW5lIEEiLCAiTWljIDEiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfcGdhYl90ZXh0W10gPSB7ICJMaW5lIEIiLCAiTWljIDIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGdhYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19BRENJUEMsIDMsCi0JCUFSUkFZX1NJWkUoY3M0Mmw3M19wZ2FhX3RleHQpLCBjczQybDczX3BnYWFfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocGdhYV9lbnVtLAorCQkJICAgIENTNDJMNzNfQURDSVBDLCAzLAorCQkJICAgIGNzNDJsNzNfcGdhYV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwZ2FiX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDczX0FEQ0lQQywgNywKLQkJQVJSQVlfU0laRShjczQybDczX3BnYWJfdGV4dCksIGNzNDJsNzNfcGdhYl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwZ2FiX2VudW0sCisJCQkgICAgQ1M0Mkw3M19BRENJUEMsIDcsCisJCQkgICAgY3M0Mmw3M19wZ2FiX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGdhYV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQW5hbG9nIElucHV0IENhcHR1cmUgTXV4IiwgcGdhYV9lbnVtKTsKQEAgLTMwOSw5ICszMDksOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjczQybDczX25nX2RlbGF5X3RleHRbXSA9IHsKIAkiNTBtcyIsICIxMDBtcyIsICIxNTBtcyIsICIyMDBtcyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ19kZWxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19OR0NBQiwgMCwKLQkJQVJSQVlfU0laRShjczQybDczX25nX2RlbGF5X3RleHQpLCBjczQybDczX25nX2RlbGF5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX2RlbGF5X2VudW0sCisJCQkgICAgQ1M0Mkw3M19OR0NBQiwgMCwKKwkJCSAgICBjczQybDczX25nX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfbW9ub19taXhfdGV4dHNbXSA9IHsKIAkiTGVmdCIsICJSaWdodCIsICJNb25vIE1peCJ9OwpAQCAtMzE5LDcgKzMxOSw3IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNzNDJsNzNfbW9ub19taXhfdmFsdWVzW10gPSB7IDAsIDEsIDIgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtfYXNwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDczX01NSVhDVEwsIDYsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNzNfTU1JWENUTCwgNiwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUoY3M0Mmw3M19tb25vX21peF90ZXh0cyksCiAJCQkgICAgICBjczQybDczX21vbm9fbWl4X3RleHRzLAogCQkJICAgICAgY3M0Mmw3M19tb25vX21peF92YWx1ZXMpOwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBzcGtfeHNwX2VudW0pOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGVzbF9hc3BfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNzNfTU1JWENUTCwgMiwgNSwKKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NTUlYQ1RMLCAyLCAzLAogCQkJICAgICAgQVJSQVlfU0laRShjczQybDczX21vbm9fbWl4X3RleHRzKSwKIAkJCSAgICAgIGNzNDJsNzNfbW9ub19taXhfdGV4dHMsCiAJCQkgICAgICBjczQybDczX21vbm9fbWl4X3ZhbHVlcyk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGVzbF9hc3BfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZXNsX3hzcF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NTUlYQ1RMLCAwLCA3LAorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDczX01NSVhDVEwsIDAsIDMsCiAJCQkgICAgICBBUlJBWV9TSVpFKGNzNDJsNzNfbW9ub19taXhfdGV4dHMpLAogCQkJICAgICAgY3M0Mmw3M19tb25vX21peF90ZXh0cywKIAkJCSAgICAgIGNzNDJsNzNfbW9ub19taXhfdmFsdWVzKTsKQEAgLTM1NywxOSArMzU3LDE5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfaXBfc3dhcF90ZXh0W10gPSB7CiAJIlN0ZXJlbyIsICJNb25vIEEiLCAiTW9ubyBCIiwgIlN3YXAgQS1CIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaXBfc3dhcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NSU9QQywgNiwKLQkJQVJSQVlfU0laRShjczQybDczX2lwX3N3YXBfdGV4dCksIGNzNDJsNzNfaXBfc3dhcF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChpcF9zd2FwX2VudW0sCisJCQkgICAgQ1M0Mkw3M19NSU9QQywgNiwKKwkJCSAgICBjczQybDczX2lwX3N3YXBfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dFtdID0geyJNb25vIiwgIlN0ZXJlbyJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHZzcF9vdXRwdXRfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDczX01JWEVSQ1RMLCA1LAotCQlBUlJBWV9TSVpFKGNzNDJsNzNfc3BvX21peGVyX3RleHQpLCBjczQybDczX3Nwb19taXhlcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh2c3Bfb3V0cHV0X211eF9lbnVtLAorCQkJICAgIENTNDJMNzNfTUlYRVJDVEwsIDUsCisJCQkgICAgY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0geHNwX291dHB1dF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNzNfTUlYRVJDVEwsIDQsCi0JCUFSUkFZX1NJWkUoY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dCksIGNzNDJsNzNfc3BvX21peGVyX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHhzcF9vdXRwdXRfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw3M19NSVhFUkNUTCwgNCwKKwkJCSAgICBjczQybDczX3Nwb19taXhlcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZzcF9vdXRwdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHZzcF9vdXRwdXRfbXV4X2VudW0pOwpAQCAtMTEwOCw3ICsxMTA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBjczQybDczX2FzcmNfcmF0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3M0Mmw3M19hc3JjX3JhdGVzW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsCiAJMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKIH07CkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCQkJCQkweDdGLCB0cmlzdGF0ZSA8PCA3KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xMl8yNCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTJfMjQgPSB7CiAJLmNvdW50ICA9IEFSUkFZX1NJWkUoY3M0Mmw3M19hc3JjX3JhdGVzKSwKIAkubGlzdCAgID0gY3M0Mmw3M19hc3JjX3JhdGVzLAogfTsKQEAgLTEyNTUsOSArMTI1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNORFJWX1BDTV9SQVRFX0tOT1QgLT4gMTIwMDAsIDI0MDAwIEh6LCBsaW1pdCB3aXRoIGNvbnN0cmFpbnQgbGlzdCAqLwotI2RlZmluZSBDUzQyTDczX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfS05PVCkKLQogCiAjZGVmaW5lIENTNDJMNzNfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfFwKIAlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKQEAgLTEyNzgsMTQgKzEyNzUsMTQgQEAKIAkJCS5zdHJlYW1fbmFtZSA9ICJYU1AgUGxheWJhY2siLAogCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IENTNDJMNzNfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAogCQkJLmZvcm1hdHMgPSBDUzQyTDczX0ZPUk1BVFMsCiAJCX0sCiAJCS5jYXB0dXJlID0gewogCQkJLnN0cmVhbV9uYW1lID0gIlhTUCBDYXB0dXJlIiwKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBDUzQyTDczX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKIAkJCS5mb3JtYXRzID0gQ1M0Mkw3M19GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJmNzNDJsNzNfb3BzLApAQCAtMTI5OCwxNCArMTI5NSwxNCBAQAogCQkJLnN0cmVhbV9uYW1lID0gIkFTUCBQbGF5YmFjayIsCiAJCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQ1M0Mkw3M19SQVRFUywKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCiAJCQkuZm9ybWF0cyA9IENTNDJMNzNfRk9STUFUUywKIAkJfSwKIAkJLmNhcHR1cmUgPSB7CiAJCQkuc3RyZWFtX25hbWUgPSAiQVNQIENhcHR1cmUiLAogCQkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IENTNDJMNzNfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAogCQkJLmZvcm1hdHMgPSBDUzQyTDczX0ZPUk1BVFMsCiAJCX0sCiAJCS5vcHMgPSAmY3M0Mmw3M19vcHMsCkBAIC0xMzE4LDE0ICsxMzE1LDE0IEBACiAJCQkuc3RyZWFtX25hbWUgPSAiVlNQIFBsYXliYWNrIiwKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBDUzQyTDczX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKIAkJCS5mb3JtYXRzID0gQ1M0Mkw3M19GT1JNQVRTLAogCQl9LAogCQkuY2FwdHVyZSA9IHsKIAkJCS5zdHJlYW1fbmFtZSA9ICJWU1AgQ2FwdHVyZSIsCiAJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQ1M0Mkw3M19SQVRFUywKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCiAJCQkuZm9ybWF0cyA9IENTNDJMNzNfRk9STUFUUywKIAkJfSwKIAkJLm9wcyA9ICZjczQybDczX29wcywKQEAgLTEzNDgsMTcgKzEzNDUsOCBAQAogCiBzdGF0aWMgaW50IGNzNDJsNzNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7CiAJc3RydWN0IGNzNDJsNzNfcHJpdmF0ZSAqY3M0Mmw3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNzNDJsNzMtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWNzNDJsNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCS8qIFNldCBDaGFyZ2UgUHVtcCBGcmVxdWVuY3kgKi8KQEAgLTEzNzEsNyArMTM1OSw3IEBACiAJY3M0Mmw3My0+bWNsa3NlbCA9IENTNDJMNzNfQ0xLSURfTUNMSzE7CiAJY3M0Mmw3My0+bWNsayA9IDA7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNzNDJsNzNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC1pMmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkY2UyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LWkyYy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIERBSSBJMkMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogQXV0aG9yOiBOaWNvbGluIENoZW4gPEd1YW5neXUuQ2hlbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImNzNDJ4eDguaCIKKworc3RhdGljIGludCBjczQyeHg4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJdTMyIHJldCA9IGNzNDJ4eDhfcHJvYmUoJmkyYy0+ZGV2LAorCQkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmY3M0Mnh4OF9yZWdtYXBfY29uZmlnKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZpMmMtPmRldik7CisJcG1fcmVxdWVzdF9pZGxlKCZpMmMtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmkyYy0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgY3M0Mnh4OF9pMmNfaWRbXSA9IHsKKwl7ImNzNDI0NDgiLCAoa2VybmVsX3Vsb25nX3QpJmNzNDI0NDhfZGF0YX0sCisJeyJjczQyODg4IiwgKGtlcm5lbF91bG9uZ190KSZjczQyODg4X2RhdGF9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDJ4eDhfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGNzNDJ4eDhfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjczQyeHg4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZjczQyeHg4X3BtLAorCX0sCisJLnByb2JlID0gY3M0Mnh4OF9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IGNzNDJ4eDhfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBjczQyeHg4X2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGNzNDJ4eDhfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ2lycnVzIExvZ2ljIENTNDI0NDgvQ1M0Mjg4OCBBTFNBIFNvQyBDb2RlYyBJMkMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODIyOTlhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMKQEAgLTAsMCArMSw2MDIgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIChEQUkpIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogTmljb2xpbiBDaGVuIDxHdWFuZ3l1LkNoZW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJjczQyeHg4LmgiCisKKyNkZWZpbmUgQ1M0MlhYOF9OVU1fU1VQUExJRVMgNAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNzNDJ4eDhfc3VwcGx5X25hbWVzW0NTNDJYWDhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiVkEiLAorCSJWRCIsCisJIlZMUyIsCisJIlZMQyIsCit9OworCisjZGVmaW5lIENTNDJYWDhfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBjczQyeHg4X3ByaXYgeworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0NTNDJYWDhfTlVNX1NVUFBMSUVTXTsKKwljb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSAqZHJ2ZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqY2xrOworCisJYm9vbCBzbGF2ZV9tb2RlOworCXVuc2lnbmVkIGxvbmcgc3lzY2xrOworfTsKKworLyogLTEyNy41ZEIgdG8gMGRCIHdpdGggc3RlcCBvZiAwLjVkQiAqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY190bHYsIC0xMjc1MCwgNTAsIDEpOworLyogLTY0ZEIgdG8gMjRkQiB3aXRoIHN0ZXAgb2YgMC41ZEIgKi8KK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdGx2LCAtNjQwMCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY3M0Mnh4OF9hZGNfc2luZ2xlW10gPSB7ICJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLUVuZGVkIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNzNDJ4eDhfc3pjW10gPSB7ICJJbW1lZGlhdGUgQ2hhbmdlIiwgIlplcm8gQ3Jvc3MiLAorCQkJCQkiU29mdCBSYW1wIiwgIlNvZnQgUmFtcCBvbiBaZXJvIENyb3NzIiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzFfc2luZ2xlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShDUzQyWFg4X0FEQ0NUTCwgNCwgMiwgY3M0Mnh4OF9hZGNfc2luZ2xlKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMl9zaW5nbGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKENTNDJYWDhfQURDQ1RMLCAzLCAyLCBjczQyeHg4X2FkY19zaW5nbGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMzX3NpbmdsZV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQ1M0MlhYOF9BRENDVEwsIDIsIDIsIGNzNDJ4eDhfYWRjX3NpbmdsZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19zemNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKENTNDJYWDhfVFhDVEwsIDUsIDQsIGNzNDJ4eDhfc3pjKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX3N6Y19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQ1M0MlhYOF9UWENUTCwgMCwgNCwgY3M0Mnh4OF9zemMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M0Mnh4OF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMxIFBsYXliYWNrIFZvbHVtZSIsIENTNDJYWDhfVk9MQU9VVDEsCisJCQkgQ1M0MlhYOF9WT0xBT1VUMiwgMCwgMHhmZiwgMSwgZGFjX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiREFDMiBQbGF5YmFjayBWb2x1bWUiLCBDUzQyWFg4X1ZPTEFPVVQzLAorCQkJIENTNDJYWDhfVk9MQU9VVDQsIDAsIDB4ZmYsIDEsIGRhY190bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBT1VUNSwKKwkJCSBDUzQyWFg4X1ZPTEFPVVQ2LCAwLCAweGZmLCAxLCBkYWNfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUM0IFBsYXliYWNrIFZvbHVtZSIsIENTNDJYWDhfVk9MQU9VVDcsCisJCQkgQ1M0MlhYOF9WT0xBT1VUOCwgMCwgMHhmZiwgMSwgZGFjX3RsdiksCisJU09DX0RPVUJMRV9SX1NfVExWKCJBREMxIENhcHR1cmUgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBSU4xLAorCQkJICAgQ1M0MlhYOF9WT0xBSU4yLCAwLCAtMHg4MCwgMHgzMCwgNywgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRV9SX1NfVExWKCJBREMyIENhcHR1cmUgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBSU4zLAorCQkJICAgQ1M0MlhYOF9WT0xBSU40LCAwLCAtMHg4MCwgMHgzMCwgNywgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRSgiREFDMSBJbnZlcnQgU3dpdGNoIiwgQ1M0MlhYOF9EQUNJTlYsIDAsIDEsIDEsIDApLAorCVNPQ19ET1VCTEUoIkRBQzIgSW52ZXJ0IFN3aXRjaCIsIENTNDJYWDhfREFDSU5WLCAyLCAzLCAxLCAwKSwKKwlTT0NfRE9VQkxFKCJEQUMzIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0RBQ0lOViwgNCwgNSwgMSwgMCksCisJU09DX0RPVUJMRSgiREFDNCBJbnZlcnQgU3dpdGNoIiwgQ1M0MlhYOF9EQUNJTlYsIDYsIDcsIDEsIDApLAorCVNPQ19ET1VCTEUoIkFEQzEgSW52ZXJ0IFN3aXRjaCIsIENTNDJYWDhfQURDSU5WLCAwLCAxLCAxLCAwKSwKKwlTT0NfRE9VQkxFKCJBREMyIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0FEQ0lOViwgMiwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIEhpZ2gtUGFzcyBGaWx0ZXIgU3dpdGNoIiwgQ1M0MlhYOF9BRENDVEwsIDcsIDEsIDEpLAorCVNPQ19TSU5HTEUoIkRBQyBEZS1lbXBoYXNpcyBTd2l0Y2giLCBDUzQyWFg4X0FEQ0NUTCwgNSwgMSwgMCksCisJU09DX0VOVU0oIkFEQzEgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjMV9zaW5nbGVfZW51bSksCisJU09DX0VOVU0oIkFEQzIgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjMl9zaW5nbGVfZW51bSksCisJU09DX1NJTkdMRSgiREFDIFNpbmdsZSBWb2x1bWUgQ29udHJvbCBTd2l0Y2giLCBDUzQyWFg4X1RYQ1RMLCA3LCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIFNvZnQgUmFtcCAmIFplcm8gQ3Jvc3MgQ29udHJvbCBTd2l0Y2giLCBkYWNfc3pjX2VudW0pLAorCVNPQ19TSU5HTEUoIkRBQyBBdXRvIE11dGUgU3dpdGNoIiwgQ1M0MlhYOF9UWENUTCwgNCwgMSwgMCksCisJU09DX1NJTkdMRSgiTXV0ZSBBREMgU2VyaWFsIFBvcnQgU3dpdGNoIiwgQ1M0MlhYOF9UWENUTCwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIFNpbmdsZSBWb2x1bWUgQ29udHJvbCBTd2l0Y2giLCBDUzQyWFg4X1RYQ1RMLCAyLCAxLCAwKSwKKwlTT0NfRU5VTSgiQURDIFNvZnQgUmFtcCAmIFplcm8gQ3Jvc3MgQ29udHJvbCBTd2l0Y2giLCBhZGNfc3pjX2VudW0pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDJ4eDhfYWRjM19zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQzMgQ2FwdHVyZSBWb2x1bWUiLCBDUzQyWFg4X1ZPTEFJTjUsCisJCQkgICBDUzQyWFg4X1ZPTEFJTjYsIDAsIC0weDgwLCAweDMwLCA3LCAwLCBhZGNfdGx2KSwKKwlTT0NfRE9VQkxFKCJBREMzIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0FEQ0lOViwgNCwgNSwgMSwgMCksCisJU09DX0VOVU0oIkFEQzMgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjM19zaW5nbGVfZW51bSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgY3M0Mnh4OF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMxIiwgIlBsYXliYWNrIiwgQ1M0MlhYOF9QV1JDVEwsIDEsIDEpLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQzIiLCAiUGxheWJhY2siLCBDUzQyWFg4X1BXUkNUTCwgMiwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMyIsICJQbGF5YmFjayIsIENTNDJYWDhfUFdSQ1RMLCAzLCAxKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUM0IiwgIlBsYXliYWNrIiwgQ1M0MlhYOF9QV1JDVEwsIDQsIDEpLAorCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDFMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDJMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDJSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDNMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDNSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDRMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDRSIiksCisKKwlTTkRfU09DX0RBUE1fQURDKCJBREMxIiwgIkNhcHR1cmUiLCBDUzQyWFg4X1BXUkNUTCwgNSwgMSksCisJU05EX1NPQ19EQVBNX0FEQygiQURDMiIsICJDYXB0dXJlIiwgQ1M0MlhYOF9QV1JDVEwsIDYsIDEpLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMVIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjJMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yUiIpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUFdSIiwgQ1M0MlhYOF9QV1JDVEwsIDAsIDEsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGNzNDJ4eDhfYWRjM19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQURDKCJBREMzIiwgIkNhcHR1cmUiLCBDUzQyWFg4X1BXUkNUTCwgNywgMSksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjNMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4zUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY3M0Mnh4OF9kYXBtX3JvdXRlc1tdID0geworCS8qIFBsYXliYWNrICovCisJeyAiQU9VVDFMIiwgTlVMTCwgIkRBQzEiIH0sCisJeyAiQU9VVDFSIiwgTlVMTCwgIkRBQzEiIH0sCisJeyAiREFDMSIsIE5VTEwsICJQV1IiIH0sCisKKwl7ICJBT1VUMkwiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJBT1VUMlIiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJEQUMyIiwgTlVMTCwgIlBXUiIgfSwKKworCXsgIkFPVVQzTCIsIE5VTEwsICJEQUMzIiB9LAorCXsgIkFPVVQzUiIsIE5VTEwsICJEQUMzIiB9LAorCXsgIkRBQzMiLCBOVUxMLCAiUFdSIiB9LAorCisJeyAiQU9VVDRMIiwgTlVMTCwgIkRBQzQiIH0sCisJeyAiQU9VVDRSIiwgTlVMTCwgIkRBQzQiIH0sCisJeyAiREFDNCIsIE5VTEwsICJQV1IiIH0sCisKKwkvKiBDYXB0dXJlICovCisJeyAiQURDMSIsIE5VTEwsICJBSU4xTCIgfSwKKwl7ICJBREMxIiwgTlVMTCwgIkFJTjFSIiB9LAorCXsgIkFEQzEiLCBOVUxMLCAiUFdSIiB9LAorCisJeyAiQURDMiIsIE5VTEwsICJBSU4yTCIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIkFJTjJSIiB9LAorCXsgIkFEQzIiLCBOVUxMLCAiUFdSIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY3M0Mnh4OF9hZGMzX2RhcG1fcm91dGVzW10gPSB7CisJLyogQ2FwdHVyZSAqLworCXsgIkFEQzMiLCBOVUxMLCAiQUlOM0wiIH0sCisJeyAiQURDMyIsIE5VTEwsICJBSU4zUiIgfSwKKwl7ICJBREMzIiwgTlVMTCwgIlBXUiIgfSwKK307CisKK3N0cnVjdCBjczQyeHg4X3JhdGlvcyB7CisJdW5zaWduZWQgaW50IHJhdGlvOworCXVuc2lnbmVkIGNoYXIgc3BlZWQ7CisJdW5zaWduZWQgY2hhciBtY2xrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjczQyeHg4X3JhdGlvcyBjczQyeHg4X3JhdGlvc1tdID0geworCXsgNjQsIENTNDJYWDhfRk1fUVVBRCwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzI1Nig0KSB9LAorCXsgOTYsIENTNDJYWDhfRk1fUVVBRCwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzM4NCg0KSB9LAorCXsgMTI4LCBDUzQyWFg4X0ZNX1FVQUQsIENTNDJYWDhfRlVOQ01PRF9NRlJFUV81MTIoNCkgfSwKKwl7IDE5MiwgQ1M0MlhYOF9GTV9RVUFELCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNzY4KDQpIH0sCisJeyAyNTYsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMjU2KDEpIH0sCisJeyAzODQsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMzg0KDEpIH0sCisJeyA1MTIsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNTEyKDEpIH0sCisJeyA3NjgsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNzY4KDEpIH0sCisJeyAxMDI0LCBDUzQyWFg4X0ZNX1NJTkdMRSwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzEwMjQoMSkgfQorfTsKKworc3RhdGljIGludCBjczQyeHg4X3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCSAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwljczQyeHg4LT5zeXNjbGsgPSBmcmVxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Mnh4OF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IGNzNDJ4eDhfcHJpdiAqY3M0Mnh4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUzMiB2YWw7CisKKwkvKiBTZXQgREFJIGZvcm1hdCAqLworCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJdmFsID0gQ1M0MlhYOF9JTlRGX0RBQ19ESUZfTEVGVEogfCBDUzQyWFg4X0lOVEZfQURDX0RJRl9MRUZUSjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCXZhbCA9IENTNDJYWDhfSU5URl9EQUNfRElGX0kyUyB8IENTNDJYWDhfSU5URl9BRENfRElGX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQl2YWwgPSBDUzQyWFg4X0lOVEZfREFDX0RJRl9SSUdIVEogfCBDUzQyWFg4X0lOVEZfQURDX0RJRl9SSUdIVEo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgInVuc3VwcG9ydGVkIGRhaSBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0lOVEYsCisJCQkgICBDUzQyWFg4X0lOVEZfREFDX0RJRl9NQVNLIHwKKwkJCSAgIENTNDJYWDhfSU5URl9BRENfRElGX01BU0ssIHZhbCk7CisKKwkvKiBTZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWNzNDJ4eDgtPnNsYXZlX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWNzNDJ4eDgtPnNsYXZlX21vZGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgbWFzdGVyL3NsYXZlIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBjczQyeHg4X3ByaXYgKmNzNDJ4eDggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlib29sIHR4ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwl1MzIgcmF0aW8gPSBjczQyeHg4LT5zeXNjbGsgLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXUzMiBpLCBmbSwgdmFsLCBtYXNrOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M0Mnh4OF9yYXRpb3MpOyBpKyspIHsKKwkJaWYgKGNzNDJ4eDhfcmF0aW9zW2ldLnJhdGlvID09IHJhdGlvKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShjczQyeHg4X3JhdGlvcykpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgc3lzY2xrIHJhdGlvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFzayA9IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9NQVNLOworCXZhbCA9IGNzNDJ4eDhfcmF0aW9zW2ldLm1jbGs7CisKKwlmbSA9IGNzNDJ4eDgtPnNsYXZlX21vZGUgPyBDUzQyWFg4X0ZNX0FVVE8gOiBjczQyeHg4X3JhdGlvc1tpXS5zcGVlZDsKKworCXJlZ21hcF91cGRhdGVfYml0cyhjczQyeHg4LT5yZWdtYXAsIENTNDJYWDhfRlVOQ01PRCwKKwkJCSAgIENTNDJYWDhfRlVOQ01PRF94Q19GTV9NQVNLKHR4KSB8IG1hc2ssCisJCQkgICBDUzQyWFg4X0ZVTkNNT0RfeENfRk0odHgsIGZtKSB8IHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0RBQ01VVEUsCisJCQkgICBDUzQyWFg4X0RBQ01VVEVfQUxMLCBtdXRlID8gQ1M0MlhYOF9EQUNNVVRFX0FMTCA6IDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGNzNDJ4eDhfZGFpX29wcyA9IHsKKwkuc2V0X2ZtdAk9IGNzNDJ4eDhfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsJPSBjczQyeHg4X3NldF9kYWlfc3lzY2xrLAorCS5od19wYXJhbXMJPSBjczQyeHg4X2h3X3BhcmFtcywKKwkuZGlnaXRhbF9tdXRlCT0gY3M0Mnh4OF9kaWdpdGFsX211dGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBjczQyeHg4X2RhaSA9IHsKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gQ1M0MlhYOF9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkuZm9ybWF0cyA9IENTNDJYWDhfRk9STUFUUywKKwl9LAorCS5vcHMgPSAmY3M0Mnh4OF9kYWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBjczQyeHg4X3JlZ1tdID0geworCXsgMHgwMSwgMHgwMSB9LCAgIC8qIENoaXAgSS5ELiBhbmQgUmV2aXNpb24gUmVnaXN0ZXIgKi8KKwl7IDB4MDIsIDB4MDAgfSwgICAvKiBQb3dlciBDb250cm9sICovCisJeyAweDAzLCAweEYwIH0sICAgLyogRnVuY3Rpb25hbCBNb2RlICovCisJeyAweDA0LCAweDQ2IH0sICAgLyogSW50ZXJmYWNlIEZvcm1hdHMgKi8KKwl7IDB4MDUsIDB4MDAgfSwgICAvKiBBREMgQ29udHJvbCAmIERBQyBEZS1FbXBoYXNpcyAqLworCXsgMHgwNiwgMHgxMCB9LCAgIC8qIFRyYW5zaXRpb24gQ29udHJvbCAqLworCXsgMHgwNywgMHgwMCB9LCAgIC8qIERBQyBDaGFubmVsIE11dGUgKi8KKwl7IDB4MDgsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUMSAqLworCXsgMHgwOSwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQyICovCisJeyAweDBhLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQU9VVDMgKi8KKwl7IDB4MGIsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUNCAqLworCXsgMHgwYywgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQ1ICovCisJeyAweDBkLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQU9VVDYgKi8KKwl7IDB4MGUsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUNyAqLworCXsgMHgwZiwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQ4ICovCisJeyAweDEwLCAweDAwIH0sICAgLyogREFDIENoYW5uZWwgSW52ZXJ0ICovCisJeyAweDExLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQUlOMSAqLworCXsgMHgxMiwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFJTjIgKi8KKwl7IDB4MTMsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBSU4zICovCisJeyAweDE0LCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQUlONCAqLworCXsgMHgxNSwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFJTjUgKi8KKwl7IDB4MTYsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBSU42ICovCisJeyAweDE3LCAweDAwIH0sICAgLyogQURDIENoYW5uZWwgSW52ZXJ0ICovCisJeyAweDE4LCAweDAwIH0sICAgLyogU3RhdHVzIENvbnRyb2wgKi8KKwl7IDB4MWEsIDB4MDAgfSwgICAvKiBTdGF0dXMgTWFzayAqLworCXsgMHgxYiwgMHgwMCB9LCAgIC8qIE1VVEVDIFBpbiBDb250cm9sICovCit9OworCitzdGF0aWMgYm9vbCBjczQyeHg4X3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQ1M0MlhYOF9TVEFUVVM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGNzNDJ4eDhfd3JpdGVhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQ1M0MlhYOF9DSElQSUQ6CisJY2FzZSBDUzQyWFg4X1NUQVRVUzoKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlOworCX0KK30KKworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mnh4OF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBDUzQyWFg4X0xBU1RSRUcsCisJLnJlZ19kZWZhdWx0cyA9IGNzNDJ4eDhfcmVnLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShjczQyeHg4X3JlZyksCisJLnZvbGF0aWxlX3JlZyA9IGNzNDJ4eDhfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLndyaXRlYWJsZV9yZWcgPSBjczQyeHg4X3dyaXRlYWJsZV9yZWdpc3RlciwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyeHg4X3JlZ21hcF9jb25maWcpOworCitzdGF0aWMgaW50IGNzNDJ4eDhfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjczQyeHg4X3ByaXYgKmNzNDJ4eDggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwlzd2l0Y2ggKGNzNDJ4eDgtPmRydmRhdGEtPm51bV9hZGNzKSB7CisJY2FzZSAzOgorCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgY3M0Mnh4OF9hZGMzX3NuZF9jb250cm9scywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfc25kX2NvbnRyb2xzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgY3M0Mnh4OF9hZGMzX2RhcG1fd2lkZ2V0cywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGNzNDJ4eDhfYWRjM19kYXBtX3JvdXRlcywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfZGFwbV9yb3V0ZXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogTXV0ZSBhbGwgREFDIGNoYW5uZWxzICovCisJcmVnbWFwX3dyaXRlKGNzNDJ4eDgtPnJlZ21hcCwgQ1M0MlhYOF9EQUNNVVRFLCBDUzQyWFg4X0RBQ01VVEVfQUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGNzNDJ4eDhfZHJpdmVyID0geworCS5wcm9iZSA9IGNzNDJ4eDhfY29kZWNfcHJvYmUsCisJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAorCisJLmNvbnRyb2xzID0gY3M0Mnh4OF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBjczQyeHg4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGNzNDJ4eDhfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3JvdXRlcyksCit9OworCitjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyNDQ4X2RhdGEgPSB7CisJLm5hbWUgPSAiY3M0MjQ0OCIsCisJLm51bV9hZGNzID0gMywKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyNDQ4X2RhdGEpOworCitjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyODg4X2RhdGEgPSB7CisJLm5hbWUgPSAiY3M0Mjg4OCIsCisJLm51bV9hZGNzID0gMiwKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyODg4X2RhdGEpOworCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNzNDJ4eDhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImNpcnJ1cyxjczQyNDQ4IiwgLmRhdGEgPSAmY3M0MjQ0OF9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2lycnVzLGNzNDI4ODgiLCAuZGF0YSA9ICZjczQyODg4X2RhdGEsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0Mnh4OF9vZl9tYXRjaCk7CitFWFBPUlRfU1lNQk9MX0dQTChjczQyeHg4X29mX21hdGNoKTsKKworaW50IGNzNDJ4eDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UoY3M0Mnh4OF9vZl9tYXRjaCwgZGV2KTsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4OworCWludCByZXQsIHZhbCwgaTsKKworCWNzNDJ4eDggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNzNDJ4eDgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3M0Mnh4OCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNzNDJ4eDgpOworCisJaWYgKG9mX2lkKQorCQljczQyeHg4LT5kcnZkYXRhID0gb2ZfaWQtPmRhdGE7CisKKwlpZiAoIWNzNDJ4eDgtPmRydmRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCBkcml2ZXIgZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNzNDJ4eDgtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJtY2xrIik7CisJaWYgKElTX0VSUihjczQyeHg4LT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB0aGUgY2xvY2s6ICVsZFxuIiwKKwkJCQlQVFJfRVJSKGNzNDJ4eDgtPmNsaykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljczQyeHg4LT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY3M0Mnh4OC0+Y2xrKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKTsgaSsrKQorCQljczQyeHg4LT5zdXBwbGllc1tpXS5zdXBwbHkgPSBjczQyeHg4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwKKwkJCUFSUkFZX1NJWkUoY3M0Mnh4OC0+c3VwcGxpZXMpLCBjczQyeHg4LT5zdXBwbGllcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShjczQyeHg4LT5zdXBwbGllcyksCisJCQkJICAgIGNzNDJ4eDgtPnN1cHBsaWVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogTWFrZSBzdXJlIGhhcmR3YXJlIHJlc2V0IGRvbmUgKi8KKwltc2xlZXAoNSk7CisKKwljczQyeHg4LT5yZWdtYXAgPSByZWdtYXA7CisJaWYgKElTX0VSUihjczQyeHg4LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoY3M0Mnh4OC0+cmVnbWFwKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCS8qCisJICogV2UgaGF2ZW4ndCBtYXJrZWQgdGhlIGNoaXAgcmV2aXNpb24gYXMgdm9sYXRpbGUgZHVlIHRvCisJICogc2hhcmluZyBhIHJlZ2lzdGVyIHdpdGggdGhlIHJpZ2h0IGlucHV0IHZvbHVtZTsgZXhwbGljaXRseQorCSAqIGJ5cGFzcyB0aGUgY2FjaGUgdG8gcmVhZCBpdC4KKwkgKi8KKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoY3M0Mnh4OC0+cmVnbWFwLCB0cnVlKTsKKworCS8qIFZhbGlkYXRlIHRoZSBjaGlwIElEICovCisJcmVnbWFwX3JlYWQoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0NISVBJRCwgJnZhbCk7CisJaWYgKHZhbCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGRldmljZSBJRDogJXgiLCB2YWwpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJLyogVGhlIHRvcCBmb3VyIGJpdHMgb2YgdGhlIGNoaXAgSUQgc2hvdWxkIGJlIDAwMDAgKi8KKwlpZiAoKHZhbCAmIENTNDJYWDhfQ0hJUElEX0NISVBfSURfTUFTSykgIT0gMHgwMCkgeworCQlkZXZfZXJyKGRldiwgInVubWF0Y2hlZCBjaGlwIElEOiAlZFxuIiwKKwkJCQl2YWwgJiBDUzQyWFg4X0NISVBJRF9DSElQX0lEX01BU0spOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJZGV2X2luZm8oZGV2LCAiZm91bmQgZGV2aWNlLCByZXZpc2lvbiAlWFxuIiwKKwkJCXZhbCAmIENTNDJYWDhfQ0hJUElEX1JFVl9JRF9NQVNLKTsKKworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhjczQyeHg4LT5yZWdtYXAsIGZhbHNlKTsKKworCWNzNDJ4eDhfZGFpLm5hbWUgPSBjczQyeHg4LT5kcnZkYXRhLT5uYW1lOworCisJLyogRWFjaCBhZGMgc3VwcG9ydHMgc3RlcmVvIGlucHV0ICovCisJY3M0Mnh4OF9kYWkuY2FwdHVyZS5jaGFubmVsc19tYXggPSBjczQyeHg4LT5kcnZkYXRhLT5udW1fYWRjcyAqIDI7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmNzNDJ4eDhfZHJpdmVyLCAmY3M0Mnh4OF9kYWksIDEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWM6JWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2VuYWJsZTsKKwl9CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGNzNDJ4eDgtPnJlZ21hcCwgdHJ1ZSk7CisKK2Vycl9lbmFibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3M0Mnh4OF9wcm9iZSk7CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBjczQyeHg4X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjczQyeHg4LT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIG1jbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCQkgICAgY3M0Mnh4OC0+c3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSByZXNldCBkb25lICovCisJbXNsZWVwKDUpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShjczQyeHg4LT5yZWdtYXAsIGZhbHNlKTsKKworCXJldCA9IHJlZ2NhY2hlX3N5bmMoY3M0Mnh4OC0+cmVnbWFwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHN5bmMgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfYnVsazsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2J1bGs6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CitlcnJfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShjczQyeHg4LT5jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjczQyeHg4X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNzNDJ4eDhfcHJpdiAqY3M0Mnh4OCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShjczQyeHg4LT5yZWdtYXAsIHRydWUpOworCisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY3M0Mnh4OC0+Y2xrKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK2NvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGNzNDJ4eDhfcG0gPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKGNzNDJ4eDhfcnVudGltZV9zdXNwZW5kLCBjczQyeHg4X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNzNDJ4eDhfcG0pOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBDUzQyNDQ4L0NTNDI4ODggQUxTQSBTb0MgQ29kZWMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmggYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiOTRhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmgKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBjczQyeHg4LmggLSBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIGRyaXZlciBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogTmljb2xpbiBDaGVuIDxHdWFuZ3l1LkNoZW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX0NTNDJYWDhfSAorI2RlZmluZSBfQ1M0MlhYOF9ICisKK3N0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIHsKKwljaGFyIG5hbWVbMzJdOworCWludCBudW1fYWRjczsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBjczQyeHg4X3BtOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIGNzNDI0NDhfZGF0YTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyODg4X2RhdGE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mnh4OF9yZWdtYXBfY29uZmlnOworaW50IGNzNDJ4eDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOworCisvKiBDUzQyODg4IHJlZ2lzdGVyIG1hcCAqLworI2RlZmluZSBDUzQyWFg4X0NISVBJRAkJCQkweDAxCS8qIENoaXAgSUQgKi8KKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVEwJCQkJMHgwMgkvKiBQb3dlciBDb250cm9sICovCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRAkJCQkweDAzCS8qIEZ1bmN0aW9uYWwgTW9kZSAqLworI2RlZmluZSBDUzQyWFg4X0lOVEYJCQkJMHgwNAkvKiBJbnRlcmZhY2UgRm9ybWF0cyAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0NUTAkJCQkweDA1CS8qIEFEQyBDb250cm9sICovCisjZGVmaW5lIENTNDJYWDhfVFhDVEwJCQkJMHgwNgkvKiBUcmFuc2l0aW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MlhYOF9EQUNNVVRFCQkJCTB4MDcJLyogREFDIE11dGUgQ29udHJvbCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQxCQkJMHgwOAkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMSAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQyCQkJMHgwOQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMiAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQzCQkJMHgwQQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ0CQkJMHgwQgkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ1CQkJMHgwQwkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNSAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ2CQkJMHgwRAkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNiAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ3CQkJMHgwRQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ4CQkJMHgwRgkvKiBWb2x1bWUgQ29udHJvbCBBT1VUOCAqLworI2RlZmluZSBDUzQyWFg4X0RBQ0lOVgkJCQkweDEwCS8qIERBQyBDaGFubmVsIEludmVydCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFJTjEJCQkJMHgxMQkvKiBWb2x1bWUgQ29udHJvbCBBSU4xICovCisjZGVmaW5lIENTNDJYWDhfVk9MQUlOMgkJCQkweDEyCS8qIFZvbHVtZSBDb250cm9sIEFJTjIgKi8KKyNkZWZpbmUgQ1M0MlhYOF9WT0xBSU4zCQkJCTB4MTMJLyogVm9sdW1lIENvbnRyb2wgQUlOMyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFJTjQJCQkJMHgxNAkvKiBWb2x1bWUgQ29udHJvbCBBSU40ICovCisjZGVmaW5lIENTNDJYWDhfVk9MQUlONQkJCQkweDE1CS8qIFZvbHVtZSBDb250cm9sIEFJTjUgKi8KKyNkZWZpbmUgQ1M0MlhYOF9WT0xBSU42CQkJCTB4MTYJLyogVm9sdW1lIENvbnRyb2wgQUlONiAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0lOVgkJCQkweDE3CS8qIEFEQyBDaGFubmVsIEludmVydCAqLworI2RlZmluZSBDUzQyWFg4X1NUQVRVU0NUTAkJCTB4MTgJLyogU3RhdHVzIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVMJCQkJMHgxOQkvKiBTdGF0dXMgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNNCQkJCTB4MUEJLyogU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQwkJCQkweDFCCS8qIE1VVEVDIFBpbiBDb250cm9sICovCisKKyNkZWZpbmUgQ1M0MlhYOF9GSVJTVFJFRwkJCUNTNDJYWDhfQ0hJUElECisjZGVmaW5lIENTNDJYWDhfTEFTVFJFRwkJCQlDUzQyWFg4X01VVEVDCisjZGVmaW5lIENTNDJYWDhfTlVNUkVHUwkJCQkoQ1M0MlhYOF9MQVNUUkVHIC0gQ1M0MlhYOF9GSVJTVFJFRyArIDEpCisjZGVmaW5lIENTNDJYWDhfSTJDX0lOQ1IJCQkweDgwCisKKy8qIENoaXAgSS5ELiBhbmQgUmV2aXNpb24gUmVnaXN0ZXIgKEFkZHJlc3MgMDFoKSAqLworI2RlZmluZSBDUzQyWFg4X0NISVBJRF9DSElQX0lEX01BU0sJCTB4RjAKKyNkZWZpbmUgQ1M0MlhYOF9DSElQSURfUkVWX0lEX01BU0sJCTB4MEYKKworLyogUG93ZXIgQ29udHJvbCAoQWRkcmVzcyAwMmgpICovCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUCQk3CisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMwkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVAkJNgorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9NQVNLCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzIJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQJCTUKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfTUFTSwkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMxCQkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUCQk0CisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDNAkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVAkJMworI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19NQVNLCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzMJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMyCQkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUCQkxCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDMQkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fU0hJRlQJCTAKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX01BU0sJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETgkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9TSElGVCkKKworLyogRnVuY3Rpb25hbCBNb2RlIChBZGRyZXNzIDAzaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX0RBQ19GTV9TSElGVAkJNgorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9EQUNfRk1fTUFTSwkJKCgoMSA8PCBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfRlVOQ01PRF9EQUNfRk1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9EQUNfRk0odikJCSgodikgPDwgQ1M0MlhYOF9GVU5DTU9EX0RBQ19GTV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX0FEQ19GTV9TSElGVAkJNAorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9BRENfRk1fTUFTSwkJKCgoMSA8PCBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfRlVOQ01PRF9BRENfRk1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9BRENfRk0odikJCSgodikgPDwgQ1M0MlhYOF9GVU5DTU9EX0FEQ19GTV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX3hDX0ZNX01BU0soeCkJCSgoeCkgPyBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX01BU0sgOiBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX01BU0spCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF94Q19GTSh4LCB2KQkJKCh4KSA/IENTNDJYWDhfRlVOQ01PRF9EQUNfRk0odikgOiBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNKHYpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQJCTEKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX01GUkVRX1dJRFRICQkzCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV9NQVNLCQkoKCgxIDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9XSURUSCkgLSAxKSA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV8yNTYocykJCSgoMCA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpID4+IChzID4+IDEpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMzg0KHMpCQkoKDEgPDwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRX1NISUZUKSA+PiAocyA+PiAxKSkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzUxMihzKQkJKCgyIDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9TSElGVCkgPj4gKHMgPj4gMSkpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV83NjgocykJCSgoMyA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpID4+IChzID4+IDEpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMTAyNChzKQkJKCg0IDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9TSElGVCkgPj4gKHMgPj4gMSkpCisKKyNkZWZpbmUgQ1M0MlhYOF9GTV9TSU5HTEUJCQkwCisjZGVmaW5lIENTNDJYWDhfRk1fRE9VQkxFCQkJMQorI2RlZmluZSBDUzQyWFg4X0ZNX1FVQUQJCQkJMgorI2RlZmluZSBDUzQyWFg4X0ZNX0FVVE8JCQkJMworCisvKiBJbnRlcmZhY2UgRm9ybWF0cyAoQWRkcmVzcyAwNGgpICovCisjZGVmaW5lIENTNDJYWDhfSU5URl9GUkVFWkVfU0hJRlQJCTcKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0ZSRUVaRV9NQVNLCQkoMSA8PCBDUzQyWFg4X0lOVEZfRlJFRVpFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfRlJFRVpFCQkJKDEgPDwgQ1M0MlhYOF9JTlRGX0ZSRUVaRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQJCTYKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfTUFTSwkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BVVhfRElGCQkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUCQkzCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX1dJRFRICQkzCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX01BU0sJCSgoKDEgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX0xFRlRKCQkoMCA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfSTJTCQkoMSA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfUklHSFRKCQkoMiA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfUklHSFRKXzE2CQkoMyA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfT05FTElORV8yMAkJKDQgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX09ORUxJTkVfMjQJCSg2IDw8IENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfREFDX0RJRl9URE0JCSg3IDw8IENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVAkJMAorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9XSURUSAkJMworI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9NQVNLCQkoKCgxIDw8IENTNDJYWDhfSU5URl9BRENfRElGX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfSU5URl9BRENfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9MRUZUSgkJKDAgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX0kyUwkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX1JJR0hUSgkJKDIgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX1JJR0hUSl8xNgkJKDMgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX09ORUxJTkVfMjAJCSg0IDw8IENTNDJYWDhfSU5URl9BRENfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9PTkVMSU5FXzI0CQkoNiA8PCBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfVERNCQkoNyA8PCBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVCkKKworLyogQURDIENvbnRyb2wgJiBEQUMgRGUtRW1waGFzaXMgKEFkZHJlc3MgMDVoKSAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BRENfSFBGX0ZSRUVaRV9TSElGVAk3CisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQ19IUEZfRlJFRVpFX01BU0sJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDX0hQRl9GUkVFWkVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQ19IUEZfRlJFRVpFCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BRENfSFBGX0ZSRUVaRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfREFDX0RFTV9TSElGVAkJNQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9EQUNfREVNX01BU0sJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0RBQ19ERU1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0RBQ19ERU0JCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9EQUNfREVNX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMxX1NJTkdMRV9TSElGVAk0CisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzFfU0lOR0xFX01BU0sJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0FEQzFfU0lOR0xFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMxX1NJTkdMRQkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDMV9TSU5HTEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzJfU0lOR0xFX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDMl9TSU5HTEVfTUFTSwkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDMl9TSU5HTEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzJfU0lOR0xFCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BREMyX1NJTkdMRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDM19TSU5HTEVfU0hJRlQJMgorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMzX1NJTkdMRV9NQVNLCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BREMzX1NJTkdMRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDM19TSU5HTEUJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0FEQzNfU0lOR0xFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVAkJMQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9NQVNLCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONV9NVVgJCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQJCTAKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfTUFTSwkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FJTjZfTVVYCQkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQpCisKKy8qIFRyYW5zaXRpb24gQ29udHJvbCAoQWRkcmVzcyAwNmgpICovCisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NOR1ZPTF9TSElGVAkJNworI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TTkdWT0xfTUFTSwkJKDEgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU05HVk9MX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TTkdWT0wJCSgxIDw8IENTNDJYWDhfVFhDVExfREFDX1NOR1ZPTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUCQk1CisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NaQ19XSURUSAkJMgorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfTUFTSwkJKCgoMSA8PCBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfSUMJCSgwIDw8IENTNDJYWDhfVFhDVExfREFDX1NaQ19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1pDCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NaQ19TUgkJKDIgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfU1JaQwkJKDMgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FNVVRFX1NISUZUCQk0CisjZGVmaW5lIENTNDJYWDhfVFhDVExfQU1VVEVfTUFTSwkJKDEgPDwgQ1M0MlhYOF9UWENUTF9BTVVURV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BTVVURQkJCSgxIDw8IENTNDJYWDhfVFhDVExfQU1VVEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfTVVURV9BRENfU1BfU0hJRlQJCTMKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9NVVRFX0FEQ19TUF9NQVNLCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TTkdWT0xfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU05HVk9MX01BU0sJCSgxIDw8IENTNDJYWDhfVFhDVExfQURDX1NOR1ZPTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU05HVk9MCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TTkdWT0xfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfQURDX1NaQ19TSElGVAkJMAorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfTUFTSwkJKCgoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfSUMJCSgwIDw8IENTNDJYWDhfVFhDVExfQURDX1NaQ19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1pDCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfQURDX1NaQ19TUgkJKDIgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfU1JaQwkJKDMgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorCisvKiBEQUMgQ2hhbm5lbCBNdXRlIChBZGRyZXNzIDA3aCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9EQUNNVVRFX0FPVVQobikJCQkoMHgxIDw8IG4pCisjZGVmaW5lIENTNDJYWDhfREFDTVVURV9BTEwJCQkweGZmCisKKy8qIFN0YXR1cyBDb250cm9sIChBZGRyZXNzIDE4aCkqLworI2RlZmluZSBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNDVExfSU5JX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9NQVNLCQkoKCgxIDw8IENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9XSURUSCkgLSAxKSA8PCBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOVF9BQ1RJVkVfSElHSAkoMCA8PCBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOVF9BQ1RJVkVfTE9XCSgxIDw8IENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNDVExfSU5UX09QRU5fRFJBSU4JKDIgPDwgQ1M0MlhYOF9TVEFUVVNDVExfSU5JX1NISUZUKQorCisvKiBTdGF0dXMgKEFkZHJlc3MgMTloKSovCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0RBQ19DTEtfRVJSX1NISUZUCTQKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQ19DTEtfRVJSX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzNfT1ZGTF9TSElGVAkJMgorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BREMzX09WRkxfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BREMyX09WRkxfU0hJRlQJCTEKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01BU0sJCSgxIDw8IENTNDJYWDhfU1RBVFVTX0FEQzJfT1ZGTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX1NISUZUCQkwCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzFfT1ZGTF9NQVNLCQkoMSA8PCBDUzQyWFg4X1NUQVRVU19BREMxX09WRkxfU0hJRlQpCisKKy8qIFN0YXR1cyBNYXNrIChBZGRyZXNzIDFBaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfTV9TSElGVAk0CisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0RBQ19DTEtfRVJSX01fTUFTSwkoMSA8PCBDUzQyWFg4X1NUQVRVU19EQUNfQ0xLX0VSUl9NX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BRENfQ0xLX0VSUl9NX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfTV9NQVNLCSgxIDw8IENTNDJYWDhfU1RBVFVTX0FEQ19DTEtfRVJSX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzNfT1ZGTF9NX1NISUZUCTIKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzJfT1ZGTF9NX1NISUZUCTEKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzFfT1ZGTF9NX1NISUZUCTAKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX01fU0hJRlQpCisKKy8qIE1VVEVDIFBpbiBDb250cm9sIChBZGRyZXNzIDFCaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NQ1BPTEFSSVRZX1NISUZUCQkxCisjZGVmaW5lIENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9NQVNLCQkoMSA8PCBDUzQyWFg4X01VVEVDX01DUE9MQVJJVFlfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9BQ1RJVkVfTE9XCSgwIDw8IENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NQ1BPTEFSSVRZX0FDVElWRV9ISUdICSgxIDw8IENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NVVRFQ19BQ1RJVkVfU0hJRlQJMAorI2RlZmluZSBDUzQyWFg4X01VVEVDX01VVEVDX0FDVElWRV9NQVNLCQkoMSA8PCBDUzQyWFg4X01VVEVDX01VVEVDX0FDVElWRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NVVRFQ19BQ1RJVkUJCSgxIDw8IENTNDJYWDhfTVVURUNfTVVURUNfQUNUSVZFX1NISUZUKQorI2VuZGlmIC8qIF9DUzQyWFg4X0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCmluZGV4IGU2MmUyOTQuLjEzN2U4ZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYwpAQCAtMzA3LDI5ICszMDcsMjkgQEAKIAkiRnMvODE5MipwaSIsICJGcy80MDk2KnBpIiwgIkZzLzIwNDgqcGkiLCAiRnMvMTAyNCpwaSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEwX2RhY19ocGZfY3V0b2ZmID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEwX0RBQ19IUEYsIDAsIDQsIGRhNzIxMF9ocGZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2RhY19ocGZfY3V0b2ZmLAorCQkJICAgIERBNzIxMF9EQUNfSFBGLCAwLCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxMF9hZGNfaHBmX2N1dG9mZiwKKwkJCSAgICBEQTcyMTBfQURDX0hQRiwgMCwgZGE3MjEwX2hwZl9jdXRvZmZfdHh0KTsKIAogLyogQURDIGFuZCBEQUMgdm9pY2UgKDhrSHopIGhpZ2ggcGFzcyBjdXRvZmYgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEwX3ZmX2N1dG9mZl90eHRbXSA9IHsKIAkiMi41SHoiLCAiMjVIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjMwMEh6IiwgIjQwMEh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTBfZGFjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9EQUNfSFBGLCA0LCA4LCBkYTcyMTBfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2RhY192Zl9jdXRvZmYsCisJCQkgICAgREE3MjEwX0RBQ19IUEYsIDQsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTBfYWRjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCA0LCA4LCBkYTcyMTBfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2FkY192Zl9jdXRvZmYsCisJCQkgICAgREE3MjEwX0FEQ19IUEYsIDQsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRhNzIxMF9ocF9tb2RlX3R4dFtdID0gewogCSJDbGFzcyBIIiwgIkNsYXNzIEciCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9ocF9tb2RlX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9IUF9DRkcsIDAsIDIsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2hwX21vZGVfc2VsLAorCQkJICAgIERBNzIxMF9IUF9DRkcsIDAsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CiAKIC8qIEFMQyBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIG5vaXNlIHN1cHByZXNzaW9uIGlzIGRpc2FibGVkICovCiBzdGF0aWMgaW50IGRhNzIxMF9wdXRfYWxjX3N3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMTA3MSwxNyArMTA3MSw5IEBACiBzdGF0aWMgaW50IGRhNzIxMF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGRhNzIxMF9wcml2ICpkYTcyMTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhNzIxMC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWRhNzIxMC0+bWNsa19yYXRlICAgICAgID0gMDsgICAgLyogVGhpcyB3aWxsIGJlIHNldCBmcm9tIHNldF9zeXNjbGsoKSAqLwogCWRhNzIxMC0+bWFzdGVyICAgICAgICAgID0gMDsgICAgLyogVGhpcyB3aWxsIGJlIHNldCBmcm9tIHNldF9mbXQoKSAqLwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYwppbmRleCAwYzc3ZTdhLi43MzhmYTE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMKQEAgLTYzLDMwICs2MywzMCBAQAogCSIyLjVIeiIsICIyNUh6IiwgIjUwSHoiLCAiMTAwSHoiLCAiMTUwSHoiLCAiMjAwSHoiLCAiMzAwSHoiLCAiNDAwSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfdm9pY2VfaHBmX2Nvcm5lciA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfRklMVEVSUzEsIERBNzIxM19WT0lDRV9IUEZfQ09STkVSX1NISUZULAotCQkJREE3MjEzX1ZPSUNFX0hQRl9DT1JORVJfTUFYLAotCQkJZGE3MjEzX3ZvaWNlX2hwZl9jb3JuZXJfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX3ZvaWNlX2hwZl9jb3JuZXIsCisJCQkgICAgREE3MjEzX0RBQ19GSUxURVJTMSwKKwkJCSAgICBEQTcyMTNfVk9JQ0VfSFBGX0NPUk5FUl9TSElGVCwKKwkJCSAgICBkYTcyMTNfdm9pY2VfaHBmX2Nvcm5lcl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19hZGNfdm9pY2VfaHBmX2Nvcm5lciA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BRENfRklMVEVSUzEsIERBNzIxM19WT0lDRV9IUEZfQ09STkVSX1NISUZULAotCQkJREE3MjEzX1ZPSUNFX0hQRl9DT1JORVJfTUFYLAotCQkJZGE3MjEzX3ZvaWNlX2hwZl9jb3JuZXJfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWRjX3ZvaWNlX2hwZl9jb3JuZXIsCisJCQkgICAgREE3MjEzX0FEQ19GSUxURVJTMSwKKwkJCSAgICBEQTcyMTNfVk9JQ0VfSFBGX0NPUk5FUl9TSElGVCwKKwkJCSAgICBkYTcyMTNfdm9pY2VfaHBmX2Nvcm5lcl90eHQpOwogCiAvKiBBREMgYW5kIERBQyBoaWdoIHBhc3MgZmlsdGVyIGN1dG9mZiB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfYXVkaW9faHBmX2Nvcm5lcl90eHRbXSA9IHsKIAkiRnMvMjQwMDAiLCAiRnMvMTIwMDAiLCAiRnMvNjAwMCIsICJGcy8zMDAwIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX2F1ZGlvX2hwZl9jb3JuZXIgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfREFDX0ZJTFRFUlMxLCBEQTcyMTNfQVVESU9fSFBGX0NPUk5FUl9TSElGVCwKLQkJCURBNzIxM19BVURJT19IUEZfQ09STkVSX01BWCwKLQkJCWRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhY19hdWRpb19ocGZfY29ybmVyLAorCQkJICAgIERBNzIxM19EQUNfRklMVEVSUzEKKwkJCSAgICAsIERBNzIxM19BVURJT19IUEZfQ09STkVSX1NISUZULAorCQkJICAgIGRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FkY19hdWRpb19ocGZfY29ybmVyID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0FEQ19GSUxURVJTMSwgREE3MjEzX0FVRElPX0hQRl9DT1JORVJfU0hJRlQsCi0JCQlEQTcyMTNfQVVESU9fSFBGX0NPUk5FUl9NQVgsCi0JCQlkYTcyMTNfYXVkaW9faHBmX2Nvcm5lcl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hZGNfYXVkaW9faHBmX2Nvcm5lciwKKwkJCSAgICBEQTcyMTNfQURDX0ZJTFRFUlMxLAorCQkJICAgIERBNzIxM19BVURJT19IUEZfQ09STkVSX1NISUZULAorCQkJICAgIGRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CiAKIC8qIEdhaW4gcmFtcGluZyByYXRlIHZhbHVlICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19nYWluX3JhbXBfcmF0ZV90eHRbXSA9IHsKQEAgLTk0LDUyICs5NCw1MCBAQAogCSJub21pbmFsIHJhdGUgLyAzMiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2dhaW5fcmFtcF9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0dBSU5fUkFNUF9DVFJMLCBEQTcyMTNfR0FJTl9SQU1QX1JBVEVfU0hJRlQsCi0JCQlEQTcyMTNfR0FJTl9SQU1QX1JBVEVfTUFYLCBkYTcyMTNfZ2Fpbl9yYW1wX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZ2Fpbl9yYW1wX3JhdGUsCisJCQkgICAgREE3MjEzX0dBSU5fUkFNUF9DVFJMLAorCQkJICAgIERBNzIxM19HQUlOX1JBTVBfUkFURV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZ2Fpbl9yYW1wX3JhdGVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgc2V0dXAgdGltZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0W10gPSB7CiAJIjI1NiBzYW1wbGVzIiwgIjUxMiBzYW1wbGVzIiwgIjEwMjQgc2FtcGxlcyIsICIyMDQ4IHNhbXBsZXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfbmdfc2V0dXBfdGltZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfTkdfU0VUVVBfVElNRSwKLQkJCURBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9TSElGVCwKLQkJCURBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9NQVgsCi0JCQlkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX25nX3NldHVwX3RpbWUsCisJCQkgICAgREE3MjEzX0RBQ19OR19TRVRVUF9USU1FLAorCQkJICAgIERBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcHVwIHJhdGUgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEzX2RhY19uZ19yYW1wdXBfdHh0W10gPSB7CiAJIjAuMDIgbXMvZEIiLCAiMC4xNiBtcy9kQiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhY19uZ19yYW1wdXBfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfTkdfU0VUVVBfVElNRSwKLQkJCURBNzIxM19EQUNfTkdfUkFNUFVQX1JBVEVfU0hJRlQsCi0JCQlEQTcyMTNfREFDX05HX1JBTVBfUkFURV9NQVgsCi0JCQlkYTcyMTNfZGFjX25nX3JhbXB1cF90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfbmdfcmFtcHVwX3JhdGUsCisJCQkgICAgREE3MjEzX0RBQ19OR19TRVRVUF9USU1FLAorCQkJICAgIERBNzIxM19EQUNfTkdfUkFNUFVQX1JBVEVfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhY19uZ19yYW1wdXBfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcGRvd24gcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3R4dFtdID0gewogCSIwLjY0IG1zL2RCIiwgIjIwLjQ4IG1zL2RCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfREFDX05HX1NFVFVQX1RJTUUsCi0JCQlEQTcyMTNfREFDX05HX1JBTVBETl9SQVRFX1NISUZULAotCQkJREE3MjEzX0RBQ19OR19SQU1QX1JBVEVfTUFYLAotCQkJZGE3MjEzX2RhY19uZ19yYW1wZG93bl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfbmdfcmFtcGRvd25fcmF0ZSwKKwkJCSAgICBEQTcyMTNfREFDX05HX1NFVFVQX1RJTUUsCisJCQkgICAgREE3MjEzX0RBQ19OR19SQU1QRE5fUkFURV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3R4dCk7CiAKIC8qIERBQyBzb2Z0IG11dGUgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlX3R4dFtdID0gewogCSIxIiwgIjIiLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjY0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0RBQ19GSUxURVJTNSwgREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX1NISUZULAotCQkJREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX01BWCwKLQkJCWRhNzIxM19kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlLAorCQkJICAgIERBNzIxM19EQUNfRklMVEVSUzUsCisJCQkgICAgREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX1NISUZULAorCQkJICAgIGRhNzIxM19kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKIAogLyogQUxDIEF0dGFjayBSYXRlIHNlbGVjdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfYWxjX2F0dGFja19yYXRlX3R4dFtdID0gewpAQCAtMTQ3LDkgKzE0NSwxMCBAQAogCSI1NjMyL2ZzIiwgIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19hdHRhY2tfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDIsIERBNzIxM19BTENfQVRUQUNLX1NISUZULAotCQkJREE3MjEzX0FMQ19BVFRBQ0tfTUFYLCBkYTcyMTNfYWxjX2F0dGFja19yYXRlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2FsY19hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwyLAorCQkJICAgIERBNzIxM19BTENfQVRUQUNLX1NISUZULAorCQkJICAgIGRhNzIxM19hbGNfYXR0YWNrX3JhdGVfdHh0KTsKIAogLyogQUxDIFJlbGVhc2UgUmF0ZSBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEzX2FsY19yZWxlYXNlX3JhdGVfdHh0W10gPSB7CkBAIC0xNTcsOSArMTU2LDEwIEBACiAJIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfQUxDX0NUUkwyLCBEQTcyMTNfQUxDX1JFTEVBU0VfU0hJRlQsCi0JCQlEQTcyMTNfQUxDX1JFTEVBU0VfTUFYLCBkYTcyMTNfYWxjX3JlbGVhc2VfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hbGNfcmVsZWFzZV9yYXRlLAorCQkJICAgIERBNzIxM19BTENfQ1RSTDIsCisJCQkgICAgREE3MjEzX0FMQ19SRUxFQVNFX1NISUZULAorCQkJICAgIGRhNzIxM19hbGNfcmVsZWFzZV9yYXRlX3R4dCk7CiAKIC8qIEFMQyBIb2xkIFRpbWUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19hbGNfaG9sZF90aW1lX3R4dFtdID0gewpAQCAtMTY4LDIyICsxNjgsMjUgQEAKIAkiMjUzOTUyL2ZzIiwgIjUwNzkwNC9mcyIsICIxMDE1ODA4L2ZzIiwgIjIwMzE2MTYvZnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19hbGNfaG9sZF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0FMQ19DVFJMMywgREE3MjEzX0FMQ19IT0xEX1NISUZULAotCQkJREE3MjEzX0FMQ19IT0xEX01BWCwgZGE3MjEzX2FsY19ob2xkX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWxjX2hvbGRfdGltZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwzLAorCQkJICAgIERBNzIxM19BTENfSE9MRF9TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2hvbGRfdGltZV90eHQpOwogCiAvKiBBTEMgSW5wdXQgU2lnbmFsIFRyYWNraW5nIHJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19hbGNfaW50ZWdfcmF0ZV90eHRbXSA9IHsKIAkiMS80IiwgIjEvMTYiLCAiMS8yNTYiLCAiMS82NTUzNiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19pbnRlZ19hdHRhY2tfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDMsIERBNzIxM19BTENfSU5URUdfQVRUQUNLX1NISUZULAotCQkJREE3MjEzX0FMQ19JTlRFR19NQVgsIGRhNzIxM19hbGNfaW50ZWdfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hbGNfaW50ZWdfYXR0YWNrX3JhdGUsCisJCQkgICAgREE3MjEzX0FMQ19DVFJMMywKKwkJCSAgICBEQTcyMTNfQUxDX0lOVEVHX0FUVEFDS19TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfYWxjX2ludGVnX3JlbGVhc2VfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDMsIERBNzIxM19BTENfSU5URUdfUkVMRUFTRV9TSElGVCwKLQkJCURBNzIxM19BTENfSU5URUdfTUFYLCBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWxjX2ludGVnX3JlbGVhc2VfcmF0ZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwzLAorCQkJICAgIERBNzIxM19BTENfSU5URUdfUkVMRUFTRV9TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKIAogCiAvKgpAQCAtNTg0LDE1ICs1ODcsMTcgQEAKIAkiRGlmZmVyZW50aWFsIiwgIk1JQ19QIiwgIk1JQ19OIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfbWljXzFfYW1wX2luX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19NSUNfMV9DVFJMLCBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCi0JCQlEQTcyMTNfTUlDX0FNUF9JTl9TRUxfTUFYLCBkYTcyMTNfbWljX2FtcF9pbl9zZWxfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfbWljXzFfYW1wX2luX3NlbCwKKwkJCSAgICBEQTcyMTNfTUlDXzFfQ1RSTCwKKwkJCSAgICBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCisJCQkgICAgZGE3MjEzX21pY19hbXBfaW5fc2VsX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX21pY18xX2FtcF9pbl9zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNaWMgMSBBbXAgU291cmNlIE1VWCIsIGRhNzIxM19taWNfMV9hbXBfaW5fc2VsKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfbWljXzJfYW1wX2luX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19NSUNfMl9DVFJMLCBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCi0JCQlEQTcyMTNfTUlDX0FNUF9JTl9TRUxfTUFYLCBkYTcyMTNfbWljX2FtcF9pbl9zZWxfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfbWljXzJfYW1wX2luX3NlbCwKKwkJCSAgICBEQTcyMTNfTUlDXzJfQ1RSTCwKKwkJCSAgICBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCisJCQkgICAgZGE3MjEzX21pY19hbXBfaW5fc2VsX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX21pY18yX2FtcF9pbl9zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNaWMgMiBBbXAgU291cmNlIE1VWCIsIGRhNzIxM19taWNfMl9hbXBfaW5fc2VsKTsKIApAQCAtNjAxLDE1ICs2MDYsMTcgQEAKIAkiQURDIExlZnQiLCAiQURDIFJpZ2h0IiwgIkRBSSBJbnB1dCBMZWZ0IiwgIkRBSSBJbnB1dCBSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhaV9sX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19ESUdfUk9VVElOR19EQUksIERBNzIxM19EQUlfTF9TUkNfU0hJRlQsCi0JCQlEQTcyMTNfREFJX1NSQ19NQVgsIGRhNzIxM19kYWlfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhaV9sX3NyYywKKwkJCSAgICBEQTcyMTNfRElHX1JPVVRJTkdfREFJLAorCQkJICAgIERBNzIxM19EQUlfTF9TUkNfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhaV9zcmNfdHh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTNfZGFpX2xfc3JjX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFJIExlZnQgU291cmNlIE1VWCIsIGRhNzIxM19kYWlfbF9zcmMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWlfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfRElHX1JPVVRJTkdfREFJLCBEQTcyMTNfREFJX1JfU1JDX1NISUZULAotCQkJREE3MjEzX0RBSV9TUkNfTUFYLCBkYTcyMTNfZGFpX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWlfcl9zcmMsCisJCQkgICAgREE3MjEzX0RJR19ST1VUSU5HX0RBSSwKKwkJCSAgICBEQTcyMTNfREFJX1JfU1JDX1NISUZULAorCQkJICAgIGRhNzIxM19kYWlfc3JjX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX2RhaV9yX3NyY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBSSBSaWdodCBTb3VyY2UgTVVYIiwgZGE3MjEzX2RhaV9yX3NyYyk7CiAKQEAgLTYxOSwxNSArNjI2LDE3IEBACiAJIkRBSSBJbnB1dCBSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhY19sX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19ESUdfUk9VVElOR19EQUMsIERBNzIxM19EQUNfTF9TUkNfU0hJRlQsCi0JCQlEQTcyMTNfREFDX1NSQ19NQVgsIGRhNzIxM19kYWNfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhY19sX3NyYywKKwkJCSAgICBEQTcyMTNfRElHX1JPVVRJTkdfREFDLAorCQkJICAgIERBNzIxM19EQUNfTF9TUkNfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhY19zcmNfdHh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTNfZGFjX2xfc3JjX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDIExlZnQgU291cmNlIE1VWCIsIGRhNzIxM19kYWNfbF9zcmMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfRElHX1JPVVRJTkdfREFDLCBEQTcyMTNfREFDX1JfU1JDX1NISUZULAotCQkJREE3MjEzX0RBQ19TUkNfTUFYLCBkYTcyMTNfZGFjX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfcl9zcmMsCisJCQkgICAgREE3MjEzX0RJR19ST1VUSU5HX0RBQywKKwkJCSAgICBEQTcyMTNfREFDX1JfU1JDX1NISUZULAorCQkJICAgIGRhNzIxM19kYWNfc3JjX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX2RhY19yX3NyY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBSaWdodCBTb3VyY2UgTVVYIiwgZGE3MjEzX2RhY19yX3NyYyk7CiAKQEAgLTEzODQsMTcgKzEzOTMsOSBAQAogCiBzdGF0aWMgaW50IGRhNzIxM19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGE3MjEzX3ByaXYgKmRhNzIxMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCBkYTcyMTNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYTcyMTMtPnBkYXRhOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhNzIxMy0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIERlZmF1bHQgdG8gdXNpbmcgQUxDIGF1dG8gb2Zmc2V0IGNhbGlicmF0aW9uIG1vZGUuICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX0FMQ19DVFJMMSwKIAkJCSAgICBEQTcyMTNfQUxDX0NBTElCX01PREVfTUFOLCAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCmluZGV4IGY0ZDk2NWViYy4uN2QxNjhlYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTczMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCkBAIC0yNjksODEgKzI2OSw2NSBAQAogCSIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzFfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMxX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMxX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzJfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzJfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMyX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzNfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzNfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMzX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMzX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzFfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMxX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMxX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzJfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzJfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMyX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzFfaHBfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19EQUMxX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKLQkJCURBNzMyWF9IUEZfTVVTSUNfTUFYLCBkYTczMnhfaHBmX211c2ljKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfZGFjMV9ocF9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbXVzaWMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9kYWMyX2hwX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfREFDMl9IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01VU0lDX01BWCwgZGE3MzJ4X2hwZl9tdXNpYykKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2RhYzJfaHBfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX211c2ljKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfZGFjM19ocF9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzNfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAotCQkJREE3MzJYX0hQRl9NVVNJQ19NQVgsIGRhNzMyeF9ocGZfbXVzaWMpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMzX2hwX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfREFDM19IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl9tdXNpYyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzFfaHBfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19BREMxX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKLQkJCURBNzMyWF9IUEZfTVVTSUNfTUFYLCBkYTczMnhfaHBmX211c2ljKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfYWRjMV9ocF9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbXVzaWMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9hZGMyX2hwX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfQURDMl9IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01VU0lDX01BWCwgZGE3MzJ4X2hwZl9tdXNpYykKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2FkYzJfaHBfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX211c2ljKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfZGFjMV92b2ljZV9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAotCQkJREE3MzJYX0hQRl9WT0lDRV9NQVgsIGRhNzMyeF9ocGZfdm9pY2UpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMxX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfREFDMV9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzJfdm9pY2VfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKLQkJCURBNzMyWF9IUEZfVk9JQ0VfTUFYLCBkYTczMnhfaHBmX3ZvaWNlKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfZGFjMl92b2ljZV9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0RBQzJfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfdm9pY2UpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9kYWMzX3ZvaWNlX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfREFDM19IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCi0JCQlEQTczMlhfSFBGX1ZPSUNFX01BWCwgZGE3MzJ4X2hwZl92b2ljZSkKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2RhYzNfdm9pY2VfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMzX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX3ZvaWNlKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfYWRjMV92b2ljZV9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAotCQkJREE3MzJYX0hQRl9WT0lDRV9NQVgsIGRhNzMyeF9ocGZfdm9pY2UpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMxX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfQURDMV9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzJfdm9pY2VfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKLQkJCURBNzMyWF9IUEZfVk9JQ0VfTUFYLCBkYTczMnhfaHBmX3ZvaWNlKQotfTsKLQorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMyX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfQURDMl9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKIHN0YXRpYyBpbnQgZGE3MzJ4X2hwZl9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtNzE0LDY1ICs2OTgsNjUgQEAKIH07CiAKIC8qIEFEQzFMTVVYICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzFsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMxTF9NVVhfU0VMX1NISUZULAotCQkJREE3MzJYX0FEQ0xfTVVYX01BWCwgYWRjbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGMxbF9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzFMX01VWF9TRUxfU0hJRlQsCisJCQkgICAgYWRjbF90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGMxbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBSb3V0ZSIsIGFkYzFsX2VudW0pOwogCiAvKiBBREMxUk1VWCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMxcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19JTlBfTVVYLCBEQTczMlhfQURDMVJfTVVYX1NFTF9TSElGVCwKLQkJCURBNzMyWF9BRENSX01VWF9NQVgsIGFkY3JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjMXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMxUl9NVVhfU0VMX1NISUZULAorCQkJICAgIGFkY3JfdGV4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjMXJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBREMgUm91dGUiLCBhZGMxcl9lbnVtKTsKIAogLyogQURDMkxNVVggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMmxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzJMX01VWF9TRUxfU0hJRlQsCi0JCQlEQTczMlhfQURDTF9NVVhfTUFYLCBhZGNsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYzJsX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19JTlBfTVVYLCBEQTczMlhfQURDMkxfTVVYX1NFTF9TSElGVCwKKwkJCSAgICBhZGNsX3RleHQpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYzJsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQURDIFJvdXRlIiwgYWRjMmxfZW51bSk7CiAKIC8qIEFEQzJSTVVYICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzJyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMyUl9NVVhfU0VMX1NISUZULAotCQkJREE3MzJYX0FEQ1JfTVVYX01BWCwgYWRjcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGMycl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzJSX01VWF9TRUxfU0hJRlQsCisJCQkgICAgYWRjcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYzJyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQURDIFJvdXRlIiwgYWRjMnJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2hwX2xlZnRfb3V0cHV0ID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAotCQkJREE3MzJYX0RBQ19FTl9NQVgsIGVuYWJsZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfaHBfbGVmdF9vdXRwdXQsCisJCQkgICAgREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQTCBTd2l0Y2giLCBkYTczMnhfaHBfbGVmdF9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9ocF9yaWdodF9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0hQUiwgREE3MzJYX0hQX09VVF9EQUNfRU5fU0hJRlQsCi0JCQlEQTczMlhfREFDX0VOX01BWCwgZW5hYmxlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9ocF9yaWdodF9vdXRwdXQsCisJCQkgICAgREE3MzJYX1JFR19IUFIsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBTd2l0Y2giLCBkYTczMnhfaHBfcmlnaHRfb3V0cHV0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfc3BlYWtlcl9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjMsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X3NwZWFrZXJfb3V0cHV0LAorCQkJICAgIERBNzMyWF9SRUdfTElOMywgREE3MzJYX0xPVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa19tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNQSyBTd2l0Y2giLCBkYTczMnhfc3BlYWtlcl9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9sb3V0NF9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjQsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2xvdXQ0X291dHB1dCwKKwkJCSAgICBEQTczMlhfUkVHX0xJTjQsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKKwkJCSAgICBlbmFibGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0NF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxPVVQ0IFN3aXRjaCIsIGRhNzMyeF9sb3V0NF9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9sb3V0Ml9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjIsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2xvdXQyX291dHB1dCwKKwkJCSAgICBEQTczMlhfUkVHX0xJTjIsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKKwkJCSAgICBlbmFibGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0Ml9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxPVVQyIFN3aXRjaCIsIGRhNzMyeF9sb3V0Ml9vdXRwdXQpOwpAQCAtMTMxMyw5ICsxMjk3LDkgQEAKIAltc2xlZXAoREE3MzJYX1dBSVRfRk9SX1NUQUJJTElaQVRJT04pOwogCiAJLyogQ2hlY2sgREFDIG9mZnNldCBzaWduICovCi0Jc2lnbltEQTczMlhfSFBMX0RBQ10gPSAoY29kZWMtPmh3X3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBMX0RBQ19PRkZfQ05UTCkgJgorCXNpZ25bREE3MzJYX0hQTF9EQUNdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUExfREFDX09GRl9DTlRMKSAmCiAJCQkJREE3MzJYX0hQX0RBQ19PRkZfQ05UTF9DT01QTyk7Ci0Jc2lnbltEQTczMlhfSFBSX0RBQ10gPSAoY29kZWMtPmh3X3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSX0RBQ19PRkZfQ05UTCkgJgorCXNpZ25bREE3MzJYX0hQUl9EQUNdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFJfREFDX09GRl9DTlRMKSAmCiAJCQkJREE3MzJYX0hQX0RBQ19PRkZfQ05UTF9DT01QTyk7CiAKIAkvKiBCaW5hcnkgc2VhcmNoIERBQyBvZmZzZXQgdmFsdWVzIChib3RoIGNoYW5uZWxzIGF0IG9uY2UpICovCkBAIC0xMzMyLDEwICsxMzE2LDEwIEBACiAKIAkJbXNsZWVwKERBNzMyWF9XQUlUX0ZPUl9TVEFCSUxJWkFUSU9OKTsKIAotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTF9EQUNfT0ZGX0NOVEwpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBMX0RBQ19PRkZfQ05UTCkgJgogCQkgICAgIERBNzMyWF9IUF9EQUNfT0ZGX0NOVExfQ09NUE8pIF4gc2lnbltEQTczMlhfSFBMX0RBQ10pCiAJCQlvZmZzZXRbREE3MzJYX0hQTF9EQUNdICY9IH5zdGVwOwotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQUl9EQUNfT0ZGX0NOVEwpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSX0RBQ19PRkZfQ05UTCkgJgogCQkgICAgIERBNzMyWF9IUF9EQUNfT0ZGX0NOVExfQ09NUE8pIF4gc2lnbltEQTczMlhfSFBSX0RBQ10pCiAJCQlvZmZzZXRbREE3MzJYX0hQUl9EQUNdICY9IH5zdGVwOwogCkBAIC0xMzc2LDkgKzEzNjAsOSBAQAogCW1zbGVlcChEQTczMlhfV0FJVF9GT1JfU1RBQklMSVpBVElPTik7CiAKIAkvKiBDaGVjayBvdXRwdXQgb2Zmc2V0IHNpZ24gKi8KLQlzaWduW0RBNzMyWF9IUExfQU1QXSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgorCXNpZ25bREE3MzJYX0hQTF9BTVBdID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgogCQkJICAgICAgIERBNzMyWF9IUF9PVVRfQ09NUE87Ci0Jc2lnbltEQTczMlhfSFBSX0FNUF0gPSBjb2RlYy0+aHdfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKKwlzaWduW0RBNzMyWF9IUFJfQU1QXSA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKIAkJCSAgICAgICBEQTczMlhfSFBfT1VUX0NPTVBPOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfQ09NUCB8CkBAIC0xMzk5LDEwICsxMzgzLDEwIEBACiAKIAkJbXNsZWVwKERBNzMyWF9XQUlUX0ZPUl9TVEFCSUxJWkFUSU9OKTsKIAotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgorCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUEwpICYKIAkJICAgICBEQTczMlhfSFBfT1VUX0NPTVBPKSBeIHNpZ25bREE3MzJYX0hQTF9BTVBdKQogCQkJb2Zmc2V0W0RBNzMyWF9IUExfQU1QXSAmPSB+c3RlcDsKLQkJaWYgKChjb2RlYy0+aHdfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSKSAmCiAJCSAgICAgREE3MzJYX0hQX09VVF9DT01QTykgXiBzaWduW0RBNzMyWF9IUFJfQU1QXSkKIAkJCW9mZnNldFtEQTczMlhfSFBSX0FNUF0gJj0gfnN0ZXA7CiAKQEAgLTE0OTksOCArMTQ4Myw4IEBACiAKIAkJCWRhNzMyeF9ocF9kY19vZmZzZXRfY2FuY2VsbGF0aW9uKGNvZGVjKTsKIAotCQkJcmVnY2FjaGVfY2FjaGVfb25seShjb2RlYy0+Y29udHJvbF9kYXRhLCBmYWxzZSk7Ci0JCQlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb250cm9sX2RhdGEpOworCQkJcmVnY2FjaGVfY2FjaGVfb25seShkYTczMngtPnJlZ21hcCwgZmFsc2UpOworCQkJcmVnY2FjaGVfc3luYyhkYTczMngtPnJlZ21hcCk7CiAJCX0gZWxzZSB7CiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTczMlhfUkVHX0JJQVNfRU4sCiAJCQkJCSAgICBEQTczMlhfQklBU19CT09TVF9NQVNLLApAQCAtMTUxMSw3ICsxNDk1LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgdHJ1ZSk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoZGE3MzJ4LT5yZWdtYXAsIHRydWUpOwogCQlkYTczMnhfc2V0X2NoYXJnZV9wdW1wKGNvZGVjLCBEQTczMlhfRElTQUJMRV9DUCk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzMyWF9SRUdfQklBU19FTiwgREE3MzJYX0JJQVNfRU4sCiAJCQkJICAgIERBNzMyWF9CSUFTX0RJUyk7CkBAIC0xNTI4LDIzICsxNTEyLDE0IEBACiB7CiAJc3RydWN0IGRhNzMyeF9wcml2ICpkYTczMnggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IHJldCA9IDA7CiAKIAlkYTczMngtPmNvZGVjID0gY29kZWM7CiAKIAlkYXBtLT5pZGxlX2JpYXNfb2ZmID0gZmFsc2U7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gZGE3MzJ4LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWMuXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCiAJZGE3MzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRhNzMyeF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtMTU2Niw3ICsxNTQxLDYgQEAKIAkuZGFwbV9yb3V0ZXMJCT0gZGE3MzJ4X2RhcG1fcm91dGVzLAogCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3JvdXRlcyksCiAJLnNldF9wbGwJCT0gZGE3MzJ4X3NldF9kYWlfcGxsLAotCS5yZWdfY2FjaGVfc2l6ZQkJPSBBUlJBWV9TSVpFKGRhNzMyeF9yZWdfY2FjaGUpLAogfTsKIAogc3RhdGljIGludCBkYTczMnhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5oIGIvc291bmQvc29jL2NvZGVjcy9kYTczMnguaAppbmRleCBjOGNlNTQ3Li4xZGNlYWZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmgKQEAgLTExMyw5ICsxMTMsNiBAQAogI2RlZmluZQlEQTczMlhfRVFfT1ZFUkFMTF9WT0xfREJfTUlOCS0xODAwCiAjZGVmaW5lCURBNzMyWF9FUV9PVkVSQUxMX1ZPTF9EQl9JTkMJNjAwCiAKLSNkZWZpbmUgREE3MzJYX1NPQ19FTlVNX0RPVUJMRV9SKHhyZWcsIHhycmVnLCB4bWF4LCB4dGV4dCkgXAotCXsucmVnID0geHJlZywgLnJlZzIgPSB4cnJlZywgLm1heCA9IHhtYXgsIC50ZXh0cyA9IHh0ZXh0fQotCiBlbnVtIGRhNzMyeF9zeXNjdGwgewogCURBNzMyWF9TUl84S0haCQk9IDB4MSwKIAlEQTczMlhfU1JfMTFfMDI1S0haCT0gMHgyLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMKaW5kZXggNDIyODEyNi4uNGZmMDZiNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzIxLDIyICszMjMsMjIgQEAKIAkiRnMvMjQwMDAiLCAiRnMvMTIwMDAiLCAiRnMvNjAwMCIsICJGcy8zMDAwIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfREFDX0ZJTFRFUlMxLCA0LCA0LCBkYTkwNTVfaHBmX2N1dG9mZl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9kYWNfaHBmX2N1dG9mZiwKKwkJCSAgICBEQTkwNTVfREFDX0ZJTFRFUlMxLCA0LCBkYTkwNTVfaHBmX2N1dG9mZl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9hZGNfaHBmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9BRENfRklMVEVSUzEsIDQsIDQsIGRhOTA1NV9ocGZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2FkY19ocGZfY3V0b2ZmLAorCQkJICAgIERBOTA1NV9BRENfRklMVEVSUzEsIDQsIGRhOTA1NV9ocGZfY3V0b2ZmX3R4dCk7CiAKIC8qIEFEQyBhbmQgREFDIHZvaWNlIG1vZGUgKDhrSHopIGhpZ2ggcGFzcyBjdXRvZmYgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X3ZmX2N1dG9mZl90eHRbXSA9IHsKIAkiMi41SHoiLCAiMjVIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjMwMEh6IiwgIjQwMEh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9EQUNfRklMVEVSUzEsIDAsIDgsIGRhOTA1NV92Zl9jdXRvZmZfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3ZmX2N1dG9mZiwKKwkJCSAgICBEQTkwNTVfREFDX0ZJTFRFUlMxLCAwLCBkYTkwNTVfdmZfY3V0b2ZmX3R4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2FkY192Zl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQURDX0ZJTFRFUlMxLCAwLCA4LCBkYTkwNTVfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2FkY192Zl9jdXRvZmYsCisJCQkgICAgREE5MDU1X0FEQ19GSUxURVJTMSwgMCwgZGE5MDU1X3ZmX2N1dG9mZl90eHQpOwogCiAvKiBHYWluIHJhbXBpbmcgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZ2Fpbl9yYW1waW5nX3R4dFtdID0gewpAQCAtMzQ0LDQ0ICszNDYsNDQgQEAKIAkibm9taW5hbCByYXRlIC8gOCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2dhaW5fcmFtcGluZ19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0dBSU5fUkFNUF9DVFJMLCAwLCA0LCBkYTkwNTVfZ2Fpbl9yYW1waW5nX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2dhaW5fcmFtcGluZ19yYXRlLAorCQkJICAgIERBOTA1NV9HQUlOX1JBTVBfQ1RSTCwgMCwgZGE5MDU1X2dhaW5fcmFtcGluZ190eHQpOwogCiAvKiBEQUMgbm9pc2UgZ2F0ZSBzZXR1cCB0aW1lIHZhbHVlICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9kYWNfbmdfc2V0dXBfdGltZV90eHRbXSA9IHsKIAkiMjU2IHNhbXBsZXMiLCAiNTEyIHNhbXBsZXMiLCAiMTAyNCBzYW1wbGVzIiwgIjIwNDggc2FtcGxlcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RBQ19OR19TRVRVUF9USU1FLCAwLCA0LAotCQkJZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lLAorCQkJICAgIERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMCwKKwkJCSAgICBkYTkwNTVfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcHVwIHJhdGUgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X2RhY19uZ19yYW1wdXBfdHh0W10gPSB7CiAJIjAuMDIgbXMvZEIiLCAiMC4xNiBtcy9kQiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2RhY19uZ19yYW1wdXBfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMiwgMiwKLQkJCWRhOTA1NV9kYWNfbmdfcmFtcHVwX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19yYW1wdXBfcmF0ZSwKKwkJCSAgICBEQTkwNTVfREFDX05HX1NFVFVQX1RJTUUsIDIsCisJCQkgICAgZGE5MDU1X2RhY19uZ19yYW1wdXBfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcGRvd24gcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dFtdID0gewogCSIwLjY0IG1zL2RCIiwgIjIwLjQ4IG1zL2RCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfREFDX05HX1NFVFVQX1RJTUUsIDMsIDIsCi0JCQlkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19yYW1wZG93bl9yYXRlLAorCQkJICAgIERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMywKKwkJCSAgICBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dCk7CiAKIC8qIERBQyBzb2Z0IG11dGUgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlX3R4dFtdID0gewogCSIxIiwgIjIiLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjY0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RBQ19GSUxURVJTNSwgNCwgNywKLQkJCWRhOTA1NV9kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlLAorCQkJICAgIERBOTA1NV9EQUNfRklMVEVSUzUsIDQsCisJCQkgICAgZGE5MDU1X2RhY19zb2Z0X211dGVfcmF0ZV90eHQpOwogCiAvKiBEQUMgcm91dGluZyBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X2RhY19zcmNfdHh0W10gPSB7CkBAIC0zODksNDAgKzM5MSw0MCBAQAogCSJBSUYgaW5wdXQgcmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9kYWNfbF9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfRElHX1JPVVRJTkdfREFDLCAwLCA0LCBkYTkwNTVfZGFjX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9kYWNfbF9zcmMsCisJCQkgICAgREE5MDU1X0RJR19ST1VUSU5HX0RBQywgMCwgZGE5MDU1X2RhY19zcmNfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3Jfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RJR19ST1VUSU5HX0RBQywgNCwgNCwgZGE5MDU1X2RhY19zcmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3Jfc3JjLAorCQkJICAgIERBOTA1NV9ESUdfUk9VVElOR19EQUMsIDQsIGRhOTA1NV9kYWNfc3JjX3R4dCk7CiAKIC8qIE1JQyBQR0EgTGVmdCBzb3VyY2Ugc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9taWNfbF9zcmNfdHh0W10gPSB7CiAJIk1JQzFfUF9OIiwgIk1JQzFfUCIsICJNSUMxX04iLCAiTUlDMl9MIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfbWljX2xfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X01JWElOX0xfU0VMRUNULCA0LCA0LCBkYTkwNTVfbWljX2xfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X21pY19sX3NyYywKKwkJCSAgICBEQTkwNTVfTUlYSU5fTF9TRUxFQ1QsIDQsIGRhOTA1NV9taWNfbF9zcmNfdHh0KTsKIAogLyogTUlDIFBHQSBSaWdodCBzb3VyY2Ugc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9taWNfcl9zcmNfdHh0W10gPSB7CiAJIk1JQzJfUl9MIiwgIk1JQzJfUiIsICJNSUMyX0wiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9taWNfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfTUlYSU5fUl9TRUxFQ1QsIDQsIDMsIGRhOTA1NV9taWNfcl9zcmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfbWljX3Jfc3JjLAorCQkJICAgIERBOTA1NV9NSVhJTl9SX1NFTEVDVCwgNCwgZGE5MDU1X21pY19yX3NyY190eHQpOwogCiAvKiBBTEMgSW5wdXQgU2lnbmFsIFRyYWNraW5nIHJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHRbXSA9IHsKIAkiMS80IiwgIjEvMTYiLCAiMS8yNTYiLCAiMS82NTUzNiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2ludGVnX2F0dGFja19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMywgNCwgNCwKLQkJCWRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9pbnRlZ19hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwzLCA0LAorCQkJICAgIGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9pbnRlZ19yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQUxDX0NUUkwzLCA2LCA0LAotCQkJZGE5MDU1X3NpZ25hbF90cmFja2luZ19yYXRlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2ludGVnX3JlbGVhc2VfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwzLCA2LAorCQkJICAgIGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOwogCiAvKiBBTEMgQXR0YWNrIFJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9hdHRhY2tfcmF0ZV90eHRbXSA9IHsKQEAgLTQzMCw4ICs0MzIsOCBAQAogCSI1NjMyL2ZzIiwgIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2F0dGFja19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMiwgMCwgMTMsIGRhOTA1NV9hdHRhY2tfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwyLCAwLCBkYTkwNTVfYXR0YWNrX3JhdGVfdHh0KTsKIAogLyogQUxDIFJlbGVhc2UgUmF0ZSBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHRbXSA9IHsKQEAgLTQzOSw4ICs0NDEsOCBAQAogCSIxMTI2NC9mcyIsICIyMjUyOC9mcyIsICI0NTA1Ni9mcyIsICI5MDExMi9mcyIsICIxODAyMjQvZnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQUxDX0NUUkwyLCA0LCAxMSwgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9yZWxlYXNlX3JhdGUsCisJCQkgICAgREE5MDU1X0FMQ19DVFJMMiwgNCwgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHQpOwogCiAvKiBBTEMgSG9sZCBUaW1lIHNlbGVjdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfaG9sZF90aW1lX3R4dFtdID0gewpAQCAtNDQ5LDggKzQ1MSw4IEBACiAJIjI1Mzk1Mi9mcyIsICI1MDc5MDQvZnMiLCAiMTAxNTgwOC9mcyIsICIyMDMxNjE2L2ZzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfaG9sZF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMywgMCwgMTYsIGRhOTA1NV9ob2xkX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfaG9sZF90aW1lLAorCQkJICAgIERBOTA1NV9BTENfQ1RSTDMsIDAsIGRhOTA1NV9ob2xkX3RpbWVfdHh0KTsKIAogc3RhdGljIGludCBkYTkwNTVfZ2V0X2FsY19kYXRhKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTggcmVnX3ZhbCkKIHsKQEAgLTEzODEsMTYgKzEzODMsOCBAQAogCiBzdGF0aWMgaW50IGRhOTA1NV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGE5MDU1X3ByaXYgKmRhOTA1NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhOTA1NS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEVuYWJsZSBhbGwgR2FpbiBSYW1wcyAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBOTA1NV9BVVhfTF9DVFJMLAogCQkJICAgIERBOTA1NV9HQUlOX1JBTVBJTkdfRU4sIERBOTA1NV9HQUlOX1JBTVBJTkdfRU4pOwpAQCAtMTUzNiwxMSArMTUzMCwxNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkYTkwNTVfaTJjX2lkKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGE5MDU1X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJkbGcsZGE5MDU1LWNvZGVjIiwgfSwKKwl7IH0KK307CisKIC8qIEkyQyBjb2RlYyBjb250cm9sIGxheWVyICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZGE5MDU1X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiZGE5MDU1LWNvZGVjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkYTkwNTVfb2ZfbWF0Y2gpLAogCX0sCiAJLnByb2JlCQk9IGRhOTA1NV9pMmNfcHJvYmUsCiAJLnJlbW92ZQkJPSBkYTkwNTVfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jIGIvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jCmluZGV4IGNiNzM2ZGQuLjNhODljZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2lzYWJlbGxlLmMKQEAgLTkxOCw4ICs5MTgsNyBAQAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXUxNiBhaWYgPSAwOwogCXVuc2lnbmVkIGludCBmc192YWwgPSAwOwogCkBAIC0xMDkwLDIzICsxMDg5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBpc2FiZWxsZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldiwgTlVMTCk7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2lzYWJlbGxlID0gewotCS5wcm9iZSA9IGlzYWJlbGxlX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IGlzYWJlbGxlX3NldF9iaWFzX2xldmVsLAogCS5jb250cm9scyA9IGlzYWJlbGxlX3NuZF9jb250cm9scywKIAkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShpc2FiZWxsZV9zbmRfY29udHJvbHMpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00ODU3LmMKaW5kZXggMGU1NzQzZS4uNGYwNDhkYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDg1Ny5jCkBAIC0xMDEsOCArMTAxLDcgQEAKIAkiSGVhZHBob25lIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00ODU3X21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGxtNDg1N19tb2RlKSwgbG00ODU3X21vZGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChsbTQ4NTdfbW9kZV9lbnVtLCBsbTQ4NTdfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBsbTQ4NTdfZGFwbV93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX0lOUFVUKCJJTiIpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ5NDUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwppbmRleCBlMTk0OTBjLi4yNzViM2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwpAQCAtMTk1LDMzICsxOTUsMzEgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxtNDk0NTNfbWljMm1vZGVfdGV4dFtdID0geyJTaW5nbGUgRW5kZWQiLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX21pYzJtb2RlX2VudW0sIExNNDk0NTNfUDBfTUlDUl9SRUcsIDUsCi0JCQkJICBsbTQ5NDUzX21pYzJtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfbWljMm1vZGVfZW51bSwgTE00OTQ1M19QMF9NSUNSX1JFRywgNSwKKwkJCSAgICBsbTQ5NDUzX21pYzJtb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbG00OTQ1M19kbWljX2NmZ190ZXh0W10gPSB7IkRNSUNEQVQxIiwgIkRNSUNEQVQyIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2RtaWMxMl9jZmdfZW51bSwKLQkJCQkgIExNNDk0NTNfUDBfRElHSVRBTF9NSUMxX0NPTkZJR19SRUcsCi0JCQkJICA3LCBsbTQ5NDUzX2RtaWNfY2ZnX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfZG1pYzEyX2NmZ19lbnVtLAorCQkJICAgIExNNDk0NTNfUDBfRElHSVRBTF9NSUMxX0NPTkZJR19SRUcsIDcsCisJCQkgICAgbG00OTQ1M19kbWljX2NmZ190ZXh0KTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfZG1pYzM0X2NmZ19lbnVtLAotCQkJCSAgTE00OTQ1M19QMF9ESUdJVEFMX01JQzJfQ09ORklHX1JFRywKLQkJCQkgIDcsIGxtNDk0NTNfZG1pY19jZmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG00OTQ1M19kbWljMzRfY2ZnX2VudW0sCisJCQkgICAgTE00OTQ1M19QMF9ESUdJVEFMX01JQzJfQ09ORklHX1JFRywgNywKKwkJCSAgICBsbTQ5NDUzX2RtaWNfY2ZnX3RleHQpOwogCiAvKiBNVVggQ29udHJvbHMgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpsbTQ5NDUzX2FkY2xfbXV4X3RleHRbXSA9IHsgIk1JQzEiLCAiQXV4X0wiIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpsbTQ5NDUzX2FkY3JfbXV4X3RleHRbXSA9IHsgIk1JQzIiLCAiQXV4X1IiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00OTQ1M19hZGNsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAwLAotCQkJQVJSQVlfU0laRShsbTQ5NDUzX2FkY2xfbXV4X3RleHQpLAotCQkJbG00OTQ1M19hZGNsX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2FkY2xfZW51bSwKKwkJCSAgICBMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAwLAorCQkJICAgIGxtNDk0NTNfYWRjbF9tdXhfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00OTQ1M19hZGNyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAxLAotCQkJQVJSQVlfU0laRShsbTQ5NDUzX2FkY3JfbXV4X3RleHQpLAotCQkJbG00OTQ1M19hZGNyX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2FkY3JfZW51bSwKKwkJCSAgICBMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAxLAorCQkJICAgIGxtNDk0NTNfYWRjcl9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsbTQ5NDUzX2FkY2xfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBMZWZ0IE11eCIsIGxtNDk0NTNfYWRjbF9lbnVtKTsKQEAgLTE0MDksMjIgKzE0MDcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxtNDk0NTNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBsbTQ5NDUzX3ByaXYgKmxtNDk0NTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0ID0gMDsKLQotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBsbTQ5NDUzLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogcG93ZXIgZG93biBjaGlwICovCiBzdGF0aWMgaW50IGxtNDk0NTNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKQEAgLTE0MzMsNyArMTQxNSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9sbTQ5NDUzID0gewotCS5wcm9iZSA9IGxtNDk0NTNfcHJvYmUsCiAJLnJlbW92ZSA9IGxtNDk0NTNfcmVtb3ZlLAogCS5zdXNwZW5kID0gbG00OTQ1M19zdXNwZW5kLAogCS5yZXN1bWUgPSBsbTQ5NDUzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTc2OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKaW5kZXggMzFmOTE1Ni4uZWM0ODFmYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKQEAgLTEzNSwxMSArMTM1LDYgQEAKIAlzdHJ1Y3QgbWF4OTc2OCAqbWF4OTc2OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gbWF4OTc2OC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAyLCA2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWlmIChtYXg5NzY4LT5mbGFncyAmIE1BWDk3NjhfRkxBR19DTEFTU0lDX1BXTSkgewogCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBNQVg5NzY4X0NUUkwsIE1BWDk3NjhfQ1RSTF9QV00pOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCmluZGV4IGVlNjYwZTIuLmVmN2NmODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKQEAgLTU5NywyOCArNTk3LDI3IEBACiAgICAgICAgMHgwMCwgMHg0MywgMHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHgxMSwgMHgyMiwgMHgzMgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9leG1vZGVfZW51bSA9Ci0gICAgICAgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfNDFfU1BLREhQLCAwLCAxMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUobWF4OTgwODhfZXhtb2RlX3RleHRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODhfZXhtb2RlX3RleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9leG1vZGVfdmFsdWVzKTsKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9leG1vZGVfZW51bSwKKwkJCQkgIE05ODA4OF9SRUdfNDFfU1BLREhQLCAwLCAxMjcsCisJCQkJICBtYXg5ODA4OF9leG1vZGVfdGV4dHMsCisJCQkJICBtYXg5ODA4OF9leG1vZGVfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDg4X2V4X3RocmVzaFtdID0geyAvKiB2b2x0cyBQUCAqLwogICAgICAgICIwLjYiLCAiMS4yIiwgIjEuOCIsICIyLjQiLCAiMy4wIiwgIjMuNiIsICI0LjIiLCAiNC44In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDg4X2V4X3RocmVzaF9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfNDJfU1BLREhQX1RIUkVTSCwgMCwgOCwKLSAgICAgICAgICAgICAgIG1heDk4MDg4X2V4X3RocmVzaCksCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDg4X2V4X3RocmVzaF9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfNDJfU1BLREhQX1RIUkVTSCwgMCwKKwkJCSAgICBtYXg5ODA4OF9leF90aHJlc2gpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwODhfZmx0cl9tb2RlW10gPSB7IlZvaWNlIiwgIk11c2ljIiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA3LCAyLCBtYXg5ODA4OF9mbHRyX21vZGUpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9maWx0ZXJfbW9kZV9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA3LAorCQkJICAgIG1heDk4MDg4X2ZsdHJfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA4OF9leHRtaWNfdGV4dFtdID0geyAiTm9uZSIsICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwODhfZXh0bWljX2VudW0gPQotICAgICAgIFNPQ19FTlVNX1NJTkdMRShNOTgwODhfUkVHXzQ4X0NGR19NSUMsIDAsIDMsIG1heDk4MDg4X2V4dG1pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9leHRtaWNfZW51bSwKKwkJCSAgICBNOTgwODhfUkVHXzQ4X0NGR19NSUMsIDAsCisJCQkgICAgbWF4OTgwODhfZXh0bWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwODhfZXh0bWljX211eCA9CiAgICAgICAgU09DX0RBUE1fRU5VTSgiRXh0ZXJuYWwgTUlDIE11eCIsIG1heDk4MDg4X2V4dG1pY19lbnVtKTsKQEAgLTYyNiwxMiArNjI1LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwODhfZGFpMV9mbHRyW10gPSB7CiAgICAgICAgIk9mZiIsICJmYz0yNTgvZnM9MTZrIiwgImZjPTUwMC9mcz0xNmsiLAogICAgICAgICJmYz0yNTgvZnM9OGsiLCAiZmM9NTAwL2ZzPThrIiwgImZjPTIwMCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9kYWkxX2RhY19maWx0ZXJfZW51bVtdID0gewotICAgICAgIFNPQ19FTlVNX1NJTkdMRShNOTgwODhfUkVHXzE4X0RBSTFfRklMVEVSUywgMCwgNiwgbWF4OTgwODhfZGFpMV9mbHRyKSwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDg4X2RhaTFfYWRjX2ZpbHRlcl9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA0LCA2LCBtYXg5ODA4OF9kYWkxX2ZsdHIpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9kYWkxX2RhY19maWx0ZXJfZW51bSwKKwkJCSAgICBNOTgwODhfUkVHXzE4X0RBSTFfRklMVEVSUywgMCwKKwkJCSAgICBtYXg5ODA4OF9kYWkxX2ZsdHIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDg4X2RhaTFfYWRjX2ZpbHRlcl9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA0LAorCQkJICAgIG1heDk4MDg4X2RhaTFfZmx0cik7CiAKIHN0YXRpYyBpbnQgbWF4OTgwODhfbWljMXByZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0xODQ5LDcgKzE4NDgsNyBAQAogCiAgICAgICAgLyogTm93IHBvaW50IHRoZSBzb2NfZW51bSB0byAudGV4dHMgYXJyYXkgaXRlbXMgKi8KICAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS50ZXh0cyA9IG1heDk4MDg4LT5lcV90ZXh0czsKLSAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS5tYXggPSBtYXg5ODA4OC0+ZXFfdGV4dGNudDsKKyAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS5pdGVtcyA9IG1heDk4MDg4LT5lcV90ZXh0Y250OwogCiAgICAgICAgcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CiAgICAgICAgaWYgKHJldCAhPSAwKQpAQCAtMTkxNSwxMiArMTkxNCw2IEBACiAKICAgICAgICByZWdjYWNoZV9tYXJrX2RpcnR5KG1heDk4MDg4LT5yZWdtYXApOwogCi0gICAgICAgcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLSAgICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgICAgICAgIGRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLSAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgfQotCiAgICAgICAgLyogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KIAogICAgICAgIG1heDk4MDg4LT5zeXNjbGsgPSAodW5zaWduZWQpLTE7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMKaW5kZXggOWY3MTRlYS4uOThjNmUxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuYwpAQCAtNTEzLDY1ICs1MTMsNzUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9wd3JfcGVyZl90ZXh0W10gPQogCXsgIkxvdyBQb3dlciIsICJIaWdoIFBlcmZvcm1hbmNlIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfQklBU19DT05UUk9MLCBNOTgwOTBfVkNNX01PREVfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcHdyX3BlcmZfdGV4dCksIG1heDk4MDkwX3B3cl9wZXJmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0JJQVNfQ09OVFJPTCwKKwkJCSAgICBNOTgwOTBfVkNNX01PREVfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9vc3IxMjhfdGV4dFtdID0geyAiNjQqZnMiLCAiMTI4KmZzIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX29zcjEyOF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19BRENfQ09OVFJPTCwgTTk4MDkwX09TUjEyOF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9vc3IxMjhfdGV4dCksIG1heDk4MDkwX29zcjEyOF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9vc3IxMjhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0FEQ19DT05UUk9MLAorCQkJICAgIE05ODA5MF9PU1IxMjhfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfb3NyMTI4X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfbW9kZV90ZXh0W10gPSB7ICJWb2ljZSIsICJNdXNpYyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0ZJTFRFUl9DT05GSUcsIE05ODA5MF9NT0RFX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX21vZGVfdGV4dCksIG1heDk4MDkwX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfbW9kZV9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfRklMVEVSX0NPTkZJRywKKwkJCSAgICBNOTgwOTBfTU9ERV9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2ZpbHRlcl9kbWljMzRtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0ZJTFRFUl9DT05GSUcsCi0JCU05ODA5MF9GTFRfRE1JQzM0TU9ERV9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9tb2RlX3RleHQpLCBtYXg5ODA5MF9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2ZpbHRlcl9kbWljMzRtb2RlX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19GSUxURVJfQ09ORklHLAorCQkJICAgIE05ODA5MF9GTFRfRE1JQzM0TU9ERV9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfZHJjYXRrX3RleHRbXSA9CiAJeyAiMC41bXMiLCAiMW1zIiwgIjVtcyIsICIxMG1zIiwgIjI1bXMiLCAiNTBtcyIsICIxMDBtcyIsICIyMDBtcyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9kcmNhdGtfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfRFJDX1RJTUlORywgTTk4MDkwX0RSQ0FUS19TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9kcmNhdGtfdGV4dCksIG1heDk4MDkwX2RyY2F0a190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9kcmNhdGtfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0RSQ19USU1JTkcsCisJCQkgICAgTTk4MDkwX0RSQ0FUS19TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9kcmNhdGtfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9kcmNybHNfdGV4dFtdID0KIAl7ICI4cyIsICI0cyIsICIycyIsICIxcyIsICIwLjVzIiwgIjAuMjVzIiwgIjAuMTI1cyIsICIwLjA2MjVzIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RyY3Jsc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfVElNSU5HLCBNOTgwOTBfRFJDUkxTX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX2RyY3Jsc190ZXh0KSwgbWF4OTgwOTBfZHJjcmxzX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RyY3Jsc19lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfRFJDX1RJTUlORywKKwkJCSAgICBNOTgwOTBfRFJDUkxTX1NISUZULAorCQkJICAgIG1heDk4MDkwX2RyY3Jsc190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDkwX2FsY2NtcF90ZXh0W10gPQogCXsgIjE6MSIsICIxOjEuNSIsICIxOjIiLCAiMTo0IiwgIjE6SU5GIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2FsY2NtcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfQ09NUFJFU1NPUiwgTTk4MDkwX0RSQ0NNUF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9hbGNjbXBfdGV4dCksIG1heDk4MDkwX2FsY2NtcF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9hbGNjbXBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0RSQ19DT01QUkVTU09SLAorCQkJICAgIE05ODA5MF9EUkNDTVBfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfYWxjY21wX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfZHJjZXhwX3RleHRbXSA9IHsgIjE6MSIsICIyOjEiLCAiMzoxIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RyY2V4cF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfRVhQQU5ERVIsIE05ODA5MF9EUkNFWFBfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfZHJjZXhwX3RleHQpLCBtYXg5ODA5MF9kcmNleHBfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfZHJjZXhwX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19EUkNfRVhQQU5ERVIsCisJCQkgICAgTTk4MDkwX0RSQ0VYUF9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9kcmNleHBfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfZGFjX3BlcmZtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0RBQ19DT05UUk9MLCBNOTgwOTBfUEVSRk1PREVfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcGVyZl9wd3JfdGV4dCksIG1heDk4MDkwX3BlcmZfcHdyX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RhY19wZXJmbW9kZV9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfREFDX0NPTlRST0wsCisJCQkgICAgTTk4MDkwX1BFUkZNT0RFX1NISUZULAorCQkJICAgIG1heDk4MDkwX3BlcmZfcHdyX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RhY2hwX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0RBQ19DT05UUk9MLCBNOTgwOTBfREFDSFBfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcHdyX3BlcmZfdGV4dCksIG1heDk4MDkwX3B3cl9wZXJmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RhY2hwX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19EQUNfQ09OVFJPTCwKKwkJCSAgICBNOTgwOTBfREFDSFBfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfYWRjaHBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfQURDX0NPTlRST0wsIE05ODA5MF9BRENIUF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9wd3JfcGVyZl90ZXh0KSwgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfYWRjaHBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0FEQ19DT05UUk9MLAorCQkJICAgIE05ODA5MF9BRENIUF9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9wd3JfcGVyZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJNSUMgQmlhcyBWQ00gQmFuZGdhcCIsIG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSksCkBAIC04NDIsMzkgKzg1Miw0MiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbWljMV9tdXhfdGV4dFtdID0geyAiSU4xMiIsICJJTjU2IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pYzFfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0lOUFVUX01PREUsIE05ODA5MF9FWFRNSUMxX1NISUZULAotCQlBUlJBWV9TSVpFKG1pYzFfbXV4X3RleHQpLCBtaWMxX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaWMxX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU5QVVRfTU9ERSwKKwkJCSAgICBNOTgwOTBfRVhUTUlDMV9TSElGVCwKKwkJCSAgICBtaWMxX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX21pYzFfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSUMxIE11eCIsIG1pYzFfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWljMl9tdXhfdGV4dFtdID0geyAiSU4zNCIsICJJTjU2IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pYzJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0lOUFVUX01PREUsIE05ODA5MF9FWFRNSUMyX1NISUZULAotCQlBUlJBWV9TSVpFKG1pYzJfbXV4X3RleHQpLCBtaWMyX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaWMyX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU5QVVRfTU9ERSwKKwkJCSAgICBNOTgwOTBfRVhUTUlDMl9TSElGVCwKKwkJCSAgICBtaWMyX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX21pYzJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSUMyIE11eCIsIG1pYzJfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZG1pY19tdXhfdGV4dFtdID0geyAiQURDIiwgIkRNSUMiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZG1pY19tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGRtaWNfbXV4X3RleHQpLCBkbWljX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfVklSVF9ERUNMKGRtaWNfbXV4X2VudW0sIGRtaWNfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTBfZG1pY19tdXggPQogCVNPQ19EQVBNX0VOVU1fVklSVCgiRE1JQyBNdXgiLCBkbWljX211eF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDkwX21pY3ByZV90ZXh0W10gPSB7ICJPZmYiLCAiT24iIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfcGExZW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfTUlDMV9JTlBVVF9MRVZFTCwgTTk4MDkwX01JQ19QQTFFTl9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9taWNwcmVfdGV4dCksIG1heDk4MDkwX21pY3ByZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9wYTFlbl9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfTUlDMV9JTlBVVF9MRVZFTCwKKwkJCSAgICBNOTgwOTBfTUlDX1BBMUVOX1NISUZULAorCQkJICAgIG1heDk4MDkwX21pY3ByZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9wYTJlbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19NSUMyX0lOUFVUX0xFVkVMLCBNOTgwOTBfTUlDX1BBMkVOX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX21pY3ByZV90ZXh0KSwgbWF4OTgwOTBfbWljcHJlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX3BhMmVuX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19NSUMyX0lOUFVUX0xFVkVMLAorCQkJICAgIE05ODA5MF9NSUNfUEEyRU5fU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfbWljcHJlX3RleHQpOwogCiAvKiBMSU5FQSBtaXhlciBzd2l0Y2ggKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9saW5lYV9taXhlcl9jb250cm9sc1tdID0gewpAQCAtOTM4LDEzICs5NTEsMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmx0ZW5fbXV4X3RleHRbXSA9IHsgIk5vcm1hbCIsICJMb29wdGhyb3VnaCIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsdGVubF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xURU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobHRlbl9tdXhfdGV4dCksIGx0ZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGx0ZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTFRFTl9TSElGVCwKKwkJCSAgICBsdGVuX211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsdGVucl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xURU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobHRlbl9tdXhfdGV4dCksIGx0ZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGx0ZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTFRFTl9TSElGVCwKKwkJCSAgICBsdGVuX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2x0ZW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTFRFTkwgTXV4IiwgbHRlbmxfbXV4X2VudW0pOwpAQCAtOTU0LDEzICs5NjksMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxiZW5fbXV4X3RleHRbXSA9IHsgIk5vcm1hbCIsICJMb29wYmFjayIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYmVubF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xCRU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobGJlbl9tdXhfdGV4dCksIGxiZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxiZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTEJFTl9TSElGVCwKKwkJCSAgICBsYmVuX211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYmVucl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xCRU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobGJlbl9tdXhfdGV4dCksIGxiZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxiZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTEJFTl9TSElGVCwKKwkJCSAgICBsYmVuX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2xiZW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTEJFTkwgTXV4IiwgbGJlbmxfbXV4X2VudW0pOwpAQCAtOTcyLDEzICs5ODksMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0ZW5yX211eF90ZXh0W10gPSB7ICJOb3JtYWwiLCAiU2lkZXRvbmUgUmlnaHQiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RlbmxfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0FEQ19TSURFVE9ORSwgTTk4MDkwX0RTVFNMX1NISUZULAotCQlBUlJBWV9TSVpFKHN0ZW5sX211eF90ZXh0KSwgc3RlbmxfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfQURDX1NJREVUT05FLAorCQkJICAgIE05ODA5MF9EU1RTTF9TSElGVCwKKwkJCSAgICBzdGVubF9tdXhfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RlbnJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0FEQ19TSURFVE9ORSwgTTk4MDkwX0RTVFNSX1NISUZULAotCQlBUlJBWV9TSVpFKHN0ZW5yX211eF90ZXh0KSwgc3RlbnJfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfQURDX1NJREVUT05FLAorCQkJICAgIE05ODA5MF9EU1RTUl9TSElGVCwKKwkJCSAgICBzdGVucl9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9zdGVubF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNURU5MIE11eCIsIHN0ZW5sX211eF9lbnVtKTsKQEAgLTEwODYsOSArMTEwNSwxMCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbGlubW9kX211eF90ZXh0W10gPSB7ICJMZWZ0IE9ubHkiLCAiTGVmdCBhbmQgUmlnaHQiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlubW9kX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19MT1VUUl9NSVhFUiwgTTk4MDkwX0xJTk1PRF9TSElGVCwKLQkJQVJSQVlfU0laRShsaW5tb2RfbXV4X3RleHQpLCBsaW5tb2RfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxpbm1vZF9tdXhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0xPVVRSX01JWEVSLAorCQkJICAgIE05ODA5MF9MSU5NT0RfU0hJRlQsCisJCQkgICAgbGlubW9kX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2xpbm1vZF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxJTk1PRCBNdXgiLCBsaW5tb2RfbXV4X2VudW0pOwpAQCAtMTA5OCwxNiArMTExOCwxOCBAQAogLyoKICAqIFRoaXMgaXMgYSBtdXggYXMgaXQgc2VsZWN0cyB0aGUgSFAgb3V0cHV0LCBidXQgdG8gREFQTSBpdCBpcyBhIE1peGVyIGVuYWJsZQogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1peGhwbHNlbF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSFBfQ09OVFJPTCwgTTk4MDkwX01JWEhQTFNFTF9TSElGVCwKLQkJQVJSQVlfU0laRShtaXhocHNlbF9tdXhfdGV4dCksIG1peGhwc2VsX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaXhocGxzZWxfbXV4X2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19IUF9DT05UUk9MLAorCQkJICAgIE05ODA5MF9NSVhIUExTRUxfU0hJRlQsCisJCQkgICAgbWl4aHBzZWxfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTBfbWl4aHBsc2VsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTUlYSFBMU0VMIE11eCIsIG1peGhwbHNlbF9tdXhfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWl4aHByc2VsX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19IUF9DT05UUk9MLCBNOTgwOTBfTUlYSFBSU0VMX1NISUZULAotCQlBUlJBWV9TSVpFKG1peGhwc2VsX211eF90ZXh0KSwgbWl4aHBzZWxfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1peGhwcnNlbF9tdXhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0hQX0NPTlRST0wsCisJCQkgICAgTTk4MDkwX01JWEhQUlNFTF9TSElGVCwKKwkJCSAgICBtaXhocHNlbF9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9taXhocHJzZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSVhIUFJTRUwgTXV4IiwgbWl4aHByc2VsX211eF9lbnVtKTsKQEAgLTIxOTYsMTQgKzIyMTgsNiBAQAogCiAJbWF4OTgwOTAtPmNvZGVjID0gY29kZWM7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gbWF4OTgwOTAtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBSZXNldCB0aGUgY29kZWMsIHRoZSBEU1AgY29yZSwgYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KIAltYXg5ODA5MF9yZXNldChtYXg5ODA5MCk7CiAKQEAgLTIzMjksNyArMjM0Myw2IEBACiAKIAltYXg5ODA5MC0+ZGV2dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBtYXg5ODA5MCk7Ci0JbWF4OTgwOTAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAltYXg5ODA5MC0+cGRhdGEgPSBpMmMtPmRldi5wbGF0Zm9ybV9kYXRhOwogCW1heDk4MDkwLT5pcnEgPSBpMmMtPmlycTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5oIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5oCmluZGV4IDdlMTAzZjIuLjFhNGUyMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmgKQEAgLTE1MjMsNyArMTUyMyw2IEBACiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAllbnVtIG1heDk4MDkwX3R5cGUgZGV2dHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJc3RydWN0IG1heDk4MDkwX3BkYXRhICpwZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCXVuc2lnbmVkIGludCBiY2xrOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCmluZGV4IDNiYTExNzAuLjAzZjA1MzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKQEAgLTU2MCwyNSArNTYwLDI3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF4OTgwOTVfZmx0cl9tb2RlW10gPSB7ICJWb2ljZSIsICJNdXNpYyIgfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpMV9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMkVfREFJMV9GSUxURVJTLCA3LCAyLCBtYXg5ODA5NV9mbHRyX21vZGUpLAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpMl9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMzhfREFJMl9GSUxURVJTLCA3LCAyLCBtYXg5ODA5NV9mbHRyX21vZGUpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkxX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgTTk4MDk1XzAyRV9EQUkxX0ZJTFRFUlMsIDcsCisJCQkgICAgbWF4OTgwOTVfZmx0cl9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkyX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgTTk4MDk1XzAzOF9EQUkyX0ZJTFRFUlMsIDcsCisJCQkgICAgbWF4OTgwOTVfZmx0cl9tb2RlKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9leHRtaWNfdGV4dFtdID0geyAiTm9uZSIsICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZXh0bWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTVfMDg3X0NGR19NSUMsIDAsIDMsIG1heDk4MDk1X2V4dG1pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9leHRtaWNfZW51bSwKKwkJCSAgICBNOTgwOTVfMDg3X0NGR19NSUMsIDAsCisJCQkgICAgbWF4OTgwOTVfZXh0bWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTVfZXh0bWljX211eCA9CiAJU09DX0RBUE1fRU5VTSgiRXh0ZXJuYWwgTUlDIE11eCIsIG1heDk4MDk1X2V4dG1pY19lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9saW5laW5fdGV4dFtdID0geyAiSU5BIiwgIklOQiIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5NV9saW5laW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wODZfQ0ZHX0xJTkUsIDYsIDIsIG1heDk4MDk1X2xpbmVpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9saW5laW5fZW51bSwKKwkJCSAgICBNOTgwOTVfMDg2X0NGR19MSU5FLCA2LAorCQkJICAgIG1heDk4MDk1X2xpbmVpbl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDk1X2xpbmVpbl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxpbmVpbiBJbnB1dCBNdXgiLCBtYXg5ODA5NV9saW5laW5fZW51bSk7CkBAIC01ODYsMjQgKzU4OCwyNiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9saW5lX21vZGVfdGV4dFtdID0gewogCSJTdGVyZW8iLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfbGluZWluX21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wODZfQ0ZHX0xJTkUsIDcsIDIsIG1heDk4MDk1X2xpbmVfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9saW5laW5fbW9kZV9lbnVtLAorCQkJICAgIE05ODA5NV8wODZfQ0ZHX0xJTkUsIDcsCisJCQkgICAgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDk1X2xpbmVvdXRfbW9kZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDk1XzA4Nl9DRkdfTElORSwgNCwgMiwgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDk1X2xpbmVvdXRfbW9kZV9lbnVtLAorCQkJICAgIE05ODA5NV8wODZfQ0ZHX0xJTkUsIDQsCisJCQkgICAgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1heDk4MDk1X2RhaV9mbHRyW10gPSB7CiAJIk9mZiIsICJFbGxpcHRpY2FsLUhQRi0xNmsiLCAiQnV0dGVyd29ydGgtSFBGLTE2ayIsCiAJIkVsbGlwdGljYWwtSFBGLThrIiwgIkJ1dHRlcndvcnRoLUhQRi04ayIsICJCdXR0ZXJ3b3J0aC1IUEYtRnMvMjQwIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDk1X2RhaTFfZGFjX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMkVfREFJMV9GSUxURVJTLCAwLCA2LCBtYXg5ODA5NV9kYWlfZmx0ciksCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5NV9kYWkyX2RhY19maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTVfMDM4X0RBSTJfRklMVEVSUywgMCwgNiwgbWF4OTgwOTVfZGFpX2ZsdHIpLAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpM19kYWNfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDk1XzA0Ml9EQUkzX0ZJTFRFUlMsIDAsIDYsIG1heDk4MDk1X2RhaV9mbHRyKSwKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTVfZGFpMV9kYWNfZmlsdGVyX2VudW0sCisJCQkgICAgTTk4MDk1XzAyRV9EQUkxX0ZJTFRFUlMsIDAsCisJCQkgICAgbWF4OTgwOTVfZGFpX2ZsdHIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDk1X2RhaTJfZGFjX2ZpbHRlcl9lbnVtLAorCQkJICAgIE05ODA5NV8wMzhfREFJMl9GSUxURVJTLCAwLAorCQkJICAgIG1heDk4MDk1X2RhaV9mbHRyKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkzX2RhY19maWx0ZXJfZW51bSwKKwkJCSAgICBNOTgwOTVfMDQyX0RBSTNfRklMVEVSUywgMCwKKwkJCSAgICBtYXg5ODA5NV9kYWlfZmx0cik7CiAKIHN0YXRpYyBpbnQgbWF4OTgwOTVfbWljMXByZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0xODYxLDcgKzE4NjUsNyBAQAogCiAJLyogTm93IHBvaW50IHRoZSBzb2NfZW51bSB0byAudGV4dHMgYXJyYXkgaXRlbXMgKi8KIAltYXg5ODA5NS0+ZXFfZW51bS50ZXh0cyA9IG1heDk4MDk1LT5lcV90ZXh0czsKLQltYXg5ODA5NS0+ZXFfZW51bS5tYXggPSBtYXg5ODA5NS0+ZXFfdGV4dGNudDsKKwltYXg5ODA5NS0+ZXFfZW51bS5pdGVtcyA9IG1heDk4MDk1LT5lcV90ZXh0Y250OwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CiAJaWYgKHJldCAhPSAwKQpAQCAtMjAxNiw3ICsyMDIwLDcgQEAKIAogCS8qIE5vdyBwb2ludCB0aGUgc29jX2VudW0gdG8gLnRleHRzIGFycmF5IGl0ZW1zICovCiAJbWF4OTgwOTUtPmJxX2VudW0udGV4dHMgPSBtYXg5ODA5NS0+YnFfdGV4dHM7Ci0JbWF4OTgwOTUtPmJxX2VudW0ubWF4ID0gbWF4OTgwOTUtPmJxX3RleHRjbnQ7CisJbWF4OTgwOTUtPmJxX2VudW0uaXRlbXMgPSBtYXg5ODA5NS0+YnFfdGV4dGNudDsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBjb250cm9scywgQVJSQVlfU0laRShjb250cm9scykpOwogCWlmIChyZXQgIT0gMCkKQEAgLTIyMzQsMTIgKzIyMzgsNiBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJaW50IHJldCA9IDA7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogcmVzZXQgdGhlIGNvZGVjLCB0aGUgRFNQIGNvcmUsIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCiAJbWF4OTgwOTVfcmVzZXQoY29kZWMpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCmluZGV4IDgyNzU3ZWIuLjRmZGY1YWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCkBAIC0zMTIsMTQgKzMxMiw2IEBACiAKIHN0YXRpYyBpbnQgbWF4OTg1MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIGVuYWJsZSB6ZXJvLWRldGVjdCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1BWDk4NTBfR0VORVJBTF9QVVJQT1NFLCAxLCAxKTsKIAkvKiBlbmFibGUgc2xldy1yYXRlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWMxMzc4My5jIGIvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKaW5kZXggNTgyYzJiYi4uMmM1OWIxZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKQEAgLTEwNiw4ICsxMDYsNyBAQAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJdW5zaWduZWQgaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCWludCBpOwogCkBAIC0xMjYsOCArMTI1LDcgQEAKIAkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXVuc2lnbmVkIGludCByYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00MDgsOCArNDA2LDcgQEAKIAkiTUMxTCIsICJSWElOTCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY2xfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKDAsIDAsIEFSUkFZX1NJWkUoYWRjbF9lbnVtX3RleHQpLCBhZGNsX2VudW1fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChhZGNsX2VudW0sIGFkY2xfZW51bV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIlJvdXRlIiwgYWRjbF9lbnVtKTsKQEAgLTQxOCw4ICs0MTUsNyBAQAogCSJNQzFSIiwgIk1DMiIsICJSWElOUiIsICJUWElOIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgQVJSQVlfU0laRShhZGNyX2VudW1fdGV4dCksIGFkY3JfZW51bV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfVklSVF9ERUNMKGFkY3JfZW51bSwgYWRjcl9lbnVtX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfaW5wdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIlJvdXRlIiwgYWRjcl9lbnVtKTsKQEAgLTQzMCw4ICs0MjYsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGVha2VyX2FtcF9zb3VyY2VfdGV4dFtdID0gewogCSJDT0RFQyIsICJSaWdodCIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9hbXBfc291cmNlLCBNQzEzNzgzX0FVRElPX1JYMCwgNCwKLQkJCQkgIHNwZWFrZXJfYW1wX3NvdXJjZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX2FtcF9zb3VyY2UsIE1DMTM3ODNfQVVESU9fUlgwLCA0LAorCQkJICAgIHNwZWFrZXJfYW1wX3NvdXJjZV90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGVha2VyX2FtcF9zb3VyY2VfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTcGVha2VyIEFtcCBTb3VyY2UgTVVYIiwgc3BlYWtlcl9hbXBfc291cmNlKTsKIApAQCAtNDM5LDggKzQzNSw4IEBACiAJIkNPREVDIiwgIk1peGVyIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhlYWRzZXRfYW1wX3NvdXJjZSwgTUMxMzc4M19BVURJT19SWDAsIDExLAotCQkJCSAgaGVhZHNldF9hbXBfc291cmNlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhlYWRzZXRfYW1wX3NvdXJjZSwgTUMxMzc4M19BVURJT19SWDAsIDExLAorCQkJICAgIGhlYWRzZXRfYW1wX3NvdXJjZV90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZWFkc2V0X2FtcF9zb3VyY2VfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIZWFkc2V0IEFtcCBTb3VyY2UgTVVYIiwgaGVhZHNldF9hbXBfc291cmNlKTsKIApAQCAtNTgwLDkgKzU3Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1jMTM3ODNfM2RfbWl4ZXJbXSA9IHsiU3RlcmVvIiwgIlBoYXNlIE1peCIsCiAJCQkJCQkiTW9ubyIsICJNb25vIE1peCJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1jMTM3ODNfZW51bV8zZF9taXhlciA9Ci0JU09DX0VOVU1fU0lOR0xFKE1DMTM3ODNfQVVESU9fUlgxLCAxNiwgQVJSQVlfU0laRShtYzEzNzgzXzNkX21peGVyKSwKLQkJCW1jMTM3ODNfM2RfbWl4ZXIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1jMTM3ODNfZW51bV8zZF9taXhlciwKKwkJCSAgICBNQzEzNzgzX0FVRElPX1JYMSwgMTYsCisJCQkgICAgbWMxMzc4M18zZF9taXhlcik7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYzEzNzgzX2NvbnRyb2xfbGlzdFtdID0gewogCVNPQ19TSU5HTEUoIkxvdWRzcGVha2VyIGVuYWJsZSIsIE1DMTM3ODNfQVVESU9fUlgwLCA1LCAxLCAwKSwKQEAgLTYxNCw4ICs2MTAsOCBAQAogCXN0cnVjdCBtYzEzNzgzX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYtPnBhcmVudCwgTlVMTCk7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDI0LCBTTkRfU09DX1JFR01BUCk7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsCisJCQlkZXZfZ2V0X3JlZ21hcChjb2RlYy0+ZGV2LT5wYXJlbnQsIE5VTEwpKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMgYi9zb3VuZC9zb2MvY29kZWNzL21sMjYxMjQuYwppbmRleCAxODVmYTNiYy4uZTY2MWU4NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKQEAgLTczLDExICs3MywxMSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtbDI2MTI0X2NvbXBhbmRpbmdbXSA9IHsiMTZiaXQgUENNIiwgInUtbGF3IiwKIAkJCQkJCSAgIkEtbGF3In07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWwyNjEyNF9hZGNfY29tcGFuZGluZ19lbnVtCi0JPSBTT0NfRU5VTV9TSU5HTEUoTUwyNjEyNF9TQUlfVFJBTlNfQ1RMLCA2LCAzLCBtbDI2MTI0X2NvbXBhbmRpbmcpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1sMjYxMjRfYWRjX2NvbXBhbmRpbmdfZW51bSwKKwkJCSAgICBNTDI2MTI0X1NBSV9UUkFOU19DVEwsIDYsIG1sMjYxMjRfY29tcGFuZGluZyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWwyNjEyNF9kYWNfY29tcGFuZGluZ19lbnVtCi0JPSBTT0NfRU5VTV9TSU5HTEUoTUwyNjEyNF9TQUlfUkNWX0NUTCwgNiwgMywgbWwyNjEyNF9jb21wYW5kaW5nKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtbDI2MTI0X2RhY19jb21wYW5kaW5nX2VudW0sCisJCQkgICAgTUwyNjEyNF9TQUlfUkNWX0NUTCwgNiwgbWwyNjEyNF9jb21wYW5kaW5nKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1sMjYxMjRfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRV9UTFYoIkNhcHR1cmUgRGlnaXRhbCBWb2x1bWUiLCBNTDI2MTI0X1JFQ09SRF9ESUdfVk9MLCAwLApAQCAtMTM2LDggKzEzNiw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1sMjYxMjRfaW5wdXRfc2VsZWN0W10gPSB7IkFuYWxvZyBNSUMgU2luZ2xlRW5kZWQgaW4iLAogCQkJCSJEaWdpdGFsIE1JQyBpbiIsICJBbmFsb2cgTUlDIERpZmZlcmVudGlhbCBpbiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1sMjYxMjRfaW5zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1MMjYxMjRfTUlDX0lGX0NUTCwgMCwgMywgbWwyNjEyNF9pbnB1dF9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1sMjYxMjRfaW5zZWxfZW51bSwKKwkJCSAgICBNTDI2MTI0X01JQ19JRl9DVEwsIDAsIG1sMjYxMjRfaW5wdXRfc2VsZWN0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1sMjYxMjRfaW5wdXRfbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCBtbDI2MTI0X2luc2VsX2VudW0pOwpAQCAtNTg2LDE2ICs1ODYsNiBAQAogCiBzdGF0aWMgaW50IG1sMjYxMjRfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7Ci0Jc3RydWN0IG1sMjYxMjRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBTb2Z0d2FyZSBSZXNldCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1MMjYxMjRfU1dfUlNULCAweDAxLCAxKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNTDI2MTI0X1NXX1JTVCwgMHgwMSwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCmluZGV4IDczZjljMzYuLmU0Mjc1NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCkBAIC0xNzIsMTYgKzE3MiwyMSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHBjbTE2ODFfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCB2YWwgPSAwLCByZXQ7Ci0JaW50IHBjbV9mb3JtYXQgPSBwYXJhbXNfZm9ybWF0KHBhcmFtcyk7CiAKIAlwcml2LT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAogCXN3aXRjaCAocHJpdi0+Zm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6Ci0JCWlmIChwY21fZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQotCQkJdmFsID0gMHgwMDsKLQkJZWxzZSBpZiAocGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkKLQkJCXZhbCA9IDB4MDM7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAyNDoKKwkJCXZhbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXZhbCA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgogCQl2YWwgPSAweDA0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jCmluZGV4IDcxNDY2NTNhLi4zYTgwYmE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OTJhLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jCkBAIC0xMDcsMjQgKzEwNywzNSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHBjbTE3OTJhX3ByaXZhdGUgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgdmFsID0gMCwgcmV0OwotCWludCBwY21fZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChwYXJhbXMpOwogCiAJcHJpdi0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAKIAlzd2l0Y2ggKHByaXYtPmZvcm1hdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgotCQlpZiAocGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSB8fAotCQkgICAgcGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSkKLQkJCXZhbCA9IDB4MDI7Ci0JCWVsc2UgaWYgKHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCi0JCQl2YWwgPSAweDAwOworCQlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJCWNhc2UgMjQ6CisJCWNhc2UgMzI6CisJCQl2YWwgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKLQkJaWYgKHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUgfHwKLQkJICAgIHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpCi0JCQl2YWwgPSAweDA1OwotCQllbHNlIGlmIChwY21fZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKQotCQkJdmFsID0gMHgwNDsKKwkJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCQljYXNlIDI0OgorCQljYXNlIDMyOgorCQkJdmFsID0gNTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJdmFsID0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBEQUkgZm9ybWF0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1pMmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYyMjMwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LWkyYy5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBQQ001MTJ4IENPREVDcworICoKKyAqIEF1dGhvcjoJTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPgorICoJCUNvcHlyaWdodCAyMDE0IExpbmFybyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgInBjbTUxMnguaCIKKworc3RhdGljIGludCBwY201MTJ4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmcGNtNTEyeF9yZWdtYXApOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCXJldHVybiBwY201MTJ4X3Byb2JlKCZpMmMtPmRldiwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCBwY201MTJ4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlwY201MTJ4X3JlbW92ZSgmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNtNTEyeF9pMmNfaWRbXSA9IHsKKwl7ICJwY201MTIxIiwgfSwKKwl7ICJwY201MTIyIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNtNTEyeF9pMmNfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwY201MTJ4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxwY201MTIxIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHBjbTUxMjIiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBjbTUxMnhfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNtNTEyeF9pMmNfZHJpdmVyID0geworCS5wcm9iZSAJCT0gcGNtNTEyeF9pMmNfcHJvYmUsCisJLnJlbW92ZSAJPSBwY201MTJ4X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gcGNtNTEyeF9pMmNfaWQsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInBjbTUxMngiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcGNtNTEyeF9vZl9tYXRjaCwKKwkJLnBtICAgICA9ICZwY201MTJ4X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIocGNtNTEyeF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFBDTTUxMnggY29kZWMgZHJpdmVyIC0gSTJDIik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMngtc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMngtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5NzA1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1zcGkuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUENNNTEyeCBDT0RFQ3MKKyAqCisgKiBBdXRob3I6CU1hcmsgQnJvd24gPGJyb29uaWVAbGluYXJvLm9yZz4KKyAqCQlDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAicGNtNTEyeC5oIgorCitzdGF0aWMgaW50IHBjbTUxMnhfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCByZXQ7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZwY201MTJ4X3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcGNtNTEyeF9wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcGNtNTEyeF9yZW1vdmUoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHBjbTUxMnhfc3BpX2lkW10gPSB7CisJeyAicGNtNTEyMSIsIH0sCisJeyAicGNtNTEyMiIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBwY201MTJ4X3NwaV9pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjbTUxMnhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHBjbTUxMjEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGkscGNtNTEyMiIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcGNtNTEyeF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwY201MTJ4X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBjbTUxMnhfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gcGNtNTEyeF9zcGlfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHBjbTUxMnhfc3BpX2lkLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBjbTUxMngiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcGNtNTEyeF9vZl9tYXRjaCwKKwkJLnBtICAgICA9ICZwY201MTJ4X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX3NwaV9kcml2ZXIocGNtNTEyeF9zcGlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YzBjNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jCkBAIC0wLDAgKzEsNTg5IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUENNNTEyeCBDT0RFQ3MKKyAqCisgKiBBdXRob3I6CU1hcmsgQnJvd24gPGJyb29uaWVAbGluYXJvLm9yZz4KKyAqCQlDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInBjbTUxMnguaCIKKworI2RlZmluZSBQQ001MTJ4X05VTV9TVVBQTElFUyAzCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbTUxMnhfc3VwcGx5X25hbWVzW1BDTTUxMnhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiQVZERCIsCisJIkRWREQiLAorCSJDUFZERCIsCit9OworCitzdHJ1Y3QgcGNtNTEyeF9wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqc2NsazsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tQQ001MTJ4X05VTV9TVVBQTElFU107CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHN1cHBseV9uYltQQ001MTJ4X05VTV9TVVBQTElFU107Cit9OworCisvKgorICogV2UgY2FuJ3QgdXNlIHRoZSBzYW1lIG5vdGlmaWVyIGJsb2NrIGZvciBtb3JlIHRoYW4gb25lIHN1cHBseSBhbmQKKyAqIHRoZXJlJ3Mgbm8gd2F5IEkgY2FuIHNlZSB0byBnZXQgZnJvbSBhIGNhbGxiYWNrIHRvIHRoZSBjYWxsZXIKKyAqIGV4Y2VwdCBjb250YWluZXJfb2YoKS4KKyAqLworI2RlZmluZSBQQ001MTJ4X1JFR1VMQVRPUl9FVkVOVChuKSBcCitzdGF0aWMgaW50IHBjbTUxMnhfcmVndWxhdG9yX2V2ZW50XyMjbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCBcCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkgICAgXAoreyBcCisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHBjbTUxMnhfcHJpdiwgXAorCQkJCQkJICAgIHN1cHBseV9uYltuXSk7IFwKKwlpZiAoZXZlbnQgJiBSRUdVTEFUT1JfRVZFTlRfRElTQUJMRSkgeyBcCisJCXJlZ2NhY2hlX21hcmtfZGlydHkocGNtNTEyeC0+cmVnbWFwKTsJXAorCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHBjbTUxMngtPnJlZ21hcCwgdHJ1ZSk7CVwKKwl9IFwKKwlyZXR1cm4gMDsgXAorfQorCitQQ001MTJ4X1JFR1VMQVRPUl9FVkVOVCgwKQorUENNNTEyeF9SRUdVTEFUT1JfRVZFTlQoMSkKK1BDTTUxMnhfUkVHVUxBVE9SX0VWRU5UKDIpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgcGNtNTEyeF9yZWdfZGVmYXVsdHNbXSA9IHsKKwl7IFBDTTUxMnhfUkVTRVQsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfUE9XRVIsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfTVVURSwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRFNQLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfUExMX1JFRiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfREFDX1JPVVRJTkcsICAgICAgIDB4MTEgfSwKKwl7IFBDTTUxMnhfRFNQX1BST0dSQU0sICAgICAgIDB4MDEgfSwKKwl7IFBDTTUxMnhfQ0xLREVULCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQVVUT19NVVRFLCAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRVJST1JfREVURUNULCAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMSwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMiwgIDB4MzAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMywgIDB4MzAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsICAgIDB4MjIgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzIsICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzMsICAgIDB4MDcgfSwKKwl7IFBDTTUxMnhfT1VUUFVUX0FNUExJVFVERSwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1QsIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX01VVEVfQ1RSTCwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsIDB4MDAgfSwKKwl7IFBDTTUxMnhfVkNPTV9DVFJMXzEsICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfVkNPTV9DVFJMXzIsICAgICAgIDB4MDEgfSwKK307CisKK3N0YXRpYyBib29sIHBjbTUxMnhfcmVhZGFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQQ001MTJ4X1JFU0VUOgorCWNhc2UgUENNNTEyeF9QT1dFUjoKKwljYXNlIFBDTTUxMnhfTVVURToKKwljYXNlIFBDTTUxMnhfUExMX0VOOgorCWNhc2UgUENNNTEyeF9TUElfTUlTT19GVU5DVElPTjoKKwljYXNlIFBDTTUxMnhfRFNQOgorCWNhc2UgUENNNTEyeF9HUElPX0VOOgorCWNhc2UgUENNNTEyeF9CQ0xLX0xSQ0xLX0NGRzoKKwljYXNlIFBDTTUxMnhfRFNQX0dQSU9fSU5QVVQ6CisJY2FzZSBQQ001MTJ4X01BU1RFUl9NT0RFOgorCWNhc2UgUENNNTEyeF9QTExfUkVGOgorCWNhc2UgUENNNTEyeF9QTExfQ09FRkZfMDoKKwljYXNlIFBDTTUxMnhfUExMX0NPRUZGXzE6CisJY2FzZSBQQ001MTJ4X1BMTF9DT0VGRl8yOgorCWNhc2UgUENNNTEyeF9QTExfQ09FRkZfMzoKKwljYXNlIFBDTTUxMnhfUExMX0NPRUZGXzQ6CisJY2FzZSBQQ001MTJ4X0RTUF9DTEtESVY6CisJY2FzZSBQQ001MTJ4X0RBQ19DTEtESVY6CisJY2FzZSBQQ001MTJ4X05DUF9DTEtESVY6CisJY2FzZSBQQ001MTJ4X09TUl9DTEtESVY6CisJY2FzZSBQQ001MTJ4X01BU1RFUl9DTEtESVZfMToKKwljYXNlIFBDTTUxMnhfTUFTVEVSX0NMS0RJVl8yOgorCWNhc2UgUENNNTEyeF9GU19TUEVFRF9NT0RFOgorCWNhc2UgUENNNTEyeF9JREFDXzE6CisJY2FzZSBQQ001MTJ4X0lEQUNfMjoKKwljYXNlIFBDTTUxMnhfRVJST1JfREVURUNUOgorCWNhc2UgUENNNTEyeF9JMlNfMToKKwljYXNlIFBDTTUxMnhfSTJTXzI6CisJY2FzZSBQQ001MTJ4X0RBQ19ST1VUSU5HOgorCWNhc2UgUENNNTEyeF9EU1BfUFJPR1JBTToKKwljYXNlIFBDTTUxMnhfQ0xLREVUOgorCWNhc2UgUENNNTEyeF9BVVRPX01VVEU6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzE6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzI6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzM6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfTVVURV8xOgorCWNhc2UgUENNNTEyeF9ESUdJVEFMX01VVEVfMjoKKwljYXNlIFBDTTUxMnhfRElHSVRBTF9NVVRFXzM6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzE6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzI6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzM6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzQ6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzU6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzY6CisJY2FzZSBQQ001MTJ4X0dQSU9fQ09OVFJPTF8xOgorCWNhc2UgUENNNTEyeF9HUElPX0NPTlRST0xfMjoKKwljYXNlIFBDTTUxMnhfT1ZFUkZMT1c6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzE6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzI6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzM6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzQ6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19NVVRFX0RFVDoKKwljYXNlIFBDTTUxMnhfR1BJTjoKKwljYXNlIFBDTTUxMnhfRElHSVRBTF9NVVRFX0RFVDoKKwljYXNlIFBDTTUxMnhfT1VUUFVUX0FNUExJVFVERToKKwljYXNlIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTDoKKwljYXNlIFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1Q6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19NVVRFX0NUUkw6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19HQUlOX0JPT1NUOgorCWNhc2UgUENNNTEyeF9WQ09NX0NUUkxfMToKKwljYXNlIFBDTTUxMnhfVkNPTV9DVFJMXzI6CisJY2FzZSBQQ001MTJ4X0NSQU1fQ1RSTDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJLyogVGhlcmUgYXJlIDI1NiByYXcgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisJCXJldHVybiByZWcgPCAweGZmOworCX0KK30KKworc3RhdGljIGJvb2wgcGNtNTEyeF92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBDTTUxMnhfUExMX0VOOgorCWNhc2UgUENNNTEyeF9PVkVSRkxPVzoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMToKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMjoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMzoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfNDoKKwljYXNlIFBDTTUxMnhfQU5BTE9HX01VVEVfREVUOgorCWNhc2UgUENNNTEyeF9HUElOOgorCWNhc2UgUENNNTEyeF9ESUdJVEFMX01VVEVfREVUOgorCWNhc2UgUENNNTEyeF9DUkFNX0NUUkw6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCS8qIFRoZXJlIGFyZSAyNTYgcmF3IHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworCQlyZXR1cm4gcmVnIDwgMHhmZjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEwMzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW5hbG9nX3RsdiwgLTYwMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShib29zdF90bHYsIDAsIDgwLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY201MTJ4X2RzcF9wcm9ncmFtX3RleHRzW10gPSB7CisJIkZJUiBpbnRlcnBvbGF0aW9uIHdpdGggZGUtZW1waGFzaXMiLAorCSJMb3cgbGF0ZW5jeSBJSVIgd2l0aCBkZS1lbXBoYXNpcyIsCisJIkZpeGVkIHByb2Nlc3MgZmxvdyIsCisJIkhpZ2ggYXR0ZW51YXRpb24gd2l0aCBkZS1lbXBoYXNpcyIsCisJIlJpbmdpbmctbGVzcyBsb3cgbGF0ZW5jeSBGSVIiLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY201MTJ4X2RzcF9wcm9ncmFtX3ZhbHVlc1tdID0geworCTEsCisJMiwKKwkzLAorCTUsCisJNywKK307CisKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChwY201MTJ4X2RzcF9wcm9ncmFtLAorCQkJCSAgUENNNTEyeF9EU1BfUFJPR1JBTSwgMCwgMHgxZiwKKwkJCQkgIHBjbTUxMnhfZHNwX3Byb2dyYW1fdGV4dHMsCisJCQkJICBwY201MTJ4X2RzcF9wcm9ncmFtX3ZhbHVlcyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtNTEyeF9jbGtfbWlzc2luZ190ZXh0W10gPSB7CisJIjFzIiwgIjJzIiwgIjNzIiwgIjRzIiwgIjVzIiwgIjZzIiwgIjdzIiwgIjhzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X2Nsa19taXNzaW5nID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9DTEtERVQsIDAsICA4LCBwY201MTJ4X2Nsa19taXNzaW5nX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbTUxMnhfYXV0b21fdGV4dFtdID0geworCSIyMW1zIiwgIjEwNm1zIiwgIjIxM21zIiwgIjUzM21zIiwgIjEuMDdzIiwgIjIuMTNzIiwgIjUuMzNzIiwgIjEwLjY2cyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtNTEyeF9hdXRvbV9sID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9BVVRPX01VVEUsIFBDTTUxMnhfQVRNTF9TSElGVCwgOCwKKwkJCXBjbTUxMnhfYXV0b21fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtNTEyeF9hdXRvbV9yID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9BVVRPX01VVEUsIFBDTTUxMnhfQVRNUl9TSElGVCwgOCwKKwkJCXBjbTUxMnhfYXV0b21fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtNTEyeF9yYW1wX3JhdGVfdGV4dFtdID0geworCSIxIHNhbXBsZS91cGRhdGUiLCAiMiBzYW1wbGVzL3VwZGF0ZSIsICI0IHNhbXBsZXMvdXBkYXRlIiwKKwkiSW1tZWRpYXRlIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZuZGYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8xLCBQQ001MTJ4X1ZOREZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZudWYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8xLCBQQ001MTJ4X1ZOVUZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZlZGYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8yLCBQQ001MTJ4X1ZFREZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY201MTJ4X3JhbXBfc3RlcF90ZXh0W10gPSB7CisJIjRkQi9zdGVwIiwgIjJkQi9zdGVwIiwgIjFkQi9zdGVwIiwgIjAuNWRCL3N0ZXAiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdm5kcyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsIFBDTTUxMnhfVk5EU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdm51cyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsIFBDTTUxMnhfVk5VU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdmVkcyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzIsIFBDTTUxMnhfVkVEU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGNtNTEyeF9jb250cm9sc1tdID0geworU09DX0RPVUJMRV9SX1RMVigiUGxheWJhY2sgRGlnaXRhbCBWb2x1bWUiLCBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzIsCisJCSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzMsIDAsIDI1NSwgMSwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwKKwkgICAgICAgUENNNTEyeF9MQUdOX1NISUZULCBQQ001MTJ4X1JBR05fU0hJRlQsIDEsIDEsIGFuYWxvZ190bHYpLAorU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIEJvb3N0IFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsCisJICAgICAgIFBDTTUxMnhfQUdCTF9TSElGVCwgUENNNTEyeF9BR0JSX1NISUZULCAxLCAwLCBib29zdF90bHYpLAorU09DX0RPVUJMRSgiUGxheWJhY2sgRGlnaXRhbCBTd2l0Y2giLCBQQ001MTJ4X01VVEUsIFBDTTUxMnhfUlFNTF9TSElGVCwKKwkgICBQQ001MTJ4X1JRTVJfU0hJRlQsIDEsIDEpLAorCitTT0NfU0lOR0xFKCJEZWVtcGhhc2lzIFN3aXRjaCIsIFBDTTUxMnhfRFNQLCBQQ001MTJ4X0RFTVBfU0hJRlQsIDEsIDEpLAorU09DX1ZBTFVFX0VOVU0oIkRTUCBQcm9ncmFtIiwgcGNtNTEyeF9kc3BfcHJvZ3JhbSksCisKK1NPQ19FTlVNKCJDbG9jayBNaXNzaW5nIFBlcmlvZCIsIHBjbTUxMnhfY2xrX21pc3NpbmcpLAorU09DX0VOVU0oIkF1dG8gTXV0ZSBUaW1lIExlZnQiLCBwY201MTJ4X2F1dG9tX2wpLAorU09DX0VOVU0oIkF1dG8gTXV0ZSBUaW1lIFJpZ2h0IiwgcGNtNTEyeF9hdXRvbV9yKSwKK1NPQ19TSU5HTEUoIkF1dG8gTXV0ZSBNb25vIFN3aXRjaCIsIFBDTTUxMnhfRElHSVRBTF9NVVRFXzMsCisJICAgUENNNTEyeF9BQ1RMX1NISUZULCAxLCAwKSwKK1NPQ19ET1VCTEUoIkF1dG8gTXV0ZSBTd2l0Y2giLCBQQ001MTJ4X0RJR0lUQUxfTVVURV8zLCBQQ001MTJ4X0FNTEVfU0hJRlQsCisJICAgUENNNTEyeF9BTUxSX1NISUZULCAxLCAwKSwKKworU09DX0VOVU0oIlZvbHVtZSBSYW1wIERvd24gUmF0ZSIsIHBjbTUxMnhfdm5kZiksCitTT0NfRU5VTSgiVm9sdW1lIFJhbXAgRG93biBTdGVwIiwgcGNtNTEyeF92bmRzKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBVcCBSYXRlIiwgcGNtNTEyeF92bnVmKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBVcCBTdGVwIiwgcGNtNTEyeF92bnVzKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBEb3duIEVtZXJnZW5jeSBSYXRlIiwgcGNtNTEyeF92ZWRmKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBEb3duIEVtZXJnZW5jeSBTdGVwIiwgcGNtNTEyeF92ZWRzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwY201MTJ4X2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX0RBQygiREFDTCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCitTTkRfU09DX0RBUE1fREFDKCJEQUNSIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcGNtNTEyeF9kYXBtX3JvdXRlc1tdID0geworCXsgIkRBQ0wiLCBOVUxMLCAiUGxheWJhY2siIH0sCisJeyAiREFDUiIsIE5VTEwsICJQbGF5YmFjayIgfSwKKworCXsgIk9VVEwiLCBOVUxMLCAiREFDTCIgfSwKKwl7ICJPVVRSIiwgTlVMTCwgIkRBQ1IiIH0sCit9OworCitzdGF0aWMgaW50IHBjbTUxMnhfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkJIFBDTTUxMnhfUlFTVCwgMCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlbW92ZSBzdGFuZGJ5OiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkJIFBDTTUxMnhfUlFTVCwgUENNNTEyeF9SUVNUKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBzdGFuZGJ5OiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcGNtNTEyeF9kYWkgPSB7CisJLm5hbWUgPSAicGNtNTEyeC1oaWZpIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBwY201MTJ4X2NvZGVjX2RyaXZlciA9IHsKKwkuc2V0X2JpYXNfbGV2ZWwgPSBwY201MTJ4X3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKworCS5jb250cm9scyA9IHBjbTUxMnhfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocGNtNTEyeF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHBjbTUxMnhfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gcGNtNTEyeF9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBwY201MTJ4X3JhbmdlID0geworCS5uYW1lID0gIlBhZ2VzIiwgLnJhbmdlX21pbiA9IFBDTTUxMnhfVklSVF9CQVNFLAorCS5yYW5nZV9tYXggPSBQQ001MTJ4X01BWF9SRUdJU1RFUiwKKwkuc2VsZWN0b3JfcmVnID0gUENNNTEyeF9QQUdFLAorCS5zZWxlY3Rvcl9tYXNrID0gMHhmZiwKKwkud2luZG93X3N0YXJ0ID0gMCwgLndpbmRvd19sZW4gPSAweDEwMCwKK307CisKK2NvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHBjbTUxMnhfcmVnbWFwID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5yZWFkYWJsZV9yZWcgPSBwY201MTJ4X3JlYWRhYmxlLAorCS52b2xhdGlsZV9yZWcgPSBwY201MTJ4X3ZvbGF0aWxlLAorCisJLnJhbmdlcyA9ICZwY201MTJ4X3JhbmdlLAorCS5udW1fcmFuZ2VzID0gMSwKKworCS5tYXhfcmVnaXN0ZXIgPSBQQ001MTJ4X01BWF9SRUdJU1RFUiwKKwkucmVnX2RlZmF1bHRzID0gcGNtNTEyeF9yZWdfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHBjbTUxMnhfcmVnX2RlZmF1bHRzKSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3JlZ21hcCk7CisKK2ludCBwY201MTJ4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMng7CisJaW50IGksIHJldDsKKworCXBjbTUxMnggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBjbTUxMnhfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcGNtNTEyeCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwY201MTJ4KTsKKwlwY201MTJ4LT5yZWdtYXAgPSByZWdtYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyk7IGkrKykKKwkJcGNtNTEyeC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gcGNtNTEyeF9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChkZXYsIEFSUkFZX1NJWkUocGNtNTEyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwY201MTJ4LT5zdXBwbHlfbmJbMF0ubm90aWZpZXJfY2FsbCA9IHBjbTUxMnhfcmVndWxhdG9yX2V2ZW50XzA7CisJcGNtNTEyeC0+c3VwcGx5X25iWzFdLm5vdGlmaWVyX2NhbGwgPSBwY201MTJ4X3JlZ3VsYXRvcl9ldmVudF8xOworCXBjbTUxMngtPnN1cHBseV9uYlsyXS5ub3RpZmllcl9jYWxsID0gcGNtNTEyeF9yZWd1bGF0b3JfZXZlbnRfMjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKTsgaSsrKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9yZWdpc3Rlcl9ub3RpZmllcihwY201MTJ4LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJCSAgJnBjbTUxMngtPnN1cHBseV9uYltpXSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyksCisJCQkJICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXNldCB0aGUgZGV2aWNlLCB2ZXJpZnlpbmcgSS9PIGluIHRoZSBwcm9jZXNzIGZvciBJMkMgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBQQ001MTJ4X1JFU0VULAorCQkJICAgUENNNTEyeF9SU1RNIHwgUENNNTEyeF9SU1RSKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzZXQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgUENNNTEyeF9SRVNFVCwgMCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXBjbTUxMngtPnNjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBjbTUxMngtPnNjbGspKSB7CisJCWlmIChQVFJfRVJSKHBjbTUxMngtPnNjbGspID09IC1FUFJPQkVfREVGRVIpCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCQlkZXZfaW5mbyhkZXYsICJObyBTQ0xLLCB1c2luZyBCQ0xLOiAlbGRcbiIsCisJCQkgUFRSX0VSUihwY201MTJ4LT5zY2xrKSk7CisKKwkJLyogRGlzYWJsZSByZXBvcnRpbmcgb2YgbWlzc2luZyBTQ0xLIGFzIGFuIGVycm9yICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFBDTTUxMnhfRVJST1JfREVURUNULAorCQkJCSAgIFBDTTUxMnhfSURDSCwgUENNNTEyeF9JRENIKTsKKworCQkvKiBTd2l0Y2ggUExMIGlucHV0IHRvIEJDTEsgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgUENNNTEyeF9QTExfUkVGLAorCQkJCSAgIFBDTTUxMnhfU1JFRiwgUENNNTEyeF9TUkVGKTsKKwl9IGVsc2UgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGNtNTEyeC0+c2Nsayk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFNDTEs6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIERlZmF1bHQgdG8gc3RhbmRieSBtb2RlICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkgUENNNTEyeF9SUVNULCBQQ001MTJ4X1JRU1QpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN0YW5kYnk6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcG1fcnVudGltZV9pZGxlKGRldik7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJnBjbTUxMnhfY29kZWNfZHJpdmVyLAorCQkJCSAgICAmcGNtNTEyeF9kYWksIDEpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBDT0RFQzogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3BtOworCX0KKworCXJldHVybiAwOworCitlcnJfcG06CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CitlcnJfY2xrOgorCWlmICghSVNfRVJSKHBjbTUxMngtPnNjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGNtNTEyeC0+c2Nsayk7CitlcnI6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKSwKKwkJCQkgICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNtNTEyeF9wcm9iZSk7CisKK3ZvaWQgcGNtNTEyeF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYyhkZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCWlmICghSVNfRVJSKHBjbTUxMngtPnNjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGNtNTEyeC0+c2Nsayk7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBwY201MTJ4LT5zdXBwbGllcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwY201MTJ4LT5yZWdtYXAsIFBDTTUxMnhfUE9XRVIsCisJCQkJIFBDTTUxMnhfUlFQRCwgUENNNTEyeF9SUVBEKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBwb3dlciBkb3duOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUocGNtNTEyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgcGNtNTEyeC0+c3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBkaXNhYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0VSUihwY201MTJ4LT5zY2xrKSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBjbTUxMngtPnNjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKCFJU19FUlIocGNtNTEyeC0+c2NsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBjbTUxMngtPnNjbGspOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBTQ0xLOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyksCisJCQkJICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHBjbTUxMngtPnJlZ21hcCwgZmFsc2UpOworCXJldCA9IHJlZ2NhY2hlX3N5bmMocGNtNTEyeC0+cmVnbWFwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc3luYyBjYWNoZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkgUENNNTEyeF9SUVBELCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVtb3ZlIHBvd2VyIGRvd246ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY201MTJ4X3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMocGNtNTEyeF9zdXNwZW5kLCBwY201MTJ4X3Jlc3VtZSwgTlVMTCkKK307CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3BtX29wcyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBQQ001MTJ4IGNvZGVjIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmggYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU3NmFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBQQ001MTJ4IENPREVDcworICoKKyAqIEF1dGhvcjoJTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPgorICoJCUNvcHlyaWdodCAyMDE0IExpbmFybyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfU05EX1NPQ19QQ001MTJYCisjZGVmaW5lIF9TTkRfU09DX1BDTTUxMlgKKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUENNNTEyeF9WSVJUX0JBU0UgMHgxMDAKKyNkZWZpbmUgUENNNTEyeF9QQUdFX0xFTiAgMHgxMDAKKyNkZWZpbmUgUENNNTEyeF9QQUdFX0JBU0UobikgIChQQ001MTJ4X1ZJUlRfQkFTRSArIChQQ001MTJ4X1BBR0VfTEVOICogbikpCisKKyNkZWZpbmUgUENNNTEyeF9QQUdFICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgUENNNTEyeF9SRVNFVCAgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDEpCisjZGVmaW5lIFBDTTUxMnhfUE9XRVIgICAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICAyKQorI2RlZmluZSBQQ001MTJ4X01VVEUgICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAgMykKKyNkZWZpbmUgUENNNTEyeF9QTExfRU4gICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDQpCisjZGVmaW5lIFBDTTUxMnhfU1BJX01JU09fRlVOQ1RJT04gKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICA2KQorI2RlZmluZSBQQ001MTJ4X0RTUCAgICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAgNykKKyNkZWZpbmUgUENNNTEyeF9HUElPX0VOICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDgpCisjZGVmaW5lIFBDTTUxMnhfQkNMS19MUkNMS19DRkcgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICA5KQorI2RlZmluZSBQQ001MTJ4X0RTUF9HUElPX0lOUFVUICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAxMCkKKyNkZWZpbmUgUENNNTEyeF9NQVNURVJfTU9ERSAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMTIpCisjZGVmaW5lIFBDTTUxMnhfUExMX1JFRiAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDEzKQorI2RlZmluZSBQQ001MTJ4X1BMTF9DT0VGRl8wICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyMCkKKyNkZWZpbmUgUENNNTEyeF9QTExfQ09FRkZfMSAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjEpCisjZGVmaW5lIFBDTTUxMnhfUExMX0NPRUZGXzIgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDIyKQorI2RlZmluZSBQQ001MTJ4X1BMTF9DT0VGRl8zICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyMykKKyNkZWZpbmUgUENNNTEyeF9QTExfQ09FRkZfNCAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjQpCisjZGVmaW5lIFBDTTUxMnhfRFNQX0NMS0RJViAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDI3KQorI2RlZmluZSBQQ001MTJ4X0RBQ19DTEtESVYgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyOCkKKyNkZWZpbmUgUENNNTEyeF9OQ1BfQ0xLRElWICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjkpCisjZGVmaW5lIFBDTTUxMnhfT1NSX0NMS0RJViAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDMwKQorI2RlZmluZSBQQ001MTJ4X01BU1RFUl9DTEtESVZfMSAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAzMikKKyNkZWZpbmUgUENNNTEyeF9NQVNURVJfQ0xLRElWXzIgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMzMpCisjZGVmaW5lIFBDTTUxMnhfRlNfU1BFRURfTU9ERSAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDM0KQorI2RlZmluZSBQQ001MTJ4X0lEQUNfMSAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAzNSkKKyNkZWZpbmUgUENNNTEyeF9JREFDXzIgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMzYpCisjZGVmaW5lIFBDTTUxMnhfRVJST1JfREVURUNUICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDM3KQorI2RlZmluZSBQQ001MTJ4X0kyU18xICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA0MCkKKyNkZWZpbmUgUENNNTEyeF9JMlNfMiAgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNDEpCisjZGVmaW5lIFBDTTUxMnhfREFDX1JPVVRJTkcgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDQyKQorI2RlZmluZSBQQ001MTJ4X0RTUF9QUk9HUkFNICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA0MykKKyNkZWZpbmUgUENNNTEyeF9DTEtERVQgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNDQpCisjZGVmaW5lIFBDTTUxMnhfQVVUT19NVVRFICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDU5KQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzEgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA2MCkKKyNkZWZpbmUgUENNNTEyeF9ESUdJVEFMX1ZPTFVNRV8yICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNjEpCisjZGVmaW5lIFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMyAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDYyKQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfTVVURV8xICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA2MykKKyNkZWZpbmUgUENNNTEyeF9ESUdJVEFMX01VVEVfMiAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNjQpCisjZGVmaW5lIFBDTTUxMnhfRElHSVRBTF9NVVRFXzMgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDY1KQorI2RlZmluZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzEgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4MCkKKyNkZWZpbmUgUENNNTEyeF9HUElPX09VVFBVVF8yICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODEpCisjZGVmaW5lIFBDTTUxMnhfR1BJT19PVVRQVVRfMyAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDgyKQorI2RlZmluZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzQgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4MykKKyNkZWZpbmUgUENNNTEyeF9HUElPX09VVFBVVF81ICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODQpCisjZGVmaW5lIFBDTTUxMnhfR1BJT19PVVRQVVRfNiAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDg1KQorI2RlZmluZSBQQ001MTJ4X0dQSU9fQ09OVFJPTF8xICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4NikKKyNkZWZpbmUgUENNNTEyeF9HUElPX0NPTlRST0xfMiAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODcpCisjZGVmaW5lIFBDTTUxMnhfT1ZFUkZMT1cgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDkwKQorI2RlZmluZSBQQ001MTJ4X1JBVEVfREVUXzEgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA5MSkKKyNkZWZpbmUgUENNNTEyeF9SQVRFX0RFVF8yICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgOTIpCisjZGVmaW5lIFBDTTUxMnhfUkFURV9ERVRfMyAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDkzKQorI2RlZmluZSBQQ001MTJ4X1JBVEVfREVUXzQgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA5NCkKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfTVVURV9ERVQgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAxMDgpCisjZGVmaW5lIFBDTTUxMnhfR1BJTiAgICAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgMTE5KQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfTVVURV9ERVQgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArIDEyMCkKKworI2RlZmluZSBQQ001MTJ4X09VVFBVVF9BTVBMSVRVREUgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgMSkKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfR0FJTl9DVFJMICAoUENNNTEyeF9QQUdFX0JBU0UoMSkgKyAgIDIpCisjZGVmaW5lIFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1QgKFBDTTUxMnhfUEFHRV9CQVNFKDEpICsgICA1KQorI2RlZmluZSBQQ001MTJ4X0FOQUxPR19NVVRFX0NUUkwgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgNikKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfR0FJTl9CT09TVCAoUENNNTEyeF9QQUdFX0JBU0UoMSkgKyAgIDcpCisjZGVmaW5lIFBDTTUxMnhfVkNPTV9DVFJMXzEgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDEpICsgICA4KQorI2RlZmluZSBQQ001MTJ4X1ZDT01fQ1RSTF8yICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgOSkKKworI2RlZmluZSBQQ001MTJ4X0NSQU1fQ1RSTCAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSg0NCkgKyAgMSkKKworI2RlZmluZSBQQ001MTJ4X01BWF9SRUdJU1RFUiAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSg0NCkgKyAgMSkKKworLyogUGFnZSAwLCBSZWdpc3RlciAxIC0gcmVzZXQgKi8KKyNkZWZpbmUgUENNNTEyeF9SU1RSICgxIDw8IDApCisjZGVmaW5lIFBDTTUxMnhfUlNUTSAoMSA8PCA0KQorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDIgLSBwb3dlciAqLworI2RlZmluZSBQQ001MTJ4X1JRUEQgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUENNNTEyeF9SUVBEX1NISUZUIDAKKyNkZWZpbmUgUENNNTEyeF9SUVNUICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFBDTTUxMnhfUlFTVF9TSElGVCA0CisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgMyAtIG11dGUgKi8KKyNkZWZpbmUgUENNNTEyeF9SUU1SX1NISUZUIDAKKyNkZWZpbmUgUENNNTEyeF9SUU1MX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciA0IC0gUExMICovCisjZGVmaW5lIFBDTTUxMnhfUExDRSAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQQ001MTJ4X1JMQ0VfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X1BMQ0sgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUENNNTEyeF9QTENLX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciA3IC0gRFNQICovCisjZGVmaW5lIFBDTTUxMnhfU0RTTCAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQQ001MTJ4X1NEU0xfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X0RFTVAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUENNNTEyeF9ERU1QX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciAxMyAtIFBMTCByZWZlcmVuY2UgKi8KKyNkZWZpbmUgUENNNTEyeF9TUkVGICgxIDw8IDQpCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgMzcgLSBFcnJvciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUENNNTEyeF9JUExLICgxIDw8IDApCisjZGVmaW5lIFBDTTUxMnhfRENBUyAoMSA8PCAxKQorI2RlZmluZSBQQ001MTJ4X0lEQ00gKDEgPDwgMikKKyNkZWZpbmUgUENNNTEyeF9JRENIICgxIDw8IDMpCisjZGVmaW5lIFBDTTUxMnhfSURTSyAoMSA8PCA0KQorI2RlZmluZSBQQ001MTJ4X0lEQksgKDEgPDwgNSkKKyNkZWZpbmUgUENNNTEyeF9JREZTICgxIDw8IDYpCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNDIgLSBEQUMgcm91dGluZyAqLworI2RlZmluZSBQQ001MTJ4X0FVUFJfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X0FVUExfU0hJRlQgNAorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDU5IC0gYXV0byBtdXRlICovCisjZGVmaW5lIFBDTTUxMnhfQVRNUl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfQVRNTF9TSElGVCA0CisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNjMgLSByYW1wIHJhdGVzICovCisjZGVmaW5lIFBDTTUxMnhfVk5ERl9TSElGVCA2CisjZGVmaW5lIFBDTTUxMnhfVk5EU19TSElGVCA0CisjZGVmaW5lIFBDTTUxMnhfVk5VRl9TSElGVCAyCisjZGVmaW5lIFBDTTUxMnhfVk5VU19TSElGVCAwCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNjQgLSBlbWVyZ2VuY3kgcmFtcCByYXRlcyAqLworI2RlZmluZSBQQ001MTJ4X1ZFREZfU0hJRlQgNgorI2RlZmluZSBQQ001MTJ4X1ZFRFNfU0hJRlQgNAorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDY1IC0gRGlnaXRhbCBtdXRlIGVuYWJsZXMgKi8KKyNkZWZpbmUgUENNNTEyeF9BQ1RMX1NISUZUIDIKKyNkZWZpbmUgUENNNTEyeF9BTUxFX1NISUZUIDEKKyNkZWZpbmUgUENNNTEyeF9BTUxSX1NISUZUIDAKKworLyogUGFnZSAxLCBSZWdpc3RlciAyIC0gYW5hbG9nIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFBDTTUxMnhfUkFHTl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfTEFHTl9TSElGVCA0CisKKy8qIFBhZ2UgMSwgUmVnaXN0ZXIgNyAtIGFuYWxvZyBib29zdCBjb250cm9sICovCisjZGVmaW5lIFBDTTUxMnhfQUdCUl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfQUdCTF9TSElGVCA0CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY201MTJ4X3BtX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBwY201MTJ4X3JlZ21hcDsKKworaW50IHBjbTUxMnhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOwordm9pZCBwY201MTJ4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCmluZGV4IDkxMmM5Y2IuLmQ0YzIyOWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMjEwLDI2ICsyMTAsMjIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaW5wdXRfbW9kZVtdID0gewogCSJTaW5nbGUgZW5kZWQiLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbWljMV9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAotCVJUNTYzMV9NSUMxX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfbWljMV9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAorCQkJICAgIFJUNTYzMV9NSUMxX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9taWMyX21vZGVfZW51bSwgUlQ1NjMxX01JQ19DVFJMXzEsCi0JUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVCwgcnQ1NjMxX2lucHV0X21vZGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9taWMyX21vZGVfZW51bSwgUlQ1NjMxX01JQ19DVFJMXzEsCisJCQkgICAgUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVCwgcnQ1NjMxX2lucHV0X21vZGUpOwogCiAvKiBNT05PIElucHV0IFR5cGUgKi8KLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbW9ub2luX21vZGVfZW51bSwgUlQ1NjMxX01PTk9fSU5QVVRfVk9MLAotCVJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfbW9ub2luX21vZGVfZW51bSwgUlQ1NjMxX01PTk9fSU5QVVRfVk9MLAorCQkJICAgIFJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKIAogLyogU1BLIFJhdGlvIEdhaW4gQ29udHJvbCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGtfcmF0aW9bXSA9IHsiMS4wMHgiLCAiMS4wOXgiLCAiMS4yN3giLCAiMS40NHgiLAogCQkJIjEuNTZ4IiwgIjEuNjh4IiwgIjEuOTl4IiwgIjIuMzR4In07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfc3BrX3JhdGlvX2VudW0sIFJUNTYzMV9HRU5fUFVSX0NUUkxfUkVHLAotCVJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfU0hJRlQsIHJ0NTYzMV9zcGtfcmF0aW8pOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcGtfcmF0aW9fZW51bSwgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUcsCisJCQkgICAgUlQ1NjMxX1NQS19BTVBfUkFUSU9fQ1RSTF9TSElGVCwgcnQ1NjMxX3Nwa19yYXRpbyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogTUlDICovCkBAIC03NTksOSArNzU1LDggQEAKIC8qIExlZnQgU1BLIFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xsX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWEwifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcGt2b2xsX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKLQlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbGxfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfc3Brdm9sbF9lbnVtLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCQkgICAgUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9zcGt2b2xsX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Brdm9sbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTUEtWT0wgU1JDIiwgcnQ1NjMxX3Nwa3ZvbGxfZW51bSk7CkBAIC03NjksOSArNzY0LDggQEAKIC8qIExlZnQgSFAgVm9sdW1lIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwdm9sbF9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhMIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHB2b2xsX2VudW0sIFJUNTYzMV9IUF9PVVRfVk9MLAotCVJUNTYzMV9MX0VOX1NISUZULCBydDU2MzFfaHB2b2xsX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjMxX2hwdm9sbF9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwkJCSAgICBSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX2hwdm9sbF9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9sbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBIUFZPTCBTUkMiLCBydDU2MzFfaHB2b2xsX2VudW0pOwpAQCAtNzc5LDkgKzc3Myw4IEBACiAvKiBMZWZ0IE91dCBWb2x1bWUgSW5wdXQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfb3V0dm9sbF9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhMIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfb3V0dm9sbF9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKLQlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX291dHZvbGxfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfb3V0dm9sbF9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCSAgICBSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX291dHZvbGxfc2VsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXR2b2xsX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IE9VVFZPTCBTUkMiLCBydDU2MzFfb3V0dm9sbF9lbnVtKTsKQEAgLTc4OSw5ICs3ODIsOCBAQAogLyogUmlnaHQgT3V0IFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9vdXR2b2xyX3NlbFtdID0geyJWbWlkIiwgIk9VVE1JWFIifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9vdXR2b2xyX2VudW0sIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MLAotCVJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfb3V0dm9scl9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9vdXR2b2xyX2VudW0sIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MLAorCQkJICAgIFJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfb3V0dm9scl9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX291dHZvbHJfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IE9VVFZPTCBTUkMiLCBydDU2MzFfb3V0dm9scl9lbnVtKTsKQEAgLTc5OSw5ICs3OTEsOCBAQAogLyogUmlnaHQgSFAgVm9sdW1lIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwdm9scl9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhSIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHB2b2xyX2VudW0sIFJUNTYzMV9IUF9PVVRfVk9MLAotCVJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfaHB2b2xyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjMxX2hwdm9scl9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwkJCSAgICBSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX2hwdm9scl9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9scl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9scl9lbnVtKTsKQEAgLTgwOSw5ICs4MDAsOCBAQAogLyogUmlnaHQgU1BLIFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xyX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWFIifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcGt2b2xyX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKLQlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbHJfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfc3Brdm9scl9lbnVtLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCQkgICAgUlQ1NjMxX1JfRU5fU0hJRlQsIHJ0NTYzMV9zcGt2b2xyX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Brdm9scl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgU1BLVk9MIFNSQyIsIHJ0NTYzMV9zcGt2b2xyX2VudW0pOwpAQCAtODIwLDkgKzgxMCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb2xfc3JjX3NlbFtdID0gewogCSJTUE9MTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ0wifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcG9sX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX1NQS19MX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9sX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcG9sX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX1NQS19MX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9sX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb2xfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlNQT0wgU1JDIiwgcnQ1NjMxX3Nwb2xfc3JjX2VudW0pOwpAQCAtODMxLDkgKzgyMCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb3Jfc3JjX3NlbFtdID0gewogCSJTUE9STUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ1IifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb3JfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlNQT1IgU1JDIiwgcnQ1NjMxX3Nwb3Jfc3JjX2VudW0pOwpAQCAtODQxLDkgKzgyOSw4IEBACiAvKiBNT05PIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX21vbm9fc3JjX3NlbFtdID0geyJNT05PTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbW9ub19zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAotCVJUNTYzMV9NT05PX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9tb25vX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9tb25vX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX01PTk9fTVVYX1NFTF9TSElGVCwgcnQ1NjMxX21vbm9fc3JjX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfbW9ub19tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTU9OTyBTUkMiLCBydDU2MzFfbW9ub19zcmNfZW51bSk7CkBAIC04NTEsOSArODM4LDggQEAKIC8qIExlZnQgSFBPIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwbF9zcmNfc2VsW10gPSB7IkxlZnQgSFBWT0wiLCAiTGVmdCBEQUMifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9ocGxfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKLQlSVDU2MzFfSFBfTF9NVVhfU0VMX1NISUZULCBydDU2MzFfaHBsX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9ocGxfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKKwkJCSAgICBSVDU2MzFfSFBfTF9NVVhfU0VMX1NISUZULCBydDU2MzFfaHBsX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiSFBMIFNSQyIsIHJ0NTYzMV9ocGxfc3JjX2VudW0pOwpAQCAtODYxLDkgKzg0Nyw4IEBACiAvKiBSaWdodCBIUE8gSW5wdXQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaHByX3NyY19zZWxbXSA9IHsiUmlnaHQgSFBWT0wiLCAiUmlnaHQgREFDIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHByX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwcl9zcmNfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfaHByX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwcl9zcmNfc2VsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocHJfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBTUkMiLCBydDU2MzFfaHByX3NyY19lbnVtKTsKQEAgLTE1ODUsMTUgKzE1NzAsNiBAQAogewogCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJ0NTYzMS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAl2YWwgPSBydDU2MzFfcmVhZF9pbmRleChjb2RlYywgUlQ1NjMxX0FEREFfTUlYRVJfSU5UTF9SRUczKTsKIAlpZiAodmFsICYgMHgwMDAyKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMKaW5kZXggODg2OTI0OS4uMDA2MWFlNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jCkBAIC0zNjEsMjUgKzM2MSwyNCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NDBfZGF0YV9zZWxlY3RbXSA9IHsKIAkiTm9ybWFsIiwgImxlZnQgY29weSB0byByaWdodCIsICJyaWdodCBjb3B5IHRvIGxlZnQiLCAiU3dhcCJ9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMV9kYWNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKLQkJCQlSVDU2NDBfSUYxX0RBQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjFfZGFjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCisJCQkgICAgUlQ1NjQwX0lGMV9EQUNfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjFfYWRjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCi0JCQkJUlQ1NjQwX0lGMV9BRENfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfaWYxX2FkY19lbnVtLCBSVDU2NDBfRElHX0lORl9EQVRBLAorCQkJICAgIFJUNTY0MF9JRjFfQURDX1NFTF9TRlQsIHJ0NTY0MF9kYXRhX3NlbGVjdCk7CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfaWYyX2RhY19lbnVtLCBSVDU2NDBfRElHX0lORl9EQVRBLAotCQkJCVJUNTY0MF9JRjJfREFDX1NFTF9TRlQsIHJ0NTY0MF9kYXRhX3NlbGVjdCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMl9kYWNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKKwkJCSAgICBSVDU2NDBfSUYyX0RBQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMl9hZGNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKLQkJCQlSVDU2NDBfSUYyX0FEQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjJfYWRjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCisJCQkgICAgUlQ1NjQwX0lGMl9BRENfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKIAogLyogQ2xhc3MgRCBzcGVha2VyIGdhaW4gcmF0aW8gKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjQwX2Nsc2Rfc3BrX3JhdGlvW10gPSB7IjEuNjZ4IiwgIjEuODN4IiwgIjEuOTR4IiwKIAkiMngiLCAiMi4xMXgiLCAiMi4yMngiLCAiMi4zM3giLCAiMi40NHgiLCAiMi41NXgiLCAiMi42NngiLCAiMi43N3gifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9jbHNkX3Nwa19yYXRpb19lbnVtLCBSVDU2NDBfQ0xTX0RfT1VULAotCVJUNTY0MF9DTFNEX1JBVElPX1NGVCwgcnQ1NjQwX2Nsc2Rfc3BrX3JhdGlvKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfY2xzZF9zcGtfcmF0aW9fZW51bSwgUlQ1NjQwX0NMU19EX09VVCwKKwkJCSAgICBSVDU2NDBfQ0xTRF9SQVRJT19TRlQsIHJ0NTY0MF9jbHNkX3Nwa19yYXRpbyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogU3BlYWtlciBPdXRwdXQgVm9sdW1lICovCkBAIC03NTMsOSArNzUyLDggQEAKIAkiRElHIE1JWCIsICJBREMiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX3N0ZXJlb19hZGMxX2VudW0sIFJUNTY0MF9TVE9fQURDX01JWEVSLAotCVJUNTY0MF9BRENfMV9TUkNfU0ZULCBydDU2NDBfc3RlcmVvX2FkYzFfc3JjKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfc3RlcmVvX2FkYzFfZW51bSwgUlQ1NjQwX1NUT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX0FEQ18xX1NSQ19TRlQsIHJ0NTY0MF9zdGVyZW9fYWRjMV9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX3N0b19hZGNfMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlN0ZXJlbyBBREMxIE11eCIsIHJ0NTY0MF9zdGVyZW9fYWRjMV9lbnVtKTsKQEAgLTc2NCw5ICs3NjIsOCBAQAogCSJETUlDMSIsICJETUlDMiIsICJESUcgTUlYIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9zdGVyZW9fYWRjMl9lbnVtLCBSVDU2NDBfU1RPX0FEQ19NSVhFUiwKLQlSVDU2NDBfQURDXzJfU1JDX1NGVCwgcnQ1NjQwX3N0ZXJlb19hZGMyX3NyYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX3N0ZXJlb19hZGMyX2VudW0sIFJUNTY0MF9TVE9fQURDX01JWEVSLAorCQkJICAgIFJUNTY0MF9BRENfMl9TUkNfU0ZULCBydDU2NDBfc3RlcmVvX2FkYzJfc3JjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9zdG9fYWRjXzJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTdGVyZW8gQURDMiBNdXgiLCBydDU2NDBfc3RlcmVvX2FkYzJfZW51bSk7CkBAIC03NzYsOSArNzczLDggQEAKIAkiTW9ubyBEQUMgTUlYTCIsICJBRENMIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9tb25vX2FkY19sMV9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCi0JUlQ1NjQwX01PTk9fQURDX0wxX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMV9zcmMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9tb25vX2FkY19sMV9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX01PTk9fQURDX0wxX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMV9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX21vbm9fYWRjX2wxX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTW9ubyBBREMxIGxlZnQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX2wxX2VudW0pOwpAQCAtNzg3LDkgKzc4Myw4IEBACiAJIkRNSUMgTDEiLCAiRE1JQyBMMiIsICJNb25vIERBQyBNSVhMIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9tb25vX2FkY19sMl9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCi0JUlQ1NjQwX01PTk9fQURDX0wyX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMl9zcmMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9tb25vX2FkY19sMl9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX01PTk9fQURDX0wyX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMl9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX21vbm9fYWRjX2wyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTW9ubyBBREMyIGxlZnQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX2wyX2VudW0pOwpAQCAtNzk4LDkgKzc5Myw4IEBACiAJIk1vbm8gREFDIE1JWFIiLCAiQURDUiIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfbW9ub19hZGNfcjFfZW51bSwgUlQ1NjQwX01PTk9fQURDX01JWEVSLAotCVJUNTY0MF9NT05PX0FEQ19SMV9TUkNfU0ZULCBydDU2NDBfbW9ub19hZGNfcjFfc3JjKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfbW9ub19hZGNfcjFfZW51bSwgUlQ1NjQwX01PTk9fQURDX01JWEVSLAorCQkJICAgIFJUNTY0MF9NT05PX0FEQ19SMV9TUkNfU0ZULCBydDU2NDBfbW9ub19hZGNfcjFfc3JjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9tb25vX2FkY19yMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIk1vbm8gQURDMSByaWdodCBzb3VyY2UiLCBydDU2NDBfbW9ub19hZGNfcjFfZW51bSk7CkBAIC04MDksOSArODAzLDggQEAKIAkiRE1JQyBSMSIsICJETUlDIFIyIiwgIk1vbm8gREFDIE1JWFIiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX21vbm9fYWRjX3IyX2VudW0sIFJUNTY0MF9NT05PX0FEQ19NSVhFUiwKLQlSVDU2NDBfTU9OT19BRENfUjJfU1JDX1NGVCwgcnQ1NjQwX21vbm9fYWRjX3IyX3NyYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX21vbm9fYWRjX3IyX2VudW0sIFJUNTY0MF9NT05PX0FEQ19NSVhFUiwKKwkJCSAgICBSVDU2NDBfTU9OT19BRENfUjJfU1JDX1NGVCwgcnQ1NjQwX21vbm9fYWRjX3IyX3NyYyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfbW9ub19hZGNfcjJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNb25vIEFEQzIgcmlnaHQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX3IyX2VudW0pOwpAQCAtODI2LDkgKzgxOSw5IEBACiAJMywKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfZGFjX2wyX2VudW0sIFJUNTY0MF9EU1BfUEFUSDIsIFJUNTY0MF9EQUNfTDJfU0VMX1NGVCwKLQkweDMsIHJ0NTY0MF9kYWNfbDJfc3JjLCBydDU2NDBfZGFjX2wyX3ZhbHVlcyk7CitzdGF0aWMgU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2RhY19sMl9lbnVtLAorCQkJCSAgUlQ1NjQwX0RTUF9QQVRIMiwgUlQ1NjQwX0RBQ19MMl9TRUxfU0ZULAorCQkJCSAgMHgzLCBydDU2NDBfZGFjX2wyX3NyYywgcnQ1NjQwX2RhY19sMl92YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX2RhY19sMl9tdXggPQogCVNPQ19EQVBNX1ZBTFVFX0VOVU0oIkRBQzIgbGVmdCBjaGFubmVsIHNvdXJjZSIsIHJ0NTY0MF9kYWNfbDJfZW51bSk7CkBAIC04NDEsOSArODM0LDkgQEAKIAkwLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19WQUxVRV9FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9kYWNfcjJfZW51bSwgUlQ1NjQwX0RTUF9QQVRIMiwgUlQ1NjQwX0RBQ19SMl9TRUxfU0ZULAotCTB4MywgcnQ1NjQwX2RhY19yMl9zcmMsIHJ0NTY0MF9kYWNfcjJfdmFsdWVzKTsKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfZGFjX3IyX2VudW0sCisJCQkJICBSVDU2NDBfRFNQX1BBVEgyLCBSVDU2NDBfREFDX1IyX1NFTF9TRlQsCisJCQkJICAweDMsIHJ0NTY0MF9kYWNfcjJfc3JjLCBydDU2NDBfZGFjX3IyX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfZGFjX3IyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDMiByaWdodCBjaGFubmVsIHNvdXJjZSIsIHJ0NTY0MF9kYWNfcjJfZW51bSk7CkBAIC04NjAsOSArODUzLDEwIEBACiAJNywKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfZGFpX2lpc19tYXBfZW51bSwgUlQ1NjQwX0kyUzFfU0RQLCBSVDU2NDBfSTJTX0lGX1NGVCwKLQkweDcsIHJ0NTY0MF9kYWlfaWlzX21hcCwgcnQ1NjQwX2RhaV9paXNfbWFwX3ZhbHVlcyk7CitzdGF0aWMgU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2RhaV9paXNfbWFwX2VudW0sCisJCQkJICBSVDU2NDBfSTJTMV9TRFAsIFJUNTY0MF9JMlNfSUZfU0ZULAorCQkJCSAgMHg3LCBydDU2NDBfZGFpX2lpc19tYXAsCisJCQkJICBydDU2NDBfZGFpX2lpc19tYXBfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9kYWlfbXV4ID0KIAlTT0NfREFQTV9WQUxVRV9FTlVNKCJEQUkgc2VsZWN0IiwgcnQ1NjQwX2RhaV9paXNfbWFwX2VudW0pOwpAQCAtODcyLDkgKzg2Niw4IEBACiAJIklGMSIsICJJRjIiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX3NkaV9zZWxfZW51bSwgUlQ1NjQwX0kyUzJfU0RQLAotCVJUNTY0MF9JMlMyX1NESV9TRlQsIHJ0NTY0MF9zZGlfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfc2RpX3NlbF9lbnVtLCBSVDU2NDBfSTJTMl9TRFAsCisJCQkgICAgUlQ1NjQwX0kyUzJfU0RJX1NGVCwgcnQ1NjQwX3NkaV9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX3NkaV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNESSBzZWxlY3QiLCBydDU2NDBfc2RpX3NlbF9lbnVtKTsKQEAgLTE2MDEsOCArMTU5NCw3IEBACiBzdGF0aWMgaW50IHJ0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHJ0NTY0MF9wcml2ICpydDU2NDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1bnNpZ25lZCBpbnQgdmFsX2xlbiA9IDAsIHZhbF9jbGssIG1hc2tfY2xrOwogCWludCBkYWlfc2VsLCBwcmVfZGl2LCBiY2xrX21zLCBmcmFtZV9zaXplOwpAQCAtMTk0MywxNiArMTkzNSw4IEBACiBzdGF0aWMgaW50IHJ0NTY0MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHJ0NTY0MF9wcml2ICpydDU2NDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwogCiAJcnQ1NjQwLT5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBydDU2NDAtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAJcnQ1NjQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCAwZmNiZTkwLi5kM2VkMWJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC0xODcsOCArMTg3LDkgQEAKIAkiTUlDX0lOIiwgIkxJTkVfSU4iCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCAyLCAyLCBhZGNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19lbnVtLAorCQkJICAgIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDIsCisJCQkgICAgYWRjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY19tdXggPQogU09DX0RBUE1fRU5VTSgiQ2FwdHVyZSBNdXgiLCBhZGNfZW51bSk7CkBAIC0xOTgsOCArMTk5LDkgQEAKIAkiREFDIiwgIkxJTkVfSU4iCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCA2LCAyLCBkYWNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19lbnVtLAorCQkJICAgIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDYsCisJCQkgICAgZGFjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY19tdXggPQogU09DX0RBUE1fRU5VTSgiSGVhZHBob25lIE11eCIsIGRhY19lbnVtKTsKQEAgLTEzNTAsMTQgKzEzNTIsNiBAQAogCWludCByZXQ7CiAJc3RydWN0IHNndGw1MDAwX3ByaXYgKnNndGw1MDAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQkvKiBzZXR1cCBpMmMgZGF0YSBvcHMgKi8KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc2d0bDUwMDAtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHNndGw1MDAwX2VuYWJsZV9yZWd1bGF0b3JzKGNvZGVjKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMKaW5kZXggZmEyYjhlMC4uMjQ0YzA5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTIwOSw4ICsyMTAsOSBAQAogCiBzdGF0aWMgaW50IHNpNDc2eF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYtPnBhcmVudCwgTlVMTCk7Ci0JcmV0dXJuIHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldi0+cGFyZW50LCBOVUxMKTsKKworCXJldHVybiBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcmVnbWFwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2k0NzZ4X2RhaV9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTdjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIFNpUkYgYXVkaW8gY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorCisjaW5jbHVkZSAic2lyZi1hdWRpby1jb2RlYy5oIgorCitzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyB7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwl1MzIgcmVnX2N0cmwwLCByZWdfY3RybDE7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlucHV0X21vZGVfbXV4W10gPSB7IlNpbmdsZS1lbmRlZCIsCisJIkRpZmZlcmVudGlhbCJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlucHV0X21vZGVfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShBVURJT19JQ19DT0RFQ19DVFJMMSwgNCwgMiwgaW5wdXRfbW9kZV9tdXgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2lyZl9hdWRpb19jb2RlY19pbnB1dF9tb2RlX2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgaW5wdXRfbW9kZV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwbGF5YmFja192b2xfdGx2LCAtMTI0MDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoY2FwdHVyZV92b2xfdGx2X3ByaW1hMiwgNTAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1JBTkdFKGNhcHR1cmVfdm9sX3Rsdl9hdGxhczYsCisJMCwgNywgVExWX0RCX1NDQUxFX0lURU0oLTEwMCwgMTAwLCAwKSwKKwkweDIyLCAweDNGLCBUTFZfREJfU0NBTEVfSVRFTSg3MDAsIDEwMCwgMCksCispOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm9sdW1lX2NvbnRyb2xzX2F0bGFzNltdID0geworCVNPQ19ET1VCTEVfVExWKCJQbGF5YmFjayBWb2x1bWUiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMjEsIDE0LAorCQkJMHg3RiwgMCwgcGxheWJhY2tfdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDE2LCAxMCwKKwkJCTB4M0YsIDAsIGNhcHR1cmVfdm9sX3Rsdl9hdGxhczYpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZvbHVtZV9jb250cm9sc19wcmltYTJbXSA9IHsKKwlTT0NfRE9VQkxFX1RMVigiU3BlYWtlciBWb2x1bWUiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMjEsIDE0LAorCQkJMHg3RiwgMCwgcGxheWJhY2tfdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDE1LCAxMCwKKwkJCTB4MUYsIDAsIGNhcHR1cmVfdm9sX3Rsdl9wcmltYTIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfcGF0aF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBMZWZ0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA2LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCAzLCAxLCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9pbnB1dF9wYXRoX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIFJpZ2h0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA1LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBSaWdodCBTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMSwgMiwgMSwgMCksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDksIDEsIDApOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA4LCAxLCAwKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpZ2h0X2RhY190b19ocF9sZWZ0X2FtcF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgNywgMSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA2LCAxLCAwKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTEsIDEsIDApOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTAsIDEsIDApOworCisvKiBBZnRlciBlbmFibGUgYWRjLCBEZWxheSAyMDBtcyB0byBhdm9pZCBwb3Agbm9pc2UgKi8KK3N0YXRpYyBpbnQgYWRjX2VuYWJsZV9kZWxheV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCW1zbGVlcCgyMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2FuZF9yZXNldF9jb2RlYyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCXUzMiBjb2RlY19lbmFibGVfYml0cywgdTMyIGNvZGVjX3Jlc2V0X2JpdHMpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQljb2RlY19lbmFibGVfYml0cyB8IGNvZGVjX3Jlc2V0X2JpdHMsCisJCQljb2RlY19lbmFibGVfYml0cyB8IH5jb2RlY19yZXNldF9iaXRzKTsKKwltc2xlZXAoMjApOworCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIEFVRElPX0lDX0NPREVDX0NUUkwxLAorCQkJY29kZWNfcmVzZXRfYml0cywgY29kZWNfcmVzZXRfYml0cyk7Cit9CisKK3N0YXRpYyBpbnQgYXRsYXM2X2NvZGVjX2VuYWJsZV9hbmRfcmVzZXRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisjZGVmaW5lIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUyAoMSA8PCAyOSkKKyNkZWZpbmUgQVRMQVM2X0NPREVDX1JFU0VUX0JJVFMgKDEgPDwgMjgpCisJc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEody0+Y29kZWMtPmRldik7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVRMQVM2X0NPREVDX0VOQUJMRV9CSVRTLCBBVExBUzZfQ09ERUNfUkVTRVRfQklUUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDEsIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUywKKwkJCX5BVExBUzZfQ09ERUNfRU5BQkxFX0JJVFMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmltYTJfY29kZWNfZW5hYmxlX2FuZF9yZXNldF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKyNkZWZpbmUgUFJJTUEyX0NPREVDX0VOQUJMRV9CSVRTICgxIDw8IDI3KQorI2RlZmluZSBQUklNQTJfQ09ERUNfUkVTRVRfQklUUyAoMSA8PCAyNikKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YSh3LT5jb2RlYy0+ZGV2KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJUFJJTUEyX0NPREVDX0VOQUJMRV9CSVRTLCBQUklNQTJfQ09ERUNfUkVTRVRfQklUUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDEsIFBSSU1BMl9DT0RFQ19FTkFCTEVfQklUUywKKwkJCX5QUklNQTJfQ09ERUNfRU5BQkxFX0JJVFMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGF0bGFzNl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRfRFJWKCJIUCBMZWZ0IERyaXZlciIsIEFVRElPX0lDX0NPREVDX0NUUkwxLAorCQkJMjUsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9PVVRfRFJWKCJIUCBSaWdodCBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTI2LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiU3BlYWtlciBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTI3LCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwcmltYTJfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgTGVmdCBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTIzLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgUmlnaHQgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQkyNCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIlNwZWFrZXIgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQkyNSwgMCwgTlVMTCwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0ID0KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCWF0bGFzNl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcHJpbWEyX2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0ID0KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXByaW1hMl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgbGVmdCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwwLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgcmlnaHQiLCBOVUxMLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gaHAgbGVmdCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmbGVmdF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkxlZnQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZsZWZ0X2RhY190b19ocF9yaWdodF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCBsZWZ0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZyaWdodF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcmlnaHRfZGFjX3RvX2hwX3JpZ2h0X2FtcF9zd2l0Y2hfY29udHJvbCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCBsZWZ0IGRyaXZlciIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCAzLCAwLAorCQkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCByaWdodCBkcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMywgMCwKKwkJCU5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJmxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZyaWdodF9kYWNfdG9fc3BlYWtlcl9saW5lb3V0X3N3aXRjaF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiU3BlYWtlciBhbXAgZHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDQsIDAsCisJCQlOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVCIpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREMgbGVmdCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA4LCAwLAorCQkJYWRjX2VuYWJsZV9kZWxheV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyByaWdodCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA3LCAwLAorCQkJYWRjX2VuYWJsZV9kZWxheV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxlZnQgUEdBIG1peGVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDEsIDAsCisJCSZsZWZ0X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUobGVmdF9pbnB1dF9wYXRoX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSaWdodCBQR0EgbWl4ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwgMCwgMCwKKwkJJnJpZ2h0X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUocmlnaHRfaW5wdXRfcGF0aF9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01VWCgiTWljIGlucHV0IG1vZGUgbXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnNpcmZfYXVkaW9fY29kZWNfaW5wdXRfbW9kZV9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBBVURJT19JQ19DT0RFQ19QV1IsIDMsIDApLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNJTjIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVJTjEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVJTjIiKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkhTTCBQaGFzZSBPcHBvc2l0ZSIsIEFVRElPX0lDX0NPREVDX0NUUkwwLAorCQkJMzAsIDAsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgc2lyZl9hdWRpb19jb2RlY19tYXBbXSA9IHsKKwl7IlNQS09VVCIsIE5VTEwsICJTcGVha2VyIERyaXZlciJ9LAorCXsiU3BlYWtlciBEcml2ZXIiLCBOVUxMLCAiU3BlYWtlciBhbXAgZHJpdmVyIn0sCisJeyJTcGVha2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0In0sCisJeyJTcGVha2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCJ9LAorCXsiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0IiwgIlN3aXRjaCIsICJEQUMgbGVmdCJ9LAorCXsiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJIUE9VVEwiLCBOVUxMLCAiSFAgTGVmdCBEcml2ZXIifSwKKwl7IkhQT1VUUiIsIE5VTEwsICJIUCBSaWdodCBEcml2ZXIifSwKKwl7IkhQIExlZnQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCBsZWZ0IGRyaXZlciJ9LAorCXsiSFAgUmlnaHQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCByaWdodCBkcml2ZXIifSwKKwl7IkhQIGFtcCBsZWZ0IGRyaXZlciIsIE5VTEwsICJSaWdodCBkYWMgdG8gaHAgbGVmdCBhbXAifSwKKwl7IkhQIGFtcCByaWdodCBkcml2ZXIiLCBOVUxMICwgIlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAifSwKKwl7IkhQIGFtcCBsZWZ0IGRyaXZlciIsIE5VTEwsICJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCJ9LAorCXsiSFAgYW1wIHJpZ2h0IGRyaXZlciIsIE5VTEwgLCAiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCJ9LAorCXsiUmlnaHQgZGFjIHRvIGhwIGxlZnQgYW1wIiwgIlN3aXRjaCIsICJEQUMgbGVmdCJ9LAorCXsiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCIsICJTd2l0Y2giLCAiREFDIGxlZnQifSwKKwl7IkxlZnQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJjb2RlY2NsayJ9LAorCXsiREFDIHJpZ2h0IiwgTlVMTCwgImNvZGVjY2xrIn0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJQbGF5YmFjayJ9LAorCXsiREFDIHJpZ2h0IiwgTlVMTCwgIlBsYXliYWNrIn0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJIU0wgUGhhc2UgT3Bwb3NpdGUifSwKKwl7IkRBQyByaWdodCIsIE5VTEwsICJIU0wgUGhhc2UgT3Bwb3NpdGUifSwKKworCXsiQ2FwdHVyZSIsIE5VTEwsICJBREMgbGVmdCJ9LAorCXsiQ2FwdHVyZSIsIE5VTEwsICJBREMgcmlnaHQifSwKKwl7IkFEQyBsZWZ0IiwgTlVMTCwgImNvZGVjY2xrIn0sCisJeyJBREMgcmlnaHQiLCBOVUxMLCAiY29kZWNjbGsifSwKKwl7IkFEQyBsZWZ0IiwgTlVMTCwgIkxlZnQgUEdBIG1peGVyIn0sCisJeyJBREMgcmlnaHQiLCBOVUxMLCAiUmlnaHQgUEdBIG1peGVyIn0sCisJeyJMZWZ0IFBHQSBtaXhlciIsICJMaW5lIExlZnQgU3dpdGNoIiwgIkxJTkVJTjIifSwKKwl7IlJpZ2h0IFBHQSBtaXhlciIsICJMaW5lIFJpZ2h0IFN3aXRjaCIsICJMSU5FSU4xIn0sCisJeyJMZWZ0IFBHQSBtaXhlciIsICJNaWMgTGVmdCBTd2l0Y2giLCAiTUlDSU4yIn0sCisJeyJSaWdodCBQR0EgbWl4ZXIiLCAiTWljIFJpZ2h0IFN3aXRjaCIsICJNaWMgaW5wdXQgbW9kZSBtdXgifSwKKwl7Ik1pYyBpbnB1dCBtb2RlIG11eCIsICJTaW5nbGUtZW5kZWQiLCAiTUlDSU4xIn0sCisJeyJNaWMgaW5wdXQgbW9kZSBtdXgiLCAiRGlmZmVyZW50aWFsIiwgIk1JQ0lOMSJ9LAorfTsKKworc3RhdGljIGludCBzaXJmX2F1ZGlvX2NvZGVjX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCWludCBjbWQsCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCBwbGF5YmFjayA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MzIgdmFsID0gMDsKKworCS8qCisJICogVGhpcyBpcyBhIHdvcmthcm91bmQsIFdoZW4gc3RvcCBwbGF5YmFjaywKKwkgKiBuZWVkIGRpc2FibGUgSFAgYW1wLCBhdm9pZCB0aGUgY3VycmVudCBub2lzZS4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJaWYgKHBsYXliYWNrKQorCQkJdmFsID0gSUNfSFNMRU4gfCBJQ19IU1JFTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBsYXliYWNrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKKwkJCUlDX0hTTEVOIHwgSUNfSFNSRU4sIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2lyZl9hdWRpb19jb2RlY19kYWlfb3BzID0geworCS50cmlnZ2VyID0gc2lyZl9hdWRpb19jb2RlY190cmlnZ2VyLAorfTsKKworc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaXJmX2F1ZGlvX2NvZGVjX2RhaSA9IHsKKwkubmFtZSA9ICJzaXJmLWF1ZGlvLWNvZGVjIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLm9wcyA9ICZzaXJmX2F1ZGlvX2NvZGVjX2RhaV9vcHMsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGNvZGVjLT5kZXYpOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvZGVjLT5kZXYtPm9mX25vZGUsICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIpKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCXByaW1hMl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUocHJpbWEyX291dHB1dF9kcml2ZXJfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCSZwcmltYTJfY29kZWNfY2xvY2tfZGFwbV93aWRnZXQsIDEpOworCQlyZXR1cm4gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsCisJCQl2b2x1bWVfY29udHJvbHNfcHJpbWEyLAorCQkJQVJSQVlfU0laRSh2b2x1bWVfY29udHJvbHNfcHJpbWEyKSk7CisJfQorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb2RlYy0+ZGV2LT5vZl9ub2RlLCAic2lyZixhdGxhczYtYXVkaW8tY29kZWMiKSkgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQlhdGxhczZfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKGF0bGFzNl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQkmYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0LCAxKTsKKwkJcmV0dXJuIHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLAorCQkJdm9sdW1lX2NvbnRyb2xzX2F0bGFzNiwKKwkJCUFSUkFZX1NJWkUodm9sdW1lX2NvbnRyb2xzX2F0bGFzNikpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlwbV9ydW50aW1lX2Rpc2FibGUoY29kZWMtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9zaXJmX2F1ZGlvX2NvZGVjID0geworCS5wcm9iZSA9IHNpcmZfYXVkaW9fY29kZWNfcHJvYmUsCisJLnJlbW92ZSA9IHNpcmZfYXVkaW9fY29kZWNfcmVtb3ZlLAorCS5kYXBtX3dpZGdldHMgPSBzaXJmX2F1ZGlvX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHNpcmZfYXVkaW9fY29kZWNfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNpcmZfYXVkaW9fY29kZWNfbWFwKSwKKwkuaWRsZV9iaWFzX29mZiA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2lyZl9hdWRpb19jb2RlY19vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzaXJmX2F1ZGlvX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCS5tYXhfcmVnaXN0ZXIgPSBBVURJT19JQ19DT0RFQ19DVFJMMywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlc291cmNlICptZW1fcmVzOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNpcmZfYXVkaW9fY29kZWNfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKworCXNpcmZfYXVkaW9fY29kZWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaXJmX2F1ZGlvX2NvZGVjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNpcmZfYXVkaW9fY29kZWMpOworCisJbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW1fcmVzKTsKKwlpZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pbygmcGRldi0+ZGV2LCBiYXNlLAorCQkJCQkgICAgJnNpcmZfYXVkaW9fY29kZWNfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXApOworCisJc2lyZl9hdWRpb19jb2RlYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHZXQgY2xvY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiBQVFJfRVJSKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFbmFibGUgY2xvY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmKHBkZXYtPmRldiksCisJCQkmc29jX2NvZGVjX2RldmljZV9zaXJmX2F1ZGlvX2NvZGVjLAorCQkJJnNpcmZfYXVkaW9fY29kZWNfZGFpLCAxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlZ2lzdGVyIEF1ZGlvIENvZGVjIGRhaSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfY2xrX3B1dDsKKwl9CisKKwkvKgorCSAqIEFsd2F5cyBvcGVuIGNoYXJnZSBwdW1wLCBpZiBub3QsIHdoZW4gdGhlIGNoYXJnZSBwdW1wIGNsb3NlZCB0aGUKKwkgKiBhZGMgd2lsbCBub3Qgc3RhYmxlCisJICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCisJCUlDX0NQRlJFUSwgSUNfQ1BGUkVRKTsKKworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIikpCisJCXJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsCisJCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDAsIElDX0NQRU4sIElDX0NQRU4pOworCXJldHVybiAwOworCitlcnJfY2xrX3B1dDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJihwZGV2LT5kZXYpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJlZ21hcF9yZWFkKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCisJCSZzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDApOworCXJlZ21hcF9yZWFkKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCSZzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDEpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19jb2RlY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKKwkJc2lyZl9hdWRpb19jb2RlYy0+cmVnX2N0cmwwKTsKKwlyZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJc2lyZl9hdWRpb19jb2RlYy0+cmVnX2N0cmwxKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzaXJmX2F1ZGlvX2NvZGVjX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzaXJmX2F1ZGlvX2NvZGVjX3N1c3BlbmQsIHNpcmZfYXVkaW9fY29kZWNfcmVzdW1lKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZl9hdWRpb19jb2RlY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1jb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoLAorCQkucG0gPSAmc2lyZl9hdWRpb19jb2RlY19wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gc2lyZl9hdWRpb19jb2RlY19kcml2ZXJfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lSRiBhdWRpbyBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ2p1bi5ZaW5nQGNzci5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzE4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogU2lSRiBpbm5lciBjb2RlYyBjb250cm9sbGVycyBkZWZpbmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfU0lSRl9BVURJT19DT0RFQ19ICisjZGVmaW5lIF9TSVJGX0FVRElPX0NPREVDX0gKKworCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX1BXUgkJCSgweDAwRTApCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX0NUUkwwCQkJKDB4MDBFNCkKKyNkZWZpbmUgQVVESU9fSUNfQ09ERUNfQ1RSTDEJCQkoMHgwMEU4KQorI2RlZmluZSBBVURJT19JQ19DT0RFQ19DVFJMMgkJCSgweDAwRUMpCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX0NUUkwzCQkJKDB4MDBGMCkKKworI2RlZmluZSBNSUNCSUFTRU4JCSgxIDw8IDMpCisKKyNkZWZpbmUgSUNfUkRBQ0VOCQkoMSA8PCAwKQorI2RlZmluZSBJQ19MREFDRU4JCSgxIDw8IDEpCisjZGVmaW5lIElDX0hTUkVOCQkoMSA8PCAyKQorI2RlZmluZSBJQ19IU0xFTgkJKDEgPDwgMykKKyNkZWZpbmUgSUNfU1BFTgkJCSgxIDw8IDQpCisjZGVmaW5lIElDX0NQRU4JCQkoMSA8PCA1KQorCisjZGVmaW5lIElDX0hQUlNFTFIJCSgxIDw8IDYpCisjZGVmaW5lIElDX0hQTFNFTFIJCSgxIDw8IDcpCisjZGVmaW5lIElDX0hQUlNFTEwJCSgxIDw8IDgpCisjZGVmaW5lIElDX0hQTFNFTEwJCSgxIDw8IDkpCisjZGVmaW5lIElDX1NQU0VMUgkJKDEgPDwgMTApCisjZGVmaW5lIElDX1NQU0VMTAkJKDEgPDwgMTEpCisKKyNkZWZpbmUgSUNfTU9OT1IJCSgxIDw8IDEyKQorI2RlZmluZSBJQ19NT05PTAkJKDEgPDwgMTMpCisKKyNkZWZpbmUgSUNfUlhPU1JTRUwJCSgxIDw8IDI4KQorI2RlZmluZSBJQ19DUEZSRVEJCSgxIDw8IDI5KQorI2RlZmluZSBJQ19IU0lOVkVOCQkoMSA8PCAzMCkKKworI2RlZmluZSBJQ19NSUNJTlJFTgkJKDEgPDwgMCkKKyNkZWZpbmUgSUNfTUlDSU5MRU4JCSgxIDw8IDEpCisjZGVmaW5lIElDX01JQ0lOMVNFTAkJKDEgPDwgMikKKyNkZWZpbmUgSUNfTUlDSU4yU0VMCQkoMSA8PCAzKQorI2RlZmluZSBJQ19NSUNESUZTRUwJCSgxIDw8IDQpCisjZGVmaW5lCUlDX0xJTkVJTjFTRUwJCSgxIDw8IDUpCisjZGVmaW5lCUlDX0xJTkVJTjJTRUwJCSgxIDw8IDYpCisjZGVmaW5lCUlDX1JBRENFTgkJKDEgPDwgNykKKyNkZWZpbmUJSUNfTEFEQ0VOCQkoMSA8PCA4KQorI2RlZmluZQlJQ19BTE0JCQkoMSA8PCA5KQorCisjZGVmaW5lIElDX0RJR01JQ0VOICAgICAgICAgICAgICgxIDw8IDIyKQorI2RlZmluZSBJQ19ESUdNSUNGUkVRICAgICAgICAgICAoMSA8PCAyMykKKyNkZWZpbmUgSUNfQURDMTRCXzEyICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lIElDX0ZJUkRBQ19IU0xfRU4gICAgICAgICgxIDw8IDI1KQorI2RlZmluZSBJQ19GSVJEQUNfSFNSX0VOICAgICAgICAoMSA8PCAyNikKKyNkZWZpbmUgSUNfRklSREFDX0xPVVRfRU4gICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIElDX1BPUiAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQorI2RlZmluZSBJQ19DT0RFQ19DTEtfRU4gICAgICAgICAoMSA8PCAyOSkKKyNkZWZpbmUgSUNfSFBfM0RCX0JPT1NUICAgICAgICAgKDEgPDwgMzApCisKKyNkZWZpbmUgSUNfQURDX0xFRlRfR0FJTl9TSElGVAkxNgorI2RlZmluZSBJQ19BRENfUklHSFRfR0FJTl9TSElGVCAxMAorI2RlZmluZSBJQ19BRENfR0FJTl9NQVNLCTB4M0YKKyNkZWZpbmUgSUNfTUlDX01BWF9HQUlOCQkweDM5CisKKyNkZWZpbmUgSUNfUlhQR0FSX01BU0sJCTB4M0YKKyNkZWZpbmUgSUNfUlhQR0FSX1NISUZUCQkxNAorI2RlZmluZSBJQ19SWFBHQUxfTUFTSwkJMHgzRgorI2RlZmluZSBJQ19SWFBHQUxfU0hJRlQJCTIxCisjZGVmaW5lIElDX1JYUEdBUgkJMHg3QgorI2RlZmluZSBJQ19SWFBHQUwJCTB4N0IKKworI2VuZGlmIC8qX19TSVJGX0FVRElPX0NPREVDX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwppbmRleCAxMzA0NWYyLi40MmRmZjI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwpAQCAtMzEyLDE0ICszMTIsMTQgQEAKIC8qIG11eCBjb250cm9scyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnNuOTUwMzFfbWljX3RleHRzW10gPSB7ICJBTUlDIiwgIkxpbmVJbiIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbjk1MDMxX21pY2xfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfQURDQ09ORklHLCAxLCAyLCBzbjk1MDMxX21pY190ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc245NTAzMV9taWNsX2VudW0sCisJCQkgICAgU045NTAzMV9BRENDT05GSUcsIDEsIHNuOTUwMzFfbWljX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfbWljbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBzbjk1MDMxX21pY2xfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9taWNyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FEQ0NPTkZJRywgMywgMiwgc245NTAzMV9taWNfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfbWljcl9lbnVtLAorCQkJICAgIFNOOTUwMzFfQURDQ09ORklHLCAzLCBzbjk1MDMxX21pY190ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbjk1MDMxX21pY3JfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgc245NTAzMV9taWNyX2VudW0pOwpAQCAtMzI4LDI2ICszMjgsMjYgQEAKIAkJCQkJCSJETUlDNCIsICJETUlDNSIsICJETUlDNiIsCiAJCQkJCQkiQURDIExlZnQiLCAiQURDIFJpZ2h0IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMTIsIDAsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQxX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDEyLCAwLCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQxX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQxX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMTIsIDQsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQyX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDEyLCA0LCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQyX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQyX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMzQsIDAsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQzX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDM0LCAwLCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQzX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQzX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQ0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMzQsIDQsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQ0X2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDM0LCA0LCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQ0X211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQ0X2VudW0pOwpAQCAtMzU5LDE5ICszNTksMTkgQEAKIC8qIDBkQiB0byAzMGRCIGluIDEwZEIgc3RlcHMgKi8KIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfdGx2LCAwLCAxMCwgMCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9taWNtb2RlMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU045NTAzMV9NSUNBTVAxLCAxLCAyLCBzbjk1MDMxX21pY21vZGVfdGV4dCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfbWljbW9kZTJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfTUlDQU1QMiwgMSwgMiwgc245NTAzMV9taWNtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfbWljbW9kZTFfZW51bSwKKwkJCSAgICBTTjk1MDMxX01JQ0FNUDEsIDEsIHNuOTUwMzFfbWljbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzbjk1MDMxX21pY21vZGUyX2VudW0sCisJCQkgICAgU045NTAzMV9NSUNBTVAyLCAxLCBzbjk1MDMxX21pY21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbjk1MDMxX2RtaWNfY2ZnX3RleHRbXSA9IHsiR1BPIiwgIkRNSUMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbjk1MDMxX2RtaWMxMl9jZmdfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfRE1JQ01VWCwgMCwgMiwgc245NTAzMV9kbWljX2NmZ190ZXh0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9kbWljMzRfY2ZnX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0RNSUNNVVgsIDEsIDIsIHNuOTUwMzFfZG1pY19jZmdfdGV4dCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfZG1pYzU2X2NmZ19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU045NTAzMV9ETUlDTVVYLCAyLCAyLCBzbjk1MDMxX2RtaWNfY2ZnX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfZG1pYzEyX2NmZ19lbnVtLAorCQkJICAgIFNOOTUwMzFfRE1JQ01VWCwgMCwgc245NTAzMV9kbWljX2NmZ190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzbjk1MDMxX2RtaWMzNF9jZmdfZW51bSwKKwkJCSAgICBTTjk1MDMxX0RNSUNNVVgsIDEsIHNuOTUwMzFfZG1pY19jZmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc245NTAzMV9kbWljNTZfY2ZnX2VudW0sCisJCQkgICAgU045NTAzMV9ETUlDTVVYLCAyLCBzbjk1MDMxX2RtaWNfY2ZnX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc245NTAzMV9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfRU5VTSgiTWljMU1vZGUgQ2FwdHVyZSBSb3V0ZSIsIHNuOTUwMzFfbWljbW9kZTFfZW51bSksCkBAIC04MjUsOCArODI1LDYgQEAKIHsKIAlwcl9kZWJ1ZygiY29kZWNfcHJvYmUgY2FsbGVkXG4iKTsKIAotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0KIAkvKiBQQ00gaW50ZXJmYWNlIGNvbmZpZwogCSAqIFRoaXMgc2V0cyB0aGUgcGNtIHJ4IHNsb3QgY29uZ3VyYXRpb24gdG8gbWF4IDYgc2xvdHMKIAkgKiBmb3IgbWF4IDQgZGFpcyAoMiBzdGVyZW8gYW5kIDIgbW9ubykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKaW5kZXggY2M4ZGViYy4uNTZhZGIzZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKQEAgLTE2OSwxOSArMTY5LDE5IEBACiAJIjY4Mi4yNCBtcyIsICIxMzY0IG1zIiwKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9hdHRhY2tfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ18yLCA0LCBzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9yZWxlYXNlX3RpbWVfZW51bSwKIAlTU00yNTE4X1JFR19EUkNfMiwgMCwgc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9yZWxlYXNlX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfYXR0YWNrX3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19hdHRhY2tfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ182LCA0LCBzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2RlY2F5X3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19kZWNheV90aW1lX2VudW0sCiAJU1NNMjUxOF9SRUdfRFJDXzYsIDAsIHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2hvbGRfdGltZV9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2hvbGRfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ183LCA0LCBzc20yNTE4X2RyY19ob2xkX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfbm9pc2VfZ2F0ZV9ob2xkX3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19ub2lzZV9nYXRlX2hvbGRfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ183LCAwLCBzc20yNTE4X2RyY19ob2xkX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcm1zX2F2ZXJhZ2luZ190aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcm1zX2F2ZXJhZ2luZ190aW1lX2VudW0sCiAJU1NNMjUxOF9SRUdfRFJDXzksIDAsIHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3NtMjUxOF9zbmRfY29udHJvbHNbXSA9IHsKQEAgLTY0OCwxNiArNjQ4LDYgQEAKIAogc3RhdGljIGludCBzc20yNTE4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgc3NtMjUxOCAqc3NtMjUxOCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQ7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc3NtMjUxOC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldHVybiBzc20yNTE4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDYzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItaTJjLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFNTTTI2MDIvU1NNMjYwMy9TU00yNjA0IEkyQyBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAic3NtMjYwMi5oIgorCisvKgorICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gc3NtMjYwMl9wcm9iZSgmY2xpZW50LT5kZXYsIGlkLT5kcml2ZXJfZGF0YSwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmc3NtMjYwMl9yZWdtYXBfY29uZmlnKSk7Cit9CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzc20yNjAyX2kyY19pZFtdID0geworCXsgInNzbTI2MDIiLCBTU00yNjAyIH0sCisJeyAic3NtMjYwMyIsIFNTTTI2MDIgfSwKKwl7ICJzc20yNjA0IiwgU1NNMjYwNCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzc20yNjAyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3NtMjYwMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gc3NtMjYwMl9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IHNzbTI2MDJfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBzc20yNjAyX2kyY19pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihzc20yNjAyX2kyY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMi9TU00yNjAzL1NTTTI2MDQgSTJDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmNTVlMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi1zcGkuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogU1NNMjYwMiBTUEkgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJzc20yNjAyLmgiCisKK3N0YXRpYyBpbnQgc3NtMjYwMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3NtMjYwMl9wcm9iZSgmc3BpLT5kZXYsIFNTTTI2MDIsCisJCWRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnNzbTI2MDJfcmVnbWFwX2NvbmZpZykpOworfQorCitzdGF0aWMgaW50IHNzbTI2MDJfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgc3NtMjYwMl9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInNzbTI2MDIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzc20yNjAyX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IHNzbTI2MDJfc3BpX3JlbW92ZSwKK307Cittb2R1bGVfc3BpX2RyaXZlcihzc20yNjAyX3NwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMiBTUEkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKaW5kZXggYWY3NmJiZC4uOTdiMDQ1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKQEAgLTI3LDMyICsyNywyMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAjaW5jbHVkZSAic3NtMjYwMi5oIgogCi1lbnVtIHNzbTI2MDJfdHlwZSB7Ci0JU1NNMjYwMiwKLQlTU00yNjA0LAotfTsKLQogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3Qgc3NtMjYwMl9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwotCXN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqc3lzY2xrX2NvbnN0cmFpbnRzOworCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqc3lzY2xrX2NvbnN0cmFpbnRzOwogCiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCkBAIC03NSwxNSArNjMsMTYgQEAKIAogLypBcHBlbmRpbmcgc2V2ZXJhbCAiTm9uZSJzIGp1c3QgZm9yIE9TUyBtaXhlciB1c2UqLwogc3RhdGljIGNvbnN0IGNoYXIgKnNzbTI2MDJfaW5wdXRfc2VsZWN0W10gPSB7Ci0JIkxpbmUiLCAiTWljIiwgIk5vbmUiLCAiTm9uZSIsICJOb25lIiwKLQkiTm9uZSIsICJOb25lIiwgIk5vbmUiLAorCSJMaW5lIiwgIk1pYyIsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3NtMjYwMl9kZWVtcGhbXSA9IHsiTm9uZSIsICIzMktoeiIsICI0NC4xS2h6IiwgIjQ4S2h6In07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3NtMjYwMl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKFNTTTI2MDJfQVBBTkEsIDIsIDIsIHNzbTI2MDJfaW5wdXRfc2VsZWN0KSwKLQlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUERJR0ksIDEsIDQsIHNzbTI2MDJfZGVlbXBoKSwKKwlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUEFOQSwgMiwgQVJSQVlfU0laRShzc20yNjAyX2lucHV0X3NlbGVjdCksCisJCQlzc20yNjAyX2lucHV0X3NlbGVjdCksCisJU09DX0VOVU1fU0lOR0xFKFNTTTI2MDJfQVBESUdJLCAxLCBBUlJBWV9TSVpFKHNzbTI2MDJfZGVlbXBoKSwKKwkJCXNzbTI2MDJfZGVlbXBoKSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3NtMjYweF9vdXRtaXhfdGx2W10gPSB7CkBAIC0xOTcsNyArMTg2LDcgQEAKIAk4MDAwLCAxNjAwMCwgMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3NtMjYwMl9jb25zdHJhaW50c18xMjI4ODAwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3NtMjYwMl9jb25zdHJhaW50c18xMjI4ODAwMCA9IHsKIAkubGlzdCA9IHNzbTI2MDJfcmF0ZXNfMTIyODgwMDAsCiAJLmNvdW50ID0gQVJSQVlfU0laRShzc20yNjAyX3JhdGVzXzEyMjg4MDAwKSwKIH07CkBAIC0yMDYsNyArMTk1LDcgQEAKIAk4MDAwLCA0NDEwMCwgODgyMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNzbTI2MDJfY29uc3RyYWludHNfMTEyODk2MDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNzbTI2MDJfY29uc3RyYWludHNfMTEyODk2MDAgPSB7CiAJLmxpc3QgPSBzc20yNjAyX3JhdGVzXzExMjg5NjAwLAogCS5jb3VudCA9IEFSUkFZX1NJWkUoc3NtMjYwMl9yYXRlc18xMTI4OTYwMCksCiB9OwpAQCAtNTI5LDcgKzUxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHNzbTI2MDJfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CkBAIC01NTQsNyArNTQzLDcgQEAKIAkJCUFSUkFZX1NJWkUoc3NtMjYwMl9yb3V0ZXMpKTsKIH0KIAotc3RhdGljIGludCBzc20yNjA0X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyBpbnQgc3NtMjYwNF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CkBAIC01NjgsMTggKzU1NywxMSBAQAogCQkJQVJSQVlfU0laRShzc20yNjA0X3JvdXRlcykpOwogfQogCi1zdGF0aWMgaW50IHNzbTI2MHhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIGludCBzc20yNjB4X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzc20yNjAyLT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVnbWFwX3dyaXRlKHNzbTI2MDItPnJlZ21hcCwgU1NNMjYwMl9SRVNFVCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKQEAgLTU5NywxMCArNTc5LDEwIEBACiAKIAlzd2l0Y2ggKHNzbTI2MDItPnR5cGUpIHsKIAljYXNlIFNTTTI2MDI6Ci0JCXJldCA9IHNzbTI2MDJfcHJvYmUoY29kZWMpOworCQlyZXQgPSBzc20yNjAyX2NvZGVjX3Byb2JlKGNvZGVjKTsKIAkJYnJlYWs7CiAJY2FzZSBTU00yNjA0OgotCQlyZXQgPSBzc20yNjA0X3Byb2JlKGNvZGVjKTsKKwkJcmV0ID0gc3NtMjYwNF9jb2RlY19wcm9iZShjb2RlYyk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjIwLDcgKzYwMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9zc20yNjAyID0gewotCS5wcm9iZSA9CXNzbTI2MHhfcHJvYmUsCisJLnByb2JlID0Jc3NtMjYweF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0Jc3NtMjYwMl9yZW1vdmUsCiAJLnN1c3BlbmQgPQlzc20yNjAyX3N1c3BlbmQsCiAJLnJlc3VtZSA9CXNzbTI2MDJfcmVzdW1lLApAQCAtNjM5LDcgKzYyMSw3IEBACiAJcmV0dXJuIHJlZyA9PSBTU00yNjAyX1JFU0VUOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnID0gewogCS52YWxfYml0cyA9IDksCiAJLnJlZ19iaXRzID0gNywKIApAQCAtNjUwLDEzNCArNjMyLDI4IEBACiAJLnJlZ19kZWZhdWx0c19yYXcgPSBzc20yNjAyX3JlZywKIAkubnVtX3JlZ19kZWZhdWx0c19yYXcgPSBBUlJBWV9TSVpFKHNzbTI2MDJfcmVnKSwKIH07CitFWFBPUlRfU1lNQk9MX0dQTChzc20yNjAyX3JlZ21hcF9jb25maWcpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBpbnQgc3NtMjYwMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK2ludCBzc20yNjAyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBzc20yNjAyX3R5cGUgdHlwZSwKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IHNzbTI2MDJfcHJpdiAqc3NtMjYwMjsKLQlpbnQgcmV0OwogCi0Jc3NtMjYwMiA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3NtMjYwMl9wcml2KSwKLQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisKKwlzc20yNjAyID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc20yNjAyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNzbTI2MDIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGlfc2V0X2RydmRhdGEoc3BpLCBzc20yNjAyKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzc20yNjAyKTsKIAlzc20yNjAyLT50eXBlID0gU1NNMjYwMjsKKwlzc20yNjAyLT5yZWdtYXAgPSByZWdtYXA7CiAKLQlzc20yNjAyLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZzc20yNjAyX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoc3NtMjYwMi0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoc3NtMjYwMi0+cmVnbWFwKTsKLQotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAotCQkJJnNvY19jb2RlY19kZXZfc3NtMjYwMiwgJnNzbTI2MDJfZGFpLCAxKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJnNvY19jb2RlY19kZXZfc3NtMjYwMiwKKwkJJnNzbTI2MDJfZGFpLCAxKTsKIH0KLQotc3RhdGljIGludCBzc20yNjAyX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHNzbTI2MDJfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJzc20yNjAyIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gc3NtMjYwMl9zcGlfcHJvYmUsCi0JLnJlbW92ZQkJPSBzc20yNjAyX3NwaV9yZW1vdmUsCi19OwotI2VuZGlmCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0vKgotICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81Ci0gKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KLSAqICAgIGxvdyAgPSAweDFhCi0gKiAgICBoaWdoID0gMHgxYgotICovCi1zdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyOwotCWludCByZXQ7Ci0KLQlzc20yNjAyID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBzc20yNjAyX3ByaXYpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChzc20yNjAyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaTJjX3NldF9jbGllbnRkYXRhKGkyYywgc3NtMjYwMik7Ci0Jc3NtMjYwMi0+dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKLQotCXNzbTI2MDItPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnNzbTI2MDJfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihzc20yNjAyLT5yZWdtYXApKQotCQlyZXR1cm4gUFRSX0VSUihzc20yNjAyLT5yZWdtYXApOwotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl9zc20yNjAyLCAmc3NtMjYwMl9kYWksIDEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3NtMjYwMl9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzc20yNjAyX2kyY19pZFtdID0gewotCXsgInNzbTI2MDIiLCBTU00yNjAyIH0sCi0JeyAic3NtMjYwMyIsIFNTTTI2MDIgfSwKLQl7ICJzc20yNjA0IiwgU1NNMjYwNCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7Ci0KLS8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc3NtMjYwMl9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInNzbTI2MDIiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IHNzbTI2MDJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBzc20yNjAyX2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gc3NtMjYwMl9pMmNfaWQsCi19OwotI2VuZGlmCi0KLQotc3RhdGljIGludCBfX2luaXQgc3NtMjYwMl9tb2Rpbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnNzbTI2MDJfc3BpX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9IGkyY19hZGRfZHJpdmVyKCZzc20yNjAyX2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfaW5pdChzc20yNjAyX21vZGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3NtMjYwMl9leGl0KHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNzbTI2MDJfc3BpX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKLQlpMmNfZGVsX2RyaXZlcigmc3NtMjYwMl9pMmNfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoc3NtMjYwMl9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNzbTI2MDJfcHJvYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMi9TU00yNjAzL1NTTTI2MDQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKaW5kZXggZmJkMDdkNy4uNzQ3NTM4OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKQEAgLTI4LDYgKzI4LDIwIEBACiAjaWZuZGVmIF9TU00yNjAyX0gKICNkZWZpbmUgX1NTTTI2MDJfSAogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBkZXZpY2U7CisKK2VudW0gc3NtMjYwMl90eXBlIHsKKwlTU00yNjAyLAorCVNTTTI2MDQsCit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnOworCitpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gc3NtMjYwMl90eXBlIHR5cGUsCisJc3RydWN0IHJlZ21hcCAqcmVnbWFwKTsKKwogLyogU1NNMjYwMiBDb2RlYyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogCiAjZGVmaW5lIFNTTTI2MDJfTElOVk9MICAgMHgwMApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKaW5kZXggMjczNTM2MS4uMTI1Nzc3NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCkBAIC04NzIsMTYgKzg3Miw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogVGVsbCBBU29DIHdoYXQga2luZCBvZiBJL08gdG8gdXNlIHRvIHJlYWQgdGhlIHJlZ2lzdGVycy4gIEFTb0Mgd2lsbAotCSAqIHRoZW4gZG8gdGhlIEkyQyB0cmFuc2FjdGlvbnMgaXRzZWxmLgotCSAqLwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzdGEzMngtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9PIChyZXQ9JWkpXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAkvKiBDaGlwIGRvY3VtZW50YXRpb24gZXhwbGljaXRseSByZXF1aXJlcyB0aGF0IHRoZSByZXNldCB2YWx1ZXMKIAkgKiBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzIGFyZSBsZWZ0IHVudG91Y2hlZC4KIAkgKiBXcml0ZSB0aGUgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSB0byBjYWNoZSBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLApAQCAtOTQ2LDEwICs5MzYsNiBAQAogCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzdGEzMnhfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jCmluZGV4IDQwYzA3YmUuLmE0MGM0YjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfZ2Fpbl90bHYsIC05MTUwLCA1MCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobWFzdGVyX3ZvbF90bHYsIC0xMjc1MCwgNTAsIDApOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHB3bV9zcmMsIFNUQTUyOV9GRlhDRkcxLCA0LCBwd21fbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwd21fc3JjLCBTVEE1MjlfRkZYQ0ZHMSwgNCwgcHdtX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGE1Mjlfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBTVEE1MjlfTFZPTCwgU1RBNTI5X1JWT0wsIDAsCkBAIC0xOTMsOCArMTkzLDcgQEAKIAkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJaW50IHBkYXRhLCBwbGF5X2ZyZXFfdmFsLCByZWNvcmRfZnJlcV92YWw7CiAJaW50IGJjbGtfdG9fZnNfcmF0aW87CiAKQEAgLTMyMiwxNiArMzIxLDYgQEAKIAogc3RhdGljIGludCBzdGE1MjlfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCBzdGE1MjkgKnN0YTUyOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQ7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc3RhNTI5LT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAJc3RhNTI5X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYwppbmRleCBhNTQ1NWMxLi41M2I4MTBkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCkBAIC02MiwyNSArNjIsMjUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTc2Nl9ib29zdDJbXSA9IHsiMGRCIiwgIjIwZEIifTsKIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTc2Nl9zdGVyZW9fbWljW10gPSB7Ik9mZiIsICJPbiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YWM5NzY2X3JlY29yZF9lbnVtID0KLQlTT0NfRU5VTV9ET1VCTEUoQUM5N19SRUNfU0VMLCA4LCAwLCA4LCBzdGFjOTc2Nl9yZWNvcmRfbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfbW9ub19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIDIsIHN0YWM5NzY2X21vbm9fbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgc3RhYzk3NjZfbWljX211eCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YWM5NzY2X1NQRElGX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfREFfQ09OVFJPTCwgMSwgMiwgc3RhYzk3NjZfU1BESUZfbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfcG9wYnlwYXNzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIDIsIHN0YWM5NzY2X3BvcGJ5cGFzc19tdXgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9yZWNvcmRfYWxsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDEyLCAyLAotCQkJc3RhYzk3NjZfcmVjb3JkX2FsbF9tdXgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9ib29zdDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFDOTdfTUlDLCA2LCAyLCBzdGFjOTc2Nl9ib29zdDEpOyAvKiAwLzEwZEIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfYm9vc3QyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDIsIDIsIHN0YWM5NzY2X2Jvb3N0Mik7IC8qIDAvMjBkQiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfU1RFUkVPX01JQywgMiwgMSwgc3RhYzk3NjZfc3RlcmVvX21pYyk7CitzdGF0aWMgU09DX0VOVU1fRE9VQkxFX0RFQ0woc3RhYzk3NjZfcmVjb3JkX2VudW0sCisJCQkgICAgQUM5N19SRUNfU0VMLCA4LCAwLCBzdGFjOTc2Nl9yZWNvcmRfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9tb25vX2VudW0sCisJCQkgICAgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIHN0YWM5NzY2X21vbm9fbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9taWNfZW51bSwKKwkJCSAgICBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgc3RhYzk3NjZfbWljX211eCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfU1BESUZfZW51bSwKKwkJCSAgICBBQzk3X1NUQUNfREFfQ09OVFJPTCwgMSwgc3RhYzk3NjZfU1BESUZfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9wb3BieXBhc3NfZW51bSwKKwkJCSAgICBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIHN0YWM5NzY2X3BvcGJ5cGFzc19tdXgpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0YWM5NzY2X3JlY29yZF9hbGxfZW51bSwKKwkJCSAgICBBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDEyLAorCQkJICAgIHN0YWM5NzY2X3JlY29yZF9hbGxfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9ib29zdDFfZW51bSwKKwkJCSAgICBBQzk3X01JQywgNiwgc3RhYzk3NjZfYm9vc3QxKTsgLyogMC8xMGRCICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfYm9vc3QyX2VudW0sCisJCQkgICAgQUM5N19TVEFDX0FOQUxPR19TUEVDSUFMLCAyLCBzdGFjOTc2Nl9ib29zdDIpOyAvKiAwLzIwZEIgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0sCisJCQkgICAgQUM5N19TVEFDX1NURVJFT19NSUMsIDIsIHN0YWM5NzY2X3N0ZXJlb19taWMpOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1hc3Rlcl90bHYsIC00NjAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocmVjb3JkX3RsdiwgMCwgMjI1MCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZjNDYwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIEkyQyBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJ0bHYzMjBhaWMyMy5oIgorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoaTJjLT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRsdjMyMGFpYzIzX3JlZ21hcCk7CisJcmV0dXJuIHRsdjMyMGFpYzIzX3Byb2JlKCZpMmMtPmRldiwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGx2MzIwYWljMjNfaWRbXSA9IHsKKwl7InRsdjMyMGFpYzIzIiwgMH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bHYzMjBhaWMyM19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bHYzMjBhaWMyM19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKKwkJICAgfSwKKwkucHJvYmUgPSB0bHYzMjBhaWMyM19pMmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZXhpdF9wKHRsdjMyMGFpYzIzX2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHRsdjMyMGFpYzIzX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIodGx2MzIwYWljMjNfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBUTFYzMjBBSUMyMyBjb2RlYyBkcml2ZXIgSTJDIik7CitNT0RVTEVfQVVUSE9SKCJBcnVuIEtTIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM4N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1zcGkuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIFNQSSBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAidGx2MzIwYWljMjMuaCIKKworc3RhdGljIGludCBhaWMyM19zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAicHJvYmluZyB0bHYzMjBhaWMyMyBzcGkgZGV2aWNlXG4iKTsKKworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzA7CisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZ0bHYzMjBhaWMyM19yZWdtYXApOworCXJldHVybiB0bHYzMjBhaWMyM19wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgYWljMjNfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWljMjNfc3BpID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRsdjMyMGFpYzIzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhaWMyM19zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGFpYzIzX3NwaV9yZW1vdmUsCit9OworCittb2R1bGVfc3BpX2RyaXZlcihhaWMyM19zcGkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIFNQSSIpOworTU9EVUxFX0FVVEhPUigiQXJ1biBLUyA8YXJ1bmtzQG1pc3RyYWxzb2x1dGlvbnMuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IDVkNDMwY2MuLjIwODY0ZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC01MSw3ICs1MCw3IEBACiAJeyAgOSwgMHgwMDAwIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwID0gewogCS5yZWdfYml0cyA9IDcsCiAJLnZhbF9iaXRzID0gOSwKIApAQCAtNjAsMjAgKzU5LDIxIEBACiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3JlZyksCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OworRVhQT1JUX1NZTUJPTCh0bHYzMjBhaWMyM19yZWdtYXApOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmVjX3NyY190ZXh0W10gPSB7ICJMaW5lIiwgIk1pYyIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdGV4dFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByZWNfc3JjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUTFYzMjBBSUMyM19BTkxHLCAyLCAyLCByZWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJlY19zcmNfZW51bSwKKwkJCSAgICBUTFYzMjBBSUMyM19BTkxHLCAyLCByZWNfc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfcmVjX3NyY19tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiSW5wdXQgU2VsZWN0IiwgcmVjX3NyY19lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0bHYzMjBhaWMyM19yZWNfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfQU5MRywgMiwgMiwgcmVjX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdGx2MzIwYWljMjNfZGVlbXBoID0KLQlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfRElHVCwgMSwgNCwgZGVlbXBoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHRsdjMyMGFpYzIzX3JlY19zcmMsCisJCQkgICAgVExWMzIwQUlDMjNfQU5MRywgMiwgcmVjX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0bHYzMjBhaWMyM19kZWVtcGgsCisJCQkgICAgVExWMzIwQUlDMjNfRElHVCwgMSwgZGVlbXBoX3RleHQpOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X2dhaW5fdGx2LCAtMTIxMDAsIDEwMCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaW5wdXRfZ2Fpbl90bHYsIC0xNzI1LCA3NSwgMCk7CkBAIC00MDAsNyArNDAwLDcgQEAKIAlzdHJ1Y3QgYWljMjMgKmFpYzIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAkvKiBkZWFjdGl2YXRlICovCi0JaWYgKCFjb2RlYy0+YWN0aXZlKSB7CisJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykpIHsKIAkJdWRlbGF5KDUwKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDApOwogCX0KQEAgLTU1NywxNiArNTU3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogUmVzZXQgY29kZWMgKi8KIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SRVNFVCwgMCk7CiAKQEAgLTYwNCw3ICs1OTYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfdGx2MzIwYWljMjMgPSB7Ci0JLnByb2JlID0gdGx2MzIwYWljMjNfcHJvYmUsCisJLnByb2JlID0gdGx2MzIwYWljMjNfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHRsdjMyMGFpYzIzX3JlbW92ZSwKIAkuc3VzcGVuZCA9IHRsdjMyMGFpYzIzX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHRsdjMyMGFpYzIzX3Jlc3VtZSwKQEAgLTYxNyw1NiArNjA5LDI1IEBACiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfaW50ZXJjb24pLAogfTsKIAotLyoKLSAqIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKLSAqIGFyb3VuZAotICovCi1zdGF0aWMgaW50IHRsdjMyMGFpYzIzX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCi0JCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK2ludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlzdHJ1Y3QgYWljMjMgKmFpYzIzOwotCWludCByZXQ7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGkyYy0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOwogCi0JYWljMjMgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IGFpYzIzKSwgR0ZQX0tFUk5FTCk7CisJYWljMjMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGFpYzIzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFpYzIzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYWljMjMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRsdjMyMGFpYzIzX3JlZ21hcCk7Ci0JaWYgKElTX0VSUihhaWMyMy0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWljMjMtPnJlZ21hcCk7CisJYWljMjMtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFpYzIzKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhaWMyMyk7CiAKLQlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl90bHYzMjBhaWMyMywgJnRsdjMyMGFpYzIzX2RhaSwgMSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsICZzb2NfY29kZWNfZGV2X3RsdjMyMGFpYzIzLAorCQkJCSAgICAgICZ0bHYzMjBhaWMyM19kYWksIDEpOwogfQotc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGx2MzIwYWljMjNfaWRbXSA9IHsKLQl7InRsdjMyMGFpYzIzIiwgMH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bHYzMjBhaWMyM19pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bHYzMjBhaWMyM19pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKLQkJICAgfSwKLQkucHJvYmUgPSB0bHYzMjBhaWMyM19jb2RlY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AodGx2MzIwYWljMjNfaTJjX3JlbW92ZSksCi0JLmlkX3RhYmxlID0gdGx2MzIwYWljMjNfaWQsCi19OwotCi1tb2R1bGVfaTJjX2RyaXZlcih0bHYzMjBhaWMyM19pMmNfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wodGx2MzIwYWljMjNfcHJvYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJBcnVuIEtTIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmggYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmgKaW5kZXggZTgwNDEyMC4uM2E3MjM1YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuaApAQCAtMTIsNiArMTIsMTIgQEAKICNpZm5kZWYgX1RMVjMyMEFJQzIzX0gKICNkZWZpbmUgX1RMVjMyMEFJQzIzX0gKIAorc3RydWN0IGRldmljZTsKK3N0cnVjdCByZWdtYXBfY29uZmlnOworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwOworaW50IHRsdjMyMGFpYzIzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKTsKKwogLyogQ29kZWMgVExWMzIwQUlDMjMgKi8KICNkZWZpbmUgVExWMzIwQUlDMjNfTElOVk9MCQkweDAwCiAjZGVmaW5lIFRMVjMyMEFJQzIzX1JJTlZPTAkJMHgwMQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCmluZGV4IDk0YTY1OGYuLjQzMDY5ZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKQEAgLTIzOCw4ICsyMzgsOSBAQAogICogQUxTQSBjb250cm9scwogICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWljMjZfY2FwdHVyZV9zcmNfdGV4dFtdID0geyJNaWMiLCAiQXV4In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpYzI2X2NhcHR1cmVfc3JjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSUMyNl9SRUdfQVVESU9fQ1RSTDEsIDEyLCAyLCBhaWMyNl9jYXB0dXJlX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWMyNl9jYXB0dXJlX3NyY19lbnVtLAorCQkJICAgIEFJQzI2X1JFR19BVURJT19DVFJMMSwgMTIsCisJCQkgICAgYWljMjZfY2FwdHVyZV9zcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMyNl9zbmRfY29udHJvbHNbXSA9IHsKIAkvKiBPdXRwdXQgKi8KQEAgLTI5NSw4ICsyOTYsNiBAQAogCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CiAJaW50IHJldCwgcmVnOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCiAJYWljMjYtPmNvZGVjID0gY29kZWM7CiAKIAkvKiBSZXNldCB0aGUgY29kZWMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNThjZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jCkBAIC0wLDAgKzEsMTI4MCBAQAorLyoKKyAqIEFMU0EgU29DIFRMVjMyMEFJQzMxWFggY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBKeXJpIFNhcmhhIDxqc2FyaGFAdGkuY29tPgorICoKKyAqIEJhc2VkIG9uIGdyb3VuZCB3b3JrIGJ5OiBBaml0IEt1bGthcm5pIDx4MDE3NTc2NUB0aS5jb20+CisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgQVMgSVMgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogVGhlIFRMVjMyMEFJQzMxeHggc2VyaWVzIG9mIGF1ZGlvIGNvZGVjIGlzIGEgbG93LXBvd2VyLCBoaWdobHkgaW50ZWdyYXRlZAorICogaGlnaCBwZXJmb3JtYW5jZSBjb2RlYyB3aGljaCBwcm92aWRlcyBhIHN0ZXJlbyBEQUMsIGEgbW9ubyBBREMsCisgKiBhbmQgbW9uby9zdGVyZW8gQ2xhc3MtRCBzcGVha2VyIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgtbWljYmlhcy5oPgorCisjaW5jbHVkZSAidGx2MzIwYWljMzF4eC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IGFpYzMxeHhfcmVnX2RlZmF1bHRzW10gPSB7CisJeyBBSUMzMVhYX0NMS01VWCwgMHgwMCB9LAorCXsgQUlDMzFYWF9QTExQUiwgMHgxMSB9LAorCXsgQUlDMzFYWF9QTExKLCAweDA0IH0sCisJeyBBSUMzMVhYX1BMTERNU0IsIDB4MDAgfSwKKwl7IEFJQzMxWFhfUExMRExTQiwgMHgwMCB9LAorCXsgQUlDMzFYWF9OREFDLCAweDAxIH0sCisJeyBBSUMzMVhYX01EQUMsIDB4MDEgfSwKKwl7IEFJQzMxWFhfRE9TUk1TQiwgMHgwMCB9LAorCXsgQUlDMzFYWF9ET1NSTFNCLCAweDgwIH0sCisJeyBBSUMzMVhYX05BREMsIDB4MDEgfSwKKwl7IEFJQzMxWFhfTUFEQywgMHgwMSB9LAorCXsgQUlDMzFYWF9BT1NSLCAweDgwIH0sCisJeyBBSUMzMVhYX0lGQUNFMSwgMHgwMCB9LAorCXsgQUlDMzFYWF9EQVRBX09GRlNFVCwgMHgwMCB9LAorCXsgQUlDMzFYWF9JRkFDRTIsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQkNMS04sIDB4MDEgfSwKKwl7IEFJQzMxWFhfREFDU0VUVVAsIDB4MTQgfSwKKwl7IEFJQzMxWFhfREFDTVVURSwgMHgwYyB9LAorCXsgQUlDMzFYWF9MREFDVk9MLCAweDAwIH0sCisJeyBBSUMzMVhYX1JEQUNWT0wsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQURDU0VUVVAsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQURDRkdBLCAweDgwIH0sCisJeyBBSUMzMVhYX0FEQ1ZPTCwgMHgwMCB9LAorCXsgQUlDMzFYWF9IUERSSVZFUiwgMHgwNCB9LAorCXsgQUlDMzFYWF9TUEtBTVAsIDB4MDYgfSwKKwl7IEFJQzMxWFhfREFDTUlYRVJST1VURSwgMHgwMCB9LAorCXsgQUlDMzFYWF9MQU5BTE9HSFBMLCAweDdmIH0sCisJeyBBSUMzMVhYX1JBTkFMT0dIUFIsIDB4N2YgfSwKKwl7IEFJQzMxWFhfTEFOQUxPR1NQTCwgMHg3ZiB9LAorCXsgQUlDMzFYWF9SQU5BTE9HU1BSLCAweDdmIH0sCisJeyBBSUMzMVhYX0hQTEdBSU4sIDB4MDIgfSwKKwl7IEFJQzMxWFhfSFBSR0FJTiwgMHgwMiB9LAorCXsgQUlDMzFYWF9TUExHQUlOLCAweDAwIH0sCisJeyBBSUMzMVhYX1NQUkdBSU4sIDB4MDAgfSwKKwl7IEFJQzMxWFhfTUlDQklBUywgMHgwMCB9LAorCXsgQUlDMzFYWF9NSUNQR0EsIDB4ODAgfSwKKwl7IEFJQzMxWFhfTUlDUEdBUEksIDB4MDAgfSwKKwl7IEFJQzMxWFhfTUlDUEdBTUksIDB4MDAgfSwKK307CisKK3N0YXRpYyBib29sIGFpYzMxeHhfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBBSUMzMVhYX1BBR0VDVEw6IC8qIHJlZ21hcCBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGlzICovCisJY2FzZSBBSUMzMVhYX1JFU0VUOiAvKiBhbHdheXMgY2xlYXJzIGFmdGVyIHdyaXRlICovCisJY2FzZSBBSUMzMVhYX09UX0ZMQUc6CisJY2FzZSBBSUMzMVhYX0FEQ0ZMQUc6CisJY2FzZSBBSUMzMVhYX0RBQ0ZMQUcxOgorCWNhc2UgQUlDMzFYWF9EQUNGTEFHMjoKKwljYXNlIEFJQzMxWFhfT0ZGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJEQUNGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJBRENGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJEQUNGTEFHMjoKKwljYXNlIEFJQzMxWFhfSU5UUkFEQ0ZMQUcyOgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBhaWMzMXh4X3dyaXRlYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFJQzMxWFhfT1RfRkxBRzoKKwljYXNlIEFJQzMxWFhfQURDRkxBRzoKKwljYXNlIEFJQzMxWFhfREFDRkxBRzE6CisJY2FzZSBBSUMzMVhYX0RBQ0ZMQUcyOgorCWNhc2UgQUlDMzFYWF9PRkZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkRBQ0ZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkFEQ0ZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkRBQ0ZMQUcyOgorCWNhc2UgQUlDMzFYWF9JTlRSQURDRkxBRzI6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBhaWMzMXh4X3Jhbmdlc1tdID0geworCXsKKwkJLnJhbmdlX21pbiA9IDAsCisJCS5yYW5nZV9tYXggPSAxMiAqIDEyOCwKKwkJLnNlbGVjdG9yX3JlZyA9IEFJQzMxWFhfUEFHRUNUTCwKKwkJLnNlbGVjdG9yX21hc2sgPSAweGZmLAorCQkuc2VsZWN0b3Jfc2hpZnQgPSAwLAorCQkud2luZG93X3N0YXJ0ID0gMCwKKwkJLndpbmRvd19sZW4gPSAxMjgsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhaWMzMXh4X2kyY19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS53cml0ZWFibGVfcmVnID0gYWljMzF4eF93cml0ZWFibGUsCisJLnZvbGF0aWxlX3JlZyA9IGFpYzMxeHhfdm9sYXRpbGUsCisJLnJlZ19kZWZhdWx0cyA9IGFpYzMxeHhfcmVnX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShhaWMzMXh4X3JlZ19kZWZhdWx0cyksCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJhbmdlcyA9IGFpYzMxeHhfcmFuZ2VzLAorCS5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShhaWMzMXh4X3JhbmdlcyksCisJLm1heF9yZWdpc3RlciA9IDEyICogMTI4LAorfTsKKworI2RlZmluZSBBSUMzMVhYX05VTV9TVVBQTElFUwk2CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFpYzMxeHhfc3VwcGx5X25hbWVzW0FJQzMxWFhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiSFBWREQiLAorCSJTUFJWREQiLAorCSJTUExWREQiLAorCSJBVkREIiwKKwkiSU9WREQiLAorCSJEVkREIiwKK307CisKK3N0cnVjdCBhaWMzMXh4X2Rpc2FibGVfbmIgeworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4OworfTsKKworc3RydWN0IGFpYzMxeHhfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXU4IGkyY19yZWdzX3N0YXR1czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBhaWMzMXh4X3BkYXRhIHBkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0FJQzMxWFhfTlVNX1NVUFBMSUVTXTsKKwlzdHJ1Y3QgYWljMzF4eF9kaXNhYmxlX25iIGRpc2FibGVfbmJbQUlDMzFYWF9OVU1fU1VQUExJRVNdOworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJaW50IHJhdGVfZGl2X2xpbmU7Cit9OworCitzdHJ1Y3QgYWljMzF4eF9yYXRlX2RpdnMgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXU4IHBfdmFsOworCXU4IHBsbF9qOworCXUxNiBwbGxfZDsKKwl1MTYgZG9zcjsKKwl1OCBuZGFjOworCXU4IG1kYWM7CisJdTggYW9zcjsKKwl1OCBuYWRjOworCXU4IG1hZGM7Cit9OworCisvKiBBREMgZGl2aWRlcnMgY2FuIGJlIGRpc2FibGVkIGJ5IGNvZmlndXJpbmcgdGhlbSB0byAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFpYzMxeHhfcmF0ZV9kaXZzIGFpYzMxeHhfZGl2c1tdID0geworCS8qIG1jbGsgICAgICByYXRlICBwbGw6IHAgIGoJIGQgICAgIGRvc3IgbmRhYyBtZGFjICBhb3JzIG5hZGMgbWFkYyAqLworCS8qIDhrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAgODAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgNDgsICAyLAkxMjgsICA0OCwgIDJ9LAorCXsyNDAwMDAwMCwgICA4MDAwLAkyLCA4LCAxOTIwLAkxMjgsICA0OCwgIDIsCTEyOCwgIDQ4LCAgMn0sCisJezI1MDAwMDAwLCAgIDgwMDAsCTIsIDcsIDg2NDMsCTEyOCwgIDQ4LCAgMiwJMTI4LCAgNDgsICAyfSwKKwkvKiAxMS4wMjVrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAxMTAyNSwJMSwgNywgNTI2NCwJMTI4LCAgMzIsICAyLAkxMjgsICAzMiwgIDJ9LAorCXsyNDAwMDAwMCwgIDExMDI1LAkyLCA3LCA1MjY0LAkxMjgsICAzMiwgIDIsCTEyOCwgIDMyLCAgMn0sCisJezI1MDAwMDAwLCAgMTEwMjUsCTIsIDcsIDIyNTMsCTEyOCwgIDMyLCAgMiwJMTI4LCAgMzIsICAyfSwKKwkvKiAxNmsgcmF0ZSAqLworCXsxMjAwMDAwMCwgIDE2MDAwLAkxLCA4LCAxOTIwLAkxMjgsICAyNCwgIDIsCTEyOCwgIDI0LCAgMn0sCisJezI0MDAwMDAwLCAgMTYwMDAsCTIsIDgsIDE5MjAsCTEyOCwgIDI0LCAgMiwJMTI4LCAgMjQsICAyfSwKKwl7MjUwMDAwMDAsICAxNjAwMCwJMiwgNywgODY0MywJMTI4LCAgMjQsICAyLAkxMjgsICAyNCwgIDJ9LAorCS8qIDIyLjA1ayByYXRlICovCisJezEyMDAwMDAwLCAgMjIwNTAsCTEsIDcsIDUyNjQsCTEyOCwgIDE2LCAgMiwJMTI4LCAgMTYsICAyfSwKKwl7MjQwMDAwMDAsICAyMjA1MCwJMiwgNywgNTI2NCwJMTI4LCAgMTYsICAyLAkxMjgsICAxNiwgIDJ9LAorCXsyNTAwMDAwMCwgIDIyMDUwLAkyLCA3LCAyMjUzLAkxMjgsICAxNiwgIDIsCTEyOCwgIDE2LCAgMn0sCisJLyogMzJrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAzMjAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgMTIsICAyLAkxMjgsICAxMiwgIDJ9LAorCXsyNDAwMDAwMCwgIDMyMDAwLAkyLCA4LCAxOTIwLAkxMjgsICAxMiwgIDIsCTEyOCwgIDEyLCAgMn0sCisJezI1MDAwMDAwLCAgMzIwMDAsCTIsIDcsIDg2NDMsCTEyOCwgIDEyLCAgMiwJMTI4LCAgMTIsICAyfSwKKwkvKiA0NC4xayByYXRlICovCisJezEyMDAwMDAwLCAgNDQxMDAsCTEsIDcsIDUyNjQsCTEyOCwgICA4LCAgMiwJMTI4LCAgIDgsICAyfSwKKwl7MjQwMDAwMDAsICA0NDEwMCwJMiwgNywgNTI2NCwJMTI4LCAgIDgsICAyLAkxMjgsICAgOCwgIDJ9LAorCXsyNTAwMDAwMCwgIDQ0MTAwLAkyLCA3LCAyMjUzLAkxMjgsICAgOCwgIDIsCTEyOCwgICA4LCAgMn0sCisJLyogNDhrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICA0ODAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgIDgsICAyLAkxMjgsICAgOCwgIDJ9LAorCXsyNDAwMDAwMCwgIDQ4MDAwLAkyLCA4LCAxOTIwLAkxMjgsICAgOCwgIDIsCTEyOCwgICA4LCAgMn0sCisJezI1MDAwMDAwLCAgNDgwMDAsCTIsIDcsIDg2NDMsCTEyOCwgICA4LCAgMiwJMTI4LCAgIDgsICAyfSwKKwkvKiA4OC4yayByYXRlICovCisJezEyMDAwMDAwLCAgODgyMDAsCTEsIDcsIDUyNjQsCSA2NCwgICA4LCAgMiwJIDY0LCAgIDgsICAyfSwKKwl7MjQwMDAwMDAsICA4ODIwMCwJMiwgNywgNTI2NCwJIDY0LCAgIDgsICAyLAkgNjQsICAgOCwgIDJ9LAorCXsyNTAwMDAwMCwgIDg4MjAwLAkyLCA3LCAyMjUzLAkgNjQsICAgOCwgIDIsCSA2NCwgICA4LCAgMn0sCisJLyogOTZrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICA5NjAwMCwJMSwgOCwgMTkyMCwJIDY0LCAgIDgsICAyLAkgNjQsICAgOCwgIDJ9LAorCXsyNDAwMDAwMCwgIDk2MDAwLAkyLCA4LCAxOTIwLAkgNjQsICAgOCwgIDIsCSA2NCwgICA4LCAgMn0sCisJezI1MDAwMDAwLCAgOTYwMDAsCTIsIDcsIDg2NDMsCSA2NCwgICA4LCAgMiwJIDY0LCAgIDgsICAyfSwKKwkvKiAxNzYuNGsgcmF0ZSAqLworCXsxMjAwMDAwMCwgMTc2NDAwLAkxLCA3LCA1MjY0LAkgMzIsICAgOCwgIDIsCSAzMiwgICA4LCAgMn0sCisJezI0MDAwMDAwLCAxNzY0MDAsCTIsIDcsIDUyNjQsCSAzMiwgICA4LCAgMiwJIDMyLCAgIDgsICAyfSwKKwl7MjUwMDAwMDAsIDE3NjQwMCwJMiwgNywgMjI1MywJIDMyLCAgIDgsICAyLAkgMzIsICAgOCwgIDJ9LAorCS8qIDE5MmsgcmF0ZSAqLworCXsxMjAwMDAwMCwgMTkyMDAwLAkxLCA4LCAxOTIwLAkgMzIsICAgOCwgIDIsCSAzMiwgICA4LCAgMn0sCisJezI0MDAwMDAwLCAxOTIwMDAsCTIsIDgsIDE5MjAsCSAzMiwgICA4LCAgMiwJIDMyLCAgIDgsICAyfSwKKwl7MjUwMDAwMDAsIDE5MjAwMCwJMiwgNywgODY0MywJIDMyLCAgIDgsICAyLAkgMzIsICAgOCwgIDJ9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZGFjX2luX3RleHRbXSA9IHsKKwkiT2ZmIiwgIkxlZnQgRGF0YSIsICJSaWdodCBEYXRhIiwgIk1vbm8iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJkYWNfaW5fdGV4dFtdID0geworCSJPZmYiLCAiUmlnaHQgRGF0YSIsICJMZWZ0IERhdGEiLCAiTW9ubyIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsZGFjX2luX2VudW0sIEFJQzMxWFhfREFDU0VUVVAsIDQsIGxkYWNfaW5fdGV4dCk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyZGFjX2luX2VudW0sIEFJQzMxWFhfREFDU0VUVVAsIDIsIHJkYWNfaW5fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWljX3NlbGVjdF90ZXh0W10gPSB7CisJIk9mZiIsICJGRlIgMTAgT2htIiwgIkZGUiAyMCBPaG0iLCAiRkZSIDQwIE9obSIKK307CisKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMWxwX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgNiwgbWljX3NlbGVjdF90ZXh0KTsKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMXJwX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgNCwgbWljX3NlbGVjdF90ZXh0KTsKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMWxtX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgMiwgbWljX3NlbGVjdF90ZXh0KTsKKworc3RhdGljIGNvbnN0CitTT0NfRU5VTV9TSU5HTEVfREVDTChjbV9tX2VudW0sIEFJQzMxWFhfTUlDUEdBTUksIDYsIG1pY19zZWxlY3RfdGV4dCk7CitzdGF0aWMgY29uc3QKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKG1pYzFsbV9tX2VudW0sIEFJQzMxWFhfTUlDUEdBTUksIDQsIG1pY19zZWxlY3RfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdm9sX3RsdiwgLTYzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfZmdhaW5fdGx2LCAwLCAxMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX2NnYWluX3RsdiwgLTIwMDAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfcGdhX3RsdiwgMCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGhwX2Rydl90bHYsIDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoY2xhc3NfRF9kcnZfdGx2LCA2MDAsIDYwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfdm9sX3RsdiwgLTYzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzcF92b2xfdGx2LCAtNjM1MCwgNTAsIDApOworCisvKgorICogY29udHJvbHMgdG8gYmUgZXhwb3J0ZWQgdG8gdGhlIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1NfVExWKCJEQUMgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MREFDVk9MLAorCQkJICAgQUlDMzFYWF9SREFDVk9MLCAwLCAtMTI3LCA0OCwgNywgMCwgZGFjX3ZvbF90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIkFEQyBGaW5lIENhcHR1cmUgVm9sdW1lIiwgQUlDMzFYWF9BRENGR0EsIDQsIDQsIDEsCisJCSAgICAgICBhZGNfZmdhaW5fdGx2KSwKKworCVNPQ19TSU5HTEUoIkFEQyBDYXB0dXJlIFN3aXRjaCIsIEFJQzMxWFhfQURDRkdBLCA3LCAxLCAxKSwKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIEFJQzMxWFhfQURDVk9MLCBBSUMzMVhYX0FEQ1ZPTCwKKwkJCSAgIDAsIC0yNCwgNDAsIDYsIDAsIGFkY19jZ2Fpbl90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIk1pYyBQR0EgQ2FwdHVyZSBWb2x1bWUiLCBBSUMzMVhYX01JQ1BHQSwgMCwKKwkJICAgICAgIDExOSwgMCwgbWljX3BnYV90bHYpLAorCisJU09DX0RPVUJMRV9SKCJIUCBEcml2ZXIgUGxheWJhY2sgU3dpdGNoIiwgQUlDMzFYWF9IUExHQUlOLAorCQkgICAgIEFJQzMxWFhfSFBSR0FJTiwgMiwgMSwgMCksCisJU09DX0RPVUJMRV9SX1RMVigiSFAgRHJpdmVyIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfSFBMR0FJTiwKKwkJCSBBSUMzMVhYX0hQUkdBSU4sIDMsIDB4MDksIDAsIGhwX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiSFAgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR0hQTCwKKwkJCSBBSUMzMVhYX1JBTkFMT0dIUFIsIDAsIDB4N0YsIDEsIGhwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxMXhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgICAgQUlDMzFYWF9TUFJHQUlOLCAyLCAxLCAwKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX1NQTEdBSU4sCisJCQkgQUlDMzFYWF9TUFJHQUlOLCAzLCAzLCAwLCBjbGFzc19EX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiU3BlYWtlciBBbmFsb2cgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MQU5BTE9HU1BMLAorCQkJIEFJQzMxWFhfUkFOQUxPR1NQUiwgMCwgMHg3RiwgMSwgc3Bfdm9sX3RsdiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzEweF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgIDIsIDEsIDApLAorCVNPQ19TSU5HTEVfVExWKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgICAgICAzLCAzLCAwLCBjbGFzc19EX2Rydl90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIlNwZWFrZXIgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR1NQTCwKKwkJICAgICAgIDAsIDB4N0YsIDEsIHNwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxkYWNfaW5fY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiREFDIExlZnQgSW5wdXQiLCBsZGFjX2luX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmRhY19pbl9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJEQUMgUmlnaHQgSW5wdXQiLCByZGFjX2luX2VudW0pOworCitzdGF0aWMgaW50IGFpYzMxeHhfd2FpdF9iaXRzKHN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHgsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgd2JpdHMsIGludCBzbGVlcCwKKwkJCSAgICAgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBiaXRzOworCWludCBjb3VudGVyID0gY291bnQ7CisJaW50IHJldCA9IHJlZ21hcF9yZWFkKGFpYzMxeHgtPnJlZ21hcCwgcmVnLCAmYml0cyk7CisJd2hpbGUgKChiaXRzICYgbWFzaykgIT0gd2JpdHMgJiYgY291bnRlciAmJiAhcmV0KSB7CisJCXVzbGVlcF9yYW5nZShzbGVlcCwgc2xlZXAgKiAyKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYWljMzF4eC0+cmVnbWFwLCByZWcsICZiaXRzKTsKKwkJY291bnRlci0tOworCX0KKwlpZiAoKGJpdHMgJiBtYXNrKSAhPSB3Yml0cykgeworCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwKKwkJCSIlczogRmFpbGVkISAweCV4IHdhcyAweCV4IGV4cGVjdGVkIDB4JXggKCVkLCAweCV4LCAlZCB1cylcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCBiaXRzLCB3Yml0cywgcmV0LCBtYXNrLAorCQkJKGNvdW50IC0gY291bnRlcikgKiBzbGVlcCk7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFdJREdFVF9CSVQocmVnLCBzaGlmdCkgKCgoc2hpZnQpIDw8IDgpIHwgKHJlZykpCisKK3N0YXRpYyBpbnQgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKHctPmNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gQUlDMzFYWF9EQUNGTEFHMTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCXN3aXRjaCAoV0lER0VUX0JJVCh3LT5yZWcsIHctPnNoaWZ0KSkgeworCWNhc2UgV0lER0VUX0JJVChBSUMzMVhYX0RBQ1NFVFVQLCA3KToKKwkJbWFzayA9IEFJQzMxWFhfTERBQ1BXUlNUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFdJREdFVF9CSVQoQUlDMzFYWF9EQUNTRVRVUCwgNik6CisJCW1hc2sgPSBBSUMzMVhYX1JEQUNQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfSFBEUklWRVIsIDcpOgorCQltYXNrID0gQUlDMzFYWF9IUExEUlZQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfSFBEUklWRVIsIDYpOgorCQltYXNrID0gQUlDMzFYWF9IUFJEUlZQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfU1BLQU1QLCA3KToKKwkJbWFzayA9IEFJQzMxWFhfU1BMRFJWUFdSU1RBVFVTX01BU0s7CisJCWJyZWFrOworCWNhc2UgV0lER0VUX0JJVChBSUMzMVhYX1NQS0FNUCwgNik6CisJCW1hc2sgPSBBSUMzMVhYX1NQUkRSVlBXUlNUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFdJREdFVF9CSVQoQUlDMzFYWF9BRENTRVRVUCwgNyk6CisJCW1hc2sgPSBBSUMzMVhYX0FEQ1BXUlNUQVRVU19NQVNLOworCQlyZWcgPSBBSUMzMVhYX0FEQ0ZMQUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIody0+Y29kZWMtPmRldiwgIlVua25vd24gd2lkZ2V0ICclcycgY2FsbGluZyAlcy9uIiwKKwkJCXctPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlyZXR1cm4gYWljMzF4eF93YWl0X2JpdHMoYWljMzF4eCwgcmVnLCBtYXNrLCBtYXNrLCA1MDAwLCAxMDApOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXR1cm4gYWljMzF4eF93YWl0X2JpdHMoYWljMzF4eCwgcmVnLCBtYXNrLCAwLCA1MDAwLCAxMDApOworCWRlZmF1bHQ6CisJCWRldl9kYmcody0+Y29kZWMtPmRldiwKKwkJCSJVbmhhbmRsZWQgZGFwbSB3aWRnZXQgZXZlbnQgJWQgZnJvbSAlc1xuIiwKKwkJCWV2ZW50LCB3LT5uYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsZWZ0X291dHB1dF9zd2l0Y2hlc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBMZWZ0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFMUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIFJpZ2h0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMSwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcF90ZXJtX21pYzFscCA9CisJU09DX0RBUE1fRU5VTSgiTUlDMUxQIFAtVGVybWluYWwiLCBtaWMxbHBfcF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBfdGVybV9taWMxcnAgPQorCVNPQ19EQVBNX0VOVU0oIk1JQzFSUCBQLVRlcm1pbmFsIiwgbWljMXJwX3BfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwX3Rlcm1fbWljMWxtID0KKwlTT0NfREFQTV9FTlVNKCJNSUMxTE0gUC1UZXJtaW5hbCIsIG1pYzFsbV9wX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbV90ZXJtX21pYzFsbSA9CisJU09DX0RBUE1fRU5VTSgiTUlDMUxNIE0tVGVybWluYWwiLCBtaWMxbG1fbV9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfZGFwbV9ocGxfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFJQzMxWFhfTEFOQUxPR0hQTCwgNywgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X2RhcG1faHByX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBSUMzMVhYX1JBTkFMT0dIUFIsIDcsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9kYXBtX3NwbF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQUlDMzFYWF9MQU5BTE9HU1BMLCA3LCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfZGFwbV9zcHJfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFJQzMxWFhfUkFOQUxPR1NQUiwgNywgMSwgMCk7CisKK3N0YXRpYyBpbnQgbWljX2JpYXNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogY2hhbmdlIG1pYyBiaWFzIHZvbHRhZ2UgdG8gdXNlciBkZWZpbmVkICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUlDQklBUywKKwkJCQkgICAgQUlDMzFYWF9NSUNCSUFTX01BU0ssCisJCQkJICAgIGFpYzMxeHgtPnBkYXRhLm1pY2JpYXNfdmcgPDwKKwkJCQkgICAgQUlDMzFYWF9NSUNCSUFTX1NISUZUKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHR1cm5lZCBvblxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQkvKiB0dXJuIG1pYyBiaWFzIG9mZiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01JQ0JJQVMsCisJCQkJICAgIEFJQzMxWFhfTUlDQklBU19NQVNLLCAwKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHR1cm5lZCBvZmZcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWljMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJEQUMgSU4iLCAiREFDIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkRBQyBMZWZ0IElucHV0IiwKKwkJCSBTTkRfU09DX05PUE0sIDAsIDAsICZsZGFjX2luX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIkRBQyBSaWdodCBJbnB1dCIsCisJCQkgU05EX1NPQ19OT1BNLCAwLCAwLCAmcmRhY19pbl9jb250cm9sKSwKKwkvKiBEQUNzICovCisJU05EX1NPQ19EQVBNX0RBQ19FKCJEQUMgTGVmdCIsICJMZWZ0IFBsYXliYWNrIiwKKwkJCSAgIEFJQzMxWFhfREFDU0VUVVAsIDcsIDAsIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fREFDX0UoIkRBQyBSaWdodCIsICJSaWdodCBQbGF5YmFjayIsCisJCQkgICBBSUMzMVhYX0RBQ1NFVFVQLCA2LCAwLCBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogT3V0cHV0IE1peGVycyAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBsZWZ0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUobGVmdF9vdXRwdXRfc3dpdGNoZXMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIHJpZ2h0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUocmlnaHRfb3V0cHV0X3N3aXRjaGVzKSksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJIUCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWMzMXh4X2RhcG1faHBsX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiSFAgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpYzMxeHhfZGFwbV9ocHJfc3dpdGNoKSwKKworCS8qIE91dHB1dCBkcml2ZXJzICovCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSFBMIERyaXZlciIsIEFJQzMxWFhfSFBEUklWRVIsIDcsIDAsCisJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSFBSIERyaXZlciIsIEFJQzMxWFhfSFBEUklWRVIsIDYsIDAsCisJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwkvKiBBREMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyIsICJDYXB0dXJlIiwgQUlDMzFYWF9BRENTRVRVUCwgNywgMCwKKwkJCSAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwkvKiBJbnB1dCBTZWxlY3Rpb24gdG8gTUlDX1BHQSAqLworCVNORF9TT0NfREFQTV9NVVgoIk1JQzFMUCBQLVRlcm1pbmFsIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICZwX3Rlcm1fbWljMWxwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJNSUMxUlAgUC1UZXJtaW5hbCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAmcF90ZXJtX21pYzFycCksCisJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIFAtVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJnBfdGVybV9taWMxbG0pLAorCisJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIE0tVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJm1fdGVybV9taWMxbG0pLAorCS8qIEVuYWJsaW5nICYgRGlzYWJsaW5nIE1JQyBHYWluIEN0bCAqLworCVNORF9TT0NfREFQTV9QR0EoIk1JQ19HQUlOX0NUTCIsIEFJQzMxWFhfTUlDUEdBLAorCQkJIDcsIDEsIE5VTEwsIDApLAorCisJLyogTWljIEJpYXMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNfYmlhc19ldmVudCwKKwkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwkvKiBPdXRwdXRzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCisKKwkvKiBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMVJQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTE0iKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTF4X2RhcG1fd2lkZ2V0c1tdID0geworCS8qIEFJQzMxMTEgYW5kIEFJQzMxMTAgaGF2ZSBzdGVyZW8gY2xhc3MtRCBhbXBsaWZpZXIgKi8KKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJTUEwgQ2xhc3NEIiwgQUlDMzFYWF9TUEtBTVAsIDcsIDAsIE5VTEwsIDAsCisJCQkgICAgICAgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiU1BSIENsYXNzRCIsIEFJQzMxWFhfU1BLQU1QLCA2LCAwLCBOVUxMLCAwLAorCQkJICAgICAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlNwZWFrZXIgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAmYWljMzF4eF9kYXBtX3NwbF9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlNwZWFrZXIgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpYzMxeHhfZGFwbV9zcHJfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUFIiKSwKK307CisKKy8qIEFJQzMxMDAgYW5kIEFJQzMxMjAgaGF2ZSBvbmx5IG1vbm8gY2xhc3MtRCBhbXBsaWZpZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTB4X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIlNQSyBDbGFzc0QiLCBBSUMzMVhYX1NQS0FNUCwgNywgMCwgTlVMTCwgMCwKKwkJCSAgICAgICBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJTcGVha2VyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWMzMXh4X2RhcG1fc3BsX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzF4eF9hdWRpb19tYXBbXSA9IHsKKwkvKiBEQUMgSW5wdXQgUm91dGluZyAqLworCXsiREFDIExlZnQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAorCXsiREFDIExlZnQgSW5wdXQiLCAiUmlnaHQgRGF0YSIsICJEQUMgSU4ifSwKKwl7IkRBQyBMZWZ0IElucHV0IiwgIk1vbm8iLCAiREFDIElOIn0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAorCXsiREFDIFJpZ2h0IElucHV0IiwgIlJpZ2h0IERhdGEiLCAiREFDIElOIn0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLCAiTW9ubyIsICJEQUMgSU4ifSwKKwl7IkRBQyBMZWZ0IiwgTlVMTCwgIkRBQyBMZWZ0IElucHV0In0sCisJeyJEQUMgUmlnaHQiLCBOVUxMLCAiREFDIFJpZ2h0IElucHV0In0sCisKKwkvKiBNaWMgaW5wdXQgKi8KKwl7Ik1JQzFMUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxQIn0sCisJeyJNSUMxTFAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMUCJ9LAorCXsiTUlDMUxQIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxTFAifSwKKwl7Ik1JQzFSUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMVJQIn0sCisJeyJNSUMxUlAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFSUCJ9LAorCXsiTUlDMVJQIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxUlAifSwKKwl7Ik1JQzFMTSBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxNIn0sCisJeyJNSUMxTE0gUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMTSJ9LAorCXsiTUlDMUxNIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxTE0ifSwKKworCXsiTUlDMUxNIE0tVGVybWluYWwiLCAiRkZSIDEwIE9obSIsICJNSUMxTE0ifSwKKwl7Ik1JQzFMTSBNLVRlcm1pbmFsIiwgIkZGUiAyMCBPaG0iLCAiTUlDMUxNIn0sCisJeyJNSUMxTE0gTS1UZXJtaW5hbCIsICJGRlIgNDAgT2htIiwgIk1JQzFMTSJ9LAorCisJeyJNSUNfR0FJTl9DVEwiLCBOVUxMLCAiTUlDMUxQIFAtVGVybWluYWwifSwKKwl7Ik1JQ19HQUlOX0NUTCIsIE5VTEwsICJNSUMxUlAgUC1UZXJtaW5hbCJ9LAorCXsiTUlDX0dBSU5fQ1RMIiwgTlVMTCwgIk1JQzFMTSBQLVRlcm1pbmFsIn0sCisJeyJNSUNfR0FJTl9DVEwiLCBOVUxMLCAiTUlDMUxNIE0tVGVybWluYWwifSwKKworCXsiQURDIiwgTlVMTCwgIk1JQ19HQUlOX0NUTCJ9LAorCisJLyogTGVmdCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTGVmdCBEQUMiLCAiREFDIExlZnQifSwKKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTUlDMUxQIiwgIk1JQzFMUCJ9LAorCXsiT3V0cHV0IExlZnQiLCAiRnJvbSBNSUMxUlAiLCAiTUlDMVJQIn0sCisKKwkvKiBSaWdodCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIFJpZ2h0IERBQyIsICJEQUMgUmlnaHQifSwKKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIE1JQzFSUCIsICJNSUMxUlAifSwKKworCS8qIEhQTCBwYXRoICovCisJeyJIUCBMZWZ0IiwgIlN3aXRjaCIsICJPdXRwdXQgTGVmdCJ9LAorCXsiSFBMIERyaXZlciIsIE5VTEwsICJIUCBMZWZ0In0sCisJeyJIUEwiLCBOVUxMLCAiSFBMIERyaXZlciJ9LAorCisJLyogSFBSIHBhdGggKi8KKwl7IkhQIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IkhQUiBEcml2ZXIiLCBOVUxMLCAiSFAgUmlnaHQifSwKKwl7IkhQUiIsIE5VTEwsICJIUFIgRHJpdmVyIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzExeF9hdWRpb19tYXBbXSA9IHsKKwkvKiBTUCBMIHBhdGggKi8KKwl7IlNwZWFrZXIgTGVmdCIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IlNQTCBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciBMZWZ0In0sCisJeyJTUEwiLCBOVUxMLCAiU1BMIENsYXNzRCJ9LAorCisJLyogU1AgUiBwYXRoICovCisJeyJTcGVha2VyIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IlNQUiBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciBSaWdodCJ9LAorCXsiU1BSIiwgTlVMTCwgIlNQUiBDbGFzc0QifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCithaWMzMTB4X2F1ZGlvX21hcFtdID0geworCS8qIFNQIEwgcGF0aCAqLworCXsiU3BlYWtlciIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IlNQSyBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciJ9LAorCXsiU1BLIiwgTlVMTCwgIlNQSyBDbGFzc0QifSwKK307CisKK3N0YXRpYyBpbnQgYWljMzF4eF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQpCisJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKAorCQkJY29kZWMsIGFpYzMxMXhfc25kX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhaWMzMTF4X3NuZF9jb250cm9scykpOworCWVsc2UKKwkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoCisJCQljb2RlYywgYWljMzEweF9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGFpYzMxMHhfc25kX2NvbnRyb2xzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoCisJCQlkYXBtLCBhaWMzMTF4X2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWljMzExeF9kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYWljMzExeF9hdWRpb19tYXAsCisJCQkJCSAgICAgIEFSUkFZX1NJWkUoYWljMzExeF9hdWRpb19tYXApKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygKKwkJCWRhcG0sIGFpYzMxMHhfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShhaWMzMTB4X2RhcG1fd2lkZ2V0cykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhaWMzMTB4X2F1ZGlvX21hcCwKKwkJCQkJICAgICAgQVJSQVlfU0laRShhaWMzMTB4X2F1ZGlvX21hcCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3NldHVwX3BsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgYmNsa19uID0gMDsKKwlpbnQgaTsKKworCS8qIFVzZSBQTEwgYXMgQ09ERUNfQ0xLSU4gYW5kIERBQ19DTEsgYXMgQkRJVl9DTEtJTiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfQ0xLTVVYLAorCQkJICAgIEFJQzMxWFhfQ09ERUNfQ0xLSU5fTUFTSywgQUlDMzFYWF9DT0RFQ19DTEtJTl9QTEwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfSUZBQ0UyLAorCQkJICAgIEFJQzMxWFhfQkRJVkNMS19NQVNLLCBBSUMzMVhYX0RBQzJCQ0xLKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzMxeHhfZGl2cyk7IGkrKykgeworCQlpZiAoYWljMzF4eF9kaXZzW2ldLnJhdGUgPT0gcGFyYW1zX3JhdGUocGFyYW1zKSAmJgorCQkgICAgYWljMzF4eF9kaXZzW2ldLm1jbGsgPT0gYWljMzF4eC0+c3lzY2xrKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShhaWMzMXh4X2RpdnMpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBTYW1wbGluZyByYXRlICV1IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBMTCBjb25maWd1cmF0aW9uICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9QTExQUiwgQUlDMzFYWF9QTExfTUFTSywKKwkJCSAgICAoYWljMzF4eF9kaXZzW2ldLnBfdmFsIDw8IDQpIHwgMHgwMSk7CisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExKLCBhaWMzMXh4X2RpdnNbaV0ucGxsX2opOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExETVNCLAorCQkgICAgICBhaWMzMXh4X2RpdnNbaV0ucGxsX2QgPj4gOCk7CisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExETFNCLAorCQkgICAgICBhaWMzMXh4X2RpdnNbaV0ucGxsX2QgJiAweGZmKTsKKworCS8qIERBQyBkaXZpZGVycyBjb25maWd1cmF0aW9uICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9OREFDLCBBSUMzMVhYX1BMTF9NQVNLLAorCQkJICAgIGFpYzMxeHhfZGl2c1tpXS5uZGFjKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01EQUMsIEFJQzMxWFhfUExMX01BU0ssCisJCQkgICAgYWljMzF4eF9kaXZzW2ldLm1kYWMpOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9ET1NSTVNCLCBhaWMzMXh4X2RpdnNbaV0uZG9zciA+PiA4KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMVhYX0RPU1JMU0IsIGFpYzMxeHhfZGl2c1tpXS5kb3NyICYgMHhmZik7CisKKwkvKiBBREMgZGl2aWRlcnMgY29uZmlndXJhdGlvbi4gV3JpdGUgcmVzZXQgdmFsdWUgMSBpZiBub3QgdXNlZC4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX05BREMsIEFJQzMxWFhfUExMX01BU0ssCisJCQkgICAgYWljMzF4eF9kaXZzW2ldLm5hZGMgPyBhaWMzMXh4X2RpdnNbaV0ubmFkYyA6IDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUFEQywgQUlDMzFYWF9QTExfTUFTSywKKwkJCSAgICBhaWMzMXh4X2RpdnNbaV0ubWFkYyA/IGFpYzMxeHhfZGl2c1tpXS5tYWRjIDogMSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMVhYX0FPU1IsIGFpYzMxeHhfZGl2c1tpXS5hb3NyKTsKKworCS8qIEJpdCBjbG9jayBkaXZpZGVyIGNvbmZpZ3VyYXRpb24uICovCisJYmNsa19uID0gKGFpYzMxeHhfZGl2c1tpXS5kb3NyICogYWljMzF4eF9kaXZzW2ldLm1kYWMpCisJCS8gc25kX3NvY19wYXJhbXNfdG9fZnJhbWVfc2l6ZShwYXJhbXMpOworCWlmIChiY2xrX24gPT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTm90IGVub3VnaCBCTENLIGJhbmR3aWR0aFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9CQ0xLTiwKKwkJCSAgICBBSUMzMVhYX1BMTF9NQVNLLCBiY2xrX24pOworCisJYWljMzF4eC0+cmF0ZV9kaXZfbGluZSA9IGk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSJwbGwgJWQuJTA0ZC8lZCBkb3NyICVkIG4gJWQgbSAlZCBhb3NyICVkIG4gJWQgbSAlZCBiY2xrX24gJWRcbiIsCisJCWFpYzMxeHhfZGl2c1tpXS5wbGxfaiwgYWljMzF4eF9kaXZzW2ldLnBsbF9kLAorCQlhaWMzMXh4X2RpdnNbaV0ucF92YWwsIGFpYzMxeHhfZGl2c1tpXS5kb3NyLAorCQlhaWMzMXh4X2RpdnNbaV0ubmRhYywgYWljMzF4eF9kaXZzW2ldLm1kYWMsCisJCWFpYzMxeHhfZGl2c1tpXS5hb3NyLCBhaWMzMXh4X2RpdnNbaV0ubmFkYywKKwkJYWljMzF4eF9kaXZzW2ldLm1hZGMsIGJjbGtfbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJdTggZGF0YSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIjIyAlczogZm9ybWF0ICVkIHdpZHRoICVkIHJhdGUgJWRcbiIsCisJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc193aWR0aChwYXJhbXMpLAorCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDE2OgorCQlicmVhazsKKwljYXNlIDIwOgorCQlkYXRhID0gKEFJQzMxWFhfV09SRF9MRU5fMjBCSVRTIDw8CisJCQlBSUMzMVhYX0lGQUNFMV9EQVRBTEVOX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJZGF0YSA9IChBSUMzMVhYX1dPUkRfTEVOXzI0QklUUyA8PAorCQkJQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWRhdGEgPSAoQUlDMzFYWF9XT1JEX0xFTl8zMkJJVFMgPDwKKwkJCUFJQzMxWFhfSUZBQ0UxX0RBVEFMRU5fU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5zdXBwb3J0ZWQgZm9ybWF0ICVkXG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfSUZBQ0UxLAorCQkJICAgIEFJQzMxWFhfSUZBQ0UxX0RBVEFMRU5fTUFTSywKKwkJCSAgICBkYXRhKTsKKworCXJldHVybiBhaWMzMXh4X3NldHVwX3BsbChjb2RlYywgcGFyYW1zKTsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2RhY19tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCisJaWYgKG11dGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9EQUNNVVRFLAorCQkJCSAgICBBSUMzMVhYX0RBQ01VVEVfTUFTSywKKwkJCQkgICAgQUlDMzFYWF9EQUNNVVRFX01BU0spOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfREFDTVVURSwKKwkJCQkgICAgQUlDMzFYWF9EQUNNVVRFX01BU0ssIDB4MCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTggaWZhY2VfcmVnMSA9IDA7CisJdTggaWZhY2VfcmVnMyA9IDA7CisJdTggZHNwX2FfdmFsID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiBmbXQgPSAweCV4XG4iLCBfX2Z1bmNfXywgZm10KTsKKworCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJaWZhY2VfcmVnMSB8PSBBSUMzMVhYX0JDTEtfTUFTVEVSIHwgQUlDMzFYWF9XQ0xLX01BU1RFUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2FsZXJ0KGNvZGVjLT5kZXYsICJJbnZhbGlkIERBSSBtYXN0ZXIvc2xhdmUgaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJZHNwX2FfdmFsID0gMHgxOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCS8qIE5PVEU6IEJDTEtJTlYgYml0IHZhbHVlIDEgZXF1YXMgTkIgYW5kIDAgZXF1YWxzIElCICovCisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWlmYWNlX3JlZzMgfD0gQUlDMzFYWF9CQ0xLSU5WX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWZhY2VfcmVnMSB8PSAoQUlDMzFYWF9EU1BfTU9ERSA8PAorCQkJICAgICAgIEFJQzMxWFhfSUZBQ0UxX0RBVEFUWVBFX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlpZmFjZV9yZWcxIHw9IChBSUMzMVhYX1JJR0hUX0pVU1RJRklFRF9NT0RFIDw8CisJCQkgICAgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfU0hJRlQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2VfcmVnMSB8PSAoQUlDMzFYWF9MRUZUX0pVU1RJRklFRF9NT0RFIDw8CisJCQkgICAgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIERBSSBpbnRlcmZhY2UgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9JRkFDRTEsCisJCQkgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfTUFTSyB8CisJCQkgICAgQUlDMzFYWF9JRkFDRTFfTUFTVEVSX01BU0ssCisJCQkgICAgaWZhY2VfcmVnMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9EQVRBX09GRlNFVCwKKwkJCSAgICBBSUMzMVhYX0RBVEFfT0ZGU0VUX01BU0ssCisJCQkgICAgZHNwX2FfdmFsKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0lGQUNFMiwKKwkJCSAgICBBSUMzMVhYX0JDTEtJTlZfTUFTSywKKwkJCSAgICBpZmFjZV9yZWczKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJICBpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiBjbGtfaWQgPSAlZCwgZnJlcSA9ICVkLCBkaXIgPSAlZFxuIiwKKwkJX19mdW5jX18sIGNsa19pZCwgZnJlcSwgZGlyKTsKKworCWZvciAoaSA9IDA7IGFpYzMxeHhfZGl2c1tpXS5tY2xrICE9IGZyZXE7IGkrKykgeworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGFpYzMxeHhfZGl2cykpIHsKKwkJCWRldl9lcnIoYWljMzF4eC0+ZGV2LCAiJXM6IFVuc3VwcG9ydGVkIGZyZXF1ZW5jeSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZnJlcSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIHNldCBjbG9jayBvbiBNQ0xLLCBCQ0xLLCBvciBHUElPMSBhcyBQTEwgaW5wdXQgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0NMS01VWCwgQUlDMzFYWF9QTExfQ0xLSU5fTUFTSywKKwkJCSAgICBjbGtfaWQgPDwgQUlDMzFYWF9QTExfQ0xLSU5fU0hJRlQpOworCisJYWljMzF4eC0+c3lzY2xrID0gZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3JlZ3VsYXRvcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFpYzMxeHhfZGlzYWJsZV9uYiAqZGlzYWJsZV9uYiA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGFpYzMxeHhfZGlzYWJsZV9uYiwgbmIpOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBkaXNhYmxlX25iLT5haWMzMXh4OworCisJaWYgKGV2ZW50ICYgUkVHVUxBVE9SX0VWRU5UX0RJU0FCTEUpIHsKKwkJLyoKKwkJICogUHV0IGNvZGVjIHRvIHJlc2V0IGFuZCBhcyBhdCBsZWFzdCBvbmUgb2YgdGhlCisJCSAqIHN1cHBsaWVzIHdhcyBkaXNhYmxlZC4KKwkJICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGFpYzMxeHgtPnBkYXRhLmdwaW9fcmVzZXQpKQorCQkJZ3Bpb19zZXRfdmFsdWUoYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCwgMCk7CisKKwkJcmVnY2FjaGVfbWFya19kaXJ0eShhaWMzMXh4LT5yZWdtYXApOworCQlkZXZfZGJnKGFpYzMxeHgtPmRldiwgIiMjICVzOiBESVNBQkxFIHJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpYzMxeHhfY2xrX29uKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTggbWFzayA9IEFJQzMxWFhfUE1fTUFTSzsKKwl1OCBvbiA9IEFJQzMxWFhfUE1fTUFTSzsKKworCWRldl9kYmcoY29kZWMtPmRldiwgImNvZGVjIGNsb2NrIC0+IG9uIChyYXRlICVkKVxuIiwKKwkJYWljMzF4eF9kaXZzW2FpYzMxeHgtPnJhdGVfZGl2X2xpbmVdLnJhdGUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfUExMUFIsIG1hc2ssIG9uKTsKKwltZGVsYXkoMTApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTkRBQywgbWFzaywgb24pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTURBQywgbWFzaywgb24pOworCWlmIChhaWMzMXh4X2RpdnNbYWljMzF4eC0+cmF0ZV9kaXZfbGluZV0ubmFkYykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9OQURDLCBtYXNrLCBvbik7CisJaWYgKGFpYzMxeHhfZGl2c1thaWMzMXh4LT5yYXRlX2Rpdl9saW5lXS5tYWRjKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01BREMsIG1hc2ssIG9uKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0JDTEtOLCBtYXNrLCBvbik7Cit9CisKK3N0YXRpYyB2b2lkIGFpYzMxeHhfY2xrX29mZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTggbWFzayA9IEFJQzMxWFhfUE1fTUFTSzsKKwl1OCBvZmYgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiY29kZWMgY2xvY2sgLT4gb2ZmXG4iKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0JDTEtOLCBtYXNrLCBvZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUFEQywgbWFzaywgb2ZmKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX05BREMsIG1hc2ssIG9mZik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9NREFDLCBtYXNrLCBvZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTkRBQywgbWFzaywgb2ZmKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX1BMTFBSLCBtYXNrLCBvZmYpOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfcG93ZXJfb24oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKSwKKwkJCQkgICAgYWljMzF4eC0+c3VwcGxpZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzMXh4LT5wZGF0YS5ncGlvX3Jlc2V0KSkgeworCQlncGlvX3NldF92YWx1ZShhaWMzMXh4LT5wZGF0YS5ncGlvX3Jlc2V0LCAxKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWljMzF4eC0+cmVnbWFwLCBmYWxzZSk7CisJcmV0ID0gcmVnY2FjaGVfc3luYyhhaWMzMXh4LT5yZWdtYXApOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlc3RvcmUgY2FjaGU6ICVkXG4iLCByZXQpOworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KGFpYzMxeHgtPnJlZ21hcCwgdHJ1ZSk7CisJCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhaWMzMXh4LT5zdXBwbGllcyksCisJCQkJICAgICAgIGFpYzMxeHgtPnN1cHBsaWVzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9wb3dlcl9vZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0ID0gMDsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWljMzF4eC0+cmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoYWljMzF4eC0+c3VwcGxpZXMpLAorCQkJCSAgICAgYWljMzF4eC0+c3VwcGxpZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiAlZCAtPiAlZFxuIiwgX19mdW5jX18sCisJCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwsIGxldmVsKTsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpCisJCQlhaWMzMXh4X2Nsa19vbihjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXN3aXRjaCAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCkgeworCQljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCQlhaWMzMXh4X3Bvd2VyX29uKGNvZGVjKTsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkJYWljMzF4eF9jbGtfb2ZmKGNvZGVjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCWFpYzMxeHhfcG93ZXJfb2ZmKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJYWljMzF4eF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWFpYzMxeHhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisKKwlkZXZfZGJnKGFpYzMxeHgtPmRldiwgIiMjICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlhaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlhaWMzMXh4LT5jb2RlYyA9IGNvZGVjOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljMzF4eC0+c3VwcGxpZXMpOyBpKyspIHsKKwkJYWljMzF4eC0+ZGlzYWJsZV9uYltpXS5uYi5ub3RpZmllcl9jYWxsID0KKwkJCWFpYzMxeHhfcmVndWxhdG9yX2V2ZW50OworCQlhaWMzMXh4LT5kaXNhYmxlX25iW2ldLmFpYzMxeHggPSBhaWMzMXh4OworCQlyZXQgPSByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoYWljMzF4eC0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQkJCQkgICZhaWMzMXh4LT5kaXNhYmxlX25iW2ldLm5iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmVnY2FjaGVfY2FjaGVfb25seShhaWMzMXh4LT5yZWdtYXAsIHRydWUpOworCXJlZ2NhY2hlX21hcmtfZGlydHkoYWljMzF4eC0+cmVnbWFwKTsKKworCXJldCA9IGFpYzMxeHhfYWRkX2NvbnRyb2xzKGNvZGVjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWljMzF4eF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisJLyogcG93ZXIgZG93biBjaGlwICovCisJYWljMzF4eF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaWMzMXh4LT5zdXBwbGllcyk7IGkrKykKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoYWljMzF4eC0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQkJCSAgICAgICZhaWMzMXh4LT5kaXNhYmxlX25iW2ldLm5iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kcml2ZXJfYWljMzF4eCA9IHsKKwkucHJvYmUJCQk9IGFpYzMxeHhfY29kZWNfcHJvYmUsCisJLnJlbW92ZQkJCT0gYWljMzF4eF9jb2RlY19yZW1vdmUsCisJLnN1c3BlbmQJCT0gYWljMzF4eF9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGFpYzMxeHhfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbAkJPSBhaWMzMXh4X3NldF9iaWFzX2xldmVsLAorCS5jb250cm9scwkJPSBhaWMzMXh4X3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljMzF4eF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMJCT0gYWljMzF4eF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFpYzMxeHhfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJCT0gYWljMzF4eF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWljMzF4eF9hdWRpb19tYXApLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWljMzF4eF9kYWlfb3BzID0geworCS5od19wYXJhbXMJPSBhaWMzMXh4X2h3X3BhcmFtcywKKwkuc2V0X3N5c2Nsawk9IGFpYzMxeHhfc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQJPSBhaWMzMXh4X3NldF9kYWlfZm10LAorCS5kaWdpdGFsX211dGUJPSBhaWMzMXh4X2RhY19tdXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWljMzF4eF9kYWlfZHJpdmVyW10gPSB7CisJeworCQkubmFtZSA9ICJ0bHYzMjBhaWMzMXh4LWhpZmkiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIlBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4JID0gMSwKKwkJCS5jaGFubmVsc19tYXgJID0gMiwKKwkJCS5yYXRlcwkJID0gQUlDMzFYWF9SQVRFUywKKwkJCS5mb3JtYXRzCSA9IEFJQzMxWFhfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIkNhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbgkgPSAxLAorCQkJLmNoYW5uZWxzX21heAkgPSAyLAorCQkJLnJhdGVzCQkgPSBBSUMzMVhYX1JBVEVTLAorCQkJLmZvcm1hdHMJID0gQUlDMzFYWF9GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFpYzMxeHhfZGFpX29wcywKKwkJLnN5bW1ldHJpY19yYXRlcyA9IDEsCisJfQorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGx2MzIwYWljMzF4eF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzEweCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMXgiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTAwIiB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzExMCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMjAiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTExIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRsdjMyMGFpYzMxeHhfb2ZfbWF0Y2gpOworCitzdGF0aWMgdm9pZCBhaWMzMXh4X3BkYXRhX2Zyb21fb2Yoc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWljMzF4eC0+ZGV2LT5vZl9ub2RlOworCXVuc2lnbmVkIGludCB2YWx1ZSA9IE1JQ0JJQVNfMl8wVjsKKwlpbnQgcmV0OworCisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhaTMxeHgtbWljYmlhcy12ZyIsICZ2YWx1ZSk7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgTUlDQklBU18yXzBWOgorCWNhc2UgTUlDQklBU18yXzVWOgorCWNhc2UgTUlDQklBU19BVkREVjoKKwkJYWljMzF4eC0+cGRhdGEubWljYmlhc192ZyA9IHZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwKKwkJCSJCYWQgYWkzMXh4LW1pY2JpYXMtdmcgdmFsdWUgJWQgRFRcbiIsCisJCQl2YWx1ZSk7CisJCWFpYzMxeHgtPnBkYXRhLm1pY2JpYXNfdmcgPSBNSUNCSUFTXzJfMFY7CisJfQorCisJcmV0ID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJncGlvLXJlc2V0IiwgMCk7CisJaWYgKHJldCA+IDApCisJCWFpYzMxeHgtPnBkYXRhLmdwaW9fcmVzZXQgPSByZXQ7Cit9CisjZWxzZSAvKiBDT05GSUdfT0YgKi8KK3N0YXRpYyB2b2lkIGFpYzMxeHhfcGRhdGFfZnJvbV9vZihzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4KQoreworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgdm9pZCBhaWMzMXh4X2RldmljZV9pbml0KHN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHgpCit7CisJaW50IHJldCwgaTsKKworCWRldl9zZXRfZHJ2ZGF0YShhaWMzMXh4LT5kZXYsIGFpYzMxeHgpOworCisJaWYgKGRldl9nZXRfcGxhdGRhdGEoYWljMzF4eC0+ZGV2KSkKKwkJbWVtY3B5KCZhaWMzMXh4LT5wZGF0YSwgZGV2X2dldF9wbGF0ZGF0YShhaWMzMXh4LT5kZXYpLAorCQkgICAgICAgc2l6ZW9mKGFpYzMxeHgtPnBkYXRhKSk7CisJZWxzZSBpZiAoYWljMzF4eC0+ZGV2LT5vZl9ub2RlKQorCQlhaWMzMXh4X3BkYXRhX2Zyb21fb2YoYWljMzF4eCk7CisKKwlpZiAoYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCkgeworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoYWljMzF4eC0+ZGV2LAorCQkJCQkgICAgYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCwKKwkJCQkJICAgIEdQSU9GX09VVF9JTklUX0hJR0gsCisJCQkJCSAgICAiYWljMzF4eC1yZXNldC1waW4iKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoYWljMzF4eC0+ZGV2LCAibm90IGFibGUgdG8gYWNxdWlyZSBncGlvXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKTsgaSsrKQorCQlhaWMzMXh4LT5zdXBwbGllc1tpXS5zdXBwbHkgPSBhaWMzMXh4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGFpYzMxeHgtPmRldiwKKwkJCQkgICAgICBBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKSwKKwkJCQkgICAgICBhaWMzMXh4LT5zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4OworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcF9jb25maWc7CisKKwlkZXZfZGJnKCZpMmMtPmRldiwgIiMjICVzOiAlcyBjb2RlY190eXBlID0gJWRcbiIsIF9fZnVuY19fLAorCQlpZC0+bmFtZSwgKGludCkgaWQtPmRyaXZlcl9kYXRhKTsKKworCXJlZ21hcF9jb25maWcgPSAmYWljMzF4eF9pMmNfcmVnbWFwOworCisJYWljMzF4eCA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZigqYWljMzF4eCksIEdGUF9LRVJORUwpOworCWlmIChhaWMzMXh4ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWljMzF4eC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCByZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGFpYzMxeHgtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihhaWMzMXh4LT5yZWdtYXApOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYWljMzF4eC0+ZGV2ID0gJmkyYy0+ZGV2OworCisJYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKKworCWFpYzMxeHhfZGV2aWNlX2luaXQoYWljMzF4eCk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZHJpdmVyX2FpYzMxeHgsCisJCQkJICAgICBhaWMzMXh4X2RhaV9kcml2ZXIsCisJCQkJICAgICBBUlJBWV9TSVpFKGFpYzMxeHhfZGFpX2RyaXZlcikpOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWljMzF4eF9pMmNfaWRbXSA9IHsKKwl7ICJ0bHYzMjBhaWMzMTB4IiwgQUlDMzEwMCB9LAorCXsgInRsdjMyMGFpYzMxMXgiLCBBSUMzMTEwIH0sCisJeyAidGx2MzIwYWljMzEwMCIsIEFJQzMxMDAgfSwKKwl7ICJ0bHYzMjBhaWMzMTEwIiwgQUlDMzExMCB9LAorCXsgInRsdjMyMGFpYzMxMjAiLCBBSUMzMTIwIH0sCisJeyAidGx2MzIwYWljMzExMSIsIEFJQzMxMTEgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWljMzF4eF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWljMzF4eF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInRsdjMyMGFpYzMxeHgtY29kZWMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRsdjMyMGFpYzMxeHhfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCQk9IGFpYzMxeHhfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gYWljMzF4eF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGFpYzMxeHhfaTJjX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoYWljMzF4eF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFRMVjMyMEFJQzMxMTEgY29kZWMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKeXJpIFNhcmhhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZWQ1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIEFMU0EgU29DIFRMVjMyMEFJQzMxWFggY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworI2lmbmRlZiBfVExWMzIwQUlDMzFYWF9ICisjZGVmaW5lIF9UTFYzMjBBSUMzMVhYX0gKKworI2RlZmluZSBBSUMzMVhYX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisKKyNkZWZpbmUgQUlDMzFYWF9GT1JNQVRTCShTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSBcCisJCQkgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworCisjZGVmaW5lIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUCTB4MQorI2RlZmluZSBBSUMzMVhYX01JTklEU1BfQklUCQkweDIKKworZW51bSBhaWMzMXh4X3R5cGUgeworCUFJQzMxMDAJPSAwLAorCUFJQzMxMTAgPSBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCwKKwlBSUMzMTIwID0gQUlDMzFYWF9NSU5JRFNQX0JJVCwKKwlBSUMzMTExID0gKEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUIHwgQUlDMzFYWF9NSU5JRFNQX0JJVCksCit9OworCitzdHJ1Y3QgYWljMzF4eF9wZGF0YSB7CisJZW51bSBhaWMzMXh4X3R5cGUgY29kZWNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19yZXNldDsKKwlpbnQgbWljYmlhc192ZzsKK307CisKKy8qIFBhZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BBR0VDVEwJCQkJMHgwMAorCisvKiBQYWdlIDAgUmVnaXN0ZXJzICovCisvKiBTb2Z0d2FyZSByZXNldCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1JFU0VUCQkJCTB4MDEKKy8qIE9UIEZMQUcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUlDMzFYWF9PVF9GTEFHCQkJCTB4MDMKKy8qIENsb2NrIGNsb2NrIEdlbiBtdXhpbmcsIE11bHRpcGxleGVycyovCisjZGVmaW5lIEFJQzMxWFhfQ0xLTVVYCQkJCTB4MDQKKy8qIFBMTCBQIGFuZCBSLVZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTFBSCQkJCTB4MDUKKy8qIFBMTCBKLVZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTEoJCQkJMHgwNgorLyogUExMIEQtVkFMIE1TQiByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTERNU0IJCQkJMHgwNworLyogUExMIEQtVkFMIExTQiByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTERMU0IJCQkJMHgwOAorLyogREFDIE5EQUNfVkFMIHJlZ2lzdGVyKi8KKyNkZWZpbmUgQUlDMzFYWF9OREFDCQkJCTB4MEIKKy8qIERBQyBNREFDX1ZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX01EQUMJCQkJMHgwQworLyogREFDIE9TUiBzZXR0aW5nIHJlZ2lzdGVyIDEsIE1TQiB2YWx1ZSAqLworI2RlZmluZSBBSUMzMVhYX0RPU1JNU0IJCQkJMHgwRAorLyogREFDIE9TUiBzZXR0aW5nIHJlZ2lzdGVyIDIsIExTQiB2YWx1ZSAqLworI2RlZmluZSBBSUMzMVhYX0RPU1JMU0IJCQkJMHgwRQorI2RlZmluZSBBSUMzMVhYX01JTklfRFNQX0lOUE9MCQkJMHgxMAorLyogQ2xvY2sgc2V0dGluZyByZWdpc3RlciA4LCBQTEwgKi8KKyNkZWZpbmUgQUlDMzFYWF9OQURDCQkJCTB4MTIKKy8qIENsb2NrIHNldHRpbmcgcmVnaXN0ZXIgOSwgUExMICovCisjZGVmaW5lIEFJQzMxWFhfTUFEQwkJCQkweDEzCisvKiBBREMgT3ZlcnNhbXBsaW5nIChBT1NSKSBSZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX0FPU1IJCQkJMHgxNAorLyogQ2xvY2sgc2V0dGluZyByZWdpc3RlciA5LCBNdWx0aXBsZXhlcnMgKi8KKyNkZWZpbmUgQUlDMzFYWF9DTEtPVVRNVVgJCQkweDE5CisvKiBDbG9jayBzZXR0aW5nIHJlZ2lzdGVyIDEwLCBDTE9DS09VVCBNIGRpdmlkZXIgdmFsdWUgKi8KKyNkZWZpbmUgQUlDMzFYWF9DTEtPVVRNVkFMCQkJMHgxQQorLyogQXVkaW8gSW50ZXJmYWNlIFNldHRpbmcgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBBSUMzMVhYX0lGQUNFMQkJCQkweDFCCisvKiBBdWRpbyBEYXRhIFNsb3QgT2Zmc2V0IFByb2dyYW1taW5nICovCisjZGVmaW5lIEFJQzMxWFhfREFUQV9PRkZTRVQJCQkweDFDCisvKiBBdWRpbyBJbnRlcmZhY2UgU2V0dGluZyBSZWdpc3RlciAyICovCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UyCQkJCTB4MUQKKy8qIENsb2NrIHNldHRpbmcgcmVnaXN0ZXIgMTEsIEJDTEsgTiBEaXZpZGVyICovCisjZGVmaW5lIEFJQzMxWFhfQkNMS04JCQkJMHgxRQorLyogQXVkaW8gSW50ZXJmYWNlIFNldHRpbmcgUmVnaXN0ZXIgMywgU2Vjb25kYXJ5IEF1ZGlvIEludGVyZmFjZSAqLworI2RlZmluZSBBSUMzMVhYX0lGQUNFU0VDMQkJCTB4MUYKKy8qIEF1ZGlvIEludGVyZmFjZSBTZXR0aW5nIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgQUlDMzFYWF9JRkFDRVNFQzIJCQkweDIwCisvKiBBdWRpbyBJbnRlcmZhY2UgU2V0dGluZyBSZWdpc3RlciA1ICovCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0VTRUMzCQkJMHgyMQorLyogSTJDIEJ1cyBDb25kaXRpb24gKi8KKyNkZWZpbmUgQUlDMzFYWF9JMkMJCQkJMHgyMgorLyogQURDIEZMQUcgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENGTEFHCQkJCTB4MjQKKy8qIERBQyBGbGFnIFJlZ2lzdGVycyAqLworI2RlZmluZSBBSUMzMVhYX0RBQ0ZMQUcxCQkJMHgyNQorI2RlZmluZSBBSUMzMVhYX0RBQ0ZMQUcyCQkJMHgyNgorLyogU3RpY2t5IEludGVycnVwdCBmbGFnIChvdmVyZmxvdykgKi8KKyNkZWZpbmUgQUlDMzFYWF9PRkZMQUcJCQkJMHgyNworLyogU3RpY3kgREFDIEludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBBSUMzMVhYX0lOVFJEQUNGTEFHCQkJMHgyQworLyogU3RpY3kgQURDIEludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBBSUMzMVhYX0lOVFJBRENGTEFHCQkJMHgyRAorLyogREFDIEludGVycnVwdCBmbGFncyAyICovCisjZGVmaW5lIEFJQzMxWFhfSU5UUkRBQ0ZMQUcyCQkJMHgyRQorLyogQURDIEludGVycnVwdCBmbGFncyAyICovCisjZGVmaW5lIEFJQzMxWFhfSU5UUkFEQ0ZMQUcyCQkJMHgyRgorLyogSU5UMSBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0lOVDFDVFJMCQkJMHgzMAorLyogSU5UMiBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0lOVDJDVFJMCQkJMHgzMQorLyogR1BJTzEgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0dQSU8xCQkJCTB4MzMKKworI2RlZmluZSBBSUMzMVhYX0RBQ1BSQgkJCQkweDNDCisvKiBBREMgSW5zdHJ1Y3Rpb24gU2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIEFJQzMxWFhfQURDUFJCCQkJCTB4M0QKKy8qIERBQyBjaGFubmVsIHNldHVwIHJlZ2lzdGVyICovCisjZGVmaW5lIEFJQzMxWFhfREFDU0VUVVAJCQkweDNGCisvKiBEQUMgTXV0ZSBhbmQgdm9sdW1lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQUNNVVRFCQkJCTB4NDAKKy8qIExlZnQgREFDIGNoYW5uZWwgZGlnaXRhbCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0xEQUNWT0wJCQkJMHg0MQorLyogUmlnaHQgREFDIGNoYW5uZWwgZGlnaXRhbCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX1JEQUNWT0wJCQkJMHg0MgorLyogSGVhZHNldCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgQUlDMzFYWF9IU0RFVEVDVAkJCTB4NDMKKy8qIEFEQyBEaWdpdGFsIE1pYyAqLworI2RlZmluZSBBSUMzMVhYX0FEQ1NFVFVQCQkJMHg1MQorLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgRmluZSBBZGp1c3QgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENGR0EJCQkJMHg1MgorLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgQ29hcnNlIEFkanVzdCAqLworI2RlZmluZSBBSUMzMVhYX0FEQ1ZPTAkJCQkweDUzCisKKworLyogUGFnZSAxIFJlZ2lzdGVycyAqLworLyogSGVhZHBob25lIGRyaXZlcnMgKi8KKyNkZWZpbmUgQUlDMzFYWF9IUERSSVZFUgkJCTB4OUYKKy8qIENsYXNzLUQgU3BlYWtlYXIgQW1wbGlmaWVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BLQU1QCQkJCTB4QTAKKy8qIEhQIE91dHB1dCBEcml2ZXJzIFBPUCBSZW1vdmFsIFNldHRpbmdzICovCisjZGVmaW5lIEFJQzMxWFhfSFBQT1AJCQkJMHhBMQorLyogT3V0cHV0IERyaXZlciBQR0EgUmFtcC1Eb3duIFBlcmlvZCBDb250cm9sICovCisjZGVmaW5lIEFJQzMxWFhfU1BQR0FSQU1QCQkJMHhBMgorLyogREFDX0wgYW5kIERBQ19SIE91dHB1dCBNaXhlciBSb3V0aW5nICovCisjZGVmaW5lIEFJQzMxWFhfREFDTUlYRVJST1VURQkJCTB4QTMKKy8qIExlZnQgQW5hbG9nIFZvbCB0byBIUEwgKi8KKyNkZWZpbmUgQUlDMzFYWF9MQU5BTE9HSFBMCQkJMHhBNAorLyogUmlnaHQgQW5hbG9nIFZvbCB0byBIUFIgKi8KKyNkZWZpbmUgQUlDMzFYWF9SQU5BTE9HSFBSCQkJMHhBNQorLyogTGVmdCBBbmFsb2cgVm9sIHRvIFNQTCAqLworI2RlZmluZSBBSUMzMVhYX0xBTkFMT0dTUEwJCQkweEE2CisvKiBSaWdodCBBbmFsb2cgVm9sIHRvIFNQUiAqLworI2RlZmluZSBBSUMzMVhYX1JBTkFMT0dTUFIJCQkweEE3CisvKiBIUEwgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfSFBMR0FJTgkJCQkweEE4CisvKiBIUFIgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfSFBSR0FJTgkJCQkweEE5CisvKiBTUEwgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BMR0FJTgkJCQkweEFBCisvKiBTUFIgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BSR0FJTgkJCQkweEFCCisvKiBIUCBEcml2ZXIgQ29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0hQQ09OVFJPTAkJCTB4QUMKKy8qIE1JQyBCaWFzIENvbnRyb2wgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNCSUFTCQkJCTB4QUUKKy8qIE1JQyBQR0EqLworI2RlZmluZSBBSUMzMVhYX01JQ1BHQQkJCQkweEFGCisvKiBEZWx0YS1TaWdtYSBNb25vIEFEQyBDaGFubmVsIEZpbmUtR2FpbiBJbnB1dCBTZWxlY3Rpb24gZm9yIFAtVGVybWluYWwgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNQR0FQSQkJCTB4QjAKKy8qIEFEQyBJbnB1dCBTZWxlY3Rpb24gZm9yIE0tVGVybWluYWwgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNQR0FNSQkJCTB4QjEKKy8qIElucHV0IENNIFNldHRpbmdzICovCisjZGVmaW5lIEFJQzMxWFhfTUlDUEdBQ00JCQkweEIyCisKKy8qIEJpdHMsIG1hc2tzIGFuZCBzaGlmdHMgKi8KKworLyogQUlDMzFYWF9DTEtNVVggKi8KKyNkZWZpbmUgQUlDMzFYWF9QTExfQ0xLSU5fTUFTSwkJCTB4MGMKKyNkZWZpbmUgQUlDMzFYWF9QTExfQ0xLSU5fU0hJRlQJCQkyCisjZGVmaW5lIEFJQzMxWFhfUExMX0NMS0lOX01DTEsJCQkwCisjZGVmaW5lIEFJQzMxWFhfQ09ERUNfQ0xLSU5fTUFTSwkJMHgwMworI2RlZmluZSBBSUMzMVhYX0NPREVDX0NMS0lOX1NISUZUCQkwCisjZGVmaW5lIEFJQzMxWFhfQ09ERUNfQ0xLSU5fUExMCQkJMworI2RlZmluZSBBSUMzMVhYX0NPREVDX0NMS0lOX0JDTEsJCTEKKworLyogQUlDMzFYWF9QTExQUiwgQUlDMzFYWF9OREFDLCBBSUMzMVhYX01EQUMsIEFJQzMxWFhfTkFEQywgQUlDMzFYWF9NQURDLAorICAgQUlDMzFYWF9CQ0xLTiAqLworI2RlZmluZSBBSUMzMVhYX1BMTF9NQVNLCQkweDdmCisjZGVmaW5lIEFJQzMxWFhfUE1fTUFTSwkJCTB4ODAKKworLyogQUlDMzFYWF9JRkFDRTEgKi8KKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8xNkJJVFMJCTB4MDAKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8yMEJJVFMJCTB4MDEKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8yNEJJVFMJCTB4MDIKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8zMkJJVFMJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9NQVNLCTB4MzAKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9TSElGVAkoNCkKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfTUFTSwkweEMwCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UxX0RBVEFUWVBFX1NISUZUCSg2KQorI2RlZmluZSBBSUMzMVhYX0kyU19NT0RFCQkweDAwCisjZGVmaW5lIEFJQzMxWFhfRFNQX01PREUJCTB4MDEKKyNkZWZpbmUgQUlDMzFYWF9SSUdIVF9KVVNUSUZJRURfTU9ERQkweDAyCisjZGVmaW5lIEFJQzMxWFhfTEVGVF9KVVNUSUZJRURfTU9ERQkweDAzCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UxX01BU1RFUl9NQVNLCTB4MEMKKyNkZWZpbmUgQUlDMzFYWF9CQ0xLX01BU1RFUgkJMHgwOAorI2RlZmluZSBBSUMzMVhYX1dDTEtfTUFTVEVSCQkweDA0CisKKy8qIEFJQzMxWFhfREFUQV9PRkZTRVQgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQVRBX09GRlNFVF9NQVNLCTB4RkYKKworLyogQUlDMzFYWF9JRkFDRTIgKi8KKyNkZWZpbmUgQUlDMzFYWF9CQ0xLSU5WX01BU0sJCTB4MDgKKyNkZWZpbmUgQUlDMzFYWF9CRElWQ0xLX01BU0sJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9EQUMyQkNMSwkJMHgwMAorI2RlZmluZSBBSUMzMVhYX0RBQ01PRDJCQ0xLCQkweDAxCisjZGVmaW5lIEFJQzMxWFhfQURDMkJDTEsJCTB4MDIKKyNkZWZpbmUgQUlDMzFYWF9BRENNT0QyQkNMSwkJMHgwMworCisvKiBBSUMzMVhYX0FEQ0ZMQUcgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENQV1JTVEFUVVNfTUFTSwkJMHg0MAorCisvKiBBSUMzMVhYX0RBQ0ZMQUcxICovCisjZGVmaW5lIEFJQzMxWFhfTERBQ1BXUlNUQVRVU19NQVNLCQkweDgwCisjZGVmaW5lIEFJQzMxWFhfUkRBQ1BXUlNUQVRVU19NQVNLCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfSFBMRFJWUFdSU1RBVFVTX01BU0sJCTB4MjAKKyNkZWZpbmUgQUlDMzFYWF9IUFJEUlZQV1JTVEFUVVNfTUFTSwkJMHgwMgorI2RlZmluZSBBSUMzMVhYX1NQTERSVlBXUlNUQVRVU19NQVNLCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfU1BSRFJWUFdSU1RBVFVTX01BU0sJCTB4MDEKKworLyogQUlDMzFYWF9JTlRSREFDRkxBRyAqLworI2RlZmluZSBBSUMzMVhYX0hQU0NERVRFQ1RfTUFTSwkJCTB4ODAKKyNkZWZpbmUgQUlDMzFYWF9CVVRUT05QUkVTU19NQVNLCQkweDIwCisjZGVmaW5lIEFJQzMxWFhfSFNQTFVHX01BU0sJCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfTERSQ1RIUkVTX01BU0sJCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfUkRSQ1RIUkVTX01BU0sJCQkweDA0CisjZGVmaW5lIEFJQzMxWFhfREFDU0lOVF9NQVNLCQkJMHgwMgorI2RlZmluZSBBSUMzMVhYX0RBQ0FJTlRfTUFTSwkJCTB4MDEKKworLyogQUlDMzFYWF9JTlQxQ1RSTCAqLworI2RlZmluZSBBSUMzMVhYX0hTUExVR0RFVF9NQVNLCQkJMHg4MAorI2RlZmluZSBBSUMzMVhYX0JVVFRPTlBSRVNTREVUX01BU0sJCTB4NDAKKyNkZWZpbmUgQUlDMzFYWF9EUkNUSFJFU19NQVNLCQkJMHgyMAorI2RlZmluZSBBSUMzMVhYX0FHQ05PSVNFX01BU0sJCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfT0NfTUFTSwkJCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfRU5HSU5FX01BU0sJCQkweDA0CisKKy8qIEFJQzMxWFhfREFDU0VUVVAgKi8KKyNkZWZpbmUgQUlDMzFYWF9TT0ZUU1RFUF9NQVNLCQkJMHgwMworCisvKiBBSUMzMVhYX0RBQ01VVEUgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQUNNVVRFX01BU0sJCQkweDBDCisKKy8qIEFJQzMxWFhfTUlDQklBUyAqLworI2RlZmluZSBBSUMzMVhYX01JQ0JJQVNfTUFTSwkJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9NSUNCSUFTX1NISUZUCQkJMAorCisjZW5kaWYJLyogX1RMVjMyMEFJQzMxWFhfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwppbmRleCA2ODgxNTFiLi4xZDliMTE3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwpAQCAtMjksOSArMjksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8c291bmQvdGx2MzIwYWljMzJ4NC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTY2LDIwICs2OSwzMiBAQAogCXUzMiBtaWNwZ2Ffcm91dGluZzsKIAlib29sIHN3YXBkYWNzOwogCWludCByc3RuX2dwaW87CisJc3RydWN0IGNsayAqbWNsazsKKworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseV9sZG87CisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5X2lvdjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHlfZHY7CisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5X2F2OwogfTsKIAotLyogMGRCIG1pbiwgMWRCIHN0ZXBzICovCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUodGx2X3N0ZXBfMSwgMCwgMTAwLCAwKTsKIC8qIDBkQiBtaW4sIDAuNWRCIHN0ZXBzICovCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUodGx2X3N0ZXBfMF81LCAwLCA1MCwgMCk7CisvKiAtNjMuNWRCIG1pbiwgMC41ZEIgc3RlcHMgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0bHZfcGNtLCAtNjM1MCwgNTAsIDApOworLyogLTZkQiBtaW4sIDFkQiBzdGVwcyAqLworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKHRsdl9kcml2ZXJfZ2FpbiwgLTYwMCwgMTAwLCAwKTsKKy8qIC0xMmRCIG1pbiwgMC41ZEIgc3RlcHMgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0bHZfYWRjX3ZvbCwgLTEyMDAsIDUwLCAwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMyeDRfc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0RPVUJMRV9SX1RMVigiUENNIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMyWDRfTERBQ1ZPTCwKLQkJCUFJQzMyWDRfUkRBQ1ZPTCwgMCwgMHgzMCwgMCwgdGx2X3N0ZXBfMF81KSwKLQlTT0NfRE9VQkxFX1JfVExWKCJIUCBEcml2ZXIgR2FpbiBWb2x1bWUiLCBBSUMzMlg0X0hQTEdBSU4sCi0JCQlBSUMzMlg0X0hQUkdBSU4sIDAsIDB4MUQsIDAsIHRsdl9zdGVwXzEpLAotCVNPQ19ET1VCTEVfUl9UTFYoIkxPIERyaXZlciBHYWluIFZvbHVtZSIsIEFJQzMyWDRfTE9MR0FJTiwKLQkJCUFJQzMyWDRfTE9SR0FJTiwgMCwgMHgxRCwgMCwgdGx2X3N0ZXBfMSksCisJU09DX0RPVUJMRV9SX1NfVExWKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgQUlDMzJYNF9MREFDVk9MLAorCQkJQUlDMzJYNF9SREFDVk9MLCAwLCAtMHg3ZiwgMHgzMCwgNywgMCwgdGx2X3BjbSksCisJU09DX0RPVUJMRV9SX1NfVExWKCJIUCBEcml2ZXIgR2FpbiBWb2x1bWUiLCBBSUMzMlg0X0hQTEdBSU4sCisJCQlBSUMzMlg0X0hQUkdBSU4sIDAsIC0weDYsIDB4MWQsIDUsIDAsCisJCQl0bHZfZHJpdmVyX2dhaW4pLAorCVNPQ19ET1VCTEVfUl9TX1RMVigiTE8gRHJpdmVyIEdhaW4gVm9sdW1lIiwgQUlDMzJYNF9MT0xHQUlOLAorCQkJQUlDMzJYNF9MT1JHQUlOLCAwLCAtMHg2LCAweDFkLCA1LCAwLAorCQkJdGx2X2RyaXZlcl9nYWluKSwKIAlTT0NfRE9VQkxFX1IoIkhQIERBQyBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMlg0X0hQTEdBSU4sCiAJCQlBSUMzMlg0X0hQUkdBSU4sIDYsIDB4MDEsIDEpLAogCVNPQ19ET1VCTEVfUigiTE8gREFDIFBsYXliYWNrIFN3aXRjaCIsIEFJQzMyWDRfTE9MR0FJTiwKQEAgLTkwLDggKzEwNSw4IEBACiAJU09DX1NJTkdMRSgiQURDRkdBIExlZnQgTXV0ZSBTd2l0Y2giLCBBSUMzMlg0X0FEQ0ZHQSwgNywgMSwgMCksCiAJU09DX1NJTkdMRSgiQURDRkdBIFJpZ2h0IE11dGUgU3dpdGNoIiwgQUlDMzJYNF9BRENGR0EsIDMsIDEsIDApLAogCi0JU09DX0RPVUJMRV9SX1RMVigiQURDIExldmVsIFZvbHVtZSIsIEFJQzMyWDRfTEFEQ1ZPTCwKLQkJCUFJQzMyWDRfUkFEQ1ZPTCwgMCwgMHgyOCwgMCwgdGx2X3N0ZXBfMF81KSwKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQyBMZXZlbCBWb2x1bWUiLCBBSUMzMlg0X0xBRENWT0wsCisJCQlBSUMzMlg0X1JBRENWT0wsIDAsIC0weDE4LCAweDI4LCA2LCAwLCB0bHZfYWRjX3ZvbCksCiAJU09DX0RPVUJMRV9SX1RMVigiUEdBIExldmVsIFZvbHVtZSIsIEFJQzMyWDRfTE1JQ1BHQVZPTCwKIAkJCUFJQzMyWDRfUk1JQ1BHQVZPTCwgMCwgMHg1ZiwgMCwgdGx2X3N0ZXBfMF81KSwKIApAQCAtNDgwLDggKzQ5NSwxOCBAQAogc3RhdGljIGludCBhaWMzMng0X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogeworCXN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQkvKiBTd2l0Y2ggb24gbWFzdGVyIGNsb2NrICovCisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhaWMzMng0LT5tY2xrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBtYXN0ZXIgY2xvY2tcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCiAJCS8qIFN3aXRjaCBvbiBQTEwgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKIAkJCQkgICAgQUlDMzJYNF9QTExFTiwgQUlDMzJYNF9QTExFTik7CkBAIC01MDksMjkgKzUzNCwzMiBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCS8qIFN3aXRjaCBvZmYgUExMICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfUExMUFIsCi0JCQkJICAgIEFJQzMyWDRfUExMRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTkRBQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgQUlDMzJYNF9OREFDRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTURBQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTURBQywKLQkJCQkgICAgQUlDMzJYNF9NREFDRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTkFEQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkFEQywKLQkJCQkgICAgQUlDMzJYNF9OQURDRU4sIDApOworCQkvKiBTd2l0Y2ggb2ZmIEJDTEtfTiBEaXZpZGVyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCisJCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKIAogCQkvKiBTd2l0Y2ggb2ZmIE1BREMgRGl2aWRlciAqLwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01BREMsCiAJCQkJICAgIEFJQzMyWDRfTUFEQ0VOLCAwKTsKIAotCQkvKiBTd2l0Y2ggb2ZmIEJDTEtfTiBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCi0JCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKKwkJLyogU3dpdGNoIG9mZiBOQURDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9OQURDLAorCQkJCSAgICBBSUMzMlg0X05BRENFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBNREFDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9NREFDLAorCQkJCSAgICBBSUMzMlg0X01EQUNFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBOREFDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9OREFDLAorCQkJCSAgICBBSUMzMlg0X05EQUNFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBQTEwgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKKwkJCQkgICAgQUlDMzJYNF9QTExFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBtYXN0ZXIgY2xvY2sgKi8KKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFpYzMyeDQtPm1jbGspOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCWJyZWFrOwpAQCAtNTg2LDkgKzYxNCw3IEBACiAJc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXUzMiB0bXBfcmVnOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQotCWlmIChhaWMzMng0LT5yc3RuX2dwaW8gPj0gMCkgeworCWlmIChncGlvX2lzX3ZhbGlkKGFpYzMyeDQtPnJzdG5fZ3BpbykpIHsKIAkJbmRlbGF5KDEwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoYWljMzJ4NC0+cnN0bl9ncGlvLCAxKTsKIAl9CkBAIC02NjMsMTEgKzY4OSwxMjIgQEAKIAkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fcm91dGVzKSwKIH07CiAKK3N0YXRpYyBpbnQgYWljMzJ4NF9wYXJzZV9kdChzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0LAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWFpYzMyeDQtPnN3YXBkYWNzID0gZmFsc2U7CisJYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgPSAwOworCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicmVzZXQtZ3Bpb3MiLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaWMzMng0X2Rpc2FibGVfcmVndWxhdG9ycyhzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0KQoreworCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9pb3YpOworCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2R2KTsKKworCWlmICghSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9hdikpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9hdik7Cit9CisKK3N0YXRpYyBpbnQgYWljMzJ4NF9zZXR1cF9yZWd1bGF0b3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWFpYzMyeDQtPnN1cHBseV9sZG8gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoZGV2LCAibGRvaW4iKTsKKwlhaWMzMng0LT5zdXBwbHlfaW92ID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgImlvdiIpOworCWFpYzMyeDQtPnN1cHBseV9kdiA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJkdiIpOworCWFpYzMyeDQtPnN1cHBseV9hdiA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJhdiIpOworCisJLyogQ2hlY2sgaWYgdGhlIHJlZ3VsYXRvciByZXF1aXJlbWVudHMgYXJlIGZ1bGZpbGxlZCAqLworCisJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfaW92KSkgeworCQlkZXZfZXJyKGRldiwgIk1pc3Npbmcgc3VwcGx5ICdpb3YnXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2lvdik7CisJfQorCisJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSkgeworCQlpZiAoUFRSX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwkJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfZHYpKSB7CisJCQlkZXZfZXJyKGRldiwgIk1pc3Npbmcgc3VwcGx5ICdkdicgb3IgJ2xkb2luJ1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihhaWMzMng0LT5zdXBwbHlfZHYpOworCQl9CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSkgeworCQkJZGV2X2VycihkZXYsICJNaXNzaW5nIHN1cHBseSAnYXYnIG9yICdsZG9pbidcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSAmJgorCQkJCVBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSAmJgorCQkJCVBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhaWMzMng0LT5zdXBwbHlfaW92KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3IgaW92XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGxkb1xuIik7CisJCQlnb3RvIGVycm9yX2xkbzsKKwkJfQorCX0KKworCWlmICghSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9kdikpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhaWMzMng0LT5zdXBwbHlfZHYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGR2XG4iKTsKKwkJCWdvdG8gZXJyb3JfZHY7CisJCX0KKwl9CisKKwlpZiAoIUlTX0VSUihhaWMzMng0LT5zdXBwbHlfYXYpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWljMzJ4NC0+c3VwcGx5X2F2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHJlZ3VsYXRvciBhdlxuIik7CisJCQlnb3RvIGVycm9yX2F2OworCQl9CisJfQorCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykgJiYgSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9hdikpCisJCWFpYzMyeDQtPnBvd2VyX2NmZyB8PSBBSUMzMlg0X1BXUl9BSUMzMlg0X0xET19FTkFCTEU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfYXY6CisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2R2KTsKKworZXJyb3JfZHY6CisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCitlcnJvcl9sZG86CisJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2lvdik7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhaWMzMng0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFpYzMyeDRfcGRhdGEgKnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBpMmMtPmRldi5vZl9ub2RlOwogCWludCByZXQ7CiAKIAlhaWMzMng0ID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBhaWMzMng0X3ByaXYpLApAQCAtNjg2LDYgKzgyMywxMiBAQAogCQlhaWMzMng0LT5zd2FwZGFjcyA9IHBkYXRhLT5zd2FwZGFjczsKIAkJYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgPSBwZGF0YS0+bWljcGdhX3JvdXRpbmc7CiAJCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IHBkYXRhLT5yc3RuX2dwaW87CisJfSBlbHNlIGlmIChucCkgeworCQlyZXQgPSBhaWMzMng0X3BhcnNlX2R0KGFpYzMyeDQsIG5wKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgRFQgbm9kZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlIHsKIAkJYWljMzJ4NC0+cG93ZXJfY2ZnID0gMDsKIAkJYWljMzJ4NC0+c3dhcGRhY3MgPSBmYWxzZTsKQEAgLTY5MywyMCArODM2LDQ0IEBACiAJCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IC0xOwogCX0KIAotCWlmIChhaWMzMng0LT5yc3RuX2dwaW8gPj0gMCkgeworCWFpYzMyeDQtPm1jbGsgPSBkZXZtX2Nsa19nZXQoJmkyYy0+ZGV2LCAibWNsayIpOworCWlmIChJU19FUlIoYWljMzJ4NC0+bWNsaykpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgZ2V0dGluZyB0aGUgbWNsay4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgdXNhZ2Ugb2YgdGhpcyBjb2RlYyB3aXRob3V0IG1jbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhaWMzMng0LT5tY2xrKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzMng0LT5yc3RuX2dwaW8pKSB7CiAJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmaTJjLT5kZXYsIGFpYzMyeDQtPnJzdG5fZ3BpbywKIAkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJ0bHYzMjBhaWMzMng0IHJzdG4iKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwlyZXQgPSBhaWMzMng0X3NldHVwX3JlZ3VsYXRvcnMoJmkyYy0+ZGV2LCBhaWMzMng0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHNldHVwIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWljMzJ4NCwgJmFpYzMyeDRfZGFpLCAxKTsKLQlyZXR1cm4gcmV0OworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWNcbiIpOworCQlhaWMzMng0X2Rpc2FibGVfcmVndWxhdG9ycyhhaWMzMng0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBhaWMzMng0KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFpYzMyeDRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWFpYzMyeDRfZGlzYWJsZV9yZWd1bGF0b3JzKGFpYzMyeDQpOworCiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC03MTcsMTAgKzg4NCwxNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhaWMzMng0X2kyY19pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpYzMyeDRfb2ZfaWRbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMyeDQiLCB9LAorCXsgLyogc2VuaXRlbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWljMzJ4NF9vZl9pZCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhaWMzMng0X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAidGx2MzIwYWljMzJ4NCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhaWMzMng0X29mX2lkLAogCX0sCiAJLnByb2JlID0gICAgYWljMzJ4NF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgYWljMzJ4NF9pMmNfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IDQ3MGZiZmIuLmIxODM1MTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTEzNDQsMTIgKzEzNDQsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZhaWMzeC0+bGlzdCk7CiAJYWljM3gtPmNvZGVjID0gY29kZWM7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljM3gtPnN1cHBsaWVzKTsgaSsrKSB7CiAJCWFpYzN4LT5kaXNhYmxlX25iW2ldLm5iLm5vdGlmaWVyX2NhbGwgPSBhaWMzeF9yZWd1bGF0b3JfZXZlbnQ7CiAJCWFpYzN4LT5kaXNhYmxlX25iW2ldLmFpYzN4ID0gYWljM3g7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggNGYzNTgzOS4uNmJmYzhhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAJdW5zaWduZWQgaW50IHV0aHI7CiAKIAllbnVtIGRhYzMzX3N0YXRlIHN0YXRlOwotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKQEAgLTQ2MSw3ICs0NjAsNyBAQAogCWlmIChkYWMzMy0+Zmlmb19tb2RlID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAkvKiBEbyBub3QgYWxsb3cgY2hhbmdlcyB3aGlsZSBzdHJlYW0gaXMgcnVubmluZyovCi0JaWYgKGNvZGVjLT5hY3RpdmUpCisJaWYgKHNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8IDAgfHwKQEAgLTQ3OCw5ICs0NzcsNyBAQAogCSJCeXBhc3MiLCAiTW9kZSAxIiwgIk1vZGUgNyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfZmlmb19tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShkYWMzM19maWZvX21vZGVfdGV4dHMpLAotCQkJICAgIGRhYzMzX2ZpZm9fbW9kZV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGRhYzMzX2ZpZm9fbW9kZV9lbnVtLCBkYWMzM19maWZvX21vZGVfdGV4dHMpOwogCiAvKiBML1IgTGluZSBPdXRwdXQgR2FpbiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmxyX2xpbmVvdXRfZ2Fpbl90ZXh0c1tdID0gewpAQCAtNDg4LDE1ICs0ODUsMTMgQEAKIAkiTGluZSAwZEIgREFDIDEyZEIiLCAiTGluZSA2ZEIgREFDIDE4ZEIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsX2xpbmVvdXRfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREFDMzNfTERBQ19QV1JfQ1RSTCwgMCwKLQkJCUFSUkFZX1NJWkUobHJfbGluZW91dF9nYWluX3RleHRzKSwKLQkJCWxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobF9saW5lb3V0X2dhaW5fZW51bSwKKwkJCSAgICBEQUMzM19MREFDX1BXUl9DVFJMLCAwLAorCQkJICAgIGxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcl9saW5lb3V0X2dhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBQzMzX1JEQUNfUFdSX0NUUkwsIDAsCi0JCQlBUlJBWV9TSVpFKGxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyksCi0JCQlscl9saW5lb3V0X2dhaW5fdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJfbGluZW91dF9nYWluX2VudW0sCisJCQkgICAgREFDMzNfUkRBQ19QV1JfQ1RSTCwgMCwKKwkJCSAgICBscl9saW5lb3V0X2dhaW5fdGV4dHMpOwogCiAvKgogICogREFDTC9SIGRpZ2l0YWwgdm9sdW1lIGNvbnRyb2w6CkBAIC01MzQsMTggKzUyOSwxNiBAQAogLyogTE9QIEwvUiBpbnZlcnQgc2VsZWN0aW9uICovCiBzdGF0aWMgY29uc3QgY2hhciAqZGFjMzNfbHJfbG9tX3RleHRzW10gPSB7IkRBQyIsICJMT1AifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWMzM19sZWZ0X2xvbV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREFDMzNfT1VUX0FNUF9DVFJMLCAzLAotCQkJQVJSQVlfU0laRShkYWMzM19scl9sb21fdGV4dHMpLAotCQkJZGFjMzNfbHJfbG9tX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWMzM19sZWZ0X2xvbV9lbnVtLAorCQkJICAgIERBQzMzX09VVF9BTVBfQ1RSTCwgMywKKwkJCSAgICBkYWMzM19scl9sb21fdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzNfZGFwbV9sZWZ0X2xvbV9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgZGFjMzNfbGVmdF9sb21fZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfcmlnaHRfbG9tX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQUMzM19PVVRfQU1QX0NUUkwsIDIsCi0JCQlBUlJBWV9TSVpFKGRhYzMzX2xyX2xvbV90ZXh0cyksCi0JCQlkYWMzM19scl9sb21fdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhYzMzX3JpZ2h0X2xvbV9lbnVtLAorCQkJICAgIERBQzMzX09VVF9BTVBfQ1RSTCwgMiwKKwkJCSAgICBkYWMzM19scl9sb21fdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzNfZGFwbV9yaWdodF9sb21fY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGRhYzMzX3JpZ2h0X2xvbV9lbnVtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggMDA2NjVhZC4uOTc1ZTBmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTQxNSwxMCArNDE1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2hhbmRzZnJlZWxfdGV4dHNbXSA9CiAJCXsiVm9pY2UiLCAiQXVkaW9MMSIsICJBdWRpb0wyIiwgIkF1ZGlvUjIifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2hhbmRzZnJlZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0hGTF9DVEwsIDAsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfaGFuZHNmcmVlbF90ZXh0cyksCi0JCQl0d2w0MDMwX2hhbmRzZnJlZWxfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfaGFuZHNmcmVlbF9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX0hGTF9DVEwsIDAsCisJCQkgICAgdHdsNDAzMF9oYW5kc2ZyZWVsX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9oYW5kc2ZyZWVsX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX2hhbmRzZnJlZWxfZW51bSk7CkBAIC00MzEsMTAgKzQzMCw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9oYW5kc2ZyZWVyX3RleHRzW10gPQogCQl7IlZvaWNlIiwgIkF1ZGlvUjEiLCAiQXVkaW9SMiIsICJBdWRpb0wyIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19IRlJfQ1RMLCAwLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX2hhbmRzZnJlZXJfdGV4dHMpLAotCQkJdHdsNDAzMF9oYW5kc2ZyZWVyX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX2hhbmRzZnJlZXJfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19IRlJfQ1RMLCAwLAorCQkJICAgIHR3bDQwMzBfaGFuZHNmcmVlcl90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1faGFuZHNmcmVlcl9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0pOwpAQCAtNDQ4LDEwICs0NDYsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFfdGV4dHNbXSA9CiAJCXsiQXVkaW9MMSIsICJBdWRpb1IxIiwgIkF1ZGlvTDIiLCAiQXVkaW9SMiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfdmlicmFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF92aWJyYV90ZXh0cyksCi0JCQl0d2w0MDMwX3ZpYnJhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX3ZpYnJhX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfVklCUkFfQ1RMLCAyLAorCQkJICAgIHR3bDQwMzBfdmlicmFfdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX3ZpYnJhX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ZpYnJhX2VudW0pOwpAQCAtNDYwLDEwICs0NTcsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFwYXRoX3RleHRzW10gPQogCQl7IkxvY2FsIHZpYnJhdG9yIiwgIkF1ZGlvIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF92aWJyYXBhdGhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgNCwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF92aWJyYXBhdGhfdGV4dHMpLAotCQkJdHdsNDAzMF92aWJyYXBhdGhfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfdmlicmFwYXRoX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfVklCUkFfQ1RMLCA0LAorCQkJICAgIHR3bDQwMzBfdmlicmFwYXRoX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV92aWJyYXBhdGhfY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfdmlicmFwYXRoX2VudW0pOwpAQCAtNDkwLDEwICs0ODYsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4MV90ZXh0c1tdID0KIAkJeyJBbmFsb2ciLCAiRGlnaW1pYzAifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMCwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgxX3RleHRzKSwKLQkJCXR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9taWNwYXRodHgxX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAwLAorCQkJICAgIHR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4MV9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgxX2VudW0pOwpAQCAtNTAyLDEwICs0OTcsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0c1tdID0KIAkJeyJBbmFsb2ciLCAiRGlnaW1pYzEifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgyX3RleHRzKSwKLQkJCXR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9taWNwYXRodHgyX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAyLAorCQkJICAgIHR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4Ml9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgyX2VudW0pOwpAQCAtOTU1LDE5ICs5NDksMTUgQEAKIAkiT3B0aW9uIDIgKHZvaWNlL2F1ZGlvKSIsICJPcHRpb24gMSAoYXVkaW8pIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX29wX21vZGVzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19DT0RFQ19NT0RFLCAwLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX29wX21vZGVzX3RleHRzKSwKLQkJCXR3bDQwMzBfb3BfbW9kZXNfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfb3BfbW9kZXNfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19DT0RFQ19NT0RFLCAwLAorCQkJICAgIHR3bDQwMzBfb3BfbW9kZXNfdGV4dHMpOwogCiBzdGF0aWMgaW50IHNuZF9zb2NfcHV0X3R3bDQwMzBfb3Btb2RlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgdHdsNDAzMF9wcml2ICp0d2w0MDMwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrOwogCiAJaWYgKHR3bDQwMzAtPmNvbmZpZ3VyZWQpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LApAQCAtOTc1LDE5ICs5NjUsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IGUtPnNoaWZ0X2w7Ci0JbWFzayA9IGUtPm1hc2sgPDwgZS0+c2hpZnRfbDsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7Ci0JCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWF4IC0gMSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgfD0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCBlLT5zaGlmdF9yOwotCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKLQl9Ci0KLQlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCXJldHVybiBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOwogfQogCiAvKgpAQCAtMTA0NCwxMCArMTAyMiw5IEBACiAJIlZvaWNlIGhpZ2ggcHJpb3JpdHkiLCAiSGlGaSBoaWdoIHByaW9yaXR5IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCAyLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV90ZXh0cyksCi0JCQl0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9hdmFkY19jbGtfcHJpb3JpdHlfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19BVkFEQ19DVEwsIDIsCisJCQkgICAgdHdsNDAzMF9hdmFkY19jbGtfcHJpb3JpdHlfdGV4dHMpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHNbXSA9IHsKIAkiMjcvMjAvMTQgbXMiLCAiNTUvNDAvMjcgbXMiLCAiMTA5LzgxLzU1IG1zIiwgIjIxOC8xNjEvMTA5IG1zIiwKQEAgLTEwNTUsNDAgKzEwMzIsMzYgQEAKIAkiMzQ5NS8yNTgxLzE3NDggbXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfcmFtcGRlbGF5X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19IU19QT1BOX1NFVCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpLAotCQkJdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfcmFtcGRlbGF5X2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfSFNfUE9QTl9TRVQsIDIsCisJCQkgICAgdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpOwogCiAvKiBWaWJyYSBILWJyaWRnZSBkaXJlY3Rpb24gbW9kZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzW10gPSB7CiAJIlZpYnJhIEgtYnJpZGdlIGRpcmVjdGlvbiIsICJBdWRpbyBkYXRhIE1TQiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfdmlicmFkaXJtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19WSUJSQV9DVEwsIDUsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzKSwKLQkJCXR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX3ZpYnJhZGlybW9kZV9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgNSwKKwkJCSAgICB0d2w0MDMwX3ZpYnJhZGlybW9kZV90ZXh0cyk7CiAKIC8qIFZpYnJhIEgtYnJpZGdlIGRpcmVjdGlvbiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFkaXJfdGV4dHNbXSA9IHsKIAkiUG9zaXRpdmUgcG9sYXJpdHkiLCAiTmVnYXRpdmUgcG9sYXJpdHkiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX3ZpYnJhZGlyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19WSUJSQV9DVEwsIDEsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfdmlicmFkaXJfdGV4dHMpLAotCQkJdHdsNDAzMF92aWJyYWRpcl90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF92aWJyYWRpcl9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgMSwKKwkJCSAgICB0d2w0MDMwX3ZpYnJhZGlyX3RleHRzKTsKIAogLyogRGlnaW1pYyBMZWZ0IGFuZCByaWdodCBzd2FwcGluZyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfZGlnaW1pY3N3YXBfdGV4dHNbXSA9IHsKIAkiTm90IHN3YXBwZWQiLCAiU3dhcHBlZCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfZGlnaW1pY3N3YXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX01JU0NfU0VUXzEsIDAsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfZGlnaW1pY3N3YXBfdGV4dHMpLAotCQkJdHdsNDAzMF9kaWdpbWljc3dhcF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9kaWdpbWljc3dhcF9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX01JU0NfU0VUXzEsIDAsCisJCQkgICAgdHdsNDAzMF9kaWdpbWljc3dhcF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX3NuZF9jb250cm9sc1tdID0gewogCS8qIENvZGVjIG9wZXJhdGlvbiBtb2RlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKaW5kZXggMGFmZThiZS4uYmQzYTIwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH07CiAKIC8qIHNldCBvZiByYXRlcyBmb3IgZWFjaCBwbGw6IGxvdy1wb3dlciBhbmQgaGlnaC1wZXJmb3JtYW5jZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBscF9yYXRlc1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBscF9yYXRlc1tdID0gewogCTgwMDAsCiAJMTEyNTAsCiAJMTYwMDAsCkBAIC05Myw3ICs5Myw3IEBACiAJOTYwMDAsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGhwX3JhdGVzW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhwX3JhdGVzW10gPSB7CiAJODAwMCwKIAkxNjAwMCwKIAkzMjAwMCwKQEAgLTEwMSw3ICsxMDEsNyBAQAogCTk2MDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBzeXNjbGtfY29uc3RyYWludHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3lzY2xrX2NvbnN0cmFpbnRzW10gPSB7CiAJeyAuY291bnQgPSBBUlJBWV9TSVpFKGxwX3JhdGVzKSwgLmxpc3QgPSBscF9yYXRlcywgfSwKIAl7IC5jb3VudCA9IEFSUkFZX1NJWkUoaHBfcmF0ZXMpLCAubGlzdCA9IGhwX3JhdGVzLCB9LAogfTsKQEAgLTM5Miw4ICszOTIsMTAgQEAKIAl7IkhlYWRzZXQgTWljIiwgIlN1YiBNaWMiLCAiQXV4L0ZNIFJpZ2h0IiwgIk9mZiJ9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShUV0w2MDQwX1JFR19NSUNMQ1RMLCAzLCA0LCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKLQlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywgNCwgdHdsNjA0MF9hbWljcl90ZXh0cyksCisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX01JQ0xDVEwsIDMsCisJCQlBUlJBWV9TSVpFKHR3bDYwNDBfYW1pY2xfdGV4dHMpLCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywKKwkJCUFSUkFZX1NJWkUodHdsNjA0MF9hbWljcl90ZXh0cyksIHR3bDYwNDBfYW1pY3JfdGV4dHMpLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDYwNDBfaHNfdGV4dHNbXSA9IHsKQEAgLTQ3Niw5ICs0NzgsOCBAQAogCSJMb3ctUG93ZXIiLCAiSGlnaC1QZXJmb3JtYW5jZSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfcG93ZXJfbW9kZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUodHdsNjA0MF9wb3dlcl9tb2RlX3RleHRzKSwKLQkJCXR3bDYwNDBfcG93ZXJfbW9kZV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHR3bDYwNDBfcG93ZXJfbW9kZV9lbnVtLAorCQkJCXR3bDYwNDBfcG93ZXJfbW9kZV90ZXh0cyk7CiAKIHN0YXRpYyBpbnQgdHdsNjA0MF9oZWFkc2V0X3Bvd2VyX2dldF9lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwppbmRleCBjOTRkNGMxLi5lZGYyN2FjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwpAQCAtMjAzLDggKzIwMyw3IEBACiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgdWRhMTM0eF9wcml2ICp1ZGExMzR4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdTggaHdfcGFyYW1zOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCmluZGV4IDcyNmRmNmQuLmU2MmU3MDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkvKiB0aGUgaW50ZXJwb2xhdG9yICYgZGVjaW1hdG9yIHJlZ3MgbXVzdCBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUKIAkgKiBjb2RlYyBEQUkgaXMgYWN0aXZlLgogCSAqLwotCWlmICghY29kZWMtPmFjdGl2ZSAmJiAocmVnID49IFVEQTEzODBfTVZPTCkpCisJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykgJiYgKHJlZyA+PSBVREExMzgwX01WT0wpKQogCQlyZXR1cm4gMDsKIAlwcl9kZWJ1ZygidWRhMTM4MDogaHcgd3JpdGUgJXggdmFsICV4XG4iLCByZWcsIHZhbHVlKTsKIAlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDMpID09IDMpIHsKQEAgLTIzNywyNSArMjM3LDI3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfZGVlbXBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX0RFRU1QLCA4LCA1LCB1ZGExMzgwX2RlZW1wKSwKLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9ERUVNUCwgMCwgNSwgdWRhMTM4MF9kZWVtcCksCisJU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfREVFTVAsIDgsIEFSUkFZX1NJWkUodWRhMTM4MF9kZWVtcCksCisJCQl1ZGExMzgwX2RlZW1wKSwKKwlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9ERUVNUCwgMCwgQVJSQVlfU0laRSh1ZGExMzgwX2RlZW1wKSwKKwkJCXVkYTEzODBfZGVlbXApLAogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9pbnB1dF9zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfQURDLCAyLCA0LCB1ZGExMzgwX2lucHV0X3NlbCk7CQkvKiBTRUxfTUlDLCBTRUxfTE5BICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfb3V0cHV0X3NlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9QTSwgNywgMiwgdWRhMTM4MF9vdXRwdXRfc2VsKTsJCS8qIFIwMl9FTl9BVkMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9zcGZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfTU9ERSwgMTQsIDQsIHVkYTEzODBfc3BmX21vZGUpOwkJLyogTSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX2NhcHR1cmVfc2VsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX0lGQUNFLCA2LCAyLCB1ZGExMzgwX2NhcHR1cmVfc2VsKTsJLyogU0VMX1NPVVJDRSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX3NlbF9uc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9NSVhFUiwgMTQsIDIsIHVkYTEzODBfc2VsX25zKTsJCS8qIFNFTF9OUyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX21peF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9NSVhFUiwgMTIsIDQsIHVkYTEzODBfbWl4X2NvbnRyb2wpOwkvKiBNSVgsIE1JWF9QT1MgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9zZGV0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX01JWEVSLCA0LCA0LCB1ZGExMzgwX3NkZXRfc2V0dGluZyk7CS8qIFNEX1ZBTFVFICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfb3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfTUlYRVIsIDAsIDMsIHVkYTEzODBfb3Nfc2V0dGluZyk7CS8qIE9TICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9pbnB1dF9zZWxfZW51bSwKKwkJCSAgICBVREExMzgwX0FEQywgMiwgdWRhMTM4MF9pbnB1dF9zZWwpOwkJLyogU0VMX01JQywgU0VMX0xOQSAqLworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHVkYTEzODBfb3V0cHV0X3NlbF9lbnVtLAorCQkJICAgIFVEQTEzODBfUE0sIDcsIHVkYTEzODBfb3V0cHV0X3NlbCk7CQkvKiBSMDJfRU5fQVZDICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9zcGZfZW51bSwKKwkJCSAgICBVREExMzgwX01PREUsIDE0LCB1ZGExMzgwX3NwZl9tb2RlKTsJCS8qIE0gKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX2NhcHR1cmVfc2VsX2VudW0sCisJCQkgICAgVURBMTM4MF9JRkFDRSwgNiwgdWRhMTM4MF9jYXB0dXJlX3NlbCk7CS8qIFNFTF9TT1VSQ0UgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX3NlbF9uc19lbnVtLAorCQkJICAgIFVEQTEzODBfTUlYRVIsIDE0LCB1ZGExMzgwX3NlbF9ucyk7CQkvKiBTRUxfTlMgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX21peF9lbnVtLAorCQkJICAgIFVEQTEzODBfTUlYRVIsIDEyLCB1ZGExMzgwX21peF9jb250cm9sKTsJLyogTUlYLCBNSVhfUE9TICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9zZGV0X2VudW0sCisJCQkgICAgVURBMTM4MF9NSVhFUiwgNCwgdWRhMTM4MF9zZGV0X3NldHRpbmcpOwkvKiBTRF9WQUxVRSAqLworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHVkYTEzODBfb3NfZW51bSwKKwkJCSAgICBVREExMzgwX01JWEVSLCAwLCB1ZGExMzgwX29zX3NldHRpbmcpOwkvKiBPUyAqLwogCiAvKgogICogZnJvbSAtNDggZEIgaW4gMS41IGRCIHN0ZXBzIChtdXRlIGluc3RlYWQgb2YgLTQ5LjUgZEIpCkBAIC01NjQsOCArNTY2LDcgQEAKIHN0YXRpYyB2b2lkIHVkYTEzODBfcGNtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXUxNiBjbGsgPSB1ZGExMzgwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBVREExMzgwX0NMSyk7CiAKIAkvKiBzaHV0IGRvd24gV1NQTEwgcG93ZXIgaWYgcnVubmluZyBmcm9tIHRoaXMgY2xvY2sgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCmluZGV4IGI3YWIyZWYuLjZiZTVmODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCXJldHVybiAwOwogCiAJLyogRG8gbm90IGFsbG93IGNoYW5nZXMgd2hpbGUgc3RyZWFtIGlzIHJ1bm5pbmcgKi8KLQlpZiAoY29kZWMtPmFjdGl2ZSkKKwlpZiAoc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDwgMCB8fApAQCAtMjA5LDggKzIwOSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd2wxMjczX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh3bDEyNzNfYXVkaW9fcm91dGUpLCB3bDEyNzNfYXVkaW9fcm91dGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh3bDEyNzNfZW51bSwgd2wxMjczX2F1ZGlvX3JvdXRlKTsKIAogc3RhdGljIGludCBzbmRfd2wxMjczX2ZtX2F1ZGlvX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTI0Nyw5ICsyNDYsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdsMTI3M19hdWRpb19zdHJpbmdzW10gPSB7ICJEaWdpdGFsIiwgIkFuYWxvZyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bDEyNzNfYXVkaW9fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHdsMTI3M19hdWRpb19zdHJpbmdzKSwKLQkJCSAgICB3bDEyNzNfYXVkaW9fc3RyaW5ncyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHdsMTI3M19hdWRpb19lbnVtLCB3bDEyNzNfYXVkaW9fc3RyaW5ncyk7CiAKIHN0YXRpYyBpbnQgc25kX3dsMTI3M19mbV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCmluZGV4IDhhZTUwMjcuLjgzYTJjODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYwpAQCAtNzg2LDggKzc4Niw2IEBACiB7CiAJc3RydWN0IHdtMjAwMF9wcml2ICp3bTIwMDAgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CiAKLQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQogCS8qIFRoaXMgd2lsbCB0cmlnZ2VyIGEgdHJhbnNpdGlvbiB0byBzdGFuZGJ5IG1vZGUgYnkgZGVmYXVsdCAqLwogCXdtMjAwMF9hbmNfc2V0X21vZGUod20yMDAwKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKaW5kZXggNTdiYTMxNS4uMmU3MjFlMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCkBAIC0xMTEzLDExICsxMTEzLDEwIEBACiAJIk5vbmUiLCAiSU4xIiwgIklOMiIsICJJTjMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTIyMDBfcnhhbmNfaW5wdXRfc2VsID0KLQlTT0NfRU5VTV9TSU5HTEUoV00yMjAwX1JYQU5DX1NSQywKLQkJCVdNMjIwMF9JTl9SWEFOQ19TRUxfU0hJRlQsCi0JCQlBUlJBWV9TSVpFKHdtMjIwMF9yeGFuY19pbnB1dF9zZWxfdGV4dHMpLAotCQkJd20yMjAwX3J4YW5jX2lucHV0X3NlbF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod20yMjAwX3J4YW5jX2lucHV0X3NlbCwKKwkJCSAgICBXTTIyMDBfUlhBTkNfU1JDLAorCQkJICAgIFdNMjIwMF9JTl9SWEFOQ19TRUxfU0hJRlQsCisJCQkgICAgd20yMjAwX3J4YW5jX2lucHV0X3NlbF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTIyMDBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFKCJJTjEgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTIyMDBfSU4xTF9DT05UUk9MLApAQCAtMTI4OCwxMSArMTI4NywxMCBAQAogCSJPVVQxTCIsICJPVVQxUiIsICJPVVQyTCIsICJPVVQyUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtMjIwMF9hZWNfbG9vcGJhY2sgPQotCVNPQ19FTlVNX1NJTkdMRShXTTIyMDBfREFDX0FFQ19DT05UUk9MXzEsCi0JCQlXTTIyMDBfQUVDX0xPT1BCQUNLX1NSQ19TSElGVCwKLQkJCUFSUkFZX1NJWkUod20yMjAwX2FlY19sb29wYmFja190ZXh0cyksCi0JCQl3bTIyMDBfYWVjX2xvb3BiYWNrX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTIyMDBfYWVjX2xvb3BiYWNrLAorCQkJICAgIFdNMjIwMF9EQUNfQUVDX0NPTlRST0xfMSwKKwkJCSAgICBXTTIyMDBfQUVDX0xPT1BCQUNLX1NSQ19TSElGVCwKKwkJCSAgICB3bTIyMDBfYWVjX2xvb3BiYWNrX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtMjIwMF9hZWNfbG9vcGJhY2tfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBRUMgTG9vcGJhY2siLCB3bTIyMDBfYWVjX2xvb3BiYWNrKTsKQEAgLTE1NTYsMTUgKzE1NTQsOCBAQAogCWludCByZXQ7CiAKIAl3bTIyMDAtPmNvZGVjID0gY29kZWM7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtMjIwMC0+cmVnbWFwOwogCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHdtX2Fkc3AxX2Z3X2NvbnRyb2xzLCAyKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwppbmRleCA0ZTNlMzFhLi5lY2E5ODNmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKQEAgLTUwNiwyMSArNTA2LDIxIEBACiAJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYxX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjFfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjJfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYzX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYzXzEsIFdNNTEwMF9MSFBGM19NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjNfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYzXzEsIFdNNTEwMF9MSFBGM19NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGY0X21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjRfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTUxMDBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFKCJJTjEgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfSU4xTF9DT05UUk9MLApAQCAtMjEwMCw2ICsyMTAwLDcgQEAKIGludCB3bTUxMDBfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaykKIHsKIAlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCWlmIChqYWNrKSB7CiAJCXdtNTEwMC0+amFjayA9IGphY2s7CkBAIC0yMTE3LDkgKzIxMTgsMTQgQEAKIAkJCQkgICAgV001MTAwX0FDQ0RFVF9SQVRFX01BU0spOwogCiAJCS8qIFdlIG5lZWQgdGhlIGNoYXJnZSBwdW1wIHRvIHBvd2VyIE1JQ0JJQVMgKi8KLQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiQ1AyIik7Ci0JCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOwotCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQ1AyIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTWVNDTEsiKTsKKworCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJCS8qIFdlIHN0YXJ0IG9mZiBqdXN0IGVuYWJsaW5nIG1pY3JvcGhvbmUgZGV0ZWN0aW9uIC0gZXZlbiBhCiAJCSAqIHBsYWluIGhlYWRwaG9uZSB3aWxsIHRyaWdnZXIgZGV0ZWN0aW9uLgpAQCAtMjMzNywxMyArMjM0Myw2IEBACiAJaW50IHJldCwgaTsKIAogCXdtNTEwMC0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd201MTAwLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfZGlnX3Z1KTsgaSsrKQogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3bTUxMDBfZGlnX3Z1W2ldLCBXTTUxMDBfT1VUX1ZVLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKaW5kZXggY2U5YzhlMS4uZGNmMWQxMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCkBAIC01ODIsNyArNTgyLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC02MjIsMTMgKzYyMiwxNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtNTEwMl9ocG91dF9vc3JbXSA9IHsKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMUwsCi0JCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMkwsCi0JCQkgICAgICBBUklaT05BX09VVDJfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDJfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfM0wsCi0JCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIH07CiAKQEAgLTY4NSwxNSArNjg4LDggQEAKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRMyIsIEFSSVpPTkFfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRNCIsIEFSSVpPTkFfRVE0TUlYX0lOUFVUXzFfU09VUkNFKSwKIAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTEgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTFfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVExX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzEsIDIxLAotCQkgICBBUklaT05BX0VRMl9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTNfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTQgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTRfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVE0X0VOQV9NQVNLKSwKLQorU05EX1NPQ19CWVRFUygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMSBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVExXzIsIEFSSVpPTkFfRVExX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMSBCMSBWb2x1bWUiLCBBUklaT05BX0VRMV8xLCBBUklaT05BX0VRMV9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjJfR0FJTl9TSElGVCwKQEAgLTcwNSw2ICs3MDEsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMSBCNSBWb2x1bWUiLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMiBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEyXzIsIEFSSVpPTkFfRVEyX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMiBCMSBWb2x1bWUiLCBBUklaT05BX0VRMl8xLCBBUklaT05BX0VRMl9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjJfR0FJTl9TSElGVCwKQEAgLTcxNiw2ICs3MTQsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMiBCNSBWb2x1bWUiLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEzIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEzXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMyBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEzXzIsIEFSSVpPTkFfRVEzX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMyBCMSBWb2x1bWUiLCBBUklaT05BX0VRM18xLCBBUklaT05BX0VRM19CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjJfR0FJTl9TSElGVCwKQEAgLTcyNyw2ICs3MjcsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMyBCNSBWb2x1bWUiLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRNCBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVE0XzIsIEFSSVpPTkFfRVE0X0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRNCBCMSBWb2x1bWUiLCBBUklaT05BX0VRNF8xLCBBUklaT05BX0VRNF9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjJfR0FJTl9TSElGVCwKQEAgLTE3NTgsOSArMTc2MCw3IEBACiAJc3RydWN0IHdtNTEwMl9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKaW5kZXggMmMzYzk2Mi4uZGY1YTM4ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC0yNDcsMTUgKzI0Nyw4IEBACiBBUklaT05BX01JWEVSX0NPTlRST0xTKCJFUTMiLCBBUklaT05BX0VRM01JWF9JTlBVVF8xX1NPVVJDRSksCiBBUklaT05BX01JWEVSX0NPTlRST0xTKCJFUTQiLCBBUklaT05BX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSksCiAKLVNORF9TT0NfQllURVNfTUFTSygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzEsIDIxLAotCQkgICBBUklaT05BX0VRMV9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMiBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMl8xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTJfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTMgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTNfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVEzX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzEsIDIxLAotCQkgICBBUklaT05BX0VRNF9FTkFfTUFTSyksCi0KK1NORF9TT0NfQllURVMoIkVRMSBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMV8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTEgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVExIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVExXzEsIEFSSVpPTkFfRVExX0IyX0dBSU5fU0hJRlQsCkBAIC0yNjcsNiArMjYwLDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMiwgQVJJWk9OQV9FUTFfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRMiBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMl8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTIgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVEyIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVEyXzEsIEFSSVpPTkFfRVEyX0IyX0dBSU5fU0hJRlQsCkBAIC0yNzgsNiArMjczLDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMiwgQVJJWk9OQV9FUTJfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18zLCAxOSksCitTT0NfU0lOR0xFKCJFUTMgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVEzIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVEzXzEsIEFSSVpPTkFfRVEzX0IyX0dBSU5fU0hJRlQsCkBAIC0yODksNiArMjg2LDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMiwgQVJJWk9OQV9FUTNfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRNCBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRNF8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTQgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRNF8yLCBBUklaT05BX0VRNF9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVE0IEIyIFZvbHVtZSIsIEFSSVpPTkFfRVE0XzEsIEFSSVpPTkFfRVE0X0IyX0dBSU5fU0hJRlQsCkBAIC0xNTg4LDEwICsxNTg3LDkgQEAKIAlzdHJ1Y3Qgd201MTEwX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogCXByaXYtPmNvcmUuYXJpem9uYS0+ZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKaW5kZXggYTE4M2RjZi4uNzU3MjU2YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0xNTA1LDkgKzE1MDUsNyBAQAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTgzNTAtPnJlZ21hcDsKLQotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCB3bTgzNTAtPnJlZ21hcCk7CiAKIAkvKiBQdXQgdGhlIGNvZGVjIGludG8gcmVzZXQgaWYgaXQgd2Fzbid0IGFscmVhZHkgKi8KIAl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsIFdNODM1MF9DT0RFQ19FTkEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKaW5kZXggNmQ2ODRkOS4uMTQ2NTY0ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCkBAIC0xMzE2LDEwICsxMzE2LDkgQEAKIAogCXNuZF9zb2NfY29kZWNfc2V0X2RydmRhdGEoY29kZWMsIHByaXYpOwogCXByaXYtPndtODQwMCA9IHdtODQwMDsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204NDAwLT5yZWdtYXA7CiAJcHJpdi0+Y29kZWMgPSBjb2RlYzsKIAotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCB3bTg0MDAtPnJlZ21hcCk7CiAKIAlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCh3bTg0MDAtPmRldiwKIAkJCQkgQVJSQVlfU0laRShwb3dlciksICZwb3dlclswXSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwppbmRleCA3ZGY3ZDQ1Li4xYzFlMzI4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKQEAgLTU4OSwyMCArNTg5LDEyIEBACiAKIHN0YXRpYyBpbnQgd204NTEwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODUxMDogZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODUxMF9yZXNldChjb2RlYyk7CiAKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAl3bTg1MTBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHBvd2VyIGRvd24gY2hpcCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKaW5kZXggNzRkMTA2ZC4uNjAxZWU4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCkBAIC03NSw4ICs3NSw4IEBACiAJIjIwNDgiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg1MjNfemNfY291bnQgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg1MjNfWkVST19ERVRFQ1QsIDAsIDIsIHdtODUyM196ZF9jb3VudF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg1MjNfemNfY291bnQsIFdNODUyM19aRVJPX0RFVEVDVCwgMCwKKwkJCSAgICB3bTg1MjNfemRfY291bnRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1MjNfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFdNODUyM19EQUNfR0FJTkwsIFdNODUyM19EQUNfR0FJTlIsCkBAIC0zOTIsMTggKzM5MiwxMSBAQAogc3RhdGljIGludCB3bTg1MjNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg1MjNfcHJpdiAqd204NTIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAogCXdtODUyMy0+cmF0ZV9jb25zdHJhaW50Lmxpc3QgPSAmd204NTIzLT5yYXRlX2NvbnN0cmFpbnRfbGlzdFswXTsKIAl3bTg1MjMtPnJhdGVfY29uc3RyYWludC5jb3VudCA9CiAJCUFSUkFZX1NJWkUod204NTIzLT5yYXRlX2NvbnN0cmFpbnRfbGlzdCk7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIENoYW5nZSBzb21lIGRlZmF1bHQgc2V0dGluZ3MgLSBsYXRjaCBWVSBhbmQgZW5hYmxlIFpDICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTIzX0RBQ19HQUlOUiwKIAkJCSAgICBXTTg1MjNfREFDUl9WVSwgV004NTIzX0RBQ1JfVlUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKaW5kZXggMzE4OTg5YS4uYWY3ZWQ4YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCkBAIC01MDQsOCArNTA0LDcgQEAKIAkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1MTYgcGFpZmEgPSAwOwogCXUxNiBwYWlmYiA9IDA7CkBAIC04NjksMTIgKzg2OCw2IEBACiAJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODU4MC0+c3VwcGxpZXMpLAogCQkJCSAgICB3bTg1ODAtPnN1cHBsaWVzKTsKIAlpZiAocmV0ICE9IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCmluZGV4IGQ5OWY5NDguLmIwZmJjYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAogCS8qIGRlYWN0aXZhdGUgKi8KLQlpZiAoIWNvZGVjLT5hY3RpdmUpIHsKKwlpZiAoIXNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkgewogCQl1ZGVsYXkoNTApOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MTFfQUNUSVZFLCAweDApOwogCX0KQEAgLTM2NywxMiArMzY3LDYgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gd204NzExX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggY2Q4OTAzMy4uYmFjN2ZjMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0yMjgsMTkgKzIyOCwxMCBAQAogCiBzdGF0aWMgaW50IHdtODcyOF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3Mjg6IGZhaWxlZCB0byBjb25maWd1cmUgY2FjaGUgSS9POiAlZFxuIiwKLQkJICAgICAgIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJd204NzI4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODcyOF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKaW5kZXggMDI5NzIwMy4uZDc0ZjQzOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCkBAIC04Myw4ICs4Myw4IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg3MzFfaW5wdXRfc2VsZWN0W10gPSB7IkxpbmUgSW4iLCAiTWljIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzMxX2luc2VsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzFfQVBBTkEsIDIsIDIsIHdtODczMV9pbnB1dF9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODczMV9pbnNlbF9lbnVtLAorCQkJICAgIFdNODczMV9BUEFOQSwgMiwgd204NzMxX2lucHV0X3NlbGVjdCk7CiAKIHN0YXRpYyBpbnQgd204NzMxX2RlZW1waFtdID0geyAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH07CiAKQEAgLTU4MywxMyArNTgzLDYgQEAKIAlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQgPSAwLCBpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODczMS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMS0+c3VwcGxpZXMpOyBpKyspCiAJCXdtODczMS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204NzMxX3N1cHBseV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKaW5kZXggMmYxNjdhOC4uYjI3ZjI2Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwpAQCAtOTksMjkgKzk5LDI5IEBACiAJIjEwMCUiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNiaWFzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfTUlDX1BSRUFNUF9DT05UUk9MLCAwLCA0LCBtaWNiaWFzX2VudW1fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljYmlhc19lbnVtLAorCQkJICAgIFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDAsIG1pY2JpYXNfZW51bV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxvd19jdXRvZmZfdGV4dFtdID0gewogCSJMb3ciLCAiSGlnaCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG93XzNkID0KLQlTT0NfRU5VTV9TSU5HTEUoV004NzM3XzNEX0VOSEFOQ0UsIDYsIDIsIGxvd19jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG93XzNkLAorCQkJICAgIFdNODczN18zRF9FTkhBTkNFLCA2LCBsb3dfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqaGlnaF9jdXRvZmZfdGV4dFtdID0gewogCSJIaWdoIiwgIkxvdyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaGlnaF8zZCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN18zRF9FTkhBTkNFLCA1LCAyLCBoaWdoX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChoaWdoXzNkLAorCQkJICAgIFdNODczN18zRF9FTkhBTkNFLCA1LCBoaWdoX2N1dG9mZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19mbl90ZXh0W10gPSB7CiAJIkRpc2FibGVkIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGNfZm4gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMSwgNywgNCwgYWxjX2ZuX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19mbiwKKwkJCSAgICBXTTg3MzdfQUxDMSwgNywgYWxjX2ZuX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX2hvbGRfdGV4dFtdID0gewogCSIwIiwgIjIuNjdtcyIsICI1LjMzbXMiLCAiMTAuNjZtcyIsICIyMS4zMm1zIiwgIjQyLjY0bXMiLCAiODUuMjhtcyIsCkBAIC0xMjksMjQgKzEyOSwyNCBAQAogCSIxMC45MTZzIiwgIjIxLjgzMnMiLCAiNDMuNjkxcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjX2hvbGQgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMiwgMCwgMTYsIGFsY19ob2xkX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19ob2xkLAorCQkJICAgIFdNODczN19BTEMyLCAwLCBhbGNfaG9sZF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19hdGtfdGV4dFtdID0gewogCSI4LjRtcyIsICIxNi44bXMiLCAiMzMuNm1zIiwgIjY3LjJtcyIsICIxMzQuNG1zIiwgIjI2OC44bXMiLCAiNTM3LjZtcyIsCiAJIjEuMDc1cyIsICIyLjE1cyIsICI0LjNzIiwgIjguNnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19hdGsgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMywgMCwgMTEsIGFsY19hdGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2F0aywKKwkJCSAgICBXTTg3MzdfQUxDMywgMCwgYWxjX2F0a190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19kY3lfdGV4dFtdID0gewogCSIzMy42bXMiLCAiNjcuMm1zIiwgIjEzNC40bXMiLCAiMjY4LjhtcyIsICI1MzcuNm1zIiwgIjEuMDc1cyIsICIyLjE1cyIsCiAJIjQuM3MiLCAiOC42cyIsICIxNy4ycyIsICIzNC40MXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19kY3kgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMywgNCwgMTEsIGFsY19kY3lfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2RjeSwKKwkJCSAgICBXTTg3MzdfQUxDMywgNCwgYWxjX2RjeV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODczN19zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIk1pYyBCb29zdCBWb2x1bWUiLCBXTTg3MzdfQVVESU9fUEFUSF9MLCBXTTg3MzdfQVVESU9fUEFUSF9SLApAQCAtMTkxLDggKzE5MSw4IEBACiAJIkxJTlBVVDEiLCAiTElOUFVUMiIsICJMSU5QVVQzIiwgIkxJTlBVVDEgREMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19BVURJT19QQVRIX0wsIDcsIDQsIGxpbnNlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5zZWxfZW51bSwKKwkJCSAgICBXTTg3MzdfQVVESU9fUEFUSF9MLCA3LCBsaW5zZWxfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMSU5TRUwiLCBsaW5zZWxfZW51bSk7CkBAIC0yMDIsOCArMjAyLDggQEAKIAkiUklOUFVUMSIsICJSSU5QVVQyIiwgIlJJTlBVVDMiLCAiUklOUFVUMSBEQyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnNlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004NzM3X0FVRElPX1BBVEhfUiwgNywgNCwgcmluc2VsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnNlbF9lbnVtLAorCQkJICAgIFdNODczN19BVURJT19QQVRIX1IsIDcsIHJpbnNlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbnNlbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJJTlNFTCIsIHJpbnNlbF9lbnVtKTsKQEAgLTIxMiwxNSArMjEyLDE1IEBACiAJIkRpcmVjdCIsICJQcmVhbXAiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxieXBhc3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDIsIDIsIGJ5cGFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsYnlwYXNzX2VudW0sCisJCQkgICAgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMiwgYnlwYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGJ5cGFzc19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgbGJ5cGFzc19lbnVtKTsKIAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJieXBhc3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDMsIDIsIGJ5cGFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyYnlwYXNzX2VudW0sCisJCQkgICAgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMywgYnlwYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmJ5cGFzc19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgcmJ5cGFzc19lbnVtKTsKQEAgLTU3MCwxMiArNTcwLDYgQEAKIAlzdHJ1Y3Qgd204NzM3X3ByaXYgKndtODczNyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204NzM3LT5zdXBwbGllcyksCiAJCQkJICAgIHdtODczNy0+c3VwcGxpZXMpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtNjQ0LDcgKzYzOCw3IEBACiAJLnZvbGF0aWxlX3JlZyA9IHdtODczN192b2xhdGlsZSwKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQogc3RhdGljIGludCB3bTg3MzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtNzU4LDcgKzc1Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB3bTg3MzdfbW9kaW5pdCh2b2lkKQogewogCWludCByZXQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzM3X2kyY19kcml2ZXIpOwogCWlmIChyZXQgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBXTTg3MzcgSTJDIGRyaXZlcjogJWRcbiIsCkBAIC03ODEsNyArNzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzM3X3NwaV9kcml2ZXIpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlpMmNfZGVsX2RyaXZlcigmd204NzM3X2kyY19kcml2ZXIpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwppbmRleCAyODk1YzhkLi5iMzM1NDJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004NzQxX05VTV9TVVBQTElFU107CiAJdW5zaWduZWQgaW50IHN5c2NsazsKLQlzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKKwljb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgd204NzQxX3JlZ19kZWZhdWx0c1tdID0gewpAQCAtMTIyLDc0ICsxMjIsNzQgQEAKIAl7IDYsIDc2OCB9LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18xMTI4OVtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xMTI4OVtdID0gewogCTQ0MTAwLCA4ODIzNSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTEyODkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzExMjg5ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTEyODkpLAogCS5saXN0CT0gcmF0ZXNfMTEyODksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzEyMjg4W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzEyMjg4W10gPSB7CiAJMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIyODggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyMjg4ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIyODgpLAogCS5saXN0CT0gcmF0ZXNfMTIyODgsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzE2Mzg0W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE2Mzg0W10gPSB7CiAJMzIwMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2Mzg0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xNjM4NCA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzE2Mzg0KSwKIAkubGlzdAk9IHJhdGVzXzE2Mzg0LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18xNjkzNFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xNjkzNFtdID0gewogCTQ0MTAwLCA4ODIzNSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTY5MzQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2OTM0ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTY5MzQpLAogCS5saXN0CT0gcmF0ZXNfMTY5MzQsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzE4NDMyW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE4NDMyW10gPSB7CiAJNDgwMDAsIDk2MDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xODQzMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTg0MzIgPSB7CiAJLmNvdW50CT0gQVJSQVlfU0laRShyYXRlc18xODQzMiksCiAJLmxpc3QJPSByYXRlc18xODQzMiwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfMjI1NzlbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMjI1NzlbXSA9IHsKIAk0NDEwMCwgODgyMzUsIDE3NjQwMDAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMjI1NzkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzIyNTc5ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMjI1NzkpLAogCS5saXN0CT0gcmF0ZXNfMjI1NzksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzI0NTc2W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzI0NTc2W10gPSB7CiAJMzIwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzI0NTc2ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18yNDU3NiA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzI0NTc2KSwKIAkubGlzdAk9IHJhdGVzXzI0NTc2LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18zNjg2NFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18zNjg2NFtdID0gewogCTQ4MDAwLCA5NjAwMCwgMTkyMDAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMzY4NjQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzM2ODY0ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMzY4NjQpLAogCS5saXN0CT0gcmF0ZXNfMzY4NjQsCiB9OwpAQCAtNDI5LDEyICs0MjksNiBAQAogCQlnb3RvIGVycl9nZXQ7CiAJfQogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9lbmFibGU7Ci0JfQotCiAJcmV0ID0gd204NzQxX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKaW5kZXggNzg2MTZhNi4uMzM5OTBiNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCkBAIC03MDIsMTIgKzcwMiw2IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg3NTBfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAid204NzUwOiBmYWlsZWQgdG8gcmVzZXQ6ICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKaW5kZXggYmU4NWRhOS4uY2JiOGQ1NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAlpZiAod204NzUzLT5kYWlfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY29kZWMtPmFjdGl2ZSkKKwlpZiAoc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaW9jdGwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1M19JT0NUTCk7CkBAIC0xMzE0LDcgKzEzMTQsNyBAQAogCS8qIHRoZSBkaWdpdGFsIG11dGUgY292ZXJzIHRoZSBIaUZpIGFuZCBWb2ljZSBEQUMncyBvbiB0aGUgV004NzUzLgogCSAqIG1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGV5IGFyZSBub3QgYm90aCBhY3RpdmUgd2hlbiB3ZSBtdXRlICovCiAJaWYgKG11dGUgJiYgd204NzUzLT5kYWlfZnVuYyA9PSAxKSB7Ci0JCWlmICghY29kZWMtPmFjdGl2ZSkKKwkJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykpCiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTNfREFDLCBtdXRlX3JlZyB8IDB4OCk7CiAJfSBlbHNlIHsKIAkJaWYgKG11dGUpCkBAIC0xNDQwLDcgKzE0NDAsNiBAQAogc3RhdGljIGludCB3bTg3NTNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKLQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NzEsMTMgKzE0NzAsNiBAQAogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204NzUzX3dvcmspOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODc1My0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODc1M19yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCmluZGV4IDViY2UyMTAuLmM2MWFlYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwpAQCAtNTgwLDEyICs1ODAsNiBAQAogCXdtODc3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXdtODc3MC0+Y29kZWMgPSBjb2RlYzsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLAogCQkJCSAgICB3bTg3NzAtPnN1cHBsaWVzKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwppbmRleCBlZjgyNDY3Li43MDk1MmNlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKQEAgLTQzMCwxMiArNDMwLDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODc3Nl9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCmluZGV4IDliYzgyMDYuLmVlNzZmMGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYwpAQCAtOTIsNyArOTIsNyBAQAogV004ODA0X1JFR1VMQVRPUl9FVkVOVCgxKQogCiBzdGF0aWMgY29uc3QgY2hhciAqdHhzcmNfdGV4dFtdID0geyAiUy9QRElGIFJYIiwgIkFJRiIgfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodHhzcmMsIHR4c3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0eHNyYywgdHhzcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg4MDRfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0VOVU1fRVhUKCJJbnB1dCBTb3VyY2UiLCB0eHNyYywgdHhzcmNfZ2V0LCB0eHNyY19wdXQpLApAQCAtNTQ2LDE0ICs1NDYsNiBAQAogCiAJd204ODA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204ODA0LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgaS9vOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKTsgaSsrKQogCQl3bTg4MDQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODgwNF9zdXBwbHlfbmFtZXNbaV07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCmluZGV4IDQzYzIyMDEuLmQwOWZkY2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMTE3OCwxMyArMTE3OCw3IEBACiAKIHN0YXRpYyBpbnQgd204OTAwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0ID0gMCwgcmVnOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaW50IHJlZzsKIAogCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19JRCk7CiAJaWYgKHJlZyAhPSAweDg5MDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCmluZGV4IGVlYmNiMWQuLmIwMDg0YTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwpAQCAtNDg5LDI4ICs0ODksMjggQEAKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwZl9tb2RlLAorCQkJICAgIFdNODkwM19BRENfRElHSVRBTF8wLCA1LCBocGZfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm9zcl90ZXh0W10gPSB7CiAJIkxvdyBwb3dlciIsICJIaWdoIHBlcmZvcm1hbmNlIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfb3NyID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FOQUxPR1VFX0FEQ18wLCAwLCAyLCBvc3JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjX29zciwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfQURDXzAsIDAsIG9zcl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfb3NyID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDAsIDIsIG9zcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfb3NyLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8xLCAwLCBvc3JfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfc2xvcGVfdGV4dFtdID0gewogCSIxIiwgIjEvMiIsICIxLzQiLCAiMS84IiwgIjEvMTYiLCAiMCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX3Nsb3BlX3IwID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18yLCAzLCA2LCBkcmNfc2xvcGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3Nsb3BlX3IwLAorCQkJICAgIFdNODkwM19EUkNfMiwgMywgZHJjX3Nsb3BlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbG9wZV9yMSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMiwgMCwgNiwgZHJjX3Nsb3BlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19zbG9wZV9yMSwKKwkJCSAgICBXTTg5MDNfRFJDXzIsIDAsIGRyY19zbG9wZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19hdHRhY2tfdGV4dFtdID0gewogCSJpbnN0YW50YW5lb3VzIiwKQEAgLTUxOCwxMjUgKzUxOCwxMjUgQEAKIAkiNDYuNG1zIiwgIjkyLjhtcyIsICIxODUuNm1zIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfYXR0YWNrID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCAxMiwgMTEsIGRyY19hdHRhY2tfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2F0dGFjaywKKwkJCSAgICBXTTg5MDNfRFJDXzEsIDEyLCBkcmNfYXR0YWNrX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKIAkiMTg2bXMiLCAiMzcybXMiLCAiNzQzbXMiLCAiMS40OXMiLCAiMi45N3MiLCAiNS45NHMiLCAiMTEuODlzIiwKIAkiMjMuODdzIiwgIjQ3LjU2cyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RlY2F5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2RlY2F5LAorCQkJICAgIFdNODkwM19EUkNfMSwgOCwgZHJjX2RlY2F5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2ZmX2RlbGF5X3RleHRbXSA9IHsKIAkiNSBzYW1wbGVzIiwgIjkgc2FtcGxlcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2ZmX2RlbGF5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18wLCA1LCAyLCBkcmNfZmZfZGVsYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2ZmX2RlbGF5LAorCQkJICAgIFdNODkwM19EUkNfMCwgNSwgZHJjX2ZmX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3FyX2RlY2F5X3RleHRbXSA9IHsKIAkiMC43MjVtcyIsICIxLjQ1bXMiLCAiNS44bXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19xcl9kZWNheSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMSwgNCwgMywgZHJjX3FyX2RlY2F5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9kZWNheSwKKwkJCSAgICBXTTg5MDNfRFJDXzEsIDQsIGRyY19xcl9kZWNheV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhpbmdfdGV4dFtdID0gewogCSJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbW9vdGhpbmcgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfRFJDXzAsIDExLCAzLCBkcmNfc21vb3RoaW5nX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19zbW9vdGhpbmcsCisJCQkgICAgV004OTAzX0RSQ18wLCAxMSwgZHJjX3Ntb290aGluZ190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNvZnRfbXV0ZV90ZXh0W10gPSB7CiAJIkZhc3QgKGZzLzIpIiwgIlNsb3cgKGZzLzMyKSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc29mdF9tdXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDEwLCAyLCBzb2Z0X211dGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc29mdF9tdXRlLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8xLCAxMCwgc29mdF9tdXRlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbXV0ZV9tb2RlX3RleHRbXSA9IHsKIAkiSGFyZCIsICJTb2Z0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtdXRlX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfREFDX0RJR0lUQUxfMSwgOSwgMiwgbXV0ZV9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG11dGVfbW9kZSwKKwkJCSAgICBXTTg5MDNfREFDX0RJR0lUQUxfMSwgOSwgbXV0ZV9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29tcGFuZGluZ190ZXh0W10gPSB7CiAJInVsYXciLCAiYWxhdyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2NvbXBhbmRpbmcgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDAsIDIsIGNvbXBhbmRpbmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2NvbXBhbmRpbmcsCisJCQkgICAgV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAwLCBjb21wYW5kaW5nX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19jb21wYW5kaW5nID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAyLCAyLCBjb21wYW5kaW5nX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19jb21wYW5kaW5nLAorCQkJICAgIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMCwgMiwgY29tcGFuZGluZ190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmlucHV0X21vZGVfdGV4dFtdID0gewogCSJTaW5nbGUtRW5kZWQiLCAiRGlmZmVyZW50aWFsIExpbmUiLCAiRGlmZmVyZW50aWFsIE1pYyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlucHV0X21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGlucHV0X21vZGVfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCAwLCBpbnB1dF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnB1dF9tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgMCwgMywgaW5wdXRfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5wdXRfbW9kZV9lbnVtLAorCQkJICAgIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAwLCBpbnB1dF9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbGlucHV0X211eF90ZXh0W10gPSB7CiAJIklOMUwiLCAiSU4yTCIsICJJTjNMIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbnB1dF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGlucHV0X2VudW0sCisJCQkgICAgV004OTAzX0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMiwgbGlucHV0X211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfaW52X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCA0LCAzLCBsaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxpbnB1dF9pbnZfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCA0LCBsaW5wdXRfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmlucHV0X211eF90ZXh0W10gPSB7CiAJIklOMVIiLCAiSU4yUiIsICJJTjNSIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByaW5wdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAyLCAzLCByaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnB1dF9lbnVtLAorCQkJICAgIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAyLCByaW5wdXRfbXV4X3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnB1dF9pbnZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCA0LCAzLCByaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnB1dF9pbnZfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgNCwgcmlucHV0X211eF90ZXh0KTsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqc2lkZXRvbmVfdGV4dFtdID0gewogCSJOb25lIiwgIkxlZnQiLCAiUmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxzaWRldG9uZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzAsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxzaWRldG9uZV9lbnVtLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8wLCAyLCBzaWRldG9uZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EQUNfRElHSVRBTF8wLCAwLCAzLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5MDNfREFDX0RJR0lUQUxfMCwgMCwgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGNpbnB1dF90ZXh0W10gPSB7CiAJIkFEQyIsICJETUlDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNpbnB1dF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0NMT0NLX1JBVEVfVEVTVF80LCA5LCAyLCBhZGNpbnB1dF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNpbnB1dF9lbnVtLAorCQkJICAgIFdNODkwM19DTE9DS19SQVRFX1RFU1RfNCwgOSwgYWRjaW5wdXRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphaWZfdGV4dFtdID0gewogCSJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsY2FwdHVyZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA3LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGNhcHR1cmVfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDcsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByY2FwdHVyZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA2LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmNhcHR1cmVfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDYsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBscGxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA1LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobHBsYXlfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDUsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBycGxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA0LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnBsYXlfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDQsIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwM19zbmRfY29udHJvbHNbXSA9IHsKIApAQCAtMTg5NywyMSArMTg5NywxMyBAQAogc3RhdGljIGludCB3bTg5MDNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5MDNfcHJpdiAqd204OTAzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAogCXdtODkwMy0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTAzLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qIHBvd2VyIG9uIGRldmljZSAqLwogCXdtODkwM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogcG93ZXIgZG93biBjaGlwICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCA1M2JiZmFjLi40OWMzNWMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTU1MiwxOCArNTUyLDIwIEBACiAJIlNpbmdsZS1FbmRlZCIsICJEaWZmZXJlbnRpYWwgTGluZSIsICJEaWZmZXJlbnRpYWwgTWljIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5fbW9kZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGluX21vZGUsCisJCQkgICAgV004OTA0X0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMCwKKwkJCSAgICBpbnB1dF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmluX21vZGUsCisJCQkgICAgV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDAsCisJCQkgICAgaW5wdXRfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmhwZl9tb2RlX3RleHRbXSA9IHsKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwZl9tb2RlLCBXTTg5MDRfQURDX0RJR0lUQUxfMCwgNSwKKwkJCSAgICBocGZfbW9kZV90ZXh0KTsKIAogc3RhdGljIGludCB3bTg5MDRfYWRjX29zcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTYxMSw4ICs2MTMsNyBAQAogCSJBREMiLCAiREFDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcGF0aCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9EUkNfMCwgMTQsIDIsIGRyY19wYXRoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19wYXRoLCBXTTg5MDRfRFJDXzAsIDE0LCBkcmNfcGF0aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwNF9kYWNfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFX1RMVigiRGlnaXRhbCBQbGF5YmFjayBCb29zdCBWb2x1bWUiLCAKQEAgLTg1OCwxNCArODU5LDE0IEBACiAJIklOMUwiLCAiSU4yTCIsICJJTjNMIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5fZW51bSwgV004OTA0X0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMiwKKwkJCSAgICBsaW5fdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5fbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IENhcHR1cmUgTXV4IiwgbGluX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxpbl9pbnZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDQsIDMsIGxpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5faW52X2VudW0sIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDQsCisJCQkgICAgbGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGluX2ludl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQ2FwdHVyZSBJbnZldGluZyBNdXgiLCBsaW5faW52X2VudW0pOwpAQCAtODc0LDE0ICs4NzUsMTQgQEAKIAkiSU4xUiIsICJJTjJSIiwgIklOM1IiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDIsIDMsIHJpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5fZW51bSwgV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDIsCisJCQkgICAgcmluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmluX211eCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgQ2FwdHVyZSBNdXgiLCByaW5fZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmluX2ludl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDQsIDMsIHJpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5faW52X2VudW0sIFdNODkwNF9BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCA0LAorCQkJICAgIHJpbl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbl9pbnZfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBDYXB0dXJlIEludmV0aW5nIE11eCIsIHJpbl9pbnZfZW51bSk7CkBAIC04OTAsMjYgKzg5MSwyNiBAQAogCSJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZvdXRsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDcsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZvdXRsX2VudW0sIFdNODkwNF9BVURJT19JTlRFUkZBQ0VfMCwgNywKKwkJCSAgICBhaWZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWZvdXRsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQUlGT1VUTCBNdXgiLCBhaWZvdXRsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZm91dHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BVURJT19JTlRFUkZBQ0VfMCwgNiwgMiwgYWlmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFpZm91dHJfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA2LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZm91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZPVVRSIE11eCIsIGFpZm91dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5sX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDUsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbmxfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA1LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZmlubF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRklOTCBNdXgiLCBhaWZpbmxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5yX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDQsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbnJfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA0LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZmlucl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRklOUiBNdXgiLCBhaWZpbnJfZW51bSk7CkBAIC05OTEsMjYgKzk5MiwyNiBAQAogCSJEQUMiLCAiQnlwYXNzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMywgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChocGxfZW51bSwgV004OTA0X0FOQUxPR1VFX09VVDEyX1pDLCAzLAorCQkJICAgIG91dF9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUEwgTXV4IiwgaHBsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX09VVDEyX1pDLCAyLCAyLCBvdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwcl9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDIsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBNdXgiLCBocHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGluZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMSwgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5lbF9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDEsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTElORUwgTXV4IiwgbGluZWxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGluZXJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMCwgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5lcl9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDAsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTElORVIgTXV4IiwgbGluZXJfZW51bSk7CkBAIC0xMDE5LDE0ICsxMDIwLDE0IEBACiAJIk5vbmUiLCAiTGVmdCIsICJSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjbF9zaWRldG9uZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0RBQ19ESUdJVEFMXzAsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY2xfc2lkZXRvbmVfZW51bSwgV004OTA0X0RBQ19ESUdJVEFMXzAsIDIsCisJCQkgICAgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNsX3NpZGV0b25lX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTaWRldG9uZSBNdXgiLCBkYWNsX3NpZGV0b25lX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9EQUNfRElHSVRBTF8wLCAwLCAzLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNyX3NpZGV0b25lX2VudW0sIFdNODkwNF9EQUNfRElHSVRBTF8wLCAwLAorCQkJICAgIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjcl9zaWRldG9uZV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIE11eCIsIGRhY3Jfc2lkZXRvbmVfZW51bSk7CkBAIC0xOTgxLDcgKzE5ODIsNyBAQAogCWRldl9kYmcoY29kZWMtPmRldiwgIkFsbG9jYXRlZCAlZCB1bmlxdWUgUmVUdW5lIE1vYmlsZSBuYW1lc1xuIiwKIAkJd204OTA0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0cyk7CiAKLQl3bTg5MDQtPnJldHVuZV9tb2JpbGVfZW51bS5tYXggPSB3bTg5MDQtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzOworCXdtODkwNC0+cmV0dW5lX21vYmlsZV9lbnVtLml0ZW1zID0gd204OTA0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0czsKIAl3bTg5MDQtPnJldHVuZV9tb2JpbGVfZW51bS50ZXh0cyA9IHdtODkwNC0+cmV0dW5lX21vYmlsZV90ZXh0czsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCAmY29udHJvbCwgMSk7CkBAIC0yMDIyLDcgKzIwMjMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kcmNfY2ZnczsgaSsrKQogCQkJd204OTA0LT5kcmNfdGV4dHNbaV0gPSBwZGF0YS0+ZHJjX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5MDQtPmRyY19lbnVtLm1heCA9IHBkYXRhLT5udW1fZHJjX2NmZ3M7CisJCXdtODkwNC0+ZHJjX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX2RyY19jZmdzOwogCQl3bTg5MDQtPmRyY19lbnVtLnRleHRzID0gd204OTA0LT5kcmNfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsICZjb250cm9sLCAxKTsKQEAgLTIwNDcsOSArMjA0OCw2IEBACiBzdGF0aWMgaW50IHdtODkwNF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODkwNF9wcml2ICp3bTg5MDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODkwNC0+cmVnbWFwOwogCiAJc3dpdGNoICh3bTg5MDQtPmRldnR5cGUpIHsKIAljYXNlIFdNODkwNDoKQEAgLTIwNjMsMTIgKzIwNjEsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODkwNF9oYW5kbGVfcGRhdGEoY29kZWMpOwogCiAJd204OTA0X2FkZF93aWRnZXRzKGNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCmluZGV4IGI0MDRjMjYuLmZjNmVlYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwpAQCAtMTU0LDIyICsxNTQsMjIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NDBfY29tcGFuZGluZ1tdID0geyAiT2ZmIiwgIk5DIiwgInUtbGF3IiwgIkEtbGF3IiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5NDBfYWRjX2NvbXBhbmRpbmdfZW51bQotPSBTT0NfRU5VTV9TSU5HTEUoV004OTQwX0NPTVBBTkRJTkdDVEwsIDEsIDQsIHdtODk0MF9jb21wYW5kaW5nKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTQwX2RhY19jb21wYW5kaW5nX2VudW0KLT0gU09DX0VOVU1fU0lOR0xFKFdNODk0MF9DT01QQU5ESU5HQ1RMLCAzLCA0LCB3bTg5NDBfY29tcGFuZGluZyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2FkY19jb21wYW5kaW5nX2VudW0sCisJCQkgICAgV004OTQwX0NPTVBBTkRJTkdDVEwsIDEsIHdtODk0MF9jb21wYW5kaW5nKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5NDBfZGFjX2NvbXBhbmRpbmdfZW51bSwKKwkJCSAgICBXTTg5NDBfQ09NUEFORElOR0NUTCwgMywgd204OTQwX2NvbXBhbmRpbmcpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTQwX2FsY19tb2RlX3RleHRbXSA9IHsiQUxDIiwgIkxpbWl0ZXIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTQwX2FsY19tb2RlX2VudW0KLT0gU09DX0VOVU1fU0lOR0xFKFdNODk0MF9BTEMzLCA4LCAyLCB3bTg5NDBfYWxjX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2FsY19tb2RlX2VudW0sCisJCQkgICAgV004OTQwX0FMQzMsIDgsIHdtODk0MF9hbGNfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0W10gPSB7IjAuOSIsICIwLjY1In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk0MF9taWNfYmlhc19sZXZlbF9lbnVtCi09IFNPQ19FTlVNX1NJTkdMRShXTTg5NDBfSU5QVVRDVEwsIDgsIDIsIHdtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5NDBfbWljX2JpYXNfbGV2ZWxfZW51bSwKKwkJCSAgICBXTTg5NDBfSU5QVVRDVEwsIDgsIHdtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODk0MF9maWx0ZXJfbW9kZV90ZXh0W10gPSB7IkF1ZGlvIiwgIkFwcGxpY2F0aW9uIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk0MF9maWx0ZXJfbW9kZV9lbnVtCi09IFNPQ19FTlVNX1NJTkdMRShXTTg5NDBfQURDLCA3LCAyLCB3bTg5NDBfZmlsdGVyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgV004OTQwX0FEQywgNywgd204OTQwX2ZpbHRlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUod204OTQwX3Nwa192b2xfdGx2LCAtNTcwMCwgMTAwLCAxKTsKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh3bTg5NDBfYXR0X3RsdiwgLTEwMDAsIDEwMDAsIDApOwpAQCAtNzEyLDEyICs3MTIsNiBAQAogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg5NDBfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYwppbmRleCA4MmM4YmE5Li5mZWNkNGU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKQEAgLTQxNiwyMiArNDE2LDIxIEBACiAJIkxpbmVhciIsICJBZGFwdGl2ZSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfbW9kZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk1NV9CQVNTX0NPTlRST0wsIDcsIDIsIGJhc3NfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiYXNzX21vZGUsIFdNODk1NV9CQVNTX0NPTlRST0wsIDcsIGJhc3NfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfY3V0b2ZmX3RleHRbXSA9IHsKIAkiTG93IiwgIkhpZ2giCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfY3V0b2ZmID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTU1X0JBU1NfQ09OVFJPTCwgNiwgMiwgYmFzc19jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmFzc19jdXRvZmYsIFdNODk1NV9CQVNTX0NPTlRST0wsIDYsCisJCQkgICAgYmFzc19jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0cmVibGVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiSGlnaCIsICJMb3ciCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRyZWJsZV9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NTVfVFJFQkxFX0NPTlRST0wsIDYsIDIsIHRyZWJsZV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHJlYmxlX2N1dG9mZiwgV004OTU1X1RSRUJMRV9DT05UUk9MLCAyLAorCQkJICAgIHRyZWJsZV9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYXR0ZW5fdGx2LCAtNjAwLCA2MDAsIDApOwpAQCAtODk2LDE0ICs4OTUsNiBAQAogCXN0cnVjdCB3bTg5NTVfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2KTsKIAlpbnQgcmV0LCBpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk1NS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk1NS0+c3VwcGxpZXMpOyBpKyspCiAJCXdtODk1NS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204OTU1X3N1cHBseV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jCmluZGV4IGQ0MjQ4ZTAuLjdhYzJlNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU4LWRzcDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1OC1kc3AyLmMKQEAgLTk0NCw3ICs5NDQsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9tYmNfY2ZnczsgaSsrKQogCQkJd204OTk0LT5tYmNfdGV4dHNbaV0gPSBwZGF0YS0+bWJjX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5OTQtPm1iY19lbnVtLm1heCA9IHBkYXRhLT5udW1fbWJjX2NmZ3M7CisJCXdtODk5NC0+bWJjX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX21iY19jZmdzOwogCQl3bTg5OTQtPm1iY19lbnVtLnRleHRzID0gd204OTk0LT5tYmNfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMod204OTk0LT5odWJzLmNvZGVjLApAQCAtOTczLDcgKzk3Myw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3Zzc19jZmdzOyBpKyspCiAJCQl3bTg5OTQtPnZzc190ZXh0c1tpXSA9IHBkYXRhLT52c3NfY2Znc1tpXS5uYW1lOwogCi0JCXdtODk5NC0+dnNzX2VudW0ubWF4ID0gcGRhdGEtPm51bV92c3NfY2ZnczsKKwkJd204OTk0LT52c3NfZW51bS5pdGVtcyA9IHBkYXRhLT5udW1fdnNzX2NmZ3M7CiAJCXdtODk5NC0+dnNzX2VudW0udGV4dHMgPSB3bTg5OTQtPnZzc190ZXh0czsKIAogCQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyh3bTg5OTQtPmh1YnMuY29kZWMsCkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV92c3NfaHBmX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+dnNzX2hwZl90ZXh0c1tpXSA9IHBkYXRhLT52c3NfaHBmX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5OTQtPnZzc19ocGZfZW51bS5tYXggPSBwZGF0YS0+bnVtX3Zzc19ocGZfY2ZnczsKKwkJd204OTk0LT52c3NfaHBmX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX3Zzc19ocGZfY2ZnczsKIAkJd204OTk0LT52c3NfaHBmX2VudW0udGV4dHMgPSB3bTg5OTQtPnZzc19ocGZfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMod204OTk0LT5odWJzLmNvZGVjLApAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZW5oX2VxX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+ZW5oX2VxX3RleHRzW2ldID0gcGRhdGEtPmVuaF9lcV9jZmdzW2ldLm5hbWU7CiAKLQkJd204OTk0LT5lbmhfZXFfZW51bS5tYXggPSBwZGF0YS0+bnVtX2VuaF9lcV9jZmdzOworCQl3bTg5OTQtPmVuaF9lcV9lbnVtLml0ZW1zID0gcGRhdGEtPm51bV9lbmhfZXFfY2ZnczsKIAkJd204OTk0LT5lbmhfZXFfZW51bS50ZXh0cyA9IHdtODk5NC0+ZW5oX2VxX3RleHRzOwogCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKHdtODk5NC0+aHVicy5jb2RlYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCmluZGV4IGYxNTYwMTAuLmQwNGU5Y2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwpAQCAtOTc2LDEyICs5NzYsNiBAQAogCQkJd204OTYwLT5zZXRfYmlhc19sZXZlbCA9IHdtODk2MF9zZXRfYmlhc19sZXZlbF9jYXBsZXNzOwogCX0KIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODk2MF9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCmluZGV4IDkwMDMyOGUuLjljODhmMDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYwpAQCAtMzE3LDE1ICszMTcsMTUgQEAKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfaHBmID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYxX0FEQ19EQUNfQ09OVFJPTF8yLCA3LCA0LCBhZGNfaHBmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19ocGYsCisJCQkgICAgV004OTYxX0FEQ19EQUNfQ09OVFJPTF8yLCA3LCBhZGNfaHBmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGFjX2RlZW1waF90ZXh0W10gPSB7CiAJIk5vbmUiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19kZWVtcGggPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjFfQURDX0RBQ19DT05UUk9MXzEsIDEsIDQsIGRhY19kZWVtcGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2RlZW1waCwKKwkJCSAgICBXTTg5NjFfQURDX0RBQ19DT05UUk9MXzEsIDEsIGRhY19kZWVtcGhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfdGx2LCAtMTIxMDAsIDEwMCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfc2VjX3RsdiwgLTcwMCwgMTAwLCAwKTsKQEAgLTM4NSwxMSArMzg1LDExIEBACiAJIk5vbmUiLCAiTGVmdCIsICJSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjbF9zaWRldG9uZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2MV9EU1BfU0lERVRPTkVfMCwgMiwgMywgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjbF9zaWRldG9uZSwKKwkJCSAgICBXTTg5NjFfRFNQX1NJREVUT05FXzAsIDIsIHNpZGV0b25lX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjFfRFNQX1NJREVUT05FXzEsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY3Jfc2lkZXRvbmUsCisJCQkgICAgV004OTYxX0RTUF9TSURFVE9ORV8xLCAyLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEQUNMIFNpZGV0b25lIiwgZGFjbF9zaWRldG9uZSk7CkBAIC04MzYsMTUgKzgzNiw4IEBACiBzdGF0aWMgaW50IHdtODk2MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEVuYWJsZSBjbGFzcyBXICovCiAJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjFfQ0hBUkdFX1BVTVBfQik7CiAJcmVnIHw9IFdNODk2MV9DUF9EWU5fUFdSX01BU0s7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwppbmRleCA5N2RiM2I0Li41NTIyZDI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKQEAgLTE0NzksNyArMTQ3OSw5IEBACiAKIHN0YXRpYyBpbnQgd204OTYyX2RzcDJfd3JpdGVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlyZXR1cm4gcmVnY2FjaGVfc3luY19yZWdpb24oY29kZWMtPmNvbnRyb2xfZGF0YSwKKwlzdHJ1Y3Qgd204OTYyX3ByaXYgKndtODk2MiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmV0dXJuIHJlZ2NhY2hlX3N5bmNfcmVnaW9uKHdtODk2Mi0+cmVnbWFwLAogCQkJCSAgICBXTTg5NjJfSERCQVNTX0FJXzEsIFdNODk2Ml9NQVhfUkVHSVNURVIpOwogfQogCkBAIC0xNjU4LDE2ICsxNjYwLDE2IEBACiAJIkhpLWZpIiwgIkFwcGxpY2F0aW9uIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjYXBfaHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfQURDX0RBQ19DT05UUk9MXzIsIDEwLCAyLCBjYXBfaHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2FwX2hwZl9tb2RlLAorCQkJICAgIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMiwgMTAsIGNhcF9ocGZfbW9kZV90ZXh0KTsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqY2FwX2xocGZfbW9kZV90ZXh0W10gPSB7CiAJIkxQRiIsICJIUEYiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNhcF9saHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfTEhQRjEsIDEsIDIsIGNhcF9saHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2FwX2xocGZfbW9kZSwKKwkJCSAgICBXTTg5NjJfTEhQRjEsIDEsIGNhcF9saHBmX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5NjJfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfRE9VQkxFKCJJbnB1dCBNaXhlciBTd2l0Y2giLCBXTTg5NjJfSU5QVVRfTUlYRVJfQ09OVFJPTF8xLCAzLCAyLCAxLCAxKSwKQEAgLTIwMTQsNDAgKzIwMTYsNDAgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0X3RleHRbXSA9IHsgIk5vbmUiLCAiTGVmdCIsICJSaWdodCIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9EQUNfRFNQX01JWElOR18xLCAyLCAzLCBzdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdHJfZW51bSwKKwkJCSAgICBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMSwgMiwgc3RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSIsIHN0cl9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9EQUNfRFNQX01JWElOR18yLCAyLCAzLCBzdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGxfZW51bSwKKwkJCSAgICBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMiwgMiwgc3RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IFNpZGV0b25lIiwgc3RsX2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqb3V0bXV4X3RleHRbXSA9IHsgIkRBQyIsICJNaXhlciIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtvdXRyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfU1BFQUtFUl9NSVhFUl8yLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3Brb3V0cl9lbnVtLAorCQkJICAgIFdNODk2Ml9TUEVBS0VSX01JWEVSXzIsIDcsIG91dG11eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa291dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTUEtPVVRSIE11eCIsIHNwa291dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3Brb3V0bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX1NQRUFLRVJfTUlYRVJfMSwgNywgMiwgb3V0bXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwa291dGxfZW51bSwKKwkJCSAgICBXTTg5NjJfU1BFQUtFUl9NSVhFUl8xLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtvdXRsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLT1VUTCBNdXgiLCBzcGtvdXRsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwb3V0cl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0hFQURQSE9ORV9NSVhFUl8yLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBvdXRyX2VudW0sCisJCQkgICAgV004OTYyX0hFQURQSE9ORV9NSVhFUl8yLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocG91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUE9VVFIgTXV4IiwgaHBvdXRyX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwb3V0bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0hFQURQSE9ORV9NSVhFUl8xLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBvdXRsX2VudW0sCisJCQkgICAgV004OTYyX0hFQURQSE9ORV9NSVhFUl8xLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocG91dGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUE9VVEwgTXV4IiwgaHBvdXRsX2VudW0pOwpAQCAtMjg4NCw5ICsyODg2LDEzIEBACiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0ZMTF9DT05UUk9MXzcsIGZsbF9kaXYubGFtYmRhKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfRkxMX0NPTlRST0xfOCwgZmxsX2Rpdi5uKTsKIAotCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZ3bTg5NjItPmZsbF9sb2NrKTsKKwlyZWluaXRfY29tcGxldGlvbigmd204OTYyLT5mbGxfbG9jayk7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGNvZGVjLT5kZXYpOworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY29kZWMtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlc3VtZSBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAogCQkJICAgIFdNODk2Ml9GTExfRlJBQyB8IFdNODk2Ml9GTExfUkVGQ0xLX1NSQ19NQVNLIHwKQEAgLTI4OTQsOCArMjkwMCw2IEBACiAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwgY29uZmlndXJlZCBmb3IgJWRIei0+JWRIelxuIiwgRnJlZiwgRm91dCk7CiAKLQlyZXQgPSAwOwotCiAJLyogVGhpcyBzaG91bGQgYmUgYSBtYXNzaXZlIG92ZXJlc3RpbWF0ZSBidXQgZ28gZXZlbgogCSAqIGhpZ2hlciBpZiB3ZSdsbCBlcnJvciBvdXQKIAkgKi8KQEAgLTI5MDksMTQgKzI5MTMsMTcgQEAKIAogCWlmICh0aW1lb3V0ID09IDAgJiYgd204OTYyLT5pcnEpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRkxMIGxvY2sgdGltZWQgb3V0Iik7Ci0JCXJldCA9IC1FVElNRURPVVQ7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAorCQkJCSAgICBXTTg5NjJfRkxMX0VOQSwgMCk7CisJCXBtX3J1bnRpbWVfcHV0KGNvZGVjLT5kZXYpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKIAl3bTg5NjItPmZsbF9mcmVmID0gRnJlZjsKIAl3bTg5NjItPmZsbF9mb3V0ID0gRm91dDsKIAl3bTg5NjItPmZsbF9zcmMgPSBzb3VyY2U7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODk2Ml9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKQEAgLTMwMDMsOSArMzAxMCwxNiBAQAogCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJaW50IHJlZywgcmV0OwogCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc3VtZTogJWRcbiIsIHJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKIAlyZXQgPSByZWdtYXBfcmVhZCh3bTg5NjItPnJlZ21hcCwgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMl9NQVNLLAogCQkJICAmbWFzayk7CiAJaWYgKHJldCAhPSAwKSB7CisJCXBtX3J1bnRpbWVfcHV0KGRldik7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgaW50ZXJydXB0IG1hc2s6ICVkXG4iLAogCQkJcmV0KTsKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtMzAxMywxNCArMzAyNywxNyBAQAogCiAJcmV0ID0gcmVnbWFwX3JlYWQod204OTYyLT5yZWdtYXAsIFdNODk2Ml9JTlRFUlJVUFRfU1RBVFVTXzIsICZhY3RpdmUpOwogCWlmIChyZXQgIT0gMCkgeworCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIGludGVycnVwdDogJWRcbiIsIHJldCk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKIAlhY3RpdmUgJj0gfm1hc2s7CiAKLQlpZiAoIWFjdGl2ZSkKKwlpZiAoIWFjdGl2ZSkgeworCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCQlyZXR1cm4gSVJRX05PTkU7CisJfQogCiAJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMgKi8KIAlyZXQgPSByZWdtYXBfd3JpdGUod204OTYyLT5yZWdtYXAsIFdNODk2Ml9JTlRFUlJVUFRfU1RBVFVTXzIsIGFjdGl2ZSk7CkBAIC0zMDcwLDYgKzMwODcsOCBAQAogCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CiAJfQogCisJcG1fcnVudGltZV9wdXQoZGV2KTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMzA4OSw2ICszMTA4LDcgQEAKIGludCB3bTg5NjJfbWljX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spCiB7CiAJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGlycV9tYXNrLCBlbmFibGU7CiAKIAl3bTg5NjItPmphY2sgPSBqYWNrOwpAQCAtMzEwOSwxNCArMzEyOSwxOCBAQAogCXNuZF9zb2NfamFja19yZXBvcnQod204OTYyLT5qYWNrLCAwLAogCQkJICAgIFNORF9KQUNLX01JQ1JPUEhPTkUgfCBTTkRfSkFDS19CVE5fMCk7CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChqYWNrKSB7Ci0JCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOwotCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJNSUNCSUFTIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTWVNDTEsiKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1JQ0JJQVMiKTsKIAl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiU1lTQ0xLIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJNSUNCSUFTIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU1lTQ0xLIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTUlDQklBUyIpOwogCX0KIAorCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODk2Ml9taWNfZGV0ZWN0KTsKQEAgLTM0MDAsMTMgKzM0MjQsNiBAQAogCWJvb2wgZG1pY2NsaywgZG1pY2RhdDsKIAogCXdtODk2Mi0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTYyLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAl3bTg5NjItPmRpc2FibGVfbmJbMF0ubm90aWZpZXJfY2FsbCA9IHdtODk2Ml9yZWd1bGF0b3JfZXZlbnRfMDsKIAl3bTg5NjItPmRpc2FibGVfbmJbMV0ubm90aWZpZXJfY2FsbCA9IHdtODk2Ml9yZWd1bGF0b3JfZXZlbnRfMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCmluZGV4IDY3YWJhNzguLjA5YjdiNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwpAQCAtNjQ4LDEyICs2NDgsNiBAQAogCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid204OTcxOiBmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204OTcxX3dvcmspOwogCXdtODk3MV93b3JrcSA9IGNyZWF0ZV93b3JrcXVldWUoIndtODk3MSIpOwogCWlmICh3bTg5NzFfd29ya3EgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCmluZGV4IDE1ZjQ1YzcuLjA2MjdjNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwpAQCAtODQsOCArODQsOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTc0X2F1eG1vZGVfdGV4dFtdID0geyAiQnVmZmVyIiwgIk1peGVyIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk3NF9hdXhtb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTc0X0lOUFVULCAgMywgMiwgd204OTc0X2F1eG1vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTc0X2F1eG1vZGUsCisJCQkgICAgV004OTc0X0lOUFVULCAgMywgd204OTc0X2F1eG1vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKQEAgLTU5MywxMiArNTkzLDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODk3NF9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCmluZGV4IGQ4ZmM1MzEuLjI4ZWY0NmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwpAQCAtMTE3LDIxICsxMTcsMjEgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NzhfYWxjM1tdID0geyJBTEMiLCAiTGltaXRlciJ9Owogc3RhdGljIGNvbnN0IGNoYXIgKndtODk3OF9hbGMxW10gPSB7Ik9mZiIsICJSaWdodCIsICJMZWZ0IiwgIkJvdGgifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19jb21wYW5kLCBXTTg5NzhfQ09NUEFORElOR19DT05UUk9MLCAxLAotCQkJCSAgd204OTc4X2NvbXBhbmRpbmcpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19jb21wYW5kLCBXTTg5NzhfQ09NUEFORElOR19DT05UUk9MLCAzLAotCQkJCSAgd204OTc4X2NvbXBhbmRpbmcpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxbW9kZSwgV004OTc4X0VRMSwgOCwgd204OTc4X2VxbW9kZSk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExLCBXTTg5NzhfRVExLCA1LCB3bTg5NzhfZXExKTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJidywgV004OTc4X0VRMiwgOCwgd204OTc4X2J3KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTIsIFdNODk3OF9FUTIsIDUsIHdtODk3OF9lcTIpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM2J3LCBXTTg5NzhfRVEzLCA4LCB3bTg5NzhfYncpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMywgV004OTc4X0VRMywgNSwgd204OTc4X2VxMyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0YncsIFdNODk3OF9FUTQsIDgsIHdtODk3OF9idyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0LCBXTTg5NzhfRVE0LCA1LCB3bTg5NzhfZXE0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTUsIFdNODk3OF9FUTUsIDUsIHdtODk3OF9lcTUpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzMsIFdNODk3OF9BTENfQ09OVFJPTF8zLCA4LCB3bTg5NzhfYWxjMyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjMSwgV004OTc4X0FMQ19DT05UUk9MXzEsIDcsIHdtODk3OF9hbGMxKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNfY29tcGFuZCwgV004OTc4X0NPTVBBTkRJTkdfQ09OVFJPTCwgMSwKKwkJCSAgICB3bTg5NzhfY29tcGFuZGluZyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2NvbXBhbmQsIFdNODk3OF9DT01QQU5ESU5HX0NPTlRST0wsIDMsCisJCQkgICAgd204OTc4X2NvbXBhbmRpbmcpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxbW9kZSwgV004OTc4X0VRMSwgOCwgd204OTc4X2VxbW9kZSk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExLCBXTTg5NzhfRVExLCA1LCB3bTg5NzhfZXExKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJidywgV004OTc4X0VRMiwgOCwgd204OTc4X2J3KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTIsIFdNODk3OF9FUTIsIDUsIHdtODk3OF9lcTIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM2J3LCBXTTg5NzhfRVEzLCA4LCB3bTg5NzhfYncpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMywgV004OTc4X0VRMywgNSwgd204OTc4X2VxMyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0YncsIFdNODk3OF9FUTQsIDgsIHdtODk3OF9idyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0LCBXTTg5NzhfRVE0LCA1LCB3bTg5NzhfZXE0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTUsIFdNODk3OF9FUTUsIDUsIHdtODk3OF9lcTUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzMsIFdNODk3OF9BTENfQ09OVFJPTF8zLCA4LCB3bTg5NzhfYWxjMyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjMSwgV004OTc4X0FMQ19DT05UUk9MXzEsIDcsIHdtODk3OF9hbGMxKTsKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtMTI3NTAsIDUwLCAxKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV90bHYsIC0xMjAwLCAxMDAsIDApOwpAQCAtOTc1LDE5ICs5NzUsMTMgQEAKIHN0YXRpYyBpbnQgd204OTc4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTc4X3ByaXYgKndtODk3OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwLCBpOworCWludCBpOwogCiAJLyoKIAkgKiBTZXQgZGVmYXVsdCBzeXN0ZW0gY2xvY2sgdG8gUExMLCBpdCBpcyBtb3JlIHByZWNpc2UsIHRoaXMgaXMgYWxzbyB0aGUKIAkgKiBkZWZhdWx0IGhhcmR3YXJlIHNldHRpbmcKIAkgKi8KIAl3bTg5NzgtPnN5c2NsayA9IFdNODk3OF9QTEw7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk3OC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qCiAJICogU2V0IHRoZSB1cGRhdGUgYml0IGluIGFsbCByZWdpc3RlcnMsIHRoYXQgaGF2ZSBvbmUuIFRoaXMgd2F5IGFsbApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKaW5kZXggYWE0MWJhMC4uMmI5YmZhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCkBAIC0yMDUsNDkgKzIwNSw0NCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHBnYV9ib29zdF90bHYsIDAsIDIwMDAsIDApOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX3NlbF90ZXh0W10gPSB7ICJPZmYiLCAiUmlnaHQiLCAiTGVmdCIsICJTdGVyZW8iIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX3NlbCwgV004OTgzX0FMQ19DT05UUk9MXzEsIDcsCi0JCQkJICBhbGNfc2VsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19zZWwsIFdNODk4M19BTENfQ09OVFJPTF8xLCA3LCBhbGNfc2VsX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX21vZGVfdGV4dFtdID0geyAiQUxDIiwgIkxpbWl0ZXIiIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LAotCQkJCSAgYWxjX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LCBhbGNfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZpbHRlcl9tb2RlX3RleHRbXSA9IHsgIkF1ZGlvIiwgIkFwcGxpY2F0aW9uIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGZpbHRlcl9tb2RlLCBXTTg5ODNfQURDX0NPTlRST0wsIDcsCi0JCQkJICBmaWx0ZXJfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTgzX0FEQ19DT05UUk9MLCA3LAorCQkJICAgIGZpbHRlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZXFfYndfdGV4dFtdID0geyAiTmFycm93IiwgIldpZGUiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqZXFtb2RlX3RleHRbXSA9IHsgIkNhcHR1cmUiLCAiUGxheWJhY2siIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGVxbW9kZSwgZXFtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChlcW1vZGUsIGVxbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVxMV9jdXRvZmZfdGV4dFtdID0gewogCSI4MEh6IiwgIjEwNUh6IiwgIjEzNUh6IiwgIjE3NUh6IgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTFfY3V0b2ZmLCBXTTg5ODNfRVExX0xPV19TSEVMRiwgNSwKLQkJCQkgIGVxMV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTgzX0VRMV9MT1dfU0hFTEYsIDUsCisJCQkgICAgZXExX2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTJfY3V0b2ZmX3RleHRbXSA9IHsKIAkiMjMwSHoiLCAiMzAwSHoiLCAiMzg1SHoiLCAiNTAwSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMl9idywgV004OTgzX0VRMl9QRUFLXzEsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMl9jdXRvZmYsIFdNODk4M19FUTJfUEVBS18xLCA1LAotCQkJCSAgZXEyX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfYncsIFdNODk4M19FUTJfUEVBS18xLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfY3V0b2ZmLCBXTTg5ODNfRVEyX1BFQUtfMSwgNSwgZXEyX2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTNfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNjUwSHoiLCAiODUwSHoiLCAiMS4xa0h6IiwgIjEuNGtIeiIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEzX2J3LCBXTTg5ODNfRVEzX1BFQUtfMiwgOCwgZXFfYndfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEzX2N1dG9mZiwgV004OTgzX0VRM19QRUFLXzIsIDUsCi0JCQkJICBlcTNfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19idywgV004OTgzX0VRM19QRUFLXzIsIDgsIGVxX2J3X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19jdXRvZmYsIFdNODk4M19FUTNfUEVBS18yLCA1LCBlcTNfY3V0b2ZmX3RleHQpOwogc3RhdGljIGNvbnN0IGNoYXIgKmVxNF9jdXRvZmZfdGV4dFtdID0gewogCSIxLjhrSHoiLCAiMi40a0h6IiwgIjMuMmtIeiIsICI0LjFrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9idywgV004OTgzX0VRNF9QRUFLXzMsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9jdXRvZmYsIFdNODk4M19FUTRfUEVBS18zLCA1LAotCQkJCSAgZXE0X2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfYncsIFdNODk4M19FUTRfUEVBS18zLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfY3V0b2ZmLCBXTTg5ODNfRVE0X1BFQUtfMywgNSwgZXE0X2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNS4za0h6IiwgIjYuOWtIeiIsICI5a0h6IiwgIjExLjdrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNV9jdXRvZmYsIFdNODk4M19FUTVfSElHSF9TSEVMRiwgNSwKLQkJCQkgIGVxNV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE1X2N1dG9mZiwgV004OTgzX0VRNV9ISUdIX1NIRUxGLCA1LAorCQkJICAgIGVxNV9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZXB0aF8zZF90ZXh0W10gPSB7CiAJIk9mZiIsCkBAIC0yNjcsOCArMjYyLDggQEAKIAkiOTMuMyUiLAogCSIxMDAlIgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCi0JCQkJICBkZXB0aF8zZF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCisJCQkgICAgZGVwdGhfM2RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODNfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRSgiRGlnaXRhbCBMb29wYmFjayBTd2l0Y2giLCBXTTg5ODNfQ09NUEFORElOR19DT05UUk9MLApAQCAtMTAwMCwxMiArOTk1LDYgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1NPRlRXQVJFX1JFU0VULCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOwpAQCAtMTEyOSw3ICsxMTE4LDcgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCiBzdGF0aWMgaW50IHdtODk4M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xMTgyLDcgKzExNzEsNyBAQAogewogCWludCByZXQgPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204OTgzX2kyY19kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgd204OTgzIEkyQyBkcml2ZXI6ICVkXG4iLApAQCAtMTIwMiw3ICsxMTkxLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHdtODk4M19leGl0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlpMmNfZGVsX2RyaXZlcigmd204OTgzX2kyY19kcml2ZXIpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCmluZGV4IDI3MWI1MTcuLjU0NzNkYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYwpAQCAtMjI2LDUyICsyMjYsNDggQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwZ2FfYm9vc3RfdGx2LCAwLCAyMDAwLCAwKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19zZWxfdGV4dFtdID0geyAiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19zZWwsIFdNODk4NV9BTENfQ09OVFJPTF8xLCA3LAotCQkJCSAgYWxjX3NlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGNfc2VsLCBXTTg5ODVfQUxDX0NPTlRST0xfMSwgNywgYWxjX3NlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19tb2RlX3RleHRbXSA9IHsgIkFMQyIsICJMaW1pdGVyIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19tb2RlLCBXTTg5ODVfQUxDX0NPTlRST0xfMywgOCwKLQkJCQkgIGFsY19tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19tb2RlLCBXTTg5ODVfQUxDX0NPTlRST0xfMywgOCwgYWxjX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpmaWx0ZXJfbW9kZV90ZXh0W10gPSB7ICJBdWRpbyIsICJBcHBsaWNhdGlvbiIgfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTg1X0FEQ19DT05UUk9MLCA3LAotCQkJCSAgZmlsdGVyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZmlsdGVyX21vZGUsIFdNODk4NV9BRENfQ09OVFJPTCwgNywKKwkJCSAgICBmaWx0ZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVxX2J3X3RleHRbXSA9IHsgIk5hcnJvdyIsICJXaWRlIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmVxbW9kZV90ZXh0W10gPSB7ICJDYXB0dXJlIiwgIlBsYXliYWNrIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChlcW1vZGUsIGVxbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXFtb2RlLCBlcW1vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICplcTFfY3V0b2ZmX3RleHRbXSA9IHsKIAkiODBIeiIsICIxMDVIeiIsICIxMzVIeiIsICIxNzVIeiIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTg1X0VRMV9MT1dfU0hFTEYsIDUsCi0JCQkJICBlcTFfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMV9jdXRvZmYsIFdNODk4NV9FUTFfTE9XX1NIRUxGLCA1LAorCQkJICAgIGVxMV9jdXRvZmZfdGV4dCk7CiBzdGF0aWMgY29uc3QgY2hhciAqZXEyX2N1dG9mZl90ZXh0W10gPSB7CiAJIjIzMEh6IiwgIjMwMEh6IiwgIjM4NUh6IiwgIjUwMEh6IgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfYncsIFdNODk4NV9FUTJfUEVBS18xLCA4LCBlcV9id190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfY3V0b2ZmLCBXTTg5ODVfRVEyX1BFQUtfMSwgNSwKLQkJCQkgIGVxMl9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2J3LCBXTTg5ODVfRVEyX1BFQUtfMSwgOCwgZXFfYndfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2N1dG9mZiwgV004OTg1X0VRMl9QRUFLXzEsIDUsIGVxMl9jdXRvZmZfdGV4dCk7CiBzdGF0aWMgY29uc3QgY2hhciAqZXEzX2N1dG9mZl90ZXh0W10gPSB7CiAJIjY1MEh6IiwgIjg1MEh6IiwgIjEuMWtIeiIsICIxLjRrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19idywgV004OTg1X0VRM19QRUFLXzIsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19jdXRvZmYsIFdNODk4NV9FUTNfUEVBS18yLCA1LAotCQkJCSAgZXEzX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfYncsIFdNODk4NV9FUTNfUEVBS18yLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfY3V0b2ZmLCBXTTg5ODVfRVEzX1BFQUtfMiwgNSwKKwkJCSAgICBlcTNfY3V0b2ZmX3RleHQpOwogc3RhdGljIGNvbnN0IGNoYXIgKmVxNF9jdXRvZmZfdGV4dFtdID0gewogCSIxLjhrSHoiLCAiMi40a0h6IiwgIjMuMmtIeiIsICI0LjFrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9idywgV004OTg1X0VRNF9QRUFLXzMsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9jdXRvZmYsIFdNODk4NV9FUTRfUEVBS18zLCA1LAotCQkJCSAgZXE0X2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfYncsIFdNODk4NV9FUTRfUEVBS18zLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfY3V0b2ZmLCBXTTg5ODVfRVE0X1BFQUtfMywgNSwgZXE0X2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNS4za0h6IiwgIjYuOWtIeiIsICI5a0h6IiwgIjExLjdrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNV9jdXRvZmYsIFdNODk4NV9FUTVfSElHSF9TSEVMRiwgNSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTVfY3V0b2ZmLCBXTTg5ODVfRVE1X0hJR0hfU0hFTEYsIDUsCiAJCQkJICBlcTVfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BlYWtlcl9tb2RlX3RleHRbXSA9IHsgIkNsYXNzIEEvQiIsICJDbGFzcyBEIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwZWFrZXJfbW9kZSwgMHgxNywgOCwgc3BlYWtlcl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwZWFrZXJfbW9kZSwgMHgxNywgOCwgc3BlYWtlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGVwdGhfM2RfdGV4dFtdID0gewogCSJPZmYiLApAQCAtMjkxLDggKzI4Nyw3IEBACiAJIjkzLjMlIiwKIAkiMTAwJSIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGVwdGhfM2QsIFdNODk4NV8zRF9DT05UUk9MLCAwLAotCQkJCSAgZGVwdGhfM2RfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGVwdGhfM2QsIFdNODk4NV8zRF9DT05UUk9MLCAwLCBkZXB0aF8zZF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk4NV9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfU0lOR0xFKCJEaWdpdGFsIExvb3BiYWNrIFN3aXRjaCIsIFdNODk4NV9DT01QQU5ESU5HX0NPTlRST0wsCkBAIC0xMDAwLDEzICs5OTUsNiBAQAogCWludCByZXQ7CiAKIAl3bTg5ODUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTg1LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgaS9vOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5ODUtPnN1cHBsaWVzKTsgaSsrKQogCQl3bTg5ODUtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODk4NV9zdXBwbHlfbmFtZXNbaV07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODguYwppbmRleCBhNTVlMWMyLi4zYTFhZTRmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIHN0cnVjdCB3bTg5ODhfcHJpdiB7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXVuc2lnbmVkIGludCBzeXNjbGs7Ci0Jc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CisJY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CiB9OwogCiAjZGVmaW5lIHdtODk4OF9yZXNldChjKQlzbmRfc29jX3dyaXRlKGMsIFdNODk4OF9SRVNFVCwgMCkKQEAgLTEyNiw0NiArMTI2LDQ2IEBACiAgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfYm9vc3RfdHh0W10gPSB7IkxpbmVhciBDb250cm9sIiwgIkFkYXB0aXZlIEJvb3N0In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfYm9vc3QgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQkFTUywgNywgMiwgYmFzc19ib29zdF90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJhc3NfYm9vc3QsCisJCQkgICAgV004OTg4X0JBU1MsIDcsIGJhc3NfYm9vc3RfdHh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfZmlsdGVyX3R4dFtdID0geyAiMTMwSHogQCA0OGtIeiIsICIyMDBIeiBAIDQ4a0h6IiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiYXNzX2ZpbHRlciA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9CQVNTLCA2LCAyLCBiYXNzX2ZpbHRlcl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJhc3NfZmlsdGVyLAorCQkJICAgIFdNODk4OF9CQVNTLCA2LCBiYXNzX2ZpbHRlcl90eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHJlYmxlX3R4dFtdID0geyI4a0h6IiwgIjRrSHoifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHJlYmxlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTg4X1RSRUJMRSwgNiwgMiwgdHJlYmxlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHJlYmxlLAorCQkJICAgIFdNODk4OF9UUkVCTEUsIDYsIHRyZWJsZV90eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcmVvXzNkX2xjX3R4dFtdID0geyIyMDBIeiIsICI1MDBIeiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGVyZW9fM2RfbGMgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfM0QsIDUsIDIsIHN0ZXJlb18zZF9sY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZXJlb18zZF9sYywKKwkJCSAgICBXTTg5ODhfM0QsIDUsIHN0ZXJlb18zZF9sY190eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcmVvXzNkX3VjX3R4dFtdID0geyIyLjJrSHoiLCAiMS41a0h6In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0ZXJlb18zZF91YyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF8zRCwgNiwgMiwgc3RlcmVvXzNkX3VjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RlcmVvXzNkX3VjLAorCQkJICAgIFdNODk4OF8zRCwgNiwgc3RlcmVvXzNkX3VjX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzdGVyZW9fM2RfZnVuY190eHRbXSA9IHsiQ2FwdHVyZSIsICJQbGF5YmFjayJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGVyZW9fM2RfZnVuYyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF8zRCwgNywgMiwgc3RlcmVvXzNkX2Z1bmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGVyZW9fM2RfZnVuYywKKwkJCSAgICBXTTg5ODhfM0QsIDcsIHN0ZXJlb18zZF9mdW5jX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphbGNfZnVuY190eHRbXSA9IHsiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19mdW5jID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTg4X0FMQzEsIDcsIDQsIGFsY19mdW5jX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2Z1bmMsCisJCQkgICAgV004OTg4X0FMQzEsIDcsIGFsY19mdW5jX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuZ190eXBlX3R4dFtdID0geyJDb25zdGFudCBQR0EgR2FpbiIsCiAJCQkJICAgICJNdXRlIEFEQyBPdXRwdXQifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmdfdHlwZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9OR0FURSwgMSwgMiwgbmdfdHlwZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX3R5cGUsCisJCQkgICAgV004OTg4X05HQVRFLCAxLCBuZ190eXBlX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdHh0W10gPSB7Ik5vbmUiLCAiMzJLaHoiLCAiNDQuMUtoeiIsICI0OEtoeiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWVtcGggPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQURDREFDLCAxLCA0LCBkZWVtcGhfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkZWVtcGgsCisJCQkgICAgV004OTg4X0FEQ0RBQywgMSwgZGVlbXBoX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGNwb2xfdHh0W10gPSB7Ik5vcm1hbCIsICJMIEludmVydCIsICJSIEludmVydCIsCiAJCQkJICAgIkwgKyBSIEludmVydCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNwb2wgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQURDREFDLCA1LCA0LCBhZGNwb2xfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNwb2wsCisJCQkgICAgV004OTg4X0FEQ0RBQywgNSwgYWRjcG9sX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwZ2FfdGx2LCAtMTcyNSwgNzUsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY190bHYsIC05NzUwLCA1MCwgMSk7CkBAIC0zMTcsMTYgKzMxNywxNiBAQAogCiAvKiBEaWZmZXJlbnRpYWwgTXV4ICovCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTg4X2RpZmZfc2VsW10gPSB7IkxpbmUgMSIsICJMaW5lIDIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGlmZm11eCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9BRENJTiwgOCwgMiwgd204OTg4X2RpZmZfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkaWZmbXV4LAorCQkJICAgIFdNODk4OF9BRENJTiwgOCwgd204OTg4X2RpZmZfc2VsKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODhfZGlmZm11eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBkaWZmbXV4KTsKIAogLyogTW9ubyBBREMgTXV4ICovCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTg4X21vbm9fbXV4W10gPSB7IlN0ZXJlbyIsICJNb25vIChMZWZ0KSIsCiAJIk1vbm8gKFJpZ2h0KSIsICJEaWdpdGFsIE1vbm8ifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbW9ub211eCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9BRENJTiwgNiwgNCwgd204OTg4X21vbm9fbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtb25vbXV4LAorCQkJICAgIFdNODk4OF9BRENJTiwgNiwgd204OTg4X21vbm9fbXV4KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODhfbW9ub211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBtb25vbXV4KTsKIApAQCAtNTIxLDMwICs1MjEsMzAgQEAKIAogLyogVGhlIHNldCBvZiByYXRlcyB3ZSBjYW4gZ2VuZXJhdGUgZnJvbSB0aGUgYWJvdmUgZm9yIGVhY2ggU1lTQ0xLICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfMTIyODhbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMTIyODhbXSA9IHsKIAk4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCAyNDAwMCwgMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIyODggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyMjg4ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIyODgpLAogCS5saXN0CT0gcmF0ZXNfMTIyODgsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzExMjg5NltdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xMTI4OTZbXSA9IHsKIAk4MDAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xMTI4OTYgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzExMjg5NiA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzExMjg5NiksCiAJLmxpc3QJPSByYXRlc18xMTI4OTYsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzEyW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzEyW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAsIDMyMDAwLCA0MTEwMCwgNDgwMDAsCiAJNDgwMDAsIDg4MjM1LCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIpLAogCS5saXN0CT0gcmF0ZXNfMTIsCiB9OwpAQCAtODEwLDE2ICs4MTAsOCBAQAogCiBzdGF0aWMgaW50IHdtODk4OF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHdtODk4OF9wcml2ICp3bTg5ODggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTg5ODgtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg5ODhfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCAwY2NkNGQ4Li5jNDEzYzE5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTE1NywyNiArMTU3LDIzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkwX2RpZ2l0YWxfc2lkZXRvbmVbXSA9CiAJeyJOb25lIiwgIkxlZnQgQURDIiwgIlJpZ2h0IEFEQyIsICJSZXNlcnZlZCJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MF9sZWZ0X2RpZ2l0YWxfc2lkZXRvbmVfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoV004OTkwX0RJR0lUQUxfU0lERV9UT05FLAotCVdNODk5MF9BRENfVE9fREFDTF9TSElGVCwKLQlXTTg5OTBfQURDX1RPX0RBQ0xfTUFTSywKLQl3bTg5OTBfZGlnaXRhbF9zaWRldG9uZSk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTkwX2xlZnRfZGlnaXRhbF9zaWRldG9uZV9lbnVtLAorCQkJICAgIFdNODk5MF9ESUdJVEFMX1NJREVfVE9ORSwKKwkJCSAgICBXTTg5OTBfQURDX1RPX0RBQ0xfU0hJRlQsCisJCQkgICAgd204OTkwX2RpZ2l0YWxfc2lkZXRvbmUpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MF9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0gPQotU09DX0VOVU1fU0lOR0xFKFdNODk5MF9ESUdJVEFMX1NJREVfVE9ORSwKLQlXTTg5OTBfQURDX1RPX0RBQ1JfU0hJRlQsCi0JV004OTkwX0FEQ19UT19EQUNSX01BU0ssCi0Jd204OTkwX2RpZ2l0YWxfc2lkZXRvbmUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODk5MF9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkwX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MF9BRENfVE9fREFDUl9TSElGVCwKKwkJCSAgICB3bTg5OTBfZGlnaXRhbF9zaWRldG9uZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWRjbW9kZVtdID0KIAl7IkhpLWZpIG1vZGUiLCAiVm9pY2UgbW9kZSAxIiwgIlZvaWNlIG1vZGUgMiIsICJWb2ljZSBtb2RlIDMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfcmlnaHRfYWRjbW9kZV9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfQURDX0NUUkwsCi0JV004OTkwX0FEQ19IUEZfQ1VUX1NISUZULAotCVdNODk5MF9BRENfSFBGX0NVVF9NQVNLLAotCXdtODk5MF9hZGNtb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfcmlnaHRfYWRjbW9kZV9lbnVtLAorCQkJICAgIFdNODk5MF9BRENfQ1RSTCwKKwkJCSAgICBXTTg5OTBfQURDX0hQRl9DVVRfU0hJRlQsCisJCQkgICAgd204OTkwX2FkY21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkwX3NuZF9jb250cm9sc1tdID0gewogLyogSU5NSVhMICovCkBAIC00NzUsOSArNDcyLDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWlubG11eFtdID0KIAl7IklOTUlYTCBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOTCBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfYWlubG11eF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfSU5QVVRfTUlYRVIxLCBXTTg5OTBfQUlOTE1PREVfU0hJRlQsCi0JQVJSQVlfU0laRSh3bTg5OTBfYWlubG11eCksIHdtODk5MF9haW5sbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfYWlubG11eF9lbnVtLAorCQkJICAgIFdNODk5MF9JTlBVVF9NSVhFUjEsIFdNODk5MF9BSU5MTU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTBfYWlubG11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTBfZGFwbV9haW5sbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTkwX2FpbmxtdXhfZW51bSk7CkBAIC00ODgsOSArNDg1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWlucm11eFtdID0KIAl7IklOTUlYUiBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOUiBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfYWlucm11eF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfSU5QVVRfTUlYRVIxLCBXTTg5OTBfQUlOUk1PREVfU0hJRlQsCi0JQVJSQVlfU0laRSh3bTg5OTBfYWlucm11eCksIHdtODk5MF9haW5ybXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfYWlucm11eF9lbnVtLAorCQkJICAgIFdNODk5MF9JTlBVVF9NSVhFUjEsIFdNODk5MF9BSU5STU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTBfYWlucm11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTBfZGFwbV9haW5ybXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTkwX2FpbnJtdXhfZW51bSk7CkBAIC0xMjkyLDE0ICsxMjg5LDYgQEAKICAqLwogc3RhdGljIGludCB3bTg5OTBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODk5MDogZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODk5MF9yZXNldChjb2RlYyk7CiAKIAkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCmluZGV4IGRiYTAzMDYuLjg0NGNjNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwpAQCAtMTcxLDI2ICsxNzEsMjMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTFfZGlnaXRhbF9zaWRldG9uZVtdID0KIHsiTm9uZSIsICJMZWZ0IEFEQyIsICJSaWdodCBBREMiLCAiUmVzZXJ2ZWQifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfbGVmdF9kaWdpdGFsX3NpZGV0b25lX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTFfRElHSVRBTF9TSURFX1RPTkUsCi0JCQlXTTg5OTFfQURDX1RPX0RBQ0xfU0hJRlQsCi0JCQlXTTg5OTFfQURDX1RPX0RBQ0xfTUFTSywKLQkJCXdtODk5MV9kaWdpdGFsX3NpZGV0b25lKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfbGVmdF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkxX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MV9BRENfVE9fREFDTF9TSElGVCwKKwkJCSAgICB3bTg5OTFfZGlnaXRhbF9zaWRldG9uZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTkxX3JpZ2h0X2RpZ2l0YWxfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5MV9ESUdJVEFMX1NJREVfVE9ORSwKLQkJCVdNODk5MV9BRENfVE9fREFDUl9TSElGVCwKLQkJCVdNODk5MV9BRENfVE9fREFDUl9NQVNLLAotCQkJd204OTkxX2RpZ2l0YWxfc2lkZXRvbmUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODk5MV9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkxX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MV9BRENfVE9fREFDUl9TSElGVCwKKwkJCSAgICB3bTg5OTFfZGlnaXRhbF9zaWRldG9uZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTFfYWRjbW9kZVtdID0KIHsiSGktZmkgbW9kZSIsICJWb2ljZSBtb2RlIDEiLCAiVm9pY2UgbW9kZSAyIiwgIlZvaWNlIG1vZGUgMyJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MV9yaWdodF9hZGNtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTFfQURDX0NUUkwsCi0JCQlXTTg5OTFfQURDX0hQRl9DVVRfU0hJRlQsCi0JCQlXTTg5OTFfQURDX0hQRl9DVVRfTUFTSywKLQkJCXdtODk5MV9hZGNtb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfcmlnaHRfYWRjbW9kZV9lbnVtLAorCQkJICAgIFdNODk5MV9BRENfQ1RSTCwKKwkJCSAgICBXTTg5OTFfQURDX0hQRl9DVVRfU0hJRlQsCisJCQkgICAgd204OTkxX2FkY21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkxX3NuZF9jb250cm9sc1tdID0gewogCS8qIElOTUlYTCAqLwpAQCAtNDg2LDkgKzQ4Myw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkxX2FpbmxtdXhbXSA9CiB7IklOTUlYTCBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOTCBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfYWlubG11eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkxX0lOUFVUX01JWEVSMSwgV004OTkxX0FJTkxNT0RFX1NISUZULAotCQkJQVJSQVlfU0laRSh3bTg5OTFfYWlubG11eCksIHdtODk5MV9haW5sbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfYWlubG11eF9lbnVtLAorCQkJICAgIFdNODk5MV9JTlBVVF9NSVhFUjEsIFdNODk5MV9BSU5MTU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTFfYWlubG11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9haW5sbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk5MV9haW5sbXV4X2VudW0pOwpAQCAtNDk5LDkgKzQ5Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkxX2FpbnJtdXhbXSA9CiB7IklOTUlYUiBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOUiBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfYWlucm11eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkxX0lOUFVUX01JWEVSMSwgV004OTkxX0FJTlJNT0RFX1NISUZULAotCQkJQVJSQVlfU0laRSh3bTg5OTFfYWlucm11eCksIHdtODk5MV9haW5ybXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfYWlucm11eF9lbnVtLAorCQkJICAgIFdNODk5MV9JTlBVVF9NSVhFUjEsIFdNODk5MV9BSU5STU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTFfYWlucm11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9haW5ybXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk5MV9haW5ybXV4X2VudW0pOwpAQCAtMTI1MSwxNyArMTI0OCw2IEBACiAKIHN0YXRpYyBpbnQgd204OTkxX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgd204OTkxX3ByaXYgKndtODk5MTsKLQlpbnQgcmV0OwotCi0Jd204OTkxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJd204OTkxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDJlZTIzYTMuLmY4MjVkYzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtNjQ2LDggKzY0Niw4IEBACiAJIjQ4a0h6IiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EQUNfQ1RSTCwgNCwgNCwgZGFjX2RlZW1waF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfZGVlbXBoLAorCQkJICAgIFdNODk5M19EQUNfQ1RSTCwgNCwgZGFjX2RlZW1waF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFkY19ocGZfdGV4dFtdID0gewogCSJIaS1GaSIsCkBAIC02NTYsMTYgKzY1NiwxNiBAQAogCSJWb2ljZSAzIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX2hwZiA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BRENfQ1RSTCwgNSwgNCwgYWRjX2hwZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNfaHBmLAorCQkJICAgIFdNODk5M19BRENfQ1RSTCwgNSwgYWRjX2hwZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19wYXRoX3RleHRbXSA9IHsKIAkiQURDIiwKIAkiREFDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcGF0aCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF8xLCAxNCwgMiwgZHJjX3BhdGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3BhdGgsCisJCQkgICAgV004OTkzX0RSQ19DT05UUk9MXzEsIDE0LCBkcmNfcGF0aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19yMF90ZXh0W10gPSB7CiAJIjEiLApAQCAtNjc2LDggKzY3Niw4IEBACiAJIjAiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcjAgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMywgOCwgNiwgZHJjX3IwX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19yMCwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMywgOCwgZHJjX3IwX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3IxX3RleHRbXSA9IHsKIAkiMSIsCkBAIC02ODcsOCArNjg3LDggQEAKIAkiMCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19yMSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF80LCAxMywgNSwgZHJjX3IxX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19yMSwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfNCwgMTMsIGRyY19yMV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19hdHRhY2tfdGV4dFtdID0gewogCSJSZXNlcnZlZCIsCkBAIC03MDUsOCArNzA1LDggQEAKIAkiMTg1LjZtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19hdHRhY2sgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMiwgMTIsIDEyLCBkcmNfYXR0YWNrX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19hdHRhY2ssCisJCQkgICAgV004OTkzX0RSQ19DT05UUk9MXzIsIDEyLCBkcmNfYXR0YWNrX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKIAkiMTg2bXMiLApAQCAtNzIwLDE2ICs3MjAsMTYgQEAKIAkiNDcuNTZtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19kZWNheSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF8yLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2RlY2F5LAorCQkJICAgIFdNODk5M19EUkNfQ09OVFJPTF8yLCA4LCBkcmNfZGVjYXlfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfZmZfdGV4dFtdID0gewogCSI1IHNhbXBsZXMiLAogCSI5IHNhbXBsZXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMywgNywgMiwgZHJjX2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19mZiwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMywgNywgZHJjX2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3FyX3JhdGVfdGV4dFtdID0gewogCSIwLjcyNW1zIiwKQEAgLTczNyw4ICs3MzcsOCBAQAogCSI1LjhtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19xcl9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX0RSQ19DT05UUk9MXzMsIDAsIDMsIGRyY19xcl9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9yYXRlLAorCQkJICAgIFdNODk5M19EUkNfQ09OVFJPTF8zLCAwLCBkcmNfcXJfcmF0ZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhfdGV4dFtdID0gewogCSJMb3ciLApAQCAtNzQ2LDggKzc0Niw4IEBACiAJIkhpZ2giLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfc21vb3RoID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX0RSQ19DT05UUk9MXzEsIDQsIDMsIGRyY19zbW9vdGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3Ntb290aCwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMSwgNCwgZHJjX3Ntb290aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk5M19zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfVExWKCJEaWdpdGFsIFNpZGV0b25lIFZvbHVtZSIsIFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwKQEAgLTg0MSwyNiArODQxLDI2IEBACiAJIkxlZnQiLCAiUmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZm91dGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BVURJT19JTlRFUkZBQ0VfMSwgMTUsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZvdXRsX2VudW0sCisJCQkgICAgV004OTkzX0FVRElPX0lOVEVSRkFDRV8xLCAxNSwgYWlmX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmb3V0bF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRk9VVEwgTXV4IiwgYWlmb3V0bF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZvdXRyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfQVVESU9fSU5URVJGQUNFXzEsIDE0LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmb3V0cl9lbnVtLAorCQkJICAgIFdNODk5M19BVURJT19JTlRFUkZBQ0VfMSwgMTQsIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZm91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZPVVRSIE11eCIsIGFpZm91dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5sX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfQVVESU9fSU5URVJGQUNFXzIsIDE1LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmaW5sX2VudW0sCisJCQkgICAgV004OTkzX0FVRElPX0lOVEVSRkFDRV8yLCAxNSwgYWlmX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmaW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQUlGSU5MIE11eCIsIGFpZmlubF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZpbnJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BVURJT19JTlRFUkZBQ0VfMiwgMTQsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbnJfZW51bSwKKwkJCSAgICBXTTg5OTNfQVVESU9fSU5URVJGQUNFXzIsIDE0LCBhaWZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWZpbnJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZJTlIgTXV4IiwgYWlmaW5yX2VudW0pOwpAQCAtODY5LDE0ICs4NjksMTQgQEAKIAkiTm9uZSIsICJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwgMiwgMywgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc2lkZXRvbmVsX2VudW0sCisJCQkgICAgV004OTkzX0RJR0lUQUxfU0lERV9UT05FLCAyLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgU2lkZXRvbmUiLCBzaWRldG9uZWxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2lkZXRvbmVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRElHSVRBTF9TSURFX1RPTkUsIDAsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNpZGV0b25lcl9lbnVtLAorCQkJICAgIFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwgMCwgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzaWRldG9uZXJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSIsIHNpZGV0b25lcl9lbnVtKTsKQEAgLTE0OTMsMTMgKzE0OTMsNiBAQAogCXdtODk5My0+aHVic19kYXRhLmRjc19jb2Rlc19yID0gLTI7CiAJd204OTkzLT5odWJzX2RhdGEuc2VyaWVzX3N0YXJ0dXAgPSAxOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk5My0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogTGF0Y2ggdm9sdW1lIHVwZGF0ZSBiaXRzIGFuZCBkZWZhdWx0IFpDIG9uICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX1JJR0hUX0RBQ19ESUdJVEFMX1ZPTFVNRSwKIAkJCSAgICBXTTg5OTNfREFDX1ZVLCBXTTg5OTNfREFDX1ZVKTsKQEAgLTE1NTksOCArMTU1Miw2IEBACiAKIHN0YXRpYyBpbnQgd204OTkzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHdtODk5M19wcml2ICp3bTg5OTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQogCXdtODk5M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCBhZGI3MjA2Li42MzAzNTM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKQEAgLTEzNDQsOCArMTM0NCw3IEBACiAJIkRNSUMiLAogfTsKIAotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19lbnVtLAotCQkJICAgIDAsIDAsIGFkY19tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChhZGNfZW51bSwgYWRjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIkFEQ0wgTXV4IiwgYWRjX2VudW0pOwpAQCAtMjU1NCw0MyArMjU1Myw1MiBAQAogaW50IHdtODk5NF92bWlkX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBlbnVtIHdtODk5NF92bWlkX21vZGUgbW9kZSkKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgV004OTk0X1ZNSURfTk9STUFMOgorCQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCQlpZiAod204OTk0LT5odWJzLmxpbmVvdXQxX3NlKSB7Ci0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICJMSU5FT1VUMU4gRHJpdmVyIik7Ci0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICJMSU5FT1VUMVAgRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICJMSU5FT1VUMU4gRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICJMSU5FT1VUMVAgRHJpdmVyIik7CiAJCX0KIAkJaWYgKHdtODk5NC0+aHVicy5saW5lb3V0Ml9zZSkgewotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAiTElORU9VVDJOIERyaXZlciIpOwotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAiTElORU9VVDJQIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAiTElORU9VVDJOIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAiTElORU9VVDJQIERyaXZlciIpOwogCQl9CiAKIAkJLyogRG8gdGhlIHN5bmMgd2l0aCB0aGUgb2xkIG1vZGUgdG8gYWxsb3cgaXQgdG8gY2xlYW4gdXAgKi8KLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CiAJCXdtODk5NC0+dm1pZF9tb2RlID0gbW9kZTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCQlicmVhazsKIAogCWNhc2UgV004OTk0X1ZNSURfRk9SQ0U6CisJCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJCWlmICh3bTg5OTQtPmh1YnMubGluZW91dDFfc2UpIHsKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICAgICJMSU5FT1VUMU4gRHJpdmVyIik7Ci0JCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sCi0JCQkJCQkgICAgICAiTElORU9VVDFQIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICAgICAgIkxJTkVPVVQxTiBEcml2ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAgICAgICJMSU5FT1VUMVAgRHJpdmVyIik7CiAJCX0KIAkJaWYgKHdtODk5NC0+aHVicy5saW5lb3V0Ml9zZSkgewotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICAgICAgIkxJTkVPVVQyTiBEcml2ZXIiKTsKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICAgICJMSU5FT1VUMlAgRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLAorCQkJCQkJCSAgICAgICAiTElORU9VVDJOIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICAgICAgIkxJTkVPVVQyUCBEcml2ZXIiKTsKIAkJfQogCiAJCXdtODk5NC0+dm1pZF9tb2RlID0gbW9kZTsKLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwkJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzI0Miw3ICszMjUwLDcgQEAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJBbGxvY2F0ZWQgJWQgdW5pcXVlIFJlVHVuZSBNb2JpbGUgbmFtZXNcbiIsCiAJCXdtODk5NC0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHMpOwogCi0Jd204OTk0LT5yZXR1bmVfbW9iaWxlX2VudW0ubWF4ID0gd204OTk0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0czsKKwl3bTg5OTQtPnJldHVuZV9tb2JpbGVfZW51bS5pdGVtcyA9IHdtODk5NC0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHM7CiAJd204OTk0LT5yZXR1bmVfbW9iaWxlX2VudW0udGV4dHMgPSB3bTg5OTQtPnJldHVuZV9tb2JpbGVfdGV4dHM7CiAKIAlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyh3bTg5OTQtPmh1YnMuY29kZWMsIGNvbnRyb2xzLApAQCAtMzI5OCw3ICszMzA2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZHJjX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+ZHJjX3RleHRzW2ldID0gcGRhdGEtPmRyY19jZmdzW2ldLm5hbWU7CiAKLQkJd204OTk0LT5kcmNfZW51bS5tYXggPSBwZGF0YS0+bnVtX2RyY19jZmdzOworCQl3bTg5OTQtPmRyY19lbnVtLml0ZW1zID0gcGRhdGEtPm51bV9kcmNfY2ZnczsKIAkJd204OTk0LT5kcmNfZW51bS50ZXh0cyA9IHdtODk5NC0+ZHJjX3RleHRzOwogCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKHdtODk5NC0+aHVicy5jb2RlYywgY29udHJvbHMsCkBAIC0zOTkwLDkgKzM5OTgsOCBAQAogCWludCByZXQsIGk7CiAKIAl3bTg5OTQtPmh1YnMuY29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY29udHJvbC0+cmVnbWFwOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCBjb250cm9sLT5yZWdtYXApOwogCiAJbXV0ZXhfaW5pdCgmd204OTk0LT5hY2NkZXRfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJndtODk5NC0+amFja2RldF9ib290c3RyYXAsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwppbmRleCA0MzAwY2FmLi5kMzE1MmNmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCkBAIC00MjMsMjQgKzQyMywyNCBAQAogCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMUxOIiwgIlNpbmdsZS1lbmRlZCBJTjFMUCIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFsX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKLQkJCQkgIDIsIGluMWxfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xbF9lbnVtLCBXTTg5OTVfTEVGVF9MSU5FX0lOUFVUX0NPTlRST0wsCisJCQkgICAgMiwgaW4xbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmluMXJfdGV4dFtdID0gewogCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMVJOIiwgIlNpbmdsZS1lbmRlZCBJTjFSUCIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFyX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKLQkJCQkgIDAsIGluMXJfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xcl9lbnVtLCBXTTg5OTVfTEVGVF9MSU5FX0lOUFVUX0NPTlRST0wsCisJCQkgICAgMCwgaW4xcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRtaWNfc3JjX3RleHRbXSA9IHsKIAkiRE1JQ0RBVDEiLCAiRE1JQ0RBVDIiLCAiRE1JQ0RBVDMiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZG1pY19zcmMxX2VudW0sIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzUsCi0JCQkJICA4LCBkbWljX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkbWljX3NyYzJfZW51bSwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNSwKLQkJCQkgIDYsIGRtaWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMV9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJICAgIDgsIGRtaWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMl9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJICAgIDYsIGRtaWNfc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTk1X3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzEgVm9sdW1lIiwgV004OTk1X0RBQzFfTEVGVF9WT0xVTUUsCkBAIC01NjEsMTAgKzU2MSw4IEBACiAJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKIAogCWNvZGVjID0gdy0+Y29kZWM7Ci0Jd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKQEAgLTc4MywxNCArNzgxLDEyIEBACiAJIkFEQy9ETUlDMSIsICJETUlDMiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNpZGV0b25lMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk1X1NJREVUT05FLCAwLCAyLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZTFfZW51bSwgV004OTk1X1NJREVUT05FLCAwLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgU2lkZXRvbmUgTXV4Iiwgc2lkZXRvbmUxX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNpZGV0b25lMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk1X1NJREVUT05FLCAxLCAyLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZTJfZW51bSwgV004OTk1X1NJREVUT05FLCAxLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lMl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIE11eCIsIHNpZGV0b25lMl9lbnVtKTsKQEAgLTg4Niw4ICs4ODIsNyBAQAogCSJETUlDIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRSgwLCAwLCAyLCBhZGNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9WSVJUX0RFQ0woYWRjX2VudW0sIGFkY19tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNsX211eCA9CiAJU09DX0RBUE1fRU5VTV9WSVJUKCJBRENMIE11eCIsIGFkY19lbnVtKTsKQEAgLTg5OSwxNCArODk0LDE0IEBACiAJIkRBQzFMIiwgIkRBQzFSIiwgIkRBQzJMIiwgIkRBQzJSIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAotCQkJCSAgMCwgc3BrX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsxcl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzEsCi0JCQkJICAwLCBzcGtfc3JjX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazJsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8yLAotCQkJCSAgMCwgc3BrX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsycl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCi0JCQkJICAwLCBzcGtfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAorCQkJICAgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMXJfc3JjX2VudW0sIFdNODk5NV9SSUdIVF9QRE1fU1BFQUtFUl8xLAorCQkJICAgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMmxfc3JjX2VudW0sIFdNODk5NV9MRUZUX1BETV9TUEVBS0VSXzIsCisJCQkgICAgMCwgc3BrX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsycl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCisJCQkgICAgMCwgc3BrX3NyY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwazFsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLMUwgU1JDIiwgc3BrMWxfc3JjX2VudW0pOwpAQCAtMjA0NywxMyArMjA0Miw2IEBACiAJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJd204OTk1LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk5NS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAxNiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyk7IGkrKykKIAkJd204OTk1LT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg5OTVfc3VwcGx5X25hbWVzW2ldOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwppbmRleCAxYTc2NTViLi5jNmNiYjNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKQEAgLTMxMSwyOCArMzExLDI4IEBACiAJIjIuOWtIeiIsICIxLjVrSHoiLCAiNzM1SHoiLCAiNDAzSHoiLCAiMTk2SHoiLCAiOThIeiIsICI0OUh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZV9ocGYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfU0lERVRPTkUsIDcsIDcsIHNpZGV0b25lX2hwZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZV9ocGYsCisJCQkgICAgV004OTk2X1NJREVUT05FLCA3LCBzaWRldG9uZV9ocGZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpocGZfbW9kZV90ZXh0W10gPSB7CiAJIkhpRmkiLCAiQ3VzdG9tIiwgIlZvaWNlIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AxdHhfaHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMV9UWF9GSUxURVJTLCAzLCAzLCBocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AxdHhfaHBmX21vZGUsCisJCQkgICAgV004OTk2X0RTUDFfVFhfRklMVEVSUywgMywgaHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMnR4X2hwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X0RTUDJfVFhfRklMVEVSUywgMywgMywgaHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHNwMnR4X2hwZl9tb2RlLAorCQkJICAgIFdNODk5Nl9EU1AyX1RYX0ZJTFRFUlMsIDMsIGhwZl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqaHBmX2N1dG9mZl90ZXh0W10gPSB7CiAJIjUwSHoiLCAiNzVIeiIsICIxMDBIeiIsICIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMXR4X2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMV9UWF9GSUxURVJTLCAwLCA3LCBocGZfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzcDF0eF9ocGZfY3V0b2ZmLAorCQkJICAgIFdNODk5Nl9EU1AxX1RYX0ZJTFRFUlMsIDAsIGhwZl9jdXRvZmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMnR4X2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMl9UWF9GSUxURVJTLCAwLCA3LCBocGZfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzcDJ0eF9ocGZfY3V0b2ZmLAorCQkJICAgIFdNODk5Nl9EU1AyX1RYX0ZJTFRFUlMsIDAsIGhwZl9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyB2b2lkIHdtODk5Nl9zZXRfcmV0dW5lX21vYmlsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBibG9jaykKIHsKQEAgLTc4MCwxNCArNzgwLDE0IEBACiAJIklOMSIsICJJTjIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsZWZ0X3NpZGV0b25lX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfU0lERVRPTkUsIDAsIDIsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxlZnRfc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5OTZfU0lERVRPTkUsIDAsIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9zaWRldG9uZSA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTaWRldG9uZSIsIGxlZnRfc2lkZXRvbmVfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmlnaHRfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9TSURFVE9ORSwgMSwgMiwgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmlnaHRfc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5OTZfU0lERVRPTkUsIDEsIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfc2lkZXRvbmUgPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIiwgcmlnaHRfc2lkZXRvbmVfZW51bSk7CkBAIC03OTYsMTQgKzc5NiwxNCBAQAogCSJEQUMxTCIsICJEQUMxUiIsICJEQUMyTCIsICJEQUMyUiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BrbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X0xFRlRfUERNX1NQRUFLRVIsIDAsIDQsIHNwa190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGtsX2VudW0sCisJCQkgICAgV004OTk2X0xFRlRfUERNX1NQRUFLRVIsIDAsIHNwa190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTUEtMIiwgc3BrbF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfUklHSFRfUERNX1NQRUFLRVIsIDAsIDQsIHNwa190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGtyX2VudW0sCisJCQkgICAgV004OTk2X1JJR0hUX1BETV9TUEVBS0VSLCAwLCBzcGtfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLUiIsIHNwa3JfZW51bSk7CkBAIC04MTIsOCArODEyLDggQEAKIAkiQUlGMSIsICJBSUYyIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AxcnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzgsIDAsIDIsIGRzcDFyeF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AxcnhfZW51bSwKKwkJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCAwLCBkc3AxcnhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkc3AxcnggPQogCVNPQ19EQVBNX0VOVU0oIkRTUDFSWCIsIGRzcDFyeF9lbnVtKTsKQEAgLTgyMiw4ICs4MjIsOCBAQAogCSAiQUlGMiIsICJBSUYxIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AycnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzgsIDQsIDIsIGRzcDJyeF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AycnhfZW51bSwKKwkJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCA0LCBkc3AycnhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkc3AycnggPQogCVNPQ19EQVBNX0VOVU0oIkRTUDJSWCIsIGRzcDJyeF9lbnVtKTsKQEAgLTgzMiw4ICs4MzIsOCBAQAogCSJEU1AyIiwgIkRTUDEiLCAiQUlGMSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMnR4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCA2LCAzLCBhaWYydHhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmMnR4X2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfOCwgNiwgYWlmMnR4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMnR4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUYyVFgiLCBhaWYydHhfZW51bSk7CkBAIC04NDIsMTQgKzg0MiwxNCBAQAogCSJBREMiLCAiRE1JQzEiLCAiRE1JQzIiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGluMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgMCwgMywgaW5tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xX2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgMCwgaW5tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbjFfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJJTjEgTXV4IiwgaW4xX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGluMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgNCwgMywgaW5tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4yX2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgNCwgaW5tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbjJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJJTjIgTXV4IiwgaW4yX2VudW0pOwpAQCAtMTYwOCw4ICsxNjA4LDggQEAKIAkJCQltc2xlZXAoNSk7CiAJCQl9CiAKLQkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgZmFsc2UpOwotCQkJcmVnY2FjaGVfc3luYyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwkJCXJlZ2NhY2hlX2NhY2hlX29ubHkod204OTk2LT5yZWdtYXAsIGZhbHNlKTsKKwkJCXJlZ2NhY2hlX3N5bmMod204OTk2LT5yZWdtYXApOwogCQl9CiAKIAkJLyogQnlwYXNzIHRoZSBNSUNCSUFTZXMgZm9yIGxvd2VzdCBwb3dlciAqLwpAQCAtMTYyMCwxMCArMTYyMCwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJcmVnY2FjaGVfY2FjaGVfb25seShjb2RlYy0+Y29udHJvbF9kYXRhLCB0cnVlKTsKKwkJcmVnY2FjaGVfY2FjaGVfb25seSh3bTg5OTYtPnJlZ21hcCwgdHJ1ZSk7CiAJCWlmICh3bTg5OTYtPnBkYXRhLmxkb19lbmEgPj0gMCkgewogCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod204OTk2LT5wZGF0YS5sZG9fZW5hLCAwKTsKLQkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgdHJ1ZSk7CisJCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHdtODk5Ni0+cmVnbWFwLCB0cnVlKTsKIAkJfQogCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk2LT5zdXBwbGllcyksCiAJCQkJICAgICAgIHdtODk5Ni0+c3VwcGxpZXMpOwpAQCAtMjI1MSw2ICsyMjUxLDcgQEAKIAkJICB3bTg5OTZfcG9sYXJpdHlfZm4gcG9sYXJpdHlfY2IpCiB7CiAJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAl3bTg5OTYtPmphY2sgPSBqYWNrOwogCXdtODk5Ni0+ZGV0ZWN0aW5nID0gdHJ1ZTsKQEAgLTIyNjcsOCArMjI2OCwxMiBAQAogCQkJICAgIFdNODk5Nl9NSUNCMl9ESVNDSCwgMCk7CiAKIAkvKiBMRE8yIHBvd2VycyB0aGUgbWljcm9waG9uZXMsIFNZU0NMSyBjbG9ja3MgZGV0ZWN0aW9uICovCi0Jc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTERPMiIpOwotCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCisJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxETzIiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU1lTQ0xLIik7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJLyogV2Ugc3RhcnQgb2ZmIGp1c3QgZW5hYmxpbmcgbWljcm9waG9uZSBkZXRlY3Rpb24gLSBldmVuIGEKIAkgKiBwbGFpbiBoZWFkcGhvbmUgd2lsbCB0cmlnZ2VyIGRldGVjdGlvbi4KQEAgLTI1OTUsNyArMjYwMCw3IEBACiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQWxsb2NhdGVkICVkIHVuaXF1ZSBSZVR1bmUgTW9iaWxlIG5hbWVzXG4iLAogCQl3bTg5OTYtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzKTsKIAotCXdtODk5Ni0+cmV0dW5lX21vYmlsZV9lbnVtLm1heCA9IHdtODk5Ni0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHM7CisJd204OTk2LT5yZXR1bmVfbW9iaWxlX2VudW0uaXRlbXMgPSB3bTg5OTYtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzOwogCXdtODk5Ni0+cmV0dW5lX21vYmlsZV9lbnVtLnRleHRzID0gd204OTk2LT5yZXR1bmVfbW9iaWxlX3RleHRzOwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CkBAIC0yNjI4LDE0ICsyNjMzLDYgQEAKIAlpbml0X2NvbXBsZXRpb24oJndtODk5Ni0+ZGNzX2RvbmUpOwogCWluaXRfY29tcGxldGlvbigmd204OTk2LT5mbGxfbG9jayk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTk2LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCiAJaWYgKHdtODk5Ni0+cGRhdGEubnVtX3JldHVuZV9tb2JpbGVfY2ZncykKIAkJd204OTk2X3JldHVuZV9tb2JpbGVfcGRhdGEoY29kZWMpOwogCWVsc2UKQEAgLTI2NzQsMTMgKzI2NzEsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogJWRcbiIsCiAJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgd204OTk2X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYwppbmRleCA1NTUxMTVlLi4wMDQxODZiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMKQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC0xMjMsMTAgKzEyMywxMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5N19ocG91dF9vc3JbXSA9IHsKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMUwsCi0JCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtODk5N19vc3JfdGV4dCksCiAJCQkgICAgICB3bTg5OTdfb3NyX3RleHQsIHdtODk5N19vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfM0wsCi0JCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtODk5N19vc3JfdGV4dCksCiAJCQkgICAgICB3bTg5OTdfb3NyX3RleHQsIHdtODk5N19vc3JfdmFsKSwKIH07CiAKQEAgLTE3MCwxNSArMTcyLDggQEAKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRMyIsIEFSSVpPTkFfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRNCIsIEFSSVpPTkFfRVE0TUlYX0lOUFVUXzFfU09VUkNFKSwKIAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTEgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTFfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVExX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzEsIDIxLAotCQkgICBBUklaT05BX0VRMl9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTNfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTQgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTRfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVE0X0VOQV9NQVNLKSwKLQorU05EX1NPQ19CWVRFUygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMSBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVExXzIsIEFSSVpPTkFfRVExX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMSBCMSBWb2x1bWUiLCBBUklaT05BX0VRMV8xLCBBUklaT05BX0VRMV9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjJfR0FJTl9TSElGVCwKQEAgLTE5MCw2ICsxODUsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMSBCNSBWb2x1bWUiLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMiBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEyXzIsIEFSSVpPTkFfRVEyX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMiBCMSBWb2x1bWUiLCBBUklaT05BX0VRMl8xLCBBUklaT05BX0VRMl9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjJfR0FJTl9TSElGVCwKQEAgLTIwMSw2ICsxOTgsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMiBCNSBWb2x1bWUiLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEzIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEzXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMyBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEzXzIsIEFSSVpPTkFfRVEzX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMyBCMSBWb2x1bWUiLCBBUklaT05BX0VRM18xLCBBUklaT05BX0VRM19CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjJfR0FJTl9TSElGVCwKQEAgLTIxMiw2ICsyMTEsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMyBCNSBWb2x1bWUiLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRNCBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVE0XzIsIEFSSVpPTkFfRVE0X0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRNCBCMSBWb2x1bWUiLCBBUklaT05BX0VRNF8xLCBBUklaT05BX0VRNF9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjJfR0FJTl9TSElGVCwKQEAgLTEwNTIsOSArMTA1Myw3IEBACiAJc3RydWN0IHdtODk5N19wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKaW5kZXggMDk4MmMxZC4uZDE4ZWZmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCkBAIC0yNjgsOCArMjY4LDcgQEAKIAkiMCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19oaWdoID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18zLCAzLCA2LCBkcmNfaGlnaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfaGlnaCwgV005MDgxX0RSQ18zLCAzLCBkcmNfaGlnaF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19sb3dfdGV4dFtdID0gewogCSIxIiwKQEAgLTI3OSw4ICsyNzgsNyBAQAogCSIwIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2xvdyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EUkNfMywgMCwgNSwgZHJjX2xvd190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfbG93LCBXTTkwODFfRFJDXzMsIDAsIGRyY19sb3dfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfYXRrX3RleHRbXSA9IHsKIAkiMTgxdXMiLApAQCAtMjk3LDggKzI5NSw3IEBACiAJIjE4NS42bXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfYXRrID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18yLCAxMiwgMTIsIGRyY19hdGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2F0aywgV005MDgxX0RSQ18yLCAxMiwgZHJjX2F0a190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19kY3lfdGV4dFtdID0gewogCSIxODZtcyIsCkBAIC0zMTIsOCArMzA5LDcgQEAKIAkiNDcuNTZzIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RjeSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EUkNfMiwgOCwgOSwgZHJjX2RjeV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfZGN5LCBXTTkwODFfRFJDXzIsIDgsIGRyY19kY3lfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfcXJfZGN5X3RleHRbXSA9IHsKIAkiMC43MjVtcyIsCkBAIC0zMjEsOCArMzE3LDcgQEAKIAkiNS44bXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcXJfZGN5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18yLCA0LCAzLCBkcmNfcXJfZGN5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9kY3ksIFdNOTA4MV9EUkNfMiwgNCwgZHJjX3FyX2RjeV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRhY19kZWVtcGhfdGV4dFtdID0gewogCSJOb25lIiwKQEAgLTMzMSwxNiArMzI2LDE2IEBACiAJIjQ4a0h6IiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EQUNfRElHSVRBTF8yLCAxLCA0LCBkYWNfZGVlbXBoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19kZWVtcGgsIFdNOTA4MV9EQUNfRElHSVRBTF8yLCAxLAorCQkJICAgIGRhY19kZWVtcGhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzcGVha2VyX21vZGVfdGV4dFtdID0gewogCSJDbGFzcyBEIiwKIAkiQ2xhc3MgQUIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGVha2VyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTkwODFfQU5BTE9HVUVfU1BFQUtFUl8yLCA2LCAyLCBzcGVha2VyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9tb2RlLCBXTTkwODFfQU5BTE9HVUVfU1BFQUtFUl8yLCA2LAorCQkJICAgIHNwZWFrZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIGludCBzcGVha2VyX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtMTI2NSwxNSArMTI2MCw2IEBACiBzdGF0aWMgaW50IHdtOTA4MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtOTA4MV9wcml2ICp3bTkwODEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtOTA4MS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAkvKiBFbmFibGUgemVybyBjcm9zcyBieSBkZWZhdWx0ICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV005MDgxX0FOQUxPR1VFX0xJTkVPVVQsCkBAIC0xMjg4LDcgKzEyNzQsNyBAQAogCQkJCSAgICAgQVJSQVlfU0laRSh3bTkwODFfZXFfY29udHJvbHMpKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtOTA4MV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKaW5kZXggYTA3ZmUxNi4uODc5MzQxNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCkBAIC01MjIsMTYgKzUyMiw2IEBACiAKIHN0YXRpYyBpbnQgd205MDkwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgd205MDkwX3ByaXYgKndtOTA5MCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtOTA5MC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogQ29uZmlndXJlIHNvbWUgZGVmYXVsdHM7IHRoZXkgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIHdlCiAJICogYnJpbmcgdGhlIGJpYXMgdXAuCiAJICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYwppbmRleCA3MGNlNjc5My4uYzBiN2Y0NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCkBAIC02NywxMiArNjcsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTk3MDVfcmVjX3NlbFtdID0geyJNaWMiLCAiQ0QiLCAiTkMiLCAiTkMiLAogCSJMaW5lIiwgIlN0ZXJlbyBNaXgiLCAiTW9ubyBNaXgiLCAiUGhvbmUifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTk3MDVfZW51bV9taWMgPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgd205NzA1X21pYyk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtOTcwNV9lbnVtX3JlY19sID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19SRUNfU0VMLCA4LCA4LCB3bTk3MDVfcmVjX3NlbCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtOTcwNV9lbnVtX3JlY19yID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19SRUNfU0VMLCAwLCA4LCB3bTk3MDVfcmVjX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod205NzA1X2VudW1fbWljLAorCQkJICAgIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA4LCB3bTk3MDVfbWljKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTk3MDVfZW51bV9yZWNfbCwKKwkJCSAgICBBQzk3X1JFQ19TRUwsIDgsIHdtOTcwNV9yZWNfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTk3MDVfZW51bV9yZWNfciwKKwkJCSAgICBBQzk3X1JFQ19TRUwsIDAsIHdtOTcwNV9yZWNfc2VsKTsKIAogLyogSGVhZHBob25lIE1peGVyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzA1X2hwX21peGVyX2NvbnRyb2xzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCmluZGV4IDQ0NDYyNmYuLmJiNWY3YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCkBAIC02ODQsMjQgKzY4NCwzOCBAQAogCQl9CiAKIAkJaWYgKHJlZykgewotCQkJYnVmID0gd21fYWRzcF9idWZfYWxsb2MocmVnaW9uLT5kYXRhLAotCQkJCQkJbGUzMl90b19jcHUocmVnaW9uLT5sZW4pLAotCQkJCQkJJmJ1Zl9saXN0KTsKLQkJCWlmICghYnVmKSB7Ci0JCQkJYWRzcF9lcnIoZHNwLCAiT3V0IG9mIG1lbW9yeVxuIik7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIG91dF9mdzsKLQkJCX0KKwkJCXNpemVfdCB0b193cml0ZSA9IFBBR0VfU0laRTsKKwkJCXNpemVfdCByZW1haW4gPSBsZTMyX3RvX2NwdShyZWdpb24tPmxlbik7CisJCQljb25zdCB1OCAqZGF0YSA9IHJlZ2lvbi0+ZGF0YTsKIAotCQkJcmV0ID0gcmVnbWFwX3Jhd193cml0ZV9hc3luYyhyZWdtYXAsIHJlZywgYnVmLT5idWYsCi0JCQkJCQkgICAgIGxlMzJfdG9fY3B1KHJlZ2lvbi0+bGVuKSk7Ci0JCQlpZiAocmV0ICE9IDApIHsKLQkJCQlhZHNwX2Vycihkc3AsCi0JCQkJCSIlcy4lZDogRmFpbGVkIHRvIHdyaXRlICVkIGJ5dGVzIGF0ICVkIGluICVzOiAlZFxuIiwKLQkJCQkJZmlsZSwgcmVnaW9ucywKLQkJCQkJbGUzMl90b19jcHUocmVnaW9uLT5sZW4pLCBvZmZzZXQsCi0JCQkJCXJlZ2lvbl9uYW1lLCByZXQpOwotCQkJCWdvdG8gb3V0X2Z3OworCQkJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJCQlpZiAocmVtYWluIDwgUEFHRV9TSVpFKQorCQkJCQl0b193cml0ZSA9IHJlbWFpbjsKKworCQkJCWJ1ZiA9IHdtX2Fkc3BfYnVmX2FsbG9jKGRhdGEsCisJCQkJCQkJdG9fd3JpdGUsCisJCQkJCQkJJmJ1Zl9saXN0KTsKKwkJCQlpZiAoIWJ1ZikgeworCQkJCQlhZHNwX2Vycihkc3AsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJZ290byBvdXRfZnc7CisJCQkJfQorCisJCQkJcmV0ID0gcmVnbWFwX3Jhd193cml0ZV9hc3luYyhyZWdtYXAsIHJlZywKKwkJCQkJCQkgICAgIGJ1Zi0+YnVmLAorCQkJCQkJCSAgICAgdG9fd3JpdGUpOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlhZHNwX2Vycihkc3AsCisJCQkJCQkiJXMuJWQ6IEZhaWxlZCB0byB3cml0ZSAlemQgYnl0ZXMgYXQgJWQgaW4gJXM6ICVkXG4iLAorCQkJCQkJZmlsZSwgcmVnaW9ucywKKwkJCQkJCXRvX3dyaXRlLCBvZmZzZXQsCisJCQkJCQlyZWdpb25fbmFtZSwgcmV0KTsKKwkJCQkJZ290byBvdXRfZnc7CisJCQkJfQorCisJCQkJZGF0YSArPSB0b193cml0ZTsKKwkJCQlyZWcgKz0gdG9fd3JpdGUgLyAyOworCQkJCXJlbWFpbiAtPSB0b193cml0ZTsKIAkJCX0KIAkJfQogCkBAIC0xNjc5LDYgKzE2OTMsOCBAQAogCQkJbGlzdF9kZWwoJmFsZ19yZWdpb24tPmxpc3QpOwogCQkJa2ZyZWUoYWxnX3JlZ2lvbik7CiAJCX0KKworCQlhZHNwX2RiZyhkc3AsICJTaHV0ZG93biBjb21wbGV0ZVxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKaW5kZXggYjM3MTA2Ni4uYjYyMDk2NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKQEAgLTUwLDE2ICs1MCwxNiBAQAogCSJWTUlEIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BlYWtlcl9yZWYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfU1BFQUtFUl9NSVhFUiwgOCwgMiwgc3BlYWtlcl9yZWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9yZWYsCisJCQkgICAgV004OTkzX1NQRUFLRVJfTUlYRVIsIDgsIHNwZWFrZXJfcmVmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BlYWtlcl9tb2RlX3RleHRbXSA9IHsKIAkiQ2xhc3MgRCIsCiAJIkNsYXNzIEFCIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BlYWtlcl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX1NQS01JWFJfQVRURU5VQVRJT04sIDgsIDIsIHNwZWFrZXJfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX21vZGUsCisJCQkgICAgV004OTkzX1NQS01JWFJfQVRURU5VQVRJT04sIDgsIHNwZWFrZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIHZvaWQgd2FpdF9mb3JfZGNfc2Vydm8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgb3ApCiB7CkBAIC03MzUsMTUgKzczNSwxNSBAQAogCSJEQUMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19PVVRQVVRfTUlYRVIxLCA4LCAyLCBocF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBsX2VudW0sCisJCQkgICAgV004OTkzX09VVFBVVF9NSVhFUjEsIDgsIGhwX211eF90ZXh0KTsKIAogY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21faHVic19ocGxfbXV4ID0KIAlXTV9IVUJTX0VOVU1fVygiTGVmdCBIZWFkcGhvbmUgTXV4IiwgaHBsX2VudW0pOwogRVhQT1JUX1NZTUJPTF9HUEwod21faHVic19ocGxfbXV4KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19PVVRQVVRfTUlYRVIyLCA4LCAyLCBocF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHByX2VudW0sCisJCQkgICAgV004OTkzX09VVFBVVF9NSVhFUjIsIDgsIGhwX211eF90ZXh0KTsKIAogY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21faHVic19ocHJfbXV4ID0KIAlXTV9IVUJTX0VOVU1fVygiUmlnaHQgSGVhZHBob25lIE11eCIsIGhwcl9lbnVtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCmluZGV4IDVlM2JjM2MuLmNhYjk4YTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZWRtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzAsOSArMzEsMzQgQEAKICNpbmNsdWRlICJkYXZpbmNpLWkycy5oIgogCiBzdHJ1Y3Qgc25kX3NvY19jYXJkX2RydmRhdGFfZGF2aW5jaSB7CisJc3RydWN0IGNsayAqbWNsazsKIAl1bnNpZ25lZCBzeXNjbGs7CiB9OwogCitzdGF0aWMgaW50IGV2bV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZCA9IHJ0ZC0+Y29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPQorCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoc29jX2NhcmQpOworCisJaWYgKGRydmRhdGEtPm1jbGspCisJCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoZHJ2ZGF0YS0+bWNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXZtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZCA9IHJ0ZC0+Y29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPQorCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoc29jX2NhcmQpOworCisJaWYgKGRydmRhdGEtPm1jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnZkYXRhLT5tY2xrKTsKK30KKwogc3RhdGljIGludCBldm1faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewpAQCAtNTksNiArODUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGV2bV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBldm1fc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBldm1fc2h1dGRvd24sCiAJLmh3X3BhcmFtcyA9IGV2bV9od19wYXJhbXMsCiB9OwogCkBAIC05NSwzNSArMTIzLDI5IEBACiAvKiBMb2dpYyBmb3IgYSBhaWMzeCBhcyBjb25uZWN0ZWQgb24gYSBkYXZpbmNpLWV2bSAqLwogc3RhdGljIGludCBldm1fYWljM3hfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNvZGVjLT5jYXJkLT5kZXYtPm9mX25vZGU7CiAJaW50IHJldDsKIAogCS8qIEFkZCBkYXZpbmNpLWV2bSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzeF9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY2FyZC0+ZGFwbSwgYWljM3hfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpKTsKIAogCWlmIChucCkgewotCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY29kZWMtPmNhcmQsCi0JCQkJCQkJInRpLGF1ZGlvLXJvdXRpbmciKTsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsICJ0aSxhdWRpby1yb3V0aW5nIik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7CiAJCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLCBhdWRpb19tYXAsCisJCQkJCUFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAJfQogCiAJLyogbm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTU9OT19MT1VUIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUExDT00iKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQUkNPTSIpOwotCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIE91dCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJNT05PX0xPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIkhQTENPTSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oJmNvZGVjLT5kYXBtLCAiSFBSQ09NIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0OCw2ICszNzAsNyBAQAogCQlvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKGRhdmluY2lfZXZtX2R0X2lkcyksICZwZGV2LT5kZXYpOwogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWkgPSAoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKikgbWF0Y2gtPmRhdGE7CiAJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPSBOVUxMOworCXN0cnVjdCBjbGsgKm1jbGs7CiAJaW50IHJldCA9IDA7CiAKIAlldm1fc29jX2NhcmQuZGFpX2xpbmsgPSBkYWk7CkBAIC0zNjcsMTMgKzM5MCwzOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwltY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtY2xrIik7CisJaWYgKFBUUl9FUlIobWNsaykgPT0gLUVQUk9CRV9ERUZFUikgeworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9IGVsc2UgaWYgKElTX0VSUihtY2xrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtY2xrIG5vdCBmb3VuZC5cbiIpOworCQltY2xrID0gTlVMTDsKKwl9CisKIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkcnZkYXRhLT5tY2xrID0gbWNsazsKKwogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY29kZWMtY2xvY2stcmF0ZSIsICZkcnZkYXRhLT5zeXNjbGspOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXQgPCAwKSB7CisJCWlmICghZHJ2ZGF0YS0+bWNsaykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJObyBjbG9jayBvciBjbG9jayByYXRlIGRlZmluZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRydmRhdGEtPnN5c2NsayA9IGNsa19nZXRfcmF0ZShkcnZkYXRhLT5tY2xrKTsKKwl9IGVsc2UgaWYgKGRydmRhdGEtPm1jbGspIHsKKwkJdW5zaWduZWQgaW50IHJlcXVlc3RkX3JhdGUgPSBkcnZkYXRhLT5zeXNjbGs7CisJCWNsa19zZXRfcmF0ZShkcnZkYXRhLT5tY2xrLCBkcnZkYXRhLT5zeXNjbGspOworCQlkcnZkYXRhLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoZHJ2ZGF0YS0+bWNsayk7CisJCWlmIChkcnZkYXRhLT5zeXNjbGsgIT0gcmVxdWVzdGRfcmF0ZSkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJDb3VsZCBub3QgZ2V0IHJlcXVlc3RlZCByYXRlICV1IHVzaW5nICV1LlxuIiwKKwkJCQkgcmVxdWVzdGRfcmF0ZSwgZHJ2ZGF0YS0+c3lzY2xrKTsKKwl9CiAKIAlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJmV2bV9zb2NfY2FyZCwgZHJ2ZGF0YSk7CiAJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmV2bV9zb2NfY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKaW5kZXggNjcwYWZhMi4uYTAxYWU5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYwpAQCAtMzcsNiArMzcsMTYgQEAKICNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgogI2luY2x1ZGUgImRhdmluY2ktbWNhc3AuaCIKIAorc3RydWN0IGRhdmluY2lfbWNhc3BfY29udGV4dCB7CisJdTMyCXR4Zm10Y3RsOworCXUzMglyeGZtdGN0bDsKKwl1MzIJdHhmbXQ7CisJdTMyCXJ4Zm10OworCXUzMglhY2xreGN0bDsKKwl1MzIJYWNsa3JjdGw7CisJdTMyCXBkaXI7Cit9OworCiBzdHJ1Y3QgZGF2aW5jaV9tY2FzcCB7CiAJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgZG1hX3BhcmFtc1syXTsKIAlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgZG1hX2RhdGFbMl07CkBAIC01Myw2ICs2Myw5IEBACiAJdTE2CWJjbGtfbHJjbGtfcmF0aW87CiAJaW50CXN0cmVhbXM7CiAKKwlpbnQJc3lzY2xrX2ZyZXE7CisJYm9vbAliY2xrX21hc3RlcjsKKwogCS8qIE1jQVNQIEZJRk8gcmVsYXRlZCAqLwogCXU4CXR4bnVtZXZ0OwogCXU4CXJ4bnVtZXZ0OwpAQCAtNjAsMTUgKzczLDcgQEAKIAlib29sCWRhdF9wb3J0OwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCi0Jc3RydWN0IHsKLQkJdTMyCXR4Zm10Y3RsOwotCQl1MzIJcnhmbXRjdGw7Ci0JCXUzMgl0eGZtdDsKLQkJdTMyCXJ4Zm10OwotCQl1MzIJYWNsa3hjdGw7Ci0JCXUzMglhY2xrcmN0bDsKLQkJdTMyCXBkaXI7Ci0JfSBjb250ZXh0OworCXN0cnVjdCBkYXZpbmNpX21jYXNwX2NvbnRleHQgY29udGV4dDsKICNlbmRpZgogfTsKIApAQCAtMjk0LDYgKzI5OSw3IEBACiAKIAkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFDTEtYIHwgQUNMS1IpOwogCQltY2FzcF9zZXRfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9QRElSX1JFRywgQUZTWCB8IEFGU1IpOworCQltY2FzcC0+YmNsa19tYXN0ZXIgPSAxOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CiAJCS8qIGNvZGVjIGlzIGNsb2NrIG1hc3RlciBhbmQgZnJhbWUgc2xhdmUgKi8KQEAgLTMwNSw2ICszMTEsNyBAQAogCiAJCW1jYXNwX2Nscl9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBBQ0xLWCB8IEFDTEtSKTsKIAkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFGU1ggfCBBRlNSKTsKKwkJbWNhc3AtPmJjbGtfbWFzdGVyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCQkvKiBjb2RlYyBpcyBjbG9jayBhbmQgZnJhbWUgbWFzdGVyICovCkBAIC0zMTYsNiArMzIzLDcgQEAKIAogCQltY2FzcF9jbHJfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9QRElSX1JFRywKIAkJCSAgICAgICBBQ0xLWCB8IEFIQ0xLWCB8IEFGU1ggfCBBQ0xLUiB8IEFIQ0xLUiB8IEFGU1IpOworCQltY2FzcC0+YmNsa19tYXN0ZXIgPSAwOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MTAsNiArNDE4LDggQEAKIAkJbWNhc3BfY2xyX2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFIQ0xLWCk7CiAJfQogCisJbWNhc3AtPnN5c2Nsa19mcmVxID0gZnJlcTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MDMsMjAgKzYxMywyMyBAQAogCXU4IGZpZm9fbGV2ZWw7CiAJdTggc2xvdHMgPSBtY2FzcC0+dGRtX3Nsb3RzOwogCXU4IGFjdGl2ZV9zZXJpYWxpemVyczsKLQlpbnQgY2hhbm5lbHM7CisJaW50IGNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpwY21fY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0JY2hhbm5lbHMgPSBwY21fY2hhbm5lbHMtPm1pbjsKIAotCWFjdGl2ZV9zZXJpYWxpemVycyA9IChjaGFubmVscyArIHNsb3RzIC0gMSkgLyBzbG90czsKKwkvKiBJZiBtY2FzcCBpcyBCQ0xLIG1hc3RlciB3ZSBuZWVkIHRvIHNldCBCQ0xLIGRpdmlkZXIgKi8KKwlpZiAobWNhc3AtPmJjbGtfbWFzdGVyKSB7CisJCXVuc2lnbmVkIGludCBiY2xrX2ZyZXEgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJCWlmIChtY2FzcC0+c3lzY2xrX2ZyZXEgJSBiY2xrX2ZyZXEgIT0gMCkgeworCQkJZGV2X2VycihtY2FzcC0+ZGV2LCAiQ2FuJ3QgcHJvZHVjZSByZXF1cmVkIEJDTEtcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGF2aW5jaV9tY2FzcF9zZXRfY2xrZGl2KAorCQkJY3B1X2RhaSwgMSwgbWNhc3AtPnN5c2Nsa19mcmVxIC8gYmNsa19mcmVxKTsKKwl9CiAKLQlpZiAobWNhc3BfY29tbW9uX2h3X3BhcmFtKG1jYXNwLCBzdWJzdHJlYW0tPnN0cmVhbSwgY2hhbm5lbHMpID09IC1FSU5WQUwpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlmaWZvX2xldmVsID0gbWNhc3AtPnR4bnVtZXZ0ICogYWN0aXZlX3NlcmlhbGl6ZXJzOwotCWVsc2UKLQkJZmlmb19sZXZlbCA9IG1jYXNwLT5yeG51bWV2dCAqIGFjdGl2ZV9zZXJpYWxpemVyczsKKwlyZXQgPSBtY2FzcF9jb21tb25faHdfcGFyYW0obWNhc3AsIHN1YnN0cmVhbS0+c3RyZWFtLCBjaGFubmVscyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChtY2FzcC0+b3BfbW9kZSA9PSBEQVZJTkNJX01DQVNQX0RJVF9NT0RFKQogCQlyZXQgPSBtY2FzcF9kaXRfaHdfcGFyYW0obWNhc3ApOwpAQCAtNjU4LDYgKzY3MSwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBDYWxjdWxhdGUgRklGTyBsZXZlbCAqLworCWFjdGl2ZV9zZXJpYWxpemVycyA9IChjaGFubmVscyArIHNsb3RzIC0gMSkgLyBzbG90czsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZmlmb19sZXZlbCA9IG1jYXNwLT50eG51bWV2dCAqIGFjdGl2ZV9zZXJpYWxpemVyczsKKwllbHNlCisJCWZpZm9fbGV2ZWwgPSBtY2FzcC0+cnhudW1ldnQgKiBhY3RpdmVfc2VyaWFsaXplcnM7CisKIAlpZiAobWNhc3AtPnZlcnNpb24gPT0gTUNBU1BfVkVSU0lPTl8yICYmICFmaWZvX2xldmVsKQogCQlkbWFfcGFyYW1zLT5hY250ID0gNDsKIAllbHNlCkBAIC03MTksNiArNzM5LDQzIEBACiAJLnNldF9zeXNjbGsJPSBkYXZpbmNpX21jYXNwX3NldF9zeXNjbGssCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGRhdmluY2lfbWNhc3Bfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXN0cnVjdCBkYXZpbmNpX21jYXNwX2NvbnRleHQgKmNvbnRleHQgPSAmbWNhc3AtPmNvbnRleHQ7CisKKwljb250ZXh0LT50eGZtdGN0bCA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfVFhGTUNUTF9SRUcpOworCWNvbnRleHQtPnJ4Zm10Y3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNQ1RMX1JFRyk7CisJY29udGV4dC0+dHhmbXQgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1UX1JFRyk7CisJY29udGV4dC0+cnhmbXQgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1UX1JFRyk7CisJY29udGV4dC0+YWNsa3hjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtYQ1RMX1JFRyk7CisJY29udGV4dC0+YWNsa3JjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtSQ1RMX1JFRyk7CisJY29udGV4dC0+cGRpciA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGRhdmluY2lfbWNhc3AgKm1jYXNwID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9jb250ZXh0ICpjb250ZXh0ID0gJm1jYXNwLT5jb250ZXh0OworCisJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNQ1RMX1JFRywgY29udGV4dC0+dHhmbXRjdGwpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTUNUTF9SRUcsIGNvbnRleHQtPnJ4Zm10Y3RsKTsKKwltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1UX1JFRywgY29udGV4dC0+dHhmbXQpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTVRfUkVHLCBjb250ZXh0LT5yeGZtdCk7CisJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcsIGNvbnRleHQtPmFjbGt4Y3RsKTsKKwltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtSQ1RMX1JFRywgY29udGV4dC0+YWNsa3JjdGwpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIGNvbnRleHQtPnBkaXIpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBkYXZpbmNpX21jYXNwX3N1c3BlbmQgTlVMTAorI2RlZmluZSBkYXZpbmNpX21jYXNwX3Jlc3VtZSBOVUxMCisjZW5kaWYKKwogI2RlZmluZSBEQVZJTkNJX01DQVNQX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCiAKICNkZWZpbmUgREFWSU5DSV9NQ0FTUF9QQ01fRk1UUyAoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKQEAgLTczNSw2ICs3OTIsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV9tY2FzcF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkYXZpbmNpLW1jYXNwLjAiLAorCQkuc3VzcGVuZAk9IGRhdmluY2lfbWNhc3Bfc3VzcGVuZCwKKwkJLnJlc3VtZQkJPSBkYXZpbmNpX21jYXNwX3Jlc3VtZSwKIAkJLnBsYXliYWNrCT0gewogCQkJLmNoYW5uZWxzX21pbgk9IDIsCiAJCQkuY2hhbm5lbHNfbWF4CT0gMzIgKiAxNiwKQEAgLTc2OCwyOCArODI3LDI4IEBACiB9OwogCiAvKiBTb21lIEhXIHNwZWNpZmljIHZhbHVlcyBhbmQgZGVmYXVsdHMuIFRoZSByZXN0IGlzIGZpbGxlZCBpbiBmcm9tIERULiAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBkbTY0NnhfbWNhc3BfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgZG02NDZ4X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMHg0MDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAweDQwMCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8xLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkucnhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8yLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBhbTMzeHhfbWNhc3BfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgYW0zM3h4X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMCwKIAkucnhfZG1hX29mZnNldCA9IDAsCiAJLmFzcF9jaGFuX3EgPSBFVkVOVFFfMCwKIAkudmVyc2lvbiA9IE1DQVNQX1ZFUlNJT05fMywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgZHJhN19tY2FzcF9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkcmE3X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMHgyMDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAweDI4NCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLApAQCAtODU3LDExICs5MTYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpkYXZpbmNpX21jYXNwX3NldF9wZGF0YV9mcm9tX29mKAorc3RhdGljIHN0cnVjdCBkYXZpbmNpX21jYXNwX3BkYXRhICpkYXZpbmNpX21jYXNwX3NldF9wZGF0YV9mcm9tX29mKAogCQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgKnBkYXRhID0gTlVMTDsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCQlvZl9tYXRjaF9kZXZpY2UobWNhc3BfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGRtYV9zcGVjOwpAQCAtODc0LDcgKzkzMyw3IEBACiAJCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJCXJldHVybiBwZGF0YTsKIAl9IGVsc2UgaWYgKG1hdGNoKSB7Ci0JCXBkYXRhID0gKHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqKSBtYXRjaC0+ZGF0YTsKKwkJcGRhdGEgPSAoc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEqKSBtYXRjaC0+ZGF0YTsKIAl9IGVsc2UgewogCQkvKiBjb250cm9sIHNob3VsZG4ndCByZWFjaCBoZXJlLiBzb21ldGhpbmcgaXMgd3JvbmcgKi8KIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTk2Niw5ICsxMDI1LDEwIEBACiAKIHN0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfZGF0YTsKKwlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX3BhcmFtczsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaW9hcmVhLCAqcmVzLCAqZGF0OwotCXN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgKnBkYXRhOwogCXN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcDsKIAlpbnQgcmV0OwogCkBAIC0xMDM1LDQxICsxMDk1LDQ5IEBACiAJaWYgKGRhdCkKIAkJbWNhc3AtPmRhdF9wb3J0ID0gdHJ1ZTsKIAotCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOwotCWRtYV9kYXRhLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JZG1hX2RhdGEtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfZGF0YS0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKLQlkbWFfZGF0YS0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKKwlkbWFfcGFyYW1zID0gJm1jYXNwLT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKKwlkbWFfcGFyYW1zLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7CisJZG1hX3BhcmFtcy0+cmFtX2NoYW5fcSA9IHBkYXRhLT5yYW1fY2hhbl9xOworCWRtYV9wYXJhbXMtPnNyYW1fcG9vbCA9IHBkYXRhLT5zcmFtX3Bvb2w7CisJZG1hX3BhcmFtcy0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKIAlpZiAoZGF0KQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCQlkbWFfcGFyYW1zLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnR4X2RtYV9vZmZzZXQ7CisJCWRtYV9wYXJhbXMtPmRtYV9hZGRyID0gbWVtLT5zdGFydCArIHBkYXRhLT50eF9kbWFfb2Zmc2V0OwogCiAJLyogVW5jb25kaXRpb25hbCBkbWFlbmdpbmUgc3R1ZmYgKi8KLQltY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYWRkciA9IGRtYV9kYXRhLT5kbWFfYWRkcjsKKwlkbWFfZGF0YS0+YWRkciA9IGRtYV9wYXJhbXMtPmRtYV9hZGRyOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKIAlpZiAocmVzKQotCQlkbWFfZGF0YS0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisJCWRtYV9wYXJhbXMtPmNoYW5uZWwgPSByZXMtPnN0YXJ0OwogCWVsc2UKLQkJZG1hX2RhdGEtPmNoYW5uZWwgPSBwZGF0YS0+dHhfZG1hX2NoYW5uZWw7CisJCWRtYV9wYXJhbXMtPmNoYW5uZWwgPSBwZGF0YS0+dHhfZG1hX2NoYW5uZWw7CiAKLQlkbWFfZGF0YSA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwotCWRtYV9kYXRhLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JZG1hX2RhdGEtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfZGF0YS0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKLQlkbWFfZGF0YS0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9jYXB0dXJlOwotCWlmIChkYXQpCi0JCWRtYV9kYXRhLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CisJLyogZG1hZW5naW5lIGZpbHRlciBkYXRhIGZvciBEVCBhbmQgbm9uLURUIGJvb3QgKi8KKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICJ0eCI7CiAJZWxzZQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICZkbWFfcGFyYW1zLT5jaGFubmVsOworCisJZG1hX3BhcmFtcyA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCWRtYV9wYXJhbXMtPmFzcF9jaGFuX3EgPSBwZGF0YS0+YXNwX2NoYW5fcTsKKwlkbWFfcGFyYW1zLT5yYW1fY2hhbl9xID0gcGRhdGEtPnJhbV9jaGFuX3E7CisJZG1hX3BhcmFtcy0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKKwlkbWFfcGFyYW1zLT5zcmFtX3NpemUgPSBwZGF0YS0+c3JhbV9zaXplX2NhcHR1cmU7CisJaWYgKGRhdCkKKwkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCWVsc2UKKwkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CiAKIAkvKiBVbmNvbmRpdGlvbmFsIGRtYWVuZ2luZSBzdHVmZiAqLwotCW1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmFkZHIgPSBkbWFfZGF0YS0+ZG1hX2FkZHI7CisJZG1hX2RhdGEtPmFkZHIgPSBkbWFfcGFyYW1zLT5kbWFfYWRkcjsKIAogCWlmIChtY2FzcC0+dmVyc2lvbiA8IE1DQVNQX1ZFUlNJT05fMykgewogCQltY2FzcC0+Zmlmb19iYXNlID0gREFWSU5DSV9NQ0FTUF9WMl9BRklGT19CQVNFOwotCQkvKiBkbWFfZGF0YS0+ZG1hX2FkZHIgaXMgcG9pbnRpbmcgdG8gdGhlIGRhdGEgcG9ydCBhZGRyZXNzICovCisJCS8qIGRtYV9wYXJhbXMtPmRtYV9hZGRyIGlzIHBvaW50aW5nIHRvIHRoZSBkYXRhIHBvcnQgYWRkcmVzcyAqLwogCQltY2FzcC0+ZGF0X3BvcnQgPSB0cnVlOwogCX0gZWxzZSB7CiAJCW1jYXNwLT5maWZvX2Jhc2UgPSBEQVZJTkNJX01DQVNQX1YzX0FGSUZPX0JBU0U7CkBAIC0xMDc3LDEzICsxMTQ1LDE1IEBACiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOwogCWlmIChyZXMpCi0JCWRtYV9kYXRhLT5jaGFubmVsID0gcmVzLT5zdGFydDsKKwkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfZGF0YS0+Y2hhbm5lbCA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKKwkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKIAotCS8qIFVuY29uZGl0aW9uYWwgZG1hZW5naW5lIHN0dWZmICovCi0JbWNhc3AtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmZpbHRlcl9kYXRhID0gInR4IjsKLQltY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5maWx0ZXJfZGF0YSA9ICJyeCI7CisJLyogZG1hZW5naW5lIGZpbHRlciBkYXRhIGZvciBEVCBhbmQgbm9uLURUIGJvb3QgKi8KKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICJyeCI7CisJZWxzZQorCQlkbWFfZGF0YS0+ZmlsdGVyX2RhdGEgPSAmZG1hX3BhcmFtcy0+Y2hhbm5lbDsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtY2FzcCk7CiAKQEAgLTExMjcsNDkgKzExOTcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbWNhc3AtPmNvbnRleHQudHhmbXRjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1DVExfUkVHKTsKLQltY2FzcC0+Y29udGV4dC5yeGZtdGN0bCA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTUNUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnR4Zm10ID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNVF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnJ4Zm10ID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNVF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LmFjbGt4Y3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LmFjbGtyY3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLUkNUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnBkaXIgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfbWNhc3BfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfVFhGTUNUTF9SRUcsIG1jYXNwLT5jb250ZXh0LnR4Zm10Y3RsKTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1DVExfUkVHLCBtY2FzcC0+Y29udGV4dC5yeGZtdGN0bCk7Ci0JbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNVF9SRUcsIG1jYXNwLT5jb250ZXh0LnR4Zm10KTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1UX1JFRywgbWNhc3AtPmNvbnRleHQucnhmbXQpOwotCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfQUNMS1hDVExfUkVHLCBtY2FzcC0+Y29udGV4dC5hY2xreGN0bCk7Ci0JbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLUkNUTF9SRUcsIG1jYXNwLT5jb250ZXh0LmFjbGtyY3RsKTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBtY2FzcC0+Y29udGV4dC5wZGlyKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLVNJTVBMRV9ERVZfUE1fT1BTKGRhdmluY2lfbWNhc3BfcG1fb3BzLAotCQkgIGRhdmluY2lfbWNhc3Bfc3VzcGVuZCwKLQkJICBkYXZpbmNpX21jYXNwX3Jlc3VtZSk7Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhdmluY2lfbWNhc3BfZHJpdmVyID0gewogCS5wcm9iZQkJPSBkYXZpbmNpX21jYXNwX3Byb2JlLAogCS5yZW1vdmUJCT0gZGF2aW5jaV9tY2FzcF9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImRhdmluY2ktbWNhc3AiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gJmRhdmluY2lfbWNhc3BfcG1fb3BzLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtY2FzcF9kdF9pZHMsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5jIGIvc291bmQvc29jL2RhdmluY2kvZWRtYS1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzhhZmIxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2RhdmluY2kvZWRtYS1wY20uYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogZWRtYS1wY20uYyAtIGVETUEgUENNIGRyaXZlciB1c2luZyBkbWFlbmdpbmUgZm9yIEFNM3h4eCwgQU00eHh4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgorICoKKyAqIEJhc2VkIG9uOiBzb3VuZC9zb2MvdGVncmEvdGVncmFfcGNtLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VkbWEuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGVkbWFfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fQkFUQ0ggfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjggKiAxMDI0LAorCS5wZXJpb2RfYnl0ZXNfbWluCT0gMzIsCisJLnBlcmlvZF9ieXRlc19tYXgJPSA2NCAqIDEwMjQsCisJLnBlcmlvZHNfbWluCQk9IDIsCisJLnBlcmlvZHNfbWF4CQk9IDE5LCAvKiBMaW1pdCBieSBlZG1hIGRtYWVuZ2luZSBkcml2ZXIgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9wY21fY29uZmlnIGVkbWFfZG1hZW5naW5lX3BjbV9jb25maWcgPSB7CisJLnBjbV9oYXJkd2FyZSA9ICZlZG1hX3BjbV9oYXJkd2FyZSwKKwkucHJlcGFyZV9zbGF2ZV9jb25maWcgPSBzbmRfZG1hZW5naW5lX3BjbV9wcmVwYXJlX3NsYXZlX2NvbmZpZywKKwkuY29tcGF0X2ZpbHRlcl9mbiA9IGVkbWFfZmlsdGVyX2ZuLAorCS5wcmVhbGxvY19idWZmZXJfc2l6ZSA9IDEyOCAqIDEwMjQsCit9OworCitpbnQgZWRtYV9wY21fcGxhdGZvcm1fcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZtX3NuZF9kbWFlbmdpbmVfcGNtX3JlZ2lzdGVyKGRldiwgJmVkbWFfZG1hZW5naW5lX3BjbV9jb25maWcsCisJCQkJCVNORF9ETUFFTkdJTkVfUENNX0ZMQUdfQ09NUEFUKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVkbWFfcGNtX3BsYXRmb3JtX3JlZ2lzdGVyKTsKKworTU9EVUxFX0FVVEhPUigiUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZURNQSBQQ00gQVNvQyBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2VkbWEtcGNtLmggYi9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBlZG1hLXBjbS5oIC0gZURNQSBQQ00gZHJpdmVyIHVzaW5nIGRtYWVuZ2luZSBmb3IgQU0zeHh4LCBBTTR4eHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IFBldGVyIFVqZmFsdXNpIDxwZXRlci51amZhbHVzaUB0aS5jb20+CisgKgorICogQmFzZWQgb246IHNvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRURNQV9QQ01fSF9fCisjZGVmaW5lIF9fRURNQV9QQ01fSF9fCisKK2ludCBlZG1hX3BjbV9wbGF0Zm9ybV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX19FRE1BX1BDTV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvS2NvbmZpZyBiL3NvdW5kL3NvYy9mc2wvS2NvbmZpZwppbmRleCAwN2Y4ZjE0Li4zMzhhOTE2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ZzbC9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFNORF9TT0NfRlNMX1NBSQogCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9NTUlPCiAJc2VsZWN0IFNORF9TT0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCiAKIGNvbmZpZyBTTkRfU09DX0ZTTF9TU0kKQEAgLTcsOSArOCwxMiBAQAogCiBjb25maWcgU05EX1NPQ19GU0xfU1BESUYKIAl0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfTU1JTwogCiBjb25maWcgU05EX1NPQ19GU0xfRVNBSQogCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9NTUlPCisJc2VsZWN0IFNORF9TT0NfRlNMX1VUSUxTCiAKIGNvbmZpZyBTTkRfU09DX0ZTTF9VVElMUwogCXRyaXN0YXRlCkBAIC0xMTcsNiArMTIxLDcgQEAKIAogY29uZmlnIFNORF9TT0NfSU1YX1NTSQogCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfRlNMX1VUSUxTCiAKIGNvbmZpZyBTTkRfU09DX0lNWF9QQ01fRklRCiAJdHJpc3RhdGUKQEAgLTE2OCwxMiArMTczLDE0IEBACiAJZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9NQklNWDI3X0JBU0VCT0FSRCBcCiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0QyNV9CQVNFQk9BUkQgXAogCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNEMzVfQkFTRUJPQVJEIFwKLQkJfHwgTUFDSF9FVUtSRUFfTUJJTVhTRDUxX0JBU0VCT0FSRAorCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNENTFfQkFTRUJPQVJEIFwKKwkJfHwgKE9GICYmIEFSTSkKIAlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCi0Jc2VsZWN0IFNORF9TT0NfSU1YX1BDTV9GSVEKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAlzZWxlY3QgU05EX1NPQ19JTVhfQVVETVVYCiAJc2VsZWN0IFNORF9TT0NfSU1YX1NTSQorCXNlbGVjdCBTTkRfU09DX0ZTTF9TU0kKKwlzZWxlY3QgU05EX1NPQ19JTVhfUENNX0RNQQogCWhlbHAKIAkgIEVuYWJsZSBJMlMgYmFzZWQgYWNjZXNzIHRvIHRoZSBUTFYzMjBBSUMyM0IgY29kZWMgYXR0YWNoZWQKIAkgIHRvIHRoZSBTU0kgaW50ZXJmYWNlCkBAIC0yMDQsNyArMjExLDYgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIGkuTVggYm9hcmRzIHdpdGggUy9QRElGIgogCXNlbGVjdCBTTkRfU09DX0lNWF9QQ01fRE1BCiAJc2VsZWN0IFNORF9TT0NfRlNMX1NQRElGCi0Jc2VsZWN0IFJFR01BUF9NTUlPCiAJaGVscAogCSAgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIGkuTVggYm9hcmRzIHdpdGggUy9QRElGCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGFuIGkuTVggYm9hcmQgd2l0aApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9ldWtyZWEtdGx2MzIwLmMgYi9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYwppbmRleCA1OTgzNzQwLi5lYjA5M2Q1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYworKysgYi9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYwpAQCAtMTUsOCArMTUsMTEgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMjYsNiArMjksNyBAQAogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3RsdjMyMGFpYzIzLmgiCiAjaW5jbHVkZSAiaW14LXNzaS5oIgorI2luY2x1ZGUgImZzbF9zc2kuaCIKICNpbmNsdWRlICJpbXgtYXVkbXV4LmgiCiAKICNkZWZpbmUgQ09ERUNfQ0xPQ0sgMTIwMDAwMDAKQEAgLTQxLDcgKzQ1LDggQEAKIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CiAJCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CiAJCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0KSB7CisJLyogZnNsX3NzaSBsYWNrcyB0aGUgc2V0X2ZtdCBvcHMuICovCisJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CiAJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LAogCQkJIkZhaWxlZCB0byBzZXQgdGhlIGNwdSBkYWkgZm9ybWF0LlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC02MywxMSArNjgsMTMgQEAKIAkJCSJGYWlsZWQgdG8gc2V0IHRoZSBjb2RlYyBzeXNjbGsuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CisKIAlzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMHhmZmZmZmZjLCAweGZmZmZmZmMsIDIsIDApOwogCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBJTVhfU1NQX1NZU19DTEssIDAsCiAJCQkJU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCkgeworCS8qIGZzbF9zc2kgbGFja3MgdGhlIHNldF9zeXNjbGsgb3BzICovCisJaWYgKHJldCAmJiByZXQgIT0gLUVJTlZBTCkgewogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwKIAkJCSJDYW4ndCBzZXQgdGhlIElNWF9TU1BfU1lTX0NMSyBDUFUgc3lzdGVtIGNsb2NrLlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC04NCwxNCArOTEsMTAgQEAKIAkubmFtZQkJPSAidGx2MzIwYWljMjMiLAogCS5zdHJlYW1fbmFtZQk9ICJUTFYzMjBBSUMyMyIsCiAJLmNvZGVjX2RhaV9uYW1lCT0gInRsdjMyMGFpYzIzLWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lCT0gImlteC1zc2kuMCIsCi0JLmNvZGVjX25hbWUJPSAidGx2MzIwYWljMjMtY29kZWMuMC0wMDFhIiwKLQkuY3B1X2RhaV9uYW1lCT0gImlteC1zc2kuMCIsCiAJLm9wcwkJPSAmZXVrcmVhX3RsdjMyMF9zbmRfb3BzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgZXVrcmVhX3RsdjMyMCA9IHsKLQkubmFtZQkJPSAiY3B1aW14LWF1ZGlvIiwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rCT0gJmV1a3JlYV90bHYzMjBfZGFpLAogCS5udW1fbGlua3MJPSAxLApAQCAtMTAxLDggKzEwNCw2NSBAQAogewogCWludCByZXQ7CiAJaW50IGludF9wb3J0ID0gMCwgZXh0X3BvcnQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3NpX25wLCAqY29kZWNfbnA7CiAKLQlpZiAobWFjaGluZV9pc19ldWtyZWFfY3B1aW14MjcoKSkgeworCWV1a3JlYV90bHYzMjAuZGV2ID0gJnBkZXYtPmRldjsKKwlpZiAobnApIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoJmV1a3JlYV90bHYzMjAsCisJCQkJCQkgImV1a3JlYSxtb2RlbCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImV1a3JlYSxtb2RlbCBub2RlIG1pc3Npbmcgb3IgaW52YWxpZC5cbiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlzc2lfbnAgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgICJzc2ktY29udHJvbGxlciIsIDApOworCQlpZiAoIXNzaV9ucCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJzc2ktY29udHJvbGxlciBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWNvZGVjX25wID0gb2ZfcGFyc2VfcGhhbmRsZShzc2lfbnAsICJjb2RlYy1oYW5kbGUiLCAwKTsKKwkJaWYgKGNvZGVjX25wKQorCQkJZXVrcmVhX3RsdjMyMF9kYWkuY29kZWNfb2Zfbm9kZSA9IGNvZGVjX25wOworCQllbHNlCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb2RlYy1oYW5kbGUgbm9kZSBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxtdXgtaW50LXBvcnQiLCAmaW50X3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImZzbCxtdXgtaW50LXBvcnQgbm9kZSBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsbXV4LWV4dC1wb3J0IiwgJmV4dF9wb3J0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJmc2wsbXV4LWV4dC1wb3J0IG5vZGUgbWlzc2luZyBvciBpbnZhbGlkLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyoKKwkJICogVGhlIHBvcnQgbnVtYmVyaW5nIGluIHRoZSBoYXJkd2FyZSBtYW51YWwgc3RhcnRzIGF0IDEsIHdoaWxlCisJCSAqIHRoZSBhdWRtdXggQVBJIGV4cGVjdHMgaXQgc3RhcnRzIGF0IDAuCisJCSAqLworCQlpbnRfcG9ydC0tOworCQlleHRfcG9ydC0tOworCisJCWV1a3JlYV90bHYzMjBfZGFpLmNwdV9vZl9ub2RlID0gc3NpX25wOworCQlldWtyZWFfdGx2MzIwX2RhaS5wbGF0Zm9ybV9vZl9ub2RlID0gc3NpX25wOworCX0gZWxzZSB7CisJCWV1a3JlYV90bHYzMjBfZGFpLmNwdV9kYWlfbmFtZSA9ICJpbXgtc3NpLjAiOworCQlldWtyZWFfdGx2MzIwX2RhaS5wbGF0Zm9ybV9uYW1lID0gImlteC1zc2kuMCI7CisJCWV1a3JlYV90bHYzMjBfZGFpLmNvZGVjX25hbWUgPSAidGx2MzIwYWljMjMtY29kZWMuMC0wMDFhIjsKKwkJZXVrcmVhX3RsdjMyMC5uYW1lID0gImNwdWlteC1hdWRpbyI7CisJfQorCisJaWYgKG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI3KCkgfHwKKwkgICAgb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpbXgyMS1hdWRtdXgiKSkgewogCQlpbXhfYXVkbXV4X3YxX2NvbmZpZ3VyZV9wb3J0KE1YMjdfQVVETVVYX0hQQ1IxX1NTSTAsCiAJCQlJTVhfQVVETVVYX1YxX1BDUl9TWU4gfAogCQkJSU1YX0FVRE1VWF9WMV9QQ1JfVEZTRElSIHwKQEAgLTExOSw4ICsxNzksMTIgQEAKIAkJKTsKIAl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI1c2QoKSB8fAogCQkgICBtYWNoaW5lX2lzX2V1a3JlYV9jcHVpbXgzNXNkKCkgfHwKLQkJICAgbWFjaGluZV9pc19ldWtyZWFfY3B1aW14NTFzZCgpKSB7Ci0JCWV4dF9wb3J0ID0gbWFjaGluZV9pc19ldWtyZWFfY3B1aW14MjVzZCgpID8gNCA6IDM7CisJCSAgIG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDUxc2QoKSB8fAorCQkgICBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlteDMxLWF1ZG11eCIpKSB7CisJCWlmICghbnApCisJCQlleHRfcG9ydCA9IG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI1c2QoKSA/CisJCQkJNCA6IDM7CisKIAkJaW14X2F1ZG11eF92Ml9jb25maWd1cmVfcG9ydChpbnRfcG9ydCwKIAkJCUlNWF9BVURNVVhfVjJfUFRDUl9TWU4gfAogCQkJSU1YX0FVRE1VWF9WMl9QVENSX1RGU0RJUiB8CkBAIC0xMzQsMTQgKzE5OCwyNyBAQAogCQkJSU1YX0FVRE1VWF9WMl9QRENSX1JYRFNFTChpbnRfcG9ydCkKIAkJKTsKIAl9IGVsc2UgewotCQkvKiByZXR1cm4gaGFwcHkuIFdlIG1pZ2h0IHJ1biBvbiBhIHRvdGFsbHkgZGlmZmVyZW50IG1hY2hpbmUgKi8KLQkJcmV0dXJuIDA7CisJCWlmIChucCkgeworCQkJLyogVGhlIGV1a3JlYSxhc29jLXRsdjMyMCBkcml2ZXIgd2FzIGV4cGxpY2l0ZWx5CisJCQkgKiByZXF1ZXN0ZWQgKHRocm91Z2ggdGhlIGRldmljZSB0cmVlKS4KKwkJCSAqLworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJNaXNzaW5nIG9yIGludmFsaWQgYXVkbXV4IERUIG5vZGUuXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9IGVsc2UgeworCQkJLyogUmV0dXJuIGhhcHB5LgorCQkJICogV2UgbWlnaHQgcnVuIG9uIGEgdG90YWxseSBkaWZmZXJlbnQgbWFjaGluZS4KKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKLQlldWtyZWFfdGx2MzIwLmRldiA9ICZwZGV2LT5kZXY7CiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZldWtyZWFfdGx2MzIwKTsKK2VycjoKIAlpZiAocmV0KQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICglZClcbiIsIHJldCk7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChzc2lfbnApOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MywxMCArMjMwLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF90bHYzMjBfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJldWtyZWEsYXNvYy10bHYzMjAifSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfdGx2MzIwX2R0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV1a3JlYV90bHYzMjBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImV1a3JlYV90bHYzMjAiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X3RsdjMyMF9kdF9pZHMsCiAJfSwKIAkucHJvYmUgPSBldWtyZWFfdGx2MzIwX3Byb2JlLAogCS5yZW1vdmUgPSBldWtyZWFfdGx2MzIwX3JlbW92ZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYwppbmRleCBjODQwMjZjLi5jOGU1ZGIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlICJmc2xfZXNhaS5oIgogI2luY2x1ZGUgImlteC1wY20uaCIKKyNpbmNsdWRlICJmc2xfdXRpbHMuaCIKIAogI2RlZmluZSBGU0xfRVNBSV9SQVRFUwkJU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKICNkZWZpbmUgRlNMX0VTQUlfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKQEAgLTQzMSwxNyArNDMyLDI2IEBACiBzdGF0aWMgaW50IGZzbF9lc2FpX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgZnNsX2VzYWkgKmVzYWlfcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CiAKIAkvKgogCSAqIFNvbWUgcGxhdGZvcm1zIG1pZ2h0IHVzZSB0aGUgc2FtZSBiaXQgdG8gZ2F0ZSBhbGwgdGhyZWUgb3IgdHdvIG9mCiAJICogY2xvY2tzLCBzbyBrZWVwIGFsbCBjbG9ja3Mgb3Blbi9jbG9zZSBhdCB0aGUgc2FtZSB0aW1lIGZvciBzYWZldHkKIAkgKi8KLQljbGtfcHJlcGFyZV9lbmFibGUoZXNhaV9wcml2LT5jb3JlY2xrKTsKLQlpZiAoIUlTX0VSUihlc2FpX3ByaXYtPmV4dGFsY2xrKSkKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGVzYWlfcHJpdi0+ZXh0YWxjbGspOwotCWlmICghSVNfRVJSKGVzYWlfcHJpdi0+ZnN5c2NsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShlc2FpX3ByaXYtPmZzeXNjbGspOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShlc2FpX3ByaXYtPmNvcmVjbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5leHRhbGNsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGVzYWlfcHJpdi0+ZXh0YWxjbGspOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZXh0YWxjazsKKwl9CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5mc3lzY2xrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZXNhaV9wcml2LT5mc3lzY2xrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2ZzeXNjbGs7CisJfQogCiAJaWYgKCFkYWktPmFjdGl2ZSkgewogCQkvKiBSZXNldCBQb3J0IEMgKi8KQEAgLTQ2Myw2ICs0NzMsMTQgQEAKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyX2ZzeXNjbGs6CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5leHRhbGNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShlc2FpX3ByaXYtPmV4dGFsY2xrKTsKK2Vycl9leHRhbGNrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShlc2FpX3ByaXYtPmNvcmVjbGspOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmc2xfZXNhaV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCkBAIC01NjQsNiArNTgyLDcgQEAKIAkuaHdfcGFyYW1zID0gZnNsX2VzYWlfaHdfcGFyYW1zLAogCS5zZXRfc3lzY2xrID0gZnNsX2VzYWlfc2V0X2RhaV9zeXNjbGssCiAJLnNldF9mbXQgPSBmc2xfZXNhaV9zZXRfZGFpX2ZtdCwKKwkueGxhdGVfdGRtX3Nsb3RfbWFzayA9IGZzbF9hc29jX3hsYXRlX3RkbV9zbG90X21hc2ssCiAJLnNldF90ZG1fc2xvdCA9IGZzbF9lc2FpX3NldF9kYWlfdGRtX3Nsb3QsCiB9OwogCkBAIC02NjEsNyArNjgwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBmc2xfZXNhaV9yZWdtYXBfY29uZmlnID0geworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGZzbF9lc2FpX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gMzIsCiAJLnJlZ19zdHJpZGUgPSA0LAogCS52YWxfYml0cyA9IDMyLApAQCAtNjg3LDYgKzcwNiw5IEBACiAJZXNhaV9wcml2LT5wZGV2ID0gcGRldjsKIAlzdHJjcHkoZXNhaV9wcml2LT5uYW1lLCBucC0+bmFtZSk7CiAKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbiIpKQorCQlmc2xfZXNhaV9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9CSUc7CisKIAkvKiBHZXQgdGhlIGFkZHJlc3NlcyBhbmQgSVJRICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCmluZGV4IGNkZDNmYTguLmM0YTQyMzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgpAQCAtMjIsMzQgKzIzLDYgQEAKIAogI2luY2x1ZGUgImZzbF9zYWkuaCIKIAotc3RhdGljIGlubGluZSB1MzIgc2FpX3JlYWRsKHN0cnVjdCBmc2xfc2FpICpzYWksCi0JCWNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gX19yYXdfcmVhZGwoYWRkcik7Ci0KLQlpZiAobGlrZWx5KHNhaS0+YmlnX2VuZGlhbl9yZWdzKSkKLQkJdmFsID0gYmUzMl90b19jcHUodmFsKTsKLQllbHNlCi0JCXZhbCA9IGxlMzJfdG9fY3B1KHZhbCk7Ci0Jcm1iKCk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2FpX3dyaXRlbChzdHJ1Y3QgZnNsX3NhaSAqc2FpLAotCQl1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jd21iKCk7Ci0JaWYgKGxpa2VseShzYWktPmJpZ19lbmRpYW5fcmVncykpCi0JCXZhbCA9IGNwdV90b19iZTMyKHZhbCk7Ci0JZWxzZQotCQl2YWwgPSBjcHVfdG9fbGUzMih2YWwpOwotCi0JX19yYXdfd3JpdGVsKHZhbCwgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX3N5c2Nsa190cihzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCiAJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZnNsX2RpcikKIHsKQEAgLTYxLDcgKzM0LDggQEAKIAllbHNlCiAJCXJlZ19jcjIgPSBGU0xfU0FJX1JDUjI7CiAKLQl2YWxfY3IyID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyMik7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjIsICZ2YWxfY3IyKTsKKwogCXZhbF9jcjIgJj0gfkZTTF9TQUlfQ1IyX01TRUxfTUFTSzsKIAogCXN3aXRjaCAoY2xrX2lkKSB7CkBAIC04MSw3ICs1NSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IyLCBzYWktPmJhc2UgKyByZWdfY3IyKTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjIsIHZhbF9jcjIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OSwzMiArNjMsMjIgQEAKIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCiAJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQogewotCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAlpbnQgcmV0OwogCiAJaWYgKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzYWktPmNsayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGZzbF9zYWlfc2V0X2RhaV9zeXNjbGtfdHIoY3B1X2RhaSwgY2xrX2lkLCBmcmVxLAogCQkJCQlGU0xfRk1UX1RSQU5TTUlUVEVSKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAiQ2Fubm90IHNldCB0eCBzeXNjbGs6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9jbGs7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gZnNsX3NhaV9zZXRfZGFpX3N5c2Nsa190cihjcHVfZGFpLCBjbGtfaWQsIGZyZXEsCiAJCQkJCUZTTF9GTVRfUkVDRUlWRVIpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIkNhbm5vdCBzZXQgcnggc3lzY2xrOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQotZXJyX2NsazoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2FpLT5jbGspOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMyw0MyArOTcsODQgQEAKIAkJcmVnX2NyNCA9IEZTTF9TQUlfUkNSNDsKIAl9CiAKLQl2YWxfY3IyID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyMik7Ci0JdmFsX2NyNCA9IHNhaV9yZWFkbChzYWksIHNhaS0+YmFzZSArIHJlZ19jcjQpOworCXJlZ21hcF9yZWFkKHNhaS0+cmVnbWFwLCByZWdfY3IyLCAmdmFsX2NyMik7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjQsICZ2YWxfY3I0KTsKIAogCWlmIChzYWktPmJpZ19lbmRpYW5fZGF0YSkKIAkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfTUY7CiAJZWxzZQogCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X01GOwogCisJLyogREFJIG1vZGUgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6Ci0JCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNFOworCQkvKgorCQkgKiBGcmFtZSBsb3csIDFjbGsgYmVmb3JlIGRhdGEsIG9uZSB3b3JkIGxlbmd0aCBmb3IgZnJhbWUgc3luYywKKwkJICogZnJhbWUgc3luYyBzdGFydHMgb25lIHNlcmlhbCBjbG9jayBjeWNsZSBlYXJsaWVyLAorCQkgKiB0aGF0IGlzLCB0b2dldGhlciB3aXRoIHRoZSBsYXN0IGJpdCBvZiB0aGUgcHJldmlvdXMKKwkJICogZGF0YSB3b3JkLgorCQkgKi8KKwkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNQOworCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZTRSB8IEZTTF9TQUlfQ1I0X0ZTUDsKIAkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCS8qCisJCSAqIEZyYW1lIGhpZ2gsIG9uZSB3b3JkIGxlbmd0aCBmb3IgZnJhbWUgc3luYywKKwkJICogZnJhbWUgc3luYyBhc3NlcnRzIHdpdGggdGhlIGZpcnN0IGJpdCBvZiB0aGUgZnJhbWUuCisJCSAqLworCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCXZhbF9jcjQgJj0gfihGU0xfU0FJX0NSNF9GU0UgfCBGU0xfU0FJX0NSNF9GU1ApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQkvKgorCQkgKiBGcmFtZSBoaWdoLCAxY2xrIGJlZm9yZSBkYXRhLCBvbmUgYml0IGZvciBmcmFtZSBzeW5jLAorCQkgKiBmcmFtZSBzeW5jIHN0YXJ0cyBvbmUgc2VyaWFsIGNsb2NrIGN5Y2xlIGVhcmxpZXIsCisJCSAqIHRoYXQgaXMsIHRvZ2V0aGVyIHdpdGggdGhlIGxhc3QgYml0IG9mIHRoZSBwcmV2aW91cworCQkgKiBkYXRhIHdvcmQuCisJCSAqLworCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZTUDsKKwkJdmFsX2NyNCB8PSBGU0xfU0FJX0NSNF9GU0U7CisJCXNhaS0+aXNfZHNwX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQkvKgorCQkgKiBGcmFtZSBoaWdoLCBvbmUgYml0IGZvciBmcmFtZSBzeW5jLAorCQkgKiBmcmFtZSBzeW5jIGFzc2VydHMgd2l0aCB0aGUgZmlyc3QgYml0IG9mIHRoZSBmcmFtZS4KKwkJICovCisJCXZhbF9jcjIgJj0gfkZTTF9TQUlfQ1IyX0JDUDsKKwkJdmFsX2NyNCAmPSB+KEZTTF9TQUlfQ1I0X0ZTRSB8IEZTTF9TQUlfQ1I0X0ZTUCk7CisJCXNhaS0+aXNfZHNwX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCS8qIFRvIGJlIGRvbmUgKi8KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBEQUkgY2xvY2sgaW52ZXJzaW9uICovCiAJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6Ci0JCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNQOwotCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCS8qIEludmVydCBib3RoIGNsb2NrcyAqLworCQl2YWxfY3IyIF49IEZTTF9TQUlfQ1IyX0JDUDsKKwkJdmFsX2NyNCBePSBGU0xfU0FJX0NSNF9GU1A7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6Ci0JCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZTUDsKLQkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNQOworCQkvKiBJbnZlcnQgYml0IGNsb2NrICovCisJCXZhbF9jcjIgXj0gRlNMX1NBSV9DUjJfQkNQOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgotCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZTUDsKLQkJdmFsX2NyMiB8PSBGU0xfU0FJX0NSMl9CQ1A7CisJCS8qIEludmVydCBmcmFtZSBjbG9jayAqLworCQl2YWxfY3I0IF49IEZTTF9TQUlfQ1I0X0ZTUDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKLQkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNQOwotCQl2YWxfY3IyIHw9IEZTTF9TQUlfQ1IyX0JDUDsKKwkJLyogTm90aGluZyB0byBkbyBmb3IgYm90aCBub3JtYWwgY2FzZXMgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogREFJIGNsb2NrIG1hc3RlciBtYXNrcyAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CiAJCXZhbF9jcjIgfD0gRlNMX1NBSV9DUjJfQkNEX01TVFI7CkBAIC0xNzksMzkgKzE4NCwzNyBAQAogCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ0RfTVNUUjsKIAkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNEX01TVFI7CiAJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJdmFsX2NyMiB8PSBGU0xfU0FJX0NSMl9CQ0RfTVNUUjsKKwkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNEX01TVFI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUzoKKwkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNEX01TVFI7CisJCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNEX01TVFI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IyLCBzYWktPmJhc2UgKyByZWdfY3IyKTsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyNCwgc2FpLT5iYXNlICsgcmVnX2NyNCk7CisJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCByZWdfY3IyLCB2YWxfY3IyKTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjQsIHZhbF9jcjQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksIHVuc2lnbmVkIGludCBmbXQpCiB7Ci0Jc3RydWN0IGZzbF9zYWkgKnNhaSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwogCWludCByZXQ7CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2FpLT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBmc2xfc2FpX3NldF9kYWlfZm10X3RyKGNwdV9kYWksIGZtdCwgRlNMX0ZNVF9UUkFOU01JVFRFUik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIkNhbm5vdCBzZXQgdHggZm9ybWF0OiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGZzbF9zYWlfc2V0X2RhaV9mbXRfdHIoY3B1X2RhaSwgZm10LCBGU0xfRk1UX1JFQ0VJVkVSKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCkKIAkJZGV2X2VycihjcHVfZGFpLT5kZXYsICJDYW5ub3Qgc2V0IHJ4IGZvcm1hdDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2NsazsKLQl9Ci0KLWVycl9jbGs6Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhaS0+Y2xrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzUsMTYgKzIzOCwxOSBAQAogCQlyZWdfbXIgPSBGU0xfU0FJX1JNUjsKIAl9CiAKLQl2YWxfY3I0ID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyNCk7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjQsICZ2YWxfY3I0KTsKKwlyZWdtYXBfcmVhZChzYWktPnJlZ21hcCwgcmVnX2NyNCwgJnZhbF9jcjUpOworCiAJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfU1lXRF9NQVNLOwogCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZSU1pfTUFTSzsKIAotCXZhbF9jcjUgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyByZWdfY3I1KTsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9XTldfTUFTSzsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9XMFdfTUFTSzsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9GQlRfTUFTSzsKIAotCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfU1lXRCh3b3JkX3dpZHRoKTsKKwlpZiAoIXNhaS0+aXNfZHNwX21vZGUpCisJCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfU1lXRCh3b3JkX3dpZHRoKTsKKwogCXZhbF9jcjUgfD0gRlNMX1NBSV9DUjVfV05XKHdvcmRfd2lkdGgpOwogCXZhbF9jcjUgfD0gRlNMX1NBSV9DUjVfVzBXKHdvcmRfd2lkdGgpOwogCkBAIC0yNTcsOSArMjYzLDkgQEAKIAl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZSU1ooY2hhbm5lbHMpOwogCXZhbF9tciA9IH4wVUwgLSAoKDEgPDwgY2hhbm5lbHMpIC0gMSk7CiAKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyNCwgc2FpLT5iYXNlICsgcmVnX2NyNCk7Ci0Jc2FpX3dyaXRlbChzYWksIHZhbF9jcjUsIHNhaS0+YmFzZSArIHJlZ19jcjUpOwotCXNhaV93cml0ZWwoc2FpLCB2YWxfbXIsIHNhaS0+YmFzZSArIHJlZ19tcik7CisJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCByZWdfY3I0LCB2YWxfY3I0KTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjUsIHZhbF9jcjUpOworCXJlZ21hcF93cml0ZShzYWktPnJlZ21hcCwgcmVnX21yLCB2YWxfbXIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjgsNDQgKzI3NCw0MiBAQAogCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGZzbF9zYWkgKnNhaSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwotCXUzMiB0Y3NyLCByY3NyLCB2YWxfY3IyLCB2YWxfY3IzLCByZWdfY3IzOworCXUzMiB0Y3NyLCByY3NyOwogCi0JdmFsX2NyMiA9IHNhaV9yZWFkbChzYWksIHNhaS0+YmFzZSArIEZTTF9TQUlfVENSMik7Ci0JdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfU1lOQzsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMiwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1IyKTsKKwkvKgorCSAqIFRoZSB0cmFuc21pdHRlciBiaXQgY2xvY2sgYW5kIGZyYW1lIHN5bmMgYXJlIHRvIGJlCisJICogdXNlZCBieSBib3RoIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuCisJICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDUjIsIEZTTF9TQUlfQ1IyX1NZTkMsCisJCQkgICB+RlNMX1NBSV9DUjJfU1lOQyk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDUjIsIEZTTF9TQUlfQ1IyX1NZTkMsCisJCQkgICBGU0xfU0FJX0NSMl9TWU5DKTsKIAotCXZhbF9jcjIgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDUjIpOwotCXZhbF9jcjIgfD0gRlNMX1NBSV9DUjJfU1lOQzsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMiwgc2FpLT5iYXNlICsgRlNMX1NBSV9SQ1IyKTsKLQotCXRjc3IgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1RDU1IpOwotCXJjc3IgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOworCXJlZ21hcF9yZWFkKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsICZ0Y3NyKTsKKwlyZWdtYXBfcmVhZChzYWktPnJlZ21hcCwgRlNMX1NBSV9SQ1NSLCAmcmNzcik7CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQl0Y3NyIHw9IEZTTF9TQUlfQ1NSX0ZSREU7CiAJCXJjc3IgJj0gfkZTTF9TQUlfQ1NSX0ZSREU7Ci0JCXJlZ19jcjMgPSBGU0xfU0FJX1RDUjM7CiAJfSBlbHNlIHsKIAkJcmNzciB8PSBGU0xfU0FJX0NTUl9GUkRFOwogCQl0Y3NyICY9IH5GU0xfU0FJX0NTUl9GUkRFOwotCQlyZWdfY3IzID0gRlNMX1NBSV9SQ1IzOwogCX0KIAotCXZhbF9jcjMgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyByZWdfY3IzKTsKLQorCS8qCisJICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgaXMgdGhlIGxhc3QgZW5hYmxlZAorCSAqIGFuZCB0aGUgZmlyc3QgZGlzYWJsZWQuCisJICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJdGNzciB8PSBGU0xfU0FJX0NTUl9URVJFOwogCQlyY3NyIHw9IEZTTF9TQUlfQ1NSX1RFUkU7Ci0JCXZhbF9jcjMgfD0gRlNMX1NBSV9DUjNfVFJDRTsKIAotCQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMywgc2FpLT5iYXNlICsgcmVnX2NyMyk7Ci0JCXNhaV93cml0ZWwoc2FpLCByY3NyLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOwotCQlzYWlfd3JpdGVsKHNhaSwgdGNzciwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1NSKTsKKwkJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDU1IsIHJjc3IpOworCQlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIEZTTF9TQUlfVENTUiwgdGNzcik7CiAJCWJyZWFrOwotCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CkBAIC0zMTQsMTEgKzMxOCw4IEBACiAJCQlyY3NyICY9IH5GU0xfU0FJX0NTUl9URVJFOwogCQl9CiAKLQkJdmFsX2NyMyAmPSB+RlNMX1NBSV9DUjNfVFJDRTsKLQotCQlzYWlfd3JpdGVsKHNhaSwgdGNzciwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1NSKTsKLQkJc2FpX3dyaXRlbChzYWksIHJjc3IsIHNhaS0+YmFzZSArIEZTTF9TQUlfUkNTUik7Ci0JCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IzLCBzYWktPmJhc2UgKyByZWdfY3IzKTsKKwkJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsIHRjc3IpOworCQlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIEZTTF9TQUlfUkNTUiwgcmNzcik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMxLDE2ICszMzIsMzIgQEAKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwl1MzIgcmVnOwogCi0JcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShzYWktPmNsayk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJlZyA9IEZTTF9TQUlfVENSMzsKKwllbHNlCisJCXJlZyA9IEZTTF9TQUlfUkNSMzsKKworCXJlZ21hcF91cGRhdGVfYml0cyhzYWktPnJlZ21hcCwgcmVnLCBGU0xfU0FJX0NSM19UUkNFLAorCQkJICAgRlNMX1NBSV9DUjNfVFJDRSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZnNsX3NhaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwl1MzIgcmVnOwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhaS0+Y2xrKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmVnID0gRlNMX1NBSV9UQ1IzOworCWVsc2UKKwkJcmVnID0gRlNMX1NBSV9SQ1IzOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCByZWcsIEZTTF9TQUlfQ1IzX1RSQ0UsCisJCQkgICB+RlNMX1NBSV9DUjNfVFJDRSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGZzbF9zYWlfcGNtX2RhaV9vcHMgPSB7CkBAIC0zNTUsMTggKzM3MiwxMyBAQAogc3RhdGljIGludCBmc2xfc2FpX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGZzbF9zYWkgKnNhaSA9IGRldl9nZXRfZHJ2ZGF0YShjcHVfZGFpLT5kZXYpOwotCWludCByZXQ7CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2FpLT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlzYWlfd3JpdGVsKHNhaSwgMHgwLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOwotCXNhaV93cml0ZWwoc2FpLCAweDAsIHNhaS0+YmFzZSArIEZTTF9TQUlfVENTUik7Ci0Jc2FpX3dyaXRlbChzYWksIEZTTF9TQUlfTUFYQlVSU1RfVFggKiAyLCBzYWktPmJhc2UgKyBGU0xfU0FJX1RDUjEpOwotCXNhaV93cml0ZWwoc2FpLCBGU0xfU0FJX01BWEJVUlNUX1JYIC0gMSwgc2FpLT5iYXNlICsgRlNMX1NBSV9SQ1IxKTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzYWktPmNsayk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsIDB4ZmZmZmZmZmYsIDB4MCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDU1IsIDB4ZmZmZmZmZmYsIDB4MCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDUjEsIEZTTF9TQUlfQ1IxX1JGV19NQVNLLAorCQkJICAgRlNMX1NBSV9NQVhCVVJTVF9UWCAqIDIpOworCXJlZ21hcF91cGRhdGVfYml0cyhzYWktPnJlZ21hcCwgRlNMX1NBSV9SQ1IxLCBGU0xfU0FJX0NSMV9SRldfTUFTSywKKwkJCSAgIEZTTF9TQUlfTUFYQlVSU1RfUlggLSAxKTsKIAogCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoY3B1X2RhaSwgJnNhaS0+ZG1hX3BhcmFtc190eCwKIAkJCQkmc2FpLT5kbWFfcGFyYW1zX3J4KTsKQEAgLTM5NywyNiArNDA5LDEwOSBAQAogCS5uYW1lICAgICAgICAgICA9ICJmc2wtc2FpIiwKIH07CiAKK3N0YXRpYyBib29sIGZzbF9zYWlfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgRlNMX1NBSV9UQ1NSOgorCWNhc2UgRlNMX1NBSV9UQ1IxOgorCWNhc2UgRlNMX1NBSV9UQ1IyOgorCWNhc2UgRlNMX1NBSV9UQ1IzOgorCWNhc2UgRlNMX1NBSV9UQ1I0OgorCWNhc2UgRlNMX1NBSV9UQ1I1OgorCWNhc2UgRlNMX1NBSV9URlI6CisJY2FzZSBGU0xfU0FJX1RNUjoKKwljYXNlIEZTTF9TQUlfUkNTUjoKKwljYXNlIEZTTF9TQUlfUkNSMToKKwljYXNlIEZTTF9TQUlfUkNSMjoKKwljYXNlIEZTTF9TQUlfUkNSMzoKKwljYXNlIEZTTF9TQUlfUkNSNDoKKwljYXNlIEZTTF9TQUlfUkNSNToKKwljYXNlIEZTTF9TQUlfUkRSOgorCWNhc2UgRlNMX1NBSV9SRlI6CisJY2FzZSBGU0xfU0FJX1JNUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgZnNsX3NhaV92b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBGU0xfU0FJX1RGUjoKKwljYXNlIEZTTF9TQUlfUkZSOgorCWNhc2UgRlNMX1NBSV9URFI6CisJY2FzZSBGU0xfU0FJX1JEUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQorCitzdGF0aWMgYm9vbCBmc2xfc2FpX3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBGU0xfU0FJX1RDU1I6CisJY2FzZSBGU0xfU0FJX1RDUjE6CisJY2FzZSBGU0xfU0FJX1RDUjI6CisJY2FzZSBGU0xfU0FJX1RDUjM6CisJY2FzZSBGU0xfU0FJX1RDUjQ6CisJY2FzZSBGU0xfU0FJX1RDUjU6CisJY2FzZSBGU0xfU0FJX1REUjoKKwljYXNlIEZTTF9TQUlfVE1SOgorCWNhc2UgRlNMX1NBSV9SQ1NSOgorCWNhc2UgRlNMX1NBSV9SQ1IxOgorCWNhc2UgRlNMX1NBSV9SQ1IyOgorCWNhc2UgRlNMX1NBSV9SQ1IzOgorCWNhc2UgRlNMX1NBSV9SQ1I0OgorCWNhc2UgRlNMX1NBSV9SQ1I1OgorCWNhc2UgRlNMX1NBSV9STVI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBmc2xfc2FpX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCisJLm1heF9yZWdpc3RlciA9IEZTTF9TQUlfUk1SLAorCS5yZWFkYWJsZV9yZWcgPSBmc2xfc2FpX3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gZnNsX3NhaV92b2xhdGlsZV9yZWcsCisJLndyaXRlYWJsZV9yZWcgPSBmc2xfc2FpX3dyaXRlYWJsZV9yZWcsCit9OworCiBzdGF0aWMgaW50IGZzbF9zYWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGZzbF9zYWkgKnNhaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IHJldDsKIAogCXNhaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnNhaSksIEdGUF9LRVJORUwpOwogCWlmICghc2FpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0Jc2FpLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihzYWktPmJhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihzYWktPmJhc2UpOworCXNhaS0+YmlnX2VuZGlhbl9yZWdzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1yZWdzIik7CisJaWYgKHNhaS0+YmlnX2VuZGlhbl9yZWdzKQorCQlmc2xfc2FpX3JlZ21hcF9jb25maWcudmFsX2Zvcm1hdF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX0JJRzsKIAotCXNhaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJzYWkiKTsKLQlpZiAoSVNfRVJSKHNhaS0+Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IFNBSSdzIGNsb2NrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoc2FpLT5jbGspOworCXNhaS0+YmlnX2VuZGlhbl9kYXRhID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1kYXRhIik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKKworCXNhaS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LAorCQkJInNhaSIsIGJhc2UsICZmc2xfc2FpX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoc2FpLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ21hcCBpbml0IGZhaWxlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHNhaS0+cmVnbWFwKTsKIAl9CiAKIAlzYWktPmRtYV9wYXJhbXNfcnguYWRkciA9IHJlcy0+c3RhcnQgKyBGU0xfU0FJX1JEUjsKQEAgLTQyNCw5ICs1MTksNiBAQAogCXNhaS0+ZG1hX3BhcmFtc19yeC5tYXhidXJzdCA9IEZTTF9TQUlfTUFYQlVSU1RfUlg7CiAJc2FpLT5kbWFfcGFyYW1zX3R4Lm1heGJ1cnN0ID0gRlNMX1NBSV9NQVhCVVJTVF9UWDsKIAotCXNhaS0+YmlnX2VuZGlhbl9yZWdzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1yZWdzIik7Ci0Jc2FpLT5iaWdfZW5kaWFuX2RhdGEgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuLWRhdGEiKTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNhaSk7CiAKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZmc2xfY29tcG9uZW50LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmggYi9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuaAppbmRleCA0MWJiNjJlNi4uZTQzMjI2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmgKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc2FpLmgKQEAgLTE1LDMxICsxNSwzNiBAQAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCisvKiBTQUkgUmVnaXN0ZXIgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lIEZTTF9TQUlfVENTUgkweDAwIC8qIFNBSSBUcmFuc21pdCBDb250cm9sICovCisjZGVmaW5lIEZTTF9TQUlfVENSMQkweDA0IC8qIFNBSSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgKi8KKyNkZWZpbmUgRlNMX1NBSV9UQ1IyCTB4MDggLyogU0FJIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiAqLworI2RlZmluZSBGU0xfU0FJX1RDUjMJMHgwYyAvKiBTQUkgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAzICovCisjZGVmaW5lIEZTTF9TQUlfVENSNAkweDEwIC8qIFNBSSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDQgKi8KKyNkZWZpbmUgRlNMX1NBSV9UQ1I1CTB4MTQgLyogU0FJIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gNSAqLworI2RlZmluZSBGU0xfU0FJX1REUgkweDIwIC8qIFNBSSBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEZTTF9TQUlfVEZSCTB4NDAgLyogU0FJIFRyYW5zbWl0IEZJRk8gKi8KKyNkZWZpbmUgRlNMX1NBSV9UTVIJMHg2MCAvKiBTQUkgVHJhbnNtaXQgTWFzayAqLworI2RlZmluZSBGU0xfU0FJX1JDU1IJMHg4MCAvKiBTQUkgUmVjZWl2ZSBDb250cm9sICovCisjZGVmaW5lIEZTTF9TQUlfUkNSMQkweDg0IC8qIFNBSSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gMSAqLworI2RlZmluZSBGU0xfU0FJX1JDUjIJMHg4OCAvKiBTQUkgUmVjZWl2ZSBDb25maWd1cmF0aW9uIDIgKi8KKyNkZWZpbmUgRlNMX1NBSV9SQ1IzCTB4OGMgLyogU0FJIFJlY2VpdmUgQ29uZmlndXJhdGlvbiAzICovCisjZGVmaW5lIEZTTF9TQUlfUkNSNAkweDkwIC8qIFNBSSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gNCAqLworI2RlZmluZSBGU0xfU0FJX1JDUjUJMHg5NCAvKiBTQUkgUmVjZWl2ZSBDb25maWd1cmF0aW9uIDUgKi8KKyNkZWZpbmUgRlNMX1NBSV9SRFIJMHhhMCAvKiBTQUkgUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIEZTTF9TQUlfUkZSCTB4YzAgLyogU0FJIFJlY2VpdmUgRklGTyAqLworI2RlZmluZSBGU0xfU0FJX1JNUgkweGUwIC8qIFNBSSBSZWNlaXZlIE1hc2sgKi8KKwogLyogU0FJIFRyYW5zbWl0L1JlY2lldmUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBGU0xfU0FJX1RDU1IJCTB4MDAKLSNkZWZpbmUgRlNMX1NBSV9SQ1NSCQkweDgwCiAjZGVmaW5lIEZTTF9TQUlfQ1NSX1RFUkUJQklUKDMxKQogI2RlZmluZSBGU0xfU0FJX0NTUl9GV0YJCUJJVCgxNykKICNkZWZpbmUgRlNMX1NBSV9DU1JfRlJJRQlCSVQoOCkKICNkZWZpbmUgRlNMX1NBSV9DU1JfRlJERQlCSVQoMCkKIAotLyogU0FJIFRyYW5zbWl0IERhdGEvRklGTy9NQVNLIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVERSCQkweDIwCi0jZGVmaW5lIEZTTF9TQUlfVEZSCQkweDQwCi0jZGVmaW5lIEZTTF9TQUlfVE1SCQkweDYwCi0KLS8qIFNBSSBSZWNpZXZlIERhdGEvRklGTy9NQVNLIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfUkRSCQkweGEwCi0jZGVmaW5lIEZTTF9TQUlfUkZSCQkweGMwCi0jZGVmaW5lIEZTTF9TQUlfUk1SCQkweGUwCi0KIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1IxCQkweDA0Ci0jZGVmaW5lIEZTTF9TQUlfUkNSMQkJMHg4NAorI2RlZmluZSBGU0xfU0FJX0NSMV9SRldfTUFTSwkweDFmCiAKIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1IyCQkweDA4Ci0jZGVmaW5lIEZTTF9TQUlfUkNSMgkJMHg4OAogI2RlZmluZSBGU0xfU0FJX0NSMl9TWU5DCUJJVCgzMCkKICNkZWZpbmUgRlNMX1NBSV9DUjJfTVNFTF9NQVNLCSgweGZmIDw8IDI2KQogI2RlZmluZSBGU0xfU0FJX0NSMl9NU0VMX0JVUwkwCkBAIC01MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgRlNMX1NBSV9DUjJfQkNEX01TVFIJQklUKDI0KQogCiAvKiBTQUkgVHJhbnNtaXQgYW5kIFJlY2lldmUgQ29uZmlndXJhdGlvbiAzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVENSMwkJMHgwYwotI2RlZmluZSBGU0xfU0FJX1JDUjMJCTB4OGMKICNkZWZpbmUgRlNMX1NBSV9DUjNfVFJDRQlCSVQoMTYpCiAjZGVmaW5lIEZTTF9TQUlfQ1IzX1dERkwoeCkJKHgpCiAjZGVmaW5lIEZTTF9TQUlfQ1IzX1dERkxfTUFTSwkweDFmCiAKIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1I0CQkweDEwCi0jZGVmaW5lIEZTTF9TQUlfUkNSNAkJMHg5MAogI2RlZmluZSBGU0xfU0FJX0NSNF9GUlNaKHgpCSgoKHgpIC0gMSkgPDwgMTYpCiAjZGVmaW5lIEZTTF9TQUlfQ1I0X0ZSU1pfTUFTSwkoMHgxZiA8PCAxNikKICNkZWZpbmUgRlNMX1NBSV9DUjRfU1lXRCh4KQkoKCh4KSAtIDEpIDw8IDgpCkBAIC02OSw4ICs3MCw2IEBACiAjZGVmaW5lIEZTTF9TQUlfQ1I0X0ZTRF9NU1RSCUJJVCgwKQogCiAvKiBTQUkgVHJhbnNtaXQgYW5kIFJlY2lldmUgQ29uZmlndXJhdGlvbiA1IFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVENSNQkJMHgxNAotI2RlZmluZSBGU0xfU0FJX1JDUjUJCTB4OTQKICNkZWZpbmUgRlNMX1NBSV9DUjVfV05XKHgpCSgoKHgpIC0gMSkgPDwgMjQpCiAjZGVmaW5lIEZTTF9TQUlfQ1I1X1dOV19NQVNLCSgweDFmIDw8IDI0KQogI2RlZmluZSBGU0xfU0FJX0NSNV9XMFcoeCkJKCgoeCkgLSAxKSA8PCAxNikKQEAgLTEwMCwxMiArOTksMTEgQEAKICNkZWZpbmUgRlNMX1NBSV9NQVhCVVJTVF9SWCA2CiAKIHN0cnVjdCBmc2xfc2FpIHsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0KLQl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCiAJYm9vbCBiaWdfZW5kaWFuX3JlZ3M7CiAJYm9vbCBiaWdfZW5kaWFuX2RhdGE7CisJYm9vbCBpc19kc3BfbW9kZTsKIAogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGFyYW1zX3J4OwogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGFyYW1zX3R4OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMKaW5kZXggNGQwNzVmMS4uNjQ1MmNhOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jCkBAIC05MTEsOCArOTExLDggQEAKIHsKIAlzdHJ1Y3QgZnNsX3NwZGlmX3ByaXYgKnNwZGlmX3ByaXZhdGUgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JZGFpLT5wbGF5YmFja19kbWFfZGF0YSA9ICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3R4OwotCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9ICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3J4OworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmc3BkaWZfcHJpdmF0ZS0+ZG1hX3BhcmFtc190eCwKKwkJCQkgICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3J4KTsKIAogCXNuZF9zb2NfYWRkX2RhaV9jb250cm9scyhkYWksIGZzbF9zcGRpZl9jdHJscywgQVJSQVlfU0laRShmc2xfc3BkaWZfY3RybHMpKTsKIApAQCAtOTg1LDcgKzk4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZnNsX3NwZGlmX3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgZnNsX3NwZGlmX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gMzIsCiAJLnJlZ19zdHJpZGUgPSA0LAogCS52YWxfYml0cyA9IDMyLApAQCAtMTEwNSw2ICsxMTA1LDkgQEAKIAltZW1jcHkoJnNwZGlmX3ByaXYtPmNwdV9kYWlfZHJ2LCAmZnNsX3NwZGlmX2RhaSwgc2l6ZW9mKGZzbF9zcGRpZl9kYWkpKTsKIAlzcGRpZl9wcml2LT5jcHVfZGFpX2Rydi5uYW1lID0gc3BkaWZfcHJpdi0+bmFtZTsKIAorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuIikpCisJCWZzbF9zcGRpZl9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9CSUc7CisKIAkvKiBHZXQgdGhlIGFkZHJlc3NlcyBhbmQgSVJRICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5jIGIvc291bmQvc29jL2ZzbC9mc2xfdXRpbHMuYwppbmRleCBiOWU0MmI1Li4yYWM3NzU1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmMKQEAgLTg2LDYgKzg2LDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGZzbF9hc29jX2dldF9kbWFfY2hhbm5lbCk7CiAKKy8qKgorICogZnNsX2Fzb2NfeGxhdGVfdGRtX3Nsb3RfbWFzayAtIGdlbmVyYXRlIFRETSBzbG90IFRYL1JYIG1hc2suCisgKgorICogQHNsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgaW4gdXNlLgorICogQHR4X21hc2s6IGJpdG1hc2sgcmVwcmVzZW50aW5nIGFjdGl2ZSBUWCBzbG90cy4KKyAqIEByeF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgUlggc2xvdHMuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBURE0gc2xvdCBUWC9SWCBtYXNrLiBBbmQgdGhlIFRYL1JYCisgKiBtYXNrIHdpbGwgdXNlIGEgMCBiaXQgZm9yIGFuIGFjdGl2ZSBzbG90IGFzIGRlZmF1bHQsIGFuZCB0aGUgZGVmYXVsdAorICogYWN0aXZlIGJpdHMgYXJlIGF0IHRoZSBMU0Igb2YgdGhlIG1hc2sgdmFsdWUuCisgKi8KK2ludCBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHVuc2lnbmVkIGludCBzbG90cywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spCit7CisJaWYgKCFzbG90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHhfbWFzaykKKwkJKnR4X21hc2sgPSB+KCgxIDw8IHNsb3RzKSAtIDEpOworCWlmIChyeF9tYXNrKQorCQkqcnhfbWFzayA9IH4oKDEgPDwgc2xvdHMpIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9hc29jX3hsYXRlX3RkbV9zbG90X21hc2spOworCiBNT0RVTEVfQVVUSE9SKCJUaW11ciBUYWJpIDx0aW11ckBmcmVlc2NhbGUuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgQVNvQyB1dGlsaXR5IGNvZGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmggYi9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5oCmluZGV4IGIyOTUxMTIuLmRmNTM1ZGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmgKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfdXRpbHMuaApAQCAtMjIsNSArMjIsNyBAQAogCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmRtYV9jaGFubmVsX2lkLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmRtYV9pZCk7Ci0KK2ludCBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHVuc2lnbmVkIGludCBzbG90cywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spOwogI2VuZGlmIC8qIF9GU0xfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9pbXgtcGNtLWZpcS5jIGIvc291bmQvc29jL2ZzbC9pbXgtcGNtLWZpcS5jCmluZGV4IDY1NTMyMDIuLjdhYmY2YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvaW14LXBjbS1maXEuYworKysgYi9zb3VuZC9zb2MvZnNsL2lteC1wY20tZmlxLmMKQEAgLTI3MCwxOCArMjcwLDE3IEBACiAJCXJldCA9IGlteF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CiAJCXJldCA9IGlteF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gcmV0OwogCX0KIAotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3NpX2lycSA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2lteC1zc2kuYyBiL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCmluZGV4IGRmNTUyZmEuLmFiMmZkZDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9hc29jLWlteC1zc2kuaD4KIAogI2luY2x1ZGUgImlteC1zc2kuaCIKKyNpbmNsdWRlICJmc2xfdXRpbHMuaCIKIAogI2RlZmluZSBTU0lfU0FDTlRfREVGQVVMVCAoU1NJX1NBQ05UX0FDOTdFTiB8IFNTSV9TQUNOVF9GVikKIApAQCAtMzM5LDYgKzM0MCw3IEBACiAJLnNldF9mbXQJPSBpbXhfc3NpX3NldF9kYWlfZm10LAogCS5zZXRfY2xrZGl2CT0gaW14X3NzaV9zZXRfZGFpX2Nsa2RpdiwKIAkuc2V0X3N5c2Nsawk9IGlteF9zc2lfc2V0X2RhaV9zeXNjbGssCisJLnhsYXRlX3RkbV9zbG90X21hc2sgPSBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrLAogCS5zZXRfdGRtX3Nsb3QJPSBpbXhfc3NpX3NldF9kYWlfdGRtX3Nsb3QsCiAJLnRyaWdnZXIJPSBpbXhfc3NpX3RyaWdnZXIsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC93bTExMzMtZXYxLmMgYi9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYwppbmRleCBmY2U2MzI1Li44MDQ3NDlhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYworKysgYi9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYwpAQCAtMjE0LDEyICsyMTQsNiBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTExMzNfZXYxX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd20xMTMzX2V2MV9tYXAsCi0JCQkJQVJSQVlfU0laRSh3bTExMzNfZXYxX21hcCkpOwotCiAJLyogSGVhZHBob25lIGphY2sgZGV0ZWN0aW9uICovCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSIsIFNORF9KQUNLX0hFQURQSE9ORSwgJmhwX2phY2spOwogCXNuZF9zb2NfamFja19hZGRfcGlucygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpLApAQCAtMjU3LDYgKzI1MSwxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9ICZ3bTExMzNfZXYxX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMgPSB3bTExMzNfZXYxX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gd20xMTMzX2V2MV9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20xMTMzX2V2MV9tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKndtMTEzM19ldjFfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCmluZGV4IDJhMWIxYjUuLjIxZjFjY2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYwpAQCAtOSw0OCArOSw3NyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPHNvdW5kL3NpbXBsZV9jYXJkLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSB7CisJc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfY2FyZDsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyB7CisJCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgY3B1X2RhaTsKKwkJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSBjb2RlY19kYWk7CisJfSAqZGFpX3Byb3BzOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRhaV9saW5rW107CS8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworfTsKIAogc3RhdGljIGludCBfX2Fzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNldCwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRhaWZtdCkKKwkJCQkgICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqc2V0KQogewotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKLQlkYWlmbXQgfD0gc2V0LT5mbXQ7Ci0KLQlpZiAoZGFpZm10KQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgZGFpZm10KTsKLQotCWlmIChyZXQgPT0gLUVOT1RTVVBQKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICJBU29DOiBzZXRfZm10IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXQgPSAwOworCWlmIChzZXQtPmZtdCkgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgc2V0LT5mbXQpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X2ZtdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQogCX0KIAotCWlmICghcmV0ICYmIHNldC0+c3lzY2xrKQorCWlmIChzZXQtPnN5c2NsaykgewogCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2V0LT5zeXNjbGssIDApOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3N5c2NsayBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KIAorCWlmIChzZXQtPnNsb3RzKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChkYWksIDAsIDAsCisJCQkJCQlzZXQtPnNsb3RzLAorCQkJCQkJc2V0LT5zbG90X3dpZHRoKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF90ZG1fc2xvdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldCA9IDA7CisKK2VycjoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9pbmZvICppbmZvID0KKwlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9CiAJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlYyA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1ID0gcnRkLT5jcHVfZGFpOwotCXVuc2lnbmVkIGludCBkYWlmbXQgPSBpbmZvLT5kYWlmbXQ7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzOworCWludCBudW0sIHJldDsKIAotCXJldCA9IF9fYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChjb2RlYywgJmluZm8tPmNvZGVjX2RhaSwgZGFpZm10KTsKKwludW0gPSBydGQgLSBydGQtPmNhcmQtPnJ0ZDsKKwlkYWlfcHJvcHMgPSAmcHJpdi0+ZGFpX3Byb3BzW251bV07CisJcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmluZm8tPmNwdV9kYWksIGRhaWZtdCk7CisJcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmRhaV9wcm9wcy0+Y3B1X2RhaSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTU5LDkgKzg4LDEyIEBACiAKIHN0YXRpYyBpbnQKIGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGFpZm10LAogCQkJICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpLAotCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICoqbm9kZSkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqKnBfbm9kZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKipuYW1lKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKIApAQCAtNjksMTQgKzEwMSwyMCBAQAogCSAqIGdldCBub2RlIHZpYSAic291bmQtZGFpID0gPCZwaGFuZGxlIHBvcnQ+IgogCSAqIGl0IHdpbGwgYmUgdXNlZCBhcyB4eHhfb2Zfbm9kZSBvbiBzb2NfYmluZF9kYWlfbGluaygpCiAJICovCi0JKm5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAic291bmQtZGFpIiwgMCk7Ci0JaWYgKCEqbm9kZSkKKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInNvdW5kLWRhaSIsIDApOworCWlmICghbm9kZSkKIAkJcmV0dXJuIC1FTk9ERVY7CisJKnBfbm9kZSA9IG5vZGU7CiAKIAkvKiBnZXQgZGFpLT5uYW1lICovCi0JcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsICZkYWktPm5hbWUpOworCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5wLCBuYW1lKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBwYXJzZV9lcnJvcjsKKwkJcmV0dXJuIHJldDsKKworCS8qIHBhcnNlIFRETSBzbG90ICovCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChucCwgJmRhaS0+c2xvdHMsICZkYWktPnNsb3Rfd2lkdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIGJpdGNsb2NrLWludmVyc2lvbiwgZnJhbWUtaW52ZXJzaW9uCkBAIC04NCw2ICsxMjIsNyBAQAogCSAqIGFuZCBzcGVjaWZpYyAiZm9ybWF0IiBpZiBpdCBoYXMKIAkgKi8KIAlkYWktPmZtdCA9IHNuZF9zb2Nfb2ZfcGFyc2VfZGFpZm10KG5wLCBOVUxMKTsKKwlkYWktPmZtdCB8PSBkYWlmbXQ7CiAKIAkvKgogCSAqIGRhaS0+c3lzY2xrIGNvbWUgZnJvbQpAQCAtOTUsNyArMTM0LDcgQEAKIAkJY2xrID0gb2ZfY2xrX2dldChucCwgMCk7CiAJCWlmIChJU19FUlIoY2xrKSkgewogCQkJcmV0ID0gUFRSX0VSUihjbGspOwotCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlkYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwpAQCAtMTA0LDE2NCArMTQzLDI3OCBAQAogCQkJCSAgICAgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLAogCQkJCSAgICAgJmRhaS0+c3lzY2xrKTsKIAl9IGVsc2UgewotCQljbGsgPSBvZl9jbGtfZ2V0KCpub2RlLCAwKTsKKwkJY2xrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKIAkJaWYgKCFJU19FUlIoY2xrKSkKIAkJCWRhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CiAJfQogCi0JcmV0ID0gMDsKLQotcGFyc2VfZXJyb3I6Ci0Jb2Zfbm9kZV9wdXQoKm5vZGUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipvZl9jcHUsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipvZl9jb2RlYywKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm9mX3BsYXRmb3JtKQorc3RhdGljIGludCBzaW1wbGVfY2FyZF9jcHVfY29kZWNfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCWludCBkYWlmbXQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkJCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQljaGFyICpuYW1lOwogCWludCByZXQ7CiAKLQkvKiBnZXQgQ1BVL0NPREVDIGNvbW1vbiBmb3JtYXQgdmlhIHNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCAqLwotCWluZm8tPmRhaWZtdCA9IHNuZF9zb2Nfb2ZfcGFyc2VfZGFpZm10KG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCwiKSAmCi0JCShTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSyB8IFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKTsKLQotCS8qIERBUE0gcm91dGVzICovCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZyIpKSB7Ci0JCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmaW5mby0+c25kX2NhcmQsCi0JCQkJCSJzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nIik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIENQVSBzdWItbm9kZSAqLwogCXJldCA9IC1FSU5WQUw7CiAJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQsY3B1Iik7Ci0JaWYgKG5wKQotCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihucCwKLQkJCQkJCSAgJmluZm8tPmNwdV9kYWksCi0JCQkJCQkgIG9mX2NwdSk7CisJaWYgKG5wKSB7CisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKG5wLCBkYWlmbXQsCisJCQkJCQkmZGFpX3Byb3BzLT5jcHVfZGFpLAorCQkJCQkJJmRhaV9saW5rLT5jcHVfb2Zfbm9kZSwKKwkJCQkJCSZkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIENPREVDIHN1Yi1ub2RlICovCiAJcmV0ID0gLUVJTlZBTDsKIAlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYyIpOwotCWlmIChucCkKLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YobnAsCi0JCQkJCQkgICZpbmZvLT5jb2RlY19kYWksCi0JCQkJCQkgIG9mX2NvZGVjKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAobnApIHsKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YobnAsIGRhaWZtdCwKKwkJCQkJCSZkYWlfcHJvcHMtPmNvZGVjX2RhaSwKKwkJCQkJCSZkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwKKwkJCQkJCSZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCXJldHVybiByZXQ7Cit9CiAKLQlpZiAoIWluZm8tPmNwdV9kYWkubmFtZSB8fCAhaW5mby0+Y29kZWNfZGFpLm5hbWUpCi0JCXJldHVybiAtRUlOVkFMOworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2LAorCQkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgaW50IG11bHRpKQoreworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHByaXYtPnNuZF9jYXJkLmRhaV9saW5rOworCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPSBwcml2LT5kYWlfcHJvcHM7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBkYWlmbXQ7CisJaW50IHJldDsKKworCS8qIHBhcnNpbmcgdGhlIGNhcmQgbmFtZSBmcm9tIERUICovCisJc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoJnByaXYtPnNuZF9jYXJkLCAic2ltcGxlLWF1ZGlvLWNhcmQsbmFtZSIpOworCisJLyogZ2V0IENQVS9DT0RFQyBjb21tb24gZm9ybWF0IHZpYSBzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgKi8KKwlkYWlmbXQgPSBzbmRfc29jX29mX3BhcnNlX2RhaWZtdChub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQsIikgJgorCQkoU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0sgfCBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSyk7CisKKwkvKiBvZmYtY29kZWMgd2lkZ2V0cyAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwgInNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMiKSkgeworCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJInNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogREFQTSByb3V0ZXMgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nIikpIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJInNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmciKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogbG9vcCBvbiB0aGUgREFJIGxpbmtzICovCisJbnAgPSBOVUxMOworCWZvciAoOzspIHsKKwkJaWYgKG11bHRpKSB7CisJCQlucCA9IG9mX2dldF9uZXh0X2NoaWxkKG5vZGUsIG5wKTsKKwkJCWlmICghbnApCisJCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBzaW1wbGVfY2FyZF9jcHVfY29kZWNfb2YobXVsdGkgPyBucCA6IG5vZGUsCisJCQkJCWRhaWZtdCwgZGFpX2xpbmssIGRhaV9wcm9wcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisKKwkJLyoKKwkJICogb3ZlcndyaXRlIGNwdV9kYWktPmZtdCBhcyBpdHMgREFJRk1UX01BU1RFUiBiaXQgaXMgYmFzZWQgb24gQ09ERUMKKwkJICogd2hpbGUgdGhlIG90aGVyIGJpdHMgc2hvdWxkIGJlIGlkZW50aWNhbCB1bmxlc3MgYnVnZ3kgU1cvSFcgZGVzaWduLgorCQkgKi8KKwkJZGFpX3Byb3BzLT5jcHVfZGFpLmZtdCA9IGRhaV9wcm9wcy0+Y29kZWNfZGFpLmZtdDsKKworCQlpZiAoIWRhaV9saW5rLT5jcHVfZGFpX25hbWUgfHwgIWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogc2ltcGxlLWNhcmQgYXNzdW1lcyBwbGF0Zm9ybSA9PSBjcHUgKi8KKwkJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisKKwkJbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJICAgIHN0cmxlbihkYWlfbGluay0+Y3B1X2RhaV9uYW1lKSAgICsKKwkJCQkgICAgc3RybGVuKGRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgKyAyLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJc3ByaW50ZihuYW1lLCAiJXMtJXMiLCBkYWlfbGluay0+Y3B1X2RhaV9uYW1lLAorCQkJCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlkYWlfbGluay0+bmFtZSA9IGRhaV9saW5rLT5zdHJlYW1fbmFtZSA9IG5hbWU7CisKKwkJaWYgKCFtdWx0aSkKKwkJCWJyZWFrOworCisJCWRhaV9saW5rKys7CisJCWRhaV9wcm9wcysrOworCX0KIAogCS8qIGNhcmQgbmFtZSBpcyBjcmVhdGVkIGZyb20gQ1BVL0NPREVDIGRhaSBuYW1lICovCi0JbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkgICAgc3RybGVuKGluZm8tPmNwdV9kYWkubmFtZSkgICArCi0JCQkgICAgc3RybGVuKGluZm8tPmNvZGVjX2RhaS5uYW1lKSArIDIsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0Jc3ByaW50ZihuYW1lLCAiJXMtJXMiLCBpbmZvLT5jcHVfZGFpLm5hbWUsIGluZm8tPmNvZGVjX2RhaS5uYW1lKTsKLQlpbmZvLT5uYW1lID0gaW5mby0+Y2FyZCA9IG5hbWU7CisJZGFpX2xpbmsgPSBwcml2LT5zbmRfY2FyZC5kYWlfbGluazsKKwlpZiAoIXByaXYtPnNuZF9jYXJkLm5hbWUpCisJCXByaXYtPnNuZF9jYXJkLm5hbWUgPSBkYWlfbGluay0+bmFtZTsKIAotCS8qIHNpbXBsZS1jYXJkIGFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCi0JKm9mX3BsYXRmb3JtID0gKm9mX2NwdTsKLQotCWRldl9kYmcoZGV2LCAiY2FyZC1uYW1lIDogJXNcbiIsIGluZm8tPmNhcmQpOwotCWRldl9kYmcoZGV2LCAicGxhdGZvcm0gOiAlMDR4XG4iLCBpbmZvLT5kYWlmbXQpOworCWRldl9kYmcoZGV2LCAiY2FyZC1uYW1lIDogJXNcbiIsIHByaXYtPnNuZF9jYXJkLm5hbWUpOworCWRldl9kYmcoZGV2LCAicGxhdGZvcm0gOiAlMDR4XG4iLCBkYWlmbXQpOworCWRhaV9wcm9wcyA9IHByaXYtPmRhaV9wcm9wczsKIAlkZXZfZGJnKGRldiwgImNwdSA6ICVzIC8gJTA0eCAvICVkXG4iLAotCQlpbmZvLT5jcHVfZGFpLm5hbWUsCi0JCWluZm8tPmNwdV9kYWkuZm10LAotCQlpbmZvLT5jcHVfZGFpLnN5c2Nsayk7CisJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUsCisJCWRhaV9wcm9wcy0+Y3B1X2RhaS5mbXQsCisJCWRhaV9wcm9wcy0+Y3B1X2RhaS5zeXNjbGspOwogCWRldl9kYmcoZGV2LCAiY29kZWMgOiAlcyAvICUwNHggLyAlZFxuIiwKLQkJaW5mby0+Y29kZWNfZGFpLm5hbWUsCi0JCWluZm8tPmNvZGVjX2RhaS5mbXQsCi0JCWluZm8tPmNvZGVjX2RhaS5zeXNjbGspOworCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsCisJCWRhaV9wcm9wcy0+Y29kZWNfZGFpLmZtdCwKKwkJZGFpX3Byb3BzLT5jb2RlY19kYWkuc3lzY2xrKTsKIAogCXJldHVybiAwOworCitlcnI6CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisKKy8qIHVwZGF0ZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkZXZpY2VzIG5vZGVzIGF0IGVuZCBvZiBwcm9iZSAqLworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3VucmVmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBudW1fbGlua3M7CisKKwlmb3IgKG51bV9saW5rcyA9IDAsIGRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7CisJICAgICBudW1fbGlua3MgPCBjYXJkLT5udW1fbGlua3M7CisJICAgICBudW1fbGlua3MrKywgZGFpX2xpbmsrKykgeworCQlucCA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgZGFpX2xpbmstPmNwdV9vZl9ub2RlOworCQlpZiAobnApCisJCQlvZl9ub2RlX3B1dChucCk7CisJCW5wID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSBkYWlfbGluay0+Y29kZWNfb2Zfbm9kZTsKKwkJaWYgKG5wKQorCQkJb2Zfbm9kZV9wdXQobnApOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfaW5mbyAqY2luZm87CisJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2NwdSwgKm9mX2NvZGVjLCAqb2ZfcGxhdGZvcm07CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgcmV0OworCWludCBudW1fbGlua3MsIG11bHRpLCByZXQ7CiAKLQljaW5mbwkJPSBOVUxMOwotCW9mX2NwdQkJPSBOVUxMOwotCW9mX2NvZGVjCT0gTlVMTDsKLQlvZl9wbGF0Zm9ybQk9IE5VTEw7CisJLyogZ2V0IHRoZSBudW1iZXIgb2YgREFJIGxpbmtzICovCisJaWYgKG5wICYmIG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAic2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmsiKSkgeworCQludW1fbGlua3MgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCQltdWx0aSA9IDE7CisJfSBlbHNlIHsKKwkJbnVtX2xpbmtzID0gMTsKKwkJbXVsdGkgPSAwOworCX0KIAotCWNpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghY2luZm8pCisJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBhbmQgdGhlIERBSSBsaW5rIGFycmF5ICovCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsCisJCQlzaXplb2YoKnByaXYpICsgc2l6ZW9mKCpkYWlfbGluaykgKiBudW1fbGlua3MsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBpbml0IHNuZF9zb2NfY2FyZAorCSAqLworCXByaXYtPnNuZF9jYXJkLm93bmVyID0gVEhJU19NT0RVTEU7CisJcHJpdi0+c25kX2NhcmQuZGV2ID0gZGV2OworCWRhaV9saW5rID0gcHJpdi0+ZGFpX2xpbms7CisJcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsgPSBkYWlfbGluazsKKwlwcml2LT5zbmRfY2FyZC5udW1fbGlua3MgPSBudW1fbGlua3M7CisKKwkvKiBnZXQgcm9vbSBmb3IgdGhlIG90aGVyIHByb3BlcnRpZXMgKi8KKwlwcml2LT5kYWlfcHJvcHMgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJc2l6ZW9mKCpwcml2LT5kYWlfcHJvcHMpICogbnVtX2xpbmtzLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5kYWlfcHJvcHMpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKG5wICYmIG9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7Ci0JCWNpbmZvLT5zbmRfY2FyZC5kZXYgPSBkZXY7CiAKLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihucCwgY2luZm8sIGRldiwKLQkJCQkJCSZvZl9jcHUsCi0JCQkJCQkmb2ZfY29kZWMsCi0JCQkJCQkmb2ZfcGxhdGZvcm0pOworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKG5wLCBwcml2LCBkZXYsIG11bHRpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKIAkJCQlkZXZfZXJyKGRldiwgInBhcnNlIGVycm9yICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZXJyOwogCQl9CisKKwkJLyoKKwkJICogc29jX2JpbmRfZGFpX2xpbmsoKSB3aWxsIGNoZWNrIGNwdSBuYW1lCisJCSAqIGFmdGVyIG9mX25vZGUgbWF0Y2hpbmcgaWYgZGFpX2xpbmsgaGFzIGNwdV9kYWlfbmFtZS4KKwkJICogYnV0LCBpdCB3aWxsIG5ldmVyIG1hdGNoIGlmIG5hbWUgd2FzIGNyZWF0ZWQgYnkgZm10X3NpbmdsZV9uYW1lKCkKKwkJICogcmVtb3ZlIGNwdV9kYWlfbmFtZSB0byBlc2NhcGUgbmFtZSBtYXRjaGluZy4KKwkJICogc2VlCisJCSAqCWZtdF9zaW5nbGVfbmFtZSgpCisJCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKKwkJICovCisJCWlmIChudW1fbGlua3MgPT0gMSkKKwkJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUgPSBOVUxMOworCiAJfSBlbHNlIHsKLQkJaWYgKCFkZXYtPnBsYXRmb3JtX2RhdGEpIHsKKwkJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfaW5mbyAqY2luZm87CisKKwkJY2luZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJCWlmICghY2luZm8pIHsKIAkJCWRldl9lcnIoZGV2LCAibm8gaW5mbyBmb3IgYXNvYy1zaW1wbGUtY2FyZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCW1lbWNweShjaW5mbywgZGV2LT5wbGF0Zm9ybV9kYXRhLCBzaXplb2YoKmNpbmZvKSk7Ci0JCWNpbmZvLT5zbmRfY2FyZC5kZXYgPSBkZXY7Ci0JfQorCQlpZiAoIWNpbmZvLT5uYW1lCXx8CisJCSAgICAhY2luZm8tPmNvZGVjX2RhaS5uYW1lCXx8CisJCSAgICAhY2luZm8tPmNvZGVjCXx8CisJCSAgICAhY2luZm8tPnBsYXRmb3JtCXx8CisJCSAgICAhY2luZm8tPmNwdV9kYWkubmFtZSkgeworCQkJZGV2X2VycihkZXYsICJpbnN1ZmZpY2llbnQgYXNvY19zaW1wbGVfY2FyZF9pbmZvIHNldHRpbmdzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKLQlpZiAoIWNpbmZvLT5uYW1lCXx8Ci0JICAgICFjaW5mby0+Y2FyZAl8fAotCSAgICAhY2luZm8tPmNvZGVjX2RhaS5uYW1lCXx8Ci0JICAgICEoY2luZm8tPmNvZGVjCQl8fCBvZl9jb2RlYykJfHwKLQkgICAgIShjaW5mby0+cGxhdGZvcm0JCXx8IG9mX3BsYXRmb3JtKQl8fAotCSAgICAhKGNpbmZvLT5jcHVfZGFpLm5hbWUJfHwgb2ZfY3B1KSkgewotCQlkZXZfZXJyKGRldiwgImluc3VmZmljaWVudCBhc29jX3NpbXBsZV9jYXJkX2luZm8gc2V0dGluZ3NcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcHJpdi0+c25kX2NhcmQubmFtZQk9IChjaW5mby0+Y2FyZCkgPyBjaW5mby0+Y2FyZCA6IGNpbmZvLT5uYW1lOworCQlkYWlfbGluay0+bmFtZQkJPSBjaW5mby0+bmFtZTsKKwkJZGFpX2xpbmstPnN0cmVhbV9uYW1lCT0gY2luZm8tPm5hbWU7CisJCWRhaV9saW5rLT5wbGF0Zm9ybV9uYW1lCT0gY2luZm8tPnBsYXRmb3JtOworCQlkYWlfbGluay0+Y29kZWNfbmFtZQk9IGNpbmZvLT5jb2RlYzsKKwkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZQk9IGNpbmZvLT5jcHVfZGFpLm5hbWU7CisJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSA9IGNpbmZvLT5jb2RlY19kYWkubmFtZTsKKwkJbWVtY3B5KCZwcml2LT5kYWlfcHJvcHMtPmNwdV9kYWksICZjaW5mby0+Y3B1X2RhaSwKKwkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y3B1X2RhaSkpOworCQltZW1jcHkoJnByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpLCAmY2luZm8tPmNvZGVjX2RhaSwKKwkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpKSk7CisKKwkJcHJpdi0+ZGFpX3Byb3BzLT5jcHVfZGFpLmZtdAl8PSBjaW5mby0+ZGFpZm10OworCQlwcml2LT5kYWlfcHJvcHMtPmNvZGVjX2RhaS5mbXQJfD0gY2luZm8tPmRhaWZtdDsKIAl9CiAKIAkvKgogCSAqIGluaXQgc25kX3NvY19kYWlfbGluawogCSAqLwotCWNpbmZvLT5zbmRfbGluay5uYW1lCQk9IGNpbmZvLT5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5zdHJlYW1fbmFtZQk9IGNpbmZvLT5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5jcHVfZGFpX25hbWUJPSBjaW5mby0+Y3B1X2RhaS5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5wbGF0Zm9ybV9uYW1lCT0gY2luZm8tPnBsYXRmb3JtOwotCWNpbmZvLT5zbmRfbGluay5jb2RlY19uYW1lCT0gY2luZm8tPmNvZGVjOwotCWNpbmZvLT5zbmRfbGluay5jb2RlY19kYWlfbmFtZQk9IGNpbmZvLT5jb2RlY19kYWkubmFtZTsKLQljaW5mby0+c25kX2xpbmsuY3B1X29mX25vZGUJPSBvZl9jcHU7Ci0JY2luZm8tPnNuZF9saW5rLmNvZGVjX29mX25vZGUJPSBvZl9jb2RlYzsKLQljaW5mby0+c25kX2xpbmsucGxhdGZvcm1fb2Zfbm9kZSA9IG9mX3BsYXRmb3JtOwotCWNpbmZvLT5zbmRfbGluay5pbml0CQk9IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQ7CisJZGFpX2xpbmstPmluaXQgPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0OwogCi0JLyoKLQkgKiBpbml0IHNuZF9zb2NfY2FyZAotCSAqLwotCWNpbmZvLT5zbmRfY2FyZC5uYW1lCQk9IGNpbmZvLT5jYXJkOwotCWNpbmZvLT5zbmRfY2FyZC5vd25lcgkJPSBUSElTX01PRFVMRTsKLQljaW5mby0+c25kX2NhcmQuZGFpX2xpbmsJPSAmY2luZm8tPnNuZF9saW5rOwotCWNpbmZvLT5zbmRfY2FyZC5udW1fbGlua3MJPSAxOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmcHJpdi0+c25kX2NhcmQsIHByaXYpOwogCi0Jc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZjaW5mby0+c25kX2NhcmQsIGNpbmZvKTsKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmcHJpdi0+c25kX2NhcmQpOwogCi0JcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZjaW5mby0+c25kX2NhcmQpOworZXJyOgorCWFzb2Nfc2ltcGxlX2NhcmRfdW5yZWYocGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXNvY19zaW1wbGVfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKaW5kZXggNjFjMTBiZi4uM2M4MWIzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKQEAgLTIsMTIgKzIsNTAgQEAKIAl0cmlzdGF0ZSAiU09DIE1hY2hpbmUgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBNZWRmaWVsZCBNSUQgcGxhdGZvcm0iCiAJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDCiAJc2VsZWN0IFNORF9TT0NfU045NTAzMQotCXNlbGVjdCBTTkRfU1NUX1BMQVRGT1JNCisJc2VsZWN0IFNORF9TU1RfTUZMRF9QTEFURk9STQogCWhlbHAKICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgQVNvQyBtYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwoUikgTUlEIE1lZGZpZWxkIHBsYXRmb3JtCiAgICAgICAgICAgdXNlZCBhcyBhbHNhIGRldmljZSBpbiBhdWRpbyBzdWJzdGVtIGluIEludGVsKFIpIE1JRCBkZXZpY2VzCiAgICAgICAgICAgU2F5IFkgaWYgeW91IGhhdmUgc3VjaCBhIGRldmljZQogICAgICAgICAgIElmIHVuc3VyZSBzZWxlY3QgIk4iLgogCi1jb25maWcgU05EX1NTVF9QTEFURk9STQorY29uZmlnIFNORF9TU1RfTUZMRF9QTEFURk9STQogCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX0lOVEVMX1NTVAorCXRyaXN0YXRlICJBU29DIHN1cHBvcnQgZm9yIEludGVsKFIpIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kiCisJc2VsZWN0IFNORF9TT0NfSU5URUxfU1NUX0FDUEkgaWYgQUNQSQorCWRlcGVuZHMgb24gKFg4NiB8fCBDT01QSUxFX1RFU1QpCisJaGVscAorICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBJbnRlbChSKSBTbWFydCBTb3VuZCBUZWNobm9sb2d5IChTU1QpLgorICAgICAgICAgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBkZXZpY2UKKyAgICAgICAgICBJZiB1bnN1cmUgc2VsZWN0ICJOIi4KKworY29uZmlnIFNORF9TT0NfSU5URUxfU1NUX0FDUEkKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfSU5URUxfQkFZVFJBSUwKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19JTlRFTF9IQVNXRUxMX01BQ0gKKwl0cmlzdGF0ZSAiQVNvQyBBdWRpbyBEU1Agc3VwcG9ydCBmb3IgSW50ZWwgSGFzd2VsbCBMeW54cG9pbnQiCisJZGVwZW5kcyBvbiBTTkRfU09DX0lOVEVMX1NTVCAmJiBYODZfSU5URUxfTFBTUyAmJiBJMkMKKwlzZWxlY3QgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJc2VsZWN0IFNORF9TT0NfUlQ1NjQwCisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBMeW54cG9pbnQgQXVkaW8gRFNQIG9uIEludGVsKFIpIEhhc3dlbGwKKwkgIFVsdHJhYm9vayBwbGF0Zm9ybXMuCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBzdWNoIGEgZGV2aWNlCisJICBJZiB1bnN1cmUgc2VsZWN0ICJOIi4KKworY29uZmlnIFNORF9TT0NfSU5URUxfQllUX1JUNTY0MF9NQUNICisJdHJpc3RhdGUgIkFTb0MgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBCYXl0cmFpbCB3aXRoIFJUNTY0MCBjb2RlYyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSU5URUxfU1NUICYmIFg4Nl9JTlRFTF9MUFNTICYmIEkyQworCXNlbGVjdCBTTkRfU09DX0lOVEVMX0JBWVRSQUlMCisJc2VsZWN0IFNORF9TT0NfUlQ1NjQwCisJaGVscAorCSAgVGhpcyBhZGRzIGF1ZGlvIGRyaXZlciBmb3IgSW50ZWwgQmF5dHJhaWwgcGxhdGZvcm0gYmFzZWQgYm9hcmRzCisJICB3aXRoIHRoZSBSVDU2NDAgYXVkaW8gY29kZWMuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUgYi9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKaW5kZXggNjM5ODgzMy4uZWRlYjc5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKQEAgLTEsNSArMSwyOCBAQAotc25kLXNvYy1zc3QtcGxhdGZvcm0tb2JqcyA6PSBzc3RfcGxhdGZvcm0ubworIyBDb3JlIHN1cHBvcnQKK3NuZC1zb2Mtc3N0LWRzcC1vYmpzIDo9IHNzdC1kc3AubyBzc3QtZmlybXdhcmUubworc25kLXNvYy1zc3QtYWNwaS1vYmpzIDo9IHNzdC1hY3BpLm8KKworc25kLXNvYy1zc3QtbWZsZC1wbGF0Zm9ybS1vYmpzIDo9IHNzdC1tZmxkLXBsYXRmb3JtLm8KIHNuZC1zb2MtbWZsZC1tYWNoaW5lLW9ianMgOj0gbWZsZF9tYWNoaW5lLm8KIAotb2JqLSQoQ09ORklHX1NORF9TU1RfUExBVEZPUk0pICs9IHNuZC1zb2Mtc3N0LXBsYXRmb3JtLm8KK29iai0kKENPTkZJR19TTkRfU1NUX01GTERfUExBVEZPUk0pICs9IHNuZC1zb2Mtc3N0LW1mbGQtcGxhdGZvcm0ubwogb2JqLSQoQ09ORklHX1NORF9NRkxEX01BQ0hJTkUpICs9IHNuZC1zb2MtbWZsZC1tYWNoaW5lLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUKSArPSBzbmQtc29jLXNzdC1kc3Aubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUX0FDUEkpICs9IHNuZC1zb2Mtc3N0LWFjcGkubworCisjIFBsYXRmb3JtIFN1cHBvcnQKK3NuZC1zb2Mtc3N0LWhhc3dlbGwtcGNtLW9ianMgOj0gXAorCXNzdC1oYXN3ZWxsLWlwYy5vIHNzdC1oYXN3ZWxsLXBjbS5vIHNzdC1oYXN3ZWxsLWRzcC5vCitzbmQtc29jLXNzdC1iYXl0cmFpbC1wY20tb2JqcyA6PSBcCisJc3N0LWJheXRyYWlsLWlwYy5vIHNzdC1iYXl0cmFpbC1wY20ubyBzc3QtYmF5dHJhaWwtZHNwLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTCkgKz0gc25kLXNvYy1zc3QtaGFzd2VsbC1wY20ubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkFZVFJBSUwpICs9IHNuZC1zb2Mtc3N0LWJheXRyYWlsLXBjbS5vCisKKyMgTWFjaGluZSBzdXBwb3J0CitzbmQtc29jLXNzdC1oYXN3ZWxsLW9ianMgOj0gaGFzd2VsbC5vCitzbmQtc29jLXNzdC1ieXQtcnQ1NjQwLW1hY2gtb2JqcyA6PSBieXQtcnQ1NjQwLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTF9NQUNIKSArPSBzbmQtc29jLXNzdC1oYXN3ZWxsLm8KK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JZVF9SVDU2NDBfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0LXJ0NTY0MC1tYWNoLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ieXQtcnQ1NjQwLmMgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LXJ0NTY0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjk3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LXJ0NTY0MC5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogSW50ZWwgQmF5dHJhaWwgU1NUIFJUNTY0MCBtYWNoaW5lIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X3J0NTY0MF93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludGVybmFsIE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfYXVkaW9fbWFwW10gPSB7CisJeyJJTjJQIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJJTjJOIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJETUlDMSIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MTiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9SUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9STiJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJ5dF9ydDU2NDBfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkludGVybmFsIE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlNwZWFrZXIiKSwKK307CisKK3N0YXRpYyBpbnQgYnl0X3J0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1BMTDEsCisJCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2LAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgImNhbid0IHNldCBjb2RlYyBjbG9jayAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFJUNTY0MF9QTEwxX1NfQkNMSzEsCisJCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNjQsCisJCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHBsbDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ5dF9ydDU2NDBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnVudGltZS0+Y2FyZDsKKworCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNhcmQsIGJ5dF9ydDU2NDBfY29udHJvbHMsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9jb250cm9scykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gYWRkIGNhcmQgY29udHJvbHNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBPTCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBPUiIpOworCisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUE9MUCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BPTE4iKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQT1JQIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUE9STiIpOworCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkludGVybmFsIE1pYyIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBieXRfcnQ1NjQwX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYnl0X3J0NTY0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYnl0X3J0NTY0MF9kYWlzW10gPSB7CisJeworCQkubmFtZSA9ICJCYXl0cmFpbCBBdWRpbyIsCisJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyIsCisJCS5jcHVfZGFpX25hbWUgPSAiRnJvbnQtY3B1LWRhaSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NDAtYWlmMSIsCisJCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY0MDowMCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImJheXRyYWlsLXBjbS1hdWRpbyIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkJLmluaXQgPSBieXRfcnQ1NjQwX2luaXQsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmYnl0X3J0NTY0MF9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gIkJheXRyYWlsIFZvaWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNaWMxLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5pbml0ID0gTlVMTCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZieXRfcnQ1NjQwX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYnl0X3J0NTY0MF9jYXJkID0geworCS5uYW1lID0gImJ5dC1ydDU2NDAiLAorCS5kYWlfbGluayA9IGJ5dF9ydDU2NDBfZGFpcywKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBieXRfcnQ1NjQwX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYnl0X3J0NTY0MF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9hdWRpb19tYXApLAorfTsKKworc3RhdGljIGludCBieXRfcnQ1NjQwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZieXRfcnQ1NjQwX2NhcmQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBieXRfcnQ1NjQwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJ5dF9ydDU2NDBfYXVkaW8gPSB7CisJLnByb2JlID0gYnl0X3J0NTY0MF9wcm9iZSwKKwkucmVtb3ZlID0gYnl0X3J0NTY0MF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihieXRfcnQ1NjQwX2F1ZGlvKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgSW50ZWwoUikgQmF5dHJhaWwgTWFjaGluZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk9tYWlyIE1kIEFiZHVsbGFoLCBKYXJra28gTmlrdWxhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ5dC1ydDU2NDAiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsLmMgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogSW50ZWwgSGFzd2VsbCBMeW54cG9pbnQgU1NUIEF1ZGlvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgorCisvKiBIYXN3ZWxsIFVMVCBwbGF0Zm9ybXMgaGF2ZSBhIEhlYWRwaG9uZSBhbmQgTWljIGphY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBoYXN3ZWxsX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZXMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWMiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGhhc3dlbGxfcnQ1NjQwX21hcFtdID0geworCisJeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQT1IifSwKKwl7IkhlYWRwaG9uZXMiLCBOVUxMLCAiSFBPTCJ9LAorCXsiSU4yUCIsIE5VTEwsICJNaWMifSwKKworCS8qIENPREVDIEJFIGNvbm5lY3Rpb25zICovCisJeyJTU1AwIENPREVDIElOIiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJTU1AwIENPREVDIE9VVCJ9LAorfTsKKworc3RhdGljIGludCBoYXN3ZWxsX3NzcDBfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJLyogVGhlIEFEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8gKi8KKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CisKKwkvKiBzZXQgU1NQMCB0byAxNiBiaXQgKi8KKwlzbmRfbWFza19zZXQoJnBhcmFtcy0+bWFza3NbU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCAtCisJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSwKKwkJCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhc3dlbGxfcnQ1NjQwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfTUNMSywgMTIyODgwMDAsCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGsgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IGNvcnJlY3QgY29kZWMgZmlsdGVyIGZvciBEQUkgZm9ybWF0IGFuZCBjbG9jayBjb25maWcgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKHJ0ZC0+Y29kZWMsIDB4ODMsIDB4ZmZmZiwgMHg4MDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgaGFzd2VsbF9ydDU2NDBfb3BzID0geworCS5od19wYXJhbXMgPSBoYXN3ZWxsX3J0NTY0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfcnRkX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocnRkLT5wbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaGFzd2VsbCA9IHBkYXRhLT5kc3A7CisJaW50IHJldDsKKworCS8qIFNldCBBRFNQIFNTUCBwb3J0IHNldHRpbmdzICovCisJcmV0ID0gc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhoYXN3ZWxsLCBTU1RfSFNXX0RFVklDRV9TU1BfMCwKKwkJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiwKKwkJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSLCA5KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBkZXZpY2UgY29uZmlnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBhbHdheXMgY29ubmVjdGVkICovCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGhhc3dlbGxfcnQ1NjQwX2RhaXNbXSA9IHsKKwkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCisJeworCQkubmFtZSA9ICJTeXN0ZW0iLAorCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAorCQkuZHluYW1pYyA9IDEsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuaW5pdCA9IGhhc3dlbGxfcnRkX2luaXQsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk9mZmxvYWQwIiwKKwkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQwIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJPZmZsb2FkMCBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk9mZmxvYWQxIiwKKwkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJPZmZsb2FkMSBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIkxvb3BiYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxvb3BiYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMb29wYmFjayBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMCwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQ2FwdHVyZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJDYXB0dXJlIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCX0sCisKKwkvKiBCYWNrIEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS8qIFNTUDAgLSBDb2RlYyAqLworCQkubmFtZSA9ICJDb2RlYyIsCisJCS5iZV9pZCA9IDAsCisJCS5jcHVfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5jb2RlY19uYW1lID0gImkyYy1JTlQzM0NBOjAwIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwKKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGhhc3dlbGxfc3NwMF9maXh1cCwKKwkJLm9wcyA9ICZoYXN3ZWxsX3J0NTY0MF9vcHMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJfSwKK307CisKKy8qIGF1ZGlvIG1hY2hpbmUgZHJpdmVyIGZvciBIYXN3ZWxsIEx5bnhwb2ludCBEU1AgKyBSVDU2NDAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGhhc3dlbGxfcnQ1NjQwID0geworCS5uYW1lID0gImhhc3dlbGwtcnQ1NjQwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSBoYXN3ZWxsX3J0NTY0MF9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBoYXN3ZWxsX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaGFzd2VsbF9ydDU2NDBfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX21hcCksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwloYXN3ZWxsX3J0NTY0MC5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmaGFzd2VsbF9ydDU2NDApOworfQorCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoJmhhc3dlbGxfcnQ1NjQwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGFzd2VsbF9hdWRpbyA9IHsKKwkucHJvYmUgPSBoYXN3ZWxsX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUgPSBoYXN3ZWxsX2F1ZGlvX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaGFzd2VsbF9hdWRpbykKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBYaW5nY2hhbyBXYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBBdWRpbyBmb3IgSGFzd2VsbCBMeW54cG9pbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGFzd2VsbC1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jIGIvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jCmluZGV4IGQzZDRjMzIuLjAzMWQ3ODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9tZmxkX21hY2hpbmUuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvbWZsZF9tYWNoaW5lLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludAloc19zd2l0Y2g7CiBzdGF0aWMgdW5zaWduZWQgaW50CWxvX2RhYzsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqbWZsZF9jb2RlYzsKIAogc3RydWN0IG1mbGRfbWNfcHJpdmF0ZSB7CiAJdm9pZCBfX2lvbWVtICppbnRfYmFzZTsKQEAgLTEwMCw0MCArMTAxLDQ3IEBACiBzdGF0aWMgaW50IGhlYWRzZXRfc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gaHNfc3dpdGNoKQogCQlyZXR1cm4gMDsKIAorCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CiAJCXByX2RlYnVnKCJoc19zZXQgSFMgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkVQT1VUIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKIAl9IGVsc2UgewogCQlwcl9kZWJ1ZygiaHNfc2V0IEVQIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiSGVhZHBob25lcyIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CiAJfQotCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKIAloc19zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsb19lbmFibGVfb3V0X3BpbnMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgbG9fZW5hYmxlX291dF9waW5zKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJJSEZPVVRMIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiSUhGT1VUUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkVPVVRMIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTElORU9VVFIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJWSUIxT1VUIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMk9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJJSEZPVVRMIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVEwiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMU9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIyT1VUIik7CiAJaWYgKGhzX3N3aXRjaCkgewotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lcyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CiAJfSBlbHNlIHsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOwogCX0KIH0KIApAQCAtMTQ3LDQ1ICsxNTUsNTMgQEAKIHN0YXRpYyBpbnQgbG9fc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gbG9fZGFjKQogCQlyZXR1cm4gMDsKIAorCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJLyogd2UgZG9udCB3YW50IHRvIHdvcmsgd2l0aCBsYXN0IHN0YXRlIG9mIGxpbmVvdXQgc28ganVzdCBlbmFibGUgYWxsCiAJICogcGlucyBhbmQgdGhlbiBkaXNhYmxlIHBpbnMgbm90IHJlcXVpcmVkCiAJICovCi0JbG9fZW5hYmxlX291dF9waW5zKGNvZGVjKTsKKwlsb19lbmFibGVfb3V0X3BpbnMoZGFwbSk7CisKIAlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CiAJY2FzZSAwOgogCQlwcl9kZWJ1Zygic2V0IHZpYnJhIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMU9VVCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMk9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAwKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIxT1VUIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMk9VVCIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1mbGRfY29kZWMsIFNOOTUwMzFfTE9DVEwsIDB4NjYsIDApOwogCQlicmVhazsKIAogCWNhc2UgMToKIAkJcHJfZGVidWcoInNldCBocyAgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKIAkJYnJlYWs7CiAKIAljYXNlIDI6CiAJCXByX2RlYnVnKCJzZXQgc3BrciBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIklIRk9VVEwiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIklIRk9VVFIiKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg0NCk7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSUhGT1VUTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDQ0KTsKIAkJYnJlYWs7CiAKIAljYXNlIDM6CiAJCXByX2RlYnVnKCJzZXQgbnVsbCBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkVPVVRMIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJMSU5FT1VUUiIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDY2KTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FT1VUTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxJTkVPVVRSIik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWZsZF9jb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg2Nik7CiAJCWJyZWFrOwogCX0KLQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOworCiAJbG9fZGFjID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjEsMjYgKzIzNywxMSBAQAogCiBzdGF0aWMgaW50IG1mbGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydW50aW1lLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJnJ1bnRpbWUtPmNhcmQtPmRhcG07CiAJaW50IHJldF92YWw7CiAKLQkvKiBBZGQgamFjayBzZW5zZSB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtZmxkX3dpZGdldHMsIEFSUkFZX1NJWkUobWZsZF93aWRnZXRzKSk7CisJbWZsZF9jb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOwogCi0JLyogU2V0IHVwIHRoZSBtYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBtZmxkX21hcCwgQVJSQVlfU0laRShtZmxkX21hcCkpOwotCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmVzIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyIpOwotCi0JcmV0X3ZhbCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtZmxkX3NuZF9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKG1mbGRfc25kX2NvbnRyb2xzKSk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzb2NfYWRkX2NvbnRyb2xzIGZhaWxlZCAlZCIsIHJldF92YWwpOwotCQlyZXR1cm4gcmV0X3ZhbDsKLQl9CiAJLyogZGVmYXVsdCBpcyBlYXJwaWVjZSBwaW4sIHVzZXJzcGFjZSBzZXRzIGl0IGV4cGxjaXRseSAqLwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lcyIpOwogCS8qIGRlZmF1bHQgaXMgbGluZW91dCBOQywgdXNlcnNwYWNlIHNldHMgaXQgZXhwbGNpdGx5ICovCkBAIC0yNTMsNyArMjU0LDcgQEAKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTlIiKTsKIAogCS8qIEhlYWRzZXQgYW5kIGJ1dHRvbiBqYWNrIGRldGVjdGlvbiAqLwotCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLAorCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KG1mbGRfY29kZWMsICJJbnRlbChSKSBNSUQgQXVkaW8gSmFjayIsCiAJCQlTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAgfAogCQkJU05EX0pBQ0tfQlROXzEsICZtZmxkX2phY2spOwogCWlmIChyZXRfdmFsKSB7CkBAIC0zMzUsNiArMzM2LDEzIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gbWZsZF9tc2ljX2RhaWxpbmssCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUobWZsZF9tc2ljX2RhaWxpbmspLAorCisJLmNvbnRyb2xzID0gbWZsZF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWZsZF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBtZmxkX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1mbGRfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gbWZsZF9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWZsZF9tYXApLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHNuZF9tZmxkX2phY2tfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogSW50ZWwgU1NUIGxvYWRlciBvbiBBQ1BJIHN5c3RlbXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIFNTVF9MUFRfRFNQX0RNQV9BRERSX09GRlNFVAkweDBGMDAwMAorI2RlZmluZSBTU1RfV1BUX0RTUF9ETUFfQUREUl9PRkZTRVQJMHgwRkUwMDAKKyNkZWZpbmUgU1NUX0xQVF9EU1BfRE1BX1NJWkUJCSgxMDI0IC0gMSkKKworLyogRGVzY3JpcHRvciBmb3IgU1NUIEFTb0MgbWFjaGluZSBkcml2ZXIgKi8KK3N0cnVjdCBzc3RfYWNwaV9tYWNoIHsKKwkvKiBBQ1BJIElEIGZvciB0aGUgbWF0Y2hpbmcgbWFjaGluZSBkcml2ZXIuIEF1ZGlvIGNvZGVjIGZvciBpbnN0YW5jZSAqLworCWNvbnN0IHU4IGlkW0FDUElfSURfTEVOXTsKKwkvKiBtYWNoaW5lIGRyaXZlciBuYW1lICovCisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJLyogZmlybXdhcmUgZmlsZSBuYW1lICovCisJY29uc3QgY2hhciAqZndfZmlsZW5hbWU7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHVwIFNTVCBwbGF0Zm9ybSBkYXRhICovCitzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyB7CisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2hpbmVzOworCS8qIFBsYXRmb3JtIHJlc291cmNlIGluZGV4ZXMuIE11c3Qgc2V0IHRvIC0xIGlmIG5vdCB1c2VkICovCisJaW50IHJlc2luZGV4X2xwZV9iYXNlOworCWludCByZXNpbmRleF9wY2ljZmdfYmFzZTsKKwlpbnQgcmVzaW5kZXhfZndfYmFzZTsKKwlpbnQgaXJxaW5kZXhfaG9zdF9pcGM7CisJaW50IHJlc2luZGV4X2RtYV9iYXNlOworCS8qIFVuaXF1ZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIFNTVCBjb3JlIG9uIHBsYXRmb3JtICovCisJaW50IHNzdF9pZDsKKwkvKiBETUEgb25seSB2YWxpZCB3aGVuIHJlc2luZGV4X2RtYV9iYXNlICE9IC0xKi8KKwlpbnQgZG1hX2VuZ2luZTsKKwlpbnQgZG1hX3NpemU7Cit9OworCitzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9tYWNoOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfcGNtOworCXN0cnVjdCBzc3RfcGRhdGEgc3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjOworCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoOworfTsKKworc3RhdGljIHZvaWQgc3N0X2FjcGlfZndfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9ICZzc3RfYWNwaS0+c3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjID0gc3N0X2FjcGktPmRlc2M7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2ggPSBzc3RfYWNwaS0+bWFjaDsKKworCXNzdF9wZGF0YS0+ZncgPSBmdzsKKwlpZiAoIWZ3KSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGxvYWQgZmlybXdhcmUgJXNcbiIsIG1hY2gtPmZ3X2ZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlZ2lzdGVyIFBDTSBhbmQgREFJIGRyaXZlciAqLworCXNzdF9hY3BpLT5wZGV2X3BjbSA9CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGRldiwgZGVzYy0+ZHJ2X25hbWUsIC0xLAorCQkJCQkgICAgICBzc3RfcGRhdGEsIHNpemVvZigqc3N0X3BkYXRhKSk7CisJaWYgKElTX0VSUihzc3RfYWNwaS0+cGRldl9wY20pKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIGRldmljZSAlcy4gRXJyb3IgJWRcbiIsCisJCQlkZXNjLT5kcnZfbmFtZSwgKGludClQVFJfRVJSKHNzdF9hY3BpLT5wZGV2X3BjbSkpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNzdF9hY3BpX21hY2hfbWF0Y2goYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCisJCQkJICAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXQpCit7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggKnNzdF9hY3BpX2ZpbmRfbWFjaGluZSgKKwlzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCAqbWFjaGluZXMpCit7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJZm9yIChtYWNoID0gbWFjaGluZXM7IG1hY2gtPmlkWzBdOyBtYWNoKyspCisJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfZGV2aWNlcyhtYWNoLT5pZCwKKwkJCQkJCSAgc3N0X2FjcGlfbWFjaF9tYXRjaCwKKwkJCQkJCSAgJmZvdW5kLCBOVUxMKSkgJiYgZm91bmQpCisJCQlyZXR1cm4gbWFjaDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNzdF9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGE7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJc3RydWN0IHNzdF9hY3BpX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlc291cmNlICptbWlvOworCWludCByZXQgPSAwOworCisJc3N0X2FjcGkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNzdF9hY3BpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9hY3BpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWQgPSBhY3BpX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRlc2MgPSAoc3RydWN0IHNzdF9hY3BpX2Rlc2MgKilpZC0+ZHJpdmVyX2RhdGE7CisJbWFjaCA9IHNzdF9hY3BpX2ZpbmRfbWFjaGluZShkZXNjLT5tYWNoaW5lcyk7CisJaWYgKG1hY2ggPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIk5vIG1hdGNoaW5nIEFTb0MgbWFjaGluZSBkcml2ZXIgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKKwlzc3RfcGRhdGEtPmlkID0gZGVzYy0+c3N0X2lkOworCXNzdF9hY3BpLT5kZXNjID0gZGVzYzsKKwlzc3RfYWNwaS0+bWFjaCA9IG1hY2g7CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfZG1hX2Jhc2UgPj0gMCkgeworCQlzc3RfcGRhdGEtPmRtYV9lbmdpbmUgPSBkZXNjLT5kbWFfZW5naW5lOworCQlzc3RfcGRhdGEtPmRtYV9iYXNlID0gZGVzYy0+cmVzaW5kZXhfZG1hX2Jhc2U7CisJCXNzdF9wZGF0YS0+ZG1hX3NpemUgPSBkZXNjLT5kbWFfc2l6ZTsKKwl9CisKKwlpZiAoZGVzYy0+aXJxaW5kZXhfaG9zdF9pcGMgPj0gMCkKKwkJc3N0X3BkYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGRlc2MtPmlycWluZGV4X2hvc3RfaXBjKTsKKworCWlmIChkZXNjLT5yZXNpbmRleF9scGVfYmFzZSA+PSAwKSB7CisJCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfbHBlX2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5scGVfYmFzZSA9IG1taW8tPnN0YXJ0OworCQkJc3N0X3BkYXRhLT5scGVfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7CisJCX0KKwl9CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPj0gMCkgeworCQltbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkgICAgIGRlc2MtPnJlc2luZGV4X3BjaWNmZ19iYXNlKTsKKwkJaWYgKG1taW8pIHsKKwkJCXNzdF9wZGF0YS0+cGNpY2ZnX2Jhc2UgPSBtbWlvLT5zdGFydDsKKwkJCXNzdF9wZGF0YS0+cGNpY2ZnX3NpemUgPSByZXNvdXJjZV9zaXplKG1taW8pOworCQl9CisJfQorCisJaWYgKGRlc2MtPnJlc2luZGV4X2Z3X2Jhc2UgPj0gMCkgeworCQltbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkgICAgIGRlc2MtPnJlc2luZGV4X2Z3X2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5md19iYXNlID0gbW1pby0+c3RhcnQ7CisJCQlzc3RfcGRhdGEtPmZ3X3NpemUgPSByZXNvdXJjZV9zaXplKG1taW8pOworCQl9CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3N0X2FjcGkpOworCisJLyogcmVnaXN0ZXIgbWFjaGluZSBkcml2ZXIgKi8KKwlzc3RfYWNwaS0+cGRldl9tYWNoID0KKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoZGV2LCBtYWNoLT5kcnZfbmFtZSwgLTEsCisJCQkJCSAgICAgIHNzdF9wZGF0YSwgc2l6ZW9mKCpzc3RfcGRhdGEpKTsKKwlpZiAoSVNfRVJSKHNzdF9hY3BpLT5wZGV2X21hY2gpKQorCQlyZXR1cm4gUFRSX0VSUihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKworCS8qIGNvbnRpbnVlIFNTVCBwcm9iaW5nIGFmdGVyIGZpcm13YXJlIGlzIGxvYWRlZCAqLworCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCB0cnVlLCBtYWNoLT5md19maWxlbmFtZSwKKwkJCQkgICAgICBkZXYsIEdGUF9LRVJORUwsIHBkZXYsIHNzdF9hY3BpX2Z3X2NiKTsKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2FjcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9hY3BpX3ByaXYgKnNzdF9hY3BpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gJnNzdF9hY3BpLT5zc3RfcGRhdGE7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHNzdF9hY3BpLT5wZGV2X3BjbSkpCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X3BjbSk7CisJcmVsZWFzZV9maXJtd2FyZShzc3RfcGRhdGEtPmZ3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggaGFzd2VsbF9tYWNoaW5lc1tdID0geworCXsgIklOVDMzQ0EiLCAiaGFzd2VsbC1hdWRpbyIsICJpbnRlbC9JbnRjU1NUMS5iaW4iIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgPSB7CisJLmRydl9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkubWFjaGluZXMgPSBoYXN3ZWxsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IC0xLAorCS5pcnFpbmRleF9ob3N0X2lwYyA9IDAsCisJLnNzdF9pZCA9IFNTVF9ERVZfSURfTFlOWF9QT0lOVCwKKwkuZG1hX2VuZ2luZSA9IFNTVF9ETUFfVFlQRV9EVywKKwkucmVzaW5kZXhfZG1hX2Jhc2UgPSBTU1RfTFBUX0RTUF9ETUFfQUREUl9PRkZTRVQsCisJLmRtYV9zaXplID0gU1NUX0xQVF9EU1BfRE1BX1NJWkUsCit9OworCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggYnJvYWR3ZWxsX21hY2hpbmVzW10gPSB7CisJeyAiSU5UMzQzQSIsICJicm9hZHdlbGwtYXVkaW8iLCAiaW50ZWwvSW50Y1NTVDIuYmluIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX2Rlc2Mgc3N0X2FjcGlfYnJvYWR3ZWxsX2Rlc2MgPSB7CisJLmRydl9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkubWFjaGluZXMgPSBicm9hZHdlbGxfbWFjaGluZXMsCisJLnJlc2luZGV4X2xwZV9iYXNlID0gMCwKKwkucmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPSAxLAorCS5yZXNpbmRleF9md19iYXNlID0gLTEsCisJLmlycWluZGV4X2hvc3RfaXBjID0gMCwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9XSUxEQ0FUX1BPSU5ULAorCS5kbWFfZW5naW5lID0gU1NUX0RNQV9UWVBFX0RXLAorCS5yZXNpbmRleF9kbWFfYmFzZSA9IFNTVF9XUFRfRFNQX0RNQV9BRERSX09GRlNFVCwKKwkuZG1hX3NpemUgPSBTU1RfTFBUX0RTUF9ETUFfU0laRSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBiYXl0cmFpbF9tYWNoaW5lc1tdID0geworCXsgIjEwRUM1NjQwIiwgImJ5dC1ydDU2NDAiLCAiaW50ZWwvZndfc3N0XzBmMjguYmluLWkyc19tYXN0ZXIiIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9iYXl0cmFpbF9kZXNjID0geworCS5kcnZfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCS5tYWNoaW5lcyA9IGJheXRyYWlsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IDIsCisJLmlycWluZGV4X2hvc3RfaXBjID0gNSwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9CWVQsCisJLnJlc2luZGV4X2RtYV9iYXNlID0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX21hdGNoW10gPSB7CisJeyAiSU5UMzNDOCIsICh1bnNpZ25lZCBsb25nKSZzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgfSwKKwl7ICJJTlQzNDM4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2Jyb2Fkd2VsbF9kZXNjIH0sCisJeyAiODA4NjBGMjgiLCAodW5zaWduZWQgbG9uZykmc3N0X2FjcGlfYmF5dHJhaWxfZGVzYyB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3N0X2FjcGlfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzc3RfYWNwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gc3N0X2FjcGlfcHJvYmUsCisJLnJlbW92ZSA9IHNzdF9hY3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzc3QtYWNwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHNzdF9hY3BpX21hdGNoKSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X2FjcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFya2tvIE5pa3VsYSA8amFya2tvLm5pa3VsYUBsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBsb2FkZXIgb24gQUNQSSBzeXN0ZW1zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWRzcC5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBiZjdmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1kc3AuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBEU1AgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJzc3QtZHNwLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorCisjZGVmaW5lIFNTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkUJNAorI2RlZmluZSBTU1RfQllUX0ZXX1NJR04JCQkiJFNTVCIKKworI2RlZmluZSBTU1RfQllUX0lSQU1fT0ZGU0VUCTB4QzAwMDAKKyNkZWZpbmUgU1NUX0JZVF9EUkFNX09GRlNFVAkweDEwMDAwMAorI2RlZmluZSBTU1RfQllUX1NISU1fT0ZGU0VUCTB4MTQwMDAwCisKK2VudW0gc3N0X3JhbV90eXBlIHsKKwlTU1RfQllUX0lSQU0JPSAxLAorCVNTVF9CWVRfRFJBTQk9IDIsCisJU1NUX0JZVF9DQUNIRQk9IDMsCit9OworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7CS8qIElSQU0vRFJBTSAqLworCXUzMgkJCXNpemU7CS8qIEJ5dGVzICovCisJdTMyCQkJcmFtX29mZnNldDsgLyogT2Zmc2V0IGluIEkvRFJBTSAqLworCXUzMgkJCXJzdmQ7CS8qIFJlc2VydmVkIGZpZWxkICovCit9OworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfQllUX0ZXX1NJR05BVFVSRV9TSVpFXTsKKwl1MzIgZmlsZV9zaXplOyAvKiBzaXplIG9mIGZ3IG1pbnVzIHRoaXMgaGVhZGVyICovCisJdTMyIG1vZHVsZXM7IC8qICAjIG9mIG1vZHVsZXMgKi8KKwl1MzIgZmlsZV9mb3JtYXQ7IC8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCXUzMiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkVdOworCXUzMiBtb2Rfc2l6ZTsgLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwl1MzIgYmxvY2tzOyAvKiAjIG9mIGJsb2NrcyAqLworCXUzMiB0eXBlOyAvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwl1MzIgZW50cnlfcG9pbnQ7Cit9OworCitzdGF0aWMgaW50IHNzdF9ieXRfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCQkJCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7CisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSBibG9ja19kYXRhOworCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlIHRlbXBsYXRlOworCWludCBjb3VudDsKKworCW1lbXNldCgmdGVtcGxhdGUsIDAsIHNpemVvZih0ZW1wbGF0ZSkpOworCXRlbXBsYXRlLmlkID0gbW9kdWxlLT50eXBlOworCXRlbXBsYXRlLmVudHJ5ID0gbW9kdWxlLT5lbnRyeV9wb2ludDsKKwl0ZW1wbGF0ZS5wLnR5cGUgPSBTU1RfTUVNX0RSQU07CisJdGVtcGxhdGUucC5kYXRhX3R5cGUgPSBTU1RfREFUQV9QOworCXRlbXBsYXRlLnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwl0ZW1wbGF0ZS5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisKKwltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKKwlpZiAobW9kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CisKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoZHNwLT5kZXYsICJibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3dpdGNoIChibG9jay0+dHlwZSkgeworCQljYXNlIFNTVF9CWVRfSVJBTToKKwkJCWJsb2NrX2RhdGEub2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKworCQkJCQkgICAgZHNwLT5hZGRyLmlyYW1fb2Zmc2V0OworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9JUkFNOworCQkJYnJlYWs7CisJCWNhc2UgU1NUX0JZVF9EUkFNOgorCQkJYmxvY2tfZGF0YS5vZmZzZXQgPSBibG9jay0+cmFtX29mZnNldCArCisJCQkJCSAgICBkc3AtPmFkZHIuZHJhbV9vZmZzZXQ7CisJCQlibG9ja19kYXRhLnR5cGUgPSBTU1RfTUVNX0RSQU07CisJCQlicmVhazsKKwkJY2FzZSBTU1RfQllUX0NBQ0hFOgorCQkJYmxvY2tfZGF0YS5vZmZzZXQgPSBibG9jay0+cmFtX29mZnNldCArCisJCQkJCSAgICAoZHNwLT5hZGRyLmZ3X2V4dCAtIGRzcC0+YWRkci5scGUpOworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9DQUNIRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihkc3AtPmRldiwgIndyb25nIHJhbSB0eXBlIDB4JXggaW4gYmxvY2sweCV4XG4iLAorCQkJCWJsb2NrLT50eXBlLCBjb3VudCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJsb2NrX2RhdGEuc2l6ZSA9IGJsb2NrLT5zaXplOworCQlibG9ja19kYXRhLmRhdGFfdHlwZSA9IFNTVF9EQVRBX007CisJCWJsb2NrX2RhdGEuZGF0YSA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKTsKKworCQlzc3RfbW9kdWxlX2luc2VydF9maXhlZF9ibG9jayhtb2QsICZibG9ja19kYXRhKTsKKworCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BhcnNlX2Z3X2ltYWdlKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3QgZndfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IHNzdF9ieXRfZndfbW9kdWxlX2hlYWRlciAqbW9kdWxlOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKKwlpbnQgcmV0LCBjb3VudDsKKworCS8qIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhIHBvaW50ZXIgKi8KKwloZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKXNzdF9mdy0+ZG1hX2J1ZjsKKworCS8qIHZlcmlmeSBGVyAqLworCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0JZVF9GV19TSUdOLCA0KSAhPSAwKSB8fAorCSAgICAoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgeworCQkvKiBJbnZhbGlkIEZXIHNpZ25hdHVyZSAqLworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiSW52YWxpZCBGVyBzaWduL2ZpbGVzaXplIG1pc21hdGNoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkc3AtPmRldiwKKwkJImhlYWRlciBzaWduPSU0cyBzaXplPTB4JXggbW9kdWxlcz0weCV4IGZtdD0weCV4IHNpemU9JXp1XG4iLAorCQloZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5maWxlX3NpemUsIGhlYWRlci0+bW9kdWxlcywKKwkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKKworCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kbWFfYnVmICsgc2l6ZW9mKCpoZWFkZXIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGhlYWRlci0+bW9kdWxlczsgY291bnQrKykgeworCQkvKiBtb2R1bGUgKi8KKwkJcmV0ID0gc3N0X2J5dF9wYXJzZV9tb2R1bGUoZHNwLCBzc3RfZncsIG1vZHVsZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiaW52YWxpZCBtb2R1bGUgJWRcbiIsIGNvdW50KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbW9kdWxlID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSkgKyBtb2R1bGUtPm1vZF9zaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2R1bXBfc2hpbShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWludCBpOworCXU2NCByZWc7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDB4RjA7IGkgKz0gOCkgeworCQlyZWcgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgaSk7CisJCWlmIChyZWcpCisJCQlkZXZfZGJnKHNzdC0+ZGV2LCAic2hpbSAweCUyLjJ4IHZhbHVlIDB4JTE2LjE2bGx4XG4iLAorCQkJCWksIHJlZyk7CisJfQorCisJZm9yIChpID0gMHgwMDsgaSA8PSAweGZmOyBpICs9IDQpIHsKKwkJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBpKTsKKwkJaWYgKHJlZykKKwkJCWRldl9kYmcoc3N0LT5kZXYsICJwY2kgMHglMi4yeCB2YWx1ZSAweCU4Ljh4XG4iLAorCQkJCWksICh1MzIpcmVnKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzc3RfYnl0X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwl1NjQgaXNyeDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7CisKKwlpc3J4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JU1JYKTsKKwlpZiAoaXNyeCAmIFNTVF9JU1JYX0RPTkUpIHsKKwkJLyogQURTUCBoYXMgcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIHJlcXVlc3QgZnJvbSBJQSAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYLAorCQkJCQkJICAgIFNTVF9CWVRfSVBDWF9ET05FLCAwKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKwlpZiAoaXNyeCAmIFNTVF9CWVRfSVNSWF9SRVFVRVNUKSB7CisJCS8qIG1hc2sgbWVzc2FnZSByZXF1ZXN0IGZyb20gQURTUCBhbmQgZG8gcHJvY2Vzc2luZyBsYXRlciAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJCQkJICAgIFNTVF9CWVRfSU1SWF9SRVFVRVNULAorCQkJCQkJICAgIFNTVF9CWVRfSU1SWF9SRVFVRVNUKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCXNwaW5fdW5sb2NrKCZzc3QtPnNwaW5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWludCB0cmllcyA9IDEwOworCisJLyogcmVsZWFzZSBzdGFsbCBhbmQgd2FpdCB0byB1bnN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3N0LCBTU1RfQ1NSLCBTU1RfQllUX0NTUl9TVEFMTCwgMHgwKTsKKwl3aGlsZSAodHJpZXMtLSkgeworCQlpZiAoIShzc3RfZHNwX3NoaW1fcmVhZDY0KHNzdCwgU1NUX0NTUikgJgorCQkgICAgICBTU1RfQllUX0NTUl9QV0FJVE1PREUpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMDApOworCX0KKwlpZiAodHJpZXMgPCAwKSB7CisJCWRldl9lcnIoc3N0LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgRFNQXG4iKTsKKwkJc3N0X2J5dF9kdW1wX3NoaW0oc3N0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwkvKiBwdXQgRFNQIGludG8gcmVzZXQsIHNldCByZXNldCB2ZWN0b3IgYW5kIHN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQllUX0NTUl9SU1QgfCBTU1RfQllUX0NTUl9WRUNUT1JfU0VMIHwgU1NUX0JZVF9DU1JfU1RBTEwsCisJCVNTVF9CWVRfQ1NSX1JTVCB8IFNTVF9CWVRfQ1NSX1ZFQ1RPUl9TRUwgfCBTU1RfQllUX0NTUl9TVEFMTCk7CisKKwl1ZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsIFNTVF9CWVRfQ1NSX1JTVCwgMCk7Cit9CisKK3N0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24geworCXUzMiBzdGFydDsKKwl1MzIgZW5kOworCWludCBibG9ja3M7CisJZW51bSBzc3RfbWVtX3R5cGUgdHlwZTsKK307CisKKy8qIEJZVCB0ZXN0IHN0dWZmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiBieXRfcmVnaW9uW10gPSB7CisJezB4QzAwMDAsIDB4MTAwMDAwLCA4LCBTU1RfTUVNX0lSQU19LCAvKiBJLVNSQU0gLSA4ICogMzJrQiAqLworCXsweDEwMDAwMCwgMHgxNDAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTAgLSA4ICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBzc3RfYnl0X3Jlc291cmNlX21hcChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzc3QtPmFkZHIubHBlX2Jhc2UgPSBwZGF0YS0+bHBlX2Jhc2U7CisJc3N0LT5hZGRyLmxwZSA9IGlvcmVtYXAocGRhdGEtPmxwZV9iYXNlLCBwZGF0YS0+bHBlX3NpemUpOworCWlmICghc3N0LT5hZGRyLmxwZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBRFNQIFBDSSBNTUlPIGNvbmZpZyBzcGFjZSAqLworCXNzdC0+YWRkci5wY2lfY2ZnID0gaW9yZW1hcChwZGF0YS0+cGNpY2ZnX2Jhc2UsIHBkYXRhLT5wY2ljZmdfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIucGNpX2NmZykgeworCQlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTU1QgRXh0ZW5kZWQgRlcgYWxsb2NhdGlvbiAqLworCXNzdC0+YWRkci5md19leHQgPSBpb3JlbWFwKHBkYXRhLT5md19iYXNlLCBwZGF0YS0+Zndfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIuZndfZXh0KSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOworCQlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTU1QgU2hpbSAqLworCXNzdC0+YWRkci5zaGltID0gc3N0LT5hZGRyLmxwZSArIHNzdC0+YWRkci5zaGltX29mZnNldDsKKworCXNzdF9kc3BfbWFpbGJveF9pbml0KHNzdCwgU1NUX0JZVF9NQUlMQk9YX09GRlNFVCArIDB4MjA0LAorCQkJICAgICBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFLAorCQkJICAgICBTU1RfQllUX01BSUxCT1hfT0ZGU0VULAorCQkJICAgICBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFKTsKKworCXNzdC0+aXJxID0gcGRhdGEtPmlycTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uICpyZWdpb247CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXQgPSAtRU5PREVWLCBpLCBqLCByZWdpb25fY291bnQ7CisJdTMyIG9mZnNldCwgc2l6ZTsKKworCWRldiA9IHNzdC0+ZGV2OworCisJc3dpdGNoIChzc3QtPmlkKSB7CisJY2FzZSBTU1RfREVWX0lEX0JZVDoKKwkJcmVnaW9uID0gYnl0X3JlZ2lvbjsKKwkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRShieXRfcmVnaW9uKTsKKwkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX0JZVF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLmRyYW1fb2Zmc2V0ID0gU1NUX0JZVF9EUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0JZVF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9ieXRfcmVzb3VyY2VfbWFwKHNzdCwgcGRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogc2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBleHRlbmRlZCBmaXJtd2FyZSBibG9jayBpbiB0aGUgZmlyc3QKKwkgKiA0IGJ5dGVzIG9mIHRoZSBtYWlsYm94CisJICovCisJbWVtY3B5X3RvaW8oc3N0LT5hZGRyLmxwZSArIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCisJICAgICAgICZwZGF0YS0+ZndfYmFzZSwgc2l6ZW9mKHUzMikpOworCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBlbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0lNUlgsIDB4MywgMHgwKTsKKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9JTVJELCAweDMsIDB4MCk7CisKKwkvKiByZWdpc3RlciBEU1AgbWVtb3J5IGJsb2NrcyAtIGlkZWFsbHkgd2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gQUNQSSAqLworCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgeworCQlvZmZzZXQgPSByZWdpb25baV0uc3RhcnQ7CisJCXNpemUgPSAocmVnaW9uW2ldLmVuZCAtIHJlZ2lvbltpXS5zdGFydCkgLyByZWdpb25baV0uYmxvY2tzOworCisJCS8qIHJlZ2lzdGVyIGluZGl2aWR1YWwgbWVtb3J5IGJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgcmVnaW9uW2ldLmJsb2NrczsgaisrKSB7CisJCQlzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHNzdCwgb2Zmc2V0LCBzaXplLAorCQkJCQkgICAgICAgcmVnaW9uW2ldLnR5cGUsIE5VTEwsIGosIHNzdCk7CisJCQlvZmZzZXQgKz0gc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3RfbWVtX2Jsb2NrX3VucmVnaXN0ZXJfYWxsKHNzdCk7CisJaW91bm1hcChzc3QtPmFkZHIubHBlKTsKKwlpb3VubWFwKHNzdC0+YWRkci5wY2lfY2ZnKTsKKwlpb3VubWFwKHNzdC0+YWRkci5md19leHQpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBzc3RfYnl0X29wcyA9IHsKKwkucmVzZXQgPSBzc3RfYnl0X3Jlc2V0LAorCS5ib290ID0gc3N0X2J5dF9ib290LAorCS53cml0ZSA9IHNzdF9zaGltMzJfd3JpdGUsCisJLnJlYWQgPSBzc3Rfc2hpbTMyX3JlYWQsCisJLndyaXRlNjQgPSBzc3Rfc2hpbTMyX3dyaXRlNjQsCisJLnJlYWQ2NCA9IHNzdF9zaGltMzJfcmVhZDY0LAorCS5yYW1fcmVhZCA9IHNzdF9tZW1jcHlfZnJvbWlvXzMyLAorCS5yYW1fd3JpdGUgPSBzc3RfbWVtY3B5X3RvaW9fMzIsCisJLmlycV9oYW5kbGVyID0gc3N0X2J5dF9pcnEsCisJLmluaXQgPSBzc3RfYnl0X2luaXQsCisJLmZyZWUgPSBzc3RfYnl0X2ZyZWUsCisJLnBhcnNlX2Z3ID0gc3N0X2J5dF9wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGVhZWVlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBJUEMgU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAqLworI2RlZmluZSBJUENfVElNRU9VVF9NU0VDUwkzMDAKKyNkZWZpbmUgSVBDX0JPT1RfTVNFQ1MJCTIwMAorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorCisvKiBJUEMgaGVhZGVyIGJpdHMgKi8KKyNkZWZpbmUgSVBDX0hFQURFUl9NU0dfSURfTUFTSwkweGZmCisjZGVmaW5lIElQQ19IRUFERVJfTVNHX0lEKHgpCSgoeCkgJiBJUENfSEVBREVSX01TR19JRF9NQVNLKQorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRF9TSElGVAk4CisjZGVmaW5lIElQQ19IRUFERVJfU1RSX0lEX01BU0sJMHgxZgorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRCh4KQkoKCh4KSAmIDB4MWYpIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKQorI2RlZmluZSBJUENfSEVBREVSX0xBUkdFX1NISUZUCTEzCisjZGVmaW5lIElQQ19IRUFERVJfTEFSR0UoeCkJKCgoeCkgJiAweDEpIDw8IElQQ19IRUFERVJfTEFSR0VfU0hJRlQpCisjZGVmaW5lIElQQ19IRUFERVJfREFUQV9TSElGVAkxNgorI2RlZmluZSBJUENfSEVBREVSX0RBVEFfTUFTSwkweDNmZmYKKyNkZWZpbmUgSVBDX0hFQURFUl9EQVRBKHgpCSgoKHgpICYgMHgzZmZmKSA8PCBJUENfSEVBREVSX0RBVEFfU0hJRlQpCisKKy8qIG1hc2sgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIG5vdGlmaWNhdGlvbiBhbmQgcmVwbHkgbWVzc2FnZSAqLworI2RlZmluZSBJUENfTk9USUZJQ0FUSU9OCSgweDEgPDwgNykKKworLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCisjZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0JMHgyMAorI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0JMHgyMQorI2RlZmluZSBJUENfSUFfUEFVU0VfU1RSRUFNCTB4MjQKKyNkZWZpbmUgSVBDX0lBX1JFU1VNRV9TVFJFQU0JMHgyNQorI2RlZmluZSBJUENfSUFfRFJPUF9TVFJFQU0JMHgyNgorI2RlZmluZSBJUENfSUFfU1RBUlRfU1RSRUFNCTB4MzAKKworLyogbm90aWZpY2F0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lIElQQ19JQV9GV19JTklUX0NNUExUCTB4ODEKKyNkZWZpbmUgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRAkweDk3CisKKy8qIElQQyBtZXNzYWdlcyBiZXR3ZWVuIGhvc3QgYW5kIEFEU1AgKi8KK3N0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyB7CisJdTMyIGFkZHI7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSB7CisJdTggY29kZWNfdHlwZTsKKwl1OCBzdHJfdHlwZTsKKwl1OCBvcGVyYXRpb247CisJdTggcHJvdGVjdGVkX3N0cjsKKwl1OCB0aW1lX3Nsb3RzOworCXU4IHJlc2VydmVkOworCXUxNiByZXN1bHQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHsKKwl1OCBudW1fY2hhbjsKKwl1OCBwY21fd2Rfc3o7CisJdTggdXNlX29mZmxvYWRfcGF0aDsKKwl1OCByZXNlcnZlZDsKKwl1MzIgc2ZyZXE7CisJdTggY2hhbm5lbF9tYXBbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9mcmFtZXNfaW5mbyB7CisJdTE2IG51bV9lbnRyaWVzOworCXUxNiByc3J2ZDsKKwl1MzIgZnJhZ19zaXplOworCXN0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyByaW5nX2J1Zl9pbmZvWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7CisJc3RydWN0IHNzdF9ieXRfZnJhbWVzX2luZm8gZnJhbWVfaW5mbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X2FsbG9jX3Jlc3BvbnNlIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwl1OCByZXNlcnZlZFs4OF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdGFydF9zdHJlYW1fcGFyYW1zIHsKKwl1MzIgYnl0ZV9vZmZzZXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgeworCXU2NCByaW5nX2J1ZmZlcl9jb3VudGVyOworCXU2NCBoYXJkd2FyZV9jb3VudGVyOworCXU2NCBmcmFtZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfY29waWVkOworCXUzMiBzYW1wbGluZ19mcmVxdWVuY3k7CisJdTMyIGNoYW5uZWxfcGVha1s4XTsKK30gX19wYWNrZWQ7CisKKy8qIGRyaXZlciBpbnRlcm5hbCBJUEMgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpcGNfbWVzc2FnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBoZWFkZXI7CisKKwkvKiBkaXJlY3Rpb24gd3J0IGhvc3QgQ1BVICovCisJY2hhciB0eF9kYXRhW1NTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkVdOworCXNpemVfdCB0eF9zaXplOworCWNoYXIgcnhfZGF0YVtTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFXTsKKwlzaXplX3Qgcnhfc2l6ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCWJvb2wgY29tcGxldGU7CisJYm9vbCB3YWl0OworCWludCBlcnJubzsKK307CisKK3N0cnVjdCBzc3RfYnl0X3N0cmVhbTsKK3N0cnVjdCBzc3RfYnl0OworCisvKiBzdHJlYW0gaW5mb21hdGlvbiAqLworc3RydWN0IHNzdF9ieXRfc3RyZWFtIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKKwkvKiBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgcmVwbHk7CisKKwkvKiBydW50aW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0OworCWludCBzdHJfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKK307CisKKy8qIFNTVCBCYXl0cmFpbCBJUEMgZGF0YSAqLworc3RydWN0IHNzdF9ieXQgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCisJLyogc3RyZWFtICovCisJc3RydWN0IGxpc3RfaGVhZCBzdHJlYW1fbGlzdDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCisJLyogSVBDIG1lc3NhZ2luZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBlbXB0eV9saXN0OworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfdHhxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHhfdGhyZWFkOworCXN0cnVjdCBrdGhyZWFkX3dvcmtlciBrd29ya2VyOworCXN0cnVjdCBrdGhyZWFkX3dvcmsga3dvcms7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7Cit9OworCitzdGF0aWMgaW5saW5lIHU2NCBzc3RfYnl0X2hlYWRlcihpbnQgbXNnX2lkLCBpbnQgZGF0YSwgYm9vbCBsYXJnZSwgaW50IHN0cl9pZCkKK3sKKwl1NjQgaGVhZGVyOworCisJaGVhZGVyID0gSVBDX0hFQURFUl9NU0dfSUQobXNnX2lkKSB8CisJCSBJUENfSEVBREVSX1NUUl9JRChzdHJfaWQpIHwKKwkJIElQQ19IRUFERVJfTEFSR0UobGFyZ2UpIHwKKwkJIElQQ19IRUFERVJfREFUQShkYXRhKSB8CisJCSBTU1RfQllUX0lQQ1hfQlVTWTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX21zZ19pZCh1NjQgaGVhZGVyKQoreworCXJldHVybiBoZWFkZXIgJiBJUENfSEVBREVSX01TR19JRF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNzdF9ieXRfaGVhZGVyX3N0cl9pZCh1NjQgaGVhZGVyKQoreworCXJldHVybiAoaGVhZGVyID4+IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKSAmIElQQ19IRUFERVJfU1RSX0lEX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX2RhdGEodTY0IGhlYWRlcikKK3sKKwlyZXR1cm4gKGhlYWRlciA+PiBJUENfSEVBREVSX0RBVEFfU0hJRlQpICYgSVBDX0hFQURFUl9EQVRBX01BU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfZ2V0X3N0cmVhbShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCQkJIGludCBzdHJlYW1faWQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmJ5dC0+c3RyZWFtX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHN0cmVhbS0+c3RyX2lkID09IHN0cmVhbV9pZCkKKwkJCXJldHVybiBzdHJlYW07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfaXBjX3NoaW1fZGJnKHN0cnVjdCBzc3RfYnl0ICpieXQsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOworCXU2NCBpc3IsIGlwY2QsIGltcngsIGlwY3g7CisKKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOworCWlwY2QgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCWltcnggPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2VycihieXQtPmRldiwKKwkJImlwYzogLS0lcy0tIGlwY3ggMHglbGx4IGlzciAweCVsbHggaXBjZCAweCVsbHggaW1yeCAweCVsbHhcbiIsCisJCXRleHQsIGlwY3gsIGlzciwgaXBjZCwgaW1yeCk7Cit9CisKKy8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpzc3RfYnl0X21zZ19nZXRfZW1wdHkoc3RydWN0IHNzdF9ieXQgKmJ5dCkKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZyA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmJ5dC0+ZW1wdHlfbGlzdCkpIHsKKwkJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmYnl0LT5lbXB0eV9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2lwY190eF9tc2dzKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3N0X2J5dCwga3dvcmspOworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCXU2NCBpcGN4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmJ5dC0+dHhfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB0aGUgRFNQIGlzIGJ1c3kgd2Ugd2lsbCBUWCBtZXNzYWdlcyBhZnRlciBJUlEgKi8KKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gpOworCWlmIChpcGN4ICYgU1NUX0JZVF9JUENYX0JVU1kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZieXQtPnR4X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwgbGlzdCk7CisKKwlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmJ5dC0+cnhfbGlzdCk7CisKKwkvKiBzZW5kIHRoZSBtZXNzYWdlICovCisJaWYgKG1zZy0+aGVhZGVyICYgSVBDX0hFQURFUl9MQVJHRSh0cnVlKSkKKwkJc3N0X2RzcF9vdXRib3hfd3JpdGUoYnl0LT5kc3AsIG1zZy0+dHhfZGF0YSwgbXNnLT50eF9zaXplKTsKKwlzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gsIG1zZy0+aGVhZGVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2J5dF90eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCQkJCSBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwltc2ctPmNvbXBsZXRlID0gdHJ1ZTsKKworCWlmICghbXNnLT53YWl0KQorCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOworCWVsc2UKKwkJd2FrZV91cCgmbXNnLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF90eF93YWl0X2RvbmUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2csCisJCQkJdm9pZCAqcnhfZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiB3YWl0IGZvciBEU1AgY29tcGxldGlvbiAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCQlzc3RfYnl0X2lwY19zaGltX2RiZyhieXQsICJtZXNzYWdlIHRpbWVvdXQiKTsKKworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisKKwkJLyogY29weSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERTUCAqLworCQlpZiAobXNnLT5yeF9zaXplKQorCQkJbWVtY3B5KHJ4X2RhdGEsIG1zZy0+cnhfZGF0YSwgbXNnLT5yeF9zaXplKTsKKwkJcmV0ID0gbXNnLT5lcnJubzsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9pcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCSAgdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzLAorCQkJCSAgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJbXNnID0gc3N0X2J5dF9tc2dfZ2V0X2VtcHR5KGJ5dCk7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJaWYgKHR4X2J5dGVzKSB7CisJCS8qIG1zZyBjb250ZW50ID0gbG93ZXIgMzItYml0IG9mIHRoZSBoZWFkZXIgKyBkYXRhICovCisJCSoodTMyICopbXNnLT50eF9kYXRhID0gKHUzMikoaGVhZGVyICYgKHUzMiktMSk7CisJCW1lbWNweShtc2ctPnR4X2RhdGEgKyBzaXplb2YodTMyKSwgdHhfZGF0YSwgdHhfYnl0ZXMpOworCQltc2ctPnR4X3NpemUgKz0gc2l6ZW9mKHUzMik7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmYnl0LT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZieXQtPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHNzdF9ieXRfdHhfd2FpdF9kb25lKGJ5dCwgbXNnLCByeF9kYXRhKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzc3RfYnl0X2lwY190eF9tc2dfd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCQkgIHZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywKKwkJCQkJICB2b2lkICpyeF9kYXRhLCBzaXplX3QgcnhfYnl0ZXMpCit7CisJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21lc3NhZ2UoYnl0LCBoZWFkZXIsIHR4X2RhdGEsIHR4X2J5dGVzLAorCQkJCSAgICAgIHJ4X2RhdGEsIHJ4X2J5dGVzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3N0X2J5dF9pcGNfdHhfbXNnX25vd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCQkJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQoreworCXJldHVybiBzc3RfYnl0X2lwY190eF9tZXNzYWdlKGJ5dCwgaGVhZGVyLCB0eF9kYXRhLCB0eF9ieXRlcywKKwkJCQkgICAgICBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqc3N0X2J5dF9yZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCQkJICB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTCwgKl9tc2c7CisJdTY0IG1hc2s7CisKKwkvKiBtYXRjaCByZXBseSB0byBtZXNzYWdlIHNlbnQgYmFzZWQgb24gbXNnIGFuZCBzdHJlYW0gSURzICovCisJbWFzayA9IElQQ19IRUFERVJfTVNHX0lEX01BU0sgfAorCSAgICAgICBJUENfSEVBREVSX1NUUl9JRF9NQVNLIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUOworCWhlYWRlciAmPSBtYXNrOworCisJaWYgKGxpc3RfZW1wdHkoJmJ5dC0+cnhfbGlzdCkpIHsKKwkJZGV2X2VycihieXQtPmRldiwKKwkJCSJpcGM6IHJ4IGxpc3QgaXMgZW1wdHkgYnV0IHJlY2VpdmVkIDB4JWxseFxuIiwgaGVhZGVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShfbXNnLCAmYnl0LT5yeF9saXN0LCBsaXN0KSB7CisJCWlmICgoX21zZy0+aGVhZGVyICYgbWFzaykgPT0gaGVhZGVyKSB7CisJCQltc2cgPSBfbXNnOworCQkJYnJlYWs7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X3N0cmVhbV91cGRhdGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisJdTY0IGhlYWRlciA9IG1zZy0+aGVhZGVyOworCXU4IHN0cmVhbV9pZCA9IHNzdF9ieXRfaGVhZGVyX3N0cl9pZChoZWFkZXIpOworCXU4IHN0cmVhbV9tc2cgPSBzc3RfYnl0X2hlYWRlcl9tc2dfaWQoaGVhZGVyKTsKKworCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19JQV9EUk9QX1NUUkVBTToKKwljYXNlIElQQ19JQV9QQVVTRV9TVFJFQU06CisJY2FzZSBJUENfSUFfRlJFRV9TVFJFQU06CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIElQQ19JQV9TVEFSVF9TVFJFQU06CisJY2FzZSBJUENfSUFfUkVTVU1FX1NUUkVBTToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcHJvY2Vzc19yZXBseShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJbXNnID0gc3N0X2J5dF9yZXBseV9maW5kX21zZyhieXQsIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmIChoZWFkZXIgJiBJUENfSEVBREVSX0xBUkdFKHRydWUpKSB7CisJCW1zZy0+cnhfc2l6ZSA9IHNzdF9ieXRfaGVhZGVyX2RhdGEoaGVhZGVyKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGJ5dC0+ZHNwLCBtc2ctPnJ4X2RhdGEsIG1zZy0+cnhfc2l6ZSk7CisJfQorCisJLyogdXBkYXRlIGFueSBzdHJlYW0gc3RhdGVzICovCisJc3N0X2J5dF9zdHJlYW1fdXBkYXRlKGJ5dCwgbXNnKTsKKworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCS8qIHdha2UgdXAgKi8KKwlzc3RfYnl0X3R4X21zZ19yZXBseV9jb21wbGV0ZShieXQsIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9md19yZWFkeShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCWRldl9kYmcoYnl0LT5kZXYsICJpcGM6IERTUCBpcyByZWFkeSAweCVsbFhcbiIsIGhlYWRlcik7CisKKwlieXQtPmJvb3RfY29tcGxldGUgPSB0cnVlOworCXdha2VfdXAoJmJ5dC0+Ym9vdF93YWl0KTsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKKwl1NjQgaGVhZGVyOworCXU4IG1zZ19pZCwgc3RyZWFtX2lkOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJbXNnX2lkID0gc3N0X2J5dF9oZWFkZXJfbXNnX2lkKGhlYWRlcik7CisKKwlzd2l0Y2ggKG1zZ19pZCkgeworCWNhc2UgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRDoKKwkJc3RyZWFtX2lkID0gc3N0X2J5dF9oZWFkZXJfc3RyX2lkKGhlYWRlcik7CisJCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJCWlmIChzdHJlYW0gJiYgc3RyZWFtLT5ydW5uaW5nICYmIHN0cmVhbS0+bm90aWZ5X3Bvc2l0aW9uKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQkJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24oc3RyZWFtLCBzdHJlYW0tPnBkYXRhKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBDX0lBX0ZXX0lOSVRfQ01QTFQ6CisJCXNzdF9ieXRfZndfcmVhZHkoYnl0LCBoZWFkZXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNzdF9ieXRfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gc3N0X2RzcF9nZXRfdGhyZWFkX2NvbnRleHQoc3N0KTsKKwl1NjQgaGVhZGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJaGVhZGVyID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKKwlpZiAoaGVhZGVyICYgU1NUX0JZVF9JUENEX0JVU1kpIHsKKwkJaWYgKGhlYWRlciAmIElQQ19OT1RJRklDQVRJT04pIHsKKwkJCS8qIG1lc3NhZ2UgZnJvbSBBRFNQICovCisJCQlzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGJ5dCwgJmZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlcGx5IGZyb20gQURTUCAqLworCQkJc3N0X2J5dF9wcm9jZXNzX3JlcGx5KGJ5dCwgaGVhZGVyKTsKKwkJfQorCQkvKgorCQkgKiBjbGVhciBJUENEIEJVU1kgYml0IGFuZCBzZXQgRE9ORSBiaXQuIFRlbGwgRFNQIHdlIGhhdmUKKwkJICogcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIGFuZCBjYW4gYWNjZXB0IG5ldy4gQ2xlYXIgZGF0YSBwYXJ0CisJCSAqIG9mIHRoZSBoZWFkZXIKKwkJICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QsCisJCQlTU1RfQllUX0lQQ0RfRE9ORSB8IFNTVF9CWVRfSVBDRF9CVVNZIHwKKwkJCUlQQ19IRUFERVJfREFUQShJUENfSEVBREVSX0RBVEFfTUFTSyksCisJCQlTU1RfQllUX0lQQ0RfRE9ORSk7CisJCS8qIHVubWFzayBtZXNzYWdlIHJlcXVlc3QgaW50ZXJydXB0cyAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0JZVF9JTVJYX1JFUVVFU1QsIDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIGNvbnRpbnVlIHRvIHNlbmQgYW55IHJlbWFpbmluZyBtZXNzYWdlcy4uLiAqLworCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIHN0cmVhbSBBUEkgKi8KK3N0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3N0X2J5dF9zdHJlYW1fbmV3KHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCBpZCwKKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2FkZCgmc3RyZWFtLT5ub2RlLCAmYnl0LT5zdHJlYW1fbGlzdCk7CisJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24gPSBub3RpZnlfcG9zaXRpb247CisJc3RyZWFtLT5wZGF0YSA9IGRhdGE7CisJc3RyZWFtLT5ieXQgPSBieXQ7CisJc3RyZWFtLT5zdHJfaWQgPSBpZDsKKworCXJldHVybiBzdHJlYW07Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICBpbnQgYml0cykKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5wY21fd2Rfc3ogPSBiaXRzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKQoreworCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuID0gY2hhbm5lbHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSA9IHJhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qIHN0cmVhbSBzb25maWd1cmF0aW9uICovCitpbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pCit7CisJc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5zdHJfdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLnRpbWVfc2xvdHMgPSAweGM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKQoreworCXN0cmVhbS0+cmVxdWVzdC5mcmFtZV9pbmZvLm51bV9lbnRyaWVzID0gMTsKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgPSBidWZmZXJfYWRkcjsKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLnNpemUgPSBidWZmZXJfc2l6ZTsKKwkvKiBjYWxjdWxhdGUgYnl0ZXMgcGVyIDQgbXMgZnJhZ21lbnQgKi8KKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5mcmFnX3NpemUgPQorCQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSAqCisJCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuICoKKwkJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMucGNtX3dkX3N6IC8gOCAqCisJCTQgLyAxMDAwOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXN0cnVjdCBzc3RfYnl0X2FsbG9jX3BhcmFtcyAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgKnJlcGx5ID0gJnN0cmVhbS0+cmVwbHk7CisJdTY0IGhlYWRlcjsKKwlpbnQgcmV0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0FMTE9DX1NUUkVBTSwKKwkJCQlzaXplb2YoKnN0cl9yZXEpICsgc2l6ZW9mKHUzMiksCisJCQkJdHJ1ZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAorCQkJCSAgICAgIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3Igc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9mcmVlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXU2NCBoZWFkZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCWdvdG8gb3V0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0ZSRUVfU1RSRUFNLCAwLCBmYWxzZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBmcmVlIHN0cmVhbSAlZCBmYWlsZWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSBmYWxzZTsKK291dDoKKwlsaXN0X2RlbCgmc3RyZWFtLT5ub2RlKTsKKwlrZnJlZShzdHJlYW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCB0eXBlLAorCQkJCSAgICAgaW50IHN0cmVhbV9pZCwgaW50IHdhaXQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RhcnRfc3RyZWFtX3BhcmFtcyBzdGFydF9zdHJlYW07CisJdTY0IGhlYWRlcjsKKwl2b2lkICp0eF9tc2cgPSBOVUxMOworCXNpemVfdCBzaXplID0gMDsKKworCWlmICh0eXBlICE9IElQQ19JQV9TVEFSVF9TVFJFQU0pIHsKKwkJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIodHlwZSwgMCwgZmFsc2UsIHN0cmVhbV9pZCk7CisJfSBlbHNlIHsKKwkJc3RhcnRfc3RyZWFtLmJ5dGVfb2Zmc2V0ID0gMDsKKwkJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX1NUQVJUX1NUUkVBTSwKKwkJCQkJc2l6ZW9mKHN0YXJ0X3N0cmVhbSkgKyBzaXplb2YodTMyKSwKKwkJCQkJdHJ1ZSwgc3RyZWFtX2lkKTsKKwkJdHhfbXNnID0gJnN0YXJ0X3N0cmVhbTsKKwkJc2l6ZSA9IHNpemVvZihzdGFydF9zdHJlYW0pOworCX0KKworCWlmICh3YWl0KQorCQlyZXR1cm4gc3N0X2J5dF9pcGNfdHhfbXNnX3dhaXQoYnl0LCBoZWFkZXIsCisJCQkJCSAgICAgICB0eF9tc2csIHNpemUsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21zZ19ub3dhaXQoYnl0LCBoZWFkZXIsIHR4X21zZywgc2l6ZSk7Cit9CisKKy8qIHN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9ieXRfc3RyZWFtX3N0YXJ0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1NUQVJUX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gc3RhcnQgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3N0b3Aoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pCit7CisJaW50IHJldDsKKworCS8qIGRvbid0IHN0b3Agc3RyZWFtcyB0aGF0IGFyZSBub3QgY29tbWl0ZWQgKi8KKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9EUk9QX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gc3RvcCBzdHJlYW0gJWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1BBVVNFX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9SRVNVTUVfU1RSRUFNLAorCQkJCQlzdHJlYW0tPnN0cl9pZCwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIGZhaWxlZCB0byByZXN1bWUgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJICAgICBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgZndfdHN0YW1wOworCXU4IHN0cl9pZCA9IHN0cmVhbS0+c3RyX2lkOworCXUzMiB0c3RhbXBfb2Zmc2V0OworCisJdHN0YW1wX29mZnNldCA9IFNTVF9CWVRfVElNRVNUQU1QX09GRlNFVCArIHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApOworCW1lbWNweV9mcm9taW8oJmZ3X3RzdGFtcCwKKwkJICAgICAgc3N0LT5hZGRyLmxwZSArIHRzdGFtcF9vZmZzZXQsIHNpemVvZihmd190c3RhbXApKTsKKworCXJldHVybiBkb19kaXYoZndfdHN0YW1wLnJpbmdfYnVmZmVyX2NvdW50ZXIsIGJ1ZmZlcl9zaXplKTsKK30KKworc3RhdGljIGludCBtc2dfZW1wdHlfbGlzdF9pbml0KHN0cnVjdCBzc3RfYnl0ICpieXQpCit7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisJaW50IGk7CisKKwlieXQtPm1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpICogSVBDX0VNUFRZX0xJU1RfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ5dC0+bXNnID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IElQQ19FTVBUWV9MSVNUX1NJWkU7IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZieXQtPm1zZ1tpXS53YWl0cSk7CisJCWxpc3RfYWRkKCZieXQtPm1zZ1tpXS5saXN0LCAmYnl0LT5lbXB0eV9saXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNzdF9kc3AgKnNzdF9ieXRfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0KQoreworCXJldHVybiBieXQtPmRzcDsKK30KKworc3RhdGljIHN0cnVjdCBzc3RfZHNwX2RldmljZSBieXRfZGV2ID0geworCS50aHJlYWQgPSBzc3RfYnl0X2lycV90aHJlYWQsCisJLm9wcyA9ICZzc3RfYnl0X29wcywKK307CisKK2ludCBzc3RfYnl0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dDsKKwlzdHJ1Y3Qgc3N0X2Z3ICpieXRfc3N0X2Z3OworCWludCBlcnI7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2luZyBCeXQgRFNQIElQQ1xuIik7CisKKwlieXQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmJ5dCksIEdGUF9LRVJORUwpOworCWlmIChieXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlieXQtPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmYnl0LT5zdHJlYW1fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+dHhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+cnhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+ZW1wdHlfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYnl0LT5ib290X3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ5dC0+d2FpdF90eHEpOworCisJZXJyID0gbXNnX2VtcHR5X2xpc3RfaW5pdChieXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHN0YXJ0IHRoZSBJUEMgbWVzc2FnZSB0aHJlYWQgKi8KKwlpbml0X2t0aHJlYWRfd29ya2VyKCZieXQtPmt3b3JrZXIpOworCWJ5dC0+dHhfdGhyZWFkID0ga3RocmVhZF9ydW4oa3RocmVhZF93b3JrZXJfZm4sCisJCQkJICAgICAmYnl0LT5rd29ya2VyLAorCQkJCSAgICAgZGV2X25hbWUoYnl0LT5kZXYpKTsKKwlpZiAoSVNfRVJSKGJ5dC0+dHhfdGhyZWFkKSkgeworCQllcnIgPSBQVFJfRVJSKGJ5dC0+dHhfdGhyZWFkKTsKKwkJZGV2X2VycihieXQtPmRldiwgImVycm9yIGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tc2c7CisJfQorCWluaXRfa3RocmVhZF93b3JrKCZieXQtPmt3b3JrLCBzc3RfYnl0X2lwY190eF9tc2dzKTsKKworCWJ5dF9kZXYudGhyZWFkX2NvbnRleHQgPSBieXQ7CisKKwkvKiBpbml0IFNTVCBzaGltICovCisJYnl0LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZieXRfZGV2LCBwZGF0YSk7CisJaWYgKGJ5dC0+ZHNwID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZV9tc2c7CisJfQorCisJLyoga2VlcCB0aGUgRFNQIGluIHJlc2V0IHN0YXRlIGZvciBiYXNlIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKKworCWJ5dF9zc3RfZncgPSBzc3RfZndfbmV3KGJ5dC0+ZHNwLCBwZGF0YS0+ZncsIGJ5dCk7CisJaWYgKGJ5dF9zc3RfZncgID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2VycjsKKwl9CisKKwkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCisJc3N0X2RzcF9ib290KGJ5dC0+ZHNwKTsKKwllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYnl0LT5ib290X3dhaXQsIGJ5dC0+Ym9vdF9jb21wbGV0ZSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSAtRUlPOworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJZ290byBib290X2VycjsKKwl9CisKKwlwZGF0YS0+ZHNwID0gYnl0OworCisJcmV0dXJuIDA7CisKK2Jvb3RfZXJyOgorCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCXNzdF9md19mcmVlKGJ5dF9zc3RfZncpOworZndfZXJyOgorCXNzdF9kc3BfZnJlZShieXQtPmRzcCk7CitlcnJfZnJlZV9tc2c6CisJa2ZyZWUoYnl0LT5tc2cpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9ieXRfZHNwX2luaXQpOworCit2b2lkIHNzdF9ieXRfZHNwX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmRzcDsKKworCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCXNzdF9md19mcmVlX2FsbChieXQtPmRzcCk7CisJc3N0X2RzcF9mcmVlKGJ5dC0+ZHNwKTsKKwlrZnJlZShieXQtPm1zZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF9mcmVlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYmF5dHJhaWwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzJiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBJbnRlbCBCYXl0cmFpbCBTU1QgSVBDIFN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TU1RfQllUX0lQQ19ICisjZGVmaW5lIF9fU1NUX0JZVF9JUENfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHNzdF9ieXQ7CitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW07CitzdHJ1Y3Qgc3N0X3BkYXRhOworZXh0ZXJuIHN0cnVjdCBzc3Rfb3BzIHNzdF9ieXRfb3BzOworCisKKyNkZWZpbmUgU1NUX0JZVF9NQUlMQk9YX09GRlNFVAkJMHgxNDQwMDAKKyNkZWZpbmUgU1NUX0JZVF9USU1FU1RBTVBfT0ZGU0VUCShTU1RfQllUX01BSUxCT1hfT0ZGU0VUICsgMHg4MDApCisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTIwMAorCisvKiBzdHJlYW0gQVBJICovCitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBpbnQgaWQsCisJdWludDMyX3QgKCpnZXRfd3JpdGVfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLAorCQkJCSAgICAgICB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKTsKKworLyogc3RyZWFtIGNvbmZpZ3VyYXRpb24gKi8KK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICBpbnQgYml0cyk7CitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKTsKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pOworaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKTsKK2ludCBzc3RfYnl0X3N0cmVhbV9jb21taXQoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworaW50IHNzdF9ieXRfc3RyZWFtX2ZyZWUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworCisvKiBzdHJlYW0gQUxTQSB0cmlnZ2VyIG9wZXJhdGlvbnMgKi8KK2ludCBzc3RfYnl0X3N0cmVhbV9zdGFydChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fc3RvcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworaW50IHNzdF9ieXRfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CisKK2ludCBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCSAgICAgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIGludCBidWZmZXJfc2l6ZSk7CisKKy8qIGluaXQgKi8KK2ludCBzc3RfYnl0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfYnl0X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOworc3RydWN0IHNzdF9kc3AgKnNzdF9ieXRfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEwMWYzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBQQ00gU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKworI2RlZmluZSBCWVRfUENNX0NPVU5UCQkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfYnl0X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1JFU1VNRSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IDM4NCwKKwkucGVyaW9kX2J5dGVzX21heAk9IDQ4MDAwLAorCS5wZXJpb2RzX21pbgkJPSAyLAorCS5wZXJpb2RzX21heAkJPSAyNTAsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSA5NjAwMCwKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBQQ00gRFNQIHN0cmVhbSAqLworc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgeworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlciAqLworc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhIHsKKwkvKiBydW50aW1lIERTUCAqLworCXN0cnVjdCBzc3RfYnl0ICpieXQ7CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhIHBjbVtCWVRfUENNX0NPVU5UXTsKK307CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJdTMyIHJhdGUsIGJpdHM7CisJdTggY2hhbm5lbHM7CisJaW50IHJldCwgcGxheWJhY2sgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBod19wYXJhbXMsIHBjbV9kYXRhICVwXG4iLCBwY21fZGF0YSk7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV90eXBlKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCQkgIDEsIDEsICFwbGF5YmFjayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImZhaWxlZCB0byBzZXQgc3RyZWFtIGZvcm1hdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShieXQsIHBjbV9kYXRhLT5zdHJlYW0sIHJhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IHJhdGUgJWRcbiIsIHJhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWJpdHMgPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX3NldF9iaXRzKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgYml0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNvdWxkIG5vdCBzZXQgZm9ybWF0cyAlZFxuIiwKKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW5uZWxzID0gKHU4KShwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSAmIDB4Rik7CisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgY2hhbm5lbHMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IGNoYW5uZWxzICVkXG4iLAorCQkJcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihieXQsIHBjbV9kYXRhLT5zdHJlYW0sCisJCQkJICAgIHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hZGRyLAorCQkJCSAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJQQ006IGZhaWxlZCB0byBzZXQgRE1BIGJ1ZmZlciAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9jb21taXQoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBmYWlsZWQgc3RyZWFtIGNvbW1pdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IGh3X2ZyZWVcbiIpOworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiB0cmlnZ2VyICVkXG4iLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlzc3RfYnl0X3N0cmVhbV9zdGFydChieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXNzdF9ieXRfc3RyZWFtX3Jlc3VtZShieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNzdF9ieXRfc3RyZWFtX3N0b3AoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3N0X2J5dF9zdHJlYW1fcGF1c2UoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYnl0X25vdGlmeV9wb2ludGVyKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IGRhdGE7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY21fZGF0YS0+c3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXUzMiBwb3M7CisKKwlwb3MgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwKKwkJCSAgICAgIChydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciAlCisJCQkgICAgICAgcnVudGltZS0+YnVmZmVyX3NpemUpKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IEFwcCBwb2ludGVyICVkIGJ5dGVzXG4iLCBwb3MpOworCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfYnl0X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0OworCWludCBwb3M7CisKKwlwb3MgPSBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oYnl0LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJCSAgICAgICBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSk7CisJb2Zmc2V0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHBvcyk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBETUEgcG9pbnRlciAlenUgYnl0ZXNcbiIsCisJCWZyYW1lc190b19ieXRlcyhydW50aW1lLCAodTMyKW9mZnNldCkpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnRkKTsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IG9wZW5cbiIpOworCisJcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtydGQtPmNwdV9kYWktPmlkXTsKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCisJc25kX3NvY19wY21fc2V0X2RydmRhdGEocnRkLCBwY21fZGF0YSk7CisJcGNtX2RhdGEtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmc3N0X2J5dF9wY21faGFyZHdhcmUpOworCisJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9ieXRfc3RyZWFtX25ldyhieXQsIHJ0ZC0+Y3B1X2RhaS0+aWQgKyAxLAorCQkJCQkgICAgICBieXRfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKKwlpZiAocGNtX2RhdGEtPnN0cmVhbSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydGQpOworCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OworCWludCByZXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBjbG9zZVxuIik7CisKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2ZyZWUoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiRnJlZSBzdHJlYW0gZmFpbFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlwY21fZGF0YS0+c3RyZWFtID0gTlVMTDsKKworb3V0OgorCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogbW1hcFxuIik7CisJcmV0dXJuIHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIHZtYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X2J5dF9wY21fb3BzID0geworCS5vcGVuCQk9IHNzdF9ieXRfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNzdF9ieXRfcGNtX2Nsb3NlLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gc3N0X2J5dF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gc3N0X2J5dF9wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IHNzdF9ieXRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBzc3RfYnl0X3BjbV9wb2ludGVyLAorCS5tbWFwCQk9IHNzdF9ieXRfcGNtX21tYXAsCit9OworCitzdGF0aWMgdm9pZCBzc3RfYnl0X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXNpemVfdCBzaXplOworCWludCByZXQgPSAwOworCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChydGQtPmNhcmQtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtIHx8CisJICAgIHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgeworCQlzaXplID0gc3N0X2J5dF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKwkJcmV0ID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQkJCQkJICAgIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJCQkgICAgcnRkLT5jYXJkLT5kZXYsCisJCQkJCQkJICAgIHNpemUsIHNpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGJ5dF9kYWlzW10gPSB7CisJeworCQkubmFtZSAgPSAiRnJvbnQtY3B1LWRhaSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTeXN0ZW0gUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTWljMS1jcHUtZGFpIiwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQW5hbG9nIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGxhdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnByaXZfZGF0YTsKKwlpbnQgaTsKKworCWlmICghcGxhdF9kYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksCisJCQkJIEdGUF9LRVJORUwpOworCXByaXZfZGF0YS0+Ynl0ID0gcGxhdF9kYXRhLT5kc3A7CisJc25kX3NvY19wbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwbGF0Zm9ybSwgcHJpdl9kYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ5dF9kYWlzKTsgaSsrKQorCQltdXRleF9pbml0KCZwcml2X2RhdGEtPnBjbVtpXS5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGJ5dF9zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IHNzdF9ieXRfcGNtX3Byb2JlLAorCS5yZW1vdmUJCT0gc3N0X2J5dF9wY21fcmVtb3ZlLAorCS5vcHMJCT0gJnNzdF9ieXRfcGNtX29wcywKKwkucGNtX25ldwk9IHNzdF9ieXRfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBzc3RfYnl0X3BjbV9mcmVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgYnl0X2RhaV9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gImJ5dC1kYWkiLAorfTsKKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X2RzcF9pbml0KCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmYnl0X3NvY19wbGF0Zm9ybSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BsYXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmYnl0X2RhaV9jb21wb25lbnQsCisJCQkJCSBieXRfZGFpcywgQVJSQVlfU0laRShieXRfZGFpcykpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9jb21wOworCisJcmV0dXJuIDA7CisKK2Vycl9jb21wOgorCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKK2Vycl9wbGF0OgorCXNzdF9ieXRfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CisJc3N0X2J5dF9kc3BfZnJlZSgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9ieXRfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCisJLnByb2JlID0gc3N0X2J5dF9wY21fZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBzc3RfYnl0X3BjbV9kZXZfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X2J5dF9wY21fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFya2tvIE5pa3VsYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXl0cmFpbCBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmF5dHJhaWwtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZTgxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBJbnRlbCBTbWFydCBTb3VuZCBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19TT1VORF9TT0NfU1NUX0RTUF9QUklWX0gKKyNkZWZpbmUgX19TT1VORF9TT0NfU1NUX0RTUF9QUklWX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworc3RydWN0IHNzdF9tZW1fYmxvY2s7CitzdHJ1Y3Qgc3N0X21vZHVsZTsKK3N0cnVjdCBzc3RfZnc7CisKKy8qCisgKiBEU1AgT3BlcmF0aW9ucyBleHBvcnRlZCBieSBwbGF0Zm9ybSBBdWRpbyBEU1AgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X29wcyB7CisJLyogRFNQIGNvcmUgYm9vdCAvIHJlc2V0ICovCisJdm9pZCAoKmJvb3QpKHN0cnVjdCBzc3RfZHNwICopOworCXZvaWQgKCpyZXNldCkoc3RydWN0IHNzdF9kc3AgKik7CisKKwkvKiBTaGltIElPICovCisJdm9pZCAoKndyaXRlKSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7CisJdTMyICgqcmVhZCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKKwl2b2lkICgqd3JpdGU2NCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOworCXU2NCAoKnJlYWQ2NCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKKworCS8qIERTUCBJL0RSQU0gSU8gKi8KKwl2b2lkICgqcmFtX3JlYWQpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgICpkZXN0LCB2b2lkIF9faW9tZW0gKnNyYywKKwkJc2l6ZV90IGJ5dGVzKTsKKwl2b2lkICgqcmFtX3dyaXRlKShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywKKwkJc2l6ZV90IGJ5dGVzKTsKKworCXZvaWQgKCpkdW1wKShzdHJ1Y3Qgc3N0X2RzcCAqKTsKKworCS8qIElSUSBoYW5kbGVycyAqLworCWlycXJldHVybl90ICgqaXJxX2hhbmRsZXIpKGludCBpcnEsIHZvaWQgKmNvbnRleHQpOworCisJLyogU1NUIGluaXQgYW5kIGZyZWUgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSk7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisJLyogRlcgbW9kdWxlIHBhcnNlci9sb2FkZXIgKi8KKwlpbnQgKCpwYXJzZV9mdykoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgbWVtb3J5IG9mZnNldHMgYW5kIGFkZHJlc3Nlcy4KKyAqLworc3RydWN0IHNzdF9hZGRyIHsKKwl1MzIgbHBlX2Jhc2U7CisJdTMyIHNoaW1fb2Zmc2V0OworCXUzMiBpcmFtX29mZnNldDsKKwl1MzIgZHJhbV9vZmZzZXQ7CisJdm9pZCBfX2lvbWVtICpscGU7CisJdm9pZCBfX2lvbWVtICpzaGltOworCXZvaWQgX19pb21lbSAqcGNpX2NmZzsKKwl2b2lkIF9faW9tZW0gKmZ3X2V4dDsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgTWFpbGJveCBjb25maWd1cmF0aW9uLgorICovCitzdHJ1Y3Qgc3N0X21haWxib3ggeworCXZvaWQgX19pb21lbSAqaW5fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm91dF9iYXNlOworCXNpemVfdCBpbl9zaXplOworCXNpemVfdCBvdXRfc2l6ZTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgRmlybXdhcmUgZGF0YSB0eXBlcy4KKyAqLworZW51bSBzc3RfZGF0YV90eXBlIHsKKwlTU1RfREFUQV9NCT0gMCwgLyogbW9kdWxlIGJsb2NrIGRhdGEgKi8KKwlTU1RfREFUQV9QCT0gMSwgLyogcGVyaXN0YW50IGRhdGEgKHRleHQsIGRhdGEpICovCisJU1NUX0RBVEFfUwk9IDIsIC8qIHNjcmF0Y2ggZGF0YSAodXN1YWxseSBidWZmZXJzKSAqLworfTsKKworLyoKKyAqIEF1ZGlvIERTUCBtZW1vcnkgYmxvY2sgdHlwZXMuCisgKi8KK2VudW0gc3N0X21lbV90eXBlIHsKKwlTU1RfTUVNX0lSQU0gPSAwLAorCVNTVF9NRU1fRFJBTSA9IDEsCisJU1NUX01FTV9BTlkgID0gMiwKKwlTU1RfTUVNX0NBQ0hFPSAzLAorfTsKKworLyoKKyAqIEF1ZGlvIERTUCBHZW5lcmljIEZpcm13YXJlIEZpbGUuCisgKgorICogU1NUIEZpcm13YXJlIGZpbGVzIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gVGhpcyBnZW5lcmljIHN0cnVjdHVyZSBpcworICogdXNlZCB0byBtYW5hZ2UgZWFjaCBmaXJtd2FyZSBmaWxlIGFuZCBpdCdzIG1vZHVsZXMgcmVnYXJkbGVzcyBvZiBTU1QgZmlybXdhcmUKKyAqIHR5cGUuIEEgU1NUIGRyaXZlciBtYXkgbG9hZCBtdWx0aXBsZSBGVyBmaWxlcy4KKyAqLworc3RydWN0IHNzdF9mdyB7CisJc3RydWN0IHNzdF9kc3AgKmRzcDsKKworCS8qIGJhc2UgYWRkcmVzc2VzIG9mIEZXIGZpbGUgZGF0YSAqLworCWRtYV9hZGRyX3QgZG1hYmxlX2Z3X3BhZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGZ3IGRhdGEgKi8KKwl2b2lkICpkbWFfYnVmOwkJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBmdyBkYXRhICovCisJdTMyIHNpemU7CQkJLyogc2l6ZSBvZiBmdyBkYXRhICovCisKKwkvKiBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIERTUCBsaXN0IG9mIEZXICovCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsJLyogRlcgbGlzdCBvZiBtb2R1bGVzICovCisKKwl2b2lkICpwcml2YXRlOwkJCS8qIGNvcmUgZG9lc24ndCB0b3VjaCB0aGlzICovCit9OworCisvKgorICogQXVkaW8gRFNQIEdlbmVyaWMgTW9kdWxlIGRhdGEuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGRzZWNyaWJlIGFueSBzZWN0aW9ucyBvZiBwZXJzaXN0ZW50ICh0ZXh0IGFuZCBkYXRhKSBhbmQKKyAqIHNjcmF0Y2ggKGJ1ZmZlcnMpIG9mIG1vZHVsZSBkYXRhIGluIEFEU1AgbWVtb3J5IHNwYWNlLgorICovCitzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhIHsKKworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7CQkvKiBkZXN0aW5hdGlvbiBtZW1vcnkgdHlwZSAqLworCWVudW0gc3N0X2RhdGFfdHlwZSBkYXRhX3R5cGU7CS8qIHR5cGUgb2YgbW9kdWxlIGRhdGEgKi8KKworCXUzMiBzaXplOwkJLyogc2l6ZSBpbiBieXRlcyAqLworCXUzMiBvZmZzZXQ7CQkvKiBvZmZzZXQgaW4gRlcgZmlsZSAqLworCXUzMiBkYXRhX29mZnNldDsJLyogb2Zmc2V0IGluIEFEU1AgbWVtb3J5IHNwYWNlICovCisJdm9pZCAqZGF0YTsJCS8qIG1vZHVsZSBkYXRhICovCit9OworCisvKgorICogQXVkaW8gRFNQIEdlbmVyaWMgTW9kdWxlIFRlbXBsYXRlLgorICoKKyAqIFVzZWQgdG8gZGVmaW5lIGFuZCByZWdpc3RlciBhIG5ldyBGVyBtb2R1bGUuIFRoaXMgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbQorICogRlcgbW9kdWxlIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgeworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogZW50cnkgcG9pbnQgKi8KKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhIHM7CS8qIHNjcmF0Y2ggZGF0YSAqLworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgcDsJLyogcGVyaXN0YW50IGRhdGEgKi8KK307CisKKy8qCisgKiBBdWRpbyBEU1AgR2VuZXJpYyBNb2R1bGUuCisgKgorICogRWFjaCBGaXJtd2FyZSBmaWxlIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gQSBtb2R1bGUgY2FuIHNwYW4gbXVsdGlwbGUKKyAqIEFEU1AgbWVtb3J5IGJsb2Nrcy4gVGhlIHNpbXBsZXN0IEZXIHdpbGwgYmUgYSBmaWxlIHdpdGggMSBtb2R1bGUuCisgKi8KK3N0cnVjdCBzc3RfbW9kdWxlIHsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsJCS8qIHBhcmVudCBGVyB3ZSBiZWxvbmcgdG9vICovCisKKwkvKiBtb2R1bGUgY29uZmlndXJhdGlvbiAqLworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCisJdTMyIG9mZnNldDsJCQkvKiBtb2R1bGUgb2Zmc2V0IGluIGZpcm13YXJlIGZpbGUgKi8KKwl1MzIgc2l6ZTsJCQkvKiBtb2R1bGUgc2l6ZSAqLworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgczsJLyogc2NyYXRjaCBkYXRhICovCisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSBwOwkvKiBwZXJpc3RhbnQgZGF0YSAqLworCisJLyogcnVudGltZSAqLworCXUzMiB1c2FnZV9jb3VudDsJCS8qIGNhbiBiZSB1bmxvYWRlZCBpZiBjb3VudCA9PSAwICovCisJdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3JlIGRvZXNuJ3QgdG91Y2ggdGhpcyAqLworCisJLyogbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJsb2NrX2xpc3Q7CS8qIE1vZHVsZSBsaXN0IG9mIGJsb2NrcyBpbiB1c2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBEU1AgbGlzdCBvZiBtb2R1bGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2Z3OwkvKiBGVyBsaXN0IG9mIG1vZHVsZXMgKi8KK307CisKKy8qCisgKiBTU1QgTWVtb3J5IEJsb2NrIG9wZXJhdGlvbnMuCisgKi8KK3N0cnVjdCBzc3RfYmxvY2tfb3BzIHsKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jayk7CisJaW50ICgqZGlzYWJsZSkoc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrKTsKK307CisKKy8qCisgKiBTU1QgR2VuZXJpYyBNZW1vcnkgQmxvY2suCisgKgorICogU1NUIEFEUCAgbWVtb3J5IGhhcyBtdWx0aXBsZSBJUkFNIGFuZCBEUkFNIGJsb2Nrcy4gU29tZSBBRFNQIGJsb2NrcyBjYW4gYmUKKyAqIHBvd2VyIGdhdGVkLgorICovCitzdHJ1Y3Qgc3N0X21lbV9ibG9jayB7CisJc3RydWN0IHNzdF9kc3AgKmRzcDsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOwkvKiBtb2R1bGUgdGhhdCB1c2VzIHRoaXMgYmxvY2sgKi8KKworCS8qIGJsb2NrIGNvbmZpZyAqLworCXUzMiBvZmZzZXQ7CQkJLyogb2Zmc2V0IGZyb20gYmFzZSAqLworCXUzMiBzaXplOwkJCS8qIGJsb2NrIHNpemUgKi8KKwl1MzIgaW5kZXg7CQkJLyogYmxvY2sgaW5kZXggMC4uTiAqLworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7CQkvKiBibG9jayBtZW1vcnkgdHlwZSBJUkFNL0RSQU0gKi8KKwlzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyAqb3BzOwkvKiBibG9jayBvcGVyYXRpb25zLCBpZiBhbnkgKi8KKworCS8qIGJsb2NrIHN0YXR1cyAqLworCWVudW0gc3N0X2RhdGFfdHlwZSBkYXRhX3R5cGU7CS8qIGRhdGEgdHlwZSBoZWxkIGluIHRoaXMgYmxvY2sgKi8KKwl1MzIgYnl0ZXNfdXNlZDsJCQkvKiBieXRlcyBpbiB1c2UgYnkgbW9kdWxlcyAqLworCXZvaWQgKnByaXZhdGU7CQkJLyogZ2VuZXJpYyBjb3JlIGRvZXMgbm90IHRvdWNoIHRoaXMgKi8KKwlpbnQgdXNlcnM7CQkJLyogbnVtYmVyIG9mIG1vZHVsZXMgdXNpbmcgdGhpcyBibG9jayAqLworCisJLyogYmxvY2sgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9saXN0OwkvKiBNb2R1bGUgbGlzdCBvZiBibG9ja3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBNYXAgbGlzdCBvZiBmcmVlL3VzZWQgYmxvY2tzICovCit9OworCisvKgorICogR2VuZXJpYyBTU1QgU2hpbSBJbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBzc3RfZHNwIHsKKworCS8qIHJ1bnRpbWUgKi8KKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXY7CisJc3BpbmxvY2tfdCBzcGlubG9jazsJLyogSVBDIGxvY2tpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIERTUCBGVyBsb2NrICovCisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgKnRocmVhZF9jb250ZXh0OworCWludCBpcnE7CisJdTMyIGlkOworCisJLyogbGlzdCBvZiBmcmVlIGFuZCB1c2VkIEFEU1AgbWVtb3J5IGJsb2NrcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdXNlZF9ibG9ja19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ibG9ja19saXN0OworCisJLyogb3BlcmF0aW9ucyAqLworCXN0cnVjdCBzc3Rfb3BzICpvcHM7CisKKwkvKiBkZWJ1ZyBGUyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKKworCS8qIGJhc2UgYWRkcmVzc2VzICovCisJc3RydWN0IHNzdF9hZGRyIGFkZHI7CisKKwkvKiBtYWlsYm94ICovCisJc3RydWN0IHNzdF9tYWlsYm94IG1haWxib3g7CisKKwkvKiBTU1QgRlcgZmlsZXMgbG9hZGVkIGFuZCB0aGVpciBtb2R1bGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZ3X2xpc3Q7CisKKwkvKiBwbGF0Zm9ybSBkYXRhICovCisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGE7CisKKwkvKiBETUEgRlcgbG9hZGluZyAqLworCXN0cnVjdCBzc3RfZG1hICpkbWE7CisJYm9vbCBmd191c2VfZG1hOworfTsKKworLyogU2l6ZSBvcHRpbWlzZWQgRFJBTS9JUkFNIG1lbWNweSAqLworc3RhdGljIGlubGluZSB2b2lkIHNzdF9kc3Bfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqc3JjLAorCXUzMiBkZXN0X29mZnNldCwgc2l6ZV90IGJ5dGVzKQoreworCXNzdC0+b3BzLT5yYW1fd3JpdGUoc3N0LCBzc3QtPmFkZHIubHBlICsgZGVzdF9vZmZzZXQsIHNyYywgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2RzcF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdTMyIHNyY19vZmZzZXQsIHNpemVfdCBieXRlcykKK3sKKwlzc3QtPm9wcy0+cmFtX3JlYWQoc3N0LCBkZXN0LCBzc3QtPmFkZHIubHBlICsgc3JjX29mZnNldCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJcmV0dXJuIHNzdC0+dGhyZWFkX2NvbnRleHQ7Cit9CisKKy8qIENyZWF0ZS9GcmVlIEZXIGZpbGVzIC0gY2FuIGNvbnRhaW4gbXVsdGlwbGUgbW9kdWxlcyAqLworc3RydWN0IHNzdF9mdyAqc3N0X2Z3X25ldyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpOwordm9pZCBzc3RfZndfZnJlZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwordm9pZCBzc3RfZndfZnJlZV9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCk7CisKKy8qIENyZWF0ZS9GcmVlIGZpcm13YXJlIG1vZHVsZXMgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlX25ldyhzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsCisJc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgKnRlbXBsYXRlLCB2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKTsKK2ludCBzc3RfbW9kdWxlX2luc2VydChzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSk7CitpbnQgc3N0X21vZHVsZV9yZW1vdmUoc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGUpOworaW50IHNzdF9tb2R1bGVfaW5zZXJ0X2ZpeGVkX2Jsb2NrKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSAqZGF0YSk7CitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpOworCisvKiBhbGxvY2F0ZS9mcmVlIHBlc2lzdGVudC9zY3JhdGNoIG1lbW9yeSByZWdpb25zIG1hbmFnZWQgYnkgZHJ2ICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21lbV9ibG9ja19hbGxvY19zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3ApOwordm9pZCBzc3RfbWVtX2Jsb2NrX2ZyZWVfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCXN0cnVjdCBzc3RfbW9kdWxlICpzY3JhdGNoKTsKK2ludCBzc3RfYmxvY2tfbW9kdWxlX3JlbW92ZShzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKTsKKworLyogUmVnaXN0ZXIgdGhlIERTUHMgbWVtb3J5IGJsb2NrcyAtIHdvdWxkIGJlIG5pY2UgdG8gcmVhZCBmcm9tIEFDUEkgKi8KK3N0cnVjdCBzc3RfbWVtX2Jsb2NrICpzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBvZmZzZXQsCisJdTMyIHNpemUsIGVudW0gc3N0X21lbV90eXBlIHR5cGUsIHN0cnVjdCBzc3RfYmxvY2tfb3BzICpvcHMsIHUzMiBpbmRleCwKKwl2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21lbV9ibG9ja191bnJlZ2lzdGVyX2FsbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5jIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzEyOWZkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgRFNQIENvcmUgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oPgorCisvKiBJbnRlcm5hbCBnZW5lcmljIGxvdy1sZXZlbCBTU1QgSU8gZnVuY3Rpb25zIC0gY2FuIGJlIG92ZXJpZGRlbiAqLwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgYWRkciArIG9mZnNldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3Rfc2hpbTMyX3dyaXRlKTsKKwordTMyIHNzdF9zaGltMzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X3NoaW0zMl9yZWFkKTsKKwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9zaGltMzJfd3JpdGU2NCk7CisKK3U2NCBzc3Rfc2hpbTMyX3JlYWQ2NCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpCit7CisJdTY0IHZhbDsKKworCW1lbWNweV9mcm9taW8oJnZhbCwgYWRkciArIG9mZnNldCwgc2l6ZW9mKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3Rfc2hpbTMyX3JlYWQ2NCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3N0X21lbWNweV90b2lvXzMyKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpkZXN0LAorCXUzMiAqc3JjLCBzaXplX3QgYnl0ZXMpCit7CisJaW50IGksIHdvcmRzID0gYnl0ZXMgPj4gMjsKKworCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKQorCQl3cml0ZWwoc3JjW2ldLCBkZXN0ICsgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3N0X21lbWNweV9mcm9taW9fMzIodTMyICpkZXN0LAorCWNvbnN0IHZvbGF0aWxlIF9faW9tZW0gdTMyICpzcmMsIHNpemVfdCBieXRlcykKK3sKKwlpbnQgaSwgd29yZHMgPSBieXRlcyA+PiAyOworCisJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCisJCWRlc3RbaV0gPSByZWFkbChzcmMgKyBpKTsKK30KKwordm9pZCBzc3RfbWVtY3B5X3RvaW9fMzIoc3RydWN0IHNzdF9kc3AgKnNzdCwKKwl2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGJ5dGVzKQoreworCV9zc3RfbWVtY3B5X3RvaW9fMzIoZGVzdCwgc3JjLCBieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtY3B5X3RvaW9fMzIpOworCit2b2lkIHNzdF9tZW1jcHlfZnJvbWlvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdm9pZCBfX2lvbWVtICpzcmMsIHNpemVfdCBieXRlcykKK3sKKwlfc3N0X21lbWNweV9mcm9taW9fMzIoZGVzdCwgc3JjLCBieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtY3B5X2Zyb21pb18zMik7CisKKy8qIFB1YmxpYyBBUEkgKi8KK3ZvaWQgc3N0X2RzcF9zaGltX3dyaXRlKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzc3QtPm9wcy0+d3JpdGUoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZSk7CisKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJdmFsID0gc3N0LT5vcHMtPnJlYWQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkKTsKKwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJc3N0LT5vcHMtPndyaXRlNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZTY0KTsKKwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCXZhbCA9IHNzdC0+b3BzLT5yZWFkNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkNjQpOworCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJc3N0LT5vcHMtPndyaXRlKHNzdC0+YWRkci5zaGltLCBvZmZzZXQsIHZhbHVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZCk7CisKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBzc3QtPm9wcy0+cmVhZChzc3QtPmFkZHIuc2hpbSwgb2Zmc2V0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKTsKKwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJc3N0LT5vcHMtPndyaXRlNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQpOworCit1NjQgc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBzc3QtPm9wcy0+cmVhZDY0KHNzdC0+YWRkci5zaGltLCBvZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZCk7CisKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlKQoreworCWJvb2wgY2hhbmdlOworCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKKwl1MzIgcmV0OworCisJcmV0ID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBvZmZzZXQpOworCisJb2xkID0gcmV0OworCW5ldyA9IChvbGQgJiAofm1hc2spKSB8ICh2YWx1ZSAmIG1hc2spOworCisJY2hhbmdlID0gKG9sZCAhPSBuZXcpOworCWlmIChjaGFuZ2UpCisJCXNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzc3QsIG9mZnNldCwgbmV3KTsKKworCXJldHVybiBjaGFuZ2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQpOworCitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKQoreworCWJvb2wgY2hhbmdlOworCXU2NCBvbGQsIG5ldzsKKworCW9sZCA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQpOworCisJbmV3ID0gKG9sZCAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayk7CisKKwljaGFuZ2UgPSAob2xkICE9IG5ldyk7CisJaWYgKGNoYW5nZSkKKwkJc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG5ldyk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQpOworCitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCisJCQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgY2hhbmdlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwljaGFuZ2UgPSBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG1hc2ssIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyk7CisKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXU2NCBtYXNrLCB1NjQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGNoYW5nZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJY2hhbmdlID0gc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG1hc2ssIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KTsKKwordm9pZCBzc3RfZHNwX2R1bXAoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3QtPm9wcy0+ZHVtcChzc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9kdW1wKTsKKwordm9pZCBzc3RfZHNwX3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJc3N0LT5vcHMtPnJlc2V0KHNzdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX3Jlc2V0KTsKKworaW50IHNzdF9kc3BfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCXNzdC0+b3BzLT5ib290KHNzdCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX2Jvb3QpOworCit2b2lkIHNzdF9kc3BfaXBjX21zZ190eChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgbXNnKQoreworCXNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChkc3AsIFNTVF9JUENYLCBtc2cgfCBTU1RfSVBDWF9CVVNZKTsKKwl0cmFjZV9zc3RfaXBjX21zZ190eChtc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pcGNfbXNnX3R4KTsKKwordTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQoreworCXUzMiBtc2c7CisKKwltc2cgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChkc3AsIFNTVF9JUENYKTsKKwl0cmFjZV9zc3RfaXBjX21zZ19yeChtc2cpOworCisJcmV0dXJuIG1zZzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfaXBjX21zZ19yeCk7CisKK2ludCBzc3RfZHNwX21haWxib3hfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgaW5ib3hfb2Zmc2V0LCBzaXplX3QgaW5ib3hfc2l6ZSwKKwl1MzIgb3V0Ym94X29mZnNldCwgc2l6ZV90IG91dGJveF9zaXplKQoreworCXNzdC0+bWFpbGJveC5pbl9iYXNlID0gc3N0LT5hZGRyLmxwZSArIGluYm94X29mZnNldDsKKwlzc3QtPm1haWxib3gub3V0X2Jhc2UgPSBzc3QtPmFkZHIubHBlICsgb3V0Ym94X29mZnNldDsKKwlzc3QtPm1haWxib3guaW5fc2l6ZSA9IGluYm94X3NpemU7CisJc3N0LT5tYWlsYm94Lm91dF9zaXplID0gb3V0Ym94X3NpemU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX21haWxib3hfaW5pdCk7CisKK3ZvaWQgc3N0X2RzcF9vdXRib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKQoreworCXUzMiBpOworCisJdHJhY2Vfc3N0X2lwY19vdXRib3hfd3JpdGUoYnl0ZXMpOworCisJbWVtY3B5X3RvaW8oc3N0LT5tYWlsYm94Lm91dF9iYXNlLCBtZXNzYWdlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19vdXRib3hfd2RhdGEoaSwgKih1MzIgKikobWVzc2FnZSArIGkpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfb3V0Ym94X3dyaXRlKTsKKwordm9pZCBzc3RfZHNwX291dGJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcykKK3sKKwl1MzIgaTsKKworCXRyYWNlX3NzdF9pcGNfb3V0Ym94X3JlYWQoYnl0ZXMpOworCisJbWVtY3B5X2Zyb21pbyhtZXNzYWdlLCBzc3QtPm1haWxib3gub3V0X2Jhc2UsIGJ5dGVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSArPSA0KQorCQl0cmFjZV9zc3RfaXBjX291dGJveF9yZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9vdXRib3hfcmVhZCk7CisKK3ZvaWQgc3N0X2RzcF9pbmJveF93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkICptZXNzYWdlLCBzaXplX3QgYnl0ZXMpCit7CisJdTMyIGk7CisKKwl0cmFjZV9zc3RfaXBjX2luYm94X3dyaXRlKGJ5dGVzKTsKKworCW1lbWNweV90b2lvKHNzdC0+bWFpbGJveC5pbl9iYXNlLCBtZXNzYWdlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19pbmJveF93ZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pbmJveF93cml0ZSk7CisKK3ZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcykKK3sKKwl1MzIgaTsKKworCXRyYWNlX3NzdF9pcGNfaW5ib3hfcmVhZChieXRlcyk7CisKKwltZW1jcHlfZnJvbWlvKG1lc3NhZ2UsIHNzdC0+bWFpbGJveC5pbl9iYXNlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19pbmJveF9yZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pbmJveF9yZWFkKTsKKworc3RydWN0IHNzdF9kc3AgKnNzdF9kc3BfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3Q7CisJaW50IGVycjsKKworCWRldl9kYmcoZGV2LCAiaW5pdGlhbGlzaW5nIGF1ZGlvIERTUCBpZCAweCV4XG4iLCBwZGF0YS0+aWQpOworCisJc3N0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJnNzdC0+c3BpbmxvY2spOworCW11dGV4X2luaXQoJnNzdC0+bXV0ZXgpOworCXNzdC0+ZGV2ID0gZGV2OworCXNzdC0+dGhyZWFkX2NvbnRleHQgPSBzc3RfZGV2LT50aHJlYWRfY29udGV4dDsKKwlzc3QtPnNzdF9kZXYgPSBzc3RfZGV2OworCXNzdC0+aWQgPSBwZGF0YS0+aWQ7CisJc3N0LT5pcnEgPSBwZGF0YS0+aXJxOworCXNzdC0+b3BzID0gc3N0X2Rldi0+b3BzOworCXNzdC0+cGRhdGEgPSBwZGF0YTsKKwlJTklUX0xJU1RfSEVBRCgmc3N0LT51c2VkX2Jsb2NrX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzc3QtPmZyZWVfYmxvY2tfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNzdC0+bW9kdWxlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzc3QtPmZ3X2xpc3QpOworCisJLyogSW5pdGlhbGlzZSBTU1QgQXVkaW8gRFNQICovCisJaWYgKHNzdC0+b3BzLT5pbml0KSB7CisJCWVyciA9IHNzdC0+b3BzLT5pbml0KHNzdCwgcGRhdGEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBJU1IgKi8KKwllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShzc3QtPmlycSwgc3N0LT5vcHMtPmlycV9oYW5kbGVyLAorCQlzc3RfZGV2LT50aHJlYWQsIElSUUZfU0hBUkVELCAiQXVkaW9EU1AiLCBzc3QpOworCWlmIChlcnIpCisJCWdvdG8gaXJxX2VycjsKKworCXJldHVybiBzc3Q7CisKK2lycV9lcnI6CisJaWYgKHNzdC0+b3BzLT5mcmVlKQorCQlzc3QtPm9wcy0+ZnJlZShzc3QpOworCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX25ldyk7CisKK3ZvaWQgc3N0X2RzcF9mcmVlKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJZnJlZV9pcnEoc3N0LT5pcnEsIHNzdCk7CisJaWYgKHNzdC0+b3BzLT5mcmVlKQorCQlzc3QtPm9wcy0+ZnJlZShzc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9mcmVlKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5oIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA1MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuaApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgQ29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU09VTkRfU09DX1NTVF9EU1BfSAorI2RlZmluZSBfX1NPVU5EX1NPQ19TU1RfRFNQX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qIFNTVCBEZXZpY2UgSURzICAqLworI2RlZmluZSBTU1RfREVWX0lEX0xZTlhfUE9JTlQJCTB4MzNDOAorI2RlZmluZSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQJMHgzNDM4CisjZGVmaW5lIFNTVF9ERVZfSURfQllUCQkJMHgwRjI4CisKKy8qIFN1cHBvcnRlZCBTU1QgRE1BIERldmljZXMgKi8KKyNkZWZpbmUgU1NUX0RNQV9UWVBFX0RXCQkxCisjZGVmaW5lIFNTVF9ETUFfVFlQRV9NSUQJMgorCisvKiBTU1QgU2hpbSByZWdpc3RlciBtYXAKKyAqIFRoZSByZWdpc3RlciBuYW1pbmcgY2FuIGRpZmZlciBiZXR3ZWVuIHByb2R1Y3RzLiBTb21lIHByb2R1Y3RzIGFsc28KKyAqIGNvbnRhaW4gZXh0cmEgZnVuY3Rpb25hbGl0eS4KKyAqLworI2RlZmluZSBTU1RfQ1NSCQkJMHgwMAorI2RlZmluZSBTU1RfUElTUgkJMHgwOAorI2RlZmluZSBTU1RfUElNUgkJMHgxMAorI2RlZmluZSBTU1RfSVNSWAkJMHgxOAorI2RlZmluZSBTU1RfSVNSRAkJMHgyMAorI2RlZmluZSBTU1RfSU1SWAkJMHgyOAorI2RlZmluZSBTU1RfSU1SRAkJMHgzMAorI2RlZmluZSBTU1RfSVBDWAkJMHgzOCAvKiBJUEMgSUEgLT4gU1NUICovCisjZGVmaW5lIFNTVF9JUENECQkweDQwIC8qIElQQyBTU1QgLT4gSUEgKi8KKyNkZWZpbmUgU1NUX0lTUlNDCQkweDQ4CisjZGVmaW5lIFNTVF9JU1JMUEVTQwkJMHg1MAorI2RlZmluZSBTU1RfSU1SU0MJCTB4NTgKKyNkZWZpbmUgU1NUX0lNUkxQRVNDCQkweDYwCisjZGVmaW5lIFNTVF9JUENTQwkJMHg2OAorI2RlZmluZSBTU1RfSVBDTFBFU0MJCTB4NzAKKyNkZWZpbmUgU1NUX0NMS0NUTAkJMHg3OAorI2RlZmluZSBTU1RfQ1NSMgkJMHg4MAorI2RlZmluZSBTU1RfTFRSQwkJMHhFMAorI2RlZmluZSBTU1RfSERNQwkJMHhFOAorI2RlZmluZSBTU1RfREJHTwkJMHhGMAorCisjZGVmaW5lIFNTVF9TSElNX1NJWkUJCTB4MTAwCisjZGVmaW5lIFNTVF9QV01DVFJMICAgICAgICAgICAgIDB4MTAwMAorCisvKiBTU1QgU2hpbSBSZWdpc3RlciBiaXRzCisgKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWluZyBjYW4gZGlmZmVyIGJldHdlZW4gcHJvZHVjdHMuIFNvbWUgcHJvZHVjdHMgYWxzbworICogY29udGFpbiBleHRyYSBmdW5jdGlvbmFsaXR5LgorICovCisKKy8qIENTUiAvIENTICovCisjZGVmaW5lIFNTVF9DU1JfUlNUCQkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1JfU0JDUzAJCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0NTUl9TQkNTMQkJKDB4MSA8PCAzKQorI2RlZmluZSBTU1RfQ1NSX0RDUyh4KQkJKHggPDwgNCkKKyNkZWZpbmUgU1NUX0NTUl9EQ1NfTUFTSwkoMHg3IDw8IDQpCisjZGVmaW5lIFNTVF9DU1JfU1RBTEwJCSgweDEgPDwgMTApCisjZGVmaW5lIFNTVF9DU1JfUzBJT0NTCQkoMHgxIDw8IDIxKQorI2RlZmluZSBTU1RfQ1NSX1MxSU9DUwkJKDB4MSA8PCAyMykKKyNkZWZpbmUgU1NUX0NTUl9MUENTCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0NTUl9SU1QJCSgweDEgPDwgMCkKKyNkZWZpbmUgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTAkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9CWVRfQ1NSX1NUQUxMCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0JZVF9DU1JfUFdBSVRNT0RFCSgweDEgPDwgMykKKworLyogIElTUlggLyBJU0MgKi8KKyNkZWZpbmUgU1NUX0lTUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSVNSWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElTUkQgLyBJU0QgKi8KKyNkZWZpbmUgU1NUX0lTUkRfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSRF9ET05FCQkoMHgxIDw8IDApCisKKy8qIElNUlggLyBJTUMgKi8KKyNkZWZpbmUgU1NUX0lNUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSU1SWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSU1SWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElQQ1ggLyBJUENDICovCisjZGVmaW5lCVNTVF9JUENYX0RPTkUJCSgweDEgPDwgMzApCisjZGVmaW5lCVNTVF9JUENYX0JVU1kJCSgweDEgPDwgMzEpCisjZGVmaW5lIFNTVF9CWVRfSVBDWF9ET05FCSgodTY0KTB4MSA8PCA2MikKKyNkZWZpbmUgU1NUX0JZVF9JUENYX0JVU1kJKCh1NjQpMHgxIDw8IDYzKQorCisvKiAgSVBDRCAqLworI2RlZmluZQlTU1RfSVBDRF9ET05FCQkoMHgxIDw8IDMwKQorI2RlZmluZQlTU1RfSVBDRF9CVVNZCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0lQQ0RfRE9ORQkoKHU2NCkweDEgPDwgNjIpCisjZGVmaW5lIFNTVF9CWVRfSVBDRF9CVVNZCSgodTY0KTB4MSA8PCA2MykKKworLyogQ0xLQ1RMICovCisjZGVmaW5lIFNTVF9DTEtDVExfU01PUyh4KQkoeCA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9NQVNLCQkoMyA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9EQ1BMQ0cJKDEgPDwgMTgpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTEJKDEgPDwgMTcpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTAJKDEgPDwgMTYpCisKKy8qIENTUjIgLyBDUzIgKi8KKyNkZWZpbmUgU1NUX0NTUjJfU0RGRF9TU1AwCSgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1IyX1NERkRfU1NQMQkoMSA8PCAyKQorCisvKiBMVFJDICovCisjZGVmaW5lIFNTVF9MVFJDX1ZBTCh4KQkJKHggPDwgMCkKKworLyogSERNQyAqLworI2RlZmluZSBTU1RfSERNQ19IRERBMCh4KQkoeCA8PCAwKQorI2RlZmluZSBTU1RfSERNQ19IRERBMSh4KQkoeCA8PCA3KQorCisKKy8qIFNTVCBWZW5kb3IgRGVmaW5lZCBSZWdpc3RlcnMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgU1NUX1ZEUlRDVEwwCQkweGEwCisjZGVmaW5lIFNTVF9WRFJUQ1RMMQkJMHhhNAorI2RlZmluZSBTU1RfVkRSVENUTDIJCTB4YTgKKyNkZWZpbmUgU1NUX1ZEUlRDVEwzCQkweGFDCisKKy8qIFZEUlRDVEwwICovCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUCTE2CisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sJKDB4ZmZmZiA8PCBTU1RfVkRSVENMMF9EU1JBTVBHRV9TSElGVCkKKyNkZWZpbmUgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfU0hJRlQJNgorI2RlZmluZSBTU1RfVkRSVENMMF9JU1JBTVBHRV9NQVNLCSgweDNmZiA8PCBTU1RfVkRSVENMMF9JU1JBTVBHRV9TSElGVCkKKworc3RydWN0IHNzdF9kc3A7CisKKy8qCisgKiBTU1QgRGV2aWNlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHBvcHVsYXRlZCBieSB0aGUgU1NUIGNvcmUgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgeworCS8qIE1hbmRhdG9yeSBmaWVsZHMgKi8KKwlzdHJ1Y3Qgc3N0X29wcyAqb3BzOworCWlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpjb250ZXh0KTsKKwl2b2lkICp0aHJlYWRfY29udGV4dDsKK307CisKKy8qCisgKiBTU1QgUGxhdGZvcm0gRGF0YS4KKyAqLworc3RydWN0IHNzdF9wZGF0YSB7CisJLyogQUNQSSBkYXRhICovCisJdTMyIGxwZV9iYXNlOworCXUzMiBscGVfc2l6ZTsKKwl1MzIgcGNpY2ZnX2Jhc2U7CisJdTMyIHBjaWNmZ19zaXplOworCXUzMiBmd19iYXNlOworCXUzMiBmd19zaXplOworCWludCBpcnE7CisKKwkvKiBGaXJtd2FyZSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwkvKiBETUEgKi8KKwl1MzIgZG1hX2Jhc2U7CisJdTMyIGRtYV9zaXplOworCWludCBkbWFfZW5naW5lOworCisJLyogRFNQICovCisJdTMyIGlkOworCXZvaWQgKmRzcDsKK307CisKKy8qIEluaXRpYWxpemF0aW9uICovCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2RzcF9uZXcoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBzc3RfZHNwX2RldmljZSAqc3N0X2Rldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfZHNwX2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCk7CisKKy8qIFNISU0gUmVhZCAvIFdyaXRlICovCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9kc3Bfc2hpbV9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXUzMiBtYXNrLCB1MzIgdmFsdWUpOwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7CitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKTsKKworLyogU0hJTSBSZWFkIC8gV3JpdGUgVW5sb2NrZWQgZm9yIGNhbGxlcnMgYWxyZWFkeSBob2xkaW5nIHNzdCBsb2NrICovCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXUzMiBtYXNrLCB1MzIgdmFsdWUpOwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7CitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQkJdTY0IG1hc2ssIHU2NCB2YWx1ZSk7CisKKy8qIEludGVybmFsIGdlbmVyaWMgbG93LWxldmVsIFNTVCBJTyBmdW5jdGlvbnMgLSBjYW4gYmUgb3ZlcmlkZGVuICovCit2b2lkIHNzdF9zaGltMzJfd3JpdGUodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9zaGltMzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9zaGltMzJfcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCk7Cit2b2lkIHNzdF9tZW1jcHlfdG9pb18zMihzdHJ1Y3Qgc3N0X2RzcCAqc3N0LAorCQkJdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9tZW1jcHlfZnJvbWlvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsCisJCQkgIHZvaWQgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjLCBzaXplX3QgYnl0ZXMpOworCisvKiBEU1AgcmVzZXQgJiBib290ICovCit2b2lkIHNzdF9kc3BfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCk7CitpbnQgc3N0X2RzcF9ib290KHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisvKiBNc2cgSU8gKi8KK3ZvaWQgc3N0X2RzcF9pcGNfbXNnX3R4KHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBtc2cpOwordTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworLyogTWFpbGJveCBtYW5hZ2VtZW50ICovCitpbnQgc3N0X2RzcF9tYWlsYm94X2luaXQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIGluYm94X29mZnNldCwKKwlzaXplX3QgaW5ib3hfc2l6ZSwgdTMyIG91dGJveF9vZmZzZXQsIHNpemVfdCBvdXRib3hfc2l6ZSk7Cit2b2lkIHNzdF9kc3BfaW5ib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9kc3Bfb3V0Ym94X3dyaXRlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9kc3Bfb3V0Ym94X3JlYWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9tYWlsYm94X2R1bXAoc3RydWN0IHNzdF9kc3AgKmRzcCwgc2l6ZV90IGJ5dGVzKTsKKworLyogRGVidWcgKi8KK3ZvaWQgc3N0X2RzcF9kdW1wKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY4NzEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1maXJtd2FyZS5jCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogSW50ZWwgU1NUIEZpcm13YXJlIExvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorCitzdGF0aWMgdm9pZCBzc3RfbWVtY3B5MzIodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHUzMiBieXRlcykKK3sKKwl1MzIgaTsKKworCS8qIGNvcHkgb25lIDMyIGJpdCB3b3JkIGF0IGEgdGltZSBhcyA2NCBiaXQgYWNjZXNzIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJbWVtY3B5X3RvaW8oZGVzdCArIGksIHNyYyArIGksIDQpOworfQorCisvKiBjcmVhdGUgbmV3IGdlbmVyaWMgZmlybXdhcmUgb2JqZWN0ICovCitzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZndfbmV3KHN0cnVjdCBzc3RfZHNwICpkc3AsIAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3OworCWludCBlcnI7CisKKwlpZiAoIWRzcC0+b3BzLT5wYXJzZV9mdykKKwkJcmV0dXJuIE5VTEw7CisKKwlzc3RfZncgPSBremFsbG9jKHNpemVvZigqc3N0X2Z3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9mdyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9mdy0+ZHNwID0gZHNwOworCXNzdF9mdy0+cHJpdmF0ZSA9IHByaXZhdGU7CisJc3N0X2Z3LT5zaXplID0gZnctPnNpemU7CisKKwllcnIgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGRzcC0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShzc3RfZncpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIHRvIHN0b3JlIEZXIGRhdGEgKi8KKwlzc3RfZnctPmRtYV9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwKKwkJCQkmc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIsIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNzdF9mdy0+ZG1hX2J1ZikgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IERNQSBhbGxvYyBmYWlsZWRcbiIpOworCQlrZnJlZShzc3RfZncpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjb3B5IEZXIGRhdGEgdG8gRE1BLWFibGUgbWVtb3J5ICovCisJbWVtY3B5KCh2b2lkICopc3N0X2Z3LT5kbWFfYnVmLCAodm9pZCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwkvKiBjYWxsIGNvcmUgc3BlY2lmaWMgRlcgcGFzZXIgdG8gbG9hZCBGVyBkYXRhIGludG8gRFNQICovCisJZXJyID0gZHNwLT5vcHMtPnBhcnNlX2Z3KHNzdF9mdyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBwYXJzZSBmdyBmYWlsZWQgJWRcbiIsIGVycik7CisJCWdvdG8gcGFyc2VfZXJyOworCX0KKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfZnctPmxpc3QsICZkc3AtPmZ3X2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlyZXR1cm4gc3N0X2Z3OworCitwYXJzZV9lcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwKKwkJCQlzc3RfZnctPmRtYV9idWYsCisJCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfbmV3KTsKKworLyogZnJlZSBzaW5nbGUgZmlybXdhcmUgb2JqZWN0ICovCit2b2lkIHNzdF9md19mcmVlKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfZnJlZSk7CisKKy8qIGZyZWUgYWxsIGZpcm13YXJlIG9iamVjdHMgKi8KK3ZvaWQgc3N0X2Z3X2ZyZWVfYWxsKHN0cnVjdCBzc3RfZHNwICpkc3ApCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3LCAqdDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzc3RfZncsIHQsICZkc3AtPmZ3X2xpc3QsIGxpc3QpIHsKKworCQlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCQlrZnJlZShzc3RfZncpOworCX0KKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Z3X2ZyZWVfYWxsKTsKKworLyogY3JlYXRlIGEgbmV3IFNTVCBnZW5lcmljIG1vZHVsZSBmcm9tIEZXIHRlbXBsYXRlICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9uZXcoc3RydWN0IHNzdF9mdyAqc3N0X2Z3LAorCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlICp0ZW1wbGF0ZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGU7CisKKwlzc3RfbW9kdWxlID0ga3phbGxvYyhzaXplb2YoKnNzdF9tb2R1bGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0X21vZHVsZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9tb2R1bGUtPmlkID0gdGVtcGxhdGUtPmlkOworCXNzdF9tb2R1bGUtPmRzcCA9IGRzcDsKKwlzc3RfbW9kdWxlLT5zc3RfZncgPSBzc3RfZnc7CisKKwltZW1jcHkoJnNzdF9tb2R1bGUtPnMsICZ0ZW1wbGF0ZS0+cywgc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlX2RhdGEpKTsKKwltZW1jcHkoJnNzdF9tb2R1bGUtPnAsICZ0ZW1wbGF0ZS0+cCwgc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlX2RhdGEpKTsKKworCUlOSVRfTElTVF9IRUFEKCZzc3RfbW9kdWxlLT5ibG9ja19saXN0KTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfbW9kdWxlLT5saXN0LCAmZHNwLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCXJldHVybiBzc3RfbW9kdWxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9uZXcpOworCisvKiBmcmVlIGZpcm13YXJlIG1vZHVsZSBhbmQgcmVtb3ZlIGZyb20gYXZhaWxhYmxlIGxpc3QgKi8KK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfbW9kdWxlLT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X21vZHVsZS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCWtmcmVlKHNzdF9tb2R1bGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9mcmVlKTsKKworc3RhdGljIHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpmaW5kX2Jsb2NrKHN0cnVjdCBzc3RfZHNwICpkc3AsIGludCB0eXBlLAorCXUzMiBvZmZzZXQpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisJCWlmIChibG9jay0+dHlwZSA9PSB0eXBlICYmIGJsb2NrLT5vZmZzZXQgPT0gb2Zmc2V0KQorCQkJcmV0dXJuIGJsb2NrOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMoc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhICpkYXRhLCB1MzIgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcCA9IExJU1RfSEVBRF9JTklUKHRtcCk7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jazsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlibG9jayA9IGZpbmRfYmxvY2soZHNwLCBkYXRhLT50eXBlLCBvZmZzZXQpOworCQlpZiAoIWJsb2NrKSB7CisJCQlsaXN0X3NwbGljZSgmdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlsaXN0X21vdmVfdGFpbCgmYmxvY2stPmxpc3QsICZ0bXApOworCQlvZmZzZXQgKz0gYmxvY2stPnNpemU7CisJCXNpemUgLT0gYmxvY2stPnNpemU7CisJfQorCisJbGlzdF9zcGxpY2UoJnRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgZnJlZSBEU1AgYmxvY2tzIGZvciBtb2R1bGUgZGF0YSAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvYyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkYXRhLT5zaXplID09IDApCisJCXJldHVybiAwOworCisJLyogZmluZCBmaXJzdCBmcmVlIHdob2xlIGJsb2NrcyB0aGF0IGNhbiBob2xkIG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKworCQkvKiBpZ25vcmUgYmxvY2tzIHdpdGggd3JvbmcgdHlwZSAqLworCQlpZiAoYmxvY2stPnR5cGUgIT0gZGF0YS0+dHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkYXRhLT5zaXplID4gYmxvY2stPnNpemUpCisJCQljb250aW51ZTsKKworCQlkYXRhLT5vZmZzZXQgPSBibG9jay0+b2Zmc2V0OworCQlibG9jay0+ZGF0YV90eXBlID0gZGF0YS0+ZGF0YV90eXBlOworCQlibG9jay0+Ynl0ZXNfdXNlZCA9IGRhdGEtPnNpemUgJSBibG9jay0+c2l6ZTsKKwkJbGlzdF9hZGQoJmJsb2NrLT5tb2R1bGVfbGlzdCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7CisJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7CisJCWRldl9kYmcoZHNwLT5kZXYsICIgKm1vZHVsZSAlZCBhZGRlZCBibG9jayAlZDolZFxuIiwKKwkJCW1vZHVsZS0+aWQsIGJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aGVuIGZpbmQgZnJlZSBtdWx0aXBsZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBtb2R1bGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGRhdGEtPnR5cGUpCisJCQljb250aW51ZTsKKworCQkvKiBkbyB3ZSBzcGFuID4gMSBibG9ja3MgKi8KKwkJaWYgKGRhdGEtPnNpemUgPiBibG9jay0+c2l6ZSkgeworCQkJcmV0ID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhtb2R1bGUsIGRhdGEsCisJCQkJYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplLAorCQkJCWRhdGEtPnNpemUgLSBibG9jay0+c2l6ZSk7CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIG5vdCBlbm91Z2ggZnJlZSBibG9jayBzcGFjZSAqLworCXJldHVybiAtRU5PTUVNOworfQorCisvKiByZW1vdmUgbW9kdWxlIGZyb20gbWVtb3J5IC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgdm9pZCBibG9ja19tb2R1bGVfcmVtb3ZlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKwlpbnQgZXJyOworCisJLyogZGlzYWJsZSBlYWNoIGJsb2NrICAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkgeworCQkJZXJyID0gYmxvY2stPm9wcy0+ZGlzYWJsZShibG9jayk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkZXZfZXJyKGRzcC0+ZGV2LAorCQkJCQkiZXJyb3I6IGNhbnQgZGlzYWJsZSBibG9jayAlZDolZFxuIiwKKwkJCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCk7CisJCX0KKwl9CisKKwkvKiBtYXJrIGVhY2ggYmxvY2sgYXMgZnJlZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmbW9kdWxlLT5ibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgeworCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKKwkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKKwl9Cit9CisKKy8qIHByZXBhcmUgdGhlIG1lbW9yeSBibG9jayB0byByZWNlaXZlIGRhdGEgZnJvbSBob3N0IC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgaW50IGJsb2NrX21vZHVsZV9wcmVwYXJlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCWludCByZXQgPSAwOworCisJLyogZW5hYmxlIGVhY2ggYmxvY2sgc28gdGhhdCdzIGl0J2UgcmVhZHkgZm9yIG1vZHVsZSBQL1MgZGF0YSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZW5hYmxlKSB7CisJCQlyZXQgPSBibG9jay0+b3BzLT5lbmFibGUoYmxvY2spOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKG1vZHVsZS0+ZHNwLT5kZXYsCisJCQkJCSJlcnJvcjogY2FudCBkaXNhYmxlIGJsb2NrICVkOiVkXG4iLAorCQkJCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4KTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJm1vZHVsZS0+YmxvY2tfbGlzdCwgbW9kdWxlX2xpc3QpIHsKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkKKwkJCWJsb2NrLT5vcHMtPmRpc2FibGUoYmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzIGZvciBzdGF0aWMgbW9kdWxlIGFkZHJlc3NlcyAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvY19maXhlZChzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwl1MzIgZW5kID0gZGF0YS0+b2Zmc2V0ICsgZGF0YS0+c2l6ZSwgYmxvY2tfZW5kOworCWludCBlcnI7CisKKwkvKiBvbmx5IElSQU0vRFJBTSBibG9ja3MgYXJlIG1hbmFnZWQgKi8KKwlpZiAoZGF0YS0+dHlwZSAhPSBTU1RfTUVNX0lSQU0gJiYgZGF0YS0+dHlwZSAhPSBTU1RfTUVNX0RSQU0pCisJCXJldHVybiAwOworCisJLyogYXJlIGJsb2NrcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoaXMgbW9kdWxlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJLyogZm9yY2UgY29tcGFjdGluZyBtZW0gYmxvY2tzIG9mIHRoZSBzYW1lIGRhdGFfdHlwZSAqLworCQlpZiAoYmxvY2stPmRhdGFfdHlwZSAhPSBkYXRhLT5kYXRhX3R5cGUpCisJCQljb250aW51ZTsKKworCQlibG9ja19lbmQgPSBibG9jay0+b2Zmc2V0ICsgYmxvY2stPnNpemU7CisKKwkJLyogZmluZCBibG9jayB0aGF0IGhvbGRzIHNlY3Rpb24gKi8KKwkJaWYgKGRhdGEtPm9mZnNldCA+PSBibG9jay0+b2Zmc2V0ICYmIGVuZCA8IGJsb2NrX2VuZCkKKwkJCXJldHVybiAwOworCisJCS8qIGRvZXMgYmxvY2sgc3BhbiBtb3JlIHRoYW4gMSBzZWN0aW9uICovCisJCWlmIChkYXRhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBkYXRhLT5vZmZzZXQgPCBibG9ja19lbmQpIHsKKworCQkJZXJyID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhtb2R1bGUsIGRhdGEsCisJCQkJYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplLAorCQkJCWRhdGEtPnNpemUgLSBibG9jay0+c2l6ZSArIGRhdGEtPm9mZnNldCAtIGJsb2NrLT5vZmZzZXQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIG1vZHVsZSBhbHJlYWR5IG93bnMgYmxvY2tzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIGZpbmQgZmlyc3QgZnJlZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBzZWN0aW9uIGluIGZyZWUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKwkJYmxvY2tfZW5kID0gYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplOworCisJCS8qIGZpbmQgYmxvY2sgdGhhdCBob2xkcyBzZWN0aW9uICovCisJCWlmIChkYXRhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBlbmQgPCBibG9ja19lbmQpIHsKKworCQkJLyogYWRkIGJsb2NrICovCisJCQlibG9jay0+ZGF0YV90eXBlID0gZGF0YS0+ZGF0YV90eXBlOworCQkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwkJCWxpc3RfYWRkKCZibG9jay0+bW9kdWxlX2xpc3QsICZtb2R1bGUtPmJsb2NrX2xpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBkb2VzIGJsb2NrIHNwYW4gbW9yZSB0aGFuIDEgc2VjdGlvbiAqLworCQlpZiAoZGF0YS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgZGF0YS0+b2Zmc2V0IDwgYmxvY2tfZW5kKSB7CisKKwkJCWVyciA9IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMobW9kdWxlLCBkYXRhLAorCQkJCWJsb2NrLT5vZmZzZXQgKyBibG9jay0+c2l6ZSwKKwkJCQlkYXRhLT5zaXplIC0gYmxvY2stPnNpemUpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIGFkZCBibG9jayAqLworCQkJYmxvY2stPmRhdGFfdHlwZSA9IGRhdGEtPmRhdGFfdHlwZTsKKwkJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7CisJCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCAmbW9kdWxlLT5ibG9ja19saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogTG9hZCBmaXhlZCBtb2R1bGUgZGF0YSBpbnRvIERTUCBtZW1vcnkgYmxvY2tzICovCitpbnQgc3N0X21vZHVsZV9pbnNlcnRfZml4ZWRfYmxvY2soc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwkvKiBhbGxvYyBibG9ja3MgdGhhdCBpbmNsdWRlcyB0aGlzIHNlY3Rpb24gKi8KKwlyZXQgPSBibG9ja19hbGxvY19maXhlZChtb2R1bGUsIGRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkiZXJyb3I6IG5vIGZyZWUgYmxvY2tzIGZvciBzZWN0aW9uIGF0IG9mZnNldCAweCV4IHNpemUgMHgleFxuIiwKKwkJCWRhdGEtPm9mZnNldCwgZGF0YS0+c2l6ZSk7CisJCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHByZXBhcmUgRFNQIGJsb2NrcyBmb3IgbW9kdWxlIGNvcHkgKi8KKwlyZXQgPSBibG9ja19tb2R1bGVfcHJlcGFyZShtb2R1bGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZncgbW9kdWxlIHByZXBhcmUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogY29weSBwYXJ0aWFsIG1vZHVsZSBkYXRhIHRvIGJsb2NrcyAqLworCXNzdF9tZW1jcHkzMihkc3AtPmFkZHIubHBlICsgZGF0YS0+b2Zmc2V0LCBkYXRhLT5kYXRhLCBkYXRhLT5zaXplKTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKKworZXJyOgorCWJsb2NrX21vZHVsZV9yZW1vdmUobW9kdWxlKTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2luc2VydF9maXhlZF9ibG9jayk7CisKKy8qIFVubG9hZCBlbnRpcmUgbW9kdWxlIGZyb20gRFNQIG1lbW9yeSAqLworaW50IHNzdF9ibG9ja19tb2R1bGVfcmVtb3ZlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisJYmxvY2tfbW9kdWxlX3JlbW92ZShtb2R1bGUpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYmxvY2tfbW9kdWxlX3JlbW92ZSk7CisKKy8qIHJlZ2lzdGVyIGEgRFNQIG1lbW9yeSBibG9jayBmb3IgdXNlIHdpdGggRlcgYmFzZWQgbW9kdWxlcyAqLworc3RydWN0IHNzdF9tZW1fYmxvY2sgKnNzdF9tZW1fYmxvY2tfcmVnaXN0ZXIoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIG9mZnNldCwKKwl1MzIgc2l6ZSwgZW51bSBzc3RfbWVtX3R5cGUgdHlwZSwgc3RydWN0IHNzdF9ibG9ja19vcHMgKm9wcywgdTMyIGluZGV4LAorCXZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCisJYmxvY2sgPSBremFsbG9jKHNpemVvZigqYmxvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoYmxvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9jay0+b2Zmc2V0ID0gb2Zmc2V0OworCWJsb2NrLT5zaXplID0gc2l6ZTsKKwlibG9jay0+aW5kZXggPSBpbmRleDsKKwlibG9jay0+dHlwZSA9IHR5cGU7CisJYmxvY2stPmRzcCA9IGRzcDsKKwlibG9jay0+cHJpdmF0ZSA9IHByaXZhdGU7CisJYmxvY2stPm9wcyA9IG9wczsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJcmV0dXJuIGJsb2NrOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21lbV9ibG9ja19yZWdpc3Rlcik7CisKKy8qIHVucmVnaXN0ZXIgYWxsIERTUCBtZW1vcnkgYmxvY2tzICovCit2b2lkIHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKworCS8qIHVucmVnaXN0ZXIgdXNlZCBibG9ja3MgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZibG9jay0+bGlzdCk7CisJCWtmcmVlKGJsb2NrKTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGZyZWUgYmxvY2tzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmYmxvY2stPmxpc3QpOworCQlrZnJlZShibG9jayk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwpOworCisvKiBhbGxvY2F0ZSBzY3JhdGNoIGJ1ZmZlciBibG9ja3MgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbWVtX2Jsb2NrX2FsbG9jX3NjcmF0Y2goc3RydWN0IHNzdF9kc3AgKmRzcCkKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSwgKnNjcmF0Y2g7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCXUzMiBibG9ja19zaXplOworCWludCByZXQgPSAwOworCisJc2NyYXRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNjcmF0Y2ggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKworCS8qIGNhbGN1bGF0ZSByZXF1aXJlZCBzY3JhdGNoIHNpemUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNzdF9tb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChzY3JhdGNoLT5zLnNpemUgPiBzc3RfbW9kdWxlLT5zLnNpemUpCisJCQlzY3JhdGNoLT5zLnNpemUgPSBzY3JhdGNoLT5zLnNpemU7CisJCWVsc2UKKwkJCXNjcmF0Y2gtPnMuc2l6ZSA9IHNzdF9tb2R1bGUtPnMuc2l6ZTsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAic2NyYXRjaCBidWZmZXIgcmVxdWlyZWQgaXMgJWQgYnl0ZXNcbiIsCisJCXNjcmF0Y2gtPnMuc2l6ZSk7CisKKwkvKiBpbml0IHNjcmF0Y2ggbW9kdWxlICovCisJc2NyYXRjaC0+ZHNwID0gZHNwOworCXNjcmF0Y2gtPnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwlzY3JhdGNoLT5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisJSU5JVF9MSVNUX0hFQUQoJnNjcmF0Y2gtPmJsb2NrX2xpc3QpOworCisJLyogY2hlY2sgZnJlZSBibG9ja3MgYmVmb3JlIGxvb2tpbmcgYXQgdXNlZCBibG9ja3MgZm9yIHNwYWNlICovCisJaWYgKCFsaXN0X2VtcHR5KCZkc3AtPmZyZWVfYmxvY2tfbGlzdCkpCisJCWJsb2NrID0gbGlzdF9maXJzdF9lbnRyeSgmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsCisJCQlzdHJ1Y3Qgc3N0X21lbV9ibG9jaywgbGlzdCk7CisJZWxzZQorCQlibG9jayA9IGxpc3RfZmlyc3RfZW50cnkoJmRzcC0+dXNlZF9ibG9ja19saXN0LAorCQkJc3RydWN0IHNzdF9tZW1fYmxvY2ssIGxpc3QpOworCWJsb2NrX3NpemUgPSBibG9jay0+c2l6ZTsKKworCS8qIGFsbG9jYXRlIGJsb2NrcyBmb3IgbW9kdWxlIHNjcmF0Y2ggYnVmZmVycyAqLworCWRldl9kYmcoZHNwLT5kZXYsICJhbGxvY2F0aW5nIHNjcmF0Y2ggYmxvY2tzXG4iKTsKKwlyZXQgPSBibG9ja19hbGxvYyhzY3JhdGNoLCAmc2NyYXRjaC0+cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjYW4ndCBhbGxvYyBzY3JhdGNoIGJsb2Nrc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFzc2lnbiB0aGUgc2FtZSBvZmZzZXQgb2Ygc2NyYXRjaCB0byBlYWNoIG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3N0X21vZHVsZSwgJmRzcC0+bW9kdWxlX2xpc3QsIGxpc3QpCisJCXNzdF9tb2R1bGUtPnMub2Zmc2V0ID0gc2NyYXRjaC0+cy5vZmZzZXQ7CisKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiBzY3JhdGNoOworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZzY3JhdGNoLT5ibG9ja19saXN0LCBtb2R1bGVfbGlzdCkKKwkJbGlzdF9kZWwoJmJsb2NrLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfYWxsb2Nfc2NyYXRjaCk7CisKKy8qIGZyZWUgYWxsIHNjcmF0Y2ggYmxvY2tzICovCit2b2lkIHNzdF9tZW1fYmxvY2tfZnJlZV9zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3AsCisJc3RydWN0IHNzdF9tb2R1bGUgKnNjcmF0Y2gpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJnNjcmF0Y2gtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KQorCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtX2Jsb2NrX2ZyZWVfc2NyYXRjaCk7CisKKy8qIGdldCBhIG1vZHVsZSBmcm9tIGl0J3MgdW5pcXVlIElEICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpCit7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPmlkID09IGlkKSB7CisJCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2dldF9mcm9tX2lkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1kc3AuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWViZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWRzcC5jCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogSW50ZWwgSGFzd2VsbCBTU1QgRFNQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworI2RlZmluZSBTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFCTQKKyNkZWZpbmUgU1NUX0hTV19GV19TSUdOCQkJIiRTU1QiCisjZGVmaW5lIFNTVF9IU1dfRldfTElCX1NJR04JCSIkTElCIgorCisjZGVmaW5lIFNTVF9XUFRfU0hJTV9PRkZTRVQJMHhGQjAwMAorI2RlZmluZSBTU1RfTFBfU0hJTV9PRkZTRVQJMHhFNzAwMAorI2RlZmluZSBTU1RfV1BUX0lSQU1fT0ZGU0VUCTB4QTAwMDAKKyNkZWZpbmUgU1NUX0xQX0lSQU1fT0ZGU0VUCTB4ODAwMDAKKworI2RlZmluZSBTU1RfU0hJTV9QTV9SRUcJCTB4ODQKKworI2RlZmluZSBTU1RfSFNXX0lSQU0JMQorI2RlZmluZSBTU1RfSFNXX0RSQU0JMgorI2RlZmluZSBTU1RfSFNXX1JFR1MJMworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCV9fbGUzMiB0eXBlOwkJLyogSVJBTS9EUkFNICovCisJX19sZTMyIHNpemU7CQkvKiBCeXRlcyAqLworCV9fbGUzMiByYW1fb2Zmc2V0OwkvKiBPZmZzZXQgaW4gSS9EUkFNICovCisJX19sZTMyIHJzdmQ7CQkvKiBSZXNlcnZlZCBmaWVsZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZ3X21vZHVsZV9pbmZvIHsKKwlfX2xlMzIgcGVyc2lzdGVudF9zaXplOworCV9fbGUzMiBzY3JhdGNoX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFXTsgLyogRlcgc2lnbmF0dXJlICovCisJX19sZTMyIGZpbGVfc2l6ZTsJCS8qIHNpemUgb2YgZncgbWludXMgdGhpcyBoZWFkZXIgKi8KKwlfX2xlMzIgbW9kdWxlczsJCS8qICAjIG9mIG1vZHVsZXMgKi8KKwlfX2xlMzIgZmlsZV9mb3JtYXQ7CS8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCV9fbGUzMiByZXNlcnZlZFs0XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmd19tb2R1bGVfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFXTsgLyogbW9kdWxlIHNpZ25hdHVyZSAqLworCV9fbGUzMiBtb2Rfc2l6ZTsJLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwlfX2xlMzIgYmxvY2tzOwkvKiAjIG9mIGJsb2NrcyAqLworCV9fbGUxNiBwYWRkaW5nOworCV9fbGUxNiB0eXBlOwkvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwlfX2xlMzIgZW50cnlfcG9pbnQ7CisJc3RydWN0IGZ3X21vZHVsZV9pbmZvIGluZm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKKworc3RhdGljIGludCBoc3dfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGUpCit7CisJc3RydWN0IGRtYV9ibG9ja19pbmZvICpibG9jazsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kOworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgYmxvY2tfZGF0YTsKKwlzdHJ1Y3Qgc3N0X21vZHVsZV90ZW1wbGF0ZSB0ZW1wbGF0ZTsKKwlpbnQgY291bnQ7CisJdm9pZCBfX2lvbWVtICpyYW07CisKKwkvKiBUT0RPOiBhbGxvd2VkIG1vZHVsZSB0eXBlcyBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLworCWlmIChtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVworCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNX1NZU1RFTQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fUkVGRVJFTkNFCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfTFBBTCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAibmV3IG1vZHVsZSBzaWduIDB4JXMgc2l6ZSAweCV4IGJsb2NrcyAweCV4IHR5cGUgMHgleFxuIiwKKwkJbW9kdWxlLT5zaWduYXR1cmUsIG1vZHVsZS0+bW9kX3NpemUsCisJCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOworCWRldl9kYmcoZHNwLT5kZXYsICIgZW50cnlwb2ludCAweCV4XG4iLCBtb2R1bGUtPmVudHJ5X3BvaW50KTsKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiIHBlcnNpc3RlbnQgMHgleCBzY3JhdGNoIDB4JXhcbiIsCisJCW1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemUsIG1vZHVsZS0+aW5mby5zY3JhdGNoX3NpemUpOworCisJbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7CisJdGVtcGxhdGUuaWQgPSBtb2R1bGUtPnR5cGU7CisJdGVtcGxhdGUuZW50cnkgPSBtb2R1bGUtPmVudHJ5X3BvaW50OworCXRlbXBsYXRlLnAuc2l6ZSA9IG1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemU7CisJdGVtcGxhdGUucC50eXBlID0gU1NUX01FTV9EUkFNOworCXRlbXBsYXRlLnAuZGF0YV90eXBlID0gU1NUX0RBVEFfUDsKKwl0ZW1wbGF0ZS5zLnNpemUgPSBtb2R1bGUtPmluZm8uc2NyYXRjaF9zaXplOworCXRlbXBsYXRlLnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwl0ZW1wbGF0ZS5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisKKwltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKKwlpZiAobW9kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CisKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkJImVycm9yOiBibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKKwkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CisJCWNhc2UgU1NUX0hTV19JUkFNOgorCQkJcmFtID0gZHNwLT5hZGRyLmxwZTsKKwkJCWJsb2NrX2RhdGEub2Zmc2V0ID0KKwkJCQlibG9jay0+cmFtX29mZnNldCArIGRzcC0+YWRkci5pcmFtX29mZnNldDsKKwkJCWJsb2NrX2RhdGEudHlwZSA9IFNTVF9NRU1fSVJBTTsKKwkJCWJyZWFrOworCQljYXNlIFNTVF9IU1dfRFJBTToKKwkJCXJhbSA9IGRzcC0+YWRkci5scGU7CisJCQlibG9ja19kYXRhLm9mZnNldCA9IGJsb2NrLT5yYW1fb2Zmc2V0OworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9EUkFNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGJhZCB0eXBlIDB4JXggZm9yIGJsb2NrIDB4JXhcbiIsCisJCQkJYmxvY2stPnR5cGUsIGNvdW50KTsKKwkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlibG9ja19kYXRhLnNpemUgPSBibG9jay0+c2l6ZTsKKwkJYmxvY2tfZGF0YS5kYXRhX3R5cGUgPSBTU1RfREFUQV9NOworCQlibG9ja19kYXRhLmRhdGEgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jayk7CisJCWJsb2NrX2RhdGEuZGF0YV9vZmZzZXQgPSBibG9ja19kYXRhLmRhdGEgLSBmdy0+ZG1hX2J1ZjsKKworCQlkZXZfZGJnKGRzcC0+ZGV2LCAiY29weSBmaXJtd2FyZSBibG9jayAlZCB0eXBlIDB4JXggIgorCQkJInNpemUgMHgleCA9PT4gcmFtICVwIG9mZnNldCAweCV4XG4iLAorCQkJY291bnQsIGJsb2NrLT50eXBlLCBibG9jay0+c2l6ZSwgcmFtLAorCQkJYmxvY2stPnJhbV9vZmZzZXQpOworCisJCXNzdF9tb2R1bGVfaW5zZXJ0X2ZpeGVkX2Jsb2NrKG1vZCwgJmJsb2NrX2RhdGEpOworCisJCWJsb2NrID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spICsgYmxvY2stPnNpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19wYXJzZV9md19pbWFnZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpCit7CisJc3RydWN0IGZ3X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzc3RfbW9kdWxlICpzY3JhdGNoOworCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGU7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IHNzdF9mdy0+ZHNwOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBzc3RfZnctPnByaXZhdGU7CisJaW50IHJldCwgY291bnQ7CisKKwkvKiBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YSBwb2ludGVyICovCisJaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKilzc3RfZnctPmRtYV9idWY7CisKKwkvKiB2ZXJpZnkgRlcgKi8KKwlpZiAoKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIFNTVF9IU1dfRldfU0lHTiwgNCkgIT0gMCkgfHwKKwkJKHNzdF9mdy0+c2l6ZSAhPSBoZWFkZXItPmZpbGVfc2l6ZSArIHNpemVvZigqaGVhZGVyKSkpIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBpbnZhbGlkIGZ3IHNpZ24vZmlsZXNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiaGVhZGVyIHNpemU9MHgleCBtb2R1bGVzPTB4JXggZm10PTB4JXggc2l6ZT0lenVcbiIsCisJCWhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCisJCWhlYWRlci0+ZmlsZV9mb3JtYXQsIHNpemVvZigqaGVhZGVyKSk7CisKKwkvKiBwYXJzZSBlYWNoIG1vZHVsZSAqLworCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kbWFfYnVmICsgc2l6ZW9mKCpoZWFkZXIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGhlYWRlci0+bW9kdWxlczsgY291bnQrKykgeworCisJCS8qIG1vZHVsZSAqLworCQlyZXQgPSBoc3dfcGFyc2VfbW9kdWxlKGRzcCwgc3N0X2Z3LCBtb2R1bGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBpbnZhbGlkIG1vZHVsZSAlZFxuIiwgY291bnQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltb2R1bGUgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKSArIG1vZHVsZS0+bW9kX3NpemU7CisJfQorCisJLyogYWxsb2NhdGUgcGVyc2lzdGVudC9zY3JhdGNoIG1lbSByZWdpb25zICovCisJc2NyYXRjaCA9IHNzdF9tZW1fYmxvY2tfYWxsb2Nfc2NyYXRjaChkc3ApOworCWlmIChzY3JhdGNoID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoaHN3LCBzY3JhdGNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwl1MzIgaXNyOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7CisKKwkvKiBJbnRlcnJ1cHQgYXJyaXZlZCwgY2hlY2sgc3JjICovCisJaXNyID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7CisJaWYgKGlzciAmIFNTVF9JU1JYX0RPTkUpIHsKKwkJdHJhY2Vfc3N0X2lycV9kb25lKGlzciwKKwkJCXNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpKTsKKworCQkvKiBNYXNrIERvbmUgaW50ZXJydXB0IGJlZm9yZSByZXR1cm4gKi8KKwkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQlTU1RfSU1SWF9ET05FLCBTU1RfSU1SWF9ET05FKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCWlmIChpc3IgJiBTU1RfSVNSWF9CVVNZKSB7CisJCXRyYWNlX3NzdF9pcnFfYnVzeShpc3IsCisJCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JTVJYKSk7CisKKwkJLyogTWFzayBCdXN5IGludGVycnVwdCBiZWZvcmUgcmV0dXJuICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0lNUlhfQlVTWSwgU1NUX0lNUlhfQlVTWSk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisKKwlzcGluX3VubG9jaygmc3N0LT5zcGlubG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaHN3X2Jvb3Qoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwkvKiBzZWxlY3QgU1NQMSAxOS4yTUh6IGJhc2UgY2xvY2ssIFNTUCBjbG9jayAwLCB0dXJuIG9mZiBMb3cgUG93ZXIgQ2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1MxSU9DUyB8IFNTVF9DU1JfU0JDUzEgfCBTU1RfQ1NSX0xQQ1MsIDB4MCk7CisKKwkvKiBzdGFsbCBEU1AgY29yZSwgc2V0IGNsayB0byAxOTIvOTZNaHogKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LAorCQlTU1RfQ1NSLCBTU1RfQ1NSX1NUQUxMIHwgU1NUX0NTUl9EQ1NfTUFTSywKKwkJU1NUX0NTUl9TVEFMTCB8IFNTVF9DU1JfRENTKDQpKTsKKworCS8qIFNldCAyNE1IeiBNQ0xLLCBwcmV2ZW50IGxvY2FsIGNsb2NrIGdhdGluZywgZW5hYmxlIFNTUDAgY2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ0xLQ1RMLAorCQlTU1RfQ0xLQ1RMX01BU0sgfCBTU1RfQ0xLQ1RMX0RDUExDRyB8IFNTVF9DTEtDVExfU0NPRTAsCisJCVNTVF9DTEtDVExfTUFTSyB8IFNTVF9DTEtDVExfRENQTENHIHwgU1NUX0NMS0NUTF9TQ09FMCk7CisKKwkvKiBkaXNhYmxlIERNQSBmaW5pc2ggZnVuY3Rpb24gZm9yIFNTUDAgJiBTU1AxICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUjIsIFNTVF9DU1IyX1NERkRfU1NQMSwKKwkJU1NUX0NTUjJfU0RGRF9TU1AxKTsKKworCS8qIGVuYWJsZSBETUEgZW5naW5lIDAsMSBhbGwgY2hhbm5lbHMgdG8gYWNjZXNzIGhvc3QgbWVtb3J5ICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0hETUMsCisJCVNTVF9IRE1DX0hEREExKDB4ZmYpICB8IFNTVF9IRE1DX0hEREEwKDB4ZmYpLAorCQlTU1RfSERNQ19IRERBMSgweGZmKSB8IFNTVF9IRE1DX0hEREEwKDB4ZmYpKTsKKworCS8qIGRpc2FibGUgYWxsIGNsb2NrIGdhdGluZyAqLworCXdyaXRlbCgweDAsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCS8qIHNldCBEU1AgdG8gUlVOICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUiwgU1NUX0NTUl9TVEFMTCwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgaHN3X3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJLyogcHV0IERTUCBpbnRvIHJlc2V0IGFuZCBzdGFsbCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IsCisJCVNTVF9DU1JfUlNUIHwgU1NUX0NTUl9TVEFMTCwgU1NUX0NTUl9SU1QgfCBTU1RfQ1NSX1NUQUxMKTsKKworCS8qIGtlZXAgaW4gcmVzZXQgZm9yIDEwbXMgKi8KKwltZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwsIFNTVF9DU1JfU1RBTEwpOworfQorCitzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIHsKKwl1MzIgc3RhcnQ7CisJdTMyIGVuZDsKKwlpbnQgYmxvY2tzOworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7Cit9OworCisvKiBseW54IHBvaW50IEFEU1AgbWVtIHJlZ2lvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIGxwX3JlZ2lvbltdID0geworCXsweDAwMDAwLCAweDQwMDAwLCA4LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0wIC0gOCAqIDMya0IgKi8KKwl7MHg0MDAwMCwgMHg4MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMSAtIDggKiAzMmtCICovCisJezB4ODAwMDAsIDB4RTAwMDAsIDEyLCBTU1RfTUVNX0lSQU19LCAvKiBJLVNSQU0gLSAxMiAqIDMya0IgKi8KK307CisKKy8qIHdpbGQgY2F0IHBvaW50IEFEU1AgbWVtIHJlZ2lvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIHdwdF9yZWdpb25bXSA9IHsKKwl7MHgwMDAwMCwgMHg0MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCAtIDggKiAzMmtCICovCisJezB4NDAwMDAsIDB4ODAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTEgLSA4ICogMzJrQiAqLworCXsweDgwMDAwLCAweEEwMDAwLCA0LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0yIC0gNCAqIDMya0IgKi8KKwl7MHhBMDAwMCwgMHhGMDAwMCwgMTAsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDEwICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3RydWN0IHNzdF9kc3AgKnNzdCwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJLyogQURTUCBEUkFNICYgSVJBTSAqLworCXNzdC0+YWRkci5scGVfYmFzZSA9IHBkYXRhLT5scGVfYmFzZTsKKwlzc3QtPmFkZHIubHBlID0gaW9yZW1hcChwZGF0YS0+bHBlX2Jhc2UsIHBkYXRhLT5scGVfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIubHBlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEFEU1AgUENJIE1NSU8gY29uZmlnIHNwYWNlICovCisJc3N0LT5hZGRyLnBjaV9jZmcgPSBpb3JlbWFwKHBkYXRhLT5wY2ljZmdfYmFzZSwgcGRhdGEtPnBjaWNmZ19zaXplKTsKKwlpZiAoIXNzdC0+YWRkci5wY2lfY2ZnKSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNTVCBTaGltICovCisJc3N0LT5hZGRyLnNoaW0gPSBzc3QtPmFkZHIubHBlICsgc3N0LT5hZGRyLnNoaW1fb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGhzd19ibG9ja19nZXRfYml0KHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwl1MzIgYml0ID0gMCwgc2hpZnQgPSAwOworCisJc3dpdGNoIChibG9jay0+dHlwZSkgeworCWNhc2UgU1NUX01FTV9EUkFNOgorCQlzaGlmdCA9IDE2OworCQlicmVhazsKKwljYXNlIFNTVF9NRU1fSVJBTToKKwkJc2hpZnQgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwliaXQgPSAxIDw8IChibG9jay0+aW5kZXggKyBzaGlmdCk7CisKKwlyZXR1cm4gYml0OworfQorCisvKiBlbmFibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZW5hYmxlKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYmxvY2stPmRzcDsKKwl1MzIgYml0LCB2YWw7CisKKwlpZiAoYmxvY2stPnVzZXJzKysgPiAwKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoYmxvY2stPmRzcC0+ZGV2LCAiIGVuYWJsZWQgYmxvY2sgJWQ6JWQgYXQgb2Zmc2V0IDB4JXhcbiIsCisJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOworCisJdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCWJpdCA9IGhzd19ibG9ja19nZXRfYml0KGJsb2NrKTsKKwl3cml0ZWwodmFsICYgfmJpdCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCisJLyogd2FpdCAxOCBEU1AgY2xvY2sgdGlja3MgKi8KKwl1ZGVsYXkoMTApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRpc2FibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZGlzYWJsZShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJsb2NrLT5kc3A7CisJdTMyIGJpdCwgdmFsOworCisJaWYgKC0tYmxvY2stPnVzZXJzID4gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGJsb2NrLT5kc3AtPmRldiwgIiBkaXNhYmxlZCBibG9jayAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7CisKKwl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7CisJYml0ID0gaHN3X2Jsb2NrX2dldF9iaXQoYmxvY2spOworCXdyaXRlbCh2YWwgfCBiaXQsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9ibG9ja19vcHMgc3N0X2hzd19vcHMgPSB7CisJLmVuYWJsZSA9IGhzd19ibG9ja19lbmFibGUsCisJLmRpc2FibGUgPSBoc3dfYmxvY2tfZGlzYWJsZSwKK307CisKK3N0YXRpYyBpbnQgaHN3X2VuYWJsZV9zaGltKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJaW50IHRyaWVzID0gMTA7CisJdTMyIHJlZzsKKworCS8qIGVuYWJsZSBzaGltICovCisJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfU0hJTV9QTV9SRUcpOworCXdyaXRlbChyZWcgJiB+MHgzLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9TSElNX1BNX1JFRyk7CisKKwkvKiBjaGVjayB0aGF0IEFEU1Agc2hpbSBpcyBlbmFibGVkICovCisJd2hpbGUgKHRyaWVzLS0pIHsKKwkJcmVnID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSKTsKKwkJaWYgKHJlZyAhPSAweGZmZmZmZmZmKQorCQkJcmV0dXJuIDA7CisKKwkJbXNsZWVwKDEpOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGhzd19pbml0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCWNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHJldCA9IC1FTk9ERVYsIGksIGosIHJlZ2lvbl9jb3VudDsKKwl1MzIgb2Zmc2V0LCBzaXplOworCisJZGV2ID0gc3N0LT5kZXY7CisKKwlzd2l0Y2ggKHNzdC0+aWQpIHsKKwljYXNlIFNTVF9ERVZfSURfTFlOWF9QT0lOVDoKKwkJcmVnaW9uID0gbHBfcmVnaW9uOworCQlyZWdpb25fY291bnQgPSBBUlJBWV9TSVpFKGxwX3JlZ2lvbik7CisJCXNzdC0+YWRkci5pcmFtX29mZnNldCA9IFNTVF9MUF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0xQX1NISU1fT0ZGU0VUOworCQlicmVhazsKKwljYXNlIFNTVF9ERVZfSURfV0lMRENBVF9QT0lOVDoKKwkJcmVnaW9uID0gd3B0X3JlZ2lvbjsKKwkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRSh3cHRfcmVnaW9uKTsKKwkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX1dQVF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX1dQVF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtZW0gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3N0LCBwZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGVuYWJsZSB0aGUgRFNQIFNISU0gKi8KKwlyZXQgPSBoc3dfZW5hYmxlX3NoaW0oc3N0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERTUCBEMCBhbmQgcmVzZXQgU0hJTVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBFbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLCAweDMsIDB4MCk7CisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUkQsCisJCSgweDMgfCAweDEgPDwgMTYgfCAweDMgPDwgMjEpLCAweDApOworCisJLyogcmVnaXN0ZXIgRFNQIG1lbW9yeSBibG9ja3MgLSBpZGVhbGx5IHdlIHNob3VsZCBnZXQgdGhpcyBmcm9tIEFDUEkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVnaW9uX2NvdW50OyBpKyspIHsKKwkJb2Zmc2V0ID0gcmVnaW9uW2ldLnN0YXJ0OworCQlzaXplID0gKHJlZ2lvbltpXS5lbmQgLSByZWdpb25baV0uc3RhcnQpIC8gcmVnaW9uW2ldLmJsb2NrczsKKworCQkvKiByZWdpc3RlciBpbmRpdmlkdWFsIG1lbW9yeSBibG9ja3MgKi8KKwkJZm9yIChqID0gMDsgaiA8IHJlZ2lvbltpXS5ibG9ja3M7IGorKykgeworCQkJc3N0X21lbV9ibG9ja19yZWdpc3Rlcihzc3QsIG9mZnNldCwgc2l6ZSwKKwkJCQlyZWdpb25baV0udHlwZSwgJnNzdF9oc3dfb3BzLCBqLCBzc3QpOworCQkJb2Zmc2V0ICs9IHNpemU7CisJCX0KKwl9CisKKwkvKiBzZXQgZGVmYXVsdCBwb3dlciBnYXRpbmcgbWFzayAqLworCXdyaXRlbCgweDAsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCXNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3N0KTsKKwlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBoYXN3ZWxsX29wcyA9IHsKKwkucmVzZXQgPSBoc3dfcmVzZXQsCisJLmJvb3QgPSBoc3dfYm9vdCwKKwkud3JpdGUgPSBzc3Rfc2hpbTMyX3dyaXRlLAorCS5yZWFkID0gc3N0X3NoaW0zMl9yZWFkLAorCS53cml0ZTY0ID0gc3N0X3NoaW0zMl93cml0ZTY0LAorCS5yZWFkNjQgPSBzc3Rfc2hpbTMyX3JlYWQ2NCwKKwkucmFtX3JlYWQgPSBzc3RfbWVtY3B5X2Zyb21pb18zMiwKKwkucmFtX3dyaXRlID0gc3N0X21lbWNweV90b2lvXzMyLAorCS5pcnFfaGFuZGxlciA9IGhzd19pcnEsCisJLmluaXQgPSBoc3dfaW5pdCwKKwkuZnJlZSA9IGhzd19mcmVlLAorCS5wYXJzZV9mdyA9IGhzd19wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuYwpAQCAtMCwwICsxLDE3ODUgQEAKKy8qCisgKiAgSW50ZWwgU1NUIEhhc3dlbGwvQnJvYWR3ZWxsIElQQyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworLyogR2xvYmFsIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19HTEJfVFlQRV9TSElGVAkyNAorI2RlZmluZSBJUENfR0xCX1RZUEVfTUFTSwkoMHgxZiA8PCBJUENfR0xCX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19HTEJfVFlQRSh4KQkJKHggPDwgSVBDX0dMQl9UWVBFX1NISUZUKQorCisvKiBHbG9iYWwgTWVzc2FnZSAtIFJlcGx5ICovCisjZGVmaW5lIElQQ19HTEJfUkVQTFlfU0hJRlQJMAorI2RlZmluZSBJUENfR0xCX1JFUExZX01BU0sJKDB4MWYgPDwgSVBDX0dMQl9SRVBMWV9TSElGVCkKKyNkZWZpbmUgSVBDX0dMQl9SRVBMWV9UWVBFKHgpCSh4IDw8IElQQ19HTEJfUkVQTFlfVFlQRV9TSElGVCkKKworLyogU3RyZWFtIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19TVFJfVFlQRV9TSElGVAkyMAorI2RlZmluZSBJUENfU1RSX1RZUEVfTUFTSwkoMHhmIDw8IElQQ19TVFJfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUUl9UWVBFKHgpCQkoeCA8PCBJUENfU1RSX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSURfU0hJRlQJMTYKKyNkZWZpbmUgSVBDX1NUUl9JRF9NQVNLCQkoMHhmIDw8IElQQ19TVFJfSURfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSUQoeCkJCSh4IDw8IElQQ19TVFJfSURfU0hJRlQpCisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gUmVwbHkgKi8KKyNkZWZpbmUgSVBDX1NUUl9SRVBMWV9TSElGVAkwCisjZGVmaW5lIElQQ19TVFJfUkVQTFlfTUFTSwkoMHgxZiA8PCBJUENfU1RSX1JFUExZX1NISUZUKQorCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSAtIEdlbmVyaWMgKi8KKyNkZWZpbmUgSVBDX1NUR19UWVBFX1NISUZUCTEyCisjZGVmaW5lIElQQ19TVEdfVFlQRV9NQVNLCSgweGYgPDwgSVBDX1NUR19UWVBFX1NISUZUKQorI2RlZmluZSBJUENfU1RHX1RZUEUoeCkJCSh4IDw8IElQQ19TVEdfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRF9TSElGVAkxMAorI2RlZmluZSBJUENfU1RHX0lEX01BU0sJCSgweDMgPDwgSVBDX1NUR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRCh4KQkJKHggPDwgSVBDX1NUR19JRF9TSElGVCkKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgLSBSZXBseSAqLworI2RlZmluZSBJUENfU1RHX1JFUExZX1NISUZUCTAKKyNkZWZpbmUgSVBDX1NUR19SRVBMWV9NQVNLCSgweDFmIDw8IElQQ19TVEdfUkVQTFlfU0hJRlQpCisKKy8qIERlYnVnIExvZyBNZXNzYWdlIC0gR2VuZXJpYyAqLworI2RlZmluZSBJUENfTE9HX09QX1NISUZUCTIwCisjZGVmaW5lIElQQ19MT0dfT1BfTUFTSwkJKDB4ZiA8PCBJUENfTE9HX09QX1NISUZUKQorI2RlZmluZSBJUENfTE9HX09QX1RZUEUoeCkJKHggPDwgSVBDX0xPR19PUF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRF9TSElGVAkxNgorI2RlZmluZSBJUENfTE9HX0lEX01BU0sJCSgweGYgPDwgSVBDX0xPR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRCh4KQkJKHggPDwgSVBDX0xPR19JRF9TSElGVCkKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAobXNlY3MpICovCisjZGVmaW5lIElQQ19USU1FT1VUX01TRUNTCTMwMAorI2RlZmluZSBJUENfQk9PVF9NU0VDUwkJMjAwCisjZGVmaW5lIElQQ19NU0dfV0FJVAkJMAorI2RlZmluZSBJUENfTVNHX05PV0FJVAkJMQorCisvKiBGaXJtd2FyZSBSZWFkeSBNZXNzYWdlICovCisjZGVmaW5lIElQQ19GV19SRUFEWQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgSVBDX1NUQVRVU19NQVNLCQkoMHgzIDw8IDMwKQorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorI2RlZmluZSBJUENfTUFYX1NUUkVBTVMJCTQKKworLyogTWFpbGJveCAqLworI2RlZmluZSBJUENfTUFYX01BSUxCT1hfQllURVMJMjU2CisKKy8qIEdsb2JhbCBNZXNzYWdlIC0gVHlwZXMgYW5kIFJlcGxpZXMgKi8KK2VudW0gaXBjX2dsYl90eXBlIHsKKwlJUENfR0xCX0dFVF9GV19WRVJTSU9OID0gMCwJCS8qIFJldHJpZXZlcyBmaXJtd2FyZSB2ZXJzaW9uICovCisJSVBDX0dMQl9QRVJGT1JNQU5DRV9NT05JVE9SID0gMSwJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBhY3Rpb25zICovCisJSVBDX0dMQl9BTExPQ0FURV9TVFJFQU0gPSAzLAkJLyogUmVxdWVzdCB0byBhbGxvY2F0ZSBuZXcgc3RyZWFtICovCisJSVBDX0dMQl9GUkVFX1NUUkVBTSA9IDQsCQkvKiBSZXF1ZXN0IHRvIGZyZWUgc3RyZWFtICovCisJSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTID0gNSwJLyogUmV0cmlldmVzIGZpcm13YXJlIGNhcGFiaWxpdGllcyAqLworCUlQQ19HTEJfU1RSRUFNX01FU1NBR0UgPSA2LAkJLyogTWVzc2FnZSBkaXJlY3RlZCB0byBzdHJlYW0gb3IgaXRzIHN0YWdlcyAqLworCS8qIFJlcXVlc3QgdG8gc3RvcmUgZmlybXdhcmUgY29udGV4dCBkdXJpbmcgRDAtPkQzIHRyYW5zaXRpb24gKi8KKwlJUENfR0xCX1JFUVVFU1RfRFVNUCA9IDcsCisJLyogUmVxdWVzdCB0byByZXN0b3JlIGZpcm13YXJlIGNvbnRleHQgZHVyaW5nIEQzLT5EMCB0cmFuc2l0aW9uICovCisJSVBDX0dMQl9SRVNUT1JFX0NPTlRFWFQgPSA4LAorCUlQQ19HTEJfR0VUX0RFVklDRV9GT1JNQVRTID0gOSwJCS8qIFNldCBkZXZpY2UgZm9ybWF0ICovCisJSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMgPSAxMCwJLyogR2V0IGRldmljZSBmb3JtYXQgKi8KKwlJUENfR0xCX1NIT1JUX1JFUExZID0gMTEsCisJSVBDX0dMQl9FTlRFUl9EWF9TVEFURSA9IDEyLAorCUlQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPID0gMTMsCS8qIFJlcXVlc3QgbWl4ZXIgc3RyZWFtIHBhcmFtcyAqLworCUlQQ19HTEJfREVCVUdfTE9HX01FU1NBR0UgPSAxNCwJCS8qIE1lc3NhZ2UgdG8gb3IgZnJvbSB0aGUgZGVidWcgbG9nZ2VyLiAqLworCUlQQ19HTEJfUkVRVUVTVF9UUkFOU0ZFUiA9IDE2LCAJCS8qIDwgUmVxdWVzdCBUcmFuc2ZlciBmb3IgaG9zdCAqLworCUlQQ19HTEJfTUFYX0lQQ19NRVNTQUdFX1RZUEUgPSAxNywJLyogTWF4aW11bSBtZXNzYWdlIG51bWJlciAqLworfTsKKworZW51bSBpcGNfZ2xiX3JlcGx5IHsKKwlJUENfR0xCX1JFUExZX1NVQ0NFU1MgPSAwLAkJLyogVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gKi8KKwlJUENfR0xCX1JFUExZX0VSUk9SX0lOVkFMSURfUEFSQU0gPSAxLAkvKiBJbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkLiAqLworCUlQQ19HTEJfUkVQTFlfVU5LTk9XTl9NRVNTQUdFX1RZUEUgPSAyLAkvKiBVa25vd24gbWVzc2FnZSB0eXBlIHdhcyByZXNjZWl2ZWQuICovCisJSVBDX0dMQl9SRVBMWV9PVVRfT0ZfUkVTT1VSQ0VTID0gMywJLyogTm8gcmVzb3VyY2VzIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICovCisJSVBDX0dMQl9SRVBMWV9CVVNZID0gNCwJCQkvKiBUaGUgc3lzdGVtIG9yIHJlc291cmNlIGlzIGJ1c3kuICovCisJSVBDX0dMQl9SRVBMWV9QRU5ESU5HID0gNSwJCS8qIFRoZSBhY3Rpb24gd2FzIHNjaGVkdWxlZCBmb3IgcHJvY2Vzc2luZy4gICovCisJSVBDX0dMQl9SRVBMWV9GQUlMVVJFID0gNiwJCS8qIENyaXRpY2FsIGVycm9yIGhhcHBlbmVkLiAqLworCUlQQ19HTEJfUkVQTFlfSU5WQUxJRF9SRVFVRVNUID0gNywJLyogUmVxdWVzdCBjYW4gbm90IGJlIGNvbXBsZXRlZC4gKi8KKwlJUENfR0xCX1JFUExZX1NUQUdFX1VOSU5JVElBTElaRUQgPSA4LAkvKiBQcm9jZXNzaW5nIHN0YWdlIHdhcyB1bmluaXRpYWxpemVkLiAqLworCUlQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EID0gOSwJCS8qIFJlcXVpcmVkIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQuICovCisJSVBDX0dMQl9SRVBMWV9TT1VSQ0VfTk9UX1NUQVJURUQgPSAxMCwJLyogU291cmNlIHdhcyBub3Qgc3RhcnRlZC4gKi8KK307CisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gVHlwZXMgKi8KK2VudW0gaXBjX3N0cl9vcGVyYXRpb24geworCUlQQ19TVFJfUkVTRVQgPSAwLAorCUlQQ19TVFJfUEFVU0UgPSAxLAorCUlQQ19TVFJfUkVTVU1FID0gMiwKKwlJUENfU1RSX1NUQUdFX01FU1NBR0UgPSAzLAorCUlQQ19TVFJfTk9USUZJQ0FUSU9OID0gNCwKKwlJUENfU1RSX01BWF9NRVNTQUdFCit9OworCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSBUeXBlcyAqLworZW51bSBpcGNfc3RnX29wZXJhdGlvbiB7CisJSVBDX1NUR19HRVRfVk9MVU1FID0gMCwKKwlJUENfU1RHX1NFVF9WT0xVTUUsCisJSVBDX1NUR19TRVRfV1JJVEVfUE9TSVRJT04sCisJSVBDX1NUR19TRVRfRlhfRU5BQkxFLAorCUlQQ19TVEdfU0VUX0ZYX0RJU0FCTEUsCisJSVBDX1NUR19TRVRfRlhfR0VUX1BBUkFNLAorCUlQQ19TVEdfU0VUX0ZYX1NFVF9QQVJBTSwKKwlJUENfU1RHX1NFVF9GWF9HRVRfSU5GTywKKwlJUENfU1RHX01VVEVfTE9PUEJBQ0ssCisJSVBDX1NUR19NQVhfTUVTU0FHRQorfTsKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgVHlwZXMgRm9yIE5vdGlmaWNhdGlvbiovCitlbnVtIGlwY19zdGdfb3BlcmF0aW9uX25vdGlmeSB7CisJSVBDX1BPU0lUSU9OX0NIQU5HRUQgPSAwLAorCUlQQ19TVEdfR0xJVENILAorCUlQQ19TVEdfTUFYX05PVElGWQorfTsKKworZW51bSBpcGNfZ2xpdGNoX3R5cGUgeworCUlQQ19HTElUQ0hfVU5ERVJSVU4gPSAxLAorCUlQQ19HTElUQ0hfREVDT0RFUl9FUlJPUiwKKwlJUENfR0xJVENIX0RPVUJMRURfV1JJVEVfUE9TLAorCUlQQ19HTElUQ0hfTUFYCit9OworCisvKiBEZWJ1ZyBDb250cm9sICovCitlbnVtIGlwY19kZWJ1Z19vcGVyYXRpb24geworCUlQQ19ERUJVR19FTkFCTEVfTE9HID0gMCwKKwlJUENfREVCVUdfRElTQUJMRV9MT0cgPSAxLAorCUlQQ19ERUJVR19SRVFVRVNUX0xPR19EVU1QID0gMiwKKwlJUENfREVCVUdfTk9USUZZX0xPR19EVU1QID0gMywKKwlJUENfREVCVUdfTUFYX0RFQlVHX0xPRworfTsKKworLyogRmlybXdhcmUgUmVhZHkgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19md19yZWFkeSB7CisJdTMyIGluYm94X29mZnNldDsKKwl1MzIgb3V0Ym94X29mZnNldDsKKwl1MzIgaW5ib3hfc2l6ZTsKKwl1MzIgb3V0Ym94X3NpemU7CisJdTMyIGZ3X2luZm9fc2l6ZTsKKwl1OCBmd19pbmZvWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwY19tZXNzYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIGhlYWRlcjsKKworCS8qIGRpcmVjdGlvbiB3cnQgaG9zdCBDUFUgKi8KKwljaGFyIHR4X2RhdGFbSVBDX01BWF9NQUlMQk9YX0JZVEVTXTsKKwlzaXplX3QgdHhfc2l6ZTsKKwljaGFyIHJ4X2RhdGFbSVBDX01BWF9NQUlMQk9YX0JZVEVTXTsKKwlzaXplX3Qgcnhfc2l6ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCWJvb2wgcGVuZGluZzsKKwlib29sIGNvbXBsZXRlOworCWJvb2wgd2FpdDsKKwlpbnQgZXJybm87Cit9OworCitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzdzsKKworLyogU3RyZWFtIGluZm9tYXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X3N0cmVhbSB7CisJLyogY29uZmlndXJhdGlvbiAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fYWxsb2NfcmVxIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSByZXBseTsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxIGZyZWVfcmVxOworCisJLyogTWl4ZXIgaW5mbyAqLworCXUzMiBtdXRlX3ZvbHVtZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKworCS8qIHJ1bnRpbWUgaW5mbyAqLworCXN0cnVjdCBzc3RfaHN3ICpoc3c7CisJaW50IGhvc3RfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBOb3RpZmljYXRpb24gd29yayAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwl1MzIgaGVhZGVyOworCisJLyogUG9zaXRpb24gaW5mbyBmcm9tIERTUCAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fc2V0X3Bvc2l0aW9uIHdwb3M7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gcnBvczsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dsaXRjaF9wb3NpdGlvbiBnbGl0Y2g7CisKKwkvKiBWb2x1bWUgaW5mbyAqLworCXN0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHZvbF9yZXE7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qIEZXIGxvZyByaW5nIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtIHsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhOworCXVuc2lnbmVkIGNoYXIgKnJpbmdfZGVzY3I7CisJaW50IHBhZ2VzOworCWludCBzaXplOworCisJLyogTm90aWZpY2F0aW9uIHdvcmsgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZGVyc193YWl0X3E7CisJc3RydWN0IG11dGV4IHJ3X211dGV4OworCisJdTMyIGxhc3RfcG9zOworCXUzMiBjdXJyX3BvczsKKwl1MzIgcmVhZGVyX3BvczsKKworCS8qIGZ3IGxvZyBjb25maWcgKi8KKwl1MzIgY29uZmlnW1NTVF9IU1dfRldfTE9HX0NPTkZJR19EV09SRFNdOworCisJc3RydWN0IHNzdF9oc3cgKmhzdzsKK307CisKKy8qIFNTVCBIYXN3ZWxsIElQQyBkYXRhICovCitzdHJ1Y3Qgc3N0X2hzdyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9wY207CisKKwkvKiBGVyBjb25maWcgKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7CisJc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24gdmVyc2lvbjsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaDsKKwlib29sIGZ3X2RvbmU7CisKKwkvKiBzdHJlYW0gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbV9saXN0OworCisJLyogZ2xvYmFsIG1peGVyICovCisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IG1peGVyX2luZm87CisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZV90eXBlOworCXUzMiBjdXJ2ZV9kdXJhdGlvbjsKKwl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgbXV0ZV92b2x1bWVbU1NUX0hTV19OT19DSEFOTkVMU107CisKKwkvKiBEWCAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSBkeDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCWJvb2wgc2h1dGRvd247CisKKwkvKiBJUEMgbWVzc2FnaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgcnhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X2xpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF90eHE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0eF90aHJlYWQ7CisJc3RydWN0IGt0aHJlYWRfd29ya2VyIGt3b3JrZXI7CisJc3RydWN0IGt0aHJlYWRfd29yayBrd29yazsKKwlib29sIHBlbmRpbmc7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisKKwkvKiBGVyBsb2cgc3RyZWFtICovCisJc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSBsb2dfc3RyZWFtOworfTsKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX0dMQl9UWVBFX01BU0spID4+IElQQ19HTEJfVFlQRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfcmVwbHkodTMyIG1zZykKK3sKKwlyZXR1cm4gKG1zZyAmIElQQ19HTEJfUkVQTFlfTUFTSykgPj4gSVBDX0dMQl9SRVBMWV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9zdHJlYW1fdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9UWVBFX01BU0spID4+ICBJUENfU1RSX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RhZ2VfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUR19UWVBFX01BU0spID4+ICBJUENfU1RHX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXRfc3RhZ2VfdHlwZSh1MzIgbXNnLCB1MzIgdHlwZSkKK3sKKwlyZXR1cm4gKG1zZyAmIH5JUENfU1RHX1RZUEVfTUFTSykgKworCQkodHlwZSA8PCBJUENfU1RHX1RZUEVfU0hJRlQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZ2V0X3N0cmVhbV9pZCh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9JRF9NQVNLKSA+PiAgSVBDX1NUUl9JRF9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9ub3RpZnlfcmVhc29uKHUzMiBtc2cpCit7CisJcmV0dXJuIChtc2cgJiBJUENfU1RHX1RZUEVfTUFTSykgPj4gSVBDX1NUR19UWVBFX1NISUZUOworfQorCit1MzIgY3JlYXRlX2NoYW5uZWxfbWFwKGVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpCit7CisJc3dpdGNoIChjb25maWcpIHsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfTU9OTzoKKwkJcmV0dXJuICgweEZGRkZGRkYwIHwgU1NUX0hTV19DSEFOTkVMX0NFTlRFUik7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHX1NURVJFTzoKKwkJcmV0dXJuICgweEZGRkZGRjAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA0KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzJfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGRkZGMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA0KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xGRSA8PCA4ICkpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR18zX1BPSU5UXzA6CisJCXJldHVybiAoMHhGRkZGRjAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR18zX1BPSU5UXzE6CisJCXJldHVybiAoMHhGRkZGMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRkUgPDwgMTIpKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfUVVBVFJPOgorCQlyZXR1cm4gKDB4RkZGRjAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVF9TVVJST1VORCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EIDw8IDEyKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzRfUE9JTlRfMDoKKwkJcmV0dXJuICgweEZGRkYwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0NFTlRFUl9TVVJST1VORCA8PCAxMikpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR181X1BPSU5UXzA6CisJCXJldHVybiAoMHhGRkYwMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EIDw8IDEyKQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EIDw8IDE2KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGMDAwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0NFTlRFUgorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlQgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgPDwgMTIpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTYpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEZFIDw8IDIwKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHX0RVQUxfTU9OTzoKKwkJcmV0dXJuICgweEZGRkZGRjAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUIDw8IDQpKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKmdldF9zdHJlYW1fYnlfaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlpbnQgc3RyZWFtX2lkKQoreworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHJlYW0sICZoc3ctPnN0cmVhbV9saXN0LCBub2RlKSB7CisJCWlmIChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA9PSBzdHJlYW1faWQpCisJCQlyZXR1cm4gc3RyZWFtOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcGNfc2hpbV9kYmcoc3RydWN0IHNzdF9oc3cgKmhzdywgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7CisJdTMyIGlzciwgaXBjZCwgaW1yeCwgaXBjeDsKKworCWlwY3ggPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JU1JYKTsKKwlpcGNkID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJaW1yeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2Vycihoc3ctPmRldiwgImlwYzogLS0lcy0tIGlwY3ggMHglOC44eCBpc3IgMHglOC44eCBpcGNkIDB4JTguOHggaW1yeCAweCU4Ljh4XG4iLAorCQl0ZXh0LCBpcGN4LCBpc3IsIGlwY2QsIGltcngpOworfQorCisvKiBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnX2dldF9lbXB0eShzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eSgmaHN3LT5lbXB0eV9saXN0KSkgeworCQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoc3ctPmVtcHR5X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwKKwkJCWxpc3QpOworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBpcGNfdHhfbXNncyhzdHJ1Y3Qga3RocmVhZF93b3JrICp3b3JrKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNzdF9oc3csIGt3b3JrKTsKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpcGN4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoJmhzdy0+dHhfbGlzdCkgfHwgaHN3LT5wZW5kaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgdGhlIERTUCBpcyBidXN5IHdlIHdpbGwgVFggbWVzc2FnZXMgYWZ0ZXIgSVJRICovCisJaXBjeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGhzdy0+ZHNwLCBTU1RfSVBDWCk7CisJaWYgKGlwY3ggJiBTU1RfSVBDWF9CVVNZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmaHN3LT50eF9saXN0LCBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCisJbGlzdF9tb3ZlKCZtc2ctPmxpc3QsICZoc3ctPnJ4X2xpc3QpOworCisJLyogc2VuZCB0aGUgbWVzc2FnZSAqLworCXNzdF9kc3Bfb3V0Ym94X3dyaXRlKGhzdy0+ZHNwLCBtc2ctPnR4X2RhdGEsIG1zZy0+dHhfc2l6ZSk7CisJc3N0X2RzcF9pcGNfbXNnX3R4KGhzdy0+ZHNwLCBtc2ctPmhlYWRlciB8IFNTVF9JUENYX0JVU1kpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgdm9pZCB0eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJbXNnLT5jb21wbGV0ZSA9IHRydWU7CisJdHJhY2VfaXBjX3JlcGx5KCJjb21wbGV0ZWQiLCBtc2ctPmhlYWRlcik7CisKKwlpZiAoIW1zZy0+d2FpdCkKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT5lbXB0eV9saXN0KTsKKwllbHNlCisJCXdha2VfdXAoJm1zZy0+d2FpdHEpOworfQorCitzdGF0aWMgaW50IHR4X3dhaXRfZG9uZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywKKwl2b2lkICpyeF9kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIHdhaXQgZm9yIERTUCBjb21wbGV0aW9uIChpbiBhbGwgY2FzZXMgYXRtIGluYyBwZW5kaW5nKSAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAorCQltc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlwY19zaGltX2RiZyhoc3csICJtZXNzYWdlIHRpbWVvdXQiKTsKKworCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yIG1lc3NhZ2UgdGltZW91dCBmb3IiLCBtc2ctPmhlYWRlcik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKworCQkvKiBjb3B5IHRoZSBkYXRhIHJldHVybmVkIGZyb20gRFNQICovCisJCWlmIChtc2ctPnJ4X3NpemUpCisJCQltZW1jcHkocnhfZGF0YSwgbXNnLT5yeF9kYXRhLCBtc2ctPnJ4X3NpemUpOworCQlyZXQgPSBtc2ctPmVycm5vOworCX0KKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLCB2b2lkICp0eF9kYXRhLAorCXNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJbXNnID0gbXNnX2dldF9lbXB0eShoc3cpOworCWlmIChtc2cgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAodHhfYnl0ZXMpCisJCW1lbWNweShtc2ctPnR4X2RhdGEsIHR4X2RhdGEsIHR4X2J5dGVzKTsKKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5wZW5kaW5nID0gZmFsc2U7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmaHN3LT5rd29ya2VyLCAmaHN3LT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHR4X3dhaXRfZG9uZShoc3csIG1zZywgcnhfZGF0YSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfd2FpdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIHJ4X2RhdGEsCisJCXJ4X2J5dGVzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfbm93YWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIsCisJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIE5VTEwsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoc3dfZndfcmVhZHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7CisJdTMyIG9mZnNldDsKKworCW9mZnNldCA9IChoZWFkZXIgJiAweDFGRkZGRkZGKSA8PCAzOworCisJZGV2X2RiZyhoc3ctPmRldiwgImlwYzogRFNQIGlzIHJlYWR5IDB4JTguOHggb2Zmc2V0ICVkXG4iLAorCQloZWFkZXIsIG9mZnNldCk7CisKKwkvKiBjb3B5IGRhdGEgZnJvbSB0aGUgRFNQIEZXIHJlYWR5IG9mZnNldCAqLworCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgJmZ3X3JlYWR5LCBvZmZzZXQsIHNpemVvZihmd19yZWFkeSkpOworCisJc3N0X2RzcF9tYWlsYm94X2luaXQoaHN3LT5kc3AsIGZ3X3JlYWR5LmluYm94X29mZnNldCwKKwkJZndfcmVhZHkuaW5ib3hfc2l6ZSwgZndfcmVhZHkub3V0Ym94X29mZnNldCwKKwkJZndfcmVhZHkub3V0Ym94X3NpemUpOworCisJaHN3LT5ib290X2NvbXBsZXRlID0gdHJ1ZTsKKwl3YWtlX3VwKCZoc3ctPmJvb3Rfd2FpdCk7CisKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIG1haWxib3ggdXBzdHJlYW0gMHgleCAtIHNpemUgMHgleFxuIiwKKwkJZndfcmVhZHkuaW5ib3hfb2Zmc2V0LCBmd19yZWFkeS5pbmJveF9zaXplKTsKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIG1haWxib3ggZG93bnN0cmVhbSAweCV4IC0gc2l6ZSAweCV4XG4iLAorCQlmd19yZWFkeS5vdXRib3hfb2Zmc2V0LCBmd19yZWFkeS5vdXRib3hfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19ub3RpZmljYXRpb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0gPSBjb250YWluZXJfb2Yod29yaywKKwkJCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSwgbm90aWZ5X3dvcmspOworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uICpnbGl0Y2ggPSAmc3RyZWFtLT5nbGl0Y2g7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gKnBvcyA9ICZzdHJlYW0tPnJwb3M7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHN0cmVhbS0+aHN3OworCXUzMiByZWFzb247CisKKwlyZWFzb24gPSBtc2dfZ2V0X25vdGlmeV9yZWFzb24oc3RyZWFtLT5oZWFkZXIpOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIElQQ19TVEdfR0xJVENIOgorCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJEU1Agc3RyZWFtIHVuZGVyL292ZXJydW4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlzc3RfZHNwX2luYm94X3JlYWQoaHN3LT5kc3AsIGdsaXRjaCwgc2l6ZW9mKCpnbGl0Y2gpKTsKKworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZ2xpdGNoICVkIHBvcyAweCV4IHdyaXRlIHBvcyAweCV4XG4iLAorCQkJZ2xpdGNoLT5nbGl0Y2hfdHlwZSwgZ2xpdGNoLT5wcmVzZW50X3BvcywKKwkJCWdsaXRjaC0+d3JpdGVfcG9zKTsKKwkJYnJlYWs7CisKKwljYXNlIElQQ19QT1NJVElPTl9DSEFOR0VEOgorCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJEU1Agc3RyZWFtIHBvc2l0aW9uIGNoYW5nZWQgZm9yIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGhzdy0+ZHNwLCBwb3MsIHNpemVvZihwb3MpKTsKKworCQlpZiAoc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24pCisJCQlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbihzdHJlYW0sIHN0cmVhbS0+cGRhdGEpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogdW5rbm93biBub3RpZmljYXRpb24gMHgleFxuIiwKKwkJCXN0cmVhbS0+aGVhZGVyKTsKKwkJYnJlYWs7CisJfQorCisJLyogdGVsbCBEU1AgdGhhdCBub3RpZmljYXRpb24gaGFzIGJlZW4gaGFuZGxlZCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lQQ0QsCisJCVNTVF9JUENEX0JVU1kgfCBTU1RfSVBDRF9ET05FLCBTU1RfSVBDRF9ET05FKTsKKworCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lNUlgsIFNTVF9JTVJYX0JVU1ksIDApOworfQorCitzdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpyZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJLyogY2xlYXIgcmVwbHkgYml0cyAmIHN0YXR1cyBiaXRzICovCisJaGVhZGVyICY9IH4oSVBDX1NUQVRVU19NQVNLIHwgSVBDX0dMQl9SRVBMWV9NQVNLKTsKKworCWlmIChsaXN0X2VtcHR5KCZoc3ctPnJ4X2xpc3QpKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogcnggbGlzdCBlbXB0eSBidXQgcmVjZWl2ZWQgMHgleFxuIiwKKwkJCWhlYWRlcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobXNnLCAmaHN3LT5yeF9saXN0LCBsaXN0KSB7CisJCWlmIChtc2ctPmhlYWRlciA9PSBoZWFkZXIpCisJCQlyZXR1cm4gbXNnOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoc3dfc3RyZWFtX3VwZGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKKwl1MzIgaGVhZGVyID0gbXNnLT5oZWFkZXIgJiB+KElQQ19TVEFUVVNfTUFTSyB8IElQQ19HTEJfUkVQTFlfTUFTSyk7CisJdTMyIHN0cmVhbV9pZCA9IG1zZ19nZXRfc3RyZWFtX2lkKGhlYWRlcik7CisJdTMyIHN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc3RyZWFtX21zZykgeworCWNhc2UgSVBDX1NUUl9TVEFHRV9NRVNTQUdFOgorCWNhc2UgSVBDX1NUUl9OT1RJRklDQVRJT046CisJY2FzZSBJUENfU1RSX1JFU0VUOgorCQlicmVhazsKKwljYXNlIElQQ19TVFJfUEFVU0U6CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJzdHJlYW0gcGF1c2VkIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfU1RSX1JFU1VNRToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigic3RyZWFtIHJ1bm5pbmciLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHN3X3Byb2Nlc3NfcmVwbHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1MzIgcmVwbHkgPSBtc2dfZ2V0X2dsb2JhbF9yZXBseShoZWFkZXIpOworCisJdHJhY2VfaXBjX3JlcGx5KCJwcm9jZXNzaW5nIC0tPiIsIGhlYWRlcik7CisKKwltc2cgPSByZXBseV9maW5kX21zZyhoc3csIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGNhbid0IGZpbmQgbWVzc2FnZSBoZWFkZXIiLCBoZWFkZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBmaXJzdCBwcm9jZXNzIHRoZSBoZWFkZXIgKi8KKwlzd2l0Y2ggKHJlcGx5KSB7CisJY2FzZSBJUENfR0xCX1JFUExZX1BFTkRJTkc6CisJCXRyYWNlX2lwY19wZW5kaW5nX3JlcGx5KCJyZWNlaXZlZCIsIGhlYWRlcik7CisJCW1zZy0+cGVuZGluZyA9IHRydWU7CisJCWhzdy0+cGVuZGluZyA9IHRydWU7CisJCXJldHVybiAxOworCWNhc2UgSVBDX0dMQl9SRVBMWV9TVUNDRVNTOgorCQlpZiAobXNnLT5wZW5kaW5nKSB7CisJCQl0cmFjZV9pcGNfcGVuZGluZ19yZXBseSgiY29tcGxldGVkIiwgaGVhZGVyKTsKKwkJCXNzdF9kc3BfaW5ib3hfcmVhZChoc3ctPmRzcCwgbXNnLT5yeF9kYXRhLAorCQkJCW1zZy0+cnhfc2l6ZSk7CisJCQloc3ctPnBlbmRpbmcgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCS8qIGNvcHkgZGF0YSBmcm9tIHRoZSBEU1AgKi8KKwkJCXNzdF9kc3Bfb3V0Ym94X3JlYWQoaHN3LT5kc3AsIG1zZy0+cnhfZGF0YSwKKwkJCQltc2ctPnJ4X3NpemUpOworCQl9CisJCWJyZWFrOworCS8qIHRoZXNlIHdpbGwgYmUgcmFyZSAtIGJ1dCB1c2VmdWwgZm9yIGRlYnVnICovCisJY2FzZSBJUENfR0xCX1JFUExZX1VOS05PV05fTUVTU0FHRV9UWVBFOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiB1bmtub3duIG1lc3NhZ2UgdHlwZSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUJBRE1TRzsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX09VVF9PRl9SRVNPVVJDRVM6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IG91dCBvZiByZXNvdXJjZXMiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVOT01FTTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX0JVU1k6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHJlcGx5IGJ1c3kiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVCVVNZOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfRkFJTFVSRToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogcmVwbHkgZmFpbHVyZSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfU1RBR0VfVU5JTklUSUFMSVpFRDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogc3RhZ2UgdW5pbml0aWFsaXplZCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiByZXBseSBub3QgZm91bmQiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX1NPVVJDRV9OT1RfU1RBUlRFRDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogc291cmNlIG5vdCBzdGFydGVkIiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSVBDX0dMQl9SRVBMWV9JTlZBTElEX1JFUVVFU1Q6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGludmFsaWQgcmVxdWVzdCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfRVJST1JfSU5WQUxJRF9QQVJBTToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogaW52YWxpZCBwYXJhbWV0ZXIiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogdW5rbm93biByZXBseSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwkvKiB1cGRhdGUgYW55IHN0cmVhbSBzdGF0ZXMgKi8KKwloc3dfc3RyZWFtX3VwZGF0ZShoc3csIG1zZyk7CisKKwkvKiB3YWtlIHVwIGFuZCByZXR1cm4gdGhlIGVycm9yIGlmIHdlIGhhdmUgd2FpdGVycyBvbiB0aGlzIG1lc3NhZ2UgPyAqLworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCXR4X21zZ19yZXBseV9jb21wbGV0ZShoc3csIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX21lc3NhZ2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwl1MzIgc3RyZWFtX21zZywgc3RyZWFtX2lkLCBzdGFnZV90eXBlOworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCWludCBoYW5kbGVkID0gMDsKKworCXN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisJc3RyZWFtX2lkID0gbXNnX2dldF9zdHJlYW1faWQoaGVhZGVyKTsKKwlzdGFnZV90eXBlID0gbXNnX2dldF9zdGFnZV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybiBoYW5kbGVkOworCisJc3RyZWFtLT5oZWFkZXIgPSBoZWFkZXI7CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19TVFJfU1RBR0VfTUVTU0FHRToKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdGFnZSBtc2cgbm90IGltcGxlbWVudGVkIDB4JTguOHhcbiIsCisJCQloZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19TVFJfTk9USUZJQ0FUSU9OOgorCQlzY2hlZHVsZV93b3JrKCZzdHJlYW0tPm5vdGlmeV93b3JrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogaGFuZGxlIHBlbmRpbmcgbWVzc2FnZSBjb21wbGV0ZSByZXF1ZXN0ICovCisJCWhhbmRsZWQgPSBoc3dfcHJvY2Vzc19yZXBseShoc3csIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaW50IGhzd19sb2dfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXUzMiBvcGVyYXRpb24gPSAoaGVhZGVyICYgSVBDX0xPR19PUF9NQVNLKSA+PiAgSVBDX0xPR19PUF9TSElGVDsKKwlzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtICpzdHJlYW0gPSAmaHN3LT5sb2dfc3RyZWFtOworCWludCByZXQgPSAxOworCisJaWYgKG9wZXJhdGlvbiAhPSBJUENfREVCVUdfUkVRVUVTVF9MT0dfRFVNUCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LAorCQkJImVycm9yOiBsb2cgbXNnIG5vdCBpbXBsZW1lbnRlZCAweCU4Ljh4XG4iLCBoZWFkZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRleF9sb2NrKCZzdHJlYW0tPnJ3X211dGV4KTsKKwlzdHJlYW0tPmxhc3RfcG9zID0gc3RyZWFtLT5jdXJyX3BvczsKKwlzc3RfZHNwX2luYm94X3JlYWQoCisJCWhzdy0+ZHNwLCAmc3RyZWFtLT5jdXJyX3Bvcywgc2l6ZW9mKHN0cmVhbS0+Y3Vycl9wb3MpKTsKKwltdXRleF91bmxvY2soJnN0cmVhbS0+cndfbXV0ZXgpOworCisJc2NoZWR1bGVfd29yaygmc3RyZWFtLT5ub3RpZnlfd29yayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhzd19wcm9jZXNzX25vdGlmaWNhdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBoc3ctPmRzcDsKKwl1MzIgdHlwZSwgaGVhZGVyOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCXR5cGUgPSBtc2dfZ2V0X2dsb2JhbF90eXBlKGhlYWRlcik7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgicHJvY2Vzc2luZyAtLT4iLCBoZWFkZXIpOworCisJLyogRlcgUmVhZHkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwlpZiAoIWhzdy0+Ym9vdF9jb21wbGV0ZSAmJiBoZWFkZXIgJiBJUENfRldfUkVBRFkpIHsKKwkJaHN3X2Z3X3JlYWR5KGhzdywgaGVhZGVyKTsKKwkJcmV0dXJuIGhhbmRsZWQ7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUENfR0xCX0dFVF9GV19WRVJTSU9OOgorCWNhc2UgSVBDX0dMQl9BTExPQ0FURV9TVFJFQU06CisJY2FzZSBJUENfR0xCX0ZSRUVfU1RSRUFNOgorCWNhc2UgSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTOgorCWNhc2UgSVBDX0dMQl9SRVFVRVNUX0RVTVA6CisJY2FzZSBJUENfR0xCX0dFVF9ERVZJQ0VfRk9STUFUUzoKKwljYXNlIElQQ19HTEJfU0VUX0RFVklDRV9GT1JNQVRTOgorCWNhc2UgSVBDX0dMQl9FTlRFUl9EWF9TVEFURToKKwljYXNlIElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPOgorCWNhc2UgSVBDX0dMQl9NQVhfSVBDX01FU1NBR0VfVFlQRToKKwljYXNlIElQQ19HTEJfUkVTVE9SRV9DT05URVhUOgorCWNhc2UgSVBDX0dMQl9TSE9SVF9SRVBMWToKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBtZXNzYWdlIHR5cGUgJWQgaGVhZGVyIDB4JXhcbiIsCisJCQl0eXBlLCBoZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfU1RSRUFNX01FU1NBR0U6CisJCWhhbmRsZWQgPSBoc3dfc3RyZWFtX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfREVCVUdfTE9HX01FU1NBR0U6CisJCWhhbmRsZWQgPSBoc3dfbG9nX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHVuZXhwZWN0ZWQgdHlwZSAlZCBoZHIgMHglOC44eFxuIiwKKwkJCXR5cGUsIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHNzdCk7CisJdTMyIGlwY3gsIGlwY2Q7CisJaW50IGhhbmRsZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpcGN4ID0gc3N0X2RzcF9pcGNfbXNnX3J4KGhzdy0+ZHNwKTsKKwlpcGNkID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisKKwkvKiByZXBseSBtZXNzYWdlIGZyb20gRFNQICovCisJaWYgKGlwY3ggJiBTU1RfSVBDWF9ET05FKSB7CisKKwkJLyogSGFuZGxlIEltbWVkaWF0ZSByZXBseSBmcm9tIERTUCBDb3JlICovCisJCWhhbmRsZWQgPSBoc3dfcHJvY2Vzc19yZXBseShoc3csIGlwY3gpOworCisJCWlmIChoYW5kbGVkID4gMCkgeworCQkJLyogY2xlYXIgRE9ORSBiaXQgLSB0ZWxsIERTUCB3ZSBoYXZlIGNvbXBsZXRlZCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lQQ1gsCisJCQkJU1NUX0lQQ1hfRE9ORSwgMCk7CisKKwkJCS8qIHVubWFzayBEb25lIGludGVycnVwdCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQkJU1NUX0lNUlhfRE9ORSwgMCk7CisJCX0KKwl9CisKKwkvKiBuZXcgbWVzc2FnZSBmcm9tIERTUCAqLworCWlmIChpcGNkICYgU1NUX0lQQ0RfQlVTWSkgeworCisJCS8qIEhhbmRsZSBOb3RpZmljYXRpb24gYW5kIERlbGF5ZWQgcmVwbHkgZnJvbSBEU1AgQ29yZSAqLworCQloYW5kbGVkID0gaHN3X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGhzdyk7CisKKwkJLyogY2xlYXIgQlVTWSBiaXQgYW5kIHNldCBET05FIGJpdCAtIGFjY2VwdCBuZXcgbWVzc2FnZXMgKi8KKwkJaWYgKGhhbmRsZWQgPiAwKSB7CisJCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCwKKwkJCQlTU1RfSVBDRF9CVVNZIHwgU1NUX0lQQ0RfRE9ORSwgU1NUX0lQQ0RfRE9ORSk7CisKKwkJCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQkJU1NUX0lNUlhfQlVTWSwgMCk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBjb250aW51ZSB0byBzZW5kIGFueSByZW1haW5pbmcgbWVzc2FnZXMuLi4gKi8KKwlxdWV1ZV9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmtlciwgJmhzdy0+a3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX0ZXX1ZFUlNJT04pLAorCQlOVUxMLCAwLCB2ZXJzaW9uLCBzaXplb2YoKnZlcnNpb24pKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgdmVyc2lvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTWl4ZXIgQ29udHJvbHMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBzdHJlYW0sIHN0YWdlX2lkLCBjaGFubmVsLAorCQkmc3RyZWFtLT5tdXRlX3ZvbHVtZVtjaGFubmVsXSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgc3RyZWFtLCBzdGFnZV9pZCwgY2hhbm5lbCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBjYW4ndCB1bm11dGUgc3RyZWFtICVkIGNoYW5uZWwgJWRcbiIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgY2hhbm5lbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RyZWFtLT5tdXRlW2NoYW5uZWxdID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3VubXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKQorCit7CisJaW50IHJldDsKKworCXN0cmVhbS0+bXV0ZVtjaGFubmVsXSA9IDA7CisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHN0cmVhbSwgc3RhZ2VfaWQsIGNoYW5uZWwsCisJCXN0cmVhbS0+bXV0ZV92b2x1bWVbY2hhbm5lbF0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogY2FuJ3QgdW5tdXRlIHN0cmVhbSAlZCBjaGFubmVsICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIGNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLCB1MzIgKnZvbHVtZSkKK3sKKwlpZiAoY2hhbm5lbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCisJCXN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF0sIHNpemVvZih2b2x1bWUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZV9jdXJ2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1NjQgY3VydmVfZHVyYXRpb24sCisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSkKK3sKKwkvKiBjdXJ2ZSBkdXJhdGlvbiBpbiBzdGVwcyBvZiAxMDBucyAqLworCXN0cmVhbS0+dm9sX3JlcS5jdXJ2ZV9kdXJhdGlvbiA9IGN1cnZlX2R1cmF0aW9uOworCXN0cmVhbS0+dm9sX3JlcS5jdXJ2ZV90eXBlID0gY3VydmU7CisKKwlyZXR1cm4gMDsKK30KKworLyogc3RyZWFtIHZvbHVtZSAqLworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyIHZvbHVtZSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxOworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJzZXQgc3RyZWFtIHZvbHVtZSIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCWlmIChjaGFubmVsID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyZWFtLT5tdXRlW2NoYW5uZWxdKSB7CisJCXN0cmVhbS0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCXJldHVybiAwOworCX0KKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX1NUUkVBTV9NRVNTQUdFKSB8CisJCUlQQ19TVFJfVFlQRShJUENfU1RSX1NUQUdFX01FU1NBR0UpOworCWhlYWRlciB8PSAoc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisJaGVhZGVyIHw9IChJUENfU1RHX1NFVF9WT0xVTUUgPDwgSVBDX1NUR19UWVBFX1NISUZUKTsKKwloZWFkZXIgfD0gKHN0YWdlX2lkIDw8IElQQ19TVEdfSURfU0hJRlQpOworCisJcmVxID0gJnN0cmVhbS0+dm9sX3JlcTsKKwlyZXEtPmNoYW5uZWwgPSBjaGFubmVsOworCXJlcS0+dGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIHJlcSwgc2l6ZW9mKCpyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBzdHJlYW0gdm9sdW1lIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX211dGUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgc3RhZ2VfaWQsIGNoYW5uZWwsCisJCSZoc3ctPm11dGVfdm9sdW1lW2NoYW5uZWxdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNzdF9oc3dfbWl4ZXJfc2V0X3ZvbHVtZShoc3csIHN0YWdlX2lkLCBjaGFubmVsLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB1bm11dGUgbWl4ZXIgY2hhbm5lbCAlZFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhzdy0+bXV0ZVtjaGFubmVsXSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX3VubXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCBzdGFnZV9pZCwgY2hhbm5lbCwKKwkJaHN3LT5taXhlcl9pbmZvLnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzW2NoYW5uZWxdKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB1bm11dGUgbWl4ZXIgY2hhbm5lbCAlZFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhzdy0+bXV0ZVtjaGFubmVsXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwKKwl1MzIgKnZvbHVtZSkKK3sKKwlpZiAoY2hhbm5lbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCisJCWhzdy0+bWl4ZXJfaW5mby52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tjaGFubmVsXSwKKwkJc2l6ZW9mKCp2b2x1bWUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lX2N1cnZlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJIHU2NCBjdXJ2ZV9kdXJhdGlvbiwgZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSkKK3sKKwkvKiBjdXJ2ZSBkdXJhdGlvbiBpbiBzdGVwcyBvZiAxMDBucyAqLworCWhzdy0+Y3VydmVfZHVyYXRpb24gPSBjdXJ2ZV9kdXJhdGlvbjsKKwloc3ctPmN1cnZlX3R5cGUgPSBjdXJ2ZTsKKworCXJldHVybiAwOworfQorCisvKiBnbG9iYWwgbWl4ZXIgdm9sdW1lICovCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSByZXE7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInNldCBtaXhlciB2b2x1bWUiLCB2b2x1bWUpOworCisJLyogc2V0IGJvdGggYXQgc2FtZSB0aW1lID8gKi8KKwlpZiAoY2hhbm5lbCA9PSAyKSB7CisJCWlmIChoc3ctPm11dGVbMF0gJiYgaHN3LT5tdXRlWzFdKSB7CisJCQloc3ctPm11dGVfdm9sdW1lWzBdID0gaHN3LT5tdXRlX3ZvbHVtZVsxXSA9IHZvbHVtZTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGhzdy0+bXV0ZVswXSkKKwkJCXJlcS5jaGFubmVsID0gMTsKKwkJZWxzZSBpZiAoaHN3LT5tdXRlWzFdKQorCQkJcmVxLmNoYW5uZWwgPSAwOworCQllbHNlCisJCQlyZXEuY2hhbm5lbCA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJLyogc2V0IG9ubHkgMSBjaGFubmVsICovCisJCWlmIChoc3ctPm11dGVbY2hhbm5lbF0pIHsKKwkJCWhzdy0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXEuY2hhbm5lbCA9IGNoYW5uZWw7CisJfQorCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChoc3ctPm1peGVyX2luZm8ubWl4ZXJfaHdfaWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisJaGVhZGVyIHw9IChJUENfU1RHX1NFVF9WT0xVTUUgPDwgSVBDX1NUR19UWVBFX1NISUZUKTsKKwloZWFkZXIgfD0gKHN0YWdlX2lkIDw8IElQQ19TVEdfSURfU0hJRlQpOworCisJcmVxLmN1cnZlX2R1cmF0aW9uID0gaHN3LT5jdXJ2ZV9kdXJhdGlvbjsKKwlyZXEuY3VydmVfdHlwZSA9IGhzdy0+Y3VydmVfdHlwZTsKKwlyZXEudGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBtaXhlciB2b2x1bWUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RyZWFtIEFQSSAqLworc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzc3RfaHN3X3N0cmVhbV9uZXcoc3RydWN0IHNzdF9oc3cgKmhzdywgaW50IGlkLAorCXUzMiAoKm5vdGlmeV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpLAorCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW07CisKKwlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfYWRkKCZzdHJlYW0tPm5vZGUsICZoc3ctPnN0cmVhbV9saXN0KTsKKwlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbiA9IG5vdGlmeV9wb3NpdGlvbjsKKwlzdHJlYW0tPnBkYXRhID0gZGF0YTsKKwlzdHJlYW0tPmhzdyA9IGhzdzsKKwlzdHJlYW0tPmhvc3RfaWQgPSBpZDsKKworCS8qIHdvcmsgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gbWVzc2FnZXMgKi8KKwlJTklUX1dPUksoJnN0cmVhbS0+bm90aWZ5X3dvcmssIGhzd19ub3RpZmljYXRpb25fd29yayk7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZnJlZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwl1MzIgaGVhZGVyOworCWludCByZXQgPSAwOworCisJLyogZG9udCBmcmVlIERTUCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJZ290byBvdXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGZyZWUiLCBzdHJlYW0tPmhvc3RfaWQpOworCisJc3RyZWFtLT5mcmVlX3JlcS5zdHJlYW1faWQgPSBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZDsKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9GUkVFX1NUUkVBTSk7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCAmc3RyZWFtLT5mcmVlX3JlcSwKKwkJc2l6ZW9mKHN0cmVhbS0+ZnJlZV9yZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZyZWUgc3RyZWFtICVkIGZhaWxlZFxuIiwKKwkJCXN0cmVhbS0+ZnJlZV9yZXEuc3RyZWFtX2lkKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJdHJhY2VfaHN3X3N0cmVhbV9mcmVlX3JlcShzdHJlYW0sICZzdHJlYW0tPmZyZWVfcmVxKTsKKworb3V0OgorCWxpc3RfZGVsKCZzdHJlYW0tPm5vZGUpOworCWtmcmVlKHN0cmVhbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X2JpdGRlcHRoIGJpdHMpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgYml0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuYml0ZGVwdGggPSBiaXRzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGludCBjaGFubmVscykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBjaGFubmVsc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0ZXJlbyBpcyBvbmx5IHN1cHBvcnRlZCBhdG0gKi8KKwlpZiAoY2hhbm5lbHMgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNoX251bSA9IGNoYW5uZWxzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IHJhdGUpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgcmF0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuZnJlcXVlbmN5ID0gcmF0ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBtYXAsCisJZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0Lm1hcCA9IG1hcDsKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNvbmZpZyA9IGNvbmZpZzsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHN0eWxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LmZvcm1hdC5zdHlsZSA9IHN0eWxlOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBiaXRzKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHZhbGlkIGJpdHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LnZhbGlkX2JpdCA9IGJpdHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnBhdGhfaWQgPSBwYXRoX2lkOworCXN0cmVhbS0+cmVxdWVzdC5zdHJlYW1fdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwl0cmFjZV9oc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3Qoc3RyZWFtLCAmc3RyZWFtLT5yZXF1ZXN0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzID0gcmluZ19wdF9hZGRyZXNzOworCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19vZmZzZXQgPSByaW5nX29mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19maXJzdF9wZm4gPSByaW5nX2ZpcnN0X3BmbjsKKworCXRyYWNlX2hzd19zdHJlYW1fYnVmZmVyKHN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZHVsZV9pZCwKKwl1MzIgZW50cnlfcG9pbnQpCit7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCAqbWFwID0gJnN0cmVhbS0+cmVxdWVzdC5tYXA7CisKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBvbmx5IHN1cHBvcnQgaW5pdGlhbCBtb2R1bGUgYXRtICovCisJbWFwLT5tb2R1bGVfZW50cmllc19jb3VudCA9IDE7CisJbWFwLT5tb2R1bGVfZW50cmllc1swXS5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJbWFwLT5tb2R1bGVfZW50cmllc1swXS5lbnRyeV9wb2ludCA9IGVudHJ5X3BvaW50OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHBtZW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucGVyc2lzdGVudF9tZW0ub2Zmc2V0ID0gb2Zmc2V0OworCXN0cmVhbS0+cmVxdWVzdC5wZXJzaXN0ZW50X21lbS5zaXplID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3NtZW1vcnlfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSkKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBzbWVtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnNjcmF0Y2hfbWVtLm9mZnNldCA9IG9mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0uc2l6ZSA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX2NvbW1pdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSAqcmVwbHkgPSAmc3RyZWFtLT5yZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGFsbG9jIiwgc3RyZWFtLT5ob3N0X2lkKTsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0FMTE9DQVRFX1NUUkVBTSk7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAorCQlyZXBseSwgc2l6ZW9mKCpyZXBseSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSAxOworCXRyYWNlX2hzd19zdHJlYW1fYWxsb2NfcmVwbHkoc3RyZWFtKTsKKworCXJldHVybiAwOworfQorCisvKiBTdHJlYW0gSW5mb3JtYXRpb24gLSB0aGVzZSBjYWxscyBjb3VsZCBiZSBpbmxpbmUgYnV0IHdlIHdhbnQgdGhlIElQQworIEFCSSB0byBiZSBvcGFxdWUgdG8gY2xpZW50IFBDTSBkcml2ZXJzIHRvIGNvcGUgd2l0aCBhbnkgZnV0dXJlIEFCSSBjaGFuZ2VzICovCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X2h3X2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X21peGVyX2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+cmVwbHkubWl4ZXJfaHdfaWQ7Cit9CisKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcmVhZF9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5yZXBseS5yZWFkX3Bvc2l0aW9uX3JlZ2lzdGVyX2FkZHJlc3M7Cit9CisKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcG9pbnRlcl9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5yZXBseS5wcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKK30KKwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF9wZWFrX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+PSAyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzdHJlYW0tPnJlcGx5LnBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tjaGFubmVsXTsKK30KKwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF92b2xfcmVnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBjaGFubmVsKQoreworCWlmIChjaGFubmVsID49IDIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF07Cit9CisKK2ludCBzc3RfaHN3X21peGVyX2dldF9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5ICpyZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwlyZXBseSA9ICZoc3ctPm1peGVyX2luZm87CisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPKTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJnZXQgZ2xvYmFsIG1peGVyIGluZm8iLCAwKTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgc3RyZWFtIGluZm8gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cmFjZV9oc3dfbWl4ZXJfaW5mb19yZXBseShyZXBseSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBzdHJlYW0gY29tbWFuZCAqLworc3RhdGljIGludCBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfaHN3ICpoc3csIGludCB0eXBlLAorCWludCBzdHJlYW1faWQsIGludCB3YWl0KQoreworCXUzMiBoZWFkZXI7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfCBJUENfU1RSX1RZUEUodHlwZSk7CisJaGVhZGVyIHw9IChzdHJlYW1faWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgTlVMTCwgMCk7Cit9CisKKy8qIFN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9oc3dfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWludCB3YWl0KQoreworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIHBhdXNlIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUEFVU0UsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCkKK3sKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInN0cmVhbSByZXN1bWUiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKGhzdywgSVBDX1NUUl9SRVNVTUUsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcmVzdW1lIHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfaHN3X3N0cmVhbV9yZXNldChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0LCB0cmllcyA9IDEwOworCisJLyogZG9udCByZXNldCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0IGZvciBwYXVzZSB0byBjb21wbGV0ZSBiZWZvcmUgd2UgcmVzZXQgdGhlIHN0cmVhbSAqLworCXdoaWxlIChzdHJlYW0tPnJ1bm5pbmcgJiYgdHJpZXMtLSkKKwkJbXNsZWVwKDEpOworCWlmICghdHJpZXMpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiByZXNldCBzdHJlYW0gJWQgc3RpbGwgcnVubmluZ1xuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdHJhY2VfaXBjX3JlcXVlc3QoInN0cmVhbSByZXNldCIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX29wZXJhdGlvbnMoaHN3LCBJUENfU1RSX1JFU0VULAorCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHJlc2V0IHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBTdHJlYW0gcG9pbnRlciBwb3NpdGlvbnMgKi8KK2ludCBzc3RfaHN3X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5ycG9zLnBvc2l0aW9uOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3dyaXRlX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIHBvc2l0aW9uKQoreworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX3N0cmVhbV93cml0ZV9wb3NpdGlvbihzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgcG9zaXRpb24pOworCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA8PCBJUENfU1RSX0lEX1NISUZUKTsKKwloZWFkZXIgfD0gKElQQ19TVEdfU0VUX1dSSVRFX1BPU0lUSU9OIDw8IElQQ19TVEdfVFlQRV9TSElGVCk7CisJaGVhZGVyIHw9IChzdGFnZV9pZCA8PCBJUENfU1RHX0lEX1NISUZUKTsKKwlzdHJlYW0tPndwb3MucG9zaXRpb24gPSBwb3NpdGlvbjsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgJnN0cmVhbS0+d3BvcywKKwkJc2l6ZW9mKHN0cmVhbS0+d3BvcykpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSAlZCBzZXQgcG9zaXRpb24gJWQgZmFpbGVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIHBvc2l0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIHBoeXNpY2FsIEJFIGNvbmZpZyAqLworaW50IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwllbnVtIHNzdF9oc3dfZGV2aWNlX2lkIGRldiwgZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIG1jbGssCisJZW51bSBzc3RfaHN3X2RldmljZV9tb2RlIG1vZGUsIHUzMiBjbG9ja19kaXZpZGVyKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19kZXZpY2VfY29uZmlnX3JlcSBjb25maWc7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInNldCBkZXZpY2UgY29uZmlnIiwgZGV2KTsKKworCWNvbmZpZy5zc3BfaW50ZXJmYWNlID0gZGV2OworCWNvbmZpZy5jbG9ja19mcmVxdWVuY3kgPSBtY2xrOworCWNvbmZpZy5tb2RlID0gbW9kZTsKKwljb25maWcuY2xvY2tfZGl2aWRlciA9IGNsb2NrX2RpdmlkZXI7CisKKwl0cmFjZV9oc3dfZGV2aWNlX2NvbmZpZ19yZXEoJmNvbmZpZyk7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMpOworCisJcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIGhlYWRlciwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZyksCisJCU5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBkZXZpY2UgZm9ybWF0cyBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcpOworCisvKiBEWCBDb25maWcgKi8KK2ludCBzc3RfaHN3X2R4X3NldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCWVudW0gc3N0X2hzd19keF9zdGF0ZSBzdGF0ZSwgc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcGx5ICpkeCkKK3sKKwl1MzIgaGVhZGVyLCBzdGF0ZV87CisJaW50IHJldDsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0VOVEVSX0RYX1NUQVRFKTsKKwlzdGF0ZV8gPSBzdGF0ZTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJQTSBlbnRlciBEeCBzdGF0ZSIsIHN0YXRlKTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsICZzdGF0ZV8sIHNpemVvZihzdGF0ZV8pLAorCQlkeCwgc2l6ZW9mKGR4KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImlwYzogZXJyb3Igc2V0IGR4IHN0YXRlICVkIGZhaWxlZFxuIiwgc3RhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoaHN3LT5kZXYsICJpcGM6IGdvdCAlZCBlbnRyeSBudW1iZXJzIGZvciBzdGF0ZSAlZFxuIiwKKwkJZHgtPmVudHJpZXNfbm8sIHN0YXRlKTsKKworCW1lbWNweSgmaHN3LT5keCwgZHgsIHNpemVvZigqZHgpKTsKKwlyZXR1cm4gMDsKK30KKworLyogVXNlZCB0byBzYXZlIHN0YXRlIGludG8gaHN3LT5keF9yZXBseSAqLworaW50IHNzdF9oc3dfZHhfZ2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBpdGVtLAorCXUzMiAqb2Zmc2V0LCB1MzIgKnNpemUsIHUzMiAqc291cmNlKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSAqZHhfbWVtOworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSAqZHhfcmVwbHk7CisJaW50IGVudHJ5X25vOworCisJZHhfcmVwbHkgPSAmaHN3LT5keDsKKwllbnRyeV9ubyA9IGR4X3JlcGx5LT5lbnRyaWVzX25vOworCisJdHJhY2VfaXBjX3JlcXVlc3QoIlBNIGdldCBEeCBzdGF0ZSIsIGVudHJ5X25vKTsKKworCWlmIChpdGVtID49IGVudHJ5X25vKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWR4X21lbSA9ICZkeF9yZXBseS0+bWVtX2luZm9baXRlbV07CisJKm9mZnNldCA9IGR4X21lbS0+b2Zmc2V0OworCSpzaXplID0gZHhfbWVtLT5zaXplOworCSpzb3VyY2UgPSBkeF9tZW0tPnNvdXJjZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zZ19lbXB0eV9saXN0X2luaXQoc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlpbnQgaTsKKworCWhzdy0+bXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwY19tZXNzYWdlKSAqCisJCUlQQ19FTVBUWV9MSVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChoc3ctPm1zZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBJUENfRU1QVFlfTElTVF9TSVpFOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT5tc2dbaV0ud2FpdHEpOworCQlsaXN0X2FkZCgmaHN3LT5tc2dbaV0ubGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaCkKK3sKKwloc3ctPnNjcmF0Y2ggPSBzY3JhdGNoOworfQorCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2hzd19nZXRfZHNwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJcmV0dXJuIGhzdy0+ZHNwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9kc3BfZGV2aWNlIGhzd19kZXYgPSB7CisJLnRocmVhZCA9IGhzd19pcnFfdGhyZWFkLAorCS5vcHMgPSAmaGFzd2VsbF9vcHMsCit9OworCitpbnQgc3N0X2hzd19kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uIHZlcnNpb247CisJc3RydWN0IHNzdF9oc3cgKmhzdzsKKwlzdHJ1Y3Qgc3N0X2Z3ICpoc3dfc3N0X2Z3OworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2luZyBBdWRpbyBEU1AgSVBDXG4iKTsKKworCWhzdyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHN3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhzdyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhzdy0+ZGV2ID0gZGV2OworCUlOSVRfTElTVF9IRUFEKCZoc3ctPnN0cmVhbV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT50eF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT5yeF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT5lbXB0eV9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoc3ctPmJvb3Rfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT53YWl0X3R4cSk7CisKKwlyZXQgPSBtc2dfZW1wdHlfbGlzdF9pbml0KGhzdyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gbGlzdF9lcnI7CisKKwkvKiBzdGFydCB0aGUgSVBDIG1lc3NhZ2UgdGhyZWFkICovCisJaW5pdF9rdGhyZWFkX3dvcmtlcigmaHN3LT5rd29ya2VyKTsKKwloc3ctPnR4X3RocmVhZCA9IGt0aHJlYWRfcnVuKGt0aHJlYWRfd29ya2VyX2ZuLAorCQkJCQkgICAmaHN3LT5rd29ya2VyLAorCQkJCQkgICBkZXZfbmFtZShoc3ctPmRldikpOworCWlmIChJU19FUlIoaHN3LT50eF90aHJlYWQpKSB7CisJCXJldCA9IFBUUl9FUlIoaHN3LT50eF90aHJlYWQpOworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJZ290byBsaXN0X2VycjsKKwl9CisJaW5pdF9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmssIGlwY190eF9tc2dzKTsKKworCWhzd19kZXYudGhyZWFkX2NvbnRleHQgPSBoc3c7CisKKwkvKiBpbml0IFNTVCBzaGltICovCisJaHN3LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZoc3dfZGV2LCBwZGF0YSk7CisJaWYgKGhzdy0+ZHNwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsaXN0X2VycjsKKwl9CisKKwkvKiBrZWVwIHRoZSBEU1AgaW4gcmVzZXQgc3RhdGUgZm9yIGJhc2UgRlcgbG9hZGluZyAqLworCXNzdF9kc3BfcmVzZXQoaHN3LT5kc3ApOworCisJaHN3X3NzdF9mdyA9IHNzdF9md19uZXcoaHN3LT5kc3AsIHBkYXRhLT5mdywgaHN3KTsKKworCWlmIChoc3dfc3N0X2Z3ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2VycjsKKwl9CisKKwkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCisJc3N0X2RzcF9ib290KGhzdy0+ZHNwKTsKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaHN3LT5ib290X3dhaXQsIGhzdy0+Ym9vdF9jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSAtRUlPOworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IEFEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJZ290byBib290X2VycjsKKwl9CisKKwkvKiBnZXQgdGhlIEZXIHZlcnNpb24gKi8KKwlzc3RfaHN3X2Z3X2dldF92ZXJzaW9uKGhzdywgJnZlcnNpb24pOworCWRldl9pbmZvKGhzdy0+ZGV2LCAiRlcgbG9hZGVkOiB0eXBlICVkIC0gdmVyc2lvbjogJWQuJWQgYnVpbGQgJWRcbiIsCisJCXZlcnNpb24udHlwZSwgdmVyc2lvbi5tYWpvciwgdmVyc2lvbi5taW5vciwgdmVyc2lvbi5idWlsZCk7CisKKwkvKiBnZXQgdGhlIGdsb2JhbG1peGVyICovCisJcmV0ID0gc3N0X2hzd19taXhlcl9nZXRfaW5mbyhoc3cpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBzdHJlYW0gaW5mb1xuIik7CisJCWdvdG8gYm9vdF9lcnI7CisJfQorCisJcGRhdGEtPmRzcCA9IGhzdzsKKwlyZXR1cm4gMDsKKworYm9vdF9lcnI6CisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWUoaHN3X3NzdF9mdyk7Citmd19lcnI6CisJc3N0X2RzcF9mcmVlKGhzdy0+ZHNwKTsKKwlrZnJlZShoc3ctPm1zZyk7CitsaXN0X2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfaW5pdCk7CisKK3ZvaWQgc3N0X2hzd19kc3BfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+ZHNwOworCisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWVfYWxsKGhzdy0+ZHNwKTsKKwlzc3RfZHNwX2ZyZWUoaHN3LT5kc3ApOworCWtmcmVlKGhzdy0+c2NyYXRjaCk7CisJa2ZyZWUoaHN3LT5tc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfZnJlZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxNzkyOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuaApAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIEludGVsIFNTVCBIYXN3ZWxsL0Jyb2Fkd2VsbCBJUEMgU3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU1NUX0hBU1dFTExfSVBDX0gKKyNkZWZpbmUgX19TU1RfSEFTV0VMTF9JUENfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBTU1RfSFNXX05PX0NIQU5ORUxTCQkyCisjZGVmaW5lIFNTVF9IU1dfTUFYX0RYX1JFR0lPTlMJCTE0CisKKyNkZWZpbmUgU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEUwkxMgorI2RlZmluZSBTU1RfSFNXX0dMT0JBTF9MT0cJCTE1CisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfSFNXX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTQwMAorI2RlZmluZSBTU1RfSFNXX01BWF9JTkZPX1NJWkUJCTY0CisjZGVmaW5lIFNTVF9IU1dfQlVJTERfSEFTSF9MRU5HVEgJNDAKKworc3RydWN0IHNzdF9oc3c7CitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtOworc3RydWN0IHNzdF9wZGF0YTsKK3N0cnVjdCBzc3RfbW9kdWxlOworZXh0ZXJuIHN0cnVjdCBzc3Rfb3BzIGhhc3dlbGxfb3BzOworCisvKiBTdHJlYW0gQWxsb2NhdGUgUGF0aCBJRCAqLworZW51bSBzc3RfaHN3X3N0cmVhbV9wYXRoX2lkIHsKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX1NTUDBfT1VUID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX1NTUDBfSU4gPSAxLAorCVNTVF9IU1dfU1RSRUFNX1BBVEhfTUFYX1BBVEhfSUQgPSAyLAorfTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFN0cmVhbSBUeXBlICovCitlbnVtIHNzdF9oc3dfc3RyZWFtX3R5cGUgeworCVNTVF9IU1dfU1RSRUFNX1RZUEVfUkVOREVSID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX1NZU1RFTSA9IDEsCisJU1NUX0hTV19TVFJFQU1fVFlQRV9DQVBUVVJFID0gMiwKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX0xPT1BCQUNLID0gMywKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX01BWF9TVFJFQU1fVFlQRSA9IDQsCit9OworCisvKiBTdHJlYW0gQWxsb2NhdGUgU3RyZWFtIEZvcm1hdCAqLworZW51bSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQgeworCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9QQ01fRk9STUFUID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfTVAzX0ZPUk1BVCA9IDEsCisJU1NUX0hTV19TVFJFQU1fRk9STUFUX0FBQ19GT1JNQVQgPSAyLAorCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9NQVhfRk9STUFUX0lEID0gMywKK307CisKKy8qIERldmljZSBJRCAqLworZW51bSBzc3RfaHN3X2RldmljZV9pZCB7CisJU1NUX0hTV19ERVZJQ0VfU1NQXzAgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfU1NQXzEgICA9IDEsCit9OworCisvKiBEZXZpY2UgTWFzdGVyIENsb2NrIEZyZXF1ZW5jeSAqLworZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIHsKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX09GRiAgICAgICAgID0gMCwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfNl9NSFogID0gMSwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMTJfTUhaID0gMiwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMjRfTUhaID0gMywKK307CisKKy8qIERldmljZSBDbG9jayBNYXN0ZXIgKi8KK2VudW0gc3N0X2hzd19kZXZpY2VfbW9kZSB7CisJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfU0xBVkUgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSICA9IDEsCit9OworCisvKiBEWCBQb3dlciBTdGF0ZSAqLworZW51bSBzc3RfaHN3X2R4X3N0YXRlIHsKKwlTU1RfSFNXX0RYX1NUQVRFX0QwICAgICA9IDAsCisJU1NUX0hTV19EWF9TVEFURV9EMSAgICAgPSAxLAorCVNTVF9IU1dfRFhfU1RBVEVfRDMgICAgID0gMywKKwlTU1RfSFNXX0RYX1NUQVRFX01BWAk9IDMsCit9OworCisvKiBBdWRpbyBzdHJlYW0gc3RhZ2UgSURzICovCitlbnVtIHNzdF9oc3dfZnhfc3RhZ2VfaWQgeworCVNTVF9IU1dfU1RBR0VfSURfV0FWRVMgPSAwLAorCVNTVF9IU1dfU1RBR0VfSURfRFRTICAgPSAxLAorCVNTVF9IU1dfU1RBR0VfSURfRE9MQlkgPSAyLAorCVNTVF9IU1dfU1RBR0VfSURfQk9PU1QgPSAzLAorCVNTVF9IU1dfU1RBR0VfSURfTUFYX0ZYX0lECit9OworCisvKiBEWCBTdGF0ZSBUeXBlICovCitlbnVtIHNzdF9oc3dfZHhfdHlwZSB7CisJU1NUX0hTV19EWF9UWVBFX0ZXX0lNQUdFID0gMCwKKwlTU1RfSFNXX0RYX1RZUEVfTUVNT1JZX0RVTVAgPSAxCit9OworCisvKiBWb2x1bWUgQ3VydmUgVHlwZSovCitlbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIHsKKwlTU1RfSFNXX1ZPTFVNRV9DVVJWRV9OT05FID0gMCwKKwlTU1RfSFNXX1ZPTFVNRV9DVVJWRV9GQURFID0gMQorfTsKKworLyogU2FtcGxlIG9yZGVyaW5nICovCitlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHsKKwlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCA9IDAsCisJU1NUX0hTV19JTlRFUkxFQVZJTkdfUEVSX1NBTVBMRSAgPSAxLAorfTsKKworLyogQ2hhbm5lbCBpbmRpY2VzICovCitlbnVtIHNzdF9oc3dfY2hhbm5lbF9pbmRleCB7CisJU1NUX0hTV19DSEFOTkVMX0xFRlQgICAgICAgICAgICA9IDAsCisJU1NUX0hTV19DSEFOTkVMX0NFTlRFUiAgICAgICAgICA9IDEsCisJU1NUX0hTV19DSEFOTkVMX1JJR0hUICAgICAgICAgICA9IDIsCisJU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgICA9IDMsCisJU1NUX0hTV19DSEFOTkVMX0NFTlRFUl9TVVJST1VORCA9IDMsCisJU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EICA9IDQsCisJU1NUX0hTV19DSEFOTkVMX0xGRSAgICAgICAgICAgICA9IDcsCisJU1NUX0hTV19DSEFOTkVMX0lOVkFMSUQgICAgICAgICA9IDB4RiwKK307CisKKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIGNoYW5uZWwgbWFwcy4gKi8KK2VudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyB7CisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19NT05PICAgICAgPSAwLCAvKiBtb25vIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8gICAgPSAxLCAvKiBMICYgUi4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzJfUE9JTlRfMSA9IDIsIC8qIEwsIFIgJiBMRkU7IFBDTSBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfM19QT0lOVF8wID0gMywgLyogTCwgQyAmIFI7IE1QMyAmIEFBQyBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfM19QT0lOVF8xID0gNCwgLyogTCwgQywgUiAmIExGRTsgUENNIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19RVUFUUk8gICAgPSA1LCAvKiBMLCBSLCBMcyAmIFJzOyBQQ00gb25seS4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzRfUE9JTlRfMCA9IDYsIC8qIEwsIEMsIFIgJiBDczsgTVAzICYgQUFDIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR181X1BPSU5UXzAgPSA3LCAvKiBMLCBDLCBSLCBMcyAmIFJzLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8xID0gOCwgLyogTCwgQywgUiwgTHMsIFJzICYgTEZFLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfRFVBTF9NT05PID0gOSwgLyogT25lIGNoYW5uZWwgcmVwbGljYXRlZCBpbiB0d28uICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19JTlZBTElELAorfTsKKworLyogTGlzdCBvZiBzdXBwb3J0ZWQgYml0IGRlcHRocy4gKi8KK2VudW0gc3N0X2hzd19iaXRkZXB0aCB7CisJU1NUX0hTV19ERVBUSF84QklUICA9IDgsCisJU1NUX0hTV19ERVBUSF8xNkJJVCA9IDE2LAorCVNTVF9IU1dfREVQVEhfMjRCSVQgPSAyNCwgLyogRGVmYXVsdC4gKi8KKwlTU1RfSFNXX0RFUFRIXzMyQklUID0gMzIsCisJU1NUX0hTV19ERVBUSF9JTlZBTElEID0gMzMsCit9OworCitlbnVtIHNzdF9oc3dfbW9kdWxlX2lkIHsKKwlTU1RfSFNXX01PRFVMRV9CQVNFX0ZXID0gMHgwLAorCVNTVF9IU1dfTU9EVUxFX01QMyAgICAgPSAweDEsCisJU1NUX0hTV19NT0RVTEVfQUFDXzVfMSA9IDB4MiwKKwlTU1RfSFNXX01PRFVMRV9BQUNfMl8wID0gMHgzLAorCVNTVF9IU1dfTU9EVUxFX1NSQyAgICAgPSAweDQsCisJU1NUX0hTV19NT0RVTEVfV0FWRVMgICA9IDB4NSwKKwlTU1RfSFNXX01PRFVMRV9ET0xCWSAgID0gMHg2LAorCVNTVF9IU1dfTU9EVUxFX0JPT1NUICAgPSAweDcsCisJU1NUX0hTV19NT0RVTEVfTFBBTCAgICA9IDB4OCwKKwlTU1RfSFNXX01PRFVMRV9EVFMgICAgID0gMHg5LAorCVNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFID0gMHhBLAorCVNTVF9IU1dfTU9EVUxFX1BDTV9TWVNURU0gPSAweEIsCisJU1NUX0hTV19NT0RVTEVfUENNX1JFRkVSRU5DRSA9IDB4QywKKwlTU1RfSFNXX01PRFVMRV9QQ00gPSAweEQsCisJU1NUX0hTV19NT0RVTEVfQkxVRVRPT1RIX1JFTkRFUl9NT0RVTEUgPSAweEUsCisJU1NUX0hTV19NT0RVTEVfQkxVRVRPT1RIX0NBUFRVUkVfTU9EVUxFID0gMHhGLAorCVNTVF9IU1dfTUFYX01PRFVMRV9JRCwKK307CisKK2VudW0gc3N0X2hzd19wZXJmb3JtYW5jZV9hY3Rpb24geworCVNTVF9IU1dfUEVSRl9TVEFSVCA9IDAsCisJU1NUX0hTV19QRVJGX1NUT1AgPSAxLAorfTsKKworLyogU1NUIGZpcm13YXJlIG1vZHVsZSBpbmZvICovCitzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfaW5mbyB7CisJdTggbmFtZVtTU1RfSFNXX01BWF9JTkZPX1NJWkVdOworCXU4IHZlcnNpb25bU1NUX0hTV19NQVhfSU5GT19TSVpFXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE1vZHVsZSBlbnRyeSBwb2ludCAqLworc3RydWN0IHNzdF9oc3dfbW9kdWxlX2VudHJ5IHsKKwllbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKwl1MzIgZW50cnlfcG9pbnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBNb2R1bGUgbWFwIC0gYWxpZ25lbWVudCBtYXRjaGVzIERTUCAqLworc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCB7CisJdTggbW9kdWxlX2VudHJpZXNfY291bnQ7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX2VudHJ5IG1vZHVsZV9lbnRyaWVzWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8geworCXUzMiBvZmZzZXQ7CisJdTMyIHNpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3N0X2hzd19meF9lbmFibGUgeworCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgbW9kdWxlX21hcDsKKwlzdHJ1Y3Qgc3N0X2hzd19tZW1vcnlfaW5mbyBwZXJzaXN0ZW50X21lbTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X2dldF9meF9wYXJhbSB7CisJdTMyIHBhcmFtZXRlcl9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X3BlcmZfYWN0aW9uIHsKKwl1MzIgYWN0aW9uOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfcGVyZl9kYXRhIHsKKwl1NjQgdGltZXN0YW1wOworCXU2NCBjeWNsZXM7CisJdTY0IGRhdGF0aW1lOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRlcgdmVyc2lvbiAqLworc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24geworCXU4IGJ1aWxkOworCXU4IG1pbm9yOworCXU4IG1ham9yOworCXU4IHR5cGU7CisJdTggZndfYnVpbGRfaGFzaFtTU1RfSFNXX0JVSUxEX0hBU0hfTEVOR1RIXTsKKwl1MzIgZndfbG9nX3Byb3ZpZGVyc19oYXNoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIHJpbmcgaW5mbyAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHsKKwl1MzIgcmluZ19wdF9hZGRyZXNzOworCXUzMiBudW1fcGFnZXM7CisJdTMyIHJpbmdfc2l6ZTsKKwl1MzIgcmluZ19vZmZzZXQ7CisJdTMyIHJpbmdfZmlyc3RfcGZuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRGVidWcgRHVtcCBMb2cgRW5hYmxlIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19kZWJ1Z19sb2dfZW5hYmxlX3JlcSB7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHJpbmdpbmZvOworCXUzMiBjb25maWdbU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZWJ1ZyBEdW1wIExvZyBSZXBseSAqLworc3RydWN0IHNzdF9oc3dfaXBjX2RlYnVnX2xvZ19yZXBseSB7CisJdTMyIGxvZ19idWZmZXJfYmVnaW5pbmc7CisJdTMyIGxvZ19idWZmZXJfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBnbGl0Y2ggcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uIHsKKwl1MzIgZ2xpdGNoX3R5cGU7CisJdTMyIHByZXNlbnRfcG9zOworCXUzMiB3cml0ZV9wb3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gZ2V0IHBvc2l0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dldF9wb3NpdGlvbiB7CisJdTMyIHBvc2l0aW9uOworCXUzMiBmd19jeWNsZV9jb3VudDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBzZXQgcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fc2V0X3Bvc2l0aW9uIHsKKwl1MzIgcG9zaXRpb247CisJdTMyIGVuZF9vZl9idWZmZXI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gRnJlZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxIHsKKwl1OCBzdHJlYW1faWQ7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTZXQgVm9sdW1lIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHsKKwl1MzIgY2hhbm5lbDsKKwl1MzIgdGFyZ2V0X3ZvbHVtZTsKKwl1NjQgY3VydmVfZHVyYXRpb247CisJdTMyIGN1cnZlX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZXZpY2UgQ29uZmlndXJhdGlvbiBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGV2aWNlX2NvbmZpZ19yZXEgeworCXUzMiBzc3BfaW50ZXJmYWNlOworCXUzMiBjbG9ja19mcmVxdWVuY3k7CisJdTMyIG1vZGU7CisJdTE2IGNsb2NrX2RpdmlkZXI7CisJdTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQXVkaW8gRGF0YSBmb3JtYXRzICovCitzdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGMgeworCXUzMiBmcmVxdWVuY3k7CisJdTMyIGJpdGRlcHRoOworCXUzMiBtYXA7CisJdTMyIGNvbmZpZzsKKwl1MzIgc3R5bGU7CisJdTggY2hfbnVtOworCXU4IHZhbGlkX2JpdDsKKwl1OCByZXNlcnZlZFsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBBbGxvY2F0ZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSB7CisJdTggcGF0aF9pZDsKKwl1OCBzdHJlYW1fdHlwZTsKKwl1OCBmb3JtYXRfaWQ7CisJdTggcmVzZXJ2ZWQ7CisJc3RydWN0IHNzdF9oc3dfYXVkaW9fZGF0YV9mb3JtYXRfaXBjIGZvcm1hdDsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3JpbmcgcmluZ2luZm87CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCBtYXA7CisJc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gcGVyc2lzdGVudF9tZW07CisJc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gc2NyYXRjaF9tZW07CisJdTMyIG51bWJlcl9vZl9ub3RpZmljYXRpb25zOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFJlcGx5ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcGx5IHsKKwl1MzIgc3RyZWFtX2h3X2lkOworCXUzMiBtaXhlcl9od19pZDsgLy8gcmV0dXJucyByYXRlID8/Pz8KKwl1MzIgcmVhZF9wb3NpdGlvbl9yZWdpc3Rlcl9hZGRyZXNzOworCXUzMiBwcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKKwl1MzIgcGVha19tZXRlcl9yZWdpc3Rlcl9hZGRyZXNzW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOworCXUzMiB2b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEdldCBNaXhlciBTdHJlYW0gSW5mbyAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IHsKKwl1MzIgbWl4ZXJfaHdfaWQ7CisJdTMyIHBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgdm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbU1NUX0hTV19OT19DSEFOTkVMU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEWCBTdGF0ZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVxIHsKKwl1OCBzdGF0ZTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERYIFN0YXRlIFJlcGx5IE1lbW9yeSBJbmZvIEl0ZW0gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSB7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKKwl1MzIgc291cmNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRFggU3RhdGUgUmVwbHkgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSB7CisJdTMyIGVudHJpZXNfbm87CisJc3RydWN0IHNzdF9oc3dfaXBjX2R4X21lbW9yeV9pdGVtIG1lbV9pbmZvW1NTVF9IU1dfTUFYX0RYX1JFR0lPTlNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb247CisKKy8qIFNTVCBJbml0ICYgRnJlZSAqLworc3RydWN0IHNzdF9oc3cgKnNzdF9oc3dfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgdTggKmZ3LCBzaXplX3QgZndfbGVuZ3RoLAorCXUzMiBmd19vZmZzZXQpOwordm9pZCBzc3RfaHN3X2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdyk7CitpbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKTsKK3UzMiBjcmVhdGVfY2hhbm5lbF9tYXAoZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZyk7CisKKy8qIFN0cmVhbSBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19zdHJlYW1fbXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKTsKK2ludCBzc3RfaHN3X3N0cmVhbV91bm11dGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCk7CisKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsIHUzMiB2b2x1bWUpOworaW50IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyICp2b2x1bWUpOworCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZV9jdXJ2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1NjQgY3VydmVfZHVyYXRpb24sCisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSk7CisKKy8qIEdsb2JhbCBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19taXhlcl9tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpOworaW50IHNzdF9oc3dfbWl4ZXJfdW5tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpOworCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyICp2b2x1bWUpOworCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lX2N1cnZlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJdTY0IGN1cnZlX2R1cmF0aW9uLCBlbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIGN1cnZlKTsKKworLyogU3RyZWFtIEFQSSAqLworc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzc3RfaHN3X3N0cmVhbV9uZXcoc3RydWN0IHNzdF9oc3cgKmhzdywgaW50IGlkLAorCXUzMiAoKmdldF93cml0ZV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpLAorCXZvaWQgKmRhdGEpOworCitpbnQgc3N0X2hzd19zdHJlYW1fZnJlZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpOworCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pOworCitpbnQgc3N0X2hzd19zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgYml0cyk7CitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJaW50IHJhdGUpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9iaXRzKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19iaXRkZXB0aCBiaXRzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfY2hhbm5lbHMoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IGNoYW5uZWxzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfbWFwX2NvbmZpZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgbWFwLAorCWVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwllbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X21vZHVsZV9pZCBtb2R1bGVfaWQsCisJdTMyIGVudHJ5X3BvaW50KTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfaHdfaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X21peGVyX2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF9yZWFkX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcG9pbnRlcl9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Cit1MzIgc3N0X2hzd19zdHJlYW1fZ2V0X3BlYWtfcmVnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBjaGFubmVsKTsKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfdm9sX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgY2hhbm5lbCk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKKworLyogU3RyZWFtIEFMU0EgdHJpZ2dlciBvcGVyYXRpb25zICovCitpbnQgc3N0X2hzd19zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJaW50IHdhaXQpOworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCk7CitpbnQgc3N0X2hzd19zdHJlYW1fcmVzZXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOworCisvKiBTdHJlYW0gcG9pbnRlciBwb3NpdGlvbnMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfcmVhZF9wb3Moc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyICpwb3NpdGlvbik7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3dyaXRlX3BvcyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgKnBvc2l0aW9uKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfd3JpdGVfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgcG9zaXRpb24pOworaW50IHNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworLyogSFcgcG9ydCBjb25maWcgKi8KK2ludCBzc3RfaHN3X2RldmljZV9zZXRfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJZW51bSBzc3RfaHN3X2RldmljZV9pZCBkZXYsIGVudW0gc3N0X2hzd19kZXZpY2VfbWNsayBtY2xrLAorCWVudW0gc3N0X2hzd19kZXZpY2VfbW9kZSBtb2RlLCB1MzIgY2xvY2tfZGl2aWRlcik7CisKKy8qIERYIENvbmZpZyAqLworaW50IHNzdF9oc3dfZHhfc2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJZW51bSBzc3RfaHN3X2R4X3N0YXRlIHN0YXRlLCBzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVwbHkgKmR4KTsKK2ludCBzc3RfaHN3X2R4X2dldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaXRlbSwKKwl1MzIgKm9mZnNldCwgdTMyICpzaXplLCB1MzIgKnNvdXJjZSk7CisKKy8qIGluaXQgKi8KK2ludCBzc3RfaHN3X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfaHN3X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOworc3RydWN0IHNzdF9kc3AgKnNzdF9oc3dfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKK3ZvaWQgc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzJkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtcGNtLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgUENNIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorCisjaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIEhTV19QQ01fQ09VTlQJCTYKKyNkZWZpbmUgSFNXX1ZPTFVNRV9NQVgJCTB4N0ZGRkZGRkYJLyogMGRCICovCisKKy8qIHNpbXBsZSB2b2x1bWUgdGFibGUgKi8KK3N0YXRpYyBjb25zdCB1MzIgdm9sdW1lX21hcFtdID0geworCUhTV19WT0xVTUVfTUFYID4+IDMwLAorCUhTV19WT0xVTUVfTUFYID4+IDI5LAorCUhTV19WT0xVTUVfTUFYID4+IDI4LAorCUhTV19WT0xVTUVfTUFYID4+IDI3LAorCUhTV19WT0xVTUVfTUFYID4+IDI2LAorCUhTV19WT0xVTUVfTUFYID4+IDI1LAorCUhTV19WT0xVTUVfTUFYID4+IDI0LAorCUhTV19WT0xVTUVfTUFYID4+IDIzLAorCUhTV19WT0xVTUVfTUFYID4+IDIyLAorCUhTV19WT0xVTUVfTUFYID4+IDIxLAorCUhTV19WT0xVTUVfTUFYID4+IDIwLAorCUhTV19WT0xVTUVfTUFYID4+IDE5LAorCUhTV19WT0xVTUVfTUFYID4+IDE4LAorCUhTV19WT0xVTUVfTUFYID4+IDE3LAorCUhTV19WT0xVTUVfTUFYID4+IDE2LAorCUhTV19WT0xVTUVfTUFYID4+IDE1LAorCUhTV19WT0xVTUVfTUFYID4+IDE0LAorCUhTV19WT0xVTUVfTUFYID4+IDEzLAorCUhTV19WT0xVTUVfTUFYID4+IDEyLAorCUhTV19WT0xVTUVfTUFYID4+IDExLAorCUhTV19WT0xVTUVfTUFYID4+IDEwLAorCUhTV19WT0xVTUVfTUFYID4+IDksCisJSFNXX1ZPTFVNRV9NQVggPj4gOCwKKwlIU1dfVk9MVU1FX01BWCA+PiA3LAorCUhTV19WT0xVTUVfTUFYID4+IDYsCisJSFNXX1ZPTFVNRV9NQVggPj4gNSwKKwlIU1dfVk9MVU1FX01BWCA+PiA0LAorCUhTV19WT0xVTUVfTUFYID4+IDMsCisJSFNXX1ZPTFVNRV9NQVggPj4gMiwKKwlIU1dfVk9MVU1FX01BWCA+PiAxLAorCUhTV19WT0xVTUVfTUFYID4+IDAsCit9OworCisjZGVmaW5lIEhTV19QQ01fUEVSSU9EU19NQVgJNjQKKyNkZWZpbmUgSFNXX1BDTV9QRVJJT0RTX01JTgkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBoc3dfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSB8CisJCQkJICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IFBBR0VfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heAk9IChIU1dfUENNX1BFUklPRFNfTUFYIC8gSFNXX1BDTV9QRVJJT0RTX01JTikgKiBQQUdFX1NJWkUsCisJLnBlcmlvZHNfbWluCQk9IEhTV19QQ01fUEVSSU9EU19NSU4sCisJLnBlcmlvZHNfbWF4CQk9IEhTV19QQ01fUEVSSU9EU19NQVgsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSBIU1dfUENNX1BFUklPRFNfTUFYICogUEFHRV9TSVpFLAorfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciBlYWNoIFBDTSBEU1Agc3RyZWFtICovCitzdHJ1Y3QgaHN3X3BjbV9kYXRhIHsKKwlpbnQgZGFpX2lkOworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCXUzMiB2b2x1bWVbMl07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW07CisJdW5zaWduZWQgaW50IHdwb3M7CisJc3RydWN0IG11dGV4IG11dGV4OworfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciB0aGUgZHJpdmVyICovCitzdHJ1Y3QgaHN3X3ByaXZfZGF0YSB7CisJLyogcnVudGltZSBEU1AgKi8KKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OworCisJLyogcGFnZSB0YWJsZXMgKi8KKwl1bnNpZ25lZCBjaGFyICpwY21fcGdbSFNXX1BDTV9DT1VOVF1bMl07CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBoc3dfcGNtX2RhdGEgcGNtW0hTV19QQ01fQ09VTlRdOworfTsKKworc3RhdGljIGlubGluZSB1MzIgaHN3X21peGVyX3RvX2lwYyh1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlID49IEFSUkFZX1NJWkUodm9sdW1lX21hcCkpCisJCXJldHVybiB2b2x1bWVfbWFwWzBdOworCWVsc2UKKwkJcmV0dXJuIHZvbHVtZV9tYXBbdmFsdWVdOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBoc3dfaXBjX3RvX21peGVyKHUzMiB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZvbHVtZV9tYXApOyBpKyspIHsKKwkJaWYgKHZvbHVtZV9tYXBbaV0gPj0gdmFsdWUpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gaSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3N0cmVhbV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bbWMtPnJlZ107CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJdTMyIHZvbHVtZTsKKworCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7CisKKwlpZiAoIXBjbV9kYXRhLT5zdHJlYW0pIHsKKwkJcGNtX2RhdGEtPnZvbHVtZVswXSA9CisJCQloc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJcGNtX2RhdGEtPnZvbHVtZVsxXSA9CisJCQloc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAyLCB2b2x1bWUpOworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMCwgdm9sdW1lKTsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAxLCB2b2x1bWUpOworCX0KKworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVttYy0+cmVnXTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1MzIgdm9sdW1lOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKworCWlmICghcGNtX2RhdGEtPnN0cmVhbSkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMF0pOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMV0pOworCQltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAwLCAmdm9sdW1lKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhzd19pcGNfdG9fbWl4ZXIodm9sdW1lKTsKKwlzc3RfaHN3X3N0cmVhbV9nZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCXUzMiB2b2x1bWU7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKworCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKGhzdywgMCwgMiwgdm9sdW1lKTsKKworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAwLCB2b2x1bWUpOworCisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAxLCB2b2x1bWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd192b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lID0gMDsKKworCXNzdF9oc3dfbWl4ZXJfZ2V0X3ZvbHVtZShoc3csIDAsIDAsICZ2b2x1bWUpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOworCisJc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVExWIHVzZWQgYnkgYm90aCBnbG9iYWwgYW5kIHN0cmVhbSB2b2x1bWVzICovCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHN3X3ZvbF90bHYsIC05MDAwLCAzMDAsIDEpOworCisvKiBTeXN0ZW0gUGluIGhhcyBubyB2b2x1bWUgY29udHJvbCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhzd192b2x1bWVfY29udHJvbHNbXSA9IHsKKwkvKiBHbG9iYWwgRFNQIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIDAsIDgsCisJCUFSUkFZX1NJWkUodm9sdW1lX21hcCkgLTEsIDAsCisJCWhzd192b2x1bWVfZ2V0LCBoc3dfdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMCB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMCBQbGF5YmFjayBWb2x1bWUiLCAxLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMSB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMSBQbGF5YmFjayBWb2x1bWUiLCAyLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIExvb3BiYWNrIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTG9vcGJhY2sgQ2FwdHVyZSBWb2x1bWUiLCAzLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE1pYyBDYXB0dXJlIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTWljIENhcHR1cmUgVm9sdW1lIiwgNCwgMCwgOCwKKwkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSwgMCwKKwkJaHN3X3N0cmVhbV92b2x1bWVfZ2V0LCBoc3dfc3RyZWFtX3ZvbHVtZV9wdXQsIGhzd192b2xfdGx2KSwKK307CisKKy8qIENyZWF0ZSBETUEgYnVmZmVyIHBhZ2UgdGFibGUgZm9yIERTUCAqLworc3RhdGljIGludCBjcmVhdGVfYWRzcF9wYWdlX3RhYmxlKHN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSwKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhLCBzaXplX3Qgc2l6ZSwgaW50IHBjbSwgaW50IHN0cmVhbSkKK3sKKwlpbnQgaSwgcGFnZXM7CisKKwlpZiAoc2l6ZSAlIFBBR0VfU0laRSkKKwkJcGFnZXMgPSAoc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWVsc2UKKwkJcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOworCisJZGV2X2RiZyhydGQtPmRldiwgImdlbmVyYXRpbmcgcGFnZSB0YWJsZSBmb3IgJXAgc2l6ZSAweCV6dSBwYWdlcyAlZFxuIiwKKwkJZG1hX2FyZWEsIHNpemUsIHBhZ2VzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCXUzMiBpZHggPSAoKChpIDw8IDIpICsgaSkpID4+IDE7CisJCXUzMiBwZm4gPSAodmlydF90b19waHlzKGRtYV9hcmVhICsgaSAqIFBBR0VfU0laRSkpID4+IFBBR0VfU0hJRlQ7CisJCXUzMiAqcGdfdGFibGU7CisKKwkJZGV2X2RiZyhydGQtPmRldiwgInBmbiBpICVpIGlkeCAlZCBwZm4gJXhcbiIsIGksIGlkeCwgcGZuKTsKKworCQlwZ190YWJsZSA9ICh1MzIqKShwZGF0YS0+cGNtX3BnW3BjbV1bc3RyZWFtXSArIGlkeCk7CisKKwkJaWYgKGkgJiAxKQorCQkJKnBnX3RhYmxlIHw9IChwZm4gPDwgNCk7CisJCWVsc2UKKwkJCSpwZ190YWJsZSB8PSBwZm47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IGhzd19wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZV9kYXRhOworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHN0cmVhbV90eXBlOworCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkOworCXUzMiByYXRlLCBiaXRzLCBtYXAsIHBhZ2VzLCBtb2R1bGVfaWQ7CisJdTggY2hhbm5lbHM7CisJaW50IHJldDsKKworCS8qIHN0cmVhbSBkaXJlY3Rpb24gKi8KKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJZWxzZQorCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOOworCisJLyogRFNQIHN0cmVhbSB0eXBlIGRlcGVuZHMgb24gREFJIElEICovCisJc3dpdGNoIChydGQtPmNwdV9kYWktPmlkKSB7CisJY2FzZSAwOgorCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfU1lTVEVNOworCQltb2R1bGVfaWQgPSBTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNOworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfUkVOREVSOworCQltb2R1bGVfaWQgPSBTU1RfSFNXX01PRFVMRV9QQ007CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogcGF0aCBJRCBuZWVkcyB0byBiZSBPVVQgZm9yIGxvb3BiYWNrICovCisJCXN0cmVhbV90eXBlID0gU1NUX0hTV19TVFJFQU1fVFlQRV9MT09QQkFDSzsKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9SRUZFUkVOQ0U7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX0NBUFRVUkU7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgREFJIElEICVkXG4iLAorCQkJcnRkLT5jcHVfZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlwYXRoX2lkLCBzdHJlYW1fdHlwZSwgU1NUX0hTV19TVFJFQU1fRk9STUFUX1BDTV9GT1JNQVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHNldCBmb3JtYXQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCByYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgcmF0ZSAlZFxuIiwgcmF0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQliaXRzID0gU1NUX0hTV19ERVBUSF8xNkJJVDsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMTYpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRzID0gU1NUX0hTV19ERVBUSF8yNEJJVDsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgZm9ybWF0ICVkXG4iLAorCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCBiaXRzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgYml0cyAlZFxuIiwgYml0cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2Ugb25seSBzdXBwb3J0IHN0ZXJlbyBhdG0gKi8KKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWlmIChjaGFubmVscyAhPSAyKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogaW52YWxpZCBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAgPSBjcmVhdGVfY2hhbm5lbF9tYXAoU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8pOworCXNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCW1hcCwgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8pOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgY2hhbm5lbHMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogY291bGQgbm90IHNldCBjaGFubmVscyAlZFxuIiwKKwkJCWNoYW5uZWxzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogY291bGQgbm90IGFsbG9jYXRlICVkIGJ5dGVzIGZvciBQQ00gJWRcbiIsCisJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyksIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY3JlYXRlX2Fkc3BfcGFnZV90YWJsZShwZGF0YSwgcnRkLCBydW50aW1lLT5kbWFfYXJlYSwKKwkJcnVudGltZS0+ZG1hX2J5dGVzLCBydGQtPmNwdV9kYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzc3RfaHN3X3N0cmVhbV9zZXRfc3R5bGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCk7CisKKwlpZiAocnVudGltZS0+ZG1hX2J5dGVzICUgUEFHRV9TSVpFKQorCQlwYWdlcyA9IChydW50aW1lLT5kbWFfYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKKwllbHNlCisJCXBhZ2VzID0gcnVudGltZS0+ZG1hX2J5dGVzIC8gUEFHRV9TSVpFOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fYnVmZmVyKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJdmlydF90b19waHlzKHBkYXRhLT5wY21fcGdbcnRkLT5jcHVfZGFpLT5pZF1bc3Vic3RyZWFtLT5zdHJlYW1dKSwKKwkJcGFnZXMsIHJ1bnRpbWUtPmRtYV9ieXRlcywgMCwKKwkJKHUzMikodmlydF90b19waHlzKHJ1bnRpbWUtPmRtYV9hcmVhKSA+PiBQQUdFX1NISUZUKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERNQSBidWZmZXIgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHNwID0gc3N0X2hzd19nZXRfZHNwKGhzdyk7CisKKwltb2R1bGVfZGF0YSA9IHNzdF9tb2R1bGVfZ2V0X2Zyb21faWQoZHNwLCBtb2R1bGVfaWQpOworCWlmIChtb2R1bGVfZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtb2R1bGUgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogd2UgdXNlIGhhcmRjb2RlZCBtZW1vcnkgb2Zmc2V0cyBhdG0sIHdpbGwgYmUgdXBkYXRlZCBmb3IgbmV3IEZXICovCisJaWYgKHN0cmVhbV90eXBlID09IFNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRSkgeworCQlzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJU1NUX0hTV19NT0RVTEVfUENNX0NBUFRVUkUsIG1vZHVsZV9kYXRhLT5lbnRyeSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJMHg0NDk0MDAsIDB4NDAwMCk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJMHg0MDAwMDAsIDApOworCX0gZWxzZSB7IC8qIHN0cmVhbV90eXBlID09IFNTVF9IU1dfU1RSRUFNX1RZUEVfU1lTVEVNICovCisJCXNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sCisJCQlTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNLCBtb2R1bGVfZGF0YS0+ZW50cnkpOworCisJCXNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJbW9kdWxlX2RhdGEtPm9mZnNldCwgbW9kdWxlX2RhdGEtPnNpemUpOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCTB4NDRkNDAwLCAweDM4MDApOworCisJCXNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJbW9kdWxlX2RhdGEtPm9mZnNldCwgbW9kdWxlX2RhdGEtPnNpemUpOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCTB4NDAwMDAwLCAwKTsKKwl9CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9jb21taXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjb21taXQgc3RyZWFtICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX3BhdXNlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHBhdXNlICVkXG4iLCByZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydGQpOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3N0X2hzd19zdHJlYW1fcmVzdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzc3RfaHN3X3N0cmVhbV9wYXVzZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBoc3dfbm90aWZ5X3BvaW50ZXIoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSBkYXRhOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtX2RhdGEtPnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwl1MzIgcG9zOworCisJcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsCisJCShydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciAlIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBBcHAgcG9pbnRlciAlZCBieXRlc1xuIiwgcG9zKTsKKworCS8qIGxldCBhbHNhIGtub3cgd2UgaGF2ZSBwbGF5IGEgcGVyaW9kICovCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBoc3dfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0OworCisJb2Zmc2V0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsCisJCXNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihoc3csIHBjbV9kYXRhLT5zdHJlYW0pKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IERNQSBwb2ludGVyICV6dSBieXRlc1xuIiwKKwkJZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsICh1MzIpb2Zmc2V0KSk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisKKwlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW3J0ZC0+Y3B1X2RhaS0+aWRdOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKworCXNuZF9zb2NfcGNtX3NldF9kcnZkYXRhKHJ0ZCwgcGNtX2RhdGEpOworCXBjbV9kYXRhLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmhzd19wY21faGFyZHdhcmUpOworCisJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9oc3dfc3RyZWFtX25ldyhoc3csIHJ0ZC0+Y3B1X2RhaS0+aWQsCisJCWhzd19ub3RpZnlfcG9pbnRlciwgcGNtX2RhdGEpOworCWlmIChwY21fZGF0YS0+c3RyZWFtID09IE5VTEwpIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IHByZXZpb3VzIHNhdmVkIHZvbHVtZSAqLworCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLAorCQkJMCwgcGNtX2RhdGEtPnZvbHVtZVswXSk7CisJc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsCisJCQkxLCBwY21fZGF0YS0+dm9sdW1lWzFdKTsKKworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnRkKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9yZXNldChoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fZnJlZShoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogZnJlZSBzdHJlYW0gZmFpbGVkICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJcGNtX2RhdGEtPnN0cmVhbSA9IE5VTEw7CisKK291dDoKKwltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBoc3dfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBoc3dfcGNtX29wZW4sCisJLmNsb3NlCQk9IGhzd19wY21fY2xvc2UsCisJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMJPSBoc3dfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGhzd19wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IGhzd19wY21fdHJpZ2dlciwKKwkucG9pbnRlcgk9IGhzd19wY21fcG9pbnRlciwKKwkubW1hcAkJPSBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAsCit9OworCitzdGF0aWMgdm9pZCBoc3dfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBoc3dfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQocnRkLT5jYXJkLT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAorCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJU05EUlZfRE1BX1RZUEVfREVWLAorCQkJcnRkLT5jYXJkLT5kZXYsCisJCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgsCisJCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSFNXX0ZPUk1BVFMgXAorCShTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8XAorCSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgaHN3X2RhaXNbXSA9IHsKKwl7CisJCS5uYW1lICA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCisJeworCQkvKiBQQ00gKi8KKwkJLm5hbWUgID0gIk9mZmxvYWQwIFBpbiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMCBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkvKiBQQ00gKi8KKwkJLm5hbWUgID0gIk9mZmxvYWQxIFBpbiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTG9vcGJhY2sgUGluIiwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTG9vcGJhY2sgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiQ2FwdHVyZSBQaW4iLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBbmFsb2cgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd2lkZ2V0c1tdID0geworCisJLyogQmFja2VuZCBEQUlzICAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIlNTUDAgQ09ERUMgSU4iLCBOVUxMLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTU1AwIENPREVDIE9VVCIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU1NQMSBCVCBJTiIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNTUDEgQlQgT1VUIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIEdsb2JhbCBQbGF5YmFjayBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUGxheWJhY2sgVk1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGdyYXBoW10gPSB7CisKKwkvKiBQbGF5YmFjayBNaXhlciAqLworCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIlN5c3RlbSBQbGF5YmFjayJ9LAorCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIk9mZmxvYWQwIFBsYXliYWNrIn0sCisJeyJQbGF5YmFjayBWTWl4ZXIiLCBOVUxMLCAiT2ZmbG9hZDEgUGxheWJhY2sifSwKKworCXsiU1NQMCBDT0RFQyBPVVQiLCBOVUxMLCAiUGxheWJhY2sgVk1peGVyIn0sCisKKwl7IkFuYWxvZyBDYXB0dXJlIiwgTlVMTCwgIlNTUDAgQ09ERUMgSU4ifSwKK307CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwcml2X2RhdGE7CisJaW50IGk7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksIEdGUF9LRVJORUwpOworCXByaXZfZGF0YS0+aHN3ID0gcGRhdGEtPmRzcDsKKwlzbmRfc29jX3BsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRmb3JtLCBwcml2X2RhdGEpOworCisJLyogYWxsb2NhdGUgRFNQIGJ1ZmZlciBwYWdlIHRhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzd19kYWlzKTsgaSsrKSB7CisKKwkJbXV0ZXhfaW5pdCgmcHJpdl9kYXRhLT5wY21baV0ubXV0ZXgpOworCisJCS8qIHBsYXliYWNrICovCisJCWlmIChoc3dfZGFpc1tpXS5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKKwkJCXByaXZfZGF0YS0+cGNtX3BnW2ldWzBdID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9ETUEpOworCQkJaWYgKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBjYXB0dXJlICovCisJCWlmIChoc3dfZGFpc1tpXS5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCQkJcHJpdl9kYXRhLT5wY21fcGdbaV1bMV0gPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0RNQSk7CisJCQlpZiAocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0gPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnI6CisJZm9yICg7aSA+PSAwOyBpLS0pIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCWtmcmVlKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJa2ZyZWUocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0pOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnByaXZfZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHN3X2RhaXMpOyBpKyspIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCWtmcmVlKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJa2ZyZWUocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGhzd19zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IGhzd19wY21fcHJvYmUsCisJLnJlbW92ZQkJPSBoc3dfcGNtX3JlbW92ZSwKKwkub3BzCQk9ICZoc3dfcGNtX29wcywKKwkucGNtX25ldwk9IGhzd19wY21fbmV3LAorCS5wY21fZnJlZQk9IGhzd19wY21fZnJlZSwKKwkuY29udHJvbHMJPSBoc3dfdm9sdW1lX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKGhzd192b2x1bWVfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMJPSB3aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBncmFwaCwKKwkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShncmFwaCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBoc3dfZGFpX2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAiaGFzd2VsbC1kYWkiLAorfTsKKworc3RhdGljIGludCBoc3dfcGNtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9oc3dfZHNwX2luaXQoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZoc3dfc29jX3BsYXRmb3JtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGxhdDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZoc3dfZGFpX2NvbXBvbmVudCwKKwkJaHN3X2RhaXMsIEFSUkFZX1NJWkUoaHN3X2RhaXMpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY29tcDsKKworCXJldHVybiAwOworCitlcnJfY29tcDoKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CitlcnJfcGxhdDoKKwlzc3RfaHN3X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOworCXNzdF9oc3dfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoc3dfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisKKwkucHJvYmUgPSBoc3dfcGNtX2Rldl9wcm9iZSwKKwkucmVtb3ZlID0gaHN3X3BjbV9kZXZfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaHN3X3BjbV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBYaW5nY2hhbyBXYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhc3dlbGwvTHlueHBvaW50ICsgQnJvYWR3ZWxsL1dpbGRjYXRwb2ludCBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGFzd2VsbC1wY20tYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1kc3AuaCBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjYzZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLWRzcC5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9fU1NUX01GTERfRFNQX0hfXworI2RlZmluZSBfX1NTVF9NRkxEX0RTUF9IX18KKy8qCisgKiAgc3N0X21mbGRfZHNwLmggLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTEyIEludGVsIENvcnBvcmF0aW9uCisgKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBsaW51eC5pbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworZW51bSBzc3RfY29kZWNfdHlwZXMgeworCS8qICBBVURJTy9NVVNJQwlDT0RFQyBUeXBlIERlZmluaXRpb25zICovCisJU1NUX0NPREVDX1RZUEVfVU5LTk9XTiA9IDAsCisJU1NUX0NPREVDX1RZUEVfUENNLAkvKiBQYXNzIHRocm91Z2ggQXVkaW8gY29kZWMgKi8KKwlTU1RfQ09ERUNfVFlQRV9NUDMsCisJU1NUX0NPREVDX1RZUEVfTVAyNCwKKwlTU1RfQ09ERUNfVFlQRV9BQUMsCisJU1NUX0NPREVDX1RZUEVfQUFDUCwKKwlTU1RfQ09ERUNfVFlQRV9lQUFDUCwKK307CisKK2VudW0gc3RyZWFtX3R5cGUgeworCVNTVF9TVFJFQU1fVFlQRV9OT05FID0gMCwKKwlTU1RfU1RSRUFNX1RZUEVfTVVTSUMgPSAxLAorfTsKKworc3RydWN0IHNuZF9wY21fcGFyYW1zIHsKKwl1MTYgY29kZWM7CS8qIGNvZGVjIHR5cGUgKi8KKwl1OCBudW1fY2hhbjsJLyogMT1Nb25vLCAyPVN0ZXJlbyAqLworCXU4IHBjbV93ZF9zejsJLyogMTYvMjQgLSBiaXQqLworCXUzMiByZXNlcnZlZDsJLyogQml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgKi8KKwl1MzIgc2ZyZXE7CS8qIFNhbXBsaW5nIHJhdGUgaW4gSHogKi8KKwl1OCB1c2Vfb2ZmbG9hZF9wYXRoOworCXU4IHJlc2VydmVkMjsKKwl1MTYgcmVzZXJ2ZWQzOworCXU4IGNoYW5uZWxfbWFwWzhdOworfSBfX3BhY2tlZDsKKworLyogTVAzIE11c2ljIFBhcmFtZXRlcnMgTWVzc2FnZSAqLworc3RydWN0IHNuZF9tcDNfcGFyYW1zIHsKKwl1MTYgY29kZWM7CisJdTggIG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvCSovCisJdTggIHBjbV93ZF9zejsgLyogMTYvMjQgLSBiaXQqLworCXU4ICBjcmNfY2hlY2s7IC8qIGNyY19jaGVjayAtIGRpc2FibGUgKDApIG9yIGVuYWJsZSAoMSkgKi8KKwl1OCAgcmVzZXJ2ZWQxOyAvKiB1bnVzZWQqLworCXUxNiByZXNlcnZlZDI7CS8qIFVudXNlZCAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBQUNfQklUX1NUUkVBTV9BRFRTCQkwCisjZGVmaW5lIEFBQ19CSVRfU1RSRUFNX0FESUYJCTEKKyNkZWZpbmUgQUFDX0JJVF9TVFJFQU1fUkFXCQkyCisKKy8qIEFBQyBNdXNpYyBQYXJhbWV0ZXJzIE1lc3NhZ2UgKi8KK3N0cnVjdCBzbmRfYWFjX3BhcmFtcyB7CisJdTE2IGNvZGVjOworCXU4IG51bV9jaGFuOyAvKiAxPU1vbm8sIDI9U3RlcmVvKi8KKwl1OCBwY21fd2Rfc3o7IC8qIDE2LzI0IC0gYml0Ki8KKwl1OCBiZG93bnNhbXBsZTsgLypTQlIgZG93bnNhbXBsaW5nIDAgLSBkaXNhYmxlIDEgLWVuYWJsZWQgQUFDKyBvbmx5ICovCisJdTggYnNfZm9ybWF0OyAvKiBpbnB1dCBiaXQgc3RyZWFtIGZvcm1hdCBhZHRzPTAsIGFkaWY9MSwgcmF3PTIgKi8KKwl1MTYgIHJlc2VyMjsKKwl1MzIgZXh0ZXJuYWxzcjsgLypzYW1wbGluZyByYXRlIG9mIGJhc2ljIEFBQyByYXcgYml0IHN0cmVhbSovCisJdTggc2JyX3NpZ25hbGxpbmc7LypkaXNhYmxlL2VuYWJsZS9zZXQgYXV0b21vZGUgdGhlIFNCUiB0b29sLkFBQysqLworCXU4IHJlc2VyMTsKKwl1MTYgIHJlc2VyMzsKK30gX19wYWNrZWQ7CisKKy8qIFdNQSBNdXNpYyBQYXJhbWV0ZXJzIE1lc3NhZ2UgKi8KK3N0cnVjdCBzbmRfd21hX3BhcmFtcyB7CisJdTE2IGNvZGVjOworCXU4ICBudW1fY2hhbjsJLyogMT1Nb25vLCAyPVN0ZXJlbyAqLworCXU4ICBwY21fd2Rfc3o7CS8qIDE2LzI0IC0gYml0Ki8KKwl1MzIgYnJhdGU7CS8qIFVzZSB0aGUgaGFyZCBjb2RlZCB2YWx1ZS4gKi8KKwl1MzIgc2ZyZXE7CS8qIFNhbXBsaW5nIGZyZXEgZWcuIDgwMDAsIDQ0MTAwMCwgNDgwMDAgKi8KKwl1MzIgY2hhbm5lbF9tYXNrOyAgLyogQ2hhbm5lbCBNYXNrICovCisJdTE2IGZvcm1hdF90YWc7CS8qIEZvcm1hdCBUYWcgKi8KKwl1MTYgYmxvY2tfYWxpZ247CS8qIHBhY2tldCBzaXplICovCisJdTE2IHdtYV9lbmNvZGVfb3B0Oy8qIEVuY29kZXIgb3B0aW9uICovCisJdTggb3BfYWxpZ247CS8qIG9wIGFsaWduIDAtIDE2IGJpdCwgMS0gTVNCLCAyIExTQiAqLworCXU4IHJlc2VydmVkOwkvKiByZXNlcnZlZCAqLworfSBfX3BhY2tlZDsKKworLyogQ29kZWMgcGFyYW1zIHN0cnV0dXJlICovCit1bmlvbiAgc25kX3NzdF9jb2RlY19wYXJhbXMgeworCXN0cnVjdCBzbmRfcGNtX3BhcmFtcyBwY21fcGFyYW1zOworCXN0cnVjdCBzbmRfbXAzX3BhcmFtcyBtcDNfcGFyYW1zOworCXN0cnVjdCBzbmRfYWFjX3BhcmFtcyBhYWNfcGFyYW1zOworCXN0cnVjdCBzbmRfd21hX3BhcmFtcyB3bWFfcGFyYW1zOworfSBfX3BhY2tlZDsKKworLyogQWRkcmVzcyBhbmQgc2l6ZSBpbmZvIG9mIGEgZnJhbWUgYnVmZmVyICovCitzdHJ1Y3Qgc3N0X2FkZHJlc3NfaW5mbyB7CisJdTMyIGFkZHI7IC8qIEFkZHJlc3MgYXQgSUEgKi8KKwl1MzIgc2l6ZTsgLyogU2l6ZSBvZiB0aGUgYnVmZmVyICovCit9OworCitzdHJ1Y3Qgc25kX3NzdF9hbGxvY19wYXJhbXNfZXh0IHsKKwlzdHJ1Y3Qgc3N0X2FkZHJlc3NfaW5mbyAgcmluZ19idWZfaW5mb1s4XTsKKwl1OCBzZ19jb3VudDsKKwl1OCByZXNlcnZlZDsKKwl1MTYgcmVzZXJ2ZWQyOworCXUzMiBmcmFnX3NpemU7CS8qTnVtYmVyIG9mIHNhbXBsZXMgYWZ0ZXIgd2hpY2ggcGVyaW9kIGVsYXBzZWQKKwkJCQkgIG1lc3NhZ2UgaXMgc2VudCB2YWxpZCBvbmx5IGlmIHBhdGggID0gMCovCit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc25kX3NzdF9zdHJlYW1fcGFyYW1zIHsKKwl1bmlvbiBzbmRfc3N0X2NvZGVjX3BhcmFtcyB1YzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzbmRfc3N0X3BhcmFtcyB7CisJdTMyIHN0cmVhbV9pZDsKKwl1OCBjb2RlYzsKKwl1OCBvcHM7CisJdTggc3RyZWFtX3R5cGU7CisJdTggZGV2aWNlX3R5cGU7CisJc3RydWN0IHNuZF9zc3Rfc3RyZWFtX3BhcmFtcyBzcGFyYW1zOworCXN0cnVjdCBzbmRfc3N0X2FsbG9jX3BhcmFtc19leHQgYXBhcmFtczsKK307CisKKyNlbmRpZiAvKiBfX1NTVF9NRkxEX0RTUF9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwMzA2YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICogIHNzdF9tZmxkX3BsYXRmb3JtLmMgLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEludGVsIENvcnAKKyAqICBBdXRob3I6IFZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICogIEF1dGhvcjogSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqCisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+CisjaW5jbHVkZSAic3N0LW1mbGQtcGxhdGZvcm0uaCIKKworc3RhdGljIHN0cnVjdCBzc3RfZGV2aWNlICpzc3Q7CitzdGF0aWMgREVGSU5FX01VVEVYKHNzdF9sb2NrKTsKKworaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKmRldikKK3sKKwlpZiAoV0FSTl9PTighZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRldi0+ZHJpdmVyLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKKwlpZiAoc3N0KSB7CisJCXByX2Vycigid2UgYWxyZWFkeSBoYXZlIGEgZGV2aWNlICVzXG4iLCBzc3QtPm5hbWUpOworCQltb2R1bGVfcHV0KGRldi0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKwlwcl9kZWJ1ZygicmVnaXN0ZXJpbmcgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCXNzdCA9IGRldjsKKwltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9yZWdpc3Rlcl9kc3ApOworCitpbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpkZXYpCit7CisJaWYgKFdBUk5fT04oIWRldikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZXYgIT0gc3N0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKKworCWlmICghc3N0KSB7CisJCW11dGV4X3VubG9jaygmc3N0X2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltb2R1bGVfcHV0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwlwcl9kZWJ1ZygidW5yZWcgJXNcbiIsIHNzdC0+bmFtZSk7CisJc3N0ID0gTlVMTDsKKwltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF91bnJlZ2lzdGVyX2RzcCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfcGxhdGZvcm1fcGNtX2h3ID0geworCS5pbmZvID0JKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCVNORFJWX1BDTV9JTkZPX0RPVUJMRSB8CisJCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJU05EUlZfUENNX0lORk9fTU1BUHwKKwkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBTU1RfTUFYX0JVRkZFUiwKKwkucGVyaW9kX2J5dGVzX21pbiA9IFNTVF9NSU5fUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gU1NUX01BWF9QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluID0gU1NUX01JTl9QRVJJT0RTLAorCS5wZXJpb2RzX21heCA9IFNTVF9NQVhfUEVSSU9EUywKKwkuZmlmb19zaXplID0gU1NUX0ZJRk9fU0laRSwKK307CisKKy8qIE1GTEQgLSBNU0lDICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzc3RfcGxhdGZvcm1fZGFpW10gPSB7Cit7CisJLm5hbWUgPSAiSGVhZHNldC1jcHUtZGFpIiwKKwkuaWQgPSAwLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCisJCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwl9LAorCS5jYXB0dXJlID0geworCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDUsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9LAoreworCS5uYW1lID0gIlNwZWFrZXItY3B1LWRhaSIsCisJLmlkID0gMSwKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSBTU1RfTU9OTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9LAoreworCS5uYW1lID0gIlZpYnJhMS1jcHUtZGFpIiwKKwkuaWQgPSAyLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAorCQkuY2hhbm5lbHNfbWF4ID0gU1NUX01PTk8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9LAoreworCS5uYW1lID0gIlZpYnJhMi1jcHUtZGFpIiwKKwkuaWQgPSAzLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAorCQkuY2hhbm5lbHNfbWF4ID0gU1NUX1NURVJFTywKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJfSwKK30sCit7CisJLm5hbWUgPSAiQ29tcHJlc3MtY3B1LWRhaSIsCisJLmNvbXByZXNzX2RhaSA9IDEsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwfFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCit9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc3N0X2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAic3N0IiwKK307CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtLAorCQkJCQlpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IHN0YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3N0X2dldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW0tPnN0YXR1c19sb2NrLCBmbGFncyk7CisJc3RhdGUgPSBzdHJlYW0tPnN0cmVhbV9zdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0ZTsKK30KKworc3RhdGljIHZvaWQgc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgKnBhcmFtKQoreworCisJcGFyYW0tPmNvZGVjID0gU1NUX0NPREVDX1RZUEVfUENNOworCXBhcmFtLT5udW1fY2hhbiA9ICh1OCkgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKKwlwYXJhbS0+cGNtX3dkX3N6ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5zYW1wbGVfYml0czsKKwlwYXJhbS0+cmVzZXJ2ZWQgPSAwOworCXBhcmFtLT5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKKwlwYXJhbS0+cmluZ19idWZmZXJfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXBhcmFtLT5wZXJpb2RfY291bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOworCXBhcmFtLT5yaW5nX2J1ZmZlcl9hZGRyID0gdmlydF90b19waHlzKHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhKTsKKwlwcl9kZWJ1ZygicGVyaW9kX2NudCA9ICVkXG4iLCBwYXJhbS0+cGVyaW9kX2NvdW50KTsKKwlwcl9kZWJ1Zygic2ZyZXE9ICVkLCB3ZF9zeiA9ICVkXG4iLCBwYXJhbS0+c2ZyZXEsIHBhcmFtLT5wY21fd2Rfc3opOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9hbGxvY19zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KKwkJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfcGNtX3BhcmFtcyBwYXJhbSA9IHswfTsKKwlzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgc3RyX3BhcmFtcyA9IHswfTsKKwlpbnQgcmV0X3ZhbDsKKworCS8qIHNldCBjb2RlYyBwYXJhbXMgYW5kIGluZm9ybSBTU1QgZHJpdmVyIHRoZSBzYW1lICovCisJc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdWJzdHJlYW0sICZwYXJhbSk7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOworCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOworCXN0cl9wYXJhbXMuY29kZWMgPSAgcGFyYW0uY29kZWM7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOworCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gc3Vic3RyZWFtLT5wY20tPmRldmljZSArIDE7CisJCXByX2RlYnVnKCJQbGF5YmNrIHN0cmVhbSxEZXZpY2UgJWRcbiIsCisJCQkJCXN1YnN0cmVhbS0+cGNtLT5kZXZpY2UpOworCX0gZWxzZSB7CisJCXN0cl9wYXJhbXMub3BzID0gU1RSRUFNX09QU19DQVBUVVJFOworCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRTsKKwkJcHJfZGVidWcoIkNhcHR1cmUgc3RyZWFtLERldmljZSAlZFxuIiwKKwkJCQkJc3Vic3RyZWFtLT5wY20tPmRldmljZSk7CisJfQorCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+b3Blbigmc3RyX3BhcmFtcyk7CisJcHJfZGVidWcoIlNTVF9TTkRfUExBWS9DQVBUVVJFIHJldF92YWwgPSAleFxuIiwgcmV0X3ZhbCk7CisJaWYgKHJldF92YWwgPCAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkID0gcmV0X3ZhbDsKKwlwcl9kZWJ1Zygic3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9wZXJpb2RfZWxhcHNlZCh2b2lkICptYWRfc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gbWFkX3N1YnN0cmVhbTsKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHN0YXR1czsKKworCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCisJCXJldHVybjsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXN0cmVhbSkKKwkJcmV0dXJuOworCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOworCWlmIChzdGF0dXMgIT0gU1NUX1BMQVRGT1JNX1JVTk5JTkcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSA9CisJCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3ZhbDsKKworCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFyYW1cbiIpOworCXNzdF9zZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0sIFNTVF9QTEFURk9STV9JTklUKTsKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gc3N0X3BlcmlvZF9lbGFwc2VkOworCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOworCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7CisJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKKwkJCVNTVF9TTkRfU1RSRUFNX0lOSVQsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKKwlpZiAocmV0X3ZhbCkKKwkJcHJfZXJyKCJjb250cm9sX3NldCByZXQgZXJyb3IgJWRcbiIsIHJldF92YWwpOworCXJldHVybiByZXRfdmFsOworCit9CisvKiBlbmQgLS0gaGVscGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCByZXRfdmFsOworCisJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9vcGVuIGNhbGxlZFxuIik7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9wbGF0Zm9ybV9wY21faHcpOworCXJldF92YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXRfdmFsIDwgMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW0pCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKKworCS8qIGdldCB0aGUgc3N0IG9wcyAqLworCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKKwlpZiAoIXNzdCkgeworCQlwcl9lcnIoIm5vIGRldmljZSBhdmFpbGFibGUgdG8gcnVuXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisJCWtmcmVlKHN0cmVhbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKSkgeworCQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwkJa2ZyZWUoc3RyZWFtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXN0cmVhbS0+b3BzID0gc3N0LT5vcHM7CisJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCA9IDA7CisJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgU1NUX1BMQVRGT1JNX0lOSVQpOworCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIFNTVCBBUEkgc2V0ICovCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKKworCXByX2RlYnVnKCJzc3RfcGxhdGZvcm1fY2xvc2UgY2FsbGVkXG4iKTsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKKwlpZiAoc3RyX2lkKQorCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmNsb3NlKHN0cl9pZCk7CisJbW9kdWxlX3B1dChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJa2ZyZWUoc3RyZWFtKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOworCisJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSBjYWxsZWRcbiIpOworCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOworCWlmIChzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCkgeworCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKAorCQkJCVNTVF9TTkRfRFJPUCwgJnN0cl9pZCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN1YnN0cmVhbSk7CisJaWYgKHJldF92YWwgPCAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAorCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCisJcmV0X3ZhbCA9IHNzdF9wbGF0Zm9ybV9pbml0X3N0cmVhbShzdWJzdHJlYW0pOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUjsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCWludCBjbWQpCit7CisJaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCBzdHJfY21kLCBzdGF0dXM7CisKKwlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyIGNhbGxlZFxuIik7CisJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlwcl9kZWJ1Zygic3N0OiBUcmlnZ2VyIFN0YXJ0XG4iKTsKKwkJc3RyX2NtZCA9IFNTVF9TTkRfU1RBUlQ7CisJCXN0YXR1cyA9IFNTVF9QTEFURk9STV9SVU5OSU5HOworCQlzdHJlYW0tPnN0cmVhbV9pbmZvLm1hZF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJcHJfZGVidWcoInNzdDogaW4gc3RvcFxuIik7CisJCXN0cl9jbWQgPSBTU1RfU05EX0RST1A7CisJCXN0YXR1cyA9IFNTVF9QTEFURk9STV9EUk9QUEVEOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlXG4iKTsKKwkJc3RyX2NtZCA9IFNTVF9TTkRfUEFVU0U7CisJCXN0YXR1cyA9IFNTVF9QTEFURk9STV9QQVVTRUQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJcHJfZGVidWcoInNzdDogaW4gcGF1c2UgcmVsZWFzZVxuIik7CisJCXN0cl9jbWQgPSBTU1RfU05EX1JFU1VNRTsKKwkJc3RhdHVzID0gU1NUX1BMQVRGT1JNX1JVTk5JTkc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKHN0cl9jbWQsICZzdHJfaWQpOworCWlmICghcmV0X3ZhbCkKKwkJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgc3RhdHVzKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfcGxhdGZvcm1fcGNtX3BvaW50ZXIKKwkJCShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHJldF92YWwsIHN0YXR1czsKKwlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbzsKKworCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOworCWlmIChzdGF0dXMgPT0gU1NUX1BMQVRGT1JNX0lOSVQpCisJCXJldHVybiAwOworCXN0cl9pbmZvID0gJnN0cmVhbS0+c3RyZWFtX2luZm87CisJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKKwkJCQlTU1RfU05EX0JVRkZFUl9QT0lOVEVSLCBzdHJfaW5mbyk7CisJaWYgKHJldF92YWwpIHsKKwkJcHJfZXJyKCJzc3Q6IGVycm9yIGNvZGUgPSAlZFxuIiwgcmV0X3ZhbCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKwlyZXR1cm4gc3RyZWFtLT5zdHJlYW1faW5mby5idWZmZXJfcHRyOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCW1lbXNldChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhLCAwLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X3BsYXRmb3JtX29wcyA9IHsKKwkub3BlbiA9IHNzdF9wbGF0Zm9ybV9vcGVuLAorCS5jbG9zZSA9IHNzdF9wbGF0Zm9ybV9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkucHJlcGFyZSA9IHNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IHNzdF9wbGF0Zm9ybV9wY21fcG9pbnRlciwKKwkuaHdfcGFyYW1zID0gc3N0X3BsYXRmb3JtX3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBzc3RfcGxhdGZvcm1fcGNtX2h3X2ZyZWUsCit9OworCitzdGF0aWMgdm9pZCBzc3RfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlwcl9kZWJ1Zygic3N0X3BjbV9mcmVlIGNhbGxlZFxuIik7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CisJaW50IHJldHZhbCA9IDA7CisKKwlwcl9kZWJ1Zygic3N0X3BjbV9uZXcgY2FsbGVkXG4iKTsKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAorCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCXJldHZhbCA9ICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKKwkJCVNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCisJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCVNTVF9NSU5fQlVGRkVSLCBTU1RfTUFYX0JVRkZFUik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXByX2VycigiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uZiBmYWlsXG4iKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogY29tcHJlc3Mgc3RyZWFtIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHNzdF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IChzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqKWFyZzsKKworCXByX2RlYnVnKCJmcmFnbWVudCBlbGFwc2VkIGJ5IGRyaXZlclxuIik7CisJaWYgKGNzdHJlYW0pCisJCXNuZF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKGNzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKKworCS8qIGdldCB0aGUgc3N0IG9wcyAqLworCWlmICghc3N0IHx8ICF0cnlfbW9kdWxlX2dldChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcikpIHsKKwkJcHJfZXJyKCJubyBkZXZpY2UgYXZhaWxhYmxlIHRvIHJ1blxuIik7CisJCXJldF92YWwgPSAtRU5PREVWOworCQlnb3RvIG91dF9vcHM7CisJfQorCXN0cmVhbS0+Y29tcHJfb3BzID0gc3N0LT5jb21wcl9vcHM7CisKKwlzdHJlYW0tPmlkID0gMDsKKwlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBTU1RfUExBVEZPUk1fSU5JVCk7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOworCXJldHVybiAwOworb3V0X29wczoKKwlrZnJlZShzdHJlYW0pOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKKworCXN0cmVhbSA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwkvKm5lZWQgdG8gY2hlY2sqLworCXN0cl9pZCA9IHN0cmVhbS0+aWQ7CisJaWYgKHN0cl9pZCkKKwkJcmV0X3ZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5jbG9zZShzdHJfaWQpOworCW1vZHVsZV9wdXQoc3N0LT5kZXYtPmRyaXZlci0+b3duZXIpOworCWtmcmVlKHN0cmVhbSk7CisJcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIHJldF92YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9zZXRfcGFyYW1zKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyBzdHJfcGFyYW1zOworCXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgY2I7CisKKwlzdHJlYW0gPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJLyogY29uc3RydWN0IGZ3IHN0cnVjdHVyZSBmb3IgdGhpcyovCisJbWVtc2V0KCZzdHJfcGFyYW1zLCAwLCBzaXplb2Yoc3RyX3BhcmFtcykpOworCisJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOworCXN0cl9wYXJhbXMuc3RyZWFtX3R5cGUgPSBTU1RfU1RSRUFNX1RZUEVfTVVTSUM7CisJc3RyX3BhcmFtcy5kZXZpY2VfdHlwZSA9IFNORF9TU1RfREVWSUNFX0NPTVBSRVNTOworCisJc3dpdGNoIChwYXJhbXMtPmNvZGVjLmlkKSB7CisJY2FzZSBTTkRfQVVESU9DT0RFQ19NUDM6IHsKKwkJc3RyX3BhcmFtcy5jb2RlYyA9IFNTVF9DT0RFQ19UWVBFX01QMzsKKwkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9NUDM7CisJCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5tcDNfcGFyYW1zLm51bV9jaGFuID0gcGFyYW1zLT5jb2RlYy5jaF9pbjsKKwkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMucGNtX3dkX3N6ID0gMTY7CisJCWJyZWFrOworCX0KKworCWNhc2UgU05EX0FVRElPQ09ERUNfQUFDOiB7CisJCXN0cl9wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9BQUM7CisJCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLmNvZGVjID0gU1NUX0NPREVDX1RZUEVfQUFDOworCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5udW1fY2hhbiA9IHBhcmFtcy0+Y29kZWMuY2hfaW47CisJCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLnBjbV93ZF9zeiA9IDE2OworCQlpZiAocGFyYW1zLT5jb2RlYy5mb3JtYXQgPT0gU05EX0FVRElPU1RSRUFNRk9STUFUX01QNEFEVFMpCisJCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQorCQkJCQkJCUFBQ19CSVRfU1RSRUFNX0FEVFM7CisJCWVsc2UgaWYgKHBhcmFtcy0+Y29kZWMuZm9ybWF0ID09IFNORF9BVURJT1NUUkVBTUZPUk1BVF9SQVcpCisJCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQorCQkJCQkJCUFBQ19CSVRfU1RSRUFNX1JBVzsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIlVuZGVmaW5lZCBmb3JtYXQlZFxuIiwgcGFyYW1zLT5jb2RlYy5mb3JtYXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLmFhY19wYXJhbXMuZXh0ZXJuYWxzciA9CisJCQkJCQlwYXJhbXMtPmNvZGVjLnNhbXBsZV9yYXRlOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoImNvZGVjIG5vdCBzdXBwb3J0ZWQsIGlkID0lZFxuIiwgcGFyYW1zLT5jb2RlYy5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cl9wYXJhbXMuYXBhcmFtcy5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgID0KKwkJCQkJdmlydF90b19waHlzKGNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcik7CisJc3RyX3BhcmFtcy5hcGFyYW1zLnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9CisJCQkJCWNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCXN0cl9wYXJhbXMuYXBhcmFtcy5zZ19jb3VudCA9IDE7CisJc3RyX3BhcmFtcy5hcGFyYW1zLmZyYWdfc2l6ZSA9IGNzdHJlYW0tPnJ1bnRpbWUtPmZyYWdtZW50X3NpemU7CisKKwljYi5wYXJhbSA9IGNzdHJlYW07CisJY2IuY29tcHJfY2IgPSBzc3RfY29tcHJfZnJhZ21lbnRfZWxhcHNlZDsKKworCXJldHZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5vcGVuKCZzdHJfcGFyYW1zLCAmY2IpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByX2Vycigic3RyZWFtIGFsbG9jYXRpb24gZmFpbGVkICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXN0cmVhbS0+aWQgPSByZXR2YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3RyaWdnZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KKwkJY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHN0cmVhbS0+Y29tcHJfb3BzLT5jb250cm9sKGNtZCwgc3RyZWFtLT5pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0tPmNvbXByX29wcy0+dHN0YW1wKHN0cmVhbS0+aWQsIHRzdGFtcCk7CisJdHN0YW1wLT5ieXRlX29mZnNldCA9IHRzdGFtcC0+Y29waWVkX3RvdGFsICUKKwkJCQkgKHUzMiljc3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZTsKKwlwcl9kZWJ1ZygiY2FsYyBieXRlcyBvZmZzZXQvY29waWVkIGJ5dGVzIGFzICVkXG4iLCB0c3RhbXAtPmJ5dGVfb2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfYWNrKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQlzaXplX3QgYnl0ZXMpCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0tPmNvbXByX29wcy0+YWNrKHN0cmVhbS0+aWQsICh1bnNpZ25lZCBsb25nKWJ5dGVzKTsKKwlzdHJlYW0tPmJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfZ2V0X2NhcHMoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2FwcykKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQorCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jYXBzKGNhcHMpOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQorCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jb2RlY19jYXBzKGNvZGVjKTsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X21ldGFkYXRhKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZXRhZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gID0KKwkJIGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBzdHJlYW0tPmNvbXByX29wcy0+c2V0X21ldGFkYXRhKHN0cmVhbS0+aWQsIG1ldGFkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIHNzdF9wbGF0Zm9ybV9jb21wcl9vcHMgPSB7CisKKwkub3BlbiA9IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuLAorCS5mcmVlID0gc3N0X3BsYXRmb3JtX2NvbXByX2ZyZWUsCisJLnNldF9wYXJhbXMgPSBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X3BhcmFtcywKKwkuc2V0X21ldGFkYXRhID0gc3N0X3BsYXRmb3JtX2NvbXByX3NldF9tZXRhZGF0YSwKKwkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9jb21wcl90cmlnZ2VyLAorCS5wb2ludGVyID0gc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIsCisJLmFjayA9IHNzdF9wbGF0Zm9ybV9jb21wcl9hY2ssCisJLmdldF9jYXBzID0gc3N0X3BsYXRmb3JtX2NvbXByX2dldF9jYXBzLAorCS5nZXRfY29kZWNfY2FwcyA9IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgc3N0X3NvY19wbGF0Zm9ybV9kcnYgPSB7CisJLm9wcwkJPSAmc3N0X3BsYXRmb3JtX29wcywKKwkuY29tcHJfb3BzCT0gJnNzdF9wbGF0Zm9ybV9jb21wcl9vcHMsCisJLnBjbV9uZXcJPSBzc3RfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBzc3RfcGNtX2ZyZWUsCit9OworCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisKKwlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3Byb2JlIGNhbGxlZFxuIik7CisJc3N0ID0gTlVMTDsKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZzc3Rfc29jX3BsYXRmb3JtX2Rydik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInJlZ2lzdGVyaW5nIHNvYyBwbGF0Zm9ybSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZzc3RfY29tcG9uZW50LAorCQkJCXNzdF9wbGF0Zm9ybV9kYWksIEFSUkFZX1NJWkUoc3N0X3BsYXRmb3JtX2RhaSkpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJyZWdpc3RlcmluZyBjcHUgZGFpcyBmYWlsZWRcbiIpOworCQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9yZW1vdmUgc3VjY2Vzc1xuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzc3RfcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZQkJPSBzc3RfcGxhdGZvcm1fcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIE1JRCBQbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzc3QtbWZsZC1wbGF0Zm9ybSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRlMmRkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgc3N0X21mbGRfcGxhdGZvcm0uaCAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIgaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEludGVsIENvcnAKKyAqICBBdXRob3I6IFZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICogIEF1dGhvcjogSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqCisgKi8KKworI2lmbmRlZiBfX1NTVF9QTEFURk9STURSVl9IX18KKyNkZWZpbmUgX19TU1RfUExBVEZPUk1EUlZfSF9fCisKKyNpbmNsdWRlICJzc3QtbWZsZC1kc3AuaCIKKworI2RlZmluZSBTU1RfTU9OTwkJMQorI2RlZmluZSBTU1RfU1RFUkVPCQkyCisjZGVmaW5lIFNTVF9NQVhfQ0FQCQk1CisKKyNkZWZpbmUgU1NUX01BWF9CVUZGRVIJCSg4MDAqMTAyNCkKKyNkZWZpbmUgU1NUX01JTl9CVUZGRVIJCSg4MDAqMTAyNCkKKyNkZWZpbmUgU1NUX01JTl9QRVJJT0RfQllURVMJMzIKKyNkZWZpbmUgU1NUX01BWF9QRVJJT0RfQllURVMJU1NUX01BWF9CVUZGRVIKKyNkZWZpbmUgU1NUX01JTl9QRVJJT0RTCQkyCisjZGVmaW5lIFNTVF9NQVhfUEVSSU9EUwkJKDEwMjQqMikKKyNkZWZpbmUgU1NUX0ZJRk9fU0laRQkJMAorCitzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvIHsKKwlpbnQgc3RyX2lkOworCXZvaWQgKm1hZF9zdWJzdHJlYW07CisJdm9pZCAoKnBlcmlvZF9lbGFwc2VkKSAodm9pZCAqbWFkX3N1YnN0cmVhbSk7CisJdW5zaWduZWQgbG9uZyBsb25nIGJ1ZmZlcl9wdHI7CisJaW50IHNmcmVxOworfTsKKworZW51bSBzc3RfZHJ2X3N0YXR1cyB7CisJU1NUX1BMQVRGT1JNX0lOSVQgPSAxLAorCVNTVF9QTEFURk9STV9TVEFSVEVELAorCVNTVF9QTEFURk9STV9SVU5OSU5HLAorCVNTVF9QTEFURk9STV9QQVVTRUQsCisJU1NUX1BMQVRGT1JNX0RST1BQRUQsCit9OworCitlbnVtIHNzdF9jb250cm9scyB7CisJU1NUX1NORF9BTExPQyA9CQkJMHgwMCwKKwlTU1RfU05EX1BBVVNFID0JCQkweDAxLAorCVNTVF9TTkRfUkVTVU1FID0JCTB4MDIsCisJU1NUX1NORF9EUk9QID0JCQkweDAzLAorCVNTVF9TTkRfRlJFRSA9CQkJMHgwNCwKKwlTU1RfU05EX0JVRkZFUl9QT0lOVEVSID0JMHgwNSwKKwlTU1RfU05EX1NUUkVBTV9JTklUID0JCTB4MDYsCisJU1NUX1NORF9TVEFSVAkgPQkJMHgwNywKKwlTU1RfTUFYX0NPTlRST0xTID0JCTB4MDcsCit9OworCitlbnVtIHNzdF9zdHJlYW1fb3BzIHsKKwlTVFJFQU1fT1BTX1BMQVlCQUNLID0gMCwKKwlTVFJFQU1fT1BTX0NBUFRVUkUsCit9OworCitlbnVtIHNzdF9hdWRpb19kZXZpY2VfdHlwZSB7CisJU05EX1NTVF9ERVZJQ0VfSEVBRFNFVCA9IDEsCisJU05EX1NTVF9ERVZJQ0VfSUhGLAorCVNORF9TU1RfREVWSUNFX1ZJQlJBLAorCVNORF9TU1RfREVWSUNFX0hBUFRJQywKKwlTTkRfU1NUX0RFVklDRV9DQVBUVVJFLAorCVNORF9TU1RfREVWSUNFX0NPTVBSRVNTLAorfTsKKworLyogUENNIFBhcmFtZXRlcnMgKi8KK3N0cnVjdCBzc3RfcGNtX3BhcmFtcyB7CisJdTE2IGNvZGVjOwkvKiBjb2RlYyB0eXBlICovCisJdTggbnVtX2NoYW47CS8qIDE9TW9ubywgMj1TdGVyZW8gKi8KKwl1OCBwY21fd2Rfc3o7CS8qIDE2LzI0IC0gYml0Ki8KKwl1MzIgcmVzZXJ2ZWQ7CS8qIEJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kICovCisJdTMyIHNmcmVxOwkvKiBTYW1wbGluZyByYXRlIGluIEh6ICovCisJdTMyIHJpbmdfYnVmZmVyX3NpemU7CisJdTMyIHBlcmlvZF9jb3VudDsJLyogcGVyaW9kIGVsYXBzZWQgaW4gc2FtcGxlcyovCisJdTMyIHJpbmdfYnVmZmVyX2FkZHI7Cit9OworCitzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgeworCXUzMiByZXN1bHQ7CisJdTMyIHN0cmVhbV9pZDsKKwl1OCBjb2RlYzsKKwl1OCBvcHM7CisJdTggc3RyZWFtX3R5cGU7CisJdTggZGV2aWNlX3R5cGU7CisJc3RydWN0IHNzdF9wY21fcGFyYW1zIHNwYXJhbXM7Cit9OworCitzdHJ1Y3Qgc3N0X2NvbXByZXNzX2NiIHsKKwl2b2lkICpwYXJhbTsKKwl2b2lkICgqY29tcHJfY2IpKHZvaWQgKnBhcmFtKTsKK307CisKK3N0cnVjdCBjb21wcmVzc19zc3Rfb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKm9wZW4pIChzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbXMsCisJCQlzdHJ1Y3Qgc3N0X2NvbXByZXNzX2NiICpjYik7CisJaW50ICgqY29udHJvbCkgKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBzdHJfaWQpOworCWludCAoKnRzdGFtcCkgKHVuc2lnbmVkIGludCBzdHJfaWQsIHN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApOworCWludCAoKmFjaykgKHVuc2lnbmVkIGludCBzdHJfaWQsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpOworCWludCAoKmNsb3NlKSAodW5zaWduZWQgaW50IHN0cl9pZCk7CisJaW50ICgqZ2V0X2NhcHMpIChzdHJ1Y3Qgc25kX2NvbXByX2NhcHMgKmNhcHMpOworCWludCAoKmdldF9jb2RlY19jYXBzKSAoc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYyk7CisJaW50ICgqc2V0X21ldGFkYXRhKSAodW5zaWduZWQgaW50IHN0cl9pZCwKKwkJCXN0cnVjdCBzbmRfY29tcHJfbWV0YWRhdGEgKm1kYXRhKTsKKworfTsKKworc3RydWN0IHNzdF9vcHMgeworCWludCAoKm9wZW4pIChzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgKnN0cl9wYXJhbSk7CisJaW50ICgqZGV2aWNlX2NvbnRyb2wpIChpbnQgY21kLCB2b2lkICphcmcpOworCWludCAoKmNsb3NlKSAodW5zaWduZWQgaW50IHN0cl9pZCk7Cit9OworCitzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtIHsKKwlpbnQgICAgIHN0cmVhbV9zdGF0dXM7CisJdW5zaWduZWQgaW50IGlkOworCXNpemVfdCBieXRlc193cml0dGVuOworCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gc3RyZWFtX2luZm87CisJc3RydWN0IHNzdF9vcHMgKm9wczsKKwlzdHJ1Y3QgY29tcHJlc3Nfc3N0X29wcyAqY29tcHJfb3BzOworCXNwaW5sb2NrX3QJc3RhdHVzX2xvY2s7Cit9OworCitzdHJ1Y3Qgc3N0X2RldmljZSB7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNzdF9vcHMgKm9wczsKKwlzdHJ1Y3QgY29tcHJlc3Nfc3N0X29wcyAqY29tcHJfb3BzOworfTsKKworaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKnNzdCk7CitpbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpzc3QpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0X2RzcC5oIGIvc291bmQvc29jL2ludGVsL3NzdF9kc3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjZTFkZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0X2RzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNpZm5kZWYgX19TU1RfRFNQX0hfXwotI2RlZmluZSBfX1NTVF9EU1BfSF9fCi0vKgotICogIHNzdF9kc3AuaCAtIEludGVsIFNTVCBEcml2ZXIgZm9yIGF1ZGlvIGVuZ2luZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTIgSW50ZWwgQ29ycG9yYXRpb24KLSAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGxpbnV4LmludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotCi1lbnVtIHNzdF9jb2RlY190eXBlcyB7Ci0JLyogIEFVRElPL01VU0lDCUNPREVDIFR5cGUgRGVmaW5pdGlvbnMgKi8KLQlTU1RfQ09ERUNfVFlQRV9VTktOT1dOID0gMCwKLQlTU1RfQ09ERUNfVFlQRV9QQ00sCS8qIFBhc3MgdGhyb3VnaCBBdWRpbyBjb2RlYyAqLwotCVNTVF9DT0RFQ19UWVBFX01QMywKLQlTU1RfQ09ERUNfVFlQRV9NUDI0LAotCVNTVF9DT0RFQ19UWVBFX0FBQywKLQlTU1RfQ09ERUNfVFlQRV9BQUNQLAotCVNTVF9DT0RFQ19UWVBFX2VBQUNQLAotfTsKLQotZW51bSBzdHJlYW1fdHlwZSB7Ci0JU1NUX1NUUkVBTV9UWVBFX05PTkUgPSAwLAotCVNTVF9TVFJFQU1fVFlQRV9NVVNJQyA9IDEsCi19OwotCi1zdHJ1Y3Qgc25kX3BjbV9wYXJhbXMgewotCXUxNiBjb2RlYzsJLyogY29kZWMgdHlwZSAqLwotCXU4IG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvICovCi0JdTggcGNtX3dkX3N6OwkvKiAxNi8yNCAtIGJpdCovCi0JdTMyIHJlc2VydmVkOwkvKiBCaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZCAqLwotCXUzMiBzZnJlcTsJLyogU2FtcGxpbmcgcmF0ZSBpbiBIeiAqLwotCXU4IHVzZV9vZmZsb2FkX3BhdGg7Ci0JdTggcmVzZXJ2ZWQyOwotCXUxNiByZXNlcnZlZDM7Ci0JdTggY2hhbm5lbF9tYXBbOF07Ci19IF9fcGFja2VkOwotCi0vKiBNUDMgTXVzaWMgUGFyYW1ldGVycyBNZXNzYWdlICovCi1zdHJ1Y3Qgc25kX21wM19wYXJhbXMgewotCXUxNiBjb2RlYzsKLQl1OCAgbnVtX2NoYW47CS8qIDE9TW9ubywgMj1TdGVyZW8JKi8KLQl1OCAgcGNtX3dkX3N6OyAvKiAxNi8yNCAtIGJpdCovCi0JdTggIGNyY19jaGVjazsgLyogY3JjX2NoZWNrIC0gZGlzYWJsZSAoMCkgb3IgZW5hYmxlICgxKSAqLwotCXU4ICByZXNlcnZlZDE7IC8qIHVudXNlZCovCi0JdTE2IHJlc2VydmVkMjsJLyogVW51c2VkICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFBQ19CSVRfU1RSRUFNX0FEVFMJCTAKLSNkZWZpbmUgQUFDX0JJVF9TVFJFQU1fQURJRgkJMQotI2RlZmluZSBBQUNfQklUX1NUUkVBTV9SQVcJCTIKLQotLyogQUFDIE11c2ljIFBhcmFtZXRlcnMgTWVzc2FnZSAqLwotc3RydWN0IHNuZF9hYWNfcGFyYW1zIHsKLQl1MTYgY29kZWM7Ci0JdTggbnVtX2NoYW47IC8qIDE9TW9ubywgMj1TdGVyZW8qLwotCXU4IHBjbV93ZF9zejsgLyogMTYvMjQgLSBiaXQqLwotCXU4IGJkb3duc2FtcGxlOyAvKlNCUiBkb3duc2FtcGxpbmcgMCAtIGRpc2FibGUgMSAtZW5hYmxlZCBBQUMrIG9ubHkgKi8KLQl1OCBic19mb3JtYXQ7IC8qIGlucHV0IGJpdCBzdHJlYW0gZm9ybWF0IGFkdHM9MCwgYWRpZj0xLCByYXc9MiAqLwotCXUxNiAgcmVzZXIyOwotCXUzMiBleHRlcm5hbHNyOyAvKnNhbXBsaW5nIHJhdGUgb2YgYmFzaWMgQUFDIHJhdyBiaXQgc3RyZWFtKi8KLQl1OCBzYnJfc2lnbmFsbGluZzsvKmRpc2FibGUvZW5hYmxlL3NldCBhdXRvbW9kZSB0aGUgU0JSIHRvb2wuQUFDKyovCi0JdTggcmVzZXIxOwotCXUxNiAgcmVzZXIzOwotfSBfX3BhY2tlZDsKLQotLyogV01BIE11c2ljIFBhcmFtZXRlcnMgTWVzc2FnZSAqLwotc3RydWN0IHNuZF93bWFfcGFyYW1zIHsKLQl1MTYgY29kZWM7Ci0JdTggIG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvICovCi0JdTggIHBjbV93ZF9zejsJLyogMTYvMjQgLSBiaXQqLwotCXUzMiBicmF0ZTsJLyogVXNlIHRoZSBoYXJkIGNvZGVkIHZhbHVlLiAqLwotCXUzMiBzZnJlcTsJLyogU2FtcGxpbmcgZnJlcSBlZy4gODAwMCwgNDQxMDAwLCA0ODAwMCAqLwotCXUzMiBjaGFubmVsX21hc2s7ICAvKiBDaGFubmVsIE1hc2sgKi8KLQl1MTYgZm9ybWF0X3RhZzsJLyogRm9ybWF0IFRhZyAqLwotCXUxNiBibG9ja19hbGlnbjsJLyogcGFja2V0IHNpemUgKi8KLQl1MTYgd21hX2VuY29kZV9vcHQ7LyogRW5jb2RlciBvcHRpb24gKi8KLQl1OCBvcF9hbGlnbjsJLyogb3AgYWxpZ24gMC0gMTYgYml0LCAxLSBNU0IsIDIgTFNCICovCi0JdTggcmVzZXJ2ZWQ7CS8qIHJlc2VydmVkICovCi19IF9fcGFja2VkOwotCi0vKiBDb2RlYyBwYXJhbXMgc3RydXR1cmUgKi8KLXVuaW9uICBzbmRfc3N0X2NvZGVjX3BhcmFtcyB7Ci0Jc3RydWN0IHNuZF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7Ci0Jc3RydWN0IHNuZF9tcDNfcGFyYW1zIG1wM19wYXJhbXM7Ci0Jc3RydWN0IHNuZF9hYWNfcGFyYW1zIGFhY19wYXJhbXM7Ci0Jc3RydWN0IHNuZF93bWFfcGFyYW1zIHdtYV9wYXJhbXM7Ci19IF9fcGFja2VkOwotCi0vKiBBZGRyZXNzIGFuZCBzaXplIGluZm8gb2YgYSBmcmFtZSBidWZmZXIgKi8KLXN0cnVjdCBzc3RfYWRkcmVzc19pbmZvIHsKLQl1MzIgYWRkcjsgLyogQWRkcmVzcyBhdCBJQSAqLwotCXUzMiBzaXplOyAvKiBTaXplIG9mIHRoZSBidWZmZXIgKi8KLX07Ci0KLXN0cnVjdCBzbmRfc3N0X2FsbG9jX3BhcmFtc19leHQgewotCXN0cnVjdCBzc3RfYWRkcmVzc19pbmZvICByaW5nX2J1Zl9pbmZvWzhdOwotCXU4IHNnX2NvdW50OwotCXU4IHJlc2VydmVkOwotCXUxNiByZXNlcnZlZDI7Ci0JdTMyIGZyYWdfc2l6ZTsJLypOdW1iZXIgb2Ygc2FtcGxlcyBhZnRlciB3aGljaCBwZXJpb2QgZWxhcHNlZAotCQkJCSAgbWVzc2FnZSBpcyBzZW50IHZhbGlkIG9ubHkgaWYgcGF0aCAgPSAwKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzbmRfc3N0X3N0cmVhbV9wYXJhbXMgewotCXVuaW9uIHNuZF9zc3RfY29kZWNfcGFyYW1zIHVjOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNuZF9zc3RfcGFyYW1zIHsKLQl1MzIgc3RyZWFtX2lkOwotCXU4IGNvZGVjOwotCXU4IG9wczsKLQl1OCBzdHJlYW1fdHlwZTsKLQl1OCBkZXZpY2VfdHlwZTsKLQlzdHJ1Y3Qgc25kX3NzdF9zdHJlYW1fcGFyYW1zIHNwYXJhbXM7Ci0Jc3RydWN0IHNuZF9zc3RfYWxsb2NfcGFyYW1zX2V4dCBhcGFyYW1zOwotfTsKLQotI2VuZGlmIC8qIF9fU1NUX0RTUF9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NWE4MS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLyoKLSAqICBzc3RfcGxhdGZvcm0uYyAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgSW50ZWwgQ29ycAotICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKiAgQXV0aG9yOiBIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Ci0gKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICoKLSAqLwotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19kcml2ZXIuaD4KLSNpbmNsdWRlICJzc3RfcGxhdGZvcm0uaCIKLQotc3RhdGljIHN0cnVjdCBzc3RfZGV2aWNlICpzc3Q7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHNzdF9sb2NrKTsKLQotaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKmRldikKLXsKLQlpZiAoV0FSTl9PTighZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRldi0+ZHJpdmVyLT5vd25lcikpCi0JCXJldHVybiAtRU5PREVWOwotCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKLQlpZiAoc3N0KSB7Ci0JCXByX2Vycigid2UgYWxyZWFkeSBoYXZlIGEgZGV2aWNlICVzXG4iLCBzc3QtPm5hbWUpOwotCQltb2R1bGVfcHV0KGRldi0+ZGV2LT5kcml2ZXItPm93bmVyKTsKLQkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQlwcl9kZWJ1ZygicmVnaXN0ZXJpbmcgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOwotCXNzdCA9IGRldjsKLQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9yZWdpc3Rlcl9kc3ApOwotCi1pbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpkZXYpCi17Ci0JaWYgKFdBUk5fT04oIWRldikpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChkZXYgIT0gc3N0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKLQotCWlmICghc3N0KSB7Ci0JCW11dGV4X3VubG9jaygmc3N0X2xvY2spOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltb2R1bGVfcHV0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKLQlwcl9kZWJ1ZygidW5yZWcgJXNcbiIsIHNzdC0+bmFtZSk7Ci0Jc3N0ID0gTlVMTDsKLQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF91bnJlZ2lzdGVyX2RzcCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfcGxhdGZvcm1fcGNtX2h3ID0gewotCS5pbmZvID0JKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCVNORFJWX1BDTV9JTkZPX0RPVUJMRSB8Ci0JCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAotCQkJU05EUlZfUENNX0lORk9fTU1BUHwKLQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCi0JLmJ1ZmZlcl9ieXRlc19tYXggPSBTU1RfTUFYX0JVRkZFUiwKLQkucGVyaW9kX2J5dGVzX21pbiA9IFNTVF9NSU5fUEVSSU9EX0JZVEVTLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gU1NUX01BWF9QRVJJT0RfQllURVMsCi0JLnBlcmlvZHNfbWluID0gU1NUX01JTl9QRVJJT0RTLAotCS5wZXJpb2RzX21heCA9IFNTVF9NQVhfUEVSSU9EUywKLQkuZmlmb19zaXplID0gU1NUX0ZJRk9fU0laRSwKLX07Ci0KLS8qIE1GTEQgLSBNU0lDICovCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzc3RfcGxhdGZvcm1fZGFpW10gPSB7Ci17Ci0JLm5hbWUgPSAiSGVhZHNldC1jcHUtZGFpIiwKLQkuaWQgPSAwLAotCS5wbGF5YmFjayA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCi0JCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKLQl9LAotCS5jYXB0dXJlID0gewotCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDUsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi19LAotewotCS5uYW1lID0gIlNwZWFrZXItY3B1LWRhaSIsCi0JLmlkID0gMSwKLQkucGxheWJhY2sgPSB7Ci0JCS5jaGFubmVsc19taW4gPSBTU1RfTU9OTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi19LAotewotCS5uYW1lID0gIlZpYnJhMS1jcHUtZGFpIiwKLQkuaWQgPSAyLAotCS5wbGF5YmFjayA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAotCQkuY2hhbm5lbHNfbWF4ID0gU1NUX01PTk8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi19LAotewotCS5uYW1lID0gIlZpYnJhMi1jcHUtZGFpIiwKLQkuaWQgPSAzLAotCS5wbGF5YmFjayA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAotCQkuY2hhbm5lbHNfbWF4ID0gU1NUX1NURVJFTywKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JfSwKLX0sCi17Ci0JLm5hbWUgPSAiQ29tcHJlc3MtY3B1LWRhaSIsCi0JLmNvbXByZXNzX2RhaSA9IDEsCi0JLnBsYXliYWNrID0gewotCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwfFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCX0sCi19LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc3N0X2NvbXBvbmVudCA9IHsKLQkubmFtZQkJPSAic3N0IiwKLX07Ci0KLS8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtLAotCQkJCQlpbnQgc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOwotCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IHN0YXRlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3N0X2dldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSkKLXsKLQlpbnQgc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW0tPnN0YXR1c19sb2NrLCBmbGFncyk7Ci0Jc3RhdGUgPSBzdHJlYW0tPnN0cmVhbV9zdGF0dXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOwotCXJldHVybiBzdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgKnBhcmFtKQotewotCi0JcGFyYW0tPmNvZGVjID0gU1NUX0NPREVDX1RZUEVfUENNOwotCXBhcmFtLT5udW1fY2hhbiA9ICh1OCkgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKLQlwYXJhbS0+cGNtX3dkX3N6ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5zYW1wbGVfYml0czsKLQlwYXJhbS0+cmVzZXJ2ZWQgPSAwOwotCXBhcmFtLT5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKLQlwYXJhbS0+cmluZ19idWZmZXJfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwotCXBhcmFtLT5wZXJpb2RfY291bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCXBhcmFtLT5yaW5nX2J1ZmZlcl9hZGRyID0gdmlydF90b19waHlzKHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhKTsKLQlwcl9kZWJ1ZygicGVyaW9kX2NudCA9ICVkXG4iLCBwYXJhbS0+cGVyaW9kX2NvdW50KTsKLQlwcl9kZWJ1Zygic2ZyZXE9ICVkLCB3ZF9zeiA9ICVkXG4iLCBwYXJhbS0+c2ZyZXEsIHBhcmFtLT5wY21fd2Rfc3opOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9hbGxvY19zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KLQkJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzc3RfcGNtX3BhcmFtcyBwYXJhbSA9IHswfTsKLQlzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgc3RyX3BhcmFtcyA9IHswfTsKLQlpbnQgcmV0X3ZhbDsKLQotCS8qIHNldCBjb2RlYyBwYXJhbXMgYW5kIGluZm9ybSBTU1QgZHJpdmVyIHRoZSBzYW1lICovCi0Jc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdWJzdHJlYW0sICZwYXJhbSk7Ci0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOwotCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOwotCXN0cl9wYXJhbXMuY29kZWMgPSAgcGFyYW0uY29kZWM7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOwotCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gc3Vic3RyZWFtLT5wY20tPmRldmljZSArIDE7Ci0JCXByX2RlYnVnKCJQbGF5YmNrIHN0cmVhbSxEZXZpY2UgJWRcbiIsCi0JCQkJCXN1YnN0cmVhbS0+cGNtLT5kZXZpY2UpOwotCX0gZWxzZSB7Ci0JCXN0cl9wYXJhbXMub3BzID0gU1RSRUFNX09QU19DQVBUVVJFOwotCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRTsKLQkJcHJfZGVidWcoIkNhcHR1cmUgc3RyZWFtLERldmljZSAlZFxuIiwKLQkJCQkJc3Vic3RyZWFtLT5wY20tPmRldmljZSk7Ci0JfQotCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+b3Blbigmc3RyX3BhcmFtcyk7Ci0JcHJfZGVidWcoIlNTVF9TTkRfUExBWS9DQVBUVVJFIHJldF92YWwgPSAleFxuIiwgcmV0X3ZhbCk7Ci0JaWYgKHJldF92YWwgPCAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQotCXN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkID0gcmV0X3ZhbDsKLQlwcl9kZWJ1Zygic3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzdF9wZXJpb2RfZWxhcHNlZCh2b2lkICptYWRfc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gbWFkX3N1YnN0cmVhbTsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07Ci0JaW50IHN0YXR1czsKLQotCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCi0JCXJldHVybjsKLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXN0cmVhbSkKLQkJcmV0dXJuOwotCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOwotCWlmIChzdGF0dXMgIT0gU1NUX1BMQVRGT1JNX1JVTk5JTkcpCi0JCXJldHVybjsKLQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSA9Ci0JCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0X3ZhbDsKLQotCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFyYW1cbiIpOwotCXNzdF9zZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0sIFNTVF9QTEFURk9STV9JTklUKTsKLQlzdHJlYW0tPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gc3N0X3BlcmlvZF9lbGFwc2VkOwotCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOwotCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7Ci0JcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKLQkJCVNTVF9TTkRfU1RSRUFNX0lOSVQsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKLQlpZiAocmV0X3ZhbCkKLQkJcHJfZXJyKCJjb250cm9sX3NldCByZXQgZXJyb3IgJWRcbiIsIHJldF92YWwpOwotCXJldHVybiByZXRfdmFsOwotCi19Ci0vKiBlbmQgLS0gaGVscGVyIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCByZXRfdmFsOwotCi0JcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9vcGVuIGNhbGxlZFxuIik7Ci0KLQlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9wbGF0Zm9ybV9wY21faHcpOwotCXJldF92YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAotCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwotCWlmIChyZXRfdmFsIDwgMCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KLQlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdHJlYW0pCi0JCXJldHVybiAtRU5PTUVNOwotCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKLQotCS8qIGdldCB0aGUgc3N0IG9wcyAqLwotCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKLQlpZiAoIXNzdCkgewotCQlwcl9lcnIoIm5vIGRldmljZSBhdmFpbGFibGUgdG8gcnVuXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0JCWtmcmVlKHN0cmVhbSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKSkgewotCQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQkJa2ZyZWUoc3RyZWFtKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXN0cmVhbS0+b3BzID0gc3N0LT5vcHM7Ci0JbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0KLQlzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCA9IDA7Ci0Jc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgU1NUX1BMQVRGT1JNX0lOSVQpOwotCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIFNTVCBBUEkgc2V0ICovCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKLQotCXByX2RlYnVnKCJzc3RfcGxhdGZvcm1fY2xvc2UgY2FsbGVkXG4iKTsKLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKLQlpZiAoc3RyX2lkKQotCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmNsb3NlKHN0cl9pZCk7Ci0JbW9kdWxlX3B1dChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcik7Ci0Ja2ZyZWUoc3RyZWFtKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwotCi0JcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSBjYWxsZWRcbiIpOwotCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOwotCWlmIChzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCkgewotCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKAotCQkJCVNTVF9TTkRfRFJPUCwgJnN0cl9pZCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQotCXJldF92YWwgPSBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN1YnN0cmVhbSk7Ci0JaWYgKHJldF92YWwgPCAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAotCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwotCi0JcmV0X3ZhbCA9IHNzdF9wbGF0Zm9ybV9pbml0X3N0cmVhbShzdWJzdHJlYW0pOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUjsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJCWludCBjbWQpCi17Ci0JaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCBzdHJfY21kLCBzdGF0dXM7Ci0KLQlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyIGNhbGxlZFxuIik7Ci0Jc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlwcl9kZWJ1Zygic3N0OiBUcmlnZ2VyIFN0YXJ0XG4iKTsKLQkJc3RyX2NtZCA9IFNTVF9TTkRfU1RBUlQ7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9SVU5OSU5HOwotCQlzdHJlYW0tPnN0cmVhbV9pbmZvLm1hZF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcHJfZGVidWcoInNzdDogaW4gc3RvcFxuIik7Ci0JCXN0cl9jbWQgPSBTU1RfU05EX0RST1A7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9EUk9QUEVEOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlXG4iKTsKLQkJc3RyX2NtZCA9IFNTVF9TTkRfUEFVU0U7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9QQVVTRUQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJcHJfZGVidWcoInNzdDogaW4gcGF1c2UgcmVsZWFzZVxuIik7Ci0JCXN0cl9jbWQgPSBTU1RfU05EX1JFU1VNRTsKLQkJc3RhdHVzID0gU1NUX1BMQVRGT1JNX1JVTk5JTkc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKHN0cl9jbWQsICZzdHJfaWQpOwotCWlmICghcmV0X3ZhbCkKLQkJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgc3RhdHVzKTsKLQotCXJldHVybiByZXRfdmFsOwotfQotCi0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfcGxhdGZvcm1fcGNtX3BvaW50ZXIKLQkJCShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07Ci0JaW50IHJldF92YWwsIHN0YXR1czsKLQlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQotCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOwotCWlmIChzdGF0dXMgPT0gU1NUX1BMQVRGT1JNX0lOSVQpCi0JCXJldHVybiAwOwotCXN0cl9pbmZvID0gJnN0cmVhbS0+c3RyZWFtX2luZm87Ci0JcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKLQkJCQlTU1RfU05EX0JVRkZFUl9QT0lOVEVSLCBzdHJfaW5mbyk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IGVycm9yIGNvZGUgPSAlZFxuIiwgcmV0X3ZhbCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQlyZXR1cm4gc3RyZWFtLT5zdHJlYW1faW5mby5idWZmZXJfcHRyOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOwotCW1lbXNldChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhLCAwLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X3BsYXRmb3JtX29wcyA9IHsKLQkub3BlbiA9IHNzdF9wbGF0Zm9ybV9vcGVuLAotCS5jbG9zZSA9IHNzdF9wbGF0Zm9ybV9jbG9zZSwKLQkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKLQkucHJlcGFyZSA9IHNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSwKLQkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IHNzdF9wbGF0Zm9ybV9wY21fcG9pbnRlciwKLQkuaHdfcGFyYW1zID0gc3N0X3BsYXRmb3JtX3BjbV9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzc3RfcGxhdGZvcm1fcGNtX2h3X2ZyZWUsCi19OwotCi1zdGF0aWMgdm9pZCBzc3RfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKLXsKLQlwcl9kZWJ1Zygic3N0X3BjbV9mcmVlIGNhbGxlZFxuIik7Ci0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlwcl9kZWJ1Zygic3N0X3BjbV9uZXcgY2FsbGVkXG4iKTsKLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAotCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7Ci0JCXJldHZhbCA9ICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKLQkJCVNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCi0JCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKLQkJCVNTVF9NSU5fQlVGRkVSLCBTU1RfTUFYX0JVRkZFUik7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCXByX2VycigiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uZiBmYWlsXG4iKTsKLQkJCXJldHVybiByZXR2YWw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogY29tcHJlc3Mgc3RyZWFtIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyB2b2lkIHNzdF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IChzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqKWFyZzsKLQotCXByX2RlYnVnKCJmcmFnbWVudCBlbGFwc2VkIGJ5IGRyaXZlclxuIik7Ci0JaWYgKGNzdHJlYW0pCi0JCXNuZF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKGNzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCi0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOwotCWlmICghc3RyZWFtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKLQotCS8qIGdldCB0aGUgc3N0IG9wcyAqLwotCWlmICghc3N0IHx8ICF0cnlfbW9kdWxlX2dldChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcikpIHsKLQkJcHJfZXJyKCJubyBkZXZpY2UgYXZhaWxhYmxlIHRvIHJ1blxuIik7Ci0JCXJldF92YWwgPSAtRU5PREVWOwotCQlnb3RvIG91dF9vcHM7Ci0JfQotCXN0cmVhbS0+Y29tcHJfb3BzID0gc3N0LT5jb21wcl9vcHM7Ci0KLQlzdHJlYW0tPmlkID0gMDsKLQlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBTU1RfUExBVEZPUk1fSU5JVCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOwotCXJldHVybiAwOwotb3V0X29wczoKLQlrZnJlZShzdHJlYW0pOwotCXJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKLQotCXN0cmVhbSA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQkvKm5lZWQgdG8gY2hlY2sqLwotCXN0cl9pZCA9IHN0cmVhbS0+aWQ7Ci0JaWYgKHN0cl9pZCkKLQkJcmV0X3ZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5jbG9zZShzdHJfaWQpOwotCW1vZHVsZV9wdXQoc3N0LT5kZXYtPmRyaXZlci0+b3duZXIpOwotCWtmcmVlKHN0cmVhbSk7Ci0JcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIHJldF92YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9zZXRfcGFyYW1zKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyBzdHJfcGFyYW1zOwotCXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgY2I7Ci0KLQlzdHJlYW0gPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JLyogY29uc3RydWN0IGZ3IHN0cnVjdHVyZSBmb3IgdGhpcyovCi0JbWVtc2V0KCZzdHJfcGFyYW1zLCAwLCBzaXplb2Yoc3RyX3BhcmFtcykpOwotCi0Jc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOwotCXN0cl9wYXJhbXMuc3RyZWFtX3R5cGUgPSBTU1RfU1RSRUFNX1RZUEVfTVVTSUM7Ci0Jc3RyX3BhcmFtcy5kZXZpY2VfdHlwZSA9IFNORF9TU1RfREVWSUNFX0NPTVBSRVNTOwotCi0Jc3dpdGNoIChwYXJhbXMtPmNvZGVjLmlkKSB7Ci0JY2FzZSBTTkRfQVVESU9DT0RFQ19NUDM6IHsKLQkJc3RyX3BhcmFtcy5jb2RlYyA9IFNTVF9DT0RFQ19UWVBFX01QMzsKLQkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9NUDM7Ci0JCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5tcDNfcGFyYW1zLm51bV9jaGFuID0gcGFyYW1zLT5jb2RlYy5jaF9pbjsKLQkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMucGNtX3dkX3N6ID0gMTY7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EX0FVRElPQ09ERUNfQUFDOiB7Ci0JCXN0cl9wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9BQUM7Ci0JCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLmNvZGVjID0gU1NUX0NPREVDX1RZUEVfQUFDOwotCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5udW1fY2hhbiA9IHBhcmFtcy0+Y29kZWMuY2hfaW47Ci0JCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLnBjbV93ZF9zeiA9IDE2OwotCQlpZiAocGFyYW1zLT5jb2RlYy5mb3JtYXQgPT0gU05EX0FVRElPU1RSRUFNRk9STUFUX01QNEFEVFMpCi0JCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQotCQkJCQkJCUFBQ19CSVRfU1RSRUFNX0FEVFM7Ci0JCWVsc2UgaWYgKHBhcmFtcy0+Y29kZWMuZm9ybWF0ID09IFNORF9BVURJT1NUUkVBTUZPUk1BVF9SQVcpCi0JCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQotCQkJCQkJCUFBQ19CSVRfU1RSRUFNX1JBVzsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIlVuZGVmaW5lZCBmb3JtYXQlZFxuIiwgcGFyYW1zLT5jb2RlYy5mb3JtYXQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLmFhY19wYXJhbXMuZXh0ZXJuYWxzciA9Ci0JCQkJCQlwYXJhbXMtPmNvZGVjLnNhbXBsZV9yYXRlOwotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoImNvZGVjIG5vdCBzdXBwb3J0ZWQsIGlkID0lZFxuIiwgcGFyYW1zLT5jb2RlYy5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cl9wYXJhbXMuYXBhcmFtcy5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgID0KLQkJCQkJdmlydF90b19waHlzKGNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcik7Ci0Jc3RyX3BhcmFtcy5hcGFyYW1zLnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9Ci0JCQkJCWNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCXN0cl9wYXJhbXMuYXBhcmFtcy5zZ19jb3VudCA9IDE7Ci0Jc3RyX3BhcmFtcy5hcGFyYW1zLmZyYWdfc2l6ZSA9IGNzdHJlYW0tPnJ1bnRpbWUtPmZyYWdtZW50X3NpemU7Ci0KLQljYi5wYXJhbSA9IGNzdHJlYW07Ci0JY2IuY29tcHJfY2IgPSBzc3RfY29tcHJfZnJhZ21lbnRfZWxhcHNlZDsKLQotCXJldHZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5vcGVuKCZzdHJfcGFyYW1zLCAmY2IpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByX2Vycigic3RyZWFtIGFsbG9jYXRpb24gZmFpbGVkICVkXG4iLCByZXR2YWwpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXN0cmVhbS0+aWQgPSByZXR2YWw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3RyaWdnZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sIGludCBjbWQpCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KLQkJY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHN0cmVhbS0+Y29tcHJfb3BzLT5jb250cm9sKGNtZCwgc3RyZWFtLT5pZCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJCXN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJlYW0tPmNvbXByX29wcy0+dHN0YW1wKHN0cmVhbS0+aWQsIHRzdGFtcCk7Ci0JdHN0YW1wLT5ieXRlX29mZnNldCA9IHRzdGFtcC0+Y29waWVkX3RvdGFsICUKLQkJCQkgKHUzMiljc3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZTsKLQlwcl9kZWJ1ZygiY2FsYyBieXRlcyBvZmZzZXQvY29waWVkIGJ5dGVzIGFzICVkXG4iLCB0c3RhbXAtPmJ5dGVfb2Zmc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfYWNrKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzaXplX3QgYnl0ZXMpCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJlYW0tPmNvbXByX29wcy0+YWNrKHN0cmVhbS0+aWQsICh1bnNpZ25lZCBsb25nKWJ5dGVzKTsKLQlzdHJlYW0tPmJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfZ2V0X2NhcHMoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJCXN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2FwcykKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQotCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jYXBzKGNhcHMpOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQkJc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQotCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jb2RlY19jYXBzKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X21ldGFkYXRhKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZXRhZGF0YSkKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gID0KLQkJIGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCXJldHVybiBzdHJlYW0tPmNvbXByX29wcy0+c2V0X21ldGFkYXRhKHN0cmVhbS0+aWQsIG1ldGFkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIHNzdF9wbGF0Zm9ybV9jb21wcl9vcHMgPSB7Ci0KLQkub3BlbiA9IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuLAotCS5mcmVlID0gc3N0X3BsYXRmb3JtX2NvbXByX2ZyZWUsCi0JLnNldF9wYXJhbXMgPSBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X3BhcmFtcywKLQkuc2V0X21ldGFkYXRhID0gc3N0X3BsYXRmb3JtX2NvbXByX3NldF9tZXRhZGF0YSwKLQkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9jb21wcl90cmlnZ2VyLAotCS5wb2ludGVyID0gc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIsCi0JLmFjayA9IHNzdF9wbGF0Zm9ybV9jb21wcl9hY2ssCi0JLmdldF9jYXBzID0gc3N0X3BsYXRmb3JtX2NvbXByX2dldF9jYXBzLAotCS5nZXRfY29kZWNfY2FwcyA9IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgc3N0X3NvY19wbGF0Zm9ybV9kcnYgPSB7Ci0JLm9wcwkJPSAmc3N0X3BsYXRmb3JtX29wcywKLQkuY29tcHJfb3BzCT0gJnNzdF9wbGF0Zm9ybV9jb21wcl9vcHMsCi0JLnBjbV9uZXcJPSBzc3RfcGNtX25ldywKLQkucGNtX2ZyZWUJPSBzc3RfcGNtX2ZyZWUsCi19OwotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQ7Ci0KLQlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3Byb2JlIGNhbGxlZFxuIik7Ci0Jc3N0ID0gTlVMTDsKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZzc3Rfc29jX3BsYXRmb3JtX2Rydik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoInJlZ2lzdGVyaW5nIHNvYyBwbGF0Zm9ybSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZzc3RfY29tcG9uZW50LAotCQkJCXNzdF9wbGF0Zm9ybV9kYWksIEFSUkFZX1NJWkUoc3N0X3BsYXRmb3JtX2RhaSkpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJyZWdpc3RlcmluZyBjcHUgZGFpcyBmYWlsZWRcbiIpOwotCQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0Jc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9yZW1vdmUgc3VjY2Vzc1xuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCQk9ICJzc3QtcGxhdGZvcm0iLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gc3N0X3BsYXRmb3JtX3Byb2JlLAotCS5yZW1vdmUJCT0gc3N0X3BsYXRmb3JtX3JlbW92ZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X3BsYXRmb3JtX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBNSUQgUGxhdGZvcm0gZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4iKTsKLU1PRFVMRV9BVVRIT1IoIkhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06c3N0LXBsYXRmb3JtIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTY0ZmIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdF9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiAgc3N0X3BsYXRmb3JtLmggLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyIGhlYWRlciBmaWxlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqICBBdXRob3I6IEhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKgotICovCi0KLSNpZm5kZWYgX19TU1RfUExBVEZPUk1EUlZfSF9fCi0jZGVmaW5lIF9fU1NUX1BMQVRGT1JNRFJWX0hfXwotCi0jaW5jbHVkZSAic3N0X2RzcC5oIgotCi0jZGVmaW5lIFNTVF9NT05PCQkxCi0jZGVmaW5lIFNTVF9TVEVSRU8JCTIKLSNkZWZpbmUgU1NUX01BWF9DQVAJCTUKLQotI2RlZmluZSBTU1RfTUFYX0JVRkZFUgkJKDgwMCoxMDI0KQotI2RlZmluZSBTU1RfTUlOX0JVRkZFUgkJKDgwMCoxMDI0KQotI2RlZmluZSBTU1RfTUlOX1BFUklPRF9CWVRFUwkzMgotI2RlZmluZSBTU1RfTUFYX1BFUklPRF9CWVRFUwlTU1RfTUFYX0JVRkZFUgotI2RlZmluZSBTU1RfTUlOX1BFUklPRFMJCTIKLSNkZWZpbmUgU1NUX01BWF9QRVJJT0RTCQkoMTAyNCoyKQotI2RlZmluZSBTU1RfRklGT19TSVpFCQkwCi0KLXN0cnVjdCBwY21fc3RyZWFtX2luZm8gewotCWludCBzdHJfaWQ7Ci0Jdm9pZCAqbWFkX3N1YnN0cmVhbTsKLQl2b2lkICgqcGVyaW9kX2VsYXBzZWQpICh2b2lkICptYWRfc3Vic3RyZWFtKTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYnVmZmVyX3B0cjsKLQlpbnQgc2ZyZXE7Ci19OwotCi1lbnVtIHNzdF9kcnZfc3RhdHVzIHsKLQlTU1RfUExBVEZPUk1fSU5JVCA9IDEsCi0JU1NUX1BMQVRGT1JNX1NUQVJURUQsCi0JU1NUX1BMQVRGT1JNX1JVTk5JTkcsCi0JU1NUX1BMQVRGT1JNX1BBVVNFRCwKLQlTU1RfUExBVEZPUk1fRFJPUFBFRCwKLX07Ci0KLWVudW0gc3N0X2NvbnRyb2xzIHsKLQlTU1RfU05EX0FMTE9DID0JCQkweDAwLAotCVNTVF9TTkRfUEFVU0UgPQkJCTB4MDEsCi0JU1NUX1NORF9SRVNVTUUgPQkJMHgwMiwKLQlTU1RfU05EX0RST1AgPQkJCTB4MDMsCi0JU1NUX1NORF9GUkVFID0JCQkweDA0LAotCVNTVF9TTkRfQlVGRkVSX1BPSU5URVIgPQkweDA1LAotCVNTVF9TTkRfU1RSRUFNX0lOSVQgPQkJMHgwNiwKLQlTU1RfU05EX1NUQVJUCSA9CQkweDA3LAotCVNTVF9NQVhfQ09OVFJPTFMgPQkJMHgwNywKLX07Ci0KLWVudW0gc3N0X3N0cmVhbV9vcHMgewotCVNUUkVBTV9PUFNfUExBWUJBQ0sgPSAwLAotCVNUUkVBTV9PUFNfQ0FQVFVSRSwKLX07Ci0KLWVudW0gc3N0X2F1ZGlvX2RldmljZV90eXBlIHsKLQlTTkRfU1NUX0RFVklDRV9IRUFEU0VUID0gMSwKLQlTTkRfU1NUX0RFVklDRV9JSEYsCi0JU05EX1NTVF9ERVZJQ0VfVklCUkEsCi0JU05EX1NTVF9ERVZJQ0VfSEFQVElDLAotCVNORF9TU1RfREVWSUNFX0NBUFRVUkUsCi0JU05EX1NTVF9ERVZJQ0VfQ09NUFJFU1MsCi19OwotCi0vKiBQQ00gUGFyYW1ldGVycyAqLwotc3RydWN0IHNzdF9wY21fcGFyYW1zIHsKLQl1MTYgY29kZWM7CS8qIGNvZGVjIHR5cGUgKi8KLQl1OCBudW1fY2hhbjsJLyogMT1Nb25vLCAyPVN0ZXJlbyAqLwotCXU4IHBjbV93ZF9zejsJLyogMTYvMjQgLSBiaXQqLwotCXUzMiByZXNlcnZlZDsJLyogQml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgKi8KLQl1MzIgc2ZyZXE7CS8qIFNhbXBsaW5nIHJhdGUgaW4gSHogKi8KLQl1MzIgcmluZ19idWZmZXJfc2l6ZTsKLQl1MzIgcGVyaW9kX2NvdW50OwkvKiBwZXJpb2QgZWxhcHNlZCBpbiBzYW1wbGVzKi8KLQl1MzIgcmluZ19idWZmZXJfYWRkcjsKLX07Ci0KLXN0cnVjdCBzc3Rfc3RyZWFtX3BhcmFtcyB7Ci0JdTMyIHJlc3VsdDsKLQl1MzIgc3RyZWFtX2lkOwotCXU4IGNvZGVjOwotCXU4IG9wczsKLQl1OCBzdHJlYW1fdHlwZTsKLQl1OCBkZXZpY2VfdHlwZTsKLQlzdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgc3BhcmFtczsKLX07Ci0KLXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgewotCXZvaWQgKnBhcmFtOwotCXZvaWQgKCpjb21wcl9jYikodm9pZCAqcGFyYW0pOwotfTsKLQotc3RydWN0IGNvbXByZXNzX3NzdF9vcHMgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50ICgqb3BlbikgKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtcywKLQkJCXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgKmNiKTsKLQlpbnQgKCpjb250cm9sKSAodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50IHN0cl9pZCk7Ci0JaW50ICgqdHN0YW1wKSAodW5zaWduZWQgaW50IHN0cl9pZCwgc3RydWN0IHNuZF9jb21wcl90c3RhbXAgKnRzdGFtcCk7Ci0JaW50ICgqYWNrKSAodW5zaWduZWQgaW50IHN0cl9pZCwgdW5zaWduZWQgbG9uZyBieXRlcyk7Ci0JaW50ICgqY2xvc2UpICh1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLQlpbnQgKCpnZXRfY2FwcykgKHN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2Fwcyk7Ci0JaW50ICgqZ2V0X2NvZGVjX2NhcHMpIChzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgKmNvZGVjKTsKLQlpbnQgKCpzZXRfbWV0YWRhdGEpICh1bnNpZ25lZCBpbnQgc3RyX2lkLAotCQkJc3RydWN0IHNuZF9jb21wcl9tZXRhZGF0YSAqbWRhdGEpOwotCi19OwotCi1zdHJ1Y3Qgc3N0X29wcyB7Ci0JaW50ICgqb3BlbikgKHN0cnVjdCBzc3Rfc3RyZWFtX3BhcmFtcyAqc3RyX3BhcmFtKTsKLQlpbnQgKCpkZXZpY2VfY29udHJvbCkgKGludCBjbWQsIHZvaWQgKmFyZyk7Ci0JaW50ICgqY2xvc2UpICh1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLX07Ci0KLXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gewotCWludCAgICAgc3RyZWFtX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0Jc2l6ZV90IGJ5dGVzX3dyaXR0ZW47Ci0Jc3RydWN0IHBjbV9zdHJlYW1faW5mbyBzdHJlYW1faW5mbzsKLQlzdHJ1Y3Qgc3N0X29wcyAqb3BzOwotCXN0cnVjdCBjb21wcmVzc19zc3Rfb3BzICpjb21wcl9vcHM7Ci0Jc3BpbmxvY2tfdAlzdGF0dXNfbG9jazsKLX07Ci0KLXN0cnVjdCBzc3RfZGV2aWNlIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc3N0X29wcyAqb3BzOwotCXN0cnVjdCBjb21wcmVzc19zc3Rfb3BzICpjb21wcl9vcHM7Ci19OwotCi1pbnQgc3N0X3JlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqc3N0KTsKLWludCBzc3RfdW5yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKnNzdCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnIGIvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcKaW5kZXggNzhlZDRhNC4uNDlmODQzNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcKKysrIGIvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcKQEAgLTEsMTEgKzEsMjAgQEAKIGNvbmZpZyBTTkRfS0lSS1dPT0RfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIE1hcnZlbGwgS2lya3dvb2QgYW5kIERvdmUgY2hpcHMiCi0JZGVwZW5kcyBvbiBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9ET1ZFIHx8IEFSQ0hfTVZFQlUgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCiAJICB0aGUgS2lya3dvb2QgSTJTIGludGVyZmFjZS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdCB0aGUKIAkgIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KIAorY29uZmlnIFNORF9LSVJLV09PRF9TT0NfQVJNQURBMzcwX0RCCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBBcm1hZGEgMzcwIERCIgorCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiAoQVJDSF9NVkVCVSB8fCBDT01QSUxFX1RFU1QpICYmIEkyQworCXNlbGVjdCBTTkRfU09DX0NTNDJMNTEKKwlzZWxlY3QgU05EX1NPQ19TUERJRgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24KKwkgIHRoZSBBcm1hZGEgMzcwIERldmVsb3BtZW50IEJvYXJkLgorCiBjb25maWcgU05EX0tJUktXT09EX1NPQ19PUEVOUkQKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIEtpcmt3b29kIE9wZW5yZCBDbGllbnQiCiAJZGVwZW5kcyBvbiBTTkRfS0lSS1dPT0RfU09DICYmIChNQUNIX09QRU5SRF9DTElFTlQgfHwgTUFDSF9PUEVOUkRfVUxUSU1BVEUgfHwgQ09NUElMRV9URVNUKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlIGIvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlCmluZGV4IDllNzgxMzguLjdjMWQ4ZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2Mva2lya3dvb2QvTWFrZWZpbGUKQEAgLTQsNiArNCw4IEBACiAKIHNuZC1zb2Mtb3BlbnJkLW9ianMgOj0ga2lya3dvb2Qtb3BlbnJkLm8KIHNuZC1zb2MtdDUzMjUtb2JqcyA6PSBraXJrd29vZC10NTMyNS5vCitzbmQtc29jLWFybWFkYS0zNzAtZGItb2JqcyA6PSBhcm1hZGEtMzcwLWRiLm8KIAorb2JqLSQoQ09ORklHX1NORF9LSVJLV09PRF9TT0NfQVJNQURBMzcwX0RCKSArPSBzbmQtc29jLWFybWFkYS0zNzAtZGIubwogb2JqLSQoQ09ORklHX1NORF9LSVJLV09PRF9TT0NfT1BFTlJEKSArPSBzbmQtc29jLW9wZW5yZC5vCiBvYmotJChDT05GSUdfU05EX0tJUktXT09EX1NPQ19UNTMyNSkgKz0gc25kLXNvYy10NTMyNS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2QvYXJtYWRhLTM3MC1kYi5jIGIvc291bmQvc29jL2tpcmt3b29kL2FybWFkYS0zNzAtZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQzMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2tpcmt3b29kL2FybWFkYS0zNzAtZGIuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNYXJ2ZWxsCisgKgorICogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2Mta2lya3dvb2QuaD4KKyNpbmNsdWRlICIuLi9jb2RlY3MvY3M0Mmw1MS5oIgorCitzdGF0aWMgaW50IGEzNzBkYl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJdW5zaWduZWQgaW50IGZyZXE7CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwlkZWZhdWx0OgorCWNhc2UgNDQxMDA6CisJCWZyZXEgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJZnJlcSA9IDEyMjg4MDAwOworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQlmcmVxID0gMjQ1NzYwMDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgZnJlcSwgU05EX1NPQ19DTE9DS19JTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYTM3MGRiX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYTM3MGRiX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhMzcwZGJfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJPdXQgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJJbiBKYWNrIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhMzcwZGJfcm91dGVbXSA9IHsKKwl7ICJPdXQgSmFjayIsCU5VTEwsCSJIUEwiIH0sCisJeyAiT3V0IEphY2siLAlOVUxMLAkiSFBSIiB9LAorCXsgIkFJTjFMIiwJTlVMTCwJIkluIEphY2siIH0sCisJeyAiQUlOMUwiLAlOVUxMLAkiSW4gSmFjayIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBhMzcwZGJfZGFpW10gPSB7Cit7CisJLm5hbWUgPSAiQ1M0Mkw1MSIsCisJLnN0cmVhbV9uYW1lID0gImFuYWxvZyIsCisJLmNwdV9kYWlfbmFtZSA9ICJpMnMiLAorCS5jb2RlY19kYWlfbmFtZSA9ICJjczQybDUxLWhpZmkiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkub3BzID0gJmEzNzBkYl9vcHMsCit9LAoreworCS5uYW1lID0gIlMvUERJRiBvdXQiLAorCS5zdHJlYW1fbmFtZSA9ICJzcGRpZi1vdXQiLAorCS5jcHVfZGFpX25hbWUgPSAic3BkaWYiLAorCS5jb2RlY19kYWlfbmFtZSA9ICJkaXQtaGlmaSIsCisJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorfSwKK3sKKwkubmFtZSA9ICJTL1BESUYgaW4iLAorCS5zdHJlYW1fbmFtZSA9ICJzcGRpZi1pbiIsCisJLmNwdV9kYWlfbmFtZSA9ICJzcGRpZiIsCisJLmNvZGVjX2RhaV9uYW1lID0gImRpci1oaWZpIiwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCit9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYTM3MGRiID0geworCS5uYW1lID0gImEzNzBkYiIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmRhaV9saW5rID0gYTM3MGRiX2RhaSwKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShhMzcwZGJfZGFpKSwKKwkuZGFwbV93aWRnZXRzID0gYTM3MGRiX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYTM3MGRiX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYTM3MGRiX3JvdXRlLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGEzNzBkYl9yb3V0ZSksCit9OworCitzdGF0aWMgaW50IGEzNzBkYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmYTM3MGRiOworCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWEzNzBkYl9kYWlbMF0uY3B1X29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAibWFydmVsbCxhdWRpby1jb250cm9sbGVyIiwgMCk7CisJYTM3MGRiX2RhaVswXS5wbGF0Zm9ybV9vZl9ub2RlID0gYTM3MGRiX2RhaVswXS5jcHVfb2Zfbm9kZTsKKworCWEzNzBkYl9kYWlbMF0uY29kZWNfb2Zfbm9kZSA9CisJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICJtYXJ2ZWxsLGF1ZGlvLWNvZGVjIiwgMCk7CisKKwlhMzcwZGJfZGFpWzFdLmNwdV9vZl9ub2RlID0gYTM3MGRiX2RhaVswXS5jcHVfb2Zfbm9kZTsKKwlhMzcwZGJfZGFpWzFdLnBsYXRmb3JtX29mX25vZGUgPSBhMzcwZGJfZGFpWzBdLmNwdV9vZl9ub2RlOworCisJYTM3MGRiX2RhaVsxXS5jb2RlY19vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgIm1hcnZlbGwsYXVkaW8tY29kZWMiLCAxKTsKKworCWEzNzBkYl9kYWlbMl0uY3B1X29mX25vZGUgPSBhMzcwZGJfZGFpWzBdLmNwdV9vZl9ub2RlOworCWEzNzBkYl9kYWlbMl0ucGxhdGZvcm1fb2Zfbm9kZSA9IGEzNzBkYl9kYWlbMF0uY3B1X29mX25vZGU7CisKKwlhMzcwZGJfZGFpWzJdLmNvZGVjX29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAibWFydmVsbCxhdWRpby1jb2RlYyIsIDIpOworCisJcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQtPmRldiwgY2FyZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGEzNzBkYl9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYTM3MGRiLWF1ZGlvIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGEzNzBkYl9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImEzNzBkYi1hdWRpbyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYTM3MGRiX2R0X2lkcyksCisJfSwKKwkucHJvYmUJCT0gYTM3MGRiX3Byb2JlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhMzcwZGJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIGEzNzBkYiBhdWRpbyBjbGllbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YTM3MGRiLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKaW5kZXggMzkyMGE1ZS4uOWY4NDIyMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYwpAQCAtNjMzLDYgKzYzMyw3IEBACiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtdmVidV9hdWRpb19vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxraXJrd29vZC1hdWRpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsZG92ZS1hdWRpbyIgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhMzcwLWF1ZGlvIiB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG12ZWJ1X2F1ZGlvX29mX21hdGNoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IDIyYWQ5YzUuLmUwMDY1OTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtNTgsNyArNTgsNyBAQAogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3Igb21hcCBvc2s1OTEyIgogCWRlcGVuZHMgb24gU05EX09NQVBfU09DICYmIE1BQ0hfT01BUF9PU0sgJiYgSTJDCiAJc2VsZWN0IFNORF9PTUFQX1NPQ19NQ0JTUAotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBvc2s1OTEyLgogCkBAIC02Niw3ICs2Niw3IEBACiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBPTUFQMzUxNyAvIEFNMzUxNyBFVk0iCiAJZGVwZW5kcyBvbiBTTkRfT01BUF9TT0MgJiYgTUFDSF9PTUFQMzUxN0VWTSAmJiBJMkMKIAlzZWxlY3QgU05EX09NQVBfU09DX01DQlNQCi0Jc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBPTUFQMzUxNyAvIEFNMzUxNwogCSAgRVZNLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMgYi9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYwppbmRleCA2Mjk0NDY0Li41NmE1MjE5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYwpAQCAtMTAzLDYwICsxMDMsNjIgQEAKIAlpZiAoIWNvZGVjLT5od193cml0ZSkKIAkJcmV0dXJuIC1FVU5BVENIOwogCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gY29udHJvbC0+bWF4KQorCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IGNvbnRyb2wtPml0ZW1zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAKIAkvKiBUcmFuc2xhdGUgc2VsZWN0aW9uIHRvIGJpdG1hcCAqLwogCXBpbnMgPSBhbXNfZGVsdGFfYXVkaW9fbW9kZV9waW5zW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF1dOwogCiAJLyogU2V0dXAgcGlucyBhZnRlciBjb3JyZXNwb25kaW5nIGJpdHMgaWYgY2hhbmdlZCAqLwogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfTU9VVEhQSUVDRSkpOworCiAJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIk1vdXRocGllY2UiKSkgewogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7CisJCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTW91dGhwaWVjZSIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1vdXRocGllY2UiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTW91dGhwaWVjZSIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX0VBUlBJRUNFKSk7CiAJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIkVhcnBpZWNlIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRWFycGllY2UiKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFYXJwaWVjZSIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkVhcnBpZWNlIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVhcnBpZWNlIik7CiAJfQogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfTUlDUk9QSE9ORSkpOwogCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJNaWNyb3Bob25lIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljcm9waG9uZSIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pY3JvcGhvbmUiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWNyb3Bob25lIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pY3JvcGhvbmUiKTsKIAl9CiAJcGluID0gISEocGlucyAmICgxIDw8IEFNU19ERUxUQV9TUEVBS0VSKSk7CiAJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIlNwZWFrZXIiKSkgewogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU3BlYWtlciIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU3BlYWtlciIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX0FHQykpOwogCWlmIChwaW4gIT0gYW1zX2RlbHRhX2F1ZGlvX2FnYykgewogCQlhbXNfZGVsdGFfYXVkaW9fYWdjID0gcGluOwogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBR0NJTiIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkFHQ0lOIik7CiAJCWVsc2UKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQUdDSU4iKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQUdDSU4iKTsKIAl9Ci0JaWYgKGNoYW5nZWQpCi0JCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWlmIChjaGFuZ2VkKQorCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KQEAgLTE5NCwxMyArMTk2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYW1zX2RlbHRhX2F1ZGlvX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoYW1zX2RlbHRhX2F1ZGlvX21vZGUpLAotCQkJCQkJYW1zX2RlbHRhX2F1ZGlvX21vZGUpLAotfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYW1zX2RlbHRhX2F1ZGlvX2VudW0sCisJCQkJICAgICAgYW1zX2RlbHRhX2F1ZGlvX21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW1zX2RlbHRhX2F1ZGlvX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJBdWRpbyBNb2RlIiwgYW1zX2RlbHRhX2F1ZGlvX2VudW1bMF0sCisJU09DX0VOVU1fRVhUKCJBdWRpbyBNb2RlIiwgYW1zX2RlbHRhX2F1ZGlvX2VudW0sCiAJCQlhbXNfZGVsdGFfZ2V0X2F1ZGlvX21vZGUsIGFtc19kZWx0YV9zZXRfYXVkaW9fbW9kZSksCiB9OwogCkBAIC0zMTUsMTIgKzMxNSwxNyBAQAogCXYyNTNfb3BzLmNsb3NlKHR0eSk7CiAKIAkvKiBSZXZlcnQgYmFjayB0byBkZWZhdWx0IGF1ZGlvIGlucHV0L291dHB1dCBjb25zdGVsbGF0aW9uICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVhcnBpZWNlIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pY3JvcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFHQ0lOIik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1vdXRocGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRWFycGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljcm9waG9uZSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQUdDSU4iKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogLyogTGluZSBkaXNjaXBsaW5lIC5oYW5ndXAoKSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbjgxMC5jIGIvc291bmQvc29jL29tYXAvbjgxMC5jCmluZGV4IGQxNjNlMTguLmZkNGQ5YzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL244MTAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9uODEwLmMKQEAgLTY4LDI2ICs2OCwzMCBAQAogCQlicmVhazsKIAl9CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChuODEwX3Nwa19mdW5jKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCiAJaWYgKGhwKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlpZiAobGluZTFsKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTElORTFMIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FMUwiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORTFMIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORTFMIik7CiAKIAlpZiAobjgxMF9kbWljX2Z1bmMpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJETWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJETWljIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJETWljIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgbjgxMF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jIGIvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCmluZGV4IGViYjEzOTAuLjAyNGRhZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKQEAgLTIwMyw4ICsyMDMsNyBAQAogCiBzdGF0aWMgaW50IG9tYXBfYWJlX2RtaWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZydGQtPmNhcmQtPmRhcG07CiAKIAlyZXR1cm4gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgZG1pY19hdWRpb19tYXAsCiAJCQkJQVJSQVlfU0laRShkbWljX2F1ZGlvX21hcCkpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvcng1MS5jIGIvc291bmQvc29jL29tYXAvcng1MS5jCmluZGV4IDYxMTE3OWMuLjdmYjNkNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL3J4NTEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKQEAgLTc0LDI2ICs3NCwzMCBAQAogCQlicmVhazsKIAl9CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChyeDUxX3Nwa19mdW5jKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWlmIChyeDUxX2RtaWNfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkRNaWMiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkRNaWMiKTsKIAlpZiAoaHApCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCWlmIChocykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhTIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSFMgTWljIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhTIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhTIE1pYyIpOwogCiAJZ3Bpb19zZXRfdmFsdWUoUlg1MV9UVk9VVF9TRUxfR1BJTywgdHZvdXQpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IHJ4NTFfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvY29yZ2kuYyBiL3NvdW5kL3NvYy9weGEvY29yZ2kuYwppbmRleCAxODUzZDQxLi41YTg4MTM2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKKysrIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCkBAIC00Nyw2NCArNDcsNjMgQEAKIAogc3RhdGljIHZvaWQgY29yZ2lfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQogeworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJLyogc2V0IHVwIGphY2sgY29ubmVjdGlvbiAqLwogCXN3aXRjaCAoY29yZ2lfamFja19mdW5jKSB7CiAJY2FzZSBDT1JHSV9IUDoKIAkJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfTCwgMSk7CiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9SLCAxKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBDT1JHSV9NSUM6CiAJCS8qIHJlc2V0ID0gbXV0ZSBoZWFkcGhvbmUgKi8KIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMCk7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfTElORToKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMCk7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfSEVBRFNFVDoKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMSk7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAoY29yZ2lfc3BrX2Z1bmMgPT0gQ09SR0lfU1BLX09OKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCiAJLyogc2lnbmFsIGEgREFQTSBldmVudCAqLwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogc3RhdGljIGludCBjb3JnaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKIAogCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLwotCWNvcmdpX2V4dF9jb250cm9sKCZjb2RlYy0+ZGFwbSk7Ci0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJY29yZ2lfZXh0X2NvbnRyb2woJnJ0ZC0+Y2FyZC0+ZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYyBiL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYwppbmRleCA0NGI1YzA5Li5jMjlmZWRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMKKysrIGIvc291bmQvc29jL3B4YS9lNzQwX3dtOTcwNS5jCkBAIC0xMDMsMTEgKzEwMyw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUENCRUVQIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTUlDMiIpOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBlNzQwX2RhcG1fd2lkZ2V0cywKLQkJCQkJQVJSQVlfU0laRShlNzQwX2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNiw2ICsxMzEsMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSBlNzQwX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShlNzQwX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gZTc0MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGU3NDBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ3BpbyBlNzQwX2F1ZGlvX2dwaW9zW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKaW5kZXggYzM0ZTQ0Ny4uZWUzNmFiYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9lNzUwX3dtOTcwNS5jCisrKyBiL3NvdW5kL3NvYy9weGEvZTc1MF93bTk3MDUuYwpAQCAtODUsMTEgKzg1LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQQ0JFRVAiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMyIik7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGU3NTBfZGFwbV93aWRnZXRzLAotCQkJCQlBUlJBWV9TSVpFKGU3NTBfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE5LDYgKzExNCwxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9IGU3NTBfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGU3NTBfZGFpKSwKKworCS5kYXBtX3dpZGdldHMgPSBlNzUwX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZTc1MF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvIGU3NTBfYXVkaW9fZ3Bpb3NbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYyBiL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYwppbmRleCAzMTM3ZjgwLi4yNGMyMDc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMKKysrIGIvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCkBAIC03MSwxOSArNzEsNiBAQAogCXsiTUlDMiIsIE5VTEwsICJNaWMgKEludGVybmFsMikifSwKIH07CiAKLXN0YXRpYyBpbnQgZTgwMF9hYzk3X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgZTgwMF9kYXBtX3dpZGdldHMsCi0JCQkJCUFSUkFZX1NJWkUoZTgwMF9kYXBtX3dpZGdldHMpKTsKLQotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZTgwMF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lID0gIkFDOTciLApAQCAtOTIsNyArNzksNiBAQAogCQkuY29kZWNfZGFpX25hbWUgPSAid205NzEyLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJweGEtcGNtLWF1ZGlvIiwKIAkJLmNvZGVjX25hbWUgPSAid205NzEyLWNvZGVjIiwKLQkJLmluaXQgPSBlODAwX2FjOTdfaW5pdCwKIAl9LAogCXsKIAkJLm5hbWUgPSAiQUM5NyBBdXgiLApAQCAtMTA5LDYgKzk1LDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gZTgwMF9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoZTgwMF9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IGU4MDBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShlODAwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW8gZTgwMF9hdWRpb19ncGlvc1tdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jIGIvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jCmluZGV4IGFhY2UxOWUuLjI1OWUwNDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYworKysgYi9zb3VuZC9zb2MvcHhhL21hZ2ljaWFuLmMKQEAgLTQxLDQ0ICs0MSw0MiBAQAogc3RhdGljIGludCBtYWdpY2lhbl9zcGtfc3dpdGNoID0gMTsKIHN0YXRpYyBpbnQgbWFnaWNpYW5faW5fc2VsID0gTUFHSUNJQU5fTUlDOwogCi1zdGF0aWMgdm9pZCBtYWdpY2lhbl9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBtYWdpY2lhbl9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAKIAlpZiAobWFnaWNpYW5fc3BrX3N3aXRjaCkKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAlpZiAobWFnaWNpYW5faHBfc3dpdGNoKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAogCXN3aXRjaCAobWFnaWNpYW5faW5fc2VsKSB7CiAJY2FzZSBNQUdJQ0lBTl9NSUM6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkNhbGwgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkNhbGwgTWljIik7CiAJCWJyZWFrOwogCWNhc2UgTUFHSUNJQU5fTUlDX0VYVDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKIAkJYnJlYWs7CiAJfQogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IG1hZ2ljaWFuX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0JbWFnaWNpYW5fZXh0X2NvbnRyb2woY29kZWMpOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCW1hZ2ljaWFuX2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNzcsMTMgKzI3NSwxMyBAQAogc3RhdGljIGludCBtYWdpY2lhbl9zZXRfaHAoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCiAJaWYgKG1hZ2ljaWFuX2hwX3N3aXRjaCA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJcmV0dXJuIDA7CiAKIAltYWdpY2lhbl9ocF9zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQltYWdpY2lhbl9leHRfY29udHJvbChjb2RlYyk7CisJbWFnaWNpYW5fZXh0X2NvbnRyb2woJmNhcmQtPmRhcG0pOwogCXJldHVybiAxOwogfQogCkBAIC0yOTcsMTMgKzI5NSwxMyBAQAogc3RhdGljIGludCBtYWdpY2lhbl9zZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCiAJaWYgKG1hZ2ljaWFuX3Nwa19zd2l0Y2ggPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJbWFnaWNpYW5fc3BrX3N3aXRjaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCW1hZ2ljaWFuX2V4dF9jb250cm9sKGNvZGVjKTsKKwltYWdpY2lhbl9leHRfY29udHJvbCgmY2FyZC0+ZGFwbSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQwMCw3ICszOTgsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAkvKiBOQyBjb2RlYyBwaW5zICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiVk9VVExIUCIpOwpAQCAtNDEwLDE5ICs0MDcsNiBAQAogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlZJTkwiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJWSU5SIik7CiAKLQkvKiBBZGQgbWFnaWNpYW4gc3BlY2lmaWMgY29udHJvbHMgKi8KLQllcnIgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgdWRhMTM4MF9tYWdpY2lhbl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHVkYTEzODBfbWFnaWNpYW5fY29udHJvbHMpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIEFkZCBtYWdpY2lhbiBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBtYWdpY2lhbiBzcGVjaWZpYyBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU2LDYgKzQ0MCwxMiBAQAogCS5kYWlfbGluayA9IG1hZ2ljaWFuX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShtYWdpY2lhbl9kYWkpLAogCisJLmNvbnRyb2xzID0gdWRhMTM4MF9tYWdpY2lhbl9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh1ZGExMzgwX21hZ2ljaWFuX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdWRhMTM4MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptYWdpY2lhbl9zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jIGIvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jCmluZGV4IDE2MGM1MjQuLjU5NWVlZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYworKysgYi9zb3VuZC9zb2MvcHhhL21pb2E3MDFfd205NzEzLmMKQEAgLTEyNywxNiArMTI3LDggQEAKIHN0YXRpYyBpbnQgbWlvYTcwMV93bTk3MTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCXVuc2lnbmVkIHNob3J0IHJlZzsKIAotCS8qIEFkZCBtaW9hNzAxIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1pb2E3MDFfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShtaW9hNzAxX2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIG1pb2E3MDEgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXBuZWN0cyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCS8qIFByZXBhcmUgR1BJTzggZm9yIHJlYXIgc3BlYWtlciBhbXBsaWZpZXIgKi8KIAlyZWcgPSBjb2RlYy0+ZHJpdmVyLT5yZWFkKGNvZGVjLCBBQzk3X0dQSU9fQ0ZHKTsKIAljb2RlYy0+ZHJpdmVyLT53cml0ZShjb2RlYywgQUM5N19HUElPX0NGRywgcmVnIHwgMHgwMTAwKTsKQEAgLTE0NSwxMiArMTM3LDYgQEAKIAlyZWcgPSBjb2RlYy0+ZHJpdmVyLT5yZWFkKGNvZGVjLCBBQzk3XzNEX0NPTlRST0wpOwogCWNvZGVjLT5kcml2ZXItPndyaXRlKGNvZGVjLCBBQzk3XzNEX0NPTlRST0wsIHJlZyB8IDB4YzAwMCk7CiAKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRnJvbnQgU3BlYWtlciIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJSZWFyIFNwZWFrZXIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRnJvbnQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIE91dCIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4Myw2ICsxNjksMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSBtaW9hNzAxX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShtaW9hNzAxX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gbWlvYTcwMV9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1pb2E3MDFfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgbWlvYTcwMV93bTk3MTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCmluZGV4IGM5M2UxMzguLmM2YmRjNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKKysrIGIvc291bmQvc29jL3B4YS9wb29kbGUuYwpAQCAtNzQsMTQgKzc0LDkgQEAKIHN0YXRpYyBpbnQgcG9vZGxlX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0JcG9vZGxlX2V4dF9jb250cm9sKCZjb2RlYy0+ZGFwbSk7Ci0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJcG9vZGxlX2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NwaXR6LmMgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKaW5kZXggZmMwNTJkOC4uMTM3M2IwMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9zcGl0ei5jCisrKyBiL3NvdW5kL3NvYy9weGEvc3BpdHouYwpAQCAtNDYsNzQgKzQ2LDc0IEBACiAKIHN0YXRpYyB2b2lkIHNwaXR6X2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChzcGl0el9zcGtfZnVuYyA9PSBTUElUWl9TUEtfT04pCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFeHQgU3BrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJFeHQgU3BrIik7CiAKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoIChzcGl0el9qYWNrX2Z1bmMpIHsKIAljYXNlIFNQSVRaX0hQOgogCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBocCBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAxKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDEpOwogCQlicmVhazsKIAljYXNlIFNQSVRaX01JQzoKIAkJLyogZW5hYmxlIG1pYyBqYWNrIGFuZCBiaWFzLCBtdXRlIGhwICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDApOwogCQlicmVhazsKIAljYXNlIFNQSVRaX0xJTkU6CiAJCS8qIGVuYWJsZSBsaW5lIGphY2ssIGRpc2FibGUgbWljIGJpYXMgYW5kIG11dGUgaHAgKi8KLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgU1BJVFpfSEVBRFNFVDoKIAkJLyogZW5hYmxlIGFuZCB1bm11dGUgaGVhZHNldCBqYWNrIGVuYWJsZSBtaWMgYmlhcywgbXV0ZSBMIGhwICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9IUF9PRkY6CiAKIAkJLyogamFjayByZW1vdmVkLCBldmVyeXRoaW5nIG9mZiAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDApOwogCQlicmVhazsKIAl9Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgc3BpdHpfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQotCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKIAkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KLQlzcGl0el9leHRfY29udHJvbCgmY29kZWMtPmRhcG0pOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXNwaXR6X2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3Rvc2EuYyBiL3NvdW5kL3NvYy9weGEvdG9zYS5jCmluZGV4IDFkOWMyZWQuLjRhOTU2ZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvdG9zYS5jCisrKyBiL3NvdW5kL3NvYy9weGEvdG9zYS5jCkBAIC00NCw0OCArNDQsNDYgQEAKIHN0YXRpYyBpbnQgdG9zYV9qYWNrX2Z1bmM7CiBzdGF0aWMgaW50IHRvc2Ffc3BrX2Z1bmM7CiAKLXN0YXRpYyB2b2lkIHRvc2FfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgdG9zYV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoICh0b3NhX2phY2tfZnVuYykgewogCWNhc2UgVE9TQV9IUDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBUT1NBX01JQ19JTlQ6Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgVE9TQV9IRUFEU0VUOgotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyAoSW50ZXJuYWwpIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyAoSW50ZXJuYWwpIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAodG9zYV9zcGtfZnVuYyA9PSBUT1NBX1NQS19PTikKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogc3RhdGljIGludCB0b3NhX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0JdG9zYV9leHRfY29udHJvbChjb2RlYyk7Ci0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJdG9zYV9leHRfY29udHJvbCgmcnRkLT5jYXJkLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA0LDEzICsxMDIsMTMgQEAKIHN0YXRpYyBpbnQgdG9zYV9zZXRfamFjayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAodG9zYV9qYWNrX2Z1bmMgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJdG9zYV9qYWNrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl0b3NhX2V4dF9jb250cm9sKGNvZGVjKTsKKwl0b3NhX2V4dF9jb250cm9sKCZjYXJkLT5kYXBtKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTI0LDEzICsxMjIsMTMgQEAKIHN0YXRpYyBpbnQgdG9zYV9zZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9ICBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAogCWlmICh0b3NhX3Nwa19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAogCXRvc2Ffc3BrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl0b3NhX2V4dF9jb250cm9sKGNvZGVjKTsKKwl0b3NhX2V4dF9jb250cm9sKCZjYXJkLT5kYXBtKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTkxLDI0ICsxODksMTAgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgZXJyOwogCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUMyIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1PTk9PVVQiKTsKIAotCS8qIGFkZCB0b3NhIHNwZWNpZmljIGNvbnRyb2xzICovCi0JZXJyID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHRvc2FfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0b3NhX2NvbnRyb2xzKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBhZGQgdG9zYSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0b3NhX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodG9zYV9kYXBtX3dpZGdldHMpKTsKLQotCS8qIHNldCB1cCB0b3NhIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzOSw2ICsyMjMsMTMgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSB0b3NhX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh0b3NhX2RhaSksCisKKwkuY29udHJvbHMgPSB0b3NhX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRvc2FfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSB0b3NhX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodG9zYV9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIGludCB0b3NhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMgYi9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMKaW5kZXggZGI4YWFkZi4uMjNiZjk5MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS96eWxvbml0ZS5jCisrKyBiL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYwpAQCAtNzEsMjIgKzcxLDEwIEBACiAKIHN0YXRpYyBpbnQgenlsb25pdGVfd205NzEzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQogCWlmIChjbGtfcG91dCkKIAkJc25kX3NvY19kYWlfc2V0X3BsbChydGQtPmNvZGVjX2RhaSwgMCwgMCwKIAkJCQkgICAgY2xrX2dldF9yYXRlKHBvdXQpLCAwKTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgenlsb25pdGVfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh6eWxvbml0ZV9kYXBtX3dpZGdldHMpKTsKLQotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCS8qIFN0YXRpYyBzZXR1cCBmb3Igbm93ICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEVhcnBpZWNlIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU2LDYgKzI0NCwxMSBAQAogCS5yZXN1bWVfcHJlID0gJnp5bG9uaXRlX3Jlc3VtZV9wcmUsCiAJLmRhaV9saW5rID0genlsb25pdGVfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHp5bG9uaXRlX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0genlsb25pdGVfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh6eWxvbml0ZV9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnp5bG9uaXRlX3NuZF9hYzk3X2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zNjAwMC9zNjEwNS1pcGNhbS5jIGIvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKaW5kZXggOTQ1ZThhYi4uMGIyMWQxZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKKysrIGIvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKQEAgLTEwNCw4ICsxMDQsOCBAQAogc3RhdGljIGludCBvdXRwdXRfdHlwZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY2FyZC0+ZGFwbTsKIAl1bnNpZ25lZCBpbnQgdmFsID0gKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gIT0gMCk7CiAJY2hhciAqZGlmZmVyZW50aWFsID0gIkF1ZGlvIE91dCBEaWZmZXJlbnRpYWwiOwogCWNoYXIgKnN0ZXJlbyA9ICJBdWRpbyBPdXQgU3RlcmVvIjsKQEAgLTEzNywxMyArMTM3LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCS8qIEFkZCBzNjEwNSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzeF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKGFpYzN4X2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIHM2MTA1IHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAKIAkvKiBub3QgcHJlc2VudCAqLwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1PTk9fTE9VVCIpOwpAQCAtMTU3LDE3ICsxNTEsMTAgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSTE9VVCIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkhQUkNPTSIpOwogCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdWRpbyBJbiIpOwotCiAJLyogbXVzdCBjb3JyZXNwb25kIHRvIGF1ZGlvX291dF9tdXgucHJpdmF0ZV92YWx1ZSBpbml0aWFsaXplciAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0IERpZmZlcmVudGlhbCIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdWRpbyBPdXQgU3RlcmVvIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiQXVkaW8gT3V0IERpZmZlcmVudGlhbCIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZC0+c25kX2NhcmQsIHNuZF9jdGxfbmV3MSgmYXVkaW9fb3V0X211eCwgY29kZWMpKTsKKwlzbmRfY3RsX2FkZChjYXJkLT5zbmRfY2FyZCwgc25kX2N0bF9uZXcxKCZhdWRpb19vdXRfbXV4LCBjYXJkKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MCw2ICsxNzcsMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSAmczYxMDVfZGFpLAogCS5udW1fbGlua3MgPSAxLAorCisJLmRhcG1fd2lkZ2V0cyA9IGFpYzN4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljM3hfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczYwMDBfc25kX3BsYXRmb3JtX2RhdGEgczYxMDVfc25kX2RhdGEgX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCmluZGV4IDM1MDc1NzQuLmYyZTI4OTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKKysrIGIvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZwpAQCAtMTE3LDcgKzExNyw3IEBACiAJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgVExWMzIwQUlDMjMgb24gU2ltdGVjIGJvYXJkcyIKIAlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0WFgKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCi0Jc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAlzZWxlY3QgU05EX1NPQ19TQU1TVU5HX1NJTVRFQwogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NJTVRFQ19IRVJNRVMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYwppbmRleCBmYmNlZDU4Li44OGIwOWUwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCkBAIC02NiwxMCArNjYsNiBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKLQlydW50aW1lLT5ody5yYXRlX21pbiA9IGh3X3JhdGVzLmxpc3RbMF07Ci0JcnVudGltZS0+aHcucmF0ZV9tYXggPSBod19yYXRlcy5saXN0W2h3X3JhdGVzLmNvdW50IC0gMV07Ci0JcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9UOwotCiAJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCiAJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCQkmaHdfcmF0ZXMpOwpAQCAtOTQsNyArOTAsNyBAQAogCQkJZGl2Kys7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnJ0ZC0+ZGV2LCAiJXM6IHJhdGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJZGV2X2VycihydGQtPmRldiwgIiVzOiByYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQlfX2Z1bmNfXywgcmF0ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE4MSw3ICsxNzcsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKaW5kZXggOThhMDRjMS4uYjA4MDAzMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX3dtODc1My5jCkBAIC0xOTIsNDQgKzE5Miw2IEBACiAJLmh3X2ZyZWUgPSBuZW8xOTczX3ZvaWNlX2h3X2ZyZWUsCiB9OwogCi0vKiBTaGFyZWQgcm91dGVzIGFuZCBjb250cm9scyAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0xJTkUoIkdTTSBMaW5lIE91dCIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9MSU5FKCJHU00gTGluZSBJbiIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiSGFuZHNldCBNaWMiLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG5lbzE5NzNfd204NzUzX3JvdXRlc1tdID0gewotCS8qIENvbm5lY3Rpb25zIHRvIHRoZSBHU00gTW9kdWxlICovCi0JeyJHU00gTGluZSBPdXQiLCBOVUxMLCAiTU9OTzEifSwKLQl7IkdTTSBMaW5lIE91dCIsIE5VTEwsICJNT05PMiJ9LAotCXsiUlhQIiwgTlVMTCwgIkdTTSBMaW5lIEluIn0sCi0JeyJSWE4iLCBOVUxMLCAiR1NNIExpbmUgSW4ifSwKLQotCS8qIENvbm5lY3Rpb25zIHRvIEhlYWRzZXQgKi8KLQl7Ik1JQzEiLCBOVUxMLCAiTWljIEJpYXMifSwKLQl7Ik1pYyBCaWFzIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCi0KLQkvKiBDYWxsIE1pYyAqLwotCXsiTUlDMiIsIE5VTEwsICJNaWMgQmlhcyJ9LAotCXsiTUlDMk4iLCBOVUxMLCAiTWljIEJpYXMifSwKLQl7Ik1pYyBCaWFzIiwgTlVMTCwgIkhhbmRzZXQgTWljIn0sCi0KLQkvKiBDb25uZWN0IHRoZSBBTEMgcGlucyAqLwotCXsiQUNJTiIsIE5VTEwsICJBQ09QIn0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmVvMTk3M193bTg3NTNfY29udHJvbHNbXSA9IHsKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJHU00gTGluZSBPdXQiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJHU00gTGluZSBJbiIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiSGFuZHNldCBNaWMiKSwKLX07Ci0KLS8qIEdUQTAyIHNwZWNpZmljIHJvdXRlcyBhbmQgY29udHJvbHMgKi8KLQogc3RhdGljIGludCBndGEwMl9zcGVha2VyX2VuYWJsZWQ7CiAKIHN0YXRpYyBpbnQgbG00ODUzX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC0yNTcsNyArMjE5LDM0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG5lbzE5NzNfZ3RhMDJfcm91dGVzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0xJTkUoIkdTTSBMaW5lIE91dCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJHU00gTGluZSBJbiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGFuZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJIYW5kc2V0IFNwayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlN0ZXJlbyBPdXQiLCBsbTQ4NTNfZXZlbnQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgbmVvMTk3M193bTg3NTNfcm91dGVzW10gPSB7CisJLyogQ29ubmVjdGlvbnMgdG8gdGhlIEdTTSBNb2R1bGUgKi8KKwl7IkdTTSBMaW5lIE91dCIsIE5VTEwsICJNT05PMSJ9LAorCXsiR1NNIExpbmUgT3V0IiwgTlVMTCwgIk1PTk8yIn0sCisJeyJSWFAiLCBOVUxMLCAiR1NNIExpbmUgSW4ifSwKKwl7IlJYTiIsIE5VTEwsICJHU00gTGluZSBJbiJ9LAorCisJLyogQ29ubmVjdGlvbnMgdG8gSGVhZHNldCAqLworCXsiTUlDMSIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKworCS8qIENhbGwgTWljICovCisJeyJNSUMyIiwgTlVMTCwgIk1pYyBCaWFzIn0sCisJeyJNSUMyTiIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiSGFuZHNldCBNaWMifSwKKworCS8qIENvbm5lY3QgdGhlIEFMQyBwaW5zICovCisJeyJBQ0lOIiwgTlVMTCwgIkFDT1AifSwKKwogCS8qIENvbm5lY3Rpb25zIHRvIHRoZSBhbXAgKi8KIAl7IlN0ZXJlbyBPdXQiLCBOVUxMLCAiTE9VVDEifSwKIAl7IlN0ZXJlbyBPdXQiLCBOVUxMLCAiUk9VVDEifSwKQEAgLTI2Nyw3ICsyNTYsMTEgQEAKIAl7IkhhbmRzZXQgU3BrIiwgTlVMTCwgIlJPVVQyIn0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmVvMTk3M19ndGEwMl93bTg3NTNfY29udHJvbHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuZW8xOTczX3dtODc1M19jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkdTTSBMaW5lIE91dCIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkdTTSBMaW5lIEluIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIYW5kc2V0IE1pYyIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhhbmRzZXQgU3BrIiksCiAJU09DX0RBUE1fUElOX1NXSVRDSCgiU3RlcmVvIE91dCIpLAogCkBAIC0yNzYsODYgKzI2OSwzMiBAQAogCQlsbTQ4NTNfc2V0X3NwayksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmVvMTk3M19ndGEwMl93bTg3NTNfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX1NQSygiSGFuZHNldCBTcGsiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJTdGVyZW8gT3V0IiwgbG00ODUzX2V2ZW50KSwKLX07Ci0KLXN0YXRpYyBpbnQgbmVvMTk3M19ndGEwMl93bTg3NTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG5lbzE5NzNfZ3RhMDJfd204NzUzX2RhcG1fd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M19ndGEwMl93bTg3NTNfZGFwbV93aWRnZXRzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG5lbzE5NzNfZ3RhMDJfcm91dGVzLAotCQkJQVJSQVlfU0laRShuZW8xOTczX2d0YTAyX3JvdXRlcykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNvZGVjLT5jYXJkLCBuZW8xOTczX2d0YTAyX3dtODc1M19jb250cm9scywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M19ndGEwMl93bTg3NTNfY29udHJvbHMpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJTdGVyZW8gT3V0Iik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIYW5kc2V0IFNwayIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3RlcmVvIE91dCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBTcGsiKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5lbzE5NzNfd204NzUzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAKIAkvKiBzZXQgdXAgTkMgY29kZWMgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQ0Iik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTEiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FMiIpOwotCi0JLyogQWRkIG5lbzE5NzMgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgbmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzLAotCQkJQVJSQVlfU0laRShuZW8xOTczX3dtODc1M19kYXBtX3dpZGdldHMpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogYWRkIG5lbzE5NzMgc3BlY2lmaWMgY29udHJvbHMgKi8KLQlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKHJ0ZC0+Y2FyZCwgbmVvMTk3M193bTg3NTNfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKG5lbzE5NzNfd204NzUzX2NvbnRyb2xzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHNldCB1cCBuZW8xOTczIHNwZWNpZmljIGF1ZGlvIHJvdXRlcyAqLwotCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG5lbzE5NzNfd204NzUzX3JvdXRlcywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfcm91dGVzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIk9VVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIk9VVDQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkUxIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJMSU5FMiIpOwogCiAJLyogc2V0IGVuZHBvaW50cyB0byBkZWZhdWx0IG9mZiBtb2RlICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJHU00gTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGFuZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJHU00gTGluZSBPdXQiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJHU00gTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY2FyZC0+ZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiSGFuZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJTdGVyZW8gT3V0Iik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiSGFuZHNldCBTcGsiKTsKIAogCS8qIGFsbG93IGF1ZGlvIHBhdGhzIGZyb20gdGhlIEdTTSBtb2RlbSB0byBydW4gZHVyaW5nIHN1c3BlbmQgKi8KLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkdTTSBMaW5lIE91dCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiR1NNIExpbmUgSW4iKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIYW5kc2V0IE1pYyIpOwotCi0JaWYgKG1hY2hpbmVfaXNfbmVvMTk3M19ndGEwMigpKSB7Ci0JCXJldCA9IG5lbzE5NzNfZ3RhMDJfd204NzUzX2luaXQoY29kZWMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiR1NNIExpbmUgSW4iKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIZWFkc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiU3RlcmVvIE91dCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkhhbmRzZXQgU3BrIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQwOSw2ICszNDgsMTMgQEAKIAkubnVtX2F1eF9kZXZzID0gQVJSQVlfU0laRShuZW8xOTczX2F1eF9kZXZzKSwKIAkuY29kZWNfY29uZiA9IG5lbzE5NzNfY29kZWNfY29uZiwKIAkubnVtX2NvbmZpZ3MgPSBBUlJBWV9TSVpFKG5lbzE5NzNfY29kZWNfY29uZiksCisKKwkuY29udHJvbHMgPSBuZW8xOTczX3dtODc1M19jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShuZW8xOTczX3dtODc1M19jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IG5lbzE5NzNfd204NzUzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBuZW8xOTczX3dtODc1M19yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfcm91dGVzKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuZW8xOTczX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYwppbmRleCAwNmViZGMwLi4yOTgyZDllIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKQEAgLTEzMSwxMCArMTMxLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JcnVudGltZS0+aHcucmF0ZV9taW4gPSBod19yYXRlcy5saXN0WzBdOwotCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gaHdfcmF0ZXMubGlzdFtod19yYXRlcy5jb3VudCAtIDFdOwotCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVDsKLQogCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAogCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkJJmh3X3JhdGVzKTsKQEAgLTIyNiw3ICsyMjIsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKaW5kZXggZDM4YWU5OC4uNjgyZWI0ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc21ka19hdWRpb19kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInNtZGstYXVkaW8td204ODk0IiwKKwkJLm5hbWUJPSAic21kay1hdWRpby13bTg5OTQiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHNhbXN1bmdfd204OTk0X29mX21hdGNoKSwKIAkJLnBtCT0gJnNuZF9zb2NfcG1fb3BzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy90b2Jlcm1vcnkuYwppbmRleCBmMjFmZjYwLi4xODA3Yjc1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy90b2Jlcm1vcnkuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy90b2Jlcm1vcnkuYwpAQCAtNDQsNiArNDQsOCBAQAogCQkJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IFNZU0NMSzogJWRcbiIsIHJldCk7CisJCQkJc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODk2Ml9GTEwsCisJCQkJCQkgICAgMCwgMCwgMCk7CiAJCQkJcmV0dXJuIHJldDsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS5jIGIvc291bmQvc29jL3NoL2ZzaS5jCmluZGV4IDE5NjdmNDQuLjcxMGEwNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLmMKQEAgLTE3MTEsOSArMTcxMSw5IEBACiAJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgotCQlmc2ktPmNsa19tYXN0ZXIgPSAxOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWZzaS0+Y2xrX21hc3RlciA9IDE7IC8qIGNvZGVjIGlzIHNsYXZlLCBjcHUgaXMgbWFzdGVyICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL21pZ29yLmMgYi9zb3VuZC9zb2Mvc2gvbWlnb3IuYwppbmRleCA1MDE0YTg4Li5jNThjMjUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvbWlnb3IuYworKysgYi9zb3VuZC9zb2Mvc2gvbWlnb3IuYwpAQCAtMTM2LDE5ICsxMzYsNiBAQAogCXsgIk1pYyBCaWFzIiwgTlVMTCwgIkV4dGVybmFsIE1pY3JvcGhvbmUiIH0sCiB9OwogCi1zdGF0aWMgaW50IG1pZ29yX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1pZ29yX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUobWlnb3JfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogbWlnb3IgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbWlnb3JfZGFpID0gewogCS5uYW1lID0gIndtODk3OCIsCkBAIC0xNTgsNyArMTQ1LDYgQEAKIAkucGxhdGZvcm1fbmFtZSA9ICJzaXUtcGNtLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJ3bTg5NzguMC0wMDFhIiwKIAkub3BzID0gJm1pZ29yX2RhaV9vcHMsCi0JLmluaXQgPSBtaWdvcl9kYWlfaW5pdCwKIH07CiAKIC8qIG1pZ29yIGF1ZGlvIG1hY2hpbmUgZHJpdmVyICovCkBAIC0xNjcsNiArMTUzLDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gJm1pZ29yX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMgPSBtaWdvcl9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1pZ29yX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWlnb3Jfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlIGIvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKaW5kZXggMGZmNDkyZC4uN2QwMDUxYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKQEAgLTEsMiArMSwyIEBACi1zbmQtc29jLXJjYXItb2Jqcwk6PSBjb3JlLm8gZ2VuLm8gc2N1Lm8gYWRnLm8gc3NpLm8KK3NuZC1zb2MtcmNhci1vYmpzCTo9IGNvcmUubyBnZW4ubyBzcmMubyBhZGcubyBzc2kubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUkNBUikJKz0gc25kLXNvYy1yY2FyLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2FkZy5jCmluZGV4IGE1MzIzNWMuLjY5YzQ0MjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL2FkZy5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL2FkZy5jCkBAIC0yNSwxNSArMjUsMTY1IEBACiB9OwogCiAjZGVmaW5lIGZvcl9lYWNoX3JzbmRfY2xrKHBvcywgYWRnLCBpKQkJXAotCWZvciAoaSA9IDAsIChwb3MpID0gYWRnLT5jbGtbaV07CVwKLQkgICAgIGkgPCBDTEtNQVg7CQkJXAotCSAgICAgaSsrLCAocG9zKSA9IGFkZy0+Y2xrW2ldKQorCWZvciAoaSA9IDA7CQkJCVwKKwkgICAgIChpIDwgQ0xLTUFYKSAmJgkJCVwKKwkgICAgICgocG9zKSA9IGFkZy0+Y2xrW2ldKTsJCVwKKwkgICAgIGkrKykKICNkZWZpbmUgcnNuZF9wcml2X3RvX2FkZyhwcml2KSAoKHN0cnVjdCByc25kX2FkZyAqKShwcml2KS0+YWRnKQogCi1zdGF0aWMgaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJCSBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCQkJIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKLQkJCQkJIHVuc2lnbmVkIGludCBkc3RfcmF0ZSkKKworc3RhdGljIHUzMiByc25kX2FkZ19zc2lfd3NfdGltaW5nX2dlbjIoc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSByc25kX2lvX3RvX21vZF9zc2koaW8pOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKKwlpbnQgd3MgPSBpZDsKKworCWlmIChyc25kX3NzaV9pc19waW5fc2hhcmluZyhyc25kX3NzaV9tb2RfZ2V0KHByaXYsIGlkKSkpIHsKKwkJc3dpdGNoIChpZCkgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCXdzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl3cyA9IDM7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJd3MgPSA3OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gKDB4NiArIHdzKSA8PCA4OworfQorCitzdGF0aWMgaW50IHJzbmRfYWRnX3NldF9zcmNfdGltc2VsX2dlbjIoc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJCXUzMiB0aW1zZWwpCit7CisJaW50IGlzX3BsYXkgPSByc25kX2RhaV9pc19wbGF5KHJkYWksIGlvKTsKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCWludCBzaGlmdCA9IChpZCAlIDIpID8gMTYgOiAwOworCXUzMiBtYXNrLCB3czsKKwl1MzIgaW4sIG91dDsKKworCXdzID0gcnNuZF9hZGdfc3NpX3dzX3RpbWluZ19nZW4yKGlvKTsKKworCWluICA9IChpc19wbGF5KSA/IHRpbXNlbCA6IHdzOworCW91dCA9IChpc19wbGF5KSA/IHdzICAgICA6IHRpbXNlbDsKKworCWluICAgPSBpbgk8PCBzaGlmdDsKKwlvdXQgID0gb3V0CTw8IHNoaWZ0OworCW1hc2sgPSAweGZmZmYJPDwgc2hpZnQ7CisKKwlzd2l0Y2ggKGlkIC8gMikgeworCWNhc2UgMDoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ0lOX1RJTVNFTDAsICBtYXNrLCBpbik7CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNPVVRfVElNU0VMMCwgbWFzaywgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDSU5fVElNU0VMMSwgIG1hc2ssIGluKTsKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ09VVF9USU1TRUwxLCBtYXNrLCBvdXQpOworCQlicmVhazsKKwljYXNlIDI6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNJTl9USU1TRUwyLCAgbWFzaywgaW4pOworCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDT1VUX1RJTVNFTDIsIG1hc2ssIG91dCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ0lOX1RJTVNFTDMsICBtYXNrLCBpbik7CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNPVVRfVElNU0VMMywgbWFzaywgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDSU5fVElNU0VMNCwgIG1hc2ssIGluKTsKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ09VVF9USU1TRUw0LCBtYXNrLCBvdXQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCisJCQkJICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwlzdHJ1Y3QgcnNuZF9hZGcgKmFkZyA9IHJzbmRfcHJpdl90b19hZGcocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlpbnQgaWR4LCBzZWwsIGRpdiwgc3RlcCwgcmV0OworCXUzMiB2YWwsIGVuOworCXVuc2lnbmVkIGludCBtaW4sIGRpZmY7CisJdW5zaWduZWQgaW50IHNlbF9yYXRlIFtdID0geworCQljbGtfZ2V0X3JhdGUoYWRnLT5jbGtbQ0xLQV0pLAkvKiAwMDAwOiBDTEtBICovCisJCWNsa19nZXRfcmF0ZShhZGctPmNsa1tDTEtCXSksCS8qIDAwMDE6IENMS0IgKi8KKwkJY2xrX2dldF9yYXRlKGFkZy0+Y2xrW0NMS0NdKSwJLyogMDAxMDogQ0xLQyAqLworCQlhZGctPnJiZ2FfcmF0ZV9mb3JfNDQxa2h6X2Rpdl82LC8qIDAwMTE6IFJCR0EgKi8KKwkJYWRnLT5yYmdiX3JhdGVfZm9yXzQ4a2h6X2Rpdl82LAkvKiAwMTAwOiBSQkdCICovCisJfTsKKworCW1pbiA9IH4wOworCXZhbCA9IDA7CisJZW4gPSAwOworCWZvciAoc2VsID0gMDsgc2VsIDwgQVJSQVlfU0laRShzZWxfcmF0ZSk7IHNlbCsrKSB7CisJCWlkeCA9IDA7CisJCXN0ZXAgPSAyOworCisJCWlmICghc2VsX3JhdGVbc2VsXSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoZGl2ID0gMjsgZGl2IDw9IDk4MzA0OyBkaXYgKz0gc3RlcCkgeworCQkJZGlmZiA9IGFicyhzcmNfcmF0ZSAtIHNlbF9yYXRlW3NlbF0gLyBkaXYpOworCQkJaWYgKG1pbiA+IGRpZmYpIHsKKwkJCQl2YWwgPSAoc2VsIDw8IDgpIHwgaWR4OworCQkJCW1pbiA9IGRpZmY7CisJCQkJZW4gPSAxIDw8IChzZWwgKyAxKTsgLyogZml4bWUgKi8KKwkJCX0KKworCQkJLyoKKwkJCSAqIHN0ZXAgb2YgMF8wMDAwIC8gMF8wMDAxIC8gMF8xMTAxCisJCQkgKiBhcmUgb3V0IG9mIG9yZGVyCisJCQkgKi8KKwkJCWlmICgoaWR4ID4gMikgJiYgKGlkeCAlIDIpKQorCQkJCXN0ZXAgKj0gMjsKKwkJCWlmIChpZHggPT0gMHgxYykgeworCQkJCWRpdiArPSBzdGVwOworCQkJCXN0ZXAgKj0gMjsKKwkJCX0KKwkJCWlkeCsrOworCQl9CisJfQorCisJaWYgKG1pbiA9PSB+MCkgeworCQlkZXZfZXJyKGRldiwgIm5vIElucHV0IGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gcnNuZF9hZGdfc2V0X3NyY190aW1zZWxfZ2VuMihyZGFpLCBtb2QsIGlvLCB2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidGltc2VsIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyc25kX21vZF9ic2V0KG1vZCwgRElWX0VOLCBlbiwgZW4pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByc25kX2FkZ19zZXRfY29udmVydF90aW1pbmdfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXUzMiB2YWwgPSByc25kX2FkZ19zc2lfd3NfdGltaW5nX2dlbjIoaW8pOworCisJcmV0dXJuIHJzbmRfYWRnX3NldF9zcmNfdGltc2VsX2dlbjIocmRhaSwgbW9kLCBpbywgdmFsKTsKK30KKworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSkKIHsKIAlzdHJ1Y3QgcnNuZF9hZGcgKmFkZyA9IHJzbmRfcHJpdl90b19hZGcocHJpdik7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKQEAgLTkxLDE4ICsyNDEsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCi0JCQkgICAgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSkKLXsKLQlpZiAocnNuZF9pc19nZW4xKHByaXYpKQotCQlyZXR1cm4gcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrX2dlbjEocHJpdiwgbW9kLAotCQkJCQkJICAgICBzcmNfcmF0ZSwgZHN0X3JhdGUpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIHN0YXRpYyB2b2lkIHJzbmRfYWRnX3NldF9zc2lfY2xrKHN0cnVjdCByc25kX21vZCAqbW9kLCB1MzIgdmFsKQogewogCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7CkBAIC0yNTQsMTMgKzM5MiwxNCBAQAogfQogCiBpbnQgcnNuZF9hZGdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHJzbmRfYWRnICphZGc7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsayAqY2xrLCAqY2xrX29yaWc7CiAJaW50IGk7CisJYm9vbCB1c2Vfb2xkX3N0eWxlID0gZmFsc2U7CiAKIAlhZGcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkZyksIEdGUF9LRVJORUwpOwogCWlmICghYWRnKSB7CkBAIC0yNjgsMTAgKzQwNywzOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlhZGctPmNsa1tDTEtBXSA9IGNsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19hIik7Ci0JYWRnLT5jbGtbQ0xLQl0gPSBjbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfYiIpOwotCWFkZy0+Y2xrW0NMS0NdID0gY2xrX2dldChOVUxMLCAiYXVkaW9fY2xrX2MiKTsKLQlhZGctPmNsa1tDTEtJXSA9IGNsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19pbnRlcm5hbCIpOworCWNsa19vcmlnCT0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJYWRnLT5jbGtbQ0xLQV0JPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2EiKTsKKwlhZGctPmNsa1tDTEtCXQk9IGRldm1fY2xrX2dldChkZXYsICJjbGtfYiIpOworCWFkZy0+Y2xrW0NMS0NdCT0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19jIik7CisJYWRnLT5jbGtbQ0xLSV0JPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2kiKTsKKworCS8qCisJICogSXQgcmVxdWVzdCBkZXZpY2UgZGVwZW5kZW50IGF1ZGlvIGNsb2NrLgorCSAqIEJ1dCBhYm92ZSBhbGwgY2xrcyB3aWxsIGluZGljYXRlIHJzbmQgbW9kdWxlIGNsb2NrCisJICogaWYgcGxhdGZvcm0gZG9lc24ndCBpdAorCSAqLworCWZvcl9lYWNoX3JzbmRfY2xrKGNsaywgYWRnLCBpKSB7CisJCWlmIChjbGtfb3JpZyA9PSBjbGspIHsKKwkJCWRldl93YXJuKGRldiwKKwkJCQkgImRvZXNuJ3QgaGF2ZSBkZXZpY2UgZGVwZW5kZW50IGNsb2NrLCB1c2UgaW5kZXBlbmRlbnQgY2xvY2tcbiIpOworCQkJdXNlX29sZF9zdHlsZSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogbm90ZToKKwkgKiB0aGVzZSBleGlzdCBpbiBvcmRlciB0byBrZWVwIGNvbXBhdGlibGUgd2l0aAorCSAqIHBsYXRmb3JtIHdoaWNoIGhhcyBkZXZpY2UgaW5kZXBlbmRlbnQgYXVkaW8gY2xvY2ssCisJICogYnV0IHdpbGwgYmUgcmVtb3ZlZCBzb29uCisJICovCisJaWYgKHVzZV9vbGRfc3R5bGUpIHsKKwkJYWRnLT5jbGtbQ0xLQV0gPSBkZXZtX2Nsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19hIik7CisJCWFkZy0+Y2xrW0NMS0JdID0gZGV2bV9jbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfYiIpOworCQlhZGctPmNsa1tDTEtDXSA9IGRldm1fY2xrX2dldChOVUxMLCAiYXVkaW9fY2xrX2MiKTsKKwkJYWRnLT5jbGtbQ0xLSV0gPSBkZXZtX2Nsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19pbnRlcm5hbCIpOworCX0KKwogCWZvcl9lYWNoX3JzbmRfY2xrKGNsaywgYWRnLCBpKSB7CiAJCWlmIChJU19FUlIoY2xrKSkgewogCQkJZGV2X2VycihkZXYsICJBdWRpbyBjbG9jayBmYWlsZWRcbiIpOwpAQCAtMjg3LDE0ICs0NTUsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQgcnNuZF9hZGdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgcnNuZF9hZGcgKmFkZyA9IHByaXYtPmFkZzsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9yc25kX2NsayhjbGssIGFkZywgaSkKLQkJY2xrX3B1dChjbGspOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvY29yZS5jIGIvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCmluZGV4IDc0M2RlNWUuLjIxNWI2NjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKQEAgLTczLDEzICs3MywxMyBAQAogICogICB8ICArLSBzc2lbMl0KICAqICAgfCAgLi4uCiAgKiAgIHwKLSAqICAgfCAqKiB0aGVzZSBjb250cm9sIHNjdQorICogICB8ICoqIHRoZXNlIGNvbnRyb2wgc3JjCiAgKiAgIHwKLSAqICAgKy0gc2N1CisgKiAgICstIHNyYwogICogICAgICB8Ci0gKiAgICAgICstIHNjdVswXQotICogICAgICArLSBzY3VbMV0KLSAqICAgICAgKy0gc2N1WzJdCisgKiAgICAgICstIHNyY1swXQorICogICAgICArLSBzcmNbMV0KKyAqICAgICAgKy0gc3JjWzJdCiAgKiAgICAgIC4uLgogICoKICAqCkBAIC0xMDAsNiArMTAwLDIxIEBACiAjZGVmaW5lIFJTTkRfUkFURVMgU05EUlZfUENNX1JBVEVfODAwMF85NjAwMAogI2RlZmluZSBSU05EX0ZNVFMgKFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpCiAKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9vZl9kYXRhIHJzbmRfb2ZfZGF0YV9nZW4xID0geworCS5mbGFncyA9IFJTTkRfR0VOMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9vZl9kYXRhIHJzbmRfb2ZfZGF0YV9nZW4yID0geworCS5mbGFncyA9IFJTTkRfR0VOMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJzbmRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhcl9zb3VuZC1nZW4xIiwgLmRhdGEgPSAmcnNuZF9vZl9kYXRhX2dlbjEgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhcl9zb3VuZC1nZW4yIiwgLmRhdGEgPSAmcnNuZF9vZl9kYXRhX2dlbjIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByc25kX29mX21hdGNoKTsKKwogLyoKICAqCXJzbmRfcGxhdGZvcm0gZnVuY3Rpb25zCiAgKi8KQEAgLTEwNyw2ICsxMjIsMTEgQEAKIAkoIShwcml2LT5pbmZvLT5mdW5jKSA/IDAgOgkJXAogCSBwcml2LT5pbmZvLT5mdW5jKHBhcmFtKSkKIAorI2RlZmluZSByc25kX2lzX2VuYWJsZV9wYXRoKGlvLCBuYW1lKSBcCisJKChpbyktPmluZm8gPyAoaW8pLT5pbmZvLT5uYW1lIDogTlVMTCkKKyNkZWZpbmUgcnNuZF9pbmZvX2lkKHByaXYsIGlvLCBuYW1lKSBcCisJKChpbyktPmluZm8tPm5hbWUgLSBwcml2LT5pbmZvLT5uYW1lIyNfaW5mbykKKwogLyoKICAqCXJzbmRfbW9kIGZ1bmN0aW9ucwogICovCkBAIC0xMjEsMTcgKzE0MSwxOSBAQAogdm9pZCByc25kX21vZF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCiAJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkgICBzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHMsCisJCSAgIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlLAogCQkgICBpbnQgaWQpCiB7CiAJbW9kLT5wcml2CT0gcHJpdjsKIAltb2QtPmlkCQk9IGlkOwogCW1vZC0+b3BzCT0gb3BzOwotCUlOSVRfTElTVF9IRUFEKCZtb2QtPmxpc3QpOworCW1vZC0+dHlwZQk9IHR5cGU7CiB9CiAKIC8qCiAgKglyc25kX2RtYSBmdW5jdGlvbnMKICAqLworc3RhdGljIHZvaWQgX19yc25kX2RtYV9zdGFydChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiBzdGF0aWMgdm9pZCByc25kX2RtYV9jb250aW51ZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKIHsKIAkvKiBwdXNoIG5leHQgQSBvciBCIHBsYW5lICovCkBAIC0xNDIsOCArMTY0LDkgQEAKIHZvaWQgcnNuZF9kbWFfc3RhcnQoc3RydWN0IHJzbmRfZG1hICpkbWEpCiB7CiAJLyogcHVzaCBib3RoIEEgYW5kIEIgcGxhbmUqLworCWRtYS0+b2Zmc2V0ID0gMDsKIAlkbWEtPnN1Ym1pdF9sb29wID0gMjsKLQlzY2hlZHVsZV93b3JrKCZkbWEtPndvcmspOworCV9fcnNuZF9kbWFfc3RhcnQoZG1hKTsKIH0KIAogdm9pZCByc25kX2RtYV9zdG9wKHN0cnVjdCByc25kX2RtYSAqZG1hKQpAQCAtMTU2LDEyICsxNzksMjYgQEAKIHN0YXRpYyB2b2lkIHJzbmRfZG1hX2NvbXBsZXRlKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHJzbmRfZG1hICpkbWEgPSAoc3RydWN0IHJzbmRfZG1hICopZGF0YTsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gZG1hLT5wcml2OworCXN0cnVjdCByc25kX21vZCAqbW9kID0gcnNuZF9kbWFfdG9fbW9kKGRtYSk7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYocnNuZF9kbWFfdG9fbW9kKGRtYSkpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcnNuZF9sb2NrKHByaXYsIGZsYWdzKTsKIAotCWRtYS0+Y29tcGxldGUoZG1hKTsKKwkvKgorCSAqIFJlbmVzYXMgc291bmQgR2VuMSBuZWVkcyAxIERNQUMsCisJICogR2VuMiBuZWVkcyAyIERNQUMuCisJICogSW4gR2VuMiBjYXNlLCBpdCBhcmUgQXVkaW8tRE1BQywgYW5kIEF1ZGlvLURNQUMtcGVyaS1wZXJpLgorCSAqIEJ1dCwgQXVkaW8tRE1BQy1wZXJpLXBlcmkgZG9lc24ndCBoYXZlIGludGVycnVwdCwKKwkgKiBhbmQgdGhpcyBkcml2ZXIgaXMgYXNzdW1pbmcgdGhhdCBoZXJlLgorCSAqCisJICogSWYgQXVkaW8tRE1BQy1wZXJpLXBlcmkgaGFzIGludGVycnB0LAorCSAqIHJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKCkgd2lsbCBiZSBjYWxsZWQgdHdpY2UsCisJICogYW50IGl0IHdpbGwgYnJlYWtzIGlvLT5ieXRlX3BvcworCSAqLworCisJcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoaW8sIGlvLT5ieXRlX3Blcl9wZXJpb2QpOwogCiAJaWYgKGRtYS0+c3VibWl0X2xvb3ApCiAJCXJzbmRfZG1hX2NvbnRpbnVlKGRtYSk7CkBAIC0xNjksMjAgKzIwNiwyMyBAQAogCXJzbmRfdW5sb2NrKHByaXYsIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcnNuZF9kbWFfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBfX3JzbmRfZG1hX3N0YXJ0KHN0cnVjdCByc25kX2RtYSAqZG1hKQogewotCXN0cnVjdCByc25kX2RtYSAqZG1hID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByc25kX2RtYSwgd29yayk7Ci0Jc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IGRtYS0+cHJpdjsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwogCWRtYV9hZGRyX3QgYnVmOwotCXNpemVfdCBsZW47CisJc2l6ZV90IGxlbiA9IGlvLT5ieXRlX3Blcl9wZXJpb2Q7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5zdWJtaXRfbG9vcDsgaSsrKSB7CiAKLQkJaWYgKGRtYS0+aW5xdWlyeShkbWEsICZidWYsICZsZW4pIDwgMCkKLQkJCXJldHVybjsKKwkJYnVmID0gcnVudGltZS0+ZG1hX2FkZHIgKworCQkJcnNuZF9kYWlfcG9pbnRlcl9vZmZzZXQoaW8sIGRtYS0+b2Zmc2V0ICsgbGVuKTsKKwkJZG1hLT5vZmZzZXQgPSBsZW47CiAKIAkJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZSgKIAkJCWRtYS0+Y2hhbiwgYnVmLCBsZW4sIGRtYS0+ZGlyLApAQCAtMjA0LDE2ICsyNDQsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHJzbmRfZG1hX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByc25kX2RtYSAqZG1hID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByc25kX2RtYSwgd29yayk7CisKKwlfX3JzbmRfZG1hX3N0YXJ0KGRtYSk7Cit9CisKIGludCByc25kX2RtYV9hdmFpbGFibGUoc3RydWN0IHJzbmRfZG1hICpkbWEpCiB7CiAJcmV0dXJuICEhZG1hLT5jaGFuOwogfQogCiBpbnQgcnNuZF9kbWFfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwKLQkJICBpbnQgaXNfcGxheSwgaW50IGlkLAotCQkgIGludCAoKmlucXVpcnkpKHN0cnVjdCByc25kX2RtYSAqZG1hLAotCQkJCSAgZG1hX2FkZHJfdCAqYnVmLCBpbnQgKmxlbiksCi0JCSAgaW50ICgqY29tcGxldGUpKHN0cnVjdCByc25kX2RtYSAqZG1hKSkKKwkJICBpbnQgaXNfcGxheSwgaW50IGlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnOwpAQCAtMjQ2LDkgKzI5MCw2IEBACiAJCWdvdG8gcnNuZF9kbWFfaW5pdF9lcnI7CiAKIAlkbWEtPmRpciA9IGlzX3BsYXkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFOwotCWRtYS0+cHJpdiA9IHByaXY7Ci0JZG1hLT5pbnF1aXJ5ID0gaW5xdWlyeTsKLQlkbWEtPmNvbXBsZXRlID0gY29tcGxldGU7CiAJSU5JVF9XT1JLKCZkbWEtPndvcmssIHJzbmRfZG1hX2RvX3dvcmspOwogCiAJcmV0dXJuIDA7CkBAIC0yNzEsMjYgKzMxMiw0MiBAQAogLyoKICAqCXJzbmRfZGFpIGZ1bmN0aW9ucwogICovCi0jZGVmaW5lIHJzbmRfZGFpX2NhbGwocmRhaSwgaW8sIGZuKQkJCVwKLSh7CQkJCQkJCVwKLQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgKm47CQkJXAotCWludCByZXQgPSAwOwkJCQkJXAotCWZvcl9lYWNoX3JzbmRfbW9kKG1vZCwgbiwgaW8pIHsJCQlcCi0JCXJldCA9IHJzbmRfbW9kX2NhbGwobW9kLCBmbiwgcmRhaSwgaW8pOwlcCi0JCWlmIChyZXQgPCAwKQkJCQlcCi0JCQlicmVhazsJCQkJXAotCX0JCQkJCQlcCi0JcmV0OwkJCQkJCVwKKyNkZWZpbmUgX19yc25kX21vZF9jYWxsKG1vZCwgZnVuYywgcmRhaSwgaW8pCQkJXAorKHsJCQkJCQkJCVwKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwkJXAorCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CQlcCisJZGV2X2RiZyhkZXYsICIlcyBbJWRdICVzXG4iLAkJCQlcCisJCXJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSwgI2Z1bmMpOwlcCisJKG1vZCktPm9wcy0+ZnVuYyhtb2QsIHJkYWksIGlvKTsJCQlcCiB9KQogCi1pbnQgcnNuZF9kYWlfY29ubmVjdChzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCSAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCisjZGVmaW5lIHJzbmRfbW9kX2NhbGwobW9kLCBmdW5jLCByZGFpLCBpbykJXAorCSghKG1vZCkgPyAtRU5PREVWIDoJCQlcCisJICEoKG1vZCktPm9wcy0+ZnVuYykgPyAwIDoJCVwKKwkgX19yc25kX21vZF9jYWxsKG1vZCwgZnVuYywgKHJkYWkpLCAoaW8pKSkKKworI2RlZmluZSByc25kX2RhaV9jYWxsKHJkYWksIGlvLCBmbikJCQkJXAorKHsJCQkJCQkJCVwKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZDsJCQkJCVwKKwlpbnQgcmV0ID0gMCwgaTsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IFJTTkRfTU9EX01BWDsgaSsrKSB7CQkJXAorCQltb2QgPSAoaW8pLT5tb2RbaV07CQkJCVwKKwkJaWYgKCFtb2QpCQkJCQlcCisJCQljb250aW51ZTsJCQkJXAorCQlyZXQgPSByc25kX21vZF9jYWxsKG1vZCwgZm4sIChyZGFpKSwgKGlvKSk7CVwKKwkJaWYgKHJldCA8IDApCQkJCQlcCisJCQlicmVhazsJCQkJCVwKKwl9CQkJCQkJCVwKKwlyZXQ7CQkJCQkJCVwKK30pCisKK3N0YXRpYyBpbnQgcnNuZF9kYWlfY29ubmVjdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKIAlpZiAoIW1vZCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoIWxpc3RfZW1wdHkoJm1vZC0+bGlzdCkpIHsKKwlpZiAoaW8tPm1vZFttb2QtPnR5cGVdKSB7CiAJCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CiAJCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAKQEAgLTMwMCwxNCArMzU3LDggQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JbGlzdF9hZGRfdGFpbCgmbW9kLT5saXN0LCAmaW8tPmhlYWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCByc25kX2RhaV9kaXNjb25uZWN0KHN0cnVjdCByc25kX21vZCAqbW9kKQotewotCWxpc3RfZGVsX2luaXQoJm1vZC0+bGlzdCk7CisJaW8tPm1vZFttb2QtPnR5cGVdID0gbW9kOworCW1vZC0+aW8gPSBpbzsKIAogCXJldHVybiAwOwogfQpAQCAtMzE2LDcgKzM2Nyw3IEBACiB7CiAJaW50IGlkID0gcmRhaSAtIHByaXYtPnJkYWk7CiAKLQlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfZGFpX25yKHByaXYpKSkKKwlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfcmRhaV9ucihwcml2KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIGlkOwpAQCAtMzI0LDcgKzM3NSw3IEBACiAKIHN0cnVjdCByc25kX2RhaSAqcnNuZF9kYWlfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCkKIHsKLQlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfZGFpX25yKHByaXYpKSkKKwlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfcmRhaV9ucihwcml2KSkpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHByaXYtPnJkYWkgKyBpZDsKQEAgLTM4MiwxMCArNDMzLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZpby0+aGVhZCkpCi0JCXJldHVybiAtRUlPOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlvLT5oZWFkKTsKIAlpby0+c3Vic3RyZWFtCQk9IHN1YnN0cmVhbTsKIAlpby0+Ynl0ZV9wb3MJCT0gMDsKIAlpby0+cGVyaW9kX3BvcwkJPSAwOwpAQCAtNDQwLDEwICs0ODcsNiBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwogCi0JCXJldCA9IHJzbmRfZ2VuX3BhdGhfaW5pdChwcml2LCByZGFpLCBpbyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7Ci0KIAkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCBpbywgaW5pdCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7CkBAIC00NjEsMTAgKzUwNCw2IEBACiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7CiAKLQkJcmV0ID0gcnNuZF9nZW5fcGF0aF9leGl0KHByaXYsIHJkYWksIGlvKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGRhaV90cmlnZ2VyX2VuZDsKLQogCQlyZXQgPSByc25kX3BsYXRmb3JtX2NhbGwocHJpdiwgZGFpLCBzdG9wLCBzc2lfaWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwpAQCAtNDg2LDEwICs1MjUsMTAgQEAKIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06Ci0JCXJkYWktPmNsa19tYXN0ZXIgPSAxOworCQlyZGFpLT5jbGtfbWFzdGVyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgotCQlyZGFpLT5jbGtfbWFzdGVyID0gMDsKKwkJcmRhaS0+Y2xrX21hc3RlciA9IDE7IC8qIGNvZGVjIGlzIHNsYXZlLCBjcHUgaXMgbWFzdGVyICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTQwLDI0ICs1NzksMTc0IEBACiAJLnNldF9mbXQJPSByc25kX3NvY19kYWlfc2V0X2ZtdCwKIH07CiAKK3N0YXRpYyBpbnQgcnNuZF9wYXRoX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKKwkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZDsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm8gPSByZGFpLT5pbmZvOworCWludCByZXQ7CisJaW50IHNzaV9pZCA9IC0xOworCWludCBzcmNfaWQgPSAtMTsKKworCS8qCisJICogR2VuMSBpcyBjcmVhdGVkIGJ5IFNSVS9TU0ksIGFuZCB0aGlzIFNSVSBpcyBiYXNlIG1vZHVsZSBvZgorCSAqIEdlbjIncyBTQ1UvU1NJVS9TU0kuIChHZW4yIFNDVS9TU0lVIGNhbWUgZnJvbSBTUlUpCisJICoKKwkgKiBFYXN5IGltYWdlIGlzLi4KKwkgKglHZW4xIFNSVSA9IEdlbjIgU0NVICsgU1NJVSArIGV0YworCSAqCisJICogR2VuMiBTQ1UgcGF0aCBpcyB2ZXJ5IGZsZXhpYmxlLCBidXQsIEdlbjEgU1JVIChTQ1UgcGFydHMpIGlzCisJICogdXNpbmcgZml4ZWQgcGF0aC4KKwkgKi8KKwlpZiAoZGFpX2luZm8pIHsKKwkJaWYgKHJzbmRfaXNfZW5hYmxlX3BhdGgoaW8sIHNzaSkpCisJCQlzc2lfaWQgPSByc25kX2luZm9faWQocHJpdiwgaW8sIHNzaSk7CisJCWlmIChyc25kX2lzX2VuYWJsZV9wYXRoKGlvLCBzcmMpKQorCQkJc3JjX2lkID0gcnNuZF9pbmZvX2lkKHByaXYsIGlvLCBzcmMpOworCX0gZWxzZSB7CisJCS8qIGdldCBTU0kncyBJRCAqLworCQltb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwKKwkJCQkJICAgICAgIHJzbmRfZGFpX2lkKHByaXYsIHJkYWkpLAorCQkJCQkgICAgICAgcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykpOworCQlpZiAoIW1vZCkKKwkJCXJldHVybiAwOworCQlzc2lfaWQgPSBzcmNfaWQgPSByc25kX21vZF9pZChtb2QpOworCX0KKworCXJldCA9IDA7CisKKwkvKiBTUkMgKi8KKwlpZiAoc3JjX2lkID49IDApIHsKKwkJbW9kID0gcnNuZF9zcmNfbW9kX2dldChwcml2LCBzcmNfaWQpOworCQlyZXQgPSByc25kX2RhaV9jb25uZWN0KG1vZCwgaW8pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogU1NJICovCisJaWYgKHNzaV9pZCA+PSAwKSB7CisJCW1vZCA9IHJzbmRfc3NpX21vZF9nZXQocHJpdiwgc3NpX2lkKTsKKwkJcmV0ID0gcnNuZF9kYWlfY29ubmVjdChtb2QsIGlvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJzbmRfb2ZfcGFyc2VfZGFpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkJICAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhaV9ub2RlLAkqZGFpX25wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3NpX25vZGUsCSpzc2lfbnA7CisJc3RydWN0IGRldmljZV9ub2RlICpzcmNfbm9kZSwJKnNyY19ucDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBsYXliYWNrLCAqY2FwdHVyZTsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm87CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBuciwgaTsKKwlpbnQgZGFpX2ksIHNzaV9pLCBzcmNfaTsKKworCWlmICghb2ZfZGF0YSkKKwkJcmV0dXJuOworCisJZGFpX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLGRhaSIpOworCWlmICghZGFpX25vZGUpCisJCXJldHVybjsKKworCW5yID0gb2ZfZ2V0X2NoaWxkX2NvdW50KGRhaV9ub2RlKTsKKwlpZiAoIW5yKQorCQlyZXR1cm47CisKKwlkYWlfaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvKSAqIG5yLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghZGFpX2luZm8pIHsKKwkJZGV2X2VycihkZXYsICJkYWkgaW5mbyBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8tPmRhaV9pbmZvX25yCT0gbnI7CisJaW5mby0+ZGFpX2luZm8JCT0gZGFpX2luZm87CisKKwlzc2lfbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgInJjYXJfc291bmQsc3NpIik7CisJc3JjX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNyYyIpOworCisjZGVmaW5lIG1vZF9wYXJzZShuYW1lKQkJCQkJCQlcCitpZiAobmFtZSMjX25vZGUpIHsJCQkJCQkJXAorCXN0cnVjdCByc25kXyMjbmFtZSMjX3BsYXRmb3JtX2luZm8gKm5hbWUjI19pbmZvOwkJXAorCQkJCQkJCQkJXAorCW5hbWUjI19pID0gMDsJCQkJCQkJXAorCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobmFtZSMjX25vZGUsIG5hbWUjI19ucCkgewkJXAorCQluYW1lIyNfaW5mbyA9IGluZm8tPm5hbWUjI19pbmZvICsgbmFtZSMjX2k7CQlcCisJCQkJCQkJCQlcCisJCWlmIChuYW1lIyNfbnAgPT0gcGxheWJhY2spCQkJCVwKKwkJCWRhaV9pbmZvLT5wbGF5YmFjay5uYW1lID0gbmFtZSMjX2luZm87CQlcCisJCWlmIChuYW1lIyNfbnAgPT0gY2FwdHVyZSkJCQkJXAorCQkJZGFpX2luZm8tPmNhcHR1cmUubmFtZSA9IG5hbWUjI19pbmZvOwkJXAorCQkJCQkJCQkJXAorCQluYW1lIyNfaSsrOwkJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKKwkvKgorCSAqIHBhcnNlIGFsbCBkYWkKKwkgKi8KKwlkYWlfaSA9IDA7CisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShkYWlfbm9kZSwgZGFpX25wKSB7CisJCWRhaV9pbmZvID0gaW5mby0+ZGFpX2luZm8gKyBkYWlfaTsKKworCQlmb3IgKGkgPSAwOzsgaSsrKSB7CisKKwkJCXBsYXliYWNrID0gb2ZfcGFyc2VfcGhhbmRsZShkYWlfbnAsICJwbGF5YmFjayIsIGkpOworCQkJY2FwdHVyZSAgPSBvZl9wYXJzZV9waGFuZGxlKGRhaV9ucCwgImNhcHR1cmUiLCBpKTsKKworCQkJaWYgKCFwbGF5YmFjayAmJiAhY2FwdHVyZSkKKwkJCQlicmVhazsKKworCQkJbW9kX3BhcnNlKHNzaSk7CisJCQltb2RfcGFyc2Uoc3JjKTsKKworCQkJaWYgKHBsYXliYWNrKQorCQkJCW9mX25vZGVfcHV0KHBsYXliYWNrKTsKKwkJCWlmIChjYXB0dXJlKQorCQkJCW9mX25vZGVfcHV0KGNhcHR1cmUpOworCQl9CisKKwkJZGFpX2krKzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgcnNuZF9kYWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCQkgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCQkgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZHJ2OworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CiAJc3RydWN0IHJzbmRfZGFpICpyZGFpOwogCXN0cnVjdCByc25kX21vZCAqcG1vZCwgKmNtb2Q7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlpbnQgZGFpX25yOwogCWludCBpOwogCi0JLyogZ2V0IG1heCBkYWkgbnIgKi8KLQlmb3IgKGRhaV9uciA9IDA7IGRhaV9uciA8IDMyOyBkYWlfbnIrKykgewotCQlwbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGRhaV9uciwgMSk7Ci0JCWNtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgZGFpX25yLCAwKTsKKwlyc25kX29mX3BhcnNlX2RhaShwZGV2LCBvZl9kYXRhLCBwcml2KTsKIAotCQlpZiAoIXBtb2QgJiYgIWNtb2QpCi0JCQlicmVhazsKKwkvKgorCSAqIGRhaV9uciBzaG91bGQgYmUgc2V0IHZpYSBkYWlfaW5mb19uciwKKwkgKiBidXQgYWxsb3cgaXQgdG8ga2VlcGluZyBjb21wYXRpYmxlCisJICovCisJZGFpX25yID0gaW5mby0+ZGFpX2luZm9fbnI7CisJaWYgKCFkYWlfbnIpIHsKKwkJLyogZ2V0IG1heCBkYWkgbnIgKi8KKwkJZm9yIChkYWlfbnIgPSAwOyBkYWlfbnIgPCAzMjsgZGFpX25yKyspIHsKKwkJCXBtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgZGFpX25yLCAxKTsKKwkJCWNtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgZGFpX25yLCAwKTsKKworCQkJaWYgKCFwbW9kICYmICFjbW9kKQorCQkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKCFkYWlfbnIpIHsKQEAgLTU3Miw3ICs3NjEsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJcHJpdi0+cmRhaV9ucgk9IGRhaV9ucjsKKwlwcml2LT5kYWlkcnYJPSBkcnY7CisJcHJpdi0+cmRhaQk9IHJkYWk7CisKIAlmb3IgKGkgPSAwOyBpIDwgZGFpX25yOyBpKyspIHsKKwkJaWYgKGluZm8tPmRhaV9pbmZvKQorCQkJcmRhaVtpXS5pbmZvID0gJmluZm8tPmRhaV9pbmZvW2ldOwogCiAJCXBtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgaSwgMSk7CiAJCWNtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgaSwgMCk7CkBAIC01ODAsOSArNzc1LDYgQEAKIAkJLyoKIAkJICoJaW5pdCByc25kX2RhaQogCQkgKi8KLQkJSU5JVF9MSVNUX0hFQUQoJnJkYWlbaV0ucGxheWJhY2suaGVhZCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZyZGFpW2ldLmNhcHR1cmUuaGVhZCk7Ci0KIAkJc25wcmludGYocmRhaVtpXS5uYW1lLCBSU05EX0RBSV9OQU1FX1NJWkUsICJyc25kLWRhaS4lZCIsIGkpOwogCiAJCS8qCkBAIC01OTUsMTIgKzc4NywyMCBAQAogCQkJZHJ2W2ldLnBsYXliYWNrLmZvcm1hdHMJCT0gUlNORF9GTVRTOwogCQkJZHJ2W2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbgk9IDI7CiAJCQlkcnZbaV0ucGxheWJhY2suY2hhbm5lbHNfbWF4CT0gMjsKKworCQkJaWYgKGluZm8tPmRhaV9pbmZvKQorCQkJCXJkYWlbaV0ucGxheWJhY2suaW5mbyA9ICZpbmZvLT5kYWlfaW5mb1tpXS5wbGF5YmFjazsKKwkJCXJzbmRfcGF0aF9pbml0KHByaXYsICZyZGFpW2ldLCAmcmRhaVtpXS5wbGF5YmFjayk7CiAJCX0KIAkJaWYgKGNtb2QpIHsKIAkJCWRydltpXS5jYXB0dXJlLnJhdGVzCQk9IFJTTkRfUkFURVM7CiAJCQlkcnZbaV0uY2FwdHVyZS5mb3JtYXRzCQk9IFJTTkRfRk1UUzsKIAkJCWRydltpXS5jYXB0dXJlLmNoYW5uZWxzX21pbgk9IDI7CiAJCQlkcnZbaV0uY2FwdHVyZS5jaGFubmVsc19tYXgJPSAyOworCisJCQlpZiAoaW5mby0+ZGFpX2luZm8pCisJCQkJcmRhaVtpXS5jYXB0dXJlLmluZm8gPSAmaW5mby0+ZGFpX2luZm9baV0uY2FwdHVyZTsKKwkJCXJzbmRfcGF0aF9pbml0KHByaXYsICZyZGFpW2ldLCAmcmRhaVtpXS5jYXB0dXJlKTsKIAkJfQogCiAJCWRldl9kYmcoZGV2LCAiJXMgKCVzLyVzKVxuIiwgcmRhaVtpXS5uYW1lLApAQCAtNjA4LDE4ICs4MDgsOSBAQAogCQkJY21vZCA/ICJjYXB0dXJlIiA6ICIgIC0tICAgIik7CiAJfQogCi0JcHJpdi0+ZGFpX25yCT0gZGFpX25yOwotCXByaXYtPmRhaWRydgk9IGRydjsKLQlwcml2LT5yZGFpCT0gcmRhaTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc25kX2RhaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLX0KLQogLyoKICAqCQlwY20gb3BzCiAgKi8KQEAgLTcxMyw5ICs5MDQsMzAgQEAKIAlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWk7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UocnNuZF9vZl9tYXRjaCwgZGV2KTsKKwljb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhOworCWludCAoKnByb2JlX2Z1bmNbXSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkJICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpID0geworCQlyc25kX2dlbl9wcm9iZSwKKwkJcnNuZF9zc2lfcHJvYmUsCisJCXJzbmRfc3JjX3Byb2JlLAorCQlyc25kX2FkZ19wcm9iZSwKKwkJcnNuZF9kYWlfcHJvYmUsCisJfTsKKwlpbnQgcmV0LCBpOwogCi0JaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWluZm8gPSBOVUxMOworCW9mX2RhdGEgPSBOVUxMOworCWlmIChvZl9pZCkgeworCQlpbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcmNhcl9zbmRfaW5mbyksIEdGUF9LRVJORUwpOworCQlvZl9kYXRhID0gb2ZfaWQtPmRhdGE7CisJfSBlbHNlIHsKKwkJaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCX0KKwogCWlmICghaW5mbykgewogCQlkZXZfZXJyKGRldiwgImRyaXZlciBuZWVkcyBSLUNhciBzb3VuZCBpbmZvcm1hdGlvblxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzM3LDI1ICs5NDksMjEgQEAKIAkvKgogCSAqCWluaXQgZWFjaCBtb2R1bGUKIAkgKi8KLQlyZXQgPSByc25kX2dlbl9wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9iZV9mdW5jKTsgaSsrKSB7CisJCXJldCA9IHByb2JlX2Z1bmNbaV0ocGRldiwgb2ZfZGF0YSwgcHJpdik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAotCXJldCA9IHJzbmRfc2N1X3Byb2JlKHBkZXYsIGluZm8sIHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWZvcl9lYWNoX3JzbmRfZGFpKHJkYWksIHByaXYsIGkpIHsKKwkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCAmcmRhaS0+cGxheWJhY2ssIHByb2JlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQlyZXQgPSByc25kX2FkZ19wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJzbmRfc3NpX3Byb2JlKHBkZXYsIGluZm8sIHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gcnNuZF9kYWlfcHJvYmUocGRldiwgaW5mbywgcHJpdik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCXJldCA9IHJzbmRfZGFpX2NhbGwocmRhaSwgJnJkYWktPmNhcHR1cmUsIHByb2JlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKglhc29jIHJlZ2lzdGVyCkBAIC03NjcsNyArOTc1LDcgQEAKIAl9CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudChkZXYsICZyc25kX3NvY19jb21wb25lbnQsCi0JCQkJCSBwcml2LT5kYWlkcnYsIHJzbmRfZGFpX25yKHByaXYpKTsKKwkJCQkJIHByaXYtPmRhaWRydiwgcnNuZF9yZGFpX25yKHByaXYpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzbmQgZGFpIHJlZ2lzdGVyXG4iKTsKIAkJZ290byBleGl0X3NuZF9zb2M7CkBAIC03ODksMTcgKzk5NywyMCBAQAogc3RhdGljIGludCByc25kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHJzbmRfZGFpICpyZGFpOworCWludCByZXQsIGk7CiAKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKLQkvKgotCSAqCXJlbW92ZSBlYWNoIG1vZHVsZQotCSAqLwotCXJzbmRfc3NpX3JlbW92ZShwZGV2LCBwcml2KTsKLQlyc25kX2FkZ19yZW1vdmUocGRldiwgcHJpdik7Ci0JcnNuZF9zY3VfcmVtb3ZlKHBkZXYsIHByaXYpOwotCXJzbmRfZGFpX3JlbW92ZShwZGV2LCBwcml2KTsKLQlyc25kX2dlbl9yZW1vdmUocGRldiwgcHJpdik7CisJZm9yX2VhY2hfcnNuZF9kYWkocmRhaSwgcHJpdiwgaSkgeworCQlyZXQgPSByc25kX2RhaV9jYWxsKHJkYWksICZyZGFpLT5wbGF5YmFjaywgcmVtb3ZlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCAmcmRhaS0+Y2FwdHVyZSwgcmVtb3ZlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04MDcsNiArMTAxOCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByc25kX2RyaXZlciA9IHsKIAkuZHJpdmVyCT0gewogCQkubmFtZQk9ICJyY2FyX3NvdW5kIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcnNuZF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZQkJPSByc25kX3Byb2JlLAogCS5yZW1vdmUJCT0gcnNuZF9yZW1vdmUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2dlbi5jCmluZGV4IGFkZDA4OGIuLjUwYTFlZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL2dlbi5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL2dlbi5jCkBAIC0xNTUsNjIgKzE1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByc25kX2dlbl9wYXRoX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX21vZCAqbW9kOwotCWludCByZXQ7Ci0JaW50IGlkOwotCi0JLyoKLQkgKiBHZW4xIGlzIGNyZWF0ZWQgYnkgU1JVL1NTSSwgYW5kIHRoaXMgU1JVIGlzIGJhc2UgbW9kdWxlIG9mCi0JICogR2VuMidzIFNDVS9TU0lVL1NTSS4gKEdlbjIgU0NVL1NTSVUgY2FtZSBmcm9tIFNSVSkKLQkgKgotCSAqIEVhc3kgaW1hZ2UgaXMuLgotCSAqCUdlbjEgU1JVID0gR2VuMiBTQ1UgKyBTU0lVICsgZXRjCi0JICoKLQkgKiBHZW4yIFNDVSBwYXRoIGlzIHZlcnkgZmxleGlibGUsIGJ1dCwgR2VuMSBTUlUgKFNDVSBwYXJ0cykgaXMKLQkgKiB1c2luZyBmaXhlZCBwYXRoLgotCSAqCi0JICogVGhlbiwgU1NJIGlkID0gU0NVIGlkIGhlcmUKLQkgKi8KLQotCS8qIGdldCBTU0kncyBJRCAqLwotCW1vZCA9IHJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShwcml2LAotCQkJCSAgICAgICByc25kX2RhaV9pZChwcml2LCByZGFpKSwKLQkJCQkgICAgICAgcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykpOwotCWlkID0gcnNuZF9tb2RfaWQobW9kKTsKLQotCS8qIFNTSSAqLwotCW1vZCA9IHJzbmRfc3NpX21vZF9nZXQocHJpdiwgaWQpOwotCXJldCA9IHJzbmRfZGFpX2Nvbm5lY3QocmRhaSwgbW9kLCBpbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTQ1UgKi8KLQltb2QgPSByc25kX3NjdV9tb2RfZ2V0KHByaXYsIGlkKTsKLQlyZXQgPSByc25kX2RhaV9jb25uZWN0KHJkYWksIG1vZCwgaW8pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJzbmRfZ2VuX3BhdGhfZXhpdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkgICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCi17Ci0Jc3RydWN0IHJzbmRfbW9kICptb2QsICpuOwotCWludCByZXQgPSAwOwotCi0JLyoKLQkgKiByZW1vdmUgYWxsIG1vZCBmcm9tIHJkYWkKLQkgKi8KLQlmb3JfZWFjaF9yc25kX21vZChtb2QsIG4sIGlvKQotCQlyZXQgfD0gcnNuZF9kYWlfZGlzY29ubmVjdChtb2QpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqCQlHZW4yCiAgKi8KQEAgLTIyOSwxNCArMTczLDQwIEBACiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIFNTSVUsCVNTSV9NT0RFMCwJMHg4MDApLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBTU0lVLAlTU0lfTU9ERTEsCTB4ODA0KSwKIAkJLyogRklYTUU6IGl0IG5lZWRzIFNTSV9NT0RFMi8zIGluIHRoZSBmdXR1cmUgKi8KKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU1NJVSwJU1NJX0JVU0lGX01PREUsCTB4MCwJMHg4MCksCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSVUsCVNTSV9CVVNJRl9BRElOUiwweDQsCTB4ODApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTU0lVLAlTU0lfQ1RSTCwJMHgxMCwJMHg4MCksCiAJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSVUsCUlOVF9FTkFCTEUsCTB4MTgsCTB4ODApLAogCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNDVSwJU1JDX0JVU0lGX01PREUsCTB4MCwJMHgyMCksCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNDVSwJU1JDX1JPVVRFX01PREUwLDB4YywJMHgyMCksCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNDVSwJU1JDX0NUUkwsCTB4MTAsCTB4MjApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19TV1JTUiwJMHgyMDAsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19TUkNJUiwJMHgyMDQsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19BRElOUiwJMHgyMTQsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19JRlNDUiwJMHgyMWMsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19JRlNWUiwJMHgyMjAsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19TUkNDUiwJMHgyMjQsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19CU0RTUiwJMHgyMmMsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19CU0lTUiwJMHgyMzgsCTB4NDApLAorCiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJQlJSQSwJCTB4MDApLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCUJSUkIsCQkweDA0KSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTU0lDS1IsCQkweDA4KSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlBVURJT19DTEtfU0VMMCwJMHgwYyksCiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJQVVESU9fQ0xLX1NFTDEsCTB4MTApLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCUFVRElPX0NMS19TRUwyLAkweDE0KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlESVZfRU4sCQkweDMwKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwwLAkweDM0KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwxLAkweDM4KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwyLAkweDNjKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwzLAkweDQwKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUw0LAkweDQ0KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNPVVRfVElNU0VMMCwJMHg0OCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDT1VUX1RJTVNFTDEsCTB4NGMpLAorCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCVNSQ09VVF9USU1TRUwyLAkweDUwKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNPVVRfVElNU0VMMywJMHg1NCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDT1VUX1RJTVNFTDQsCTB4NTgpLAogCiAJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSSwJU1NJQ1IsCQkweDAwLAkweDQwKSwKIAkJUlNORF9HRU4yX01fUkVHKGdlbiwgU1NJLAlTU0lTUiwJCTB4MDQsCTB4NDApLApAQCAtMjQ5LDcgKzIxOSw2IEBACiB9CiAKIHN0YXRpYyBpbnQgcnNuZF9nZW4yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKIAkJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKQEAgLTI4Myw3ICsyNTIsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJZGV2X2RiZyhkZXYsICJHZW4yIGRldmljZSBwcm9iZWRcbiIpOwotCWRldl9kYmcoZGV2LCAiU1JVICA6ICUwOHggPT4gJXBcbiIsIHNjdV9yZXMtPnN0YXJ0LAorCWRldl9kYmcoZGV2LCAiU0NVICA6ICUwOHggPT4gJXBcbiIsIHNjdV9yZXMtPnN0YXJ0LAogCQlnZW4tPmJhc2VbUlNORF9HRU4yX1NDVV0pOwogCWRldl9kYmcoZGV2LCAiQURHICA6ICUwOHggPT4gJXBcbiIsIGFkZ19yZXMtPnN0YXJ0LAogCQlnZW4tPmJhc2VbUlNORF9HRU4yX0FER10pOwpAQCAtMzE3LDcgKzI4Niw3IEBACiAJCVJTTkRfR0VOMV9TX1JFRyhnZW4sIFNSVSwJU1JDX1JPVVRFX0NUUkwsCTB4YzApLAogCQlSU05EX0dFTjFfU19SRUcoZ2VuLCBTUlUsCVNTSV9NT0RFMCwJMHhEMCksCiAJCVJTTkRfR0VOMV9TX1JFRyhnZW4sIFNSVSwJU1NJX01PREUxLAkweEQ0KSwKLQkJUlNORF9HRU4xX01fUkVHKGdlbiwgU1JVLAlCVVNJRl9NT0RFLAkweDIwLAkweDQpLAorCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19CVVNJRl9NT0RFLAkweDIwLAkweDQpLAogCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19ST1VURV9NT0RFMCwweDUwLAkweDgpLAogCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19TV1JTUiwJMHgyMDAsCTB4NDApLAogCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19TUkNJUiwJMHgyMDQsCTB4NDApLApAQCAtMzQ3LDcgKzMxNiw2IEBACiB9CiAKIHN0YXRpYyBpbnQgcnNuZF9nZW4xX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKIAkJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKQEAgLTM5MSwxNCArMzU5LDI4IEBACiAvKgogICoJCUdlbgogICovCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX2dlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSBwcml2LT5pbmZvOworCisJaWYgKCFvZl9kYXRhKQorCQlyZXR1cm47CisKKwlpbmZvLT5mbGFncyA9IG9mX2RhdGEtPmZsYWdzOworfQorCiBpbnQgcnNuZF9nZW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9nZW4gKmdlbjsKIAlpbnQgcmV0OwogCisJcnNuZF9vZl9wYXJzZV9nZW4ocGRldiwgb2ZfZGF0YSwgcHJpdik7CisKIAlnZW4gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmdlbiksIEdGUF9LRVJORUwpOwogCWlmICghZ2VuKSB7CiAJCWRldl9lcnIoZGV2LCAiR0VOIGFsbG9jYXRlIGZhaWxlZFxuIik7CkBAIC00MDksMTcgKzM5MSwxMiBAQAogCiAJcmV0ID0gLUVOT0RFVjsKIAlpZiAocnNuZF9pc19nZW4xKHByaXYpKQotCQlyZXQgPSByc25kX2dlbjFfcHJvYmUocGRldiwgaW5mbywgcHJpdik7CisJCXJldCA9IHJzbmRfZ2VuMV9wcm9iZShwZGV2LCBwcml2KTsKIAllbHNlIGlmIChyc25kX2lzX2dlbjIocHJpdikpCi0JCXJldCA9IHJzbmRfZ2VuMl9wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKKwkJcmV0ID0gcnNuZF9nZW4yX3Byb2JlKHBkZXYsIHByaXYpOwogCiAJaWYgKHJldCA8IDApCiAJCWRldl9lcnIoZGV2LCAidW5rbm93biBnZW5lcmF0aW9uIFItQ2FyIHNvdW5kIGRldmljZVxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQotCi12b2lkIHJzbmRfZ2VuX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCi17Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9yc25kLmggYi9zb3VuZC9zb2Mvc2gvcmNhci9yc25kLmgKaW5kZXggNGNhNjZjZC4uNjE5ZDE5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvcnNuZC5oCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3JzbmQuaApAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPHNvdW5kL3JjYXJfc25kLmg+CkBAIC0zMiwxNSArMzQsOSBAQAogICovCiBlbnVtIHJzbmRfcmVnIHsKIAkvKiBTUlUvU0NVL1NTSVUgKi8KLQlSU05EX1JFR19TUkNfUk9VVEVfU0VMLAkJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19TUkNfVE1HX1NFTDAsCQkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX1NSQ19UTUdfU0VMMSwJCS8qIGZvciBHZW4xICovCi0JUlNORF9SRUdfU1JDX1RNR19TRUwyLAkJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19TUkNfUk9VVEVfQ1RSTCwJLyogZm9yIEdlbjEgKi8KIAlSU05EX1JFR19TU0lfTU9ERTAsCiAJUlNORF9SRUdfU1NJX01PREUxLAotCVJTTkRfUkVHX0JVU0lGX01PREUsCi0JUlNORF9SRUdfSU5UX0VOQUJMRSwJCS8qIGZvciBHZW4yICovCisJUlNORF9SRUdfU1JDX0JVU0lGX01PREUsCiAJUlNORF9SRUdfU1JDX1JPVVRFX01PREUwLAogCVJTTkRfUkVHX1NSQ19TV1JTUiwKIAlSU05EX1JFR19TUkNfU1JDSVIsCkBAIC00OCw3ICs0NCw2IEBACiAJUlNORF9SRUdfU1JDX0lGU0NSLAogCVJTTkRfUkVHX1NSQ19JRlNWUiwKIAlSU05EX1JFR19TUkNfU1JDQ1IsCi0JUlNORF9SRUdfU1JDX01ORlNSLAogCiAJLyogQURHICovCiAJUlNORF9SRUdfQlJSQSwKQEAgLTU2LDEwICs1MSw2IEBACiAJUlNORF9SRUdfU1NJQ0tSLAogCVJTTkRfUkVHX0FVRElPX0NMS19TRUwwLAogCVJTTkRfUkVHX0FVRElPX0NMS19TRUwxLAotCVJTTkRfUkVHX0FVRElPX0NMS19TRUwyLAotCVJTTkRfUkVHX0FVRElPX0NMS19TRUwzLAkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX0FVRElPX0NMS19TRUw0LAkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX0FVRElPX0NMS19TRUw1LAkvKiBmb3IgR2VuMSAqLwogCiAJLyogU1NJICovCiAJUlNORF9SRUdfU1NJQ1IsCkBAIC02OCw5ICs1OSw2MyBAQAogCVJTTkRfUkVHX1NTSVJEUiwKIAlSU05EX1JFR19TU0lXU1IsCiAKKwkvKiBTSEFSRSBzZWUgYmVsb3cgKi8KKwlSU05EX1JFR19TSEFSRTAxLAorCVJTTkRfUkVHX1NIQVJFMDIsCisJUlNORF9SRUdfU0hBUkUwMywKKwlSU05EX1JFR19TSEFSRTA0LAorCVJTTkRfUkVHX1NIQVJFMDUsCisJUlNORF9SRUdfU0hBUkUwNiwKKwlSU05EX1JFR19TSEFSRTA3LAorCVJTTkRfUkVHX1NIQVJFMDgsCisJUlNORF9SRUdfU0hBUkUwOSwKKwlSU05EX1JFR19TSEFSRTEwLAorCVJTTkRfUkVHX1NIQVJFMTEsCisJUlNORF9SRUdfU0hBUkUxMiwKKwlSU05EX1JFR19TSEFSRTEzLAorCVJTTkRfUkVHX1NIQVJFMTQsCisJUlNORF9SRUdfU0hBUkUxNSwKKwlSU05EX1JFR19TSEFSRTE2LAorCVJTTkRfUkVHX1NIQVJFMTcsCisJUlNORF9SRUdfU0hBUkUxOCwKKwlSU05EX1JFR19TSEFSRTE5LAorCiAJUlNORF9SRUdfTUFYLAogfTsKIAorLyogR2VuMSBvbmx5ICovCisjZGVmaW5lIFJTTkRfUkVHX1NSQ19ST1VURV9TRUwJCVJTTkRfUkVHX1NIQVJFMDEKKyNkZWZpbmUgUlNORF9SRUdfU1JDX1RNR19TRUwwCQlSU05EX1JFR19TSEFSRTAyCisjZGVmaW5lIFJTTkRfUkVHX1NSQ19UTUdfU0VMMQkJUlNORF9SRUdfU0hBUkUwMworI2RlZmluZSBSU05EX1JFR19TUkNfVE1HX1NFTDIJCVJTTkRfUkVHX1NIQVJFMDQKKyNkZWZpbmUgUlNORF9SRUdfU1JDX1JPVVRFX0NUUkwJCVJTTkRfUkVHX1NIQVJFMDUKKyNkZWZpbmUgUlNORF9SRUdfU1JDX01ORlNSCQlSU05EX1JFR19TSEFSRTA2CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUwzCQlSU05EX1JFR19TSEFSRTA3CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUw0CQlSU05EX1JFR19TSEFSRTA4CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUw1CQlSU05EX1JFR19TSEFSRTA5CisKKy8qIEdlbjIgb25seSAqLworI2RlZmluZSBSU05EX1JFR19TUkNfQ1RSTAkJUlNORF9SRUdfU0hBUkUwMQorI2RlZmluZSBSU05EX1JFR19TU0lfQ1RSTAkJUlNORF9SRUdfU0hBUkUwMgorI2RlZmluZSBSU05EX1JFR19TU0lfQlVTSUZfTU9ERQkJUlNORF9SRUdfU0hBUkUwMworI2RlZmluZSBSU05EX1JFR19TU0lfQlVTSUZfQURJTlIJUlNORF9SRUdfU0hBUkUwNAorI2RlZmluZSBSU05EX1JFR19JTlRfRU5BQkxFCQlSU05EX1JFR19TSEFSRTA1CisjZGVmaW5lIFJTTkRfUkVHX1NSQ19CU0RTUgkJUlNORF9SRUdfU0hBUkUwNgorI2RlZmluZSBSU05EX1JFR19TUkNfQlNJU1IJCVJTTkRfUkVHX1NIQVJFMDcKKyNkZWZpbmUgUlNORF9SRUdfRElWX0VOCQkJUlNORF9SRUdfU0hBUkUwOAorI2RlZmluZSBSU05EX1JFR19TUkNJTl9USU1TRUwwCQlSU05EX1JFR19TSEFSRTA5CisjZGVmaW5lIFJTTkRfUkVHX1NSQ0lOX1RJTVNFTDEJCVJTTkRfUkVHX1NIQVJFMTAKKyNkZWZpbmUgUlNORF9SRUdfU1JDSU5fVElNU0VMMgkJUlNORF9SRUdfU0hBUkUxMQorI2RlZmluZSBSU05EX1JFR19TUkNJTl9USU1TRUwzCQlSU05EX1JFR19TSEFSRTEyCisjZGVmaW5lIFJTTkRfUkVHX1NSQ0lOX1RJTVNFTDQJCVJTTkRfUkVHX1NIQVJFMTMKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDAJCVJTTkRfUkVHX1NIQVJFMTQKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDEJCVJTTkRfUkVHX1NIQVJFMTUKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDIJCVJTTkRfUkVHX1NIQVJFMTYKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDMJCVJTTkRfUkVHX1NIQVJFMTcKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDQJCVJTTkRfUkVHX1NIQVJFMTgKKyNkZWZpbmUgUlNORF9SRUdfQVVESU9fQ0xLX1NFTDIJCVJTTkRfUkVHX1NIQVJFMTkKKworc3RydWN0IHJzbmRfb2ZfZGF0YTsKIHN0cnVjdCByc25kX3ByaXY7CiBzdHJ1Y3QgcnNuZF9tb2Q7CiBzdHJ1Y3QgcnNuZF9kYWk7CkBAIC05NiwyNCArMTQxLDIwIEBACiAgKglSLUNhciBETUEKICAqLwogc3RydWN0IHJzbmRfZG1hIHsKLQlzdHJ1Y3QgcnNuZF9wcml2CSpwcml2OwogCXN0cnVjdCBzaF9kbWFlX3NsYXZlCXNsYXZlOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXN0cnVjdCBkbWFfY2hhbgkJKmNoYW47CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOwotCWludCAoKmlucXVpcnkpKHN0cnVjdCByc25kX2RtYSAqZG1hLCBkbWFfYWRkcl90ICpidWYsIGludCAqbGVuKTsKLQlpbnQgKCpjb21wbGV0ZSkoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogCiAJaW50IHN1Ym1pdF9sb29wOworCWludCBvZmZzZXQ7IC8qIGl0IGNhcmVzIEEvQiBwbGFuZSAqLwogfTsKIAogdm9pZCByc25kX2RtYV9zdGFydChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiB2b2lkIHJzbmRfZG1hX3N0b3Aoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogaW50IHJzbmRfZG1hX2F2YWlsYWJsZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiBpbnQgcnNuZF9kbWFfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwKLQlpbnQgaXNfcGxheSwgaW50IGlkLAotCWludCAoKmlucXVpcnkpKHN0cnVjdCByc25kX2RtYSAqZG1hLCBkbWFfYWRkcl90ICpidWYsIGludCAqbGVuKSwKLQlpbnQgKCpjb21wbGV0ZSkoc3RydWN0IHJzbmRfZG1hICpkbWEpKTsKKwlpbnQgaXNfcGxheSwgaW50IGlkKTsKIHZvaWQgIHJzbmRfZG1hX3F1aXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKIAkJICAgIHN0cnVjdCByc25kX2RtYSAqZG1hKTsKIApAQCAtMTIxLDkgKzE2MiwyMCBAQAogLyoKICAqCVItQ2FyIHNvdW5kIG1vZAogICovCitlbnVtIHJzbmRfbW9kX3R5cGUgeworCVJTTkRfTU9EX1NSQyA9IDAsCisJUlNORF9NT0RfU1NJLAorCVJTTkRfTU9EX01BWCwKK307CiAKIHN0cnVjdCByc25kX21vZF9vcHMgewogCWNoYXIgKm5hbWU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiAJaW50ICgqaW5pdCkoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCSAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCiAJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CkBAIC0xMzgsMjggKzE5MCwyNiBAQAogCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogfTsKIAorc3RydWN0IHJzbmRfZGFpX3N0cmVhbTsKIHN0cnVjdCByc25kX21vZCB7CiAJaW50IGlkOworCWVudW0gcnNuZF9tb2RfdHlwZSB0eXBlOwogCXN0cnVjdCByc25kX3ByaXYgKnByaXY7CiAJc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogY29ubmVjdCB0byByc25kX2RhaSBwbGF5YmFjay9jYXB0dXJlICovCiAJc3RydWN0IHJzbmRfZG1hIGRtYTsKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbzsKIH07CiAKICNkZWZpbmUgcnNuZF9tb2RfdG9fcHJpdihtb2QpICgobW9kKS0+cHJpdikKICNkZWZpbmUgcnNuZF9tb2RfdG9fZG1hKG1vZCkgKCYobW9kKS0+ZG1hKQogI2RlZmluZSByc25kX2RtYV90b19tb2QoX2RtYSkgY29udGFpbmVyX29mKChfZG1hKSwgc3RydWN0IHJzbmRfbW9kLCBkbWEpCisjZGVmaW5lIHJzbmRfbW9kX3RvX2lvKG1vZCkgKChtb2QpLT5pbykKICNkZWZpbmUgcnNuZF9tb2RfaWQobW9kKSAoKG1vZCktPmlkKQotI2RlZmluZSBmb3JfZWFjaF9yc25kX21vZChwb3MsIG4sIGlvKQlcCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJihpbyktPmhlYWQsIGxpc3QpCi0jZGVmaW5lIHJzbmRfbW9kX2NhbGwobW9kLCBmdW5jLCByZGFpLCBpbykJXAotCSghKG1vZCkgPyAtRU5PREVWIDoJCQlcCi0JICEoKG1vZCktPm9wcy0+ZnVuYykgPyAwIDoJCVwKLQkgKG1vZCktPm9wcy0+ZnVuYyhtb2QsIHJkYWksIGlvKSkKIAogdm9pZCByc25kX21vZF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCiAJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkgICBzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHMsCisJCSAgIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlLAogCQkgICBpbnQgaWQpOwogY2hhciAqcnNuZF9tb2RfbmFtZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiAKQEAgLTE2OCwxMyArMjE4LDE2IEBACiAgKi8KICNkZWZpbmUgUlNORF9EQUlfTkFNRV9TSVpFCTE2CiBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7IC8qIGhlYWQgb2YgcnNuZF9tb2QgbGlzdCAqLwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCByc25kX21vZCAqbW9kW1JTTkRfTU9EX01BWF07CisJc3RydWN0IHJzbmRfZGFpX3BhdGhfaW5mbyAqaW5mbzsgLyogcmNhcl9zbmQuaCAqLwogCWludCBieXRlX3BvczsKIAlpbnQgcGVyaW9kX3BvczsKIAlpbnQgYnl0ZV9wZXJfcGVyaW9kOwogCWludCBuZXh0X3BlcmlvZF9ieXRlOwogfTsKKyNkZWZpbmUgcnNuZF9pb190b19tb2Rfc3NpKGlvKQkoKGlvKS0+bW9kW1JTTkRfTU9EX1NTSV0pCisjZGVmaW5lIHJzbmRfaW9fdG9fbW9kX3NyYyhpbykJKChpbyktPm1vZFtSU05EX01PRF9TUkNdKQogCiBzdHJ1Y3QgcnNuZF9kYWkgewogCWNoYXIgbmFtZVtSU05EX0RBSV9OQU1FX1NJWkVdOwpAQCAtMTg5LDE2ICsyNDIsMTQgQEAKIAl1bnNpZ25lZCBpbnQgZGF0YV9hbGlnbm1lbnQ6MTsKIH07CiAKLSNkZWZpbmUgcnNuZF9kYWlfbnIocHJpdikgKChwcml2KS0+ZGFpX25yKQorI2RlZmluZSByc25kX3JkYWlfbnIocHJpdikgKChwcml2KS0+cmRhaV9ucikKICNkZWZpbmUgZm9yX2VhY2hfcnNuZF9kYWkocmRhaSwgcHJpdiwgaSkJCVwKLQlmb3IgKGkgPSAwLCAocmRhaSkgPSByc25kX2RhaV9nZXQocHJpdiwgaSk7CVwKLQkgICAgIGkgPCByc25kX2RhaV9ucihwcml2KTsJCQlcCi0JICAgICBpKyssIChyZGFpKSA9IHJzbmRfZGFpX2dldChwcml2LCBpKSkKKwlmb3IgKGkgPSAwOwkJCQkJXAorCSAgICAgKGkgPCByc25kX3JkYWlfbnIocHJpdikpICYmCQlcCisJICAgICAoKHJkYWkpID0gcnNuZF9kYWlfZ2V0KHByaXYsIGkpKTsJCVwKKwkgICAgIGkrKykKIAogc3RydWN0IHJzbmRfZGFpICpyc25kX2RhaV9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKLWludCByc25kX2RhaV9kaXNjb25uZWN0KHN0cnVjdCByc25kX21vZCAqbW9kKTsKLWludCByc25kX2RhaV9jb25uZWN0KHN0cnVjdCByc25kX2RhaSAqcmRhaSwgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogaW50IHJzbmRfZGFpX2lzX3BsYXkoc3RydWN0IHJzbmRfZGFpICpyZGFpLCBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiBpbnQgcnNuZF9kYWlfaWQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZGFpICpyZGFpKTsKICNkZWZpbmUgcnNuZF9kYWlfZ2V0X3BsYXRmb3JtX2luZm8ocmRhaSkgKChyZGFpKS0+aW5mbykKQEAgLTIwNiwyMSArMjU3LDE0IEBACiAKIHZvaWQgcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sIGludCBjbnQpOwogaW50IHJzbmRfZGFpX3BvaW50ZXJfb2Zmc2V0KHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLCBpbnQgYWRkaXRpb25hbCk7CisjZGVmaW5lIHJzbmRfZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkgKChyZGFpKS0+Y2xrX21hc3RlcikKIAogLyoKICAqCVItQ2FyIEdlbjEvR2VuMgogICovCiBpbnQgcnNuZF9nZW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwotdm9pZCByc25kX2dlbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLWludCByc25kX2dlbl9wYXRoX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKLWludCByc25kX2dlbl9wYXRoX2V4aXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKIHZvaWQgX19pb21lbSAqcnNuZF9nZW5fcmVnX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJICAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJICAgICAgIGVudW0gcnNuZF9yZWcgcmVnKTsKQEAgLTIzMywxOCArMjc3LDI4IEBACiBpbnQgcnNuZF9hZGdfc3NpX2Nsa19zdG9wKHN0cnVjdCByc25kX21vZCAqbW9kKTsKIGludCByc25kX2FkZ19zc2lfY2xrX3RyeV9zdGFydChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgdW5zaWduZWQgaW50IHJhdGUpOwogaW50IHJzbmRfYWRnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9hZGdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwotaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2NsayhzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCSAgICAgdW5zaWduZWQgaW50IHNyY19yYXRlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpOworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSk7CitpbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbywKKwkJCQkgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSk7CitpbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfdGltaW5nX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiAKIC8qCiAgKglSLUNhciBzb3VuZCBwcml2CiAgKi8KK3N0cnVjdCByc25kX29mX2RhdGEgeworCXUzMiBmbGFnczsKK307CisKIHN0cnVjdCByc25kX3ByaXYgewogCiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtMjU3LDEwICszMTEsMTAgQEAKIAl2b2lkICpnZW47CiAKIAkvKgotCSAqIGJlbG93IHZhbHVlIHdpbGwgYmUgZmlsbGVkIG9uIHJzbmRfc2N1X3Byb2JlKCkKKwkgKiBiZWxvdyB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBvbiByc25kX3NyY19wcm9iZSgpCiAJICovCi0Jdm9pZCAqc2N1OwotCWludCBzY3VfbnI7CisJdm9pZCAqc3JjOworCWludCBzcmNfbnI7CiAKIAkvKgogCSAqIGJlbG93IHZhbHVlIHdpbGwgYmUgZmlsbGVkIG9uIHJzbmRfYWRnX3Byb2JlKCkKQEAgLTI3MCw0NiArMzI0LDY0IEBACiAJLyoKIAkgKiBiZWxvdyB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBvbiByc25kX3NzaV9wcm9iZSgpCiAJICovCi0Jdm9pZCAqc3NpdTsKKwl2b2lkICpzc2k7CisJaW50IHNzaV9ucjsKIAogCS8qCiAJICogYmVsb3cgdmFsdWUgd2lsbCBiZSBmaWxsZWQgb24gcnNuZF9kYWlfcHJvYmUoKQogCSAqLwogCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaWRydjsKIAlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWk7Ci0JaW50IGRhaV9ucjsKKwlpbnQgcmRhaV9ucjsKIH07CiAKICNkZWZpbmUgcnNuZF9wcml2X3RvX2Rldihwcml2KQkoKHByaXYpLT5kZXYpCisjZGVmaW5lIHJzbmRfcHJpdl90b19pbmZvKHByaXYpCSgocHJpdiktPmluZm8pCiAjZGVmaW5lIHJzbmRfbG9jayhwcml2LCBmbGFncykgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKQogI2RlZmluZSByc25kX3VubG9jayhwcml2LCBmbGFncykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpCiAKLS8qCi0gKglSLUNhciBTQ1UKLSAqLwotaW50IHJzbmRfc2N1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9zY3VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7Ci1zdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc2N1X21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKLWJvb2wgcnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKHN0cnVjdCByc25kX21vZCAqbW9kKTsKLXVuc2lnbmVkIGludCByc25kX3NjdV9nZXRfc3NpX3JhdGUoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgcnNuZF9tb2QgKnNzaV9tb2QsCi0JCQkJICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSk7CisjZGVmaW5lIHJzbmRfaW5mb19pc19wbGF5YmFjayhwcml2LCB0eXBlKQkJCQlcCisoewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOwkJXAorCWludCBpLCBpc19wbGF5ID0gMDsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IGluZm8tPmRhaV9pbmZvX25yOyBpKyspIHsJCQlcCisJCWlmIChpbmZvLT5kYWlfaW5mb1tpXS5wbGF5YmFjay50eXBlID09ICh0eXBlKS0+aW5mbykgewlcCisJCQlpc19wbGF5ID0gMTsJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWlzX3BsYXk7CQkJCQkJCVwKK30pCiAKLSNkZWZpbmUgcnNuZF9zY3VfbnIocHJpdikgKChwcml2KS0+c2N1X25yKQorLyoKKyAqCVItQ2FyIFNSQworICovCitpbnQgcnNuZF9zcmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7CitzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3JjX21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKK3Vuc2lnbmVkIGludCByc25kX3NyY19nZXRfc3NpX3JhdGUoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbywKKwkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKTsKK2ludCByc25kX3NyY19zc2lfbW9kZV9pbml0KHN0cnVjdCByc25kX21vZCAqc3NpX21vZCwKKwkJCSAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKK2ludCByc25kX3NyY19lbmFibGVfc3NpX2lycShzdHJ1Y3QgcnNuZF9tb2QgKnNzaV9tb2QsCisJCQkgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKKworI2RlZmluZSByc25kX3NyY19ucihwcml2KSAoKHByaXYpLT5zcmNfbnIpCiAKIC8qCiAgKglSLUNhciBTU0kKICAqLwogaW50IHJzbmRfc3NpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9zc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwogc3RydWN0IHJzbmRfbW9kICpyc25kX3NzaV9tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCk7CiBzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJCQkgIGludCBkYWlfaWQsIGludCBpc19wbGF5KTsKK2ludCByc25kX3NzaV9pc19waW5fc2hhcmluZyhzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CitpbnQgcnNuZF9zc2lfaXNfcGxheShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc2N1LmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zY3UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiMDhiYi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9zY3UuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogUmVuZXNhcyBSLUNhciBTQ1Ugc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgotICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlICJyc25kLmgiCi0KLXN0cnVjdCByc25kX3NjdSB7Ci0Jc3RydWN0IHJzbmRfc2N1X3BsYXRmb3JtX2luZm8gKmluZm87IC8qIHJjYXJfc25kLmggKi8KLQlzdHJ1Y3QgcnNuZF9tb2QgbW9kOwotCXN0cnVjdCBjbGsgKmNsazsKLX07Ci0KLSNkZWZpbmUgcnNuZF9zY3VfbW9kZV9mbGFncyhwKSAoKHApLT5pbmZvLT5mbGFncykKLSNkZWZpbmUgcnNuZF9zY3VfY29udmVydF9yYXRlKHApICgocCktPmluZm8tPmNvbnZlcnRfcmF0ZSkKLQotI2RlZmluZSBSU05EX1NDVV9OQU1FX1NJWkUgMTYKLQotLyoKLSAqIEFESU5SCi0gKi8KLSNkZWZpbmUgT1RCTF8yNAkJKDAgPDwgMTYpCi0jZGVmaW5lIE9UQkxfMjIJCSgyIDw8IDE2KQotI2RlZmluZSBPVEJMXzIwCQkoNCA8PCAxNikKLSNkZWZpbmUgT1RCTF8xOAkJKDYgPDwgMTYpCi0jZGVmaW5lIE9UQkxfMTYJCSg4IDw8IDE2KQotCi0vKgotICoJCWltYWdlIG9mIFNSQyAoU2FtcGxpbmcgUmF0ZSBDb252ZXJ0ZXIpCi0gKgotICogOTZrSHogICA8LT4gKy0tLS0tKwk0OGtIegkrLS0tLS0rCSA0OGtIegkrLS0tLS0tLSsKLSAqIDQ4a0h6ICAgPC0+IHwgU1JDIHwgPC0tLS0tLT4JfCBTU0kgfAk8LS0tLS0+CXwgY29kZWMgfAotICogNDQuMWtIeiA8LT4gKy0tLS0tKwkJKy0tLS0tKwkJKy0tLS0tLS0rCi0gKiAuLi4KLSAqCi0gKi8KLQotI2RlZmluZSByc25kX21vZF90b19zY3UoX21vZCkJXAotCWNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX3NjdSwgbW9kKQotCi0jZGVmaW5lIGZvcl9lYWNoX3JzbmRfc2N1KHBvcywgcHJpdiwgaSkJCQkJCVwKLQlmb3IgKChpKSA9IDA7CQkJCQkJCVwKLQkgICAgICgoaSkgPCByc25kX3NjdV9ucihwcml2KSkgJiYJCQkJXAotCQkgICAgICgocG9zKSA9IChzdHJ1Y3QgcnNuZF9zY3UgKikocHJpdiktPnNjdSArIGkpOwlcCi0JICAgICBpKyspCi0KLS8qIEdlbjEgb25seSAqLwotc3RhdGljIGludCByc25kX3NyY19zZXRfcm91dGVfaWZfZ2VuMShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3Qgc2N1X3JvdXRlX2NvbmZpZyB7Ci0JCXUzMiBtYXNrOwotCQlpbnQgc2hpZnQ7Ci0JfSByb3V0ZXNbXSA9IHsKLQkJeyAweEYsICAwLCB9LCAvKiAwICovCi0JCXsgMHhGLCAgNCwgfSwgLyogMSAqLwotCQl7IDB4RiwgIDgsIH0sIC8qIDIgKi8KLQkJeyAweDcsIDEyLCB9LCAvKiAzICovCi0JCXsgMHg3LCAxNiwgfSwgLyogNCAqLwotCQl7IDB4NywgMjAsIH0sIC8qIDUgKi8KLQkJeyAweDcsIDI0LCB9LCAvKiA2ICovCi0JCXsgMHgzLCAyOCwgfSwgLyogNyAqLwotCQl7IDB4MywgMzAsIH0sIC8qIDggKi8KLQl9OwotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0JdTMyIG1hc2s7Ci0JdTMyIHZhbDsKLQlpbnQgc2hpZnQ7Ci0JaW50IGlkOwotCi0JLyoKLQkgKiBHZW4xIG9ubHkKLQkgKi8KLQlpZiAoIXJzbmRfaXNfZ2VuMShwcml2KSkKLQkJcmV0dXJuIDA7Ci0KLQlpZCA9IHJzbmRfbW9kX2lkKG1vZCk7Ci0JaWYgKGlkIDwgMCB8fCBpZCA+PSBBUlJBWV9TSVpFKHJvdXRlcykpCi0JCXJldHVybiAtRUlPOwotCi0JLyoKLQkgKiBTUkNfUk9VVEVfU0VMRUNUCi0JICovCi0JdmFsID0gcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykgPyAweDEgOiAweDI7Ci0JdmFsID0gdmFsCQk8PCByb3V0ZXNbaWRdLnNoaWZ0OwotCW1hc2sgPSByb3V0ZXNbaWRdLm1hc2sJPDwgcm91dGVzW2lkXS5zaGlmdDsKLQotCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfU0VMLCBtYXNrLCB2YWwpOwotCi0JLyoKLQkgKiBTUkNfVElNSU5HX1NFTEVDVAotCSAqLwotCXNoaWZ0CT0gKGlkICUgNCkgKiA4OwotCW1hc2sJPSAweDFGIDw8IHNoaWZ0OwotCi0JLyoKLQkgKiBBREcgaXMgdXNlZCBhcyBzb3VyY2UgY2xvY2sgaWYgU1JDIHdhcyB1c2VkLAotCSAqIHRoZW4sIFNTSSBXUyBpcyB1c2VkIGFzIGRlc3RpbmF0aW9uIGNsb2NrLgotCSAqIFNTSSBXUyBpcyB1c2VkIGFzIHNvdXJjZSBjbG9jayBpZiBTUkMgaXMgbm90IHVzZWQKLQkgKiAod2hlbiBwbGF5YmFjaywgc291cmNlL2Rlc3RpbmF0aW9uIGJlY29tZSByZXZlcnNlIHdoZW4gY2FwdHVyZSkKLQkgKi8KLQlpZiAocnNuZF9zY3VfY29udmVydF9yYXRlKHNjdSkpCS8qIHVzZSBBREcgKi8KLQkJdmFsID0gMDsKLQllbHNlIGlmICg4ID09IGlkKQkJLyogdXNlIFNTSSBXUywgYnV0IFNSVTggaXMgc3BlY2lhbCAqLwotCQl2YWwgPSBpZCA8PCBzaGlmdDsKLQllbHNlCQkJCS8qIHVzZSBTU0kgV1MgKi8KLQkJdmFsID0gKGlkICsgMSkgPDwgc2hpZnQ7Ci0KLQlzd2l0Y2ggKGlkIC8gNCkgewotCWNhc2UgMDoKLQkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19UTUdfU0VMMCwgbWFzaywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1RNR19TRUwxLCBtYXNrLCB2YWwpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfVE1HX1NFTDIsIG1hc2ssIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgcnNuZF9zY3VfZ2V0X3NzaV9yYXRlKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAotCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCi17Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3U7Ci0JdW5zaWduZWQgaW50IHJhdGU7Ci0KLQkvKiB0aGlzIGZ1bmN0aW9uIGlzIGFzc3VtaW5nIFNTSSBpZCA9IFNDVSBpZCBoZXJlICovCi0Jc2N1ID0gcnNuZF9tb2RfdG9fc2N1KHJzbmRfc2N1X21vZF9nZXQocHJpdiwgcnNuZF9tb2RfaWQoc3NpX21vZCkpKTsKLQotCS8qCi0JICogcmV0dXJuIGNvbnZlcnQgcmF0ZSBpZiBTUkMgaXMgdXNlZCwKLQkgKiBvdGhlcndpc2UsIHJldHVybiBydW50aW1lLT5yYXRlIGFzIHVzdWFsCi0JICovCi0JcmF0ZSA9IHJzbmRfc2N1X2NvbnZlcnRfcmF0ZShzY3UpOwotCWlmICghcmF0ZSkKLQkJcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIGludCByc25kX3NjdV9jb252ZXJ0X3JhdGVfY3RybChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NjdV9jb252ZXJ0X3JhdGUoc2N1KTsKLQl1MzIgYWRpbnIgPSBydW50aW1lLT5jaGFubmVsczsKLQotCS8qIHNldC9jbGVhciBzb2Z0IHJlc2V0ICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1dSU1IsIDApOwotCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NXUlNSLCAxKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIG9wZXJhdGlvbiBvZiB0aGUgU1JDIGludGVybmFsIGNpcmN1aXRzICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDSVIsIDEpOwotCi0JLyogU2V0IGNoYW5uZWwgbnVtYmVyIGFuZCBvdXRwdXQgYml0IGxlbmd0aCAqLwotCXN3aXRjaCAocnVudGltZS0+c2FtcGxlX2JpdHMpIHsKLQljYXNlIDE2OgotCQlhZGluciB8PSBPVEJMXzE2OwotCQlicmVhazsKLQljYXNlIDMyOgotCQlhZGluciB8PSBPVEJMXzI0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQURJTlIsIGFkaW5yKTsKLQotCWlmIChjb252ZXJ0X3JhdGUpIHsKLQkJdTMyIGZzcmF0ZSA9IDB4MDQwMDAwMCAvIGNvbnZlcnRfcmF0ZSAqIHJ1bnRpbWUtPnJhdGU7Ci0JCWludCByZXQ7Ci0KLQkJLyogRW5hYmxlIHRoZSBpbml0aWFsIHZhbHVlIG9mIElGUyAqLwotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19JRlNDUiwgMSk7Ci0KLQkJLyogU2V0IGluaXRpYWwgdmFsdWUgb2YgSUZTICovCi0JCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0lGU1ZSLCBmc3JhdGUpOwotCi0JCS8qIFNlbGVjdCBTUkMgbW9kZSAoZml4ZWQgdmFsdWUpICovCi0JCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0NSLCAweDAwMDEwMTEwKTsKLQotCQkvKiBTZXQgdGhlIHJlc3RyaWN0aW9uIHZhbHVlIG9mIHRoZSBGUyByYXRpbyAoOTglKSAqLwotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19NTkZTUiwgZnNyYXRlIC8gMTAwICogOTgpOwotCi0JCWlmIChyc25kX2lzX2dlbjEocHJpdikpIHsKLQkJCS8qIG5vIFNSQ19CRlNTUiBzZXR0aW5ncywgc2luY2UgU1JDX1NSQ0NSOjpCVUZNRCBpcyAwICovCi0JCX0KLQotCQkvKiBzZXQgY29udmVydCBjbG9jayAqLwotCQlyZXQgPSByc25kX2FkZ19zZXRfY29udmVydF9jbGsocHJpdiwgbW9kLAotCQkJCQkgICAgICAgcnVudGltZS0+cmF0ZSwKLQkJCQkJICAgICAgIGNvbnZlcnRfcmF0ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBDYW5jZWwgdGhlIGluaXRpYWxpemF0aW9uIGFuZCBvcGVyYXRlIHRoZSBTUkMgZnVuY3Rpb24gKi8KLQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNJUiwgMCk7Ci0KLQkvKiB1c2UgRE1BIHRyYW5zZmVyICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBCVVNJRl9NT0RFLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzbmRfc2N1X3RyYW5zZmVyX3N0YXJ0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkJICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0JaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKLQl1MzIgdmFsOwotCi0JaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkgewotCQl2YWwgPSAoMSA8PCBpZCk7Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfQ1RSTCwgdmFsLCB2YWwpOwotCX0KLQotCWlmIChyc25kX3NjdV9jb252ZXJ0X3JhdGUoc2N1KSkKLQkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfUk9VVEVfTU9ERTAsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNuZF9zY3VfdHJhbnNmZXJfc3RvcChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7Ci0JdTMyIG1hc2s7Ci0KLQlpZiAocnNuZF9pc19nZW4xKHByaXYpKSB7Ci0JCW1hc2sgPSAoMSA8PCBpZCk7Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfQ1RSTCwgbWFzaywgMCk7Ci0JfQotCi0JaWYgKHJzbmRfc2N1X2NvbnZlcnRfcmF0ZShzY3UpKQotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19ST1VURV9NT0RFMCwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotYm9vbCByc25kX3NjdV9ocGJpZl9pc19lbmFibGUoc3RydWN0IHJzbmRfbW9kICptb2QpCi17Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3UgPSByc25kX21vZF90b19zY3UobW9kKTsKLQl1MzIgZmxhZ3MgPSByc25kX3NjdV9tb2RlX2ZsYWdzKHNjdSk7Ci0KLQlyZXR1cm4gISEoZmxhZ3MgJiBSU05EX1NDVV9VU0VfSFBCSUYpOwotfQotCi1zdGF0aWMgaW50IHJzbmRfc2N1X3N0YXJ0KHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3UgPSByc25kX21vZF90b19zY3UobW9kKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCWludCByZXQ7Ci0KLQkvKgotCSAqIFNDVSB3aWxsIGJlIHVzZWQgaWYgaXQgaGFzIFJTTkRfU0NVX1VTRV9IUEJJRiBmbGFncwotCSAqLwotCWlmICghcnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKG1vZCkpIHsKLQkJLyogaXQgdXNlIFBJTyB0cmFuc3RlciAqLwotCQlkZXZfZGJnKGRldiwgIiVzJWQgaXMgbm90IHVzZWRcbiIsCi0JCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCi0JCXJldHVybiAwOwotCX0KLQotCWNsa19lbmFibGUoc2N1LT5jbGspOwotCi0JLyogaXQgdXNlIERNQSB0cmFuc3RlciAqLwotCi0JcmV0ID0gcnNuZF9zcmNfc2V0X3JvdXRlX2lmX2dlbjEocHJpdiwgbW9kLCByZGFpLCBpbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByc25kX3NjdV9jb252ZXJ0X3JhdGVfY3RybChwcml2LCBtb2QsIHJkYWksIGlvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJzbmRfc2N1X3RyYW5zZmVyX3N0YXJ0KHByaXYsIG1vZCwgcmRhaSwgaW8pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2RiZyhkZXYsICIlcyVkIHN0YXJ0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNuZF9zY3Vfc3RvcChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0KLQlpZiAoIXJzbmRfc2N1X2hwYmlmX2lzX2VuYWJsZShtb2QpKQotCQlyZXR1cm4gMDsKLQotCXJzbmRfc2N1X3RyYW5zZmVyX3N0b3AocHJpdiwgbW9kLCByZGFpLCBpbyk7Ci0KLQljbGtfZGlzYWJsZShzY3UtPmNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zY3Vfb3BzID0gewotCS5uYW1lCT0gInNjdSIsCi0JLnN0YXJ0CT0gcnNuZF9zY3Vfc3RhcnQsCi0JLnN0b3AJPSByc25kX3NjdV9zdG9wLAotfTsKLQotc3RydWN0IHJzbmRfbW9kICpyc25kX3NjdV9tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCkKLXsKLQlpZiAoV0FSTl9PTihpZCA8IDAgfHwgaWQgPj0gcnNuZF9zY3VfbnIocHJpdikpKQotCQlpZCA9IDA7Ci0KLQlyZXR1cm4gJigoc3RydWN0IHJzbmRfc2N1ICopKHByaXYtPnNjdSkgKyBpZCktPm1vZDsKLX0KLQotaW50IHJzbmRfc2N1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3U7Ci0Jc3RydWN0IGNsayAqY2xrOwotCWNoYXIgbmFtZVtSU05EX1NDVV9OQU1FX1NJWkVdOwotCWludCBpLCBucjsKLQotCS8qCi0JICogaW5pdCBTQ1UKLQkgKi8KLQlucgk9IGluZm8tPnNjdV9pbmZvX25yOwotCXNjdQk9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc2N1KSAqIG5yLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNjdSkgewotCQlkZXZfZXJyKGRldiwgIlNDVSBhbGxvY2F0ZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcml2LT5zY3VfbnIJPSBucjsKLQlwcml2LT5zY3UJPSBzY3U7Ci0KLQlmb3JfZWFjaF9yc25kX3NjdShzY3UsIHByaXYsIGkpIHsKLQkJc25wcmludGYobmFtZSwgUlNORF9TQ1VfTkFNRV9TSVpFLCAic2N1LiVkIiwgaSk7Ci0KLQkJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgbmFtZSk7Ci0JCWlmIChJU19FUlIoY2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKGNsayk7Ci0KLQkJcnNuZF9tb2RfaW5pdChwcml2LCAmc2N1LT5tb2QsCi0JCQkgICAgICAmcnNuZF9zY3Vfb3BzLCBpKTsKLQkJc2N1LT5pbmZvID0gJmluZm8tPnNjdV9pbmZvW2ldOwotCQlzY3UtPmNsayA9IGNsazsKLQotCQlkZXZfZGJnKGRldiwgIlNDVSVkIHByb2JlZFxuIiwgaSk7Ci0JfQotCWRldl9kYmcoZGV2LCAic2N1IHByb2JlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByc25kX3NjdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQotewotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc3JjLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMyYjdkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NoL3JjYXIvc3JjLmMKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisgKiBSZW5lc2FzIFItQ2FyIFNSQyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgInJzbmQuaCIKKworc3RydWN0IHJzbmRfc3JjIHsKKwlzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyAqaW5mbzsgLyogcmNhcl9zbmQuaCAqLworCXN0cnVjdCByc25kX21vZCBtb2Q7CisJc3RydWN0IGNsayAqY2xrOworfTsKKworI2RlZmluZSBSU05EX1NSQ19OQU1FX1NJWkUgMTYKKworLyoKKyAqIEFESU5SCisgKi8KKyNkZWZpbmUgT1RCTF8yNAkJKDAgPDwgMTYpCisjZGVmaW5lIE9UQkxfMjIJCSgyIDw8IDE2KQorI2RlZmluZSBPVEJMXzIwCQkoNCA8PCAxNikKKyNkZWZpbmUgT1RCTF8xOAkJKDYgPDwgMTYpCisjZGVmaW5lIE9UQkxfMTYJCSg4IDw8IDE2KQorCisjZGVmaW5lIHJzbmRfc3JjX21vZGVfZmxhZ3MocCkgKChwKS0+aW5mby0+ZmxhZ3MpCisjZGVmaW5lIHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShwKSAoKHApLT5pbmZvLT5jb252ZXJ0X3JhdGUpCisjZGVmaW5lIHJzbmRfbW9kX3RvX3NyYyhfbW9kKQkJCQlcCisJY29udGFpbmVyX29mKChfbW9kKSwgc3RydWN0IHJzbmRfc3JjLCBtb2QpCisjZGVmaW5lIHJzbmRfc3JjX2hwYmlmX2lzX2VuYWJsZShzcmMpCVwKKwkocnNuZF9zcmNfbW9kZV9mbGFncyhzcmMpICYgUlNORF9TQ1VfVVNFX0hQQklGKQorI2RlZmluZSByc25kX3NyY19kbWFfYXZhaWxhYmxlKHNyYykgXAorCXJzbmRfZG1hX2F2YWlsYWJsZShyc25kX21vZF90b19kbWEoJihzcmMpLT5tb2QpKQorCisjZGVmaW5lIGZvcl9lYWNoX3JzbmRfc3JjKHBvcywgcHJpdiwgaSkJCQkJXAorCWZvciAoKGkpID0gMDsJCQkJCQlcCisJICAgICAoKGkpIDwgcnNuZF9zcmNfbnIocHJpdikpICYmCQkJXAorCSAgICAgKChwb3MpID0gKHN0cnVjdCByc25kX3NyYyAqKShwcml2KS0+c3JjICsgaSk7CVwKKwkgICAgIGkrKykKKworCisvKgorICoJCWltYWdlIG9mIFNSQyAoU2FtcGxpbmcgUmF0ZSBDb252ZXJ0ZXIpCisgKgorICogOTZrSHogICA8LT4gKy0tLS0tKwk0OGtIegkrLS0tLS0rCSA0OGtIegkrLS0tLS0tLSsKKyAqIDQ4a0h6ICAgPC0+IHwgU1JDIHwgPC0tLS0tLT4JfCBTU0kgfAk8LS0tLS0+CXwgY29kZWMgfAorICogNDQuMWtIeiA8LT4gKy0tLS0tKwkJKy0tLS0tKwkJKy0tLS0tLS0rCisgKiAuLi4KKyAqCisgKi8KKworLyoKKyAqIHNyYy5jIGlzIGNhcmluZy4uLgorICoKKyAqIEdlbjEKKyAqCisgKiBbbWVtXSAtPiBbU1JVXSAtPiBbU1NJXQorICogICAgICAgIHwtLS0tLS0tLXwKKyAqCisgKiBHZW4yCisgKgorICogW21lbV0gLT4gW1NSQ10gLT4gW1NTSVVdIC0+IFtTU0ldCisgKiAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfAorICovCisKKy8qCisgKglIb3cgdG8gdXNlIFNSQyBieXBhc3MgbW9kZSBmb3IgZGVidWdnaW5nCisgKgorICogU1JDIGhhcyBieXBhc3MgbW9kZSwgYW5kIGl0IGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgorICogSW4gR2VuMiBjYXNlLAorICogU1JDbV9NT0RFIGNvbnRyb2xzIHdoZXRoZXIgU1JDIGlzIHVzZWQgb3Igbm90CisgKiBTU0lfTU9ERTAgY29udHJvbHMgd2hldGhlciBTU0lVIHdoaWNoIHJlY2VpdmVzIFNSQyBkYXRhCisgKiBpcyB1c2VkIG9yIG5vdC4KKyAqIEJvdGggU1JDbV9NT0RFL1NTSV9NT0RFMCBzZXR0aW5ncyBhcmUgbmVlZGVkIGlmIHlvdSB1c2UgU1JDLAorICogYnV0IFNSQyBieXBhc3MgbW9kZSBuZWVkcyBTU0lfTU9ERTAgb25seS4KKyAqCisgKiBUaGlzIGRyaXZlciByZXF1ZXN0CisgKiBzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyB7CisgKgl1MzIgZmxhZ3M7CisgKgl1MzIgY29udmVydF9yYXRlOworICogfQorICoKKyAqIHJzbmRfc3JjX2hwYmlmX2lzX2VuYWJsZSgpIHdpbGwgYmUgdHJ1ZQorICogaWYgZmxhZ3MgaGFkIFJTTkRfU1JDX1VTRV9IUEJJRiwKKyAqIGFuZCBpdCBjb250cm9scyB3aGV0aGVyIFNTSVUgaXMgdXNlZCBvciBub3QuCisgKgorICogcnNuZF9zcmNfY29udmVydF9yYXRlKCkgaW5kaWNhdGVzCisgKiBhYm92ZSBjb252ZXJ0X3JhdGUsIGFuZCBpdCBjb250cm9scworICogd2hldGhlciBTUkMgaXMgdXNlZCBvciBub3QuCisgKgorICogZXgpIGRvZXNuJ3QgdXNlIFNSQworICogc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gaW5mbyA9IHsKKyAqCS5mbGFncyA9IDAsCisgKgkuY29udmVydF9yYXRlID0gMCwKKyAqIH07CisgKgorICogZXgpIHVzZXMgU1JDCisgKiBzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyBpbmZvID0geworICoJLmZsYWdzID0gUlNORF9TUkNfVVNFX0hQQklGLAorICoJLmNvbnZlcnRfcmF0ZSA9IDQ4MDAwLAorICogfTsKKyAqCisgKiBleCkgdXNlcyBTUkMgYnlwYXNzIG1vZGUKKyAqIHN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvIGluZm8gPSB7CisgKgkuZmxhZ3MgPSBSU05EX1NSQ19VU0VfSFBCSUYsCisgKgkuY29udmVydF9yYXRlID0gMCwKKyAqIH07CisgKgorICovCisKKy8qCisgKgkJR2VuMS9HZW4yIGNvbW1vbiBmdW5jdGlvbnMKKyAqLworaW50IHJzbmRfc3JjX3NzaV9tb2RlX2luaXQoc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAorCQkJICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYoc3NpX21vZCk7CisJc3RydWN0IHJzbmRfbW9kICpzcmNfbW9kID0gcnNuZF9pb190b19tb2Rfc3JjKGlvKTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCWludCBzc2lfaWQgPSByc25kX21vZF9pZChzc2lfbW9kKTsKKwlpbnQgaGFzX3NyYyA9IDA7CisKKwkvKgorCSAqIFNTSV9NT0RFMAorCSAqLworCWlmIChpbmZvLT5kYWlfaW5mbykgeworCQloYXNfc3JjID0gISFzcmNfbW9kOworCX0gZWxzZSB7CisJCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKHNyY19tb2QpOworCQloYXNfc3JjID0gcnNuZF9zcmNfaHBiaWZfaXNfZW5hYmxlKHNyYyk7CisJfQorCisJcnNuZF9tb2RfYnNldChzc2lfbW9kLCBTU0lfTU9ERTAsICgxIDw8IHNzaV9pZCksCisJCSAgICAgIGhhc19zcmMgPyAwIDogKDEgPDwgc3NpX2lkKSk7CisKKwkvKgorCSAqIFNTSV9NT0RFMQorCSAqLworCWlmIChyc25kX3NzaV9pc19waW5fc2hhcmluZyhzc2lfbW9kKSkgeworCQlpbnQgc2hpZnQgPSAtMTsKKwkJc3dpdGNoIChzc2lfaWQpIHsKKwkJY2FzZSAxOgorCQkJc2hpZnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXNoaWZ0ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlzaGlmdCA9IDE2OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2hpZnQgPj0gMCkKKwkJCXJzbmRfbW9kX2JzZXQoc3NpX21vZCwgU1NJX01PREUxLAorCQkJCSAgICAgIDB4MyA8PCBzaGlmdCwKKwkJCQkgICAgICByc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpID8KKwkJCQkgICAgICAweDIgPDwgc2hpZnQgOiAweDEgPDwgc2hpZnQpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnNuZF9zcmNfZW5hYmxlX3NzaV9pcnEoc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAorCQkJICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihzc2lfbW9kKTsKKworCS8qIGVuYWJsZSBQSU8gaW50ZXJydXB0IGlmIEdlbjIgKi8KKwlpZiAocnNuZF9pc19nZW4yKHByaXYpKQorCQlyc25kX21vZF93cml0ZShzc2lfbW9kLCBJTlRfRU5BQkxFLCAweDBmMDAwMDAwKTsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgcnNuZF9zcmNfZ2V0X3NzaV9yYXRlKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKnNyY19tb2QgPSByc25kX2lvX3RvX21vZF9zcmMoaW8pOworCXN0cnVjdCByc25kX3NyYyAqc3JjOworCXVuc2lnbmVkIGludCByYXRlID0gMDsKKworCWlmIChzcmNfbW9kKSB7CisJCXNyYyA9IHJzbmRfbW9kX3RvX3NyYyhzcmNfbW9kKTsKKworCQkvKgorCQkgKiByZXR1cm4gY29udmVydCByYXRlIGlmIFNSQyBpcyB1c2VkLAorCQkgKiBvdGhlcndpc2UsIHJldHVybiBydW50aW1lLT5yYXRlIGFzIHVzdWFsCisJCSAqLworCQlyYXRlID0gcnNuZF9zcmNfY29udmVydF9yYXRlKHNyYyk7CisJfQorCisJaWYgKCFyYXRlKQorCQlyYXRlID0gcnVudGltZS0+cmF0ZTsKKworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKTsKKwl1MzIgYWRpbnIgPSBydW50aW1lLT5jaGFubmVsczsKKwl1MzIgZnNyYXRlID0gMDsKKworCWlmIChjb252ZXJ0X3JhdGUpCisJCWZzcmF0ZSA9IDB4MDQwMDAwMCAvIGNvbnZlcnRfcmF0ZSAqIHJ1bnRpbWUtPnJhdGU7CisKKwkvKiBzZXQvY2xlYXIgc29mdCByZXNldCAqLworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NXUlNSLCAwKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TV1JTUiwgMSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIG9wZXJhdGlvbiBvZiB0aGUgU1JDIGludGVybmFsIGNpcmN1aXRzCisJICogc2VlIHJzbmRfc3JjX3N0YXJ0KCkKKwkgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNJUiwgMSk7CisKKwkvKiBTZXQgY2hhbm5lbCBudW1iZXIgYW5kIG91dHB1dCBiaXQgbGVuZ3RoICovCisJc3dpdGNoIChydW50aW1lLT5zYW1wbGVfYml0cykgeworCWNhc2UgMTY6CisJCWFkaW5yIHw9IE9UQkxfMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWFkaW5yIHw9IE9UQkxfMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlPOworCX0KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19BRElOUiwgYWRpbnIpOworCisJLyogRW5hYmxlIHRoZSBpbml0aWFsIHZhbHVlIG9mIElGUyAqLworCWlmIChmc3JhdGUpIHsKKwkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfSUZTQ1IsIDEpOworCisJCS8qIFNldCBpbml0aWFsIHZhbHVlIG9mIElGUyAqLworCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19JRlNWUiwgZnNyYXRlKTsKKwl9CisKKwkvKiB1c2UgRE1BIHRyYW5zZmVyICovCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQlVTSUZfTU9ERSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19pbml0KHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCisJY2xrX2VuYWJsZShzcmMtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19xdWl0KHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCisJY2xrX2Rpc2FibGUoc3JjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RhcnQoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCS8qCisJICogQ2FuY2VsIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgb3BlcmF0ZSB0aGUgU1JDIGZ1bmN0aW9uCisJICogc2VlIHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUoKQorCSAqLworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0lSLCAwKTsKKworCWlmIChyc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKSkKKwkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfUk9VVEVfTU9ERTAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByc25kX3NyY19zdG9wKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCisJaWYgKHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShzcmMpKQorCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19ST1VURV9NT0RFMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zcmNfbm9uX29wcyA9IHsKKwkubmFtZQk9ICJzcmMgKG5vbikiLAorfTsKKworLyoKKyAqCQlHZW4xIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9yb3V0ZV9nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3Qgc3JjX3JvdXRlX2NvbmZpZyB7CisJCXUzMiBtYXNrOworCQlpbnQgc2hpZnQ7CisJfSByb3V0ZXNbXSA9IHsKKwkJeyAweEYsICAwLCB9LCAvKiAwICovCisJCXsgMHhGLCAgNCwgfSwgLyogMSAqLworCQl7IDB4RiwgIDgsIH0sIC8qIDIgKi8KKwkJeyAweDcsIDEyLCB9LCAvKiAzICovCisJCXsgMHg3LCAxNiwgfSwgLyogNCAqLworCQl7IDB4NywgMjAsIH0sIC8qIDUgKi8KKwkJeyAweDcsIDI0LCB9LCAvKiA2ICovCisJCXsgMHgzLCAyOCwgfSwgLyogNyAqLworCQl7IDB4MywgMzAsIH0sIC8qIDggKi8KKwl9OworCXUzMiBtYXNrOworCXUzMiB2YWw7CisJaW50IGlkOworCisJaWQgPSByc25kX21vZF9pZChtb2QpOworCWlmIChpZCA8IDAgfHwgaWQgPj0gQVJSQVlfU0laRShyb3V0ZXMpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qCisJICogU1JDX1JPVVRFX1NFTEVDVAorCSAqLworCXZhbCA9IHJzbmRfZGFpX2lzX3BsYXkocmRhaSwgaW8pID8gMHgxIDogMHgyOworCXZhbCA9IHZhbAkJPDwgcm91dGVzW2lkXS5zaGlmdDsKKwltYXNrID0gcm91dGVzW2lkXS5tYXNrCTw8IHJvdXRlc1tpZF0uc2hpZnQ7CisKKwlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX1NFTCwgbWFzaywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3RpbWluZ19nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCQkgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKTsKKwl1MzIgbWFzazsKKwl1MzIgdmFsOworCWludCBzaGlmdDsKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCWludCByZXQ7CisKKwkvKgorCSAqIFNSQ19USU1JTkdfU0VMRUNUCisJICovCisJc2hpZnQJPSAoaWQgJSA0KSAqIDg7CisJbWFzawk9IDB4MUYgPDwgc2hpZnQ7CisKKwkvKgorCSAqIEFERyBpcyB1c2VkIGFzIHNvdXJjZSBjbG9jayBpZiBTUkMgd2FzIHVzZWQsCisJICogdGhlbiwgU1NJIFdTIGlzIHVzZWQgYXMgZGVzdGluYXRpb24gY2xvY2suCisJICogU1NJIFdTIGlzIHVzZWQgYXMgc291cmNlIGNsb2NrIGlmIFNSQyBpcyBub3QgdXNlZAorCSAqICh3aGVuIHBsYXliYWNrLCBzb3VyY2UvZGVzdGluYXRpb24gYmVjb21lIHJldmVyc2Ugd2hlbiBjYXB0dXJlKQorCSAqLworCXJldCA9IDA7CisJaWYgKGNvbnZlcnRfcmF0ZSkgeworCQkvKiB1c2UgQURHICovCisJCXZhbCA9IDA7CisJCXJldCA9IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHByaXYsIG1vZCwKKwkJCQkJCSAgICBydW50aW1lLT5yYXRlLAorCQkJCQkJICAgIGNvbnZlcnRfcmF0ZSk7CisJfSBlbHNlIGlmICg4ID09IGlkKSB7CisJCS8qIHVzZSBTU0kgV1MsIGJ1dCBTUlU4IGlzIHNwZWNpYWwgKi8KKwkJdmFsID0gaWQgPDwgc2hpZnQ7CisJfSBlbHNlIHsKKwkJLyogdXNlIFNTSSBXUyAqLworCQl2YWwgPSAoaWQgKyAxKSA8PCBzaGlmdDsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoaWQgLyA0KSB7CisJY2FzZSAwOgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1RNR19TRUwwLCBtYXNrLCB2YWwpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfVE1HX1NFTDEsIG1hc2ssIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19UTUdfU0VMMiwgbWFzaywgdmFsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc2V0X2NvbnZlcnRfcmF0ZV9nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnNuZF9zcmNfc2V0X2NvbnZlcnRfcmF0ZShtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNlbGVjdCBTUkMgbW9kZSAoZml4ZWQgdmFsdWUpICovCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDQ1IsIDB4MDAwMTAxMTApOworCisJLyogU2V0IHRoZSByZXN0cmljdGlvbiB2YWx1ZSBvZiB0aGUgRlMgcmF0aW8gKDk4JSkgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19NTkZTUiwKKwkJICAgICAgIHJzbmRfbW9kX3JlYWQobW9kLCBTUkNfSUZTVlIpIC8gMTAwICogOTgpOworCisJLyogbm8gU1JDX0JGU1NSIHNldHRpbmdzLCBzaW5jZSBTUkNfU1JDQ1I6OkJVRk1EIGlzIDAgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX2luaXRfZ2VuMShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCWludCByZXQ7CisKKwlyZXQgPSByc25kX3NyY19pbml0KG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnNuZF9zcmNfc2V0X3JvdXRlX2dlbjEobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF9yYXRlX2dlbjEobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF90aW1pbmdfZ2VuMShtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3N0YXJ0X2dlbjEoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7CisKKwlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX0NUUkwsICgxIDw8IGlkKSwgKDEgPDwgaWQpKTsKKworCXJldHVybiByc25kX3NyY19zdGFydChtb2QsIHJkYWksIGlvKTsKK30KKworc3RhdGljIGludCByc25kX3NyY19zdG9wX2dlbjEoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCisJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19ST1VURV9DVFJMLCAoMSA8PCBpZCksIDApOworCisJcmV0dXJuIHJzbmRfc3JjX3N0b3AobW9kLCByZGFpLCBpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3JjX2dlbjFfb3BzID0geworCS5uYW1lCT0gInNydSAoZ2VuMSkiLAorCS5pbml0CT0gcnNuZF9zcmNfaW5pdF9nZW4xLAorCS5xdWl0CT0gcnNuZF9zcmNfcXVpdCwKKwkuc3RhcnQJPSByc25kX3NyY19zdGFydF9nZW4xLAorCS5zdG9wCT0gcnNuZF9zcmNfc3RvcF9nZW4xLAorfTsKKworLyoKKyAqCQlHZW4yIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGVfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJaW50IHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyc25kX21vZF93cml0ZShtb2QsIFNTSV9CVVNJRl9BRElOUiwgcnNuZF9tb2RfcmVhZChtb2QsIFNSQ19BRElOUikpOworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJX0JVU0lGX01PREUsICByc25kX21vZF9yZWFkKG1vZCwgU1JDX0JVU0lGX01PREUpKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0NSLCAweDAwMDExMTEwKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0JTRFNSLCAweDAxODAwMDAwKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19CU0lTUiwgMHgwMDEwMDA2MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19zZXRfY29udmVydF90aW1pbmdfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkJICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisJdTMyIGNvbnZlcnRfcmF0ZSA9IHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShzcmMpOworCWludCByZXQ7CisKKwlpZiAoY29udmVydF9yYXRlKQorCQlyZXQgPSByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMihtb2QsIHJkYWksIGlvLAorCQkJCQkJICAgIHJ1bnRpbWUtPnJhdGUsCisJCQkJCQkgICAgY29udmVydF9yYXRlKTsKKwllbHNlCisJCXJldCA9IHJzbmRfYWRnX3NldF9jb252ZXJ0X3RpbWluZ19nZW4yKG1vZCwgcmRhaSwgaW8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc25kX3NyY19wcm9iZV9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKnNzaSA9IHJzbmRfc3NpX21vZF9nZXQocHJpdiwgcnNuZF9tb2RfaWQobW9kKSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlpbnQgcmV0OworCWludCBpc19wbGF5OworCisJaWYgKGluZm8tPmRhaV9pbmZvKQorCQlpc19wbGF5ID0gcnNuZF9pbmZvX2lzX3BsYXliYWNrKHByaXYsIHNyYyk7CisJZWxzZQorCQlpc19wbGF5ID0gcnNuZF9zc2lfaXNfcGxheShzc2kpOworCisJcmV0ID0gcnNuZF9kbWFfaW5pdChwcml2LAorCQkJICAgIHJzbmRfbW9kX3RvX2RtYShtb2QpLAorCQkJICAgIGlzX3BsYXksCisJCQkgICAgc3JjLT5pbmZvLT5kbWFfaWQpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRldiwgIlNSQyBETUEgZmFpbGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfcmVtb3ZlX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXJzbmRfZG1hX3F1aXQocnNuZF9tb2RfdG9fcHJpdihtb2QpLCByc25kX21vZF90b19kbWEobW9kKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19pbml0X2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnNuZF9zcmNfaW5pdChtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGVfZ2VuMihtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3RpbWluZ19nZW4yKG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RhcnRfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCXJzbmRfZG1hX3N0YXJ0KHJzbmRfbW9kX3RvX2RtYSgmc3JjLT5tb2QpKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJX0NUUkwsIDB4MSk7CisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQ1RSTCwgMHgxMSk7CisKKwlyZXR1cm4gcnNuZF9zcmNfc3RhcnQobW9kLCByZGFpLCBpbyk7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RvcF9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJX0NUUkwsIDApOworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0NUUkwsIDApOworCisJcnNuZF9kbWFfc3RvcChyc25kX21vZF90b19kbWEoJnNyYy0+bW9kKSk7CisKKwlyZXR1cm4gcnNuZF9zcmNfc3RvcChtb2QsIHJkYWksIGlvKTsKK30KKworc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zcmNfZ2VuMl9vcHMgPSB7CisJLm5hbWUJPSAic3JjIChnZW4yKSIsCisJLnByb2JlCT0gcnNuZF9zcmNfcHJvYmVfZ2VuMiwKKwkucmVtb3ZlCT0gcnNuZF9zcmNfcmVtb3ZlX2dlbjIsCisJLmluaXQJPSByc25kX3NyY19pbml0X2dlbjIsCisJLnF1aXQJPSByc25kX3NyY19xdWl0LAorCS5zdGFydAk9IHJzbmRfc3JjX3N0YXJ0X2dlbjIsCisJLnN0b3AJPSByc25kX3NyY19zdG9wX2dlbjIsCit9OworCitzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3JjX21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKQoreworCWlmIChXQVJOX09OKGlkIDwgMCB8fCBpZCA+PSByc25kX3NyY19ucihwcml2KSkpCisJCWlkID0gMDsKKworCXJldHVybiAmKChzdHJ1Y3QgcnNuZF9zcmMgKikocHJpdi0+c3JjKSArIGlkKS0+bW9kOworfQorCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX3NyYyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzcmNfbm9kZTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvICpzcmNfaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBucjsKKworCWlmICghb2ZfZGF0YSkKKwkJcmV0dXJuOworCisJc3JjX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNyYyIpOworCWlmICghc3JjX25vZGUpCisJCXJldHVybjsKKworCW5yID0gb2ZfZ2V0X2NoaWxkX2NvdW50KHNyY19ub2RlKTsKKwlpZiAoIW5yKQorCQlyZXR1cm47CisKKwlzcmNfaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvKSAqIG5yLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghc3JjX2luZm8pIHsKKwkJZGV2X2VycihkZXYsICJzcmMgaW5mbyBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8tPnNyY19pbmZvCQk9IHNyY19pbmZvOworCWluZm8tPnNyY19pbmZvX25yCT0gbnI7Cit9CisKK2ludCByc25kX3NyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQoreworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYzsKKwlzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHM7CisJc3RydWN0IGNsayAqY2xrOworCWNoYXIgbmFtZVtSU05EX1NSQ19OQU1FX1NJWkVdOworCWludCBpLCBucjsKKworCXJzbmRfb2ZfcGFyc2Vfc3JjKHBkZXYsIG9mX2RhdGEsIHByaXYpOworCisJLyoKKwkgKiBpbml0IFNSQworCSAqLworCW5yCT0gaW5mby0+c3JjX2luZm9fbnI7CisJaWYgKCFucikKKwkJcmV0dXJuIDA7CisKKwlzcmMJPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNyYykgKiBuciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcmMpIHsKKwkJZGV2X2VycihkZXYsICJTUkMgYWxsb2NhdGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdi0+c3JjX25yCT0gbnI7CisJcHJpdi0+c3JjCT0gc3JjOworCisJZm9yX2VhY2hfcnNuZF9zcmMoc3JjLCBwcml2LCBpKSB7CisJCXNucHJpbnRmKG5hbWUsIFJTTkRfU1JDX05BTUVfU0laRSwgInNyYy4lZCIsIGkpOworCisJCWNsayA9IGRldm1fY2xrX2dldChkZXYsIG5hbWUpOworCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJCXNucHJpbnRmKG5hbWUsIFJTTkRfU1JDX05BTUVfU0laRSwgInNjdS4lZCIsIGkpOworCQkJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgbmFtZSk7CisJCX0KKworCQlpZiAoSVNfRVJSKGNsaykpCisJCQlyZXR1cm4gUFRSX0VSUihjbGspOworCisJCXNyYy0+aW5mbyA9ICZpbmZvLT5zcmNfaW5mb1tpXTsKKwkJc3JjLT5jbGsgPSBjbGs7CisKKwkJb3BzID0gJnJzbmRfc3JjX25vbl9vcHM7CisJCWlmIChyc25kX3NyY19ocGJpZl9pc19lbmFibGUoc3JjKSkgeworCQkJaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkKKwkJCQlvcHMgPSAmcnNuZF9zcmNfZ2VuMV9vcHM7CisJCQlpZiAocnNuZF9pc19nZW4yKHByaXYpKQorCQkJCW9wcyA9ICZyc25kX3NyY19nZW4yX29wczsKKwkJfQorCisJCXJzbmRfbW9kX2luaXQocHJpdiwgJnNyYy0+bW9kLCBvcHMsIFJTTkRfTU9EX1NSQywgaSk7CisKKwkJZGV2X2RiZyhkZXYsICJTUkMlZCBwcm9iZWRcbiIsIGkpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc3NpLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYwppbmRleCA0YjhjZjdjLi40YjdlMjA2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYwpAQCAtNjQsMTA4ICs2NCwyOSBAQAogCXN0cnVjdCByc25kX21vZCBtb2Q7CiAKIAlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW87CiAJdTMyIGNyX293bjsKIAl1MzIgY3JfY2xrOwogCXUzMiBjcl9ldGM7CiAJaW50IGVycjsKLQlpbnQgZG1hX29mZnNldDsKIAl1bnNpZ25lZCBpbnQgdXNyY250OwogCXVuc2lnbmVkIGludCByYXRlOwogfTsKIAotc3RydWN0IHJzbmRfc3NpdSB7Ci0JdTMyIHNzaV9tb2RlMDsKLQl1MzIgc3NpX21vZGUxOwotCi0JaW50IHNzaV9ucjsKLQlzdHJ1Y3QgcnNuZF9zc2kgKnNzaTsKLX07Ci0KICNkZWZpbmUgZm9yX2VhY2hfcnNuZF9zc2kocG9zLCBwcml2LCBpKQkJCQkJXAogCWZvciAoaSA9IDA7CQkJCQkJCVwKIAkgICAgIChpIDwgcnNuZF9zc2lfbnIocHJpdikpICYmCQkJCQlcCi0JCSgocG9zKSA9ICgoc3RydWN0IHJzbmRfc3NpdSAqKSgocHJpdiktPnNzaXUpKS0+c3NpICsgaSk7IFwKKwkJKChwb3MpID0gKChzdHJ1Y3QgcnNuZF9zc2kgKikocHJpdiktPnNzaSArIGkpKTsJCVwKIAkgICAgIGkrKykKIAotI2RlZmluZSByc25kX3NzaV9ucihwcml2KSAoKChzdHJ1Y3QgcnNuZF9zc2l1ICopKChwcml2KS0+c3NpdSkpLT5zc2lfbnIpCisjZGVmaW5lIHJzbmRfc3NpX25yKHByaXYpICgocHJpdiktPnNzaV9ucikKICNkZWZpbmUgcnNuZF9tb2RfdG9fc3NpKF9tb2QpIGNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX3NzaSwgbW9kKQogI2RlZmluZSByc25kX2RtYV90b19zc2koZG1hKSAgcnNuZF9tb2RfdG9fc3NpKHJzbmRfZG1hX3RvX21vZChkbWEpKQogI2RlZmluZSByc25kX3NzaV9waW9fYXZhaWxhYmxlKHNzaSkgKChzc2kpLT5pbmZvLT5waW9faXJxID4gMCkKICNkZWZpbmUgcnNuZF9zc2lfZG1hX2F2YWlsYWJsZShzc2kpIFwKIAlyc25kX2RtYV9hdmFpbGFibGUocnNuZF9tb2RfdG9fZG1hKCYoc3NpKS0+bW9kKSkKICNkZWZpbmUgcnNuZF9zc2lfY2xrX2Zyb21fcGFyZW50KHNzaSkgKChzc2kpLT5wYXJlbnQpCi0jZGVmaW5lIHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpICgocmRhaSktPmNsa19tYXN0ZXIpCiAjZGVmaW5lIHJzbmRfc3NpX21vZGVfZmxhZ3MocCkgKChwKS0+aW5mby0+ZmxhZ3MpCiAjZGVmaW5lIHJzbmRfc3NpX2RhaV9pZChzc2kpICgoc3NpKS0+aW5mby0+ZGFpX2lkKQotI2RlZmluZSByc25kX3NzaV90b19zc2l1KHNzaSlcCi0JKCgoc3RydWN0IHJzbmRfc3NpdSAqKSgoc3NpKSAtIHJzbmRfbW9kX2lkKCYoc3NpKS0+bW9kKSkpIC0gMSkKLQotc3RhdGljIHZvaWQgcnNuZF9zc2lfbW9kZV9zZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJCSAgICAgIHN0cnVjdCByc25kX3NzaSAqc3NpKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHJzbmRfbW9kICpzY3U7Ci0Jc3RydWN0IHJzbmRfc3NpdSAqc3NpdSA9IHJzbmRfc3NpX3RvX3NzaXUoc3NpKTsKLQlpbnQgaWQgPSByc25kX21vZF9pZCgmc3NpLT5tb2QpOwotCXUzMiBmbGFnczsKLQl1MzIgdmFsOwotCi0Jc2N1ICAgPSByc25kX3NjdV9tb2RfZ2V0KHByaXYsIHJzbmRfbW9kX2lkKCZzc2ktPm1vZCkpOwotCi0JLyoKLQkgKiBTU0lfTU9ERTAKLQkgKi8KLQotCS8qIHNlZSBhbHNvIEJVU0lGX01PREUgKi8KLQlpZiAocnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKHNjdSkpIHsKLQkJc3NpdS0+c3NpX21vZGUwICY9IH4oMSA8PCBpZCk7Ci0JCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlcyBERVBFTkRFTlQgbW9kZVxuIiwgaWQpOwotCX0gZWxzZSB7Ci0JCXNzaXUtPnNzaV9tb2RlMCB8PSAoMSA8PCBpZCk7Ci0JCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlcyBJTkRFUEVOREVOVCBtb2RlXG4iLCBpZCk7Ci0JfQotCi0JLyoKLQkgKiBTU0lfTU9ERTEKLQkgKi8KLSNkZWZpbmUgc3NpX3BhcmVudF9zZXQocCwgc3luYywgYWRnLCBleHQpCQlcCi0JZG8gewkJCQkJCVwKLQkJc3NpLT5wYXJlbnQgPSBzc2l1LT5zc2kgKyBwOwkJXAotCQlpZiAocnNuZF9yZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkpCVwKLQkJCXZhbCA9IGFkZzsJCQlcCi0JCWVsc2UJCQkJCVwKLQkJCXZhbCA9IGV4dDsJCQlcCi0JCWlmIChmbGFncyAmIFJTTkRfU1NJX1NZTkMpCQlcCi0JCQl2YWwgfD0gc3luYzsJCQlcCi0JfSB3aGlsZSAoMCkKLQotCWZsYWdzID0gcnNuZF9zc2lfbW9kZV9mbGFncyhzc2kpOwotCWlmIChmbGFncyAmIFJTTkRfU1NJX0NMS19QSU5fU0hBUkUpIHsKLQotCQl2YWwgPSAwOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgMToKLQkJCXNzaV9wYXJlbnRfc2V0KDAsICgxIDw8IDQpLCAoMHgyIDw8IDApLCAoMHgxIDw8IDApKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlzc2lfcGFyZW50X3NldCgwLCAoMSA8PCA0KSwgKDB4MiA8PCAyKSwgKDB4MSA8PCAyKSk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJc3NpX3BhcmVudF9zZXQoMywgKDEgPDwgMjApLCAoMHgyIDw8IDE2KSwgKDB4MSA8PCAxNikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCXNzaV9wYXJlbnRfc2V0KDcsIDAsIDAsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzc2l1LT5zc2lfbW9kZTEgfD0gdmFsOwotCX0KLQotCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJX01PREUwLCBzc2l1LT5zc2lfbW9kZTApOwotCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJX01PREUxLCBzc2l1LT5zc2lfbW9kZTEpOwotfQogCiBzdGF0aWMgdm9pZCByc25kX3NzaV9zdGF0dXNfY2hlY2soc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCQkJICB1MzIgYml0KQpAQCAtMjAwLDcgKzEyMSw3IEBACiAJCTEsIDIsIDQsIDgsIDE2LCA2LCAxMiwKIAl9OwogCXVuc2lnbmVkIGludCBtYWluX3JhdGU7Ci0JdW5zaWduZWQgaW50IHJhdGUgPSByc25kX3NjdV9nZXRfc3NpX3JhdGUocHJpdiwgJnNzaS0+bW9kLCBydW50aW1lKTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHJzbmRfc3JjX2dldF9zc2lfcmF0ZShwcml2LCBpbywgcnVudGltZSk7CiAKIAkvKgogCSAqIEZpbmQgYmVzdCBjbG9jaywgYW5kIHRyeSB0byBzdGFydCBBREcKQEAgLTI1Miw3ICsxNzMsNyBAQAogCWlmICgwID09IHNzaS0+dXNyY250KSB7CiAJCWNsa19lbmFibGUoc3NpLT5jbGspOwogCi0JCWlmIChyc25kX3JkYWlfaXNfY2xrX21hc3RlcihyZGFpKSkgeworCQlpZiAocnNuZF9kYWlfaXNfY2xrX21hc3RlcihyZGFpKSkgewogCQkJaWYgKHJzbmRfc3NpX2Nsa19mcm9tX3BhcmVudChzc2kpKQogCQkJCXJzbmRfc3NpX2h3X3N0YXJ0KHNzaS0+cGFyZW50LCByZGFpLCBpbyk7CiAJCQllbHNlCkBAIC0zMDIsNyArMjIzLDcgQEAKIAkJcnNuZF9tb2Rfd3JpdGUoJnNzaS0+bW9kLCBTU0lDUiwgY3IpOwkvKiBkaXNhYmxlZCBhbGwgKi8KIAkJcnNuZF9zc2lfc3RhdHVzX2NoZWNrKCZzc2ktPm1vZCwgSUlSUSk7CiAKLQkJaWYgKHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpKSB7CisJCWlmIChyc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpKSB7CiAJCQlpZiAocnNuZF9zc2lfY2xrX2Zyb21fcGFyZW50KHNzaSkpCiAJCQkJcnNuZF9zc2lfaHdfc3RvcChzc2ktPnBhcmVudCwgcmRhaSk7CiAJCQllbHNlCkBAIC0zMjMsOCArMjQ0LDYgQEAKIAkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKIAl1MzIgY3I7CiAKQEAgLTM2NSwxMyArMjg0LDEwIEBACiAJICogc2V0IHNzaSBwYXJhbWV0ZXIKIAkgKi8KIAlzc2ktPnJkYWkJPSByZGFpOwotCXNzaS0+aW8JCT0gaW87CiAJc3NpLT5jcl9vd24JPSBjcjsKIAlzc2ktPmVycgk9IC0xOyAvKiBpZ25vcmUgMXN0IGVycm9yICovCiAKLQlyc25kX3NzaV9tb2RlX3NldChwcml2LCByZGFpLCBzc2kpOwotCi0JZGV2X2RiZyhkZXYsICIlcy4lZCBpbml0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOworCXJzbmRfc3JjX3NzaV9tb2RlX2luaXQobW9kLCByZGFpLCBpbyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4NCwxMyArMzAwLDEwIEBACiAJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCi0JZGV2X2RiZyhkZXYsICIlcy4lZCBxdWl0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCiAJaWYgKHNzaS0+ZXJyID4gMCkKIAkJZGV2X3dhcm4oZGV2LCAic3NpIHVuZGVyL292ZXIgZmxvdyBlcnIgPSAlZFxuIiwgc3NpLT5lcnIpOwogCiAJc3NpLT5yZGFpCT0gTlVMTDsKLQlzc2ktPmlvCQk9IE5VTEw7CiAJc3NpLT5jcl9vd24JPSAwOwogCXNzaS0+ZXJyCT0gMDsKIApAQCAtNDE0LDggKzMyNyw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgcnNuZF9zc2lfcGlvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCByc25kX3NzaSAqc3NpID0gZGF0YTsKLQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHNzaS0+aW87Ci0JdTMyIHN0YXR1cyA9IHJzbmRfbW9kX3JlYWQoJnNzaS0+bW9kLCBTU0lTUik7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSAmc3NpLT5tb2Q7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXUzMiBzdGF0dXMgPSByc25kX21vZF9yZWFkKG1vZCwgU1NJU1IpOwogCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwogCiAJaWYgKGlvICYmIChzdGF0dXMgJiBESVJRKSkgewpAQCAtNDMyLDkgKzM0Niw5IEBACiAJCSAqIHNlZSByc25kX3NzaV9pbml0KCkKIAkJICovCiAJCWlmIChyc25kX2RhaV9pc19wbGF5KHJkYWksIGlvKSkKLQkJCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJVERSLCAqYnVmKTsKKwkJCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJVERSLCAqYnVmKTsKIAkJZWxzZQotCQkJKmJ1ZiA9IHJzbmRfbW9kX3JlYWQoJnNzaS0+bW9kLCBTU0lSRFIpOworCQkJKmJ1ZiA9IHJzbmRfbW9kX3JlYWQobW9kLCBTU0lSRFIpOwogCiAJCXJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKGlvLCBzaXplb2YoKmJ1ZikpOwogCkBAIC00NDQsMjUgKzM1OCwzOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcnNuZF9zc2lfcGlvX3N0YXJ0KHN0cnVjdCByc25kX21vZCAqbW9kLAorc3RhdGljIGludCByc25kX3NzaV9waW9fcHJvYmUoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCiAJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9tb2RfdG9fc3NpKG1vZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOworCWludCBpcnEgPSBzc2ktPmluZm8tPnBpb19pcnE7CisJaW50IHJldDsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsCisJCQkgICAgICAgcnNuZF9zc2lfcGlvX2ludGVycnVwdCwKKwkJCSAgICAgICBJUlFGX1NIQVJFRCwKKwkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBzc2kpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAiU1NJIHJlcXVlc3QgaW50ZXJydXB0IGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzbmRfc3NpX3Bpb19zdGFydChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9tb2RfdG9fc3NpKG1vZCk7CiAKIAkvKiBlbmFibGUgUElPIElSUSAqLwogCXNzaS0+Y3JfZXRjID0gVUlFTiB8IE9JRU4gfCBESUVOOwogCi0JLyogZW5hYmxlIFBJTyBpbnRlcnJ1cHQgaWYgZ2VuMiAqLwotCWlmIChyc25kX2lzX2dlbjIocHJpdikpCi0JCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgSU5UX0VOQUJMRSwgMHgwZjAwMDAwMCk7CisJcnNuZF9zcmNfZW5hYmxlX3NzaV9pcnEobW9kLCByZGFpLCBpbyk7CiAKIAlyc25kX3NzaV9od19zdGFydChzc2ksIHJkYWksIGlvKTsKIAotCWRldl9kYmcoZGV2LCAiJXMuJWQgc3RhcnRcbiIsIHJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDcwLDEyICszOTgsOCBAQAogCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCiAJCQkgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQogewotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwogCi0JZGV2X2RiZyhkZXYsICIlcy4lZCBzdG9wXG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCiAJc3NpLT5jcl9ldGMgPSAwOwogCiAJcnNuZF9zc2lfaHdfc3RvcChzc2ksIHJkYWkpOwpAQCAtNDg1LDM1ICs0MDksNDYgQEAKIAogc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zc2lfcGlvX29wcyA9IHsKIAkubmFtZQk9ICJzc2kgKHBpbykiLAorCS5wcm9iZQk9IHJzbmRfc3NpX3Bpb19wcm9iZSwKIAkuaW5pdAk9IHJzbmRfc3NpX2luaXQsCiAJLnF1aXQJPSByc25kX3NzaV9xdWl0LAogCS5zdGFydAk9IHJzbmRfc3NpX3Bpb19zdGFydCwKIAkuc3RvcAk9IHJzbmRfc3NpX3Bpb19zdG9wLAogfTsKIAotc3RhdGljIGludCByc25kX3NzaV9kbWFfaW5xdWlyeShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgZG1hX2FkZHJfdCAqYnVmLCBpbnQgKmxlbikKK3N0YXRpYyBpbnQgcnNuZF9zc2lfZG1hX3Byb2JlKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQogewotCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9kbWFfdG9fc3NpKGRtYSk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSBzc2ktPmlvOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisJaW50IGRtYV9pZCA9IHNzaS0+aW5mby0+ZG1hX2lkOworCWludCBpc19wbGF5OworCWludCByZXQ7CiAKLQkqbGVuID0gaW8tPmJ5dGVfcGVyX3BlcmlvZDsKLQkqYnVmID0gcnVudGltZS0+ZG1hX2FkZHIgKwotCQlyc25kX2RhaV9wb2ludGVyX29mZnNldChpbywgc3NpLT5kbWFfb2Zmc2V0ICsgKmxlbik7Ci0Jc3NpLT5kbWFfb2Zmc2V0ID0gKmxlbjsgLyogaXQgY2FyZXMgQS9CIHBsYW5lICovCisJaWYgKGluZm8tPmRhaV9pbmZvKQorCQlpc19wbGF5ID0gcnNuZF9pbmZvX2lzX3BsYXliYWNrKHByaXYsIHNzaSk7CisJZWxzZQorCQlpc19wbGF5ID0gcnNuZF9zc2lfaXNfcGxheSgmc3NpLT5tb2QpOwogCi0JcmV0dXJuIDA7CisJcmV0ID0gcnNuZF9kbWFfaW5pdCgKKwkJcHJpdiwgcnNuZF9tb2RfdG9fZG1hKG1vZCksCisJCWlzX3BsYXksCisJCWRtYV9pZCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJTU0kgRE1BIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJzbmRfc3NpX2RtYV9jb21wbGV0ZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKK3N0YXRpYyBpbnQgcnNuZF9zc2lfZG1hX3JlbW92ZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCiB7Ci0Jc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX2RtYV90b19zc2koZG1hKTsKLQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHNzaS0+aW87Ci0JdTMyIHN0YXR1cyA9IHJzbmRfbW9kX3JlYWQoJnNzaS0+bW9kLCBTU0lTUik7Ci0KLQlyc25kX3NzaV9yZWNvcmRfZXJyb3Ioc3NpLCBzdGF0dXMpOwotCi0JcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoc3NpLT5pbywgaW8tPmJ5dGVfcGVyX3BlcmlvZCk7CisJcnNuZF9kbWFfcXVpdChyc25kX21vZF90b19wcml2KG1vZCksIHJzbmRfbW9kX3RvX2RtYShtb2QpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTI3LDE0ICs0NjIsMTMgQEAKIAogCS8qIGVuYWJsZSBETUEgdHJhbnNmZXIgKi8KIAlzc2ktPmNyX2V0YyA9IERNRU47Ci0Jc3NpLT5kbWFfb2Zmc2V0ID0gMDsKIAogCXJzbmRfZG1hX3N0YXJ0KGRtYSk7CiAKIAlyc25kX3NzaV9od19zdGFydChzc2ksIHNzaS0+cmRhaSwgaW8pOwogCiAJLyogZW5hYmxlIFdTIGNvbnRpbnVlICovCi0JaWYgKHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpKQorCWlmIChyc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpKQogCQlyc25kX21vZF93cml0ZSgmc3NpLT5tb2QsIFNTSVdTUiwgQ09OVCk7CiAKIAlyZXR1cm4gMDsKQEAgLTU0OSw2ICs0ODMsOCBAQAogCiAJc3NpLT5jcl9ldGMgPSAwOwogCisJcnNuZF9zc2lfcmVjb3JkX2Vycm9yKHNzaSwgcnNuZF9tb2RfcmVhZChtb2QsIFNTSVNSKSk7CisKIAlyc25kX3NzaV9od19zdG9wKHNzaSwgcmRhaSk7CiAKIAlyc25kX2RtYV9zdG9wKGRtYSk7CkBAIC01NTgsNiArNDk0LDggQEAKIAogc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zc2lfZG1hX29wcyA9IHsKIAkubmFtZQk9ICJzc2kgKGRtYSkiLAorCS5wcm9iZQk9IHJzbmRfc3NpX2RtYV9wcm9iZSwKKwkucmVtb3ZlCT0gcnNuZF9zc2lfZG1hX3JlbW92ZSwKIAkuaW5pdAk9IHJzbmRfc3NpX2luaXQsCiAJLnF1aXQJPSByc25kX3NzaV9xdWl0LAogCS5zdGFydAk9IHJzbmRfc3NpX2RtYV9zdGFydCwKQEAgLTU2NywyNCArNTA1LDggQEAKIC8qCiAgKgkJTm9uIFNTSQogICovCi1zdGF0aWMgaW50IHJzbmRfc3NpX25vbihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCXN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQotCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHJzbmRfbW9kX29wcyByc25kX3NzaV9ub25fb3BzID0gewogCS5uYW1lCT0gInNzaSAobm9uKSIsCi0JLmluaXQJPSByc25kX3NzaV9ub24sCi0JLnF1aXQJPSByc25kX3NzaV9ub24sCi0JLnN0YXJ0CT0gcnNuZF9zc2lfbm9uLAotCS5zdG9wCT0gcnNuZF9zc2lfbm9uLAogfTsKIAogLyoKQEAgLTU5MywxNiArNTE1LDMwIEBACiBzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJCQkgIGludCBkYWlfaWQsIGludCBpc19wbGF5KQogeworCXN0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvICpkYWlfaW5mbyA9IE5VTEw7CisJc3RydWN0IHJzbmRfZGFpX3BhdGhfaW5mbyAqcGF0aF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqdGFyZ2V0X2luZm8gPSBOVUxMOwogCXN0cnVjdCByc25kX3NzaSAqc3NpOwogCWludCBpLCBoYXNfcGxheTsKIAorCWlmIChwcml2LT5yZGFpKQorCQlkYWlfaW5mbyA9IHByaXYtPnJkYWlbZGFpX2lkXS5pbmZvOworCWlmIChkYWlfaW5mbykKKwkJcGF0aF9pbmZvID0gKGlzX3BsYXkpID8gJmRhaV9pbmZvLT5wbGF5YmFjayA6ICZkYWlfaW5mby0+Y2FwdHVyZTsKKwlpZiAocGF0aF9pbmZvKQorCQl0YXJnZXRfaW5mbyA9IHBhdGhfaW5mby0+c3NpOworCiAJaXNfcGxheSA9ICEhaXNfcGxheTsKIAogCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgeworCQlpZiAodGFyZ2V0X2luZm8gPT0gc3NpLT5pbmZvKQorCQkJcmV0dXJuICZzc2ktPm1vZDsKKworCQkvKiBmb3IgY29tcGF0aWJsZSAqLwogCQlpZiAocnNuZF9zc2lfZGFpX2lkKHNzaSkgIT0gZGFpX2lkKQogCQkJY29udGludWU7CiAKLQkJaGFzX3BsYXkgPSAhIShyc25kX3NzaV9tb2RlX2ZsYWdzKHNzaSkgJiBSU05EX1NTSV9QTEFZKTsKKwkJaGFzX3BsYXkgPSByc25kX3NzaV9pc19wbGF5KCZzc2ktPm1vZCk7CiAKIAkJaWYgKGlzX3BsYXkgPT0gaGFzX3BsYXkpCiAJCQlyZXR1cm4gJnNzaS0+bW9kOwpAQCAtNjE2LDM2ICs1NTIsMTIyIEBACiAJaWYgKFdBUk5fT04oaWQgPCAwIHx8IGlkID49IHJzbmRfc3NpX25yKHByaXYpKSkKIAkJaWQgPSAwOwogCi0JcmV0dXJuICYoKChzdHJ1Y3QgcnNuZF9zc2l1ICopKHByaXYtPnNzaXUpKS0+c3NpICsgaWQpLT5tb2Q7CisJcmV0dXJuICYoKHN0cnVjdCByc25kX3NzaSAqKShwcml2LT5zc2kpICsgaWQpLT5tb2Q7Cit9CisKK2ludCByc25kX3NzaV9pc19waW5fc2hhcmluZyhzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3sKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOworCisJcmV0dXJuICEhKHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKSAmIFJTTkRfU1NJX0NMS19QSU5fU0hBUkUpOworfQorCitpbnQgcnNuZF9zc2lfaXNfcGxheShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3sKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOworCisJcmV0dXJuICEhKHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKSAmIFJTTkRfU1NJX1BMQVkpOworfQorCitzdGF0aWMgdm9pZCByc25kX3NzaV9wYXJlbnRfY2xrX3NldHVwKHN0cnVjdCByc25kX3ByaXYgKnByaXYsIHN0cnVjdCByc25kX3NzaSAqc3NpKQoreworCWlmICghcnNuZF9zc2lfaXNfcGluX3NoYXJpbmcoJnNzaS0+bW9kKSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChyc25kX21vZF9pZCgmc3NpLT5tb2QpKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJc3NpLT5wYXJlbnQgPSByc25kX21vZF90b19zc2kocnNuZF9zc2lfbW9kX2dldChwcml2LCAwKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3NpLT5wYXJlbnQgPSByc25kX21vZF90b19zc2kocnNuZF9zc2lfbW9kX2dldChwcml2LCAzKSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc3NpLT5wYXJlbnQgPSByc25kX21vZF90b19zc2kocnNuZF9zc2lfbW9kX2dldChwcml2LCA3KSk7CisJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX3NzaShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHJzbmRfc3NpX3BsYXRmb3JtX2luZm8gKnNzaV9pbmZvOworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgbnIsIGk7CisKKwlpZiAoIW9mX2RhdGEpCisJCXJldHVybjsKKworCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNzaSIpOworCWlmICghbm9kZSkKKwkJcmV0dXJuOworCisJbnIgPSBvZl9nZXRfY2hpbGRfY291bnQobm9kZSk7CisJaWYgKCFucikKKwkJcmV0dXJuOworCisJc3NpX2luZm8gPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbykgKiBuciwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNzaV9pbmZvKSB7CisJCWRldl9lcnIoZGV2LCAic3NpIGluZm8gYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbmZvLT5zc2lfaW5mbwkJPSBzc2lfaW5mbzsKKwlpbmZvLT5zc2lfaW5mb19ucgk9IG5yOworCisJaSA9IC0xOworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbnApIHsKKwkJaSsrOworCisJCXNzaV9pbmZvID0gaW5mby0+c3NpX2luZm8gKyBpOworCisJCS8qCisJCSAqIHBpbiBzZXR0aW5ncworCQkgKi8KKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInNoYXJlZC1waW4iLCBOVUxMKSkKKwkJCXNzaV9pbmZvLT5mbGFncyB8PSBSU05EX1NTSV9DTEtfUElOX1NIQVJFOworCisJCS8qCisJCSAqIGlycQorCQkgKi8KKwkJc3NpX2luZm8tPnBpb19pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJfQogfQogCiBpbnQgcnNuZF9zc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKIAlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqcGluZm87CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHM7CiAJc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCByc25kX3NzaXUgKnNzaXU7CiAJc3RydWN0IHJzbmRfc3NpICpzc2k7CiAJY2hhciBuYW1lW1JTTkRfU1NJX05BTUVfU0laRV07Ci0JaW50IGksIG5yLCByZXQ7CisJaW50IGksIG5yOworCisJcnNuZF9vZl9wYXJzZV9zc2kocGRldiwgb2ZfZGF0YSwgcHJpdik7CiAKIAkvKgogCSAqCWluaXQgU1NJCiAJICovCiAJbnIJPSBpbmZvLT5zc2lfaW5mb19ucjsKLQlzc2l1CT0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc2l1KSArIChzaXplb2YoKnNzaSkgKiBuciksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzc2l1KSB7CisJc3NpCT0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc2kpICogbnIsIEdGUF9LRVJORUwpOworCWlmICghc3NpKSB7CiAJCWRldl9lcnIoZGV2LCAiU1NJIGFsbG9jYXRlIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXByaXYtPnNzaXUJPSBzc2l1OwotCXNzaXUtPnNzaQk9IChzdHJ1Y3QgcnNuZF9zc2kgKikoc3NpdSArIDEpOwotCXNzaXUtPnNzaV9ucgk9IG5yOworCXByaXYtPnNzaQk9IHNzaTsKKwlwcml2LT5zc2lfbnIJPSBucjsKIAogCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgewogCQlwaW5mbyA9ICZpbmZvLT5zc2lfaW5mb1tpXTsKQEAgLTY2MCw2MSArNjgyLDE1IEBACiAJCXNzaS0+Y2xrCT0gY2xrOwogCiAJCW9wcyA9ICZyc25kX3NzaV9ub25fb3BzOworCQlpZiAocGluZm8tPmRtYV9pZCA+IDApCisJCQlvcHMgPSAmcnNuZF9zc2lfZG1hX29wczsKKwkJZWxzZSBpZiAocnNuZF9zc2lfcGlvX2F2YWlsYWJsZShzc2kpKQorCQkJb3BzID0gJnJzbmRfc3NpX3Bpb19vcHM7CiAKLQkJLyoKLQkJICogU1NJIERNQSBjYXNlCi0JCSAqLwotCQlpZiAocGluZm8tPmRtYV9pZCA+IDApIHsKLQkJCXJldCA9IHJzbmRfZG1hX2luaXQoCi0JCQkJcHJpdiwgcnNuZF9tb2RfdG9fZG1hKCZzc2ktPm1vZCksCi0JCQkJKHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKSAmIFJTTkRfU1NJX1BMQVkpLAotCQkJCXBpbmZvLT5kbWFfaWQsCi0JCQkJcnNuZF9zc2lfZG1hX2lucXVpcnksCi0JCQkJcnNuZF9zc2lfZG1hX2NvbXBsZXRlKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWRldl9pbmZvKGRldiwgIlNTSSBETUEgZmFpbGVkLiB0cnkgUElPIHRyYW5zdGVyXG4iKTsKLQkJCWVsc2UKLQkJCQlvcHMJPSAmcnNuZF9zc2lfZG1hX29wczsKKwkJcnNuZF9tb2RfaW5pdChwcml2LCAmc3NpLT5tb2QsIG9wcywgUlNORF9NT0RfU1NJLCBpKTsKIAotCQkJZGV2X2RiZyhkZXYsICJTU0klZCB1c2UgRE1BIHRyYW5zZmVyXG4iLCBpKTsKLQkJfQotCi0JCS8qCi0JCSAqIFNTSSBQSU8gY2FzZQotCQkgKi8KLQkJaWYgKCFyc25kX3NzaV9kbWFfYXZhaWxhYmxlKHNzaSkgJiYKLQkJICAgICByc25kX3NzaV9waW9fYXZhaWxhYmxlKHNzaSkpIHsKLQkJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBwaW5mby0+cGlvX2lycSwKLQkJCQkJICAgICAgICZyc25kX3NzaV9waW9faW50ZXJydXB0LAotCQkJCQkgICAgICAgSVJRRl9TSEFSRUQsCi0JCQkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBzc2kpOwotCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoZGV2LCAiU1NJIHJlcXVlc3QgaW50ZXJydXB0IGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQotCQkJb3BzCT0gJnJzbmRfc3NpX3Bpb19vcHM7Ci0KLQkJCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlIFBJTyB0cmFuc2ZlclxuIiwgaSk7Ci0JCX0KLQotCQlyc25kX21vZF9pbml0KHByaXYsICZzc2ktPm1vZCwgb3BzLCBpKTsKKwkJcnNuZF9zc2lfcGFyZW50X2Nsa19zZXR1cChwcml2LCBzc2kpOwogCX0KIAotCWRldl9kYmcoZGV2LCAic3NpIHByb2JlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KLQotdm9pZCByc25kX3NzaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgcnNuZF9zc2kgKnNzaTsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgewotCQlpZiAocnNuZF9zc2lfZG1hX2F2YWlsYWJsZShzc2kpKQotCQkJcnNuZF9kbWFfcXVpdChwcml2LCByc25kX21vZF90b19kbWEoJnNzaS0+bW9kKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2lyZi9LY29uZmlnIGIvc291bmQvc29jL3NpcmYvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWU4OTQyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvS2NvbmZpZwpAQCAtMCwwICsxLDE0IEBACitjb25maWcgU05EX1NPQ19TSVJGCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIFNpUkYgU29DIGNoaXBzIgorCWRlcGVuZHMgb24gQVJDSF9TSVJGIHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBTTkRfU09DX0dFTkVSSUNfRE1BRU5HSU5FX1BDTQorCitjb25maWcgU05EX1NPQ19TSVJGX0FVRElPCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBTaVJGIGludGVybmFsIGF1ZGlvIGNvZGVjIgorCWRlcGVuZHMgb24gU05EX1NPQ19TSVJGCisJc2VsZWN0IFNORF9TT0NfU0lSRl9BVURJT19DT0RFQworCXNlbGVjdCBTTkRfU09DX1NJUkZfQVVESU9fUE9SVAorCitjb25maWcgU05EX1NPQ19TSVJGX0FVRElPX1BPUlQKKwlzZWxlY3QgUkVHTUFQX01NSU8KKwl0cmlzdGF0ZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NpcmYvTWFrZWZpbGUgYi9zb3VuZC9zb2Mvc2lyZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNiOTMyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitzbmQtc29jLXNpcmYtYXVkaW8tb2JqcyA6PSBzaXJmLWF1ZGlvLm8KK3NuZC1zb2Mtc2lyZi1hdWRpby1wb3J0LW9ianMgOj0gc2lyZi1hdWRpby1wb3J0Lm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfU0lSRl9BVURJTykgKz0gc25kLXNvYy1zaXJmLWF1ZGlvLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NJUkZfQVVESU9fUE9SVCkgKz0gc25kLXNvYy1zaXJmLWF1ZGlvLXBvcnQubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmMgYi9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRhNTNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBTaVJGIEF1ZGlvIHBvcnQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9kbWFlbmdpbmVfcGNtLmg+CisKKyNpbmNsdWRlICJzaXJmLWF1ZGlvLXBvcnQuaCIKKworc3RydWN0IHNpcmZfYXVkaW9fcG9ydCB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBwbGF5YmFja19kbWFfZGF0YTsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgY2FwdHVyZV9kbWFfZGF0YTsKK307CisKK3N0YXRpYyB2b2lkIHNpcmZfYXVkaW9fcG9ydF90eF9lbmFibGUoc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCkKK3sKKwlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1RYRklGT19PUCwKKwkJQVVESU9fRklGT19SRVNFVCwgQVVESU9fRklGT19SRVNFVCk7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19UWEZJRk9fSU5UX01TSywgMCk7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19UWEZJRk9fT1AsIDApOworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLAorCQlBVURJT19GSUZPX1NUQVJULCBBVURJT19GSUZPX1NUQVJUKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX0NPREVDX1RYX0NUUkwsCisJCUlDX1RYX0VOQUJMRSwgSUNfVFhfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgc2lyZl9hdWRpb19wb3J0X3R4X2Rpc2FibGUoc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCkKK3sKKwlyZWdtYXBfd3JpdGUocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1RYRklGT19PUCwgMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19UWF9DVFJMLAorCQlJQ19UWF9FTkFCTEUsIH5JQ19UWF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBzaXJmX2F1ZGlvX3BvcnRfcnhfZW5hYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQsCisJaW50IGNoYW5uZWxzKQoreworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QLAorCQlBVURJT19GSUZPX1JFU0VULCBBVURJT19GSUZPX1JFU0VUKTsKKwlyZWdtYXBfd3JpdGUocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1JYRklGT19JTlRfTVNLLCAwKTsKKwlyZWdtYXBfd3JpdGUocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1JYRklGT19PUCwgMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19SWEZJRk9fT1AsCisJCUFVRElPX0ZJRk9fU1RBUlQsIEFVRElPX0ZJRk9fU1RBUlQpOworCWlmIChjaGFubmVscyA9PSAxKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX0NPREVDX1JYX0NUUkwsCisJCQlJQ19SWF9FTkFCTEVfTU9OTywgSUNfUlhfRU5BQkxFX01PTk8pOworCWVsc2UKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19SWF9DVFJMLAorCQkJSUNfUlhfRU5BQkxFX1NURVJFTywgSUNfUlhfRU5BQkxFX1NURVJFTyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpcmZfYXVkaW9fcG9ydF9yeF9kaXNhYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19SWF9DVFJMLAorCQkJSUNfUlhfRU5BQkxFX1NURVJFTywgfklDX1JYX0VOQUJMRV9TVEVSRU8pOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fcG9ydF9kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksICZwb3J0LT5wbGF5YmFja19kbWFfZGF0YSwKKwkJCSZwb3J0LT5jYXB0dXJlX2RtYV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3BvcnRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0ICpwb3J0ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlpbnQgcGxheWJhY2sgPSBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJaWYgKHBsYXliYWNrKQorCQkJc2lyZl9hdWRpb19wb3J0X3R4X2Rpc2FibGUocG9ydCk7CisJCWVsc2UKKwkJCXNpcmZfYXVkaW9fcG9ydF9yeF9kaXNhYmxlKHBvcnQpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJaWYgKHBsYXliYWNrKQorCQkJc2lyZl9hdWRpb19wb3J0X3R4X2VuYWJsZShwb3J0KTsKKwkJZWxzZQorCQkJc2lyZl9hdWRpb19wb3J0X3J4X2VuYWJsZShwb3J0LAorCQkJCXN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2lyZl9hdWRpb19wb3J0X2RhaV9vcHMgPSB7CisJLnRyaWdnZXIgPSBzaXJmX2F1ZGlvX3BvcnRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNpcmZfYXVkaW9fcG9ydF9kYWkgPSB7CisJLnByb2JlID0gc2lyZl9hdWRpb19wb3J0X2RhaV9wcm9iZSwKKwkubmFtZSA9ICJzaXJmLWF1ZGlvLXBvcnQiLAorCS5pZCA9IDAsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKKwkub3BzID0gJnNpcmZfYXVkaW9fcG9ydF9kYWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc2lyZl9hdWRpb19wb3J0X2NvbXBvbmVudCA9IHsKKwkubmFtZSAgICAgICA9ICJzaXJmLWF1ZGlvLXBvcnQiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNpcmZfYXVkaW9fcG9ydF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkudmFsX2JpdHMgPSAzMiwKKwkubWF4X3JlZ2lzdGVyID0gQVVESU9fUE9SVF9JQ19SWEZJRk9fSU5UX01TSywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fcG9ydF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydDsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlc291cmNlICptZW1fcmVzOworCisJcG9ydCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW1fcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwliYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIG1lbV9yZXMtPnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZShtZW1fcmVzKSk7CisJaWYgKGJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3J0LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oJnBkZXYtPmRldiwgYmFzZSwKKwkJCQkJICAgICZzaXJmX2F1ZGlvX3BvcnRfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihwb3J0LT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihwb3J0LT5yZWdtYXApOworCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJnNpcmZfYXVkaW9fcG9ydF9jb21wb25lbnQsICZzaXJmX2F1ZGlvX3BvcnRfZGFpLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG9ydCk7CisJcmV0dXJuIGRldm1fc25kX2RtYWVuZ2luZV9wY21fcmVnaXN0ZXIoJnBkZXYtPmRldiwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNpcmZfYXVkaW9fcG9ydF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic2lyZixhdWRpby1wb3J0IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNpcmZfYXVkaW9fcG9ydF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpcmZfYXVkaW9fcG9ydF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1wb3J0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNpcmZfYXVkaW9fcG9ydF9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNpcmZfYXVkaW9fcG9ydF9wcm9iZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2lyZl9hdWRpb19wb3J0X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lSRiBBdWRpbyBQb3J0IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUm9uZ0p1biBZaW5nIDxSb25nanVuLllpbmdAY3NyLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5oIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyZGM1NAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBTaVJGIEF1ZGlvIHBvcnQgY29udHJvbGxlcnMgZGVmaW5lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX1NJUkZfQVVESU9fUE9SVF9ICisjZGVmaW5lIF9TSVJGX0FVRElPX1BPUlRfSAorCisjZGVmaW5lIEFVRElPX1BPUlRfVFhfRklGT19MRVZFTF9DSEVDS19NQVNLICAgICAweDNGCisjZGVmaW5lIEFVRElPX1BPUlRfVFhfRklGT19TQ19PRkZTRVQgICAgMAorI2RlZmluZSBBVURJT19QT1JUX1RYX0ZJRk9fTENfT0ZGU0VUICAgIDEwCisjZGVmaW5lIEFVRElPX1BPUlRfVFhfRklGT19IQ19PRkZTRVQgICAgMjAKKworI2RlZmluZSBUWF9GSUZPX1NDKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BPUlRfVFhfRklGT19MRVZFTF9DSEVDS19NQVNLKSBcCisJCQkJPDwgQVVESU9fUE9SVF9UWF9GSUZPX1NDX09GRlNFVCkKKyNkZWZpbmUgVFhfRklGT19MQyh4KSAgICAgICAgICAgKCgoeCkgJiBBVURJT19QT1JUX1RYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAorCQkJCTw8IEFVRElPX1BPUlRfVFhfRklGT19MQ19PRkZTRVQpCisjZGVmaW5lIFRYX0ZJRk9fSEMoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUE9SVF9UWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKKwkJCQk8PCBBVURJT19QT1JUX1RYX0ZJRk9fSENfT0ZGU0VUKQorCisjZGVmaW5lIEFVRElPX1BPUlRfUlhfRklGT19MRVZFTF9DSEVDS19NQVNLICAgICAweDBGCisjZGVmaW5lIEFVRElPX1BPUlRfUlhfRklGT19TQ19PRkZTRVQgICAgMAorI2RlZmluZSBBVURJT19QT1JUX1JYX0ZJRk9fTENfT0ZGU0VUICAgIDEwCisjZGVmaW5lIEFVRElPX1BPUlRfUlhfRklGT19IQ19PRkZTRVQgICAgMjAKKworI2RlZmluZSBSWF9GSUZPX1NDKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BPUlRfUlhfRklGT19MRVZFTF9DSEVDS19NQVNLKSBcCisJCQkJPDwgQVVESU9fUE9SVF9SWF9GSUZPX1NDX09GRlNFVCkKKyNkZWZpbmUgUlhfRklGT19MQyh4KSAgICAgICAgICAgKCgoeCkgJiBBVURJT19QT1JUX1JYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAorCQkJCTw8IEFVRElPX1BPUlRfUlhfRklGT19MQ19PRkZTRVQpCisjZGVmaW5lIFJYX0ZJRk9fSEMoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUE9SVF9SWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKKwkJCQk8PCBBVURJT19QT1JUX1JYX0ZJRk9fSENfT0ZGU0VUKQorI2RlZmluZSBBVURJT19QT1JUX0lDX0NPREVDX1RYX0NUUkwJCSgweDAwRjQpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfQ09ERUNfUlhfQ1RSTAkJKDB4MDBGOCkKKworI2RlZmluZSBBVURJT19QT1JUX0lDX1RYRklGT19PUAkJCSgweDAwRkMpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfVFhGSUZPX0xFVl9DSEsJCSgweDAxMDApCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfVFhGSUZPX1NUUwkJKDB4MDEwNCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19UWEZJRk9fSU5UCQkoMHgwMTA4KQorI2RlZmluZSBBVURJT19QT1JUX0lDX1RYRklGT19JTlRfTVNLCQkoMHgwMTBDKQorCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QCQkJKDB4MDExMCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19SWEZJRk9fTEVWX0NISwkJKDB4MDExNCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19SWEZJRk9fU1RTCQkoMHgwMTE4KQorI2RlZmluZSBBVURJT19QT1JUX0lDX1JYRklGT19JTlQJCSgweDAxMUMpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfUlhGSUZPX0lOVF9NU0sJCSgweDAxMjApCisKKyNkZWZpbmUgQVVESU9fRklGT19TVEFSVAkJKDEgPDwgMCkKKyNkZWZpbmUgQVVESU9fRklGT19SRVNFVAkJKDEgPDwgMSkKKworI2RlZmluZSBBVURJT19GSUZPX0ZVTEwJCQkoMSA8PCAwKQorI2RlZmluZSBBVURJT19GSUZPX0VNUFRZCQkoMSA8PCAxKQorI2RlZmluZSBBVURJT19GSUZPX09GTE9XCQkoMSA8PCAyKQorI2RlZmluZSBBVURJT19GSUZPX1VGTE9XCQkoMSA8PCAzKQorCisjZGVmaW5lIElDX1RYX0VOQUJMRQkJKDB4MDMpCisjZGVmaW5lIElDX1JYX0VOQUJMRV9NT05PCSgweDAxKQorI2RlZmluZSBJQ19SWF9FTkFCTEVfU1RFUkVPCSgweDAzKQorCisjZW5kaWYgLypfX1NJUkZfQVVESU9fUE9SVF9IKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8uYyBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VmNTEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogU2lSRiBhdWRpbyBjYXJkIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworc3RydWN0IHNpcmZfYXVkaW9fY2FyZCB7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZ3Bpb19ocF9wYTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBncGlvX3Nwa19wYTsKK307CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19ocF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdHJsLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jYXJkICpzaXJmX2F1ZGlvX2NhcmQgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IG9uID0gIVNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpOworCWlmIChncGlvX2lzX3ZhbGlkKHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSkpCisJCWdwaW9fc2V0X3ZhbHVlKHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSwgb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fc3BrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0cmwsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSB3LT5kYXBtOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkOworCXN0cnVjdCBzaXJmX2F1ZGlvX2NhcmQgKnNpcmZfYXVkaW9fY2FyZCA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgb24gPSAhU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCk7CisKKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhKSkKKwkJZ3Bpb19zZXRfdmFsdWUoc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSwgb24pOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2lyZl9hdWRpb19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhwIiwgc2lyZl9hdWRpb19ocF9ldmVudCksCisJU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIHNpcmZfYXVkaW9fc3BrX2V2ZW50KSwKKwlTTkRfU09DX0RBUE1fTUlDKCJFeHQgTWljIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0geworCXsiSHAiLCBOVUxMLCAiSFBPVVRMIn0sCisJeyJIcCIsIE5VTEwsICJIUE9VVFIifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BLT1VUIn0sCisJeyJNSUNJTjEiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIkV4dCBNaWMifSwKK307CisKKy8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNpcmZfYXVkaW9fZGFpX2xpbmtbXSA9IHsKKwl7CisJCS5uYW1lID0gIlNpUkYgYXVkaW8gY2FyZCIsCisJCS5zdHJlYW1fbmFtZSA9ICJTaVJGIGF1ZGlvIEhpRmkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic2lyZi1hdWRpby1jb2RlYyIsCisJfSwKK307CisKKy8qIEF1ZGlvIG1hY2hpbmUgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX3NpcmZfYXVkaW9fY2FyZCA9IHsKKwkubmFtZSA9ICJTaVJGIGF1ZGlvIGNhcmQiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9IHNpcmZfYXVkaW9fZGFpX2xpbmssCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19kYWlfbGluayksCisJLmRhcG1fd2lkZ2V0cyA9IHNpcmZfYXVkaW9fZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzaXJmX2F1ZGlvX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorfTsKKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZzbmRfc29jX3NpcmZfYXVkaW9fY2FyZDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jYXJkICpzaXJmX2F1ZGlvX2NhcmQ7CisJaW50IHJldDsKKworCXNpcmZfYXVkaW9fY2FyZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHNpcmZfYXVkaW9fY2FyZCksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoc2lyZl9hdWRpb19jYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc2lyZl9hdWRpb19kYWlfbGlua1swXS5jcHVfb2Zfbm9kZSA9CisJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLGF1ZGlvLXBsYXRmb3JtIiwgMCk7CisJc2lyZl9hdWRpb19kYWlfbGlua1swXS5wbGF0Zm9ybV9vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYsYXVkaW8tcGxhdGZvcm0iLCAwKTsKKwlzaXJmX2F1ZGlvX2RhaV9saW5rWzBdLmNvZGVjX29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAic2lyZixhdWRpby1jb2RlYyIsIDApOworCXNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19zcGtfcGEgPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJzcGstcGEtZ3Bpb3MiLCAwKTsKKwlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEgPSAgb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkiaHAtcGEtZ3Bpb3MiLCAwKTsKKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhKSkgeworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhLAorCQkJCUdQSU9GX09VVF9JTklUX0xPVywgIlNQQV9QQV9TRCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXF1ZXN0IEdQSU9fJWQgZm9yIHJlc2V0OiAlZFxuIiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEpKSB7CisJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGRldi0+ZGV2LAorCQkJCXNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSwKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJIUF9QQV9TRCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXF1ZXN0IEdQSU9fJWQgZm9yIHJlc2V0OiAlZFxuIiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgc2lyZl9hdWRpb19jYXJkKTsKKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgpIGZhaWxlZDolZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNpcmZfYXVkaW9fb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAic2lyZixzaXJmLWF1ZGlvLWNhcmQiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzaXJmX2F1ZGlvX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZl9hdWRpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1jYXJkIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gc2lyZl9hdWRpb19vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNpcmZfYXVkaW9fcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaXJmX2F1ZGlvX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ0p1bi5ZaW5nQGNzci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFNJUkYgYXVkaW8gY2FyZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY2FjaGUuYyBiL3NvdW5kL3NvYy9zb2MtY2FjaGUuYwppbmRleCAzNzVkYzZkLi5iZmVkM2U0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKKysrIGIvc291bmQvc29jL3NvYy1jYWNoZS5jCkBAIC05Niw4ICs5Niw3IEBACiB7CiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQVNvQzogRGVzdHJveWluZyBjYWNoZSBmb3IgJXMgY29kZWNcbiIsCiAJCQljb2RlYy0+bmFtZSk7Ci0JaWYgKCFjb2RlYy0+cmVnX2NhY2hlKQotCQlyZXR1cm4gMDsKKwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwogCWNvZGVjLT5yZWdfY2FjaGUgPSBOVUxMOwogCXJldHVybiAwOwpAQCAtMTE3LDggKzExNiw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKLQkqdmFsdWUgPSBzbmRfc29jX2dldF9jYWNoZV92YWwoY29kZWMtPnJlZ19jYWNoZSwgcmVnLAotCQkJCSAgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKKwlpZiAoIVpFUk9fT1JfTlVMTF9QVFIoY29kZWMtPnJlZ19jYWNoZSkpCisJCSp2YWx1ZSA9IHNuZF9zb2NfZ2V0X2NhY2hlX3ZhbChjb2RlYy0+cmVnX2NhY2hlLCByZWcsCisJCQkJCSAgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKIAltdXRleF91bmxvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzNiw4ICsxMzYsOSBAQAogCQkJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQogewogCW11dGV4X2xvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7Ci0Jc25kX3NvY19zZXRfY2FjaGVfdmFsKGNvZGVjLT5yZWdfY2FjaGUsIHJlZywgdmFsdWUsCi0JCQkgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKKwlpZiAoIVpFUk9fT1JfTlVMTF9QVFIoY29kZWMtPnJlZ19jYWNoZSkpCisJCXNuZF9zb2Nfc2V0X2NhY2hlX3ZhbChjb2RlYy0+cmVnX2NhY2hlLCByZWcsIHZhbHVlLAorCQkJCSAgICAgIGNvZGVjLT5kcml2ZXItPnJlZ193b3JkX3NpemUpOwogCW11dGV4X3VubG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb21wcmVzcy5jIGIvc291bmQvc29jL3NvYy1jb21wcmVzcy5jCmluZGV4IDVlOTY5MGMuLjkxMDgzZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvbXByZXNzLmMKQEAgLTMwLDggKzMwLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrX25lc3RlZCgmcnRkLT5wY21fbXV0ZXgsIHJ0ZC0+cGNtX3N1YmNsYXNzKTsKQEAgLTUyLDE3ICs1MCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUrKzsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlKys7Ci0JfQotCi0JY3B1X2RhaS0+YWN0aXZlKys7Ci0JY29kZWNfZGFpLT5hY3RpdmUrKzsKLQlydGQtPmNvZGVjLT5hY3RpdmUrKzsKKwlzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUocnRkLCBjc3RyZWFtLT5kaXJlY3Rpb24pOwogCiAJbXV0ZXhfdW5sb2NrKCZydGQtPnBjbV9tdXRleCk7CiAKQEAgLTgxLDggKzY5LDYgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqZmUgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpmZV9zdWJzdHJlYW0gPSBmZS0+cGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBmZS0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gZmUtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBmZS0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RwY20gKmRwY207CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqbGlzdDsKIAlpbnQgc3RyZWFtOwpAQCAtMTQwLDE3ICsxMjYsNyBAQAogCWZlLT5kcGNtW3N0cmVhbV0uc3RhdGUgPSBTTkRfU09DX0RQQ01fU1RBVEVfT1BFTjsKIAlmZS0+ZHBjbVtzdHJlYW1dLnJ1bnRpbWVfdXBkYXRlID0gU05EX1NPQ19EUENNX1VQREFURV9OTzsKIAotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0JCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZSsrOwotCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZSsrOwotCX0gZWxzZSB7Ci0JCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQl9Ci0KLQljcHVfZGFpLT5hY3RpdmUrKzsKLQljb2RlY19kYWktPmFjdGl2ZSsrOwotCWZlLT5jb2RlYy0+YWN0aXZlKys7CisJc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKGZlLCBzdHJlYW0pOwogCiAJbXV0ZXhfdW5sb2NrKCZmZS0+Y2FyZC0+bXV0ZXgpOwogCkBAIC0yMDIsMjQgKzE3OCwxOSBAQAogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlpbnQgc3RyZWFtOwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CiAKLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlLS07Ci0JfQorCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKQorCQlzdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOworCWVsc2UKKwkJc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOworCisJc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUocnRkLCBzdHJlYW0pOwogCiAJc25kX3NvY19kYWlfZGlnaXRhbF9tdXRlKGNvZGVjX2RhaSwgMSwgY3N0cmVhbS0+ZGlyZWN0aW9uKTsKIAotCWNwdV9kYWktPmFjdGl2ZS0tOwotCWNvZGVjX2RhaS0+YWN0aXZlLS07Ci0JY29kZWMtPmFjdGl2ZS0tOwotCiAJaWYgKCFjcHVfZGFpLT5hY3RpdmUpCiAJCWNwdV9kYWktPnJhdGUgPSAwOwogCkBAIC0yMzUsOCArMjA2LDcgQEAKIAljcHVfZGFpLT5ydW50aW1lID0gTlVMTDsKIAogCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0JCWlmICghcnRkLT5wbWRvd25fdGltZSB8fCBjb2RlYy0+aWdub3JlX3BtZG93bl90aW1lIHx8Ci0JCSAgICBydGQtPmRhaV9saW5rLT5pZ25vcmVfcG1kb3duX3RpbWUpIHsKKwkJaWYgKHNuZF9zb2NfcnVudGltZV9pZ25vcmVfcG1kb3duX3RpbWUocnRkKSkgewogCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChydGQsCiAJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCiAJCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RPUCk7CkBAIC0yNjEsMjYgKzIzMSwxNyBAQAogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpmZSA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBmZS0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gZmUtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBmZS0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RwY20gKmRwY207CiAJaW50IHN0cmVhbSwgcmV0OwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmZlLT5jYXJkLT5tdXRleCwgU05EX1NPQ19DQVJEX0NMQVNTX1JVTlRJTUUpOwogCi0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKKwlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKIAkJc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRTsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCX0KIAotCWNwdV9kYWktPmFjdGl2ZS0tOwotCWNvZGVjX2RhaS0+YWN0aXZlLS07Ci0JZmUtPmNvZGVjLT5hY3RpdmUtLTsKKwlzbmRfc29jX3J1bnRpbWVfZGVhY3RpdmF0ZShmZSwgc3RyZWFtKTsKIAogCWZlLT5kcGNtW3N0cmVhbV0ucnVudGltZV91cGRhdGUgPSBTTkRfU09DX0RQQ01fVVBEQVRFX0ZFOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IGZlMWRmNTAuLjA1MWMwMDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC01Niw3ICs1Niw2IEBACiAjZW5kaWYKIAogc3RhdGljIERFRklORV9NVVRFWChjbGllbnRfbXV0ZXgpOwotc3RhdGljIExJU1RfSEVBRChkYWlfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKHBsYXRmb3JtX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChjb2RlY19saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoY29tcG9uZW50X2xpc3QpOwpAQCAtMzcwLDE4ICszNjksMjIgQEAKIHsKIAljaGFyICpidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJc3NpemVfdCBsZW4sIHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CiAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmRhaV9saXN0LCBsaXN0KSB7Ci0JCWxlbiA9IHNucHJpbnRmKGJ1ZiArIHJldCwgUEFHRV9TSVpFIC0gcmV0LCAiJXNcbiIsIGRhaS0+bmFtZSk7Ci0JCWlmIChsZW4gPj0gMCkKLQkJCXJldCArPSBsZW47Ci0JCWlmIChyZXQgPiBQQUdFX1NJWkUpIHsKLQkJCXJldCA9IFBBR0VfU0laRTsKLQkJCWJyZWFrOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmY29tcG9uZW50X2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KSB7CisJCQlsZW4gPSBzbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIiVzXG4iLAorCQkJCWRhaS0+bmFtZSk7CisJCQlpZiAobGVuID49IDApCisJCQkJcmV0ICs9IGxlbjsKKwkJCWlmIChyZXQgPiBQQUdFX1NJWkUpIHsKKwkJCQlyZXQgPSBQQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTg1NSw2ICs4NTgsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9ICZjYXJkLT5kYWlfbGlua1tudW1dOwogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSAmY2FyZC0+cnRkW251bV07CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgKmNwdV9kYWk7CkBAIC04NjMsMTggKzg2NywyMCBAQAogCWRldl9kYmcoY2FyZC0+ZGV2LCAiQVNvQzogYmluZGluZyAlcyBhdCBpZHggJWRcbiIsIGRhaV9saW5rLT5uYW1lLCBudW0pOwogCiAJLyogRmluZCBDUFUgREFJIGZyb20gcmVnaXN0ZXJlZCBEQUlzKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwdV9kYWksICZkYWlfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmY29tcG9uZW50X2xpc3QsIGxpc3QpIHsKIAkJaWYgKGRhaV9saW5rLT5jcHVfb2Zfbm9kZSAmJgotCQkgICAgKGNwdV9kYWktPmRldi0+b2Zfbm9kZSAhPSBkYWlfbGluay0+Y3B1X29mX25vZGUpKQorCQkJY29tcG9uZW50LT5kZXYtPm9mX25vZGUgIT0gZGFpX2xpbmstPmNwdV9vZl9ub2RlKQogCQkJY29udGludWU7CiAJCWlmIChkYWlfbGluay0+Y3B1X25hbWUgJiYKLQkJICAgIHN0cmNtcChkZXZfbmFtZShjcHVfZGFpLT5kZXYpLCBkYWlfbGluay0+Y3B1X25hbWUpKQorCQkJc3RyY21wKGRldl9uYW1lKGNvbXBvbmVudC0+ZGV2KSwgZGFpX2xpbmstPmNwdV9uYW1lKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoZGFpX2xpbmstPmNwdV9kYWlfbmFtZSAmJgotCQkgICAgc3RyY21wKGNwdV9kYWktPm5hbWUsIGRhaV9saW5rLT5jcHVfZGFpX25hbWUpKQotCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3B1X2RhaSwgJmNvbXBvbmVudC0+ZGFpX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChkYWlfbGluay0+Y3B1X2RhaV9uYW1lICYmCisJCQkJc3RyY21wKGNwdV9kYWktPm5hbWUsIGRhaV9saW5rLT5jcHVfZGFpX25hbWUpKQorCQkJCWNvbnRpbnVlOwogCi0JCXJ0ZC0+Y3B1X2RhaSA9IGNwdV9kYWk7CisJCQlydGQtPmNwdV9kYWkgPSBjcHVfZGFpOworCQl9CiAJfQogCiAJaWYgKCFydGQtPmNwdV9kYWkpIHsKQEAgLTg5OSwxMiArOTA1LDEwIEBACiAJCSAqIENPREVDIGZvdW5kLCBzbyBmaW5kIENPREVDIERBSSBmcm9tIHJlZ2lzdGVyZWQgREFJcyBmcm9tCiAJCSAqIHRoaXMgQ09ERUMKIAkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWNfZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKLQkJCWlmIChjb2RlYy0+ZGV2ID09IGNvZGVjX2RhaS0+ZGV2ICYmCi0JCQkJIXN0cmNtcChjb2RlY19kYWktPm5hbWUsCi0JCQkJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkpIHsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjX2RhaSwgJmNvZGVjLT5jb21wb25lbnQuZGFpX2xpc3QsIGxpc3QpIHsKKwkJCWlmICghc3RyY21wKGNvZGVjX2RhaS0+bmFtZSwgZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKSkgewogCQkJCXJ0ZC0+Y29kZWNfZGFpID0gY29kZWNfZGFpOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKQEAgLTExMjgsMTUgKzExMzIsMjEgQEAKIAkJCQkJICBkcml2ZXItPm51bV9kYXBtX3dpZGdldHMpOwogCiAJLyogQ3JlYXRlIERBUE0gd2lkZ2V0cyBmb3IgZWFjaCBEQUkgc3RyZWFtICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZkYWlfbGlzdCwgbGlzdCkgewotCQlpZiAoZGFpLT5kZXYgIT0gY29kZWMtPmRldikKLQkJCWNvbnRpbnVlOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb2RlYy0+Y29tcG9uZW50LmRhaV9saXN0LCBsaXN0KQogCQlzbmRfc29jX2RhcG1fbmV3X2RhaV93aWRnZXRzKCZjb2RlYy0+ZGFwbSwgZGFpKTsKLQl9CiAKIAljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gZHJpdmVyLT5pZGxlX2JpYXNfb2ZmOwogCisJaWYgKCFjb2RlYy0+d3JpdGUgJiYgZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldiwgTlVMTCkpIHsKKwkJLyogU2V0IHRoZSBkZWZhdWx0IEkvTyB1cCB0cnkgcmVnbWFwICovCisJCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOworCQkJZ290byBlcnJfcHJvYmU7CisJCX0KKwl9CisKIAlpZiAoZHJpdmVyLT5wcm9iZSkgewogCQlyZXQgPSBkcml2ZXItPnByb2JlKGNvZGVjKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTExNTAsMTAgKzExNjAsNiBAQAogCQkJY29kZWMtPm5hbWUpOwogCX0KIAotCS8qIElmIHRoZSBkcml2ZXIgZGlkbid0IHNldCBJL08gdXAgdHJ5IHJlZ21hcCAqLwotCWlmICghY29kZWMtPndyaXRlICYmIGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpKQotCQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMCwgMCwgU05EX1NPQ19SRUdNQVApOwotCiAJaWYgKGRyaXZlci0+Y29udHJvbHMpCiAJCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBkcml2ZXItPmNvbnRyb2xzLAogCQkJCSAgICAgZHJpdmVyLT5udW1fY29udHJvbHMpOwpAQCAtMTE4MCw2ICsxMTg2LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgKmRyaXZlciA9IHBsYXRmb3JtLT5kcml2ZXI7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CiAKIAlwbGF0Zm9ybS0+Y2FyZCA9IGNhcmQ7CkBAIC0xMTk1LDExICsxMjAyLDExIEBACiAJCQlkcml2ZXItPmRhcG1fd2lkZ2V0cywgZHJpdmVyLT5udW1fZGFwbV93aWRnZXRzKTsKIAogCS8qIENyZWF0ZSBEQVBNIHdpZGdldHMgZm9yIGVhY2ggREFJIHN0cmVhbSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGRhaS0+ZGV2ICE9IHBsYXRmb3JtLT5kZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wb25lbnQsICZjb21wb25lbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoY29tcG9uZW50LT5kZXYgIT0gcGxhdGZvcm0tPmRldikKIAkJCWNvbnRpbnVlOwotCi0JCXNuZF9zb2NfZGFwbV9uZXdfZGFpX3dpZGdldHMoJnBsYXRmb3JtLT5kYXBtLCBkYWkpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmNvbXBvbmVudC0+ZGFpX2xpc3QsIGxpc3QpCisJCQlzbmRfc29jX2RhcG1fbmV3X2RhaV93aWRnZXRzKCZwbGF0Zm9ybS0+ZGFwbSwgZGFpKTsKIAl9CiAKIAlwbGF0Zm9ybS0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKQEAgLTEyNDYsNyArMTI1Myw3IEBACiAJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2ICphdXhfZGV2ID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCWNvbnN0IGNoYXIgKnRlbXAsICpuYW1lOworCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWRhaWxlc3MpIHsKQEAgLTEyNjAsMTAgKzEyNjcsNiBAQAogCX0KIAlydGQtPmNhcmQgPSBjYXJkOwogCi0JLyogbWFjaGluZSBjb250cm9scywgcm91dGVzIGFuZCB3aWRnZXRzIGFyZSBub3QgcHJlZml4ZWQgKi8KLQl0ZW1wID0gY29kZWMtPm5hbWVfcHJlZml4OwotCWNvZGVjLT5uYW1lX3ByZWZpeCA9IE5VTEw7Ci0KIAkvKiBkbyBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCiAJaWYgKCFkYWlsZXNzICYmIGRhaV9saW5rLT5pbml0KQogCQlyZXQgPSBkYWlfbGluay0+aW5pdChydGQpOwpAQCAtMTI3Myw3ICsxMjc2LDYgQEAKIAkJZGV2X2VycihjYXJkLT5kZXYsICJBU29DOiBmYWlsZWQgdG8gaW5pdCAlczogJWRcbiIsIG5hbWUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCWNvZGVjLT5uYW1lX3ByZWZpeCA9IHRlbXA7CiAKIAkvKiByZWdpc3RlciB0aGUgcnRkIGRldmljZSAqLwogCXJ0ZC0+Y29kZWMgPSBjb2RlYzsKQEAgLTE2NTQsNyArMTY1Niw3IEBACiAJfQogCiAJLyogY2FyZCBiaW5kIGNvbXBsZXRlIHNvIHJlZ2lzdGVyIGEgc291bmQgY2FyZCAqLwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwlyZXQgPSBzbmRfY2FyZF9uZXcoY2FyZC0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKIAkJCWNhcmQtPm93bmVyLCAwLCAmY2FyZC0+c25kX2NhcmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY2FyZC0+ZGV2LApAQCAtMTY2Miw3ICsxNjY0LDYgQEAKIAkJCWNhcmQtPm5hbWUsIHJldCk7CiAJCWdvdG8gYmFzZV9lcnJvcjsKIAl9Ci0JY2FyZC0+c25kX2NhcmQtPmRldiA9IGNhcmQtPmRldjsKIAogCWNhcmQtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY2FyZC0+ZGFwbS5kZXYgPSBjYXJkLT5kZXY7CkBAIC0yNTcxLDEwICsyNTcyLDEwIEBACiAKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSBlLT5zaGlmdF9sID09IGUtPnNoaWZ0X3IgPyAxIDogMjsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPm1heDsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPml0ZW1zOwogCi0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBlLT5tYXggLSAxKQotCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gZS0+bWF4IC0gMTsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSBlLT5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGUtPml0ZW1zIC0gMTsKIAlzdHJsY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCiAJCWUtPnRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dLAogCQlzaXplb2YodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSkpOwpAQCAtMjU5NiwxNCArMjU5NywxOCBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgdmFsLCBpdGVtOworCXVuc2lnbmVkIGludCByZWdfdmFsOwogCi0JdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0KLQkJPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KLQkJCSh2YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7CisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCWl0ZW0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaXRlbTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwkJaXRlbSA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOworCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gaXRlbTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MjMsMTcgKzI2MjgsMTggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCAqaXRlbSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CiAJdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBpbnQgbWFzazsKIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKKwlpZiAoaXRlbVswXSA+PSBlLT5pdGVtcykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBlLT5zaGlmdF9sOworCXZhbCA9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzBdKSA8PCBlLT5zaGlmdF9sOwogCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCWlmIChpdGVtWzFdID49IGUtPml0ZW1zKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCXZhbCB8PSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVsxXSkgPDwgZS0+c2hpZnRfcjsKIAkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CiAJfQogCkBAIC0yNjQyLDc4ICsyNjQ4LDQ2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSk7CiAKIC8qKgotICogc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUgLSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldCBjYWxsYmFjawotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogc25kX3NvY19yZWFkX3NpZ25lZCAtIFJlYWQgYSBjb2RlYyByZWdpc3RlciBhbmQgaW50ZXJwcmV0ZSBhcyBzaWduZWQgdmFsdWUKKyAqIEBjb2RlYzogY29kZWMKKyAqIEByZWc6IFJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBtYXNrOiBNYXNrIHRvIHVzZSBhZnRlciBzaGlmdGluZyB0aGUgcmVnaXN0ZXIgdmFsdWUKKyAqIEBzaGlmdDogUmlnaHQgc2hpZnQgb2YgcmVnaXN0ZXIgdmFsdWUKKyAqIEBzaWduX2JpdDogQml0IHRoYXQgZGVzY3JpYmVzIGlmIGEgbnVtYmVyIGlzIG5lZ2F0aXZlIG9yIG5vdC4KICAqCi0gKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIHNlbWkgZW51bWVyYXRlZCBtaXhlci4KKyAqIFRoaXMgZnVuY3Rpb25zIHJlYWRzIGEgY29kZWMgcmVnaXN0ZXIuIFRoZSByZWdpc3RlciB2YWx1ZSBpcyBzaGlmdGVkIHJpZ2h0CisgKiBieSAnc2hpZnQnIGJpdHMgYW5kIG1hc2tlZCB3aXRoIHRoZSBnaXZlbiAnbWFzaycuIEFmdGVyd2FyZHMgaXQgdHJhbnNsYXRlcworICogdGhlIGdpdmVuIHJlZ2lzdGVydmFsdWUgaW50byBhIHNpZ25lZCBpbnRlZ2VyIGlmIHNpZ25fYml0IGlzIG5vbi16ZXJvLgogICoKLSAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCi0gKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKiBSZXR1cm5zIHRoZSByZWdpc3RlciB2YWx1ZSBhcyBzaWduZWQgaW50LgogICovCi1pbnQgc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9zb2NfcmVhZF9zaWduZWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHNoaWZ0LCB1bnNpZ25lZCBpbnQgc2lnbl9iaXQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcmVnX3ZhbCwgdmFsLCBtdXg7Ci0KLQlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwotCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKLQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKLQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKLQkJCWJyZWFrOwotCX0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbXV4OwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOwotCQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKLQkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IG11eDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKTsKLQotLyoqCi0gKiBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSAtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgcHV0IGNhbGxiYWNrCi0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBzZW1pIGVudW1lcmF0ZWQgbWl4ZXIuCi0gKgotICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKLSAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KLSAqLwotaW50IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgdmFsOwotCXVuc2lnbmVkIGludCBtYXNrOwogCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl2YWwgPSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0gPDwgZS0+c2hpZnRfbDsKLQltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXV0gPDwgZS0+c2hpZnRfcjsKLQkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7Ci0JfQorCXZhbCA9IChzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKIAotCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzX2xvY2tlZChjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCWlmICghc2lnbl9iaXQpCisJCXJldHVybiB2YWw7CisKKwkvKiBub24tbmVnYXRpdmUgbnVtYmVyICovCisJaWYgKCEodmFsICYgQklUKHNpZ25fYml0KSkpCisJCXJldHVybiB2YWw7CisKKwlyZXQgPSB2YWw7CisKKwkvKgorCSAqIFRoZSByZWdpc3RlciBtb3N0IHByb2JhYmx5IGRvZXMgbm90IGNvbnRhaW4gYSBmdWxsLXNpemVkIGludC4KKwkgKiBJbnN0ZWFkIHdlIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBiaXRzIGluIGEgc2lnbmVkCisJICogcmVwcmVzZW50YXRpb24gd2hpY2ggaGFzIHRvIGJlIHRyYW5zbGF0ZWQgaW50byBhIGZ1bGwtc2l6ZWQgaW50LgorCSAqIFRoaXMgaXMgZG9uZSBieSBmaWxsaW5nIHVwIGFsbCBiaXRzIGFib3ZlIHRoZSBzaWduLWJpdC4KKwkgKi8KKwlyZXQgfD0gfigoaW50KShCSVQoc2lnbl9iaXQpIC0gMSkpOworCisJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKTsKIAogLyoqCiAgKiBzbmRfc29jX2luZm9fdm9sc3cgLSBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjawpAQCAtMjc0Myw3ICsyNzE3LDcgQEAKIAogCXVpbmZvLT5jb3VudCA9IHNuZF9zb2Nfdm9sc3dfaXNfc3RlcmVvKG1jKSA/IDIgOiAxOwogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcGxhdGZvcm1fbWF4OworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHBsYXRmb3JtX21heCAtIG1jLT5taW47CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2luZm9fdm9sc3cpOwpAQCAtMjc2OSwxMSArMjc0MywxNiBAQAogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKKwlpbnQgbWluID0gbWMtPm1pbjsKKwlpbnQgc2lnbl9iaXQgPSBtYy0+c2lnbl9iaXQ7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwogCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwogCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKHNpZ25fYml0KQorCQltYXNrID0gQklUKHNpZ25fYml0ICsgMSkgLSAxOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzbmRfc29jX3JlYWRfc2lnbmVkKGNvZGVjLCByZWcsIG1hc2ssCisJCQlzaGlmdCwgc2lnbl9iaXQpIC0gbWluOwogCWlmIChpbnZlcnQpCiAJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KIAkJCW1heCAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwpAQCAtMjc4MSwxMCArMjc2MCwxMiBAQAogCWlmIChzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykpIHsKIAkJaWYgKHJlZyA9PSByZWcyKQogCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQotCQkJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gcnNoaWZ0KSAmIG1hc2s7CisJCQkJc25kX3NvY19yZWFkX3NpZ25lZChjb2RlYywgcmVnLCBtYXNrLCByc2hpZnQsCisJCQkJCQlzaWduX2JpdCkgLSBtaW47CiAJCWVsc2UKIAkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KLQkJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKSA+PiBzaGlmdCkgJiBtYXNrOworCQkJCXNuZF9zb2NfcmVhZF9zaWduZWQoY29kZWMsIHJlZzIsIG1hc2ssIHNoaWZ0LAorCQkJCQkJc2lnbl9iaXQpIC0gbWluOwogCQlpZiAoaW52ZXJ0KQogCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQogCQkJCW1heCAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwpAQCAtMjgxNSwyMCArMjc5NiwyNSBAQAogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKKwlpbnQgbWluID0gbWMtPm1pbjsKKwl1bnNpZ25lZCBpbnQgc2lnbl9iaXQgPSBtYy0+c2lnbl9iaXQ7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwogCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwogCWludCBlcnI7Ci0JYm9vbCB0eXBlXzJyID0gMDsKKwlib29sIHR5cGVfMnIgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQgdmFsMiA9IDA7CiAJdW5zaWduZWQgaW50IHZhbCwgdmFsX21hc2s7CiAKLQl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKKwlpZiAoc2lnbl9iaXQpCisJCW1hc2sgPSBCSVQoc2lnbl9iaXQgKyAxKSAtIDE7CisKKwl2YWwgPSAoKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgbWluKSAmIG1hc2spOwogCWlmIChpbnZlcnQpCiAJCXZhbCA9IG1heCAtIHZhbDsKIAl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CiAJdmFsID0gdmFsIDw8IHNoaWZ0OwogCWlmIChzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykpIHsKLQkJdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOworCQl2YWwyID0gKCh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSArIG1pbikgJiBtYXNrKTsKIAkJaWYgKGludmVydCkKIAkJCXZhbDIgPSBtYXggLSB2YWwyOwogCQlpZiAocmVnID09IHJlZzIpIHsKQEAgLTI4MzYsNyArMjgyMiw3IEBACiAJCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7CiAJCX0gZWxzZSB7CiAJCQl2YWwyID0gdmFsMiA8PCBzaGlmdDsKLQkJCXR5cGVfMnIgPSAxOworCQkJdHlwZV8yciA9IHRydWU7CiAJCX0KIAl9CiAJZXJyID0gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7CkBAIC0zMjM0LDcgKzMyMjAsNyBAQAogCXN0cnVjdCBzb2NfYnl0ZXMgKnBhcmFtcyA9ICh2b2lkICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCByZXQsIGxlbjsKLQl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CiAJdm9pZCAqZGF0YTsKIAogCWlmICghY29kZWMtPnVzaW5nX3JlZ21hcCkKQEAgLTMyNjQsMTIgKzMyNTAsMzYgQEAKIAkJCSgodTggKilkYXRhKVswXSB8PSB2YWw7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJKCh1MTYgKilkYXRhKVswXSAmPSBjcHVfdG9fYmUxNih+cGFyYW1zLT5tYXNrKTsKLQkJCSgodTE2ICopZGF0YSlbMF0gfD0gY3B1X3RvX2JlMTYodmFsKTsKKwkJCW1hc2sgPSB+cGFyYW1zLT5tYXNrOworCQkJcmV0ID0gcmVnbWFwX3BhcnNlX3ZhbChjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkJCSZtYXNrLCAmbWFzayk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZ290byBvdXQ7CisKKwkJCSgodTE2ICopZGF0YSlbMF0gJj0gbWFzazsKKworCQkJcmV0ID0gcmVnbWFwX3BhcnNlX3ZhbChjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkJCSZ2YWwsICZ2YWwpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gb3V0OworCisJCQkoKHUxNiAqKWRhdGEpWzBdIHw9IHZhbDsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQkoKHUzMiAqKWRhdGEpWzBdICY9IGNwdV90b19iZTMyKH5wYXJhbXMtPm1hc2spOwotCQkJKCh1MzIgKilkYXRhKVswXSB8PSBjcHVfdG9fYmUzMih2YWwpOworCQkJbWFzayA9IH5wYXJhbXMtPm1hc2s7CisJCQlyZXQgPSByZWdtYXBfcGFyc2VfdmFsKGNvZGVjLT5jb250cm9sX2RhdGEsCisJCQkJCQkJJm1hc2ssICZtYXNrKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlnb3RvIG91dDsKKworCQkJKCh1MzIgKilkYXRhKVswXSAmPSBtYXNrOworCisJCQlyZXQgPSByZWdtYXBfcGFyc2VfdmFsKGNvZGVjLT5jb250cm9sX2RhdGEsCisJCQkJCQkJJnZhbCwgJnZhbCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZ290byBvdXQ7CisKKwkJCSgodTMyICopZGF0YSlbMF0gfD0gdmFsOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzYwOSw2ICszNjE5LDMwIEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhaV9zZXRfZm10KTsKIAogLyoqCisgKiBzbmRfc29jX3hsYXRlX3RkbV9zbG90IC0gZ2VuZXJhdGUgdHgvcnggc2xvdCBtYXNrLgorICogQHNsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgaW4gdXNlLgorICogQHR4X21hc2s6IGJpdG1hc2sgcmVwcmVzZW50aW5nIGFjdGl2ZSBUWCBzbG90cy4KKyAqIEByeF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgUlggc2xvdHMuCisgKgorICogR2VuZXJhdGVzIHRoZSBURE0gdHggYW5kIHJ4IHNsb3QgZGVmYXVsdCBtYXNrcyBmb3IgREFJLgorICovCitzdGF0aWMgaW50IHNuZF9zb2NfeGxhdGVfdGRtX3Nsb3RfbWFzayh1bnNpZ25lZCBpbnQgc2xvdHMsCisJCQkJCSAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCQkgIHVuc2lnbmVkIGludCAqcnhfbWFzaykKK3sKKwlpZiAoKnR4X21hc2sgfHwgKnJ4X21hc2spCisJCXJldHVybiAwOworCisJaWYgKCFzbG90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqdHhfbWFzayA9ICgxIDw8IHNsb3RzKSAtIDE7CisJKnJ4X21hc2sgPSAoMSA8PCBzbG90cykgLSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogc25kX3NvY19kYWlfc2V0X3RkbV9zbG90IC0gY29uZmlndXJlIERBSSBURE0uCiAgKiBAZGFpOiBEQUkKICAqIEB0eF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgVFggc2xvdHMuCkBAIC0zNjIyLDExICszNjU2LDE3IEBACiBpbnQgc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAogCXVuc2lnbmVkIGludCB0eF9tYXNrLCB1bnNpZ25lZCBpbnQgcnhfbWFzaywgaW50IHNsb3RzLCBpbnQgc2xvdF93aWR0aCkKIHsKKwlpZiAoZGFpLT5kcml2ZXIgJiYgZGFpLT5kcml2ZXItPm9wcy0+eGxhdGVfdGRtX3Nsb3RfbWFzaykKKwkJZGFpLT5kcml2ZXItPm9wcy0+eGxhdGVfdGRtX3Nsb3RfbWFzayhzbG90cywKKwkJCQkJCSZ0eF9tYXNrLCAmcnhfbWFzayk7CisJZWxzZQorCQlzbmRfc29jX3hsYXRlX3RkbV9zbG90X21hc2soc2xvdHMsICZ0eF9tYXNrLCAmcnhfbWFzayk7CisKIAlpZiAoZGFpLT5kcml2ZXIgJiYgZGFpLT5kcml2ZXItPm9wcy0+c2V0X3RkbV9zbG90KQogCQlyZXR1cm4gZGFpLT5kcml2ZXItPm9wcy0+c2V0X3RkbV9zbG90KGRhaSwgdHhfbWFzaywgcnhfbWFzaywKIAkJCQlzbG90cywgc2xvdF93aWR0aCk7CiAJZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdCk7CiAKQEAgLTM4ODIsOTUgKzM5MjIsNDIgQEAKIH0KIAogLyoqCi0gKiBzbmRfc29jX3JlZ2lzdGVyX2RhaSAtIFJlZ2lzdGVyIGEgREFJIHdpdGggdGhlIEFTb0MgY29yZQorICogc25kX3NvY191bnJlZ2lzdGVyX2RhaSAtIFVucmVnaXN0ZXIgREFJcyBmcm9tIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAZGFpOiBEQUkgdG8gcmVnaXN0ZXIKKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgZm9yIHdoaWNoIHRoZSBEQUlzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKICAqLwotc3RhdGljIGludCBzbmRfc29jX3JlZ2lzdGVyX2RhaShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYpCitzdGF0aWMgdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWksICpfZGFpOwogCi0JZGV2X2RiZyhkZXYsICJBU29DOiBkYWkgcmVnaXN0ZXIgJXNcbiIsIGRldl9uYW1lKGRldikpOwotCi0JZGFpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRhaSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGNyZWF0ZSBEQUkgY29tcG9uZW50IG5hbWUgKi8KLQlkYWktPm5hbWUgPSBmbXRfc2luZ2xlX25hbWUoZGV2LCAmZGFpLT5pZCk7Ci0JaWYgKGRhaS0+bmFtZSA9PSBOVUxMKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRhaSwgX2RhaSwgJmNvbXBvbmVudC0+ZGFpX2xpc3QsIGxpc3QpIHsKKwkJZGV2X2RiZyhjb21wb25lbnQtPmRldiwgIkFTb0M6IFVucmVnaXN0ZXJlZCBEQUkgJyVzJ1xuIiwKKwkJCWRhaS0+bmFtZSk7CisJCWxpc3RfZGVsKCZkYWktPmxpc3QpOworCQlrZnJlZShkYWktPm5hbWUpOwogCQlrZnJlZShkYWkpOwotCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KLQlkYWktPmRldiA9IGRldjsKLQlkYWktPmRyaXZlciA9IGRhaV9kcnY7Ci0JZGFpLT5kYXBtLmRldiA9IGRldjsKLQlpZiAoIWRhaS0+ZHJpdmVyLT5vcHMpCi0JCWRhaS0+ZHJpdmVyLT5vcHMgPSAmbnVsbF9kYWlfb3BzOwotCi0JbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjb2RlY19saXN0LCBsaXN0KSB7Ci0JCWlmIChjb2RlYy0+ZGV2ID09IGRldikgewotCQkJZGV2X2RiZyhkZXYsICJBU29DOiBNYXBwZWQgREFJICVzIHRvIENPREVDICVzXG4iLAotCQkJCWRhaS0+bmFtZSwgY29kZWMtPm5hbWUpOwotCQkJZGFpLT5jb2RlYyA9IGNvZGVjOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWRhaS0+Y29kZWMpCi0JCWRhaS0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKLQotCWxpc3RfYWRkKCZkYWktPmxpc3QsICZkYWlfbGlzdCk7Ci0KLQltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7Ci0KLQlkZXZfZGJnKGRldiwgIkFTb0M6IFJlZ2lzdGVyZWQgREFJICclcydcbiIsIGRhaS0+bmFtZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBzbmRfc29jX3VucmVnaXN0ZXJfZGFpIC0gVW5yZWdpc3RlciBhIERBSSBmcm9tIHRoZSBBU29DIGNvcmUKKyAqIHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyAtIFJlZ2lzdGVyIGEgREFJIHdpdGggdGhlIEFTb0MgY29yZQogICoKLSAqIEBkYWk6IERBSSB0byB1bnJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZkYWlfbGlzdCwgbGlzdCkgewotCQlpZiAoZGV2ID09IGRhaS0+ZGV2KQotCQkJZ290byBmb3VuZDsKLQl9Ci0JcmV0dXJuOwotCi1mb3VuZDoKLQltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwotCWxpc3RfZGVsKCZkYWktPmxpc3QpOwotCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKLQotCWRldl9kYmcoZGV2LCAiQVNvQzogVW5yZWdpc3RlcmVkIERBSSAnJXMnXG4iLCBkYWktPm5hbWUpOwotCWtmcmVlKGRhaS0+bmFtZSk7Ci0Ja2ZyZWUoZGFpKTsKLX0KLQotLyoqCi0gKiBzbmRfc29jX3JlZ2lzdGVyX2RhaXMgLSBSZWdpc3RlciBtdWx0aXBsZSBEQUlzIHdpdGggdGhlIEFTb0MgY29yZQotICoKLSAqIEBkYWk6IEFycmF5IG9mIERBSXMgdG8gcmVnaXN0ZXIKKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgdGhlIERBSXMgYXJlIHJlZ2lzdGVyZWQgZm9yCisgKiBAY29kZWM6IFRoZSBDT0RFQyB0aGF0IHRoZSBEQUlzIGFyZSByZWdpc3RlcmVkIGZvciwgTlVMTCBpZiB0aGUgY29tcG9uZW50IGlzCisgKiAgICAgICAgIG5vdCBhIENPREVDLgorICogQGRhaV9kcnY6IERBSSBkcml2ZXIgdG8gdXNlIGZvciB0aGUgREFJcwogICogQGNvdW50OiBOdW1iZXIgb2YgREFJcworICogQGxlZ2FjeV9kYWlfbmFtaW5nOiBVc2UgdGhlIGxlZ2FjeSBuYW1pbmcgc2NoZW1lIGFuZCBsZXQgdGhlIERBSSBpbmhlcml0IHRoZQorICogICAgICAgICAgICAgICAgICAgICBwYXJlbnQncyBuYW1lLgogICovCi1zdGF0aWMgaW50IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgc25kX3NvY19yZWdpc3Rlcl9kYWlzKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50LAorCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydiwKKwlzaXplX3QgY291bnQsIGJvb2wgbGVnYWN5X2RhaV9uYW1pbmcpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbXBvbmVudC0+ZGV2OwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwotCWludCBpLCByZXQgPSAwOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CiAKIAlkZXZfZGJnKGRldiwgIkFTb0M6IGRhaSByZWdpc3RlciAlcyAjJVp1XG4iLCBkZXZfbmFtZShkZXYpLCBjb3VudCk7CiAKQEAgLTM5ODIsNzAgKzM5NjksNTQgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAKLQkJLyogY3JlYXRlIERBSSBjb21wb25lbnQgbmFtZSAqLwotCQlkYWktPm5hbWUgPSBmbXRfbXVsdGlwbGVfbmFtZShkZXYsICZkYWlfZHJ2W2ldKTsKKwkJLyoKKwkJICogQmFjayBpbiB0aGUgb2xkIGRheXMgd2hlbiB3ZSBzdGlsbCBoYWQgY29tcG9uZW50LWxlc3MgREFJcywKKwkJICogaW5zdGVhZCBvZiBoYXZpbmcgYSBzdGF0aWMgbmFtZSwgY29tcG9uZW50LWxlc3MgREFJcyB3b3VsZAorCQkgKiBpbmhlcml0IHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgZGV2aWNlIHNvIGl0IGlzIHBvc3NpYmxlIHRvCisJCSAqIHJlZ2lzdGVyIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgREFJLiBXZSBzdGlsbCBuZWVkIHRvIGtlZXAKKwkJICogdGhlIHNhbWUgbmFtaW5nIHN0eWxlIGV2ZW4gdGhvdWdoIHRob3NlIERBSXMgYXJlIG5vdAorCQkgKiBjb21wb25lbnQtbGVzcyBhbnltb3JlLgorCQkgKi8KKwkJaWYgKGNvdW50ID09IDEgJiYgbGVnYWN5X2RhaV9uYW1pbmcpIHsKKwkJCWRhaS0+bmFtZSA9IGZtdF9zaW5nbGVfbmFtZShkZXYsICZkYWktPmlkKTsKKwkJfSBlbHNlIHsKKwkJCWRhaS0+bmFtZSA9IGZtdF9tdWx0aXBsZV9uYW1lKGRldiwgJmRhaV9kcnZbaV0pOworCQkJaWYgKGRhaV9kcnZbaV0uaWQpCisJCQkJZGFpLT5pZCA9IGRhaV9kcnZbaV0uaWQ7CisJCQllbHNlCisJCQkJZGFpLT5pZCA9IGk7CisJCX0KIAkJaWYgKGRhaS0+bmFtZSA9PSBOVUxMKSB7CiAJCQlrZnJlZShkYWkpOwotCQkJcmV0ID0gLUVJTlZBTDsKKwkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycjsKIAkJfQogCisJCWRhaS0+Y29tcG9uZW50ID0gY29tcG9uZW50OworCQlkYWktPmNvZGVjID0gY29kZWM7CiAJCWRhaS0+ZGV2ID0gZGV2OwogCQlkYWktPmRyaXZlciA9ICZkYWlfZHJ2W2ldOwotCQlpZiAoZGFpLT5kcml2ZXItPmlkKQotCQkJZGFpLT5pZCA9IGRhaS0+ZHJpdmVyLT5pZDsKLQkJZWxzZQotCQkJZGFpLT5pZCA9IGk7CiAJCWRhaS0+ZGFwbS5kZXYgPSBkZXY7CiAJCWlmICghZGFpLT5kcml2ZXItPm9wcykKIAkJCWRhaS0+ZHJpdmVyLT5vcHMgPSAmbnVsbF9kYWlfb3BzOwogCi0JCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJCWlmIChjb2RlYy0+ZGV2ID09IGRldikgewotCQkJCWRldl9kYmcoZGV2LAotCQkJCQkiQVNvQzogTWFwcGVkIERBSSAlcyB0byBDT0RFQyAlc1xuIiwKLQkJCQkJZGFpLT5uYW1lLCBjb2RlYy0+bmFtZSk7Ci0JCQkJZGFpLT5jb2RlYyA9IGNvZGVjOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KIAkJaWYgKCFkYWktPmNvZGVjKQogCQkJZGFpLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOwogCi0JCWxpc3RfYWRkKCZkYWktPmxpc3QsICZkYWlfbGlzdCk7CisJCWxpc3RfYWRkKCZkYWktPmxpc3QsICZjb21wb25lbnQtPmRhaV9saXN0KTsKIAotCQltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7Ci0KLQkJZGV2X2RiZyhkYWktPmRldiwgIkFTb0M6IFJlZ2lzdGVyZWQgREFJICclcydcbiIsIGRhaS0+bmFtZSk7CisJCWRldl9kYmcoZGV2LCAiQVNvQzogUmVnaXN0ZXJlZCBEQUkgJyVzJ1xuIiwgZGFpLT5uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKIAogZXJyOgotCWZvciAoaS0tOyBpID49IDA7IGktLSkKLQkJc25kX3NvY191bnJlZ2lzdGVyX2RhaShkZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKGNvbXBvbmVudCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzIC0gVW5yZWdpc3RlciBtdWx0aXBsZSBEQUlzIGZyb20gdGhlIEFTb0MgY29yZQotICoKLSAqIEBkYWk6IEFycmF5IG9mIERBSXMgdG8gdW5yZWdpc3RlcgotICogQGNvdW50OiBOdW1iZXIgb2YgREFJcwotICovCi1zdGF0aWMgdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKGRldik7Ci19Ci0KLS8qKgogICogc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQgLSBSZWdpc3RlciBhIGNvbXBvbmVudCB3aXRoIHRoZSBBU29DIGNvcmUKICAqCiAgKi8KQEAgLTQwNTMsNiArNDAyNCw3IEBACiBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjbXBudCwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciAqY21wbnRfZHJ2LAorCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsCiAJCQkgICAgIGludCBudW1fZGFpLCBib29sIGFsbG93X3NpbmdsZV9kYWkpCiB7CkBAIC00MDc1LDIwICs0MDQ3LDEwIEBACiAJY21wbnQtPmRyaXZlcgk9IGNtcG50X2RydjsKIAljbXBudC0+ZGFpX2Rydgk9IGRhaV9kcnY7CiAJY21wbnQtPm51bV9kYWkJPSBudW1fZGFpOworCUlOSVRfTElTVF9IRUFEKCZjbXBudC0+ZGFpX2xpc3QpOwogCi0JLyoKLQkgKiBzbmRfc29jX3JlZ2lzdGVyX2RhaSgpICB1c2VzIGZtdF9zaW5nbGVfbmFtZSgpLCBhbmQKLQkgKiBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoKSB1c2VzIGZtdF9tdWx0aXBsZV9uYW1lKCkKLQkgKiBmb3IgZGFpLT5uYW1lIHdoaWNoIGlzIHVzZWQgZm9yIG5hbWUgYmFzZWQgbWF0Y2hpbmcKLQkgKgotCSAqIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIGNwdS9jb2RlYy4KLQkgKiBhbGxvd19zaW5nbGVfZGFpIGZsYWcgY2FuIGlnbm9yZSAiY29kZWMiIGRyaXZlciByZXdvcmtpbmcKLQkgKiBzaW5jZSBpdCBoYWQgYmVlbiB1c2VkIHNuZF9zb2NfcmVnaXN0ZXJfZGFpcygpLAotCSAqLwotCWlmICgoMSA9PSBudW1fZGFpKSAmJiBhbGxvd19zaW5nbGVfZGFpKQotCQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaShkZXYsIGRhaV9kcnYpOwotCWVsc2UKLQkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWlzKGRldiwgZGFpX2RydiwgbnVtX2RhaSk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWlzKGNtcG50LCBjb2RlYywgZGFpX2RydiwgbnVtX2RhaSwKKwkJYWxsb3dfc2luZ2xlX2RhaSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJBU29DOiBGYWlsZWQgdG8gcmVnc3RlciBEQUlzOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJvcl9jb21wb25lbnRfbmFtZTsKQEAgLTQxMjEsNyArNDA4Myw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXJldHVybiBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KGRldiwgY21wbnQsIGNtcG50X2RydiwKKwljbXBudC0+aWdub3JlX3BtZG93bl90aW1lID0gdHJ1ZTsKKworCXJldHVybiBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KGRldiwgY21wbnQsIGNtcG50X2RydiwgTlVMTCwKIAkJCQkJICAgIGRhaV9kcnYsIG51bV9kYWksIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQpOwpAQCAtNDE0MSw3ICs0MTA1LDcgQEAKIAlyZXR1cm47CiAKIGZvdW5kOgotCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKGRldiwgY21wbnQtPm51bV9kYWkpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKGNtcG50KTsKIAogCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CiAJbGlzdF9kZWwoJmNtcG50LT5saXN0KTsKQEAgLTQzMTksNyArNDI4Myw3IEBACiAJY29kZWMtPnZvbGF0aWxlX3JlZ2lzdGVyID0gY29kZWNfZHJ2LT52b2xhdGlsZV9yZWdpc3RlcjsKIAljb2RlYy0+cmVhZGFibGVfcmVnaXN0ZXIgPSBjb2RlY19kcnYtPnJlYWRhYmxlX3JlZ2lzdGVyOwogCWNvZGVjLT53cml0YWJsZV9yZWdpc3RlciA9IGNvZGVjX2Rydi0+d3JpdGFibGVfcmVnaXN0ZXI7Ci0JY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSA9IGNvZGVjX2Rydi0+aWdub3JlX3BtZG93bl90aW1lOworCWNvZGVjLT5jb21wb25lbnQuaWdub3JlX3BtZG93bl90aW1lID0gY29kZWNfZHJ2LT5pZ25vcmVfcG1kb3duX3RpbWU7CiAJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY29kZWMtPmRhcG0uZGV2ID0gZGV2OwogCWNvZGVjLT5kYXBtLmNvZGVjID0gY29kZWM7CkBAIC00MzQyLDcgKzQzMDYsNyBAQAogCS8qIHJlZ2lzdGVyIGNvbXBvbmVudCAqLwogCXJldCA9IF9fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoZGV2LCAmY29kZWMtPmNvbXBvbmVudCwKIAkJCQkJICAgJmNvZGVjX2Rydi0+Y29tcG9uZW50X2RyaXZlciwKLQkJCQkJICAgZGFpX2RydiwgbnVtX2RhaSwgZmFsc2UpOworCQkJCQkgICBjb2RlYywgZGFpX2RydiwgbnVtX2RhaSwgZmFsc2UpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkFTb0M6IEZhaWxlZCB0byByZWdzdGVyIGNvbXBvbmVudDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZmFpbF9jb2RlY19uYW1lOwpAQCAtNDQxNyw2ICs0MzgxLDEyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2ltcGxlX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWNyb3Bob25lIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK2ludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCisJCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNhcmQtPmRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0czsKKwljb25zdCBjaGFyICp0ZW1wbGF0ZSwgKnduYW1lOworCWludCBpLCBqLCBudW1fd2lkZ2V0cywgcmV0OworCisJbnVtX3dpZGdldHMgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG5wLCBwcm9wbmFtZSk7CisJaWYgKG51bV93aWRnZXRzIDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJBU29DOiBQcm9wZXJ0eSAnJXMnIGRvZXMgbm90IGV4aXN0XG4iLAlwcm9wbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobnVtX3dpZGdldHMgJiAxKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkFTb0M6IFByb3BlcnR5ICclcycgbGVuZ3RoIGlzIG5vdCBldmVuXG4iLCBwcm9wbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW51bV93aWRnZXRzIC89IDI7CisJaWYgKCFudW1fd2lkZ2V0cykgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFTb0M6IFByb3BlcnR5ICclcydzIGxlbmd0aCBpcyB6ZXJvXG4iLAorCQkJcHJvcG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3aWRnZXRzID0gZGV2bV9rY2FsbG9jKGNhcmQtPmRldiwgbnVtX3dpZGdldHMsIHNpemVvZigqd2lkZ2V0cyksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCF3aWRnZXRzKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkFTb0M6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpZGdldHNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3dpZGdldHM7IGkrKykgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgcHJvcG5hbWUsCisJCQkyICogaSwgJnRlbXBsYXRlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkFTb0M6IFByb3BlcnR5ICclcycgaW5kZXggJWQgcmVhZCBlcnJvcjolZFxuIiwKKwkJCQlwcm9wbmFtZSwgMiAqIGksIHJldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHNpbXBsZV93aWRnZXRzKTsgaisrKSB7CisJCQlpZiAoIXN0cm5jbXAodGVtcGxhdGUsIHNpbXBsZV93aWRnZXRzW2pdLm5hbWUsCisJCQkJICAgICBzdHJsZW4oc2ltcGxlX3dpZGdldHNbal0ubmFtZSkpKSB7CisJCQkJd2lkZ2V0c1tpXSA9IHNpbXBsZV93aWRnZXRzW2pdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGogPj0gQVJSQVlfU0laRShzaW1wbGVfd2lkZ2V0cykpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJBU29DOiBEQVBNIHdpZGdldCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJdGVtcGxhdGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgcHJvcG5hbWUsCisJCQkJCQkgICAgKDIgKiBpKSArIDEsCisJCQkJCQkgICAgJnduYW1lKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkFTb0M6IFByb3BlcnR5ICclcycgaW5kZXggJWQgcmVhZCBlcnJvcjolZFxuIiwKKwkJCQlwcm9wbmFtZSwgKDIgKiBpKSArIDEsIHJldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXdpZGdldHNbaV0ubmFtZSA9IHduYW1lOworCX0KKworCWNhcmQtPmRhcG1fd2lkZ2V0cyA9IHdpZGdldHM7CisJY2FyZC0+bnVtX2RhcG1fd2lkZ2V0cyA9IG51bV93aWRnZXRzOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKTsKKworaW50IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3Qoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqc2xvdHMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNsb3Rfd2lkdGgpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImRhaS10ZG0tc2xvdC1udW0iKSkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImRhaS10ZG0tc2xvdC1udW0iLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHNsb3RzKQorCQkJKnNsb3RzID0gdmFsOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkYWktdGRtLXNsb3Qtd2lkdGgiKSkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImRhaS10ZG0tc2xvdC13aWR0aCIsICZ2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoc2xvdF93aWR0aCkKKwkJCSpzbG90X3dpZHRoID0gdmFsOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdCk7CisKIGludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggYjlkYzZhYy4uYzhhNzgwZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTcwLDggKzcwLDYgQEAKIAlbc25kX3NvY19kYXBtX2FpZl9vdXRdID0gNCwKIAlbc25kX3NvY19kYXBtX21pY10gPSA1LAogCVtzbmRfc29jX2RhcG1fbXV4XSA9IDYsCi0JW3NuZF9zb2NfZGFwbV92aXJ0X211eF0gPSA2LAotCVtzbmRfc29jX2RhcG1fdmFsdWVfbXV4XSA9IDYsCiAJW3NuZF9zb2NfZGFwbV9kYWNdID0gNywKIAlbc25kX3NvY19kYXBtX3N3aXRjaF0gPSA4LAogCVtzbmRfc29jX2RhcG1fbWl4ZXJdID0gOCwKQEAgLTEwMiw4ICsxMDAsNiBAQAogCVtzbmRfc29jX2RhcG1fbWljXSA9IDcsCiAJW3NuZF9zb2NfZGFwbV9taWNiaWFzXSA9IDgsCiAJW3NuZF9zb2NfZGFwbV9tdXhdID0gOSwKLQlbc25kX3NvY19kYXBtX3ZpcnRfbXV4XSA9IDksCi0JW3NuZF9zb2NfZGFwbV92YWx1ZV9tdXhdID0gOSwKIAlbc25kX3NvY19kYXBtX2FpZl9pbl0gPSAxMCwKIAlbc25kX3NvY19kYXBtX2FpZl9vdXRdID0gMTAsCiAJW3NuZF9zb2NfZGFwbV9kYWlfaW5dID0gMTAsCkBAIC0xMTUsNiArMTExLDEyIEBACiAJW3NuZF9zb2NfZGFwbV9wb3N0XSA9IDE0LAogfTsKIAorc3RhdGljIHZvaWQgZGFwbV9hc3NlcnRfbG9ja2VkKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKK3sKKwlpZiAoZGFwbS0+Y2FyZCAmJiBkYXBtLT5jYXJkLT5pbnN0YW50aWF0ZWQpCisJCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmRhcG0tPmNhcmQtPmRhcG1fbXV0ZXgpOworfQorCiBzdGF0aWMgdm9pZCBwb3Bfd2FpdCh1MzIgcG9wX3RpbWUpCiB7CiAJaWYgKHBvcF90aW1lKQpAQCAtMTQ2LDE1ICsxNDgsMTYgQEAKIAlyZXR1cm4gIWxpc3RfZW1wdHkoJnctPmRpcnR5KTsKIH0KIAotdm9pZCBkYXBtX21hcmtfZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3N0YXRpYyB2b2lkIGRhcG1fbWFya19kaXJ0eShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgY29uc3QgY2hhciAqcmVhc29uKQogeworCWRhcG1fYXNzZXJ0X2xvY2tlZCh3LT5kYXBtKTsKKwogCWlmICghZGFwbV9kaXJ0eV93aWRnZXQodykpIHsKIAkJZGV2X3ZkYmcody0+ZGFwbS0+ZGV2LCAiTWFya2luZyAlcyBkaXJ0eSBkdWUgdG8gJXNcbiIsCiAJCQkgdy0+bmFtZSwgcmVhc29uKTsKIAkJbGlzdF9hZGRfdGFpbCgmdy0+ZGlydHksICZ3LT5kYXBtLT5jYXJkLT5kYXBtX2RpcnR5KTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChkYXBtX21hcmtfZGlydHkpOwogCiB2b2lkIGRhcG1fbWFya19pb19kaXJ0eShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CkBAIC0zNjEsNiArMzY0LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhcmQtPmRhcG1fbXV0ZXgpOworCiAJbWVtc2V0KCZjYXJkLT5kYXBtX3N0YXRzLCAwLCBzaXplb2YoY2FyZC0+ZGFwbV9zdGF0cykpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY2FyZC0+d2lkZ2V0cywgbGlzdCkgewpAQCAtMzg2LDcgKzM5MSw4IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IHNvY193aWRnZXRfd3JpdGUoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCByZWcsIGludCB2YWwpCitzdGF0aWMgaW50IHNvY193aWRnZXRfd3JpdGUoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCByZWcsCisJdW5zaWduZWQgaW50IHZhbCkKIHsKIAlpZiAody0+Y29kZWMpCiAJCXJldHVybiBzbmRfc29jX3dyaXRlKHctPmNvZGVjLCByZWcsIHZhbCk7CkBAIC00OTgsMTE1ICs1MDQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIHNldCB1cCBpbml0aWFsIGNvZGVjIHBhdGhzICovCi1zdGF0aWMgdm9pZCBkYXBtX3NldF9wYXRoX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnAsIGludCBpKQotewotCXN3aXRjaCAody0+aWQpIHsKLQljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOiB7Ci0JCWludCB2YWw7Ci0JCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPSAoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopCi0JCQl3LT5rY29udHJvbF9uZXdzW2ldLnByaXZhdGVfdmFsdWU7Ci0JCWludCByZWcgPSBtYy0+cmVnOwotCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7Ci0JCWludCBtYXggPSBtYy0+bWF4OwotCQl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwotCi0JCWlmIChyZWcgIT0gU05EX1NPQ19OT1BNKSB7Ci0JCQlzb2Nfd2lkZ2V0X3JlYWQodywgcmVnLCAmdmFsKTsKLQkJCXZhbCA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKLQkJCWlmIChpbnZlcnQpCi0JCQkJdmFsID0gbWF4IC0gdmFsOwotCQkJcC0+Y29ubmVjdCA9ICEhdmFsOwotCQl9IGVsc2UgewotCQkJcC0+Y29ubmVjdCA9IDA7Ci0JCX0KLQotCX0KLQlicmVhazsKLQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6IHsKLQkJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKQotCQkJdy0+a2NvbnRyb2xfbmV3c1tpXS5wcml2YXRlX3ZhbHVlOwotCQlpbnQgdmFsLCBpdGVtOwotCi0JCXNvY193aWRnZXRfcmVhZCh3LCBlLT5yZWcsICZ2YWwpOwotCQlpdGVtID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7Ci0KLQkJaWYgKGl0ZW0gPCBlLT5tYXggJiYgIXN0cmNtcChwLT5uYW1lLCBlLT50ZXh0c1tpdGVtXSkpCi0JCQlwLT5jb25uZWN0ID0gMTsKLQkJZWxzZQotCQkJcC0+Y29ubmVjdCA9IDA7Ci0JfQotCWJyZWFrOwotCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OiB7Ci0JCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKikKLQkJCXctPmtjb250cm9sX25ld3NbaV0ucHJpdmF0ZV92YWx1ZTsKLQotCQlwLT5jb25uZWN0ID0gMDsKLQkJLyogc2luY2UgYSB2aXJ0dWFsIG11eCBoYXMgbm8gYmFja2luZyByZWdpc3RlcnMgdG8KLQkJICogZGVjaWRlIHdoaWNoIHBhdGggdG8gY29ubmVjdCwgaXQgd2lsbCB0cnkgdG8gbWF0Y2gKLQkJICogd2l0aCB0aGUgZmlyc3QgZW51bWVyYXRpb24uICBUaGlzIGlzIHRvIGVuc3VyZQotCQkgKiB0aGF0IHRoZSBkZWZhdWx0IG11eCBjaG9pY2UgKHRoZSBmaXJzdCkgd2lsbCBiZQotCQkgKiBjb3JyZWN0bHkgcG93ZXJlZCB1cCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0JCSAqLwotCQlpZiAoIXN0cmNtcChwLT5uYW1lLCBlLT50ZXh0c1swXSkpCi0JCQlwLT5jb25uZWN0ID0gMTsKLQl9Ci0JYnJlYWs7Ci0JY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OiB7Ci0JCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKikKLQkJCXctPmtjb250cm9sX25ld3NbaV0ucHJpdmF0ZV92YWx1ZTsKLQkJaW50IHZhbCwgaXRlbTsKLQotCQlzb2Nfd2lkZ2V0X3JlYWQodywgZS0+cmVnLCAmdmFsKTsKLQkJdmFsID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7Ci0JCWZvciAoaXRlbSA9IDA7IGl0ZW0gPCBlLT5tYXg7IGl0ZW0rKykgewotCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbaXRlbV0pCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaXRlbSA8IGUtPm1heCAmJiAhc3RyY21wKHAtPm5hbWUsIGUtPnRleHRzW2l0ZW1dKSkKLQkJCXAtPmNvbm5lY3QgPSAxOwotCQllbHNlCi0JCQlwLT5jb25uZWN0ID0gMDsKLQl9Ci0JYnJlYWs7Ci0JLyogZG9lcyBub3QgYWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCi0JY2FzZSBzbmRfc29jX2RhcG1fcGdhOgotCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6Ci0JY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgotCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKLQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKLQljYXNlIHNuZF9zb2NfZGFwbV9zaWdnZW46Ci0JY2FzZSBzbmRfc29jX2RhcG1fZGFjOgotCWNhc2Ugc25kX3NvY19kYXBtX21pY2JpYXM6Ci0JY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKLQljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6Ci0JY2FzZSBzbmRfc29jX2RhcG1fcmVndWxhdG9yX3N1cHBseToKLQljYXNlIHNuZF9zb2NfZGFwbV9jbG9ja19zdXBwbHk6Ci0JY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgotCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JY2FzZSBzbmRfc29jX2RhcG1fZGFpX2luOgotCWNhc2Ugc25kX3NvY19kYXBtX2RhaV9vdXQ6Ci0JY2FzZSBzbmRfc29jX2RhcG1faHA6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbWljOgotCWNhc2Ugc25kX3NvY19kYXBtX3NwazoKLQljYXNlIHNuZF9zb2NfZGFwbV9saW5lOgotCWNhc2Ugc25kX3NvY19kYXBtX2RhaV9saW5rOgotCWNhc2Ugc25kX3NvY19kYXBtX2tjb250cm9sOgotCQlwLT5jb25uZWN0ID0gMTsKLQlicmVhazsKLQkvKiBkb2VzIGFmZmVjdCByb3V0aW5nIC0gZHluYW1pY2FsbHkgY29ubmVjdGVkICovCi0JY2FzZSBzbmRfc29jX2RhcG1fcHJlOgotCWNhc2Ugc25kX3NvY19kYXBtX3Bvc3Q6Ci0JCXAtPmNvbm5lY3QgPSAwOwotCWJyZWFrOwotCX0KLX0KLQogLyogY29ubmVjdCBtdXggd2lkZ2V0IHRvIGl0cyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KIHN0YXRpYyBpbnQgZGFwbV9jb25uZWN0X211eChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCkBAIC02MTQsMTUgKzUxMSwzMyBAQAogCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbCkKIHsKIAlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHZhbCwgaXRlbTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlLT5tYXg7IGkrKykgeworCWlmIChlLT5yZWcgIT0gU05EX1NPQ19OT1BNKSB7CisJCXNvY193aWRnZXRfcmVhZChkZXN0LCBlLT5yZWcsICZ2YWwpOworCQl2YWwgPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwkJaXRlbSA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOworCX0gZWxzZSB7CisJCS8qIHNpbmNlIGEgdmlydHVhbCBtdXggaGFzIG5vIGJhY2tpbmcgcmVnaXN0ZXJzIHRvCisJCSAqIGRlY2lkZSB3aGljaCBwYXRoIHRvIGNvbm5lY3QsIGl0IHdpbGwgdHJ5IHRvIG1hdGNoCisJCSAqIHdpdGggdGhlIGZpcnN0IGVudW1lcmF0aW9uLiAgVGhpcyBpcyB0byBlbnN1cmUKKwkJICogdGhhdCB0aGUgZGVmYXVsdCBtdXggY2hvaWNlICh0aGUgZmlyc3QpIHdpbGwgYmUKKwkJICogY29ycmVjdGx5IHBvd2VyZWQgdXAgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKwkJaXRlbSA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGUtPml0ZW1zOyBpKyspIHsKIAkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgewogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZkYXBtLT5jYXJkLT5wYXRocyk7CiAJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CiAJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKIAkJCXBhdGgtPm5hbWUgPSAoY2hhciopZS0+dGV4dHNbaV07Ci0JCQlkYXBtX3NldF9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCAwKTsKKwkJCWlmIChpID09IGl0ZW0pCisJCQkJcGF0aC0+Y29ubmVjdCA9IDE7CisJCQllbHNlCisJCQkJcGF0aC0+Y29ubmVjdCA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTYzMCw2ICs1NDUsMzAgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorLyogc2V0IHVwIGluaXRpYWwgY29kZWMgcGF0aHMgKi8KK3N0YXRpYyB2b2lkIGRhcG1fc2V0X21peGVyX3BhdGhfc3RhdHVzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcCwgaW50IGkpCit7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9IChzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKikKKwkJdy0+a2NvbnRyb2xfbmV3c1tpXS5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CisJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChyZWcgIT0gU05EX1NPQ19OT1BNKSB7CisJCXNvY193aWRnZXRfcmVhZCh3LCByZWcsICZ2YWwpOworCQl2YWwgPSAodmFsID4+IHNoaWZ0KSAmIG1hc2s7CisJCWlmIChpbnZlcnQpCisJCQl2YWwgPSBtYXggLSB2YWw7CisJCXAtPmNvbm5lY3QgPSAhIXZhbDsKKwl9IGVsc2UgeworCQlwLT5jb25uZWN0ID0gMDsKKwl9Cit9CisKIC8qIGNvbm5lY3QgbWl4ZXIgd2lkZ2V0IHRvIGl0cyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KIHN0YXRpYyBpbnQgZGFwbV9jb25uZWN0X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKQEAgLTY0NCw3ICs1ODMsNyBAQAogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJmRlc3QtPnNvdXJjZXMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmc3JjLT5zaW5rcyk7CiAJCQlwYXRoLT5uYW1lID0gZGVzdC0+a2NvbnRyb2xfbmV3c1tpXS5uYW1lOwotCQkJZGFwbV9zZXRfcGF0aF9zdGF0dXMoZGVzdCwgcGF0aCwgaSk7CisJCQlkYXBtX3NldF9taXhlcl9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCBpKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNzIzLDggKzY2Miw2IEBACiAJCQkJa2NuYW1lX2luX2xvbmdfbmFtZSA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6Ci0JCQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQkJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCQl3bmFtZV9pbl9sb25nX25hbWUgPSB0cnVlOwogCQkJCWtjbmFtZV9pbl9sb25nX25hbWUgPSBmYWxzZTsKIAkJCQlicmVhazsKQEAgLTE4MjMsNiArMTc2MCw4IEBACiAJQVNZTkNfRE9NQUlOX0VYQ0xVU0lWRShhc3luY19kb21haW4pOwogCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGJpYXM7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYXJkLT5kYXBtX211dGV4KTsKKwogCXRyYWNlX3NuZF9zb2NfZGFwbV9zdGFydChjYXJkKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgewpAQCAtMTg5NywxMCArMTgzNiwxNCBAQAogCiAJdHJhY2Vfc25kX3NvY19kYXBtX3dhbGtfZG9uZShjYXJkKTsKIAotCS8qIFJ1biBhbGwgdGhlIGJpYXMgY2hhbmdlcyBpbiBwYXJhbGxlbCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkKLQkJYXN5bmNfc2NoZWR1bGVfZG9tYWluKGRhcG1fcHJlX3NlcXVlbmNlX2FzeW5jLCBkLAotCQkJCQkmYXN5bmNfZG9tYWluKTsKKwkvKiBSdW4gY2FyZCBiaWFzIGNoYW5nZXMgYXQgZmlyc3QgKi8KKwlkYXBtX3ByZV9zZXF1ZW5jZV9hc3luYygmY2FyZC0+ZGFwbSwgMCk7CisJLyogUnVuIG90aGVyIGJpYXMgY2hhbmdlcyBpbiBwYXJhbGxlbCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgeworCQlpZiAoZCAhPSAmY2FyZC0+ZGFwbSkKKwkJCWFzeW5jX3NjaGVkdWxlX2RvbWFpbihkYXBtX3ByZV9zZXF1ZW5jZV9hc3luYywgZCwKKwkJCQkJCSZhc3luY19kb21haW4pOworCX0KIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsX2RvbWFpbigmYXN5bmNfZG9tYWluKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmRvd25fbGlzdCwgcG93ZXJfbGlzdCkgewpAQCAtMTkyMCwxMCArMTg2MywxNCBAQAogCWRhcG1fc2VxX3J1bihjYXJkLCAmdXBfbGlzdCwgZXZlbnQsIHRydWUpOwogCiAJLyogUnVuIGFsbCB0aGUgYmlhcyBjaGFuZ2VzIGluIHBhcmFsbGVsICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQotCQlhc3luY19zY2hlZHVsZV9kb21haW4oZGFwbV9wb3N0X3NlcXVlbmNlX2FzeW5jLCBkLAotCQkJCQkmYXN5bmNfZG9tYWluKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGQgIT0gJmNhcmQtPmRhcG0pCisJCQlhc3luY19zY2hlZHVsZV9kb21haW4oZGFwbV9wb3N0X3NlcXVlbmNlX2FzeW5jLCBkLAorCQkJCQkJJmFzeW5jX2RvbWFpbik7CisJfQogCWFzeW5jX3N5bmNocm9uaXplX2Z1bGxfZG9tYWluKCZhc3luY19kb21haW4pOworCS8qIFJ1biBjYXJkIGJpYXMgY2hhbmdlcyBhdCBsYXN0ICovCisJZGFwbV9wb3N0X3NlcXVlbmNlX2FzeW5jKCZjYXJkLT5kYXBtLCAwKTsKIAogCS8qIGRvIHdlIG5lZWQgdG8gbm90aWZ5IGFueSBjbGllbnRzIHRoYXQgREFQTSBldmVudCBpcyBjb21wbGV0ZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgewpAQCAtMjExMCw2ICsyMDU3LDggQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CiAJaW50IGZvdW5kID0gMDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhcmQtPmRhcG1fbXV0ZXgpOworCiAJLyogZmluZCBkYXBtIHdpZGdldCBwYXRoIGFzc29jIHdpdGgga2NvbnRyb2wgKi8KIAlkYXBtX2tjb250cm9sX2Zvcl9lYWNoX3BhdGgocGF0aCwga2NvbnRyb2wpIHsKIAkJaWYgKCFwYXRoLT5uYW1lIHx8ICFlLT50ZXh0c1ttdXhdKQpAQCAtMjE2MCw2ICsyMTA5LDggQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CiAJaW50IGZvdW5kID0gMDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhcmQtPmRhcG1fbXV0ZXgpOworCiAJLyogZmluZCBkYXBtIHdpZGdldCBwYXRoIGFzc29jIHdpdGgga2NvbnRyb2wgKi8KIAlkYXBtX2tjb250cm9sX2Zvcl9lYWNoX3BhdGgocGF0aCwga2NvbnRyb2wpIHsKIAkJZm91bmQgPSAxOwpAQCAtMjMyNSw2ICsyMjc2LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdyA9IGRhcG1fZmluZF93aWRnZXQoZGFwbSwgcGluLCB0cnVlKTsKIAorCWRhcG1fYXNzZXJ0X2xvY2tlZChkYXBtKTsKKwogCWlmICghdykgewogCQlkZXZfZXJyKGRhcG0tPmRldiwgIkFTb0M6IERBUE0gdW5rbm93biBwaW4gJXNcbiIsIHBpbik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjM0MSw2ICsyMjk0LDMwIEBACiB9CiAKIC8qKgorICogc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQgLSBzY2FuIGFuZCBwb3dlciBkYXBtIHBhdGhzCisgKiBAZGFwbTogREFQTSBjb250ZXh0CisgKgorICogV2Fsa3MgYWxsIGRhcG0gYXVkaW8gcGF0aHMgYW5kIHBvd2VycyB3aWRnZXRzIGFjY29yZGluZyB0byB0aGVpcgorICogc3RyZWFtIG9yIHBhdGggdXNhZ2UuCisgKgorICogUmVxdWlyZXMgZXh0ZXJuYWwgbG9ja2luZy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJLyoKKwkgKiBTdXBwcmVzcyBlYXJseSByZXBvcnRzIChlZywgamFja3Mgc3luY2luZyB0aGVpciBzdGF0ZSkgdG8gYXZvaWQKKwkgKiBzaWxseSBEQVBNIHJ1bnMgZHVyaW5nIGNhcmQgc3RhcnR1cC4KKwkgKi8KKwlpZiAoIWRhcG0tPmNhcmQgfHwgIWRhcG0tPmNhcmQtPmluc3RhbnRpYXRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGFwbV9wb3dlcl93aWRnZXRzKGRhcG0tPmNhcmQsIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKTsKKworLyoqCiAgKiBzbmRfc29jX2RhcG1fc3luYyAtIHNjYW4gYW5kIHBvd2VyIGRhcG0gcGF0aHMKICAqIEBkYXBtOiBEQVBNIGNvbnRleHQKICAqCkBAIC0yMzUzLDE1ICsyMzMwLDggQEAKIHsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBTdXBwcmVzcyBlYXJseSByZXBvcnRzIChlZywgamFja3Mgc3luY2luZyB0aGVpciBzdGF0ZSkgdG8gYXZvaWQKLQkgKiBzaWxseSBEQVBNIHJ1bnMgZHVyaW5nIGNhcmQgc3RhcnR1cC4KLQkgKi8KLQlpZiAoIWRhcG0tPmNhcmQgfHwgIWRhcG0tPmNhcmQtPmluc3RhbnRpYXRlZCkKLQkJcmV0dXJuIDA7Ci0KIAltdXRleF9sb2NrX25lc3RlZCgmZGFwbS0+Y2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwotCXJldCA9IGRhcG1fcG93ZXJfd2lkZ2V0cyhkYXBtLT5jYXJkLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJcmV0ID0gc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXBtLT5jYXJkLT5kYXBtX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ0NCw4ICsyNDE0LDYgQEAKIAkJcGF0aC0+Y29ubmVjdCA9IDE7CiAJCXJldHVybiAwOwogCWNhc2Ugc25kX3NvY19kYXBtX211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCXJldCA9IGRhcG1fY29ubmVjdF9tdXgoZGFwbSwgd3NvdXJjZSwgd3NpbmssIHBhdGgsIGNvbnRyb2wsCiAJCQkmd3NpbmstPmtjb250cm9sX25ld3NbMF0pOwogCQlpZiAocmV0ICE9IDApCkBAIC0yNzcyLDggKzI3NDAsNiBAQAogCQkJZGFwbV9uZXdfbWl4ZXIodyk7CiAJCQlicmVhazsKIAkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgotCQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQkJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQkJZGFwbV9uZXdfbXV4KHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKQEAgLTI5MzUsMTMgKzI5MDEsMjAgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCByZWdfdmFsLCB2YWw7CiAKLQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPQotCQkJKHZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CisJaWYgKGUtPnJlZyAhPSBTTkRfU09DX05PUE0pCisJCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7CisJZWxzZQorCQlyZWdfdmFsID0gZGFwbV9rY29udHJvbF9nZXRfdmFsdWUoa2NvbnRyb2wpOworCisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKKwkJdmFsID0gc25kX3NvY19lbnVtX3ZhbF90b19pdGVtKGUsIHZhbCk7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPSB2YWw7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTYyLDM0ICsyOTM1LDQxIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7CiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwsIG11eCwgY2hhbmdlOworCXVuc2lnbmVkIGludCAqaXRlbSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CisJdW5zaWduZWQgaW50IHZhbCwgY2hhbmdlOwogCXVuc2lnbmVkIGludCBtYXNrOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlIHVwZGF0ZTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKKwlpZiAoaXRlbVswXSA+PSBlLT5pdGVtcykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQl2YWwgPSBtdXggPDwgZS0+c2hpZnRfbDsKKworCXZhbCA9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzBdKSA8PCBlLT5zaGlmdF9sOwogCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCWlmIChpdGVtWzFdID4gZS0+aXRlbXMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJdmFsIHw9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPDwgZS0+c2hpZnRfcjsKKwkJdmFsIHw9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzFdKSA8PCBlLT5zaGlmdF9sOwogCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKIAl9CiAKIAltdXRleF9sb2NrX25lc3RlZCgmY2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwogCi0JY2hhbmdlID0gc25kX3NvY190ZXN0X2JpdHMoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKLQlpZiAoY2hhbmdlKSB7Ci0JCXVwZGF0ZS5rY29udHJvbCA9IGtjb250cm9sOwotCQl1cGRhdGUucmVnID0gZS0+cmVnOwotCQl1cGRhdGUubWFzayA9IG1hc2s7Ci0JCXVwZGF0ZS52YWwgPSB2YWw7Ci0JCWNhcmQtPnVwZGF0ZSA9ICZ1cGRhdGU7CisJaWYgKGUtPnJlZyAhPSBTTkRfU09DX05PUE0pCisJCWNoYW5nZSA9IHNuZF9zb2NfdGVzdF9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisJZWxzZQorCQljaGFuZ2UgPSBkYXBtX2tjb250cm9sX3NldF92YWx1ZShrY29udHJvbCwgdmFsKTsKIAotCQlyZXQgPSBzb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKGNhcmQsIGtjb250cm9sLCBtdXgsIGUpOworCWlmIChjaGFuZ2UpIHsKKwkJaWYgKGUtPnJlZyAhPSBTTkRfU09DX05PUE0pIHsKKwkJCXVwZGF0ZS5rY29udHJvbCA9IGtjb250cm9sOworCQkJdXBkYXRlLnJlZyA9IGUtPnJlZzsKKwkJCXVwZGF0ZS5tYXNrID0gbWFzazsKKwkJCXVwZGF0ZS52YWwgPSB2YWw7CisJCQljYXJkLT51cGRhdGUgPSAmdXBkYXRlOworCQl9CisKKwkJcmV0ID0gc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcihjYXJkLCBrY29udHJvbCwgaXRlbVswXSwgZSk7CiAKIAkJY2FyZC0+dXBkYXRlID0gTlVMTDsKIAl9CkBAIC0zMDA0LDE1OCArMjk4NCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKTsKIAogLyoqCi0gKiBzbmRfc29jX2RhcG1fZ2V0X2VudW1fdmlydCAtIEdldCB2aXJ0dWFsIERBUE0gbXV4Ci0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX2dldF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGRhcG1fa2NvbnRyb2xfZ2V0X3ZhbHVlKGtjb250cm9sKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfZW51bV92aXJ0KTsKLQotLyoqCi0gKiBzbmRfc29jX2RhcG1fcHV0X2VudW1fdmlydCAtIFNldCB2aXJ0dWFsIERBUE0gbXV4Ci0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9Ci0JCShzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgY2hhbmdlOwotCWludCByZXQgPSAwOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gZS0+bWF4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2tfbmVzdGVkKCZjYXJkLT5kYXBtX211dGV4LCBTTkRfU09DX0RBUE1fQ0xBU1NfUlVOVElNRSk7Ci0KLQl2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JY2hhbmdlID0gZGFwbV9rY29udHJvbF9zZXRfdmFsdWUoa2NvbnRyb2wsIHZhbHVlKTsKLQlpZiAoY2hhbmdlKQotCQlyZXQgPSBzb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKGNhcmQsIGtjb250cm9sLCB2YWx1ZSwgZSk7Ci0KLQltdXRleF91bmxvY2soJmNhcmQtPmRhcG1fbXV0ZXgpOwotCi0JaWYgKHJldCA+IDApCi0JCXNvY19kcGNtX3J1bnRpbWVfdXBkYXRlKGNhcmQpOwotCi0JcmV0dXJuIGNoYW5nZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfZW51bV92aXJ0KTsKLQotLyoqCi0gKiBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlIC0gZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldAotICoJCQkJCWNhbGxiYWNrCi0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBjb250cm9sLgotICoKLSAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCi0gKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCi0gKi8KLWludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCByZWdfdmFsLCB2YWwsIG11eDsKLQotCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7Ci0JdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwotCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgewotCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQotCQkJYnJlYWs7Ci0JfQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtdXg7Ci0JaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7Ci0JCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgewotCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKLQkJCQlicmVhazsKLQkJfQotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gbXV4OwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZSk7Ci0KLS8qKgotICogc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSAtIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBzZXQKLSAqCQkJCQljYWxsYmFjawotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgotICoKLSAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KLSAqCi0gKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQotICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZDsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbCwgbXV4LCBjaGFuZ2U7Ci0JdW5zaWduZWQgaW50IG1hc2s7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgdXBkYXRlOwotCWludCByZXQgPSAwOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCXZhbCA9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXSA8PCBlLT5zaGlmdF9sOwotCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7Ci0JaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJdmFsIHw9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdXSA8PCBlLT5zaGlmdF9yOwotCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKLQl9Ci0KLQltdXRleF9sb2NrX25lc3RlZCgmY2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwotCi0JY2hhbmdlID0gc25kX3NvY190ZXN0X2JpdHMoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKLQlpZiAoY2hhbmdlKSB7Ci0JCXVwZGF0ZS5rY29udHJvbCA9IGtjb250cm9sOwotCQl1cGRhdGUucmVnID0gZS0+cmVnOwotCQl1cGRhdGUubWFzayA9IG1hc2s7Ci0JCXVwZGF0ZS52YWwgPSB2YWw7Ci0JCWNhcmQtPnVwZGF0ZSA9ICZ1cGRhdGU7Ci0KLQkJcmV0ID0gc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcihjYXJkLCBrY29udHJvbCwgbXV4LCBlKTsKLQotCQljYXJkLT51cGRhdGUgPSBOVUxMOwotCX0KLQotCW11dGV4X3VubG9jaygmY2FyZC0+ZGFwbV9tdXRleCk7Ci0KLQlpZiAocmV0ID4gMCkKLQkJc29jX2RwY21fcnVudGltZV91cGRhdGUoY2FyZCk7Ci0KLQlyZXR1cm4gY2hhbmdlOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSk7Ci0KLS8qKgogICogc25kX3NvY19kYXBtX2luZm9fcGluX3N3aXRjaCAtIEluZm8gZm9yIGEgcGluIHN3aXRjaAogICoKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbApAQCAtMzI4Myw4ICszMTExLDYgQEAKIAkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7CiAJCWJyZWFrOwogCWNhc2Ugc25kX3NvY19kYXBtX211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwogCQlicmVhazsKIAljYXNlIHNuZF9zb2NfZGFwbV9kYWlfb3V0OgpAQCAtNDA5OCw3ICszOTI0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9mcmVlKTsKIAotc3RhdGljIHZvaWQgc29jX2RhcG1fc2h1dGRvd25fY29kZWMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQorc3RhdGljIHZvaWQgc29jX2RhcG1fc2h1dGRvd25fZGFwbShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CkBAIC00MTM4LDE0ICszOTY0LDIxIEBACiAgKi8KIHZvaWQgc25kX3NvY19kYXBtX3NodXRkb3duKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjYXJkLT5jb2RlY19kZXZfbGlzdCwgY2FyZF9saXN0KSB7Ci0JCXNvY19kYXBtX3NodXRkb3duX2NvZGVjKCZjb2RlYy0+ZGFwbSk7Ci0JCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZKQotCQkJc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICBTTkRfU09DX0JJQVNfT0ZGKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhcG0sICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGRhcG0gIT0gJmNhcmQtPmRhcG0pIHsKKwkJCXNvY19kYXBtX3NodXRkb3duX2RhcG0oZGFwbSk7CisJCQlpZiAoZGFwbS0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoZGFwbSwKKwkJCQkJCQkgICAgU05EX1NPQ19CSUFTX09GRik7CisJCX0KIAl9CisKKwlzb2NfZGFwbV9zaHV0ZG93bl9kYXBtKCZjYXJkLT5kYXBtKTsKKwlpZiAoY2FyZC0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZKQorCQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoJmNhcmQtPmRhcG0sCisJCQkJCSAgICBTTkRfU09DX0JJQVNfT0ZGKTsKIH0KIAogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWlvLmMgYi9zb3VuZC9zb2Mvc29jLWlvLmMKaW5kZXggYWE4ODZjYy4uMjYwZWZjOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1pby5jCisrKyBiL3NvdW5kL3NvYy9zb2MtaW8uYwpAQCAtMjMsMjEgKzIzLDYgQEAKIHN0YXRpYyBpbnQgaHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewotCWludCByZXQ7Ci0KLQlpZiAoIXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykgJiYKLQkgICAgcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgJiYKLQkgICAgIWNvZGVjLT5jYWNoZV9ieXBhc3MpIHsKLQkJcmV0ID0gc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjb2RlYy0+Y2FjaGVfb25seSkgewotCQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQogCXJldHVybiByZWdtYXBfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCB2YWx1ZSk7CiB9CiAKQEAgLTQ2LDMyICszMSwxOCBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCWlmIChyZWcgPj0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgfHwKLQkgICAgc25kX3NvY19jb2RlY192b2xhdGlsZV9yZWdpc3Rlcihjb2RlYywgcmVnKSB8fAotCSAgICBjb2RlYy0+Y2FjaGVfYnlwYXNzKSB7Ci0JCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKLQkJCXJldHVybiAtMTsKLQotCQlyZXQgPSByZWdtYXBfcmVhZChjb2RlYy0+Y29udHJvbF9kYXRhLCByZWcsICZ2YWwpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXR1cm4gdmFsOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19jYWNoZV9yZWFkKGNvZGVjLCByZWcsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IHJlZ21hcF9yZWFkKGNvZGVjLT5jb250cm9sX2RhdGEsIHJlZywgJnZhbCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gdmFsOworCWVsc2UKIAkJcmV0dXJuIC0xOwotCXJldHVybiB2YWw7CiB9CiAKIC8qKgogICogc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW86IFNldCB1cCBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLgogICoKICAqIEBjb2RlYzogQ09ERUMgdG8gY29uZmlndXJlLgotICogQGFkZHJfYml0czogTnVtYmVyIG9mIGJpdHMgb2YgcmVnaXN0ZXIgYWRkcmVzcyBkYXRhLgotICogQGRhdGFfYml0czogTnVtYmVyIG9mIGJpdHMgb2YgZGF0YSBwZXIgcmVnaXN0ZXIuCi0gKiBAY29udHJvbDogQ29udHJvbCBidXMgdXNlZC4KKyAqIEBtYXA6IFJlZ2lzdGVyIG1hcCB0byB3cml0ZSB0bwogICoKICAqIFJlZ2lzdGVyIGZvcm1hdHMgYXJlIGZyZXF1ZW50bHkgc2hhcmVkIGJldHdlZW4gbWFueSBJMkMgYW5kIFNQSQogICogZGV2aWNlcy4gIEluIG9yZGVyIHRvIHByb21vdGUgY29kZSByZXVzZSB0aGUgQVNvQyBjb3JlIHByb3ZpZGVzCkBAIC04NSw2MCArNTYsMzYgQEAKICAqIHZvbGF0aWxlIHJlZ2lzdGVycy4KICAqLwogaW50IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAotCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7Ci0Jc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOwogCWludCByZXQ7CiAKLQltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCS8qIERldmljZSBoYXMgbWFkZSBpdHMgb3duIHJlZ21hcCBhcnJhbmdlbWVudHMgKi8KKwlpZiAoIXJlZ21hcCkKKwkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpOworCWVsc2UKKwkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJlZ21hcDsKKworCWlmIChJU19FUlIoY29kZWMtPmNvbnRyb2xfZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGNvZGVjLT5jb250cm9sX2RhdGEpOworCiAJY29kZWMtPndyaXRlID0gaHdfd3JpdGU7CiAJY29kZWMtPnJlYWQgPSBod19yZWFkOwogCi0JY29uZmlnLnJlZ19iaXRzID0gYWRkcl9iaXRzOwotCWNvbmZpZy52YWxfYml0cyA9IGRhdGFfYml0czsKKwlyZXQgPSByZWdtYXBfZ2V0X3ZhbF9ieXRlcyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwkvKiBFcnJvcnMgYXJlIGxlZ2l0aW1hdGUgZm9yIG5vbi1pbnRlZ2VyIGJ5dGUKKwkgKiBtdWx0aXBsZXMgKi8KKwlpZiAocmV0ID4gMCkKKwkJY29kZWMtPnZhbF9ieXRlcyA9IHJldDsKIAotCXN3aXRjaCAoY29udHJvbCkgewotI2lmIElTX0VOQUJMRUQoQ09ORklHX1JFR01BUF9JMkMpCi0JY2FzZSBTTkRfU09DX0kyQzoKLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJlZ21hcF9pbml0X2kyYyh0b19pMmNfY2xpZW50KGNvZGVjLT5kZXYpLAotCQkJCQkJICAgICAgJmNvbmZpZyk7Ci0JCWJyZWFrOwotI2VuZGlmCisJY29kZWMtPnVzaW5nX3JlZ21hcCA9IHRydWU7CiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19SRUdNQVBfU1BJKQotCWNhc2UgU05EX1NPQ19TUEk6Ci0JCWNvZGVjLT5jb250cm9sX2RhdGEgPSByZWdtYXBfaW5pdF9zcGkodG9fc3BpX2RldmljZShjb2RlYy0+ZGV2KSwKLQkJCQkJCSAgICAgICZjb25maWcpOwotCQlicmVhazsKLSNlbmRpZgotCi0JY2FzZSBTTkRfU09DX1JFR01BUDoKLQkJLyogRGV2aWNlIGhhcyBtYWRlIGl0cyBvd24gcmVnbWFwIGFycmFuZ2VtZW50cyAqLwotCQljb2RlYy0+dXNpbmdfcmVnbWFwID0gdHJ1ZTsKLQkJaWYgKCFjb2RlYy0+Y29udHJvbF9kYXRhKQotCQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpOwotCi0JCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKSB7Ci0JCQlyZXQgPSByZWdtYXBfZ2V0X3ZhbF9ieXRlcyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKLQkJCS8qIEVycm9ycyBhcmUgbGVnaXRpbWF0ZSBmb3Igbm9uLWludGVnZXIgYnl0ZQotCQkJICogbXVsdGlwbGVzICovCi0JCQlpZiAocmV0ID4gMCkKLQkJCQljb2RlYy0+dmFsX2J5dGVzID0gcmV0OwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKTsKICNlbHNlCiBpbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCi0JCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKQorCQkJICAgICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlyZXR1cm4gLUVOT1RTVVBQOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1qYWNrLmMgYi9zb3VuZC9zb2Mvc29jLWphY2suYwppbmRleCAyM2Q0M2RhLi5iOTAzZjgyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWphY2suYworKysgYi9zb3VuZC9zb2Mvc29jLWphY2suYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCXJlcG9ydCA9IDA7CiAKIAlpZiAoZ3Bpby0+amFja19zdGF0dXNfY2hlY2spCi0JCXJlcG9ydCA9IGdwaW8tPmphY2tfc3RhdHVzX2NoZWNrKCk7CisJCXJlcG9ydCA9IGdwaW8tPmphY2tfc3RhdHVzX2NoZWNrKGdwaW8tPmRhdGEpOwogCiAJc25kX3NvY19qYWNrX3JlcG9ydChqYWNrLCByZXBvcnQsIGdwaW8tPnJlcG9ydCk7CiB9CkBAIC0zNDIsNyArMzQyLDggQEAKIAkJZ3Bpb19leHBvcnQoZ3Bpb3NbaV0uZ3BpbywgZmFsc2UpOwogCiAJCS8qIFVwZGF0ZSBpbml0aWFsIGphY2sgc3RhdHVzICovCi0JCXNuZF9zb2NfamFja19ncGlvX2RldGVjdCgmZ3Bpb3NbaV0pOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmdwaW9zW2ldLndvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhncGlvc1tpXS5kZWJvdW5jZV90aW1lKSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLXBjbS5jIGIvc291bmQvc29jL3NvYy1wY20uYwppbmRleCAyODUyMmJkLi4yY2VkZjA5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKQEAgLTM1LDYgKzM1LDg2IEBACiAjZGVmaW5lIERQQ01fTUFYX0JFX1VTRVJTCTgKIAogLyoqCisgKiBzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUoKSAtIEluY3JlbWVudCBhY3RpdmUgY291bnQgZm9yIFBDTSBydW50aW1lIGNvbXBvbmVudHMKKyAqIEBydGQ6IEFTb0MgUENNIHJ1bnRpbWUgdGhhdCBpcyBhY3RpdmF0ZWQKKyAqIEBzdHJlYW06IERpcmVjdGlvbiBvZiB0aGUgUENNIHN0cmVhbQorICoKKyAqIEluY3JlbWVudHMgdGhlIGFjdGl2ZSBjb3VudCBmb3IgYWxsIHRoZSBEQUlzIGFuZCBjb21wb25lbnRzIGF0dGFjaGVkIHRvIGEgUENNCisgKiBydW50aW1lLiBTaG91bGQgdHlwaWNhbGx5IGJlIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIG9wZW5lZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydGQtPnBjbV9tdXRleCBiZWluZyBoZWxkCisgKi8KK3ZvaWQgc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsIGludCBzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZydGQtPnBjbV9tdXRleCk7CisKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlKys7CisJCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlKys7CisJfSBlbHNlIHsKKwkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKKwkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOworCX0KKworCWNwdV9kYWktPmFjdGl2ZSsrOworCWNvZGVjX2RhaS0+YWN0aXZlKys7CisJY3B1X2RhaS0+Y29tcG9uZW50LT5hY3RpdmUrKzsKKwljb2RlY19kYWktPmNvbXBvbmVudC0+YWN0aXZlKys7Cit9CisKKy8qKgorICogc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUoKSAtIERlY3JlbWVudCBhY3RpdmUgY291bnQgZm9yIFBDTSBydW50aW1lIGNvbXBvbmVudHMKKyAqIEBydGQ6IEFTb0MgUENNIHJ1bnRpbWUgdGhhdCBpcyBkZWFjdGl2YXRlZAorICogQHN0cmVhbTogRGlyZWN0aW9uIG9mIHRoZSBQQ00gc3RyZWFtCisgKgorICogRGVjcmVtZW50cyB0aGUgYWN0aXZlIGNvdW50IGZvciBhbGwgdGhlIERBSXMgYW5kIGNvbXBvbmVudHMgYXR0YWNoZWQgdG8gYSBQQ00KKyAqIHJ1bnRpbWUuIFNob3VsZCB0eXBpY2FsbHkgYmUgY2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJ0ZC0+cGNtX211dGV4IGJlaW5nIGhlbGQKKyAqLwordm9pZCBzbmRfc29jX3J1bnRpbWVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcnRkLT5wY21fbXV0ZXgpOworCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZS0tOworCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZS0tOworCX0gZWxzZSB7CisJCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlLS07CisJCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKKwl9CisKKwljcHVfZGFpLT5hY3RpdmUtLTsKKwljb2RlY19kYWktPmFjdGl2ZS0tOworCWNwdV9kYWktPmNvbXBvbmVudC0+YWN0aXZlLS07CisJY29kZWNfZGFpLT5jb21wb25lbnQtPmFjdGl2ZS0tOworfQorCisvKioKKyAqIHNuZF9zb2NfcnVudGltZV9pZ25vcmVfcG1kb3duX3RpbWUoKSAtIENoZWNrIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBwb3dlciBkb3duIGRlbGF5CisgKiBAcnRkOiBUaGUgQVNvQyBQQ00gcnVudGltZSB0aGF0IHNob3VsZCBiZSBjaGVja2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIHBvd2VyIGRvd24gZGVsYXkgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGEKKyAqIHNwZWNpZmljIFBDTSBydW50aW1lLiBSZXR1cm5zIHRydWUgaWYgdGhlIGRlbGF5IGlzIDAsIGlmIGl0IHRoZSBEQUkgbGluayBoYXMKKyAqIGJlZW4gY29uZmlndXJlZCB0byBpZ25vcmUgdGhlIGRlbGF5LCBvciBpZiBub25lIG9mIHRoZSBjb21wb25lbnRzIGJlbmVmaXRzCisgKiBmcm9tIGhhdmluZyB0aGUgZGVsYXkuCisgKi8KK2Jvb2wgc25kX3NvY19ydW50aW1lX2lnbm9yZV9wbWRvd25fdGltZShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCWlmICghcnRkLT5wbWRvd25fdGltZSB8fCBydGQtPmRhaV9saW5rLT5pZ25vcmVfcG1kb3duX3RpbWUpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIHJ0ZC0+Y3B1X2RhaS0+Y29tcG9uZW50LT5pZ25vcmVfcG1kb3duX3RpbWUgJiYKKwkJCXJ0ZC0+Y29kZWNfZGFpLT5jb21wb25lbnQtPmlnbm9yZV9wbWRvd25fdGltZTsKK30KKworLyoqCiAgKiBzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zIC0gc2V0IHRoZSBydW50aW1lIGhhcmR3YXJlIHBhcmFtZXRlcnMKICAqIEBzdWJzdHJlYW06IHRoZSBwY20gc3Vic3RyZWFtCiAgKiBAaHc6IHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCkBAIC0zNzgsMTYgKzQ1OCw5IEBACiAJCSBydW50aW1lLT5ody5yYXRlX21heCk7CiAKIGR5bmFtaWM6Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JfSBlbHNlIHsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCX0KLQljcHVfZGFpLT5hY3RpdmUrKzsKLQljb2RlY19kYWktPmFjdGl2ZSsrOwotCXJ0ZC0+Y29kZWMtPmFjdGl2ZSsrOworCisJc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKHJ0ZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCiAJbXV0ZXhfdW5sb2NrKCZydGQtPnBjbV9tdXRleCk7CiAJcmV0dXJuIDA7CiAKQEAgLTQ1OSwyMSArNTMyLDEwIEBACiAJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CiAKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlLS07Ci0JfQotCi0JY3B1X2RhaS0+YWN0aXZlLS07Ci0JY29kZWNfZGFpLT5hY3RpdmUtLTsKLQljb2RlYy0+YWN0aXZlLS07CisJc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUocnRkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CiAKIAkvKiBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBEQUlzIHJhdGUgd2hlbiBpbmFjdGl2ZSAqLwogCWlmICghY3B1X2RhaS0+YWN0aXZlKQpAQCAtNDk2LDggKzU1OCw3IEBACiAJY3B1X2RhaS0+cnVudGltZSA9IE5VTEw7CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlpZiAoIXJ0ZC0+cG1kb3duX3RpbWUgfHwgY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSB8fAotCQkgICAgcnRkLT5kYWlfbGluay0+aWdub3JlX3BtZG93bl90aW1lKSB7CisJCWlmIChzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKHJ0ZCkpIHsKIAkJCS8qIHBvd2VyZWQgZG93biBwbGF5YmFjayBzdHJlYW0gbm93ICovCiAJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKIAkJCQkJCSAgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKQEAgLTE5ODksNyArMjA1MCw2IEBACiAKIAkJcGF0aHMgPSBkcGNtX3BhdGhfZ2V0KGZlLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmbGlzdCk7CiAJCWlmIChwYXRocyA8IDApIHsKLQkJCWRwY21fcGF0aF9wdXQoJmxpc3QpOwogCQkJZGV2X3dhcm4oZmUtPmRldiwgIkFTb0M6ICVzIG5vIHZhbGlkICVzIHBhdGhcbiIsCiAJCQkJCWZlLT5kYWlfbGluay0+bmFtZSwgICJwbGF5YmFjayIpOwogCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5tdXRleCk7CkBAIC0yMDE5LDcgKzIwNzksNiBAQAogCiAJCXBhdGhzID0gZHBjbV9wYXRoX2dldChmZSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmbGlzdCk7CiAJCWlmIChwYXRocyA8IDApIHsKLQkJCWRwY21fcGF0aF9wdXQoJmxpc3QpOwogCQkJZGV2X3dhcm4oZmUtPmRldiwgIkFTb0M6ICVzIG5vIHZhbGlkICVzIHBhdGhcbiIsCiAJCQkJCWZlLT5kYWlfbGluay0+bmFtZSwgICJjYXB0dXJlIik7CiAJCQltdXRleF91bmxvY2soJmNhcmQtPm11dGV4KTsKQEAgLTIwODQsNyArMjE0Myw2IEBACiAJZmUtPmRwY21bc3RyZWFtXS5ydW50aW1lID0gZmVfc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJaWYgKGRwY21fcGF0aF9nZXQoZmUsIHN0cmVhbSwgJmxpc3QpIDw9IDApIHsKLQkJZHBjbV9wYXRoX3B1dCgmbGlzdCk7CiAJCWRldl9kYmcoZmUtPmRldiwgIkFTb0M6ICVzIG5vIHZhbGlkICVzIHJvdXRlXG4iLAogCQkJZmUtPmRhaV9saW5rLT5uYW1lLCBzdHJlYW0gPyAiY2FwdHVyZSIgOiAicGxheWJhY2siKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc3BlYXIvc3BkaWZfb3V0LmMgYi9zb3VuZC9zb2Mvc3BlYXIvc3BkaWZfb3V0LmMKaW5kZXggZmU5OWY0Ni4uMTljY2EwNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NwZWFyL3NwZGlmX291dC5jCisrKyBiL3NvdW5kL3NvYy9zcGVhci9zcGRpZl9vdXQuYwpAQCAtMjEzLDEwICsyMTMsNyBAQAogc3RhdGljIGludCBzcGRpZl9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY2FyZC0+cnRkOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHNwZGlmX291dF9kZXYgKmhvc3QgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaG9zdC0+c2F2ZWRfcGFyYW1zLm11dGU7CkBAIC0yMjYsMTAgKzIyMyw3IEBACiBzdGF0aWMgaW50IHNwZGlmX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBjYXJkLT5ydGQ7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc3BkaWZfb3V0X2RldiAqaG9zdCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwogCiAJaWYgKGhvc3QtPnNhdmVkX3BhcmFtcy5tdXRlID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcgYi9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZwppbmRleCA5ZjljMTg1Li4zMTE5OGNmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcKKysrIGIvc291bmQvc29jL3RlZ3JhL0tjb25maWcKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgVHJpbVNsaWNlIGJvYXJkIgogCWRlcGVuZHMgb24gU05EX1NPQ19URUdSQSAmJiBJMkMKIAlzZWxlY3QgU05EX1NPQ19URUdSQTIwX0kyUyBpZiBBUkNIX1RFR1JBXzJ4X1NPQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gdGhlCiAJICBUcmltU2xpY2UgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmMKaW5kZXggY2Y1ZTFjZi4uM2IwZmExMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KIAotI2luY2x1ZGUgInRlZ3JhX2Fzb2NfdXRpbHMuaCIKICNpbmNsdWRlICJ0ZWdyYTIwX2FjOTcuaCIKIAogI2RlZmluZSBEUlZfTkFNRSAidGVncmEyMC1hYzk3IgpAQCAtMzA2LDcgKzMwNSw3IEBACiAJLnJlYWRhYmxlX3JlZyA9IHRlZ3JhMjBfYWM5N193cl9yZF9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IHRlZ3JhMjBfYWM5N192b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IHRlZ3JhMjBfYWM5N19wcmVjaW91c19yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIGludCB0ZWdyYTIwX2FjOTdfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM3NiwxOCArMzc1LDEwIEBACiAJYWM5Ny0+cGxheWJhY2tfZG1hX2RhdGEuYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOwogCWFjOTctPnBsYXliYWNrX2RtYV9kYXRhLm1heGJ1cnN0ID0gNDsKIAotCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfaW5pdCgmYWM5Ny0+dXRpbF9kYXRhLCAmcGRldi0+ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jbGtfcHV0OwotCi0JcmV0ID0gdGVncmFfYXNvY191dGlsc19zZXRfYWM5N19yYXRlKCZhYzk3LT51dGlsX2RhdGEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2Fzb2NfdXRpbHNfZmluaTsKLQogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhYzk3LT5jbGtfYWM5Nyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjbGtfZW5hYmxlIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2Fzb2NfdXRpbHNfZmluaTsKKwkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gc25kX3NvY19zZXRfYWM5N19vcHMoJnRlZ3JhMjBfYWM5N19vcHMpOwpAQCAtNDE5LDggKzQxMCw2IEBACiAJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKIGVycl9jbGtfZGlzYWJsZV91bnByZXBhcmU6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFjOTctPmNsa19hYzk3KTsKLWVycl9hc29jX3V0aWxzX2Zpbmk6Ci0JdGVncmFfYXNvY191dGlsc19maW5pKCZhYzk3LT51dGlsX2RhdGEpOwogZXJyX2Nsa19wdXQ6CiBlcnI6CiAJc25kX3NvY19zZXRfYWM5N19vcHMoTlVMTCk7CkBAIC00MzQsOCArNDIzLDYgQEAKIAl0ZWdyYV9wY21fcGxhdGZvcm1fdW5yZWdpc3RlcigmcGRldi0+ZGV2KTsKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwogCi0JdGVncmFfYXNvY191dGlsc19maW5pKCZhYzk3LT51dGlsX2RhdGEpOwotCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFjOTctPmNsa19hYzk3KTsKIAogCXNuZF9zb2Nfc2V0X2FjOTdfb3BzKE5VTEwpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5oIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5oCmluZGV4IDRhY2IzYWEuLjBhMzlkODIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuaAorKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmgKQEAgLTkwLDYgKzkwLDUgQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJaW50IHJlc2V0X2dwaW87CiAJaW50IHN5bmNfZ3BpbzsKLQlzdHJ1Y3QgdGVncmFfYXNvY191dGlsc19kYXRhIHV0aWxfZGF0YTsKIH07CiAjZW5kaWYgLyogX19URUdSQTIwX0FDOTdfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9kYXMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2Rhcy5jCmluZGV4IGU3MjM5MjkuLmE2MzRmMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2Rhcy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2Rhcy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkubWF4X3JlZ2lzdGVyID0gTEFTVF9SRUcoREFDX0lOUFVUX0RBVEFfQ0xLX1NFTCksCiAJLndyaXRlYWJsZV9yZWcgPSB0ZWdyYTIwX2Rhc193cl9yZF9yZWcsCiAJLnJlYWRhYmxlX3JlZyA9IHRlZ3JhMjBfZGFzX3dyX3JkX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhMjBfZGFzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9pMnMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2kycy5jCmluZGV4IDQyYzFmNmIuLjc5YTk5MzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2kycy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2kycy5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkucmVhZGFibGVfcmVnID0gdGVncmEyMF9pMnNfd3JfcmRfcmVnLAogCS52b2xhdGlsZV9yZWcgPSB0ZWdyYTIwX2kyc192b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IHRlZ3JhMjBfaTJzX3ByZWNpb3VzX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhMjBfaTJzX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9zcGRpZi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfc3BkaWYuYwppbmRleCA4YzdjMTAyLi5hMGNlOTI0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX3NwZGlmLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTIwX3NwZGlmX3dyX3JkX3JlZywKIAkudm9sYXRpbGVfcmVnID0gdGVncmEyMF9zcGRpZl92b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IHRlZ3JhMjBfc3BkaWZfcHJlY2lvdXNfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBpbnQgdGVncmEyMF9zcGRpZl9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfYWh1Yi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfYWh1Yi5jCmluZGV4IGQ2ZjRjOTkuLjBkYjY4ZjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2FodWIuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEzMF9haHViLmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTMwX2FodWJfYXBiaWZfd3JfcmRfcmVnLAogCS52b2xhdGlsZV9yZWcgPSB0ZWdyYTMwX2FodWJfYXBiaWZfdm9sYXRpbGVfcmVnLAogCS5wcmVjaW91c19yZWcgPSB0ZWdyYTMwX2FodWJfYXBiaWZfcHJlY2lvdXNfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBib29sIHRlZ3JhMzBfYWh1Yl9haHViX3dyX3JkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCkBAIC00OTAsNyArNDkwLDcgQEAKIAkubWF4X3JlZ2lzdGVyID0gTEFTVF9SRUcoQVVESU9fUlgpLAogCS53cml0ZWFibGVfcmVnID0gdGVncmEzMF9haHViX2FodWJfd3JfcmRfcmVnLAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTMwX2FodWJfYWh1Yl93cl9yZF9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIHN0cnVjdCB0ZWdyYTMwX2FodWJfc29jX2RhdGEgc29jX2RhdGFfdGVncmEzMCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2kycy5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfaTJzLmMKaW5kZXggNDlhZDkzNi4uZjE0NmM0MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfaTJzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfaTJzLmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogCS53cml0ZWFibGVfcmVnID0gdGVncmEzMF9pMnNfd3JfcmRfcmVnLAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTMwX2kyc193cl9yZF9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IHRlZ3JhMzBfaTJzX3ZvbGF0aWxlX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhMzBfaTJzX3NvY19kYXRhIHRlZ3JhMzBfaTJzX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTk3MTIuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTk3MTIuYwppbmRleCA0NWI1Nzg5Li4yNWE3ZjgyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfd205NzEyLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtOTcxMi5jCkBAIC0yOSwxMCArMjksMTMgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKKyNpbmNsdWRlICJ0ZWdyYV9hc29jX3V0aWxzLmgiCisKICNkZWZpbmUgRFJWX05BTUUgInRlZ3JhLXNuZC13bTk3MTIiCiAKIHN0cnVjdCB0ZWdyYV93bTk3MTIgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvZGVjOworCXN0cnVjdCB0ZWdyYV9hc29jX3V0aWxzX2RhdGEgdXRpbF9kYXRhOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHRlZ3JhX3dtOTcxMl9kYXBtX3dpZGdldHNbXSA9IHsKQEAgLTExOCwxNSArMTIxLDI1IEBACiAKIAl0ZWdyYV93bTk3MTJfZGFpLnBsYXRmb3JtX29mX25vZGUgPSB0ZWdyYV93bTk3MTJfZGFpLmNwdV9vZl9ub2RlOwogCisJcmV0ID0gdGVncmFfYXNvY191dGlsc19pbml0KCZtYWNoaW5lLT51dGlsX2RhdGEsICZwZGV2LT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gY29kZWNfdW5yZWdpc3RlcjsKKworCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfc2V0X2FjOTdfcmF0ZSgmbWFjaGluZS0+dXRpbF9kYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGFzb2NfdXRpbHNfZmluaTsKKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwKIAkJCXJldCk7Ci0JCWdvdG8gY29kZWNfdW5yZWdpc3RlcjsKKwkJZ290byBhc29jX3V0aWxzX2Zpbmk7CiAJfQogCiAJcmV0dXJuIDA7CiAKK2Fzb2NfdXRpbHNfZmluaToKKwl0ZWdyYV9hc29jX3V0aWxzX2ZpbmkoJm1hY2hpbmUtPnV0aWxfZGF0YSk7CiBjb2RlY191bnJlZ2lzdGVyOgogCXBsYXRmb3JtX2RldmljZV9kZWwobWFjaGluZS0+Y29kZWMpOwogY29kZWNfcHV0OgpAQCAtMTQxLDYgKzE1NCw4IEBACiAKIAlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKIAorCXRlZ3JhX2Fzb2NfdXRpbHNfZmluaSgmbWFjaGluZS0+dXRpbF9kYXRhKTsKKwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1hY2hpbmUtPmNvZGVjKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvYW1kNzkzMC5jIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCmluZGV4IDE3NGQyMWYuLjRhODVlMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYworKysgYi9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKQEAgLTEwMTksOCArMTAxOSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZfbnVtXSwgaWRbZGV2X251bV0sIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmb3AtPmRldiwgaW5kZXhbZGV2X251bV0sIGlkW2Rldl9udW1dLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvY3M0MjMxLmMgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwppbmRleCBkYmIxYjYyNS4uNGU5MWJjYSAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvY3M0MjMxLmMKKysrIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKQEAgLTE1NjUsNyArMTU2NSw4IEBACiAKIHN0YXRpYyBpbnQgZGV2OwogCi1zdGF0aWMgaW50IGNzNDIzMV9hdHRhY2hfYmVnaW4oc3RydWN0IHNuZF9jYXJkICoqcmNhcmQpCitzdGF0aWMgaW50IGNzNDIzMV9hdHRhY2hfYmVnaW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCisJCQkgICAgICAgc3RydWN0IHNuZF9jYXJkICoqcmNhcmQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwOwpAQCAtMTU4MSw4ICsxNTgyLDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY3M0MjMxKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmb3AtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jczQyMzEpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE4NjksNyArMTg3MCw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBjczQyMzFfYXR0YWNoX2JlZ2luKCZjYXJkKTsKKwllcnIgPSBjczQyMzFfYXR0YWNoX2JlZ2luKG9wLCAmY2FyZCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjA2MCw3ICsyMDYxLDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IGNzNDIzMV9hdHRhY2hfYmVnaW4oJmNhcmQpOworCWVyciA9IGNzNDIzMV9hdHRhY2hfYmVnaW4ob3AsICZjYXJkKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9kYnJpLmMgYi9zb3VuZC9zcGFyYy9kYnJpLmMKaW5kZXggZWVlN2FmYy4uYmUxYjFhYSAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvZGJyaS5jCisrKyBiL3NvdW5kL3NwYXJjL2RicmkuYwpAQCAtMjYxNSw4ICsyNjE1LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZGJyaSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJm9wLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfZGJyaSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BpL2F0NzNjMjEzLmMgYi9zb3VuZC9zcGkvYXQ3M2MyMTMuYwppbmRleCAyNWMzOGFmLi4zOTUyMjM2IDEwMDY0NAotLS0gYS9zb3VuZC9zcGkvYXQ3M2MyMTMuYworKysgYi9zb3VuZC9zcGkvYXQ3M2MyMTMuYwpAQCAtOTI3LDggKzkyNyw2IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXRfc25kX2RldjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnNwaS0+ZGV2KTsKLQogCWdvdG8gb3V0OwogCiBvdXRfc25kX2RldjoKQEAgLTk2Niw4ICs5NjQsOCBAQAogCiAJLyogQWxsb2NhdGUgImNhcmQiIHVzaW5nIHNvbWUgdW51c2VkIGlkZW50aWZpZXJzLiAqLwogCXNucHJpbnRmKGlkLCBzaXplb2YgaWQsICJhdDczYzIxM18lZCIsIGJvYXJkLT5zc2NfaWQpOwotCXJldHZhbCA9IHNuZF9jYXJkX2NyZWF0ZSgtMSwgaWQsIFRISVNfTU9EVUxFLAotCQkJCSBzaXplb2Yoc3RydWN0IHNuZF9hdDczYzIxMyksICZjYXJkKTsKKwlyZXR2YWwgPSBzbmRfY2FyZF9uZXcoJnNwaS0+ZGV2LCAtMSwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfYXQ3M2MyMTMpLCAmY2FyZCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvY2hpcC5jIGIvc291bmQvdXNiLzZmaXJlL2NoaXAuYwppbmRleCA2NmVkYzRhLi5kY2RkZmMzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvY2hpcC5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9jaGlwLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCX0KIAlpZiAocmVnaWR4IDwgMCkgewogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInRvbyBtYW55IGNhcmRzIHJlZ2lzdGVyZWQuXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAidG9vIG1hbnkgY2FyZHMgcmVnaXN0ZXJlZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJZGV2aWNlc1tyZWdpZHhdID0gZGV2aWNlOwpAQCAtMTIxLDIwICsxMjEsMTkgQEAKIAogCS8qIGlmIHdlIGFyZSBoZXJlLCBjYXJkIGNhbiBiZSByZWdpc3RlcmVkIGluIGFsc2EuICovCiAJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGRldmljZSwgMCwgMCkgIT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2FuJ3Qgc2V0IGZpcnN0IGludGVyZmFjZS5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjYW4ndCBzZXQgZmlyc3QgaW50ZXJmYWNlLlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbcmVnaWR4XSwgaWRbcmVnaWR4XSwgVEhJU19NT0RVTEUsCi0JCQlzaXplb2Yoc3RydWN0IHNmaXJlX2NoaXApLCAmY2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W3JlZ2lkeF0sIGlkW3JlZ2lkeF0sCisJCQkgICBUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBzZmlyZV9jaGlwKSwgJmNhcmQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgY3JlYXRlIGFsc2EgY2FyZC5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjYW5ub3QgY3JlYXRlIGFsc2EgY2FyZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiNkZpcmVVU0IiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVGVycmFUZWMgRE1YNkZpcmVVU0IiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgJWQ6JWQiLCBjYXJkLT5zaG9ydG5hbWUsCiAJCQlkZXZpY2UtPmJ1cy0+YnVzbnVtLCBkZXZpY2UtPmRldm51bSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmaW50Zi0+ZGV2KTsKIAogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJY2hpcHNbcmVnaWR4XSA9IGNoaXA7CkBAIC0xNjksNyArMTY4LDcgQEAKIAogCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgcmVnaXN0ZXIgY2FyZC4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIGNhcmQuIik7CiAJCXVzYjZmaXJlX2NoaXBfZGVzdHJveShjaGlwKTsKIAkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvY29tbS5jIGIvc291bmQvdXNiLzZmaXJlL2NvbW0uYwppbmRleCAyMzQ1MmVlLi4xNjEyMTVkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvY29tbS5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9jb21tLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAkJdXJiLT5zdGF0dXMgPSAwOwogCQl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCQlpZiAodXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSA8IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LAogCQkJCQkiY29tbSBkYXRhIHJlY2VpdmVyIGFib3J0ZWQuXG4iKTsKIAl9CiB9CkBAIC0xNzksNyArMTc5LDcgQEAKIAlpZiAocmV0IDwgMCkgewogCQlrZnJlZShydC0+cmVjZWl2ZXJfYnVmZmVyKTsKIAkJa2ZyZWUocnQpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGNyZWF0ZSBjb21tIGRhdGEgcmVjZWl2ZXIuIik7CisJCWRldl9lcnIoJmNoaXAtPmRldi0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBjb21tIGRhdGEgcmVjZWl2ZXIuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCWNoaXAtPmNvbW0gPSBydDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9jb250cm9sLmMgYi9zb3VuZC91c2IvNmZpcmUvY29udHJvbC5jCmluZGV4IGY2NDM0YzIuLjE4NGUzOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9jb250cm9sLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL2NvbnRyb2wuYwpAQCAtMTk0LDcgKzE5NCw4IEBACiAJaW50IGNoYW5nZWQgPSAwOwogCiAJaWYgKGNoID4gNCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyMiw3ICsyMjMsOCBAQAogCXVuc2lnbmVkIGludCBjaCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCiAJaWYgKGNoID4gNCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI0MCw3ICsyNDIsOCBAQAogCXU4IHZhbHVlID0gMDsKIAogCWlmIChjaCA+IDQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNjUsNyArMjY4LDggQEAKIAl1OCB2YWx1ZSA9IHJ0LT5vdXRwdXRfbXV0ZSA+PiBjaDsKIAogCWlmIChjaCA+IDQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01OTQsMTQgKzU5OCwxNCBAQAogCXJldCA9IHVzYjZmaXJlX2NvbnRyb2xfYWRkX3ZpcnR1YWwocnQsIGNoaXAtPmNhcmQsCiAJCSJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgdm9sX2VsZW1lbnRzKTsKIAlpZiAocmV0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKIAkJa2ZyZWUocnQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXQgPSB1c2I2ZmlyZV9jb250cm9sX2FkZF92aXJ0dWFsKHJ0LCBjaGlwLT5jYXJkLAogCQkiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIG11dGVfZWxlbWVudHMpOwogCWlmIChyZXQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOworCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOwogCQlrZnJlZShydCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNjExLDcgKzYxNSw3IEBACiAJCXJldCA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmZWxlbWVudHNbaV0sIHJ0KSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlrZnJlZShydCk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGFkZCBjb250cm9sLlxuIik7CisJCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlpKys7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYyBiL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCmluZGV4IDc4MGJmM2YuLjNiMDJlNTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCkBAIC0yMTksMTYgKzIxOSwxNiBAQAogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd25hbWUsICZkZXZpY2UtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocmVjKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHJlcXVlc3RpbmcgZXp1c2IgIgotCQkJCSJmaXJtd2FyZSAlcy5cbiIsIGZ3bmFtZSk7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJlcnJvciByZXF1ZXN0aW5nIGV6dXNiIGZpcm13YXJlICVzLlxuIiwgZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0ID0gdXNiNmZpcmVfZndfaWhleF9pbml0KGZ3LCByZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJlYyk7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3IgdmFsaWRhdGluZyBlenVzYiAiCi0JCQkJImZpcm13YXJlICVzLlxuIiwgZnduYW1lKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJImVycm9yIHZhbGlkYXRpbmcgZXp1c2IgZmlybXdhcmUgJXMuXG4iLCBmd25hbWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiB1cGxvYWQgZmlybXdhcmUgaW1hZ2UgKi8KQEAgLTIzNyw4ICsyMzcsOSBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJlYyk7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHVwbG9hZCBlenVzYiAiCi0JCQkJImZpcm13YXJlICVzOiBiZWdpbiBtZXNzYWdlLlxuIiwgZnduYW1lKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgZmlybXdhcmUgJXM6IGJlZ2luIG1lc3NhZ2UuXG4iLAorCQkJZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI0OCw4ICsyNDksOSBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJa2ZyZWUocmVjKTsKIAkJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgIgotCQkJCQkiZmlybXdhcmUgJXM6IGRhdGEgdXJiLlxuIiwgZnduYW1lKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5hYmxlIHRvIHVwbG9hZCBlenVzYiBmaXJtd2FyZSAlczogZGF0YSB1cmIuXG4iLAorCQkJCWZ3bmFtZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMjYwLDggKzI2Miw5IEBACiAJCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3dyaXRlKGRldmljZSwgMHhhMCwgcG9zdGFkZHIsCiAJCQkJcG9zdGRhdGEsIHBvc3RsZW4pOwogCQlpZiAocmV0IDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgIgotCQkJCQkiZmlybXdhcmUgJXM6IHBvc3QgdXJiLlxuIiwgZnduYW1lKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5hYmxlIHRvIHVwbG9hZCBlenVzYiBmaXJtd2FyZSAlczogcG9zdCB1cmIuXG4iLAorCQkJCWZ3bmFtZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMjY5LDggKzI3Miw5IEBACiAJZGF0YSA9IDB4MDA7IC8qIHJlc3VtZSBlenVzYiBjcHUgKi8KIAlyZXQgPSB1c2I2ZmlyZV9md19lenVzYl93cml0ZShkZXZpY2UsIDB4YTAsIDB4ZTYwMCwgJmRhdGEsIDEpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiICIKLQkJCQkiZmlybXdhcmUgJXM6IGVuZCBtZXNzYWdlLlxuIiwgZnduYW1lKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgZmlybXdhcmUgJXM6IGVuZCBtZXNzYWdlLlxuIiwKKwkJCWZ3bmFtZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiAwOwpAQCAtMjkyLDcgKzI5Niw3IEBACiAKIAlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZnduYW1lLCAmZGV2aWNlLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gZ2V0IGZwZ2EgZmlybXdhcmUgJXMuXG4iLAorCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJ1bmFibGUgdG8gZ2V0IGZwZ2EgZmlybXdhcmUgJXMuXG4iLAogCQkJCWZ3bmFtZSk7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXJldHVybiAtRUlPOwpAQCAtMzA1LDggKzMwOSw4IEBACiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUoYnVmZmVyKTsKIAkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6ICIKLQkJCQkiYmVnaW4gdXJiLlxuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6IGJlZ2luIHVyYi5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzE4LDggKzMyMiw4IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHVwbG9hZCBmcGdhICIKLQkJCQkJImZpcm13YXJlOiBmdyB1cmIuXG4iKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5hYmxlIHRvIHVwbG9hZCBmcGdhIGZpcm13YXJlOiBmdyB1cmIuXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC0zMjgsOCArMzMyLDggQEAKIAogCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3dyaXRlKGRldmljZSwgOSwgMCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZnBnYSBmaXJtd2FyZTogIgotCQkJCSJlbmQgdXJiLlxuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6IGVuZCB1cmIuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zMzgsNyArMzQyLDcgQEAKIC8qIGNoZWNrLCBpZiB0aGUgZmlybXdhcmUgdmVyc2lvbiB0aGUgZGV2aWNlcyBoYXMgY3VycmVudGx5IGxvYWRlZAogICogaXMga25vd24gYnkgdGhpcyBkcml2ZXIuICd2ZXJzaW9uJyBuZWVkcyB0byBoYXZlIDQgYnl0ZXMgdmVyc2lvbgogICogaW5mbyBkYXRhLiAqLwotc3RhdGljIGludCB1c2I2ZmlyZV9md19jaGVjayh1OCAqdmVyc2lvbikKK3N0YXRpYyBpbnQgdXNiNmZpcmVfZndfY2hlY2soc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHU4ICp2ZXJzaW9uKQogewogCWludCBpOwogCkBAIC0zNDYsNyArMzUwLDcgQEAKIAkJaWYgKCFtZW1jbXAodmVyc2lvbiwga25vd25fZndfdmVyc2lvbnMgKyBpLCAyKSkKIAkJCXJldHVybiAwOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImludmFsaWQgZmltd2FyZSB2ZXJzaW9uIGluIGRldmljZTogJTRwaC4gIgorCWRldl9lcnIoJmludGYtPmRldiwgImludmFsaWQgZmltd2FyZSB2ZXJzaW9uIGluIGRldmljZTogJTRwaC4gIgogCQkJInBsZWFzZSByZWNvbm5lY3QgdG8gcG93ZXIuIGlmIHRoaXMgZmFpbHVyZSAiCiAJCQkic3RpbGwgaGFwcGVucywgY2hlY2sgeW91ciBmaXJtd2FyZSBpbnN0YWxsYXRpb24uIiwKIAkJCXZlcnNpb24pOwpAQCAtMzY0LDE2ICszNjgsMTYgQEAKIAogCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3JlYWQoZGV2aWNlLCAxLCAwLCBidWZmZXIsIDgpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gcmVjZWl2ZSBkZXZpY2UgIgotCQkJCSJmaXJtd2FyZSBzdGF0ZS5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkidW5hYmxlIHRvIHJlY2VpdmUgZGV2aWNlIGZpcm13YXJlIHN0YXRlLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCWlmIChidWZmZXJbMF0gIT0gMHhlYiB8fCBidWZmZXJbMV0gIT0gMHhhYSB8fCBidWZmZXJbMl0gIT0gMHg1NSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5rbm93biBkZXZpY2UgZmlybXdhcmUgc3RhdGUgIgotCQkJCSJyZWNlaXZlZCBmcm9tIGRldmljZTogIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmtub3duIGRldmljZSBmaXJtd2FyZSBzdGF0ZSByZWNlaXZlZCBmcm9tIGRldmljZToiKTsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCXNuZF9wcmludGsoIiUwMnggIiwgYnVmZmVyW2ldKTsKLQkJc25kX3ByaW50aygiXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiUwMnggIiwgYnVmZmVyW2ldKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCS8qIGRvIHdlIG5lZWQgZnBnYSBsb2FkZXIgZXp1c2IgZmlybXdhcmU/ICovCkBAIC0zODYsNyArMzkwLDcgQEAKIAl9CiAJLyogZG8gd2UgbmVlZCBmcGdhIGZpcm13YXJlIGFuZCBhcHBsaWNhdGlvbiBlenVzYiBmaXJtd2FyZT8gKi8KIAllbHNlIGlmIChidWZmZXJbM10gPT0gMHgwMikgewotCQlyZXQgPSB1c2I2ZmlyZV9md19jaGVjayhidWZmZXIgKyA0KTsKKwkJcmV0ID0gdXNiNmZpcmVfZndfY2hlY2soaW50ZiwgYnVmZmVyICsgNCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJcmV0ID0gdXNiNmZpcmVfZndfZnBnYV91cGxvYWQoaW50ZiwgIjZmaXJlL2RteDZmaXJlY2YuYmluIik7CkBAIC00MDIsMTQgKzQwNiwxNCBAQAogCX0KIAkvKiBhbGwgZncgbG9hZGVkPyAqLwogCWVsc2UgaWYgKGJ1ZmZlclszXSA9PSAweDAzKQotCQlyZXR1cm4gdXNiNmZpcmVfZndfY2hlY2soYnVmZmVyICsgNCk7CisJCXJldHVybiB1c2I2ZmlyZV9md19jaGVjayhpbnRmLCBidWZmZXIgKyA0KTsKIAkvKiB1bmtub3duIGRhdGE/ICovCiAJZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmtub3duIGRldmljZSBmaXJtd2FyZSBzdGF0ZSAiCi0JCQkJInJlY2VpdmVkIGZyb20gZGV2aWNlOiAiKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVua25vd24gZGV2aWNlIGZpcm13YXJlIHN0YXRlIHJlY2VpdmVkIGZyb20gZGV2aWNlOiAiKTsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCXNuZF9wcmludGsoIiUwMnggIiwgYnVmZmVyW2ldKTsKLQkJc25kX3ByaW50aygiXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiUwMnggIiwgYnVmZmVyW2ldKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL21pZGkuYyBiL3NvdW5kL3VzYi82ZmlyZS9taWRpLmMKaW5kZXggZjNkZDcyNi4uM2Q0MTA5NiAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL21pZGkuYworKysgYi9zb3VuZC91c2IvNmZpcmUvbWlkaS5jCkBAIC00MSw4ICs0MSw5IEBACiAKIAkJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAibWlkaSBvdXQgdXJiICIKLQkJCQkJCSJzdWJtaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkibWlkaSBvdXQgdXJiIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAorCQkJCQlyZXQpOwogCQl9IGVsc2UgLyogbm8gbW9yZSBkYXRhIHRvIHRyYW5zbWl0ICovCiAJCQlydC0+b3V0ID0gTlVMTDsKIAl9CkBAIC05NCw4ICs5NSw5IEBACiAKIAkJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAibWlkaSBvdXQgdXJiICIKLQkJCQkJCSJzdWJtaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkibWlkaSBvdXQgdXJiIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAorCQkJCQlyZXQpOwogCQkJZWxzZQogCQkJCXJ0LT5vdXQgPSBhbHNhX3N1YjsKIAkJfQpAQCAtMTgxLDcgKzE4Myw3IEBACiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocnQtPm91dF9idWZmZXIpOwogCQlrZnJlZShydCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gY3JlYXRlIG1pZGkuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIG1pZGkuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcnQtPmluc3RhbmNlLT5wcml2YXRlX2RhdGEgPSBydDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9wY20uYyBiL3NvdW5kL3VzYi82ZmlyZS9wY20uYwppbmRleCBiNWViOTdmLi5iYTQwNDg5IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvcGNtLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL3BjbS5jCkBAIC03OSwzMiArNzksMzUgQEAKIAljdHJsX3J0LT51c2Jfc3RyZWFtaW5nID0gZmFsc2U7CiAJcmV0ID0gY3RybF9ydC0+dXBkYXRlX3N0cmVhbWluZyhjdHJsX3J0KTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3Igc3RvcHBpbmcgc3RyZWFtaW5nIHdoaWxlICIKLQkJCQkic2V0dGluZyBzYW1wbGVyYXRlICVkLlxuIiwgcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyB3aGlsZSBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAorCQkJcmF0ZXNbcnQtPnJhdGVdKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBjdHJsX3J0LT5zZXRfcmF0ZShjdHJsX3J0LCBydC0+cmF0ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCi0JCQkJcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCisJCQlyYXRlc1tydC0+cmF0ZV0pOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGN0cmxfcnQtPnNldF9jaGFubmVscyhjdHJsX3J0LCBPVVRfTl9DSEFOTkVMUywgSU5fTl9DSEFOTkVMUywKIAkJCWZhbHNlLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIGluaXRpYWxpemluZyBjaGFubmVscyAiCi0JCQkJIndoaWxlIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCi0JCQkJcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIGluaXRpYWxpemluZyBjaGFubmVscyB3aGlsZSBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAorCQkJcmF0ZXNbcnQtPnJhdGVdKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAljdHJsX3J0LT51c2Jfc3RyZWFtaW5nID0gdHJ1ZTsKIAlyZXQgPSBjdHJsX3J0LT51cGRhdGVfc3RyZWFtaW5nKGN0cmxfcnQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciBzdGFydGluZyBzdHJlYW1pbmcgd2hpbGUgIgotCQkJCSJzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLCByYXRlc1tydC0+cmF0ZV0pOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkiZXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIHdoaWxlIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCisJCQlyYXRlc1tydC0+cmF0ZV0pOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTI0LDcgKzEyNyw3IEBACiAJCXJldHVybiAmcnQtPnBsYXliYWNrOwogCWVsc2UgaWYgKGFsc2Ffc3ViLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQogCQlyZXR1cm4gJnJ0LT5jYXB0dXJlOwotCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciBnZXR0aW5nIHBjbSBzdWJzdHJlYW0gc2xvdC5cbiIpOworCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwgImVycm9yIGdldHRpbmcgcGNtIHN1YnN0cmVhbSBzbG90LlxuIik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI1Nyw3ICsyNjAsNyBAQAogCWVsc2UgaWYgKGFsc2FfcnQtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSkKIAkJZGVzdCA9ICh1MzIgKikgKHVyYi0+YnVmZmVyKTsKIAllbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVua25vd24gc2FtcGxlIGZvcm1hdC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LCAiVW5rbm93biBzYW1wbGUgZm9ybWF0LiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMDcsOCArMzEwLDggQEAKIAkJfQogCiAJaWYgKHJ0LT5zdHJlYW1fc3RhdGUgPT0gU1RSRUFNX0RJU0FCTEVEKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJpbnRlcm5hbCBlcnJvcjogIgotCQkJCSJzdHJlYW0gZGlzYWJsZWQgaW4gaW4tdXJiIGhhbmRsZXIuXG4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImludGVybmFsIGVycm9yOiBzdHJlYW0gZGlzYWJsZWQgaW4gaW4tdXJiIGhhbmRsZXIuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDEwLDcgKzQxMyw3IEBACiAKIAlpZiAoIXN1YikgewogCQltdXRleF91bmxvY2soJnJ0LT5zdHJlYW1fbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiaW52YWxpZCBzdHJlYW0gdHlwZS5cbiIpOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsICJpbnZhbGlkIHN0cmVhbSB0eXBlLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDgxLDggKzQ4NCw5IEBACiAJCQkJYnJlYWs7CiAJCWlmIChydC0+cmF0ZSA9PSBBUlJBWV9TSVpFKHJhdGVzKSkgewogCQkJbXV0ZXhfdW5sb2NrKCZydC0+c3RyZWFtX211dGV4KTsKLQkJCXNuZF9wcmludGsoImludmFsaWQgcmF0ZSAlZCBpbiBwcmVwYXJlLlxuIiwKLQkJCQkJYWxzYV9ydC0+cmF0ZSk7CisJCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkJImludmFsaWQgcmF0ZSAlZCBpbiBwcmVwYXJlLlxuIiwKKwkJCQlhbHNhX3J0LT5yYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ5NCw4ICs0OTgsOCBAQAogCQlyZXQgPSB1c2I2ZmlyZV9wY21fc3RyZWFtX3N0YXJ0KHJ0KTsKIAkJaWYgKHJldCkgewogCQkJbXV0ZXhfdW5sb2NrKCZydC0+c3RyZWFtX211dGV4KTsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkJCSJjb3VsZCBub3Qgc3RhcnQgcGNtIHN0cmVhbS5cbiIpOworCQkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJCSJjb3VsZCBub3Qgc3RhcnQgcGNtIHN0cmVhbS5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTY1MCw3ICs2NTQsNyBAQAogCWlmIChyZXQgPCAwKSB7CiAJCXVzYjZmaXJlX3BjbV9idWZmZXJzX2Rlc3Ryb3kocnQpOwogCQlrZnJlZShydCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgY3JlYXRlIHBjbSBpbnN0YW5jZS5cbiIpOworCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgcGNtIGluc3RhbmNlLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02NjIsOCArNjY2LDggQEAKIAlpZiAocmV0KSB7CiAJCXVzYjZmaXJlX3BjbV9idWZmZXJzX2Rlc3Ryb3kocnQpOwogCQlrZnJlZShydCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkJImVycm9yIHByZWFsbG9jYXRpbmcgcGNtIGJ1ZmZlcnMuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsCisJCQkiZXJyb3IgcHJlYWxsb2NhdGluZyBwY20gYnVmZmVycy5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlydC0+aW5zdGFuY2UgPSBwY207CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMgYi9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMKaW5kZXggYmM1NWY3MC4uYjg3MWJhNCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2RldmljZS5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYwpAQCAtNDE4LDggKzQxOCw5IEBACiAJaWYgKGRldm51bSA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnVtXSwgaWRbZGV2bnVtXSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsCisJCQkgICBpbmRleFtkZXZudW1dLCBpZFtkZXZudW1dLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNDI5LDcgKzQzMCw2IEBACiAJY2Rldi0+Y2hpcC51c2JfaWQgPSBVU0JfSUQobGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCQkJICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCXNwaW5fbG9ja19pbml0KCZjZGV2LT5zcGlubG9jayk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmaW50Zi0+ZGV2KTsKIAogCSpjYXJkcCA9IGNhcmQ7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FyZC5jIGIvc291bmQvdXNiL2NhcmQuYwppbmRleCBkOTc5MDUwLi44OTNkNWExIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FyZC5jCisrKyBiL3NvdW5kL3VzYi9jYXJkLmMKQEAgLTEzOSw4ICsxMzksOCBAQAogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSA9IHVzYl9pZm51bV90b19pZihkZXYsIGludGVyZmFjZSk7CiAKIAlpZiAoIWlmYWNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogZG9lcyBub3QgZXhpc3RcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgY3RybGlmLCBpbnRlcmZhY2UpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiV1OiVkIDogZG9lcyBub3QgZXhpc3RcbiIsCisJCQljdHJsaWYsIGludGVyZmFjZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTY1LDggKzE2NSw4IEBACiAJfQogCiAJaWYgKHVzYl9pbnRlcmZhY2VfY2xhaW1lZChpZmFjZSkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICIlZDolZDolZDogc2tpcHBpbmcsIGFscmVhZHkgY2xhaW1lZFxuIiwKLQkJCQkJCWRldi0+ZGV2bnVtLCBjdHJsaWYsIGludGVyZmFjZSk7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJWQ6JWQ6IHNraXBwaW5nLCBhbHJlYWR5IGNsYWltZWRcbiIsCisJCQljdHJsaWYsIGludGVyZmFjZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTc2LDggKzE3Niw5IEBACiAJCWludCBlcnIgPSBzbmRfdXNibWlkaV9jcmVhdGUoY2hpcC0+Y2FyZCwgaWZhY2UsCiAJCQkJCSAgICAgJmNoaXAtPm1pZGlfbGlzdCwgTlVMTCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZDogY2Fubm90IGNyZWF0ZSBzZXF1ZW5jZXIgZGV2aWNlXG4iLAotCQkJCQkJZGV2LT5kZXZudW0sIGN0cmxpZiwgaW50ZXJmYWNlKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCSIldTolZDogY2Fubm90IGNyZWF0ZSBzZXF1ZW5jZXIgZGV2aWNlXG4iLAorCQkJCWN0cmxpZiwgaW50ZXJmYWNlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCZ1c2JfYXVkaW9fZHJpdmVyLCBpZmFjZSwgKHZvaWQgKiktMUwpOwpAQCAtMTg4LDE0ICsxODksMTUgQEAKIAlpZiAoKGFsdHNkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0FVRElPICYmCiAJICAgICBhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykgfHwKIAkgICAgYWx0c2QtPmJJbnRlcmZhY2VTdWJDbGFzcyAhPSBVU0JfU1VCQ0xBU1NfQVVESU9TVFJFQU1JTkcpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIiVkOiV1OiVkOiBza2lwcGluZyBub24tc3VwcG9ydGVkIGludGVyZmFjZSAlZFxuIiwKLQkJCQkJZGV2LT5kZXZudW0sIGN0cmxpZiwgaW50ZXJmYWNlLCBhbHRzZC0+YkludGVyZmFjZUNsYXNzKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsCisJCQkiJXU6JWQ6IHNraXBwaW5nIG5vbi1zdXBwb3J0ZWQgaW50ZXJmYWNlICVkXG4iLAorCQkJY3RybGlmLCBpbnRlcmZhY2UsIGFsdHNkLT5iSW50ZXJmYWNlQ2xhc3MpOwogCQkvKiBza2lwIG5vbi1zdXBwb3J0ZWQgY2xhc3NlcyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoc25kX3VzYl9nZXRfc3BlZWQoZGV2KSA9PSBVU0JfU1BFRURfTE9XKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImxvdyBzcGVlZCBhdWRpbyBzdHJlYW1pbmcgbm90IHN1cHBvcnRlZFxuIik7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAibG93IHNwZWVkIGF1ZGlvIHN0cmVhbWluZyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjgsMjYgKzIzMCwyNyBAQAogCXByb3RvY29sID0gYWx0c2QtPmJJbnRlcmZhY2VQcm90b2NvbDsKIAogCWlmICghY29udHJvbF9oZWFkZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGZpbmQgVUFDX0hFQURFUlxuIik7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2Fubm90IGZpbmQgVUFDX0hFQURFUlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN3aXRjaCAocHJvdG9jb2wpIHsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgInVua25vd24gaW50ZXJmYWNlIHByb3RvY29sICUjMDJ4LCBhc3N1bWluZyB2MVxuIiwKLQkJCSAgICBwcm90b2NvbCk7CisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSAidW5rbm93biBpbnRlcmZhY2UgcHJvdG9jb2wgJSMwMngsIGFzc3VtaW5nIHYxXG4iLAorCQkJIHByb3RvY29sKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAKIAljYXNlIFVBQ19WRVJTSU9OXzE6IHsKIAkJc3RydWN0IHVhYzFfYWNfaGVhZGVyX2Rlc2NyaXB0b3IgKmgxID0gY29udHJvbF9oZWFkZXI7CiAKIAkJaWYgKCFoMS0+YkluQ29sbGVjdGlvbikgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gInNraXBwaW5nIGVtcHR5IGF1ZGlvIGludGVyZmFjZSAodjEpXG4iKTsKKwkJCWRldl9pbmZvKCZkZXYtPmRldiwgInNraXBwaW5nIGVtcHR5IGF1ZGlvIGludGVyZmFjZSAodjEpXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJaWYgKGgxLT5iTGVuZ3RoIDwgc2l6ZW9mKCpoMSkgKyBoMS0+YkluQ29sbGVjdGlvbikgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBVQUNfSEVBREVSICh2MSlcbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJpbnZhbGlkIFVBQ19IRUFERVIgKHYxKVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0yNzcsNyArMjgwLDcgQEAKIAkJfQogCiAJCWlmICghYXNzb2MpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkF1ZGlvIGNsYXNzIHYyIGludGVyZmFjZXMgbmVlZCBhbiBpbnRlcmZhY2UgYXNzb2NpYXRpb25cbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJBdWRpbyBjbGFzcyB2MiBpbnRlcmZhY2VzIG5lZWQgYW4gaW50ZXJmYWNlIGFzc29jaWF0aW9uXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTMyOCw3ICszMzEsOCBAQAogLyoKICAqIGNyZWF0ZSBhIGNoaXAgaW5zdGFuY2UgYW5kIHNldCBpdHMgbmFtZXMuCiAgKi8KLXN0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19jcmVhdGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlkeCwKK3N0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19jcmVhdGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlkeCwKIAkJCQljb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyayAqcXVpcmssCiAJCQkJc3RydWN0IHNuZF91c2JfYXVkaW8gKipyY2hpcCkKIHsKQEAgLTM1MCwxMyArMzU0LDE0IEBACiAJY2FzZSBVU0JfU1BFRURfU1VQRVI6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVua25vd24gZGV2aWNlIHNwZWVkICVkXG4iLCBzbmRfdXNiX2dldF9zcGVlZChkZXYpKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJ1bmtub3duIGRldmljZSBzcGVlZCAlZFxuIiwgc25kX3VzYl9nZXRfc3BlZWQoZGV2KSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgY2FyZCBpbnN0YW5jZSAlZFxuIiwgaWR4KTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIGNhcmQgaW5zdGFuY2UgJWRcbiIsIGlkeCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC00OTcsNyArNTAyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewogCQlpZiAodXNiX2NoaXBbaV0gJiYgdXNiX2NoaXBbaV0tPmRldiA9PSBkZXYpIHsKIAkJCWlmICh1c2JfY2hpcFtpXS0+c2h1dGRvd24pIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVU0IgZGV2aWNlIGlzIGluIHRoZSBzaHV0ZG93biBzdGF0ZSwgY2Fubm90IGNyZWF0ZSBhIGNhcmQgaW5zdGFuY2VcbiIpOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiVVNCIGRldmljZSBpcyBpbiB0aGUgc2h1dGRvd24gc3RhdGUsIGNhbm5vdCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlXG4iKTsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CiAJCQljaGlwID0gdXNiX2NoaXBbaV07CkBAIC01MTMsMTUgKzUxOCwxNSBAQAogCQkJaWYgKGVuYWJsZVtpXSAmJiAhIHVzYl9jaGlwW2ldICYmCiAJCQkgICAgKHZpZFtpXSA9PSAtMSB8fCB2aWRbaV0gPT0gVVNCX0lEX1ZFTkRPUihpZCkpICYmCiAJCQkgICAgKHBpZFtpXSA9PSAtMSB8fCBwaWRbaV0gPT0gVVNCX0lEX1BST0RVQ1QoaWQpKSkgewotCQkJCWlmIChzbmRfdXNiX2F1ZGlvX2NyZWF0ZShkZXYsIGksIHF1aXJrLCAmY2hpcCkgPCAwKSB7CisJCQkJaWYgKHNuZF91c2JfYXVkaW9fY3JlYXRlKGludGYsIGRldiwgaSwgcXVpcmssCisJCQkJCQkJICZjaGlwKSA8IDApIHsKIAkJCQkJZ290byBfX2Vycm9yOwogCQkJCX0KLQkJCQlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsICZpbnRmLT5kZXYpOwogCQkJCWNoaXAtPnBtX2ludGYgPSBpbnRmOwogCQkJCWJyZWFrOwogCQkJfQogCQlpZiAoIWNoaXApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibm8gYXZhaWxhYmxlIHVzYiBhdWRpbyBkZXZpY2VcbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJubyBhdmFpbGFibGUgdXNiIGF1ZGlvIGRldmljZVxuIik7CiAJCQlnb3RvIF9fZXJyb3I7CiAJCX0KIAl9CkBAIC02OTEsMTIgKzY5NiwxMiBAQAogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobWl4ZXIsICZjaGlwLT5taXhlcl9saXN0LCBsaXN0KQotCQlzbmRfdXNiX21peGVyX2luYWN0aXZhdGUobWl4ZXIpOworCQlzbmRfdXNiX21peGVyX3N1c3BlbmQobWl4ZXIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyBpbnQgX191c2JfYXVkaW9fcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBib29sIHJlc2V0X3Jlc3VtZSkKIHsKIAlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyOwpAQCAtNzExLDcgKzcxNiw3IEBACiAJICogd2UganVzdCBub3RpZnkgYW5kIHJlc3RhcnQgdGhlIG1peGVycwogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkobWl4ZXIsICZjaGlwLT5taXhlcl9saXN0LCBsaXN0KSB7Ci0JCWVyciA9IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUobWl4ZXIpOworCQllcnIgPSBzbmRfdXNiX21peGVyX3Jlc3VtZShtaXhlciwgcmVzZXRfcmVzdW1lKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtNzIzLDkgKzcyOCwyMCBAQAogZXJyX291dDoKIAlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIF9fdXNiX2F1ZGlvX3Jlc3VtZShpbnRmLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gX191c2JfYXVkaW9fcmVzdW1lKGludGYsIHRydWUpOworfQogI2Vsc2UKICNkZWZpbmUgdXNiX2F1ZGlvX3N1c3BlbmQJTlVMTAogI2RlZmluZSB1c2JfYXVkaW9fcmVzdW1lCU5VTEwKKyNkZWZpbmUgdXNiX2F1ZGlvX3Jlc2V0X3Jlc3VtZQlOVUxMCiAjZW5kaWYJCS8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX2F1ZGlvX2lkcyBbXSA9IHsKQEAgLTc0Nyw2ICs3NjMsNyBAQAogCS5kaXNjb25uZWN0ID0JdXNiX2F1ZGlvX2Rpc2Nvbm5lY3QsCiAJLnN1c3BlbmQgPQl1c2JfYXVkaW9fc3VzcGVuZCwKIAkucmVzdW1lID0JdXNiX2F1ZGlvX3Jlc3VtZSwKKwkucmVzZXRfcmVzdW1lID0JdXNiX2F1ZGlvX3Jlc2V0X3Jlc3VtZSwKIAkuaWRfdGFibGUgPQl1c2JfYXVkaW9faWRzLAogCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Nsb2NrLmMgYi9zb3VuZC91c2IvY2xvY2suYwppbmRleCA4NmY4MGM2Li4wM2ZlZDY2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2xvY2suYworKysgYi9zb3VuZC91c2IvY2xvY2suYwpAQCAtMTE1LDkgKzExNSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlpZiAocmV0ICE9IHNpemVvZihwaW4pKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSJ1c2ItYXVkaW86JWQ6IHNldHRpbmcgc2VsZWN0b3IgKGlkICVkKSB1bmV4cGVjdGVkIGxlbmd0aCAlZFxuIiwKLQkJCWNoaXAtPmRldi0+ZGV2bnVtLCBzZWxlY3Rvcl9pZCwgcmV0KTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJInNldHRpbmcgc2VsZWN0b3IgKGlkICVkKSB1bmV4cGVjdGVkIGxlbmd0aCAlZFxuIiwKKwkJCXNlbGVjdG9yX2lkLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEyNiw5ICsxMjYsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJldCAhPSBwaW4pIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJInVzYi1hdWRpbzolZDogc2V0dGluZyBzZWxlY3RvciAoaWQgJWQpIHRvICV4IGZhaWxlZCAoY3VycmVudDogJWQpXG4iLAotCQkJY2hpcC0+ZGV2LT5kZXZudW0sIHNlbGVjdG9yX2lkLCBwaW4sIHJldCk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSJzZXR0aW5nIHNlbGVjdG9yIChpZCAlZCkgdG8gJXggZmFpbGVkIChjdXJyZW50OiAlZClcbiIsCisJCQlzZWxlY3Rvcl9pZCwgcGluLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsOCBAQAogCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogY2Fubm90IGdldCBjbG9jayB2YWxpZGl0eSBmb3IgaWQgJWRcbiIsCisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSAiJXMoKTogY2Fubm90IGdldCBjbG9jayB2YWxpZGl0eSBmb3IgaWQgJWRcbiIsCiAJCQkgICBfX2Z1bmNfXywgc291cmNlX2lkKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTc3LDkgKzE3OCw5IEBACiAJZW50aXR5X2lkICY9IDB4ZmY7CiAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChlbnRpdHlfaWQsIHZpc2l0ZWQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiJXMoKTogcmVjdXJzaXZlIGNsb2NrIHRvcG9sb2d5IGRldGVjdGVkLCBpZCAlZC5cbiIsCi0JCQlfX2Z1bmNfXywgZW50aXR5X2lkKTsKKwkJdXNiX2F1ZGlvX3dhcm4oY2hpcCwKKwkJCSAiJXMoKTogcmVjdXJzaXZlIGNsb2NrIHRvcG9sb2d5IGRldGVjdGVkLCBpZCAlZC5cbiIsCisJCQkgX19mdW5jX18sIGVudGl0eV9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTg4LDggKzE4OSw5IEBACiAJaWYgKHNvdXJjZSkgewogCQllbnRpdHlfaWQgPSBzb3VyY2UtPmJDbG9ja0lEOwogCQlpZiAodmFsaWRhdGUgJiYgIXVhY19jbG9ja19zb3VyY2VfaXNfdmFsaWQoY2hpcCwgZW50aXR5X2lkKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiLWF1ZGlvOiVkOiBjbG9jayBzb3VyY2UgJWQgaXMgbm90IHZhbGlkLCBjYW5ub3QgdXNlXG4iLAotCQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBlbnRpdHlfaWQpOworCQkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJCSJjbG9jayBzb3VyY2UgJWQgaXMgbm90IHZhbGlkLCBjYW5ub3QgdXNlXG4iLAorCQkJCWVudGl0eV9pZCk7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJCXJldHVybiBlbnRpdHlfaWQ7CkBAIC0yMDgsNyArMjEwLDcgQEAKIAkJLyogU2VsZWN0b3IgdmFsdWVzIGFyZSBvbmUtYmFzZWQgKi8KIAogCQlpZiAocmV0ID4gc2VsZWN0b3ItPmJOckluUGlucyB8fCByZXQgPCAxKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQl1c2JfYXVkaW9fZXJyKGNoaXAsCiAJCQkJIiVzKCk6IHNlbGVjdG9yIHJlcG9ydGVkIGlsbGVnYWwgdmFsdWUsIGlkICVkLCByZXQgJWRcbiIsCiAJCQkJX19mdW5jX18sIHNlbGVjdG9yLT5iQ2xvY2tJRCwgcmV0KTsKIApAQCAtMjM3LDkgKzIzOSw5IEBACiAJCQlpZiAoZXJyIDwgMCkKIAkJCQljb250aW51ZTsKIAotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkidXNiLWF1ZGlvOiVkOiBmb3VuZCBhbmQgc2VsZWN0ZWQgdmFsaWQgY2xvY2sgc291cmNlICVkXG4iLAotCQkJCWNoaXAtPmRldi0+ZGV2bnVtLCByZXQpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCQkgImZvdW5kIGFuZCBzZWxlY3RlZCB2YWxpZCBjbG9jayBzb3VyY2UgJWRcbiIsCisJCQkJIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKQEAgLTI5Niw4ICsyOTgsOCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UIHwgVVNCX0RJUl9PVVQsCiAJCQkJICAgVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEUgPDwgOCwgZXAsCiAJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGZyZXEgJWQgdG8gZXAgJSN4XG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUsIGVwKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICIlZDolZDogY2Fubm90IHNldCBmcmVxICVkIHRvIGVwICUjeFxuIiwKKwkJCWlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUsIGVwKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTMwNSwxNCArMzA3LDE0IEBACiAJCQkJICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfRU5EUE9JTlQgfCBVU0JfRElSX0lOLAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFIDw8IDgsIGVwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJWQ6JWQ6JWQ6IGNhbm5vdCBnZXQgZnJlcSBhdCBlcCAlI3hcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXApOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgYXQgZXAgJSN4XG4iLAorCQkJaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXApOwogCQlyZXR1cm4gMDsgLyogc29tZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQgcmVhZGluZyAqLwogCX0KIAogCWNyYXRlID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOwogCWlmIChjcmF0ZSAhPSByYXRlKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9XQVJOSU5HICJjdXJyZW50IHJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJ1bnRpbWUgcmF0ZSAlZFxuIiwgY3JhdGUsIHJhdGUpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICJjdXJyZW50IHJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJ1bnRpbWUgcmF0ZSAlZFxuIiwgY3JhdGUsIHJhdGUpOwogCQkvLyBydW50aW1lLT5yYXRlID0gY3JhdGU7CiAJfQogCkBAIC0zMzIsOCArMzM0LDggQEAKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGNsb2NrIDw8IDgpLAogCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgKHYyKTogZXJyICVkXG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBhbHRzZXR0aW5nLCBlcnIpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICIlZDolZDogY2Fubm90IGdldCBmcmVxICh2Mik6IGVyciAlZFxuIiwKKwkJCSBpZmFjZSwgYWx0c2V0dGluZywgZXJyKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNjksOCArMzcxLDkgQEAKIAkJCQkgICAgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKIAkJCQkgICAgICAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGZyZXEgJWQgKHYyKTogZXJyICVkXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcnIpOworCQkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJCSIlZDolZDogY2Fubm90IHNldCBmcmVxICVkICh2Mik6IGVyciAlZFxuIiwKKwkJCQlpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCkBAIC0zODEsMTQgKzM4NCwxNCBAQAogCiAJaWYgKGN1cl9yYXRlICE9IHJhdGUpIHsKIAkJaWYgKCF3cml0ZWFibGUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgIiVkOiVkOiVkOiBmcmVxIG1pc21hdGNoIChSTyBjbG9jayk6IHJlcSAlZCwgY2xvY2sgcnVucyBAJWRcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUsIGN1cl9yYXRlKTsKKwkJCXVzYl9hdWRpb193YXJuKGNoaXAsCisJCQkJICIlZDolZDogZnJlcSBtaXNtYXRjaCAoUk8gY2xvY2spOiByZXEgJWQsIGNsb2NrIHJ1bnMgQCVkXG4iLAorCQkJCSBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBjdXJfcmF0ZSk7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9Ci0JCXNuZF9wcmludGQoS0VSTl9XQVJOSU5HCi0JCQkgICAiY3VycmVudCByYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBydW50aW1lIHJhdGUgJWRcbiIsCi0JCQkgICBjdXJfcmF0ZSwgcmF0ZSk7CisJCXVzYl9hdWRpb19kYmcoY2hpcCwKKwkJCSJjdXJyZW50IHJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJ1bnRpbWUgcmF0ZSAlZFxuIiwKKwkJCWN1cl9yYXRlLCByYXRlKTsKIAl9CiAKIAkvKiBTb21lIGRldmljZXMgZG9lc24ndCByZXNwb25kIHRvIHNhbXBsZSByYXRlIGNoYW5nZXMgd2hpbGUgdGhlCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvZW5kcG9pbnQuYyBiL3NvdW5kL3VzYi9lbmRwb2ludC5jCmluZGV4IDgzYWFiZWEyLi5lNzBhODdlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvZW5kcG9pbnQuYworKysgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwpAQCAtMzMzLDggKzMzMyw5IEBACiAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIoY3R4LT51cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBzdWJtaXQgdXJiICMlZDogJWQgKHVyYiAlcClcbiIsCi0JCQkJICAgY3R4LT5pbmRleCwgZXJyLCBjdHgtPnVyYik7CisJCQl1c2JfYXVkaW9fZXJyKGVwLT5jaGlwLAorCQkJCSJVbmFibGUgdG8gc3VibWl0IHVyYiAjJWQ6ICVkICh1cmIgJXApXG4iLAorCQkJCWN0eC0+aW5kZXgsIGVyciwgY3R4LT51cmIpOwogCQllbHNlCiAJCQlzZXRfYml0KGN0eC0+aW5kZXgsICZlcC0+YWN0aXZlX21hc2spOwogCX0KQEAgLTM4Nyw3ICszODgsNyBAQAogCWlmIChlcnIgPT0gMCkKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKKwl1c2JfYXVkaW9fZXJyKGVwLT5jaGlwLCAiY2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKIAkvL3NuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKIAogZXhpdF9jbGVhcjoKQEAgLTQyNiwxMyArNDI3LDE0IEBACiAJCWlmIChlcC0+ZXBfbnVtID09IGVwX251bSAmJgogCQkgICAgZXAtPmlmYWNlID09IGFsdHMtPmRlc2MuYkludGVyZmFjZU51bWJlciAmJgogCQkgICAgZXAtPmFsdHNldHRpbmcgPT0gYWx0cy0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZykgewotCQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiUmUtdXNpbmcgRVAgJXggaW4gaWZhY2UgJWQsJWQgQCVwXG4iLAorCQkJdXNiX2F1ZGlvX2RiZyhlcC0+Y2hpcCwKKwkJCQkgICAgICAiUmUtdXNpbmcgRVAgJXggaW4gaWZhY2UgJWQsJWQgQCVwXG4iLAogCQkJCQllcF9udW0sIGVwLT5pZmFjZSwgZXAtPmFsdHNldHRpbmcsIGVwKTsKIAkJCWdvdG8gX19leGl0X3VubG9jazsKIAkJfQogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIkNyZWF0aW5nIG5ldyAlcyAlcyBlbmRwb2ludCAjJXhcbiIsCisJdXNiX2F1ZGlvX2RiZyhjaGlwLCAiQ3JlYXRpbmcgbmV3ICVzICVzIGVuZHBvaW50ICMleFxuIiwKIAkJICAgIGlzX3BsYXliYWNrID8gInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKIAkJICAgIHR5cGUgPT0gU05EX1VTQl9FTkRQT0lOVF9UWVBFX0RBVEEgPyAiZGF0YSIgOiAic3luYyIsCiAJCSAgICBlcF9udW0pOwpAQCAtNDk2LDggKzQ5OCw5IEBACiAJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKIAogCWlmIChhbGl2ZSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZW91dDogc3RpbGwgJWQgYWN0aXZlIHVyYnMgb24gRVAgIyV4XG4iLAotCQkJCQlhbGl2ZSwgZXAtPmVwX251bSk7CisJCXVzYl9hdWRpb19lcnIoZXAtPmNoaXAsCisJCQkidGltZW91dDogc3RpbGwgJWQgYWN0aXZlIHVyYnMgb24gRVAgIyV4XG4iLAorCQkJYWxpdmUsIGVwLT5lcF9udW0pOwogCWNsZWFyX2JpdChFUF9GTEFHX1NUT1BQSU5HLCAmZXAtPmZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtNzk0LDggKzc5Nyw5IEBACiAJaW50IGVycjsKIAogCWlmIChlcC0+dXNlX2NvdW50ICE9IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjaGFuZ2UgZm9ybWF0IG9uIGVwICMleDogYWxyZWFkeSBpbiB1c2VcbiIsCi0JCQkgICBlcC0+ZXBfbnVtKTsKKwkJdXNiX2F1ZGlvX3dhcm4oZXAtPmNoaXAsCisJCQkgIlVuYWJsZSB0byBjaGFuZ2UgZm9ybWF0IG9uIGVwICMleDogYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkgZXAtPmVwX251bSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC04MzAsOCArODM0LDkgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJTZXR0aW5nIHBhcmFtcyBmb3IgZXAgIyV4ICh0eXBlICVkLCAlZCB1cmJzKSwgcmV0PSVkXG4iLAotCQkgICBlcC0+ZXBfbnVtLCBlcC0+dHlwZSwgZXAtPm51cmJzLCBlcnIpOworCXVzYl9hdWRpb19kYmcoZXAtPmNoaXAsCisJCSJTZXR0aW5nIHBhcmFtcyBmb3IgZXAgIyV4ICh0eXBlICVkLCAlZCB1cmJzKSwgcmV0PSVkXG4iLAorCQllcC0+ZXBfbnVtLCBlcC0+dHlwZSwgZXAtPm51cmJzLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTkwNiw4ICs5MTEsOSBAQAogCiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHVyYiAlZCwgZXJyb3IgJWQ6ICVzXG4iLAotCQkJCSAgIGksIGVyciwgdXNiX2Vycm9yX3N0cmluZyhlcnIpKTsKKwkJCXVzYl9hdWRpb19lcnIoZXAtPmNoaXAsCisJCQkJImNhbm5vdCBzdWJtaXQgdXJiICVkLCBlcnJvciAlZDogJXNcbiIsCisJCQkJaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOwogCQkJZ290byBfX2Vycm9yOwogCQl9CiAJCXNldF9iaXQoaSwgJmVwLT5hY3RpdmVfbWFzayk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvZm9ybWF0LmMgYi9zb3VuZC91c2IvZm9ybWF0LmMKaW5kZXggZDI0NGZkMy4uOGJjYzg3YyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2Zvcm1hdC5jCisrKyBiL3NvdW5kL3VzYi9mb3JtYXQuYwpAQCAtNzQsOCArNzQsOCBAQAogCWlmICgocGNtX2Zvcm1hdHMgPT0gMCkgJiYKIAkgICAgKGZvcm1hdCA9PSAwIHx8IGZvcm1hdCA9PSAoMSA8PCBVQUNfRk9STUFUX1RZUEVfSV9VTkRFRklORUQpKSkgewogCQkvKiBzb21lIGRldmljZXMgZG9uJ3QgZGVmaW5lIHRoaXMgY29ycmVjdGx5Li4uICovCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiBmb3JtYXQgdHlwZSAwIGlzIGRldGVjdGVkLCBwcm9jZXNzZWQgYXMgUENNXG4iLAotCQkJICAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nKTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgIiV1OiVkIDogZm9ybWF0IHR5cGUgMCBpcyBkZXRlY3RlZCwgcHJvY2Vzc2VkIGFzIFBDTVxuIiwKKwkJCWZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcpOwogCQlmb3JtYXQgPSAxIDw8IFVBQ19GT1JNQVRfVFlQRV9JX1BDTTsKIAl9CiAJaWYgKGZvcm1hdCAmICgxIDw8IFVBQ19GT1JNQVRfVFlQRV9JX1BDTSkpIHsKQEAgLTgzLDkgKzgzLDkgQEAKIAkJICAgIHNhbXBsZV93aWR0aCA9PSAyNCAmJiBzYW1wbGVfYnl0ZXMgPT0gMikKIAkJCXNhbXBsZV9ieXRlcyA9IDM7CiAJCWVsc2UgaWYgKHNhbXBsZV93aWR0aCA+IHNhbXBsZV9ieXRlcyAqIDgpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICIlZDoldTolZCA6IHNhbXBsZSBiaXR3aWR0aCAlZCBpbiBvdmVyIHNhbXBsZSBieXRlcyAlZFxuIiwKLQkJCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKLQkJCQkgICBzYW1wbGVfd2lkdGgsIHNhbXBsZV9ieXRlcyk7CisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLCAiJXU6JWQgOiBzYW1wbGUgYml0d2lkdGggJWQgaW4gb3ZlciBzYW1wbGUgYnl0ZXMgJWRcbiIsCisJCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCisJCQkJIHNhbXBsZV93aWR0aCwgc2FtcGxlX2J5dGVzKTsKIAkJfQogCQkvKiBjaGVjayB0aGUgZm9ybWF0IGJ5dGUgc2l6ZSAqLwogCQlzd2l0Y2ggKHNhbXBsZV9ieXRlcykgewpAQCAtMTA4LDkgKzEwOCwxMCBAQAogCQkJcGNtX2Zvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICIlZDoldTolZCA6IHVuc3VwcG9ydGVkIHNhbXBsZSBiaXR3aWR0aCAlZCBpbiAlZCBieXRlc1xuIiwKLQkJCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKLQkJCQkgICBzYW1wbGVfd2lkdGgsIHNhbXBsZV9ieXRlcyk7CisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJCSAiJXU6JWQgOiB1bnN1cHBvcnRlZCBzYW1wbGUgYml0d2lkdGggJWQgaW4gJWQgYnl0ZXNcbiIsCisJCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCisJCQkJIHNhbXBsZV93aWR0aCwgc2FtcGxlX2J5dGVzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTMyLDggKzEzMyw5IEBACiAJCXBjbV9mb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfTVVfTEFXOwogCX0KIAlpZiAoZm9ybWF0ICYgfjB4M2YpIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIiVkOiV1OiVkIDogdW5zdXBwb3J0ZWQgZm9ybWF0IGJpdHMgJSN4XG4iLAotCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZvcm1hdCk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsCisJCQkgIiV1OiVkIDogdW5zdXBwb3J0ZWQgZm9ybWF0IGJpdHMgJSN4XG4iLAorCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZvcm1hdCk7CiAJfQogCiAJcGNtX2Zvcm1hdHMgfD0gc25kX3VzYl9pbnRlcmZhY2VfZHNkX2Zvcm1hdF9xdWlya3MoY2hpcCwgZnAsIHNhbXBsZV9ieXRlcyk7CkBAIC0xNTgsOCArMTYwLDkgQEAKIAlpbnQgbnJfcmF0ZXMgPSBmbXRbb2Zmc2V0XTsKIAogCWlmIChmbXRbMF0gPCBvZmZzZXQgKyAxICsgMyAqIChucl9yYXRlcyA/IG5yX3JhdGVzIDogMikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAotCQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJIiV1OiVkIDogaW52YWxpZCBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKKwkJCWZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MSw3ICsxNzQsNyBAQAogCiAJCWZwLT5yYXRlX3RhYmxlID0ga21hbGxvYyhzaXplb2YoaW50KSAqIG5yX3JhdGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGZwLT5yYXRlX3RhYmxlID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQkJdXNiX2F1ZGlvX2VycihjaGlwLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0yMjIsNyArMjI1LDggQEAKICAqIGdldCB0byBrbm93IGhvdyBtYW55IHNhbXBsZSByYXRlcyB3ZSBoYXZlIHRvIGV4cGVjdC4KICAqIFRoZW4gZnAtPnJhdGVfdGFibGUgY2FuIGJlIGFsbG9jYXRlZCBhbmQgZmlsbGVkLgogICovCi1zdGF0aWMgaW50IHBhcnNlX3VhYzJfc2FtcGxlX3JhdGVfcmFuZ2Uoc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCwgaW50IG5yX3RyaXBsZXRzLAorc3RhdGljIGludCBwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJCQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwLCBpbnQgbnJfdHJpcGxldHMsCiAJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJaW50IGksIG5yX3JhdGVzID0gMDsKQEAgLTI2MSw3ICsyNjUsNyBAQAogCiAJCQlucl9yYXRlcysrOwogCQkJaWYgKG5yX3JhdGVzID49IE1BWF9OUl9SQVRFUykgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgdWFjMiByYXRlc1xuIik7CisJCQkJdXNiX2F1ZGlvX2VycihjaGlwLCAiaW52YWxpZCB1YWMyIHJhdGVzXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMjg3LDcgKzI5MSw4IEBACiAJaW50IGNsb2NrID0gc25kX3VzYl9jbG9ja19maW5kX3NvdXJjZShjaGlwLCBmcC0+Y2xvY2ssIGZhbHNlKTsKIAogCWlmIChjbG9jayA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXMoKTogdW5hYmxlIHRvIGZpbmQgY2xvY2sgc291cmNlIChjbG9jayAlZClcbiIsCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIiVzKCk6IHVuYWJsZSB0byBmaW5kIGNsb2NrIHNvdXJjZSAoY2xvY2sgJWQpXG4iLAogCQkJCV9fZnVuY19fLCBjbG9jayk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMwMCw3ICszMDUsOCBAQAogCQkJICAgICAgdG1wLCBzaXplb2YodG1wKSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgbnVtYmVyIG9mIHNhbXBsZSByYXRlcyAoY2xvY2sgJWQpXG4iLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgbnVtYmVyIG9mIHNhbXBsZSByYXRlcyAoY2xvY2sgJWQpXG4iLAogCQkJCV9fZnVuY19fLCBjbG9jayk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMyMSw3ICszMjcsOCBAQAogCQkJICAgICAgZGF0YSwgZGF0YV9zaXplKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzKCk6IHVuYWJsZSB0byByZXRyaWV2ZSBzYW1wbGUgcmF0ZSByYW5nZSAoY2xvY2sgJWQpXG4iLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgc2FtcGxlIHJhdGUgcmFuZ2UgKGNsb2NrICVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgY2xvY2spOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9mcmVlOwpAQCAtMzMyLDcgKzMzOSw3IEBACiAJICogd2lsbCBoYXZlIHRvIGRlYWwgd2l0aC4gKi8KIAlrZnJlZShmcC0+cmF0ZV90YWJsZSk7CiAJZnAtPnJhdGVfdGFibGUgPSBOVUxMOwotCWZwLT5ucl9yYXRlcyA9IHBhcnNlX3VhYzJfc2FtcGxlX3JhdGVfcmFuZ2UoZnAsIG5yX3RyaXBsZXRzLCBkYXRhKTsKKwlmcC0+bnJfcmF0ZXMgPSBwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKGNoaXAsIGZwLCBucl90cmlwbGV0cywgZGF0YSk7CiAKIAlpZiAoZnAtPm5yX3JhdGVzID09IDApIHsKIAkJLyogU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyAqLwpAQCAtMzQ4LDcgKzM1NSw3IEBACiAKIAkvKiBDYWxsIHRoZSB0cmlwbGV0IHBhcnNlciBhZ2FpbiwgYnV0IHRoaXMgdGltZSwgZnAtPnJhdGVfdGFibGUgaXMKIAkgKiBhbGxvY2F0ZWQsIHNvIHRoZSByYXRlcyB3aWxsIGJlIHN0b3JlZCAqLwotCXBhcnNlX3VhYzJfc2FtcGxlX3JhdGVfcmFuZ2UoZnAsIG5yX3RyaXBsZXRzLCBkYXRhKTsKKwlwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKGNoaXAsIGZwLCBucl90cmlwbGV0cywgZGF0YSk7CiAKIGVycl9mcmVlOgogCWtmcmVlKGRhdGEpOwpAQCAtNDA4LDggKzQxNSw5IEBACiAJfQogCiAJaWYgKGZwLT5jaGFubmVscyA8IDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIGNoYW5uZWxzICVkXG4iLAotCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZwLT5jaGFubmVscyk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSIldTolZCA6IGludmFsaWQgY2hhbm5lbHMgJWRcbiIsCisJCQlmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmcC0+Y2hhbm5lbHMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQzNSw4ICs0NDMsOSBAQAogCQlmcC0+Zm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfTVBFRzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZChLRVJOX0lORk8gIiVkOiV1OiVkIDogdW5rbm93biBmb3JtYXQgdGFnICUjeCBpcyBkZXRlY3RlZC4gIHByb2Nlc3NlZCBhcyBNUEVHLlxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmb3JtYXQpOworCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJICIldTolZCA6IHVua25vd24gZm9ybWF0IHRhZyAlI3ggaXMgZGV0ZWN0ZWQuICBwcm9jZXNzZWQgYXMgTVBFRy5cbiIsCisJCQkgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywgZm9ybWF0KTsKIAkJZnAtPmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX01QRUc7CiAJCWJyZWFrOwogCX0KQEAgLTQ0OSw3ICs0NTgsNyBAQAogCQlzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lpX2Rpc2NyZXRlX2Rlc2NyaXB0b3IgKmZtdCA9IF9mbXQ7CiAJCWJyYXRlID0gbGUxNl90b19jcHUoZm10LT53TWF4Qml0UmF0ZSk7CiAJCWZyYW1lc2l6ZSA9IGxlMTZfdG9fY3B1KGZtdC0+d1NhbXBsZXNQZXJGcmFtZSk7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJmb3VuZCBmb3JtYXQgSUkgd2l0aCBtYXguYml0cmF0ZSA9ICVkLCBmcmFtZSBzaXplPSVkXG4iLCBicmF0ZSwgZnJhbWVzaXplKTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgImZvdW5kIGZvcm1hdCBJSSB3aXRoIG1heC5iaXRyYXRlID0gJWQsIGZyYW1lIHNpemU9JWRcbiIsIGJyYXRlLCBmcmFtZXNpemUpOwogCQlmcC0+ZnJhbWVfc2l6ZSA9IGZyYW1lc2l6ZTsKIAkJcmV0ID0gcGFyc2VfYXVkaW9fZm9ybWF0X3JhdGVzX3YxKGNoaXAsIGZwLCBfZm10LCA4KTsgLyogZm10WzguLl0gc2FtcGxlIHJhdGVzICovCiAJCWJyZWFrOwpAQCAtNDU4LDcgKzQ2Nyw3IEBACiAJCXN0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaWlfZXh0X2Rlc2NyaXB0b3IgKmZtdCA9IF9mbXQ7CiAJCWJyYXRlID0gbGUxNl90b19jcHUoZm10LT53TWF4Qml0UmF0ZSk7CiAJCWZyYW1lc2l6ZSA9IGxlMTZfdG9fY3B1KGZtdC0+d1NhbXBsZXNQZXJGcmFtZSk7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJmb3VuZCBmb3JtYXQgSUkgd2l0aCBtYXguYml0cmF0ZSA9ICVkLCBmcmFtZSBzaXplPSVkXG4iLCBicmF0ZSwgZnJhbWVzaXplKTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgImZvdW5kIGZvcm1hdCBJSSB3aXRoIG1heC5iaXRyYXRlID0gJWQsIGZyYW1lIHNpemU9JWRcbiIsIGJyYXRlLCBmcmFtZXNpemUpOwogCQlmcC0+ZnJhbWVfc2l6ZSA9IGZyYW1lc2l6ZTsKIAkJcmV0ID0gcGFyc2VfYXVkaW9fZm9ybWF0X3JhdGVzX3YyKGNoaXAsIGZwKTsKIAkJYnJlYWs7CkBAIC00ODQsOSArNDkzLDEwIEBACiAJCWVyciA9IHBhcnNlX2F1ZGlvX2Zvcm1hdF9paShjaGlwLCBmcCwgZm9ybWF0LCBmbXQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiBmb3JtYXQgdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldFxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLAotCQkJICAgZm10LT5iRm9ybWF0VHlwZSk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsCisJCQkgIiV1OiVkIDogZm9ybWF0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIsCisJCQkgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKKwkJCSBmbXQtPmJGb3JtYXRUeXBlKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAJZnAtPmZtdF90eXBlID0gZm10LT5iRm9ybWF0VHlwZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jIGIvc291bmQvdXNiL2hpZmFjZS9jaGlwLmMKaW5kZXggYjBkY2IzOS4uMjY3MGQ2NDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jCisrKyBiL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jCkBAIC02NCw3ICs2NCw4IEBACiAJdTggZXh0cmFfZnJlcTsKIH07CiAKLXN0YXRpYyBpbnQgaGlmYWNlX2NoaXBfY3JlYXRlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsCitzdGF0aWMgaW50IGhpZmFjZV9jaGlwX2NyZWF0ZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaGlmYWNlX3ZlbmRvcl9xdWlyayAqcXVpcmssCiAJCQkgICAgICBzdHJ1Y3QgaGlmYWNlX2NoaXAgKipyY2hpcCkKIHsKQEAgLTc2LDcgKzc3LDggQEAKIAkqcmNoaXAgPSBOVUxMOwogCiAJLyogaWYgd2UgYXJlIGhlcmUsIGNhcmQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYWxzYS4gKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbaWR4XSwgaWRbaWR4XSwgVEhJU19NT0RVTEUsIHNpemVvZigqY2hpcCksICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJmludGYtPmRldiwgaW5kZXhbaWR4XSwgaWRbaWR4XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKmNoaXApLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmZGV2aWNlLT5kZXYsICJjYW5ub3QgY3JlYXRlIGFsc2EgY2FyZC5cbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTMyLDEyICsxMzQsMTAgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gaGlmYWNlX2NoaXBfY3JlYXRlKGRldmljZSwgaSwgcXVpcmssICZjaGlwKTsKKwlyZXQgPSBoaWZhY2VfY2hpcF9jcmVhdGUoaW50ZiwgZGV2aWNlLCBpLCBxdWlyaywgJmNoaXApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2hpcC0+Y2FyZCwgJmludGYtPmRldik7Ci0KIAlyZXQgPSBoaWZhY2VfcGNtX2luaXQoY2hpcCwgcXVpcmsgPyBxdWlyay0+ZXh0cmFfZnJlcSA6IDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9jaGlwX2Rlc3Ryb3k7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWlkaS5jIGIvc291bmQvdXNiL21pZGkuYwppbmRleCBiOTAxZjQ2Li45ZGE3NGQyIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWlkaS5jCisrKyBiL3NvdW5kL3VzYi9taWRpLmMKQEAgLTE5MSwxNiArMTkxLDE2IEBACiB7CiAJaW50IGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgZmxhZ3MpOwogCWlmIChlcnIgPCAwICYmIGVyciAhPSAtRU5PREVWKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2Jfc3VibWl0X3VyYjogJWRcbiIsIGVycik7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYjogJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIAogLyoKICAqIEVycm9yIGhhbmRsaW5nIGZvciBVUkIgY29tcGxldGlvbiBmdW5jdGlvbnMuCiAgKi8KLXN0YXRpYyBpbnQgc25kX3VzYm1pZGlfdXJiX2Vycm9yKGludCBzdGF0dXMpCitzdGF0aWMgaW50IHNuZF91c2JtaWRpX3VyYl9lcnJvcihjb25zdCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3dpdGNoIChzdGF0dXMpIHsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJLyogbWFudWFsbHkgdW5saW5rZWQsIG9yIGRldmljZSBnb25lICovCiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVDT05OUkVTRVQ6CkBAIC0yMTMsNyArMjEzLDcgQEAKIAljYXNlIC1FSUxTRVE6CiAJCXJldHVybiAtRUlPOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVyYiBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJ1cmIgc3RhdHVzICVkXG4iLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybiAwOyAvKiBjb250aW51ZSAqLwogCX0KIH0KQEAgLTIyNyw3ICsyMjcsNyBAQAogCXN0cnVjdCB1c2JtaWRpX2luX3BvcnQqIHBvcnQgPSAmZXAtPnBvcnRzW3BvcnRpZHhdOwogCiAJaWYgKCFwb3J0LT5zdWJzdHJlYW0pIHsKLQkJc25kX3ByaW50ZCgidW5leHBlY3RlZCBwb3J0ICVkIVxuIiwgcG9ydGlkeCk7CisJCWRldl9kYmcoJmVwLT51bWlkaS0+ZGV2LT5kZXYsICJ1bmV4cGVjdGVkIHBvcnQgJWQhXG4iLCBwb3J0aWR4KTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIXRlc3RfYml0KHBvcnQtPnN1YnN0cmVhbS0+bnVtYmVyLCAmZXAtPnVtaWRpLT5pbnB1dF90cmlnZ2VyZWQpKQpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCWVwLT51bWlkaS0+dXNiX3Byb3RvY29sX29wcy0+aW5wdXQoZXAsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAogCQkJCQkJICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAl9IGVsc2UgewotCQlpbnQgZXJyID0gc25kX3VzYm1pZGlfdXJiX2Vycm9yKHVyYi0+c3RhdHVzKTsKKwkJaW50IGVyciA9IHNuZF91c2JtaWRpX3VyYl9lcnJvcih1cmIpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGVyciAhPSAtRU5PREVWKSB7CiAJCQkJZXAtPmVycm9yX3Jlc3VibWl0ID0gMTsKQEAgLTI4OSw3ICsyODksNyBAQAogCX0KIAlzcGluX3VubG9jaygmZXAtPmJ1ZmZlcl9sb2NrKTsKIAlpZiAodXJiLT5zdGF0dXMgPCAwKSB7Ci0JCWludCBlcnIgPSBzbmRfdXNibWlkaV91cmJfZXJyb3IodXJiLT5zdGF0dXMpOworCQlpbnQgZXJyID0gc25kX3VzYm1pZGlfdXJiX2Vycm9yKHVyYik7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlpZiAoZXJyICE9IC1FTk9ERVYpCiAJCQkJbW9kX3RpbWVyKCZlcC0+dW1pZGktPmVycm9yX3RpbWVyLApAQCAtMTY2OCw3ICsxNjY4LDcgQEAKIAogCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHNuZF91c2JtaWRpX2ZpbmRfc3Vic3RyZWFtKHVtaWRpLCBzdHJlYW0sIG51bWJlcik7CiAJaWYgKCFzdWJzdHJlYW0pIHsKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAic3Vic3RyZWFtICVkOiVkIG5vdCBmb3VuZFxuIiwgc3RyZWFtLCBudW1iZXIpOworCQlkZXZfZXJyKCZ1bWlkaS0+ZGV2LT5kZXYsICJzdWJzdHJlYW0gJWQ6JWQgbm90IGZvdW5kXG4iLCBzdHJlYW0sIG51bWJlcik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3MTcsNyArMTcxNyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjcmVhdGVkICVkIG91dHB1dCBhbmQgJWQgaW5wdXQgcG9ydHNcbiIsCisJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAiY3JlYXRlZCAlZCBvdXRwdXQgYW5kICVkIGlucHV0IHBvcnRzXG4iLAogCQkgICAgb3V0X3BvcnRzLCBpbl9wb3J0cyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzQ3LDEwICsxNzQ3LDExIEBACiAJICAgIG1zX2hlYWRlci0+Ykxlbmd0aCA+PSA3ICYmCiAJICAgIG1zX2hlYWRlci0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9DU19JTlRFUkZBQ0UgJiYKIAkgICAgbXNfaGVhZGVyLT5iRGVzY3JpcHRvclN1YnR5cGUgPT0gVUFDX0hFQURFUikKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJNSURJU3RyZWFtaW5nIHZlcnNpb24gJTAyeC4lMDJ4XG4iLAorCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJNSURJU3RyZWFtaW5nIHZlcnNpb24gJTAyeC4lMDJ4XG4iLAogCQkJICAgIG1zX2hlYWRlci0+YmNkTVNDWzFdLCBtc19oZWFkZXItPmJjZE1TQ1swXSk7CiAJZWxzZQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiTUlESVN0cmVhbWluZyBpbnRlcmZhY2UgZGVzY3JpcHRvciBub3QgZm91bmRcbiIpOworCQlkZXZfd2FybigmdW1pZGktPmRldi0+ZGV2LAorCQkJICJNSURJU3RyZWFtaW5nIGludGVyZmFjZSBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIik7CiAKIAllcGlkeCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IGludGZkLT5iTnVtRW5kcG9pbnRzOyArK2kpIHsKQEAgLTE3NjcsNyArMTc2OCw4IEBACiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX291dChlcCkpIHsKIAkJCWlmIChlbmRwb2ludHNbZXBpZHhdLm91dF9lcCkgewogCQkJCWlmICgrK2VwaWR4ID49IE1JRElfTUFYX0VORFBPSU5UUykgewotCQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKKwkJCQkJZGV2X3dhcm4oJnVtaWRpLT5kZXYtPmRldiwKKwkJCQkJCSAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMTc4MiwxMiArMTc4NCwxMyBAQAogCQkJCSAqLwogCQkJCWVuZHBvaW50c1tlcGlkeF0ub3V0X2ludGVydmFsID0gMTsKIAkJCWVuZHBvaW50c1tlcGlkeF0ub3V0X2NhYmxlcyA9ICgxIDw8IG1zX2VwLT5iTnVtRW1iTUlESUphY2spIC0gMTsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiRVAgJTAyWDogJWQgamFjayhzKVxuIiwKKwkJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgIkVQICUwMlg6ICVkIGphY2socylcbiIsCiAJCQkJICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzLCBtc19lcC0+Yk51bUVtYk1JRElKYWNrKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChlbmRwb2ludHNbZXBpZHhdLmluX2VwKSB7CiAJCQkJaWYgKCsrZXBpZHggPj0gTUlESV9NQVhfRU5EUE9JTlRTKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ0b28gbWFueSBlbmRwb2ludHNcbiIpOworCQkJCQlkZXZfd2FybigmdW1pZGktPmRldi0+ZGV2LAorCQkJCQkJICJ0b28gbWFueSBlbmRwb2ludHNcbiIpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0xNzk3LDcgKzE4MDAsNyBAQAogCQkJZWxzZSBpZiAoc25kX3VzYl9nZXRfc3BlZWQodW1pZGktPmRldikgPT0gVVNCX1NQRUVEX0xPVykKIAkJCQllbmRwb2ludHNbZXBpZHhdLmluX2ludGVydmFsID0gMTsKIAkJCWVuZHBvaW50c1tlcGlkeF0uaW5fY2FibGVzID0gKDEgPDwgbXNfZXAtPmJOdW1FbWJNSURJSmFjaykgLSAxOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJFUCAlMDJYOiAlZCBqYWNrKHMpXG4iLAorCQkJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAiRVAgJTAyWDogJWQgamFjayhzKVxuIiwKIAkJCQkgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MsIG1zX2VwLT5iTnVtRW1iTUlESUphY2spOwogCQl9CiAJfQpAQCAtMTg2NSw3ICsxODY4LDcgQEAKIAkgICAgKGdldF9lbmRwb2ludChob3N0aWYsIDEpLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQogCQlyZXR1cm47CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInN3aXRjaGluZyB0byBhbHRzZXR0aW5nICVkIHdpdGggaW50IGVwXG4iLAorCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgInN3aXRjaGluZyB0byBhbHRzZXR0aW5nICVkIHdpdGggaW50IGVwXG4iLAogCQkgICAgaW50ZmQtPmJBbHRlcm5hdGVTZXR0aW5nKTsKIAl1c2Jfc2V0X2ludGVyZmFjZSh1bWlkaS0+ZGV2LCBpbnRmZC0+YkludGVyZmFjZU51bWJlciwKIAkJCSAgaW50ZmQtPmJBbHRlcm5hdGVTZXR0aW5nKTsKQEAgLTIwNDcsMjUgKzIwNTAsMjUgQEAKIAkgKiBpbnB1dCBidWxrIGVuZHBvaW50cyAoYXQgaW5kaWNlcyAxIGFuZCAzKSB3aGljaCBhcmVuJ3QgdXNlZC4KIAkgKi8KIAlpZiAoaW50ZmQtPmJOdW1FbmRwb2ludHMgPCAoZW5kcG9pbnQtPm91dF9jYWJsZXMgPiAweDAwMDEgPyA1IDogMykpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIm5vdCBlbm91Z2ggZW5kcG9pbnRzXG4iKTsKKwkJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAibm90IGVub3VnaCBlbmRwb2ludHNcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAllcGQgPSBnZXRfZW5kcG9pbnQoaG9zdGlmLCAwKTsKIAlpZiAoIXVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImVuZHBvaW50WzBdIGlzbid0IGludGVycnVwdFxuIik7CisJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgImVuZHBvaW50WzBdIGlzbid0IGludGVycnVwdFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDIpOwogCWlmICghdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFsyXSBpc24ndCBidWxrIG91dHB1dFxuIik7CisJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgImVuZHBvaW50WzJdIGlzbid0IGJ1bGsgb3V0cHV0XG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJaWYgKGVuZHBvaW50LT5vdXRfY2FibGVzID4gMHgwMDAxKSB7CiAJCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDQpOwogCQlpZiAoIXVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkgfHwKIAkJICAgICF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFs0XSBpc24ndCBidWxrIG91dHB1dFxuIik7CisJCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJlbmRwb2ludFs0XSBpc24ndCBidWxrIG91dHB1dFxuIik7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQpAQCAtMjI4OSw3ICsyMjkyLDcgQEAKIAkJZXJyID0gc25kX3VzYm1pZGlfZGV0ZWN0X3Blcl9wb3J0X2VuZHBvaW50cyh1bWlkaSwgZW5kcG9pbnRzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCBxdWlyayB0eXBlICVkXG4iLCBxdWlyay0+dHlwZSk7CisJCWRldl9lcnIoJnVtaWRpLT5kZXYtPmRldiwgImludmFsaWQgcXVpcmsgdHlwZSAlZFxuIiwgcXVpcmstPnR5cGUpOwogCQllcnIgPSAtRU5YSU87CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMgYi9zb3VuZC91c2IvbWlzYy91YTEwMS5jCmluZGV4IDUwOTMxNTkuLmExYmFiMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMKKysrIGIvc291bmQvdXNiL21pc2MvdWExMDEuYwpAQCAtMTI0Myw4ICsxMjQzLDkgQEAKIAkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX211dGV4KTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtjYXJkX2luZGV4XSwgaWRbY2FyZF9pbmRleF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKCp1YSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmludGVyZmFjZS0+ZGV2LAorCQkJICAgaW5kZXhbY2FyZF9pbmRleF0sIGlkW2NhcmRfaW5kZXhdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqdWEpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX211dGV4KTsKIAkJcmV0dXJuIGVycjsKQEAgLTEyODMsOCArMTI4NCw2IEBACiAJCX0KIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZpbnRlcmZhY2UtPmRldik7Ci0KIAllcnIgPSBkZXRlY3RfdXNiX2Zvcm1hdCh1YSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gcHJvYmVfZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuYyBiL3NvdW5kL3VzYi9taXhlci5jCmluZGV4IDFiZWQ3ODAuLmQ0MGEyODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhlci5jCkBAIC0zMDUsOCArMzA1LDkgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQotCXNuZF9wcmludGRkKEtFUk5fRVJSICJjYW5ub3QgZ2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkXG4iLAotCQkgICAgcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlKTsKKwl1c2JfYXVkaW9fZGJnKGNoaXAsCisJCSJjYW5ub3QgZ2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkXG4iLAorCQlyZXF1ZXN0LCB2YWxpZHgsIGlkeCwgY3ZhbC0+dmFsX3R5cGUpOwogCWVyciA9IC1FSU5WQUw7CiAKICBvdXQ6CkBAIC0zNTEsOCArMzUyLDkgQEAKIAogCWlmIChyZXQgPCAwKSB7CiBlcnJvcjoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdldCBjdGwgdmFsdWU6IHJlcSA9ICUjeCwgd1ZhbHVlID0gJSN4LCB3SW5kZXggPSAlI3gsIHR5cGUgPSAlZFxuIiwKLQkJCSAgIHJlcXVlc3QsIHZhbGlkeCwgaWR4LCBjdmFsLT52YWxfdHlwZSk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSJjYW5ub3QgZ2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkXG4iLAorCQkJcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQxMyw3ICs0MTUsOCBAQAogCWVyciA9IGdldF9jdXJfbWl4X3JhdyhjdmFsLCBjaGFubmVsLCB2YWx1ZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKCFjdmFsLT5taXhlci0+aWdub3JlX2N0bF9lcnJvcikKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImNhbm5vdCBnZXQgY3VycmVudCB2YWx1ZSBmb3IgY29udHJvbCAlZCBjaCAlZDogZXJyID0gJWRcbiIsCisJCQl1c2JfYXVkaW9fZGJnKGN2YWwtPm1peGVyLT5jaGlwLAorCQkJCSJjYW5ub3QgZ2V0IGN1cnJlbnQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgY2ggJWQ6IGVyciA9ICVkXG4iLAogCQkJCSAgIGN2YWwtPmNvbnRyb2wsIGNoYW5uZWwsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNDQ0LDcgKzQ0Nyw3IEBACiAKIAkJLyogRklYTUUgKi8KIAkJaWYgKHJlcXVlc3QgIT0gVUFDX1NFVF9DVVIpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fV0FSTklORyAiUkFOR0Ugc2V0dGluZyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisJCQl1c2JfYXVkaW9fZGJnKGNoaXAsICJSQU5HRSBzZXR0aW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ3MCw3ICs0NzMsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9FUlIgImNhbm5vdCBzZXQgY3RsIHZhbHVlOiByZXEgPSAlI3gsIHdWYWx1ZSA9ICUjeCwgd0luZGV4ID0gJSN4LCB0eXBlID0gJWQsIGRhdGEgPSAlI3gvJSN4XG4iLAorCXVzYl9hdWRpb19kYmcoY2hpcCwgImNhbm5vdCBzZXQgY3RsIHZhbHVlOiByZXEgPSAlI3gsIHdWYWx1ZSA9ICUjeCwgd0luZGV4ID0gJSN4LCB0eXBlID0gJWQsIGRhdGEgPSAlI3gvJSN4XG4iLAogCQkgICAgcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlLCBidWZbMF0sIGJ1ZlsxXSk7CiAJZXJyID0gLUVJTlZBTDsKIApAQCAtNDk0LDcgKzQ5Nyw4IEBACiAJCWN2YWwtPmNoX3JlYWRvbmx5ICYgKDEgPDwgKGNoYW5uZWwgLSAxKSk7CiAKIAlpZiAocmVhZF9vbmx5KSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJXMoKTogY2hhbm5lbCAlZCBvZiBjb250cm9sICVkIGlzIHJlYWRfb25seVxuIiwKKwkJdXNiX2F1ZGlvX2RiZyhjdmFsLT5taXhlci0+Y2hpcCwKKwkJCSAgICAgICIlcygpOiBjaGFubmVsICVkIG9mIGNvbnRyb2wgJWQgaXMgcmVhZF9vbmx5XG4iLAogCQkJICAgIF9fZnVuY19fLCBjaGFubmVsLCBjdmFsLT5jb250cm9sKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTYwLDcgKzU2NCw3IEBACiAJd2hpbGUgKHNuZF9jdGxfZmluZF9pZChtaXhlci0+Y2hpcC0+Y2FyZCwgJmtjdGwtPmlkKSkKIAkJa2N0bC0+aWQuaW5kZXgrKzsKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKG1peGVyLT5jaGlwLT5jYXJkLCBrY3RsKSkgPCAwKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImNhbm5vdCBhZGQgY29udHJvbCAoZXJyID0gJWQpXG4iLCBlcnIpOworCQl1c2JfYXVkaW9fZGJnKG1peGVyLT5jaGlwLCAiY2Fubm90IGFkZCBjb250cm9sIChlcnIgPSAlZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWN2YWwtPmVsZW1faWQgPSAma2N0bC0+aWQ7CkBAIC04MDcsNyArODExLDggQEAKIHN0YXRpYyB2b2lkIHZvbHVtZV9jb250cm9sX3F1aXJrcyhzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCwKIAkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwpCiB7Ci0Jc3dpdGNoIChjdmFsLT5taXhlci0+Y2hpcC0+dXNiX2lkKSB7CisJc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSBjdmFsLT5taXhlci0+Y2hpcDsKKwlzd2l0Y2ggKGNoaXAtPnVzYl9pZCkgewogCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDMwKTogLyogTS1BdWRpbyBGYXN0IFRyYWNrIEM0MDAgKi8KIAljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAzMSk6IC8qIE0tQXVkaW8gRmFzdCBUcmFjayBDNjAwICovCiAJCWlmIChzdHJjbXAoa2N0bC0+aWQubmFtZSwgIkVmZmVjdCBEdXJhdGlvbiIpID09IDApIHsKQEAgLTgzOSw4ICs4NDQsOCBAQAogCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDgxKTogLyogTS1BdWRpbyBGYXN0IFRyYWNrIFVsdHJhIDhSICovCiAJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwODApOiAvKiBNLUF1ZGlvIEZhc3QgVHJhY2sgVWx0cmEgKi8KIAkJaWYgKHN0cmNtcChrY3RsLT5pZC5uYW1lLCAiRWZmZWN0IER1cmF0aW9uIikgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkidXNiLWF1ZGlvOiBzZXQgcXVpcmsgZm9yIEZUVSBFZmZlY3QgRHVyYXRpb25cbiIpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCQkgICAgICAgInNldCBxdWlyayBmb3IgRlRVIEVmZmVjdCBEdXJhdGlvblxuIik7CiAJCQljdmFsLT5taW4gPSAweDAwMDA7CiAJCQljdmFsLT5tYXggPSAweDdmMDA7CiAJCQljdmFsLT5yZXMgPSAweDAxMDA7CkBAIC04NDgsOCArODUzLDggQEAKIAkJfQogCQlpZiAoc3RyY21wKGtjdGwtPmlkLm5hbWUsICJFZmZlY3QgVm9sdW1lIikgPT0gMCB8fAogCQkgICAgc3RyY21wKGtjdGwtPmlkLm5hbWUsICJFZmZlY3QgRmVlZGJhY2sgVm9sdW1lIikgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkidXNiLWF1ZGlvOiBzZXQgcXVpcmtzIGZvciBGVFUgRWZmZWN0IEZlZWRiYWNrL1ZvbHVtZVxuIik7CisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJCSAgICAgICAic2V0IHF1aXJrcyBmb3IgRlRVIEVmZmVjdCBGZWVkYmFjay9Wb2x1bWVcbiIpOwogCQkJY3ZhbC0+bWluID0gMHgwMDsKIAkJCWN2YWwtPm1heCA9IDB4N2Y7CiAJCQlicmVhazsKQEAgLTg2Nyw3ICs4NzIsNyBAQAogCSAqLwogCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiUENNIFBsYXliYWNrIFZvbHVtZSIpICYmCiAJCSAgICBjdmFsLT5taW4gPT0gLTE1NjE2KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKIAkJCQkgInNldCB2b2x1bWUgcXVpcmsgZm9yIFVEQTEzMjEvTjEwMSBjaGlwXG4iKTsKIAkJCWN2YWwtPm1heCA9IC0yNTY7CiAJCX0KQEAgLTg3NSw3ICs4ODAsNyBAQAogCiAJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA5YTQpOgogCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiTWljIENhcHR1cmUgVm9sdW1lIikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLAogCQkJCSJzZXQgdm9sdW1lIHF1aXJrIGZvciBRdWlja0NhbSBFMzUwMFxuIik7CiAJCQljdmFsLT5taW4gPSA2MDgwOwogCQkJY3ZhbC0+bWF4ID0gODc2ODsKQEAgLTg5Niw3ICs5MDEsNyBAQAogCSAqIFByb2JvbHkgdGhlcmUgaXMgc29tZSBsb2dpdGVjaCBtYWdpYyBiZWhpbmQgdGhpcyBudW1iZXIgLS1maXNob3IKIAkgKi8KIAkJaWYgKCFzdHJjbXAoa2N0bC0+aWQubmFtZSwgIk1pYyBDYXB0dXJlIFZvbHVtZSIpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKIAkJCQkic2V0IHJlc29sdXRpb24gcXVpcms6IGN2YWwtPnJlcyA9IDM4NFxuIik7CiAJCQljdmFsLT5yZXMgPSAzODQ7CiAJCX0KQEAgLTkzMiw3ICs5MzcsOCBAQAogCQl9CiAJCWlmIChnZXRfY3RsX3ZhbHVlKGN2YWwsIFVBQ19HRVRfTUFYLCAoY3ZhbC0+Y29udHJvbCA8PCA4KSB8IG1pbmNobiwgJmN2YWwtPm1heCkgPCAwIHx8CiAJCSAgICBnZXRfY3RsX3ZhbHVlKGN2YWwsIFVBQ19HRVRfTUlOLCAoY3ZhbC0+Y29udHJvbCA8PCA4KSB8IG1pbmNobiwgJmN2YWwtPm1pbikgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fRVJSICIlZDolZDogY2Fubm90IGdldCBtaW4vbWF4IHZhbHVlcyBmb3IgY29udHJvbCAlZCAoaWQgJWQpXG4iLAorCQkJdXNiX2F1ZGlvX2VycihjdmFsLT5taXhlci0+Y2hpcCwKKwkJCQkgICAgICAiJWQ6JWQ6IGNhbm5vdCBnZXQgbWluL21heCB2YWx1ZXMgZm9yIGNvbnRyb2wgJWQgKGlkICVkKVxuIiwKIAkJCQkgICBjdmFsLT5pZCwgc25kX3VzYl9jdHJsX2ludGYoY3ZhbC0+bWl4ZXItPmNoaXApLCBjdmFsLT5jb250cm9sLCBjdmFsLT5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTE5Niw3ICsxMjAyLDcgQEAKIAogCWN2YWwgPSBremFsbG9jKHNpemVvZigqY3ZhbCksIEdGUF9LRVJORUwpOwogCWlmICghIGN2YWwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJcmV0dXJuOwogCX0KIAljdmFsLT5taXhlciA9IHN0YXRlLT5taXhlcjsKQEAgLTEyMjUsNyArMTIzMSw3IEBACiAJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnVzYl9mZWF0dXJlX3VuaXRfY3RsLCBjdmFsKTsKIAogCWlmICghIGtjdGwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJa2ZyZWUoY3ZhbCk7CiAJCXJldHVybjsKIAl9CkBAIC0xMjk5LDE2ICsxMzA1LDE2IEBACiAJICogZGV2aWNlcy4gSXQgd2lsbCBkZWZpbml0aXZlbHkgY2F0Y2ggYWxsIGJ1Z2d5IExvZ2l0ZWNoIGRldmljZXMuCiAJICovCiAJaWYgKHJhbmdlID4gMzg0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ1c2JfYXVkaW86IFdhcm5pbmchIFVubGlrZWx5IGJpZyAiCisJCXVzYl9hdWRpb193YXJuKHN0YXRlLT5jaGlwLCAiV2FybmluZyEgVW5saWtlbHkgYmlnICIKIAkJCSAgICJ2b2x1bWUgcmFuZ2UgKD0ldSksIGN2YWwtPnJlcyBpcyBwcm9iYWJseSB3cm9uZy4iLAogCQkJICAgcmFuZ2UpOwotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidXNiX2F1ZGlvOiBbJWRdIEZVIFslc10gY2ggPSAlZCwgIgorCQl1c2JfYXVkaW9fd2FybihzdGF0ZS0+Y2hpcCwgIlslZF0gRlUgWyVzXSBjaCA9ICVkLCAiCiAJCQkgICAidmFsID0gJWQvJWQvJWQiLCBjdmFsLT5pZCwKIAkJCSAgIGtjdGwtPmlkLm5hbWUsIGN2YWwtPmNoYW5uZWxzLAogCQkJICAgY3ZhbC0+bWluLCBjdmFsLT5tYXgsIGN2YWwtPnJlcyk7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJbJWRdIEZVIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWQvJWRcbiIsCisJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwgIlslZF0gRlUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZC8lZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBjdmFsLT5jaGFubmVscywgY3ZhbC0+bWluLCBjdmFsLT5tYXgsIGN2YWwtPnJlcyk7CiAJc25kX3VzYl9taXhlcl9hZGRfY29udHJvbChzdGF0ZS0+bWl4ZXIsIGtjdGwpOwogfQpAQCAtMTMzMiwxNiArMTMzOCwxNyBAQAogCWlmIChzdGF0ZS0+bWl4ZXItPnByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpIHsKIAkJY3NpemUgPSBoZHItPmJDb250cm9sU2l6ZTsKIAkJaWYgKCFjc2l6ZSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICV1OiAiCi0JCQkJICAgICJpbnZhbGlkIGJDb250cm9sU2l6ZSA9PSAwXG4iLCB1bml0aWQpOworCQkJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwKKwkJCQkgICAgICAidW5pdCAldTogaW52YWxpZCBiQ29udHJvbFNpemUgPT0gMFxuIiwKKwkJCQkgICAgICB1bml0aWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJY2hhbm5lbHMgPSAoaGRyLT5iTGVuZ3RoIC0gNykgLyBjc2l6ZSAtIDE7CiAJCWJtYUNvbnRyb2xzID0gaGRyLT5ibWFDb250cm9sczsKIAkJaWYgKGhkci0+Ykxlbmd0aCA8IDcgKyBjc2l6ZSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiYXVkaW86IHVuaXQgJXU6ICIKLQkJCQkgICAiaW52YWxpZCBVQUNfRkVBVFVSRV9VTklUIGRlc2NyaXB0b3JcbiIsCi0JCQkJICAgdW5pdGlkKTsKKwkJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsCisJCQkJICAgICAgInVuaXQgJXU6IGludmFsaWQgVUFDX0ZFQVRVUkVfVU5JVCBkZXNjcmlwdG9yXG4iLAorCQkJCSAgICAgIHVuaXRpZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMzUwLDkgKzEzNTcsOSBAQAogCQljaGFubmVscyA9IChoZHItPmJMZW5ndGggLSA2KSAvIDQgLSAxOwogCQlibWFDb250cm9scyA9IGZ0ci0+Ym1hQ29udHJvbHM7CiAJCWlmIChoZHItPmJMZW5ndGggPCA2ICsgY3NpemUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICV1OiAiCi0JCQkJICAgImludmFsaWQgVUFDX0ZFQVRVUkVfVU5JVCBkZXNjcmlwdG9yXG4iLAotCQkJCSAgIHVuaXRpZCk7CisJCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJCSAgICAgICJ1bml0ICV1OiBpbnZhbGlkIFVBQ19GRUFUVVJFX1VOSVQgZGVzY3JpcHRvclxuIiwKKwkJCQkgICAgICB1bml0aWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0xMzcwLDE0ICsxMzc3LDE0IEBACiAJLyogbWFzdGVyIGNvbmZpZ3VyYXRpb24gcXVpcmtzICovCiAJc3dpdGNoIChzdGF0ZS0+Y2hpcC0+dXNiX2lkKSB7CiAJY2FzZSBVU0JfSUQoMHgwOGJiLCAweDI3MDIpOgotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgInVzYm1peGVyOiBtYXN0ZXIgdm9sdW1lIHF1aXJrIGZvciBQQ00yNzAyIGNoaXBcbiIpOworCQl1c2JfYXVkaW9faW5mbyhzdGF0ZS0+Y2hpcCwKKwkJCSAgICAgICAidXNibWl4ZXI6IG1hc3RlciB2b2x1bWUgcXVpcmsgZm9yIFBDTTI3MDIgY2hpcFxuIik7CiAJCS8qIGRpc2FibGUgbm9uLWZ1bmN0aW9uYWwgdm9sdW1lIGNvbnRyb2wgKi8KIAkJbWFzdGVyX2JpdHMgJj0gflVBQ19DT05UUk9MX0JJVChVQUNfRlVfVk9MVU1FKTsKIAkJYnJlYWs7CiAJY2FzZSBVU0JfSUQoMHgxMTMwLCAweGYyMTEpOgotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgInVzYm1peGVyOiB2b2x1bWUgY29udHJvbCBxdWlyayBmb3IgVGVueCBUUDY5MTEgQXVkaW8gSGVhZHNldFxuIik7CisJCXVzYl9hdWRpb19pbmZvKHN0YXRlLT5jaGlwLAorCQkJICAgICAgICJ1c2JtaXhlcjogdm9sdW1lIGNvbnRyb2wgcXVpcmsgZm9yIFRlbnggVFA2OTExIEF1ZGlvIEhlYWRzZXRcbiIpOwogCQkvKiBkaXNhYmxlIG5vbi1mdW5jdGlvbmFsIHZvbHVtZSBjb250cm9sICovCiAJCWNoYW5uZWxzID0gMDsKIAkJYnJlYWs7CkBAIC0xNDc5LDcgKzE0ODYsNyBAQAogCiAJa2N0bCA9IHNuZF9jdGxfbmV3MSgmdXNiX2ZlYXR1cmVfdW5pdF9jdGwsIGN2YWwpOwogCWlmICghIGtjdGwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJa2ZyZWUoY3ZhbCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNDkyLDcgKzE0OTksNyBAQAogCQlsZW4gPSBzcHJpbnRmKGtjdGwtPmlkLm5hbWUsICJNaXhlciBTb3VyY2UgJWQiLCBpbl9jaCArIDEpOwogCWFwcGVuZF9jdGxfbmFtZShrY3RsLCAiIFZvbHVtZSIpOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJbJWRdIE1VIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWRcbiIsCisJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwgIlslZF0gTVUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBjdmFsLT5jaGFubmVscywgY3ZhbC0+bWluLCBjdmFsLT5tYXgpOwogCXNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woc3RhdGUtPm1peGVyLCBrY3RsKTsKIH0KQEAgLTE1MDksMTIgKzE1MTYsMTIgQEAKIAlpbnQgcGluLCBpY2gsIGVycjsKIAogCWlmIChkZXNjLT5iTGVuZ3RoIDwgMTEgfHwgISAoaW5wdXRfcGlucyA9IGRlc2MtPmJOckluUGlucykgfHwgISAobnVtX291dHMgPSB1YWNfbWl4ZXJfdW5pdF9iTnJDaGFubmVscyhkZXNjKSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBNSVhFUiBVTklUIGRlc2NyaXB0b3IgJWRcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJpbnZhbGlkIE1JWEVSIFVOSVQgZGVzY3JpcHRvciAlZFxuIiwgdW5pdGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIG5vIGJtQ29udHJvbHMgZmllbGQgKGUuZy4gTWF5YTQ0KSAtPiBpZ25vcmUgKi8KIAlpZiAoZGVzYy0+Ykxlbmd0aCA8PSAxMCArIGlucHV0X3BpbnMpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJNVSAlZCBoYXMgbm8gYm1Db250cm9scyBmaWVsZFxuIiwgdW5pdGlkKTsKKwkJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwgIk1VICVkIGhhcyBubyBibUNvbnRyb2xzIGZpZWxkXG4iLCB1bml0aWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE3MTMsNyArMTcyMCw3IEBACiAKIAlpZiAoZGVzYy0+Ykxlbmd0aCA8IDEzIHx8IGRlc2MtPmJMZW5ndGggPCAxMyArIG51bV9pbnMgfHwKIAkgICAgZGVzYy0+Ykxlbmd0aCA8IG51bV9pbnMgKyB1YWNfcHJvY2Vzc2luZ191bml0X2JDb250cm9sU2l6ZShkZXNjLCBzdGF0ZS0+bWl4ZXItPnByb3RvY29sKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkICVzIGRlc2NyaXB0b3IgKGlkICVkKVxuIiwgbmFtZSwgdW5pdGlkKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImludmFsaWQgJXMgZGVzY3JpcHRvciAoaWQgJWQpXG4iLCBuYW1lLCB1bml0aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MzksNyArMTc0Niw3IEBACiAJCQljb250aW51ZTsKIAkJY3ZhbCA9IGt6YWxsb2Moc2l6ZW9mKCpjdmFsKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghIGN2YWwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJY3ZhbC0+bWl4ZXIgPSBzdGF0ZS0+bWl4ZXI7CkBAIC0xNzcxLDcgKzE3NzgsNyBAQAogCiAJCWtjdGwgPSBzbmRfY3RsX25ldzEoJm1peGVyX3Byb2N1bml0X2N0bCwgY3ZhbCk7CiAJCWlmICghIGtjdGwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQkJa2ZyZWUoY3ZhbCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTc5Myw3ICsxODAwLDggQEAKIAkJYXBwZW5kX2N0bF9uYW1lKGtjdGwsICIgIik7CiAJCWFwcGVuZF9jdGxfbmFtZShrY3RsLCB2YWxpbmZvLT5zdWZmaXgpOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiWyVkXSBQVSBbJXNdIGNoID0gJWQsIHZhbCA9ICVkLyVkXG4iLAorCQl1c2JfYXVkaW9fZGJnKHN0YXRlLT5jaGlwLAorCQkJIlslZF0gUFUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZFxuIiwKIAkJCSAgICBjdmFsLT5pZCwga2N0bC0+aWQubmFtZSwgY3ZhbC0+Y2hhbm5lbHMsIGN2YWwtPm1pbiwgY3ZhbC0+bWF4KTsKIAkJaWYgKChlcnIgPSBzbmRfdXNiX21peGVyX2FkZF9jb250cm9sKHN0YXRlLT5taXhlciwga2N0bCkpIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0xOTE4LDcgKzE5MjYsOCBAQAogCWNoYXIgKipuYW1lbGlzdDsKIAogCWlmICghZGVzYy0+Yk5ySW5QaW5zIHx8IGRlc2MtPmJMZW5ndGggPCA1ICsgZGVzYy0+Yk5ySW5QaW5zKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgU0VMRUNUT1IgVU5JVCBkZXNjcmlwdG9yICVkXG4iLCB1bml0aWQpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJImludmFsaWQgU0VMRUNUT1IgVU5JVCBkZXNjcmlwdG9yICVkXG4iLCB1bml0aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE5MzYsNyArMTk0NSw3IEBACiAKIAljdmFsID0ga3phbGxvYyhzaXplb2YoKmN2YWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBjdmFsKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAljdmFsLT5taXhlciA9IHN0YXRlLT5taXhlcjsKQEAgLTE5NTUsNyArMTk2NCw3IEBACiAKIAluYW1lbGlzdCA9IGttYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBkZXNjLT5iTnJJblBpbnMsIEdGUF9LRVJORUwpOwogCWlmICghIG5hbWVsaXN0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCWtmcmVlKGN2YWwpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xOTY1LDcgKzE5NzQsNyBAQAogCQlsZW4gPSAwOwogCQluYW1lbGlzdFtpXSA9IGttYWxsb2MoTUFYX0lURU1fTkFNRV9MRU4sIEdGUF9LRVJORUwpOwogCQlpZiAoISBuYW1lbGlzdFtpXSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvY1xuIik7CisJCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCQl3aGlsZSAoaS0tKQogCQkJCWtmcmVlKG5hbWVsaXN0W2ldKTsKIAkJCWtmcmVlKG5hbWVsaXN0KTsKQEAgLTE5ODIsNyArMTk5MSw3IEBACiAKIAlrY3RsID0gc25kX2N0bF9uZXcxKCZtaXhlcl9zZWxlY3R1bml0X2N0bCwgY3ZhbCk7CiAJaWYgKCEga2N0bCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQlrZnJlZShuYW1lbGlzdCk7CiAJCWtmcmVlKGN2YWwpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIwMTAsNyArMjAxOSw3IEBACiAJCQlhcHBlbmRfY3RsX25hbWUoa2N0bCwgIiBQbGF5YmFjayBTb3VyY2UiKTsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIlslZF0gU1UgWyVzXSBpdGVtcyA9ICVkXG4iLAorCXVzYl9hdWRpb19kYmcoc3RhdGUtPmNoaXAsICJbJWRdIFNVIFslc10gaXRlbXMgPSAlZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBkZXNjLT5iTnJJblBpbnMpOwogCWlmICgoZXJyID0gc25kX3VzYl9taXhlcl9hZGRfY29udHJvbChzdGF0ZS0+bWl4ZXIsIGtjdGwpKSA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0yMDMyLDcgKzIwNDEsNyBAQAogCiAJcDEgPSBmaW5kX2F1ZGlvX2NvbnRyb2xfdW5pdChzdGF0ZSwgdW5pdGlkKTsKIAlpZiAoIXAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICVkIG5vdCBmb3VuZCFcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJ1bml0ICVkIG5vdCBmb3VuZCFcbiIsIHVuaXRpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjA2Miw3ICsyMDcxLDggQEAKIAljYXNlIFVBQzJfRVhURU5TSU9OX1VOSVRfVjI6CiAJCXJldHVybiBwYXJzZV9hdWRpb19leHRlbnNpb25fdW5pdChzdGF0ZSwgdW5pdGlkLCBwMSk7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiYXVkaW86IHVuaXQgJXU6IHVuZXhwZWN0ZWQgdHlwZSAweCUwMnhcbiIsIHVuaXRpZCwgcDFbMl0pOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJInVuaXQgJXU6IHVuZXhwZWN0ZWQgdHlwZSAweCUwMnhcbiIsIHVuaXRpZCwgcDFbMl0pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CkBAIC0yMjEwLDggKzIyMjAsOSBAQAogCV9fdTggY2hhbm5lbCA9IHZhbHVlICYgMHhmZjsKIAogCWlmIChjaGFubmVsID49IE1BWF9DSEFOTkVMUykgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgIiVzKCk6IGJvZ3VzIGNoYW5uZWwgbnVtYmVyICVkXG4iLAotCQkJCV9fZnVuY19fLCBjaGFubmVsKTsKKwkJdXNiX2F1ZGlvX2RiZyhtaXhlci0+Y2hpcCwKKwkJCSIlcygpOiBib2d1cyBjaGFubmVsIG51bWJlciAlZFxuIiwKKwkJCV9fZnVuY19fLCBjaGFubmVsKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjI0MCw4ICsyMjUxLDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInVua25vd24gYXR0cmlidXRlICVkIGluIGludGVycnVwdFxuIiwKLQkJCQkJCWF0dHJpYnV0ZSk7CisJCQl1c2JfYXVkaW9fZGJnKG1peGVyLT5jaGlwLAorCQkJCSJ1bmtub3duIGF0dHJpYnV0ZSAlZCBpbiBpbnRlcnJ1cHRcbiIsCisJCQkJYXR0cmlidXRlKTsKIAkJCWJyZWFrOwogCQl9IC8qIHN3aXRjaCAqLwogCX0KQEAgLTIyNjIsNyArMjI3NCw3IEBACiAJCWZvciAoc3RhdHVzID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJCSAgICAgbGVuID49IHNpemVvZigqc3RhdHVzKTsKIAkJICAgICBsZW4gLT0gc2l6ZW9mKCpzdGF0dXMpLCBzdGF0dXMrKykgewotCQkJc25kX3ByaW50ZChLRVJOX0RFQlVHICJzdGF0dXMgaW50ZXJydXB0OiAlMDJ4ICUwMnhcbiIsCisJCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAic3RhdHVzIGludGVycnVwdDogJTAyeCAlMDJ4XG4iLAogCQkJCQkJc3RhdHVzLT5iU3RhdHVzVHlwZSwKIAkJCQkJCXN0YXR1cy0+Yk9yaWdpbmF0b3IpOwogCkBAIC0yMzAwLDI2ICsyMzEyLDYgQEAKIAl9CiB9CiAKLS8qIHN0b3AgYW55IGJ1cyBhY3Rpdml0eSBvZiBhIG1peGVyICovCi12b2lkIHNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCi17Ci0JdXNiX2tpbGxfdXJiKG1peGVyLT51cmIpOwotCXVzYl9raWxsX3VyYihtaXhlci0+cmNfdXJiKTsKLX0KLQotaW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQotewotCWludCBlcnI7Ci0KLQlpZiAobWl4ZXItPnVyYikgewotCQllcnIgPSB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBfTk9JTyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogY3JlYXRlIHRoZSBoYW5kbGVyIGZvciB0aGUgb3B0aW9uYWwgc3RhdHVzIGludGVycnVwdCBlbmRwb2ludCAqLwogc3RhdGljIGludCBzbmRfdXNiX21peGVyX3N0YXR1c19jcmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQogewpAQCAtMjM5NCw3ICsyMzg2LDcgQEAKIAogCXNuZF91c2JfbWl4ZXJfYXBwbHlfY3JlYXRlX3F1aXJrKG1peGVyKTsKIAotCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNoaXAtPmNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgbWl4ZXIsICZkZXZfb3BzKTsKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhjaGlwLT5jYXJkLCBTTkRSVl9ERVZfQ09ERUMsIG1peGVyLCAmZGV2X29wcyk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gX2Vycm9yOwogCkBAIC0yNDE4LDMgKzI0MTAsODIgQEAKIAl1c2Jfa2lsbF91cmIobWl4ZXItPnVyYik7CiAJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOwogfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBzdG9wIGFueSBidXMgYWN0aXZpdHkgb2YgYSBtaXhlciAqLworc3RhdGljIHZvaWQgc25kX3VzYl9taXhlcl9pbmFjdGl2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwl1c2Jfa2lsbF91cmIobWl4ZXItPnVyYik7CisJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOworfQorCitzdGF0aWMgaW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCWludCBlcnI7CisKKwlpZiAobWl4ZXItPnVyYikgeworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBfTk9JTyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF91c2JfbWl4ZXJfc3VzcGVuZChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc25kX3VzYl9taXhlcl9pbmFjdGl2YXRlKG1peGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXN0b3JlX21peGVyX3ZhbHVlKHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsKQoreworCWludCBjLCBlcnIsIGlkeDsKKworCWlmIChjdmFsLT5jbWFzaykgeworCQlpZHggPSAwOworCQlmb3IgKGMgPSAwOyBjIDwgTUFYX0NIQU5ORUxTOyBjKyspIHsKKwkJCWlmICghKGN2YWwtPmNtYXNrICYgKDEgPDwgYykpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGN2YWwtPmNhY2hlZCAmICgxIDw8IGMpKSB7CisJCQkJZXJyID0gc2V0X2N1cl9taXhfdmFsdWUoY3ZhbCwgYyArIDEsIGlkeCwKKwkJCQkJCQljdmFsLT5jYWNoZV92YWxbaWR4XSk7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIG1hc3RlciAqLworCQlpZiAoY3ZhbC0+Y2FjaGVkKSB7CisJCQllcnIgPSBzZXRfY3VyX21peF92YWx1ZShjdmFsLCAwLCAwLCAqY3ZhbC0+Y2FjaGVfdmFsKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF91c2JfbWl4ZXJfcmVzdW1lKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwgYm9vbCByZXNldF9yZXN1bWUpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmN2YWw7CisJaW50IGlkLCBlcnI7CisKKwkvKiBGSVhNRTogYW55IG1peGVyIHF1aXJrcz8gKi8KKworCWlmIChyZXNldF9yZXN1bWUpIHsKKwkJLyogcmVzdG9yZSBjYWNoZWQgbWl4ZXIgdmFsdWVzICovCisJCWZvciAoaWQgPSAwOyBpZCA8IE1BWF9JRF9FTEVNUzsgaWQrKykgeworCQkJZm9yIChjdmFsID0gbWl4ZXItPmlkX2VsZW1zW2lkXTsgY3ZhbDsKKwkJCSAgICAgY3ZhbCA9IGN2YWwtPm5leHRfaWRfZWxlbSkgeworCQkJCWVyciA9IHJlc3RvcmVfbWl4ZXJfdmFsdWUoY3ZhbCk7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc25kX3VzYl9taXhlcl9hY3RpdmF0ZShtaXhlcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlci5oIGIvc291bmQvdXNiL21peGVyLmgKaW5kZXggYWFiODBkZi4uNzNiMWY2NCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyLmgKKysrIGIvc291bmQvdXNiL21peGVyLmgKQEAgLTYzLDggKzYzLDYgQEAKIAogaW50IHNuZF91c2JfbWl4ZXJfc2V0X2N0bF92YWx1ZShzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCwKIAkJCQlpbnQgcmVxdWVzdCwgaW50IHZhbGlkeCwgaW50IHZhbHVlX3NldCk7Ci12b2lkIHNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpOwotaW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKTsKIAogaW50IHNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAogCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCk7CkBAIC03Miw0ICs3MCw5IEBACiBpbnQgc25kX3VzYl9taXhlcl92b2xfdGx2KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgb3BfZmxhZywKIAkJCSAgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX3VzZXIgKl90bHYpOwogCisjaWZkZWYgQ09ORklHX1BNCitpbnQgc25kX3VzYl9taXhlcl9zdXNwZW5kKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcik7CitpbnQgc25kX3VzYl9taXhlcl9yZXN1bWUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLCBib29sIHJlc2V0X3Jlc3VtZSk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fVVNCTUlYRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCmluZGV4IGY0YjEyYzIuLmYxMTlhNDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYworKysgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKQEAgLTYwMCw4ICs2MDAsOCBAQAogCXVwX3JlYWQoJm1peGVyLT5jaGlwLT5zaHV0ZG93bl9yd3NlbSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAidW5hYmxlIHRvIGlzc3VlIHZlbmRvciByZWFkIHJlcXVlc3QgKHJldCA9ICVkKSIsIHJldCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBpc3N1ZSB2ZW5kb3IgcmVhZCByZXF1ZXN0IChyZXQgPSAlZCkiLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjMxLDggKzYzMSw4IEBACiAJdXBfcmVhZCgmbWl4ZXItPmNoaXAtPnNodXRkb3duX3J3c2VtKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSAgICJ1bmFibGUgdG8gaXNzdWUgdmVuZG9yIHdyaXRlIHJlcXVlc3QgKHJldCA9ICVkKSIsIHJldCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBpc3N1ZSB2ZW5kb3Igd3JpdGUgcmVxdWVzdCAocmV0ID0gJWQpIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE2OTksNyArMTY5OSw3IEBACiAJCQlzbmRfdXNiX21peGVyX25vdGlmeV9pZChtaXhlciwgbWl4ZXItPnJjX2NmZy0+bXV0ZV9taXhlcl9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGQoS0VSTl9ERUJVRyAibWVtb3J5IGNoYW5nZSBpbiB1bmtub3duIHVuaXQgJWRcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19kYmcobWl4ZXItPmNoaXAsICJtZW1vcnkgY2hhbmdlIGluIHVua25vd24gdW5pdCAlZFxuIiwgdW5pdGlkKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3BjbS5jIGIvc291bmQvdXNiL3BjbS5jCmluZGV4IGNhMzI1NmQuLjQ5ZGU1YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9wY20uYworKysgYi9zb3VuZC91c2IvcGNtLmMKQEAgLTE2Niw4ICsxNjYsOCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTfFVTQl9SRUNJUF9FTkRQT0lOVHxVU0JfRElSX09VVCwKIAkJCQkgICBVQUNfRVBfQ1NfQVRUUl9QSVRDSF9DT05UUk9MIDw8IDgsIGVwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBlbmFibGUgUElUQ0hcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgaWZhY2UsIGVwKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiJWQ6JWQ6IGNhbm5vdCBzZXQgZW5hYmxlIFBJVENIXG4iLAorCQkJICAgICAgaWZhY2UsIGVwKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE4Nyw4ICsxODcsOCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UIHwgVVNCX0RJUl9PVVQsCiAJCQkJICAgVUFDMl9FUF9DU19QSVRDSCA8PCA4LCAwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBlbmFibGUgUElUQ0ggKHYyKVxuIiwKLQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiJWQ6JWQ6IGNhbm5vdCBzZXQgZW5hYmxlIFBJVENIICh2MilcbiIsCisJCQkgICAgICBpZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChTVUJTVFJFQU1fRkxBR19EQVRBX0VQX1NUQVJURUQsICZzdWJzLT5mbGFncykpIHsKIAkJc3RydWN0IHNuZF91c2JfZW5kcG9pbnQgKmVwID0gc3Vicy0+ZGF0YV9lbmRwb2ludDsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJTdGFydGluZyBkYXRhIEVQIEAlcFxuIiwgZXApOworCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwgIlN0YXJ0aW5nIGRhdGEgRVAgQCVwXG4iLCBlcCk7CiAKIAkJZXAtPmRhdGFfc3VicyA9IHN1YnM7CiAJCWVyciA9IHNuZF91c2JfZW5kcG9pbnRfc3RhcnQoZXAsIGNhbl9zbGVlcCk7CkBAIC0yNDcsMTYgKzI0NywxNSBAQAogCQkJCQkJc3Vicy0+c3luY19lbmRwb2ludC0+YWx0c2V0dGluZyk7CiAJCQlpZiAoZXJyIDwgMCkgewogCQkJCWNsZWFyX2JpdChTVUJTVFJFQU1fRkxBR19TWU5DX0VQX1NUQVJURUQsICZzdWJzLT5mbGFncyk7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCQkgICAiJWQ6JWQ6JWQ6IGNhbm5vdCBzZXQgaW50ZXJmYWNlICglZClcbiIsCi0JCQkJCSAgIHN1YnMtPmRldi0+ZGV2bnVtLAorCQkJCWRldl9lcnIoJnN1YnMtPmRldi0+ZGV2LAorCQkJCQkgICAiJWQ6JWQ6IGNhbm5vdCBzZXQgaW50ZXJmYWNlICglZClcbiIsCiAJCQkJCSAgIHN1YnMtPnN5bmNfZW5kcG9pbnQtPmlmYWNlLAogCQkJCQkgICBzdWJzLT5zeW5jX2VuZHBvaW50LT5hbHRzZXR0aW5nLCBlcnIpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9CiAKLQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiU3RhcnRpbmcgc3luYyBFUCBAJXBcbiIsIGVwKTsKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsICJTdGFydGluZyBzeW5jIEVQIEAlcFxuIiwgZXApOwogCiAJCWVwLT5zeW5jX3NsYXZlID0gc3Vicy0+ZGF0YV9lbmRwb2ludDsKIAkJZXJyID0gc25kX3VzYl9lbmRwb2ludF9zdGFydChlcCwgY2FuX3NsZWVwKTsKQEAgLTQxMCw4ICs0MDksOSBAQAogCWlmICgoZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQyB8fAogCSAgICAoZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT5iTGVuZ3RoID49IFVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFICYmCiAJICAgICBnZXRfZW5kcG9pbnQoYWx0cywgMSktPmJTeW5jaEFkZHJlc3MgIT0gMCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQgOiBpbnZhbGlkIHN5bmMgcGlwZS4gYm1BdHRyaWJ1dGVzICUwMngsIGJMZW5ndGggJWQsIGJTeW5jaEFkZHJlc3MgJTAyeFxuIiwKLQkJCSAgIGRldi0+ZGV2bnVtLCBmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIiVkOiVkIDogaW52YWxpZCBzeW5jIHBpcGUuIGJtQXR0cmlidXRlcyAlMDJ4LCBiTGVuZ3RoICVkLCBiU3luY2hBZGRyZXNzICUwMnhcbiIsCisJCQkgICBmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsCiAJCQkgICBnZXRfZW5kcG9pbnQoYWx0cywgMSktPmJtQXR0cmlidXRlcywKIAkJCSAgIGdldF9lbmRwb2ludChhbHRzLCAxKS0+Ykxlbmd0aCwKIAkJCSAgIGdldF9lbmRwb2ludChhbHRzLCAxKS0+YlN5bmNoQWRkcmVzcyk7CkBAIC00MjEsOCArNDIxLDkgQEAKIAlpZiAoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iTGVuZ3RoID49IFVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFICYmCiAJICAgICgoaXNfcGxheWJhY2sgJiYgZXAgIT0gKHVuc2lnbmVkIGludCkoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iU3luY2hBZGRyZXNzIHwgVVNCX0RJUl9JTikpIHx8CiAJICAgICAoIWlzX3BsYXliYWNrICYmIGVwICE9ICh1bnNpZ25lZCBpbnQpKGdldF9lbmRwb2ludChhbHRzLCAwKS0+YlN5bmNoQWRkcmVzcyAmIH5VU0JfRElSX0lOKSkpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkIDogaW52YWxpZCBzeW5jIHBpcGUuIGlzX3BsYXliYWNrICVkLCBlcCAlMDJ4LCBiU3luY2hBZGRyZXNzICUwMnhcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlZDolZCA6IGludmFsaWQgc3luYyBwaXBlLiBpc19wbGF5YmFjayAlZCwgZXAgJTAyeCwgYlN5bmNoQWRkcmVzcyAlMDJ4XG4iLAorCQkJICAgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLAogCQkJICAgaXNfcGxheWJhY2ssIGVwLCBnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJTeW5jaEFkZHJlc3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00NjksOCArNDcwLDkgQEAKIAlpZiAoc3Vicy0+aW50ZXJmYWNlID49IDAgJiYgc3Vicy0+aW50ZXJmYWNlICE9IGZtdC0+aWZhY2UpIHsKIAkJZXJyID0gdXNiX3NldF9pbnRlcmZhY2Uoc3Vicy0+ZGV2LCBzdWJzLT5pbnRlcmZhY2UsIDApOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQ6IHJldHVybiB0byBzZXR0aW5nIDAgZmFpbGVkICglZClcbiIsCi0JCQkJZGV2LT5kZXZudW0sIGZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXJyKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCSIlZDolZDogcmV0dXJuIHRvIHNldHRpbmcgMCBmYWlsZWQgKCVkKVxuIiwKKwkJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVycik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlzdWJzLT5pbnRlcmZhY2UgPSAtMTsKQEAgLTQ4MiwxMiArNDg0LDEzIEBACiAJICAgIHN1YnMtPmFsdHNldF9pZHggIT0gZm10LT5hbHRzZXRfaWR4KSB7CiAJCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldiwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiB1c2Jfc2V0X2ludGVyZmFjZSBmYWlsZWQgKCVkKVxuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLCBlcnIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJIiVkOiVkOiB1c2Jfc2V0X2ludGVyZmFjZSBmYWlsZWQgKCVkKVxuIiwKKwkJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVycik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInNldHRpbmcgdXNiIGludGVyZmFjZSAlZDolZFxuIiwKLQkJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgInNldHRpbmcgdXNiIGludGVyZmFjZSAlZDolZFxuIiwKKwkJCWZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZyk7CiAJCXN1YnMtPmludGVyZmFjZSA9IGZtdC0+aWZhY2U7CiAJCXN1YnMtPmFsdHNldF9pZHggPSBmbXQtPmFsdHNldF9pZHg7CiAKQEAgLTUyMywyMCArNTI2LDIzIEBACiAgKiAtIFJlcXVlc3RlZCBQQ00gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCiAgKiAtIFJlcXVlc3RlZCBzYW1wbGUgcmF0ZSBpcyBub3Qgc3VwcG9ydGVkLgogICovCi1zdGF0aWMgaW50IG1hdGNoX2VuZHBvaW50X2F1ZGlvZm9ybWF0cyhzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwLAotCXN0cnVjdCBhdWRpb2Zvcm1hdCAqbWF0Y2gsIGludCByYXRlLAotCXNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCkKK3N0YXRpYyBpbnQgbWF0Y2hfZW5kcG9pbnRfYXVkaW9mb3JtYXRzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQkgICAgICAgc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCwKKwkJCQkgICAgICAgc3RydWN0IGF1ZGlvZm9ybWF0ICptYXRjaCwgaW50IHJhdGUsCisJCQkJICAgICAgIHNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCkKIHsKIAlpbnQgaTsKIAlpbnQgc2NvcmUgPSAwOwogCiAJaWYgKGZwLT5jaGFubmVscyA8IDEpIHsKLQkJc25kX3ByaW50ZGQoIiVzOiAoZm10IEAlcCkgbm8gY2hhbm5lbHNcbiIsIF9fZnVuY19fLCBmcCk7CisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJIiVzOiAoZm10IEAlcCkgbm8gY2hhbm5lbHNcbiIsIF9fZnVuY19fLCBmcCk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmICghKGZwLT5mb3JtYXRzICYgcGNtX2Zvcm1hdF90b19iaXRzKHBjbV9mb3JtYXQpKSkgewotCQlzbmRfcHJpbnRkZCgiJXM6IChmbXQgQCVwKSBubyBtYXRjaCBmb3IgZm9ybWF0ICVkXG4iLCBfX2Z1bmNfXywKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsCisJCQkiJXM6IChmbXQgQCVwKSBubyBtYXRjaCBmb3IgZm9ybWF0ICVkXG4iLCBfX2Z1bmNfXywKIAkJCWZwLCBwY21fZm9ybWF0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTQ4LDcgKzU1NCw4IEBACiAJCX0KIAl9CiAJaWYgKCFzY29yZSkgewotCQlzbmRfcHJpbnRkZCgiJXM6IChmbXQgQCVwKSBubyBtYXRjaCBmb3IgcmF0ZSAlZFxuIiwgX19mdW5jX18sCisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJIiVzOiAoZm10IEAlcCkgbm8gbWF0Y2ggZm9yIHJhdGUgJWRcbiIsIF9fZnVuY19fLAogCQkJZnAsIHJhdGUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC01NTYsNyArNTYzLDggQEAKIAlpZiAoZnAtPmNoYW5uZWxzID09IG1hdGNoLT5jaGFubmVscykKIAkJc2NvcmUrKzsKIAotCXNuZF9wcmludGRkKCIlczogKGZtdCBAJXApIHNjb3JlICVkXG4iLCBfX2Z1bmNfXywgZnAsIHNjb3JlKTsKKwlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJIiVzOiAoZm10IEAlcCkgc2NvcmUgJWRcbiIsIF9fZnVuY19fLCBmcCwgc2NvcmUpOwogCiAJcmV0dXJuIHNjb3JlOwogfQpAQCAtNTg3LDcgKzU5NSw4IEBACiAKIAkvKiBUcnkgdG8gZmluZCB0aGUgYmVzdCBtYXRjaGluZyBhdWRpb2Zvcm1hdC4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmc3luY19zdWJzLT5mbXRfbGlzdCwgbGlzdCkgewotCQlpbnQgc2NvcmUgPSBtYXRjaF9lbmRwb2ludF9hdWRpb2Zvcm1hdHMoZnAsIHN1YnMtPmN1cl9hdWRpb2ZtdCwKKwkJaW50IHNjb3JlID0gbWF0Y2hfZW5kcG9pbnRfYXVkaW9mb3JtYXRzKHN1YnMsCisJCQkJCQkJZnAsIHN1YnMtPmN1cl9hdWRpb2ZtdCwKIAkJCXN1YnMtPmN1cl9yYXRlLCBzdWJzLT5wY21fZm9ybWF0KTsKIAogCQlpZiAoc2NvcmUgPiBjdXJfc2NvcmUpIHsKQEAgLTU5Nyw3ICs2MDYsOCBAQAogCX0KIAogCWlmICh1bmxpa2VseShzeW5jX2ZwID09IE5VTEwpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBubyB2YWxpZCBhdWRpb2Zvcm1hdCBmb3Igc3luYyBlcCAleCBmb3VuZFxuIiwKKwkJZGV2X2Vycigmc3Vicy0+ZGV2LT5kZXYsCisJCQkiJXM6IG5vIHZhbGlkIGF1ZGlvZm9ybWF0IGZvciBzeW5jIGVwICV4IGZvdW5kXG4iLAogCQkJX19mdW5jX18sIHN5bmNfc3Vicy0+ZXBfbnVtKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjA5LDcgKzYxOSw4IEBACiAJaWYgKHN5bmNfZnAtPmNoYW5uZWxzICE9IHN1YnMtPmNoYW5uZWxzKSB7CiAJCXN5bmNfcGVyaW9kX2J5dGVzID0gKHN1YnMtPnBlcmlvZF9ieXRlcyAvIHN1YnMtPmNoYW5uZWxzKSAqCiAJCQlzeW5jX2ZwLT5jaGFubmVsczsKLQkJc25kX3ByaW50ZGQoIiVzOiBhZGp1c3RlZCBzeW5jIGVwIHBlcmlvZCBieXRlcyAoJWQgLT4gJWQpXG4iLAorCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJCSIlczogYWRqdXN0ZWQgc3luYyBlcCBwZXJpb2QgYnl0ZXMgKCVkIC0+ICVkKVxuIiwKIAkJCV9fZnVuY19fLCBzdWJzLT5wZXJpb2RfYnl0ZXMsIHN5bmNfcGVyaW9kX2J5dGVzKTsKIAl9CiAKQEAgLTY4NSw3ICs2OTYsOCBAQAogCiAJZm10ID0gZmluZF9mb3JtYXQoc3Vicyk7CiAJaWYgKCFmbXQpIHsKLQkJc25kX3ByaW50ZChLRVJOX0RFQlVHICJjYW5ub3Qgc2V0IGZvcm1hdDogZm9ybWF0ID0gJSN4LCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsCisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJImNhbm5vdCBzZXQgZm9ybWF0OiBmb3JtYXQgPSAlI3gsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKIAkJCSAgIHN1YnMtPnBjbV9mb3JtYXQsIHN1YnMtPmN1cl9yYXRlLCBzdWJzLT5jaGFubmVscyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTc0Miw3ICs3NTQsNyBAQAogCWludCByZXQ7CiAKIAlpZiAoISBzdWJzLT5jdXJfYXVkaW9mbXQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiYXVkaW86IG5vIGZvcm1hdCBpcyBzcGVjaWZpZWQhXG4iKTsKKwkJZGV2X2Vycigmc3Vicy0+ZGV2LT5kZXYsICJubyBmb3JtYXQgaXMgc3BlY2lmaWVkIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCkBAIC0xMjM1LDcgKzEyNDcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKIAkJY3AgPSAodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgKyBzdWJzLT5wa3Rfb2Zmc2V0X2FkajsKIAkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImZyYW1lICVkIGFjdGl2ZTogJWRcbiIsIGksIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKKwkJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LCAiZnJhbWUgJWQgYWN0aXZlOiAlZFxuIiwKKwkJCQlpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CiAJCQkvLyBjb250aW51ZTsKIAkJfQogCQlieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKQEAgLTEyNDUsNyArMTI1OCw4IEBACiAJCWlmIChieXRlcyAlIChydW50aW1lLT5zYW1wbGVfYml0cyA+PiAzKSAhPSAwKSB7CiAJCQlpbnQgb2xkYnl0ZXMgPSBieXRlczsKIAkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOwotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKKwkJCWRldl93YXJuKCZzdWJzLT5kZXYtPmRldiwKKwkJCQkgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKIAkJCQkJCQlvbGRieXRlcywgYnl0ZXMpOwogCQl9CiAJCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyICovCkBAIC0xNDg4LDcgKzE1MDIsOCBAQAogCSAqIG9uIHR3byByZWFkcyBvZiBhIGNvdW50ZXIgdXBkYXRlZCBldmVyeSBtcy4KIAkgKi8KIAlpZiAoYWJzKGVzdF9kZWxheSAtIHN1YnMtPmxhc3RfZGVsYXkpICogMTAwMCA+IHJ1bnRpbWUtPnJhdGUgKiAyKQotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRlbGF5OiBlc3RpbWF0ZWQgJWQsIGFjdHVhbCAlZFxuIiwKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsCisJCQkiZGVsYXk6IGVzdGltYXRlZCAlZCwgYWN0dWFsICVkXG4iLAogCQkJZXN0X2RlbGF5LCBzdWJzLT5sYXN0X2RlbGF5KTsKIAogCWlmICghc3Vicy0+cnVubmluZykgewpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy5jIGIvc291bmQvdXNiL3F1aXJrcy5jCmluZGV4IDg5NzMwNzA3Ni4uN2M1N2YyMiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9xdWlya3MuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKIAllcnIgPSBzbmRfdXNiX3BhcnNlX2F1ZGlvX2ludGVyZmFjZShjaGlwLCBhbHRzZC0+YkludGVyZmFjZU51bWJlcik7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHNldHVwIGlmICVkOiBlcnJvciAlZFxuIiwKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiY2Fubm90IHNldHVwIGlmICVkOiBlcnJvciAlZFxuIiwKIAkJCSAgIGFsdHNkLT5iSW50ZXJmYWNlTnVtYmVyLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJZnAgPSBrbWVtZHVwKHF1aXJrLT5kYXRhLCBzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWVtZHVwXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiY2Fubm90IG1lbWR1cFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAoZnAtPm5yX3JhdGVzID4gTUFYX05SX1JBVEVTKSB7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkJZnAtPnJhdGVfbWF4ID0gZnAtPnJhdGVfbWluID0gOTYwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVua25vd24gc2FtcGxlIHJhdGVcbiIpOworCQl1c2JfYXVkaW9fZXJyKGNoaXAsICJ1bmtub3duIHNhbXBsZSByYXRlXG4iKTsKIAkJa2ZyZWUoZnApOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTUzNiw3ICs1MzYsNyBAQAogCWlmIChxdWlyay0+dHlwZSA8IFFVSVJLX1RZUEVfQ09VTlQpIHsKIAkJcmV0dXJuIHF1aXJrX2Z1bmNzW3F1aXJrLT50eXBlXShjaGlwLCBpZmFjZSwgZHJpdmVyLCBxdWlyayk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCBxdWlyayB0eXBlICVkXG4iLCBxdWlyay0+dHlwZSk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwgImludmFsaWQgcXVpcmsgdHlwZSAlZFxuIiwgcXVpcmstPnR5cGUpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIH0KQEAgLTU1NSwxOCArNTU1LDIxIEBACiAKIAlpZiAobGUxNl90b19jcHUoZ2V0X2NmZ19kZXNjKGNvbmZpZyktPndUb3RhbExlbmd0aCkgPT0gRVhUSUdZX0ZJUk1XQVJFX1NJWkVfT0xEIHx8CiAJICAgIGxlMTZfdG9fY3B1KGdldF9jZmdfZGVzYyhjb25maWcpLT53VG90YWxMZW5ndGgpID09IEVYVElHWV9GSVJNV0FSRV9TSVpFX05FVykgewotCQlzbmRfcHJpbnRkZCgic2VuZGluZyBFeHRpZ3kgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAic2VuZGluZyBFeHRpZ3kgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CiAJCS8qIFNlbmQgbWVzc2FnZSB0byBmb3JjZSBpdCB0byByZWNvbm5lY3Qgd2l0aCBmdWxsIGludGVyZmFjZS4gKi8KIAkJZXJyID0gc25kX3VzYl9jdGxfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwwKSwKIAkJCQkgICAgICAweDEwLCAweDQzLCAweDAwMDEsIDB4MDAwYSwgTlVMTCwgMCk7Ci0JCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3Igc2VuZGluZyBib290IG1lc3NhZ2U6ICVkXG4iLCBlcnIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiZXJyb3Igc2VuZGluZyBib290IG1lc3NhZ2U6ICVkXG4iLCBlcnIpOwogCQllcnIgPSB1c2JfZ2V0X2Rlc2NyaXB0b3IoZGV2LCBVU0JfRFRfREVWSUNFLCAwLAogCQkJCSZkZXYtPmRlc2NyaXB0b3IsIHNpemVvZihkZXYtPmRlc2NyaXB0b3IpKTsKIAkJY29uZmlnID0gZGV2LT5hY3Rjb25maWc7Ci0JCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3IgdXNiX2dldF9kZXNjcmlwdG9yOiAlZFxuIiwgZXJyKTsKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9nZXRfZGVzY3JpcHRvcjogJWRcbiIsIGVycik7CiAJCWVyciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldik7Ci0JCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3IgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLCBlcnIpOwotCQlzbmRfcHJpbnRkZCgiZXh0aWd5X2Jvb3Q6IG5ldyBib290IGxlbmd0aCA9ICVkXG4iLAorCQlpZiAoZXJyIDwgMCkKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiZXJyb3IgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLCBlcnIpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgImV4dGlneV9ib290OiBuZXcgYm9vdCBsZW5ndGggPSAlZFxuIiwKIAkJCSAgICBsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKSk7CiAJCXJldHVybiAtRU5PREVWOyAvKiBxdWl0IHRoaXMgYW55d2F5ICovCiAJfQpAQCAtNTk0LDcgKzU5Nyw3IEBACiAJaW50IGVycjsKIAogCWlmIChkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlID09IDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gInVzYi1hdWRpbzogIgorCQlkZXZfaW5mbygmZGV2LT5kZXYsCiAJCQkgICAiRmFzdCBUcmFjayBQcm8gc3dpdGNoaW5nIHRvIGNvbmZpZyAjMlxuIik7CiAJCS8qIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGF2YWlsYWJsZSBieSB0aGUgdXNiIGNvcmUgbW9kdWxlLgogCQkgKiBpZiBpdCBpcyBub3QgYXZpYWxhYmxlIHRoZSBib290IHF1aXJrIGhhcyB0byBiZSBsZWZ0IG91dApAQCAtNjAzLDE0ICs2MDYsMTUgQEAKIAkJICovCiAJCWVyciA9IHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oZGV2LCAyKTsKIAkJaWYgKGVyciA8IDApCi0JCQlzbmRfcHJpbnRkZCgiZXJyb3IgdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbjogJWRcbiIsCi0JCQkJICAgIGVycik7CisJCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCQkiZXJyb3IgdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbjogJWRcbiIsCisJCQkJZXJyKTsKIAkJLyogQWx3YXlzIHJldHVybiBhbiBlcnJvciwgc28gdGhhdCB3ZSBzdG9wIGNyZWF0aW5nIGEgZGV2aWNlCiAJCSAgIHRoYXQgd2lsbCBqdXN0IGJlIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkIHdpdGggYSBuZXcKIAkJICAgY29uZmlndXJhdGlvbiAqLwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gInVzYi1hdWRpbzogRmFzdCBUcmFjayBQcm8gY29uZmlnIE9LXG4iKTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiRmFzdCBUcmFjayBQcm8gY29uZmlnIE9LXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzc5LDExICs3ODMsMTEgQEAKIAlmd3NpemUgPSBsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKTsKIAogCWlmIChmd3NpemUgIT0gTUJPWDJfRklSTVdBUkVfU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2ItYXVkaW86IEludmFsaWQgZmlybXdhcmUgc2l6ZT0lZC5cbiIsIGZ3c2l6ZSk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiSW52YWxpZCBmaXJtd2FyZSBzaXplPSVkLlxuIiwgZndzaXplKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX3ByaW50ZCgidXNiLWF1ZGlvOiBTZW5kaW5nIERpZ2lkZXNpZ24gTWJveCAyIGJvb3Qgc2VxdWVuY2UuLi5cbiIpOworCWRldl9kYmcoJmRldi0+ZGV2LCAiU2VuZGluZyBEaWdpZGVzaWduIE1ib3ggMiBib290IHNlcXVlbmNlLi4uXG4iKTsKIAogCWNvdW50ID0gMDsKIAlib290cmVzcG9uc2VbMF0gPSBNQk9YMl9CT09UX0xPQURJTkc7CkBAIC03OTQsMzIgKzc5OCwzMiBAQAogCQkJMHg4NSwgMHhjMCwgMHgwMDAxLCAweDAwMDAsICZib290cmVzcG9uc2UsIDB4MDAxMik7CiAJCWlmIChib290cmVzcG9uc2VbMF0gPT0gTUJPWDJfQk9PVF9SRUFEWSkKIAkJCWJyZWFrOwotCQlzbmRfcHJpbnRkKCJ1c2ItYXVkaW86IGRldmljZSBub3QgcmVhZHksIHJlc2VuZGluZyBib290IHNlcXVlbmNlLi4uXG4iKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJkZXZpY2Ugbm90IHJlYWR5LCByZXNlbmRpbmcgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CiAJCWNvdW50Kys7CiAJfQogCiAJaWYgKGJvb3RyZXNwb25zZVswXSAhPSBNQk9YMl9CT09UX1JFQURZKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYi1hdWRpbzogVW5rbm93biBib290cmVzcG9uc2U9JWQsIG9yIHRpbWVkIG91dCwgaWdub3JpbmcgZGV2aWNlLlxuIiwgYm9vdHJlc3BvbnNlWzBdKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJVbmtub3duIGJvb3RyZXNwb25zZT0lZCwgb3IgdGltZWQgb3V0LCBpZ25vcmluZyBkZXZpY2UuXG4iLCBib290cmVzcG9uc2VbMF0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzbmRfcHJpbnRkZCgidXNiLWF1ZGlvOiBkZXZpY2UgaW5pdGlhbGlzZWQhXG4iKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgImRldmljZSBpbml0aWFsaXNlZCFcbiIpOwogCiAJZXJyID0gdXNiX2dldF9kZXNjcmlwdG9yKGRldiwgVVNCX0RUX0RFVklDRSwgMCwKIAkJJmRldi0+ZGVzY3JpcHRvciwgc2l6ZW9mKGRldi0+ZGVzY3JpcHRvcikpOwogCWNvbmZpZyA9IGRldi0+YWN0Y29uZmlnOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRkKCJlcnJvciB1c2JfZ2V0X2Rlc2NyaXB0b3I6ICVkXG4iLCBlcnIpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9nZXRfZGVzY3JpcHRvcjogJWRcbiIsIGVycik7CiAKIAllcnIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihkZXYpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRkKCJlcnJvciB1c2JfcmVzZXRfY29uZmlndXJhdGlvbjogJWRcbiIsIGVycik7Ci0Jc25kX3ByaW50ZGQoIm1ib3gyX2Jvb3Q6IG5ldyBib290IGxlbmd0aCA9ICVkXG4iLAorCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9yZXNldF9jb25maWd1cmF0aW9uOiAlZFxuIiwgZXJyKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIm1ib3gyX2Jvb3Q6IG5ldyBib290IGxlbmd0aCA9ICVkXG4iLAogCQlsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKSk7CiAKIAltYm94Ml9zZXR1cF80OF8yNF9tYWdpYyhkZXYpOwogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gInVzYi1hdWRpbzogRGlnaWRlc2lnbiBNYm94IDI6IDI0Yml0IDQ4a0h6Iik7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiRGlnaWRlc2lnbiBNYm94IDI6IDI0Yml0IDQ4a0h6Iik7CiAKIAlyZXR1cm4gMDsgLyogU3VjY2Vzc2Z1bCBib290ICovCiB9CkBAIC04NjUsNyArODY5LDcgQEAKIAkJCQlyZXR1cm4gMTsgLyogc2tpcCB0aGlzIGFsdHNldHRpbmcgKi8KIAkJfQogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8KKwl1c2JfYXVkaW9fZGJnKGNoaXAsCiAJCSAgICAidXNpbmcgYWx0c2V0dGluZyAlZCBmb3IgaW50ZXJmYWNlICVkIGNvbmZpZyAlZFxuIiwKIAkJICAgIGFsdG5vLCBpZmFjZSwgY2hpcC0+c2V0dXApOwogCXJldHVybiAwOyAvKiBrZWVwIHRoaXMgYWx0c2V0dGluZyAqLwpAQCAtOTMyLDcgKzkzNiw3IEBACiAJCQlyZXR1cm4gMTsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8KKwl1c2JfYXVkaW9fZGJnKGNoaXAsCiAJCSAgICAidXNpbmcgYWx0c2V0dGluZyAlZCBmb3IgaW50ZXJmYWNlICVkIGNvbmZpZyAlZFxuIiwKIAkJICAgIGFsdG5vLCBpZmFjZSwgY2hpcC0+c2V0dXApOwogCXJldHVybiAwOyAvKiBrZWVwIHRoaXMgYWx0c2V0dGluZyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3N0cmVhbS5jIGIvc291bmQvdXNiL3N0cmVhbS5jCmluZGV4IDJmYjcxYmUuLjMxMGEzODIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9zdHJlYW0uYworKysgYi9zb3VuZC91c2Ivc3RyZWFtLmMKQEAgLTQxMSwxMCArNDExLDkgQEAKIAogCWlmICghY3NlcCB8fCBjc2VwLT5iTGVuZ3RoIDwgNyB8fAogCSAgICBjc2VwLT5iRGVzY3JpcHRvclN1YnR5cGUgIT0gVUFDX0VQX0dFTkVSQUwpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiV1OiVkIDogbm8gb3IgaW52YWxpZCIKLQkJCSAgICIgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBpZmFjZV9ubywKLQkJCSAgIGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CisJCXVzYl9hdWRpb193YXJuKGNoaXAsCisJCQkgICAgICAgIiV1OiVkIDogbm8gb3IgaW52YWxpZCBjbGFzcyBzcGVjaWZpYyBlbmRwb2ludCBkZXNjcmlwdG9yXG4iLAorCQkJICAgICAgIGlmYWNlX25vLCBhbHRzZC0+YkFsdGVybmF0ZVNldHRpbmcpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTUzMyw4ICs1MzIsOCBAQAogCQkvKiBnZXQgYXVkaW8gZm9ybWF0cyAqLwogCQlzd2l0Y2ggKHByb3RvY29sKSB7CiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgIiVkOiV1OiVkOiB1bmtub3duIGludGVyZmFjZSBwcm90b2NvbCAlIzAyeCwgYXNzdW1pbmcgdjFcbiIsCi0JCQkJICAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIHByb3RvY29sKTsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXU6JWQ6IHVua25vd24gaW50ZXJmYWNlIHByb3RvY29sICUjMDJ4LCBhc3N1bWluZyB2MVxuIiwKKwkJCQlpZmFjZV9ubywgYWx0bm8sIHByb3RvY29sKTsKIAkJCXByb3RvY29sID0gVUFDX1ZFUlNJT05fMTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCkBAIC01NDQsMTQgKzU0MywxNiBAQAogCQkJc3RydWN0IHVhY19pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yICppdGVybTsKIAogCQkJaWYgKCFhcykgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiJXU6JWQgOiBVQUNfQVNfR0VORVJBTCBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJCSIldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtNTc0LDE0ICs1NzUsMTYgQEAKIAkJCQlzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19BU19HRU5FUkFMKTsKIAogCQkJaWYgKCFhcykgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiJXU6JWQgOiBVQUNfQVNfR0VORVJBTCBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJCSIldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtNjA3LDggKzYxMCw5IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogYm9ndXMgYlRlcm1pbmFsTGluayAlZFxuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vLCBhcy0+YlRlcm1pbmFsTGluayk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQgOiBib2d1cyBiVGVybWluYWxMaW5rICVkXG4iLAorCQkJCWlmYWNlX25vLCBhbHRubywgYXMtPmJUZXJtaW5hbExpbmspOwogCQkJY29udGludWU7CiAJCX0KIAkJfQpAQCAtNjE2LDE0ICs2MjAsMTYgQEAKIAkJLyogZ2V0IGZvcm1hdCB0eXBlICovCiAJCWZtdCA9IHNuZF91c2JfZmluZF9jc2ludF9kZXNjKGFsdHMtPmV4dHJhLCBhbHRzLT5leHRyYWxlbiwgTlVMTCwgVUFDX0ZPUk1BVF9UWVBFKTsKIAkJaWYgKCFmbXQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogbm8gVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQgOiBubyBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKKwkJCQlpZmFjZV9ubywgYWx0bm8pOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkgJiYgKGZtdC0+Ykxlbmd0aCA8IDgpKSB8fAogCQkgICAgKChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8yKSAmJiAoZm10LT5iTGVuZ3RoIDwgNikpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAorCQkJCWlmYWNlX25vLCBhbHRubyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC02NDQsNyArNjUwLDcgQEAKIAogCQlmcCA9IGt6YWxsb2Moc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOwogCQlpZiAoISBmcCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvY1xuIik7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbm5vdCBtYWxsb2NcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtNzA3LDcgKzcxMyw3IEBACiAJCQljaGNvbmZpZyA9IDA7CiAJCWZwLT5jaG1hcCA9IGNvbnZlcnRfY2htYXAoZnAtPmNoYW5uZWxzLCBjaGNvbmZpZywgcHJvdG9jb2wpOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQ6IGFkZCBhdWRpbyBlbmRwb2ludCAlI3hcbiIsIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIGZwLT5lbmRwb2ludCk7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXU6JWQ6IGFkZCBhdWRpbyBlbmRwb2ludCAlI3hcbiIsIGlmYWNlX25vLCBhbHRubywgZnAtPmVuZHBvaW50KTsKIAkJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOwogCQlpZiAoZXJyIDwgMCkgewogCQkJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmggYi9zb3VuZC91c2IvdXNiYXVkaW8uaAppbmRleCA1ZDJmZTA1Li4yNWM0YzdlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uaAorKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uaApAQCAtNjAsNiArNjAsMTUgQEAKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpjdHJsX2ludGY7CS8qIHRoZSBhdWRpbyBjb250cm9sIGludGVyZmFjZSAqLwogfTsKIAorI2RlZmluZSB1c2JfYXVkaW9fZXJyKGNoaXAsIGZtdCwgYXJncy4uLikgXAorCWRldl9lcnIoJihjaGlwKS0+ZGV2LT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSB1c2JfYXVkaW9fd2FybihjaGlwLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2FybigmKGNoaXApLT5kZXYtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHVzYl9hdWRpb19pbmZvKGNoaXAsIGZtdCwgYXJncy4uLikgXAorCWRldl9pbmZvKCYoY2hpcCktPmRldi0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgdXNiX2F1ZGlvX2RiZyhjaGlwLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfZGJnKCYoY2hpcCktPmRldi0+ZGV2LCBmbXQsICMjYXJncykKKwogLyoKICAqIEluZm9ybWF0aW9uIGFib3V0IGRldmljZXMgd2l0aCBicm9rZW4gZGVzY3JpcHRvcnMKICAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCmluZGV4IDk5OTU1MGIuLmNmNWRjMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKQEAgLTUzNSw3ICs1MzUsOSBAQAogCQlzbmRfdXMxMjJsX2NhcmRfdXNlZFtpbmRleF0gPSAwOwogfQogCi1zdGF0aWMgaW50IHVzeDJ5X2NyZWF0ZV9jYXJkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCB1c3gyeV9jcmVhdGVfY2FyZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJaW50CQlkZXY7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwpAQCAtNTQ2LDggKzU0OCw4IEBACiAJCQlicmVhazsKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHVzMTIybCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmludGYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHVzMTIybCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlzbmRfdXMxMjJsX2NhcmRfdXNlZFtVUzEyMkwoY2FyZCktPmNhcmRfaW5kZXggPSBkZXZdID0gMTsKQEAgLTU3OCwxMSArNTgwLDEwIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSB1c3gyeV9jcmVhdGVfY2FyZChkZXZpY2UsICZjYXJkKTsKKwllcnIgPSB1c3gyeV9jcmVhdGVfY2FyZChkZXZpY2UsIGludGYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmludGYtPmRldik7CiAJaWYgKCF1czEyMmxfY3JlYXRlX2NhcmQoY2FyZCkpIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuYyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCmluZGV4IDVhNTFiMTguLjkxZTBlMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCkBAIC0zMzIsNyArMzMyLDkgQEAKIAl7IC8qIHRlcm1pbmF0b3IgKi8gfQogfTsKIAotc3RhdGljIGludCB1c1gyWV9jcmVhdGVfY2FyZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgdXNYMllfY3JlYXRlX2NhcmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCWludAkJZGV2OwogCXN0cnVjdCBzbmRfY2FyZCAqCWNhcmQ7CkBAIC0zNDMsMTUgKzM0NSwxNSBAQAogCQkJYnJlYWs7CiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB1c1gyWWRldiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmludGYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHVzWDJZZGV2KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCXNuZF91c1gyWV9jYXJkX3VzZWRbdXNYMlkoY2FyZCktPmNhcmRfaW5kZXggPSBkZXZdID0gMTsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfdXNYMllfY2FyZF9wcml2YXRlX2ZyZWU7CiAJdXNYMlkoY2FyZCktPmRldiA9IGRldmljZTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c1gyWShjYXJkKS0+cHJlcGFyZV93YWl0X3F1ZXVlKTsKLQltdXRleF9pbml0KCZ1c1gyWShjYXJkKS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJnVzWDJZKGNhcmQpLT5taWRpX2xpc3QpOwogCXN0cmNweShjYXJkLT5kcml2ZXIsICJVU0IgIk5BTUVfQUxMQ0FQUyIiKTsKIAlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlRBU0NBTSAiTkFNRV9BTExDQVBTIiIpOwpAQCAtMzgyLDEwICszODQsOSBAQAogCSAgICAgbGUxNl90b19jcHUoZGV2aWNlLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gVVNCX0lEX1VTNDI4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSB1c1gyWV9jcmVhdGVfY2FyZChkZXZpY2UsICZjYXJkKTsKKwllcnIgPSB1c1gyWV9jcmVhdGVfY2FyZChkZXZpY2UsIGludGYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZpbnRmLT5kZXYpOwogCWlmICgoZXJyID0gdXNYMllfaHdkZXBfbmV3KGNhcmQsIGRldmljZSkpIDwgMCAgfHwKIAkgICAgKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5oIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmgKaW5kZXggZTQzYzBhOC4uNmFlNmIwOCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmgKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmgKQEAgLTM2LDcgKzM2LDcgQEAKIAl1bnNpZ25lZCBpbnQJCXJhdGUsCiAJCQkJZm9ybWF0OwogCWludAkJCWNoaXBfc3RhdHVzOwotCXN0cnVjdCBtdXRleAkJcHJlcGFyZV9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCXBjbV9tdXRleDsKIAlzdHJ1Y3QgdXM0MjhjdGxzX3NoYXJlZG1lbQkqdXM0MjhjdGxzX3NoYXJlZG1lbTsKIAlpbnQJCQl3YWl0X2lzb19mcmFtZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAl1czQyOGN0bHNfd2FpdF9xdWV1ZV9oZWFkOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeWF1ZGlvLmMKaW5kZXggNjIzNGE1MS4uYTYzMzMwZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jCkBAIC03NTIsMzYgKzc1Miw0NCBAQAogCXVuc2lnbmVkIGludAkJcmF0ZSA9IHBhcmFtc19yYXRlKGh3X3BhcmFtcyk7CiAJc25kX3BjbV9mb3JtYXRfdAlmb3JtYXQgPSBwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcyk7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gc3Vic3RyZWFtLT5wc3RyLT5wY20tPmNhcmQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgdXNYMllkZXYJKmRldiA9IHVzWDJZKGNhcmQpOworCWludCBpOwogCisJbXV0ZXhfbG9jaygmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV9od19wYXJhbXMoJXAsICVwKVxuIiwgc3Vic3RyZWFtLCBod19wYXJhbXMpOwotCS8vIGFsbCBwY20gc3Vic3RyZWFtcyBvZmYgb25lIHVzWDJZIGhhdmUgdG8gb3BlcmF0ZSBhdCB0aGUgc2FtZSByYXRlICYgZm9ybWF0Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmY2FyZC0+ZGV2aWNlcykgewotCQlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwotCQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCQlpbnQgczsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKLQkJaWYgKGRldi0+dHlwZSAhPSBTTkRSVl9ERVZfUENNKQorCS8qIGFsbCBwY20gc3Vic3RyZWFtcyBvZmYgb25lIHVzWDJZIGhhdmUgdG8gb3BlcmF0ZSBhdCB0aGUgc2FtZQorCSAqIHJhdGUgJiBmb3JtYXQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5wY21fZGV2cyAqIDI7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IGRldi0+c3Vic1tpXTsKKwkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICp0ZXN0X3N1YnN0cmVhbTsKKworCQlpZiAoIXN1YnMpCiAJCQljb250aW51ZTsKLQkJcGNtID0gZGV2LT5kZXZpY2VfZGF0YTsKLQkJZm9yIChzID0gMDsgcyA8IDI7ICsrcykgewotCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICp0ZXN0X3N1YnN0cmVhbTsKLQkJCXRlc3Rfc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3NdLnN1YnN0cmVhbTsKLQkJCWlmICh0ZXN0X3N1YnN0cmVhbSAmJiB0ZXN0X3N1YnN0cmVhbSAhPSBzdWJzdHJlYW0gICYmCi0JCQkgICAgdGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUgJiYKLQkJCSAgICAoKHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgJiYKLQkJCSAgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgIT0gZm9ybWF0KSB8fAotCQkJICAgICAodGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUgJiYKLQkJCSAgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlICE9IHJhdGUpKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdGVzdF9zdWJzdHJlYW0gPSBzdWJzLT5wY21fc3Vic3RyZWFtOworCQlpZiAoIXRlc3Rfc3Vic3RyZWFtIHx8IHRlc3Rfc3Vic3RyZWFtID09IHN1YnN0cmVhbSB8fAorCQkgICAgIXRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lKQorCQkJY29udGludWU7CisJCWlmICgodGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUtPmZvcm1hdCAmJgorCQkgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgIT0gZm9ybWF0KSB8fAorCQkgICAgKHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlICYmCisJCSAgICAgdGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUgIT0gcmF0ZSkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOwogCQl9CiAJfQotCWlmICgwID4gKGVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSkpKSB7CisKKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAorCQkJCSAgICAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInNuZF9wY21fbGliX21hbGxvY19wYWdlcyglcCwgJWkpIHJldHVybmVkICVpXG4iLAogCQkJICAgc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcyksIGVycik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZXJyb3I7CiAJfQotCXJldHVybiAwOworCisgZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtNzkxLDcgKzc5OSw3IEBACiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQltdXRleF9sb2NrKCZzdWJzLT51c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfbG9jaygmc3Vicy0+dXNYMlktPnBjbV9tdXRleCk7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV9od19mcmVlKCVwKVxuIiwgc3Vic3RyZWFtKTsKIAogCWlmIChTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID09IHN1YnN0cmVhbS0+c3RyZWFtKSB7CkBAIC04MTIsNyArODIwLDcgQEAKIAkJCXVzWDJZX3VyYnNfcmVsZWFzZShzdWJzKTsKIAkJfQogCX0KLQltdXRleF91bmxvY2soJnN1YnMtPnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF91bmxvY2soJnN1YnMtPnVzWDJZLT5wY21fbXV0ZXgpOwogCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiB9CiAvKgpAQCAtODI5LDcgKzgzNyw3IEBACiAJaW50IGVyciA9IDA7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV9wY21fcHJlcGFyZSglcClcbiIsIHN1YnN0cmVhbSk7CiAKLQltdXRleF9sb2NrKCZ1c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfbG9jaygmdXNYMlktPnBjbV9tdXRleCk7CiAJdXNYMllfc3Vic19wcmVwYXJlKHN1YnMpOwogLy8gU3RhcnQgaGFyZHdhcmUgc3RyZWFtcwogLy8gU3luY1N0cmVhbSBmaXJzdC4uLi4KQEAgLTg0OSw3ICs4NTcsNyBAQAogCQllcnIgPSB1c1gyWV91cmJzX3N0YXJ0KHN1YnMpOwogCiAgdXBfcHJlcGFyZV9tdXRleDoKLQltdXRleF91bmxvY2soJnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF91bmxvY2soJnVzWDJZLT5wY21fbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMgYi9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCmluZGV4IDgxNGQwZTguLjkwNzY2YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzeDJ5aHdkZXBwY20uYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YSwKIAkJKmNhcF9zdWJzMiA9IHN1YnMtPnVzWDJZLT5zdWJzW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSArIDJdOwotCW11dGV4X2xvY2soJnN1YnMtPnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF9sb2NrKCZzdWJzLT51c1gyWS0+cGNtX211dGV4KTsKIAlzbmRfcHJpbnRkZCgic25kX3VzWDJZX3VzYnBjbV9od19mcmVlKCVwKVxuIiwgc3Vic3RyZWFtKTsKIAogCWlmIChTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID09IHN1YnN0cmVhbS0+c3RyZWFtKSB7CkBAIC0zODcsNyArMzg3LDcgQEAKIAkJCQl1c1gyWV91c2JwY21fdXJic19yZWxlYXNlKGNhcF9zdWJzMik7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZzdWJzLT51c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzdWJzLT51c1gyWS0+cGNtX211dGV4KTsKIAlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogCkBAIC00OTMsNyArNDkzLDcgQEAKIAkJbWVtc2V0KHVzWDJZLT5od2RlcF9wY21fc2htLCAwLCBzaXplb2Yoc3RydWN0IHNuZF91c1gyWV9od2RlcF9wY21fc2htKSk7CiAJfQogCi0JbXV0ZXhfbG9jaygmdXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X2xvY2soJnVzWDJZLT5wY21fbXV0ZXgpOwogCXVzWDJZX3N1YnNfcHJlcGFyZShzdWJzKTsKIC8vIFN0YXJ0IGhhcmR3YXJlIHN0cmVhbXMKIC8vIFN5bmNTdHJlYW0gZmlyc3QuLi4uCkBAIC01MzQsNyArNTM0LDcgQEAKIAkJdXNYMlktPmh3ZGVwX3BjbV9zaG0tPmNhcHR1cmVfaXNvX3N0YXJ0ID0gLTE7CiAKICB1cF9wcmVwYXJlX211dGV4OgotCW11dGV4X3VubG9jaygmdXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X3VubG9jaygmdXNYMlktPnBjbV9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjAwLDU5ICs2MDAsMzAgQEAKIH07CiAKIAotc3RhdGljIGludCB1c1gyWV9wY21zX2xvY2tfY2hlY2soc3RydWN0IHNuZF9jYXJkICpjYXJkKQorc3RhdGljIGludCB1c1gyWV9wY21zX2J1c3lfY2hlY2soc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWludCBlcnIgPSAwOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKLQkJaWYgKGRldi0+dHlwZSAhPSBTTkRSVl9ERVZfUENNKQotCQkJY29udGludWU7Ci0JCXBjbSA9IGRldi0+ZGV2aWNlX2RhdGE7Ci0JCW11dGV4X2xvY2soJnBjbS0+b3Blbl9tdXRleCk7CisJc3RydWN0IHVzWDJZZGV2CSpkZXYgPSB1c1gyWShjYXJkKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnBjbV9kZXZzICogMjsgaSsrKSB7CisJCXN0cnVjdCBzbmRfdXNYMllfc3Vic3RyZWFtICpzdWJzID0gZGV2LT5zdWJzW2ldOworCQlpZiAoc3VicyAmJiBzdWJzLT5wY21fc3Vic3RyZWFtICYmCisJCSAgICBTVUJTVFJFQU1fQlVTWShzdWJzLT5wY21fc3Vic3RyZWFtKSkKKwkJCXJldHVybiAtRUJVU1k7CiAJfQotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJaW50IHM7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7Ci0JCWlmIChkZXYtPnR5cGUgIT0gU05EUlZfREVWX1BDTSkKLQkJCWNvbnRpbnVlOwotCQlwY20gPSBkZXYtPmRldmljZV9kYXRhOwotCQlmb3IgKHMgPSAwOyBzIDwgMjsgKytzKSB7Ci0JCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQkJCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzXS5zdWJzdHJlYW07Ci0JCQlpZiAoc3Vic3RyZWFtICYmIFNVQlNUUkVBTV9CVVNZKHN1YnN0cmVhbSkpCi0JCQkJZXJyID0gLUVCVVNZOwotCQl9Ci0JfQotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgdXNYMllfcGNtc191bmxvY2soc3RydWN0IHNuZF9jYXJkICpjYXJkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKLQkJaWYgKGRldi0+dHlwZSAhPSBTTkRSVl9ERVZfUENNKQotCQkJY29udGludWU7Ci0JCXBjbSA9IGRldi0+ZGV2aWNlX2RhdGE7Ci0JCW11dGV4X3VubG9jaygmcGNtLT5vcGVuX211dGV4KTsKLQl9Ci19Ci0KLQogc3RhdGljIGludCBzbmRfdXNYMllfaHdkZXBfcGNtX29wZW4oc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCS8vIHdlIG5lZWQgdG8gYmUgdGhlIGZpcnN0IAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGh3LT5jYXJkOwotCWludCBlcnIgPSB1c1gyWV9wY21zX2xvY2tfY2hlY2soY2FyZCk7Ci0JaWYgKDAgPT0gZXJyKQorCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKKwllcnIgPSB1c1gyWV9wY21zX2J1c3lfY2hlY2soY2FyZCk7CisJaWYgKCFlcnIpCiAJCXVzWDJZKGNhcmQpLT5jaGlwX3N0YXR1cyB8PSBVU1gyWV9TVEFUX0NISVBfTU1BUF9QQ01fVVJCUzsKLQl1c1gyWV9wY21zX3VubG9jayhjYXJkKTsKKwltdXRleF91bmxvY2soJnVzWDJZKGNhcmQpLT5wY21fbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTY2MCwxMCArNjMxLDEzIEBACiBzdGF0aWMgaW50IHNuZF91c1gyWV9od2RlcF9wY21fcmVsZWFzZShzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gaHctPmNhcmQ7Ci0JaW50IGVyciA9IHVzWDJZX3BjbXNfbG9ja19jaGVjayhjYXJkKTsKLQlpZiAoMCA9PSBlcnIpCisJaW50IGVycjsKKworCW11dGV4X2xvY2soJnVzWDJZKGNhcmQpLT5wY21fbXV0ZXgpOworCWVyciA9IHVzWDJZX3BjbXNfYnVzeV9jaGVjayhjYXJkKTsKKwlpZiAoIWVycikKIAkJdXNYMlkoaHctPmNhcmQpLT5jaGlwX3N0YXR1cyAmPSB+VVNYMllfU1RBVF9DSElQX01NQVBfUENNX1VSQlM7Ci0JdXNYMllfcGNtc191bmxvY2soY2FyZCk7CisJbXV0ZXhfdW5sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZSBiL3Rvb2xzL01ha2VmaWxlCmluZGV4IGZlZWMzYWQuLmJjYWU4MDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlCisrKyBiL3Rvb2xzL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogCUBlY2hvICcgIGNncm91cCAgICAgLSBjZ3JvdXAgdG9vbHMnCiAJQGVjaG8gJyAgY3B1cG93ZXIgICAtIGEgdG9vbCBmb3IgYWxsIHRoaW5ncyB4ODYgQ1BVIHBvd2VyJwogCUBlY2hvICcgIGZpcmV3aXJlICAgLSB0aGUgdXNlcnNwYWNlIHBhcnQgb2Ygbm9zeSwgYW4gSUVFRS0xMzk0IHRyYWZmaWMgc25pZmZlcicKKwlAZWNobyAnICBodiAgICAgICAgIC0gdG9vbHMgdXNlZCB3aGVuIGluIEh5cGVyLVYgY2xpZW50cycKIAlAZWNobyAnICBsZ3Vlc3QgICAgIC0gYSBtaW5pbWFsIDMyLWJpdCB4ODYgaHlwZXJ2aXNvcicKIAlAZWNobyAnICBwZXJmICAgICAgIC0gTGludXggcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgYW5kIGFuYWx5c2lzIHRvb2wnCiAJQGVjaG8gJyAgc2VsZnRlc3RzICAtIHZhcmlvdXMga2VybmVsIHNlbGZ0ZXN0cycKQEAgLTQwLDcgKzQxLDcgQEAKIGNwdXBvd2VyOiBGT1JDRQogCSQoY2FsbCBkZXNjZW5kLHBvd2VyLyRAKQogCi1jZ3JvdXAgZmlyZXdpcmUgZ3Vlc3QgdXNiIHZpcnRpbyB2bSBuZXQ6IEZPUkNFCitjZ3JvdXAgZmlyZXdpcmUgaHYgZ3Vlc3QgdXNiIHZpcnRpbyB2bSBuZXQ6IEZPUkNFCiAJJChjYWxsIGRlc2NlbmQsJEApCiAKIGxpYmFwaWtmczogRk9SQ0UKQEAgLTY0LDcgKzY1LDcgQEAKIGNwdXBvd2VyX2luc3RhbGw6CiAJJChjYWxsIGRlc2NlbmQscG93ZXIvJChAOl9pbnN0YWxsPSksaW5zdGFsbCkKIAotY2dyb3VwX2luc3RhbGwgZmlyZXdpcmVfaW5zdGFsbCBsZ3Vlc3RfaW5zdGFsbCBwZXJmX2luc3RhbGwgdXNiX2luc3RhbGwgdmlydGlvX2luc3RhbGwgdm1faW5zdGFsbCBuZXRfaW5zdGFsbDoKK2Nncm91cF9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgaHZfaW5zdGFsbCBsZ3Vlc3RfaW5zdGFsbCBwZXJmX2luc3RhbGwgdXNiX2luc3RhbGwgdmlydGlvX2luc3RhbGwgdm1faW5zdGFsbCBuZXRfaW5zdGFsbDoKIAkkKGNhbGwgZGVzY2VuZCwkKEA6X2luc3RhbGw9KSxpbnN0YWxsKQogCiBzZWxmdGVzdHNfaW5zdGFsbDoKQEAgLTc2LDcgKzc3LDcgQEAKIHRtb25faW5zdGFsbDoKIAkkKGNhbGwgZGVzY2VuZCx0aGVybWFsLyQoQDpfaW5zdGFsbD0pLGluc3RhbGwpCiAKLWluc3RhbGw6IGFjcGlfaW5zdGFsbCBjZ3JvdXBfaW5zdGFsbCBjcHVwb3dlcl9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgbGd1ZXN0X2luc3RhbGwgXAoraW5zdGFsbDogYWNwaV9pbnN0YWxsIGNncm91cF9pbnN0YWxsIGNwdXBvd2VyX2luc3RhbGwgaHZfaW5zdGFsbCBmaXJld2lyZV9pbnN0YWxsIGxndWVzdF9pbnN0YWxsIFwKIAkJcGVyZl9pbnN0YWxsIHNlbGZ0ZXN0c19pbnN0YWxsIHR1cmJvc3RhdF9pbnN0YWxsIHVzYl9pbnN0YWxsIFwKIAkJdmlydGlvX2luc3RhbGwgdm1faW5zdGFsbCBuZXRfaW5zdGFsbCB4ODZfZW5lcmd5X3BlcmZfcG9saWN5X2luc3RhbGwgXAogCXRtb24KQEAgLTg3LDcgKzg4LDcgQEAKIGNwdXBvd2VyX2NsZWFuOgogCSQoY2FsbCBkZXNjZW5kLHBvd2VyL2NwdXBvd2VyLGNsZWFuKQogCi1jZ3JvdXBfY2xlYW4gZmlyZXdpcmVfY2xlYW4gbGd1ZXN0X2NsZWFuIHVzYl9jbGVhbiB2aXJ0aW9fY2xlYW4gdm1fY2xlYW4gbmV0X2NsZWFuOgorY2dyb3VwX2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIGxndWVzdF9jbGVhbiB1c2JfY2xlYW4gdmlydGlvX2NsZWFuIHZtX2NsZWFuIG5ldF9jbGVhbjoKIAkkKGNhbGwgZGVzY2VuZCwkKEA6X2NsZWFuPSksY2xlYW4pCiAKIGxpYmFwaWtmc19jbGVhbjoKQEAgLTEwNSw3ICsxMDYsNyBAQAogdG1vbl9jbGVhbjoKIAkkKGNhbGwgZGVzY2VuZCx0aGVybWFsL3Rtb24sY2xlYW4pCiAKLWNsZWFuOiBhY3BpX2NsZWFuIGNncm91cF9jbGVhbiBjcHVwb3dlcl9jbGVhbiBmaXJld2lyZV9jbGVhbiBsZ3Vlc3RfY2xlYW4gXAorY2xlYW46IGFjcGlfY2xlYW4gY2dyb3VwX2NsZWFuIGNwdXBvd2VyX2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIGxndWVzdF9jbGVhbiBcCiAJCXBlcmZfY2xlYW4gc2VsZnRlc3RzX2NsZWFuIHR1cmJvc3RhdF9jbGVhbiB1c2JfY2xlYW4gdmlydGlvX2NsZWFuIFwKIAkJdm1fY2xlYW4gbmV0X2NsZWFuIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3lfY2xlYW4gdG1vbl9jbGVhbgogCmRpZmYgLS1naXQgYS90b29scy9odi9NYWtlZmlsZSBiL3Rvb2xzL2h2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjJmNzgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9odi9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjIE1ha2VmaWxlIGZvciBIeXBlci1WIHRvb2xzCisKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYworUFRIUkVBRF9MSUJTID0gLWxwdGhyZWFkCitXQVJOSU5HUyA9IC1XYWxsIC1XZXh0cmEKK0NGTEFHUyA9ICQoV0FSTklOR1MpIC1nICQoUFRIUkVBRF9MSUJTKQorCithbGw6IGh2X2t2cF9kYWVtb24gaHZfdnNzX2RhZW1vbgorJTogJS5jCisJJChDQykgJChDRkxBR1MpIC1vICRAICReCisKK2NsZWFuOgorCSQoUk0pIGh2X2t2cF9kYWVtb24gaHZfdnNzX2RhZW1vbgpkaWZmIC0tZ2l0IGEvdG9vbHMvaHYvaHZfZmNvcHlfZGFlbW9uLmMgYi90b29scy9odi9odl9mY29weV9kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNjNGZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaHYvaHZfZmNvcHlfZGFlbW9uLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBob3N0IHRvIGd1ZXN0IGNvcHkgZnVuY3Rpb25hbGl0eSBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBNaWNyb3NvZnQsIEluYy4KKyAqCisgKiBBdXRob3IgOiBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKK3N0YXRpYyBpbnQgdGFyZ2V0X2ZkOworc3RhdGljIGNoYXIgdGFyZ2V0X2ZuYW1lW1dfTUFYX1BBVEhdOworCitzdGF0aWMgaW50IGh2X3N0YXJ0X2Zjb3B5KHN0cnVjdCBodl9zdGFydF9mY29weSAqc21zZykKK3sKKwlpbnQgZXJyb3IgPSBIVl9FX0ZBSUw7CisJY2hhciAqcSwgKnA7CisKKwkvKgorCSAqIElmIHBvc3NpbGUgYXBwZW5kIGEgcGF0aCBzZXBlcmF0b3IgdG8gdGhlIHBhdGguCisJICovCisJaWYgKHN0cmxlbigoY2hhciAqKXNtc2ctPnBhdGhfbmFtZSkgPCAoV19NQVhfUEFUSCAtIDIpKQorCQlzdHJjYXQoKGNoYXIgKilzbXNnLT5wYXRoX25hbWUsICIvIik7CisKKwlwID0gKGNoYXIgKilzbXNnLT5wYXRoX25hbWU7CisJc25wcmludGYodGFyZ2V0X2ZuYW1lLCBzaXplb2YodGFyZ2V0X2ZuYW1lKSwgIiVzLyVzIiwKKwkJKGNoYXIgKilzbXNnLT5wYXRoX25hbWUsIHNtc2ctPmZpbGVfbmFtZSk7CisKKwlzeXNsb2coTE9HX0lORk8sICJUYXJnZXQgZmlsZSBuYW1lOiAlcyIsIHRhcmdldF9mbmFtZSk7CisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhdGggaXMgYWxyZWFkeSBpbiBwbGFjZTsgaWYgbm90LAorCSAqIGNyZWF0ZSBpZiByZXF1aXJlZC4KKwkgKi8KKwl3aGlsZSAoKHEgPSBzdHJjaHIocCwgJy8nKSkgIT0gTlVMTCkgeworCQlpZiAocSA9PSBwKSB7CisJCQlwKys7CisJCQljb250aW51ZTsKKwkJfQorCQkqcSA9ICdcMCc7CisJCWlmIChhY2Nlc3MoKGNoYXIgKilzbXNnLT5wYXRoX25hbWUsIEZfT0spKSB7CisJCQlpZiAoc21zZy0+Y29weV9mbGFncyAmIENSRUFURV9QQVRIKSB7CisJCQkJaWYgKG1rZGlyKChjaGFyICopc21zZy0+cGF0aF9uYW1lLCAwNzU1KSkgeworCQkJCQlzeXNsb2coTE9HX0VSUiwgIkZhaWxlZCB0byBjcmVhdGUgJXMiLAorCQkJCQkJKGNoYXIgKilzbXNnLT5wYXRoX25hbWUpOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzeXNsb2coTE9HX0VSUiwgIkludmFsaWQgcGF0aDogJXMiLAorCQkJCQkoY2hhciAqKXNtc2ctPnBhdGhfbmFtZSk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXAgPSBxICsgMTsKKwkJKnEgPSAnLyc7CisJfQorCisJaWYgKCFhY2Nlc3ModGFyZ2V0X2ZuYW1lLCBGX09LKSkgeworCQlzeXNsb2coTE9HX0lORk8sICJGaWxlOiAlcyBleGlzdHMiLCB0YXJnZXRfZm5hbWUpOworCQlpZiAoIXNtc2ctPmNvcHlfZmxhZ3MgJiBPVkVSX1dSSVRFKQorCQkJZ290byBkb25lOworCX0KKworCXRhcmdldF9mZCA9IG9wZW4odGFyZ2V0X2ZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19DTE9FWEVDLCAwNzQ0KTsKKwlpZiAodGFyZ2V0X2ZkID09IC0xKSB7CisJCXN5c2xvZyhMT0dfSU5GTywgIk9wZW4gRmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllcnJvciA9IDA7Citkb25lOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBodl9jb3B5X2RhdGEoc3RydWN0IGh2X2RvX2Zjb3B5ICpjcG1zZykKK3sKKwlzc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CisKKwlieXRlc193cml0dGVuID0gcHdyaXRlKHRhcmdldF9mZCwgY3Btc2ctPmRhdGEsIGNwbXNnLT5zaXplLAorCQkJCWNwbXNnLT5vZmZzZXQpOworCisJaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gY3Btc2ctPnNpemUpCisJCXJldHVybiBIVl9FX0ZBSUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodl9jb3B5X2ZpbmlzaGVkKHZvaWQpCit7CisJY2xvc2UodGFyZ2V0X2ZkKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgaHZfY29weV9jYW5jZWwodm9pZCkKK3sKKwljbG9zZSh0YXJnZXRfZmQpOworCXVubGluayh0YXJnZXRfZm5hbWUpOworCXJldHVybiAwOworCit9CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IGZkLCBmY29weV9mZCwgbGVuOworCWludCBlcnJvcjsKKwlpbnQgdmVyc2lvbiA9IEZDT1BZX0NVUlJFTlRfVkVSU0lPTjsKKwljaGFyICpidWZmZXJbNDA5NiAqIDJdOworCXN0cnVjdCBodl9mY29weV9oZHIgKmluX21zZzsKKworCWlmIChkYWVtb24oMSwgMCkpIHsKKwkJc3lzbG9nKExPR19FUlIsICJkYWVtb24oKSBmYWlsZWQ7IGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlvcGVubG9nKCJIVl9GQ09QWSIsIDAsIExPR19VU0VSKTsKKwlzeXNsb2coTE9HX0lORk8sICJIVl9GQ09QWSBzdGFydGluZzsgcGlkIGlzOiVkIiwgZ2V0cGlkKCkpOworCisJZmNvcHlfZmQgPSBvcGVuKCIvZGV2L3ZtYnVzL2h2X2Zjb3B5IiwgT19SRFdSKTsKKworCWlmIChmY29weV9mZCA8IDApIHsKKwkJc3lzbG9nKExPR19FUlIsICJvcGVuIC9kZXYvdm1idXMvaHZfZmNvcHkgZmFpbGVkOyBlcnJvcjogJWQgJXMiLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggdGhlIGtlcm5lbC4KKwkgKi8KKwlpZiAoKHdyaXRlKGZjb3B5X2ZkLCAmdmVyc2lvbiwgc2l6ZW9mKGludCkpKSAhPSBzaXplb2YoaW50KSkgeworCQlzeXNsb2coTE9HX0VSUiwgIlJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIEluIHRoaXMgbG9vcCB3ZSBwcm9jZXNzIGZjb3B5IG1lc3NhZ2VzIGFmdGVyIHRoZQorCQkgKiBoYW5kc2hha2UgaXMgY29tcGxldGUuCisJCSAqLworCQlsZW4gPSBwcmVhZChmY29weV9mZCwgYnVmZmVyLCAoNDA5NiAqIDIpLCAwKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXN5c2xvZyhMT0dfRVJSLCAicHJlYWQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaW5fbXNnID0gKHN0cnVjdCBodl9mY29weV9oZHIgKilidWZmZXI7CisKKwkJc3dpdGNoIChpbl9tc2ctPm9wZXJhdGlvbikgeworCQljYXNlIFNUQVJUX0ZJTEVfQ09QWToKKwkJCWVycm9yID0gaHZfc3RhcnRfZmNvcHkoKHN0cnVjdCBodl9zdGFydF9mY29weSAqKWluX21zZyk7CisJCQlicmVhazsKKwkJY2FzZSBXUklURV9UT19GSUxFOgorCQkJZXJyb3IgPSBodl9jb3B5X2RhdGEoKHN0cnVjdCBodl9kb19mY29weSAqKWluX21zZyk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QTEVURV9GQ09QWToKKwkJCWVycm9yID0gaHZfY29weV9maW5pc2hlZCgpOworCQkJYnJlYWs7CisJCWNhc2UgQ0FOQ0VMX0ZDT1BZOgorCQkJZXJyb3IgPSBodl9jb3B5X2NhbmNlbCgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXN5c2xvZyhMT0dfRVJSLCAiVW5rbm93biBvcGVyYXRpb246ICVkIiwKKwkJCQlpbl9tc2ctPm9wZXJhdGlvbik7CisKKwkJfQorCisJCWlmIChwd3JpdGUoZmNvcHlfZmQsICZlcnJvciwgc2l6ZW9mKGludCksIDApICE9IHNpemVvZihpbnQpKSB7CisJCQlzeXNsb2coTE9HX0VSUiwgInB3cml0ZSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYyBiL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYwppbmRleCA1MjBkZTMzMDQuLjZhMjEzYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYworKysgYi90b29scy9odi9odl92c3NfZGFlbW9uLmMKQEAgLTg3LDYgKzg3LDggQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3RyY21wKGVudC0+bW50X3R5cGUsICJpc285NjYwIikgPT0gMCkKIAkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKGVudC0+bW50X3R5cGUsICJ2ZmF0IikgPT0gMCkKKwkJCWNvbnRpbnVlOwogCQlpZiAoc3RyY21wKGVudC0+bW50X2RpciwgIi8iKSA9PSAwKSB7CiAJCQlyb290X3NlZW4gPSAxOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL2xpbnV4L2hhc2guaCBiL3Rvb2xzL2luY2x1ZGUvbGludXgvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbmNsdWRlL2xpbnV4L2hhc2guaApAQCAtMCwwICsxLDUgQEAKKyNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2xpbnV4L2hhc2guaCIKKworI2lmbmRlZiBfVE9PTFNfTElOVVhfSEFTSF9ICisjZGVmaW5lIF9UT09MU19MSU5VWF9IQVNIX0gKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9NYWtlZmlsZSBiL3Rvb2xzL2xpYi9hcGkvTWFrZWZpbGUKaW5kZXggZWQyZjUxZS4uY2UwMGY3ZSAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2FwaS9NYWtlZmlsZQorKysgYi90b29scy9saWIvYXBpL01ha2VmaWxlCkBAIC05LDggKzksMTAgQEAKIExJQl9PQkpTPQogCiBMSUJfSCArPSBmcy9kZWJ1Z2ZzLmgKK0xJQl9IICs9IGZzL2ZzLmgKIAogTElCX09CSlMgKz0gJChPVVRQVVQpZnMvZGVidWdmcy5vCitMSUJfT0JKUyArPSAkKE9VVFBVVClmcy9mcy5vCiAKIExJQkZJTEUgPSBsaWJhcGlrZnMuYQogCmRpZmYgLS1naXQgYS90b29scy9saWIvYXBpL2ZzL2ZzLmMgYi90b29scy9saWIvYXBpL2ZzL2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1ZWI3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYwpAQCAtMCwwICsxLDEyNCBAQAorLyogVE9ETyBtZXJnZS9mYWN0b3IgaW4gZGVidWdmcy5jIGhlcmUgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjaW5jbHVkZSAiZGVidWdmcy5oIgorI2luY2x1ZGUgImZzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzZnNfX2ZzX2tub3duX21vdW50cG9pbnRzW10gPSB7CisJIi9zeXMiLAorCTAsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByb2Nmc19fa25vd25fbW91bnRwb2ludHNbXSA9IHsKKwkiL3Byb2MiLAorCTAsCit9OworCitzdHJ1Y3QgZnMgeworCWNvbnN0IGNoYXIJCSpuYW1lOworCWNvbnN0IGNoYXIgKiBjb25zdAkqbW91bnRzOworCWNoYXIJCQkgcGF0aFtQQVRIX01BWCArIDFdOworCWJvb2wJCQkgZm91bmQ7CisJbG9uZwkJCSBtYWdpYzsKK307CisKK2VudW0geworCUZTX19TWVNGUyAgPSAwLAorCUZTX19QUk9DRlMgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBmcyBmc19fZW50cmllc1tdID0geworCVtGU19fU1lTRlNdID0geworCQkubmFtZQk9ICJzeXNmcyIsCisJCS5tb3VudHMJPSBzeXNmc19fZnNfa25vd25fbW91bnRwb2ludHMsCisJCS5tYWdpYwk9IFNZU0ZTX01BR0lDLAorCX0sCisJW0ZTX19QUk9DRlNdID0geworCQkubmFtZQk9ICJwcm9jIiwKKwkJLm1vdW50cwk9IHByb2Nmc19fa25vd25fbW91bnRwb2ludHMsCisJCS5tYWdpYwk9IFBST0NfU1VQRVJfTUFHSUMsCisJfSwKK307CisKK3N0YXRpYyBib29sIGZzX19yZWFkX21vdW50cyhzdHJ1Y3QgZnMgKmZzKQoreworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwljaGFyIHR5cGVbMTAwXTsKKwlGSUxFICpmcDsKKworCWZwID0gZm9wZW4oIi9wcm9jL21vdW50cyIsICJyIik7CisJaWYgKGZwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKCFmb3VuZCAmJgorCSAgICAgICBmc2NhbmYoZnAsICIlKnMgJSIgU1RSKFBBVEhfTUFYKSAicyAlOTlzICUqcyAlKmQgJSpkXG4iLAorCQkgICAgICBmcy0+cGF0aCwgdHlwZSkgPT0gMikgeworCisJCWlmIChzdHJjbXAodHlwZSwgZnMtPm5hbWUpID09IDApCisJCQlmb3VuZCA9IHRydWU7CisJfQorCisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gZnMtPmZvdW5kID0gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgZnNfX3ZhbGlkX21vdW50KGNvbnN0IGNoYXIgKmZzLCBsb25nIG1hZ2ljKQoreworCXN0cnVjdCBzdGF0ZnMgc3RfZnM7CisKKwlpZiAoc3RhdGZzKGZzLCAmc3RfZnMpIDwgMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJZWxzZSBpZiAoc3RfZnMuZl90eXBlICE9IG1hZ2ljKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBmc19fY2hlY2tfbW91bnRzKHN0cnVjdCBmcyAqZnMpCit7CisJY29uc3QgY2hhciAqIGNvbnN0ICpwdHI7CisKKwlwdHIgPSBmcy0+bW91bnRzOworCXdoaWxlICgqcHRyKSB7CisJCWlmIChmc19fdmFsaWRfbW91bnQoKnB0ciwgZnMtPm1hZ2ljKSA9PSAwKSB7CisJCQlmcy0+Zm91bmQgPSB0cnVlOworCQkJc3RyY3B5KGZzLT5wYXRoLCAqcHRyKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXB0cisrOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZzX19nZXRfbW91bnRwb2ludChzdHJ1Y3QgZnMgKmZzKQoreworCWlmIChmc19fY2hlY2tfbW91bnRzKGZzKSkKKwkJcmV0dXJuIGZzLT5wYXRoOworCisJcmV0dXJuIGZzX19yZWFkX21vdW50cyhmcykgPyBmcy0+cGF0aCA6IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmc19fbW91bnRwb2ludChpbnQgaWR4KQoreworCXN0cnVjdCBmcyAqZnMgPSAmZnNfX2VudHJpZXNbaWR4XTsKKworCWlmIChmcy0+Zm91bmQpCisJCXJldHVybiAoY29uc3QgY2hhciAqKWZzLT5wYXRoOworCisJcmV0dXJuIGZzX19nZXRfbW91bnRwb2ludChmcyk7Cit9CisKKyNkZWZpbmUgRlNfX01PVU5UUE9JTlQobmFtZSwgaWR4KQlcCitjb25zdCBjaGFyICpuYW1lIyNfX21vdW50cG9pbnQodm9pZCkJXAorewkJCQkJXAorCXJldHVybiBmc19fbW91bnRwb2ludChpZHgpOwlcCit9CisKK0ZTX19NT1VOVFBPSU5UKHN5c2ZzLCAgRlNfX1NZU0ZTKTsKK0ZTX19NT1VOVFBPSU5UKHByb2NmcywgRlNfX1BST0NGUyk7CmRpZmYgLS1naXQgYS90b29scy9saWIvYXBpL2ZzL2ZzLmggYi90b29scy9saWIvYXBpL2ZzL2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3MDQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fQVBJX0ZTX18KKyNkZWZpbmUgX19BUElfRlNfXworCisjaWZuZGVmIFNZU0ZTX01BR0lDCisjZGVmaW5lIFNZU0ZTX01BR0lDICAgICAgICAgICAgMHg2MjY1NjU3MgorI2VuZGlmCisKKyNpZm5kZWYgUFJPQ19TVVBFUl9NQUdJQworI2RlZmluZSBQUk9DX1NVUEVSX01BR0lDICAgICAgIDB4OWZhMAorI2VuZGlmCisKK2NvbnN0IGNoYXIgKnN5c2ZzX19tb3VudHBvaW50KHZvaWQpOworY29uc3QgY2hhciAqcHJvY2ZzX19tb3VudHBvaW50KHZvaWQpOworI2VuZGlmIC8qIF9fQVBJX0ZTX18gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLW1lbS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1tZW0udHh0CmluZGV4IDg4OGQ1MTEuLjFkNzhhNDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLW1lbS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbWVtLnR4dApAQCAtMTgsNiArMTgsMTAgQEAKICJwZXJmIG1lbSAtdCA8VFlQRT4gcmVwb3J0IiBkaXNwbGF5cyB0aGUgcmVzdWx0LiBJdCBpbnZva2VzIHBlcmYgcmVwb3J0IHdpdGggdGhlCiByaWdodCBzZXQgb2Ygb3B0aW9ucyB0byBkaXNwbGF5IGEgbWVtb3J5IGFjY2VzcyBwcm9maWxlLgogCitOb3RlIHRoYXQgb24gSW50ZWwgc3lzdGVtcyB0aGUgbWVtb3J5IGxhdGVuY3kgcmVwb3J0ZWQgaXMgdGhlIHVzZS1sYXRlbmN5LAorbm90IHRoZSBwdXJlIGxvYWQgKG9yIHN0b3JlIGxhdGVuY3kpLiBVc2UgbGF0ZW5jeSBpbmNsdWRlcyBhbnkgcGlwZWxpbmUKK3F1ZXVlaW5nIGRlbGF5cyBpbiBhZGRpdGlvbiB0byB0aGUgbWVtb3J5IHN1YnN5c3RlbSBsYXRlbmN5LgorCiBPUFRJT05TCiAtLS0tLS0tCiA8Y29tbWFuZD4uLi46OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CmluZGV4IGI3MTVjYjcuLjE1MTM5MzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKQEAgLTEzNiw2ICsxMzYsOCBAQAogJ05BTUUnIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGlzIGFyZ3VtZW50IChvcHRpb25hbCkuIFlvdSBjYW4gdXNlIHRoZSBuYW1lIG9mIGxvY2FsIHZhcmlhYmxlLCBsb2NhbCBkYXRhIHN0cnVjdHVyZSBtZW1iZXIgKGUuZy4gdmFyLT5maWVsZCwgdmFyLmZpZWxkMiksIGxvY2FsIGFycmF5IHdpdGggZml4ZWQgaW5kZXggKGUuZy4gYXJyYXlbMV0sIHZhci0+YXJyYXlbMF0sIHZhci0+cG9pbnRlclsyXSksIG9yIGtwcm9iZS10cmFjZXIgYXJndW1lbnQgZm9ybWF0IChlLmcuICRyZXR2YWwsICVheCwgZXRjKS4gTm90ZSB0aGF0IHRoZSBuYW1lIG9mIHRoaXMgYXJndW1lbnQgd2lsbCBiZSBzZXQgYXMgdGhlIGxhc3QgbWVtYmVyIG5hbWUgaWYgeW91IHNwZWNpZnkgYSBsb2NhbCBkYXRhIHN0cnVjdHVyZSBtZW1iZXIgKGUuZy4gZmllbGQyIGZvciAndmFyLT5maWVsZDEuZmllbGQyJy4pCiAnVFlQRScgY2FzdHMgdGhlIHR5cGUgb2YgdGhpcyBhcmd1bWVudCAob3B0aW9uYWwpLiBJZiBvbWl0dGVkLCBwZXJmIHByb2JlIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIGJhc2VkIG9uIGRlYnVnaW5mby4gWW91IGNhbiBzcGVjaWZ5ICdzdHJpbmcnIHR5cGUgb25seSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggaXMgYW4gYXJyYXkgb2Ygb3IgYSBwb2ludGVyIHRvICdjaGFyJyBvciAndW5zaWduZWQgY2hhcicgdHlwZS4KIAorT24geDg2IHN5c3RlbXMgJVJFRyBpcyBhbHdheXMgdGhlIHNob3J0IGZvcm0gb2YgdGhlIHJlZ2lzdGVyOiBmb3IgZXhhbXBsZSAlQVguICVSQVggb3IgJUVBWCBpcyBub3QgdmFsaWQuCisKIExJTkUgU1lOVEFYCiAtLS0tLS0tLS0tLQogTGluZSByYW5nZSBpcyBkZXNjcmliZWQgYnkgZm9sbG93aW5nIHN5bnRheC4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QgYi90b29scy9wZXJmL01BTklGRVNUCmluZGV4IGY0MTU3MmQuLmMwYzg3YzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QKKysrIGIvdG9vbHMvcGVyZi9NQU5JRkVTVApAQCAtNiw2ICs2LDcgQEAKIHRvb2xzL2xpYi9zeW1ib2wva2FsbHN5bXMuaAogdG9vbHMvaW5jbHVkZS9hc20vYnVnLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAordG9vbHMvaW5jbHVkZS9saW51eC9oYXNoLmgKIGluY2x1ZGUvbGludXgvY29uc3QuaAogaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKIGluY2x1ZGUvbGludXgvcmJ0cmVlLmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZiBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgppbmRleCA3MjU3ZTdlLi41MGQ4NzVkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCkBAIC03LDYgKzcsOCBAQAogCiAjIERlZmluZSBWIHRvIGhhdmUgYSBtb3JlIHZlcmJvc2UgY29tcGlsZS4KICMKKyMgRGVmaW5lIFZGIHRvIGhhdmUgYSBtb3JlIHZlcmJvc2UgZmVhdHVyZSBjaGVjayBvdXRwdXQuCisjCiAjIERlZmluZSBPIHRvIHNhdmUgb3V0cHV0IGZpbGVzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LgogIwogIyBEZWZpbmUgQVJDSCBhcyBuYW1lIG9mIHRhcmdldCBhcmNoaXRlY3R1cmUgaWYgeW91IHdhbnQgY3Jvc3MtYnVpbGRzLgpAQCAtNTUsNiArNTcsOSBAQAogIyBEZWZpbmUgTk9fTElCQVVESVQgaWYgeW91IGRvIG5vdCB3YW50IGxpYmF1ZGl0IHN1cHBvcnQKICMKICMgRGVmaW5lIE5PX0xJQkJJT05JQyBpZiB5b3UgZG8gbm90IHdhbnQgYmlvbmljIHN1cHBvcnQKKyMKKyMgRGVmaW5lIE5PX0xJQkRXX0RXQVJGX1VOV0lORCBpZiB5b3UgZG8gbm90IHdhbnQgbGliZHcgc3VwcG9ydAorIyBmb3IgZHdhcmYgYmFja3RyYWNlIHBvc3QgdW53aW5kLgogCiBpZmVxICgkKHNyY3RyZWUpLCkKIHNyY3RyZWUgOj0gJChwYXRzdWJzdCAlLywlLCQoZGlyICQoc2hlbGwgcHdkKSkpCkBAIC0yMDgsNyArMjEzLDcgQEAKIExJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKIExJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvbGlzdC5oCiBMSUJfSCArPSAuLi8uLi9pbmNsdWRlL3VhcGkvbGludXgvY29uc3QuaAotTElCX0ggKz0gLi4vLi4vaW5jbHVkZS9saW51eC9oYXNoLmgKK0xJQl9IICs9IC4uL2luY2x1ZGUvbGludXgvaGFzaC5oCiBMSUJfSCArPSAuLi8uLi9pbmNsdWRlL2xpbnV4L3N0cmluZ2lmeS5oCiBMSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgvYml0bWFwLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9iaXRvcHMuaApAQCAtMjE4LDkgKzIyMyw3IEBACiBMSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgva2VybmVsLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9saXN0LmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9leHBvcnQuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9wb2lzb24uaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9yYnRyZWUuaAogTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3JidHJlZV9hdWdtZW50ZWQuaAogTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC0yNDQsNyArMjQ3LDYgQEAKIExJQl9IICs9IHV0aWwvY2FsbGNoYWluLmgKIExJQl9IICs9IHV0aWwvYnVpbGQtaWQuaAogTElCX0ggKz0gdXRpbC9kZWJ1Zy5oCi1MSUJfSCArPSB1dGlsL2ZzLmgKIExJQl9IICs9IHV0aWwvcG11LmgKIExJQl9IICs9IHV0aWwvZXZlbnQuaAogTElCX0ggKz0gdXRpbC9ldnNlbC5oCkBAIC0zMDYsNyArMzA4LDYgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvYnVpbGQtaWQubwogTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9jb25maWcubwogTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9jdHlwZS5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2ZzLm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcG11Lm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvZW52aXJvbm1lbnQubwogTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9ldmVudC5vCkBAIC00MDgsNiArNDA5LDExIEBACiBMSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9jb2RlLXJlYWRpbmcubwogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvc2FtcGxlLXBhcnNpbmcubwogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvcGFyc2Utbm8tc2FtcGxlLWlkLWFsbC5vCitpZm5kZWYgTk9fRFdBUkZfVU5XSU5ECitpZmVxICgkKEFSQ0gpLHg4NikKK0xJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2R3YXJmLXVud2luZC5vCitlbmRpZgorZW5kaWYKIAogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYW5ub3RhdGUubwogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYmVuY2gubwpAQCAtNDIwLDYgKzQyNiw5IEBACiBlbmRpZgogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL21lbS1tZW1jcHkubwogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL21lbS1tZW1zZXQubworQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL2Z1dGV4LWhhc2gubworQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL2Z1dGV4LXdha2UubworQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL2Z1dGV4LXJlcXVldWUubwogCiBCVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1kaWZmLm8KIEJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLWV2bGlzdC5vCkBAIC00NzUsOCArNDg0LDEzIEBACiBlbmRpZiAjIE5PX0RXQVJGCiBlbmRpZiAjIE5PX0xJQkVMRgogCitpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECisgIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdW53aW5kLWxpYmR3Lm8KKyAgTElCX0ggKz0gdXRpbC91bndpbmQtbGliZHcuaAorZW5kaWYKKwogaWZuZGVmIE5PX0xJQlVOV0lORAotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3Vud2luZC5vCisgIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdW53aW5kLWxpYnVud2luZC5vCiBlbmRpZgogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMva2VlcC10cmFja2luZy5vCiAKQEAgLTUzMyw2ICs1NDcsNyBAQAogICBpZmVxICgkKEFSQ0gpLHg4NikKICAgICBMSUJfSCArPSBhcmNoL3g4Ni9pbmNsdWRlL3BlcmZfcmVncy5oCiAgIGVuZGlmCisgIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcGVyZl9yZWdzLm8KIGVuZGlmCiAKIGlmbmRlZiBOT19MSUJOVU1BCkBAIC02NTUsNiArNjcwLDkgQEAKIAkJLURQWVRIT049JyIkKFBZVEhPTl9XT1JEKSInIFwKIAkJJDwKIAorJChPVVRQVVQpdGVzdHMvZHdhcmYtdW53aW5kLm86IHRlc3RzL2R3YXJmLXVud2luZC5jCisJJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICQ8CisKICQoT1VUUFVUKXV0aWwvY29uZmlnLm86IHV0aWwvY29uZmlnLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKIAkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAtREVUQ19QRVJGQ09ORklHPSciJChFVENfUEVSRkNPTkZJR19TUSkiJyAkPAogCkBAIC03MDcsOSArNzI1LDE1IEBACiAjIHdlIGRlcGVuZCB0aGUgdmFyaW91cyBmaWxlcyBvbnRvIHRoZWlyIGRpcmVjdG9yaWVzLgogRElSRUNUT1JZX0RFUFMgPSAkKExJQl9PQkpTKSAkKEJVSUxUSU5fT0JKUykgJChHVEtfT0JKUykKIERJUkVDVE9SWV9ERVBTICs9ICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKWNvbW1vbi1jbWRzLmgKLSQoRElSRUNUT1JZX0RFUFMpOiB8ICQoc29ydCAkKGRpciAkKERJUkVDVE9SWV9ERVBTKSkpCisjIG5vIG5lZWQgdG8gYWRkIGZsZXggb2JqZWN0cywgYmVjYXVzZSB0aGV5IGRlcGVuZCBvbiBiaXNvbiBvbmVzCitESVJFQ1RPUllfREVQUyArPSAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jCitESVJFQ1RPUllfREVQUyArPSAkKE9VVFBVVCl1dGlsL3BtdS1iaXNvbi5jCisKK09VVFBVVF9ESVJFQ1RPUklFUyA6PSAkKHNvcnQgJChkaXIgJChESVJFQ1RPUllfREVQUykpKQorCiskKERJUkVDVE9SWV9ERVBTKTogfCAkKE9VVFBVVF9ESVJFQ1RPUklFUykKICMgSW4gdGhlIHNlY29uZCBzdGVwLCB3ZSBtYWtlIGEgcnVsZSB0byBhY3R1YWxseSBjcmVhdGUgdGhlc2UgZGlyZWN0b3JpZXMKLSQoc29ydCAkKGRpciAkKERJUkVDVE9SWV9ERVBTKSkpOgorJChPVVRQVVRfRElSRUNUT1JJRVMpOgogCSQoUVVJRVRfTUtESVIpJChNS0RJUikgLXAgJEAgMj4vZGV2L251bGwKIAogJChMSUJfRklMRSk6ICQoTElCX09CSlMpCkBAIC04ODYsNyArOTEwLDcgQEAKIGNsZWFuOiAkKExJQlRSQUNFRVZFTlQpLWNsZWFuICQoTElCQVBJS0ZTKS1jbGVhbiBjb25maWctY2xlYW4KIAkkKGNhbGwgUVVJRVRfQ0xFQU4sIGNvcmUtb2JqcykgICQoUk0pICQoTElCX09CSlMpICQoQlVJTFRJTl9PQkpTKSAkKExJQl9GSUxFKSAkKE9VVFBVVClwZXJmLWFyY2hpdmUgJChPVVRQVVQpcGVyZi5vICQoTEFOR19CSU5ESU5HUykgJChHVEtfT0JKUykKIAkkKGNhbGwgUVVJRVRfQ0xFQU4sIGNvcmUtcHJvZ3MpICQoUk0pICQoQUxMX1BST0dSQU1TKSBwZXJmCi0JJChjYWxsIFFVSUVUX0NMRUFOLCBjb3JlLWdlbikgICAkKFJNKSAgKi5zcGVjICoucHljICoucHlvICovKi5weWMgKi8qLnB5byAkKE9VVFBVVCljb21tb24tY21kcy5oIFRBR1MgdGFncyBjc2NvcGUqICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKVBFUkYtQ0ZMQUdTICQoT1VUUFVUKXV0aWwvKi1iaXNvbiogJChPVVRQVVQpdXRpbC8qLWZsZXgqCisJJChjYWxsIFFVSUVUX0NMRUFOLCBjb3JlLWdlbikgICAkKFJNKSAgKi5zcGVjICoucHljICoucHlvICovKi5weWMgKi8qLnB5byAkKE9VVFBVVCljb21tb24tY21kcy5oIFRBR1MgdGFncyBjc2NvcGUqICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKVBFUkYtQ0ZMQUdTICQoT1VUUFVUKVBFUkYtRkVBVFVSRVMgJChPVVRQVVQpdXRpbC8qLWJpc29uKiAkKE9VVFBVVCl1dGlsLyotZmxleCoKIAkkKFFVSUVUX1NVQkRJUjApRG9jdW1lbnRhdGlvbiAkKFFVSUVUX1NVQkRJUjEpIGNsZWFuCiAJJChweXRob24tY2xlYW4pCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vTWFrZWZpbGUgYi90b29scy9wZXJmL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IGZlOWI2MWUuLjY3ZTliM2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS9NYWtlZmlsZQpAQCAtMyw1ICszLDUgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2R3YXJmLXJlZ3MubwogZW5kaWYKIGlmbmRlZiBOT19MSUJVTldJTkQKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL3Vud2luZC5vCitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGlidW53aW5kLm8KIGVuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvdW53aW5kLWxpYnVud2luZC5jIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3Vud2luZC1saWJ1bndpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjllZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3Vud2luZC1saWJ1bndpbmQuYwpAQCAtMCwwICsxLDQ4IEBACisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpYnVud2luZC5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdW53aW5kLmgiCisKK2ludCBsaWJ1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pCit7CisJc3dpdGNoIChyZWdudW0pIHsKKwljYXNlIFVOV19BUk1fUjA6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjA7CisJY2FzZSBVTldfQVJNX1IxOgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1IxOworCWNhc2UgVU5XX0FSTV9SMjoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SMjsKKwljYXNlIFVOV19BUk1fUjM6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjM7CisJY2FzZSBVTldfQVJNX1I0OgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I0OworCWNhc2UgVU5XX0FSTV9SNToKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SNTsKKwljYXNlIFVOV19BUk1fUjY6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjY7CisJY2FzZSBVTldfQVJNX1I3OgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I3OworCWNhc2UgVU5XX0FSTV9SODoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SODsKKwljYXNlIFVOV19BUk1fUjk6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjk7CisJY2FzZSBVTldfQVJNX1IxMDoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SMTA7CisJY2FzZSBVTldfQVJNX1IxMToKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9GUDsKKwljYXNlIFVOV19BUk1fUjEyOgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX0lQOworCWNhc2UgVU5XX0FSTV9SMTM6CisJCXJldHVybiBQRVJGX1JFR19BUk1fU1A7CisJY2FzZSBVTldfQVJNX1IxNDoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9MUjsKKwljYXNlIFVOV19BUk1fUjE1OgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1BDOworCWRlZmF1bHQ6CisJCXByX2VycigidW53aW5kOiBpbnZhbGlkIHJlZyBpZCAlZFxuIiwgcmVnbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvdW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvdW53aW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhM2RjOTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3Vud2luZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaWJ1bndpbmQuaD4KLSNpbmNsdWRlICJwZXJmX3JlZ3MuaCIKLSNpbmNsdWRlICIuLi8uLi91dGlsL3Vud2luZC5oIgotCi1pbnQgdW53aW5kX19hcmNoX3JlZ19pZChpbnQgcmVnbnVtKQotewotCXN3aXRjaCAocmVnbnVtKSB7Ci0JY2FzZSBVTldfQVJNX1IwOgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1IwOwotCWNhc2UgVU5XX0FSTV9SMToKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SMTsKLQljYXNlIFVOV19BUk1fUjI6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjI7Ci0JY2FzZSBVTldfQVJNX1IzOgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1IzOwotCWNhc2UgVU5XX0FSTV9SNDoKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SNDsKLQljYXNlIFVOV19BUk1fUjU6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjU7Ci0JY2FzZSBVTldfQVJNX1I2OgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I2OwotCWNhc2UgVU5XX0FSTV9SNzoKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SNzsKLQljYXNlIFVOV19BUk1fUjg6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjg7Ci0JY2FzZSBVTldfQVJNX1I5OgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I5OwotCWNhc2UgVU5XX0FSTV9SMTA6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjEwOwotCWNhc2UgVU5XX0FSTV9SMTE6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fRlA7Ci0JY2FzZSBVTldfQVJNX1IxMjoKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9JUDsKLQljYXNlIFVOV19BUk1fUjEzOgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1NQOwotCWNhc2UgVU5XX0FSTV9SMTQ6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fTFI7Ci0JY2FzZSBVTldfQVJNX1IxNToKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9QQzsKLQlkZWZhdWx0OgotCQlwcl9lcnIoInVud2luZDogaW52YWxpZCByZWcgaWQgJWRcbiIsIHJlZ251bSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggODgwMWZlMC4uMTY0MTU0MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZQorKysgYi90b29scy9wZXJmL2FyY2gveDg2L01ha2VmaWxlCkBAIC0zLDcgKzMsMTQgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2R3YXJmLXJlZ3MubwogZW5kaWYKIGlmbmRlZiBOT19MSUJVTldJTkQKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL3Vud2luZC5vCitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGlidW53aW5kLm8KK2VuZGlmCitpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGliZHcubworZW5kaWYKK2lmbmRlZiBOT19EV0FSRl9VTldJTkQKK0xJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS90ZXN0cy9yZWdzX2xvYWQubworTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3Rlc3RzL2R3YXJmLXVud2luZC5vCiBlbmRpZgogTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvaGVhZGVyLm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL3RzYy5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L2luY2x1ZGUvcGVyZl9yZWdzLmggYi90b29scy9wZXJmL2FyY2gveDg2L2luY2x1ZGUvcGVyZl9yZWdzLmgKaW5kZXggZTg0Y2E3Ni4uZmM4MTljYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL3BlcmZfcmVncy5oCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvaW5jbHVkZS9wZXJmX3JlZ3MuaApAQCAtNSwxNCArNSwyMCBAQAogI2luY2x1ZGUgIi4uLy4uL3V0aWwvdHlwZXMuaCIKICNpbmNsdWRlIDxhc20vcGVyZl9yZWdzLmg+CiAKK3ZvaWQgcGVyZl9yZWdzX2xvYWQodTY0ICpyZWdzKTsKKwogI2lmbmRlZiBIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQKICNkZWZpbmUgUEVSRl9SRUdTX01BU0sgKCgxVUxMIDw8IFBFUkZfUkVHX1g4Nl8zMl9NQVgpIC0gMSkKKyNkZWZpbmUgUEVSRl9SRUdTX01BWCBQRVJGX1JFR19YODZfMzJfTUFYCisjZGVmaW5lIFBFUkZfU0FNUExFX1JFR1NfQUJJIFBFUkZfU0FNUExFX1JFR1NfQUJJXzMyCiAjZWxzZQogI2RlZmluZSBSRUdfTk9TVVBQT1JUICgoMVVMTCA8PCBQRVJGX1JFR19YODZfRFMpIHwgXAogCQkgICAgICAgKDFVTEwgPDwgUEVSRl9SRUdfWDg2X0VTKSB8IFwKIAkJICAgICAgICgxVUxMIDw8IFBFUkZfUkVHX1g4Nl9GUykgfCBcCiAJCSAgICAgICAoMVVMTCA8PCBQRVJGX1JFR19YODZfR1MpKQogI2RlZmluZSBQRVJGX1JFR1NfTUFTSyAoKCgxVUxMIDw8IFBFUkZfUkVHX1g4Nl82NF9NQVgpIC0gMSkgJiB+UkVHX05PU1VQUE9SVCkKKyNkZWZpbmUgUEVSRl9SRUdTX01BWCBQRVJGX1JFR19YODZfNjRfTUFYCisjZGVmaW5lIFBFUkZfU0FNUExFX1JFR1NfQUJJIFBFUkZfU0FNUExFX1JFR1NfQUJJXzY0CiAjZW5kaWYKICNkZWZpbmUgUEVSRl9SRUdfSVAgUEVSRl9SRUdfWDg2X0lQCiAjZGVmaW5lIFBFUkZfUkVHX1NQIFBFUkZfUkVHX1g4Nl9TUApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9kd2FyZi11bndpbmQuYyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdGVzdHMvZHdhcmYtdW53aW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwMmFkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdGVzdHMvZHdhcmYtdW53aW5kLmMKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAidGVzdHMvdGVzdHMuaCIKKworI2RlZmluZSBTVEFDS19TSVpFIDgxOTIKKworc3RhdGljIGludCBzYW1wbGVfdXN0YWNrKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgdTY0ICpyZWdzKQoreworCXN0cnVjdCBzdGFja19kdW1wICpzdGFjayA9ICZzYW1wbGUtPnVzZXJfc3RhY2s7CisJc3RydWN0IG1hcCAqbWFwOworCXVuc2lnbmVkIGxvbmcgc3A7CisJdTY0IHN0YWNrX3NpemUsICpidWY7CisKKwlidWYgPSBtYWxsb2MoU1RBQ0tfU0laRSk7CisJaWYgKCFidWYpIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBhbGxvY2F0ZSBzYW1wbGUgdXJlZ3MgZGF0YVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nKSByZWdzW1BFUkZfUkVHX1g4Nl9TUF07CisKKwltYXAgPSBtYXBfZ3JvdXBzX19maW5kKCZ0aHJlYWQtPm1nLCBNQVBfX0ZVTkNUSU9OLCAodTY0KSBzcCk7CisJaWYgKCFtYXApIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBnZXQgc3RhY2sgbWFwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0YWNrX3NpemUgPSBtYXAtPmVuZCAtIHNwOworCXN0YWNrX3NpemUgPSBzdGFja19zaXplID4gU1RBQ0tfU0laRSA/IFNUQUNLX1NJWkUgOiBzdGFja19zaXplOworCisJbWVtY3B5KGJ1ZiwgKHZvaWQgKikgc3AsIHN0YWNrX3NpemUpOworCXN0YWNrLT5kYXRhID0gKGNoYXIgKikgYnVmOworCXN0YWNrLT5zaXplID0gc3RhY2tfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKQoreworCXN0cnVjdCByZWdzX2R1bXAgKnJlZ3MgPSAmc2FtcGxlLT51c2VyX3JlZ3M7CisJdTY0ICpidWY7CisKKwlidWYgPSBtYWxsb2Moc2l6ZW9mKHU2NCkgKiBQRVJGX1JFR1NfTUFYKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGFsbG9jYXRlIHNhbXBsZSB1cmVncyBkYXRhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBlcmZfcmVnc19sb2FkKGJ1Zik7CisJcmVncy0+YWJpICA9IFBFUkZfU0FNUExFX1JFR1NfQUJJOworCXJlZ3MtPnJlZ3MgPSBidWY7CisJcmVncy0+bWFzayA9IFBFUkZfUkVHU19NQVNLOworCisJcmV0dXJuIHNhbXBsZV91c3RhY2soc2FtcGxlLCB0aHJlYWQsIGJ1Zik7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3Rlc3RzL3JlZ3NfbG9hZC5TIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9yZWdzX2xvYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTE2N2JmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9yZWdzX2xvYWQuUwpAQCAtMCwwICsxLDkyIEBACisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNkZWZpbmUgQVgJIDAKKyNkZWZpbmUgQlgJIDEgKiA4CisjZGVmaW5lIENYCSAyICogOAorI2RlZmluZSBEWAkgMyAqIDgKKyNkZWZpbmUgU0kJIDQgKiA4CisjZGVmaW5lIERJCSA1ICogOAorI2RlZmluZSBCUAkgNiAqIDgKKyNkZWZpbmUgU1AJIDcgKiA4CisjZGVmaW5lIElQCSA4ICogOAorI2RlZmluZSBGTEFHUwkgOSAqIDgKKyNkZWZpbmUgQ1MJMTAgKiA4CisjZGVmaW5lIFNTCTExICogOAorI2RlZmluZSBEUwkxMiAqIDgKKyNkZWZpbmUgRVMJMTMgKiA4CisjZGVmaW5lIEZTCTE0ICogOAorI2RlZmluZSBHUwkxNSAqIDgKKyNkZWZpbmUgUjgJMTYgKiA4CisjZGVmaW5lIFI5CTE3ICogOAorI2RlZmluZSBSMTAJMTggKiA4CisjZGVmaW5lIFIxMQkxOSAqIDgKKyNkZWZpbmUgUjEyCTIwICogOAorI2RlZmluZSBSMTMJMjEgKiA4CisjZGVmaW5lIFIxNAkyMiAqIDgKKyNkZWZpbmUgUjE1CTIzICogOAorCisudGV4dAorI2lmZGVmIEhBVkVfQVJDSF9YODZfNjRfU1VQUE9SVAorRU5UUlkocGVyZl9yZWdzX2xvYWQpCisJbW92cSAlcmF4LCBBWCglcmRpKQorCW1vdnEgJXJieCwgQlgoJXJkaSkKKwltb3ZxICVyY3gsIENYKCVyZGkpCisJbW92cSAlcmR4LCBEWCglcmRpKQorCW1vdnEgJXJzaSwgU0koJXJkaSkKKwltb3ZxICVyZGksIERJKCVyZGkpCisJbW92cSAlcmJwLCBCUCglcmRpKQorCisJbGVhcSA4KCVyc3ApLCAlcmF4IC8qIGV4Y2x1ZGUgdGhpcyBjYWxsLiAgKi8KKwltb3ZxICVyYXgsIFNQKCVyZGkpCisKKwltb3ZxIDAoJXJzcCksICVyYXgKKwltb3ZxICVyYXgsIElQKCVyZGkpCisKKwltb3ZxICQwLCBGTEFHUyglcmRpKQorCW1vdnEgJDAsIENTKCVyZGkpCisJbW92cSAkMCwgU1MoJXJkaSkKKwltb3ZxICQwLCBEUyglcmRpKQorCW1vdnEgJDAsIEVTKCVyZGkpCisJbW92cSAkMCwgRlMoJXJkaSkKKwltb3ZxICQwLCBHUyglcmRpKQorCisJbW92cSAlcjgsICBSOCglcmRpKQorCW1vdnEgJXI5LCAgUjkoJXJkaSkKKwltb3ZxICVyMTAsIFIxMCglcmRpKQorCW1vdnEgJXIxMSwgUjExKCVyZGkpCisJbW92cSAlcjEyLCBSMTIoJXJkaSkKKwltb3ZxICVyMTMsIFIxMyglcmRpKQorCW1vdnEgJXIxNCwgUjE0KCVyZGkpCisJbW92cSAlcjE1LCBSMTUoJXJkaSkKKwlyZXQKK0VORFBST0MocGVyZl9yZWdzX2xvYWQpCisjZWxzZQorRU5UUlkocGVyZl9yZWdzX2xvYWQpCisJcHVzaCAlZWRpCisJbW92bCA4KCVlc3ApLCAlZWRpCisJbW92bCAlZWF4LCBBWCglZWRpKQorCW1vdmwgJWVieCwgQlgoJWVkaSkKKwltb3ZsICVlY3gsIENYKCVlZGkpCisJbW92bCAlZWR4LCBEWCglZWRpKQorCW1vdmwgJWVzaSwgU0koJWVkaSkKKwlwb3AgJWVheAorCW1vdmwgJWVheCwgREkoJWVkaSkKKwltb3ZsICVlYnAsIEJQKCVlZGkpCisKKwlsZWFsIDQoJWVzcCksICVlYXggLyogZXhjbHVkZSB0aGlzIGNhbGwuICAqLworCW1vdmwgJWVheCwgU1AoJWVkaSkKKworCW1vdmwgMCglZXNwKSwgJWVheAorCW1vdmwgJWVheCwgSVAoJWVkaSkKKworCW1vdmwgJDAsIEZMQUdTKCVlZGkpCisJbW92bCAkMCwgQ1MoJWVkaSkKKwltb3ZsICQwLCBTUyglZWRpKQorCW1vdmwgJDAsIERTKCVlZGkpCisJbW92bCAkMCwgRVMoJWVkaSkKKwltb3ZsICQwLCBGUyglZWRpKQorCW1vdmwgJDAsIEdTKCVlZGkpCisJcmV0CitFTkRQUk9DKHBlcmZfcmVnc19sb2FkKQorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYmR3LmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYmR3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNzIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC91bndpbmQtbGliZHcuYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSA8ZWxmdXRpbHMvbGliZHdmbC5oPgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdW53aW5kLWxpYmR3LmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9wZXJmX3JlZ3MuaCIKKworYm9vbCBsaWJkd19fYXJjaF9zZXRfaW5pdGlhbF9yZWdpc3RlcnMoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7CisJc3RydWN0IHJlZ3NfZHVtcCAqdXNlcl9yZWdzID0gJnVpLT5zYW1wbGUtPnVzZXJfcmVnczsKKwlEd2FyZl9Xb3JkIGR3YXJmX3JlZ3NbMTddOworCXVuc2lnbmVkIG5yZWdzOworCisjZGVmaW5lIFJFRyhyKSAoewkJCQkJCVwKKwlEd2FyZl9Xb3JkIHZhbCA9IDA7CQkJCQlcCisJcGVyZl9yZWdfdmFsdWUoJnZhbCwgdXNlcl9yZWdzLCBQRVJGX1JFR19YODZfIyNyKTsJXAorCXZhbDsJCQkJCQkJXAorfSkKKworCWlmICh1c2VyX3JlZ3MtPmFiaSA9PSBQRVJGX1NBTVBMRV9SRUdTX0FCSV8zMikgeworCQlkd2FyZl9yZWdzWzBdID0gUkVHKEFYKTsKKwkJZHdhcmZfcmVnc1sxXSA9IFJFRyhDWCk7CisJCWR3YXJmX3JlZ3NbMl0gPSBSRUcoRFgpOworCQlkd2FyZl9yZWdzWzNdID0gUkVHKEJYKTsKKwkJZHdhcmZfcmVnc1s0XSA9IFJFRyhTUCk7CisJCWR3YXJmX3JlZ3NbNV0gPSBSRUcoQlApOworCQlkd2FyZl9yZWdzWzZdID0gUkVHKFNJKTsKKwkJZHdhcmZfcmVnc1s3XSA9IFJFRyhESSk7CisJCWR3YXJmX3JlZ3NbOF0gPSBSRUcoSVApOworCQlucmVncyA9IDk7CisJfSBlbHNlIHsKKwkJZHdhcmZfcmVnc1swXSAgPSBSRUcoQVgpOworCQlkd2FyZl9yZWdzWzFdICA9IFJFRyhEWCk7CisJCWR3YXJmX3JlZ3NbMl0gID0gUkVHKENYKTsKKwkJZHdhcmZfcmVnc1szXSAgPSBSRUcoQlgpOworCQlkd2FyZl9yZWdzWzRdICA9IFJFRyhTSSk7CisJCWR3YXJmX3JlZ3NbNV0gID0gUkVHKERJKTsKKwkJZHdhcmZfcmVnc1s2XSAgPSBSRUcoQlApOworCQlkd2FyZl9yZWdzWzddICA9IFJFRyhTUCk7CisJCWR3YXJmX3JlZ3NbOF0gID0gUkVHKFI4KTsKKwkJZHdhcmZfcmVnc1s5XSAgPSBSRUcoUjkpOworCQlkd2FyZl9yZWdzWzEwXSA9IFJFRyhSMTApOworCQlkd2FyZl9yZWdzWzExXSA9IFJFRyhSMTEpOworCQlkd2FyZl9yZWdzWzEyXSA9IFJFRyhSMTIpOworCQlkd2FyZl9yZWdzWzEzXSA9IFJFRyhSMTMpOworCQlkd2FyZl9yZWdzWzE0XSA9IFJFRyhSMTQpOworCQlkd2FyZl9yZWdzWzE1XSA9IFJFRyhSMTUpOworCQlkd2FyZl9yZWdzWzE2XSA9IFJFRyhJUCk7CisJCW5yZWdzID0gMTc7CisJfQorCisJcmV0dXJuIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycyh0aHJlYWQsIDAsIG5yZWdzLCBkd2FyZl9yZWdzKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC91bndpbmQtbGlidW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYnVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjFmNjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYnVud2luZC5jCkBAIC0wLDAgKzEsMTExIEBACisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpYnVud2luZC5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdW53aW5kLmgiCisKKyNpZmRlZiBIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQKK2ludCBsaWJ1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pCit7CisJaW50IGlkOworCisJc3dpdGNoIChyZWdudW0pIHsKKwljYXNlIFVOV19YODZfNjRfUkFYOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9BWDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1JEWDoKKwkJaWQgPSBQRVJGX1JFR19YODZfRFg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SQ1g6CisJCWlkID0gUEVSRl9SRUdfWDg2X0NYOworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUkJYOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9CWDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1JTSToKKwkJaWQgPSBQRVJGX1JFR19YODZfU0k7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SREk6CisJCWlkID0gUEVSRl9SRUdfWDg2X0RJOworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUkJQOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9CUDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1JTUDoKKwkJaWQgPSBQRVJGX1JFR19YODZfU1A7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SODoKKwkJaWQgPSBQRVJGX1JFR19YODZfUjg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SOToKKwkJaWQgPSBQRVJGX1JFR19YODZfUjk7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SMTA6CisJCWlkID0gUEVSRl9SRUdfWDg2X1IxMDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1IxMToKKwkJaWQgPSBQRVJGX1JFR19YODZfUjExOworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUjEyOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTI7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SMTM6CisJCWlkID0gUEVSRl9SRUdfWDg2X1IxMzsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1IxNDoKKwkJaWQgPSBQRVJGX1JFR19YODZfUjE0OworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUjE1OgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTU7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SSVA6CisJCWlkID0gUEVSRl9SRUdfWDg2X0lQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVud2luZDogaW52YWxpZCByZWcgaWQgJWRcbiIsIHJlZ251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBpZDsKK30KKyNlbHNlCitpbnQgbGlidW53aW5kX19hcmNoX3JlZ19pZChpbnQgcmVnbnVtKQoreworCWludCBpZDsKKworCXN3aXRjaCAocmVnbnVtKSB7CisJY2FzZSBVTldfWDg2X0VBWDoKKwkJaWQgPSBQRVJGX1JFR19YODZfQVg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl9FRFg6CisJCWlkID0gUEVSRl9SRUdfWDg2X0RYOworCQlicmVhazsKKwljYXNlIFVOV19YODZfRUNYOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9DWDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2X0VCWDoKKwkJaWQgPSBQRVJGX1JFR19YODZfQlg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl9FU0k6CisJCWlkID0gUEVSRl9SRUdfWDg2X1NJOworCQlicmVhazsKKwljYXNlIFVOV19YODZfRURJOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9ESTsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2X0VCUDoKKwkJaWQgPSBQRVJGX1JFR19YODZfQlA7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl9FU1A6CisJCWlkID0gUEVSRl9SRUdfWDg2X1NQOworCQlicmVhazsKKwljYXNlIFVOV19YODZfRUlQOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9JUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ1bndpbmQ6IGludmFsaWQgcmVnIGlkICVkXG4iLCByZWdudW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWQ7Cit9CisjZW5kaWYgLyogSEFWRV9BUkNIX1g4Nl82NF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NmE4OGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL3Vud2luZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGlidW53aW5kLmg+Ci0jaW5jbHVkZSAicGVyZl9yZWdzLmgiCi0jaW5jbHVkZSAiLi4vLi4vdXRpbC91bndpbmQuaCIKLQotI2lmZGVmIEhBVkVfQVJDSF9YODZfNjRfU1VQUE9SVAotaW50IHVud2luZF9fYXJjaF9yZWdfaWQoaW50IHJlZ251bSkKLXsKLQlpbnQgaWQ7Ci0KLQlzd2l0Y2ggKHJlZ251bSkgewotCWNhc2UgVU5XX1g4Nl82NF9SQVg6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0FYOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUkRYOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9EWDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1JDWDoKLQkJaWQgPSBQRVJGX1JFR19YODZfQ1g7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SQlg6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0JYOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUlNJOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9TSTsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1JESToKLQkJaWQgPSBQRVJGX1JFR19YODZfREk7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SQlA6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0JQOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUlNQOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9TUDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1I4OgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SODsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1I5OgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SOTsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1IxMDoKLQkJaWQgPSBQRVJGX1JFR19YODZfUjEwOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUjExOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTE7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SMTI6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X1IxMjsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1IxMzoKLQkJaWQgPSBQRVJGX1JFR19YODZfUjEzOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUjE0OgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTQ7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SMTU6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X1IxNTsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1JJUDoKLQkJaWQgPSBQRVJGX1JFR19YODZfSVA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigidW53aW5kOiBpbnZhbGlkIHJlZyBpZCAlZFxuIiwgcmVnbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGlkOwotfQotI2Vsc2UKLWludCB1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pCi17Ci0JaW50IGlkOwotCi0Jc3dpdGNoIChyZWdudW0pIHsKLQljYXNlIFVOV19YODZfRUFYOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9BWDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2X0VEWDoKLQkJaWQgPSBQRVJGX1JFR19YODZfRFg7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl9FQ1g6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0NYOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfRUJYOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9CWDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2X0VTSToKLQkJaWQgPSBQRVJGX1JFR19YODZfU0k7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl9FREk6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0RJOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfRUJQOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9CUDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2X0VTUDoKLQkJaWQgPSBQRVJGX1JFR19YODZfU1A7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl9FSVA6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0lQOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoInVud2luZDogaW52YWxpZCByZWcgaWQgJWRcbiIsIHJlZ251bSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpZDsKLX0KLSNlbmRpZiAvKiBIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvYmVuY2guaCBiL3Rvb2xzL3BlcmYvYmVuY2gvYmVuY2guaAppbmRleCAwZmRjODUyLi5lYmE0NjcwOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9iZW5jaC5oCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvYmVuY2guaApAQCAtMzEsNiArMzEsOSBAQAogZXh0ZXJuIGludCBiZW5jaF9tZW1fbWVtY3B5KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKIAkJCSAgICBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpOwogZXh0ZXJuIGludCBiZW5jaF9tZW1fbWVtc2V0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgYmVuY2hfZnV0ZXhfaGFzaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGJlbmNoX2Z1dGV4X3dha2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBiZW5jaF9mdXRleF9yZXF1ZXVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKIAogI2RlZmluZSBCRU5DSF9GT1JNQVRfREVGQVVMVF9TVFIJImRlZmF1bHQiCiAjZGVmaW5lIEJFTkNIX0ZPUk1BVF9ERUZBVUxUCQkwCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LWhhc2guYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDIwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LWhhc2guYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgorICoKKyAqIGZ1dGV4LWhhc2g6IFN0cmVzcyB0aGUgaGVsbCBvdXQgb2YgdGhlIExpbnV4IGtlcm5lbCBmdXRleCB1YWRkciBoYXNoaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIGtlcm5lbCdzIGZ1dGV4IGhhc2gKKyAqIHRhYmxlL2Z1bmN0aW9uIGltcGxlbWVudGF0aW9uLiBJbiBvcmRlciBmb3IgaXQgdG8gbWFrZSBzZW5zZSwgdXNlIHdpdGggYXMKKyAqIG1hbnkgdGhyZWFkcyBhbmQgZnV0ZXhlcyBhcyBwb3NzaWJsZS4KKyAqLworCisjaW5jbHVkZSAiLi4vcGVyZi5oIgorI2luY2x1ZGUgIi4uL3V0aWwvdXRpbC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvc3RhdC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgIi4uL3V0aWwvaGVhZGVyLmgiCisjaW5jbHVkZSAiYmVuY2guaCIKKyNpbmNsdWRlICJmdXRleC5oIgorCisjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnRocmVhZHMgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBuc2VjcyAgICA9IDEwOworLyogYW1vdW50IG9mIGZ1dGV4ZXMgcGVyIHRocmVhZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZnV0ZXhlcyA9IDEwMjQ7CitzdGF0aWMgYm9vbCBmc2hhcmVkID0gZmFsc2UsIGRvbmUgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2U7CisKK3N0cnVjdCB0aW1ldmFsIHN0YXJ0LCBlbmQsIHJ1bnRpbWU7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IHRocmVhZF9sb2NrOworc3RhdGljIHVuc2lnbmVkIGludCB0aHJlYWRzX3N0YXJ0aW5nOworc3RhdGljIHN0cnVjdCBzdGF0cyB0aHJvdWdocHV0X3N0YXRzOworc3RhdGljIHB0aHJlYWRfY29uZF90IHRocmVhZF9wYXJlbnQsIHRocmVhZF93b3JrZXI7CisKK3N0cnVjdCB3b3JrZXIgeworCWludCB0aWQ7CisJdV9pbnQzMl90ICpmdXRleDsKKwlwdGhyZWFkX3QgdGhyZWFkOworCXVuc2lnbmVkIGxvbmcgb3BzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9VSU5URUdFUigndCcsICJ0aHJlYWRzIiwgJm50aHJlYWRzLCAiU3BlY2lmeSBhbW91bnQgb2YgdGhyZWFkcyIpLAorCU9QVF9VSU5URUdFUigncicsICJydW50aW1lIiwgJm5zZWNzLCAgICAiU3BlY2lmeSBydW50aW1lIChpbiBzZWNvbmRzKSIpLAorCU9QVF9VSU5URUdFUignZicsICJmdXRleGVzIiwgJm5mdXRleGVzLCAiU3BlY2lmeSBhbW91bnQgb2YgZnV0ZXhlcyBwZXIgdGhyZWFkcyIpLAorCU9QVF9CT09MRUFOKCAncycsICJzaWxlbnQiLCAgJnNpbGVudCwgICAiU2lsZW50IG1vZGU6IGRvIG5vdCBkaXNwbGF5IGRhdGEvZGV0YWlscyIpLAorCU9QVF9CT09MRUFOKCAnUycsICJzaGFyZWQiLCAgJmZzaGFyZWQsICAiVXNlIHNoYXJlZCBmdXRleGVzIGluc3RlYWQgb2YgcHJpdmF0ZSBvbmVzIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlbmNoX2Z1dGV4X2hhc2hfdXNhZ2VbXSA9IHsKKwkicGVyZiBiZW5jaCBmdXRleCBoYXNoIDxvcHRpb25zPiIsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgKndvcmtlcmZuKHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB3b3JrZXIgKncgPSAoc3RydWN0IHdvcmtlciAqKSBhcmc7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl0aHJlYWRzX3N0YXJ0aW5nLS07CisJaWYgKCF0aHJlYWRzX3N0YXJ0aW5nKQorCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3dvcmtlciwgJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgbmZ1dGV4ZXM7IGkrKywgdy0+b3BzKyspIHsKKwkJCS8qCisJCQkgKiBXZSB3YW50IHRoZSBmdXRleCBjYWxscyB0byBmYWlsIGluIG9yZGVyIHRvIHN0cmVzcworCQkJICogdGhlIGhhc2hpbmcgb2YgdWFkZHIgYW5kIG5vdCBtZWFzdXJlIG90aGVyIHN0ZXBzLAorCQkJICogc3VjaCBhcyBpbnRlcm5hbCB3YWl0cXVldWUgaGFuZGxpbmcsIHRodXMgZW5sYXJnaW5nCisJCQkgKiB0aGUgY3JpdGljYWwgcmVnaW9uIHByb3RlY3RlZCBieSBoYi0+bG9jay4KKwkJCSAqLworCQkJcmV0ID0gZnV0ZXhfd2FpdCgmdy0+ZnV0ZXhbaV0sIDEyMzQsIE5VTEwsCisJCQkJCSBmc2hhcmVkID8gMCA6IEZVVEVYX1BSSVZBVEVfRkxBRyk7CisJCQlpZiAoIXNpbGVudCAmJgorCQkJICAgICghcmV0IHx8IGVycm5vICE9IEVBR0FJTiB8fCBlcnJubyAhPSBFV09VTERCTE9DSykpCisJCQkJd2FybigiTm9uLWV4cGVjdGVkIGZ1dGV4IHJldHVybiBjYWxsIik7CisJCX0KKwl9ICB3aGlsZSAoIWRvbmUpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRvZ2dsZV9kb25lKGludCBzaWcgX19tYXliZV91bnVzZWQsCisJCQlzaWdpbmZvX3QgKmluZm8gX19tYXliZV91bnVzZWQsCisJCQl2b2lkICp1YyBfX21heWJlX3VudXNlZCkKK3sKKwkvKiBpbmZvcm0gYWxsIHRocmVhZHMgdGhhdCB3ZSdyZSBkb25lIGZvciB0aGUgZGF5ICovCisJZG9uZSA9IHRydWU7CisJZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOworCXRpbWVyc3ViKCZlbmQsICZzdGFydCwgJnJ1bnRpbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdW1tYXJ5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBhdmcgPSBhdmdfc3RhdHMoJnRocm91Z2hwdXRfc3RhdHMpOworCWRvdWJsZSBzdGRkZXYgPSBzdGRkZXZfc3RhdHMoJnRocm91Z2hwdXRfc3RhdHMpOworCisJcHJpbnRmKCIlc0F2ZXJhZ2VkICVsZCBvcGVyYXRpb25zL3NlYyAoKy0gJS4yZiUlKSwgdG90YWwgc2VjcyA9ICVkXG4iLAorCSAgICAgICAhc2lsZW50ID8gIlxuIiA6ICIiLCBhdmcsIHJlbF9zdGRkZXZfc3RhdHMoc3RkZGV2LCBhdmcpLAorCSAgICAgICAoaW50KSBydW50aW1lLnR2X3NlYyk7Cit9CisKK2ludCBiZW5jaF9mdXRleF9oYXNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJICAgICBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpCit7CisJaW50IHJldCA9IDA7CisJY3B1X3NldF90IGNwdTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKwl1bnNpZ25lZCBpbnQgaSwgbmNwdXM7CisJcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisJc3RydWN0IHdvcmtlciAqd29ya2VyID0gTlVMTDsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGJlbmNoX2Z1dGV4X2hhc2hfdXNhZ2UsIDApOworCWlmIChhcmdjKSB7CisJCXVzYWdlX3dpdGhfb3B0aW9ucyhiZW5jaF9mdXRleF9oYXNoX3VzYWdlLCBvcHRpb25zKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCW5jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisKKwlzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CisJYWN0LnNhX3NpZ2FjdGlvbiA9IHRvZ2dsZV9kb25lOworCXNpZ2FjdGlvbihTSUdJTlQsICZhY3QsIE5VTEwpOworCisJaWYgKCFudGhyZWFkcykgLyogZGVmYXVsdCB0byB0aGUgbnVtYmVyIG9mIENQVXMgKi8KKwkJbnRocmVhZHMgPSBuY3B1czsKKworCXdvcmtlciA9IGNhbGxvYyhudGhyZWFkcywgc2l6ZW9mKCp3b3JrZXIpKTsKKwlpZiAoIXdvcmtlcikKKwkJZ290byBlcnJtZW07CisKKwlwcmludGYoIlJ1biBzdW1tYXJ5IFtQSUQgJWRdOiAlZCB0aHJlYWRzLCBlYWNoIG9wZXJhdGluZyBvbiAlZCBbJXNdIGZ1dGV4ZXMgZm9yICVkIHNlY3MuXG5cbiIsCisJICAgICAgIGdldHBpZCgpLCBudGhyZWFkcywgbmZ1dGV4ZXMsIGZzaGFyZWQgPyAic2hhcmVkIjoicHJpdmF0ZSIsIG5zZWNzKTsKKworCWluaXRfc3RhdHMoJnRocm91Z2hwdXRfc3RhdHMpOworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmdGhyZWFkX2xvY2ssIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZ0aHJlYWRfcGFyZW50LCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmdGhyZWFkX3dvcmtlciwgTlVMTCk7CisKKwl0aHJlYWRzX3N0YXJ0aW5nID0gbnRocmVhZHM7CisJcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKKwlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQl3b3JrZXJbaV0udGlkID0gaTsKKwkJd29ya2VyW2ldLmZ1dGV4ID0gY2FsbG9jKG5mdXRleGVzLCBzaXplb2YoKndvcmtlcltpXS5mdXRleCkpOworCQlpZiAoIXdvcmtlcltpXS5mdXRleCkKKwkJCWdvdG8gZXJybWVtOworCisJCUNQVV9aRVJPKCZjcHUpOworCQlDUFVfU0VUKGkgJSBuY3B1cywgJmNwdSk7CisKKwkJcmV0ID0gcHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wKCZ0aHJlYWRfYXR0ciwgc2l6ZW9mKGNwdV9zZXRfdCksICZjcHUpOworCQlpZiAocmV0KQorCQkJZXJyKEVYSVRfRkFJTFVSRSwgInB0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucCIpOworCisJCXJldCA9IHB0aHJlYWRfY3JlYXRlKCZ3b3JrZXJbaV0udGhyZWFkLCAmdGhyZWFkX2F0dHIsIHdvcmtlcmZuLAorCQkJCSAgICAgKHZvaWQgKikoc3RydWN0IHdvcmtlciAqKSAmd29ya2VyW2ldKTsKKwkJaWYgKHJldCkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2NyZWF0ZSIpOworCisJfQorCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cik7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl3aGlsZSAodGhyZWFkc19zdGFydGluZykKKwkJcHRocmVhZF9jb25kX3dhaXQoJnRocmVhZF9wYXJlbnQsICZ0aHJlYWRfbG9jayk7CisJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmdGhyZWFkX3dvcmtlcik7CisJcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZF9sb2NrKTsKKworCXNsZWVwKG5zZWNzKTsKKwl0b2dnbGVfZG9uZSgwLCBOVUxMLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisJCXJldCA9IHB0aHJlYWRfam9pbih3b3JrZXJbaV0udGhyZWFkLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2pvaW4iKTsKKwl9CisKKwkvKiBjbGVhbnVwICYgcmVwb3J0IHJlc3VsdHMgKi8KKwlwdGhyZWFkX2NvbmRfZGVzdHJveSgmdGhyZWFkX3BhcmVudCk7CisJcHRocmVhZF9jb25kX2Rlc3Ryb3koJnRocmVhZF93b3JrZXIpOworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdGhyZWFkX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB0ID0gd29ya2VyW2ldLm9wcy9ydW50aW1lLnR2X3NlYzsKKwkJdXBkYXRlX3N0YXRzKCZ0aHJvdWdocHV0X3N0YXRzLCB0KTsKKwkJaWYgKCFzaWxlbnQpIHsKKwkJCWlmIChuZnV0ZXhlcyA9PSAxKQorCQkJCXByaW50ZigiW3RocmVhZCAlMmRdIGZ1dGV4OiAlcCBbICVsZCBvcHMvc2VjIF1cbiIsCisJCQkJICAgICAgIHdvcmtlcltpXS50aWQsICZ3b3JrZXJbaV0uZnV0ZXhbMF0sIHQpOworCQkJZWxzZQorCQkJCXByaW50ZigiW3RocmVhZCAlMmRdIGZ1dGV4ZXM6ICVwIC4uLiAlcCBbICVsZCBvcHMvc2VjIF1cbiIsCisJCQkJICAgICAgIHdvcmtlcltpXS50aWQsICZ3b3JrZXJbaV0uZnV0ZXhbMF0sCisJCQkJICAgICAgICZ3b3JrZXJbaV0uZnV0ZXhbbmZ1dGV4ZXMtMV0sIHQpOworCQl9CisKKwkJZnJlZSh3b3JrZXJbaV0uZnV0ZXgpOworCX0KKworCXByaW50X3N1bW1hcnkoKTsKKworCWZyZWUod29ya2VyKTsKKwlyZXR1cm4gcmV0OworZXJybWVtOgorCWVycihFWElUX0ZBSUxVUkUsICJjYWxsb2MiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtcmVxdWV1ZS5jIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC1yZXF1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjU1ODcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXJlcXVldWUuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgorICoKKyAqIGZ1dGV4LXJlcXVldWU6IEJsb2NrIGEgYnVuY2ggb2YgdGhyZWFkcyBvbiBmdXRleDEgYW5kIHJlcXVldWUgdGhlbQorICogICAgICAgICAgICAgICAgb24gZnV0ZXgyLCBOIGF0IGEgdGltZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBtZWFzdXJlIHRoZSBsYXRlbmN5IG9mIG50aHJlYWQKKyAqIHJlcXVldWVzIHdpdGhvdXQgd2FraW5nIHVwIGFueSB0YXNrcyAtLSB0aHVzIG1pbWlja2luZyBhIHJlZ3VsYXIgZnV0ZXhfd2FpdC4KKyAqLworCisjaW5jbHVkZSAiLi4vcGVyZi5oIgorI2luY2x1ZGUgIi4uL3V0aWwvdXRpbC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvc3RhdC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgIi4uL3V0aWwvaGVhZGVyLmgiCisjaW5jbHVkZSAiYmVuY2guaCIKKyNpbmNsdWRlICJmdXRleC5oIgorCisjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3N0YXRpYyB1X2ludDMyX3QgZnV0ZXgxID0gMCwgZnV0ZXgyID0gMDsKKworLyoKKyAqIEhvdyBtYW55IHRhc2tzIHRvIHJlcXVldWUgYXQgYSB0aW1lLgorICogRGVmYXVsdCB0byAxIGluIG9yZGVyIHRvIG1ha2UgdGhlIGtlcm5lbCB3b3JrIG1vcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnJlcXVldWUgPSAxOworCisvKgorICogVGhlcmUgY2FuIGJlIHNpZ25pZmljYW50IHZhcmlhbmNlIGZyb20gcnVuIHRvIHJ1biwKKyAqIHRoZSBtb3JlIHJlcGVhdHMsIHRoZSBtb3JlIGV4YWN0IHRoZSBvdmVyYWxsIGF2ZyBhbmQKKyAqIHRoZSBiZXR0ZXIgaWRlYSBvZiB0aGUgZnV0ZXggbGF0ZW5jeS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZXBlYXQgPSAxMDsKKworc3RhdGljIHB0aHJlYWRfdCAqd29ya2VyOworc3RhdGljIGJvb2wgZG9uZSA9IDAsIHNpbGVudCA9IDA7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IHRocmVhZF9sb2NrOworc3RhdGljIHB0aHJlYWRfY29uZF90IHRocmVhZF9wYXJlbnQsIHRocmVhZF93b3JrZXI7CitzdGF0aWMgc3RydWN0IHN0YXRzIHJlcXVldWV0aW1lX3N0YXRzLCByZXF1ZXVlZF9zdGF0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmNwdXMsIHRocmVhZHNfc3RhcnRpbmcsIG50aHJlYWRzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9VSU5URUdFUigndCcsICJ0aHJlYWRzIiwgICZudGhyZWFkcywgIlNwZWNpZnkgYW1vdW50IG9mIHRocmVhZHMiKSwKKwlPUFRfVUlOVEVHRVIoJ3EnLCAibnJlcXVldWUiLCAmbnJlcXVldWUsICJTcGVjaWZ5IGFtb3VudCBvZiB0aHJlYWRzIHRvIHJlcXVldWUgYXQgb25jZSIpLAorCU9QVF9VSU5URUdFUigncicsICJyZXBlYXQiLCAgICZyZXBlYXQsICAgIlNwZWNpZnkgYW1vdW50IG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcnVuIiksCisJT1BUX0JPT0xFQU4oICdzJywgInNpbGVudCIsICAgJnNpbGVudCwgICAiU2lsZW50IG1vZGU6IGRvIG5vdCBkaXNwbGF5IGRhdGEvZGV0YWlscyIpLAorCU9QVF9FTkQoKQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZW5jaF9mdXRleF9yZXF1ZXVlX3VzYWdlW10gPSB7CisJInBlcmYgYmVuY2ggZnV0ZXggcmVxdWV1ZSA8b3B0aW9ucz4iLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3N1bW1hcnkodm9pZCkKK3sKKwlkb3VibGUgcmVxdWV1ZXRpbWVfYXZnID0gYXZnX3N0YXRzKCZyZXF1ZXVldGltZV9zdGF0cyk7CisJZG91YmxlIHJlcXVldWV0aW1lX3N0ZGRldiA9IHN0ZGRldl9zdGF0cygmcmVxdWV1ZXRpbWVfc3RhdHMpOworCXVuc2lnbmVkIGludCByZXF1ZXVlZF9hdmcgPSBhdmdfc3RhdHMoJnJlcXVldWVkX3N0YXRzKTsKKworCXByaW50ZigiUmVxdWV1ZWQgJWQgb2YgJWQgdGhyZWFkcyBpbiAlLjRmIG1zICgrLSUuMmYlJSlcbiIsCisJICAgICAgIHJlcXVldWVkX2F2ZywKKwkgICAgICAgbnRocmVhZHMsCisJICAgICAgIHJlcXVldWV0aW1lX2F2Zy8xZTMsCisJICAgICAgIHJlbF9zdGRkZXZfc3RhdHMocmVxdWV1ZXRpbWVfc3RkZGV2LCByZXF1ZXVldGltZV9hdmcpKTsKK30KKworc3RhdGljIHZvaWQgKndvcmtlcmZuKHZvaWQgKmFyZyBfX21heWJlX3VudXNlZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl0aHJlYWRzX3N0YXJ0aW5nLS07CisJaWYgKCF0aHJlYWRzX3N0YXJ0aW5nKQorCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3dvcmtlciwgJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJZnV0ZXhfd2FpdCgmZnV0ZXgxLCAwLCBOVUxMLCBGVVRFWF9QUklWQVRFX0ZMQUcpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBibG9ja190aHJlYWRzKHB0aHJlYWRfdCAqdywKKwkJCSAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHIpCit7CisJY3B1X3NldF90IGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXRocmVhZHNfc3RhcnRpbmcgPSBudGhyZWFkczsKKworCS8qIGNyZWF0ZSBhbmQgYmxvY2sgYWxsIHRocmVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQlDUFVfWkVSTygmY3B1KTsKKwkJQ1BVX1NFVChpICUgbmNwdXMsICZjcHUpOworCisJCWlmIChwdGhyZWFkX2F0dHJfc2V0YWZmaW5pdHlfbnAoJnRocmVhZF9hdHRyLCBzaXplb2YoY3B1X3NldF90KSwgJmNwdSkpCisJCQllcnIoRVhJVF9GQUlMVVJFLCAicHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wIik7CisKKwkJaWYgKHB0aHJlYWRfY3JlYXRlKCZ3W2ldLCAmdGhyZWFkX2F0dHIsIHdvcmtlcmZuLCBOVUxMKSkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2NyZWF0ZSIpOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX2RvbmUoaW50IHNpZyBfX21heWJlX3VudXNlZCwKKwkJCXNpZ2luZm9fdCAqaW5mbyBfX21heWJlX3VudXNlZCwKKwkJCXZvaWQgKnVjIF9fbWF5YmVfdW51c2VkKQoreworCWRvbmUgPSB0cnVlOworfQorCitpbnQgYmVuY2hfZnV0ZXhfcmVxdWV1ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQljb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBiZW5jaF9mdXRleF9yZXF1ZXVlX3VzYWdlLCAwKTsKKwlpZiAoYXJnYykKKwkJZ290byBlcnI7CisKKwluY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworCisJc2lnZmlsbHNldCgmYWN0LnNhX21hc2spOworCWFjdC5zYV9zaWdhY3Rpb24gPSB0b2dnbGVfZG9uZTsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCBOVUxMKTsKKworCWlmICghbnRocmVhZHMpCisJCW50aHJlYWRzID0gbmNwdXM7CisKKwl3b3JrZXIgPSBjYWxsb2MobnRocmVhZHMsIHNpemVvZigqd29ya2VyKSk7CisJaWYgKCF3b3JrZXIpCisJCWVycihFWElUX0ZBSUxVUkUsICJjYWxsb2MiKTsKKworCXByaW50ZigiUnVuIHN1bW1hcnkgW1BJRCAlZF06IFJlcXVldWluZyAlZCB0aHJlYWRzIChmcm9tICVwIHRvICVwKSwgIgorCSAgICAgICAiJWQgYXQgYSB0aW1lLlxuXG4iLAorCSAgICAgICBnZXRwaWQoKSwgbnRocmVhZHMsICZmdXRleDEsICZmdXRleDIsIG5yZXF1ZXVlKTsKKworCWluaXRfc3RhdHMoJnJlcXVldWVkX3N0YXRzKTsKKwlpbml0X3N0YXRzKCZyZXF1ZXVldGltZV9zdGF0cyk7CisJcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJnRocmVhZF9sb2NrLCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmdGhyZWFkX3BhcmVudCwgTlVMTCk7CisJcHRocmVhZF9jb25kX2luaXQoJnRocmVhZF93b3JrZXIsIE5VTEwpOworCisJZm9yIChqID0gMDsgaiA8IHJlcGVhdCAmJiAhZG9uZTsgaisrKSB7CisJCXVuc2lnbmVkIGludCBucmVxdWV1ZWQgPSAwOworCQlzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kLCBydW50aW1lOworCisJCS8qIGNyZWF0ZSwgbGF1bmNoICYgYmxvY2sgYWxsIHRocmVhZHMgKi8KKwkJYmxvY2tfdGhyZWFkcyh3b3JrZXIsIHRocmVhZF9hdHRyKTsKKworCQkvKiBtYWtlIHN1cmUgYWxsIHRocmVhZHMgYXJlIGFscmVhZHkgYmxvY2tlZCAqLworCQlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwkJd2hpbGUgKHRocmVhZHNfc3RhcnRpbmcpCisJCQlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3BhcmVudCwgJnRocmVhZF9sb2NrKTsKKwkJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmdGhyZWFkX3dvcmtlcik7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfbG9jayk7CisKKwkJdXNsZWVwKDEwMDAwMCk7CisKKwkJLyogT2ssIGFsbCB0aHJlYWRzIGFyZSBwYXRpZW50bHkgYmxvY2tlZCwgc3RhcnQgcmVxdWV1ZWluZyAqLworCQlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKwkJZm9yIChucmVxdWV1ZWQgPSAwOyBucmVxdWV1ZWQgPCBudGhyZWFkczsgbnJlcXVldWVkICs9IG5yZXF1ZXVlKQorCQkJLyoKKwkJCSAqIERvIG5vdCB3YWtldXAgYW55IHRhc2tzIGJsb2NrZWQgb24gZnV0ZXgxLCBhbGxvd2luZworCQkJICogdXMgdG8gcmVhbGx5IG1lYXN1cmUgZnV0ZXhfd2FpdCBmdW5jdGlvbmFsaXR5LgorCQkJICovCisJCQlmdXRleF9jbXBfcmVxdWV1ZSgmZnV0ZXgxLCAwLCAmZnV0ZXgyLCAwLCBucmVxdWV1ZSwKKwkJCQkJICBGVVRFWF9QUklWQVRFX0ZMQUcpOworCQlnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7CisJCXRpbWVyc3ViKCZlbmQsICZzdGFydCwgJnJ1bnRpbWUpOworCisJCXVwZGF0ZV9zdGF0cygmcmVxdWV1ZWRfc3RhdHMsIG5yZXF1ZXVlZCk7CisJCXVwZGF0ZV9zdGF0cygmcmVxdWV1ZXRpbWVfc3RhdHMsIHJ1bnRpbWUudHZfdXNlYyk7CisKKwkJaWYgKCFzaWxlbnQpIHsKKwkJCXByaW50ZigiW1J1biAlZF06IFJlcXVldWVkICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtc1xuIiwKKwkJCSAgICAgICBqICsgMSwgbnJlcXVldWVkLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjLzFlMyk7CisJCX0KKworCQkvKiBldmVyeWJvZHkgc2hvdWxkIGJlIGJsb2NrZWQgb24gZnV0ZXgyLCB3YWtlJ2VtIHVwICovCisJCW5yZXF1ZXVlZCA9IGZ1dGV4X3dha2UoJmZ1dGV4MiwgbnRocmVhZHMsIEZVVEVYX1BSSVZBVEVfRkxBRyk7CisJCWlmIChudGhyZWFkcyAhPSBucmVxdWV1ZWQpCisJCQl3YXJueCgiY291bGRuJ3Qgd2FrZXVwIGFsbCB0YXNrcyAoJWQvJWQpIiwgbnJlcXVldWVkLCBudGhyZWFkcyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKwkJCXJldCA9IHB0aHJlYWRfam9pbih3b3JrZXJbaV0sIE5VTEwpOworCQkJaWYgKHJldCkKKwkJCQllcnIoRVhJVF9GQUlMVVJFLCAicHRocmVhZF9qb2luIik7CisJCX0KKworCX0KKworCS8qIGNsZWFudXAgJiByZXBvcnQgcmVzdWx0cyAqLworCXB0aHJlYWRfY29uZF9kZXN0cm95KCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfZGVzdHJveSgmdGhyZWFkX3dvcmtlcik7CisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZ0aHJlYWRfbG9jayk7CisJcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZF9hdHRyKTsKKworCXByaW50X3N1bW1hcnkoKTsKKworCWZyZWUod29ya2VyKTsKKwlyZXR1cm4gcmV0OworZXJyOgorCXVzYWdlX3dpdGhfb3B0aW9ucyhiZW5jaF9mdXRleF9yZXF1ZXVlX3VzYWdlLCBvcHRpb25zKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTYxNjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgorICoKKyAqIGZ1dGV4LXdha2U6IEJsb2NrIGEgYnVuY2ggb2YgdGhyZWFkcyBvbiBhIGZ1dGV4IGFuZCB3YWtlJ2VtIHVwLCBOIGF0IGEgdGltZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBtZWFzdXJlIHRoZSBsYXRlbmN5IG9mIG50aHJlYWQgd2FrZXVwcworICogaW4gbm9uLWVycm9yIHNpdHVhdGlvbnM6ICBhbGwgd2FpdGVycyBhcmUgcXVldWVkIGFuZCBhbGwgd2FrZSBjYWxscyB3YWtldXAKKyAqIG9uZSBvciBtb3JlIHRhc2tzLCBhbmQgdGh1cyB0aGUgd2FpdHF1ZXVlIGlzIG5ldmVyIGVtcHR5LgorICovCisKKyNpbmNsdWRlICIuLi9wZXJmLmgiCisjaW5jbHVkZSAiLi4vdXRpbC91dGlsLmgiCisjaW5jbHVkZSAiLi4vdXRpbC9zdGF0LmgiCisjaW5jbHVkZSAiLi4vdXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAiLi4vdXRpbC9oZWFkZXIuaCIKKyNpbmNsdWRlICJiZW5jaC5oIgorI2luY2x1ZGUgImZ1dGV4LmgiCisKKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLyogYWxsIHRocmVhZHMgd2lsbCBibG9jayBvbiB0aGUgc2FtZSBmdXRleCAqLworc3RhdGljIHVfaW50MzJfdCBmdXRleDEgPSAwOworCisvKgorICogSG93IG1hbnkgd2FrZXVwcyB0byBkbyBhdCBhIHRpbWUuCisgKiBEZWZhdWx0IHRvIDEgaW4gb3JkZXIgdG8gbWFrZSB0aGUga2VybmVsIHdvcmsgbW9yZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBud2FrZXMgPSAxOworCisvKgorICogVGhlcmUgY2FuIGJlIHNpZ25pZmljYW50IHZhcmlhbmNlIGZyb20gcnVuIHRvIHJ1biwKKyAqIHRoZSBtb3JlIHJlcGVhdHMsIHRoZSBtb3JlIGV4YWN0IHRoZSBvdmVyYWxsIGF2ZyBhbmQKKyAqIHRoZSBiZXR0ZXIgaWRlYSBvZiB0aGUgZnV0ZXggbGF0ZW5jeS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZXBlYXQgPSAxMDsKKworcHRocmVhZF90ICp3b3JrZXI7CitzdGF0aWMgYm9vbCBkb25lID0gMCwgc2lsZW50ID0gMDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgdGhyZWFkX2xvY2s7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgdGhyZWFkX3BhcmVudCwgdGhyZWFkX3dvcmtlcjsKK3N0YXRpYyBzdHJ1Y3Qgc3RhdHMgd2FrZXRpbWVfc3RhdHMsIHdha2V1cF9zdGF0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmNwdXMsIHRocmVhZHNfc3RhcnRpbmcsIG50aHJlYWRzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9VSU5URUdFUigndCcsICJ0aHJlYWRzIiwgJm50aHJlYWRzLCAiU3BlY2lmeSBhbW91bnQgb2YgdGhyZWFkcyIpLAorCU9QVF9VSU5URUdFUigndycsICJud2FrZXMiLCAgJm53YWtlcywgICAiU3BlY2lmeSBhbW91bnQgb2YgdGhyZWFkcyB0byB3YWtlIGF0IG9uY2UiKSwKKwlPUFRfVUlOVEVHRVIoJ3InLCAicmVwZWF0IiwgICZyZXBlYXQsICAgIlNwZWNpZnkgYW1vdW50IG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcnVuIiksCisJT1BUX0JPT0xFQU4oICdzJywgInNpbGVudCIsICAmc2lsZW50LCAgICJTaWxlbnQgbW9kZTogZG8gbm90IGRpc3BsYXkgZGF0YS9kZXRhaWxzIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlbmNoX2Z1dGV4X3dha2VfdXNhZ2VbXSA9IHsKKwkicGVyZiBiZW5jaCBmdXRleCB3YWtlIDxvcHRpb25zPiIsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgKndvcmtlcmZuKHZvaWQgKmFyZyBfX21heWJlX3VudXNlZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl0aHJlYWRzX3N0YXJ0aW5nLS07CisJaWYgKCF0aHJlYWRzX3N0YXJ0aW5nKQorCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3dvcmtlciwgJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJZnV0ZXhfd2FpdCgmZnV0ZXgxLCAwLCBOVUxMLCBGVVRFWF9QUklWQVRFX0ZMQUcpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdW1tYXJ5KHZvaWQpCit7CisJZG91YmxlIHdha2V0aW1lX2F2ZyA9IGF2Z19zdGF0cygmd2FrZXRpbWVfc3RhdHMpOworCWRvdWJsZSB3YWtldGltZV9zdGRkZXYgPSBzdGRkZXZfc3RhdHMoJndha2V0aW1lX3N0YXRzKTsKKwl1bnNpZ25lZCBpbnQgd2FrZXVwX2F2ZyA9IGF2Z19zdGF0cygmd2FrZXVwX3N0YXRzKTsKKworCXByaW50ZigiV29rZXVwICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtcyAoKy0lLjJmJSUpXG4iLAorCSAgICAgICB3YWtldXBfYXZnLAorCSAgICAgICBudGhyZWFkcywKKwkgICAgICAgd2FrZXRpbWVfYXZnLzFlMywKKwkgICAgICAgcmVsX3N0ZGRldl9zdGF0cyh3YWtldGltZV9zdGRkZXYsIHdha2V0aW1lX2F2ZykpOworfQorCitzdGF0aWMgdm9pZCBibG9ja190aHJlYWRzKHB0aHJlYWRfdCAqdywKKwkJCSAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHIpCit7CisJY3B1X3NldF90IGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXRocmVhZHNfc3RhcnRpbmcgPSBudGhyZWFkczsKKworCS8qIGNyZWF0ZSBhbmQgYmxvY2sgYWxsIHRocmVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQlDUFVfWkVSTygmY3B1KTsKKwkJQ1BVX1NFVChpICUgbmNwdXMsICZjcHUpOworCisJCWlmIChwdGhyZWFkX2F0dHJfc2V0YWZmaW5pdHlfbnAoJnRocmVhZF9hdHRyLCBzaXplb2YoY3B1X3NldF90KSwgJmNwdSkpCisJCQllcnIoRVhJVF9GQUlMVVJFLCAicHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wIik7CisKKwkJaWYgKHB0aHJlYWRfY3JlYXRlKCZ3W2ldLCAmdGhyZWFkX2F0dHIsIHdvcmtlcmZuLCBOVUxMKSkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2NyZWF0ZSIpOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX2RvbmUoaW50IHNpZyBfX21heWJlX3VudXNlZCwKKwkJCXNpZ2luZm9fdCAqaW5mbyBfX21heWJlX3VudXNlZCwKKwkJCXZvaWQgKnVjIF9fbWF5YmVfdW51c2VkKQoreworCWRvbmUgPSB0cnVlOworfQorCitpbnQgYmVuY2hfZnV0ZXhfd2FrZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCSAgICAgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCXB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgYmVuY2hfZnV0ZXhfd2FrZV91c2FnZSwgMCk7CisJaWYgKGFyZ2MpIHsKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGJlbmNoX2Z1dGV4X3dha2VfdXNhZ2UsIG9wdGlvbnMpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJbmNwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKworCXNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKwlhY3Quc2Ffc2lnYWN0aW9uID0gdG9nZ2xlX2RvbmU7CisJc2lnYWN0aW9uKFNJR0lOVCwgJmFjdCwgTlVMTCk7CisKKwlpZiAoIW50aHJlYWRzKQorCQludGhyZWFkcyA9IG5jcHVzOworCisJd29ya2VyID0gY2FsbG9jKG50aHJlYWRzLCBzaXplb2YoKndvcmtlcikpOworCWlmICghd29ya2VyKQorCQllcnIoRVhJVF9GQUlMVVJFLCAiY2FsbG9jIik7CisKKwlwcmludGYoIlJ1biBzdW1tYXJ5IFtQSUQgJWRdOiBibG9ja2luZyBvbiAlZCB0aHJlYWRzIChhdCBmdXRleCAlcCksICIKKwkgICAgICAgIndha2luZyB1cCAlZCBhdCBhIHRpbWUuXG5cbiIsCisJICAgICAgIGdldHBpZCgpLCBudGhyZWFkcywgJmZ1dGV4MSwgbndha2VzKTsKKworCWluaXRfc3RhdHMoJndha2V1cF9zdGF0cyk7CisJaW5pdF9zdGF0cygmd2FrZXRpbWVfc3RhdHMpOworCXB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cik7CisJcHRocmVhZF9tdXRleF9pbml0KCZ0aHJlYWRfbG9jaywgTlVMTCk7CisJcHRocmVhZF9jb25kX2luaXQoJnRocmVhZF9wYXJlbnQsIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZ0aHJlYWRfd29ya2VyLCBOVUxMKTsKKworCWZvciAoaiA9IDA7IGogPCByZXBlYXQgJiYgIWRvbmU7IGorKykgeworCQl1bnNpZ25lZCBpbnQgbndva2VuID0gMDsKKwkJc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZCwgcnVudGltZTsKKworCQkvKiBjcmVhdGUsIGxhdW5jaCAmIGJsb2NrIGFsbCB0aHJlYWRzICovCisJCWJsb2NrX3RocmVhZHMod29ya2VyLCB0aHJlYWRfYXR0cik7CisKKwkJLyogbWFrZSBzdXJlIGFsbCB0aHJlYWRzIGFyZSBhbHJlYWR5IGJsb2NrZWQgKi8KKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWRfbG9jayk7CisJCXdoaWxlICh0aHJlYWRzX3N0YXJ0aW5nKQorCQkJcHRocmVhZF9jb25kX3dhaXQoJnRocmVhZF9wYXJlbnQsICZ0aHJlYWRfbG9jayk7CisJCXB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnRocmVhZF93b3JrZXIpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJCXVzbGVlcCgxMDAwMDApOworCisJCS8qIE9rLCBhbGwgdGhyZWFkcyBhcmUgcGF0aWVudGx5IGJsb2NrZWQsIHN0YXJ0IHdha2luZyBmb2xrcyB1cCAqLworCQlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKwkJd2hpbGUgKG53b2tlbiAhPSBudGhyZWFkcykKKwkJCW53b2tlbiArPSBmdXRleF93YWtlKCZmdXRleDEsIG53YWtlcywgRlVURVhfUFJJVkFURV9GTEFHKTsKKwkJZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOworCQl0aW1lcnN1YigmZW5kLCAmc3RhcnQsICZydW50aW1lKTsKKworCQl1cGRhdGVfc3RhdHMoJndha2V1cF9zdGF0cywgbndva2VuKTsKKwkJdXBkYXRlX3N0YXRzKCZ3YWtldGltZV9zdGF0cywgcnVudGltZS50dl91c2VjKTsKKworCQlpZiAoIXNpbGVudCkgeworCQkJcHJpbnRmKCJbUnVuICVkXTogV29rZXVwICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtc1xuIiwKKwkJCSAgICAgICBqICsgMSwgbndva2VuLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjLzFlMyk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQkJcmV0ID0gcHRocmVhZF9qb2luKHdvcmtlcltpXSwgTlVMTCk7CisJCQlpZiAocmV0KQorCQkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2pvaW4iKTsKKwkJfQorCisJfQorCisJLyogY2xlYW51cCAmIHJlcG9ydCByZXN1bHRzICovCisJcHRocmVhZF9jb25kX2Rlc3Ryb3koJnRocmVhZF9wYXJlbnQpOworCXB0aHJlYWRfY29uZF9kZXN0cm95KCZ0aHJlYWRfd29ya2VyKTsKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHIpOworCisJcHJpbnRfc3VtbWFyeSgpOworCisJZnJlZSh3b3JrZXIpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LmggYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmMjg0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXguaApAQCAtMCwwICsxLDcxIEBACisvKgorICogR2xpYmMgaW5kZXBlbmRlbnQgZnV0ZXggbGlicmFyeSBmb3IgdGVzdGluZyBrZXJuZWwgZnVuY3Rpb25hbGl0eS4KKyAqIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIERhcnJlbiBIYXJ0IDxkdmhsdGNAdXMuaWJtLmNvbT4KKyAqICAgIGh0dHA6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvZHZoYXJ0L2Z1dGV4dGVzdC5naXQvCisgKi8KKworI2lmbmRlZiBfRlVURVhfSAorI2RlZmluZSBfRlVURVhfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorCisvKioKKyAqIGZ1dGV4KCkgLSBTWVNfZnV0ZXggc3lzY2FsbCB3cmFwcGVyCisgKiBAdWFkZHI6CWFkZHJlc3Mgb2YgZmlyc3QgZnV0ZXgKKyAqIEBvcDoJCWZ1dGV4IG9wIGNvZGUKKyAqIEB2YWw6CXR5cGljYWxseSBleHBlY3RlZCB2YWx1ZSBvZiB1YWRkciwgYnV0IHZhcmllcyBieSBvcAorICogQHRpbWVvdXQ6CXR5cGljYWxseSBhbiBhYnNvbHV0ZSBzdHJ1Y3QgdGltZXNwZWMgKGV4Y2VwdCB3aGVyZSBub3RlZAorICoJCW90aGVyd2lzZSkuIE92ZXJsb2FkZWQgYnkgc29tZSBvcHMKKyAqIEB1YWRkcjI6CWFkZHJlc3Mgb2Ygc2Vjb25kIGZ1dGV4IGZvciBzb21lIG9wc1wKKyAqIEB2YWwzOgl2YXJpZXMgYnkgb3AKKyAqIEBvcGZsYWdzOglmbGFncyB0byBiZSBiaXR3aXNlIE9SJ2Qgd2l0aCBvcCwgc3VjaCBhcyBGVVRFWF9QUklWQVRFX0ZMQUcKKyAqCisgKiBmdXRleCgpIGlzIHVzZWQgYnkgYWxsIHRoZSBmb2xsb3dpbmcgZnV0ZXggb3Agd3JhcHBlcnMuIEl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIGZvciBtaXN1c2UgYW5kIGFidXNlIHRlc3RpbmcuIEdlbmVyYWxseSwgdGhlIHNwZWNpZmljIG9wIHdyYXBwZXJzCisgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiBJdCBpcyBhIG1hY3JvIGluc3RlYWQgb2YgYW4gc3RhdGljIGlubGluZSBmdW5jdGlvbiBhcworICogc29tZSBvZiB0aGUgdHlwZXMgb3ZlciBvdmVybG9hZGVkICh0aW1lb3V0IGlzIHVzZWQgZm9yIG5yX3JlcXVldWUgZm9yCisgKiBleGFtcGxlKS4KKyAqCisgKiBUaGVzZSBhcmd1bWVudCBkZXNjcmlwdGlvbnMgYXJlIHRoZSBkZWZhdWx0cyBmb3IgYWxsCisgKiBsaWtlLW5hbWVkIGFyZ3VtZW50cyBpbiB0aGUgZm9sbG93aW5nIHdyYXBwZXJzIGV4Y2VwdCB3aGVyZSBub3RlZCBiZWxvdy4KKyAqLworI2RlZmluZSBmdXRleCh1YWRkciwgb3AsIHZhbCwgdGltZW91dCwgdWFkZHIyLCB2YWwzLCBvcGZsYWdzKSBcCisJc3lzY2FsbChTWVNfZnV0ZXgsIHVhZGRyLCBvcCB8IG9wZmxhZ3MsIHZhbCwgdGltZW91dCwgdWFkZHIyLCB2YWwzKQorCisvKioKKyAqIGZ1dGV4X3dhaXQoKSAtIGJsb2NrIG9uIHVhZGRyIHdpdGggb3B0aW9uYWwgdGltZW91dAorICogQHRpbWVvdXQ6CXJlbGF0aXZlIHRpbWVvdXQKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X3dhaXQodV9pbnQzMl90ICp1YWRkciwgdV9pbnQzMl90IHZhbCwgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0LCBpbnQgb3BmbGFncykKK3sKKwlyZXR1cm4gZnV0ZXgodWFkZHIsIEZVVEVYX1dBSVQsIHZhbCwgdGltZW91dCwgTlVMTCwgMCwgb3BmbGFncyk7Cit9CisKKy8qKgorICogZnV0ZXhfd2FrZSgpIC0gd2FrZSBvbmUgb3IgbW9yZSB0YXNrcyBibG9ja2VkIG9uIHVhZGRyCisgKiBAbnJfd2FrZToJd2FrZSB1cCB0byB0aGlzIG1hbnkgdGFza3MKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X3dha2UodV9pbnQzMl90ICp1YWRkciwgaW50IG5yX3dha2UsIGludCBvcGZsYWdzKQoreworCXJldHVybiBmdXRleCh1YWRkciwgRlVURVhfV0FLRSwgbnJfd2FrZSwgTlVMTCwgTlVMTCwgMCwgb3BmbGFncyk7Cit9CisKKy8qKgorKiBmdXRleF9jbXBfcmVxdWV1ZSgpIC0gcmVxdWV1ZSB0YXNrcyBmcm9tIHVhZGRyIHRvIHVhZGRyMgorKiBAbnJfd2FrZTogICAgICAgIHdha2UgdXAgdG8gdGhpcyBtYW55IHRhc2tzCisqIEBucl9yZXF1ZXVlOiAgICAgICAgcmVxdWV1ZSB1cCB0byB0aGlzIG1hbnkgdGFza3MKKyovCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfY21wX3JlcXVldWUodV9pbnQzMl90ICp1YWRkciwgdV9pbnQzMl90IHZhbCwgdV9pbnQzMl90ICp1YWRkcjIsIGludCBucl93YWtlLAorCQkgaW50IG5yX3JlcXVldWUsIGludCBvcGZsYWdzKQoreworCXJldHVybiBmdXRleCh1YWRkciwgRlVURVhfQ01QX1JFUVVFVUUsIG5yX3dha2UsIG5yX3JlcXVldWUsIHVhZGRyMiwKKwkJIHZhbCwgb3BmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBfRlVURVhfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9udW1hLmMgYi90b29scy9wZXJmL2JlbmNoL251bWEuYwppbmRleCBkNGM4M2M2Li45N2Q4NmQ4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL251bWEuYworKysgYi90b29scy9wZXJmL2JlbmNoL251bWEuYwpAQCAtMTU5Myw2ICsxNTkzLDcgQEAKIAlwLT5kYXRhX3JhbmRfd2FsawkJPSB0cnVlOwogCXAtPm5yX2xvb3BzCQkJPSAtMTsKIAlwLT5pbml0X3JhbmRvbQkJCT0gdHJ1ZTsKKwlwLT5ydW5fYWxsCQkJPSBhcmdjID09IDE7CiB9CiAKIHN0YXRpYyBpbnQgcnVuX2JlbmNoX251bWEoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmFyZ3YpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYmVuY2guYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1iZW5jaC5jCmluZGV4IGU0N2Y5MGMuLjFlNmU3NzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1iZW5jaC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1iZW5jaC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiAgc2NoZWQgLi4uIHNjaGVkdWxlciBhbmQgSVBDIHBlcmZvcm1hbmNlCiAgKiAgbWVtICAgLi4uIG1lbW9yeSBhY2Nlc3MgcGVyZm9ybWFuY2UKICAqICBudW1hICAuLi4gTlVNQSBzY2hlZHVsaW5nIGFuZCBNTSBwZXJmb3JtYW5jZQorICogIGZ1dGV4IC4uLiBGdXRleCBwZXJmb3JtYW5jZQogICovCiAjaW5jbHVkZSAicGVyZi5oIgogI2luY2x1ZGUgInV0aWwvdXRpbC5oIgpAQCAtNTQsNiArNTUsMTQgQEAKIAl7IE5VTEwsCQlOVUxMLAkJCQkJCU5VTEwJCQl9CiB9OwogCitzdGF0aWMgc3RydWN0IGJlbmNoIGZ1dGV4X2JlbmNobWFya3NbXSA9IHsKKwl7ICJoYXNoIiwJIkJlbmNobWFyayBmb3IgZnV0ZXggaGFzaCB0YWJsZSIsICAgICAgICAgICAgICAgYmVuY2hfZnV0ZXhfaGFzaAl9LAorCXsgIndha2UiLAkiQmVuY2htYXJrIGZvciBmdXRleCB3YWtlIGNhbGxzIiwgICAgICAgICAgICAgICBiZW5jaF9mdXRleF93YWtlCX0sCisJeyAicmVxdWV1ZSIsCSJCZW5jaG1hcmsgZm9yIGZ1dGV4IHJlcXVldWUgY2FsbHMiLCAgICAgICAgICAgIGJlbmNoX2Z1dGV4X3JlcXVldWUJfSwKKwl7ICJhbGwiLAkiVGVzdCBhbGwgZnV0ZXggYmVuY2htYXJrcyIsCQkJTlVMTAkJCX0sCisJeyBOVUxMLAkJTlVMTCwJCQkJCQlOVUxMCQkJfQorfTsKKwogc3RydWN0IGNvbGxlY3Rpb24gewogCWNvbnN0IGNoYXIJKm5hbWU7CiAJY29uc3QgY2hhcgkqc3VtbWFyeTsKQEAgLTYxLDExICs3MCwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjb2xsZWN0aW9uIGNvbGxlY3Rpb25zW10gPSB7Ci0JeyAic2NoZWQiLAkiU2NoZWR1bGVyIGFuZCBJUEMgYmVuY2htYXJrcyIsCQlzY2hlZF9iZW5jaG1hcmtzCX0sCisJeyAic2NoZWQiLAkiU2NoZWR1bGVyIGFuZCBJUEMgYmVuY2htYXJrcyIsCQkJc2NoZWRfYmVuY2htYXJrcwl9LAogCXsgIm1lbSIsCSJNZW1vcnkgYWNjZXNzIGJlbmNobWFya3MiLAkJCW1lbV9iZW5jaG1hcmtzCQl9LAogI2lmZGVmIEhBVkVfTElCTlVNQV9TVVBQT1JUCiAJeyAibnVtYSIsCSJOVU1BIHNjaGVkdWxpbmcgYW5kIE1NIGJlbmNobWFya3MiLAkJbnVtYV9iZW5jaG1hcmtzCQl9LAogI2VuZGlmCisJeyJmdXRleCIsICAgICAgICJGdXRleCBzdHJlc3NpbmcgYmVuY2htYXJrcyIsICAgICAgICAgICAgICAgICAgIGZ1dGV4X2JlbmNobWFya3MgICAgICAgIH0sCiAJeyAiYWxsIiwJIkFsbCBiZW5jaG1hcmtzIiwJCQkJTlVMTAkJCX0sCiAJeyBOVUxMLAkJTlVMTCwJCQkJCQlOVUxMCQkJfQogfTsKQEAgLTc2LDcgKzg2LDcgQEAKIAogLyogSXRlcmF0ZSBvdmVyIGFsbCBiZW5jaG1hcmtzIHdpdGhpbiBhIGNvbGxlY3Rpb246ICovCiAjZGVmaW5lIGZvcl9lYWNoX2JlbmNoKGNvbGwsIGJlbmNoKSBcCi0JZm9yIChiZW5jaCA9IGNvbGwtPmJlbmNobWFya3M7IGJlbmNoLT5uYW1lOyBiZW5jaCsrKQorCWZvciAoYmVuY2ggPSBjb2xsLT5iZW5jaG1hcmtzOyBiZW5jaCAmJiBiZW5jaC0+bmFtZTsgYmVuY2grKykKIAogc3RhdGljIHZvaWQgZHVtcF9iZW5jaG1hcmtzKHN0cnVjdCBjb2xsZWN0aW9uICpjb2xsKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKaW5kZXggYTc3ZTMxMi4uMjA0ZmZmZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCkBAIC05NTIsOCArOTUyLDggQEAKIAkJCQkgZGZtdC0+aGVhZGVyX3dpZHRoLCBidWYpOwogfQogCi1zdGF0aWMgaW50IGhwcF9faGVhZGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwKLQkJICAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwKQorc3RhdGljIGludCBocHBfX2hlYWRlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkgICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBkaWZmX2hwcF9mbXQgKmRmbXQgPQogCQljb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgZGlmZl9ocHBfZm10LCBmbXQpOwpAQCAtOTYzLDcgKzk2Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgaHBwX193aWR0aChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsCi0JCSAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwIF9fbWF5YmVfdW51c2VkKQorCQkgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCBfX21heWJlX3VudXNlZCwKKwkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBkaWZmX2hwcF9mbXQgKmRmbXQgPQogCQljb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgZGlmZl9ocHBfZm10LCBmbXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCmluZGV4IGIzNDY2MDEuLjNhNzM4NzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKQEAgLTMxMiw3ICszMTIsNiBAQAogCXNhbXBsZV9zdy5wZXJpb2QgPSBzYW1wbGUtPnBlcmlvZDsKIAlzYW1wbGVfc3cudGltZQkgPSBzYW1wbGUtPnRpbWU7CiAJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnRfc3csIGV2c2VsLT5hdHRyLnNhbXBsZV90eXBlLAotCQkJCSAgICAgIGV2c2VsLT5hdHRyLnNhbXBsZV9yZWdzX3VzZXIsCiAJCQkJICAgICAgZXZzZWwtPmF0dHIucmVhZF9mb3JtYXQsICZzYW1wbGVfc3csCiAJCQkJICAgICAgZmFsc2UpOwogCWJ1aWxkX2lkX19tYXJrX2Rzb19oaXQodG9vbCwgZXZlbnRfc3csICZzYW1wbGVfc3csIGV2c2VsLCBtYWNoaW5lKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYwppbmRleCBhNzM1MDUxLi4yMWMxNjRiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCkBAIC0xNjkxLDE3ICsxNjkxLDE1IEBACiAJCU9QVF9FTkQoKQogCX07CiAKLQotCWNvbnN0IGNoYXIgKiBjb25zdCBrdm1fdXNhZ2VbXSA9IHsKLQkJInBlcmYga3ZtIFs8b3B0aW9ucz5dIHt0b3B8cmVjb3JkfHJlcG9ydHxkaWZmfGJ1aWxkaWQtbGlzdHxzdGF0fSIsCi0JCU5VTEwKLQl9OworCWNvbnN0IGNoYXIgKmNvbnN0IGt2bV9zdWJjb21tYW5kc1tdID0geyAidG9wIiwgInJlY29yZCIsICJyZXBvcnQiLCAiZGlmZiIsCisJCQkJCQkiYnVpbGRpZC1saXN0IiwgInN0YXQiLCBOVUxMIH07CisJY29uc3QgY2hhciAqa3ZtX3VzYWdlW10gPSB7IE5VTEwsIE5VTEwgfTsKIAogCXBlcmZfaG9zdCAgPSAwOwogCXBlcmZfZ3Vlc3QgPSAxOwogCi0JYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwga3ZtX29wdGlvbnMsIGt2bV91c2FnZSwKLQkJCVBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOworCWFyZ2MgPSBwYXJzZV9vcHRpb25zX3N1YmNvbW1hbmQoYXJnYywgYXJndiwga3ZtX29wdGlvbnMsIGt2bV9zdWJjb21tYW5kcywga3ZtX3VzYWdlLAorCQkJCQlQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKIAlpZiAoIWFyZ2MpCiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhrdm1fdXNhZ2UsIGt2bV9vcHRpb25zKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwppbmRleCA3ODk0ODg4Li5jZGNkNGViIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwpAQCAtMjY4LDkgKzI2OCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfcGFyYW1zKHZvaWQpCitzdGF0aWMgaW50IGluaXRfcGFyYW1zKHZvaWQpCiB7Ci0JbGluZV9yYW5nZV9faW5pdCgmcGFyYW1zLmxpbmVfcmFuZ2UpOworCXJldHVybiBsaW5lX3JhbmdlX19pbml0KCZwYXJhbXMubGluZV9yYW5nZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFudXBfcGFyYW1zKHZvaWQpCkBAIC01MTUsOSArNTE1LDExIEBACiB7CiAJaW50IHJldDsKIAotCWluaXRfcGFyYW1zKCk7Ci0JcmV0ID0gX19jbWRfcHJvYmUoYXJnYywgYXJndiwgcHJlZml4KTsKLQljbGVhbnVwX3BhcmFtcygpOworCXJldCA9IGluaXRfcGFyYW1zKCk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gX19jbWRfcHJvYmUoYXJnYywgYXJndiwgcHJlZml4KTsKKwkJY2xlYW51cF9wYXJhbXMoKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IGFmNDc1MzEuLmViNTI0ZjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTY0OSw3ICs2NDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAogc3RhdGljIGludCBnZXRfc3RhY2tfc2l6ZShjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgKl9zaXplKQogewogCWNoYXIgKmVuZHB0cjsKQEAgLTY3NSw3ICs2NzUsNyBAQAogCSAgICAgICBtYXhfc2l6ZSwgc3RyKTsKIAlyZXR1cm4gLTE7CiB9Ci0jZW5kaWYgLyogSEFWRV9MSUJVTldJTkRfU1VQUE9SVCAqLworI2VuZGlmIC8qIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQgKi8KIAogaW50IHJlY29yZF9wYXJzZV9jYWxsY2hhaW4oY29uc3QgY2hhciAqYXJnLCBzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMpCiB7CkBAIC03MDQsNyArNzA0LDcgQEAKIAkJCQkgICAgICAgIm5lZWRlZCBmb3IgLWcgZnBcbiIpOwogCQkJYnJlYWs7CiAKLSNpZmRlZiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAogCQkvKiBEd2FyZiBzdHlsZSAqLwogCQl9IGVsc2UgaWYgKCFzdHJuY21wKG5hbWUsICJkd2FyZiIsIHNpemVvZigiZHdhcmYiKSkpIHsKIAkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zdGFja19kdW1wX3NpemUgPSA4MTkyOwpAQCAtNzIwLDcgKzcyMCw3IEBACiAJCQkJcmV0ID0gZ2V0X3N0YWNrX3NpemUodG9rLCAmc2l6ZSk7CiAJCQkJb3B0cy0+c3RhY2tfZHVtcF9zaXplID0gc2l6ZTsKIAkJCX0KLSNlbmRpZiAvKiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUICovCisjZW5kaWYgLyogSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVCAqLwogCQl9IGVsc2UgewogCQkJcHJfZXJyKCJjYWxsY2hhaW46IFVua25vd24gLS1jYWxsLWdyYXBoIG9wdGlvbiAiCiAJCQkgICAgICAgInZhbHVlOiAlc1xuIiwgYXJnKTsKQEAgLTczNSw3ICs3MzUsOSBAQAogCiBzdGF0aWMgdm9pZCBjYWxsY2hhaW5fZGVidWcoc3RydWN0IHJlY29yZF9vcHRzICpvcHRzKQogewotCXByX2RlYnVnKCJjYWxsY2hhaW46IHR5cGUgJWRcbiIsIG9wdHMtPmNhbGxfZ3JhcGgpOworCXN0YXRpYyBjb25zdCBjaGFyICpzdHJbQ0FMTENIQUlOX01BWF0gPSB7ICJOT05FIiwgIkZQIiwgIkRXQVJGIiB9OworCisJcHJfZGVidWcoImNhbGxjaGFpbjogdHlwZSAlc1xuIiwgc3RyW29wdHMtPmNhbGxfZ3JhcGhdKTsKIAogCWlmIChvcHRzLT5jYWxsX2dyYXBoID09IENBTExDSEFJTl9EV0FSRikKIAkJcHJfZGVidWcoImNhbGxjaGFpbjogc3RhY2sgZHVtcCBzaXplICVkXG4iLApAQCAtNzQ5LDYgKzc1MSw4IEBACiAJc3RydWN0IHJlY29yZF9vcHRzICpvcHRzID0gb3B0LT52YWx1ZTsKIAlpbnQgcmV0OwogCisJb3B0cy0+Y2FsbF9ncmFwaF9lbmFibGVkID0gIXVuc2V0OworCiAJLyogLS1uby1jYWxsLWdyYXBoICovCiAJaWYgKHVuc2V0KSB7CiAJCW9wdHMtPmNhbGxfZ3JhcGggPSBDQUxMQ0hBSU5fTk9ORTsKQEAgLTc2OSw2ICs3NzMsOCBAQAogewogCXN0cnVjdCByZWNvcmRfb3B0cyAqb3B0cyA9IG9wdC0+dmFsdWU7CiAKKwlvcHRzLT5jYWxsX2dyYXBoX2VuYWJsZWQgPSAhdW5zZXQ7CisKIAlpZiAob3B0cy0+Y2FsbF9ncmFwaCA9PSBDQUxMQ0hBSU5fTk9ORSkKIAkJb3B0cy0+Y2FsbF9ncmFwaCA9IENBTExDSEFJTl9GUDsKIApAQCAtNzc2LDYgKzc4MiwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBlcmZfcmVjb3JkX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpjYikKK3sKKwlzdHJ1Y3QgcmVjb3JkICpyZWMgPSBjYjsKKworCWlmICghc3RyY21wKHZhciwgInJlY29yZC5jYWxsLWdyYXBoIikpCisJCXJldHVybiByZWNvcmRfcGFyc2VfY2FsbGNoYWluKHZhbHVlLCAmcmVjLT5vcHRzKTsKKworCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZWNvcmRfdXNhZ2VbXSA9IHsKIAkicGVyZiByZWNvcmQgWzxvcHRpb25zPl0gWzxjb21tYW5kPl0iLAogCSJwZXJmIHJlY29yZCBbPG9wdGlvbnM+XSAtLSA8Y29tbWFuZD4gWzxvcHRpb25zPl0iLApAQCAtODA3LDcgKzgyMyw3IEBACiAKICNkZWZpbmUgQ0FMTENIQUlOX0hFTFAgInNldHVwIGFuZCBlbmFibGVzIGNhbGwtZ3JhcGggKHN0YWNrIGNoYWluL2JhY2t0cmFjZSkgcmVjb3JkaW5nOiAiCiAKLSNpZmRlZiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAogY29uc3QgY2hhciByZWNvcmRfY2FsbGNoYWluX2hlbHBbXSA9IENBTExDSEFJTl9IRUxQICJmcCBkd2FyZiI7CiAjZWxzZQogY29uc3QgY2hhciByZWNvcmRfY2FsbGNoYWluX2hlbHBbXSA9IENBTExDSEFJTl9IRUxQICJmcCI7CkBAIC05MDcsNiArOTIzLDggQEAKIAlpZiAocmVjLT5ldmxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwZXJmX2NvbmZpZyhwZXJmX3JlY29yZF9jb25maWcsIHJlYyk7CisKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCByZWNvcmRfb3B0aW9ucywgcmVjb3JkX3VzYWdlLAogCQkJICAgIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwogCWlmICghYXJnYyAmJiB0YXJnZXRfX25vbmUoJnJlYy0+b3B0cy50YXJnZXQpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCmluZGV4IDAyZjk4NWYuLmM4ZjIxMTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKQEAgLTc1LDEzICs3NSwxMCBAQAogCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKIH0KIAotc3RhdGljIGludCByZXBvcnRfX2FkZF9tZW1faGlzdF9lbnRyeShzdHJ1Y3QgcGVyZl90b29sICp0b29sLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCkKK3N0YXRpYyBpbnQgcmVwb3J0X19hZGRfbWVtX2hpc3RfZW50cnkoc3RydWN0IHJlcG9ydCAqcmVwLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCisJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKIHsKLQlzdHJ1Y3QgcmVwb3J0ICpyZXAgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IHJlcG9ydCwgdG9vbCk7CiAJc3RydWN0IHN5bWJvbCAqcGFyZW50ID0gTlVMTDsKLQl1OCBjcHVtb2RlID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7CiAJc3RydWN0IGhpc3RfZW50cnkgKmhlOwogCXN0cnVjdCBtZW1faW5mbyAqbWksICpteDsKIAl1aW50NjRfdCBjb3N0OwpAQCAtOTAsNyArODcsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQltaSA9IG1hY2hpbmVfX3Jlc29sdmVfbWVtKGFsLT5tYWNoaW5lLCBhbC0+dGhyZWFkLCBzYW1wbGUsIGNwdW1vZGUpOworCW1pID0gc2FtcGxlX19yZXNvbHZlX21lbShzYW1wbGUsIGFsKTsKIAlpZiAoIW1pKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTMxLDEwICsxMjgsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcmVwb3J0X19hZGRfYnJhbmNoX2hpc3RfZW50cnkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAorc3RhdGljIGludCByZXBvcnRfX2FkZF9icmFuY2hfaGlzdF9lbnRyeShzdHJ1Y3QgcmVwb3J0ICpyZXAsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCiB7Ci0Jc3RydWN0IHJlcG9ydCAqcmVwID0gY29udGFpbmVyX29mKHRvb2wsIHN0cnVjdCByZXBvcnQsIHRvb2wpOwogCXN0cnVjdCBzeW1ib2wgKnBhcmVudCA9IE5VTEw7CiAJdW5zaWduZWQgaTsKIAlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CkBAIC0xNDQsOCArMTQwLDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JYmkgPSBtYWNoaW5lX19yZXNvbHZlX2JzdGFjayhhbC0+bWFjaGluZSwgYWwtPnRocmVhZCwKLQkJCQkgICAgIHNhbXBsZS0+YnJhbmNoX3N0YWNrKTsKKwliaSA9IHNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc2FtcGxlLCBhbCk7CiAJaWYgKCFiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE5MCwxMCArMTg1LDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlcG9ydF9fYWRkX2hpc3RfZW50cnkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorc3RhdGljIGludCByZXBvcnRfX2FkZF9oaXN0X2VudHJ5KHN0cnVjdCByZXBvcnQgKnJlcCwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAogCQkJCSAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKLQlzdHJ1Y3QgcmVwb3J0ICpyZXAgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IHJlcG9ydCwgdG9vbCk7CiAJc3RydWN0IHN5bWJvbCAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CiAJaW50IGVyciA9IHNhbXBsZV9fcmVzb2x2ZV9jYWxsY2hhaW4oc2FtcGxlLCAmcGFyZW50LCBldnNlbCwgYWwsIHJlcC0+bWF4X3N0YWNrKTsKQEAgLTIzNywyNSArMjMxLDI1IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoYWwuZmlsdGVyZWQgfHwgKHJlcC0+aGlkZV91bnJlc29sdmVkICYmIGFsLnN5bSA9PSBOVUxMKSkKKwlpZiAocmVwLT5oaWRlX3VucmVzb2x2ZWQgJiYgYWwuc3ltID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJaWYgKHJlcC0+Y3B1X2xpc3QgJiYgIXRlc3RfYml0KHNhbXBsZS0+Y3B1LCByZXAtPmNwdV9iaXRtYXApKQogCQlyZXR1cm4gMDsKIAogCWlmIChzb3J0X19tb2RlID09IFNPUlRfTU9ERV9fQlJBTkNIKSB7Ci0JCXJldCA9IHJlcG9ydF9fYWRkX2JyYW5jaF9oaXN0X2VudHJ5KHRvb2wsICZhbCwgc2FtcGxlLCBldnNlbCk7CisJCXJldCA9IHJlcG9ydF9fYWRkX2JyYW5jaF9oaXN0X2VudHJ5KHJlcCwgJmFsLCBzYW1wbGUsIGV2c2VsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlwcl9kZWJ1ZygicHJvYmxlbSBhZGRpbmcgbGJyIGVudHJ5LCBza2lwcGluZyBldmVudFxuIik7CiAJfSBlbHNlIGlmIChyZXAtPm1lbV9tb2RlID09IDEpIHsKLQkJcmV0ID0gcmVwb3J0X19hZGRfbWVtX2hpc3RfZW50cnkodG9vbCwgJmFsLCBzYW1wbGUsIGV2c2VsLCBldmVudCk7CisJCXJldCA9IHJlcG9ydF9fYWRkX21lbV9oaXN0X2VudHJ5KHJlcCwgJmFsLCBzYW1wbGUsIGV2c2VsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlwcl9kZWJ1ZygicHJvYmxlbSBhZGRpbmcgbWVtIGVudHJ5LCBza2lwcGluZyBldmVudFxuIik7CiAJfSBlbHNlIHsKIAkJaWYgKGFsLm1hcCAhPSBOVUxMKQogCQkJYWwubWFwLT5kc28tPmhpdCA9IDE7CiAKLQkJcmV0ID0gcmVwb3J0X19hZGRfaGlzdF9lbnRyeSh0b29sLCBldnNlbCwgJmFsLCBzYW1wbGUpOworCQlyZXQgPSByZXBvcnRfX2FkZF9oaXN0X2VudHJ5KHJlcCwgZXZzZWwsICZhbCwgc2FtcGxlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlwcl9kZWJ1ZygicHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIHBlcmlvZCwgc2tpcHBpbmcgZXZlbnRcbiIpOwogCX0KQEAgLTkzNCw3ICs5MjgsNyBAQAogCSAqIHNvIGRvbid0IGFsbG9jYXRlIGV4dHJhIHNwYWNlIHRoYXQgd29uJ3QgYmUgdXNlZCBpbiB0aGUgc3RkaW8KIAkgKiBpbXBsZW1lbnRhdGlvbi4KIAkgKi8KLQlpZiAodXNlX2Jyb3dzZXIgPT0gMSAmJiBzb3J0X19oYXNfc3ltKSB7CisJaWYgKHVpX19oYXNfYW5ub3RhdGlvbigpKSB7CiAJCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW5ub3RhdGlvbik7CiAJCW1hY2hpbmVzX19zZXRfc3ltYm9sX2ZpbHRlcigmc2Vzc2lvbi0+bWFjaGluZXMsCiAJCQkJCSAgICBzeW1ib2xfX2Fubm90YXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwppbmRleCA2YTc2YTA3Li45YWMwYTQ5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIAogCWF2ZyA9IHdvcmtfbGlzdC0+dG90YWxfbGF0IC8gd29ya19saXN0LT5uYl9hdG9tczsKIAotCXByaW50ZigifCUxMS4zZiBtcyB8JTkiIFBSSXU2NCAiIHwgYXZnOiU5LjNmIG1zIHwgbWF4OiU5LjNmIG1zIHwgbWF4IGF0OiAlOS42ZiBzXG4iLAorCXByaW50ZigifCUxMS4zZiBtcyB8JTkiIFBSSXU2NCAiIHwgYXZnOiU5LjNmIG1zIHwgbWF4OiU5LjNmIG1zIHwgbWF4IGF0OiAlMTMuNmYgc1xuIiwKIAkgICAgICAoZG91YmxlKXdvcmtfbGlzdC0+dG90YWxfcnVudGltZSAvIDFlNiwKIAkJIHdvcmtfbGlzdC0+bmJfYXRvbXMsIChkb3VibGUpYXZnIC8gMWU2LAogCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXQgLyAxZTYsCkBAIC0xNTI3LDkgKzE1MjcsOSBAQAogCiAJcGVyZl9zY2hlZF9fc29ydF9sYXQoc2NoZWQpOwogCi0JcHJpbnRmKCJcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCXByaW50ZigiICBUYXNrICAgICAgICAgICAgICAgICAgfCAgIFJ1bnRpbWUgbXMgIHwgU3dpdGNoZXMgfCBBdmVyYWdlIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBtcyB8IE1heGltdW0gZGVsYXkgYXQgICAgIHxcbiIpOwotCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCJcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCIgIFRhc2sgICAgICAgICAgICAgICAgICB8ICAgUnVudGltZSBtcyAgfCBTd2l0Y2hlcyB8IEF2ZXJhZ2UgZGVsYXkgbXMgfCBNYXhpbXVtIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBhdCAgICAgICB8XG4iKTsKKwlwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAluZXh0ID0gcmJfZmlyc3QoJnNjaGVkLT5zb3J0ZWRfYXRvbV9yb290KTsKIApAQCAtMTU0MSw3ICsxNTQxLDcgQEAKIAkJbmV4dCA9IHJiX25leHQobmV4dCk7CiAJfQogCi0JcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGYoIiAgVE9UQUw6ICAgICAgICAgICAgICAgIHwlMTEuM2YgbXMgfCU5IiBQUkl1NjQgIiB8XG4iLAogCQkoZG91YmxlKXNjaGVkLT5hbGxfcnVudGltZSAvIDFlNiwgc2NoZWQtPmFsbF9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYwppbmRleCAyNTUyNmQ2Li43NGRiMjU2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCkBAIC00OTQsNyArNDk0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJdGFsLmZpbHRlcmVkID0gZmFsc2U7CisJCXRhbC5maWx0ZXJlZCA9IDA7CiAJCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKGFsLnRocmVhZCwgbWFjaGluZSwgY3B1bW9kZSwKIAkJCQkJICAgTUFQX19GVU5DVElPTiwgaXAsICZ0YWwpOwogCkBAIC0xMjM4LDcgKzEyMzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBvbGRfcG93ZXJfYXJnc19ucjsgaSsrKQogCQkqcCsrID0gc3RyZHVwKG9sZF9wb3dlcl9hcmdzW2ldKTsKIAotCWZvciAoaiA9IDE7IGogPCAodW5zaWduZWQgaW50KWFyZ2M7IGorKykKKwlmb3IgKGogPSAwOyBqIDwgKHVuc2lnbmVkIGludClhcmdjOyBqKyspCiAJCSpwKysgPSBhcmd2W2pdOwogCiAJcmV0dXJuIGNtZF9yZWNvcmQocmVjX2FyZ2MsIHJlY19hcmd2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwppbmRleCA1Zjk4OWE3Li42NWFhYTViIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCkBAIC05OTMsNiArOTkzLDE2IEBACiAJcmV0dXJuIHJlY29yZF9wYXJzZV9jYWxsY2hhaW5fb3B0KG9wdCwgYXJnLCB1bnNldCk7CiB9CiAKK3N0YXRpYyBpbnQgcGVyZl90b3BfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmNiKQoreworCXN0cnVjdCBwZXJmX3RvcCAqdG9wID0gY2I7CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ0b3AuY2FsbC1ncmFwaCIpKQorCQlyZXR1cm4gcmVjb3JkX3BhcnNlX2NhbGxjaGFpbih2YWx1ZSwgJnRvcC0+cmVjb3JkX29wdHMpOworCisJcmV0dXJuIHBlcmZfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSwgY2IpOworfQorCiBzdGF0aWMgaW50CiBwYXJzZV9wZXJjZW50X2xpbWl0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqYXJnLAogCQkgICAgaW50IHVuc2V0IF9fbWF5YmVfdW51c2VkKQpAQCAtMTExNyw2ICsxMTI3LDggQEAKIAlpZiAodG9wLmV2bGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXBlcmZfY29uZmlnKHBlcmZfdG9wX2NvbmZpZywgJnRvcCk7CisKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCB0b3BfdXNhZ2UsIDApOwogCWlmIChhcmdjKQogCQl1c2FnZV93aXRoX29wdGlvbnModG9wX3VzYWdlLCBvcHRpb25zKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUKaW5kZXggMDMzMWVhMi4uYzIzNDE4MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUKQEAgLTU5LDYgKzU5LDE4IEBACiAgIENGTEFHUyArPSAtREhBVkVfUEVSRl9SRUdTX1NVUFBPUlQKIGVuZGlmCiAKK2lmbmRlZiBOT19MSUJFTEYKKyAgIyBmb3IgbGlua2luZyB3aXRoIGRlYnVnIGxpYnJhcnksIHJ1biBsaWtlOgorICAjIG1ha2UgREVCVUc9MSBMSUJEV19ESVI9L29wdC9saWJkdy8KKyAgaWZkZWYgTElCRFdfRElSCisgICAgTElCRFdfQ0ZMQUdTICA6PSAtSSQoTElCRFdfRElSKS9pbmNsdWRlCisgICAgTElCRFdfTERGTEFHUyA6PSAtTCQoTElCRFdfRElSKS9saWIKKworICAgIEZFQVRVUkVfQ0hFQ0tfQ0ZMQUdTLWxpYmR3LWR3YXJmLXVud2luZCA6PSAkKExJQkRXX0NGTEFHUykKKyAgICBGRUFUVVJFX0NIRUNLX0xERkxBR1MtbGliZHctZHdhcmYtdW53aW5kIDo9ICQoTElCRFdfTERGTEFHUykgLWxkdworICBlbmRpZgorZW5kaWYKKwogIyBpbmNsdWRlIEFSQ0ggc3BlY2lmaWMgY29uZmlnCiAtaW5jbHVkZSAkKHNyYy1wZXJmKS9hcmNoLyQoQVJDSCkvTWFrZWZpbGUKIApAQCAtMTQ3LDcgKzE1OSwzNSBAQAogCWxpYnVud2luZAkJCVwKIAlvbi1leGl0CQkJCVwKIAlzdGFja3Byb3RlY3Rvci1hbGwJCVwKLQl0aW1lcmZkCisJdGltZXJmZAkJCQlcCisJbGliZHctZHdhcmYtdW53aW5kCisKK0xJQl9GRUFUVVJFX1RFU1RTID0JCQlcCisJZHdhcmYJCQkJXAorCWdsaWJjCQkJCVwKKwlndGsyCQkJCVwKKwlsaWJhdWRpdAkJCVwKKwlsaWJiZmQJCQkJXAorCWxpYmVsZgkJCQlcCisJbGlibnVtYQkJCQlcCisJbGlicGVybAkJCQlcCisJbGlicHl0aG9uCQkJXAorCWxpYnNsYW5nCQkJXAorCWxpYnVud2luZAkJCVwKKwlsaWJkdy1kd2FyZi11bndpbmQKKworVkZfRkVBVFVSRV9URVNUUyA9CQkJXAorCWJhY2t0cmFjZQkJCVwKKwlmb3J0aWZ5LXNvdXJjZQkJCVwKKwlndGsyLWluZm9iYXIJCQlcCisJbGliZWxmLWdldHBoZHJudW0JCVwKKwlsaWJlbGYtbW1hcAkJCVwKKwlsaWJweXRob24tdmVyc2lvbgkJXAorCW9uLWV4aXQJCQkJXAorCXN0YWNrcHJvdGVjdG9yLWFsbAkJXAorCXRpbWVyZmQJCQkJXAorCWxpYnVud2luZC1kZWJ1Zy1mcmFtZQkJXAorCWJpb25pYwogCiAjIFNldCBGRUFUVVJFX0NIRUNLXyhDfExEKUZMQUdTLWFsbCBmb3IgYWxsIENPUkVfRkVBVFVSRV9URVNUUyBmZWF0dXJlcy4KICMgSWYgaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHBlci1mZWF0dXJlIGNoZWNrcy9mbGFncyBmb3IgZmVhdHVyZXMgbm90CkBAIC0xNjEsMTcgKzIwMSw2IEBACiAkKGZvcmVhY2ggZmVhdCwkKENPUkVfRkVBVFVSRV9URVNUUyksJChjYWxsIHNldF90ZXN0X2FsbF9mbGFncywkKGZlYXQpKSkKIAogIwotIyBTbyBoZXJlIHdlIGRldGVjdCB3aGV0aGVyIHRlc3QtYWxsIHdhcyByZWJ1aWx0LCB0byBiZSBhYmxlCi0jIHRvIHNraXAgdGhlIHByaW50LW91dCBvZiB0aGUgbG9uZyBmZWF0dXJlcyBsaXN0IGlmIHRoZSBmaWxlCi0jIGV4aXN0ZWQgYmVmb3JlIGFuZCBhZnRlciBpdCB3YXMgYnVpbHQ6Ci0jCi1pZmVxICgkKHdpbGRjYXJkICQoT1VUUFVUKWNvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWFsbC5iaW4pLCkKLSAgdGVzdC1hbGwtZmFpbGVkIDo9IDEKLWVsc2UKLSAgdGVzdC1hbGwtZmFpbGVkIDo9IDAKLWVuZGlmCi0KLSMKICMgU3BlY2lhbCBmYXN0LXBhdGggZm9yIHRoZSAnYWxsIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUnIGNhc2U6CiAjCiAkKGNhbGwgZmVhdHVyZV9jaGVjayxhbGwsJChNU0cpKQpAQCAtMTgwLDE1ICsyMDksNiBAQAogIyBKdXN0IGluIGNhc2UgdGhlIGJ1aWxkIGZyZXNobHkgZmFpbGVkLCBtYWtlIHN1cmUgd2UgcHJpbnQgdGhlCiAjIGZlYXR1cmUgbWF0cml4OgogIwotaWZlcSAoJChmZWF0dXJlLWFsbCksIDApCi0gIHRlc3QtYWxsLWZhaWxlZCA6PSAxCi1lbmRpZgotCi1pZmVxICgkKHRlc3QtYWxsLWZhaWxlZCksMSkKLSAgJChpbmZvICkKLSAgJChpbmZvIEF1dG8tZGV0ZWN0aW5nIHN5c3RlbSBmZWF0dXJlczopCi1lbmRpZgotCiBpZmVxICgkKGZlYXR1cmUtYWxsKSwgMSkKICAgIwogICAjIHRlc3QtYWxsLmMgcGFzc2VkIC0ganVzdCBzZXQgYWxsIHRoZSBjb3JlIGZlYXR1cmUgZmxhZ3MgdG8gMToKQEAgLTE5OSwyNyArMjE5LDYgQEAKICAgJChmb3JlYWNoIGZlYXQsJChDT1JFX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX2NoZWNrLCQoZmVhdCkpKQogZW5kaWYKIAotIwotIyBQcmludCB0aGUgcmVzdWx0IG9mIHRoZSBmZWF0dXJlIHRlc3Q6Ci0jCi1mZWF0dXJlX3ByaW50ID0gJChldmFsICQoZmVhdHVyZV9wcmludF9jb2RlKSkgJChpbmZvICQoTVNHKSkKLQotZGVmaW5lIGZlYXR1cmVfcHJpbnRfY29kZQotICBpZmVxICgkKGZlYXR1cmUtJCgxKSksIDEpCi0gICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6IFsgXDAzM1szMm1vblwwMzNbbSAgXScgJCgxKSkKLSAgZWxzZQotICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiBbIFwwMzNbMzFtT0ZGXDAzM1ttIF0nICQoMSkpCi0gIGVuZGlmCi1lbmRlZgotCi0jCi0jIE9ubHkgcHJpbnQgb3V0IG91ciBmZWF0dXJlcyBpZiB3ZSByZWJ1aWx0IHRoZSB0ZXN0Y2FzZXMgb3IgaWYgYSB0ZXN0IGZhaWxlZDoKLSMKLWlmZXEgKCQodGVzdC1hbGwtZmFpbGVkKSwgMSkKLSAgJChmb3JlYWNoIGZlYXQsJChDT1JFX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX3ByaW50LCQoZmVhdCkpKQotICAkKGluZm8gKQotZW5kaWYKLQogaWZlcSAoJChmZWF0dXJlLXN0YWNrcHJvdGVjdG9yLWFsbCksIDEpCiAgIENGTEFHUyArPSAtZnN0YWNrLXByb3RlY3Rvci1hbGwKIGVuZGlmCkBAIC0yNjQsNiArMjYzLDcgQEAKICAgTk9fRFdBUkYgOj0gMQogICBOT19ERU1BTkdMRSA6PSAxCiAgIE5PX0xJQlVOV0lORCA6PSAxCisgIE5PX0xJQkRXX0RXQVJGX1VOV0lORCA6PSAxCiBlbHNlCiAgIGlmZXEgKCQoZmVhdHVyZS1saWJlbGYpLCAwKQogICAgIGlmZXEgKCQoZmVhdHVyZS1nbGliYyksIDEpCkBAIC0yODIsMTMgKzI4MiwxMiBAQAogICAgICAgbXNnIDo9ICQoZXJyb3IgTm8gZ251L2xpYmMtdmVyc2lvbi5oIGZvdW5kLCBwbGVhc2UgaW5zdGFsbCBnbGliYy1kZXZbZWxdL2dsaWJjLXN0YXRpYyk7CiAgICAgZW5kaWYKICAgZWxzZQotICAgICMgZm9yIGxpbmtpbmcgd2l0aCBkZWJ1ZyBsaWJyYXJ5LCBydW4gbGlrZToKLSAgICAjIG1ha2UgREVCVUc9MSBMSUJEV19ESVI9L29wdC9saWJkdy8KLSAgICBpZmRlZiBMSUJEV19ESVIKLSAgICAgIExJQkRXX0NGTEFHUyAgOj0gLUkkKExJQkRXX0RJUikvaW5jbHVkZQotICAgICAgTElCRFdfTERGTEFHUyA6PSAtTCQoTElCRFdfRElSKS9saWIKKyAgICBpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECisgICAgICBpZm5lcSAoJChmZWF0dXJlLWxpYmR3LWR3YXJmLXVud2luZCksMSkKKyAgICAgICAgTk9fTElCRFdfRFdBUkZfVU5XSU5EIDo9IDEKKyAgICAgICAgbXNnIDo9ICQod2FybmluZyBObyBsaWJkdyBEV0FSRiB1bndpbmQgZm91bmQsIFBsZWFzZSBpbnN0YWxsIGVsZnV0aWxzLWRldmVsL2xpYmR3LWRldiA+PSAwLjE1OCBhbmQvb3Igc2V0IExJQkRXX0RJUik7CisgICAgICBlbmRpZgogICAgIGVuZGlmCi0KICAgICBpZm5lcSAoJChmZWF0dXJlLWR3YXJmKSwgMSkKICAgICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gbGliZHcuaCBmb3VuZCBvciBvbGQgbGliZHcuaCBmb3VuZCBvciBlbGZ1dGlscyBpcyBvbGRlciB0aGFuIDAuMTM4LCBkaXNhYmxlcyBkd2FyZiBzdXBwb3J0LiBQbGVhc2UgaW5zdGFsbCBuZXcgZWxmdXRpbHMtZGV2ZWwvbGliZHctZGV2KTsKICAgICAgIE5PX0RXQVJGIDo9IDEKQEAgLTMyNCwyNSArMzIzLDUxIEBACiAKIGlmbmRlZiBOT19MSUJVTldJTkQKICAgaWZuZXEgKCQoZmVhdHVyZS1saWJ1bndpbmQpLCAxKQotICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gbGlidW53aW5kIGZvdW5kLCBkaXNhYmxpbmcgcG9zdCB1bndpbmQgc3VwcG9ydC4gUGxlYXNlIGluc3RhbGwgbGlidW53aW5kLWRldltlbF0gPj0gMS4xKTsKKyAgICBtc2cgOj0gJCh3YXJuaW5nIE5vIGxpYnVud2luZCBmb3VuZC4gUGxlYXNlIGluc3RhbGwgbGlidW53aW5kLWRldltlbF0gPj0gMS4xIGFuZC9vciBzZXQgTElCVU5XSU5EX0RJUik7CiAgICAgTk9fTElCVU5XSU5EIDo9IDEKKyAgZW5kaWYKK2VuZGlmCisKK2R3YXJmLXBvc3QtdW53aW5kIDo9IDEKK2R3YXJmLXBvc3QtdW53aW5kLXRleHQgOj0gQlVHCisKKyMgc2V0dXAgRFdBUkYgcG9zdCB1bndpbmRlcgoraWZkZWYgTk9fTElCVU5XSU5ECisgIGlmZGVmIE5PX0xJQkRXX0RXQVJGX1VOV0lORAorICAgIG1zZyA6PSAkKHdhcm5pbmcgRGlzYWJsaW5nIHBvc3QgdW53aW5kLCBubyBzdXBwb3J0IGZvdW5kLik7CisgICAgZHdhcmYtcG9zdC11bndpbmQgOj0gMAogICBlbHNlCi0gICAgaWZlcSAoJChBUkNIKSxhcm0pCi0gICAgICAkKGNhbGwgZmVhdHVyZV9jaGVjayxsaWJ1bndpbmQtZGVidWctZnJhbWUpCi0gICAgICBpZm5lcSAoJChmZWF0dXJlLWxpYnVud2luZC1kZWJ1Zy1mcmFtZSksIDEpCi0gICAgICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gZGVidWdfZnJhbWUgc3VwcG9ydCBmb3VuZCBpbiBsaWJ1bndpbmQpOwotICAgICAgICBDRkxBR1MgKz0gLUROT19MSUJVTldJTkRfREVCVUdfRlJBTUUKLSAgICAgIGVuZGlmCi0gICAgZWxzZQotICAgICAgIyBub24tQVJNIGhhcyBubyBkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKCkgZnVuY3Rpb246CisgICAgZHdhcmYtcG9zdC11bndpbmQtdGV4dCA6PSBsaWJkdworICBlbmRpZgorZWxzZQorICBkd2FyZi1wb3N0LXVud2luZC10ZXh0IDo9IGxpYnVud2luZAorICAjIEVuYWJsZSBsaWJ1bndpbmQgc3VwcG9ydCBieSBkZWZhdWx0LgorICBpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECisgICAgTk9fTElCRFdfRFdBUkZfVU5XSU5EIDo9IDEKKyAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoZHdhcmYtcG9zdC11bndpbmQpLDEpCisgIENGTEFHUyArPSAtREhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKK2Vsc2UKKyAgTk9fRFdBUkZfVU5XSU5EIDo9IDEKK2VuZGlmCisKK2lmbmRlZiBOT19MSUJVTldJTkQKKyAgaWZlcSAoJChBUkNIKSxhcm0pCisgICAgJChjYWxsIGZlYXR1cmVfY2hlY2ssbGlidW53aW5kLWRlYnVnLWZyYW1lKQorICAgIGlmbmVxICgkKGZlYXR1cmUtbGlidW53aW5kLWRlYnVnLWZyYW1lKSwgMSkKKyAgICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gZGVidWdfZnJhbWUgc3VwcG9ydCBmb3VuZCBpbiBsaWJ1bndpbmQpOwogICAgICAgQ0ZMQUdTICs9IC1ETk9fTElCVU5XSU5EX0RFQlVHX0ZSQU1FCiAgICAgZW5kaWYKLQotICAgIENGTEFHUyArPSAtREhBVkVfTElCVU5XSU5EX1NVUFBPUlQKLSAgICBFWFRMSUJTICs9ICQoTElCVU5XSU5EX0xJQlMpCi0gICAgQ0ZMQUdTICs9ICQoTElCVU5XSU5EX0NGTEFHUykKLSAgICBMREZMQUdTICs9ICQoTElCVU5XSU5EX0xERkxBR1MpCi0gIGVuZGlmICMgaWZuZXEgKCQoZmVhdHVyZS1saWJ1bndpbmQpLCAxKQorICBlbHNlCisgICAgIyBub24tQVJNIGhhcyBubyBkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKCkgZnVuY3Rpb246CisgICAgQ0ZMQUdTICs9IC1ETk9fTElCVU5XSU5EX0RFQlVHX0ZSQU1FCisgIGVuZGlmCisgIENGTEFHUyAgKz0gLURIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisgIEVYVExJQlMgKz0gJChMSUJVTldJTkRfTElCUykKKyAgQ0ZMQUdTICArPSAkKExJQlVOV0lORF9DRkxBR1MpCisgIExERkxBR1MgKz0gJChMSUJVTldJTkRfTERGTEFHUykKIGVuZGlmCiAKIGlmbmRlZiBOT19MSUJBVURJVApAQCAtNjAyLDMgKzYyNyw4NCBAQAogcGx1Z2luZGlyPSQobGliZGlyKS90cmFjZWV2ZW50L3BsdWdpbnMKIHBsdWdpbmRpcl9TUT0gJChzdWJzdCAnLCdcJycsJChwbHVnaW5kaXIpKQogZW5kaWYKKworIworIyBQcmludCB0aGUgcmVzdWx0IG9mIHRoZSBmZWF0dXJlIHRlc3Q6CisjCitmZWF0dXJlX3ByaW50X3N0YXR1cyA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfc3RhdHVzX2NvZGUpKSAkKGluZm8gJChNU0cpKQorCitkZWZpbmUgZmVhdHVyZV9wcmludF9zdGF0dXNfY29kZQorICBpZmVxICgkKGZlYXR1cmUtJCgxKSksIDEpCisgICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6IFsgXDAzM1szMm1vblwwMzNbbSAgXScgJCgxKSkKKyAgZWxzZQorICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiBbIFwwMzNbMzFtT0ZGXDAzM1ttIF0nICQoMSkpCisgIGVuZGlmCitlbmRlZgorCitmZWF0dXJlX3ByaW50X3ZhciA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfdmFyX2NvZGUpKSAkKGluZm8gJChNU0cpKQorZGVmaW5lIGZlYXR1cmVfcHJpbnRfdmFyX2NvZGUKKyAgICBNU0cgPSAkKHNoZWxsIHByaW50ZiAnLi4uJTMwczogJXMnICQoMSkgJCgkKDEpKSkKK2VuZGVmCisKK2ZlYXR1cmVfcHJpbnRfdGV4dCA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfdGV4dF9jb2RlKSkgJChpbmZvICQoTVNHKSkKK2RlZmluZSBmZWF0dXJlX3ByaW50X3RleHRfY29kZQorICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiAlcycgJCgxKSAkKDIpKQorZW5kZWYKKworUEVSRl9GRUFUVVJFUyA6PSAkKGZvcmVhY2ggZmVhdCwkKExJQl9GRUFUVVJFX1RFU1RTKSxmZWF0dXJlLSQoZmVhdCkoJChmZWF0dXJlLSQoZmVhdCkpKSkKK1BFUkZfRkVBVFVSRVNfRklMRSA6PSAkKHNoZWxsIHRvdWNoICQoT1VUUFVUKVBFUkYtRkVBVFVSRVM7IGNhdCAkKE9VVFBVVClQRVJGLUZFQVRVUkVTKQorCitpZmVxICgkKGR3YXJmLXBvc3QtdW53aW5kKSwxKQorICBQRVJGX0ZFQVRVUkVTICs9IGR3YXJmLXBvc3QtdW53aW5kKCQoZHdhcmYtcG9zdC11bndpbmQtdGV4dCkpCitlbmRpZgorCisjIFRoZSAkKGRpc3BsYXlfbGliKSBjb250cm9scyB0aGUgZGVmYXVsdCBkZXRlY3Rpb24gbWVzc2FnZQorIyBvdXRwdXQuIEl0J3Mgc2V0IGlmOgorIyAtIGRldGVjdGVkIGZlYXR1cmVzIGRpZmZlcmVzIGZyb20gc3RvcmVkIGZlYXR1cmVzIGZyb20KKyMgICBsYXN0IGJ1aWxkIChpbiBQRVJGLUZFQVRVUkVTIGZpbGUpCisjIC0gb25lIG9mIHRoZSAkKExJQl9GRUFUVVJFX1RFU1RTKSBpcyBub3QgZGV0ZWN0ZWQKKyMgLSBWRiBpcyBlbmFibGVkCisKK2lmbmVxICgiJChQRVJGX0ZFQVRVUkVTKSIsIiQoUEVSRl9GRUFUVVJFU19GSUxFKSIpCisgICQoc2hlbGwgZWNobyAiJChQRVJGX0ZFQVRVUkVTKSIgPiAkKE9VVFBVVClQRVJGLUZFQVRVUkVTKQorICBkaXNwbGF5X2xpYiA6PSAxCitlbmRpZgorCitmZWF0dXJlX2NoZWNrID0gJChldmFsICQoZmVhdHVyZV9jaGVja19jb2RlKSkKK2RlZmluZSBmZWF0dXJlX2NoZWNrX2NvZGUKKyAgaWZuZXEgKCQoZmVhdHVyZS0kKDEpKSwgMSkKKyAgICBkaXNwbGF5X2xpYiA6PSAxCisgIGVuZGlmCitlbmRlZgorCiskKGZvcmVhY2ggZmVhdCwkKExJQl9GRUFUVVJFX1RFU1RTKSwkKGNhbGwgZmVhdHVyZV9jaGVjaywkKGZlYXQpKSkKKworaWZlcSAoJChWRiksMSkKKyAgZGlzcGxheV9saWIgOj0gMQorICBkaXNwbGF5X3ZmIDo9IDEKK2VuZGlmCisKK2lmZXEgKCQoZGlzcGxheV9saWIpLDEpCisgICQoaW5mbyApCisgICQoaW5mbyBBdXRvLWRldGVjdGluZyBzeXN0ZW0gZmVhdHVyZXM6KQorICAkKGZvcmVhY2ggZmVhdCwkKExJQl9GRUFUVVJFX1RFU1RTKSwkKGNhbGwgZmVhdHVyZV9wcmludF9zdGF0dXMsJChmZWF0KSwpKQorCisgIGlmZXEgKCQoZHdhcmYtcG9zdC11bndpbmQpLDEpCisgICAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdGV4dCwiRFdBUkYgcG9zdCB1bndpbmQgbGlicmFyeSIsICQoZHdhcmYtcG9zdC11bndpbmQtdGV4dCkpCisgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKGRpc3BsYXlfdmYpLDEpCisgICQoZm9yZWFjaCBmZWF0LCQoVkZfRkVBVFVSRV9URVNUUyksJChjYWxsIGZlYXR1cmVfcHJpbnRfc3RhdHVzLCQoZmVhdCksKSkKKyAgJChpbmZvICkKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLHByZWZpeCkKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLGJpbmRpcikKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLGxpYmRpcikKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLHN5c2NvbmZkaXIpCisgICQoY2FsbCBmZWF0dXJlX3ByaW50X3ZhcixMSUJVTldJTkRfRElSKQorICAkKGNhbGwgZmVhdHVyZV9wcmludF92YXIsTElCRFdfRElSKQorZW5kaWYKKworaWZlcSAoJChkaXNwbGF5X2xpYiksMSkKKyAgJChpbmZvICkKK2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCmluZGV4IDUyM2I3YmMuLjJkYTEwM2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCkBAIC0yNiw3ICsyNiw4IEBACiAJdGVzdC1saWJ1bndpbmQtZGVidWctZnJhbWUuYmluCVwKIAl0ZXN0LW9uLWV4aXQuYmluCQlcCiAJdGVzdC1zdGFja3Byb3RlY3Rvci1hbGwuYmluCVwKLQl0ZXN0LXRpbWVyZmQuYmluCisJdGVzdC10aW1lcmZkLmJpbgkJXAorCXRlc3QtbGliZHctZHdhcmYtdW53aW5kLmJpbgogCiBDQyA6PSAkKENST1NTX0NPTVBJTEUpZ2NjIC1NRAogUEtHX0NPTkZJRyA6PSAkKENST1NTX0NPTVBJTEUpcGtnLWNvbmZpZwpAQCAtMTQxLDYgKzE0Miw5IEBACiB0ZXN0LXRpbWVyZmQuYmluOgogCSQoQlVJTEQpCiAKK3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmJpbjoKKwkkKEJVSUxEKQorCiAtaW5jbHVkZSAqLmQKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1hbGwuYyBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtYWxsLmMKaW5kZXggOWI4YTU0NC4uZmMzN2ViMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1hbGwuYworKysgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWFsbC5jCkBAIC04OSw2ICs4OSwxMCBAQAogIyBpbmNsdWRlICJ0ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jIgogI3VuZGVmIG1haW4KIAorI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJkd19kd2FyZl91bndpbmQKKyMgaW5jbHVkZSAidGVzdC1saWJkdy1kd2FyZi11bndpbmQuYyIKKyN1bmRlZiBtYWluCisKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJbWFpbl90ZXN0X2xpYnB5dGhvbigpOwpAQCAtMTExLDYgKzExNSw3IEBACiAJbWFpbl90ZXN0X2xpYm51bWEoKTsKIAltYWluX3Rlc3RfdGltZXJmZCgpOwogCW1haW5fdGVzdF9zdGFja3Byb3RlY3Rvcl9hbGwoKTsKKwltYWluX3Rlc3RfbGliZHdfZHdhcmZfdW53aW5kKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmMgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmR3LWR3YXJmLXVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzZhM2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmR3LWR3YXJmLXVud2luZC5jCkBAIC0wLDAgKzEsMTMgQEAKKworI2luY2x1ZGUgPGVsZnV0aWxzL2xpYmR3ZmwuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmRlZCB2aWE6IF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMikuCisJICogUGFzc2luZyAnMScgYXMgYXJndW1lbnRzIHZhbHVlLiBUaGlzIGNvZGUgaXMgbmV2ZXIgZXhlY3V0ZWQsCisJICogb25seSBjb21waWxlZC4KKwkgKi8KKwlkd2ZsX3RocmVhZF9nZXRmcmFtZXMoKHZvaWQgKikgMSwgKHZvaWQgKikgMSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2Rlc2lnbi50eHQgYi90b29scy9wZXJmL2Rlc2lnbi50eHQKaW5kZXggNjNhMGU2Zi4uYTI4ZGNhMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9kZXNpZ24udHh0CisrKyBiL3Rvb2xzL3BlcmYvZGVzaWduLnR4dApAQCAtMTgsNyArMTgsNyBAQAogUGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIGFjY2Vzc2VkIHZpYSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvcnMuCiBUaGVyZSdzIG9uZSBmaWxlIGRlc2NyaXB0b3IgcGVyIHZpcnR1YWwgY291bnRlciB1c2VkLgogCi1UaGUgc3BlY2lhbCBmaWxlIGRlc2NyaXB0b3IgaXMgb3BlbmVkIHZpYSB0aGUgcGVyZl9ldmVudF9vcGVuKCkKK1RoZSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvciBpcyBvcGVuZWQgdmlhIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuKCkKIHN5c3RlbSBjYWxsOgogCiAgICBpbnQgc3lzX3BlcmZfZXZlbnRfb3BlbihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICpod19ldmVudF91cHRyLApAQCAtODIsNyArODIsNyBAQAogSWYgJ3Jhd190eXBlJyBpcyAwLCB0aGVuIHRoZSAndHlwZScgZmllbGQgc2F5cyB3aGF0IGtpbmQgb2YgY291bnRlcgogdGhpcyBpcywgd2l0aCB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgogCi1lbnVtIHBlcmZfZXZlbnRfdHlwZXMgeworZW51bSBwZXJmX3R5cGVfaWQgewogCVBFUkZfVFlQRV9IQVJEV0FSRQkJPSAwLAogCVBFUkZfVFlQRV9TT0ZUV0FSRQkJPSAxLAogCVBFUkZfVFlQRV9UUkFDRVBPSU5UCQk9IDIsCkBAIC05NSw3ICs5NSw3IEBACiAgKiBHZW5lcmFsaXplZCBwZXJmb3JtYW5jZSBjb3VudGVyIGV2ZW50IHR5cGVzLCB1c2VkIGJ5IHRoZSBod19ldmVudC5ldmVudF9pZAogICogcGFyYW1ldGVyIG9mIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuKCkgc3lzY2FsbDoKICAqLwotZW51bSBod19ldmVudF9pZHMgeworZW51bSBwZXJmX2h3X2lkIHsKIAkvKgogCSAqIENvbW1vbiBoYXJkd2FyZSBldmVudHMsIGdlbmVyYWxpemVkIGJ5IHRoZSBrZXJuZWw6CiAJICovCkBAIC0xMjksNyArMTI5LDcgQEAKICAqIHBoeXNpY2FsIGFuZCBzdyBldmVudHMgb2YgdGhlIGtlcm5lbCAoYW5kIGFsbG93IHRoZSBwcm9maWxpbmcgb2YgdGhlbSBhcwogICogd2VsbCk6CiAgKi8KLWVudW0gc3dfZXZlbnRfaWRzIHsKK2VudW0gcGVyZl9zd19pZHMgewogCVBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLCQk9IDAsCiAJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCT0gMSwKIAlQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTCT0gMiwKQEAgLTIzMCw3ICsyMzAsNyBAQAogVGhlICdjb21tJyBiaXQgYWxsb3dzIHRyYWNraW5nIG9mIHByb2Nlc3MgY29tbSBkYXRhIG9uIHByb2Nlc3MgY3JlYXRpb24uCiBUaGlzIHRvbyBpcyByZWNvcmRlZCBpbiB0aGUgcmluZy1idWZmZXIgKHNlZSBiZWxvdykuCiAKLVRoZSAncGlkJyBwYXJhbWV0ZXIgdG8gdGhlIHBlcmZfZXZlbnRfb3BlbigpIHN5c3RlbSBjYWxsIGFsbG93cyB0aGUKK1RoZSAncGlkJyBwYXJhbWV0ZXIgdG8gdGhlIHN5c19wZXJmX2V2ZW50X29wZW4oKSBzeXN0ZW0gY2FsbCBhbGxvd3MgdGhlCiBjb3VudGVyIHRvIGJlIHNwZWNpZmljIHRvIGEgdGFzazoKIAogIHBpZCA9PSAwOiBpZiB0aGUgcGlkIHBhcmFtZXRlciBpcyB6ZXJvLCB0aGUgY291bnRlciBpcyBhdHRhY2hlZCB0byB0aGUKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiBUaGUgJ2dyb3VwX2ZkJyBwYXJhbWV0ZXIgYWxsb3dzIGNvdW50ZXIgImdyb3VwcyIgdG8gYmUgc2V0IHVwLiAgQQogY291bnRlciBncm91cCBoYXMgb25lIGNvdW50ZXIgd2hpY2ggaXMgdGhlIGdyb3VwICJsZWFkZXIiLiAgVGhlIGxlYWRlcgotaXMgY3JlYXRlZCBmaXJzdCwgd2l0aCBncm91cF9mZCA9IC0xIGluIHRoZSBwZXJmX2V2ZW50X29wZW4gY2FsbAoraXMgY3JlYXRlZCBmaXJzdCwgd2l0aCBncm91cF9mZCA9IC0xIGluIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuIGNhbGwKIHRoYXQgY3JlYXRlcyBpdC4gIFRoZSByZXN0IG9mIHRoZSBncm91cCBtZW1iZXJzIGFyZSBjcmVhdGVkCiBzdWJzZXF1ZW50bHksIHdpdGggZ3JvdXBfZmQgZ2l2aW5nIHRoZSBmZCBvZiB0aGUgZ3JvdXAgbGVhZGVyLgogKEEgc2luZ2xlIGNvdW50ZXIgb24gaXRzIG93biBpcyBjcmVhdGVkIHdpdGggZ3JvdXBfZmQgPSAtMSBhbmQgaXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcGVyZi1jb21wbGV0aW9uLnNoIGIvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKaW5kZXggNDk2ZTJhYi4uYWUzYTU3NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKKysrIGIvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQlfX3BlcmZjb21wX2NvbG9uICIkZXZ0cyIgIiRjdXIiCiAJIyBMaXN0IHN1YmNvbW1hbmRzIGZvciAncGVyZiBrdm0nCiAJZWxpZiBbWyAkcHJldiA9PSAia3ZtIiBdXTsgdGhlbgotCQlzdWJjbWRzPSJ0b3AgcmVjb3JkIHJlcG9ydCBkaWZmIGJ1aWxkaWQtbGlzdCBzdGF0IgorCQlzdWJjbWRzPSQoJGNtZCAkcHJldiAtLWxpc3QtY21kcykKIAkJX19wZXJmY29tcF9jb2xvbiAiJHN1YmNtZHMiICIkY3VyIgogCSMgTGlzdCBsb25nIG9wdGlvbiBuYW1lcwogCWVsaWYgW1sgJGN1ciA9PSAtLSogXV07ICB0aGVuCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCmluZGV4IGU4NGZhMjYuLmUxOGE4YjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5oCkBAIC0xMiw2ICsxMiw5IEBACiAjaWZuZGVmIF9fTlJfcGVyZl9ldmVudF9vcGVuCiAjIGRlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbiAzMzYKICNlbmRpZgorI2lmbmRlZiBfX05SX2Z1dGV4CisjIGRlZmluZSBfX05SX2Z1dGV4IDI0MAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoX194ODZfNjRfXykKQEAgLTIzLDYgKzI2LDkgQEAKICNpZm5kZWYgX19OUl9wZXJmX2V2ZW50X29wZW4KICMgZGVmaW5lIF9fTlJfcGVyZl9ldmVudF9vcGVuIDI5OAogI2VuZGlmCisjaWZuZGVmIF9fTlJfZnV0ZXgKKyMgZGVmaW5lIF9fTlJfZnV0ZXggMjAyCisjZW5kaWYKICNlbmRpZgogCiAjaWZkZWYgX19wb3dlcnBjX18KQEAgLTI1MSwxMiArMjU3LDE0IEBACiBlbnVtIHBlcmZfY2FsbF9ncmFwaF9tb2RlIHsKIAlDQUxMQ0hBSU5fTk9ORSwKIAlDQUxMQ0hBSU5fRlAsCi0JQ0FMTENIQUlOX0RXQVJGCisJQ0FMTENIQUlOX0RXQVJGLAorCUNBTExDSEFJTl9NQVgKIH07CiAKIHN0cnVjdCByZWNvcmRfb3B0cyB7CiAJc3RydWN0IHRhcmdldCB0YXJnZXQ7CiAJaW50CSAgICAgY2FsbF9ncmFwaDsKKwlib29sICAgICAgICAgY2FsbF9ncmFwaF9lbmFibGVkOwogCWJvb2wJICAgICBncm91cDsKIAlib29sCSAgICAgaW5oZXJpdF9zdGF0OwogCWJvb2wJICAgICBub19idWZmZXJpbmc7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jIGIvdG9vbHMvcGVyZi90ZXN0cy9idWlsdGluLXRlc3QuYwppbmRleCAxZTY3NDM3Li5iMTFiZjhhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYnVpbHRpbi10ZXN0LmMKQEAgLTExNSw2ICsxMTUsMTQgQEAKIAkJLmRlc2MgPSAiVGVzdCBwYXJzaW5nIHdpdGggbm8gc2FtcGxlX2lkX2FsbCBiaXQgc2V0IiwKIAkJLmZ1bmMgPSB0ZXN0X19wYXJzZV9ub19zYW1wbGVfaWRfYWxsLAogCX0sCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorI2lmZGVmIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKKwl7CisJCS5kZXNjID0gIlRlc3QgZHdhcmYgdW53aW5kIiwKKwkJLmZ1bmMgPSB0ZXN0X19kd2FyZl91bndpbmQsCisJfSwKKyNlbmRpZgorI2VuZGlmCiAJewogCQkuZnVuYyA9IE5VTEwsCiAJfSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvZHdhcmYtdW53aW5kLmMgYi90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTllZTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCkBAIC0wLDAgKzEsMTQ0IEBACisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJ0ZXN0cy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAidW53aW5kLmgiCisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKK3N0YXRpYyBpbnQgbW1hcF9oYW5kbGVyKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX19tYXliZV91bnVzZWQsCisJCQl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fbWF5YmVfdW51c2VkLAorCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJcmV0dXJuIG1hY2hpbmVfX3Byb2Nlc3NfbW1hcF9ldmVudChtYWNoaW5lLCBldmVudCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9saXZlX21hY2hpbmUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJdW5pb24gcGVyZl9ldmVudCBldmVudDsKKwlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKworCXJldHVybiBwZXJmX2V2ZW50X19zeW50aGVzaXplX21tYXBfZXZlbnRzKE5VTEwsICZldmVudCwgcGlkLCBwaWQsCisJCQkJCQkgIG1tYXBfaGFuZGxlciwgbWFjaGluZSwgdHJ1ZSk7Cit9CisKKyNkZWZpbmUgTUFYX1NUQUNLIDYKKworc3RhdGljIGludCB1bndpbmRfZW50cnkoc3RydWN0IHVud2luZF9lbnRyeSAqZW50cnksIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nICpjbnQgPSAodW5zaWduZWQgbG9uZyAqKSBhcmc7CisJY2hhciAqc3ltYm9sID0gZW50cnktPnN5bSA/IGVudHJ5LT5zeW0tPm5hbWUgOiBOVUxMOworCXN0YXRpYyBjb25zdCBjaGFyICpmdW5jc1tNQVhfU1RBQ0tdID0geworCQkidGVzdF9fYXJjaF91bndpbmRfc2FtcGxlIiwKKwkJInVud2luZF90aHJlYWQiLAorCQkia3JhdmFfMyIsCisJCSJrcmF2YV8yIiwKKwkJImtyYXZhXzEiLAorCQkidGVzdF9fZHdhcmZfdW53aW5kIgorCX07CisKKwlpZiAoKmNudCA+PSBNQVhfU1RBQ0spIHsKKwkJcHJfZGVidWcoImZhaWxlZDogY3Jvc3NlZCB0aGUgbWF4IHN0YWNrIHZhbHVlICVkXG4iLCBNQVhfU1RBQ0spOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFzeW1ib2wpIHsKKwkJcHJfZGVidWcoImZhaWxlZDogZ290IHVucmVzb2x2ZWQgYWRkcmVzcyAweCUiIFBSSXg2NCAiXG4iLAorCQkJIGVudHJ5LT5pcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9kZWJ1ZygiZ290OiAlcyAweCUiIFBSSXg2NCAiXG4iLCBzeW1ib2wsIGVudHJ5LT5pcCk7CisJcmV0dXJuIHN0cmNtcCgoY29uc3QgY2hhciAqKSBzeW1ib2wsIGZ1bmNzWygqY250KSsrXSk7Cit9CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitzdGF0aWMgaW50IHVud2luZF90aHJlYWQoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlzdHJ1Y3QgcGVyZl9zYW1wbGUgc2FtcGxlOworCXVuc2lnbmVkIGxvbmcgY250ID0gMDsKKwlpbnQgZXJyID0gLTE7CisKKwltZW1zZXQoJnNhbXBsZSwgMCwgc2l6ZW9mKHNhbXBsZSkpOworCisJaWYgKHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZSgmc2FtcGxlLCB0aHJlYWQpKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gZ2V0IHVud2luZCBzYW1wbGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB1bndpbmRfX2dldF9lbnRyaWVzKHVud2luZF9lbnRyeSwgJmNudCwgbWFjaGluZSwgdGhyZWFkLAorCQkJCSAgJnNhbXBsZSwgTUFYX1NUQUNLKTsKKwlpZiAoZXJyKQorCQlwcl9kZWJ1ZygidW53aW5kIGZhaWxlZFxuIik7CisJZWxzZSBpZiAoY250ICE9IE1BWF9TVEFDSykgeworCQlwcl9kZWJ1ZygiZ290IHdyb25nIG51bWJlciBvZiBzdGFjayBlbnRyaWVzICVsdSAhPSAlZFxuIiwKKwkJCSBjbnQsIE1BWF9TVEFDSyk7CisJCWVyciA9IC0xOworCX0KKworIG91dDoKKwlmcmVlKHNhbXBsZS51c2VyX3N0YWNrLmRhdGEpOworCWZyZWUoc2FtcGxlLnVzZXJfcmVncy5yZWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQorc3RhdGljIGludCBrcmF2YV8zKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJcmV0dXJuIHVud2luZF90aHJlYWQodGhyZWFkLCBtYWNoaW5lKTsKK30KKworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKK3N0YXRpYyBpbnQga3JhdmFfMihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQoreworCXJldHVybiBrcmF2YV8zKHRocmVhZCwgbWFjaGluZSk7Cit9CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitzdGF0aWMgaW50IGtyYXZhXzEoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlyZXR1cm4ga3JhdmFfMih0aHJlYWQsIG1hY2hpbmUpOworfQorCitpbnQgdGVzdF9fZHdhcmZfdW53aW5kKHZvaWQpCit7CisJc3RydWN0IG1hY2hpbmVzIG1hY2hpbmVzOworCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKKwlpbnQgZXJyID0gLTE7CisKKwltYWNoaW5lc19faW5pdCgmbWFjaGluZXMpOworCisJbWFjaGluZSA9IG1hY2hpbmVzX19maW5kKCZtYWNoaW5lcywgSE9TVF9LRVJORUxfSUQpOworCWlmICghbWFjaGluZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBnZXQgbWFjaGluZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW5pdF9saXZlX21hY2hpbmUobWFjaGluZSkpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgaW5pdCBtYWNoaW5lXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHZlcmJvc2UgPiAxKQorCQltYWNoaW5lX19mcHJpbnRmKG1hY2hpbmUsIHN0ZGVycik7CisKKwl0aHJlYWQgPSBtYWNoaW5lX19maW5kX3RocmVhZChtYWNoaW5lLCBnZXRwaWQoKSwgZ2V0cGlkKCkpOworCWlmICghdGhyZWFkKSB7CisJCXByX2VycigiQ291bGQgbm90IGdldCB0aHJlYWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBrcmF2YV8xKHRocmVhZCwgbWFjaGluZSk7CisKKyBvdXQ6CisJbWFjaGluZV9fZGVsZXRlX3RocmVhZHMobWFjaGluZSk7CisJbWFjaGluZV9fZXhpdChtYWNoaW5lKTsKKwltYWNoaW5lc19fZXhpdCgmbWFjaGluZXMpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2xpbmsuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCmluZGV4IDJiNjUxOWUuLjdjY2JjN2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCkBAIC0xMDEsNiArMTAxLDcgQEAKIAkJCS5tbWFwID0gewogCQkJCS5oZWFkZXIgPSB7IC5taXNjID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSLCB9LAogCQkJCS5waWQgPSBmYWtlX21tYXBfaW5mb1tpXS5waWQsCisJCQkJLnRpZCA9IGZha2VfbW1hcF9pbmZvW2ldLnBpZCwKIAkJCQkuc3RhcnQgPSBmYWtlX21tYXBfaW5mb1tpXS5zdGFydCwKIAkJCQkubGVuID0gMHgxMDAwVUxMLAogCQkJCS5wZ29mZiA9IDBVTEwsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL21ha2UgYi90b29scy9wZXJmL3Rlc3RzL21ha2UKaW5kZXggMDA1NDRiOC4uNWRhZWFlMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9tYWtlCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvbWFrZQpAQCAtMjcsNiArMjcsNyBAQAogbWFrZV9ub19kZW1hbmdsZSAgICA6PSBOT19ERU1BTkdMRT0xCiBtYWtlX25vX2xpYmVsZiAgICAgIDo9IE5PX0xJQkVMRj0xCiBtYWtlX25vX2xpYnVud2luZCAgIDo9IE5PX0xJQlVOV0lORD0xCittYWtlX25vX2xpYmR3X2R3YXJmX3Vud2luZCA6PSBOT19MSUJEV19EV0FSRl9VTldJTkQ9MQogbWFrZV9ub19iYWNrdHJhY2UgICA6PSBOT19CQUNLVFJBQ0U9MQogbWFrZV9ub19saWJudW1hICAgICA6PSBOT19MSUJOVU1BPTEKIG1ha2Vfbm9fbGliYXVkaXQgICAgOj0gTk9fTElCQVVESVQ9MQpAQCAtMzUsOCArMzYsOSBAQAogbWFrZV9jc2NvcGUgICAgICAgICA6PSBjc2NvcGUKIG1ha2VfaGVscCAgICAgICAgICAgOj0gaGVscAogbWFrZV9kb2MgICAgICAgICAgICA6PSBkb2MKLW1ha2VfcGVyZl9vICAgICAgICAgOj0gcGVyZi5vCi1tYWtlX3V0aWxfbWFwX28gICAgIDo9IHV0aWwvbWFwLm8KK21ha2VfcGVyZl9vICAgICAgICAgICA6PSBwZXJmLm8KK21ha2VfdXRpbF9tYXBfbyAgICAgICA6PSB1dGlsL21hcC5vCittYWtlX3V0aWxfcG11X2Jpc29uX28gOj0gdXRpbC9wbXUtYmlzb24ubwogbWFrZV9pbnN0YWxsICAgICAgICA6PSBpbnN0YWxsCiBtYWtlX2luc3RhbGxfYmluICAgIDo9IGluc3RhbGwtYmluCiBtYWtlX2luc3RhbGxfZG9jICAgIDo9IGluc3RhbGwtZG9jCkBAIC00OSw2ICs1MSw3IEBACiBtYWtlX21pbmltYWwgICAgICAgIDo9IE5PX0xJQlBFUkw9MSBOT19MSUJQWVRIT049MSBOT19ORVdUPTEgTk9fR1RLMj0xCiBtYWtlX21pbmltYWwgICAgICAgICs9IE5PX0RFTUFOR0xFPTEgTk9fTElCRUxGPTEgTk9fTElCVU5XSU5EPTEgTk9fQkFDS1RSQUNFPTEKIG1ha2VfbWluaW1hbCAgICAgICAgKz0gTk9fTElCTlVNQT0xIE5PX0xJQkFVRElUPTEgTk9fTElCQklPTklDPTEKK21ha2VfbWluaW1hbCAgICAgICAgKz0gTk9fTElCRFdfRFdBUkZfVU5XSU5EPTEKIAogIyAkKHJ1bikgY29udGFpbnMgYWxsIGF2YWlsYWJsZSB0ZXN0cwogcnVuIDo9IG1ha2VfcHVyZQpAQCAtNjUsNiArNjgsNyBAQAogcnVuICs9IG1ha2Vfbm9fZGVtYW5nbGUKIHJ1biArPSBtYWtlX25vX2xpYmVsZgogcnVuICs9IG1ha2Vfbm9fbGlidW53aW5kCitydW4gKz0gbWFrZV9ub19saWJkd19kd2FyZl91bndpbmQKIHJ1biArPSBtYWtlX25vX2JhY2t0cmFjZQogcnVuICs9IG1ha2Vfbm9fbGlibnVtYQogcnVuICs9IG1ha2Vfbm9fbGliYXVkaXQKQEAgLTczLDYgKzc3LDcgQEAKIHJ1biArPSBtYWtlX2RvYwogcnVuICs9IG1ha2VfcGVyZl9vCiBydW4gKz0gbWFrZV91dGlsX21hcF9vCitydW4gKz0gbWFrZV91dGlsX3BtdV9iaXNvbl9vCiBydW4gKz0gbWFrZV9pbnN0YWxsCiBydW4gKz0gbWFrZV9pbnN0YWxsX2JpbgogIyBGSVhNRSAnaW5zdGFsbC0qJyBjb21tZW50ZWQgb3V0IHRpbGwgdGhleSdyZSBmaXhlZApAQCAtMTEzLDggKzExOCw5IEBACiAKIHRlc3RfbWFrZV9weXRob25fcGVyZl9zbyA6PSB0ZXN0IC1mICQoUEVSRikvcHl0aG9uL3BlcmYuc28KIAotdGVzdF9tYWtlX3BlcmZfbyAgICAgOj0gdGVzdCAtZiAkKFBFUkYpL3BlcmYubwotdGVzdF9tYWtlX3V0aWxfbWFwX28gOj0gdGVzdCAtZiAkKFBFUkYpL3V0aWwvbWFwLm8KK3Rlc3RfbWFrZV9wZXJmX28gICAgICAgICAgIDo9IHRlc3QgLWYgJChQRVJGKS9wZXJmLm8KK3Rlc3RfbWFrZV91dGlsX21hcF9vICAgICAgIDo9IHRlc3QgLWYgJChQRVJGKS91dGlsL21hcC5vCit0ZXN0X21ha2VfdXRpbF9wbXVfYmlzb25fbyA6PSB0ZXN0IC1mICQoUEVSRikvdXRpbC9wbXUtYmlzb24ubwogCiBkZWZpbmUgdGVzdF9kZXN0X2ZpbGVzCiAgIGZvciBmaWxlIGluICQoMSk7IGRvCQkJCVwKQEAgLTE2NywxMyArMTczLDEwIEBACiB0ZXN0X21ha2VfaW5zdGFsbF9wZGYgICAgOj0gJCh0ZXN0X29rKQogdGVzdF9tYWtlX2luc3RhbGxfcGRmX08gIDo9ICQodGVzdF9vaykKIAotIyBLYnVpbGQgdGVzdHMgb25seQotI3Rlc3RfbWFrZV9weXRob25fcGVyZl9zb19PIDo9IHRlc3QgLWYgJCRUTVAvdG9vbHMvcGVyZi9weXRob24vcGVyZi5zbwotI3Rlc3RfbWFrZV9wZXJmX29fTyAgICAgICAgIDo9IHRlc3QgLWYgJCRUTVAvdG9vbHMvcGVyZi9wZXJmLm8KLSN0ZXN0X21ha2VfdXRpbF9tYXBfb19PICAgICA6PSB0ZXN0IC1mICQkVE1QL3Rvb2xzL3BlcmYvdXRpbC9tYXAubwotCi10ZXN0X21ha2VfcGVyZl9vX08gICAgIDo9IHRydWUKLXRlc3RfbWFrZV91dGlsX21hcF9vX08gOj0gdHJ1ZQordGVzdF9tYWtlX3B5dGhvbl9wZXJmX3NvX08gICAgOj0gdGVzdCAtZiAkJFRNUF9PL3B5dGhvbi9wZXJmLnNvCit0ZXN0X21ha2VfcGVyZl9vX08gICAgICAgICAgICA6PSB0ZXN0IC1mICQkVE1QX08vcGVyZi5vCit0ZXN0X21ha2VfdXRpbF9tYXBfb19PICAgICAgICA6PSB0ZXN0IC1mICQkVE1QX08vdXRpbC9tYXAubwordGVzdF9tYWtlX3V0aWxfcG11X2Jpc29uX29fTyA6PSB0ZXN0IC1mICQkVE1QX08vdXRpbC9wbXUtYmlzb24ubwogCiB0ZXN0X2RlZmF1bHQgPSB0ZXN0IC14ICQoUEVSRikvcGVyZgogdGVzdCA9ICQoaWYgJCh0ZXN0XyQxKSwkKHRlc3RfJDEpLCQodGVzdF9kZWZhdWx0KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvcGFyc2UtZXZlbnRzLmMgYi90b29scy9wZXJmL3Rlc3RzL3BhcnNlLWV2ZW50cy5jCmluZGV4IDRkYjBhZTYuLjg2MDVmZjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9wYXJzZS1ldmVudHMuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJwYXJzZS1ldmVudHMuaCIKICNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgImV2bGlzdC5oIgotI2luY2x1ZGUgImZzLmgiCisjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CiAjaW5jbHVkZSA8YXBpL2ZzL2RlYnVnZnMuaD4KICNpbmNsdWRlICJ0ZXN0cy5oIgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvc2FtcGxlLXBhcnNpbmcuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvc2FtcGxlLXBhcnNpbmcuYwppbmRleCAxYjY3NzIwLi4wMDE0ZDNjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL3NhbXBsZS1wYXJzaW5nLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9zYW1wbGUtcGFyc2luZy5jCkBAIC0yMiw4ICsyMiw4IEBACiB9IHdoaWxlICgwKQogCiBzdGF0aWMgYm9vbCBzYW1wbGVzX3NhbWUoY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzMSwKLQkJCSBjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnMyLCB1NjQgdHlwZSwgdTY0IHJlZ3NfdXNlciwKLQkJCSB1NjQgcmVhZF9mb3JtYXQpCisJCQkgY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzMiwKKwkJCSB1NjQgdHlwZSwgdTY0IHJlYWRfZm9ybWF0KQogewogCXNpemVfdCBpOwogCkBAIC05NSw4ICs5NSw5IEBACiAJfQogCiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9SRUdTX1VTRVIpIHsKLQkJc2l6ZV90IHN6ID0gaHdlaWdodF9sb25nKHJlZ3NfdXNlcikgKiBzaXplb2YodTY0KTsKKwkJc2l6ZV90IHN6ID0gaHdlaWdodF9sb25nKHMxLT51c2VyX3JlZ3MubWFzaykgKiBzaXplb2YodTY0KTsKIAorCQlDT01QKHVzZXJfcmVncy5tYXNrKTsKIAkJQ09NUCh1c2VyX3JlZ3MuYWJpKTsKIAkJaWYgKHMxLT51c2VyX3JlZ3MuYWJpICYmCiAJCSAgICAoIXMxLT51c2VyX3JlZ3MucmVncyB8fCAhczItPnVzZXJfcmVncy5yZWdzIHx8CkBAIC0xNzQsNiArMTc1LDcgQEAKIAkJLmJyYW5jaF9zdGFjawk9ICZicmFuY2hfc3RhY2suYnJhbmNoX3N0YWNrLAogCQkudXNlcl9yZWdzCT0gewogCQkJLmFiaQk9IFBFUkZfU0FNUExFX1JFR1NfQUJJXzY0LAorCQkJLm1hc2sJPSBzYW1wbGVfcmVnc191c2VyLAogCQkJLnJlZ3MJPSB1c2VyX3JlZ3MsCiAJCX0sCiAJCS51c2VyX3N0YWNrCT0gewpAQCAtMjAxLDggKzIwMyw3IEBACiAJCXNhbXBsZS5yZWFkLm9uZS5pZCAgICA9IDk5OwogCX0KIAotCXN6ID0gcGVyZl9ldmVudF9fc2FtcGxlX2V2ZW50X3NpemUoJnNhbXBsZSwgc2FtcGxlX3R5cGUsCi0JCQkJCSAgIHNhbXBsZV9yZWdzX3VzZXIsIHJlYWRfZm9ybWF0KTsKKwlzeiA9IHBlcmZfZXZlbnRfX3NhbXBsZV9ldmVudF9zaXplKCZzYW1wbGUsIHNhbXBsZV90eXBlLCByZWFkX2Zvcm1hdCk7CiAJYnVmc3ogPSBzeiArIDQwOTY7IC8qIEFkZCBhIGJpdCBmb3Igb3ZlcnJ1biBjaGVja2luZyAqLwogCWV2ZW50ID0gbWFsbG9jKGJ1ZnN6KTsKIAlpZiAoIWV2ZW50KSB7CkBAIC0yMTUsOCArMjE2LDcgQEAKIAlldmVudC0+aGVhZGVyLm1pc2MgPSAwOwogCWV2ZW50LT5oZWFkZXIuc2l6ZSA9IHN6OwogCi0JZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLAotCQkJCQkgICAgc2FtcGxlX3JlZ3NfdXNlciwgcmVhZF9mb3JtYXQsCisJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLCByZWFkX2Zvcm1hdCwKIAkJCQkJICAgICZzYW1wbGUsIGZhbHNlKTsKIAlpZiAoZXJyKSB7CiAJCXByX2RlYnVnKCIlcyBmYWlsZWQgZm9yIHNhbXBsZV90eXBlICUjIlBSSXg2NCIsIGVycm9yICVkXG4iLApAQCAtMjQ0LDggKzI0NCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JaWYgKCFzYW1wbGVzX3NhbWUoJnNhbXBsZSwgJnNhbXBsZV9vdXQsIHNhbXBsZV90eXBlLAotCQkJICBzYW1wbGVfcmVnc191c2VyLCByZWFkX2Zvcm1hdCkpIHsKKwlpZiAoIXNhbXBsZXNfc2FtZSgmc2FtcGxlLCAmc2FtcGxlX291dCwgc2FtcGxlX3R5cGUsIHJlYWRfZm9ybWF0KSkgewogCQlwcl9kZWJ1ZygicGFyc2luZyBmYWlsZWQgZm9yIHNhbXBsZV90eXBlICUjIlBSSXg2NCJcbiIsCiAJCQkgc2FtcGxlX3R5cGUpOwogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy90ZXN0cy5oIGIvdG9vbHMvcGVyZi90ZXN0cy90ZXN0cy5oCmluZGV4IGUwYWM3MTMuLmEyNDc5NWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvdGVzdHMuaAorKysgYi90b29scy9wZXJmL3Rlc3RzL3Rlc3RzLmgKQEAgLTQwLDUgKzQwLDE0IEBACiBpbnQgdGVzdF9fc2FtcGxlX3BhcnNpbmcodm9pZCk7CiBpbnQgdGVzdF9fa2VlcF90cmFja2luZyh2b2lkKTsKIGludCB0ZXN0X19wYXJzZV9ub19zYW1wbGVfaWRfYWxsKHZvaWQpOworaW50IHRlc3RfX2R3YXJmX3Vud2luZCh2b2lkKTsKIAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykKKyNpZmRlZiBIQVZFX0RXQVJGX1VOV0lORF9TVVBQT1JUCitzdHJ1Y3QgdGhyZWFkOworc3RydWN0IHBlcmZfc2FtcGxlOworaW50IHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKKyNlbmRpZgorI2VuZGlmCiAjZW5kaWYgLyogVEVTVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCmluZGV4IGI3MjBiOTIuLjdlYzg3MWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKQEAgLTU4Nyw5NSArNTg3LDUyIEBACiAJYm9vbCBjdXJyZW50X2VudHJ5OwogfTsKIAotc3RhdGljIGludCBfX2hwcF9fY29sb3JfY2FsbGNoYWluKHN0cnVjdCBocHBfYXJnICphcmcpCitzdGF0aWMgaW50IF9faHBwX19vdmVyaGVhZF9jYWxsYmFjayhzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCkKIHsKLQlpZiAoIXN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pCi0JCXJldHVybiAwOwotCi0Jc2xzbWdfcHJpbnRmKCIlYyAiLCBhcmctPmZvbGRlZF9zaWduKTsKLQlyZXR1cm4gMjsKLX0KLQotc3RhdGljIGludCBfX2hwcF9fY29sb3JfZm10KHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCi0JCQkgICAgdTY0ICgqZ2V0X2ZpZWxkKShzdHJ1Y3QgaGlzdF9lbnRyeSAqKSwKLQkJCSAgICBpbnQgKCpjYWxsY2hhaW5fY2IpKHN0cnVjdCBocHBfYXJnICopKQotewotCWludCByZXQgPSAwOwotCWRvdWJsZSBwZXJjZW50ID0gMC4wOwotCXN0cnVjdCBoaXN0cyAqaGlzdHMgPSBoZS0+aGlzdHM7CiAJc3RydWN0IGhwcF9hcmcgKmFyZyA9IGhwcC0+cHRyOwogCi0JaWYgKGhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2QpCi0JCXBlcmNlbnQgPSAxMDAuMCAqIGdldF9maWVsZChoZSkgLyBoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOworCWlmIChhcmctPmN1cnJlbnRfZW50cnkgJiYgYXJnLT5iLT5uYXZrZXlwcmVzc2VkKQorCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9TRUxFQ1RFRCk7CisJZWxzZQorCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9OT1JNQUwpOworCisJaWYgKGZyb250KSB7CisJCWlmICghc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKKwkJCXJldHVybiAwOworCisJCXNsc21nX3ByaW50ZigiJWMgIiwgYXJnLT5mb2xkZWRfc2lnbik7CisJCXJldHVybiAyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faHBwX19jb2xvcl9jYWxsYmFjayhzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCBfX21heWJlX3VudXNlZCkKK3sKKwlzdHJ1Y3QgaHBwX2FyZyAqYXJnID0gaHBwLT5wdHI7CisKKwlpZiAoIWFyZy0+Y3VycmVudF9lbnRyeSB8fCAhYXJnLT5iLT5uYXZrZXlwcmVzc2VkKQorCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9OT1JNQUwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBocHBfYXJnICphcmcgPSBocHAtPnB0cjsKKwlpbnQgcmV0OworCXZhX2xpc3QgYXJnczsKKwlkb3VibGUgcGVyY2VudDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcGVyY2VudCA9IHZhX2FyZyhhcmdzLCBkb3VibGUpOworCXZhX2VuZChhcmdzKTsKIAogCXVpX2Jyb3dzZXJfX3NldF9wZXJjZW50X2NvbG9yKGFyZy0+YiwgcGVyY2VudCwgYXJnLT5jdXJyZW50X2VudHJ5KTsKIAotCWlmIChjYWxsY2hhaW5fY2IpCi0JCXJldCArPSBjYWxsY2hhaW5fY2IoYXJnKTsKLQotCXJldCArPSBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgIiU2LjJmJSUiLCBwZXJjZW50KTsKKwlyZXQgPSBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgZm10LCBwZXJjZW50KTsKIAlzbHNtZ19wcmludGYoIiVzIiwgaHBwLT5idWYpOwogCi0JaWYgKHN5bWJvbF9jb25mLmV2ZW50X2dyb3VwKSB7Ci0JCWludCBwcmV2X2lkeCwgaWR4X2RlbHRhOwotCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBoaXN0c190b19ldnNlbChoaXN0cyk7Ci0JCXN0cnVjdCBoaXN0X2VudHJ5ICpwYWlyOwotCQlpbnQgbnJfbWVtYmVycyA9IGV2c2VsLT5ucl9tZW1iZXJzOwotCi0JCWlmIChucl9tZW1iZXJzIDw9IDEpCi0JCQlnb3RvIG91dDsKLQotCQlwcmV2X2lkeCA9IHBlcmZfZXZzZWxfX2dyb3VwX2lkeChldnNlbCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWlyLCAmaGUtPnBhaXJzLmhlYWQsIHBhaXJzLm5vZGUpIHsKLQkJCXU2NCBwZXJpb2QgPSBnZXRfZmllbGQocGFpcik7Ci0JCQl1NjQgdG90YWwgPSBwYWlyLT5oaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOwotCi0JCQlpZiAoIXRvdGFsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlldnNlbCA9IGhpc3RzX3RvX2V2c2VsKHBhaXItPmhpc3RzKTsKLQkJCWlkeF9kZWx0YSA9IHBlcmZfZXZzZWxfX2dyb3VwX2lkeChldnNlbCkgLSBwcmV2X2lkeCAtIDE7Ci0KLQkJCXdoaWxlIChpZHhfZGVsdGEtLSkgewotCQkJCS8qCi0JCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgaW4gdGhlIG1pZGRsZSB3aGljaAotCQkJCSAqIGhhdmUgbm8gc2FtcGxlCi0JCQkJICovCi0JCQkJdWlfYnJvd3Nlcl9fc2V0X3BlcmNlbnRfY29sb3IoYXJnLT5iLCAwLjAsCi0JCQkJCQkJYXJnLT5jdXJyZW50X2VudHJ5KTsKLQkJCQlyZXQgKz0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsCi0JCQkJCQkgIiAlNi4yZiUlIiwgMC4wKTsKLQkJCQlzbHNtZ19wcmludGYoIiVzIiwgaHBwLT5idWYpOwotCQkJfQotCi0JCQlwZXJjZW50ID0gMTAwLjAgKiBwZXJpb2QgLyB0b3RhbDsKLQkJCXVpX2Jyb3dzZXJfX3NldF9wZXJjZW50X2NvbG9yKGFyZy0+YiwgcGVyY2VudCwKLQkJCQkJCSAgICAgIGFyZy0+Y3VycmVudF9lbnRyeSk7Ci0JCQlyZXQgKz0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsCi0JCQkJCSAiICU2LjJmJSUiLCBwZXJjZW50KTsKLQkJCXNsc21nX3ByaW50ZigiJXMiLCBocHAtPmJ1Zik7Ci0KLQkJCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKLQkJfQotCi0JCWlkeF9kZWx0YSA9IG5yX21lbWJlcnMgLSBwcmV2X2lkeCAtIDE7Ci0KLQkJd2hpbGUgKGlkeF9kZWx0YS0tKSB7Ci0JCQkvKgotCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgYXQgbGFzdCB3aGljaCBoYXZlIG5vIHNhbXBsZQotCQkJICovCi0JCQl1aV9icm93c2VyX19zZXRfcGVyY2VudF9jb2xvcihhcmctPmIsIDAuMCwKLQkJCQkJCSAgICAgIGFyZy0+Y3VycmVudF9lbnRyeSk7Ci0JCQlyZXQgKz0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsCi0JCQkJCSAiICU2LjJmJSUiLCAwLjApOwotCQkJc2xzbWdfcHJpbnRmKCIlcyIsIGhwcC0+YnVmKTsKLQkJfQotCX0KLW91dDoKLQlpZiAoIWFyZy0+Y3VycmVudF9lbnRyeSB8fCAhYXJnLT5iLT5uYXZrZXlwcmVzc2VkKQotCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9OT1JNQUwpOwotCisJYWR2YW5jZV9ocHAoaHBwLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY5MCwxNCArNjQ3LDE1IEBACiAJCQkJc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXAogCQkJCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSkJCQlcCiB7CQkJCQkJCQkJXAotCXJldHVybiBfX2hwcF9fY29sb3JfZm10KGhwcCwgaGUsIF9faHBwX2dldF8jI19maWVsZCwgX2NiKTsJXAorCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIF9faHBwX2dldF8jI19maWVsZCwgX2NiLCAiICU2LjJmJSUiLAlcCisJCQkgIF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYsIHRydWUpOwkJXAogfQogCi1fX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkLCBwZXJpb2QsIF9faHBwX19jb2xvcl9jYWxsY2hhaW4pCi1fX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX3N5cywgcGVyaW9kX3N5cywgTlVMTCkKLV9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfdXMsIHBlcmlvZF91cywgTlVMTCkKLV9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfZ3Vlc3Rfc3lzLCBwZXJpb2RfZ3Vlc3Rfc3lzLCBOVUxMKQotX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF9ndWVzdF91cywgcGVyaW9kX2d1ZXN0X3VzLCBOVUxMKQorX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZCwgcGVyaW9kLCBfX2hwcF9fb3ZlcmhlYWRfY2FsbGJhY2spCitfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX3N5cywgcGVyaW9kX3N5cywgX19ocHBfX2NvbG9yX2NhbGxiYWNrKQorX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF91cywgcGVyaW9kX3VzLCBfX2hwcF9fY29sb3JfY2FsbGJhY2spCitfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX2d1ZXN0X3N5cywgcGVyaW9kX2d1ZXN0X3N5cywgX19ocHBfX2NvbG9yX2NhbGxiYWNrKQorX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF9ndWVzdF91cywgcGVyaW9kX2d1ZXN0X3VzLCBfX2hwcF9fY29sb3JfY2FsbGJhY2spCiAKICN1bmRlZiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMgYi90b29scy9wZXJmL3VpL2d0ay9oaXN0cy5jCmluZGV4IDViOTVjNDQuLmUzOTVlZjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMKKysrIGIvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYwpAQCAtOCwxNiArOCwyNCBAQAogCiAjZGVmaW5lIE1BWF9DT0xVTU5TCQkJMzIKIAotc3RhdGljIGludCBfX3BlcmNlbnRfY29sb3Jfc25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgZG91YmxlIHBlcmNlbnQpCitzdGF0aWMgaW50IF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJaW50IHJldCA9IDA7CisJdmFfbGlzdCBhcmdzOworCWRvdWJsZSBwZXJjZW50OwogCWNvbnN0IGNoYXIgKm1hcmt1cDsKKwljaGFyICpidWYgPSBocHAtPmJ1ZjsKKwlzaXplX3Qgc2l6ZSA9IGhwcC0+c2l6ZTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcGVyY2VudCA9IHZhX2FyZyhhcmdzLCBkb3VibGUpOworCXZhX2VuZChhcmdzKTsKIAogCW1hcmt1cCA9IHBlcmZfZ3RrX19nZXRfcGVyY2VudF9jb2xvcihwZXJjZW50KTsKIAlpZiAobWFya3VwKQogCQlyZXQgKz0gc2NucHJpbnRmKGJ1Ziwgc2l6ZSwgbWFya3VwKTsKIAotCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBzaXplIC0gcmV0LCAiICU2LjJmJSUiLCBwZXJjZW50KTsKKwlyZXQgKz0gc2NucHJpbnRmKGJ1ZiArIHJldCwgc2l6ZSAtIHJldCwgZm10LCBwZXJjZW50KTsKIAogCWlmIChtYXJrdXApCiAJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBzaXplIC0gcmV0LCAiPC9zcGFuPiIpOwpAQCAtMjUsNjYgKzMzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyBpbnQgX19ocHBfX2NvbG9yX2ZtdChzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAotCQkJICAgIHU2NCAoKmdldF9maWVsZCkoc3RydWN0IGhpc3RfZW50cnkgKikpCi17Ci0JaW50IHJldDsKLQlkb3VibGUgcGVyY2VudCA9IDAuMDsKLQlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gaGUtPmhpc3RzOwotCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKTsKLQotCWlmIChoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kKQotCQlwZXJjZW50ID0gMTAwLjAgKiBnZXRfZmllbGQoaGUpIC8gaGlzdHMtPnN0YXRzLnRvdGFsX3BlcmlvZDsKLQotCXJldCA9IF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZihocHAtPmJ1ZiwgaHBwLT5zaXplLCBwZXJjZW50KTsKLQotCWlmIChwZXJmX2V2c2VsX19pc19ncm91cF9ldmVudChldnNlbCkpIHsKLQkJaW50IHByZXZfaWR4LCBpZHhfZGVsdGE7Ci0JCXN0cnVjdCBoaXN0X2VudHJ5ICpwYWlyOwotCQlpbnQgbnJfbWVtYmVycyA9IGV2c2VsLT5ucl9tZW1iZXJzOwotCi0JCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhaXIsICZoZS0+cGFpcnMuaGVhZCwgcGFpcnMubm9kZSkgewotCQkJdTY0IHBlcmlvZCA9IGdldF9maWVsZChwYWlyKTsKLQkJCXU2NCB0b3RhbCA9IHBhaXItPmhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2Q7Ci0KLQkJCWV2c2VsID0gaGlzdHNfdG9fZXZzZWwocGFpci0+aGlzdHMpOwotCQkJaWR4X2RlbHRhID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKSAtIHByZXZfaWR4IC0gMTsKLQotCQkJd2hpbGUgKGlkeF9kZWx0YS0tKSB7Ci0JCQkJLyoKLQkJCQkgKiB6ZXJvLWZpbGwgZ3JvdXAgbWVtYmVycyBpbiB0aGUgbWlkZGxlIHdoaWNoCi0JCQkJICogaGF2ZSBubyBzYW1wbGUKLQkJCQkgKi8KLQkJCQlyZXQgKz0gX19wZXJjZW50X2NvbG9yX3NucHJpbnRmKGhwcC0+YnVmICsgcmV0LAotCQkJCQkJCQlocHAtPnNpemUgLSByZXQsCi0JCQkJCQkJCTAuMCk7Ci0JCQl9Ci0KLQkJCXBlcmNlbnQgPSAxMDAuMCAqIHBlcmlvZCAvIHRvdGFsOwotCQkJcmV0ICs9IF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZihocHAtPmJ1ZiArIHJldCwKLQkJCQkJCQlocHAtPnNpemUgLSByZXQsCi0JCQkJCQkJcGVyY2VudCk7Ci0KLQkJCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKLQkJfQotCi0JCWlkeF9kZWx0YSA9IG5yX21lbWJlcnMgLSBwcmV2X2lkeCAtIDE7Ci0KLQkJd2hpbGUgKGlkeF9kZWx0YS0tKSB7Ci0JCQkvKgotCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgYXQgbGFzdCB3aGljaCBoYXZlIG5vIHNhbXBsZQotCQkJICovCi0JCQlyZXQgKz0gX19wZXJjZW50X2NvbG9yX3NucHJpbnRmKGhwcC0+YnVmICsgcmV0LAotCQkJCQkJCWhwcC0+c2l6ZSAtIHJldCwKLQkJCQkJCQkwLjApOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KICNkZWZpbmUgX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXAogc3RhdGljIHU2NCBoZV9nZXRfIyNfZmllbGQoc3RydWN0IGhpc3RfZW50cnkgKmhlKQkJCQlcCiB7CQkJCQkJCQkJCVwKQEAgLTk1LDcgKzQzLDggQEAKIAkJCQkgICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXAogCQkJCSAgICAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCQkJXAogewkJCQkJCQkJCQlcCi0JcmV0dXJuIF9faHBwX19jb2xvcl9mbXQoaHBwLCBoZSwgaGVfZ2V0XyMjX2ZpZWxkKTsJCQlcCisJcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgaGVfZ2V0XyMjX2ZpZWxkLCBOVUxMLCAiICU2LjJmJSUiLAkJXAorCQkJICBfX3BlcmNlbnRfY29sb3Jfc25wcmludGYsIHRydWUpOwkJCVwKIH0KIAogX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZCwgcGVyaW9kKQpAQCAtMjE2LDcgKzE2NSw2IEBACiAJc3RydWN0IHBlcmZfaHBwIGhwcCA9IHsKIAkJLmJ1ZgkJPSBzLAogCQkuc2l6ZQkJPSBzaXplb2YocyksCi0JCS5wdHIJCT0gaGlzdHNfdG9fZXZzZWwoaGlzdHMpLAogCX07CiAKIAlucl9jb2xzID0gMDsKQEAgLTI0Myw3ICsxOTEsNyBAQAogCWNvbF9pZHggPSAwOwogCiAJcGVyZl9ocHBfX2Zvcl9lYWNoX2Zvcm1hdChmbXQpIHsKLQkJZm10LT5oZWFkZXIoZm10LCAmaHBwKTsKKwkJZm10LT5oZWFkZXIoZm10LCAmaHBwLCBoaXN0c190b19ldnNlbChoaXN0cykpOwogCiAJCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFVyh2aWV3KSwKIAkJCQkJCQkgICAgLTEsIGx0cmltKHMpLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9oaXN0LmMgYi90b29scy9wZXJmL3VpL2hpc3QuYwppbmRleCA3OGY0YzkyLi4wZjQwM2I4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL2hpc3QuYwpAQCAtOCwxNiArOCwyNyBAQAogCiAvKiBoaXN0IHBlcmlvZCBwcmludCAoaHBwKSBmdW5jdGlvbnMgKi8KIAotdHlwZWRlZiBpbnQgKCpocHBfc25wcmludF9mbikoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSBocHBfX2NhbGxfcHJpbnRfZm4oaHBwLCBmbiwgZm10LCAuLi4pCQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgX19yZXQgPSBmbihocHAsIGZtdCwgIyNfX1ZBX0FSR1NfXyk7CQlcCisJYWR2YW5jZV9ocHAoaHBwLCBfX3JldCk7CQkJCVwKKwlfX3JldDsJCQkJCQkJXAorfSkKIAotc3RhdGljIGludCBfX2hwcF9fZm10KHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCi0JCSAgICAgIHU2NCAoKmdldF9maWVsZCkoc3RydWN0IGhpc3RfZW50cnkgKiksCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sCi0JCSAgICAgIGJvb2wgZm10X3BlcmNlbnQpCitpbnQgX19ocHBfX2ZtdChzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAorCSAgICAgICBocHBfZmllbGRfZm4gZ2V0X2ZpZWxkLCBocHBfY2FsbGJhY2tfZm4gY2FsbGJhY2ssCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sIGJvb2wgZm10X3BlcmNlbnQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gaGUtPmhpc3RzOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKTsKKwljaGFyICpidWYgPSBocHAtPmJ1ZjsKKwlzaXplX3Qgc2l6ZSA9IGhwcC0+c2l6ZTsKKworCWlmIChjYWxsYmFjaykgeworCQlyZXQgPSBjYWxsYmFjayhocHAsIHRydWUpOworCQlhZHZhbmNlX2hwcChocHAsIHJldCk7CisJfQogCiAJaWYgKGZtdF9wZXJjZW50KSB7CiAJCWRvdWJsZSBwZXJjZW50ID0gMC4wOwpAQCAtMjYsOSArMzcsOSBAQAogCQkJcGVyY2VudCA9IDEwMC4wICogZ2V0X2ZpZWxkKGhlKSAvCiAJCQkJICBoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOwogCi0JCXJldCA9IHByaW50X2ZuKGhwcC0+YnVmLCBocHAtPnNpemUsIGZtdCwgcGVyY2VudCk7CisJCXJldCArPSBocHBfX2NhbGxfcHJpbnRfZm4oaHBwLCBwcmludF9mbiwgZm10LCBwZXJjZW50KTsKIAl9IGVsc2UKLQkJcmV0ID0gcHJpbnRfZm4oaHBwLT5idWYsIGhwcC0+c2l6ZSwgZm10LCBnZXRfZmllbGQoaGUpKTsKKwkJcmV0ICs9IGhwcF9fY2FsbF9wcmludF9mbihocHAsIHByaW50X2ZuLCBmbXQsIGdldF9maWVsZChoZSkpOwogCiAJaWYgKHBlcmZfZXZzZWxfX2lzX2dyb3VwX2V2ZW50KGV2c2VsKSkgewogCQlpbnQgcHJldl9pZHgsIGlkeF9kZWx0YTsKQEAgLTUyLDE2ICs2MywyMiBAQAogCQkJCSAqIHplcm8tZmlsbCBncm91cCBtZW1iZXJzIGluIHRoZSBtaWRkbGUgd2hpY2gKIAkJCQkgKiBoYXZlIG5vIHNhbXBsZQogCQkJCSAqLwotCQkJCXJldCArPSBwcmludF9mbihocHAtPmJ1ZiArIHJldCwgaHBwLT5zaXplIC0gcmV0LAotCQkJCQkJZm10LCAwKTsKKwkJCQlpZiAoZm10X3BlcmNlbnQpIHsKKwkJCQkJcmV0ICs9IGhwcF9fY2FsbF9wcmludF9mbihocHAsIHByaW50X2ZuLAorCQkJCQkJCQkgIGZtdCwgMC4wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXQgKz0gaHBwX19jYWxsX3ByaW50X2ZuKGhwcCwgcHJpbnRfZm4sCisJCQkJCQkJCSAgZm10LCAwVUxMKTsKKwkJCQl9CiAJCQl9CiAKLQkJCWlmIChmbXRfcGVyY2VudCkKLQkJCQlyZXQgKz0gcHJpbnRfZm4oaHBwLT5idWYgKyByZXQsIGhwcC0+c2l6ZSAtIHJldCwKLQkJCQkJCWZtdCwgMTAwLjAgKiBwZXJpb2QgLyB0b3RhbCk7Ci0JCQllbHNlCi0JCQkJcmV0ICs9IHByaW50X2ZuKGhwcC0+YnVmICsgcmV0LCBocHAtPnNpemUgLSByZXQsCi0JCQkJCQlmbXQsIHBlcmlvZCk7CisJCQlpZiAoZm10X3BlcmNlbnQpIHsKKwkJCQlyZXQgKz0gaHBwX19jYWxsX3ByaW50X2ZuKGhwcCwgcHJpbnRfZm4sIGZtdCwKKwkJCQkJCQkgIDEwMC4wICogcGVyaW9kIC8gdG90YWwpOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgKz0gaHBwX19jYWxsX3ByaW50X2ZuKGhwcCwgcHJpbnRfZm4sIGZtdCwKKwkJCQkJCQkgIHBlcmlvZCk7CisJCQl9CiAKIAkJCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKIAkJfQpAQCAtNzIsNDEgKzg5LDg3IEBACiAJCQkvKgogCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgYXQgbGFzdCB3aGljaCBoYXZlIG5vIHNhbXBsZQogCQkJICovCi0JCQlyZXQgKz0gcHJpbnRfZm4oaHBwLT5idWYgKyByZXQsIGhwcC0+c2l6ZSAtIHJldCwKLQkJCQkJZm10LCAwKTsKKwkJCWlmIChmbXRfcGVyY2VudCkgeworCQkJCXJldCArPSBocHBfX2NhbGxfcHJpbnRfZm4oaHBwLCBwcmludF9mbiwKKwkJCQkJCQkgIGZtdCwgMC4wKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ICs9IGhwcF9fY2FsbF9wcmludF9mbihocHAsIHByaW50X2ZuLAorCQkJCQkJCSAgZm10LCAwVUxMKTsKKwkJCX0KIAkJfQogCX0KKworCWlmIChjYWxsYmFjaykgeworCQlpbnQgX19yZXQgPSBjYWxsYmFjayhocHAsIGZhbHNlKTsKKworCQlhZHZhbmNlX2hwcChocHAsIF9fcmV0KTsKKwkJcmV0ICs9IF9fcmV0OworCX0KKworCS8qCisJICogUmVzdG9yZSBvcmlnaW5hbCBidWYgYW5kIHNpemUgYXMgaXQncyB3aGVyZSBjYWxsZXIgZXhwZWN0cworCSAqIHRoZSByZXN1bHQgd2lsbCBiZSBzYXZlZC4KKwkgKi8KKwlocHAtPmJ1ZiA9IGJ1ZjsKKwlocHAtPnNpemUgPSBzaXplOworCiAJcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBfX0hQUF9IRUFERVJfRk4oX3R5cGUsIF9zdHIsIF9taW5fd2lkdGgsIF91bml0X3dpZHRoKSAJCVwKIHN0YXRpYyBpbnQgaHBwX19oZWFkZXJfIyNfdHlwZShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQgX19tYXliZV91bnVzZWQsCVwKLQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCkJCQlcCisJCQkgICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXAorCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkJCVwKIHsJCQkJCQkJCQlcCiAJaW50IGxlbiA9IF9taW5fd2lkdGg7CQkJCQkJXAogCQkJCQkJCQkJXAotCWlmIChzeW1ib2xfY29uZi5ldmVudF9ncm91cCkgewkJCQkJXAotCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBocHAtPnB0cjsJCQlcCi0JCQkJCQkJCQlcCisJaWYgKHN5bWJvbF9jb25mLmV2ZW50X2dyb3VwKQkJCQkJXAogCQlsZW4gPSBtYXgobGVuLCBldnNlbC0+bnJfbWVtYmVycyAqIF91bml0X3dpZHRoKTsJXAotCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKIAlyZXR1cm4gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsICIlKnMiLCBsZW4sIF9zdHIpOwlcCiB9CiAKICNkZWZpbmUgX19IUFBfV0lEVEhfRk4oX3R5cGUsIF9taW5fd2lkdGgsIF91bml0X3dpZHRoKSAJCQlcCiBzdGF0aWMgaW50IGhwcF9fd2lkdGhfIyNfdHlwZShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQgX19tYXliZV91bnVzZWQsCVwKLQkJCSAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwIF9fbWF5YmVfdW51c2VkKQlcCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCBfX21heWJlX3VudXNlZCwJXAorCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQkJCVwKIHsJCQkJCQkJCQlcCiAJaW50IGxlbiA9IF9taW5fd2lkdGg7CQkJCQkJXAogCQkJCQkJCQkJXAotCWlmIChzeW1ib2xfY29uZi5ldmVudF9ncm91cCkgewkJCQkJXAotCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBocHAtPnB0cjsJCQlcCi0JCQkJCQkJCQlcCisJaWYgKHN5bWJvbF9jb25mLmV2ZW50X2dyb3VwKQkJCQkJXAogCQlsZW4gPSBtYXgobGVuLCBldnNlbC0+bnJfbWVtYmVycyAqIF91bml0X3dpZHRoKTsJXAotCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKIAlyZXR1cm4gbGVuOwkJCQkJCQlcCiB9CiAKK3N0YXRpYyBpbnQgaHBwX2NvbG9yX3NjbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXNzaXplX3Qgc3NpemUgPSBocHAtPnNpemU7CisJZG91YmxlIHBlcmNlbnQ7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcGVyY2VudCA9IHZhX2FyZyhhcmdzLCBkb3VibGUpOworCXJldCA9IHZhbHVlX2NvbG9yX3NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsIGZtdCwgcGVyY2VudCk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChyZXQgPj0gc3NpemUpID8gKHNzaXplIC0gMSkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHBwX2VudHJ5X3NjbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXNzaXplX3Qgc3NpemUgPSBocHAtPnNpemU7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0ID0gdnNucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChyZXQgPj0gc3NpemUpID8gKHNzaXplIC0gMSkgOiByZXQ7Cit9CisKICNkZWZpbmUgX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXAogc3RhdGljIHU2NCBoZV9nZXRfIyNfZmllbGQoc3RydWN0IGhpc3RfZW50cnkgKmhlKQkJCQlcCiB7CQkJCQkJCQkJCVwKQEAgLTExNiw4ICsxNzksOCBAQAogc3RhdGljIGludCBocHBfX2NvbG9yXyMjX3R5cGUoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10IF9fbWF5YmVfdW51c2VkLAkJXAogCQkJICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkgCVwKIHsJCQkJCQkJCQkJXAotCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIGhlX2dldF8jI19maWVsZCwgIiAlNi4yZiUlIiwJCQlcCi0JCQkgIHBlcmNlbnRfY29sb3Jfc25wcmludGYsIHRydWUpOwkJCVwKKwlyZXR1cm4gX19ocHBfX2ZtdChocHAsIGhlLCBoZV9nZXRfIyNfZmllbGQsIE5VTEwsICIgJTYuMmYlJSIsCQlcCisJCQkgIGhwcF9jb2xvcl9zY25wcmludGYsIHRydWUpOwkJCQlcCiB9CiAKICNkZWZpbmUgX19IUFBfRU5UUllfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXApAQCAtMTI1LDggKzE4OCw4IEBACiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlKSAJXAogewkJCQkJCQkJCQlcCiAJY29uc3QgY2hhciAqZm10ID0gc3ltYm9sX2NvbmYuZmllbGRfc2VwID8gIiAlLjJmIiA6ICIgJTYuMmYlJSI7CQlcCi0JcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgaGVfZ2V0XyMjX2ZpZWxkLCBmbXQsCQkJXAotCQkJICBzY25wcmludGYsIHRydWUpOwkJCQkJXAorCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIGhlX2dldF8jI19maWVsZCwgTlVMTCwgZm10LAkJCVwKKwkJCSAgaHBwX2VudHJ5X3NjbnByaW50ZiwgdHJ1ZSk7CQkJCVwKIH0KIAogI2RlZmluZSBfX0hQUF9FTlRSWV9SQVdfRk4oX3R5cGUsIF9maWVsZCkJCQkJCVwKQEAgLTEzOSw3ICsyMDIsOCBAQAogCQkJICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkgCVwKIHsJCQkJCQkJCQkJXAogCWNvbnN0IGNoYXIgKmZtdCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcCA/ICIgJSJQUkl1NjQgOiAiICUxMSJQUkl1NjQ7CVwKLQlyZXR1cm4gX19ocHBfX2ZtdChocHAsIGhlLCBoZV9nZXRfcmF3XyMjX2ZpZWxkLCBmbXQsIHNjbnByaW50ZiwgZmFsc2UpOwlcCisJcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgaGVfZ2V0X3Jhd18jI19maWVsZCwgTlVMTCwgZm10LAkJXAorCQkJICBocHBfZW50cnlfc2NucHJpbnRmLCBmYWxzZSk7CQkJCVwKIH0KIAogI2RlZmluZSBIUFBfUEVSQ0VOVF9GTlMoX3R5cGUsIF9zdHIsIF9maWVsZCwgX21pbl93aWR0aCwgX3VuaXRfd2lkdGgpCVwKQEAgLTI2MywxNSArMzI3LDEzIEBACiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwogCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKIAlpbnQgaSA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IHBlcmZfaHBwIGR1bW15X2hwcCA9IHsKLQkJLnB0cgk9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKSwKLQl9OworCXN0cnVjdCBwZXJmX2hwcCBkdW1teV9ocHA7CiAKIAlwZXJmX2hwcF9fZm9yX2VhY2hfZm9ybWF0KGZtdCkgewogCQlpZiAoaSkKIAkJCXJldCArPSAyOwogCi0JCXJldCArPSBmbXQtPndpZHRoKGZtdCwgJmR1bW15X2hwcCk7CisJCXJldCArPSBmbXQtPndpZHRoKGZtdCwgJmR1bW15X2hwcCwgaGlzdHNfdG9fZXZzZWwoaGlzdHMpKTsKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwppbmRleCA4MzFmYmI3Li5kNTk4OTNlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwpAQCAtMzA2LDEyICszMDYsNiBAQAogCXJldHVybiBoaXN0X2VudHJ5X2NhbGxjaGFpbl9fZnByaW50ZihoZSwgdG90YWxfcGVyaW9kLCBsZWZ0X21hcmdpbiwgZnApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9ocHAoc3RydWN0IHBlcmZfaHBwICpocHAsIGludCBpbmMpCi17Ci0JaHBwLT5idWYgICs9IGluYzsKLQlocHAtPnNpemUgLT0gaW5jOwotfQotCiBzdGF0aWMgaW50IGhpc3RfZW50cnlfX3BlcmlvZF9zbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKIAkJCQkgICAgICAgc3RydWN0IGhpc3RfZW50cnkgKmhlKQogewpAQCAtMzg1LDcgKzM3OSw2IEBACiAJc3RydWN0IHBlcmZfaHBwIGR1bW15X2hwcCA9IHsKIAkJLmJ1Zgk9IGJmLAogCQkuc2l6ZQk9IHNpemVvZihiZiksCi0JCS5wdHIJPSBoaXN0c190b19ldnNlbChoaXN0cyksCiAJfTsKIAlib29sIGZpcnN0ID0gdHJ1ZTsKIAlzaXplX3QgbGluZXN6OwpAQCAtNDA0LDcgKzM5Nyw3IEBACiAJCWVsc2UKIAkJCWZpcnN0ID0gZmFsc2U7CiAKLQkJZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwKTsKKwkJZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0c190b19ldnNlbChoaXN0cykpOwogCQlmcHJpbnRmKGZwLCAiJXMiLCBiZik7CiAJfQogCkBAIC00NDksNyArNDQyLDcgQEAKIAkJZWxzZQogCQkJZmlyc3QgPSBmYWxzZTsKIAotCQl3aWR0aCA9IGZtdC0+d2lkdGgoZm10LCAmZHVtbXlfaHBwKTsKKwkJd2lkdGggPSBmbXQtPndpZHRoKGZtdCwgJmR1bW15X2hwcCwgaGlzdHNfdG9fZXZzZWwoaGlzdHMpKTsKIAkJZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCiAJCQlmcHJpbnRmKGZwLCAiLiIpOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKaW5kZXggM2FhNTU1Zi4uODA5YjRjNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKQEAgLTEyMzYsNiArMTIzNiw3IEBACiAJc3RydWN0IGRzbyAqZHNvID0gbWFwLT5kc287CiAJY2hhciAqZmlsZW5hbWU7CiAJY29uc3QgY2hhciAqZF9maWxlbmFtZTsKKwljb25zdCBjaGFyICpldnNlbF9uYW1lID0gcGVyZl9ldnNlbF9fbmFtZShldnNlbCk7CiAJc3RydWN0IGFubm90YXRpb24gKm5vdGVzID0gc3ltYm9sX19hbm5vdGF0aW9uKHN5bSk7CiAJc3RydWN0IGRpc2FzbV9saW5lICpwb3MsICpxdWV1ZSA9IE5VTEw7CiAJdTY0IHN0YXJ0ID0gbWFwX19yaXBfMm9iamR1bXAobWFwLCBzeW0tPnN0YXJ0KTsKQEAgLTEyNDMsNyArMTI0NCw3IEBACiAJaW50IG1vcmUgPSAwOwogCXU2NCBsZW47CiAJaW50IHdpZHRoID0gODsKLQlpbnQgbmFtZWxlbjsKKwlpbnQgbmFtZWxlbiwgZXZzZWxfbmFtZV9sZW4sIGdyYXBoX2RvdHRlZF9sZW47CiAKIAlmaWxlbmFtZSA9IHN0cmR1cChkc28tPmxvbmdfbmFtZSk7CiAJaWYgKCFmaWxlbmFtZSkKQEAgLTEyNTYsMTQgKzEyNTcsMTcgQEAKIAogCWxlbiA9IHN5bWJvbF9fc2l6ZShzeW0pOwogCW5hbWVsZW4gPSBzdHJsZW4oZF9maWxlbmFtZSk7CisJZXZzZWxfbmFtZV9sZW4gPSBzdHJsZW4oZXZzZWxfbmFtZSk7CiAKIAlpZiAocGVyZl9ldnNlbF9faXNfZ3JvdXBfZXZlbnQoZXZzZWwpKQogCQl3aWR0aCAqPSBldnNlbC0+bnJfbWVtYmVyczsKIAotCXByaW50ZigiICUtKi4qc3wJU291cmNlIGNvZGUgJiBEaXNhc3NlbWJseSBvZiAlc1xuIiwKLQkgICAgICAgd2lkdGgsIHdpZHRoLCAiUGVyY2VudCIsIGRfZmlsZW5hbWUpOwotCXByaW50ZigiLSUtKi4qcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsCi0JICAgICAgIHdpZHRoK25hbWVsZW4sIHdpZHRoK25hbWVsZW4sIGdyYXBoX2RvdHRlZF9saW5lKTsKKwlwcmludGYoIiAlLSouKnN8CVNvdXJjZSBjb2RlICYgRGlzYXNzZW1ibHkgb2YgJXMgZm9yICVzXG4iLAorCSAgICAgICB3aWR0aCwgd2lkdGgsICJQZXJjZW50IiwgZF9maWxlbmFtZSwgZXZzZWxfbmFtZSk7CisKKwlncmFwaF9kb3R0ZWRfbGVuID0gd2lkdGggKyBuYW1lbGVuICsgZXZzZWxfbmFtZV9sZW47CisJcHJpbnRmKCItJS0qLipzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsCisJICAgICAgIGdyYXBoX2RvdHRlZF9sZW4sIGdyYXBoX2RvdHRlZF9sZW4sIGdyYXBoX2RvdHRlZF9saW5lKTsKIAogCWlmICh2ZXJib3NlKQogCQlzeW1ib2xfX2Fubm90YXRlX2hpdHMoc3ltLCBldnNlbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3B1bWFwLmMgYi90b29scy9wZXJmL3V0aWwvY3B1bWFwLmMKaW5kZXggYTliNDhjNC4uN2ZlNDk5NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NwdW1hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jcHVtYXAuYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlICJ1dGlsLmgiCi0jaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlICIuLi9wZXJmLmgiCiAjaW5jbHVkZSAiY3B1bWFwLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHNvLmMgYi90b29scy9wZXJmL3V0aWwvZHNvLmMKaW5kZXggNDA0NWQwOC4uNjQ0NTNkNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Rzby5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kc28uYwpAQCAtNDUsOCArNDUsOCBAQAogCQkJZGVidWdsaW5rLS07CiAJCWlmICgqZGVidWdsaW5rID09ICcvJykKIAkJCWRlYnVnbGluaysrOwotCQlmaWxlbmFtZV9fcmVhZF9kZWJ1Z2xpbmsoZHNvLT5sb25nX25hbWUsIGRlYnVnbGluaywKLQkJCQkJIHNpemUgLSAoZGVidWdsaW5rIC0gZmlsZW5hbWUpKTsKKwkJcmV0ID0gZmlsZW5hbWVfX3JlYWRfZGVidWdsaW5rKGRzby0+bG9uZ19uYW1lLCBkZWJ1Z2xpbmssCisJCQkJCSAgICAgICBzaXplIC0gKGRlYnVnbGluayAtIGZpbGVuYW1lKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBEU09fQklOQVJZX1RZUEVfX0JVSUxEX0lEX0NBQ0hFOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rzby5oIGIvdG9vbHMvcGVyZi91dGlsL2Rzby5oCmluZGV4IGNkN2Q2ZjAuLmFiMDZmMWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kc28uaAorKysgYi90b29scy9wZXJmL3V0aWwvZHNvLmgKQEAgLTEwMiw2ICsxMDIsMTYgQEAKIAljaGFyCQkgbmFtZVswXTsKIH07CiAKKy8qIGRzb19fZm9yX2VhY2hfc3ltYm9sIC0gaXRlcmF0ZSBvdmVyIHRoZSBzeW1ib2xzIG9mIGdpdmVuIHR5cGUKKyAqCisgKiBAZHNvOiB0aGUgJ3N0cnVjdCBkc28gKicgaW4gd2hpY2ggc3ltYm9scyBpdGVyZWF0ZWQKKyAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG46IHRoZSAnc3RydWN0IHJiX25vZGUgKicgdG8gdXNlIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEB0eXBlOiB0aGUgJ2VudW0gbWFwX3R5cGUnIHR5cGUgb2Ygc3ltYm9scworICovCisjZGVmaW5lIGRzb19fZm9yX2VhY2hfc3ltYm9sKGRzbywgcG9zLCBuLCB0eXBlKQlcCisJc3ltYm9sc19fZm9yX2VhY2hfZW50cnkoJihkc28pLT5zeW1ib2xzWyh0eXBlKV0sIHBvcywgbikKKwogc3RhdGljIGlubGluZSB2b2lkIGRzb19fc2V0X2xvYWRlZChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlkc28tPmxvYWRlZCB8PSAoMSA8PCB0eXBlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKaW5kZXggYjBmM2NhOC4uOWQxMmFhNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaGlzdC5oIgogI2luY2x1ZGUgIm1hY2hpbmUuaCIKICNpbmNsdWRlICJzb3J0LmgiCiAjaW5jbHVkZSAic3RyaW5nLmgiCkBAIC05NCwxNCArOTUsMTAgQEAKIAogc3RhdGljIHBpZF90IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbShzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCQkgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHBpZF90IHBpZCwKLQkJCQkJIGludCBmdWxsLAogCQkJCQkgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCiAJCQkJCSBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKLQljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKIAlzaXplX3Qgc2l6ZTsKLQlESVIgKnRhc2tzOwotCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKIAlwaWRfdCB0Z2lkOwogCiAJbWVtc2V0KCZldmVudC0+Y29tbSwgMCwgc2l6ZW9mKGV2ZW50LT5jb21tKSk7CkBAIC0xMjQsNTcgKzEyMSwzNyBAQAogCWV2ZW50LT5jb21tLmhlYWRlci5zaXplID0gKHNpemVvZihldmVudC0+Y29tbSkgLQogCQkJCShzaXplb2YoZXZlbnQtPmNvbW0uY29tbSkgLSBzaXplKSArCiAJCQkJbWFjaGluZS0+aWRfaGRyX3NpemUpOwotCWlmICghZnVsbCkgewotCQlldmVudC0+Y29tbS50aWQgPSBwaWQ7CisJZXZlbnQtPmNvbW0udGlkID0gcGlkOwogCi0JCWlmIChwcm9jZXNzKHRvb2wsIGV2ZW50LCAmc3ludGhfc2FtcGxlLCBtYWNoaW5lKSAhPSAwKQotCQkJcmV0dXJuIC0xOworCWlmIChwcm9jZXNzKHRvb2wsIGV2ZW50LCAmc3ludGhfc2FtcGxlLCBtYWNoaW5lKSAhPSAwKQorCQlyZXR1cm4gLTE7CiAKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCi0JCXJldHVybiAwOwotCi0Jc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy9wcm9jLyVkL3Rhc2siLAotCQkgbWFjaGluZS0+cm9vdF9kaXIsIHBpZCk7Ci0KLQl0YXNrcyA9IG9wZW5kaXIoZmlsZW5hbWUpOwotCWlmICh0YXNrcyA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJjb3VsZG4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXdoaWxlICghcmVhZGRpcl9yKHRhc2tzLCAmZGlyZW50LCAmbmV4dCkgJiYgbmV4dCkgewotCQljaGFyICplbmQ7Ci0JCXBpZCA9IHN0cnRvbChkaXJlbnQuZF9uYW1lLCAmZW5kLCAxMCk7Ci0JCWlmICgqZW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogYWxyZWFkeSBoYXZlIHRnaWQ7IGp1dCB3YW50IHRvIHVwZGF0ZSB0aGUgY29tbSAqLwotCQkodm9pZCkgcGVyZl9ldmVudF9fZ2V0X2NvbW1fdGdpZChwaWQsIGV2ZW50LT5jb21tLmNvbW0sCi0JCQkJCSBzaXplb2YoZXZlbnQtPmNvbW0uY29tbSkpOwotCi0JCXNpemUgPSBzdHJsZW4oZXZlbnQtPmNvbW0uY29tbSkgKyAxOwotCQlzaXplID0gUEVSRl9BTElHTihzaXplLCBzaXplb2YodTY0KSk7Ci0JCW1lbXNldChldmVudC0+Y29tbS5jb21tICsgc2l6ZSwgMCwgbWFjaGluZS0+aWRfaGRyX3NpemUpOwotCQlldmVudC0+Y29tbS5oZWFkZXIuc2l6ZSA9IChzaXplb2YoZXZlbnQtPmNvbW0pIC0KLQkJCQkJICAoc2l6ZW9mKGV2ZW50LT5jb21tLmNvbW0pIC0gc2l6ZSkgKwotCQkJCQkgIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKLQotCQlldmVudC0+Y29tbS50aWQgPSBwaWQ7Ci0KLQkJaWYgKHByb2Nlc3ModG9vbCwgZXZlbnQsICZzeW50aF9zYW1wbGUsIG1hY2hpbmUpICE9IDApIHsKLQkJCXRnaWQgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JY2xvc2VkaXIodGFza3MpOwogb3V0OgogCXJldHVybiB0Z2lkOwogfQogCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZm9yayhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgcGlkX3QgcGlkLAorCQkJCSAgICAgICBwaWRfdCB0Z2lkLCBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJbWVtc2V0KCZldmVudC0+Zm9yaywgMCwgc2l6ZW9mKGV2ZW50LT5mb3JrKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKKworCS8qIHRoaXMgaXMgcmVhbGx5IGEgY2xvbmUgZXZlbnQgYnV0IHdlIHVzZSBmb3JrIHRvIHN5bnRoZXNpemUgaXQgKi8KKwlldmVudC0+Zm9yay5wcGlkID0gdGdpZDsKKwlldmVudC0+Zm9yay5wdGlkID0gdGdpZDsKKwlldmVudC0+Zm9yay5waWQgID0gdGdpZDsKKwlldmVudC0+Zm9yay50aWQgID0gcGlkOworCWV2ZW50LT5mb3JrLmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfRk9SSzsKKworCWV2ZW50LT5mb3JrLmhlYWRlci5zaXplID0gKHNpemVvZihldmVudC0+Zm9yaykgKyBtYWNoaW5lLT5pZF9oZHJfc2l6ZSk7CisKKwlpZiAocHJvY2Vzcyh0b29sLCBldmVudCwgJnN5bnRoX3NhbXBsZSwgbWFjaGluZSkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKIGludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX21tYXBfZXZlbnRzKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgICBwaWRfdCBwaWQsIHBpZF90IHRnaWQsCkBAIC0zMjQsMTcgKzMwMSw3MSBAQAogCiBzdGF0aWMgaW50IF9fZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKHVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsCiAJCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqbW1hcF9ldmVudCwKKwkJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpmb3JrX2V2ZW50LAogCQkJCSAgICAgIHBpZF90IHBpZCwgaW50IGZ1bGwsCiAJCQkJCSAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCiAJCQkJICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgYm9vbCBtbWFwX2RhdGEpCiB7Ci0JcGlkX3QgdGdpZCA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbSh0b29sLCBjb21tX2V2ZW50LCBwaWQsIGZ1bGwsCisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJRElSICp0YXNrczsKKwlzdHJ1Y3QgZGlyZW50IGRpcmVudCwgKm5leHQ7CisJcGlkX3QgdGdpZDsKKworCS8qIHNwZWNpYWwgY2FzZTogb25seSBzZW5kIG9uZSBjb21tIGV2ZW50IHVzaW5nIHBhc3NlZCBpbiBwaWQgKi8KKwlpZiAoIWZ1bGwpIHsKKwkJdGdpZCA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbSh0b29sLCBjb21tX2V2ZW50LCBwaWQsCisJCQkJCQkgICBwcm9jZXNzLCBtYWNoaW5lKTsKKworCQlpZiAodGdpZCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQlyZXR1cm4gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyh0b29sLCBtbWFwX2V2ZW50LCBwaWQsIHRnaWQsCisJCQkJCQkJICBwcm9jZXNzLCBtYWNoaW5lLCBtbWFwX2RhdGEpOworCX0KKworCWlmIChtYWNoaW5lX19pc19kZWZhdWx0X2d1ZXN0KG1hY2hpbmUpKQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvcHJvYy8lZC90YXNrIiwKKwkJIG1hY2hpbmUtPnJvb3RfZGlyLCBwaWQpOworCisJdGFza3MgPSBvcGVuZGlyKGZpbGVuYW1lKTsKKwlpZiAodGFza3MgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiY291bGRuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoIXJlYWRkaXJfcih0YXNrcywgJmRpcmVudCwgJm5leHQpICYmIG5leHQpIHsKKwkJY2hhciAqZW5kOworCQlpbnQgcmMgPSAwOworCQlwaWRfdCBfcGlkOworCisJCV9waWQgPSBzdHJ0b2woZGlyZW50LmRfbmFtZSwgJmVuZCwgMTApOworCQlpZiAoKmVuZCkKKwkJCWNvbnRpbnVlOworCisJCXRnaWQgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2NvbW0odG9vbCwgY29tbV9ldmVudCwgX3BpZCwKKwkJCQkJCSAgIHByb2Nlc3MsIG1hY2hpbmUpOworCQlpZiAodGdpZCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoX3BpZCA9PSBwaWQpIHsKKwkJCS8qIHByb2Nlc3MgdGhlIHBhcmVudCdzIG1hcHMgdG9vICovCisJCQlyYyA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfbW1hcF9ldmVudHModG9vbCwgbW1hcF9ldmVudCwgcGlkLCB0Z2lkLAorCQkJCQkJcHJvY2VzcywgbWFjaGluZSwgbW1hcF9kYXRhKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9ubHkgZm9yayB0aGUgdGlkJ3MgbWFwLCB0byBzYXZlIHRpbWUgKi8KKwkJCXJjID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9mb3JrKHRvb2wsIGZvcmtfZXZlbnQsIF9waWQsIHRnaWQsCiAJCQkJCQkgcHJvY2VzcywgbWFjaGluZSk7Ci0JaWYgKHRnaWQgPT0gLTEpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyh0b29sLCBtbWFwX2V2ZW50LCBwaWQsIHRnaWQsCi0JCQkJCQkgIHByb2Nlc3MsIG1hY2hpbmUsIG1tYXBfZGF0YSk7CisJCX0KKworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJY2xvc2VkaXIodGFza3MpOworCXJldHVybiAwOwogfQogCiBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCkBAIC0zNDMsNyArMzc0LDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkgICAgICBib29sIG1tYXBfZGF0YSkKIHsKLQl1bmlvbiBwZXJmX2V2ZW50ICpjb21tX2V2ZW50LCAqbW1hcF9ldmVudDsKKwl1bmlvbiBwZXJmX2V2ZW50ICpjb21tX2V2ZW50LCAqbW1hcF9ldmVudCwgKmZvcmtfZXZlbnQ7CiAJaW50IGVyciA9IC0xLCB0aHJlYWQsIGo7CiAKIAljb21tX2V2ZW50ID0gbWFsbG9jKHNpemVvZihjb21tX2V2ZW50LT5jb21tKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKQEAgLTM1NCw5ICszODUsMTQgQEAKIAlpZiAobW1hcF9ldmVudCA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX2NvbW07CiAKKwlmb3JrX2V2ZW50ID0gbWFsbG9jKHNpemVvZihmb3JrX2V2ZW50LT5mb3JrKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKKwlpZiAoZm9ya19ldmVudCA9PSBOVUxMKQorCQlnb3RvIG91dF9mcmVlX21tYXA7CisKIAllcnIgPSAwOwogCWZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdGhyZWFkcy0+bnI7ICsrdGhyZWFkKSB7CiAJCWlmIChfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LAorCQkJCQkgICAgICAgZm9ya19ldmVudCwKIAkJCQkJICAgICAgIHRocmVhZHMtPm1hcFt0aHJlYWRdLCAwLAogCQkJCQkgICAgICAgcHJvY2VzcywgdG9vbCwgbWFjaGluZSwKIAkJCQkJICAgICAgIG1tYXBfZGF0YSkpIHsKQEAgLTM4Miw2ICs0MTgsNyBAQAogCQkJLyogaWYgbm90LCBnZW5lcmF0ZSBldmVudHMgZm9yIGl0ICovCiAJCQlpZiAobmVlZF9sZWFkZXIgJiYKIAkJCSAgICBfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LAorCQkJCQkJICAgICAgIGZvcmtfZXZlbnQsCiAJCQkJCQkgICAgICAgY29tbV9ldmVudC0+Y29tbS5waWQsIDAsCiAJCQkJCQkgICAgICAgcHJvY2VzcywgdG9vbCwgbWFjaGluZSwKIAkJCQkJCSAgICAgICBtbWFwX2RhdGEpKSB7CkBAIC0zOTAsNiArNDI3LDggQEAKIAkJCX0KIAkJfQogCX0KKwlmcmVlKGZvcmtfZXZlbnQpOworb3V0X2ZyZWVfbW1hcDoKIAlmcmVlKG1tYXBfZXZlbnQpOwogb3V0X2ZyZWVfY29tbToKIAlmcmVlKGNvbW1fZXZlbnQpOwpAQCAtNDA0LDkgKzQ0MywxMiBAQAogCURJUiAqcHJvYzsKIAljaGFyIHByb2NfcGF0aFtQQVRIX01BWF07CiAJc3RydWN0IGRpcmVudCBkaXJlbnQsICpuZXh0OwotCXVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsICptbWFwX2V2ZW50OworCXVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsICptbWFwX2V2ZW50LCAqZm9ya19ldmVudDsKIAlpbnQgZXJyID0gLTE7CiAKKwlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKKwkJcmV0dXJuIDA7CisKIAljb21tX2V2ZW50ID0gbWFsbG9jKHNpemVvZihjb21tX2V2ZW50LT5jb21tKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKIAlpZiAoY29tbV9ldmVudCA9PSBOVUxMKQogCQlnb3RvIG91dDsKQEAgLTQxNSwxNCArNDU3LDE1IEBACiAJaWYgKG1tYXBfZXZlbnQgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZV9jb21tOwogCi0JaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCi0JCXJldHVybiAwOworCWZvcmtfZXZlbnQgPSBtYWxsb2Moc2l6ZW9mKGZvcmtfZXZlbnQtPmZvcmspICsgbWFjaGluZS0+aWRfaGRyX3NpemUpOworCWlmIChmb3JrX2V2ZW50ID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWVfbW1hcDsKIAogCXNucHJpbnRmKHByb2NfcGF0aCwgc2l6ZW9mKHByb2NfcGF0aCksICIlcy9wcm9jIiwgbWFjaGluZS0+cm9vdF9kaXIpOwogCXByb2MgPSBvcGVuZGlyKHByb2NfcGF0aCk7CiAKIAlpZiAocHJvYyA9PSBOVUxMKQotCQlnb3RvIG91dF9mcmVlX21tYXA7CisJCWdvdG8gb3V0X2ZyZWVfZm9yazsKIAogCXdoaWxlICghcmVhZGRpcl9yKHByb2MsICZkaXJlbnQsICZuZXh0KSAmJiBuZXh0KSB7CiAJCWNoYXIgKmVuZDsKQEAgLTQzNCwxMiArNDc3LDE0IEBACiAgCQkgKiBXZSBtYXkgcmFjZSB3aXRoIGV4aXRpbmcgdGhyZWFkLCBzbyBkb24ndCBzdG9wIGp1c3QgYmVjYXVzZQogIAkJICogb25lIHRocmVhZCBjb3VsZG4ndCBiZSBzeW50aGVzaXplZC4KICAJCSAqLwotCQlfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LCBwaWQsIDEsCi0JCQkJCSAgIHByb2Nlc3MsIHRvb2wsIG1hY2hpbmUsIG1tYXBfZGF0YSk7CisJCV9fZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKGNvbW1fZXZlbnQsIG1tYXBfZXZlbnQsIGZvcmtfZXZlbnQsIHBpZCwKKwkJCQkJICAgMSwgcHJvY2VzcywgdG9vbCwgbWFjaGluZSwgbW1hcF9kYXRhKTsKIAl9CiAKIAllcnIgPSAwOwogCWNsb3NlZGlyKHByb2MpOworb3V0X2ZyZWVfZm9yazoKKwlmcmVlKGZvcmtfZXZlbnQpOwogb3V0X2ZyZWVfbW1hcDoKIAlmcmVlKG1tYXBfZXZlbnQpOwogb3V0X2ZyZWVfY29tbToKQEAgLTY2MSw3ICs3MDYsNyBAQAogCWFsLT50aHJlYWQgPSB0aHJlYWQ7CiAJYWwtPmFkZHIgPSBhZGRyOwogCWFsLT5jcHVtb2RlID0gY3B1bW9kZTsKLQlhbC0+ZmlsdGVyZWQgPSBmYWxzZTsKKwlhbC0+ZmlsdGVyZWQgPSAwOwogCiAJaWYgKG1hY2hpbmUgPT0gTlVMTCkgewogCQlhbC0+bWFwID0gTlVMTDsKQEAgLTY4NywxMSArNzMyLDExIEBACiAJCWlmICgoY3B1bW9kZSA9PSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX1VTRVIgfHwKIAkJCWNwdW1vZGUgPT0gUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUwpICYmCiAJCQkhcGVyZl9ndWVzdCkKLQkJCWFsLT5maWx0ZXJlZCA9IHRydWU7CisJCQlhbC0+ZmlsdGVyZWQgfD0gKDEgPDwgSElTVF9GSUxURVJfX0dVRVNUKTsKIAkJaWYgKChjcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfVVNFUiB8fAogCQkJY3B1bW9kZSA9PSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCkgJiYKIAkJCSFwZXJmX2hvc3QpCi0JCQlhbC0+ZmlsdGVyZWQgPSB0cnVlOworCQkJYWwtPmZpbHRlcmVkIHw9ICgxIDw8IEhJU1RfRklMVEVSX19IT1NUKTsKIAogCQlyZXR1cm47CiAJfQpAQCAtNzQ4LDkgKzc5Myw2IEBACiAJaWYgKHRocmVhZCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAodGhyZWFkX19pc19maWx0ZXJlZCh0aHJlYWQpKQotCQlnb3RvIG91dF9maWx0ZXJlZDsKLQogCWR1bXBfcHJpbnRmKCIgLi4uIHRocmVhZDogJXM6JWRcbiIsIHRocmVhZF9fY29tbV9zdHIodGhyZWFkKSwgdGhyZWFkLT50aWQpOwogCS8qCiAJICogSGF2ZSB3ZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIGtlcm5lbCBtYXBzIGZvciB0aGlzIG1hY2hpbmU/CkBAIC03NjgsNiArODEwLDEwIEBACiAJZHVtcF9wcmludGYoIiAuLi4uLi4gZHNvOiAlc1xuIiwKIAkJICAgIGFsLT5tYXAgPyBhbC0+bWFwLT5kc28tPmxvbmdfbmFtZSA6CiAJCQlhbC0+bGV2ZWwgPT0gJ0gnID8gIltoeXBlcnZpc29yXSIgOiAiPG5vdCBmb3VuZD4iKTsKKworCWlmICh0aHJlYWRfX2lzX2ZpbHRlcmVkKHRocmVhZCkpCisJCWFsLT5maWx0ZXJlZCB8PSAoMSA8PCBISVNUX0ZJTFRFUl9fVEhSRUFEKTsKKwogCWFsLT5zeW0gPSBOVUxMOwogCWFsLT5jcHUgPSBzYW1wbGUtPmNwdTsKIApAQCAtNzc5LDggKzgyNSw5IEBACiAJCQkJCQkgIGRzby0+c2hvcnRfbmFtZSkgfHwKIAkJCSAgICAgICAoZHNvLT5zaG9ydF9uYW1lICE9IGRzby0+bG9uZ19uYW1lICYmCiAJCQkJc3RybGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLmRzb19saXN0LAotCQkJCQkJICAgZHNvLT5sb25nX25hbWUpKSkpKQotCQkJZ290byBvdXRfZmlsdGVyZWQ7CisJCQkJCQkgICBkc28tPmxvbmdfbmFtZSkpKSkpIHsKKwkJCWFsLT5maWx0ZXJlZCB8PSAoMSA8PCBISVNUX0ZJTFRFUl9fRFNPKTsKKwkJfQogCiAJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLAogCQkJCQkgICBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKQEAgLTc4OCwxMiArODM1LDkgQEAKIAogCWlmIChzeW1ib2xfY29uZi5zeW1fbGlzdCAmJgogCQkoIWFsLT5zeW0gfHwgIXN0cmxpc3RfX2hhc19lbnRyeShzeW1ib2xfY29uZi5zeW1fbGlzdCwKLQkJCQkJCWFsLT5zeW0tPm5hbWUpKSkKLQkJZ290byBvdXRfZmlsdGVyZWQ7CisJCQkJCQlhbC0+c3ltLT5uYW1lKSkpIHsKKwkJYWwtPmZpbHRlcmVkIHw9ICgxIDw8IEhJU1RfRklMVEVSX19TWU1CT0wpOworCX0KIAogCXJldHVybiAwOwotCi1vdXRfZmlsdGVyZWQ6Ci0JYWwtPmZpbHRlcmVkID0gdHJ1ZTsKLQlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKaW5kZXggODUxZmEwNi4uMzg0NTdkNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKQEAgLTg1LDYgKzg1LDcgQEAKIAogc3RydWN0IHJlZ3NfZHVtcCB7CiAJdTY0IGFiaTsKKwl1NjQgbWFzazsKIAl1NjQgKnJlZ3M7CiB9OwogCkBAIC0yNTksOSArMjYwLDkgQEAKIGNvbnN0IGNoYXIgKnBlcmZfZXZlbnRfX25hbWUodW5zaWduZWQgaW50IGlkKTsKIAogc2l6ZV90IHBlcmZfZXZlbnRfX3NhbXBsZV9ldmVudF9zaXplKGNvbnN0IHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLCB1NjQgdHlwZSwKLQkJCQkgICAgIHU2NCBzYW1wbGVfcmVnc191c2VyLCB1NjQgcmVhZF9mb3JtYXQpOworCQkJCSAgICAgdTY0IHJlYWRfZm9ybWF0KTsKIGludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX3NhbXBsZSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgdTY0IHR5cGUsCi0JCQkJICB1NjQgc2FtcGxlX3JlZ3NfdXNlciwgdTY0IHJlYWRfZm9ybWF0LAorCQkJCSAgdTY0IHJlYWRfZm9ybWF0LAogCQkJCSAgY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJICBib29sIHN3YXBwZWQpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCmluZGV4IDU1NDA3YzUuLjVjMjhkODIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCkBAIC01MDAsNiArNTAwLDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQKK3BlcmZfZXZzZWxfX2NvbmZpZ19jYWxsZ3JhcGgoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJICAgICBzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMpCit7CisJYm9vbCBmdW5jdGlvbiA9IHBlcmZfZXZzZWxfX2lzX2Z1bmN0aW9uX2V2ZW50KGV2c2VsKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2c2VsLT5hdHRyOworCisJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIENBTExDSEFJTik7CisKKwlpZiAob3B0cy0+Y2FsbF9ncmFwaCA9PSBDQUxMQ0hBSU5fRFdBUkYpIHsKKwkJaWYgKCFmdW5jdGlvbikgeworCQkJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIFJFR1NfVVNFUik7CisJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgU1RBQ0tfVVNFUik7CisJCQlhdHRyLT5zYW1wbGVfcmVnc191c2VyID0gUEVSRl9SRUdTX01BU0s7CisJCQlhdHRyLT5zYW1wbGVfc3RhY2tfdXNlciA9IG9wdHMtPnN0YWNrX2R1bXBfc2l6ZTsKKwkJCWF0dHItPmV4Y2x1ZGVfY2FsbGNoYWluX3VzZXIgPSAxOworCQl9IGVsc2UgeworCQkJcHJfaW5mbygiQ2Fubm90IHVzZSBEV0FSRiB1bndpbmQgZm9yIGZ1bmN0aW9uIHRyYWNlIGV2ZW50LCIKKwkJCQkiIGZhbGxpbmcgYmFjayB0byBmcmFtZXBvaW50ZXJzLlxuIik7CisJCX0KKwl9CisKKwlpZiAoZnVuY3Rpb24pIHsKKwkJcHJfaW5mbygiRGlzYWJsaW5nIHVzZXIgc3BhY2UgY2FsbGNoYWlucyBmb3IgZnVuY3Rpb24gdHJhY2UgZXZlbnQuXG4iKTsKKwkJYXR0ci0+ZXhjbHVkZV9jYWxsY2hhaW5fdXNlciA9IDE7CisJfQorfQorCiAvKgogICogVGhlIGVuYWJsZV9vbl9leGVjL2Rpc2FibGVkIHZhbHVlIHN0cmF0ZWd5OgogICoKQEAgLTU5NSwxNyArNjIzLDggQEAKIAkJYXR0ci0+bW1hcF9kYXRhID0gdHJhY2s7CiAJfQogCi0JaWYgKG9wdHMtPmNhbGxfZ3JhcGgpIHsKLQkJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIENBTExDSEFJTik7Ci0KLQkJaWYgKG9wdHMtPmNhbGxfZ3JhcGggPT0gQ0FMTENIQUlOX0RXQVJGKSB7Ci0JCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgUkVHU19VU0VSKTsKLQkJCXBlcmZfZXZzZWxfX3NldF9zYW1wbGVfYml0KGV2c2VsLCBTVEFDS19VU0VSKTsKLQkJCWF0dHItPnNhbXBsZV9yZWdzX3VzZXIgPSBQRVJGX1JFR1NfTUFTSzsKLQkJCWF0dHItPnNhbXBsZV9zdGFja191c2VyID0gb3B0cy0+c3RhY2tfZHVtcF9zaXplOwotCQkJYXR0ci0+ZXhjbHVkZV9jYWxsY2hhaW5fdXNlciA9IDE7Ci0JCX0KLQl9CisJaWYgKG9wdHMtPmNhbGxfZ3JhcGhfZW5hYmxlZCkKKwkJcGVyZl9ldnNlbF9fY29uZmlnX2NhbGxncmFwaChldnNlbCwgb3B0cyk7CiAKIAlpZiAodGFyZ2V0X19oYXNfY3B1KCZvcHRzLT50YXJnZXQpKQogCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgQ1BVKTsKQEAgLTEwMDQsNyArMTAyMyw3IEBACiAKIAkJCWdyb3VwX2ZkID0gZ2V0X2dyb3VwX2ZkKGV2c2VsLCBjcHUsIHRocmVhZCk7CiByZXRyeV9vcGVuOgotCQkJcHJfZGVidWcyKCJwZXJmX2V2ZW50X29wZW46IHBpZCAlZCAgY3B1ICVkICBncm91cF9mZCAlZCAgZmxhZ3MgJSNseFxuIiwKKwkJCXByX2RlYnVnMigic3lzX3BlcmZfZXZlbnRfb3BlbjogcGlkICVkICBjcHUgJWQgIGdyb3VwX2ZkICVkICBmbGFncyAlI2x4XG4iLAogCQkJCSAgcGlkLCBjcHVzLT5tYXBbY3B1XSwgZ3JvdXBfZmQsIGZsYWdzKTsKIAogCQkJRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA9IHN5c19wZXJmX2V2ZW50X29wZW4oJmV2c2VsLT5hdHRyLApAQCAtMTAxMyw3ICsxMDMyLDcgQEAKIAkJCQkJCQkJICAgICBncm91cF9mZCwgZmxhZ3MpOwogCQkJaWYgKEZEKGV2c2VsLCBjcHUsIHRocmVhZCkgPCAwKSB7CiAJCQkJZXJyID0gLWVycm5vOwotCQkJCXByX2RlYnVnMigicGVyZl9ldmVudF9vcGVuIGZhaWxlZCwgZXJyb3IgJWRcbiIsCisJCQkJcHJfZGVidWcyKCJzeXNfcGVyZl9ldmVudF9vcGVuIGZhaWxlZCwgZXJyb3IgJWRcbiIsCiAJCQkJCSAgZXJyKTsKIAkJCQlnb3RvIHRyeV9mYWxsYmFjazsKIAkJCX0KQEAgLTEyMjAsNyArMTIzOSw3IEBACiAJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOwogCWRhdGEtPmNwdSA9IGRhdGEtPnBpZCA9IGRhdGEtPnRpZCA9IC0xOwogCWRhdGEtPnN0cmVhbV9pZCA9IGRhdGEtPmlkID0gZGF0YS0+dGltZSA9IC0xVUxMOwotCWRhdGEtPnBlcmlvZCA9IDE7CisJZGF0YS0+cGVyaW9kID0gZXZzZWwtPmF0dHIuc2FtcGxlX3BlcmlvZDsKIAlkYXRhLT53ZWlnaHQgPSAwOwogCiAJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSAhPSBQRVJGX1JFQ09SRF9TQU1QTEUpIHsKQEAgLTEzOTYsMTAgKzE0MTUsMTEgQEAKIAkJYXJyYXkrKzsKIAogCQlpZiAoZGF0YS0+dXNlcl9yZWdzLmFiaSkgewotCQkJdTY0IHJlZ3NfdXNlciA9IGV2c2VsLT5hdHRyLnNhbXBsZV9yZWdzX3VzZXI7CisJCQl1NjQgbWFzayA9IGV2c2VsLT5hdHRyLnNhbXBsZV9yZWdzX3VzZXI7CiAKLQkJCXN6ID0gaHdlaWdodF9sb25nKHJlZ3NfdXNlcikgKiBzaXplb2YodTY0KTsKKwkJCXN6ID0gaHdlaWdodF9sb25nKG1hc2spICogc2l6ZW9mKHU2NCk7CiAJCQlPVkVSRkxPV19DSEVDSyhhcnJheSwgc3osIG1heF9zaXplKTsKKwkJCWRhdGEtPnVzZXJfcmVncy5tYXNrID0gbWFzazsKIAkJCWRhdGEtPnVzZXJfcmVncy5yZWdzID0gKHU2NCAqKWFycmF5OwogCQkJYXJyYXkgPSAodm9pZCAqKWFycmF5ICsgc3o7CiAJCX0KQEAgLTE0NTEsNyArMTQ3MSw3IEBACiB9CiAKIHNpemVfdCBwZXJmX2V2ZW50X19zYW1wbGVfZXZlbnRfc2l6ZShjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IHR5cGUsCi0JCQkJICAgICB1NjQgc2FtcGxlX3JlZ3NfdXNlciwgdTY0IHJlYWRfZm9ybWF0KQorCQkJCSAgICAgdTY0IHJlYWRfZm9ybWF0KQogewogCXNpemVfdCBzeiwgcmVzdWx0ID0gc2l6ZW9mKHN0cnVjdCBzYW1wbGVfZXZlbnQpOwogCkBAIC0xNTE3LDcgKzE1MzcsNyBAQAogCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUkVHU19VU0VSKSB7CiAJCWlmIChzYW1wbGUtPnVzZXJfcmVncy5hYmkpIHsKIAkJCXJlc3VsdCArPSBzaXplb2YodTY0KTsKLQkJCXN6ID0gaHdlaWdodF9sb25nKHNhbXBsZV9yZWdzX3VzZXIpICogc2l6ZW9mKHU2NCk7CisJCQlzeiA9IGh3ZWlnaHRfbG9uZyhzYW1wbGUtPnVzZXJfcmVncy5tYXNrKSAqIHNpemVvZih1NjQpOwogCQkJcmVzdWx0ICs9IHN6OwogCQl9IGVsc2UgewogCQkJcmVzdWx0ICs9IHNpemVvZih1NjQpOwpAQCAtMTU0Niw3ICsxNTY2LDcgQEAKIH0KIAogaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfc2FtcGxlKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgdHlwZSwKLQkJCQkgIHU2NCBzYW1wbGVfcmVnc191c2VyLCB1NjQgcmVhZF9mb3JtYXQsCisJCQkJICB1NjQgcmVhZF9mb3JtYXQsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCQkgIGJvb2wgc3dhcHBlZCkKIHsKQEAgLTE2ODcsNyArMTcwNyw3IEBACiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9SRUdTX1VTRVIpIHsKIAkJaWYgKHNhbXBsZS0+dXNlcl9yZWdzLmFiaSkgewogCQkJKmFycmF5KysgPSBzYW1wbGUtPnVzZXJfcmVncy5hYmk7Ci0JCQlzeiA9IGh3ZWlnaHRfbG9uZyhzYW1wbGVfcmVnc191c2VyKSAqIHNpemVvZih1NjQpOworCQkJc3ogPSBod2VpZ2h0X2xvbmcoc2FtcGxlLT51c2VyX3JlZ3MubWFzaykgKiBzaXplb2YodTY0KTsKIAkJCW1lbWNweShhcnJheSwgc2FtcGxlLT51c2VyX3JlZ3MucmVncywgc3opOwogCQkJYXJyYXkgPSAodm9pZCAqKWFycmF5ICsgc3o7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCmluZGV4IGYxYjMyNTYuLjBjOTkyNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCkBAIC0zMTUsNiArMzE1LDI0IEBACiAJcmV0dXJuIHBlcmZfZXZzZWxfX2lzX2dyb3VwX2xlYWRlcihldnNlbCkgJiYgZXZzZWwtPm5yX21lbWJlcnMgPiAxOwogfQogCisvKioKKyAqIHBlcmZfZXZzZWxfX2lzX2Z1bmN0aW9uX2V2ZW50IC0gUmV0dXJuIHdoZXRoZXIgZ2l2ZW4gZXZzZWwgaXMgYSBmdW5jdGlvbgorICogdHJhY2UgZXZlbnQKKyAqCisgKiBAZXZzZWwgLSBldnNlbCBzZWxlY3RvciB0byBiZSB0ZXN0ZWQKKyAqCisgKiBSZXR1cm4gJXRydWUgaWYgZXZlbnQgaXMgZnVuY3Rpb24gdHJhY2UgZXZlbnQKKyAqLworc3RhdGljIGlubGluZSBib29sIHBlcmZfZXZzZWxfX2lzX2Z1bmN0aW9uX2V2ZW50KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKK3sKKyNkZWZpbmUgRlVOQ1RJT05fRVZFTlQgImZ0cmFjZTpmdW5jdGlvbiIKKworCXJldHVybiBldnNlbC0+bmFtZSAmJgorCSAgICAgICAhc3RybmNtcChGVU5DVElPTl9FVkVOVCwgZXZzZWwtPm5hbWUsIHNpemVvZihGVU5DVElPTl9FVkVOVCkpOworCisjdW5kZWYgRlVOQ1RJT05fRVZFTlQKK30KKwogc3RydWN0IHBlcmZfYXR0cl9kZXRhaWxzIHsKIAlib29sIGZyZXE7CiAJYm9vbCB2ZXJib3NlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ZzLmMgYi90b29scy9wZXJmL3V0aWwvZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViZTFmMi4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL3V0aWwvZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0KLS8qIFRPRE8gbWVyZ2UvZmFjdG9yIGludG8gdG9vbHMvbGliL2xrL2RlYnVnZnMuYyAqLwotCi0jaW5jbHVkZSAidXRpbC5oIgotI2luY2x1ZGUgInV0aWwvZnMuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNmc19fZnNfa25vd25fbW91bnRwb2ludHNbXSA9IHsKLQkiL3N5cyIsCi0JMCwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJvY2ZzX19rbm93bl9tb3VudHBvaW50c1tdID0gewotCSIvcHJvYyIsCi0JMCwKLX07Ci0KLXN0cnVjdCBmcyB7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0JY29uc3QgY2hhciAqIGNvbnN0CSptb3VudHM7Ci0JY2hhcgkJCSBwYXRoW1BBVEhfTUFYICsgMV07Ci0JYm9vbAkJCSBmb3VuZDsKLQlsb25nCQkJIG1hZ2ljOwotfTsKLQotZW51bSB7Ci0JRlNfX1NZU0ZTICA9IDAsCi0JRlNfX1BST0NGUyA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGZzIGZzX19lbnRyaWVzW10gPSB7Ci0JW0ZTX19TWVNGU10gPSB7Ci0JCS5uYW1lCT0gInN5c2ZzIiwKLQkJLm1vdW50cwk9IHN5c2ZzX19mc19rbm93bl9tb3VudHBvaW50cywKLQkJLm1hZ2ljCT0gU1lTRlNfTUFHSUMsCi0JfSwKLQlbRlNfX1BST0NGU10gPSB7Ci0JCS5uYW1lCT0gInByb2MiLAotCQkubW91bnRzCT0gcHJvY2ZzX19rbm93bl9tb3VudHBvaW50cywKLQkJLm1hZ2ljCT0gUFJPQ19TVVBFUl9NQUdJQywKLQl9LAotfTsKLQotc3RhdGljIGJvb2wgZnNfX3JlYWRfbW91bnRzKHN0cnVjdCBmcyAqZnMpCi17Ci0JYm9vbCBmb3VuZCA9IGZhbHNlOwotCWNoYXIgdHlwZVsxMDBdOwotCUZJTEUgKmZwOwotCi0JZnAgPSBmb3BlbigiL3Byb2MvbW91bnRzIiwgInIiKTsKLQlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3aGlsZSAoIWZvdW5kICYmCi0JICAgICAgIGZzY2FuZihmcCwgIiUqcyAlIiBTVFIoUEFUSF9NQVgpICJzICU5OXMgJSpzICUqZCAlKmRcbiIsCi0JCSAgICAgIGZzLT5wYXRoLCB0eXBlKSA9PSAyKSB7Ci0KLQkJaWYgKHN0cmNtcCh0eXBlLCBmcy0+bmFtZSkgPT0gMCkKLQkJCWZvdW5kID0gdHJ1ZTsKLQl9Ci0KLQlmY2xvc2UoZnApOwotCXJldHVybiBmcy0+Zm91bmQgPSBmb3VuZDsKLX0KLQotc3RhdGljIGludCBmc19fdmFsaWRfbW91bnQoY29uc3QgY2hhciAqZnMsIGxvbmcgbWFnaWMpCi17Ci0Jc3RydWN0IHN0YXRmcyBzdF9mczsKLQotCWlmIChzdGF0ZnMoZnMsICZzdF9mcykgPCAwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQllbHNlIGlmIChzdF9mcy5mX3R5cGUgIT0gbWFnaWMpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIGZzX19jaGVja19tb3VudHMoc3RydWN0IGZzICpmcykKLXsKLQljb25zdCBjaGFyICogY29uc3QgKnB0cjsKLQotCXB0ciA9IGZzLT5tb3VudHM7Ci0Jd2hpbGUgKCpwdHIpIHsKLQkJaWYgKGZzX192YWxpZF9tb3VudCgqcHRyLCBmcy0+bWFnaWMpID09IDApIHsKLQkJCWZzLT5mb3VuZCA9IHRydWU7Ci0JCQlzdHJjcHkoZnMtPnBhdGgsICpwdHIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHRyKys7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZnNfX2dldF9tb3VudHBvaW50KHN0cnVjdCBmcyAqZnMpCi17Ci0JaWYgKGZzX19jaGVja19tb3VudHMoZnMpKQotCQlyZXR1cm4gZnMtPnBhdGg7Ci0KLQlyZXR1cm4gZnNfX3JlYWRfbW91bnRzKGZzKSA/IGZzLT5wYXRoIDogTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZzX19tb3VudHBvaW50KGludCBpZHgpCi17Ci0Jc3RydWN0IGZzICpmcyA9ICZmc19fZW50cmllc1tpZHhdOwotCi0JaWYgKGZzLT5mb3VuZCkKLQkJcmV0dXJuIChjb25zdCBjaGFyICopZnMtPnBhdGg7Ci0KLQlyZXR1cm4gZnNfX2dldF9tb3VudHBvaW50KGZzKTsKLX0KLQotI2RlZmluZSBGU19fTU9VTlRQT0lOVChuYW1lLCBpZHgpCVwKLWNvbnN0IGNoYXIgKm5hbWUjI19fbW91bnRwb2ludCh2b2lkKQlcCi17CQkJCQlcCi0JcmV0dXJuIGZzX19tb3VudHBvaW50KGlkeCk7CVwKLX0KLQotRlNfX01PVU5UUE9JTlQoc3lzZnMsICBGU19fU1lTRlMpOwotRlNfX01PVU5UUE9JTlQocHJvY2ZzLCBGU19fUFJPQ0ZTKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9mcy5oIGIvdG9vbHMvcGVyZi91dGlsL2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDljZTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19QRVJGX0ZTCi0jZGVmaW5lIF9fUEVSRl9GUwotCi1jb25zdCBjaGFyICpzeXNmc19fbW91bnRwb2ludCh2b2lkKTsKLWNvbnN0IGNoYXIgKnByb2Nmc19fbW91bnRwb2ludCh2b2lkKTsKLQotI2VuZGlmIC8qIF9fUEVSRl9GUyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKaW5kZXggZTRlNjI0OS4uZjM4NTkwZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCkBAIC0xMywxMyArMTMsNiBAQAogc3RhdGljIGJvb2wgaGlzdHNfX2ZpbHRlcl9lbnRyeV9ieV9zeW1ib2woc3RydWN0IGhpc3RzICpoaXN0cywKIAkJCQkJICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpOwogCi1lbnVtIGhpc3RfZmlsdGVyIHsKLQlISVNUX0ZJTFRFUl9fRFNPLAotCUhJU1RfRklMVEVSX19USFJFQUQsCi0JSElTVF9GSUxURVJfX1BBUkVOVCwKLQlISVNUX0ZJTFRFUl9fU1lNQk9MLAotfTsKLQogc3RydWN0IGNhbGxjaGFpbl9wYXJhbQljYWxsY2hhaW5fcGFyYW0gPSB7CiAJLm1vZGUJPSBDSEFJTl9HUkFQSF9SRUwsCiAJLm1pbl9wZXJjZW50ID0gMC41LApAQCAtMjkwLDcgKzI4Myw3IEBACiAJCWlmIChoZS0+YnJhbmNoX2luZm8pIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGJyYW5jaCBpbmZvIGlzIChhIHBhcnQgb2YpIGFsbG9jYXRlZCBmcm9tCi0JCQkgKiBtYWNoaW5lX19yZXNvbHZlX2JzdGFjaygpIGFuZCB3aWxsIGJlIGZyZWVkIGFmdGVyCisJCQkgKiBzYW1wbGVfX3Jlc29sdmVfYnN0YWNrKCkgYW5kIHdpbGwgYmUgZnJlZWQgYWZ0ZXIKIAkJCSAqIGFkZGluZyBuZXcgZW50cmllcy4gIFNvIHdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkuCiAJCQkgKi8KIAkJCWhlLT5icmFuY2hfaW5mbyA9IG1hbGxvYyhzaXplb2YoKmhlLT5icmFuY2hfaW5mbykpOwpAQCAtMzY5LDcgKzM2Miw3IEBACiAJCQloZV9zdGF0X19hZGRfcGVyaW9kKCZoZS0+c3RhdCwgcGVyaW9kLCB3ZWlnaHQpOwogCiAJCQkvKgotCQkJICogVGhpcyBtZW0gaW5mbyB3YXMgYWxsb2NhdGVkIGZyb20gbWFjaGluZV9fcmVzb2x2ZV9tZW0KKwkJCSAqIFRoaXMgbWVtIGluZm8gd2FzIGFsbG9jYXRlZCBmcm9tIHNhbXBsZV9fcmVzb2x2ZV9tZW0KIAkJCSAqIGFuZCB3aWxsIG5vdCBiZSB1c2VkIGFueW1vcmUuCiAJCQkgKi8KIAkJCXpmcmVlKCZlbnRyeS0+bWVtX2luZm8pOwpAQCAtNDI5LDcgKzQyMiw3IEBACiAJCQkud2VpZ2h0ID0gd2VpZ2h0LAogCQl9LAogCQkucGFyZW50ID0gc3ltX3BhcmVudCwKLQkJLmZpbHRlcmVkID0gc3ltYm9sX19wYXJlbnRfZmlsdGVyKHN5bV9wYXJlbnQpLAorCQkuZmlsdGVyZWQgPSBzeW1ib2xfX3BhcmVudF9maWx0ZXIoc3ltX3BhcmVudCkgfCBhbC0+ZmlsdGVyZWQsCiAJCS5oaXN0cwk9IGhpc3RzLAogCQkuYnJhbmNoX2luZm8gPSBiaSwKIAkJLm1lbV9pbmZvID0gbWksCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCBhNTk3NDNmLi4xZjFmNTEzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTE0LDYgKzE0LDE1IEBACiBzdHJ1Y3QgYWRkcl9sb2NhdGlvbjsKIHN0cnVjdCBzeW1ib2w7CiAKK2VudW0gaGlzdF9maWx0ZXIgeworCUhJU1RfRklMVEVSX19EU08sCisJSElTVF9GSUxURVJfX1RIUkVBRCwKKwlISVNUX0ZJTFRFUl9fUEFSRU5ULAorCUhJU1RfRklMVEVSX19TWU1CT0wsCisJSElTVF9GSUxURVJfX0dVRVNULAorCUhJU1RfRklMVEVSX19IT1NULAorfTsKKwogLyoKICAqIFRoZSBrZXJuZWwgY29sbGVjdHMgdGhlIG51bWJlciBvZiBldmVudHMgaXQgY291bGRuJ3Qgc2VuZCBpbiBhIHN0cmV0Y2ggYW5kCiAgKiB3aGVuIHBvc3NpYmxlIHNlbmRzIHRoaXMgbnVtYmVyIGluIGEgUEVSRl9SRUNPUkRfTE9TVCBldmVudC4gVGhlIG51bWJlciBvZgpAQCAtMTMyLDggKzE0MSwxMCBAQAogfTsKIAogc3RydWN0IHBlcmZfaHBwX2ZtdCB7Ci0JaW50ICgqaGVhZGVyKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwKTsKLQlpbnQgKCp3aWR0aCkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCk7CisJaW50ICgqaGVhZGVyKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpOworCWludCAoKndpZHRoKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CiAJaW50ICgqY29sb3IpKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwgc3RydWN0IHBlcmZfaHBwICpocHAsCiAJCSAgICAgc3RydWN0IGhpc3RfZW50cnkgKmhlKTsKIAlpbnQgKCplbnRyeSkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKQEAgLTE2Niw2ICsxNzcsMjAgQEAKIHZvaWQgcGVyZl9ocHBfX2NvbHVtbl9yZWdpc3RlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmb3JtYXQpOwogdm9pZCBwZXJmX2hwcF9fY29sdW1uX2VuYWJsZSh1bnNpZ25lZCBjb2wpOwogCit0eXBlZGVmIHU2NCAoKmhwcF9maWVsZF9mbikoc3RydWN0IGhpc3RfZW50cnkgKmhlKTsKK3R5cGVkZWYgaW50ICgqaHBwX2NhbGxiYWNrX2ZuKShzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCk7Cit0eXBlZGVmIGludCAoKmhwcF9zbnByaW50X2ZuKShzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCitpbnQgX19ocHBfX2ZtdChzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAorCSAgICAgICBocHBfZmllbGRfZm4gZ2V0X2ZpZWxkLCBocHBfY2FsbGJhY2tfZm4gY2FsbGJhY2ssCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sIGJvb2wgZm10X3BlcmNlbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9ocHAoc3RydWN0IHBlcmZfaHBwICpocHAsIGludCBpbmMpCit7CisJaHBwLT5idWYgICs9IGluYzsKKwlocHAtPnNpemUgLT0gaW5jOworfQorCiBzdGF0aWMgaW5saW5lIHNpemVfdCBwZXJmX2hwcF9fdXNlX2NvbG9yKHZvaWQpCiB7CiAJcmV0dXJuICFzeW1ib2xfY29uZi5maWVsZF9zZXA7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9oYXNoLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWY1NzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvaGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9saW51eC9oYXNoLmgiCi0KLSNpZm5kZWYgUEVSRl9IQVNIX0gKLSNkZWZpbmUgUEVSRl9IQVNIX0gKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgva2VybmVsLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBkOGM5MjdjLi45ODQ0YzMxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtOTQsMTIgKzk0LDYgQEAKIAlyZXR1cm4gKGkgPj0gc3NpemUpID8gKHNzaXplIC0gMSkgOiBpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQotewotCXJldHVybiBzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Ci19Ci0KIGludCBlcHJpbnRmKGludCBsZXZlbCwKIAkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2xpc3QuaAppbmRleCAxZDkyOGEwLi5iZmUwYTJhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9saXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvbGlzdC5oCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2xpbnV4L2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvbWFnaWMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDYzY2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvbWFnaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNpZm5kZWYgX1BFUkZfTElOVVhfTUFHSUNfSF8KLSNkZWZpbmUgX1BFUkZfTElOVVhfTUFHSUNfSF8KLQotI2lmbmRlZiBERUJVR0ZTX01BR0lDCi0jZGVmaW5lIERFQlVHRlNfTUFHSUMgICAgICAgICAgMHg2NDYyNjcyMAotI2VuZGlmCi0KLSNpZm5kZWYgU1lTRlNfTUFHSUMKLSNkZWZpbmUgU1lTRlNfTUFHSUMgICAgICAgICAgICAweDYyNjU2NTcyCi0jZW5kaWYKLQotI2lmbmRlZiBQUk9DX1NVUEVSX01BR0lDCi0jZGVmaW5lIFBST0NfU1VQRVJfTUFHSUMgICAgICAgMHg5ZmEwCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oIGIvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0MWU0OC4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIFBFUkZfTElOVVhfUFJFRkVUQ0hfSAotI2RlZmluZSBQRVJGX0xJTlVYX1BSRUZFVENIX0gKLQotc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKHZvaWQgKmEgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpIHsgfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCmluZGV4IDYyMGExOTguLmE1M2NkMGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYwpAQCAtMzI3LDkgKzMyNywxMCBAQAogCXJldHVybiBfX21hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIHBpZCwgdGlkLCB0cnVlKTsKIH0KIAotc3RydWN0IHRocmVhZCAqbWFjaGluZV9fZmluZF90aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHBpZF90IHRpZCkKK3N0cnVjdCB0aHJlYWQgKm1hY2hpbmVfX2ZpbmRfdGhyZWFkKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBwaWRfdCBwaWQsCisJCQkJICAgIHBpZF90IHRpZCkKIHsKLQlyZXR1cm4gX19tYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCAwLCB0aWQsIGZhbHNlKTsKKwlyZXR1cm4gX19tYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCBwaWQsIHRpZCwgZmFsc2UpOwogfQogCiBpbnQgbWFjaGluZV9fcHJvY2Vzc19jb21tX2V2ZW50KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKQEAgLTEwMjYsNyArMTAyNyw3IEBACiAJfQogCiAJdGhyZWFkID0gbWFjaGluZV9fZmluZG5ld190aHJlYWQobWFjaGluZSwgZXZlbnQtPm1tYXAyLnBpZCwKLQkJCQkJZXZlbnQtPm1tYXAyLnBpZCk7CisJCQkJCWV2ZW50LT5tbWFwMi50aWQpOwogCWlmICh0aHJlYWQgPT0gTlVMTCkKIAkJZ290byBvdXRfcHJvYmxlbTsKIApAQCAtMTA3NCw3ICsxMDc1LDcgQEAKIAl9CiAKIAl0aHJlYWQgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCBldmVudC0+bW1hcC5waWQsCi0JCQkJCSBldmVudC0+bW1hcC5waWQpOworCQkJCQkgZXZlbnQtPm1tYXAudGlkKTsKIAlpZiAodGhyZWFkID09IE5VTEwpCiAJCWdvdG8gb3V0X3Byb2JsZW07CiAKQEAgLTExMTQsNyArMTExNSw5IEBACiBpbnQgbWFjaGluZV9fcHJvY2Vzc19mb3JrX2V2ZW50KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBtYWNoaW5lX19maW5kX3RocmVhZChtYWNoaW5lLCBldmVudC0+Zm9yay50aWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRfdGhyZWFkKG1hY2hpbmUsCisJCQkJCQkgICAgIGV2ZW50LT5mb3JrLnBpZCwKKwkJCQkJCSAgICAgZXZlbnQtPmZvcmsudGlkKTsKIAlzdHJ1Y3QgdGhyZWFkICpwYXJlbnQgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLAogCQkJCQkJCWV2ZW50LT5mb3JrLnBwaWQsCiAJCQkJCQkJZXZlbnQtPmZvcmsucHRpZCk7CkBAIC0xMTQwLDcgKzExNDMsOSBAQAogaW50IG1hY2hpbmVfX3Byb2Nlc3NfZXhpdF9ldmVudChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX19tYXliZV91bnVzZWQpCiB7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gbWFjaGluZV9fZmluZF90aHJlYWQobWFjaGluZSwgZXZlbnQtPmZvcmsudGlkKTsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBtYWNoaW5lX19maW5kX3RocmVhZChtYWNoaW5lLAorCQkJCQkJICAgICBldmVudC0+Zm9yay5waWQsCisJCQkJCQkgICAgIGV2ZW50LT5mb3JrLnRpZCk7CiAKIAlpZiAoZHVtcF90cmFjZSkKIAkJcGVyZl9ldmVudF9fZnByaW50Zl90YXNrKGV2ZW50LCBzdGRvdXQpOwpAQCAtMTE4NCwzOSArMTE4OSwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgdTggY3B1bW9kZXNbXSA9IHsKLQlQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCi0JUEVSRl9SRUNPUkRfTUlTQ19LRVJORUwsCi0JUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9VU0VSLAotCVBFUkZfUkVDT1JEX01JU0NfR1VFU1RfS0VSTkVMCi19OwotI2RlZmluZSBOQ1BVTU9ERVMgKHNpemVvZihjcHVtb2Rlcykvc2l6ZW9mKHU4KSkKLQogc3RhdGljIHZvaWQgaXBfX3Jlc29sdmVfYW1zKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCiAJCQkgICAgc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqYW1zLAogCQkJICAgIHU2NCBpcCkKIHsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKLQlzaXplX3QgaTsKLQl1OCBtOwogCiAJbWVtc2V0KCZhbCwgMCwgc2l6ZW9mKGFsKSk7CisJLyoKKwkgKiBXZSBjYW5ub3QgdXNlIHRoZSBoZWFkZXIubWlzYyBoaW50IHRvIGRldGVybWluZSB3aGV0aGVyIGEKKwkgKiBicmFuY2ggc3RhY2sgYWRkcmVzcyBpcyB1c2VyLCBrZXJuZWwsIGd1ZXN0LCBoeXBlcnZpc29yLgorCSAqIEJyYW5jaGVzIG1heSBzdHJhZGRsZSB0aGUga2VybmVsL3VzZXIvaHlwZXJ2aXNvciBib3VuZGFyaWVzLgorCSAqIFRodXMsIHdlIGhhdmUgdG8gdHJ5IGNvbnNlY3V0aXZlbHkgdW50aWwgd2UgZmluZCBhIG1hdGNoCisJICogb3IgZWxzZSwgdGhlIHN5bWJvbCBpcyB1bmtub3duCisJICovCisJdGhyZWFkX19maW5kX2NwdW1vZGVfYWRkcl9sb2NhdGlvbih0aHJlYWQsIG1hY2hpbmUsIE1BUF9fRlVOQ1RJT04sIGlwLCAmYWwpOwogCi0JZm9yIChpID0gMDsgaSA8IE5DUFVNT0RFUzsgaSsrKSB7Ci0JCW0gPSBjcHVtb2Rlc1tpXTsKLQkJLyoKLQkJICogV2UgY2Fubm90IHVzZSB0aGUgaGVhZGVyLm1pc2MgaGludCB0byBkZXRlcm1pbmUgd2hldGhlciBhCi0JCSAqIGJyYW5jaCBzdGFjayBhZGRyZXNzIGlzIHVzZXIsIGtlcm5lbCwgZ3Vlc3QsIGh5cGVydmlzb3IuCi0JCSAqIEJyYW5jaGVzIG1heSBzdHJhZGRsZSB0aGUga2VybmVsL3VzZXIvaHlwZXJ2aXNvciBib3VuZGFyaWVzLgotCQkgKiBUaHVzLCB3ZSBoYXZlIHRvIHRyeSBjb25zZWN1dGl2ZWx5IHVudGlsIHdlIGZpbmQgYSBtYXRjaAotCQkgKiBvciBlbHNlLCB0aGUgc3ltYm9sIGlzIHVua25vd24KLQkJICovCi0JCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgbWFjaGluZSwgbSwgTUFQX19GVU5DVElPTiwKLQkJCQlpcCwgJmFsKTsKLQkJaWYgKGFsLm1hcCkKLQkJCWdvdG8gZm91bmQ7Ci0JfQotZm91bmQ6CiAJYW1zLT5hZGRyID0gaXA7CiAJYW1zLT5hbF9hZGRyID0gYWwuYWRkcjsKIAlhbXMtPnN5bSA9IGFsLnN5bTsKQEAgLTEyMzgsMzcgKzEyMjYsMzUgQEAKIAlhbXMtPm1hcCA9IGFsLm1hcDsKIH0KIAotc3RydWN0IG1lbV9pbmZvICptYWNoaW5lX19yZXNvbHZlX21lbShzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHIsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICAgdTggY3B1bW9kZSkKK3N0cnVjdCBtZW1faW5mbyAqc2FtcGxlX19yZXNvbHZlX21lbShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKIAlzdHJ1Y3QgbWVtX2luZm8gKm1pID0gemFsbG9jKHNpemVvZigqbWkpKTsKIAogCWlmICghbWkpCiAJCXJldHVybiBOVUxMOwogCi0JaXBfX3Jlc29sdmVfYW1zKG1hY2hpbmUsIHRociwgJm1pLT5pYWRkciwgc2FtcGxlLT5pcCk7Ci0JaXBfX3Jlc29sdmVfZGF0YShtYWNoaW5lLCB0aHIsIGNwdW1vZGUsICZtaS0+ZGFkZHIsIHNhbXBsZS0+YWRkcik7CisJaXBfX3Jlc29sdmVfYW1zKGFsLT5tYWNoaW5lLCBhbC0+dGhyZWFkLCAmbWktPmlhZGRyLCBzYW1wbGUtPmlwKTsKKwlpcF9fcmVzb2x2ZV9kYXRhKGFsLT5tYWNoaW5lLCBhbC0+dGhyZWFkLCBhbC0+Y3B1bW9kZSwKKwkJCSAmbWktPmRhZGRyLCBzYW1wbGUtPmFkZHIpOwogCW1pLT5kYXRhX3NyYy52YWwgPSBzYW1wbGUtPmRhdGFfc3JjOwogCiAJcmV0dXJuIG1pOwogfQogCi1zdHJ1Y3QgYnJhbmNoX2luZm8gKm1hY2hpbmVfX3Jlc29sdmVfYnN0YWNrKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAotCQkJCQkgICAgc3RydWN0IHRocmVhZCAqdGhyLAotCQkJCQkgICAgc3RydWN0IGJyYW5jaF9zdGFjayAqYnMpCitzdHJ1Y3QgYnJhbmNoX2luZm8gKnNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKLQlzdHJ1Y3QgYnJhbmNoX2luZm8gKmJpOwogCXVuc2lnbmVkIGludCBpOworCWNvbnN0IHN0cnVjdCBicmFuY2hfc3RhY2sgKmJzID0gc2FtcGxlLT5icmFuY2hfc3RhY2s7CisJc3RydWN0IGJyYW5jaF9pbmZvICpiaSA9IGNhbGxvYyhicy0+bnIsIHNpemVvZihzdHJ1Y3QgYnJhbmNoX2luZm8pKTsKIAotCWJpID0gY2FsbG9jKGJzLT5uciwgc2l6ZW9mKHN0cnVjdCBicmFuY2hfaW5mbykpOwogCWlmICghYmkpCiAJCXJldHVybiBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IGJzLT5ucjsgaSsrKSB7Ci0JCWlwX19yZXNvbHZlX2FtcyhtYWNoaW5lLCB0aHIsICZiaVtpXS50bywgYnMtPmVudHJpZXNbaV0udG8pOwotCQlpcF9fcmVzb2x2ZV9hbXMobWFjaGluZSwgdGhyLCAmYmlbaV0uZnJvbSwgYnMtPmVudHJpZXNbaV0uZnJvbSk7CisJCWlwX19yZXNvbHZlX2FtcyhhbC0+bWFjaGluZSwgYWwtPnRocmVhZCwgJmJpW2ldLnRvLCBicy0+ZW50cmllc1tpXS50byk7CisJCWlwX19yZXNvbHZlX2FtcyhhbC0+bWFjaGluZSwgYWwtPnRocmVhZCwgJmJpW2ldLmZyb20sIGJzLT5lbnRyaWVzW2ldLmZyb20pOwogCQliaVtpXS5mbGFncyA9IGJzLT5lbnRyaWVzW2ldLmZsYWdzOwogCX0KIAlyZXR1cm4gYmk7CkBAIC0xMzI2LDcgKzEzMTIsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlhbC5maWx0ZXJlZCA9IGZhbHNlOworCQlhbC5maWx0ZXJlZCA9IDA7CiAJCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgbWFjaGluZSwgY3B1bW9kZSwKIAkJCQkJICAgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CiAJCWlmIChhbC5zeW0gIT0gTlVMTCkgewpAQCAtMTM4NSw4ICsxMzcxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnksICZjYWxsY2hhaW5fY3Vyc29yLCBtYWNoaW5lLAotCQkJCSAgIHRocmVhZCwgZXZzZWwtPmF0dHIuc2FtcGxlX3JlZ3NfdXNlciwKLQkJCQkgICBzYW1wbGUsIG1heF9zdGFjayk7CisJCQkJICAgdGhyZWFkLCBzYW1wbGUsIG1heF9zdGFjayk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKaW5kZXggZjc3ZTkxZS4uYzhjNzRhMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaAorKysgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCkBAIC00MSw3ICs0MSw4IEBACiAJcmV0dXJuIG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXTsKIH0KIAotc3RydWN0IHRocmVhZCAqbWFjaGluZV9fZmluZF90aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHBpZF90IHRpZCk7CitzdHJ1Y3QgdGhyZWFkICptYWNoaW5lX19maW5kX3RocmVhZChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgcGlkX3QgcGlkLAorCQkJCSAgICBwaWRfdCB0aWQpOwogCiBpbnQgbWFjaGluZV9fcHJvY2Vzc19jb21tX2V2ZW50KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSk7CkBAIC05MSwxMiArOTIsMTAgQEAKIHZvaWQgbWFjaGluZV9fZGVsZXRlX3RocmVhZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogdm9pZCBtYWNoaW5lX19kZWxldGUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogCi1zdHJ1Y3QgYnJhbmNoX2luZm8gKm1hY2hpbmVfX3Jlc29sdmVfYnN0YWNrKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAotCQkJCQkgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkLAotCQkJCQkgICAgc3RydWN0IGJyYW5jaF9zdGFjayAqYnMpOwotc3RydWN0IG1lbV9pbmZvICptYWNoaW5lX19yZXNvbHZlX21lbShzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHU4IGNwdW1vZGUpOworc3RydWN0IGJyYW5jaF9pbmZvICpzYW1wbGVfX3Jlc29sdmVfYnN0YWNrKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCQkgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOworc3RydWN0IG1lbV9pbmZvICpzYW1wbGVfX3Jlc29sdmVfbWVtKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCSAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKTsKIGludCBtYWNoaW5lX19yZXNvbHZlX2NhbGxjaGFpbihzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hcC5oIGIvdG9vbHMvcGVyZi91dGlsL21hcC5oCmluZGV4IDI1N2U1MTMuLmYwMGYwNTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaAorKysgYi90b29scy9wZXJmL3V0aWwvbWFwLmgKQEAgLTkwLDYgKzkwLDE2IEBACiAKIHN0cnVjdCBzeW1ib2w7CiAKKy8qIG1hcF9fZm9yX2VhY2hfc3ltYm9sIC0gaXRlcmF0ZSBvdmVyIHRoZSBzeW1ib2xzIGluIHRoZSBnaXZlbiBtYXAKKyAqCisgKiBAbWFwOiB0aGUgJ3N0cnVjdCBtYXAgKicgaW4gd2hpY2ggc3ltYm9scyBpdGVyZWF0ZWQKKyAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG46IHRoZSAnc3RydWN0IHJiX25vZGUgKicgdG8gdXNlIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIE5vdGU6IGNhbGxlciBtdXN0IGVuc3VyZSBtYXAtPmRzbyBpcyBub3QgTlVMTCAobWFwIGlzIGxvYWRlZCkuCisgKi8KKyNkZWZpbmUgbWFwX19mb3JfZWFjaF9zeW1ib2wobWFwLCBwb3MsIG4pCVwKKwlkc29fX2Zvcl9lYWNoX3N5bWJvbChtYXAtPmRzbywgcG9zLCBuLCBtYXAtPnR5cGUpCisKIHR5cGVkZWYgaW50ICgqc3ltYm9sX2ZpbHRlcl90KShzdHJ1Y3QgbWFwICptYXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CiAKIHZvaWQgbWFwX19pbml0KHN0cnVjdCBtYXAgKm1hcCwgZW51bSBtYXBfdHlwZSB0eXBlLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKaW5kZXggZDIyZTNmODAuLmJmNDgwOTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYwpAQCAtNDA3LDcgKzQwNyw5IEBACiAJCWlmIChpbnRlcm5hbF9oZWxwICYmICFzdHJjbXAoYXJnICsgMiwgImhlbHAiKSkKIAkJCXJldHVybiB1c2FnZV93aXRoX29wdGlvbnNfaW50ZXJuYWwodXNhZ2VzdHIsIG9wdGlvbnMsIDApOwogCQlpZiAoIXN0cmNtcChhcmcgKyAyLCAibGlzdC1vcHRzIikpCi0JCQlyZXR1cm4gUEFSU0VfT1BUX0xJU1Q7CisJCQlyZXR1cm4gUEFSU0VfT1BUX0xJU1RfT1BUUzsKKwkJaWYgKCFzdHJjbXAoYXJnICsgMiwgImxpc3QtY21kcyIpKQorCQkJcmV0dXJuIFBBUlNFX09QVF9MSVNUX1NVQkNNRFM7CiAJCXN3aXRjaCAocGFyc2VfbG9uZ19vcHQoY3R4LCBhcmcgKyAyLCBvcHRpb25zKSkgewogCQljYXNlIC0xOgogCQkJcmV0dXJuIHBhcnNlX29wdGlvbnNfdXNhZ2UodXNhZ2VzdHIsIG9wdGlvbnMsIGFyZyArIDIsIDApOwpAQCAtNDMzLDI1ICs0MzUsNDUgQEAKIAlyZXR1cm4gY3R4LT5jcGlkeCArIGN0eC0+YXJnYzsKIH0KIAotaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAotCQkgIGNvbnN0IGNoYXIgKiBjb25zdCB1c2FnZXN0cltdLCBpbnQgZmxhZ3MpCitpbnQgcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucywKKwkJCWNvbnN0IGNoYXIgKmNvbnN0IHN1YmNvbW1hbmRzW10sIGNvbnN0IGNoYXIgKnVzYWdlc3RyW10sIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90IGN0eDsKIAogCXBlcmZfaGVhZGVyX19zZXRfY21kbGluZShhcmdjLCBhcmd2KTsKIAorCS8qIGJ1aWxkIHVzYWdlIHN0cmluZyBpZiBpdCdzIG5vdCBwcm92aWRlZCAqLworCWlmIChzdWJjb21tYW5kcyAmJiAhdXNhZ2VzdHJbMF0pIHsKKwkJc3RydWN0IHN0cmJ1ZiBidWYgPSBTVFJCVUZfSU5JVDsKKworCQlzdHJidWZfYWRkZigmYnVmLCAicGVyZiAlcyBbPG9wdGlvbnM+XSB7IiwgYXJndlswXSk7CisJCWZvciAoaW50IGkgPSAwOyBzdWJjb21tYW5kc1tpXTsgaSsrKSB7CisJCQlpZiAoaSkKKwkJCQlzdHJidWZfYWRkc3RyKCZidWYsICJ8Iik7CisJCQlzdHJidWZfYWRkc3RyKCZidWYsIHN1YmNvbW1hbmRzW2ldKTsKKwkJfQorCQlzdHJidWZfYWRkc3RyKCZidWYsICJ9Iik7CisKKwkJdXNhZ2VzdHJbMF0gPSBzdHJkdXAoYnVmLmJ1Zik7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCX0KKwogCXBhcnNlX29wdGlvbnNfc3RhcnQoJmN0eCwgYXJnYywgYXJndiwgZmxhZ3MpOwogCXN3aXRjaCAocGFyc2Vfb3B0aW9uc19zdGVwKCZjdHgsIG9wdGlvbnMsIHVzYWdlc3RyKSkgewogCWNhc2UgUEFSU0VfT1BUX0hFTFA6CiAJCWV4aXQoMTI5KTsKIAljYXNlIFBBUlNFX09QVF9ET05FOgogCQlicmVhazsKLQljYXNlIFBBUlNFX09QVF9MSVNUOgorCWNhc2UgUEFSU0VfT1BUX0xJU1RfT1BUUzoKIAkJd2hpbGUgKG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORCkgewogCQkJcHJpbnRmKCItLSVzICIsIG9wdGlvbnMtPmxvbmdfbmFtZSk7CiAJCQlvcHRpb25zKys7CiAJCX0KIAkJZXhpdCgxMzApOworCWNhc2UgUEFSU0VfT1BUX0xJU1RfU1VCQ01EUzoKKwkJZm9yIChpbnQgaSA9IDA7IHN1YmNvbW1hbmRzW2ldOyBpKyspCisJCQlwcmludGYoIiVzICIsIHN1YmNvbW1hbmRzW2ldKTsKKwkJZXhpdCgxMzApOwogCWRlZmF1bHQ6IC8qIFBBUlNFX09QVF9VTktOT1dOICovCiAJCWlmIChjdHguYXJndlswXVsxXSA9PSAnLScpIHsKIAkJCWVycm9yKCJ1bmtub3duIG9wdGlvbiBgJXMnIiwgY3R4LmFyZ3ZbMF0gKyAyKTsKQEAgLTQ2NCw2ICs0ODYsMTMgQEAKIAlyZXR1cm4gcGFyc2Vfb3B0aW9uc19lbmQoJmN0eCk7CiB9CiAKK2ludCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucywKKwkJICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSwgaW50IGZsYWdzKQoreworCXJldHVybiBwYXJzZV9vcHRpb25zX3N1YmNvbW1hbmQoYXJnYywgYXJndiwgb3B0aW9ucywgTlVMTCwKKwkJCQkJKGNvbnN0IGNoYXIgKiopIHVzYWdlc3RyLCBmbGFncyk7Cit9CisKICNkZWZpbmUgVVNBR0VfT1BUU19XSURUSCAyNAogI2RlZmluZSBVU0FHRV9HQVAgICAgICAgICAyCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmggYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCmluZGV4IGNiZjAxNDkuLmQ4ZGFjOGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaApAQCAtMTQwLDYgKzE0MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10sIGludCBmbGFncyk7CiAKK2V4dGVybiBpbnQgcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAorCQkJCWNvbnN0IGNoYXIgKmNvbnN0IHN1YmNvbW1hbmRzW10sCisJCQkJY29uc3QgY2hhciAqdXNhZ2VzdHJbXSwgaW50IGZsYWdzKTsKKwogZXh0ZXJuIE5PUkVUVVJOIHZvaWQgdXNhZ2Vfd2l0aF9vcHRpb25zKGNvbnN0IGNoYXIgKiBjb25zdCAqdXNhZ2VzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucyk7CiAKQEAgLTE0OCw3ICsxNTMsOCBAQAogZW51bSB7CiAJUEFSU0VfT1BUX0hFTFAgPSAtMSwKIAlQQVJTRV9PUFRfRE9ORSwKLQlQQVJTRV9PUFRfTElTVCwKKwlQQVJTRV9PUFRfTElTVF9PUFRTLAorCVBBUlNFX09QVF9MSVNUX1NVQkNNRFMsCiAJUEFSU0VfT1BUX1VOS05PV04sCiB9OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGVyZl9yZWdzLmMgYi90b29scy9wZXJmL3V0aWwvcGVyZl9yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1MzllZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wZXJmX3JlZ3MuYwpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJwZXJmX3JlZ3MuaCIKKworaW50IHBlcmZfcmVnX3ZhbHVlKHU2NCAqdmFscCwgc3RydWN0IHJlZ3NfZHVtcCAqcmVncywgaW50IGlkKQoreworCWludCBpLCBpZHggPSAwOworCXU2NCBtYXNrID0gcmVncy0+bWFzazsKKworCWlmICghKG1hc2sgJiAoMSA8PCBpZCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBpZDsgaSsrKSB7CisJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQlpZHgrKzsKKwl9CisKKwkqdmFscCA9IHJlZ3MtPnJlZ3NbaWR4XTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wZXJmX3JlZ3MuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wZXJmX3JlZ3MuaAppbmRleCBhM2Q0MmNkLi5kNmU4YjZhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGVyZl9yZWdzLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BlcmZfcmVncy5oCkBAIC0xLDggKzEsMTQgQEAKICNpZm5kZWYgX19QRVJGX1JFR1NfSAogI2RlZmluZSBfX1BFUkZfUkVHU19ICiAKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisKICNpZmRlZiBIQVZFX1BFUkZfUkVHU19TVVBQT1JUCiAjaW5jbHVkZSA8cGVyZl9yZWdzLmg+CisKK2ludCBwZXJmX3JlZ192YWx1ZSh1NjQgKnZhbHAsIHN0cnVjdCByZWdzX2R1bXAgKnJlZ3MsIGludCBpZCk7CisKICNlbHNlCiAjZGVmaW5lIFBFUkZfUkVHU19NQVNLCTAKIApAQCAtMTAsNSArMTYsMTIgQEAKIHsKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgcGVyZl9yZWdfdmFsdWUodTY0ICp2YWxwIF9fbWF5YmVfdW51c2VkLAorCQkJCSBzdHJ1Y3QgcmVnc19kdW1wICpyZWdzIF9fbWF5YmVfdW51c2VkLAorCQkJCSBpbnQgaWQgX19tYXliZV91bnVzZWQpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogSEFWRV9QRVJGX1JFR1NfU1VQUE9SVCAqLwogI2VuZGlmIC8qIF9fUEVSRl9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYwppbmRleCBiNzUyZWNiLi4wMGE3ZGNiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcG11LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BtdS5jCkBAIC0zLDcgKzMsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlIDxsb2NhbGUuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAicG11LmgiCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCmluZGV4IGQ4YjA0OGMuLjBkMTU0MmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCkBAIC03MCwzNCArNzAsMzIgQEAKIH0KIAogc3RhdGljIGNoYXIgKnN5bnRoZXNpemVfcGVyZl9wcm9iZV9wb2ludChzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHApOwotc3RhdGljIGludCBjb252ZXJ0X25hbWVfdG9fYWRkcihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJCWNvbnN0IGNoYXIgKmV4ZWMpOwogc3RhdGljIHZvaWQgY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQoc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXYpOwotc3RhdGljIHN0cnVjdCBtYWNoaW5lIG1hY2hpbmU7CitzdGF0aWMgc3RydWN0IG1hY2hpbmUgKmhvc3RfbWFjaGluZTsKIAogLyogSW5pdGlhbGl6ZSBzeW1ib2wgbWFwcyBhbmQgcGF0aCBvZiB2bWxpbnV4L21vZHVsZXMgKi8KLXN0YXRpYyBpbnQgaW5pdF92bWxpbnV4KHZvaWQpCitzdGF0aWMgaW50IGluaXRfc3ltYm9sX21hcHMoYm9vbCB1c2VyX29ubHkpCiB7CiAJaW50IHJldDsKIAogCXN5bWJvbF9jb25mLnNvcnRfYnlfbmFtZSA9IHRydWU7Ci0JaWYgKHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSA9PSBOVUxMKQotCQlzeW1ib2xfY29uZi50cnlfdm1saW51eF9wYXRoID0gdHJ1ZTsKLQllbHNlCi0JCXByX2RlYnVnKCJVc2Ugdm1saW51eDogJXNcbiIsIHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSk7CiAJcmV0ID0gc3ltYm9sX19pbml0KCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBpbml0IHN5bWJvbCBtYXAuXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gbWFjaGluZV9faW5pdCgmbWFjaGluZSwgIiIsIEhPU1RfS0VSTkVMX0lEKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJaWYgKGhvc3RfbWFjaGluZSB8fCB1c2VyX29ubHkpCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJcmV0dXJuIDA7CiAKLQlpZiAobWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKCZtYWNoaW5lKSA8IDApIHsKLQkJcHJfZGVidWcoIm1hY2hpbmVfX2NyZWF0ZV9rZXJuZWxfbWFwcygpIGZhaWxlZC5cbiIpOwotCQlnb3RvIG91dDsKKwlpZiAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lKQorCQlwcl9kZWJ1ZygiVXNlIHZtbGludXg6ICVzXG4iLCBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUpOworCisJaG9zdF9tYWNoaW5lID0gbWFjaGluZV9fbmV3X2hvc3QoKTsKKwlpZiAoIWhvc3RfbWFjaGluZSkgeworCQlwcl9kZWJ1ZygibWFjaGluZV9fbmV3X2hvc3QoKSBmYWlsZWQuXG4iKTsKKwkJc3ltYm9sX19leGl0KCk7CisJCXJldCA9IC0xOwogCX0KIG91dDoKIAlpZiAocmV0IDwgMCkKQEAgLTEwNSwyMSArMTAzLDY2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZXhpdF9zeW1ib2xfbWFwcyh2b2lkKQoreworCWlmIChob3N0X21hY2hpbmUpIHsKKwkJbWFjaGluZV9fZGVsZXRlKGhvc3RfbWFjaGluZSk7CisJCWhvc3RfbWFjaGluZSA9IE5VTEw7CisJfQorCXN5bWJvbF9fZXhpdCgpOworfQorCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCQkgICAgIHN0cnVjdCBtYXAgKiptYXBwKQogewotCXJldHVybiBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKCZtYWNoaW5lLCBuYW1lLCBtYXBwLAorCXJldHVybiBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKGhvc3RfbWFjaGluZSwgbmFtZSwgbWFwcCwKIAkJCQkJCSAgICAgTlVMTCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKHU2NCBhZGRyLCBzdHJ1Y3QgbWFwICoqbWFwcCkKK3sKKwlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24oaG9zdF9tYWNoaW5lLCBhZGRyLCBtYXBwLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCByZWZfcmVsb2Nfc3ltICprZXJuZWxfZ2V0X3JlZl9yZWxvY19zeW0odm9pZCkKK3sKKwkvKiBrbWFwLT5yZWZfcmVsb2Nfc3ltIHNob3VsZCBiZSBzZXQgaWYgaG9zdF9tYWNoaW5lIGlzIGluaXRpYWxpemVkICovCisJc3RydWN0IGttYXAgKmttYXA7CisKKwlpZiAobWFwX19sb2FkKGhvc3RfbWFjaGluZS0+dm1saW51eF9tYXBzW01BUF9fRlVOQ1RJT05dLCBOVUxMKSA8IDApCisJCXJldHVybiBOVUxMOworCisJa21hcCA9IG1hcF9fa21hcChob3N0X21hY2hpbmUtPnZtbGludXhfbWFwc1tNQVBfX0ZVTkNUSU9OXSk7CisJcmV0dXJuIGttYXAtPnJlZl9yZWxvY19zeW07Cit9CisKK3N0YXRpYyB1NjQga2VybmVsX2dldF9zeW1ib2xfYWRkcmVzc19ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgcmVsb2MpCit7CisJc3RydWN0IHJlZl9yZWxvY19zeW0gKnJlbG9jX3N5bTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IG1hcCAqbWFwOworCisJLyogcmVmX3JlbG9jX3N5bSBpcyBqdXN0IGEgbGFiZWwuIE5lZWQgYSBzcGVjaWFsIGZpeCovCisJcmVsb2Nfc3ltID0ga2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKCk7CisJaWYgKHJlbG9jX3N5bSAmJiBzdHJjbXAobmFtZSwgcmVsb2Nfc3ltLT5uYW1lKSA9PSAwKQorCQlyZXR1cm4gKHJlbG9jKSA/IHJlbG9jX3N5bS0+YWRkciA6IHJlbG9jX3N5bS0+dW5yZWxvY2F0ZWRfYWRkcjsKKwllbHNlIHsKKwkJc3ltID0gX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKG5hbWUsICZtYXApOworCQlpZiAoc3ltKQorCQkJcmV0dXJuIG1hcC0+dW5tYXBfaXAobWFwLCBzeW0tPnN0YXJ0KSAtCisJCQkJKHJlbG9jKSA/IDAgOiBtYXAtPnJlbG9jOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBtYXAgKmtlcm5lbF9nZXRfbW9kdWxlX21hcChjb25zdCBjaGFyICptb2R1bGUpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5kOwotCXN0cnVjdCBtYXBfZ3JvdXBzICpncnAgPSAmbWFjaGluZS5rbWFwczsKKwlzdHJ1Y3QgbWFwX2dyb3VwcyAqZ3JwID0gJmhvc3RfbWFjaGluZS0+a21hcHM7CiAKIAkvKiBBIGZpbGUgcGF0aCAtLSB0aGlzIGlzIGFuIG9mZmxpbmUgbW9kdWxlICovCiAJaWYgKG1vZHVsZSAmJiBzdHJjaHIobW9kdWxlLCAnLycpKQotCQlyZXR1cm4gbWFjaGluZV9fbmV3X21vZHVsZSgmbWFjaGluZSwgMCwgbW9kdWxlKTsKKwkJcmV0dXJuIG1hY2hpbmVfX25ld19tb2R1bGUoaG9zdF9tYWNoaW5lLCAwLCBtb2R1bGUpOwogCiAJaWYgKCFtb2R1bGUpCiAJCW1vZHVsZSA9ICJrZXJuZWwiOwpAQCAtMTQxLDcgKzE4NCw3IEBACiAJY29uc3QgY2hhciAqdm1saW51eF9uYW1lOwogCiAJaWYgKG1vZHVsZSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzbywgJm1hY2hpbmUua2VybmVsX2Rzb3MsIG5vZGUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkc28sICZob3N0X21hY2hpbmUtPmtlcm5lbF9kc29zLCBub2RlKSB7CiAJCQlpZiAoc3RybmNtcChkc28tPnNob3J0X25hbWUgKyAxLCBtb2R1bGUsCiAJCQkJICAgIGRzby0+c2hvcnRfbmFtZV9sZW4gLSAyKSA9PSAwKQogCQkJCWdvdG8gZm91bmQ7CkBAIC0xNTAsNyArMTkzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JbWFwID0gbWFjaGluZS52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl07CisJbWFwID0gaG9zdF9tYWNoaW5lLT52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl07CiAJZHNvID0gbWFwLT5kc287CiAKIAl2bWxpbnV4X25hbWUgPSBzeW1ib2xfY29uZi52bWxpbnV4X25hbWU7CkBAIC0xNzMsMjAgKzIxNiw2IEBACiAJcmV0dXJuIChkc28pID8gZHNvLT5sb25nX25hbWUgOiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGluaXRfdXNlcl9leGVjKHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzeW1ib2xfY29uZi50cnlfdm1saW51eF9wYXRoID0gZmFsc2U7Ci0Jc3ltYm9sX2NvbmYuc29ydF9ieV9uYW1lID0gdHJ1ZTsKLQlyZXQgPSBzeW1ib2xfX2luaXQoKTsKLQotCWlmIChyZXQgPCAwKQotCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGluaXQgc3ltYm9sIG1hcC5cbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBjb252ZXJ0X2V4ZWNfdG9fZ3JvdXAoY29uc3QgY2hhciAqZXhlYywgY2hhciAqKnJlc3VsdCkKIHsKIAljaGFyICpwdHIxLCAqcHRyMiwgKmV4ZWNfY29weTsKQEAgLTIxOCwzMiArMjQ3LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQoc3RydWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCwKLQkJCQkJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwKQorc3RhdGljIHZvaWQgY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2cywgaW50IG50ZXZzKQogewotCXBwLT5mdW5jdGlvbiA9IHN0cmR1cCh0cC0+c3ltYm9sKTsKKwlpbnQgaTsKIAotCWlmIChwcC0+ZnVuY3Rpb24gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcC0+b2Zmc2V0ID0gdHAtPm9mZnNldDsKLQlwcC0+cmV0cHJvYmUgPSB0cC0+cmV0cHJvYmU7Ci0KLQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnRldnM7IGkrKykKKwkJY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQodGV2cyArIGkpOwogfQogCiAjaWZkZWYgSEFWRV9EV0FSRl9TVVBQT1JUCisKIC8qIE9wZW4gbmV3IGRlYnVnaW5mbyBvZiBnaXZlbiBtb2R1bGUgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVidWdpbmZvICpvcGVuX2RlYnVnaW5mbyhjb25zdCBjaGFyICptb2R1bGUpCiB7Ci0JY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCBjaGFyICpwYXRoID0gbW9kdWxlOwogCi0JLyogQSBmaWxlIHBhdGggLS0gdGhpcyBpcyBhbiBvZmZsaW5lIG1vZHVsZSAqLwotCWlmIChtb2R1bGUgJiYgc3RyY2hyKG1vZHVsZSwgJy8nKSkKLQkJcGF0aCA9IG1vZHVsZTsKLQllbHNlIHsKKwlpZiAoIW1vZHVsZSB8fCAhc3RyY2hyKG1vZHVsZSwgJy8nKSkgewogCQlwYXRoID0ga2VybmVsX2dldF9tb2R1bGVfcGF0aChtb2R1bGUpOwotCiAJCWlmICghcGF0aCkgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBwYXRoIG9mICVzIG1vZHVsZS5cbiIsCiAJCQkgICAgICAgbW9kdWxlID86ICJrZXJuZWwiKTsKQEAgLTI1Myw0NiArMjczLDYgQEAKIAlyZXR1cm4gZGVidWdpbmZvX19uZXcocGF0aCk7CiB9CiAKLS8qCi0gKiBDb252ZXJ0IHRyYWNlIHBvaW50IHRvIHByb2JlIHBvaW50IHdpdGggZGVidWdpbmZvCi0gKiBDdXJyZW50bHkgb25seSBoYW5kbGVzIGtwcm9iZXMuCi0gKi8KLXN0YXRpYyBpbnQga3Byb2JlX2NvbnZlcnRfdG9fcGVyZl9wcm9iZShzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAotCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHApCi17Ci0Jc3RydWN0IHN5bWJvbCAqc3ltOwotCXN0cnVjdCBtYXAgKm1hcDsKLQl1NjQgYWRkcjsKLQlpbnQgcmV0ID0gLUVOT0VOVDsKLQlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKLQotCXN5bSA9IF9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZSh0cC0+c3ltYm9sLCAmbWFwKTsKLQlpZiAoc3ltKSB7Ci0JCWFkZHIgPSBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCArIHRwLT5vZmZzZXQpOwotCQlwcl9kZWJ1ZygidHJ5IHRvIGZpbmQgJXMrJWxkQCUiIFBSSXg2NCAiXG4iLCB0cC0+c3ltYm9sLAotCQkJIHRwLT5vZmZzZXQsIGFkZHIpOwotCi0JCWRpbmZvID0gZGVidWdpbmZvX19uZXdfb25saW5lX2tlcm5lbChhZGRyKTsKLQkJaWYgKGRpbmZvKSB7Ci0JCQlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfcHJvYmVfcG9pbnQoZGluZm8sCi0JCQkJCQkgKHVuc2lnbmVkIGxvbmcpYWRkciwgcHApOwotCQkJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIkZhaWxlZCB0byBvcGVuIGRlYnVnaW5mbyBhdCAweCUiIFBSSXg2NCAiXG4iLAotCQkJCSBhZGRyKTsKLQkJCXJldCA9IC1FTk9FTlQ7Ci0JCX0KLQl9Ci0JaWYgKHJldCA8PSAwKSB7Ci0JCXByX2RlYnVnKCJGYWlsZWQgdG8gZmluZCBjb3JyZXNwb25kaW5nIHByb2JlcyBmcm9tICIKLQkJCSAiZGVidWdpbmZvLiBVc2Uga3Byb2JlIGV2ZW50IGluZm9ybWF0aW9uLlxuIik7Ci0JCXJldHVybiBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQodHAsIHBwKTsKLQl9Ci0JcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZ2V0X3RleHRfc3RhcnRfYWRkcmVzcyhjb25zdCBjaGFyICpleGVjLCB1bnNpZ25lZCBsb25nICphZGRyZXNzKQogewogCUVsZiAqZWxmOwpAQCAtMzIxLDEyICszMDEsNjIgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogQ29udmVydCB0cmFjZSBwb2ludCB0byBwcm9iZSBwb2ludCB3aXRoIGRlYnVnaW5mbworICovCitzdGF0aWMgaW50IGZpbmRfcGVyZl9wcm9iZV9wb2ludF9mcm9tX2R3YXJmKHN0cnVjdCBwcm9iZV90cmFjZV9wb2ludCAqdHAsCisJCQkJCSAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAsCisJCQkJCSAgICBib29sIGlzX2twcm9iZSkKK3sKKwlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzdGV4dCA9IDA7CisJdTY0IGFkZHIgPSB0cC0+YWRkcmVzczsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKworCS8qIGNvbnZlcnQgdGhlIGFkZHJlc3MgdG8gZHdhcmYgYWRkcmVzcyAqLworCWlmICghaXNfa3Byb2JlKSB7CisJCWlmICghYWRkcikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmV0ID0gZ2V0X3RleHRfc3RhcnRfYWRkcmVzcyh0cC0+bW9kdWxlLCAmc3RleHQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWFkZHIgKz0gc3RleHQ7CisJfSBlbHNlIHsKKwkJYWRkciA9IGtlcm5lbF9nZXRfc3ltYm9sX2FkZHJlc3NfYnlfbmFtZSh0cC0+c3ltYm9sLCBmYWxzZSk7CisJCWlmIChhZGRyID09IDApCisJCQlnb3RvIGVycm9yOworCQlhZGRyICs9IHRwLT5vZmZzZXQ7CisJfQorCisJcHJfZGVidWcoInRyeSB0byBmaW5kIGluZm9ybWF0aW9uIGF0ICUiIFBSSXg2NCAiIGluICVzXG4iLCBhZGRyLAorCQkgdHAtPm1vZHVsZSA/IDogImtlcm5lbCIpOworCisJZGluZm8gPSBvcGVuX2RlYnVnaW5mbyh0cC0+bW9kdWxlKTsKKwlpZiAoZGluZm8pIHsKKwkJcmV0ID0gZGVidWdpbmZvX19maW5kX3Byb2JlX3BvaW50KGRpbmZvLAorCQkJCQkJICh1bnNpZ25lZCBsb25nKWFkZHIsIHBwKTsKKwkJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJGYWlsZWQgdG8gb3BlbiBkZWJ1Z2luZm8gYXQgMHglIiBQUkl4NjQgIlxuIiwgYWRkcik7CisJCXJldCA9IC1FTk9FTlQ7CisJfQorCisJaWYgKHJldCA+IDApIHsKKwkJcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOworCQlyZXR1cm4gMDsKKwl9CitlcnJvcjoKKwlwcl9kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgY29ycmVzcG9uZGluZyBwcm9iZXMgZnJvbSBkZWJ1Z2luZm8uXG4iKTsKKwlyZXR1cm4gcmV0ID8gOiAtRU5PRU5UOworfQorCiBzdGF0aWMgaW50IGFkZF9leGVjX3RvX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnMsCiAJCQkJCSAgaW50IG50ZXZzLCBjb25zdCBjaGFyICpleGVjKQogewogCWludCBpLCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdGV4dCA9IDA7Ci0JY2hhciBidWZbMzJdOworCXVuc2lnbmVkIGxvbmcgc3RleHQgPSAwOwogCiAJaWYgKCFleGVjKQogCQlyZXR1cm4gMDsKQEAgLTMzNywxNSArMzY3LDkgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBudGV2cyAmJiByZXQgPj0gMDsgaSsrKSB7CiAJCS8qIHBvaW50LmFkZHJlc3MgaXMgdGhlIGFkZHJlcyBvZiBwb2ludC5zeW1ib2wgKyBwb2ludC5vZmZzZXQgKi8KLQkJb2Zmc2V0ID0gdGV2c1tpXS5wb2ludC5hZGRyZXNzIC0gc3RleHQ7Ci0JCXRldnNbaV0ucG9pbnQub2Zmc2V0ID0gMDsKLQkJemZyZWUoJnRldnNbaV0ucG9pbnQuc3ltYm9sKTsKLQkJcmV0ID0gZV9zbnByaW50ZihidWYsIDMyLCAiMHglbHgiLCBvZmZzZXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOworCQl0ZXZzW2ldLnBvaW50LmFkZHJlc3MgLT0gc3RleHQ7CiAJCXRldnNbaV0ucG9pbnQubW9kdWxlID0gc3RyZHVwKGV4ZWMpOwotCQl0ZXZzW2ldLnBvaW50LnN5bWJvbCA9IHN0cmR1cChidWYpOwotCQlpZiAoIXRldnNbaV0ucG9pbnQuc3ltYm9sIHx8ICF0ZXZzW2ldLnBvaW50Lm1vZHVsZSkgeworCQlpZiAoIXRldnNbaV0ucG9pbnQubW9kdWxlKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM4OCwxMiArNDEyLDQwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2cywgaW50IG50ZXZzKQorLyogUG9zdCBwcm9jZXNzaW5nIHRoZSBwcm9iZSBldmVudHMgKi8KK3N0YXRpYyBpbnQgcG9zdF9wcm9jZXNzX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnMsCisJCQkJCSAgIGludCBudGV2cywgY29uc3QgY2hhciAqbW9kdWxlLAorCQkJCQkgICBib29sIHVwcm9iZSkKIHsKKwlzdHJ1Y3QgcmVmX3JlbG9jX3N5bSAqcmVsb2Nfc3ltOworCWNoYXIgKnRtcDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudGV2czsgaSsrKQotCQljbGVhcl9wcm9iZV90cmFjZV9ldmVudCh0ZXZzICsgaSk7CisJaWYgKHVwcm9iZSkKKwkJcmV0dXJuIGFkZF9leGVjX3RvX3Byb2JlX3RyYWNlX2V2ZW50cyh0ZXZzLCBudGV2cywgbW9kdWxlKTsKKworCS8qIE5vdGUgdGhhdCBjdXJyZW50bHkgcmVmX3JlbG9jX3N5bSBiYXNlZCBwcm9iZSBpcyBub3QgZm9yIGRyaXZlcnMgKi8KKwlpZiAobW9kdWxlKQorCQlyZXR1cm4gYWRkX21vZHVsZV90b19wcm9iZV90cmFjZV9ldmVudHModGV2cywgbnRldnMsIG1vZHVsZSk7CisKKwlyZWxvY19zeW0gPSBrZXJuZWxfZ2V0X3JlZl9yZWxvY19zeW0oKTsKKwlpZiAoIXJlbG9jX3N5bSkgeworCQlwcl93YXJuaW5nKCJSZWxvY2F0ZWQgYmFzZSBzeW1ib2wgaXMgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudGV2czsgaSsrKSB7CisJCWlmICh0ZXZzW2ldLnBvaW50LmFkZHJlc3MpIHsKKwkJCXRtcCA9IHN0cmR1cChyZWxvY19zeW0tPm5hbWUpOworCQkJaWYgKCF0bXApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlmcmVlKHRldnNbaV0ucG9pbnQuc3ltYm9sKTsKKwkJCXRldnNbaV0ucG9pbnQuc3ltYm9sID0gdG1wOworCQkJdGV2c1tpXS5wb2ludC5vZmZzZXQgPSB0ZXZzW2ldLnBvaW50LmFkZHJlc3MgLQorCQkJCQkgICAgICAgcmVsb2Nfc3ltLT51bnJlbG9jYXRlZF9hZGRyOworCQl9CisJfQorCXJldHVybiAwOwogfQogCiAvKiBUcnkgdG8gZmluZCBwZXJmX3Byb2JlX2V2ZW50IHdpdGggZGVidWdpbmZvICovCkBAIC00MTYsMjEgKzQ2OCwxNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlwcl9kZWJ1ZygiVHJ5IHRvIGZpbmQgcHJvYmUgcG9pbnQgZnJvbSBkZWJ1Z2luZm8uXG4iKTsKIAkvKiBTZWFyY2hpbmcgdHJhY2UgZXZlbnRzIGNvcnJlc3BvbmRpbmcgdG8gYSBwcm9iZSBldmVudCAqLwogCW50ZXZzID0gZGVidWdpbmZvX19maW5kX3RyYWNlX2V2ZW50cyhkaW5mbywgcGV2LCB0ZXZzLCBtYXhfdGV2cyk7CiAKIAlkZWJ1Z2luZm9fX2RlbGV0ZShkaW5mbyk7CiAKIAlpZiAobnRldnMgPiAwKSB7CS8qIFN1Y2NlZWRlZCB0byBmaW5kIHRyYWNlIGV2ZW50cyAqLwotCQlwcl9kZWJ1ZygiZmluZCAlZCBwcm9iZV90cmFjZV9ldmVudHMuXG4iLCBudGV2cyk7Ci0JCWlmICh0YXJnZXQpIHsKLQkJCWlmIChwZXYtPnVwcm9iZXMpCi0JCQkJcmV0ID0gYWRkX2V4ZWNfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLAotCQkJCQkJIG50ZXZzLCB0YXJnZXQpOwotCQkJZWxzZQotCQkJCXJldCA9IGFkZF9tb2R1bGVfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLAotCQkJCQkJIG50ZXZzLCB0YXJnZXQpOwotCQl9CisJCXByX2RlYnVnKCJGb3VuZCAlZCBwcm9iZV90cmFjZV9ldmVudHMuXG4iLCBudGV2cyk7CisJCXJldCA9IHBvc3RfcHJvY2Vzc19wcm9iZV90cmFjZV9ldmVudHMoKnRldnMsIG50ZXZzLAorCQkJCQkJCXRhcmdldCwgcGV2LT51cHJvYmVzKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWNsZWFyX3Byb2JlX3RyYWNlX2V2ZW50cygqdGV2cywgbnRldnMpOwogCQkJemZyZWUodGV2cyk7CkBAIC01NjMsMjAgKzYxMCwxNiBAQAogICogU2hvdyBsaW5lLXJhbmdlIGFsd2F5cyByZXF1aXJlcyBkZWJ1Z2luZm8gdG8gZmluZCBzb3VyY2UgZmlsZSBhbmQKICAqIGxpbmUgbnVtYmVyLgogICovCi1pbnQgc2hvd19saW5lX3JhbmdlKHN0cnVjdCBsaW5lX3JhbmdlICpsciwgY29uc3QgY2hhciAqbW9kdWxlKQorc3RhdGljIGludCBfX3Nob3dfbGluZV9yYW5nZShzdHJ1Y3QgbGluZV9yYW5nZSAqbHIsIGNvbnN0IGNoYXIgKm1vZHVsZSkKIHsKIAlpbnQgbCA9IDE7Ci0Jc3RydWN0IGxpbmVfbm9kZSAqbG47CisJc3RydWN0IGludF9ub2RlICpsbjsKIAlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKIAlGSUxFICpmcDsKIAlpbnQgcmV0OwogCWNoYXIgKnRtcDsKIAogCS8qIFNlYXJjaCBhIGxpbmUgcmFuZ2UgKi8KLQlyZXQgPSBpbml0X3ZtbGludXgoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCWRpbmZvID0gb3Blbl9kZWJ1Z2luZm8obW9kdWxlKTsKIAlpZiAoIWRpbmZvKSB7CiAJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBvcGVuIGRlYnVnaW5mbyBmaWxlLlxuIik7CkBAIC02MjMsOCArNjY2LDggQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobG4sICZsci0+bGluZV9saXN0LCBsaXN0KSB7Ci0JCWZvciAoOyBsbi0+bGluZSA+IGw7IGwrKykgeworCWludGxpc3RfX2Zvcl9lYWNoKGxuLCBsci0+bGluZV9saXN0KSB7CisJCWZvciAoOyBsbi0+aSA+IGw7IGwrKykgewogCQkJcmV0ID0gc2hvd19vbmVfbGluZShmcCwgbCAtIGxyLT5vZmZzZXQpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBlbmQ7CkBAIC02NDYsNiArNjg5LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHNob3dfbGluZV9yYW5nZShzdHJ1Y3QgbGluZV9yYW5nZSAqbHIsIGNvbnN0IGNoYXIgKm1vZHVsZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9zeW1ib2xfbWFwcyhmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gX19zaG93X2xpbmVfcmFuZ2UobHIsIG1vZHVsZSk7CisJZXhpdF9zeW1ib2xfbWFwcygpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBzaG93X2F2YWlsYWJsZV92YXJzX2F0KHN0cnVjdCBkZWJ1Z2luZm8gKmRpbmZvLAogCQkJCSAgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKIAkJCQkgIGludCBtYXhfdmxzLCBzdHJ1Y3Qgc3RyZmlsdGVyICpfZmlsdGVyLApAQCAtNzA3LDE0ICs3NjMsMTUgQEAKIAlpbnQgaSwgcmV0ID0gMDsKIAlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKIAotCXJldCA9IGluaXRfdm1saW51eCgpOworCXJldCA9IGluaXRfc3ltYm9sX21hcHMoZmFsc2UpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJZGluZm8gPSBvcGVuX2RlYnVnaW5mbyhtb2R1bGUpOwogCWlmICghZGluZm8pIHsKIAkJcHJfd2FybmluZygiRmFpbGVkIHRvIG9wZW4gZGVidWdpbmZvIGZpbGUuXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OwogCX0KIAogCXNldHVwX3BhZ2VyKCk7CkBAIC03MjQsMjMgKzc4MSwxOSBAQAogCQkJCQkgICAgIGV4dGVybnMpOwogCiAJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOworb3V0OgorCWV4aXRfc3ltYm9sX21hcHMoKTsKIAlyZXR1cm4gcmV0OwogfQogCiAjZWxzZQkvKiAhSEFWRV9EV0FSRl9TVVBQT1JUICovCiAKLXN0YXRpYyBpbnQga3Byb2JlX2NvbnZlcnRfdG9fcGVyZl9wcm9iZShzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAotCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHApCitzdGF0aWMgaW50CitmaW5kX3BlcmZfcHJvYmVfcG9pbnRfZnJvbV9kd2FyZihzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwIF9fbWF5YmVfdW51c2VkLAorCQkJCSBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgX19tYXliZV91bnVzZWQsCisJCQkJIGJvb2wgaXNfa3Byb2JlIF9fbWF5YmVfdW51c2VkKQogewotCXN0cnVjdCBzeW1ib2wgKnN5bTsKLQotCXN5bSA9IF9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZSh0cC0+c3ltYm9sLCBOVUxMKTsKLQlpZiAoIXN5bSkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHN5bWJvbCAlcyBpbiBrZXJuZWwuXG4iLCB0cC0+c3ltYm9sKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JcmV0dXJuIGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludCh0cCwgcHApOworCXJldHVybiAtRU5PU1lTOwogfQogCiBzdGF0aWMgaW50IHRyeV90b19maW5kX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LApAQCAtNzc2LDI0ICs4MjksMjIgQEAKIAogdm9pZCBsaW5lX3JhbmdlX19jbGVhcihzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpCiB7Ci0Jc3RydWN0IGxpbmVfbm9kZSAqbG47Ci0KIAlmcmVlKGxyLT5mdW5jdGlvbik7CiAJZnJlZShsci0+ZmlsZSk7CiAJZnJlZShsci0+cGF0aCk7CiAJZnJlZShsci0+Y29tcF9kaXIpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmbHItPmxpbmVfbGlzdCkpIHsKLQkJbG4gPSBsaXN0X2ZpcnN0X2VudHJ5KCZsci0+bGluZV9saXN0LCBzdHJ1Y3QgbGluZV9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmxuLT5saXN0KTsKLQkJZnJlZShsbik7Ci0JfQorCWludGxpc3RfX2RlbGV0ZShsci0+bGluZV9saXN0KTsKIAltZW1zZXQobHIsIDAsIHNpemVvZigqbHIpKTsKIH0KIAotdm9pZCBsaW5lX3JhbmdlX19pbml0KHN0cnVjdCBsaW5lX3JhbmdlICpscikKK2ludCBsaW5lX3JhbmdlX19pbml0KHN0cnVjdCBsaW5lX3JhbmdlICpscikKIHsKIAltZW1zZXQobHIsIDAsIHNpemVvZigqbHIpKTsKLQlJTklUX0xJU1RfSEVBRCgmbHItPmxpbmVfbGlzdCk7CisJbHItPmxpbmVfbGlzdCA9IGludGxpc3RfX25ldyhOVUxMKTsKKwlpZiAoIWxyLT5saW5lX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfbGluZV9udW0oY2hhciAqKnB0ciwgaW50ICp2YWwsIGNvbnN0IGNoYXIgKndoYXQpCkBAIC0xMjY3LDE2ICsxMzE4LDIxIEBACiAJfSBlbHNlCiAJCXAgPSBhcmd2WzFdOwogCWZtdDFfc3RyID0gc3RydG9rX3IocCwgIisiLCAmZm10KTsKLQl0cC0+c3ltYm9sID0gc3RyZHVwKGZtdDFfc3RyKTsKLQlpZiAodHAtPnN5bWJvbCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCWlmIChmbXQxX3N0clswXSA9PSAnMCcpCS8qIG9ubHkgdGhlIGFkZHJlc3Mgc3RhcnRlZCB3aXRoIDB4ICovCisJCXRwLT5hZGRyZXNzID0gc3RydG91bChmbXQxX3N0ciwgTlVMTCwgMCk7CisJZWxzZSB7CisJCS8qIE9ubHkgdGhlIHN5bWJvbC1iYXNlZCBwcm9iZSBoYXMgb2Zmc2V0ICovCisJCXRwLT5zeW1ib2wgPSBzdHJkdXAoZm10MV9zdHIpOworCQlpZiAodHAtPnN5bWJvbCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZm10Ml9zdHIgPSBzdHJ0b2tfcihOVUxMLCAiIiwgJmZtdCk7CisJCWlmIChmbXQyX3N0ciA9PSBOVUxMKQorCQkJdHAtPm9mZnNldCA9IDA7CisJCWVsc2UKKwkJCXRwLT5vZmZzZXQgPSBzdHJ0b3VsKGZtdDJfc3RyLCBOVUxMLCAxMCk7CiAJfQotCWZtdDJfc3RyID0gc3RydG9rX3IoTlVMTCwgIiIsICZmbXQpOwotCWlmIChmbXQyX3N0ciA9PSBOVUxMKQotCQl0cC0+b2Zmc2V0ID0gMDsKLQllbHNlCi0JCXRwLT5vZmZzZXQgPSBzdHJ0b3VsKGZtdDJfc3RyLCBOVUxMLCAxMCk7CiAKIAl0ZXYtPm5hcmdzID0gYXJnYyAtIDI7CiAJdGV2LT5hcmdzID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnKSAqIHRldi0+bmFyZ3MpOwpAQCAtMTUxOCwyMCArMTU3NCwyNyBAQAogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKwlsZW4gPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVjOiVzLyVzICIsIHRwLT5yZXRwcm9iZSA/ICdyJyA6ICdwJywKKwkJCSB0ZXYtPmdyb3VwLCB0ZXYtPmV2ZW50KTsKKwlpZiAobGVuIDw9IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBVcHJvYmVzIG11c3QgaGF2ZSB0cC0+YWRkcmVzcyBhbmQgdHAtPm1vZHVsZSAqLworCWlmICh0ZXYtPnVwcm9iZXMgJiYgKCF0cC0+YWRkcmVzcyB8fCAhdHAtPm1vZHVsZSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBVc2UgdGhlIHRwLT5hZGRyZXNzIGZvciB1cHJvYmVzICovCiAJaWYgKHRldi0+dXByb2JlcykKLQkJbGVuID0gZV9zbnByaW50ZihidWYsIE1BWF9DTURMRU4sICIlYzolcy8lcyAlczolcyIsCi0JCQkJIHRwLT5yZXRwcm9iZSA/ICdyJyA6ICdwJywKLQkJCQkgdGV2LT5ncm91cCwgdGV2LT5ldmVudCwKLQkJCQkgdHAtPm1vZHVsZSwgdHAtPnN5bWJvbCk7CisJCXJldCA9IGVfc25wcmludGYoYnVmICsgbGVuLCBNQVhfQ01ETEVOIC0gbGVuLCAiJXM6MHglbHgiLAorCQkJCSB0cC0+bW9kdWxlLCB0cC0+YWRkcmVzcyk7CiAJZWxzZQotCQlsZW4gPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVjOiVzLyVzICVzJXMlcyslbHUiLAotCQkJCSB0cC0+cmV0cHJvYmUgPyAncicgOiAncCcsCi0JCQkJIHRldi0+Z3JvdXAsIHRldi0+ZXZlbnQsCisJCXJldCA9IGVfc25wcmludGYoYnVmICsgbGVuLCBNQVhfQ01ETEVOIC0gbGVuLCAiJXMlcyVzKyVsdSIsCiAJCQkJIHRwLT5tb2R1bGUgPzogIiIsIHRwLT5tb2R1bGUgPyAiOiIgOiAiIiwKIAkJCQkgdHAtPnN5bWJvbCwgdHAtPm9mZnNldCk7CiAKLQlpZiAobGVuIDw9IDApCisJaWYgKHJldCA8PSAwKQogCQlnb3RvIGVycm9yOworCWxlbiArPSByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgdGV2LT5uYXJnczsgaSsrKSB7CiAJCXJldCA9IHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfYXJnKCZ0ZXYtPmFyZ3NbaV0sIGJ1ZiArIGxlbiwKQEAgLTE1NDcsNiArMTYxMCw3OSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGZpbmRfcGVyZl9wcm9iZV9wb2ludF9mcm9tX21hcChzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAorCQkJCQkgIHN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCwKKwkJCQkJICBib29sIGlzX2twcm9iZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBOVUxMOworCXN0cnVjdCBtYXAgKm1hcDsKKwl1NjQgYWRkcjsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKworCWlmICghaXNfa3Byb2JlKSB7CisJCW1hcCA9IGRzb19fbmV3X21hcCh0cC0+bW9kdWxlKTsKKwkJaWYgKCFtYXApCisJCQlnb3RvIG91dDsKKwkJYWRkciA9IHRwLT5hZGRyZXNzOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgYWRkciwgTlVMTCk7CisJfSBlbHNlIHsKKwkJYWRkciA9IGtlcm5lbF9nZXRfc3ltYm9sX2FkZHJlc3NfYnlfbmFtZSh0cC0+c3ltYm9sLCB0cnVlKTsKKwkJaWYgKGFkZHIpIHsKKwkJCWFkZHIgKz0gdHAtPm9mZnNldDsKKwkJCXN5bSA9IF9fZmluZF9rZXJuZWxfZnVuY3Rpb24oYWRkciwgJm1hcCk7CisJCX0KKwl9CisJaWYgKCFzeW0pCisJCWdvdG8gb3V0OworCisJcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOworCXBwLT5vZmZzZXQgPSBhZGRyIC0gbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpOworCXBwLT5mdW5jdGlvbiA9IHN0cmR1cChzeW0tPm5hbWUpOworCXJldCA9IHBwLT5mdW5jdGlvbiA/IDAgOiAtRU5PTUVNOworCitvdXQ6CisJaWYgKG1hcCAmJiAhaXNfa3Byb2JlKSB7CisJCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKKwkJbWFwX19kZWxldGUobWFwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludChzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAorCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAsCisJCQkJCWJvb2wgaXNfa3Byb2JlKQoreworCWNoYXIgYnVmWzEyOF07CisJaW50IHJldDsKKworCXJldCA9IGZpbmRfcGVyZl9wcm9iZV9wb2ludF9mcm9tX2R3YXJmKHRwLCBwcCwgaXNfa3Byb2JlKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gZmluZF9wZXJmX3Byb2JlX3BvaW50X2Zyb21fbWFwKHRwLCBwcCwgaXNfa3Byb2JlKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlwcl9kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgcHJvYmUgcG9pbnQgZnJvbSBib3RoIG9mIGR3YXJmIGFuZCBtYXAuXG4iKTsKKworCWlmICh0cC0+c3ltYm9sKSB7CisJCXBwLT5mdW5jdGlvbiA9IHN0cmR1cCh0cC0+c3ltYm9sKTsKKwkJcHAtPm9mZnNldCA9IHRwLT5vZmZzZXQ7CisJfSBlbHNlIGlmICghdHAtPm1vZHVsZSAmJiAhaXNfa3Byb2JlKSB7CisJCXJldCA9IGVfc25wcmludGYoYnVmLCAxMjgsICIweCUiIFBSSXg2NCwgKHU2NCl0cC0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcHAtPmZ1bmN0aW9uID0gc3RyZHVwKGJ1Zik7CisJCXBwLT5vZmZzZXQgPSAwOworCX0KKwlpZiAocHAtPmZ1bmN0aW9uID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY29udmVydF90b19wZXJmX3Byb2JlX2V2ZW50KHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2LAogCQkJICAgICAgIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsIGJvb2wgaXNfa3Byb2JlKQogewpAQCAtMTU2MCwxMSArMTY5Niw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogQ29udmVydCB0cmFjZV9wb2ludCB0byBwcm9iZV9wb2ludCAqLwotCWlmIChpc19rcHJvYmUpCi0JCXJldCA9IGtwcm9iZV9jb252ZXJ0X3RvX3BlcmZfcHJvYmUoJnRldi0+cG9pbnQsICZwZXYtPnBvaW50KTsKLQllbHNlCi0JCXJldCA9IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludCgmdGV2LT5wb2ludCwgJnBldi0+cG9pbnQpOwotCisJcmV0ID0gY29udmVydF90b19wZXJmX3Byb2JlX3BvaW50KCZ0ZXYtPnBvaW50LCAmcGV2LT5wb2ludCwgaXNfa3Byb2JlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTczMSw3ICsxODYzLDggQEAKIH0KIAogLyogU2hvdyBhbiBldmVudCAqLwotc3RhdGljIGludCBzaG93X3BlcmZfcHJvYmVfZXZlbnQoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikKK3N0YXRpYyBpbnQgc2hvd19wZXJmX3Byb2JlX2V2ZW50KHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCisJCQkJIGNvbnN0IGNoYXIgKm1vZHVsZSkKIHsKIAlpbnQgaSwgcmV0OwogCWNoYXIgYnVmWzEyOF07CkBAIC0xNzQ3LDYgKzE4ODAsOCBAQAogCQlyZXR1cm4gcmV0OwogCiAJcHJpbnRmKCIgICUtMjBzIChvbiAlcyIsIGJ1ZiwgcGxhY2UpOworCWlmIChtb2R1bGUpCisJCXByaW50ZigiIGluICVzIiwgbW9kdWxlKTsKIAogCWlmIChwZXYtPm5hcmdzID4gMCkgewogCQlwcmludGYoIiB3aXRoIik7CkBAIC0xNzg0LDcgKzE5MTksOCBAQAogCQkJcmV0ID0gY29udmVydF90b19wZXJmX3Byb2JlX2V2ZW50KCZ0ZXYsICZwZXYsCiAJCQkJCQkJCWlzX2twcm9iZSk7CiAJCQlpZiAocmV0ID49IDApCi0JCQkJcmV0ID0gc2hvd19wZXJmX3Byb2JlX2V2ZW50KCZwZXYpOworCQkJCXJldCA9IHNob3dfcGVyZl9wcm9iZV9ldmVudCgmcGV2LAorCQkJCQkJCSAgICB0ZXYucG9pbnQubW9kdWxlKTsKIAkJfQogCQljbGVhcl9wZXJmX3Byb2JlX2V2ZW50KCZwZXYpOwogCQljbGVhcl9wcm9iZV90cmFjZV9ldmVudCgmdGV2KTsKQEAgLTE4MDcsNyArMTk0Myw3IEBACiAJaWYgKGZkIDwgMCkKIAkJcmV0dXJuIGZkOwogCi0JcmV0ID0gaW5pdF92bWxpbnV4KCk7CisJcmV0ID0gaW5pdF9zeW1ib2xfbWFwcyhmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE4MjAsNiArMTk1Niw3IEBACiAJCWNsb3NlKGZkKTsKIAl9CiAKKwlleGl0X3N5bWJvbF9tYXBzKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTk4Miw3ICsyMTE5LDcgQEAKIAkJZ3JvdXAgPSBwZXYtPmdyb3VwOwogCQlwZXYtPmV2ZW50ID0gdGV2LT5ldmVudDsKIAkJcGV2LT5ncm91cCA9IHRldi0+Z3JvdXA7Ci0JCXNob3dfcGVyZl9wcm9iZV9ldmVudChwZXYpOworCQlzaG93X3BlcmZfcHJvYmVfZXZlbnQocGV2LCB0ZXYtPnBvaW50Lm1vZHVsZSk7CiAJCS8qIFRyaWNrIGhlcmUgLSByZXN0b3JlIGN1cnJlbnQgZXZlbnQvZ3JvdXAgKi8KIAkJcGV2LT5ldmVudCA9IChjaGFyICopZXZlbnQ7CiAJCXBldi0+Z3JvdXAgPSAoY2hhciAqKWdyb3VwOwpAQCAtMjAwOCwxMyArMjE0NSwxNTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY2hhciAqbG9va2luZ19mdW5jdGlvbl9uYW1lOworc3RhdGljIGludCBudW1fbWF0Y2hlZF9mdW5jdGlvbnM7CisKK3N0YXRpYyBpbnQgcHJvYmVfZnVuY3Rpb25fZmlsdGVyKHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCwKKwkJCQkgICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKChzeW0tPmJpbmRpbmcgPT0gU1RCX0dMT0JBTCB8fCBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMKSAmJgorCSAgICBzdHJjbXAobG9va2luZ19mdW5jdGlvbl9uYW1lLCBzeW0tPm5hbWUpID09IDApIHsKKwkJbnVtX21hdGNoZWRfZnVuY3Rpb25zKys7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBzdHJkdXBfb3JfZ290byhzdHIsIGxhYmVsKQlcCisJKHsgY2hhciAqX19wID0gc3RyZHVwKHN0cik7IGlmICghX19wKSBnb3RvIGxhYmVsOyBfX3A7IH0pCisKKy8qCisgKiBGaW5kIHByb2JlIGZ1bmN0aW9uIGFkZHJlc3NlcyBmcm9tIG1hcC4KKyAqIFJldHVybiBhbiBlcnJvciBvciB0aGUgbnVtYmVyIG9mIGZvdW5kIHByb2JlX3RyYWNlX2V2ZW50CisgKi8KK3N0YXRpYyBpbnQgZmluZF9wcm9iZV90cmFjZV9ldmVudHNfZnJvbV9tYXAoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQkJICAgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsCisJCQkJCSAgICBpbnQgbWF4X3RldnMsIGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOworCXN0cnVjdCBrbWFwICprbWFwID0gTlVMTDsKKwlzdHJ1Y3QgcmVmX3JlbG9jX3N5bSAqcmVsb2Nfc3ltID0gTlVMTDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHJiX25vZGUgKm5kOworCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2OworCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCA9ICZwZXYtPnBvaW50OworCXN0cnVjdCBwcm9iZV90cmFjZV9wb2ludCAqdHA7CisJaW50IHJldCwgaTsKKworCS8qIEluaXQgbWFwcyBvZiBnaXZlbiBleGVjdXRhYmxlIG9yIGtlcm5lbCAqLworCWlmIChwZXYtPnVwcm9iZXMpCisJCW1hcCA9IGRzb19fbmV3X21hcCh0YXJnZXQpOworCWVsc2UKKwkJbWFwID0ga2VybmVsX2dldF9tb2R1bGVfbWFwKHRhcmdldCk7CisJaWYgKCFtYXApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBMb2FkIG1hdGNoZWQgc3ltYm9sczogU2luY2UgdGhlIGRpZmZlcmVudCBsb2NhbCBzeW1ib2xzIG1heSBoYXZlCisJICogc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgYWRkcmVzc2VzLCB0aGlzIGxpc3RzIGFsbCB0aGUgc3ltYm9scy4KKwkgKi8KKwludW1fbWF0Y2hlZF9mdW5jdGlvbnMgPSAwOworCWxvb2tpbmdfZnVuY3Rpb25fbmFtZSA9IHBwLT5mdW5jdGlvbjsKKwlyZXQgPSBtYXBfX2xvYWQobWFwLCBwcm9iZV9mdW5jdGlvbl9maWx0ZXIpOworCWlmIChyZXQgfHwgbnVtX21hdGNoZWRfZnVuY3Rpb25zID09IDApIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBzeW1ib2wgJXMgaW4gJXNcbiIsIHBwLT5mdW5jdGlvbiwKKwkJCXRhcmdldCA/IDogImtlcm5lbCIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKG51bV9tYXRjaGVkX2Z1bmN0aW9ucyA+IG1heF90ZXZzKSB7CisJCXByX2VycigiVG9vIG1hbnkgZnVuY3Rpb25zIG1hdGNoZWQgaW4gJXNcbiIsCisJCQl0YXJnZXQgPyA6ICJrZXJuZWwiKTsKKwkJcmV0ID0gLUUyQklHOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXBldi0+dXByb2JlcykgeworCQlrbWFwID0gbWFwX19rbWFwKG1hcCk7CisJCXJlbG9jX3N5bSA9IGttYXAtPnJlZl9yZWxvY19zeW07CisJCWlmICghcmVsb2Nfc3ltKSB7CisJCQlwcl93YXJuaW5nKCJSZWxvY2F0ZWQgYmFzZSBzeW1ib2wgaXMgbm90IGZvdW5kIVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBTZXR1cCByZXN1bHQgdHJhY2UtcHJvYmUtZXZlbnRzICovCisJKnRldnMgPSB6YWxsb2Moc2l6ZW9mKCp0ZXYpICogbnVtX21hdGNoZWRfZnVuY3Rpb25zKTsKKwlpZiAoISp0ZXZzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IDA7CisJbWFwX19mb3JfZWFjaF9zeW1ib2wobWFwLCBzeW0sIG5kKSB7CisJCXRldiA9ICgqdGV2cykgKyByZXQ7CisJCXRwID0gJnRldi0+cG9pbnQ7CisJCWlmIChyZXQgPT0gbnVtX21hdGNoZWRfZnVuY3Rpb25zKSB7CisJCQlwcl93YXJuaW5nKCJUb28gbWFueSBzeW1ib2xzIGFyZSBsaXN0ZWQuIFNraXAgaXQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJldCsrOworCisJCWlmIChwcC0+b2Zmc2V0ID4gc3ltLT5lbmQgLSBzeW0tPnN0YXJ0KSB7CisJCQlwcl93YXJuaW5nKCJPZmZzZXQgJWxkIGlzIGJpZ2dlciB0aGFuIHRoZSBzaXplIG9mICVzXG4iLAorCQkJCSAgIHBwLT5vZmZzZXQsIHN5bS0+bmFtZSk7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCS8qIEFkZCBvbmUgcHJvYmUgcG9pbnQgKi8KKwkJdHAtPmFkZHJlc3MgPSBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCkgKyBwcC0+b2Zmc2V0OworCQlpZiAocmVsb2Nfc3ltKSB7CisJCQl0cC0+c3ltYm9sID0gc3RyZHVwX29yX2dvdG8ocmVsb2Nfc3ltLT5uYW1lLCBub21lbV9vdXQpOworCQkJdHAtPm9mZnNldCA9IHRwLT5hZGRyZXNzIC0gcmVsb2Nfc3ltLT5hZGRyOworCQl9IGVsc2UgeworCQkJdHAtPnN5bWJvbCA9IHN0cmR1cF9vcl9nb3RvKHN5bS0+bmFtZSwgbm9tZW1fb3V0KTsKKwkJCXRwLT5vZmZzZXQgPSBwcC0+b2Zmc2V0OworCQl9CisJCXRwLT5yZXRwcm9iZSA9IHBwLT5yZXRwcm9iZTsKKwkJaWYgKHRhcmdldCkKKwkJCXRldi0+cG9pbnQubW9kdWxlID0gc3RyZHVwX29yX2dvdG8odGFyZ2V0LCBub21lbV9vdXQpOworCQl0ZXYtPnVwcm9iZXMgPSBwZXYtPnVwcm9iZXM7CisJCXRldi0+bmFyZ3MgPSBwZXYtPm5hcmdzOworCQlpZiAodGV2LT5uYXJncykgeworCQkJdGV2LT5hcmdzID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnKSAqCisJCQkJCSAgIHRldi0+bmFyZ3MpOworCQkJaWYgKHRldi0+YXJncyA9PSBOVUxMKQorCQkJCWdvdG8gbm9tZW1fb3V0OworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB0ZXYtPm5hcmdzOyBpKyspIHsKKwkJCWlmIChwZXYtPmFyZ3NbaV0ubmFtZSkKKwkJCQl0ZXYtPmFyZ3NbaV0ubmFtZSA9CisJCQkJCXN0cmR1cF9vcl9nb3RvKHBldi0+YXJnc1tpXS5uYW1lLAorCQkJCQkJCW5vbWVtX291dCk7CisKKwkJCXRldi0+YXJnc1tpXS52YWx1ZSA9IHN0cmR1cF9vcl9nb3RvKHBldi0+YXJnc1tpXS52YXIsCisJCQkJCQkJICAgIG5vbWVtX291dCk7CisJCQlpZiAocGV2LT5hcmdzW2ldLnR5cGUpCisJCQkJdGV2LT5hcmdzW2ldLnR5cGUgPQorCQkJCQlzdHJkdXBfb3JfZ290byhwZXYtPmFyZ3NbaV0udHlwZSwKKwkJCQkJCQlub21lbV9vdXQpOworCQl9CisJfQorCitvdXQ6CisJaWYgKG1hcCAmJiBwZXYtPnVwcm9iZXMpIHsKKwkJLyogT25seSB3aGVuIHVzaW5nIHVwcm9iZShleGVjKSBtYXAgbmVlZHMgdG8gYmUgcmVsZWFzZWQgKi8KKwkJZHNvX19kZWxldGUobWFwLT5kc28pOworCQltYXBfX2RlbGV0ZShtYXApOworCX0KKwlyZXR1cm4gcmV0OworCitub21lbV9vdXQ6CisJcmV0ID0gLUVOT01FTTsKK2Vycl9vdXQ6CisJY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLCBudW1fbWF0Y2hlZF9mdW5jdGlvbnMpOworCXpmcmVlKHRldnMpOworCWdvdG8gb3V0OworfQorCiBzdGF0aWMgaW50IGNvbnZlcnRfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCiAJCQkJCSAgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKIAkJCQkJICBpbnQgbWF4X3RldnMsIGNvbnN0IGNoYXIgKnRhcmdldCkKIHsKLQlzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JaW50IHJldCwgaTsKLQlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKKwlpbnQgcmV0OwogCiAJaWYgKHBldi0+dXByb2JlcyAmJiAhcGV2LT5ncm91cCkgewogCQkvKiBSZXBsYWNlIGdyb3VwIG5hbWUgaWYgbm90IGdpdmVuICovCkBAIC0yMDMwLDkxICsyMzEzLDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CS8qIEZvdW5kIGluIGRlYnVnaW5mbyBvciBnb3QgYW4gZXJyb3IgKi8KIAotCWlmIChwZXYtPnVwcm9iZXMpIHsKLQkJcmV0ID0gY29udmVydF9uYW1lX3RvX2FkZHIocGV2LCB0YXJnZXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyogQWxsb2NhdGUgdHJhY2UgZXZlbnQgYnVmZmVyICovCi0JdGV2ID0gKnRldnMgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCkpOwotCWlmICh0ZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBDb3B5IHBhcmFtZXRlcnMgKi8KLQl0ZXYtPnBvaW50LnN5bWJvbCA9IHN0cmR1cChwZXYtPnBvaW50LmZ1bmN0aW9uKTsKLQlpZiAodGV2LT5wb2ludC5zeW1ib2wgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWlmICh0YXJnZXQpIHsKLQkJdGV2LT5wb2ludC5tb2R1bGUgPSBzdHJkdXAodGFyZ2V0KTsKLQkJaWYgKHRldi0+cG9pbnQubW9kdWxlID09IE5VTEwpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCi0JdGV2LT5wb2ludC5vZmZzZXQgPSBwZXYtPnBvaW50Lm9mZnNldDsKLQl0ZXYtPnBvaW50LnJldHByb2JlID0gcGV2LT5wb2ludC5yZXRwcm9iZTsKLQl0ZXYtPm5hcmdzID0gcGV2LT5uYXJnczsKLQl0ZXYtPnVwcm9iZXMgPSBwZXYtPnVwcm9iZXM7Ci0KLQlpZiAodGV2LT5uYXJncykgewotCQl0ZXYtPmFyZ3MgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9hcmcpCi0JCQkJICAgKiB0ZXYtPm5hcmdzKTsKLQkJaWYgKHRldi0+YXJncyA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgdGV2LT5uYXJnczsgaSsrKSB7Ci0JCQlpZiAocGV2LT5hcmdzW2ldLm5hbWUpIHsKLQkJCQl0ZXYtPmFyZ3NbaV0ubmFtZSA9IHN0cmR1cChwZXYtPmFyZ3NbaV0ubmFtZSk7Ci0JCQkJaWYgKHRldi0+YXJnc1tpXS5uYW1lID09IE5VTEwpIHsKLQkJCQkJcmV0ID0gLUVOT01FTTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXYtPmFyZ3NbaV0udmFsdWUgPSBzdHJkdXAocGV2LT5hcmdzW2ldLnZhcik7Ci0JCQlpZiAodGV2LT5hcmdzW2ldLnZhbHVlID09IE5VTEwpIHsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAocGV2LT5hcmdzW2ldLnR5cGUpIHsKLQkJCQl0ZXYtPmFyZ3NbaV0udHlwZSA9IHN0cmR1cChwZXYtPmFyZ3NbaV0udHlwZSk7Ci0JCQkJaWYgKHRldi0+YXJnc1tpXS50eXBlID09IE5VTEwpIHsKLQkJCQkJcmV0ID0gLUVOT01FTTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocGV2LT51cHJvYmVzKQotCQlyZXR1cm4gMTsKLQotCS8qIEN1cnJlbnRseSBqdXN0IGNoZWNraW5nIGZ1bmN0aW9uIG5hbWUgZnJvbSBzeW1ib2wgbWFwICovCi0Jc3ltID0gX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKHRldi0+cG9pbnQuc3ltYm9sLCBOVUxMKTsKLQlpZiAoIXN5bSkgewotCQlwcl93YXJuaW5nKCJLZXJuZWwgc3ltYm9sIFwnJXNcJyBub3QgZm91bmQuXG4iLAotCQkJICAgdGV2LT5wb2ludC5zeW1ib2wpOwotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycm9yOwotCX0gZWxzZSBpZiAodGV2LT5wb2ludC5vZmZzZXQgPiBzeW0tPmVuZCAtIHN5bS0+c3RhcnQpIHsKLQkJcHJfd2FybmluZygiT2Zmc2V0IHNwZWNpZmllZCBpcyBncmVhdGVyIHRoYW4gc2l6ZSBvZiAlc1xuIiwKLQkJCSAgIHRldi0+cG9pbnQuc3ltYm9sKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBlcnJvcjsKLQotCX0KLQotCXJldHVybiAxOwotZXJyb3I6Ci0JY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQodGV2KTsKLQlmcmVlKHRldik7Ci0JKnRldnMgPSBOVUxMOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzX2Zyb21fbWFwKHBldiwgdGV2cywgbWF4X3RldnMsIHRhcmdldCk7CiB9CiAKIHN0cnVjdCBfX2V2ZW50X3BhY2thZ2UgewpAQCAtMjEzNSwxMiArMjMzNCw3IEBACiAJaWYgKHBrZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIXBldnMtPnVwcm9iZXMpCi0JCS8qIEluaXQgdm1saW51eCBwYXRoICovCi0JCXJldCA9IGluaXRfdm1saW51eCgpOwotCWVsc2UKLQkJcmV0ID0gaW5pdF91c2VyX2V4ZWMoKTsKLQorCXJldCA9IGluaXRfc3ltYm9sX21hcHMocGV2cy0+dXByb2Jlcyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZnJlZShwa2dzKTsKIAkJcmV0dXJuIHJldDsKQEAgLTIxNzQsNiArMjM2OCw3IEBACiAJCXpmcmVlKCZwa2dzW2ldLnRldnMpOwogCX0KIAlmcmVlKHBrZ3MpOworCWV4aXRfc3ltYm9sX21hcHMoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzIzLDE1OSArMjUxOCw1MSBAQAogc3RhdGljIGludCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucyhzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQsCiAJCQkJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltKQogewotCWlmIChzeW0tPmJpbmRpbmcgPT0gU1RCX0dMT0JBTCAmJgorCWlmICgoc3ltLT5iaW5kaW5nID09IFNUQl9HTE9CQUwgfHwgc3ltLT5iaW5kaW5nID09IFNUQl9MT0NBTCkgJiYKIAkgICAgc3RyZmlsdGVyX19jb21wYXJlKGF2YWlsYWJsZV9mdW5jX2ZpbHRlciwgc3ltLT5uYW1lKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgX19zaG93X2F2YWlsYWJsZV9mdW5jcyhzdHJ1Y3QgbWFwICptYXApCitpbnQgc2hvd19hdmFpbGFibGVfZnVuY3MoY29uc3QgY2hhciAqdGFyZ2V0LCBzdHJ1Y3Qgc3RyZmlsdGVyICpfZmlsdGVyLAorCQkJCQlib29sIHVzZXIpCiB7Ci0JaWYgKG1hcF9fbG9hZChtYXAsIGZpbHRlcl9hdmFpbGFibGVfZnVuY3Rpb25zKSkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBsb2FkIG1hcC5cbiIpOworCXN0cnVjdCBtYXAgKm1hcDsKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9zeW1ib2xfbWFwcyh1c2VyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEdldCBhIHN5bWJvbCBtYXAgKi8KKwlpZiAodXNlcikKKwkJbWFwID0gZHNvX19uZXdfbWFwKHRhcmdldCk7CisJZWxzZQorCQltYXAgPSBrZXJuZWxfZ2V0X21vZHVsZV9tYXAodGFyZ2V0KTsKKwlpZiAoIW1hcCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgYSBtYXAgZm9yICVzXG4iLCAodGFyZ2V0KSA/IDogImtlcm5lbCIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwkvKiBMb2FkIHN5bWJvbHMgd2l0aCBnaXZlbiBmaWx0ZXIgKi8KKwlhdmFpbGFibGVfZnVuY19maWx0ZXIgPSBfZmlsdGVyOworCWlmIChtYXBfX2xvYWQobWFwLCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucykpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gbG9hZCBzeW1ib2xzIGluICVzXG4iLCAodGFyZ2V0KSA/IDogImtlcm5lbCIpOworCQlnb3RvIGVuZDsKKwl9CiAJaWYgKCFkc29fX3NvcnRlZF9ieV9uYW1lKG1hcC0+ZHNvLCBtYXAtPnR5cGUpKQogCQlkc29fX3NvcnRfYnlfbmFtZShtYXAtPmRzbywgbWFwLT50eXBlKTsKIAotCWRzb19fZnByaW50Zl9zeW1ib2xzX2J5X25hbWUobWFwLT5kc28sIG1hcC0+dHlwZSwgc3Rkb3V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdmFpbGFibGVfa2VybmVsX2Z1bmNzKGNvbnN0IGNoYXIgKm1vZHVsZSkKLXsKLQlzdHJ1Y3QgbWFwICptYXA7Ci0JaW50IHJldDsKLQotCXJldCA9IGluaXRfdm1saW51eCgpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbWFwID0ga2VybmVsX2dldF9tb2R1bGVfbWFwKG1vZHVsZSk7Ci0JaWYgKCFtYXApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCAlcyBtYXAuXG4iLCAobW9kdWxlKSA/IDogImtlcm5lbCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIF9fc2hvd19hdmFpbGFibGVfZnVuY3MobWFwKTsKLX0KLQotc3RhdGljIGludCBhdmFpbGFibGVfdXNlcl9mdW5jcyhjb25zdCBjaGFyICp0YXJnZXQpCi17Ci0Jc3RydWN0IG1hcCAqbWFwOwotCWludCByZXQ7Ci0KLQlyZXQgPSBpbml0X3VzZXJfZXhlYygpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbWFwID0gZHNvX19uZXdfbWFwKHRhcmdldCk7Ci0JcmV0ID0gX19zaG93X2F2YWlsYWJsZV9mdW5jcyhtYXApOwotCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKLQltYXBfX2RlbGV0ZShtYXApOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBzaG93X2F2YWlsYWJsZV9mdW5jcyhjb25zdCBjaGFyICp0YXJnZXQsIHN0cnVjdCBzdHJmaWx0ZXIgKl9maWx0ZXIsCi0JCQkJCWJvb2wgdXNlcikKLXsKKwkvKiBTaG93IGFsbCAoZmlsdGVyZWQpIHN5bWJvbHMgKi8KIAlzZXR1cF9wYWdlcigpOwotCWF2YWlsYWJsZV9mdW5jX2ZpbHRlciA9IF9maWx0ZXI7Ci0KLQlpZiAoIXVzZXIpCi0JCXJldHVybiBhdmFpbGFibGVfa2VybmVsX2Z1bmNzKHRhcmdldCk7Ci0KLQlyZXR1cm4gYXZhaWxhYmxlX3VzZXJfZnVuY3ModGFyZ2V0KTsKLX0KLQotLyoKLSAqIHVwcm9iZV9ldmVudHMgb25seSBhY2NlcHRzIGFkZHJlc3M6Ci0gKiBDb252ZXJ0IGZ1bmN0aW9uIGFuZCBhbnkgb2Zmc2V0IHRvIGFkZHJlc3MKLSAqLwotc3RhdGljIGludCBjb252ZXJ0X25hbWVfdG9fYWRkcihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LCBjb25zdCBjaGFyICpleGVjKQotewotCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCA9ICZwZXYtPnBvaW50OwotCXN0cnVjdCBzeW1ib2wgKnN5bTsKLQlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOwotCWNoYXIgKmZ1bmN0aW9uID0gTlVMTDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdmFkZHIgPSAwOwotCi0JaWYgKCFwcC0+ZnVuY3Rpb24pIHsKLQkJcHJfd2FybmluZygiTm8gZnVuY3Rpb24gc3BlY2lmaWVkIGZvciB1cHJvYmVzIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZ1bmN0aW9uID0gc3RyZHVwKHBwLT5mdW5jdGlvbik7Ci0JaWYgKCFmdW5jdGlvbikgewotCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGJ5IHN0cmR1cC5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltYXAgPSBkc29fX25ld19tYXAoZXhlYyk7Ci0JaWYgKCFtYXApIHsKLQkJcHJfd2FybmluZygiQ2Fubm90IGZpbmQgYXBwcm9wcmlhdGUgRFNPIGZvciAlcy5cbiIsIGV4ZWMpOwotCQlnb3RvIG91dDsKLQl9Ci0JYXZhaWxhYmxlX2Z1bmNfZmlsdGVyID0gc3RyZmlsdGVyX19uZXcoZnVuY3Rpb24sIE5VTEwpOwotCWlmIChtYXBfX2xvYWQobWFwLCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucykpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gbG9hZCBtYXAuXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKG1hcCwgZnVuY3Rpb24sIE5VTEwpOwotCWlmICghc3ltKSB7Ci0JCXByX3dhcm5pbmcoIkNhbm5vdCBmaW5kICVzIGluIERTTyAlc1xuIiwgZnVuY3Rpb24sIGV4ZWMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAobWFwLT5zdGFydCA+IHN5bS0+c3RhcnQpCi0JCXZhZGRyID0gbWFwLT5zdGFydDsKLQl2YWRkciArPSBzeW0tPnN0YXJ0ICsgcHAtPm9mZnNldCArIG1hcC0+cGdvZmY7Ci0JcHAtPm9mZnNldCA9IDA7Ci0KLQlpZiAoIXBldi0+ZXZlbnQpIHsKLQkJcGV2LT5ldmVudCA9IGZ1bmN0aW9uOwotCQlmdW5jdGlvbiA9IE5VTEw7Ci0JfQotCWlmICghcGV2LT5ncm91cCkgewotCQljaGFyICpwdHIxLCAqcHRyMiwgKmV4ZWNfY29weTsKLQotCQlwZXYtPmdyb3VwID0gemFsbG9jKHNpemVvZihjaGFyICopICogNjQpOwotCQlleGVjX2NvcHkgPSBzdHJkdXAoZXhlYyk7Ci0JCWlmICghZXhlY19jb3B5KSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIGNvcHkgZXhlYyBzdHJpbmcuXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcHRyMSA9IHN0cmR1cChiYXNlbmFtZShleGVjX2NvcHkpKTsKLQkJaWYgKHB0cjEpIHsKLQkJCXB0cjIgPSBzdHJwYnJrKHB0cjEsICItLl8iKTsKLQkJCWlmIChwdHIyKQotCQkJCSpwdHIyID0gJ1wwJzsKLQkJCWVfc25wcmludGYocGV2LT5ncm91cCwgNjQsICIlc18lcyIsIFBFUkZQUk9CRV9HUk9VUCwKLQkJCQkJcHRyMSk7Ci0JCQlmcmVlKHB0cjEpOwotCQl9Ci0JCWZyZWUoZXhlY19jb3B5KTsKLQl9Ci0JZnJlZShwcC0+ZnVuY3Rpb24pOwotCXBwLT5mdW5jdGlvbiA9IHphbGxvYyhzaXplb2YoY2hhciAqKSAqIE1BWF9QUk9CRV9BUkdTKTsKLQlpZiAoIXBwLT5mdW5jdGlvbikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGJ5IHphbGxvYy5cbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JZV9zbnByaW50ZihwcC0+ZnVuY3Rpb24sIE1BWF9QUk9CRV9BUkdTLCAiMHglbGx4IiwgdmFkZHIpOwotCXJldCA9IDA7Ci0KLW91dDoKLQlpZiAobWFwKSB7CisJZHNvX19mcHJpbnRmX3N5bWJvbHNfYnlfbmFtZShtYXAtPmRzbywgbWFwLT50eXBlLCBzdGRvdXQpOworZW5kOgorCWlmICh1c2VyKSB7CiAJCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKIAkJbWFwX19kZWxldGUobWFwKTsKIAl9Ci0JaWYgKGZ1bmN0aW9uKQotCQlmcmVlKGZ1bmN0aW9uKTsKKwlleGl0X3N5bWJvbF9tYXBzKCk7CisKIAlyZXR1cm4gcmV0OwogfQorCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCmluZGV4IGZjYWY3MjcuLjc3NmM5MzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfUFJPQkVfRVZFTlRfSAogCiAjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgImludGxpc3QuaCIKICNpbmNsdWRlICJzdHJsaXN0LmgiCiAjaW5jbHVkZSAic3RyZmlsdGVyLmgiCiAKQEAgLTc2LDEzICs3Nyw2IEBACiAJc3RydWN0IHBlcmZfcHJvYmVfYXJnCSphcmdzOwkvKiBBcmd1bWVudHMgKi8KIH07CiAKLQotLyogTGluZSBudW1iZXIgY29udGFpbmVyICovCi1zdHJ1Y3QgbGluZV9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JaW50CQkJbGluZTsKLX07Ci0KIC8qIExpbmUgcmFuZ2UgKi8KIHN0cnVjdCBsaW5lX3JhbmdlIHsKIAljaGFyCQkJKmZpbGU7CQkvKiBGaWxlIG5hbWUgKi8KQEAgLTkyLDcgKzg2LDcgQEAKIAlpbnQJCQlvZmZzZXQ7CQkvKiBTdGFydCBsaW5lIG9mZnNldCAqLwogCWNoYXIJCQkqcGF0aDsJCS8qIFJlYWwgcGF0aCBuYW1lICovCiAJY2hhcgkJCSpjb21wX2RpcjsJLyogQ29tcGlsZSBkaXJlY3RvcnkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbmVfbGlzdDsJLyogVmlzaWJsZSBsaW5lcyAqLworCXN0cnVjdCBpbnRsaXN0CQkqbGluZV9saXN0OwkvKiBWaXNpYmxlIGxpbmVzICovCiB9OwogCiAvKiBMaXN0IG9mIHZhcmlhYmxlcyAqLwpAQCAtMTI0LDcgKzExOCw3IEBACiBleHRlcm4gdm9pZCBsaW5lX3JhbmdlX19jbGVhcihzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpOwogCiAvKiBJbml0aWFsaXplIGxpbmUgcmFuZ2UgKi8KLWV4dGVybiB2b2lkIGxpbmVfcmFuZ2VfX2luaXQoc3RydWN0IGxpbmVfcmFuZ2UgKmxyKTsKK2V4dGVybiBpbnQgbGluZV9yYW5nZV9faW5pdChzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpOwogCiAvKiBJbnRlcm5hbCB1c2U6IFJldHVybiBrZXJuZWwvbW9kdWxlIHBhdGggKi8KIGV4dGVybiBjb25zdCBjaGFyICprZXJuZWxfZ2V0X21vZHVsZV9wYXRoKGNvbnN0IGNoYXIgKm1vZHVsZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKaW5kZXggMDYxZWRiMS4uZGYwMjM4NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwpAQCAtMzQsNyArMzQsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJkc28uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImludGxpc3QuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAic3ltYm9sLmgiCiAjaW5jbHVkZSAicHJvYmUtZmluZGVyLmgiCkBAIC00Miw2NSArNDQsNiBAQAogLyogS3Byb2JlIHRyYWNlciBiYXNpYyB0eXBlIGlzIHVwIHRvIHU2NCAqLwogI2RlZmluZSBNQVhfQkFTSUNfVFlQRV9CSVRTCTY0CiAKLS8qIExpbmUgbnVtYmVyIGxpc3Qgb3BlcmF0aW9ucyAqLwotCi0vKiBBZGQgYSBsaW5lIHRvIGxpbmUgbnVtYmVyIGxpc3QgKi8KLXN0YXRpYyBpbnQgbGluZV9saXN0X19hZGRfbGluZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBpbnQgbGluZSkKLXsKLQlzdHJ1Y3QgbGluZV9ub2RlICpsbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCi0JLyogUmV2ZXJzZSBzZWFyY2gsIGJlY2F1c2UgbmV3IGxpbmUgd2lsbCBiZSB0aGUgbGFzdCBvbmUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UobG4sIGhlYWQsIGxpc3QpIHsKLQkJaWYgKGxuLT5saW5lIDwgbGluZSkgewotCQkJcCA9ICZsbi0+bGlzdDsKLQkJCWdvdG8gZm91bmQ7Ci0JCX0gZWxzZSBpZiAobG4tPmxpbmUgPT0gbGluZSkJLyogQWxyZWFkeSBleGlzdCAqLwotCQkJcmV0dXJuIDE7Ci0JfQotCS8qIExpc3QgaXMgZW1wdHksIG9yIHRoZSBzbWFsbGVzdCBlbnRyeSAqLwotCXAgPSBoZWFkOwotZm91bmQ6Ci0JcHJfZGVidWcoImxpbmUgbGlzdDogYWRkIGEgbGluZSAldVxuIiwgbGluZSk7Ci0JbG4gPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW5lX25vZGUpKTsKLQlpZiAobG4gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbG4tPmxpbmUgPSBsaW5lOwotCUlOSVRfTElTVF9IRUFEKCZsbi0+bGlzdCk7Ci0JbGlzdF9hZGQoJmxuLT5saXN0LCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ2hlY2sgaWYgdGhlIGxpbmUgaW4gbGluZSBudW1iZXIgbGlzdCAqLwotc3RhdGljIGludCBsaW5lX2xpc3RfX2hhc19saW5lKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGludCBsaW5lKQotewotCXN0cnVjdCBsaW5lX25vZGUgKmxuOwotCi0JLyogUmV2ZXJzZSBzZWFyY2gsIGJlY2F1c2UgbmV3IGxpbmUgd2lsbCBiZSB0aGUgbGFzdCBvbmUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxuLCBoZWFkLCBsaXN0KQotCQlpZiAobG4tPmxpbmUgPT0gbGluZSkKLQkJCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEluaXQgbGluZSBudW1iZXIgbGlzdCAqLwotc3RhdGljIHZvaWQgbGluZV9saXN0X19pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0JSU5JVF9MSVNUX0hFQUQoaGVhZCk7Ci19Ci0KLS8qIEZyZWUgbGluZSBudW1iZXIgbGlzdCAqLwotc3RhdGljIHZvaWQgbGluZV9saXN0X19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGxpbmVfbm9kZSAqbG47Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCWxuID0gbGlzdF9maXJzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgbGluZV9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmxuLT5saXN0KTsKLQkJZnJlZShsbik7Ci0JfQotfQotCiAvKiBEd2FyZiBGTCB3cmFwcGVycyAqLwogc3RhdGljIGNoYXIgKmRlYnVnaW5mb19wYXRoOwkvKiBDdXJyZW50bHkgZHVtbXkgKi8KIApAQCAtMTQ3LDgwICs5MCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLSNpZiBfRUxGVVRJTFNfUFJFUkVRKDAsIDE0OCkKLS8qIFRoaXMgbWV0aG9kIGlzIGJ1Z2d5IGlmIGVsZnV0aWxzIGlzIG9sZGVyIHRoYW4gMC4xNDggKi8KLXN0YXRpYyBpbnQgX19saW51eF9rZXJuZWxfZmluZF9lbGYoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkgICB2b2lkICoqdXNlcmRhdGEsCi0JCQkJICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCQkJICAgRHdhcmZfQWRkciBiYXNlLAotCQkJCSAgIGNoYXIgKipmaWxlX25hbWUsIEVsZiAqKmVsZnApCi17Ci0JaW50IGZkOwotCWNvbnN0IGNoYXIgKnBhdGggPSBrZXJuZWxfZ2V0X21vZHVsZV9wYXRoKG1vZHVsZV9uYW1lKTsKLQotCXByX2RlYnVnMigiVXNlIGZpbGUgJXMgZm9yICVzXG4iLCBwYXRoLCBtb2R1bGVfbmFtZSk7Ci0JaWYgKHBhdGgpIHsKLQkJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCSpmaWxlX25hbWUgPSBzdHJkdXAocGF0aCk7Ci0JCQlyZXR1cm4gZmQ7Ci0JCX0KLQl9Ci0JLyogSWYgZmFpbGVkLCB0cnkgdG8gY2FsbCBzdGFuZGFyZCBtZXRob2QgKi8KLQlyZXR1cm4gZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYobW9kLCB1c2VyZGF0YSwgbW9kdWxlX25hbWUsIGJhc2UsCi0JCQkJCSAgZmlsZV9uYW1lLCBlbGZwKTsKLX0KLQotc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIGtlcm5lbF9jYWxsYmFja3MgPSB7Ci0JLmZpbmRfZGVidWdpbmZvID0gZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbywKLQkuZGVidWdpbmZvX3BhdGggPSAmZGVidWdpbmZvX3BhdGgsCi0KLQkuZmluZF9lbGYgPSBfX2xpbnV4X2tlcm5lbF9maW5kX2VsZiwKLQkuc2VjdGlvbl9hZGRyZXNzID0gZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcywKLX07Ci0KLS8qIEdldCBhIER3YXJmIGZyb20gbGl2ZSBrZXJuZWwgaW1hZ2UgKi8KLXN0YXRpYyBpbnQgZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoc3RydWN0IGRlYnVnaW5mbyAqZGJnLAotCQkJCQkgICAgICAgRHdhcmZfQWRkciBhZGRyKQotewotCWRiZy0+ZHdmbCA9IGR3ZmxfYmVnaW4oJmtlcm5lbF9jYWxsYmFja3MpOwotCWlmICghZGJnLT5kd2ZsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIExvYWQgdGhlIGtlcm5lbCBkd2FydmVzOiBEb24ndCBjYXJlIHRoZSByZXN1bHQgaGVyZSAqLwotCWR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwoZGJnLT5kd2ZsKTsKLQlkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcyhkYmctPmR3ZmwpOwotCi0JZGJnLT5kYmcgPSBkd2ZsX2FkZHJkd2FyZihkYmctPmR3ZmwsIGFkZHIsICZkYmctPmJpYXMpOwotCS8qIEhlcmUsIGNoZWNrIHdoZXRoZXIgd2UgY291bGQgZ2V0IGEgcmVhbCBkd2FyZiAqLwotCWlmICghZGJnLT5kYmcpIHsKLQkJcHJfZGVidWcoIkZhaWxlZCB0byBmaW5kIGtlcm5lbCBkd2FyZiBhdCAlbHhcbiIsCi0JCQkgKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0JCWR3ZmxfZW5kKGRiZy0+ZHdmbCk7Ci0JCW1lbXNldChkYmcsIDAsIHNpemVvZigqZGJnKSk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXJldHVybiAwOwotfQotI2Vsc2UKLS8qIFdpdGggb2xkZXIgZWxmdXRpbHMsIHRoaXMganVzdCBzdXBwb3J0IGtlcm5lbCBtb2R1bGUuLi4gKi8KLXN0YXRpYyBpbnQgZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoc3RydWN0IGRlYnVnaW5mbyAqZGJnLAotCQkJCQkgICAgICAgRHdhcmZfQWRkciBhZGRyIF9fbWF5YmVfdW51c2VkKQotewotCWNvbnN0IGNoYXIgKnBhdGggPSBrZXJuZWxfZ2V0X21vZHVsZV9wYXRoKCJrZXJuZWwiKTsKLQotCWlmICghcGF0aCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHZtbGludXggcGF0aFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXByX2RlYnVnMigiVXNlIGZpbGUgJXMgZm9yIGRlYnVnaW5mb1xuIiwgcGF0aCk7Ci0JcmV0dXJuIGRlYnVnaW5mb19faW5pdF9vZmZsaW5lX2R3YXJmKGRiZywgcGF0aCk7Ci19Ci0jZW5kaWYKLQotc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXcoY29uc3QgY2hhciAqcGF0aCkKK3N0YXRpYyBzdHJ1Y3QgZGVidWdpbmZvICpfX2RlYnVnaW5mb19fbmV3KGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAJc3RydWN0IGRlYnVnaW5mbyAqZGJnID0gemFsbG9jKHNpemVvZigqZGJnKSk7CiAJaWYgKCFkYmcpCkBAIC0yMjgsMjEgKzk4LDQ0IEBACiAKIAlpZiAoZGVidWdpbmZvX19pbml0X29mZmxpbmVfZHdhcmYoZGJnLCBwYXRoKSA8IDApCiAJCXpmcmVlKCZkYmcpOwotCisJaWYgKGRiZykKKwkJcHJfZGVidWcoIk9wZW4gRGVidWdpbmZvIGZpbGU6ICVzXG4iLCBwYXRoKTsKIAlyZXR1cm4gZGJnOwogfQogCi1zdHJ1Y3QgZGVidWdpbmZvICpkZWJ1Z2luZm9fX25ld19vbmxpbmVfa2VybmVsKHVuc2lnbmVkIGxvbmcgYWRkcikKK2VudW0gZHNvX2JpbmFyeV90eXBlIGRpc3Ryb19kd2FyZl90eXBlc1tdID0geworCURTT19CSU5BUllfVFlQRV9fRkVET1JBX0RFQlVHSU5GTywKKwlEU09fQklOQVJZX1RZUEVfX1VCVU5UVV9ERUJVR0lORk8sCisJRFNPX0JJTkFSWV9UWVBFX19PUEVORU1CRURERURfREVCVUdJTkZPLAorCURTT19CSU5BUllfVFlQRV9fQlVJTERJRF9ERUJVR0lORk8sCisJRFNPX0JJTkFSWV9UWVBFX19OT1RfRk9VTkQsCit9OworCitzdHJ1Y3QgZGVidWdpbmZvICpkZWJ1Z2luZm9fX25ldyhjb25zdCBjaGFyICpwYXRoKQogewotCXN0cnVjdCBkZWJ1Z2luZm8gKmRiZyA9IHphbGxvYyhzaXplb2YoKmRiZykpOworCWVudW0gZHNvX2JpbmFyeV90eXBlICp0eXBlOworCWNoYXIgYnVmW1BBVEhfTUFYXSwgbmlsID0gJ1wwJzsKKwlzdHJ1Y3QgZHNvICpkc287CisJc3RydWN0IGRlYnVnaW5mbyAqZGluZm8gPSBOVUxMOwogCi0JaWYgKCFkYmcpCi0JCXJldHVybiBOVUxMOworCS8qIFRyeSB0byBvcGVuIGRpc3RybyBkZWJ1Z2luZm8gZmlsZXMgKi8KKwlkc28gPSBkc29fX25ldyhwYXRoKTsKKwlpZiAoIWRzbykKKwkJZ290byBvdXQ7CiAKLQlpZiAoZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoZGJnLCAoRHdhcmZfQWRkcilhZGRyKSA8IDApCi0JCXpmcmVlKCZkYmcpOworCWZvciAodHlwZSA9IGRpc3Ryb19kd2FyZl90eXBlczsKKwkgICAgICFkaW5mbyAmJiAqdHlwZSAhPSBEU09fQklOQVJZX1RZUEVfX05PVF9GT1VORDsKKwkgICAgIHR5cGUrKykgeworCQlpZiAoZHNvX19yZWFkX2JpbmFyeV90eXBlX2ZpbGVuYW1lKGRzbywgKnR5cGUsICZuaWwsCisJCQkJCQkgICBidWYsIFBBVEhfTUFYKSA8IDApCisJCQljb250aW51ZTsKKwkJZGluZm8gPSBfX2RlYnVnaW5mb19fbmV3KGJ1Zik7CisJfQorCWRzb19fZGVsZXRlKGRzbyk7CiAKLQlyZXR1cm4gZGJnOworb3V0OgorCS8qIGlmIGZhaWxlZCB0byBvcGVuIGFsbCBkaXN0cm8gZGVidWdpbmZvLCBvcGVuIGdpdmVuIGJpbmFyeSAqLworCXJldHVybiBkaW5mbyA/IDogX19kZWJ1Z2luZm9fX25ldyhwYXRoKTsKIH0KIAogdm9pZCBkZWJ1Z2luZm9fX2RlbGV0ZShzdHJ1Y3QgZGVidWdpbmZvICpkYmcpCkBAIC04ODAsNyArNzczLDcgQEAKIH0KIAogLyogRmluZCBsaW5lcyB3aGljaCBtYXRjaCBsYXp5IHBhdHRlcm4gKi8KLXN0YXRpYyBpbnQgZmluZF9sYXp5X21hdGNoX2xpbmVzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCitzdGF0aWMgaW50IGZpbmRfbGF6eV9tYXRjaF9saW5lcyhzdHJ1Y3QgaW50bGlzdCAqbGlzdCwKIAkJCQkgY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnBhdCkKIHsKIAlGSUxFICpmcDsKQEAgLTkwMSw3ICs3OTQsNyBAQAogCQkJbGluZVtsZW4gLSAxXSA9ICdcMCc7CiAKIAkJaWYgKHN0cmxhenltYXRjaChsaW5lLCBwYXQpKSB7Ci0JCQlsaW5lX2xpc3RfX2FkZF9saW5lKGhlYWQsIGxpbmVudW0pOworCQkJaW50bGlzdF9fYWRkKGxpc3QsIGxpbmVudW0pOwogCQkJY291bnQrKzsKIAkJfQogCQlsaW5lbnVtKys7CkBAIC05MjQsNyArODE3LDcgQEAKIAlEd2FyZl9EaWUgKnNjX2RpZSwgZGllX21lbTsKIAlpbnQgcmV0OwogCi0JaWYgKCFsaW5lX2xpc3RfX2hhc19saW5lKCZwZi0+bGNhY2hlLCBsaW5lbm8pIHx8CisJaWYgKCFpbnRsaXN0X19oYXNfZW50cnkocGYtPmxjYWNoZSwgbGluZW5vKSB8fAogCSAgICBzdHJ0YWlsY21wKGZuYW1lLCBwZi0+Zm5hbWUpICE9IDApCiAJCXJldHVybiAwOwogCkBAIC05NTIsOSArODQ1LDkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZwZi0+bGNhY2hlKSkgeworCWlmIChpbnRsaXN0X19lbXB0eShwZi0+bGNhY2hlKSkgewogCQkvKiBNYXRjaGluZyBsYXp5IGxpbmUgcGF0dGVybiAqLwotCQlyZXQgPSBmaW5kX2xhenlfbWF0Y2hfbGluZXMoJnBmLT5sY2FjaGUsIHBmLT5mbmFtZSwKKwkJcmV0ID0gZmluZF9sYXp5X21hdGNoX2xpbmVzKHBmLT5sY2FjaGUsIHBmLT5mbmFtZSwKIAkJCQkJICAgIHBmLT5wZXYtPnBvaW50LmxhenlfbGluZSk7CiAJCWlmIChyZXQgPD0gMCkKIAkJCXJldHVybiByZXQ7CkBAIC0xMDk2LDcgKzk4OSw5IEBACiAjZW5kaWYKIAogCW9mZiA9IDA7Ci0JbGluZV9saXN0X19pbml0KCZwZi0+bGNhY2hlKTsKKwlwZi0+bGNhY2hlID0gaW50bGlzdF9fbmV3KE5VTEwpOworCWlmICghcGYtPmxjYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBGYXN0cGF0aDogbG9va3VwIGJ5IGZ1bmN0aW9uIG5hbWUgZnJvbSAuZGVidWdfcHVibmFtZXMgc2VjdGlvbiAqLwogCWlmIChwcC0+ZnVuY3Rpb24pIHsKQEAgLTExNDksNyArMTA0NCw4IEBACiAJfQogCiBmb3VuZDoKLQlsaW5lX2xpc3RfX2ZyZWUoJnBmLT5sY2FjaGUpOworCWludGxpc3RfX2RlbGV0ZShwZi0+bGNhY2hlKTsKKwlwZi0+bGNhY2hlID0gTlVMTDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTM3LDcgKzE0MzMsNyBAQAogCQlpZiAobHItPnBhdGggPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQlyZXR1cm4gbGluZV9saXN0X19hZGRfbGluZSgmbHItPmxpbmVfbGlzdCwgbGluZW5vKTsKKwlyZXR1cm4gaW50bGlzdF9fYWRkKGxyLT5saW5lX2xpc3QsIGxpbmVubyk7CiB9CiAKIHN0YXRpYyBpbnQgbGluZV9yYW5nZV93YWxrX2NiKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZW5vLApAQCAtMTU2NSw3ICsxNDYxLDcgQEAKIAogCS8qIFVwZGF0ZSBzdGF0dXMgKi8KIAlpZiAocmV0ID49IDApCi0JCWlmICghbGlzdF9lbXB0eSgmbGYtPmxyLT5saW5lX2xpc3QpKQorCQlpZiAoIWludGxpc3RfX2VtcHR5KGxmLT5sci0+bGluZV9saXN0KSkKIAkJCXJldCA9IGxmLT5mb3VuZCA9IDE7CiAJCWVsc2UKIAkJCXJldCA9IDA7CS8qIExpbmVzIGFyZSBub3QgZm91bmQgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaAppbmRleCBmZmMzM2NkLi45MjU5MGIyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJpbnRsaXN0LmgiCiAjaW5jbHVkZSAicHJvYmUtZXZlbnQuaCIKIAogI2RlZmluZSBNQVhfUFJPQkVfQlVGRkVSCTEwMjQKQEAgLTI5LDggKzMwLDggQEAKIAlEd2FyZl9BZGRyCWJpYXM7CiB9OwogCisvKiBUaGlzIGFsc28gdHJpZXMgdG8gb3BlbiBkaXN0cm8gZGVidWdpbmZvICovCiBleHRlcm4gc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXcoY29uc3QgY2hhciAqcGF0aCk7Ci1leHRlcm4gc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXdfb25saW5lX2tlcm5lbCh1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIHZvaWQgZGVidWdpbmZvX19kZWxldGUoc3RydWN0IGRlYnVnaW5mbyAqZGJnKTsKIAogLyogRmluZCBwcm9iZV90cmFjZV9ldmVudHMgc3BlY2lmaWVkIGJ5IHBlcmZfcHJvYmVfZXZlbnQgZnJvbSBkZWJ1Z2luZm8gKi8KQEAgLTY2LDcgKzY3LDcgQEAKIAljb25zdCBjaGFyCQkqZm5hbWU7CQkvKiBSZWFsIGZpbGUgbmFtZSAqLwogCUR3YXJmX0RpZQkJY3VfZGllOwkJLyogQ3VycmVudCBDVSAqLwogCUR3YXJmX0RpZQkJc3BfZGllOwotCXN0cnVjdCBsaXN0X2hlYWQJbGNhY2hlOwkJLyogTGluZSBjYWNoZSBmb3IgbGF6eSBtYXRjaCAqLworCXN0cnVjdCBpbnRsaXN0CQkqbGNhY2hlOwkvKiBMaW5lIGNhY2hlIGZvciBsYXp5IG1hdGNoICovCiAKIAkvKiBGb3IgdmFyaWFibGUgc2VhcmNoaW5nICovCiAjaWYgX0VMRlVUSUxTX1BSRVJFUSgwLCAxNDIpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLWV4dC1zb3VyY2VzIGIvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi1leHQtc291cmNlcwppbmRleCA1OTViZmM3Li4xNmE0NzVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLWV4dC1zb3VyY2VzCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24tZXh0LXNvdXJjZXMKQEAgLTE3LDYgKzE3LDYgQEAKIHV0aWwvY2dyb3VwLmMKIHV0aWwvcmJsaXN0LmMKIHV0aWwvc3RybGlzdC5jCi11dGlsL2ZzLmMKKy4uL2xpYi9hcGkvZnMvZnMuYwogdXRpbC90cmFjZS1ldmVudC5jCiAuLi8uLi9saWIvcmJ0cmVlLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9yZWNvcmQuYwppbmRleCAzNzM3NjI1Li4wNDllMGEwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3JlY29yZC5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgImV2c2VsLmgiCiAjaW5jbHVkZSAiY3B1bWFwLmgiCiAjaW5jbHVkZSAicGFyc2UtZXZlbnRzLmgiCi0jaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAKIHR5cGVkZWYgdm9pZCAoKnNldHVwX3Byb2JlX2ZuX3QpKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwppbmRleCA1ZGE2Y2U3Li41NTk2MGYyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKQEAgLTcwMiwxMSArNzAyLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByZWdzX3VzZXJfX3ByaW50ZihzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IG1hc2spCitzdGF0aWMgdm9pZCByZWdzX3VzZXJfX3ByaW50ZihzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKIAlzdHJ1Y3QgcmVnc19kdW1wICp1c2VyX3JlZ3MgPSAmc2FtcGxlLT51c2VyX3JlZ3M7CiAKIAlpZiAodXNlcl9yZWdzLT5yZWdzKSB7CisJCXU2NCBtYXNrID0gdXNlcl9yZWdzLT5tYXNrOwogCQlwcmludGYoIi4uLiB1c2VyIHJlZ3M6IG1hc2sgMHglIiBQUkl4NjQgIlxuIiwgbWFzayk7CiAJCXJlZ3NfZHVtcF9fcHJpbnRmKG1hc2ssIHVzZXJfcmVncy0+cmVncyk7CiAJfQpAQCAtNzkzLDcgKzc5NCw3IEBACiAJaWYgKCFkdW1wX3RyYWNlKQogCQlyZXR1cm47CiAKLQlwcmludGYoIihJUCwgJWQpOiAlZC8lZDogJSMiIFBSSXg2NCAiIHBlcmlvZDogJSIgUFJJdTY0ICIgYWRkcjogJSMiIFBSSXg2NCAiXG4iLAorCXByaW50ZigiKElQLCAweCV4KTogJWQvJWQ6ICUjIiBQUkl4NjQgIiBwZXJpb2Q6ICUiIFBSSXU2NCAiIGFkZHI6ICUjIiBQUkl4NjQgIlxuIiwKIAkgICAgICAgZXZlbnQtPmhlYWRlci5taXNjLCBzYW1wbGUtPnBpZCwgc2FtcGxlLT50aWQsIHNhbXBsZS0+aXAsCiAJICAgICAgIHNhbXBsZS0+cGVyaW9kLCBzYW1wbGUtPmFkZHIpOwogCkBAIC04MDYsNyArODA3LDcgQEAKIAkJYnJhbmNoX3N0YWNrX19wcmludGYoc2FtcGxlKTsKIAogCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JFR1NfVVNFUikKLQkJcmVnc191c2VyX19wcmludGYoc2FtcGxlLCBldnNlbC0+YXR0ci5zYW1wbGVfcmVnc191c2VyKTsKKwkJcmVnc191c2VyX19wcmludGYoc2FtcGxlKTsKIAogCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1NUQUNLX1VTRVIpCiAJCXN0YWNrX3VzZXJfX3ByaW50Zigmc2FtcGxlLT51c2VyX3N0YWNrKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCmluZGV4IDUxNmQxOWYuLjNiN2RiZjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYwpAQCAtNTA2LDYgKzUwNiw4IEBACiAJLyogdGhlIHN0YXJ0IG9mIHRoaXMgc2VjdGlvbiBpcyBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcgKi8KIAlzdHJuY3B5KGRlYnVnbGluaywgZGF0YS0+ZF9idWYsIHNpemUpOwogCisJZXJyID0gMDsKKwogb3V0X2VsZl9lbmQ6CiAJZWxmX2VuZChlbGYpOwogb3V0X2Nsb3NlOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IGU4OWFmYzAuLjk1ZTI0OTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCXJldHVybiBzeW1ib2xzX19maW5kKCZkc28tPnN5bWJvbHNbdHlwZV0sIGFkZHIpOwogfQogCi1zdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpcnN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpcnN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlyZXR1cm4gc3ltYm9sc19fZmlyc3QoJmRzby0+c3ltYm9sc1t0eXBlXSk7CiB9CkBAIC0xMjUxLDYgKzEyNTEsNDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBib29sIGRzb19faXNfY29tcGF0aWJsZV9zeW10YWJfdHlwZShzdHJ1Y3QgZHNvICpkc28sIGJvb2wga21vZCwKKwkJCQkJICAgZW51bSBkc29fYmluYXJ5X3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERTT19CSU5BUllfVFlQRV9fSkFWQV9KSVQ6CisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0RFQlVHTElOSzoKKwljYXNlIERTT19CSU5BUllfVFlQRV9fU1lTVEVNX1BBVEhfRFNPOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19GRURPUkFfREVCVUdJTkZPOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19VQlVOVFVfREVCVUdJTkZPOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19CVUlMRElEX0RFQlVHSU5GTzoKKwljYXNlIERTT19CSU5BUllfVFlQRV9fT1BFTkVNQkVEREVEX0RFQlVHSU5GTzoKKwkJcmV0dXJuICFrbW9kICYmIGRzby0+a2VybmVsID09IERTT19UWVBFX1VTRVI7CisKKwljYXNlIERTT19CSU5BUllfVFlQRV9fS0FMTFNZTVM6CisJY2FzZSBEU09fQklOQVJZX1RZUEVfX1ZNTElOVVg6CisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0tDT1JFOgorCQlyZXR1cm4gZHNvLT5rZXJuZWwgPT0gRFNPX1RZUEVfS0VSTkVMOworCisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0dVRVNUX0tBTExTWU1TOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9WTUxJTlVYOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LQ09SRToKKwkJcmV0dXJuIGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTDsKKworCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LTU9EVUxFOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19TWVNURU1fUEFUSF9LTU9EVUxFOgorCQkvKgorCQkgKiBrZXJuZWwgbW9kdWxlcyBrbm93IHRoZWlyIHN5bXRhYiB0eXBlIC0gaXQncyBzZXQgd2hlbgorCQkgKiBjcmVhdGluZyBhIG1vZHVsZSBkc28gaW4gbWFjaGluZV9fbmV3X21vZHVsZSgpLgorCQkgKi8KKwkJcmV0dXJuIGttb2QgJiYgZHNvLT5zeW10YWJfdHlwZSA9PSB0eXBlOworCisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0JVSUxEX0lEX0NBQ0hFOgorCQlyZXR1cm4gdHJ1ZTsKKworCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19OT1RfRk9VTkQ6CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogaW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAljaGFyICpuYW1lOwpAQCAtMTI2MSw2ICsxMzAxLDcgQEAKIAlpbnQgc3NfcG9zID0gMDsKIAlzdHJ1Y3Qgc3ltc3JjIHNzX1syXTsKIAlzdHJ1Y3Qgc3ltc3JjICpzeW1zX3NzID0gTlVMTCwgKnJ1bnRpbWVfc3MgPSBOVUxMOworCWJvb2wga21vZDsKIAogCWRzb19fc2V0X2xvYWRlZChkc28sIG1hcC0+dHlwZSk7CiAKQEAgLTEzMDEsNyArMTM0MiwxMSBAQAogCWlmICghbmFtZSkKIAkJcmV0dXJuIC0xOwogCi0JLyogSXRlcmF0ZSBvdmVyIGNhbmRpZGF0ZSBkZWJ1ZyBpbWFnZXMuCisJa21vZCA9IGRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19TWVNURU1fUEFUSF9LTU9EVUxFIHx8CisJCWRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LTU9EVUxFOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgY2FuZGlkYXRlIGRlYnVnIGltYWdlcy4KIAkgKiBLZWVwIHRyYWNrIG9mICJpbnRlcmVzdGluZyIgb25lcyAodGhvc2Ugd2hpY2ggaGF2ZSBhIHN5bXRhYiwgZHluc3ltLAogCSAqIGFuZC9vciBvcGQgc2VjdGlvbikgZm9yIHByb2Nlc3NpbmcuCiAJICovCkBAIC0xMzExLDYgKzEzNTYsOSBAQAogCiAJCWVudW0gZHNvX2JpbmFyeV90eXBlIHN5bXRhYl90eXBlID0gYmluYXJ5X3R5cGVfc3ltdGFiW2ldOwogCisJCWlmICghZHNvX19pc19jb21wYXRpYmxlX3N5bXRhYl90eXBlKGRzbywga21vZCwgc3ltdGFiX3R5cGUpKQorCQkJY29udGludWU7CisKIAkJaWYgKGRzb19fcmVhZF9iaW5hcnlfdHlwZV9maWxlbmFtZShkc28sIHN5bXRhYl90eXBlLAogCQkJCQkJICAgcm9vdF9kaXIsIG5hbWUsIFBBVEhfTUFYKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTM1MywxNSArMTQwMSwxMCBAQAogCWlmICghcnVudGltZV9zcyAmJiBzeW1zX3NzKQogCQlydW50aW1lX3NzID0gc3ltc19zczsKIAotCWlmIChzeW1zX3NzKSB7Ci0JCWludCBrbTsKLQotCQlrbSA9IGRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19TWVNURU1fUEFUSF9LTU9EVUxFIHx8Ci0JCSAgICAgZHNvLT5zeW10YWJfdHlwZSA9PSBEU09fQklOQVJZX1RZUEVfX0dVRVNUX0tNT0RVTEU7Ci0JCXJldCA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsIHN5bXNfc3MsIHJ1bnRpbWVfc3MsIGZpbHRlciwga20pOwotCX0gZWxzZSB7CisJaWYgKHN5bXNfc3MpCisJCXJldCA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsIHN5bXNfc3MsIHJ1bnRpbWVfc3MsIGZpbHRlciwga21vZCk7CisJZWxzZQogCQlyZXQgPSAtMTsKLQl9CiAKIAlpZiAocmV0ID4gMCkgewogCQlpbnQgbnJfcGx0OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IGZmZmUyODguLjUwMWU0ZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTc5LDYgKzc5LDE3IEBACiB2b2lkIHN5bWJvbF9fZGVsZXRlKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiB2b2lkIHN5bWJvbHNfX2RlbGV0ZShzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scyk7CiAKKy8qIHN5bWJvbHNfX2Zvcl9lYWNoX2VudHJ5IC0gaXRlcmF0ZSBvdmVyIHN5bWJvbHMgKHJiX3Jvb3QpCisgKgorICogQHN5bWJvbHM6IHRoZSByYl9yb290IG9mIHN5bWJvbHMKKyAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG5kOiB0aGUgJ3N0cnVjdCByYl9ub2RlIConIHRvIHVzZSBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlCisgKi8KKyNkZWZpbmUgc3ltYm9sc19fZm9yX2VhY2hfZW50cnkoc3ltYm9scywgcG9zLCBuZCkJCQlcCisJZm9yIChuZCA9IHJiX2ZpcnN0KHN5bWJvbHMpOwkJCQkJXAorCSAgICAgbmQgJiYgKHBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKSk7CVwKKwkgICAgIG5kID0gcmJfbmV4dChuZCkpCisKIHN0YXRpYyBpbmxpbmUgc2l6ZV90IHN5bWJvbF9fc2l6ZShjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJcmV0dXJuIHN5bS0+ZW5kIC0gc3ltLT5zdGFydCArIDE7CkBAIC0xNzUsNyArMTg2LDcgQEAKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07CiAJdTY0CSAgICAgIGFkZHI7CiAJY2hhcgkgICAgICBsZXZlbDsKLQlib29sCSAgICAgIGZpbHRlcmVkOworCXU4CSAgICAgIGZpbHRlcmVkOwogCXU4CSAgICAgIGNwdW1vZGU7CiAJczMyCSAgICAgIGNwdTsKIH07CkBAIC0yMjMsNyArMjM0LDYgQEAKIAkJCQl1NjQgYWRkcik7CiBzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUpOwotc3RydWN0IHN5bWJvbCAqZHNvX19maXJzdF9zeW1ib2woc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOwogCiBpbnQgZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBpbnQgc3lzZnNfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMKaW5kZXggMDM1ODg4Mi4uM2NlMDQ5OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYwpAQCAtMTQyLDMgKzE0MiwyNCBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgdGhyZWFkX19maW5kX2NwdW1vZGVfYWRkcl9sb2NhdGlvbihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAorCQkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCit7CisJc2l6ZV90IGk7CisJY29uc3QgdTggY29uc3QgY3B1bW9kZXNbXSA9IHsKKwkJUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAorCQlQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCwKKwkJUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9VU0VSLAorCQlQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX0tFUk5FTAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVtb2Rlcyk7IGkrKykgeworCQl0aHJlYWRfX2ZpbmRfYWRkcl9sb2NhdGlvbih0aHJlYWQsIG1hY2hpbmUsIGNwdW1vZGVzW2ldLCB0eXBlLAorCQkJCQkgICBhZGRyLCBhbCk7CisJCWlmIChhbC0+bWFwKQorCQkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oIGIvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oCmluZGV4IDViODU2YmYuLjliMjlmMDggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaAorKysgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmgKQEAgLTQ0LDEyICs0NCw2IEBACiBpbnQgdGhyZWFkX19mb3JrKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IHRocmVhZCAqcGFyZW50LCB1NjQgdGltZXN0YW1wKTsKIHNpemVfdCB0aHJlYWRfX2ZwcmludGYoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBGSUxFICpmcCk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcCAqdGhyZWFkX19maW5kX21hcChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpCi17Ci0JcmV0dXJuIHRocmVhZCA/IG1hcF9ncm91cHNfX2ZpbmQoJnRocmVhZC0+bWcsIHR5cGUsIGFkZHIpIDogTlVMTDsKLX0KLQogdm9pZCB0aHJlYWRfX2ZpbmRfYWRkcl9tYXAoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCSAgIHU4IGNwdW1vZGUsIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIsCiAJCQkgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOwpAQCAtNTgsNiArNTIsMTEgQEAKIAkJCQl1OCBjcHVtb2RlLCBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAogCQkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCk7CiAKK3ZvaWQgdGhyZWFkX19maW5kX2NwdW1vZGVfYWRkcl9sb2NhdGlvbihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAorCQkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgKnRocmVhZF9fcHJpdihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CiAJcmV0dXJuIHRocmVhZC0+cHJpdjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggZTBkNmQwN2YuLmMzNjYzNmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIAl0cmFjZV9zZXFfaW5pdCgmcyk7CiAJcGV2ZW50X2V2ZW50X2luZm8oJnMsIGV2ZW50LCAmcmVjb3JkKTsKIAl0cmFjZV9zZXFfZG9fcHJpbnRmKCZzKTsKKwl0cmFjZV9zZXFfZGVzdHJveSgmcyk7CiB9CiAKIHZvaWQgcGFyc2VfcHJvY19rYWxsc3ltcyhzdHJ1Y3QgcGV2ZW50ICpwZXZlbnQsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkYjczZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGliZHcuYwpAQCAtMCwwICsxLDIxMCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8ZWxmdXRpbHMvbGliZHcuaD4KKyNpbmNsdWRlIDxlbGZ1dGlscy9saWJkd2ZsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInVud2luZC5oIgorI2luY2x1ZGUgInVud2luZC1saWJkdy5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisKK3N0YXRpYyBjaGFyICpkZWJ1Z2luZm9fcGF0aDsKKworc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIG9mZmxpbmVfY2FsbGJhY2tzID0geworCS5maW5kX2RlYnVnaW5mbwkJPSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvLAorCS5kZWJ1Z2luZm9fcGF0aAkJPSAmZGVidWdpbmZvX3BhdGgsCisJLnNlY3Rpb25fYWRkcmVzcwk9IGR3Zmxfb2ZmbGluZV9zZWN0aW9uX2FkZHJlc3MsCit9OworCitzdGF0aWMgaW50IF9fcmVwb3J0X21vZHVsZShzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIHU2NCBpcCwKKwkJCSAgICBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQoreworCUR3ZmxfTW9kdWxlICptb2Q7CisJc3RydWN0IGRzbyAqZHNvID0gTlVMTDsKKworCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLAorCQkJCSAgIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKKwkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgYWwpOworCisJaWYgKGFsLT5tYXApCisJCWRzbyA9IGFsLT5tYXAtPmRzbzsKKworCWlmICghZHNvKQorCQlyZXR1cm4gMDsKKworCW1vZCA9IGR3ZmxfYWRkcm1vZHVsZSh1aS0+ZHdmbCwgaXApOworCWlmICghbW9kKQorCQltb2QgPSBkd2ZsX3JlcG9ydF9lbGYodWktPmR3ZmwsIGRzby0+c2hvcnRfbmFtZSwKKwkJCQkgICAgICBkc28tPmxvbmdfbmFtZSwgLTEsIGFsLT5tYXAtPnN0YXJ0LAorCQkJCSAgICAgIGZhbHNlKTsKKworCXJldHVybiBtb2QgJiYgZHdmbF9hZGRybW9kdWxlKHVpLT5kd2ZsLCBpcCkgPT0gbW9kID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHJlcG9ydF9tb2R1bGUodTY0IGlwLCBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQoreworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCisJcmV0dXJuIF9fcmVwb3J0X21vZHVsZSgmYWwsIGlwLCB1aSk7Cit9CisKK3N0YXRpYyBpbnQgZW50cnkodTY0IGlwLCBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQorCit7CisJc3RydWN0IHVud2luZF9lbnRyeSBlOworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCisJaWYgKF9fcmVwb3J0X21vZHVsZSgmYWwsIGlwLCB1aSkpCisJCXJldHVybiAtMTsKKworCWUuaXAgID0gaXA7CisJZS5tYXAgPSBhbC5tYXA7CisJZS5zeW0gPSBhbC5zeW07CisKKwlwcl9kZWJ1ZygidW53aW5kOiAlczppcCA9IDB4JSIgUFJJeDY0ICIgKDB4JSIgUFJJeDY0ICIpXG4iLAorCQkgYWwuc3ltID8gYWwuc3ltLT5uYW1lIDogIicnIiwKKwkJIGlwLAorCQkgYWwubWFwID8gYWwubWFwLT5tYXBfaXAoYWwubWFwLCBpcCkgOiAodTY0KSAwKTsKKworCXJldHVybiB1aS0+Y2IoJmUsIHVpLT5hcmcpOworfQorCitzdGF0aWMgcGlkX3QgbmV4dF90aHJlYWQoRHdmbCAqZHdmbCwgdm9pZCAqYXJnLCB2b2lkICoqdGhyZWFkX2FyZ3ApCit7CisJLyogV2Ugd2FudCBvbmx5IHNpbmdsZSB0aHJlYWQgdG8gYmUgcHJvY2Vzc2VkLiAqLworCWlmICgqdGhyZWFkX2FyZ3AgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkqdGhyZWFkX2FyZ3AgPSBhcmc7CisJcmV0dXJuIGR3ZmxfcGlkKGR3ZmwpOworfQorCitzdGF0aWMgaW50IGFjY2Vzc19kc29fbWVtKHN0cnVjdCB1bndpbmRfaW5mbyAqdWksIER3YXJmX0FkZHIgYWRkciwKKwkJCSAgRHdhcmZfV29yZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKwlzc2l6ZV90IHNpemU7CisKKwl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodWktPnRocmVhZCwgdWktPm1hY2hpbmUsIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKKwkJCSAgICAgIE1BUF9fRlVOQ1RJT04sIGFkZHIsICZhbCk7CisJaWYgKCFhbC5tYXApIHsKKwkJcHJfZGVidWcoInVud2luZDogbm8gbWFwIGZvciAlbHhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFhbC5tYXAtPmRzbykKKwkJcmV0dXJuIC0xOworCisJc2l6ZSA9IGRzb19fZGF0YV9yZWFkX2FkZHIoYWwubWFwLT5kc28sIGFsLm1hcCwgdWktPm1hY2hpbmUsCisJCQkJICAgYWRkciwgKHU4ICopIGRhdGEsIHNpemVvZigqZGF0YSkpOworCisJcmV0dXJuICEoc2l6ZSA9PSBzaXplb2YoKmRhdGEpKTsKK30KKworc3RhdGljIGJvb2wgbWVtb3J5X3JlYWQoRHdmbCAqZHdmbCBfX21heWJlX3VudXNlZCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9Xb3JkICpyZXN1bHQsCisJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHVud2luZF9pbmZvICp1aSA9IGFyZzsKKwlzdHJ1Y3Qgc3RhY2tfZHVtcCAqc3RhY2sgPSAmdWktPnNhbXBsZS0+dXNlcl9zdGFjazsKKwl1NjQgc3RhcnQsIGVuZDsKKwlpbnQgb2Zmc2V0OworCWludCByZXQ7CisKKwlyZXQgPSBwZXJmX3JlZ192YWx1ZSgmc3RhcnQsICZ1aS0+c2FtcGxlLT51c2VyX3JlZ3MsIFBFUkZfUkVHX1NQKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwllbmQgPSBzdGFydCArIHN0YWNrLT5zaXplOworCisJLyogQ2hlY2sgb3ZlcmZsb3cuICovCisJaWYgKGFkZHIgKyBzaXplb2YoRHdhcmZfV29yZCkgPCBhZGRyKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYWRkciA8IHN0YXJ0IHx8IGFkZHIgKyBzaXplb2YoRHdhcmZfV29yZCkgPiBlbmQpIHsKKwkJcmV0ID0gYWNjZXNzX2Rzb19tZW0odWksIGFkZHIsIHJlc3VsdCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2RlYnVnKCJ1bndpbmQ6IGFjY2Vzc19tZW0gMHglIiBQUkl4NjQgIiBub3QgaW5zaWRlIHJhbmdlIgorCQkJCSAiIDB4JSIgUFJJeDY0ICItMHglIiBQUkl4NjQgIlxuIiwKKwkJCQlhZGRyLCBzdGFydCwgZW5kKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlvZmZzZXQgID0gYWRkciAtIHN0YXJ0OworCSpyZXN1bHQgPSAqKER3YXJmX1dvcmQgKikmc3RhY2stPmRhdGFbb2Zmc2V0XTsKKwlwcl9kZWJ1ZygidW53aW5kOiBhY2Nlc3NfbWVtIGFkZHIgMHglIiBQUkl4NjQgIiwgdmFsICVseCwgb2Zmc2V0ICVkXG4iLAorCQkgYWRkciwgKHVuc2lnbmVkIGxvbmcpKnJlc3VsdCwgb2Zmc2V0KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNvbnN0IER3ZmxfVGhyZWFkX0NhbGxiYWNrcyBjYWxsYmFja3MgPSB7CisJLm5leHRfdGhyZWFkCQk9IG5leHRfdGhyZWFkLAorCS5tZW1vcnlfcmVhZAkJPSBtZW1vcnlfcmVhZCwKKwkuc2V0X2luaXRpYWxfcmVnaXN0ZXJzCT0gbGliZHdfX2FyY2hfc2V0X2luaXRpYWxfcmVnaXN0ZXJzLAorfTsKKworc3RhdGljIGludAorZnJhbWVfY2FsbGJhY2soRHdmbF9GcmFtZSAqc3RhdGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOworCUR3YXJmX0FkZHIgcGM7CisKKwlpZiAoIWR3ZmxfZnJhbWVfcGMoc3RhdGUsICZwYywgTlVMTCkpIHsKKwkJcHJfZXJyKCIlcyIsIGR3ZmxfZXJybXNnKC0xKSk7CisJCXJldHVybiBEV0FSRl9DQl9BQk9SVDsKKwl9CisKKwlyZXR1cm4gZW50cnkocGMsIHVpKSB8fCAhKC0tdWktPm1heF9zdGFjaykgPworCSAgICAgICBEV0FSRl9DQl9BQk9SVCA6IERXQVJGX0NCX09LOworfQorCitpbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAorCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKwkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSwKKwkJCWludCBtYXhfc3RhY2spCit7CisJc3RydWN0IHVud2luZF9pbmZvIHVpID0geworCQkuc2FtcGxlCQk9IGRhdGEsCisJCS50aHJlYWQJCT0gdGhyZWFkLAorCQkubWFjaGluZQk9IG1hY2hpbmUsCisJCS5jYgkJPSBjYiwKKwkJLmFyZwkJPSBhcmcsCisJCS5tYXhfc3RhY2sJPSBtYXhfc3RhY2ssCisJfTsKKwlEd2FyZl9Xb3JkIGlwOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKCFkYXRhLT51c2VyX3JlZ3MucmVncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1aS5kd2ZsID0gZHdmbF9iZWdpbigmb2ZmbGluZV9jYWxsYmFja3MpOworCWlmICghdWkuZHdmbCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBwZXJmX3JlZ192YWx1ZSgmaXAsICZkYXRhLT51c2VyX3JlZ3MsIFBFUkZfUkVHX0lQKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHJlcG9ydF9tb2R1bGUoaXAsICZ1aSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoIWR3ZmxfYXR0YWNoX3N0YXRlKHVpLmR3ZmwsIEVNX05PTkUsIHRocmVhZC0+dGlkLCAmY2FsbGJhY2tzLCAmdWkpKQorCQlnb3RvIG91dDsKKworCWVyciA9IGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcyh1aS5kd2ZsLCB0aHJlYWQtPnRpZCwgZnJhbWVfY2FsbGJhY2ssICZ1aSk7CisKKwlpZiAoZXJyICYmICF1aS5tYXhfc3RhY2spCisJCWVyciA9IDA7CisKKyBvdXQ6CisJaWYgKGVycikKKwkJcHJfZGVidWcoInVud2luZDogZmFpbGVkIHdpdGggJyVzJ1xuIiwgZHdmbF9lcnJtc2coLTEpKTsKKworCWR3ZmxfZW5kKHVpLmR3ZmwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJkdy5oIGIvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJkdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2ExNDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX1BFUkZfVU5XSU5EX0xJQkRXX0gKKyNkZWZpbmUgX19QRVJGX1VOV0lORF9MSUJEV19ICisKKyNpbmNsdWRlIDxlbGZ1dGlscy9saWJkd2ZsLmg+CisjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bndpbmQuaCIKKworYm9vbCBsaWJkd19fYXJjaF9zZXRfaW5pdGlhbF9yZWdpc3RlcnMoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKTsKKworc3RydWN0IHVud2luZF9pbmZvIHsKKwlEd2ZsCQkJKmR3Zmw7CisJc3RydWN0IHBlcmZfc2FtcGxlICAgICAgKnNhbXBsZTsKKwlzdHJ1Y3QgbWFjaGluZSAgICAgICAgICAqbWFjaGluZTsKKwlzdHJ1Y3QgdGhyZWFkICAgICAgICAgICAqdGhyZWFkOworCXVud2luZF9lbnRyeV9jYl90CWNiOworCXZvaWQJCQkqYXJnOworCWludAkJCW1heF9zdGFjazsKK307CisKKyNlbmRpZiAvKiBfX1BFUkZfVU5XSU5EX0xJQkRXX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5kLmMgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTc2OGQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorICogUG9zdCBtb3J0ZW0gRHdhcmYgQ0ZJIGJhc2VkIHVud2luZGluZyBvbiB0b3Agb2YgcmVncyBhbmQgc3RhY2sgZHVtcHMuCisgKgorICogTG90cyBvZiB0aGlzIGNvZGUgaGF2ZSBiZWVuIGJvcnJvd2VkIG9yIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBwYXJ0cyBvZgorICogdGhlIGxpYnVud2luZCAwLjk5IGNvZGUgd2hpY2ggYXJlIChhbW9uZ3N0IG90aGVyIGNvbnRyaWJ1dG9ycyBJIG1heSBoYXZlCisgKiBmb3Jnb3R0ZW4pOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA3IEhld2xldHQtUGFja2FyZCBDbworICoJQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgorICoKKyAqIEFuZCB0aGUgYnVncyBoYXZlIGJlZW4gYWRkZWQgYnk6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBGcmVkZXJpYyBXZWlzYmVja2VyIDxmd2Vpc2JlY0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIEppcmkgT2xzYSA8am9sc2FAcmVkaGF0LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpYnVud2luZC5oPgorI2luY2x1ZGUgPGxpYnVud2luZC1wdHJhY2UuaD4KKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJzZXNzaW9uLmgiCisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisjaW5jbHVkZSAidW53aW5kLmgiCisjaW5jbHVkZSAic3ltYm9sLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCitleHRlcm4gaW50CitVTldfT0JKKGR3YXJmX3NlYXJjaF91bndpbmRfdGFibGUpICh1bndfYWRkcl9zcGFjZV90IGFzLAorCQkJCSAgICB1bndfd29yZF90IGlwLAorCQkJCSAgICB1bndfZHluX2luZm9fdCAqZGksCisJCQkJICAgIHVud19wcm9jX2luZm9fdCAqcGksCisJCQkJICAgIGludCBuZWVkX3Vud2luZF9pbmZvLCB2b2lkICphcmcpOworCisjZGVmaW5lIGR3YXJmX3NlYXJjaF91bndpbmRfdGFibGUgVU5XX09CSihkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlKQorCitleHRlcm4gaW50CitVTldfT0JKKGR3YXJmX2ZpbmRfZGVidWdfZnJhbWUpIChpbnQgZm91bmQsIHVud19keW5faW5mb190ICpkaV9kZWJ1ZywKKwkJCQkgdW53X3dvcmRfdCBpcCwKKwkJCQkgdW53X3dvcmRfdCBzZWdiYXNlLAorCQkJCSBjb25zdCBjaGFyICpvYmpfbmFtZSwgdW53X3dvcmRfdCBzdGFydCwKKwkJCQkgdW53X3dvcmRfdCBlbmQpOworCisjZGVmaW5lIGR3YXJmX2ZpbmRfZGVidWdfZnJhbWUgVU5XX09CSihkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKQorCisjZGVmaW5lIERXX0VIX1BFX0ZPUk1BVF9NQVNLCTB4MGYJLyogZm9ybWF0IG9mIHRoZSBlbmNvZGVkIHZhbHVlICovCisjZGVmaW5lIERXX0VIX1BFX0FQUExfTUFTSwkweDcwCS8qIGhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgYXBwbGllZCAqLworCisvKiBQb2ludGVyLWVuY29kaW5nIGZvcm1hdHM6ICovCisjZGVmaW5lIERXX0VIX1BFX29taXQJCTB4ZmYKKyNkZWZpbmUgRFdfRUhfUEVfcHRyCQkweDAwCS8qIHBvaW50ZXItc2l6ZWQgdW5zaWduZWQgdmFsdWUgKi8KKyNkZWZpbmUgRFdfRUhfUEVfdWRhdGE0CQkweDAzCS8qIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSAqLworI2RlZmluZSBEV19FSF9QRV91ZGF0YTgJCTB4MDQJLyogdW5zaWduZWQgNjQtYml0IHZhbHVlICovCisjZGVmaW5lIERXX0VIX1BFX3NkYXRhNAkJMHgwYgkvKiBzaWduZWQgMzItYml0IHZhbHVlICovCisjZGVmaW5lIERXX0VIX1BFX3NkYXRhOAkJMHgwYwkvKiBzaWduZWQgNjQtYml0IHZhbHVlICovCisKKy8qIFBvaW50ZXItZW5jb2RpbmcgYXBwbGljYXRpb246ICovCisjZGVmaW5lIERXX0VIX1BFX2Fic3B0cgkJMHgwMAkvKiBhYnNvbHV0ZSB2YWx1ZSAqLworI2RlZmluZSBEV19FSF9QRV9wY3JlbAkJMHgxMAkvKiByZWwuIHRvIGFkZHIuIG9mIGVuY29kZWQgdmFsdWUgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCBkb2N1bWVudGVkIGJ5IExTQiB2MS4zLCB5ZXQgdGhleSBhcmUgdXNlZCBieQorICogR0NDLCBwcmVzdW1hYmx5IHRoZXkgYXJlbid0IGRvY3VtZW50ZWQgYnkgTFNCIHNpbmNlIHRoZXkgYXJlbid0CisgKiB1c2VkIG9uIExpbnV4OgorICovCisjZGVmaW5lIERXX0VIX1BFX2Z1bmNyZWwJMHg0MAkvKiBzdGFydC1vZi1wcm9jZWR1cmUtcmVsYXRpdmUgKi8KKyNkZWZpbmUgRFdfRUhfUEVfYWxpZ25lZAkweDUwCS8qIGFsaWduZWQgcG9pbnRlciAqLworCisvKiBGbGFncyBpbnRlbnRpb25hbHkgbm90IGhhbmRsZWQsIHNpbmNlIHRoZXkncmUgbm90IG5lZWRlZDoKKyAqICNkZWZpbmUgRFdfRUhfUEVfaW5kaXJlY3QgICAgICAweDgwCisgKiAjZGVmaW5lIERXX0VIX1BFX3VsZWIxMjggICAgICAgMHgwMQorICogI2RlZmluZSBEV19FSF9QRV91ZGF0YTIgICAgICAgIDB4MDIKKyAqICNkZWZpbmUgRFdfRUhfUEVfc2xlYjEyOCAgICAgICAweDA5CisgKiAjZGVmaW5lIERXX0VIX1BFX3NkYXRhMiAgICAgICAgMHgwYQorICogI2RlZmluZSBEV19FSF9QRV90ZXh0cmVsICAgICAgIDB4MjAKKyAqICNkZWZpbmUgRFdfRUhfUEVfZGF0YXJlbCAgICAgICAweDMwCisgKi8KKworc3RydWN0IHVud2luZF9pbmZvIHsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGUJKnNhbXBsZTsKKwlzdHJ1Y3QgbWFjaGluZQkJKm1hY2hpbmU7CisJc3RydWN0IHRocmVhZAkJKnRocmVhZDsKK307CisKKyNkZWZpbmUgZHdfcmVhZChwdHIsIHR5cGUsIGVuZCkgKHsJXAorCXR5cGUgKl9fcCA9ICh0eXBlICopIHB0cjsJXAorCXR5cGUgIF9fdjsJCQlcCisJaWYgKChfX3AgKyAxKSA+ICh0eXBlICopIGVuZCkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCVwKKwlfX3YgPSAqX19wKys7CQkJXAorCXB0ciA9ICh0eXBlb2YocHRyKSkgX19wOwlcCisJX192OwkJCQlcCisJfSkKKworc3RhdGljIGludCBfX2R3X3JlYWRfZW5jb2RlZF92YWx1ZSh1OCAqKnAsIHU4ICplbmQsIHU2NCAqdmFsLAorCQkJCSAgIHU4IGVuY29kaW5nKQoreworCXU4ICpjdXIgPSAqcDsKKwkqdmFsID0gMDsKKworCXN3aXRjaCAoZW5jb2RpbmcpIHsKKwljYXNlIERXX0VIX1BFX29taXQ6CisJCSp2YWwgPSAwOworCQlnb3RvIG91dDsKKwljYXNlIERXX0VIX1BFX3B0cjoKKwkJKnZhbCA9IGR3X3JlYWQoY3VyLCB1bnNpZ25lZCBsb25nLCBlbmQpOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGVuY29kaW5nICYgRFdfRUhfUEVfQVBQTF9NQVNLKSB7CisJY2FzZSBEV19FSF9QRV9hYnNwdHI6CisJCWJyZWFrOworCWNhc2UgRFdfRUhfUEVfcGNyZWw6CisJCSp2YWwgPSAodW5zaWduZWQgbG9uZykgY3VyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGVuY29kaW5nICYgMHgwNykgPT0gMHgwMCkKKwkJZW5jb2RpbmcgfD0gRFdfRUhfUEVfdWRhdGE0OworCisJc3dpdGNoIChlbmNvZGluZyAmIERXX0VIX1BFX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBEV19FSF9QRV9zZGF0YTQ6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHMzMiwgZW5kKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV91ZGF0YTQ6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHUzMiwgZW5kKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV9zZGF0YTg6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHM2NCwgZW5kKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV91ZGF0YTg6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHU2NCwgZW5kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisgb3V0OgorCSpwID0gY3VyOworCXJldHVybiAwOworfQorCisjZGVmaW5lIGR3X3JlYWRfZW5jb2RlZF92YWx1ZShwdHIsIGVuZCwgZW5jKSAoewkJCVwKKwl1NjQgX192OwkJCQkJCVwKKwlpZiAoX19kd19yZWFkX2VuY29kZWRfdmFsdWUoJnB0ciwgZW5kLCAmX192LCBlbmMpKSB7CVwKKwkJcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0pCisKK3N0YXRpYyB1NjQgZWxmX3NlY3Rpb25fb2Zmc2V0KGludCBmZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlFbGYgKmVsZjsKKwlHRWxmX0VoZHIgZWhkcjsKKwlHRWxmX1NoZHIgc2hkcjsKKwl1NjQgb2Zmc2V0ID0gMDsKKworCWVsZiA9IGVsZl9iZWdpbihmZCwgUEVSRl9FTEZfQ19SRUFEX01NQVAsIE5VTEwpOworCWlmIChlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlkbyB7CisJCWlmIChnZWxmX2dldGVoZHIoZWxmLCAmZWhkcikgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWlmICghZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgbmFtZSwgTlVMTCkpCisJCQlicmVhazsKKworCQlvZmZzZXQgPSBzaGRyLnNoX29mZnNldDsKKwl9IHdoaWxlICgwKTsKKworCWVsZl9lbmQoZWxmKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdHJ1Y3QgdGFibGVfZW50cnkgeworCXUzMiBzdGFydF9pcF9vZmZzZXQ7CisJdTMyIGZkZV9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgZWhfZnJhbWVfaGRyIHsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CisJdW5zaWduZWQgY2hhciBlaF9mcmFtZV9wdHJfZW5jOworCXVuc2lnbmVkIGNoYXIgZmRlX2NvdW50X2VuYzsKKwl1bnNpZ25lZCBjaGFyIHRhYmxlX2VuYzsKKworCS8qCisJICogVGhlIHJlc3Qgb2YgdGhlIGhlYWRlciBpcyB2YXJpYWJsZS1sZW5ndGggYW5kIGNvbnNpc3RzIG9mIHRoZQorCSAqIGZvbGxvd2luZyBtZW1iZXJzOgorCSAqCisJICoJZW5jb2RlZF90IGVoX2ZyYW1lX3B0cjsKKwkgKgllbmNvZGVkX3QgZmRlX2NvdW50OworCSAqLworCisJLyogQSBzaW5nbGUgZW5jb2RlZCBwb2ludGVyIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuIDggYnl0ZXMuICovCisJdTY0IGVuY1syXTsKKworCS8qCisJICogc3RydWN0IHsKKwkgKiAgICBlbmNvZGVkX3Qgc3RhcnRfaXA7CisJICogICAgZW5jb2RlZF90IGZkZV9hZGRyOworCSAqIH0gYmluYXJ5X3NlYXJjaF90YWJsZVtmZGVfY291bnRdOworCSAqLworCWNoYXIgZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0YXRpYyBpbnQgdW53aW5kX3NwZWNfZWhmcmFtZShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJICAgICAgIHU2NCBvZmZzZXQsIHU2NCAqdGFibGVfZGF0YSwgdTY0ICpzZWdiYXNlLAorCQkJICAgICAgIHU2NCAqZmRlX2NvdW50KQoreworCXN0cnVjdCBlaF9mcmFtZV9oZHIgaGRyOworCXU4ICplbmMgPSAodTggKikgJmhkci5lbmM7CisJdTggKmVuZCA9ICh1OCAqKSAmaGRyLmRhdGE7CisJc3NpemVfdCByOworCisJciA9IGRzb19fZGF0YV9yZWFkX29mZnNldChkc28sIG1hY2hpbmUsIG9mZnNldCwKKwkJCQkgICh1OCAqKSAmaGRyLCBzaXplb2YoaGRyKSk7CisJaWYgKHIgIT0gc2l6ZW9mKGhkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV2UgZG9udCBuZWVkIGVoX2ZyYW1lX3B0ciwganVzdCBza2lwIGl0LiAqLworCWR3X3JlYWRfZW5jb2RlZF92YWx1ZShlbmMsIGVuZCwgaGRyLmVoX2ZyYW1lX3B0cl9lbmMpOworCisJKmZkZV9jb3VudCAgPSBkd19yZWFkX2VuY29kZWRfdmFsdWUoZW5jLCBlbmQsIGhkci5mZGVfY291bnRfZW5jKTsKKwkqc2VnYmFzZSAgICA9IG9mZnNldDsKKwkqdGFibGVfZGF0YSA9IChlbmMgLSAodTggKikgJmhkcikgKyBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF91bndpbmRfc3BlY19laF9mcmFtZShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCSAgICAgdTY0ICp0YWJsZV9kYXRhLCB1NjQgKnNlZ2Jhc2UsCisJCQkJICAgICB1NjQgKmZkZV9jb3VudCkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTCwgZmQ7CisJdTY0IG9mZnNldDsKKworCWZkID0gZHNvX19kYXRhX2ZkKGRzbywgbWFjaGluZSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24gZm9yIHVud2luZGluZyBpbmZvICovCisJb2Zmc2V0ID0gZWxmX3NlY3Rpb25fb2Zmc2V0KGZkLCAiLmVoX2ZyYW1lX2hkciIpOworCWNsb3NlKGZkKTsKKworCWlmIChvZmZzZXQpCisJCXJldCA9IHVud2luZF9zcGVjX2VoZnJhbWUoZHNvLCBtYWNoaW5lLCBvZmZzZXQsCisJCQkJCSAgdGFibGVfZGF0YSwgc2VnYmFzZSwKKwkJCQkJICBmZGVfY291bnQpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBOT19MSUJVTldJTkRfREVCVUdfRlJBTUUKK3N0YXRpYyBpbnQgcmVhZF91bndpbmRfc3BlY19kZWJ1Z19mcmFtZShzdHJ1Y3QgZHNvICpkc28sCisJCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1NjQgKm9mZnNldCkKK3sKKwlpbnQgZmQgPSBkc29fX2RhdGFfZmQoZHNvLCBtYWNoaW5lKTsKKworCWlmIChmZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgdGhlIC5kZWJ1Z19mcmFtZSBzZWN0aW9uIGZvciB1bndpbmRpbmcgaW5mbyAqLworCSpvZmZzZXQgPSBlbGZfc2VjdGlvbl9vZmZzZXQoZmQsICIuZGVidWdfZnJhbWUiKTsKKwljbG9zZShmZCk7CisKKwlpZiAoKm9mZnNldCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1hcCAqZmluZF9tYXAodW53X3dvcmRfdCBpcCwgc3RydWN0IHVud2luZF9pbmZvICp1aSkKK3sKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKworCXRocmVhZF9fZmluZF9hZGRyX21hcCh1aS0+dGhyZWFkLCB1aS0+bWFjaGluZSwgUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAorCQkJICAgICAgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CisJcmV0dXJuIGFsLm1hcDsKK30KKworc3RhdGljIGludAorZmluZF9wcm9jX2luZm8odW53X2FkZHJfc3BhY2VfdCBhcywgdW53X3dvcmRfdCBpcCwgdW53X3Byb2NfaW5mb190ICpwaSwKKwkgICAgICAgaW50IG5lZWRfdW53aW5kX2luZm8sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOworCXN0cnVjdCBtYXAgKm1hcDsKKwl1bndfZHluX2luZm9fdCBkaTsKKwl1NjQgdGFibGVfZGF0YSwgc2VnYmFzZSwgZmRlX2NvdW50OworCisJbWFwID0gZmluZF9tYXAoaXAsIHVpKTsKKwlpZiAoIW1hcCB8fCAhbWFwLT5kc28pCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoInVud2luZDogZmluZF9wcm9jX2luZm8gZHNvICVzXG4iLCBtYXAtPmRzby0+bmFtZSk7CisKKwkvKiBDaGVjayB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24gZm9yIHVud2luZGluZyBpbmZvICovCisJaWYgKCFyZWFkX3Vud2luZF9zcGVjX2VoX2ZyYW1lKG1hcC0+ZHNvLCB1aS0+bWFjaGluZSwKKwkJCQkgICAgICAgJnRhYmxlX2RhdGEsICZzZWdiYXNlLCAmZmRlX2NvdW50KSkgeworCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKKwkJZGkuZm9ybWF0ICAgPSBVTldfSU5GT19GT1JNQVRfUkVNT1RFX1RBQkxFOworCQlkaS5zdGFydF9pcCA9IG1hcC0+c3RhcnQ7CisJCWRpLmVuZF9pcCAgID0gbWFwLT5lbmQ7CisJCWRpLnUucnRpLnNlZ2Jhc2UgICAgPSBtYXAtPnN0YXJ0ICsgc2VnYmFzZTsKKwkJZGkudS5ydGkudGFibGVfZGF0YSA9IG1hcC0+c3RhcnQgKyB0YWJsZV9kYXRhOworCQlkaS51LnJ0aS50YWJsZV9sZW4gID0gZmRlX2NvdW50ICogc2l6ZW9mKHN0cnVjdCB0YWJsZV9lbnRyeSkKKwkJCQkgICAgICAvIHNpemVvZih1bndfd29yZF90KTsKKwkJcmV0dXJuIGR3YXJmX3NlYXJjaF91bndpbmRfdGFibGUoYXMsIGlwLCAmZGksIHBpLAorCQkJCQkJIG5lZWRfdW53aW5kX2luZm8sIGFyZyk7CisJfQorCisjaWZuZGVmIE5PX0xJQlVOV0lORF9ERUJVR19GUkFNRQorCS8qIENoZWNrIHRoZSAuZGVidWdfZnJhbWUgc2VjdGlvbiBmb3IgdW53aW5kaW5nIGluZm8gKi8KKwlpZiAoIXJlYWRfdW53aW5kX3NwZWNfZGVidWdfZnJhbWUobWFwLT5kc28sIHVpLT5tYWNoaW5lLCAmc2VnYmFzZSkpIHsKKwkJbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKGRpKSk7CisJCWlmIChkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKDAsICZkaSwgaXAsIDAsIG1hcC0+ZHNvLT5uYW1lLAorCQkJCQkgICBtYXAtPnN0YXJ0LCBtYXAtPmVuZCkpCisJCQlyZXR1cm4gZHdhcmZfc2VhcmNoX3Vud2luZF90YWJsZShhcywgaXAsICZkaSwgcGksCisJCQkJCQkJIG5lZWRfdW53aW5kX2luZm8sIGFyZyk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhY2Nlc3NfZnByZWcodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJCXVud19yZWdudW1fdCBfX21heWJlX3VudXNlZCBudW0sCisJCQl1bndfZnByZWdfdCBfX21heWJlX3VudXNlZCAqdmFsLAorCQkJaW50IF9fbWF5YmVfdW51c2VkIF9fd3JpdGUsCisJCQl2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCit7CisJcHJfZXJyKCJ1bndpbmQ6IGFjY2Vzc19mcHJlZyB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1VTldfRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdldF9keW5faW5mb19saXN0X2FkZHIodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJCQkgIHVud193b3JkX3QgX19tYXliZV91bnVzZWQgKmRpbF9hZGRyLAorCQkJCSAgdm9pZCBfX21heWJlX3VudXNlZCAqYXJnKQoreworCXJldHVybiAtVU5XX0VOT0lORk87Cit9CisKK3N0YXRpYyBpbnQgcmVzdW1lKHVud19hZGRyX3NwYWNlX3QgX19tYXliZV91bnVzZWQgYXMsCisJCSAgdW53X2N1cnNvcl90IF9fbWF5YmVfdW51c2VkICpjdSwKKwkJICB2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCit7CisJcHJfZXJyKCJ1bndpbmQ6IHJlc3VtZSB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1VTldfRUlOVkFMOworfQorCitzdGF0aWMgaW50CitnZXRfcHJvY19uYW1lKHVud19hZGRyX3NwYWNlX3QgX19tYXliZV91bnVzZWQgYXMsCisJICAgICAgdW53X3dvcmRfdCBfX21heWJlX3VudXNlZCBhZGRyLAorCQljaGFyIF9fbWF5YmVfdW51c2VkICpidWZwLCBzaXplX3QgX19tYXliZV91bnVzZWQgYnVmX2xlbiwKKwkJdW53X3dvcmRfdCBfX21heWJlX3VudXNlZCAqb2ZmcCwgdm9pZCBfX21heWJlX3VudXNlZCAqYXJnKQoreworCXByX2VycigidW53aW5kOiBnZXRfcHJvY19uYW1lIHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gLVVOV19FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWNjZXNzX2Rzb19tZW0oc3RydWN0IHVud2luZF9pbmZvICp1aSwgdW53X3dvcmRfdCBhZGRyLAorCQkJICB1bndfd29yZF90ICpkYXRhKQoreworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCXNzaXplX3Qgc2l6ZTsKKworCXRocmVhZF9fZmluZF9hZGRyX21hcCh1aS0+dGhyZWFkLCB1aS0+bWFjaGluZSwgUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAorCQkJICAgICAgTUFQX19GVU5DVElPTiwgYWRkciwgJmFsKTsKKwlpZiAoIWFsLm1hcCkgeworCQlwcl9kZWJ1ZygidW53aW5kOiBubyBtYXAgZm9yICVseFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIWFsLm1hcC0+ZHNvKQorCQlyZXR1cm4gLTE7CisKKwlzaXplID0gZHNvX19kYXRhX3JlYWRfYWRkcihhbC5tYXAtPmRzbywgYWwubWFwLCB1aS0+bWFjaGluZSwKKwkJCQkgICBhZGRyLCAodTggKikgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisKKwlyZXR1cm4gIShzaXplID09IHNpemVvZigqZGF0YSkpOworfQorCitzdGF0aWMgaW50IGFjY2Vzc19tZW0odW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJICAgICAgdW53X3dvcmRfdCBhZGRyLCB1bndfd29yZF90ICp2YWxwLAorCQkgICAgICBpbnQgX193cml0ZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7CisJc3RydWN0IHN0YWNrX2R1bXAgKnN0YWNrID0gJnVpLT5zYW1wbGUtPnVzZXJfc3RhY2s7CisJdTY0IHN0YXJ0LCBlbmQ7CisJaW50IG9mZnNldDsKKwlpbnQgcmV0OworCisJLyogRG9uJ3Qgc3VwcG9ydCB3cml0ZSwgcHJvYmFibHkgbm90IG5lZWRlZC4gKi8KKwlpZiAoX193cml0ZSB8fCAhc3RhY2sgfHwgIXVpLT5zYW1wbGUtPnVzZXJfcmVncy5yZWdzKSB7CisJCSp2YWxwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gcGVyZl9yZWdfdmFsdWUoJnN0YXJ0LCAmdWktPnNhbXBsZS0+dXNlcl9yZWdzLCBQRVJGX1JFR19TUCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWVuZCA9IHN0YXJ0ICsgc3RhY2stPnNpemU7CisKKwkvKiBDaGVjayBvdmVyZmxvdy4gKi8KKwlpZiAoYWRkciArIHNpemVvZih1bndfd29yZF90KSA8IGFkZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkZHIgPCBzdGFydCB8fCBhZGRyICsgc2l6ZW9mKHVud193b3JkX3QpID49IGVuZCkgeworCQlyZXQgPSBhY2Nlc3NfZHNvX21lbSh1aSwgYWRkciwgdmFscCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2RlYnVnKCJ1bndpbmQ6IGFjY2Vzc19tZW0gJXAgbm90IGluc2lkZSByYW5nZSIKKwkJCQkgIiAweCUiIFBSSXg2NCAiLTB4JSIgUFJJeDY0ICJcbiIsCisJCQkJICh2b2lkICopIGFkZHIsIHN0YXJ0LCBlbmQpOworCQkJKnZhbHAgPSAwOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlvZmZzZXQgPSBhZGRyIC0gc3RhcnQ7CisJKnZhbHAgID0gKih1bndfd29yZF90ICopJnN0YWNrLT5kYXRhW29mZnNldF07CisJcHJfZGVidWcoInVud2luZDogYWNjZXNzX21lbSBhZGRyICVwIHZhbCAlbHgsIG9mZnNldCAlZFxuIiwKKwkJICh2b2lkICopIGFkZHIsICh1bnNpZ25lZCBsb25nKSp2YWxwLCBvZmZzZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjY2Vzc19yZWcodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJICAgICAgdW53X3JlZ251bV90IHJlZ251bSwgdW53X3dvcmRfdCAqdmFscCwKKwkJICAgICAgaW50IF9fd3JpdGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOworCWludCBpZCwgcmV0OworCXU2NCB2YWw7CisKKwkvKiBEb24ndCBzdXBwb3J0IHdyaXRlLCBJIHN1c3BlY3Qgd2UgZG9uJ3QgbmVlZCBpdC4gKi8KKwlpZiAoX193cml0ZSkgeworCQlwcl9lcnIoInVud2luZDogYWNjZXNzX3JlZyB3ICVkXG4iLCByZWdudW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXVpLT5zYW1wbGUtPnVzZXJfcmVncy5yZWdzKSB7CisJCSp2YWxwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWQgPSBsaWJ1bndpbmRfX2FyY2hfcmVnX2lkKHJlZ251bSk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBwZXJmX3JlZ192YWx1ZSgmdmFsLCAmdWktPnNhbXBsZS0+dXNlcl9yZWdzLCBpZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInVud2luZDogY2FuJ3QgcmVhZCByZWcgJWRcbiIsIHJlZ251bSk7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbHAgPSAodW53X3dvcmRfdCkgdmFsOworCXByX2RlYnVnKCJ1bndpbmQ6IHJlZyAlZCwgdmFsICVseFxuIiwgcmVnbnVtLCAodW5zaWduZWQgbG9uZykqdmFscCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF91bndpbmRfaW5mbyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAorCQkJICAgIHVud19wcm9jX2luZm9fdCAqcGkgX19tYXliZV91bnVzZWQsCisJCQkgICAgdm9pZCAqYXJnIF9fbWF5YmVfdW51c2VkKQoreworCXByX2RlYnVnKCJ1bndpbmQ6IHB1dF91bndpbmRfaW5mbyBjYWxsZWRcbiIpOworfQorCitzdGF0aWMgaW50IGVudHJ5KHU2NCBpcCwgc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJIHVud2luZF9lbnRyeV9jYl90IGNiLCB2b2lkICphcmcpCit7CisJc3RydWN0IHVud2luZF9lbnRyeSBlOworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCisJdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24odGhyZWFkLCBtYWNoaW5lLAorCQkJCSAgIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKKwkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKKworCWUuaXAgPSBpcDsKKwllLm1hcCA9IGFsLm1hcDsKKwllLnN5bSA9IGFsLnN5bTsKKworCXByX2RlYnVnKCJ1bndpbmQ6ICVzOmlwID0gMHglIiBQUkl4NjQgIiAoMHglIiBQUkl4NjQgIilcbiIsCisJCSBhbC5zeW0gPyBhbC5zeW0tPm5hbWUgOiAiJyciLAorCQkgaXAsCisJCSBhbC5tYXAgPyBhbC5tYXAtPm1hcF9pcChhbC5tYXAsIGlwKSA6ICh1NjQpIDApOworCisJcmV0dXJuIGNiKCZlLCBhcmcpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2Vycm9yKGludCBlcnIpCit7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIFVOV19FSU5WQUw6CisJCXByX2VycigidW53aW5kOiBPbmx5IHN1cHBvcnRzIGxvY2FsLlxuIik7CisJCWJyZWFrOworCWNhc2UgVU5XX0VVTlNQRUM6CisJCXByX2VycigidW53aW5kOiBVbnNwZWNpZmllZCBlcnJvci5cbiIpOworCQlicmVhazsKKwljYXNlIFVOV19FQkFEUkVHOgorCQlwcl9lcnIoInVud2luZDogUmVnaXN0ZXIgdW5hdmFpbGFibGUuXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdW53X2FjY2Vzc29yc190IGFjY2Vzc29ycyA9IHsKKwkuZmluZF9wcm9jX2luZm8JCT0gZmluZF9wcm9jX2luZm8sCisJLnB1dF91bndpbmRfaW5mbwk9IHB1dF91bndpbmRfaW5mbywKKwkuZ2V0X2R5bl9pbmZvX2xpc3RfYWRkcgk9IGdldF9keW5faW5mb19saXN0X2FkZHIsCisJLmFjY2Vzc19tZW0JCT0gYWNjZXNzX21lbSwKKwkuYWNjZXNzX3JlZwkJPSBhY2Nlc3NfcmVnLAorCS5hY2Nlc3NfZnByZWcJCT0gYWNjZXNzX2ZwcmVnLAorCS5yZXN1bWUJCQk9IHJlc3VtZSwKKwkuZ2V0X3Byb2NfbmFtZQkJPSBnZXRfcHJvY19uYW1lLAorfTsKKworc3RhdGljIGludCBnZXRfZW50cmllcyhzdHJ1Y3QgdW53aW5kX2luZm8gKnVpLCB1bndpbmRfZW50cnlfY2JfdCBjYiwKKwkJICAgICAgIHZvaWQgKmFyZywgaW50IG1heF9zdGFjaykKK3sKKwl1bndfYWRkcl9zcGFjZV90IGFkZHJfc3BhY2U7CisJdW53X2N1cnNvcl90IGM7CisJaW50IHJldDsKKworCWFkZHJfc3BhY2UgPSB1bndfY3JlYXRlX2FkZHJfc3BhY2UoJmFjY2Vzc29ycywgMCk7CisJaWYgKCFhZGRyX3NwYWNlKSB7CisJCXByX2VycigidW53aW5kOiBDYW4ndCBjcmVhdGUgdW53aW5kIGFkZHJlc3Mgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gdW53X2luaXRfcmVtb3RlKCZjLCBhZGRyX3NwYWNlLCB1aSk7CisJaWYgKHJldCkKKwkJZGlzcGxheV9lcnJvcihyZXQpOworCisJd2hpbGUgKCFyZXQgJiYgKHVud19zdGVwKCZjKSA+IDApICYmIG1heF9zdGFjay0tKSB7CisJCXVud193b3JkX3QgaXA7CisKKwkJdW53X2dldF9yZWcoJmMsIFVOV19SRUdfSVAsICZpcCk7CisJCXJldCA9IGlwID8gZW50cnkoaXAsIHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLCBjYiwgYXJnKSA6IDA7CisJfQorCisJdW53X2Rlc3Ryb3lfYWRkcl9zcGFjZShhZGRyX3NwYWNlKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAorCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKwkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSwgaW50IG1heF9zdGFjaykKK3sKKwl1NjQgaXA7CisJc3RydWN0IHVud2luZF9pbmZvIHVpID0geworCQkuc2FtcGxlICAgICAgID0gZGF0YSwKKwkJLnRocmVhZCAgICAgICA9IHRocmVhZCwKKwkJLm1hY2hpbmUgICAgICA9IG1hY2hpbmUsCisJfTsKKwlpbnQgcmV0OworCisJaWYgKCFkYXRhLT51c2VyX3JlZ3MucmVncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBwZXJmX3JlZ192YWx1ZSgmaXAsICZkYXRhLT51c2VyX3JlZ3MsIFBFUkZfUkVHX0lQKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZW50cnkoaXAsIHRocmVhZCwgbWFjaGluZSwgY2IsIGFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gLS1tYXhfc3RhY2sgPiAwID8gZ2V0X2VudHJpZXMoJnVpLCBjYiwgYXJnLCBtYXhfc3RhY2spIDogMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQuYyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyZjIzYi4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL3V0aWwvdW53aW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotLyoKLSAqIFBvc3QgbW9ydGVtIER3YXJmIENGSSBiYXNlZCB1bndpbmRpbmcgb24gdG9wIG9mIHJlZ3MgYW5kIHN0YWNrIGR1bXBzLgotICoKLSAqIExvdHMgb2YgdGhpcyBjb2RlIGhhdmUgYmVlbiBib3Jyb3dlZCBvciBoZWF2aWx5IGluc3BpcmVkIGZyb20gcGFydHMgb2YKLSAqIHRoZSBsaWJ1bndpbmQgMC45OSBjb2RlIHdoaWNoIGFyZSAoYW1vbmdzdCBvdGhlciBjb250cmlidXRvcnMgSSBtYXkgaGF2ZQotICogZm9yZ290dGVuKToKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBIZXdsZXR0LVBhY2thcmQgQ28KLSAqCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KLSAqCi0gKiBBbmQgdGhlIGJ1Z3MgaGF2ZSBiZWVuIGFkZGVkIGJ5OgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyLCBKaXJpIE9sc2EgPGpvbHNhQHJlZGhhdC5jb20+Ci0gKgotICovCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaWJ1bndpbmQuaD4KLSNpbmNsdWRlIDxsaWJ1bndpbmQtcHRyYWNlLmg+Ci0jaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgInBlcmZfcmVncy5oIgotI2luY2x1ZGUgInVud2luZC5oIgotI2luY2x1ZGUgInN5bWJvbC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotZXh0ZXJuIGludAotVU5XX09CSihkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlKSAodW53X2FkZHJfc3BhY2VfdCBhcywKLQkJCQkgICAgdW53X3dvcmRfdCBpcCwKLQkJCQkgICAgdW53X2R5bl9pbmZvX3QgKmRpLAotCQkJCSAgICB1bndfcHJvY19pbmZvX3QgKnBpLAotCQkJCSAgICBpbnQgbmVlZF91bndpbmRfaW5mbywgdm9pZCAqYXJnKTsKLQotI2RlZmluZSBkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlIFVOV19PQkooZHdhcmZfc2VhcmNoX3Vud2luZF90YWJsZSkKLQotZXh0ZXJuIGludAotVU5XX09CSihkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKSAoaW50IGZvdW5kLCB1bndfZHluX2luZm9fdCAqZGlfZGVidWcsCi0JCQkJIHVud193b3JkX3QgaXAsCi0JCQkJIHVud193b3JkX3Qgc2VnYmFzZSwKLQkJCQkgY29uc3QgY2hhciAqb2JqX25hbWUsIHVud193b3JkX3Qgc3RhcnQsCi0JCQkJIHVud193b3JkX3QgZW5kKTsKLQotI2RlZmluZSBkd2FyZl9maW5kX2RlYnVnX2ZyYW1lIFVOV19PQkooZHdhcmZfZmluZF9kZWJ1Z19mcmFtZSkKLQotI2RlZmluZSBEV19FSF9QRV9GT1JNQVRfTUFTSwkweDBmCS8qIGZvcm1hdCBvZiB0aGUgZW5jb2RlZCB2YWx1ZSAqLwotI2RlZmluZSBEV19FSF9QRV9BUFBMX01BU0sJMHg3MAkvKiBob3cgdGhlIHZhbHVlIGlzIHRvIGJlIGFwcGxpZWQgKi8KLQotLyogUG9pbnRlci1lbmNvZGluZyBmb3JtYXRzOiAqLwotI2RlZmluZSBEV19FSF9QRV9vbWl0CQkweGZmCi0jZGVmaW5lIERXX0VIX1BFX3B0cgkJMHgwMAkvKiBwb2ludGVyLXNpemVkIHVuc2lnbmVkIHZhbHVlICovCi0jZGVmaW5lIERXX0VIX1BFX3VkYXRhNAkJMHgwMwkvKiB1bnNpZ25lZCAzMi1iaXQgdmFsdWUgKi8KLSNkZWZpbmUgRFdfRUhfUEVfdWRhdGE4CQkweDA0CS8qIHVuc2lnbmVkIDY0LWJpdCB2YWx1ZSAqLwotI2RlZmluZSBEV19FSF9QRV9zZGF0YTQJCTB4MGIJLyogc2lnbmVkIDMyLWJpdCB2YWx1ZSAqLwotI2RlZmluZSBEV19FSF9QRV9zZGF0YTgJCTB4MGMJLyogc2lnbmVkIDY0LWJpdCB2YWx1ZSAqLwotCi0vKiBQb2ludGVyLWVuY29kaW5nIGFwcGxpY2F0aW9uOiAqLwotI2RlZmluZSBEV19FSF9QRV9hYnNwdHIJCTB4MDAJLyogYWJzb2x1dGUgdmFsdWUgKi8KLSNkZWZpbmUgRFdfRUhfUEVfcGNyZWwJCTB4MTAJLyogcmVsLiB0byBhZGRyLiBvZiBlbmNvZGVkIHZhbHVlICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFyZSBub3QgZG9jdW1lbnRlZCBieSBMU0IgdjEuMywgeWV0IHRoZXkgYXJlIHVzZWQgYnkKLSAqIEdDQywgcHJlc3VtYWJseSB0aGV5IGFyZW4ndCBkb2N1bWVudGVkIGJ5IExTQiBzaW5jZSB0aGV5IGFyZW4ndAotICogdXNlZCBvbiBMaW51eDoKLSAqLwotI2RlZmluZSBEV19FSF9QRV9mdW5jcmVsCTB4NDAJLyogc3RhcnQtb2YtcHJvY2VkdXJlLXJlbGF0aXZlICovCi0jZGVmaW5lIERXX0VIX1BFX2FsaWduZWQJMHg1MAkvKiBhbGlnbmVkIHBvaW50ZXIgKi8KLQotLyogRmxhZ3MgaW50ZW50aW9uYWx5IG5vdCBoYW5kbGVkLCBzaW5jZSB0aGV5J3JlIG5vdCBuZWVkZWQ6Ci0gKiAjZGVmaW5lIERXX0VIX1BFX2luZGlyZWN0ICAgICAgMHg4MAotICogI2RlZmluZSBEV19FSF9QRV91bGViMTI4ICAgICAgIDB4MDEKLSAqICNkZWZpbmUgRFdfRUhfUEVfdWRhdGEyICAgICAgICAweDAyCi0gKiAjZGVmaW5lIERXX0VIX1BFX3NsZWIxMjggICAgICAgMHgwOQotICogI2RlZmluZSBEV19FSF9QRV9zZGF0YTIgICAgICAgIDB4MGEKLSAqICNkZWZpbmUgRFdfRUhfUEVfdGV4dHJlbCAgICAgICAweDIwCi0gKiAjZGVmaW5lIERXX0VIX1BFX2RhdGFyZWwgICAgICAgMHgzMAotICovCi0KLXN0cnVjdCB1bndpbmRfaW5mbyB7Ci0Jc3RydWN0IHBlcmZfc2FtcGxlCSpzYW1wbGU7Ci0Jc3RydWN0IG1hY2hpbmUJCSptYWNoaW5lOwotCXN0cnVjdCB0aHJlYWQJCSp0aHJlYWQ7Ci0JdTY0CQkJc2FtcGxlX3VyZWdzOwotfTsKLQotI2RlZmluZSBkd19yZWFkKHB0ciwgdHlwZSwgZW5kKSAoewlcCi0JdHlwZSAqX19wID0gKHR5cGUgKikgcHRyOwlcCi0JdHlwZSAgX192OwkJCVwKLQlpZiAoKF9fcCArIDEpID4gKHR5cGUgKikgZW5kKQlcCi0JCXJldHVybiAtRUlOVkFMOwkJXAotCV9fdiA9ICpfX3ArKzsJCQlcCi0JcHRyID0gKHR5cGVvZihwdHIpKSBfX3A7CVwKLQlfX3Y7CQkJCVwKLQl9KQotCi1zdGF0aWMgaW50IF9fZHdfcmVhZF9lbmNvZGVkX3ZhbHVlKHU4ICoqcCwgdTggKmVuZCwgdTY0ICp2YWwsCi0JCQkJICAgdTggZW5jb2RpbmcpCi17Ci0JdTggKmN1ciA9ICpwOwotCSp2YWwgPSAwOwotCi0Jc3dpdGNoIChlbmNvZGluZykgewotCWNhc2UgRFdfRUhfUEVfb21pdDoKLQkJKnZhbCA9IDA7Ci0JCWdvdG8gb3V0OwotCWNhc2UgRFdfRUhfUEVfcHRyOgotCQkqdmFsID0gZHdfcmVhZChjdXIsIHVuc2lnbmVkIGxvbmcsIGVuZCk7Ci0JCWdvdG8gb3V0OwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoZW5jb2RpbmcgJiBEV19FSF9QRV9BUFBMX01BU0spIHsKLQljYXNlIERXX0VIX1BFX2Fic3B0cjoKLQkJYnJlYWs7Ci0JY2FzZSBEV19FSF9QRV9wY3JlbDoKLQkJKnZhbCA9ICh1bnNpZ25lZCBsb25nKSBjdXI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICgoZW5jb2RpbmcgJiAweDA3KSA9PSAweDAwKQotCQllbmNvZGluZyB8PSBEV19FSF9QRV91ZGF0YTQ7Ci0KLQlzd2l0Y2ggKGVuY29kaW5nICYgRFdfRUhfUEVfRk9STUFUX01BU0spIHsKLQljYXNlIERXX0VIX1BFX3NkYXRhNDoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgczMyLCBlbmQpOwotCQlicmVhazsKLQljYXNlIERXX0VIX1BFX3VkYXRhNDoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgdTMyLCBlbmQpOwotCQlicmVhazsKLQljYXNlIERXX0VIX1BFX3NkYXRhODoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgczY0LCBlbmQpOwotCQlicmVhazsKLQljYXNlIERXX0VIX1BFX3VkYXRhODoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgdTY0LCBlbmQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLSBvdXQ6Ci0JKnAgPSBjdXI7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgZHdfcmVhZF9lbmNvZGVkX3ZhbHVlKHB0ciwgZW5kLCBlbmMpICh7CQkJXAotCXU2NCBfX3Y7CQkJCQkJXAotCWlmIChfX2R3X3JlYWRfZW5jb2RlZF92YWx1ZSgmcHRyLCBlbmQsICZfX3YsIGVuYykpIHsJXAotCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX192OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSkKLQotc3RhdGljIHU2NCBlbGZfc2VjdGlvbl9vZmZzZXQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lKQotewotCUVsZiAqZWxmOwotCUdFbGZfRWhkciBlaGRyOwotCUdFbGZfU2hkciBzaGRyOwotCXU2NCBvZmZzZXQgPSAwOwotCi0JZWxmID0gZWxmX2JlZ2luKGZkLCBQRVJGX0VMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0JaWYgKGVsZiA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWRvIHsKLQkJaWYgKGdlbGZfZ2V0ZWhkcihlbGYsICZlaGRyKSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJaWYgKCFlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZzaGRyLCBuYW1lLCBOVUxMKSkKLQkJCWJyZWFrOwotCi0JCW9mZnNldCA9IHNoZHIuc2hfb2Zmc2V0OwotCX0gd2hpbGUgKDApOwotCi0JZWxmX2VuZChlbGYpOwotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0cnVjdCB0YWJsZV9lbnRyeSB7Ci0JdTMyIHN0YXJ0X2lwX29mZnNldDsKLQl1MzIgZmRlX29mZnNldDsKLX07Ci0KLXN0cnVjdCBlaF9mcmFtZV9oZHIgewotCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKLQl1bnNpZ25lZCBjaGFyIGVoX2ZyYW1lX3B0cl9lbmM7Ci0JdW5zaWduZWQgY2hhciBmZGVfY291bnRfZW5jOwotCXVuc2lnbmVkIGNoYXIgdGFibGVfZW5jOwotCi0JLyoKLQkgKiBUaGUgcmVzdCBvZiB0aGUgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aCBhbmQgY29uc2lzdHMgb2YgdGhlCi0JICogZm9sbG93aW5nIG1lbWJlcnM6Ci0JICoKLQkgKgllbmNvZGVkX3QgZWhfZnJhbWVfcHRyOwotCSAqCWVuY29kZWRfdCBmZGVfY291bnQ7Ci0JICovCi0KLQkvKiBBIHNpbmdsZSBlbmNvZGVkIHBvaW50ZXIgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gOCBieXRlcy4gKi8KLQl1NjQgZW5jWzJdOwotCi0JLyoKLQkgKiBzdHJ1Y3QgewotCSAqICAgIGVuY29kZWRfdCBzdGFydF9pcDsKLQkgKiAgICBlbmNvZGVkX3QgZmRlX2FkZHI7Ci0JICogfSBiaW5hcnlfc2VhcmNoX3RhYmxlW2ZkZV9jb3VudF07Ci0JICovCi0JY2hhciBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotc3RhdGljIGludCB1bndpbmRfc3BlY19laGZyYW1lKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCi0JCQkgICAgICAgdTY0IG9mZnNldCwgdTY0ICp0YWJsZV9kYXRhLCB1NjQgKnNlZ2Jhc2UsCi0JCQkgICAgICAgdTY0ICpmZGVfY291bnQpCi17Ci0Jc3RydWN0IGVoX2ZyYW1lX2hkciBoZHI7Ci0JdTggKmVuYyA9ICh1OCAqKSAmaGRyLmVuYzsKLQl1OCAqZW5kID0gKHU4ICopICZoZHIuZGF0YTsKLQlzc2l6ZV90IHI7Ci0KLQlyID0gZHNvX19kYXRhX3JlYWRfb2Zmc2V0KGRzbywgbWFjaGluZSwgb2Zmc2V0LAotCQkJCSAgKHU4ICopICZoZHIsIHNpemVvZihoZHIpKTsKLQlpZiAociAhPSBzaXplb2YoaGRyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBXZSBkb250IG5lZWQgZWhfZnJhbWVfcHRyLCBqdXN0IHNraXAgaXQuICovCi0JZHdfcmVhZF9lbmNvZGVkX3ZhbHVlKGVuYywgZW5kLCBoZHIuZWhfZnJhbWVfcHRyX2VuYyk7Ci0KLQkqZmRlX2NvdW50ICA9IGR3X3JlYWRfZW5jb2RlZF92YWx1ZShlbmMsIGVuZCwgaGRyLmZkZV9jb3VudF9lbmMpOwotCSpzZWdiYXNlICAgID0gb2Zmc2V0OwotCSp0YWJsZV9kYXRhID0gKGVuYyAtICh1OCAqKSAmaGRyKSArIG9mZnNldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX3Vud2luZF9zcGVjX2VoX2ZyYW1lKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCi0JCQkJICAgICB1NjQgKnRhYmxlX2RhdGEsIHU2NCAqc2VnYmFzZSwKLQkJCQkgICAgIHU2NCAqZmRlX2NvdW50KQotewotCWludCByZXQgPSAtRUlOVkFMLCBmZDsKLQl1NjQgb2Zmc2V0OwotCi0JZmQgPSBkc29fX2RhdGFfZmQoZHNvLCBtYWNoaW5lKTsKLQlpZiAoZmQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIENoZWNrIHRoZSAuZWhfZnJhbWUgc2VjdGlvbiBmb3IgdW53aW5kaW5nIGluZm8gKi8KLQlvZmZzZXQgPSBlbGZfc2VjdGlvbl9vZmZzZXQoZmQsICIuZWhfZnJhbWVfaGRyIik7Ci0JY2xvc2UoZmQpOwotCi0JaWYgKG9mZnNldCkKLQkJcmV0ID0gdW53aW5kX3NwZWNfZWhmcmFtZShkc28sIG1hY2hpbmUsIG9mZnNldCwKLQkJCQkJICB0YWJsZV9kYXRhLCBzZWdiYXNlLAotCQkJCQkgIGZkZV9jb3VudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jaWZuZGVmIE5PX0xJQlVOV0lORF9ERUJVR19GUkFNRQotc3RhdGljIGludCByZWFkX3Vud2luZF9zcGVjX2RlYnVnX2ZyYW1lKHN0cnVjdCBkc28gKmRzbywKLQkJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHU2NCAqb2Zmc2V0KQotewotCWludCBmZCA9IGRzb19fZGF0YV9mZChkc28sIG1hY2hpbmUpOwotCi0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBDaGVjayB0aGUgLmRlYnVnX2ZyYW1lIHNlY3Rpb24gZm9yIHVud2luZGluZyBpbmZvICovCi0JKm9mZnNldCA9IGVsZl9zZWN0aW9uX29mZnNldChmZCwgIi5kZWJ1Z19mcmFtZSIpOwotCWNsb3NlKGZkKTsKLQotCWlmICgqb2Zmc2V0KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwICpmaW5kX21hcCh1bndfd29yZF90IGlwLCBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQotewotCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwotCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLCBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCi0JCQkgICAgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKLQlyZXR1cm4gYWwubWFwOwotfQotCi1zdGF0aWMgaW50Ci1maW5kX3Byb2NfaW5mbyh1bndfYWRkcl9zcGFjZV90IGFzLCB1bndfd29yZF90IGlwLCB1bndfcHJvY19pbmZvX3QgKnBpLAotCSAgICAgICBpbnQgbmVlZF91bndpbmRfaW5mbywgdm9pZCAqYXJnKQotewotCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7Ci0Jc3RydWN0IG1hcCAqbWFwOwotCXVud19keW5faW5mb190IGRpOwotCXU2NCB0YWJsZV9kYXRhLCBzZWdiYXNlLCBmZGVfY291bnQ7Ci0KLQltYXAgPSBmaW5kX21hcChpcCwgdWkpOwotCWlmICghbWFwIHx8ICFtYXAtPmRzbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcl9kZWJ1ZygidW53aW5kOiBmaW5kX3Byb2NfaW5mbyBkc28gJXNcbiIsIG1hcC0+ZHNvLT5uYW1lKTsKLQotCS8qIENoZWNrIHRoZSAuZWhfZnJhbWUgc2VjdGlvbiBmb3IgdW53aW5kaW5nIGluZm8gKi8KLQlpZiAoIXJlYWRfdW53aW5kX3NwZWNfZWhfZnJhbWUobWFwLT5kc28sIHVpLT5tYWNoaW5lLAotCQkJCSAgICAgICAmdGFibGVfZGF0YSwgJnNlZ2Jhc2UsICZmZGVfY291bnQpKSB7Ci0JCW1lbXNldCgmZGksIDAsIHNpemVvZihkaSkpOwotCQlkaS5mb3JtYXQgICA9IFVOV19JTkZPX0ZPUk1BVF9SRU1PVEVfVEFCTEU7Ci0JCWRpLnN0YXJ0X2lwID0gbWFwLT5zdGFydDsKLQkJZGkuZW5kX2lwICAgPSBtYXAtPmVuZDsKLQkJZGkudS5ydGkuc2VnYmFzZSAgICA9IG1hcC0+c3RhcnQgKyBzZWdiYXNlOwotCQlkaS51LnJ0aS50YWJsZV9kYXRhID0gbWFwLT5zdGFydCArIHRhYmxlX2RhdGE7Ci0JCWRpLnUucnRpLnRhYmxlX2xlbiAgPSBmZGVfY291bnQgKiBzaXplb2Yoc3RydWN0IHRhYmxlX2VudHJ5KQotCQkJCSAgICAgIC8gc2l6ZW9mKHVud193b3JkX3QpOwotCQlyZXR1cm4gZHdhcmZfc2VhcmNoX3Vud2luZF90YWJsZShhcywgaXAsICZkaSwgcGksCi0JCQkJCQkgbmVlZF91bndpbmRfaW5mbywgYXJnKTsKLQl9Ci0KLSNpZm5kZWYgTk9fTElCVU5XSU5EX0RFQlVHX0ZSQU1FCi0JLyogQ2hlY2sgdGhlIC5kZWJ1Z19mcmFtZSBzZWN0aW9uIGZvciB1bndpbmRpbmcgaW5mbyAqLwotCWlmICghcmVhZF91bndpbmRfc3BlY19kZWJ1Z19mcmFtZShtYXAtPmRzbywgdWktPm1hY2hpbmUsICZzZWdiYXNlKSkgewotCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKLQkJaWYgKGR3YXJmX2ZpbmRfZGVidWdfZnJhbWUoMCwgJmRpLCBpcCwgMCwgbWFwLT5kc28tPm5hbWUsCi0JCQkJCSAgIG1hcC0+c3RhcnQsIG1hcC0+ZW5kKSkKLQkJCXJldHVybiBkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlKGFzLCBpcCwgJmRpLCBwaSwKLQkJCQkJCQkgbmVlZF91bndpbmRfaW5mbywgYXJnKTsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGFjY2Vzc19mcHJlZyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkJdW53X3JlZ251bV90IF9fbWF5YmVfdW51c2VkIG51bSwKLQkJCXVud19mcHJlZ190IF9fbWF5YmVfdW51c2VkICp2YWwsCi0JCQlpbnQgX19tYXliZV91bnVzZWQgX193cml0ZSwKLQkJCXZvaWQgX19tYXliZV91bnVzZWQgKmFyZykKLXsKLQlwcl9lcnIoInVud2luZDogYWNjZXNzX2ZwcmVnIHVuc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLVVOV19FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2R5bl9pbmZvX2xpc3RfYWRkcih1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkJCSAgdW53X3dvcmRfdCBfX21heWJlX3VudXNlZCAqZGlsX2FkZHIsCi0JCQkJICB2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCi17Ci0JcmV0dXJuIC1VTldfRU5PSU5GTzsKLX0KLQotc3RhdGljIGludCByZXN1bWUodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKLQkJICB1bndfY3Vyc29yX3QgX19tYXliZV91bnVzZWQgKmN1LAotCQkgIHZvaWQgX19tYXliZV91bnVzZWQgKmFyZykKLXsKLQlwcl9lcnIoInVud2luZDogcmVzdW1lIHVuc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLVVOV19FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9wcm9jX25hbWUodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKLQkgICAgICB1bndfd29yZF90IF9fbWF5YmVfdW51c2VkIGFkZHIsCi0JCWNoYXIgX19tYXliZV91bnVzZWQgKmJ1ZnAsIHNpemVfdCBfX21heWJlX3VudXNlZCBidWZfbGVuLAotCQl1bndfd29yZF90IF9fbWF5YmVfdW51c2VkICpvZmZwLCB2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCi17Ci0JcHJfZXJyKCJ1bndpbmQ6IGdldF9wcm9jX25hbWUgdW5zdXBwb3J0ZWRcbiIpOwotCXJldHVybiAtVU5XX0VJTlZBTDsKLX0KLQotc3RhdGljIGludCBhY2Nlc3NfZHNvX21lbShzdHJ1Y3QgdW53aW5kX2luZm8gKnVpLCB1bndfd29yZF90IGFkZHIsCi0JCQkgIHVud193b3JkX3QgKmRhdGEpCi17Ci0Jc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7Ci0Jc3NpemVfdCBzaXplOwotCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLCBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCi0JCQkgICAgICBNQVBfX0ZVTkNUSU9OLCBhZGRyLCAmYWwpOwotCWlmICghYWwubWFwKSB7Ci0JCXByX2RlYnVnKCJ1bndpbmQ6IG5vIG1hcCBmb3IgJWx4XG4iLCAodW5zaWduZWQgbG9uZylhZGRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICghYWwubWFwLT5kc28pCi0JCXJldHVybiAtMTsKLQotCXNpemUgPSBkc29fX2RhdGFfcmVhZF9hZGRyKGFsLm1hcC0+ZHNvLCBhbC5tYXAsIHVpLT5tYWNoaW5lLAotCQkJCSAgIGFkZHIsICh1OCAqKSBkYXRhLCBzaXplb2YoKmRhdGEpKTsKLQotCXJldHVybiAhKHNpemUgPT0gc2l6ZW9mKCpkYXRhKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX3ZhbHVlKHVud193b3JkX3QgKnZhbHAsIHN0cnVjdCByZWdzX2R1bXAgKnJlZ3MsIGludCBpZCwKLQkJICAgICB1NjQgc2FtcGxlX3JlZ3MpCi17Ci0JaW50IGksIGlkeCA9IDA7Ci0KLQlpZiAoIShzYW1wbGVfcmVncyAmICgxIDw8IGlkKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IGlkOyBpKyspIHsKLQkJaWYgKHNhbXBsZV9yZWdzICYgKDEgPDwgaSkpCi0JCQlpZHgrKzsKLQl9Ci0KLQkqdmFscCA9IHJlZ3MtPnJlZ3NbaWR4XTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY2Nlc3NfbWVtKHVud19hZGRyX3NwYWNlX3QgX19tYXliZV91bnVzZWQgYXMsCi0JCSAgICAgIHVud193b3JkX3QgYWRkciwgdW53X3dvcmRfdCAqdmFscCwKLQkJICAgICAgaW50IF9fd3JpdGUsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOwotCXN0cnVjdCBzdGFja19kdW1wICpzdGFjayA9ICZ1aS0+c2FtcGxlLT51c2VyX3N0YWNrOwotCXVud193b3JkX3Qgc3RhcnQsIGVuZDsKLQlpbnQgb2Zmc2V0OwotCWludCByZXQ7Ci0KLQkvKiBEb24ndCBzdXBwb3J0IHdyaXRlLCBwcm9iYWJseSBub3QgbmVlZGVkLiAqLwotCWlmIChfX3dyaXRlIHx8ICFzdGFjayB8fCAhdWktPnNhbXBsZS0+dXNlcl9yZWdzLnJlZ3MpIHsKLQkJKnZhbHAgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSByZWdfdmFsdWUoJnN0YXJ0LCAmdWktPnNhbXBsZS0+dXNlcl9yZWdzLCBQRVJGX1JFR19TUCwKLQkJCXVpLT5zYW1wbGVfdXJlZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQllbmQgPSBzdGFydCArIHN0YWNrLT5zaXplOwotCi0JLyogQ2hlY2sgb3ZlcmZsb3cuICovCi0JaWYgKGFkZHIgKyBzaXplb2YodW53X3dvcmRfdCkgPCBhZGRyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhZGRyIDwgc3RhcnQgfHwgYWRkciArIHNpemVvZih1bndfd29yZF90KSA+PSBlbmQpIHsKLQkJcmV0ID0gYWNjZXNzX2Rzb19tZW0odWksIGFkZHIsIHZhbHApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9kZWJ1ZygidW53aW5kOiBhY2Nlc3NfbWVtICVwIG5vdCBpbnNpZGUgcmFuZ2UgJXAtJXBcbiIsCi0JCQkJKHZvaWQgKilhZGRyLCAodm9pZCAqKXN0YXJ0LCAodm9pZCAqKWVuZCk7Ci0JCQkqdmFscCA9IDA7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCW9mZnNldCA9IGFkZHIgLSBzdGFydDsKLQkqdmFscCAgPSAqKHVud193b3JkX3QgKikmc3RhY2stPmRhdGFbb2Zmc2V0XTsKLQlwcl9kZWJ1ZygidW53aW5kOiBhY2Nlc3NfbWVtIGFkZHIgJXAsIHZhbCAlbHgsIG9mZnNldCAlZFxuIiwKLQkJICh2b2lkICopYWRkciwgKHVuc2lnbmVkIGxvbmcpKnZhbHAsIG9mZnNldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNjZXNzX3JlZyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkgICAgICB1bndfcmVnbnVtX3QgcmVnbnVtLCB1bndfd29yZF90ICp2YWxwLAotCQkgICAgICBpbnQgX193cml0ZSwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7Ci0JaW50IGlkLCByZXQ7Ci0KLQkvKiBEb24ndCBzdXBwb3J0IHdyaXRlLCBJIHN1c3BlY3Qgd2UgZG9uJ3QgbmVlZCBpdC4gKi8KLQlpZiAoX193cml0ZSkgewotCQlwcl9lcnIoInVud2luZDogYWNjZXNzX3JlZyB3ICVkXG4iLCByZWdudW0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXVpLT5zYW1wbGUtPnVzZXJfcmVncy5yZWdzKSB7Ci0JCSp2YWxwID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWQgPSB1bndpbmRfX2FyY2hfcmVnX2lkKHJlZ251bSk7Ci0JaWYgKGlkIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSByZWdfdmFsdWUodmFscCwgJnVpLT5zYW1wbGUtPnVzZXJfcmVncywgaWQsIHVpLT5zYW1wbGVfdXJlZ3MpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJ1bndpbmQ6IGNhbid0IHJlYWQgcmVnICVkXG4iLCByZWdudW0pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByX2RlYnVnKCJ1bndpbmQ6IHJlZyAlZCwgdmFsICVseFxuIiwgcmVnbnVtLCAodW5zaWduZWQgbG9uZykqdmFscCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dF91bndpbmRfaW5mbyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkJICAgIHVud19wcm9jX2luZm9fdCAqcGkgX19tYXliZV91bnVzZWQsCi0JCQkgICAgdm9pZCAqYXJnIF9fbWF5YmVfdW51c2VkKQotewotCXByX2RlYnVnKCJ1bndpbmQ6IHB1dF91bndpbmRfaW5mbyBjYWxsZWRcbiIpOwotfQotCi1zdGF0aWMgaW50IGVudHJ5KHU2NCBpcCwgc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJIHVud2luZF9lbnRyeV9jYl90IGNiLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHVud2luZF9lbnRyeSBlOwotCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwotCi0JdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24odGhyZWFkLCBtYWNoaW5lLAotCQkJCSAgIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKLQkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKLQotCWUuaXAgPSBpcDsKLQllLm1hcCA9IGFsLm1hcDsKLQllLnN5bSA9IGFsLnN5bTsKLQotCXByX2RlYnVnKCJ1bndpbmQ6ICVzOmlwID0gMHglIiBQUkl4NjQgIiAoMHglIiBQUkl4NjQgIilcbiIsCi0JCSBhbC5zeW0gPyBhbC5zeW0tPm5hbWUgOiAiJyciLAotCQkgaXAsCi0JCSBhbC5tYXAgPyBhbC5tYXAtPm1hcF9pcChhbC5tYXAsIGlwKSA6ICh1NjQpIDApOwotCi0JcmV0dXJuIGNiKCZlLCBhcmcpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNwbGF5X2Vycm9yKGludCBlcnIpCi17Ci0Jc3dpdGNoIChlcnIpIHsKLQljYXNlIFVOV19FSU5WQUw6Ci0JCXByX2VycigidW53aW5kOiBPbmx5IHN1cHBvcnRzIGxvY2FsLlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX0VVTlNQRUM6Ci0JCXByX2VycigidW53aW5kOiBVbnNwZWNpZmllZCBlcnJvci5cbiIpOwotCQlicmVhazsKLQljYXNlIFVOV19FQkFEUkVHOgotCQlwcl9lcnIoInVud2luZDogUmVnaXN0ZXIgdW5hdmFpbGFibGUuXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdW53X2FjY2Vzc29yc190IGFjY2Vzc29ycyA9IHsKLQkuZmluZF9wcm9jX2luZm8JCT0gZmluZF9wcm9jX2luZm8sCi0JLnB1dF91bndpbmRfaW5mbwk9IHB1dF91bndpbmRfaW5mbywKLQkuZ2V0X2R5bl9pbmZvX2xpc3RfYWRkcgk9IGdldF9keW5faW5mb19saXN0X2FkZHIsCi0JLmFjY2Vzc19tZW0JCT0gYWNjZXNzX21lbSwKLQkuYWNjZXNzX3JlZwkJPSBhY2Nlc3NfcmVnLAotCS5hY2Nlc3NfZnByZWcJCT0gYWNjZXNzX2ZwcmVnLAotCS5yZXN1bWUJCQk9IHJlc3VtZSwKLQkuZ2V0X3Byb2NfbmFtZQkJPSBnZXRfcHJvY19uYW1lLAotfTsKLQotc3RhdGljIGludCBnZXRfZW50cmllcyhzdHJ1Y3QgdW53aW5kX2luZm8gKnVpLCB1bndpbmRfZW50cnlfY2JfdCBjYiwKLQkJICAgICAgIHZvaWQgKmFyZywgaW50IG1heF9zdGFjaykKLXsKLQl1bndfYWRkcl9zcGFjZV90IGFkZHJfc3BhY2U7Ci0JdW53X2N1cnNvcl90IGM7Ci0JaW50IHJldDsKLQotCWFkZHJfc3BhY2UgPSB1bndfY3JlYXRlX2FkZHJfc3BhY2UoJmFjY2Vzc29ycywgMCk7Ci0JaWYgKCFhZGRyX3NwYWNlKSB7Ci0JCXByX2VycigidW53aW5kOiBDYW4ndCBjcmVhdGUgdW53aW5kIGFkZHJlc3Mgc3BhY2UuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0ID0gdW53X2luaXRfcmVtb3RlKCZjLCBhZGRyX3NwYWNlLCB1aSk7Ci0JaWYgKHJldCkKLQkJZGlzcGxheV9lcnJvcihyZXQpOwotCi0Jd2hpbGUgKCFyZXQgJiYgKHVud19zdGVwKCZjKSA+IDApICYmIG1heF9zdGFjay0tKSB7Ci0JCXVud193b3JkX3QgaXA7Ci0KLQkJdW53X2dldF9yZWcoJmMsIFVOV19SRUdfSVAsICZpcCk7Ci0JCXJldCA9IGVudHJ5KGlwLCB1aS0+dGhyZWFkLCB1aS0+bWFjaGluZSwgY2IsIGFyZyk7Ci0JfQotCi0JdW53X2Rlc3Ryb3lfYWRkcl9zcGFjZShhZGRyX3NwYWNlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAotCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKLQkJCXU2NCBzYW1wbGVfdXJlZ3MsIHN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSwKLQkJCWludCBtYXhfc3RhY2spCi17Ci0JdW53X3dvcmRfdCBpcDsKLQlzdHJ1Y3QgdW53aW5kX2luZm8gdWkgPSB7Ci0JCS5zYW1wbGUgICAgICAgPSBkYXRhLAotCQkuc2FtcGxlX3VyZWdzID0gc2FtcGxlX3VyZWdzLAotCQkudGhyZWFkICAgICAgID0gdGhyZWFkLAotCQkubWFjaGluZSAgICAgID0gbWFjaGluZSwKLQl9OwotCWludCByZXQ7Ci0KLQlpZiAoIWRhdGEtPnVzZXJfcmVncy5yZWdzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHJlZ192YWx1ZSgmaXAsICZkYXRhLT51c2VyX3JlZ3MsIFBFUkZfUkVHX0lQLCBzYW1wbGVfdXJlZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBlbnRyeShpcCwgdGhyZWFkLCBtYWNoaW5lLCBjYiwgYXJnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiBnZXRfZW50cmllcygmdWksIGNiLCBhcmcsIG1heF9zdGFjayk7Ci19CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdW53aW5kLmggYi90b29scy9wZXJmL3V0aWwvdW53aW5kLmgKaW5kZXggZDU5NjZmNDkuLmIwMzEzMTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQuaAorKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLmgKQEAgLTEzLDI0ICsxMywyNSBAQAogCiB0eXBlZGVmIGludCAoKnVud2luZF9lbnRyeV9jYl90KShzdHJ1Y3QgdW53aW5kX2VudHJ5ICplbnRyeSwgdm9pZCAqYXJnKTsKIAotI2lmZGVmIEhBVkVfTElCVU5XSU5EX1NVUFBPUlQKKyNpZmRlZiBIQVZFX0RXQVJGX1VOV0lORF9TVVBQT1JUCiBpbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAogCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQl1NjQgc2FtcGxlX3VyZWdzLAogCQkJc3RydWN0IHBlcmZfc2FtcGxlICpkYXRhLCBpbnQgbWF4X3N0YWNrKTsKLWludCB1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pOworLyogbGlidW53aW5kIHNwZWNpZmljICovCisjaWZkZWYgSEFWRV9MSUJVTldJTkRfU1VQUE9SVAoraW50IGxpYnVud2luZF9fYXJjaF9yZWdfaWQoaW50IHJlZ251bSk7CisjZW5kaWYKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludAogdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiBfX21heWJlX3VudXNlZCwKIAkJICAgIHZvaWQgKmFyZyBfX21heWJlX3VudXNlZCwKIAkJICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lIF9fbWF5YmVfdW51c2VkLAogCQkgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkIF9fbWF5YmVfdW51c2VkLAotCQkgICAgdTY0IHNhbXBsZV91cmVncyBfX21heWJlX3VudXNlZCwKIAkJICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSBfX21heWJlX3VudXNlZCwKIAkJICAgIGludCBtYXhfc3RhY2sgX19tYXliZV91bnVzZWQpCiB7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogSEFWRV9MSUJVTldJTkRfU1VQUE9SVCAqLworI2VuZGlmIC8qIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQgKi8KICNlbmRpZiAvKiBfX1VOV0lORF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdXRpbC5jIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuYwppbmRleCA0MmFkNjY3Li45ZjY2NTQ5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdXRpbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMKQEAgLTEsNiArMSw2IEBACiAjaW5jbHVkZSAiLi4vcGVyZi5oIgogI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlICJmcy5oIgorI2luY2x1ZGUgPGFwaS9mcy9mcy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaWZkZWYgSEFWRV9CQUNLVFJBQ0VfU1VQUE9SVAogI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBiZDI0YWU1Li4zMTYxOTRmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIAogZXhwb3J0IENDIENGTEFHUwogCi1UQVJHRVRTID0gcG11CitUQVJHRVRTID0gcG11IGNvcHlsb29wcwogCiBlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMmQzYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9NYWtlZmlsZQpAQCAtMCwwICsxLDI5IEBACisjIFRoZSBsb29wcyBhcmUgYWxsIDY0LWJpdCBjb2RlCitDRkxBR1MgKz0gLW02NAorQ0ZMQUdTICs9IC1JJChDVVJESVIpCitDRkxBR1MgKz0gLUQgU0VMRlRFU1QKKworIyBVc2Ugb3VyIENGTEFHUyBmb3IgdGhlIGltcGxpY2l0IC5TIHJ1bGUKK0FTRkxBR1MgPSAkKENGTEFHUykKKworUFJPR1MgOj0gY29weXVzZXJfNjQgY29weXVzZXJfcG93ZXI3IG1lbWNweV82NCBtZW1jcHlfcG93ZXI3CitFWFRSQV9TT1VSQ0VTIDo9IHZhbGlkYXRlLmMgLi4vaGFybmVzcy5jCisKK2FsbDogJChQUk9HUykKKworY29weXVzZXJfNjQ6ICAgICBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9fX2NvcHlfdG9mcm9tX3VzZXJfYmFzZQorY29weXVzZXJfcG93ZXI3OiBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9fX2NvcHlfdG9mcm9tX3VzZXJfcG93ZXI3CittZW1jcHlfNjQ6ICAgICAgIENQUEZMQUdTICs9IC1EIENPUFlfTE9PUD10ZXN0X21lbWNweQorbWVtY3B5X3Bvd2VyNzogICBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9tZW1jcHlfcG93ZXI3CisKKyQoUFJPR1MpOiAkKEVYVFJBX1NPVVJDRVMpCisKK3J1bl90ZXN0czogYWxsCisJQC1mb3IgUFJPRyBpbiAkKFBST0dTKTsgZG8gXAorCQkuLyQkUFJPRzsgXAorCWRvbmU7CisKK2NsZWFuOgorCXJtIC1mICQoUFJPR1MpICoubworCisuUEhPTlk6IGFsbCBydW5fdGVzdHMgY2xlYW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2FzbS9wcGNfYXNtLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHBjX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDljODQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHBjX2FzbS5oCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlIDxwcGMtYXNtLmg+CisKKyNkZWZpbmUgQ09ORklHX0FMVElWRUMKKworI2RlZmluZSByMQkxCisKKyNkZWZpbmUgdnIwICAgICAwCisjZGVmaW5lIHZyMSAgICAgMQorI2RlZmluZSB2cjIgICAgIDIKKyNkZWZpbmUgdnIzICAgICAzCisjZGVmaW5lIHZyNCAgICAgNAorI2RlZmluZSB2cjUgICAgIDUKKyNkZWZpbmUgdnI2ICAgICA2CisjZGVmaW5lIHZyNyAgICAgNworI2RlZmluZSB2cjggICAgIDgKKyNkZWZpbmUgdnI5ICAgICA5CisjZGVmaW5lIHZyMTAgICAgMTAKKyNkZWZpbmUgdnIxMSAgICAxMQorI2RlZmluZSB2cjEyICAgIDEyCisjZGVmaW5lIHZyMTMgICAgMTMKKyNkZWZpbmUgdnIxNCAgICAxNAorI2RlZmluZSB2cjE1ICAgIDE1CisjZGVmaW5lIHZyMTYgICAgMTYKKyNkZWZpbmUgdnIxNyAgICAxNworI2RlZmluZSB2cjE4ICAgIDE4CisjZGVmaW5lIHZyMTkgICAgMTkKKyNkZWZpbmUgdnIyMCAgICAyMAorI2RlZmluZSB2cjIxICAgIDIxCisjZGVmaW5lIHZyMjIgICAgMjIKKyNkZWZpbmUgdnIyMyAgICAyMworI2RlZmluZSB2cjI0ICAgIDI0CisjZGVmaW5lIHZyMjUgICAgMjUKKyNkZWZpbmUgdnIyNiAgICAyNgorI2RlZmluZSB2cjI3ICAgIDI3CisjZGVmaW5lIHZyMjggICAgMjgKKyNkZWZpbmUgdnIyOSAgICAyOQorI2RlZmluZSB2cjMwICAgIDMwCisjZGVmaW5lIHZyMzEgICAgMzEKKworI2RlZmluZSBSMTQgcjE0CisjZGVmaW5lIFIxNSByMTUKKyNkZWZpbmUgUjE2IHIxNgorI2RlZmluZSBSMTcgcjE3CisjZGVmaW5lIFIxOCByMTgKKyNkZWZpbmUgUjE5IHIxOQorI2RlZmluZSBSMjAgcjIwCisjZGVmaW5lIFIyMSByMjEKKyNkZWZpbmUgUjIyIHIyMgorCisjZGVmaW5lIFNUQUNLRlJBTUVTSVpFCTI1NgorI2RlZmluZSBTVEtfUEFSQU0oaSkJKDQ4ICsgKChpKS0zKSo4KQorI2RlZmluZSBTVEtfUkVHKGkpCSgxMTIgKyAoKGkpLTE0KSo4KQorCisjZGVmaW5lIF9HTE9CQUwoQSkgRlVOQ19TVEFSVCh0ZXN0XyAjIyBBKQorCisjZGVmaW5lIFBQQ19NVE9DUkYoQSwgQikJbXRvY3JmIEEsIEIKKworRlVOQ19TVEFSVChlbnRlcl92bXhfdXNlcmNvcHkpCisJbGkJcjMsMQorCWJscgorCitGVU5DX1NUQVJUKGV4aXRfdm14X3VzZXJjb3B5KQorCWxpCXIzLDAKKwlibHIKKworRlVOQ19TVEFSVChlbnRlcl92bXhfY29weSkKKwlsaQlyMywxCisJYmxyCisKK0ZVTkNfU1RBUlQoZXhpdF92bXhfY29weSkKKwlibHIKKworRlVOQ19TVEFSVChtZW1jcHlfcG93ZXI3KQorCWJscgorCitGVU5DX1NUQVJUKF9fY29weV90b2Zyb21fdXNlcl9wb3dlcjcpCisJYmxyCisKK0ZVTkNfU1RBUlQoX19jb3B5X3RvZnJvbV91c2VyX2Jhc2UpCisJYmxyCisKKyNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT04KKyNkZWZpbmUgRlRSX1NFQ1RJT05fRUxTRQorI2RlZmluZSBBTFRfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKHgpCisjZGVmaW5lIEFMVF9GVFJfU0VDVElPTl9FTkQoeCwgeSkKKyNkZWZpbmUgRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKHgpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHJvY2Vzc29yLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2FzbS9wcm9jZXNzb3IuaApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvY29weXVzZXJfNjQuUyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2NvcHl1c2VyXzY0LlMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjFjNDE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2NvcHl1c2VyXzY0LlMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl82NC5TClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvY29weXVzZXJfcG93ZXI3LlMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9jb3B5dXNlcl9wb3dlcjcuUwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40Nzg2ODk1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvY29weXVzZXJfcG93ZXI3LlMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl9wb3dlcjcuUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL21lbWNweV82NC5TIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvbWVtY3B5XzY0LlMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2NlMzNmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL21lbWNweV82NC5TCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9tZW1jcHlfcG93ZXI3LlMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9tZW1jcHlfcG93ZXI3LlMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGQ2ZmJmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL21lbWNweV9wb3dlcjcuUwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi9hcmNoL3Bvd2VycGMvbGliL21lbWNweV9wb3dlcjcuUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL3ZhbGlkYXRlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy92YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTBmZjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy92YWxpZGF0ZS5jCkBAIC0wLDAgKzEsOTkgQEAKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICIuLi91dGlscy5oIgorCisjZGVmaW5lIE1BWF9MRU4gODE5MgorI2RlZmluZSBNQVhfT0ZGU0VUIDE2CisjZGVmaW5lIE1JTl9SRURaT05FIDEyOAorI2RlZmluZSBCVUZMRU4gKE1BWF9MRU4rTUFYX09GRlNFVCsyKk1JTl9SRURaT05FKQorI2RlZmluZSBQT0lTT04gMHhhNQorCit1bnNpZ25lZCBsb25nIENPUFlfTE9PUCh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworc3RhdGljIHZvaWQgZG9fb25lKGNoYXIgKnNyYywgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nIHNyY19vZmYsCisJCSAgIHVuc2lnbmVkIGxvbmcgZHN0X29mZiwgdW5zaWduZWQgbG9uZyBsZW4sIHZvaWQgKnJlZHpvbmUsCisJCSAgIHZvaWQgKmZpbGwpCit7CisJY2hhciAqc3JjcCwgKmRzdHA7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgbG9uZyBpOworCisJc3JjcCA9IHNyYyArIE1JTl9SRURaT05FICsgc3JjX29mZjsKKwlkc3RwID0gZHN0ICsgTUlOX1JFRFpPTkUgKyBkc3Rfb2ZmOworCisJbWVtc2V0KHNyYywgUE9JU09OLCBCVUZMRU4pOworCW1lbXNldChkc3QsIFBPSVNPTiwgQlVGTEVOKTsKKwltZW1jcHkoc3JjcCwgZmlsbCwgbGVuKTsKKworCXJldCA9IENPUFlfTE9PUChkc3RwLCBzcmNwLCBsZW4pOworCWlmIChyZXQgJiYgcmV0ICE9ICh1bnNpZ25lZCBsb25nKWRzdHApIHsKKwkJcHJpbnRmKCIoJXAsJXAsJWxkKSByZXR1cm5lZCAlbGRcbiIsIGRzdHAsIHNyY3AsIGxlbiwgcmV0KTsKKwkJYWJvcnQoKTsKKwl9CisKKwlpZiAobWVtY21wKGRzdHAsIHNyY3AsIGxlbikpIHsKKwkJcHJpbnRmKCIoJXAsJXAsJWxkKSBtaXNjb21wYXJlXG4iLCBkc3RwLCBzcmNwLCBsZW4pOworCQlwcmludGYoInNyYzogIik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXByaW50ZigiJTAyeCAiLCBzcmNwW2ldKTsKKwkJcHJpbnRmKCJcbmRzdDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXByaW50ZigiJTAyeCAiLCBkc3RwW2ldKTsKKwkJcHJpbnRmKCJcbiIpOworCQlhYm9ydCgpOworCX0KKworCWlmIChtZW1jbXAoZHN0LCByZWR6b25lLCBkc3RwIC0gZHN0KSkgeworCQlwcmludGYoIiglcCwlcCwlbGQpIHJlZHpvbmUgYmVmb3JlIGNvcnJ1cHRlZFxuIiwKKwkJICAgICAgIGRzdHAsIHNyY3AsIGxlbik7CisJCWFib3J0KCk7CisJfQorCisJaWYgKG1lbWNtcChkc3RwK2xlbiwgcmVkem9uZSwgZHN0K0JVRkxFTi0oZHN0cCtsZW4pKSkgeworCQlwcmludGYoIiglcCwlcCwlbGQpIHJlZHpvbmUgYWZ0ZXIgY29ycnVwdGVkXG4iLAorCQkgICAgICAgZHN0cCwgc3JjcCwgbGVuKTsKKwkJYWJvcnQoKTsKKwl9Cit9CisKK2ludCB0ZXN0X2NvcHlfbG9vcCh2b2lkKQoreworCWNoYXIgKnNyYywgKmRzdCwgKnJlZHpvbmUsICpmaWxsOworCXVuc2lnbmVkIGxvbmcgbGVuLCBzcmNfb2ZmLCBkc3Rfb2ZmOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXNyYyA9IG1lbWFsaWduKEJVRkxFTiwgQlVGTEVOKTsKKwlkc3QgPSBtZW1hbGlnbihCVUZMRU4sIEJVRkxFTik7CisJcmVkem9uZSA9IG1hbGxvYyhCVUZMRU4pOworCWZpbGwgPSBtYWxsb2MoQlVGTEVOKTsKKworCWlmICghc3JjIHx8ICFkc3QgfHwgIXJlZHpvbmUgfHwgIWZpbGwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwltZW1zZXQocmVkem9uZSwgUE9JU09OLCBCVUZMRU4pOworCisJLyogRmlsbCB3aXRoIHNlcXVlbnRpYWwgYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlVGTEVOOyBpKyspCisJCWZpbGxbaV0gPSBpICYgMHhmZjsKKworCWZvciAobGVuID0gMTsgbGVuIDwgTUFYX0xFTjsgbGVuKyspIHsKKwkJZm9yIChzcmNfb2ZmID0gMDsgc3JjX29mZiA8IE1BWF9PRkZTRVQ7IHNyY19vZmYrKykgeworCQkJZm9yIChkc3Rfb2ZmID0gMDsgZHN0X29mZiA8IE1BWF9PRkZTRVQ7IGRzdF9vZmYrKykgeworCQkJCWRvX29uZShzcmMsIGRzdCwgc3JjX29mZiwgZHN0X29mZiwgbGVuLAorCQkJCSAgICAgICByZWR6b25lLCBmaWxsKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3ModGVzdF9jb3B5X2xvb3AsIHN0cihDT1BZX0xPT1ApKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaAppbmRleCA1ODUxYzRiLi4wZGUwNjQ0IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3V0aWxzLmgKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy91dGlscy5oCkBAIC0zMSw0ICszMSw3IEBACiAJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIF9zdHIocykgI3MKKyNkZWZpbmUgc3RyKHMpIF9zdHIocykKKwogI2VuZGlmIC8qIF9TRUxGVEVTVFNfUE9XRVJQQ19VVElMU19IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9mdW5jdGlvbnMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9mdW5jdGlvbnMuc2gKaW5kZXggNTg3NTYxZC4uOWIxN2U4MSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4vZnVuY3Rpb25zLnNoCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2Z1bmN0aW9ucy5zaApAQCAtOTYsNiArOTYsNyBAQAogCQllY2hvIHFlbXUtc3lzdGVtLXBwYzY0CiAJZWxzZQogCQllY2hvIENhbm5vdCBmaWd1cmUgb3V0IHdoYXQgcWVtdSBjb21tYW5kIHRvIHVzZSEgMT4mMgorCQllY2hvIGZpbGUgJDEgb3V0cHV0OiAkdQogCQkjIFVzdWFsbHkgdGhpcyB3aWxsIGJlIG9uZSBvZiAvdXNyL2Jpbi9xZW11LXN5c3RlbS0qCiAJCSMgVXNlIFJDVV9RRU1VX0NNRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhcHByb3ByaWF0ZQogCQkjIGFyZ3VtZW50IHRvIHRvcC1sZXZlbCBzY3JpcHQuCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1sb2NrLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXJlY2hlY2stbG9jay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjkxODZlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXJlY2hlY2stbG9jay5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vYmFzaAorIworIyBBbmFseXplIGEgZ2l2ZW4gcmVzdWx0cyBkaXJlY3RvcnkgZm9yIGxvY2t0b3J0dXJlIHByb2dyZXNzLgorIworIyBVc2FnZTogc2gga3ZtLXJlY2hlY2stbG9jay5zaCByZXNkaXIKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisjIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisjCisjIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDE0CisjCisjIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorCitpPSIkMSIKK2lmIHRlc3QgLWQgJGkKK3RoZW4KKwk6CitlbHNlCisJZWNobyBVbnJlYWRhYmxlIHJlc3VsdHMgZGlyZWN0b3J5OiAkaQorCWV4aXQgMQorZmkKKworY29uZmlnZmlsZT1gZWNobyAkaSB8IHNlZCAtZSAncy9eLipcLy8vJ2AKK25jcz1gZ3JlcCAiV3JpdGVzOiAgVG90YWw6IiAkaS9jb25zb2xlLmxvZyAyPiAvZGV2L251bGwgfCB0YWlsIC0xIHwgc2VkIC1lICdzL14uKiBUb3RhbDogLy8nIC1lICdzLyAuKiQvLydgCitpZiB0ZXN0IC16ICIkbmNzIgordGhlbgorCWVjaG8gJGNvbmZpZ2ZpbGUKK2Vsc2UKKwl0aXRsZT0iJGNvbmZpZ2ZpbGUgLS0tLS0tLSAkbmNzIGFjcXVpc2l0aW9ucy9yZWxlYXNlcyIKKwlkdXI9YHNlZCAtZSAncy9eLiogbG9ja3RvcnR1cmUuc2h1dGRvd25fc2Vjcz0vLycgLWUgJ3MvIC4qJC8vJyA8ICRpL3FlbXUtY21kIDI+IC9kZXYvbnVsbGAKKwlpZiB0ZXN0IC16ICIkZHVyIgorCXRoZW4KKwkJOgorCWVsc2UKKwkJbmNzcHM9YGF3ayAtdiBuY3M9JG5jcyAtdiBkdXI9JGR1ciAnCisJCQlCRUdJTiB7IHByaW50IG5jcyAvIGR1ciB9JyA8IC9kZXYvbnVsbGAKKwkJdGl0bGU9IiR0aXRsZSAoJG5jc3BzIHBlciBzZWNvbmQpIgorCWZpCisJZWNobyAkdGl0bGUKK2ZpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1yY3Uuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1yY3Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDc1YjFkYzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1yY3Uuc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQW5hbHl6ZSBhIGdpdmVuIHJlc3VsdHMgZGlyZWN0b3J5IGZvciByY3V0b3J0dXJlIHByb2dyZXNzLgorIworIyBVc2FnZTogc2gga3ZtLXJlY2hlY2stcmN1LnNoIHJlc2RpcgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyMKKyMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTQKKyMKKyMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisKK2k9IiQxIgoraWYgdGVzdCAtZCAkaQordGhlbgorCToKK2Vsc2UKKwllY2hvIFVucmVhZGFibGUgcmVzdWx0cyBkaXJlY3Rvcnk6ICRpCisJZXhpdCAxCitmaQorCitjb25maWdmaWxlPWBlY2hvICRpIHwgc2VkIC1lICdzL14uKlwvLy8nYAorbmdwcz1gZ3JlcCB2ZXI6ICRpL2NvbnNvbGUubG9nIDI+IC9kZXYvbnVsbCB8IHRhaWwgLTEgfCBzZWQgLWUgJ3MvXi4qIHZlcjogLy8nIC1lICdzLyAuKiQvLydgCitpZiB0ZXN0IC16ICIkbmdwcyIKK3RoZW4KKwllY2hvICRjb25maWdmaWxlCitlbHNlCisJdGl0bGU9IiRjb25maWdmaWxlIC0tLS0tLS0gJG5ncHMgZ3JhY2UgcGVyaW9kcyIKKwlkdXI9YHNlZCAtZSAncy9eLiogcmN1dG9ydHVyZS5zaHV0ZG93bl9zZWNzPS8vJyAtZSAncy8gLiokLy8nIDwgJGkvcWVtdS1jbWQgMj4gL2Rldi9udWxsYAorCWlmIHRlc3QgLXogIiRkdXIiCisJdGhlbgorCQk6CisJZWxzZQorCQluZ3BzcHM9YGF3ayAtdiBuZ3BzPSRuZ3BzIC12IGR1cj0kZHVyICcKKwkJCUJFR0lOIHsgcHJpbnQgbmdwcyAvIGR1ciB9JyA8IC9kZXYvbnVsbGAKKwkJdGl0bGU9IiR0aXRsZSAoJG5ncHNwcyBwZXIgc2Vjb25kKSIKKwlmaQorCWVjaG8gJHRpdGxlCitmaQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXJlY2hlY2suc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay5zaAppbmRleCBiYWVmMDlmLi5hNDRkYWFhIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay5zaAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay5zaApAQCAtMSw2ICsxLDYgQEAKICMhL2Jpbi9iYXNoCiAjCi0jIEdpdmVuIHRoZSByZXN1bHRzIGRpcmVjdG9yaWVzIGZvciBwcmV2aW91cyBLVk0gcnVucyBvZiByY3V0b3J0dXJlLAorIyBHaXZlbiB0aGUgcmVzdWx0cyBkaXJlY3RvcmllcyBmb3IgcHJldmlvdXMgS1ZNLWJhc2VkIHRvcnR1cmUgcnVucywKICMgY2hlY2sgdGhlIGJ1aWxkIGFuZCBjb25zb2xlIG91dHB1dCBmb3IgZXJyb3JzLiAgR2l2ZW4gYSBkaXJlY3RvcnkKICMgY29udGFpbmluZyByZXN1bHRzIGRpcmVjdG9yaWVzLCB0aGlzIHJlY3Vyc2l2ZWx5IGNoZWNrcyB0aGVtIGFsbC4KICMKQEAgLTI3LDExICsyNywxOCBAQAogUEFUSD1gcHdkYC90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2JpbjokUEFUSDsgZXhwb3J0IFBBVEgKIGZvciByZCBpbiAiJEAiCiBkbworCWZpcnN0dGltZT0xCiAJZGlycz1gZmluZCAkcmQgLW5hbWUgTWFrZS5kZWZjb25maWcub3V0IC1wcmludCB8IHNvcnQgfCBzZWQgLWUgJ3MsL1teL10qJCwsJyB8IHNvcnQgLXVgCiAJZm9yIGkgaW4gJGRpcnMKIAlkbwotCQljb25maWdmaWxlPWBlY2hvICRpIHwgc2VkIC1lICdzL14uKlwvLy8nYAotCQllY2hvICRjb25maWdmaWxlCisJCWlmIHRlc3QgLW4gIiRmaXJzdHRpbWUiCisJCXRoZW4KKwkJCWZpcnN0dGltZT0iIgorCQkJcmVzZGlyPWBlY2hvICRpIHwgc2VkIC1lICdzLC8kLCwnIC1lICdzLC9bXi9dKiQsLCdgCisJCQloZWFkIC0xICRyZXNkaXIvbG9nCisJCWZpCisJCVRPUlRVUkVfU1VJVEU9ImBjYXQgJGkvLi4vVE9SVFVSRV9TVUlURWAiCisJCWt2bS1yZWNoZWNrLSR7VE9SVFVSRV9TVUlURX0uc2ggJGkKIAkJY29uZmlnY2hlY2suc2ggJGkvLmNvbmZpZyAkaS9Db25maWdGcmFnbWVudAogCQlwYXJzZS1idWlsZC5zaCAkaS9NYWtlLm91dCAkY29uZmlnZmlsZQogCQlwYXJzZS1yY3V0b3J0dXJlLnNoICRpL2NvbnNvbGUubG9nICRjb25maWdmaWxlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tdGVzdC0xLXJjdS5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS10ZXN0LTEtcmN1LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTFiMjM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS10ZXN0LTEtcmN1LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIFJ1biBhIGt2bS1iYXNlZCB0ZXN0IG9mIHRoZSBzcGVjaWZpZWQgdHJlZSBvbiB0aGUgc3BlY2lmaWVkIGNvbmZpZ3MuCi0jIEZ1bGx5IGF1dG9tYXRlZCBydW4gYW5kIGVycm9yIGNoZWNraW5nLCBubyBncmFwaGljcyBjb25zb2xlLgotIwotIyBFeGVjdXRlIHRoaXMgaW4gdGhlIHNvdXJjZSB0cmVlLiAgRG8gbm90IHJ1biBpdCBhcyBhIGJhY2tncm91bmQgdGFzawotIyBiZWNhdXNlIHFlbXUgZG9lcyBub3Qgc2VlbSB0byBsaWtlIHRoYXQgbXVjaC4KLSMKLSMgVXNhZ2U6IHNoIGt2bS10ZXN0LTEtcmN1LnNoIGNvbmZpZyBidWlsZGRpciByZXNkaXIgbWludXRlcyBxZW11LWFyZ3MgYm9vdGFyZ3MKLSMKLSMgcWVtdS1hcmdzIGRlZmF1bHRzIHRvICIiIC0tIHlvdSB3aWxsIHdhbnQgIi1ub2dyYXBoaWMiIGlmIHJ1bm5pbmcgaGVhZGxlc3MuCi0jIGJvb3RhcmdzIGRlZmF1bHRzIHRvCSJyb290PS9kZXYvc2RhIG5vYXBpYyBzZWxpbnV4PTAgY29uc29sZT10dHlTMCIKLSMJCQkiaW5pdGNhbGxfZGVidWcgZGVidWcgcmN1dG9ydHVyZS5zdGF0X2ludGVydmFsPTE1IgotIwkJCSJyY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JCgobWludXRlcyAqIDYwKSkiCi0jCQkJInJjdXRvcnR1cmUucmN1dG9ydHVyZV9ydW5uYWJsZT0xIgotIwotIyBBbnl0aGluZyB5b3Ugc3BlY2lmeSBmb3IgZWl0aGVyIHFlbXUtYXJncyBvciBib290YXJncyBpcyBhcHBlbmRlZCB0bwotIyB0aGUgZGVmYXVsdCB2YWx1ZXMuICBUaGUgIi1zbXAiIHZhbHVlIGlzIGRlZHVjZWQgZnJvbSB0aGUgY29udGVudHMgb2YKLSMgdGhlIGNvbmZpZyBmcmFnbWVudC4KLSMKLSMgTW9yZSBzb3BoaXN0aWNhdGVkIGFyZ3VtZW50IHBhcnNpbmcgaXMgY2xlYXJseSBuZWVkZWQuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAotIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgotIwotIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMQotIwotIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotZ3JhY2U9MTIwCi0KLVQ9L3RtcC9rdm0tdGVzdC0xLXJjdS5zaC4kJAotdHJhcCAncm0gLXJmICRUJyAwCi0KLS4gJEtWTS9iaW4vZnVuY3Rpb25zLnNoCi0uICRLVlBBVEgvdmVyX2Z1bmN0aW9ucy5zaAotCi1jb25maWdfdGVtcGxhdGU9JHsxfQotdGl0bGU9YGVjaG8gJGNvbmZpZ190ZW1wbGF0ZSB8IHNlZCAtZSAncy9eLipcLy8vJ2AKLWJ1aWxkZGlyPSR7Mn0KLWlmIHRlc3QgLXogIiRidWlsZGRpciIgLW8gISAtZCAiJGJ1aWxkZGlyIiAtbyAhIC13ICIkYnVpbGRkaXIiCi10aGVuCi0JZWNobyAia3ZtLXRlc3QtMS1yY3Uuc2ggOiRidWlsZGRpcjogTm90IGEgd3JpdGFibGUgZGlyZWN0b3J5LCBjYW5ub3QgYnVpbGQgaW50byBpdCIKLQlleGl0IDEKLWZpCi1yZXNkaXI9JHszfQotaWYgdGVzdCAteiAiJHJlc2RpciIgLW8gISAtZCAiJHJlc2RpciIgLW8gISAtdyAiJHJlc2RpciIKLXRoZW4KLQllY2hvICJrdm0tdGVzdC0xLXJjdS5zaCA6JHJlc2RpcjogTm90IGEgd3JpdGFibGUgZGlyZWN0b3J5LCBjYW5ub3QgYnVpbGQgaW50byBpdCIKLQlleGl0IDEKLWZpCi1jcCAkY29uZmlnX3RlbXBsYXRlICRyZXNkaXIvQ29uZmlnRnJhZ21lbnQKLWVjaG8gJyAtLS0nIGBkYXRlYDogU3RhcnRpbmcgYnVpbGQKLWVjaG8gJyAtLS0nIEtjb25maWcgZnJhZ21lbnQgYXQ6ICRjb25maWdfdGVtcGxhdGUgPj4gJHJlc2Rpci9sb2cKLWNhdCA8PCAnX19fRU9GX19fJyA+PiAkVAotQ09ORklHX1JDVV9UT1JUVVJFX1RFU1Q9eQotX19fRU9GX19fCi0jIE9wdGltaXphdGlvbnMgYmVsb3cgdGhpcyBwb2ludAotIyBDT05GSUdfVVNCPW4KLSMgQ09ORklHX1NFQ1VSSVRZPW4KLSMgQ09ORklHX05GU19GUz1uCi0jIENPTkZJR19TT1VORD1uCi0jIENPTkZJR19JTlBVVF9KT1lTVElDSz1uCi0jIENPTkZJR19JTlBVVF9UQUJMRVQ9bgotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49bgotIyBDT05GSUdfSU5QVVRfTUlTQz1uCi0jIENPTkZJR19JTlBVVF9NT1VTRT1uCi0jICMgQ09ORklHX05FVD1uICMgZGlzYWJsZXMgY29uc29sZSBhY2Nlc3MsIHNvIGFjY2VwdCB0aGUgc2xvd2VyIGJ1aWxkLgotIyBDT05GSUdfU0NTST1uCi0jIENPTkZJR19BVEE9bgotIyBDT05GSUdfRkFUX0ZTPW4KLSMgQ09ORklHX01TRE9TX0ZTPW4KLSMgQ09ORklHX1ZGQVRfRlM9bgotIyBDT05GSUdfSVNPOTY2MF9GUz1uCi0jIENPTkZJR19RVU9UQT1uCi0jIENPTkZJR19ISUQ9bgotIyBDT05GSUdfQ1JZUFRPPW4KLSMgQ09ORklHX1BDQ0FSRD1uCi0jIENPTkZJR19QQ01DSUE9bgotIyBDT05GSUdfQ0FSREJVUz1uCi0jIENPTkZJR19ZRU5UQT1uCi1pZiBrdm0tYnVpbGQuc2ggJGNvbmZpZ190ZW1wbGF0ZSAkYnVpbGRkaXIgJFQKLXRoZW4KLQljcCAkYnVpbGRkaXIvTWFrZSoub3V0ICRyZXNkaXIKLQljcCAkYnVpbGRkaXIvLmNvbmZpZyAkcmVzZGlyCi0JY3AgJGJ1aWxkZGlyL2FyY2gveDg2L2Jvb3QvYnpJbWFnZSAkcmVzZGlyCi0JcGFyc2UtYnVpbGQuc2ggJHJlc2Rpci9NYWtlLm91dCAkdGl0bGUKLWVsc2UKLQljcCAkYnVpbGRkaXIvTWFrZSoub3V0ICRyZXNkaXIKLQllY2hvIEJ1aWxkIGZhaWxlZCwgbm90IHJ1bm5pbmcgS1ZNLCBzZWUgJHJlc2Rpci4KLQlleGl0IDEKLWZpCi1taW51dGVzPSQ0Ci1zZWNvbmRzPSQoKCRtaW51dGVzICogNjApKQotcWVtdV9hcmdzPSQ1Ci1ib290X2FyZ3M9JDYKLQotY2QgJEtWTQota3N0YXJ0dGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSB9JyA8IC9kZXYvbnVsbGAKLWVjaG8gJyAtLS0nIGBkYXRlYDogU3RhcnRpbmcga2VybmVsCi0KLSMgRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3Igb2YgcWVtdSBjb21tYW5kLgotUUVNVT0iYGlkZW50aWZ5X3FlbXUgJGJ1aWxkZGlyL3ZtbGludXgub2AiCi0KLSMgR2VuZXJhdGUgLXNtcCBxZW11IGFyZ3VtZW50LgotY3B1X2NvdW50PWBjb25maWdOUl9DUFVTLnNoICRjb25maWdfdGVtcGxhdGVgCi12Y3B1cz1gaWRlbnRpZnlfcWVtdV92Y3B1c2AKLWlmIHRlc3QgJGNwdV9jb3VudCAtZ3QgJHZjcHVzCi10aGVuCi0JZWNobyBDUFUgY291bnQgbGltaXRlZCBmcm9tICRjcHVfY291bnQgdG8gJHZjcHVzCi0JdG91Y2ggJHJlc2Rpci9XYXJuaW5ncwotCWVjaG8gQ1BVIGNvdW50IGxpbWl0ZWQgZnJvbSAkY3B1X2NvdW50IHRvICR2Y3B1cyA+PiAkcmVzZGlyL1dhcm5pbmdzCi0JY3B1X2NvdW50PSR2Y3B1cwotZmkKLXFlbXVfYXJncz0iYHNwZWNpZnlfcWVtdV9jcHVzICIkUUVNVSIgIiRxZW11X2FyZ3MiICIkY3B1X2NvdW50ImAiCi0KLSMgR2VuZXJhdGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGFuZCBpbnRlcmFjdGlvbi1zcGVjaWZpYyBxZW11IGFyZ3VtZW50cwotcWVtdV9hcmdzPSIkcWVtdV9hcmdzIGBpZGVudGlmeV9xZW11X2FyZ3MgIiRRRU1VIiAiJGJ1aWxkZGlyL2NvbnNvbGUubG9nImAiCi0KLSMgR2VuZXJhdGUgcWVtdSAtYXBwZW5kIGFyZ3VtZW50cwotcWVtdV9hcHBlbmQ9ImBpZGVudGlmeV9xZW11X2FwcGVuZCAiJFFFTVUiYCIKLQotIyBQdWxsIGluIEtjb25maWctZnJhZ21lbnQgYm9vdCBwYXJhbWV0ZXJzCi1ib290X2FyZ3M9ImBjb25maWdmcmFnX2Jvb3RfcGFyYW1zICIkYm9vdF9hcmdzIiAiJGNvbmZpZ190ZW1wbGF0ZSJgIgotIyBHZW5lcmF0ZSBDUFUtaG90cGx1ZyBib290IHBhcmFtZXRlcnMKLWJvb3RfYXJncz0iYHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgIiRib290X2FyZ3MiICRidWlsZGRpci8uY29uZmlnYCIKLSMgR2VuZXJhdGUgcmN1X2JhcnJpZXIoKSBib290IHBhcmFtZXRlcgotYm9vdF9hcmdzPSJgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzICIkYm9vdF9hcmdzImAiCi0jIFB1bGwgaW4gc3RhbmRhcmQgcmN1dG9ydHVyZSBib290IGFyZ3VtZW50cwotYm9vdF9hcmdzPSIkYm9vdF9hcmdzIHJjdXRvcnR1cmUuc3RhdF9pbnRlcnZhbD0xNSByY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JHNlY29uZHMgcmN1dG9ydHVyZS5yY3V0b3J0dXJlX3J1bm5hYmxlPTEiCi0KLWVjaG8gJFFFTVUgJHFlbXVfYXJncyAtbSA1MTIgLWtlcm5lbCAkYnVpbGRkaXIvYXJjaC94ODYvYm9vdC9iekltYWdlIC1hcHBlbmQgXCIkcWVtdV9hcHBlbmQgJGJvb3RfYXJnc1wiID4gJHJlc2Rpci9xZW11LWNtZAotaWYgdGVzdCAtbiAiJFJDVV9CVUlMRE9OTFkiCi10aGVuCi0JZWNobyBCdWlsZC1vbmx5IHJ1biBzcGVjaWZpZWQsIGJvb3QvdGVzdCBvbWl0dGVkLgotCWV4aXQgMAotZmkKLSRRRU1VICRxZW11X2FyZ3MgLW0gNTEyIC1rZXJuZWwgJGJ1aWxkZGlyL2FyY2gveDg2L2Jvb3QvYnpJbWFnZSAtYXBwZW5kICIkcWVtdV9hcHBlbmQgJGJvb3RfYXJncyIgJgotcWVtdV9waWQ9JCEKLWNvbW1hbmRjb21wbGV0ZWQ9MAotZWNobyBNb25pdG9yaW5nIHFlbXUgam9iIGF0IHBpZCAkcWVtdV9waWQKLWZvciAoKGk9MDtpPCRzZWNvbmRzO2krKykpCi1kbwotCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKLQl0aGVuCi0JCXNsZWVwIDEKLQllbHNlCi0JCWNvbW1hbmRjb21wbGV0ZWQ9MQotCQlrcnVudGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSAtICciJGtzdGFydHRpbWUiJyB9JyA8IC9kZXYvbnVsbGAKLQkJaWYgdGVzdCAka3J1bnRpbWUgLWx0ICRzZWNvbmRzCi0JCXRoZW4KLQkJCWVjaG8gQ29tcGxldGVkIGluICRrcnVudGltZSB2cy4gJHNlY29uZHMgPj4gJHJlc2Rpci9XYXJuaW5ncyAyPiYxCi0JCWVsc2UKLQkJCWVjaG8gJyAtLS0nIGBkYXRlYDogS2VybmVsIGRvbmUKLQkJZmkKLQkJYnJlYWsKLQlmaQotZG9uZQotaWYgdGVzdCAkY29tbWFuZGNvbXBsZXRlZCAtZXEgMAotdGhlbgotCWVjaG8gR3JhY2UgcGVyaW9kIGZvciBxZW11IGpvYiBhdCBwaWQgJHFlbXVfcGlkCi0JZm9yICgoaT0wO2k8PSRncmFjZTtpKyspKQotCWRvCi0JCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKLQkJdGhlbgotCQkJc2xlZXAgMQotCQllbHNlCi0JCQlicmVhawotCQlmaQotCQlpZiB0ZXN0ICRpIC1lcSAkZ3JhY2UKLQkJdGhlbgotCQkJa3J1bnRpbWU9YGF3ayAnQkVHSU4geyBwcmludCBzeXN0aW1lKCkgLSAnIiRrc3RhcnR0aW1lIicgfSdgCi0JCQllY2hvICIhISEgSGFuZyBhdCAka3J1bnRpbWUgdnMuICRzZWNvbmRzIHNlY29uZHMiID4+ICRyZXNkaXIvV2FybmluZ3MgMj4mMQotCQkJa2lsbCAtS0lMTCAkcWVtdV9waWQKLQkJZmkKLQlkb25lCi1maQotCi1jcCAkYnVpbGRkaXIvY29uc29sZS5sb2cgJHJlc2RpcgotcGFyc2UtcmN1dG9ydHVyZS5zaCAkcmVzZGlyL2NvbnNvbGUubG9nICR0aXRsZQotcGFyc2UtY29uc29sZS5zaCAkcmVzZGlyL2NvbnNvbGUubG9nICR0aXRsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXRlc3QtMS1ydW4uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tdGVzdC0xLXJ1bi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGIyOGJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXRlc3QtMS1ydW4uc2gKQEAgLTAsMCArMSwyMDMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFJ1biBhIGt2bS1iYXNlZCB0ZXN0IG9mIHRoZSBzcGVjaWZpZWQgdHJlZSBvbiB0aGUgc3BlY2lmaWVkIGNvbmZpZ3MuCisjIEZ1bGx5IGF1dG9tYXRlZCBydW4gYW5kIGVycm9yIGNoZWNraW5nLCBubyBncmFwaGljcyBjb25zb2xlLgorIworIyBFeGVjdXRlIHRoaXMgaW4gdGhlIHNvdXJjZSB0cmVlLiAgRG8gbm90IHJ1biBpdCBhcyBhIGJhY2tncm91bmQgdGFzaworIyBiZWNhdXNlIHFlbXUgZG9lcyBub3Qgc2VlbSB0byBsaWtlIHRoYXQgbXVjaC4KKyMKKyMgVXNhZ2U6IHNoIGt2bS10ZXN0LTEtcnVuLnNoIGNvbmZpZyBidWlsZGRpciByZXNkaXIgbWludXRlcyBxZW11LWFyZ3MgYm9vdF9hcmdzCisjCisjIHFlbXUtYXJncyBkZWZhdWx0cyB0byAiLW5vZ3JhcGhpYyIsIGFsb25nIHdpdGggYXJndW1lbnRzIHNwZWNpZnlpbmcgdGhlCisjCQkJbnVtYmVyIG9mIENQVXMgYW5kIG90aGVyIG9wdGlvbnMgZ2VuZXJhdGVkIGZyb20KKyMJCQl0aGUgdW5kZXJseWluZyBDUFUgYXJjaGl0ZWN0dXJlLgorIyBib290X2FyZ3MgZGVmYXVsdHMgdG8gdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zCisjCQkJc2hlbGwgZnVuY3Rpb24uCisjCisjIEFueXRoaW5nIHlvdSBzcGVjaWZ5IGZvciBlaXRoZXIgcWVtdS1hcmdzIG9yIGJvb3RfYXJncyBpcyBhcHBlbmRlZCB0bworIyB0aGUgZGVmYXVsdCB2YWx1ZXMuICBUaGUgIi1zbXAiIHZhbHVlIGlzIGRlZHVjZWQgZnJvbSB0aGUgY29udGVudHMgb2YKKyMgdGhlIGNvbmZpZyBmcmFnbWVudC4KKyMKKyMgTW9yZSBzb3BoaXN0aWNhdGVkIGFyZ3VtZW50IHBhcnNpbmcgaXMgY2xlYXJseSBuZWVkZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorIworIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMQorIworIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KKworZ3JhY2U9MTIwCisKK1Q9L3RtcC9rdm0tdGVzdC0xLXJ1bi5zaC4kJAordHJhcCAncm0gLXJmICRUJyAwCisKKy4gJEtWTS9iaW4vZnVuY3Rpb25zLnNoCisuICRLVlBBVEgvdmVyX2Z1bmN0aW9ucy5zaAorCitjb25maWdfdGVtcGxhdGU9JHsxfQorY29uZmlnX2Rpcj1gZWNobyAkY29uZmlnX3RlbXBsYXRlIHwgc2VkIC1lICdzLC9bXi9dKiQsLCdgCit0aXRsZT1gZWNobyAkY29uZmlnX3RlbXBsYXRlIHwgc2VkIC1lICdzL14uKlwvLy8nYAorYnVpbGRkaXI9JHsyfQoraWYgdGVzdCAteiAiJGJ1aWxkZGlyIiAtbyAhIC1kICIkYnVpbGRkaXIiIC1vICEgLXcgIiRidWlsZGRpciIKK3RoZW4KKwllY2hvICJrdm0tdGVzdC0xLXJ1bi5zaCA6JGJ1aWxkZGlyOiBOb3QgYSB3cml0YWJsZSBkaXJlY3RvcnksIGNhbm5vdCBidWlsZCBpbnRvIGl0IgorCWV4aXQgMQorZmkKK3Jlc2Rpcj0kezN9CitpZiB0ZXN0IC16ICIkcmVzZGlyIiAtbyAhIC1kICIkcmVzZGlyIiAtbyAhIC13ICIkcmVzZGlyIgordGhlbgorCWVjaG8gImt2bS10ZXN0LTEtcnVuLnNoIDokcmVzZGlyOiBOb3QgYSB3cml0YWJsZSBkaXJlY3RvcnksIGNhbm5vdCBzdG9yZSByZXN1bHRzIGludG8gaXQiCisJZXhpdCAxCitmaQorY3AgJGNvbmZpZ190ZW1wbGF0ZSAkcmVzZGlyL0NvbmZpZ0ZyYWdtZW50CitlY2hvICcgLS0tJyBgZGF0ZWA6IFN0YXJ0aW5nIGJ1aWxkCitlY2hvICcgLS0tJyBLY29uZmlnIGZyYWdtZW50IGF0OiAkY29uZmlnX3RlbXBsYXRlID4+ICRyZXNkaXIvbG9nCitpZiB0ZXN0IC1yICIkY29uZmlnX2Rpci9DRmNvbW1vbiIKK3RoZW4KKwljYXQgPCAkY29uZmlnX2Rpci9DRmNvbW1vbiA+PiAkVAorZmkKKyMgT3B0aW1pemF0aW9ucyBiZWxvdyB0aGlzIHBvaW50CisjIENPTkZJR19VU0I9bgorIyBDT05GSUdfU0VDVVJJVFk9bgorIyBDT05GSUdfTkZTX0ZTPW4KKyMgQ09ORklHX1NPVU5EPW4KKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLPW4KKyMgQ09ORklHX0lOUFVUX1RBQkxFVD1uCisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj1uCisjIENPTkZJR19JTlBVVF9NSVNDPW4KKyMgQ09ORklHX0lOUFVUX01PVVNFPW4KKyMgIyBDT05GSUdfTkVUPW4gIyBkaXNhYmxlcyBjb25zb2xlIGFjY2Vzcywgc28gYWNjZXB0IHRoZSBzbG93ZXIgYnVpbGQuCisjIENPTkZJR19TQ1NJPW4KKyMgQ09ORklHX0FUQT1uCisjIENPTkZJR19GQVRfRlM9bgorIyBDT05GSUdfTVNET1NfRlM9bgorIyBDT05GSUdfVkZBVF9GUz1uCisjIENPTkZJR19JU085NjYwX0ZTPW4KKyMgQ09ORklHX1FVT1RBPW4KKyMgQ09ORklHX0hJRD1uCisjIENPTkZJR19DUllQVE89bgorIyBDT05GSUdfUENDQVJEPW4KKyMgQ09ORklHX1BDTUNJQT1uCisjIENPTkZJR19DQVJEQlVTPW4KKyMgQ09ORklHX1lFTlRBPW4KK2lmIGt2bS1idWlsZC5zaCAkY29uZmlnX3RlbXBsYXRlICRidWlsZGRpciAkVAordGhlbgorCWNwICRidWlsZGRpci9NYWtlKi5vdXQgJHJlc2RpcgorCWNwICRidWlsZGRpci8uY29uZmlnICRyZXNkaXIKKwljcCAkYnVpbGRkaXIvYXJjaC94ODYvYm9vdC9iekltYWdlICRyZXNkaXIKKwlwYXJzZS1idWlsZC5zaCAkcmVzZGlyL01ha2Uub3V0ICR0aXRsZQorCWlmIHRlc3QgLWYgJGJ1aWxkZGlyLndhaXQKKwl0aGVuCisJCW12ICRidWlsZGRpci53YWl0ICRidWlsZGRpci5yZWFkeQorCWZpCitlbHNlCisJY3AgJGJ1aWxkZGlyL01ha2UqLm91dCAkcmVzZGlyCisJZWNobyBCdWlsZCBmYWlsZWQsIG5vdCBydW5uaW5nIEtWTSwgc2VlICRyZXNkaXIuCisJaWYgdGVzdCAtZiAkYnVpbGRkaXIud2FpdAorCXRoZW4KKwkJbXYgJGJ1aWxkZGlyLndhaXQgJGJ1aWxkZGlyLnJlYWR5CisJZmkKKwlleGl0IDEKK2ZpCit3aGlsZSB0ZXN0IC1mICRidWlsZGRpci5yZWFkeQorZG8KKwlzbGVlcCAxCitkb25lCittaW51dGVzPSQ0CitzZWNvbmRzPSQoKCRtaW51dGVzICogNjApKQorcWVtdV9hcmdzPSQ1Citib290X2FyZ3M9JDYKKworY2QgJEtWTQora3N0YXJ0dGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSB9JyA8IC9kZXYvbnVsbGAKK2VjaG8gJyAtLS0nIGBkYXRlYDogU3RhcnRpbmcga2VybmVsCisKKyMgRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3Igb2YgcWVtdSBjb21tYW5kLgorUUVNVT0iYGlkZW50aWZ5X3FlbXUgJGJ1aWxkZGlyL3ZtbGludXhgIgorCisjIEdlbmVyYXRlIC1zbXAgcWVtdSBhcmd1bWVudC4KK3FlbXVfYXJncz0iLW5vZ3JhcGhpYyAkcWVtdV9hcmdzIgorY3B1X2NvdW50PWBjb25maWdOUl9DUFVTLnNoICRjb25maWdfdGVtcGxhdGVgCit2Y3B1cz1gaWRlbnRpZnlfcWVtdV92Y3B1c2AKK2lmIHRlc3QgJGNwdV9jb3VudCAtZ3QgJHZjcHVzCit0aGVuCisJZWNobyBDUFUgY291bnQgbGltaXRlZCBmcm9tICRjcHVfY291bnQgdG8gJHZjcHVzCisJdG91Y2ggJHJlc2Rpci9XYXJuaW5ncworCWVjaG8gQ1BVIGNvdW50IGxpbWl0ZWQgZnJvbSAkY3B1X2NvdW50IHRvICR2Y3B1cyA+PiAkcmVzZGlyL1dhcm5pbmdzCisJY3B1X2NvdW50PSR2Y3B1cworZmkKK3FlbXVfYXJncz0iYHNwZWNpZnlfcWVtdV9jcHVzICIkUUVNVSIgIiRxZW11X2FyZ3MiICIkY3B1X2NvdW50ImAiCisKKyMgR2VuZXJhdGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGFuZCBpbnRlcmFjdGlvbi1zcGVjaWZpYyBxZW11IGFyZ3VtZW50cworcWVtdV9hcmdzPSIkcWVtdV9hcmdzIGBpZGVudGlmeV9xZW11X2FyZ3MgIiRRRU1VIiAiJGJ1aWxkZGlyL2NvbnNvbGUubG9nImAiCisKKyMgR2VuZXJhdGUgcWVtdSAtYXBwZW5kIGFyZ3VtZW50cworcWVtdV9hcHBlbmQ9ImBpZGVudGlmeV9xZW11X2FwcGVuZCAiJFFFTVUiYCIKKworIyBQdWxsIGluIEtjb25maWctZnJhZ21lbnQgYm9vdCBwYXJhbWV0ZXJzCitib290X2FyZ3M9ImBjb25maWdmcmFnX2Jvb3RfcGFyYW1zICIkYm9vdF9hcmdzIiAiJGNvbmZpZ190ZW1wbGF0ZSJgIgorIyBHZW5lcmF0ZSBrZXJuZWwtdmVyc2lvbi1zcGVjaWZpYyBib290IHBhcmFtZXRlcnMKK2Jvb3RfYXJncz0iYHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zICIkYm9vdF9hcmdzIiAkYnVpbGRkaXIvLmNvbmZpZyAkc2Vjb25kc2AiCisKK2VjaG8gJFFFTVUgJHFlbXVfYXJncyAtbSA1MTIgLWtlcm5lbCAkYnVpbGRkaXIvYXJjaC94ODYvYm9vdC9iekltYWdlIC1hcHBlbmQgXCIkcWVtdV9hcHBlbmQgJGJvb3RfYXJnc1wiID4gJHJlc2Rpci9xZW11LWNtZAoraWYgdGVzdCAtbiAiJFJDVV9CVUlMRE9OTFkiCit0aGVuCisJZWNobyBCdWlsZC1vbmx5IHJ1biBzcGVjaWZpZWQsIGJvb3QvdGVzdCBvbWl0dGVkLgorCWV4aXQgMAorZmkKKyRRRU1VICRxZW11X2FyZ3MgLW0gNTEyIC1rZXJuZWwgJGJ1aWxkZGlyL2FyY2gveDg2L2Jvb3QvYnpJbWFnZSAtYXBwZW5kICIkcWVtdV9hcHBlbmQgJGJvb3RfYXJncyIgJgorcWVtdV9waWQ9JCEKK2NvbW1hbmRjb21wbGV0ZWQ9MAorZWNobyBNb25pdG9yaW5nIHFlbXUgam9iIGF0IHBpZCAkcWVtdV9waWQKK2ZvciAoKGk9MDtpPCRzZWNvbmRzO2krKykpCitkbworCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKKwl0aGVuCisJCXNsZWVwIDEKKwllbHNlCisJCWNvbW1hbmRjb21wbGV0ZWQ9MQorCQlrcnVudGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSAtICciJGtzdGFydHRpbWUiJyB9JyA8IC9kZXYvbnVsbGAKKwkJaWYgdGVzdCAka3J1bnRpbWUgLWx0ICRzZWNvbmRzCisJCXRoZW4KKwkJCWVjaG8gQ29tcGxldGVkIGluICRrcnVudGltZSB2cy4gJHNlY29uZHMgPj4gJHJlc2Rpci9XYXJuaW5ncyAyPiYxCisJCWVsc2UKKwkJCWVjaG8gJyAtLS0nIGBkYXRlYDogS2VybmVsIGRvbmUKKwkJZmkKKwkJYnJlYWsKKwlmaQorZG9uZQoraWYgdGVzdCAkY29tbWFuZGNvbXBsZXRlZCAtZXEgMAordGhlbgorCWVjaG8gR3JhY2UgcGVyaW9kIGZvciBxZW11IGpvYiBhdCBwaWQgJHFlbXVfcGlkCisJZm9yICgoaT0wO2k8PSRncmFjZTtpKyspKQorCWRvCisJCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKKwkJdGhlbgorCQkJc2xlZXAgMQorCQllbHNlCisJCQlicmVhaworCQlmaQorCQlpZiB0ZXN0ICRpIC1lcSAkZ3JhY2UKKwkJdGhlbgorCQkJa3J1bnRpbWU9YGF3ayAnQkVHSU4geyBwcmludCBzeXN0aW1lKCkgLSAnIiRrc3RhcnR0aW1lIicgfSdgCisJCQllY2hvICIhISEgSGFuZyBhdCAka3J1bnRpbWUgdnMuICRzZWNvbmRzIHNlY29uZHMiID4+ICRyZXNkaXIvV2FybmluZ3MgMj4mMQorCQkJa2lsbCAtS0lMTCAkcWVtdV9waWQKKwkJZmkKKwlkb25lCitmaQorCitjcCAkYnVpbGRkaXIvY29uc29sZS5sb2cgJHJlc2RpcgorcGFyc2UtJHtUT1JUVVJFX1NVSVRFfXRvcnR1cmUuc2ggJHJlc2Rpci9jb25zb2xlLmxvZyAkdGl0bGUKK3BhcnNlLWNvbnNvbGUuc2ggJHJlc2Rpci9jb25zb2xlLmxvZyAkdGl0bGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS5zaAppbmRleCAxYjc5MjNiLi41YTc4Y2JmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0uc2gKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLnNoCkBAIC0zMCwxNCArMzAsMjEgQEAKIHNjcmlwdG5hbWU9JDAKIGFyZ3M9IiQqIgogCitUPS90bXAva3ZtLnNoLiQkCit0cmFwICdybSAtcmYgJFQnIDAKK21rZGlyICRUCisKIGR1cj0zMAorZHJ5cnVuPSIiCiBLVk09ImBwd2RgL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUiOyBleHBvcnQgS1ZNCiBQQVRIPSR7S1ZNfS9iaW46JFBBVEg7IGV4cG9ydCBQQVRICiBidWlsZGRpcj0iJHtLVk19L2IxIgogUkNVX0lOSVRSRD0iJEtWTS9pbml0cmQiOyBleHBvcnQgUkNVX0lOSVRSRAogUkNVX0tNQUtFX0FSRz0iIjsgZXhwb3J0IFJDVV9LTUFLRV9BUkcKK1RPUlRVUkVfU1VJVEU9cmN1CiByZXNkaXI9IiIKIGNvbmZpZ3M9IiIKK2NwdXM9MAogZHM9YGRhdGUgKyVZLiVtLiVkLSVIOiVNOiVTYAoga3ZlcnNpb249IiIKIApAQCAtNDksNyArNTYsOSBAQAogCWVjaG8gIiAgICAgICAtLWJ1aWxkZGlyIGFic29sdXRlLXBhdGhuYW1lIgogCWVjaG8gIiAgICAgICAtLWJ1aWxkb25seSIKIAllY2hvICIgICAgICAgLS1jb25maWdzIFwiY29uZmlnLWZpbGUgbGlzdFwiIgorCWVjaG8gIiAgICAgICAtLWNwdXMgTiIKIAllY2hvICIgICAgICAgLS1kYXRlc3RhbXAgc3RyaW5nIgorCWVjaG8gIiAgICAgICAtLWRyeXJ1biBzY2hlZHxzY3JpcHQiCiAJZWNobyAiICAgICAgIC0tZHVyYXRpb24gbWludXRlcyIKIAllY2hvICIgICAgICAgLS1pbnRlcmFjdGl2ZSIKIAllY2hvICIgICAgICAgLS1rbWFrZS1hcmcga2VybmVsLW1ha2UtYXJndW1lbnRzIgpAQCAtNTgsOCArNjcsOSBAQAogCWVjaG8gIiAgICAgICAtLW5vLWluaXRyZCIKIAllY2hvICIgICAgICAgLS1xZW11LWFyZ3MgcWVtdS1zeXN0ZW0tLi4uIgogCWVjaG8gIiAgICAgICAtLXFlbXUtY21kIHFlbXUtc3lzdGVtLS4uLiIKLQllY2hvICIgICAgICAgLS1yZXN1bHRzIGFic29sdXRlLXBhdGhuYW1lIgogCWVjaG8gIiAgICAgICAtLXJlbGJ1aWxkZGlyIHJlbGF0aXZlLXBhdGhuYW1lIgorCWVjaG8gIiAgICAgICAtLXJlc3VsdHMgYWJzb2x1dGUtcGF0aG5hbWUiCisJZWNobyAiICAgICAgIC0tdG9ydHVyZSByY3UiCiAJZXhpdCAxCiB9CiAKQEAgLTg1LDExICs5NSwyMSBAQAogCQljb25maWdzPSIkMiIKIAkJc2hpZnQKIAkJOzsKKwktLWNwdXMpCisJCWNoZWNrYXJnIC0tY3B1cyAiKG51bWJlcikiICIkIyIgIiQyIiAnXlswLTldKiQnICdeLS0nCisJCWNwdXM9JDIKKwkJc2hpZnQKKwkJOzsKIAktLWRhdGVzdGFtcCkKIAkJY2hlY2thcmcgLS1kYXRlc3RhbXAgIihyZWxhdGl2ZSBwYXRobmFtZSkiICIkIyIgIiQyIiAnXlteL10qJCcgJ14tLScKIAkJZHM9JDIKIAkJc2hpZnQKIAkJOzsKKwktLWRyeXJ1bikKKwkJY2hlY2thcmcgLS1kcnlydW4gInNjaGVkfHNjcmlwdCIgJCMgIiQyIiAnc2NoZWRcfHNjcmlwdCcgJ14tLScKKwkJZHJ5cnVuPSQyCisJCXNoaWZ0CisJCTs7CiAJLS1kdXJhdGlvbikKIAkJY2hlY2thcmcgLS1kdXJhdGlvbiAiKG1pbnV0ZXMpIiAkIyAiJDIiICdeWzAtOV0qJCcgJ15lcnJvcicKIAkJZHVyPSQyCkBAIC0xMzgsNiArMTU4LDExIEBACiAJCXJlc2Rpcj0kMgogCQlzaGlmdAogCQk7OworCS0tdG9ydHVyZSkKKwkJY2hlY2thcmcgLS10b3J0dXJlICIoc3VpdGUgbmFtZSkiICIkIyIgIiQyIiAnXlwobG9ja1x8cmN1XCkkJyAnXi0tJworCQlUT1JUVVJFX1NVSVRFPSQyCisJCXNoaWZ0CisJCTs7CiAJKikKIAkJZWNobyBVbmtub3duIGFyZ3VtZW50ICQxCiAJCXVzYWdlCkBAIC0xNDYsNyArMTcxLDcgQEAKIAlzaGlmdAogZG9uZQogCi1DT05GSUdGUkFHPSR7S1ZNfS9jb25maWdzOyBleHBvcnQgQ09ORklHRlJBRworQ09ORklHRlJBRz0ke0tWTX0vY29uZmlncy8ke1RPUlRVUkVfU1VJVEV9OyBleHBvcnQgQ09ORklHRlJBRwogS1ZQQVRIPSR7Q09ORklHRlJBR30vJGt2ZXJzaW9uOyBleHBvcnQgS1ZQQVRICiAKIGlmIHRlc3QgLXogIiRjb25maWdzIgpAQCAtMTU3LDU0ICsxODIsMjMxIEBACiBpZiB0ZXN0IC16ICIkcmVzZGlyIgogdGhlbgogCXJlc2Rpcj0kS1ZNL3JlcwotCWlmICEgdGVzdCAtZSAkcmVzZGlyCi0JdGhlbgotCQlta2RpciAkcmVzZGlyIHx8IDoKLQlmaQotZWxzZQorZmkKKworaWYgdGVzdCAiJGRyeXJ1biIgPSAiIgordGhlbgogCWlmICEgdGVzdCAtZSAkcmVzZGlyCiAJdGhlbgogCQlta2RpciAtcCAiJHJlc2RpciIgfHwgOgogCWZpCi1maQotbWtkaXIgJHJlc2Rpci8kZHMKLXRvdWNoICRyZXNkaXIvJGRzL2xvZwotZWNobyAkc2NyaXB0bmFtZSAkYXJncyA+PiAkcmVzZGlyLyRkcy9sb2cKKwlta2RpciAkcmVzZGlyLyRkcwogCi1wd2QgPiAkcmVzZGlyLyRkcy90ZXN0aWQudHh0Ci1pZiB0ZXN0IC1kIC5naXQKLXRoZW4KLQlnaXQgc3RhdHVzID4+ICRyZXNkaXIvJGRzL3Rlc3RpZC50eHQKLQlnaXQgcmV2LXBhcnNlIEhFQUQgPj4gJHJlc2Rpci8kZHMvdGVzdGlkLnR4dAotZmkKLWJ1aWxkZGlyPSRLVk0vYjEKLWlmICEgdGVzdCAtZSAkYnVpbGRkaXIKLXRoZW4KLQlta2RpciAkYnVpbGRkaXIgfHwgOgorCSMgQmUgbm9pc3kgb25seSBpZiBydW5uaW5nIHRoZSBzY3JpcHQuCisJZWNobyBSZXN1bHRzIGRpcmVjdG9yeTogJHJlc2Rpci8kZHMKKwllY2hvICRzY3JpcHRuYW1lICRhcmdzCisKKwl0b3VjaCAkcmVzZGlyLyRkcy9sb2cKKwllY2hvICRzY3JpcHRuYW1lICRhcmdzID4+ICRyZXNkaXIvJGRzL2xvZworCWVjaG8gJHtUT1JUVVJFX1NVSVRFfSA+ICRyZXNkaXIvJGRzL1RPUlRVUkVfU1VJVEUKKworCXB3ZCA+ICRyZXNkaXIvJGRzL3Rlc3RpZC50eHQKKwlpZiB0ZXN0IC1kIC5naXQKKwl0aGVuCisJCWdpdCBzdGF0dXMgPj4gJHJlc2Rpci8kZHMvdGVzdGlkLnR4dAorCQlnaXQgcmV2LXBhcnNlIEhFQUQgPj4gJHJlc2Rpci8kZHMvdGVzdGlkLnR4dAorCWZpCiBmaQogCisjIENyZWF0ZSBhIGZpbGUgb2YgdGVzdC1uYW1lLyNjcHVzIHBhaXJzLCBzb3J0ZWQgYnkgZGVjcmVhc2luZyAjY3B1cy4KK3RvdWNoICRUL2NmZ2NwdQogZm9yIENGIGluICRjb25maWdzCiBkbwotCSMgUnVubmluZyBUUkVFMDEgbXVsdGlwbGUgdGltZXMgY3JlYXRlcyBUUkVFMDEsIFRSRUUwMS4yLCBUUkVFMDEuMywgLi4uCi0JcmQ9JHJlc2Rpci8kZHMvJENGCi0JaWYgdGVzdCAtZCAiJHtyZH0iCisJaWYgdGVzdCAtZiAiJENPTkZJR0ZSQUcvJGt2ZXJzaW9uLyRDRiIKIAl0aGVuCi0JCW49ImBscyAtZCAiJHtyZH0iKiB8IGdyZXAgJ1wuWzAtOV1cKyQnIHwKLQkJCXNlZCAtZSAncy9eLipcLlwoWzAtOV1cK1wpL1wxLycgfAotCQkJc29ydCAtazFuIHwgdGFpbCAtMWAiCi0JCWlmIHRlc3QgLXogIiRuIgotCQl0aGVuCi0JCQlyZD0iJHtyZH0uMiIKLQkJZWxzZQotCQkJbj0iYGV4cHIgJG4gKyAxYCIKLQkJCXJkPSIke3JkfS4ke259IgotCQlmaQorCQllY2hvICRDRiBgY29uZmlnTlJfQ1BVUy5zaCAkQ09ORklHRlJBRy8ka3ZlcnNpb24vJENGYCA+PiAkVC9jZmdjcHUKKwllbHNlCisJCWVjaG8gIlRoZSAtLWNvbmZpZ3MgZmlsZSAkQ0YgZG9lcyBub3QgZXhpc3QsIHRlcm1pbmF0aW5nLiIKKwkJZXhpdCAxCiAJZmkKLQlta2RpciAiJHtyZH0iCi0JZWNobyBSZXN1bHRzIGRpcmVjdG9yeTogJHJkCi0Ja3ZtLXRlc3QtMS1yY3Uuc2ggJENPTkZJR0ZSQUcvJGt2ZXJzaW9uLyRDRiAkYnVpbGRkaXIgJHJkICRkdXIgIi1ub2dyYXBoaWMgJFJDVV9RRU1VX0FSRyIgInJjdXRvcnR1cmUudGVzdF9ub19pZGxlX2h6PTEgcmN1dG9ydHVyZS52ZXJib3NlPTEgJFJDVV9CT09UQVJHUyIKIGRvbmUKK3NvcnQgLWsybnIgJFQvY2ZnY3B1ID4gJFQvY2ZnY3B1LnNvcnQKKworIyBVc2UgYSBncmVlZHkgYmluLXBhY2tpbmcgYWxnb3JpdGhtLCBzb3J0aW5nIHRoZSBsaXN0IGFjY29yZGluZ2x5LgorYXdrIDwgJFQvY2ZnY3B1LnNvcnQgPiAkVC9jZmdjcHUucGFjayAtdiBuY3B1cz0kY3B1cyAnCitCRUdJTiB7CisJbmpvYnMgPSAwOworfQorCit7CisJIyBSZWFkIGZpbGUgb2YgdGVzdHMgYW5kIGNvcnJlc3BvbmRpbmcgcmVxdWlyZWQgbnVtYmVycyBvZiBDUFVzLgorCWNmW25qb2JzXSA9ICQxOworCWNwdXNbbmpvYnNdID0gJDI7CisJbmpvYnMrKzsKK30KKworRU5EIHsKKwlhbGxkb25lID0gMDsKKwliYXRjaCA9IDA7CisJbmMgPSAtMTsKKworCSMgRWFjaCBwYXNzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBsb29wIGNyZWF0ZXMgb24gdGVzdCBiYXRjaAorCSMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgY29uY3VycmVudGx5IGdpdmVuIG5jcHVzLiAgTm90ZSB0aGF0IGEKKwkjIGdpdmVuIHRlc3QgdGhhdCByZXF1aXJlcyBtb3JlIHRoYW4gdGhlIGF2YWlsYWJsZSBDUFVzIHdpbGwgcnVuIGluCisJIyB0aGVpciBvd24gYmF0Y2guICBTdWNoIHRlc3RzIGp1c3QgaGF2ZSB0byBtYWtlIGRvIHdpdGggd2hhdAorCSMgaXMgYXZhaWxhYmxlLgorCXdoaWxlIChuYyAhPSBuY3B1cykgeworCQliYXRjaCsrOworCQluYyA9IG5jcHVzOworCisJCSMgRWFjaCBwYXNzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBsb29wIGNvbnNpZGVycyBvbmUKKwkJIyB0ZXN0IGZvciBpbmNsdXNpb24gaW4gdGhlIGN1cnJlbnQgYmF0Y2guCisJCWZvciAoaSA9IDA7IGkgPCBuam9iczsgaSsrKSB7CisJCQlpZiAoZG9uZVtpXSkKKwkJCQljb250aW51ZTsgIyBBbHJlYWR5IHBhcnQgb2YgYSBiYXRjaC4KKwkJCWlmIChuYyA+PSBjcHVzW2ldIHx8IG5jID09IG5jcHVzKSB7CisKKwkJCQkjIFRoaXMgdGVzdCBmaXRzIGludG8gdGhlIGN1cnJlbnQgYmF0Y2guCisJCQkJZG9uZVtpXSA9IGJhdGNoOworCQkJCW5jIC09IGNwdXNbaV07CisJCQkJaWYgKG5jIDw9IDApCisJCQkJCWJyZWFrOyAjIFRvby1iaWcgdGVzdCBpbiBpdHMgb3duIGJhdGNoLgorCQkJfQorCQl9CisJfQorCisJIyBEdW1wIG91dCB0aGUgdGVzdHMgaW4gYmF0Y2ggb3JkZXIuCisJZm9yIChiID0gMTsgYiA8PSBiYXRjaDsgYisrKQorCQlmb3IgKGkgPSAwOyBpIDwgbmpvYnM7IGkrKykKKwkJCWlmIChkb25lW2ldID09IGIpCisJCQkJcHJpbnQgY2ZbaV0sIGNwdXNbaV07Cit9JworCisjIEdlbmVyYXRlIGEgc2NyaXB0IHRvIGV4ZWN1dGUgdGhlIHRlc3RzIGluIGFwcHJvcHJpYXRlIGJhdGNoZXMuCitjYXQgPDwgX19fRU9GX19fID4gJFQvc2NyaXB0CitUT1JUVVJFX1NVSVRFPSIkVE9SVFVSRV9TVUlURSI7IGV4cG9ydCBUT1JUVVJFX1NVSVRFCitfX19FT0ZfX18KK2F3ayA8ICRUL2NmZ2NwdS5wYWNrIFwKKwktdiBDT05GSUdESVI9IiRDT05GSUdGUkFHLyRrdmVyc2lvbi8iIFwKKwktdiBLVk09IiRLVk0iIFwKKwktdiBuY3B1cz0kY3B1cyBcCisJLXYgcmQ9JHJlc2Rpci8kZHMvIFwKKwktdiBkdXI9JGR1ciBcCisJLXYgUkNVX1FFTVVfQVJHPSRSQ1VfUUVNVV9BUkcgXAorCS12IFJDVV9CT09UQVJHUz0kUkNVX0JPT1RBUkdTIFwKKydCRUdJTiB7CisJaSA9IDA7Cit9CisKK3sKKwljZltpXSA9ICQxOworCWNwdXNbaV0gPSAkMjsKKwlpKys7Cit9CisKKyMgRHVtcCBvdXQgdGhlIHNjcmlwdGluZyByZXF1aXJlZCB0byBydW4gb25lIHRlc3QgYmF0Y2guCitmdW5jdGlvbiBkdW1wKGZpcnN0LCBwYXN0bGFzdCkKK3sKKwlwcmludCAiZWNobyAtLS0tU3RhcnQgYmF0Y2g6IGBkYXRlYCI7CisJcHJpbnQgImVjaG8gLS0tLVN0YXJ0IGJhdGNoOiBgZGF0ZWAgPj4gIiByZCAiL2xvZyI7CisJam49MQorCWZvciAoaiA9IGZpcnN0OyBqIDwgcGFzdGxhc3Q7IGorKykgeworCQlidWlsZGRpcj1LVk0gIi9iIiBqbgorCQljcHVzcltqbl0gPSBjcHVzW2pdOworCQlpZiAoY2ZyZXBbY2Zbal1dID09ICIiKSB7CisJCQljZnJbam5dID0gY2Zbal07CisJCQljZnJlcFtjZltqXV0gPSAxOworCQl9IGVsc2UgeworCQkJY2ZyZXBbY2Zbal1dKys7CisJCQljZnJbam5dID0gY2Zbal0gIi4iIGNmcmVwW2NmW2pdXTsKKwkJfQorCQlpZiAoY3B1c3Jbam5dID4gbmNwdXMgJiYgbmNwdXMgIT0gMCkKKwkJCW92ZiA9ICIoISkiOworCQllbHNlCisJCQlvdmYgPSAiIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBTdGFydGluZyBidWlsZC4gYGRhdGVgIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBTdGFydGluZyBidWlsZC4gYGRhdGVgID4+ICIgcmQgIi9sb2ciOworCQlwcmludCAicm0gLWYgIiBidWlsZGRpciAiLioiOworCQlwcmludCAidG91Y2ggIiBidWlsZGRpciAiLndhaXQiOworCQlwcmludCAibWtkaXIgIiBidWlsZGRpciAiID4gL2Rldi9udWxsIDI+JjEgfHwgOiI7CisJCXByaW50ICJta2RpciAiIHJkIGNmcltqbl0gIiB8fCA6IjsKKwkJcHJpbnQgImt2bS10ZXN0LTEtcnVuLnNoICIgQ09ORklHRElSIGNmW2pdLCBidWlsZGRpciwgcmQgY2ZyW2puXSwgZHVyICIgXCIiIFJDVV9RRU1VX0FSRyAiXCIgXCIiIFJDVV9CT09UQVJHUyAiXCIgPiAiIHJkIGNmcltqbl0gICIva3ZtLXRlc3QtMS1ydW4uc2gub3V0IDI+JjEgJiIKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBXYWl0aW5nIGZvciBidWlsZCB0byBjb21wbGV0ZS4gYGRhdGVgIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBXYWl0aW5nIGZvciBidWlsZCB0byBjb21wbGV0ZS4gYGRhdGVgID4+ICIgcmQgIi9sb2ciOworCQlwcmludCAid2hpbGUgdGVzdCAtZiAiIGJ1aWxkZGlyICIud2FpdCIKKwkJcHJpbnQgImRvIgorCQlwcmludCAiXHRzbGVlcCAxIgorCQlwcmludCAiZG9uZSIKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBCdWlsZCBjb21wbGV0ZS4gYGRhdGVgIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBCdWlsZCBjb21wbGV0ZS4gYGRhdGVgID4+ICIgcmQgIi9sb2ciOworCQlqbisrOworCX0KKwlmb3IgKGogPSAxOyBqIDwgam47IGorKykgeworCQlidWlsZGRpcj1LVk0gIi9iIiBqCisJCXByaW50ICJybSAtZiAiIGJ1aWxkZGlyICIucmVhZHkiCisJCXByaW50ICJlY2hvIC0tLS0iLCBjZnJbal0sIGNwdXNyW2pdIG92ZiAiOiBTdGFydGluZyBrZXJuZWwuIGBkYXRlYCI7CisJCXByaW50ICJlY2hvIC0tLS0iLCBjZnJbal0sIGNwdXNyW2pdIG92ZiAiOiBTdGFydGluZyBrZXJuZWwuIGBkYXRlYCA+PiAiIHJkICIvbG9nIjsKKwl9CisJcHJpbnQgIndhaXQiCisJcHJpbnQgImVjaG8gLS0tLSBBbGwga2VybmVsIHJ1bnMgY29tcGxldGUuIGBkYXRlYCI7CisJcHJpbnQgImVjaG8gLS0tLSBBbGwga2VybmVsIHJ1bnMgY29tcGxldGUuIGBkYXRlYCA+PiAiIHJkICIvbG9nIjsKKwlmb3IgKGogPSAxOyBqIDwgam47IGorKykgeworCQlidWlsZGRpcj1LVk0gIi9iIiBqCisJCXByaW50ICJlY2hvIC0tLS0iLCBjZnJbal0sIGNwdXNyW2pdIG92ZiAiOiBCdWlsZC9ydW4gcmVzdWx0czoiOworCQlwcmludCAiZWNobyAtLS0tIiwgY2ZyW2pdLCBjcHVzcltqXSBvdmYgIjogQnVpbGQvcnVuIHJlc3VsdHM6ID4+ICIgcmQgIi9sb2ciOworCQlwcmludCAiY2F0ICIgcmQgY2ZyW2pdICAiL2t2bS10ZXN0LTEtcnVuLnNoLm91dCI7CisJCXByaW50ICJjYXQgIiByZCBjZnJbal0gICIva3ZtLXRlc3QtMS1ydW4uc2gub3V0ID4+ICIgcmQgIi9sb2ciOworCX0KK30KKworRU5EIHsKKwluam9icyA9IGk7CisJbmMgPSBuY3B1czsKKwlmaXJzdCA9IDA7CisKKwkjIEVhY2ggcGFzcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbG9vcCBjb25zaWRlcnMgb25lIHRlc3QuCisJZm9yIChpID0gMDsgaSA8IG5qb2JzOyBpKyspIHsKKwkJaWYgKG5jcHVzID09IDApIHsKKwkJCSMgU2VxdWVudGlhbCB0ZXN0IHNwZWNpZmllZCwgZWFjaCB0ZXN0IGl0cyBvd24gYmF0Y2guCisJCQlkdW1wKGksIGkgKyAxKTsKKwkJCWZpcnN0ID0gaTsKKwkJfSBlbHNlIGlmIChuYyA8IGNwdXNbaV0gJiYgaSAhPSAwKSB7CisJCQkjIE91dCBvZiBDUFVzLCBkdW1wIG91dCBhIGJhdGNoLgorCQkJZHVtcChmaXJzdCwgaSk7CisJCQlmaXJzdCA9IGk7CisJCQluYyA9IG5jcHVzOworCQl9CisJCSMgQWNjb3VudCBmb3IgdGhlIENQVXMgbmVlZGVkIGJ5IHRoZSBjdXJyZW50IHRlc3QuCisJCW5jIC09IGNwdXNbaV07CisJfQorCSMgRHVtcCB0aGUgbGFzdCBiYXRjaC4KKwlpZiAobmNwdXMgIT0gMCkKKwkJZHVtcChmaXJzdCwgaSk7Cit9JyA+PiAkVC9zY3JpcHQKKworaWYgdGVzdCAiJGRyeXJ1biIgPSBzY3JpcHQKK3RoZW4KKwkjIER1bXAgb3V0IHRoZSBzY3JpcHQsIGJ1dCBkZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0CisJIyBpdCBuZWVkcyB0byBydW4gc3RhbmRhbG9uZS4KKwllY2hvIENPTkZJR0ZSQUc9IiRDT05GSUdGUkFHOyBleHBvcnQgQ09ORklHRlJBRyIKKwllY2hvIEtWTT0iJEtWTTsgZXhwb3J0IEtWTSIKKwllY2hvIEtWUEFUSD0iJEtWUEFUSDsgZXhwb3J0IEtWUEFUSCIKKwllY2hvIFBBVEg9IiRQQVRIOyBleHBvcnQgUEFUSCIKKwllY2hvIFJDVV9CVUlMRE9OTFk9IiRSQ1VfQlVJTERPTkxZOyBleHBvcnQgUkNVX0JVSUxET05MWSIKKwllY2hvIFJDVV9JTklUUkQ9IiRSQ1VfSU5JVFJEOyBleHBvcnQgUkNVX0lOSVRSRCIKKwllY2hvIFJDVV9LTUFLRV9BUkc9IiRSQ1VfS01BS0VfQVJHOyBleHBvcnQgUkNVX0tNQUtFX0FSRyIKKwllY2hvIFJDVV9RRU1VX0NNRD0iJFJDVV9RRU1VX0NNRDsgZXhwb3J0IFJDVV9RRU1VX0NNRCIKKwllY2hvIFJDVV9RRU1VX0lOVEVSQUNUSVZFPSIkUkNVX1FFTVVfSU5URVJBQ1RJVkU7IGV4cG9ydCBSQ1VfUUVNVV9JTlRFUkFDVElWRSIKKwllY2hvIFJDVV9RRU1VX01BQz0iJFJDVV9RRU1VX01BQzsgZXhwb3J0IFJDVV9RRU1VX01BQyIKKwllY2hvICJta2RpciAtcCAiJHJlc2RpciIgfHwgOiIKKwllY2hvICJta2RpciAkcmVzZGlyLyRkcyIKKwljYXQgJFQvc2NyaXB0CisJZXhpdCAwCitlbGlmIHRlc3QgIiRkcnlydW4iID0gc2NoZWQKK3RoZW4KKwkjIEV4dHJhY3QgdGhlIHRlc3QgcnVuIHNjaGVkdWxlIGZyb20gdGhlIHNjcmlwdC4KKwllZ3JlcCAnc3RhcnQgYmF0Y2h8U3RhcnRpbmcgYnVpbGRcLicgJFQvc2NyaXB0IHwKKwkJc2VkIC1lICdzLzouKiQvLycgLWUgJ3MvXmVjaG8gLy8nCisJZXhpdCAwCitlbHNlCisJIyBOb3QgYSBkcnlydSwgc28gcnVuIHRoZSBzY3JpcHQuCisJc2ggJFQvc2NyaXB0CitmaQorCiAjIFRyYWNpbmc6IHRyYWNlX2V2ZW50PXJjdTpyY3VfZ3JhY2VfcGVyaW9kLHJjdTpyY3VfZnV0dXJlX2dyYWNlX3BlcmlvZCxyY3U6cmN1X2dyYWNlX3BlcmlvZF9pbml0LHJjdTpyY3Vfbm9jYl93YWtlLHJjdTpyY3VfcHJlZW1wdF90YXNrLHJjdTpyY3VfdW5sb2NrX3ByZWVtcHRlZF90YXNrLHJjdTpyY3VfcXVpZXNjZW50X3N0YXRlX3JlcG9ydCxyY3U6cmN1X2ZxcyxyY3U6cmN1X2NhbGxiYWNrLHJjdTpyY3Vfa2ZyZWVfY2FsbGJhY2sscmN1OnJjdV9iYXRjaF9zdGFydCxyY3U6cmN1X2ludm9rZV9jYWxsYmFjayxyY3U6cmN1X2ludm9rZV9rZnJlZV9jYWxsYmFjayxyY3U6cmN1X2JhdGNoX2VuZCxyY3U6cmN1X3RvcnR1cmVfcmVhZCxyY3U6cmN1X2JhcnJpZXIKIAorZWNobworZWNobwogZWNobyAiIC0tLSBgZGF0ZWAgVGVzdCBzdW1tYXJ5OiIKK2VjaG8gUmVzdWx0cyBkaXJlY3Rvcnk6ICRyZXNkaXIvJGRzCiBrdm0tcmVjaGVjay5zaCAkcmVzZGlyLyRkcwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtTiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9TUkNVLU4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTBlMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtTgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTgKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUFJFRU1QVF9OT05FPXkKLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9TUkNVLVAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTBlMDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtUAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTgKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUFJFRU1QVF9OT05FPW4KLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9USU5ZMDEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjgyM2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUNPTkZJR19TTVA9bgotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19USU5ZX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfREVCVUdfTE9DS19BTExPQz1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJFRU1QVF9DT1VOVD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9USU5ZMDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDcyZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUNPTkZJR19TTVA9bgotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19USU5ZX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9eQotQ09ORklHX05PX0haX0lETEU9bgotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9UUkFDRT15Ci1DT05GSUdfREVCVUdfTE9DS19BTExPQz15Ci1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJFRU1QVF9DT1VOVD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTExOWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT1uCi1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9eQotI0NIRUNLI0NPTkZJR19UUkVFX1BSRUVNUFRfUkNVPXkKLUNPTkZJR19IWl9QRVJJT0RJQz1uCi1DT05GSUdfTk9fSFpfSURMRT15Ci1DT05GSUdfTk9fSFpfRlVMTD1uCi1DT05GSUdfUkNVX0ZBU1RfTk9fSFo9eQotQ09ORklHX1JDVV9UUkFDRT15Ci1DT05GSUdfSE9UUExVR19DUFU9eQotQ09ORklHX1JDVV9GQU5PVVQ9OAotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgotQ09ORklHX1JDVV9OT0NCX0NQVT15Ci1DT05GSUdfUkNVX05PQ0JfQ1BVX1pFUk89eQotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX1JDVV9CT09TVD1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQwOTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT1uCi1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9eQotI0NIRUNLI0NPTkZJR19UUkVFX1BSRUVNUFRfUkNVPXkKLUNPTkZJR19IWl9QRVJJT0RJQz1uCi1DT05GSUdfTk9fSFpfSURMRT15Ci1DT05GSUdfTk9fSFpfRlVMTD1uCi1DT05GSUdfUkNVX0ZBU1RfTk9fSFo9biAKLUNPTkZJR19SQ1VfVFJBQ0U9bgotQ09ORklHX0hPVFBMVUdfQ1BVPW4KLUNPTkZJR19TVVNQRU5EPW4KLUNPTkZJR19ISUJFUk5BVElPTj1uCi1DT05GSUdfUkNVX0ZBTk9VVD0zCi1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTMKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQotQ09ORklHX1BST1ZFX0xPQ0tJTkc9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9eQotQ09ORklHX1JDVV9CT09TVD1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2RlNWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT1uCi1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9eQotI0NIRUNLI0NPTkZJR19UUkVFX1BSRUVNUFRfUkNVPXkKLUNPTkZJR19IWl9QRVJJT0RJQz15Ci1DT05GSUdfTk9fSFpfSURMRT1uCi1DT05GSUdfTk9fSFpfRlVMTD1uCi1DT05GSUdfUkNVX1RSQUNFPXkKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUkNVX0ZBTk9VVD00Ci1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTQKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX1JDVV9CT09TVD15Ci1DT05GSUdfUkNVX0JPT1NUX1BSSU89MgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDQgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDgzOWI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTgKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KLUNPTkZJR19QUkVFTVBUPW4KLSNDSEVDSyNDT05GSUdfVFJFRV9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPW4KLUNPTkZJR19OT19IWl9GVUxMPXkKLUNPTkZJR19OT19IWl9GVUxMX0FMTD15Ci1DT05GSUdfUkNVX0ZBU1RfTk9fSFo9eQotQ09ORklHX1JDVV9UUkFDRT15Ci1DT05GSUdfSE9UUExVR19DUFU9bgotQ09ORklHX1NVU1BFTkQ9bgotQ09ORklHX0hJQkVSTkFUSU9OPW4KLUNPTkZJR19SQ1VfRkFOT1VUPTIKLUNPTkZJR19SQ1VfRkFOT1VUX0xFQUY9MgotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgotQ09ORklHX1JDVV9OT0NCX0NQVT1uCi1DT05GSUdfREVCVUdfTE9DS19BTExPQz1uCi1DT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89eQotQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT15Ci1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmE3MmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9GQVNUX05PX0haPW4KLUNPTkZJR19SQ1VfVFJBQ0U9bgotQ09ORklHX0hPVFBMVUdfQ1BVPXkKLUNPTkZJR19SQ1VfRkFOT1VUPTYKLUNPTkZJR19SQ1VfRkFOT1VUX0xFQUY9NgotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgotQ09ORklHX1JDVV9OT0NCX0NQVT15Ci1DT05GSUdfUkNVX05PQ0JfQ1BVX05PTkU9eQotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQotQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQotQ09ORklHX1BST1ZFX1JDVT15Ci1DT05GSUdfUFJPVkVfUkNVX0RFTEFZPXkKLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgotQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTVhYjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9GQVNUX05PX0haPW4KLUNPTkZJR19SQ1VfVFJBQ0U9bgotQ09ORklHX0hPVFBMVUdfQ1BVPW4KLUNPTkZJR19TVVNQRU5EPW4KLUNPTkZJR19ISUJFUk5BVElPTj1uCi1DT05GSUdfUkNVX0ZBTk9VVD02Ci1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTYKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPXkKLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQotQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQotQ09ORklHX1BST1ZFX1JDVT15Ci1DT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgotQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Njc0MDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9MTYKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KLUNPTkZJR19QUkVFTVBUPW4KLSNDSEVDSyNDT05GSUdfVFJFRV9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPW4KLUNPTkZJR19OT19IWl9GVUxMPXkKLUNPTkZJR19OT19IWl9GVUxMX0FMTD15Ci1DT05GSUdfTk9fSFpfRlVMTF9TWVNJRExFPXkKLUNPTkZJR19SQ1VfRkFTVF9OT19IWj1uCi1DT05GSUdfUkNVX1RSQUNFPXkKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUkNVX0ZBTk9VVD0yCi1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTIKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPXkKLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA5N2E2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTE2Ci1DT05GSUdfUFJFRU1QVF9OT05FPW4KLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD15Ci0jQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPXkKLUNPTkZJR19OT19IWl9GVUxMPW4KLUNPTkZJR19SQ1VfRkFTVF9OT19IWj1uCi1DT05GSUdfUkNVX1RSQUNFPW4KLUNPTkZJR19IT1RQTFVHX0NQVT1uCi1DT05GSUdfU1VTUEVORD1uCi1DT05GSUdfSElCRVJOQVRJT049bgotQ09ORklHX1JDVV9GQU5PVVQ9MwotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9eQotQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCi1DT05GSUdfUkNVX05PQ0JfQ1BVPXkKLUNPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKLUNPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KLUNPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgotQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KLUNPTkZJR19SQ1VfQk9PU1Q9bgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDgtVCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDgtVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyYzRlNC4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA4LVQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTE2Ci1DT05GSUdfUFJFRU1QVF9OT05FPW4KLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD15Ci0jQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPXkKLUNPTkZJR19OT19IWl9GVUxMPW4KLUNPTkZJR19SQ1VfRkFTVF9OT19IWj1uCi1DT05GSUdfUkNVX1RSQUNFPXkKLUNPTkZJR19IT1RQTFVHX0NQVT1uCi1DT05GSUdfU1VTUEVORD1uCi1DT05GSUdfSElCRVJOQVRJT049bgotQ09ORklHX1JDVV9GQU5PVVQ9MwotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9eQotQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCi1DT05GSUdfUkNVX05PQ0JfQ1BVPXkKLUNPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKLUNPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KLUNPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgotQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KLUNPTkZJR19SQ1VfQk9PU1Q9bgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDFlYzBkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1DT05GSUdfU01QPW4KLUNPTkZJR19OUl9DUFVTPTEKLUNPTkZJR19QUkVFTVBUX05PTkU9bgotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KLUNPTkZJR19QUkVFTVBUPXkKLSNDSEVDSyNDT05GSUdfVFJFRV9QUkVFTVBUX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfSE9UUExVR19DUFU9bgotQ09ORklHX1NVU1BFTkQ9bgotQ09ORklHX0hJQkVSTkFUSU9OPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX1JDVV9CT09TVD1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQlVTVEVEIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQlVTVEVECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWRhMTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9CVVNURUQKQEAgLTAsMCArMSw2IEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTQKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9CVVNURUQuYm9vdCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0JVU1RFRC5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODZjMTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9CVVNURUQuYm9vdApAQCAtMCwwICsxIEBACitsb2NrdG9ydHVyZS50b3J0dXJlX3R5cGU9bG9ja19idXN0ZWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0NGTElTVCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0NGTElTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYxYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQ0ZMSVNUCkBAIC0wLDAgKzEgQEAKK0xPQ0swMQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQ0Zjb21tb24gYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9DRmNvbW1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzcyZGMyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQ0Zjb21tb24KQEAgLTAsMCArMSwyIEBACitDT05GSUdfTE9DS19UT1JUVVJFX1RFU1Q9eQorQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0xPQ0swMSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0xPQ0swMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTYyNWUzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svTE9DSzAxCkBAIC0wLDAgKzEsNiBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX1BSRUVNUFRfTk9ORT1uCitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svdmVyX2Z1bmN0aW9ucy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NmVhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL3Zlcl9mdW5jdGlvbnMuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgS2VybmVsLXZlcnNpb24tZGVwZW5kZW50IHNoZWxsIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdHMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorIworIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxNAorIworIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KKworIyBsb2NrdG9ydHVyZV9wYXJhbV9vbm9mZiBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlCisjCisjIEFkZHMgb25vZmYgbG9ja3RvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCitsb2NrdG9ydHVyZV9wYXJhbV9vbm9mZiAoKSB7CisJaWYgISBib290cGFyYW1faG90cGx1Z19jcHUgIiQxIiAmJiBjb25maWdmcmFnX2hvdHBsdWdfY3B1ICIkMiIKKwl0aGVuCisJCWVjaG8gQ1BVLWhvdHBsdWcga2VybmVsLCBhZGRpbmcgbG9ja3RvcnR1cmUgb25vZmYuIDE+JjIKKwkJZWNobyBsb2NrdG9ydHVyZS5vbm9mZl9pbnRlcnZhbD0zIGxvY2t0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKKwlmaQorfQorCisjIHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUgc2Vjb25kcworIworIyBBZGRzIHBlci12ZXJzaW9uIHRvcnR1cmUtbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBzdXBwb3J0aW5nIHRoZW0uCitwZXJfdmVyc2lvbl9ib290X3BhcmFtcyAoKSB7CisJZWNobyAkMSBgbG9ja3RvcnR1cmVfcGFyYW1fb25vZmYgIiQxIiAiJDIiYCBcCisJCWxvY2t0b3J0dXJlLnN0YXRfaW50ZXJ2YWw9MTUgXAorCQlsb2NrdG9ydHVyZS5zaHV0ZG93bl9zZWNzPSQzIFwKKwkJbG9ja3RvcnR1cmUubG9ja3RvcnR1cmVfcnVubmFibGU9MSBcCisJCWxvY2t0b3J0dXJlLnZlcmJvc2U9MQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9CVVNURUQgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0JVU1RFRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQ4YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9CVVNURUQKQEAgLTAsMCArMSw3IEBACitDT05GSUdfUkNVX1RSQUNFPW4KK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9NAorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9bgorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvQlVTVEVELmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0JVU1RFRC5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDRmOWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0JVU1RFRC5ib290CkBAIC0wLDAgKzEgQEAKK3JjdXRvcnR1cmUudG9ydHVyZV90eXBlPXJjdV9idXN0ZWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9DRkxJU1QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL0NGTElTVApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9DRkxJU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvQ0Zjb21tb24gYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGY29tbW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDJhODYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGY29tbW9uCkBAIC0wLDAgKzEsMiBAQAorQ09ORklHX1JDVV9UT1JUVVJFX1RFU1Q9eQorQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1OIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9TUkNVLU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiYjQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1OCkBAIC0wLDAgKzEsNyBAQAorQ09ORklHX1JDVV9UUkFDRT1uCitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTQKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1OLmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1NSQ1UtTi5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1OLmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1OLmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1QIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9TUkNVLVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2ZjI3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1QCkBAIC0wLDAgKzEsNyBAQAorQ09ORklHX1JDVV9UUkFDRT1uCitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1QLmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1NSQ1UtUC5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1QLmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1QLmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVElOWTAxIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9USU5ZMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2M2UwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVElOWTAxCkBAIC0wLDAgKzEsMTIgQEAKK0NPTkZJR19TTVA9bgorQ09ORklHX1BSRUVNUFRfTk9ORT15CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9bgorI0NIRUNLI0NPTkZJR19USU5ZX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9UUkFDRT1uCitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCitDT05GSUdfUFJFRU1QVF9DT1VOVD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RJTlkwMiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVElOWTAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmVhZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RJTlkwMgpAQCAtMCwwICsxLDEyIEBACitDT05GSUdfU01QPW4KK0NPTkZJR19QUkVFTVBUX05PTkU9eQorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPW4KKyNDSEVDSyNDT05GSUdfVElOWV9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPXkKK0NPTkZJR19OT19IWl9JRExFPW4KK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgorQ09ORklHX1BSRUVNUFRfQ09VTlQ9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDEgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzgyN2VjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDEKQEAgLTAsMCArMSwyMiBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfRkFTVF9OT19IWj15CitDT05GSUdfUkNVX1RSQUNFPXkKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUkNVX0ZBTk9VVD04CitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFVfWkVSTz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfUkNVX0JPT1NUPW4KK0NPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEPW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDEuYm9vdCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTAxLmJvb3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDEuYm9vdApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDEuYm9vdApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDIgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTc3N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDIKQEAgLTAsMCArMSwyNSBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfRkFTVF9OT19IWj1uCitDT05GSUdfUkNVX1RSQUNFPW4KK0NPTkZJR19IT1RQTFVHX0NQVT1uCitDT05GSUdfU1VTUEVORD1uCitDT05GSUdfSElCRVJOQVRJT049bgorQ09ORklHX1JDVV9GQU5PVVQ9MworQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0zCitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPW4KK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPXkKK0NPTkZJR19QUk9WRV9MT0NLSU5HPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPXkKK0NPTkZJR19SQ1VfQk9PU1Q9bgorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWYxMTFjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDMKQEAgLTAsMCArMSwyMiBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPXkKK0NPTkZJR19OT19IWl9JRExFPW4KK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19SQ1VfRkFOT1VUPTQKK0NPTkZJR19SQ1VfRkFOT1VUX0xFQUY9NAorQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgorQ09ORklHX1JDVV9OT0NCX0NQVT1uCitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfUkNVX0JPT1NUPXkKK0NPTkZJR19SQ1VfQk9PU1RfUFJJTz0yCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmQyN2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNApAQCAtMCwwICsxLDI0IEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPW4KKyNDSEVDSyNDT05GSUdfVFJFRV9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPW4KK0NPTkZJR19OT19IWl9GVUxMPXkKK0NPTkZJR19OT19IWl9GVUxMX0FMTD15CitDT05GSUdfUkNVX0ZBU1RfTk9fSFo9eQorQ09ORklHX1JDVV9UUkFDRT15CitDT05GSUdfSE9UUExVR19DUFU9bgorQ09ORklHX1NVU1BFTkQ9bgorQ09ORklHX0hJQkVSTkFUSU9OPW4KK0NPTkZJR19SQ1VfRkFOT1VUPTIKK0NPTkZJR19SQ1VfRkFOT1VUX0xFQUY9MgorQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgorQ09ORklHX1JDVV9OT0NCX0NQVT1uCitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89eQorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT15CitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA0LmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNC5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA0LmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA0LmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA1IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmMzJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA1CkBAIC0wLDAgKzEsMjQgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX1BSRUVNUFRfTk9ORT15CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9bgorI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9GQVNUX05PX0haPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19SQ1VfRkFOT1VUPTYKK0NPTkZJR19SQ1VfRkFOT1VUX0xFQUY9NgorQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgorQ09ORklHX1JDVV9OT0NCX0NQVT15CitDT05GSUdfUkNVX05PQ0JfQ1BVX05PTkU9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQorQ09ORklHX1BST1ZFX1JDVT15CitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPXkKK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA1LmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNS5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA1LmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA1LmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA2IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0NzdkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA2CkBAIC0wLDAgKzEsMjUgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX1BSRUVNUFRfTk9ORT15CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9bgorI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9GQVNUX05PX0haPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPW4KK0NPTkZJR19TVVNQRU5EPW4KK0NPTkZJR19ISUJFUk5BVElPTj1uCitDT05GSUdfUkNVX0ZBTk9VVD02CitDT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTYKK0NPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFU9bgorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQorQ09ORklHX1BST1ZFX1JDVT15CitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MmY4NmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNwpAQCAtMCwwICsxLDIzIEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTE2CitDT05GSUdfUFJFRU1QVF9OT05FPXkKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD1uCisjQ0hFQ0sjQ09ORklHX1RSRUVfUkNVPXkKK0NPTkZJR19IWl9QRVJJT0RJQz1uCitDT05GSUdfTk9fSFpfSURMRT1uCitDT05GSUdfTk9fSFpfRlVMTD15CitDT05GSUdfTk9fSFpfRlVMTF9BTEw9eQorQ09ORklHX05PX0haX0ZVTExfU1lTSURMRT15CitDT05GSUdfUkNVX0ZBU1RfTk9fSFo9bgorQ09ORklHX1JDVV9UUkFDRT15CitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX1JDVV9GQU5PVVQ9MgorQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPW4KK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz15CitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KK0NPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEPW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA4IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzOGNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA4CkBAIC0wLDAgKzEsMjUgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MTYKK0NPTkZJR19QUkVFTVBUX05PTkU9bgorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPXkKKyNDSEVDSyNDT05GSUdfVFJFRV9QUkVFTVBUX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9GQVNUX05PX0haPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPW4KK0NPTkZJR19TVVNQRU5EPW4KK0NPTkZJR19ISUJFUk5BVElPTj1uCitDT05GSUdfUkNVX0ZBTk9VVD0zCitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD15CitDT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTIKK0NPTkZJR19SQ1VfTk9DQl9DUFU9eQorQ09ORklHX1JDVV9OT0NCX0NQVV9BTEw9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgorQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgorQ09ORklHX1JDVV9CT09TVD1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwOC1UIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDgtVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQ1MjNkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDgtVApAQCAtMCwwICsxLDI1IEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTE2CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfRkFTVF9OT19IWj1uCitDT05GSUdfUkNVX1RSQUNFPXkKK0NPTkZJR19IT1RQTFVHX0NQVT1uCitDT05GSUdfU1VTUEVORD1uCitDT05GSUdfSElCRVJOQVRJT049bgorQ09ORklHX1JDVV9GQU5PVVQ9MworQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9eQorQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCitDT05GSUdfUkNVX05PQ0JfQ1BVPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KK0NPTkZJR19SQ1VfQk9PU1Q9bgorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWU0ZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDkKQEAgLTAsMCArMSwyMCBAQAorQ09ORklHX1NNUD1uCitDT05GSUdfTlJfQ1BVUz0xCitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPW4KK0NPTkZJR19TVVNQRU5EPW4KK0NPTkZJR19ISUJFUk5BVElPTj1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPW4KK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KK0NPTkZJR19SQ1VfQk9PU1Q9bgorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvQ0ZMSVNUIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvQ0ZMSVNUCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvQ0ZMSVNUCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OMS1TLVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL04xLVMtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL04xLVMtVC1OSC1TRC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OMS1TLVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OMi0yLXQtbmgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL04yLTItdC1uaC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL04yLTItdC1uaC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OMi0yLXQtbmgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OMy0zLVQtbmgtU0QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL04zLTMtVC1uaC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL04zLTMtVC1uaC1TRC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OMy0zLVQtbmgtU0QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9ONC1BLXQtTkgtc2QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL040LUEtdC1OSC1zZC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL040LUEtdC1OSC1zZC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9ONC1BLXQtTkgtc2QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9ONS1VLVQtTkgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL041LVUtVC1OSC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL041LVUtVC1OSC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9ONS1VLVQtTkgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OVDEtbmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvTlQxLW5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OVDEtbmgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OVDEtbmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL05UMy1OSCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OVDMtTkgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL05UMy1OSApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL05UMy1OSApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDEtUy1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDEtUy1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QMi0yLXQtbmgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QMy0zLVQtbmgtU0QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDQtQS10LU5ILXNkLVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QNC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QNC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDQtQS10LU5ILXNkLVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QNS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QNS1VLVQtTkgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUFQxLW5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL1BUMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUFQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUFQxLW5oCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QVDItTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUFQyLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QVDItTkgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QVDItTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjZTM3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC92ZXJfZnVuY3Rpb25zLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyMKKyMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKKyMKKyMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisKKyMgcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZSBzZWNvbmRzCisjCisjIEFkZHMgcGVyLXZlcnNpb24gdG9ydHVyZS1tb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIHN1cHBvcnRpbmcgdGhlbS4KKyMgV2hpY2ggb2xkIGtlcm5lbHMgZG8gbm90LgorcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgKCkgeworCWVjaG8JcmN1dG9ydHVyZS5zdGF0X2ludGVydmFsPTE1IFwKKwkJcmN1dG9ydHVyZS5zaHV0ZG93bl9zZWNzPSQzIFwKKwkJcmN1dG9ydHVyZS5yY3V0b3J0dXJlX3J1bm5hYmxlPTEgXAorCQlyY3V0b3J0dXJlLnRlc3Rfbm9faWRsZV9oej0xIFwKKwkJcmN1dG9ydHVyZS52ZXJib3NlPTEKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9DRkxJU1QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL0NGTElTVApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9DRkxJU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9OMS1TLVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9OMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjEtUy1ULU5ILVNELVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9OMS1TLVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjItMi10LW5oLXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL04yLTItdC1uaC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL04zLTMtVC1uaC1TRC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL04zLTMtVC1uaC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9OMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL04zLTMtVC1uaC1TRC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9ONC1BLXQtTkgtc2QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjQtQS10LU5ILXNkLVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONC1BLXQtTkgtc2QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjUtVS1ULU5ILXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL041LVUtVC1OSC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL042LS0tdC1uaC1TRC1zbXAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL042LS0tdC1uaC1TRC1zbXAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9ONi0tLXQtbmgtU0Qtc21wLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL042LS0tdC1uaC1TRC1zbXAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9ONy00LVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONy00LVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjctNC1ULU5ILVNELVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONy00LVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjgtMi1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjgtMi1ULU5ILVNELVNNUC1IUApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL044LTItVC1OSC1TRC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjgtMi1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL05UMS1uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTlQxLW5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTlQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL05UMS1uaApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL05UMy1OSCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTlQzLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTlQzLU5ICnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL05UMy1OSApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1AxLVMtVC1OSC1TRC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1AxLVMtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1AxLVMtVC1OSC1TRC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QMi0yLXQtbmgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDItMi10LW5oLXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QMi0yLXQtbmgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDMtMy1ULW5oLVNELVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1AzLTMtVC1uaC1TRC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A0LUEtdC1OSC1zZC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A0LUEtdC1OSC1zZC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A0LUEtdC1OSC1zZC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNS1VLVQtTkgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QNS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDUtVS1ULU5ILXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QNS1VLVQtTkgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDYtLS10LW5oLVNELXNtcC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDYtLS10LW5oLVNELXNtcC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A2LS0tdC1uaC1TRC1zbXAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDYtLS10LW5oLVNELXNtcC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQLWFsbCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDctNC1ULU5ILVNELVNNUC1IUC1hbGwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQLWFsbApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQLWFsbApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAtbm9uZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDctNC1ULU5ILVNELVNNUC1IUC1ub25lCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDctNC1ULU5ILVNELVNNUC1IUC1ub25lCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAtbm9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QVDEtbmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1BUMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1BUMS1uaApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QVDEtbmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QVDItTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1BUMi1OSApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1BUMi1OSApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QVDItTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL0NGTElTVCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9DRkxJU1QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL0NGTElTVApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL0NGTElTVApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjEtUy1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjEtUy1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OMi0yLXQtbmgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OMy0zLVQtbmgtU0QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjQtQS10LU5ILXNkLVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9ONC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9ONC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjQtQS10LU5ILXNkLVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9ONS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9ONS1VLVQtTkgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTlQxLW5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL05UMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTlQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTlQxLW5oCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OVDMtTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTlQzLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OVDMtTkgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OVDMtTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1AxLVMtVC1OSC1TRC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDEtUy1ULU5ILVNELVNNUC1IUApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDEtUy1ULU5ILVNELVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1AxLVMtVC1OSC1TRC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1AyLTItdC1uaC1zZC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDItMi10LW5oLXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDItMi10LW5oLXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1AyLTItdC1uaC1zZC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1AzLTMtVC1uaC1TRC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDMtMy1ULW5oLVNELVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDMtMy1ULW5oLVNELVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1AzLTMtVC1uaC1TRC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1A0LUEtdC1OSC1zZC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDQtQS10LU5ILXNkLVNNUC1IUApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDQtQS10LU5ILXNkLVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1A0LUEtdC1OSC1zZC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1A1LVUtVC1OSC1zZC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDUtVS1ULU5ILXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDUtVS1ULU5ILXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1A1LVUtVC1OSC1zZC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1BUMS1uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9QVDEtbmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1BUMS1uaApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1BUMS1uaApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUFQyLU5IIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1BUMi1OSApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUFQyLU5ICnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUFQyLU5ICmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvdmVyX2Z1bmN0aW9ucy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy92ZXJfZnVuY3Rpb25zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTU1NjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvdmVyX2Z1bmN0aW9ucy5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vYmFzaAorIworIyBLZXJuZWwtdmVyc2lvbi1kZXBlbmRlbnQgc2hlbGwgZnVuY3Rpb25zIGZvciB0aGUgcmVzdCBvZiB0aGUgc2NyaXB0cy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisjIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisjCisjIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDEzCisjCisjIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorCisjIHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZQorIworIyBBZGRzIG9ub2ZmIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCityY3V0b3J0dXJlX3BhcmFtX29ub2ZmICgpIHsKKwlpZiAhIGJvb3RwYXJhbV9ob3RwbHVnX2NwdSAiJDEiICYmIGNvbmZpZ2ZyYWdfaG90cGx1Z19jcHUgIiQyIgorCXRoZW4KKwkJZWNobyBDUFUtaG90cGx1ZyBrZXJuZWwsIGFkZGluZyByY3V0b3J0dXJlIG9ub2ZmLiAxPiYyCisJCWVjaG8gcmN1dG9ydHVyZS5vbm9mZl9pbnRlcnZhbD0zIHJjdXRvcnR1cmUub25vZmZfaG9sZG9mZj0zMAorCWZpCit9CisKKyMgcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZSBzZWNvbmRzCisjCisjIEFkZHMgcGVyLXZlcnNpb24gdG9ydHVyZS1tb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIHN1cHBvcnRpbmcgdGhlbS4KK3Blcl92ZXJzaW9uX2Jvb3RfcGFyYW1zICgpIHsKKwllY2hvICQxIGByY3V0b3J0dXJlX3BhcmFtX29ub2ZmICIkMSIgIiQyImAgXAorCQlyY3V0b3J0dXJlLnN0YXRfaW50ZXJ2YWw9MTUgXAorCQlyY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JDMgXAorCQlyY3V0b3J0dXJlLnJjdXRvcnR1cmVfcnVubmFibGU9MSBcCisJCXJjdXRvcnR1cmUudGVzdF9ub19pZGxlX2h6PTEgXAorCQlyY3V0b3J0dXJlLnZlcmJvc2U9MQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvQ0ZMSVNUIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvQ0ZMSVNUCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvQ0ZMSVNUCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OMS1TLVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L04xLVMtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L04xLVMtVC1OSC1TRC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OMS1TLVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OMi0yLXQtbmgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L04yLTItdC1uaC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L04yLTItdC1uaC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OMi0yLXQtbmgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OMy0zLVQtbmgtU0QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L04zLTMtVC1uaC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L04zLTMtVC1uaC1TRC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OMy0zLVQtbmgtU0QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9ONC1BLXQtTkgtc2QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L040LUEtdC1OSC1zZC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L040LUEtdC1OSC1zZC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9ONC1BLXQtTkgtc2QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9ONS1VLVQtTkgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L041LVUtVC1OSC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L041LVUtVC1OSC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9ONS1VLVQtTkgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OVDEtbmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvTlQxLW5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OVDEtbmgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OVDEtbmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L05UMy1OSCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OVDMtTkgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L05UMy1OSApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L05UMy1OSApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDEtUy1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDEtUy1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QMi0yLXQtbmgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QMy0zLVQtbmgtU0QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDQtQS10LU5ILXNkLVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QNC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QNC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDQtQS10LU5ILXNkLVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QNS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QNS1VLVQtTkgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUFQxLW5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L1BUMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUFQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUFQxLW5oCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QVDItTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUFQyLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QVDItTkgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QVDItTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3N2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS92ZXJfZnVuY3Rpb25zLnNoCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyMKKyMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKKyMKKyMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisKKyMgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzIGJvb3RwYXJhbS1zdHJpbmcKKyMKKyMgQWRkcyBuX2JhcnJpZXJfY2JzIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlciB0byBrZXJuZWxzIGhhdmluZyBpdC4KK3JjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAoKSB7CisJaWYgZWNobyAkMSB8IGdyZXAgLXEgInJjdXRvcnR1cmVcLm5fYmFycmllcl9jYnMiCisJdGhlbgorCQk6CisJZWxzZQorCQllY2hvIHJjdXRvcnR1cmUubl9iYXJyaWVyX2Nicz00CisJZmkKK30KKworIyByY3V0b3J0dXJlX3BhcmFtX29ub2ZmIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUKKyMKKyMgQWRkcyBvbm9mZiByY3V0b3J0dXJlIG1vZHVsZSBwYXJhbWV0ZXJzIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgorcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiAoKSB7CisJaWYgISBib290cGFyYW1faG90cGx1Z19jcHUgIiQxIiAmJiBjb25maWdmcmFnX2hvdHBsdWdfY3B1ICIkMiIKKwl0aGVuCisJCWVjaG8gQ1BVLWhvdHBsdWcga2VybmVsLCBhZGRpbmcgcmN1dG9ydHVyZSBvbm9mZi4gMT4mMgorCQllY2hvIHJjdXRvcnR1cmUub25vZmZfaW50ZXJ2YWw9MyByY3V0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKKwlmaQorfQorCisjIHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUgc2Vjb25kcworIworIyBBZGRzIHBlci12ZXJzaW9uIHRvcnR1cmUtbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBzdXBwb3J0aW5nIHRoZW0uCitwZXJfdmVyc2lvbl9ib290X3BhcmFtcyAoKSB7CisJZWNobyAkMSBgcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiAiJDEiICIkMiJgIFwKKwkJYHJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAiJDEiYCBcCisJCXJjdXRvcnR1cmUuc3RhdF9pbnRlcnZhbD0xNSBcCisJCXJjdXRvcnR1cmUuc2h1dGRvd25fc2Vjcz0kMyBcCisJCXJjdXRvcnR1cmUucmN1dG9ydHVyZV9ydW5uYWJsZT0xIFwKKwkJcmN1dG9ydHVyZS50ZXN0X25vX2lkbGVfaHo9MSBcCisJCXJjdXRvcnR1cmUudmVyYm9zZT0xCit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3Zlcl9mdW5jdGlvbnMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3N2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdmVyX2Z1bmN0aW9ucy5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vYmFzaAorIworIyBLZXJuZWwtdmVyc2lvbi1kZXBlbmRlbnQgc2hlbGwgZnVuY3Rpb25zIGZvciB0aGUgcmVzdCBvZiB0aGUgc2NyaXB0cy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisjIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisjCisjIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDEzCisjCisjIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorCisjIHJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyBib290cGFyYW0tc3RyaW5nCisjCisjIEFkZHMgbl9iYXJyaWVyX2NicyByY3V0b3J0dXJlIG1vZHVsZSBwYXJhbWV0ZXIgdG8ga2VybmVscyBoYXZpbmcgaXQuCityY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgKCkgeworCWlmIGVjaG8gJDEgfCBncmVwIC1xICJyY3V0b3J0dXJlXC5uX2JhcnJpZXJfY2JzIgorCXRoZW4KKwkJOgorCWVsc2UKKwkJZWNobyByY3V0b3J0dXJlLm5fYmFycmllcl9jYnM9NAorCWZpCit9CisKKyMgcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlCisjCisjIEFkZHMgb25vZmYgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIGhhdmluZyBpdC4KK3JjdXRvcnR1cmVfcGFyYW1fb25vZmYgKCkgeworCWlmICEgYm9vdHBhcmFtX2hvdHBsdWdfY3B1ICIkMSIgJiYgY29uZmlnZnJhZ19ob3RwbHVnX2NwdSAiJDIiCisJdGhlbgorCQllY2hvIENQVS1ob3RwbHVnIGtlcm5lbCwgYWRkaW5nIHJjdXRvcnR1cmUgb25vZmYuIDE+JjIKKwkJZWNobyByY3V0b3J0dXJlLm9ub2ZmX2ludGVydmFsPTMgcmN1dG9ydHVyZS5vbm9mZl9ob2xkb2ZmPTMwCisJZmkKK30KKworIyBwZXJfdmVyc2lvbl9ib290X3BhcmFtcyBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlIHNlY29uZHMKKyMKKyMgQWRkcyBwZXItdmVyc2lvbiB0b3J0dXJlLW1vZHVsZSBwYXJhbWV0ZXJzIHRvIGtlcm5lbHMgc3VwcG9ydGluZyB0aGVtLgorcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgKCkgeworCWVjaG8gJDEgYHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgIiQxIiAiJDIiYCBcCisJCWByY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgIiQxImAgXAorCQlyY3V0b3J0dXJlLnN0YXRfaW50ZXJ2YWw9MTUgXAorCQlyY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JDMgXAorCQlyY3V0b3J0dXJlLnJjdXRvcnR1cmVfcnVubmFibGU9MSBcCisJCXJjdXRvcnR1cmUudGVzdF9ub19pZGxlX2h6PTEgXAorCQlyY3V0b3J0dXJlLnZlcmJvc2U9MQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvdmVyX2Z1bmN0aW9ucy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL3Zlcl9mdW5jdGlvbnMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDUyNTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvdmVyX2Z1bmN0aW9ucy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKLSMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KLSMKLSMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKLSMKLSMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+Ci0KLSMgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzIGJvb3RwYXJhbS1zdHJpbmcKLSMKLSMgQWRkcyBuX2JhcnJpZXJfY2JzIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlciB0byBrZXJuZWxzIGhhdmluZyBpdC4KLXJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAoKSB7Ci0JZWNobyAkMQotfQotCi0jIHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZQotIwotIyBBZGRzIG9ub2ZmIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCi1yY3V0b3J0dXJlX3BhcmFtX29ub2ZmICgpIHsKLQllY2hvICQxCi19CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvdmVyX2Z1bmN0aW9ucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3NDMyZi4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy92ZXJfZnVuY3Rpb25zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgS2VybmVsLXZlcnNpb24tZGVwZW5kZW50IHNoZWxsIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdHMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAotIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgotIwotIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMwotIwotIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotIyByY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgYm9vdHBhcmFtLXN0cmluZwotIwotIyBBZGRzIG5fYmFycmllcl9jYnMgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVyIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgotcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzICgpIHsKLQllY2hvICQxCi19Ci0KLSMgcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlCi0jCi0jIEFkZHMgb25vZmYgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIGhhdmluZyBpdC4KLXJjdXRvcnR1cmVfcGFyYW1fb25vZmYgKCkgewotCWlmICEgYm9vdHBhcmFtX2hvdHBsdWdfY3B1ICIkMSIgJiYgY29uZmlnZnJhZ19ob3RwbHVnX2NwdSAiJDIiCi0JdGhlbgotCQllY2hvIENQVS1ob3RwbHVnIGtlcm5lbCwgYWRkaW5nIHJjdXRvcnR1cmUgb25vZmYuCi0JCWVjaG8gJDEgcmN1dG9ydHVyZS5vbm9mZl9pbnRlcnZhbD0zIHJjdXRvcnR1cmUub25vZmZfaG9sZG9mZj0zMAotCWVsc2UKLQkJZWNobyAkMQotCWZpCi19CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvdmVyX2Z1bmN0aW9ucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1ZjEzYS4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS92ZXJfZnVuY3Rpb25zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgS2VybmVsLXZlcnNpb24tZGVwZW5kZW50IHNoZWxsIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdHMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAotIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgotIwotIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMwotIwotIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotIyByY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgYm9vdHBhcmFtLXN0cmluZwotIwotIyBBZGRzIG5fYmFycmllcl9jYnMgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVyIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgotcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzICgpIHsKLQlpZiBlY2hvICQxIHwgZ3JlcCAtcSAicmN1dG9ydHVyZVwubl9iYXJyaWVyX2NicyIKLQl0aGVuCi0JCWVjaG8gJDEKLQllbHNlCi0JCWVjaG8gJDEgcmN1dG9ydHVyZS5uX2JhcnJpZXJfY2JzPTQKLQlmaQotfQotCi0jIHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZQotIwotIyBBZGRzIG9ub2ZmIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCi1yY3V0b3J0dXJlX3BhcmFtX29ub2ZmICgpIHsKLQlpZiAhIGJvb3RwYXJhbV9ob3RwbHVnX2NwdSAiJDEiICYmIGNvbmZpZ2ZyYWdfaG90cGx1Z19jcHUgIiQyIgotCXRoZW4KLQkJZWNobyBDUFUtaG90cGx1ZyBrZXJuZWwsIGFkZGluZyByY3V0b3J0dXJlIG9ub2ZmLgotCQllY2hvICQxIHJjdXRvcnR1cmUub25vZmZfaW50ZXJ2YWw9MyByY3V0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKLQllbHNlCi0JCWVjaG8gJDEKLQlmaQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3Zlcl9mdW5jdGlvbnMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdmVyX2Z1bmN0aW9ucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0MGVhZC4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdmVyX2Z1bmN0aW9ucy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKLSMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KLSMKLSMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKLSMKLSMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+Ci0KLSMgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzIGJvb3RwYXJhbS1zdHJpbmcKLSMKLSMgQWRkcyBuX2JhcnJpZXJfY2JzIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlciB0byBrZXJuZWxzIGhhdmluZyBpdC4KLXJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAoKSB7Ci0JaWYgZWNobyAkMSB8IGdyZXAgLXEgInJjdXRvcnR1cmVcLm5fYmFycmllcl9jYnMiCi0JdGhlbgotCQllY2hvICQxCi0JZWxzZQotCQllY2hvICQxIHJjdXRvcnR1cmUubl9iYXJyaWVyX2Nicz00Ci0JZmkKLX0KLQotIyByY3V0b3J0dXJlX3BhcmFtX29ub2ZmIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUKLSMKLSMgQWRkcyBvbm9mZiByY3V0b3J0dXJlIG1vZHVsZSBwYXJhbWV0ZXJzIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgotcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiAoKSB7Ci0JaWYgISBib290cGFyYW1faG90cGx1Z19jcHUgIiQxIiAmJiBjb25maWdmcmFnX2hvdHBsdWdfY3B1ICIkMiIKLQl0aGVuCi0JCWVjaG8gQ1BVLWhvdHBsdWcga2VybmVsLCBhZGRpbmcgcmN1dG9ydHVyZSBvbm9mZi4gMT4mMgotCQllY2hvICQxIHJjdXRvcnR1cmUub25vZmZfaW50ZXJ2YWw9MyByY3V0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKLQllbHNlCi0JCWVjaG8gJDEKLQlmaQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9kb2MvVFJFRV9SQ1UtS2NvbmZpZy50eHQgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2RvYy9UUkVFX1JDVS1rY29uZmlnLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9kb2MvVFJFRV9SQ1UtS2NvbmZpZy50eHQKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvZG9jL1RSRUVfUkNVLWtjb25maWcudHh0CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCAwM2EwMzgxLi5iNWVjN2ZiIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogc3RhdGljIHZvaWQgbWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCQkJCSAgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90LCBnZm5fdCBnZm4pOwogCi1ib29sIGt2bV9yZWJvb3Rpbmc7CitfX3Zpc2libGUgYm9vbCBrdm1fcmVib290aW5nOwogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYm9vdGluZyk7CiAKIHN0YXRpYyBib29sIGxhcmdlcGFnZXNfZW5hYmxlZCA9IHRydWU7Cg==